ZGlmZiAtLWdpdCBhL25ldC84MDIvTWFrZWZpbGUgYi9uZXQvODAyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxODYxOTIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvODAyL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCA4MDIueCBwcm90b2NvbCBsYXllcnMuCisjCisKK29iai15CQkJOj0gcDgwMjMubworCisjIENoZWNrIHRoZSBwODAyMiBzZWxlY3Rpb25zIGFnYWluc3QgbmV0L2NvcmUvTWFrZWZpbGUuCitvYmotJChDT05GSUdfU1lTQ1RMKQkrPSBzeXNjdGxfbmV0XzgwMi5vCitvYmotJChDT05GSUdfTExDKQkrPSBwODAyMi5vIHBzbmFwLm8KK29iai0kKENPTkZJR19UUikJKz0gcDgwMjIubyBwc25hcC5vIHRyLm8gc3lzY3RsX25ldF84MDIubworb2JqLSQoQ09ORklHX05FVF9GQykJKz0gICAgICAgICAgICAgICAgIGZjLm8KK29iai0kKENPTkZJR19GRERJKQkrPSAgICAgICAgICAgICAgICAgZmRkaS5vCitvYmotJChDT05GSUdfSElQUEkpCSs9ICAgICAgICAgICAgICAgICBoaXBwaS5vCitvYmotJChDT05GSUdfSVBYKQkrPSBwODAyMi5vIHBzbmFwLm8KK29iai0kKENPTkZJR19BVEFMSykJKz0gcDgwMjIubyBwc25hcC5vCmRpZmYgLS1naXQgYS9uZXQvODAyL2ZjLmMgYi9uZXQvODAyL2ZjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQwZDM0ZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC84MDIvZmMuYwpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIE5FVDM6CUZpYnJlIENoYW5uZWwgZGV2aWNlIGhhbmRsaW5nIHN1YnJvdXRpbmVzCisgKiAKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCQlWaW5lZXQgQWJyYWhhbSA8dm1hQGlvbC51bmguZWR1PgorICoJCXYgMS4wIDAzLzIyLzk5CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorCisvKgorICoJUHV0IHRoZSBoZWFkZXJzIG9uIGEgRmlicmUgQ2hhbm5lbCBwYWNrZXQuIAorICovCisgCitzdGF0aWMgaW50IGZjX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgIHVuc2lnbmVkIHNob3J0IHR5cGUsCisJCSAgICAgdm9pZCAqZGFkZHIsIHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pIAoreworCXN0cnVjdCBmY2hfaGRyICpmY2g7CisJaW50IGhkcl9sZW47CisKKwkvKiAKKwkgKiBBZGQgdGhlIDgwMi4yIFNOQVAgaGVhZGVyIGlmIElQIGFzIHRoZSBJUHY0IGNvZGUgY2FsbHMgIAorCSAqIGRldi0+aGFyZF9oZWFkZXIgZGlyZWN0bHkuCisJICovCisJaWYgKHR5cGUgPT0gRVRIX1BfSVAgfHwgdHlwZSA9PSBFVEhfUF9BUlApCisJeworCQlzdHJ1Y3QgZmNsbGMgKmZjbGxjOworCisJCWhkcl9sZW4gPSBzaXplb2Yoc3RydWN0IGZjaF9oZHIpICsgc2l6ZW9mKHN0cnVjdCBmY2xsYyk7CisJCWZjaCA9IChzdHJ1Y3QgZmNoX2hkciAqKXNrYl9wdXNoKHNrYiwgaGRyX2xlbik7CisJCWZjbGxjID0gKHN0cnVjdCBmY2xsYyAqKShmY2grMSk7CisJCWZjbGxjLT5kc2FwID0gZmNsbGMtPnNzYXAgPSBFWFRFTkRFRF9TQVA7CisJCWZjbGxjLT5sbGMgPSBVSV9DTUQ7CisJCWZjbGxjLT5wcm90aWRbMF0gPSBmY2xsYy0+cHJvdGlkWzFdID0gZmNsbGMtPnByb3RpZFsyXSA9IDB4MDA7CisJCWZjbGxjLT5ldGhlcnR5cGUgPSBodG9ucyh0eXBlKTsKKwl9CisJZWxzZQorCXsKKwkJaGRyX2xlbiA9IHNpemVvZihzdHJ1Y3QgZmNoX2hkcik7CisJCWZjaCA9IChzdHJ1Y3QgZmNoX2hkciAqKXNrYl9wdXNoKHNrYiwgaGRyX2xlbik7CQorCX0KKworCWlmKHNhZGRyKQorCQltZW1jcHkoZmNoLT5zYWRkcixzYWRkcixkZXYtPmFkZHJfbGVuKTsKKwllbHNlCisJCW1lbWNweShmY2gtPnNhZGRyLGRldi0+ZGV2X2FkZHIsZGV2LT5hZGRyX2xlbik7CisKKwlpZihkYWRkcikgCisJeworCQltZW1jcHkoZmNoLT5kYWRkcixkYWRkcixkZXYtPmFkZHJfbGVuKTsKKwkJcmV0dXJuKGhkcl9sZW4pOworCX0KKwlyZXR1cm4gLWhkcl9sZW47Cit9CisJCisvKgorICoJQSBuZWlnaGJvdXIgZGlzY292ZXJ5IG9mIHNvbWUgc3BlY2llcyAoZWcgYXJwKSBoYXMgY29tcGxldGVkLiBXZQorICoJY2FuIG5vdyBzZW5kIHRoZSBwYWNrZXQuCisgKi8KKyAKK3N0YXRpYyBpbnQgZmNfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikgCit7CisJc3RydWN0IGZjaF9oZHIgKmZjaD0oc3RydWN0IGZjaF9oZHIgKilza2ItPmRhdGE7CisJc3RydWN0IGZjbGxjICpmY2xsYz0oc3RydWN0IGZjbGxjICopKHNrYi0+ZGF0YStzaXplb2Yoc3RydWN0IGZjaF9oZHIpKTsKKwlpZihmY2xsYy0+ZXRoZXJ0eXBlICE9IGh0b25zKEVUSF9QX0lQKSkgeworCQlwcmludGsoImZjX3JlYnVpbGRfaGVhZGVyOiBEb24ndCBrbm93IGhvdyB0byByZXNvbHZlIHR5cGUgJTA0WCBhZGRyZXNzZXMgP1xuIiwodW5zaWduZWQgaW50KWh0b25zKGZjbGxjLT5ldGhlcnR5cGUpKTsKKwkJcmV0dXJuIDA7CisJfQorI2lmZGVmIENPTkZJR19JTkVUCisJcmV0dXJuIGFycF9maW5kKGZjaC0+ZGFkZHIsIHNrYik7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGZjX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGV2LT5oYXJkX2hlYWRlcgk9IGZjX2hlYWRlcjsKKwlkZXYtPnJlYnVpbGRfaGVhZGVyCT0gZmNfcmVidWlsZF9oZWFkZXI7CisgICAgICAgICAgICAgICAgCisJZGV2LT50eXBlCQk9IEFSUEhSRF9JRUVFODAyOworCWRldi0+aGFyZF9oZWFkZXJfbGVuCT0gRkNfSExFTjsKKwlkZXYtPm10dQkJPSAyMDI0OworCWRldi0+YWRkcl9sZW4JCT0gRkNfQUxFTjsKKwlkZXYtPnR4X3F1ZXVlX2xlbgk9IDEwMDsgLyogTG9uZyBxdWV1ZXMgb24gZmMgKi8KKwlkZXYtPmZsYWdzCQk9IElGRl9CUk9BRENBU1Q7CisKKwltZW1zZXQoZGV2LT5icm9hZGNhc3QsIDB4RkYsIEZDX0FMRU4pOworfQorCisvKioKKyAqIGFsbG9jX2ZjZGV2IC0gUmVnaXN0ZXIgZmlicmUgY2hhbm5lbCBkZXZpY2UKKyAqIEBzaXplb2ZfcHJpdjogU2l6ZSBvZiBhZGRpdGlvbmFsIGRyaXZlci1wcml2YXRlIHN0cnVjdHVyZSB0byBiZSBhbGxvY2F0ZWQKKyAqCWZvciB0aGlzIGZpYnJlIGNoYW5uZWwgZGV2aWNlCisgKgorICogRmlsbCBpbiB0aGUgZmllbGRzIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlIHdpdGggZmlicmUgY2hhbm5lbC1nZW5lcmljIHZhbHVlcy4KKyAqCisgKiBDb25zdHJ1Y3RzIGEgbmV3IG5ldCBkZXZpY2UsIGNvbXBsZXRlIHdpdGggYSBwcml2YXRlIGRhdGEgYXJlYSBvZgorICogc2l6ZSBAc2l6ZW9mX3ByaXYuICBBIDMyLWJ5dGUgKG5vdCBiaXQpIGFsaWdubWVudCBpcyBlbmZvcmNlZCBmb3IKKyAqIHRoaXMgcHJpdmF0ZSBkYXRhIGFyZWEuCisgKi8KK3N0cnVjdCBuZXRfZGV2aWNlICphbGxvY19mY2RldihpbnQgc2l6ZW9mX3ByaXYpCit7CisJcmV0dXJuIGFsbG9jX25ldGRldihzaXplb2ZfcHJpdiwgImZjJWQiLCBmY19zZXR1cCk7Cit9CitFWFBPUlRfU1lNQk9MKGFsbG9jX2ZjZGV2KTsKZGlmZiAtLWdpdCBhL25ldC84MDIvZmRkaS5jIGIvbmV0LzgwMi9mZGRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlhMzFhOQotLS0gL2Rldi9udWxsCisrKyBiL25ldC84MDIvZmRkaS5jCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJRkRESS10eXBlIGRldmljZSBoYW5kbGluZy4KKyAqCisgKiBWZXJzaW9uOglAKCMpZmRkaS5jCTEuMC4wCTA4LzEyLzk2CisgKgorICogQXV0aG9yczoJTGF3cmVuY2UgVi4gU3RlZmFuaSwgPHN0ZWZhbmlAbGtnLmRlYy5jb20+CisgKgorICoJCWZkZGkuYyBpcyBiYXNlZCBvbiBwcmV2aW91cyBldGguYyBhbmQgdHIuYyB3b3JrIGJ5CisgKgkJCVJvc3MgQmlybywgPGJpcjdAbGVsYW5kLlN0YW5mb3JkLkVkdT4KKyAqCQkJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgkJCU1hcmsgRXZhbnMsIDxldmFuc21wQHVodXJhLmFzdG9uLmFjLnVrPgorICoJCQlGbG9yaWFuIExhIFJvY2hlLCA8cnpzZmxAcnoudW5pLXNiLmRlPgorICoJCQlBbGFuIENveCwgPGd3NHB0c0BndzRwdHMuYW1wci5vcmc+CisgKiAKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCUNoYW5nZXMKKyAqCQlBbGFuIENveAkJOglOZXcgYXJwL3JlYnVpbGQgaGVhZGVyCisgKgkJTWFjaWVqIFcuIFJvenlja2kJOglJUHY2IHN1cHBvcnQKKyAqLworIAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mZGRpZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisvKgorICogQ3JlYXRlIHRoZSBGRERJIE1BQyBoZWFkZXIgZm9yIGFuIGFyYml0cmFyeSBwcm90b2NvbCBsYXllcgorICoKKyAqIHNhZGRyPU5VTEwJbWVhbnMgdXNlIGRldmljZSBzb3VyY2UgYWRkcmVzcworICogZGFkZHI9TlVMTAltZWFucyBsZWF2ZSBkZXN0aW5hdGlvbiBhZGRyZXNzIChlZyB1bnJlc29sdmVkIGFycCkKKyAqLworCitzdGF0aWMgaW50IGZkZGlfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLAorCQkgICAgICAgdm9pZCAqZGFkZHIsIHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pCit7CisJaW50IGhsID0gRkRESV9LX1NOQVBfSExFTjsKKwlzdHJ1Y3QgZmRkaWhkciAqZmRkaTsKKwkKKwlpZih0eXBlICE9IEVUSF9QX0lQICYmIHR5cGUgIT0gRVRIX1BfSVBWNiAmJiB0eXBlICE9IEVUSF9QX0FSUCkKKwkJaGw9RkRESV9LXzgwMjJfSExFTi0zOworCWZkZGkgPSAoc3RydWN0IGZkZGloZHIgKilza2JfcHVzaChza2IsIGhsKTsKKwlmZGRpLT5mYwkJCSA9IEZERElfRkNfS19BU1lOQ19MTENfREVGOworCWlmKHR5cGUgPT0gRVRIX1BfSVAgfHwgdHlwZSA9PSBFVEhfUF9JUFY2IHx8IHR5cGUgPT0gRVRIX1BfQVJQKQorCXsKKwkJZmRkaS0+aGRyLmxsY19zbmFwLmRzYXAJCSA9IEZERElfRVhURU5ERURfU0FQOworCQlmZGRpLT5oZHIubGxjX3NuYXAuc3NhcAkJID0gRkRESV9FWFRFTkRFRF9TQVA7CisJCWZkZGktPmhkci5sbGNfc25hcC5jdHJsCQkgPSBGRERJX1VJX0NNRDsKKwkJZmRkaS0+aGRyLmxsY19zbmFwLm91aVswXQkgPSAweDAwOworCQlmZGRpLT5oZHIubGxjX3NuYXAub3VpWzFdCSA9IDB4MDA7CisJCWZkZGktPmhkci5sbGNfc25hcC5vdWlbMl0JID0gMHgwMDsKKwkJZmRkaS0+aGRyLmxsY19zbmFwLmV0aGVydHlwZQkgPSBodG9ucyh0eXBlKTsKKwl9CisKKwkvKiBTZXQgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gaGFyZHdhcmUgYWRkcmVzc2VzICovCisJIAorCWlmIChzYWRkciAhPSBOVUxMKQorCQltZW1jcHkoZmRkaS0+c2FkZHIsIHNhZGRyLCBkZXYtPmFkZHJfbGVuKTsKKwllbHNlCisJCW1lbWNweShmZGRpLT5zYWRkciwgZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbik7CisKKwlpZiAoZGFkZHIgIT0gTlVMTCkKKwl7CisJCW1lbWNweShmZGRpLT5kYWRkciwgZGFkZHIsIGRldi0+YWRkcl9sZW4pOworCQlyZXR1cm4oaGwpOworCX0KKworCXJldHVybigtaGwpOworfQorCisKKy8qCisgKiBSZWJ1aWxkIHRoZSBGRERJIE1BQyBoZWFkZXIuIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGFuIEFSUAorICogKG9yIGluIGZ1dHVyZSBvdGhlciBhZGRyZXNzIHJlc29sdXRpb24pIGhhcyBjb21wbGV0ZWQgb24KKyAqIHRoaXMgc2tfYnVmZi4gIFdlIG5vdyBsZXQgQVJQIGZpbGwgaW4gdGhlIG90aGVyIGZpZWxkcy4KKyAqLworIAorc3RhdGljIGludCBmZGRpX3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmCSpza2IpCit7CisJc3RydWN0IGZkZGloZHIgKmZkZGkgPSAoc3RydWN0IGZkZGloZHIgKilza2ItPmRhdGE7CisKKyNpZmRlZiBDT05GSUdfSU5FVAorCWlmIChmZGRpLT5oZHIubGxjX3NuYXAuZXRoZXJ0eXBlID09IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApKQorCQkvKiBUcnkgdG8gZ2V0IEFSUCB0byByZXNvbHZlIHRoZSBoZWFkZXIgYW5kIGZpbGwgZGVzdGluYXRpb24gYWRkcmVzcyAqLworCQlyZXR1cm4gYXJwX2ZpbmQoZmRkaS0+ZGFkZHIsIHNrYik7CisJZWxzZQorI2VuZGlmCQorCXsKKwkJcHJpbnRrKCIlczogRG9uJ3Qga25vdyBob3cgdG8gcmVzb2x2ZSB0eXBlICUwMlggYWRkcmVzc2VzLlxuIiwKKwkJICAgICAgIHNrYi0+ZGV2LT5uYW1lLCBodG9ucyhmZGRpLT5oZHIubGxjX3NuYXAuZXRoZXJ0eXBlKSk7CisJCXJldHVybigwKTsKKwl9Cit9CisKKworLyoKKyAqIERldGVybWluZSB0aGUgcGFja2V0J3MgcHJvdG9jb2wgSUQgYW5kIGZpbGwgaW4gc2tiIGZpZWxkcy4KKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYmVmb3JlIGFuIGluY29taW5nIHBhY2tldCBpcyBwYXNzZWQKKyAqIHVwLiAgSXQncyB1c2VkIHRvIGZpbGwgaW4gc3BlY2lmaWMgc2tiIGZpZWxkcyBhbmQgdG8gc2V0CisgKiB0aGUgcHJvcGVyIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHBhY2tldCBkYXRhIChza2ItPmRhdGEpLgorICovCisgCit1bnNpZ25lZCBzaG9ydCBmZGRpX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmRkaWhkciAqZmRkaSA9IChzdHJ1Y3QgZmRkaWhkciAqKXNrYi0+ZGF0YTsKKwl1bnNpZ25lZCBzaG9ydCB0eXBlOworCQorCS8qCisJICogU2V0IG1hYy5yYXcgZmllbGQgdG8gcG9pbnQgdG8gRkMgYnl0ZSwgc2V0IGRhdGEgZmllbGQgdG8gcG9pbnQKKwkgKiB0byBzdGFydCBvZiBwYWNrZXQgZGF0YS4gIEFzc3VtZSA4MDIuMiBTTkFQIGZyYW1lcyBmb3Igbm93LgorCSAqLworCisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOwkvKiBwb2ludCB0byBmcmFtZSBjb250cm9sIChGQykgKi8KKwkKKwlpZihmZGRpLT5oZHIubGxjXzgwMjJfMS5kc2FwPT0weGUwKQorCXsKKwkJc2tiX3B1bGwoc2tiLCBGRERJX0tfODAyMl9ITEVOLTMpOworCQl0eXBlID0gX19jb25zdGFudF9odG9ucyhFVEhfUF84MDJfMik7CisJfQorCWVsc2UKKwl7CisJCXNrYl9wdWxsKHNrYiwgRkRESV9LX1NOQVBfSExFTik7CQkvKiBhZGp1c3QgZm9yIDIxIGJ5dGUgaGVhZGVyICovCisJCXR5cGU9ZmRkaS0+aGRyLmxsY19zbmFwLmV0aGVydHlwZTsKKwl9CisJCisJLyogU2V0IHBhY2tldCB0eXBlIGJhc2VkIG9uIGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kIGZsYWcgc2V0dGluZ3MgKi8KKwkJCQorCWlmICgqZmRkaS0+ZGFkZHIgJiAweDAxKQorCXsKKwkJaWYgKG1lbWNtcChmZGRpLT5kYWRkciwgZGV2LT5icm9hZGNhc3QsIEZERElfS19BTEVOKSA9PSAwKQorCQkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9CUk9BRENBU1Q7CisJCWVsc2UKKwkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfTVVMVElDQVNUOworCX0KKwkKKwllbHNlIGlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJeworCQlpZiAobWVtY21wKGZkZGktPmRhZGRyLCBkZXYtPmRldl9hZGRyLCBGRERJX0tfQUxFTikpCisJCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKKwl9CisKKwkvKiBBc3N1bWUgODAyLjIgU05BUCBmcmFtZXMsIGZvciBub3cgKi8KKworCXJldHVybih0eXBlKTsKK30KKworRVhQT1JUX1NZTUJPTChmZGRpX3R5cGVfdHJhbnMpOworCitzdGF0aWMgaW50IGZkZGlfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlpZiAoKG5ld19tdHUgPCBGRERJX0tfU05BUF9ITEVOKSB8fCAobmV3X210dSA+IEZERElfS19TTkFQX0RMRU4pKQorCQlyZXR1cm4oLUVJTlZBTCk7CisJZGV2LT5tdHUgPSBuZXdfbXR1OworCXJldHVybigwKTsKK30KKworc3RhdGljIHZvaWQgZmRkaV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRldi0+Y2hhbmdlX210dQkJPSBmZGRpX2NoYW5nZV9tdHU7CisJZGV2LT5oYXJkX2hlYWRlcgk9IGZkZGlfaGVhZGVyOworCWRldi0+cmVidWlsZF9oZWFkZXIJPSBmZGRpX3JlYnVpbGRfaGVhZGVyOworCisJZGV2LT50eXBlCQk9IEFSUEhSRF9GRERJOworCWRldi0+aGFyZF9oZWFkZXJfbGVuCT0gRkRESV9LX1NOQVBfSExFTiszOwkvKiBBc3N1bWUgODAyLjIgU05BUCBoZHIgbGVuICsgMyBwYWQgYnl0ZXMgKi8KKwlkZXYtPm10dQkJPSBGRERJX0tfU05BUF9ETEVOOwkvKiBBc3N1bWUgbWF4IHBheWxvYWQgb2YgODAyLjIgU05BUCBmcmFtZSAqLworCWRldi0+YWRkcl9sZW4JCT0gRkRESV9LX0FMRU47CisJZGV2LT50eF9xdWV1ZV9sZW4JPSAxMDA7CQkJLyogTG9uZyBxdWV1ZXMgb24gRkRESSAqLworCWRldi0+ZmxhZ3MJCT0gSUZGX0JST0FEQ0FTVCB8IElGRl9NVUxUSUNBU1Q7CisJCisJbWVtc2V0KGRldi0+YnJvYWRjYXN0LCAweEZGLCBGRERJX0tfQUxFTik7Cit9CisKKy8qKgorICogYWxsb2NfZmRkaWRldiAtIFJlZ2lzdGVyIEZEREkgZGV2aWNlCisgKiBAc2l6ZW9mX3ByaXY6IFNpemUgb2YgYWRkaXRpb25hbCBkcml2ZXItcHJpdmF0ZSBzdHJ1Y3R1cmUgdG8gYmUgYWxsb2NhdGVkCisgKglmb3IgdGhpcyBGRERJIGRldmljZQorICoKKyAqIEZpbGwgaW4gdGhlIGZpZWxkcyBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSB3aXRoIEZEREktZ2VuZXJpYyB2YWx1ZXMuCisgKgorICogQ29uc3RydWN0cyBhIG5ldyBuZXQgZGV2aWNlLCBjb21wbGV0ZSB3aXRoIGEgcHJpdmF0ZSBkYXRhIGFyZWEgb2YKKyAqIHNpemUgQHNpemVvZl9wcml2LiAgQSAzMi1ieXRlIChub3QgYml0KSBhbGlnbm1lbnQgaXMgZW5mb3JjZWQgZm9yCisgKiB0aGlzIHByaXZhdGUgZGF0YSBhcmVhLgorICovCitzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfZmRkaWRldihpbnQgc2l6ZW9mX3ByaXYpCit7CisJcmV0dXJuIGFsbG9jX25ldGRldihzaXplb2ZfcHJpdiwgImZkZGklZCIsIGZkZGlfc2V0dXApOworfQorRVhQT1JUX1NZTUJPTChhbGxvY19mZGRpZGV2KTsKZGlmZiAtLWdpdCBhL25ldC84MDIvaGlwcGkuYyBiL25ldC84MDIvaGlwcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWIxMzVjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0LzgwMi9oaXBwaS5jCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCUhJUFBJLXR5cGUgZGV2aWNlIGhhbmRsaW5nLgorICoKKyAqIFZlcnNpb246CUAoIyloaXBwaS5jCTEuMC4wCTA1LzI5Lzk3CisgKgorICogQXV0aG9yczoJUm9zcyBCaXJvLCA8YmlyN0BsZWxhbmQuU3RhbmZvcmQuRWR1PgorICoJCUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoJCU1hcmsgRXZhbnMsIDxldmFuc21wQHVodXJhLmFzdG9uLmFjLnVrPgorICoJCUZsb3JpYW4gIExhIFJvY2hlLCA8cnpzZmxAcnoudW5pLXNiLmRlPgorICoJCUFsYW4gQ294LCA8Z3c0cHRzQGd3NHB0cy5hbXByLm9yZz4KKyAqCQlKZXMgU29yZW5zZW4sIDxKZXMuU29yZW5zZW5AY2Vybi5jaD4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGlwcGlkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisvKgorICogQ3JlYXRlIHRoZSBISVBQSSBNQUMgaGVhZGVyIGZvciBhbiBhcmJpdHJhcnkgcHJvdG9jb2wgbGF5ZXIgCisgKgorICogc2FkZHI9TlVMTAltZWFucyB1c2UgZGV2aWNlIHNvdXJjZSBhZGRyZXNzCisgKiBkYWRkcj1OVUxMCW1lYW5zIGxlYXZlIGRlc3RpbmF0aW9uIGFkZHJlc3MgKGVnIHVucmVzb2x2ZWQgYXJwKQorICovCisKK3N0YXRpYyBpbnQgaGlwcGlfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQl1bnNpZ25lZCBzaG9ydCB0eXBlLCB2b2lkICpkYWRkciwgdm9pZCAqc2FkZHIsCisJCQl1bnNpZ25lZCBsZW4pCit7CisJc3RydWN0IGhpcHBpX2hkciAqaGlwID0gKHN0cnVjdCBoaXBwaV9oZHIgKilza2JfcHVzaChza2IsIEhJUFBJX0hMRU4pOworCisJaWYgKCFsZW4peworCQlsZW4gPSBza2ItPmxlbiAtIEhJUFBJX0hMRU47CisJCXByaW50aygiaGlwcGlfaGVhZGVyKCk6IGxlbmd0aCBub3Qgc3VwcGxpZWRcbiIpOworCX0KKworCS8qCisJICogRHVlIHRvIHRoZSBzdHVwaWRpdHkgb2YgdGhlIGxpdHRsZSBlbmRpYW4gYnl0ZS1vcmRlciB3ZQorCSAqIGhhdmUgdG8gc2V0IHRoZSBmcCBmaWVsZCB0aGlzIHdheS4KKwkgKi8KKwloaXAtPmZwLmZpeGVkCQk9IF9fY29uc3RhbnRfaHRvbmwoMHgwNDgwMDAxOCk7CisJaGlwLT5mcC5kMl9zaXplCQk9IGh0b25sKGxlbiArIDgpOworCWhpcC0+bGUuZmMJCT0gMDsKKwloaXAtPmxlLmRvdWJsZV93aWRlCT0gMDsJLyogb25seSBISVBQSSA4MDAgZm9yIHRoZSB0aW1lIGJlaW5nICovCisJaGlwLT5sZS5tZXNzYWdlX3R5cGUJPSAwOwkvKiBEYXRhIFBEVSAqLworCisJaGlwLT5sZS5kZXN0X2FkZHJfdHlwZQk9IDI7CS8qIDEyIGJpdCBTQyBhZGRyZXNzICovCisJaGlwLT5sZS5zcmNfYWRkcl90eXBlCT0gMjsJLyogMTIgYml0IFNDIGFkZHJlc3MgKi8KKworCW1lbWNweShoaXAtPmxlLnNyY19zd2l0Y2hfYWRkciwgZGV2LT5kZXZfYWRkciArIDMsIDMpOworCW1lbXNldCgmaGlwLT5sZS5yZXNlcnZlZCwgMCwgMTYpOworCisJaGlwLT5zbmFwLmRzYXAJCT0gSElQUElfRVhURU5ERURfU0FQOworCWhpcC0+c25hcC5zc2FwCQk9IEhJUFBJX0VYVEVOREVEX1NBUDsKKwloaXAtPnNuYXAuY3RybAkJPSBISVBQSV9VSV9DTUQ7CisJaGlwLT5zbmFwLm91aVswXQk9IDB4MDA7CisJaGlwLT5zbmFwLm91aVsxXQk9IDB4MDA7CisJaGlwLT5zbmFwLm91aVsyXQk9IDB4MDA7CisJaGlwLT5zbmFwLmV0aGVydHlwZQk9IGh0b25zKHR5cGUpOworCisJaWYgKGRhZGRyKQorCXsKKwkJbWVtY3B5KGhpcC0+bGUuZGVzdF9zd2l0Y2hfYWRkciwgZGFkZHIgKyAzLCAzKTsKKwkJbWVtY3B5KCZza2ItPnByaXZhdGUuaWZpZWxkLCBkYWRkciArIDIsIDQpOworCQlyZXR1cm4gSElQUElfSExFTjsKKwl9CisJcmV0dXJuIC0oKGludClISVBQSV9ITEVOKTsKK30KKworCisvKgorICogUmVidWlsZCB0aGUgSElQUEkgTUFDIGhlYWRlci4gVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYW4gQVJQIGhhcworICogY29tcGxldGVkIG9uIHRoaXMgc2tfYnVmZi4gV2Ugbm93IGxldCBBUlAgZmlsbCBpbiB0aGUgb3RoZXIgZmllbGRzLgorICovCisKK3N0YXRpYyBpbnQgaGlwcGlfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaGlwcGlfaGRyICpoaXAgPSAoc3RydWN0IGhpcHBpX2hkciAqKXNrYi0+ZGF0YTsKKworCS8qCisJICogT25seSBJUCBpcyBjdXJyZW50bHkgc3VwcG9ydGVkCisJICovCisJIAorCWlmKGhpcC0+c25hcC5ldGhlcnR5cGUgIT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCkpIAorCXsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB1bmFibGUgdG8gcmVzb2x2ZSB0eXBlICVYIGFkZHJlc3Nlcy5cbiIsc2tiLT5kZXYtPm5hbWUsbnRvaHMoaGlwLT5zbmFwLmV0aGVydHlwZSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFdlIGRvbid0IHN1cHBvcnQgZHluYW1pYyBBUlAgb24gSElQUEksIGJ1dCB3ZSB1c2UgdGhlIEFSUAorCSAqIHN0YXRpYyBBUlAgdGFibGVzIHRvIGhvbGQgdGhlIEktRklFTERzLgorCSAqLworCXJldHVybiBhcnBfZmluZChoaXAtPmxlLmRhZGRyLCBza2IpOworfQorCisKKy8qCisgKglEZXRlcm1pbmUgdGhlIHBhY2tldCdzIHByb3RvY29sIElELgorICovCisgCit1bnNpZ25lZCBzaG9ydCBoaXBwaV90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhpcHBpX2hkciAqaGlwOworCQorCWhpcCA9IChzdHJ1Y3QgaGlwcGlfaGRyICopIHNrYi0+ZGF0YTsKKworCS8qCisJICogVGhpcyBpcyBhY3R1YWxseSB3cm9uZyAuLi4gcXVlc3Rpb24gaXMgaWYgd2UgcmVhbGx5IHNob3VsZAorCSAqIHNldCB0aGUgcmF3IGFkZHJlc3MgaGVyZS4KKwkgKi8KKwkgc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCSBza2JfcHVsbChza2IsIEhJUFBJX0hMRU4pOworCisJLyoKKwkgKiBObyBmYW5jeSBwcm9taXNjIHN0dWZmIGhlcmUgbm93LgorCSAqLworCisJcmV0dXJuIGhpcC0+c25hcC5ldGhlcnR5cGU7Cit9CisKK0VYUE9SVF9TWU1CT0woaGlwcGlfdHlwZV90cmFucyk7CisKK3N0YXRpYyBpbnQgaGlwcGlfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwkvKgorCSAqIEhJUFBJJ3MgZ290IHRoZXNlIG5pY2UgbGFyZ2UgTVRVcy4KKwkgKi8KKwlpZiAoKG5ld19tdHUgPCA2OCkgfHwgKG5ld19tdHUgPiA2NTI4MCkpCisJCXJldHVybiAtRUlOVkFMOworCWRldi0+bXR1ID0gbmV3X210dTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBGb3IgSElQUEkgd2Ugd2lsbCBhY3R1YWxseSB1c2UgdGhlIGxvd2VyIDQgYnl0ZXMgb2YgdGhlIGhhcmR3YXJlCisgKiBhZGRyZXNzIGFzIHRoZSBJLUZJRUxEIHJhdGhlciB0aGFuIHRoZSBhY3R1YWwgaGFyZHdhcmUgYWRkcmVzcy4KKyAqLworc3RhdGljIGludCBoaXBwaV9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwKQoreworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FQlVTWTsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGlwcGlfbmVpZ2hfc2V0dXBfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBuZWlnaF9wYXJtcyAqcCkKK3sKKwkvKiBOZXZlciBzZW5kIGJyb2FkY2FzdC9tdWx0aWNhc3QgQVJQIG1lc3NhZ2VzICovCisJcC0+bWNhc3RfcHJvYmVzID0gMDsKKyAKKwkvKiBJbiBJUHY2IHVuaWNhc3QgcHJvYmVzIGFyZSB2YWxpZCBldmVuIG9uIE5CTUEsCisJKiBiZWNhdXNlIHRoZXkgYXJlIGVuY2Fwc3VsYXRlZCBpbiBub3JtYWwgSVB2NiBwcm90b2NvbC4KKwkqIFNob3VsZCBiZSBhIGdlbmVyaWMgZmxhZy4gCisJKi8KKwlpZiAocC0+dGJsLT5mYW1pbHkgIT0gQUZfSU5FVDYpCisJCXAtPnVjYXN0X3Byb2JlcyA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhpcHBpX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QJCT0gTlVMTDsKKwlkZXYtPmNoYW5nZV9tdHUJCQk9IGhpcHBpX2NoYW5nZV9tdHU7CisJZGV2LT5oYXJkX2hlYWRlcgkJPSBoaXBwaV9oZWFkZXI7CisJZGV2LT5yZWJ1aWxkX2hlYWRlciAJCT0gaGlwcGlfcmVidWlsZF9oZWFkZXI7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgCQk9IGhpcHBpX21hY19hZGRyOworCWRldi0+aGFyZF9oZWFkZXJfcGFyc2UJCT0gTlVMTDsKKwlkZXYtPmhhcmRfaGVhZGVyX2NhY2hlCQk9IE5VTEw7CisJZGV2LT5oZWFkZXJfY2FjaGVfdXBkYXRlCT0gTlVMTDsKKwlkZXYtPm5laWdoX3NldHVwIAkJPSBoaXBwaV9uZWlnaF9zZXR1cF9kZXY7IAorCisJLyoKKwkgKiBXZSBkb24ndCBzdXBwb3J0IEhJUFBJIGBBUlAnIGZvciB0aGUgdGltZSBiZWluZywgYW5kIHByb2JhYmx5CisJICogbmV2ZXIgd2lsbCB1bmxlc3Mgc29tZW9uZSBlbHNlIGltcGxlbWVudHMgaXQuIEhvd2V2ZXIgd2UKKwkgKiBzdGlsbCBuZWVkIGEgZmFrZSBBUlBIUkQgdG8gbWFrZSBpZmNvbmZpZyBhbmQgZnJpZW5kcyBwbGF5IGJhbGwuCisJICovCisJZGV2LT50eXBlCQk9IEFSUEhSRF9ISVBQSTsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiAJPSBISVBQSV9ITEVOOworCWRldi0+bXR1CQk9IDY1MjgwOworCWRldi0+YWRkcl9sZW4JCT0gSElQUElfQUxFTjsKKwlkZXYtPnR4X3F1ZXVlX2xlbgk9IDI1IC8qIDUgKi87CisJbWVtc2V0KGRldi0+YnJvYWRjYXN0LCAweEZGLCBISVBQSV9BTEVOKTsKKworCisJLyoKKwkgKiBISVBQSSBkb2Vzbid0IHN1cHBvcnQgYnJvYWRjYXN0K211bHRpY2FzdCBhbmQgd2Ugb25seSB1c2UKKwkgKiBzdGF0aWMgQVJQIHRhYmxlcy4gQVJQIGlzIGRpc2FibGVkIGJ5IGhpcHBpX25laWdoX3NldHVwX2Rldi4gCisJICovCisJZGV2LT5mbGFncyA9IDA7IAorfQorCisvKioKKyAqIGFsbG9jX2hpcHBpX2RldiAtIFJlZ2lzdGVyIEhJUFBJIGRldmljZQorICogQHNpemVvZl9wcml2OiBTaXplIG9mIGFkZGl0aW9uYWwgZHJpdmVyLXByaXZhdGUgc3RydWN0dXJlIHRvIGJlIGFsbG9jYXRlZAorICoJZm9yIHRoaXMgSElQUEkgZGV2aWNlCisgKgorICogRmlsbCBpbiB0aGUgZmllbGRzIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlIHdpdGggSElQUEktZ2VuZXJpYyB2YWx1ZXMuCisgKgorICogQ29uc3RydWN0cyBhIG5ldyBuZXQgZGV2aWNlLCBjb21wbGV0ZSB3aXRoIGEgcHJpdmF0ZSBkYXRhIGFyZWEgb2YKKyAqIHNpemUgQHNpemVvZl9wcml2LiAgQSAzMi1ieXRlIChub3QgYml0KSBhbGlnbm1lbnQgaXMgZW5mb3JjZWQgZm9yCisgKiB0aGlzIHByaXZhdGUgZGF0YSBhcmVhLgorICovCisKK3N0cnVjdCBuZXRfZGV2aWNlICphbGxvY19oaXBwaV9kZXYoaW50IHNpemVvZl9wcml2KQoreworCXJldHVybiBhbGxvY19uZXRkZXYoc2l6ZW9mX3ByaXYsICJoaXAlZCIsIGhpcHBpX3NldHVwKTsKK30KKworRVhQT1JUX1NZTUJPTChhbGxvY19oaXBwaV9kZXYpOwpkaWZmIC0tZ2l0IGEvbmV0LzgwMi9wODAyMi5jIGIvbmV0LzgwMi9wODAyMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZTYzNDEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvODAyL3A4MDIyLmMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqCU5FVDM6CVN1cHBvcnQgZm9yIDgwMi4yIGRlbXVsdGlwbGV4aW5nIG9mZiBFdGhlcm5ldCAoVG9rZW4gcmluZworICoJCWlzIGtlcHQgc2VwYXJhdGUgc2VlIHA4MDIydHIuYykKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCQlEZW11bHRpcGxleCA4MDIuMiBlbmNvZGVkIHByb3RvY29scy4gV2UgbWF0Y2ggdGhlIGVudHJ5IGJ5IHRoZQorICoJCVNTQVAvRFNBUCBwYWlyIGFuZCB0aGVuIGRlbGl2ZXIgdG8gdGhlIHJlZ2lzdGVyZWQgZGF0YWxpbmsgdGhhdAorICoJCW1hdGNoZXMuIFRoZSBjb250cm9sIGJ5dGUgaXMgaWdub3JlZCBhbmQgaGFuZGxpbmcgb2Ygc3VjaCBpdGVtcworICoJCWlzIHVwIHRvIHRoZSByb3V0aW5lIHBhc3NlZCB0aGUgZnJhbWUuCisgKgorICoJCVVubGlrZSB0aGUgODAyLjMgZGF0YWxpbmsgd2UgaGF2ZSBhIGxpc3Qgb2YgODAyLjIgZW50cmllcyBhcworICoJCXRoZXJlIGFyZSBtdWx0aXBsZSBwcm90b2NvbHMgdG8gZGVtdXguIFRoZSBsaXN0IGlzIGN1cnJlbnRseQorICoJCXNob3J0ICgzIG9yIDQgZW50cmllcyBhdCBtb3N0KS4gVGhlIGN1cnJlbnQgZGVtdXggYXNzdW1lcyB0aGlzLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L2RhdGFsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxuZXQvbGxjLmg+CisjaW5jbHVkZSA8bmV0L3A4MDIyLmg+CisKK3N0YXRpYyBpbnQgcDgwMjJfcmVxdWVzdChzdHJ1Y3QgZGF0YWxpbmtfcHJvdG8gKmRsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJIHVuc2lnbmVkIGNoYXIgKmRlc3QpCit7CisJbGxjX2J1aWxkX2FuZF9zZW5kX3VpX3BrdChkbC0+c2FwLCBza2IsIGRlc3QsIGRsLT5zYXAtPmxhZGRyLmxzYXApOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZGF0YWxpbmtfcHJvdG8gKnJlZ2lzdGVyXzgwMjJfY2xpZW50KHVuc2lnbmVkIGNoYXIgdHlwZSwKKwkJCQkJICAgIGludCAoKmZ1bmMpKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCQlzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0KSkKK3sKKwlzdHJ1Y3QgZGF0YWxpbmtfcHJvdG8gKnByb3RvOworCisJcHJvdG8gPSBrbWFsbG9jKHNpemVvZigqcHJvdG8pLCBHRlBfQVRPTUlDKTsKKwlpZiAocHJvdG8pIHsKKwkJcHJvdG8tPnR5cGVbMF0JCT0gdHlwZTsKKwkJcHJvdG8tPmhlYWRlcl9sZW5ndGgJPSAzOworCQlwcm90by0+cmVxdWVzdAkJPSBwODAyMl9yZXF1ZXN0OworCQlwcm90by0+c2FwID0gbGxjX3NhcF9vcGVuKHR5cGUsIGZ1bmMpOworCQlpZiAoIXByb3RvLT5zYXApIHsKKwkJCWtmcmVlKHByb3RvKTsKKwkJCXByb3RvID0gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gcHJvdG87Cit9CisKK3ZvaWQgdW5yZWdpc3Rlcl84MDIyX2NsaWVudChzdHJ1Y3QgZGF0YWxpbmtfcHJvdG8gKnByb3RvKQoreworCWxsY19zYXBfY2xvc2UocHJvdG8tPnNhcCk7CisJa2ZyZWUocHJvdG8pOworfQorCitFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyXzgwMjJfY2xpZW50KTsKK0VYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl84MDIyX2NsaWVudCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC84MDIvcDgwMjMuYyBiL25ldC84MDIvcDgwMjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGI2MWI0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0LzgwMi9wODAyMy5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKglORVQzOgk4MDIuMyBkYXRhIGxpbmsgaG9va3MgdXNlZCBmb3IgSVBYIDgwMi4zCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgk4MDIuMyBpc24ndCByZWFsbHkgYSBwcm90b2NvbCBkYXRhIGxpbmsgbGF5ZXIuIFNvbWUgb2xkIElQWCBzdHVmZgorICoJdXNlcyBpdCBob3dldmVyLiBOb3RlIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgODAyLjMgcHJvdG9jb2wgbGF5ZXIKKyAqCWluIHRoZSBzeXN0ZW0uIFdlIGRvbid0IGN1cnJlbnRseSBzdXBwb3J0IGRpZmZlcmVudCBwcm90b2NvbHMKKyAqCXJ1bm5pbmcgcmF3IDgwMi4zIG9uIGRpZmZlcmVudCBkZXZpY2VzLiBUaGFua2Z1bGx5IG5vYm9keSBlbHNlCisgKgloYXMgZG9uZSBhbnl0aGluZyBsaWtlIHRoZSBvbGQgSVBYLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyNpbmNsdWRlIDxuZXQvZGF0YWxpbmsuaD4KKworLyoKKyAqCVBsYWNlIGFuIDgwMi4zIGhlYWRlciBvbiBhIHBhY2tldC4gVGhlIGRyaXZlciB3aWxsIGRvIHRoZSBtYWMKKyAqCWFkZHJlc3Nlcywgd2UganVzdCBuZWVkIHRvIGdpdmUgaXQgdGhlIGJ1ZmZlciBsZW5ndGguCisgKi8KK3N0YXRpYyBpbnQgcDgwMjNfcmVxdWVzdChzdHJ1Y3QgZGF0YWxpbmtfcHJvdG8gKmRsLAorCQkJIHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGNoYXIgKmRlc3Rfbm9kZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CisKKwlkZXYtPmhhcmRfaGVhZGVyKHNrYiwgZGV2LCBFVEhfUF84MDJfMywgZGVzdF9ub2RlLCBOVUxMLCBza2ItPmxlbik7CisJcmV0dXJuIGRldl9xdWV1ZV94bWl0KHNrYik7Cit9CisKKy8qCisgKglDcmVhdGUgYW4gODAyLjMgY2xpZW50LiBOb3RlIHRoZXJlIGNhbiBiZSBvbmx5IG9uZSA4MDIuMyBjbGllbnQKKyAqLworc3RydWN0IGRhdGFsaW5rX3Byb3RvICptYWtlXzgwMjNfY2xpZW50KHZvaWQpCit7CisJc3RydWN0IGRhdGFsaW5rX3Byb3RvICpwcm90byA9IGttYWxsb2Moc2l6ZW9mKCpwcm90byksIEdGUF9BVE9NSUMpOworCisJaWYgKHByb3RvKSB7CisJCXByb3RvLT5oZWFkZXJfbGVuZ3RoID0gMDsKKwkJcHJvdG8tPnJlcXVlc3QJICAgICA9IHA4MDIzX3JlcXVlc3Q7CisJfQorCXJldHVybiBwcm90bzsKK30KKworLyoKKyAqCURlc3Ryb3kgdGhlIDgwMi4zIGNsaWVudC4KKyAqLwordm9pZCBkZXN0cm95XzgwMjNfY2xpZW50KHN0cnVjdCBkYXRhbGlua19wcm90byAqZGwpCit7CisJaWYgKGRsKQorCQlrZnJlZShkbCk7Cit9CisKK0VYUE9SVF9TWU1CT0woZGVzdHJveV84MDIzX2NsaWVudCk7CitFWFBPUlRfU1lNQk9MKG1ha2VfODAyM19jbGllbnQpOwpkaWZmIC0tZ2l0IGEvbmV0LzgwMi9wc25hcC5jIGIvbmV0LzgwMi9wc25hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNTM4MjEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvODAyL3BzbmFwLmMKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKglTTkFQIGRhdGEgbGluayBsYXllci4gRGVyaXZlZCBmcm9tIDgwMi4yCisgKgorICoJCUFsYW4gQ294IDxBbGFuLkNveEBsaW51eC5vcmc+LAorICoJCWZyb20gdGhlIDgwMi4yIGxheWVyIGJ5IEdyZWcgUGFnZS4KKyAqCQlNZXJnZWQgaW4gYWRkaXRpb25zIGZyb20gR3JlZyBQYWdlJ3MgcHNuYXAuYy4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L2RhdGFsaW5rLmg+CisjaW5jbHVkZSA8bmV0L2xsYy5oPgorI2luY2x1ZGUgPG5ldC9wc25hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKK3N0YXRpYyBMSVNUX0hFQUQoc25hcF9saXN0KTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc25hcF9sb2NrKTsKK3N0YXRpYyBzdHJ1Y3QgbGxjX3NhcCAqc25hcF9zYXA7CisKKy8qCisgKglGaW5kIGEgc25hcCBjbGllbnQgYnkgbWF0Y2hpbmcgdGhlIDUgYnl0ZXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGF0YWxpbmtfcHJvdG8gKmZpbmRfc25hcF9jbGllbnQodW5zaWduZWQgY2hhciAqZGVzYykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwlzdHJ1Y3QgZGF0YWxpbmtfcHJvdG8gKnByb3RvID0gTlVMTCwgKnA7CisKKwlsaXN0X2Zvcl9lYWNoX3JjdShlbnRyeSwgJnNuYXBfbGlzdCkgeworCQlwID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGRhdGFsaW5rX3Byb3RvLCBub2RlKTsKKwkJaWYgKCFtZW1jbXAocC0+dHlwZSwgZGVzYywgNSkpIHsKKwkJCXByb3RvID0gcDsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBwcm90bzsKK30KKworLyoKKyAqCUEgU05BUCBwYWNrZXQgaGFzIGFycml2ZWQKKyAqLworc3RhdGljIGludCBzbmFwX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgc3RydWN0IHBhY2tldF90eXBlICpwdCkKK3sKKwlpbnQgcmMgPSAxOworCXN0cnVjdCBkYXRhbGlua19wcm90byAqcHJvdG87CisJc3RhdGljIHN0cnVjdCBwYWNrZXRfdHlwZSBzbmFwX3BhY2tldF90eXBlID0geworCQkudHlwZSA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfU05BUCksCisJfTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlwcm90byA9IGZpbmRfc25hcF9jbGllbnQoc2tiLT5oLnJhdyk7CisJaWYgKHByb3RvKSB7CisJCS8qIFBhc3MgdGhlIGZyYW1lIG9uLiAqLworCQlza2ItPmgucmF3ICArPSA1OworCQlza2JfcHVsbChza2IsIDUpOworCQlyYyA9IHByb3RvLT5yY3ZmdW5jKHNrYiwgZGV2LCAmc25hcF9wYWNrZXRfdHlwZSk7CisJfSBlbHNlIHsKKwkJc2tiLT5zayA9IE5VTEw7CisJCWtmcmVlX3NrYihza2IpOworCQlyYyA9IDE7CisJfQorCisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIHJjOworfQorCisvKgorICoJUHV0IGEgU05BUCBoZWFkZXIgb24gYSBmcmFtZSBhbmQgcGFzcyB0byA4MDIuMgorICovCitzdGF0aWMgaW50IHNuYXBfcmVxdWVzdChzdHJ1Y3QgZGF0YWxpbmtfcHJvdG8gKmRsLAorCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKmRlc3QpCit7CisJbWVtY3B5KHNrYl9wdXNoKHNrYiwgNSksIGRsLT50eXBlLCA1KTsKKwlsbGNfYnVpbGRfYW5kX3NlbmRfdWlfcGt0KHNuYXBfc2FwLCBza2IsIGRlc3QsIHNuYXBfc2FwLT5sYWRkci5sc2FwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCVNldCB1cCB0aGUgU05BUCBsYXllcgorICovCitFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX3NuYXBfY2xpZW50KTsKK0VYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9zbmFwX2NsaWVudCk7CisKK3N0YXRpYyBjaGFyIHNuYXBfZXJyX21zZ1tdIF9faW5pdGRhdGEgPQorCUtFUk5fQ1JJVCAiU05BUCAtIHVuYWJsZSB0byByZWdpc3RlciB3aXRoIDgwMi4yXG4iOworCitzdGF0aWMgaW50IF9faW5pdCBzbmFwX2luaXQodm9pZCkKK3sKKwlzbmFwX3NhcCA9IGxsY19zYXBfb3BlbigweEFBLCBzbmFwX3Jjdik7CisKKwlpZiAoIXNuYXBfc2FwKQorCQlwcmludGsoc25hcF9lcnJfbXNnKTsKKworCXJldHVybiAwOworfQorCittb2R1bGVfaW5pdChzbmFwX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgc25hcF9leGl0KHZvaWQpCit7CisJbGxjX3NhcF9jbG9zZShzbmFwX3NhcCk7Cit9CisKK21vZHVsZV9leGl0KHNuYXBfZXhpdCk7CisKKworLyoKKyAqCVJlZ2lzdGVyIFNOQVAgY2xpZW50cy4gV2UgZG9uJ3QgeWV0IHVzZSB0aGlzIGZvciBJUC4KKyAqLworc3RydWN0IGRhdGFsaW5rX3Byb3RvICpyZWdpc3Rlcl9zbmFwX2NsaWVudCh1bnNpZ25lZCBjaGFyICpkZXNjLAorCQkJCQkgICAgaW50ICgqcmN2ZnVuYykoc3RydWN0IHNrX2J1ZmYgKiwKKwkJCQkJCSAgICAJICAgc3RydWN0IG5ldF9kZXZpY2UgKiwKKwkJCQkJCQkgICBzdHJ1Y3QgcGFja2V0X3R5cGUgKikpCit7CisJc3RydWN0IGRhdGFsaW5rX3Byb3RvICpwcm90byA9IE5VTEw7CisKKwlzcGluX2xvY2tfYmgoJnNuYXBfbG9jayk7CisKKwlpZiAoZmluZF9zbmFwX2NsaWVudChkZXNjKSkKKwkJZ290byBvdXQ7CisKKwlwcm90byA9IGttYWxsb2Moc2l6ZW9mKCpwcm90byksIEdGUF9BVE9NSUMpOworCWlmIChwcm90bykgeworCQltZW1jcHkocHJvdG8tPnR5cGUsIGRlc2MsNSk7CisJCXByb3RvLT5yY3ZmdW5jCQk9IHJjdmZ1bmM7CisJCXByb3RvLT5oZWFkZXJfbGVuZ3RoCT0gNSArIDM7IC8qIHNuYXAgKyA4MDIuMiAqLworCQlwcm90by0+cmVxdWVzdAkJPSBzbmFwX3JlcXVlc3Q7CisJCWxpc3RfYWRkX3JjdSgmcHJvdG8tPm5vZGUsICZzbmFwX2xpc3QpOworCX0KK291dDoKKwlzcGluX3VubG9ja19iaCgmc25hcF9sb2NrKTsKKworCXN5bmNocm9uaXplX25ldCgpOworCXJldHVybiBwcm90bzsKK30KKworLyoKKyAqCVVucmVnaXN0ZXIgU05BUCBjbGllbnRzLiBQcm90b2NvbHMgbm8gbG9uZ2VyIHdhbnQgdG8gcGxheSB3aXRoIHVzIC4uLgorICovCit2b2lkIHVucmVnaXN0ZXJfc25hcF9jbGllbnQoc3RydWN0IGRhdGFsaW5rX3Byb3RvICpwcm90bykKK3sKKwlzcGluX2xvY2tfYmgoJnNuYXBfbG9jayk7CisJbGlzdF9kZWxfcmN1KCZwcm90by0+bm9kZSk7CisJc3Bpbl91bmxvY2tfYmgoJnNuYXBfbG9jayk7CisKKwlzeW5jaHJvbml6ZV9uZXQoKTsKKworCWtmcmVlKHByb3RvKTsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0LzgwMi9zeXNjdGxfbmV0XzgwMi5jIGIvbmV0LzgwMi9zeXNjdGxfbmV0XzgwMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MDc5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvODAyL3N5c2N0bF9uZXRfODAyLmMKQEAgLTAsMCArMSwzMyBAQAorLyogLSotIGxpbnV4LWMgLSotCisgKgkJc3lzY3RsX25ldF84MDIuYzogc3lzY3RsIGludGVyZmFjZSB0byBuZXQgODAyIHN1YnN5c3RlbS4KKyAqCisgKgkJQmVndW4gQXByaWwgMSwgMTk5NiwgTWlrZSBTaGF2ZXIuCisgKgkJQWRkZWQgL3Byb2Mvc3lzL25ldC84MDIgZGlyZWN0b3J5IGVudHJ5IChlbXB0eSA9KSApLiBbTVNdCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpZmRlZiBDT05GSUdfVFIKK2V4dGVybiBpbnQgc3lzY3RsX3RyX3JpZl90aW1lb3V0OworI2VuZGlmCisKK3N0cnVjdCBjdGxfdGFibGUgdHJfdGFibGVbXSA9IHsKKyNpZmRlZiBDT05GSUdfVFIKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9UUl9SSUZfVElNRU9VVCwKKwkJLnByb2NuYW1lCT0gInJpZl90aW1lb3V0IiwKKwkJLmRhdGEJCT0gJnN5c2N0bF90cl9yaWZfdGltZW91dCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKyNlbmRpZiAvKiBDT05GSUdfVFIgKi8KKwl7IDAgfSwKK307CmRpZmYgLS1naXQgYS9uZXQvODAyL3RyLmMgYi9uZXQvODAyL3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUyOTNjYwotLS0gL2Rldi9udWxsCisrKyBiL25ldC84MDIvdHIuYwpAQCAtMCwwICsxLDY0NSBAQAorLyoKKyAqIE5FVDM6CVRva2VuIHJpbmcgZGV2aWNlIGhhbmRsaW5nIHN1YnJvdXRpbmVzCisgKiAKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZpeGVzOiAgICAgICAzIEZlYiA5NyBQYXVsIE5vcnRvbiA8cG5vcnRvbkBjdHMuY29tPiBNaW5vciByb3V0aW5nIGZpeGVzLgorICogICAgICAgICAgICAgIEFkZGVkIHJpZiB0YWJsZSB0byAvcHJvYy9uZXQvdHJfcmlmIGFuZCByaWYgdGltZW91dCB0bworICogICAgICAgICAgICAgIC9wcm9jL3N5cy9uZXQvdG9rZW4tcmluZy9yaWZfdGltZW91dC4KKyAqICAgICAgICAgICAgICAyMiBKdW4gOTggUGF1bCBOb3J0b24gPHAubm9ydG9uQGNvbXB1dGVyLm9yZz4gUmVhcnJhbmdlZAorICogICAgICAgICAgICAgIHRyX2hlYWRlciBhbmQgdHJfdHlwZV90cmFucyB0byBoYW5kbGUgcGFzc2luZyBJUFggU05BUCBhbmQKKyAqICAgICAgICAgICAgICA4MDIuMiB0aHJvdWdoIHRoZSBjb3JyZWN0IGxheWVycy4gRWxpbWluYXRlZCB0cl9yZWZvcm1hdC4KKyAqICAgICAgICAKKyAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90cmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorCitzdGF0aWMgdm9pZCB0cl9hZGRfcmlmX2luZm8oc3RydWN0IHRyaF9oZHIgKnRyaCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCByaWZfY2hlY2tfZXhwaXJlKHVuc2lnbmVkIGxvbmcgZHVtbXkpOworCisjZGVmaW5lIFRSX1NSX0RFQlVHIDAKKworLyoKKyAqCUVhY2ggUklGIGVudHJ5IHdlIGxlYXJuIGlzIGtlcHQgdGhpcyB3YXkKKyAqLworIAorc3RydWN0IHJpZl9jYWNoZV9zIHsJCisJdW5zaWduZWQgY2hhciBhZGRyW1RSX0FMRU5dOworCWludCBpZmFjZTsKKwlfX3UxNiByY2Y7CisJX191MTYgcnNlZ1s4XTsKKwlzdHJ1Y3QgcmlmX2NhY2hlX3MgKm5leHQ7CisJdW5zaWduZWQgbG9uZyBsYXN0X3VzZWQ7CisJdW5zaWduZWQgY2hhciBsb2NhbF9yaW5nOworfTsKKworI2RlZmluZSBSSUZfVEFCTEVfU0laRSAzMgorCisvKgorICoJV2UgaGFzaCB0aGUgUklGIGNhY2hlIDMyIHdheXMuIFdlIGRvIGFmdGVyIGFsbCBoYXZlIHRvIGxvb2sgaXQKKyAqCXVwIGEgbG90LgorICovCisgCitzdGF0aWMgc3RydWN0IHJpZl9jYWNoZV9zICpyaWZfdGFibGVbUklGX1RBQkxFX1NJWkVdOworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJpZl9sb2NrKTsKKworCisvKgorICoJR2FyYmFnZSBkaXNwb3NhbCB0aW1lci4KKyAqLworIAorc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHJpZl90aW1lcjsKKworaW50IHN5c2N0bF90cl9yaWZfdGltZW91dCA9IDYwKjEwKkhaOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmlmX2hhc2goY29uc3QgdW5zaWduZWQgY2hhciAqYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIHg7CisKKwl4ID0gYWRkclswXTsKKwl4ID0gKHggPDwgMikgXiBhZGRyWzFdOworCXggPSAoeCA8PCAyKSBeIGFkZHJbMl07CisJeCA9ICh4IDw8IDIpIF4gYWRkclszXTsKKwl4ID0gKHggPDwgMikgXiBhZGRyWzRdOworCXggPSAoeCA8PCAyKSBeIGFkZHJbNV07CisKKwl4IF49IHggPj4gODsKKworCXJldHVybiB4ICYgKFJJRl9UQUJMRV9TSVpFIC0gMSk7Cit9CisKKy8qCisgKglQdXQgdGhlIGhlYWRlcnMgb24gYSB0b2tlbiByaW5nIHBhY2tldC4gVG9rZW4gcmluZyBzb3VyY2Ugcm91dGluZworICoJbWFrZXMgdGhpcyBhIGxpdHRsZSBtb3JlIGV4Y2l0aW5nIHRoYW4gb24gZXRoZXJuZXQuCisgKi8KKyAKK3N0YXRpYyBpbnQgdHJfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgdW5zaWduZWQgc2hvcnQgdHlwZSwKKwkJICAgICB2b2lkICpkYWRkciwgdm9pZCAqc2FkZHIsIHVuc2lnbmVkIGxlbikgCit7CisJc3RydWN0IHRyaF9oZHIgKnRyaDsKKwlpbnQgaGRyX2xlbjsKKworCS8qIAorCSAqIEFkZCB0aGUgODAyLjIgU05BUCBoZWFkZXIgaWYgSVAgYXMgdGhlIElQdjQvSVB2NiBjb2RlIGNhbGxzICAKKwkgKiBkZXYtPmhhcmRfaGVhZGVyIGRpcmVjdGx5LgorCSAqLworCWlmICh0eXBlID09IEVUSF9QX0lQIHx8IHR5cGUgPT0gRVRIX1BfSVBWNiB8fCB0eXBlID09IEVUSF9QX0FSUCkKKwl7CisJCXN0cnVjdCB0cmxsYyAqdHJsbGM7CisKKwkJaGRyX2xlbiA9IHNpemVvZihzdHJ1Y3QgdHJoX2hkcikgKyBzaXplb2Yoc3RydWN0IHRybGxjKTsKKwkJdHJoID0gKHN0cnVjdCB0cmhfaGRyICopc2tiX3B1c2goc2tiLCBoZHJfbGVuKTsKKwkJdHJsbGMgPSAoc3RydWN0IHRybGxjICopKHRyaCsxKTsKKwkJdHJsbGMtPmRzYXAgPSB0cmxsYy0+c3NhcCA9IEVYVEVOREVEX1NBUDsKKwkJdHJsbGMtPmxsYyA9IFVJX0NNRDsKKwkJdHJsbGMtPnByb3RpZFswXSA9IHRybGxjLT5wcm90aWRbMV0gPSB0cmxsYy0+cHJvdGlkWzJdID0gMHgwMDsKKwkJdHJsbGMtPmV0aGVydHlwZSA9IGh0b25zKHR5cGUpOworCX0KKwllbHNlCisJeworCQloZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCB0cmhfaGRyKTsKKwkJdHJoID0gKHN0cnVjdCB0cmhfaGRyICopc2tiX3B1c2goc2tiLCBoZHJfbGVuKTsJCisJfQorCisJdHJoLT5hYz1BQzsKKwl0cmgtPmZjPUxMQ19GUkFNRTsKKworCWlmKHNhZGRyKQorCQltZW1jcHkodHJoLT5zYWRkcixzYWRkcixkZXYtPmFkZHJfbGVuKTsKKwllbHNlCisJCW1lbWNweSh0cmgtPnNhZGRyLGRldi0+ZGV2X2FkZHIsZGV2LT5hZGRyX2xlbik7CisKKwkvKgorCSAqCUJ1aWxkIHRoZSBkZXN0aW5hdGlvbiBhbmQgdGhlbiBzb3VyY2Ugcm91dGUgdGhlIGZyYW1lCisJICovCisJIAorCWlmKGRhZGRyKSAKKwl7CisJCW1lbWNweSh0cmgtPmRhZGRyLGRhZGRyLGRldi0+YWRkcl9sZW4pOworCQl0cl9zb3VyY2Vfcm91dGUoc2tiLHRyaCxkZXYpOworCQlyZXR1cm4oaGRyX2xlbik7CisJfQorCisJcmV0dXJuIC1oZHJfbGVuOworfQorCQorLyoKKyAqCUEgbmVpZ2hib3VyIGRpc2NvdmVyeSBvZiBzb21lIHNwZWNpZXMgKGVnIGFycCkgaGFzIGNvbXBsZXRlZC4gV2UKKyAqCWNhbiBub3cgc2VuZCB0aGUgcGFja2V0LgorICovCisgCitzdGF0aWMgaW50IHRyX3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpIAoreworCXN0cnVjdCB0cmhfaGRyICp0cmg9KHN0cnVjdCB0cmhfaGRyICopc2tiLT5kYXRhOworCXN0cnVjdCB0cmxsYyAqdHJsbGM9KHN0cnVjdCB0cmxsYyAqKShza2ItPmRhdGErc2l6ZW9mKHN0cnVjdCB0cmhfaGRyKSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OworCisJLyoKKwkgKglGSVhNRTogV2UgZG9uJ3QgeWV0IHN1cHBvcnQgSVB2NiBvdmVyIHRva2VuIHJpbmdzCisJICovCisJIAorCWlmKHRybGxjLT5ldGhlcnR5cGUgIT0gaHRvbnMoRVRIX1BfSVApKSB7CisJCXByaW50aygidHJfcmVidWlsZF9oZWFkZXI6IERvbid0IGtub3cgaG93IHRvIHJlc29sdmUgdHlwZSAlMDRYIGFkZHJlc3NlcyA/XG4iLCh1bnNpZ25lZCBpbnQpaHRvbnModHJsbGMtPmV0aGVydHlwZSkpOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZmRlZiBDT05GSUdfSU5FVAorCWlmKGFycF9maW5kKHRyaC0+ZGFkZHIsIHNrYikpIHsKKwkJCXJldHVybiAxOworCX0KKwllbHNlIAorI2VuZGlmCQorCXsJCisJCXRyX3NvdXJjZV9yb3V0ZShza2IsdHJoLGRldik7IAorCQlyZXR1cm4gMDsKKwl9Cit9CisJCisvKgorICoJU29tZSBvZiB0aGlzIGlzIGEgYml0IGhhY2tpc2guIFdlIGludGVyY2VwdCBSSUYgaW5mb3JtYXRpb24KKyAqCXVzZWQgZm9yIHNvdXJjZSByb3V0aW5nLiBXZSBhbHNvIGdyYWIgSVAgZGlyZWN0bHkgYW5kIGRvbid0IGZlZWQKKyAqCWl0IHZpYSBTTkFQLgorICovCisgCit1bnNpZ25lZCBzaG9ydCB0cl90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIAoreworCisJc3RydWN0IHRyaF9oZHIgKnRyaD0oc3RydWN0IHRyaF9oZHIgKilza2ItPmRhdGE7CisJc3RydWN0IHRybGxjICp0cmxsYzsKKwl1bnNpZ25lZCByaWZsZW49MDsKKwkKKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCisgICAgICAgCWlmKHRyaC0+c2FkZHJbMF0gJiBUUl9SSUkpCisJCXJpZmxlbiA9IChudG9ocyh0cmgtPnJjZikgJiBUUl9SQ0ZfTEVOX01BU0spID4+IDg7CisKKwl0cmxsYyA9IChzdHJ1Y3QgdHJsbGMgKikoc2tiLT5kYXRhK3NpemVvZihzdHJ1Y3QgdHJoX2hkciktVFJfTUFYUklGTEVOK3JpZmxlbik7CisKKwlza2JfcHVsbChza2Isc2l6ZW9mKHN0cnVjdCB0cmhfaGRyKS1UUl9NQVhSSUZMRU4rcmlmbGVuKTsKKworCWlmKCp0cmgtPmRhZGRyICYgMHg4MCkgCisJeworCQlpZighbWVtY21wKHRyaC0+ZGFkZHIsZGV2LT5icm9hZGNhc3QsVFJfQUxFTikpIAkKKwkJCXNrYi0+cGt0X3R5cGU9UEFDS0VUX0JST0FEQ0FTVDsKKwkJZWxzZQorCQkJc2tiLT5wa3RfdHlwZT1QQUNLRVRfTVVMVElDQVNUOworCX0KKwllbHNlIGlmICggKHRyaC0+ZGFkZHJbMF0gJiAweDAxKSAmJiAodHJoLT5kYWRkclsxXSAmIDB4MDApICYmICh0cmgtPmRhZGRyWzJdICYgMHg1RSkpCisJeworCQlza2ItPnBrdF90eXBlPVBBQ0tFVF9NVUxUSUNBU1Q7CisJfQorCWVsc2UgaWYoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSAKKwl7CisJCWlmKG1lbWNtcCh0cmgtPmRhZGRyLCBkZXYtPmRldl9hZGRyLCBUUl9BTEVOKSkKKwkJCXNrYi0+cGt0X3R5cGU9UEFDS0VUX09USEVSSE9TVDsKKwl9CisKKwlpZiAoKHNrYi0+cGt0X3R5cGUgIT0gUEFDS0VUX0JST0FEQ0FTVCkgJiYKKwkgICAgKHNrYi0+cGt0X3R5cGUgIT0gUEFDS0VUX01VTFRJQ0FTVCkpCisJCXRyX2FkZF9yaWZfaW5mbyh0cmgsZGV2KSA7IAorCisJLyoKKwkgKiBTdHJpcCB0aGUgU05BUCBoZWFkZXIgZnJvbSBBUlAgcGFja2V0cyBzaW5jZSB3ZSBkb24ndCAKKwkgKiBwYXNzIHRoZW0gdGhyb3VnaCB0byB0aGUgODAyLjIvU05BUCBsYXllcnMuCisJICovCisKKwlpZiAodHJsbGMtPmRzYXAgPT0gRVhURU5ERURfU0FQICYmCisJICAgICh0cmxsYy0+ZXRoZXJ0eXBlID09IG50b2hzKEVUSF9QX0lQKSB8fAorCSAgICAgdHJsbGMtPmV0aGVydHlwZSA9PSBudG9ocyhFVEhfUF9JUFY2KSB8fAorCSAgICAgdHJsbGMtPmV0aGVydHlwZSA9PSBudG9ocyhFVEhfUF9BUlApKSkKKwl7CisJCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCB0cmxsYykpOworCQlyZXR1cm4gdHJsbGMtPmV0aGVydHlwZTsKKwl9CisKKwlyZXR1cm4gbnRvaHMoRVRIX1BfODAyXzIpOworfQorCisvKgorICoJV2UgdHJ5IHRvIGRvIHNvdXJjZSByb3V0aW5nLi4uIAorICovCisKK3ZvaWQgdHJfc291cmNlX3JvdXRlKHN0cnVjdCBza19idWZmICpza2Isc3RydWN0IHRyaF9oZHIgKnRyaCxzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlpbnQgc2xhY2s7CisJdW5zaWduZWQgaW50IGhhc2g7CisJc3RydWN0IHJpZl9jYWNoZV9zICplbnRyeTsKKwl1bnNpZ25lZCBjaGFyICpvbGRkYXRhOworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1jYXN0X2Z1bmNfYWRkcltdIAorCQk9IHsweEMwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMH07CisJCisJc3Bpbl9sb2NrX2JoKCZyaWZfbG9jayk7CisKKwkvKgorCSAqCUJyb2FkY2FzdHMgYXJlIHNpbmdsZSByb3V0ZSBhcyBzdGF0ZWQgaW4gUkZDIDEwNDIgCisJICovCisJaWYoICghbWVtY21wKCYodHJoLT5kYWRkclswXSksJihkZXYtPmJyb2FkY2FzdFswXSksVFJfQUxFTikpIHx8CisJICAgICghbWVtY21wKCYodHJoLT5kYWRkclswXSksJihtY2FzdF9mdW5jX2FkZHJbMF0pLCBUUl9BTEVOKSkgICkKKwl7CisJCXRyaC0+cmNmPWh0b25zKCgoKHNpemVvZih0cmgtPnJjZikpIDw8IDgpICYgVFJfUkNGX0xFTl9NQVNLKSAgCisJCQkgICAgICAgfCBUUl9SQ0ZfRlJBTUUySyB8IFRSX1JDRl9MSU1JVEVEX0JST0FEQ0FTVCk7CisJCXRyaC0+c2FkZHJbMF18PVRSX1JJSTsKKwl9CisJZWxzZSAKKwl7CisJCWhhc2ggPSByaWZfaGFzaCh0cmgtPmRhZGRyKTsKKwkJLyoKKwkJICoJV2FsayB0aGUgaGFzaCB0YWJsZSBhbmQgbG9vayBmb3IgYW4gZW50cnkKKwkJICovCisJCWZvcihlbnRyeT1yaWZfdGFibGVbaGFzaF07ZW50cnkgJiYgbWVtY21wKCYoZW50cnktPmFkZHJbMF0pLCYodHJoLT5kYWRkclswXSksVFJfQUxFTik7ZW50cnk9ZW50cnktPm5leHQpOworCisJCS8qCisJCSAqCUlmIHdlIGZvdW5kIGFuIGVudHJ5IHdlIGNhbiByb3V0ZSB0aGUgZnJhbWUuCisJCSAqLworCQlpZihlbnRyeSkgCisJCXsKKyNpZiBUUl9TUl9ERUJVRworcHJpbnRrKCJzb3VyY2Ugcm91dGluZyBmb3IgJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsdHJoLT5kYWRkclswXSwKKwkJICB0cmgtPmRhZGRyWzFdLHRyaC0+ZGFkZHJbMl0sdHJoLT5kYWRkclszXSx0cmgtPmRhZGRyWzRdLHRyaC0+ZGFkZHJbNV0pOworI2VuZGlmCisJCQlpZighZW50cnktPmxvY2FsX3JpbmcgJiYgKG50b2hzKGVudHJ5LT5yY2YpICYgVFJfUkNGX0xFTl9NQVNLKSA+PiA4KQorCQkJeworCQkJCXRyaC0+cmNmPWVudHJ5LT5yY2Y7CisJCQkJbWVtY3B5KCZ0cmgtPnJzZWdbMF0sJmVudHJ5LT5yc2VnWzBdLDgqc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CisJCQkJdHJoLT5yY2ZePWh0b25zKFRSX1JDRl9ESVJfQklUKTsJCisJCQkJdHJoLT5yY2YmPWh0b25zKDB4MWZmZik7CS8qIElzc2FtIENoZWhhYiA8aWNoZWhhYkBtYWRnZTEuZGVtb24uY28udWs+ICovCisKKwkJCQl0cmgtPnNhZGRyWzBdfD1UUl9SSUk7CisjaWYgVFJfU1JfREVCVUcKKwkJCQlwcmludGsoImVudHJ5IGZvdW5kIHdpdGggcmNmICUwNHhcbiIsIGVudHJ5LT5yY2YpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXByaW50aygiZW50cnkgZm91bmQgYnV0IHdpdGhvdXQgcmNmIGxlbmd0aCwgbG9jYWw9JTAyeFxuIiwgZW50cnktPmxvY2FsX3JpbmcpOworI2VuZGlmCisJCQl9CisJCQllbnRyeS0+bGFzdF91c2VkPWppZmZpZXM7CisJCX0KKwkJZWxzZSAKKwkJeworCQkJLyoKKwkJCSAqCVdpdGhvdXQgdGhlIGluZm9ybWF0aW9uIHdlIHNpbXBseSBoYXZlIHRvIHNob3V0CisJCQkgKglvbiB0aGUgd2lyZS4gVGhlIHJlcGxpZXMgc2hvdWxkIHJhcGlkbHkgY2xlYW4gdGhpcworCQkJICoJc2l0dWF0aW9uIHVwLgorCQkJICovCisJCQl0cmgtPnJjZj1odG9ucygoKChzaXplb2YodHJoLT5yY2YpKSA8PCA4KSAmIFRSX1JDRl9MRU5fTUFTSykgIAorCQkJCSAgICAgICB8IFRSX1JDRl9GUkFNRTJLIHwgVFJfUkNGX0xJTUlURURfQlJPQURDQVNUKTsKKwkJCXRyaC0+c2FkZHJbMF18PVRSX1JJSTsKKyNpZiBUUl9TUl9ERUJVRworCQkJcHJpbnRrKCJubyBlbnRyeSBpbiByaWYgdGFibGUgZm91bmQgLSBicm9hZGNhc3RpbmcgZnJhbWVcbiIpOworI2VuZGlmCisJCX0KKwl9CisKKwkvKiBDb21wcmVzcyB0aGUgUklGIGhlcmUgc28gd2UgZG9uJ3QgaGF2ZSB0byBkbyBpdCBpbiB0aGUgZHJpdmVyKHMpICovCisJaWYgKCEodHJoLT5zYWRkclswXSAmIDB4ODApKQorCQlzbGFjayA9IDE4OworCWVsc2UgCisJCXNsYWNrID0gMTggLSAoKG50b2hzKHRyaC0+cmNmKSAmIFRSX1JDRl9MRU5fTUFTSyk+PjgpOworCW9sZGRhdGEgPSBza2ItPmRhdGE7CisJc3Bpbl91bmxvY2tfYmgoJnJpZl9sb2NrKTsKKworCXNrYl9wdWxsKHNrYiwgc2xhY2spOworCW1lbW1vdmUoc2tiLT5kYXRhLCBvbGRkYXRhLCBzaXplb2Yoc3RydWN0IHRyaF9oZHIpIC0gc2xhY2spOworfQorCisvKgorICoJV2UgaGF2ZSBsZWFybmVkIHNvbWUgbmV3IFJJRiBpbmZvcm1hdGlvbiBmb3Igb3VyIHNvdXJjZQorICoJcm91dGluZy4KKyAqLworIAorc3RhdGljIHZvaWQgdHJfYWRkX3JpZl9pbmZvKHN0cnVjdCB0cmhfaGRyICp0cmgsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgaW50IGhhc2gsIHJpaV9wID0gMDsKKwlzdHJ1Y3QgcmlmX2NhY2hlX3MgKmVudHJ5OworCisKKwlzcGluX2xvY2tfYmgoJnJpZl9sb2NrKTsKKwkKKwkvKgorCSAqCUZpcnN0bHkgc2VlIGlmIHRoZSBlbnRyeSBleGlzdHMKKwkgKi8KKworICAgICAgIAlpZih0cmgtPnNhZGRyWzBdICYgVFJfUklJKQorCXsKKwkJdHJoLT5zYWRkclswXSY9MHg3ZjsKKwkJaWYgKCgobnRvaHModHJoLT5yY2YpICYgVFJfUkNGX0xFTl9NQVNLKSA+PiA4KSA+IDIpCisJCXsKKwkJCXJpaV9wID0gMTsKKwkgICAgICAgIH0KKwl9CisKKwloYXNoID0gcmlmX2hhc2godHJoLT5zYWRkcik7CisJZm9yKGVudHJ5PXJpZl90YWJsZVtoYXNoXTtlbnRyeSAmJiBtZW1jbXAoJihlbnRyeS0+YWRkclswXSksJih0cmgtPnNhZGRyWzBdKSxUUl9BTEVOKTtlbnRyeT1lbnRyeS0+bmV4dCk7CisKKwlpZihlbnRyeT09TlVMTCkgCisJeworI2lmIFRSX1NSX0RFQlVHCitwcmludGsoImFkZGluZyByaWZfZW50cnk6IGFkZHI6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlggcmNmOiUwNFhcbiIsCisJCXRyaC0+c2FkZHJbMF0sdHJoLT5zYWRkclsxXSx0cmgtPnNhZGRyWzJdLAorICAgICAgIAkJdHJoLT5zYWRkclszXSx0cmgtPnNhZGRyWzRdLHRyaC0+c2FkZHJbNV0sCisJCW50b2hzKHRyaC0+cmNmKSk7CisjZW5kaWYKKwkJLyoKKwkJICoJQWxsb2NhdGUgb3VyIG5ldyBlbnRyeS4gQSBmYWlsdXJlIHRvIGFsbG9jYXRlIGxvc2VzCisJCSAqCXVzZSB0aGUgaW5mb3JtYXRpb24uIFRoaXMgaXMgaGFybWxlc3MuCisJCSAqCisJCSAqCUZJWE1FOiBXZSBvdWdodCB0byBrZWVwIHNvbWUga2luZCBvZiBjYWNoZSBzaXplCisJCSAqCWxpbWl0aW5nIGFuZCBhZGp1c3QgdGhlIHRpbWVycyB0byBzdWl0LgorCQkgKi8KKwkJZW50cnk9a21hbGxvYyhzaXplb2Yoc3RydWN0IHJpZl9jYWNoZV9zKSxHRlBfQVRPTUlDKTsKKworCQlpZighZW50cnkpIAorCQl7CisJCQlwcmludGsoS0VSTl9ERUJVRyAidHIuYzogQ291bGRuJ3QgbWFsbG9jIHJpZiBjYWNoZSBlbnRyeSAhXG4iKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZyaWZfbG9jayk7CisJCQlyZXR1cm47CisJCX0KKworCQltZW1jcHkoJihlbnRyeS0+YWRkclswXSksJih0cmgtPnNhZGRyWzBdKSxUUl9BTEVOKTsKKwkJZW50cnktPmlmYWNlID0gZGV2LT5pZmluZGV4OworCQllbnRyeS0+bmV4dD1yaWZfdGFibGVbaGFzaF07CisJCWVudHJ5LT5sYXN0X3VzZWQ9amlmZmllczsKKwkJcmlmX3RhYmxlW2hhc2hdPWVudHJ5OworCisJCWlmIChyaWlfcCkKKwkJeworCQkJZW50cnktPnJjZiA9IHRyaC0+cmNmICYgaHRvbnMoKHVuc2lnbmVkIHNob3J0KX5UUl9SQ0ZfQlJPQURDQVNUX01BU0spOworCQkJbWVtY3B5KCYoZW50cnktPnJzZWdbMF0pLCYodHJoLT5yc2VnWzBdKSw4KnNpemVvZih1bnNpZ25lZCBzaG9ydCkpOworCQkJZW50cnktPmxvY2FsX3JpbmcgPSAwOworCQkJdHJoLT5zYWRkclswXXw9VFJfUklJOyAvKiBwdXQgdGhlIHJvdXRpbmcgaW5kaWNhdG9yIGJhY2sgZm9yIHRjcGR1bXAgKi8KKwkJfQorCQllbHNlCisJCXsKKwkJCWVudHJ5LT5sb2NhbF9yaW5nID0gMTsKKwkJfQorCX0gCQorCWVsc2UJLyogWS4gVGFoYXJhIGFkZGVkICovCisJeyAKKwkJLyoKKwkJICoJVXBkYXRlIGV4aXN0aW5nIGVudHJpZXMKKwkJICovCisJCWlmICghZW50cnktPmxvY2FsX3JpbmcpIAorCQkgICAgaWYgKGVudHJ5LT5yY2YgIT0gKHRyaC0+cmNmICYgaHRvbnMoKHVuc2lnbmVkIHNob3J0KX5UUl9SQ0ZfQlJPQURDQVNUX01BU0spKSAmJgorCQkJICEodHJoLT5yY2YgJiBodG9ucyhUUl9SQ0ZfQlJPQURDQVNUX01BU0spKSkKKwkJICAgIHsKKyNpZiBUUl9TUl9ERUJVRworcHJpbnRrKCJ1cGRhdGluZyByaWZfZW50cnk6IGFkZHI6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlggcmNmOiUwNFhcbiIsCisJCXRyaC0+c2FkZHJbMF0sdHJoLT5zYWRkclsxXSx0cmgtPnNhZGRyWzJdLAorCQl0cmgtPnNhZGRyWzNdLHRyaC0+c2FkZHJbNF0sdHJoLT5zYWRkcls1XSwKKwkJbnRvaHModHJoLT5yY2YpKTsKKyNlbmRpZgorCQkJICAgIGVudHJ5LT5yY2YgPSB0cmgtPnJjZiAmIGh0b25zKCh1bnNpZ25lZCBzaG9ydCl+VFJfUkNGX0JST0FEQ0FTVF9NQVNLKTsKKyAgICAgICAgCQkgICAgbWVtY3B5KCYoZW50cnktPnJzZWdbMF0pLCYodHJoLT5yc2VnWzBdKSw4KnNpemVvZih1bnNpZ25lZCBzaG9ydCkpOworCQkgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgIAllbnRyeS0+bGFzdF91c2VkPWppZmZpZXM7ICAgICAgICAgICAgICAgCisJfQorCXNwaW5fdW5sb2NrX2JoKCZyaWZfbG9jayk7Cit9CisKKy8qCisgKglTY2FuIHRoZSBjYWNoZSB3aXRoIGEgdGltZXIgYW5kIHNlZSB3aGF0IHdlIG5lZWQgdG8gdGhyb3cgb3V0LgorICovCisKK3N0YXRpYyB2b2lkIHJpZl9jaGVja19leHBpcmUodW5zaWduZWQgbG9uZyBkdW1teSkgCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBuZXh0X2ludGVydmFsID0gamlmZmllcyArIHN5c2N0bF90cl9yaWZfdGltZW91dC8yOworCisJc3Bpbl9sb2NrX2JoKCZyaWZfbG9jayk7CisJCisJZm9yKGkgPTA7IGkgPCBSSUZfVEFCTEVfU0laRTsgaSsrKSB7CisJCXN0cnVjdCByaWZfY2FjaGVfcyAqZW50cnksICoqcGVudHJ5OworCQkKKwkJcGVudHJ5ID0gcmlmX3RhYmxlK2k7CisJCXdoaWxlKChlbnRyeT0qcGVudHJ5KSAhPSBOVUxMKSB7CisJCQl1bnNpZ25lZCBsb25nIGV4cGlyZXMKKwkJCQk9IGVudHJ5LT5sYXN0X3VzZWQgKyBzeXNjdGxfdHJfcmlmX3RpbWVvdXQ7CisKKwkJCWlmICh0aW1lX2JlZm9yZV9lcShleHBpcmVzLCBqaWZmaWVzKSkgeworCQkJCSpwZW50cnkgPSBlbnRyeS0+bmV4dDsKKwkJCQlrZnJlZShlbnRyeSk7CisJCQl9IGVsc2UgeworCQkJCXBlbnRyeSA9ICZlbnRyeS0+bmV4dDsKKworCQkJCWlmICh0aW1lX2JlZm9yZShleHBpcmVzLCBuZXh0X2ludGVydmFsKSkKKwkJCQkJbmV4dF9pbnRlcnZhbCA9IGV4cGlyZXM7CisJCQl9CisJCX0KKwl9CisJCisJc3Bpbl91bmxvY2tfYmgoJnJpZl9sb2NrKTsKKworCW1vZF90aW1lcigmcmlmX3RpbWVyLCBuZXh0X2ludGVydmFsKTsKKworfQorCisvKgorICoJR2VuZXJhdGUgdGhlIC9wcm9jL25ldCBpbmZvcm1hdGlvbiBmb3IgdGhlIHRva2VuIHJpbmcgUklGCisgKglyb3V0aW5nLgorICovCisgCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworc3RhdGljIHN0cnVjdCByaWZfY2FjaGVfcyAqcmlmX2dldF9pZHgobG9mZl90IHBvcykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcmlmX2NhY2hlX3MgKmVudHJ5OworCWxvZmZfdCBvZmYgPSAwOworCisJZm9yKGkgPSAwOyBpIDwgUklGX1RBQkxFX1NJWkU7IGkrKykgCisJCWZvcihlbnRyeSA9IHJpZl90YWJsZVtpXTsgZW50cnk7IGVudHJ5ID0gZW50cnktPm5leHQpIHsKKwkJCWlmIChvZmYgPT0gcG9zKQorCQkJCXJldHVybiBlbnRyeTsKKwkJCSsrb2ZmOworCQl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKnJpZl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXNwaW5fbG9ja19iaCgmcmlmX2xvY2spOworCisJcmV0dXJuICpwb3MgPyByaWZfZ2V0X2lkeCgqcG9zIC0gMSkgOiBTRVFfU1RBUlRfVE9LRU47Cit9CisKK3N0YXRpYyB2b2lkICpyaWZfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCWludCBpOworCXN0cnVjdCByaWZfY2FjaGVfcyAqZW50ID0gdjsKKworCSsrKnBvczsKKworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlpID0gLTE7CisJCWdvdG8gc2NhbjsKKwl9CisKKwlpZiAoZW50LT5uZXh0KSAKKwkJcmV0dXJuIGVudC0+bmV4dDsKKworCWkgPSByaWZfaGFzaChlbnQtPmFkZHIpOworIHNjYW46CisJd2hpbGUgKCsraSA8IFJJRl9UQUJMRV9TSVpFKSB7CisJCWlmICgoZW50ID0gcmlmX3RhYmxlW2ldKSAhPSBOVUxMKQorCQkJcmV0dXJuIGVudDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHJpZl9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzcGluX3VubG9ja19iaCgmcmlmX2xvY2spOworfQorCitzdGF0aWMgaW50IHJpZl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpbnQgaiwgcmNmX2xlbiwgc2VnbWVudCwgYnJkZ25tYjsKKwlzdHJ1Y3QgcmlmX2NhY2hlX3MgKmVudHJ5ID0gdjsKKworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKKwkJc2VxX3B1dHMoc2VxLAorCQkgICAgICJpZiAgICAgVFIgYWRkcmVzcyAgICAgICBUVEwgICByY2YgICByb3V0aW5nIHNlZ21lbnRzXG4iKTsKKwllbHNlIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9nZXRfYnlfaW5kZXgoZW50cnktPmlmYWNlKTsKKwkJbG9uZyB0dGwgPSAobG9uZykgKGVudHJ5LT5sYXN0X3VzZWQgKyBzeXNjdGxfdHJfcmlmX3RpbWVvdXQpCisJCQkJLSAobG9uZykgamlmZmllczsKKworCQlzZXFfcHJpbnRmKHNlcSwgIiVzICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYICU3bGkgIiwKKwkJCSAgIGRldj9kZXYtPm5hbWU6Ij8iLAorCQkJICAgZW50cnktPmFkZHJbMF0sZW50cnktPmFkZHJbMV0sZW50cnktPmFkZHJbMl0sCisJCQkgICBlbnRyeS0+YWRkclszXSxlbnRyeS0+YWRkcls0XSxlbnRyeS0+YWRkcls1XSwKKwkJCSAgIHR0bC9IWik7CisKKwkJCWlmIChlbnRyeS0+bG9jYWxfcmluZykKKwkJCSAgICAgICAgc2VxX3B1dHMoc2VxLCAibG9jYWxcbiIpOworCQkJZWxzZSB7CisKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiUwNFgiLCBudG9ocyhlbnRyeS0+cmNmKSk7CisJCQkJcmNmX2xlbiA9ICgobnRvaHMoZW50cnktPnJjZikgJiBUUl9SQ0ZfTEVOX01BU0spPj44KS0yOyAKKwkJCQlpZiAocmNmX2xlbikKKwkJCQkgICAgICAgIHJjZl9sZW4gPj49IDE7CisJCQkJZm9yKGogPSAxOyBqIDwgcmNmX2xlbjsgaisrKSB7CisJCQkJCWlmKGo9PTEpIHsKKwkJCQkJCXNlZ21lbnQ9bnRvaHMoZW50cnktPnJzZWdbai0xXSk+PjQ7CisJCQkJCQlzZXFfcHJpbnRmKHNlcSwiICAlMDNYIixzZWdtZW50KTsKKwkJCQkJfTsKKwkJCQkJc2VnbWVudD1udG9ocyhlbnRyeS0+cnNlZ1tqXSk+PjQ7CisJCQkJCWJyZGdubWI9bnRvaHMoZW50cnktPnJzZWdbai0xXSkmMHgwMGY7CisJCQkJCXNlcV9wcmludGYoc2VxLCItJTAxWC0lMDNYIixicmRnbm1iLHNlZ21lbnQpOworCQkJCX0KKwkJCQlzZXFfcHV0YyhzZXEsICdcbicpOworCQkJfQorCSAgIAl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyByaWZfc2VxX29wcyA9IHsKKwkuc3RhcnQgPSByaWZfc2VxX3N0YXJ0LAorCS5uZXh0ICA9IHJpZl9zZXFfbmV4dCwKKwkuc3RvcCAgPSByaWZfc2VxX3N0b3AsCisJLnNob3cgID0gcmlmX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCByaWZfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZyaWZfc2VxX29wcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJpZl9zZXFfZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgPSByaWZfc2VxX29wZW4sCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHRyX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyoKKwkgKglDb25maWd1cmUgYW5kIHJlZ2lzdGVyCisJICovCisJCisJZGV2LT5oYXJkX2hlYWRlcgk9IHRyX2hlYWRlcjsKKwlkZXYtPnJlYnVpbGRfaGVhZGVyCT0gdHJfcmVidWlsZF9oZWFkZXI7CisKKwlkZXYtPnR5cGUJCT0gQVJQSFJEX0lFRUU4MDJfVFI7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4JPSBUUl9ITEVOOworCWRldi0+bXR1CQk9IDIwMDA7CisJZGV2LT5hZGRyX2xlbgkJPSBUUl9BTEVOOworCWRldi0+dHhfcXVldWVfbGVuCT0gMTAwOwkvKiBMb25nIHF1ZXVlcyBvbiB0ciAqLworCQorCW1lbXNldChkZXYtPmJyb2FkY2FzdCwweEZGLCBUUl9BTEVOKTsKKworCS8qIE5ldy1zdHlsZSBmbGFncy4gKi8KKwlkZXYtPmZsYWdzCQk9IElGRl9CUk9BRENBU1QgfCBJRkZfTVVMVElDQVNUIDsKK30KKworLyoqCisgKiBhbGxvY190cmRldiAtIFJlZ2lzdGVyIHRva2VuIHJpbmcgZGV2aWNlCisgKiBAc2l6ZW9mX3ByaXY6IFNpemUgb2YgYWRkaXRpb25hbCBkcml2ZXItcHJpdmF0ZSBzdHJ1Y3R1cmUgdG8gYmUgYWxsb2NhdGVkCisgKglmb3IgdGhpcyB0b2tlbiByaW5nIGRldmljZQorICoKKyAqIEZpbGwgaW4gdGhlIGZpZWxkcyBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSB3aXRoIHRva2VuIHJpbmctZ2VuZXJpYyB2YWx1ZXMuCisgKgorICogQ29uc3RydWN0cyBhIG5ldyBuZXQgZGV2aWNlLCBjb21wbGV0ZSB3aXRoIGEgcHJpdmF0ZSBkYXRhIGFyZWEgb2YKKyAqIHNpemUgQHNpemVvZl9wcml2LiAgQSAzMi1ieXRlIChub3QgYml0KSBhbGlnbm1lbnQgaXMgZW5mb3JjZWQgZm9yCisgKiB0aGlzIHByaXZhdGUgZGF0YSBhcmVhLgorICovCitzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfdHJkZXYoaW50IHNpemVvZl9wcml2KQoreworCXJldHVybiBhbGxvY19uZXRkZXYoc2l6ZW9mX3ByaXYsICJ0ciVkIiwgdHJfc2V0dXApOworfQorCisvKgorICoJQ2FsbGVkIGR1cmluZyBib290dXAuICBXZSBkb24ndCBhY3R1YWxseSBoYXZlIHRvIGluaXRpYWxpc2UKKyAqCXRvbyBtdWNoIGZvciB0aGlzLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IHJpZl9pbml0KHZvaWQpCit7CisJaW5pdF90aW1lcigmcmlmX3RpbWVyKTsKKwlyaWZfdGltZXIuZXhwaXJlcyAgPSBzeXNjdGxfdHJfcmlmX3RpbWVvdXQ7CisJcmlmX3RpbWVyLmRhdGEgICAgID0gMEw7CisJcmlmX3RpbWVyLmZ1bmN0aW9uID0gcmlmX2NoZWNrX2V4cGlyZTsKKwlhZGRfdGltZXIoJnJpZl90aW1lcik7CisKKwlwcm9jX25ldF9mb3BzX2NyZWF0ZSgidHJfcmlmIiwgU19JUlVHTywgJnJpZl9zZXFfZm9wcyk7CisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KHJpZl9pbml0KTsKKworRVhQT1JUX1NZTUJPTCh0cl9zb3VyY2Vfcm91dGUpOworRVhQT1JUX1NZTUJPTCh0cl90eXBlX3RyYW5zKTsKK0VYUE9SVF9TWU1CT0woYWxsb2NfdHJkZXYpOwpkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL01ha2VmaWxlIGIvbmV0LzgwMjFxL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZmViNDQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvODAyMXEvTWFrZWZpbGUKQEAgLTAsMCArMSwxMiBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IFZMQU4gbGF5ZXIuCisjCisKK29iai0kKENPTkZJR19WTEFOXzgwMjFRKSArPSA4MDIxcS5vCisKKzgwMjFxLW9ianMgOj0gdmxhbi5vIHZsYW5fZGV2Lm8KKworaWZlcSAoJChDT05GSUdfUFJPQ19GUykseSkKKzgwMjFxLW9ianMgKz0gdmxhbnByb2MubworZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW4uYyBiL25ldC84MDIxcS92bGFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY2ZDMxNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC84MDIxcS92bGFuLmMKQEAgLTAsMCArMSw3NzQgQEAKKy8qCisgKiBJTkVUCQk4MDIuMVEgVkxBTgorICoJCUV0aGVybmV0LXR5cGUgZGV2aWNlIGhhbmRsaW5nLgorICoKKyAqIEF1dGhvcnM6CUJlbiBHcmVlYXIgPGdyZWVhcmJAY2FuZGVsYXRlY2guY29tPgorICogICAgICAgICAgICAgIFBsZWFzZSBzZW5kIHN1cHBvcnQgcmVsYXRlZCBlbWFpbCB0bzogdmxhbkBzY3J5LndhbmZlYXIuY29tCisgKiAgICAgICAgICAgICAgVkxBTiBIb21lIFBhZ2U6IGh0dHA6Ly93d3cuY2FuZGVsYXRlY2guY29tL35ncmVlYXIvdmxhbi5odG1sCisgKiAKKyAqIEZpeGVzOgorICogICAgICAgICAgICAgIEZpeCBmb3IgcGFja2V0IGNhcHR1cmUgLSBOaWNrIEVnZ2xlc3RvbiA8bmlja0BkY2NpbmMuY29tPjsKKyAqCQlBZGQgSFcgYWNjZWxlcmF0aW9uIGhvb2tzIC0gRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUByZWRoYXQuY29tPjsKKyAqCQlDb3JyZWN0IGFsbCB0aGUgbG9ja2luZyAtIERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AcmVkaGF0LmNvbT47CisgKgkJVXNlIGhhc2ggdGFibGUgZm9yIFZMQU4gZ3JvdXBzIC0gRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUByZWRoYXQuY29tPgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPiAvKiBmb3IgY29weV9mcm9tX3VzZXIgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvZGF0YWxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPG5ldC9wODAyMi5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorCisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgInZsYW4uaCIKKyNpbmNsdWRlICJ2bGFucHJvYy5oIgorCisjZGVmaW5lIERSVl9WRVJTSU9OICIxLjgiCisKKy8qIEdsb2JhbCBWTEFOIHZhcmlhYmxlcyAqLworCisvKiBPdXIgbGlzdGluZyBvZiBWTEFOIGdyb3VwKHMpICovCitzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgdmxhbl9ncm91cF9oYXNoW1ZMQU5fR1JQX0hBU0hfU0laRV07CisjZGVmaW5lIHZsYW5fZ3JwX2hhc2hmbihJRFgpCSgoKChJRFgpID4+IFZMQU5fR1JQX0hBU0hfU0hJRlQpIF4gKElEWCkpICYgVkxBTl9HUlBfSEFTSF9NQVNLKQorCitzdGF0aWMgY2hhciB2bGFuX2Z1bGxuYW1lW10gPSAiODAyLjFRIFZMQU4gU3VwcG9ydCI7CitzdGF0aWMgY2hhciB2bGFuX3ZlcnNpb25bXSA9IERSVl9WRVJTSU9OOworc3RhdGljIGNoYXIgdmxhbl9jb3B5cmlnaHRbXSA9ICJCZW4gR3JlZWFyIDxncmVlYXJiQGNhbmRlbGF0ZWNoLmNvbT4iOworc3RhdGljIGNoYXIgdmxhbl9idWdneXJpZ2h0W10gPSAiRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUByZWRoYXQuY29tPiI7CisKK3N0YXRpYyBpbnQgdmxhbl9kZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcsIHZvaWQgKik7CitzdGF0aWMgaW50IHZsYW5faW9jdGxfaGFuZGxlcih2b2lkIF9fdXNlciAqKTsKK3N0YXRpYyBpbnQgdW5yZWdpc3Rlcl92bGFuX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqLCB1bnNpZ25lZCBzaG9ydCApOworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHZsYW5fbm90aWZpZXJfYmxvY2sgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSB2bGFuX2RldmljZV9ldmVudCwKK307CisKKy8qIFRoZXNlIG1heSBiZSBjaGFuZ2VkIGF0IHJ1bi10aW1lIHRocm91Z2ggSU9DVExzICovCisKKy8qIERldGVybWluZXMgaW50ZXJmYWNlIG5hbWluZyBzY2hlbWUuICovCit1bnNpZ25lZCBzaG9ydCB2bGFuX25hbWVfdHlwZSA9IFZMQU5fTkFNRV9UWVBFX1JBV19QTFVTX1ZJRF9OT19QQUQ7CisKK3N0YXRpYyBzdHJ1Y3QgcGFja2V0X3R5cGUgdmxhbl9wYWNrZXRfdHlwZSA9IHsKKwkudHlwZSA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyMVEpLAorCS5mdW5jID0gdmxhbl9za2JfcmVjdiwgLyogVkxBTiByZWNlaXZlIG1ldGhvZCAqLworfTsKKworLyogQml0cyBvZiBuZXRkZXYgc3RhdGUgdGhhdCBhcmUgcHJvcGFnYXRlZCBmcm9tIHJlYWwgZGV2aWNlIHRvIHZpcnR1YWwgKi8KKyNkZWZpbmUgVkxBTl9MSU5LX1NUQVRFX01BU0sgXAorCSgoMTw8X19MSU5LX1NUQVRFX1BSRVNFTlQpfCgxPDxfX0xJTktfU1RBVEVfTk9DQVJSSUVSKSkKKworLyogRW5kIG9mIGdsb2JhbCB2YXJpYWJsZXMgZGVmaW5pdGlvbnMuICovCisKKy8qCisgKiBGdW5jdGlvbiB2bGFuX3Byb3RvX2luaXQgKHBybykKKyAqCisgKiAgICBJbml0aWFsaXplIFZMQU4gcHJvdG9jb2wgbGF5ZXIsIAorICoKKyAqLworc3RhdGljIGludCBfX2luaXQgdmxhbl9wcm90b19pbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCXByaW50ayhWTEFOX0lORiAiJXMgdiVzICVzXG4iLAorCSAgICAgICB2bGFuX2Z1bGxuYW1lLCB2bGFuX3ZlcnNpb24sIHZsYW5fY29weXJpZ2h0KTsKKwlwcmludGsoVkxBTl9JTkYgIkFsbCBidWdzIGFkZGVkIGJ5ICVzXG4iLAorCSAgICAgICB2bGFuX2J1Z2d5cmlnaHQpOworCisJLyogcHJvYyBmaWxlIHN5c3RlbSBpbml0aWFsaXphdGlvbiAqLworCWVyciA9IHZsYW5fcHJvY19pbml0KCk7CisJaWYgKGVyciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIAorCQkgICAgICAgIiVzICVzOiBjYW4ndCBjcmVhdGUgZW50cnkgaW4gcHJvYyBmaWxlc3lzdGVtIVxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgVkxBTl9OQU1FKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlkZXZfYWRkX3BhY2soJnZsYW5fcGFja2V0X3R5cGUpOworCisJLyogUmVnaXN0ZXIgdXMgdG8gcmVjZWl2ZSBuZXRkZXZpY2UgZXZlbnRzICovCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZ2bGFuX25vdGlmaWVyX2Jsb2NrKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfcmVtb3ZlX3BhY2soJnZsYW5fcGFja2V0X3R5cGUpOworCQl2bGFuX3Byb2NfY2xlYW51cCgpOworCQlyZXR1cm4gZXJyOworCX0KKworCXZsYW5faW9jdGxfc2V0KHZsYW5faW9jdGxfaGFuZGxlcik7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2xlYW51cCBhbGwgdmxhbiBkZXZpY2VzIAorICogTm90ZTogZGV2aWNlcyB0aGF0IGhhdmUgYmVlbiByZWdpc3RlcmVkIHRoYXQgYnV0IG5vdAorICogYnJvdWdodCB1cCB3aWxsIGV4aXN0IGJ1dCBoYXZlIG5vIG1vZHVsZSByZWYgY291bnQuCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCB2bGFuX2NsZWFudXBfZGV2aWNlcyh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsICpueHQ7CisKKwlydG5sX2xvY2soKTsKKwlmb3IgKGRldiA9IGRldl9iYXNlOyBkZXY7IGRldiA9IG54dCkgeworCQlueHQgPSBkZXYtPm5leHQ7CisJCWlmIChkZXYtPnByaXZfZmxhZ3MgJiBJRkZfODAyXzFRX1ZMQU4pIHsKKwkJCXVucmVnaXN0ZXJfdmxhbl9kZXYoVkxBTl9ERVZfSU5GTyhkZXYpLT5yZWFsX2RldiwKKwkJCQkJICAgIFZMQU5fREVWX0lORk8oZGV2KS0+dmxhbl9pZCk7CisKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKGRldik7CisJCX0KKwl9CisJcnRubF91bmxvY2soKTsKK30KKworLyoKKyAqICAgICBNb2R1bGUgJ3JlbW92ZScgZW50cnkgcG9pbnQuCisgKiAgICAgbyBkZWxldGUgL3Byb2MvbmV0L3JvdXRlciBkaXJlY3RvcnkgYW5kIHN0YXRpYyBlbnRyaWVzLgorICovIAorc3RhdGljIHZvaWQgX19leGl0IHZsYW5fY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgaTsKKworCXZsYW5faW9jdGxfc2V0KE5VTEwpOworCisJLyogVW4tcmVnaXN0ZXIgdXMgZnJvbSByZWNlaXZpbmcgbmV0ZGV2aWNlIGV2ZW50cyAqLworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZ2bGFuX25vdGlmaWVyX2Jsb2NrKTsKKworCWRldl9yZW1vdmVfcGFjaygmdmxhbl9wYWNrZXRfdHlwZSk7CisJdmxhbl9jbGVhbnVwX2RldmljZXMoKTsKKworCS8qIFRoaXMgdGFibGUgbXVzdCBiZSBlbXB0eSBpZiB0aGVyZSBhcmUgbm8gbW9kdWxlCisJICogcmVmZXJlbmNlcyBsZWZ0LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBWTEFOX0dSUF9IQVNIX1NJWkU7IGkrKykgeworCQlCVUdfT04oIWhsaXN0X2VtcHR5KCZ2bGFuX2dyb3VwX2hhc2hbaV0pKTsKKwl9CisJdmxhbl9wcm9jX2NsZWFudXAoKTsKKworCXN5bmNocm9uaXplX25ldCgpOworfQorCittb2R1bGVfaW5pdCh2bGFuX3Byb3RvX2luaXQpOworbW9kdWxlX2V4aXQodmxhbl9jbGVhbnVwX21vZHVsZSk7CisKKy8qIE11c3QgYmUgaW52b2tlZCB3aXRoIFJDVSByZWFkIGxvY2sgKG5vIHByZWVtcHQpICovCitzdGF0aWMgc3RydWN0IHZsYW5fZ3JvdXAgKl9fdmxhbl9maW5kX2dyb3VwKGludCByZWFsX2Rldl9pZmluZGV4KQoreworCXN0cnVjdCB2bGFuX2dyb3VwICpncnA7CisJc3RydWN0IGhsaXN0X25vZGUgKm47CisJaW50IGhhc2ggPSB2bGFuX2dycF9oYXNoZm4ocmVhbF9kZXZfaWZpbmRleCk7CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZ3JwLCBuLCAmdmxhbl9ncm91cF9oYXNoW2hhc2hdLCBobGlzdCkgeworCQlpZiAoZ3JwLT5yZWFsX2Rldl9pZmluZGV4ID09IHJlYWxfZGV2X2lmaW5kZXgpCisJCQlyZXR1cm4gZ3JwOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiAgRmluZCB0aGUgcHJvdG9jb2wgaGFuZGxlci4gIEFzc3VtZXMgVklEIDwgVkxBTl9WSURfTUFTSy4KKyAqCisgKiBNdXN0IGJlIGludm9rZWQgd2l0aCBSQ1UgcmVhZCBsb2NrIChubyBwcmVlbXB0KQorICovCitzdHJ1Y3QgbmV0X2RldmljZSAqX19maW5kX3ZsYW5fZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiwKKwkJCQkgICB1bnNpZ25lZCBzaG9ydCBWSUQpCit7CisJc3RydWN0IHZsYW5fZ3JvdXAgKmdycCA9IF9fdmxhbl9maW5kX2dyb3VwKHJlYWxfZGV2LT5pZmluZGV4KTsKKworCWlmIChncnApCisgICAgICAgICAgICAgICAgcmV0dXJuIGdycC0+dmxhbl9kZXZpY2VzW1ZJRF07CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgdmxhbl9yY3VfZnJlZShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKK3sKKwlrZnJlZShjb250YWluZXJfb2YocmN1LCBzdHJ1Y3Qgdmxhbl9ncm91cCwgcmN1KSk7Cit9CisKKworLyogVGhpcyByZXR1cm5zIDAgaWYgZXZlcnl0aGluZyB3ZW50IGZpbmUuCisgKiBJdCB3aWxsIHJldHVybiAxIGlmIHRoZSBncm91cCB3YXMga2lsbGVkIGFzIGEgcmVzdWx0LgorICogQSBuZWdhdGl2ZSByZXR1cm4gaW5kaWNhdGVzIGZhaWx1cmUuCisgKgorICogVGhlIFJUTkwgbG9jayBtdXN0IGJlIGhlbGQuCisgKi8KK3N0YXRpYyBpbnQgdW5yZWdpc3Rlcl92bGFuX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYsCisJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgdmxhbl9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlpbnQgcmVhbF9kZXZfaWZpbmRleCA9IHJlYWxfZGV2LT5pZmluZGV4OworCXN0cnVjdCB2bGFuX2dyb3VwICpncnA7CisJaW50IGksIHJldDsKKworI2lmZGVmIFZMQU5fREVCVUcKKwlwcmludGsoVkxBTl9EQkcgIiVzOiBWSUQ6ICVpXG4iLCBfX0ZVTkNUSU9OX18sIHZsYW5faWQpOworI2VuZGlmCisKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlpZiAodmxhbl9pZCA+PSBWTEFOX1ZJRF9NQVNLKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCUFTU0VSVF9SVE5MKCk7CisJZ3JwID0gX192bGFuX2ZpbmRfZ3JvdXAocmVhbF9kZXZfaWZpbmRleCk7CisKKwlyZXQgPSAwOworCisJaWYgKGdycCkgeworCQlkZXYgPSBncnAtPnZsYW5fZGV2aWNlc1t2bGFuX2lkXTsKKwkJaWYgKGRldikgeworCQkJLyogUmVtb3ZlIHByb2MgZW50cnkgKi8KKwkJCXZsYW5fcHJvY19yZW1fZGV2KGRldik7CisKKwkJCS8qIFRha2UgaXQgb3V0IG9mIG91ciBvd24gc3RydWN0dXJlcywgYnV0IGJlIHN1cmUgdG8KKwkJCSAqIGludGVybG9jayB3aXRoIEhXIGFjY2VsZXJhdGluZyBkZXZpY2VzIG9yIFNXIHZsYW4KKwkJCSAqIGlucHV0IHBhY2tldCBwcm9jZXNzaW5nLgorCQkJICovCisJCQlpZiAocmVhbF9kZXYtPmZlYXR1cmVzICYKKwkJCSAgICAoTkVUSUZfRl9IV19WTEFOX1JYIHwgTkVUSUZfRl9IV19WTEFOX0ZJTFRFUikpIHsKKwkJCQlyZWFsX2Rldi0+dmxhbl9yeF9raWxsX3ZpZChyZWFsX2Rldiwgdmxhbl9pZCk7CisJCQl9CisKKwkJCWdycC0+dmxhbl9kZXZpY2VzW3ZsYW5faWRdID0gTlVMTDsKKwkJCXN5bmNocm9uaXplX25ldCgpOworCisKKwkJCS8qIENhbGxlciB1bnJlZ2lzdGVycyAoYW5kIGlmIG5lY2Vzc2FyeSwgcHV0cykKKwkJCSAqIFZMQU4gZGV2aWNlLCBidXQgd2UgZ2V0IHJpZCBvZiB0aGUgcmVmZXJlbmNlIHRvCisJCQkgKiByZWFsX2RldiBoZXJlLgorCQkJICovCisJCQlkZXZfcHV0KHJlYWxfZGV2KTsKKworCQkJLyogSWYgdGhlIGdyb3VwIGlzIG5vdyBlbXB0eSwga2lsbCBvZmYgdGhlCisJCQkgKiBncm91cC4KKwkJCSAqLworCQkJZm9yIChpID0gMDsgaSA8IFZMQU5fVklEX01BU0s7IGkrKykKKwkJCQlpZiAoZ3JwLT52bGFuX2RldmljZXNbaV0pCisJCQkJCWJyZWFrOworCisJCQlpZiAoaSA9PSBWTEFOX1ZJRF9NQVNLKSB7CisJCQkJaWYgKHJlYWxfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9SWCkKKwkJCQkJcmVhbF9kZXYtPnZsYW5fcnhfcmVnaXN0ZXIocmVhbF9kZXYsIE5VTEwpOworCisJCQkJaGxpc3RfZGVsX3JjdSgmZ3JwLT5obGlzdCk7CisKKwkJCQkvKiBGcmVlIHRoZSBncm91cCwgYWZ0ZXIgYWxsIGNwdSdzIGFyZSBkb25lLiAqLworCQkJCWNhbGxfcmN1KCZncnAtPnJjdSwgdmxhbl9yY3VfZnJlZSk7CisKKwkJCQlncnAgPSBOVUxMOworCQkJCXJldCA9IDE7CisJCQl9CisJCX0KKwl9CisKKyAgICAgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB1bnJlZ2lzdGVyX3ZsYW5fZGV2aWNlKGNvbnN0IGNoYXIgKnZsYW5fSUZfbmFtZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlpbnQgcmV0OworCisKKwlkZXYgPSBkZXZfZ2V0X2J5X25hbWUodmxhbl9JRl9uYW1lKTsKKwlyZXQgPSAtRUlOVkFMOworCWlmIChkZXYpIHsKKwkJaWYgKGRldi0+cHJpdl9mbGFncyAmIElGRl84MDJfMVFfVkxBTikgeworCQkJcnRubF9sb2NrKCk7CisKKwkJCXJldCA9IHVucmVnaXN0ZXJfdmxhbl9kZXYoVkxBTl9ERVZfSU5GTyhkZXYpLT5yZWFsX2RldiwKKwkJCQkJCSAgVkxBTl9ERVZfSU5GTyhkZXYpLT52bGFuX2lkKTsKKworCQkJZGV2X3B1dChkZXYpOworCQkJdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKKworCQkJcnRubF91bmxvY2soKTsKKworCQkJaWYgKHJldCA9PSAxKQorCQkJCXJldCA9IDA7CisJCX0gZWxzZSB7CisJCQlwcmludGsoVkxBTl9FUlIgCisJCQkgICAgICAgIiVzOiBFUlJPUjoJVHJpZWQgdG8gcmVtb3ZlIGEgbm9uLXZsYW4gZGV2aWNlICIKKwkJCSAgICAgICAid2l0aCBWTEFOIGNvZGUsIG5hbWU6ICVzICBwcml2X2ZsYWdzOiAlaFhcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLCBkZXYtPm5hbWUsIGRldi0+cHJpdl9mbGFncyk7CisJCQlkZXZfcHV0KGRldik7CisJCQlyZXQgPSAtRVBFUk07CisJCX0KKwl9IGVsc2UgeworI2lmZGVmIFZMQU5fREVCVUcKKwkJcHJpbnRrKFZMQU5fREJHICIlczogV0FSTklORzogQ291bGQgbm90IGZpbmQgZGV2LlxuIiwgX19GVU5DVElPTl9fKTsKKyNlbmRpZgorCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHZsYW5fc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKm5ld19kZXYpCit7CisJU0VUX01PRFVMRV9PV05FUihuZXdfZGV2KTsKKwkgICAgCisJLyogbmV3X2Rldi0+aWZpbmRleCA9IDA7ICBpdCB3aWxsIGJlIHNldCB3aGVuIGFkZGVkIHRvCisJICogdGhlIGdsb2JhbCBsaXN0LgorCSAqIGlmbGluayBpcyBzZXQgYXMgd2VsbC4KKwkgKi8KKwluZXdfZGV2LT5nZXRfc3RhdHMgPSB2bGFuX2Rldl9nZXRfc3RhdHM7CisKKwkvKiBNYWtlIHRoaXMgdGhpbmcga25vd24gYXMgYSBWTEFOIGRldmljZSAqLworCW5ld19kZXYtPnByaXZfZmxhZ3MgfD0gSUZGXzgwMl8xUV9WTEFOOworCQkJCQorCS8qIFNldCB1cyB1cCB0byBoYXZlIG5vIHF1ZXVlLCBhcyB0aGUgdW5kZXJseWluZyBIYXJkd2FyZSBkZXZpY2UKKwkgKiBjYW4gZG8gYWxsIHRoZSBxdWV1ZWluZyB3ZSBjb3VsZCB3YW50LgorCSAqLworCW5ld19kZXYtPnR4X3F1ZXVlX2xlbiA9IDA7CisKKwkvKiBzZXQgdXAgbWV0aG9kIGNhbGxzICovCisJbmV3X2Rldi0+Y2hhbmdlX210dSA9IHZsYW5fZGV2X2NoYW5nZV9tdHU7CisJbmV3X2Rldi0+b3BlbiA9IHZsYW5fZGV2X29wZW47CisJbmV3X2Rldi0+c3RvcCA9IHZsYW5fZGV2X3N0b3A7CisJbmV3X2Rldi0+c2V0X21hY19hZGRyZXNzID0gdmxhbl9kZXZfc2V0X21hY19hZGRyZXNzOworCW5ld19kZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHZsYW5fZGV2X3NldF9tdWx0aWNhc3RfbGlzdDsKKwluZXdfZGV2LT5kZXN0cnVjdG9yID0gZnJlZV9uZXRkZXY7CisJbmV3X2Rldi0+ZG9faW9jdGwgPSB2bGFuX2Rldl9pb2N0bDsKK30KKworLyogIEF0dGFjaCBhIFZMQU4gZGV2aWNlIHRvIGEgbWFjIGFkZHJlc3MgKGllIEV0aGVybmV0IENhcmQpLgorICogIFJldHVybnMgdGhlIGRldmljZSB0aGF0IHdhcyBjcmVhdGVkLCBvciBOVUxMIGlmIHRoZXJlIHdhcworICogIGFuIGVycm9yIG9mIHNvbWUga2luZC4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpyZWdpc3Rlcl92bGFuX2RldmljZShjb25zdCBjaGFyICpldGhfSUZfbmFtZSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIHNob3J0IFZMQU5fSUQpCit7CisJc3RydWN0IHZsYW5fZ3JvdXAgKmdycDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV3X2RldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXY7IC8qIHRoZSBldGhlcm5ldCBkZXZpY2UgKi8KKwljaGFyIG5hbWVbSUZOQU1TSVpdOworCisjaWZkZWYgVkxBTl9ERUJVRworCXByaW50ayhWTEFOX0RCRyAiJXM6IGlmX25hbWUgLTolczotCXZpZDogJWlcbiIsCisJCV9fRlVOQ1RJT05fXywgZXRoX0lGX25hbWUsIFZMQU5fSUQpOworI2VuZGlmCisKKwlpZiAoVkxBTl9JRCA+PSBWTEFOX1ZJRF9NQVNLKQorCQlnb3RvIG91dF9yZXRfbnVsbDsKKworCS8qIGZpbmQgdGhlIGRldmljZSByZWxhdGluZyB0byBldGhfSUZfbmFtZS4gKi8KKwlyZWFsX2RldiA9IGRldl9nZXRfYnlfbmFtZShldGhfSUZfbmFtZSk7CisJaWYgKCFyZWFsX2RldikKKwkJZ290byBvdXRfcmV0X251bGw7CisKKwlpZiAocmVhbF9kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9WTEFOX0NIQUxMRU5HRUQpIHsKKwkJcHJpbnRrKFZMQU5fREJHICIlczogVkxBTnMgbm90IHN1cHBvcnRlZCBvbiAlcy5cbiIsCisJCQlfX0ZVTkNUSU9OX18sIHJlYWxfZGV2LT5uYW1lKTsKKwkJZ290byBvdXRfcHV0X2RldjsKKwl9CisKKwlpZiAoKHJlYWxfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9SWCkgJiYKKwkgICAgKHJlYWxfZGV2LT52bGFuX3J4X3JlZ2lzdGVyID09IE5VTEwgfHwKKwkgICAgIHJlYWxfZGV2LT52bGFuX3J4X2tpbGxfdmlkID09IE5VTEwpKSB7CisJCXByaW50ayhWTEFOX0RCRyAiJXM6IERldmljZSAlcyBoYXMgYnVnZ3kgVkxBTiBodyBhY2NlbC5cbiIsCisJCQlfX0ZVTkNUSU9OX18sIHJlYWxfZGV2LT5uYW1lKTsKKwkJZ290byBvdXRfcHV0X2RldjsKKwl9CisKKwlpZiAoKHJlYWxfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9GSUxURVIpICYmCisJICAgIChyZWFsX2Rldi0+dmxhbl9yeF9hZGRfdmlkID09IE5VTEwgfHwKKwkgICAgIHJlYWxfZGV2LT52bGFuX3J4X2tpbGxfdmlkID09IE5VTEwpKSB7CisJCXByaW50ayhWTEFOX0RCRyAiJXM6IERldmljZSAlcyBoYXMgYnVnZ3kgVkxBTiBodyBhY2NlbC5cbiIsCisJCQlfX0ZVTkNUSU9OX18sIHJlYWxfZGV2LT5uYW1lKTsKKwkJZ290byBvdXRfcHV0X2RldjsKKwl9CisKKwkvKiBGcm9tIHRoaXMgcG9pbnQgb24sIGFsbCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIG11c3QgcmVtYWluCisJICogY29uc2lzdGVudC4KKwkgKi8KKwlydG5sX2xvY2soKTsKKworCS8qIFRoZSByZWFsIGRldmljZSBtdXN0IGJlIHVwIGFuZCBvcGVyYXRpbmcgaW4gb3JkZXIgdG8KKwkgKiBhc3Nvc2NpYXRlIGEgVkxBTiBkZXZpY2Ugd2l0aCBpdC4KKwkgKi8KKwlpZiAoIShyZWFsX2Rldi0+ZmxhZ3MgJiBJRkZfVVApKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlpZiAoX19maW5kX3ZsYW5fZGV2KHJlYWxfZGV2LCBWTEFOX0lEKSAhPSBOVUxMKSB7CisJCS8qIHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQuICovCisJCXByaW50ayhWTEFOX0RCRyAiJXM6IEFMUkVBRFkgaGFkIFZMQU4gcmVnaXN0ZXJlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCS8qIEdvdHRhIHNldCB1cCB0aGUgZmllbGRzIGZvciB0aGUgZGV2aWNlLiAqLworI2lmZGVmIFZMQU5fREVCVUcKKwlwcmludGsoVkxBTl9EQkcgIkFib3V0IHRvIGFsbG9jYXRlIG5hbWUsIHZsYW5fbmFtZV90eXBlOiAlaVxuIiwKKwkgICAgICAgdmxhbl9uYW1lX3R5cGUpOworI2VuZGlmCisJc3dpdGNoICh2bGFuX25hbWVfdHlwZSkgeworCWNhc2UgVkxBTl9OQU1FX1RZUEVfUkFXX1BMVVNfVklEOgorCQkvKiBuYW1lIHdpbGwgbG9vayBsaWtlOgkgZXRoMS4wMDA1ICovCisJCXNucHJpbnRmKG5hbWUsIElGTkFNU0laLCAiJXMuJS40aSIsIHJlYWxfZGV2LT5uYW1lLCBWTEFOX0lEKTsKKwkJYnJlYWs7CisJY2FzZSBWTEFOX05BTUVfVFlQRV9QTFVTX1ZJRF9OT19QQUQ6CisJCS8qIFB1dCBvdXIgdmxhbi5WSUQgaW4gdGhlIG5hbWUuCisJCSAqIE5hbWUgd2lsbCBsb29rIGxpa2U6CSB2bGFuNQorCQkgKi8KKwkJc25wcmludGYobmFtZSwgSUZOQU1TSVosICJ2bGFuJWkiLCBWTEFOX0lEKTsKKwkJYnJlYWs7CisJY2FzZSBWTEFOX05BTUVfVFlQRV9SQVdfUExVU19WSURfTk9fUEFEOgorCQkvKiBQdXQgb3VyIHZsYW4uVklEIGluIHRoZSBuYW1lLgorCQkgKiBOYW1lIHdpbGwgbG9vayBsaWtlOgkgZXRoMC41CisJCSAqLworCQlzbnByaW50ZihuYW1lLCBJRk5BTVNJWiwgIiVzLiVpIiwgcmVhbF9kZXYtPm5hbWUsIFZMQU5fSUQpOworCQlicmVhazsKKwljYXNlIFZMQU5fTkFNRV9UWVBFX1BMVVNfVklEOgorCQkvKiBQdXQgb3VyIHZsYW4uVklEIGluIHRoZSBuYW1lLgorCQkgKiBOYW1lIHdpbGwgbG9vayBsaWtlOgkgdmxhbjAwMDUKKwkJICovCisJZGVmYXVsdDoKKwkJc25wcmludGYobmFtZSwgSUZOQU1TSVosICJ2bGFuJS40aSIsIFZMQU5fSUQpOworCX07CisJCSAgICAKKwluZXdfZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3Qgdmxhbl9kZXZfaW5mbyksIG5hbWUsCisJCQkgICAgICAgdmxhbl9zZXR1cCk7CisJaWYgKG5ld19kZXYgPT0gTlVMTCkKKwkJZ290byBvdXRfdW5sb2NrOworCisjaWZkZWYgVkxBTl9ERUJVRworCXByaW50ayhWTEFOX0RCRyAiQWxsb2NhdGVkIG5ldyBuYW1lIC06JXM6LVxuIiwgbmV3X2Rldi0+bmFtZSk7CisjZW5kaWYKKwkvKiBJRkZfQlJPQURDQVNUfElGRl9NVUxUSUNBU1Q7ID8/PyAqLworCW5ld19kZXYtPmZsYWdzID0gcmVhbF9kZXYtPmZsYWdzOworCW5ld19kZXYtPmZsYWdzICY9IH5JRkZfVVA7CisKKwluZXdfZGV2LT5zdGF0ZSA9IHJlYWxfZGV2LT5zdGF0ZSAmIFZMQU5fTElOS19TVEFURV9NQVNLOworCisJLyogbmVlZCA0IGJ5dGVzIGZvciBleHRyYSBWTEFOIGhlYWRlciBpbmZvLAorCSAqIGhvcGUgdGhlIHVuZGVybHlpbmcgZGV2aWNlIGNhbiBoYW5kbGUgaXQuCisJICovCisJbmV3X2Rldi0+bXR1ID0gcmVhbF9kZXYtPm10dTsKKworCS8qIFRPRE86IG1heWJlIGp1c3QgYXNzaWduIGl0IHRvIGJlIEVUSEVSTkVUPyAqLworCW5ld19kZXYtPnR5cGUgPSByZWFsX2Rldi0+dHlwZTsKKworCW5ld19kZXYtPmhhcmRfaGVhZGVyX2xlbiA9IHJlYWxfZGV2LT5oYXJkX2hlYWRlcl9sZW47CisJaWYgKCEocmVhbF9kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1RYKSkgeworCQkvKiBSZWd1bGFyIGV0aGVybmV0ICsgNCBieXRlcyAoMTggdG90YWwpLiAqLworCQluZXdfZGV2LT5oYXJkX2hlYWRlcl9sZW4gKz0gVkxBTl9ITEVOOworCX0KKworCVZMQU5fTUVNX0RCRygibmV3X2Rldi0+cHJpdiBtYWxsb2MsIGFkZHI6ICVwICBzaXplOiAlaVxuIiwKKwkJICAgICBuZXdfZGV2LT5wcml2LAorCQkgICAgIHNpemVvZihzdHJ1Y3Qgdmxhbl9kZXZfaW5mbykpOworCSAgICAKKwltZW1jcHkobmV3X2Rldi0+YnJvYWRjYXN0LCByZWFsX2Rldi0+YnJvYWRjYXN0LCByZWFsX2Rldi0+YWRkcl9sZW4pOworCW1lbWNweShuZXdfZGV2LT5kZXZfYWRkciwgcmVhbF9kZXYtPmRldl9hZGRyLCByZWFsX2Rldi0+YWRkcl9sZW4pOworCW5ld19kZXYtPmFkZHJfbGVuID0gcmVhbF9kZXYtPmFkZHJfbGVuOworCisJaWYgKHJlYWxfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9UWCkgeworCQluZXdfZGV2LT5oYXJkX2hlYWRlciA9IHJlYWxfZGV2LT5oYXJkX2hlYWRlcjsKKwkJbmV3X2Rldi0+aGFyZF9zdGFydF94bWl0ID0gdmxhbl9kZXZfaHdhY2NlbF9oYXJkX3N0YXJ0X3htaXQ7CisJCW5ld19kZXYtPnJlYnVpbGRfaGVhZGVyID0gcmVhbF9kZXYtPnJlYnVpbGRfaGVhZGVyOworCX0gZWxzZSB7CisJCW5ld19kZXYtPmhhcmRfaGVhZGVyID0gdmxhbl9kZXZfaGFyZF9oZWFkZXI7CisJCW5ld19kZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHZsYW5fZGV2X2hhcmRfc3RhcnRfeG1pdDsKKwkJbmV3X2Rldi0+cmVidWlsZF9oZWFkZXIgPSB2bGFuX2Rldl9yZWJ1aWxkX2hlYWRlcjsKKwl9CisJbmV3X2Rldi0+aGFyZF9oZWFkZXJfcGFyc2UgPSByZWFsX2Rldi0+aGFyZF9oZWFkZXJfcGFyc2U7CisKKwlWTEFOX0RFVl9JTkZPKG5ld19kZXYpLT52bGFuX2lkID0gVkxBTl9JRDsgLyogMSB0aHJvdWdoIFZMQU5fVklEX01BU0sgKi8KKwlWTEFOX0RFVl9JTkZPKG5ld19kZXYpLT5yZWFsX2RldiA9IHJlYWxfZGV2OworCVZMQU5fREVWX0lORk8obmV3X2RldiktPmRlbnQgPSBOVUxMOworCVZMQU5fREVWX0lORk8obmV3X2RldiktPmZsYWdzID0gMTsKKworI2lmZGVmIFZMQU5fREVCVUcKKwlwcmludGsoVkxBTl9EQkcgIkFib3V0IHRvIGdvIGZpbmQgdGhlIGdyb3VwIGZvciBpZHg6ICVpXG4iLAorCSAgICAgICByZWFsX2Rldi0+aWZpbmRleCk7CisjZW5kaWYKKwkgICAgCisJaWYgKHJlZ2lzdGVyX25ldGRldmljZShuZXdfZGV2KSkKKwkJZ290byBvdXRfZnJlZV9uZXdkZXY7CisKKwkvKiBTbywgZ290IHRoZSBzdWNrZXIgaW5pdGlhbGl6ZWQsIG5vdyBsZXRzIHBsYWNlCisJICogaXQgaW50byBvdXIgbG9jYWwgc3RydWN0dXJlLgorCSAqLworCWdycCA9IF9fdmxhbl9maW5kX2dyb3VwKHJlYWxfZGV2LT5pZmluZGV4KTsKKworCS8qIE5vdGUsIHdlIGFyZSBydW5uaW5nIHVuZGVyIHRoZSBSVE5MIHNlbWFwaG9yZQorCSAqIHNvIGl0IGNhbm5vdCAiYXBwZWFyIiBvbiB1cy4KKwkgKi8KKwlpZiAoIWdycCkgeyAvKiBuZWVkIHRvIGFkZCBhIG5ldyBncm91cCAqLworCQlncnAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdmxhbl9ncm91cCksIEdGUF9LRVJORUwpOworCQlpZiAoIWdycCkKKwkJCWdvdG8gb3V0X2ZyZWVfdW5yZWdpc3RlcjsKKwkJCQkJCisJCS8qIHByaW50ayhLRVJOX0FMRVJUICJWTEFOIFJFR0lTVEVSOiAgQWxsb2NhdGVkIG5ldyBncm91cC5cbiIpOyAqLworCQltZW1zZXQoZ3JwLCAwLCBzaXplb2Yoc3RydWN0IHZsYW5fZ3JvdXApKTsKKwkJZ3JwLT5yZWFsX2Rldl9pZmluZGV4ID0gcmVhbF9kZXYtPmlmaW5kZXg7CisKKwkJaGxpc3RfYWRkX2hlYWRfcmN1KCZncnAtPmhsaXN0LCAKKwkJCQkgICAmdmxhbl9ncm91cF9oYXNoW3ZsYW5fZ3JwX2hhc2hmbihyZWFsX2Rldi0+aWZpbmRleCldKTsKKworCQlpZiAocmVhbF9kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1JYKQorCQkJcmVhbF9kZXYtPnZsYW5fcnhfcmVnaXN0ZXIocmVhbF9kZXYsIGdycCk7CisJfQorCSAgICAKKwlncnAtPnZsYW5fZGV2aWNlc1tWTEFOX0lEXSA9IG5ld19kZXY7CisKKwlpZiAodmxhbl9wcm9jX2FkZF9kZXYobmV3X2Rldik8MCkvKiBjcmVhdGUgaXQncyBwcm9jIGVudHJ5ICovCisgICAgICAgICAgICAJcHJpbnRrKEtFUk5fV0FSTklORyAiVkxBTjogZmFpbGVkIHRvIGFkZCBwcm9jIGVudHJ5IGZvciAlc1xuIiwKKwkJCQkJICAgICAgICAgICAgICAgICBuZXdfZGV2LT5uYW1lKTsKKworCWlmIChyZWFsX2Rldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fRklMVEVSKQorCQlyZWFsX2Rldi0+dmxhbl9yeF9hZGRfdmlkKHJlYWxfZGV2LCBWTEFOX0lEKTsKKworCXJ0bmxfdW5sb2NrKCk7CisKKworI2lmZGVmIFZMQU5fREVCVUcKKwlwcmludGsoVkxBTl9EQkcgIkFsbG9jYXRlZCBuZXcgZGV2aWNlIHN1Y2Nlc3NmdWxseSwgcmV0dXJuaW5nLlxuIik7CisjZW5kaWYKKwlyZXR1cm4gbmV3X2RldjsKKworb3V0X2ZyZWVfdW5yZWdpc3RlcjoKKwl1bnJlZ2lzdGVyX25ldGRldihuZXdfZGV2KTsKKwlnb3RvIG91dF91bmxvY2s7CisKK291dF9mcmVlX25ld2RldjoKKwlmcmVlX25ldGRldihuZXdfZGV2KTsKKworb3V0X3VubG9jazoKKwlydG5sX3VubG9jaygpOworCitvdXRfcHV0X2RldjoKKwlkZXZfcHV0KHJlYWxfZGV2KTsKKworb3V0X3JldF9udWxsOgorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHZsYW5fZGV2aWNlX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdW51c2VkLCB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHB0cjsKKwlzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwID0gX192bGFuX2ZpbmRfZ3JvdXAoZGV2LT5pZmluZGV4KTsKKwlpbnQgaSwgZmxnczsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqdmxhbmRldjsKKworCWlmICghZ3JwKQorCQlnb3RvIG91dDsKKworCS8qIEl0IGlzIE9LIHRoYXQgd2UgZG8gbm90IGhvbGQgdGhlIGdyb3VwIGxvY2sgcmlnaHQgbm93LAorCSAqIGFzIHdlIHJ1biB1bmRlciB0aGUgUlROTCBsb2NrLgorCSAqLworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX0NIQU5HRToKKwkJLyogUHJvcGFnYXRlIHJlYWwgZGV2aWNlIHN0YXRlIHRvIHZsYW4gZGV2aWNlcyAqLworCQlmbGdzID0gZGV2LT5zdGF0ZSAmIFZMQU5fTElOS19TVEFURV9NQVNLOworCQlmb3IgKGkgPSAwOyBpIDwgVkxBTl9HUk9VUF9BUlJBWV9MRU47IGkrKykgeworCQkJdmxhbmRldiA9IGdycC0+dmxhbl9kZXZpY2VzW2ldOworCQkJaWYgKCF2bGFuZGV2KQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoKHZsYW5kZXYtPnN0YXRlICYgVkxBTl9MSU5LX1NUQVRFX01BU0spICE9IGZsZ3MpIHsKKwkJCQl2bGFuZGV2LT5zdGF0ZSA9ICh2bGFuZGV2LT5zdGF0ZSAmfiBWTEFOX0xJTktfU1RBVEVfTUFTSykgCisJCQkJCXwgZmxnczsKKwkJCQluZXRkZXZfc3RhdGVfY2hhbmdlKHZsYW5kZXYpOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBORVRERVZfRE9XTjoKKwkJLyogUHV0IGFsbCBWTEFOcyBmb3IgdGhpcyBkZXYgaW4gdGhlIGRvd24gc3RhdGUgdG9vLiAgKi8KKwkJZm9yIChpID0gMDsgaSA8IFZMQU5fR1JPVVBfQVJSQVlfTEVOOyBpKyspIHsKKwkJCXZsYW5kZXYgPSBncnAtPnZsYW5fZGV2aWNlc1tpXTsKKwkJCWlmICghdmxhbmRldikKKwkJCQljb250aW51ZTsKKworCQkJZmxncyA9IHZsYW5kZXYtPmZsYWdzOworCQkJaWYgKCEoZmxncyAmIElGRl9VUCkpCisJCQkJY29udGludWU7CisKKwkJCWRldl9jaGFuZ2VfZmxhZ3ModmxhbmRldiwgZmxncyAmIH5JRkZfVVApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBORVRERVZfVVA6CisJCS8qIFB1dCBhbGwgVkxBTnMgZm9yIHRoaXMgZGV2IGluIHRoZSB1cCBzdGF0ZSB0b28uICAqLworCQlmb3IgKGkgPSAwOyBpIDwgVkxBTl9HUk9VUF9BUlJBWV9MRU47IGkrKykgeworCQkJdmxhbmRldiA9IGdycC0+dmxhbl9kZXZpY2VzW2ldOworCQkJaWYgKCF2bGFuZGV2KQorCQkJCWNvbnRpbnVlOworCQkJCQorCQkJZmxncyA9IHZsYW5kZXYtPmZsYWdzOworCQkJaWYgKGZsZ3MgJiBJRkZfVVApCisJCQkJY29udGludWU7CisKKwkJCWRldl9jaGFuZ2VfZmxhZ3ModmxhbmRldiwgZmxncyB8IElGRl9VUCk7CisJCX0KKwkJYnJlYWs7CisJCQorCWNhc2UgTkVUREVWX1VOUkVHSVNURVI6CisJCS8qIERlbGV0ZSBhbGwgVkxBTnMgZm9yIHRoaXMgZGV2LiAqLworCQlmb3IgKGkgPSAwOyBpIDwgVkxBTl9HUk9VUF9BUlJBWV9MRU47IGkrKykgeworCQkJaW50IHJldDsKKworCQkJdmxhbmRldiA9IGdycC0+dmxhbl9kZXZpY2VzW2ldOworCQkJaWYgKCF2bGFuZGV2KQorCQkJCWNvbnRpbnVlOworCisJCQlyZXQgPSB1bnJlZ2lzdGVyX3ZsYW5fZGV2KGRldiwKKwkJCQkJCSAgVkxBTl9ERVZfSU5GTyh2bGFuZGV2KS0+dmxhbl9pZCk7CisKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKHZsYW5kZXYpOworCisJCQkvKiBHcm91cCB3YXMgZGVzdHJveWVkPyAqLworCQkJaWYgKHJldCA9PSAxKQorCQkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX07CisKK291dDoKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKy8qCisgKglWTEFOIElPQ1RMIGhhbmRsZXIuCisgKglvIGV4ZWN1dGUgcmVxdWVzdGVkIGFjdGlvbiBvciBwYXNzIGNvbW1hbmQgdG8gdGhlIGRldmljZSBkcml2ZXIKKyAqICAgYXJnIGlzIHJlYWxseSBhIHN0cnVjdCB2bGFuX2lvY3RsX2FyZ3MgX191c2VyICouCisgKi8KK3N0YXRpYyBpbnQgdmxhbl9pb2N0bF9oYW5kbGVyKHZvaWQgX191c2VyICphcmcpCit7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgc2hvcnQgdmlkID0gMDsKKwlzdHJ1Y3Qgdmxhbl9pb2N0bF9hcmdzIGFyZ3M7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmFyZ3MsIGFyZywgc2l6ZW9mKHN0cnVjdCB2bGFuX2lvY3RsX2FyZ3MpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBOdWxsIHRlcm1pbmF0ZSB0aGlzIHN1Y2tlciwganVzdCBpbiBjYXNlLiAqLworCWFyZ3MuZGV2aWNlMVsyM10gPSAwOworCWFyZ3MudS5kZXZpY2UyWzIzXSA9IDA7CisKKyNpZmRlZiBWTEFOX0RFQlVHCisJcHJpbnRrKFZMQU5fREJHICIlczogYXJncy5jbWQ6ICV4XG4iLCBfX0ZVTkNUSU9OX18sIGFyZ3MuY21kKTsKKyNlbmRpZgorCisJc3dpdGNoIChhcmdzLmNtZCkgeworCWNhc2UgU0VUX1ZMQU5fSU5HUkVTU19QUklPUklUWV9DTUQ6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWVyciA9IHZsYW5fZGV2X3NldF9pbmdyZXNzX3ByaW9yaXR5KGFyZ3MuZGV2aWNlMSwKKwkJCQkJCSAgICBhcmdzLnUuc2tiX3ByaW9yaXR5LAorCQkJCQkJICAgIGFyZ3Mudmxhbl9xb3MpOworCQlicmVhazsKKworCWNhc2UgU0VUX1ZMQU5fRUdSRVNTX1BSSU9SSVRZX0NNRDoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJZXJyID0gdmxhbl9kZXZfc2V0X2VncmVzc19wcmlvcml0eShhcmdzLmRldmljZTEsCisJCQkJCQkgICBhcmdzLnUuc2tiX3ByaW9yaXR5LAorCQkJCQkJICAgYXJncy52bGFuX3Fvcyk7CisJCWJyZWFrOworCisJY2FzZSBTRVRfVkxBTl9GTEFHX0NNRDoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJZXJyID0gdmxhbl9kZXZfc2V0X3ZsYW5fZmxhZyhhcmdzLmRldmljZTEsCisJCQkJCSAgICAgYXJncy51LmZsYWcsCisJCQkJCSAgICAgYXJncy52bGFuX3Fvcyk7CisJCWJyZWFrOworCisJY2FzZSBTRVRfVkxBTl9OQU1FX1RZUEVfQ01EOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoKGFyZ3MudS5uYW1lX3R5cGUgPj0gMCkgJiYKKwkJICAgIChhcmdzLnUubmFtZV90eXBlIDwgVkxBTl9OQU1FX1RZUEVfSElHSEVTVCkpIHsKKwkJCXZsYW5fbmFtZV90eXBlID0gYXJncy51Lm5hbWVfdHlwZTsKKwkJCWVyciA9IDA7CisJCX0gZWxzZSB7CisJCQllcnIgPSAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBRERfVkxBTl9DTUQ6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCS8qIHdlIGhhdmUgYmVlbiBnaXZlbiB0aGUgbmFtZSBvZiB0aGUgRXRoZXJuZXQgRGV2aWNlIHdlIHdhbnQgdG8KKwkJICogdGFsayB0bzogIGFyZ3MuZGV2MQkgV2UgYWxzbyBoYXZlIHRoZQorCQkgKiBWTEFOIElEOiAgYXJncy51LlZJRAorCQkgKi8KKwkJaWYgKHJlZ2lzdGVyX3ZsYW5fZGV2aWNlKGFyZ3MuZGV2aWNlMSwgYXJncy51LlZJRCkpIHsKKwkJCWVyciA9IDA7CisJCX0gZWxzZSB7CisJCQllcnIgPSAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBERUxfVkxBTl9DTUQ6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCS8qIEhlcmUsIHRoZSBhcmdzLmRldjEgaXMgdGhlIGFjdHVhbCBWTEFOIHdlIHdhbnQKKwkJICogdG8gZ2V0IHJpZCBvZi4KKwkJICovCisJCWVyciA9IHVucmVnaXN0ZXJfdmxhbl9kZXZpY2UoYXJncy5kZXZpY2UxKTsKKwkJYnJlYWs7CisKKwljYXNlIEdFVF9WTEFOX0lOR1JFU1NfUFJJT1JJVFlfQ01EOgorCQkvKiBUT0RPOiAgSW1wbGVtZW50CisJCSAgIGVyciA9IHZsYW5fZGV2X2dldF9pbmdyZXNzX3ByaW9yaXR5KGFyZ3MpOworCQkgICBpZiAoY29weV90b191c2VyKCh2b2lkKilhcmcsICZhcmdzLAorCQkgICAgICAgIHNpemVvZihzdHJ1Y3Qgdmxhbl9pb2N0bF9hcmdzKSkpIHsKKwkJICAgICAgICBlcnIgPSAtRUZBVUxUOworCQkgICB9CisJCSovCisJCWVyciA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgR0VUX1ZMQU5fRUdSRVNTX1BSSU9SSVRZX0NNRDoKKwkJLyogVE9ETzogIEltcGxlbWVudAorCQkgICBlcnIgPSB2bGFuX2Rldl9nZXRfZWdyZXNzX3ByaW9yaXR5KGFyZ3MuZGV2aWNlMSwgJihhcmdzLmFyZ3MpOworCQkgICBpZiAoY29weV90b191c2VyKCh2b2lkKilhcmcsICZhcmdzLAorCQkgICAgICAgIHNpemVvZihzdHJ1Y3Qgdmxhbl9pb2N0bF9hcmdzKSkpIHsKKwkJICAgICAgICBlcnIgPSAtRUZBVUxUOworCQkgICB9CisJCSovCisJCWVyciA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgR0VUX1ZMQU5fUkVBTERFVl9OQU1FX0NNRDoKKwkJZXJyID0gdmxhbl9kZXZfZ2V0X3JlYWxkZXZfbmFtZShhcmdzLmRldmljZTEsIGFyZ3MudS5kZXZpY2UyKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZhcmdzLAorCQkJCSBzaXplb2Yoc3RydWN0IHZsYW5faW9jdGxfYXJncykpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCisJY2FzZSBHRVRfVkxBTl9WSURfQ01EOgorCQllcnIgPSB2bGFuX2Rldl9nZXRfdmlkKGFyZ3MuZGV2aWNlMSwgJnZpZCk7CisJCWFyZ3MudS5WSUQgPSB2aWQ7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmYXJncywKKwkJCQkgc2l6ZW9mKHN0cnVjdCB2bGFuX2lvY3RsX2FyZ3MpKSkgeworICAgICAgICAgICAgICAgICAgICAgIGVyciA9IC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBwYXNzIG9uIHRvIHVuZGVybHlpbmcgZGV2aWNlIGluc3RlYWQ/PyAqLworCQlwcmludGsoVkxBTl9EQkcgIiVzOiBVbmtub3duIFZMQU4gQ01EOiAleCBcbiIsCisJCQlfX0ZVTkNUSU9OX18sIGFyZ3MuY21kKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfTsKKworCXJldHVybiBlcnI7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL25ldC84MDIxcS92bGFuLmggYi9uZXQvODAyMXEvdmxhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOGIxZmEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvODAyMXEvdmxhbi5oCkBAIC0wLDAgKzEsNzIgQEAKKyNpZm5kZWYgX19CRU5fVkxBTl84MDJfMVFfSU5DX18KKyNkZWZpbmUgX19CRU5fVkxBTl84MDJfMVFfSU5DX18KKworI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKworLyogIFVuY29tbWVudCB0aGlzIGlmIHlvdSB3YW50IGRlYnVnIHRyYWNlcyB0byBiZSBzaG93bi4gKi8KKy8qICNkZWZpbmUgVkxBTl9ERUJVRyAqLworCisjZGVmaW5lIFZMQU5fRVJSIEtFUk5fRVJSCisjZGVmaW5lIFZMQU5fSU5GIEtFUk5fSU5GTworI2RlZmluZSBWTEFOX0RCRyBLRVJOX0FMRVJUIC8qIGNoYW5nZSB0aGVzZS4uLiB0byBkZWJ1ZywgaGF2aW5nIGEgaGFyZCB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY2hhbmdpbmcgdGhlIGxvZyBsZXZlbCBhdCBydW4tdGltZS4uZm9yIHNvbWUgcmVhc29uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKgorCitUaGVzZSBJIHVzZSBmb3IgbWVtb3J5IGRlYnVnZ2luZy4gIEkgZmVhcmVkIGEgbGVhayBhdCBvbmUgdGltZSwgYnV0CitJIG5ldmVyIGZvdW5kIGl0Li5hbmQgdGhlIHByb2JsZW0gc2VlbXMgdG8gaGF2ZSBkaXNzYXBwZWFyZWQuICBTdGlsbCwKK0knbGwgYmV0IHRoZXkgbWlnaHQgcHJvdmUgdXNlZnVsIGFnYWluLi4uIC0tQmVuCisKKworI2RlZmluZSBWTEFOX01FTV9EQkcoeCwgeSwgeikgcHJpbnRrKFZMQU5fREJHICIlczogICIgIHgsIF9fRlVOQ1RJT05fXywgeSwgeik7CisjZGVmaW5lIFZMQU5fRk1FTV9EQkcoeCwgeSkgcHJpbnRrKFZMQU5fREJHICIlczogICIgeCwgX19GVU5DVElPTl9fLCB5KTsKKyovCisKKy8qIFRoaXMgd2F5IHRoZXkgZG9uJ3QgZG8gYW55dGhpbmchICovCisjZGVmaW5lIFZMQU5fTUVNX0RCRyh4LCB5LCB6KSAKKyNkZWZpbmUgVkxBTl9GTUVNX0RCRyh4LCB5KQorCisKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCB2bGFuX25hbWVfdHlwZTsKKworI2RlZmluZSBWTEFOX0dSUF9IQVNIX1NISUZUCTUKKyNkZWZpbmUgVkxBTl9HUlBfSEFTSF9TSVpFCSgxIDw8IFZMQU5fR1JQX0hBU0hfU0hJRlQpCisjZGVmaW5lIFZMQU5fR1JQX0hBU0hfTUFTSwkoVkxBTl9HUlBfSEFTSF9TSVpFIC0gMSkKKworLyogIEZpbmQgYSBWTEFOIGRldmljZSBieSB0aGUgTUFDIGFkZHJlc3Mgb2YgaXRzIEV0aGVybmV0IGRldmljZSwgYW5kCisgKiAgaXQncyBWTEFOIElELiAgVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpcyB0byBoYXZlIFZMQU4ncyBzY29wZQorICogIHRvIGJlIGJveC13aWRlLCBzbyB0aGUgTUFDIHdpbGwgYmUgaWdub3JlZC4gIFRoZSBtYWMgd2lsbCBvbmx5IGJlCisgKiAgbG9va2VkIGF0IGlmIHdlIGFyZSBjb25maWd1cmVkIHRvIGhhdmUgYSBzZXBhcmF0ZSBzZXQgb2YgVkxBTnMgcGVyCisgKiAgZWFjaCBNQUMgYWRkcmVzc2FibGUgaW50ZXJmYWNlLiAgTm90ZSB0aGF0IHRoaXMgbGF0dGVyIG9wdGlvbiBkb2VzCisgKiAgTk9UIGZvbGxvdyB0aGUgc3BlYyBmb3IgVkxBTnMsIGJ1dCBtYXkgYmUgdXNlZnVsIGZvciBkb2luZyB2ZXJ5CisgKiAgbGFyZ2UgcXVhbnRpdGllcyBvZiBWTEFOIE1VWC9ERU1VWCBvbnRvIEZyYW1lUmVsYXkgb3IgQVRNIFBWQ3MuCisgKgorICogIE11c3QgYmUgaW52b2tlZCB3aXRoIHJjdV9yZWFkX2xvY2sgKGllIHByZWVtcHQgZGlzYWJsZWQpCisgKiAgb3Igd2l0aCBSVE5MLgorICovCitzdHJ1Y3QgbmV0X2RldmljZSAqX19maW5kX3ZsYW5fZGV2KHN0cnVjdCBuZXRfZGV2aWNlKiByZWFsX2RldiwKKwkJCQkgICB1bnNpZ25lZCBzaG9ydCBWSUQpOyAvKiB2bGFuLmMgKi8KKworLyogZm91bmQgaW4gdmxhbl9kZXYuYyAqLworaW50IHZsYW5fZGV2X3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpOworaW50IHZsYW5fc2tiX3JlY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBwYWNrZXRfdHlwZSogcHR5cGUpOworaW50IHZsYW5fZGV2X2hhcmRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgdHlwZSwgdm9pZCAqZGFkZHIsIHZvaWQgKnNhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxlbik7CitpbnQgdmxhbl9kZXZfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IHZsYW5fZGV2X2h3YWNjZWxfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IHZsYW5fZGV2X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpOworaW50IHZsYW5fZGV2X3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkKiBhZGRyKTsKK2ludCB2bGFuX2Rldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworaW50IHZsYW5fZGV2X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitpbnQgdmxhbl9kZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpOworaW50IHZsYW5fZGV2X3NldF9pbmdyZXNzX3ByaW9yaXR5KGNoYXIqIGRldl9uYW1lLCBfX3UzMiBza2JfcHJpbywgc2hvcnQgdmxhbl9wcmlvKTsKK2ludCB2bGFuX2Rldl9zZXRfZWdyZXNzX3ByaW9yaXR5KGNoYXIqIGRldl9uYW1lLCBfX3UzMiBza2JfcHJpbywgc2hvcnQgdmxhbl9wcmlvKTsKK2ludCB2bGFuX2Rldl9zZXRfdmxhbl9mbGFnKGNoYXIqIGRldl9uYW1lLCBfX3UzMiBmbGFnLCBzaG9ydCBmbGFnX3ZhbCk7CitpbnQgdmxhbl9kZXZfZ2V0X3JlYWxkZXZfbmFtZShjb25zdCBjaGFyKiBkZXZfbmFtZSwgY2hhciogcmVzdWx0KTsKK2ludCB2bGFuX2Rldl9nZXRfdmlkKGNvbnN0IGNoYXIqIGRldl9uYW1lLCB1bnNpZ25lZCBzaG9ydCogcmVzdWx0KTsKK3ZvaWQgdmxhbl9kZXZfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICp2bGFuX2Rldik7CisKKyNlbmRpZiAvKiAhKF9fQkVOX1ZMQU5fODAyXzFRX0lOQ19fKSAqLwpkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW5fZGV2LmMgYi9uZXQvODAyMXEvdmxhbl9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWM0ODc0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0LzgwMjFxL3ZsYW5fZGV2LmMKQEAgLTAsMCArMSw4OTAgQEAKKy8qIC0qLSBsaW51eC1jIC0qLQorICogSU5FVAkJODAyLjFRIFZMQU4KKyAqCQlFdGhlcm5ldC10eXBlIGRldmljZSBoYW5kbGluZy4KKyAqCisgKiBBdXRob3JzOglCZW4gR3JlZWFyIDxncmVlYXJiQGNhbmRlbGF0ZWNoLmNvbT4KKyAqICAgICAgICAgICAgICBQbGVhc2Ugc2VuZCBzdXBwb3J0IHJlbGF0ZWQgZW1haWwgdG86IHZsYW5Ac2NyeS53YW5mZWFyLmNvbQorICogICAgICAgICAgICAgIFZMQU4gSG9tZSBQYWdlOiBodHRwOi8vd3d3LmNhbmRlbGF0ZWNoLmNvbS9+Z3JlZWFyL3ZsYW4uaHRtbAorICogCisgKiBGaXhlczogICAgICAgTWFyIDIyIDIwMDE6IE1hcnRpbiBCb2thZW1wZXIgPG1ib2thZW1wZXJAdW5pc3BoZXJlbmV0d29ya3MuY29tPgorICogICAgICAgICAgICAgICAgLSByZXNldCBza2ItPnBrdF90eXBlIG9uIGluY29taW5nIHBhY2tldHMgd2hlbiBNQUMgd2FzIGNoYW5nZWQKKyAqICAgICAgICAgICAgICAgIC0gc2VlIHRoYXQgY2hhbmdlZCBNQUMgaXMgc2FkZHIgZm9yIG91dGdvaW5nIHBhY2tldHMKKyAqICAgICAgICAgICAgICBPY3QgMjAsIDIwMDE6ICBBcmQgdmFuIEJyZWVtYW46CisgKiAgICAgICAgICAgICAgICAtIEZpeCBNQy1saXN0LCBmaW5hbGx5LgorICogICAgICAgICAgICAgICAgLSBGbHVzaCBNQy1saXN0IG9uIFZMQU4gZGVzdHJveS4KKyAqICAgICAgICAgICAgICAgIAorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+IC8qIGZvciBjb3B5X2Zyb21fdXNlciAqLworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L2RhdGFsaW5rLmg+CisjaW5jbHVkZSA8bmV0L3A4MDIyLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorCisjaW5jbHVkZSAidmxhbi5oIgorI2luY2x1ZGUgInZsYW5wcm9jLmgiCisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorCisvKgorICoJUmVidWlsZCB0aGUgRXRoZXJuZXQgTUFDIGhlYWRlci4gVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYW4gQVJQCisgKgkob3IgaW4gZnV0dXJlIG90aGVyIGFkZHJlc3MgcmVzb2x1dGlvbikgaGFzIGNvbXBsZXRlZCBvbiB0aGlzCisgKglza19idWZmLiBXZSBub3cgbGV0IEFSUCBmaWxsIGluIHRoZSBvdGhlciBmaWVsZHMuCisgKgorICoJVGhpcyByb3V0aW5lIENBTk5PVCB1c2UgY2FjaGVkIGRzdC0+bmVpZ2ghCisgKglSZWFsbHksIGl0IGlzIHVzZWQgb25seSB3aGVuIGRzdC0+bmVpZ2ggaXMgd3JvbmcuCisgKgorICogVE9ETzogIFRoaXMgbmVlZHMgYSBjaGVja3VwLCBJJ20gaWdub3JhbnQgaGVyZS4gLS1CTEcKKyAqLworaW50IHZsYW5fZGV2X3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OworCXN0cnVjdCB2bGFuX2V0aGhkciAqdmV0aCA9IChzdHJ1Y3Qgdmxhbl9ldGhoZHIgKikoc2tiLT5kYXRhKTsKKworCXN3aXRjaCAodmV0aC0+aF92bGFuX2VuY2Fwc3VsYXRlZF9wcm90bykgeworI2lmZGVmIENPTkZJR19JTkVUCisJY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKToKKworCQkvKiBUT0RPOiAgQ29uZmlybSB0aGlzIHdpbGwgd29yayB3aXRoIFZMQU4gaGVhZGVycy4uLiAqLworCQlyZXR1cm4gYXJwX2ZpbmQodmV0aC0+aF9kZXN0LCBza2IpOworI2VuZGlmCQorCWRlZmF1bHQ6CisJCXByaW50ayhWTEFOX0RCRworCQkgICAgICAgIiVzOiB1bmFibGUgdG8gcmVzb2x2ZSB0eXBlICVYIGFkZHJlc3Nlcy5cbiIsIAorCQkgICAgICAgZGV2LT5uYW1lLCAoaW50KXZldGgtPmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG8pOworCSAKKwkJbWVtY3B5KHZldGgtPmhfc291cmNlLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJCWJyZWFrOworCX07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqdmxhbl9jaGVja19yZW9yZGVyX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmIChWTEFOX0RFVl9JTkZPKHNrYi0+ZGV2KS0+ZmxhZ3MgJiAxKSB7CisJCWlmIChza2Jfc2hhcmVkKHNrYikgfHwgc2tiX2Nsb25lZChza2IpKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXNrYiA9IG5za2I7CisJCX0KKwkJaWYgKHNrYikgeworCQkJLyogTGlmdGVkIGZyb20gR2xlYidzIFZMQU4gY29kZS4uLiAqLworCQkJbWVtbW92ZShza2ItPmRhdGEgLSBFVEhfSExFTiwKKwkJCQlza2ItPmRhdGEgLSBWTEFOX0VUSF9ITEVOLCAxMik7CisJCQlza2ItPm1hYy5yYXcgKz0gVkxBTl9ITEVOOworCQl9CisJfQorCisJcmV0dXJuIHNrYjsKK30KKworLyoKKyAqCURldGVybWluZSB0aGUgcGFja2V0J3MgcHJvdG9jb2wgSUQuIFRoZSBydWxlIGhlcmUgaXMgdGhhdCB3ZSAKKyAqCWFzc3VtZSA4MDIuMyBpZiB0aGUgdHlwZSBmaWVsZCBpcyBzaG9ydCBlbm91Z2ggdG8gYmUgYSBsZW5ndGguCisgKglUaGlzIGlzIG5vcm1hbCBwcmFjdGljZSBhbmQgd29ya3MgZm9yIGFueSAnbm93IGluIHVzZScgcHJvdG9jb2wuCisgKgorICogIEFsc28sIGF0IHRoaXMgcG9pbnQgd2UgYXNzdW1lIHRoYXQgd2UgQVJFIGRlYWxpbmcgZXhjbHVzaXZlbHkgd2l0aAorICogIFZMQU4gcGFja2V0cywgb3IgcGFja2V0cyB0aGF0IHNob3VsZCBiZSBtYWRlIGludG8gVkxBTiBwYWNrZXRzIGJhc2VkCisgKiAgb24gYSBkZWZhdWx0IFZMQU4gSUQuCisgKgorICogIE5PVEU6ICBTaG91bGQgYmUgc2ltaWxhciB0byBldGhlcm5ldC9ldGguYy4KKyAqCisgKiAgU0FOSVRZIE5PVEU6ICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIHBhY2tldCBpcyBtb3ZpbmcgdXAgdGhlIHN0YWNrCisgKiAgICAgICAgICAgICAgICB0b3dhcmRzIHVzZXJsYW5kLiAgVG8gZ2V0IGhlcmUsIGl0IHdvdWxkIGhhdmUgYWxyZWFkeSBwYXNzZWQKKyAqICAgICAgICAgICAgICAgIHRocm91Z2ggdGhlIGV0aGVybmV0L2V0aC5jIGV0aF90eXBlX3RyYW5zKCkgbWV0aG9kLgorICogIFNBTklUWSBOT1RFIDI6IFdlIGFyZSByZWZlcmVuY2luZyB0byB0aGUgVkxBTl9IRFIgZnJpZWxkcywgd2hpY2ggTUFZIGJlCisgKiAgICAgICAgICAgICAgICAgc3RvcmVkIFVOQUxJR05FRCBpbiB0aGUgbWVtb3J5LiAgUklTQyBzeXN0ZW1zIGRvbid0IGxpa2UKKyAqICAgICAgICAgICAgICAgICBzdWNoIGNhc2VzIHZlcnkgbXVjaC4uLgorICogIFNBTklUWSBOT1RFIDJhOiAgQWNjb3JkaW5nIHRvIERhdmUgTWlsbGVyICYgQWxleGV5LCBpdCB3aWxsIGFsd2F5cyBiZSBhbGlnbmVkLAorICogICAgICAgICAgICAgICAgIHNvIHRoZXJlIGRvZXNuJ3QgbmVlZCB0byBiZSBhbnkgb2YgdGhlIHVuYWxpZ25lZCBzdHVmZi4gIEl0IGhhcworICogICAgICAgICAgICAgICAgIGJlZW4gY29tbWVudGVkIG91dCBub3cuLi4gIC0tQmVuCisgKgorICovCitpbnQgdmxhbl9za2JfcmVjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgc3RydWN0IHBhY2tldF90eXBlKiBwdHlwZSkKK3sKKwl1bnNpZ25lZCBjaGFyICpyYXdwID0gTlVMTDsKKwlzdHJ1Y3Qgdmxhbl9oZHIgKnZoZHIgPSAoc3RydWN0IHZsYW5faGRyICopKHNrYi0+ZGF0YSk7CisJdW5zaWduZWQgc2hvcnQgdmlkOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0czsKKwl1bnNpZ25lZCBzaG9ydCB2bGFuX1RDSTsKKwl1bnNpZ25lZCBzaG9ydCBwcm90bzsKKworCS8qIHZsYW5fVENJID0gbnRvaHMoZ2V0X3VuYWxpZ25lZCgmdmhkci0+aF92bGFuX1RDSSkpOyAqLworCXZsYW5fVENJID0gbnRvaHModmhkci0+aF92bGFuX1RDSSk7CisKKwl2aWQgPSAodmxhbl9UQ0kgJiBWTEFOX1ZJRF9NQVNLKTsKKworI2lmZGVmIFZMQU5fREVCVUcKKwlwcmludGsoVkxBTl9EQkcgIiVzOiBza2I6ICVwIHZsYW5faWQ6ICVoeFxuIiwKKwkJX19GVU5DVElPTl9fLCBza2IsIHZpZCk7CisjZW5kaWYKKworCS8qIE9rLCB3ZSB3aWxsIGZpbmQgdGhlIGNvcnJlY3QgVkxBTiBkZXZpY2UsIHN0cmlwIHRoZSBoZWFkZXIsCisJICogYW5kIHRoZW4gZ28gb24gYXMgdXN1YWwuCisJICovCisKKwkvKiBXZSBoYXZlIDEyIGJpdHMgb2YgdmxhbiBJRC4KKwkgKgorCSAqIFdlIG11c3Qgbm90IGRyb3AgYWxsb3cgcHJlZW1wdCB1bnRpbCB3ZSBob2xkIGEKKwkgKiByZWZlcmVuY2UgdG8gdGhlIGRldmljZSAobmV0aWZfcnggZG9lcyB0aGF0KSBvciB3ZQorCSAqIGZhaWwuCisJICovCisKKwlyY3VfcmVhZF9sb2NrKCk7CisJc2tiLT5kZXYgPSBfX2ZpbmRfdmxhbl9kZXYoZGV2LCB2aWQpOworCWlmICghc2tiLT5kZXYpIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisKKyNpZmRlZiBWTEFOX0RFQlVHCisJCXByaW50ayhWTEFOX0RCRyAiJXM6IEVSUk9SOiBObyBuZXRfZGV2aWNlIGZvciBWSUQ6ICVpIG9uIGRldjogJXMgWyVpXVxuIiwKKwkJCV9fRlVOQ1RJT05fXywgKHVuc2lnbmVkIGludCkodmlkKSwgZGV2LT5uYW1lLCBkZXYtPmlmaW5kZXgpOworI2VuZGlmCisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLTE7CisJfQorCisJc2tiLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCisJLyogQnVtcCB0aGUgcnggY291bnRlcnMgZm9yIHRoZSBWTEFOIGRldmljZS4gKi8KKwlzdGF0cyA9IHZsYW5fZGV2X2dldF9zdGF0cyhza2ItPmRldik7CisJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwlzdGF0cy0+cnhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwlza2JfcHVsbChza2IsIFZMQU5fSExFTik7IC8qIHRha2Ugb2ZmIHRoZSBWTEFOIGhlYWRlciAoNCBieXRlcyBjdXJyZW50bHkpICovCisKKwkvKiBPaywgbGV0cyBjaGVjayB0byBtYWtlIHN1cmUgdGhlIGRldmljZSAoZGV2KSB3ZQorCSAqIGNhbWUgaW4gb24gaXMgd2hhdCB0aGlzIFZMQU4gaXMgYXR0YWNoZWQgdG8uCisJICovCisKKwlpZiAoZGV2ICE9IFZMQU5fREVWX0lORk8oc2tiLT5kZXYpLT5yZWFsX2RldikgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKworI2lmZGVmIFZMQU5fREVCVUcKKwkJcHJpbnRrKFZMQU5fREJHICIlczogZHJvcHBpbmcgc2tiOiAlcCBiZWNhdXNlIGNhbWUgaW4gb24gd3JvbmcgZGV2aWNlLCBkZXY6ICVzICByZWFsX2RldjogJXMsIHNrYl9kZXY6ICVzXG4iLAorCQkJX19GVU5DVElPTl9fLCBza2IsIGRldi0+bmFtZSwgCisJCQlWTEFOX0RFVl9JTkZPKHNrYi0+ZGV2KS0+cmVhbF9kZXYtPm5hbWUsIAorCQkJc2tiLT5kZXYtPm5hbWUpOworI2VuZGlmCisJCWtmcmVlX3NrYihza2IpOworCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIERlYWwgd2l0aCBpbmdyZXNzIHByaW9yaXR5IG1hcHBpbmcuCisJICovCisJc2tiLT5wcmlvcml0eSA9IHZsYW5fZ2V0X2luZ3Jlc3NfcHJpb3JpdHkoc2tiLT5kZXYsIG50b2hzKHZoZHItPmhfdmxhbl9UQ0kpKTsKKworI2lmZGVmIFZMQU5fREVCVUcKKwlwcmludGsoVkxBTl9EQkcgIiVzOiBwcmlvcml0eTogJWx1ICBmb3IgVENJOiAlaHUgKGhibylcbiIsCisJCV9fRlVOQ1RJT05fXywgKHVuc2lnbmVkIGxvbmcpKHNrYi0+cHJpb3JpdHkpLCAKKwkJbnRvaHModmhkci0+aF92bGFuX1RDSSkpOworI2VuZGlmCisKKwkvKiBUaGUgZXRoZXJuZXQgZHJpdmVyIGFscmVhZHkgZGlkIHRoZSBwa3RfdHlwZSBjYWxjdWxhdGlvbnMKKwkgKiBmb3IgdXMuLi4KKwkgKi8KKwlzd2l0Y2ggKHNrYi0+cGt0X3R5cGUpIHsKKwljYXNlIFBBQ0tFVF9CUk9BRENBU1Q6IC8qIFllYWgsIHN0YXRzIGNvbGxlY3QgdGhlc2UgdG9nZXRoZXIuLiAqLworCQkvLyBzdGF0cy0+YnJvYWRjYXN0ICsrOyAvLyBubyBzdWNoIGNvdW50ZXIgOi0oCisJCWJyZWFrOworCisJY2FzZSBQQUNLRVRfTVVMVElDQVNUOgorCQlzdGF0cy0+bXVsdGljYXN0Kys7CisJCWJyZWFrOworCisJY2FzZSBQQUNLRVRfT1RIRVJIT1NUOiAKKwkJLyogT3VyIGxvd2VyIGxheWVyIHRoaW5rcyB0aGlzIGlzIG5vdCBsb2NhbCwgbGV0J3MgbWFrZSBzdXJlLgorCQkgKiBUaGlzIGFsbG93cyB0aGUgVkxBTiB0byBoYXZlIGEgZGlmZmVyZW50IE1BQyB0aGFuIHRoZSB1bmRlcmx5aW5nCisJCSAqIGRldmljZSwgYW5kIHN0aWxsIHJvdXRlIGNvcnJlY3RseS4KKwkJICovCisJCWlmIChtZW1jbXAoZXRoX2hkcihza2IpLT5oX2Rlc3QsIHNrYi0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pID09IDApIHsKKwkJCS8qIEl0IGlzIGZvciBvdXIgKGNoYW5nZWQpIE1BQy1hZGRyZXNzISAqLworCQkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX07CisKKwkvKiAgV2FzIGEgVkxBTiBwYWNrZXQsIGdyYWIgdGhlIGVuY2Fwc3VsYXRlZCBwcm90b2NvbCwgd2hpY2ggdGhlIGxheWVyCisJICogdGhyZWUgcHJvdG9jb2xzIGNhcmUgYWJvdXQuCisJICovCisJLyogcHJvdG8gPSBnZXRfdW5hbGlnbmVkKCZ2aGRyLT5oX3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvKTsgKi8KKwlwcm90byA9IHZoZHItPmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG87CisKKwlza2ItPnByb3RvY29sID0gcHJvdG87CisJaWYgKG50b2hzKHByb3RvKSA+PSAxNTM2KSB7CisJCS8qIHBsYWNlIGl0IGJhY2sgb24gdGhlIHF1ZXVlIHRvIGJlIGhhbmRsZWQgYnkKKwkJICogdHJ1ZSBsYXllciAzIHByb3RvY29scy4KKwkJICovCisKKwkJLyogU2VlIGlmIHdlIGFyZSBjb25maWd1cmVkIHRvIHJlLXdyaXRlIHRoZSBWTEFOIGhlYWRlcgorCQkgKiB0byBtYWtlIGl0IGxvb2sgbGlrZSBldGhlcm5ldC4uLgorCQkgKi8KKwkJc2tiID0gdmxhbl9jaGVja19yZW9yZGVyX2hlYWRlcihza2IpOworCisJCS8qIENhbiBiZSBudWxsIGlmIHNrYi1jbG9uZSBmYWlscyB3aGVuIHJlLW9yZGVyaW5nICovCisJCWlmIChza2IpIHsKKwkJCW5ldGlmX3J4KHNrYik7CisJCX0gZWxzZSB7CisJCQkvKiBUT0RPOiAgQWRkIGEgbW9yZSBzcGVjaWZpYyBjb3VudGVyIGhlcmUuICovCisJCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCX0KKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybiAwOworCX0KKworCXJhd3AgPSBza2ItPmRhdGE7CisKKwkvKgorCSAqIFRoaXMgaXMgYSBtYWdpYyBoYWNrIHRvIHNwb3QgSVBYIHBhY2tldHMuIE9sZGVyIE5vdmVsbCBicmVha3MKKwkgKiB0aGUgcHJvdG9jb2wgZGVzaWduIGFuZCBydW5zIElQWCBvdmVyIDgwMi4zIHdpdGhvdXQgYW4gODAyLjIgTExDCisJICogbGF5ZXIuIFdlIGxvb2sgZm9yIEZGRkYgd2hpY2ggaXNuJ3QgYSB1c2VkIDgwMi4yIFNTQVAvRFNBUC4gVGhpcworCSAqIHdvbid0IHdvcmsgZm9yIGZhdWx0IHRvbGVyYW50IG5ldHdhcmUgYnV0IGRvZXMgZm9yIHRoZSByZXN0LgorCSAqLworCWlmICgqKHVuc2lnbmVkIHNob3J0ICopcmF3cCA9PSAweEZGRkYpIHsKKwkJc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyXzMpOworCQkvKiBwbGFjZSBpdCBiYWNrIG9uIHRoZSBxdWV1ZSB0byBiZSBoYW5kbGVkIGJ5IHRydWUgbGF5ZXIgMyBwcm90b2NvbHMuCisJCSAqLworCisJCS8qIFNlZSBpZiB3ZSBhcmUgY29uZmlndXJlZCB0byByZS13cml0ZSB0aGUgVkxBTiBoZWFkZXIKKwkJICogdG8gbWFrZSBpdCBsb29rIGxpa2UgZXRoZXJuZXQuLi4KKwkJICovCisJCXNrYiA9IHZsYW5fY2hlY2tfcmVvcmRlcl9oZWFkZXIoc2tiKTsKKworCQkvKiBDYW4gYmUgbnVsbCBpZiBza2ItY2xvbmUgZmFpbHMgd2hlbiByZS1vcmRlcmluZyAqLworCQlpZiAoc2tiKSB7CisJCQluZXRpZl9yeChza2IpOworCQl9IGVsc2UgeworCQkJLyogVE9ETzogIEFkZCBhIG1vcmUgc3BlY2lmaWMgY291bnRlciBoZXJlLiAqLworCQkJc3RhdHMtPnJ4X2Vycm9ycysrOworCQl9CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqCVJlYWwgODAyLjIgTExDCisJICovCisJc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyXzIpOworCS8qIHBsYWNlIGl0IGJhY2sgb24gdGhlIHF1ZXVlIHRvIGJlIGhhbmRsZWQgYnkgdXBwZXIgbGF5ZXIgcHJvdG9jb2xzLgorCSAqLworCisJLyogU2VlIGlmIHdlIGFyZSBjb25maWd1cmVkIHRvIHJlLXdyaXRlIHRoZSBWTEFOIGhlYWRlcgorCSAqIHRvIG1ha2UgaXQgbG9vayBsaWtlIGV0aGVybmV0Li4uCisJICovCisJc2tiID0gdmxhbl9jaGVja19yZW9yZGVyX2hlYWRlcihza2IpOworCisJLyogQ2FuIGJlIG51bGwgaWYgc2tiLWNsb25lIGZhaWxzIHdoZW4gcmUtb3JkZXJpbmcgKi8KKwlpZiAoc2tiKSB7CisJCW5ldGlmX3J4KHNrYik7CisJfSBlbHNlIHsKKwkJLyogVE9ETzogIEFkZCBhIG1vcmUgc3BlY2lmaWMgY291bnRlciBoZXJlLiAqLworCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IHZsYW5fZGV2X2dldF9lZ3Jlc3NfcW9zX21hc2soc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKwkJCQkJCQkgIHN0cnVjdCBza19idWZmKiBza2IpCit7CisJc3RydWN0IHZsYW5fcHJpb3JpdHlfdGNpX21hcHBpbmcgKm1wID0KKwkJVkxBTl9ERVZfSU5GTyhkZXYpLT5lZ3Jlc3NfcHJpb3JpdHlfbWFwWyhza2ItPnByaW9yaXR5ICYgMHhGKV07CisKKwl3aGlsZSAobXApIHsKKwkJaWYgKG1wLT5wcmlvcml0eSA9PSBza2ItPnByaW9yaXR5KSB7CisJCQlyZXR1cm4gbXAtPnZsYW5fcW9zOyAvKiBUaGlzIHNob3VsZCBhbHJlYWR5IGJlIHNoaWZ0ZWQgdG8gbWFzaworCQkJCQkgICAgICAqIGNvcnJlY3RseSB3aXRoIHRoZSBWTEFOJ3MgVENJCisJCQkJCSAgICAgICovCisJCX0KKwkJbXAgPSBtcC0+bmV4dDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglDcmVhdGUgdGhlIFZMQU4gaGVhZGVyIGZvciBhbiBhcmJpdHJhcnkgcHJvdG9jb2wgbGF5ZXIgCisgKgorICoJc2FkZHI9TlVMTAltZWFucyB1c2UgZGV2aWNlIHNvdXJjZSBhZGRyZXNzCisgKglkYWRkcj1OVUxMCW1lYW5zIGxlYXZlIGRlc3RpbmF0aW9uIGFkZHJlc3MgKGVnIHVucmVzb2x2ZWQgYXJwKQorICoKKyAqICBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBTS0IgaXMgbW92aW5nIGRvd24gdGhlIHN0YWNrIHRvd2FyZHMgdGhlCisgKiAgcGh5c2ljYWwgZGV2aWNlcy4KKyAqLworaW50IHZsYW5fZGV2X2hhcmRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgdHlwZSwgdm9pZCAqZGFkZHIsIHZvaWQgKnNhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxlbikKK3sKKwlzdHJ1Y3Qgdmxhbl9oZHIgKnZoZHI7CisJdW5zaWduZWQgc2hvcnQgdmV0aF9UQ0kgPSAwOworCWludCByYyA9IDA7CisJaW50IGJ1aWxkX3ZsYW5faGVhZGVyID0gMDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqdmRldiA9IGRldjsgLyogc2F2ZSB0aGlzIGZvciB0aGUgYm90dG9tIG9mIHRoZSBtZXRob2QgKi8KKworI2lmZGVmIFZMQU5fREVCVUcKKwlwcmludGsoVkxBTl9EQkcgIiVzOiBza2I6ICVwIHR5cGU6ICVoeCBsZW46ICV4IHZsYW5faWQ6ICVoeCwgZGFkZHI6ICVwXG4iLAorCQlfX0ZVTkNUSU9OX18sIHNrYiwgdHlwZSwgbGVuLCBWTEFOX0RFVl9JTkZPKGRldiktPnZsYW5faWQsIGRhZGRyKTsKKyNlbmRpZgorCisJLyogYnVpbGQgdmxhbiBoZWFkZXIgb25seSBpZiByZV9vcmRlcl9oZWFkZXIgZmxhZyBpcyBOT1Qgc2V0LiAgVGhpcworCSAqIGZpeGVzIHNvbWUgcHJvZ3JhbXMgdGhhdCBnZXQgY29uZnVzZWQgd2hlbiB0aGV5IHNlZSBhIFZMQU4gZGV2aWNlCisJICogc2VuZGluZyBhIGZyYW1lIHRoYXQgaXMgVkxBTiBlbmNvZGVkICh0aGUgY29uc2Vuc3VzIGlzIHRoYXQgdGhlIFZMQU4KKwkgKiBkZXZpY2Ugc2hvdWxkIGxvb2sgY29tcGxldGVseSBsaWtlIGFuIEV0aGVybmV0IGRldmljZSB3aGVuIHRoZQorCSAqIFJFT1JERVJfSEVBREVSIGZsYWcgaXMgc2V0KQlUaGUgZHJhd2JhY2sgdG8gdGhpcyBpcyBzb21lIGV4dHJhIAorCSAqIGhlYWRlciBzaHVmZmxpbmcgaW4gdGhlIGhhcmRfc3RhcnRfeG1pdC4gIFVzZXJzIGNhbiB0dXJuIG9mZiB0aGlzCisJICogUkVPUkRFUiBiZWhhdmlvdXIgd2l0aCB0aGUgdmNvbmZpZyB0b29sLgorCSAqLworCWJ1aWxkX3ZsYW5faGVhZGVyID0gKChWTEFOX0RFVl9JTkZPKGRldiktPmZsYWdzICYgMSkgPT0gMCk7CisKKwlpZiAoYnVpbGRfdmxhbl9oZWFkZXIpIHsKKwkJdmhkciA9IChzdHJ1Y3Qgdmxhbl9oZHIgKikgc2tiX3B1c2goc2tiLCBWTEFOX0hMRU4pOworCisJCS8qIGJ1aWxkIHRoZSBmb3VyIGJ5dGVzIHRoYXQgbWFrZSB0aGlzIGEgVkxBTiBoZWFkZXIuICovCisKKwkJLyogTm93LCBjb25zdHJ1Y3QgdGhlIHNlY29uZCB0d28gYnl0ZXMuIFRoaXMgZmllbGQgbG9va3Mgc29tZXRoaW5nCisJCSAqIGxpa2U6CisJCSAqIHVzcl9wcmlvcml0eTogMyBiaXRzCSAoaGlnaCBiaXRzKQorCQkgKiBDRkkJCSAxIGJpdAorCQkgKiBWTEFOIElECSAxMiBiaXRzIChsb3cgYml0cykKKwkJICoKKwkJICovCisJCXZldGhfVENJID0gVkxBTl9ERVZfSU5GTyhkZXYpLT52bGFuX2lkOworCQl2ZXRoX1RDSSB8PSB2bGFuX2Rldl9nZXRfZWdyZXNzX3Fvc19tYXNrKGRldiwgc2tiKTsKKworCQl2aGRyLT5oX3ZsYW5fVENJID0gaHRvbnModmV0aF9UQ0kpOworCisJCS8qCisJCSAqICBTZXQgdGhlIHByb3RvY29sIHR5cGUuCisJCSAqICBGb3IgYSBwYWNrZXQgb2YgdHlwZSBFVEhfUF84MDJfMyB3ZSBwdXQgdGhlIGxlbmd0aCBpbiBoZXJlIGluc3RlYWQuCisJCSAqICBJdCBpcyB1cCB0byB0aGUgODAyLjIgbGF5ZXIgdG8gY2FycnkgcHJvdG9jb2wgaW5mb3JtYXRpb24uCisJCSAqLworCisJCWlmICh0eXBlICE9IEVUSF9QXzgwMl8zKSB7CisJCQl2aGRyLT5oX3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvID0gaHRvbnModHlwZSk7CisJCX0gZWxzZSB7CisJCQl2aGRyLT5oX3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvID0gaHRvbnMobGVuKTsKKwkJfQorCX0KKworCS8qIEJlZm9yZSBkZWxlZ2F0aW5nIHdvcmsgdG8gdGhlIGxvd2VyIGxheWVyLCBlbnRlciBvdXIgTUFDLWFkZHJlc3MgKi8KKwlpZiAoc2FkZHIgPT0gTlVMTCkKKwkJc2FkZHIgPSBkZXYtPmRldl9hZGRyOworCisJZGV2ID0gVkxBTl9ERVZfSU5GTyhkZXYpLT5yZWFsX2RldjsKKworCS8qIE1QTFMgY2FuIHNlbmQgdXMgc2tidWZmcyB3L291dCBlbm91Z2ggc3BhY2UuCSBUaGlzIGNoZWNrIHdpbGwgZ3JvdyB0aGUKKwkgKiBza2IgaWYgaXQgZG9lc24ndCBoYXZlIGVub3VnaCBoZWFkcm9vbS4gIE5vdCBhIGJlYXV0aWZ1bCBzb2x1dGlvbiwgc28KKwkgKiBJJ2xsIHRpY2sgYSBjb3VudGVyIHNvIHRoYXQgdXNlcnMgY2FuIGtub3cgaXQncyBoYXBwZW5pbmcuLi4JIElmIHRoZXkKKwkgKiBjYXJlLi4uCisJICovCisKKwkvKiBOT1RFOiAgVGhpcyBtYXkgc3RpbGwgYnJlYWsgaWYgdGhlIHVuZGVybHlpbmcgZGV2aWNlIGlzIG5vdCB0aGUgZmluYWwKKwkgKiBkZXZpY2UgKGFuZCB0aHVzIHRoZXJlIGFyZSBtb3JlIGhlYWRlcnMgdG8gYWRkLi4uKSAgSXQgc2hvdWxkIHdvcmsgZm9yCisJICogZ29vZC1vbGUtZXRoZXJuZXQgdGhvdWdoLgorCSAqLworCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IGRldi0+aGFyZF9oZWFkZXJfbGVuKSB7CisJCXN0cnVjdCBza19idWZmICpza190bXAgPSBza2I7CisJCXNrYiA9IHNrYl9yZWFsbG9jX2hlYWRyb29tKHNrX3RtcCwgZGV2LT5oYXJkX2hlYWRlcl9sZW4pOworCQlrZnJlZV9za2Ioc2tfdG1wKTsKKwkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSB2bGFuX2Rldl9nZXRfc3RhdHModmRldik7CisJCQlzdGF0cy0+dHhfZHJvcHBlZCsrOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJVkxBTl9ERVZfSU5GTyh2ZGV2KS0+Y250X2luY19oZWFkcm9vbV9vbl90eCsrOworI2lmZGVmIFZMQU5fREVCVUcKKwkJcHJpbnRrKFZMQU5fREJHICIlczogJXM6IGhhZCB0byBncm93IHNrYi5cbiIsIF9fRlVOQ1RJT05fXywgdmRldi0+bmFtZSk7CisjZW5kaWYKKwl9CisKKwlpZiAoYnVpbGRfdmxhbl9oZWFkZXIpIHsKKwkJLyogTm93IG1ha2UgdGhlIHVuZGVybHlpbmcgcmVhbCBoYXJkIGhlYWRlciAqLworCQlyYyA9IGRldi0+aGFyZF9oZWFkZXIoc2tiLCBkZXYsIEVUSF9QXzgwMjFRLCBkYWRkciwgc2FkZHIsIGxlbiArIFZMQU5fSExFTik7CisKKwkJaWYgKHJjID4gMCkgeworCQkJcmMgKz0gVkxBTl9ITEVOOworCQl9IGVsc2UgaWYgKHJjIDwgMCkgeworCQkJcmMgLT0gVkxBTl9ITEVOOworCQl9CisJfSBlbHNlIHsKKwkJLyogSWYgaGVyZSwgdGhlbiB3ZSdsbCBqdXN0IG1ha2UgYSBub3JtYWwgbG9va2luZyBldGhlcm5ldCBmcmFtZSwKKwkJICogYnV0LCB0aGUgaGFyZF9zdGFydF94bWl0IG1ldGhvZCB3aWxsIGluc2VydCB0aGUgdGFnIChpdCBoYXMgdG8KKwkJICogYmUgYWJsZSB0byBkbyB0aGlzIGZvciBicmlkZ2VkIGFuZCBvdGhlciBza2JzIHRoYXQgZG9uJ3QgY29tZQorCQkgKiBkb3duIHRoZSBwcm90b2NvbCBzdGFjayBpbiBhbiBvcmRlcmx5IG1hbm5lci4KKwkJICovCisJCXJjID0gZGV2LT5oYXJkX2hlYWRlcihza2IsIGRldiwgdHlwZSwgZGFkZHIsIHNhZGRyLCBsZW4pOworCX0KKworCXJldHVybiByYzsKK30KKworaW50IHZsYW5fZGV2X2hhcmRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IHZsYW5fZGV2X2dldF9zdGF0cyhkZXYpOworCXN0cnVjdCB2bGFuX2V0aGhkciAqdmV0aCA9IChzdHJ1Y3Qgdmxhbl9ldGhoZHIgKikoc2tiLT5kYXRhKTsKKworCS8qIEhhbmRsZSBub24tVkxBTiBmcmFtZXMgaWYgdGhleSBhcmUgc2VudCB0byB1cywgZm9yIGV4YW1wbGUgYnkgREhDUC4KKwkgKgorCSAqIE5PVEU6IFRISVMgQVNTVU1FUyBESVggRVRIRVJORVQsIFNQRUNJRklDQUxMWSBOT1QgU1VQUE9SVElORworCSAqIE9USEVSIFRISU5HUyBMSUtFIEZEREkvVG9rZW5SaW5nLzgwMi4zIFNOQVBzLi4uCisJICovCisKKwlpZiAodmV0aC0+aF92bGFuX3Byb3RvICE9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyMVEpKSB7CisJCWludCBvcmlnX2hlYWRyb29tID0gc2tiX2hlYWRyb29tKHNrYik7CisJCXVuc2lnbmVkIHNob3J0IHZldGhfVENJOworCisJCS8qIFRoaXMgaXMgbm90IGEgVkxBTiBmcmFtZS4uLmJ1dCB3ZSBjYW4gZml4IHRoYXQhICovCisJCVZMQU5fREVWX0lORk8oZGV2KS0+Y250X2VuY2FwX29uX3htaXQrKzsKKworI2lmZGVmIFZMQU5fREVCVUcKKwkJcHJpbnRrKFZMQU5fREJHICIlczogcHJvdG8gdG8gZW5jYXA6IDB4JWh4IChoYm8pXG4iLAorCQkJX19GVU5DVElPTl9fLCBodG9ucyh2ZXRoLT5oX3ZsYW5fcHJvdG8pKTsKKyNlbmRpZgorCQkvKiBDb25zdHJ1Y3QgdGhlIHNlY29uZCB0d28gYnl0ZXMuIFRoaXMgZmllbGQgbG9va3Mgc29tZXRoaW5nCisJCSAqIGxpa2U6CisJCSAqIHVzcl9wcmlvcml0eTogMyBiaXRzCSAoaGlnaCBiaXRzKQorCQkgKiBDRkkJCSAxIGJpdAorCQkgKiBWTEFOIElECSAxMiBiaXRzIChsb3cgYml0cykKKwkJICovCisJCXZldGhfVENJID0gVkxBTl9ERVZfSU5GTyhkZXYpLT52bGFuX2lkOworCQl2ZXRoX1RDSSB8PSB2bGFuX2Rldl9nZXRfZWdyZXNzX3Fvc19tYXNrKGRldiwgc2tiKTsKKworCQlza2IgPSBfX3ZsYW5fcHV0X3RhZyhza2IsIHZldGhfVENJKTsKKwkJaWYgKCFza2IpIHsKKwkJCXN0YXRzLT50eF9kcm9wcGVkKys7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChvcmlnX2hlYWRyb29tIDwgVkxBTl9ITEVOKSB7CisJCQlWTEFOX0RFVl9JTkZPKGRldiktPmNudF9pbmNfaGVhZHJvb21fb25fdHgrKzsKKwkJfQorCX0KKworI2lmZGVmIFZMQU5fREVCVUcKKwlwcmludGsoVkxBTl9EQkcgIiVzOiBhYm91dCB0byBzZW5kIHNrYjogJXAgdG8gZGV2OiAlc1xuIiwKKwkJX19GVU5DVElPTl9fLCBza2IsIHNrYi0+ZGV2LT5uYW1lKTsKKwlwcmludGsoVkxBTl9EQkcgIiAgJTJoeC4lMmh4LiUyaHguJTJ4aC4lMmh4LiUyaHggJTJoeC4lMmh4LiUyaHguJTJoeC4lMmh4LiUyaHggJTRoeCAlNGh4ICU0aHhcbiIsCisJICAgICAgIHZldGgtPmhfZGVzdFswXSwgdmV0aC0+aF9kZXN0WzFdLCB2ZXRoLT5oX2Rlc3RbMl0sIHZldGgtPmhfZGVzdFszXSwgdmV0aC0+aF9kZXN0WzRdLCB2ZXRoLT5oX2Rlc3RbNV0sCisJICAgICAgIHZldGgtPmhfc291cmNlWzBdLCB2ZXRoLT5oX3NvdXJjZVsxXSwgdmV0aC0+aF9zb3VyY2VbMl0sIHZldGgtPmhfc291cmNlWzNdLCB2ZXRoLT5oX3NvdXJjZVs0XSwgdmV0aC0+aF9zb3VyY2VbNV0sCisJICAgICAgIHZldGgtPmhfdmxhbl9wcm90bywgdmV0aC0+aF92bGFuX1RDSSwgdmV0aC0+aF92bGFuX2VuY2Fwc3VsYXRlZF9wcm90byk7CisjZW5kaWYKKworCXN0YXRzLT50eF9wYWNrZXRzKys7IC8qIGZvciBzdGF0aWNzIG9ubHkgKi8KKwlzdGF0cy0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwlza2ItPmRldiA9IFZMQU5fREVWX0lORk8oZGV2KS0+cmVhbF9kZXY7CisJZGV2X3F1ZXVlX3htaXQoc2tiKTsKKworCXJldHVybiAwOworfQorCitpbnQgdmxhbl9kZXZfaHdhY2NlbF9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSB2bGFuX2Rldl9nZXRfc3RhdHMoZGV2KTsKKwl1bnNpZ25lZCBzaG9ydCB2ZXRoX1RDSTsKKworCS8qIENvbnN0cnVjdCB0aGUgc2Vjb25kIHR3byBieXRlcy4gVGhpcyBmaWVsZCBsb29rcyBzb21ldGhpbmcKKwkgKiBsaWtlOgorCSAqIHVzcl9wcmlvcml0eTogMyBiaXRzCSAoaGlnaCBiaXRzKQorCSAqIENGSQkJIDEgYml0CisJICogVkxBTiBJRAkgMTIgYml0cyAobG93IGJpdHMpCisJICovCisJdmV0aF9UQ0kgPSBWTEFOX0RFVl9JTkZPKGRldiktPnZsYW5faWQ7CisJdmV0aF9UQ0kgfD0gdmxhbl9kZXZfZ2V0X2VncmVzc19xb3NfbWFzayhkZXYsIHNrYik7CisJc2tiID0gX192bGFuX2h3YWNjZWxfcHV0X3RhZyhza2IsIHZldGhfVENJKTsKKworCXN0YXRzLT50eF9wYWNrZXRzKys7CisJc3RhdHMtPnR4X2J5dGVzICs9IHNrYi0+bGVuOworCisJc2tiLT5kZXYgPSBWTEFOX0RFVl9JTkZPKGRldiktPnJlYWxfZGV2OworCWRldl9xdWV1ZV94bWl0KHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHZsYW5fZGV2X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJLyogVE9ETzogZ290dGEgbWFrZSBzdXJlIHRoZSB1bmRlcmx5aW5nIGxheWVyIGNhbiBoYW5kbGUgaXQsCisJICogbWF5YmUgYW4gSUZGX1ZMQU5fQ0FQQUJMRSBmbGFnIGZvciBkZXZpY2VzPworCSAqLworCWlmIChWTEFOX0RFVl9JTkZPKGRldiktPnJlYWxfZGV2LT5tdHUgPCBuZXdfbXR1KQorCQlyZXR1cm4gLUVSQU5HRTsKKworCWRldi0+bXR1ID0gbmV3X210dTsKKworCXJldHVybiAwOworfQorCitpbnQgdmxhbl9kZXZfc2V0X2luZ3Jlc3NfcHJpb3JpdHkoY2hhciAqZGV2X25hbWUsIF9fdTMyIHNrYl9wcmlvLCBzaG9ydCB2bGFuX3ByaW8pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9nZXRfYnlfbmFtZShkZXZfbmFtZSk7CisKKwlpZiAoZGV2KSB7CisJCWlmIChkZXYtPnByaXZfZmxhZ3MgJiBJRkZfODAyXzFRX1ZMQU4pIHsKKwkJCS8qIHNlZSBpZiBhIHByaW9yaXR5IG1hcHBpbmcgZXhpc3RzLi4gKi8KKwkJCVZMQU5fREVWX0lORk8oZGV2KS0+aW5ncmVzc19wcmlvcml0eV9tYXBbdmxhbl9wcmlvICYgMHg3XSA9IHNrYl9wcmlvOworCQkJZGV2X3B1dChkZXYpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlkZXZfcHV0KGRldik7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitpbnQgdmxhbl9kZXZfc2V0X2VncmVzc19wcmlvcml0eShjaGFyICpkZXZfbmFtZSwgX191MzIgc2tiX3ByaW8sIHNob3J0IHZsYW5fcHJpbykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2dldF9ieV9uYW1lKGRldl9uYW1lKTsKKwlzdHJ1Y3Qgdmxhbl9wcmlvcml0eV90Y2lfbWFwcGluZyAqbXAgPSBOVUxMOworCXN0cnVjdCB2bGFuX3ByaW9yaXR5X3RjaV9tYXBwaW5nICpucDsKKyAgIAorCWlmIChkZXYpIHsKKwkJaWYgKGRldi0+cHJpdl9mbGFncyAmIElGRl84MDJfMVFfVkxBTikgeworCQkJLyogU2VlIGlmIGEgcHJpb3JpdHkgbWFwcGluZyBleGlzdHMuLiAqLworCQkJbXAgPSBWTEFOX0RFVl9JTkZPKGRldiktPmVncmVzc19wcmlvcml0eV9tYXBbc2tiX3ByaW8gJiAweEZdOworCQkJd2hpbGUgKG1wKSB7CisJCQkJaWYgKG1wLT5wcmlvcml0eSA9PSBza2JfcHJpbykgeworCQkJCQltcC0+dmxhbl9xb3MgPSAoKHZsYW5fcHJpbyA8PCAxMykgJiAweEUwMDApOworCQkJCQlkZXZfcHV0KGRldik7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQltcCA9IG1wLT5uZXh0OworCQkJfQorCisJCQkvKiBDcmVhdGUgYSBuZXcgbWFwcGluZyB0aGVuLiAqLworCQkJbXAgPSBWTEFOX0RFVl9JTkZPKGRldiktPmVncmVzc19wcmlvcml0eV9tYXBbc2tiX3ByaW8gJiAweEZdOworCQkJbnAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdmxhbl9wcmlvcml0eV90Y2lfbWFwcGluZyksIEdGUF9LRVJORUwpOworCQkJaWYgKG5wKSB7CisJCQkJbnAtPm5leHQgPSBtcDsKKwkJCQlucC0+cHJpb3JpdHkgPSBza2JfcHJpbzsKKwkJCQlucC0+dmxhbl9xb3MgPSAoKHZsYW5fcHJpbyA8PCAxMykgJiAweEUwMDApOworCQkJCVZMQU5fREVWX0lORk8oZGV2KS0+ZWdyZXNzX3ByaW9yaXR5X21hcFtza2JfcHJpbyAmIDB4Rl0gPSBucDsKKwkJCQlkZXZfcHV0KGRldik7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgeworCQkJCWRldl9wdXQoZGV2KTsKKwkJCQlyZXR1cm4gLUVOT0JVRlM7CisJCQl9CisJCX0KKwkJZGV2X3B1dChkZXYpOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogRmxhZ3MgYXJlIGRlZmluZWQgaW4gdGhlIHZsYW5fZGV2X2luZm8gY2xhc3MgaW4gaW5jbHVkZS9saW51eC9pZl92bGFuLmggZmlsZS4gKi8KK2ludCB2bGFuX2Rldl9zZXRfdmxhbl9mbGFnKGNoYXIgKmRldl9uYW1lLCBfX3UzMiBmbGFnLCBzaG9ydCBmbGFnX3ZhbCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2dldF9ieV9uYW1lKGRldl9uYW1lKTsKKworCWlmIChkZXYpIHsKKwkJaWYgKGRldi0+cHJpdl9mbGFncyAmIElGRl84MDJfMVFfVkxBTikgeworCQkJLyogdmVyaWZ5IGZsYWcgaXMgc3VwcG9ydGVkICovCisJCQlpZiAoZmxhZyA9PSAxKSB7CisJCQkJaWYgKGZsYWdfdmFsKSB7CisJCQkJCVZMQU5fREVWX0lORk8oZGV2KS0+ZmxhZ3MgfD0gMTsKKwkJCQl9IGVsc2UgeworCQkJCQlWTEFOX0RFVl9JTkZPKGRldiktPmZsYWdzICY9IH4xOworCQkJCX0KKwkJCQlkZXZfcHV0KGRldik7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX0VSUiAgIiVzOiBmbGFnICVpIGlzIG5vdCB2YWxpZC5cbiIsCisJCQkJCV9fRlVOQ1RJT05fXywgKGludCkoZmxhZykpOworCQkJCWRldl9wdXQoZGV2KTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0VSUiAKKwkJCSAgICAgICAiJXM6ICVzIGlzIG5vdCBhIHZsYW4gZGV2aWNlLCBwcml2X2ZsYWdzOiAlaFguXG4iLAorCQkJICAgICAgIF9fRlVOQ1RJT05fXywgZGV2LT5uYW1lLCBkZXYtPnByaXZfZmxhZ3MpOworCQkJZGV2X3B1dChkZXYpOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICAiJXM6IENvdWxkIG5vdCBmaW5kIGRldmljZTogJXNcbiIsIAorCQkJX19GVU5DVElPTl9fLCBkZXZfbmFtZSk7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKworaW50IHZsYW5fZGV2X2dldF9yZWFsZGV2X25hbWUoY29uc3QgY2hhciAqZGV2X25hbWUsIGNoYXIqIHJlc3VsdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2dldF9ieV9uYW1lKGRldl9uYW1lKTsKKwlpbnQgcnYgPSAwOworCWlmIChkZXYpIHsKKwkJaWYgKGRldi0+cHJpdl9mbGFncyAmIElGRl84MDJfMVFfVkxBTikgeworCQkJc3RybmNweShyZXN1bHQsIFZMQU5fREVWX0lORk8oZGV2KS0+cmVhbF9kZXYtPm5hbWUsIDIzKTsKKwkJCXJ2ID0gMDsKKwkJfSBlbHNlIHsKKwkJCXJ2ID0gLUVJTlZBTDsKKwkJfQorCQlkZXZfcHV0KGRldik7CisJfSBlbHNlIHsKKwkJcnYgPSAtRU5PREVWOworCX0KKwlyZXR1cm4gcnY7Cit9CisKK2ludCB2bGFuX2Rldl9nZXRfdmlkKGNvbnN0IGNoYXIgKmRldl9uYW1lLCB1bnNpZ25lZCBzaG9ydCogcmVzdWx0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZ2V0X2J5X25hbWUoZGV2X25hbWUpOworCWludCBydiA9IDA7CisJaWYgKGRldikgeworCQlpZiAoZGV2LT5wcml2X2ZsYWdzICYgSUZGXzgwMl8xUV9WTEFOKSB7CisJCQkqcmVzdWx0ID0gVkxBTl9ERVZfSU5GTyhkZXYpLT52bGFuX2lkOworCQkJcnYgPSAwOworCQl9IGVsc2UgeworCQkJcnYgPSAtRUlOVkFMOworCQl9CisJCWRldl9wdXQoZGV2KTsKKwl9IGVsc2UgeworCQlydiA9IC1FTk9ERVY7CisJfQorCXJldHVybiBydjsKK30KKworCitpbnQgdmxhbl9kZXZfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHJfc3RydWN0X3ApCit7CisJc3RydWN0IHNvY2thZGRyICphZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKShhZGRyX3N0cnVjdF9wKTsKKwlpbnQgaTsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUJVU1k7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisKKwlwcmludGsoIiVzOiBTZXR0aW5nIE1BQyBhZGRyZXNzIHRvICIsIGRldi0+bmFtZSk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIgJTIuMngiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIi5cbiIpOworCisJaWYgKG1lbWNtcChWTEFOX0RFVl9JTkZPKGRldiktPnJlYWxfZGV2LT5kZXZfYWRkciwKKwkJICAgZGV2LT5kZXZfYWRkciwKKwkJICAgZGV2LT5hZGRyX2xlbikgIT0gMCkgeworCQlpZiAoIShWTEFOX0RFVl9JTkZPKGRldiktPnJlYWxfZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSkgeworCQkJaW50IGZsZ3MgPSBWTEFOX0RFVl9JTkZPKGRldiktPnJlYWxfZGV2LT5mbGFnczsKKworCQkJLyogSW5jcmVtZW50IG91ciBpbi11c2UgcHJvbWlzY3VpdHkgY291bnRlciAqLworCQkJZGV2X3NldF9wcm9taXNjdWl0eShWTEFOX0RFVl9JTkZPKGRldiktPnJlYWxfZGV2LCAxKTsKKworCQkJLyogTWFrZSBQUk9NSVNDIHZpc2libGUgdG8gdGhlIHVzZXIuICovCisJCQlmbGdzIHw9IElGRl9QUk9NSVNDOworCQkJcHJpbnRrKCJWTEFOICglcyk6ICBTZXR0aW5nIHVuZGVybHlpbmcgZGV2aWNlICglcykgdG8gcHJvbWlzY2lvdXMgbW9kZS5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBWTEFOX0RFVl9JTkZPKGRldiktPnJlYWxfZGV2LT5uYW1lKTsKKwkJCWRldl9jaGFuZ2VfZmxhZ3MoVkxBTl9ERVZfSU5GTyhkZXYpLT5yZWFsX2RldiwgZmxncyk7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGsoIlZMQU4gKCVzKTogIFVuZGVybHlpbmcgZGV2aWNlICglcykgaGFzIHNhbWUgTUFDLCBub3QgY2hlY2tpbmcgcHJvbWlzY2lvdXMgbW9kZS5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIFZMQU5fREVWX0lORk8oZGV2KS0+cmVhbF9kZXYtPm5hbWUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCB2bGFuX2RtaV9lcXVhbHMoc3RydWN0IGRldl9tY19saXN0ICpkbWkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pMikKK3sKKwlyZXR1cm4gKChkbWkxLT5kbWlfYWRkcmxlbiA9PSBkbWkyLT5kbWlfYWRkcmxlbikgJiYKKwkJKG1lbWNtcChkbWkxLT5kbWlfYWRkciwgZG1pMi0+ZG1pX2FkZHIsIGRtaTEtPmRtaV9hZGRybGVuKSA9PSAwKSk7Cit9CisKKy8qKiBkbWkgaXMgYSBzaW5nbGUgZW50cnkgaW50byBhIGRldl9tY19saXN0LCBhIHNpbmdsZSBub2RlLiAgbWNfbGlzdCBpcworICogIGFuIGVudGlyZSBsaXN0LCBhbmQgd2UnbGwgaXRlcmF0ZSB0aHJvdWdoIGl0LgorICovCitzdGF0aWMgaW50IHZsYW5fc2hvdWxkX2FkZF9tYyhzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSwgc3RydWN0IGRldl9tY19saXN0ICptY19saXN0KQoreworCXN0cnVjdCBkZXZfbWNfbGlzdCAqaWRtaTsKKworCWZvciAoaWRtaSA9IG1jX2xpc3Q7IGlkbWkgIT0gTlVMTDsgKSB7CisJCWlmICh2bGFuX2RtaV9lcXVhbHMoZG1pLCBpZG1pKSkgeworCQkJaWYgKGRtaS0+ZG1pX3VzZXJzID4gaWRtaS0+ZG1pX3VzZXJzKQorCQkJCXJldHVybiAxOworCQkJZWxzZQorCQkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJaWRtaSA9IGlkbWktPm5leHQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZsYW5fZGVzdHJveV9tY19saXN0KHN0cnVjdCBkZXZfbWNfbGlzdCAqbWNfbGlzdCkKK3sKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA9IG1jX2xpc3Q7CisJc3RydWN0IGRldl9tY19saXN0ICpuZXh0OworCisJd2hpbGUoZG1pKSB7CisJCW5leHQgPSBkbWktPm5leHQ7CisJCWtmcmVlKGRtaSk7CisJCWRtaSA9IG5leHQ7CisJfQorfQorCitzdGF0aWMgdm9pZCB2bGFuX2NvcHlfbWNfbGlzdChzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jX2xpc3QsIHN0cnVjdCB2bGFuX2Rldl9pbmZvICp2bGFuX2luZm8pCit7CisJc3RydWN0IGRldl9tY19saXN0ICpkbWksICpuZXdfZG1pOworCisJdmxhbl9kZXN0cm95X21jX2xpc3Qodmxhbl9pbmZvLT5vbGRfbWNfbGlzdCk7CisJdmxhbl9pbmZvLT5vbGRfbWNfbGlzdCA9IE5VTEw7CisKKwlmb3IgKGRtaSA9IG1jX2xpc3Q7IGRtaSAhPSBOVUxMOyBkbWkgPSBkbWktPm5leHQpIHsKKwkJbmV3X2RtaSA9IGttYWxsb2Moc2l6ZW9mKCpuZXdfZG1pKSwgR0ZQX0FUT01JQyk7CisJCWlmIChuZXdfZG1pID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAidmxhbjogY2Fubm90IGFsbG9jYXRlIG1lbW9yeS4gIgorCQkJICAgICAgICJNdWx0aWNhc3QgbWF5IG5vdCB3b3JrIHByb3Blcmx5IGZyb20gbm93LlxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBDb3B5IHdob2xlIHN0cnVjdHVyZSwgdGhlbiBtYWtlIG5ldyAnbmV4dCcgcG9pbnRlciAqLworCQkqbmV3X2RtaSA9ICpkbWk7CisJCW5ld19kbWktPm5leHQgPSB2bGFuX2luZm8tPm9sZF9tY19saXN0OworCQl2bGFuX2luZm8tPm9sZF9tY19saXN0ID0gbmV3X2RtaTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZsYW5fZmx1c2hfbWNfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pID0gZGV2LT5tY19saXN0OworCisJd2hpbGUgKGRtaSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGRlbCAlLjJ4OiUuMng6JS4yeDolLjJ4OiUuMng6JS4yeCBtY2FzdCBhZGRyZXNzIGZyb20gdmxhbiBpbnRlcmZhY2VcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsCisJCSAgICAgICBkbWktPmRtaV9hZGRyWzBdLAorCQkgICAgICAgZG1pLT5kbWlfYWRkclsxXSwKKwkJICAgICAgIGRtaS0+ZG1pX2FkZHJbMl0sCisJCSAgICAgICBkbWktPmRtaV9hZGRyWzNdLAorCQkgICAgICAgZG1pLT5kbWlfYWRkcls0XSwKKwkJICAgICAgIGRtaS0+ZG1pX2FkZHJbNV0pOworCQlkZXZfbWNfZGVsZXRlKGRldiwgZG1pLT5kbWlfYWRkciwgZG1pLT5kbWlfYWRkcmxlbiwgMCk7CisJCWRtaSA9IGRldi0+bWNfbGlzdDsKKwl9CisKKwkvKiBkZXYtPm1jX2xpc3QgaXMgTlVMTCBieSB0aGUgdGltZSB3ZSBnZXQgaGVyZS4gKi8KKwl2bGFuX2Rlc3Ryb3lfbWNfbGlzdChWTEFOX0RFVl9JTkZPKGRldiktPm9sZF9tY19saXN0KTsKKwlWTEFOX0RFVl9JTkZPKGRldiktPm9sZF9tY19saXN0ID0gTlVMTDsKK30KKworaW50IHZsYW5fZGV2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoIShWTEFOX0RFVl9JTkZPKGRldiktPnJlYWxfZGV2LT5mbGFncyAmIElGRl9VUCkpCisJCXJldHVybiAtRU5FVERPV047CisKKwlyZXR1cm4gMDsKK30KKworaW50IHZsYW5fZGV2X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl2bGFuX2ZsdXNoX21jX2xpc3QoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworaW50IHZsYW5fZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiA9IFZMQU5fREVWX0lORk8oZGV2KS0+cmVhbF9kZXY7CisJc3RydWN0IGlmcmVxIGlmcnI7CisJaW50IGVyciA9IC1FT1BOT1RTVVBQOworCisJc3RybmNweShpZnJyLmlmcl9uYW1lLCByZWFsX2Rldi0+bmFtZSwgSUZOQU1TSVopOworCWlmcnIuaWZyX2lmcnUgPSBpZnItPmlmcl9pZnJ1OworCisJc3dpdGNoKGNtZCkgeworCWNhc2UgU0lPQ0dNSUlQSFk6CisJY2FzZSBTSU9DR01JSVJFRzoKKwljYXNlIFNJT0NTTUlJUkVHOgorCQlpZiAocmVhbF9kZXYtPmRvX2lvY3RsICYmIG5ldGlmX2RldmljZV9wcmVzZW50KHJlYWxfZGV2KSkgCisJCQllcnIgPSByZWFsX2Rldi0+ZG9faW9jdGwocmVhbF9kZXYsICZpZnJyLCBjbWQpOworCQlicmVhazsKKworCWNhc2UgU0lPQ0VUSFRPT0w6CisJCWVyciA9IGRldl9ldGh0b29sKCZpZnJyKTsKKwl9CisKKwlpZiAoIWVycikgCisJCWlmci0+aWZyX2lmcnUgPSBpZnJyLmlmcl9pZnJ1OworCisJcmV0dXJuIGVycjsKK30KKworLyoqIFRha2VuIGZyb20gR2xlYiArIExlbm5lcnQncyBWTEFOIGNvZGUsIGFuZCBtb2RpZmllZC4uLiAqLwordm9pZCB2bGFuX2Rldl9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKnZsYW5fZGV2KQoreworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pOworCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldjsKKwlpbnQgaW5jOworCisJaWYgKHZsYW5fZGV2ICYmICh2bGFuX2Rldi0+cHJpdl9mbGFncyAmIElGRl84MDJfMVFfVkxBTikpIHsKKwkJLyogVGhlbiBpdCdzIGEgcmVhbCB2bGFuIGRldmljZSwgYXMgZmFyIGFzIHdlIGNhbiB0ZWxsLi4gKi8KKwkJcmVhbF9kZXYgPSBWTEFOX0RFVl9JTkZPKHZsYW5fZGV2KS0+cmVhbF9kZXY7CisKKwkJLyogY29tcGFyZSB0aGUgY3VycmVudCBwcm9taXNjdWl0eSB0byB0aGUgbGFzdCBwcm9taXNjIHdlIGhhZC4uICovCisJCWluYyA9IHZsYW5fZGV2LT5wcm9taXNjdWl0eSAtIFZMQU5fREVWX0lORk8odmxhbl9kZXYpLT5vbGRfcHJvbWlzY3VpdHk7CisJCWlmIChpbmMpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBkZXZfc2V0X3Byb21pc2N1aXR5KG1hc3RlciwgJWQpXG4iLAorCQkJICAgICAgIHZsYW5fZGV2LT5uYW1lLCBpbmMpOworCQkJZGV2X3NldF9wcm9taXNjdWl0eShyZWFsX2RldiwgaW5jKTsgLyogZm91bmQgaW4gZGV2LmMgKi8KKwkJCVZMQU5fREVWX0lORk8odmxhbl9kZXYpLT5vbGRfcHJvbWlzY3VpdHkgPSB2bGFuX2Rldi0+cHJvbWlzY3VpdHk7CisJCX0KKworCQlpbmMgPSB2bGFuX2Rldi0+YWxsbXVsdGkgLSBWTEFOX0RFVl9JTkZPKHZsYW5fZGV2KS0+b2xkX2FsbG11bHRpOworCQlpZiAoaW5jKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogZGV2X3NldF9hbGxtdWx0aShtYXN0ZXIsICVkKVxuIiwKKwkJCSAgICAgICB2bGFuX2Rldi0+bmFtZSwgaW5jKTsKKwkJCWRldl9zZXRfYWxsbXVsdGkocmVhbF9kZXYsIGluYyk7IC8qIGRldi5jICovCisJCQlWTEFOX0RFVl9JTkZPKHZsYW5fZGV2KS0+b2xkX2FsbG11bHRpID0gdmxhbl9kZXYtPmFsbG11bHRpOworCQl9CisKKwkJLyogbG9va2luZyBmb3IgYWRkcmVzc2VzIHRvIGFkZCB0byBtYXN0ZXIncyBsaXN0ICovCisJCWZvciAoZG1pID0gdmxhbl9kZXYtPm1jX2xpc3Q7IGRtaSAhPSBOVUxMOyBkbWkgPSBkbWktPm5leHQpIHsKKwkJCWlmICh2bGFuX3Nob3VsZF9hZGRfbWMoZG1pLCBWTEFOX0RFVl9JTkZPKHZsYW5fZGV2KS0+b2xkX21jX2xpc3QpKSB7CisJCQkJZGV2X21jX2FkZChyZWFsX2RldiwgZG1pLT5kbWlfYWRkciwgZG1pLT5kbWlfYWRkcmxlbiwgMCk7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBhZGQgJS4yeDolLjJ4OiUuMng6JS4yeDolLjJ4OiUuMnggbWNhc3QgYWRkcmVzcyB0byBtYXN0ZXIgaW50ZXJmYWNlXG4iLAorCQkJCSAgICAgICB2bGFuX2Rldi0+bmFtZSwKKwkJCQkgICAgICAgZG1pLT5kbWlfYWRkclswXSwKKwkJCQkgICAgICAgZG1pLT5kbWlfYWRkclsxXSwKKwkJCQkgICAgICAgZG1pLT5kbWlfYWRkclsyXSwKKwkJCQkgICAgICAgZG1pLT5kbWlfYWRkclszXSwKKwkJCQkgICAgICAgZG1pLT5kbWlfYWRkcls0XSwKKwkJCQkgICAgICAgZG1pLT5kbWlfYWRkcls1XSk7CisJCQl9CisJCX0KKworCQkvKiBsb29raW5nIGZvciBhZGRyZXNzZXMgdG8gZGVsZXRlIGZyb20gbWFzdGVyJ3MgbGlzdCAqLworCQlmb3IgKGRtaSA9IFZMQU5fREVWX0lORk8odmxhbl9kZXYpLT5vbGRfbWNfbGlzdDsgZG1pICE9IE5VTEw7IGRtaSA9IGRtaS0+bmV4dCkgeworCQkJaWYgKHZsYW5fc2hvdWxkX2FkZF9tYyhkbWksIHZsYW5fZGV2LT5tY19saXN0KSkgeworCQkJCS8qIGlmIHdlIHRoaW5rIHdlIHNob3VsZCBhZGQgaXQgdG8gdGhlIG5ldyBsaXN0LCB0aGVuIHdlIHNob3VsZCByZWFsbHkKKwkJCQkgKiBkZWxldGUgaXQgZnJvbSB0aGUgcmVhbCBsaXN0IG9uIHRoZSB1bmRlcmx5aW5nIGRldmljZS4KKwkJCQkgKi8KKwkJCQlkZXZfbWNfZGVsZXRlKHJlYWxfZGV2LCBkbWktPmRtaV9hZGRyLCBkbWktPmRtaV9hZGRybGVuLCAwKTsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGRlbCAlLjJ4OiUuMng6JS4yeDolLjJ4OiUuMng6JS4yeCBtY2FzdCBhZGRyZXNzIGZyb20gbWFzdGVyIGludGVyZmFjZVxuIiwKKwkJCQkgICAgICAgdmxhbl9kZXYtPm5hbWUsCisJCQkJICAgICAgIGRtaS0+ZG1pX2FkZHJbMF0sCisJCQkJICAgICAgIGRtaS0+ZG1pX2FkZHJbMV0sCisJCQkJICAgICAgIGRtaS0+ZG1pX2FkZHJbMl0sCisJCQkJICAgICAgIGRtaS0+ZG1pX2FkZHJbM10sCisJCQkJICAgICAgIGRtaS0+ZG1pX2FkZHJbNF0sCisJCQkJICAgICAgIGRtaS0+ZG1pX2FkZHJbNV0pOworCQkJfQorCQl9CisKKwkJLyogc2F2ZSBtdWx0aWNhc3QgbGlzdCAqLworCQl2bGFuX2NvcHlfbWNfbGlzdCh2bGFuX2Rldi0+bWNfbGlzdCwgVkxBTl9ERVZfSU5GTyh2bGFuX2RldikpOworCX0KK30KZGlmZiAtLWdpdCBhL25ldC84MDIxcS92bGFucHJvYy5jIGIvbmV0LzgwMjFxL3ZsYW5wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMyZDI3YQotLS0gL2Rldi9udWxsCisrKyBiL25ldC84MDIxcS92bGFucHJvYy5jCkBAIC0wLDAgKzEsMzU3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB2bGFucHJvYy5jCVZMQU4gTW9kdWxlLiAvcHJvYyBmaWxlc3lzdGVtIGludGVyZmFjZS4KKyAqCisgKgkJVGhpcyBtb2R1bGUgaXMgY29tcGxldGVseSBoYXJkd2FyZS1pbmRlcGVuZGVudCBhbmQgcHJvdmlkZXMKKyAqCQlhY2Nlc3MgdG8gdGhlIHJvdXRlciB1c2luZyBMaW51eCAvcHJvYyBmaWxlc3lzdGVtLgorICoKKyAqIEF1dGhvcjoJQmVuIEdyZWVhciwgPGdyZWVhcmJAY2FuZGVsYXRlY2guY29tPiBjb3BwaWVkIGZyb20gd2FucHJvYy5jCisgKiAgICAgICAgICAgICAgIGJ5OiBHZW5lIEtvemluCTxnZW5la0Bjb21wdXNlcnZlLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQ6CShjKSAxOTk4IEJlbiBHcmVlYXIKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEphbiAyMCwgMTk5OCAgICAgICAgQmVuIEdyZWVhciAgICAgSW5pdGlhbCBWZXJzaW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4JLyogb2Zmc2V0b2YoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CS8qIHJldHVybiBjb2RlcyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4JCS8qIGttYWxsb2MoKSwga2ZyZWUoKSAqLworI2luY2x1ZGUgPGxpbnV4L21tLmg+CQkvKiB2ZXJpZnlfYXJlYSgpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CS8qIGlubGluZSBtZW0qLCBzdHIqIGZ1bmN0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4JCS8qIF9faW5pdGZ1bmMgZXQgYWwuICovCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgkvKiBodG9ucygpLCBldGMuICovCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4JLyogY29weV90b191c2VyICovCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSAidmxhbnByb2MuaCIKKyNpbmNsdWRlICJ2bGFuLmgiCisKKy8qKioqKiogRnVuY3Rpb24gUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNZXRob2RzIGZvciBwcmVwYXJpbmcgZGF0YSBmb3IgcmVhZGluZyBwcm9jIGVudHJpZXMgKi8KK3N0YXRpYyBpbnQgdmxhbl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdik7CitzdGF0aWMgdm9pZCAqdmxhbl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKTsKK3N0YXRpYyB2b2lkICp2bGFuX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcyk7CitzdGF0aWMgdm9pZCB2bGFuX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICopOworc3RhdGljIGludCB2bGFuZGV2X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KTsKKworLyoKKyAqCUdsb2JhbCBEYXRhCisgKi8KKworCisvKgorICoJTmFtZXMgb2YgdGhlIHByb2MgZGlyZWN0b3J5IGVudHJpZXMgCisgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgbmFtZV9yb290W10JID0gInZsYW4iOworc3RhdGljIGNvbnN0IGNoYXIgbmFtZV9jb25mW10JID0gImNvbmZpZyI7CisKKy8qCisgKglTdHJ1Y3R1cmVzIGZvciBpbnRlcmZhY2luZyB3aXRoIHRoZSAvcHJvYyBmaWxlc3lzdGVtLgorICoJVkxBTiBjcmVhdGVzIGl0cyBvd24gZGlyZWN0b3J5IC9wcm9jL25ldC92bGFuIHdpdGggdGhlIGZvbG93aW5nCisgKgllbnRyaWVzOgorICoJY29uZmlnCQlkZXZpY2Ugc3RhdHVzL2NvbmZpZ3VyYXRpb24KKyAqCTxkZXZpY2U+CWVudHJ5IGZvciBlYWNoICBkZXZpY2UKKyAqLworCisvKgorICoJR2VuZXJpYyAvcHJvYy9uZXQvdmxhbi88ZmlsZT4gZmlsZSBhbmQgaW5vZGUgb3BlcmF0aW9ucyAKKyAqLworCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHZsYW5fc2VxX29wcyA9IHsKKwkuc3RhcnQgPSB2bGFuX3NlcV9zdGFydCwKKwkubmV4dCA9IHZsYW5fc2VxX25leHQsCisJLnN0b3AgPSB2bGFuX3NlcV9zdG9wLAorCS5zaG93ID0gdmxhbl9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgdmxhbl9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJnZsYW5fc2VxX29wcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZsYW5fZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgPSB2bGFuX3NlcV9vcGVuLAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKKy8qCisgKgkvcHJvYy9uZXQvdmxhbi88ZGV2aWNlPiBmaWxlIGFuZCBpbm9kZSBvcGVyYXRpb25zCisgKi8KKworc3RhdGljIGludCB2bGFuZGV2X3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCB2bGFuZGV2X3NlcV9zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdmxhbmRldl9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gdmxhbmRldl9zZXFfb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCisvKgorICogUHJvYyBmaWxlc3lzdGVtIGRlcmVjdG9yeSBlbnRyaWVzLgorICovCisKKy8qCisgKgkvcHJvYy9uZXQvdmxhbiAKKyAqLworCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3ZsYW5fZGlyOworCisvKgorICoJL3Byb2MvbmV0L3ZsYW4vY29uZmlnIAorICovCisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2Nfdmxhbl9jb25mOworCisvKiBTdHJpbmdzICovCitzdGF0aWMgY29uc3QgY2hhciAqdmxhbl9uYW1lX3R5cGVfc3RyW1ZMQU5fTkFNRV9UWVBFX0hJR0hFU1RdID0geworICAgIFtWTEFOX05BTUVfVFlQRV9SQVdfUExVU19WSURdICAgICAgID0gIlZMQU5fTkFNRV9UWVBFX1JBV19QTFVTX1ZJRCIsCisgICAgW1ZMQU5fTkFNRV9UWVBFX1BMVVNfVklEX05PX1BBRF0JPSAiVkxBTl9OQU1FX1RZUEVfUExVU19WSURfTk9fUEFEIiwKKyAgICBbVkxBTl9OQU1FX1RZUEVfUkFXX1BMVVNfVklEX05PX1BBRF09ICJWTEFOX05BTUVfVFlQRV9SQVdfUExVU19WSURfTk9fUEFEIiwKKyAgICBbVkxBTl9OQU1FX1RZUEVfUExVU19WSURdCQk9ICJWTEFOX05BTUVfVFlQRV9QTFVTX1ZJRCIsCit9OworLyoKKyAqCUludGVyZmFjZSBmdW5jdGlvbnMKKyAqLworCisvKgorICoJQ2xlYW4gdXAgL3Byb2MvbmV0L3ZsYW4gZW50cmllcworICovCisKK3ZvaWQgdmxhbl9wcm9jX2NsZWFudXAodm9pZCkKK3sKKwlpZiAocHJvY192bGFuX2NvbmYpCisJCXJlbW92ZV9wcm9jX2VudHJ5KG5hbWVfY29uZiwgcHJvY192bGFuX2Rpcik7CisKKwlpZiAocHJvY192bGFuX2RpcikKKwkJcHJvY19uZXRfcmVtb3ZlKG5hbWVfcm9vdCk7CisKKwkvKiBEeW5hbWljYWxseSBhZGRlZCBlbnRyaWVzIHNob3VsZCBiZSBjbGVhbmVkIHVwIGFzIHRoZWlyIHZsYW5fZGV2aWNlCisJICogaXMgcmVtb3ZlZCwgc28gd2Ugc2hvdWxkIG5vdCBoYXZlIHRvIHRha2UgY2FyZSBvZiBpdCBoZXJlLi4uCisJICovCit9CisKKy8qCisgKglDcmVhdGUgL3Byb2MvbmV0L3ZsYW4gZW50cmllcworICovCisKK2ludCBfX2luaXQgdmxhbl9wcm9jX2luaXQodm9pZCkKK3sKKwlwcm9jX3ZsYW5fZGlyID0gcHJvY19ta2RpcihuYW1lX3Jvb3QsIHByb2NfbmV0KTsKKwlpZiAocHJvY192bGFuX2RpcikgeworCQlwcm9jX3ZsYW5fY29uZiA9IGNyZWF0ZV9wcm9jX2VudHJ5KG5hbWVfY29uZiwKKwkJCQkJCSAgIFNfSUZSRUd8U19JUlVTUnxTX0lXVVNSLAorCQkJCQkJICAgcHJvY192bGFuX2Rpcik7CisJCWlmIChwcm9jX3ZsYW5fY29uZikgeworCQkJcHJvY192bGFuX2NvbmYtPnByb2NfZm9wcyA9ICZ2bGFuX2ZvcHM7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwl2bGFuX3Byb2NfY2xlYW51cCgpOworCXJldHVybiAtRU5PQlVGUzsKK30KKworLyoKKyAqCUFkZCBkaXJlY3RvcnkgZW50cnkgZm9yIFZMQU4gZGV2aWNlLgorICovCisKK2ludCB2bGFuX3Byb2NfYWRkX2RldiAoc3RydWN0IG5ldF9kZXZpY2UgKnZsYW5kZXYpCit7CisJc3RydWN0IHZsYW5fZGV2X2luZm8gKmRldl9pbmZvID0gVkxBTl9ERVZfSU5GTyh2bGFuZGV2KTsKKworCWlmICghKHZsYW5kZXYtPnByaXZfZmxhZ3MgJiBJRkZfODAyXzFRX1ZMQU4pKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIkVSUk9SOgl2bGFuX3Byb2NfYWRkLCBkZXZpY2UgLTolczotIGlzIE5PVCBhIFZMQU5cbiIsCisJCSAgICAgICB2bGFuZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2luZm8tPmRlbnQgPSBjcmVhdGVfcHJvY19lbnRyeSh2bGFuZGV2LT5uYW1lLAorCQkJCQkgICBTX0lGUkVHfFNfSVJVU1J8U19JV1VTUiwKKwkJCQkJICAgcHJvY192bGFuX2Rpcik7CisJaWYgKCFkZXZfaW5mby0+ZGVudCkKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJZGV2X2luZm8tPmRlbnQtPnByb2NfZm9wcyA9ICZ2bGFuZGV2X2ZvcHM7CisJZGV2X2luZm8tPmRlbnQtPmRhdGEgPSB2bGFuZGV2OworCisjaWZkZWYgVkxBTl9ERUJVRworCXByaW50ayhLRVJOX0VSUiAidmxhbl9wcm9jX2FkZCwgZGV2aWNlIC06JXM6LSBiZWluZyBhZGRlZC5cbiIsCisJICAgICAgIHZsYW5kZXYtPm5hbWUpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglEZWxldGUgZGlyZWN0b3J5IGVudHJ5IGZvciBWTEFOIGRldmljZS4KKyAqLworaW50IHZsYW5fcHJvY19yZW1fZGV2KHN0cnVjdCBuZXRfZGV2aWNlICp2bGFuZGV2KQoreworCWlmICghdmxhbmRldikgeworCQlwcmludGsoVkxBTl9FUlIgIiVzOiBpbnZhbGlkIGFyZ3VtZW50OiAlcFxuIiwKKwkJCV9fRlVOQ1RJT05fXywgdmxhbmRldik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghKHZsYW5kZXYtPnByaXZfZmxhZ3MgJiBJRkZfODAyXzFRX1ZMQU4pKSB7CisJCXByaW50ayhWTEFOX0RCRyAiJXM6IGludmFsaWQgYXJndW1lbnQsIGRldmljZTogJXMgaXMgbm90IGEgVkxBTiBkZXZpY2UsIHByaXZfZmxhZ3M6IDB4JTRoWC5cbiIsCisJCQlfX0ZVTkNUSU9OX18sIHZsYW5kZXYtPm5hbWUsIHZsYW5kZXYtPnByaXZfZmxhZ3MpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKyNpZmRlZiBWTEFOX0RFQlVHCisJcHJpbnRrKFZMQU5fREJHICIlczogZGV2OiAlcFxuIiwgX19GVU5DVElPTl9fLCB2bGFuZGV2KTsKKyNlbmRpZgorCisJLyoqIE5PVEU6ICBUaGlzIHdpbGwgY29uc3VtZSB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkgZGVudCwgaXQgc2VlbXMuICovCisJaWYgKFZMQU5fREVWX0lORk8odmxhbmRldiktPmRlbnQpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoVkxBTl9ERVZfSU5GTyh2bGFuZGV2KS0+ZGVudC0+bmFtZSwgcHJvY192bGFuX2Rpcik7CisJCVZMQU5fREVWX0lORk8odmxhbmRldiktPmRlbnQgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqIFByb2MgZmlsZXN5c3RlbSBlbnRyeSBwb2ludHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZmV3IGZ1bmN0aW9ucyBidWlsZCB0aGUgY29udGVudCBvZiAvcHJvYy9uZXQvdmxhbi9jb25maWcKKyAqLworCisvKiBzdGFydGluZyBhdCBkZXYsIGZpbmQgYSBWTEFOIGRldmljZSAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICp2bGFuX3NraXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7CisJd2hpbGUgKGRldiAmJiAhKGRldi0+cHJpdl9mbGFncyAmIElGRl84MDJfMVFfVkxBTikpIAorCQlkZXYgPSBkZXYtPm5leHQ7CisKKwlyZXR1cm4gZGV2OworfQorCisvKiBzdGFydCByZWFkIG9mIC9wcm9jL25ldC92bGFuL2NvbmZpZyAqLyAKK3N0YXRpYyB2b2lkICp2bGFuX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlsb2ZmX3QgaSA9IDE7CisKKwlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOworCisJaWYgKCpwb3MgPT0gMCkKKwkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKKwkKKwlmb3IgKGRldiA9IHZsYW5fc2tpcChkZXZfYmFzZSk7IGRldiAmJiBpIDwgKnBvczsgCisJICAgICBkZXYgPSB2bGFuX3NraXAoZGV2LT5uZXh0KSwgKytpKTsKKwkJCisJcmV0dXJuICAoaSA9PSAqcG9zKSA/IGRldiA6IE5VTEw7Cit9IAorCitzdGF0aWMgdm9pZCAqdmxhbl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJKysqcG9zOworCisJcmV0dXJuIHZsYW5fc2tpcCgodiA9PSBTRVFfU1RBUlRfVE9LRU4pICAKKwkJCSAgICA/IGRldl9iYXNlIAorCQkJICAgIDogKChzdHJ1Y3QgbmV0X2RldmljZSAqKXYpLT5uZXh0KTsKK30KKworc3RhdGljIHZvaWQgdmxhbl9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgdmxhbl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJY29uc3QgY2hhciAqbm10eXBlID0gTlVMTDsKKworCQlzZXFfcHV0cyhzZXEsICJWTEFOIERldiBuYW1lCSB8IFZMQU4gSURcbiIpOworCisJCWlmICh2bGFuX25hbWVfdHlwZSA8IEFSUkFZX1NJWkUodmxhbl9uYW1lX3R5cGVfc3RyKSkKKwkJICAgIG5tdHlwZSA9ICB2bGFuX25hbWVfdHlwZV9zdHJbdmxhbl9uYW1lX3R5cGVdOworCisJCXNlcV9wcmludGYoc2VxLCAiTmFtZS1UeXBlOiAlc1xuIiwgCisJCQkgICBubXR5cGUgPyBubXR5cGUgOiAgIlVOS05PV04iICk7CisJfSBlbHNlIHsKKwkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKnZsYW5kZXYgPSB2OworCQljb25zdCBzdHJ1Y3Qgdmxhbl9kZXZfaW5mbyAqZGV2X2luZm8gPSBWTEFOX0RFVl9JTkZPKHZsYW5kZXYpOworCisJCXNlcV9wcmludGYoc2VxLCAiJS0xNXN8ICVkICB8ICVzXG4iLCAgdmxhbmRldi0+bmFtZSwgIAorCQkJICAgZGV2X2luZm8tPnZsYW5faWQsICAgIGRldl9pbmZvLT5yZWFsX2Rldi0+bmFtZSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZsYW5kZXZfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqdmxhbmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBzZXEtPnByaXZhdGU7CisJY29uc3Qgc3RydWN0IHZsYW5fZGV2X2luZm8gKmRldl9pbmZvID0gVkxBTl9ERVZfSU5GTyh2bGFuZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHM7CisJc3RhdGljIGNvbnN0IGNoYXIgZm10W10gPSAiJTMwcyAlMTJsdVxuIjsKKwlpbnQgaTsKKworCWlmICgodmxhbmRldiA9PSBOVUxMKSB8fCAoISh2bGFuZGV2LT5wcml2X2ZsYWdzICYgSUZGXzgwMl8xUV9WTEFOKSkpCisJCXJldHVybiAwOworCisJc2VxX3ByaW50ZihzZXEsICIlcyAgVklEOiAlZAkgUkVPUkRFUl9IRFI6ICVpICBkZXYtPnByaXZfZmxhZ3M6ICVoeFxuIiwKKwkJICAgICAgIHZsYW5kZXYtPm5hbWUsIGRldl9pbmZvLT52bGFuX2lkLAorCQkgICAgICAgKGludCkoZGV2X2luZm8tPmZsYWdzICYgMSksIHZsYW5kZXYtPnByaXZfZmxhZ3MpOworCisKKwlzdGF0cyA9IHZsYW5fZGV2X2dldF9zdGF0cyh2bGFuZGV2KTsKKworCXNlcV9wcmludGYoc2VxLCBmbXQsICJ0b3RhbCBmcmFtZXMgcmVjZWl2ZWQiLCBzdGF0cy0+cnhfcGFja2V0cyk7CisJc2VxX3ByaW50ZihzZXEsIGZtdCwgInRvdGFsIGJ5dGVzIHJlY2VpdmVkIiwgc3RhdHMtPnJ4X2J5dGVzKTsKKwlzZXFfcHJpbnRmKHNlcSwgZm10LCAiQnJvYWRjYXN0L011bHRpY2FzdCBSY3ZkIiwgc3RhdHMtPm11bHRpY2FzdCk7CisJc2VxX3B1dHMoc2VxLCAiXG4iKTsKKwlzZXFfcHJpbnRmKHNlcSwgZm10LCAidG90YWwgZnJhbWVzIHRyYW5zbWl0dGVkIiwgc3RhdHMtPnR4X3BhY2tldHMpOworCXNlcV9wcmludGYoc2VxLCBmbXQsICJ0b3RhbCBieXRlcyB0cmFuc21pdHRlZCIsIHN0YXRzLT50eF9ieXRlcyk7CisJc2VxX3ByaW50ZihzZXEsIGZtdCwgInRvdGFsIGhlYWRyb29tIGluYyIsIAorCQkgICBkZXZfaW5mby0+Y250X2luY19oZWFkcm9vbV9vbl90eCk7CisJc2VxX3ByaW50ZihzZXEsIGZtdCwgInRvdGFsIGVuY2FwIG9uIHhtaXQiLCAKKwkJICAgZGV2X2luZm8tPmNudF9lbmNhcF9vbl94bWl0KTsKKwlzZXFfcHJpbnRmKHNlcSwgIkRldmljZTogJXMiLCBkZXZfaW5mby0+cmVhbF9kZXYtPm5hbWUpOworCS8qIG5vdyBzaG93IGFsbCBQUklPUklUWSBtYXBwaW5ncyByZWxhdGluZyB0byB0aGlzIFZMQU4gKi8KKwlzZXFfcHJpbnRmKHNlcSwgCisJCSAgICAgICAiXG5JTkdSRVNTIHByaW9yaXR5IG1hcHBpbmdzOiAwOiVsdSAgMTolbHUgIDI6JWx1ICAzOiVsdSAgNDolbHUgIDU6JWx1ICA2OiVsdSA3OiVsdVxuIiwKKwkJICAgICAgIGRldl9pbmZvLT5pbmdyZXNzX3ByaW9yaXR5X21hcFswXSwKKwkJICAgICAgIGRldl9pbmZvLT5pbmdyZXNzX3ByaW9yaXR5X21hcFsxXSwKKwkJICAgICAgIGRldl9pbmZvLT5pbmdyZXNzX3ByaW9yaXR5X21hcFsyXSwKKwkJICAgICAgIGRldl9pbmZvLT5pbmdyZXNzX3ByaW9yaXR5X21hcFszXSwKKwkJICAgICAgIGRldl9pbmZvLT5pbmdyZXNzX3ByaW9yaXR5X21hcFs0XSwKKwkJICAgICAgIGRldl9pbmZvLT5pbmdyZXNzX3ByaW9yaXR5X21hcFs1XSwKKwkJICAgICAgIGRldl9pbmZvLT5pbmdyZXNzX3ByaW9yaXR5X21hcFs2XSwKKwkJICAgICAgIGRldl9pbmZvLT5pbmdyZXNzX3ByaW9yaXR5X21hcFs3XSk7CisKKwlzZXFfcHJpbnRmKHNlcSwgIkVHUkVTU1MgcHJpb3JpdHkgTWFwcGluZ3M6ICIpOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCB2bGFuX3ByaW9yaXR5X3RjaV9tYXBwaW5nICptcAorCQkJPSBkZXZfaW5mby0+ZWdyZXNzX3ByaW9yaXR5X21hcFtpXTsKKwkJd2hpbGUgKG1wKSB7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiVsdTolaHUgIiwKKwkJCQkgICBtcC0+cHJpb3JpdHksICgobXAtPnZsYW5fcW9zID4+IDEzKSAmIDB4NykpOworCQkJbXAgPSBtcC0+bmV4dDsKKwkJfQorCX0KKwlzZXFfcHV0cyhzZXEsICJcbiIpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9uZXQvODAyMXEvdmxhbnByb2MuaCBiL25ldC84MDIxcS92bGFucHJvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MDhlZTMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvODAyMXEvdmxhbnByb2MuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9fQkVOX1ZMQU5fUFJPQ19JTkNfXworI2RlZmluZSBfX0JFTl9WTEFOX1BST0NfSU5DX18KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitpbnQgdmxhbl9wcm9jX2luaXQodm9pZCk7CitpbnQgdmxhbl9wcm9jX3JlbV9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKnZsYW5kZXYpOworaW50IHZsYW5fcHJvY19hZGRfZGV2IChzdHJ1Y3QgbmV0X2RldmljZSAqdmxhbmRldik7Cit2b2lkIHZsYW5fcHJvY19jbGVhbnVwICh2b2lkKTsKKworI2Vsc2UgLyogTm8gQ09ORklHX1BST0NfRlMgKi8KKworI2RlZmluZSB2bGFuX3Byb2NfaW5pdCgpCSgwKQorI2RlZmluZSB2bGFuX3Byb2NfY2xlYW51cCgpCWRvIHt9IHdoaWxlKDApCisjZGVmaW5lIHZsYW5fcHJvY19hZGRfZGV2KGRldikJKHsodm9pZCkoZGV2KSwgMDt9KQorI2RlZmluZSB2bGFuX3Byb2NfcmVtX2RldihkZXYpCSh7KHZvaWQpKGRldiksIDA7fSkKKworI2VuZGlmCisKKyNlbmRpZiAvKiAhKF9fQkVOX1ZMQU5fUFJPQ19JTkNfXykgKi8KZGlmZiAtLWdpdCBhL25ldC9LY29uZmlnIGIvbmV0L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI1MWIyOAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9LY29uZmlnCkBAIC0wLDAgKzEsNjQ2IEBACisjCisjIE5ldHdvcmsgY29uZmlndXJhdGlvbgorIworCittZW51ICJOZXR3b3JraW5nIHN1cHBvcnQiCisKK2NvbmZpZyBORVQKKwlib29sICJOZXR3b3JraW5nIHN1cHBvcnQiCisJLS0taGVscC0tLQorCSAgVW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcsIHlvdSBzaG91bGQgc2F5IFkgaGVyZS4KKwkgIFRoZSByZWFzb24gaXMgdGhhdCBzb21lIHByb2dyYW1zIG5lZWQga2VybmVsIG5ldHdvcmtpbmcgc3VwcG9ydCBldmVuCisJICB3aGVuIHJ1bm5pbmcgb24gYSBzdGFuZC1hbG9uZSBtYWNoaW5lIHRoYXQgaXNuJ3QgY29ubmVjdGVkIHRvIGFueQorCSAgb3RoZXIgY29tcHV0ZXIuIElmIHlvdSBhcmUgdXBncmFkaW5nIGZyb20gYW4gb2xkZXIga2VybmVsLCB5b3UKKwkgIHNob3VsZCBjb25zaWRlciB1cGRhdGluZyB5b3VyIG5ldHdvcmtpbmcgdG9vbHMgdG9vIGJlY2F1c2UgY2hhbmdlcworCSAgaW4gdGhlIGtlcm5lbCBhbmQgdGhlIHRvb2xzIG9mdGVuIGdvIGhhbmQgaW4gaGFuZC4gVGhlIHRvb2xzIGFyZQorCSAgY29udGFpbmVkIGluIHRoZSBwYWNrYWdlIG5ldC10b29scywgdGhlIGxvY2F0aW9uIGFuZCB2ZXJzaW9uIG51bWJlcgorCSAgb2Ygd2hpY2ggYXJlIGdpdmVuIGluIDxmaWxlOkRvY3VtZW50YXRpb24vQ2hhbmdlcz4uCisKKwkgIEZvciBhIGdlbmVyYWwgaW50cm9kdWN0aW9uIHRvIExpbnV4IG5ldHdvcmtpbmcsIGl0IGlzIGhpZ2hseQorCSAgcmVjb21tZW5kZWQgdG8gcmVhZCB0aGUgTkVULUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworbWVudSAiTmV0d29ya2luZyBvcHRpb25zIgorCWRlcGVuZHMgb24gTkVUCisKK2NvbmZpZyBQQUNLRVQKKwl0cmlzdGF0ZSAiUGFja2V0IHNvY2tldCIKKwktLS1oZWxwLS0tCisJICBUaGUgUGFja2V0IHByb3RvY29sIGlzIHVzZWQgYnkgYXBwbGljYXRpb25zIHdoaWNoIGNvbW11bmljYXRlCisJICBkaXJlY3RseSB3aXRoIG5ldHdvcmsgZGV2aWNlcyB3aXRob3V0IGFuIGludGVybWVkaWF0ZSBuZXR3b3JrCisJICBwcm90b2NvbCBpbXBsZW1lbnRlZCBpbiB0aGUga2VybmVsLCBlLmcuIHRjcGR1bXAuICBJZiB5b3Ugd2FudCB0aGVtCisJICB0byB3b3JrLCBjaG9vc2UgWS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgYWZfcGFja2V0LgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgUEFDS0VUX01NQVAKKwlib29sICJQYWNrZXQgc29ja2V0OiBtbWFwcGVkIElPIgorCWRlcGVuZHMgb24gUEFDS0VUCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZSBQYWNrZXQgcHJvdG9jb2wgZHJpdmVyIHdpbGwgdXNlIGFuIElPCisJICBtZWNoYW5pc20gdGhhdCByZXN1bHRzIGluIGZhc3RlciBjb21tdW5pY2F0aW9uLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgVU5JWAorCXRyaXN0YXRlICJVbml4IGRvbWFpbiBzb2NrZXRzIgorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBpbmNsdWRlIHN1cHBvcnQgZm9yIFVuaXggZG9tYWluIHNvY2tldHM7CisJICBzb2NrZXRzIGFyZSB0aGUgc3RhbmRhcmQgVW5peCBtZWNoYW5pc20gZm9yIGVzdGFibGlzaGluZyBhbmQKKwkgIGFjY2Vzc2luZyBuZXR3b3JrIGNvbm5lY3Rpb25zLiAgTWFueSBjb21tb25seSB1c2VkIHByb2dyYW1zIHN1Y2ggYXMKKwkgIHRoZSBYIFdpbmRvdyBzeXN0ZW0gYW5kIHN5c2xvZyB1c2UgdGhlc2Ugc29ja2V0cyBldmVuIGlmIHlvdXIKKwkgIG1hY2hpbmUgaXMgbm90IGNvbm5lY3RlZCB0byBhbnkgbmV0d29yay4gIFVubGVzcyB5b3UgYXJlIHdvcmtpbmcgb24KKwkgIGFuIGVtYmVkZGVkIHN5c3RlbSBvciBzb21ldGhpbmcgc2ltaWxhciwgeW91IHRoZXJlZm9yZSBkZWZpbml0ZWx5CisJICB3YW50IHRvIHNheSBZIGhlcmUuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHVuaXguICBOb3RlIHRoYXQgc2V2ZXJhbCBpbXBvcnRhbnQgc2VydmljZXMgd29uJ3Qgd29yaworCSAgY29ycmVjdGx5IGlmIHlvdSBzYXkgTSBoZXJlIGFuZCB0aGVuIG5lZ2xlY3QgdG8gbG9hZCB0aGUgbW9kdWxlLgorCisJICBTYXkgWSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgorCitjb25maWcgTkVUX0tFWQorCXRyaXN0YXRlICJQRl9LRVkgc29ja2V0cyIKKwlzZWxlY3QgWEZSTQorCS0tLWhlbHAtLS0KKwkgIFBGX0tFWXYyIHNvY2tldCBmYW1pbHksIGNvbXBhdGlibGUgdG8gS0FNRSBvbmVzLgorCSAgVGhleSBhcmUgcmVxdWlyZWQgaWYgeW91IGFyZSBnb2luZyB0byB1c2UgSVBzZWMgdG9vbHMgcG9ydGVkCisJICBmcm9tIEtBTUUuCisKKwkgIFNheSBZIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCisKK2NvbmZpZyBJTkVUCisJYm9vbCAiVENQL0lQIG5ldHdvcmtpbmciCisJLS0taGVscC0tLQorCSAgVGhlc2UgYXJlIHRoZSBwcm90b2NvbHMgdXNlZCBvbiB0aGUgSW50ZXJuZXQgYW5kIG9uIG1vc3QgbG9jYWwKKwkgIEV0aGVybmV0cy4gSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHNheSBZIGhlcmUgKHRoaXMgd2lsbCBlbmxhcmdlCisJICB5b3VyIGtlcm5lbCBieSBhYm91dCAxNDQgS0IpLCBzaW5jZSBzb21lIHByb2dyYW1zIChlLmcuIHRoZSBYIHdpbmRvdworCSAgc3lzdGVtKSB1c2UgVENQL0lQIGV2ZW4gaWYgeW91ciBtYWNoaW5lIGlzIG5vdCBjb25uZWN0ZWQgdG8gYW55CisJICBvdGhlciBjb21wdXRlci4gWW91IHdpbGwgZ2V0IHRoZSBzby1jYWxsZWQgbG9vcGJhY2sgZGV2aWNlIHdoaWNoCisJICBhbGxvd3MgeW91IHRvIHBpbmcgeW91cnNlbGYgKGdyZWF0IGZ1biwgdGhhdCEpLgorCisJICBGb3IgYW4gZXhjZWxsZW50IGludHJvZHVjdGlvbiB0byBMaW51eCBuZXR3b3JraW5nLCBwbGVhc2UgcmVhZCB0aGUKKwkgIExpbnV4IE5ldHdvcmtpbmcgSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgYWxzbyB0byAiL3Byb2MgZmlsZSBzeXN0ZW0gc3VwcG9ydCIgYW5kCisJICAiU3lzY3RsIHN1cHBvcnQiIGJlbG93LCB5b3UgY2FuIGNoYW5nZSB2YXJpb3VzIGFzcGVjdHMgb2YgdGhlCisJICBiZWhhdmlvciBvZiB0aGUgVENQL0lQIGNvZGUgYnkgd3JpdGluZyB0byB0aGUgKHZpcnR1YWwpIGZpbGVzIGluCisJICAvcHJvYy9zeXMvbmV0L2lwdjQvKjsgdGhlIG9wdGlvbnMgYXJlIGV4cGxhaW5lZCBpbiB0aGUgZmlsZQorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwLXN5c2N0bC50eHQ+LgorCisJICBTaG9ydCBhbnN3ZXI6IHNheSBZLgorCitzb3VyY2UgIm5ldC9pcHY0L0tjb25maWciCisKKyMgICBJUHY2IGFzIG1vZHVsZSB3aWxsIGNhdXNlIGEgQ1JBU0ggaWYgeW91IHRyeSB0byB1bmxvYWQgaXQKK2NvbmZpZyBJUFY2CisJdHJpc3RhdGUgIlRoZSBJUHY2IHByb3RvY29sIgorCWRlcGVuZHMgb24gSU5FVAorCWRlZmF1bHQgbQorCXNlbGVjdCBDUllQVE8gaWYgSVBWNl9QUklWQUNZCisJc2VsZWN0IENSWVBUT19NRDUgaWYgSVBWNl9QUklWQUNZCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBjb21wbGVtZW50YWwgc3VwcG9ydCBmb3IgdGhlIElQIHZlcnNpb24gNi4KKwkgIFlvdSB3aWxsIHN0aWxsIGJlIGFibGUgdG8gZG8gdHJhZGl0aW9uYWwgSVB2NCBuZXR3b3JraW5nIGFzIHdlbGwuCisKKwkgIEZvciBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IElQdjYsIHNlZQorCSAgPGh0dHA6Ly9wbGF5Z3JvdW5kLnN1bi5jb20vcHViL2lwbmcvaHRtbC9pcG5nLW1haW4uaHRtbD4uCisJICBGb3IgTGludXggSVB2NiBkZXZlbG9wbWVudCBpbmZvcm1hdGlvbiwgc2VlIDxodHRwOi8vd3d3LmxpbnV4LWlwdjYub3JnPi4KKwkgIEZvciBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhYm91dCBJUHY2IHVuZGVyIExpbnV4LCByZWFkIHRoZSBIT1dUTyBhdAorCSAgPGh0dHA6Ly93d3cuYmllcmluZ2VyLmRlL2xpbnV4L0lQdjYvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIHByb3RvY29sIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSAKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpcHY2LgorCitzb3VyY2UgIm5ldC9pcHY2L0tjb25maWciCisKK21lbnVjb25maWcgTkVURklMVEVSCisJYm9vbCAiTmV0d29yayBwYWNrZXQgZmlsdGVyaW5nIChyZXBsYWNlcyBpcGNoYWlucykiCisJLS0taGVscC0tLQorCSAgTmV0ZmlsdGVyIGlzIGEgZnJhbWV3b3JrIGZvciBmaWx0ZXJpbmcgYW5kIG1hbmdsaW5nIG5ldHdvcmsgcGFja2V0cworCSAgdGhhdCBwYXNzIHRocm91Z2ggeW91ciBMaW51eCBib3guCisKKwkgIFRoZSBtb3N0IGNvbW1vbiB1c2Ugb2YgcGFja2V0IGZpbHRlcmluZyBpcyB0byBydW4geW91ciBMaW51eCBib3ggYXMKKwkgIGEgZmlyZXdhbGwgcHJvdGVjdGluZyBhIGxvY2FsIG5ldHdvcmsgZnJvbSB0aGUgSW50ZXJuZXQuIFRoZSB0eXBlIG9mCisJICBmaXJld2FsbCBwcm92aWRlZCBieSB0aGlzIGtlcm5lbCBzdXBwb3J0IGlzIGNhbGxlZCBhICJwYWNrZXQKKwkgIGZpbHRlciIsIHdoaWNoIG1lYW5zIHRoYXQgaXQgY2FuIHJlamVjdCBpbmRpdmlkdWFsIG5ldHdvcmsgcGFja2V0cworCSAgYmFzZWQgb24gdHlwZSwgc291cmNlLCBkZXN0aW5hdGlvbiBldGMuIFRoZSBvdGhlciBraW5kIG9mIGZpcmV3YWxsLAorCSAgYSAicHJveHktYmFzZWQiIG9uZSwgaXMgbW9yZSBzZWN1cmUgYnV0IG1vcmUgaW50cnVzaXZlIGFuZCBtb3JlCisJICBib3RoZXJzb21lIHRvIHNldCB1cDsgaXQgaW5zcGVjdHMgdGhlIG5ldHdvcmsgdHJhZmZpYyBtdWNoIG1vcmUKKwkgIGNsb3NlbHksIG1vZGlmaWVzIGl0IGFuZCBoYXMga25vd2xlZGdlIGFib3V0IHRoZSBoaWdoZXIgbGV2ZWwKKwkgIHByb3RvY29scywgd2hpY2ggYSBwYWNrZXQgZmlsdGVyIGxhY2tzLiBNb3Jlb3ZlciwgcHJveHktYmFzZWQKKwkgIGZpcmV3YWxscyBvZnRlbiByZXF1aXJlIGNoYW5nZXMgdG8gdGhlIHByb2dyYW1zIHJ1bm5pbmcgb24gdGhlIGxvY2FsCisJICBjbGllbnRzLiBQcm94eS1iYXNlZCBmaXJld2FsbHMgZG9uJ3QgbmVlZCBzdXBwb3J0IGJ5IHRoZSBrZXJuZWwsIGJ1dAorCSAgdGhleSBhcmUgb2Z0ZW4gY29tYmluZWQgd2l0aCBhIHBhY2tldCBmaWx0ZXIsIHdoaWNoIG9ubHkgd29ya3MgaWYKKwkgIHlvdSBzYXkgWSBoZXJlLgorCisJICBZb3Ugc2hvdWxkIGFsc28gc2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIHVzZSB5b3VyIExpbnV4IGJveCBhcworCSAgdGhlIGdhdGV3YXkgdG8gdGhlIEludGVybmV0IGZvciBhIGxvY2FsIG5ldHdvcmsgb2YgbWFjaGluZXMgd2l0aG91dAorCSAgZ2xvYmFsbHkgdmFsaWQgSVAgYWRkcmVzc2VzLiBUaGlzIGlzIGNhbGxlZCAibWFzcXVlcmFkaW5nIjogaWYgb25lCisJICBvZiB0aGUgY29tcHV0ZXJzIG9uIHlvdXIgbG9jYWwgbmV0d29yayB3YW50cyB0byBzZW5kIHNvbWV0aGluZyB0bworCSAgdGhlIG91dHNpZGUsIHlvdXIgYm94IGNhbiAibWFzcXVlcmFkZSIgYXMgdGhhdCBjb21wdXRlciwgaS5lLiBpdAorCSAgZm9yd2FyZHMgdGhlIHRyYWZmaWMgdG8gdGhlIGludGVuZGVkIG91dHNpZGUgZGVzdGluYXRpb24sIGJ1dAorCSAgbW9kaWZpZXMgdGhlIHBhY2tldHMgdG8gbWFrZSBpdCBsb29rIGxpa2UgdGhleSBjYW1lIGZyb20gdGhlCisJICBmaXJld2FsbCBib3ggaXRzZWxmLiBJdCB3b3JrcyBib3RoIHdheXM6IGlmIHRoZSBvdXRzaWRlIGhvc3QKKwkgIHJlcGxpZXMsIHRoZSBMaW51eCBib3ggd2lsbCBzaWxlbnRseSBmb3J3YXJkIHRoZSB0cmFmZmljIHRvIHRoZQorCSAgY29ycmVjdCBsb2NhbCBjb21wdXRlci4gVGhpcyB3YXksIHRoZSBjb21wdXRlcnMgb24geW91ciBsb2NhbCBuZXQKKwkgIGFyZSBjb21wbGV0ZWx5IGludmlzaWJsZSB0byB0aGUgb3V0c2lkZSB3b3JsZCwgZXZlbiB0aG91Z2ggdGhleSBjYW4KKwkgIHJlYWNoIHRoZSBvdXRzaWRlIGFuZCBjYW4gcmVjZWl2ZSByZXBsaWVzLiBJdCBpcyBldmVuIHBvc3NpYmxlIHRvCisJICBydW4gZ2xvYmFsbHkgdmlzaWJsZSBzZXJ2ZXJzIGZyb20gd2l0aGluIGEgbWFzcXVlcmFkZWQgbG9jYWwgbmV0d29yaworCSAgdXNpbmcgYSBtZWNoYW5pc20gY2FsbGVkIHBvcnRmb3J3YXJkaW5nLiBNYXNxdWVyYWRpbmcgaXMgYWxzbyBvZnRlbgorCSAgY2FsbGVkIE5BVCAoTmV0d29yayBBZGRyZXNzIFRyYW5zbGF0aW9uKS4KKworCSAgQW5vdGhlciB1c2Ugb2YgTmV0ZmlsdGVyIGlzIGluIHRyYW5zcGFyZW50IHByb3h5aW5nOiBpZiBhIG1hY2hpbmUgb24KKwkgIHRoZSBsb2NhbCBuZXR3b3JrIHRyaWVzIHRvIGNvbm5lY3QgdG8gYW4gb3V0c2lkZSBob3N0LCB5b3VyIExpbnV4CisJICBib3ggY2FuIHRyYW5zcGFyZW50bHkgZm9yd2FyZCB0aGUgdHJhZmZpYyB0byBhIGxvY2FsIHNlcnZlciwKKwkgIHR5cGljYWxseSBhIGNhY2hpbmcgcHJveHkgc2VydmVyLgorCisJICBZZXQgYW5vdGhlciB1c2Ugb2YgTmV0ZmlsdGVyIGlzIGJ1aWxkaW5nIGEgYnJpZGdpbmcgZmlyZXdhbGwuIFVzaW5nCisJICBhIGJyaWRnZSB3aXRoIE5ldHdvcmsgcGFja2V0IGZpbHRlcmluZyBlbmFibGVkIG1ha2VzIGlwdGFibGVzICJzZWUiCisJICB0aGUgYnJpZGdlZCB0cmFmZmljLiBGb3IgZmlsdGVyaW5nIG9uIHRoZSBsb3dlciBuZXR3b3JrIGFuZCBFdGhlcm5ldAorCSAgcHJvdG9jb2xzIG92ZXIgdGhlIGJyaWRnZSwgdXNlIGVidGFibGVzICh1bmRlciBicmlkZ2UgbmV0ZmlsdGVyCisJICBjb25maWd1cmF0aW9uKS4KKworCSAgVmFyaW91cyBtb2R1bGVzIGV4aXN0IGZvciBuZXRmaWx0ZXIgd2hpY2ggcmVwbGFjZSB0aGUgcHJldmlvdXMKKwkgIG1hc3F1ZXJhZGluZyAoaXBtYXNxYWRtKSwgcGFja2V0IGZpbHRlcmluZyAoaXBjaGFpbnMpLCB0cmFuc3BhcmVudAorCSAgcHJveHlpbmcsIGFuZCBwb3J0Zm9yd2FyZGluZyBtZWNoYW5pc21zLiBQbGVhc2Ugc2VlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL0NoYW5nZXM+IHVuZGVyICJpcHRhYmxlcyIgZm9yIHRoZSBsb2NhdGlvbiBvZgorCSAgdGhlc2UgcGFja2FnZXMuCisKKwkgIE1ha2Ugc3VyZSB0byBzYXkgTiB0byAiRmFzdCBzd2l0Y2hpbmciIGJlbG93IGlmIHlvdSBpbnRlbmQgdG8gc2F5IFkKKwkgIGhlcmUsIGFzIEZhc3Qgc3dpdGNoaW5nIGN1cnJlbnRseSBieXBhc3NlcyBuZXRmaWx0ZXIuCisKKwkgIENoYW5jZXMgYXJlIHRoYXQgeW91IHNob3VsZCBzYXkgWSBoZXJlIGlmIHlvdSBjb21waWxlIGEga2VybmVsIHdoaWNoCisJICB3aWxsIHJ1biBhcyBhIHJvdXRlciBhbmQgTiBmb3IgcmVndWxhciBob3N0cy4gSWYgdW5zdXJlLCBzYXkgTi4KKworaWYgTkVURklMVEVSCisKK2NvbmZpZyBORVRGSUxURVJfREVCVUcKKwlib29sICJOZXR3b3JrIHBhY2tldCBmaWx0ZXJpbmcgZGVidWdnaW5nIgorCWRlcGVuZHMgb24gTkVURklMVEVSCisJaGVscAorCSAgWW91IGNhbiBzYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGdldCBhZGRpdGlvbmFsIG1lc3NhZ2VzIHVzZWZ1bCBpbgorCSAgZGVidWdnaW5nIHRoZSBuZXRmaWx0ZXIgY29kZS4KKworY29uZmlnIEJSSURHRV9ORVRGSUxURVIKKwlib29sICJCcmlkZ2VkIElQL0FSUCBwYWNrZXRzIGZpbHRlcmluZyIKKwlkZXBlbmRzIG9uIEJSSURHRSAmJiBORVRGSUxURVIgJiYgSU5FVAorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgbGV0IGFycHRhYmxlcyByZXNwLiBpcHRhYmxlcyBzZWUgYnJpZGdlZAorCSAgQVJQIHJlc3AuIElQIHRyYWZmaWMuIElmIHlvdSB3YW50IGEgYnJpZGdpbmcgZmlyZXdhbGwsIHlvdSBwcm9iYWJseQorCSAgd2FudCB0aGlzIG9wdGlvbiBlbmFibGVkLgorCSAgRW5hYmxpbmcgb3IgZGlzYWJsaW5nIHRoaXMgb3B0aW9uIGRvZXNuJ3QgZW5hYmxlIG9yIGRpc2FibGUKKwkgIGVidGFibGVzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitzb3VyY2UgIm5ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnIgorc291cmNlICJuZXQvaXB2Ni9uZXRmaWx0ZXIvS2NvbmZpZyIKK3NvdXJjZSAibmV0L2RlY25ldC9uZXRmaWx0ZXIvS2NvbmZpZyIKK3NvdXJjZSAibmV0L2JyaWRnZS9uZXRmaWx0ZXIvS2NvbmZpZyIKKworZW5kaWYKKworY29uZmlnIFhGUk0KKyAgICAgICBib29sCisgICAgICAgZGVwZW5kcyBvbiBORVQKKworc291cmNlICJuZXQveGZybS9LY29uZmlnIgorCitzb3VyY2UgIm5ldC9zY3RwL0tjb25maWciCisKK2NvbmZpZyBBVE0KKwl0cmlzdGF0ZSAiQXN5bmNocm9ub3VzIFRyYW5zZmVyIE1vZGUgKEFUTSkgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwktLS1oZWxwLS0tCisJICBBVE0gaXMgYSBoaWdoLXNwZWVkIG5ldHdvcmtpbmcgdGVjaG5vbG9neSBmb3IgTG9jYWwgQXJlYSBOZXR3b3JrcworCSAgYW5kIFdpZGUgQXJlYSBOZXR3b3Jrcy4gIEl0IHVzZXMgYSBmaXhlZCBwYWNrZXQgc2l6ZSBhbmQgaXMKKwkgIGNvbm5lY3Rpb24gb3JpZW50ZWQsIGFsbG93aW5nIGZvciB0aGUgbmVnb3RpYXRpb24gb2YgbWluaW11bQorCSAgYmFuZHdpZHRoIHJlcXVpcmVtZW50cy4KKworCSAgSW4gb3JkZXIgdG8gcGFydGljaXBhdGUgaW4gYW4gQVRNIG5ldHdvcmssIHlvdXIgTGludXggYm94IG5lZWRzIGFuCisJICBBVE0gbmV0d29ya2luZyBjYXJkLiBJZiB5b3UgaGF2ZSB0aGF0LCBzYXkgWSBoZXJlIGFuZCB0byB0aGUgZHJpdmVyCisJICBvZiB5b3VyIEFUTSBjYXJkIGJlbG93LgorCisJICBOb3RlIHRoYXQgeW91IG5lZWQgYSBzZXQgb2YgdXNlci1zcGFjZSBwcm9ncmFtcyB0byBhY3R1YWxseSBtYWtlIHVzZQorCSAgb2YgQVRNLiAgU2VlIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9hdG0udHh0PiBmb3IKKwkgIGZ1cnRoZXIgZGV0YWlscy4KKworY29uZmlnIEFUTV9DTElQCisJdHJpc3RhdGUgIkNsYXNzaWNhbCBJUCBvdmVyIEFUTSAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEFUTSAmJiBJTkVUCisJaGVscAorCSAgQ2xhc3NpY2FsIElQIG92ZXIgQVRNIGZvciBQVkNzIGFuZCBTVkNzLCBzdXBwb3J0aW5nIEluQVJQIGFuZAorCSAgQVRNQVJQLiBJZiB5b3Ugd2FudCB0byBjb21tdW5pY2F0aW9uIHdpdGggb3RoZXIgSVAgaG9zdHMgb24geW91ciBBVE0KKwkgIG5ldHdvcmssIHlvdSB3aWxsIHR5cGljYWxseSBlaXRoZXIgc2F5IFkgaGVyZSBvciB0byAiTEFOIEVtdWxhdGlvbgorCSAgKExBTkUpIiBiZWxvdy4KKworY29uZmlnIEFUTV9DTElQX05PX0lDTVAKKwlib29sICJEbyBOT1Qgc2VuZCBJQ01QIGlmIG5vIG5laWdoYm91ciAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEFUTV9DTElQCisJaGVscAorCSAgTm9ybWFsbHksIGFuICJJQ01QIGhvc3QgdW5yZWFjaGFibGUiIG1lc3NhZ2UgaXMgc2VudCBpZiBhIG5laWdoYm91cgorCSAgY2Fubm90IGJlIHJlYWNoZWQgYmVjYXVzZSB0aGVyZSBpcyBubyBWQyB0byBpdCBpbiB0aGUga2VybmVsJ3MKKwkgIEFUTUFSUCB0YWJsZS4gVGhpcyBtYXkgY2F1c2UgcHJvYmxlbXMgd2hlbiBBVE1BUlAgdGFibGUgZW50cmllcyBhcmUKKwkgIGJyaWVmbHkgcmVtb3ZlZCBkdXJpbmcgcmV2YWxpZGF0aW9uLiBJZiB5b3Ugc2F5IFkgaGVyZSwgcGFja2V0cyB0bworCSAgc3VjaCBuZWlnaGJvdXJzIGFyZSBzaWxlbnRseSBkaXNjYXJkZWQgaW5zdGVhZC4KKworY29uZmlnIEFUTV9MQU5FCisJdHJpc3RhdGUgIkxBTiBFbXVsYXRpb24gKExBTkUpIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBBVE0KKwloZWxwCisJICBMQU4gRW11bGF0aW9uIGVtdWxhdGVzIHNlcnZpY2VzIG9mIGV4aXN0aW5nIExBTnMgYWNyb3NzIGFuIEFUTQorCSAgbmV0d29yay4gQmVzaWRlcyBvcGVyYXRpbmcgYXMgYSBub3JtYWwgQVRNIGVuZCBzdGF0aW9uIGNsaWVudCwgTGludXgKKwkgIExBTkUgY2xpZW50IGNhbiBhbHNvIGFjdCBhcyBhbiBwcm94eSBjbGllbnQgYnJpZGdpbmcgcGFja2V0cyBiZXR3ZWVuCisJICBFTEFOIGFuZCBFdGhlcm5ldCBzZWdtZW50cy4gWW91IG5lZWQgTEFORSBpZiB5b3Ugd2FudCB0byB0cnkgTVBPQS4KKworY29uZmlnIEFUTV9NUE9BCisJdHJpc3RhdGUgIk11bHRpLVByb3RvY29sIE92ZXIgQVRNIChNUE9BKSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gQVRNICYmIElORVQgJiYgQVRNX0xBTkUhPW4KKwloZWxwCisJICBNdWx0aS1Qcm90b2NvbCBPdmVyIEFUTSBhbGxvd3MgQVRNIGVkZ2UgZGV2aWNlcyBzdWNoIGFzIHJvdXRlcnMsCisJICBicmlkZ2VzIGFuZCBBVE0gYXR0YWNoZWQgaG9zdHMgZXN0YWJsaXNoIGRpcmVjdCBBVE0gVkNzIGFjcm9zcworCSAgc3VibmV0d29yayBib3VuZGFyaWVzLiBUaGVzZSBzaG9ydGN1dCBjb25uZWN0aW9ucyBieXBhc3Mgcm91dGVycworCSAgZW5oYW5jaW5nIG92ZXJhbGwgbmV0d29yayBwZXJmb3JtYW5jZS4KKworY29uZmlnIEFUTV9CUjI2ODQKKwl0cmlzdGF0ZSAiUkZDMTQ4My8yNjg0IEJyaWRnZWQgcHJvdG9jb2xzIgorCWRlcGVuZHMgb24gQVRNICYmIElORVQKKwloZWxwCisJICBBVE0gUFZDcyBjYW4gY2FycnkgZXRoZXJuZXQgUERVcyBhY2NvcmRpbmcgdG8gcmZjMjY4NCAoZm9ybWVybHkgMTQ4MykKKwkgIFRoaXMgZGV2aWNlIHdpbGwgYWN0IGxpa2UgYW4gZXRoZXJuZXQgZnJvbSB0aGUga2VybmVscyBwb2ludCBvZiB2aWV3LAorCSAgd2l0aCB0aGUgdHJhZmZpYyBiZWluZyBjYXJyaWVkIGJ5IEFUTSBQVkNzIChjdXJyZW50bHkgMSBQVkMvZGV2aWNlKS4KKwkgIFRoaXMgaXMgc29tZXRpbWVzIHVzZWQgb3ZlciBEU0wgbGluZXMuICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbmZpZyBBVE1fQlIyNjg0X0lQRklMVEVSCisJYm9vbCAiUGVyLVZDIElQIGZpbHRlciBrbHVkZ2UiCisJZGVwZW5kcyBvbiBBVE1fQlIyNjg0CisJaGVscAorCSAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgbWVjaGFuaXNtIGZvciB1c2VycyB3aG8gbmVlZCB0byB0ZXJtaW5hdGluZyBhCisJICBsYXJnZSBudW1iZXIgb2YgSVAtb25seSB2Y2Mncy4gIERvIG5vdCBlbmFibGUgdGhpcyB1bmxlc3MgeW91IGFyZSBzdXJlCisJICB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCisKK2NvbmZpZyBCUklER0UKKwl0cmlzdGF0ZSAiODAyLjFkIEV0aGVybmV0IEJyaWRnaW5nIgorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGVuIHlvdXIgTGludXggYm94IHdpbGwgYmUgYWJsZSB0byBhY3QgYXMgYW4KKwkgIEV0aGVybmV0IGJyaWRnZSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgZGlmZmVyZW50IEV0aGVybmV0IHNlZ21lbnRzIGl0CisJICBpcyBjb25uZWN0ZWQgdG8gd2lsbCBhcHBlYXIgYXMgb25lIEV0aGVybmV0IHRvIHRoZSBwYXJ0aWNpcGFudHMuCisJICBTZXZlcmFsIHN1Y2ggYnJpZGdlcyBjYW4gd29yayB0b2dldGhlciB0byBjcmVhdGUgZXZlbiBsYXJnZXIKKwkgIG5ldHdvcmtzIG9mIEV0aGVybmV0cyB1c2luZyB0aGUgSUVFRSA4MDIuMSBzcGFubmluZyB0cmVlIGFsZ29yaXRobS4KKwkgIEFzIHRoaXMgaXMgYSBzdGFuZGFyZCwgTGludXggYnJpZGdlcyB3aWxsIGNvb3BlcmF0ZSBwcm9wZXJseSB3aXRoCisJICBvdGhlciB0aGlyZCBwYXJ0eSBicmlkZ2UgcHJvZHVjdHMuCisKKwkgIEluIG9yZGVyIHRvIHVzZSB0aGUgRXRoZXJuZXQgYnJpZGdlLCB5b3UnbGwgbmVlZCB0aGUgYnJpZGdlCisJICBjb25maWd1cmF0aW9uIHRvb2xzOyBzZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JyaWRnZS50eHQ+CisJICBmb3IgbG9jYXRpb24uIFBsZWFzZSByZWFkIHRoZSBCcmlkZ2UgbWluaS1IT1dUTyBmb3IgbW9yZQorCSAgaW5mb3JtYXRpb24uCisKKwkgIElmIHlvdSBlbmFibGUgaXB0YWJsZXMgc3VwcG9ydCBhbG9uZyB3aXRoIHRoZSBicmlkZ2Ugc3VwcG9ydCB0aGVuIHlvdQorCSAgdHVybiB5b3VyIGJyaWRnZSBpbnRvIGEgYnJpZGdpbmcgSVAgZmlyZXdhbGwuCisJICBpcHRhYmxlcyB3aWxsIHRoZW4gc2VlIHRoZSBJUCBwYWNrZXRzIGJlaW5nIGJyaWRnZWQsIHNvIHlvdSBuZWVkIHRvCisJICB0YWtlIHRoaXMgaW50byBhY2NvdW50IHdoZW4gc2V0dGluZyB1cCB5b3VyIGZpcmV3YWxsIHJ1bGVzLgorCSAgRW5hYmxpbmcgYXJwdGFibGVzIHN1cHBvcnQgd2hlbiBicmlkZ2luZyB3aWxsIGxldCBhcnB0YWJsZXMgc2VlCisJICBicmlkZ2VkIEFSUCB0cmFmZmljIGluIHRoZSBhcnB0YWJsZXMgRk9SV0FSRCBjaGFpbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGJyaWRnZS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFZMQU5fODAyMVEKKwl0cmlzdGF0ZSAiODAyLjFRIFZMQU4gU3VwcG9ydCIKKwktLS1oZWxwLS0tCisJICBTZWxlY3QgdGhpcyBhbmQgeW91IHdpbGwgYmUgYWJsZSB0byBjcmVhdGUgODAyLjFRIFZMQU4gaW50ZXJmYWNlcworCSAgb24geW91ciBldGhlcm5ldCBpbnRlcmZhY2VzLiAgODAyLjFRIFZMQU4gc3VwcG9ydHMgYWxtb3N0CisJICBldmVyeXRoaW5nIGEgcmVndWxhciBldGhlcm5ldCBpbnRlcmZhY2UgZG9lcywgaW5jbHVkaW5nCisJICBmaXJld2FsbGluZywgYnJpZGdpbmcsIGFuZCBvZiBjb3Vyc2UgSVAgdHJhZmZpYy4gIFlvdSB3aWxsIG5lZWQKKwkgIHRoZSAndmNvbmZpZycgdG9vbCBmcm9tIHRoZSBWTEFOIHByb2plY3QgaW4gb3JkZXIgdG8gZWZmZWN0aXZlbHkKKwkgIHVzZSBWTEFOcy4gIFNlZSB0aGUgVkxBTiB3ZWIgcGFnZSBmb3IgbW9yZSBpbmZvcm1hdGlvbjoKKwkgIDxodHRwOi8vd3d3LmNhbmRlbGF0ZWNoLmNvbS9+Z3JlZWFyL3ZsYW4uaHRtbD4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIDgwMjFxLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgREVDTkVUCisJdHJpc3RhdGUgIkRFQ25ldCBTdXBwb3J0IgorCS0tLWhlbHAtLS0KKwkgIFRoZSBERUNuZXQgbmV0d29ya2luZyBwcm90b2NvbCB3YXMgdXNlZCBpbiBtYW55IHByb2R1Y3RzIG1hZGUgYnkKKwkgIERpZ2l0YWwgKG5vdyBDb21wYXEpLiAgSXQgcHJvdmlkZXMgcmVsaWFibGUgc3RyZWFtIGFuZCBzZXF1ZW5jZWQKKwkgIHBhY2tldCBjb21tdW5pY2F0aW9ucyBvdmVyIHdoaWNoIHJ1biBhIHZhcmlldHkgb2Ygc2VydmljZXMgc2ltaWxhcgorCSAgdG8gdGhvc2Ugd2hpY2ggcnVuIG92ZXIgVENQL0lQLgorCisJICBUbyBmaW5kIHNvbWUgdG9vbHMgdG8gdXNlIHdpdGggdGhlIGtlcm5lbCBsYXllciBzdXBwb3J0LCBwbGVhc2UKKwkgIGxvb2sgYXQgUGF0cmljayBDYXVsZmllbGQncyB3ZWIgc2l0ZToKKwkgIDxodHRwOi8vbGludXgtZGVjbmV0LnNvdXJjZWZvcmdlLm5ldC8+LgorCisJICBNb3JlIGRldGFpbGVkIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGluCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGVjbmV0LnR4dD4uCisKKwkgIEJlIHN1cmUgdG8gc2F5IFkgdG8gIi9wcm9jIGZpbGUgc3lzdGVtIHN1cHBvcnQiIGFuZCAiU3lzY3RsIHN1cHBvcnQiCisJICBiZWxvdyB3aGVuIHVzaW5nIERFQ25ldCwgc2luY2UgeW91IHdpbGwgbmVlZCBzeXNjdGwgc3VwcG9ydCB0byBhaWQKKwkgIGluIGNvbmZpZ3VyYXRpb24gYXQgcnVuIHRpbWUuCisKKwkgIFRoZSBERUNuZXQgY29kZSBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZSAoID0gY29kZSB3aGljaCBjYW4gYmUKKwkgIGluc2VydGVkIGluIGFuZCByZW1vdmVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsIHdoZW5ldmVyIHlvdSB3YW50KS4KKwkgIFRoZSBtb2R1bGUgaXMgY2FsbGVkIGRlY25ldC4KKworc291cmNlICJuZXQvZGVjbmV0L0tjb25maWciCisKK3NvdXJjZSAibmV0L2xsYy9LY29uZmlnIgorCitjb25maWcgSVBYCisJdHJpc3RhdGUgIlRoZSBJUFggcHJvdG9jb2wiCisJc2VsZWN0IExMQworCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgc3VwcG9ydCBmb3IgdGhlIE5vdmVsbCBuZXR3b3JraW5nIHByb3RvY29sLCBJUFgsIGNvbW1vbmx5CisJICB1c2VkIGZvciBsb2NhbCBuZXR3b3JrcyBvZiBXaW5kb3dzIG1hY2hpbmVzLiAgWW91IG5lZWQgaXQgaWYgeW91CisJICB3YW50IHRvIGFjY2VzcyBOb3ZlbGwgTmV0V2FyZSBmaWxlIG9yIHByaW50IHNlcnZlcnMgdXNpbmcgdGhlIExpbnV4CisJICBOb3ZlbGwgY2xpZW50IG5jcGZzIChhdmFpbGFibGUgZnJvbQorCSAgPGZ0cDovL3BsYXRhbi52Yy5jdnV0LmN6L3B1Yi9saW51eC9uY3Bmcy8+KSBvciBmcm9tCisJICB3aXRoaW4gdGhlIExpbnV4IERPUyBlbXVsYXRvciBET1NFTVUgKHJlYWQgdGhlIERPU0VNVS1IT1dUTywKKwkgIGF2YWlsYWJsZSBmcm9tIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4pLiAgSW4gb3JkZXIKKwkgIHRvIGRvIHRoZSBmb3JtZXIsIHlvdSdsbCBhbHNvIGhhdmUgdG8gc2F5IFkgdG8gIk5DUCBmaWxlIHN5c3RlbQorCSAgc3VwcG9ydCIsIGJlbG93LgorCisJICBJUFggaXMgc2ltaWxhciBpbiBzY29wZSB0byBJUCwgd2hpbGUgU1BYLCB3aGljaCBydW5zIG9uIHRvcCBvZiBJUFgsCisJICBpcyBzaW1pbGFyIHRvIFRDUC4gVGhlcmUgaXMgYWxzbyBleHBlcmltZW50YWwgc3VwcG9ydCBmb3IgU1BYIGluCisJICBMaW51eCAoc2VlICJTUFggbmV0d29ya2luZyIsIGJlbG93KS4KKworCSAgVG8gdHVybiB5b3VyIExpbnV4IGJveCBpbnRvIGEgZnVsbHkgZmVhdHVyZWQgTmV0V2FyZSBmaWxlIHNlcnZlciBhbmQKKwkgIElQWCByb3V0ZXIsIHNheSBZIGhlcmUgYW5kIGZldGNoIGVpdGhlciBsd2FyZWQgZnJvbQorCSAgPGZ0cDovL2liaWJsaW8ub3JnL3B1Yi9MaW51eC9zeXN0ZW0vbmV0d29yay9kYWVtb25zLz4gb3IKKwkgIG1hcnNfbndlIGZyb20gPGZ0cDovL3d3dy5jb21wdS1hcnQuZGUvbWFyc19ud2UvPi4gRm9yIG1vcmUKKwkgIGluZm9ybWF0aW9uLCByZWFkIHRoZSBJUFgtSE9XVE8gYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIEdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGNvbm5lY3QgTGludXgsIFdpbmRvd3MgbWFjaGluZXMgYW5kCisJICBNYWNzIGlzIG9uIHRoZSBXV1cgYXQgPGh0dHA6Ly93d3cuZWF0cy5jb20vbGludXhfbWFjX3dpbi5odG1sPi4KKworCSAgVGhlIElQWCBkcml2ZXIgd291bGQgZW5sYXJnZSB5b3VyIGtlcm5lbCBieSBhYm91dCAxNiBLQi4gVG8gY29tcGlsZQorCSAgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaXB4LgorCSAgVW5sZXNzIHlvdSB3YW50IHRvIGludGVncmF0ZSB5b3VyIExpbnV4IGJveCB3aXRoIGEgbG9jYWwgTm92ZWxsCisJICBuZXR3b3JrLCBzYXkgTi4KKworc291cmNlICJuZXQvaXB4L0tjb25maWciCisKK2NvbmZpZyBBVEFMSworCXRyaXN0YXRlICJBcHBsZXRhbGsgcHJvdG9jb2wgc3VwcG9ydCIKKwlzZWxlY3QgTExDCisJLS0taGVscC0tLQorCSAgQXBwbGVUYWxrIGlzIHRoZSBwcm90b2NvbCB0aGF0IEFwcGxlIGNvbXB1dGVycyBjYW4gdXNlIHRvIGNvbW11bmljYXRlCisJICBvbiBhIG5ldHdvcmsuICBJZiB5b3VyIExpbnV4IGJveCBpcyBjb25uZWN0ZWQgdG8gc3VjaCBhIG5ldHdvcmsgYW5kIHlvdQorCSAgd2lzaCB0byBjb25uZWN0IHRvIGl0LCBzYXkgWS4gIFlvdSB3aWxsIG5lZWQgdG8gdXNlIHRoZSBuZXRhdGFsayBwYWNrYWdlCisJICBzbyB0aGF0IHlvdXIgTGludXggYm94IGNhbiBhY3QgYXMgYSBwcmludCBhbmQgZmlsZSBzZXJ2ZXIgZm9yIE1hY3MgYXMKKwkgIHdlbGwgYXMgYWNjZXNzIEFwcGxlVGFsayBwcmludGVycy4gIENoZWNrIG91dAorCSAgPGh0dHA6Ly93d3cuemV0dGFieXRlLm5ldC9uZXRhdGFsay8+IG9uIHRoZSBXV1cgZm9yIGRldGFpbHMuCisJICBFdGhlclRhbGsgaXMgdGhlIG5hbWUgdXNlZCBmb3IgQXBwbGVUYWxrIG92ZXIgRXRoZXJuZXQgYW5kIHRoZQorCSAgY2hlYXBlciBhbmQgc2xvd2VyIExvY2FsVGFsayBpcyBBcHBsZVRhbGsgb3ZlciBhIHByb3ByaWV0YXJ5IEFwcGxlCisJICBuZXR3b3JrIHVzaW5nIHNlcmlhbCBsaW5rcy4gIEV0aGVyVGFsayBhbmQgTG9jYWxUYWxrIGFyZSBmdWxseQorCSAgc3VwcG9ydGVkIGJ5IExpbnV4LgorCisJICBHZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBjb25uZWN0IExpbnV4LCBXaW5kb3dzIG1hY2hpbmVzIGFuZAorCSAgTWFjcyBpcyBvbiB0aGUgV1dXIGF0IDxodHRwOi8vd3d3LmVhdHMuY29tL2xpbnV4X21hY193aW4uaHRtbD4uICBUaGUKKwkgIE5FVC0zLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPiwgY29udGFpbnMgdmFsdWFibGUKKwkgIGluZm9ybWF0aW9uIGFzIHdlbGwuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGFwcGxldGFsay4gWW91IGFsbW9zdCBjZXJ0YWlubHkgd2FudCB0byBjb21waWxlIGl0IGFzIGEKKwkgIG1vZHVsZSBzbyB5b3UgY2FuIHJlc3RhcnQgeW91ciBBcHBsZVRhbGsgc3RhY2sgd2l0aG91dCByZWJvb3RpbmcKKwkgIHlvdXIgbWFjaGluZS4gSSBoZWFyIHRoYXQgdGhlIEdOVSBib3ljb3R0IG9mIEFwcGxlIGlzIG92ZXIsIHNvCisJICBldmVuIHBvbGl0aWNhbGx5IGNvcnJlY3QgcGVvcGxlIGFyZSBhbGxvd2VkIHRvIHNheSBZIGhlcmUuCisKK3NvdXJjZSAiZHJpdmVycy9uZXQvYXBwbGV0YWxrL0tjb25maWciCisKK2NvbmZpZyBYMjUKKwl0cmlzdGF0ZSAiQ0NJVFQgWC4yNSBQYWNrZXQgTGF5ZXIgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwktLS1oZWxwLS0tCisJICBYLjI1IGlzIGEgc2V0IG9mIHN0YW5kYXJkaXplZCBuZXR3b3JrIHByb3RvY29scywgc2ltaWxhciBpbiBzY29wZSB0bworCSAgZnJhbWUgcmVsYXk7IHRoZSBvbmUgcGh5c2ljYWwgbGluZSBmcm9tIHlvdXIgYm94IHRvIHRoZSBYLjI1IG5ldHdvcmsKKwkgIGVudHJ5IHBvaW50IGNhbiBjYXJyeSBzZXZlcmFsIGxvZ2ljYWwgcG9pbnQtdG8tcG9pbnQgY29ubmVjdGlvbnMKKwkgIChjYWxsZWQgInZpcnR1YWwgY2lyY3VpdHMiKSB0byBvdGhlciBjb21wdXRlcnMgY29ubmVjdGVkIHRvIHRoZSBYLjI1CisJICBuZXR3b3JrLiBHb3Zlcm5tZW50cywgYmFua3MsIGFuZCBvdGhlciBvcmdhbml6YXRpb25zIHRlbmQgdG8gdXNlIGl0CisJICB0byBjb25uZWN0IHRvIGVhY2ggb3RoZXIgb3IgdG8gZm9ybSBXaWRlIEFyZWEgTmV0d29ya3MgKFdBTnMpLiBNYW55CisJICBjb3VudHJpZXMgaGF2ZSBwdWJsaWMgWC4yNSBuZXR3b3Jrcy4gWC4yNSBjb25zaXN0cyBvZiB0d28KKwkgIHByb3RvY29sczogdGhlIGhpZ2hlciBsZXZlbCBQYWNrZXQgTGF5ZXIgUHJvdG9jb2wgKFBMUCkgKHNheSBZIGhlcmUKKwkgIGlmIHlvdSB3YW50IHRoYXQpIGFuZCB0aGUgbG93ZXIgbGV2ZWwgZGF0YSBsaW5rIGxheWVyIHByb3RvY29sIExBUEIKKwkgIChzYXkgWSB0byAiTEFQQiBEYXRhIExpbmsgRHJpdmVyIiBiZWxvdyBpZiB5b3Ugd2FudCB0aGF0KS4KKworCSAgWW91IGNhbiByZWFkIG1vcmUgYWJvdXQgWC4yNSBhdCA8aHR0cDovL3d3dy5zYW5nb21hLmNvbS94MjUuaHRtPiBhbmQKKwkgIDxodHRwOi8vd3d3LmNpc2NvLmNvbS91bml2ZXJjZC9jYy90ZC9kb2MvcHJvZHVjdC9zb2Z0d2FyZS9pb3MxMS9jYm9vay9jeDI1Lmh0bT4uCisJICBJbmZvcm1hdGlvbiBhYm91dCBYLjI1IGZvciBMaW51eCBpcyBjb250YWluZWQgaW4gdGhlIGZpbGVzCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcveDI1LnR4dD4gYW5kCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcveDI1LWlmYWNlLnR4dD4uCisKKwkgIE9uZSBjb25uZWN0cyB0byBhbiBYLjI1IG5ldHdvcmsgZWl0aGVyIHdpdGggYSBkZWRpY2F0ZWQgbmV0d29yayBjYXJkCisJICB1c2luZyB0aGUgWC4yMSBwcm90b2NvbCAobm90IHlldCBzdXBwb3J0ZWQgYnkgTGludXgpIG9yIG9uZSBjYW4gZG8KKwkgIFguMjUgb3ZlciBhIHN0YW5kYXJkIHRlbGVwaG9uZSBsaW5lIHVzaW5nIGFuIG9yZGluYXJ5IG1vZGVtIChzYXkgWQorCSAgdG8gIlguMjUgYXN5bmMgZHJpdmVyIiBiZWxvdykgb3Igb3ZlciBFdGhlcm5ldCB1c2luZyBhbiBvcmRpbmFyeQorCSAgRXRoZXJuZXQgY2FyZCBhbmQgdGhlIExBUEIgb3ZlciBFdGhlcm5ldCAoc2F5IFkgdG8gIkxBUEIgRGF0YSBMaW5rCisJICBEcml2ZXIiIGFuZCAiTEFQQiBvdmVyIEV0aGVybmV0IGRyaXZlciIgYmVsb3cpLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCB4MjUuIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBMQVBCCisJdHJpc3RhdGUgIkxBUEIgRGF0YSBMaW5rIERyaXZlciAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCS0tLWhlbHAtLS0KKwkgIExpbmsgQWNjZXNzIFByb2NlZHVyZSwgQmFsYW5jZWQgKExBUEIpIGlzIHRoZSBkYXRhIGxpbmsgbGF5ZXIgKGkuZS4KKwkgIHRoZSBsb3dlcikgcGFydCBvZiB0aGUgWC4yNSBwcm90b2NvbC4gSXQgb2ZmZXJzIGEgcmVsaWFibGUKKwkgIGNvbm5lY3Rpb24gc2VydmljZSB0byBleGNoYW5nZSBkYXRhIGZyYW1lcyB3aXRoIG9uZSBvdGhlciBob3N0LCBhbmQKKwkgIGl0IGlzIHVzZWQgdG8gdHJhbnNwb3J0IGhpZ2hlciBsZXZlbCBwcm90b2NvbHMgKG1vc3RseSBYLjI1IFBhY2tldAorCSAgTGF5ZXIsIHRoZSBoaWdoZXIgcGFydCBvZiBYLjI1LCBidXQgb3RoZXJzIGFyZSBwb3NzaWJsZSBhcyB3ZWxsKS4KKwkgIFVzdWFsbHksIExBUEIgaXMgdXNlZCB3aXRoIHNwZWNpYWxpemVkIFguMjEgbmV0d29yayBjYXJkcywgYnV0IExpbnV4CisJICBjdXJyZW50bHkgc3VwcG9ydHMgTEFQQiBvbmx5IG92ZXIgRXRoZXJuZXQgY29ubmVjdGlvbnMuIElmIHlvdSB3YW50CisJICB0byB1c2UgTEFQQiBjb25uZWN0aW9ucyBvdmVyIEV0aGVybmV0LCBzYXkgWSBoZXJlIGFuZCB0byAiTEFQQiBvdmVyCisJICBFdGhlcm5ldCBkcml2ZXIiIGJlbG93LiBSZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbGFwYi1tb2R1bGUudHh0PiBmb3IgdGVjaG5pY2FsCisJICBkZXRhaWxzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBsYXBiLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5FVF9ESVZFUlQKKwlib29sICJGcmFtZSBEaXZlcnRlciAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCS0tLWhlbHAtLS0KKwkgIFRoZSBGcmFtZSBEaXZlcnRlciBhbGxvd3MgeW91IHRvIGRpdmVydCBwYWNrZXRzIGZyb20gdGhlCisJICBuZXR3b3JrLCB0aGF0IGFyZSBub3QgYWltZWQgYXQgdGhlIGludGVyZmFjZSByZWNlaXZpbmcgaXQgKGluCisJICBwcm9taXNjLiBtb2RlKS4gVHlwaWNhbGx5LCBhIExpbnV4IGJveCBzZXR1cCBhcyBhbiBFdGhlcm5ldCBicmlkZ2UKKwkgIHdpdGggdGhlIEZyYW1lcyBEaXZlcnRlciBvbiwgY2FuIGRvIHNvbWUgKnJlYWxseSogdHJhbnNwYXJlbnQgd3d3CisJICBjYWNoaW5nIHVzaW5nIGEgU3F1aWQgcHJveHkgZm9yIGV4YW1wbGUuCisKKwkgIFRoaXMgaXMgdmVyeSB1c2VmdWwgd2hlbiB5b3UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgeW91ciByb3V0ZXIncworCSAgY29uZmlnIChvciBpZiB5b3Ugc2ltcGx5IGRvbid0IGhhdmUgYWNjZXNzIHRvIGl0KS4KKworCSAgVGhlIG90aGVyIHBvc3NpYmxlIHVzYWdlcyBvZiBkaXZlcnRpbmcgRXRoZXJuZXQgRnJhbWVzIGFyZQorCSAgbnVtYmVyb3VzOgorCSAgLSByZXJvdXRlIHNtdHAgdHJhZmZpYyB0byBhbm90aGVyIGludGVyZmFjZQorCSAgLSB0cmFmZmljLXNoYXBlIGNlcnRhaW4gbmV0d29yayBzdHJlYW1zCisJICAtIHRyYW5zcGFyZW50bHkgcHJveHkgc210cCBjb25uZWN0aW9ucworCSAgLSBldGMuLi4KKworCSAgRm9yIG1vcmUgaW5mb3JtYXRpb25zLCBwbGVhc2UgcmVmZXIgdG86CisJICA8aHR0cDovL2RpdmVydGVyLnNvdXJjZWZvcmdlLm5ldC8+CisJICA8aHR0cDovL3BlcnNvLndhbmFkb28uZnIvbWFncGllL0V0aGVyRGl2ZXJ0Lmh0bWw+CisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBFQ09ORVQKKwl0cmlzdGF0ZSAiQWNvcm4gRWNvbmV0L0FVTiBwcm90b2NvbHMgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgSU5FVAorCS0tLWhlbHAtLS0KKwkgIEVjb25ldCBpcyBhIGZhaXJseSBvbGQgYW5kIHNsb3cgbmV0d29ya2luZyBwcm90b2NvbCBtYWlubHkgdXNlZCBieQorCSAgQWNvcm4gY29tcHV0ZXJzIHRvIGFjY2VzcyBmaWxlIGFuZCBwcmludCBzZXJ2ZXJzLiBJdCB1c2VzIG5hdGl2ZQorCSAgRWNvbmV0IG5ldHdvcmsgY2FyZHMuIEFVTiBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaGlnaGVyIGxldmVsCisJICBwYXJ0cyBvZiBFY29uZXQgdGhhdCBydW5zIG92ZXIgb3JkaW5hcnkgRXRoZXJuZXQgY29ubmVjdGlvbnMsIG9uCisJICB0b3Agb2YgdGhlIFVEUCBwYWNrZXQgcHJvdG9jb2wsIHdoaWNoIGluIHR1cm4gcnVucyBvbiB0b3Agb2YgdGhlCisJICBJbnRlcm5ldCBwcm90b2NvbCBJUC4KKworCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSBjYW4gY2hvb3NlIHdpdGggdGhlIG5leHQgdHdvIG9wdGlvbnMgd2hldGhlcgorCSAgdG8gc2VuZCBFY29uZXQvQVVOIHRyYWZmaWMgb3ZlciBhIFVEUCBFdGhlcm5ldCBjb25uZWN0aW9uIG9yIG92ZXIKKwkgIGEgbmF0aXZlIEVjb25ldCBuZXR3b3JrIGNhcmQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGVjb25ldC4KKworY29uZmlnIEVDT05FVF9BVU5VRFAKKwlib29sICJBVU4gb3ZlciBVRFAiCisJZGVwZW5kcyBvbiBFQ09ORVQKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHNlbmQgRWNvbmV0L0FVTiB0cmFmZmljIG92ZXIgYSBVRFAKKwkgIGNvbm5lY3Rpb24gKFVEUCBpcyBhIHBhY2tldCBiYXNlZCBwcm90b2NvbCB0aGF0IHJ1bnMgb24gdG9wIG9mIHRoZQorCSAgSW50ZXJuZXQgcHJvdG9jb2wgSVApIHVzaW5nIGFuIG9yZGluYXJ5IEV0aGVybmV0IG5ldHdvcmsgY2FyZC4KKworY29uZmlnIEVDT05FVF9OQVRJVkUKKwlib29sICJOYXRpdmUgRWNvbmV0IgorCWRlcGVuZHMgb24gRUNPTkVUCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIG5hdGl2ZSBFY29uZXQgbmV0d29yayBjYXJkIGluc3RhbGxlZCBpbgorCSAgeW91ciBjb21wdXRlci4KKworY29uZmlnIFdBTl9ST1VURVIKKwl0cmlzdGF0ZSAiV0FOIHJvdXRlciIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCS0tLWhlbHAtLS0KKwkgIFdpZGUgQXJlYSBOZXR3b3JrcyAoV0FOcyksIHN1Y2ggYXMgWC4yNSwgZnJhbWUgcmVsYXkgYW5kIGxlYXNlZAorCSAgbGluZXMsIGFyZSB1c2VkIHRvIGludGVyY29ubmVjdCBMb2NhbCBBcmVhIE5ldHdvcmtzIChMQU5zKSBvdmVyIHZhc3QKKwkgIGRpc3RhbmNlcyB3aXRoIGRhdGEgdHJhbnNmZXIgcmF0ZXMgc2lnbmlmaWNhbnRseSBoaWdoZXIgdGhhbiB0aG9zZQorCSAgYWNoaWV2YWJsZSB3aXRoIGNvbW1vbmx5IHVzZWQgYXN5bmNocm9ub3VzIG1vZGVtIGNvbm5lY3Rpb25zLgorCSAgVXN1YWxseSwgYSBxdWl0ZSBleHBlbnNpdmUgZXh0ZXJuYWwgZGV2aWNlIGNhbGxlZCBhIGBXQU4gcm91dGVyJyBpcworCSAgbmVlZGVkIHRvIGNvbm5lY3QgdG8gYSBXQU4uCisKKwkgIEFzIGFuIGFsdGVybmF0aXZlLCBXQU4gcm91dGluZyBjYW4gYmUgYnVpbHQgaW50byB0aGUgTGludXgga2VybmVsLgorCSAgV2l0aCByZWxhdGl2ZWx5IGluZXhwZW5zaXZlIFdBTiBpbnRlcmZhY2UgY2FyZHMgYXZhaWxhYmxlIG9uIHRoZQorCSAgbWFya2V0LCBhIHBlcmZlY3RseSB1c2FibGUgcm91dGVyIGNhbiBiZSBidWlsdCBmb3IgbGVzcyB0aGFuIGhhbGYKKwkgIHRoZSBwcmljZSBvZiBhbiBleHRlcm5hbCByb3V0ZXIuICBJZiB5b3UgaGF2ZSBvbmUgb2YgdGhvc2UgY2FyZHMgYW5kCisJICB3aXNoIHRvIHVzZSB5b3VyIExpbnV4IGJveCBhcyBhIFdBTiByb3V0ZXIsIHNheSBZIGhlcmUgYW5kIGFsc28gdG8KKwkgIHRoZSBXQU4gZHJpdmVyIGZvciB5b3VyIGNhcmQsIGJlbG93LiAgWW91IHdpbGwgdGhlbiBuZWVkIHRoZQorCSAgd2FuLXRvb2xzIHBhY2thZ2Ugd2hpY2ggaXMgYXZhaWxhYmxlIGZyb20gPGZ0cDovL2Z0cC5zYW5nb21hLmNvbS8+LgorCSAgUmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvd2FuLXJvdXRlci50eHQ+IGZvciBtb3JlCisJICBpbmZvcm1hdGlvbi4KKworCSAgVG8gY29tcGlsZSBXQU4gcm91dGluZyBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB3YW5yb3V0ZXIuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK21lbnUgIlFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZyIKKworY29uZmlnIE5FVF9TQ0hFRAorCWJvb2wgIlFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZyIKKwktLS1oZWxwLS0tCisJICBXaGVuIHRoZSBrZXJuZWwgaGFzIHNldmVyYWwgcGFja2V0cyB0byBzZW5kIG91dCBvdmVyIGEgbmV0d29yaworCSAgZGV2aWNlLCBpdCBoYXMgdG8gZGVjaWRlIHdoaWNoIG9uZXMgdG8gc2VuZCBmaXJzdCwgd2hpY2ggb25lcyB0bworCSAgZGVsYXksIGFuZCB3aGljaCBvbmVzIHRvIGRyb3AuIFRoaXMgaXMgdGhlIGpvYiBvZiB0aGUgcGFja2V0CisJICBzY2hlZHVsZXIsIGFuZCBzZXZlcmFsIGRpZmZlcmVudCBhbGdvcml0aG1zIGZvciBob3cgdG8gZG8gdGhpcworCSAgImZhaXJseSIgaGF2ZSBiZWVuIHByb3Bvc2VkLgorCisJICBJZiB5b3Ugc2F5IE4gaGVyZSwgeW91IHdpbGwgZ2V0IHRoZSBzdGFuZGFyZCBwYWNrZXQgc2NoZWR1bGVyLCB3aGljaAorCSAgaXMgYSBGSUZPIChmaXJzdCBjb21lLCBmaXJzdCBzZXJ2ZWQpLiBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgYmUKKwkgIGFibGUgdG8gY2hvb3NlIGZyb20gYW1vbmcgc2V2ZXJhbCBhbHRlcm5hdGl2ZSBhbGdvcml0aG1zIHdoaWNoIGNhbgorCSAgdGhlbiBiZSBhdHRhY2hlZCB0byBkaWZmZXJlbnQgbmV0d29yayBkZXZpY2VzLiBUaGlzIGlzIHVzZWZ1bCBmb3IKKwkgIGV4YW1wbGUgaWYgc29tZSBvZiB5b3VyIG5ldHdvcmsgZGV2aWNlcyBhcmUgcmVhbCB0aW1lIGRldmljZXMgdGhhdAorCSAgbmVlZCBhIGNlcnRhaW4gbWluaW11bSBkYXRhIGZsb3cgcmF0ZSwgb3IgaWYgeW91IG5lZWQgdG8gbGltaXQgdGhlCisJICBtYXhpbXVtIGRhdGEgZmxvdyByYXRlIGZvciB0cmFmZmljIHdoaWNoIG1hdGNoZXMgc3BlY2lmaWVkIGNyaXRlcmlhLgorCSAgVGhpcyBjb2RlIGlzIGNvbnNpZGVyZWQgdG8gYmUgZXhwZXJpbWVudGFsLgorCisJICBUbyBhZG1pbmlzdGVyIHRoZXNlIHNjaGVkdWxlcnMsIHlvdSdsbCBuZWVkIHRoZSB1c2VyLWxldmVsIHV0aWxpdGllcworCSAgZnJvbSB0aGUgcGFja2FnZSBpcHJvdXRlMit0YyBhdCA8ZnRwOi8vZnRwLnR1eC5vcmcvcHViL25ldC9pcC1yb3V0aW5nLz4uCisJICBUaGF0IHBhY2thZ2UgYWxzbyBjb250YWlucyBzb21lIGRvY3VtZW50YXRpb247IGZvciBtb3JlLCBjaGVjayBvdXQKKwkgIDxodHRwOi8vc25hZnUuZnJlZWRvbS5vcmcvbGludXgyLjIvaXByb3V0ZS1ub3Rlcy5odG1sPi4KKworCSAgVGhpcyBRdWFsaXR5IG9mIFNlcnZpY2UgKFFvUykgc3VwcG9ydCB3aWxsIGVuYWJsZSB5b3UgdG8gdXNlCisJICBEaWZmZXJlbnRpYXRlZCBTZXJ2aWNlcyAoZGlmZnNlcnYpIGFuZCBSZXNvdXJjZSBSZXNlcnZhdGlvbiBQcm90b2NvbAorCSAgKFJTVlApIG9uIHlvdXIgTGludXggcm91dGVyIGlmIHlvdSBhbHNvIHNheSBZIHRvICJRb1Mgc3VwcG9ydCIsCisJICAiUGFja2V0IGNsYXNzaWZpZXIgQVBJIiBhbmQgdG8gc29tZSBjbGFzc2lmaWVycyBiZWxvdy4gRG9jdW1lbnRhdGlvbgorCSAgYW5kIHNvZnR3YXJlIGlzIGF0IDxodHRwOi8vZGlmZnNlcnYuc291cmNlZm9yZ2UubmV0Lz4uCisKKwkgIElmIHlvdSBzYXkgWSBoZXJlIGFuZCB0byAiL3Byb2MgZmlsZSBzeXN0ZW0iIGJlbG93LCB5b3Ugd2lsbCBiZSBhYmxlCisJICB0byByZWFkIHN0YXR1cyBpbmZvcm1hdGlvbiBhYm91dCBwYWNrZXQgc2NoZWR1bGVycyBmcm9tIHRoZSBmaWxlCisJICAvcHJvYy9uZXQvcHNjaGVkLgorCisJICBUaGUgYXZhaWxhYmxlIHNjaGVkdWxlcnMgYXJlIGxpc3RlZCBpbiB0aGUgZm9sbG93aW5nIHF1ZXN0aW9uczsgeW91CisJICBjYW4gc2F5IFkgdG8gYXMgbWFueSBhcyB5b3UgbGlrZS4gSWYgdW5zdXJlLCBzYXkgTiBub3cuCisKK3NvdXJjZSAibmV0L3NjaGVkL0tjb25maWciCisKK2VuZG1lbnUKKworbWVudSAiTmV0d29yayB0ZXN0aW5nIgorCitjb25maWcgTkVUX1BLVEdFTgorCXRyaXN0YXRlICJQYWNrZXQgR2VuZXJhdG9yIChVU0UgV0lUSCBDQVVUSU9OKSIKKwlkZXBlbmRzIG9uIFBST0NfRlMKKwktLS1oZWxwLS0tCisJICBUaGlzIG1vZHVsZSB3aWxsIGluamVjdCBwcmVjb25maWd1cmVkIHBhY2tldHMsIGF0IGEgY29uZmlndXJhYmxlCisJICByYXRlLCBvdXQgb2YgYSBnaXZlbiBpbnRlcmZhY2UuICBJdCBpcyB1c2VkIGZvciBuZXR3b3JrIGludGVyZmFjZQorCSAgc3RyZXNzIHRlc3RpbmcgYW5kIHBlcmZvcm1hbmNlIGFuYWx5c2lzLiAgSWYgeW91IGRvbid0IHVuZGVyc3RhbmQKKwkgIHdoYXQgd2FzIGp1c3Qgc2FpZCwgeW91IGRvbid0IG5lZWQgaXQ6IHNheSBOLgorCisJICBEb2N1bWVudGF0aW9uIG9uIGhvdyB0byB1c2UgdGhlIHBhY2tldCBnZW5lcmF0b3IgY2FuIGJlIGZvdW5kCisJICBhdCA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcGt0Z2VuLnR4dD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBwa3RnZW4uCisKK2VuZG1lbnUKKworZW5kbWVudQorCitjb25maWcgTkVUUE9MTAorCWRlZl9ib29sIE5FVENPTlNPTEUKKworY29uZmlnIE5FVFBPTExfUlgKKwlib29sICJOZXRwb2xsIHN1cHBvcnQgZm9yIHRyYXBwaW5nIGluY29taW5nIHBhY2tldHMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBORVRQT0xMCisKK2NvbmZpZyBORVRQT0xMX1RSQVAKKwlib29sICJOZXRwb2xsIHRyYWZmaWMgdHJhcHBpbmciCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBORVRQT0xMCisKK2NvbmZpZyBORVRfUE9MTF9DT05UUk9MTEVSCisJZGVmX2Jvb2wgTkVUUE9MTAorCitzb3VyY2UgIm5ldC9heDI1L0tjb25maWciCisKK3NvdXJjZSAibmV0L2lyZGEvS2NvbmZpZyIKKworc291cmNlICJuZXQvYmx1ZXRvb3RoL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9uZXQvS2NvbmZpZyIKKworZW5kbWVudQorCmRpZmYgLS1naXQgYS9uZXQvTWFrZWZpbGUgYi9uZXQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyYmRjMAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9NYWtlZmlsZQpAQCAtMCwwICsxLDQ4IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXggbmV0d29ya2luZy4KKyMKKyMgMiBTZXAgMjAwMCwgQ2hyaXN0b3BoIEhlbGx3aWcgPGhjaEBpbmZyYWRlYWQub3JnPgorIyBSZXdyaXR0ZW4gdG8gdXNlIGxpc3RzIGluc3RlYWQgb2YgaWYtc3RhdGVtZW50cy4KKyMKKworb2JqLXkJOj0gbm9uZXQubworCitvYmotJChDT05GSUdfTkVUKQkJOj0gc29ja2V0Lm8gY29yZS8KKwordG1wLSQoQ09ORklHX0NPTVBBVCkgCQk6PSBjb21wYXQubworb2JqLSQoQ09ORklHX05FVCkJCSs9ICQodG1wLXkpCisKKyMgTExDIGhhcyB0byBiZSBsaW5rZWQgYmVmb3JlIHRoZSBmaWxlcyBpbiBuZXQvODAyLworb2JqLSQoQ09ORklHX0xMQykJCSs9IGxsYy8KK29iai0kKENPTkZJR19ORVQpCQkrPSBldGhlcm5ldC8gODAyLyBzY2hlZC8gbmV0bGluay8KK29iai0kKENPTkZJR19JTkVUKQkJKz0gaXB2NC8KK29iai0kKENPTkZJR19YRlJNKQkJKz0geGZybS8KK29iai0kKENPTkZJR19VTklYKQkJKz0gdW5peC8KK2lmbmVxICgkKENPTkZJR19JUFY2KSwpCitvYmoteQkJCQkrPSBpcHY2LworZW5kaWYKK29iai0kKENPTkZJR19QQUNLRVQpCQkrPSBwYWNrZXQvCitvYmotJChDT05GSUdfTkVUX0tFWSkJCSs9IGtleS8KK29iai0kKENPTkZJR19ORVRfU0NIRUQpCQkrPSBzY2hlZC8KK29iai0kKENPTkZJR19CUklER0UpCQkrPSBicmlkZ2UvCitvYmotJChDT05GSUdfSVBYKQkJKz0gaXB4Lworb2JqLSQoQ09ORklHX0FUQUxLKQkJKz0gYXBwbGV0YWxrLworb2JqLSQoQ09ORklHX1dBTl9ST1VURVIpCSs9IHdhbnJvdXRlci8KK29iai0kKENPTkZJR19YMjUpCQkrPSB4MjUvCitvYmotJChDT05GSUdfTEFQQikJCSs9IGxhcGIvCitvYmotJChDT05GSUdfTkVUUk9NKQkJKz0gbmV0cm9tLworb2JqLSQoQ09ORklHX1JPU0UpCQkrPSByb3NlLworb2JqLSQoQ09ORklHX0FYMjUpCQkrPSBheDI1Lworb2JqLSQoQ09ORklHX0lSREEpCQkrPSBpcmRhLworb2JqLSQoQ09ORklHX0JUKQkJKz0gYmx1ZXRvb3RoLworb2JqLSQoQ09ORklHX1NVTlJQQykJCSs9IHN1bnJwYy8KK29iai0kKENPTkZJR19SWFJQQykJCSs9IHJ4cnBjLworb2JqLSQoQ09ORklHX0FUTSkJCSs9IGF0bS8KK29iai0kKENPTkZJR19ERUNORVQpCQkrPSBkZWNuZXQvCitvYmotJChDT05GSUdfRUNPTkVUKQkJKz0gZWNvbmV0Lworb2JqLSQoQ09ORklHX1ZMQU5fODAyMVEpCSs9IDgwMjFxLworb2JqLSQoQ09ORklHX0lQX1NDVFApCQkrPSBzY3RwLworCitpZmVxICgkKENPTkZJR19ORVQpLHkpCitvYmotJChDT05GSUdfU1lTQ1RMKQkJKz0gc3lzY3RsX25ldC5vCitlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L1RVTkFCTEUgYi9uZXQvVFVOQUJMRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTEzMjExCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L1RVTkFCTEUKQEAgLTAsMCArMSw1MCBAQAorVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIHNob3VsZCBiZSB0dW5hYmxlIGF0IGNvbXBpbGUgdGltZS4gU29tZSBvZiB0aGVtCitleGlzdCBhcyBzeXNjdGxzIHRvby4KKworVGhpcyBpcyBmYXIgZnJvbSBjb21wbGV0ZQorCitJdGVtCQkJRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK01BWF9MSU5LUwkJTWF4aW11bSBudW1iZXIgb2YgbmV0bGluayBtaW5vciBkZXZpY2VzLiAoMS0zMikKK1JJRl9UQUJMRV9TSVpFCQlUb2tlbiByaW5nIFJJRiBjYWNoZSBzaXplICh0dW5hYmxlKQorQUFSUF9IQVNIX1NJWkUJCVNpemUgb2YgQXBwbGV0YWxrIGhhc2ggdGFibGUgKHR1bmFibGUpCitBWDI1X0RFRl9UMQkJQVguMjUgcGFyYW1ldGVycy4gVGhlc2UgYXJlIGFsbCB0dW5hYmxlIHZpYQorQVgyNV9ERUZfVDIJCVNJT0NBWDI1U0VUUEFSTVMKK0FYMjVfREVGX1QzCQlUMS1UMyxOMiBoYXZlIHRoZSBtZWFuaW5ncyBpbiB0aGUgc3BlY2lmaWNhdGlvbgorQVgyNV9ERUZfTjIKK0FYMjVfREVGX0FYREVGTU9ERQk4ID0gbm9ybWFsIDEyOCBpcyBQRTFDSEwgZXh0ZW5kZWQKK0FYMjVfREVGX0lQREVGTU9ERQknRCcgLSBkYXRhZ3JhbSAgJ1YnIC0gdmlydHVhbCBjb25uZWN0aW9uCitBWDI1X0RFRl9CQUNLT0ZGCSdFJ3hwb25lbnRpYWwgJ0wnaW5lYXIKK0FYMjVfREVGX05FVFJPTQkJQWxsb3cgbmV0cm9tIDE9WQorQVgyNV9ERl9URVhUCQlBbGxvdyBQSUQ9VGV4dCAxPVkKK0FYMjVfREVGX1dJTkRPVwkJV2luZG93IGZvciBub3JtYWwgbW9kZQorQVgyNV9ERUZfRVdJTkRPVwlXaW5kb3cgZm9yIFBFMUNITCBtb2RlCitBWDI1X0RFRl9ESUdJCQkxIGZvciBpbmJhbmQgMiBmb3IgY3Jvc3MgYmFuZCAzIGZvciBib3RoCitBWDI1X0RFRl9DT05NT0RFCUFsbG93IGNvbm5lY3RlZCBtb2RlcyAxPVllcworQVgyNV9ST1VURV9NQVgJCUFYLjI1IHJvdXRlIGNhY2hlIHNpemUgLSBubyBjdXJyZW50bHkgdHVuYWJsZQorVW5uYW1lZCAoMTYpCQlOdW1iZXIgb2YgcHJvdG9jb2wgaGFzaCBzbG90cyAodHVuYWJsZSkKK0RFVl9OVU1CVUZGUwkJTnVtYmVyIG9mIHByaW9yaXR5IGxldmVscyAobm90IGVhc2lseSB0dW5hYmxlKQorVW5uYW1lZCAoMzAwKQkJTWF4aW11bSBwYWNrZXQgYmFja2xvZyBxdWV1ZSAodHVuYWJsZSkKK01BWF9JT1ZFQwkJTWF4aW11bSBudW1iZXIgb2YgaW92ZWNzIGluIGEgbWVzc2FnZSAodHVuYWJsZSkKK01JTl9XSU5ET1cJCU9mZmVyZWQgbWluaW11bSB3aW5kb3cgKHR1bmFibGUpCitNQVhfV0lORE9XCQlPZmZlcmVkIG1heGltdW0gd2luZG93ICh0dW5hYmxlKQorTUFYX0hFQURFUgkJTGFyZ2VzdCBwaHlzaWNhbCBoZWFkZXIgKHR1bmFibGUpCitNQVhfQUREUl9MRU4JCUxhcmdlc3QgcGh5c2ljYWwgYWRkcmVzcyAodHVuYWJsZSkKK1NPQ0tfQVJSQVlfU0laRQkJSVAgc29ja2V0IGFycmF5IGhhc2ggc2l6ZSAodHVuYWJsZSkKK0lQX01BWF9NRU1CRVJTSElQUwlMYXJnZXN0IG51bWJlciBvZiBncm91cHMgcGVyIHNvY2tldCAoQlNEIHN0eWxlKSAodHVuYWJsZSkKKzE2CQkJSGFyZCBjb2RlZCBjb25zdGFudCBmb3IgYW1vdW50IG9mIHJvb20gYWxsb3dlZCBmb3IKKwkJCWNhY2hlIGFsaWduIGFuZCBmYXN0ZXIgZm9yd2FyZGluZyAodHVuYWJsZSkKK0lQX0ZSQUdfVElNRQkJVGltZSB3ZSBob2xkIGEgZnJhZ21lbnQgZm9yLiAodHVuYWJsZSkKK1BPUlRfTUFTUV9CRUdJTgkJRmlyc3QgcG9ydCByZXNlcnZlZCBmb3IgbWFzcXVlcmFkZSAodHVuYWJsZSkKK1BPUlRfTUFTUV9FTkQJCUxhc3QgcG9ydCB1c2VkIGZvciBtYXNxdWVyYWRlCSh0dW5hYmxlKQorTUFTUVVFUkFERV9FWFBJUkVfVENQX0ZJTglUaW1lIHdlIGtlZXAgYSBtYXNxdWVyYWRlIGZvciBhZnRlciBhIEZJTgorTUFTUVVFUkFERV9FWFBJUkVfVURQCVRpbWUgd2Uga2VlcCBhIFVEUCBtYXNxdWVyYWRlIGZvciAodHVuYWJsZSkKK01BWFZJRlMJCQlNYXhpbXVtIG1yb3V0ZWQgdmlmcyAoMS0zMikKK01GQ19MSU5FUwkJTGluZXMgaW4gdGhlIG11bHRpY2FzdCByb3V0ZXIgY2FjaGUgKHR1bmFibGUpCisKK05ldFJPTSBwYXJhbWV0ZXJzIGFyZSB0dW5hYmxlIHZpYSBhbiBpb2N0bCBwYXNzaW5nIGEgc3RydWN0CisKKzQwMDAJCQlTaXplIGEgVW5peCBkb21haW4gc29ja2V0IG1hbGxvYyBmYWxscyBiYWNrIHRvIAorCQkJKHR1bmFibGUpIHNob3VsZCBiZSA4SyAtIGEgYml0IGZvciA4SyBtYWNoaW5lcyBsaWtlCisJCQl0aGUgQUxQSEEKKwpkaWZmIC0tZ2l0IGEvbmV0L2FwcGxldGFsay9NYWtlZmlsZSBiL25ldC9hcHBsZXRhbGsvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkYTU2ZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9hcHBsZXRhbGsvTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggQXBwbGVUYWxrIGxheWVyLgorIworCitvYmotJChDT05GSUdfQVRBTEspICs9IGFwcGxldGFsay5vCisKK2FwcGxldGFsay15CQkJOj0gYWFycC5vIGRkcC5vIGRldi5vCithcHBsZXRhbGstJChDT05GSUdfUFJPQ19GUykJKz0gYXRhbGtfcHJvYy5vCithcHBsZXRhbGstJChDT05GSUdfU1lTQ1RMKQkrPSBzeXNjdGxfbmV0X2F0YWxrLm8KZGlmZiAtLWdpdCBhL25ldC9hcHBsZXRhbGsvYWFycC5jIGIvbmV0L2FwcGxldGFsay9hYXJwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ2NDBjMAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9hcHBsZXRhbGsvYWFycC5jCkBAIC0wLDAgKzEsMTA2OSBAQAorLyoKKyAqCUFBUlA6CQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQXBwbGVUYWxrIEFBUlAgcHJvdG9jb2wgZm9yCisgKgkJCUV0aGVybmV0ICdFTEFQJy4KKyAqCisgKgkJQWxhbiBDb3ggIDxBbGFuLkNveEBsaW51eC5vcmc+CisgKgorICoJVGhpcyBkb2Vzbid0IGZpdCBjbGVhbmx5IHdpdGggdGhlIElQIGFycC4gUG90ZW50aWFsbHkgd2UgY2FuIHVzZQorICoJdGhlIGdlbmVyaWMgbmVpZ2hib3VyIGRpc2NvdmVyeSBjb2RlIHRvIGNsZWFuIHRoaXMgdXAuCisgKgorICoJRklYTUU6CisgKgkJV2Ugb3VnaHQgdG8gaGFuZGxlIHRoZSByZXRyYW5zbWl0cyB3aXRoIGEgc2luZ2xlIGxpc3QgYW5kIGEKKyAqCXNlcGFyYXRlIGZhc3QgdGltZXIgZm9yIHdoZW4gaXQgaXMgbmVlZGVkLgorICoJCVVzZSBuZWlnaGJvdXIgZGlzY292ZXJ5IGNvZGUuCisgKgkJVG9rZW4gUmluZyBTdXBwb3J0LgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCisgKglSZWZlcmVuY2VzOgorICoJCUluc2lkZSBBcHBsZVRhbGsgKDJuZCBFZCkuCisgKglGaXhlczoKKyAqCQlKYXVtZSBHcmF1CS0JZmx1c2ggY2FjaGVzIG9uIEFBUlBfUFJPQkUKKyAqCQlSb2IgTmV3YmVycnkJLQlBZGRlZCBwcm94eSBBQVJQIGFuZCBBQVJQIHByb2MgZnMsCisgKgkJCQkJbW92ZWQgcHJvYmluZyBmcm9tIEREUCBtb2R1bGUuCisgKgkJQXJuYWxkbyBDLiBNZWxvIC0JZG9uJ3QgbWFuZ2xlIHJ4IHBhY2tldHMKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2RhdGFsaW5rLmg+CisjaW5jbHVkZSA8bmV0L3BzbmFwLmg+CisjaW5jbHVkZSA8bGludXgvYXRhbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKK2ludCBzeXNjdGxfYWFycF9leHBpcnlfdGltZSA9IEFBUlBfRVhQSVJZX1RJTUU7CitpbnQgc3lzY3RsX2FhcnBfdGlja190aW1lID0gQUFSUF9USUNLX1RJTUU7CitpbnQgc3lzY3RsX2FhcnBfcmV0cmFuc21pdF9saW1pdCA9IEFBUlBfUkVUUkFOU01JVF9MSU1JVDsKK2ludCBzeXNjdGxfYWFycF9yZXNvbHZlX3RpbWUgPSBBQVJQX1JFU09MVkVfVElNRTsKKworLyogTGlzdHMgb2YgYWFycCBlbnRyaWVzICovCisvKioKKyAqCXN0cnVjdCBhYXJwX2VudHJ5IC0gQUFSUCBlbnRyeQorICoJQGxhc3Rfc2VudCAtIExhc3QgdGltZSB3ZSB4bWl0dGVkIHRoZSBhYXJwIHJlcXVlc3QKKyAqCUBwYWNrZXRfcXVldWUgLSBRdWV1ZSBvZiBmcmFtZXMgd2FpdCBmb3IgcmVzb2x1dGlvbgorICoJQHN0YXR1cyAtIFVzZWQgZm9yIHByb3h5IEFBUlAKKyAqCWV4cGlyZXNfYXQgLSBFbnRyeSBleHBpcnkgdGltZQorICoJdGFyZ2V0X2FkZHIgLSBERFAgQWRkcmVzcworICoJZGV2IC0gRGV2aWNlIHRvIHVzZQorICoJaHdhZGRyIC0gUGh5c2ljYWwgaS9mIGFkZHJlc3Mgb2YgdGFyZ2V0L3JvdXRlcgorICoJeG1pdF9jb3VudCAtIFdoZW4gdGhpcyBoaXRzIDEwIHdlIGdpdmUgdXAKKyAqCW5leHQgLSBOZXh0IGVudHJ5IGluIGNoYWluCisgKi8KK3N0cnVjdCBhYXJwX2VudHJ5IHsKKwkvKiBUaGVzZSBmaXJzdCB0d28gYXJlIG9ubHkgdXNlZCBmb3IgdW5yZXNvbHZlZCBlbnRyaWVzICovCisJdW5zaWduZWQgbG9uZwkJbGFzdF9zZW50OworCXN0cnVjdCBza19idWZmX2hlYWQJcGFja2V0X3F1ZXVlOworCWludAkJCXN0YXR1czsKKwl1bnNpZ25lZCBsb25nCQlleHBpcmVzX2F0OworCXN0cnVjdCBhdGFsa19hZGRyCXRhcmdldF9hZGRyOworCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CisJY2hhcgkJCWh3YWRkcls2XTsKKwl1bnNpZ25lZCBzaG9ydAkJeG1pdF9jb3VudDsKKwlzdHJ1Y3QgYWFycF9lbnRyeQkqbmV4dDsKK307CisKKy8qIEhhc2hlZCBsaXN0IG9mIHJlc29sdmVkLCB1bnJlc29sdmVkIGFuZCBwcm94eSBlbnRyaWVzICovCitzdGF0aWMgc3RydWN0IGFhcnBfZW50cnkgKnJlc29sdmVkW0FBUlBfSEFTSF9TSVpFXTsKK3N0YXRpYyBzdHJ1Y3QgYWFycF9lbnRyeSAqdW5yZXNvbHZlZFtBQVJQX0hBU0hfU0laRV07CitzdGF0aWMgc3RydWN0IGFhcnBfZW50cnkgKnByb3hpZXNbQUFSUF9IQVNIX1NJWkVdOworc3RhdGljIGludCB1bnJlc29sdmVkX2NvdW50OworCisvKiBPbmUgbG9jayBwcm90ZWN0cyBpdCBhbGwuICovCitzdGF0aWMgREVGSU5FX1JXTE9DSyhhYXJwX2xvY2spOworCisvKiBVc2VkIHRvIHdhbGsgdGhlIGxpc3QgYW5kIHB1cmdlL2tpY2sgZW50cmllcy4gICovCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgYWFycF90aW1lcjsKKworLyoKKyAqCURlbGV0ZSBhbiBhYXJwIHF1ZXVlCisgKgorICoJTXVzdCBydW4gdW5kZXIgYWFycF9sb2NrLgorICovCitzdGF0aWMgdm9pZCBfX2FhcnBfZXhwaXJlKHN0cnVjdCBhYXJwX2VudHJ5ICphKQoreworCXNrYl9xdWV1ZV9wdXJnZSgmYS0+cGFja2V0X3F1ZXVlKTsKKwlrZnJlZShhKTsKK30KKworLyoKKyAqCVNlbmQgYW4gYWFycCBxdWV1ZSBlbnRyeSByZXF1ZXN0CisgKgorICoJTXVzdCBydW4gdW5kZXIgYWFycF9sb2NrLgorICovCitzdGF0aWMgdm9pZCBfX2FhcnBfc2VuZF9xdWVyeShzdHJ1Y3QgYWFycF9lbnRyeSAqYSkKK3sKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBhYXJwX2V0aF9tdWx0aWNhc3RbRVRIX0FMRU5dID0KKwkJCQkJeyAweDA5LCAweDAwLCAweDA3LCAweEZGLCAweEZGLCAweEZGIH07CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGEtPmRldjsKKwlzdHJ1Y3QgZWxhcGFhcnAgKmVhaDsKKwlpbnQgbGVuID0gZGV2LT5oYXJkX2hlYWRlcl9sZW4gKyBzaXplb2YoKmVhaCkgKyBhYXJwX2RsLT5oZWFkZXJfbGVuZ3RoOworCXN0cnVjdCBza19idWZmICpza2IgPSBhbGxvY19za2IobGVuLCBHRlBfQVRPTUlDKTsKKwlzdHJ1Y3QgYXRhbGtfYWRkciAqc2F0ID0gYXRhbGtfZmluZF9kZXZfYWRkcihkZXYpOworCisJaWYgKCFza2IpCisJCXJldHVybjsKKworCWlmICghc2F0KSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorCisJLyogU2V0IHVwIHRoZSBidWZmZXIgKi8KKwlza2JfcmVzZXJ2ZShza2IsIGRldi0+aGFyZF9oZWFkZXJfbGVuICsgYWFycF9kbC0+aGVhZGVyX2xlbmd0aCk7CisJc2tiLT5uaC5yYXcgICAgICA9IHNrYi0+aC5yYXcgPSBza2JfcHV0KHNrYiwgc2l6ZW9mKCplYWgpKTsKKwlza2ItPnByb3RvY29sICAgID0gaHRvbnMoRVRIX1BfQVRBTEspOworCXNrYi0+ZGV2CSA9IGRldjsKKwllYWgJCSA9IGFhcnBfaGRyKHNrYik7CisKKwkvKiBTZXQgdXAgdGhlIEFSUCAqLworCWVhaC0+aHdfdHlwZQkgPSBodG9ucyhBQVJQX0hXX1RZUEVfRVRIRVJORVQpOworCWVhaC0+cGFfdHlwZQkgPSBodG9ucyhFVEhfUF9BVEFMSyk7CisJZWFoLT5od19sZW4JID0gRVRIX0FMRU47CisJZWFoLT5wYV9sZW4JID0gQUFSUF9QQV9BTEVOOworCWVhaC0+ZnVuY3Rpb24JID0gaHRvbnMoQUFSUF9SRVFVRVNUKTsKKworCW1lbWNweShlYWgtPmh3X3NyYywgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCisJZWFoLT5wYV9zcmNfemVybyA9IDA7CisJZWFoLT5wYV9zcmNfbmV0CSA9IHNhdC0+c19uZXQ7CisJZWFoLT5wYV9zcmNfbm9kZSA9IHNhdC0+c19ub2RlOworCisJbWVtc2V0KGVhaC0+aHdfZHN0LCAnXDAnLCBFVEhfQUxFTik7CisKKwllYWgtPnBhX2RzdF96ZXJvID0gMDsKKwllYWgtPnBhX2RzdF9uZXQJID0gYS0+dGFyZ2V0X2FkZHIuc19uZXQ7CisJZWFoLT5wYV9kc3Rfbm9kZSA9IGEtPnRhcmdldF9hZGRyLnNfbm9kZTsKKworCS8qIFNlbmQgaXQgKi8KKwlhYXJwX2RsLT5yZXF1ZXN0KGFhcnBfZGwsIHNrYiwgYWFycF9ldGhfbXVsdGljYXN0KTsKKwkvKiBVcGRhdGUgdGhlIHNlbmRpbmcgY291bnQgKi8KKwlhLT54bWl0X2NvdW50Kys7CisJYS0+bGFzdF9zZW50ID0gamlmZmllczsKK30KKworLyogVGhpcyBydW5zIHVuZGVyIGFhcnBfbG9jayBhbmQgaW4gc29mdGludCBjb250ZXh0LCBzbyBvbmx5IGF0b21pYyBtZW1vcnkKKyAqIGFsbG9jYXRpb25zIGNhbiBiZSB1c2VkLiAqLworc3RhdGljIHZvaWQgYWFycF9zZW5kX3JlcGx5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBhdGFsa19hZGRyICp1cywKKwkJCSAgICBzdHJ1Y3QgYXRhbGtfYWRkciAqdGhlbSwgdW5zaWduZWQgY2hhciAqc2hhKQoreworCXN0cnVjdCBlbGFwYWFycCAqZWFoOworCWludCBsZW4gPSBkZXYtPmhhcmRfaGVhZGVyX2xlbiArIHNpemVvZigqZWFoKSArIGFhcnBfZGwtPmhlYWRlcl9sZW5ndGg7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpOworCisJaWYgKCFza2IpCisJCXJldHVybjsKKworCS8qIFNldCB1cCB0aGUgYnVmZmVyICovCisJc2tiX3Jlc2VydmUoc2tiLCBkZXYtPmhhcmRfaGVhZGVyX2xlbiArIGFhcnBfZGwtPmhlYWRlcl9sZW5ndGgpOworCXNrYi0+bmgucmF3ICAgICAgPSBza2ItPmgucmF3ID0gc2tiX3B1dChza2IsIHNpemVvZigqZWFoKSk7CisJc2tiLT5wcm90b2NvbCAgICA9IGh0b25zKEVUSF9QX0FUQUxLKTsKKwlza2ItPmRldgkgPSBkZXY7CisJZWFoCQkgPSBhYXJwX2hkcihza2IpOworCisJLyogU2V0IHVwIHRoZSBBUlAgKi8KKwllYWgtPmh3X3R5cGUJID0gaHRvbnMoQUFSUF9IV19UWVBFX0VUSEVSTkVUKTsKKwllYWgtPnBhX3R5cGUJID0gaHRvbnMoRVRIX1BfQVRBTEspOworCWVhaC0+aHdfbGVuCSA9IEVUSF9BTEVOOworCWVhaC0+cGFfbGVuCSA9IEFBUlBfUEFfQUxFTjsKKwllYWgtPmZ1bmN0aW9uCSA9IGh0b25zKEFBUlBfUkVQTFkpOworCisJbWVtY3B5KGVhaC0+aHdfc3JjLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisKKwllYWgtPnBhX3NyY196ZXJvID0gMDsKKwllYWgtPnBhX3NyY19uZXQJID0gdXMtPnNfbmV0OworCWVhaC0+cGFfc3JjX25vZGUgPSB1cy0+c19ub2RlOworCisJaWYgKCFzaGEpCisJCW1lbXNldChlYWgtPmh3X2RzdCwgJ1wwJywgRVRIX0FMRU4pOworCWVsc2UKKwkJbWVtY3B5KGVhaC0+aHdfZHN0LCBzaGEsIEVUSF9BTEVOKTsKKworCWVhaC0+cGFfZHN0X3plcm8gPSAwOworCWVhaC0+cGFfZHN0X25ldAkgPSB0aGVtLT5zX25ldDsKKwllYWgtPnBhX2RzdF9ub2RlID0gdGhlbS0+c19ub2RlOworCisJLyogU2VuZCBpdCAqLworCWFhcnBfZGwtPnJlcXVlc3QoYWFycF9kbCwgc2tiLCBzaGEpOworfQorCisvKgorICoJU2VuZCBwcm9iZSBmcmFtZXMuIENhbGxlZCBmcm9tIGFhcnBfcHJvYmVfbmV0d29yayBhbmQKKyAqCWFhcnBfcHJveHlfcHJvYmVfbmV0d29yay4KKyAqLworCitzdGF0aWMgdm9pZCBhYXJwX3NlbmRfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGF0YWxrX2FkZHIgKnVzKQoreworCXN0cnVjdCBlbGFwYWFycCAqZWFoOworCWludCBsZW4gPSBkZXYtPmhhcmRfaGVhZGVyX2xlbiArIHNpemVvZigqZWFoKSArIGFhcnBfZGwtPmhlYWRlcl9sZW5ndGg7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpOworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGFhcnBfZXRoX211bHRpY2FzdFtFVEhfQUxFTl0gPQorCQkJCQl7IDB4MDksIDB4MDAsIDB4MDcsIDB4RkYsIDB4RkYsIDB4RkYgfTsKKworCWlmICghc2tiKQorCQlyZXR1cm47CisKKwkvKiBTZXQgdXAgdGhlIGJ1ZmZlciAqLworCXNrYl9yZXNlcnZlKHNrYiwgZGV2LT5oYXJkX2hlYWRlcl9sZW4gKyBhYXJwX2RsLT5oZWFkZXJfbGVuZ3RoKTsKKwlza2ItPm5oLnJhdyAgICAgID0gc2tiLT5oLnJhdyA9IHNrYl9wdXQoc2tiLCBzaXplb2YoKmVhaCkpOworCXNrYi0+cHJvdG9jb2wgICAgPSBodG9ucyhFVEhfUF9BVEFMSyk7CisJc2tiLT5kZXYJID0gZGV2OworCWVhaAkJID0gYWFycF9oZHIoc2tiKTsKKworCS8qIFNldCB1cCB0aGUgQVJQICovCisJZWFoLT5od190eXBlCSA9IGh0b25zKEFBUlBfSFdfVFlQRV9FVEhFUk5FVCk7CisJZWFoLT5wYV90eXBlCSA9IGh0b25zKEVUSF9QX0FUQUxLKTsKKwllYWgtPmh3X2xlbgkgPSBFVEhfQUxFTjsKKwllYWgtPnBhX2xlbgkgPSBBQVJQX1BBX0FMRU47CisJZWFoLT5mdW5jdGlvbgkgPSBodG9ucyhBQVJQX1BST0JFKTsKKworCW1lbWNweShlYWgtPmh3X3NyYywgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCisJZWFoLT5wYV9zcmNfemVybyA9IDA7CisJZWFoLT5wYV9zcmNfbmV0CSA9IHVzLT5zX25ldDsKKwllYWgtPnBhX3NyY19ub2RlID0gdXMtPnNfbm9kZTsKKworCW1lbXNldChlYWgtPmh3X2RzdCwgJ1wwJywgRVRIX0FMRU4pOworCisJZWFoLT5wYV9kc3RfemVybyA9IDA7CisJZWFoLT5wYV9kc3RfbmV0CSA9IHVzLT5zX25ldDsKKwllYWgtPnBhX2RzdF9ub2RlID0gdXMtPnNfbm9kZTsKKworCS8qIFNlbmQgaXQgKi8KKwlhYXJwX2RsLT5yZXF1ZXN0KGFhcnBfZGwsIHNrYiwgYWFycF9ldGhfbXVsdGljYXN0KTsKK30KKworLyoKKyAqCUhhbmRsZSBhbiBhYXJwIHRpbWVyIGV4cGlyZQorICoKKyAqCU11c3QgcnVuIHVuZGVyIHRoZSBhYXJwX2xvY2suCisgKi8KKworc3RhdGljIHZvaWQgX19hYXJwX2V4cGlyZV90aW1lcihzdHJ1Y3QgYWFycF9lbnRyeSAqKm4pCit7CisJc3RydWN0IGFhcnBfZW50cnkgKnQ7CisKKwl3aGlsZSAoKm4pCisJCS8qIEV4cGlyZWQgPyAqLworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCAoKm4pLT5leHBpcmVzX2F0KSkgeworCQkJdCA9ICpuOworCQkJKm4gPSAoKm4pLT5uZXh0OworCQkJX19hYXJwX2V4cGlyZSh0KTsKKwkJfSBlbHNlCisJCQluID0gJigoKm4pLT5uZXh0KTsKK30KKworLyoKKyAqCUtpY2sgYWxsIHBlbmRpbmcgcmVxdWVzdHMgNSB0aW1lcyBhIHNlY29uZC4KKyAqCisgKglNdXN0IHJ1biB1bmRlciB0aGUgYWFycF9sb2NrLgorICovCitzdGF0aWMgdm9pZCBfX2FhcnBfa2ljayhzdHJ1Y3QgYWFycF9lbnRyeSAqKm4pCit7CisJc3RydWN0IGFhcnBfZW50cnkgKnQ7CisKKwl3aGlsZSAoKm4pCisJCS8qIEV4cGlyZWQ6IGlmIHRoaXMgd2lsbCBiZSB0aGUgMTF0aCB0eCwgd2UgZGVsZXRlIGluc3RlYWQuICovCisJCWlmICgoKm4pLT54bWl0X2NvdW50ID49IHN5c2N0bF9hYXJwX3JldHJhbnNtaXRfbGltaXQpIHsKKwkJCXQgPSAqbjsKKwkJCSpuID0gKCpuKS0+bmV4dDsKKwkJCV9fYWFycF9leHBpcmUodCk7CisJCX0gZWxzZSB7CisJCQlfX2FhcnBfc2VuZF9xdWVyeSgqbik7CisJCQluID0gJigoKm4pLT5uZXh0KTsKKwkJfQorfQorCisvKgorICoJQSBkZXZpY2UgaGFzIGdvbmUgZG93bi4gVGFrZSBhbGwgZW50cmllcyByZWZlcnJpbmcgdG8gdGhlIGRldmljZQorICoJYW5kIHJlbW92ZSB0aGVtLgorICoKKyAqCU11c3QgcnVuIHVuZGVyIHRoZSBhYXJwX2xvY2suCisgKi8KK3N0YXRpYyB2b2lkIF9fYWFycF9leHBpcmVfZGV2aWNlKHN0cnVjdCBhYXJwX2VudHJ5ICoqbiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWFycF9lbnRyeSAqdDsKKworCXdoaWxlICgqbikKKwkJaWYgKCgqbiktPmRldiA9PSBkZXYpIHsKKwkJCXQgPSAqbjsKKwkJCSpuID0gKCpuKS0+bmV4dDsKKwkJCV9fYWFycF9leHBpcmUodCk7CisJCX0gZWxzZQorCQkJbiA9ICYoKCpuKS0+bmV4dCk7Cit9CisKKy8qIEhhbmRsZSB0aGUgdGltZXIgZXZlbnQgKi8KK3N0YXRpYyB2b2lkIGFhcnBfZXhwaXJlX3RpbWVvdXQodW5zaWduZWQgbG9uZyB1bnVzZWQpCit7CisJaW50IGN0OworCisJd3JpdGVfbG9ja19iaCgmYWFycF9sb2NrKTsKKworCWZvciAoY3QgPSAwOyBjdCA8IEFBUlBfSEFTSF9TSVpFOyBjdCsrKSB7CisJCV9fYWFycF9leHBpcmVfdGltZXIoJnJlc29sdmVkW2N0XSk7CisJCV9fYWFycF9raWNrKCZ1bnJlc29sdmVkW2N0XSk7CisJCV9fYWFycF9leHBpcmVfdGltZXIoJnVucmVzb2x2ZWRbY3RdKTsKKwkJX19hYXJwX2V4cGlyZV90aW1lcigmcHJveGllc1tjdF0pOworCX0KKworCXdyaXRlX3VubG9ja19iaCgmYWFycF9sb2NrKTsKKwltb2RfdGltZXIoJmFhcnBfdGltZXIsIGppZmZpZXMgKworCQkJICAgICAgICh1bnJlc29sdmVkX2NvdW50ID8gc3lzY3RsX2FhcnBfdGlja190aW1lIDoKKwkJCQlzeXNjdGxfYWFycF9leHBpcnlfdGltZSkpOworfQorCisvKiBOZXR3b3JrIGRldmljZSBub3RpZmllciBjaGFpbiBoYW5kbGVyLiAqLworc3RhdGljIGludCBhYXJwX2RldmljZV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsCisJCQkgICAgIHZvaWQgKnB0cikKK3sKKwlpbnQgY3Q7CisKKwlpZiAoZXZlbnQgPT0gTkVUREVWX0RPV04pIHsKKwkJd3JpdGVfbG9ja19iaCgmYWFycF9sb2NrKTsKKworCQlmb3IgKGN0ID0gMDsgY3QgPCBBQVJQX0hBU0hfU0laRTsgY3QrKykgeworCQkJX19hYXJwX2V4cGlyZV9kZXZpY2UoJnJlc29sdmVkW2N0XSwgcHRyKTsKKwkJCV9fYWFycF9leHBpcmVfZGV2aWNlKCZ1bnJlc29sdmVkW2N0XSwgcHRyKTsKKwkJCV9fYWFycF9leHBpcmVfZGV2aWNlKCZwcm94aWVzW2N0XSwgcHRyKTsKKwkJfQorCisJCXdyaXRlX3VubG9ja19iaCgmYWFycF9sb2NrKTsKKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKiBFeHBpcmUgYWxsIGVudHJpZXMgaW4gYSBoYXNoIGNoYWluICovCitzdGF0aWMgdm9pZCBfX2FhcnBfZXhwaXJlX2FsbChzdHJ1Y3QgYWFycF9lbnRyeSAqKm4pCit7CisJc3RydWN0IGFhcnBfZW50cnkgKnQ7CisKKwl3aGlsZSAoKm4pIHsKKwkJdCA9ICpuOworCQkqbiA9ICgqbiktPm5leHQ7CisJCV9fYWFycF9leHBpcmUodCk7CisJfQorfQorCisvKiBDbGVhbnVwIGFsbCBoYXNoIGNoYWlucyAtLSBtb2R1bGUgdW5sb2FkaW5nICovCitzdGF0aWMgdm9pZCBhYXJwX3B1cmdlKHZvaWQpCit7CisJaW50IGN0OworCisJd3JpdGVfbG9ja19iaCgmYWFycF9sb2NrKTsKKwlmb3IgKGN0ID0gMDsgY3QgPCBBQVJQX0hBU0hfU0laRTsgY3QrKykgeworCQlfX2FhcnBfZXhwaXJlX2FsbCgmcmVzb2x2ZWRbY3RdKTsKKwkJX19hYXJwX2V4cGlyZV9hbGwoJnVucmVzb2x2ZWRbY3RdKTsKKwkJX19hYXJwX2V4cGlyZV9hbGwoJnByb3hpZXNbY3RdKTsKKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZhYXJwX2xvY2spOworfQorCisvKgorICoJQ3JlYXRlIGEgbmV3IGFhcnAgZW50cnkuICBUaGlzIG11c3QgdXNlIEdGUF9BVE9NSUMgYmVjYXVzZSBpdAorICoJcnVucyB3aGlsZSBob2xkaW5nIHNwaW5sb2Nrcy4KKyAqLworc3RhdGljIHN0cnVjdCBhYXJwX2VudHJ5ICphYXJwX2FsbG9jKHZvaWQpCit7CisJc3RydWN0IGFhcnBfZW50cnkgKmEgPSBrbWFsbG9jKHNpemVvZigqYSksIEdGUF9BVE9NSUMpOworCisJaWYgKGEpCisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmEtPnBhY2tldF9xdWV1ZSk7CisJcmV0dXJuIGE7Cit9CisKKy8qCisgKiBGaW5kIGFuIGVudHJ5LiBXZSBtaWdodCByZXR1cm4gYW4gZXhwaXJlZCBidXQgbm90IHlldCBwdXJnZWQgZW50cnkuIFdlCisgKiBkb24ndCBjYXJlIGFzIGl0IHdpbGwgZG8gbm8gaGFybS4KKyAqCisgKiBUaGlzIG11c3QgcnVuIHVuZGVyIHRoZSBhYXJwX2xvY2suCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYWFycF9lbnRyeSAqX19hYXJwX2ZpbmRfZW50cnkoc3RydWN0IGFhcnBfZW50cnkgKmxpc3QsCisJCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICAgc3RydWN0IGF0YWxrX2FkZHIgKnNhdCkKK3sKKwl3aGlsZSAobGlzdCkgeworCQlpZiAobGlzdC0+dGFyZ2V0X2FkZHIuc19uZXQgPT0gc2F0LT5zX25ldCAmJgorCQkgICAgbGlzdC0+dGFyZ2V0X2FkZHIuc19ub2RlID09IHNhdC0+c19ub2RlICYmCisJCSAgICBsaXN0LT5kZXYgPT0gZGV2KQorCQkJYnJlYWs7CisJCWxpc3QgPSBsaXN0LT5uZXh0OworCX0KKworCXJldHVybiBsaXN0OworfQorCisvKiBDYWxsZWQgZnJvbSB0aGUgRERQIGNvZGUsIGFuZCB0aHVzIG11c3QgYmUgZXhwb3J0ZWQuICovCit2b2lkIGFhcnBfcHJveHlfcmVtb3ZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBhdGFsa19hZGRyICpzYSkKK3sKKwlpbnQgaGFzaCA9IHNhLT5zX25vZGUgJSAoQUFSUF9IQVNIX1NJWkUgLSAxKTsKKwlzdHJ1Y3QgYWFycF9lbnRyeSAqYTsKKworCXdyaXRlX2xvY2tfYmgoJmFhcnBfbG9jayk7CisKKwlhID0gX19hYXJwX2ZpbmRfZW50cnkocHJveGllc1toYXNoXSwgZGV2LCBzYSk7CisJaWYgKGEpCisJCWEtPmV4cGlyZXNfYXQgPSBqaWZmaWVzIC0gMTsKKworCXdyaXRlX3VubG9ja19iaCgmYWFycF9sb2NrKTsKK30KKworLyogVGhpcyBtdXN0IHJ1biB1bmRlciBhYXJwX2xvY2suICovCitzdGF0aWMgc3RydWN0IGF0YWxrX2FkZHIgKl9fYWFycF9wcm94eV9maW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgICBzdHJ1Y3QgYXRhbGtfYWRkciAqc2EpCit7CisJaW50IGhhc2ggPSBzYS0+c19ub2RlICUgKEFBUlBfSEFTSF9TSVpFIC0gMSk7CisJc3RydWN0IGFhcnBfZW50cnkgKmEgPSBfX2FhcnBfZmluZF9lbnRyeShwcm94aWVzW2hhc2hdLCBkZXYsIHNhKTsKKworCXJldHVybiBhID8gc2EgOiBOVUxMOworfQorCisvKgorICogUHJvYmUgYSBQaGFzZSAxIGRldmljZSBvciBhIGRldmljZSB0aGF0IHJlcXVpcmVzIGl0cyBOZXQ6Tm9kZSB0bworICogYmUgc2V0IHZpYSBhbiBpb2N0bC4KKyAqLworc3RhdGljIHZvaWQgYWFycF9zZW5kX3Byb2JlX3BoYXNlMShzdHJ1Y3QgYXRhbGtfaWZhY2UgKmlmYWNlKQoreworCXN0cnVjdCBpZnJlcSBhdHJlcTsKKwlzdHJ1Y3Qgc29ja2FkZHJfYXQgKnNhID0gKHN0cnVjdCBzb2NrYWRkcl9hdCAqKSZhdHJlcS5pZnJfYWRkcjsKKworCXNhLT5zYXRfYWRkci5zX25vZGUgPSBpZmFjZS0+YWRkcmVzcy5zX25vZGU7CisJc2EtPnNhdF9hZGRyLnNfbmV0ID0gbnRvaHMoaWZhY2UtPmFkZHJlc3Muc19uZXQpOworCisJLyogV2UgcGFzcyB0aGUgTmV0Ok5vZGUgdG8gdGhlIGRyaXZlcnMvY2FyZHMgYnkgYSBEZXZpY2UgaW9jdGwuICovCisJaWYgKCEoaWZhY2UtPmRldi0+ZG9faW9jdGwoaWZhY2UtPmRldiwgJmF0cmVxLCBTSU9DU0lGQUREUikpKSB7CisJCSh2b2lkKWlmYWNlLT5kZXYtPmRvX2lvY3RsKGlmYWNlLT5kZXYsICZhdHJlcSwgU0lPQ0dJRkFERFIpOworCQlpZiAoaWZhY2UtPmFkZHJlc3Muc19uZXQgIT0gaHRvbnMoc2EtPnNhdF9hZGRyLnNfbmV0KSB8fAorCQkgICAgaWZhY2UtPmFkZHJlc3Muc19ub2RlICE9IHNhLT5zYXRfYWRkci5zX25vZGUpCisJCQlpZmFjZS0+c3RhdHVzIHw9IEFUSUZfUFJPQkVfRkFJTDsKKworCQlpZmFjZS0+YWRkcmVzcy5zX25ldCAgPSBodG9ucyhzYS0+c2F0X2FkZHIuc19uZXQpOworCQlpZmFjZS0+YWRkcmVzcy5zX25vZGUgPSBzYS0+c2F0X2FkZHIuc19ub2RlOworCX0KK30KKworCit2b2lkIGFhcnBfcHJvYmVfbmV0d29yayhzdHJ1Y3QgYXRhbGtfaWZhY2UgKmF0aWYpCit7CisJaWYgKGF0aWYtPmRldi0+dHlwZSA9PSBBUlBIUkRfTE9DQUxUTEsgfHwKKwkgICAgYXRpZi0+ZGV2LT50eXBlID09IEFSUEhSRF9QUFApCisJCWFhcnBfc2VuZF9wcm9iZV9waGFzZTEoYXRpZik7CisJZWxzZSB7CisJCXVuc2lnbmVkIGludCBjb3VudDsKKworCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBBQVJQX1JFVFJBTlNNSVRfTElNSVQ7IGNvdW50KyspIHsKKwkJCWFhcnBfc2VuZF9wcm9iZShhdGlmLT5kZXYsICZhdGlmLT5hZGRyZXNzKTsKKworCQkJLyogRGVmZXIgMS8xMHRoICovCisJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoSFogLyAxMCk7CisKKwkJCWlmIChhdGlmLT5zdGF0dXMgJiBBVElGX1BST0JFX0ZBSUwpCisJCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK2ludCBhYXJwX3Byb3h5X3Byb2JlX25ldHdvcmsoc3RydWN0IGF0YWxrX2lmYWNlICphdGlmLCBzdHJ1Y3QgYXRhbGtfYWRkciAqc2EpCit7CisJaW50IGhhc2gsIHJldHZhbCA9IC1FUFJPVE9OT1NVUFBPUlQ7CisJc3RydWN0IGFhcnBfZW50cnkgKmVudHJ5OworCXVuc2lnbmVkIGludCBjb3VudDsKKworCS8qCisJICogd2UgZG9uJ3QgY3VycmVudGx5IHN1cHBvcnQgTG9jYWxUYWxrIG9yIFBQUCBmb3IgcHJveHkgQUFSUDsKKwkgKiBpZiBzb21lb25lIHdhbnRzIHRvIHRyeSBhbmQgYWRkIGl0LCBoYXZlIGZ1bgorCSAqLworCWlmIChhdGlmLT5kZXYtPnR5cGUgPT0gQVJQSFJEX0xPQ0FMVExLIHx8CisJICAgIGF0aWYtPmRldi0+dHlwZSA9PSBBUlBIUkRfUFBQKQorCQlnb3RvIG91dDsKKworCS8qCisJICogY3JlYXRlIGEgbmV3IEFBUlAgZW50cnkgd2l0aCB0aGUgZmxhZ3Mgc2V0IHRvIGJlIHB1Ymxpc2hlZCAtLQorCSAqIHdlIG5lZWQgdGhpcyBvbmUgdG8gaGFuZyBhcm91bmQgZXZlbiBpZiBpdCdzIGluIHVzZQorCSAqLworCWVudHJ5ID0gYWFycF9hbGxvYygpOworCXJldHZhbCA9IC1FTk9NRU07CisJaWYgKCFlbnRyeSkKKwkJZ290byBvdXQ7CisKKwllbnRyeS0+ZXhwaXJlc19hdCA9IC0xOworCWVudHJ5LT5zdGF0dXMgPSBBVElGX1BST0JFOworCWVudHJ5LT50YXJnZXRfYWRkci5zX25vZGUgPSBzYS0+c19ub2RlOworCWVudHJ5LT50YXJnZXRfYWRkci5zX25ldCA9IHNhLT5zX25ldDsKKwllbnRyeS0+ZGV2ID0gYXRpZi0+ZGV2OworCisJd3JpdGVfbG9ja19iaCgmYWFycF9sb2NrKTsKKworCWhhc2ggPSBzYS0+c19ub2RlICUgKEFBUlBfSEFTSF9TSVpFIC0gMSk7CisJZW50cnktPm5leHQgPSBwcm94aWVzW2hhc2hdOworCXByb3hpZXNbaGFzaF0gPSBlbnRyeTsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IEFBUlBfUkVUUkFOU01JVF9MSU1JVDsgY291bnQrKykgeworCQlhYXJwX3NlbmRfcHJvYmUoYXRpZi0+ZGV2LCBzYSk7CisKKwkJLyogRGVmZXIgMS8xMHRoICovCisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQl3cml0ZV91bmxvY2tfYmgoJmFhcnBfbG9jayk7CisJCXNjaGVkdWxlX3RpbWVvdXQoSFogLyAxMCk7CisJCXdyaXRlX2xvY2tfYmgoJmFhcnBfbG9jayk7CisKKwkJaWYgKGVudHJ5LT5zdGF0dXMgJiBBVElGX1BST0JFX0ZBSUwpCisJCQlicmVhazsKKwl9CisKKwlpZiAoZW50cnktPnN0YXR1cyAmIEFUSUZfUFJPQkVfRkFJTCkgeworCQllbnRyeS0+ZXhwaXJlc19hdCA9IGppZmZpZXMgLSAxOyAvKiBmcmVlIHRoZSBlbnRyeSAqLworCQlyZXR2YWwgPSAtRUFERFJJTlVTRTsgLyogcmV0dXJuIG5ldHdvcmsgZnVsbCAqLworCX0gZWxzZSB7IC8qIGNsZWFyIHRoZSBwcm9iaW5nIGZsYWcgKi8KKwkJZW50cnktPnN0YXR1cyAmPSB+QVRJRl9QUk9CRTsKKwkJcmV0dmFsID0gMTsKKwl9CisKKwl3cml0ZV91bmxvY2tfYmgoJmFhcnBfbG9jayk7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogU2VuZCBhIEREUCBmcmFtZSAqLworaW50IGFhcnBfc2VuZF9kZHAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICBzdHJ1Y3QgYXRhbGtfYWRkciAqc2EsIHZvaWQgKmh3YWRkcikKK3sKKwlzdGF0aWMgY2hhciBkZHBfZXRoX211bHRpY2FzdFtFVEhfQUxFTl0gPQorCQl7IDB4MDksIDB4MDAsIDB4MDcsIDB4RkYsIDB4RkYsIDB4RkYgfTsKKwlpbnQgaGFzaDsKKwlzdHJ1Y3QgYWFycF9lbnRyeSAqYTsKKworCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCisJLyogQ2hlY2sgZm9yIExvY2FsVGFsayBmaXJzdCAqLworCWlmIChkZXYtPnR5cGUgPT0gQVJQSFJEX0xPQ0FMVExLKSB7CisJCXN0cnVjdCBhdGFsa19hZGRyICphdCA9IGF0YWxrX2ZpbmRfZGV2X2FkZHIoZGV2KTsKKwkJc3RydWN0IGRkcGVoZHIgKmRkcCA9IChzdHJ1Y3QgZGRwZWhkciAqKXNrYi0+ZGF0YTsKKwkJaW50IGZ0ID0gMjsKKworCQkvKgorCQkgKiBDb21wcmVzc2libGUgPworCQkgKgorCQkgKiBJRkY6IHNyY19uZXQgPT0gZGVzdF9uZXQgPT0gZGV2aWNlX25ldAorCQkgKiAoemVybyBtYXRjaGVzIGFueXRoaW5nKQorCQkgKi8KKworCQlpZiAoKCFkZHAtPmRlaF9zbmV0IHx8IGF0LT5zX25ldCA9PSBkZHAtPmRlaF9zbmV0KSAmJgorCQkgICAgKCFkZHAtPmRlaF9kbmV0IHx8IGF0LT5zX25ldCA9PSBkZHAtPmRlaF9kbmV0KSkgeworCQkJc2tiX3B1bGwoc2tiLCBzaXplb2YoKmRkcCkgLSA0KTsKKworCQkJLyoKKwkJCSAqCVRoZSB1cHBlciB0d28gcmVtYWluaW5nIGJ5dGVzIGFyZSB0aGUgcG9ydAorCQkJICoJbnVtYmVycwl3ZSBqdXN0IGhhcHBlbiB0byBuZWVkLiBOb3cgcHV0IHRoZQorCQkJICoJbGVuZ3RoIGluIHRoZSBsb3dlciB0d28uCisJCQkgKi8KKwkJCSooKF9fdTE2ICopc2tiLT5kYXRhKSA9IGh0b25zKHNrYi0+bGVuKTsKKwkJCWZ0ID0gMTsKKwkJfQorCQkvKgorCQkgKiBOaWNlIGFuZCBlYXN5LiBObyBBQVJQIHR5cGUgcHJvdG9jb2xzIG9jY3VyIGhlcmUgc28gd2UgY2FuCisJCSAqIGp1c3Qgc2hvdmVsIGl0IG91dCB3aXRoIGEgMyBieXRlIExMQVAgaGVhZGVyCisJCSAqLworCisJCXNrYl9wdXNoKHNrYiwgMyk7CisJCXNrYi0+ZGF0YVswXSA9IHNhLT5zX25vZGU7CisJCXNrYi0+ZGF0YVsxXSA9IGF0LT5zX25vZGU7CisJCXNrYi0+ZGF0YVsyXSA9IGZ0OworCQlza2ItPmRldiAgICAgPSBkZXY7CisJCWdvdG8gc2VuZGl0OworCX0KKworCS8qIE9uIGEgUFBQIGxpbmsgd2UgbmVpdGhlciBjb21wcmVzcyBub3IgYWFycC4gICovCisJaWYgKGRldi0+dHlwZSA9PSBBUlBIUkRfUFBQKSB7CisJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9QUFBUQUxLKTsKKwkJc2tiLT5kZXYgPSBkZXY7CisJCWdvdG8gc2VuZGl0OworCX0KKworCS8qIE5vbiBFTEFQIHdlIGNhbm5vdCBkby4gKi8KKwlpZiAoZGV2LT50eXBlICE9IEFSUEhSRF9FVEhFUikKKwkJcmV0dXJuIC0xOworCisJc2tiLT5kZXYgPSBkZXY7CisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0FUQUxLKTsKKwloYXNoID0gc2EtPnNfbm9kZSAlIChBQVJQX0hBU0hfU0laRSAtIDEpOworCisJLyogRG8gd2UgaGF2ZSBhIHJlc29sdmVkIGVudHJ5PyAqLworCWlmIChzYS0+c19ub2RlID09IEFUQUREUl9CQ0FTVCkgeworCQkvKiBTZW5kIGl0ICovCisJCWRkcF9kbC0+cmVxdWVzdChkZHBfZGwsIHNrYiwgZGRwX2V0aF9tdWx0aWNhc3QpOworCQlnb3RvIHNlbnQ7CisJfQorCisJd3JpdGVfbG9ja19iaCgmYWFycF9sb2NrKTsKKwlhID0gX19hYXJwX2ZpbmRfZW50cnkocmVzb2x2ZWRbaGFzaF0sIGRldiwgc2EpOworCisJaWYgKGEpIHsgLyogUmV0dXJuIDEgYW5kIGZpbGwgaW4gdGhlIGFkZHJlc3MgKi8KKwkJYS0+ZXhwaXJlc19hdCA9IGppZmZpZXMgKyAoc3lzY3RsX2FhcnBfZXhwaXJ5X3RpbWUgKiAxMCk7CisJCWRkcF9kbC0+cmVxdWVzdChkZHBfZGwsIHNrYiwgYS0+aHdhZGRyKTsKKwkJd3JpdGVfdW5sb2NrX2JoKCZhYXJwX2xvY2spOworCQlnb3RvIHNlbnQ7CisJfQorCisJLyogRG8gd2UgaGF2ZSBhbiB1bnJlc29sdmVkIGVudHJ5OiBUaGlzIGlzIHRoZSBsZXNzIGNvbW1vbiBwYXRoICovCisJYSA9IF9fYWFycF9maW5kX2VudHJ5KHVucmVzb2x2ZWRbaGFzaF0sIGRldiwgc2EpOworCWlmIChhKSB7IC8qIFF1ZXVlIG9udG8gdGhlIHVucmVzb2x2ZWQgcXVldWUgKi8KKwkJc2tiX3F1ZXVlX3RhaWwoJmEtPnBhY2tldF9xdWV1ZSwgc2tiKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCS8qIEFsbG9jYXRlIGEgbmV3IGVudHJ5ICovCisJYSA9IGFhcnBfYWxsb2MoKTsKKwlpZiAoIWEpIHsKKwkJLyogV2hvb3BzIHNsaXBwZWQuLi4gZ29vZCBqb2IgaXQncyBhbiB1bnJlbGlhYmxlIHByb3RvY29sIDgpICovCisJCXdyaXRlX3VubG9ja19iaCgmYWFycF9sb2NrKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFNldCB1cCB0aGUgcXVldWUgKi8KKwlza2JfcXVldWVfdGFpbCgmYS0+cGFja2V0X3F1ZXVlLCBza2IpOworCWEtPmV4cGlyZXNfYXQJID0gamlmZmllcyArIHN5c2N0bF9hYXJwX3Jlc29sdmVfdGltZTsKKwlhLT5kZXYJCSA9IGRldjsKKwlhLT5uZXh0CQkgPSB1bnJlc29sdmVkW2hhc2hdOworCWEtPnRhcmdldF9hZGRyCSA9ICpzYTsKKwlhLT54bWl0X2NvdW50CSA9IDA7CisJdW5yZXNvbHZlZFtoYXNoXSA9IGE7CisJdW5yZXNvbHZlZF9jb3VudCsrOworCisJLyogU2VuZCBhbiBpbml0aWFsIHJlcXVlc3QgZm9yIHRoZSBhZGRyZXNzICovCisJX19hYXJwX3NlbmRfcXVlcnkoYSk7CisKKwkvKgorCSAqIFN3aXRjaCB0byBmYXN0IHRpbWVyIGlmIG5lZWRlZCAoVGhhdCBpcyBpZiB0aGlzIGlzIHRoZSBmaXJzdAorCSAqIHVucmVzb2x2ZWQgZW50cnkgdG8gZ2V0IGFkZGVkKQorCSAqLworCisJaWYgKHVucmVzb2x2ZWRfY291bnQgPT0gMSkKKwkJbW9kX3RpbWVyKCZhYXJwX3RpbWVyLCBqaWZmaWVzICsgc3lzY3RsX2FhcnBfdGlja190aW1lKTsKKworCS8qIE5vdyBmaW5hbGx5LCBpdCBpcyBzYWZlIHRvIGRyb3AgdGhlIGxvY2suICovCitvdXRfdW5sb2NrOgorCXdyaXRlX3VubG9ja19iaCgmYWFycF9sb2NrKTsKKworCS8qIFRlbGwgdGhlIGRkcCBsYXllciB3ZSBoYXZlIHRha2VuIG92ZXIgZm9yIHRoaXMgZnJhbWUuICovCisJcmV0dXJuIDA7CisKK3NlbmRpdDoKKwlpZiAoc2tiLT5zaykKKwkJc2tiLT5wcmlvcml0eSA9IHNrYi0+c2stPnNrX3ByaW9yaXR5OworCWRldl9xdWV1ZV94bWl0KHNrYik7CitzZW50OgorCXJldHVybiAxOworfQorCisvKgorICoJQW4gZW50cnkgaW4gdGhlIGFhcnAgdW5yZXNvbHZlZCBxdWV1ZSBoYXMgYmVjb21lIHJlc29sdmVkLiBTZW5kCisgKglhbGwgdGhlIGZyYW1lcyBxdWV1ZWQgdW5kZXIgaXQuCisgKgorICoJTXVzdCBydW4gdW5kZXIgYWFycF9sb2NrLgorICovCitzdGF0aWMgdm9pZCBfX2FhcnBfcmVzb2x2ZWQoc3RydWN0IGFhcnBfZW50cnkgKipsaXN0LCBzdHJ1Y3QgYWFycF9lbnRyeSAqYSwKKwkJCSAgICBpbnQgaGFzaCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJd2hpbGUgKCpsaXN0KQorCQlpZiAoKmxpc3QgPT0gYSkgeworCQkJdW5yZXNvbHZlZF9jb3VudC0tOworCQkJKmxpc3QgPSBhLT5uZXh0OworCisJCQkvKiBNb3ZlIGludG8gdGhlIHJlc29sdmVkIGxpc3QgKi8KKwkJCWEtPm5leHQgPSByZXNvbHZlZFtoYXNoXTsKKwkJCXJlc29sdmVkW2hhc2hdID0gYTsKKworCQkJLyogS2ljayBmcmFtZXMgb2ZmICovCisJCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZhLT5wYWNrZXRfcXVldWUpKSAhPSBOVUxMKSB7CisJCQkJYS0+ZXhwaXJlc19hdCA9IGppZmZpZXMgKworCQkJCQkJc3lzY3RsX2FhcnBfZXhwaXJ5X3RpbWUgKiAxMDsKKwkJCQlkZHBfZGwtPnJlcXVlc3QoZGRwX2RsLCBza2IsIGEtPmh3YWRkcik7CisJCQl9CisJCX0gZWxzZQorCQkJbGlzdCA9ICYoKCpsaXN0KS0+bmV4dCk7Cit9CisKKy8qCisgKglUaGlzIGlzIGNhbGxlZCBieSB0aGUgU05BUCBkcml2ZXIgd2hlbmV2ZXIgd2Ugc2VlIGFuIEFBUlAgU05BUAorICoJZnJhbWUuIFdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgRXRoZXJuZXQuCisgKi8KK3N0YXRpYyBpbnQgYWFycF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgIHN0cnVjdCBwYWNrZXRfdHlwZSAqcHQpCit7CisJc3RydWN0IGVsYXBhYXJwICplYSA9IGFhcnBfaGRyKHNrYik7CisJaW50IGhhc2gsIHJldCA9IDA7CisJX191MTYgZnVuY3Rpb247CisJc3RydWN0IGFhcnBfZW50cnkgKmE7CisJc3RydWN0IGF0YWxrX2FkZHIgc2EsICptYSwgZGE7CisJc3RydWN0IGF0YWxrX2lmYWNlICppZmE7CisKKwkvKiBXZSBvbmx5IGRvIEV0aGVybmV0IFNOQVAgQUFSUC4gKi8KKwlpZiAoZGV2LT50eXBlICE9IEFSUEhSRF9FVEhFUikKKwkJZ290byBvdXQwOworCisJLyogRnJhbWUgc2l6ZSBvaz8gKi8KKwlpZiAoIXNrYl9wdWxsKHNrYiwgc2l6ZW9mKCplYSkpKQorCQlnb3RvIG91dDA7CisKKwlmdW5jdGlvbiA9IG50b2hzKGVhLT5mdW5jdGlvbik7CisKKwkvKiBTYW5pdHkgY2hlY2sgZmllbGRzLiAqLworCWlmIChmdW5jdGlvbiA8IEFBUlBfUkVRVUVTVCB8fCBmdW5jdGlvbiA+IEFBUlBfUFJPQkUgfHwKKwkgICAgZWEtPmh3X2xlbiAhPSBFVEhfQUxFTiB8fCBlYS0+cGFfbGVuICE9IEFBUlBfUEFfQUxFTiB8fAorCSAgICBlYS0+cGFfc3JjX3plcm8gfHwgZWEtPnBhX2RzdF96ZXJvKQorCQlnb3RvIG91dDA7CisKKwkvKiBMb29rcyBnb29kLiAqLworCWhhc2ggPSBlYS0+cGFfc3JjX25vZGUgJSAoQUFSUF9IQVNIX1NJWkUgLSAxKTsKKworCS8qIEJ1aWxkIGFuIGFkZHJlc3MuICovCisJc2Euc19ub2RlID0gZWEtPnBhX3NyY19ub2RlOworCXNhLnNfbmV0ID0gZWEtPnBhX3NyY19uZXQ7CisKKwkvKiBQcm9jZXNzIHRoZSBwYWNrZXQuIENoZWNrIGZvciByZXBsaWVzIG9mIG1lLiAqLworCWlmYSA9IGF0YWxrX2ZpbmRfZGV2KGRldik7CisJaWYgKCFpZmEpCisJCWdvdG8gb3V0MTsKKworCWlmIChpZmEtPnN0YXR1cyAmIEFUSUZfUFJPQkUgJiYKKwkgICAgaWZhLT5hZGRyZXNzLnNfbm9kZSA9PSBlYS0+cGFfZHN0X25vZGUgJiYKKwkgICAgaWZhLT5hZGRyZXNzLnNfbmV0ID09IGVhLT5wYV9kc3RfbmV0KSB7CisJCWlmYS0+c3RhdHVzIHw9IEFUSUZfUFJPQkVfRkFJTDsgLyogRmFpbCB0aGUgcHJvYmUgKGluIHVzZSkgKi8KKwkJZ290byBvdXQxOworCX0KKworCS8qIENoZWNrIGZvciByZXBsaWVzIG9mIHByb3h5IEFBUlAgZW50cmllcyAqLworCWRhLnNfbm9kZSA9IGVhLT5wYV9kc3Rfbm9kZTsKKwlkYS5zX25ldCAgPSBlYS0+cGFfZHN0X25ldDsKKworCXdyaXRlX2xvY2tfYmgoJmFhcnBfbG9jayk7CisJYSA9IF9fYWFycF9maW5kX2VudHJ5KHByb3hpZXNbaGFzaF0sIGRldiwgJmRhKTsKKworCWlmIChhICYmIGEtPnN0YXR1cyAmIEFUSUZfUFJPQkUpIHsKKwkJYS0+c3RhdHVzIHw9IEFUSUZfUFJPQkVfRkFJTDsKKwkJLyoKKwkJICogd2UgZG8gbm90IHJlc3BvbmQgdG8gcHJvYmUgb3IgcmVxdWVzdCBwYWNrZXRzIGZvcgorCQkgKiB0aGlzIGFkZHJlc3Mgd2hpbGUgd2UgYXJlIHByb2JpbmcgdGhpcyBhZGRyZXNzCisJCSAqLworCQlnb3RvIHVubG9jazsKKwl9CisKKwlzd2l0Y2ggKGZ1bmN0aW9uKSB7CisJCWNhc2UgQUFSUF9SRVBMWToKKwkJCWlmICghdW5yZXNvbHZlZF9jb3VudCkJLyogU3BlZWQgdXAgKi8KKwkJCQlicmVhazsKKworCQkJLyogRmluZCB0aGUgZW50cnkuICAqLworCQkJYSA9IF9fYWFycF9maW5kX2VudHJ5KHVucmVzb2x2ZWRbaGFzaF0sIGRldiwgJnNhKTsKKwkJCWlmICghYSB8fCBkZXYgIT0gYS0+ZGV2KQorCQkJCWJyZWFrOworCisJCQkvKiBXZSBjYW4gZmlsbCBvbmUgaW4gLSB0aGlzIGlzIGdvb2QuICovCisJCQltZW1jcHkoYS0+aHdhZGRyLCBlYS0+aHdfc3JjLCBFVEhfQUxFTik7CisJCQlfX2FhcnBfcmVzb2x2ZWQoJnVucmVzb2x2ZWRbaGFzaF0sIGEsIGhhc2gpOworCQkJaWYgKCF1bnJlc29sdmVkX2NvdW50KQorCQkJCW1vZF90aW1lcigmYWFycF90aW1lciwKKwkJCQkJICBqaWZmaWVzICsgc3lzY3RsX2FhcnBfZXhwaXJ5X3RpbWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQVJQX1JFUVVFU1Q6CisJCWNhc2UgQUFSUF9QUk9CRToKKworCQkJLyoKKwkJCSAqIElmIGl0IGlzIG15IGFkZHJlc3Mgc2V0IG1hIHRvIG15IGFkZHJlc3MgYW5kIHJlcGx5LgorCQkJICogV2UgY2FuIHRyZWF0IHByb2JlIGFuZCByZXF1ZXN0IHRoZSBzYW1lLiAgUHJvYmUKKwkJCSAqIHNpbXBseSBtZWFucyB3ZSBzaG91bGRuJ3QgY2FjaGUgdGhlIHF1ZXJ5aW5nIGhvc3QsCisJCQkgKiBhcyBpbiBhIHByb2JlIHRoZXkgYXJlIHByb3Bvc2luZyBhbiBhZGRyZXNzIG5vdAorCQkJICogdXNpbmcgb25lLgorCQkJICoKKwkJCSAqIFN1cHBvcnQgZm9yIHByb3h5LUFBUlAgYWRkZWQuIFdlIGNoZWNrIGlmIHRoZQorCQkJICogYWRkcmVzcyBpcyBvbmUgb2Ygb3VyIHByb3hpZXMgYmVmb3JlIHdlIHRvc3MgdGhlCisJCQkgKiBwYWNrZXQgb3V0LgorCQkJICovCisKKwkJCXNhLnNfbm9kZSA9IGVhLT5wYV9kc3Rfbm9kZTsKKwkJCXNhLnNfbmV0ICA9IGVhLT5wYV9kc3RfbmV0OworCisJCQkvKiBTZWUgaWYgd2UgaGF2ZSBhIG1hdGNoaW5nIHByb3h5LiAqLworCQkJbWEgPSBfX2FhcnBfcHJveHlfZmluZChkZXYsICZzYSk7CisJCQlpZiAoIW1hKQorCQkJCW1hID0gJmlmYS0+YWRkcmVzczsKKwkJCWVsc2UgeyAvKiBXZSBuZWVkIHRvIG1ha2UgYSBjb3B5IG9mIHRoZSBlbnRyeS4gKi8KKwkJCQlkYS5zX25vZGUgPSBzYS5zX25vZGU7CisJCQkJZGEuc19uZXQgPSBkYS5zX25ldDsKKwkJCQltYSA9ICZkYTsKKwkJCX0KKworCQkJaWYgKGZ1bmN0aW9uID09IEFBUlBfUFJPQkUpIHsKKwkJCQkvKgorCQkJCSAqIEEgcHJvYmUgaW1wbGllcyBzb21lb25lIHRyeWluZyB0byBnZXQgYW4KKwkJCQkgKiBhZGRyZXNzLiBTbyBhcyBhIHByZWNhdXRpb24gZmx1c2ggYW55CisJCQkJICogZW50cmllcyB3ZSBoYXZlIGZvciB0aGlzIGFkZHJlc3MuCisJCQkJICovCisJCQkJc3RydWN0IGFhcnBfZW50cnkgKmE7CisKKwkJCQlhID0gX19hYXJwX2ZpbmRfZW50cnkocmVzb2x2ZWRbc2Euc19ub2RlICUKKwkJCQkJCQkgIChBQVJQX0hBU0hfU0laRSAtIDEpXSwKKwkJCQkJCSAgICAgIHNrYi0+ZGV2LCAmc2EpOworCisJCQkJLyoKKwkJCQkgKiBNYWtlIGl0IGV4cGlyZSBuZXh0IHRpY2sgLSB0aGF0IGF2b2lkcyB1cworCQkJCSAqIGdldHRpbmcgaW50byBhIHByb2JlL2ZsdXNoL2xlYXJuL3Byb2JlLworCQkJCSAqIGZsdXNoL2xlYXJuIGN5Y2xlIGR1cmluZyBwcm9iaW5nIG9mIGEgc2xvdworCQkJCSAqIHRvIHJlc3BvbmQgaG9zdCBhZGRyLgorCQkJCSAqLworCQkJCWlmIChhKSB7CisJCQkJCWEtPmV4cGlyZXNfYXQgPSBqaWZmaWVzIC0gMTsKKwkJCQkJbW9kX3RpbWVyKCZhYXJwX3RpbWVyLCBqaWZmaWVzICsKKwkJCQkJCQlzeXNjdGxfYWFycF90aWNrX3RpbWUpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHNhLnNfbm9kZSAhPSBtYS0+c19ub2RlKQorCQkJCWJyZWFrOworCisJCQlpZiAoc2Euc19uZXQgJiYgbWEtPnNfbmV0ICYmIHNhLnNfbmV0ICE9IG1hLT5zX25ldCkKKwkJCQlicmVhazsKKworCQkJc2Euc19ub2RlID0gZWEtPnBhX3NyY19ub2RlOworCQkJc2Euc19uZXQgPSBlYS0+cGFfc3JjX25ldDsKKworCQkJLyogYWFycF9teV9hZGRyZXNzIGhhcyBmb3VuZCB0aGUgYWRkcmVzcyB0byB1c2UgZm9yIHVzLgorCQkJKi8KKwkJCWFhcnBfc2VuZF9yZXBseShkZXYsIG1hLCAmc2EsIGVhLT5od19zcmMpOworCQkJYnJlYWs7CisJfQorCit1bmxvY2s6CisJd3JpdGVfdW5sb2NrX2JoKCZhYXJwX2xvY2spOworb3V0MToKKwlyZXQgPSAxOworb3V0MDoKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGFhcnBfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBhYXJwX2RldmljZV9ldmVudCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFhcnBfc25hcF9pZFtdID0geyAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweEYzIH07CisKK3ZvaWQgX19pbml0IGFhcnBfcHJvdG9faW5pdCh2b2lkKQoreworCWFhcnBfZGwgPSByZWdpc3Rlcl9zbmFwX2NsaWVudChhYXJwX3NuYXBfaWQsIGFhcnBfcmN2KTsKKwlpZiAoIWFhcnBfZGwpCisJCXByaW50ayhLRVJOX0NSSVQgIlVuYWJsZSB0byByZWdpc3RlciBBQVJQIHdpdGggU05BUC5cbiIpOworCWluaXRfdGltZXIoJmFhcnBfdGltZXIpOworCWFhcnBfdGltZXIuZnVuY3Rpb24gPSBhYXJwX2V4cGlyZV90aW1lb3V0OworCWFhcnBfdGltZXIuZGF0YQkgICAgPSAwOworCWFhcnBfdGltZXIuZXhwaXJlcyAgPSBqaWZmaWVzICsgc3lzY3RsX2FhcnBfZXhwaXJ5X3RpbWU7CisJYWRkX3RpbWVyKCZhYXJwX3RpbWVyKTsKKwlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmFhcnBfbm90aWZpZXIpOworfQorCisvKiBSZW1vdmUgdGhlIEFBUlAgZW50cmllcyBhc3NvY2lhdGVkIHdpdGggYSBkZXZpY2UuICovCit2b2lkIGFhcnBfZGV2aWNlX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgY3Q7CisKKwl3cml0ZV9sb2NrX2JoKCZhYXJwX2xvY2spOworCisJZm9yIChjdCA9IDA7IGN0IDwgQUFSUF9IQVNIX1NJWkU7IGN0KyspIHsKKwkJX19hYXJwX2V4cGlyZV9kZXZpY2UoJnJlc29sdmVkW2N0XSwgZGV2KTsKKwkJX19hYXJwX2V4cGlyZV9kZXZpY2UoJnVucmVzb2x2ZWRbY3RdLCBkZXYpOworCQlfX2FhcnBfZXhwaXJlX2RldmljZSgmcHJveGllc1tjdF0sIGRldik7CisJfQorCisJd3JpdGVfdW5sb2NrX2JoKCZhYXJwX2xvY2spOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0cnVjdCBhYXJwX2l0ZXJfc3RhdGUgeworCWludCBidWNrZXQ7CisJc3RydWN0IGFhcnBfZW50cnkgKip0YWJsZTsKK307CisKKy8qCisgKiBHZXQgdGhlIGFhcnAgZW50cnkgdGhhdCBpcyBpbiB0aGUgY2hhaW4gZGVzY3JpYmVkCisgKiBieSB0aGUgaXRlcmF0b3IuIAorICogSWYgcG9zIGlzIHNldCB0aGVuIHNraXAgdGlsbCB0aGF0IGluZGV4LgorICogcG9zID0gMSBpcyB0aGUgZmlyc3QgZW50cnkKKyAqLworc3RhdGljIHN0cnVjdCBhYXJwX2VudHJ5ICppdGVyX25leHQoc3RydWN0IGFhcnBfaXRlcl9zdGF0ZSAqaXRlciwgbG9mZl90ICpwb3MpCit7CisJaW50IGN0ID0gaXRlci0+YnVja2V0OworCXN0cnVjdCBhYXJwX2VudHJ5ICoqdGFibGUgPSBpdGVyLT50YWJsZTsKKwlsb2ZmX3Qgb2ZmID0gMDsKKwlzdHJ1Y3QgYWFycF9lbnRyeSAqZW50cnk7CisJCisgcmVzY2FuOgorCXdoaWxlKGN0IDwgQUFSUF9IQVNIX1NJWkUpIHsKKwkJZm9yIChlbnRyeSA9IHRhYmxlW2N0XTsgZW50cnk7IGVudHJ5ID0gZW50cnktPm5leHQpIHsKKwkJCWlmICghcG9zIHx8ICsrb2ZmID09ICpwb3MpIHsKKwkJCQlpdGVyLT50YWJsZSA9IHRhYmxlOworCQkJCWl0ZXItPmJ1Y2tldCA9IGN0OworCQkJCXJldHVybiBlbnRyeTsKKwkJCX0KKwkJfQorCQkrK2N0OworCX0KKworCWlmICh0YWJsZSA9PSByZXNvbHZlZCkgeworCQljdCA9IDA7CisJCXRhYmxlID0gdW5yZXNvbHZlZDsKKwkJZ290byByZXNjYW47CisJfQorCWlmICh0YWJsZSA9PSB1bnJlc29sdmVkKSB7CisJCWN0ID0gMDsKKwkJdGFibGUgPSBwcm94aWVzOworCQlnb3RvIHJlc2NhbjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICphYXJwX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGFhcnBfaXRlcl9zdGF0ZSAqaXRlciA9IHNlcS0+cHJpdmF0ZTsKKworCXJlYWRfbG9ja19iaCgmYWFycF9sb2NrKTsKKwlpdGVyLT50YWJsZSAgICAgPSByZXNvbHZlZDsKKwlpdGVyLT5idWNrZXQgICAgPSAwOworCisJcmV0dXJuICpwb3MgPyBpdGVyX25leHQoaXRlciwgcG9zKSA6IFNFUV9TVEFSVF9UT0tFTjsKK30KKworc3RhdGljIHZvaWQgKmFhcnBfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBhYXJwX2VudHJ5ICplbnRyeSA9IHY7CisJc3RydWN0IGFhcnBfaXRlcl9zdGF0ZSAqaXRlciA9IHNlcS0+cHJpdmF0ZTsKKworCSsrKnBvczsKKworCS8qIGZpcnN0IGxpbmUgYWZ0ZXIgaGVhZGVyICovCisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSAKKwkJZW50cnkgPSBpdGVyX25leHQoaXRlciwgTlVMTCk7CisJCQorCS8qIG5leHQgZW50cnkgaW4gY3VycmVudCBidWNrZXQgKi8KKwllbHNlIGlmIChlbnRyeS0+bmV4dCkKKwkJZW50cnkgPSBlbnRyeS0+bmV4dDsKKworCS8qIG5leHQgYnVja2V0IG9yIHRhYmxlICovCisJZWxzZSB7CisJCSsraXRlci0+YnVja2V0OworCQllbnRyeSA9IGl0ZXJfbmV4dChpdGVyLCBOVUxMKTsKKwl9CisJcmV0dXJuIGVudHJ5OworfQorCitzdGF0aWMgdm9pZCBhYXJwX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXJlYWRfdW5sb2NrX2JoKCZhYXJwX2xvY2spOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZHQyc3RyKHVuc2lnbmVkIGxvbmcgdGlja3MpCit7CisJc3RhdGljIGNoYXIgYnVmWzMyXTsKKworCXNwcmludGYoYnVmLCAiJWxkLiUwMmxkIiwgdGlja3MgLyBIWiwgKCh0aWNrcyAlIEhaKSAqIDEwMCApIC8gSFopOworCisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGludCBhYXJwX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBhYXJwX2l0ZXJfc3RhdGUgKml0ZXIgPSBzZXEtPnByaXZhdGU7CisJc3RydWN0IGFhcnBfZW50cnkgKmVudHJ5ID0gdjsKKwl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXNlcV9wdXRzKHNlcSwgCisJCQkgIkFkZHJlc3MgIEludGVyZmFjZSAgIEhhcmR3YXJlIEFkZHJlc3MiCisJCQkgIiAgIEV4cGlyZXMgTGFzdFNlbmQgIFJldHJ5IFN0YXR1c1xuIik7CisJZWxzZSB7CisJCXNlcV9wcmludGYoc2VxLCAiJTA0WDolMDJYICAlLTEycyIsCisJCQkgICBudG9ocyhlbnRyeS0+dGFyZ2V0X2FkZHIuc19uZXQpLAorCQkJICAgKHVuc2lnbmVkIGludCkgZW50cnktPnRhcmdldF9hZGRyLnNfbm9kZSwKKwkJCSAgIGVudHJ5LT5kZXYgPyBlbnRyeS0+ZGV2LT5uYW1lIDogIj8/Pz8iKTsKKwkJc2VxX3ByaW50ZihzZXEsICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCIsCisJCQkgICBlbnRyeS0+aHdhZGRyWzBdICYgMHhGRiwKKwkJCSAgIGVudHJ5LT5od2FkZHJbMV0gJiAweEZGLAorCQkJICAgZW50cnktPmh3YWRkclsyXSAmIDB4RkYsCisJCQkgICBlbnRyeS0+aHdhZGRyWzNdICYgMHhGRiwKKwkJCSAgIGVudHJ5LT5od2FkZHJbNF0gJiAweEZGLAorCQkJICAgZW50cnktPmh3YWRkcls1XSAmIDB4RkYpOworCQlzZXFfcHJpbnRmKHNlcSwgIiAlOHMiLAorCQkJICAgZHQyc3RyKChsb25nKWVudHJ5LT5leHBpcmVzX2F0IC0gKGxvbmcpbm93KSk7CisJCWlmIChpdGVyLT50YWJsZSA9PSB1bnJlc29sdmVkKQorCQkJc2VxX3ByaW50ZihzZXEsICIgJThzICU2aHUiLAorCQkJCSAgIGR0MnN0cihub3cgLSBlbnRyeS0+bGFzdF9zZW50KSwKKwkJCQkgICBlbnRyeS0+eG1pdF9jb3VudCk7CisJCWVsc2UKKwkJCXNlcV9wdXRzKHNlcSwgIiAgICAgICAgICAgICAgICAiKTsKKwkJc2VxX3ByaW50ZihzZXEsICIgJXNcbiIsCisJCQkgICAoaXRlci0+dGFibGUgPT0gcmVzb2x2ZWQpID8gInJlc29sdmVkIgorCQkJICAgOiAoaXRlci0+dGFibGUgPT0gdW5yZXNvbHZlZCkgPyAidW5yZXNvbHZlZCIKKwkJCSAgIDogKGl0ZXItPnRhYmxlID09IHByb3hpZXMpID8gInByb3hpZXMiCisJCQkgICA6ICJ1bmtub3duIik7CisJfQkJCQkgCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgYWFycF9zZXFfb3BzID0geworCS5zdGFydCAgPSBhYXJwX3NlcV9zdGFydCwKKwkubmV4dCAgID0gYWFycF9zZXFfbmV4dCwKKwkuc3RvcCAgID0gYWFycF9zZXFfc3RvcCwKKwkuc2hvdyAgID0gYWFycF9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgYWFycF9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKKwlpbnQgcmMgPSAtRU5PTUVNOworCXN0cnVjdCBhYXJwX2l0ZXJfc3RhdGUgKnMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOworICAgICAgIAorCWlmICghcykKKwkJZ290byBvdXQ7CisKKwlyYyA9IHNlcV9vcGVuKGZpbGUsICZhYXJwX3NlcV9vcHMpOworCWlmIChyYykKKwkJZ290byBvdXRfa2ZyZWU7CisKKwlzZXEJICAgICA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzZXEtPnByaXZhdGUgPSBzOworCW1lbXNldChzLCAwLCBzaXplb2YoKnMpKTsKK291dDoKKwlyZXR1cm4gcmM7CitvdXRfa2ZyZWU6CisJa2ZyZWUocyk7CisJZ290byBvdXQ7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXRhbGtfc2VxX2FycF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICAgICAgICAgPSBhYXJwX3NlcV9vcGVuLAorCS5yZWFkICAgICAgICAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgICAgICAgICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlX3ByaXZhdGUsCit9OworI2VuZGlmCisKKy8qIEdlbmVyYWwgbW9kdWxlIGNsZWFudXAuIENhbGxlZCBmcm9tIGNsZWFudXBfbW9kdWxlKCkgaW4gZGRwLmMuICovCit2b2lkIGFhcnBfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlkZWxfdGltZXJfc3luYygmYWFycF90aW1lcik7CisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmFhcnBfbm90aWZpZXIpOworCXVucmVnaXN0ZXJfc25hcF9jbGllbnQoYWFycF9kbCk7CisJYWFycF9wdXJnZSgpOworfQpkaWZmIC0tZ2l0IGEvbmV0L2FwcGxldGFsay9hdGFsa19wcm9jLmMgYi9uZXQvYXBwbGV0YWxrL2F0YWxrX3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzQwNDhkCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2FwcGxldGFsay9hdGFsa19wcm9jLmMKQEAgLTAsMCArMSwzMjEgQEAKKy8qCisgKiAJYXRhbGtfcHJvYy5jIC0gcHJvYyBzdXBwb3J0IGZvciBBcHBsZXRhbGsKKyAqCisgKiAJQ29weXJpZ2h0KGMpIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9hdGFsay5oPgorCisKK3N0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBhdGFsa19pZmFjZSAqYXRhbGtfZ2V0X2ludGVyZmFjZV9pZHgobG9mZl90IHBvcykKK3sKKwlzdHJ1Y3QgYXRhbGtfaWZhY2UgKmk7CisKKwlmb3IgKGkgPSBhdGFsa19pbnRlcmZhY2VzOyBwb3MgJiYgaTsgaSA9IGktPm5leHQpCisJCS0tcG9zOworCisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB2b2lkICphdGFsa19zZXFfaW50ZXJmYWNlX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlsb2ZmX3QgbCA9ICpwb3M7CisKKwlyZWFkX2xvY2tfYmgoJmF0YWxrX2ludGVyZmFjZXNfbG9jayk7CisJcmV0dXJuIGwgPyBhdGFsa19nZXRfaW50ZXJmYWNlX2lkeCgtLWwpIDogU0VRX1NUQVJUX1RPS0VOOworfQorCitzdGF0aWMgdm9pZCAqYXRhbGtfc2VxX2ludGVyZmFjZV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgYXRhbGtfaWZhY2UgKmk7CisKKwkrKypwb3M7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CisJCWkgPSBOVUxMOworCQlpZiAoYXRhbGtfaW50ZXJmYWNlcykKKwkJCWkgPSBhdGFsa19pbnRlcmZhY2VzOworCQlnb3RvIG91dDsKKwl9CisJaSA9IHY7CisJaSA9IGktPm5leHQ7CitvdXQ6CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB2b2lkIGF0YWxrX3NlcV9pbnRlcmZhY2Vfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlyZWFkX3VubG9ja19iaCgmYXRhbGtfaW50ZXJmYWNlc19sb2NrKTsKK30KKworc3RhdGljIGludCBhdGFsa19zZXFfaW50ZXJmYWNlX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IGF0YWxrX2lmYWNlICppZmFjZTsKKworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlzZXFfcHV0cyhzZXEsICJJbnRlcmZhY2UgICAgICAgIEFkZHJlc3MgICBOZXR3b3JrcyAgIgorCQkJICAgICAgIlN0YXR1c1xuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmYWNlID0gdjsKKwlzZXFfcHJpbnRmKHNlcSwgIiUtMTZzICUwNFg6JTAyWCAgJTA0WC0lMDRYICAlZFxuIiwKKwkJICAgaWZhY2UtPmRldi0+bmFtZSwgbnRvaHMoaWZhY2UtPmFkZHJlc3Muc19uZXQpLAorCQkgICBpZmFjZS0+YWRkcmVzcy5zX25vZGUsIG50b2hzKGlmYWNlLT5uZXRzLm5yX2ZpcnN0bmV0KSwKKwkJICAgbnRvaHMoaWZhY2UtPm5ldHMubnJfbGFzdG5ldCksIGlmYWNlLT5zdGF0dXMpOworb3V0OgorCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgYXRhbGtfcm91dGUgKmF0YWxrX2dldF9yb3V0ZV9pZHgobG9mZl90IHBvcykKK3sKKwlzdHJ1Y3QgYXRhbGtfcm91dGUgKnI7CisKKwlmb3IgKHIgPSBhdGFsa19yb3V0ZXM7IHBvcyAmJiByOyByID0gci0+bmV4dCkKKwkJLS1wb3M7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgKmF0YWxrX3NlcV9yb3V0ZV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJbG9mZl90IGwgPSAqcG9zOworCisJcmVhZF9sb2NrX2JoKCZhdGFsa19yb3V0ZXNfbG9jayk7CisJcmV0dXJuIGwgPyBhdGFsa19nZXRfcm91dGVfaWR4KC0tbCkgOiBTRVFfU1RBUlRfVE9LRU47Cit9CisKK3N0YXRpYyB2b2lkICphdGFsa19zZXFfcm91dGVfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGF0YWxrX3JvdXRlICpyOworCisJKysqcG9zOworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlyID0gTlVMTDsKKwkJaWYgKGF0YWxrX3JvdXRlcykKKwkJCXIgPSBhdGFsa19yb3V0ZXM7CisJCWdvdG8gb3V0OworCX0KKwlyID0gdjsKKwlyID0gci0+bmV4dDsKK291dDoKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgYXRhbGtfc2VxX3JvdXRlX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJcmVhZF91bmxvY2tfYmgoJmF0YWxrX3JvdXRlc19sb2NrKTsKK30KKworc3RhdGljIGludCBhdGFsa19zZXFfcm91dGVfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgYXRhbGtfcm91dGUgKnJ0OworCisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CisJCXNlcV9wdXRzKHNlcSwgIlRhcmdldCAgICAgICAgUm91dGVyICBGbGFncyBEZXZcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYXRydHJfZGVmYXVsdC5kZXYpIHsKKwkJcnQgPSAmYXRydHJfZGVmYXVsdDsKKwkJc2VxX3ByaW50ZihzZXEsICJEZWZhdWx0ICAgICAlMDRYOiUwMlggICUtNGQgICVzXG4iLAorCQkJICAgICAgIG50b2hzKHJ0LT5nYXRld2F5LnNfbmV0KSwgcnQtPmdhdGV3YXkuc19ub2RlLAorCQkJICAgICAgIHJ0LT5mbGFncywgcnQtPmRldi0+bmFtZSk7CisJfQorCisJcnQgPSB2OworCXNlcV9wcmludGYoc2VxLCAiJTA0WDolMDJYICAgICAlMDRYOiUwMlggICUtNGQgICVzXG4iLAorCQkgICBudG9ocyhydC0+dGFyZ2V0LnNfbmV0KSwgcnQtPnRhcmdldC5zX25vZGUsCisJCSAgIG50b2hzKHJ0LT5nYXRld2F5LnNfbmV0KSwgcnQtPmdhdGV3YXkuc19ub2RlLAorCQkgICBydC0+ZmxhZ3MsIHJ0LT5kZXYtPm5hbWUpOworb3V0OgorCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3Qgc29jayAqYXRhbGtfZ2V0X3NvY2tldF9pZHgobG9mZl90IHBvcykKK3sKKwlzdHJ1Y3Qgc29jayAqczsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCXNrX2Zvcl9lYWNoKHMsIG5vZGUsICZhdGFsa19zb2NrZXRzKQorCQlpZiAoIXBvcy0tKQorCQkJZ290byBmb3VuZDsKKwlzID0gTlVMTDsKK2ZvdW5kOgorCXJldHVybiBzOworfQorCitzdGF0aWMgdm9pZCAqYXRhbGtfc2VxX3NvY2tldF9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJbG9mZl90IGwgPSAqcG9zOworCisJcmVhZF9sb2NrX2JoKCZhdGFsa19zb2NrZXRzX2xvY2spOworCXJldHVybiBsID8gYXRhbGtfZ2V0X3NvY2tldF9pZHgoLS1sKSA6IFNFUV9TVEFSVF9UT0tFTjsKK30KKworc3RhdGljIHZvaWQgKmF0YWxrX3NlcV9zb2NrZXRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHNvY2sgKmk7CisKKwkrKypwb3M7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CisJCWkgPSBza19oZWFkKCZhdGFsa19zb2NrZXRzKTsKKwkJZ290byBvdXQ7CisJfQorCWkgPSBza19uZXh0KHYpOworb3V0OgorCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZCBhdGFsa19zZXFfc29ja2V0X3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJcmVhZF91bmxvY2tfYmgoJmF0YWxrX3NvY2tldHNfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgYXRhbGtfc2VxX3NvY2tldF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBzb2NrICpzOworCXN0cnVjdCBhdGFsa19zb2NrICphdDsKKworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlzZXFfcHJpbnRmKHNlcSwgIlR5cGUgTG9jYWxfYWRkciAgUmVtb3RlX2FkZHIgVHhfcXVldWUgIgorCQkJCSJSeF9xdWV1ZSBTdCBVSURcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlzID0gdjsKKwlhdCA9IGF0X3NrKHMpOworCisJc2VxX3ByaW50ZihzZXEsICIlMDJYICAgJTA0WDolMDJYOiUwMlggICUwNFg6JTAyWDolMDJYICAlMDhYOiUwOFggIgorCQkJIiUwMlggJWRcbiIsCisJCSAgIHMtPnNrX3R5cGUsIG50b2hzKGF0LT5zcmNfbmV0KSwgYXQtPnNyY19ub2RlLCBhdC0+c3JjX3BvcnQsCisJCSAgIG50b2hzKGF0LT5kZXN0X25ldCksIGF0LT5kZXN0X25vZGUsIGF0LT5kZXN0X3BvcnQsCisJCSAgIGF0b21pY19yZWFkKCZzLT5za193bWVtX2FsbG9jKSwKKwkJICAgYXRvbWljX3JlYWQoJnMtPnNrX3JtZW1fYWxsb2MpLAorCQkgICBzLT5za19zdGF0ZSwgU09DS19JTk9ERShzLT5za19zb2NrZXQpLT5pX3VpZCk7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgYXRhbGtfc2VxX2ludGVyZmFjZV9vcHMgPSB7CisJLnN0YXJ0ICA9IGF0YWxrX3NlcV9pbnRlcmZhY2Vfc3RhcnQsCisJLm5leHQgICA9IGF0YWxrX3NlcV9pbnRlcmZhY2VfbmV4dCwKKwkuc3RvcCAgID0gYXRhbGtfc2VxX2ludGVyZmFjZV9zdG9wLAorCS5zaG93ICAgPSBhdGFsa19zZXFfaW50ZXJmYWNlX3Nob3csCit9OworCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGF0YWxrX3NlcV9yb3V0ZV9vcHMgPSB7CisJLnN0YXJ0ICA9IGF0YWxrX3NlcV9yb3V0ZV9zdGFydCwKKwkubmV4dCAgID0gYXRhbGtfc2VxX3JvdXRlX25leHQsCisJLnN0b3AgICA9IGF0YWxrX3NlcV9yb3V0ZV9zdG9wLAorCS5zaG93ICAgPSBhdGFsa19zZXFfcm91dGVfc2hvdywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgYXRhbGtfc2VxX3NvY2tldF9vcHMgPSB7CisJLnN0YXJ0ICA9IGF0YWxrX3NlcV9zb2NrZXRfc3RhcnQsCisJLm5leHQgICA9IGF0YWxrX3NlcV9zb2NrZXRfbmV4dCwKKwkuc3RvcCAgID0gYXRhbGtfc2VxX3NvY2tldF9zdG9wLAorCS5zaG93ICAgPSBhdGFsa19zZXFfc29ja2V0X3Nob3csCit9OworCitzdGF0aWMgaW50IGF0YWxrX3NlcV9pbnRlcmZhY2Vfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmF0YWxrX3NlcV9pbnRlcmZhY2Vfb3BzKTsKK30KKworc3RhdGljIGludCBhdGFsa19zZXFfcm91dGVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmF0YWxrX3NlcV9yb3V0ZV9vcHMpOworfQorCitzdGF0aWMgaW50IGF0YWxrX3NlcV9zb2NrZXRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmF0YWxrX3NlcV9zb2NrZXRfb3BzKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXRhbGtfc2VxX2ludGVyZmFjZV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBhdGFsa19zZXFfaW50ZXJmYWNlX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF0YWxrX3NlcV9yb3V0ZV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBhdGFsa19zZXFfcm91dGVfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXRhbGtfc2VxX3NvY2tldF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBhdGFsa19zZXFfc29ja2V0X29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmF0YWxrX3Byb2NfZGlyOworCitpbnQgX19pbml0IGF0YWxrX3Byb2NfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcDsKKwlpbnQgcmMgPSAtRU5PTUVNOworCisJYXRhbGtfcHJvY19kaXIgPSBwcm9jX21rZGlyKCJhdGFsayIsIHByb2NfbmV0KTsKKwlpZiAoIWF0YWxrX3Byb2NfZGlyKQorCQlnb3RvIG91dDsKKwlhdGFsa19wcm9jX2Rpci0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCXAgPSBjcmVhdGVfcHJvY19lbnRyeSgiaW50ZXJmYWNlIiwgU19JUlVHTywgYXRhbGtfcHJvY19kaXIpOworCWlmICghcCkKKwkJZ290byBvdXRfaW50ZXJmYWNlOworCXAtPnByb2NfZm9wcyA9ICZhdGFsa19zZXFfaW50ZXJmYWNlX2ZvcHM7CisKKwlwID0gY3JlYXRlX3Byb2NfZW50cnkoInJvdXRlIiwgU19JUlVHTywgYXRhbGtfcHJvY19kaXIpOworCWlmICghcCkKKwkJZ290byBvdXRfcm91dGU7CisJcC0+cHJvY19mb3BzID0gJmF0YWxrX3NlcV9yb3V0ZV9mb3BzOworCisJcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJzb2NrZXQiLCBTX0lSVUdPLCBhdGFsa19wcm9jX2Rpcik7CisJaWYgKCFwKQorCQlnb3RvIG91dF9zb2NrZXQ7CisJcC0+cHJvY19mb3BzID0gJmF0YWxrX3NlcV9zb2NrZXRfZm9wczsKKworCXAgPSBjcmVhdGVfcHJvY19lbnRyeSgiYXJwIiwgU19JUlVHTywgYXRhbGtfcHJvY19kaXIpOworCWlmICghcCkgCisJCWdvdG8gb3V0X2FycDsKKwlwLT5wcm9jX2ZvcHMgPSAmYXRhbGtfc2VxX2FycF9mb3BzOworCisJcmMgPSAwOworb3V0OgorCXJldHVybiByYzsKK291dF9hcnA6CisJcmVtb3ZlX3Byb2NfZW50cnkoInNvY2tldCIsIGF0YWxrX3Byb2NfZGlyKTsKK291dF9zb2NrZXQ6CisJcmVtb3ZlX3Byb2NfZW50cnkoInJvdXRlIiwgYXRhbGtfcHJvY19kaXIpOworb3V0X3JvdXRlOgorCXJlbW92ZV9wcm9jX2VudHJ5KCJpbnRlcmZhY2UiLCBhdGFsa19wcm9jX2Rpcik7CitvdXRfaW50ZXJmYWNlOgorCXJlbW92ZV9wcm9jX2VudHJ5KCJhdGFsayIsIHByb2NfbmV0KTsKKwlnb3RvIG91dDsKK30KKwordm9pZCBfX2V4aXQgYXRhbGtfcHJvY19leGl0KHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoImludGVyZmFjZSIsIGF0YWxrX3Byb2NfZGlyKTsKKwlyZW1vdmVfcHJvY19lbnRyeSgicm91dGUiLCBhdGFsa19wcm9jX2Rpcik7CisJcmVtb3ZlX3Byb2NfZW50cnkoInNvY2tldCIsIGF0YWxrX3Byb2NfZGlyKTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiYXJwIiwgYXRhbGtfcHJvY19kaXIpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJhdGFsayIsIHByb2NfbmV0KTsKK30KZGlmZiAtLWdpdCBhL25ldC9hcHBsZXRhbGsvZGRwLmMgYi9uZXQvYXBwbGV0YWxrL2RkcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZmVhNWMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYXBwbGV0YWxrL2RkcC5jCkBAIC0wLDAgKzEsMTkzMSBAQAorLyoKKyAqCUREUDoJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEFwcGxlVGFsayBERFAgcHJvdG9jb2wgZm9yCisgKgkJRXRoZXJuZXQgJ0VMQVAnLgorICoKKyAqCQlBbGFuIENveCAgPEFsYW4uQ294QGxpbnV4Lm9yZz4KKyAqCisgKgkJV2l0aCBtb3JlIHRoYW4gYSBsaXR0bGUgYXNzaXN0YW5jZSBmcm9tCisgKgorICoJCVdlc2xleSBDcmFpZyA8bmV0YXRhbGtAdW1pY2guZWR1PgorICoKKyAqCUZpeGVzOgorICoJCU5laWwgSG9ybWFuCQk6CUFkZGVkIG1pc3NpbmcgZGV2aWNlIGlvY3RscworICoJCU1pY2hhZWwgQ2FsbGFoYW4JOglNYWRlIHJvdXRpbmcgd29yaworICoJCVdlc2xleSBDcmFpZwkJOglGaXggcHJvYmluZyB0byBsaXN0ZW4gdG8gYQorICoJCQkJCQlwYXNzZWQgbm9kZSBpZC4KKyAqCQlBbGFuIENveAkJOglBZGRlZCBzZW5kL3JlY3Ztc2cgc3VwcG9ydAorICoJCUFsYW4gQ294CQk6CU1vdmVkIGF0LiB0byBwcm90aW5mbyBpbgorICoJCQkJCQlzb2NrZXQuCisgKgkJQWxhbiBDb3gJCToJQWRkZWQgZmlyZXdhbGwgaG9va3MuCisgKgkJQWxhbiBDb3gJCToJU3VwcG9ydHMgbmV3IEFSUEhSRF9MT09QQkFDSworICoJCUNocmlzdGVyIFdlaW5pZ2VsCTogCVJvdXRpbmcgYW5kIC9wcm9jIGZpeGVzLgorICoJCUJyYWRmb3JkIEpvaG5zb24JOglMb2NhbFRhbGsuCisgKgkJVG9tIER5YXMJCToJTW9kdWxlIHN1cHBvcnQuCisgKgkJQWxhbiBDb3gJCToJSG9va3MgZm9yIFBQUCAoYmFzZWQgb24gdGhlCisgKgkJCQkJCUxvY2FsVGFsayBob29rKS4KKyAqCQlBbGFuIENveAkJOglQb3NpeCBiaXRzCisgKgkJQWxhbiBDb3gvTWlrZSBGcmVlbWFuCToJUG9zc2libGUgZml4IHRvIE5CUCBwcm9ibGVtcworICoJCUJyYWRmb3JkIEpvaG5zb24JOglJUC1vdmVyLUREUCAoZXhwZXJpbWVudGFsKQorICoJCUpheSBTY2h1bGlzdAkJOglNb3ZlZCBJUC1vdmVyLUREUCB0byBpdHMgb3duCisgKgkJCQkJCWRyaXZlciBmaWxlLiAoaXBkZHAuYyAmIGlwZGRwLmgpCisgKgkJSmF5IFNjaHVsaXN0CQk6CU1hZGUgd29yayBhcyBtb2R1bGUgd2l0aCAKKyAqCQkJCQkJQXBwbGVUYWxrIGRyaXZlcnMsIGNsZWFuZWQgaXQuCisgKgkJUm9iIE5ld2JlcnJ5CQk6CUFkZGVkIHByb3h5IEFBUlAgYW5kIEFBUlAKKyAqCQkJCQkJcHJvY2ZzLCBtb3ZlZCBwcm9iaW5nIHRvIEFBUlAKKyAqCQkJCQkJbW9kdWxlLgorICogICAgICAgICAgICAgIEFkcmlhbiBTdW4vIAorICogICAgICAgICAgICAgIE1pY2hhZWwgWnVlbHNkb3JmZiAgICAgIDogICAgICAgZml4IGZvciBuZXQuMCBwYWNrZXRzLiBkb24ndCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93IGlsbGVnYWwgZXRoZXIvdG9rZW50YWxrCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0IGFzc2lnbm1lbnQuIHdlIGxvc2UgYSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIGxvY2FsdGFsayBwb3J0IGFzIGEgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuCisgKgkJQXJuYWxkbyBDLiBkZSBNZWxvCToJQ2xlYW51cCwgaW4gcHJlcGFyYXRpb24gZm9yCisgKgkJCQkJCXNoYXJlZCBza2Igc3VwcG9ydCA4KQorICoJCUFybmFsZG8gQy4gZGUgTWVsbwk6CU1vdmUgcHJvYyBzdHVmZiB0byBhdGFsa19wcm9jLmMsCisgKgkJCQkJCXVzZSBzZXFfZmlsZQorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4JLyogRm9yIFRJT0NPVVRRL0lOUSAqLworI2luY2x1ZGUgPG5ldC9kYXRhbGluay5oPgorI2luY2x1ZGUgPG5ldC9wc25hcC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisjaW5jbHVkZSA8bGludXgvYXRhbGsuaD4KKworc3RydWN0IGRhdGFsaW5rX3Byb3RvICpkZHBfZGwsICphYXJwX2RsOworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgYXRhbGtfZGdyYW1fb3BzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEhhbmRsZXJzIGZvciB0aGUgc29ja2V0IGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0hMSVNUX0hFQUQoYXRhbGtfc29ja2V0cyk7CitERUZJTkVfUldMT0NLKGF0YWxrX3NvY2tldHNfbG9jayk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2F0YWxrX2luc2VydF9zb2NrZXQoc3RydWN0IHNvY2sgKnNrKQoreworCXNrX2FkZF9ub2RlKHNrLCAmYXRhbGtfc29ja2V0cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGFsa19yZW1vdmVfc29ja2V0KHN0cnVjdCBzb2NrICpzaykKK3sKKwl3cml0ZV9sb2NrX2JoKCZhdGFsa19zb2NrZXRzX2xvY2spOworCXNrX2RlbF9ub2RlX2luaXQoc2spOworCXdyaXRlX3VubG9ja19iaCgmYXRhbGtfc29ja2V0c19sb2NrKTsKK30KKworc3RhdGljIHN0cnVjdCBzb2NrICphdGFsa19zZWFyY2hfc29ja2V0KHN0cnVjdCBzb2NrYWRkcl9hdCAqdG8sCisJCQkJCXN0cnVjdCBhdGFsa19pZmFjZSAqYXRpZikKK3sKKwlzdHJ1Y3Qgc29jayAqczsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCXJlYWRfbG9ja19iaCgmYXRhbGtfc29ja2V0c19sb2NrKTsKKwlza19mb3JfZWFjaChzLCBub2RlLCAmYXRhbGtfc29ja2V0cykgeworCQlzdHJ1Y3QgYXRhbGtfc29jayAqYXQgPSBhdF9zayhzKTsKKworCQlpZiAodG8tPnNhdF9wb3J0ICE9IGF0LT5zcmNfcG9ydCkKKwkJCWNvbnRpbnVlOworCisJICAgIAlpZiAodG8tPnNhdF9hZGRyLnNfbmV0ID09IEFUQUREUl9BTllORVQgJiYKKwkJICAgIHRvLT5zYXRfYWRkci5zX25vZGUgPT0gQVRBRERSX0JDQVNUICYmCisJCSAgICBhdC0+c3JjX25ldCA9PSBhdGlmLT5hZGRyZXNzLnNfbmV0KQorCQkJZ290byBmb3VuZDsKKworCSAgICAJaWYgKHRvLT5zYXRfYWRkci5zX25ldCA9PSBhdC0+c3JjX25ldCAmJgorCQkgICAgKHRvLT5zYXRfYWRkci5zX25vZGUgPT0gYXQtPnNyY19ub2RlIHx8CisJCSAgICAgdG8tPnNhdF9hZGRyLnNfbm9kZSA9PSBBVEFERFJfQkNBU1QgfHwKKwkJICAgICB0by0+c2F0X2FkZHIuc19ub2RlID09IEFUQUREUl9BTllOT0RFKSkKKwkJCWdvdG8gZm91bmQ7CisKKwkgICAgCS8qIFhYWFguMCAtLSB3ZSBnb3QgYSByZXF1ZXN0IGZvciB0aGlzIHJvdXRlci4gbWFrZSBzdXJlCisJCSAqIHRoYXQgdGhlIG5vZGUgaXMgYXBwcm9wcmlhdGVseSBzZXQuICovCisJCWlmICh0by0+c2F0X2FkZHIuc19ub2RlID09IEFUQUREUl9BTllOT0RFICYmCisJCSAgICB0by0+c2F0X2FkZHIuc19uZXQgIT0gQVRBRERSX0FOWU5FVCAmJgorCQkgICAgYXRpZi0+YWRkcmVzcy5zX25vZGUgPT0gYXQtPnNyY19ub2RlKSB7CisJCQl0by0+c2F0X2FkZHIuc19ub2RlID0gYXRpZi0+YWRkcmVzcy5zX25vZGU7CisJCQlnb3RvIGZvdW5kOworCQl9CisJfQorCXMgPSBOVUxMOworZm91bmQ6CisJcmVhZF91bmxvY2tfYmgoJmF0YWxrX3NvY2tldHNfbG9jayk7CisJcmV0dXJuIHM7Cit9CisKKy8qKgorICogYXRhbGtfZmluZF9vcl9pbnNlcnRfc29ja2V0IC0gVHJ5IHRvIGZpbmQgYSBzb2NrZXQgbWF0Y2hpbmcgQUREUgorICogQHNrIC0gc29ja2V0IHRvIGluc2VydCBpbiB0aGUgbGlzdCBpZiBpdCBpcyBub3QgdGhlcmUgYWxyZWFkeQorICogQHNhdCAtIGFkZHJlc3MgdG8gc2VhcmNoIGZvcgorICoKKyAqIFRyeSB0byBmaW5kIGEgc29ja2V0IG1hdGNoaW5nIEFERFIgaW4gdGhlIHNvY2tldCBsaXN0LCBpZiBmb3VuZCB0aGVuIHJldHVybgorICogaXQuIElmIG5vdCwgaW5zZXJ0IFNLIGludG8gdGhlIHNvY2tldCBsaXN0LgorICoKKyAqIFRoaXMgZW50aXJlIG9wZXJhdGlvbiBtdXN0IGV4ZWN1dGUgYXRvbWljYWxseS4KKyAqLworc3RhdGljIHN0cnVjdCBzb2NrICphdGFsa19maW5kX29yX2luc2VydF9zb2NrZXQoc3RydWN0IHNvY2sgKnNrLAorCQkJCQkJc3RydWN0IHNvY2thZGRyX2F0ICpzYXQpCit7CisJc3RydWN0IHNvY2sgKnM7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJc3RydWN0IGF0YWxrX3NvY2sgKmF0OworCisJd3JpdGVfbG9ja19iaCgmYXRhbGtfc29ja2V0c19sb2NrKTsKKwlza19mb3JfZWFjaChzLCBub2RlLCAmYXRhbGtfc29ja2V0cykgeworCQlhdCA9IGF0X3NrKHMpOworCisJCWlmIChhdC0+c3JjX25ldCA9PSBzYXQtPnNhdF9hZGRyLnNfbmV0ICYmCisJCSAgICBhdC0+c3JjX25vZGUgPT0gc2F0LT5zYXRfYWRkci5zX25vZGUgJiYKKwkJICAgIGF0LT5zcmNfcG9ydCA9PSBzYXQtPnNhdF9wb3J0KQorCQkJZ290byBmb3VuZDsKKwl9CisJcyA9IE5VTEw7CisJX19hdGFsa19pbnNlcnRfc29ja2V0KHNrKTsgLyogV2hlZWUsIGl0J3MgZnJlZSwgYXNzaWduIGFuZCBpbnNlcnQuICovCitmb3VuZDoKKwl3cml0ZV91bmxvY2tfYmgoJmF0YWxrX3NvY2tldHNfbG9jayk7CisJcmV0dXJuIHM7Cit9CisKK3N0YXRpYyB2b2lkIGF0YWxrX2Rlc3Ryb3lfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBzb2NrICpzayA9IChzdHJ1Y3Qgc29jayAqKWRhdGE7CisKKwlpZiAoYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKSB8fAorCSAgICBhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpKSB7CisJCXNrLT5za190aW1lci5leHBpcmVzID0gamlmZmllcyArIFNPQ0tfREVTVFJPWV9USU1FOworCQlhZGRfdGltZXIoJnNrLT5za190aW1lcik7CisJfSBlbHNlCisJCXNvY2tfcHV0KHNrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0YWxrX2Rlc3Ryb3lfc29ja2V0KHN0cnVjdCBzb2NrICpzaykKK3sKKwlhdGFsa19yZW1vdmVfc29ja2V0KHNrKTsKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKworCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpIHx8CisJICAgIGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykpIHsKKwkJaW5pdF90aW1lcigmc2stPnNrX3RpbWVyKTsKKwkJc2stPnNrX3RpbWVyLmV4cGlyZXMJPSBqaWZmaWVzICsgU09DS19ERVNUUk9ZX1RJTUU7CisJCXNrLT5za190aW1lci5mdW5jdGlvbgk9IGF0YWxrX2Rlc3Ryb3lfdGltZXI7CisJCXNrLT5za190aW1lci5kYXRhCT0gKHVuc2lnbmVkIGxvbmcpc2s7CisJCWFkZF90aW1lcigmc2stPnNrX3RpbWVyKTsKKwl9IGVsc2UKKwkJc29ja19wdXQoc2spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIFJvdXRpbmcgdGFibGVzIGZvciB0aGUgQXBwbGVUYWxrIHNvY2tldCBsYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEFudGktZGVhZGxvY2sgb3JkZXJpbmcgaXMgYXRhbGtfcm91dGVzX2xvY2sgLS0+IGlmYWNlX2xvY2sgLURhdmVNICovCitzdHJ1Y3QgYXRhbGtfcm91dGUgKmF0YWxrX3JvdXRlczsKK0RFRklORV9SV0xPQ0soYXRhbGtfcm91dGVzX2xvY2spOworCitzdHJ1Y3QgYXRhbGtfaWZhY2UgKmF0YWxrX2ludGVyZmFjZXM7CitERUZJTkVfUldMT0NLKGF0YWxrX2ludGVyZmFjZXNfbG9jayk7CisKKy8qIEZvciBwcm9iaW5nIGRldmljZXMgb3IgaW4gYSByb3V0ZXJsZXNzIG5ldHdvcmsgKi8KK3N0cnVjdCBhdGFsa19yb3V0ZSBhdHJ0cl9kZWZhdWx0OworCisvKiBBcHBsZVRhbGsgaW50ZXJmYWNlIGNvbnRyb2wgKi8KKy8qCisgKiBEcm9wIGEgZGV2aWNlLiBEb2Vzbid0IGRyb3AgYW55IG9mIGl0cyByb3V0ZXMgLSB0aGF0IGlzIHRoZSBjYWxsZXIncworICogcHJvYmxlbS4gQ2FsbGVkIHdoZW4gd2UgZG93biB0aGUgaW50ZXJmYWNlIG9yIGRlbGV0ZSB0aGUgYWRkcmVzcy4KKyAqLworc3RhdGljIHZvaWQgYXRpZl9kcm9wX2RldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdGFsa19pZmFjZSAqKmlmYWNlID0gJmF0YWxrX2ludGVyZmFjZXM7CisJc3RydWN0IGF0YWxrX2lmYWNlICp0bXA7CisKKwl3cml0ZV9sb2NrX2JoKCZhdGFsa19pbnRlcmZhY2VzX2xvY2spOworCXdoaWxlICgodG1wID0gKmlmYWNlKSAhPSBOVUxMKSB7CisJCWlmICh0bXAtPmRldiA9PSBkZXYpIHsKKwkJCSppZmFjZSA9IHRtcC0+bmV4dDsKKwkJCWRldl9wdXQoZGV2KTsKKwkJCWtmcmVlKHRtcCk7CisJCQlkZXYtPmF0YWxrX3B0ciA9IE5VTEw7CisJCX0gZWxzZQorCQkJaWZhY2UgPSAmdG1wLT5uZXh0OworCX0KKwl3cml0ZV91bmxvY2tfYmgoJmF0YWxrX2ludGVyZmFjZXNfbG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXRhbGtfaWZhY2UgKmF0aWZfYWRkX2RldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICBzdHJ1Y3QgYXRhbGtfYWRkciAqc2EpCit7CisJc3RydWN0IGF0YWxrX2lmYWNlICppZmFjZSA9IGttYWxsb2Moc2l6ZW9mKCppZmFjZSksIEdGUF9LRVJORUwpOworCisJaWYgKCFpZmFjZSkKKwkJZ290byBvdXQ7CisKKwltZW1zZXQoaWZhY2UsIDAsIHNpemVvZigqaWZhY2UpKTsKKwlkZXZfaG9sZChkZXYpOworCWlmYWNlLT5kZXYgPSBkZXY7CisJZGV2LT5hdGFsa19wdHIgPSBpZmFjZTsKKwlpZmFjZS0+YWRkcmVzcyA9ICpzYTsKKwlpZmFjZS0+c3RhdHVzID0gMDsKKworCXdyaXRlX2xvY2tfYmgoJmF0YWxrX2ludGVyZmFjZXNfbG9jayk7CisJaWZhY2UtPm5leHQgPSBhdGFsa19pbnRlcmZhY2VzOworCWF0YWxrX2ludGVyZmFjZXMgPSBpZmFjZTsKKwl3cml0ZV91bmxvY2tfYmgoJmF0YWxrX2ludGVyZmFjZXNfbG9jayk7CitvdXQ6CisJcmV0dXJuIGlmYWNlOworfQorCisvKiBQZXJmb3JtIHBoYXNlIDIgQUFSUCBwcm9iaW5nIG9uIG91ciB0ZW50YXRpdmUgYWRkcmVzcyAqLworc3RhdGljIGludCBhdGlmX3Byb2JlX2RldmljZShzdHJ1Y3QgYXRhbGtfaWZhY2UgKmF0aWYpCit7CisJaW50IG5ldHJhbmdlID0gbnRvaHMoYXRpZi0+bmV0cy5ucl9sYXN0bmV0KSAtCisJCQludG9ocyhhdGlmLT5uZXRzLm5yX2ZpcnN0bmV0KSArIDE7CisJaW50IHByb2JlX25ldCA9IG50b2hzKGF0aWYtPmFkZHJlc3Muc19uZXQpOworCWludCBwcm9iZV9ub2RlID0gYXRpZi0+YWRkcmVzcy5zX25vZGU7CisJaW50IG5ldGN0LCBub2RlY3Q7CisKKwkvKiBPZmZzZXQgdGhlIG5ldHdvcmsgd2Ugc3RhcnQgcHJvYmluZyB3aXRoICovCisJaWYgKHByb2JlX25ldCA9PSBBVEFERFJfQU5ZTkVUKSB7CisJCXByb2JlX25ldCA9IG50b2hzKGF0aWYtPm5ldHMubnJfZmlyc3RuZXQpOworCQlpZiAobmV0cmFuZ2UpCisJCQlwcm9iZV9uZXQgKz0gamlmZmllcyAlIG5ldHJhbmdlOworCX0KKwlpZiAocHJvYmVfbm9kZSA9PSBBVEFERFJfQU5ZTk9ERSkKKwkJcHJvYmVfbm9kZSA9IGppZmZpZXMgJiAweEZGOworCisJLyogU2NhbiB0aGUgbmV0d29ya3MgKi8KKwlhdGlmLT5zdGF0dXMgfD0gQVRJRl9QUk9CRTsKKwlmb3IgKG5ldGN0ID0gMDsgbmV0Y3QgPD0gbmV0cmFuZ2U7IG5ldGN0KyspIHsKKwkJLyogU3dlZXAgdGhlIGF2YWlsYWJsZSBub2RlcyBmcm9tIGEgZ2l2ZW4gc3RhcnQgKi8KKwkJYXRpZi0+YWRkcmVzcy5zX25ldCA9IGh0b25zKHByb2JlX25ldCk7CisJCWZvciAobm9kZWN0ID0gMDsgbm9kZWN0IDwgMjU2OyBub2RlY3QrKykgeworCQkJYXRpZi0+YWRkcmVzcy5zX25vZGUgPSAobm9kZWN0ICsgcHJvYmVfbm9kZSkgJiAweEZGOworCQkJaWYgKGF0aWYtPmFkZHJlc3Muc19ub2RlID4gMCAmJgorCQkJICAgIGF0aWYtPmFkZHJlc3Muc19ub2RlIDwgMjU0KSB7CisJCQkJLyogUHJvYmUgYSBwcm9wb3NlZCBhZGRyZXNzICovCisJCQkJYWFycF9wcm9iZV9uZXR3b3JrKGF0aWYpOworCisJCQkJaWYgKCEoYXRpZi0+c3RhdHVzICYgQVRJRl9QUk9CRV9GQUlMKSkgeworCQkJCQlhdGlmLT5zdGF0dXMgJj0gfkFUSUZfUFJPQkU7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJCWF0aWYtPnN0YXR1cyAmPSB+QVRJRl9QUk9CRV9GQUlMOworCQl9CisJCXByb2JlX25ldCsrOworCQlpZiAocHJvYmVfbmV0ID4gbnRvaHMoYXRpZi0+bmV0cy5ucl9sYXN0bmV0KSkKKwkJCXByb2JlX25ldCA9IG50b2hzKGF0aWYtPm5ldHMubnJfZmlyc3RuZXQpOworCX0KKwlhdGlmLT5zdGF0dXMgJj0gfkFUSUZfUFJPQkU7CisKKwlyZXR1cm4gLUVBRERSSU5VU0U7CS8qIE5ldHdvcmsgaXMgZnVsbC4uLiAqLworfQorCisKKy8qIFBlcmZvcm0gQUFSUCBwcm9iaW5nIGZvciBhIHByb3h5IGFkZHJlc3MgKi8KK3N0YXRpYyBpbnQgYXRpZl9wcm94eV9wcm9iZV9kZXZpY2Uoc3RydWN0IGF0YWxrX2lmYWNlICphdGlmLAorCQkJCSAgIHN0cnVjdCBhdGFsa19hZGRyKiBwcm94eV9hZGRyKQoreworCWludCBuZXRyYW5nZSA9IG50b2hzKGF0aWYtPm5ldHMubnJfbGFzdG5ldCkgLQorCQkJbnRvaHMoYXRpZi0+bmV0cy5ucl9maXJzdG5ldCkgKyAxOworCS8qIHdlIHByb2JlIHRoZSBpbnRlcmZhY2UncyBuZXR3b3JrICovCisJaW50IHByb2JlX25ldCA9IG50b2hzKGF0aWYtPmFkZHJlc3Muc19uZXQpOworCWludCBwcm9iZV9ub2RlID0gQVRBRERSX0FOWU5PREU7CSAgICAvKiB3ZSdsbCB0YWtlIGFueXRoaW5nICovCisJaW50IG5ldGN0LCBub2RlY3Q7CisKKwkvKiBPZmZzZXQgdGhlIG5ldHdvcmsgd2Ugc3RhcnQgcHJvYmluZyB3aXRoICovCisJaWYgKHByb2JlX25ldCA9PSBBVEFERFJfQU5ZTkVUKSB7CisJCXByb2JlX25ldCA9IG50b2hzKGF0aWYtPm5ldHMubnJfZmlyc3RuZXQpOworCQlpZiAobmV0cmFuZ2UpCisJCQlwcm9iZV9uZXQgKz0gamlmZmllcyAlIG5ldHJhbmdlOworCX0KKworCWlmIChwcm9iZV9ub2RlID09IEFUQUREUl9BTllOT0RFKQorCQlwcm9iZV9ub2RlID0gamlmZmllcyAmIDB4RkY7CisJCQorCS8qIFNjYW4gdGhlIG5ldHdvcmtzICovCisJZm9yIChuZXRjdCA9IDA7IG5ldGN0IDw9IG5ldHJhbmdlOyBuZXRjdCsrKSB7CisJCS8qIFN3ZWVwIHRoZSBhdmFpbGFibGUgbm9kZXMgZnJvbSBhIGdpdmVuIHN0YXJ0ICovCisJCXByb3h5X2FkZHItPnNfbmV0ID0gaHRvbnMocHJvYmVfbmV0KTsKKwkJZm9yIChub2RlY3QgPSAwOyBub2RlY3QgPCAyNTY7IG5vZGVjdCsrKSB7CisJCQlwcm94eV9hZGRyLT5zX25vZGUgPSAobm9kZWN0ICsgcHJvYmVfbm9kZSkgJiAweEZGOworCQkJaWYgKHByb3h5X2FkZHItPnNfbm9kZSA+IDAgJiYKKwkJCSAgICBwcm94eV9hZGRyLT5zX25vZGUgPCAyNTQpIHsKKwkJCQkvKiBUZWxsIEFBUlAgdG8gcHJvYmUgYSBwcm9wb3NlZCBhZGRyZXNzICovCisJCQkJaW50IHJldCA9IGFhcnBfcHJveHlfcHJvYmVfbmV0d29yayhhdGlmLAorCQkJCQkJCQkgICAgcHJveHlfYWRkcik7CisKKwkJCQlpZiAocmV0ICE9IC1FQUREUklOVVNFKQorCQkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJCXByb2JlX25ldCsrOworCQlpZiAocHJvYmVfbmV0ID4gbnRvaHMoYXRpZi0+bmV0cy5ucl9sYXN0bmV0KSkKKwkJCXByb2JlX25ldCA9IG50b2hzKGF0aWYtPm5ldHMubnJfZmlyc3RuZXQpOworCX0KKworCXJldHVybiAtRUFERFJJTlVTRTsJLyogTmV0d29yayBpcyBmdWxsLi4uICovCit9CisKKworc3RydWN0IGF0YWxrX2FkZHIgKmF0YWxrX2ZpbmRfZGV2X2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXRhbGtfaWZhY2UgKmlmYWNlID0gZGV2LT5hdGFsa19wdHI7CisJcmV0dXJuIGlmYWNlID8gJmlmYWNlLT5hZGRyZXNzIDogTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBhdGFsa19hZGRyICphdGFsa19maW5kX3ByaW1hcnkodm9pZCkKK3sKKwlzdHJ1Y3QgYXRhbGtfaWZhY2UgKmZpZmFjZSA9IE5VTEw7CisJc3RydWN0IGF0YWxrX2FkZHIgKnJldHZhbDsKKwlzdHJ1Y3QgYXRhbGtfaWZhY2UgKmlmYWNlOworCisJLyoKKwkgKiBSZXR1cm4gYSBwb2ludC10by1wb2ludCBpbnRlcmZhY2Ugb25seSBpZgorCSAqIHRoZXJlIGlzIG5vIG5vbi1wdHAgaW50ZXJmYWNlIGF2YWlsYWJsZS4KKwkgKi8KKwlyZWFkX2xvY2tfYmgoJmF0YWxrX2ludGVyZmFjZXNfbG9jayk7CisJZm9yIChpZmFjZSA9IGF0YWxrX2ludGVyZmFjZXM7IGlmYWNlOyBpZmFjZSA9IGlmYWNlLT5uZXh0KSB7CisJCWlmICghZmlmYWNlICYmICEoaWZhY2UtPmRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spKQorCQkJZmlmYWNlID0gaWZhY2U7CisJCWlmICghKGlmYWNlLT5kZXYtPmZsYWdzICYgKElGRl9MT09QQkFDSyB8IElGRl9QT0lOVE9QT0lOVCkpKSB7CisJCQlyZXR2YWwgPSAmaWZhY2UtPmFkZHJlc3M7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmIChmaWZhY2UpCisJCXJldHZhbCA9ICZmaWZhY2UtPmFkZHJlc3M7CisJZWxzZSBpZiAoYXRhbGtfaW50ZXJmYWNlcykKKwkJcmV0dmFsID0gJmF0YWxrX2ludGVyZmFjZXMtPmFkZHJlc3M7CisJZWxzZQorCQlyZXR2YWwgPSBOVUxMOworb3V0OgorCXJlYWRfdW5sb2NrX2JoKCZhdGFsa19pbnRlcmZhY2VzX2xvY2spOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBGaW5kIGEgbWF0Y2ggZm9yICdhbnkgbmV0d29yaycgLSBpZSBhbnkgb2Ygb3VyIGludGVyZmFjZXMgd2l0aCB0aGF0CisgKiBub2RlIG51bWJlciB3aWxsIGRvIGp1c3QgbmljZWx5LgorICovCitzdGF0aWMgc3RydWN0IGF0YWxrX2lmYWNlICphdGFsa19maW5kX2FueW5ldChpbnQgbm9kZSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXRhbGtfaWZhY2UgKmlmYWNlID0gZGV2LT5hdGFsa19wdHI7CisKKwlpZiAoIWlmYWNlIHx8IGlmYWNlLT5zdGF0dXMgJiBBVElGX1BST0JFKQorCQlnb3RvIG91dF9lcnI7CisKKwlpZiAobm9kZSAhPSBBVEFERFJfQkNBU1QgJiYKKwkgICAgaWZhY2UtPmFkZHJlc3Muc19ub2RlICE9IG5vZGUgJiYKKwkgICAgbm9kZSAhPSBBVEFERFJfQU5ZTk9ERSkKKwkJZ290byBvdXRfZXJyOworb3V0OgorCXJldHVybiBpZmFjZTsKK291dF9lcnI6CisJaWZhY2UgPSBOVUxMOworCWdvdG8gb3V0OworfQorCisvKiBGaW5kIGEgbWF0Y2ggZm9yIGEgc3BlY2lmaWMgbmV0d29yazpub2RlIHBhaXIgKi8KK3N0YXRpYyBzdHJ1Y3QgYXRhbGtfaWZhY2UgKmF0YWxrX2ZpbmRfaW50ZXJmYWNlKGludCBuZXQsIGludCBub2RlKQoreworCXN0cnVjdCBhdGFsa19pZmFjZSAqaWZhY2U7CisKKwlyZWFkX2xvY2tfYmgoJmF0YWxrX2ludGVyZmFjZXNfbG9jayk7CisJZm9yIChpZmFjZSA9IGF0YWxrX2ludGVyZmFjZXM7IGlmYWNlOyBpZmFjZSA9IGlmYWNlLT5uZXh0KSB7CisJCWlmICgobm9kZSA9PSBBVEFERFJfQkNBU1QgfHwKKwkJICAgICBub2RlID09IEFUQUREUl9BTllOT0RFIHx8CisJCSAgICAgaWZhY2UtPmFkZHJlc3Muc19ub2RlID09IG5vZGUpICYmCisJCSAgICBpZmFjZS0+YWRkcmVzcy5zX25ldCA9PSBuZXQgJiYKKwkJICAgICEoaWZhY2UtPnN0YXR1cyAmIEFUSUZfUFJPQkUpKQorCQkJYnJlYWs7CisKKwkJLyogWFhYWC4wIC0tIG5ldC4wIHJldHVybnMgdGhlIGlmYWNlIGFzc29jaWF0ZWQgd2l0aCBuZXQgKi8KKwkJaWYgKG5vZGUgPT0gQVRBRERSX0FOWU5PREUgJiYgbmV0ICE9IEFUQUREUl9BTllORVQgJiYKKwkJICAgIG50b2hzKGlmYWNlLT5uZXRzLm5yX2ZpcnN0bmV0KSA8PSBudG9ocyhuZXQpICYmCisJCSAgICBudG9ocyhuZXQpIDw9IG50b2hzKGlmYWNlLT5uZXRzLm5yX2xhc3RuZXQpKQorCQkgICAgICAgIGJyZWFrOworCX0KKwlyZWFkX3VubG9ja19iaCgmYXRhbGtfaW50ZXJmYWNlc19sb2NrKTsKKwlyZXR1cm4gaWZhY2U7Cit9CisKKworLyoKKyAqIEZpbmQgYSByb3V0ZSBmb3IgYW4gQXBwbGVUYWxrIHBhY2tldC4gVGhpcyBvdWdodCB0byBnZXQgY2FjaGVkIGluCisgKiB0aGUgc29ja2V0IChsYXRlciBvbi4uLikuIFdlIGtub3cgYWJvdXQgaG9zdCByb3V0ZXMgYW5kIHRoZSBmYWN0CisgKiB0aGF0IGEgcm91dGUgbXVzdCBiZSBkaXJlY3QgdG8gYnJvYWRjYXN0LgorICovCitzdGF0aWMgc3RydWN0IGF0YWxrX3JvdXRlICphdHJ0cl9maW5kKHN0cnVjdCBhdGFsa19hZGRyICp0YXJnZXQpCit7CisJLyoKKwkgKiB3ZSBtdXN0IHNlYXJjaCB0aHJvdWdoIGFsbCByb3V0ZXMgdW5sZXNzIHdlIGZpbmQgYSAKKwkgKiBob3N0IHJvdXRlLCBiZWNhdXNlIHNvbWUgaG9zdCByb3V0ZXMgbWlnaHQgb3ZlcmxhcAorCSAqIG5ldHdvcmsgcm91dGVzCisJICovCisJc3RydWN0IGF0YWxrX3JvdXRlICpuZXRfcm91dGUgPSBOVUxMOworCXN0cnVjdCBhdGFsa19yb3V0ZSAqcjsKKwkKKwlyZWFkX2xvY2tfYmgoJmF0YWxrX3JvdXRlc19sb2NrKTsKKwlmb3IgKHIgPSBhdGFsa19yb3V0ZXM7IHI7IHIgPSByLT5uZXh0KSB7CisJCWlmICghKHItPmZsYWdzICYgUlRGX1VQKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChyLT50YXJnZXQuc19uZXQgPT0gdGFyZ2V0LT5zX25ldCkgeworCQkJaWYgKHItPmZsYWdzICYgUlRGX0hPU1QpIHsKKwkJCQkvKgorCQkJCSAqIGlmIHRoaXMgaG9zdCByb3V0ZSBpcyBmb3IgdGhlIHRhcmdldCwKKwkJCQkgKiB0aGUgd2UncmUgZG9uZQorCQkJCSAqLworCQkJCWlmIChyLT50YXJnZXQuc19ub2RlID09IHRhcmdldC0+c19ub2RlKQorCQkJCQlnb3RvIG91dDsKKwkJCX0gZWxzZQorCQkJCS8qCisJCQkJICogdGhpcyByb3V0ZSB3aWxsIHdvcmsgaWYgdGhlcmUgaXNuJ3QgYQorCQkJCSAqIGRpcmVjdCBob3N0IHJvdXRlLCBzbyBjYWNoZSBpdAorCQkJCSAqLworCQkJCW5ldF9yb3V0ZSA9IHI7CisJCX0KKwl9CisJCisJLyogCisJICogaWYgd2UgZm91bmQgYSBuZXR3b3JrIHJvdXRlIGJ1dCBub3QgYSBkaXJlY3QgaG9zdAorCSAqIHJvdXRlLCB0aGVuIHJldHVybiBpdAorCSAqLworCWlmIChuZXRfcm91dGUpCisJCXIgPSBuZXRfcm91dGU7CisJZWxzZSBpZiAoYXRydHJfZGVmYXVsdC5kZXYpCisJCXIgPSAmYXRydHJfZGVmYXVsdDsKKwllbHNlIC8qIE5vIHJvdXRlIGNhbiBiZSBmb3VuZCAqLworCQlyID0gTlVMTDsKK291dDoKKwlyZWFkX3VubG9ja19iaCgmYXRhbGtfcm91dGVzX2xvY2spOworCXJldHVybiByOworfQorCisKKy8qCisgKiBHaXZlbiBhbiBBcHBsZVRhbGsgbmV0d29yaywgZmluZCB0aGUgZGV2aWNlIHRvIHVzZS4gVGhpcyBjYW4gYmUKKyAqIGEgc2ltcGxlIGxvb2t1cC4KKyAqLworc3RydWN0IG5ldF9kZXZpY2UgKmF0cnRyX2dldF9kZXYoc3RydWN0IGF0YWxrX2FkZHIgKnNhKQoreworCXN0cnVjdCBhdGFsa19yb3V0ZSAqYXRyID0gYXRydHJfZmluZChzYSk7CisJcmV0dXJuIGF0ciA/IGF0ci0+ZGV2IDogTlVMTDsKK30KKworLyogU2V0IHVwIGEgZGVmYXVsdCByb3V0ZXIgKi8KK3N0YXRpYyB2b2lkIGF0cnRyX3NldF9kZWZhdWx0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJYXRydHJfZGVmYXVsdC5kZXYJICAgICA9IGRldjsKKwlhdHJ0cl9kZWZhdWx0LmZsYWdzCSAgICAgPSBSVEZfVVA7CisJYXRydHJfZGVmYXVsdC5nYXRld2F5LnNfbmV0ICA9IGh0b25zKDApOworCWF0cnRyX2RlZmF1bHQuZ2F0ZXdheS5zX25vZGUgPSAwOworfQorCisvKgorICogQWRkIGEgcm91dGVyLiBCYXNpY2FsbHkgbWFrZSBzdXJlIGl0IGxvb2tzIHZhbGlkIGFuZCBzdHVmZiB0aGUKKyAqIGVudHJ5IGluIHRoZSBsaXN0LiBXaGlsZSBpdCB1c2VzIG5ldHJhbmdlcyB3ZSBhbHdheXMgc2V0IHRoZW0gdG8gb25lCisgKiBlbnRyeSB0byB3b3JrIGxpa2UgbmV0YXRhbGsuCisgKi8KK3N0YXRpYyBpbnQgYXRydHJfY3JlYXRlKHN0cnVjdCBydGVudHJ5ICpyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2aGludCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfYXQgKnRhID0gKHN0cnVjdCBzb2NrYWRkcl9hdCAqKSZyLT5ydF9kc3Q7CisJc3RydWN0IHNvY2thZGRyX2F0ICpnYSA9IChzdHJ1Y3Qgc29ja2FkZHJfYXQgKikmci0+cnRfZ2F0ZXdheTsKKwlzdHJ1Y3QgYXRhbGtfcm91dGUgKnJ0OworCXN0cnVjdCBhdGFsa19pZmFjZSAqaWZhY2UsICpyaWZhY2U7CisJaW50IHJldHZhbCA9IC1FSU5WQUw7CisKKwkvKgorCSAqIEZpeG1lOiBSYWlzZS9Mb3dlciBhIHJvdXRpbmcgY2hhbmdlIHNlbWFwaG9yZSBmb3IgdGhlc2UKKwkgKiBvcGVyYXRpb25zLgorCSAqLworCisJLyogVmFsaWRhdGUgdGhlIHJlcXVlc3QgKi8KKwlpZiAodGEtPnNhdF9mYW1pbHkgIT0gQUZfQVBQTEVUQUxLIHx8CisJICAgICghZGV2aGludCAmJiBnYS0+c2F0X2ZhbWlseSAhPSBBRl9BUFBMRVRBTEspKQorCQlnb3RvIG91dDsKKworCS8qIE5vdyB3YWxrIHRoZSByb3V0aW5nIHRhYmxlIGFuZCBtYWtlIG91ciBkZWNpc2lvbnMgKi8KKwl3cml0ZV9sb2NrX2JoKCZhdGFsa19yb3V0ZXNfbG9jayk7CisJZm9yIChydCA9IGF0YWxrX3JvdXRlczsgcnQ7IHJ0ID0gcnQtPm5leHQpIHsKKwkJaWYgKHItPnJ0X2ZsYWdzICE9IHJ0LT5mbGFncykKKwkJCWNvbnRpbnVlOworCisJCWlmICh0YS0+c2F0X2FkZHIuc19uZXQgPT0gcnQtPnRhcmdldC5zX25ldCkgeworCQkJaWYgKCEocnQtPmZsYWdzICYgUlRGX0hPU1QpKQorCQkJCWJyZWFrOworCQkJaWYgKHRhLT5zYXRfYWRkci5zX25vZGUgPT0gcnQtPnRhcmdldC5zX25vZGUpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWRldmhpbnQpIHsKKwkJcmlmYWNlID0gTlVMTDsKKworCQlyZWFkX2xvY2tfYmgoJmF0YWxrX2ludGVyZmFjZXNfbG9jayk7CisJCWZvciAoaWZhY2UgPSBhdGFsa19pbnRlcmZhY2VzOyBpZmFjZTsgaWZhY2UgPSBpZmFjZS0+bmV4dCkgeworCQkJaWYgKCFyaWZhY2UgJiYKKwkJCSAgICBudG9ocyhnYS0+c2F0X2FkZHIuc19uZXQpID49CisJCQkgICAgCQludG9ocyhpZmFjZS0+bmV0cy5ucl9maXJzdG5ldCkgJiYKKwkJCSAgICBudG9ocyhnYS0+c2F0X2FkZHIuc19uZXQpIDw9CisJCQkgICAgCQludG9ocyhpZmFjZS0+bmV0cy5ucl9sYXN0bmV0KSkKKwkJCQlyaWZhY2UgPSBpZmFjZTsKKworCQkJaWYgKGdhLT5zYXRfYWRkci5zX25ldCA9PSBpZmFjZS0+YWRkcmVzcy5zX25ldCAmJgorCQkJICAgIGdhLT5zYXRfYWRkci5zX25vZGUgPT0gaWZhY2UtPmFkZHJlc3Muc19ub2RlKQorCQkJCXJpZmFjZSA9IGlmYWNlOworCQl9CQkKKwkJcmVhZF91bmxvY2tfYmgoJmF0YWxrX2ludGVyZmFjZXNfbG9jayk7CisKKwkJcmV0dmFsID0gLUVORVRVTlJFQUNIOworCQlpZiAoIXJpZmFjZSkKKwkJCWdvdG8gb3V0X3VubG9jazsKKworCQlkZXZoaW50ID0gcmlmYWNlLT5kZXY7CisJfQorCisJaWYgKCFydCkgeworCQlydCA9IGttYWxsb2Moc2l6ZW9mKCpydCksIEdGUF9BVE9NSUMpOworCisJCXJldHZhbCA9IC1FTk9CVUZTOworCQlpZiAoIXJ0KQorCQkJZ290byBvdXRfdW5sb2NrOworCQltZW1zZXQocnQsIDAsIHNpemVvZigqcnQpKTsKKworCQlydC0+bmV4dCA9IGF0YWxrX3JvdXRlczsKKwkJYXRhbGtfcm91dGVzID0gcnQ7CisJfQorCisJLyogRmlsbCBpbiB0aGUgcm91dGluZyBlbnRyeSAqLworCXJ0LT50YXJnZXQgID0gdGEtPnNhdF9hZGRyOworCXJ0LT5kZXYgICAgID0gZGV2aGludDsKKwlydC0+ZmxhZ3MgICA9IHItPnJ0X2ZsYWdzOworCXJ0LT5nYXRld2F5ID0gZ2EtPnNhdF9hZGRyOworCisJcmV0dmFsID0gMDsKK291dF91bmxvY2s6CisJd3JpdGVfdW5sb2NrX2JoKCZhdGFsa19yb3V0ZXNfbG9jayk7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogRGVsZXRlIGEgcm91dGUuIEZpbmQgaXQgYW5kIGRpc2NhcmQgaXQgKi8KK3N0YXRpYyBpbnQgYXRydHJfZGVsZXRlKHN0cnVjdCBhdGFsa19hZGRyICogYWRkcikKK3sKKwlzdHJ1Y3QgYXRhbGtfcm91dGUgKipyID0gJmF0YWxrX3JvdXRlczsKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3QgYXRhbGtfcm91dGUgKnRtcDsKKworCXdyaXRlX2xvY2tfYmgoJmF0YWxrX3JvdXRlc19sb2NrKTsKKwl3aGlsZSAoKHRtcCA9ICpyKSAhPSBOVUxMKSB7CisJCWlmICh0bXAtPnRhcmdldC5zX25ldCA9PSBhZGRyLT5zX25ldCAmJgorCQkgICAgKCEodG1wLT5mbGFncyZSVEZfR0FURVdBWSkgfHwKKwkJICAgICB0bXAtPnRhcmdldC5zX25vZGUgPT0gYWRkci0+c19ub2RlKSkgeworCQkJKnIgPSB0bXAtPm5leHQ7CisJCQlkZXZfcHV0KHRtcC0+ZGV2KTsKKwkJCWtmcmVlKHRtcCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlyID0gJnRtcC0+bmV4dDsKKwl9CisJcmV0dmFsID0gLUVOT0VOVDsKK291dDoKKwl3cml0ZV91bmxvY2tfYmgoJmF0YWxrX3JvdXRlc19sb2NrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogQ2FsbGVkIHdoZW4gYSBkZXZpY2UgaXMgZG93bmVkLiBKdXN0IHRocm93IGF3YXkgYW55IHJvdXRlcworICogdmlhIGl0LgorICovCitzdGF0aWMgdm9pZCBhdHJ0cl9kZXZpY2VfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdGFsa19yb3V0ZSAqKnIgPSAmYXRhbGtfcm91dGVzOworCXN0cnVjdCBhdGFsa19yb3V0ZSAqdG1wOworCisJd3JpdGVfbG9ja19iaCgmYXRhbGtfcm91dGVzX2xvY2spOworCXdoaWxlICgodG1wID0gKnIpICE9IE5VTEwpIHsKKwkJaWYgKHRtcC0+ZGV2ID09IGRldikgeworCQkJKnIgPSB0bXAtPm5leHQ7CisJCQlkZXZfcHV0KGRldik7CisJCQlrZnJlZSh0bXApOworCQl9IGVsc2UKKwkJCXIgPSAmdG1wLT5uZXh0OworCX0KKwl3cml0ZV91bmxvY2tfYmgoJmF0YWxrX3JvdXRlc19sb2NrKTsKKworCWlmIChhdHJ0cl9kZWZhdWx0LmRldiA9PSBkZXYpCisJCWF0cnRyX3NldF9kZWZhdWx0KE5VTEwpOworfQorCisvKiBBY3R1YWxseSBkb3duIHRoZSBpbnRlcmZhY2UgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGFsa19kZXZfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWF0cnRyX2RldmljZV9kb3duKGRldik7CS8qIFJlbW92ZSBhbGwgcm91dGVzIGZvciB0aGUgZGV2aWNlICovCisJYWFycF9kZXZpY2VfZG93bihkZXYpOwkvKiBSZW1vdmUgQUFSUCBlbnRyaWVzIGZvciB0aGUgZGV2aWNlICovCisJYXRpZl9kcm9wX2RldmljZShkZXYpOwkvKiBSZW1vdmUgdGhlIGRldmljZSAqLworfQorCisvKgorICogQSBkZXZpY2UgZXZlbnQgaGFzIG9jY3VycmVkLiBXYXRjaCBmb3IgZGV2aWNlcyBnb2luZyBkb3duIGFuZAorICogZGVsZXRlIG91ciB1c2Ugb2YgdGhlbSAoaWZhY2UgYW5kIHJvdXRlKS4KKyAqLworc3RhdGljIGludCBkZHBfZGV2aWNlX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBldmVudCwKKwkJCSAgICB2b2lkICpwdHIpCit7CisJaWYgKGV2ZW50ID09IE5FVERFVl9ET1dOKQorCQkvKiBEaXNjYXJkIGFueSB1c2Ugb2YgdGhpcyAqLworCSAgICAgICAgYXRhbGtfZGV2X2Rvd24ocHRyKTsKKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworLyogaW9jdGwgY2FsbHMuIFNob3VsZG4ndCBldmVuIG5lZWQgdG91Y2hpbmcgKi8KKy8qIERldmljZSBjb25maWd1cmF0aW9uIGlvY3RsIGNhbGxzICovCitzdGF0aWMgaW50IGF0aWZfaW9jdGwoaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdGF0aWMgY2hhciBhYXJwX21jYXN0WzZdID0geyAweDA5LCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweEZGIH07CisJc3RydWN0IGlmcmVxIGF0cmVxOworCXN0cnVjdCBhdGFsa19uZXRyYW5nZSAqbnI7CisJc3RydWN0IHNvY2thZGRyX2F0ICpzYTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBhdGFsa19pZmFjZSAqYXRpZjsKKwlpbnQgY3Q7CisJaW50IGxpbWl0OworCXN0cnVjdCBydGVudHJ5IHJ0ZGVmOworCWludCBhZGRfcm91dGU7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmF0cmVxLCBhcmcsIHNpemVvZihhdHJlcSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRldiA9IF9fZGV2X2dldF9ieV9uYW1lKGF0cmVxLmlmcl9uYW1lKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzYSA9IChzdHJ1Y3Qgc29ja2FkZHJfYXQgKikmYXRyZXEuaWZyX2FkZHI7CisJYXRpZiA9IGF0YWxrX2ZpbmRfZGV2KGRldik7CisKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFNJT0NTSUZBRERSOgorCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJCXJldHVybiAtRVBFUk07CisJCQlpZiAoc2EtPnNhdF9mYW1pbHkgIT0gQUZfQVBQTEVUQUxLKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKGRldi0+dHlwZSAhPSBBUlBIUkRfRVRIRVIgJiYKKwkJCSAgICBkZXYtPnR5cGUgIT0gQVJQSFJEX0xPT1BCQUNLICYmCisJCQkgICAgZGV2LT50eXBlICE9IEFSUEhSRF9MT0NBTFRMSyAmJgorCQkJICAgIGRldi0+dHlwZSAhPSBBUlBIUkRfUFBQKQorCQkJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOworCisJCQluciA9IChzdHJ1Y3QgYXRhbGtfbmV0cmFuZ2UgKikmc2EtPnNhdF96ZXJvWzBdOworCQkJYWRkX3JvdXRlID0gMTsKKworCQkJLyoKKwkJCSAqIGlmIHRoaXMgaXMgYSBwb2ludC10by1wb2ludCBpZmFjZSwgYW5kIHdlIGFscmVhZHkKKwkJCSAqIGhhdmUgYW4gaWZhY2UgZm9yIHRoaXMgQXBwbGVUYWxrIGFkZHJlc3MsIHRoZW4gd2UKKwkJCSAqIHNob3VsZCBub3QgYWRkIGEgcm91dGUKKwkJCSAqLworCQkJaWYgKChkZXYtPmZsYWdzICYgSUZGX1BPSU5UT1BPSU5UKSAmJgorCQkJICAgIGF0YWxrX2ZpbmRfaW50ZXJmYWNlKHNhLT5zYXRfYWRkci5zX25ldCwKKwkJCQkgICAgCQkgc2EtPnNhdF9hZGRyLnNfbm9kZSkpIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiQXBwbGVUYWxrOiBwb2ludC10by1wb2ludCAiCisJCQkJCQkgICJpbnRlcmZhY2UgYWRkZWQgd2l0aCAiCisJCQkJCQkgICJleGlzdGluZyBhZGRyZXNzXG4iKTsKKwkJCQlhZGRfcm91dGUgPSAwOworCQkJfQorCQkJCisJCQkvKgorCQkJICogUGhhc2UgMSBpcyBmaW5lIG9uIExvY2FsVGFsayBidXQgd2UgZG9uJ3QgZG8KKwkJCSAqIEV0aGVyVGFsayBwaGFzZSAxLiBBbnlvbmUgd2FudGluZyB0byBhZGQgaXQgZ28gYWhlYWQuCisJCQkgKi8KKwkJCWlmIChkZXYtPnR5cGUgPT0gQVJQSFJEX0VUSEVSICYmIG5yLT5ucl9waGFzZSAhPSAyKQorCQkJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOworCQkJaWYgKHNhLT5zYXRfYWRkci5zX25vZGUgPT0gQVRBRERSX0JDQVNUIHx8CisJCQkgICAgc2EtPnNhdF9hZGRyLnNfbm9kZSA9PSAyNTQpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoYXRpZikgeworCQkJCS8qIEFscmVhZHkgc2V0dGluZyBhZGRyZXNzICovCisJCQkJaWYgKGF0aWYtPnN0YXR1cyAmIEFUSUZfUFJPQkUpCisJCQkJCXJldHVybiAtRUJVU1k7CisKKwkJCQlhdGlmLT5hZGRyZXNzLnNfbmV0ICA9IHNhLT5zYXRfYWRkci5zX25ldDsKKwkJCQlhdGlmLT5hZGRyZXNzLnNfbm9kZSA9IHNhLT5zYXRfYWRkci5zX25vZGU7CisJCQkJYXRydHJfZGV2aWNlX2Rvd24oZGV2KTsJLyogRmx1c2ggb2xkIHJvdXRlcyAqLworCQkJfSBlbHNlIHsKKwkJCQlhdGlmID0gYXRpZl9hZGRfZGV2aWNlKGRldiwgJnNhLT5zYXRfYWRkcik7CisJCQkJaWYgKCFhdGlmKQorCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWF0aWYtPm5ldHMgPSAqbnI7CisKKwkJCS8qCisJCQkgKiBDaGVjayBpZiB0aGUgY2hvc2VuIGFkZHJlc3MgaXMgdXNlZC4gSWYgc28gd2UKKwkJCSAqIGVycm9yIGFuZCBhdGFsa2Qgd2lsbCB0cnkgYW5vdGhlci4KKwkJCSAqLworCisJCQlpZiAoIShkZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLKSAmJgorCQkJICAgICEoZGV2LT5mbGFncyAmIElGRl9QT0lOVE9QT0lOVCkgJiYKKwkJCSAgICBhdGlmX3Byb2JlX2RldmljZShhdGlmKSA8IDApIHsKKwkJCQlhdGlmX2Ryb3BfZGV2aWNlKGRldik7CisJCQkJcmV0dXJuIC1FQUREUklOVVNFOworCQkJfQorCisJCQkvKiBIZXkgaXQgd29ya2VkIC0gYWRkIHRoZSBkaXJlY3Qgcm91dGVzICovCisJCQlzYSA9IChzdHJ1Y3Qgc29ja2FkZHJfYXQgKikmcnRkZWYucnRfZ2F0ZXdheTsKKwkJCXNhLT5zYXRfZmFtaWx5ID0gQUZfQVBQTEVUQUxLOworCQkJc2EtPnNhdF9hZGRyLnNfbmV0ICA9IGF0aWYtPmFkZHJlc3Muc19uZXQ7CisJCQlzYS0+c2F0X2FkZHIuc19ub2RlID0gYXRpZi0+YWRkcmVzcy5zX25vZGU7CisJCQlzYSA9IChzdHJ1Y3Qgc29ja2FkZHJfYXQgKikmcnRkZWYucnRfZHN0OworCQkJcnRkZWYucnRfZmxhZ3MgPSBSVEZfVVA7CisJCQlzYS0+c2F0X2ZhbWlseSA9IEFGX0FQUExFVEFMSzsKKwkJCXNhLT5zYXRfYWRkci5zX25vZGUgPSBBVEFERFJfQU5ZTk9ERTsKKwkJCWlmIChkZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLIHx8CisJCQkgICAgZGV2LT5mbGFncyAmIElGRl9QT0lOVE9QT0lOVCkKKwkJCQlydGRlZi5ydF9mbGFncyB8PSBSVEZfSE9TVDsKKworCQkJLyogUm91dGVybGVzcyBpbml0aWFsIHN0YXRlICovCisJCQlpZiAobnItPm5yX2ZpcnN0bmV0ID09IGh0b25zKDApICYmCisJCQkgICAgbnItPm5yX2xhc3RuZXQgPT0gaHRvbnMoMHhGRkZFKSkgeworCQkJCXNhLT5zYXRfYWRkci5zX25ldCA9IGF0aWYtPmFkZHJlc3Muc19uZXQ7CisJCQkJYXRydHJfY3JlYXRlKCZydGRlZiwgZGV2KTsKKwkJCQlhdHJ0cl9zZXRfZGVmYXVsdChkZXYpOworCQkJfSBlbHNlIHsKKwkJCQlsaW1pdCA9IG50b2hzKG5yLT5ucl9sYXN0bmV0KTsKKwkJCQlpZiAobGltaXQgLSBudG9ocyhuci0+bnJfZmlyc3RuZXQpID4gNDA5NikgeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJUb28gbWFueSByb3V0ZXMvIgorCQkJCQkJCSAgICAiaWZhY2UuXG4iKTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCWlmIChhZGRfcm91dGUpCisJCQkJCWZvciAoY3QgPSBudG9ocyhuci0+bnJfZmlyc3RuZXQpOworCQkJCQkgICAgIGN0IDw9IGxpbWl0OyBjdCsrKSB7CisJCQkJCQlzYS0+c2F0X2FkZHIuc19uZXQgPSBodG9ucyhjdCk7CisJCQkJCQlhdHJ0cl9jcmVhdGUoJnJ0ZGVmLCBkZXYpOworCQkJCQl9CisJCQl9CisJCQlkZXZfbWNfYWRkKGRldiwgYWFycF9tY2FzdCwgNiwgMSk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNJT0NHSUZBRERSOgorCQkJaWYgKCFhdGlmKQorCQkJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKKworCQkJc2EtPnNhdF9mYW1pbHkgPSBBRl9BUFBMRVRBTEs7CisJCQlzYS0+c2F0X2FkZHIgPSBhdGlmLT5hZGRyZXNzOworCQkJYnJlYWs7CisKKwkJY2FzZSBTSU9DR0lGQlJEQUREUjoKKwkJCWlmICghYXRpZikKKwkJCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisKKwkJCXNhLT5zYXRfZmFtaWx5ID0gQUZfQVBQTEVUQUxLOworCQkJc2EtPnNhdF9hZGRyLnNfbmV0ID0gYXRpZi0+YWRkcmVzcy5zX25ldDsKKwkJCXNhLT5zYXRfYWRkci5zX25vZGUgPSBBVEFERFJfQkNBU1Q7CisJCQlicmVhazsKKworCSAgICAgICAgY2FzZSBTSU9DQVRBTEtESUZBRERSOgorCSAgICAgICAgY2FzZSBTSU9DRElGQUREUjoKKwkJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJaWYgKHNhLT5zYXRfZmFtaWx5ICE9IEFGX0FQUExFVEFMSykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWF0YWxrX2Rldl9kb3duKGRldik7CisJCQlicmVhazsJCQkKKworCQljYXNlIFNJT0NTQVJQOgorCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVQRVJNOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNhLT5zYXRfZmFtaWx5ICE9IEFGX0FQUExFVEFMSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF0aWYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUFERFJOT1RBVkFJTDsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGZvciBub3csIHdlIG9ubHkgc3VwcG9ydCBwcm94eSBBQVJQIG9uIEVMQVA7CisgICAgICAgICAgICAgICAgICAgICAgICAgKiB3ZSBzaG91bGQgYmUgYWJsZSB0byBkbyBpdCBmb3IgTG9jYWxUYWxrLCB0b28uCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXYtPnR5cGUgIT0gQVJQSFJEX0VUSEVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGF0aWYgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGludGVyZmFjZSBvbiB0aGlzIG5ldHdvcms7CisgICAgICAgICAgICAgICAgICAgICAgICAgKiB3ZSBhcmVuJ3QgY29uY2VybmVkIGFib3V0IGl0cyBjdXJyZW50IHN0YXR1cyAoYXQKKwkJCSAqIGxlYXN0IGZvciBub3cpLCBidXQgaXQgaGFzIGFsbCB0aGUgc2V0dGluZ3MgYWJvdXQKKwkJCSAqIHRoZSBuZXR3b3JrIHdlJ3JlIGdvaW5nIHRvIHByb2JlLiBDb25zZXF1ZW50bHksIGl0CisJCQkgKiBtdXN0IGV4aXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF0aWYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUFERFJOT1RBVkFJTDsKKworICAgICAgICAgICAgICAgICAgICAgICAgbnIgPSAoc3RydWN0IGF0YWxrX25ldHJhbmdlICopJihhdGlmLT5uZXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBQaGFzZSAxIGlzIGZpbmUgb24gTG9jYWx0YWxrIGJ1dCB3ZSBkb24ndCBkbworICAgICAgICAgICAgICAgICAgICAgICAgICogRXRoZXJ0YWxrIHBoYXNlIDEuIEFueW9uZSB3YW50aW5nIHRvIGFkZCBpdCBnbyBhaGVhZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRldi0+dHlwZSA9PSBBUlBIUkRfRVRIRVIgJiYgbnItPm5yX3BoYXNlICE9IDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRVBST1RPTk9TVVBQT1JUOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2EtPnNhdF9hZGRyLnNfbm9kZSA9PSBBVEFERFJfQkNBU1QgfHwKKwkJCSAgICBzYS0+c2F0X2FkZHIuc19ub2RlID09IDI1NCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBDaGVjayBpZiB0aGUgY2hvc2VuIGFkZHJlc3MgaXMgdXNlZC4gSWYgc28gd2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGVycm9yIGFuZCBBVENQIHdpbGwgdHJ5IGFub3RoZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAJaWYgKGF0aWZfcHJveHlfcHJvYmVfZGV2aWNlKGF0aWYsICYoc2EtPnNhdF9hZGRyKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgIAkJcmV0dXJuIC1FQUREUklOVVNFOworICAgICAgICAgICAgICAgICAgICAgIAkKKwkJCS8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBXZSBub3cgaGF2ZSBhbiBhZGRyZXNzIG9uIHRoZSBsb2NhbCBuZXR3b3JrLCBhbmQKKwkJCSAqIHRoZSBBQVJQIGNvZGUgd2lsbCBkZWZlbmQgaXQgZm9yIHVzIHVudGlsIHdlIHRha2UgaXQKKwkJCSAqIGRvd24uIFdlIGRvbid0IHNldCB1cCBhbnkgcm91dGVzIHJpZ2h0IG5vdywgYmVjYXVzZQorCQkJICogQVRDUCB3aWxsIGluc3RhbGwgdGhlbSBtYW51YWxseSB2aWEgU0lPQ0FERFJULgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU0lPQ0RBUlA6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRVBFUk07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2EtPnNhdF9mYW1pbHkgIT0gQUZfQVBQTEVUQUxLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXRpZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBnaXZlIHRvIGFhcnAgbW9kdWxlIHRvIHJlbW92ZSBwcm94eSBlbnRyeSAqLworICAgICAgICAgICAgICAgICAgICAgICAgYWFycF9wcm94eV9yZW1vdmUoYXRpZi0+ZGV2LCAmKHNhLT5zYXRfYWRkcikpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmcsICZhdHJlcSwgc2l6ZW9mKGF0cmVxKSkgPyAtRUZBVUxUIDogMDsKK30KKworLyogUm91dGluZyBpb2N0bCgpIGNhbGxzICovCitzdGF0aWMgaW50IGF0cnRyX2lvY3RsKHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IHJ0ZW50cnkgcnQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJ0LCBhcmcsIHNpemVvZihydCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgU0lPQ0RFTFJUOgorCQkJaWYgKHJ0LnJ0X2RzdC5zYV9mYW1pbHkgIT0gQUZfQVBQTEVUQUxLKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0dXJuIGF0cnRyX2RlbGV0ZSgmKChzdHJ1Y3Qgc29ja2FkZHJfYXQgKikKKwkJCQkJCSZydC5ydF9kc3QpLT5zYXRfYWRkcik7CisKKwkJY2FzZSBTSU9DQUREUlQ6IHsKKwkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCQkJaWYgKHJ0LnJ0X2RldikgeworCQkJCWNoYXIgbmFtZVtJRk5BTVNJWl07CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKG5hbWUsIHJ0LnJ0X2RldiwgSUZOQU1TSVotMSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCW5hbWVbSUZOQU1TSVotMV0gPSAnXDAnOworCQkJCWRldiA9IF9fZGV2X2dldF9ieV9uYW1lKG5hbWUpOworCQkJCWlmICghZGV2KQorCQkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCX0JCQkKKwkJCXJldHVybiBhdHJ0cl9jcmVhdGUoJnJ0LCBkZXYpOworCQl9CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIEhhbmRsaW5nIGZvciBzeXN0ZW0gY2FsbHMgYXBwbGllZCB2aWEgdGhlIHZhcmlvdXMgaW50ZXJmYWNlcyB0byBhbiAgICAgICAqCisqIEFwcGxlVGFsayBzb2NrZXQgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDaGVja3N1bTogVGhpcyBpcyAnb3B0aW9uYWwnLiBJdCdzIHF1aXRlIGxpa2VseSBhbHNvIGEgZ29vZAorICogY2FuZGlkYXRlIGZvciBhc3NlbWJsZXIgaGFja2VyeSA4KQorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBhdGFsa19zdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCAKKwkJCQkgICAgICAgaW50IGxlbiwgdW5zaWduZWQgbG9uZyBzdW0pCit7CisJLyogVGhpcyBvdWdodCB0byBiZSB1bndyYXBwZWQgbmVhdGx5LiBJJ2xsIHRydXN0IGdjYyBmb3Igbm93ICovCisJd2hpbGUgKGxlbi0tKSB7CisJCXN1bSArPSAqZGF0YTsKKwkJc3VtIDw8PSAxOworCQlpZiAoc3VtICYgMHgxMDAwMCkgeworCQkJc3VtKys7CisJCQlzdW0gJj0gMHhmZmZmOworCQl9CisJCWRhdGErKzsKKwl9CisJcmV0dXJuIHN1bTsKK30KKworLyogIENoZWNrc3VtIHNrYiBkYXRhIC0tICBzaW1pbGFyIHRvIHNrYl9jaGVja3N1bSAgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGF0YWxrX3N1bV9za2IoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCwKKwkJCQkgICBpbnQgbGVuLCB1bnNpZ25lZCBsb25nIHN1bSkKK3sKKwlpbnQgc3RhcnQgPSBza2JfaGVhZGxlbihza2IpOworCWludCBpLCBjb3B5OworCisJLyogY2hlY2tzdW0gc3R1ZmYgaW4gaGVhZGVyIHNwYWNlICovCisJaWYgKCAoY29weSA9IHN0YXJ0IC0gb2Zmc2V0KSA+IDApIHsKKwkJaWYgKGNvcHkgPiBsZW4pCisJCQljb3B5ID0gbGVuOworCQlzdW0gPSBhdGFsa19zdW1fcGFydGlhbChza2ItPmRhdGEgKyBvZmZzZXQsIGNvcHksIHN1bSk7CisJCWlmICggKGxlbiAtPSBjb3B5KSA9PSAwKSAKKwkJCXJldHVybiBzdW07CisKKwkJb2Zmc2V0ICs9IGNvcHk7CisJfQorCisJLyogY2hlY2tzdW0gc3R1ZmYgaW4gZnJhZ3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKSB7CisJCWludCBlbmQ7CisKKwkJQlVHX1RSQVAoc3RhcnQgPD0gb2Zmc2V0ICsgbGVuKTsKKworCQllbmQgPSBzdGFydCArIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZTsKKwkJaWYgKChjb3B5ID0gZW5kIC0gb2Zmc2V0KSA+IDApIHsKKwkJCXU4ICp2YWRkcjsKKwkJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKKworCQkJaWYgKGNvcHkgPiBsZW4pCisJCQkJY29weSA9IGxlbjsKKwkJCXZhZGRyID0ga21hcF9za2JfZnJhZyhmcmFnKTsKKwkJCXN1bSA9IGF0YWxrX3N1bV9wYXJ0aWFsKHZhZGRyICsgZnJhZy0+cGFnZV9vZmZzZXQgKworCQkJCQkJICBvZmZzZXQgLSBzdGFydCwgY29weSwgc3VtKTsKKwkJCWt1bm1hcF9za2JfZnJhZyh2YWRkcik7CisKKwkJCWlmICghKGxlbiAtPSBjb3B5KSkKKwkJCQlyZXR1cm4gc3VtOworCQkJb2Zmc2V0ICs9IGNvcHk7CisJCX0KKwkJc3RhcnQgPSBlbmQ7CisJfQorCisJaWYgKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0KSB7CisJCXN0cnVjdCBza19idWZmICpsaXN0ID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3Q7CisKKwkJZm9yICg7IGxpc3Q7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCQlpbnQgZW5kOworCisJCQlCVUdfVFJBUChzdGFydCA8PSBvZmZzZXQgKyBsZW4pOworCisJCQllbmQgPSBzdGFydCArIGxpc3QtPmxlbjsKKwkJCWlmICgoY29weSA9IGVuZCAtIG9mZnNldCkgPiAwKSB7CisJCQkJaWYgKGNvcHkgPiBsZW4pCisJCQkJCWNvcHkgPSBsZW47CisJCQkJc3VtID0gYXRhbGtfc3VtX3NrYihsaXN0LCBvZmZzZXQgLSBzdGFydCwKKwkJCQkJCSAgICBjb3B5LCBzdW0pOworCQkJCWlmICgobGVuIC09IGNvcHkpID09IDApCisJCQkJCXJldHVybiBzdW07CisJCQkJb2Zmc2V0ICs9IGNvcHk7CisJCQl9CisJCQlzdGFydCA9IGVuZDsKKwkJfQorCX0KKworCUJVR19PTihsZW4gPiAwKTsKKworCXJldHVybiBzdW07Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBhdGFsa19jaGVja3N1bShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgc3VtOworCisJLyogc2tpcCBoZWFkZXIgNCBieXRlcyAqLworCXN1bSA9IGF0YWxrX3N1bV9za2Ioc2tiLCA0LCBsZW4tNCwgMCk7CisKKwkvKiBVc2UgMHhGRkZGIGZvciAwLiAwIGl0c2VsZiBtZWFucyBub25lICovCisJcmV0dXJuIHN1bSA/IGh0b25zKCh1bnNpZ25lZCBzaG9ydClzdW0pIDogMHhGRkZGOworfQorCitzdGF0aWMgc3RydWN0IHByb3RvIGRkcF9wcm90byA9IHsKKwkubmFtZQkgID0gIkREUCIsCisJLm93bmVyCSAgPSBUSElTX01PRFVMRSwKKwkub2JqX3NpemUgPSBzaXplb2Yoc3RydWN0IGF0YWxrX3NvY2spLAorfTsKKworLyoKKyAqIENyZWF0ZSBhIHNvY2tldC4gSW5pdGlhbGlzZSB0aGUgc29ja2V0LCBibGFuayB0aGUgYWRkcmVzc2VzCisgKiBzZXQgdGhlIHN0YXRlLgorICovCitzdGF0aWMgaW50IGF0YWxrX2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgcHJvdG9jb2wpCit7CisJc3RydWN0IHNvY2sgKnNrOworCWludCByYyA9IC1FU09DS1ROT1NVUFBPUlQ7CisKKwkvKgorCSAqIFdlIHBlcm1pdCBTT0NLX0RHUkFNIGFuZCBSQVcgaXMgYW4gZXh0ZW5zaW9uLiBJdCBpcyB0cml2aWFsIHRvIGRvCisJICogYW5kIGdpdmVzIHlvdSB0aGUgZnVsbCBFTEFQIGZyYW1lLiBTaG91bGQgYmUgaGFuZHkgZm9yIENBUCA4KSAKKwkgKi8KKwlpZiAoc29jay0+dHlwZSAhPSBTT0NLX1JBVyAmJiBzb2NrLT50eXBlICE9IFNPQ0tfREdSQU0pCisJCWdvdG8gb3V0OworCXJjID0gLUVOT01FTTsKKwlzayA9IHNrX2FsbG9jKFBGX0FQUExFVEFMSywgR0ZQX0tFUk5FTCwgJmRkcF9wcm90bywgMSk7CisJaWYgKCFzaykKKwkJZ290byBvdXQ7CisJcmMgPSAwOworCXNvY2stPm9wcyA9ICZhdGFsa19kZ3JhbV9vcHM7CisJc29ja19pbml0X2RhdGEoc29jaywgc2spOworCisJLyogQ2hlY2tzdW1zIG9uIGJ5IGRlZmF1bHQgKi8KKwlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX1pBUFBFRCk7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCisvKiBGcmVlIGEgc29ja2V0LiBObyB3b3JrIG5lZWRlZCAqLworc3RhdGljIGludCBhdGFsa19yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisKKwlpZiAoc2spIHsKKwkJc29ja19vcnBoYW4oc2spOworCQlzb2NrLT5zayA9IE5VTEw7CisJCWF0YWxrX2Rlc3Ryb3lfc29ja2V0KHNrKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYXRhbGtfcGlja19hbmRfYmluZF9wb3J0IC0gUGljayBhIHNvdXJjZSBwb3J0IHdoZW4gb25lIGlzIG5vdCBnaXZlbgorICogQHNrIC0gc29ja2V0IHRvIGluc2VydCBpbnRvIHRoZSB0YWJsZXMKKyAqIEBzYXQgLSBhZGRyZXNzIHRvIHNlYXJjaCBmb3IKKyAqCisgKiBQaWNrIGEgc291cmNlIHBvcnQgd2hlbiBvbmUgaXMgbm90IGdpdmVuLiBJZiB3ZSBjYW4gZmluZCBhIHN1aXRhYmxlIGZyZWUKKyAqIG9uZSwgd2UgaW5zZXJ0IHRoZSBzb2NrZXQgaW50byB0aGUgdGFibGVzIHVzaW5nIGl0LgorICoKKyAqIFRoaXMgd2hvbGUgb3BlcmF0aW9uIG11c3QgYmUgYXRvbWljLgorICovCitzdGF0aWMgaW50IGF0YWxrX3BpY2tfYW5kX2JpbmRfcG9ydChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrYWRkcl9hdCAqc2F0KQoreworCWludCByZXR2YWw7CisKKwl3cml0ZV9sb2NrX2JoKCZhdGFsa19zb2NrZXRzX2xvY2spOworCisJZm9yIChzYXQtPnNhdF9wb3J0ID0gQVRQT1JUX1JFU0VSVkVEOworCSAgICAgc2F0LT5zYXRfcG9ydCA8IEFUUE9SVF9MQVNUOworCSAgICAgc2F0LT5zYXRfcG9ydCsrKSB7CisJCXN0cnVjdCBzb2NrICpzOworCQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCQlza19mb3JfZWFjaChzLCBub2RlLCAmYXRhbGtfc29ja2V0cykgeworCQkJc3RydWN0IGF0YWxrX3NvY2sgKmF0ID0gYXRfc2socyk7CisKKwkJCWlmIChhdC0+c3JjX25ldCA9PSBzYXQtPnNhdF9hZGRyLnNfbmV0ICYmCisJCQkgICAgYXQtPnNyY19ub2RlID09IHNhdC0+c2F0X2FkZHIuc19ub2RlICYmCisJCQkgICAgYXQtPnNyY19wb3J0ID09IHNhdC0+c2F0X3BvcnQpCisJCQkJZ290byB0cnlfbmV4dF9wb3J0OworCQl9CisKKwkJLyogV2hlZWUsIGl0J3MgZnJlZSwgYXNzaWduIGFuZCBpbnNlcnQuICovCisJCV9fYXRhbGtfaW5zZXJ0X3NvY2tldChzayk7CisJCWF0X3NrKHNrKS0+c3JjX3BvcnQgPSBzYXQtPnNhdF9wb3J0OworCQlyZXR2YWwgPSAwOworCQlnb3RvIG91dDsKKwordHJ5X25leHRfcG9ydDo7CisJfQorCisJcmV0dmFsID0gLUVCVVNZOworb3V0OgorCXdyaXRlX3VubG9ja19iaCgmYXRhbGtfc29ja2V0c19sb2NrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGF0YWxrX2F1dG9iaW5kKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgYXRhbGtfc29jayAqYXQgPSBhdF9zayhzayk7CisJc3RydWN0IHNvY2thZGRyX2F0IHNhdDsKKwlzdHJ1Y3QgYXRhbGtfYWRkciAqYXAgPSBhdGFsa19maW5kX3ByaW1hcnkoKTsKKwlpbnQgbiA9IC1FQUREUk5PVEFWQUlMOworCisJaWYgKCFhcCB8fCBhcC0+c19uZXQgPT0gaHRvbnMoQVRBRERSX0FOWU5FVCkpCisJCWdvdG8gb3V0OworCisJYXQtPnNyY19uZXQgID0gc2F0LnNhdF9hZGRyLnNfbmV0ICA9IGFwLT5zX25ldDsKKwlhdC0+c3JjX25vZGUgPSBzYXQuc2F0X2FkZHIuc19ub2RlID0gYXAtPnNfbm9kZTsKKworCW4gPSBhdGFsa19waWNrX2FuZF9iaW5kX3BvcnQoc2ssICZzYXQpOworCWlmICghbikKKwkJc29ja19yZXNldF9mbGFnKHNrLCBTT0NLX1pBUFBFRCk7CitvdXQ6CisJcmV0dXJuIG47Cit9CisKKy8qIFNldCB0aGUgYWRkcmVzcyAnb3VyIGVuZCcgb2YgdGhlIGNvbm5lY3Rpb24gKi8KK3N0YXRpYyBpbnQgYXRhbGtfYmluZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLCBpbnQgYWRkcl9sZW4pCit7CisJc3RydWN0IHNvY2thZGRyX2F0ICphZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9hdCAqKXVhZGRyOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBhdGFsa19zb2NrICphdCA9IGF0X3NrKHNrKTsKKworCWlmICghc29ja19mbGFnKHNrLCBTT0NLX1pBUFBFRCkgfHwKKwkgICAgYWRkcl9sZW4gIT0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9hdCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGFkZHItPnNhdF9mYW1pbHkgIT0gQUZfQVBQTEVUQUxLKQorCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKKworCWlmIChhZGRyLT5zYXRfYWRkci5zX25ldCA9PSBodG9ucyhBVEFERFJfQU5ZTkVUKSkgeworCQlzdHJ1Y3QgYXRhbGtfYWRkciAqYXAgPSBhdGFsa19maW5kX3ByaW1hcnkoKTsKKworCQlpZiAoIWFwKQorCQkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCisJCWF0LT5zcmNfbmV0ICA9IGFkZHItPnNhdF9hZGRyLnNfbmV0ID0gYXAtPnNfbmV0OworCQlhdC0+c3JjX25vZGUgPSBhZGRyLT5zYXRfYWRkci5zX25vZGU9IGFwLT5zX25vZGU7CisJfSBlbHNlIHsKKwkJaWYgKCFhdGFsa19maW5kX2ludGVyZmFjZShhZGRyLT5zYXRfYWRkci5zX25ldCwKKwkJCQkJICBhZGRyLT5zYXRfYWRkci5zX25vZGUpKQorCQkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCisJCWF0LT5zcmNfbmV0ICA9IGFkZHItPnNhdF9hZGRyLnNfbmV0OworCQlhdC0+c3JjX25vZGUgPSBhZGRyLT5zYXRfYWRkci5zX25vZGU7CisJfQorCisJaWYgKGFkZHItPnNhdF9wb3J0ID09IEFUQUREUl9BTllQT1JUKSB7CisJCWludCBuID0gYXRhbGtfcGlja19hbmRfYmluZF9wb3J0KHNrLCBhZGRyKTsKKworCQlpZiAobiA8IDApCisJCQlyZXR1cm4gbjsKKwl9IGVsc2UgeworCQlhdC0+c3JjX3BvcnQgPSBhZGRyLT5zYXRfcG9ydDsKKworCQlpZiAoYXRhbGtfZmluZF9vcl9pbnNlcnRfc29ja2V0KHNrLCBhZGRyKSkKKwkJCXJldHVybiAtRUFERFJJTlVTRTsKKwl9CisKKwlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKwlyZXR1cm4gMDsKK30KKworLyogU2V0IHRoZSBhZGRyZXNzIHdlIHRhbGsgdG8gKi8KK3N0YXRpYyBpbnQgYXRhbGtfY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLAorCQkJIGludCBhZGRyX2xlbiwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBhdGFsa19zb2NrICphdCA9IGF0X3NrKHNrKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfYXQgKmFkZHI7CisKKwlzay0+c2tfc3RhdGUgICA9IFRDUF9DTE9TRTsKKwlzb2NrLT5zdGF0ZSA9IFNTX1VOQ09OTkVDVEVEOworCisJaWYgKGFkZHJfbGVuICE9IHNpemVvZigqYWRkcikpCisJCXJldHVybiAtRUlOVkFMOworCisJYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfYXQgKil1YWRkcjsKKworCWlmIChhZGRyLT5zYXRfZmFtaWx5ICE9IEFGX0FQUExFVEFMSykKKwkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisKKwlpZiAoYWRkci0+c2F0X2FkZHIuc19ub2RlID09IEFUQUREUl9CQ0FTVCAmJgorCSAgICAhc29ja19mbGFnKHNrLCBTT0NLX0JST0FEQ0FTVCkpIHsKKyNpZiAxCQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyBpcyBicm9rZW4gYW5kIGRpZCBub3Qgc2V0ICIKKwkJCQkgICAgIlNPX0JST0FEQ0FTVC4gSXQgd2lsbCBicmVhayB3aGVuIDIuMiBpcyAiCisJCQkJICAgICJyZWxlYXNlZC5cbiIsCisJCQljdXJyZW50LT5jb21tKTsKKyNlbHNlCisJCXJldHVybiAtRUFDQ0VTOworI2VuZGlmCQkJCisJfQorCisJaWYgKHNvY2tfZmxhZyhzaywgU09DS19aQVBQRUQpKQorCQlpZiAoYXRhbGtfYXV0b2JpbmQoc2spIDwgMCkKKwkJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoIWF0cnRyX2dldF9kZXYoJmFkZHItPnNhdF9hZGRyKSkKKwkJcmV0dXJuIC1FTkVUVU5SRUFDSDsKKworCWF0LT5kZXN0X3BvcnQgPSBhZGRyLT5zYXRfcG9ydDsKKwlhdC0+ZGVzdF9uZXQgID0gYWRkci0+c2F0X2FkZHIuc19uZXQ7CisJYXQtPmRlc3Rfbm9kZSA9IGFkZHItPnNhdF9hZGRyLnNfbm9kZTsKKworCXNvY2stPnN0YXRlICA9IFNTX0NPTk5FQ1RFRDsKKwlzay0+c2tfc3RhdGUgPSBUQ1BfRVNUQUJMSVNIRUQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBuYW1lIG9mIGFuIEFwcGxlVGFsayBzb2NrZXQuIEp1c3QgY29weSB0aGUgcmlnaHQKKyAqIGZpZWxkcyBpbnRvIHRoZSBzb2NrYWRkci4KKyAqLworc3RhdGljIGludCBhdGFsa19nZXRuYW1lKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsCisJCQkgaW50ICp1YWRkcl9sZW4sIGludCBwZWVyKQoreworCXN0cnVjdCBzb2NrYWRkcl9hdCBzYXQ7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGF0YWxrX3NvY2sgKmF0ID0gYXRfc2soc2spOworCisJaWYgKHNvY2tfZmxhZyhzaywgU09DS19aQVBQRUQpKQorCQlpZiAoYXRhbGtfYXV0b2JpbmQoc2spIDwgMCkKKwkJCXJldHVybiAtRU5PQlVGUzsKKworCSp1YWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2F0KTsKKworCWlmIChwZWVyKSB7CisJCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKQorCQkJcmV0dXJuIC1FTk9UQ09OTjsKKworCQlzYXQuc2F0X2FkZHIuc19uZXQgID0gYXQtPmRlc3RfbmV0OworCQlzYXQuc2F0X2FkZHIuc19ub2RlID0gYXQtPmRlc3Rfbm9kZTsKKwkJc2F0LnNhdF9wb3J0CSAgICA9IGF0LT5kZXN0X3BvcnQ7CisJfSBlbHNlIHsKKwkJc2F0LnNhdF9hZGRyLnNfbmV0ICA9IGF0LT5zcmNfbmV0OworCQlzYXQuc2F0X2FkZHIuc19ub2RlID0gYXQtPnNyY19ub2RlOworCQlzYXQuc2F0X3BvcnQJICAgID0gYXQtPnNyY19wb3J0OworCX0KKworCXNhdC5zYXRfZmFtaWx5ID0gQUZfQVBQTEVUQUxLOworCW1lbWNweSh1YWRkciwgJnNhdCwgc2l6ZW9mKHNhdCkpOworCXJldHVybiAwOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfSVBERFApIHx8IGRlZmluZWQoQ09ORklHX0lQRERQX01PRFVMRSkKK3N0YXRpYyBfX2lubGluZV9fIGludCBpc19pcF9vdmVyX2RkcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworICAgICAgICByZXR1cm4gc2tiLT5kYXRhWzEyXSA9PSAyMjsKK30KKworc3RhdGljIGludCBoYW5kbGVfaXBfb3Zlcl9kZHAoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IF9fZGV2X2dldF9ieV9uYW1lKCJpcGRkcDAiKTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHM7CisKKwkvKiBUaGlzIG5lZWRzIHRvIGJlIGFibGUgdG8gaGFuZGxlIGlwZGRwIk4iIGRldmljZXMgKi8KKyAgICAgICAgaWYgKCFkZXYpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisKKyAgICAgICAgc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKyAgICAgICAgc2tiX3B1bGwoc2tiLCAxMyk7CisgICAgICAgIHNrYi0+ZGV2ICAgPSBkZXY7CisgICAgICAgIHNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisKKwlzdGF0cyA9IGRldi0+cHJpdjsKKyAgICAgICAgc3RhdHMtPnJ4X3BhY2tldHMrKzsKKyAgICAgICAgc3RhdHMtPnJ4X2J5dGVzICs9IHNrYi0+bGVuICsgMTM7CisgICAgICAgIG5ldGlmX3J4KHNrYik7ICAvKiBTZW5kIHRoZSBTS0IgdXAgdG8gYSBoaWdoZXIgcGxhY2UuICovCisJcmV0dXJuIDA7Cit9CisjZWxzZQorLyogbWFrZSBpdCBlYXN5IGZvciBnY2MgdG8gb3B0aW1pemUgdGhpcyB0ZXN0IG91dCwgaS5lLiBraWxsIHRoZSBjb2RlICovCisjZGVmaW5lIGlzX2lwX292ZXJfZGRwKHNrYikgMAorI2RlZmluZSBoYW5kbGVfaXBfb3Zlcl9kZHAoc2tiKSAwCisjZW5kaWYKKworc3RhdGljIHZvaWQgYXRhbGtfcm91dGVfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGRkcGVoZHIgKmRkcCwgc3RydWN0IGRkcGViaXRzICpkZHBodiwKKwkJCSAgICAgICBpbnQgb3JpZ2xlbikKK3sKKwlzdHJ1Y3QgYXRhbGtfcm91dGUgKnJ0OworCXN0cnVjdCBhdGFsa19hZGRyIHRhOworCisJLyoKKwkgKiBEb24ndCByb3V0ZSBtdWx0aWNhc3QsIGV0Yy4sIHBhY2tldHMsIG9yIHBhY2tldHMgc2VudCB0byAidGhpcworCSAqIG5ldHdvcmsiIAorCSAqLworCWlmIChza2ItPnBrdF90eXBlICE9IFBBQ0tFVF9IT1NUIHx8ICFkZHAtPmRlaF9kbmV0KSB7CisJCS8qCisJCSAqIEZJWE1FOgorCQkgKgorCQkgKiBDYW4gaXQgZXZlciBoYXBwZW4gdGhhdCBhIHBhY2tldCBpcyBmcm9tIGEgUFBQIGlmYWNlIGFuZAorCQkgKiBuZWVkcyB0byBiZSBicm9hZGNhc3Qgb250byB0aGUgZGVmYXVsdCBuZXR3b3JrPworCQkgKi8KKwkJaWYgKGRldi0+dHlwZSA9PSBBUlBIUkRfUFBQKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIkFwcGxlVGFsazogZGlkbid0IGZvcndhcmQgYnJvYWRjYXN0ICIKKwkJCQkJICAicGFja2V0IHJlY2VpdmVkIGZyb20gUFBQIGlmYWNlXG4iKTsKKwkJZ290byBmcmVlX2l0OworCX0KKworCXRhLnNfbmV0ICA9IGRkcC0+ZGVoX2RuZXQ7CisJdGEuc19ub2RlID0gZGRwLT5kZWhfZG5vZGU7CisKKwkvKiBSb3V0ZSB0aGUgcGFja2V0ICovCisJcnQgPSBhdHJ0cl9maW5kKCZ0YSk7CisJaWYgKCFydCB8fCBkZHBodi0+ZGVoX2hvcHMgPT0gRERQX01BWEhPUFMpCisJCWdvdG8gZnJlZV9pdDsKKwkvKiBGSVhNRTogdXNlIHNrYi0+Y2IgdG8gYmUgYWJsZSB0byB1c2Ugc2hhcmVkIHNrYnMgKi8KKwlkZHBodi0+ZGVoX2hvcHMrKzsKKworCS8qCisJICogUm91dGUgZ29lcyB0aHJvdWdoIGFub3RoZXIgZ2F0ZXdheSwgc28gc2V0IHRoZSB0YXJnZXQgdG8gdGhlCisJICogZ2F0ZXdheSBpbnN0ZWFkLgorCSAqLworCisJaWYgKHJ0LT5mbGFncyAmIFJURl9HQVRFV0FZKSB7CisJCXRhLnNfbmV0ICA9IHJ0LT5nYXRld2F5LnNfbmV0OworCQl0YS5zX25vZGUgPSBydC0+Z2F0ZXdheS5zX25vZGU7CisJfQorCisgICAgICAgIC8qIEZpeCB1cCBza2ItPmxlbiBmaWVsZCAqLworICAgICAgICBza2JfdHJpbShza2IsIG1pbl90KHVuc2lnbmVkIGludCwgb3JpZ2xlbiwKKwkJCSAgICAocnQtPmRldi0+aGFyZF9oZWFkZXJfbGVuICsKKwkJCSAgICAgZGRwX2RsLT5oZWFkZXJfbGVuZ3RoICsgZGRwaHYtPmRlaF9sZW4pKSk7CisKKwkvKiBNZW5kIHRoZSBieXRlIG9yZGVyICovCisJLyogRklYTUU6IHVzZSBza2ItPmNiIHRvIGJlIGFibGUgdG8gdXNlIHNoYXJlZCBza2JzICovCisJKigoX191MTYgKilkZHApID0gbnRvaHMoKigoX191MTYgKilkZHBodikpOworCisJLyoKKwkgKiBTZW5kIHRoZSBidWZmZXIgb253YXJkcworCSAqCisJICogTm93IHdlIG11c3QgYWx3YXlzIGJlIGNhcmVmdWwuIElmIGl0J3MgY29tZSBmcm9tIExvY2FsVGFsayB0bworCSAqIEV0aGVyVGFsayBpdCBtaWdodCBub3QgZml0CisJICoKKwkgKiBPcmRlciBtYXR0ZXJzIGhlcmU6IElmIGEgcGFja2V0IGhhcyB0byBiZSBjb3BpZWQgdG8gbWFrZSBhIG5ldworCSAqIGhlYWRyb29tIChyYXJlIGhvcGVmdWxseSkgdGhlbiBpdCB3b24ndCBuZWVkIHVuc2hhcmluZy4KKwkgKgorCSAqIE5vdGUuIGRkcC0+IGJlY29tZXMgaW52YWxpZCBhdCB0aGUgcmVhbGxvYy4KKwkgKi8KKwlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCAyMikgeworCQkvKiAyMiBieXRlcyAtIDEyIGV0aGVyLCAyIGxlbiwgMyA4MDIuMiA1IHNuYXAgKi8KKwkJc3RydWN0IHNrX2J1ZmYgKm5za2IgPSBza2JfcmVhbGxvY19oZWFkcm9vbShza2IsIDMyKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWlmICghbnNrYikgCisJCQlnb3RvIG91dDsKKwkJc2tiID0gbnNrYjsKKwl9IGVsc2UKKwkJc2tiID0gc2tiX3Vuc2hhcmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkKKwkvKgorCSAqIElmIHRoZSBidWZmZXIgZGlkbid0IHZhbmlzaCBpbnRvIHRoZSBsYWNrIG9mIHNwYWNlIGJpdGJ1Y2tldCB3ZSBjYW4KKwkgKiBzZW5kIGl0LgorCSAqLworCWlmIChza2IgJiYgYWFycF9zZW5kX2RkcChydC0+ZGV2LCBza2IsICZ0YSwgTlVMTCkgPT0gLTEpCisJCWdvdG8gZnJlZV9pdDsKK291dDoKKwlyZXR1cm47CitmcmVlX2l0OgorCWtmcmVlX3NrYihza2IpOworfQorCisvKioKKyAqCWF0YWxrX3JjdiAtIFJlY2VpdmUgYSBwYWNrZXQgKGluIHNrYikgZnJvbSBkZXZpY2UgZGV2CisgKglAc2tiIC0gcGFja2V0IHJlY2VpdmVkCisgKglAZGV2IC0gbmV0d29yayBkZXZpY2Ugd2hlcmUgdGhlIHBhY2tldCBjb21lcyBmcm9tCisgKglAcHQgLSBwYWNrZXQgdHlwZQorICoKKyAqCVJlY2VpdmUgYSBwYWNrZXQgKGluIHNrYikgZnJvbSBkZXZpY2UgZGV2LiBUaGlzIGhhcyBjb21lIGZyb20gdGhlIFNOQVAKKyAqCWRlY29kZXIsIGFuZCBvbiBlbnRyeSBza2ItPmgucmF3IGlzIHRoZSBERFAgaGVhZGVyLCBza2ItPmxlbiBpcyB0aGUgRERQCisgKgloZWFkZXIsIHNrYi0+bGVuIGlzIHRoZSBERFAgbGVuZ3RoLiBUaGUgcGh5c2ljYWwgaGVhZGVycyBoYXZlIGJlZW4KKyAqCWV4dHJhY3RlZC4gUFBQIHNob3VsZCBwcm9iYWJseSBwYXNzIGZyYW1lcyBtYXJrZWQgYXMgZm9yIHRoaXMgbGF5ZXIuCisgKglbaWUgQVJQSFJEX0VUSEVSVEFMS10KKyAqLworc3RhdGljIGludCBhdGFsa19yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0KQoreworCXN0cnVjdCBkZHBlaGRyICpkZHA7CisJc3RydWN0IHNvY2sgKnNvY2s7CisJc3RydWN0IGF0YWxrX2lmYWNlICphdGlmOworCXN0cnVjdCBzb2NrYWRkcl9hdCB0b3NhdDsKKyAgICAgICAgaW50IG9yaWdsZW47CisgICAgICAgIHN0cnVjdCBkZHBlYml0cyBkZHBodjsKKworCS8qIERvbid0IG1hbmdsZSBidWZmZXIgaWYgc2hhcmVkICovCisJaWYgKCEoc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQykpKSAKKwkJZ290byBvdXQ7CisJCQorCS8qIFNpemUgY2hlY2sgYW5kIG1ha2Ugc3VyZSBoZWFkZXIgaXMgY29udGlndW91cyAqLworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZigqZGRwKSkpCisJCWdvdG8gZnJlZWl0OworCisJZGRwID0gZGRwX2hkcihza2IpOworCisJLyoKKwkgKglGaXggdXAgdGhlIGxlbmd0aCBmaWVsZAlbT2sgdGhpcyBpcyBob3JyaWJsZSBidXQgb3RoZXJ3aXNlCisJICoJSSBlbmQgdXAgd2l0aCB1bmlvbnMgb2YgYml0IGZpZWxkcyBhbmQgbWVzc3kgYml0IGZpZWxkIG9yZGVyCisJICoJY29tcGlsZXIvZW5kaWFuIGRlcGVuZGVuY2llcy4uXQorCSAqLworCSooKF9fdTE2ICopJmRkcGh2KSA9IG50b2hzKCooKF9fdTE2ICopZGRwKSk7CisKKwkvKiBUcmltIGJ1ZmZlciBpbiBjYXNlIG9mIHN0cmF5IHRyYWlsaW5nIGRhdGEgKi8KKwlvcmlnbGVuID0gc2tiLT5sZW47CisJc2tiX3RyaW0oc2tiLCBtaW5fdCh1bnNpZ25lZCBpbnQsIHNrYi0+bGVuLCBkZHBodi5kZWhfbGVuKSk7CisKKwkvKgorCSAqIFNpemUgY2hlY2sgdG8gc2VlIGlmIGRkcC0+ZGVoX2xlbiB3YXMgY3JhcAorCSAqIChPdGhlcndpc2Ugd2UnbGwgZGV0b25hdGUgbW9zdCBzcGVjdGFjdWxhcmx5CisJICogaW4gdGhlIG1pZGRsZSBvZiByZWN2bXNnKCkpLgorCSAqLworCWlmIChza2ItPmxlbiA8IHNpemVvZigqZGRwKSkKKwkJZ290byBmcmVlaXQ7CisKKwkvKgorCSAqIEFueSBjaGVja3N1bXMuIE5vdGUgd2UgZG9uJ3QgZG8gaHRvbnMoKSBvbiB0aGlzID09IGlzIGFzc3VtZWQgdG8gYmUKKwkgKiB2YWxpZCBmb3IgbmV0IGJ5dGUgb3JkZXJzIGFsbCBvdmVyIHRoZSBuZXR3b3JraW5nIGNvZGUuLi4KKwkgKi8KKwlpZiAoZGRwLT5kZWhfc3VtICYmCisJICAgIGF0YWxrX2NoZWNrc3VtKHNrYiwgZGRwaHYuZGVoX2xlbikgIT0gZGRwLT5kZWhfc3VtKQorCQkvKiBOb3QgYSB2YWxpZCBBcHBsZVRhbGsgZnJhbWUgLSBkdXN0YmluIHRpbWUgKi8KKwkJZ290byBmcmVlaXQ7CisKKwkvKiBDaGVjayB0aGUgcGFja2V0IGlzIGFpbWVkIGF0IHVzICovCisJaWYgKCFkZHAtPmRlaF9kbmV0KQkvKiBOZXQgMCBpcyAndGhpcyBuZXR3b3JrJyAqLworCQlhdGlmID0gYXRhbGtfZmluZF9hbnluZXQoZGRwLT5kZWhfZG5vZGUsIGRldik7CisJZWxzZQorCQlhdGlmID0gYXRhbGtfZmluZF9pbnRlcmZhY2UoZGRwLT5kZWhfZG5ldCwgZGRwLT5kZWhfZG5vZGUpOworCisJLyogTm90IG91cnMsIHNvIHdlIHJvdXRlIHRoZSBwYWNrZXQgdmlhIHRoZSBjb3JyZWN0IEFwcGxlVGFsayBpZmFjZSAqLworCWlmICghYXRpZikgeworCQlhdGFsa19yb3V0ZV9wYWNrZXQoc2tiLCBkZXYsIGRkcCwgJmRkcGh2LCBvcmlnbGVuKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogaWYgSVAgb3ZlciBERFAgaXMgbm90IHNlbGVjdGVkIHRoaXMgY29kZSB3aWxsIGJlIG9wdGltaXplZCBvdXQgKi8KKwlpZiAoaXNfaXBfb3Zlcl9kZHAoc2tiKSkKKwkJcmV0dXJuIGhhbmRsZV9pcF9vdmVyX2RkcChza2IpOworCS8qCisJICogV2hpY2ggc29ja2V0IC0gYXRhbGtfc2VhcmNoX3NvY2tldCgpIGxvb2tzIGZvciBhICpmdWxsIG1hdGNoKgorCSAqIG9mIHRoZSA8bmV0LCBub2RlLCBwb3J0PiB0dXBsZS4KKwkgKi8KKwl0b3NhdC5zYXRfYWRkci5zX25ldCAgPSBkZHAtPmRlaF9kbmV0OworCXRvc2F0LnNhdF9hZGRyLnNfbm9kZSA9IGRkcC0+ZGVoX2Rub2RlOworCXRvc2F0LnNhdF9wb3J0CSAgICAgID0gZGRwLT5kZWhfZHBvcnQ7CisKKwlzb2NrID0gYXRhbGtfc2VhcmNoX3NvY2tldCgmdG9zYXQsIGF0aWYpOworCWlmICghc29jaykgLyogQnV0IG5vdCBvbmUgb2Ygb3VyIHNvY2tldHMgKi8KKwkJZ290byBmcmVlaXQ7CisKKwkvKiBRdWV1ZSBwYWNrZXQgKHN0YW5kYXJkKSAqLworCXNrYi0+c2sgPSBzb2NrOworCisJaWYgKHNvY2tfcXVldWVfcmN2X3NrYihzb2NrLCBza2IpIDwgMCkKKwkJZ290byBmcmVlaXQ7CitvdXQ6CisJcmV0dXJuIDA7CitmcmVlaXQ6CisJa2ZyZWVfc2tiKHNrYik7CisJZ290byBvdXQ7Cit9CisKKy8qCisgKiBSZWNlaXZlIGEgTG9jYWxUYWxrIGZyYW1lLiBXZSBtYWtlIHNvbWUgZGVtYW5kcyBvbiB0aGUgY2FsbGVyIGhlcmUuCisgKiBDYWxsZXIgbXVzdCBwcm92aWRlIGVub3VnaCBoZWFkcm9vbSBvbiB0aGUgcGFja2V0IHRvIHB1bGwgdGhlIHNob3J0CisgKiBoZWFkZXIgYW5kIGFwcGVuZCBhIGxvbmcgb25lLgorICovCitzdGF0aWMgaW50IGx0YWxrX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IHBhY2tldF90eXBlICpwdCkKK3sKKwkvKiBFeHBhbmQgYW55IHNob3J0IGZvcm0gZnJhbWVzICovCisJaWYgKHNrYi0+bWFjLnJhd1syXSA9PSAxKSB7CisJCXN0cnVjdCBkZHBlaGRyICpkZHA7CisJCS8qIEZpbmQgb3VyIGFkZHJlc3MgKi8KKwkJc3RydWN0IGF0YWxrX2FkZHIgKmFwID0gYXRhbGtfZmluZF9kZXZfYWRkcihkZXYpOworCisJCWlmICghYXAgfHwgc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IGRkcHNoZHIpKQorCQkJZ290byBmcmVlaXQ7CisKKwkJLyogRG9uJ3QgbWFuZ2xlIGJ1ZmZlciBpZiBzaGFyZWQgKi8KKwkJaWYgKCEoc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQykpKSAKKwkJCXJldHVybiAwOworCisJCS8qCisJCSAqIFRoZSBwdXNoIGxlYXZlcyB1cyB3aXRoIGEgZGRlcGhkciBub3QgYW4gc2hkciwgYW5kCisJCSAqIGhhbmRpbHkgdGhlIHBvcnQgYnl0ZXMgaW4gdGhlIHJpZ2h0IHBsYWNlIHByZXNldC4KKwkJICovCisJCWRkcCA9IChzdHJ1Y3QgZGRwZWhkciAqKSBza2JfcHVzaChza2IsIHNpemVvZigqZGRwKSAtIDQpOworCisJCS8qIE5vdyBmaWxsIGluIHRoZSBsb25nIGhlYWRlciAqLworCisJIAkvKgorCSAJICogVGhlc2UgdHdvIGZpcnN0LiBUaGUgbWFjIG92ZXJsYXlzIHRoZSBuZXcgc291cmNlL2Rlc3QKKwkgCSAqIG5ldHdvcmsgaW5mb3JtYXRpb24gc28gd2UgTVVTVCBjb3B5IHRoZXNlIGJlZm9yZQorCSAJICogd2Ugd3JpdGUgdGhlIG5ldHdvcmsgbnVtYmVycyAhCisJIAkgKi8KKworCQlkZHAtPmRlaF9kbm9kZSA9IHNrYi0+bWFjLnJhd1swXTsgICAgIC8qIEZyb20gcGh5c2ljYWwgaGVhZGVyICovCisJCWRkcC0+ZGVoX3Nub2RlID0gc2tiLT5tYWMucmF3WzFdOyAgICAgLyogRnJvbSBwaHlzaWNhbCBoZWFkZXIgKi8KKworCQlkZHAtPmRlaF9kbmV0ICA9IGFwLT5zX25ldDsJLyogTmV0d29yayBudW1iZXIgKi8KKwkJZGRwLT5kZWhfc25ldCAgPSBhcC0+c19uZXQ7CisJCWRkcC0+ZGVoX3N1bSAgID0gMDsJCS8qIE5vIGNoZWNrc3VtICovCisJCS8qCisJCSAqIE5vdCBzdXJlIGFib3V0IHRoaXMgYml0Li4uCisJCSAqLworCQlkZHAtPmRlaF9sZW4gICA9IHNrYi0+bGVuOworCQlkZHAtPmRlaF9ob3BzICA9IEREUF9NQVhIT1BTOwkvKiBOb24gcm91dGFibGUsIHNvIGZvcmNlIGEgZHJvcAorCQkJCQkJICAgaWYgd2Ugc2xpcCB1cCBsYXRlciAqLworCQkvKiBNZW5kIHRoZSBieXRlIG9yZGVyICovCisJCSooKF9fdTE2ICopZGRwKSA9IGh0b25zKCooKF9fdTE2ICopZGRwKSk7CisJfQorCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisKKwlyZXR1cm4gYXRhbGtfcmN2KHNrYiwgZGV2LCBwdCk7CitmcmVlaXQ6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRhbGtfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywKKwkJCSBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBhdGFsa19zb2NrICphdCA9IGF0X3NrKHNrKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfYXQgKnVzYXQgPSAoc3RydWN0IHNvY2thZGRyX2F0ICopbXNnLT5tc2dfbmFtZTsKKwlpbnQgZmxhZ3MgPSBtc2ctPm1zZ19mbGFnczsKKwlpbnQgbG9vcGJhY2sgPSAwOworCXN0cnVjdCBzb2NrYWRkcl9hdCBsb2NhbF9zYXRhbGssIGdzYXQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBkZHBlaGRyICpkZHA7CisJaW50IHNpemU7CisJc3RydWN0IGF0YWxrX3JvdXRlICpydDsKKwlpbnQgZXJyOworCisJaWYgKGZsYWdzICYgfihNU0dfRE9OVFdBSVR8TVNHX0NNU0dfQ09NUEFUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobGVuID4gRERQX01BWFNaKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJaWYgKHVzYXQpIHsKKwkJaWYgKHNvY2tfZmxhZyhzaywgU09DS19aQVBQRUQpKQorCQkJaWYgKGF0YWxrX2F1dG9iaW5kKHNrKSA8IDApCisJCQkJcmV0dXJuIC1FQlVTWTsKKworCQlpZiAobXNnLT5tc2dfbmFtZWxlbiA8IHNpemVvZigqdXNhdCkgfHwKKwkJICAgIHVzYXQtPnNhdF9mYW1pbHkgIT0gQUZfQVBQTEVUQUxLKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogbmV0YXRhbGsgZG9lc24ndCBpbXBsZW1lbnQgdGhpcyBjaGVjayAqLworCQlpZiAodXNhdC0+c2F0X2FkZHIuc19ub2RlID09IEFUQUREUl9CQ0FTVCAmJgorCQkgICAgIXNvY2tfZmxhZyhzaywgU09DS19CUk9BRENBU1QpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJTT19CUk9BRENBU1Q6IEZpeCB5b3VyIG5ldGF0YWxrIGFzICIKKwkJCQkJICJpdCB3aWxsIGJyZWFrIGJlZm9yZSAyLjJcbiIpOworI2lmIDAKKwkJCXJldHVybiAtRVBFUk07CisjZW5kaWYKKwkJfQorCX0gZWxzZSB7CisJCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKQorCQkJcmV0dXJuIC1FTk9UQ09OTjsKKwkJdXNhdCA9ICZsb2NhbF9zYXRhbGs7CisJCXVzYXQtPnNhdF9mYW1pbHkgICAgICA9IEFGX0FQUExFVEFMSzsKKwkJdXNhdC0+c2F0X3BvcnQJICAgICAgPSBhdC0+ZGVzdF9wb3J0OworCQl1c2F0LT5zYXRfYWRkci5zX25vZGUgPSBhdC0+ZGVzdF9ub2RlOworCQl1c2F0LT5zYXRfYWRkci5zX25ldCAgPSBhdC0+ZGVzdF9uZXQ7CisJfQorCisJLyogQnVpbGQgYSBwYWNrZXQgKi8KKwlTT0NLX0RFQlVHKHNrLCAiU0sgJXA6IEdvdCBhZGRyZXNzLlxuIiwgc2spOworCisJLyogRm9yIGhlYWRlcnMgKi8KKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBkZHBlaGRyKSArIGxlbiArIGRkcF9kbC0+aGVhZGVyX2xlbmd0aDsKKworCWlmICh1c2F0LT5zYXRfYWRkci5zX25ldCB8fCB1c2F0LT5zYXRfYWRkci5zX25vZGUgPT0gQVRBRERSX0FOWU5PREUpIHsKKwkJcnQgPSBhdHJ0cl9maW5kKCZ1c2F0LT5zYXRfYWRkcik7CisJCWlmICghcnQpCisJCQlyZXR1cm4gLUVORVRVTlJFQUNIOworCisJCWRldiA9IHJ0LT5kZXY7CisJfSBlbHNlIHsKKwkJc3RydWN0IGF0YWxrX2FkZHIgYXRfaGludDsKKworCQlhdF9oaW50LnNfbm9kZSA9IDA7CisJCWF0X2hpbnQuc19uZXQgID0gYXQtPnNyY19uZXQ7CisKKwkJcnQgPSBhdHJ0cl9maW5kKCZhdF9oaW50KTsKKwkJaWYgKCFydCkKKwkJCXJldHVybiAtRU5FVFVOUkVBQ0g7CisKKwkJZGV2ID0gcnQtPmRldjsKKwl9CisKKwlTT0NLX0RFQlVHKHNrLCAiU0sgJXA6IFNpemUgbmVlZGVkICVkLCBkZXZpY2UgJXNcbiIsCisJCQlzaywgc2l6ZSwgZGV2LT5uYW1lKTsKKworCXNpemUgKz0gZGV2LT5oYXJkX2hlYWRlcl9sZW47CisJc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywgc2l6ZSwgKGZsYWdzICYgTVNHX0RPTlRXQUlUKSwgJmVycik7CisJaWYgKCFza2IpCisJCXJldHVybiBlcnI7CisJCisJc2tiLT5zayA9IHNrOworCXNrYl9yZXNlcnZlKHNrYiwgZGRwX2RsLT5oZWFkZXJfbGVuZ3RoKTsKKwlza2JfcmVzZXJ2ZShza2IsIGRldi0+aGFyZF9oZWFkZXJfbGVuKTsKKwlza2ItPmRldiA9IGRldjsKKworCVNPQ0tfREVCVUcoc2ssICJTSyAlcDogQmVnaW4gYnVpbGQuXG4iLCBzayk7CisKKwlkZHAgPSAoc3RydWN0IGRkcGVoZHIgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBkZHBlaGRyKSk7CisJZGRwLT5kZWhfcGFkICA9IDA7CisJZGRwLT5kZWhfaG9wcyA9IDA7CisJZGRwLT5kZWhfbGVuICA9IGxlbiArIHNpemVvZigqZGRwKTsKKwkvKgorCSAqIEZpeCB1cCB0aGUgbGVuZ3RoIGZpZWxkIFtPayB0aGlzIGlzIGhvcnJpYmxlIGJ1dCBvdGhlcndpc2UKKwkgKiBJIGVuZCB1cCB3aXRoIHVuaW9ucyBvZiBiaXQgZmllbGRzIGFuZCBtZXNzeSBiaXQgZmllbGQgb3JkZXIKKwkgKiBjb21waWxlci9lbmRpYW4gZGVwZW5kZW5jaWVzLi4KKwkgKi8KKwkqKChfX3UxNiAqKWRkcCkgPSBudG9ocygqKChfX3UxNiAqKWRkcCkpOworCisJZGRwLT5kZWhfZG5ldCAgPSB1c2F0LT5zYXRfYWRkci5zX25ldDsKKwlkZHAtPmRlaF9zbmV0ICA9IGF0LT5zcmNfbmV0OworCWRkcC0+ZGVoX2Rub2RlID0gdXNhdC0+c2F0X2FkZHIuc19ub2RlOworCWRkcC0+ZGVoX3Nub2RlID0gYXQtPnNyY19ub2RlOworCWRkcC0+ZGVoX2Rwb3J0ID0gdXNhdC0+c2F0X3BvcnQ7CisJZGRwLT5kZWhfc3BvcnQgPSBhdC0+c3JjX3BvcnQ7CisKKwlTT0NLX0RFQlVHKHNrLCAiU0sgJXA6IENvcHkgdXNlciBkYXRhICglWmQgYnl0ZXMpLlxuIiwgc2ssIGxlbik7CisKKwllcnIgPSBtZW1jcHlfZnJvbWlvdmVjKHNrYl9wdXQoc2tiLCBsZW4pLCBtc2ctPm1zZ19pb3YsIGxlbik7CisJaWYgKGVycikgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKHNrLT5za19ub19jaGVjayA9PSAxKQorCQlkZHAtPmRlaF9zdW0gPSAwOworCWVsc2UKKwkJZGRwLT5kZWhfc3VtID0gYXRhbGtfY2hlY2tzdW0oc2tiLCBsZW4gKyBzaXplb2YoKmRkcCkpOworCisJLyoKKwkgKiBMb29wYmFjayBicm9hZGNhc3QgcGFja2V0cyB0byBub24gZ2F0ZXdheSB0YXJnZXRzIChpZSByb3V0ZXMKKwkgKiB0byBncm91cCB3ZSBhcmUgaW4pCisJICovCisJaWYgKGRkcC0+ZGVoX2Rub2RlID09IEFUQUREUl9CQ0FTVCAmJgorCSAgICAhKHJ0LT5mbGFncyAmIFJURl9HQVRFV0FZKSAmJiAhKGRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spKSB7CisJCXN0cnVjdCBza19idWZmICpza2IyID0gc2tiX2NvcHkoc2tiLCBHRlBfS0VSTkVMKTsKKworCQlpZiAoc2tiMikgeworCQkJbG9vcGJhY2sgPSAxOworCQkJU09DS19ERUJVRyhzaywgIlNLICVwOiBzZW5kIG91dChjb3B5KS5cbiIsIHNrKTsKKwkJCWlmIChhYXJwX3NlbmRfZGRwKGRldiwgc2tiMiwKKwkJCQkJICAmdXNhdC0+c2F0X2FkZHIsIE5VTEwpID09IC0xKQorCQkJCWtmcmVlX3NrYihza2IyKTsKKwkJCQkvKiBlbHNlIHF1ZXVlZC9zZW50IGFib3ZlIGluIHRoZSBhYXJwIHF1ZXVlICovCisJCX0KKwl9CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSyB8fCBsb29wYmFjaykgeworCQlTT0NLX0RFQlVHKHNrLCAiU0sgJXA6IExvb3AgYmFjay5cbiIsIHNrKTsKKwkJLyogbG9vcCBiYWNrICovCisJCXNrYl9vcnBoYW4oc2tiKTsKKwkJZGRwX2RsLT5yZXF1ZXN0KGRkcF9kbCwgc2tiLCBkZXYtPmRldl9hZGRyKTsKKwl9IGVsc2UgeworCQlTT0NLX0RFQlVHKHNrLCAiU0sgJXA6IHNlbmQgb3V0LlxuIiwgc2spOworCQlpZiAocnQtPmZsYWdzICYgUlRGX0dBVEVXQVkpIHsKKwkJICAgIGdzYXQuc2F0X2FkZHIgPSBydC0+Z2F0ZXdheTsKKwkJICAgIHVzYXQgPSAmZ3NhdDsKKwkJfQorCisJCWlmIChhYXJwX3NlbmRfZGRwKGRldiwgc2tiLCAmdXNhdC0+c2F0X2FkZHIsIE5VTEwpID09IC0xKQorCQkJa2ZyZWVfc2tiKHNrYik7CisJCS8qIGVsc2UgcXVldWVkL3NlbnQgYWJvdmUgaW4gdGhlIGFhcnAgcXVldWUgKi8KKwl9CisJU09DS19ERUJVRyhzaywgIlNLICVwOiBEb25lIHdyaXRlICglWmQpLlxuIiwgc2ssIGxlbik7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGF0YWxrX3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgc29ja2FkZHJfYXQgKnNhdCA9IChzdHJ1Y3Qgc29ja2FkZHJfYXQgKiltc2ctPm1zZ19uYW1lOworCXN0cnVjdCBkZHBlaGRyICpkZHA7CisJaW50IGNvcGllZCA9IDA7CisJaW50IGVyciA9IDA7CisgICAgICAgIHN0cnVjdCBkZHBlYml0cyBkZHBodjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2tiX3JlY3ZfZGF0YWdyYW0oc2ssIGZsYWdzICYgfk1TR19ET05UV0FJVCwKKwkJCQkJCWZsYWdzICYgTVNHX0RPTlRXQUlULCAmZXJyKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIGVycjsKKworCS8qIEZJWE1FOiB1c2Ugc2tiLT5jYiB0byBiZSBhYmxlIHRvIHVzZSBzaGFyZWQgc2ticyAqLworCWRkcCA9IGRkcF9oZHIoc2tiKTsKKwkqKChfX3UxNiAqKSZkZHBodikgPSBudG9ocygqKChfX3UxNiAqKWRkcCkpOworCisJaWYgKHNrLT5za190eXBlID09IFNPQ0tfUkFXKSB7CisJCWNvcGllZCA9IGRkcGh2LmRlaF9sZW47CisJCWlmIChjb3BpZWQgPiBzaXplKSB7CisJCQljb3BpZWQgPSBzaXplOworCQkJbXNnLT5tc2dfZmxhZ3MgfD0gTVNHX1RSVU5DOworCQl9CisKKwkJZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCAwLCBtc2ctPm1zZ19pb3YsIGNvcGllZCk7CisJfSBlbHNlIHsKKwkJY29waWVkID0gZGRwaHYuZGVoX2xlbiAtIHNpemVvZigqZGRwKTsKKwkJaWYgKGNvcGllZCA+IHNpemUpIHsKKwkJCWNvcGllZCA9IHNpemU7CisJCQltc2ctPm1zZ19mbGFncyB8PSBNU0dfVFJVTkM7CisJCX0KKwkJZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCBzaXplb2YoKmRkcCksCisJCQkJCSAgICAgIG1zZy0+bXNnX2lvdiwgY29waWVkKTsKKwl9CisKKwlpZiAoIWVycikgeworCQlpZiAoc2F0KSB7CisJCQlzYXQtPnNhdF9mYW1pbHkgICAgICA9IEFGX0FQUExFVEFMSzsKKwkJCXNhdC0+c2F0X3BvcnQgICAgICAgID0gZGRwLT5kZWhfc3BvcnQ7CisJCQlzYXQtPnNhdF9hZGRyLnNfbm9kZSA9IGRkcC0+ZGVoX3Nub2RlOworCQkJc2F0LT5zYXRfYWRkci5zX25ldCAgPSBkZHAtPmRlaF9zbmV0OworCQl9CisJCW1zZy0+bXNnX25hbWVsZW4gPSBzaXplb2YoKnNhdCk7CisJfQorCisJc2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7CS8qIEZyZWUgdGhlIGRhdGFncmFtLiAqLworCXJldHVybiBlcnIgPyA6IGNvcGllZDsKK30KKworCisvKgorICogQXBwbGVUYWxrIGlvY3RsIGNhbGxzLgorICovCitzdGF0aWMgaW50IGF0YWxrX2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByYyA9IC1FSU5WQUw7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlzd2l0Y2ggKGNtZCkgeworCQkvKiBQcm90b2NvbCBsYXllciAqLworCQljYXNlIFRJT0NPVVRROiB7CisJCQlsb25nIGFtb3VudCA9IHNrLT5za19zbmRidWYgLQorCQkJCSAgICAgIGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYyk7CisKKwkJCWlmIChhbW91bnQgPCAwKQorCQkJCWFtb3VudCA9IDA7CisJCQlyYyA9IHB1dF91c2VyKGFtb3VudCwgKGludCBfX3VzZXIgKilhcmdwKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgVElPQ0lOUTogeworCQkJLyoKKwkJCSAqIFRoZXNlIHR3byBhcmUgc2FmZSBvbiBhIHNpbmdsZSBDUFUgc3lzdGVtIGFzIG9ubHkKKwkJCSAqIHVzZXIgdGFza3MgZmlkZGxlIGhlcmUKKwkJCSAqLworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrYl9wZWVrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJCQlsb25nIGFtb3VudCA9IDA7CisKKwkJCWlmIChza2IpCisJCQkJYW1vdW50ID0gc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IGRkcGVoZHIpOworCQkJcmMgPSBwdXRfdXNlcihhbW91bnQsIChpbnQgX191c2VyICopYXJncCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHU1RBTVA6CisJCQlyYyA9IHNvY2tfZ2V0X3RpbWVzdGFtcChzaywgYXJncCk7CisJCQlicmVhazsKKwkJLyogUm91dGluZyAqLworCQljYXNlIFNJT0NBRERSVDoKKwkJY2FzZSBTSU9DREVMUlQ6CisJCQlyYyA9IC1FUEVSTTsKKwkJCWlmIChjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJCXJjID0gYXRydHJfaW9jdGwoY21kLCBhcmdwKTsKKwkJCWJyZWFrOworCQkvKiBJbnRlcmZhY2UgKi8KKwkJY2FzZSBTSU9DR0lGQUREUjoKKwkJY2FzZSBTSU9DU0lGQUREUjoKKwkJY2FzZSBTSU9DR0lGQlJEQUREUjoKKwkJY2FzZSBTSU9DQVRBTEtESUZBRERSOgorCQljYXNlIFNJT0NESUZBRERSOgorCQljYXNlIFNJT0NTQVJQOgkJLyogcHJveHkgQUFSUCAqLworCQljYXNlIFNJT0NEQVJQOgkJLyogcHJveHkgQUFSUCAqLworCQkJcnRubF9sb2NrKCk7CisJCQlyYyA9IGF0aWZfaW9jdGwoY21kLCBhcmdwKTsKKwkJCXJ0bmxfdW5sb2NrKCk7CisJCQlicmVhazsKKwkJLyogUGh5c2ljYWwgbGF5ZXIgaW9jdGwgY2FsbHMgKi8KKwkJY2FzZSBTSU9DU0lGTElOSzoKKwkJY2FzZSBTSU9DR0lGSFdBRERSOgorCQljYXNlIFNJT0NTSUZIV0FERFI6CisJCWNhc2UgU0lPQ0dJRkZMQUdTOgorCQljYXNlIFNJT0NTSUZGTEFHUzoKKwkJY2FzZSBTSU9DR0lGVFhRTEVOOgorCQljYXNlIFNJT0NTSUZUWFFMRU46CisJCWNhc2UgU0lPQ0dJRk1UVToKKwkJY2FzZSBTSU9DR0lGQ09ORjoKKwkJY2FzZSBTSU9DQURETVVMVEk6CisJCWNhc2UgU0lPQ0RFTE1VTFRJOgorCQljYXNlIFNJT0NHSUZDT1VOVDoKKwkJY2FzZSBTSU9DR0lGSU5ERVg6CisJCWNhc2UgU0lPQ0dJRk5BTUU6CisJCQlyYyA9IGRldl9pb2N0bChjbWQsIGFyZ3ApOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9wcm90b19mYW1pbHkgYXRhbGtfZmFtaWx5X29wcyA9IHsKKwkuZmFtaWx5CQk9IFBGX0FQUExFVEFMSywKKwkuY3JlYXRlCQk9IGF0YWxrX2NyZWF0ZSwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBTT0NLT1BTX1dSQVBQRUQoYXRhbGtfZGdyYW1fb3BzKSA9IHsKKwkuZmFtaWx5CQk9IFBGX0FQUExFVEFMSywKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnJlbGVhc2UJPSBhdGFsa19yZWxlYXNlLAorCS5iaW5kCQk9IGF0YWxrX2JpbmQsCisJLmNvbm5lY3QJPSBhdGFsa19jb25uZWN0LAorCS5zb2NrZXRwYWlyCT0gc29ja19ub19zb2NrZXRwYWlyLAorCS5hY2NlcHQJCT0gc29ja19ub19hY2NlcHQsCisJLmdldG5hbWUJPSBhdGFsa19nZXRuYW1lLAorCS5wb2xsCQk9IGRhdGFncmFtX3BvbGwsCisJLmlvY3RsCQk9IGF0YWxrX2lvY3RsLAorCS5saXN0ZW4JCT0gc29ja19ub19saXN0ZW4sCisJLnNodXRkb3duCT0gc29ja19ub19zaHV0ZG93biwKKwkuc2V0c29ja29wdAk9IHNvY2tfbm9fc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdAk9IHNvY2tfbm9fZ2V0c29ja29wdCwKKwkuc2VuZG1zZwk9IGF0YWxrX3NlbmRtc2csCisJLnJlY3Ztc2cJPSBhdGFsa19yZWN2bXNnLAorCS5tbWFwCQk9IHNvY2tfbm9fbW1hcCwKKwkuc2VuZHBhZ2UJPSBzb2NrX25vX3NlbmRwYWdlLAorfTsKKworI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CitTT0NLT1BTX1dSQVAoYXRhbGtfZGdyYW0sIFBGX0FQUExFVEFMSyk7CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZGRwX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsCT0gZGRwX2RldmljZV9ldmVudCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGFja2V0X3R5cGUgbHRhbGtfcGFja2V0X3R5cGUgPSB7CisJLnR5cGUJCT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9MT0NBTFRBTEspLAorCS5mdW5jCQk9IGx0YWxrX3JjdiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGFja2V0X3R5cGUgcHBwdGFsa19wYWNrZXRfdHlwZSA9IHsKKwkudHlwZQkJPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX1BQUFRBTEspLAorCS5mdW5jCQk9IGF0YWxrX3JjdiwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRkcF9zbmFwX2lkW10gPSB7IDB4MDgsIDB4MDAsIDB4MDcsIDB4ODAsIDB4OUIgfTsKKworLyogRXhwb3J0IHN5bWJvbHMgZm9yIHVzZSBieSBkcml2ZXJzIHdoZW4gQXBwbGVUYWxrIGlzIGEgbW9kdWxlICovCitFWFBPUlRfU1lNQk9MKGFhcnBfc2VuZF9kZHApOworRVhQT1JUX1NZTUJPTChhdHJ0cl9nZXRfZGV2KTsKK0VYUE9SVF9TWU1CT0woYXRhbGtfZmluZF9kZXZfYWRkcik7CisKK3N0YXRpYyBjaGFyIGF0YWxrX2Vycl9zbmFwW10gX19pbml0ZGF0YSA9CisJS0VSTl9DUklUICJVbmFibGUgdG8gcmVnaXN0ZXIgRERQIHdpdGggU05BUC5cbiI7CisKKy8qIENhbGxlZCBieSBwcm90by5jIG9uIGtlcm5lbCBzdGFydCB1cCAqLworc3RhdGljIGludCBfX2luaXQgYXRhbGtfaW5pdCh2b2lkKQoreworCWludCByYyA9IHByb3RvX3JlZ2lzdGVyKCZkZHBfcHJvdG8sIDApOworCisJaWYgKHJjICE9IDApCisJCWdvdG8gb3V0OworCisJKHZvaWQpc29ja19yZWdpc3RlcigmYXRhbGtfZmFtaWx5X29wcyk7CisJZGRwX2RsID0gcmVnaXN0ZXJfc25hcF9jbGllbnQoZGRwX3NuYXBfaWQsIGF0YWxrX3Jjdik7CisJaWYgKCFkZHBfZGwpCisJCXByaW50ayhhdGFsa19lcnJfc25hcCk7CisKKwlkZXZfYWRkX3BhY2soJmx0YWxrX3BhY2tldF90eXBlKTsKKwlkZXZfYWRkX3BhY2soJnBwcHRhbGtfcGFja2V0X3R5cGUpOworCisJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZkZHBfbm90aWZpZXIpOworCWFhcnBfcHJvdG9faW5pdCgpOworCWF0YWxrX3Byb2NfaW5pdCgpOworCWF0YWxrX3JlZ2lzdGVyX3N5c2N0bCgpOworb3V0OgorCXJldHVybiByYzsKK30KK21vZHVsZV9pbml0KGF0YWxrX2luaXQpOworCisvKgorICogTm8gZXhwbGljaXQgbW9kdWxlIHJlZmVyZW5jZSBjb3VudCBtYW5pcHVsYXRpb24gaXMgbmVlZGVkIGluIHRoZQorICogcHJvdG9jb2wuIFNvY2tldCBsYXllciBzZXRzIG1vZHVsZSByZWZlcmVuY2UgY291bnQgZm9yIHVzCisgKiBhbmQgaW50ZXJmYWNlcyByZWZlcmVuY2UgY291bnRpbmcgaXMgZG9uZQorICogYnkgdGhlIG5ldHdvcmsgZGV2aWNlIGxheWVyLgorICoKKyAqIEVyZ28sIGJlZm9yZSB0aGUgQXBwbGVUYWxrIG1vZHVsZSBjYW4gYmUgcmVtb3ZlZCwgYWxsIEFwcGxlVGFsaworICogc29ja2V0cyBiZSBjbG9zZWQgZnJvbSB1c2VyIHNwYWNlLgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgYXRhbGtfZXhpdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19TWVNDVEwKKwlhdGFsa191bnJlZ2lzdGVyX3N5c2N0bCgpOworI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KKwlhdGFsa19wcm9jX2V4aXQoKTsKKwlhYXJwX2NsZWFudXBfbW9kdWxlKCk7CS8qIEdlbmVyYWwgYWFycCBjbGVhbi11cC4gKi8KKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmZGRwX25vdGlmaWVyKTsKKwlkZXZfcmVtb3ZlX3BhY2soJmx0YWxrX3BhY2tldF90eXBlKTsKKwlkZXZfcmVtb3ZlX3BhY2soJnBwcHRhbGtfcGFja2V0X3R5cGUpOworCXVucmVnaXN0ZXJfc25hcF9jbGllbnQoZGRwX2RsKTsKKwlzb2NrX3VucmVnaXN0ZXIoUEZfQVBQTEVUQUxLKTsKKwlwcm90b191bnJlZ2lzdGVyKCZkZHBfcHJvdG8pOworfQorbW9kdWxlX2V4aXQoYXRhbGtfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkFsYW4gQ294IDxBbGFuLkNveEBsaW51eC5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFwcGxlVGFsayAwLjIwXG4iKTsKK01PRFVMRV9BTElBU19ORVRQUk9UTyhQRl9BUFBMRVRBTEspOwpkaWZmIC0tZ2l0IGEvbmV0L2FwcGxldGFsay9kZXYuYyBiL25ldC9hcHBsZXRhbGsvZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY1OTg0NAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9hcHBsZXRhbGsvZGV2LmMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIE1vdmVkIGhlcmUgZnJvbSBkcml2ZXJzL25ldC9uZXRfaW5pdC5jLCB3aGljaCBpczoKKyAqCVdyaXR0ZW4gMTk5MywxOTk0LDE5OTUgYnkgRG9uYWxkIEJlY2tlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9sdGFsay5oPgorCitzdGF0aWMgaW50IGx0YWxrX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG10dSkKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBsdGFsa19tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQorewkKKwlyZXR1cm4gLUVJTlZBTDsKK30KKwordm9pZCBsdGFsa19zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIEZpbGwgaW4gdGhlIGZpZWxkcyBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSB3aXRoIGxvY2FsdGFsay1nZW5lcmljIHZhbHVlcy4gKi8KKwkKKwlkZXYtPmNoYW5nZV9tdHUJCT0gbHRhbGtfY2hhbmdlX210dTsKKwlkZXYtPmhhcmRfaGVhZGVyCT0gTlVMTDsKKwlkZXYtPnJlYnVpbGRfaGVhZGVyIAk9IE5VTEw7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgCT0gbHRhbGtfbWFjX2FkZHI7CisJZGV2LT5oYXJkX2hlYWRlcl9jYWNoZQk9IE5VTEw7CisJZGV2LT5oZWFkZXJfY2FjaGVfdXBkYXRlPSBOVUxMOworCisJZGV2LT50eXBlCQk9IEFSUEhSRF9MT0NBTFRMSzsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiAJPSBMVEFMS19ITEVOOworCWRldi0+bXR1CQk9IExUQUxLX01UVTsKKwlkZXYtPmFkZHJfbGVuCQk9IExUQUxLX0FMRU47CisJZGV2LT50eF9xdWV1ZV9sZW4JPSAxMDsJCisJCisJZGV2LT5icm9hZGNhc3RbMF0JPSAweEZGOworCisJZGV2LT5mbGFncwkJPSBJRkZfQlJPQURDQVNUfElGRl9NVUxUSUNBU1R8SUZGX05PQVJQOworfQorRVhQT1JUX1NZTUJPTChsdGFsa19zZXR1cCk7CmRpZmYgLS1naXQgYS9uZXQvYXBwbGV0YWxrL3N5c2N0bF9uZXRfYXRhbGsuYyBiL25ldC9hcHBsZXRhbGsvc3lzY3RsX25ldF9hdGFsay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmN2YwNjAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYXBwbGV0YWxrL3N5c2N0bF9uZXRfYXRhbGsuYwpAQCAtMCwwICsxLDgzIEBACisvKgorICogc3lzY3RsX25ldF9hdGFsay5jOiBzeXNjdGwgaW50ZXJmYWNlIHRvIG5ldCBBcHBsZVRhbGsgc3Vic3lzdGVtLgorICoKKyAqIEJlZ3VuIEFwcmlsIDEsIDE5OTYsIE1pa2UgU2hhdmVyLgorICogQWRkZWQgL3Byb2Mvc3lzL25ldC9hdGFsayBkaXJlY3RvcnkgZW50cnkgKGVtcHR5ID0pICkuIFtNU10KKyAqIER5bmFtaWMgcmVnaXN0cmF0aW9uLCBhZGRlZCBhYXJwIGVudHJpZXMuICg1LzMwLzk3IENocmlzIEhvcm4pCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYXRhbGsuaD4KKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgYXRhbGtfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9BVEFMS19BQVJQX0VYUElSWV9USU1FLAorCQkucHJvY25hbWUJPSAiYWFycC1leHBpcnktdGltZSIsCisJCS5kYXRhCQk9ICZzeXNjdGxfYWFycF9leHBpcnlfdGltZSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0FUQUxLX0FBUlBfVElDS19USU1FLAorCQkucHJvY25hbWUJPSAiYWFycC10aWNrLXRpbWUiLAorCQkuZGF0YQkJPSAmc3lzY3RsX2FhcnBfdGlja190aW1lLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfQVRBTEtfQUFSUF9SRVRSQU5TTUlUX0xJTUlULAorCQkucHJvY25hbWUJPSAiYWFycC1yZXRyYW5zbWl0LWxpbWl0IiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9hYXJwX3JldHJhbnNtaXRfbGltaXQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0FUQUxLX0FBUlBfUkVTT0xWRV9USU1FLAorCQkucHJvY25hbWUJPSAiYWFycC1yZXNvbHZlLXRpbWUiLAorCQkuZGF0YQkJPSAmc3lzY3RsX2FhcnBfcmVzb2x2ZV90aW1lLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9qaWZmaWVzLAorCX0sCisJeyAwIH0sCit9OworCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZSBhdGFsa19kaXJfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9BVEFMSywKKwkJLnByb2NuYW1lCT0gImFwcGxldGFsayIsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSBhdGFsa190YWJsZSwKKwl9LAorCXsgMCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgYXRhbGtfcm9vdF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX05FVCwKKwkJLnByb2NuYW1lCT0gIm5ldCIsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSBhdGFsa19kaXJfdGFibGUsCisJfSwKKwl7IDAgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqYXRhbGtfdGFibGVfaGVhZGVyOworCit2b2lkIGF0YWxrX3JlZ2lzdGVyX3N5c2N0bCh2b2lkKQoreworCWF0YWxrX3RhYmxlX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZShhdGFsa19yb290X3RhYmxlLCAxKTsKK30KKwordm9pZCBhdGFsa191bnJlZ2lzdGVyX3N5c2N0bCh2b2lkKQoreworCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGF0YWxrX3RhYmxlX2hlYWRlcik7Cit9CmRpZmYgLS1naXQgYS9uZXQvYXRtL01ha2VmaWxlIGIvbmV0L2F0bS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTgxODc1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2F0bS9NYWtlZmlsZQpAQCAtMCwwICsxLDE4IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgQVRNIFByb3RvY29sIEZhbWlsaWVzLgorIworCithdG0teQkJOj0gYWRkci5vIHB2Yy5vIHNpZ25hbGluZy5vIHN2Yy5vIGlvY3RsLm8gY29tbW9uLm8gYXRtX21pc2MubyByYXcubyByZXNvdXJjZXMubworbXBvYS1vYmpzCTo9IG1wYy5vIG1wb2FfY2FjaGVzLm8gbXBvYV9wcm9jLm8KKworb2JqLSQoQ09ORklHX0FUTSkgKz0gYXRtLm8KK29iai0kKENPTkZJR19BVE1fQ0xJUCkgKz0gY2xpcC5vCithdG0tJChzdWJzdCBtLHksJChDT05GSUdfQVRNX0NMSVApKSArPSBpcGNvbW1vbi5vCitvYmotJChDT05GSUdfQVRNX0JSMjY4NCkgKz0gYnIyNjg0Lm8KK2F0bS0kKHN1YnN0IG0seSwkKENPTkZJR19BVE1fQlIyNjg0KSkgKz0gaXBjb21tb24ubworYXRtLSQoc3Vic3QgbSx5LCQoQ09ORklHX05FVF9TQ0hfQVRNKSkgKz0gaXBjb21tb24ubworYXRtLSQoQ09ORklHX1BST0NfRlMpICs9IHByb2MubworCitvYmotJChDT05GSUdfQVRNX0xBTkUpICs9IGxlYy5vCitvYmotJChDT05GSUdfQVRNX01QT0EpICs9IG1wb2Eubworb2JqLSQoQ09ORklHX1BQUE9BVE0pICs9IHBwcG9hdG0ubwpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9hZGRyLmMgYi9uZXQvYXRtL2FkZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzg4NjdmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2F0bS9hZGRyLmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qIG5ldC9hdG0vYWRkci5jIC0gTG9jYWwgQVRNIGFkZHJlc3MgcmVnaXN0cnkgKi8KKworLyogV3JpdHRlbiAxOTk1LTIwMDAgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIExSQy9JQ0EgKi8KKworI2luY2x1ZGUgPGxpbnV4L2F0bS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgInNpZ25hbGluZy5oIgorI2luY2x1ZGUgImFkZHIuaCIKKworc3RhdGljIGludCBjaGVja19hZGRyKHN0cnVjdCBzb2NrYWRkcl9hdG1zdmMgKmFkZHIpCit7CisJaW50IGk7CisKKwlpZiAoYWRkci0+c2FzX2ZhbWlseSAhPSBBRl9BVE1TVkMpCisJCXJldHVybiAtRUFGTk9TVVBQT1JUOworCWlmICghKmFkZHItPnNhc19hZGRyLnB1YikKKwkJcmV0dXJuICphZGRyLT5zYXNfYWRkci5wcnYgPyAwIDogLUVJTlZBTDsKKwlmb3IgKGkgPSAxOyBpIDwgQVRNX0UxNjRfTEVOICsgMTsgaSsrKQkvKiBtYWtlIHN1cmUgaXQncyBcMC10ZXJtaW5hdGVkICovCisJCWlmICghYWRkci0+c2FzX2FkZHIucHViW2ldKQorCQkJcmV0dXJuIDA7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgaWRlbnRpY2FsKHN0cnVjdCBzb2NrYWRkcl9hdG1zdmMgKmEsIHN0cnVjdCBzb2NrYWRkcl9hdG1zdmMgKmIpCit7CisJaWYgKCphLT5zYXNfYWRkci5wcnYpCisJCWlmIChtZW1jbXAoYS0+c2FzX2FkZHIucHJ2LCBiLT5zYXNfYWRkci5wcnYsIEFUTV9FU0FfTEVOKSkKKwkJCXJldHVybiAwOworCWlmICghKmEtPnNhc19hZGRyLnB1YikKKwkJcmV0dXJuICEqYi0+c2FzX2FkZHIucHViOworCWlmICghKmItPnNhc19hZGRyLnB1YikKKwkJcmV0dXJuIDA7CisJcmV0dXJuICFzdHJjbXAoYS0+c2FzX2FkZHIucHViLCBiLT5zYXNfYWRkci5wdWIpOworfQorCitzdGF0aWMgdm9pZCBub3RpZnlfc2lnZChzdHJ1Y3QgYXRtX2RldiAqZGV2KQoreworCXN0cnVjdCBzb2NrYWRkcl9hdG1wdmMgcHZjOworCisJcHZjLnNhcF9hZGRyLml0ZiA9IGRldi0+bnVtYmVyOworCXNpZ2RfZW5xKE5VTEwsIGFzX2l0Zl9ub3RpZnksIE5VTEwsICZwdmMsIE5VTEwpOworfQorCit2b2lkIGF0bV9yZXNldF9hZGRyKHN0cnVjdCBhdG1fZGV2ICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYXRtX2Rldl9hZGRyICp0aGlzLCAqcDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGhpcywgcCwgJmRldi0+bG9jYWwsIGVudHJ5KQorCSAgICBrZnJlZSh0aGlzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwlub3RpZnlfc2lnZChkZXYpOworfQorCitpbnQgYXRtX2FkZF9hZGRyKHN0cnVjdCBhdG1fZGV2ICpkZXYsIHN0cnVjdCBzb2NrYWRkcl9hdG1zdmMgKmFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYXRtX2Rldl9hZGRyICp0aGlzOworCWludCBlcnJvcjsKKworCWVycm9yID0gY2hlY2tfYWRkcihhZGRyKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0aGlzLCAmZGV2LT5sb2NhbCwgZW50cnkpIHsKKwkJaWYgKGlkZW50aWNhbCgmdGhpcy0+YWRkciwgYWRkcikpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIC1FRVhJU1Q7CisJCX0KKwl9CisJdGhpcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdG1fZGV2X2FkZHIpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXRoaXMpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl0aGlzLT5hZGRyID0gKmFkZHI7CisJbGlzdF9hZGQoJnRoaXMtPmVudHJ5LCAmZGV2LT5sb2NhbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CisJbm90aWZ5X3NpZ2QoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGF0bV9kZWxfYWRkcihzdHJ1Y3QgYXRtX2RldiAqZGV2LCBzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjICphZGRyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGF0bV9kZXZfYWRkciAqdGhpczsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGNoZWNrX2FkZHIoYWRkcik7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+bG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodGhpcywgJmRldi0+bG9jYWwsIGVudHJ5KSB7CisJCWlmIChpZGVudGljYWwoJnRoaXMtPmFkZHIsIGFkZHIpKSB7CisJCQlsaXN0X2RlbCgmdGhpcy0+ZW50cnkpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CisJCQlrZnJlZSh0aGlzKTsKKwkJCW5vdGlmeV9zaWdkKGRldik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gLUVOT0VOVDsKK30KKworaW50IGF0bV9nZXRfYWRkcihzdHJ1Y3QgYXRtX2RldiAqZGV2LCBzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjIF9fdXNlciAqIGJ1ZiwKKwkJIHNpemVfdCBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGF0bV9kZXZfYWRkciAqdGhpczsKKwlpbnQgdG90YWwgPSAwLCBlcnJvcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjICp0bXBfYnVmLCAqdG1wX2J1ZnA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0aGlzLCAmZGV2LT5sb2NhbCwgZW50cnkpCisJICAgIHRvdGFsICs9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjKTsKKwl0bXBfYnVmID0gdG1wX2J1ZnAgPSBrbWFsbG9jKHRvdGFsLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXRtcF9idWYpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRoaXMsICZkZXYtPmxvY2FsLCBlbnRyeSkKKwkgICAgbWVtY3B5KHRtcF9idWZwKyssICZ0aGlzLT5hZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2F0bXN2YykpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOworCWVycm9yID0gdG90YWwgPiBzaXplID8gLUUyQklHIDogdG90YWw7CisJaWYgKGNvcHlfdG9fdXNlcihidWYsIHRtcF9idWYsIHRvdGFsIDwgc2l6ZSA/IHRvdGFsIDogc2l6ZSkpCisJCWVycm9yID0gLUVGQVVMVDsKKwlrZnJlZSh0bXBfYnVmKTsKKwlyZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9uZXQvYXRtL2FkZHIuaCBiL25ldC9hdG0vYWRkci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOTlkMjEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYXRtL2FkZHIuaApAQCAtMCwwICsxLDE4IEBACisvKiBuZXQvYXRtL2FkZHIuaCAtIExvY2FsIEFUTSBhZGRyZXNzIHJlZ2lzdHJ5ICovCisKKy8qIFdyaXR0ZW4gMTk5NS0yMDAwIGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgRVBGTCBMUkMvSUNBICovCisKKworI2lmbmRlZiBORVRfQVRNX0FERFJfSAorI2RlZmluZSBORVRfQVRNX0FERFJfSAorCisjaW5jbHVkZSA8bGludXgvYXRtLmg+CisjaW5jbHVkZSA8bGludXgvYXRtZGV2Lmg+CisKKwordm9pZCBhdG1fcmVzZXRfYWRkcihzdHJ1Y3QgYXRtX2RldiAqZGV2KTsKK2ludCBhdG1fYWRkX2FkZHIoc3RydWN0IGF0bV9kZXYgKmRldixzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjICphZGRyKTsKK2ludCBhdG1fZGVsX2FkZHIoc3RydWN0IGF0bV9kZXYgKmRldixzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjICphZGRyKTsKK2ludCBhdG1fZ2V0X2FkZHIoc3RydWN0IGF0bV9kZXYgKmRldixzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjIF9fdXNlciAqYnVmLHNpemVfdCBzaXplKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvYXRtL2F0bV9taXNjLmMgYi9uZXQvYXRtL2F0bV9taXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIxMTNjMwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9hdG0vYXRtX21pc2MuYwpAQCAtMCwwICsxLDEwNiBAQAorLyogbmV0L2F0bS9hdG1fbWlzYy5jIC0gVmFyaW91cyBmdW5jdGlvbnMgZm9yIHVzZSBieSBBVE0gZHJpdmVycyAqLworCisvKiBXcml0dGVuIDE5OTUtMjAwMCBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIEVQRkwgSUNBICovCisKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorCisKK2ludCBhdG1fY2hhcmdlKHN0cnVjdCBhdG1fdmNjICp2Y2MsaW50IHRydWVzaXplKQoreworCWF0bV9mb3JjZV9jaGFyZ2UodmNjLHRydWVzaXplKTsKKwlpZiAoYXRvbWljX3JlYWQoJnNrX2F0bSh2Y2MpLT5za19ybWVtX2FsbG9jKSA8PSBza19hdG0odmNjKS0+c2tfcmN2YnVmKQorCQlyZXR1cm4gMTsKKwlhdG1fcmV0dXJuKHZjYyx0cnVlc2l6ZSk7CisJYXRvbWljX2luYygmdmNjLT5zdGF0cy0+cnhfZHJvcCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RydWN0IHNrX2J1ZmYgKmF0bV9hbGxvY19jaGFyZ2Uoc3RydWN0IGF0bV92Y2MgKnZjYyxpbnQgcGR1X3NpemUsCisgICAgaW50IGdmcF9mbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBza19hdG0odmNjKTsKKwlpbnQgZ3Vlc3MgPSBhdG1fZ3Vlc3NfcGR1MnRydWVzaXplKHBkdV9zaXplKTsKKworCWF0bV9mb3JjZV9jaGFyZ2UodmNjLGd1ZXNzKTsKKwlpZiAoYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSA8PSBzay0+c2tfcmN2YnVmKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBhbGxvY19za2IocGR1X3NpemUsZ2ZwX2ZsYWdzKTsKKworCQlpZiAoc2tiKSB7CisJCQlhdG9taWNfYWRkKHNrYi0+dHJ1ZXNpemUtZ3Vlc3MsCisJCQkJICAgJnNrLT5za19ybWVtX2FsbG9jKTsKKwkJCXJldHVybiBza2I7CisJCX0KKwl9CisJYXRtX3JldHVybih2Y2MsZ3Vlc3MpOworCWF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnJ4X2Ryb3ApOworCXJldHVybiBOVUxMOworfQorCisKKy8qCisgKiBhdG1fcGNyX2dvYWwgcmV0dXJucyB0aGUgcG9zaXRpdmUgUENSIGlmIGl0IHNob3VsZCBiZSByb3VuZGVkIHVwLCB0aGUKKyAqIG5lZ2F0aXZlIFBDUiBpZiBpdCBzaG91bGQgYmUgcm91bmRlZCBkb3duLCBhbmQgemVybyBpZiB0aGUgbWF4aW11bSBhdmFpbGFibGUKKyAqIGJhbmR3aWR0aCBzaG91bGQgYmUgdXNlZC4KKyAqCisgKiBUaGUgcnVsZXMgYXJlIGFzIGZvbGxvd3MgKCogPSBtYXhpbXVtLCAtID0gYWJzZW50ICgwKSwgeCA9IHZhbHVlICJ4IiwKKyAqICh4KyA9IHggb3IgbmV4dCB2YWx1ZSBhYm92ZSB4LCB4LSA9IHggb3IgbmV4dCB2YWx1ZSBiZWxvdyk6CisgKgorICoJbWluIG1heCBwY3IJcmVzdWx0CQltaW4gbWF4IHBjcglyZXN1bHQKKyAqCS0gICAtICAgLQkqIChVQlIgb25seSkJeCAgIC0gICAtCXgrCisgKgktICAgLSAgICoJKgkJeCAgIC0gICAqCSoKKyAqCS0gICAtICAgegl6LQkJeCAgIC0gICB6CXotCisgKgktICAgKiAgIC0JKgkJeCAgICogICAtCXgrCisgKgktICAgKiAgICoJKgkJeCAgICogICAqCSoKKyAqCS0gICAqICAgegl6LQkJeCAgICogICB6CXotCisgKgktICAgeSAgIC0JeS0JCXggICB5ICAgLQl4KworICoJLSAgIHkgICAqCXktCQl4ICAgeSAgICoJeS0KKyAqCS0gICB5ICAgegl6LQkJeCAgIHkgICB6CXotCisgKgorICogQWxsIG5vbi1lcnJvciBjYXNlcyBjYW4gYmUgY29udmVydGVkIHdpdGggdGhlIGZvbGxvd2luZyBzaW1wbGUgc2V0IG9mIHJ1bGVzOgorICoKKyAqICAgaWYgcGNyID09IHogdGhlbiB6LQorICogICBlbHNlIGlmIG1pbiA9PSB4ICYmIHBjciA9PSAtIHRoZW4geCsKKyAqICAgICBlbHNlIGlmIG1heCA9PSB5IHRoZW4geS0KKyAqCSBlbHNlICoKKyAqLworCisKK2ludCBhdG1fcGNyX2dvYWwoc3RydWN0IGF0bV90cmFmcHJtICp0cCkKK3sKKwlpZiAodHAtPnBjciAmJiB0cC0+cGNyICE9IEFUTV9NQVhfUENSKSByZXR1cm4gLXRwLT5wY3I7CisJaWYgKHRwLT5taW5fcGNyICYmICF0cC0+cGNyKSByZXR1cm4gdHAtPm1pbl9wY3I7CisJaWYgKHRwLT5tYXhfcGNyICE9IEFUTV9NQVhfUENSKSByZXR1cm4gLXRwLT5tYXhfcGNyOworCXJldHVybiAwOworfQorCisKK3ZvaWQgc29uZXRfY29weV9zdGF0cyhzdHJ1Y3Qga19zb25ldF9zdGF0cyAqZnJvbSxzdHJ1Y3Qgc29uZXRfc3RhdHMgKnRvKQoreworI2RlZmluZSBfX0hBTkRMRV9JVEVNKGkpIHRvLT5pID0gYXRvbWljX3JlYWQoJmZyb20tPmkpCisJX19TT05FVF9JVEVNUworI3VuZGVmIF9fSEFORExFX0lURU0KK30KKworCit2b2lkIHNvbmV0X3N1YnRyYWN0X3N0YXRzKHN0cnVjdCBrX3NvbmV0X3N0YXRzICpmcm9tLHN0cnVjdCBzb25ldF9zdGF0cyAqdG8pCit7CisjZGVmaW5lIF9fSEFORExFX0lURU0oaSkgYXRvbWljX3N1Yih0by0+aSwmZnJvbS0+aSkKKwlfX1NPTkVUX0lURU1TCisjdW5kZWYgX19IQU5ETEVfSVRFTQorfQorCisKK0VYUE9SVF9TWU1CT0woYXRtX2NoYXJnZSk7CitFWFBPUlRfU1lNQk9MKGF0bV9hbGxvY19jaGFyZ2UpOworRVhQT1JUX1NZTUJPTChhdG1fcGNyX2dvYWwpOworRVhQT1JUX1NZTUJPTChzb25ldF9jb3B5X3N0YXRzKTsKK0VYUE9SVF9TWU1CT0woc29uZXRfc3VidHJhY3Rfc3RhdHMpOwpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9icjI2ODQuYyBiL25ldC9hdG0vYnIyNjg0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5NTRjZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9hdG0vYnIyNjg0LmMKQEAgLTAsMCArMSw4MjQgQEAKKy8qCitFeHBlcmltZW50YWwgZXRoZXJuZXQgbmV0ZGV2aWNlIHVzaW5nIEFUTSBBQUw1IGFzIHVuZGVybHlpbmcgY2FycmllcgorKFJGQzE0ODMgb2Jzb2xldGVkIGJ5IFJGQzI2ODQpIGZvciBMaW51eCAyLjQKK0F1dGhvcjogTWFyY2VsbCBHQUwsIDIwMDAsIFhEU0wgTHRkLCBIdW5nYXJ5CisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisjaW5jbHVkZSA8bGludXgvYXRtLmg+CisjaW5jbHVkZSA8bGludXgvYXRtZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2F0bWJyMjY4NC5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiaXBjb21tb24uaCIKKworLyoKKyAqIERlZmluZSB0aGlzIHRvIHVzZSBhIHZlcnNpb24gb2YgdGhlIGNvZGUgd2hpY2ggaW50ZXJhY3RzIHdpdGggdGhlIGhpZ2hlcgorICogbGF5ZXJzIGluIGEgbW9yZSBpbnRlbGxlZ2VudCB3YXksIGJ5IGFsd2F5cyByZXNlcnZpbmcgZW5vdWdoIHNwYWNlIGZvcgorICogb3VyIGhlYWRlciBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIHBhY2tldC4gIEhvd2V2ZXIsIHRoZXJlIG1heSBzdGlsbCBiZQorICogc29tZSBwcm9ibGVtcyB3aXRoIHByb2dyYW1zIGxpa2UgdGNwZHVtcC4gIEluIDIuNSB3ZSdsbCBzb3J0IG91dCB3aGF0CisgKiB3ZSBuZWVkIHRvIGRvIHRvIGdldCB0aGlzIHBlcmZlY3QuICBGb3Igbm93IHdlIGp1c3Qgd2lsbCBjb3B5IHRoZSBwYWNrZXQKKyAqIGlmIHdlIG5lZWQgc3BhY2UgZm9yIHRoZSBoZWFkZXIKKyAqLworLyogI2RlZmluZSBGQVNURVJfVkVSU0lPTiAqLworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgRFBSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHICJicjI2ODQ6ICIgZm9ybWF0LCAjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBEUFJJTlRLKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCisjaWZkZWYgU0tCX0RFQlVHCitzdGF0aWMgdm9pZCBza2JfZGVidWcoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyNkZWZpbmUgTlVNMlBSSU5UIDUwCisJY2hhciBidWZbTlVNMlBSSU5UICogMyArIDFdOwkvKiAzIGNoYXJzIHBlciBieXRlICovCisJaW50IGkgPSAwOworCWZvciAoaSA9IDA7IGkgPCBza2ItPmxlbiAmJiBpIDwgTlVNMlBSSU5UOyBpKyspIHsKKwkJc3ByaW50ZihidWYgKyBpICogMywgIiUyLjJ4ICIsIDB4ZmYgJiBza2ItPmRhdGFbaV0pOworCX0KKwlwcmludGsoS0VSTl9ERUJVRyAiYnIyNjg0OiBza2I6ICVzXG4iLCBidWYpOworfQorI2Vsc2UKKyNkZWZpbmUgc2tiX2RlYnVnKHNrYikJZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbGxjX291aV9waWRfcGFkW10gPQorICAgIHsgMHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHg4MCwgMHhDMiwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCB9OworI2RlZmluZSBQQURMRU4JKDIpCisKK2VudW0gYnIyNjg0X2VuY2FwcyB7CisJZV92YyAgPSBCUjI2ODRfRU5DQVBTX1ZDLAorCWVfbGxjID0gQlIyNjg0X0VOQ0FQU19MTEMsCit9OworCitzdHJ1Y3QgYnIyNjg0X3ZjYyB7CisJc3RydWN0IGF0bV92Y2MgICphdG12Y2M7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldmljZTsKKwkvKiBrZWVwIG9sZCBwdXNoLHBvcCBmdW5jdGlvbnMgZm9yIGNoYWluaW5nICovCisJdm9pZCAoKm9sZF9wdXNoKShzdHJ1Y3QgYXRtX3ZjYyAqdmNjLHN0cnVjdCBza19idWZmICpza2IpOworCS8qIHZvaWQgKCpvbGRfcG9wKShzdHJ1Y3QgYXRtX3ZjYyAqdmNjLHN0cnVjdCBza19idWZmICpza2IpOyAqLworCWVudW0gYnIyNjg0X2VuY2FwcyBlbmNhcHM7CisJc3RydWN0IGxpc3RfaGVhZCBicnZjY3M7CisjaWZkZWYgQ09ORklHX0FUTV9CUjI2ODRfSVBGSUxURVIKKwlzdHJ1Y3QgYnIyNjg0X2ZpbHRlciBmaWx0ZXI7CisjZW5kaWYgLyogQ09ORklHX0FUTV9CUjI2ODRfSVBGSUxURVIgKi8KKyNpZm5kZWYgRkFTVEVSX1ZFUlNJT04KKwl1bnNpZ25lZCBjb3BpZXNfbmVlZGVkLCBjb3BpZXNfZmFpbGVkOworI2VuZGlmIC8qIEZBU1RFUl9WRVJTSU9OICovCit9OworCitzdHJ1Y3QgYnIyNjg0X2RldiB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CisJc3RydWN0IGxpc3RfaGVhZCBicjI2ODRfZGV2czsKKwlpbnQgbnVtYmVyOworCXN0cnVjdCBsaXN0X2hlYWQgYnJ2Y2NzOyAvKiBvbmUgZGV2aWNlIDw9PiBvbmUgdmNjIChiZWZvcmUgeG1hcykgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlpbnQgbWFjX3dhc19zZXQ7Cit9OworCisvKgorICogVGhpcyBsb2NrIHNob3VsZCBiZSBoZWxkIGZvciB3cml0aW5nIGFueSB0aW1lIHRoZSBsaXN0IG9mIGRldmljZXMgb3IKKyAqIHRoZWlyIGF0dGFjaGVkIHZjYydzIGNvdWxkIGJlIGFsdGVyZWQuICBJdCBzaG91bGQgYmUgaGVsZCBmb3IgcmVhZGluZworICogYW55IHRpbWUgdGhlc2UgYXJlIGJlaW5nIHF1ZXJpZWQuICBOb3RlIHRoYXQgd2Ugc29tZXRpbWVzIG5lZWQgdG8KKyAqIGRvIHJlYWQtbG9ja2luZyB1bmRlciBpbnRlcnJ1cHQgY29udGV4dCwgc28gd3JpdGUgbG9ja2luZyBtdXN0IGJsb2NrCisgKiB0aGUgY3VycmVudCBDUFUncyBpbnRlcnJ1cHRzCisgKi8KK3N0YXRpYyBERUZJTkVfUldMT0NLKGRldnNfbG9jayk7CisKK3N0YXRpYyBMSVNUX0hFQUQoYnIyNjg0X2RldnMpOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicjI2ODRfZGV2ICpCUlBSSVYoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJcmV0dXJuIChzdHJ1Y3QgYnIyNjg0X2RldiAqKSBuZXRfZGV2LT5wcml2OworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXRfZGV2aWNlICpsaXN0X2VudHJ5X2JyZGV2KGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmxlKQoreworCXJldHVybiBsaXN0X2VudHJ5KGxlLCBzdHJ1Y3QgYnIyNjg0X2RldiwgYnIyNjg0X2RldnMpLT5uZXRfZGV2OworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicjI2ODRfdmNjICpCUjI2ODRfVkNDKGNvbnN0IHN0cnVjdCBhdG1fdmNjICphdG12Y2MpCit7CisJcmV0dXJuIChzdHJ1Y3QgYnIyNjg0X3ZjYyAqKSAoYXRtdmNjLT51c2VyX2JhY2spOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicjI2ODRfdmNjICpsaXN0X2VudHJ5X2JydmNjKGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmxlKQoreworCXJldHVybiBsaXN0X2VudHJ5KGxlLCBzdHJ1Y3QgYnIyNjg0X3ZjYywgYnJ2Y2NzKTsKK30KKworLyogQ2FsbGVyIHNob3VsZCBob2xkIHJlYWRfbG9jaygmZGV2c19sb2NrKSAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpicjI2ODRfZmluZF9kZXYoY29uc3Qgc3RydWN0IGJyMjY4NF9pZl9zcGVjICpzKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxoOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2OworCXN3aXRjaCAocy0+bWV0aG9kKSB7CisJY2FzZSBCUjI2ODRfRklORF9CWU5VTToKKwkJbGlzdF9mb3JfZWFjaChsaCwgJmJyMjY4NF9kZXZzKSB7CisJCQluZXRfZGV2ID0gbGlzdF9lbnRyeV9icmRldihsaCk7CisJCQlpZiAoQlJQUklWKG5ldF9kZXYpLT5udW1iZXIgPT0gcy0+c3BlYy5kZXZudW0pCisJCQkJcmV0dXJuIG5ldF9kZXY7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCUjI2ODRfRklORF9CWUlGTkFNRToKKwkJbGlzdF9mb3JfZWFjaChsaCwgJmJyMjY4NF9kZXZzKSB7CisJCQluZXRfZGV2ID0gbGlzdF9lbnRyeV9icmRldihsaCk7CisJCQlpZiAoIXN0cm5jbXAobmV0X2Rldi0+bmFtZSwgcy0+c3BlYy5pZm5hbWUsIElGTkFNU0laKSkKKwkJCQlyZXR1cm4gbmV0X2RldjsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBTZW5kIGEgcGFja2V0IG91dCBhIHBhcnRpY3VsYXIgdmNjLiAgTm90IHRvIHVzZWZ1bCByaWdodCBub3csIGJ1dCBwYXZlcworICogdGhlIHdheSBmb3IgbXVsdGlwbGUgdmNjJ3MgcGVyIGl0Zi4gIFJldHVybnMgdHJ1ZSBpZiB3ZSBjYW4gc2VuZCwKKyAqIG90aGVyd2lzZSBmYWxzZQorICovCitzdGF0aWMgaW50IGJyMjY4NF94bWl0X3ZjYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYnIyNjg0X2RldiAqYnJkZXYsCisJc3RydWN0IGJyMjY4NF92Y2MgKmJydmNjKQoreworCXN0cnVjdCBhdG1fdmNjICphdG12Y2M7CisjaWZkZWYgRkFTVEVSX1ZFUlNJT04KKwlpZiAoYnJ2Y2MtPmVuY2FwcyA9PSBlX2xsYykKKwkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgOCksIGxsY19vdWlfcGlkX3BhZCwgOCk7CisJLyogbGFzdCAyIGJ5dGVzIG9mIGxsY19vdWlfcGlkX3BhZCBhcmUgbWFuYWdlZCBieSBoZWFkZXIgcm91dGluZXM7CisJICAgeWVzLCB5b3UgZ290IGl0OiA4ICsgMiA9IHNpemVvZihsbGNfb3VpX3BpZF9wYWQpCisJICovCisjZWxzZQorCWludCBtaW5oZWFkcm9vbSA9IChicnZjYy0+ZW5jYXBzID09IGVfbGxjKSA/IDEwIDogMjsKKwlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCBtaW5oZWFkcm9vbSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IHNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwgbWluaGVhZHJvb20pOworCQlicnZjYy0+Y29waWVzX25lZWRlZCsrOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCWlmIChza2IyID09IE5VTEwpIHsKKwkJCWJydmNjLT5jb3BpZXNfZmFpbGVkKys7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlza2IgPSBza2IyOworCX0KKwlza2JfcHVzaChza2IsIG1pbmhlYWRyb29tKTsKKwlpZiAoYnJ2Y2MtPmVuY2FwcyA9PSBlX2xsYykKKwkJbWVtY3B5KHNrYi0+ZGF0YSwgbGxjX291aV9waWRfcGFkLCAxMCk7CisJZWxzZQorCQltZW1zZXQoc2tiLT5kYXRhLCAwLCAyKTsKKyNlbmRpZiAvKiBGQVNURVJfVkVSU0lPTiAqLworCXNrYl9kZWJ1Zyhza2IpOworCisJQVRNX1NLQihza2IpLT52Y2MgPSBhdG12Y2MgPSBicnZjYy0+YXRtdmNjOworCURQUklOVEsoImF0bV9za2IoJXApLT52Y2MoJXApLT5kZXYoJXApXG4iLCBza2IsIGF0bXZjYywgYXRtdmNjLT5kZXYpOworCWlmICghYXRtX21heV9zZW5kKGF0bXZjYywgc2tiLT50cnVlc2l6ZSkpIHsKKwkJLyogd2UgZnJlZSB0aGlzIGhlcmUgZm9yIG5vdywgYmVjYXVzZSB3ZSBjYW5ub3Qga25vdyBpbiBhIGhpZ2hlciAKKwkJCWxheWVyIHdoZXRoZXIgdGhlIHNrYiBwb2ludCBpdCBzdXBwbGllZCB3YXNuJ3QgZnJlZWQgeWV0LgorCQkJbm93LCBpdCBhbHdheXMgaXMuCisJCSovCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlhdG9taWNfYWRkKHNrYi0+dHJ1ZXNpemUsICZza19hdG0oYXRtdmNjKS0+c2tfd21lbV9hbGxvYyk7CisJQVRNX1NLQihza2IpLT5hdG1fb3B0aW9ucyA9IGF0bXZjYy0+YXRtX29wdGlvbnM7CisJYnJkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlicmRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJYXRtdmNjLT5zZW5kKGF0bXZjYywgc2tiKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnIyNjg0X3ZjYyAqcGlja19vdXRnb2luZ192Y2Moc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwlzdHJ1Y3QgYnIyNjg0X2RldiAqYnJkZXYpCit7CisJcmV0dXJuIGxpc3RfZW1wdHkoJmJyZGV2LT5icnZjY3MpID8gTlVMTCA6CisJICAgIGxpc3RfZW50cnlfYnJ2Y2MoYnJkZXYtPmJydmNjcy5uZXh0KTsgLyogMSB2Y2MvZGV2IHJpZ2h0IG5vdyAqLworfQorCitzdGF0aWMgaW50IGJyMjY4NF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJyMjY4NF9kZXYgKmJyZGV2ID0gQlJQUklWKGRldik7CisJc3RydWN0IGJyMjY4NF92Y2MgKmJydmNjOworCisJRFBSSU5USygiYnIyNjg0X3N0YXJ0X3htaXQsIHNrYi0+ZHN0PSVwXG4iLCBza2ItPmRzdCk7CisJcmVhZF9sb2NrKCZkZXZzX2xvY2spOworCWJydmNjID0gcGlja19vdXRnb2luZ192Y2Moc2tiLCBicmRldik7CisJaWYgKGJydmNjID09IE5VTEwpIHsKKwkJRFBSSU5USygibm8gdmNjIGF0dGFjaGVkIHRvIGRldiAlc1xuIiwgZGV2LT5uYW1lKTsKKwkJYnJkZXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQlicmRldi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJLyogbmV0aWZfc3RvcF9xdWV1ZShkZXYpOyAqLworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJlYWRfdW5sb2NrKCZkZXZzX2xvY2spOworCQlyZXR1cm4gLUVVTkFUQ0g7CisJfQorCWlmICghYnIyNjg0X3htaXRfdmNjKHNrYiwgYnJkZXYsIGJydmNjKSkgeworCQkvKgorCQkgKiBXZSBzaG91bGQgcHJvYmFibHkgdXNlIG5ldGlmXypfcXVldWUoKSBoZXJlLCBidXQgdGhhdAorCQkgKiBpbnZvbHZlcyBhZGRlZCBjb21wbGljYXRpb24uICBXZSBuZWVkIHRvIHdhbGsgYmVmb3JlCisJCSAqIHdlIGNhbiBydW4KKwkJICovCisJCS8qIGRvbid0IGZyZWUgaGVyZSEgdGhpcyBwb2ludGVyIG1pZ2h0IGJlIG5vIGxvbmdlciB2YWxpZCEKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQkqLworCQlicmRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJCWJyZGV2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCX0KKwlyZWFkX3VubG9jaygmZGV2c19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpicjI2ODRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJRFBSSU5USygiYnIyNjg0X2dldF9zdGF0c1xuIik7CisJcmV0dXJuICZCUlBSSVYoZGV2KS0+c3RhdHM7Cit9CisKKyNpZmRlZiBGQVNURVJfVkVSU0lPTgorLyoKKyAqIFRoZXNlIG1pcnJvciBldGhfaGVhZGVyIGFuZCBldGhfaGVhZGVyX2NhY2hlLiAgVGhleSBhcmUgbm90IHVzdWFsbHkKKyAqIGV4cG9ydGVkIGZvciB1c2UgaW4gbW9kdWxlcywgc28gd2UgZ3JhYiB0aGVtIGZyb20gbmV0X2RldmljZQorICogYWZ0ZXIgZXRoZXJfc2V0dXAoKSBpcyBkb25lIHdpdGggaXQuICBCaXQgb2YgYSBoYWNrLgorICovCitzdGF0aWMgaW50ICgqbXlfZXRoX2hlYWRlcikoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKiwKKwl1bnNpZ25lZCBzaG9ydCwgdm9pZCAqLCB2b2lkICosIHVuc2lnbmVkKTsKK3N0YXRpYyBpbnQgKCpteV9ldGhfaGVhZGVyX2NhY2hlKShzdHJ1Y3QgbmVpZ2hib3VyICosIHN0cnVjdCBoaF9jYWNoZSAqKTsKKworc3RhdGljIGludAorYnIyNjg0X2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCSAgICAgIHVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQgKmRhZGRyLCB2b2lkICpzYWRkciwgdW5zaWduZWQgbGVuKQoreworCXUxNiAqcGFkX2JlZm9yZV9ldGg7CisJaW50IHQgPSBteV9ldGhfaGVhZGVyKHNrYiwgZGV2LCB0eXBlLCBkYWRkciwgc2FkZHIsIGxlbik7CisJaWYgKHQgPiAwKSB7CisJCXBhZF9iZWZvcmVfZXRoID0gKHUxNiAqKSBza2JfcHVzaChza2IsIDIpOworCQkqcGFkX2JlZm9yZV9ldGggPSAwOworCQlyZXR1cm4gZGV2LT5oYXJkX2hlYWRlcl9sZW47CS8qIG9yIHJldHVybiAxNjsgPyAqLworCX0gZWxzZQorCQlyZXR1cm4gdDsKK30KKworc3RhdGljIGludAorYnIyNjg0X2hlYWRlcl9jYWNoZShzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgc3RydWN0IGhoX2NhY2hlICpoaCkKK3sKKy8qIGhoX2RhdGEgaXMgMTYgYnl0ZXMgbG9uZy4gaWYgZW5jYXBzIGlzIGV0aGVyLWxsYyB3ZSBuZWVkIDI0LCBzbworeG1pdCB3aWxsIGFkZCB0aGUgYWRkaXRpb25hbCBoZWFkZXIgcGFydCBpbiB0aGF0IGNhc2UgKi8KKwl1MTYgKnBhZF9iZWZvcmVfZXRoID0gKHUxNiAqKShoaC0+aGhfZGF0YSk7CisJaW50IHQgPSBteV9ldGhfaGVhZGVyX2NhY2hlKG5laWdoLCBoaCk7CisJRFBSSU5USygiYnIyNjg0X2hlYWRlcl9jYWNoZSwgbmVpZ2g9JXAsIGhoX2NhY2hlPSVwXG4iLCBuZWlnaCwgaGgpOworCWlmICh0IDwgMCkKKwkJcmV0dXJuIHQ7CisJZWxzZSB7CisJCSpwYWRfYmVmb3JlX2V0aCA9IDA7CisJCWhoLT5oaF9sZW4gPSBQQURMRU4gKyBFVEhfSExFTjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGlzIHNpbWlsYXIgdG8gZXRoX3R5cGVfdHJhbnMsIHdoaWNoIGNhbm5vdCBiZSB1c2VkIGJlY2F1c2Ugb2YKKyAqIG91ciBkZXYtPmhhcmRfaGVhZGVyX2xlbgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGJyX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV0aGhkciAqZXRoOworCXVuc2lnbmVkIGNoYXIgKnJhd3A7CisJZXRoID0gZXRoX2hkcihza2IpOworCisJaWYgKCpldGgtPmhfZGVzdCAmIDEpIHsKKwkJaWYgKG1lbWNtcChldGgtPmhfZGVzdCwgZGV2LT5icm9hZGNhc3QsIEVUSF9BTEVOKSA9PSAwKQorCQkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9CUk9BRENBU1Q7CisJCWVsc2UKKwkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfTVVMVElDQVNUOworCX0KKworCWVsc2UgaWYgKG1lbWNtcChldGgtPmhfZGVzdCwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pKQorCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKKworCWlmIChudG9ocyhldGgtPmhfcHJvdG8pID49IDE1MzYpCisJCXJldHVybiBldGgtPmhfcHJvdG87CisKKwlyYXdwID0gc2tiLT5kYXRhOworCisJLyoKKwkgKiBUaGlzIGlzIGEgbWFnaWMgaGFjayB0byBzcG90IElQWCBwYWNrZXRzLiBPbGRlciBOb3ZlbGwgYnJlYWtzCisJICogdGhlIHByb3RvY29sIGRlc2lnbiBhbmQgcnVucyBJUFggb3ZlciA4MDIuMyB3aXRob3V0IGFuIDgwMi4yIExMQworCSAqIGxheWVyLiBXZSBsb29rIGZvciBGRkZGIHdoaWNoIGlzbid0IGEgdXNlZCA4MDIuMiBTU0FQL0RTQVAuIFRoaXMKKwkgKiB3b24ndCB3b3JrIGZvciBmYXVsdCB0b2xlcmFudCBuZXR3YXJlIGJ1dCBkb2VzIGZvciB0aGUgcmVzdC4KKwkgKi8KKwlpZiAoKih1bnNpZ25lZCBzaG9ydCAqKSByYXdwID09IDB4RkZGRikKKwkJcmV0dXJuIGh0b25zKEVUSF9QXzgwMl8zKTsKKworCS8qCisJICogUmVhbCA4MDIuMiBMTEMKKwkgKi8KKwlyZXR1cm4gaHRvbnMoRVRIX1BfODAyXzIpOworfQorI2VuZGlmIC8qIEZBU1RFUl9WRVJTSU9OICovCisKKy8qCisgKiBXZSByZW1lbWJlciB3aGVuIHRoZSBNQUMgZ2V0cyBzZXQsIHNvIHdlIGRvbid0IG92ZXJyaWRlIGl0IGxhdGVyIHdpdGgKKyAqIHRoZSBFU0kgb2YgdGhlIEFUTSBjYXJkIG9mIHRoZSBmaXJzdCBWQworICovCitzdGF0aWMgaW50ICgqbXlfZXRoX21hY19hZGRyKShzdHJ1Y3QgbmV0X2RldmljZSAqLCB2b2lkICopOworc3RhdGljIGludCBicjI2ODRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCkKK3sKKwlpbnQgZXJyID0gbXlfZXRoX21hY19hZGRyKGRldiwgcCk7CisJaWYgKCFlcnIpCisJCUJSUFJJVihkZXYpLT5tYWNfd2FzX3NldCA9IDE7CisJcmV0dXJuIGVycjsKK30KKworI2lmZGVmIENPTkZJR19BVE1fQlIyNjg0X0lQRklMVEVSCisvKiB0aGlzIElPQ1RMIGlzIGV4cGVyaW1lbnRhbC4gKi8KK3N0YXRpYyBpbnQgYnIyNjg0X3NldGZpbHQoc3RydWN0IGF0bV92Y2MgKmF0bXZjYywgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgYnIyNjg0X3ZjYyAqYnJ2Y2M7CisJc3RydWN0IGJyMjY4NF9maWx0ZXJfc2V0IGZzOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZmcywgYXJnLCBzaXplb2YgZnMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoZnMuaWZzcGVjLm1ldGhvZCAhPSBCUjI2ODRfRklORF9CWU5PVEhJTkcpIHsKKwkJLyoKKwkJICogVGhpcyBpcyByZWFsbHkgYSBwZXItdmNjIHRoaW5nLCBidXQgd2UgY2FuIGFsc28gc2VhcmNoCisJCSAqIGJ5IGRldmljZQorCQkgKi8KKwkJc3RydWN0IGJyMjY4NF9kZXYgKmJyZGV2OworCQlyZWFkX2xvY2soJmRldnNfbG9jayk7CisJCWJyZGV2ID0gQlJQUklWKGJyMjY4NF9maW5kX2RldigmZnMuaWZzcGVjKSk7CisJCWlmIChicmRldiA9PSBOVUxMIHx8IGxpc3RfZW1wdHkoJmJyZGV2LT5icnZjY3MpIHx8CisJCSAgICBicmRldi0+YnJ2Y2NzLm5leHQgIT0gYnJkZXYtPmJydmNjcy5wcmV2KSAgLyogPjEgVkNDICovCisJCQlicnZjYyA9IE5VTEw7CisJCWVsc2UKKwkJCWJydmNjID0gbGlzdF9lbnRyeV9icnZjYyhicmRldi0+YnJ2Y2NzLm5leHQpOworCQlyZWFkX3VubG9jaygmZGV2c19sb2NrKTsKKwkJaWYgKGJydmNjID09IE5VTEwpCisJCQlyZXR1cm4gLUVTUkNIOworCX0gZWxzZQorCQlicnZjYyA9IEJSMjY4NF9WQ0MoYXRtdmNjKTsKKwltZW1jcHkoJmJydmNjLT5maWx0ZXIsICZmcy5maWx0ZXIsIHNpemVvZihicnZjYy0+ZmlsdGVyKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybnMgMSBpZiBwYWNrZXQgc2hvdWxkIGJlIGRyb3BwZWQgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitwYWNrZXRfZmFpbHNfZmlsdGVyKHUxNiB0eXBlLCBzdHJ1Y3QgYnIyNjg0X3ZjYyAqYnJ2Y2MsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKGJydmNjLT5maWx0ZXIubmV0bWFzayA9PSAwKQorCQlyZXR1cm4gMDsJCQkvKiBubyBmaWx0ZXIgaW4gcGxhY2UgKi8KKwlpZiAodHlwZSA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKSAmJgorCSAgICAoKChzdHJ1Y3QgaXBoZHIgKikgKHNrYi0+ZGF0YSkpLT5kYWRkciAmIGJydmNjLT5maWx0ZXIuCisJICAgICBuZXRtYXNrKSA9PSBicnZjYy0+ZmlsdGVyLnByZWZpeCkKKwkJcmV0dXJuIDA7CisJaWYgKHR5cGUgPT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9BUlApKQorCQlyZXR1cm4gMDsKKwkvKiBUT0RPOiB3ZSBzaG91bGQgcHJvYmFibHkgZmlsdGVyIEFSUHMgdG9vLi4gZG9uJ3Qgd2FudCB0byBoYXZlCisJICogICB0aGVtIHJldHVybmluZyB2YWx1ZXMgdGhhdCBkb24ndCBtYWtlIHNlbnNlLCBvciBpcyB0aGF0IG9rPworCSAqLworCXJldHVybiAxOwkJLyogZHJvcCAqLworfQorI2VuZGlmIC8qIENPTkZJR19BVE1fQlIyNjg0X0lQRklMVEVSICovCisKK3N0YXRpYyB2b2lkIGJyMjY4NF9jbG9zZV92Y2Moc3RydWN0IGJyMjY4NF92Y2MgKmJydmNjKQoreworCURQUklOVEsoInJlbW92aW5nIFZDQyAlcCBmcm9tIGRldiAlcFxuIiwgYnJ2Y2MsIGJydmNjLT5kZXZpY2UpOworCXdyaXRlX2xvY2tfaXJxKCZkZXZzX2xvY2spOworCWxpc3RfZGVsKCZicnZjYy0+YnJ2Y2NzKTsKKwl3cml0ZV91bmxvY2tfaXJxKCZkZXZzX2xvY2spOworCWJydmNjLT5hdG12Y2MtPnVzZXJfYmFjayA9IE5VTEw7CS8qIHdoYXQgYWJvdXQgdmNjLT5yZWN2cSA/Pz8gKi8KKwlicnZjYy0+b2xkX3B1c2goYnJ2Y2MtPmF0bXZjYywgTlVMTCk7CS8qIHBhc3Mgb24gdGhlIGJhZCBuZXdzICovCisJa2ZyZWUoYnJ2Y2MpOworCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworfQorCisvKiB3aGVuIEFBTDUgUERVIGNvbWVzIGluOiAqLworc3RhdGljIHZvaWQgYnIyNjg0X3B1c2goc3RydWN0IGF0bV92Y2MgKmF0bXZjYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgYnIyNjg0X3ZjYyAqYnJ2Y2MgPSBCUjI2ODRfVkNDKGF0bXZjYyk7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBicnZjYy0+ZGV2aWNlOworCXN0cnVjdCBicjI2ODRfZGV2ICpicmRldiA9IEJSUFJJVihuZXRfZGV2KTsKKwlpbnQgcGxlbiA9IHNpemVvZihsbGNfb3VpX3BpZF9wYWQpICsgRVRIX0hMRU47CisKKwlEUFJJTlRLKCJicjI2ODRfcHVzaFxuIik7CisKKwlpZiAodW5saWtlbHkoc2tiID09IE5VTEwpKSB7CisJCS8qIHNrYj09TlVMTCBtZWFucyBWQ0MgaXMgYmVpbmcgZGVzdHJveWVkICovCisJCWJyMjY4NF9jbG9zZV92Y2MoYnJ2Y2MpOworCQlpZiAobGlzdF9lbXB0eSgmYnJkZXYtPmJydmNjcykpIHsKKwkJCXJlYWRfbG9jaygmZGV2c19sb2NrKTsKKwkJCWxpc3RfZGVsKCZicmRldi0+YnIyNjg0X2RldnMpOworCQkJcmVhZF91bmxvY2soJmRldnNfbG9jayk7CisJCQl1bnJlZ2lzdGVyX25ldGRldihuZXRfZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KG5ldF9kZXYpOworCQl9CisJCXJldHVybjsKKwl9CisKKwlza2JfZGVidWcoc2tiKTsKKwlhdG1fcmV0dXJuKGF0bXZjYywgc2tiLT50cnVlc2l6ZSk7CisJRFBSSU5USygic2tiIGZyb20gYnJkZXYgJXBcbiIsIGJyZGV2KTsKKwlpZiAoYnJ2Y2MtPmVuY2FwcyA9PSBlX2xsYykgeworCQkvKiBsZXQgdXMgd2FzdGUgc29tZSB0aW1lIGZvciBjaGVja2luZyB0aGUgZW5jYXBzdWxhdGlvbi4KKwkJICAgTm90ZSwgdGhhdCBvbmx5IDcgY2hhciBpcyBjaGVja2VkIHNvIGZyYW1lcyB3aXRoIGEgdmFsaWQgRkNTCisJCSAgIGFyZSBhbHNvIGFjY2VwdGVkIChidXQgRkNTIGlzIG5vdCBjaGVja2VkIG9mIGNvdXJzZSkgKi8KKwkJaWYgKG1lbWNtcChza2ItPmRhdGEsIGxsY19vdWlfcGlkX3BhZCwgNykpIHsKKwkJCWJyZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIFN0cmlwIEZDUyBpZiBwcmVzZW50ICovCisJCWlmIChza2ItPmxlbiA+IDcgJiYgc2tiLT5kYXRhWzddID09IDB4MDEpCisJCQlfX3NrYl90cmltKHNrYiwgc2tiLT5sZW4gLSA0KTsKKwl9IGVsc2UgeworCQlwbGVuID0gUEFETEVOICsgRVRIX0hMRU47CS8qIHBhZCwgZHN0bWFjLHNyY21hYywgZXRodHlwZSAqLworCQkvKiBmaXJzdCAyIGNoYXJzIHNob3VsZCBiZSAwICovCisJCWlmICgqKCh1MTYgKikgKHNrYi0+ZGF0YSkpICE9IDApIHsKKwkJCWJyZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlpZiAoc2tiLT5sZW4gPCBwbGVuKSB7CisJCWJyZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJZGV2X2tmcmVlX3NrYihza2IpOwkvKiBkZXZfIG5vdCBuZWVkZWQ/ICovCisJCXJldHVybjsKKwl9CisKKyNpZmRlZiBGQVNURVJfVkVSU0lPTgorCS8qIEZJWE1FOiB0Y3BkdW1wIHNob3dzIHRoYXQgcG9pbnRlciB0byBtYWMgaGVhZGVyIGlzIDIgYnl0ZXMgZWFybGllciwKKwkgICB0aGFuIHNob3VsZCBiZS4gV2hhdCBlbHNlIHNob3VsZCBJIHNldD8gKi8KKwlza2JfcHVsbChza2IsIHBsZW4pOworCXNrYi0+bWFjLnJhdyA9ICgoY2hhciAqKSAoc2tiLT5kYXRhKSkgLSBFVEhfSExFTjsKKwlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CisjaWZkZWYgQ09ORklHX0JSMjY4NF9GQVNUX1RSQU5TCisJc2tiLT5wcm90b2NvbCA9ICgodTE2ICopIHNrYi0+ZGF0YSlbLTFdOworI2Vsc2UJCQkJLyogc29tZSBwcm90b2NvbHMgbWlnaHQgcmVxdWlyZSB0aGlzOiAqLworCXNrYi0+cHJvdG9jb2wgPSBicl90eXBlX3RyYW5zKHNrYiwgbmV0X2Rldik7CisjZW5kaWYgLyogQ09ORklHX0JSMjY4NF9GQVNUX1RSQU5TICovCisjZWxzZQorCXNrYl9wdWxsKHNrYiwgcGxlbiAtIEVUSF9ITEVOKTsKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBuZXRfZGV2KTsKKyNlbmRpZiAvKiBGQVNURVJfVkVSU0lPTiAqLworI2lmZGVmIENPTkZJR19BVE1fQlIyNjg0X0lQRklMVEVSCisJaWYgKHVubGlrZWx5KHBhY2tldF9mYWlsc19maWx0ZXIoc2tiLT5wcm90b2NvbCwgYnJ2Y2MsIHNrYikpKSB7CisJCWJyZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZiAvKiBDT05GSUdfQVRNX0JSMjY4NF9JUEZJTFRFUiAqLworCXNrYi0+ZGV2ID0gbmV0X2RldjsKKwlBVE1fU0tCKHNrYiktPnZjYyA9IGF0bXZjYzsJLyogbmVlZGVkID8gKi8KKwlEUFJJTlRLKCJyZWNlaXZlZCBwYWNrZXQncyBwcm90b2NvbDogJXhcbiIsIG50b2hzKHNrYi0+cHJvdG9jb2wpKTsKKwlza2JfZGVidWcoc2tiKTsKKwlpZiAodW5saWtlbHkoIShuZXRfZGV2LT5mbGFncyAmIElGRl9VUCkpKSB7CisJCS8qIHNpZ2gsIGludGVyZmFjZSBpcyBkb3duICovCisJCWJyZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKwlicmRldi0+c3RhdHMucnhfcGFja2V0cysrOworCWJyZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwltZW1zZXQoQVRNX1NLQihza2IpLCAwLCBzaXplb2Yoc3RydWN0IGF0bV9za2JfZGF0YSkpOworCW5ldGlmX3J4KHNrYik7Cit9CisKK3N0YXRpYyBpbnQgYnIyNjg0X3JlZ3ZjYyhzdHJ1Y3QgYXRtX3ZjYyAqYXRtdmNjLCB2b2lkIF9fdXNlciAqYXJnKQoreworLyogYXNzaWduIGEgdmNjIHRvIGEgZGV2CitOb3RlOiB3ZSBkbyBub3QgaGF2ZSBleHBsaWNpdCB1bmFzc2lnbiwgYnV0IGxvb2sgYXQgX3B1c2goKQorKi8KKwlpbnQgZXJyOworCXN0cnVjdCBicjI2ODRfdmNjICpicnZjYzsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGNvcHk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgYnIyNjg0X2RldiAqYnJkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CisJc3RydWN0IGF0bV9iYWNrZW5kX2JyMjY4NCBiZTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmYmUsIGFyZywgc2l6ZW9mIGJlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJYnJ2Y2MgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYnIyNjg0X3ZjYyksIEdGUF9LRVJORUwpOworCWlmICghYnJ2Y2MpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChicnZjYywgMCwgc2l6ZW9mKHN0cnVjdCBicjI2ODRfdmNjKSk7CisJd3JpdGVfbG9ja19pcnEoJmRldnNfbG9jayk7CisJbmV0X2RldiA9IGJyMjY4NF9maW5kX2RldigmYmUuaWZzcGVjKTsKKwlpZiAobmV0X2RldiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgImJyMjY4NDogdHJpZWQgdG8gYXR0YWNoIHRvIG5vbi1leGlzdGFudCBkZXZpY2VcbiIpOworCQllcnIgPSAtRU5YSU87CisJCWdvdG8gZXJyb3I7CisJfQorCWJyZGV2ID0gQlJQUklWKG5ldF9kZXYpOworCWlmIChhdG12Y2MtPnB1c2ggPT0gTlVMTCkgeworCQllcnIgPSAtRUJBREZEOworCQlnb3RvIGVycm9yOworCX0KKwlpZiAoIWxpc3RfZW1wdHkoJmJyZGV2LT5icnZjY3MpKSB7CisJCS8qIE9ubHkgMSBWQ0MvZGV2IHJpZ2h0IG5vdyAqLworCQllcnIgPSAtRUVYSVNUOworCQlnb3RvIGVycm9yOworCX0KKwlpZiAoYmUuZmNzX2luICE9IEJSMjY4NF9GQ1NJTl9OTyB8fCBiZS5mY3Nfb3V0ICE9IEJSMjY4NF9GQ1NPVVRfTk8gfHwKKwkgICAgYmUuZmNzX2F1dG8gfHwgYmUuaGFzX3ZwaWlkIHx8IGJlLnNlbmRfcGFkZGluZyB8fCAoYmUuZW5jYXBzICE9CisJICAgIEJSMjY4NF9FTkNBUFNfVkMgJiYgYmUuZW5jYXBzICE9IEJSMjY4NF9FTkNBUFNfTExDKSB8fAorCSAgICBiZS5taW5fc2l6ZSAhPSAwKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorCURQUklOVEsoImJyMjY4NF9yZWd2Y2MgdmNjPSVwLCBlbmNhcHM9JWQsIGJydmNjPSVwXG4iLCBhdG12Y2MsIGJlLmVuY2FwcywKKwkJYnJ2Y2MpOworCWlmIChsaXN0X2VtcHR5KCZicmRldi0+YnJ2Y2NzKSAmJiAhYnJkZXYtPm1hY193YXNfc2V0KSB7CisJCXVuc2lnbmVkIGNoYXIgKmVzaSA9IGF0bXZjYy0+ZGV2LT5lc2k7CisJCWlmIChlc2lbMF0gfCBlc2lbMV0gfCBlc2lbMl0gfCBlc2lbM10gfCBlc2lbNF0gfCBlc2lbNV0pCisJCQltZW1jcHkobmV0X2Rldi0+ZGV2X2FkZHIsIGVzaSwgbmV0X2Rldi0+YWRkcl9sZW4pOworCQllbHNlCisJCQluZXRfZGV2LT5kZXZfYWRkclsyXSA9IDE7CisJfQorCWxpc3RfYWRkKCZicnZjYy0+YnJ2Y2NzLCAmYnJkZXYtPmJydmNjcyk7CisJd3JpdGVfdW5sb2NrX2lycSgmZGV2c19sb2NrKTsKKwlicnZjYy0+ZGV2aWNlID0gbmV0X2RldjsKKwlicnZjYy0+YXRtdmNjID0gYXRtdmNjOworCWF0bXZjYy0+dXNlcl9iYWNrID0gYnJ2Y2M7CisJYnJ2Y2MtPmVuY2FwcyA9IChlbnVtIGJyMjY4NF9lbmNhcHMpIGJlLmVuY2FwczsKKwlicnZjYy0+b2xkX3B1c2ggPSBhdG12Y2MtPnB1c2g7CisJYmFycmllcigpOworCWF0bXZjYy0+cHVzaCA9IGJyMjY4NF9wdXNoOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNvcHkpOworCXNrYl9taWdyYXRlKCZza19hdG0oYXRtdmNjKS0+c2tfcmVjZWl2ZV9xdWV1ZSwgJmNvcHkpOworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmNvcHkpKSAhPSBOVUxMKSB7CisJCUJSUFJJVihza2ItPmRldiktPnN0YXRzLnJ4X2J5dGVzIC09IHNrYi0+bGVuOworCQlCUlBSSVYoc2tiLT5kZXYpLT5zdGF0cy5yeF9wYWNrZXRzLS07CisJCWJyMjY4NF9wdXNoKGF0bXZjYywgc2tiKTsKKwl9CisJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKwlyZXR1cm4gMDsKKyAgICBlcnJvcjoKKwl3cml0ZV91bmxvY2tfaXJxKCZkZXZzX2xvY2spOworCWtmcmVlKGJydmNjKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBicjI2ODRfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgYnIyNjg0X2RldiAqYnJkZXYgPSBCUlBSSVYobmV0ZGV2KTsKKworCWV0aGVyX3NldHVwKG5ldGRldik7CisJYnJkZXYtPm5ldF9kZXYgPSBuZXRkZXY7CisKKyNpZmRlZiBGQVNURVJfVkVSU0lPTgorCW15X2V0aF9oZWFkZXIgPSBuZXRkZXYtPmhhcmRfaGVhZGVyOworCW5ldGRldi0+aGFyZF9oZWFkZXIgPSBicjI2ODRfaGVhZGVyOworCW15X2V0aF9oZWFkZXJfY2FjaGUgPSBuZXRkZXYtPmhhcmRfaGVhZGVyX2NhY2hlOworCW5ldGRldi0+aGFyZF9oZWFkZXJfY2FjaGUgPSBicjI2ODRfaGVhZGVyX2NhY2hlOworCW5ldGRldi0+aGFyZF9oZWFkZXJfbGVuID0gc2l6ZW9mKGxsY19vdWlfcGlkX3BhZCkgKyBFVEhfSExFTjsJLyogMTAgKyAxNCAqLworI2VuZGlmCisJbXlfZXRoX21hY19hZGRyID0gbmV0ZGV2LT5zZXRfbWFjX2FkZHJlc3M7CisJbmV0ZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBicjI2ODRfbWFjX2FkZHI7CisJbmV0ZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBicjI2ODRfc3RhcnRfeG1pdDsKKwluZXRkZXYtPmdldF9zdGF0cyA9IGJyMjY4NF9nZXRfc3RhdHM7CisKKwlJTklUX0xJU1RfSEVBRCgmYnJkZXYtPmJydmNjcyk7Cit9CisKK3N0YXRpYyBpbnQgYnIyNjg0X2NyZWF0ZSh2b2lkIF9fdXNlciAqYXJnKQoreworCWludCBlcnI7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgYnIyNjg0X2RldiAqYnJkZXY7CisJc3RydWN0IGF0bV9uZXdpZl9icjI2ODQgbmk7CisKKwlEUFJJTlRLKCJicjI2ODRfY3JlYXRlXG4iKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbmksIGFyZywgc2l6ZW9mIG5pKSkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJaWYgKG5pLm1lZGlhICE9IEJSMjY4NF9NRURJQV9FVEhFUk5FVCB8fCBuaS5tdHUgIT0gMTUwMCkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwluZXRkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBicjI2ODRfZGV2KSwKKwkJCSAgICAgIG5pLmlmbmFtZVswXSA/IG5pLmlmbmFtZSA6ICJuYXMlZCIsCisJCQkgICAgICBicjI2ODRfc2V0dXApOworCWlmICghbmV0ZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWJyZGV2ID0gQlJQUklWKG5ldGRldik7CisKKwlEUFJJTlRLKCJyZWdpc3RlcmVkIG5ldGRldiAlc1xuIiwgbmV0ZGV2LT5uYW1lKTsKKwkvKiBvcGVuLCBzdG9wLCBkb19pb2N0bCA/ICovCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisJaWYgKGVyciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJicjI2ODRfY3JlYXRlOiByZWdpc3Rlcl9uZXRkZXYgZmFpbGVkXG4iKTsKKwkJZnJlZV9uZXRkZXYobmV0ZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwl3cml0ZV9sb2NrX2lycSgmZGV2c19sb2NrKTsKKwlicmRldi0+bnVtYmVyID0gbGlzdF9lbXB0eSgmYnIyNjg0X2RldnMpID8gMSA6CisJICAgIEJSUFJJVihsaXN0X2VudHJ5X2JyZGV2KGJyMjY4NF9kZXZzLnByZXYpKS0+bnVtYmVyICsgMTsKKwlsaXN0X2FkZF90YWlsKCZicmRldi0+YnIyNjg0X2RldnMsICZicjI2ODRfZGV2cyk7CisJd3JpdGVfdW5sb2NrX2lycSgmZGV2c19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgaGFuZGxlcyBpb2N0bHMgYWN0dWFsbHkgcGVyZm9ybWVkIG9uIG91ciB2Y2MgLSB3ZSBtdXN0IHJldHVybgorICogLUVOT0lPQ1RMQ01EIGZvciBhbnkgdW5yZWNvZ25pemVkIGlvY3RsCisgKi8KK3N0YXRpYyBpbnQgYnIyNjg0X2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBjbWQsCisJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGF0bV92Y2MgKmF0bXZjYyA9IEFUTV9TRChzb2NrKTsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCWludCBlcnI7CisJc3dpdGNoKGNtZCkgeworCWNhc2UgQVRNX1NFVEJBQ0tFTkQ6CisJY2FzZSBBVE1fTkVXQkFDS0VORElGOiB7CisJCWF0bV9iYWNrZW5kX3QgYjsKKwkJZXJyID0gZ2V0X3VzZXIoYiwgKGF0bV9iYWNrZW5kX3QgX191c2VyICopIGFyZ3ApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChiICE9IEFUTV9CQUNLRU5EX0JSMjY4NCkKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChjbWQgPT0gQVRNX1NFVEJBQ0tFTkQpCisJCQlyZXR1cm4gYnIyNjg0X3JlZ3ZjYyhhdG12Y2MsIGFyZ3ApOworCQllbHNlCisJCQlyZXR1cm4gYnIyNjg0X2NyZWF0ZShhcmdwKTsKKwkJfQorI2lmZGVmIENPTkZJR19BVE1fQlIyNjg0X0lQRklMVEVSCisJY2FzZSBCUjI2ODRfU0VURklMVDoKKwkJaWYgKGF0bXZjYy0+cHVzaCAhPSBicjI2ODRfcHVzaCkKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWVyciA9IGJyMjY4NF9zZXRmaWx0KGF0bXZjYywgYXJncCk7CisJCXJldHVybiBlcnI7CisjZW5kaWYgLyogQ09ORklHX0FUTV9CUjI2ODRfSVBGSUxURVIgKi8KKwl9CisJcmV0dXJuIC1FTk9JT0NUTENNRDsKK30KKworc3RhdGljIHN0cnVjdCBhdG1faW9jdGwgYnIyNjg0X2lvY3RsX29wcyA9IHsKKwkub3duZXIJPSBUSElTX01PRFVMRSwKKwkuaW9jdGwJPSBicjI2ODRfaW9jdGwsCit9OworCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIHZvaWQgKmJyMjY4NF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCWxvZmZfdCBvZmZzID0gMDsKKwlzdHJ1Y3QgYnIyNjg0X2RldiAqYnJkOworCisJcmVhZF9sb2NrKCZkZXZzX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShicmQsICZicjI2ODRfZGV2cywgYnIyNjg0X2RldnMpIHsKKwkJaWYgKG9mZnMgPT0gKnBvcykKKwkJCXJldHVybiBicmQ7CisJCSsrb2ZmczsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICpicjI2ODRfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBicjI2ODRfZGV2ICpicmQgPSB2OworCisJKysqcG9zOworCisJYnJkID0gbGlzdF9lbnRyeShicmQtPmJyMjY4NF9kZXZzLm5leHQsIAorCQkJIHN0cnVjdCBicjI2ODRfZGV2LCBicjI2ODRfZGV2cyk7CisJcmV0dXJuICgmYnJkLT5icjI2ODRfZGV2cyAhPSAmYnIyNjg0X2RldnMpID8gYnJkIDogTlVMTDsKK30KKworc3RhdGljIHZvaWQgYnIyNjg0X3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXJlYWRfdW5sb2NrKCZkZXZzX2xvY2spOworfQorCitzdGF0aWMgaW50IGJyMjY4NF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwljb25zdCBzdHJ1Y3QgYnIyNjg0X2RldiAqYnJkZXYgPSB2OworCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gYnJkZXYtPm5ldF9kZXY7CisJY29uc3Qgc3RydWN0IGJyMjY4NF92Y2MgKmJydmNjOworCisJc2VxX3ByaW50ZihzZXEsICJkZXYgJS4xNnM6IG51bT0lZCwgbWFjPSUwMlg6JTAyWDoiCisJCSAgICAgICAiJTAyWDolMDJYOiUwMlg6JTAyWCAoJXMpXG4iLCBuZXRfZGV2LT5uYW1lLAorCQkgICAgICAgYnJkZXYtPm51bWJlciwKKwkJICAgICAgIG5ldF9kZXYtPmRldl9hZGRyWzBdLAorCQkgICAgICAgbmV0X2Rldi0+ZGV2X2FkZHJbMV0sCisJCSAgICAgICBuZXRfZGV2LT5kZXZfYWRkclsyXSwKKwkJICAgICAgIG5ldF9kZXYtPmRldl9hZGRyWzNdLAorCQkgICAgICAgbmV0X2Rldi0+ZGV2X2FkZHJbNF0sCisJCSAgICAgICBuZXRfZGV2LT5kZXZfYWRkcls1XSwKKwkJICAgICAgIGJyZGV2LT5tYWNfd2FzX3NldCA/ICJzZXQiIDogImF1dG8iKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYnJ2Y2MsICZicmRldi0+YnJ2Y2NzLCBicnZjY3MpIHsKKwkJc2VxX3ByaW50ZihzZXEsICIgIHZjYyAlZC4lZC4lZDogZW5jYXBzPSVzIgorI2lmbmRlZiBGQVNURVJfVkVSU0lPTgorCQkJCSAgICAiLCBmYWlsZWQgY29waWVzICV1LyV1IgorI2VuZGlmIC8qIEZBU1RFUl9WRVJTSU9OICovCisJCQkJICAgICJcbiIsIGJydmNjLT5hdG12Y2MtPmRldi0+bnVtYmVyLAorCQkJCSAgICBicnZjYy0+YXRtdmNjLT52cGksIGJydmNjLT5hdG12Y2MtPnZjaSwKKwkJCQkgICAgKGJydmNjLT5lbmNhcHMgPT0gZV9sbGMpID8gIkxMQyIgOiAiVkMiCisjaWZuZGVmIEZBU1RFUl9WRVJTSU9OCisJCQkJICAgICwgYnJ2Y2MtPmNvcGllc19mYWlsZWQKKwkJCQkgICAgLCBicnZjYy0+Y29waWVzX25lZWRlZAorI2VuZGlmIC8qIEZBU1RFUl9WRVJTSU9OICovCisJCQkJICAgICk7CisjaWZkZWYgQ09ORklHX0FUTV9CUjI2ODRfSVBGSUxURVIKKyNkZWZpbmUgYjEodmFyLCBieXRlKQkoKHU4ICopICZicnZjYy0+ZmlsdGVyLnZhcilbYnl0ZV0KKyNkZWZpbmUgYnModmFyKQkJYjEodmFyLCAwKSwgYjEodmFyLCAxKSwgYjEodmFyLCAyKSwgYjEodmFyLCAzKQorCQkJaWYgKGJydmNjLT5maWx0ZXIubmV0bWFzayAhPSAwKQorCQkJCXNlcV9wcmludGYoc2VxLCAiICAgIGZpbHRlcj0lZC4lZC4lZC4lZC8iCisJCQkJCQkiJWQuJWQuJWQuJWRcbiIsCisJCQkJCQlicyhwcmVmaXgpLCBicyhuZXRtYXNrKSk7CisjdW5kZWYgYnMKKyN1bmRlZiBiMQorI2VuZGlmIC8qIENPTkZJR19BVE1fQlIyNjg0X0lQRklMVEVSICovCisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGJyMjY4NF9zZXFfb3BzID0geworCS5zdGFydCA9IGJyMjY4NF9zZXFfc3RhcnQsCisJLm5leHQgID0gYnIyNjg0X3NlcV9uZXh0LAorCS5zdG9wICA9IGJyMjY4NF9zZXFfc3RvcCwKKwkuc2hvdyAgPSBicjI2ODRfc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IGJyMjY4NF9wcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZicjI2ODRfc2VxX29wcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJyMjY4NF9wcm9jX29wcyA9IHsKKwkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gYnIyNjg0X3Byb2Nfb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworCitleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICphdG1fcHJvY19yb290OwkvKiBmcm9tIHByb2MuYyAqLworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IGJyMjY4NF9pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnA7CisJaWYgKChwID0gY3JlYXRlX3Byb2NfZW50cnkoImJyMjY4NCIsIDAsIGF0bV9wcm9jX3Jvb3QpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwLT5wcm9jX2ZvcHMgPSAmYnIyNjg0X3Byb2Nfb3BzOworI2VuZGlmCisJcmVnaXN0ZXJfYXRtX2lvY3RsKCZicjI2ODRfaW9jdGxfb3BzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGJyMjY4NF9leGl0KHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CisJc3RydWN0IGJyMjY4NF9kZXYgKmJyZGV2OworCXN0cnVjdCBicjI2ODRfdmNjICpicnZjYzsKKwlkZXJlZ2lzdGVyX2F0bV9pb2N0bCgmYnIyNjg0X2lvY3RsX29wcyk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXJlbW92ZV9wcm9jX2VudHJ5KCJicjI2ODQiLCBhdG1fcHJvY19yb290KTsKKyNlbmRpZgorCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZicjI2ODRfZGV2cykpIHsKKwkJbmV0X2RldiA9IGxpc3RfZW50cnlfYnJkZXYoYnIyNjg0X2RldnMubmV4dCk7CisJCWJyZGV2ID0gQlJQUklWKG5ldF9kZXYpOworCQl3aGlsZSAoIWxpc3RfZW1wdHkoJmJyZGV2LT5icnZjY3MpKSB7CisJCQlicnZjYyA9IGxpc3RfZW50cnlfYnJ2Y2MoYnJkZXYtPmJydmNjcy5uZXh0KTsKKwkJCWJyMjY4NF9jbG9zZV92Y2MoYnJ2Y2MpOworCQl9CisKKwkJbGlzdF9kZWwoJmJyZGV2LT5icjI2ODRfZGV2cyk7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldF9kZXYpOworCQlmcmVlX25ldGRldihuZXRfZGV2KTsKKwl9Cit9CisKK21vZHVsZV9pbml0KGJyMjY4NF9pbml0KTsKK21vZHVsZV9leGl0KGJyMjY4NF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWFyY2VsbCBHQUwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUkZDMjY4NCBicmlkZ2VkIHByb3RvY29scyBvdmVyIEFUTS9BQUw1Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvYXRtL2NsaXAuYyBiL25ldC9hdG0vY2xpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZGFiNTUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYXRtL2NsaXAuYwpAQCAtMCwwICsxLDEwNDUgQEAKKy8qIG5ldC9hdG0vY2xpcC5jIC0gUkZDMTU3NyBDbGFzc2ljYWwgSVAgb3ZlciBBVE0gKi8KKworLyogV3JpdHRlbiAxOTk1LTIwMDAgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIExSQy9JQ0EgKi8KKworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4gLyogZm9yIFVJTlRfTUFYICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPiAvKiBmb3Igc29tZSBtYW5pZmVzdCBjb25zdGFudHMgKi8KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWNsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPiAvKiBmb3IgbmV0L3JvdXRlLmggKi8KKyNpbmNsdWRlIDxsaW51eC9pbi5oPiAvKiBmb3Igc3RydWN0IHNvY2thZGRyX2luICovCisjaW5jbHVkZSA8bGludXgvaWYuaD4gLyogZm9yIElGRl9VUCAqLworI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+IC8qIGZvciBzdHJ1Y3QgcnRhYmxlIGFuZCByb3V0aW5nICovCisjaW5jbHVkZSA8bmV0L2ljbXAuaD4gLyogaWNtcF9zZW5kICovCisjaW5jbHVkZSA8YXNtL3BhcmFtLmg+IC8qIGZvciBIWiAqLworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4gLyogZm9yIGh0b25zIGV0Yy4gKi8KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+IC8qIHNhdmUvcmVzdG9yZV9mbGFncyAqLworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAicmVzb3VyY2VzLmgiCisjaW5jbHVkZSAiaXBjb21tb24uaCIKKyNpbmNsdWRlIDxuZXQvYXRtY2xpcC5oPgorCisKKyNpZiAwCisjZGVmaW5lIERQUklOVEsoZm9ybWF0LGFyZ3MuLi4pIHByaW50ayhmb3JtYXQsIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgRFBSSU5USyhmb3JtYXQsYXJncy4uLikKKyNlbmRpZgorCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqY2xpcF9kZXZzOworc3RhdGljIHN0cnVjdCBhdG1fdmNjICphdG1hcnBkOworc3RhdGljIHN0cnVjdCBuZWlnaF90YWJsZSBjbGlwX3RibDsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBpZGxlX3RpbWVyOworc3RhdGljIGludCBzdGFydF90aW1lciA9IDE7CisKKworc3RhdGljIGludCB0b19hdG1hcnBkKGVudW0gYXRtYXJwX2N0cmxfdHlwZSB0eXBlLGludCBpdGYsdW5zaWduZWQgbG9uZyBpcCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IGF0bWFycF9jdHJsICpjdHJsOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlEUFJJTlRLKCJ0b19hdG1hcnBkKCVkKVxuIix0eXBlKTsKKwlpZiAoIWF0bWFycGQpIHJldHVybiAtRVVOQVRDSDsKKwlza2IgPSBhbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBhdG1hcnBfY3RybCksR0ZQX0FUT01JQyk7CisJaWYgKCFza2IpIHJldHVybiAtRU5PTUVNOworCWN0cmwgPSAoc3RydWN0IGF0bWFycF9jdHJsICopIHNrYl9wdXQoc2tiLHNpemVvZihzdHJ1Y3QgYXRtYXJwX2N0cmwpKTsKKwljdHJsLT50eXBlID0gdHlwZTsKKwljdHJsLT5pdGZfbnVtID0gaXRmOworCWN0cmwtPmlwID0gaXA7CisJYXRtX2ZvcmNlX2NoYXJnZShhdG1hcnBkLHNrYi0+dHJ1ZXNpemUpOworCisJc2sgPSBza19hdG0oYXRtYXJwZCk7CisJc2tiX3F1ZXVlX3RhaWwoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpOworCXNrLT5za19kYXRhX3JlYWR5KHNrLCBza2ItPmxlbik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgbGlua192Y2Moc3RydWN0IGNsaXBfdmNjICpjbGlwX3ZjYyxzdHJ1Y3QgYXRtYXJwX2VudHJ5ICplbnRyeSkKK3sKKwlEUFJJTlRLKCJsaW5rX3ZjYyAlcCB0byBlbnRyeSAlcCAobmVpZ2ggJXApXG4iLGNsaXBfdmNjLGVudHJ5LAorCSAgICBlbnRyeS0+bmVpZ2gpOworCWNsaXBfdmNjLT5lbnRyeSA9IGVudHJ5OworCWNsaXBfdmNjLT54b2ZmID0gMDsgLyogQEBAIG1heSBvdmVycnVuIGJ1ZmZlciBieSBvbmUgcGFja2V0ICovCisJY2xpcF92Y2MtPm5leHQgPSBlbnRyeS0+dmNjczsKKwllbnRyeS0+dmNjcyA9IGNsaXBfdmNjOworCWVudHJ5LT5uZWlnaC0+dXNlZCA9IGppZmZpZXM7Cit9CisKKworc3RhdGljIHZvaWQgdW5saW5rX2NsaXBfdmNjKHN0cnVjdCBjbGlwX3ZjYyAqY2xpcF92Y2MpCit7CisJc3RydWN0IGF0bWFycF9lbnRyeSAqZW50cnkgPSBjbGlwX3ZjYy0+ZW50cnk7CisJc3RydWN0IGNsaXBfdmNjICoqd2FsazsKKworCWlmICghZW50cnkpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiIWNsaXBfdmNjLT5lbnRyeSAoY2xpcF92Y2MgJXApXG4iLGNsaXBfdmNjKTsKKwkJcmV0dXJuOworCX0KKwlzcGluX2xvY2tfYmgoJmVudHJ5LT5uZWlnaC0+ZGV2LT54bWl0X2xvY2spOwkvKiBibG9jayBjbGlwX3N0YXJ0X3htaXQoKSAqLworCWVudHJ5LT5uZWlnaC0+dXNlZCA9IGppZmZpZXM7CisJZm9yICh3YWxrID0gJmVudHJ5LT52Y2NzOyAqd2Fsazsgd2FsayA9ICYoKndhbGspLT5uZXh0KQorCQlpZiAoKndhbGsgPT0gY2xpcF92Y2MpIHsKKwkJCWludCBlcnJvcjsKKworCQkJKndhbGsgPSBjbGlwX3ZjYy0+bmV4dDsgLyogYXRvbWljICovCisJCQljbGlwX3ZjYy0+ZW50cnkgPSBOVUxMOworCQkJaWYgKGNsaXBfdmNjLT54b2ZmKQorCQkJCW5ldGlmX3dha2VfcXVldWUoZW50cnktPm5laWdoLT5kZXYpOworCQkJaWYgKGVudHJ5LT52Y2NzKQorCQkJCWdvdG8gb3V0OworCQkJZW50cnktPmV4cGlyZXMgPSBqaWZmaWVzLTE7CisJCQkJLyogZm9yY2UgcmVzb2x1dGlvbiBvciBleHBpcmF0aW9uICovCisJCQllcnJvciA9IG5laWdoX3VwZGF0ZShlbnRyeS0+bmVpZ2gsIE5VTEwsIE5VRF9OT05FLAorCQkJCQkgICAgIE5FSUdIX1VQREFURV9GX0FETUlOKTsKKwkJCWlmIChlcnJvcikKKwkJCQlwcmludGsoS0VSTl9DUklUICJ1bmxpbmtfY2xpcF92Y2M6ICIKKwkJCQkgICAgIm5laWdoX3VwZGF0ZSBmYWlsZWQgd2l0aCAlZFxuIixlcnJvcik7CisJCQlnb3RvIG91dDsKKwkJfQorCXByaW50ayhLRVJOX0NSSVQgIkFUTUFSUDogdW5saW5rX2NsaXBfdmNjIGZhaWxlZCAoZW50cnkgJXAsIHZjYyAiCisJICAiMHglcClcbiIsZW50cnksY2xpcF92Y2MpOworb3V0OgorCXNwaW5fdW5sb2NrX2JoKCZlbnRyeS0+bmVpZ2gtPmRldi0+eG1pdF9sb2NrKTsKK30KKworLyogVGhlIG5laWdoYm91ciBlbnRyeSBuLT5sb2NrIGlzIGhlbGQuICovCitzdGF0aWMgaW50IG5laWdoX2NoZWNrX2NiKHN0cnVjdCBuZWlnaGJvdXIgKm4pCit7CisJc3RydWN0IGF0bWFycF9lbnRyeSAqZW50cnkgPSBORUlHSDJFTlRSWShuKTsKKwlzdHJ1Y3QgY2xpcF92Y2MgKmN2OworCisJZm9yIChjdiA9IGVudHJ5LT52Y2NzOyBjdjsgY3YgPSBjdi0+bmV4dCkgeworCQl1bnNpZ25lZCBsb25nIGV4cCA9IGN2LT5sYXN0X3VzZSArIGN2LT5pZGxlX3RpbWVvdXQ7CisKKwkJaWYgKGN2LT5pZGxlX3RpbWVvdXQgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBleHApKSB7CisJCQlEUFJJTlRLKCJyZWxlYXNpbmcgdmNjICVwLT4lcCBvZiBlbnRyeSAlcFxuIiwKKwkJCQljdiwgY3YtPnZjYywgZW50cnkpOworCQkJdmNjX3JlbGVhc2VfYXN5bmMoY3YtPnZjYywgLUVUSU1FRE9VVCk7CisJCX0KKwl9CisKKwlpZiAoZW50cnktPnZjY3MgfHwgdGltZV9iZWZvcmUoamlmZmllcywgZW50cnktPmV4cGlyZXMpKQorCQlyZXR1cm4gMDsKKworCWlmIChhdG9taWNfcmVhZCgmbi0+cmVmY250KSA+IDEpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQlEUFJJTlRLKCJkZXN0cnVjdGlvbiBwb3N0cG9uZWQgd2l0aCByZWYgJWRcbiIsCisJCQlhdG9taWNfcmVhZCgmbi0+cmVmY250KSk7CisKKwkJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmbi0+YXJwX3F1ZXVlKSkgIT0gTlVMTCkgCisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwkJcmV0dXJuIDA7CisJfQorCisJRFBSSU5USygiZXhwaXJlZCBuZWlnaCAlcFxuIixuKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgaWRsZV90aW1lcl9jaGVjayh1bnNpZ25lZCBsb25nIGR1bW15KQoreworCXdyaXRlX2xvY2soJmNsaXBfdGJsLmxvY2spOworCV9fbmVpZ2hfZm9yX2VhY2hfcmVsZWFzZSgmY2xpcF90YmwsIG5laWdoX2NoZWNrX2NiKTsKKwltb2RfdGltZXIoJmlkbGVfdGltZXIsIGppZmZpZXMrQ0xJUF9DSEVDS19JTlRFUlZBTCpIWik7CisJd3JpdGVfdW5sb2NrKCZjbGlwX3RibC5sb2NrKTsKK30KKworc3RhdGljIGludCBjbGlwX2FycF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgYXRtX3ZjYyAqdmNjOworCisJRFBSSU5USygiY2xpcF9hcnBfcmN2XG4iKTsKKwl2Y2MgPSBBVE1fU0tCKHNrYiktPnZjYzsKKwlpZiAoIXZjYyB8fCAhYXRtX2NoYXJnZSh2Y2Msc2tiLT50cnVlc2l6ZSkpIHsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCURQUklOVEsoInB1c2hpbmcgdG8gJXBcbiIsdmNjKTsKKwlEUFJJTlRLKCJ1c2luZyAlcFxuIixDTElQX1ZDQyh2Y2MpLT5vbGRfcHVzaCk7CisJQ0xJUF9WQ0ModmNjKS0+b2xkX3B1c2godmNjLHNrYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGxsY19vdWlbXSA9IHsKKwkweGFhLAkvKiBEU0FQOiBub24tSVNPICovCisJMHhhYSwJLyogU1NBUDogbm9uLUlTTyAqLworCTB4MDMsCS8qIEN0cmw6IFVubnVtYmVyZWQgSW5mb3JtYXRpb24gQ29tbWFuZCBQRFUgKi8KKwkweDAwLAkvKiBPVUk6IEV0aGVyVHlwZSAqLworCTB4MDAsCisJMHgwMCB9OworCitzdGF0aWMgdm9pZCBjbGlwX3B1c2goc3RydWN0IGF0bV92Y2MgKnZjYyxzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBjbGlwX3ZjYyAqY2xpcF92Y2MgPSBDTElQX1ZDQyh2Y2MpOworCisJRFBSSU5USygiY2xpcCBwdXNoXG4iKTsKKwlpZiAoIXNrYikgeworCQlEUFJJTlRLKCJyZW1vdmluZyBWQ0MgJXBcbiIsY2xpcF92Y2MpOworCQlpZiAoY2xpcF92Y2MtPmVudHJ5KSB1bmxpbmtfY2xpcF92Y2MoY2xpcF92Y2MpOworCQljbGlwX3ZjYy0+b2xkX3B1c2godmNjLE5VTEwpOyAvKiBwYXNzIG9uIHRoZSBiYWQgbmV3cyAqLworCQlrZnJlZShjbGlwX3ZjYyk7CisJCXJldHVybjsKKwl9CisJYXRtX3JldHVybih2Y2Msc2tiLT50cnVlc2l6ZSk7CisJc2tiLT5kZXYgPSBjbGlwX3ZjYy0+ZW50cnkgPyBjbGlwX3ZjYy0+ZW50cnktPm5laWdoLT5kZXYgOiBjbGlwX2RldnM7CisJCS8qIGNsaXBfdmNjLT5lbnRyeSA9PSBOVUxMIGlmIHdlIGRvbid0IGhhdmUgYW4gSVAgYWRkcmVzcyB5ZXQgKi8KKwlpZiAoIXNrYi0+ZGV2KSB7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybjsKKwl9CisJQVRNX1NLQihza2IpLT52Y2MgPSB2Y2M7CisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCWlmICghY2xpcF92Y2MtPmVuY2FwIHx8IHNrYi0+bGVuIDwgUkZDMTQ4M0xMQ19MRU4gfHwgbWVtY21wKHNrYi0+ZGF0YSwKKwkgICAgbGxjX291aSxzaXplb2YobGxjX291aSkpKSBza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOworCWVsc2UgeworCQlza2ItPnByb3RvY29sID0gKCh1MTYgKikgc2tiLT5kYXRhKVszXTsKKwkJc2tiX3B1bGwoc2tiLFJGQzE0ODNMTENfTEVOKTsKKwkJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfQVJQKSkgeworCQkJUFJJVihza2ItPmRldiktPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCVBSSVYoc2tiLT5kZXYpLT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJCWNsaXBfYXJwX3Jjdihza2IpOworCQkJcmV0dXJuOworCQl9CisJfQorCWNsaXBfdmNjLT5sYXN0X3VzZSA9IGppZmZpZXM7CisJUFJJVihza2ItPmRldiktPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlQUklWKHNrYi0+ZGV2KS0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJbWVtc2V0KEFUTV9TS0Ioc2tiKSwgMCwgc2l6ZW9mKHN0cnVjdCBhdG1fc2tiX2RhdGEpKTsKKwluZXRpZl9yeChza2IpOworfQorCisKKy8qCisgKiBOb3RlOiB0aGVzZSBzcGlubG9ja3MgX211c3Rfbm90XyBibG9jayBvbiBub24tU01QLiBUaGUgb25seSBnb2FsIGlzIHRoYXQKKyAqIGNsaXBfcG9wIGlzIGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gdGhlIGNyaXRpY2FsIHNlY3Rpb24gaW4gY2xpcF9zdGFydF94bWl0LgorICovCisKKworc3RhdGljIHZvaWQgY2xpcF9wb3Aoc3RydWN0IGF0bV92Y2MgKnZjYyxzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBjbGlwX3ZjYyAqY2xpcF92Y2MgPSBDTElQX1ZDQyh2Y2MpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKKwlpbnQgb2xkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEUFJJTlRLKCJjbGlwX3BvcCh2Y2MgJXApXG4iLHZjYyk7CisJY2xpcF92Y2MtPm9sZF9wb3AodmNjLHNrYik7CisJLyogc2tiLT5kZXYgPT0gTlVMTCBpbiBvdXRib3VuZCBBUlAgcGFja2V0cyAqLworCWlmICghZGV2KSByZXR1cm47CisJc3Bpbl9sb2NrX2lycXNhdmUoJlBSSVYoZGV2KS0+eG9mZl9sb2NrLGZsYWdzKTsKKwlpZiAoYXRtX21heV9zZW5kKHZjYywwKSkgeworCQlvbGQgPSB4Y2hnKCZjbGlwX3ZjYy0+eG9mZiwwKTsKKwkJaWYgKG9sZCkgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZQUklWKGRldiktPnhvZmZfbG9jayxmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQgY2xpcF9uZWlnaF9kZXN0cm95KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoKQoreworCURQUklOVEsoImNsaXBfbmVpZ2hfZGVzdHJveSAobmVpZ2ggJXApXG4iLG5laWdoKTsKKwlpZiAoTkVJR0gyRU5UUlkobmVpZ2gpLT52Y2NzKQorCQlwcmludGsoS0VSTl9DUklUICJjbGlwX25laWdoX2Rlc3Ryb3k6IHZjY3MgIT0gTlVMTCAhISFcbiIpOworCU5FSUdIMkVOVFJZKG5laWdoKS0+dmNjcyA9ICh2b2lkICopIDB4ZGVhZGJlZWY7Cit9CisKKworc3RhdGljIHZvaWQgY2xpcF9uZWlnaF9zb2xpY2l0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLHN0cnVjdCBza19idWZmICpza2IpCit7CisJRFBSSU5USygiY2xpcF9uZWlnaF9zb2xpY2l0IChuZWlnaCAlcCwgc2tiICVwKVxuIixuZWlnaCxza2IpOworCXRvX2F0bWFycGQoYWN0X25lZWQsUFJJVihuZWlnaC0+ZGV2KS0+bnVtYmVyLE5FSUdIMkVOVFJZKG5laWdoKS0+aXApOworfQorCisKK3N0YXRpYyB2b2lkIGNsaXBfbmVpZ2hfZXJyb3Ioc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyNpZm5kZWYgQ09ORklHX0FUTV9DTElQX05PX0lDTVAKKwlpY21wX3NlbmQoc2tiLElDTVBfREVTVF9VTlJFQUNILElDTVBfSE9TVF9VTlJFQUNILDApOworI2VuZGlmCisJa2ZyZWVfc2tiKHNrYik7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZWlnaF9vcHMgY2xpcF9uZWlnaF9vcHMgPSB7CisJLmZhbWlseSA9CQlBRl9JTkVULAorCS5kZXN0cnVjdG9yID0JCWNsaXBfbmVpZ2hfZGVzdHJveSwKKwkuc29saWNpdCA9CQljbGlwX25laWdoX3NvbGljaXQsCisJLmVycm9yX3JlcG9ydCA9CQljbGlwX25laWdoX2Vycm9yLAorCS5vdXRwdXQgPQkJZGV2X3F1ZXVlX3htaXQsCisJLmNvbm5lY3RlZF9vdXRwdXQgPQlkZXZfcXVldWVfeG1pdCwKKwkuaGhfb3V0cHV0ID0JCWRldl9xdWV1ZV94bWl0LAorCS5xdWV1ZV94bWl0ID0JCWRldl9xdWV1ZV94bWl0LAorfTsKKworCitzdGF0aWMgaW50IGNsaXBfY29uc3RydWN0b3Ioc3RydWN0IG5laWdoYm91ciAqbmVpZ2gpCit7CisJc3RydWN0IGF0bWFycF9lbnRyeSAqZW50cnkgPSBORUlHSDJFTlRSWShuZWlnaCk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5laWdoLT5kZXY7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCXN0cnVjdCBuZWlnaF9wYXJtcyAqcGFybXM7CisKKwlEUFJJTlRLKCJjbGlwX2NvbnN0cnVjdG9yIChuZWlnaCAlcCwgZW50cnkgJXApXG4iLG5laWdoLGVudHJ5KTsKKwluZWlnaC0+dHlwZSA9IGluZXRfYWRkcl90eXBlKGVudHJ5LT5pcCk7CisJaWYgKG5laWdoLT50eXBlICE9IFJUTl9VTklDQVNUKSByZXR1cm4gLUVJTlZBTDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlpbl9kZXYgPSByY3VfZGVyZWZlcmVuY2UoX19pbl9kZXZfZ2V0KGRldikpOworCWlmICghaW5fZGV2KSB7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwYXJtcyA9IGluX2Rldi0+YXJwX3Bhcm1zOworCV9fbmVpZ2hfcGFybXNfcHV0KG5laWdoLT5wYXJtcyk7CisJbmVpZ2gtPnBhcm1zID0gbmVpZ2hfcGFybXNfY2xvbmUocGFybXMpOworCXJjdV9yZWFkX3VubG9jaygpOworCisJbmVpZ2gtPm9wcyA9ICZjbGlwX25laWdoX29wczsKKwluZWlnaC0+b3V0cHV0ID0gbmVpZ2gtPm51ZF9zdGF0ZSAmIE5VRF9WQUxJRCA/CisJICAgIG5laWdoLT5vcHMtPmNvbm5lY3RlZF9vdXRwdXQgOiBuZWlnaC0+b3BzLT5vdXRwdXQ7CisJZW50cnktPm5laWdoID0gbmVpZ2g7CisJZW50cnktPnZjY3MgPSBOVUxMOworCWVudHJ5LT5leHBpcmVzID0gamlmZmllcy0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIGNsaXBfaGFzaChjb25zdCB2b2lkICpwa2V5LCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBqaGFzaF8yd29yZHMoKih1MzIgKilwa2V5LCBkZXYtPmlmaW5kZXgsIGNsaXBfdGJsLmhhc2hfcm5kKTsKK30KKworc3RhdGljIHN0cnVjdCBuZWlnaF90YWJsZSBjbGlwX3RibCA9IHsKKwkuZmFtaWx5IAk9IEFGX0lORVQsCisJLmVudHJ5X3NpemUgCT0gc2l6ZW9mKHN0cnVjdCBuZWlnaGJvdXIpK3NpemVvZihzdHJ1Y3QgYXRtYXJwX2VudHJ5KSwKKwkua2V5X2xlbiAJPSA0LAorCS5oYXNoIAkJPSBjbGlwX2hhc2gsCisJLmNvbnN0cnVjdG9yIAk9IGNsaXBfY29uc3RydWN0b3IsCisJLmlkIAkJPSAiY2xpcF9hcnBfY2FjaGUiLAorCisJLyogcGFyYW1ldGVycyBhcmUgY29waWVkIGZyb20gQVJQIC4uLiAqLworCS5wYXJtcyA9IHsKKwkJLnRibCAJCQk9ICZjbGlwX3RibCwKKwkJLmJhc2VfcmVhY2hhYmxlX3RpbWUgCT0gMzAgKiBIWiwKKwkJLnJldHJhbnNfdGltZSAJCT0gMSAqIEhaLAorCQkuZ2Nfc3RhbGV0aW1lIAkJPSA2MCAqIEhaLAorCQkucmVhY2hhYmxlX3RpbWUgCT0gMzAgKiBIWiwKKwkJLmRlbGF5X3Byb2JlX3RpbWUgCT0gNSAqIEhaLAorCQkucXVldWVfbGVuIAkJPSAzLAorCQkudWNhc3RfcHJvYmVzIAkJPSAzLAorCQkubWNhc3RfcHJvYmVzIAkJPSAzLAorCQkuYW55Y2FzdF9kZWxheSAJCT0gMSAqIEhaLAorCQkucHJveHlfZGVsYXkgCQk9ICg4ICogSFopIC8gMTAsCisJCS5wcm94eV9xbGVuIAkJPSA2NCwKKwkJLmxvY2t0aW1lIAkJPSAxICogSFosCisJfSwKKwkuZ2NfaW50ZXJ2YWwgCT0gMzAgKiBIWiwKKwkuZ2NfdGhyZXNoMSAJPSAxMjgsCisJLmdjX3RocmVzaDIgCT0gNTEyLAorCS5nY190aHJlc2gzIAk9IDEwMjQsCit9OworCisKKy8qIEBAQCBjb3B5IGJoIGxvY2tpbmcgZnJvbSBhcnAuYyAtLSBuZWVkIHRvIGJoLWVuYWJsZSBhdG0gY29kZSBiZWZvcmUgKi8KKworLyoKKyAqIFdlIHBsYXkgd2l0aCB0aGUgcmVzb2x2ZSBmbGFnOiAwIGFuZCAxIGhhdmUgdGhlIHVzdWFsIG1lYW5pbmcsIGJ1dCAtMSBtZWFucworICogdG8gYWxsb2NhdGUgdGhlIG5laWdoYm91ciBlbnRyeSBidXQgbm90IHRvIGFzayBhdG1hcnBkIGZvciByZXNvbHV0aW9uLiBBbHNvLAorICogZG9uJ3QgaW5jcmVtZW50IHRoZSB1c2FnZSBjb3VudC4gVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBlbnRyaWVzIGluCisgKiBjbGlwX3NldGVudHJ5LgorICovCisKKworc3RhdGljIGludCBjbGlwX2VuY2FwKHN0cnVjdCBhdG1fdmNjICp2Y2MsaW50IG1vZGUpCit7CisJQ0xJUF9WQ0ModmNjKS0+ZW5jYXAgPSBtb2RlOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgY2xpcF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2Isc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY2xpcF9wcml2ICpjbGlwX3ByaXYgPSBQUklWKGRldik7CisJc3RydWN0IGF0bWFycF9lbnRyeSAqZW50cnk7CisJc3RydWN0IGF0bV92Y2MgKnZjYzsKKwlpbnQgb2xkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEUFJJTlRLKCJjbGlwX3N0YXJ0X3htaXQgKHNrYiAlcClcbiIsc2tiKTsKKwlpZiAoIXNrYi0+ZHN0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiY2xpcF9zdGFydF94bWl0OiBza2ItPmRzdCA9PSBOVUxMXG4iKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQljbGlwX3ByaXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc2tiLT5kc3QtPm5laWdoYm91cikgeworI2lmIDAKKwkJc2tiLT5kc3QtPm5laWdoYm91ciA9IGNsaXBfZmluZF9uZWlnaGJvdXIoc2tiLT5kc3QsMSk7CisJCWlmICghc2tiLT5kc3QtPm5laWdoYm91cikgeworCQkJZGV2X2tmcmVlX3NrYihza2IpOyAvKiBsb3N0IHRoYXQgb25lICovCisJCQljbGlwX3ByaXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJCXJldHVybiAwOworCQl9CisjZW5kaWYKKwkJcHJpbnRrKEtFUk5fRVJSICJjbGlwX3N0YXJ0X3htaXQ6IE5PIE5FSUdIQk9VUiAhXG4iKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQljbGlwX3ByaXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuIDA7CisJfQorCWVudHJ5ID0gTkVJR0gyRU5UUlkoc2tiLT5kc3QtPm5laWdoYm91cik7CisJaWYgKCFlbnRyeS0+dmNjcykgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBlbnRyeS0+ZXhwaXJlcykpIHsKKwkJCS8qIHNob3VsZCBiZSByZXNvbHZlZCAqLworCQkJZW50cnktPmV4cGlyZXMgPSBqaWZmaWVzK0FUTUFSUF9SRVRSWV9ERUxBWSpIWjsKKwkJCXRvX2F0bWFycGQoYWN0X25lZWQsUFJJVihkZXYpLT5udW1iZXIsZW50cnktPmlwKTsKKwkJfQorCQlpZiAoZW50cnktPm5laWdoLT5hcnBfcXVldWUucWxlbiA8IEFUTUFSUF9NQVhfVU5SRVNfUEFDS0VUUykKKwkJCXNrYl9xdWV1ZV90YWlsKCZlbnRyeS0+bmVpZ2gtPmFycF9xdWV1ZSxza2IpOworCQllbHNlIHsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCWNsaXBfcHJpdi0+c3RhdHMudHhfZHJvcHBlZCsrOworCQl9CisJCXJldHVybiAwOworCX0KKwlEUFJJTlRLKCJuZWlnaCAlcCwgdmNjcyAlcFxuIixlbnRyeSxlbnRyeS0+dmNjcyk7CisJQVRNX1NLQihza2IpLT52Y2MgPSB2Y2MgPSBlbnRyeS0+dmNjcy0+dmNjOworCURQUklOVEsoInVzaW5nIG5laWdoYm91ciAlcCwgdmNjICVwXG4iLHNrYi0+ZHN0LT5uZWlnaGJvdXIsdmNjKTsKKwlpZiAoZW50cnktPnZjY3MtPmVuY2FwKSB7CisJCXZvaWQgKmhlcmU7CisKKwkJaGVyZSA9IHNrYl9wdXNoKHNrYixSRkMxNDgzTExDX0xFTik7CisJCW1lbWNweShoZXJlLGxsY19vdWksc2l6ZW9mKGxsY19vdWkpKTsKKwkJKCh1MTYgKikgaGVyZSlbM10gPSBza2ItPnByb3RvY29sOworCX0KKwlhdG9taWNfYWRkKHNrYi0+dHJ1ZXNpemUsICZza19hdG0odmNjKS0+c2tfd21lbV9hbGxvYyk7CisJQVRNX1NLQihza2IpLT5hdG1fb3B0aW9ucyA9IHZjYy0+YXRtX29wdGlvbnM7CisJZW50cnktPnZjY3MtPmxhc3RfdXNlID0gamlmZmllczsKKwlEUFJJTlRLKCJhdG1fc2tiKCVwKS0+dmNjKCVwKS0+ZGV2KCVwKVxuIixza2IsdmNjLHZjYy0+ZGV2KTsKKwlvbGQgPSB4Y2hnKCZlbnRyeS0+dmNjcy0+eG9mZiwxKTsgLyogYXNzdW1lIFhPRkYgLi4uICovCisJaWYgKG9sZCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJjbGlwX3N0YXJ0X3htaXQ6IFhPRkYtPlhPRkYgdHJhbnNpdGlvblxuIik7CisJCXJldHVybiAwOworCX0KKwljbGlwX3ByaXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwljbGlwX3ByaXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCSh2b2lkKSB2Y2MtPnNlbmQodmNjLHNrYik7CisJaWYgKGF0bV9tYXlfc2VuZCh2Y2MsMCkpIHsKKwkJZW50cnktPnZjY3MtPnhvZmYgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNsaXBfcHJpdi0+eG9mZl9sb2NrLGZsYWdzKTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7IC8qIFhPRkYgLT4gdGhyb3R0bGUgaW1tZWRpYXRlbHkgKi8KKwliYXJyaWVyKCk7CisJaWYgKCFlbnRyeS0+dmNjcy0+eG9mZikKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJLyogT2gsIHdlIGp1c3QgcmFjZWQgd2l0aCBjbGlwX3BvcC4gbmV0aWZfc3RhcnRfcXVldWUgc2hvdWxkIGJlCisJCSAgIGdvb2QgZW5vdWdoLCBiZWNhdXNlIG5vdGhpbmcgc2hvdWxkIHJlYWxseSBiZSBhc2xlZXAgYmVjYXVzZQorCQkgICBvZiB0aGUgYnJpZWYgbmV0aWZfc3RvcF9xdWV1ZS4gSWYgdGhpcyBpc24ndCB0cnVlIG9yIGlmIGl0CisJCSAgIGNoYW5nZXMsIHVzZSBuZXRpZl93YWtlX3F1ZXVlIGluc3RlYWQuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xpcF9wcml2LT54b2ZmX2xvY2ssZmxhZ3MpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqY2xpcF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gJlBSSVYoZGV2KS0+c3RhdHM7Cit9CisKKworc3RhdGljIGludCBjbGlwX21raXAoc3RydWN0IGF0bV92Y2MgKnZjYyxpbnQgdGltZW91dCkKK3sKKwlzdHJ1Y3QgY2xpcF92Y2MgKmNsaXBfdmNjOworCXN0cnVjdCBza19idWZmX2hlYWQgY29weTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJaWYgKCF2Y2MtPnB1c2gpIHJldHVybiAtRUJBREZEOworCWNsaXBfdmNjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNsaXBfdmNjKSxHRlBfS0VSTkVMKTsKKwlpZiAoIWNsaXBfdmNjKSByZXR1cm4gLUVOT01FTTsKKwlEUFJJTlRLKCJta2lwIGNsaXBfdmNjICVwIHZjYyAlcFxuIixjbGlwX3ZjYyx2Y2MpOworCWNsaXBfdmNjLT52Y2MgPSB2Y2M7CisJdmNjLT51c2VyX2JhY2sgPSBjbGlwX3ZjYzsKKwlzZXRfYml0KEFUTV9WRl9JU19DTElQLCAmdmNjLT5mbGFncyk7CisJY2xpcF92Y2MtPmVudHJ5ID0gTlVMTDsKKwljbGlwX3ZjYy0+eG9mZiA9IDA7CisJY2xpcF92Y2MtPmVuY2FwID0gMTsKKwljbGlwX3ZjYy0+bGFzdF91c2UgPSBqaWZmaWVzOworCWNsaXBfdmNjLT5pZGxlX3RpbWVvdXQgPSB0aW1lb3V0KkhaOworCWNsaXBfdmNjLT5vbGRfcHVzaCA9IHZjYy0+cHVzaDsKKwljbGlwX3ZjYy0+b2xkX3BvcCA9IHZjYy0+cG9wOworCXZjYy0+cHVzaCA9IGNsaXBfcHVzaDsKKwl2Y2MtPnBvcCA9IGNsaXBfcG9wOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNvcHkpOworCXNrYl9taWdyYXRlKCZza19hdG0odmNjKS0+c2tfcmVjZWl2ZV9xdWV1ZSwgJmNvcHkpOworCS8qIHJlLXByb2Nlc3MgZXZlcnl0aGluZyByZWNlaXZlZCBiZXR3ZWVuIGNvbm5lY3Rpb24gc2V0dXAgYW5kIE1LSVAgKi8KKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZjb3B5KSkgIT0gTlVMTCkKKwkJaWYgKCFjbGlwX2RldnMpIHsKKwkJCWF0bV9yZXR1cm4odmNjLHNrYi0+dHJ1ZXNpemUpOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCX0KKwkJZWxzZSB7CisJCQl1bnNpZ25lZCBpbnQgbGVuID0gc2tiLT5sZW47CisKKwkJCWNsaXBfcHVzaCh2Y2Msc2tiKTsKKwkJCVBSSVYoc2tiLT5kZXYpLT5zdGF0cy5yeF9wYWNrZXRzLS07CisJCQlQUklWKHNrYi0+ZGV2KS0+c3RhdHMucnhfYnl0ZXMgLT0gbGVuOworCQl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBjbGlwX3NldGVudHJ5KHN0cnVjdCBhdG1fdmNjICp2Y2MsdTMyIGlwKQoreworCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoOworCXN0cnVjdCBhdG1hcnBfZW50cnkgKmVudHJ5OworCWludCBlcnJvcjsKKwlzdHJ1Y3QgY2xpcF92Y2MgKmNsaXBfdmNjOworCXN0cnVjdCBmbG93aSBmbCA9IHsgLm5sX3UgPSB7IC5pcDRfdSA9IHsgLmRhZGRyID0gaXAsIC50b3MgPSAxIH0gfSB9OworCXN0cnVjdCBydGFibGUgKnJ0OworCisJaWYgKHZjYy0+cHVzaCAhPSBjbGlwX3B1c2gpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2xpcF9zZXRlbnRyeTogbm9uLUNMSVAgVkNDXG4iKTsKKwkJcmV0dXJuIC1FQkFERjsKKwl9CisJY2xpcF92Y2MgPSBDTElQX1ZDQyh2Y2MpOworCWlmICghaXApIHsKKwkJaWYgKCFjbGlwX3ZjYy0+ZW50cnkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaGlkaW5nIGhpZGRlbiBBVE1BUlAgZW50cnlcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJRFBSSU5USygic2V0ZW50cnk6IHJlbW92ZVxuIik7CisJCXVubGlua19jbGlwX3ZjYyhjbGlwX3ZjYyk7CisJCXJldHVybiAwOworCX0KKwllcnJvciA9IGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCZmbCk7CisJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJbmVpZ2ggPSBfX25laWdoX2xvb2t1cCgmY2xpcF90YmwsJmlwLHJ0LT51LmRzdC5kZXYsMSk7CisJaXBfcnRfcHV0KHJ0KTsKKwlpZiAoIW5laWdoKQorCQlyZXR1cm4gLUVOT01FTTsKKwllbnRyeSA9IE5FSUdIMkVOVFJZKG5laWdoKTsKKwlpZiAoZW50cnkgIT0gY2xpcF92Y2MtPmVudHJ5KSB7CisJCWlmICghY2xpcF92Y2MtPmVudHJ5KSBEUFJJTlRLKCJzZXRlbnRyeTogYWRkXG4iKTsKKwkJZWxzZSB7CisJCQlEUFJJTlRLKCJzZXRlbnRyeTogdXBkYXRlXG4iKTsKKwkJCXVubGlua19jbGlwX3ZjYyhjbGlwX3ZjYyk7CisJCX0KKwkJbGlua192Y2MoY2xpcF92Y2MsZW50cnkpOworCX0KKwllcnJvciA9IG5laWdoX3VwZGF0ZShuZWlnaCwgbGxjX291aSwgTlVEX1BFUk1BTkVOVCwgCisJCQkgICAgIE5FSUdIX1VQREFURV9GX09WRVJSSURFfE5FSUdIX1VQREFURV9GX0FETUlOKTsKKwluZWlnaF9yZWxlYXNlKG5laWdoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworc3RhdGljIHZvaWQgY2xpcF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gY2xpcF9zdGFydF94bWl0OworCS8qIHNnX3htaXQgLi4uICovCisJZGV2LT5nZXRfc3RhdHMgPSBjbGlwX2dldF9zdGF0czsKKwlkZXYtPnR5cGUgPSBBUlBIUkRfQVRNOworCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gUkZDMTQ4M0xMQ19MRU47CisJZGV2LT5tdHUgPSBSRkMxNjI2X01UVTsKKwlkZXYtPnR4X3F1ZXVlX2xlbiA9IDEwMDsgLyogIm5vcm1hbCIgcXVldWUgKHBhY2tldHMpICovCisJICAgIC8qIFdoZW4gdXNpbmcgYSAicmVhbCIgcWRpc2MsIHRoZSBxZGlzYyBkZXRlcm1pbmVzIHRoZSBxdWV1ZSAqLworCSAgICAvKiBsZW5ndGguIHR4X3F1ZXVlX2xlbiBpcyBvbmx5IHVzZWQgZm9yIHRoZSBkZWZhdWx0IGNhc2UsICovCisJICAgIC8qIHdpdGhvdXQgYW55IG1vcmUgZWxhYm9yYXRlIHF1ZXVpbmcuIDEwMCBpcyBhIHJlYXNvbmFibGUgKi8KKwkgICAgLyogY29tcHJvbWlzZSBiZXR3ZWVuIGRlY2VudCBidXJzdC10b2xlcmFuY2UgYW5kIHByb3RlY3Rpb24gKi8KKwkgICAgLyogYWdhaW5zdCBtZW1vcnkgaG9ncy4gKi8KK30KKworCitzdGF0aWMgaW50IGNsaXBfY3JlYXRlKGludCBudW1iZXIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgY2xpcF9wcml2ICpjbGlwX3ByaXY7CisJaW50IGVycm9yOworCisJaWYgKG51bWJlciAhPSAtMSkgeworCQlmb3IgKGRldiA9IGNsaXBfZGV2czsgZGV2OyBkZXYgPSBQUklWKGRldiktPm5leHQpCisJCQlpZiAoUFJJVihkZXYpLT5udW1iZXIgPT0gbnVtYmVyKSByZXR1cm4gLUVFWElTVDsKKwl9CisJZWxzZSB7CisJCW51bWJlciA9IDA7CisJCWZvciAoZGV2ID0gY2xpcF9kZXZzOyBkZXY7IGRldiA9IFBSSVYoZGV2KS0+bmV4dCkKKwkJCWlmIChQUklWKGRldiktPm51bWJlciA+PSBudW1iZXIpCisJCQkJbnVtYmVyID0gUFJJVihkZXYpLT5udW1iZXIrMTsKKwl9CisJZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgY2xpcF9wcml2KSwgIiIsIGNsaXBfc2V0dXApOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKwljbGlwX3ByaXYgPSBQUklWKGRldik7CisJc3ByaW50ZihkZXYtPm5hbWUsImF0bSVkIixudW1iZXIpOworCXNwaW5fbG9ja19pbml0KCZjbGlwX3ByaXYtPnhvZmZfbG9jayk7CisJY2xpcF9wcml2LT5udW1iZXIgPSBudW1iZXI7CisJZXJyb3IgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyb3IpIHsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwljbGlwX3ByaXYtPm5leHQgPSBjbGlwX2RldnM7CisJY2xpcF9kZXZzID0gZGV2OworCURQUklOVEsoInJlZ2lzdGVyZWQgKG5ldDolcylcbiIsZGV2LT5uYW1lKTsKKwlyZXR1cm4gbnVtYmVyOworfQorCisKK3N0YXRpYyBpbnQgY2xpcF9kZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLHVuc2lnbmVkIGxvbmcgZXZlbnQsCisgICAgdm9pZCAqZGV2KQoreworCS8qIGlnbm9yZSBub24tQ0xJUCBkZXZpY2VzICovCisJaWYgKCgoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2KS0+dHlwZSAhPSBBUlBIUkRfQVRNIHx8CisJICAgICgoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2KS0+aGFyZF9zdGFydF94bWl0ICE9IGNsaXBfc3RhcnRfeG1pdCkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCXN3aXRjaCAoZXZlbnQpIHsKKwkJY2FzZSBORVRERVZfVVA6CisJCQlEUFJJTlRLKCJjbGlwX2RldmljZV9ldmVudCBORVRERVZfVVBcbiIpOworCQkJKHZvaWQpIHRvX2F0bWFycGQoYWN0X3VwLFBSSVYoZGV2KS0+bnVtYmVyLDApOworCQkJYnJlYWs7CisJCWNhc2UgTkVUREVWX0dPSU5HX0RPV046CisJCQlEUFJJTlRLKCJjbGlwX2RldmljZV9ldmVudCBORVRERVZfRE9XTlxuIik7CisJCQkodm9pZCkgdG9fYXRtYXJwZChhY3RfZG93bixQUklWKGRldiktPm51bWJlciwwKTsKKwkJCWJyZWFrOworCQljYXNlIE5FVERFVl9DSEFOR0U6CisJCWNhc2UgTkVUREVWX0NIQU5HRU1UVToKKwkJCURQUklOVEsoImNsaXBfZGV2aWNlX2V2ZW50IE5FVERFVl9DSEFOR0UqXG4iKTsKKwkJCSh2b2lkKSB0b19hdG1hcnBkKGFjdF9jaGFuZ2UsUFJJVihkZXYpLT5udW1iZXIsMCk7CisJCQlicmVhazsKKwkJY2FzZSBORVRERVZfUkVCT09UOgorCQljYXNlIE5FVERFVl9SRUdJU1RFUjoKKwkJY2FzZSBORVRERVZfRE9XTjoKKwkJCURQUklOVEsoImNsaXBfZGV2aWNlX2V2ZW50ICVsZFxuIixldmVudCk7CisJCQkvKiBpZ25vcmUgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2xpcF9kZXZpY2VfZXZlbnQ6IHVua25vd24gZXZlbnQgIgorCQkJICAgICIlbGRcbiIsZXZlbnQpOworCQkJYnJlYWs7CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworCitzdGF0aWMgaW50IGNsaXBfaW5ldF9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsdW5zaWduZWQgbG9uZyBldmVudCwKKyAgICB2b2lkICppZmEpCit7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCisJaW5fZGV2ID0gKChzdHJ1Y3QgaW5faWZhZGRyICopIGlmYSktPmlmYV9kZXY7CisJaWYgKCFpbl9kZXYgfHwgIWluX2Rldi0+ZGV2KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNsaXBfaW5ldF9ldmVudDogbm8gZGV2aWNlXG4iKTsKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCX0KKwkvKgorCSAqIFRyYW5zaXRpb25zIGFyZSBvZiB0aGUgZG93bi1jaGFuZ2UtdXAgdHlwZSwgc28gaXQncyBzdWZmaWNpZW50IHRvCisJICogaGFuZGxlIHRoZSBjaGFuZ2Ugb24gdXAuCisJICovCisJaWYgKGV2ZW50ICE9IE5FVERFVl9VUCkgcmV0dXJuIE5PVElGWV9ET05FOworCXJldHVybiBjbGlwX2RldmljZV9ldmVudCh0aGlzLE5FVERFVl9DSEFOR0UsaW5fZGV2LT5kZXYpOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgY2xpcF9kZXZfbm90aWZpZXIgPSB7CisJY2xpcF9kZXZpY2VfZXZlbnQsCisJTlVMTCwKKwkwCit9OworCisKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBjbGlwX2luZXRfbm90aWZpZXIgPSB7CisJY2xpcF9pbmV0X2V2ZW50LAorCU5VTEwsCisJMAorfTsKKworCisKK3N0YXRpYyB2b2lkIGF0bWFycGRfY2xvc2Uoc3RydWN0IGF0bV92Y2MgKnZjYykKK3sKKwlEUFJJTlRLKCJhdG1hcnBkX2Nsb3NlXG4iKTsKKwlhdG1hcnBkID0gTlVMTDsgLyogYXNzdW1lZCB0byBiZSBhdG9taWMgKi8KKwliYXJyaWVyKCk7CisJdW5yZWdpc3Rlcl9pbmV0YWRkcl9ub3RpZmllcigmY2xpcF9pbmV0X25vdGlmaWVyKTsKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmY2xpcF9kZXZfbm90aWZpZXIpOworCWlmIChza2JfcGVlaygmc2tfYXRtKHZjYyktPnNrX3JlY2VpdmVfcXVldWUpKQorCQlwcmludGsoS0VSTl9FUlIgImF0bWFycGRfY2xvc2U6IGNsb3Npbmcgd2l0aCByZXF1ZXN0cyAiCisJCSAgICAicGVuZGluZ1xuIik7CisJc2tiX3F1ZXVlX3B1cmdlKCZza19hdG0odmNjKS0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJRFBSSU5USygiKGRvbmUpXG4iKTsKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKK30KKworCitzdGF0aWMgc3RydWN0IGF0bWRldl9vcHMgYXRtYXJwZF9kZXZfb3BzID0geworCS5jbG9zZSA9IGF0bWFycGRfY2xvc2UKK307CisKKworc3RhdGljIHN0cnVjdCBhdG1fZGV2IGF0bWFycGRfZGV2ID0geworCS5vcHMgPQkJCSZhdG1hcnBkX2Rldl9vcHMsCisJLnR5cGUgPQkJCSJhcnBkIiwKKwkubnVtYmVyID0gCQk5OTksCisJLmxvY2sgPQkJCVNQSU5fTE9DS19VTkxPQ0tFRAorfTsKKworCitzdGF0aWMgaW50IGF0bV9pbml0X2F0bWFycChzdHJ1Y3QgYXRtX3ZjYyAqdmNjKQoreworCWlmIChhdG1hcnBkKSByZXR1cm4gLUVBRERSSU5VU0U7CisJaWYgKHN0YXJ0X3RpbWVyKSB7CisJCXN0YXJ0X3RpbWVyID0gMDsKKwkJaW5pdF90aW1lcigmaWRsZV90aW1lcik7CisJCWlkbGVfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMrQ0xJUF9DSEVDS19JTlRFUlZBTCpIWjsKKwkJaWRsZV90aW1lci5mdW5jdGlvbiA9IGlkbGVfdGltZXJfY2hlY2s7CisJCWFkZF90aW1lcigmaWRsZV90aW1lcik7CisJfQorCWF0bWFycGQgPSB2Y2M7CisJc2V0X2JpdChBVE1fVkZfTUVUQSwmdmNjLT5mbGFncyk7CisJc2V0X2JpdChBVE1fVkZfUkVBRFksJnZjYy0+ZmxhZ3MpOworCSAgICAvKiBhbGxvdyByZXBsaWVzIGFuZCBhdm9pZCBnZXR0aW5nIGNsb3NlZCBpZiBzaWduYWxpbmcgZGllcyAqLworCXZjYy0+ZGV2ID0gJmF0bWFycGRfZGV2OworCXZjY19pbnNlcnRfc29ja2V0KHNrX2F0bSh2Y2MpKTsKKwl2Y2MtPnB1c2ggPSBOVUxMOworCXZjYy0+cG9wID0gTlVMTDsgLyogY3Jhc2ggKi8KKwl2Y2MtPnB1c2hfb2FtID0gTlVMTDsgLyogY3Jhc2ggKi8KKwlpZiAocmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZjbGlwX2Rldl9ub3RpZmllcikpCisJCXByaW50ayhLRVJOX0VSUiAicmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyIGZhaWxlZFxuIik7CisJaWYgKHJlZ2lzdGVyX2luZXRhZGRyX25vdGlmaWVyKCZjbGlwX2luZXRfbm90aWZpZXIpKQorCQlwcmludGsoS0VSTl9FUlIgInJlZ2lzdGVyX2luZXRhZGRyX25vdGlmaWVyIGZhaWxlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2xpcF9pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYXRtX3ZjYyAqdmNjID0gQVRNX1NEKHNvY2spOworCWludCBlcnIgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBTSU9DTUtDTElQOgorCQljYXNlIEFUTUFSUERfQ1RSTDoKKwkJY2FzZSBBVE1BUlBfTUtJUDoKKwkJY2FzZSBBVE1BUlBfU0VURU5UUlk6CisJCWNhc2UgQVRNQVJQX0VOQ0FQOgorCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJCXJldHVybiAtRVBFUk07CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBTSU9DTUtDTElQOgorCQkJZXJyID0gY2xpcF9jcmVhdGUoYXJnKTsKKwkJCWJyZWFrOworCQljYXNlIEFUTUFSUERfQ1RSTDoKKwkJCWVyciA9IGF0bV9pbml0X2F0bWFycCh2Y2MpOworCQkJaWYgKCFlcnIpIHsKKwkJCQlzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKwkJCQlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQVRNQVJQX01LSVA6CisJCQllcnIgPSBjbGlwX21raXAodmNjICxhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgQVRNQVJQX1NFVEVOVFJZOgorCQkJZXJyID0gY2xpcF9zZXRlbnRyeSh2Y2MsIGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSBBVE1BUlBfRU5DQVA6CisJCQllcnIgPSBjbGlwX2VuY2FwKHZjYywgYXJnKTsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IGF0bV9pb2N0bCBjbGlwX2lvY3RsX29wcyA9IHsKKwkub3duZXIgCT0gVEhJU19NT0RVTEUsCisJLmlvY3RsCT0gY2xpcF9pb2N0bCwKK307CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCitzdGF0aWMgdm9pZCBzdmNfYWRkcihzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IHNvY2thZGRyX2F0bXN2YyAqYWRkcikKK3sKKwlzdGF0aWMgaW50IGNvZGVbXSA9IHsgMSwyLDEwLDYsMSwwIH07CisJc3RhdGljIGludCBlMTY0W10gPSB7IDEsOCw0LDYsMSwwIH07CisKKwlpZiAoKmFkZHItPnNhc19hZGRyLnB1YikgeworCQlzZXFfcHJpbnRmKHNlcSwgIiVzIiwgYWRkci0+c2FzX2FkZHIucHViKTsKKwkJaWYgKCphZGRyLT5zYXNfYWRkci5wcnYpCisJCQlzZXFfcHV0YyhzZXEsICcrJyk7CisJfSBlbHNlIGlmICghKmFkZHItPnNhc19hZGRyLnBydikgeworCQlzZXFfcHJpbnRmKHNlcSwgIiVzIiwgIihub25lKSIpOworCQlyZXR1cm47CisJfQorCWlmICgqYWRkci0+c2FzX2FkZHIucHJ2KSB7CisJCXVuc2lnbmVkIGNoYXIgKnBydiA9IGFkZHItPnNhc19hZGRyLnBydjsKKwkJaW50ICpmaWVsZHM7CisJCWludCBpLCBqOworCisJCWZpZWxkcyA9ICpwcnYgPT0gQVRNX0FGSV9FMTY0ID8gZTE2NCA6IGNvZGU7CisJCWZvciAoaSA9IDA7IGZpZWxkc1tpXTsgaSsrKSB7CisJCQlmb3IgKGogPSBmaWVsZHNbaV07IGo7IGotLSkKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiUwMlgiLCAqcHJ2KyspOworCQkJaWYgKGZpZWxkc1tpKzFdKQorCQkJCXNlcV9wdXRjKHNlcSwgJy4nKTsKKwkJfQorCX0KK30KKworLyogVGhpcyBtZWFucyB0aGUgbmVpZ2hib3VyIGVudHJ5IGhhcyBubyBhdHRhY2hlZCBWQ0Mgb2JqZWN0cy4gKi8KKyNkZWZpbmUgU0VRX05PX1ZDQ19UT0tFTgkoKHZvaWQgKikgMikKKworc3RhdGljIHZvaWQgYXRtYXJwX2luZm8oc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgYXRtYXJwX2VudHJ5ICplbnRyeSwgc3RydWN0IGNsaXBfdmNjICpjbGlwX3ZjYykKK3sKKwl1bnNpZ25lZCBsb25nIGV4cDsKKwljaGFyIGJ1ZlsxN107CisJaW50IHN2YywgbGxjLCBvZmY7CisKKwlzdmMgPSAoKGNsaXBfdmNjID09IFNFUV9OT19WQ0NfVE9LRU4pIHx8CisJICAgICAgIChza19hdG0oY2xpcF92Y2MtPnZjYyktPnNrX2ZhbWlseSA9PSBBRl9BVE1TVkMpKTsKKworCWxsYyA9ICgoY2xpcF92Y2MgPT0gU0VRX05PX1ZDQ19UT0tFTikgfHwKKwkgICAgICAgY2xpcF92Y2MtPmVuY2FwKTsKKworCWlmIChjbGlwX3ZjYyA9PSBTRVFfTk9fVkNDX1RPS0VOKQorCQlleHAgPSBlbnRyeS0+bmVpZ2gtPnVzZWQ7CisJZWxzZQorCQlleHAgPSBjbGlwX3ZjYy0+bGFzdF91c2U7CisKKwlleHAgPSAoamlmZmllcyAtIGV4cCkgLyBIWjsKKworCXNlcV9wcmludGYoc2VxLCAiJS02cyUtNHMlLTRzJTVsZCAiLAorCQkgICBkZXYtPm5hbWUsCisJCSAgIHN2YyA/ICJTVkMiIDogIlBWQyIsCisJCSAgIGxsYyA/ICJMTEMiIDogIk5VTEwiLAorCQkgICBleHApOworCisJb2ZmID0gc2NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxLCAiJWQuJWQuJWQuJWQiLAorCQkJTklQUVVBRChlbnRyeS0+aXApKTsKKwl3aGlsZSAob2ZmIDwgMTYpCisJCWJ1ZltvZmYrK10gPSAnICc7CisJYnVmW29mZl0gPSAnXDAnOworCXNlcV9wcmludGYoc2VxLCAiJXMiLCBidWYpOworCisJaWYgKGNsaXBfdmNjID09IFNFUV9OT19WQ0NfVE9LRU4pIHsKKwkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGVudHJ5LT5leHBpcmVzKSkKKwkJCXNlcV9wcmludGYoc2VxLCAiKHJlc29sdmluZylcbiIpOworCQllbHNlCisJCQlzZXFfcHJpbnRmKHNlcSwgIihleHBpcmVkLCByZWYgJWQpXG4iLAorCQkJCSAgIGF0b21pY19yZWFkKCZlbnRyeS0+bmVpZ2gtPnJlZmNudCkpOworCX0gZWxzZSBpZiAoIXN2YykgeworCQlzZXFfcHJpbnRmKHNlcSwgIiVkLiVkLiVkXG4iLAorCQkJICAgY2xpcF92Y2MtPnZjYy0+ZGV2LT5udW1iZXIsCisJCQkgICBjbGlwX3ZjYy0+dmNjLT52cGksCisJCQkgICBjbGlwX3ZjYy0+dmNjLT52Y2kpOworCX0gZWxzZSB7CisJCXN2Y19hZGRyKHNlcSwgJmNsaXBfdmNjLT52Y2MtPnJlbW90ZSk7CisJCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CisJfQorfQorCitzdHJ1Y3QgY2xpcF9zZXFfc3RhdGUgeworCS8qIFRoaXMgbWVtYmVyIG11c3QgYmUgZmlyc3QuICovCisJc3RydWN0IG5laWdoX3NlcV9zdGF0ZSBuczsKKworCS8qIExvY2FsIHRvIGNsaXAgc3BlY2lmaWMgaXRlcmF0aW9uLiAqLworCXN0cnVjdCBjbGlwX3ZjYyAqdmNjOworfTsKKworc3RhdGljIHN0cnVjdCBjbGlwX3ZjYyAqY2xpcF9zZXFfbmV4dF92Y2Moc3RydWN0IGF0bWFycF9lbnRyeSAqZSwKKwkJCQkJICBzdHJ1Y3QgY2xpcF92Y2MgKmN1cnIpCit7CisJaWYgKCFjdXJyKSB7CisJCWN1cnIgPSBlLT52Y2NzOworCQlpZiAoIWN1cnIpCisJCQlyZXR1cm4gU0VRX05PX1ZDQ19UT0tFTjsKKwkJcmV0dXJuIGN1cnI7CisJfQorCWlmIChjdXJyID09IFNFUV9OT19WQ0NfVE9LRU4pCisJCXJldHVybiBOVUxMOworCisJY3VyciA9IGN1cnItPm5leHQ7CisKKwlyZXR1cm4gY3VycjsKK30KKworc3RhdGljIHZvaWQgKmNsaXBfc2VxX3ZjY193YWxrKHN0cnVjdCBjbGlwX3NlcV9zdGF0ZSAqc3RhdGUsCisJCQkgICAgICAgc3RydWN0IGF0bWFycF9lbnRyeSAqZSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGNsaXBfdmNjICp2Y2MgPSBzdGF0ZS0+dmNjOworCisJdmNjID0gY2xpcF9zZXFfbmV4dF92Y2MoZSwgdmNjKTsKKwlpZiAodmNjICYmIHBvcyAhPSBOVUxMKSB7CisJCXdoaWxlICgqcG9zKSB7CisJCQl2Y2MgPSBjbGlwX3NlcV9uZXh0X3ZjYyhlLCB2Y2MpOworCQkJaWYgKCF2Y2MpCisJCQkJYnJlYWs7CisJCQktLSgqcG9zKTsKKwkJfQorCX0KKwlzdGF0ZS0+dmNjID0gdmNjOworCisJcmV0dXJuIHZjYzsKK30KKyAgCitzdGF0aWMgdm9pZCAqY2xpcF9zZXFfc3ViX2l0ZXIoc3RydWN0IG5laWdoX3NlcV9zdGF0ZSAqX3N0YXRlLAorCQkJICAgICAgIHN0cnVjdCBuZWlnaGJvdXIgKm4sIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBjbGlwX3NlcV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGNsaXBfc2VxX3N0YXRlICopIF9zdGF0ZTsKKworCXJldHVybiBjbGlwX3NlcV92Y2Nfd2FsayhzdGF0ZSwgTkVJR0gyRU5UUlkobiksIHBvcyk7Cit9CisKK3N0YXRpYyB2b2lkICpjbGlwX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJcmV0dXJuIG5laWdoX3NlcV9zdGFydChzZXEsIHBvcywgJmNsaXBfdGJsLCBORUlHSF9TRVFfTkVJR0hfT05MWSk7Cit9CisKK3N0YXRpYyBpbnQgY2xpcF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdGF0aWMgY2hhciBhdG1fYXJwX2Jhbm5lcltdID0gCisJCSJJUGl0ZiBUeXBlRW5jcCBJZGxlIElQIGFkZHJlc3MgICAgICBBVE0gYWRkcmVzc1xuIjsKKworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlzZXFfcHV0cyhzZXEsIGF0bV9hcnBfYmFubmVyKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgY2xpcF9zZXFfc3RhdGUgKnN0YXRlID0gc2VxLT5wcml2YXRlOworCQlzdHJ1Y3QgbmVpZ2hib3VyICpuID0gdjsKKwkJc3RydWN0IGNsaXBfdmNjICp2Y2MgPSBzdGF0ZS0+dmNjOworCisJCWF0bWFycF9pbmZvKHNlcSwgbi0+ZGV2LCBORUlHSDJFTlRSWShuKSwgdmNjKTsKKwl9CisgIAlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBhcnBfc2VxX29wcyA9IHsKKwkuc3RhcnQJPSBjbGlwX3NlcV9zdGFydCwKKwkubmV4dAk9IG5laWdoX3NlcV9uZXh0LAorCS5zdG9wCT0gbmVpZ2hfc2VxX3N0b3AsCisJLnNob3cJPSBjbGlwX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBhcnBfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGNsaXBfc2VxX3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKKwlpbnQgcmMgPSAtRUFHQUlOOworCisJc3RhdGUgPSBrbWFsbG9jKHNpemVvZigqc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0YXRlKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXRfa2ZyZWU7CisJfQorCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKCpzdGF0ZSkpOworCXN0YXRlLT5ucy5uZWlnaF9zdWJfaXRlciA9IGNsaXBfc2VxX3N1Yl9pdGVyOworCisJcmMgPSBzZXFfb3BlbihmaWxlLCAmYXJwX3NlcV9vcHMpOworCWlmIChyYykKKwkJZ290byBvdXRfa2ZyZWU7CisKKwlzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc2VxLT5wcml2YXRlID0gc3RhdGU7CitvdXQ6CisJcmV0dXJuIHJjOworCitvdXRfa2ZyZWU6CisJa2ZyZWUoc3RhdGUpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhcnBfc2VxX2ZvcHMgPSB7CisJLm9wZW4JCT0gYXJwX3NlcV9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2VfcHJpdmF0ZSwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUKK307CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgYXRtX2NsaXBfaW5pdCh2b2lkKQoreworCW5laWdoX3RhYmxlX2luaXQoJmNsaXBfdGJsKTsKKworCWNsaXBfdGJsX2hvb2sgPSAmY2xpcF90Ymw7CisJcmVnaXN0ZXJfYXRtX2lvY3RsKCZjbGlwX2lvY3RsX29wcyk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworeworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcDsKKworCXAgPSBjcmVhdGVfcHJvY19lbnRyeSgiYXJwIiwgU19JUlVHTywgYXRtX3Byb2Nfcm9vdCk7CisJaWYgKHApCisJCXAtPnByb2NfZm9wcyA9ICZhcnBfc2VxX2ZvcHM7Cit9CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXRtX2NsaXBfZXhpdCh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsICpuZXh0OworCisJcmVtb3ZlX3Byb2NfZW50cnkoImFycCIsIGF0bV9wcm9jX3Jvb3QpOworCisJZGVyZWdpc3Rlcl9hdG1faW9jdGwoJmNsaXBfaW9jdGxfb3BzKTsKKworCS8qIEZpcnN0LCBzdG9wIHRoZSBpZGxlIHRpbWVyLCBzbyBpdCBzdG9wcyBiYW5naW5nCisJICogb24gdGhlIHRhYmxlLgorCSAqLworCWlmIChzdGFydF90aW1lciA9PSAwKQorCQlkZWxfdGltZXIoJmlkbGVfdGltZXIpOworCisJLyogTmV4dCwgcHVyZ2UgdGhlIHRhYmxlLCBzbyB0aGF0IHRoZSBkZXZpY2UKKwkgKiB1bnJlZ2lzdGVyIGxvb3AgYmVsb3cgZG9lcyBub3QgaGFuZyBkdWUgdG8KKwkgKiBkZXZpY2UgcmVmZXJlbmNlcyByZW1haW5pbmcgaW4gdGhlIHRhYmxlLgorCSAqLworCW5laWdoX2lmZG93bigmY2xpcF90YmwsIE5VTEwpOworCisJZGV2ID0gY2xpcF9kZXZzOworCXdoaWxlIChkZXYpIHsKKwkJbmV4dCA9IFBSSVYoZGV2KS0+bmV4dDsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJZGV2ID0gbmV4dDsKKwl9CisKKwkvKiBOb3cgaXQgaXMgc2FmZSB0byBmdWxseSBzaHV0ZG93biB3aG9sZSB0YWJsZS4gKi8KKwluZWlnaF90YWJsZV9jbGVhcigmY2xpcF90YmwpOworCisJY2xpcF90YmxfaG9vayA9IE5VTEw7Cit9CisKK21vZHVsZV9pbml0KGF0bV9jbGlwX2luaXQpOworbW9kdWxlX2V4aXQoYXRtX2NsaXBfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9hdG0vY29tbW9uLmMgYi9uZXQvYXRtL2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMTZiZTMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYXRtL2NvbW1vbi5jCkBAIC0wLDAgKzEsODA0IEBACisvKiBuZXQvYXRtL2NvbW1vbi5jIC0gQVRNIHNvY2tldHMgKGNvbW1vbiBwYXJ0IGZvciBQVkMgYW5kIFNWQykgKi8KKworLyogV3JpdHRlbiAxOTk1LTIwMDAgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIExSQy9JQ0EgKi8KKworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgkJLyogc3RydWN0IHNvY2tldCwgc3RydWN0IHByb3RvX29wcyAqLworI2luY2x1ZGUgPGxpbnV4L2F0bS5oPgkJLyogQVRNIHN0dWZmICovCisjaW5jbHVkZSA8bGludXgvYXRtZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CS8qIFNPTF9TT0NLRVQgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgkvKiBlcnJvciBjb2RlcyAqLworI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgkJLyogdmVyaWZ5X2FyZWEgKi8KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4JCS8qIHN0cnVjdCB0aW1ldmFsICovCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CQkvKiBzdHJ1Y3Qgc29jayAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL3BvbGwuaD4KKworCisjaW5jbHVkZSAicmVzb3VyY2VzLmgiCQkvKiBhdG1fZmluZF9kZXYgKi8KKyNpbmNsdWRlICJjb21tb24uaCIJCS8qIHByb3RvdHlwZXMgKi8KKyNpbmNsdWRlICJwcm90b2NvbHMuaCIJCS8qIGF0bV9pbml0Xzx0cmFuc3BvcnQ+ICovCisjaW5jbHVkZSAiYWRkci5oIgkJLyogYWRkcmVzcyByZWdpc3RyeSAqLworI2luY2x1ZGUgInNpZ25hbGluZy5oIgkJLyogZm9yIFdBSVRJTkcgYW5kIHNpZ2RfYXR0YWNoICovCisKKworI2lmIDAKKyNkZWZpbmUgRFBSSU5USyhmb3JtYXQsYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0LCMjYXJncykKKyNlbHNlCisjZGVmaW5lIERQUklOVEsoZm9ybWF0LGFyZ3MuLi4pCisjZW5kaWYKKworc3RydWN0IGhsaXN0X2hlYWQgdmNjX2hhc2hbVkNDX0hUQUJMRV9TSVpFXTsKK0RFRklORV9SV0xPQ0sodmNjX3NrbGlzdF9sb2NrKTsKKworc3RhdGljIHZvaWQgX192Y2NfaW5zZXJ0X3NvY2tldChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGF0bV92Y2MgKnZjYyA9IGF0bV9zayhzayk7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSAmdmNjX2hhc2hbdmNjLT52Y2kgJgorCQkJCQkoVkNDX0hUQUJMRV9TSVpFIC0gMSldOworCXNrLT5za19oYXNoZW50ID0gdmNjLT52Y2kgJiAoVkNDX0hUQUJMRV9TSVpFIC0gMSk7CisJc2tfYWRkX25vZGUoc2ssIGhlYWQpOworfQorCit2b2lkIHZjY19pbnNlcnRfc29ja2V0KHN0cnVjdCBzb2NrICpzaykKK3sKKwl3cml0ZV9sb2NrX2lycSgmdmNjX3NrbGlzdF9sb2NrKTsKKwlfX3ZjY19pbnNlcnRfc29ja2V0KHNrKTsKKwl3cml0ZV91bmxvY2tfaXJxKCZ2Y2Nfc2tsaXN0X2xvY2spOworfQorCitzdGF0aWMgdm9pZCB2Y2NfcmVtb3ZlX3NvY2tldChzdHJ1Y3Qgc29jayAqc2spCit7CisJd3JpdGVfbG9ja19pcnEoJnZjY19za2xpc3RfbG9jayk7CisJc2tfZGVsX25vZGVfaW5pdChzayk7CisJd3JpdGVfdW5sb2NrX2lycSgmdmNjX3NrbGlzdF9sb2NrKTsKK30KKworCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmFsbG9jX3R4KHN0cnVjdCBhdG1fdmNjICp2Y2MsdW5zaWduZWQgaW50IHNpemUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBza19hdG0odmNjKTsKKworCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpICYmICFhdG1fbWF5X3NlbmQodmNjLCBzaXplKSkgeworCQlEUFJJTlRLKCJTb3JyeTogd21lbV9hbGxvYyA9ICVkLCBzaXplID0gJWQsIHNuZGJ1ZiA9ICVkXG4iLAorCQkJYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKSwgc2l6ZSwKKwkJCXNrLT5za19zbmRidWYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJd2hpbGUgKCEoc2tiID0gYWxsb2Nfc2tiKHNpemUsR0ZQX0tFUk5FTCkpKSBzY2hlZHVsZSgpOworCURQUklOVEsoIkFsVHggJWQgKz0gJWRcbiIsIGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYyksCisJCXNrYi0+dHJ1ZXNpemUpOworCWF0b21pY19hZGQoc2tiLT50cnVlc2l6ZSwgJnNrLT5za193bWVtX2FsbG9jKTsKKwlyZXR1cm4gc2tiOworfQorCisKK0VYUE9SVF9TWU1CT0wodmNjX2hhc2gpOworRVhQT1JUX1NZTUJPTCh2Y2Nfc2tsaXN0X2xvY2spOworRVhQT1JUX1NZTUJPTCh2Y2NfaW5zZXJ0X3NvY2tldCk7CisKK3N0YXRpYyB2b2lkIHZjY19zb2NrX2Rlc3RydWN0KHN0cnVjdCBzb2NrICpzaykKK3sKKwlpZiAoYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgInZjY19zb2NrX2Rlc3RydWN0OiBybWVtIGxlYWthZ2UgKCVkIGJ5dGVzKSBkZXRlY3RlZC5cbiIsIGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykpOworCisJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYykpCisJCXByaW50ayhLRVJOX0RFQlVHICJ2Y2Nfc29ja19kZXN0cnVjdDogd21lbSBsZWFrYWdlICglZCBieXRlcykgZGV0ZWN0ZWQuXG4iLCBhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpKTsKK30KKworc3RhdGljIHZvaWQgdmNjX2RlZl93YWtldXAoc3RydWN0IHNvY2sgKnNrKQoreworCXJlYWRfbG9jaygmc2stPnNrX2NhbGxiYWNrX2xvY2spOworCWlmIChzay0+c2tfc2xlZXAgJiYgd2FpdHF1ZXVlX2FjdGl2ZShzay0+c2tfc2xlZXApKQorCQl3YWtlX3VwKHNrLT5za19zbGVlcCk7CisJcmVhZF91bmxvY2soJnNrLT5za19jYWxsYmFja19sb2NrKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdmNjX3dyaXRhYmxlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgYXRtX3ZjYyAqdmNjID0gYXRtX3NrKHNrKTsKKworCXJldHVybiAodmNjLT5xb3MudHh0cC5tYXhfc2R1ICsKKwkgICAgICAgIGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYykpIDw9IHNrLT5za19zbmRidWY7Cit9CisKK3N0YXRpYyB2b2lkIHZjY193cml0ZV9zcGFjZShzdHJ1Y3Qgc29jayAqc2spCit7ICAgICAgIAorCXJlYWRfbG9jaygmc2stPnNrX2NhbGxiYWNrX2xvY2spOworCisJaWYgKHZjY193cml0YWJsZShzaykpIHsKKwkJaWYgKHNrLT5za19zbGVlcCAmJiB3YWl0cXVldWVfYWN0aXZlKHNrLT5za19zbGVlcCkpCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoc2stPnNrX3NsZWVwKTsKKworCQlza193YWtlX2FzeW5jKHNrLCAyLCBQT0xMX09VVCk7CisJfQorCisJcmVhZF91bmxvY2soJnNrLT5za19jYWxsYmFja19sb2NrKTsKK30KKworc3RhdGljIHN0cnVjdCBwcm90byB2Y2NfcHJvdG8gPSB7CisJLm5hbWUJICA9ICJWQ0MiLAorCS5vd25lcgkgID0gVEhJU19NT0RVTEUsCisJLm9ial9zaXplID0gc2l6ZW9mKHN0cnVjdCBhdG1fdmNjKSwKK307CisgCitpbnQgdmNjX2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgcHJvdG9jb2wsIGludCBmYW1pbHkpCit7CisJc3RydWN0IHNvY2sgKnNrOworCXN0cnVjdCBhdG1fdmNjICp2Y2M7CisKKwlzb2NrLT5zayA9IE5VTEw7CisJaWYgKHNvY2stPnR5cGUgPT0gU09DS19TVFJFQU0pCisJCXJldHVybiAtRUlOVkFMOworCXNrID0gc2tfYWxsb2MoZmFtaWx5LCBHRlBfS0VSTkVMLCAmdmNjX3Byb3RvLCAxKTsKKwlpZiAoIXNrKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisJc2stPnNrX3N0YXRlX2NoYW5nZSA9IHZjY19kZWZfd2FrZXVwOworCXNrLT5za193cml0ZV9zcGFjZSA9IHZjY193cml0ZV9zcGFjZTsKKworCXZjYyA9IGF0bV9zayhzayk7CisJdmNjLT5kZXYgPSBOVUxMOworCW1lbXNldCgmdmNjLT5sb2NhbCwwLHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjKSk7CisJbWVtc2V0KCZ2Y2MtPnJlbW90ZSwwLHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjKSk7CisJdmNjLT5xb3MudHh0cC5tYXhfc2R1ID0gMSA8PCAxNjsgLyogZm9yIG1ldGEgVkNzICovCisJYXRvbWljX3NldCgmc2stPnNrX3dtZW1fYWxsb2MsIDApOworCWF0b21pY19zZXQoJnNrLT5za19ybWVtX2FsbG9jLCAwKTsKKwl2Y2MtPnB1c2ggPSBOVUxMOworCXZjYy0+cG9wID0gTlVMTDsKKwl2Y2MtPnB1c2hfb2FtID0gTlVMTDsKKwl2Y2MtPnZwaSA9IHZjYy0+dmNpID0gMDsgLyogbm8gVkNJL1ZQSSB5ZXQgKi8KKwl2Y2MtPmF0bV9vcHRpb25zID0gdmNjLT5hYWxfb3B0aW9ucyA9IDA7CisJc2stPnNrX2Rlc3RydWN0ID0gdmNjX3NvY2tfZGVzdHJ1Y3Q7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgdmNjX2Rlc3Ryb3lfc29ja2V0KHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgYXRtX3ZjYyAqdmNjID0gYXRtX3NrKHNrKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc2V0X2JpdChBVE1fVkZfQ0xPU0UsICZ2Y2MtPmZsYWdzKTsKKwljbGVhcl9iaXQoQVRNX1ZGX1JFQURZLCAmdmNjLT5mbGFncyk7CisJaWYgKHZjYy0+ZGV2KSB7CisJCWlmICh2Y2MtPmRldi0+b3BzLT5jbG9zZSkKKwkJCXZjYy0+ZGV2LT5vcHMtPmNsb3NlKHZjYyk7CisJCWlmICh2Y2MtPnB1c2gpCisJCQl2Y2MtPnB1c2godmNjLCBOVUxMKTsgLyogYXRtYXJwZCBoYXMgbm8gcHVzaCAqLworCisJCXZjY19yZW1vdmVfc29ja2V0KHNrKTsJLyogbm8gbW9yZSByZWNlaXZlICovCisKKwkJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKSAhPSBOVUxMKSB7CisJCQlhdG1fcmV0dXJuKHZjYyxza2ItPnRydWVzaXplKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQl9CisKKwkJbW9kdWxlX3B1dCh2Y2MtPmRldi0+b3BzLT5vd25lcik7CisJCWF0bV9kZXZfcHV0KHZjYy0+ZGV2KTsKKwl9Cit9CisKKworaW50IHZjY19yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisKKwlpZiAoc2spIHsKKwkJbG9ja19zb2NrKHNrKTsKKwkJdmNjX2Rlc3Ryb3lfc29ja2V0KHNvY2stPnNrKTsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJc29ja19wdXQoc2spOworCX0KKworCXJldHVybiAwOworfQorCisKK3ZvaWQgdmNjX3JlbGVhc2VfYXN5bmMoc3RydWN0IGF0bV92Y2MgKnZjYywgaW50IHJlcGx5KQoreworCXN0cnVjdCBzb2NrICpzayA9IHNrX2F0bSh2Y2MpOworCisJc2V0X2JpdChBVE1fVkZfQ0xPU0UsICZ2Y2MtPmZsYWdzKTsKKwlzay0+c2tfc2h1dGRvd24gfD0gUkNWX1NIVVRET1dOOworCXNrLT5za19lcnIgPSAtcmVwbHk7CisJY2xlYXJfYml0KEFUTV9WRl9XQUlUSU5HLCAmdmNjLT5mbGFncyk7CisJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7Cit9CisKKworRVhQT1JUX1NZTUJPTCh2Y2NfcmVsZWFzZV9hc3luYyk7CisKKworc3RhdGljIGludCBhZGp1c3RfdHAoc3RydWN0IGF0bV90cmFmcHJtICp0cCx1bnNpZ25lZCBjaGFyIGFhbCkKK3sKKwlpbnQgbWF4X3NkdTsKKworCWlmICghdHAtPnRyYWZmaWNfY2xhc3MpIHJldHVybiAwOworCXN3aXRjaCAoYWFsKSB7CisJCWNhc2UgQVRNX0FBTDA6CisJCQltYXhfc2R1ID0gQVRNX0NFTExfU0laRS0xOworCQkJYnJlYWs7CisJCWNhc2UgQVRNX0FBTDM0OgorCQkJbWF4X3NkdSA9IEFUTV9NQVhfQUFMMzRfUERVOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJBVE06IEFBTCBwcm9ibGVtcyAuLi4gIgorCQkJICAgICIoJWQpXG4iLGFhbCk7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBBVE1fQUFMNToKKwkJCW1heF9zZHUgPSBBVE1fTUFYX0FBTDVfUERVOworCX0KKwlpZiAoIXRwLT5tYXhfc2R1KSB0cC0+bWF4X3NkdSA9IG1heF9zZHU7CisJZWxzZSBpZiAodHAtPm1heF9zZHUgPiBtYXhfc2R1KSByZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXRwLT5tYXhfY2R2KSB0cC0+bWF4X2NkdiA9IEFUTV9NQVhfQ0RWOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgY2hlY2tfY2koc3RydWN0IGF0bV92Y2MgKnZjYywgc2hvcnQgdnBpLCBpbnQgdmNpKQoreworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkID0gJnZjY19oYXNoW3ZjaSAmCisJCQkJCShWQ0NfSFRBQkxFX1NJWkUgLSAxKV07CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJc3RydWN0IHNvY2sgKnM7CisJc3RydWN0IGF0bV92Y2MgKndhbGs7CisKKwlza19mb3JfZWFjaChzLCBub2RlLCBoZWFkKSB7CisJCXdhbGsgPSBhdG1fc2socyk7CisJCWlmICh3YWxrLT5kZXYgIT0gdmNjLT5kZXYpCisJCQljb250aW51ZTsKKwkJaWYgKHRlc3RfYml0KEFUTV9WRl9BRERSLCAmd2Fsay0+ZmxhZ3MpICYmIHdhbGstPnZwaSA9PSB2cGkgJiYKKwkJICAgIHdhbGstPnZjaSA9PSB2Y2kgJiYgKCh3YWxrLT5xb3MudHh0cC50cmFmZmljX2NsYXNzICE9CisJCSAgICBBVE1fTk9ORSAmJiB2Y2MtPnFvcy50eHRwLnRyYWZmaWNfY2xhc3MgIT0gQVRNX05PTkUpIHx8CisJCSAgICAod2Fsay0+cW9zLnJ4dHAudHJhZmZpY19jbGFzcyAhPSBBVE1fTk9ORSAmJgorCQkgICAgdmNjLT5xb3Mucnh0cC50cmFmZmljX2NsYXNzICE9IEFUTV9OT05FKSkpCisJCQlyZXR1cm4gLUVBRERSSU5VU0U7CisJfQorCisJLyogYWxsb3cgVkNDcyB3aXRoIHNhbWUgVlBJL1ZDSSBpZmYgdGhleSBkb24ndCBjb2xsaWRlIG9uCisJICAgVFgvUlggKGJ1dCB3ZSBtYXkgcmVmdXNlIHN1Y2ggc2hhcmluZyBmb3Igb3RoZXIgcmVhc29ucywKKwkgICBlLmcuIGlmIHByb3RvY29sIHJlcXVpcmVzIHRvIGhhdmUgYm90aCBjaGFubmVscykgKi8KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZmluZF9jaShzdHJ1Y3QgYXRtX3ZjYyAqdmNjLCBzaG9ydCAqdnBpLCBpbnQgKnZjaSkKK3sKKwlzdGF0aWMgc2hvcnQgcDsgICAgICAgIC8qIHBvb3IgbWFuJ3MgcGVyLWRldmljZSBjYWNoZSAqLworCXN0YXRpYyBpbnQgYzsKKwlzaG9ydCBvbGRfcDsKKwlpbnQgb2xkX2M7CisJaW50IGVycjsKKworCWlmICgqdnBpICE9IEFUTV9WUElfQU5ZICYmICp2Y2kgIT0gQVRNX1ZDSV9BTlkpIHsKKwkJZXJyID0gY2hlY2tfY2kodmNjLCAqdnBpLCAqdmNpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLyogbGFzdCBzY2FuIG1heSBoYXZlIGxlZnQgdmFsdWVzIG91dCBvZiBib3VuZHMgZm9yIGN1cnJlbnQgZGV2aWNlICovCisJaWYgKCp2cGkgIT0gQVRNX1ZQSV9BTlkpCisJCXAgPSAqdnBpOworCWVsc2UgaWYgKHAgPj0gMSA8PCB2Y2MtPmRldi0+Y2lfcmFuZ2UudnBpX2JpdHMpCisJCXAgPSAwOworCWlmICgqdmNpICE9IEFUTV9WQ0lfQU5ZKQorCQljID0gKnZjaTsKKwllbHNlIGlmIChjIDwgQVRNX05PVF9SU1ZfVkNJIHx8IGMgPj0gMSA8PCB2Y2MtPmRldi0+Y2lfcmFuZ2UudmNpX2JpdHMpCisJCQljID0gQVRNX05PVF9SU1ZfVkNJOworCW9sZF9wID0gcDsKKwlvbGRfYyA9IGM7CisJZG8geworCQlpZiAoIWNoZWNrX2NpKHZjYywgcCwgYykpIHsKKwkJCSp2cGkgPSBwOworCQkJKnZjaSA9IGM7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoKnZjaSA9PSBBVE1fVkNJX0FOWSkgeworCQkJYysrOworCQkJaWYgKGMgPj0gMSA8PCB2Y2MtPmRldi0+Y2lfcmFuZ2UudmNpX2JpdHMpCisJCQkJYyA9IEFUTV9OT1RfUlNWX1ZDSTsKKwkJfQorCQlpZiAoKGMgPT0gQVRNX05PVF9SU1ZfVkNJIHx8ICp2Y2kgIT0gQVRNX1ZDSV9BTlkpICYmCisJCSAgICAqdnBpID09IEFUTV9WUElfQU5ZKSB7CisJCQlwKys7CisJCQlpZiAocCA+PSAxIDw8IHZjYy0+ZGV2LT5jaV9yYW5nZS52cGlfYml0cykgcCA9IDA7CisJCX0KKwl9CisJd2hpbGUgKG9sZF9wICE9IHAgfHwgb2xkX2MgIT0gYyk7CisJcmV0dXJuIC1FQUREUklOVVNFOworfQorCisKK3N0YXRpYyBpbnQgX192Y2NfY29ubmVjdChzdHJ1Y3QgYXRtX3ZjYyAqdmNjLCBzdHJ1Y3QgYXRtX2RldiAqZGV2LCBzaG9ydCB2cGksCisJCQkgaW50IHZjaSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBza19hdG0odmNjKTsKKwlpbnQgZXJyb3I7CisKKwlpZiAoKHZwaSAhPSBBVE1fVlBJX1VOU1BFQyAmJiB2cGkgIT0gQVRNX1ZQSV9BTlkgJiYKKwkgICAgdnBpID4+IGRldi0+Y2lfcmFuZ2UudnBpX2JpdHMpIHx8ICh2Y2kgIT0gQVRNX1ZDSV9VTlNQRUMgJiYKKwkgICAgdmNpICE9IEFUTV9WQ0lfQU5ZICYmIHZjaSA+PiBkZXYtPmNpX3JhbmdlLnZjaV9iaXRzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHZjaSA+IDAgJiYgdmNpIDwgQVRNX05PVF9SU1ZfVkNJICYmICFjYXBhYmxlKENBUF9ORVRfQklORF9TRVJWSUNFKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwllcnJvciA9IDA7CisJaWYgKCF0cnlfbW9kdWxlX2dldChkZXYtPm9wcy0+b3duZXIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwl2Y2MtPmRldiA9IGRldjsKKwl3cml0ZV9sb2NrX2lycSgmdmNjX3NrbGlzdF9sb2NrKTsKKwlpZiAoKGVycm9yID0gZmluZF9jaSh2Y2MsICZ2cGksICZ2Y2kpKSkgeworCQl3cml0ZV91bmxvY2tfaXJxKCZ2Y2Nfc2tsaXN0X2xvY2spOworCQlnb3RvIGZhaWxfbW9kdWxlX3B1dDsKKwl9CisJdmNjLT52cGkgPSB2cGk7CisJdmNjLT52Y2kgPSB2Y2k7CisJX192Y2NfaW5zZXJ0X3NvY2tldChzayk7CisJd3JpdGVfdW5sb2NrX2lycSgmdmNjX3NrbGlzdF9sb2NrKTsKKwlzd2l0Y2ggKHZjYy0+cW9zLmFhbCkgeworCQljYXNlIEFUTV9BQUwwOgorCQkJZXJyb3IgPSBhdG1faW5pdF9hYWwwKHZjYyk7CisJCQl2Y2MtPnN0YXRzID0gJmRldi0+c3RhdHMuYWFsMDsKKwkJCWJyZWFrOworCQljYXNlIEFUTV9BQUwzNDoKKwkJCWVycm9yID0gYXRtX2luaXRfYWFsMzQodmNjKTsKKwkJCXZjYy0+c3RhdHMgPSAmZGV2LT5zdGF0cy5hYWwzNDsKKwkJCWJyZWFrOworCQljYXNlIEFUTV9OT19BQUw6CisJCQkvKiBBVE1fQUFMNSBpcyBhbHNvIHVzZWQgaW4gdGhlICIwIGZvciBkZWZhdWx0IiBjYXNlICovCisJCQl2Y2MtPnFvcy5hYWwgPSBBVE1fQUFMNTsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIEFUTV9BQUw1OgorCQkJZXJyb3IgPSBhdG1faW5pdF9hYWw1KHZjYyk7CisJCQl2Y2MtPnN0YXRzID0gJmRldi0+c3RhdHMuYWFsNTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyb3IgPSAtRVBST1RPVFlQRTsKKwl9CisJaWYgKCFlcnJvcikgZXJyb3IgPSBhZGp1c3RfdHAoJnZjYy0+cW9zLnR4dHAsdmNjLT5xb3MuYWFsKTsKKwlpZiAoIWVycm9yKSBlcnJvciA9IGFkanVzdF90cCgmdmNjLT5xb3Mucnh0cCx2Y2MtPnFvcy5hYWwpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsOworCURQUklOVEsoIlZDQyAlZC4lZCwgQUFMICVkXG4iLHZwaSx2Y2ksdmNjLT5xb3MuYWFsKTsKKwlEUFJJTlRLKCIgIFRYOiAlZCwgUENSICVkLi4lZCwgU0RVICVkXG4iLHZjYy0+cW9zLnR4dHAudHJhZmZpY19jbGFzcywKKwkgICAgdmNjLT5xb3MudHh0cC5taW5fcGNyLHZjYy0+cW9zLnR4dHAubWF4X3Bjcix2Y2MtPnFvcy50eHRwLm1heF9zZHUpOworCURQUklOVEsoIiAgUlg6ICVkLCBQQ1IgJWQuLiVkLCBTRFUgJWRcbiIsdmNjLT5xb3Mucnh0cC50cmFmZmljX2NsYXNzLAorCSAgICB2Y2MtPnFvcy5yeHRwLm1pbl9wY3IsdmNjLT5xb3Mucnh0cC5tYXhfcGNyLHZjYy0+cW9zLnJ4dHAubWF4X3NkdSk7CisKKwlpZiAoZGV2LT5vcHMtPm9wZW4pIHsKKwkJaWYgKChlcnJvciA9IGRldi0+b3BzLT5vcGVuKHZjYykpKQorCQkJZ290byBmYWlsOworCX0KKwlyZXR1cm4gMDsKKworZmFpbDoKKwl2Y2NfcmVtb3ZlX3NvY2tldChzayk7CitmYWlsX21vZHVsZV9wdXQ6CisJbW9kdWxlX3B1dChkZXYtPm9wcy0+b3duZXIpOworCS8qIGVuc3VyZSB3ZSBnZXQgZGV2IG1vZHVsZSByZWYgY291bnQgY29ycmVjdCAqLworCXZjYy0+ZGV2ID0gTlVMTDsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworaW50IHZjY19jb25uZWN0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBpdGYsIHNob3J0IHZwaSwgaW50IHZjaSkKK3sKKwlzdHJ1Y3QgYXRtX2RldiAqZGV2OworCXN0cnVjdCBhdG1fdmNjICp2Y2MgPSBBVE1fU0Qoc29jayk7CisJaW50IGVycm9yOworCisJRFBSSU5USygidmNjX2Nvbm5lY3QgKHZwaSAlZCwgdmNpICVkKVxuIix2cGksdmNpKTsKKwlpZiAoc29jay0+c3RhdGUgPT0gU1NfQ09OTkVDVEVEKQorCQlyZXR1cm4gLUVJU0NPTk47CisJaWYgKHNvY2stPnN0YXRlICE9IFNTX1VOQ09OTkVDVEVEKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoISh2cGkgfHwgdmNpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodnBpICE9IEFUTV9WUElfVU5TUEVDICYmIHZjaSAhPSBBVE1fVkNJX1VOU1BFQykKKwkJY2xlYXJfYml0KEFUTV9WRl9QQVJUSUFMLCZ2Y2MtPmZsYWdzKTsKKwllbHNlCisJCWlmICh0ZXN0X2JpdChBVE1fVkZfUEFSVElBTCwmdmNjLT5mbGFncykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwlEUFJJTlRLKCJ2Y2NfY29ubmVjdCAoVFg6IGNsICVkLGJ3ICVkLSVkLHNkdSAlZDsgIgorCSAgICAiUlg6IGNsICVkLGJ3ICVkLSVkLHNkdSAlZCxBQUwgJXMlZClcbiIsCisJICAgIHZjYy0+cW9zLnR4dHAudHJhZmZpY19jbGFzcyx2Y2MtPnFvcy50eHRwLm1pbl9wY3IsCisJICAgIHZjYy0+cW9zLnR4dHAubWF4X3Bjcix2Y2MtPnFvcy50eHRwLm1heF9zZHUsCisJICAgIHZjYy0+cW9zLnJ4dHAudHJhZmZpY19jbGFzcyx2Y2MtPnFvcy5yeHRwLm1pbl9wY3IsCisJICAgIHZjYy0+cW9zLnJ4dHAubWF4X3Bjcix2Y2MtPnFvcy5yeHRwLm1heF9zZHUsCisJICAgIHZjYy0+cW9zLmFhbCA9PSBBVE1fQUFMNSA/ICIiIDogdmNjLT5xb3MuYWFsID09IEFUTV9BQUwwID8gIiIgOgorCSAgICAiID8/PyBjb2RlICIsdmNjLT5xb3MuYWFsID09IEFUTV9BQUwwID8gMCA6IHZjYy0+cW9zLmFhbCk7CisJaWYgKCF0ZXN0X2JpdChBVE1fVkZfSEFTUU9TLCAmdmNjLT5mbGFncykpCisJCXJldHVybiAtRUJBREZEOworCWlmICh2Y2MtPnFvcy50eHRwLnRyYWZmaWNfY2xhc3MgPT0gQVRNX0FOWUNMQVNTIHx8CisJICAgIHZjYy0+cW9zLnJ4dHAudHJhZmZpY19jbGFzcyA9PSBBVE1fQU5ZQ0xBU1MpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChpdGYgIT0gQVRNX0lURl9BTlkpIHsKKwkJZGV2ID0gYXRtX2Rldl9sb29rdXAoaXRmKTsKKwkJaWYgKCFkZXYpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJZXJyb3IgPSBfX3ZjY19jb25uZWN0KHZjYywgZGV2LCB2cGksIHZjaSk7CisJCWlmIChlcnJvcikgeworCQkJYXRtX2Rldl9wdXQoZGV2KTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCX0gZWxzZSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuZXh0OworCisJCWRldiA9IE5VTEw7CisJCXNwaW5fbG9jaygmYXRtX2Rldl9sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG5leHQsICZhdG1fZGV2cykgeworCQkJZGV2ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgYXRtX2RldiwgZGV2X2xpc3QpOworCQkJYXRtX2Rldl9ob2xkKGRldik7CisJCQlzcGluX3VubG9jaygmYXRtX2Rldl9sb2NrKTsKKwkJCWlmICghX192Y2NfY29ubmVjdCh2Y2MsIGRldiwgdnBpLCB2Y2kpKQorCQkJCWJyZWFrOworCQkJYXRtX2Rldl9wdXQoZGV2KTsKKwkJCWRldiA9IE5VTEw7CisJCQlzcGluX2xvY2soJmF0bV9kZXZfbG9jayk7CisJCX0KKwkJc3Bpbl91bmxvY2soJmF0bV9kZXZfbG9jayk7CisJCWlmICghZGV2KQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICh2cGkgPT0gQVRNX1ZQSV9VTlNQRUMgfHwgdmNpID09IEFUTV9WQ0lfVU5TUEVDKQorCQlzZXRfYml0KEFUTV9WRl9QQVJUSUFMLCZ2Y2MtPmZsYWdzKTsKKwlpZiAodGVzdF9iaXQoQVRNX1ZGX1JFQURZLCZBVE1fU0Qoc29jayktPmZsYWdzKSkKKwkJc29jay0+c3RhdGUgPSBTU19DT05ORUNURUQ7CisJcmV0dXJuIDA7Cit9CisKKworaW50IHZjY19yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAorCQlzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBhdG1fdmNjICp2Y2M7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgY29waWVkLCBlcnJvciA9IC1FSU5WQUw7CisKKwlpZiAoc29jay0+c3RhdGUgIT0gU1NfQ09OTkVDVEVEKQorCQlyZXR1cm4gLUVOT1RDT05OOworCWlmIChmbGFncyAmIH5NU0dfRE9OVFdBSVQpCQkvKiBvbmx5IGhhbmRsZSBNU0dfRE9OVFdBSVQgKi8KKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCXZjYyA9IEFUTV9TRChzb2NrKTsKKwlpZiAodGVzdF9iaXQoQVRNX1ZGX1JFTEVBU0VELCZ2Y2MtPmZsYWdzKSB8fAorCSAgICB0ZXN0X2JpdChBVE1fVkZfQ0xPU0UsJnZjYy0+ZmxhZ3MpIHx8CisJICAgICF0ZXN0X2JpdChBVE1fVkZfUkVBRFksICZ2Y2MtPmZsYWdzKSkKKwkJcmV0dXJuIDA7CisKKwlza2IgPSBza2JfcmVjdl9kYXRhZ3JhbShzaywgZmxhZ3MsIGZsYWdzICYgTVNHX0RPTlRXQUlULCAmZXJyb3IpOworCWlmICghc2tiKQorCQlyZXR1cm4gZXJyb3I7CisKKwljb3BpZWQgPSBza2ItPmxlbjsgCisJaWYgKGNvcGllZCA+IHNpemUpIHsKKwkJY29waWVkID0gc2l6ZTsgCisJCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19UUlVOQzsKKwl9CisKKyAgICAgICAgZXJyb3IgPSBza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhza2IsIDAsIG1zZy0+bXNnX2lvdiwgY29waWVkKTsKKyAgICAgICAgaWYgKGVycm9yKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgc29ja19yZWN2X3RpbWVzdGFtcChtc2csIHNrLCBza2IpOworICAgICAgICBEUFJJTlRLKCJSY3ZNICVkIC09ICVkXG4iLCBhdG9taWNfcmVhZCgmc2stPnJtZW1fYWxsb2MpLCBza2ItPnRydWVzaXplKTsKKyAgICAgICAgYXRtX3JldHVybih2Y2MsIHNrYi0+dHJ1ZXNpemUpOworICAgICAgICBza2JfZnJlZV9kYXRhZ3JhbShzaywgc2tiKTsKKyAgICAgICAgcmV0dXJuIGNvcGllZDsKK30KKworCitpbnQgdmNjX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptLAorCQlzaXplX3QgdG90YWxfbGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCURFRklORV9XQUlUKHdhaXQpOworCXN0cnVjdCBhdG1fdmNjICp2Y2M7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgZWZmLGVycm9yOworCWNvbnN0IHZvaWQgX191c2VyICpidWZmOworCWludCBzaXplOworCisJbG9ja19zb2NrKHNrKTsKKwlpZiAoc29jay0+c3RhdGUgIT0gU1NfQ09OTkVDVEVEKSB7CisJCWVycm9yID0gLUVOT1RDT05OOworCQlnb3RvIG91dDsKKwl9CisJaWYgKG0tPm1zZ19uYW1lKSB7CisJCWVycm9yID0gLUVJU0NPTk47CisJCWdvdG8gb3V0OworCX0KKwlpZiAobS0+bXNnX2lvdmxlbiAhPSAxKSB7CisJCWVycm9yID0gLUVOT1NZUzsgLyogZml4IHRoaXMgbGF0ZXIgQEBAICovCisJCWdvdG8gb3V0OworCX0KKwlidWZmID0gbS0+bXNnX2lvdi0+aW92X2Jhc2U7CisJc2l6ZSA9IG0tPm1zZ19pb3YtPmlvdl9sZW47CisJdmNjID0gQVRNX1NEKHNvY2spOworCWlmICh0ZXN0X2JpdChBVE1fVkZfUkVMRUFTRUQsICZ2Y2MtPmZsYWdzKSB8fAorCSAgICB0ZXN0X2JpdChBVE1fVkZfQ0xPU0UsICZ2Y2MtPmZsYWdzKSB8fAorCSAgICAhdGVzdF9iaXQoQVRNX1ZGX1JFQURZLCAmdmNjLT5mbGFncykpIHsKKwkJZXJyb3IgPSAtRVBJUEU7CisJCXNlbmRfc2lnKFNJR1BJUEUsIGN1cnJlbnQsIDApOworCQlnb3RvIG91dDsKKwl9CisJaWYgKCFzaXplKSB7CisJCWVycm9yID0gMDsKKwkJZ290byBvdXQ7CisJfQorCWlmIChzaXplIDwgMCB8fCBzaXplID4gdmNjLT5xb3MudHh0cC5tYXhfc2R1KSB7CisJCWVycm9yID0gLUVNU0dTSVpFOworCQlnb3RvIG91dDsKKwl9CisJLyogdmVyaWZ5X2FyZWEgaXMgZG9uZSBieSBuZXQvc29ja2V0LmMgKi8KKwllZmYgPSAoc2l6ZSszKSAmIH4zOyAvKiBhbGlnbiB0byB3b3JkIGJvdW5kYXJ5ICovCisJcHJlcGFyZV90b193YWl0KHNrLT5za19zbGVlcCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJZXJyb3IgPSAwOworCXdoaWxlICghKHNrYiA9IGFsbG9jX3R4KHZjYyxlZmYpKSkgeworCQlpZiAobS0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlUKSB7CisJCQllcnJvciA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJfQorCQlzY2hlZHVsZSgpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCWVycm9yID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHRlc3RfYml0KEFUTV9WRl9SRUxFQVNFRCwmdmNjLT5mbGFncykgfHwKKwkJICAgIHRlc3RfYml0KEFUTV9WRl9DTE9TRSwmdmNjLT5mbGFncykgfHwKKwkJICAgICF0ZXN0X2JpdChBVE1fVkZfUkVBRFksJnZjYy0+ZmxhZ3MpKSB7CisJCQllcnJvciA9IC1FUElQRTsKKwkJCXNlbmRfc2lnKFNJR1BJUEUsIGN1cnJlbnQsIDApOworCQkJYnJlYWs7CisJCX0KKwkJcHJlcGFyZV90b193YWl0KHNrLT5za19zbGVlcCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJfQorCWZpbmlzaF93YWl0KHNrLT5za19zbGVlcCwgJndhaXQpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisJc2tiLT5kZXYgPSBOVUxMOyAvKiBmb3IgcGF0aHMgc2hhcmVkIHdpdGggbmV0X2RldmljZSBpbnRlcmZhY2VzICovCisJQVRNX1NLQihza2IpLT5hdG1fb3B0aW9ucyA9IHZjYy0+YXRtX29wdGlvbnM7CisJaWYgKGNvcHlfZnJvbV91c2VyKHNrYl9wdXQoc2tiLHNpemUpLGJ1ZmYsc2l6ZSkpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWVycm9yID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCWlmIChlZmYgIT0gc2l6ZSkgbWVtc2V0KHNrYi0+ZGF0YStzaXplLDAsZWZmLXNpemUpOworCWVycm9yID0gdmNjLT5kZXYtPm9wcy0+c2VuZCh2Y2Msc2tiKTsKKwllcnJvciA9IGVycm9yID8gZXJyb3IgOiBzaXplOworb3V0OgorCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycm9yOworfQorCisKK3Vuc2lnbmVkIGludCB2Y2NfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHNvY2tldCAqc29jaywgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgYXRtX3ZjYyAqdmNjOworCXVuc2lnbmVkIGludCBtYXNrOworCisJcG9sbF93YWl0KGZpbGUsIHNrLT5za19zbGVlcCwgd2FpdCk7CisJbWFzayA9IDA7CisKKwl2Y2MgPSBBVE1fU0Qoc29jayk7CisKKwkvKiBleGNlcHRpb25hbCBldmVudHMgKi8KKwlpZiAoc2stPnNrX2VycikKKwkJbWFzayA9IFBPTExFUlI7CisKKwlpZiAodGVzdF9iaXQoQVRNX1ZGX1JFTEVBU0VELCAmdmNjLT5mbGFncykgfHwKKwkgICAgdGVzdF9iaXQoQVRNX1ZGX0NMT1NFLCAmdmNjLT5mbGFncykpCisJCW1hc2sgfD0gUE9MTEhVUDsKKworCS8qIHJlYWRhYmxlPyAqLworCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKworCS8qIHdyaXRhYmxlPyAqLworCWlmIChzb2NrLT5zdGF0ZSA9PSBTU19DT05ORUNUSU5HICYmCisJICAgIHRlc3RfYml0KEFUTV9WRl9XQUlUSU5HLCAmdmNjLT5mbGFncykpCisJCXJldHVybiBtYXNrOworCisJaWYgKHZjYy0+cW9zLnR4dHAudHJhZmZpY19jbGFzcyAhPSBBVE1fTk9ORSAmJgorCSAgICB2Y2Nfd3JpdGFibGUoc2spKQorCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNIHwgUE9MTFdSQkFORDsKKworCXJldHVybiBtYXNrOworfQorCisKK3N0YXRpYyBpbnQgYXRtX2NoYW5nZV9xb3Moc3RydWN0IGF0bV92Y2MgKnZjYyxzdHJ1Y3QgYXRtX3FvcyAqcW9zKQoreworCWludCBlcnJvcjsKKworCS8qCisJICogRG9uJ3QgbGV0IHRoZSBRb1MgY2hhbmdlIHRoZSBhbHJlYWR5IGNvbm5lY3RlZCBBQUwgdHlwZSBub3IgdGhlCisJICogdHJhZmZpYyBjbGFzcy4KKwkgKi8KKwlpZiAocW9zLT5hYWwgIT0gdmNjLT5xb3MuYWFsIHx8CisJICAgIHFvcy0+cnh0cC50cmFmZmljX2NsYXNzICE9IHZjYy0+cW9zLnJ4dHAudHJhZmZpY19jbGFzcyB8fAorCSAgICBxb3MtPnR4dHAudHJhZmZpY19jbGFzcyAhPSB2Y2MtPnFvcy50eHRwLnRyYWZmaWNfY2xhc3MpCisJCXJldHVybiAtRUlOVkFMOworCWVycm9yID0gYWRqdXN0X3RwKCZxb3MtPnR4dHAscW9zLT5hYWwpOworCWlmICghZXJyb3IpIGVycm9yID0gYWRqdXN0X3RwKCZxb3MtPnJ4dHAscW9zLT5hYWwpOworCWlmIChlcnJvcikgcmV0dXJuIGVycm9yOworCWlmICghdmNjLT5kZXYtPm9wcy0+Y2hhbmdlX3FvcykgcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmIChza19hdG0odmNjKS0+c2tfZmFtaWx5ID09IEFGX0FUTVBWQykKKwkJcmV0dXJuIHZjYy0+ZGV2LT5vcHMtPmNoYW5nZV9xb3ModmNjLHFvcyxBVE1fTUZfU0VUKTsKKwlyZXR1cm4gc3ZjX2NoYW5nZV9xb3ModmNjLHFvcyk7Cit9CisKKworc3RhdGljIGludCBjaGVja190cChzdHJ1Y3QgYXRtX3RyYWZwcm0gKnRwKQoreworCS8qIEBAQCBTaG91bGQgYmUgbWVyZ2VkIHdpdGggYWRqdXN0X3RwICovCisJaWYgKCF0cC0+dHJhZmZpY19jbGFzcyB8fCB0cC0+dHJhZmZpY19jbGFzcyA9PSBBVE1fQU5ZQ0xBU1MpIHJldHVybiAwOworCWlmICh0cC0+dHJhZmZpY19jbGFzcyAhPSBBVE1fVUJSICYmICF0cC0+bWluX3BjciAmJiAhdHAtPnBjciAmJgorCSAgICAhdHAtPm1heF9wY3IpIHJldHVybiAtRUlOVkFMOworCWlmICh0cC0+bWluX3BjciA9PSBBVE1fTUFYX1BDUikgcmV0dXJuIC1FSU5WQUw7CisJaWYgKHRwLT5taW5fcGNyICYmIHRwLT5tYXhfcGNyICYmIHRwLT5tYXhfcGNyICE9IEFUTV9NQVhfUENSICYmCisJICAgIHRwLT5taW5fcGNyID4gdHAtPm1heF9wY3IpIHJldHVybiAtRUlOVkFMOworCS8qCisJICogV2UgYWxsb3cgcGNyIHRvIGJlIG91dHNpZGUgW21pbl9wY3IsbWF4X3Bjcl0sIGJlY2F1c2UgbGF0ZXIKKwkgKiBhZGp1c3RtZW50IG1heSBzdGlsbCBwdXNoIGl0IGluIHRoZSB2YWxpZCByYW5nZS4KKwkgKi8KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGNoZWNrX3FvcyhzdHJ1Y3QgYXRtX3FvcyAqcW9zKQoreworCWludCBlcnJvcjsKKworCWlmICghcW9zLT50eHRwLnRyYWZmaWNfY2xhc3MgJiYgIXFvcy0+cnh0cC50cmFmZmljX2NsYXNzKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCWlmIChxb3MtPnR4dHAudHJhZmZpY19jbGFzcyAhPSBxb3MtPnJ4dHAudHJhZmZpY19jbGFzcyAmJgorCSAgICBxb3MtPnR4dHAudHJhZmZpY19jbGFzcyAmJiBxb3MtPnJ4dHAudHJhZmZpY19jbGFzcyAmJgorCSAgICBxb3MtPnR4dHAudHJhZmZpY19jbGFzcyAhPSBBVE1fQU5ZQ0xBU1MgJiYKKwkgICAgcW9zLT5yeHRwLnRyYWZmaWNfY2xhc3MgIT0gQVRNX0FOWUNMQVNTKSByZXR1cm4gLUVJTlZBTDsKKwllcnJvciA9IGNoZWNrX3RwKCZxb3MtPnR4dHApOworCWlmIChlcnJvcikgcmV0dXJuIGVycm9yOworCXJldHVybiBjaGVja190cCgmcW9zLT5yeHRwKTsKK30KKworaW50IHZjY19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCSAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCit7CisJc3RydWN0IGF0bV92Y2MgKnZjYzsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWludCBlcnJvcjsKKworCWlmIChfX1NPX0xFVkVMX01BVENIKG9wdG5hbWUsIGxldmVsKSAmJiBvcHRsZW4gIT0gX19TT19TSVpFKG9wdG5hbWUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZjYyA9IEFUTV9TRChzb2NrKTsKKwlzd2l0Y2ggKG9wdG5hbWUpIHsKKwkJY2FzZSBTT19BVE1RT1M6CisJCQl7CisJCQkJc3RydWN0IGF0bV9xb3MgcW9zOworCisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZxb3Msb3B0dmFsLHNpemVvZihxb3MpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJZXJyb3IgPSBjaGVja19xb3MoJnFvcyk7CisJCQkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJCQkJaWYgKHNvY2stPnN0YXRlID09IFNTX0NPTk5FQ1RFRCkKKwkJCQkJcmV0dXJuIGF0bV9jaGFuZ2VfcW9zKHZjYywmcW9zKTsKKwkJCQlpZiAoc29jay0+c3RhdGUgIT0gU1NfVU5DT05ORUNURUQpCisJCQkJCXJldHVybiAtRUJBREZEOworCQkJCXZjYy0+cW9zID0gcW9zOworCQkJCXNldF9iaXQoQVRNX1ZGX0hBU1FPUywmdmNjLT5mbGFncyk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCWNhc2UgU09fU0VUQ0xQOgorCQkJaWYgKGdldF91c2VyKHZhbHVlLCh1bnNpZ25lZCBsb25nIF9fdXNlciAqKW9wdHZhbCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAodmFsdWUpIHZjYy0+YXRtX29wdGlvbnMgfD0gQVRNX0FUTU9QVF9DTFA7CisJCQllbHNlIHZjYy0+YXRtX29wdGlvbnMgJj0gfkFUTV9BVE1PUFRfQ0xQOworCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CisJCQlpZiAobGV2ZWwgPT0gU09MX1NPQ0tFVCkgcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwl9CisJaWYgKCF2Y2MtPmRldiB8fCAhdmNjLT5kZXYtPm9wcy0+c2V0c29ja29wdCkgcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHZjYy0+ZGV2LT5vcHMtPnNldHNvY2tvcHQodmNjLGxldmVsLG9wdG5hbWUsb3B0dmFsLG9wdGxlbik7Cit9CisKKworaW50IHZjY19nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCSAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKK3sKKwlzdHJ1Y3QgYXRtX3ZjYyAqdmNjOworCWludCBsZW47CisKKwlpZiAoZ2V0X3VzZXIobGVuLCBvcHRsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoX19TT19MRVZFTF9NQVRDSChvcHRuYW1lLCBsZXZlbCkgJiYgbGVuICE9IF9fU09fU0laRShvcHRuYW1lKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2Y2MgPSBBVE1fU0Qoc29jayk7CisJc3dpdGNoIChvcHRuYW1lKSB7CisJCWNhc2UgU09fQVRNUU9TOgorCQkJaWYgKCF0ZXN0X2JpdChBVE1fVkZfSEFTUU9TLCZ2Y2MtPmZsYWdzKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiBjb3B5X3RvX3VzZXIob3B0dmFsLCZ2Y2MtPnFvcyxzaXplb2YodmNjLT5xb3MpKSA/CisJCQkgICAgLUVGQVVMVCA6IDA7CisJCWNhc2UgU09fU0VUQ0xQOgorCQkJcmV0dXJuIHB1dF91c2VyKHZjYy0+YXRtX29wdGlvbnMgJiBBVE1fQVRNT1BUX0NMUCA/IDEgOgorCQkJICAwLCh1bnNpZ25lZCBsb25nIF9fdXNlciAqKW9wdHZhbCkgPyAtRUZBVUxUIDogMDsKKwkJY2FzZSBTT19BVE1QVkM6CisJCQl7CisJCQkJc3RydWN0IHNvY2thZGRyX2F0bXB2YyBwdmM7CisKKwkJCQlpZiAoIXZjYy0+ZGV2IHx8CisJCQkJICAgICF0ZXN0X2JpdChBVE1fVkZfQUREUiwmdmNjLT5mbGFncykpCisJCQkJCXJldHVybiAtRU5PVENPTk47CisJCQkJcHZjLnNhcF9mYW1pbHkgPSBBRl9BVE1QVkM7CisJCQkJcHZjLnNhcF9hZGRyLml0ZiA9IHZjYy0+ZGV2LT5udW1iZXI7CisJCQkJcHZjLnNhcF9hZGRyLnZwaSA9IHZjYy0+dnBpOworCQkJCXB2Yy5zYXBfYWRkci52Y2kgPSB2Y2MtPnZjaTsKKwkJCQlyZXR1cm4gY29weV90b191c2VyKG9wdHZhbCwmcHZjLHNpemVvZihwdmMpKSA/CisJCQkJICAgIC1FRkFVTFQgOiAwOworCQkJfQorCQlkZWZhdWx0OgorCQkJaWYgKGxldmVsID09IFNPTF9TT0NLRVQpIHJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJfQorCWlmICghdmNjLT5kZXYgfHwgIXZjYy0+ZGV2LT5vcHMtPmdldHNvY2tvcHQpIHJldHVybiAtRUlOVkFMOworCXJldHVybiB2Y2MtPmRldi0+b3BzLT5nZXRzb2Nrb3B0KHZjYywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgbGVuKTsKK30KKworc3RhdGljIGludCBfX2luaXQgYXRtX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyb3I7CisKKwlpZiAoKGVycm9yID0gcHJvdG9fcmVnaXN0ZXIoJnZjY19wcm90bywgMCkpIDwgMCkKKwkJZ290byBvdXQ7CisKKwlpZiAoKGVycm9yID0gYXRtcHZjX2luaXQoKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXRtcHZjX2luaXQoKSBmYWlsZWQgd2l0aCAlZFxuIiwgZXJyb3IpOworCQlnb3RvIG91dF91bnJlZ2lzdGVyX3ZjY19wcm90bzsKKwl9CisJaWYgKChlcnJvciA9IGF0bXN2Y19pbml0KCkpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImF0bXN2Y19pbml0KCkgZmFpbGVkIHdpdGggJWRcbiIsIGVycm9yKTsKKwkJZ290byBvdXRfYXRtcHZjX2V4aXQ7CisJfQorICAgICAgICBpZiAoKGVycm9yID0gYXRtX3Byb2NfaW5pdCgpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhdG1fcHJvY19pbml0KCkgZmFpbGVkIHdpdGggJWRcbiIsZXJyb3IpOworCQlnb3RvIG91dF9hdG1zdmNfZXhpdDsKKwl9CitvdXQ6CisJcmV0dXJuIGVycm9yOworb3V0X2F0bXN2Y19leGl0OgorCWF0bXN2Y19leGl0KCk7CitvdXRfYXRtcHZjX2V4aXQ6CisJYXRtc3ZjX2V4aXQoKTsKK291dF91bnJlZ2lzdGVyX3ZjY19wcm90bzoKKwlwcm90b191bnJlZ2lzdGVyKCZ2Y2NfcHJvdG8pOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXRtX2V4aXQodm9pZCkKK3sKKwlhdG1fcHJvY19leGl0KCk7CisJYXRtc3ZjX2V4aXQoKTsKKwlhdG1wdmNfZXhpdCgpOworCXByb3RvX3VucmVnaXN0ZXIoJnZjY19wcm90byk7Cit9CisKK21vZHVsZV9pbml0KGF0bV9pbml0KTsKK21vZHVsZV9leGl0KGF0bV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX05FVFBST1RPKFBGX0FUTVBWQyk7CitNT0RVTEVfQUxJQVNfTkVUUFJPVE8oUEZfQVRNU1ZDKTsKZGlmZiAtLWdpdCBhL25ldC9hdG0vY29tbW9uLmggYi9uZXQvYXRtL2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OWVkNDFjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2F0bS9jb21tb24uaApAQCAtMCwwICsxLDUwIEBACisvKiBuZXQvYXRtL2NvbW1vbi5oIC0gQVRNIHNvY2tldHMgKGNvbW1vbiBwYXJ0IGZvciBQVkMgYW5kIFNWQykgKi8KKyAKKy8qIFdyaXR0ZW4gMTk5NS0yMDAwIGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgRVBGTCBMUkMvSUNBICovCisKKworI2lmbmRlZiBORVRfQVRNX0NPTU1PTl9ICisjZGVmaW5lIE5FVF9BVE1fQ09NTU9OX0gKKworI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4gLyogZm9yIHBvbGxfdGFibGUgKi8KKworCitpbnQgdmNjX2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgcHJvdG9jb2wsIGludCBmYW1pbHkpOworaW50IHZjY19yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKnNvY2spOworaW50IHZjY19jb25uZWN0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBpdGYsIHNob3J0IHZwaSwgaW50IHZjaSk7CitpbnQgdmNjX3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCXNpemVfdCBzaXplLCBpbnQgZmxhZ3MpOworaW50IHZjY19zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbSwKKwkJc2l6ZV90IHRvdGFsX2xlbik7Cit1bnNpZ25lZCBpbnQgdmNjX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIHBvbGxfdGFibGUgKndhaXQpOworaW50IHZjY19pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitpbnQgdmNjX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbik7CitpbnQgdmNjX2dldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKTsKKworaW50IGF0bXB2Y19pbml0KHZvaWQpOwordm9pZCBhdG1wdmNfZXhpdCh2b2lkKTsKK2ludCBhdG1zdmNfaW5pdCh2b2lkKTsKK3ZvaWQgYXRtc3ZjX2V4aXQodm9pZCk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworaW50IGF0bV9wcm9jX2luaXQodm9pZCk7Cit2b2lkIGF0bV9wcm9jX2V4aXQodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgYXRtX3Byb2NfaW5pdCh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRtX3Byb2NfZXhpdCh2b2lkKQoreworCS8qIG5vdGhpbmcgKi8KK30KKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCisvKiBTVkMgKi8KK2ludCBzdmNfY2hhbmdlX3FvcyhzdHJ1Y3QgYXRtX3ZjYyAqdmNjLHN0cnVjdCBhdG1fcW9zICpxb3MpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9hdG0vaW9jdGwuYyBiL25ldC9hdG0vaW9jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGJiNWFmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2F0bS9pb2N0bC5jCkBAIC0wLDAgKzEsMTM5IEBACisvKiBBVE0gaW9jdGwgaGFuZGxpbmcgKi8KKworLyogV3JpdHRlbiAxOTk1LTIwMDAgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIExSQy9JQ0EgKi8KKy8qIDIwMDMgSm9obiBMZXZvbiAgPGxldm9uQG1vdmVtZW50YXJpYW4ub3JnPiAqLworCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CQkvKiBzdHJ1Y3Qgc29ja2V0LCBzdHJ1Y3QgcHJvdG9fb3BzICovCisjaW5jbHVkZSA8bGludXgvYXRtLmg+CQkvKiBBVE0gc3R1ZmYgKi8KKyNpbmNsdWRlIDxsaW51eC9hdG1kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1jbGlwLmg+CS8qIENMSVBfKkVOQ0FQICovCisjaW5jbHVkZSA8bGludXgvYXRtYXJwLmg+CS8qIG1hbmlmZXN0IGNvbnN0YW50cyAqLworI2luY2x1ZGUgPGxpbnV4L3NvbmV0Lmg+CS8qIGZvciBpb2N0bHMgKi8KKyNpbmNsdWRlIDxsaW51eC9hdG1zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1tcGMuaD4KKyNpbmNsdWRlIDxuZXQvYXRtY2xpcC5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWxlYy5oPgorI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKworI2luY2x1ZGUgInJlc291cmNlcy5oIgorI2luY2x1ZGUgInNpZ25hbGluZy5oIgkJLyogZm9yIFdBSVRJTkcgYW5kIHNpZ2RfYXR0YWNoICovCisKKworc3RhdGljIERFQ0xBUkVfTVVURVgoaW9jdGxfbXV0ZXgpOworc3RhdGljIExJU1RfSEVBRChpb2N0bF9saXN0KTsKKworCit2b2lkIHJlZ2lzdGVyX2F0bV9pb2N0bChzdHJ1Y3QgYXRtX2lvY3RsICppb2N0bCkKK3sKKwlkb3duKCZpb2N0bF9tdXRleCk7CisJbGlzdF9hZGRfdGFpbCgmaW9jdGwtPmxpc3QsICZpb2N0bF9saXN0KTsKKwl1cCgmaW9jdGxfbXV0ZXgpOworfQorCit2b2lkIGRlcmVnaXN0ZXJfYXRtX2lvY3RsKHN0cnVjdCBhdG1faW9jdGwgKmlvY3RsKQoreworCWRvd24oJmlvY3RsX211dGV4KTsKKwlsaXN0X2RlbCgmaW9jdGwtPmxpc3QpOworCXVwKCZpb2N0bF9tdXRleCk7Cit9CisKK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfYXRtX2lvY3RsKTsKK0VYUE9SVF9TWU1CT0woZGVyZWdpc3Rlcl9hdG1faW9jdGwpOworCitpbnQgdmNjX2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBhdG1fdmNjICp2Y2M7CisJaW50IGVycm9yOworCXN0cnVjdCBsaXN0X2hlYWQgKiBwb3M7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwl2Y2MgPSBBVE1fU0Qoc29jayk7CisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBTSU9DT1VUUToKKwkJCWlmIChzb2NrLT5zdGF0ZSAhPSBTU19DT05ORUNURUQgfHwKKwkJCSAgICAhdGVzdF9iaXQoQVRNX1ZGX1JFQURZLCAmdmNjLT5mbGFncykpIHsKKwkJCQllcnJvciA9ICAtRUlOVkFMOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCWVycm9yID0gcHV0X3VzZXIoc2stPnNrX3NuZGJ1ZiAtCisJCQkJCSBhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpLAorCQkJCQkgKGludCBfX3VzZXIgKikgYXJncCkgPyAtRUZBVUxUIDogMDsKKwkJCWdvdG8gZG9uZTsKKwkJY2FzZSBTSU9DSU5ROgorCQkJeworCQkJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJCQlpZiAoc29jay0+c3RhdGUgIT0gU1NfQ09OTkVDVEVEKSB7CisJCQkJCWVycm9yID0gLUVJTlZBTDsKKwkJCQkJZ290byBkb25lOworCQkJCX0KKwkJCQlza2IgPSBza2JfcGVlaygmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCQkJCWVycm9yID0gcHV0X3VzZXIoc2tiID8gc2tiLT5sZW4gOiAwLAorCQkJCQkgCSAoaW50IF9fdXNlciAqKWFyZ3ApID8gLUVGQVVMVCA6IDA7CisJCQkJZ290byBkb25lOworCQkJfQorCQljYXNlIFNJT0NHU1RBTVA6IC8qIGJvcnJvd2VkIGZyb20gSVAgKi8KKwkJCWVycm9yID0gc29ja19nZXRfdGltZXN0YW1wKHNrLCBhcmdwKTsKKwkJCWdvdG8gZG9uZTsKKwkJY2FzZSBBVE1fU0VUU0M6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJBVE1fU0VUU0MgaXMgb2Jzb2xldGVcbiIpOworCQkJZXJyb3IgPSAwOworCQkJZ290byBkb25lOworCQljYXNlIEFUTVNJR0RfQ1RSTDoKKwkJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJCWVycm9yID0gLUVQRVJNOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCS8qCisJCQkgKiBUaGUgdXNlci9rZXJuZWwgcHJvdG9jb2wgZm9yIGV4Y2hhbmdpbmcgc2lnbmFsbGluZworCQkJICogaW5mbyB1c2VzIGtlcm5lbCBwb2ludGVycyBhcyBvcGFxdWUgcmVmZXJlbmNlcywKKwkJCSAqIHNvIHRoZSBob2xkZXIgb2YgdGhlIGZpbGUgZGVzY3JpcHRvciBjYW4gc2NyaWJibGUKKwkJCSAqIG9uIHRoZSBrZXJuZWwuLi4gc28gd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHdlCisJCQkgKiBoYXZlIHRoZSBzYW1lIHByaXZsZWRnZXMgdGhhdCAvcHJvYy9rY29yZSBuZWVkcworCQkJICovCisJCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpIHsKKwkJCQllcnJvciA9IC1FUEVSTTsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCQllcnJvciA9IHNpZ2RfYXR0YWNoKHZjYyk7CisJCQlpZiAoIWVycm9yKQorCQkJCXNvY2stPnN0YXRlID0gU1NfQ09OTkVDVEVEOworCQkJZ290byBkb25lOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJaWYgKGNtZCA9PSBBVE1NUENfQ1RSTCB8fCBjbWQgPT0gQVRNTVBDX0RBVEEpCisJCXJlcXVlc3RfbW9kdWxlKCJtcG9hIik7CisJaWYgKGNtZCA9PSBBVE1BUlBEX0NUUkwpCisJCXJlcXVlc3RfbW9kdWxlKCJjbGlwIik7CisJaWYgKGNtZCA9PSBBVE1MRUNfQ1RSTCkKKwkJcmVxdWVzdF9tb2R1bGUoImxlYyIpOworCisJZXJyb3IgPSAtRU5PSU9DVExDTUQ7CisKKwlkb3duKCZpb2N0bF9tdXRleCk7CisJbGlzdF9mb3JfZWFjaChwb3MsICZpb2N0bF9saXN0KSB7CisJCXN0cnVjdCBhdG1faW9jdGwgKiBpYyA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgYXRtX2lvY3RsLCBsaXN0KTsKKwkJaWYgKHRyeV9tb2R1bGVfZ2V0KGljLT5vd25lcikpIHsKKwkJCWVycm9yID0gaWMtPmlvY3RsKHNvY2ssIGNtZCwgYXJnKTsKKwkJCW1vZHVsZV9wdXQoaWMtPm93bmVyKTsKKwkJCWlmIChlcnJvciAhPSAtRU5PSU9DVExDTUQpCisJCQkJYnJlYWs7CisJCX0KKwl9CisJdXAoJmlvY3RsX211dGV4KTsKKworCWlmIChlcnJvciAhPSAtRU5PSU9DVExDTUQpCisJCWdvdG8gZG9uZTsKKworCWVycm9yID0gYXRtX2Rldl9pb2N0bChjbWQsIGFyZ3ApOworCitkb25lOgorCXJldHVybiBlcnJvcjsKK30KZGlmZiAtLWdpdCBhL25ldC9hdG0vaXBjb21tb24uYyBiL25ldC9hdG0vaXBjb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODFhMzAwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2F0bS9pcGNvbW1vbi5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qIG5ldC9hdG0vaXBjb21tb24uYyAtIENvbW1vbiBpdGVtcyBmb3IgYWxsIHdheXMgb2YgZG9pbmcgSVAgb3ZlciBBVE0gKi8KKworLyogV3JpdHRlbiAxOTk2LTIwMDAgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIExSQy9JQ0EgKi8KKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1jbGlwLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJpcGNvbW1vbi5oIgorCisKKyNpZiAwCisjZGVmaW5lIERQUklOVEsoZm9ybWF0LGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCwjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBEUFJJTlRLKGZvcm1hdCxhcmdzLi4uKQorI2VuZGlmCisKKworLyoKKyAqIHNrYl9taWdyYXRlIGFwcGVuZHMgdGhlIGxpc3QgYXQgImZyb20iIHRvICJ0byIsIGVtcHR5aW5nICJmcm9tIiBpbiB0aGUKKyAqIHByb2Nlc3MuIHNrYl9taWdyYXRlIGlzIGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gYWxsIG90aGVyIHNrYiBvcGVyYXRpb25zIG9uCisgKiAiZnJvbSIgYW5kICJ0byIuIE5vdGUgdGhhdCBpdCBsb2NrcyBib3RoIGxpc3RzIGF0IHRoZSBzYW1lIHRpbWUsIHNvIGJld2FyZQorICogb2YgcG90ZW50aWFsIGRlYWRsb2Nrcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBsaXZlIGluIHNrYnVmZi5jIG9yIHNrYnVmZi5oLgorICovCisKKwordm9pZCBza2JfbWlncmF0ZShzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpmcm9tLHN0cnVjdCBza19idWZmX2hlYWQgKnRvKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2Zyb20gPSAoc3RydWN0IHNrX2J1ZmYgKikgZnJvbTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3RvID0gKHN0cnVjdCBza19idWZmICopIHRvOworCXN0cnVjdCBza19idWZmICpwcmV2OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZyb20tPmxvY2ssZmxhZ3MpOworCXNwaW5fbG9jaygmdG8tPmxvY2spOworCXByZXYgPSBmcm9tLT5wcmV2OworCWZyb20tPm5leHQtPnByZXYgPSB0by0+cHJldjsKKwlwcmV2LT5uZXh0ID0gc2tiX3RvOworCXRvLT5wcmV2LT5uZXh0ID0gZnJvbS0+bmV4dDsKKwl0by0+cHJldiA9IGZyb20tPnByZXY7CisJZm9yIChza2IgPSBmcm9tLT5uZXh0OyBza2IgIT0gc2tiX3RvOyBza2IgPSBza2ItPm5leHQpCisJCXNrYi0+bGlzdCA9IHRvOworCXRvLT5xbGVuICs9IGZyb20tPnFsZW47CisJc3Bpbl91bmxvY2soJnRvLT5sb2NrKTsKKwlmcm9tLT5wcmV2ID0gc2tiX2Zyb207CisJZnJvbS0+bmV4dCA9IHNrYl9mcm9tOworCWZyb20tPnFsZW4gPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZyb20tPmxvY2ssZmxhZ3MpOworfQorCisKK0VYUE9SVF9TWU1CT0woc2tiX21pZ3JhdGUpOwpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9pcGNvbW1vbi5oIGIvbmV0L2F0bS9pcGNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MjE2NWYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYXRtL2lwY29tbW9uLmgKQEAgLTAsMCArMSwyMiBAQAorLyogbmV0L2F0bS9pcGNvbW1vbi5oIC0gQ29tbW9uIGl0ZW1zIGZvciBhbGwgd2F5cyBvZiBkb2luZyBJUCBvdmVyIEFUTSAqLworCisvKiBXcml0dGVuIDE5OTYtMjAwMCBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIEVQRkwgTFJDL0lDQSAqLworCisKKyNpZm5kZWYgTkVUX0FUTV9JUENPTU1PTl9ICisjZGVmaW5lIE5FVF9BVE1fSVBDT01NT05fSAorCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1kZXYuaD4KKworLyoKKyAqIEFwcGVuZHMgYWxsIHNrYnMgZnJvbSAiZnJvbSIgdG8gInRvIi4gVGhlIG9wZXJhdGlvbiBpcyBhdG9taWMgd2l0aCByZXNwZWN0CisgKiB0byBhbGwgb3RoZXIgc2tiIG9wZXJhdGlvbnMgb24gImZyb20iIG9yICJ0byIuCisgKi8KKwordm9pZCBza2JfbWlncmF0ZShzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpmcm9tLHN0cnVjdCBza19idWZmX2hlYWQgKnRvKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvYXRtL2xlYy5jIGIvbmV0L2F0bS9sZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDc1MjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2F0bS9sZWMuYwpAQCAtMCwwICsxLDI1MzggQEAKKy8qCisgKiBsZWMuYzogTGFuIEVtdWxhdGlvbiBkcml2ZXIgCisgKiBNYXJrbyBLaWlza2lsYSBta2lpc2tpbGFAeWFob28uY29tCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworLyogV2UgYXJlIGV0aGVybmV0IGRldmljZSAqLworI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorI2luY2x1ZGUgPG5ldC9kc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworLyogVG9rZW5SaW5nIGlmIG5lZWRlZCAqLworI2lmZGVmIENPTkZJR19UUgorI2luY2x1ZGUgPGxpbnV4L3RyZGV2aWNlLmg+CisjZW5kaWYKKworLyogQW5kIGF0bSBkZXZpY2UgKi8KKyNpbmNsdWRlIDxsaW51eC9hdG1kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1sZWMuaD4KKworLyogUHJveHkgTEVDIGtub3dzIGFib3V0IGJyaWRnaW5nICovCisjaWYgZGVmaW5lZChDT05GSUdfQlJJREdFKSB8fCBkZWZpbmVkKENPTkZJR19CUklER0VfTU9EVUxFKQorI2luY2x1ZGUgPGxpbnV4L2lmX2JyaWRnZS5oPgorI2luY2x1ZGUgIi4uL2JyaWRnZS9icl9wcml2YXRlLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJyaWRnZV91bGFfbGVjW10gPSB7MHgwMSwgMHg4MCwgMHhjMiwgMHgwMCwgMHgwMH07CisjZW5kaWYKKworLyogTW9kdWxhciB0b28gKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlICJsZWMuaCIKKyNpbmNsdWRlICJsZWNfYXJwYy5oIgorI2luY2x1ZGUgInJlc291cmNlcy5oIgorCisjaWYgMAorI2RlZmluZSBEUFJJTlRLIHByaW50aworI2Vsc2UKKyNkZWZpbmUgRFBSSU5USyhmb3JtYXQsYXJncy4uLikKKyNlbmRpZgorCisjZGVmaW5lIERVTVBfUEFDS0VUUyAwIC8qIDAgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgKiAxID0gMzAgZmlyc3QgYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICogMiA9IFdob2xlIHBhY2tldAorICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBMRUNfVU5SRVNfUVVFX0xFTiA4IC8qIG51bWJlciBvZiB0eCBwYWNrZXRzIHRvIHF1ZXVlIGZvciBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlIGRlc3RpbmF0aW9uIHdoaWxlIHdhaXRpbmcgZm9yIFNWQyAqLworCitzdGF0aWMgaW50IGxlY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBsZWNfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbGVjX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpsZWNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbGVjX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IGxlY19hcnBfdGFibGUqIGxlY19hcnBfZmluZChzdHJ1Y3QgbGVjX3ByaXYgKnByaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm1hY19hZGRyKTsKK3N0YXRpYyBpbnQgbGVjX2FycF9yZW1vdmUoc3RydWN0IGxlY19wcml2ICpwcml2LAorCQkJCSAgICAgc3RydWN0IGxlY19hcnBfdGFibGUgKnRvX3JlbW92ZSk7CisvKiBMQU5FMiBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIGxhbmUyX2Fzc29jaWF0ZV9pbmQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICptYWNfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKnRsdnMsIHUzMiBzaXplb2Z0bHZzKTsKK3N0YXRpYyBpbnQgbGFuZTJfcmVzb2x2ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqZHN0X21hYywgaW50IGZvcmNlLAorICAgICAgICAgICAgICAgICAgdTggKip0bHZzLCB1MzIgKnNpemVvZnRsdnMpOworc3RhdGljIGludCBsYW5lMl9hc3NvY2lhdGVfcmVxIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqbGFuX2RzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqdGx2cywgdTMyIHNpemVvZnRsdnMpOworCitzdGF0aWMgaW50IGxlY19hZGRyX2RlbGV0ZShzdHJ1Y3QgbGVjX3ByaXYgKnByaXYsIHVuc2lnbmVkIGNoYXIgKmF0bV9hZGRyLCAKKwkJCSAgIHVuc2lnbmVkIGxvbmcgcGVybWFuZW50KTsKK3N0YXRpYyB2b2lkIGxlY19hcnBfY2hlY2tfZW1wdGllcyhzdHJ1Y3QgbGVjX3ByaXYgKnByaXYsCisJCQkJICBzdHJ1Y3QgYXRtX3ZjYyAqdmNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIGxlY19hcnBfZGVzdHJveShzdHJ1Y3QgbGVjX3ByaXYgKnByaXYpOworc3RhdGljIHZvaWQgbGVjX2FycF9pbml0KHN0cnVjdCBsZWNfcHJpdiAqcHJpdik7CitzdGF0aWMgc3RydWN0IGF0bV92Y2MqIGxlY19hcnBfcmVzb2x2ZShzdHJ1Y3QgbGVjX3ByaXYgKnByaXYsCisJCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKm1hY190b19maW5kLAorCQkJCSAgICAgICBpbnQgaXNfcmRlc2MsCisJCQkJICAgICAgIHN0cnVjdCBsZWNfYXJwX3RhYmxlICoqcmV0X2VudHJ5KTsKK3N0YXRpYyB2b2lkIGxlY19hcnBfdXBkYXRlKHN0cnVjdCBsZWNfcHJpdiAqcHJpdiwgdW5zaWduZWQgY2hhciAqbWFjX2FkZHIsCisJCQkgICB1bnNpZ25lZCBjaGFyICphdG1fYWRkciwgdW5zaWduZWQgbG9uZyByZW1vdGVmbGFnLAorCQkJICAgdW5zaWduZWQgaW50IHRhcmdldGxlc3NfbGVfYXJwKTsKK3N0YXRpYyB2b2lkIGxlY19mbHVzaF9jb21wbGV0ZShzdHJ1Y3QgbGVjX3ByaXYgKnByaXYsIHVuc2lnbmVkIGxvbmcgdHJhbl9pZCk7CitzdGF0aWMgaW50IGxlY19tY2FzdF9tYWtlKHN0cnVjdCBsZWNfcHJpdiAqcHJpdiwgc3RydWN0IGF0bV92Y2MgKnZjYyk7CitzdGF0aWMgdm9pZCBsZWNfc2V0X2ZsdXNoX3RyYW5faWQoc3RydWN0IGxlY19wcml2ICpwcml2LAorCQkJCSAgdW5zaWduZWQgY2hhciAqYXRtX2FkZHIsCisJCQkJICB1bnNpZ25lZCBsb25nIHRyYW5faWQpOworc3RhdGljIHZvaWQgbGVjX3ZjY19hZGRlZChzdHJ1Y3QgbGVjX3ByaXYgKnByaXYsIHN0cnVjdCBhdG1sZWNfaW9jICppb2NfZGF0YSwKKwkJCSAgc3RydWN0IGF0bV92Y2MgKnZjYywKKwkJCSAgdm9pZCAoKm9sZF9wdXNoKShzdHJ1Y3QgYXRtX3ZjYyAqdmNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSk7CitzdGF0aWMgdm9pZCBsZWNfdmNjX2Nsb3NlKHN0cnVjdCBsZWNfcHJpdiAqcHJpdiwgc3RydWN0IGF0bV92Y2MgKnZjYyk7CisKK3N0YXRpYyBzdHJ1Y3QgbGFuZTJfb3BzIGxhbmUyX29wcyA9IHsKKwlsYW5lMl9yZXNvbHZlLCAgICAgICAgIC8qIHJlc29sdmUsICAgICAgICAgICAgIHNwZWMgMy4xLjMgKi8KKwlsYW5lMl9hc3NvY2lhdGVfcmVxLCAgIC8qIGFzc29jaWF0ZV9yZXEsICAgICAgIHNwZWMgMy4xLjQgKi8KKwlOVUxMICAgICAgICAgICAgICAgICAgLyogYXNzb2NpYXRlIGluZGljYXRvciwgc3BlYyAzLjEuNSAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYnVzX21hY1tFVEhfQUxFTl0gPSB7MHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmZ9OworCisvKiBEZXZpY2Ugc3RydWN0dXJlcyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfbGVjW01BWF9MRUNfSVRGXTsKKworI2lmIGRlZmluZWQoQ09ORklHX0JSSURHRSkgfHwgZGVmaW5lZChDT05GSUdfQlJJREdFX01PRFVMRSkKK3N0YXRpYyB2b2lkIGxlY19oYW5kbGVfYnJpZGdlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBldGhoZHIgKmV0aDsKKyAgICAgICAgY2hhciAqYnVmZjsKKyAgICAgICAgc3RydWN0IGxlY19wcml2ICpwcml2OworCisgICAgICAgIC8qIENoZWNrIGlmIHRoaXMgaXMgYSBCUERVLiBJZiBzbywgYXNrIHplcHBlbGluIHRvIHNlbmQKKyAgICAgICAgICogTEVfVE9QT0xPR1lfUkVRVUVTVCB3aXRoIHRoZSBzYW1lIHZhbHVlIG9mIFRvcG9sb2d5IENoYW5nZSBiaXQKKyAgICAgICAgICogYXMgdGhlIENvbmZpZyBCUERVIGhhcyAqLworICAgICAgICBldGggPSAoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YTsKKyAgICAgICAgYnVmZiA9IHNrYi0+ZGF0YSArIHNrYi0+ZGV2LT5oYXJkX2hlYWRlcl9sZW47CisgICAgICAgIGlmICgqYnVmZisrID09IDB4NDIgJiYgKmJ1ZmYrKyA9PSAweDQyICYmICpidWZmKysgPT0gMHgwMykgeworCQlzdHJ1Y3Qgc29jayAqc2s7CisgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjI7CisgICAgICAgICAgICAgICAgc3RydWN0IGF0bWxlY19tc2cgKm1lc2c7CisKKyAgICAgICAgICAgICAgICBza2IyID0gYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgYXRtbGVjX21zZyksIEdGUF9BVE9NSUMpOworICAgICAgICAgICAgICAgIGlmIChza2IyID09IE5VTEwpIHJldHVybjsKKyAgICAgICAgICAgICAgICBza2IyLT5sZW4gPSBzaXplb2Yoc3RydWN0IGF0bWxlY19tc2cpOworICAgICAgICAgICAgICAgIG1lc2cgPSAoc3RydWN0IGF0bWxlY19tc2cgKilza2IyLT5kYXRhOworICAgICAgICAgICAgICAgIG1lc2ctPnR5cGUgPSBsX3RvcG9sb2d5X2NoYW5nZTsKKyAgICAgICAgICAgICAgICBidWZmICs9IDQ7CisgICAgICAgICAgICAgICAgbWVzZy0+Y29udGVudC5ub3JtYWwuZmxhZyA9ICpidWZmICYgMHgwMTsgLyogMHgwMSBpcyB0b3BvbG9neSBjaGFuZ2UgKi8KKworICAgICAgICAgICAgICAgIHByaXYgPSAoc3RydWN0IGxlY19wcml2ICopZGV2LT5wcml2OworICAgICAgICAgICAgICAgIGF0bV9mb3JjZV9jaGFyZ2UocHJpdi0+bGVjZCwgc2tiMi0+dHJ1ZXNpemUpOworCQlzayA9IHNrX2F0bShwcml2LT5sZWNkKTsKKyAgICAgICAgICAgICAgICBza2JfcXVldWVfdGFpbCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYjIpOworICAgICAgICAgICAgICAgIHNrLT5za19kYXRhX3JlYWR5KHNrLCBza2IyLT5sZW4pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuOworfQorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0JSSURHRSkgfHwgZGVmaW5lZChDT05GSUdfQlJJREdFX01PRFVMRSkgKi8KKworLyoKKyAqIE1vZGVsbGVkIGFmdGVyIHRyX3R5cGVfdHJhbnMKKyAqIEFsbCBtdWx0aWNhc3QgYW5kIEFSRSBvciBTVEUgZnJhbWVzIGdvIHRvIEJVUy4KKyAqIE5vbiBzb3VyY2Ugcm91dGVkIGZyYW1lcyBnbyBieSBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICogTGFzdCBob3Agc291cmNlIHJvdXRlZCBmcmFtZXMgZ28gYnkgZGVzdGluYXRpb24gYWRkcmVzcy4KKyAqIE5vdCBsYXN0IGhvcCBzb3VyY2Ugcm91dGVkIGZyYW1lcyBnbyBieSBfbmV4dF8gcm91dGUgZGVzY3JpcHRvci4KKyAqIFJldHVybnMgcG9pbnRlciB0byBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyBvciBmaWxscyBpbiByZGVzYworICogYW5kIHJldHVybnMgTlVMTC4KKyAqLworI2lmZGVmIENPTkZJR19UUgorc3RhdGljIHVuc2lnbmVkIGNoYXIgKmdldF90cl9kc3QodW5zaWduZWQgY2hhciAqcGFja2V0LCB1bnNpZ25lZCBjaGFyICpyZGVzYykKK3sKKyAgICAgICAgc3RydWN0IHRyaF9oZHIgKnRyaDsKKyAgICAgICAgaW50IHJpZmxlbiwgbnVtX3Jkc2M7CisgICAgICAgIAorICAgICAgICB0cmggPSAoc3RydWN0IHRyaF9oZHIgKilwYWNrZXQ7CisgICAgICAgIGlmICh0cmgtPmRhZGRyWzBdICYgKHVpbnQ4X3QpMHg4MCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYnVzX21hYzsgLyogbXVsdGljYXN0ICovCisKKyAgICAgICAgaWYgKHRyaC0+c2FkZHJbMF0gJiBUUl9SSUkpIHsKKyAgICAgICAgICAgICAgICByaWZsZW4gPSAobnRvaHModHJoLT5yY2YpICYgVFJfUkNGX0xFTl9NQVNLKSA+PiA4OworICAgICAgICAgICAgICAgIGlmICgobnRvaHModHJoLT5yY2YpID4+IDEzKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1c19tYWM7IC8qIEFSRSBvciBTVEUgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIHRyaC0+ZGFkZHI7IC8qIG5vdCBzb3VyY2Ugcm91dGVkICovCisKKyAgICAgICAgaWYgKHJpZmxlbiA8IDYpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRyaC0+ZGFkZHI7IC8qIGxhc3QgaG9wLCBzb3VyY2Ugcm91dGVkICovCisgICAgICAgICAgICAgICAgCisgICAgICAgIC8qIHJpZmxlbiBpcyA2IG9yIG1vcmUsIHBhY2tldCBoYXMgbW9yZSB0aGFuIG9uZSByb3V0ZSBkZXNjcmlwdG9yICovCisgICAgICAgIG51bV9yZHNjID0gKHJpZmxlbi8yKSAtIDE7CisgICAgICAgIG1lbXNldChyZGVzYywgMCwgRVRIX0FMRU4pOworICAgICAgICAvKiBvZmZzZXQgNCBjb21lcyBmcm9tIExBTiBkZXN0aW5hdGlvbiBmaWVsZCBpbiBMRSBjb250cm9sIGZyYW1lcyAqLworICAgICAgICBpZiAodHJoLT5yY2YgJiBodG9ucygodWludDE2X3QpVFJfUkNGX0RJUl9CSVQpKQorICAgICAgICAgICAgICAgIG1lbWNweSgmcmRlc2NbNF0sICZ0cmgtPnJzZWdbbnVtX3Jkc2MtMl0sIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnJkZXNjWzRdLCAmdHJoLT5yc2VnWzFdLCBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgICAgICByZGVzY1s1XSA9ICgobnRvaHModHJoLT5yc2VnWzBdKSAmIDB4MDAwZikgfCAocmRlc2NbNV0gJiAweGYwKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZiAvKiBDT05GSUdfVFIgKi8KKworLyoKKyAqIE9wZW4vaW5pdGlhbGl6ZSB0aGUgbmV0ZGV2aWNlLiBUaGlzIGlzIGNhbGxlZCAoaW4gdGhlIGN1cnJlbnQga2VybmVsKQorICogc29tZXRpbWUgYWZ0ZXIgYm9vdGluZyB3aGVuIHRoZSAnaWZjb25maWcnIHByb2dyYW0gaXMgcnVuLgorICoKKyAqIFRoaXMgcm91dGluZSBzaG91bGQgc2V0IGV2ZXJ5dGhpbmcgdXAgYW5ldyBhdCBlYWNoIG9wZW4sIGV2ZW4KKyAqIHJlZ2lzdGVycyB0aGF0ICJzaG91bGQiIG9ubHkgbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LCBzbyB0aGF0CisgKiB0aGVyZSBpcyBub24tcmVib290IHdheSB0byByZWNvdmVyIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgorICovCisKK3N0YXRpYyBpbnQgCitsZWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbGVjX3ByaXYgKnByaXYgPSAoc3RydWN0IGxlY19wcml2ICopZGV2LT5wcml2OworICAgICAgICAKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworICAgICAgICBtZW1zZXQoJnByaXYtPnN0YXRzLDAsc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZAorbGVjX3NlbmQoc3RydWN0IGF0bV92Y2MgKnZjYywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGxlY19wcml2ICpwcml2KQoreworCUFUTV9TS0Ioc2tiKS0+dmNjID0gdmNjOworCUFUTV9TS0Ioc2tiKS0+YXRtX29wdGlvbnMgPSB2Y2MtPmF0bV9vcHRpb25zOworCisJYXRvbWljX2FkZChza2ItPnRydWVzaXplLCAmc2tfYXRtKHZjYyktPnNrX3dtZW1fYWxsb2MpOworCWlmICh2Y2MtPnNlbmQodmNjLCBza2IpIDwgMCkgeworCQlwcml2LT5zdGF0cy50eF9kcm9wcGVkKys7CisJCXJldHVybjsKKwl9CisKKwlwcml2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJcHJpdi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47Cit9CisKK3N0YXRpYyB2b2lkCitsZWNfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXByaW50ayhLRVJOX0lORk8gIiVzOiB0eCB0aW1lb3V0XG4iLCBkZXYtPm5hbWUpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCAKK2xlY19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBza19idWZmICpza2IyOworICAgICAgICBzdHJ1Y3QgbGVjX3ByaXYgKnByaXYgPSAoc3RydWN0IGxlY19wcml2ICopZGV2LT5wcml2OworICAgICAgICBzdHJ1Y3QgbGVjZGF0YWhkcl84MDIzICpsZWNfaDsKKyAgICAgICAgc3RydWN0IGF0bV92Y2MgKnZjYzsKKwlzdHJ1Y3QgbGVjX2FycF90YWJsZSAqZW50cnk7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdDsKKwlpbnQgbWluX2ZyYW1lX3NpemU7CisjaWZkZWYgQ09ORklHX1RSCisgICAgICAgIHVuc2lnbmVkIGNoYXIgcmRlc2NbRVRIX0FMRU5dOyAvKiBUb2tlbiBSaW5nIHJvdXRlIGRlc2NyaXB0b3IgKi8KKyNlbmRpZgorICAgICAgICBpbnQgaXNfcmRlc2M7CisjaWYgRFVNUF9QQUNLRVRTID4gMAorICAgICAgICBjaGFyIGJ1ZlszMDBdOworICAgICAgICBpbnQgaT0wOworI2VuZGlmIC8qIERVTVBfUEFDS0VUUyA+MCAqLworICAgICAgICAKKyAgICAgICAgRFBSSU5USygibGVjX3N0YXJ0X3htaXQgY2FsbGVkXG4iKTsgIAorICAgICAgICBpZiAoIXByaXYtPmxlY2QpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIiVzOk5vIGxlY2QgYXR0YWNoZWRcbiIsZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICBwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FVU5BVENIOworICAgICAgICB9IAorCisgICAgICAgIERQUklOVEsoInNrYnVmZiBoZWFkOiVseCBkYXRhOiVseCB0YWlsOiVseCBlbmQ6JWx4XG4iLAorICAgICAgICAgICAgICAgIChsb25nKXNrYi0+aGVhZCwgKGxvbmcpc2tiLT5kYXRhLCAobG9uZylza2ItPnRhaWwsCisgICAgICAgICAgICAgICAgKGxvbmcpc2tiLT5lbmQpOworI2lmIGRlZmluZWQoQ09ORklHX0JSSURHRSkgfHwgZGVmaW5lZChDT05GSUdfQlJJREdFX01PRFVMRSkKKyAgICAgICAgaWYgKG1lbWNtcChza2ItPmRhdGEsIGJyaWRnZV91bGFfbGVjLCBzaXplb2YoYnJpZGdlX3VsYV9sZWMpKSA9PSAwKQorICAgICAgICAgICAgICAgIGxlY19oYW5kbGVfYnJpZGdlKHNrYiwgZGV2KTsKKyNlbmRpZgorCisgICAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHJvb20gZm9yIGxlY19pZCAqLworICAgICAgICBpZiAoc2tiX2hlYWRyb29tKHNrYikgPCAyKSB7CisKKyAgICAgICAgICAgICAgICBEUFJJTlRLKCJsZWNfc3RhcnRfeG1pdDogcmVhbGxvY2F0aW5nIHNrYlxuIik7CisgICAgICAgICAgICAgICAgc2tiMiA9IHNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwgTEVDX0hFQURFUl9MRU4pOworICAgICAgICAgICAgICAgIGtmcmVlX3NrYihza2IpOworICAgICAgICAgICAgICAgIGlmIChza2IyID09IE5VTEwpIHJldHVybiAwOworICAgICAgICAgICAgICAgIHNrYiA9IHNrYjI7CisgICAgICAgIH0KKyAgICAgICAgc2tiX3B1c2goc2tiLCAyKTsKKworICAgICAgICAvKiBQdXQgbGUgaGVhZGVyIHRvIHBsYWNlLCB3b3JrcyBmb3IgVG9rZW5SaW5nIHRvbyAqLworICAgICAgICBsZWNfaCA9IChzdHJ1Y3QgbGVjZGF0YWhkcl84MDIzKilza2ItPmRhdGE7CisgICAgICAgIGxlY19oLT5sZV9oZWFkZXIgPSBodG9ucyhwcml2LT5sZWNpZCk7IAorCisjaWZkZWYgQ09ORklHX1RSCisgICAgICAgIC8qIFVnbHkuIFVzZSB0aGlzIHRvIHJlYWxpZ24gVG9rZW4gUmluZyBwYWNrZXRzIGZvcgorICAgICAgICAgKiBlLmcuIFBDQS0yMDBFIGRyaXZlci4gKi8KKyAgICAgICAgaWYgKHByaXYtPmlzX3RyZGV2KSB7CisgICAgICAgICAgICAgICAgc2tiMiA9IHNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwgTEVDX0hFQURFUl9MRU4pOworICAgICAgICAgICAgICAgIGtmcmVlX3NrYihza2IpOworICAgICAgICAgICAgICAgIGlmIChza2IyID09IE5VTEwpIHJldHVybiAwOworICAgICAgICAgICAgICAgIHNrYiA9IHNrYjI7CisgICAgICAgIH0KKyNlbmRpZgorCisjaWYgRFVNUF9QQUNLRVRTID4gMAorICAgICAgICBwcmludGsoIiVzOiBzZW5kIGRhdGFsZW46JWxkIGxlY2lkOiU0LjR4XG4iLCBkZXYtPm5hbWUsCisgICAgICAgICAgICAgICBza2ItPmxlbiwgcHJpdi0+bGVjaWQpOworI2lmIERVTVBfUEFDS0VUUyA+PSAyCisgICAgICAgIGZvcihpPTA7aTxza2ItPmxlbiAmJiBpIDw5OTtpKyspIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGJ1ZitpKjMsIiUyLjJ4ICIsMHhmZiZza2ItPmRhdGFbaV0pOworICAgICAgICB9CisjZWxpZiBEVU1QX1BBQ0tFVFMgPj0gMQorICAgICAgICBmb3IoaT0wO2k8c2tiLT5sZW4gJiYgaSA8IDMwO2krKykgeworICAgICAgICAgICAgICAgIHNwcmludGYoYnVmK2kqMywiJTIuMnggIiwgMHhmZiZza2ItPmRhdGFbaV0pOworICAgICAgICB9CisjZW5kaWYgLyogRFVNUF9QQUNLRVRTID49IDEgKi8KKyAgICAgICAgaWYgKGk9PXNrYi0+bGVuKQorICAgICAgICAgICAgICAgIHByaW50aygiJXNcbiIsYnVmKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50aygiJXMuLi5cbiIsYnVmKTsKKyNlbmRpZiAvKiBEVU1QX1BBQ0tFVFMgPiAwICovCisKKyAgICAgICAgLyogTWluaW11bSBldGhlcm5ldC1mcmFtZSBzaXplICovCisjaWZkZWYgQ09ORklHX1RSCisgICAgICAgIGlmIChwcml2LT5pc190cmRldikKKyAgICAgICAgICAgICAgICBtaW5fZnJhbWVfc2l6ZSA9IExFQ19NSU5JTVVNXzgwMjVfU0laRTsKKwllbHNlCisjZW5kaWYKKyAgICAgICAgbWluX2ZyYW1lX3NpemUgPSBMRUNfTUlOSU1VTV84MDIzX1NJWkU7CisgICAgICAgIGlmIChza2ItPmxlbiA8IG1pbl9mcmFtZV9zaXplKSB7CisgICAgICAgICAgICAgICAgaWYgKChza2ItPmxlbiArIHNrYl90YWlscm9vbShza2IpKSA8IG1pbl9mcmFtZV9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2IyID0gc2tiX2NvcHlfZXhwYW5kKHNrYiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fZnJhbWVfc2l6ZSAtIHNrYi0+dHJ1ZXNpemUsIEdGUF9BVE9NSUMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiKHNrYik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2tiMiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBza2IgPSBza2IyOworICAgICAgICAgICAgICAgIH0KKwkJc2tiX3B1dChza2IsIG1pbl9mcmFtZV9zaXplIC0gc2tiLT5sZW4pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBTZW5kIHRvIHJpZ2h0IHZjYyAqLworICAgICAgICBpc19yZGVzYyA9IDA7CisgICAgICAgIGRzdCA9IGxlY19oLT5oX2Rlc3Q7CisjaWZkZWYgQ09ORklHX1RSCisgICAgICAgIGlmIChwcml2LT5pc190cmRldikgeworICAgICAgICAgICAgICAgIGRzdCA9IGdldF90cl9kc3Qoc2tiLT5kYXRhKzIsIHJkZXNjKTsKKyAgICAgICAgICAgICAgICBpZiAoZHN0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdCA9IHJkZXNjOworICAgICAgICAgICAgICAgICAgICAgICAgaXNfcmRlc2MgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGVudHJ5ID0gTlVMTDsKKyAgICAgICAgdmNjID0gbGVjX2FycF9yZXNvbHZlKHByaXYsIGRzdCwgaXNfcmRlc2MsICZlbnRyeSk7CisgICAgICAgIERQUklOVEsoIiVzOnZjYzolcCB2Y2NfZmxhZ3M6JXgsIGVudHJ5OiVwXG4iLCBkZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgdmNjLCB2Y2M/dmNjLT5mbGFnczowLCBlbnRyeSk7CisgICAgICAgIGlmICghdmNjIHx8ICF0ZXN0X2JpdChBVE1fVkZfUkVBRFksJnZjYy0+ZmxhZ3MpKSB7ICAgIAorICAgICAgICAgICAgICAgIGlmIChlbnRyeSAmJiAoZW50cnktPnR4X3dhaXQucWxlbiA8IExFQ19VTlJFU19RVUVfTEVOKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgRFBSSU5USygiJXM6bGVjX3N0YXJ0X3htaXQ6IHF1ZXVpbmcgcGFja2V0LCAiLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgRFBSSU5USygiTUFDIGFkZHJlc3MgMHglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVjX2gtPmhfZGVzdFswXSwgbGVjX2gtPmhfZGVzdFsxXSwgbGVjX2gtPmhfZGVzdFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVjX2gtPmhfZGVzdFszXSwgbGVjX2gtPmhfZGVzdFs0XSwgbGVjX2gtPmhfZGVzdFs1XSk7CisgICAgICAgICAgICAgICAgICAgICAgICBza2JfcXVldWVfdGFpbCgmZW50cnktPnR4X3dhaXQsIHNrYik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERQUklOVEsoIiVzOmxlY19zdGFydF94bWl0OiB0eCBxdWV1ZSBmdWxsIG9yIG5vIGFycCBlbnRyeSwgZHJvcHBpbmcsICIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBEUFJJTlRLKCJNQUMgYWRkcmVzcyAweCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWNfaC0+aF9kZXN0WzBdLCBsZWNfaC0+aF9kZXN0WzFdLCBsZWNfaC0+aF9kZXN0WzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWNfaC0+aF9kZXN0WzNdLCBsZWNfaC0+aF9kZXN0WzRdLCBsZWNfaC0+aF9kZXN0WzVdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyNpZiBEVU1QX1BBQ0tFVFMgPiAwICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgcHJpbnRrKCIlczpzZW5kaW5nIHRvIHZwaTolZCB2Y2k6JWRcbiIsIGRldi0+bmFtZSwKKyAgICAgICAgICAgICAgIHZjYy0+dnBpLCB2Y2MtPnZjaSk7ICAgICAgIAorI2VuZGlmIC8qIERVTVBfUEFDS0VUUyA+IDAgKi8KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgd2hpbGUgKGVudHJ5ICYmIChza2IyID0gc2tiX2RlcXVldWUoJmVudHJ5LT50eF93YWl0KSkpIHsKKyAgICAgICAgICAgICAgICBEUFJJTlRLKCJsZWMuYzogZW1wdHlpbmcgdHggcXVldWUsICIpOworICAgICAgICAgICAgICAgIERQUklOVEsoIk1BQyBhZGRyZXNzIDB4JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBsZWNfaC0+aF9kZXN0WzBdLCBsZWNfaC0+aF9kZXN0WzFdLCBsZWNfaC0+aF9kZXN0WzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgbGVjX2gtPmhfZGVzdFszXSwgbGVjX2gtPmhfZGVzdFs0XSwgbGVjX2gtPmhfZGVzdFs1XSk7CisJCWxlY19zZW5kKHZjYywgc2tiMiwgcHJpdik7CisgICAgICAgIH0KKworCWxlY19zZW5kKHZjYywgc2tiLCBwcml2KTsKKworCWlmICghYXRtX21heV9zZW5kKHZjYywgMCkpIHsKKwkJc3RydWN0IGxlY192Y2NfcHJpdiAqdnByaXYgPSBMRUNfVkNDX1BSSVYodmNjKTsKKworCQl2cHJpdi0+eG9mZiA9IDE7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQkvKgorCQkgKiB2Y2MtPnBvcCgpIG1pZ2h0IGhhdmUgb2NjdXJyZWQgaW4gYmV0d2VlbiwgbWFraW5nCisJCSAqIHRoZSB2Y2MgdXN1YWJsZSBhZ2Fpbi4gIFNpbmNlIHhtaXQgaXMgc2VyaWFsaXplZCwKKwkJICogdGhpcyBpcyB0aGUgb25seSBzaXR1YXRpb24gd2UgaGF2ZSB0byByZS10ZXN0LgorCQkgKi8KKworCQlpZiAoYXRtX21heV9zZW5kKHZjYywgMCkpCisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisgICAgICAgIHJldHVybiAwOworfQorCisvKiBUaGUgaW52ZXJzZSByb3V0aW5lIHRvIG5ldF9vcGVuKCkuICovCitzdGF0aWMgaW50IAorbGVjX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIAoreworICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgICAgIHJldHVybiAwOworfQorCisvKgorICogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCisgKiBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUgY2FyZCBvcGVuIG9yIGNsb3NlZC4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKK2xlY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgcmV0dXJuICYoKHN0cnVjdCBsZWNfcHJpdiAqKWRldi0+cHJpdiktPnN0YXRzOworfQorCitzdGF0aWMgaW50IAorbGVjX2F0bV9zZW5kKHN0cnVjdCBhdG1fdmNjICp2Y2MsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSopdmNjLT5wcm90b19kYXRhOworICAgICAgICBzdHJ1Y3QgbGVjX3ByaXYgKnByaXYgPSAoc3RydWN0IGxlY19wcml2KilkZXYtPnByaXY7CisgICAgICAgIHN0cnVjdCBhdG1sZWNfbXNnICptZXNnOworICAgICAgICBzdHJ1Y3QgbGVjX2FycF90YWJsZSAqZW50cnk7CisgICAgICAgIGludCBpOworICAgICAgICBjaGFyICp0bXA7IC8qIEZJWE1FICovCisKKwlhdG9taWNfc3ViKHNrYi0+dHJ1ZXNpemUsICZza19hdG0odmNjKS0+c2tfd21lbV9hbGxvYyk7CisgICAgICAgIG1lc2cgPSAoc3RydWN0IGF0bWxlY19tc2cgKilza2ItPmRhdGE7CisgICAgICAgIHRtcCA9IHNrYi0+ZGF0YTsKKyAgICAgICAgdG1wICs9IHNpemVvZihzdHJ1Y3QgYXRtbGVjX21zZyk7CisgICAgICAgIERQUklOVEsoIiVzOiBtc2cgZnJvbSB6ZXBwZWxpbjolZFxuIiwgZGV2LT5uYW1lLCBtZXNnLT50eXBlKTsKKyAgICAgICAgc3dpdGNoKG1lc2ctPnR5cGUpIHsKKyAgICAgICAgY2FzZSBsX3NldF9tYWNfYWRkcjoKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDtpPDY7aSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmRldl9hZGRyW2ldID0gbWVzZy0+Y29udGVudC5ub3JtYWwubWFjX2FkZHJbaV07CisgICAgICAgICAgICAgICAgfSAgICAKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBsX2RlbF9tYWNfYWRkcjoKKyAgICAgICAgICAgICAgICBmb3IoaT0wO2k8NjtpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+ZGV2X2FkZHJbaV0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBsX2FkZHJfZGVsZXRlOgorICAgICAgICAgICAgICAgIGxlY19hZGRyX2RlbGV0ZShwcml2LCBtZXNnLT5jb250ZW50Lm5vcm1hbC5hdG1fYWRkciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc2ctPmNvbnRlbnQubm9ybWFsLmZsYWcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGxfdG9wb2xvZ3lfY2hhbmdlOgorICAgICAgICAgICAgICAgIHByaXYtPnRvcG9sb2d5X2NoYW5nZSA9IG1lc2ctPmNvbnRlbnQubm9ybWFsLmZsYWc7ICAKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBsX2ZsdXNoX2NvbXBsZXRlOgorICAgICAgICAgICAgICAgIGxlY19mbHVzaF9jb21wbGV0ZShwcml2LCBtZXNnLT5jb250ZW50Lm5vcm1hbC5mbGFnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBsX25hcnBfcmVxOiAvKiBMQU5FMjogc2VlIDcuMS4zNSBpbiB0aGUgbGFuZTIgc3BlYyAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bGVjX2FycF9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgZW50cnkgPSBsZWNfYXJwX2ZpbmQocHJpdiwgbWVzZy0+Y29udGVudC5ub3JtYWwubWFjX2FkZHIpOworICAgICAgICAgICAgICAgIGxlY19hcnBfcmVtb3ZlKHByaXYsIGVudHJ5KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bGVjX2FycF9sb2NrLCBmbGFncyk7CisKKyAgICAgICAgICAgICAgICBpZiAobWVzZy0+Y29udGVudC5ub3JtYWwubm9fc291cmNlX2xlX25hcnApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKyAgICAgICAgY2FzZSBsX2FycF91cGRhdGU6CisgICAgICAgICAgICAgICAgbGVjX2FycF91cGRhdGUocHJpdiwgbWVzZy0+Y29udGVudC5ub3JtYWwubWFjX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzZy0+Y29udGVudC5ub3JtYWwuYXRtX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzZy0+Y29udGVudC5ub3JtYWwuZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNnLT5jb250ZW50Lm5vcm1hbC50YXJnZXRsZXNzX2xlX2FycCk7CisgICAgICAgICAgICAgICAgRFBSSU5USygibGVjOiBpbiBsX2FycF91cGRhdGVcbiIpOworICAgICAgICAgICAgICAgIGlmIChtZXNnLT5zaXplb2Z0bHZzICE9IDApIHsgLyogTEFORTIgMy4xLjUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIERQUklOVEsoImxlYzogTEFORTIgMy4xLjUsIGdvdCB0bHZzLCBzaXplICVkXG4iLCBtZXNnLT5zaXplb2Z0bHZzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhbmUyX2Fzc29jaWF0ZV9pbmQoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNnLT5jb250ZW50Lm5vcm1hbC5tYWNfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wLCBtZXNnLT5zaXplb2Z0bHZzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgbF9jb25maWc6CisgICAgICAgICAgICAgICAgcHJpdi0+bWF4aW11bV91bmtub3duX2ZyYW1lX2NvdW50ID0gCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNnLT5jb250ZW50LmNvbmZpZy5tYXhpbXVtX3Vua25vd25fZnJhbWVfY291bnQ7CisgICAgICAgICAgICAgICAgcHJpdi0+bWF4X3Vua25vd25fZnJhbWVfdGltZSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgKG1lc2ctPmNvbnRlbnQuY29uZmlnLm1heF91bmtub3duX2ZyYW1lX3RpbWUqSFopOworICAgICAgICAgICAgICAgIHByaXYtPm1heF9yZXRyeV9jb3VudCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzZy0+Y29udGVudC5jb25maWcubWF4X3JldHJ5X2NvdW50OworICAgICAgICAgICAgICAgIHByaXYtPmFnaW5nX3RpbWUgPSAobWVzZy0+Y29udGVudC5jb25maWcuYWdpbmdfdGltZSpIWik7CisgICAgICAgICAgICAgICAgcHJpdi0+Zm9yd2FyZF9kZWxheV90aW1lID0gCisgICAgICAgICAgICAgICAgICAgICAgICAobWVzZy0+Y29udGVudC5jb25maWcuZm9yd2FyZF9kZWxheV90aW1lKkhaKTsKKyAgICAgICAgICAgICAgICBwcml2LT5hcnBfcmVzcG9uc2VfdGltZSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgKG1lc2ctPmNvbnRlbnQuY29uZmlnLmFycF9yZXNwb25zZV90aW1lKkhaKTsKKyAgICAgICAgICAgICAgICBwcml2LT5mbHVzaF90aW1lb3V0ID0gKG1lc2ctPmNvbnRlbnQuY29uZmlnLmZsdXNoX3RpbWVvdXQqSFopOworICAgICAgICAgICAgICAgIHByaXYtPnBhdGhfc3dpdGNoaW5nX2RlbGF5ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAobWVzZy0+Y29udGVudC5jb25maWcucGF0aF9zd2l0Y2hpbmdfZGVsYXkqSFopOworICAgICAgICAgICAgICAgIHByaXYtPmxhbmVfdmVyc2lvbiA9IG1lc2ctPmNvbnRlbnQuY29uZmlnLmxhbmVfdmVyc2lvbjsgLyogTEFORTIgKi8KKwkJcHJpdi0+bGFuZTJfb3BzID0gTlVMTDsKKwkJaWYgKHByaXYtPmxhbmVfdmVyc2lvbiA+IDEpCisJCQlwcml2LT5sYW5lMl9vcHMgPSAmbGFuZTJfb3BzOworCQlpZiAoZGV2LT5jaGFuZ2VfbXR1KGRldiwgbWVzZy0+Y29udGVudC5jb25maWcubXR1KSkKKwkJCXByaW50aygiJXM6IGNoYW5nZV9tdHUgdG8gJWQgZmFpbGVkXG4iLCBkZXYtPm5hbWUsCisJCQkgICAgbWVzZy0+Y29udGVudC5jb25maWcubXR1KTsKKwkJcHJpdi0+aXNfcHJveHkgPSBtZXNnLT5jb250ZW50LmNvbmZpZy5pc19wcm94eTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBsX2ZsdXNoX3RyYW5faWQ6CisgICAgICAgICAgICAgICAgbGVjX3NldF9mbHVzaF90cmFuX2lkKHByaXYsIG1lc2ctPmNvbnRlbnQubm9ybWFsLmF0bV9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNnLT5jb250ZW50Lm5vcm1hbC5mbGFnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBsX3NldF9sZWNpZDoKKyAgICAgICAgICAgICAgICBwcml2LT5sZWNpZD0odW5zaWduZWQgc2hvcnQpKDB4ZmZmZiZtZXNnLT5jb250ZW50Lm5vcm1hbC5mbGFnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBsX3Nob3VsZF9icmlkZ2U6IHsKKyNpZiBkZWZpbmVkKENPTkZJR19CUklER0UpIHx8IGRlZmluZWQoQ09ORklHX0JSSURHRV9NT0RVTEUpCisgICAgICAgICAgICAgICAgc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmOworCisgICAgICAgICAgICAgICAgRFBSSU5USygiJXM6IGJyaWRnZSB6ZXBwZWxpbiBhc2tzIGFib3V0IDB4JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNnLT5jb250ZW50LnByb3h5Lm1hY19hZGRyWzBdLCBtZXNnLT5jb250ZW50LnByb3h5Lm1hY19hZGRyWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzZy0+Y29udGVudC5wcm94eS5tYWNfYWRkclsyXSwgbWVzZy0+Y29udGVudC5wcm94eS5tYWNfYWRkclszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc2ctPmNvbnRlbnQucHJveHkubWFjX2FkZHJbNF0sIG1lc2ctPmNvbnRlbnQucHJveHkubWFjX2FkZHJbNV0pOworCisgICAgICAgICAgICAgICAgaWYgKGJyX2ZkYl9nZXRfaG9vayA9PSBOVUxMIHx8IGRldi0+YnJfcG9ydCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBmID0gYnJfZmRiX2dldF9ob29rKGRldi0+YnJfcG9ydC0+YnIsIG1lc2ctPmNvbnRlbnQucHJveHkubWFjX2FkZHIpOworICAgICAgICAgICAgICAgIGlmIChmICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgZi0+ZHN0LT5kZXYgIT0gZGV2ICYmCisgICAgICAgICAgICAgICAgICAgIGYtPmRzdC0+c3RhdGUgPT0gQlJfU1RBVEVfRk9SV0FSRElORykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBoaXQgZnJvbSBicmlkZ2UgdGFibGUsIHNlbmQgTEVfQVJQX1JFU1BPTlNFICovCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKKwkJCXN0cnVjdCBzb2NrICpzazsKKworICAgICAgICAgICAgICAgICAgICAgICAgRFBSSU5USygiJXM6IGVudHJ5IGZvdW5kLCByZXNwb25kaW5nIHRvIHplcHBlbGluXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgc2tiMiA9IGFsbG9jX3NrYihzaXplb2Yoc3RydWN0IGF0bWxlY19tc2cpLCBHRlBfQVRPTUlDKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2IyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJfZmRiX3B1dF9ob29rKGYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNrYjItPmxlbiA9IHNpemVvZihzdHJ1Y3QgYXRtbGVjX21zZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoc2tiMi0+ZGF0YSwgbWVzZywgc2l6ZW9mKHN0cnVjdCBhdG1sZWNfbXNnKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhdG1fZm9yY2VfY2hhcmdlKHByaXYtPmxlY2QsIHNrYjItPnRydWVzaXplKTsKKwkJCXNrID0gc2tfYXRtKHByaXYtPmxlY2QpOworICAgICAgICAgICAgICAgICAgICAgICAgc2tiX3F1ZXVlX3RhaWwoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNrLT5za19kYXRhX3JlYWR5KHNrLCBza2IyLT5sZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBOVUxMKSBicl9mZGJfcHV0X2hvb2soZik7CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfQlJJREdFKSB8fCBkZWZpbmVkKENPTkZJR19CUklER0VfTU9EVUxFKSAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwcmludGsoIiVzOiBVbmtub3duIG1lc3NhZ2UgdHlwZSAlZFxuIiwgZGV2LT5uYW1lLCBtZXNnLT50eXBlKTsKKyAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiKHNrYik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgZGV2X2tmcmVlX3NrYihza2IpOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgCitsZWNfYXRtX2Nsb3NlKHN0cnVjdCBhdG1fdmNjICp2Y2MpCit7CisgICAgICAgIHN0cnVjdCBza19idWZmICpza2I7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKil2Y2MtPnByb3RvX2RhdGE7CisgICAgICAgIHN0cnVjdCBsZWNfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgbGVjX3ByaXYgKilkZXYtPnByaXY7CisKKyAgICAgICAgcHJpdi0+bGVjZCA9IE5VTEw7CisgICAgICAgIC8qIERvIHNvbWV0aGluZyBuZWVkZnVsPyAqLworCisgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKyAgICAgICAgbGVjX2FycF9kZXN0cm95KHByaXYpOworCisgICAgICAgIGlmIChza2JfcGVlaygmc2tfYXRtKHZjYyktPnNrX3JlY2VpdmVfcXVldWUpKQorCQlwcmludGsoIiVzIGxlY19hdG1fY2xvc2U6IGNsb3Npbmcgd2l0aCBtZXNzYWdlcyBwZW5kaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUpOworICAgICAgICB3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZza19hdG0odmNjKS0+c2tfcmVjZWl2ZV9xdWV1ZSkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBhdG1fcmV0dXJuKHZjYywgc2tiLT50cnVlc2l6ZSk7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKyAgICAgICAgfQorICAKKwlwcmludGsoIiVzOiBTaHV0IGRvd24hXG4iLCBkZXYtPm5hbWUpOworICAgICAgICBtb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKK30KKworc3RhdGljIHN0cnVjdCBhdG1kZXZfb3BzIGxlY2Rldl9vcHMgPSB7CisgICAgICAgIC5jbG9zZQk9IGxlY19hdG1fY2xvc2UsCisgICAgICAgIC5zZW5kCT0gbGVjX2F0bV9zZW5kCit9OworCitzdGF0aWMgc3RydWN0IGF0bV9kZXYgbGVjYXRtX2RldiA9IHsKKwkub3BzCT0gJmxlY2Rldl9vcHMsCisJLnR5cGUJPSAibGVjIiwKKwkubnVtYmVyCT0gOTk5LAkvKiBkdW1teSBkZXZpY2UgbnVtYmVyICovCisJLmxvY2sJPSBTUElOX0xPQ0tfVU5MT0NLRUQKK307CisKKy8qCisgKiBMQU5FMjogbmV3IGFyZ3VtZW50IHN0cnVjdCBza19idWZmICpkYXRhIGNvbnRhaW5zCisgKiB0aGUgTEVfQVJQIGJhc2VkIFRMVnMgaW50cm9kdWNlZCBpbiB0aGUgTEFORTIgc3BlYworICovCitzdGF0aWMgaW50IAorc2VuZF90b19sZWNkKHN0cnVjdCBsZWNfcHJpdiAqcHJpdiwgYXRtbGVjX21zZ190eXBlIHR5cGUsIAorICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm1hY19hZGRyLCB1bnNpZ25lZCBjaGFyICphdG1fYWRkciwKKyAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgYXRtbGVjX21zZyAqbWVzZzsKKworCWlmICghcHJpdiB8fCAhcHJpdi0+bGVjZCkgeworCQlyZXR1cm4gLTE7CisJfQorCXNrYiA9IGFsbG9jX3NrYihzaXplb2Yoc3RydWN0IGF0bWxlY19tc2cpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC0xOworCXNrYi0+bGVuID0gc2l6ZW9mKHN0cnVjdCBhdG1sZWNfbXNnKTsKKwltZXNnID0gKHN0cnVjdCBhdG1sZWNfbXNnICopc2tiLT5kYXRhOworICAgICAgICBtZW1zZXQobWVzZywgMCwgc2l6ZW9mKHN0cnVjdCBhdG1sZWNfbXNnKSk7CisJbWVzZy0+dHlwZSA9IHR5cGU7CisgICAgICAgIGlmIChkYXRhICE9IE5VTEwpCisgICAgICAgICAgICAgICAgbWVzZy0+c2l6ZW9mdGx2cyA9IGRhdGEtPmxlbjsKKwlpZiAobWFjX2FkZHIpCisJCW1lbWNweSgmbWVzZy0+Y29udGVudC5ub3JtYWwubWFjX2FkZHIsIG1hY19hZGRyLCBFVEhfQUxFTik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtZXNnLT5jb250ZW50Lm5vcm1hbC50YXJnZXRsZXNzX2xlX2FycCA9IDE7CisJaWYgKGF0bV9hZGRyKQorCQltZW1jcHkoJm1lc2ctPmNvbnRlbnQubm9ybWFsLmF0bV9hZGRyLCBhdG1fYWRkciwgQVRNX0VTQV9MRU4pOworCisgICAgICAgIGF0bV9mb3JjZV9jaGFyZ2UocHJpdi0+bGVjZCwgc2tiLT50cnVlc2l6ZSk7CisJc2sgPSBza19hdG0ocHJpdi0+bGVjZCk7CisJc2tiX3F1ZXVlX3RhaWwoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpOworICAgICAgICBzay0+c2tfZGF0YV9yZWFkeShzaywgc2tiLT5sZW4pOworCisgICAgICAgIGlmIChkYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBEUFJJTlRLKCJsZWM6IGFib3V0IHRvIHNlbmQgJWQgYnl0ZXMgb2YgZGF0YVxuIiwgZGF0YS0+bGVuKTsKKyAgICAgICAgICAgICAgICBhdG1fZm9yY2VfY2hhcmdlKHByaXYtPmxlY2QsIGRhdGEtPnRydWVzaXplKTsKKyAgICAgICAgICAgICAgICBza2JfcXVldWVfdGFpbCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIGRhdGEpOworICAgICAgICAgICAgICAgIHNrLT5za19kYXRhX3JlYWR5KHNrLCBza2ItPmxlbik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKK30KKworLyogc2hhbWVsZXNzbHkgc3RvbGVuIGZyb20gZHJpdmVycy9uZXQvbmV0X2luaXQuYyAqLworc3RhdGljIGludCBsZWNfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKyAgICAgICAgaWYgKChuZXdfbXR1IDwgNjgpIHx8IChuZXdfbXR1ID4gMTgxOTApKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICBkZXYtPm10dSA9IG5ld19tdHU7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsZWNfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogYnkgZGVmYXVsdCwgYWxsIG11bHRpY2FzdCBmcmFtZXMgYXJyaXZlIG92ZXIgdGhlIGJ1cy4KKyAgICAgICAgICogZXZlbnR1YWxseSBzdXBwb3J0IHNlbGVjdGl2ZSBtdWx0aWNhc3Qgc2VydmljZQorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCAKK2xlY19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIGRldi0+Y2hhbmdlX210dSA9IGxlY19jaGFuZ2VfbXR1OworICAgICAgICBkZXYtPm9wZW4gPSBsZWNfb3BlbjsKKyAgICAgICAgZGV2LT5zdG9wID0gbGVjX2Nsb3NlOworICAgICAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGxlY19zdGFydF94bWl0OworCWRldi0+dHhfdGltZW91dCA9IGxlY190eF90aW1lb3V0OworCisgICAgICAgIGRldi0+Z2V0X3N0YXRzID0gbGVjX2dldF9zdGF0czsKKyAgICAgICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBsZWNfc2V0X211bHRpY2FzdF9saXN0OworICAgICAgICBkZXYtPmRvX2lvY3RsICA9IE5VTEw7CisgICAgICAgIHByaW50aygiJXM6IEluaXRpYWxpemVkIVxuIixkZXYtPm5hbWUpOworICAgICAgICByZXR1cm47Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGxlY19jdHJsX21hZ2ljW10gPSB7CisgICAgICAgIDB4ZmYsCisgICAgICAgIDB4MDAsCisgICAgICAgIDB4MDEsCisgICAgICAgIDB4MDEgfTsKKworc3RhdGljIHZvaWQgCitsZWNfcHVzaChzdHJ1Y3QgYXRtX3ZjYyAqdmNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopdmNjLT5wcm90b19kYXRhOworICAgICAgICBzdHJ1Y3QgbGVjX3ByaXYgKnByaXYgPSAoc3RydWN0IGxlY19wcml2ICopZGV2LT5wcml2OyAKKworI2lmIERVTVBfUEFDS0VUUyA+MAorICAgICAgICBpbnQgaT0wOworICAgICAgICBjaGFyIGJ1ZlszMDBdOworCisgICAgICAgIHByaW50aygiJXM6IGxlY19wdXNoIHZjYyB2cGk6JWQgdmNpOiVkXG4iLCBkZXYtPm5hbWUsCisgICAgICAgICAgICAgICB2Y2MtPnZwaSwgdmNjLT52Y2kpOworI2VuZGlmCisgICAgICAgIGlmICghc2tiKSB7CisgICAgICAgICAgICAgICAgRFBSSU5USygiJXM6IG51bGwgc2tiXG4iLGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgbGVjX3ZjY19jbG9zZShwcml2LCB2Y2MpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorI2lmIERVTVBfUEFDS0VUUyA+IDAKKyAgICAgICAgcHJpbnRrKCIlczogcmN2IGRhdGFsZW46JWxkIGxlY2lkOiU0LjR4XG4iLCBkZXYtPm5hbWUsCisgICAgICAgICAgICAgICBza2ItPmxlbiwgcHJpdi0+bGVjaWQpOworI2lmIERVTVBfUEFDS0VUUyA+PSAyCisgICAgICAgIGZvcihpPTA7aTxza2ItPmxlbiAmJiBpIDw5OTtpKyspIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGJ1ZitpKjMsIiUyLjJ4ICIsMHhmZiZza2ItPmRhdGFbaV0pOworICAgICAgICB9CisjZWxpZiBEVU1QX1BBQ0tFVFMgPj0gMQorICAgICAgICBmb3IoaT0wO2k8c2tiLT5sZW4gJiYgaSA8IDMwO2krKykgeworICAgICAgICAgICAgICAgIHNwcmludGYoYnVmK2kqMywiJTIuMnggIiwgMHhmZiZza2ItPmRhdGFbaV0pOworICAgICAgICB9CisjZW5kaWYgLyogRFVNUF9QQUNLRVRTID49IDEgKi8KKyAgICAgICAgaWYgKGk9PXNrYi0+bGVuKQorICAgICAgICAgICAgICAgIHByaW50aygiJXNcbiIsYnVmKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50aygiJXMuLi5cbiIsYnVmKTsKKyNlbmRpZiAvKiBEVU1QX1BBQ0tFVFMgPiAwICovCisgICAgICAgIGlmIChtZW1jbXAoc2tiLT5kYXRhLCBsZWNfY3RybF9tYWdpYywgNCkgPT0wKSB7IC8qIENvbnRyb2wgZnJhbWUsIHRvIGRhZW1vbiovCisJCXN0cnVjdCBzb2NrICpzayA9IHNrX2F0bSh2Y2MpOworCisgICAgICAgICAgICAgICAgRFBSSU5USygiJXM6IFRvIGRhZW1vblxuIixkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgIHNrYl9xdWV1ZV90YWlsKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKKyAgICAgICAgICAgICAgICBzay0+c2tfZGF0YV9yZWFkeShzaywgc2tiLT5sZW4pOworICAgICAgICB9IGVsc2UgeyAvKiBEYXRhIGZyYW1lLCBxdWV1ZSB0byBwcm90b2NvbCBoYW5kbGVycyAqLworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdDsKKworICAgICAgICAgICAgICAgIGF0bV9yZXR1cm4odmNjLHNrYi0+dHJ1ZXNpemUpOworICAgICAgICAgICAgICAgIGlmICgqKHVpbnQxNl90ICopc2tiLT5kYXRhID09IGh0b25zKHByaXYtPmxlY2lkKSB8fAorICAgICAgICAgICAgICAgICAgICAhcHJpdi0+bGVjZCB8fAorICAgICAgICAgICAgICAgICAgICAhKGRldi0+ZmxhZ3MgJiBJRkZfVVApKSB7IAorICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvYmFibHkgbG9vcGluZyBiYWNrLCBvciBpZiBsZWNkIGlzIG1pc3NpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWNkIGhhcyBnb25lIGRvd24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIERQUklOVEsoIklnbm9yaW5nIGZyYW1lLi4uXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisjaWZkZWYgQ09ORklHX1RSCisgICAgICAgICAgICAgICAgaWYgKHByaXYtPmlzX3RyZGV2KSBkc3QgPSAoKHN0cnVjdCBsZWNkYXRhaGRyXzgwMjUgKilza2ItPmRhdGEpLT5oX2Rlc3Q7CisgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgZHN0ID0gKChzdHJ1Y3QgbGVjZGF0YWhkcl84MDIzICopc2tiLT5kYXRhKS0+aF9kZXN0OworCisgICAgICAgICAgICAgICAgaWYgKCEoZHN0WzBdJjB4MDEpICYmICAgLyogTmV2ZXIgZmlsdGVyIE11bHRpL0Jyb2FkY2FzdCAqLworICAgICAgICAgICAgICAgICAgICAhcHJpdi0+aXNfcHJveHkgJiYgIC8qIFByb3h5IHdhbnRzIGFsbCB0aGUgcGFja2V0cyAqLworCQkgICAgbWVtY21wKGRzdCwgZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHByaXYtPmxlY19hcnBfZW1wdHlfb25lcykgeworICAgICAgICAgICAgICAgICAgICAgICAgbGVjX2FycF9jaGVja19lbXB0aWVzKHByaXYsIHZjYywgc2tiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2tiLT5kZXYgPSBkZXY7CisgICAgICAgICAgICAgICAgc2tiX3B1bGwoc2tiLCAyKTsgLyogc2tpcCBsZWNfaWQgKi8KKyNpZmRlZiBDT05GSUdfVFIKKyAgICAgICAgICAgICAgICBpZiAocHJpdi0+aXNfdHJkZXYpIHNrYi0+cHJvdG9jb2wgPSB0cl90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKyAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICBza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworICAgICAgICAgICAgICAgIHByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKyAgICAgICAgICAgICAgICBwcml2LT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKyAgICAgICAgICAgICAgICBtZW1zZXQoQVRNX1NLQihza2IpLCAwLCBzaXplb2Yoc3RydWN0IGF0bV9za2JfZGF0YSkpOworICAgICAgICAgICAgICAgIG5ldGlmX3J4KHNrYik7CisgICAgICAgIH0KK30KKworc3RhdGljIHZvaWQKK2xlY19wb3Aoc3RydWN0IGF0bV92Y2MgKnZjYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGVjX3ZjY19wcml2ICp2cHJpdiA9IExFQ19WQ0NfUFJJVih2Y2MpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKKworCWlmICh2cHJpdiA9PSBOVUxMKSB7CisJCXByaW50aygibGVjX3BvcCgpOiB2cHJpdiA9IE5VTEwhPyE/IT9cbiIpOworCQlyZXR1cm47CisJfQorCisJdnByaXYtPm9sZF9wb3AodmNjLCBza2IpOworCisJaWYgKHZwcml2LT54b2ZmICYmIGF0bV9tYXlfc2VuZCh2Y2MsIDApKSB7CisJCXZwcml2LT54b2ZmID0gMDsKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpCisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorfQorCitzdGF0aWMgaW50IAorbGVjX3ZjY19hdHRhY2goc3RydWN0IGF0bV92Y2MgKnZjYywgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgbGVjX3ZjY19wcml2ICp2cHJpdjsKKyAgICAgICAgaW50IGJ5dGVzX2xlZnQ7CisgICAgICAgIHN0cnVjdCBhdG1sZWNfaW9jIGlvY19kYXRhOworCisgICAgICAgIC8qIExlY2QgbXVzdCBiZSB1cCBpbiB0aGlzIGNhc2UgKi8KKyAgICAgICAgYnl0ZXNfbGVmdCA9IGNvcHlfZnJvbV91c2VyKCZpb2NfZGF0YSwgYXJnLCBzaXplb2Yoc3RydWN0IGF0bWxlY19pb2MpKTsKKyAgICAgICAgaWYgKGJ5dGVzX2xlZnQgIT0gMCkgeworICAgICAgICAgICAgICAgIHByaW50aygibGVjOiBsZWNfdmNjX2F0dGFjaCwgY29weSBmcm9tIHVzZXIgZmFpbGVkIGZvciAlZCBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfbGVmdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlvY19kYXRhLmRldl9udW0gPCAwIHx8IGlvY19kYXRhLmRldl9udW0gPj0gTUFYX0xFQ19JVEYgfHwgCisgICAgICAgICAgICAhZGV2X2xlY1tpb2NfZGF0YS5kZXZfbnVtXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwlpZiAoISh2cHJpdiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsZWNfdmNjX3ByaXYpLCBHRlBfS0VSTkVMKSkpCisJCXJldHVybiAtRU5PTUVNOworCXZwcml2LT54b2ZmID0gMDsKKwl2cHJpdi0+b2xkX3BvcCA9IHZjYy0+cG9wOworCXZjYy0+dXNlcl9iYWNrID0gdnByaXY7CisJdmNjLT5wb3AgPSBsZWNfcG9wOworICAgICAgICBsZWNfdmNjX2FkZGVkKGRldl9sZWNbaW9jX2RhdGEuZGV2X251bV0tPnByaXYsIAorICAgICAgICAgICAgICAgICAgICAgICZpb2NfZGF0YSwgdmNjLCB2Y2MtPnB1c2gpOworICAgICAgICB2Y2MtPnByb3RvX2RhdGEgPSBkZXZfbGVjW2lvY19kYXRhLmRldl9udW1dOworICAgICAgICB2Y2MtPnB1c2ggPSBsZWNfcHVzaDsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgCitsZWNfbWNhc3RfYXR0YWNoKHN0cnVjdCBhdG1fdmNjICp2Y2MsIGludCBhcmcpCit7CisgICAgICAgIGlmIChhcmcgPDAgfHwgYXJnID49IE1BWF9MRUNfSVRGIHx8ICFkZXZfbGVjW2FyZ10pCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIHZjYy0+cHJvdG9fZGF0YSA9IGRldl9sZWNbYXJnXTsKKyAgICAgICAgcmV0dXJuIChsZWNfbWNhc3RfbWFrZSgoc3RydWN0IGxlY19wcml2KilkZXZfbGVjW2FyZ10tPnByaXYsIHZjYykpOworfQorCisvKiBJbml0aWFsaXplIGRldmljZS4gKi8KK3N0YXRpYyBpbnQgCitsZWNkX2F0dGFjaChzdHJ1Y3QgYXRtX3ZjYyAqdmNjLCBpbnQgYXJnKQoreyAgCisgICAgICAgIGludCBpOworICAgICAgICBzdHJ1Y3QgbGVjX3ByaXYgKnByaXY7CisKKyAgICAgICAgaWYgKGFyZzwwKQorICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaSA9IGFyZzsKKyNpZmRlZiBDT05GSUdfVFIKKyAgICAgICAgaWYgKGFyZyA+PSBNQVhfTEVDX0lURikKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyNlbHNlIC8qIFJlc2VydmUgdGhlIHRvcCBOVU1fVFJfREVWUyBmb3IgVFIgKi8KKyAgICAgICAgaWYgKGFyZyA+PSAoTUFYX0xFQ19JVEYtTlVNX1RSX0RFVlMpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworI2VuZGlmCisgICAgICAgIGlmICghZGV2X2xlY1tpXSkgeworICAgICAgICAgICAgICAgIGludCBpc190cmRldiwgc2l6ZTsKKworICAgICAgICAgICAgICAgIGlzX3RyZGV2ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoaSA+PSAoTUFYX0xFQ19JVEYgLSBOVU1fVFJfREVWUykpCisgICAgICAgICAgICAgICAgICAgICAgICBpc190cmRldiA9IDE7CisKKyAgICAgICAgICAgICAgICBzaXplID0gc2l6ZW9mKHN0cnVjdCBsZWNfcHJpdik7CisjaWZkZWYgQ09ORklHX1RSCisgICAgICAgICAgICAgICAgaWYgKGlzX3RyZGV2KQorICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2xlY1tpXSA9IGFsbG9jX3RyZGV2KHNpemUpOworICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgIGRldl9sZWNbaV0gPSBhbGxvY19ldGhlcmRldihzaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoIWRldl9sZWNbaV0pCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihkZXZfbGVjW2ldLT5uYW1lLCBJRk5BTVNJWiwgImxlYyVkIiwgaSk7CisgICAgICAgICAgICAgICAgaWYgKHJlZ2lzdGVyX25ldGRldihkZXZfbGVjW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9uZXRkZXYoZGV2X2xlY1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcml2ID0gZGV2X2xlY1tpXS0+cHJpdjsKKyAgICAgICAgICAgICAgICBwcml2LT5pc190cmRldiA9IGlzX3RyZGV2OworICAgICAgICAgICAgICAgIGxlY19pbml0KGRldl9sZWNbaV0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaXYgPSBkZXZfbGVjW2ldLT5wcml2OworICAgICAgICAgICAgICAgIGlmIChwcml2LT5sZWNkKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQUREUklOVVNFOworICAgICAgICB9CisgICAgICAgIGxlY19hcnBfaW5pdChwcml2KTsKKwlwcml2LT5pdGZudW0gPSBpOyAgLyogTEFORTIgYWRkaXRpb24gKi8KKyAgICAgICAgcHJpdi0+bGVjZCA9IHZjYzsKKyAgICAgICAgdmNjLT5kZXYgPSAmbGVjYXRtX2RldjsKKyAgICAgICAgdmNjX2luc2VydF9zb2NrZXQoc2tfYXRtKHZjYykpOworICAgICAgICAKKyAgICAgICAgdmNjLT5wcm90b19kYXRhID0gZGV2X2xlY1tpXTsKKwlzZXRfYml0KEFUTV9WRl9NRVRBLCZ2Y2MtPmZsYWdzKTsKKwlzZXRfYml0KEFUTV9WRl9SRUFEWSwmdmNjLT5mbGFncyk7CisKKyAgICAgICAgLyogU2V0IGRlZmF1bHQgdmFsdWVzIHRvIHRoZXNlIHZhcmlhYmxlcyAqLworICAgICAgICBwcml2LT5tYXhpbXVtX3Vua25vd25fZnJhbWVfY291bnQgPSAxOworICAgICAgICBwcml2LT5tYXhfdW5rbm93bl9mcmFtZV90aW1lID0gKDEqSFopOworICAgICAgICBwcml2LT52Y2NfdGltZW91dF9wZXJpb2QgPSAoMTIwMCpIWik7CisgICAgICAgIHByaXYtPm1heF9yZXRyeV9jb3VudCA9IDE7CisgICAgICAgIHByaXYtPmFnaW5nX3RpbWUgPSAoMzAwKkhaKTsKKyAgICAgICAgcHJpdi0+Zm9yd2FyZF9kZWxheV90aW1lID0gKDE1KkhaKTsKKyAgICAgICAgcHJpdi0+dG9wb2xvZ3lfY2hhbmdlID0gMDsKKyAgICAgICAgcHJpdi0+YXJwX3Jlc3BvbnNlX3RpbWUgPSAoMSpIWik7CisgICAgICAgIHByaXYtPmZsdXNoX3RpbWVvdXQgPSAoNCpIWik7CisgICAgICAgIHByaXYtPnBhdGhfc3dpdGNoaW5nX2RlbGF5ID0gKDYqSFopOworCisgICAgICAgIGlmIChkZXZfbGVjW2ldLT5mbGFncyAmIElGRl9VUCkgeworICAgICAgICAgICAgICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldl9sZWNbaV0pOworICAgICAgICB9CisgICAgICAgIF9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisgICAgICAgIHJldHVybiBpOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBjaGFyKiBsZWNfYXJwX2dldF9zdGF0dXNfc3RyaW5nKHVuc2lnbmVkIGNoYXIgc3RhdHVzKQoreworCXN0YXRpYyBjaGFyICpsZWNfYXJwX3N0YXR1c19zdHJpbmdbXSA9IHsKKwkJIkVTSV9VTktOT1dOICAgICAgICIsCisJCSJFU0lfQVJQX1BFTkRJTkcgICAiLAorCQkiRVNJX1ZDX1BFTkRJTkcgICAgIiwKKwkJIjxVbmRlZmluZWQ+ICAgICAgICIsCisJCSJFU0lfRkxVU0hfUEVORElORyAiLAorCQkiRVNJX0ZPUldBUkRfRElSRUNUIgorCX07CisKKwlpZiAoc3RhdHVzID4gRVNJX0ZPUldBUkRfRElSRUNUKQorCQlzdGF0dXMgPSAzOwkvKiBFU0lfVU5ERUZJTkVEICovCisJcmV0dXJuIGxlY19hcnBfc3RhdHVzX3N0cmluZ1tzdGF0dXNdOworfQorCitzdGF0aWMgdm9pZCBsZWNfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IGxlY19hcnBfdGFibGUgKmVudHJ5KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCisJCXNlcV9wcmludGYoc2VxLCAiJTIuMngiLCBlbnRyeS0+bWFjX2FkZHJbaV0gJiAweGZmKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVRNX0VTQV9MRU47IGkrKykKKwkJc2VxX3ByaW50ZihzZXEsICIlMi4yeCIsIGVudHJ5LT5hdG1fYWRkcltpXSAmIDB4ZmYpOworCXNlcV9wcmludGYoc2VxLCAiICVzICU0LjR4IiwgbGVjX2FycF9nZXRfc3RhdHVzX3N0cmluZyhlbnRyeS0+c3RhdHVzKSwKKwkJICAgZW50cnktPmZsYWdzICYgMHhmZmZmKTsKKwlpZiAoZW50cnktPnZjYykKKwkJc2VxX3ByaW50ZihzZXEsICIlM2QgJTNkICIsIGVudHJ5LT52Y2MtPnZwaSwgZW50cnktPnZjYy0+dmNpKTsKKwllbHNlCisJICAgICAgICBzZXFfcHJpbnRmKHNlcSwgIiAgICAgICAgIik7CisJaWYgKGVudHJ5LT5yZWN2X3ZjYykgeworCQlzZXFfcHJpbnRmKHNlcSwgIiAgICAgJTNkICUzZCIsIGVudHJ5LT5yZWN2X3ZjYy0+dnBpLAorCQkJICAgZW50cnktPnJlY3ZfdmNjLT52Y2kpOworICAgICAgICB9CisgICAgICAgIHNlcV9wdXRjKHNlcSwgJ1xuJyk7Cit9CisKKworc3RydWN0IGxlY19zdGF0ZSB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGVjX3ByaXYgKmxvY2tlZDsKKwlzdHJ1Y3QgbGVjX2FycF90YWJsZSAqZW50cnk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaXRmOworCWludCBhcnBfdGFibGU7CisJaW50IG1pc2NfdGFibGU7Cit9OworCitzdGF0aWMgdm9pZCAqbGVjX3RibF93YWxrKHN0cnVjdCBsZWNfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgbGVjX2FycF90YWJsZSAqdGJsLAorCQkJICBsb2ZmX3QgKmwpCit7CisJc3RydWN0IGxlY19hcnBfdGFibGUgKmUgPSBzdGF0ZS0+ZW50cnk7CisKKwlpZiAoIWUpCisJCWUgPSB0Ymw7CisJaWYgKGUgPT0gKHZvaWQgKikxKSB7CisJCWUgPSB0Ymw7CisJCS0tKmw7CisJfQorCWZvciAoOyBlOyBlID0gZS0+bmV4dCkgeworCQlpZiAoLS0qbCA8IDApCisJCQlicmVhazsKKwl9CisJc3RhdGUtPmVudHJ5ID0gZTsKKwlyZXR1cm4gKCpsIDwgMCkgPyBzdGF0ZSA6IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICpsZWNfYXJwX3dhbGsoc3RydWN0IGxlY19zdGF0ZSAqc3RhdGUsIGxvZmZfdCAqbCwKKwkJCSAgICAgIHN0cnVjdCBsZWNfcHJpdiAqcHJpdikKK3sKKwl2b2lkICp2ID0gTlVMTDsKKwlpbnQgcDsKKworCWZvciAocCA9IHN0YXRlLT5hcnBfdGFibGU7IHAgPCBMRUNfQVJQX1RBQkxFX1NJWkU7IHArKykgeworCQl2ID0gbGVjX3RibF93YWxrKHN0YXRlLCBwcml2LT5sZWNfYXJwX3RhYmxlc1twXSwgbCk7CisJCWlmICh2KQorCQkJYnJlYWs7CisJfQorCXN0YXRlLT5hcnBfdGFibGUgPSBwOworCXJldHVybiB2OworfQorCitzdGF0aWMgdm9pZCAqbGVjX21pc2Nfd2FsayhzdHJ1Y3QgbGVjX3N0YXRlICpzdGF0ZSwgbG9mZl90ICpsLAorCQkJICAgc3RydWN0IGxlY19wcml2ICpwcml2KQoreworCXN0cnVjdCBsZWNfYXJwX3RhYmxlICpsZWNfbWlzY190YWJsZXNbXSA9IHsKKwkJcHJpdi0+bGVjX2FycF9lbXB0eV9vbmVzLAorCQlwcml2LT5sZWNfbm9fZm9yd2FyZCwKKwkJcHJpdi0+bWNhc3RfZndkcworCX07CisJdm9pZCAqdiA9IE5VTEw7CisJaW50IHE7CisKKwlmb3IgKHEgPSBzdGF0ZS0+bWlzY190YWJsZTsgcSA8IEFSUkFZX1NJWkUobGVjX21pc2NfdGFibGVzKTsgcSsrKSB7CisJCXYgPSBsZWNfdGJsX3dhbGsoc3RhdGUsIGxlY19taXNjX3RhYmxlc1txXSwgbCk7CisJCWlmICh2KQorCQkJYnJlYWs7CisJfQorCXN0YXRlLT5taXNjX3RhYmxlID0gcTsKKwlyZXR1cm4gdjsKK30KKworc3RhdGljIHZvaWQgKmxlY19wcml2X3dhbGsoc3RydWN0IGxlY19zdGF0ZSAqc3RhdGUsIGxvZmZfdCAqbCwKKwkJCSAgIHN0cnVjdCBsZWNfcHJpdiAqcHJpdikKK3sKKwlpZiAoIXN0YXRlLT5sb2NrZWQpIHsKKwkJc3RhdGUtPmxvY2tlZCA9IHByaXY7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sZWNfYXJwX2xvY2ssIHN0YXRlLT5mbGFncyk7CisJfQorCWlmICghbGVjX2FycF93YWxrKHN0YXRlLCBsLCBwcml2KSAmJgorCSAgICAhbGVjX21pc2Nfd2FsayhzdGF0ZSwgbCwgcHJpdikpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bGVjX2FycF9sb2NrLCBzdGF0ZS0+ZmxhZ3MpOworCQlzdGF0ZS0+bG9ja2VkID0gTlVMTDsKKwkJLyogUGFydGlhbCBzdGF0ZSByZXNldCBmb3IgdGhlIG5leHQgdGltZSB3ZSBnZXQgY2FsbGVkICovCisJCXN0YXRlLT5hcnBfdGFibGUgPSBzdGF0ZS0+bWlzY190YWJsZSA9IDA7CisJfQorCXJldHVybiBzdGF0ZS0+bG9ja2VkOworfQorCitzdGF0aWMgdm9pZCAqbGVjX2l0Zl93YWxrKHN0cnVjdCBsZWNfc3RhdGUgKnN0YXRlLCBsb2ZmX3QgKmwpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl2b2lkICp2OworCisJZGV2ID0gc3RhdGUtPmRldiA/IHN0YXRlLT5kZXYgOiBkZXZfbGVjW3N0YXRlLT5pdGZdOworCXYgPSAoZGV2ICYmIGRldi0+cHJpdikgPyBsZWNfcHJpdl93YWxrKHN0YXRlLCBsLCBkZXYtPnByaXYpIDogTlVMTDsKKwlpZiAoIXYgJiYgZGV2KSB7CisJCWRldl9wdXQoZGV2KTsKKwkJLyogUGFydGlhbCBzdGF0ZSByZXNldCBmb3IgdGhlIG5leHQgdGltZSB3ZSBnZXQgY2FsbGVkICovCisJCWRldiA9IE5VTEw7CisJfQorCXN0YXRlLT5kZXYgPSBkZXY7CisJcmV0dXJuIHY7Cit9CisKK3N0YXRpYyB2b2lkICpsZWNfZ2V0X2lkeChzdHJ1Y3QgbGVjX3N0YXRlICpzdGF0ZSwgbG9mZl90IGwpCit7CisJdm9pZCAqdiA9IE5VTEw7CisKKwlmb3IgKDsgc3RhdGUtPml0ZiA8IE1BWF9MRUNfSVRGOyBzdGF0ZS0+aXRmKyspIHsKKwkJdiA9IGxlY19pdGZfd2FsayhzdGF0ZSwgJmwpOworCQlpZiAodikKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gdjsgCit9CisKK3N0YXRpYyB2b2lkICpsZWNfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgbGVjX3N0YXRlICpzdGF0ZSA9IHNlcS0+cHJpdmF0ZTsKKworCXN0YXRlLT5pdGYgPSAwOworCXN0YXRlLT5kZXYgPSBOVUxMOworCXN0YXRlLT5sb2NrZWQgPSBOVUxMOworCXN0YXRlLT5hcnBfdGFibGUgPSAwOworCXN0YXRlLT5taXNjX3RhYmxlID0gMDsKKwlzdGF0ZS0+ZW50cnkgPSAodm9pZCAqKTE7CisKKwlyZXR1cm4gKnBvcyA/IGxlY19nZXRfaWR4KHN0YXRlLCAqcG9zKSA6ICh2b2lkKikxOworfQorCitzdGF0aWMgdm9pZCBsZWNfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IGxlY19zdGF0ZSAqc3RhdGUgPSBzZXEtPnByaXZhdGU7CisKKwlpZiAoc3RhdGUtPmRldikgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+bG9ja2VkLT5sZWNfYXJwX2xvY2ssCisJCQkJICAgICAgIHN0YXRlLT5mbGFncyk7CisJCWRldl9wdXQoc3RhdGUtPmRldik7CisJfQorfQorCitzdGF0aWMgdm9pZCAqbGVjX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgbGVjX3N0YXRlICpzdGF0ZSA9IHNlcS0+cHJpdmF0ZTsKKworCXYgPSBsZWNfZ2V0X2lkeChzdGF0ZSwgMSk7CisJKnBvcyArPSAhIVBUUl9FUlIodik7CisJcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBpbnQgbGVjX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0YXRpYyBjaGFyIGxlY19iYW5uZXJbXSA9ICJJdGYgIE1BQyAgICAgICAgICBBVE0gZGVzdGluYXRpb24iIAorCQkiICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgICAgICAgICAgICBGbGFncyAiCisJCSJWUEkvVkNJIFJlY3YgVlBJL1ZDSVxuIjsKKworCWlmICh2ID09ICh2b2lkICopMSkKKwkJc2VxX3B1dHMoc2VxLCBsZWNfYmFubmVyKTsKKwllbHNlIHsKKwkJc3RydWN0IGxlY19zdGF0ZSAqc3RhdGUgPSBzZXEtPnByaXZhdGU7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzdGF0ZS0+ZGV2OyAKKworCQlzZXFfcHJpbnRmKHNlcSwgIiVzICIsIGRldi0+bmFtZSk7CisJCWxlY19pbmZvKHNlcSwgc3RhdGUtPmVudHJ5KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbGVjX3NlcV9vcHMgPSB7CisJLnN0YXJ0CT0gbGVjX3NlcV9zdGFydCwKKwkubmV4dAk9IGxlY19zZXFfbmV4dCwKKwkuc3RvcAk9IGxlY19zZXFfc3RvcCwKKwkuc2hvdwk9IGxlY19zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgbGVjX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBsZWNfc3RhdGUgKnN0YXRlOworCXN0cnVjdCBzZXFfZmlsZSAqc2VxOworCWludCByYyA9IC1FQUdBSU47CisKKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKCpzdGF0ZSksIEdGUF9LRVJORUwpOworCWlmICghc3RhdGUpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlyYyA9IHNlcV9vcGVuKGZpbGUsICZsZWNfc2VxX29wcyk7CisJaWYgKHJjKQorCQlnb3RvIG91dF9rZnJlZTsKKwlzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc2VxLT5wcml2YXRlID0gc3RhdGU7CitvdXQ6CisJcmV0dXJuIHJjOworCitvdXRfa2ZyZWU6CisJa2ZyZWUoc3RhdGUpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50IGxlY19zZXFfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX3JlbGVhc2VfcHJpdmF0ZShpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxlY19zZXFfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gbGVjX3NlcV9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gbGVjX3NlcV9yZWxlYXNlLAorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IGxhbmVfaW9jdGwoc3RydWN0IHNvY2tldCAqc29jaywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGF0bV92Y2MgKnZjYyA9IEFUTV9TRChzb2NrKTsKKwlpbnQgZXJyID0gMDsKKwkKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIEFUTUxFQ19DVFJMOiAKKwkJY2FzZSBBVE1MRUNfTUNBU1Q6CisJCWNhc2UgQVRNTEVDX0RBVEE6CisJCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIEFUTUxFQ19DVFJMOgorCQkJZXJyID0gbGVjZF9hdHRhY2godmNjLCAoaW50KSBhcmcpOworCQkJaWYgKGVyciA+PSAwKQorCQkJCXNvY2stPnN0YXRlID0gU1NfQ09OTkVDVEVEOworCQkJYnJlYWs7CisJCWNhc2UgQVRNTEVDX01DQVNUOgorCQkJZXJyID0gbGVjX21jYXN0X2F0dGFjaCh2Y2MsIChpbnQpIGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSBBVE1MRUNfREFUQToKKwkJCWVyciA9IGxlY192Y2NfYXR0YWNoKHZjYywgKHZvaWQgX191c2VyICopIGFyZyk7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IGF0bV9pb2N0bCBsYW5lX2lvY3RsX29wcyA9IHsKKwkub3duZXIgID0gVEhJU19NT0RVTEUsCisJLmlvY3RsICA9IGxhbmVfaW9jdGwsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBsYW5lX21vZHVsZV9pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnA7CisKKwlwID0gY3JlYXRlX3Byb2NfZW50cnkoImxlYyIsIFNfSVJVR08sIGF0bV9wcm9jX3Jvb3QpOworCWlmIChwKQorCQlwLT5wcm9jX2ZvcHMgPSAmbGVjX3NlcV9mb3BzOworI2VuZGlmCisKKwlyZWdpc3Rlcl9hdG1faW9jdGwoJmxhbmVfaW9jdGxfb3BzKTsKKyAgICAgICAgcHJpbnRrKCJsZWMuYzogIiBfX0RBVEVfXyAiICIgX19USU1FX18gIiBpbml0aWFsaXplZFxuIik7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbGFuZV9tb2R1bGVfY2xlYW51cCh2b2lkKQoreworICAgICAgICBpbnQgaTsKKyAgICAgICAgc3RydWN0IGxlY19wcml2ICpwcml2OworCisJcmVtb3ZlX3Byb2NfZW50cnkoImxlYyIsIGF0bV9wcm9jX3Jvb3QpOworCisJZGVyZWdpc3Rlcl9hdG1faW9jdGwoJmxhbmVfaW9jdGxfb3BzKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0xFQ19JVEY7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChkZXZfbGVjW2ldICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaXYgPSAoc3RydWN0IGxlY19wcml2ICopZGV2X2xlY1tpXS0+cHJpdjsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldl9sZWNbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9uZXRkZXYoZGV2X2xlY1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXZfbGVjW2ldID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit9CisKK21vZHVsZV9pbml0KGxhbmVfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQobGFuZV9tb2R1bGVfY2xlYW51cCk7CisKKy8qCisgKiBMQU5FMjogMy4xLjMsIExFX1JFU09MVkUucmVxdWVzdAorICogTm9uIGZvcmNlIGFsbG9jYXRlcyBtZW1vcnkgYW5kIGZpbGxzIGluICp0bHZzLCBmaWxscyBpbiAqc2l6ZW9mdGx2cy4KKyAqIElmIHNpemVvZnRsdnMgPT0gTlVMTCB0aGUgZGVmYXVsdCBUTFZzIGFzc29jaWF0ZWQgd2l0aCB3aXRoIHRoaXMKKyAqIGxlYyB3aWxsIGJlIHVzZWQuCisgKiBJZiBkc3RfbWFjID09IE5VTEwsIHRhcmdldGxlc3MgTEVfQVJQIHdpbGwgYmUgc2VudAorICovCitzdGF0aWMgaW50IGxhbmUyX3Jlc29sdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKmRzdF9tYWMsIGludCBmb3JjZSwKKyAgICB1OCAqKnRsdnMsIHUzMiAqc2l6ZW9mdGx2cykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICBzdHJ1Y3QgbGVjX3ByaXYgKnByaXYgPSAoc3RydWN0IGxlY19wcml2ICopZGV2LT5wcml2OworICAgICAgICBzdHJ1Y3QgbGVjX2FycF90YWJsZSAqdGFibGU7CisgICAgICAgIHN0cnVjdCBza19idWZmICpza2I7CisgICAgICAgIGludCByZXR2YWw7CisKKyAgICAgICAgaWYgKGZvcmNlID09IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxlY19hcnBfbG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgIHRhYmxlID0gbGVjX2FycF9maW5kKHByaXYsIGRzdF9tYWMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sZWNfYXJwX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICBpZih0YWJsZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICp0bHZzID0ga21hbGxvYyh0YWJsZS0+c2l6ZW9mdGx2cywgR0ZQX0FUT01JQyk7CisgICAgICAgICAgICAgICAgaWYgKCp0bHZzID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbWVtY3B5KCp0bHZzLCB0YWJsZS0+dGx2cywgdGFibGUtPnNpemVvZnRsdnMpOworICAgICAgICAgICAgICAgICpzaXplb2Z0bHZzID0gdGFibGUtPnNpemVvZnRsdnM7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworCWlmIChzaXplb2Z0bHZzID09IE5VTEwpCisJCXJldHZhbCA9IHNlbmRfdG9fbGVjZChwcml2LCBsX2FycF94bXQsIGRzdF9tYWMsIE5VTEwsIE5VTEwpOworCQkKKwllbHNlIHsKKwkJc2tiID0gYWxsb2Nfc2tiKCpzaXplb2Z0bHZzLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCQlza2ItPmxlbiA9ICpzaXplb2Z0bHZzOworCQltZW1jcHkoc2tiLT5kYXRhLCAqdGx2cywgKnNpemVvZnRsdnMpOworCQlyZXR2YWwgPSBzZW5kX3RvX2xlY2QocHJpdiwgbF9hcnBfeG10LCBkc3RfbWFjLCBOVUxMLCBza2IpOworCX0KKyAgICAgICAgcmV0dXJuIHJldHZhbDsKK30gICAgICAgIAorCisKKy8qCisgKiBMQU5FMjogMy4xLjQsIExFX0FTU09DSUFURS5yZXF1ZXN0CisgKiBBc3NvY2lhdGUgdGhlICp0bHZzIHdpdGggdGhlICpsYW5fZHN0IGFkZHJlc3MuCisgKiBXaWxsIG92ZXJ3cml0ZSBhbnkgcHJldmlvdXMgYXNzb2NpYXRpb24KKyAqIFJldHVybnMgMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZSAob3V0IG9mIG1lbW9yeSkKKyAqCisgKi8KK3N0YXRpYyBpbnQgbGFuZTJfYXNzb2NpYXRlX3JlcSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKmxhbl9kc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgdTggKnRsdnMsIHUzMiBzaXplb2Z0bHZzKQoreworICAgICAgICBpbnQgcmV0dmFsOworICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworICAgICAgICBzdHJ1Y3QgbGVjX3ByaXYgKnByaXYgPSAoc3RydWN0IGxlY19wcml2KilkZXYtPnByaXY7CisKKyAgICAgICAgaWYgKCBtZW1jbXAobGFuX2RzdCwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pICE9IDAgKQorICAgICAgICAgICAgICAgIHJldHVybiAoMCk7ICAgICAgIC8qIG5vdCBvdXIgbWFjIGFkZHJlc3MgKi8KKworICAgICAgICBrZnJlZShwcml2LT50bHZzKTsgLyogTlVMTCBpZiB0aGVyZSB3YXMgbm8gcHJldmlvdXMgYXNzb2NpYXRpb24gKi8KKworICAgICAgICBwcml2LT50bHZzID0ga21hbGxvYyhzaXplb2Z0bHZzLCBHRlBfS0VSTkVMKTsKKyAgICAgICAgaWYgKHByaXYtPnRsdnMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICBwcml2LT5zaXplb2Z0bHZzID0gc2l6ZW9mdGx2czsKKyAgICAgICAgbWVtY3B5KHByaXYtPnRsdnMsIHRsdnMsIHNpemVvZnRsdnMpOworCisgICAgICAgIHNrYiA9IGFsbG9jX3NrYihzaXplb2Z0bHZzLCBHRlBfQVRPTUlDKTsKKyAgICAgICAgaWYgKHNrYiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBza2ItPmxlbiA9IHNpemVvZnRsdnM7CisgICAgICAgIG1lbWNweShza2ItPmRhdGEsIHRsdnMsIHNpemVvZnRsdnMpOworICAgICAgICByZXR2YWwgPSBzZW5kX3RvX2xlY2QocHJpdiwgbF9hc3NvY2lhdGVfcmVxLCBOVUxMLCBOVUxMLCBza2IpOworICAgICAgICBpZiAocmV0dmFsICE9IDApCisgICAgICAgICAgICAgICAgcHJpbnRrKCJsZWMuYzogbGFuZTJfYXNzb2NpYXRlX3JlcSgpIGZhaWxlZFxuIik7CisgICAgICAgIC8qIElmIHRoZSBwcmV2aW91cyBhc3NvY2lhdGlvbiBoYXMgY2hhbmdlZCB3ZSBtdXN0CisgICAgICAgICAqIHNvbWVob3cgbm90aWZ5IG90aGVyIExBTkUgZW50aXRpZXMgYWJvdXQgdGhlIGNoYW5nZQorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuICgxKTsKK30KKworLyoKKyAqIExBTkUyOiAzLjEuNSwgTEVfQVNTT0NJQVRFLmluZGljYXRpb24KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGxhbmUyX2Fzc29jaWF0ZV9pbmQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICptYWNfYWRkciwKKyAgICB1OCAqdGx2cywgdTMyIHNpemVvZnRsdnMpCit7CisjaWYgMAorICAgICAgICBpbnQgaSA9IDA7CisjZW5kaWYKKwlzdHJ1Y3QgbGVjX3ByaXYgKnByaXYgPSAoc3RydWN0IGxlY19wcml2ICopZGV2LT5wcml2OworI2lmIDAgLyogV2h5IGhhdmUgdGhlIFRMVnMgaW4gTEVfQVJQIGVudHJpZXMgc2luY2Ugd2UgZG8gbm90IHVzZSB0aGVtPyBXaGVuIHlvdQorICAgICAgICAgdW5jb21tZW50IHRoaXMgY29kZSwgbWFrZSBzdXJlIHRoZSBUTFZzIGdldCBmcmVlZCB3aGVuIGVudHJ5IGlzIGtpbGxlZCAqLworICAgICAgICBzdHJ1Y3QgbGVjX2FycF90YWJsZSAqZW50cnkgPSBsZWNfYXJwX2ZpbmQocHJpdiwgbWFjX2FkZHIpOworCisgICAgICAgIGlmIChlbnRyeSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybjsgICAgIC8qIHNob3VsZCBub3QgaGFwcGVuICovCisKKyAgICAgICAga2ZyZWUoZW50cnktPnRsdnMpOworCisgICAgICAgIGVudHJ5LT50bHZzID0ga21hbGxvYyhzaXplb2Z0bHZzLCBHRlBfS0VSTkVMKTsKKyAgICAgICAgaWYgKGVudHJ5LT50bHZzID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGVudHJ5LT5zaXplb2Z0bHZzID0gc2l6ZW9mdGx2czsKKyAgICAgICAgbWVtY3B5KGVudHJ5LT50bHZzLCB0bHZzLCBzaXplb2Z0bHZzKTsKKyNlbmRpZgorI2lmIDAKKyAgICAgICAgcHJpbnRrKCJsZWMuYzogbGFuZTJfYXNzb2NpYXRlX2luZCgpXG4iKTsKKyAgICAgICAgcHJpbnRrKCJkdW1wIG9mIHRsdnMsIHNpemVvZnRsdnM9JWRcbiIsIHNpemVvZnRsdnMpOworICAgICAgICB3aGlsZSAoaSA8IHNpemVvZnRsdnMpCisgICAgICAgICAgICAgICAgcHJpbnRrKCIlMDJ4ICIsIHRsdnNbaSsrXSk7CisgICAgICAgIAorICAgICAgICBwcmludGsoIlxuIik7CisjZW5kaWYKKworICAgICAgICAvKiB0ZWxsIE1QT0EgYWJvdXQgdGhlIFRMVnMgd2Ugc2F3ICovCisgICAgICAgIGlmIChwcml2LT5sYW5lMl9vcHMgJiYgcHJpdi0+bGFuZTJfb3BzLT5hc3NvY2lhdGVfaW5kaWNhdG9yKSB7CisgICAgICAgICAgICAgICAgcHJpdi0+bGFuZTJfb3BzLT5hc3NvY2lhdGVfaW5kaWNhdG9yKGRldiwgbWFjX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsdnMsIHNpemVvZnRsdnMpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKK30KKworLyoKKyAqIEhlcmUgc3RhcnRzIHdoYXQgdXNlZCB0byBsZWNfYXJwYy5jCisgKgorICogbGVjX2FycGMuYyB3YXMgYWRkZWQgaGVyZSB3aGVuIG1ha2luZworICogbGFuZSBjbGllbnQgbW9kdWxhci4gT2N0b2JlciAxOTk3CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vcGFyYW0uaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorCisKKyNpZiAwCisjZGVmaW5lIERQUklOVEsoZm9ybWF0LGFyZ3MuLi4pCisvKgorI2RlZmluZSBEUFJJTlRLIHByaW50aworKi8KKyNlbmRpZgorI2RlZmluZSBERUJVR19BUlBfVEFCTEUgMAorCisjZGVmaW5lIExFQ19BUlBfUkVGUkVTSF9JTlRFUlZBTCAoMypIWikKKworc3RhdGljIHZvaWQgbGVjX2FycF9jaGVja19leHBpcmUodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGxlY19hcnBfZXhwaXJlX2FycCh1bnNpZ25lZCBsb25nIGRhdGEpOworCisvKiAKKyAqIEFycCB0YWJsZSBmdW5jcworICovCisKKyNkZWZpbmUgSEFTSChjaCkgKGNoICYgKExFQ19BUlBfVEFCTEVfU0laRSAtMSkpCisKKy8qCisgKiBJbml0aWFsaXphdGlvbiBvZiBhcnAtY2FjaGUKKyAqLworc3RhdGljIHZvaWQgCitsZWNfYXJwX2luaXQoc3RydWN0IGxlY19wcml2ICpwcml2KQoreworICAgICAgICB1bnNpZ25lZCBzaG9ydCBpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMRUNfQVJQX1RBQkxFX1NJWkU7IGkrKykgeworICAgICAgICAgICAgICAgIHByaXYtPmxlY19hcnBfdGFibGVzW2ldID0gTlVMTDsKKyAgICAgICAgfSAgICAgICAgCisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxlY19hcnBfbG9jayk7CisgICAgICAgIGluaXRfdGltZXIoJnByaXYtPmxlY19hcnBfdGltZXIpOworICAgICAgICBwcml2LT5sZWNfYXJwX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgTEVDX0FSUF9SRUZSRVNIX0lOVEVSVkFMOworICAgICAgICBwcml2LT5sZWNfYXJwX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwcml2OworICAgICAgICBwcml2LT5sZWNfYXJwX3RpbWVyLmZ1bmN0aW9uID0gbGVjX2FycF9jaGVja19leHBpcmU7CisgICAgICAgIGFkZF90aW1lcigmcHJpdi0+bGVjX2FycF90aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkCitsZWNfYXJwX2NsZWFyX3ZjY3Moc3RydWN0IGxlY19hcnBfdGFibGUgKmVudHJ5KQoreworICAgICAgICBpZiAoZW50cnktPnZjYykgeworCQlzdHJ1Y3QgYXRtX3ZjYyAqdmNjID0gZW50cnktPnZjYzsKKwkJc3RydWN0IGxlY192Y2NfcHJpdiAqdnByaXYgPSBMRUNfVkNDX1BSSVYodmNjKTsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSopIHZjYy0+cHJvdG9fZGF0YTsKKworICAgICAgICAgICAgICAgIHZjYy0+cG9wID0gdnByaXYtPm9sZF9wb3A7CisJCWlmICh2cHJpdi0+eG9mZikKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJa2ZyZWUodnByaXYpOworCQl2Y2MtPnVzZXJfYmFjayA9IE5VTEw7CisgICAgICAgICAgICAgICAgdmNjLT5wdXNoID0gZW50cnktPm9sZF9wdXNoOworCQl2Y2NfcmVsZWFzZV9hc3luYyh2Y2MsIC1FUElQRSk7CisgICAgICAgICAgICAgICAgdmNjID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW50cnktPnJlY3ZfdmNjKSB7CisgICAgICAgICAgICAgICAgZW50cnktPnJlY3ZfdmNjLT5wdXNoID0gZW50cnktPm9sZF9yZWN2X3B1c2g7CisJCXZjY19yZWxlYXNlX2FzeW5jKGVudHJ5LT5yZWN2X3ZjYywgLUVQSVBFKTsKKyAgICAgICAgICAgICAgICBlbnRyeS0+cmVjdl92Y2MgPSBOVUxMOworICAgICAgICB9ICAgICAgICAKK30KKworLyoKKyAqIEluc2VydCBlbnRyeSB0byBsZWNfYXJwX3RhYmxlCisgKiBMQU5FMjogQWRkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgdG8gc2F0aXNmeSA4LjEuMTMKKyAqLworc3RhdGljIGlubGluZSB2b2lkIAorbGVjX2FycF9hZGQoc3RydWN0IGxlY19wcml2ICpwcml2LCBzdHJ1Y3QgbGVjX2FycF90YWJsZSAqdG9fYWRkKQoreworICAgICAgICB1bnNpZ25lZCBzaG9ydCBwbGFjZTsKKyAgICAgICAgc3RydWN0IGxlY19hcnBfdGFibGUgKnRtcDsKKworICAgICAgICBwbGFjZSA9IEhBU0godG9fYWRkLT5tYWNfYWRkcltFVEhfQUxFTi0xXSk7CisgICAgICAgIHRtcCA9IHByaXYtPmxlY19hcnBfdGFibGVzW3BsYWNlXTsKKyAgICAgICAgdG9fYWRkLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHByaXYtPmxlY19hcnBfdGFibGVzW3BsYWNlXSA9IHRvX2FkZDsKKyAgCisgICAgICAgIGVsc2UgeyAgLyogYWRkIHRvIHRoZSBlbmQgKi8KKyAgICAgICAgICAgICAgICB3aGlsZSAodG1wLT5uZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1wLT5uZXh0OworICAgICAgICAgICAgICAgIHRtcC0+bmV4dCA9IHRvX2FkZDsKKyAgICAgICAgfQorCisgICAgICAgIERQUklOVEsoIkxFQ19BUlA6IEFkZGVkIGVudHJ5OiUyLjJ4ICUyLjJ4ICUyLjJ4ICUyLjJ4ICUyLjJ4ICUyLjJ4XG4iLAorICAgICAgICAgICAgICAgIDB4ZmYmdG9fYWRkLT5tYWNfYWRkclswXSwgMHhmZiZ0b19hZGQtPm1hY19hZGRyWzFdLAorICAgICAgICAgICAgICAgIDB4ZmYmdG9fYWRkLT5tYWNfYWRkclsyXSwgMHhmZiZ0b19hZGQtPm1hY19hZGRyWzNdLAorICAgICAgICAgICAgICAgIDB4ZmYmdG9fYWRkLT5tYWNfYWRkcls0XSwgMHhmZiZ0b19hZGQtPm1hY19hZGRyWzVdKTsKK30KKworLyoKKyAqIFJlbW92ZSBlbnRyeSBmcm9tIGxlY19hcnBfdGFibGUKKyAqLworc3RhdGljIGludCAKK2xlY19hcnBfcmVtb3ZlKHN0cnVjdCBsZWNfcHJpdiAqcHJpdiwKKyAgICAgICAgICAgICAgIHN0cnVjdCBsZWNfYXJwX3RhYmxlICp0b19yZW1vdmUpCit7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHBsYWNlOworICAgICAgICBzdHJ1Y3QgbGVjX2FycF90YWJsZSAqdG1wOworICAgICAgICBpbnQgcmVtb3ZlX3ZjYz0xOworCisgICAgICAgIGlmICghdG9fcmVtb3ZlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHBsYWNlID0gSEFTSCh0b19yZW1vdmUtPm1hY19hZGRyW0VUSF9BTEVOLTFdKTsKKyAgICAgICAgdG1wID0gcHJpdi0+bGVjX2FycF90YWJsZXNbcGxhY2VdOworICAgICAgICBpZiAodG1wID09IHRvX3JlbW92ZSkgeworICAgICAgICAgICAgICAgIHByaXYtPmxlY19hcnBfdGFibGVzW3BsYWNlXSA9IHRtcC0+bmV4dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3aGlsZSh0bXAgJiYgdG1wLT5uZXh0ICE9IHRvX3JlbW92ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1wLT5uZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXRtcCkgey8qIEVudHJ5IHdhcyBub3QgZm91bmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdG1wLT5uZXh0ID0gdG9fcmVtb3ZlLT5uZXh0OworICAgICAgICBkZWxfdGltZXIoJnRvX3JlbW92ZS0+dGltZXIpOworICAKKyAgICAgICAgLyogSWYgdGhpcyBpcyB0aGUgb25seSBNQUMgY29ubmVjdGVkIHRvIHRoaXMgVkNDLCBhbHNvIHRlYXIgZG93bgorICAgICAgICAgICB0aGUgVkNDICovCisgICAgICAgIGlmICh0b19yZW1vdmUtPnN0YXR1cyA+PSBFU0lfRkxVU0hfUEVORElORykgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogRVNJX0ZMVVNIX1BFTkRJTkcsIEVTSV9GT1JXQVJEX0RJUkVDVAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGZvcihwbGFjZSA9IDA7IHBsYWNlIDwgTEVDX0FSUF9UQUJMRV9TSVpFOyBwbGFjZSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IodG1wID0gcHJpdi0+bGVjX2FycF90YWJsZXNbcGxhY2VdOyB0bXAgIT0gTlVMTDsgdG1wID0gdG1wLT5uZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZW1jbXAodG1wLT5hdG1fYWRkciwgdG9fcmVtb3ZlLT5hdG1fYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVE1fRVNBX0xFTik9PTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfdmNjPTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJlbW92ZV92Y2MpCisgICAgICAgICAgICAgICAgICAgICAgICBsZWNfYXJwX2NsZWFyX3ZjY3ModG9fcmVtb3ZlKTsKKyAgICAgICAgfQorICAgICAgICBza2JfcXVldWVfcHVyZ2UoJnRvX3JlbW92ZS0+dHhfd2FpdCk7IC8qIEZJWE1FOiBnb29kIHBsYWNlIGZvciB0aGlzPyAqLworCisgICAgICAgIERQUklOVEsoIkxFQ19BUlA6IFJlbW92ZWQgZW50cnk6JTIuMnggJTIuMnggJTIuMnggJTIuMnggJTIuMnggJTIuMnhcbiIsCisgICAgICAgICAgICAgICAgMHhmZiZ0b19yZW1vdmUtPm1hY19hZGRyWzBdLCAweGZmJnRvX3JlbW92ZS0+bWFjX2FkZHJbMV0sCisgICAgICAgICAgICAgICAgMHhmZiZ0b19yZW1vdmUtPm1hY19hZGRyWzJdLCAweGZmJnRvX3JlbW92ZS0+bWFjX2FkZHJbM10sCisgICAgICAgICAgICAgICAgMHhmZiZ0b19yZW1vdmUtPm1hY19hZGRyWzRdLCAweGZmJnRvX3JlbW92ZS0+bWFjX2FkZHJbNV0pOworICAgICAgICByZXR1cm4gMDsKK30KKworI2lmIERFQlVHX0FSUF9UQUJMRQorc3RhdGljIGNoYXIqCitnZXRfc3RhdHVzX3N0cmluZyh1bnNpZ25lZCBjaGFyIHN0KQoreworICAgICAgICBzd2l0Y2goc3QpIHsKKyAgICAgICAgY2FzZSBFU0lfVU5LTk9XTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkVTSV9VTktOT1dOIjsKKyAgICAgICAgY2FzZSBFU0lfQVJQX1BFTkRJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuICJFU0lfQVJQX1BFTkRJTkciOworICAgICAgICBjYXNlIEVTSV9WQ19QRU5ESU5HOgorICAgICAgICAgICAgICAgIHJldHVybiAiRVNJX1ZDX1BFTkRJTkciOworICAgICAgICBjYXNlIEVTSV9GTFVTSF9QRU5ESU5HOgorICAgICAgICAgICAgICAgIHJldHVybiAiRVNJX0ZMVVNIX1BFTkRJTkciOworICAgICAgICBjYXNlIEVTSV9GT1JXQVJEX0RJUkVDVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkVTSV9GT1JXQVJEX0RJUkVDVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICI8VU5LTk9XTj4iOworICAgICAgICB9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK2R1bXBfYXJwX3RhYmxlKHN0cnVjdCBsZWNfcHJpdiAqcHJpdikKK3sKKyNpZiBERUJVR19BUlBfVEFCTEUKKyAgICAgICAgaW50IGksaiwgb2Zmc2V0OworICAgICAgICBzdHJ1Y3QgbGVjX2FycF90YWJsZSAqcnVsbGE7CisgICAgICAgIGNoYXIgYnVmWzEwMjRdOworICAgICAgICBzdHJ1Y3QgbGVjX2FycF90YWJsZSAqKmxlY19hcnBfdGFibGVzID0KKyAgICAgICAgICAgICAgICAoc3RydWN0IGxlY19hcnBfdGFibGUgKiopcHJpdi0+bGVjX2FycF90YWJsZXM7CisgICAgICAgIHN0cnVjdCBsZWNfYXJwX3RhYmxlICpsZWNfYXJwX2VtcHR5X29uZXMgPQorICAgICAgICAgICAgICAgIChzdHJ1Y3QgbGVjX2FycF90YWJsZSAqKXByaXYtPmxlY19hcnBfZW1wdHlfb25lczsKKyAgICAgICAgc3RydWN0IGxlY19hcnBfdGFibGUgKmxlY19ub19mb3J3YXJkID0KKyAgICAgICAgICAgICAgICAoc3RydWN0IGxlY19hcnBfdGFibGUgKilwcml2LT5sZWNfbm9fZm9yd2FyZDsKKyAgICAgICAgc3RydWN0IGxlY19hcnBfdGFibGUgKm1jYXN0X2Z3ZHMgPSBwcml2LT5tY2FzdF9md2RzOworCisKKyAgICAgICAgcHJpbnRrKCJEdW1wICVwOlxuIixwcml2KTsKKyAgICAgICAgZm9yIChpPTA7aTxMRUNfQVJQX1RBQkxFX1NJWkU7aSsrKSB7CisgICAgICAgICAgICAgICAgcnVsbGEgPSBsZWNfYXJwX3RhYmxlc1tpXTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIG9mZnNldCArPSBzcHJpbnRmKGJ1ZiwiJWQ6ICVwXG4iLGksIHJ1bGxhKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAocnVsbGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBzcHJpbnRmKGJ1ZitvZmZzZXQsIk1hYzoiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcihqPTA7ajxFVEhfQUxFTjtqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kz1zcHJpbnRmKGJ1ZitvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTIuMnggIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGxhLT5tYWNfYWRkcltqXSYweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPXNwcmludGYoYnVmK29mZnNldCwiQXRtOiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGo9MDtqPEFUTV9FU0FfTEVOO2orKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQrPXNwcmludGYoYnVmK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMi4yeCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsbGEtPmF0bV9hZGRyW2pdJjB4ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kz1zcHJpbnRmKGJ1ZitvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZjYyB2cGk6JWQgdmNpOiVkLCBSZWN2X3ZjYyB2cGk6JWQgdmNpOiVkIExhc3RfdXNlZDolbHgsIFRpbWVzdGFtcDolbHgsIE5vX3RyaWVzOiVkICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsbGEtPnZjYz9ydWxsYS0+dmNjLT52cGk6MCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsbGEtPnZjYz9ydWxsYS0+dmNjLT52Y2k6MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxsYS0+cmVjdl92Y2M/cnVsbGEtPnJlY3ZfdmNjLT52cGk6MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxsYS0+cmVjdl92Y2M/cnVsbGEtPnJlY3ZfdmNjLT52Y2k6MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxsYS0+bGFzdF91c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGxhLT50aW1lc3RhbXAsIHJ1bGxhLT5ub190cmllcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQrPXNwcmludGYoYnVmK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmxhZ3M6JXgsIFBhY2tldHNfZmxvb2RlZDoleCwgU3RhdHVzOiAlcyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGxhLT5mbGFncywgcnVsbGEtPnBhY2tldHNfZmxvb2RlZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3N0YXR1c19zdHJpbmcocnVsbGEtPnN0YXR1cykpOworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kz1zcHJpbnRmKGJ1ZitvZmZzZXQsIi0+JXBcbiIscnVsbGEtPm5leHQpOworICAgICAgICAgICAgICAgICAgICAgICAgcnVsbGEgPSBydWxsYS0+bmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRrKCIlcyIsYnVmKTsKKyAgICAgICAgfQorICAgICAgICBydWxsYSA9IGxlY19ub19mb3J3YXJkOworICAgICAgICBpZiAocnVsbGEpCisgICAgICAgICAgICAgICAgcHJpbnRrKCJObyBmb3J3YXJkXG4iKTsgIAorICAgICAgICB3aGlsZShydWxsYSkgeworICAgICAgICAgICAgICAgIG9mZnNldD0wOworICAgICAgICAgICAgICAgIG9mZnNldCArPSBzcHJpbnRmKGJ1ZitvZmZzZXQsIk1hYzoiKTsKKyAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8RVRIX0FMRU47aisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQrPXNwcmludGYoYnVmK29mZnNldCwiJTIuMnggIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxsYS0+bWFjX2FkZHJbal0mMHhmZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9mZnNldCArPXNwcmludGYoYnVmK29mZnNldCwiQXRtOiIpOworICAgICAgICAgICAgICAgIGZvcihqPTA7ajxBVE1fRVNBX0xFTjtqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCs9c3ByaW50ZihidWYrb2Zmc2V0LCIlMi4yeCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGxhLT5hdG1fYWRkcltqXSYweGZmKTsKKyAgICAgICAgICAgICAgICB9ICAgICAgCisgICAgICAgICAgICAgICAgb2Zmc2V0Kz1zcHJpbnRmKGJ1ZitvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWY2MgdnBpOiVkIHZjaTolZCwgUmVjdl92Y2MgdnBpOiVkIHZjaTolZCBMYXN0X3VzZWQ6JWx4LCBUaW1lc3RhbXA6JWx4LCBOb190cmllczolZCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxsYS0+dmNjP3J1bGxhLT52Y2MtPnZwaTowLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsbGEtPnZjYz9ydWxsYS0+dmNjLT52Y2k6MCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGxhLT5yZWN2X3ZjYz9ydWxsYS0+cmVjdl92Y2MtPnZwaTowLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxsYS0+cmVjdl92Y2M/cnVsbGEtPnJlY3ZfdmNjLT52Y2k6MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsbGEtPmxhc3RfdXNlZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGxhLT50aW1lc3RhbXAsIHJ1bGxhLT5ub190cmllcyk7CisgICAgICAgICAgICAgICAgb2Zmc2V0Kz1zcHJpbnRmKGJ1ZitvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGbGFnczoleCwgUGFja2V0c19mbG9vZGVkOiV4LCBTdGF0dXM6ICVzICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGxhLT5mbGFncywgcnVsbGEtPnBhY2tldHNfZmxvb2RlZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9zdGF0dXNfc3RyaW5nKHJ1bGxhLT5zdGF0dXMpKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQrPXNwcmludGYoYnVmK29mZnNldCwiLT4lbHhcbiIsKGxvbmcpcnVsbGEtPm5leHQpOworICAgICAgICAgICAgICAgIHJ1bGxhID0gcnVsbGEtPm5leHQ7CisgICAgICAgICAgICAgICAgcHJpbnRrKCIlcyIsYnVmKTsKKyAgICAgICAgfQorICAgICAgICBydWxsYSA9IGxlY19hcnBfZW1wdHlfb25lczsKKyAgICAgICAgaWYgKHJ1bGxhKQorICAgICAgICAgICAgICAgIHByaW50aygiRW1wdHkgb25lc1xuIik7ICAKKyAgICAgICAgd2hpbGUocnVsbGEpIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQ9MDsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc3ByaW50ZihidWYrb2Zmc2V0LCJNYWM6Iik7CisgICAgICAgICAgICAgICAgZm9yKGo9MDtqPEVUSF9BTEVOO2orKykgeworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kz1zcHJpbnRmKGJ1ZitvZmZzZXQsIiUyLjJ4ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsbGEtPm1hY19hZGRyW2pdJjB4ZmYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvZmZzZXQgKz1zcHJpbnRmKGJ1ZitvZmZzZXQsIkF0bToiKTsKKyAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8QVRNX0VTQV9MRU47aisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQrPXNwcmludGYoYnVmK29mZnNldCwiJTIuMnggIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxsYS0+YXRtX2FkZHJbal0mMHhmZik7CisgICAgICAgICAgICAgICAgfSAgICAgIAorICAgICAgICAgICAgICAgIG9mZnNldCs9c3ByaW50ZihidWYrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmNjIHZwaTolZCB2Y2k6JWQsIFJlY3ZfdmNjIHZwaTolZCB2Y2k6JWQgTGFzdF91c2VkOiVseCwgVGltZXN0YW1wOiVseCwgTm9fdHJpZXM6JWQgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsbGEtPnZjYz9ydWxsYS0+dmNjLT52cGk6MCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGxhLT52Y2M/cnVsbGEtPnZjYy0+dmNpOjAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxsYS0+cmVjdl92Y2M/cnVsbGEtPnJlY3ZfdmNjLT52cGk6MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsbGEtPnJlY3ZfdmNjP3J1bGxhLT5yZWN2X3ZjYy0+dmNpOjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGxhLT5sYXN0X3VzZWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxsYS0+dGltZXN0YW1wLCBydWxsYS0+bm9fdHJpZXMpOworICAgICAgICAgICAgICAgIG9mZnNldCs9c3ByaW50ZihidWYrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmxhZ3M6JXgsIFBhY2tldHNfZmxvb2RlZDoleCwgU3RhdHVzOiAlcyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxsYS0+ZmxhZ3MsIHJ1bGxhLT5wYWNrZXRzX2Zsb29kZWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfc3RhdHVzX3N0cmluZyhydWxsYS0+c3RhdHVzKSk7CisgICAgICAgICAgICAgICAgb2Zmc2V0Kz1zcHJpbnRmKGJ1ZitvZmZzZXQsIi0+JWx4XG4iLChsb25nKXJ1bGxhLT5uZXh0KTsKKyAgICAgICAgICAgICAgICBydWxsYSA9IHJ1bGxhLT5uZXh0OworICAgICAgICAgICAgICAgIHByaW50aygiJXMiLGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBydWxsYSA9IG1jYXN0X2Z3ZHM7CisgICAgICAgIGlmIChydWxsYSkKKyAgICAgICAgICAgICAgICBwcmludGsoIk11bHRpY2FzdCBGb3J3YXJkIFZDQ3NcbiIpOyAgCisgICAgICAgIHdoaWxlKHJ1bGxhKSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0PTA7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNwcmludGYoYnVmK29mZnNldCwiTWFjOiIpOworICAgICAgICAgICAgICAgIGZvcihqPTA7ajxFVEhfQUxFTjtqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCs9c3ByaW50ZihidWYrb2Zmc2V0LCIlMi4yeCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGxhLT5tYWNfYWRkcltqXSYweGZmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9c3ByaW50ZihidWYrb2Zmc2V0LCJBdG06Iik7CisgICAgICAgICAgICAgICAgZm9yKGo9MDtqPEFUTV9FU0FfTEVOO2orKykgeworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kz1zcHJpbnRmKGJ1ZitvZmZzZXQsIiUyLjJ4ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsbGEtPmF0bV9hZGRyW2pdJjB4ZmYpOworICAgICAgICAgICAgICAgIH0gICAgICAKKyAgICAgICAgICAgICAgICBvZmZzZXQrPXNwcmludGYoYnVmK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZjYyB2cGk6JWQgdmNpOiVkLCBSZWN2X3ZjYyB2cGk6JWQgdmNpOiVkIExhc3RfdXNlZDolbHgsIFRpbWVzdGFtcDolbHgsIE5vX3RyaWVzOiVkICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGxhLT52Y2M/cnVsbGEtPnZjYy0+dnBpOjAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxsYS0+dmNjP3J1bGxhLT52Y2MtPnZjaTowLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsbGEtPnJlY3ZfdmNjP3J1bGxhLT5yZWN2X3ZjYy0+dnBpOjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGxhLT5yZWN2X3ZjYz9ydWxsYS0+cmVjdl92Y2MtPnZjaTowLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxsYS0+bGFzdF91c2VkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsbGEtPnRpbWVzdGFtcCwgcnVsbGEtPm5vX3RyaWVzKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQrPXNwcmludGYoYnVmK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZsYWdzOiV4LCBQYWNrZXRzX2Zsb29kZWQ6JXgsIFN0YXR1czogJXMgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsbGEtPmZsYWdzLCBydWxsYS0+cGFja2V0c19mbG9vZGVkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3N0YXR1c19zdHJpbmcocnVsbGEtPnN0YXR1cykpOworICAgICAgICAgICAgICAgIG9mZnNldCs9c3ByaW50ZihidWYrb2Zmc2V0LCItPiVseFxuIiwobG9uZylydWxsYS0+bmV4dCk7CisgICAgICAgICAgICAgICAgcnVsbGEgPSBydWxsYS0+bmV4dDsKKyAgICAgICAgICAgICAgICBwcmludGsoIiVzIixidWYpOworICAgICAgICB9CisKKyNlbmRpZgorfQorCisvKgorICogRGVzdHJ1Y3Rpb24gb2YgYXJwLWNhY2hlCisgKi8KK3N0YXRpYyB2b2lkCitsZWNfYXJwX2Rlc3Ryb3koc3RydWN0IGxlY19wcml2ICpwcml2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgIHN0cnVjdCBsZWNfYXJwX3RhYmxlICplbnRyeSwgKm5leHQ7CisgICAgICAgIGludCBpOworCisgICAgICAgIGRlbF90aW1lcl9zeW5jKCZwcml2LT5sZWNfYXJwX3RpbWVyKTsKKyAgICAgICAgCisgICAgICAgIC8qCisgICAgICAgICAqIFJlbW92ZSBhbGwgZW50cmllcworICAgICAgICAgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sZWNfYXJwX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IExFQ19BUlBfVEFCTEVfU0laRTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yKGVudHJ5ID0gcHJpdi0+bGVjX2FycF90YWJsZXNbaV07IGVudHJ5ICE9IE5VTEw7IGVudHJ5PW5leHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBlbnRyeS0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlY19hcnBfcmVtb3ZlKHByaXYsIGVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKGVudHJ5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZW50cnkgPSBwcml2LT5sZWNfYXJwX2VtcHR5X29uZXM7CisgICAgICAgIHdoaWxlKGVudHJ5KSB7CisgICAgICAgICAgICAgICAgbmV4dCA9IGVudHJ5LT5uZXh0OworICAgICAgICAgICAgICAgIGRlbF90aW1lcl9zeW5jKCZlbnRyeS0+dGltZXIpOworICAgICAgICAgICAgICAgIGxlY19hcnBfY2xlYXJfdmNjcyhlbnRyeSk7CisgICAgICAgICAgICAgICAga2ZyZWUoZW50cnkpOworICAgICAgICAgICAgICAgIGVudHJ5ID0gbmV4dDsKKyAgICAgICAgfQorICAgICAgICBwcml2LT5sZWNfYXJwX2VtcHR5X29uZXMgPSBOVUxMOworICAgICAgICBlbnRyeSA9IHByaXYtPmxlY19ub19mb3J3YXJkOworICAgICAgICB3aGlsZShlbnRyeSkgeworICAgICAgICAgICAgICAgIG5leHQgPSBlbnRyeS0+bmV4dDsKKyAgICAgICAgICAgICAgICBkZWxfdGltZXJfc3luYygmZW50cnktPnRpbWVyKTsKKyAgICAgICAgICAgICAgICBsZWNfYXJwX2NsZWFyX3ZjY3MoZW50cnkpOworICAgICAgICAgICAgICAgIGtmcmVlKGVudHJ5KTsKKyAgICAgICAgICAgICAgICBlbnRyeSA9IG5leHQ7CisgICAgICAgIH0KKyAgICAgICAgcHJpdi0+bGVjX25vX2ZvcndhcmQgPSBOVUxMOworICAgICAgICBlbnRyeSA9IHByaXYtPm1jYXN0X2Z3ZHM7CisgICAgICAgIHdoaWxlKGVudHJ5KSB7CisgICAgICAgICAgICAgICAgbmV4dCA9IGVudHJ5LT5uZXh0OworICAgICAgICAgICAgICAgIC8qIE5vIHRpbWVyLCBMQU5FdjIgNy4xLjIwIGFuZCAyLjMuNS4zICovCisgICAgICAgICAgICAgICAgbGVjX2FycF9jbGVhcl92Y2NzKGVudHJ5KTsKKyAgICAgICAgICAgICAgICBrZnJlZShlbnRyeSk7CisgICAgICAgICAgICAgICAgZW50cnkgPSBuZXh0OworICAgICAgICB9CisgICAgICAgIHByaXYtPm1jYXN0X2Z3ZHMgPSBOVUxMOworICAgICAgICBwcml2LT5tY2FzdF92Y2MgPSBOVUxMOworICAgICAgICBtZW1zZXQocHJpdi0+bGVjX2FycF90YWJsZXMsIDAsIAorICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBsZWNfYXJwX3RhYmxlICopICogTEVDX0FSUF9UQUJMRV9TSVpFKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sZWNfYXJwX2xvY2ssIGZsYWdzKTsKK30KKworCisvKiAKKyAqIEZpbmQgZW50cnkgYnkgbWFjX2FkZHJlc3MKKyAqLworc3RhdGljIHN0cnVjdCBsZWNfYXJwX3RhYmxlKgorbGVjX2FycF9maW5kKHN0cnVjdCBsZWNfcHJpdiAqcHJpdiwKKyAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICptYWNfYWRkcikKK3sKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgcGxhY2U7CisgICAgICAgIHN0cnVjdCBsZWNfYXJwX3RhYmxlICp0b19yZXR1cm47CisKKyAgICAgICAgRFBSSU5USygiTEVDX0FSUDogbGVjX2FycF9maW5kIDolMi4yeCAlMi4yeCAlMi4yeCAlMi4yeCAlMi4yeCAlMi4yeFxuIiwKKyAgICAgICAgICAgICAgICBtYWNfYWRkclswXSYweGZmLCBtYWNfYWRkclsxXSYweGZmLCBtYWNfYWRkclsyXSYweGZmLCAKKyAgICAgICAgICAgICAgICBtYWNfYWRkclszXSYweGZmLCBtYWNfYWRkcls0XSYweGZmLCBtYWNfYWRkcls1XSYweGZmKTsKKyAgICAgICAgcGxhY2UgPSBIQVNIKG1hY19hZGRyW0VUSF9BTEVOLTFdKTsKKyAgCisgICAgICAgIHRvX3JldHVybiA9IHByaXYtPmxlY19hcnBfdGFibGVzW3BsYWNlXTsKKyAgICAgICAgd2hpbGUodG9fcmV0dXJuKSB7CisgICAgICAgICAgICAgICAgaWYgKG1lbWNtcChtYWNfYWRkciwgdG9fcmV0dXJuLT5tYWNfYWRkciwgRVRIX0FMRU4pID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b19yZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRvX3JldHVybiA9IHRvX3JldHVybi0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBsZWNfYXJwX3RhYmxlKgorbWFrZV9lbnRyeShzdHJ1Y3QgbGVjX3ByaXYgKnByaXYsIHVuc2lnbmVkIGNoYXIgKm1hY19hZGRyKQoreworICAgICAgICBzdHJ1Y3QgbGVjX2FycF90YWJsZSAqdG9fcmV0dXJuOworCisgICAgICAgIHRvX3JldHVybiA9IChzdHJ1Y3QgbGVjX2FycF90YWJsZSAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbGVjX2FycF90YWJsZSksCisJCQkJCQkgICAgIEdGUF9BVE9NSUMpOworICAgICAgICBpZiAoIXRvX3JldHVybikgeworICAgICAgICAgICAgICAgIHByaW50aygiTEVDOiBBcnAgZW50cnkga21hbGxvYyBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIG1lbXNldCh0b19yZXR1cm4sIDAsIHNpemVvZihzdHJ1Y3QgbGVjX2FycF90YWJsZSkpOworICAgICAgICBtZW1jcHkodG9fcmV0dXJuLT5tYWNfYWRkciwgbWFjX2FkZHIsIEVUSF9BTEVOKTsKKyAgICAgICAgaW5pdF90aW1lcigmdG9fcmV0dXJuLT50aW1lcik7CisgICAgICAgIHRvX3JldHVybi0+dGltZXIuZnVuY3Rpb24gPSBsZWNfYXJwX2V4cGlyZV9hcnA7CisgICAgICAgIHRvX3JldHVybi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB0b19yZXR1cm47CisgICAgICAgIHRvX3JldHVybi0+bGFzdF91c2VkID0gamlmZmllczsKKyAgICAgICAgdG9fcmV0dXJuLT5wcml2ID0gcHJpdjsKKyAgICAgICAgc2tiX3F1ZXVlX2hlYWRfaW5pdCgmdG9fcmV0dXJuLT50eF93YWl0KTsKKyAgICAgICAgcmV0dXJuIHRvX3JldHVybjsKK30KKworLyoKKyAqCisgKiBBcnAgc2VudCB0aW1lciBleHBpcmVkCisgKgorICovCitzdGF0aWMgdm9pZAorbGVjX2FycF9leHBpcmVfYXJwKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKyAgICAgICAgc3RydWN0IGxlY19hcnBfdGFibGUgKmVudHJ5OworCisgICAgICAgIGVudHJ5ID0gKHN0cnVjdCBsZWNfYXJwX3RhYmxlICopZGF0YTsKKworICAgICAgICBEUFJJTlRLKCJsZWNfYXJwX2V4cGlyZV9hcnBcbiIpOworICAgICAgICBpZiAoZW50cnktPnN0YXR1cyA9PSBFU0lfQVJQX1BFTkRJTkcpIHsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnktPm5vX3RyaWVzIDw9IGVudHJ5LT5wcml2LT5tYXhfcmV0cnlfY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS0+aXNfcmRlc2MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfdG9fbGVjZChlbnRyeS0+cHJpdiwgbF9yZGVzY19hcnBfeG10LCBlbnRyeS0+bWFjX2FkZHIsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX3RvX2xlY2QoZW50cnktPnByaXYsIGxfYXJwX3htdCwgZW50cnktPm1hY19hZGRyLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5ub190cmllcysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtb2RfdGltZXIoJmVudHJ5LT50aW1lciwgamlmZmllcyArICgxKkhaKSk7CisgICAgICAgIH0KK30KKworLyoKKyAqCisgKiBVbmtub3duL3VudXNlZCB2Y2MgZXhwaXJlLCByZW1vdmUgYXNzb2NpYXRlZCBlbnRyeQorICoKKyAqLworc3RhdGljIHZvaWQKK2xlY19hcnBfZXhwaXJlX3ZjYyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgc3RydWN0IGxlY19hcnBfdGFibGUgKnRvX3JlbW92ZSA9IChzdHJ1Y3QgbGVjX2FycF90YWJsZSopZGF0YTsKKyAgICAgICAgc3RydWN0IGxlY19wcml2ICpwcml2ID0gKHN0cnVjdCBsZWNfcHJpdiAqKXRvX3JlbW92ZS0+cHJpdjsKKyAgICAgICAgc3RydWN0IGxlY19hcnBfdGFibGUgKmVudHJ5ID0gTlVMTDsKKworICAgICAgICBkZWxfdGltZXIoJnRvX3JlbW92ZS0+dGltZXIpOworCisgICAgICAgIERQUklOVEsoIkxFQ19BUlAgJXAgJXA6IGxlY19hcnBfZXhwaXJlX3ZjYyB2cGk6JWQgdmNpOiVkXG4iLAorICAgICAgICAgICAgICAgIHRvX3JlbW92ZSwgcHJpdiwgCisgICAgICAgICAgICAgICAgdG9fcmVtb3ZlLT52Y2M/dG9fcmVtb3ZlLT5yZWN2X3ZjYy0+dnBpOjAsCisgICAgICAgICAgICAgICAgdG9fcmVtb3ZlLT52Y2M/dG9fcmVtb3ZlLT5yZWN2X3ZjYy0+dmNpOjApOworICAgICAgICBEUFJJTlRLKCJlbzolcCBuZjolcFxuIixwcml2LT5sZWNfYXJwX2VtcHR5X29uZXMscHJpdi0+bGVjX25vX2ZvcndhcmQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxlY19hcnBfbG9jaywgZmxhZ3MpOworICAgICAgICBpZiAodG9fcmVtb3ZlID09IHByaXYtPmxlY19hcnBfZW1wdHlfb25lcykKKyAgICAgICAgICAgICAgICBwcml2LT5sZWNfYXJwX2VtcHR5X29uZXMgPSB0b19yZW1vdmUtPm5leHQ7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGVudHJ5ID0gcHJpdi0+bGVjX2FycF9lbXB0eV9vbmVzOworICAgICAgICAgICAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS0+bmV4dCAhPSB0b19yZW1vdmUpCisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IGVudHJ5LT5uZXh0OworICAgICAgICAgICAgICAgIGlmIChlbnRyeSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5uZXh0ID0gdG9fcmVtb3ZlLT5uZXh0OworICAgICAgICB9CisgICAgICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgICAgICAgICBpZiAodG9fcmVtb3ZlID09IHByaXYtPmxlY19ub19mb3J3YXJkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5sZWNfbm9fZm9yd2FyZCA9IHRvX3JlbW92ZS0+bmV4dDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBwcml2LT5sZWNfbm9fZm9yd2FyZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS0+bmV4dCAhPSB0b19yZW1vdmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gZW50cnktPm5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5uZXh0ID0gdG9fcmVtb3ZlLT5uZXh0OworICAgICAgICAgICAgICAgIH0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bGVjX2FycF9sb2NrLCBmbGFncyk7CisKKyAgICAgICAgbGVjX2FycF9jbGVhcl92Y2NzKHRvX3JlbW92ZSk7CisgICAgICAgIGtmcmVlKHRvX3JlbW92ZSk7Cit9CisKKy8qCisgKiBFeHBpcmUgZW50cmllcy4KKyAqIDEuIFJlLXNldCB0aW1lcgorICogMi4gRm9yIGVhY2ggZW50cnksIGRlbGV0ZSBlbnRyaWVzIHRoYXQgaGF2ZSBhZ2VkIHBhc3QgdGhlIGFnZSBsaW1pdC4KKyAqIDMuIEZvciBlYWNoIGVudHJ5LCBkZXBlbmRpbmcgb24gdGhlIHN0YXR1cyBvZiB0aGUgZW50cnksIHBlcmZvcm0KKyAqICAgIHRoZSBmb2xsb3dpbmcgbWFpbnRlbmFuY2UuCisgKiAgICBhLiBJZiBzdGF0dXMgaXMgRVNJX1ZDX1BFTkRJTkcgb3IgRVNJX0FSUF9QRU5ESU5HIHRoZW4gaWYgdGhlCisgKiAgICAgICB0aWNrX2NvdW50IGlzIGFib3ZlIHRoZSBtYXhfdW5rbm93bl9mcmFtZV90aW1lLCBjbGVhcgorICogICAgICAgdGhlIHRpY2tfY291bnQgdG8gemVybyBhbmQgY2xlYXIgdGhlIHBhY2tldHNfZmxvb2RlZCBjb3VudGVyCisgKiAgICAgICB0byB6ZXJvLiBUaGlzIHN1cHBvcnRzIHRoZSBwYWNrZXQgcmF0ZSBsaW1pdCBwZXIgYWRkcmVzcworICogICAgICAgd2hpbGUgZmxvb2RpbmcgdW5rbm93bnMuCisgKiAgICBiLiBJZiB0aGUgc3RhdHVzIGlzIEVTSV9GTFVTSF9QRU5ESU5HIGFuZCB0aGUgdGlja19jb3VudCBpcyBncmVhdGVyCisgKiAgICAgICB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwYXRoX3N3aXRjaGluZ19kZWxheSwgY2hhbmdlIHRoZSBzdGF0dXMKKyAqICAgICAgIHRvIEVTSV9GT1JXQVJEX0RJUkVDVC4gVGhpcyBjYXVzZXMgdGhlIGZsdXNoIHBlcmlvZCB0byBlbmQKKyAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgdGhlIHByb2dyZXNzIG9mIHRoZSBmbHVzaCBwcm90b2NvbC4KKyAqLworc3RhdGljIHZvaWQKK2xlY19hcnBfY2hlY2tfZXhwaXJlKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICBzdHJ1Y3QgbGVjX3ByaXYgKnByaXYgPSAoc3RydWN0IGxlY19wcml2ICopZGF0YTsKKyAgICAgICAgc3RydWN0IGxlY19hcnBfdGFibGUgKmVudHJ5LCAqbmV4dDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBub3c7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgdGltZV90b19jaGVjazsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgRFBSSU5USygibGVjX2FycF9jaGVja19leHBpcmUgJXBcbiIscHJpdik7CisgICAgICAgIERQUklOVEsoImV4cGlyZTogZW86JXAgbmY6JXBcbiIscHJpdi0+bGVjX2FycF9lbXB0eV9vbmVzLAorICAgICAgICAgICAgICAgIHByaXYtPmxlY19ub19mb3J3YXJkKTsKKwlub3cgPSBqaWZmaWVzOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sZWNfYXJwX2xvY2ssIGZsYWdzKTsKKwlmb3IoaSA9IDA7IGkgPCBMRUNfQVJQX1RBQkxFX1NJWkU7IGkrKykgeworCQlmb3IoZW50cnkgPSBwcml2LT5sZWNfYXJwX3RhYmxlc1tpXTsgZW50cnkgIT0gTlVMTDsgKSB7CisJCQlpZiAoKGVudHJ5LT5mbGFncykgJiBMRUNfUkVNT1RFX0ZMQUcgJiYgCisJCQkgICAgcHJpdi0+dG9wb2xvZ3lfY2hhbmdlKQorCQkJCXRpbWVfdG9fY2hlY2sgPSBwcml2LT5mb3J3YXJkX2RlbGF5X3RpbWU7CisJCQllbHNlCisJCQkJdGltZV90b19jaGVjayA9IHByaXYtPmFnaW5nX3RpbWU7CisKKwkJCURQUklOVEsoIkFib3V0IHRvIGV4cGlyZTogJWx4IC0gJWx4ID4gJWx4XG4iLAorCQkJCW5vdyxlbnRyeS0+bGFzdF91c2VkLCB0aW1lX3RvX2NoZWNrKTsKKwkJCWlmKCB0aW1lX2FmdGVyKG5vdywgZW50cnktPmxhc3RfdXNlZCsKKwkJCSAgIHRpbWVfdG9fY2hlY2spICYmIAorCQkJICAgICEoZW50cnktPmZsYWdzICYgTEVDX1BFUk1BTkVOVF9GTEFHKSAmJgorCQkJICAgICEoZW50cnktPm1hY19hZGRyWzBdICYgMHgwMSkgKSB7IC8qIExBTkUyOiA3LjEuMjAgKi8KKwkJCQkvKiBSZW1vdmUgZW50cnkgKi8KKwkJCQlEUFJJTlRLKCJMRUM6RW50cnkgdGltZWQgb3V0XG4iKTsKKwkJCQluZXh0ID0gZW50cnktPm5leHQ7ICAgICAgCisJCQkJbGVjX2FycF9yZW1vdmUocHJpdiwgZW50cnkpOworCQkJCWtmcmVlKGVudHJ5KTsKKwkJCQllbnRyeSA9IG5leHQ7CisJCQl9IGVsc2UgeworCQkJCS8qIFNvbWV0aGluZyBlbHNlICovCisJCQkJaWYgKChlbnRyeS0+c3RhdHVzID09IEVTSV9WQ19QRU5ESU5HIHx8CisJCQkJICAgICBlbnRyeS0+c3RhdHVzID09IEVTSV9BUlBfUEVORElORykgCisJCQkJICAgICYmIHRpbWVfYWZ0ZXJfZXEobm93LAorCQkJCSAgICBlbnRyeS0+dGltZXN0YW1wICsKKwkJCQkgICAgcHJpdi0+bWF4X3Vua25vd25fZnJhbWVfdGltZSkpIHsKKwkJCQkJZW50cnktPnRpbWVzdGFtcCA9IGppZmZpZXM7CisJCQkJCWVudHJ5LT5wYWNrZXRzX2Zsb29kZWQgPSAwOworCQkJCQlpZiAoZW50cnktPnN0YXR1cyA9PSBFU0lfVkNfUEVORElORykKKwkJCQkJCXNlbmRfdG9fbGVjZChwcml2LCBsX3N2Y19zZXR1cCwgZW50cnktPm1hY19hZGRyLCBlbnRyeS0+YXRtX2FkZHIsIE5VTEwpOworCQkJCX0KKwkJCQlpZiAoZW50cnktPnN0YXR1cyA9PSBFU0lfRkxVU0hfUEVORElORyAKKwkJCQkgICAmJgorCQkJCSAgIHRpbWVfYWZ0ZXJfZXEobm93LCBlbnRyeS0+dGltZXN0YW1wKworCQkJCSAgIHByaXYtPnBhdGhfc3dpdGNoaW5nX2RlbGF5KSkgeworCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQkJCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmVudHJ5LT50eF93YWl0KSkgIT0gTlVMTCkKKwkJCQkJCWxlY19zZW5kKGVudHJ5LT52Y2MsIHNrYiwgZW50cnktPnByaXYpOworCQkJCQllbnRyeS0+bGFzdF91c2VkID0gamlmZmllczsKKwkJCQkJZW50cnktPnN0YXR1cyA9IAorCQkJCQkJRVNJX0ZPUldBUkRfRElSRUNUOworCQkJCX0KKwkJCQllbnRyeSA9IGVudHJ5LT5uZXh0OworCQkJfQorCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxlY19hcnBfbG9jaywgZmxhZ3MpOworCisgICAgICAgIG1vZF90aW1lcigmcHJpdi0+bGVjX2FycF90aW1lciwgamlmZmllcyArIExFQ19BUlBfUkVGUkVTSF9JTlRFUlZBTCk7Cit9CisvKgorICogVHJ5IHRvIGZpbmQgdmNjIHdoZXJlIG1hY19hZGRyZXNzIGlzIGF0dGFjaGVkLgorICogCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXRtX3ZjYyoKK2xlY19hcnBfcmVzb2x2ZShzdHJ1Y3QgbGVjX3ByaXYgKnByaXYsIHVuc2lnbmVkIGNoYXIgKm1hY190b19maW5kLAorCQlpbnQgaXNfcmRlc2MsIHN0cnVjdCBsZWNfYXJwX3RhYmxlICoqcmV0X2VudHJ5KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgIHN0cnVjdCBsZWNfYXJwX3RhYmxlICplbnRyeTsKKwlzdHJ1Y3QgYXRtX3ZjYyAqZm91bmQ7CisKKyAgICAgICAgaWYgKG1hY190b19maW5kWzBdICYgMHgwMSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAocHJpdi0+bGFuZV92ZXJzaW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByaXYtPm1jYXN0X3ZjYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjogIC8qIExBTkUyIHdhbnRzIGFycCBmb3IgbXVsdGljYXN0IGFkZHJlc3NlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBtZW1jbXAobWFjX3RvX2ZpbmQsIGJ1c19tYWMsIEVUSF9BTEVOKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJpdi0+bWNhc3RfdmNjOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxlY19hcnBfbG9jaywgZmxhZ3MpOworICAgICAgICBlbnRyeSA9IGxlY19hcnBfZmluZChwcml2LCBtYWNfdG9fZmluZCk7CisgIAorICAgICAgICBpZiAoZW50cnkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnktPnN0YXR1cyA9PSBFU0lfRk9SV0FSRF9ESVJFQ1QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbm5lY3Rpb24gT2sgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5sYXN0X3VzZWQgPSBqaWZmaWVzOworICAgICAgICAgICAgICAgICAgICAgICAgKnJldF9lbnRyeSA9IGVudHJ5OworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBlbnRyeS0+dmNjOworCQkJZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIERhdGEgZGlyZWN0IFZDIG5vdCB5ZXQgc2V0IHVwLCBjaGVjayB0byBzZWUgaWYgdGhlIHVua25vd24KKyAgICAgICAgICAgICAgICAgICBmcmFtZSBjb3VudCBpcyBncmVhdGVyIHRoYW4gdGhlIGxpbWl0LiBJZiB0aGUgbGltaXQgaGFzCisgICAgICAgICAgICAgICAgICAgbm90IGJlZW4gcmVhY2hlZCwgYWxsb3cgdGhlIGNhbGxlciB0byBzZW5kIHBhY2tldCB0bworICAgICAgICAgICAgICAgICAgIEJVUy4gKi8KKyAgICAgICAgICAgICAgICBpZiAoZW50cnktPnN0YXR1cyAhPSBFU0lfRkxVU0hfUEVORElORyAmJgorICAgICAgICAgICAgICAgICAgICBlbnRyeS0+cGFja2V0c19mbG9vZGVkPHByaXYtPm1heGltdW1fdW5rbm93bl9mcmFtZV9jb3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPnBhY2tldHNfZmxvb2RlZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgRFBSSU5USygiTEVDX0FSUDogRmxvb2RpbmcuLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHByaXYtPm1jYXN0X3ZjYzsKKwkJCWdvdG8gb3V0OworICAgICAgICAgICAgICAgIH0KKwkJLyogV2UgZ290IGhlcmUgYmVjYXVzZSBlbnRyeS0+c3RhdHVzID09IEVTSV9GTFVTSF9QRU5ESU5HCisJCSAqIG9yIEJVUyBmbG9vZCBsaW1pdCB3YXMgcmVhY2hlZCBmb3IgYW4gZW50cnkgd2hpY2ggaXMKKwkJICogaW4gRVNJX0FSUF9QRU5ESU5HIG9yIEVTSV9WQ19QRU5ESU5HIHN0YXRlLgorCQkgKi8KKyAgICAgICAgICAgICAgICAqcmV0X2VudHJ5ID0gZW50cnk7CisgICAgICAgICAgICAgICAgRFBSSU5USygibGVjOiBlbnRyeS0+c3RhdHVzICVkIGVudHJ5LT52Y2MgJXBcbiIsIGVudHJ5LT5zdGF0dXMsIGVudHJ5LT52Y2MpOworICAgICAgICAgICAgICAgIGZvdW5kID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBObyBtYXRjaGluZyBlbnRyeSB3YXMgZm91bmQgKi8KKyAgICAgICAgICAgICAgICBlbnRyeSA9IG1ha2VfZW50cnkocHJpdiwgbWFjX3RvX2ZpbmQpOworICAgICAgICAgICAgICAgIERQUklOVEsoIkxFQ19BUlA6IE1ha2luZyBlbnRyeVxuIik7CisgICAgICAgICAgICAgICAgaWYgKCFlbnRyeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBwcml2LT5tY2FzdF92Y2M7CisJCQlnb3RvIG91dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGVjX2FycF9hZGQocHJpdiwgZW50cnkpOworICAgICAgICAgICAgICAgIC8qIFdlIHdhbnQgYXJwLXJlcXVlc3QocykgdG8gYmUgc2VudCAqLworICAgICAgICAgICAgICAgIGVudHJ5LT5wYWNrZXRzX2Zsb29kZWQgPTE7CisgICAgICAgICAgICAgICAgZW50cnktPnN0YXR1cyA9IEVTSV9BUlBfUEVORElORzsKKyAgICAgICAgICAgICAgICBlbnRyeS0+bm9fdHJpZXMgPSAxOworICAgICAgICAgICAgICAgIGVudHJ5LT5sYXN0X3VzZWQgPSBlbnRyeS0+dGltZXN0YW1wID0gamlmZmllczsKKyAgICAgICAgICAgICAgICBlbnRyeS0+aXNfcmRlc2MgPSBpc19yZGVzYzsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnktPmlzX3JkZXNjKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF90b19sZWNkKHByaXYsIGxfcmRlc2NfYXJwX3htdCwgbWFjX3RvX2ZpbmQsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfdG9fbGVjZChwcml2LCBsX2FycF94bXQsIG1hY190b19maW5kLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBlbnRyeS0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoMSpIWik7CisgICAgICAgICAgICAgICAgZW50cnktPnRpbWVyLmZ1bmN0aW9uID0gbGVjX2FycF9leHBpcmVfYXJwOworICAgICAgICAgICAgICAgIGFkZF90aW1lcigmZW50cnktPnRpbWVyKTsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHByaXYtPm1jYXN0X3ZjYzsKKyAgICAgICAgfQorCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bGVjX2FycF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgaW50CitsZWNfYWRkcl9kZWxldGUoc3RydWN0IGxlY19wcml2ICpwcml2LCB1bnNpZ25lZCBjaGFyICphdG1fYWRkciwgCisgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBwZXJtYW5lbnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgc3RydWN0IGxlY19hcnBfdGFibGUgKmVudHJ5LCAqbmV4dDsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgRFBSSU5USygibGVjX2FkZHJfZGVsZXRlXG4iKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bGVjX2FycF9sb2NrLCBmbGFncyk7CisgICAgICAgIGZvcihpID0gMDsgaSA8IExFQ19BUlBfVEFCTEVfU0laRTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yKGVudHJ5ID0gcHJpdi0+bGVjX2FycF90YWJsZXNbaV07IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gbmV4dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGVudHJ5LT5uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtZW1jbXAoYXRtX2FkZHIsIGVudHJ5LT5hdG1fYWRkciwgQVRNX0VTQV9MRU4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBlcm1hbmVudCB8fCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShlbnRyeS0+ZmxhZ3MgJiBMRUNfUEVSTUFORU5UX0ZMQUcpKSkgeworCQkJCWxlY19hcnBfcmVtb3ZlKHByaXYsIGVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2ZyZWUoZW50cnkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bGVjX2FycF9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sZWNfYXJwX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgcmV0dXJuIC0xOworfQorCisvKgorICogTm90aWZpZXM6ICBSZXNwb25zZSB0byBhcnBfcmVxdWVzdCAoYXRtX2FkZHIgIT0gTlVMTCkgCisgKi8KK3N0YXRpYyB2b2lkCitsZWNfYXJwX3VwZGF0ZShzdHJ1Y3QgbGVjX3ByaXYgKnByaXYsIHVuc2lnbmVkIGNoYXIgKm1hY19hZGRyLAorICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYXRtX2FkZHIsIHVuc2lnbmVkIGxvbmcgcmVtb3RlZmxhZywKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0YXJnZXRsZXNzX2xlX2FycCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICBzdHJ1Y3QgbGVjX2FycF90YWJsZSAqZW50cnksICp0bXA7CisgICAgICAgIGludCBpOworCisgICAgICAgIERQUklOVEsoImxlYzolcyIsICh0YXJnZXRsZXNzX2xlX2FycCkgPyAidGFyZ2V0bGVzcyAiOiAiICIpOworICAgICAgICBEUFJJTlRLKCJsZWNfYXJwX3VwZGF0ZSBtYWM6JTIuMnglMi4yeCUyLjJ4JTIuMnglMi4yeCUyLjJ4XG4iLAorICAgICAgICAgICAgICAgIG1hY19hZGRyWzBdLG1hY19hZGRyWzFdLG1hY19hZGRyWzJdLG1hY19hZGRyWzNdLAorICAgICAgICAgICAgICAgIG1hY19hZGRyWzRdLG1hY19hZGRyWzVdKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sZWNfYXJwX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgZW50cnkgPSBsZWNfYXJwX2ZpbmQocHJpdiwgbWFjX2FkZHIpOworICAgICAgICBpZiAoZW50cnkgPT0gTlVMTCAmJiB0YXJnZXRsZXNzX2xlX2FycCkKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsgICAvKiBMQU5FMjogaWdub3JlIHRhcmdldGxlc3MgTEVfQVJQcyBmb3Igd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3ZSBoYXZlIG5vIGVudHJ5IGluIHRoZSBjYWNoZS4gNy4xLjMwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGlmIChwcml2LT5sZWNfYXJwX2VtcHR5X29uZXMpIHsKKyAgICAgICAgICAgICAgICBlbnRyeSA9IHByaXYtPmxlY19hcnBfZW1wdHlfb25lczsKKyAgICAgICAgICAgICAgICBpZiAoIW1lbWNtcChlbnRyeS0+YXRtX2FkZHIsIGF0bV9hZGRyLCBBVE1fRVNBX0xFTikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPmxlY19hcnBfZW1wdHlfb25lcyA9IGVudHJ5LT5uZXh0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZShlbnRyeS0+bmV4dCAmJiBtZW1jbXAoZW50cnktPm5leHQtPmF0bV9hZGRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdG1fYWRkciwgQVRNX0VTQV9MRU4pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IGVudHJ5LT5uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LT5uZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGVudHJ5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IGVudHJ5LT5uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAtPm5leHQgPSBlbnRyeS0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxfdGltZXIoJmVudHJ5LT50aW1lcik7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBsZWNfYXJwX2ZpbmQocHJpdiwgbWFjX2FkZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxfdGltZXIoJnRtcC0+dGltZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAtPnN0YXR1cyA9IEVTSV9GT1JXQVJEX0RJUkVDVDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHRtcC0+YXRtX2FkZHIsIGF0bV9hZGRyLCBBVE1fRVNBX0xFTik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcC0+dmNjID0gZW50cnktPnZjYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wLT5vbGRfcHVzaCA9IGVudHJ5LT5vbGRfcHVzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wLT5sYXN0X3VzZWQgPSBqaWZmaWVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxfdGltZXIoJmVudHJ5LT50aW1lcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKGVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnk9dG1wOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPnN0YXR1cyA9IEVTSV9GT1JXQVJEX0RJUkVDVDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGVudHJ5LT5tYWNfYWRkciwgbWFjX2FkZHIsIEVUSF9BTEVOKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPmxhc3RfdXNlZCA9IGppZmZpZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlY19hcnBfYWRkKHByaXYsIGVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdGVmbGFnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+ZmxhZ3N8PUxFQ19SRU1PVEVfRkxBRzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPmZsYWdzJj1+TEVDX1JFTU9URV9GTEFHOworICAgICAgICAgICAgICAgICAgICAgICAgRFBSSU5USygiQWZ0ZXIgdXBkYXRlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBfYXJwX3RhYmxlKHByaXYpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVudHJ5ID0gbGVjX2FycF9maW5kKHByaXYsIG1hY19hZGRyKTsKKyAgICAgICAgaWYgKCFlbnRyeSkgeworICAgICAgICAgICAgICAgIGVudHJ5ID0gbWFrZV9lbnRyeShwcml2LCBtYWNfYWRkcik7CisgICAgICAgICAgICAgICAgaWYgKCFlbnRyeSkKKwkJCWdvdG8gb3V0OworICAgICAgICAgICAgICAgIGVudHJ5LT5zdGF0dXMgPSBFU0lfVU5LTk9XTjsKKyAgICAgICAgICAgICAgICBsZWNfYXJwX2FkZChwcml2LCBlbnRyeSk7CisgICAgICAgICAgICAgICAgLyogVGVtcG9yYXJ5LCBjaGFuZ2VzIGJlZm9yZSBlbmQgb2YgZnVuY3Rpb24gKi8KKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoZW50cnktPmF0bV9hZGRyLCBhdG1fYWRkciwgQVRNX0VTQV9MRU4pOworICAgICAgICBkZWxfdGltZXIoJmVudHJ5LT50aW1lcik7CisgICAgICAgIGZvcihpID0gMDsgaSA8IExFQ19BUlBfVEFCTEVfU0laRTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yKHRtcCA9IHByaXYtPmxlY19hcnBfdGFibGVzW2ldOyB0bXA7IHRtcD10bXAtPm5leHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSAhPSB0bXAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbWVtY21wKHRtcC0+YXRtX2FkZHIsIGF0bV9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRNX0VTQV9MRU4pKSB7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWY2MgdG8gdGhpcyBob3N0IGV4aXN0cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wLT5zdGF0dXMgPiBFU0lfVkNfUEVORElORykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogRVNJX0ZMVVNIX1BFTkRJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogRVNJX0ZPUldBUkRfRElSRUNUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPnZjYyA9IHRtcC0+dmNjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5vbGRfcHVzaD10bXAtPm9sZF9wdXNoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5zdGF0dXM9dG1wLT5zdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocmVtb3RlZmxhZykKKyAgICAgICAgICAgICAgICBlbnRyeS0+ZmxhZ3N8PUxFQ19SRU1PVEVfRkxBRzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVudHJ5LT5mbGFncyY9fkxFQ19SRU1PVEVfRkxBRzsKKyAgICAgICAgaWYgKGVudHJ5LT5zdGF0dXMgPT0gRVNJX0FSUF9QRU5ESU5HIHx8CisgICAgICAgICAgICBlbnRyeS0+c3RhdHVzID09IEVTSV9VTktOT1dOKSB7CisgICAgICAgICAgICAgICAgZW50cnktPnN0YXR1cyA9IEVTSV9WQ19QRU5ESU5HOworICAgICAgICAgICAgICAgIHNlbmRfdG9fbGVjZChwcml2LCBsX3N2Y19zZXR1cCwgZW50cnktPm1hY19hZGRyLCBhdG1fYWRkciwgTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgRFBSSU5USygiQWZ0ZXIgdXBkYXRlMlxuIik7CisgICAgICAgIGR1bXBfYXJwX3RhYmxlKHByaXYpOworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxlY19hcnBfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogTm90aWZpZXM6IFZjYyBzZXR1cCByZWFkeSAKKyAqLworc3RhdGljIHZvaWQKK2xlY192Y2NfYWRkZWQoc3RydWN0IGxlY19wcml2ICpwcml2LCBzdHJ1Y3QgYXRtbGVjX2lvYyAqaW9jX2RhdGEsCisgICAgICAgICAgICAgIHN0cnVjdCBhdG1fdmNjICp2Y2MsCisgICAgICAgICAgICAgIHZvaWQgKCpvbGRfcHVzaCkoc3RydWN0IGF0bV92Y2MgKnZjYywgc3RydWN0IHNrX2J1ZmYgKnNrYikpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgc3RydWN0IGxlY19hcnBfdGFibGUgKmVudHJ5OworICAgICAgICBpbnQgaSwgZm91bmRfZW50cnk9MDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sZWNfYXJwX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgaWYgKGlvY19kYXRhLT5yZWNlaXZlID09IDIpIHsKKyAgICAgICAgICAgICAgICAvKiBWY2MgZm9yIE11bHRpY2FzdCBGb3J3YXJkLiBObyB0aW1lciwgTEFORXYyIDcuMS4yMCBhbmQgMi4zLjUuMyAqLworCisgICAgICAgICAgICAgICAgRFBSSU5USygiTEVDX0FSUDogQXR0YWNoaW5nIG1jYXN0IGZvcndhcmRcbiIpOworI2lmIDAKKyAgICAgICAgICAgICAgICBlbnRyeSA9IGxlY19hcnBfZmluZChwcml2LCBidXNfbWFjKTsKKyAgICAgICAgICAgICAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIkxFQ19BUlA6IE11bHRpY2FzdCBlbnRyeSBub3QgZm91bmQhXG4iKTsKKwkJCWdvdG8gb3V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1jcHkoZW50cnktPmF0bV9hZGRyLCBpb2NfZGF0YS0+YXRtX2FkZHIsIEFUTV9FU0FfTEVOKTsKKyAgICAgICAgICAgICAgICBlbnRyeS0+cmVjdl92Y2MgPSB2Y2M7CisgICAgICAgICAgICAgICAgZW50cnktPm9sZF9yZWN2X3B1c2ggPSBvbGRfcHVzaDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGVudHJ5ID0gbWFrZV9lbnRyeShwcml2LCBidXNfbWFjKTsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworICAgICAgICAgICAgICAgIGRlbF90aW1lcigmZW50cnktPnRpbWVyKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZW50cnktPmF0bV9hZGRyLCBpb2NfZGF0YS0+YXRtX2FkZHIsIEFUTV9FU0FfTEVOKTsKKyAgICAgICAgICAgICAgICBlbnRyeS0+cmVjdl92Y2MgPSB2Y2M7CisgICAgICAgICAgICAgICAgZW50cnktPm9sZF9yZWN2X3B1c2ggPSBvbGRfcHVzaDsKKyAgICAgICAgICAgICAgICBlbnRyeS0+bmV4dCA9IHByaXYtPm1jYXN0X2Z3ZHM7CisgICAgICAgICAgICAgICAgcHJpdi0+bWNhc3RfZndkcyA9IGVudHJ5OworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9IGVsc2UgaWYgKGlvY19kYXRhLT5yZWNlaXZlID09IDEpIHsKKyAgICAgICAgICAgICAgICAvKiBWY2Mgd2hpY2ggd2UgZG9uJ3Qgd2FudCB0byBtYWtlIGRlZmF1bHQgdmNjLCBhdHRhY2ggaXQKKyAgICAgICAgICAgICAgICAgICBhbnl3YXkuICovCisgICAgICAgICAgICAgICAgRFBSSU5USygiTEVDX0FSUDpBdHRhY2hpbmcgZGF0YSBkaXJlY3QsIG5vdCBkZWZhdWx0IDolMi4yeCUyLjJ4JTIuMnglMi4yeCUyLjJ4JTIuMnglMi4yeCUyLjJ4JTIuMnglMi4yeCUyLjJ4JTIuMnglMi4yeCUyLjJ4JTIuMnglMi4yeCUyLjJ4JTIuMnglMi4yeCUyLjJ4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaW9jX2RhdGEtPmF0bV9hZGRyWzBdLGlvY19kYXRhLT5hdG1fYWRkclsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvY19kYXRhLT5hdG1fYWRkclsyXSxpb2NfZGF0YS0+YXRtX2FkZHJbM10sCisgICAgICAgICAgICAgICAgICAgICAgICBpb2NfZGF0YS0+YXRtX2FkZHJbNF0saW9jX2RhdGEtPmF0bV9hZGRyWzVdLAorICAgICAgICAgICAgICAgICAgICAgICAgaW9jX2RhdGEtPmF0bV9hZGRyWzZdLGlvY19kYXRhLT5hdG1fYWRkcls3XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvY19kYXRhLT5hdG1fYWRkcls4XSxpb2NfZGF0YS0+YXRtX2FkZHJbOV0sCisgICAgICAgICAgICAgICAgICAgICAgICBpb2NfZGF0YS0+YXRtX2FkZHJbMTBdLGlvY19kYXRhLT5hdG1fYWRkclsxMV0sCisgICAgICAgICAgICAgICAgICAgICAgICBpb2NfZGF0YS0+YXRtX2FkZHJbMTJdLGlvY19kYXRhLT5hdG1fYWRkclsxM10sCisgICAgICAgICAgICAgICAgICAgICAgICBpb2NfZGF0YS0+YXRtX2FkZHJbMTRdLGlvY19kYXRhLT5hdG1fYWRkclsxNV0sCisgICAgICAgICAgICAgICAgICAgICAgICBpb2NfZGF0YS0+YXRtX2FkZHJbMTZdLGlvY19kYXRhLT5hdG1fYWRkclsxN10sCisgICAgICAgICAgICAgICAgICAgICAgICBpb2NfZGF0YS0+YXRtX2FkZHJbMThdLGlvY19kYXRhLT5hdG1fYWRkclsxOV0pOworICAgICAgICAgICAgICAgIGVudHJ5ID0gbWFrZV9lbnRyeShwcml2LCBidXNfbWFjKTsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworICAgICAgICAgICAgICAgIG1lbWNweShlbnRyeS0+YXRtX2FkZHIsIGlvY19kYXRhLT5hdG1fYWRkciwgQVRNX0VTQV9MRU4pOworICAgICAgICAgICAgICAgIG1lbXNldChlbnRyeS0+bWFjX2FkZHIsIDAsIEVUSF9BTEVOKTsKKyAgICAgICAgICAgICAgICBlbnRyeS0+cmVjdl92Y2MgPSB2Y2M7CisgICAgICAgICAgICAgICAgZW50cnktPm9sZF9yZWN2X3B1c2ggPSBvbGRfcHVzaDsKKyAgICAgICAgICAgICAgICBlbnRyeS0+c3RhdHVzID0gRVNJX1VOS05PV047CisgICAgICAgICAgICAgICAgZW50cnktPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgcHJpdi0+dmNjX3RpbWVvdXRfcGVyaW9kOworICAgICAgICAgICAgICAgIGVudHJ5LT50aW1lci5mdW5jdGlvbiA9IGxlY19hcnBfZXhwaXJlX3ZjYzsKKyAgICAgICAgICAgICAgICBhZGRfdGltZXIoJmVudHJ5LT50aW1lcik7CisgICAgICAgICAgICAgICAgZW50cnktPm5leHQgPSBwcml2LT5sZWNfbm9fZm9yd2FyZDsKKyAgICAgICAgICAgICAgICBwcml2LT5sZWNfbm9fZm9yd2FyZCA9IGVudHJ5OworCQlkdW1wX2FycF90YWJsZShwcml2KTsKKwkJZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgRFBSSU5USygiTEVDX0FSUDpBdHRhY2hpbmcgZGF0YSBkaXJlY3QsIGRlZmF1bHQ6JTIuMnglMi4yeCUyLjJ4JTIuMnglMi4yeCUyLjJ4JTIuMnglMi4yeCUyLjJ4JTIuMnglMi4yeCUyLjJ4JTIuMnglMi4yeCUyLjJ4JTIuMnglMi4yeCUyLjJ4JTIuMnglMi4yeFxuIiwKKyAgICAgICAgICAgICAgICBpb2NfZGF0YS0+YXRtX2FkZHJbMF0saW9jX2RhdGEtPmF0bV9hZGRyWzFdLAorICAgICAgICAgICAgICAgIGlvY19kYXRhLT5hdG1fYWRkclsyXSxpb2NfZGF0YS0+YXRtX2FkZHJbM10sCisgICAgICAgICAgICAgICAgaW9jX2RhdGEtPmF0bV9hZGRyWzRdLGlvY19kYXRhLT5hdG1fYWRkcls1XSwKKyAgICAgICAgICAgICAgICBpb2NfZGF0YS0+YXRtX2FkZHJbNl0saW9jX2RhdGEtPmF0bV9hZGRyWzddLAorICAgICAgICAgICAgICAgIGlvY19kYXRhLT5hdG1fYWRkcls4XSxpb2NfZGF0YS0+YXRtX2FkZHJbOV0sCisgICAgICAgICAgICAgICAgaW9jX2RhdGEtPmF0bV9hZGRyWzEwXSxpb2NfZGF0YS0+YXRtX2FkZHJbMTFdLAorICAgICAgICAgICAgICAgIGlvY19kYXRhLT5hdG1fYWRkclsxMl0saW9jX2RhdGEtPmF0bV9hZGRyWzEzXSwKKyAgICAgICAgICAgICAgICBpb2NfZGF0YS0+YXRtX2FkZHJbMTRdLGlvY19kYXRhLT5hdG1fYWRkclsxNV0sCisgICAgICAgICAgICAgICAgaW9jX2RhdGEtPmF0bV9hZGRyWzE2XSxpb2NfZGF0YS0+YXRtX2FkZHJbMTddLAorICAgICAgICAgICAgICAgIGlvY19kYXRhLT5hdG1fYWRkclsxOF0saW9jX2RhdGEtPmF0bV9hZGRyWzE5XSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMRUNfQVJQX1RBQkxFX1NJWkU7IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAoZW50cnkgPSBwcml2LT5sZWNfYXJwX3RhYmxlc1tpXTsgZW50cnk7IGVudHJ5PWVudHJ5LT5uZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtY21wKGlvY19kYXRhLT5hdG1fYWRkciwgZW50cnktPmF0bV9hZGRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRNX0VTQV9MRU4pPT0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERQUklOVEsoIkxFQ19BUlA6IEF0dGFjaGluZyBkYXRhIGRpcmVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERQUklOVEsoIkN1cnJlbnRseSAtPiBWY2M6ICVkLCBSdmNjOiVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT52Y2M/ZW50cnktPnZjYy0+dmNpOjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPnJlY3ZfdmNjP2VudHJ5LT5yZWN2X3ZjYy0+dmNpOjApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9lbnRyeT0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxfdGltZXIoJmVudHJ5LT50aW1lcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT52Y2MgPSB2Y2M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5vbGRfcHVzaCA9IG9sZF9wdXNoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnktPnN0YXR1cyA9PSBFU0lfVkNfUEVORElORykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByaXYtPm1heGltdW1fdW5rbm93bl9mcmFtZV9jb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5zdGF0dXMgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNJX0ZPUldBUkRfRElSRUNUOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPnRpbWVzdGFtcCA9IGppZmZpZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+c3RhdHVzID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTSV9GTFVTSF9QRU5ESU5HOworI2lmIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfdG9fbGVjZChwcml2LGxfZmx1c2hfeG10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPmF0bV9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZXkgd2VyZSBmb3JtaW5nIGEgY29ubmVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHVzLCBhbmQgd2UgdG8gdGhlbS4gT3VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRNIGFkZHJlc3MgaXMgbnVtZXJpY2FsbHkgbG93ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGFuIHRoZWlycywgc28gd2UgbWFrZSBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2UgZm9ybWVkIGludG8gZGVmYXVsdCBWQ0MgKDguMS4xMSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbiB0aGV5IG1hZGUgZ2V0cyB0b3JuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bi4gVGhpcyBtaWdodCBjb25mdXNlIHNvbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRzLiBDYW4gYmUgY2hhbmdlZCBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWVvbmUgcmVwb3J0cyB0cm91YmxlLi4uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmb3VuZF9lbnRyeSkgeworICAgICAgICAgICAgICAgIERQUklOVEsoIkFmdGVyIHZjYyB3YXMgYWRkZWRcbiIpOworICAgICAgICAgICAgICAgIGR1bXBfYXJwX3RhYmxlKHByaXYpOworCQlnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICAvKiBOb3QgZm91bmQsIHNuYXRjaCBhZGRyZXNzIGZyb20gZmlyc3QgZGF0YSBwYWNrZXQgdGhhdCBhcnJpdmVzIGZyb20KKyAgICAgICAgICAgdGhpcyB2Y2MgKi8KKyAgICAgICAgZW50cnkgPSBtYWtlX2VudHJ5KHByaXYsIGJ1c19tYWMpOworICAgICAgICBpZiAoIWVudHJ5KQorCQlnb3RvIG91dDsKKyAgICAgICAgZW50cnktPnZjYyA9IHZjYzsKKyAgICAgICAgZW50cnktPm9sZF9wdXNoID0gb2xkX3B1c2g7CisgICAgICAgIG1lbWNweShlbnRyeS0+YXRtX2FkZHIsIGlvY19kYXRhLT5hdG1fYWRkciwgQVRNX0VTQV9MRU4pOworICAgICAgICBtZW1zZXQoZW50cnktPm1hY19hZGRyLCAwLCBFVEhfQUxFTik7CisgICAgICAgIGVudHJ5LT5zdGF0dXMgPSBFU0lfVU5LTk9XTjsKKyAgICAgICAgZW50cnktPm5leHQgPSBwcml2LT5sZWNfYXJwX2VtcHR5X29uZXM7CisgICAgICAgIHByaXYtPmxlY19hcnBfZW1wdHlfb25lcyA9IGVudHJ5OworICAgICAgICBlbnRyeS0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBwcml2LT52Y2NfdGltZW91dF9wZXJpb2Q7CisgICAgICAgIGVudHJ5LT50aW1lci5mdW5jdGlvbiA9IGxlY19hcnBfZXhwaXJlX3ZjYzsKKyAgICAgICAgYWRkX3RpbWVyKCZlbnRyeS0+dGltZXIpOworICAgICAgICBEUFJJTlRLKCJBZnRlciB2Y2Mgd2FzIGFkZGVkXG4iKTsKKwlkdW1wX2FycF90YWJsZShwcml2KTsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sZWNfYXJwX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK2xlY19mbHVzaF9jb21wbGV0ZShzdHJ1Y3QgbGVjX3ByaXYgKnByaXYsIHVuc2lnbmVkIGxvbmcgdHJhbl9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICBzdHJ1Y3QgbGVjX2FycF90YWJsZSAqZW50cnk7CisgICAgICAgIGludCBpOworICAKKyAgICAgICAgRFBSSU5USygiTEVDOmxlY19mbHVzaF9jb21wbGV0ZSAlbHhcbiIsdHJhbl9pZCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxlY19hcnBfbG9jaywgZmxhZ3MpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTEVDX0FSUF9UQUJMRV9TSVpFOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGVudHJ5ID0gcHJpdi0+bGVjX2FycF90YWJsZXNbaV07IGVudHJ5OyBlbnRyeT1lbnRyeS0+bmV4dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LT5mbHVzaF90cmFuX2lkID09IHRyYW5faWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+c3RhdHVzID09IEVTSV9GTFVTSF9QRU5ESU5HKSB7CisJCQkgICAgICAgIHN0cnVjdCBza19idWZmICpza2I7CisKKyAJCQkJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmZW50cnktPnR4X3dhaXQpKSAhPSBOVUxMKQorCQkJCQlsZWNfc2VuZChlbnRyeS0+dmNjLCBza2IsIGVudHJ5LT5wcml2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPnN0YXR1cyA9IEVTSV9GT1JXQVJEX0RJUkVDVDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFBSSU5USygiTEVDX0FSUDogRmx1c2hlZFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bGVjX2FycF9sb2NrLCBmbGFncyk7CisgICAgICAgIGR1bXBfYXJwX3RhYmxlKHByaXYpOworfQorCitzdGF0aWMgdm9pZAorbGVjX3NldF9mbHVzaF90cmFuX2lkKHN0cnVjdCBsZWNfcHJpdiAqcHJpdiwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICphdG1fYWRkciwgdW5zaWduZWQgbG9uZyB0cmFuX2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgIHN0cnVjdCBsZWNfYXJwX3RhYmxlICplbnRyeTsKKyAgICAgICAgaW50IGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bGVjX2FycF9sb2NrLCBmbGFncyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMRUNfQVJQX1RBQkxFX1NJWkU7IGkrKykKKyAgICAgICAgICAgICAgICBmb3IoZW50cnkgPSBwcml2LT5sZWNfYXJwX3RhYmxlc1tpXTsgZW50cnk7IGVudHJ5PWVudHJ5LT5uZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtZW1jbXAoYXRtX2FkZHIsIGVudHJ5LT5hdG1fYWRkciwgQVRNX0VTQV9MRU4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5mbHVzaF90cmFuX2lkID0gdHJhbl9pZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFBSSU5USygiU2V0IGZsdXNoIHRyYW5zYWN0aW9uIGlkIHRvICVseCBmb3IgJXBcbiIsdHJhbl9pZCxlbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bGVjX2FycF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgCitsZWNfbWNhc3RfbWFrZShzdHJ1Y3QgbGVjX3ByaXYgKnByaXYsIHN0cnVjdCBhdG1fdmNjICp2Y2MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgdW5zaWduZWQgY2hhciBtYWNfYWRkcltdID0geworICAgICAgICAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKKyAgICAgICAgc3RydWN0IGxlY19hcnBfdGFibGUgKnRvX2FkZDsKKwlzdHJ1Y3QgbGVjX3ZjY19wcml2ICp2cHJpdjsKKwlpbnQgZXJyID0gMDsKKyAgCisJaWYgKCEodnByaXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbGVjX3ZjY19wcml2KSwgR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKwl2cHJpdi0+eG9mZiA9IDA7CisJdnByaXYtPm9sZF9wb3AgPSB2Y2MtPnBvcDsKKwl2Y2MtPnVzZXJfYmFjayA9IHZwcml2OworICAgICAgICB2Y2MtPnBvcCA9IGxlY19wb3A7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxlY19hcnBfbG9jaywgZmxhZ3MpOworICAgICAgICB0b19hZGQgPSBtYWtlX2VudHJ5KHByaXYsIG1hY19hZGRyKTsKKyAgICAgICAgaWYgKCF0b19hZGQpIHsKKwkJdmNjLT5wb3AgPSB2cHJpdi0+b2xkX3BvcDsKKwkJa2ZyZWUodnByaXYpOworICAgICAgICAgICAgICAgIGVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgIG1lbWNweSh0b19hZGQtPmF0bV9hZGRyLCB2Y2MtPnJlbW90ZS5zYXNfYWRkci5wcnYsIEFUTV9FU0FfTEVOKTsKKyAgICAgICAgdG9fYWRkLT5zdGF0dXMgPSBFU0lfRk9SV0FSRF9ESVJFQ1Q7CisgICAgICAgIHRvX2FkZC0+ZmxhZ3MgfD0gTEVDX1BFUk1BTkVOVF9GTEFHOworICAgICAgICB0b19hZGQtPnZjYyA9IHZjYzsKKyAgICAgICAgdG9fYWRkLT5vbGRfcHVzaCA9IHZjYy0+cHVzaDsKKyAgICAgICAgdmNjLT5wdXNoID0gbGVjX3B1c2g7CisgICAgICAgIHByaXYtPm1jYXN0X3ZjYyA9IHZjYzsKKyAgICAgICAgbGVjX2FycF9hZGQocHJpdiwgdG9fYWRkKTsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sZWNfYXJwX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQKK2xlY192Y2NfY2xvc2Uoc3RydWN0IGxlY19wcml2ICpwcml2LCBzdHJ1Y3QgYXRtX3ZjYyAqdmNjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgIHN0cnVjdCBsZWNfYXJwX3RhYmxlICplbnRyeSwgKm5leHQ7CisgICAgICAgIGludCBpOworCisgICAgICAgIERQUklOVEsoIkxFQ19BUlA6IGxlY192Y2NfY2xvc2UgdnBpOiVkIHZjaTolZFxuIix2Y2MtPnZwaSx2Y2MtPnZjaSk7CisgICAgICAgIGR1bXBfYXJwX3RhYmxlKHByaXYpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sZWNfYXJwX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgZm9yKGk9MDtpPExFQ19BUlBfVEFCTEVfU0laRTtpKyspIHsKKyAgICAgICAgICAgICAgICBmb3IoZW50cnkgPSBwcml2LT5sZWNfYXJwX3RhYmxlc1tpXTtlbnRyeTsgZW50cnk9bmV4dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGVudHJ5LT5uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZjYyA9PSBlbnRyeS0+dmNjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlY19hcnBfcmVtb3ZlKHByaXYsIGVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2ZyZWUoZW50cnkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJpdi0+bWNhc3RfdmNjID09IHZjYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPm1jYXN0X3ZjYyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBlbnRyeSA9IHByaXYtPmxlY19hcnBfZW1wdHlfb25lczsKKyAgICAgICAgcHJpdi0+bGVjX2FycF9lbXB0eV9vbmVzID0gTlVMTDsKKyAgICAgICAgd2hpbGUgKGVudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBuZXh0ID0gZW50cnktPm5leHQ7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LT52Y2MgPT0gdmNjKSB7IC8qIGxlYXZlIGl0IG91dCBmcm9tIHRoZSBsaXN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBsZWNfYXJwX2NsZWFyX3ZjY3MoZW50cnkpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVsX3RpbWVyKCZlbnRyeS0+dGltZXIpOworICAgICAgICAgICAgICAgICAgICAgICAga2ZyZWUoZW50cnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgIC8qIHB1dCBpdCBiYWNrIHRvIHRoZSBsaXN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+bmV4dCA9IHByaXYtPmxlY19hcnBfZW1wdHlfb25lczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPmxlY19hcnBfZW1wdHlfb25lcyA9IGVudHJ5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbnRyeSA9IG5leHQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGVudHJ5ID0gcHJpdi0+bGVjX25vX2ZvcndhcmQ7CisgICAgICAgIHByaXYtPmxlY19ub19mb3J3YXJkID0gTlVMTDsKKyAgICAgICAgd2hpbGUgKGVudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBuZXh0ID0gZW50cnktPm5leHQ7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LT5yZWN2X3ZjYyA9PSB2Y2MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlY19hcnBfY2xlYXJfdmNjcyhlbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxfdGltZXIoJmVudHJ5LT50aW1lcik7CisgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShlbnRyeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPm5leHQgPSBwcml2LT5sZWNfbm9fZm9yd2FyZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPmxlY19ub19mb3J3YXJkID0gZW50cnk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVudHJ5ID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIGVudHJ5ID0gcHJpdi0+bWNhc3RfZndkczsKKyAgICAgICAgcHJpdi0+bWNhc3RfZndkcyA9IE5VTEw7CisgICAgICAgIHdoaWxlIChlbnRyeSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbmV4dCA9IGVudHJ5LT5uZXh0OworICAgICAgICAgICAgICAgIGlmIChlbnRyeS0+cmVjdl92Y2MgPT0gdmNjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZWNfYXJwX2NsZWFyX3ZjY3MoZW50cnkpOworICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gdGltZXIsIExBTkV2MiA3LjEuMjAgYW5kIDIuMy41LjMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKGVudHJ5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+bmV4dCA9IHByaXYtPm1jYXN0X2Z3ZHM7CisgICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5tY2FzdF9md2RzID0gZW50cnk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVudHJ5ID0gbmV4dDsKKyAgICAgICAgfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bGVjX2FycF9sb2NrLCBmbGFncyk7CisJZHVtcF9hcnBfdGFibGUocHJpdik7Cit9CisKK3N0YXRpYyB2b2lkCitsZWNfYXJwX2NoZWNrX2VtcHRpZXMoc3RydWN0IGxlY19wcml2ICpwcml2LAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdG1fdmNjICp2Y2MsIHN0cnVjdCBza19idWZmICpza2IpCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgIHN0cnVjdCBsZWNfYXJwX3RhYmxlICplbnRyeSwgKnByZXY7CisgICAgICAgIHN0cnVjdCBsZWNkYXRhaGRyXzgwMjMgKmhkciA9IChzdHJ1Y3QgbGVjZGF0YWhkcl84MDIzICopc2tiLT5kYXRhOworICAgICAgICB1bnNpZ25lZCBjaGFyICpzcmM7CisjaWZkZWYgQ09ORklHX1RSCisgICAgICAgIHN0cnVjdCBsZWNkYXRhaGRyXzgwMjUgKnRyX2hkciA9IChzdHJ1Y3QgbGVjZGF0YWhkcl84MDI1ICopc2tiLT5kYXRhOworCisgICAgICAgIGlmIChwcml2LT5pc190cmRldikgc3JjID0gdHJfaGRyLT5oX3NvdXJjZTsKKyAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHNyYyA9IGhkci0+aF9zb3VyY2U7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bGVjX2FycF9sb2NrLCBmbGFncyk7CisgICAgICAgIGVudHJ5ID0gcHJpdi0+bGVjX2FycF9lbXB0eV9vbmVzOworICAgICAgICBpZiAodmNjID09IGVudHJ5LT52Y2MpIHsKKyAgICAgICAgICAgICAgICBkZWxfdGltZXIoJmVudHJ5LT50aW1lcik7CisgICAgICAgICAgICAgICAgbWVtY3B5KGVudHJ5LT5tYWNfYWRkciwgc3JjLCBFVEhfQUxFTik7CisgICAgICAgICAgICAgICAgZW50cnktPnN0YXR1cyA9IEVTSV9GT1JXQVJEX0RJUkVDVDsKKyAgICAgICAgICAgICAgICBlbnRyeS0+bGFzdF91c2VkID0gamlmZmllczsKKyAgICAgICAgICAgICAgICBwcml2LT5sZWNfYXJwX2VtcHR5X29uZXMgPSBlbnRyeS0+bmV4dDsKKyAgICAgICAgICAgICAgICAvKiBXZSBtaWdodCBoYXZlIGdvdCBhbiBlbnRyeSAqLworICAgICAgICAgICAgICAgIGlmICgocHJldiA9IGxlY19hcnBfZmluZChwcml2LHNyYykpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZWNfYXJwX3JlbW92ZShwcml2LCBwcmV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKHByZXYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsZWNfYXJwX2FkZChwcml2LCBlbnRyeSk7CisJCWdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgIHByZXYgPSBlbnRyeTsKKyAgICAgICAgZW50cnkgPSBlbnRyeS0+bmV4dDsKKyAgICAgICAgd2hpbGUgKGVudHJ5ICYmIGVudHJ5LT52Y2MgIT0gdmNjKSB7CisgICAgICAgICAgICAgICAgcHJldj0gZW50cnk7CisgICAgICAgICAgICAgICAgZW50cnkgPSBlbnRyeS0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgICAgICAgICAgRFBSSU5USygiTEVDX0FSUDogQXJwX2NoZWNrX2VtcHRpZXM6IGVudHJ5IG5vdCBmb3VuZCFcbiIpOworCQlnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICBkZWxfdGltZXIoJmVudHJ5LT50aW1lcik7CisgICAgICAgIG1lbWNweShlbnRyeS0+bWFjX2FkZHIsIHNyYywgRVRIX0FMRU4pOworICAgICAgICBlbnRyeS0+c3RhdHVzID0gRVNJX0ZPUldBUkRfRElSRUNUOworICAgICAgICBlbnRyeS0+bGFzdF91c2VkID0gamlmZmllczsKKyAgICAgICAgcHJldi0+bmV4dCA9IGVudHJ5LT5uZXh0OworICAgICAgICBpZiAoKHByZXYgPSBsZWNfYXJwX2ZpbmQocHJpdiwgc3JjKSkpIHsKKyAgICAgICAgICAgICAgICBsZWNfYXJwX3JlbW92ZShwcml2LCBwcmV2KTsKKyAgICAgICAgICAgICAgICBrZnJlZShwcmV2KTsKKyAgICAgICAgfQorICAgICAgICBsZWNfYXJwX2FkZChwcml2LCBlbnRyeSk7CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bGVjX2FycF9sb2NrLCBmbGFncyk7Cit9CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvYXRtL2xlYy5oIGIvbmV0L2F0bS9sZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjA2MDgyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2F0bS9sZWMuaApAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqCisgKiBMYW4gRW11bGF0aW9uIGNsaWVudCBoZWFkZXIgZmlsZQorICoKKyAqIE1hcmtvIEtpaXNraWxhIG1raWlza2lsYUB5YWhvby5jb20KKyAqCisgKi8KKworI2lmbmRlZiBfTEVDX0hfCisjZGVmaW5lIF9MRUNfSF8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWxlYy5oPgorCisjZGVmaW5lIExFQ19IRUFERVJfTEVOIDE2CisKK3N0cnVjdCBsZWNkYXRhaGRyXzgwMjMgeworICB1bnNpZ25lZCBzaG9ydCBsZV9oZWFkZXI7CisgIHVuc2lnbmVkIGNoYXIgaF9kZXN0W0VUSF9BTEVOXTsKKyAgdW5zaWduZWQgY2hhciBoX3NvdXJjZVtFVEhfQUxFTl07CisgIHVuc2lnbmVkIHNob3J0IGhfdHlwZTsKK307CisKK3N0cnVjdCBsZWNkYXRhaGRyXzgwMjUgeworICB1bnNpZ25lZCBzaG9ydCBsZV9oZWFkZXI7CisgIHVuc2lnbmVkIGNoYXIgYWNfcGFkOworICB1bnNpZ25lZCBjaGFyIGZjOworICB1bnNpZ25lZCBjaGFyIGhfZGVzdFtFVEhfQUxFTl07CisgIHVuc2lnbmVkIGNoYXIgaF9zb3VyY2VbRVRIX0FMRU5dOworfTsKKworI2RlZmluZSBMRUNfTUlOSU1VTV84MDIzX1NJWkUgICA2MgorI2RlZmluZSBMRUNfTUlOSU1VTV84MDI1X1NJWkUgICAxNgorCisvKgorICogT3BlcmF0aW9ucyB0aGF0IExBTkUyIGNhcGFibGUgZGV2aWNlIGNhbiBkby4gVHdvIGZpcnN0IGZ1bmN0aW9ucworICogYXJlIHVzZWQgdG8gbWFrZSB0aGUgZGV2aWNlIGRvIHRoaW5ncy4gU2VlIHNwZWMgMy4xLjMgYW5kIDMuMS40LgorICoKKyAqIFRoZSB0aGlyZCBmdW5jdGlvbiBpcyBpbnRlbnRlZCBmb3IgdGhlIE1QT0EgY29tcG9uZW50IHNpdHRpbmcgb24KKyAqIHRvcCBvZiB0aGUgTEFORSBkZXZpY2UuIFRoZSBNUE9BIGNvbXBvbmVudCBhc3NpZ25zIGl0J3Mgb3duIGZ1bmN0aW9uCisgKiB0byAoKmFzc29jaWF0ZV9pbmRpY2F0b3IpKCkgYW5kIHRoZSBMQU5FIGRldmljZSB3aWxsIHVzZSB0aGF0CisgKiBmdW5jdGlvbiB0byB0ZWxsIGFib3V0IFRMVnMgaXQgc2VlcyBmbG9hdGluZyB0aHJvdWdoLgorICoKKyAqLworc3RydWN0IGxhbmUyX29wcyB7CisJaW50ICAoKnJlc29sdmUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpkc3RfbWFjLCBpbnQgZm9yY2UsCisgICAgICAgICAgICAgICAgICAgICAgICB1OCAqKnRsdnMsIHUzMiAqc2l6ZW9mdGx2cyk7CisgICAgICAgIGludCAgKCphc3NvY2lhdGVfcmVxKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqbGFuX2RzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICp0bHZzLCB1MzIgc2l6ZW9mdGx2cyk7CisJdm9pZCAoKmFzc29jaWF0ZV9pbmRpY2F0b3IpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICptYWNfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICp0bHZzLCB1MzIgc2l6ZW9mdGx2cyk7Cit9OworCisvKgorICogQVRNIExBTiBFbXVsYXRpb24gc3VwcG9ydHMgYm90aCBMTEMgJiBEaXggRXRoZXJuZXQgRXRoZXJUeXBlCisgKiBmcmFtZXMuIAorICogMS4gRGl4IEV0aGVybmV0IEV0aGVyVHlwZSBmcmFtZXMgZW5jb2RlZCBieSBwbGFjaW5nIEV0aGVyVHlwZQorICogICAgZmllbGQgaW4gaF90eXBlIGZpZWxkLiBEYXRhIGZvbGxvd3MgaW1tZWRpYXRlbGx5IGFmdGVyIGhlYWRlci4KKyAqIDIuIExMQyBEYXRhIGZyYW1lcyB3aG9zZSB0b3RhbCBsZW5ndGgsIGluY2x1ZGluZyBMTEMgZmllbGQgYW5kIGRhdGEsCisgKiAgICBidXQgbm90IHBhZGRpbmcgcmVxdWlyZWQgdG8gbWVldCB0aGUgbWluaW11bSBkYXRhIGZyYW1lIGxlbmd0aCwgCisgKiAgICBpcyBsZXNzIHRoYW4gMTUzNigweDA2MDApIE1VU1QgYmUgZW5jb2RlZCBieSBwbGFjaW5nIHRoYXQgbGVuZ3RoCisgKiAgICBpbiB0aGUgaF90eXBlIGZpZWxkLiBUaGUgTExDIGZpZWxkIGZvbGxvd3MgaGVhZGVyIGltbWVkaWF0ZWxseS4KKyAqIDMuIExMQyBkYXRhIGZyYW1lcyBsb25nZXIgdGhhbiB0aGlzIG1heGltdW0gTVVTVCBiZSBlbmNvZGVkIGJ5IHBsYWNpbmcKKyAqICAgIHRoZSB2YWx1ZSAwIGluIHRoZSBoX3R5cGUgZmllbGQuCisgKgorICovCisKKy8qIEhhc2ggdGFibGUgc2l6ZSAqLworI2RlZmluZSBMRUNfQVJQX1RBQkxFX1NJWkUgMTYKKworc3RydWN0IGxlY19wcml2IHsKKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGxlY2lkOyAgICAgIC8qIExlY2lkIG9mIHRoaXMgY2xpZW50ICovCisgICAgICAgIHN0cnVjdCBsZWNfYXJwX3RhYmxlICpsZWNfYXJwX2VtcHR5X29uZXM7CisgICAgICAgIC8qIFVzZWQgZm9yIHN0b3JpbmcgVkNDJ3MgdGhhdCBkb24ndCBoYXZlIGEgTUFDIGFkZHJlc3MgYXR0YWNoZWQgeWV0ICovCisgICAgICAgIHN0cnVjdCBsZWNfYXJwX3RhYmxlICpsZWNfYXJwX3RhYmxlc1tMRUNfQVJQX1RBQkxFX1NJWkVdOworICAgICAgICAvKiBBY3R1YWwgTEUgQVJQIHRhYmxlICovCisgICAgICAgIHN0cnVjdCBsZWNfYXJwX3RhYmxlICpsZWNfbm9fZm9yd2FyZDsKKyAgICAgICAgLyogVXNlZCBmb3Igc3RvcmluZyBWQ0MncyAoYW5kIGZvcndhcmQgcGFja2V0cyBmcm9tKSB3aGljaCBhcmUgdG8KKyAgICAgICAgICAgYWdlIG91dCBieSBub3QgdXNpbmcgdGhlbSB0byBmb3J3YXJkIHBhY2tldHMuIAorICAgICAgICAgICBUaGlzIGlzIGJlY2F1c2UgdG8gc29tZSBMRSBjbGllbnRzIHRoZXJlIHdpbGwgYmUgMiBWQ0NzLiBPbmx5CisgICAgICAgICAgIG9uZSBvZiB0aGVtIGdldHMgdXNlZC4gKi8KKyAgICAgICAgc3RydWN0IGxlY19hcnBfdGFibGUgKm1jYXN0X2Z3ZHM7CisgICAgICAgIC8qIFdpdGggTEFORXYyIGl0IGlzIHBvc3NpYmxlIHRoYXQgQlVTIChvciBhIHNwZWNpYWwgbXVsdGljYXN0IHNlcnZlcikKKyAgICAgICAgICAgZXN0YWJsaXNoZXMgbXVsdGlwbGUgTXVsdGljYXN0IEZvcndhcmQgVkNDcyB0byB1cy4gVGhpcyBsaXN0CisgICAgICAgICAgIGNvbGxlY3RzIGFsbCB0aG9zZSBWQ0NzLiBMQU5FdjEgY2xpZW50IGhhcyBvbmx5IG9uZSBpdGVtIGluIHRoaXMKKyAgICAgICAgICAgbGlzdC4gVGhlc2UgZW50cmllcyBhcmUgbm90IGFnZWQgb3V0LiAqLworICAgICAgICBzcGlubG9ja190IGxlY19hcnBfbG9jazsKKyAgICAgICAgc3RydWN0IGF0bV92Y2MgKm1jYXN0X3ZjYzsgLyogRGVmYXVsdCBNdWx0aWNhc3QgU2VuZCBWQ0MgKi8KKyAgICAgICAgc3RydWN0IGF0bV92Y2MgKmxlY2Q7CisgICAgICAgIHN0cnVjdCB0aW1lcl9saXN0IGxlY19hcnBfdGltZXI7CisgICAgICAgIC8qIEMxMCAqLworICAgICAgICB1bnNpZ25lZCBpbnQgbWF4aW11bV91bmtub3duX2ZyYW1lX2NvdW50OworLyogV2l0aGluIHRoZSBwZXJpb2Qgb2YgdGltZSBkZWZpbmVkIGJ5IHRoaXMgdmFyaWFibGUsIHRoZSBjbGllbnQgd2lsbCBzZW5kIAorICAgbm8gbW9yZSB0aGFuIEMxMCBmcmFtZXMgdG8gQlVTIGZvciBhIGdpdmVuIHVuaWNhc3QgZGVzdGluYXRpb24uIChDMTEpICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgbWF4X3Vua25vd25fZnJhbWVfdGltZTsKKy8qIElmIG5vIHRyYWZmaWMgaGFzIGJlZW4gc2VudCBpbiB0aGlzIHZjYyBmb3IgdGhpcyBwZXJpb2Qgb2YgdGltZSwKKyAgIHZjYyB3aWxsIGJlIHRvcm4gZG93biAoQzEyKSovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgdmNjX3RpbWVvdXRfcGVyaW9kOworLyogQW4gTEUgQ2xpZW50IE1VU1Qgbm90IHJldHJ5IGFuIExFX0FSUF9SRVFVRVNUIGZvciBhIAorICAgZ2l2ZW4gZnJhbWUncyBMQU4gRGVzdGluYXRpb24gbW9yZSB0aGFuIG1heGltdW0gcmV0cnkgY291bnQgdGltZXMsCisgICBhZnRlciB0aGUgZmlyc3QgTEVDX0FSUF9SRVFVRVNUIChDMTMpKi8KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgbWF4X3JldHJ5X2NvdW50OworLyogTWF4IHRpbWUgdGhlIGNsaWVudCB3aWxsIG1haW50YWluIGFuIGVudHJ5IGluIGl0cyBhcnAgY2FjaGUgaW4KKyAgIGFic2VuY2Ugb2YgYSB2ZXJpZmljYXRpb24gb2YgdGhhdCByZWxhdGlvbnNoaXAgKEMxNykqLworICAgICAgICB1bnNpZ25lZCBsb25nIGFnaW5nX3RpbWU7CisvKiBNYXggdGltZSB0aGUgY2xpZW50IHdpbGwgbWFpbnRhaW4gYW4gZW50cnkgaW4gY2FjaGUgd2hlbgorICAgdG9wb2xvZ3kgY2hhbmdlIGZsYWcgaXMgdHJ1ZSAoQzE4KSAqLworICAgICAgICB1bnNpZ25lZCBsb25nIGZvcndhcmRfZGVsYXlfdGltZTsKKy8qIFRvcG9sb2d5IGNoYW5nZSBmbGFnICAoQzE5KSovCisgICAgICAgIGludCB0b3BvbG9neV9jaGFuZ2U7CisvKiBNYXggdGltZSB0aGUgY2xpZW50IGV4cGVjdHMgYW4gTEVfQVJQX1JFUVVFU1QvTEVfQVJQX1JFU1BPTlNFCisgICBjeWNsZSB0byB0YWtlIChDMjApKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyBhcnBfcmVzcG9uc2VfdGltZTsKKy8qIFRpbWUgbGltaXQgb3Qgd2FpdCB0byByZWNlaXZlIGFuIExFX0ZMVVNIX1JFU1BPTlNFIGFmdGVyIHRoZQorICAgTEVfRkxVU0hfUkVRVUVTVCBoYXMgYmVlbiBzZW50IGJlZm9yZSB0YWtpbmcgcmVjb3ZlciBhY3Rpb24uIChDMjEpKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbHVzaF90aW1lb3V0OworLyogVGhlIHRpbWUgc2luY2Ugc2VuZGluZyBhIGZyYW1lIHRvIHRoZSBidXMgYWZ0ZXIgd2hpY2ggdGhlCisgICBMRSBDbGllbnQgbWF5IGFzc3VtZSB0aGF0IHRoZSBmcmFtZSBoYXMgYmVlbiBlaXRoZXIgZGlzY2FyZGVkIG9yCisgICBkZWxpdmVyZWQgdG8gdGhlIHJlY2lwaWVudCAoQzIyKSAqLworICAgICAgICB1bnNpZ25lZCBsb25nIHBhdGhfc3dpdGNoaW5nX2RlbGF5OworCisgICAgICAgIHU4ICp0bHZzOyAgICAgICAgICAvKiBMQU5FMjogVExWcyBhcmUgbmV3ICAgICAgICAgICAgICAgICovCisgICAgICAgIHUzMiBzaXplb2Z0bHZzOyAgICAvKiBUaGUgc2l6ZSBvZiB0aGUgdGx2IGFycmF5IGluIGJ5dGVzICovCisgICAgICAgIGludCBsYW5lX3ZlcnNpb247ICAvKiBMQU5FMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJaW50IGl0Zm51bTsgICAgICAgIC8qIGUuZy4gMiBmb3IgbGVjMiwgNSBmb3IgbGVjNSAgICAgICAgKi8KKyAgICAgICAgc3RydWN0IGxhbmUyX29wcyAqbGFuZTJfb3BzOyAvKiBjYW4gYmUgTlVMTCBmb3IgTEFORSB2MSAgKi8KKyAgICAgICAgaW50IGlzX3Byb3h5OyAgICAgIC8qIGJyaWRnZSBiZXR3ZWVuIEFUTSBhbmQgRXRoZXJuZXQgICAgKi8KKyAgICAgICAgaW50IGlzX3RyZGV2OyAgICAgIC8qIERldmljZSB0eXBlLCAwID0gRXRoZXJuZXQsIDEgPSBUb2tlblJpbmcgKi8KK307CisKK3N0cnVjdCBsZWNfdmNjX3ByaXYgeworCXZvaWQgKCpvbGRfcG9wKShzdHJ1Y3QgYXRtX3ZjYyAqdmNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKwlpbnQgeG9mZjsKK307CisKKyNkZWZpbmUgTEVDX1ZDQ19QUklWKHZjYykJKChzdHJ1Y3QgbGVjX3ZjY19wcml2ICopKCh2Y2MpLT51c2VyX2JhY2spKQorCisjZW5kaWYgLyogX0xFQ19IXyAqLworCmRpZmYgLS1naXQgYS9uZXQvYXRtL2xlY19hcnBjLmggYi9uZXQvYXRtL2xlY19hcnBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk3NDQ4MAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9hdG0vbGVjX2FycGMuaApAQCAtMCwwICsxLDkyIEBACisvKgorICogTGVjIGFycCBjYWNoZQorICogTWFya28gS2lpc2tpbGEgbWtpaXNraWxhQHlhaG9vLmNvbQorICoKKyAqLworI2lmbmRlZiBfTEVDX0FSUF9ICisjZGVmaW5lIF9MRUNfQVJQX0gKKyNpbmNsdWRlIDxsaW51eC9hdG0uaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWxlYy5oPgorCitzdHJ1Y3QgbGVjX2FycF90YWJsZSB7CisgICAgICAgIHN0cnVjdCBsZWNfYXJwX3RhYmxlICpuZXh0OyAgICAgICAgICAvKiBMaW5rZWQgZW50cnkgbGlzdCAqLworICAgICAgICB1bnNpZ25lZCBjaGFyIGF0bV9hZGRyW0FUTV9FU0FfTEVOXTsgLyogQXRtIGFkZHJlc3MgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciBtYWNfYWRkcltFVEhfQUxFTl07ICAgIC8qIE1hYyBhZGRyZXNzICovCisgICAgICAgIGludCBpc19yZGVzYzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWMgYWRkcmVzcyBpcyBhIHJvdXRlIGRlc2NyaXB0b3IgKi8KKyAgICAgICAgc3RydWN0IGF0bV92Y2MgKnZjYzsgICAgICAgICAgICAgICAgIC8qIFZjYyB0aGlzIGVudHJ5IGlzIGF0dGFjaGVkICovCisgICAgICAgIHN0cnVjdCBhdG1fdmNjICpyZWN2X3ZjYzsgICAgICAgICAgICAvKiBWY2Mgd2UgcmVjZWl2ZSBkYXRhIGZyb20gKi8KKyAgICAgICAgdm9pZCAoKm9sZF9wdXNoKShzdHJ1Y3QgYXRtX3ZjYyAqdmNjLHN0cnVjdCBza19idWZmICpza2IpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFB1c2ggdGhhdCBsZWFkcyB0byBkYWVtb24gKi8KKyAgICAgICAgdm9pZCAoKm9sZF9yZWN2X3B1c2gpKHN0cnVjdCBhdG1fdmNjICp2Y2MsIHN0cnVjdCBza19idWZmICpza2IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHVzaCB0aGF0IGxlYWRzIHRvIGRhZW1vbiAqLworICAgICAgICB2b2lkICgqb2xkX2Nsb3NlKShzdHJ1Y3QgYXRtX3ZjYyAqdmNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlIHdhbnQgdG8gc2VlIHdoZW4gdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdmNjIGdldHMgY2xvc2VkICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgbGFzdF91c2VkOyAgICAgICAgICAgICAvKiBGb3IgZXhwaXJ5ICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgdGltZXN0YW1wOyAgICAgICAgICAgICAvKiBVc2VkIGZvciB2YXJpb3VzIHRpbWVzdGFtcGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGhpbmdzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMS4gRkxVU0ggc3RhcnRlZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgIChzdGF0dXM9RVNJX0ZMVVNIX1BFTkRJTkcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAyLiBDb3VudGluZyB0byAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgIG1heF91bmtub3duX2ZyYW1lX3RpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgIChzdGF0dXM9RVNJX0FSUF9QRU5ESU5HfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICBzdGF0dXM9RVNJX1ZDX1BFTkRJTkcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciBub190cmllczsgICAgICAgICAgICAgIC8qIE5vIG9mIHRpbWVzIGFycCByZXRyeSBoYXMgYmVlbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWVkICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgc3RhdHVzOyAgICAgICAgICAgICAgICAvKiBTdGF0dXMgb2YgdGhpcyBlbnRyeSAqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCBmbGFnczsgICAgICAgICAgICAgICAgLyogRmxhZ3MgZm9yIHRoaXMgZW50cnkgKi8KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgcGFja2V0c19mbG9vZGVkOyAgICAgIC8qIERhdGEgcGFja2V0cyBmbG9vZGVkICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmx1c2hfdHJhbl9pZDsgICAgICAgICAvKiBUcmFuc2FjdGlvbiBpZCBpbiBmbHVzaCBwcm90b2NvbCAqLworICAgICAgICBzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsgICAgICAgICAgICAgLyogQXJwaW5nIHRpbWVyICovCisgICAgICAgIHN0cnVjdCBsZWNfcHJpdiAqcHJpdjsgICAgICAgICAgICAgICAvKiBQb2ludGVyIGJhY2sgKi8KKworICAgICAgICB1OCAgKnRsdnM7ICAgICAgICAgICAgIC8qIExBTkUyOiBFYWNoIE1BQyBhZGRyZXNzIGNhbiBoYXZlIFRMVnMgICAgKi8KKyAgICAgICAgdTMyIHNpemVvZnRsdnM7ICAgICAgICAvKiBhc3NvY2lhdGVkIHdpdGggaXQuIHNpemVvZnRsdnMgdGVsbHMgdGhlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIGxlbmd0aCBvZiB0aGUgdGx2cyBhcnJheSAgICAgICAgICAgICAqLworICAgICAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHR4X3dhaXQ7IC8qIHdhaXQgcXVldWUgZm9yIG91dGdvaW5nIHBhY2tldHMgICAgKi8KK307CisKK3N0cnVjdCB0bHYgeyAgICAgICAgICAgICAgICAgICAvKiBMQU5FMjogVGVtcGxhdGUgdGx2IHN0cnVjdCBmb3IgYWNjZXNzaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIHRsdnMgaW4gdGhlIGxlY19hcnBfdGFibGUtPnRsdnMgYXJyYXkqLworICAgICAgICB1MzIgdHlwZTsKKyAgICAgICAgdTggIGxlbmd0aDsKKyAgICAgICAgdTggIHZhbHVlWzI1NV07Cit9OworCisvKiBTdGF0dXMgZmllbGRzICovCisjZGVmaW5lIEVTSV9VTktOT1dOIDAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBOZXh0IHBhY2tldCBzZW50IHRvIHRoaXMgbWFjIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjYXVzZXMgQVJQLXJlcXVlc3QgdG8gYmUgc2VudCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVNJX0FSUF9QRU5ESU5HIDEgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoZXJlIGlzIG5vIEFUTSBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogNDgtYml0IGFkZHJlc3MuICBUaGUgTEUtQVJQIHByb3RvY29sIGlzIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcHJvZ3Jlc3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVTSV9WQ19QRU5ESU5HIDIgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGVyZSBpcyBhIHZhbGlkIEFUTSBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGlzIDQ4LWJpdCBhZGRyZXNzIGJ1dCB0aGVyZSBpcyBubyBWQyBzZXQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdXAgdG8gdGhhdCBBVE0gYWRkcmVzcy4gIFRoZSBzaWduYWxpbmcgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcHJvdG9jb2wgaXMgaW4gcHJvY2Vzcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVNJX0ZMVVNIX1BFTkRJTkcgNCAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoZSBMRUMgaGFzIGJlZW4gbm90aWZpZWQgb2YgdGhlIEZMVVNIX1NUQVJUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3RhdHVzIGFuZCBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGZsdXNoIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHByb3RvY29sIGlzIGluIHByb2Nlc3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVTSV9GT1JXQVJEX0RJUkVDVCA1IC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEVpdGhlciB0aGUgUGF0aCBTd2l0Y2hpbmcgRGVsYXkgKEMyMikgaGFzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBlbGFwc2VkIG9yIHRoZSBMRUMgaGFzIG5vdGlmaWVkIHRoZSBNYXBwaW5nIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGF0IHRoZSBmbHVzaCBwcm90b2NvbCBoYXMgY29tcGxldGVkLiAgSW4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGVpdGhlciBjYXNlLCBpdCBpcyBzYWZlIHRvIGZvcndhcmQgcGFja2V0cyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gdGhpcyBhZGRyZXNzIHZpYSB0aGUgZGF0YSBkaXJlY3QgVkMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBGbGFnIHZhbHVlcyAqLworI2RlZmluZSBMRUNfUkVNT1RFX0ZMQUcgICAgICAweDAwMDEKKyNkZWZpbmUgTEVDX1BFUk1BTkVOVF9GTEFHICAgMHgwMDAyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9tcGMuYyBiL25ldC9hdG0vbXBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdhODFlYgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9hdG0vbXBjLmMKQEAgLTAsMCArMSwxNTE0IEBACisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworLyogV2UgYXJlIGFuIGV0aGVybmV0IGRldmljZSAqLworI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+ICAgLyogZm9yIGlwX2Zhc3RfY3N1bSgpICovCisjaW5jbHVkZSA8bmV0L2FycC5oPgorI2luY2x1ZGUgPG5ldC9kc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisKKy8qIEFuZCBhdG0gZGV2aWNlICovCisjaW5jbHVkZSA8bGludXgvYXRtZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvYXRtbGVjLmg+CisjaW5jbHVkZSA8bGludXgvYXRtbXBjLmg+CisvKiBNb2R1bGFyIHRvbyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAibGVjLmgiCisjaW5jbHVkZSAibXBjLmgiCisjaW5jbHVkZSAicmVzb3VyY2VzLmgiCisKKy8qCisgKiBtcGMuYzogSW1wbGVtZW50YXRpb24gb2YgTVBPQSBjbGllbnQga2VybmVsIHBhcnQgCisgKi8KKworI2lmIDAKKyNkZWZpbmUgZHByaW50ayBwcmludGsgICAvKiBkZWJ1ZyAqLworI2Vsc2UKKyNkZWZpbmUgZHByaW50ayhmb3JtYXQsYXJncy4uLikKKyNlbmRpZgorCisjaWYgMAorI2RlZmluZSBkZHByaW50ayBwcmludGsgIC8qIG1vcmUgZGVidWcgKi8KKyNlbHNlCisjZGVmaW5lIGRkcHJpbnRrKGZvcm1hdCxhcmdzLi4uKQorI2VuZGlmCisKKworCisjZGVmaW5lIE1QT0FfVEFHX0xFTiA0CisKKy8qIG1wY19kYWVtb24gLT4ga2VybmVsICovCitzdGF0aWMgdm9pZCBNUE9BX3RyaWdnZXJfcmN2ZCAoc3RydWN0IGtfbWVzc2FnZSAqbXNnLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYyk7CitzdGF0aWMgdm9pZCBNUE9BX3Jlc19yZXBseV9yY3ZkKHN0cnVjdCBrX21lc3NhZ2UgKm1zZywgc3RydWN0IG1wb2FfY2xpZW50ICptcGMpOworc3RhdGljIHZvaWQgaW5ncmVzc19wdXJnZV9yY3ZkKHN0cnVjdCBrX21lc3NhZ2UgKm1zZywgc3RydWN0IG1wb2FfY2xpZW50ICptcGMpOworc3RhdGljIHZvaWQgZWdyZXNzX3B1cmdlX3JjdmQoc3RydWN0IGtfbWVzc2FnZSAqbXNnLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYyk7CitzdGF0aWMgdm9pZCBtcHNfZGVhdGgoc3RydWN0IGtfbWVzc2FnZSAqbXNnLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYyk7CitzdGF0aWMgdm9pZCBjbGVhbl91cChzdHJ1Y3Qga19tZXNzYWdlICptc2csIHN0cnVjdCBtcG9hX2NsaWVudCAqbXBjLCBpbnQgYWN0aW9uKTsKK3N0YXRpYyB2b2lkIE1QT0FfY2FjaGVfaW1wb3NfcmN2ZChzdHJ1Y3Qga19tZXNzYWdlICptc2csIHN0cnVjdCBtcG9hX2NsaWVudCAqbXBjKTsKK3N0YXRpYyB2b2lkIHNldF9tcGNfY3RybF9hZGRyX3JjdmQoc3RydWN0IGtfbWVzc2FnZSAqbWVzZywgc3RydWN0IG1wb2FfY2xpZW50ICptcGMpOworc3RhdGljIHZvaWQgc2V0X21wc19tYWNfYWRkcl9yY3ZkKHN0cnVjdCBrX21lc3NhZ2UgKm1lc2csIHN0cnVjdCBtcG9hX2NsaWVudCAqbXBjKTsKKworc3RhdGljIHVpbnQ4X3QgKmNvcHlfbWFjcyhzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYywgdWludDhfdCAqcm91dGVyX21hYywKKwkJCSAgdWludDhfdCAqdGx2cywgdWludDhfdCBtcHNfbWFjcywgdWludDhfdCBkZXZpY2VfdHlwZSk7CitzdGF0aWMgdm9pZCBwdXJnZV9lZ3Jlc3Nfc2hvcnRjdXQoc3RydWN0IGF0bV92Y2MgKnZjYywgZWdfY2FjaGVfZW50cnkgKmVudHJ5KTsKKworc3RhdGljIHZvaWQgc2VuZF9zZXRfbXBzX2N0cmxfYWRkcihjaGFyICphZGRyLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYyk7CitzdGF0aWMgdm9pZCBtcG9hZF9jbG9zZShzdHJ1Y3QgYXRtX3ZjYyAqdmNjKTsKK3N0YXRpYyBpbnQgbXNnX2Zyb21fbXBvYWQoc3RydWN0IGF0bV92Y2MgKnZjYywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKK3N0YXRpYyB2b2lkIG1wY19wdXNoKHN0cnVjdCBhdG1fdmNjICp2Y2MsIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBtcGNfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG1wb2FfZXZlbnRfbGlzdGVuZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICptcG9hX25vdGlmaWVyLCB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpkZXYpOworc3RhdGljIHZvaWQgbXBjX3RpbWVyX3JlZnJlc2godm9pZCk7CitzdGF0aWMgdm9pZCBtcGNfY2FjaGVfY2hlY2soIHVuc2lnbmVkIGxvbmcgY2hlY2tpbmdfdGltZSAgKTsKKworc3RhdGljIHN0cnVjdCBsbGNfc25hcF9oZHIgbGxjX3NuYXBfbXBvYV9jdHJsID0geworCTB4YWEsIDB4YWEsIDB4MDMsCisJezB4MDAsIDB4MDAsIDB4NWV9LAorCXsweDAwLCAweDAzfSAgICAgICAgIC8qIEZvciBNUE9BIGNvbnRyb2wgUERVcyAqLworfTsgICAgICAgIAorc3RhdGljIHN0cnVjdCBsbGNfc25hcF9oZHIgbGxjX3NuYXBfbXBvYV9kYXRhID0geworCTB4YWEsIDB4YWEsIDB4MDMsCisJezB4MDAsIDB4MDAsIDB4MDB9LAorCXsweDA4LCAweDAwfSAgICAgICAgIC8qIFRoaXMgaXMgZm9yIElQIFBEVXMgb25seSAqLworfTsgICAgICAgIAorc3RhdGljIHN0cnVjdCBsbGNfc25hcF9oZHIgbGxjX3NuYXBfbXBvYV9kYXRhX3RhZ2dlZCA9IHsKKwkweGFhLCAweGFhLCAweDAzLAorCXsweDAwLCAweDAwLCAweDAwfSwKKwl7MHg4OCwgMHg0Y30gICAgICAgICAvKiBUaGlzIGlzIGZvciB0YWdnZWQgZGF0YSBQRFVzICovCit9OyAgICAgICAgCisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbXBvYV9ub3RpZmllciA9IHsKKwltcG9hX2V2ZW50X2xpc3RlbmVyLAorCU5VTEwsCisJMAorfTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitleHRlcm4gaW50IG1wY19wcm9jX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBtcGNfcHJvY19jbGVhbih2b2lkKTsKKyNlbmRpZgorCitzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wY3MgPSBOVUxMOyAvKiBGSVhNRSAqLworc3RhdGljIHN0cnVjdCBhdG1fbXBvYV9xb3MgKnFvc19oZWFkID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBtcGNfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihOVUxMLCAwLCAwKTsKKworCitzdGF0aWMgc3RydWN0IG1wb2FfY2xpZW50ICpmaW5kX21wY19ieV9pdGZudW0oaW50IGl0ZikKK3sKKwlzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYzsKKwkKKwltcGMgPSBtcGNzOyAgLyogb3VyIGdsb2JhbCBsaW5rZWQgbGlzdCAqLworCXdoaWxlIChtcGMgIT0gTlVMTCkgeworCQlpZiAobXBjLT5kZXZfbnVtID09IGl0ZikKKwkJCXJldHVybiBtcGM7CisJCW1wYyA9IG1wYy0+bmV4dDsgICAgCisJfQorCisJcmV0dXJuIE5VTEw7ICAgLyogbm90IGZvdW5kICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgbXBvYV9jbGllbnQgKmZpbmRfbXBjX2J5X3ZjYyhzdHJ1Y3QgYXRtX3ZjYyAqdmNjKQoreworCXN0cnVjdCBtcG9hX2NsaWVudCAqbXBjOworCQorCW1wYyA9IG1wY3M7ICAvKiBvdXIgZ2xvYmFsIGxpbmtlZCBsaXN0ICovCisJd2hpbGUgKG1wYyAhPSBOVUxMKSB7CisJCWlmIChtcGMtPm1wb2FkX3ZjYyA9PSB2Y2MpCisJCQlyZXR1cm4gbXBjOworCQltcGMgPSBtcGMtPm5leHQ7CisJfQorCisJcmV0dXJuIE5VTEw7ICAgLyogbm90IGZvdW5kICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgbXBvYV9jbGllbnQgKmZpbmRfbXBjX2J5X2xlYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtcG9hX2NsaWVudCAqbXBjOworCQorCW1wYyA9IG1wY3M7ICAvKiBvdXIgZ2xvYmFsIGxpbmtlZCBsaXN0ICovCisJd2hpbGUgKG1wYyAhPSBOVUxMKSB7CisJCWlmIChtcGMtPmRldiA9PSBkZXYpCisJCQlyZXR1cm4gbXBjOworCQltcGMgPSBtcGMtPm5leHQ7CisJfQorCisJcmV0dXJuIE5VTEw7ICAgLyogbm90IGZvdW5kICovCit9CisKKy8qCisgKiBGdW5jdGlvbnMgZm9yIG1hbmFnaW5nIFFvUyBsaXN0CisgKi8KKworLyoKKyAqIE92ZXJ3cml0ZXMgdGhlIG9sZCBlbnRyeSBvciBtYWtlcyBhIG5ldyBvbmUuCisgKi8KK3N0cnVjdCBhdG1fbXBvYV9xb3MgKmF0bV9tcG9hX2FkZF9xb3ModWludDMyX3QgZHN0X2lwLCBzdHJ1Y3QgYXRtX3FvcyAqcW9zKQoreworCXN0cnVjdCBhdG1fbXBvYV9xb3MgKmVudHJ5OworCisJZW50cnkgPSBhdG1fbXBvYV9zZWFyY2hfcW9zKGRzdF9pcCk7CisJaWYgKGVudHJ5ICE9IE5VTEwpIHsKKwkJZW50cnktPnFvcyA9ICpxb3M7CisJCXJldHVybiBlbnRyeTsKKwl9CisKKwllbnRyeSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdG1fbXBvYV9xb3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZW50cnkgPT0gTlVMTCkgeworCQlwcmludGsoIm1wb2E6IGF0bV9tcG9hX2FkZF9xb3M6IG91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gZW50cnk7CisJfQorCisJZW50cnktPmlwYWRkciA9IGRzdF9pcDsKKwllbnRyeS0+cW9zID0gKnFvczsKKworCWVudHJ5LT5uZXh0ID0gcW9zX2hlYWQ7CisJcW9zX2hlYWQgPSBlbnRyeTsKKworCXJldHVybiBlbnRyeTsKK30KKworc3RydWN0IGF0bV9tcG9hX3FvcyAqYXRtX21wb2Ffc2VhcmNoX3Fvcyh1aW50MzJfdCBkc3RfaXApCit7CisJc3RydWN0IGF0bV9tcG9hX3FvcyAqcW9zOworCisJcW9zID0gcW9zX2hlYWQ7CisJd2hpbGUoIHFvcyAhPSBOVUxMICl7CisJCWlmKHFvcy0+aXBhZGRyID09IGRzdF9pcCkgeworCQkJYnJlYWs7CisJCX0KKwkJcW9zID0gcW9zLT5uZXh0OworCX0KKworCXJldHVybiBxb3M7Cit9ICAgICAgICAKKworLyoKKyAqIFJldHVybnMgMCBmb3IgZmFpbHVyZQorICovCitpbnQgYXRtX21wb2FfZGVsZXRlX3FvcyhzdHJ1Y3QgYXRtX21wb2FfcW9zICplbnRyeSkKK3sKKworCXN0cnVjdCBhdG1fbXBvYV9xb3MgKmN1cnI7CisKKwlpZiAoZW50cnkgPT0gTlVMTCkgcmV0dXJuIDA7CisJaWYgKGVudHJ5ID09IHFvc19oZWFkKSB7CisJCXFvc19oZWFkID0gcW9zX2hlYWQtPm5leHQ7CisJCWtmcmVlKGVudHJ5KTsKKwkJcmV0dXJuIDE7CisJfQorCisJY3VyciA9IHFvc19oZWFkOworCXdoaWxlIChjdXJyICE9IE5VTEwpIHsKKwkJaWYgKGN1cnItPm5leHQgPT0gZW50cnkpIHsKKwkJCWN1cnItPm5leHQgPSBlbnRyeS0+bmV4dDsKKwkJCWtmcmVlKGVudHJ5KTsKKwkJCXJldHVybiAxOworCQl9CisJCWN1cnIgPSBjdXJyLT5uZXh0OworCX0KKworCXJldHVybiAwOworfQorCisvKiB0aGlzIGlzIGJ1Z2dlcmVkIC0gd2UgbmVlZCBsb2NraW5nIGZvciBxb3NfaGVhZCAqLwordm9pZCBhdG1fbXBvYV9kaXNwX3FvcyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCit7CisJdW5zaWduZWQgY2hhciAqaXA7CisJY2hhciBpcGFkZHJbMTZdOworCXN0cnVjdCBhdG1fbXBvYV9xb3MgKnFvczsKKworCXFvcyA9IHFvc19oZWFkOworCXNlcV9wcmludGYobSwgIlFvUyBlbnRyaWVzIGZvciBzaG9ydGN1dHM6XG4iKTsKKwlzZXFfcHJpbnRmKG0sICJJUCBhZGRyZXNzXG4gIFRYOm1heF9wY3IgcGNyICAgICBtaW5fcGNyIG1heF9jZHYgbWF4X3NkdVxuICBSWDptYXhfcGNyIHBjciAgICAgbWluX3BjciBtYXhfY2R2IG1heF9zZHVcbiIpOworCisJaXBhZGRyW3NpemVvZihpcGFkZHIpLTFdID0gJ1wwJzsKKwl3aGlsZSAocW9zICE9IE5VTEwpIHsKKwkJaXAgPSAodW5zaWduZWQgY2hhciAqKSZxb3MtPmlwYWRkcjsKKwkJc3ByaW50ZihpcGFkZHIsICIldS4ldS4ldS4ldSIsIE5JUFFVQUQoaXApKTsKKwkJc2VxX3ByaW50ZihtLCAiJXUuJXUuJXUuJXVcbiAgICAgJS03ZCAlLTdkICUtN2QgJS03ZCAlLTdkXG4gICAgICUtN2QgJS03ZCAlLTdkICUtN2QgJS03ZFxuIiwKKwkJCQlOSVBRVUFEKGlwYWRkciksCisJCQkJcW9zLT5xb3MudHh0cC5tYXhfcGNyLCBxb3MtPnFvcy50eHRwLnBjciwgcW9zLT5xb3MudHh0cC5taW5fcGNyLCBxb3MtPnFvcy50eHRwLm1heF9jZHYsIHFvcy0+cW9zLnR4dHAubWF4X3NkdSwKKwkJCQlxb3MtPnFvcy5yeHRwLm1heF9wY3IsIHFvcy0+cW9zLnJ4dHAucGNyLCBxb3MtPnFvcy5yeHRwLm1pbl9wY3IsIHFvcy0+cW9zLnJ4dHAubWF4X2NkdiwgcW9zLT5xb3Mucnh0cC5tYXhfc2R1KTsKKwkJcW9zID0gcW9zLT5uZXh0OworCX0KK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpmaW5kX2xlY19ieV9pdGZudW0oaW50IGl0ZikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWNoYXIgbmFtZVtJRk5BTVNJWl07CisKKwlzcHJpbnRmKG5hbWUsICJsZWMlZCIsIGl0Zik7CisJZGV2ID0gZGV2X2dldF9ieV9uYW1lKG5hbWUpOworCQorCXJldHVybiBkZXY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXBvYV9jbGllbnQgKmFsbG9jX21wYyh2b2lkKQoreworCXN0cnVjdCBtcG9hX2NsaWVudCAqbXBjOworCisJbXBjID0ga21hbGxvYyhzaXplb2YgKHN0cnVjdCBtcG9hX2NsaWVudCksIEdGUF9LRVJORUwpOworCWlmIChtcGMgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KG1wYywgMCwgc2l6ZW9mKHN0cnVjdCBtcG9hX2NsaWVudCkpOworCXJ3bG9ja19pbml0KCZtcGMtPmluZ3Jlc3NfbG9jayk7CisJcndsb2NrX2luaXQoJm1wYy0+ZWdyZXNzX2xvY2spOworCW1wYy0+bmV4dCA9IG1wY3M7CisJYXRtX21wb2FfaW5pdF9jYWNoZShtcGMpOworCisJbXBjLT5wYXJhbWV0ZXJzLm1wY19wMSA9IE1QQ19QMTsKKwltcGMtPnBhcmFtZXRlcnMubXBjX3AyID0gTVBDX1AyOworCW1lbXNldChtcGMtPnBhcmFtZXRlcnMubXBjX3AzLDAsc2l6ZW9mKG1wYy0+cGFyYW1ldGVycy5tcGNfcDMpKTsKKwltcGMtPnBhcmFtZXRlcnMubXBjX3A0ID0gTVBDX1A0OworCW1wYy0+cGFyYW1ldGVycy5tcGNfcDUgPSBNUENfUDU7IAorCW1wYy0+cGFyYW1ldGVycy5tcGNfcDYgPSBNUENfUDY7CisJCisJbXBjcyA9IG1wYzsKKwkKKwlyZXR1cm4gbXBjOworfQorCisvKgorICoKKyAqIHN0YXJ0X21wYygpIHB1dHMgdGhlIE1QQyBvbiBsaW5lLiBBbGwgdGhlIHBhY2tldHMgZGVzdGluZWQKKyAqIHRvIHRoZSBsZWMgdW5kZXJuZWF0aCB1cyBhcmUgbm93IGJlaW5nIG1vbml0b3JlZCBhbmQgCisgKiBzaG9ydGN1dHMgd2lsbCBiZSBlc3RhYmxpc2hlZC4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIHN0YXJ0X21wYyhzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYywgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkKKwlkcHJpbnRrKCJtcG9hOiAoJXMpIHN0YXJ0X21wYzpcbiIsIG1wYy0+ZGV2LT5uYW1lKTsgCisJaWYgKGRldi0+aGFyZF9zdGFydF94bWl0ID09IE5VTEwpIHsKKwkJcHJpbnRrKCJtcG9hOiAoJXMpIHN0YXJ0X21wYzogZGV2LT5oYXJkX3N0YXJ0X3htaXQgPT0gTlVMTCwgbm90IHN0YXJ0aW5nXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKwltcGMtPm9sZF9oYXJkX3N0YXJ0X3htaXQgPSBkZXYtPmhhcmRfc3RhcnRfeG1pdDsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IG1wY19zZW5kX3BhY2tldDsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgc3RvcF9tcGMoc3RydWN0IG1wb2FfY2xpZW50ICptcGMpCit7CisJCisJZHByaW50aygibXBvYTogKCVzKSBzdG9wX21wYzoiLCBtcGMtPmRldi0+bmFtZSk7IAorCisJLyogTGV0cyBub3QgbnVsbGlmeSBsZWMgZGV2aWNlJ3MgZGV2LT5oYXJkX3N0YXJ0X3htaXQgKi8KKwlpZiAobXBjLT5kZXYtPmhhcmRfc3RhcnRfeG1pdCAhPSBtcGNfc2VuZF9wYWNrZXQpIHsKKwkJZHByaW50aygiIG1wYyBhbHJlYWR5IHN0b3BwZWQsIG5vdCBmYXRhbFxuIik7CisJCXJldHVybjsKKwl9CisJZHByaW50aygiXG4iKTsKKwltcGMtPmRldi0+aGFyZF9zdGFydF94bWl0ID0gbXBjLT5vbGRfaGFyZF9zdGFydF94bWl0OworCW1wYy0+b2xkX2hhcmRfc3RhcnRfeG1pdCA9IE5VTEw7CisJLyogY2xvc2Vfc2hvcnRjdXRzKG1wYyk7ICAgID8/PyBGSVhNRSAqLworCQorCXJldHVybjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKm1wb2FfZGV2aWNlX3R5cGVfc3RyaW5nKGNoYXIgdHlwZSkgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOworCitzdGF0aWMgY29uc3QgY2hhciAqbXBvYV9kZXZpY2VfdHlwZV9zdHJpbmcoY2hhciB0eXBlKQoreworCXN3aXRjaCh0eXBlKSB7CisJY2FzZSBOT05fTVBPQToKKwkJcmV0dXJuICJub24tTVBPQSBkZXZpY2UiOworCQlicmVhazsKKwljYXNlIE1QUzoKKwkJcmV0dXJuICJNUFMiOworCQlicmVhazsKKwljYXNlIE1QQzoKKwkJcmV0dXJuICJNUEMiOworCQlicmVhazsKKwljYXNlIE1QU19BTkRfTVBDOgorCQlyZXR1cm4gImJvdGggTVBTIGFuZCBNUEMiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gInVuc3BlY2lmaWVkIChub24tTVBPQSkgZGV2aWNlIjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuICIiOyAvKiBub3QgcmVhY2hlZCAqLworfQorCisvKgorICogbGVjIGRldmljZSBjYWxscyB0aGlzIHZpYSBpdHMgZGV2LT5wcml2LT5sYW5lMl9vcHMtPmFzc29jaWF0ZV9pbmRpY2F0b3IoKQorICogd2hlbiBpdCBzZWVzIGEgVExWIGluIExFX0FSUCBwYWNrZXQuCisgKiBXZSBmaWxsIGluIHRoZSBwb2ludGVyIGFib3ZlIHdoZW4gd2Ugc2VlIGEgTEFORTIgbGVjIGluaXRpYWxpemluZworICogU2VlIExBTkUyIHNwZWMgMy4xLjUKKyAqCisgKiBRdWl0ZSBhIGJpZyBhbmQgdWdseSBmdW5jdGlvbiBidXQgd2hlbiB5b3UgbG9vayBhdCBpdAorICogYWxsIGl0IGRvZXMgaXMgdG8gdHJ5IHRvIGxvY2F0ZSBhbmQgcGFyc2UgTVBPQSBEZXZpY2UKKyAqIFR5cGUgVExWLgorICogV2UgZ2l2ZSBvdXIgbGVjIGEgcG9pbnRlciB0byB0aGlzIGZ1bmN0aW9uIGFuZCB3aGVuIHRoZQorICogbGVjIHNlZXMgYSBUTFYgaXQgdXNlcyB0aGUgcG9pbnRlciB0byBjYWxsIHRoaXMgZnVuY3Rpb24uCisgKgorICovCitzdGF0aWMgdm9pZCBsYW5lMl9hc3NvY19pbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdWludDhfdCAqbWFjX2FkZHIsCisJCQkgICAgdWludDhfdCAqdGx2cywgdWludDMyX3Qgc2l6ZW9mdGx2cykKK3sKKwl1aW50MzJfdCB0eXBlOworCXVpbnQ4X3QgbGVuZ3RoLCBtcG9hX2RldmljZV90eXBlLCBudW1iZXJfb2ZfbXBzX21hY3M7CisJdWludDhfdCAqZW5kX29mX3RsdnM7CisJc3RydWN0IG1wb2FfY2xpZW50ICptcGM7CisJCisJbXBvYV9kZXZpY2VfdHlwZSA9IG51bWJlcl9vZl9tcHNfbWFjcyA9IDA7IC8qIHNpbGVuY2UgZ2NjICovCisJZHByaW50aygibXBvYTogKCVzKSBsYW5lMl9hc3NvY19pbmQ6IHJlY2VpdmVkIFRMVihzKSwgIiwgZGV2LT5uYW1lKTsKKwlkcHJpbnRrKCJ0b3RhbCBsZW5ndGggb2YgYWxsIFRMVnMgJWRcbiIsIHNpemVvZnRsdnMpOworCW1wYyA9IGZpbmRfbXBjX2J5X2xlYyhkZXYpOyAvKiBTYW1wby1GaXg6IG1vdmVkIGhlcmUgZnJvbSBiZWxvdyAqLworCWlmIChtcGMgPT0gTlVMTCkgeworCQlwcmludGsoIm1wb2E6ICglcykgbGFuZTJfYXNzb2NfaW5kOiBubyBtcGNcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisJZW5kX29mX3RsdnMgPSB0bHZzICsgc2l6ZW9mdGx2czsKKwl3aGlsZSAoZW5kX29mX3RsdnMgLSB0bHZzID49IDUpIHsKKwkJdHlwZSA9ICh0bHZzWzBdIDw8IDI0KSB8ICh0bHZzWzFdIDw8IDE2KSB8ICh0bHZzWzJdIDw8IDgpIHwgdGx2c1szXTsKKwkJbGVuZ3RoID0gdGx2c1s0XTsKKwkJdGx2cyArPSA1OworCQlkcHJpbnRrKCIgICAgdHlwZSAweCV4IGxlbmd0aCAlMDJ4XG4iLCB0eXBlLCBsZW5ndGgpOworCQlpZiAodGx2cyArIGxlbmd0aCA+IGVuZF9vZl90bHZzKSB7CisJCQlwcmludGsoIlRMViB2YWx1ZSBleHRlbmRzIHBhc3QgaXRzIGJ1ZmZlciwgYWJvcnRpbmcgcGFyc2VcbiIpOworCQkJcmV0dXJuOworCQl9CisJCQorCQlpZiAodHlwZSA9PSAwKSB7CisJCQlwcmludGsoIm1wb2E6ICglcykgbGFuZTJfYXNzb2NfaW5kOiBUTFYgdHlwZSB3YXMgMCwgcmV0dXJuaW5nXG4iLCBkZXYtPm5hbWUpOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKHR5cGUgIT0gVExWX01QT0FfREVWSUNFX1RZUEUpIHsKKwkJCXRsdnMgKz0gbGVuZ3RoOworCQkJY29udGludWU7ICAvKiBza2lwIG90aGVyIFRMVnMgKi8KKwkJfQorCQltcG9hX2RldmljZV90eXBlID0gKnRsdnMrKzsKKwkJbnVtYmVyX29mX21wc19tYWNzID0gKnRsdnMrKzsKKwkJZHByaW50aygibXBvYTogKCVzKSBNUE9BIGRldmljZSB0eXBlICclcycsICIsIGRldi0+bmFtZSwgbXBvYV9kZXZpY2VfdHlwZV9zdHJpbmcobXBvYV9kZXZpY2VfdHlwZSkpOworCQlpZiAobXBvYV9kZXZpY2VfdHlwZSA9PSBNUFNfQU5EX01QQyAmJgorCQkgICAgbGVuZ3RoIDwgKDQyICsgbnVtYmVyX29mX21wc19tYWNzKkVUSF9BTEVOKSkgeyAvKiA6KSAqLworCQkJcHJpbnRrKCJcbm1wb2E6ICglcykgbGFuZTJfYXNzb2NfaW5kOiBzaG9ydCBNUE9BIERldmljZSBUeXBlIFRMVlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKChtcG9hX2RldmljZV90eXBlID09IE1QUyB8fCBtcG9hX2RldmljZV90eXBlID09IE1QQykKKwkJICAgICYmIGxlbmd0aCA8IDIyICsgbnVtYmVyX29mX21wc19tYWNzKkVUSF9BTEVOKSB7CisJCQlwcmludGsoIlxubXBvYTogKCVzKSBsYW5lMl9hc3NvY19pbmQ6IHNob3J0IE1QT0EgRGV2aWNlIFR5cGUgVExWXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobXBvYV9kZXZpY2VfdHlwZSAhPSBNUFMgJiYgbXBvYV9kZXZpY2VfdHlwZSAhPSBNUFNfQU5EX01QQykgeworCQkJZHByaW50aygiaWdub3Jpbmcgbm9uLU1QUyBkZXZpY2VcbiIpOworCQkJaWYgKG1wb2FfZGV2aWNlX3R5cGUgPT0gTVBDKSB0bHZzICs9IDIwOworCQkJY29udGludWU7ICAvKiB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIE1QU3MgKi8KKwkJfQorCQlpZiAobnVtYmVyX29mX21wc19tYWNzID09IDAgJiYgbXBvYV9kZXZpY2VfdHlwZSA9PSBNUFNfQU5EX01QQykgeworCQkJcHJpbnRrKCJcbm1wb2E6ICglcykgbGFuZTJfYXNzb2NfaW5kOiBNUFNfQU5EX01QQyBoYXMgemVybyBNQUNzXG4iLCBkZXYtPm5hbWUpOworCQkJY29udGludWU7ICAvKiBzb21lb25lIHNob3VsZCByZWFkIHRoZSBzcGVjICovCisJCX0KKwkJZHByaW50aygidGhpcyBNUFMgaGFzICVkIE1BQyBhZGRyZXNzZXNcbiIsIG51bWJlcl9vZl9tcHNfbWFjcyk7CisJCQorCQkvKiBvaywgbm93IHdlIGNhbiBnbyBhbmQgdGVsbCBvdXIgZGFlbW9uIHRoZSBjb250cm9sIGFkZHJlc3Mgb2YgTVBTICovCisJCXNlbmRfc2V0X21wc19jdHJsX2FkZHIodGx2cywgbXBjKTsKKwkJCisJCXRsdnMgPSBjb3B5X21hY3MobXBjLCBtYWNfYWRkciwgdGx2cywgbnVtYmVyX29mX21wc19tYWNzLCBtcG9hX2RldmljZV90eXBlKTsKKwkJaWYgKHRsdnMgPT0gTlVMTCkgcmV0dXJuOworCX0KKwlpZiAoZW5kX29mX3RsdnMgLSB0bHZzICE9IDApCisJCXByaW50aygibXBvYTogKCVzKSBsYW5lMl9hc3NvY19pbmQ6IGlnbm9yaW5nICVaZCBieXRlcyBvZiB0cmFpbGluZyBUTFYgY2FyYmFnZVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZW5kX29mX3RsdnMgLSB0bHZzKTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBTdG9yZSBhdCBsZWFzdCBhZHZlcnRpemluZyByb3V0ZXIncyBNQUMgYWRkcmVzcworICogcGx1cyB0aGUgcG9zc2libGUgTUFDIGFkZHJlc3MoZXMpIHRvIG1wYy0+bXBzX21hY3MuCisgKiBGb3IgYSBmcmVzaGx5IGFsbG9jYXRlZCBNUE9BIGNsaWVudCBtcGMtPm1wc19tYWNzID09IDAuCisgKi8KK3N0YXRpYyB1aW50OF90ICpjb3B5X21hY3Moc3RydWN0IG1wb2FfY2xpZW50ICptcGMsIHVpbnQ4X3QgKnJvdXRlcl9tYWMsCisJCQkgIHVpbnQ4X3QgKnRsdnMsIHVpbnQ4X3QgbXBzX21hY3MsIHVpbnQ4X3QgZGV2aWNlX3R5cGUpCit7CisJaW50IG51bV9tYWNzOworCW51bV9tYWNzID0gKG1wc19tYWNzID4gMSkgPyBtcHNfbWFjcyA6IDE7CisKKwlpZiAobXBjLT5udW1iZXJfb2ZfbXBzX21hY3MgIT0gbnVtX21hY3MpIHsgLyogbmVlZCB0byByZWFsbG9jYXRlPyAqLworCQlpZiAobXBjLT5udW1iZXJfb2ZfbXBzX21hY3MgIT0gMCkga2ZyZWUobXBjLT5tcHNfbWFjcyk7CisJCW1wYy0+bnVtYmVyX29mX21wc19tYWNzID0gMDsKKwkJbXBjLT5tcHNfbWFjcyA9IGttYWxsb2MobnVtX21hY3MqRVRIX0FMRU4sIEdGUF9LRVJORUwpOworCQlpZiAobXBjLT5tcHNfbWFjcyA9PSBOVUxMKSB7CisJCQlwcmludGsoIm1wb2E6ICglcykgY29weV9tYWNzOiBvdXQgb2YgbWVtXG4iLCBtcGMtPmRldi0+bmFtZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKwltZW1jcHkobXBjLT5tcHNfbWFjcywgcm91dGVyX21hYywgRVRIX0FMRU4pOworCXRsdnMgKz0gMjA7IGlmIChkZXZpY2VfdHlwZSA9PSBNUFNfQU5EX01QQykgdGx2cyArPSAyMDsKKwlpZiAobXBzX21hY3MgPiAwKQorCQltZW1jcHkobXBjLT5tcHNfbWFjcywgdGx2cywgbXBzX21hY3MqRVRIX0FMRU4pOworCXRsdnMgKz0gbXBzX21hY3MqRVRIX0FMRU47CisJbXBjLT5udW1iZXJfb2ZfbXBzX21hY3MgPSBudW1fbWFjczsKKworCXJldHVybiB0bHZzOworfQorCitzdGF0aWMgaW50IHNlbmRfdmlhX3Nob3J0Y3V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBtcG9hX2NsaWVudCAqbXBjKQoreworCWluX2NhY2hlX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwljaGFyICpidWZmOworCXVpbnQzMl90IGlwYWRkciA9IDA7CisKKwlzdGF0aWMgc3RydWN0IHsKKwkJc3RydWN0IGxsY19zbmFwX2hkciBoZHI7CisJCXVpbnQzMl90IHRhZzsKKwl9IHRhZ2dlZF9sbGNfc25hcF9oZHIgPSB7CisJCXsweGFhLCAweGFhLCAweDAzLCB7MHgwMCwgMHgwMCwgMHgwMH0sIHsweDg4LCAweDRjfX0sCisJCTAKKwl9OworCisJYnVmZiA9IHNrYi0+ZGF0YSArIG1wYy0+ZGV2LT5oYXJkX2hlYWRlcl9sZW47CisJaXBoID0gKHN0cnVjdCBpcGhkciAqKWJ1ZmY7CisJaXBhZGRyID0gaXBoLT5kYWRkcjsKKworCWRkcHJpbnRrKCJtcG9hOiAoJXMpIHNlbmRfdmlhX3Nob3J0Y3V0OiBpcGFkZHIgMHgleFxuIiwgbXBjLT5kZXYtPm5hbWUsIGlwYWRkcik7ICAgICAgICAKKworCWVudHJ5ID0gbXBjLT5pbl9vcHMtPmdldChpcGFkZHIsIG1wYyk7CisJaWYgKGVudHJ5ID09IE5VTEwpIHsKKwkJZW50cnkgPSBtcGMtPmluX29wcy0+YWRkX2VudHJ5KGlwYWRkciwgbXBjKTsKKwkJaWYgKGVudHJ5ICE9IE5VTEwpIG1wYy0+aW5fb3BzLT5wdXQoZW50cnkpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKG1wYy0+aW5fb3BzLT5jYWNoZV9oaXQoZW50cnksIG1wYykgIT0gT1BFTil7ICAgLyogdGhyZXNob2xkIG5vdCBleGNlZWRlZCBvciBWQ0Mgbm90IHJlYWR5ICovCisJCWRkcHJpbnRrKCJtcG9hOiAoJXMpIHNlbmRfdmlhX3Nob3J0Y3V0OiBjYWNoZV9oaXQ6IHJldHVybnMgIT0gT1BFTlxuIiwgbXBjLT5kZXYtPm5hbWUpOyAgICAgICAgCisJCW1wYy0+aW5fb3BzLT5wdXQoZW50cnkpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkZHByaW50aygibXBvYTogKCVzKSBzZW5kX3ZpYV9zaG9ydGN1dDogdXNpbmcgc2hvcnRjdXRcbiIsIG1wYy0+ZGV2LT5uYW1lKTsgICAgICAgIAorCS8qIE1QT0Egc3BlYyBBLjEuNCwgTVBPQSBjbGllbnQgbXVzdCBkZWNyZW1lbnQgSVAgdHRsIGF0IGxlYXN0IGJ5IG9uZSAqLworCWlmIChpcGgtPnR0bCA8PSAxKSB7CisJCWRkcHJpbnRrKCJtcG9hOiAoJXMpIHNlbmRfdmlhX3Nob3J0Y3V0OiBJUCB0dGwgPSAldSwgdXNpbmcgTEFORVxuIiwgbXBjLT5kZXYtPm5hbWUsIGlwaC0+dHRsKTsgICAgICAgIAorCQltcGMtPmluX29wcy0+cHV0KGVudHJ5KTsKKwkJcmV0dXJuIDE7CisJfQorCWlwaC0+dHRsLS07CisJaXBoLT5jaGVjayA9IDA7CisJaXBoLT5jaGVjayA9IGlwX2Zhc3RfY3N1bSgodW5zaWduZWQgY2hhciAqKWlwaCwgaXBoLT5paGwpOworCisJaWYgKGVudHJ5LT5jdHJsX2luZm8udGFnICE9IDApIHsKKwkJZGRwcmludGsoIm1wb2E6ICglcykgc2VuZF92aWFfc2hvcnRjdXQ6IGFkZGluZyB0YWcgMHgleFxuIiwgbXBjLT5kZXYtPm5hbWUsIGVudHJ5LT5jdHJsX2luZm8udGFnKTsKKwkJdGFnZ2VkX2xsY19zbmFwX2hkci50YWcgPSBlbnRyeS0+Y3RybF9pbmZvLnRhZzsKKwkJc2tiX3B1bGwoc2tiLCBFVEhfSExFTik7ICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgcmlkIG9mIEV0aCBoZWFkZXIgKi8KKwkJc2tiX3B1c2goc2tiLCBzaXplb2YodGFnZ2VkX2xsY19zbmFwX2hkcikpOyAgICAvKiBhZGQgTExDL1NOQVAgaGVhZGVyICAgKi8KKwkJbWVtY3B5KHNrYi0+ZGF0YSwgJnRhZ2dlZF9sbGNfc25hcF9oZHIsIHNpemVvZih0YWdnZWRfbGxjX3NuYXBfaGRyKSk7CisJfSBlbHNlIHsKKwkJc2tiX3B1bGwoc2tiLCBFVEhfSExFTik7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IHJpZCBvZiBFdGggaGVhZGVyICovCisJCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBsbGNfc25hcF9oZHIpKTsgICAgIC8qIGFkZCBMTEMvU05BUCBoZWFkZXIgKyB0YWcgICovCisJCW1lbWNweShza2ItPmRhdGEsICZsbGNfc25hcF9tcG9hX2RhdGEsIHNpemVvZihzdHJ1Y3QgbGxjX3NuYXBfaGRyKSk7CisJfQorCisJYXRvbWljX2FkZChza2ItPnRydWVzaXplLCAmc2tfYXRtKGVudHJ5LT5zaG9ydGN1dCktPnNrX3dtZW1fYWxsb2MpOworCUFUTV9TS0Ioc2tiKS0+YXRtX29wdGlvbnMgPSBlbnRyeS0+c2hvcnRjdXQtPmF0bV9vcHRpb25zOworCWVudHJ5LT5zaG9ydGN1dC0+c2VuZChlbnRyeS0+c2hvcnRjdXQsIHNrYik7CisJZW50cnktPnBhY2tldHNfZndkZWQrKzsKKwltcGMtPmluX29wcy0+cHV0KGVudHJ5KTsKKworCXJldHVybiAwOworfQorCisvKgorICogUHJvYmFibHkgbmVlZHMgc29tZSBlcnJvciBjaGVja3MgYW5kIGxvY2tpbmcsIG5vdCBzdXJlLi4uCisgKi8KK3N0YXRpYyBpbnQgbXBjX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYzsKKwlzdHJ1Y3QgZXRoaGRyICpldGg7CisJaW50IGkgPSAwOworCQorCW1wYyA9IGZpbmRfbXBjX2J5X2xlYyhkZXYpOyAvKiB0aGlzIHNob3VsZCBORVZFUiBmYWlsICovCisJaWYobXBjID09IE5VTEwpIHsKKwkJcHJpbnRrKCJtcG9hOiAoJXMpIG1wY19zZW5kX3BhY2tldDogbm8gTVBDIGZvdW5kXG4iLCBkZXYtPm5hbWUpOworCQlnb3RvIG5vbl9pcDsKKwl9CisKKwlldGggPSAoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YTsKKwlpZiAoZXRoLT5oX3Byb3RvICE9IGh0b25zKEVUSF9QX0lQKSkKKwkJZ290byBub25faXA7IC8qIE11bHRpLVByb3RvY29sIE92ZXIgQVRNIDotKSAqLworCisJd2hpbGUgKGkgPCBtcGMtPm51bWJlcl9vZl9tcHNfbWFjcykgeworCQlpZiAobWVtY21wKGV0aC0+aF9kZXN0LCAobXBjLT5tcHNfbWFjcyArIGkqRVRIX0FMRU4pLCBFVEhfQUxFTikgPT0gMCkKKwkJCWlmICggc2VuZF92aWFfc2hvcnRjdXQoc2tiLCBtcGMpID09IDAgKSAgICAgICAgICAgLyogdHJ5IHNob3J0Y3V0ICovCisJCQkJcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VjY2VzcyEgICAgICovCisJCWkrKzsKKwl9CisKKyBub25faXA6CisJcmV0dmFsID0gbXBjLT5vbGRfaGFyZF9zdGFydF94bWl0KHNrYixkZXYpOworCQorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgYXRtX21wb2FfdmNjX2F0dGFjaChzdHJ1Y3QgYXRtX3ZjYyAqdmNjLCB2b2lkIF9fdXNlciAqYXJnKQoreworCWludCBieXRlc19sZWZ0OworCXN0cnVjdCBtcG9hX2NsaWVudCAqbXBjOworCXN0cnVjdCBhdG1tcGNfaW9jIGlvY19kYXRhOworCWluX2NhY2hlX2VudHJ5ICppbl9lbnRyeTsKKwl1aW50MzJfdCAgaXBhZGRyOworCXVuc2lnbmVkIGNoYXIgKmlwOworCisJYnl0ZXNfbGVmdCA9IGNvcHlfZnJvbV91c2VyKCZpb2NfZGF0YSwgYXJnLCBzaXplb2Yoc3RydWN0IGF0bW1wY19pb2MpKTsKKwlpZiAoYnl0ZXNfbGVmdCAhPSAwKSB7CisJCXByaW50aygibXBvYTogbXBjX3ZjY19hdHRhY2g6IFNob3J0IHJlYWQgKG1pc3NlZCAlZCBieXRlcykgZnJvbSB1c2VybGFuZFxuIiwgYnl0ZXNfbGVmdCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlpcGFkZHIgPSBpb2NfZGF0YS5pcGFkZHI7CisJaWYgKGlvY19kYXRhLmRldl9udW0gPCAwIHx8IGlvY19kYXRhLmRldl9udW0gPj0gTUFYX0xFQ19JVEYpCisJCXJldHVybiAtRUlOVkFMOworCQorCW1wYyA9IGZpbmRfbXBjX2J5X2l0Zm51bShpb2NfZGF0YS5kZXZfbnVtKTsKKwlpZiAobXBjID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCQorCWlmIChpb2NfZGF0YS50eXBlID09IE1QQ19TT0NLRVRfSU5HUkVTUykgeworCQlpbl9lbnRyeSA9IG1wYy0+aW5fb3BzLT5nZXQoaXBhZGRyLCBtcGMpOworCQlpZiAoaW5fZW50cnkgPT0gTlVMTCB8fCBpbl9lbnRyeS0+ZW50cnlfc3RhdGUgPCBJTkdSRVNTX1JFU09MVkVEKSB7CisJCQlwcmludGsoIm1wb2E6ICglcykgbXBjX3ZjY19hdHRhY2g6IGRpZCBub3QgZmluZCBSRVNPTFZFRCBlbnRyeSBmcm9tIGluZ3Jlc3MgY2FjaGVcbiIsCisJCQkJbXBjLT5kZXYtPm5hbWUpOworCQkJaWYgKGluX2VudHJ5ICE9IE5VTEwpIG1wYy0+aW5fb3BzLT5wdXQoaW5fZW50cnkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaXAgPSAodW5zaWduZWQgY2hhciopJmluX2VudHJ5LT5jdHJsX2luZm8uaW5fZHN0X2lwOworCQlwcmludGsoIm1wb2E6ICglcykgbXBjX3ZjY19hdHRhY2g6IGF0dGFjaGluZyBpbmdyZXNzIFNWQywgZW50cnkgPSAldS4ldS4ldS4ldVxuIiwKKwkJICAgICAgIG1wYy0+ZGV2LT5uYW1lLCBpcFswXSwgaXBbMV0sIGlwWzJdLCBpcFszXSk7CisJCWluX2VudHJ5LT5zaG9ydGN1dCA9IHZjYzsKKwkJbXBjLT5pbl9vcHMtPnB1dChpbl9lbnRyeSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJtcG9hOiAoJXMpIG1wY192Y2NfYXR0YWNoOiBhdHRhY2hpbmcgZWdyZXNzIFNWQ1xuIiwgbXBjLT5kZXYtPm5hbWUpOworCX0KKworCXZjYy0+cHJvdG9fZGF0YSA9IG1wYy0+ZGV2OworCXZjYy0+cHVzaCA9IG1wY19wdXNoOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKgorICovCitzdGF0aWMgdm9pZCBtcGNfdmNjX2Nsb3NlKHN0cnVjdCBhdG1fdmNjICp2Y2MsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1wb2FfY2xpZW50ICptcGM7CisJaW5fY2FjaGVfZW50cnkgKmluX2VudHJ5OworCWVnX2NhY2hlX2VudHJ5ICplZ19lbnRyeTsKKwkKKwltcGMgPSBmaW5kX21wY19ieV9sZWMoZGV2KTsKKwlpZiAobXBjID09IE5VTEwpIHsKKwkJcHJpbnRrKCJtcG9hOiAoJXMpIG1wY192Y2NfY2xvc2U6IGNsb3NlIGZvciB1bmtub3duIE1QQ1xuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWRwcmludGsoIm1wb2E6ICglcykgbXBjX3ZjY19jbG9zZTpcbiIsIGRldi0+bmFtZSk7CisJaW5fZW50cnkgPSBtcGMtPmluX29wcy0+Z2V0X2J5X3ZjYyh2Y2MsIG1wYyk7CisJaWYgKGluX2VudHJ5KSB7CisJCXVuc2lnbmVkIGNoYXIgKmlwIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSA9CisJCSAgICAodW5zaWduZWQgY2hhciAqKSZpbl9lbnRyeS0+Y3RybF9pbmZvLmluX2RzdF9pcDsKKwkJZHByaW50aygibXBvYTogKCVzKSBtcGNfdmNjX2Nsb3NlOiBpbmdyZXNzIFNWQyBjbG9zZWQgaXAgPSAldS4ldS4ldS4ldVxuIiwKKwkJICAgICAgIG1wYy0+ZGV2LT5uYW1lLCBpcFswXSwgaXBbMV0sIGlwWzJdLCBpcFszXSk7CisJCWluX2VudHJ5LT5zaG9ydGN1dCA9IE5VTEw7CisJCW1wYy0+aW5fb3BzLT5wdXQoaW5fZW50cnkpOworCX0KKwllZ19lbnRyeSA9IG1wYy0+ZWdfb3BzLT5nZXRfYnlfdmNjKHZjYywgbXBjKTsKKwlpZiAoZWdfZW50cnkpIHsKKwkJZHByaW50aygibXBvYTogKCVzKSBtcGNfdmNjX2Nsb3NlOiBlZ3Jlc3MgU1ZDIGNsb3NlZFxuIiwgbXBjLT5kZXYtPm5hbWUpOworCQllZ19lbnRyeS0+c2hvcnRjdXQgPSBOVUxMOworCQltcGMtPmVnX29wcy0+cHV0KGVnX2VudHJ5KTsKKwl9CisKKwlpZiAoaW5fZW50cnkgPT0gTlVMTCAmJiBlZ19lbnRyeSA9PSBOVUxMKQorCQlkcHJpbnRrKCJtcG9hOiAoJXMpIG1wY192Y2NfY2xvc2U6ICB1bnVzZWQgdmNjIGNsb3NlZFxuIiwgZGV2LT5uYW1lKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgbXBjX3B1c2goc3RydWN0IGF0bV92Y2MgKnZjYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopdmNjLT5wcm90b19kYXRhOworCXN0cnVjdCBza19idWZmICpuZXdfc2tiOworCWVnX2NhY2hlX2VudHJ5ICplZzsKKwlzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYzsKKwl1aW50MzJfdCB0YWc7CisJY2hhciAqdG1wOworCQorCWRkcHJpbnRrKCJtcG9hOiAoJXMpIG1wY19wdXNoOlxuIiwgZGV2LT5uYW1lKTsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJZHByaW50aygibXBvYTogKCVzKSBtcGNfcHVzaDogbnVsbCBza2IsIGNsb3NpbmcgVkNDXG4iLCBkZXYtPm5hbWUpOworCQltcGNfdmNjX2Nsb3NlKHZjYywgZGV2KTsKKwkJcmV0dXJuOworCX0KKwkKKwlza2ItPmRldiA9IGRldjsKKwlpZiAobWVtY21wKHNrYi0+ZGF0YSwgJmxsY19zbmFwX21wb2FfY3RybCwgc2l6ZW9mKHN0cnVjdCBsbGNfc25hcF9oZHIpKSA9PSAwKSB7CisJCXN0cnVjdCBzb2NrICpzayA9IHNrX2F0bSh2Y2MpOworCisJCWRwcmludGsoIm1wb2E6ICglcykgbXBjX3B1c2g6IGNvbnRyb2wgcGFja2V0IGFycml2ZWRcbiIsIGRldi0+bmFtZSk7CisJCS8qIFBhc3MgY29udHJvbCBwYWNrZXRzIHRvIGRhZW1vbiAqLworCQlza2JfcXVldWVfdGFpbCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJCXNrLT5za19kYXRhX3JlYWR5KHNrLCBza2ItPmxlbik7CisJCXJldHVybjsKKwl9CisKKwkvKiBkYXRhIGNvbWluZyBvdmVyIHRoZSBzaG9ydGN1dCAqLworCWF0bV9yZXR1cm4odmNjLCBza2ItPnRydWVzaXplKTsKKworCW1wYyA9IGZpbmRfbXBjX2J5X2xlYyhkZXYpOworCWlmIChtcGMgPT0gTlVMTCkgeworCQlwcmludGsoIm1wb2E6ICglcykgbXBjX3B1c2g6IHVua25vd24gTVBDXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJaWYgKG1lbWNtcChza2ItPmRhdGEsICZsbGNfc25hcF9tcG9hX2RhdGFfdGFnZ2VkLCBzaXplb2Yoc3RydWN0IGxsY19zbmFwX2hkcikpID09IDApIHsgLyogTVBPQSB0YWdnZWQgZGF0YSAqLworCQlkZHByaW50aygibXBvYTogKCVzKSBtcGNfcHVzaDogdGFnZ2VkIGRhdGEgcGFja2V0IGFycml2ZWRcbiIsIGRldi0+bmFtZSk7CisKKwl9IGVsc2UgaWYgKG1lbWNtcChza2ItPmRhdGEsICZsbGNfc25hcF9tcG9hX2RhdGEsIHNpemVvZihzdHJ1Y3QgbGxjX3NuYXBfaGRyKSkgPT0gMCkgeyAvKiBNUE9BIGRhdGEgKi8KKwkJcHJpbnRrKCJtcG9hOiAoJXMpIG1wY19wdXNoOiBub24tdGFnZ2VkIGRhdGEgcGFja2V0IGFycml2ZWRcbiIsIGRldi0+bmFtZSk7CisJCXByaW50aygiICAgICAgICAgICBtcGNfcHVzaDogbm9uLXRhZ2dlZCBkYXRhIHVuc3VwcG9ydGVkLCBwdXJnaW5nXG4iKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCXByaW50aygibXBvYTogKCVzKSBtcGNfcHVzaDogZ2FyYmFnZSBhcnJpdmVkLCBwdXJnaW5nXG4iLCBkZXYtPm5hbWUpOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlyZXR1cm47CisJfQorCisJdG1wID0gc2tiLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCBsbGNfc25hcF9oZHIpOworCXRhZyA9ICoodWludDMyX3QgKil0bXA7CisKKwllZyA9IG1wYy0+ZWdfb3BzLT5nZXRfYnlfdGFnKHRhZywgbXBjKTsKKwlpZiAoZWcgPT0gTlVMTCkgeworCQlwcmludGsoIm1wb2E6ICglcykgbXBjX3B1c2g6IERpZG4ndCBmaW5kIGVncmVzcyBjYWNoZSBlbnRyeSwgdGFnID0gJXVcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsdGFnKTsKKwkJcHVyZ2VfZWdyZXNzX3Nob3J0Y3V0KHZjYywgTlVMTCk7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybjsKKwl9CisJCisJLyoKKwkgKiBTZWUgaWYgaW5ncmVzcyBNUEMgaXMgdXNpbmcgc2hvcnRjdXQgd2Ugb3BlbmVkIGFzIGEgcmV0dXJuIGNoYW5uZWwuCisJICogVGhpcyBtZWFucyB3ZSBoYXZlIGEgYmktZGlyZWN0aW9uYWwgdmNjIG9wZW5lZCBieSB1cy4KKwkgKi8gCisJaWYgKGVnLT5zaG9ydGN1dCA9PSBOVUxMKSB7CisJCWVnLT5zaG9ydGN1dCA9IHZjYzsKKwkJcHJpbnRrKCJtcG9hOiAoJXMpIG1wY19wdXNoOiBlZ3Jlc3MgU1ZDIGluIHVzZVxuIiwgZGV2LT5uYW1lKTsKKwl9CisKKwlza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgbGxjX3NuYXBfaGRyKSArIHNpemVvZih0YWcpKTsgLyogZ2V0IHJpZCBvZiBMTEMvU05BUCBoZWFkZXIgKi8KKwluZXdfc2tiID0gc2tiX3JlYWxsb2NfaGVhZHJvb20oc2tiLCBlZy0+Y3RybF9pbmZvLkRIX2xlbmd0aCk7IC8qIExMQy9TTkFQIGlzIHNob3J0ZXIgdGhhbiBNQUMgaGVhZGVyIDooICovCisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwlpZiAobmV3X3NrYiA9PSBOVUxMKXsKKwkJbXBjLT5lZ19vcHMtPnB1dChlZyk7CisJCXJldHVybjsKKwl9CisJc2tiX3B1c2gobmV3X3NrYiwgZWctPmN0cmxfaW5mby5ESF9sZW5ndGgpOyAgICAgLyogYWRkIE1BQyBoZWFkZXIgKi8KKwltZW1jcHkobmV3X3NrYi0+ZGF0YSwgZWctPmN0cmxfaW5mby5ETExfaGVhZGVyLCBlZy0+Y3RybF9pbmZvLkRIX2xlbmd0aCk7CisJbmV3X3NrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhuZXdfc2tiLCBkZXYpOworCW5ld19za2ItPm5oLnJhdyA9IG5ld19za2ItPmRhdGE7CisKKwllZy0+bGF0ZXN0X2lwX2FkZHIgPSBuZXdfc2tiLT5uaC5pcGgtPnNhZGRyOworCWVnLT5wYWNrZXRzX3JjdmQrKzsKKwltcGMtPmVnX29wcy0+cHV0KGVnKTsKKworCW1lbXNldChBVE1fU0tCKHNrYiksIDAsIHNpemVvZihzdHJ1Y3QgYXRtX3NrYl9kYXRhKSk7CisJbmV0aWZfcngobmV3X3NrYik7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXRtZGV2X29wcyBtcGNfb3BzID0geyAvKiBvbmx5IHNlbmQgaXMgcmVxdWlyZWQgKi8KKwkuY2xvc2UJPSBtcG9hZF9jbG9zZSwKKwkuc2VuZAk9IG1zZ19mcm9tX21wb2FkCit9OworCitzdGF0aWMgc3RydWN0IGF0bV9kZXYgbXBjX2RldiA9IHsKKwkub3BzCT0gJm1wY19vcHMsCisJLnR5cGUJPSAibXBjIiwKKwkubnVtYmVyCT0gNDIsCisJLmxvY2sJPSBTUElOX0xPQ0tfVU5MT0NLRUQKKwkvKiBtZW1iZXJzIG5vdCBleHBsaWNpdGx5IGluaXRpYWxpc2VkIHdpbGwgYmUgMCAqLworfTsKKworc3RhdGljIGludCBhdG1fbXBvYV9tcG9hZF9hdHRhY2ggKHN0cnVjdCBhdG1fdmNjICp2Y2MsIGludCBhcmcpCit7CisJc3RydWN0IG1wb2FfY2xpZW50ICptcGM7CisJc3RydWN0IGxlY19wcml2ICpwcml2OworCWludCBlcnI7CisJCisJaWYgKG1wY3MgPT0gTlVMTCkgeworCQlpbml0X3RpbWVyKCZtcGNfdGltZXIpOworCQltcGNfdGltZXJfcmVmcmVzaCgpOworCisJCS8qIFRoaXMgbGV0cyB1cyBub3cgaG93IG91ciBMRUNzIGFyZSBkb2luZyAqLworCQllcnIgPSByZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJm1wb2Ffbm90aWZpZXIpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZGVsX3RpbWVyKCZtcGNfdGltZXIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKwkKKwltcGMgPSBmaW5kX21wY19ieV9pdGZudW0oYXJnKTsKKwlpZiAobXBjID09IE5VTEwpIHsKKwkJZHByaW50aygibXBvYTogbXBvYWRfYXR0YWNoOiBhbGxvY2F0aW5nIG5ldyBtcGMgZm9yIGl0ZiAlZFxuIiwgYXJnKTsKKwkJbXBjID0gYWxsb2NfbXBjKCk7CisJCWlmIChtcGMgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQltcGMtPmRldl9udW0gPSBhcmc7CisJCW1wYy0+ZGV2ID0gZmluZF9sZWNfYnlfaXRmbnVtKGFyZyk7IC8qIE5VTEwgaWYgdGhlcmUgd2FzIG5vIGxlYyAqLworCX0KKwlpZiAobXBjLT5tcG9hZF92Y2MpIHsKKwkJcHJpbnRrKCJtcG9hOiBtcG9hZF9hdHRhY2g6IG1wb2FkIGlzIGFscmVhZHkgcHJlc2VudCBmb3IgaXRmICVkXG4iLCBhcmcpOworCQlyZXR1cm4gLUVBRERSSU5VU0U7CisJfQorCisJaWYgKG1wYy0+ZGV2KSB7IC8qIGNoZWNrIGlmIHRoZSBsZWMgaXMgTEFORTIgY2FwYWJsZSAqLworCQlwcml2ID0gKHN0cnVjdCBsZWNfcHJpdiAqKW1wYy0+ZGV2LT5wcml2OworCQlpZiAocHJpdi0+bGFuZV92ZXJzaW9uIDwgMikgeworCQkJZGV2X3B1dChtcGMtPmRldik7CisJCQltcGMtPmRldiA9IE5VTEw7CisJCX0gZWxzZQorCQkJcHJpdi0+bGFuZTJfb3BzLT5hc3NvY2lhdGVfaW5kaWNhdG9yID0gbGFuZTJfYXNzb2NfaW5kOyAgCisJfQorCisJbXBjLT5tcG9hZF92Y2MgPSB2Y2M7CisJdmNjLT5kZXYgPSAmbXBjX2RldjsKKwl2Y2NfaW5zZXJ0X3NvY2tldChza19hdG0odmNjKSk7CisJc2V0X2JpdChBVE1fVkZfTUVUQSwmdmNjLT5mbGFncyk7CisJc2V0X2JpdChBVE1fVkZfUkVBRFksJnZjYy0+ZmxhZ3MpOworCisJaWYgKG1wYy0+ZGV2KSB7CisJCWNoYXIgZW1wdHlbQVRNX0VTQV9MRU5dOworCQltZW1zZXQoZW1wdHksIDAsIEFUTV9FU0FfTEVOKTsKKwkJCisJCXN0YXJ0X21wYyhtcGMsIG1wYy0+ZGV2KTsKKwkJLyogc2V0IGFkZHJlc3MgaWYgbXBjZCBlLmcuIGdldHMga2lsbGVkIGFuZCByZXN0YXJ0ZWQuCisJCSAqIElmIHdlIGRvIG5vdCBkbyBpdCBub3cgd2UgaGF2ZSB0byB3YWl0IGZvciB0aGUgbmV4dCBMRV9BUlAKKwkJICovCisJCWlmICggbWVtY21wKG1wYy0+bXBzX2N0cmxfYWRkciwgZW1wdHksIEFUTV9FU0FfTEVOKSAhPSAwICkKKwkJCXNlbmRfc2V0X21wc19jdHJsX2FkZHIobXBjLT5tcHNfY3RybF9hZGRyLCBtcGMpOworCX0KKworCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisJcmV0dXJuIGFyZzsKK30KKworc3RhdGljIHZvaWQgc2VuZF9zZXRfbXBzX2N0cmxfYWRkcihjaGFyICphZGRyLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYykKK3sKKwlzdHJ1Y3Qga19tZXNzYWdlIG1lc2c7CisKKwltZW1jcHkgKG1wYy0+bXBzX2N0cmxfYWRkciwgYWRkciwgQVRNX0VTQV9MRU4pOworCQorCW1lc2cudHlwZSA9IFNFVF9NUFNfQ1RSTF9BRERSOworCW1lbWNweShtZXNnLk1QU19jdHJsLCBhZGRyLCBBVE1fRVNBX0xFTik7CisJbXNnX3RvX21wb2FkKCZtZXNnLCBtcGMpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBtcG9hZF9jbG9zZShzdHJ1Y3QgYXRtX3ZjYyAqdmNjKQoreworCXN0cnVjdCBtcG9hX2NsaWVudCAqbXBjOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwltcGMgPSBmaW5kX21wY19ieV92Y2ModmNjKTsKKwlpZiAobXBjID09IE5VTEwpIHsKKwkJcHJpbnRrKCJtcG9hOiBtcG9hZF9jbG9zZTogZGlkIG5vdCBmaW5kIE1QQ1xuIik7CisJCXJldHVybjsKKwl9CisJaWYgKCFtcGMtPm1wb2FkX3ZjYykgeworCQlwcmludGsoIm1wb2E6IG1wb2FkX2Nsb3NlOiBjbG9zZSBmb3Igbm9uLXByZXNlbnQgbXBvYWRcbiIpOworCQlyZXR1cm47CisJfQorCQorCW1wYy0+bXBvYWRfdmNjID0gTlVMTDsKKwlpZiAobXBjLT5kZXYpIHsKKwkJc3RydWN0IGxlY19wcml2ICpwcml2ID0gKHN0cnVjdCBsZWNfcHJpdiAqKW1wYy0+ZGV2LT5wcml2OworCQlwcml2LT5sYW5lMl9vcHMtPmFzc29jaWF0ZV9pbmRpY2F0b3IgPSBOVUxMOworCQlzdG9wX21wYyhtcGMpOworCQlkZXZfcHV0KG1wYy0+ZGV2KTsKKwl9CisKKwltcGMtPmluX29wcy0+ZGVzdHJveV9jYWNoZShtcGMpOworCW1wYy0+ZWdfb3BzLT5kZXN0cm95X2NhY2hlKG1wYyk7CisKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZza19hdG0odmNjKS0+c2tfcmVjZWl2ZV9xdWV1ZSkpKSB7CisJCWF0bV9yZXR1cm4odmNjLCBza2ItPnRydWVzaXplKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJfQorCQorCXByaW50aygibXBvYTogKCVzKSBnb2luZyBkb3duXG4iLAorCQkobXBjLT5kZXYpID8gbXBjLT5kZXYtPm5hbWUgOiAiPHVua25vd24+Iik7CisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKgorICovCitzdGF0aWMgaW50IG1zZ19mcm9tX21wb2FkKHN0cnVjdCBhdG1fdmNjICp2Y2MsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJCisJc3RydWN0IG1wb2FfY2xpZW50ICptcGMgPSBmaW5kX21wY19ieV92Y2ModmNjKTsKKwlzdHJ1Y3Qga19tZXNzYWdlICptZXNnID0gKHN0cnVjdCBrX21lc3NhZ2UqKXNrYi0+ZGF0YTsKKwlhdG9taWNfc3ViKHNrYi0+dHJ1ZXNpemUsICZza19hdG0odmNjKS0+c2tfd21lbV9hbGxvYyk7CisJCisJaWYgKG1wYyA9PSBOVUxMKSB7CisJCXByaW50aygibXBvYTogbXNnX2Zyb21fbXBvYWQ6IG5vIG1wYyBmb3VuZFxuIik7CisJCXJldHVybiAwOworCX0KKwlkcHJpbnRrKCJtcG9hOiAoJXMpIG1zZ19mcm9tX21wb2FkOiIsIChtcGMtPmRldikgPyBtcGMtPmRldi0+bmFtZSA6ICI8dW5rbm93bj4iKTsKKwlzd2l0Y2gobWVzZy0+dHlwZSkgeworCWNhc2UgTVBPQV9SRVNfUkVQTFlfUkNWRDoKKwkJZHByaW50aygiIG1wb2FfcmVzX3JlcGx5X3JjdmRcbiIpOworCQlNUE9BX3Jlc19yZXBseV9yY3ZkKG1lc2csIG1wYyk7CisJCWJyZWFrOworCWNhc2UgTVBPQV9UUklHR0VSX1JDVkQ6CisJCWRwcmludGsoIiBtcG9hX3RyaWdnZXJfcmN2ZFxuIik7CisJCU1QT0FfdHJpZ2dlcl9yY3ZkKG1lc2csIG1wYyk7CisJCWJyZWFrOworCWNhc2UgSU5HUkVTU19QVVJHRV9SQ1ZEOgorCQlkcHJpbnRrKCIgbmhycF9wdXJnZV9yY3ZkXG4iKTsKKwkJaW5ncmVzc19wdXJnZV9yY3ZkKG1lc2csIG1wYyk7CisJCWJyZWFrOworCWNhc2UgRUdSRVNTX1BVUkdFX1JDVkQ6CisJCWRwcmludGsoIiBlZ3Jlc3NfcHVyZ2VfcmVwbHlfcmN2ZFxuIik7CisJCWVncmVzc19wdXJnZV9yY3ZkKG1lc2csIG1wYyk7CisJCWJyZWFrOworCWNhc2UgTVBTX0RFQVRIOgorCQlkcHJpbnRrKCIgbXBzX2RlYXRoXG4iKTsKKwkJbXBzX2RlYXRoKG1lc2csIG1wYyk7CisJCWJyZWFrOworCWNhc2UgQ0FDSEVfSU1QT1NfUkNWRDoKKwkJZHByaW50aygiIGNhY2hlX2ltcG9zX3JjdmRcbiIpOworCQlNUE9BX2NhY2hlX2ltcG9zX3JjdmQobWVzZywgbXBjKTsKKwkJYnJlYWs7CisJY2FzZSBTRVRfTVBDX0NUUkxfQUREUjoKKwkJZHByaW50aygiIHNldF9tcGNfY3RybF9hZGRyXG4iKTsKKwkJc2V0X21wY19jdHJsX2FkZHJfcmN2ZChtZXNnLCBtcGMpOworCQlicmVhazsKKwljYXNlIFNFVF9NUFNfTUFDX0FERFI6CisJCWRwcmludGsoIiBzZXRfbXBzX21hY19hZGRyXG4iKTsKKwkJc2V0X21wc19tYWNfYWRkcl9yY3ZkKG1lc2csIG1wYyk7CisJCWJyZWFrOworCWNhc2UgQ0xFQU5fVVBfQU5EX0VYSVQ6CisJCWRwcmludGsoIiBjbGVhbl91cF9hbmRfZXhpdFxuIik7CisJCWNsZWFuX3VwKG1lc2csIG1wYywgRElFKTsKKwkJYnJlYWs7CisJY2FzZSBSRUxPQUQ6CisJCWRwcmludGsoIiByZWxvYWRcbiIpOworCQljbGVhbl91cChtZXNnLCBtcGMsIFJFTE9BRCk7CisJCWJyZWFrOworCWNhc2UgU0VUX01QQ19QQVJBTVM6CisJCWRwcmludGsoIiBzZXRfbXBjX3BhcmFtc1xuIik7CisJCW1wYy0+cGFyYW1ldGVycyA9IG1lc2ctPmNvbnRlbnQucGFyYW1zOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkcHJpbnRrKCIgdW5rbm93biBtZXNzYWdlICVkXG4iLCBtZXNnLT50eXBlKTsKKwkJYnJlYWs7CisJfQorCWtmcmVlX3NrYihza2IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlbWVtYmVyIHRoYXQgdGhpcyBmdW5jdGlvbiBtYXkgbm90IGRvIHRoaW5ncyB0aGF0IHNsZWVwICovCitpbnQgbXNnX3RvX21wb2FkKHN0cnVjdCBrX21lc3NhZ2UgKm1lc2csIHN0cnVjdCBtcG9hX2NsaWVudCAqbXBjKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHNvY2sgKnNrOworCisJaWYgKG1wYyA9PSBOVUxMIHx8ICFtcGMtPm1wb2FkX3ZjYykgeworCQlwcmludGsoIm1wb2E6IG1zZ190b19tcG9hZDogbWVzZyAlZCB0byBhIG5vbi1leGlzdGVudCBtcG9hZFxuIiwgbWVzZy0+dHlwZSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJc2tiID0gYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3Qga19tZXNzYWdlKSwgR0ZQX0FUT01JQyk7CisJaWYgKHNrYiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBrX21lc3NhZ2UpKTsKKwltZW1jcHkoc2tiLT5kYXRhLCBtZXNnLCBzaXplb2Yoc3RydWN0IGtfbWVzc2FnZSkpOworCWF0bV9mb3JjZV9jaGFyZ2UobXBjLT5tcG9hZF92Y2MsIHNrYi0+dHJ1ZXNpemUpOworCQorCXNrID0gc2tfYXRtKG1wYy0+bXBvYWRfdmNjKTsKKwlza2JfcXVldWVfdGFpbCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJc2stPnNrX2RhdGFfcmVhZHkoc2ssIHNrYi0+bGVuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wb2FfZXZlbnRfbGlzdGVuZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICptcG9hX25vdGlmaWVyLCB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpkZXZfcHRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IG1wb2FfY2xpZW50ICptcGM7CisJc3RydWN0IGxlY19wcml2ICpwcml2OworCisJZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X3B0cjsKKwlpZiAoZGV2LT5uYW1lID09IE5VTEwgfHwgc3RybmNtcChkZXYtPm5hbWUsICJsZWMiLCAzKSkKKwkJcmV0dXJuIE5PVElGWV9ET05FOyAvKiB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGxlYzpzICovCisJCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX1JFR0lTVEVSOiAgICAgICAvKiBhIG5ldyBsZWMgZGV2aWNlIHdhcyBhbGxvY2F0ZWQgKi8KKwkJcHJpdiA9IChzdHJ1Y3QgbGVjX3ByaXYgKilkZXYtPnByaXY7CisJCWlmIChwcml2LT5sYW5lX3ZlcnNpb24gPCAyKQorCQkJYnJlYWs7CisJCXByaXYtPmxhbmUyX29wcy0+YXNzb2NpYXRlX2luZGljYXRvciA9IGxhbmUyX2Fzc29jX2luZDsKKwkJbXBjID0gZmluZF9tcGNfYnlfaXRmbnVtKHByaXYtPml0Zm51bSk7CisJCWlmIChtcGMgPT0gTlVMTCkgeworCQkJZHByaW50aygibXBvYTogbXBvYV9ldmVudF9saXN0ZW5lcjogYWxsb2NhdGluZyBuZXcgbXBjIGZvciAlc1xuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJbXBjID0gYWxsb2NfbXBjKCk7CisJCQlpZiAobXBjID09IE5VTEwpIHsKKwkJCQlwcmludGsoIm1wb2E6IG1wb2FfZXZlbnRfbGlzdGVuZXI6IG5vIG5ldyBtcGMiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQltcGMtPmRldl9udW0gPSBwcml2LT5pdGZudW07CisJCW1wYy0+ZGV2ID0gZGV2OworCQlkZXZfaG9sZChkZXYpOworCQlkcHJpbnRrKCJtcG9hOiAoJXMpIHdhcyBpbml0aWFsaXplZFxuIiwgZGV2LT5uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfVU5SRUdJU1RFUjoKKwkJLyogdGhlIGxlYyBkZXZpY2Ugd2FzIGRlYWxsb2NhdGVkICovCisJCW1wYyA9IGZpbmRfbXBjX2J5X2xlYyhkZXYpOworCQlpZiAobXBjID09IE5VTEwpCisJCQlicmVhazsKKwkJZHByaW50aygibXBvYTogZGV2aWNlICglcykgd2FzIGRlYWxsb2NhdGVkXG4iLCBkZXYtPm5hbWUpOworCQlzdG9wX21wYyhtcGMpOworCQlkZXZfcHV0KG1wYy0+ZGV2KTsKKwkJbXBjLT5kZXYgPSBOVUxMOworCQlicmVhazsKKwljYXNlIE5FVERFVl9VUDoKKwkJLyogdGhlIGRldiB3YXMgaWZjb25maWcnZWQgdXAgKi8KKwkJbXBjID0gZmluZF9tcGNfYnlfbGVjKGRldik7CisJCWlmIChtcGMgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlpZiAobXBjLT5tcG9hZF92Y2MgIT0gTlVMTCkgeworCQkJc3RhcnRfbXBjKG1wYywgZGV2KTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5FVERFVl9ET1dOOgorCQkvKiB0aGUgZGV2IHdhcyBpZmNvbmZpZydlZCBkb3duICovCisJCS8qIHRoaXMgbWVhbnMgdGhhdCB0aGUgZmxvdyBvZiBwYWNrZXRzIGZyb20gdGhlCisJCSAqIHVwcGVyIGxheWVyIHN0b3BzCisJCSAqLworCQltcGMgPSBmaW5kX21wY19ieV9sZWMoZGV2KTsKKwkJaWYgKG1wYyA9PSBOVUxMKQorCQkJYnJlYWs7CisJCWlmIChtcGMtPm1wb2FkX3ZjYyAhPSBOVUxMKSB7CisJCQlzdG9wX21wYyhtcGMpOworCQl9CisJCWJyZWFrOworCWNhc2UgTkVUREVWX1JFQk9PVDoKKwljYXNlIE5FVERFVl9DSEFOR0U6CisJY2FzZSBORVRERVZfQ0hBTkdFTVRVOgorCWNhc2UgTkVUREVWX0NIQU5HRUFERFI6CisJY2FzZSBORVRERVZfR09JTkdfRE9XTjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKgorICogRnVuY3Rpb25zIHdoaWNoIGFyZSBjYWxsZWQgYWZ0ZXIgYSBtZXNzYWdlIGlzIHJlY2VpdmVkIGZyb20gbXBjZC4KKyAqIE1zZyBpcyByZXVzZWQgb24gcHVycG9zZS4KKyAqLworCisKK3N0YXRpYyB2b2lkIE1QT0FfdHJpZ2dlcl9yY3ZkKHN0cnVjdCBrX21lc3NhZ2UgKm1zZywgc3RydWN0IG1wb2FfY2xpZW50ICptcGMpCit7CisJdWludDMyX3QgZHN0X2lwID0gbXNnLT5jb250ZW50LmluX2luZm8uaW5fZHN0X2lwOworCWluX2NhY2hlX2VudHJ5ICplbnRyeTsKKworCWVudHJ5ID0gbXBjLT5pbl9vcHMtPmdldChkc3RfaXAsIG1wYyk7CisJaWYoZW50cnkgPT0gTlVMTCl7CisJCWVudHJ5ID0gbXBjLT5pbl9vcHMtPmFkZF9lbnRyeShkc3RfaXAsIG1wYyk7CisJCWVudHJ5LT5lbnRyeV9zdGF0ZSA9IElOR1JFU1NfUkVTT0xWSU5HOworCQltc2ctPnR5cGUgPSBTTkRfTVBPQV9SRVNfUlFTVDsKKwkJbXNnLT5jb250ZW50LmluX2luZm8gPSBlbnRyeS0+Y3RybF9pbmZvOworCQltc2dfdG9fbXBvYWQobXNnLCBtcGMpOworCQlkb19nZXR0aW1lb2ZkYXkoJihlbnRyeS0+cmVwbHlfd2FpdCkpOworCQltcGMtPmluX29wcy0+cHV0KGVudHJ5KTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZihlbnRyeS0+ZW50cnlfc3RhdGUgPT0gSU5HUkVTU19JTlZBTElEKXsKKwkJZW50cnktPmVudHJ5X3N0YXRlID0gSU5HUkVTU19SRVNPTFZJTkc7CisJCW1zZy0+dHlwZSA9IFNORF9NUE9BX1JFU19SUVNUOworCQltc2ctPmNvbnRlbnQuaW5faW5mbyA9IGVudHJ5LT5jdHJsX2luZm87CisJCW1zZ190b19tcG9hZChtc2csIG1wYyk7CisJCWRvX2dldHRpbWVvZmRheSgmKGVudHJ5LT5yZXBseV93YWl0KSk7CisJCW1wYy0+aW5fb3BzLT5wdXQoZW50cnkpOworCQlyZXR1cm47CisJfQorCQorCXByaW50aygibXBvYTogKCVzKSBNUE9BX3RyaWdnZXJfcmN2ZDogZW50cnkgYWxyZWFkeSBpbiByZXNvbHZpbmcgc3RhdGVcbiIsCisJCShtcGMtPmRldikgPyBtcGMtPmRldi0+bmFtZSA6ICI8dW5rbm93bj4iKTsKKwltcGMtPmluX29wcy0+cHV0KGVudHJ5KTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBUaGluZ3MgZ2V0IGNvbXBsaWNhdGVkIGJlY2F1c2Ugd2UgaGF2ZSB0byBjaGVjayBpZiB0aGVyZSdzIGFuIGVncmVzcworICogc2hvcnRjdXQgd2l0aCBzdWl0YWJsZSB0cmFmZmljIHBhcmFtZXRlcnMgd2UgY291bGQgdXNlLiAKKyAqLworc3RhdGljIHZvaWQgY2hlY2tfcW9zX2FuZF9vcGVuX3Nob3J0Y3V0KHN0cnVjdCBrX21lc3NhZ2UgKm1zZywgc3RydWN0IG1wb2FfY2xpZW50ICpjbGllbnQsIGluX2NhY2hlX2VudHJ5ICplbnRyeSkKK3sKKwl1aW50MzJfdCBkc3RfaXAgPSBtc2ctPmNvbnRlbnQuaW5faW5mby5pbl9kc3RfaXA7CisJdW5zaWduZWQgY2hhciAqaXAgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpID0gKHVuc2lnbmVkIGNoYXIgKikmZHN0X2lwOworCXN0cnVjdCBhdG1fbXBvYV9xb3MgKnFvcyA9IGF0bV9tcG9hX3NlYXJjaF9xb3MoZHN0X2lwKTsKKwllZ19jYWNoZV9lbnRyeSAqZWdfZW50cnkgPSBjbGllbnQtPmVnX29wcy0+Z2V0X2J5X3NyY19pcChkc3RfaXAsIGNsaWVudCk7CisKKwlpZihlZ19lbnRyeSAmJiBlZ19lbnRyeS0+c2hvcnRjdXQpeworCQlpZihlZ19lbnRyeS0+c2hvcnRjdXQtPnFvcy50eHRwLnRyYWZmaWNfY2xhc3MgJgorCQkgICBtc2ctPnFvcy50eHRwLnRyYWZmaWNfY2xhc3MgJgorCQkgICAocW9zID8gcW9zLT5xb3MudHh0cC50cmFmZmljX2NsYXNzIDogQVRNX1VCUiB8IEFUTV9DQlIpKXsKKwkJCSAgICBpZihlZ19lbnRyeS0+c2hvcnRjdXQtPnFvcy50eHRwLnRyYWZmaWNfY2xhc3MgPT0gQVRNX1VCUikKKwkJCQkgICAgZW50cnktPnNob3J0Y3V0ID0gZWdfZW50cnktPnNob3J0Y3V0OworCQkJICAgIGVsc2UgaWYoZWdfZW50cnktPnNob3J0Y3V0LT5xb3MudHh0cC5tYXhfcGNyID4gMCkKKwkJCQkgICAgZW50cnktPnNob3J0Y3V0ID0gZWdfZW50cnktPnNob3J0Y3V0OworCQl9CisJIAlpZihlbnRyeS0+c2hvcnRjdXQpeworCQkJZHByaW50aygibXBvYTogKCVzKSB1c2luZyBlZ3Jlc3MgU1ZDIHRvIHJlYWNoICV1LiV1LiV1LiV1XG4iLGNsaWVudC0+ZGV2LT5uYW1lLCBOSVBRVUFEKGlwKSk7CisJCQljbGllbnQtPmVnX29wcy0+cHV0KGVnX2VudHJ5KTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlpZiAoZWdfZW50cnkgIT0gTlVMTCkKKwkJY2xpZW50LT5lZ19vcHMtPnB1dChlZ19lbnRyeSk7CisKKwkvKiBObyBsdWNrIGluIHRoZSBlZ3Jlc3MgY2FjaGUgd2UgbXVzdCBvcGVuIGFuIGluZ3Jlc3MgU1ZDICovCisJbXNnLT50eXBlID0gT1BFTl9JTkdSRVNTX1NWQzsKKwlpZiAocW9zICYmIChxb3MtPnFvcy50eHRwLnRyYWZmaWNfY2xhc3MgPT0gbXNnLT5xb3MudHh0cC50cmFmZmljX2NsYXNzKSkKKwl7CisJCW1zZy0+cW9zID0gcW9zLT5xb3M7CisJCXByaW50aygibXBvYTogKCVzKSB0cnlpbmcgdG8gZ2V0IGEgQ0JSIHNob3J0Y3V0XG4iLGNsaWVudC0+ZGV2LT5uYW1lKTsKKyAgICAJfQorCWVsc2UgbWVtc2V0KCZtc2ctPnFvcywwLHNpemVvZihzdHJ1Y3QgYXRtX3FvcykpOworCW1zZ190b19tcG9hZChtc2csIGNsaWVudCk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBNUE9BX3Jlc19yZXBseV9yY3ZkKHN0cnVjdCBrX21lc3NhZ2UgKm1zZywgc3RydWN0IG1wb2FfY2xpZW50ICptcGMpCit7CisJdW5zaWduZWQgY2hhciAqaXA7CisKKwl1aW50MzJfdCBkc3RfaXAgPSBtc2ctPmNvbnRlbnQuaW5faW5mby5pbl9kc3RfaXA7CisJaW5fY2FjaGVfZW50cnkgKmVudHJ5ID0gbXBjLT5pbl9vcHMtPmdldChkc3RfaXAsIG1wYyk7CisJaXAgPSAodW5zaWduZWQgY2hhciAqKSZkc3RfaXA7CisJZHByaW50aygibXBvYTogKCVzKSBNUE9BX3Jlc19yZXBseV9yY3ZkOiBpcCAldS4ldS4ldS4ldVxuIiwgbXBjLT5kZXYtPm5hbWUsIE5JUFFVQUQoaXApKTsKKwlkZHByaW50aygibXBvYTogKCVzKSBNUE9BX3Jlc19yZXBseV9yY3ZkKCkgZW50cnkgPSAlcCIsIG1wYy0+ZGV2LT5uYW1lLCBlbnRyeSk7CisJaWYoZW50cnkgPT0gTlVMTCl7CisJCXByaW50aygiXG5tcG9hOiAoJXMpIEFSR0gsIHJlY2VpdmVkIHJlcy4gcmVwbHkgZm9yIGFuIGVudHJ5IHRoYXQgZG9lc24ndCBleGlzdC5cbiIsIG1wYy0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKwlkZHByaW50aygiIGVudHJ5X3N0YXRlID0gJWQgIiwgZW50cnktPmVudHJ5X3N0YXRlKTsJCisKKwlpZiAoZW50cnktPmVudHJ5X3N0YXRlID09IElOR1JFU1NfUkVTT0xWRUQpIHsKKwkJcHJpbnRrKCJcbm1wb2E6ICglcykgTVBPQV9yZXNfcmVwbHlfcmN2ZCBmb3IgUkVTT0xWRUQgZW50cnkhXG4iLCBtcGMtPmRldi0+bmFtZSk7CisJCW1wYy0+aW5fb3BzLT5wdXQoZW50cnkpOworCQlyZXR1cm47CisJfQorCisJZW50cnktPmN0cmxfaW5mbyA9IG1zZy0+Y29udGVudC5pbl9pbmZvOworCWRvX2dldHRpbWVvZmRheSgmKGVudHJ5LT50dikpOworCWRvX2dldHRpbWVvZmRheSgmKGVudHJ5LT5yZXBseV93YWl0KSk7IC8qIFVzZWQgaW4gcmVmcmVzaGluZyBmdW5jIGZyb20gbm93IG9uICovCisJZW50cnktPnJlZnJlc2hfdGltZSA9IDA7CisJZGRwcmludGsoImVudHJ5LT5zaG9ydGN1dCA9ICVwXG4iLCBlbnRyeS0+c2hvcnRjdXQpOworCisJaWYoZW50cnktPmVudHJ5X3N0YXRlID09IElOR1JFU1NfUkVTT0xWSU5HICYmIGVudHJ5LT5zaG9ydGN1dCAhPSBOVUxMKXsKKwkJZW50cnktPmVudHJ5X3N0YXRlID0gSU5HUkVTU19SRVNPTFZFRDsgCisJCW1wYy0+aW5fb3BzLT5wdXQoZW50cnkpOworCQlyZXR1cm47IC8qIFNob3J0Y3V0IGFscmVhZHkgb3Blbi4uLiAqLworCX0KKworCWlmIChlbnRyeS0+c2hvcnRjdXQgIT0gTlVMTCkgeworCQlwcmludGsoIm1wb2E6ICglcykgTVBPQV9yZXNfcmVwbHlfcmN2ZDogZW50cnktPnNob3J0Y3V0ICE9IE5VTEwsIGltcG9zc2libGUhXG4iLAorCQkgICAgICAgbXBjLT5kZXYtPm5hbWUpOworCQltcGMtPmluX29wcy0+cHV0KGVudHJ5KTsKKwkJcmV0dXJuOworCX0KKwkKKwljaGVja19xb3NfYW5kX29wZW5fc2hvcnRjdXQobXNnLCBtcGMsIGVudHJ5KTsKKwllbnRyeS0+ZW50cnlfc3RhdGUgPSBJTkdSRVNTX1JFU09MVkVEOworCW1wYy0+aW5fb3BzLT5wdXQoZW50cnkpOworCisJcmV0dXJuOworCit9CisKK3N0YXRpYyB2b2lkIGluZ3Jlc3NfcHVyZ2VfcmN2ZChzdHJ1Y3Qga19tZXNzYWdlICptc2csIHN0cnVjdCBtcG9hX2NsaWVudCAqbXBjKQoreworCXVpbnQzMl90IGRzdF9pcCA9IG1zZy0+Y29udGVudC5pbl9pbmZvLmluX2RzdF9pcDsKKwl1aW50MzJfdCBtYXNrID0gbXNnLT5pcF9tYXNrOworCXVuc2lnbmVkIGNoYXIgKmlwID0gKHVuc2lnbmVkIGNoYXIgKikmZHN0X2lwOworCWluX2NhY2hlX2VudHJ5ICplbnRyeSA9IG1wYy0+aW5fb3BzLT5nZXRfd2l0aF9tYXNrKGRzdF9pcCwgbXBjLCBtYXNrKTsKKworCWlmKGVudHJ5ID09IE5VTEwpeworCQlwcmludGsoIm1wb2E6ICglcykgaW5ncmVzc19wdXJnZV9yY3ZkOiBwdXJnZSBmb3IgYSBub24tZXhpc3RpbmcgZW50cnksICIsIG1wYy0+ZGV2LT5uYW1lKTsKKwkJcHJpbnRrKCJpcCA9ICV1LiV1LiV1LiV1XG4iLCBpcFswXSwgaXBbMV0sIGlwWzJdLCBpcFszXSk7CisJCXJldHVybjsKKwl9CisKKwlkbyB7CisJCWRwcmludGsoIm1wb2E6ICglcykgaW5ncmVzc19wdXJnZV9yY3ZkOiByZW1vdmluZyBhbiBpbmdyZXNzIGVudHJ5LCBpcCA9ICV1LiV1LiV1LiV1XG4iICwKKwkJCW1wYy0+ZGV2LT5uYW1lLCBpcFswXSwgaXBbMV0sIGlwWzJdLCBpcFszXSk7CisJCXdyaXRlX2xvY2tfYmgoJm1wYy0+aW5ncmVzc19sb2NrKTsKKwkJbXBjLT5pbl9vcHMtPnJlbW92ZV9lbnRyeShlbnRyeSwgbXBjKTsKKwkJd3JpdGVfdW5sb2NrX2JoKCZtcGMtPmluZ3Jlc3NfbG9jayk7CisJCW1wYy0+aW5fb3BzLT5wdXQoZW50cnkpOworCQllbnRyeSA9IG1wYy0+aW5fb3BzLT5nZXRfd2l0aF9tYXNrKGRzdF9pcCwgbXBjLCBtYXNrKTsKKwl9IHdoaWxlIChlbnRyeSAhPSBOVUxMKTsKKworCXJldHVybjsKK30gCisKK3N0YXRpYyB2b2lkIGVncmVzc19wdXJnZV9yY3ZkKHN0cnVjdCBrX21lc3NhZ2UgKm1zZywgc3RydWN0IG1wb2FfY2xpZW50ICptcGMpCit7CisJdWludDMyX3QgY2FjaGVfaWQgPSBtc2ctPmNvbnRlbnQuZWdfaW5mby5jYWNoZV9pZDsKKwllZ19jYWNoZV9lbnRyeSAqZW50cnkgPSBtcGMtPmVnX29wcy0+Z2V0X2J5X2NhY2hlX2lkKGNhY2hlX2lkLCBtcGMpOworCQorCWlmIChlbnRyeSA9PSBOVUxMKSB7CisJCWRwcmludGsoIm1wb2E6ICglcykgZWdyZXNzX3B1cmdlX3JjdmQ6IHB1cmdlIGZvciBhIG5vbi1leGlzdGluZyBlbnRyeVxuIiwgbXBjLT5kZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJd3JpdGVfbG9ja19pcnEoJm1wYy0+ZWdyZXNzX2xvY2spOworCW1wYy0+ZWdfb3BzLT5yZW1vdmVfZW50cnkoZW50cnksIG1wYyk7CisJd3JpdGVfdW5sb2NrX2lycSgmbXBjLT5lZ3Jlc3NfbG9jayk7CisKKwltcGMtPmVnX29wcy0+cHV0KGVudHJ5KTsKKworCXJldHVybjsKK30gCisKK3N0YXRpYyB2b2lkIHB1cmdlX2VncmVzc19zaG9ydGN1dChzdHJ1Y3QgYXRtX3ZjYyAqdmNjLCBlZ19jYWNoZV9lbnRyeSAqZW50cnkpCit7CisJc3RydWN0IHNvY2sgKnNrOworCXN0cnVjdCBrX21lc3NhZ2UgKnB1cmdlX21zZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJZHByaW50aygibXBvYTogcHVyZ2VfZWdyZXNzX3Nob3J0Y3V0OiBlbnRlcmluZ1xuIik7CisJaWYgKHZjYyA9PSBOVUxMKSB7CisJCXByaW50aygibXBvYTogcHVyZ2VfZWdyZXNzX3Nob3J0Y3V0OiB2Y2MgPT0gTlVMTFxuIik7CisJCXJldHVybjsKKwl9CisKKwlza2IgPSBhbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBrX21lc3NhZ2UpLCBHRlBfQVRPTUlDKTsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJIHByaW50aygibXBvYTogcHVyZ2VfZWdyZXNzX3Nob3J0Y3V0OiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuOworCX0KKworCXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGtfbWVzc2FnZSkpOworCW1lbXNldChza2ItPmRhdGEsIDAsIHNpemVvZihzdHJ1Y3Qga19tZXNzYWdlKSk7CisJcHVyZ2VfbXNnID0gKHN0cnVjdCBrX21lc3NhZ2UgKilza2ItPmRhdGE7CisJcHVyZ2VfbXNnLT50eXBlID0gREFUQV9QTEFORV9QVVJHRTsKKwlpZiAoZW50cnkgIT0gTlVMTCkKKwkJcHVyZ2VfbXNnLT5jb250ZW50LmVnX2luZm8gPSBlbnRyeS0+Y3RybF9pbmZvOworCisJYXRtX2ZvcmNlX2NoYXJnZSh2Y2MsIHNrYi0+dHJ1ZXNpemUpOworCisJc2sgPSBza19hdG0odmNjKTsKKwlza2JfcXVldWVfdGFpbCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJc2stPnNrX2RhdGFfcmVhZHkoc2ssIHNrYi0+bGVuKTsKKwlkcHJpbnRrKCJtcG9hOiBwdXJnZV9lZ3Jlc3Nfc2hvcnRjdXQ6IGV4aXRpbmc6XG4iKTsKKworCXJldHVybjsKK30KKworLyoKKyAqIE91ciBNUFMgZGllZC4gVGVsbCBvdXIgZGFlbW9uIHRvIHNlbmQgTkhSUCBkYXRhIHBsYW5lIHB1cmdlIHRvIGVhY2gKKyAqIG9mIHRoZSBlZ3Jlc3Mgc2hvcnRjdXRzIHdlIGhhdmUuCisgKi8KK3N0YXRpYyB2b2lkIG1wc19kZWF0aCggc3RydWN0IGtfbWVzc2FnZSAqIG1zZywgc3RydWN0IG1wb2FfY2xpZW50ICogbXBjICkKK3sKKwllZ19jYWNoZV9lbnRyeSAqZW50cnk7CisKKwlkcHJpbnRrKCJtcG9hOiAoJXMpIG1wc19kZWF0aDpcbiIsIG1wYy0+ZGV2LT5uYW1lKTsKKworCWlmKG1lbWNtcChtc2ctPk1QU19jdHJsLCBtcGMtPm1wc19jdHJsX2FkZHIsIEFUTV9FU0FfTEVOKSl7CisJCXByaW50aygibXBvYTogKCVzKSBtcHNfZGVhdGg6IHdyb25nIE1QU1xuIiwgbXBjLT5kZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJLyogRklYTUU6IFRoaXMga25vd3MgdG9vIG11Y2ggb2YgdGhlIGNhY2hlIHN0cnVjdHVyZSAqLworCXJlYWRfbG9ja19pcnEoJm1wYy0+ZWdyZXNzX2xvY2spOworCWVudHJ5ID0gbXBjLT5lZ19jYWNoZTsKKwl3aGlsZSAoZW50cnkgIT0gTlVMTCkgeworCQlwdXJnZV9lZ3Jlc3Nfc2hvcnRjdXQoZW50cnktPnNob3J0Y3V0LCBlbnRyeSk7CisJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJfQorCXJlYWRfdW5sb2NrX2lycSgmbXBjLT5lZ3Jlc3NfbG9jayk7CisKKwltcGMtPmluX29wcy0+ZGVzdHJveV9jYWNoZShtcGMpOworCW1wYy0+ZWdfb3BzLT5kZXN0cm95X2NhY2hlKG1wYyk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIE1QT0FfY2FjaGVfaW1wb3NfcmN2ZCggc3RydWN0IGtfbWVzc2FnZSAqIG1zZywgc3RydWN0IG1wb2FfY2xpZW50ICogbXBjKQoreworCXVpbnQxNl90IGhvbGRpbmdfdGltZTsKKwllZ19jYWNoZV9lbnRyeSAqZW50cnkgPSBtcGMtPmVnX29wcy0+Z2V0X2J5X2NhY2hlX2lkKG1zZy0+Y29udGVudC5lZ19pbmZvLmNhY2hlX2lkLCBtcGMpOworCQorCWhvbGRpbmdfdGltZSA9IG1zZy0+Y29udGVudC5lZ19pbmZvLmhvbGRpbmdfdGltZTsKKwlkcHJpbnRrKCJtcG9hOiAoJXMpIE1QT0FfY2FjaGVfaW1wb3NfcmN2ZDogZW50cnkgPSAlcCwgaG9sZGluZ190aW1lID0gJXVcbiIsCisJICAgICAgIG1wYy0+ZGV2LT5uYW1lLCBlbnRyeSwgaG9sZGluZ190aW1lKTsKKwlpZihlbnRyeSA9PSBOVUxMICYmIGhvbGRpbmdfdGltZSkgeworCQllbnRyeSA9IG1wYy0+ZWdfb3BzLT5hZGRfZW50cnkobXNnLCBtcGMpOworCQltcGMtPmVnX29wcy0+cHV0KGVudHJ5KTsKKwkJcmV0dXJuOworCX0KKwlpZihob2xkaW5nX3RpbWUpeworCQltcGMtPmVnX29wcy0+dXBkYXRlKGVudHJ5LCBob2xkaW5nX3RpbWUpOworCQlyZXR1cm47CisJfQorCQorCXdyaXRlX2xvY2tfaXJxKCZtcGMtPmVncmVzc19sb2NrKTsKKwltcGMtPmVnX29wcy0+cmVtb3ZlX2VudHJ5KGVudHJ5LCBtcGMpOworCXdyaXRlX3VubG9ja19pcnEoJm1wYy0+ZWdyZXNzX2xvY2spOworCisJbXBjLT5lZ19vcHMtPnB1dChlbnRyeSk7CisJCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBzZXRfbXBjX2N0cmxfYWRkcl9yY3ZkKHN0cnVjdCBrX21lc3NhZ2UgKm1lc2csIHN0cnVjdCBtcG9hX2NsaWVudCAqbXBjKQoreworCXN0cnVjdCBsZWNfcHJpdiAqcHJpdjsKKwlpbnQgaSwgcmV0dmFsIDsKKworCXVpbnQ4X3QgdGx2WzQgKyAxICsgMSArIDEgKyBBVE1fRVNBX0xFTl07CisKKwl0bHZbMF0gPSAwMDsgdGx2WzFdID0gMHhhMDsgdGx2WzJdID0gMHgzZTsgdGx2WzNdID0gMHgyYTsgLyogdHlwZSAgKi8KKwl0bHZbNF0gPSAxICsgMSArIEFUTV9FU0FfTEVOOyAgLyogbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl0bHZbNV0gPSAweDAyOyAgICAgICAgICAgICAgICAgLyogTVBPQSBjbGllbnQgICAgICAgICAgICAgICAgICAgICAgKi8KKwl0bHZbNl0gPSAweDAwOyAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIE1QUyBNQUMgYWRkcmVzc2VzICAgICAgKi8KKworCW1lbWNweSgmdGx2WzddLCBtZXNnLT5NUFNfY3RybCwgQVRNX0VTQV9MRU4pOyAvKiBNUEMgY3RybCBBVE0gYWRkciAqLworCW1lbWNweShtcGMtPm91cl9jdHJsX2FkZHIsIG1lc2ctPk1QU19jdHJsLCBBVE1fRVNBX0xFTik7CisKKwlkcHJpbnRrKCJtcG9hOiAoJXMpIHNldHRpbmcgTVBDIGN0cmwgQVRNIGFkZHJlc3MgdG8gIiwKKwkgICAgICAgKG1wYy0+ZGV2KSA/IG1wYy0+ZGV2LT5uYW1lIDogIjx1bmtub3duPiIpOworCWZvciAoaSA9IDc7IGkgPCBzaXplb2YodGx2KTsgaSsrKQorCQlkcHJpbnRrKCIlMDJ4ICIsIHRsdltpXSk7CisJZHByaW50aygiXG4iKTsKKworCWlmIChtcGMtPmRldikgeworCQlwcml2ID0gKHN0cnVjdCBsZWNfcHJpdiAqKW1wYy0+ZGV2LT5wcml2OworCQlyZXR2YWwgPSBwcml2LT5sYW5lMl9vcHMtPmFzc29jaWF0ZV9yZXEobXBjLT5kZXYsIG1wYy0+ZGV2LT5kZXZfYWRkciwgdGx2LCBzaXplb2YodGx2KSk7CisJCWlmIChyZXR2YWwgPT0gMCkKKwkJCXByaW50aygibXBvYTogKCVzKSBNUE9BIGRldmljZSB0eXBlIFRMViBhc3NvY2lhdGlvbiBmYWlsZWRcbiIsIG1wYy0+ZGV2LT5uYW1lKTsKKwkJcmV0dmFsID0gcHJpdi0+bGFuZTJfb3BzLT5yZXNvbHZlKG1wYy0+ZGV2LCBOVUxMLCAxLCBOVUxMLCBOVUxMKTsKKwkJaWYgKHJldHZhbCA8IDApCisJCQlwcmludGsoIm1wb2E6ICglcykgdGFyZ2V0bGVzcyBMRV9BUlAgcmVxdWVzdCBmYWlsZWRcbiIsIG1wYy0+ZGV2LT5uYW1lKTsKKwl9CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHNldF9tcHNfbWFjX2FkZHJfcmN2ZChzdHJ1Y3Qga19tZXNzYWdlICptc2csIHN0cnVjdCBtcG9hX2NsaWVudCAqY2xpZW50KQoreworCisJaWYoY2xpZW50LT5udW1iZXJfb2ZfbXBzX21hY3MpCisJCWtmcmVlKGNsaWVudC0+bXBzX21hY3MpOworCWNsaWVudC0+bnVtYmVyX29mX21wc19tYWNzID0gMDsKKwljbGllbnQtPm1wc19tYWNzID0ga21hbGxvYyhFVEhfQUxFTixHRlBfS0VSTkVMKTsKKwlpZiAoY2xpZW50LT5tcHNfbWFjcyA9PSBOVUxMKSB7CisJCXByaW50aygibXBvYTogc2V0X21wc19tYWNfYWRkcl9yY3ZkOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuOworCX0KKwljbGllbnQtPm51bWJlcl9vZl9tcHNfbWFjcyA9IDE7CisJbWVtY3B5KGNsaWVudC0+bXBzX21hY3MsIG1zZy0+TVBTX2N0cmwsIEVUSF9BTEVOKTsKKwkKKwlyZXR1cm47Cit9CisKKy8qCisgKiBwdXJnZSBlZ3Jlc3MgY2FjaGUgYW5kIHRlbGwgZGFlbW9uIHRvICdhY3Rpb24nIChESUUsIFJFTE9BRCkKKyAqLworc3RhdGljIHZvaWQgY2xlYW5fdXAoc3RydWN0IGtfbWVzc2FnZSAqbXNnLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYywgaW50IGFjdGlvbikKK3sKKworCWVnX2NhY2hlX2VudHJ5ICplbnRyeTsKKwltc2ctPnR5cGUgPSBTTkRfRUdSRVNTX1BVUkdFOworCisKKwkvKiBGSVhNRTogVGhpcyBrbm93cyB0b28gbXVjaCBvZiB0aGUgY2FjaGUgc3RydWN0dXJlICovCisJcmVhZF9sb2NrX2lycSgmbXBjLT5lZ3Jlc3NfbG9jayk7CisJZW50cnkgPSBtcGMtPmVnX2NhY2hlOworCXdoaWxlIChlbnRyeSAhPSBOVUxMKXsKKwkJICAgIG1zZy0+Y29udGVudC5lZ19pbmZvID0gZW50cnktPmN0cmxfaW5mbzsKKwkJICAgIGRwcmludGsoIm1wb2E6IGNhY2hlX2lkICV1XG4iLCBlbnRyeS0+Y3RybF9pbmZvLmNhY2hlX2lkKTsKKwkJICAgIG1zZ190b19tcG9hZChtc2csIG1wYyk7CisJCSAgICBlbnRyeSA9IGVudHJ5LT5uZXh0OworCX0KKwlyZWFkX3VubG9ja19pcnEoJm1wYy0+ZWdyZXNzX2xvY2spOworCisJbXNnLT50eXBlID0gYWN0aW9uOworCW1zZ190b19tcG9hZChtc2csIG1wYyk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBtcGNfdGltZXJfcmVmcmVzaCh2b2lkKQoreworCW1wY190aW1lci5leHBpcmVzID0gamlmZmllcyArIChNUENfUDIgKiBIWik7CisJbXBjX3RpbWVyLmRhdGEgPSBtcGNfdGltZXIuZXhwaXJlczsKKwltcGNfdGltZXIuZnVuY3Rpb24gPSBtcGNfY2FjaGVfY2hlY2s7CisJYWRkX3RpbWVyKCZtcGNfdGltZXIpOworCQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgbXBjX2NhY2hlX2NoZWNrKCB1bnNpZ25lZCBsb25nIGNoZWNraW5nX3RpbWUgICkKK3sKKwlzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYyA9IG1wY3M7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJldmlvdXNfcmVzb2x2aW5nX2NoZWNrX3RpbWU7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJldmlvdXNfcmVmcmVzaF90aW1lOworCQorCXdoaWxlKCBtcGMgIT0gTlVMTCApeworCQltcGMtPmluX29wcy0+Y2xlYXJfY291bnQobXBjKTsKKwkJbXBjLT5lZ19vcHMtPmNsZWFyX2V4cGlyZWQobXBjKTsKKwkJaWYoY2hlY2tpbmdfdGltZSAtIHByZXZpb3VzX3Jlc29sdmluZ19jaGVja190aW1lID4gbXBjLT5wYXJhbWV0ZXJzLm1wY19wNCAqIEhaICl7CisJCQltcGMtPmluX29wcy0+Y2hlY2tfcmVzb2x2aW5nKG1wYyk7CisJCQlwcmV2aW91c19yZXNvbHZpbmdfY2hlY2tfdGltZSA9IGNoZWNraW5nX3RpbWU7CisJCX0KKwkJaWYoY2hlY2tpbmdfdGltZSAtIHByZXZpb3VzX3JlZnJlc2hfdGltZSA+IG1wYy0+cGFyYW1ldGVycy5tcGNfcDUgKiBIWiApeworCQkJbXBjLT5pbl9vcHMtPnJlZnJlc2gobXBjKTsKKwkJCXByZXZpb3VzX3JlZnJlc2hfdGltZSA9IGNoZWNraW5nX3RpbWU7CisJCX0KKwkJbXBjID0gbXBjLT5uZXh0OworCX0KKwltcGNfdGltZXJfcmVmcmVzaCgpOworCQorCXJldHVybjsKK30KKworc3RhdGljIGludCBhdG1fbXBvYV9pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgYXRtX3ZjYyAqdmNjID0gQVRNX1NEKHNvY2spOworCisJaWYgKGNtZCAhPSBBVE1NUENfQ1RSTCAmJiBjbWQgIT0gQVRNTVBDX0RBVEEpCisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIEFUTU1QQ19DVFJMOgorCQkJZXJyID0gYXRtX21wb2FfbXBvYWRfYXR0YWNoKHZjYywgKGludClhcmcpOworCQkJaWYgKGVyciA+PSAwKQorCQkJCXNvY2stPnN0YXRlID0gU1NfQ09OTkVDVEVEOworCQkJYnJlYWs7CisJCWNhc2UgQVRNTVBDX0RBVEE6CisJCQllcnIgPSBhdG1fbXBvYV92Y2NfYXR0YWNoKHZjYywgKHZvaWQgX191c2VyICopYXJnKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIHN0cnVjdCBhdG1faW9jdGwgYXRtX2lvY3RsX29wcyA9IHsKKwkub3duZXIJPSBUSElTX01PRFVMRSwKKwkuaW9jdGwJPSBhdG1fbXBvYV9pb2N0bCwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGF0bV9tcG9hX2luaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl9hdG1faW9jdGwoJmF0bV9pb2N0bF9vcHMpOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlpZiAobXBjX3Byb2NfaW5pdCgpICE9IDApCisJCXByaW50ayhLRVJOX0lORk8gIm1wb2E6IGZhaWxlZCB0byBpbml0aWFsaXplIC9wcm9jL21wb2FcbiIpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAibXBvYTogL3Byb2MvbXBvYSBpbml0aWFsaXplZFxuIik7CisjZW5kaWYKKworCXByaW50aygibXBjLmM6ICIgX19EQVRFX18gIiAiIF9fVElNRV9fICIgaW5pdGlhbGl6ZWRcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhdG1fbXBvYV9jbGVhbnVwKHZvaWQpCit7CisJc3RydWN0IG1wb2FfY2xpZW50ICptcGMsICp0bXA7CisJc3RydWN0IGF0bV9tcG9hX3FvcyAqcW9zLCAqbmV4dHFvczsKKwlzdHJ1Y3QgbGVjX3ByaXYgKnByaXY7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCW1wY19wcm9jX2NsZWFuKCk7CisjZW5kaWYKKworCWRlbF90aW1lcigmbXBjX3RpbWVyKTsKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmbXBvYV9ub3RpZmllcik7CisJZGVyZWdpc3Rlcl9hdG1faW9jdGwoJmF0bV9pb2N0bF9vcHMpOworCisJbXBjID0gbXBjczsKKwltcGNzID0gTlVMTDsKKwl3aGlsZSAobXBjICE9IE5VTEwpIHsKKwkJdG1wID0gbXBjLT5uZXh0OworCQlpZiAobXBjLT5kZXYgIT0gTlVMTCkgeworCQkJc3RvcF9tcGMobXBjKTsKKwkJCXByaXYgPSAoc3RydWN0IGxlY19wcml2ICopbXBjLT5kZXYtPnByaXY7CisJCQlpZiAocHJpdi0+bGFuZTJfb3BzICE9IE5VTEwpCisJCQkJcHJpdi0+bGFuZTJfb3BzLT5hc3NvY2lhdGVfaW5kaWNhdG9yID0gTlVMTDsKKwkJfQorCQlkZHByaW50aygibXBvYTogY2xlYW51cF9tb2R1bGU6IGFib3V0IHRvIGNsZWFyIGNhY2hlc1xuIik7CisJCW1wYy0+aW5fb3BzLT5kZXN0cm95X2NhY2hlKG1wYyk7CisJCW1wYy0+ZWdfb3BzLT5kZXN0cm95X2NhY2hlKG1wYyk7CisJCWRkcHJpbnRrKCJtcG9hOiBjbGVhbnVwX21vZHVsZTogY2FjaGVzIGNsZWFyZWRcbiIpOworCQlrZnJlZShtcGMtPm1wc19tYWNzKTsKKwkJbWVtc2V0KG1wYywgMCwgc2l6ZW9mKHN0cnVjdCBtcG9hX2NsaWVudCkpOworCQlkZHByaW50aygibXBvYTogY2xlYW51cF9tb2R1bGU6IGFib3V0IHRvIGtmcmVlICVwXG4iLCBtcGMpOworCQlrZnJlZShtcGMpOworCQlkZHByaW50aygibXBvYTogY2xlYW51cF9tb2R1bGU6IG5leHQgbXBjIGlzIGF0ICVwXG4iLCB0bXApOworCQltcGMgPSB0bXA7CisJfQorCisJcW9zID0gcW9zX2hlYWQ7CisJcW9zX2hlYWQgPSBOVUxMOworCXdoaWxlIChxb3MgIT0gTlVMTCkgeworCQluZXh0cW9zID0gcW9zLT5uZXh0OworCQlkcHJpbnRrKCJtcG9hOiBjbGVhbnVwX21vZHVsZTogZnJlZWluZyBxb3MgZW50cnkgJXBcbiIsIHFvcyk7CisJCWtmcmVlKHFvcyk7CisJCXFvcyA9IG5leHRxb3M7CisJfQorCisJcmV0dXJuOworfQorCittb2R1bGVfaW5pdChhdG1fbXBvYV9pbml0KTsKK21vZHVsZV9leGl0KGF0bV9tcG9hX2NsZWFudXApOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvYXRtL21wYy5oIGIvbmV0L2F0bS9tcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjNkZGY2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2F0bS9tcGMuaApAQCAtMCwwICsxLDUzIEBACisjaWZuZGVmIF9NUENfSF8KKyNkZWZpbmUgX01QQ19IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG0uaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1tcGMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgIm1wb2FfY2FjaGVzLmgiCisKKy8qIGtlcm5lbCAtPiBtcGMtZGFlbW9uICovCitpbnQgbXNnX3RvX21wb2FkKHN0cnVjdCBrX21lc3NhZ2UgKm1zZywgc3RydWN0IG1wb2FfY2xpZW50ICptcGMpOworCitzdHJ1Y3QgbXBvYV9jbGllbnQgeworICAgICAgICBzdHJ1Y3QgbXBvYV9jbGllbnQgKm5leHQ7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7ICAgICAgLyogbGVjIGluIHF1ZXN0aW9uICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgaW50IGRldl9udW07ICAgICAgICAgICAgICAgICAvKiBlLmcuIDIgZm9yIGxlYzIgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBpbnQgKCpvbGRfaGFyZF9zdGFydF94bWl0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyAgICAgICAgc3RydWN0IGF0bV92Y2MgKm1wb2FkX3ZjYzsgICAvKiBjb250cm9sIGNoYW5uZWwgdG8gbXBvYWQgICAgICAgICAgICAqLworICAgICAgICB1aW50OF90IG1wc19jdHJsX2FkZHJbQVRNX0VTQV9MRU5dOyAgLyogTVBTIGNvbnRyb2wgQVRNIGFkZHJlc3MgICAgICovCisgICAgICAgIHVpbnQ4X3Qgb3VyX2N0cmxfYWRkcltBVE1fRVNBX0xFTl07ICAvKiBNUEMncyBjb250cm9sIEFUTSBhZGRyZXNzICAgKi8KKworICAgICAgICByd2xvY2tfdCBpbmdyZXNzX2xvY2s7CisgICAgICAgIHN0cnVjdCBpbl9jYWNoZV9vcHMgKmluX29wczsgLyogaW5ncmVzcyBjYWNoZSBvcGVyYXRpb25zICAgICAgICAgICAgKi8KKyAgICAgICAgaW5fY2FjaGVfZW50cnkgKmluX2NhY2hlOyAgICAvKiB0aGUgaW5ncmVzcyBjYWNoZSBvZiB0aGlzIE1QQyAgICAgICAqLworCisgICAgICAgIHJ3bG9ja190IGVncmVzc19sb2NrOworICAgICAgICBzdHJ1Y3QgZWdfY2FjaGVfb3BzICplZ19vcHM7IC8qIGVncmVzcyBjYWNoZSBvcGVyYXRpb25zICAgICAgICAgICAgICovCisgICAgICAgIGVnX2NhY2hlX2VudHJ5ICplZ19jYWNoZTsgICAgLyogdGhlIGVncmVzcyAgY2FjaGUgb2YgdGhpcyBNUEMgICAgICAgKi8KKworICAgICAgICB1aW50OF90ICptcHNfbWFjczsgICAgICAgICAgIC8qIGFycmF5IG9mIE1QUyBNQUMgYWRkcmVzc2VzLCA+PTEgICAgICovCisgICAgICAgIGludCBudW1iZXJfb2ZfbXBzX21hY3M7ICAgICAgLyogbnVtYmVyIG9mIHRoZSBhYm92ZSBNQUMgYWRkcmVzc2VzICAgKi8KKyAgICAgICAgc3RydWN0IG1wY19wYXJhbWV0ZXJzIHBhcmFtZXRlcnM7ICAvKiBwYXJhbWV0ZXJzIGZvciB0aGlzIGNsaWVudCAgICAqLworfTsKKworCitzdHJ1Y3QgYXRtX21wb2FfcW9zIHsKKyAgICAgICAgc3RydWN0IGF0bV9tcG9hX3FvcyAqbmV4dDsKKyAgICAgICAgdWludDMyX3QgaXBhZGRyOworICAgICAgICBzdHJ1Y3QgYXRtX3FvcyBxb3M7Cit9OworCisKKy8qIE1QT0EgUW9TIG9wZXJhdGlvbnMgKi8KK3N0cnVjdCBhdG1fbXBvYV9xb3MgKmF0bV9tcG9hX2FkZF9xb3ModWludDMyX3QgZHN0X2lwLCBzdHJ1Y3QgYXRtX3FvcyAqcW9zKTsKK3N0cnVjdCBhdG1fbXBvYV9xb3MgKmF0bV9tcG9hX3NlYXJjaF9xb3ModWludDMyX3QgZHN0X2lwKTsKK2ludCBhdG1fbXBvYV9kZWxldGVfcW9zKHN0cnVjdCBhdG1fbXBvYV9xb3MgKnFvcyk7CisKKy8qIERpc3BsYXkgUW9TIGVudHJpZXMuIFRoaXMgaXMgZm9yIHRoZSBwcm9jZnMgKi8KK3N0cnVjdCBzZXFfZmlsZTsKK3ZvaWQgYXRtX21wb2FfZGlzcF9xb3Moc3RydWN0IHNlcV9maWxlICptKTsKKworI2VuZGlmIC8qIF9NUENfSF8gKi8KZGlmZiAtLWdpdCBhL25ldC9hdG0vbXBvYV9jYWNoZXMuYyBiL25ldC9hdG0vbXBvYV9jYWNoZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGRkZWJiCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2F0bS9tcG9hX2NhY2hlcy5jCkBAIC0wLDAgKzEsNTc2IEBACisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1tcGMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKKyNpbmNsdWRlICJtcG9hX2NhY2hlcy5oIgorI2luY2x1ZGUgIm1wYy5oIgorCisvKgorICogbXBvYV9jYWNoZXMuYzogSW1wbGVtZW50YXRpb24gb2YgaW5ncmVzcyBhbmQgZWdyZXNzIGNhY2hlCisgKiBoYW5kbGluZyBmdW5jdGlvbnMKKyAqLworCisjaWYgMAorI2RlZmluZSBkcHJpbnRrIHByaW50ayAgICAvKiBkZWJ1ZyAqLworI2Vsc2UKKyNkZWZpbmUgZHByaW50ayhmb3JtYXQsYXJncy4uLikKKyNlbmRpZgorCisjaWYgMAorI2RlZmluZSBkZHByaW50ayBwcmludGsgIC8qIG1vcmUgZGVidWcgKi8KKyNlbHNlCisjZGVmaW5lIGRkcHJpbnRrKGZvcm1hdCxhcmdzLi4uKQorI2VuZGlmCisKK3N0YXRpYyBpbl9jYWNoZV9lbnRyeSAqaW5fY2FjaGVfZ2V0KHVpbnQzMl90IGRzdF9pcCwKKwkJCQkgICAgc3RydWN0IG1wb2FfY2xpZW50ICpjbGllbnQpCit7CisJaW5fY2FjaGVfZW50cnkgKmVudHJ5OworCisJcmVhZF9sb2NrX2JoKCZjbGllbnQtPmluZ3Jlc3NfbG9jayk7CisJZW50cnkgPSBjbGllbnQtPmluX2NhY2hlOworCXdoaWxlKGVudHJ5ICE9IE5VTEwpeworCQlpZiggZW50cnktPmN0cmxfaW5mby5pbl9kc3RfaXAgPT0gZHN0X2lwICl7CisJCQlhdG9taWNfaW5jKCZlbnRyeS0+dXNlKTsKKwkJCXJlYWRfdW5sb2NrX2JoKCZjbGllbnQtPmluZ3Jlc3NfbG9jayk7CisJCQlyZXR1cm4gZW50cnk7CisJCX0KKwkJZW50cnkgPSBlbnRyeS0+bmV4dDsKKwl9CisJcmVhZF91bmxvY2tfYmgoJmNsaWVudC0+aW5ncmVzc19sb2NrKTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5fY2FjaGVfZW50cnkgKmluX2NhY2hlX2dldF93aXRoX21hc2sodWludDMyX3QgZHN0X2lwLAorCQkJCQkgICAgICBzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCwKKwkJCQkJICAgICAgdWludDMyX3QgbWFzaykKK3sKKwlpbl9jYWNoZV9lbnRyeSAqZW50cnk7CisKKwlyZWFkX2xvY2tfYmgoJmNsaWVudC0+aW5ncmVzc19sb2NrKTsKKwllbnRyeSA9IGNsaWVudC0+aW5fY2FjaGU7CisJd2hpbGUoZW50cnkgIT0gTlVMTCl7CisJCWlmKChlbnRyeS0+Y3RybF9pbmZvLmluX2RzdF9pcCAmIG1hc2spICA9PSAoZHN0X2lwICYgbWFzayApKXsKKwkJCWF0b21pY19pbmMoJmVudHJ5LT51c2UpOworCQkJcmVhZF91bmxvY2tfYmgoJmNsaWVudC0+aW5ncmVzc19sb2NrKTsKKwkJCXJldHVybiBlbnRyeTsKKwkJfQorCQllbnRyeSA9IGVudHJ5LT5uZXh0OworCX0KKwlyZWFkX3VubG9ja19iaCgmY2xpZW50LT5pbmdyZXNzX2xvY2spOworCisJcmV0dXJuIE5VTEw7CisKK30KKworc3RhdGljIGluX2NhY2hlX2VudHJ5ICppbl9jYWNoZV9nZXRfYnlfdmNjKHN0cnVjdCBhdG1fdmNjICp2Y2MsCisJCQkJCSAgIHN0cnVjdCBtcG9hX2NsaWVudCAqY2xpZW50ICkKK3sKKwlpbl9jYWNoZV9lbnRyeSAqZW50cnk7CisKKwlyZWFkX2xvY2tfYmgoJmNsaWVudC0+aW5ncmVzc19sb2NrKTsKKwllbnRyeSA9IGNsaWVudC0+aW5fY2FjaGU7CisJd2hpbGUoZW50cnkgIT0gTlVMTCl7CisJCWlmKGVudHJ5LT5zaG9ydGN1dCA9PSB2Y2MpIHsKKwkJCWF0b21pY19pbmMoJmVudHJ5LT51c2UpOworCQkJcmVhZF91bmxvY2tfYmgoJmNsaWVudC0+aW5ncmVzc19sb2NrKTsKKwkJCXJldHVybiBlbnRyeTsKKwkJfQorCQllbnRyeSA9IGVudHJ5LT5uZXh0OworCX0KKwlyZWFkX3VubG9ja19iaCgmY2xpZW50LT5pbmdyZXNzX2xvY2spOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbl9jYWNoZV9lbnRyeSAqaW5fY2FjaGVfYWRkX2VudHJ5KHVpbnQzMl90IGRzdF9pcCwKKwkJCQkJICBzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCkKK3sKKwl1bnNpZ25lZCBjaGFyICppcCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkgPSAodW5zaWduZWQgY2hhciAqKSZkc3RfaXA7CisJaW5fY2FjaGVfZW50cnkqIGVudHJ5ID0ga21hbGxvYyhzaXplb2YoaW5fY2FjaGVfZW50cnkpLCBHRlBfS0VSTkVMKTsKKworCWlmIChlbnRyeSA9PSBOVUxMKSB7CisJCXByaW50aygibXBvYTogbXBvYV9jYWNoZXMuYzogbmV3X2luX2NhY2hlX2VudHJ5OiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZHByaW50aygibXBvYTogbXBvYV9jYWNoZXMuYzogYWRkaW5nIGFuIGluZ3Jlc3MgZW50cnksIGlwID0gJXUuJXUuJXUuJXVcbiIsIGlwWzBdLCBpcFsxXSwgaXBbMl0sIGlwWzNdKTsKKwltZW1zZXQoZW50cnksMCxzaXplb2YoaW5fY2FjaGVfZW50cnkpKTsKKworCWF0b21pY19zZXQoJmVudHJ5LT51c2UsIDEpOworCWRwcmludGsoIm1wb2E6IG1wb2FfY2FjaGVzLmM6IG5ld19pbl9jYWNoZV9lbnRyeTogYWJvdXQgdG8gbG9ja1xuIik7CisJd3JpdGVfbG9ja19iaCgmY2xpZW50LT5pbmdyZXNzX2xvY2spOworCWVudHJ5LT5uZXh0ID0gY2xpZW50LT5pbl9jYWNoZTsKKwllbnRyeS0+cHJldiA9IE5VTEw7CisJaWYgKGNsaWVudC0+aW5fY2FjaGUgIT0gTlVMTCkKKwkJY2xpZW50LT5pbl9jYWNoZS0+cHJldiA9IGVudHJ5OworCWNsaWVudC0+aW5fY2FjaGUgPSBlbnRyeTsKKworCW1lbWNweShlbnRyeS0+TVBTX2N0cmxfQVRNX2FkZHIsIGNsaWVudC0+bXBzX2N0cmxfYWRkciwgQVRNX0VTQV9MRU4pOworCWVudHJ5LT5jdHJsX2luZm8uaW5fZHN0X2lwID0gZHN0X2lwOworCWRvX2dldHRpbWVvZmRheSgmKGVudHJ5LT50dikpOworCWVudHJ5LT5yZXRyeV90aW1lID0gY2xpZW50LT5wYXJhbWV0ZXJzLm1wY19wNDsKKwllbnRyeS0+Y291bnQgPSAxOworCWVudHJ5LT5lbnRyeV9zdGF0ZSA9IElOR1JFU1NfSU5WQUxJRDsKKwllbnRyeS0+Y3RybF9pbmZvLmhvbGRpbmdfdGltZSA9IEhPTERJTkdfVElNRV9ERUZBVUxUOworCWF0b21pY19pbmMoJmVudHJ5LT51c2UpOworCisJd3JpdGVfdW5sb2NrX2JoKCZjbGllbnQtPmluZ3Jlc3NfbG9jayk7CisJZHByaW50aygibXBvYTogbXBvYV9jYWNoZXMuYzogbmV3X2luX2NhY2hlX2VudHJ5OiB1bmxvY2tlZFxuIik7CisKKwlyZXR1cm4gZW50cnk7Cit9CisKK3N0YXRpYyBpbnQgY2FjaGVfaGl0KGluX2NhY2hlX2VudHJ5ICplbnRyeSwgc3RydWN0IG1wb2FfY2xpZW50ICptcGMpCit7CisJc3RydWN0IGF0bV9tcG9hX3FvcyAqcW9zOworCXN0cnVjdCBrX21lc3NhZ2UgbXNnOworCisJZW50cnktPmNvdW50Kys7CisJaWYoZW50cnktPmVudHJ5X3N0YXRlID09IElOR1JFU1NfUkVTT0xWRUQgJiYgZW50cnktPnNob3J0Y3V0ICE9IE5VTEwpCisJCXJldHVybiBPUEVOOworCisJaWYoZW50cnktPmVudHJ5X3N0YXRlID09IElOR1JFU1NfUkVGUkVTSElORyl7CisJCWlmKGVudHJ5LT5jb3VudCA+IG1wYy0+cGFyYW1ldGVycy5tcGNfcDEpeworCQkJbXNnLnR5cGUgPSBTTkRfTVBPQV9SRVNfUlFTVDsKKwkJCW1zZy5jb250ZW50LmluX2luZm8gPSBlbnRyeS0+Y3RybF9pbmZvOworCQkJbWVtY3B5KG1zZy5NUFNfY3RybCwgbXBjLT5tcHNfY3RybF9hZGRyLCBBVE1fRVNBX0xFTik7CisJCQlxb3MgPSBhdG1fbXBvYV9zZWFyY2hfcW9zKGVudHJ5LT5jdHJsX2luZm8uaW5fZHN0X2lwKTsKKwkJCWlmIChxb3MgIT0gTlVMTCkgbXNnLnFvcyA9IHFvcy0+cW9zOworCQkJbXNnX3RvX21wb2FkKCZtc2csIG1wYyk7CisJCQlkb19nZXR0aW1lb2ZkYXkoJihlbnRyeS0+cmVwbHlfd2FpdCkpOworCQkJZW50cnktPmVudHJ5X3N0YXRlID0gSU5HUkVTU19SRVNPTFZJTkc7CisJCX0KKwkJaWYoZW50cnktPnNob3J0Y3V0ICE9IE5VTEwpCisJCQlyZXR1cm4gT1BFTjsKKwkJcmV0dXJuIENMT1NFRDsKKwl9CisKKwlpZihlbnRyeS0+ZW50cnlfc3RhdGUgPT0gSU5HUkVTU19SRVNPTFZJTkcgJiYgZW50cnktPnNob3J0Y3V0ICE9IE5VTEwpCisJCXJldHVybiBPUEVOOworCisJaWYoIGVudHJ5LT5jb3VudCA+IG1wYy0+cGFyYW1ldGVycy5tcGNfcDEgJiYKKwkgICAgZW50cnktPmVudHJ5X3N0YXRlID09IElOR1JFU1NfSU5WQUxJRCl7CisJCXVuc2lnbmVkIGNoYXIgKmlwIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSA9CisJCSAgICAodW5zaWduZWQgY2hhciAqKSZlbnRyeS0+Y3RybF9pbmZvLmluX2RzdF9pcDsKKworCQlkcHJpbnRrKCJtcG9hOiAoJXMpIG1wb2FfY2FjaGVzLmM6IHRocmVzaG9sZCBleGNlZWRlZCBmb3IgaXAgJXUuJXUuJXUuJXUsIHNlbmRpbmcgTVBPQSByZXMgcmVxXG4iLCBtcGMtPmRldi0+bmFtZSwgaXBbMF0sIGlwWzFdLCBpcFsyXSwgaXBbM10pOworCQllbnRyeS0+ZW50cnlfc3RhdGUgPSBJTkdSRVNTX1JFU09MVklORzsKKwkJbXNnLnR5cGUgPSAgU05EX01QT0FfUkVTX1JRU1Q7CisJCW1lbWNweShtc2cuTVBTX2N0cmwsIG1wYy0+bXBzX2N0cmxfYWRkciwgQVRNX0VTQV9MRU4gKTsKKwkJbXNnLmNvbnRlbnQuaW5faW5mbyA9IGVudHJ5LT5jdHJsX2luZm87CisJCXFvcyA9IGF0bV9tcG9hX3NlYXJjaF9xb3MoZW50cnktPmN0cmxfaW5mby5pbl9kc3RfaXApOworCQlpZiAocW9zICE9IE5VTEwpIG1zZy5xb3MgPSBxb3MtPnFvczsKKwkJbXNnX3RvX21wb2FkKCAmbXNnLCBtcGMpOworCQlkb19nZXR0aW1lb2ZkYXkoJihlbnRyeS0+cmVwbHlfd2FpdCkpOworCX0KKworCXJldHVybiBDTE9TRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGluX2NhY2hlX3B1dChpbl9jYWNoZV9lbnRyeSAqZW50cnkpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmVudHJ5LT51c2UpKSB7CisJCW1lbXNldChlbnRyeSwgMCwgc2l6ZW9mKGluX2NhY2hlX2VudHJ5KSk7CisJCWtmcmVlKGVudHJ5KTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2l0aCB3cml0ZSBsb2NrIG9uCisgKi8KK3N0YXRpYyB2b2lkIGluX2NhY2hlX3JlbW92ZV9lbnRyeShpbl9jYWNoZV9lbnRyeSAqZW50cnksCisJCQkJICBzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYXRtX3ZjYyAqdmNjOworCXN0cnVjdCBrX21lc3NhZ2UgbXNnOworCXVuc2lnbmVkIGNoYXIgKmlwOworCisJdmNjID0gZW50cnktPnNob3J0Y3V0OworCWlwID0gKHVuc2lnbmVkIGNoYXIgKikmZW50cnktPmN0cmxfaW5mby5pbl9kc3RfaXA7CisJZHByaW50aygibXBvYTogbXBvYV9jYWNoZXMuYzogcmVtb3ZpbmcgYW4gaW5ncmVzcyBlbnRyeSwgaXAgPSAldS4ldS4ldS4ldVxuIixpcFswXSwgaXBbMV0sIGlwWzJdLCBpcFszXSk7CisKKwlpZiAoZW50cnktPnByZXYgIT0gTlVMTCkKKwkJZW50cnktPnByZXYtPm5leHQgPSBlbnRyeS0+bmV4dDsKKwllbHNlCisJCWNsaWVudC0+aW5fY2FjaGUgPSBlbnRyeS0+bmV4dDsKKwlpZiAoZW50cnktPm5leHQgIT0gTlVMTCkKKwkJZW50cnktPm5leHQtPnByZXYgPSBlbnRyeS0+cHJldjsKKwljbGllbnQtPmluX29wcy0+cHV0KGVudHJ5KTsKKwlpZihjbGllbnQtPmluX2NhY2hlID09IE5VTEwgJiYgY2xpZW50LT5lZ19jYWNoZSA9PSBOVUxMKXsKKwkJbXNnLnR5cGUgPSBTVE9QX0tFRVBfQUxJVkVfU007CisJCW1zZ190b19tcG9hZCgmbXNnLGNsaWVudCk7CisJfQorCisJLyogQ2hlY2sgaWYgdGhlIGVncmVzcyBzaWRlIHN0aWxsIHVzZXMgdGhpcyBWQ0MgKi8KKwlpZiAodmNjICE9IE5VTEwpIHsKKwkJZWdfY2FjaGVfZW50cnkgKmVnX2VudHJ5ID0gY2xpZW50LT5lZ19vcHMtPmdldF9ieV92Y2ModmNjLCBjbGllbnQpOworCQlpZiAoZWdfZW50cnkgIT0gTlVMTCkgeworCQkJY2xpZW50LT5lZ19vcHMtPnB1dChlZ19lbnRyeSk7CisJCQlyZXR1cm47CisJCX0KKwkJdmNjX3JlbGVhc2VfYXN5bmModmNjLCAtRVBJUEUpOworCX0KKworCXJldHVybjsKK30KKworCisvKiBDYWxsIHRoaXMgZXZlcnkgTVBDLXAyIHNlY29uZHMuLi4gTm90IGV4YWN0bHkgY29ycmVjdCBzb2x1dGlvbiwKKyAgIGJ1dCBhbiBlYXN5IG9uZS4uLiAqLworc3RhdGljIHZvaWQgY2xlYXJfY291bnRfYW5kX2V4cGlyZWQoc3RydWN0IG1wb2FfY2xpZW50ICpjbGllbnQpCit7CisJdW5zaWduZWQgY2hhciAqaXA7CisJaW5fY2FjaGVfZW50cnkgKmVudHJ5LCAqbmV4dF9lbnRyeTsKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CisKKwlkb19nZXR0aW1lb2ZkYXkoJm5vdyk7CisKKwl3cml0ZV9sb2NrX2JoKCZjbGllbnQtPmluZ3Jlc3NfbG9jayk7CisJZW50cnkgPSBjbGllbnQtPmluX2NhY2hlOworCXdoaWxlKGVudHJ5ICE9IE5VTEwpeworCQllbnRyeS0+Y291bnQ9MDsKKwkJbmV4dF9lbnRyeSA9IGVudHJ5LT5uZXh0OworCQlpZigobm93LnR2X3NlYyAtIGVudHJ5LT50di50dl9zZWMpCisJCSAgID4gZW50cnktPmN0cmxfaW5mby5ob2xkaW5nX3RpbWUpeworCQkJaXAgPSAodW5zaWduZWQgY2hhciopJmVudHJ5LT5jdHJsX2luZm8uaW5fZHN0X2lwOworCQkJZHByaW50aygibXBvYTogbXBvYV9jYWNoZXMuYzogaG9sZGluZyB0aW1lIGV4cGlyZWQsIGlwID0gJXUuJXUuJXUuJXVcbiIsIE5JUFFVQUQoaXApKTsKKwkJCWNsaWVudC0+aW5fb3BzLT5yZW1vdmVfZW50cnkoZW50cnksIGNsaWVudCk7CisJCX0KKwkJZW50cnkgPSBuZXh0X2VudHJ5OworCX0KKwl3cml0ZV91bmxvY2tfYmgoJmNsaWVudC0+aW5ncmVzc19sb2NrKTsKKworCXJldHVybjsKK30KKworLyogQ2FsbCB0aGlzIGV2ZXJ5IE1QQy1wNCBzZWNvbmRzLiAqLworc3RhdGljIHZvaWQgY2hlY2tfcmVzb2x2aW5nX2VudHJpZXMoc3RydWN0IG1wb2FfY2xpZW50ICpjbGllbnQpCit7CisKKwlzdHJ1Y3QgYXRtX21wb2FfcW9zICpxb3M7CisJaW5fY2FjaGVfZW50cnkgKmVudHJ5OworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwlzdHJ1Y3Qga19tZXNzYWdlIG1zZzsKKworCWRvX2dldHRpbWVvZmRheSggJm5vdyApOworCisJcmVhZF9sb2NrX2JoKCZjbGllbnQtPmluZ3Jlc3NfbG9jayk7CisJZW50cnkgPSBjbGllbnQtPmluX2NhY2hlOworCXdoaWxlKCBlbnRyeSAhPSBOVUxMICl7CisJCWlmKGVudHJ5LT5lbnRyeV9zdGF0ZSA9PSBJTkdSRVNTX1JFU09MVklORyl7CisJCQlpZihub3cudHZfc2VjIC0gZW50cnktPmhvbGRfZG93bi50dl9zZWMgPCBjbGllbnQtPnBhcmFtZXRlcnMubXBjX3A2KXsKKwkJCQllbnRyeSA9IGVudHJ5LT5uZXh0OyAgICAgICAgICAgICAgICAgICAgICAvKiBFbnRyeSBpbiBob2xkIGRvd24gKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmKCAobm93LnR2X3NlYyAtIGVudHJ5LT5yZXBseV93YWl0LnR2X3NlYykgPgorCQkJICAgIGVudHJ5LT5yZXRyeV90aW1lICl7CisJCQkJZW50cnktPnJldHJ5X3RpbWUgPSBNUENfQzEqKCBlbnRyeS0+cmV0cnlfdGltZSApOworCQkJCWlmKGVudHJ5LT5yZXRyeV90aW1lID4gY2xpZW50LT5wYXJhbWV0ZXJzLm1wY19wNSl7CisJCQkJCS8qIFJldHJ5IHRpbWUgbWF4aW11bSBleGNlZWRlZCwgcHV0IGVudHJ5IGluIGhvbGQgZG93bi4gKi8KKwkJCQkJZG9fZ2V0dGltZW9mZGF5KCYoZW50cnktPmhvbGRfZG93bikpOworCQkJCQllbnRyeS0+cmV0cnlfdGltZSA9IGNsaWVudC0+cGFyYW1ldGVycy5tcGNfcDQ7CisJCQkJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvKiBBc2sgZGFlbW9uIHRvIHNlbmQgYSByZXNvbHV0aW9uIHJlcXVlc3QuICovCisJCQkJbWVtc2V0KCYoZW50cnktPmhvbGRfZG93biksMCxzaXplb2Yoc3RydWN0IHRpbWV2YWwpKTsKKwkJCQltc2cudHlwZSA9IFNORF9NUE9BX1JFU19SVFJZOworCQkJCW1lbWNweShtc2cuTVBTX2N0cmwsIGNsaWVudC0+bXBzX2N0cmxfYWRkciwgQVRNX0VTQV9MRU4pOworCQkJCW1zZy5jb250ZW50LmluX2luZm8gPSBlbnRyeS0+Y3RybF9pbmZvOworCQkJCXFvcyA9IGF0bV9tcG9hX3NlYXJjaF9xb3MoZW50cnktPmN0cmxfaW5mby5pbl9kc3RfaXApOworCQkJCWlmIChxb3MgIT0gTlVMTCkgbXNnLnFvcyA9IHFvcy0+cW9zOworCQkJCW1zZ190b19tcG9hZCgmbXNnLCBjbGllbnQpOworCQkJCWRvX2dldHRpbWVvZmRheSgmKGVudHJ5LT5yZXBseV93YWl0KSk7CisJCQl9CisJCX0KKwkJZW50cnkgPSBlbnRyeS0+bmV4dDsKKwl9CisJcmVhZF91bmxvY2tfYmgoJmNsaWVudC0+aW5ncmVzc19sb2NrKTsKK30KKworLyogQ2FsbCB0aGlzIGV2ZXJ5IE1QQy1wNSBzZWNvbmRzLiAqLworc3RhdGljIHZvaWQgcmVmcmVzaF9lbnRyaWVzKHN0cnVjdCBtcG9hX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwlzdHJ1Y3QgaW5fY2FjaGVfZW50cnkgKmVudHJ5ID0gY2xpZW50LT5pbl9jYWNoZTsKKworCWRkcHJpbnRrKCJtcG9hOiBtcG9hX2NhY2hlcy5jOiByZWZyZXNoX2VudHJpZXNcbiIpOworCWRvX2dldHRpbWVvZmRheSgmbm93KTsKKworCXJlYWRfbG9ja19iaCgmY2xpZW50LT5pbmdyZXNzX2xvY2spOworCXdoaWxlKCBlbnRyeSAhPSBOVUxMICl7CisJCWlmKCBlbnRyeS0+ZW50cnlfc3RhdGUgPT0gSU5HUkVTU19SRVNPTFZFRCApeworCQkJaWYoIShlbnRyeS0+cmVmcmVzaF90aW1lKSkKKwkJCQllbnRyeS0+cmVmcmVzaF90aW1lID0gKDIqKGVudHJ5LT5jdHJsX2luZm8uaG9sZGluZ190aW1lKSkvMzsKKwkJCWlmKCAobm93LnR2X3NlYyAtIGVudHJ5LT5yZXBseV93YWl0LnR2X3NlYykgPiBlbnRyeS0+cmVmcmVzaF90aW1lICl7CisJCQkJZHByaW50aygibXBvYTogbXBvYV9jYWNoZXMuYzogcmVmcmVzaGluZyBhbiBlbnRyeS5cbiIpOworCQkJCWVudHJ5LT5lbnRyeV9zdGF0ZSA9IElOR1JFU1NfUkVGUkVTSElORzsKKworCQkJfQorCQl9CisJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJfQorCXJlYWRfdW5sb2NrX2JoKCZjbGllbnQtPmluZ3Jlc3NfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGluX2Rlc3Ryb3lfY2FjaGUoc3RydWN0IG1wb2FfY2xpZW50ICptcGMpCit7CisJd3JpdGVfbG9ja19pcnEoJm1wYy0+aW5ncmVzc19sb2NrKTsKKwl3aGlsZShtcGMtPmluX2NhY2hlICE9IE5VTEwpCisJCW1wYy0+aW5fb3BzLT5yZW1vdmVfZW50cnkobXBjLT5pbl9jYWNoZSwgbXBjKTsKKwl3cml0ZV91bmxvY2tfaXJxKCZtcGMtPmluZ3Jlc3NfbG9jayk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBlZ19jYWNoZV9lbnRyeSAqZWdfY2FjaGVfZ2V0X2J5X2NhY2hlX2lkKHVpbnQzMl90IGNhY2hlX2lkLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYykKK3sKKwllZ19jYWNoZV9lbnRyeSAqZW50cnk7CisKKwlyZWFkX2xvY2tfaXJxKCZtcGMtPmVncmVzc19sb2NrKTsKKwllbnRyeSA9IG1wYy0+ZWdfY2FjaGU7CisJd2hpbGUoZW50cnkgIT0gTlVMTCl7CisJCWlmKGVudHJ5LT5jdHJsX2luZm8uY2FjaGVfaWQgPT0gY2FjaGVfaWQpeworCQkJYXRvbWljX2luYygmZW50cnktPnVzZSk7CisJCQlyZWFkX3VubG9ja19pcnEoJm1wYy0+ZWdyZXNzX2xvY2spOworCQkJcmV0dXJuIGVudHJ5OworCQl9CisJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJfQorCXJlYWRfdW5sb2NrX2lycSgmbXBjLT5lZ3Jlc3NfbG9jayk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gYW55IGNvbnRleHQgc2luY2UgaXQgc2F2ZXMgQ1BVIGZsYWdzICovCitzdGF0aWMgZWdfY2FjaGVfZW50cnkgKmVnX2NhY2hlX2dldF9ieV90YWcodWludDMyX3QgdGFnLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWVnX2NhY2hlX2VudHJ5ICplbnRyeTsKKworCXJlYWRfbG9ja19pcnFzYXZlKCZtcGMtPmVncmVzc19sb2NrLCBmbGFncyk7CisJZW50cnkgPSBtcGMtPmVnX2NhY2hlOworCXdoaWxlIChlbnRyeSAhPSBOVUxMKXsKKwkJaWYgKGVudHJ5LT5jdHJsX2luZm8udGFnID09IHRhZykgeworCQkJYXRvbWljX2luYygmZW50cnktPnVzZSk7CisJCQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZtcGMtPmVncmVzc19sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gZW50cnk7CisJCX0KKwkJZW50cnkgPSBlbnRyeS0+bmV4dDsKKwl9CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmbXBjLT5lZ3Jlc3NfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFRoaXMgY2FuIGJlIGNhbGxlZCBmcm9tIGFueSBjb250ZXh0IHNpbmNlIGl0IHNhdmVzIENQVSBmbGFncyAqLworc3RhdGljIGVnX2NhY2hlX2VudHJ5ICplZ19jYWNoZV9nZXRfYnlfdmNjKHN0cnVjdCBhdG1fdmNjICp2Y2MsIHN0cnVjdCBtcG9hX2NsaWVudCAqbXBjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZWdfY2FjaGVfZW50cnkgKmVudHJ5OworCisJcmVhZF9sb2NrX2lycXNhdmUoJm1wYy0+ZWdyZXNzX2xvY2ssIGZsYWdzKTsKKwllbnRyeSA9IG1wYy0+ZWdfY2FjaGU7CisJd2hpbGUgKGVudHJ5ICE9IE5VTEwpeworCQlpZiAoZW50cnktPnNob3J0Y3V0ID09IHZjYykgeworCQkJYXRvbWljX2luYygmZW50cnktPnVzZSk7CisJICAgICAgIAkJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmbXBjLT5lZ3Jlc3NfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIGVudHJ5OworCQl9CisJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJfQorCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJm1wYy0+ZWdyZXNzX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgZWdfY2FjaGVfZW50cnkgKmVnX2NhY2hlX2dldF9ieV9zcmNfaXAodWludDMyX3QgaXBhZGRyLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYykKK3sKKwllZ19jYWNoZV9lbnRyeSAqZW50cnk7CisKKwlyZWFkX2xvY2tfaXJxKCZtcGMtPmVncmVzc19sb2NrKTsKKwllbnRyeSA9IG1wYy0+ZWdfY2FjaGU7CisJd2hpbGUoZW50cnkgIT0gTlVMTCl7CisJCWlmKGVudHJ5LT5sYXRlc3RfaXBfYWRkciA9PSBpcGFkZHIpIHsKKwkJCWF0b21pY19pbmMoJmVudHJ5LT51c2UpOworCSAgICAgICAJCXJlYWRfdW5sb2NrX2lycSgmbXBjLT5lZ3Jlc3NfbG9jayk7CisJCQlyZXR1cm4gZW50cnk7CisJCX0KKwkJZW50cnkgPSBlbnRyeS0+bmV4dDsKKwl9CisJcmVhZF91bmxvY2tfaXJxKCZtcGMtPmVncmVzc19sb2NrKTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBlZ19jYWNoZV9wdXQoZWdfY2FjaGVfZW50cnkgKmVudHJ5KQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZlbnRyeS0+dXNlKSkgeworCQltZW1zZXQoZW50cnksIDAsIHNpemVvZihlZ19jYWNoZV9lbnRyeSkpOworCQlrZnJlZShlbnRyeSk7CisJfQorCisJcmV0dXJuOworfQorCisvKgorICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdpdGggd3JpdGUgbG9jayBvbgorICovCitzdGF0aWMgdm9pZCBlZ19jYWNoZV9yZW1vdmVfZW50cnkoZWdfY2FjaGVfZW50cnkgKmVudHJ5LAorCQkJCSAgc3RydWN0IG1wb2FfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGF0bV92Y2MgKnZjYzsKKwlzdHJ1Y3Qga19tZXNzYWdlIG1zZzsKKworCXZjYyA9IGVudHJ5LT5zaG9ydGN1dDsKKwlkcHJpbnRrKCJtcG9hOiBtcG9hX2NhY2hlcy5jOiByZW1vdmluZyBhbiBlZ3Jlc3MgZW50cnkuXG4iKTsKKwlpZiAoZW50cnktPnByZXYgIT0gTlVMTCkKKwkJZW50cnktPnByZXYtPm5leHQgPSBlbnRyeS0+bmV4dDsKKwllbHNlCisJCWNsaWVudC0+ZWdfY2FjaGUgPSBlbnRyeS0+bmV4dDsKKwlpZiAoZW50cnktPm5leHQgIT0gTlVMTCkKKwkJZW50cnktPm5leHQtPnByZXYgPSBlbnRyeS0+cHJldjsKKwljbGllbnQtPmVnX29wcy0+cHV0KGVudHJ5KTsKKwlpZihjbGllbnQtPmluX2NhY2hlID09IE5VTEwgJiYgY2xpZW50LT5lZ19jYWNoZSA9PSBOVUxMKXsKKwkJbXNnLnR5cGUgPSBTVE9QX0tFRVBfQUxJVkVfU007CisJCW1zZ190b19tcG9hZCgmbXNnLGNsaWVudCk7CisJfQorCisJLyogQ2hlY2sgaWYgdGhlIGluZ3Jlc3Mgc2lkZSBzdGlsbCB1c2VzIHRoaXMgVkNDICovCisJaWYgKHZjYyAhPSBOVUxMKSB7CisJCWluX2NhY2hlX2VudHJ5ICppbl9lbnRyeSA9IGNsaWVudC0+aW5fb3BzLT5nZXRfYnlfdmNjKHZjYywgY2xpZW50KTsKKwkJaWYgKGluX2VudHJ5ICE9IE5VTEwpIHsKKwkJCWNsaWVudC0+aW5fb3BzLT5wdXQoaW5fZW50cnkpOworCQkJcmV0dXJuOworCQl9CisJCXZjY19yZWxlYXNlX2FzeW5jKHZjYywgLUVQSVBFKTsKKwl9CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBlZ19jYWNoZV9lbnRyeSAqZWdfY2FjaGVfYWRkX2VudHJ5KHN0cnVjdCBrX21lc3NhZ2UgKm1zZywgc3RydWN0IG1wb2FfY2xpZW50ICpjbGllbnQpCit7CisJdW5zaWduZWQgY2hhciAqaXA7CisJZWdfY2FjaGVfZW50cnkgKmVudHJ5ID0ga21hbGxvYyhzaXplb2YoZWdfY2FjaGVfZW50cnkpLCBHRlBfS0VSTkVMKTsKKworCWlmIChlbnRyeSA9PSBOVUxMKSB7CisJCXByaW50aygibXBvYTogbXBvYV9jYWNoZXMuYzogbmV3X2VnX2NhY2hlX2VudHJ5OiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaXAgPSAodW5zaWduZWQgY2hhciAqKSZtc2ctPmNvbnRlbnQuZWdfaW5mby5lZ19kc3RfaXA7CisJZHByaW50aygibXBvYTogbXBvYV9jYWNoZXMuYzogYWRkaW5nIGFuIGVncmVzcyBlbnRyeSwgaXAgPSAldS4ldS4ldS4ldSwgdGhpcyBzaG91bGQgYmUgb3VyIElQXG4iLCBOSVBRVUFEKGlwKSk7CisJbWVtc2V0KGVudHJ5LCAwLCBzaXplb2YoZWdfY2FjaGVfZW50cnkpKTsKKworCWF0b21pY19zZXQoJmVudHJ5LT51c2UsIDEpOworCWRwcmludGsoIm1wb2E6IG1wb2FfY2FjaGVzLmM6IG5ld19lZ19jYWNoZV9lbnRyeTogYWJvdXQgdG8gbG9ja1xuIik7CisJd3JpdGVfbG9ja19pcnEoJmNsaWVudC0+ZWdyZXNzX2xvY2spOworCWVudHJ5LT5uZXh0ID0gY2xpZW50LT5lZ19jYWNoZTsKKwllbnRyeS0+cHJldiA9IE5VTEw7CisJaWYgKGNsaWVudC0+ZWdfY2FjaGUgIT0gTlVMTCkKKwkJY2xpZW50LT5lZ19jYWNoZS0+cHJldiA9IGVudHJ5OworCWNsaWVudC0+ZWdfY2FjaGUgPSBlbnRyeTsKKworCW1lbWNweShlbnRyeS0+TVBTX2N0cmxfQVRNX2FkZHIsIGNsaWVudC0+bXBzX2N0cmxfYWRkciwgQVRNX0VTQV9MRU4pOworCWVudHJ5LT5jdHJsX2luZm8gPSBtc2ctPmNvbnRlbnQuZWdfaW5mbzsKKwlkb19nZXR0aW1lb2ZkYXkoJihlbnRyeS0+dHYpKTsKKwllbnRyeS0+ZW50cnlfc3RhdGUgPSBFR1JFU1NfUkVTT0xWRUQ7CisJZHByaW50aygibXBvYTogbXBvYV9jYWNoZXMuYzogbmV3X2VnX2NhY2hlX2VudHJ5IGNhY2hlX2lkICVsdVxuIiwgbnRvaGwoZW50cnktPmN0cmxfaW5mby5jYWNoZV9pZCkpOworCWlwID0gKHVuc2lnbmVkIGNoYXIgKikmZW50cnktPmN0cmxfaW5mby5tcHNfaXA7CisJZHByaW50aygibXBvYTogbXBvYV9jYWNoZXMuYzogbXBzX2lwID0gJXUuJXUuJXUuJXVcbiIsIE5JUFFVQUQoaXApKTsKKwlhdG9taWNfaW5jKCZlbnRyeS0+dXNlKTsKKworCXdyaXRlX3VubG9ja19pcnEoJmNsaWVudC0+ZWdyZXNzX2xvY2spOworCWRwcmludGsoIm1wb2E6IG1wb2FfY2FjaGVzLmM6IG5ld19lZ19jYWNoZV9lbnRyeTogdW5sb2NrZWRcbiIpOworCisJcmV0dXJuIGVudHJ5OworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfZWdfY2FjaGVfZW50cnkoZWdfY2FjaGVfZW50cnkgKiBlbnRyeSwgdWludDE2X3QgaG9sZGluZ190aW1lKQoreworCWRvX2dldHRpbWVvZmRheSgmKGVudHJ5LT50dikpOworCWVudHJ5LT5lbnRyeV9zdGF0ZSA9IEVHUkVTU19SRVNPTFZFRDsKKwllbnRyeS0+Y3RybF9pbmZvLmhvbGRpbmdfdGltZSA9IGhvbGRpbmdfdGltZTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfZXhwaXJlZChzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCkKK3sKKwllZ19jYWNoZV9lbnRyeSAqZW50cnksICpuZXh0X2VudHJ5OworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwlzdHJ1Y3Qga19tZXNzYWdlIG1zZzsKKworCWRvX2dldHRpbWVvZmRheSgmbm93KTsKKworCXdyaXRlX2xvY2tfaXJxKCZjbGllbnQtPmVncmVzc19sb2NrKTsKKwllbnRyeSA9IGNsaWVudC0+ZWdfY2FjaGU7CisJd2hpbGUoZW50cnkgIT0gTlVMTCl7CisJCW5leHRfZW50cnkgPSBlbnRyeS0+bmV4dDsKKwkJaWYoKG5vdy50dl9zZWMgLSBlbnRyeS0+dHYudHZfc2VjKQorCQkgICA+IGVudHJ5LT5jdHJsX2luZm8uaG9sZGluZ190aW1lKXsKKwkJCW1zZy50eXBlID0gU05EX0VHUkVTU19QVVJHRTsKKwkJCW1zZy5jb250ZW50LmVnX2luZm8gPSBlbnRyeS0+Y3RybF9pbmZvOworCQkJZHByaW50aygibXBvYTogbXBvYV9jYWNoZXMuYzogZWdyZXNzX2NhY2hlOiBob2xkaW5nIHRpbWUgZXhwaXJlZCwgY2FjaGVfaWQgPSAlbHUuXG4iLG50b2hsKGVudHJ5LT5jdHJsX2luZm8uY2FjaGVfaWQpKTsKKwkJCW1zZ190b19tcG9hZCgmbXNnLCBjbGllbnQpOworCQkJY2xpZW50LT5lZ19vcHMtPnJlbW92ZV9lbnRyeShlbnRyeSwgY2xpZW50KTsKKwkJfQorCQllbnRyeSA9IG5leHRfZW50cnk7CisJfQorCXdyaXRlX3VubG9ja19pcnEoJmNsaWVudC0+ZWdyZXNzX2xvY2spOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBlZ19kZXN0cm95X2NhY2hlKHN0cnVjdCBtcG9hX2NsaWVudCAqbXBjKQoreworCXdyaXRlX2xvY2tfaXJxKCZtcGMtPmVncmVzc19sb2NrKTsKKwl3aGlsZShtcGMtPmVnX2NhY2hlICE9IE5VTEwpCisJCW1wYy0+ZWdfb3BzLT5yZW1vdmVfZW50cnkobXBjLT5lZ19jYWNoZSwgbXBjKTsKKwl3cml0ZV91bmxvY2tfaXJxKCZtcGMtPmVncmVzc19sb2NrKTsKKworCXJldHVybjsKK30KKworCisKK3N0YXRpYyBzdHJ1Y3QgaW5fY2FjaGVfb3BzIGluZ3Jlc3Nfb3BzID0geworCWluX2NhY2hlX2FkZF9lbnRyeSwgICAgICAgICAgICAgICAvKiBhZGRfZW50cnkgICAgICAgKi8KKwlpbl9jYWNoZV9nZXQsICAgICAgICAgICAgICAgICAgICAgLyogZ2V0ICAgICAgICAgICAgICovCisJaW5fY2FjaGVfZ2V0X3dpdGhfbWFzaywgICAgICAgICAgIC8qIGdldF93aXRoX21hc2sgICAqLworCWluX2NhY2hlX2dldF9ieV92Y2MsICAgICAgICAgICAgICAvKiBnZXRfYnlfdmNjICAgICAgKi8KKwlpbl9jYWNoZV9wdXQsICAgICAgICAgICAgICAgICAgICAgLyogcHV0ICAgICAgICAgICAgICovCisJaW5fY2FjaGVfcmVtb3ZlX2VudHJ5LCAgICAgICAgICAgIC8qIHJlbW92ZV9lbnRyeSAgICAqLworCWNhY2hlX2hpdCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWNoZV9oaXQgICAgICAgKi8KKwljbGVhcl9jb3VudF9hbmRfZXhwaXJlZCwgICAgICAgICAgLyogY2xlYXJfY291bnQgICAgICovCisJY2hlY2tfcmVzb2x2aW5nX2VudHJpZXMsICAgICAgICAgIC8qIGNoZWNrX3Jlc29sdmluZyAqLworCXJlZnJlc2hfZW50cmllcywgICAgICAgICAgICAgICAgICAvKiByZWZyZXNoICAgICAgICAgKi8KKwlpbl9kZXN0cm95X2NhY2hlICAgICAgICAgICAgICAgICAgLyogZGVzdHJveV9jYWNoZSAgICovCit9OworCitzdGF0aWMgc3RydWN0IGVnX2NhY2hlX29wcyBlZ3Jlc3Nfb3BzID0geworCWVnX2NhY2hlX2FkZF9lbnRyeSwgICAgICAgICAgICAgICAvKiBhZGRfZW50cnkgICAgICAgICovCisJZWdfY2FjaGVfZ2V0X2J5X2NhY2hlX2lkLCAgICAgICAgIC8qIGdldF9ieV9jYWNoZV9pZCAgKi8KKwllZ19jYWNoZV9nZXRfYnlfdGFnLCAgICAgICAgICAgICAgLyogZ2V0X2J5X3RhZyAgICAgICAqLworCWVnX2NhY2hlX2dldF9ieV92Y2MsICAgICAgICAgICAgICAvKiBnZXRfYnlfdmNjICAgICAgICovCisJZWdfY2FjaGVfZ2V0X2J5X3NyY19pcCwgICAgICAgICAgIC8qIGdldF9ieV9zcmNfaXAgICAgKi8KKwllZ19jYWNoZV9wdXQsICAgICAgICAgICAgICAgICAgICAgLyogcHV0ICAgICAgICAgICAgICAqLworCWVnX2NhY2hlX3JlbW92ZV9lbnRyeSwgICAgICAgICAgICAvKiByZW1vdmVfZW50cnkgICAgICovCisJdXBkYXRlX2VnX2NhY2hlX2VudHJ5LCAgICAgICAgICAgIC8qIHVwZGF0ZSAgICAgICAgICAgKi8KKwljbGVhcl9leHBpcmVkLCAgICAgICAgICAgICAgICAgICAgLyogY2xlYXJfZXhwaXJlZCAgICAqLworCWVnX2Rlc3Ryb3lfY2FjaGUgICAgICAgICAgICAgICAgICAvKiBkZXN0cm95X2NhY2hlICAgICovCit9OworCisKK3ZvaWQgYXRtX21wb2FfaW5pdF9jYWNoZShzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYykKK3sKKwltcGMtPmluX29wcyA9ICZpbmdyZXNzX29wczsKKwltcGMtPmVnX29wcyA9ICZlZ3Jlc3Nfb3BzOworCisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9tcG9hX2NhY2hlcy5oIGIvbmV0L2F0bS9tcG9hX2NhY2hlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOTg4NmEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYXRtL21wb2FfY2FjaGVzLmgKQEAgLTAsMCArMSw5NiBAQAorI2lmbmRlZiBNUE9BX0NBQ0hFU19ICisjZGVmaW5lIE1QT0FfQ0FDSEVTX0gKKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvYXRtLmg+CisjaW5jbHVkZSA8bGludXgvYXRtZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvYXRtbXBjLmg+CisKK3N0cnVjdCBtcG9hX2NsaWVudDsKKwordm9pZCBhdG1fbXBvYV9pbml0X2NhY2hlKHN0cnVjdCBtcG9hX2NsaWVudCAqbXBjKTsKKwordHlwZWRlZiBzdHJ1Y3QgaW5fY2FjaGVfZW50cnkgeworICAgICAgICBzdHJ1Y3QgaW5fY2FjaGVfZW50cnkgKm5leHQ7CisgICAgICAgIHN0cnVjdCBpbl9jYWNoZV9lbnRyeSAqcHJldjsKKyAgICAgICAgc3RydWN0IHRpbWV2YWwgIHR2OworICAgICAgICBzdHJ1Y3QgdGltZXZhbCAgcmVwbHlfd2FpdDsKKyAgICAgICAgc3RydWN0IHRpbWV2YWwgIGhvbGRfZG93bjsKKyAgICAgICAgdWludDMyX3QgIHBhY2tldHNfZndkZWQ7CisgICAgICAgIHVpbnQxNl90ICBlbnRyeV9zdGF0ZTsgCisgICAgICAgIHVpbnQzMl90IHJldHJ5X3RpbWU7CisgICAgICAgIHVpbnQzMl90IHJlZnJlc2hfdGltZTsKKyAgICAgICAgdWludDMyX3QgY291bnQ7CisgICAgICAgIHN0cnVjdCAgIGF0bV92Y2MgKnNob3J0Y3V0OworICAgICAgICB1aW50OF90ICBNUFNfY3RybF9BVE1fYWRkcltBVE1fRVNBX0xFTl07CisgICAgICAgIHN0cnVjdCAgIGluX2N0cmxfaW5mbyBjdHJsX2luZm87CisgICAgICAgIGF0b21pY190IHVzZTsKK30gaW5fY2FjaGVfZW50cnk7CisKK3N0cnVjdCBpbl9jYWNoZV9vcHN7CisgICAgICAgIGluX2NhY2hlX2VudHJ5ICooKmFkZF9lbnRyeSkodWludDMyX3QgZHN0X2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCk7CisgICAgICAgIGluX2NhY2hlX2VudHJ5ICooKmdldCkodWludDMyX3QgZHN0X2lwLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCk7CisgICAgICAgIGluX2NhY2hlX2VudHJ5ICooKmdldF93aXRoX21hc2spKHVpbnQzMl90IGRzdF9pcCwgCisJCQkJCSBzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCwKKwkJCQkJIHVpbnQzMl90IG1hc2spOworICAgICAgICBpbl9jYWNoZV9lbnRyeSAqKCpnZXRfYnlfdmNjKShzdHJ1Y3QgYXRtX3ZjYyAqdmNjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1wb2FfY2xpZW50ICpjbGllbnQpOworICAgICAgICB2b2lkICAgICAgICAgICAgKCpwdXQpKGluX2NhY2hlX2VudHJ5ICplbnRyeSk7CisgICAgICAgIHZvaWQgICAgICAgICAgICAoKnJlbW92ZV9lbnRyeSkoaW5fY2FjaGVfZW50cnkgKmRlbEVudHJ5LAorCQkJCQlzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCApOworICAgICAgICBpbnQgICAgICAgICAgICAgKCpjYWNoZV9oaXQpKGluX2NhY2hlX2VudHJ5ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCk7CisgICAgICAgIHZvaWQgICAgICAgICAgICAoKmNsZWFyX2NvdW50KShzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCk7CisgICAgICAgIHZvaWQgICAgICAgICAgICAoKmNoZWNrX3Jlc29sdmluZykoc3RydWN0IG1wb2FfY2xpZW50ICpjbGllbnQpOworICAgICAgICB2b2lkICAgICAgICAgICAgKCpyZWZyZXNoKShzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCk7CisgICAgICAgIHZvaWQgICAgICAgICAgICAoKmRlc3Ryb3lfY2FjaGUpKHN0cnVjdCBtcG9hX2NsaWVudCAqbXBjKTsKK307CisKK3R5cGVkZWYgc3RydWN0IGVnX2NhY2hlX2VudHJ5eworICAgICAgICBzdHJ1Y3QgICAgICAgICAgICAgICBlZ19jYWNoZV9lbnRyeSAqbmV4dDsKKyAgICAgICAgc3RydWN0ICAgICAgICAgICAgICAgZWdfY2FjaGVfZW50cnkgKnByZXY7CisgICAgICAgIHN0cnVjdCAgICAgICAgICAgICAgIHRpbWV2YWwgIHR2OworICAgICAgICB1aW50OF90ICAgICAgICAgICAgICBNUFNfY3RybF9BVE1fYWRkcltBVE1fRVNBX0xFTl07CisgICAgICAgIHN0cnVjdCBhdG1fdmNjICAgICAgICpzaG9ydGN1dDsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgcGFja2V0c19yY3ZkOworICAgICAgICB1aW50MTZfdCAgICAgICAgICAgICBlbnRyeV9zdGF0ZTsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbGF0ZXN0X2lwX2FkZHI7ICAgIC8qIFRoZSBzcmMgSVAgYWRkcmVzcyBvZiB0aGUgbGFzdCBwYWNrZXQgKi8KKyAgICAgICAgc3RydWN0IGVnX2N0cmxfaW5mbyAgY3RybF9pbmZvOworICAgICAgICBhdG9taWNfdCAgICAgICAgICAgICB1c2U7Cit9IGVnX2NhY2hlX2VudHJ5OworCitzdHJ1Y3QgZWdfY2FjaGVfb3BzeworICAgICAgICBlZ19jYWNoZV9lbnRyeSAqKCphZGRfZW50cnkpKHN0cnVjdCBrX21lc3NhZ2UgKm1zZywgc3RydWN0IG1wb2FfY2xpZW50ICpjbGllbnQpOworICAgICAgICBlZ19jYWNoZV9lbnRyeSAqKCpnZXRfYnlfY2FjaGVfaWQpKHVpbnQzMl90IGNhY2hlX2lkLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCk7CisgICAgICAgIGVnX2NhY2hlX2VudHJ5ICooKmdldF9ieV90YWcpKHVpbnQzMl90IGNhY2hlX2lkLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCk7CisgICAgICAgIGVnX2NhY2hlX2VudHJ5ICooKmdldF9ieV92Y2MpKHN0cnVjdCBhdG1fdmNjICp2Y2MsIHN0cnVjdCBtcG9hX2NsaWVudCAqY2xpZW50KTsKKyAgICAgICAgZWdfY2FjaGVfZW50cnkgKigqZ2V0X2J5X3NyY19pcCkodWludDMyX3QgaXBhZGRyLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCk7CisgICAgICAgIHZvaWQgICAgICAgICAgICAoKnB1dCkoZWdfY2FjaGVfZW50cnkgKmVudHJ5KTsKKyAgICAgICAgdm9pZCAgICAgICAgICAgICgqcmVtb3ZlX2VudHJ5KShlZ19jYWNoZV9lbnRyeSAqZW50cnksIHN0cnVjdCBtcG9hX2NsaWVudCAqY2xpZW50KTsKKyAgICAgICAgdm9pZCAgICAgICAgICAgICgqdXBkYXRlKShlZ19jYWNoZV9lbnRyeSAqZW50cnksIHVpbnQxNl90IGhvbGRpbmdfdGltZSk7CisgICAgICAgIHZvaWQgICAgICAgICAgICAoKmNsZWFyX2V4cGlyZWQpKHN0cnVjdCBtcG9hX2NsaWVudCAqY2xpZW50KTsKKyAgICAgICAgdm9pZCAgICAgICAgICAgICgqZGVzdHJveV9jYWNoZSkoc3RydWN0IG1wb2FfY2xpZW50ICptcGMpOworfTsKKworCisvKiBJbmdyZXNzIGNhY2hlIGVudHJ5IHN0YXRlcyAqLworCisjZGVmaW5lIElOR1JFU1NfUkVGUkVTSElORyAzCisjZGVmaW5lIElOR1JFU1NfUkVTT0xWRUQgICAyCisjZGVmaW5lIElOR1JFU1NfUkVTT0xWSU5HICAxCisjZGVmaW5lIElOR1JFU1NfSU5WQUxJRCAgICAwCisKKy8qIFZDQyBzdGF0ZXMgKi8KKworI2RlZmluZSBPUEVOICAgMQorI2RlZmluZSBDTE9TRUQgMCAKKworLyogRWdyZXNzIGNhY2hlIGVudHJ5IHN0YXRlcyAqLworCisjZGVmaW5lIEVHUkVTU19SRVNPTFZFRCAyCisjZGVmaW5lIEVHUkVTU19QVVJHRSAgICAxCisjZGVmaW5lIEVHUkVTU19JTlZBTElEICAwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9tcG9hX3Byb2MuYyBiL25ldC9hdG0vbXBvYV9wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA4MzRiNQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9hdG0vbXBvYV9wcm9jLmMKQEAgLTAsMCArMSwzMDUgQEAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4gCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1tcGMuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG0uaD4KKyNpbmNsdWRlICJtcGMuaCIKKyNpbmNsdWRlICJtcG9hX2NhY2hlcy5oIgorCisvKgorICogbXBvYV9wcm9jLmM6IEltcGxlbWVudGF0aW9uIE1QT0EgY2xpZW50J3MgcHJvYworICogZmlsZSBzeXN0ZW0gc3RhdGlzdGljcyAKKyAqLworCisjaWYgMQorI2RlZmluZSBkcHJpbnRrIHByaW50ayAgIC8qIGRlYnVnICovCisjZWxzZQorI2RlZmluZSBkcHJpbnRrKGZvcm1hdCxhcmdzLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgU1RBVF9GSUxFX05BTUUgIm1wYyIgICAgIC8qIE91ciBzdGF0aXN0aWMgZmlsZSdzIG5hbWUgKi8KKworZXh0ZXJuIHN0cnVjdCBtcG9hX2NsaWVudCAqbXBjczsKK2V4dGVybiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmF0bV9wcm9jX3Jvb3Q7ICAvKiBmcm9tIHByb2MuYy4gKi8KKworc3RhdGljIGludCBwcm9jX21wY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBzc2l6ZV90IHByb2NfbXBjX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcyk7CisKK3N0YXRpYyBpbnQgcGFyc2VfcW9zKGNvbnN0IGNoYXIgKmJ1ZmYpOworCisvKgorICogICBEZWZpbmUgYWxsb3dlZCBGSUxFIE9QRVJBVElPTlMKKyAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbXBjX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkub3BlbiA9CQlwcm9jX21wY19vcGVuLAorCS5yZWFkID0JCXNlcV9yZWFkLAorCS5sbHNlZWsgPQlzZXFfbHNlZWssCisJLndyaXRlID0JcHJvY19tcGNfd3JpdGUsCisJLnJlbGVhc2UgPQlzZXFfcmVsZWFzZSwKK307CisKKy8qCisgKiBSZXR1cm5zIHRoZSBzdGF0ZSBvZiBhbiBpbmdyZXNzIGNhY2hlIGVudHJ5IGFzIGEgc3RyaW5nCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICppbmdyZXNzX3N0YXRlX3N0cmluZyhpbnQgc3RhdGUpeworICAgICAgICBzd2l0Y2goc3RhdGUpIHsKKwljYXNlIElOR1JFU1NfUkVTT0xWSU5HOgorCSAgICAgICAgcmV0dXJuICJyZXNvbHZpbmcgICI7CisJCWJyZWFrOworCWNhc2UgSU5HUkVTU19SRVNPTFZFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gInJlc29sdmVkICAgIjsKKwkJYnJlYWs7CisJY2FzZSBJTkdSRVNTX0lOVkFMSUQ6CisJICAgICAgICByZXR1cm4gImludmFsaWQgICAgIjsKKwkJYnJlYWs7CisJY2FzZSBJTkdSRVNTX1JFRlJFU0hJTkc6CisJICAgICAgICByZXR1cm4gInJlZnJlc2hpbmcgIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgICAgcmV0dXJuICIiOworCX0KK30KKworLyoKKyAqIFJldHVybnMgdGhlIHN0YXRlIG9mIGFuIGVncmVzcyBjYWNoZSBlbnRyeSBhcyBhIHN0cmluZworICovCitzdGF0aWMgY29uc3QgY2hhciAqZWdyZXNzX3N0YXRlX3N0cmluZyhpbnQgc3RhdGUpeworICAgICAgICBzd2l0Y2goc3RhdGUpIHsKKwljYXNlIEVHUkVTU19SRVNPTFZFRDoKKwkgICAgICAgIHJldHVybiAicmVzb2x2ZWQgICAiOworCQlicmVhazsKKwljYXNlIEVHUkVTU19QVVJHRToKKyAgICAgICAgICAgICAgICByZXR1cm4gInB1cmdlICAgICAgIjsKKwkJYnJlYWs7CisJY2FzZSBFR1JFU1NfSU5WQUxJRDoKKwkgICAgICAgIHJldHVybiAiaW52YWxpZCAgICAiOworCQlicmVhazsKKwlkZWZhdWx0OgorCSAgICAgICByZXR1cm4gIiI7CisJfQorfQorCisvKgorICogRklYTUU6IG1wY3MgKGFuZCBwZXItbXBjIGxpc3RzKSBoYXZlIG5vIGxvY2tpbmcgd2hhdHNvZXZlci4KKyAqLworCitzdGF0aWMgdm9pZCAqbXBjX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCit7CisJbG9mZl90IGwgPSAqcG9zOworCXN0cnVjdCBtcG9hX2NsaWVudCAqbXBjOworCisJaWYgKCFsLS0pCisJCXJldHVybiBTRVFfU1RBUlRfVE9LRU47CisJZm9yIChtcGMgPSBtcGNzOyBtcGM7IG1wYyA9IG1wYy0+bmV4dCkKKwkJaWYgKCFsLS0pCisJCQlyZXR1cm4gbXBjOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCAqbXBjX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgbXBvYV9jbGllbnQgKnAgPSB2OworCSgqcG9zKSsrOworCXJldHVybiB2ID09IFNFUV9TVEFSVF9UT0tFTiA/IG1wY3MgOiBwLT5uZXh0OworfQorCitzdGF0aWMgdm9pZCBtcGNfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7Cit9CisKKy8qCisgKiBSRUFESU5HIGZ1bmN0aW9uIC0gY2FsbGVkIHdoZW4gdGhlIC9wcm9jL2F0bS9tcG9hIGZpbGUgaXMgcmVhZCBmcm9tLgorICovCitzdGF0aWMgaW50IG1wY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYyA9IHY7CisJdW5zaWduZWQgY2hhciAqdGVtcDsKKwlpbnQgaTsKKwlpbl9jYWNoZV9lbnRyeSAqaW5fZW50cnk7CisJZWdfY2FjaGVfZW50cnkgKmVnX2VudHJ5OworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwl1bnNpZ25lZCBjaGFyIGlwX3N0cmluZ1sxNl07CisKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJYXRtX21wb2FfZGlzcF9xb3MobSk7CisJCXJldHVybiAwOworCX0KKworCXNlcV9wcmludGYobSwgIlxuSW50ZXJmYWNlICVkOlxuXG4iLCBtcGMtPmRldl9udW0pOyAgCisJc2VxX3ByaW50ZihtLCAiSW5ncmVzcyBFbnRyaWVzOlxuSVAgYWRkcmVzcyAgICAgIFN0YXRlICAgICAgSG9sZGluZyB0aW1lICBQYWNrZXRzIGZ3ZGVkICBWUEkgIFZDSVxuIik7CisJZG9fZ2V0dGltZW9mZGF5KCZub3cpOworCisJZm9yIChpbl9lbnRyeSA9IG1wYy0+aW5fY2FjaGU7IGluX2VudHJ5OyBpbl9lbnRyeSA9IGluX2VudHJ5LT5uZXh0KSB7CisJCXRlbXAgPSAodW5zaWduZWQgY2hhciAqKSZpbl9lbnRyeS0+Y3RybF9pbmZvLmluX2RzdF9pcDsKKwkJc3ByaW50ZihpcF9zdHJpbmcsIiVkLiVkLiVkLiVkIiwgdGVtcFswXSwgdGVtcFsxXSwgdGVtcFsyXSwgdGVtcFszXSk7CisJCXNlcV9wcmludGYobSwgIiUtMTZzJXMlLTE0bHUlLTEydSIsCisJCQkgICAgICBpcF9zdHJpbmcsCisJCQkgICAgICBpbmdyZXNzX3N0YXRlX3N0cmluZyhpbl9lbnRyeS0+ZW50cnlfc3RhdGUpLAorCQkJICAgICAgaW5fZW50cnktPmN0cmxfaW5mby5ob2xkaW5nX3RpbWUtKG5vdy50dl9zZWMtaW5fZW50cnktPnR2LnR2X3NlYyksCisJCQkgICAgICBpbl9lbnRyeS0+cGFja2V0c19md2RlZCk7CisJCWlmIChpbl9lbnRyeS0+c2hvcnRjdXQpCisJCQlzZXFfcHJpbnRmKG0sICIgICAlLTNkICAlLTNkIixpbl9lbnRyeS0+c2hvcnRjdXQtPnZwaSxpbl9lbnRyeS0+c2hvcnRjdXQtPnZjaSk7CisJCXNlcV9wcmludGYobSwgIlxuIik7CisJfQorCisJc2VxX3ByaW50ZihtLCAiXG4iKTsKKwlzZXFfcHJpbnRmKG0sICJFZ3Jlc3MgRW50cmllczpcbkluZ3Jlc3MgTVBDIEFUTSBhZGRyXG5DYWNoZS1pZCAgICAgICAgU3RhdGUgICAgICBIb2xkaW5nIHRpbWUgIFBhY2tldHMgcmVjdmQgIExhdGVzdCBJUCBhZGRyICAgVlBJIFZDSVxuIik7CisJZm9yIChlZ19lbnRyeSA9IG1wYy0+ZWdfY2FjaGU7IGVnX2VudHJ5OyBlZ19lbnRyeSA9IGVnX2VudHJ5LT5uZXh0KSB7CisJCXVuc2lnbmVkIGNoYXIgKnAgPSBlZ19lbnRyeS0+Y3RybF9pbmZvLmluX01QQ19kYXRhX0FUTV9hZGRyOworCQlmb3IoaSA9IDA7IGkgPCBBVE1fRVNBX0xFTjsgaSsrKQorCQkJc2VxX3ByaW50ZihtLCAiJTAyeCIsIHBbaV0pOworCQlzZXFfcHJpbnRmKG0sICJcbiUtMTZsdSVzJS0xNGx1JS0xNXUiLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpbnRvaGwoZWdfZW50cnktPmN0cmxfaW5mby5jYWNoZV9pZCksCisJCQkgICBlZ3Jlc3Nfc3RhdGVfc3RyaW5nKGVnX2VudHJ5LT5lbnRyeV9zdGF0ZSksCisJCQkgICAoZWdfZW50cnktPmN0cmxfaW5mby5ob2xkaW5nX3RpbWUtKG5vdy50dl9zZWMtZWdfZW50cnktPnR2LnR2X3NlYykpLAorCQkJICAgZWdfZW50cnktPnBhY2tldHNfcmN2ZCk7CisJCQorCQkvKiBsYXRlc3QgSVAgYWRkcmVzcyAqLworCQl0ZW1wID0gKHVuc2lnbmVkIGNoYXIgKikmZWdfZW50cnktPmxhdGVzdF9pcF9hZGRyOworCQlzcHJpbnRmKGlwX3N0cmluZywgIiVkLiVkLiVkLiVkIiwgdGVtcFswXSwgdGVtcFsxXSwgdGVtcFsyXSwgdGVtcFszXSk7CisJCXNlcV9wcmludGYobSwgIiUtMTZzIiwgaXBfc3RyaW5nKTsKKworCQlpZiAoZWdfZW50cnktPnNob3J0Y3V0KQorCQkJc2VxX3ByaW50ZihtLCAiICUtM2QgJS0zZCIsZWdfZW50cnktPnNob3J0Y3V0LT52cGksZWdfZW50cnktPnNob3J0Y3V0LT52Y2kpOworCQlzZXFfcHJpbnRmKG0sICJcbiIpOworCX0KKwlzZXFfcHJpbnRmKG0sICJcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIG1wY19vcCA9IHsKKwkuc3RhcnQgPQltcGNfc3RhcnQsCisJLm5leHQgPQkJbXBjX25leHQsCisJLnN0b3AgPQkJbXBjX3N0b3AsCisJLnNob3cgPQkJbXBjX3Nob3cKK307CisKK3N0YXRpYyBpbnQgcHJvY19tcGNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJm1wY19vcCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHByb2NfbXBjX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKK3sKKyAgICAgICAgY2hhciAqcGFnZSwgKnA7CisJdW5zaWduZWQgbGVuOworCisgICAgICAgIGlmIChuYnl0ZXMgPT0gMCkKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgaWYgKG5ieXRlcyA+PSBQQUdFX1NJWkUpCisJCW5ieXRlcyA9IFBBR0VfU0laRS0xOworCisgICAgICAgIHBhZ2UgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKyAgICAgICAgaWYgKCFwYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKworICAgICAgICBmb3IgKHAgPSBwYWdlLCBsZW4gPSAwOyBsZW4gPCBuYnl0ZXM7IHArKywgbGVuKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIoKnAsIGJ1ZmYrKykpIHsKKwkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisgICAgICAgICAgICAgICAgaWYgKCpwID09ICdcMCcgfHwgKnAgPT0gJ1xuJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgKnAgPSAnXDAnOworCisJaWYgKCFwYXJzZV9xb3MocGFnZSkpCisgICAgICAgICAgICAgICAgcHJpbnRrKCJtcG9hOiBwcm9jX21wY193cml0ZTogY291bGQgbm90IHBhcnNlICclcydcbiIsIHBhZ2UpOworCisgICAgICAgIGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfcW9zKGNvbnN0IGNoYXIgKmJ1ZmYpCit7CisgICAgICAgIC8qIHBvc3NpYmxlIGxpbmVzIGxvb2sgbGlrZSB0aGlzCisgICAgICAgICAqIGFkZCAxMzAuMjMwLjU0LjE0MiB0eD1tYXhfcGNyLG1heF9zZHUgcng9bWF4X3BjcixtYXhfc2R1CisgICAgICAgICAqLworICAgICAgICB1bnNpZ25lZCBjaGFyIGlwWzRdOyAKKwlpbnQgdHhfcGNyLCB0eF9zZHUsIHJ4X3Bjciwgcnhfc2R1OworICAgICAgICB1aW50MzJfdCBpcGFkZHI7CisJc3RydWN0IGF0bV9xb3MgcW9zOyAKKyAgICAgICAgCisgICAgICAgIG1lbXNldCgmcW9zLCAwLCBzaXplb2Yoc3RydWN0IGF0bV9xb3MpKTsKKworCWlmIChzc2NhbmYoYnVmZiwgImRlbCAlaGh1LiVoaHUuJWhodS4laGh1IiwKKwkJCWlwLCBpcCsxLCBpcCsyLCBpcCszKSA9PSA0KSB7CisJCWlwYWRkciA9ICoodWludDMyX3QgKilpcDsKKwkJcmV0dXJuIGF0bV9tcG9hX2RlbGV0ZV9xb3MoYXRtX21wb2Ffc2VhcmNoX3FvcyhpcGFkZHIpKTsKKwl9CisKKwlpZiAoc3NjYW5mKGJ1ZmYsICJhZGQgJWhodS4laGh1LiVoaHUuJWhodSB0eD0lZCwlZCByeD10eCIsCisJCQlpcCwgaXArMSwgaXArMiwgaXArMywgJnR4X3BjciwgJnR4X3NkdSkgPT0gNikgeworCQlyeF9wY3IgPSB0eF9wY3I7CisJCXJ4X3NkdSA9IHR4X3NkdTsKKwl9IGVsc2UgaWYgKHNzY2FuZihidWZmLCAiYWRkICVoaHUuJWhodS4laGh1LiVoaHUgdHg9JWQsJWQgcng9JWQsJWQiLAorCQlpcCwgaXArMSwgaXArMiwgaXArMywgJnR4X3BjciwgJnR4X3NkdSwgJnJ4X3BjciwgJnJ4X3NkdSkgIT0gOCkKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgaXBhZGRyID0gKih1aW50MzJfdCAqKWlwOworCXFvcy50eHRwLnRyYWZmaWNfY2xhc3MgPSBBVE1fQ0JSOworCXFvcy50eHRwLm1heF9wY3IgPSB0eF9wY3I7CisJcW9zLnR4dHAubWF4X3NkdSA9IHR4X3NkdTsKKwlxb3Mucnh0cC50cmFmZmljX2NsYXNzID0gQVRNX0NCUjsKKwlxb3Mucnh0cC5tYXhfcGNyID0gcnhfcGNyOworCXFvcy5yeHRwLm1heF9zZHUgPSByeF9zZHU7CisgICAgICAgIHFvcy5hYWwgPSBBVE1fQUFMNTsKKwlkcHJpbnRrKCJtcG9hOiBtcG9hX3Byb2MuYzogcGFyc2VfcW9zKCk6IHNldHRpbmcgcW9zIHBhcmFtYW1ldGVycyB0byB0eD0lZCwlZCByeD0lZCwlZFxuIiwKKwkJcW9zLnR4dHAubWF4X3BjciwKKwkJcW9zLnR4dHAubWF4X3NkdSwKKwkJcW9zLnJ4dHAubWF4X3BjciwKKwkJcW9zLnJ4dHAubWF4X3NkdQorCQkpOworCisJYXRtX21wb2FfYWRkX3FvcyhpcGFkZHIsICZxb3MpOworCXJldHVybiAxOworfQorCisvKgorICogSU5JVElBTElaQVRJT04gZnVuY3Rpb24gLSBjYWxsZWQgd2hlbiBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQvbG9hZGVkLgorICovCitpbnQgbXBjX3Byb2NfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcDsKKworICAgICAgICBwID0gY3JlYXRlX3Byb2NfZW50cnkoU1RBVF9GSUxFX05BTUUsIDAsIGF0bV9wcm9jX3Jvb3QpOworCWlmICghcCkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGluaXRpYWxpemUgL3Byb2MvYXRtLyVzXG4iLCBTVEFUX0ZJTEVfTkFNRSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgIH0KKwlwLT5wcm9jX2ZvcHMgPSAmbXBjX2ZpbGVfb3BlcmF0aW9uczsKKwlwLT5vd25lciA9IFRISVNfTU9EVUxFOworCXJldHVybiAwOworfQorCisvKgorICogREVMRVRJTkcgZnVuY3Rpb24gLSBjYWxsZWQgd2hlbiBtb2R1bGUgaXMgcmVtb3ZlZC4KKyAqLwordm9pZCBtcGNfcHJvY19jbGVhbih2b2lkKQoreworCXJlbW92ZV9wcm9jX2VudHJ5KFNUQVRfRklMRV9OQU1FLGF0bV9wcm9jX3Jvb3QpOworfQorCisKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9wcHBvYXRtLmMgYi9uZXQvYXRtL3BwcG9hdG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGY0YTJiCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2F0bS9wcHBvYXRtLmMKQEAgLTAsMCArMSwzNjkgQEAKKy8qIG5ldC9hdG0vcHBwb2F0bS5jIC0gUkZDMjM2NCBQUFAgb3ZlciBBVE0vQUFMNSAqLworCisvKiBDb3B5cmlnaHQgMTk5OS0yMDAwIGJ5IE1pdGNoZWxsIEJsYW5rIEpyICovCisvKiBCYXNlZCBvbiBjbGlwLmM7IDE5OTUtMTk5OSBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIEVQRkwgTFJDL0lDQSAqLworLyogQW5kIG9uIHBwcF9hc3luYy5jOyBDb3B5cmlnaHQgMTk5OSBQYXVsIE1hY2tlcnJhcyAqLworLyogQW5kIGhlbHAgZnJvbSBKZW5zIEF4Ym9lICovCisKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGRyaXZlciBwcm92aWRlcyB0aGUgZW5jYXBzdWxhdGlvbiBhbmQgZnJhbWluZyBmb3Igc2VuZGluZworICogYW5kIHJlY2VpdmluZyBQUFAgZnJhbWVzIGluIEFUTSBBQUw1IFBEVXMuCisgKi8KKworLyoKKyAqIE9uZSBzaG9ydGNvbWluZyBvZiB0aGlzIGRyaXZlciBpcyB0aGF0IGl0IGRvZXMgbm90IGNvbXBseSB3aXRoCisgKiBzZWN0aW9uIDggb2YgUkZDMjM2NCAtIHdlIGFyZSBzdXBwb3NlZCB0byBkZXRlY3QgYSBjaGFuZ2UKKyAqIGluIGVuY2Fwc3VsYXRpb24gYW5kIGltbWVkaWF0ZWx5IGFib3J0IHRoZSBjb25uZWN0aW9uIChpbiBvcmRlcgorICogdG8gYXZvaWQgYSBibGFjay1ob2xlIGJlaW5nIGNyZWF0ZWQgaWYgb3VyIHBlZXIgbG9zZXMgc3RhdGUKKyAqIGFuZCBjaGFuZ2VzIGVuY2Fwc3VsYXRpb24gdW5pbGF0ZXJhbGx5LiAgSG93ZXZlciwgc2luY2UgdGhlCisgKiBwcHBfZ2VuZXJpYyBsYXllciBhY3R1YWxseSBkb2VzIHRoZSBkZWNhcHN1bGF0aW9uLCB3ZSBuZWVkCisgKiBhIHdheSBvZiBub3RpZnlpbmcgaXQgd2hlbiB3ZSBfdGhpbmtfIHRoZXJlIG1pZ2h0IGJlIGEgcHJvYmxlbSkKKyAqIFRoZXJlJ3MgdHdvIGNhc2VzOgorICogICAxLglMTEMtZW5jYXBzdWxhdGlvbiB3YXMgbWlzc2luZyB3aGVuIGl0IHdhcyBlbmFibGVkLiAgSW4KKyAqCXRoaXMgY2FzZSwgd2Ugc2hvdWxkIHRlbGwgdGhlIHVwcGVyIGxheWVyICJ0ZWFyIGRvd24KKyAqCXRoaXMgc2Vzc2lvbiBpZiB0aGlzIHNrYiBsb29rcyBvayB0byB5b3UiCisgKiAgIDIuCUxMQy1lbmNhcHN1bGF0aW9uIHdhcyBwcmVzZW50IHdoZW4gaXQgd2FzIGRpc2FibGVkLiAgVGhlbgorICoJd2UgbmVlZCB0byB0ZWxsIHRoZSB1cHBlciBsYXllciAidGhpcyBwYWNrZXQgbWF5IGJlCisgKglvaywgYnV0IGlmIGl0cyBpbiBlcnJvciB0ZWFyIGRvd24gdGhlIHNlc3Npb24iCisgKiBUaGVzZSBob29rcyBhcmUgbm90IHlldCBhdmFpbGFibGUgaW4gcHBwX2dlbmVyaWMKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L3BwcF9kZWZzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcHBwLmg+CisjaW5jbHVkZSA8bGludXgvcHBwX2NoYW5uZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1wcHAuaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorCisjaWYgMAorI2RlZmluZSBEUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHICJwcHBvYXRtOiAiIGZvcm1hdCwgIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgRFBSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworZW51bSBwcHBvYXRtX2VuY2FwcyB7CisJZV9hdXRvZGV0ZWN0ID0gUFBQT0FUTV9FTkNBUFNfQVVUT0RFVEVDVCwKKwllX3ZjID0gUFBQT0FUTV9FTkNBUFNfVkMsCisJZV9sbGMgPSBQUFBPQVRNX0VOQ0FQU19MTEMsCit9OworCitzdHJ1Y3QgcHBwb2F0bV92Y2MgeworCXN0cnVjdCBhdG1fdmNjCSphdG12Y2M7CS8qIFZDQyBkZXNjcmlwdG9yICovCisJdm9pZCAoKm9sZF9wdXNoKShzdHJ1Y3QgYXRtX3ZjYyAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKKwl2b2lkICgqb2xkX3BvcCkoc3RydWN0IGF0bV92Y2MgKiwgc3RydWN0IHNrX2J1ZmYgKik7CisJCQkJCS8qIGtlZXAgb2xkIHB1c2gvcG9wIGZvciBkZXRhY2hpbmcgKi8KKwllbnVtIHBwcG9hdG1fZW5jYXBzIGVuY2FwczsKKwlpbnQgZmxhZ3M7CQkJLyogU0NfQ09NUF9QUk9UIC0gY29tcHJlc3MgcHJvdG9jb2wgKi8KKwlzdHJ1Y3QgcHBwX2NoYW5uZWwgY2hhbjsJLyogaW50ZXJmYWNlIHRvIGdlbmVyaWMgcHBwIGxheWVyICovCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHdha2V1cF90YXNrbGV0OworfTsKKworLyoKKyAqIEhlYWRlciB1c2VkIGZvciBMTEMgRW5jYXBzdWxhdGVkIFBQUCAoNCBieXRlcykgZm9sbG93ZWQgYnkgdGhlIExDUCBwcm90b2NvbAorICogSUQgKDB4QzAyMSkgdXNlZCBpbiBhdXRvZGV0ZWN0aW9uCisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBwcGxsY1s2XSA9IHsgMHhGRSwgMHhGRSwgMHgwMywgMHhDRiwgMHhDMCwgMHgyMSB9OworI2RlZmluZSBMTENfTEVOCQkoNCkKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcHBwb2F0bV92Y2MgKmF0bXZjY190b19wdmNjKGNvbnN0IHN0cnVjdCBhdG1fdmNjICphdG12Y2MpCit7CisJcmV0dXJuIChzdHJ1Y3QgcHBwb2F0bV92Y2MgKikgKGF0bXZjYy0+dXNlcl9iYWNrKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcHBwb2F0bV92Y2MgKmNoYW5fdG9fcHZjYyhjb25zdCBzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW4pCit7CisJcmV0dXJuIChzdHJ1Y3QgcHBwb2F0bV92Y2MgKikgKGNoYW4tPnByaXZhdGUpOworfQorCisvKgorICogV2UgY2FuJ3QgZG8gdGhpcyBkaXJlY3RseSBmcm9tIG91ciBfcG9wIGhhbmRsZXIsIHNpbmNlIHRoZSBwcHAgY29kZQorICogZG9lc24ndCB3YW50IHRvIGJlIGNhbGxlZCBpbiBpbnRlcnJ1cHQgY29udGV4dCwgc28gd2UgZG8gaXQgZnJvbQorICogYSB0YXNrbGV0CisgKi8KK3N0YXRpYyB2b2lkIHBwcG9hdG1fd2FrZXVwX3NlbmRlcih1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlwcHBfb3V0cHV0X3dha2V1cCgoc3RydWN0IHBwcF9jaGFubmVsICopIGFyZyk7Cit9CisKKy8qCisgKiBUaGlzIGdldHMgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIEFUTSBjYXJkIGhhcyBmaW5pc2hlZCBzZW5kaW5nIG91cgorICogc2tiLiAgVGhlIC0+b2xkX3BvcCB3aWxsIHRha2UgY2FyZSB1cCBub3JtYWwgYXRtIGZsb3cgY29udHJvbCwKKyAqIGJ1dCB3ZSBhbHNvIG5lZWQgdG8gd2FrZSB1cCB0aGUgZGV2aWNlIGlmIHdlIGJsb2NrZWQgaXQKKyAqLworc3RhdGljIHZvaWQgcHBwb2F0bV9wb3Aoc3RydWN0IGF0bV92Y2MgKmF0bXZjYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcHBwb2F0bV92Y2MgKnB2Y2MgPSBhdG12Y2NfdG9fcHZjYyhhdG12Y2MpOworCXB2Y2MtPm9sZF9wb3AoYXRtdmNjLCBza2IpOworCS8qCisJICogV2UgZG9uJ3QgcmVhbGx5IGFsd2F5cyB3YW50IHRvIGRvIHRoaXMgc2luY2UgaXQncworCSAqIHJlYWxseSBpbmVmZmljaWVudCAtIGl0IHdvdWxkIGJlIG11Y2ggYmV0dGVyIGlmIHdlIGNvdWxkCisJICogdGVzdCBpZiB3ZSBoYWQgYWN0dWFsbHkgdGhyb3R0bGVkIHRoZSBnZW5lcmljIGxheWVyLgorCSAqIFVuZm9ydHVuYXRlbHkgdGhlbiB0aGVyZSB3b3VsZCBiZSBhIG5hc3R5IFNNUCByYWNlIHdoZXJlCisJICogd2UgY291bGQgY2xlYXIgdGhhdCBmbGFnIGp1c3QgYXMgd2UgcmVmdXNlIGFub3RoZXIgcGFja2V0LgorCSAqIEZvciBub3cgd2UgZG8gdGhlIHNhZmUgdGhpbmcuCisJICovCisJdGFza2xldF9zY2hlZHVsZSgmcHZjYy0+d2FrZXVwX3Rhc2tsZXQpOworfQorCisvKgorICogVW5iaW5kIGZyb20gUFBQIC0gY3VycmVudGx5IHdlIG9ubHkgZG8gdGhpcyB3aGVuIGNsb3NpbmcgdGhlIHNvY2tldCwKKyAqIGJ1dCB3ZSBjb3VsZCBwdXQgdGhpcyBpbnRvIGFuIGlvY3RsIGlmIG5lZWQgYmUKKyAqLworc3RhdGljIHZvaWQgcHBwb2F0bV91bmFzc2lnbl92Y2Moc3RydWN0IGF0bV92Y2MgKmF0bXZjYykKK3sKKwlzdHJ1Y3QgcHBwb2F0bV92Y2MgKnB2Y2M7CisJcHZjYyA9IGF0bXZjY190b19wdmNjKGF0bXZjYyk7CisJYXRtdmNjLT5wdXNoID0gcHZjYy0+b2xkX3B1c2g7CisJYXRtdmNjLT5wb3AgPSBwdmNjLT5vbGRfcG9wOworCXRhc2tsZXRfa2lsbCgmcHZjYy0+d2FrZXVwX3Rhc2tsZXQpOworCXBwcF91bnJlZ2lzdGVyX2NoYW5uZWwoJnB2Y2MtPmNoYW4pOworCWF0bXZjYy0+dXNlcl9iYWNrID0gTlVMTDsKKwlrZnJlZShwdmNjKTsKKwkvKiBHZWUsIEkgaG9wZSB3ZSBoYXZlIHRoZSBiaWcga2VybmVsIGxvY2sgaGVyZS4uLiAqLworCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworfQorCisvKiBDYWxsZWQgd2hlbiBhbiBBQUw1IFBEVSBjb21lcyBpbiAqLworc3RhdGljIHZvaWQgcHBwb2F0bV9wdXNoKHN0cnVjdCBhdG1fdmNjICphdG12Y2MsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHBwcG9hdG1fdmNjICpwdmNjID0gYXRtdmNjX3RvX3B2Y2MoYXRtdmNjKTsKKwlEUFJJTlRLKCJwcHBvYXRtIHB1c2hcbiIpOworCWlmIChza2IgPT0gTlVMTCkgewkJCS8qIFZDQyB3YXMgY2xvc2VkICovCisJCURQUklOVEsoInJlbW92aW5nIEFUTVBQUCBWQ0MgJXBcbiIsIHB2Y2MpOworCQlwcHBvYXRtX3VuYXNzaWduX3ZjYyhhdG12Y2MpOworCQlhdG12Y2MtPnB1c2goYXRtdmNjLCBOVUxMKTsJLyogUGFzcyBhbG9uZyBiYWQgbmV3cyAqLworCQlyZXR1cm47CisJfQorCWF0bV9yZXR1cm4oYXRtdmNjLCBza2ItPnRydWVzaXplKTsKKwlzd2l0Y2ggKHB2Y2MtPmVuY2FwcykgeworCWNhc2UgZV9sbGM6CisJCWlmIChza2ItPmxlbiA8IExMQ19MRU4gfHwKKwkJICAgIG1lbWNtcChza2ItPmRhdGEsIHBwcGxsYywgTExDX0xFTikpCisJCQlnb3RvIGVycm9yOworCQlza2JfcHVsbChza2IsIExMQ19MRU4pOworCQlicmVhazsKKwljYXNlIGVfYXV0b2RldGVjdDoKKwkJaWYgKHB2Y2MtPmNoYW4ucHBwID09IE5VTEwpIHsJLyogTm90IGJvdW5kIHlldCEgKi8KKwkJCWtmcmVlX3NrYihza2IpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChza2ItPmxlbiA+PSBzaXplb2YocHBwbGxjKSAmJgorCQkgICAgIW1lbWNtcChza2ItPmRhdGEsIHBwcGxsYywgc2l6ZW9mKHBwcGxsYykpKSB7CisJCQlwdmNjLT5lbmNhcHMgPSBlX2xsYzsKKwkJCXNrYl9wdWxsKHNrYiwgTExDX0xFTik7CisJCQlicmVhazsKKwkJfQorCQlpZiAoc2tiLT5sZW4gPj0gKHNpemVvZihwcHBsbGMpIC0gTExDX0xFTikgJiYKKwkJICAgICFtZW1jbXAoc2tiLT5kYXRhLCAmcHBwbGxjW0xMQ19MRU5dLAorCQkgICAgc2l6ZW9mKHBwcGxsYykgLSBMTENfTEVOKSkgeworCQkJcHZjYy0+ZW5jYXBzID0gZV92YzsKKwkJCXB2Y2MtPmNoYW4ubXR1ICs9IExMQ19MRU47CisJCQlicmVhazsKKwkJfQorCQlEUFJJTlRLKCIodW5pdCAlZCk6IENvdWxkbid0IGF1dG9kZXRlY3QgeWV0ICIKKwkJICAgICIoc2tiOiAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWClcbiIsCisJCSAgICBwdmNjLT5jaGFuLnVuaXQsCisJCSAgICBza2ItPmRhdGFbMF0sIHNrYi0+ZGF0YVsxXSwgc2tiLT5kYXRhWzJdLAorCQkgICAgc2tiLT5kYXRhWzNdLCBza2ItPmRhdGFbNF0sIHNrYi0+ZGF0YVs1XSk7CisJCWdvdG8gZXJyb3I7CisJY2FzZSBlX3ZjOgorCQlicmVhazsKKwl9CisJcHBwX2lucHV0KCZwdmNjLT5jaGFuLCBza2IpOworCXJldHVybjsKKyAgICBlcnJvcjoKKwlrZnJlZV9za2Ioc2tiKTsKKwlwcHBfaW5wdXRfZXJyb3IoJnB2Y2MtPmNoYW4sIDApOworfQorCisvKgorICogQ2FsbGVkIGJ5IHRoZSBwcHBfZ2VuZXJpYy5jIHRvIHNlbmQgYSBwYWNrZXQgLSByZXR1cm5zIHRydWUgaWYgcGFja2V0CisgKiB3YXMgYWNjZXB0ZWQuICBJZiB3ZSByZXR1cm4gZmFsc2UsIHRoZW4gaXQncyBvdXIgam9iIHRvIGNhbGwKKyAqIHBwcF9vdXRwdXRfd2FrZXVwKGNoYW4pIHdoZW4gd2UncmUgZmVlbGluZyBtb3JlIHVwIHRvIGl0LgorICogTm90ZSB0aGF0IGluIHRoZSBFTk9NRU0gY2FzZSAoYXMgb3Bwb3NlZCB0byB0aGUgIWF0bV9tYXlfc2VuZCBjYXNlKQorICogd2Ugc2hvdWxkIHJlYWxseSBkcm9wIHRoZSBwYWNrZXQsIGJ1dCB0aGUgZ2VuZXJpYyBsYXllciBkb2Vzbid0CisgKiBzdXBwb3J0IHRoaXMgeWV0LiAgV2UganVzdCByZXR1cm4gJ0RST1BfUEFDS0VUJyB3aGljaCB3ZSBhY3R1YWxseSBkZWZpbmUKKyAqIGFzIHN1Y2Nlc3MsIGp1c3QgdG8gYmUgY2xlYXIgd2hhdCB3ZSdyZSByZWFsbHkgZG9pbmcuCisgKi8KKyNkZWZpbmUgRFJPUF9QQUNLRVQgMQorc3RhdGljIGludCBwcHBvYXRtX3NlbmQoc3RydWN0IHBwcF9jaGFubmVsICpjaGFuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBwcHBvYXRtX3ZjYyAqcHZjYyA9IGNoYW5fdG9fcHZjYyhjaGFuKTsKKwlBVE1fU0tCKHNrYiktPnZjYyA9IHB2Y2MtPmF0bXZjYzsKKwlEUFJJTlRLKCIodW5pdCAlZCk6IHBwcG9hdG1fc2VuZCAoc2tiPTB4JXAsIHZjYz0weCVwKVxuIiwKKwkgICAgcHZjYy0+Y2hhbi51bml0LCBza2IsIHB2Y2MtPmF0bXZjYyk7CisJaWYgKHNrYi0+ZGF0YVswXSA9PSAnXDAnICYmIChwdmNjLT5mbGFncyAmIFNDX0NPTVBfUFJPVCkpCisJCSh2b2lkKSBza2JfcHVsbChza2IsIDEpOworCXN3aXRjaCAocHZjYy0+ZW5jYXBzKSB7CQkvKiBMTEMgZW5jYXBzdWxhdGlvbiBuZWVkZWQgKi8KKwljYXNlIGVfbGxjOgorCQlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCBMTENfTEVOKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqbjsKKwkJCW4gPSBza2JfcmVhbGxvY19oZWFkcm9vbShza2IsIExMQ19MRU4pOworCQkJaWYgKG4gIT0gTlVMTCAmJgorCQkJICAgICFhdG1fbWF5X3NlbmQocHZjYy0+YXRtdmNjLCBuLT50cnVlc2l6ZSkpIHsKKwkJCQlrZnJlZV9za2Iobik7CisJCQkJZ290byBub3NwYWNlOworCQkJfQorCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlpZiAoKHNrYiA9IG4pID09IE5VTEwpCisJCQkJcmV0dXJuIERST1BfUEFDS0VUOworCQl9IGVsc2UgaWYgKCFhdG1fbWF5X3NlbmQocHZjYy0+YXRtdmNjLCBza2ItPnRydWVzaXplKSkKKwkJCWdvdG8gbm9zcGFjZTsKKwkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgTExDX0xFTiksIHBwcGxsYywgTExDX0xFTik7CisJCWJyZWFrOworCWNhc2UgZV92YzoKKwkJaWYgKCFhdG1fbWF5X3NlbmQocHZjYy0+YXRtdmNjLCBza2ItPnRydWVzaXplKSkKKwkJCWdvdG8gbm9zcGFjZTsKKwkJYnJlYWs7CisJY2FzZSBlX2F1dG9kZXRlY3Q6CisJCURQUklOVEsoIih1bml0ICVkKTogVHJ5aW5nIHRvIHNlbmQgd2l0aG91dCBzZXR0aW5nIGVuY2FwcyFcbiIsCisJCSAgICBwdmNjLT5jaGFuLnVuaXQpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJYXRvbWljX2FkZChza2ItPnRydWVzaXplLCAmc2tfYXRtKEFUTV9TS0Ioc2tiKS0+dmNjKS0+c2tfd21lbV9hbGxvYyk7CisJQVRNX1NLQihza2IpLT5hdG1fb3B0aW9ucyA9IEFUTV9TS0Ioc2tiKS0+dmNjLT5hdG1fb3B0aW9uczsKKwlEUFJJTlRLKCIodW5pdCAlZCk6IGF0bV9za2IoJXApLT52Y2MoJXApLT5kZXYoJXApXG4iLAorCSAgICBwdmNjLT5jaGFuLnVuaXQsIHNrYiwgQVRNX1NLQihza2IpLT52Y2MsCisJICAgIEFUTV9TS0Ioc2tiKS0+dmNjLT5kZXYpOworCXJldHVybiBBVE1fU0tCKHNrYiktPnZjYy0+c2VuZChBVE1fU0tCKHNrYiktPnZjYywgc2tiKQorCSAgICA/IERST1BfUEFDS0VUIDogMTsKKyAgICBub3NwYWNlOgorCS8qCisJICogV2UgZG9uJ3QgaGF2ZSBzcGFjZSB0byBzZW5kIHRoaXMgU0tCIG5vdywgYnV0IHdlIG1pZ2h0IGhhdmUKKwkgKiBhbHJlYWR5IGFwcGxpZWQgU0NfQ09NUF9QUk9UIGNvbXByZXNzaW9uLCBzbyBtYXkgbmVlZCB0byB1bmRvCisJICovCisJaWYgKChwdmNjLT5mbGFncyAmIFNDX0NPTVBfUFJPVCkgJiYgc2tiX2hlYWRyb29tKHNrYikgPiAwICYmCisJICAgIHNrYi0+ZGF0YVstMV0gPT0gJ1wwJykKKwkJKHZvaWQpIHNrYl9wdXNoKHNrYiwgMSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgaGFuZGxlcyBpb2N0bHMgc2VudCB0byB0aGUgL2Rldi9wcHAgaW50ZXJmYWNlICovCitzdGF0aWMgaW50IHBwcG9hdG1fZGV2cHBwX2lvY3RsKHN0cnVjdCBwcHBfY2hhbm5lbCAqY2hhbiwgdW5zaWduZWQgaW50IGNtZCwKKwl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUFBQSU9DR0ZMQUdTOgorCQlyZXR1cm4gcHV0X3VzZXIoY2hhbl90b19wdmNjKGNoYW4pLT5mbGFncywgKGludCBfX3VzZXIgKikgYXJnKQorCQkgICAgPyAtRUZBVUxUIDogMDsKKwljYXNlIFBQUElPQ1NGTEFHUzoKKwkJcmV0dXJuIGdldF91c2VyKGNoYW5fdG9fcHZjYyhjaGFuKS0+ZmxhZ3MsIChpbnQgX191c2VyICopIGFyZykKKwkJICAgID8gLUVGQVVMVCA6IDA7CisJfQorCXJldHVybiAtRU5PVFRZOworfQorCitzdGF0aWMgLypjb25zdCovIHN0cnVjdCBwcHBfY2hhbm5lbF9vcHMgcHBwb2F0bV9vcHMgPSB7CisJLnN0YXJ0X3htaXQgPSBwcHBvYXRtX3NlbmQsCisJLmlvY3RsID0gcHBwb2F0bV9kZXZwcHBfaW9jdGwsCit9OworCitzdGF0aWMgaW50IHBwcG9hdG1fYXNzaWduX3ZjYyhzdHJ1Y3QgYXRtX3ZjYyAqYXRtdmNjLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBhdG1fYmFja2VuZF9wcHAgYmU7CisJc3RydWN0IHBwcG9hdG1fdmNjICpwdmNjOworCWludCBlcnI7CisJLyoKKwkgKiBFYWNoIFBQUG9BVE0gaW5zdGFuY2UgaGFzIGl0cyBvd24gdGFza2xldCAtIHRoaXMgaXMganVzdCBhCisJICogcHJvdG90eXBpY2FsIG9uZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlbQorCSAqLworCXN0YXRpYyBjb25zdCBERUNMQVJFX1RBU0tMRVQodGFza2xldF9wcm90bywgcHBwb2F0bV93YWtldXBfc2VuZGVyLCAwKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJmJlLCBhcmcsIHNpemVvZiBiZSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChiZS5lbmNhcHMgIT0gUFBQT0FUTV9FTkNBUFNfQVVUT0RFVEVDVCAmJgorCSAgICBiZS5lbmNhcHMgIT0gUFBQT0FUTV9FTkNBUFNfVkMgJiYgYmUuZW5jYXBzICE9IFBQUE9BVE1fRU5DQVBTX0xMQykKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHZjYyA9IGttYWxsb2Moc2l6ZW9mKCpwdmNjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHB2Y2MgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KHB2Y2MsIDAsIHNpemVvZigqcHZjYykpOworCXB2Y2MtPmF0bXZjYyA9IGF0bXZjYzsKKwlwdmNjLT5vbGRfcHVzaCA9IGF0bXZjYy0+cHVzaDsKKwlwdmNjLT5vbGRfcG9wID0gYXRtdmNjLT5wb3A7CisJcHZjYy0+ZW5jYXBzID0gKGVudW0gcHBwb2F0bV9lbmNhcHMpIGJlLmVuY2FwczsKKwlwdmNjLT5jaGFuLnByaXZhdGUgPSBwdmNjOworCXB2Y2MtPmNoYW4ub3BzID0gJnBwcG9hdG1fb3BzOworCXB2Y2MtPmNoYW4ubXR1ID0gYXRtdmNjLT5xb3MudHh0cC5tYXhfc2R1IC0gUFBQX0hEUkxFTiAtCisJICAgIChiZS5lbmNhcHMgPT0gZV92YyA/IDAgOiBMTENfTEVOKTsKKwlwdmNjLT53YWtldXBfdGFza2xldCA9IHRhc2tsZXRfcHJvdG87CisJcHZjYy0+d2FrZXVwX3Rhc2tsZXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSAmcHZjYy0+Y2hhbjsKKwlpZiAoKGVyciA9IHBwcF9yZWdpc3Rlcl9jaGFubmVsKCZwdmNjLT5jaGFuKSkgIT0gMCkgeworCQlrZnJlZShwdmNjKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJYXRtdmNjLT51c2VyX2JhY2sgPSBwdmNjOworCWF0bXZjYy0+cHVzaCA9IHBwcG9hdG1fcHVzaDsKKwlhdG12Y2MtPnBvcCA9IHBwcG9hdG1fcG9wOworCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGhhbmRsZXMgaW9jdGxzIGFjdHVhbGx5IHBlcmZvcm1lZCBvbiBvdXIgdmNjIC0gd2UgbXVzdCByZXR1cm4KKyAqIC1FTk9JT0NUTENNRCBmb3IgYW55IHVucmVjb2duaXplZCBpb2N0bAorICovCitzdGF0aWMgaW50IHBwcG9hdG1faW9jdGwoc3RydWN0IHNvY2tldCAqc29jaywgdW5zaWduZWQgaW50IGNtZCwKKwl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYXRtX3ZjYyAqYXRtdmNjID0gQVRNX1NEKHNvY2spOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisJaWYgKGNtZCAhPSBBVE1fU0VUQkFDS0VORCAmJiBhdG12Y2MtPnB1c2ggIT0gcHBwb2F0bV9wdXNoKQorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBVE1fU0VUQkFDS0VORDogeworCQlhdG1fYmFja2VuZF90IGI7CisJCWlmIChnZXRfdXNlcihiLCAoYXRtX2JhY2tlbmRfdCBfX3VzZXIgKikgYXJncCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGIgIT0gQVRNX0JBQ0tFTkRfUFBQKQorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJcmV0dXJuIHBwcG9hdG1fYXNzaWduX3ZjYyhhdG12Y2MsIGFyZ3ApOworCQl9CisJY2FzZSBQUFBJT0NHQ0hBTjoKKwkJcmV0dXJuIHB1dF91c2VyKHBwcF9jaGFubmVsX2luZGV4KCZhdG12Y2NfdG9fcHZjYyhhdG12Y2MpLT4KKwkJICAgIGNoYW4pLCAoaW50IF9fdXNlciAqKSBhcmdwKSA/IC1FRkFVTFQgOiAwOworCWNhc2UgUFBQSU9DR1VOSVQ6CisJCXJldHVybiBwdXRfdXNlcihwcHBfdW5pdF9udW1iZXIoJmF0bXZjY190b19wdmNjKGF0bXZjYyktPgorCQkgICAgY2hhbiksIChpbnQgX191c2VyICopIGFyZ3ApID8gLUVGQVVMVCA6IDA7CisJfQorCXJldHVybiAtRU5PSU9DVExDTUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXRtX2lvY3RsIHBwcG9hdG1faW9jdGxfb3BzID0geworCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5pb2N0bAk9IHBwcG9hdG1faW9jdGwsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwcHBvYXRtX2luaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl9hdG1faW9jdGwoJnBwcG9hdG1faW9jdGxfb3BzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBwcG9hdG1fZXhpdCh2b2lkKQoreworCWRlcmVnaXN0ZXJfYXRtX2lvY3RsKCZwcHBvYXRtX2lvY3RsX29wcyk7Cit9CisKK21vZHVsZV9pbml0KHBwcG9hdG1faW5pdCk7Cittb2R1bGVfZXhpdChwcHBvYXRtX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNaXRjaGVsbCBCbGFuayBKciA8bWl0Y2hAc2Znb3RoLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUkZDMjM2NCBQUFAgb3ZlciBBVE0vQUFMNSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9wcm9jLmMgYi9uZXQvYXRtL3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDQxMDU0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2F0bS9wcm9jLmMKQEAgLTAsMCArMSw1MTQgQEAKKy8qIG5ldC9hdG0vcHJvYy5jIC0gQVRNIC9wcm9jIGludGVyZmFjZQorICoKKyAqIFdyaXR0ZW4gMTk5NS0yMDAwIGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgRVBGTCBMUkMvSUNBCisgKgorICogc2VxX2ZpbGUgYXBpIHVzYWdlIGJ5IHJvbWlldUBmci56b3JlaWwuY29tCisgKgorICogRXZhbHVhdGluZyB0aGUgZWZmaWNpZW5jeSBvZiB0aGUgd2hvbGUgdGhpbmcgaWYgbGVmdCBhcyBhbiBleGVyY2lzZSB0bworICogdGhlIHJlYWRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+IC8qIGZvciBFWFBPUlRfU1lNQk9MICovCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvYXRtLmg+CisjaW5jbHVkZSA8bGludXgvYXRtZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYXRtY2xpcC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4gLyogZm9yIF9faW5pdCAqLworI2luY2x1ZGUgPG5ldC9hdG1jbGlwLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL3BhcmFtLmg+IC8qIGZvciBIWiAqLworI2luY2x1ZGUgInJlc291cmNlcy5oIgorI2luY2x1ZGUgImNvbW1vbi5oIiAvKiBhdG1fcHJvY19pbml0IHByb3RvdHlwZSAqLworI2luY2x1ZGUgInNpZ25hbGluZy5oIiAvKiB0byBnZXQgc2lnZCAtIHVnbHkgdG9vICovCisKK3N0YXRpYyBzc2l6ZV90IHByb2NfZGV2X2F0bV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLGNoYXIgX191c2VyICpidWYsc2l6ZV90IGNvdW50LAorICAgIGxvZmZfdCAqcG9zKTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19hdG1fZGV2X29wcyA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkucmVhZCA9CQlwcm9jX2Rldl9hdG1fcmVhZCwKK307CisKK3N0YXRpYyB2b2lkIGFkZF9zdGF0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgY29uc3QgY2hhciAqYWFsLAorICBjb25zdCBzdHJ1Y3Qga19hdG1fYWFsX3N0YXRzICpzdGF0cykKK3sKKwlzZXFfcHJpbnRmKHNlcSwgIiVzICggJWQgJWQgJWQgJWQgJWQgKSIsIGFhbCwKKwkgICAgYXRvbWljX3JlYWQoJnN0YXRzLT50eCksYXRvbWljX3JlYWQoJnN0YXRzLT50eF9lcnIpLAorCSAgICBhdG9taWNfcmVhZCgmc3RhdHMtPnJ4KSxhdG9taWNfcmVhZCgmc3RhdHMtPnJ4X2VyciksCisJICAgIGF0b21pY19yZWFkKCZzdGF0cy0+cnhfZHJvcCkpOworfQorCitzdGF0aWMgdm9pZCBhdG1fZGV2X2luZm8oc3RydWN0IHNlcV9maWxlICpzZXEsIGNvbnN0IHN0cnVjdCBhdG1fZGV2ICpkZXYpCit7CisJaW50IGk7CisKKwlzZXFfcHJpbnRmKHNlcSwgIiUzZCAlLThzIiwgZGV2LT5udW1iZXIsIGRldi0+dHlwZSk7CisJZm9yIChpID0gMDsgaSA8IEVTSV9MRU47IGkrKykKKwkJc2VxX3ByaW50ZihzZXEsICIlMDJ4IiwgZGV2LT5lc2lbaV0pOworCXNlcV9wdXRzKHNlcSwgIiAgIik7CisJYWRkX3N0YXRzKHNlcSwgIjAiLCAmZGV2LT5zdGF0cy5hYWwwKTsKKwlzZXFfcHV0cyhzZXEsICIgICIpOworCWFkZF9zdGF0cyhzZXEsICI1IiwgJmRldi0+c3RhdHMuYWFsNSk7CisJc2VxX3ByaW50ZihzZXEsICJcdFslZF0iLCBhdG9taWNfcmVhZCgmZGV2LT5yZWZjbnQpKTsKKwlzZXFfcHV0YyhzZXEsICdcbicpOworfQorCitzdHJ1Y3QgdmNjX3N0YXRlIHsKKwlpbnQgYnVja2V0OworCXN0cnVjdCBzb2NrICpzazsKKwlpbnQgZmFtaWx5OworfTsKKworc3RhdGljIGlubGluZSBpbnQgY29tcGFyZV9mYW1pbHkoc3RydWN0IHNvY2sgKnNrLCBpbnQgZmFtaWx5KQoreworCXJldHVybiAhZmFtaWx5IHx8IChzay0+c2tfZmFtaWx5ID09IGZhbWlseSk7Cit9CisKK3N0YXRpYyBpbnQgX192Y2Nfd2FsayhzdHJ1Y3Qgc29jayAqKnNvY2ssIGludCBmYW1pbHksIGludCAqYnVja2V0LCBsb2ZmX3QgbCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSAqc29jazsKKworCWlmIChzayA9PSAodm9pZCAqKTEpIHsKKwkJZm9yICgqYnVja2V0ID0gMDsgKmJ1Y2tldCA8IFZDQ19IVEFCTEVfU0laRTsgKysqYnVja2V0KSB7CisJCQlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCA9ICZ2Y2NfaGFzaFsqYnVja2V0XTsKKworCQkJc2sgPSBobGlzdF9lbXB0eShoZWFkKSA/IE5VTEwgOiBfX3NrX2hlYWQoaGVhZCk7CisJCQlpZiAoc2spCisJCQkJYnJlYWs7CisJCX0KKwkJbC0tOworCX0gCit0cnlfYWdhaW46CisJZm9yICg7IHNrOyBzayA9IHNrX25leHQoc2spKSB7CisJCWwgLT0gY29tcGFyZV9mYW1pbHkoc2ssIGZhbWlseSk7CisJCWlmIChsIDwgMCkKKwkJCWdvdG8gb3V0OworCX0KKwlpZiAoIXNrICYmICsrKmJ1Y2tldCA8IFZDQ19IVEFCTEVfU0laRSkgeworCQlzayA9IHNrX2hlYWQoJnZjY19oYXNoWypidWNrZXRdKTsKKwkJZ290byB0cnlfYWdhaW47CisJfQorCXNrID0gKHZvaWQgKikxOworb3V0OgorCSpzb2NrID0gc2s7CisJcmV0dXJuIChsIDwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqdmNjX3dhbGsoc3RydWN0IHZjY19zdGF0ZSAqc3RhdGUsIGxvZmZfdCBsKQoreworCXJldHVybiBfX3ZjY193YWxrKCZzdGF0ZS0+c2ssIHN0YXRlLT5mYW1pbHksICZzdGF0ZS0+YnVja2V0LCBsKSA/CisJICAgICAgIHN0YXRlIDogTlVMTDsKK30KKworc3RhdGljIGludCBfX3ZjY19zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwlpbnQgZmFtaWx5LCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgKm9wcykKK3sKKwlzdHJ1Y3QgdmNjX3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKKwlpbnQgcmMgPSAtRU5PTUVNOworCisJc3RhdGUgPSBrbWFsbG9jKHNpemVvZigqc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0YXRlKQorCQlnb3RvIG91dDsKKworCXJjID0gc2VxX29wZW4oZmlsZSwgb3BzKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0X2tmcmVlOworCisJc3RhdGUtPmZhbWlseSA9IGZhbWlseTsKKworCXNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzZXEtPnByaXZhdGUgPSBzdGF0ZTsKK291dDoKKwlyZXR1cm4gcmM7CitvdXRfa2ZyZWU6CisJa2ZyZWUoc3RhdGUpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50IHZjY19zZXFfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX3JlbGVhc2VfcHJpdmF0ZShpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyB2b2lkICp2Y2Nfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgdmNjX3N0YXRlICpzdGF0ZSA9IHNlcS0+cHJpdmF0ZTsKKwlsb2ZmX3QgbGVmdCA9ICpwb3M7CisKKwlyZWFkX2xvY2soJnZjY19za2xpc3RfbG9jayk7CisJc3RhdGUtPnNrID0gKHZvaWQgKikxOworCXJldHVybiBsZWZ0ID8gdmNjX3dhbGsoc3RhdGUsIGxlZnQpIDogKHZvaWQgKikxOworfQorCitzdGF0aWMgdm9pZCB2Y2Nfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJcmVhZF91bmxvY2soJnZjY19za2xpc3RfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkICp2Y2Nfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCB2Y2Nfc3RhdGUgKnN0YXRlID0gc2VxLT5wcml2YXRlOworCisJdiA9IHZjY193YWxrKHN0YXRlLCAxKTsKKwkqcG9zICs9ICEhUFRSX0VSUih2KTsKKwlyZXR1cm4gdjsKK30KKworc3RhdGljIHZvaWQgcHZjX2luZm8oc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBhdG1fdmNjICp2Y2MpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNsYXNzX25hbWVbXSA9IHsgIm9mZiIsIlVCUiIsIkNCUiIsIlZCUiIsIkFCUiIgfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqYWFsX25hbWVbXSA9IHsKKwkJIi0tLSIsCSIxIiwJIjIiLAkiMy80IiwJLyogIDAtIDMgKi8KKwkJIj8/PyIsCSI1IiwJIj8/PyIsCSI/Pz8iLAkvKiAgNC0gNyAqLworCQkiPz8/IiwJIj8/PyIsCSI/Pz8iLAkiPz8/IiwJLyogIDgtMTEgKi8KKwkJIj8/PyIsCSIwIiwJIj8/PyIsCSI/Pz8ifTsJLyogMTItMTUgKi8KKworCXNlcV9wcmludGYoc2VxLCAiJTNkICUzZCAlNWQgJS0zcyAlN2QgJS01cyAlN2QgJS02cyIsCisJICAgIHZjYy0+ZGV2LT5udW1iZXIsdmNjLT52cGksdmNjLT52Y2ksCisJICAgIHZjYy0+cW9zLmFhbCA+PSBzaXplb2YoYWFsX25hbWUpL3NpemVvZihhYWxfbmFtZVswXSkgPyAiZXJyIiA6CisJICAgIGFhbF9uYW1lW3ZjYy0+cW9zLmFhbF0sdmNjLT5xb3Mucnh0cC5taW5fcGNyLAorCSAgICBjbGFzc19uYW1lW3ZjYy0+cW9zLnJ4dHAudHJhZmZpY19jbGFzc10sdmNjLT5xb3MudHh0cC5taW5fcGNyLAorCSAgICBjbGFzc19uYW1lW3ZjYy0+cW9zLnR4dHAudHJhZmZpY19jbGFzc10pOworCWlmICh0ZXN0X2JpdChBVE1fVkZfSVNfQ0xJUCwgJnZjYy0+ZmxhZ3MpKSB7CisJCXN0cnVjdCBjbGlwX3ZjYyAqY2xpcF92Y2MgPSBDTElQX1ZDQyh2Y2MpOworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJCWRldiA9IGNsaXBfdmNjLT5lbnRyeSA/IGNsaXBfdmNjLT5lbnRyeS0+bmVpZ2gtPmRldiA6IE5VTEw7CisJCXNlcV9wcmludGYoc2VxLCAiQ0xJUCwgSXRmOiVzLCBFbmNhcDoiLAorCQkgICAgZGV2ID8gZGV2LT5uYW1lIDogIm5vbmU/Iik7CisJCXNlcV9wcmludGYoc2VxLCAiJXMiLCBjbGlwX3ZjYy0+ZW5jYXAgPyAiTExDL1NOQVAiIDogIk5vbmUiKTsKKwl9CisJc2VxX3B1dGMoc2VxLCAnXG4nKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnZjY19zdGF0ZShzdHJ1Y3QgYXRtX3ZjYyAqdmNjKQoreworCXN0YXRpYyBjb25zdCBjaGFyICptYXBbXSA9IHsgQVRNX1ZTMlRYVF9NQVAgfTsKKworCXJldHVybiBtYXBbQVRNX1ZGMlZTKHZjYy0+ZmxhZ3MpXTsKK30KKworc3RhdGljIHZvaWQgdmNjX2luZm8oc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBhdG1fdmNjICp2Y2MpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc2tfYXRtKHZjYyk7CisKKwlzZXFfcHJpbnRmKHNlcSwgIiVwICIsIHZjYyk7CisJaWYgKCF2Y2MtPmRldikKKwkJc2VxX3ByaW50ZihzZXEsICJVbmFzc2lnbmVkICAgICIpOworCWVsc2UgCisJCXNlcV9wcmludGYoc2VxLCAiJTNkICUzZCAlNWQgIiwgdmNjLT5kZXYtPm51bWJlciwgdmNjLT52cGksCisJCQl2Y2MtPnZjaSk7CisJc3dpdGNoIChzay0+c2tfZmFtaWx5KSB7CisJCWNhc2UgQUZfQVRNUFZDOgorCQkJc2VxX3ByaW50ZihzZXEsICJQVkMiKTsKKwkJCWJyZWFrOworCQljYXNlIEFGX0FUTVNWQzoKKwkJCXNlcV9wcmludGYoc2VxLCAiU1ZDIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNlcV9wcmludGYoc2VxLCAiJTNkIiwgc2stPnNrX2ZhbWlseSk7CisJfQorCXNlcV9wcmludGYoc2VxLCAiICUwNGx4ICAlNWQgJTdkLyU3ZCAlN2QvJTdkIFslZF1cbiIsIHZjYy0+ZmxhZ3MsIHNrLT5za19lcnIsCisJCSAgYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKSwgc2stPnNrX3NuZGJ1ZiwKKwkJICBhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpLCBzay0+c2tfcmN2YnVmLAorCQkgIGF0b21pY19yZWFkKCZzay0+c2tfcmVmY250KSk7Cit9CisKK3N0YXRpYyB2b2lkIHN2Y19pbmZvKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgYXRtX3ZjYyAqdmNjKQoreworCWlmICghdmNjLT5kZXYpCisJCXNlcV9wcmludGYoc2VxLCBzaXplb2Yodm9pZCAqKSA9PSA0ID8KKwkJCSAgICJOL0FAJXAlMTBzIiA6ICJOL0FAJXAlMnMiLCB2Y2MsICIiKTsKKwllbHNlCisJCXNlcV9wcmludGYoc2VxLCAiJTNkICUzZCAlNWQgICAgICAgICAiLAorCQkJICAgdmNjLT5kZXYtPm51bWJlciwgdmNjLT52cGksIHZjYy0+dmNpKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiUtMTBzICIsIHZjY19zdGF0ZSh2Y2MpKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiVzJXMiLCB2Y2MtPnJlbW90ZS5zYXNfYWRkci5wdWIsCisJICAgICp2Y2MtPnJlbW90ZS5zYXNfYWRkci5wdWIgJiYgKnZjYy0+cmVtb3RlLnNhc19hZGRyLnBydiA/ICIrIiA6ICIiKTsKKwlpZiAoKnZjYy0+cmVtb3RlLnNhc19hZGRyLnBydikgeworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVRNX0VTQV9MRU47IGkrKykKKwkJCXNlcV9wcmludGYoc2VxLCAiJTAyeCIsIHZjYy0+cmVtb3RlLnNhc19hZGRyLnBydltpXSk7CisJfQorCXNlcV9wdXRjKHNlcSwgJ1xuJyk7Cit9CisKK3N0YXRpYyBpbnQgYXRtX2Rldl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdGF0aWMgY2hhciBhdG1fZGV2X2Jhbm5lcltdID0KKwkJIkl0ZiBUeXBlICAgIEVTSS9cIk1BQ1wiYWRkciAiCisJCSJBQUwoVFgsZXJyLFJYLGVycixkcm9wKSAuLi4gICAgICAgICAgICAgICBbcmVmY250XVxuIjsKKyAKKwlpZiAodiA9PSAodm9pZCAqKTEpCisJCXNlcV9wdXRzKHNlcSwgYXRtX2Rldl9iYW5uZXIpOworCWVsc2UgeworCQlzdHJ1Y3QgYXRtX2RldiAqZGV2ID0gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgYXRtX2RldiwgZGV2X2xpc3QpOworCisJCWF0bV9kZXZfaW5mbyhzZXEsIGRldik7CisJfQorIAlyZXR1cm4gMDsKK30KKyAKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgYXRtX2Rldl9zZXFfb3BzID0geworCS5zdGFydAk9IGF0bV9kZXZfc2VxX3N0YXJ0LAorCS5uZXh0CT0gYXRtX2Rldl9zZXFfbmV4dCwKKwkuc3RvcAk9IGF0bV9kZXZfc2VxX3N0b3AsCisJLnNob3cJPSBhdG1fZGV2X3NlcV9zaG93LAorfTsKKyAKK3N0YXRpYyBpbnQgYXRtX2Rldl9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmF0bV9kZXZfc2VxX29wcyk7Cit9CisgCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZXZpY2VzX3NlcV9mb3BzID0geworCS5vcGVuCQk9IGF0bV9kZXZfc2VxX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgcHZjX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0YXRpYyBjaGFyIGF0bV9wdmNfYmFubmVyW10gPSAKKwkJIkl0ZiBWUEkgVkNJICAgQUFMIFJYKFBDUixDbGFzcykgVFgoUENSLENsYXNzKVxuIjsKKworCWlmICh2ID09ICh2b2lkICopMSkKKwkJc2VxX3B1dHMoc2VxLCBhdG1fcHZjX2Jhbm5lcik7CisJZWxzZSB7CisJCXN0cnVjdCB2Y2Nfc3RhdGUgKnN0YXRlID0gc2VxLT5wcml2YXRlOworCQlzdHJ1Y3QgYXRtX3ZjYyAqdmNjID0gYXRtX3NrKHN0YXRlLT5zayk7CisKKwkJcHZjX2luZm8oc2VxLCB2Y2MpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBwdmNfc2VxX29wcyA9IHsKKwkuc3RhcnQJPSB2Y2Nfc2VxX3N0YXJ0LAorCS5uZXh0CT0gdmNjX3NlcV9uZXh0LAorCS5zdG9wCT0gdmNjX3NlcV9zdG9wLAorCS5zaG93CT0gcHZjX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBwdmNfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIF9fdmNjX3NlcV9vcGVuKGlub2RlLCBmaWxlLCBQRl9BVE1QVkMsICZwdmNfc2VxX29wcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHB2Y19zZXFfZm9wcyA9IHsKKwkub3BlbgkJPSBwdmNfc2VxX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSB2Y2Nfc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IHZjY19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKyAJaWYgKHYgPT0gKHZvaWQgKikxKSB7CisgCQlzZXFfcHJpbnRmKHNlcSwgc2l6ZW9mKHZvaWQgKikgPT0gNCA/ICIlLThzJXMiIDogIiUtMTZzJXMiLAorIAkJCSJBZGRyZXNzICIsICJJdGYgVlBJIFZDSSAgIEZhbSBGbGFncyBSZXBseSAiCisgCQkJIlNlbmQgYnVmZmVyICAgICBSZWN2IGJ1ZmZlciAgICAgIFtyZWZjbnRdXG4iKTsKKyAJfSBlbHNlIHsKKyAJCXN0cnVjdCB2Y2Nfc3RhdGUgKnN0YXRlID0gc2VxLT5wcml2YXRlOworIAkJc3RydWN0IGF0bV92Y2MgKnZjYyA9IGF0bV9zayhzdGF0ZS0+c2spOworICAKKyAJCXZjY19pbmZvKHNlcSwgdmNjKTsKKyAJfQorICAJcmV0dXJuIDA7Cit9CisgIAorc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyB2Y2Nfc2VxX29wcyA9IHsKKyAJLnN0YXJ0CT0gdmNjX3NlcV9zdGFydCwKKyAJLm5leHQJPSB2Y2Nfc2VxX25leHQsCisgCS5zdG9wCT0gdmNjX3NlcV9zdG9wLAorIAkuc2hvdwk9IHZjY19zZXFfc2hvdywKK307CisgCitzdGF0aWMgaW50IHZjY19zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyAJcmV0dXJuIF9fdmNjX3NlcV9vcGVuKGlub2RlLCBmaWxlLCAwLCAmdmNjX3NlcV9vcHMpOworfQorIAorc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdmNjX3NlcV9mb3BzID0geworCS5vcGVuCQk9IHZjY19zZXFfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHZjY19zZXFfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgc3ZjX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0YXRpYyBjaGFyIGF0bV9zdmNfYmFubmVyW10gPSAKKwkJIkl0ZiBWUEkgVkNJICAgICAgICAgICBTdGF0ZSAgICAgIFJlbW90ZVxuIjsKKworCWlmICh2ID09ICh2b2lkICopMSkKKwkJc2VxX3B1dHMoc2VxLCBhdG1fc3ZjX2Jhbm5lcik7CisJZWxzZSB7CisJCXN0cnVjdCB2Y2Nfc3RhdGUgKnN0YXRlID0gc2VxLT5wcml2YXRlOworCQlzdHJ1Y3QgYXRtX3ZjYyAqdmNjID0gYXRtX3NrKHN0YXRlLT5zayk7CisKKwkJc3ZjX2luZm8oc2VxLCB2Y2MpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBzdmNfc2VxX29wcyA9IHsKKwkuc3RhcnQJPSB2Y2Nfc2VxX3N0YXJ0LAorCS5uZXh0CT0gdmNjX3NlcV9uZXh0LAorCS5zdG9wCT0gdmNjX3NlcV9zdG9wLAorCS5zaG93CT0gc3ZjX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBzdmNfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIF9fdmNjX3NlcV9vcGVuKGlub2RlLCBmaWxlLCBQRl9BVE1TVkMsICZzdmNfc2VxX29wcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN2Y19zZXFfZm9wcyA9IHsKKwkub3BlbgkJPSBzdmNfc2VxX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSB2Y2Nfc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3NpemVfdCBwcm9jX2Rldl9hdG1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgYXRtX2RldiAqZGV2OworCXVuc2lnbmVkIGxvbmcgcGFnZTsKKwlpbnQgbGVuZ3RoOworCisJaWYgKGNvdW50ID09IDApIHJldHVybiAwOworCXBhZ2UgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFwYWdlKSByZXR1cm4gLUVOT01FTTsKKwlkZXYgPSBQREUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpLT5kYXRhOworCWlmICghZGV2LT5vcHMtPnByb2NfcmVhZCkKKwkJbGVuZ3RoID0gLUVJTlZBTDsKKwllbHNlIHsKKwkJbGVuZ3RoID0gZGV2LT5vcHMtPnByb2NfcmVhZChkZXYscG9zLChjaGFyICopIHBhZ2UpOworCQlpZiAobGVuZ3RoID4gY291bnQpIGxlbmd0aCA9IC1FSU5WQUw7CisJfQorCWlmIChsZW5ndGggPj0gMCkgeworCQlpZiAoY29weV90b191c2VyKGJ1ZiwoY2hhciAqKSBwYWdlLGxlbmd0aCkpIGxlbmd0aCA9IC1FRkFVTFQ7CisJCSgqcG9zKSsrOworCX0KKwlmcmVlX3BhZ2UocGFnZSk7CisJcmV0dXJuIGxlbmd0aDsKK30KKworCitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmF0bV9wcm9jX3Jvb3Q7CitFWFBPUlRfU1lNQk9MKGF0bV9wcm9jX3Jvb3QpOworCisKK2ludCBhdG1fcHJvY19kZXZfcmVnaXN0ZXIoc3RydWN0IGF0bV9kZXYgKmRldikKK3sKKwlpbnQgZGlnaXRzLG51bTsKKwlpbnQgZXJyb3I7CisKKwkvKiBObyBwcm9jIGluZm8gKi8KKwlpZiAoIWRldi0+b3BzLT5wcm9jX3JlYWQpCisJCXJldHVybiAwOworCisJZXJyb3IgPSAtRU5PTUVNOworCWRpZ2l0cyA9IDA7CisJZm9yIChudW0gPSBkZXYtPm51bWJlcjsgbnVtOyBudW0gLz0gMTApIGRpZ2l0cysrOworCWlmICghZGlnaXRzKSBkaWdpdHMrKzsKKworCWRldi0+cHJvY19uYW1lID0ga21hbGxvYyhzdHJsZW4oZGV2LT50eXBlKSArIGRpZ2l0cyArIDIsIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5wcm9jX25hbWUpCisJCWdvdG8gZXJyX291dDsKKwlzcHJpbnRmKGRldi0+cHJvY19uYW1lLCIlczolZCIsZGV2LT50eXBlLCBkZXYtPm51bWJlcik7CisKKwlkZXYtPnByb2NfZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShkZXYtPnByb2NfbmFtZSwgMCwgYXRtX3Byb2Nfcm9vdCk7CisJaWYgKCFkZXYtPnByb2NfZW50cnkpCisJCWdvdG8gZXJyX2ZyZWVfbmFtZTsKKwlkZXYtPnByb2NfZW50cnktPmRhdGEgPSBkZXY7CisJZGV2LT5wcm9jX2VudHJ5LT5wcm9jX2ZvcHMgPSAmcHJvY19hdG1fZGV2X29wczsKKwlkZXYtPnByb2NfZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CisJcmV0dXJuIDA7CitlcnJfZnJlZV9uYW1lOgorCWtmcmVlKGRldi0+cHJvY19uYW1lKTsKK2Vycl9vdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisKK3ZvaWQgYXRtX3Byb2NfZGV2X2RlcmVnaXN0ZXIoc3RydWN0IGF0bV9kZXYgKmRldikKK3sKKwlpZiAoIWRldi0+b3BzLT5wcm9jX3JlYWQpCisJCXJldHVybjsKKworCXJlbW92ZV9wcm9jX2VudHJ5KGRldi0+cHJvY19uYW1lLCBhdG1fcHJvY19yb290KTsKKwlrZnJlZShkZXYtPnByb2NfbmFtZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXRtX3Byb2NfZW50cnkgeworCWNoYXIgKm5hbWU7CisJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqcHJvY19mb3BzOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGlyZW50OworfSBhdG1fcHJvY19lbnRzW10gPSB7CisJeyAubmFtZSA9ICJkZXZpY2VzIiwJLnByb2NfZm9wcyA9ICZkZXZpY2VzX3NlcV9mb3BzIH0sCisJeyAubmFtZSA9ICJwdmMiLAkucHJvY19mb3BzID0gJnB2Y19zZXFfZm9wcyB9LAorCXsgLm5hbWUgPSAic3ZjIiwJLnByb2NfZm9wcyA9ICZzdmNfc2VxX2ZvcHMgfSwKKwl7IC5uYW1lID0gInZjIiwJCS5wcm9jX2ZvcHMgPSAmdmNjX3NlcV9mb3BzIH0sCisJeyAubmFtZSA9IE5VTEwsCQkucHJvY19mb3BzID0gTlVMTCB9Cit9OworCitzdGF0aWMgdm9pZCBhdG1fcHJvY19kaXJzX3JlbW92ZSh2b2lkKQoreworCXN0YXRpYyBzdHJ1Y3QgYXRtX3Byb2NfZW50cnkgKmU7CisKKwlmb3IgKGUgPSBhdG1fcHJvY19lbnRzOyBlLT5uYW1lOyBlKyspIHsKKwkJaWYgKGUtPmRpcmVudCkgCisJCQlyZW1vdmVfcHJvY19lbnRyeShlLT5uYW1lLCBhdG1fcHJvY19yb290KTsKKwl9CisJcmVtb3ZlX3Byb2NfZW50cnkoIm5ldC9hdG0iLCBOVUxMKTsKK30KKworaW50IF9faW5pdCBhdG1fcHJvY19pbml0KHZvaWQpCit7CisJc3RhdGljIHN0cnVjdCBhdG1fcHJvY19lbnRyeSAqZTsKKwlpbnQgcmV0OworCisJYXRtX3Byb2Nfcm9vdCA9IHByb2NfbWtkaXIoIm5ldC9hdG0iLE5VTEwpOworCWlmICghYXRtX3Byb2Nfcm9vdCkKKwkJZ290byBlcnJfb3V0OworCWZvciAoZSA9IGF0bV9wcm9jX2VudHM7IGUtPm5hbWU7IGUrKykgeworCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRpcmVudDsKKworCQlkaXJlbnQgPSBjcmVhdGVfcHJvY19lbnRyeShlLT5uYW1lLCBTX0lSVUdPLCBhdG1fcHJvY19yb290KTsKKwkJaWYgKCFkaXJlbnQpCisJCQlnb3RvIGVycl9vdXRfcmVtb3ZlOworCQlkaXJlbnQtPnByb2NfZm9wcyA9IGUtPnByb2NfZm9wczsKKwkJZGlyZW50LT5vd25lciA9IFRISVNfTU9EVUxFOworCQllLT5kaXJlbnQgPSBkaXJlbnQ7CisJfQorCXJldCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldDsKKworZXJyX291dF9yZW1vdmU6CisJYXRtX3Byb2NfZGlyc19yZW1vdmUoKTsKK2Vycl9vdXQ6CisJcmV0ID0gLUVOT01FTTsKKwlnb3RvIG91dDsKK30KKwordm9pZCBfX2V4aXQgYXRtX3Byb2NfZXhpdCh2b2lkKQoreworCWF0bV9wcm9jX2RpcnNfcmVtb3ZlKCk7Cit9CmRpZmYgLS1naXQgYS9uZXQvYXRtL3Byb3RvY29scy5oIGIvbmV0L2F0bS9wcm90b2NvbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2RmYzg1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2F0bS9wcm90b2NvbHMuaApAQCAtMCwwICsxLDEzIEBACisvKiBuZXQvYXRtL3Byb3RvY29scy5oIC0gQVRNIHByb3RvY29sIGhhbmRsZXIgZW50cnkgcG9pbnRzICovCisKKy8qIFdyaXR0ZW4gMTk5NS0xOTk3IGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgRVBGTCBMUkMgKi8KKworCisjaWZuZGVmIE5FVF9BVE1fUFJPVE9DT0xTX0gKKyNkZWZpbmUgTkVUX0FUTV9QUk9UT0NPTFNfSAorCitpbnQgYXRtX2luaXRfYWFsMChzdHJ1Y3QgYXRtX3ZjYyAqdmNjKTsJLyogInJhdyIgQUFMMCAqLworaW50IGF0bV9pbml0X2FhbDM0KHN0cnVjdCBhdG1fdmNjICp2Y2MpOy8qICJyYXciIEFBTDMvNCB0cmFuc3BvcnQgKi8KK2ludCBhdG1faW5pdF9hYWw1KHN0cnVjdCBhdG1fdmNjICp2Y2MpOwkvKiAicmF3IiBBQUw1IHRyYW5zcG9ydCAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9hdG0vcHZjLmMgYi9uZXQvYXRtL3B2Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ODRhOTIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYXRtL3B2Yy5jCkBAIC0wLDAgKzEsMTU1IEBACisvKiBuZXQvYXRtL3B2Yy5jIC0gQVRNIFBWQyBzb2NrZXRzICovCisKKy8qIFdyaXR0ZW4gMTk5NS0yMDAwIGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgRVBGTCBMUkMvSUNBICovCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgkJLyogc3RydWN0IHNvY2tldCwgc3RydWN0IHByb3RvX29wcyAqLworI2luY2x1ZGUgPGxpbnV4L2F0bS5oPgkJLyogQVRNIHN0dWZmICovCisjaW5jbHVkZSA8bGludXgvYXRtZGV2Lmg+CS8qIEFUTSBkZXZpY2VzICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4JLyogZXJyb3IgY29kZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4JLyogcHJpbnRrICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CQkvKiBmb3Igc29ja19ub18qICovCisKKyNpbmNsdWRlICJyZXNvdXJjZXMuaCIJCS8qIGRldnMgYW5kIHZjY3MgKi8KKyNpbmNsdWRlICJjb21tb24uaCIJCS8qIGNvbW1vbiBmb3IgUFZDcyBhbmQgU1ZDcyAqLworCisKK3N0YXRpYyBpbnQgcHZjX3NodXRkb3duKHN0cnVjdCBzb2NrZXQgKnNvY2ssaW50IGhvdykKK3sKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHB2Y19iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssc3RydWN0IHNvY2thZGRyICpzb2NrYWRkciwKKyAgICBpbnQgc29ja2FkZHJfbGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBzb2NrYWRkcl9hdG1wdmMgKmFkZHI7CisJc3RydWN0IGF0bV92Y2MgKnZjYzsKKwlpbnQgZXJyb3I7CisKKwlpZiAoc29ja2FkZHJfbGVuICE9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfYXRtcHZjKSkgcmV0dXJuIC1FSU5WQUw7CisJYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfYXRtcHZjICopIHNvY2thZGRyOworCWlmIChhZGRyLT5zYXBfZmFtaWx5ICE9IEFGX0FUTVBWQykgcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisJbG9ja19zb2NrKHNrKTsKKwl2Y2MgPSBBVE1fU0Qoc29jayk7CisJaWYgKCF0ZXN0X2JpdChBVE1fVkZfSEFTUU9TLCAmdmNjLT5mbGFncykpIHsKKwkJZXJyb3IgPSAtRUJBREZEOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHRlc3RfYml0KEFUTV9WRl9QQVJUSUFMLCZ2Y2MtPmZsYWdzKSkgeworCQlpZiAodmNjLT52cGkgIT0gQVRNX1ZQSV9VTlNQRUMpIGFkZHItPnNhcF9hZGRyLnZwaSA9IHZjYy0+dnBpOworCQlpZiAodmNjLT52Y2kgIT0gQVRNX1ZDSV9VTlNQRUMpIGFkZHItPnNhcF9hZGRyLnZjaSA9IHZjYy0+dmNpOworCX0KKwllcnJvciA9IHZjY19jb25uZWN0KHNvY2ssIGFkZHItPnNhcF9hZGRyLml0ZiwgYWRkci0+c2FwX2FkZHIudnBpLAorCQkJICAgIGFkZHItPnNhcF9hZGRyLnZjaSk7CitvdXQ6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworc3RhdGljIGludCBwdmNfY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLHN0cnVjdCBzb2NrYWRkciAqc29ja2FkZHIsCisgICAgaW50IHNvY2thZGRyX2xlbixpbnQgZmxhZ3MpCit7CisJcmV0dXJuIHB2Y19iaW5kKHNvY2ssc29ja2FkZHIsc29ja2FkZHJfbGVuKTsKK30KKworc3RhdGljIGludCBwdmNfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnJvcjsKKworCWxvY2tfc29jayhzayk7CisJZXJyb3IgPSB2Y2Nfc2V0c29ja29wdChzb2NrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOworCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycm9yOworfQorCisKK3N0YXRpYyBpbnQgcHZjX2dldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJICAgICAgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlpbnQgZXJyb3I7CisKKwlsb2NrX3NvY2soc2spOworCWVycm9yID0gdmNjX2dldHNvY2tvcHQoc29jaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnJvcjsKK30KKworCitzdGF0aWMgaW50IHB2Y19nZXRuYW1lKHN0cnVjdCBzb2NrZXQgKnNvY2ssc3RydWN0IHNvY2thZGRyICpzb2NrYWRkciwKKyAgICBpbnQgKnNvY2thZGRyX2xlbixpbnQgcGVlcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfYXRtcHZjICphZGRyOworCXN0cnVjdCBhdG1fdmNjICp2Y2MgPSBBVE1fU0Qoc29jayk7CisKKwlpZiAoIXZjYy0+ZGV2IHx8ICF0ZXN0X2JpdChBVE1fVkZfQUREUiwmdmNjLT5mbGFncykpIHJldHVybiAtRU5PVENPTk47CisgICAgICAgICpzb2NrYWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2F0bXB2Yyk7CisJYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfYXRtcHZjICopIHNvY2thZGRyOworCWFkZHItPnNhcF9mYW1pbHkgPSBBRl9BVE1QVkM7CisJYWRkci0+c2FwX2FkZHIuaXRmID0gdmNjLT5kZXYtPm51bWJlcjsKKwlhZGRyLT5zYXBfYWRkci52cGkgPSB2Y2MtPnZwaTsKKwlhZGRyLT5zYXBfYWRkci52Y2kgPSB2Y2MtPnZjaTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBwdmNfcHJvdG9fb3BzID0geworCS5mYW1pbHkgPQlQRl9BVE1QVkMsCisJLm93bmVyID0JVEhJU19NT0RVTEUsCisKKwkucmVsZWFzZSA9CXZjY19yZWxlYXNlLAorCS5iaW5kID0JCXB2Y19iaW5kLAorCS5jb25uZWN0ID0JcHZjX2Nvbm5lY3QsCisJLnNvY2tldHBhaXIgPQlzb2NrX25vX3NvY2tldHBhaXIsCisJLmFjY2VwdCA9CXNvY2tfbm9fYWNjZXB0LAorCS5nZXRuYW1lID0JcHZjX2dldG5hbWUsCisJLnBvbGwgPQkJdmNjX3BvbGwsCisJLmlvY3RsID0JdmNjX2lvY3RsLAorCS5saXN0ZW4gPQlzb2NrX25vX2xpc3RlbiwKKwkuc2h1dGRvd24gPQlwdmNfc2h1dGRvd24sCisJLnNldHNvY2tvcHQgPQlwdmNfc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdCA9CXB2Y19nZXRzb2Nrb3B0LAorCS5zZW5kbXNnID0JdmNjX3NlbmRtc2csCisJLnJlY3Ztc2cgPQl2Y2NfcmVjdm1zZywKKwkubW1hcCA9CQlzb2NrX25vX21tYXAsCisJLnNlbmRwYWdlID0Jc29ja19ub19zZW5kcGFnZSwKK307CisKKworc3RhdGljIGludCBwdmNfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssaW50IHByb3RvY29sKQoreworCXNvY2stPm9wcyA9ICZwdmNfcHJvdG9fb3BzOworCXJldHVybiB2Y2NfY3JlYXRlKHNvY2ssIHByb3RvY29sLCBQRl9BVE1QVkMpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSBwdmNfZmFtaWx5X29wcyA9IHsKKwkuZmFtaWx5ID0gUEZfQVRNUFZDLAorCS5jcmVhdGUgPSBwdmNfY3JlYXRlLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKKworCisvKgorICoJSW5pdGlhbGl6ZSB0aGUgQVRNIFBWQyBwcm90b2NvbCBmYW1pbHkKKyAqLworCisKK2ludCBfX2luaXQgYXRtcHZjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc29ja19yZWdpc3RlcigmcHZjX2ZhbWlseV9vcHMpOworfQorCit2b2lkIGF0bXB2Y19leGl0KHZvaWQpCit7CisJc29ja191bnJlZ2lzdGVyKFBGX0FUTVBWQyk7Cit9CmRpZmYgLS1naXQgYS9uZXQvYXRtL3Jhdy5jIGIvbmV0L2F0bS9yYXcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTA0NjZlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2F0bS9yYXcuYwpAQCAtMCwwICsxLDk4IEBACisvKiBuZXQvYXRtL3Jhdy5jIC0gUmF3IEFBTDAgYW5kIEFBTDUgdHJhbnNwb3J0cyAqLworCisvKiBXcml0dGVuIDE5OTUtMjAwMCBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIEVQRkwgTFJDL0lDQSAqLworCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJwcm90b2NvbHMuaCIKKworCisjaWYgMAorI2RlZmluZSBEUFJJTlRLKGZvcm1hdCxhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQsIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgRFBSSU5USyhmb3JtYXQsYXJncy4uLikKKyNlbmRpZgorCisKKy8qCisgKiBTS0IgPT0gTlVMTCBpbmRpY2F0ZXMgdGhhdCB0aGUgbGluayBpcyBiZWluZyBjbG9zZWQKKyAqLworCitzdGF0aWMgdm9pZCBhdG1fcHVzaF9yYXcoc3RydWN0IGF0bV92Y2MgKnZjYyxzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmIChza2IpIHsKKwkJc3RydWN0IHNvY2sgKnNrID0gc2tfYXRtKHZjYyk7CisKKwkJc2tiX3F1ZXVlX3RhaWwoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpOworCQlzay0+c2tfZGF0YV9yZWFkeShzaywgc2tiLT5sZW4pOworCX0KK30KKworCitzdGF0aWMgdm9pZCBhdG1fcG9wX3JhdyhzdHJ1Y3QgYXRtX3ZjYyAqdmNjLHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc2tfYXRtKHZjYyk7CisKKwlEUFJJTlRLKCJBUG9wUiAoJWQpICVkIC09ICVkXG4iLCB2Y2MtPnZjaSwgc2stPnNrX3dtZW1fYWxsb2MsCisJCXNrYi0+dHJ1ZXNpemUpOworCWF0b21pY19zdWIoc2tiLT50cnVlc2l6ZSwgJnNrLT5za193bWVtX2FsbG9jKTsKKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCXNrLT5za193cml0ZV9zcGFjZShzayk7Cit9CisKKworc3RhdGljIGludCBhdG1fc2VuZF9hYWwwKHN0cnVjdCBhdG1fdmNjICp2Y2Msc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKgorCSAqIE5vdGUgdGhhdCBpZiB2cGkvdmNpIGFyZSBfQU5ZIG9yIF9VTlNQRUMgdGhlIGJlbG93IHdpbGwKKwkgKiBzdGlsbCB3b3JrCisJICovCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pICYmCisgICAgICAgICAgICAoKCh1MzIgKikgc2tiLT5kYXRhKVswXSAmIChBVE1fSERSX1ZQSV9NQVNLIHwgQVRNX0hEUl9WQ0lfTUFTSykpICE9CisgICAgICAgICAgICAoKHZjYy0+dnBpIDw8IEFUTV9IRFJfVlBJX1NISUZUKSB8ICh2Y2MtPnZjaSA8PCBBVE1fSERSX1ZDSV9TSElGVCkpKQorCSAgICB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisgICAgICAgIH0KKwlyZXR1cm4gdmNjLT5kZXYtPm9wcy0+c2VuZCh2Y2Msc2tiKTsKK30KKworCitpbnQgYXRtX2luaXRfYWFsMChzdHJ1Y3QgYXRtX3ZjYyAqdmNjKQoreworCXZjYy0+cHVzaCA9IGF0bV9wdXNoX3JhdzsKKwl2Y2MtPnBvcCA9IGF0bV9wb3BfcmF3OworCXZjYy0+cHVzaF9vYW0gPSBOVUxMOworCXZjYy0+c2VuZCA9IGF0bV9zZW5kX2FhbDA7CisJcmV0dXJuIDA7Cit9CisKKworaW50IGF0bV9pbml0X2FhbDM0KHN0cnVjdCBhdG1fdmNjICp2Y2MpCit7CisJdmNjLT5wdXNoID0gYXRtX3B1c2hfcmF3OworCXZjYy0+cG9wID0gYXRtX3BvcF9yYXc7CisJdmNjLT5wdXNoX29hbSA9IE5VTEw7CisJdmNjLT5zZW5kID0gdmNjLT5kZXYtPm9wcy0+c2VuZDsKKwlyZXR1cm4gMDsKK30KKworCitpbnQgYXRtX2luaXRfYWFsNShzdHJ1Y3QgYXRtX3ZjYyAqdmNjKQoreworCXZjYy0+cHVzaCA9IGF0bV9wdXNoX3JhdzsKKwl2Y2MtPnBvcCA9IGF0bV9wb3BfcmF3OworCXZjYy0+cHVzaF9vYW0gPSBOVUxMOworCXZjYy0+c2VuZCA9IHZjYy0+ZGV2LT5vcHMtPnNlbmQ7CisJcmV0dXJuIDA7Cit9CisKKworRVhQT1JUX1NZTUJPTChhdG1faW5pdF9hYWw1KTsKZGlmZiAtLWdpdCBhL25ldC9hdG0vcmVzb3VyY2VzLmMgYi9uZXQvYXRtL3Jlc291cmNlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZjE2ODUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYXRtL3Jlc291cmNlcy5jCkBAIC0wLDAgKzEsNDMyIEBACisvKiBuZXQvYXRtL3Jlc291cmNlcy5jIC0gU3RhdGljYWxseSBhbGxvY2F0ZWQgcmVzb3VyY2VzICovCisKKy8qIFdyaXR0ZW4gMTk5NS0yMDAwIGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgRVBGTCBMUkMvSUNBICovCisKKy8qIEZpeGVzCisgKiBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAqIDIwMDIvMDEgLSBkb24ndCBmcmVlIHRoZSB3aG9sZSBzdHJ1Y3Qgc29jayBvbiBzay0+ZGVzdHJ1Y3QgdGltZSwKKyAqIAkgICAgIHVzZSB0aGUgZGVmYXVsdCBkZXN0cnVjdCBmdW5jdGlvbiBpbml0aWFsaXplZCBieSBzb2NrX2luaXRfZGF0YSAqLworCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+IC8qIGZvciBiYXJyaWVyICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgkgLyogZm9yIHN0cnVjdCBzb2NrICovCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJyZXNvdXJjZXMuaCIKKyNpbmNsdWRlICJhZGRyLmgiCisKKworTElTVF9IRUFEKGF0bV9kZXZzKTsKK0RFRklORV9TUElOTE9DSyhhdG1fZGV2X2xvY2spOworCitzdGF0aWMgc3RydWN0IGF0bV9kZXYgKl9fYWxsb2NfYXRtX2Rldihjb25zdCBjaGFyICp0eXBlKQoreworCXN0cnVjdCBhdG1fZGV2ICpkZXY7CisKKwlkZXYgPSBrbWFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCW1lbXNldChkZXYsIDAsIHNpemVvZigqZGV2KSk7CisJZGV2LT50eXBlID0gdHlwZTsKKwlkZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX1VOS05PV047CisJZGV2LT5saW5rX3JhdGUgPSBBVE1fT0MzX1BDUjsKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5sb2NhbCk7CisKKwlyZXR1cm4gZGV2OworfQorCitzdGF0aWMgdm9pZCBfX2ZyZWVfYXRtX2RldihzdHJ1Y3QgYXRtX2RldiAqZGV2KQoreworCWtmcmVlKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXRtX2RldiAqX19hdG1fZGV2X2xvb2t1cChpbnQgbnVtYmVyKQoreworCXN0cnVjdCBhdG1fZGV2ICpkZXY7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworCWxpc3RfZm9yX2VhY2gocCwgJmF0bV9kZXZzKSB7CisJCWRldiA9IGxpc3RfZW50cnkocCwgc3RydWN0IGF0bV9kZXYsIGRldl9saXN0KTsKKwkJaWYgKChkZXYtPm9wcykgJiYgKGRldi0+bnVtYmVyID09IG51bWJlcikpIHsKKwkJCWF0bV9kZXZfaG9sZChkZXYpOworCQkJcmV0dXJuIGRldjsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGF0bV9kZXYgKmF0bV9kZXZfbG9va3VwKGludCBudW1iZXIpCit7CisJc3RydWN0IGF0bV9kZXYgKmRldjsKKworCXNwaW5fbG9jaygmYXRtX2Rldl9sb2NrKTsKKwlkZXYgPSBfX2F0bV9kZXZfbG9va3VwKG51bWJlcik7CisJc3Bpbl91bmxvY2soJmF0bV9kZXZfbG9jayk7CisJcmV0dXJuIGRldjsKK30KKworc3RydWN0IGF0bV9kZXYgKmF0bV9kZXZfcmVnaXN0ZXIoY29uc3QgY2hhciAqdHlwZSwgY29uc3Qgc3RydWN0IGF0bWRldl9vcHMgKm9wcywKKwkJCQkgaW50IG51bWJlciwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJc3RydWN0IGF0bV9kZXYgKmRldiwgKmludXNlOworCisJZGV2ID0gX19hbGxvY19hdG1fZGV2KHR5cGUpOworCWlmICghZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXRtX2Rldl9yZWdpc3Rlcjogbm8gc3BhY2UgZm9yIGRldiAlc1xuIiwKKwkJICAgIHR5cGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc3Bpbl9sb2NrKCZhdG1fZGV2X2xvY2spOworCWlmIChudW1iZXIgIT0gLTEpIHsKKwkJaWYgKChpbnVzZSA9IF9fYXRtX2Rldl9sb29rdXAobnVtYmVyKSkpIHsKKwkJCWF0bV9kZXZfcHV0KGludXNlKTsKKwkJCXNwaW5fdW5sb2NrKCZhdG1fZGV2X2xvY2spOworCQkJX19mcmVlX2F0bV9kZXYoZGV2KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWRldi0+bnVtYmVyID0gbnVtYmVyOworCX0gZWxzZSB7CisJCWRldi0+bnVtYmVyID0gMDsKKwkJd2hpbGUgKChpbnVzZSA9IF9fYXRtX2Rldl9sb29rdXAoZGV2LT5udW1iZXIpKSkgeworCQkJYXRtX2Rldl9wdXQoaW51c2UpOworCQkJZGV2LT5udW1iZXIrKzsKKwkJfQorCX0KKworCWRldi0+b3BzID0gb3BzOworCWlmIChmbGFncykKKwkJZGV2LT5mbGFncyA9ICpmbGFnczsKKwllbHNlCisJCW1lbXNldCgmZGV2LT5mbGFncywgMCwgc2l6ZW9mKGRldi0+ZmxhZ3MpKTsKKwltZW1zZXQoJmRldi0+c3RhdHMsIDAsIHNpemVvZihkZXYtPnN0YXRzKSk7CisJYXRvbWljX3NldCgmZGV2LT5yZWZjbnQsIDEpOworCWxpc3RfYWRkX3RhaWwoJmRldi0+ZGV2X2xpc3QsICZhdG1fZGV2cyk7CisJc3Bpbl91bmxvY2soJmF0bV9kZXZfbG9jayk7CisKKwlpZiAoYXRtX3Byb2NfZGV2X3JlZ2lzdGVyKGRldikgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXRtX2Rldl9yZWdpc3RlcjogIgorCQkgICAgICAgImF0bV9wcm9jX2Rldl9yZWdpc3RlciBmYWlsZWQgZm9yIGRldiAlc1xuIiwKKwkJICAgICAgIHR5cGUpOworCQlzcGluX2xvY2soJmF0bV9kZXZfbG9jayk7CisJCWxpc3RfZGVsKCZkZXYtPmRldl9saXN0KTsKKwkJc3Bpbl91bmxvY2soJmF0bV9kZXZfbG9jayk7CisJCV9fZnJlZV9hdG1fZGV2KGRldik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBkZXY7Cit9CisKKwordm9pZCBhdG1fZGV2X2RlcmVnaXN0ZXIoc3RydWN0IGF0bV9kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIHdhcm5pbmdfdGltZTsKKworCWF0bV9wcm9jX2Rldl9kZXJlZ2lzdGVyKGRldik7CisKKwlzcGluX2xvY2soJmF0bV9kZXZfbG9jayk7CisJbGlzdF9kZWwoJmRldi0+ZGV2X2xpc3QpOworCXNwaW5fdW5sb2NrKCZhdG1fZGV2X2xvY2spOworCisgICAgICAgIHdhcm5pbmdfdGltZSA9IGppZmZpZXM7CisgICAgICAgIHdoaWxlIChhdG9taWNfcmVhZCgmZGV2LT5yZWZjbnQpICE9IDEpIHsKKyAgICAgICAgICAgICAgICBtc2xlZXAoMjUwKTsKKyAgICAgICAgICAgICAgICBpZiAoKGppZmZpZXMgLSB3YXJuaW5nX3RpbWUpID4gMTAgKiBIWikgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRU1FUkcgImF0bV9kZXZfZGVyZWdpc3Rlcjogd2FpdGluZyBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXYgJWQgdG8gYmVjb21lIGZyZWUuIFVzYWdlIGNvdW50ID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5udW1iZXIsIGF0b21pY19yZWFkKCZkZXYtPnJlZmNudCkpOworICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ190aW1lID0gamlmZmllczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworCV9fZnJlZV9hdG1fZGV2KGRldik7Cit9CisKK3ZvaWQgc2h1dGRvd25fYXRtX2RldihzdHJ1Y3QgYXRtX2RldiAqZGV2KQoreworCWlmIChhdG9taWNfcmVhZCgmZGV2LT5yZWZjbnQpID4gMSkgeworCQlzZXRfYml0KEFUTV9ERl9DTE9TRSwgJmRldi0+ZmxhZ3MpOworCQlyZXR1cm47CisJfQorCWlmIChkZXYtPm9wcy0+ZGV2X2Nsb3NlKQorCQlkZXYtPm9wcy0+ZGV2X2Nsb3NlKGRldik7CisJYXRtX2Rldl9kZXJlZ2lzdGVyKGRldik7Cit9CisKKworc3RhdGljIHZvaWQgY29weV9hYWxfc3RhdHMoc3RydWN0IGtfYXRtX2FhbF9zdGF0cyAqZnJvbSwKKyAgICBzdHJ1Y3QgYXRtX2FhbF9zdGF0cyAqdG8pCit7CisjZGVmaW5lIF9fSEFORExFX0lURU0oaSkgdG8tPmkgPSBhdG9taWNfcmVhZCgmZnJvbS0+aSkKKwlfX0FBTF9TVEFUX0lURU1TCisjdW5kZWYgX19IQU5ETEVfSVRFTQorfQorCisKK3N0YXRpYyB2b2lkIHN1YnRyYWN0X2FhbF9zdGF0cyhzdHJ1Y3Qga19hdG1fYWFsX3N0YXRzICpmcm9tLAorICAgIHN0cnVjdCBhdG1fYWFsX3N0YXRzICp0bykKK3sKKyNkZWZpbmUgX19IQU5ETEVfSVRFTShpKSBhdG9taWNfc3ViKHRvLT5pLCAmZnJvbS0+aSkKKwlfX0FBTF9TVEFUX0lURU1TCisjdW5kZWYgX19IQU5ETEVfSVRFTQorfQorCisKK3N0YXRpYyBpbnQgZmV0Y2hfc3RhdHMoc3RydWN0IGF0bV9kZXYgKmRldiwgc3RydWN0IGF0bV9kZXZfc3RhdHMgX191c2VyICphcmcsIGludCB6ZXJvKQoreworCXN0cnVjdCBhdG1fZGV2X3N0YXRzIHRtcDsKKwlpbnQgZXJyb3IgPSAwOworCisJY29weV9hYWxfc3RhdHMoJmRldi0+c3RhdHMuYWFsMCwgJnRtcC5hYWwwKTsKKwljb3B5X2FhbF9zdGF0cygmZGV2LT5zdGF0cy5hYWwzNCwgJnRtcC5hYWwzNCk7CisJY29weV9hYWxfc3RhdHMoJmRldi0+c3RhdHMuYWFsNSwgJnRtcC5hYWw1KTsKKwlpZiAoYXJnKQorCQllcnJvciA9IGNvcHlfdG9fdXNlcihhcmcsICZ0bXAsIHNpemVvZih0bXApKTsKKwlpZiAoemVybyAmJiAhZXJyb3IpIHsKKwkJc3VidHJhY3RfYWFsX3N0YXRzKCZkZXYtPnN0YXRzLmFhbDAsICZ0bXAuYWFsMCk7CisJCXN1YnRyYWN0X2FhbF9zdGF0cygmZGV2LT5zdGF0cy5hYWwzNCwgJnRtcC5hYWwzNCk7CisJCXN1YnRyYWN0X2FhbF9zdGF0cygmZGV2LT5zdGF0cy5hYWw1LCAmdG1wLmFhbDUpOworCX0KKwlyZXR1cm4gZXJyb3IgPyAtRUZBVUxUIDogMDsKK30KKworCitpbnQgYXRtX2Rldl9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXZvaWQgX191c2VyICpidWY7CisJaW50IGVycm9yLCBsZW4sIG51bWJlciwgc2l6ZSA9IDA7CisJc3RydWN0IGF0bV9kZXYgKmRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCWludCAqdG1wX2J1ZiwgKnRtcF9wOworCXN0cnVjdCBhdG1faW9idWYgX191c2VyICppb2J1ZiA9IGFyZzsKKwlzdHJ1Y3QgYXRtaWZfc2lvYyBfX3VzZXIgKnNpb2MgPSBhcmc7CisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBBVE1fR0VUTkFNRVM6CisJCQlpZiAoZ2V0X3VzZXIoYnVmLCAmaW9idWYtPmJ1ZmZlcikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoZ2V0X3VzZXIobGVuLCAmaW9idWYtPmxlbmd0aCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlzcGluX2xvY2soJmF0bV9kZXZfbG9jayk7CisJCQlsaXN0X2Zvcl9lYWNoKHAsICZhdG1fZGV2cykKKwkJCQlzaXplICs9IHNpemVvZihpbnQpOworCQkJaWYgKHNpemUgPiBsZW4pIHsKKwkJCQlzcGluX3VubG9jaygmYXRtX2Rldl9sb2NrKTsKKwkJCQlyZXR1cm4gLUUyQklHOworCQkJfQorCQkJdG1wX2J1ZiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7CisJCQlpZiAoIXRtcF9idWYpIHsKKwkJCQlzcGluX3VubG9jaygmYXRtX2Rldl9sb2NrKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCXRtcF9wID0gdG1wX2J1ZjsKKwkJCWxpc3RfZm9yX2VhY2gocCwgJmF0bV9kZXZzKSB7CisJCQkJZGV2ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgYXRtX2RldiwgZGV2X2xpc3QpOworCQkJCSp0bXBfcCsrID0gZGV2LT5udW1iZXI7CisJCQl9CisJCQlzcGluX3VubG9jaygmYXRtX2Rldl9sb2NrKTsKKwkJICAgICAgICBlcnJvciA9ICgoY29weV90b191c2VyKGJ1ZiwgdG1wX2J1Ziwgc2l6ZSkpIHx8CisJCQkJCXB1dF91c2VyKHNpemUsICZpb2J1Zi0+bGVuZ3RoKSkKKwkJCQkJCT8gLUVGQVVMVCA6IDA7CisJCQlrZnJlZSh0bXBfYnVmKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCWlmIChnZXRfdXNlcihidWYsICZzaW9jLT5hcmcpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoZ2V0X3VzZXIobGVuLCAmc2lvYy0+bGVuZ3RoKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGdldF91c2VyKG51bWJlciwgJnNpb2MtPm51bWJlcikpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCEoZGV2ID0gYXRtX2Rldl9sb29rdXAobnVtYmVyKSkpCisJCXJldHVybiAtRU5PREVWOworCQorCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgQVRNX0dFVFRZUEU6CisJCQlzaXplID0gc3RybGVuKGRldi0+dHlwZSkgKyAxOworCQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIGRldi0+dHlwZSwgc2l6ZSkpIHsKKwkJCQllcnJvciA9IC1FRkFVTFQ7CisJCQkJZ290byBkb25lOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQVRNX0dFVEVTSToKKwkJCXNpemUgPSBFU0lfTEVOOworCQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIGRldi0+ZXNpLCBzaXplKSkgeworCQkJCWVycm9yID0gLUVGQVVMVDsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBBVE1fU0VURVNJOgorCQkJeworCQkJCWludCBpOworCisJCQkJZm9yIChpID0gMDsgaSA8IEVTSV9MRU47IGkrKykKKwkJCQkJaWYgKGRldi0+ZXNpW2ldKSB7CisJCQkJCQllcnJvciA9IC1FRVhJU1Q7CisJCQkJCQlnb3RvIGRvbmU7CisJCQkJCX0KKwkJCX0KKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIEFUTV9TRVRFU0lGOgorCQkJeworCQkJCXVuc2lnbmVkIGNoYXIgZXNpW0VTSV9MRU5dOworCisJCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQkJCWVycm9yID0gLUVQRVJNOworCQkJCQlnb3RvIGRvbmU7CisJCQkJfQorCQkJCWlmIChjb3B5X2Zyb21fdXNlcihlc2ksIGJ1ZiwgRVNJX0xFTikpIHsKKwkJCQkJZXJyb3IgPSAtRUZBVUxUOworCQkJCQlnb3RvIGRvbmU7CisJCQkJfQorCQkJCW1lbWNweShkZXYtPmVzaSwgZXNpLCBFU0lfTEVOKTsKKwkJCQllcnJvciA9ICBFU0lfTEVOOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJY2FzZSBBVE1fR0VUU1RBVFo6CisJCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCQllcnJvciA9IC1FUEVSTTsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBBVE1fR0VUU1RBVDoKKwkJCXNpemUgPSBzaXplb2Yoc3RydWN0IGF0bV9kZXZfc3RhdHMpOworCQkJZXJyb3IgPSBmZXRjaF9zdGF0cyhkZXYsIGJ1ZiwgY21kID09IEFUTV9HRVRTVEFUWik7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBkb25lOworCQkJYnJlYWs7CisJCWNhc2UgQVRNX0dFVENJUkFOR0U6CisJCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdG1fY2lyYW5nZSk7CisJCQlpZiAoY29weV90b191c2VyKGJ1ZiwgJmRldi0+Y2lfcmFuZ2UsIHNpemUpKSB7CisJCQkJZXJyb3IgPSAtRUZBVUxUOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEFUTV9HRVRMSU5LUkFURToKKwkJCXNpemUgPSBzaXplb2YoaW50KTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmZGV2LT5saW5rX3JhdGUsIHNpemUpKSB7CisJCQkJZXJyb3IgPSAtRUZBVUxUOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEFUTV9SU1RBRERSOgorCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQkJZXJyb3IgPSAtRVBFUk07CisJCQkJZ290byBkb25lOworCQkJfQorCQkJYXRtX3Jlc2V0X2FkZHIoZGV2KTsKKwkJCWJyZWFrOworCQljYXNlIEFUTV9BRERBRERSOgorCQljYXNlIEFUTV9ERUxBRERSOgorCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQkJZXJyb3IgPSAtRVBFUk07CisJCQkJZ290byBkb25lOworCQkJfQorCQkJeworCQkJCXN0cnVjdCBzb2NrYWRkcl9hdG1zdmMgYWRkcjsKKworCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmYWRkciwgYnVmLCBzaXplb2YoYWRkcikpKSB7CisJCQkJCWVycm9yID0gLUVGQVVMVDsKKwkJCQkJZ290byBkb25lOworCQkJCX0KKwkJCQlpZiAoY21kID09IEFUTV9BRERBRERSKQorCQkJCQllcnJvciA9IGF0bV9hZGRfYWRkcihkZXYsICZhZGRyKTsKKwkJCQllbHNlCisJCQkJCWVycm9yID0gYXRtX2RlbF9hZGRyKGRldiwgJmFkZHIpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJY2FzZSBBVE1fR0VUQUREUjoKKwkJCWVycm9yID0gYXRtX2dldF9hZGRyKGRldiwgYnVmLCBsZW4pOworCQkJaWYgKGVycm9yIDwgMCkKKwkJCQlnb3RvIGRvbmU7CisJCQlzaXplID0gZXJyb3I7CisJCQkvKiBtYXkgcmV0dXJuIDAsIGJ1dCBsYXRlciBvbiBzaXplID09IDAgbWVhbnMgImRvbid0CisJCQkgICB3cml0ZSB0aGUgbGVuZ3RoIiAqLworCQkJZXJyb3IgPSBwdXRfdXNlcihzaXplLCAmc2lvYy0+bGVuZ3RoKQorCQkJCT8gLUVGQVVMVCA6IDA7CisJCQlnb3RvIGRvbmU7CisJCWNhc2UgQVRNX1NFVExPT1A6CisJCQlpZiAoX19BVE1fTE1fWFRSTVQoKGludCkgKHVuc2lnbmVkIGxvbmcpIGJ1ZikgJiYKKwkJCSAgICBfX0FUTV9MTV9YVExPQygoaW50KSAodW5zaWduZWQgbG9uZykgYnVmKSA+CisJCQkgICAgX19BVE1fTE1fWFRSTVQoKGludCkgKHVuc2lnbmVkIGxvbmcpIGJ1ZikpIHsKKwkJCQllcnJvciA9IC1FSU5WQUw7CisJCQkJZ290byBkb25lOworCQkJfQorCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgQVRNX1NFVENJUkFOR0U6CisJCWNhc2UgU09ORVRfR0VUU1RBVFo6CisJCWNhc2UgU09ORVRfU0VURElBRzoKKwkJY2FzZSBTT05FVF9DTFJESUFHOgorCQljYXNlIFNPTkVUX1NFVEZSQU1JTkc6CisJCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCQllcnJvciA9IC1FUEVSTTsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJZGVmYXVsdDoKKwkJCWlmICghZGV2LT5vcHMtPmlvY3RsKSB7CisJCQkJZXJyb3IgPSAtRUlOVkFMOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCXNpemUgPSBkZXYtPm9wcy0+aW9jdGwoZGV2LCBjbWQsIGJ1Zik7CisJCQlpZiAoc2l6ZSA8IDApIHsKKwkJCQllcnJvciA9IChzaXplID09IC1FTk9JT0NUTENNRCA/IC1FSU5WQUwgOiBzaXplKTsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJfQorCQorCWlmIChzaXplKQorCQllcnJvciA9IHB1dF91c2VyKHNpemUsICZzaW9jLT5sZW5ndGgpCisJCQk/IC1FRkFVTFQgOiAwOworCWVsc2UKKwkJZXJyb3IgPSAwOworZG9uZToKKwlhdG1fZGV2X3B1dChkZXYpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCAqZGV2X2dldF9pZHgobG9mZl90IGxlZnQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworCWxpc3RfZm9yX2VhY2gocCwgJmF0bV9kZXZzKSB7CisJCWlmICghLS1sZWZ0KQorCQkJYnJlYWs7CisJfQorCXJldHVybiAocCAhPSAmYXRtX2RldnMpID8gcCA6IE5VTEw7Cit9CisKK3ZvaWQgKmF0bV9kZXZfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKyAJc3Bpbl9sb2NrKCZhdG1fZGV2X2xvY2spOworCXJldHVybiAqcG9zID8gZGV2X2dldF9pZHgoKnBvcykgOiAodm9pZCAqKSAxOworfQorCit2b2lkIGF0bV9kZXZfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisgCXNwaW5fdW5sb2NrKCZhdG1fZGV2X2xvY2spOworfQorIAordm9pZCAqYXRtX2Rldl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJKysqcG9zOworCXYgPSAodiA9PSAodm9pZCAqKTEpID8gYXRtX2RldnMubmV4dCA6ICgoc3RydWN0IGxpc3RfaGVhZCAqKXYpLT5uZXh0OworCXJldHVybiAodiA9PSAmYXRtX2RldnMpID8gTlVMTCA6IHY7Cit9CisKKworRVhQT1JUX1NZTUJPTChhdG1fZGV2X3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woYXRtX2Rldl9kZXJlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woYXRtX2Rldl9sb29rdXApOworRVhQT1JUX1NZTUJPTChzaHV0ZG93bl9hdG1fZGV2KTsKZGlmZiAtLWdpdCBhL25ldC9hdG0vcmVzb3VyY2VzLmggYi9uZXQvYXRtL3Jlc291cmNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOTEwNjEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYXRtL3Jlc291cmNlcy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIG5ldC9hdG0vcmVzb3VyY2VzLmggLSBBVE0tcmVsYXRlZCByZXNvdXJjZXMgKi8KKworLyogV3JpdHRlbiAxOTk1LTE5OTggYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIExSQy9JQ0EgKi8KKworCisjaWZuZGVmIE5FVF9BVE1fUkVTT1VSQ0VTX0gKKyNkZWZpbmUgTkVUX0FUTV9SRVNPVVJDRVNfSAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvYXRtZGV2Lmg+CisKKworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgYXRtX2RldnM7CitleHRlcm4gc3BpbmxvY2tfdCBhdG1fZGV2X2xvY2s7CisKKworaW50IGF0bV9kZXZfaW9jdGwodW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZyk7CisKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisKK3ZvaWQgKmF0bV9kZXZfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcyk7Cit2b2lkIGF0bV9kZXZfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpOwordm9pZCAqYXRtX2Rldl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpOworCisKK2ludCBhdG1fcHJvY19kZXZfcmVnaXN0ZXIoc3RydWN0IGF0bV9kZXYgKmRldik7Cit2b2lkIGF0bV9wcm9jX2Rldl9kZXJlZ2lzdGVyKHN0cnVjdCBhdG1fZGV2ICpkZXYpOworCisjZWxzZQorCitzdGF0aWMgaW5saW5lIGludCBhdG1fcHJvY19kZXZfcmVnaXN0ZXIoc3RydWN0IGF0bV9kZXYgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0bV9wcm9jX2Rldl9kZXJlZ2lzdGVyKHN0cnVjdCBhdG1fZGV2ICpkZXYpCit7CisJLyogbm90aGluZyAqLworfQorCisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvYXRtL3NpZ25hbGluZy5jIGIvbmV0L2F0bS9zaWduYWxpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmY4MDMxCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2F0bS9zaWduYWxpbmcuYwpAQCAtMCwwICsxLDI4MCBAQAorLyogbmV0L2F0bS9zaWduYWxpbmcuYyAtIEFUTSBzaWduYWxpbmcgKi8KKworLyogV3JpdHRlbiAxOTk1LTIwMDAgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIExSQy9JQ0EgKi8KKworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4JLyogZXJyb3IgY29kZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4JLyogcHJpbnRrICovCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CS8qIGppZmZpZXMgYW5kIEhaICovCisjaW5jbHVkZSA8bGludXgvYXRtLmg+CQkvKiBBVE0gc3R1ZmYgKi8KKyNpbmNsdWRlIDxsaW51eC9hdG1zYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgInJlc291cmNlcy5oIgorI2luY2x1ZGUgInNpZ25hbGluZy5oIgorCisKKyN1bmRlZiBXQUlUX0ZPUl9ERU1PTgkJLyogI2RlZmluZSB0aGlzIGlmIHN5c3RlbSBjYWxscyBvbiBTVkMgc29ja2V0cworCQkJCSAgIHNob3VsZCBibG9jayB1bnRpbCB0aGUgZGVtb24gcnVucy4KKwkJCQkgICBEYW5nZXI6IG1heSBjYXVzZSBuYXN0eSBoYW5ncyBpZiB0aGUgZGVtb24KKwkJCQkgICBjcmFzaGVzLiAqLworCisjaWYgMAorI2RlZmluZSBEUFJJTlRLKGZvcm1hdCxhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQsIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgRFBSSU5USyhmb3JtYXQsYXJncy4uLikKKyNlbmRpZgorCisKK3N0cnVjdCBhdG1fdmNjICpzaWdkID0gTlVMTDsKKyNpZmRlZiBXQUlUX0ZPUl9ERU1PTgorc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHNpZ2Rfc2xlZXApOworI2VuZGlmCisKKworc3RhdGljIHZvaWQgc2lnZF9wdXRfc2tiKHN0cnVjdCBza19idWZmICpza2IpCit7CisjaWZkZWYgV0FJVF9GT1JfREVNT04KKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBzaWxlbmNlOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsY3VycmVudCk7CisKKwlhZGRfd2FpdF9xdWV1ZSgmc2lnZF9zbGVlcCwmd2FpdCk7CisJd2hpbGUgKCFzaWdkKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc2lsZW5jZSkgfHwgc2lsZW5jZSA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJhdG1zdmM6IHdhaXRpbmcgZm9yIHNpZ25hbGluZyBkZW1vbiAiCisJCQkgICAgIi4uLlxuIik7CisJCQlzaWxlbmNlID0gKGppZmZpZXMrMzAqSFopfDE7CisJCX0KKwkJc2NoZWR1bGUoKTsKKwl9CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnNpZ2Rfc2xlZXAsJndhaXQpOworI2Vsc2UKKwlpZiAoIXNpZ2QpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXRtc3ZjOiBubyBzaWduYWxpbmcgZGVtb25cbiIpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCWF0bV9mb3JjZV9jaGFyZ2Uoc2lnZCxza2ItPnRydWVzaXplKTsKKwlza2JfcXVldWVfdGFpbCgmc2tfYXRtKHNpZ2QpLT5za19yZWNlaXZlX3F1ZXVlLHNrYik7CisJc2tfYXRtKHNpZ2QpLT5za19kYXRhX3JlYWR5KHNrX2F0bShzaWdkKSwgc2tiLT5sZW4pOworfQorCisKK3N0YXRpYyB2b2lkIG1vZGlmeV9xb3Moc3RydWN0IGF0bV92Y2MgKnZjYyxzdHJ1Y3QgYXRtc3ZjX21zZyAqbXNnKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlpZiAodGVzdF9iaXQoQVRNX1ZGX1JFTEVBU0VELCZ2Y2MtPmZsYWdzKSB8fAorCSAgICAhdGVzdF9iaXQoQVRNX1ZGX1JFQURZLCZ2Y2MtPmZsYWdzKSkKKwkJcmV0dXJuOworCW1zZy0+dHlwZSA9IGFzX2Vycm9yOworCWlmICghdmNjLT5kZXYtPm9wcy0+Y2hhbmdlX3FvcykgbXNnLT5yZXBseSA9IC1FT1BOT1RTVVBQOworCWVsc2UgeworCQkvKiBzaG91bGQgbG9jayBWQ0MgKi8KKwkJbXNnLT5yZXBseSA9IHZjYy0+ZGV2LT5vcHMtPmNoYW5nZV9xb3ModmNjLCZtc2ctPnFvcywKKwkJICAgIG1zZy0+cmVwbHkpOworCQlpZiAoIW1zZy0+cmVwbHkpIG1zZy0+dHlwZSA9IGFzX29rYXk7CisJfQorCS8qCisJICogU2hvdWxkIHByb2JhYmx5IGp1c3QgdHVybiBhcm91bmQgdGhlIG9sZCBza2IuIEJ1dCB0aGUsIHRoZSBidWZmZXIKKwkgKiBzcGFjZSBhY2NvdW50aW5nIG5lZWRzIHRvIGZvbGxvdyB0aGUgY2hhbmdlIHRvby4gTWF5YmUgbGF0ZXIuCisJICovCisJd2hpbGUgKCEoc2tiID0gYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgYXRtc3ZjX21zZyksR0ZQX0tFUk5FTCkpKQorCQlzY2hlZHVsZSgpOworCSooc3RydWN0IGF0bXN2Y19tc2cgKikgc2tiX3B1dChza2Isc2l6ZW9mKHN0cnVjdCBhdG1zdmNfbXNnKSkgPSAqbXNnOworCXNpZ2RfcHV0X3NrYihza2IpOworfQorCisKK3N0YXRpYyBpbnQgc2lnZF9zZW5kKHN0cnVjdCBhdG1fdmNjICp2Y2Msc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgYXRtc3ZjX21zZyAqbXNnOworCXN0cnVjdCBhdG1fdmNjICpzZXNzaW9uX3ZjYzsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwltc2cgPSAoc3RydWN0IGF0bXN2Y19tc2cgKikgc2tiLT5kYXRhOworCWF0b21pY19zdWIoc2tiLT50cnVlc2l6ZSwgJnNrX2F0bSh2Y2MpLT5za193bWVtX2FsbG9jKTsKKwlEUFJJTlRLKCJzaWdkX3NlbmQgJWQgKDB4JWx4KVxuIiwoaW50KSBtc2ctPnR5cGUsCisJICAodW5zaWduZWQgbG9uZykgbXNnLT52Y2MpOworCXZjYyA9ICooc3RydWN0IGF0bV92Y2MgKiopICZtc2ctPnZjYzsKKwlzayA9IHNrX2F0bSh2Y2MpOworCisJc3dpdGNoIChtc2ctPnR5cGUpIHsKKwkJY2FzZSBhc19va2F5OgorCQkJc2stPnNrX2VyciA9IC1tc2ctPnJlcGx5OworCQkJY2xlYXJfYml0KEFUTV9WRl9XQUlUSU5HLCAmdmNjLT5mbGFncyk7CisJCQlpZiAoISp2Y2MtPmxvY2FsLnNhc19hZGRyLnBydiAmJgorCQkJICAgICEqdmNjLT5sb2NhbC5zYXNfYWRkci5wdWIpIHsKKwkJCQl2Y2MtPmxvY2FsLnNhc19mYW1pbHkgPSBBRl9BVE1TVkM7CisJCQkJbWVtY3B5KHZjYy0+bG9jYWwuc2FzX2FkZHIucHJ2LAorCQkJCSAgICBtc2ctPmxvY2FsLnNhc19hZGRyLnBydixBVE1fRVNBX0xFTik7CisJCQkJbWVtY3B5KHZjYy0+bG9jYWwuc2FzX2FkZHIucHViLAorCQkJCSAgICBtc2ctPmxvY2FsLnNhc19hZGRyLnB1YixBVE1fRTE2NF9MRU4rMSk7CisJCQl9CisJCQlzZXNzaW9uX3ZjYyA9IHZjYy0+c2Vzc2lvbiA/IHZjYy0+c2Vzc2lvbiA6IHZjYzsKKwkJCWlmIChzZXNzaW9uX3ZjYy0+dnBpIHx8IHNlc3Npb25fdmNjLT52Y2kpIGJyZWFrOworCQkJc2Vzc2lvbl92Y2MtPml0ZiA9IG1zZy0+cHZjLnNhcF9hZGRyLml0ZjsKKwkJCXNlc3Npb25fdmNjLT52cGkgPSBtc2ctPnB2Yy5zYXBfYWRkci52cGk7CisJCQlzZXNzaW9uX3ZjYy0+dmNpID0gbXNnLT5wdmMuc2FwX2FkZHIudmNpOworCQkJaWYgKHNlc3Npb25fdmNjLT52cGkgfHwgc2Vzc2lvbl92Y2MtPnZjaSkKKwkJCQlzZXNzaW9uX3ZjYy0+cW9zID0gbXNnLT5xb3M7CisJCQlicmVhazsKKwkJY2FzZSBhc19lcnJvcjoKKwkJCWNsZWFyX2JpdChBVE1fVkZfUkVHSVMsJnZjYy0+ZmxhZ3MpOworCQkJY2xlYXJfYml0KEFUTV9WRl9SRUFEWSwmdmNjLT5mbGFncyk7CisJCQlzay0+c2tfZXJyID0gLW1zZy0+cmVwbHk7CisJCQljbGVhcl9iaXQoQVRNX1ZGX1dBSVRJTkcsICZ2Y2MtPmZsYWdzKTsKKwkJCWJyZWFrOworCQljYXNlIGFzX2luZGljYXRlOgorCQkJdmNjID0gKihzdHJ1Y3QgYXRtX3ZjYyAqKikgJm1zZy0+bGlzdGVuX3ZjYzsKKwkJCURQUklOVEsoImFzX2luZGljYXRlISEhXG4iKTsKKwkJCWxvY2tfc29jayhzayk7CisJCQlpZiAoc2tfYWNjZXB0cV9pc19mdWxsKHNrKSkgeworCQkJCXNpZ2RfZW5xKE5VTEwsYXNfcmVqZWN0LHZjYyxOVUxMLE5VTEwpOworCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCQlnb3RvIGFzX2luZGljYXRlX2NvbXBsZXRlOworCQkJfQorCQkJc2stPnNrX2Fja19iYWNrbG9nKys7CisJCQlza2JfcXVldWVfdGFpbCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJCQlEUFJJTlRLKCJ3YWtpbmcgc2stPnNrX3NsZWVwIDB4JXBcbiIsIHNrLT5za19zbGVlcCk7CisJCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKK2FzX2luZGljYXRlX2NvbXBsZXRlOgorCQkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJCXJldHVybiAwOworCQljYXNlIGFzX2Nsb3NlOgorCQkJc2V0X2JpdChBVE1fVkZfUkVMRUFTRUQsJnZjYy0+ZmxhZ3MpOworCQkJdmNjX3JlbGVhc2VfYXN5bmModmNjLCBtc2ctPnJlcGx5KTsKKwkJCWdvdG8gb3V0OworCQljYXNlIGFzX21vZGlmeToKKwkJCW1vZGlmeV9xb3ModmNjLG1zZyk7CisJCQlicmVhazsKKwkJY2FzZSBhc19hZGRwYXJ0eToKKwkJY2FzZSBhc19kcm9wcGFydHk6CisJCQlzay0+c2tfZXJyX3NvZnQgPSBtc2ctPnJlcGx5OwkvKiA8IDAgZmFpbHVyZSwgb3RoZXJ3aXNlIGVwX3JlZiAqLworCQkJY2xlYXJfYml0KEFUTV9WRl9XQUlUSU5HLCAmdmNjLT5mbGFncyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0FMRVJUICJzaWdkX3NlbmQ6IGJhZCBtZXNzYWdlIHR5cGUgJWRcbiIsCisJCQkgICAgKGludCkgbXNnLT50eXBlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKK291dDoKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBzaWdkX2VucTIoc3RydWN0IGF0bV92Y2MgKnZjYyxlbnVtIGF0bXN2Y19tc2dfdHlwZSB0eXBlLAorICAgIHN0cnVjdCBhdG1fdmNjICpsaXN0ZW5fdmNjLGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9hdG1wdmMgKnB2YywKKyAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjICpzdmMsY29uc3Qgc3RydWN0IGF0bV9xb3MgKnFvcyxpbnQgcmVwbHkpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgYXRtc3ZjX21zZyAqbXNnOworCXN0YXRpYyB1bnNpZ25lZCBzZXNzaW9uID0gMDsKKworCURQUklOVEsoInNpZ2RfZW5xICVkICgweCVwKVxuIiwoaW50KSB0eXBlLHZjYyk7CisJd2hpbGUgKCEoc2tiID0gYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgYXRtc3ZjX21zZyksR0ZQX0tFUk5FTCkpKQorCQlzY2hlZHVsZSgpOworCW1zZyA9IChzdHJ1Y3QgYXRtc3ZjX21zZyAqKSBza2JfcHV0KHNrYixzaXplb2Yoc3RydWN0IGF0bXN2Y19tc2cpKTsKKwltZW1zZXQobXNnLDAsc2l6ZW9mKCptc2cpKTsKKwltc2ctPnR5cGUgPSB0eXBlOworCSooc3RydWN0IGF0bV92Y2MgKiopICZtc2ctPnZjYyA9IHZjYzsKKwkqKHN0cnVjdCBhdG1fdmNjICoqKSAmbXNnLT5saXN0ZW5fdmNjID0gbGlzdGVuX3ZjYzsKKwltc2ctPnJlcGx5ID0gcmVwbHk7CisJaWYgKHFvcykgbXNnLT5xb3MgPSAqcW9zOworCWlmICh2Y2MpIG1zZy0+c2FwID0gdmNjLT5zYXA7CisJaWYgKHN2YykgbXNnLT5zdmMgPSAqc3ZjOworCWlmICh2Y2MpIG1zZy0+bG9jYWwgPSB2Y2MtPmxvY2FsOworCWlmIChwdmMpIG1zZy0+cHZjID0gKnB2YzsKKwlpZiAodmNjKSB7CisJCWlmICh0eXBlID09IGFzX2Nvbm5lY3QgJiYgdGVzdF9iaXQoQVRNX1ZGX1NFU1NJT04sICZ2Y2MtPmZsYWdzKSkKKwkJCW1zZy0+c2Vzc2lvbiA9ICsrc2Vzc2lvbjsKKwkJCS8qIGV2ZXJ5IG5ldyBwbXAgY29ubmVjdCBnZXRzIHRoZSBuZXh0IHNlc3Npb24gbnVtYmVyICovCisJfQorCXNpZ2RfcHV0X3NrYihza2IpOworCWlmICh2Y2MpIHNldF9iaXQoQVRNX1ZGX1JFR0lTLCZ2Y2MtPmZsYWdzKTsKK30KKworCit2b2lkIHNpZ2RfZW5xKHN0cnVjdCBhdG1fdmNjICp2Y2MsZW51bSBhdG1zdmNfbXNnX3R5cGUgdHlwZSwKKyAgICBzdHJ1Y3QgYXRtX3ZjYyAqbGlzdGVuX3ZjYyxjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfYXRtcHZjICpwdmMsCisgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2F0bXN2YyAqc3ZjKQoreworCXNpZ2RfZW5xMih2Y2MsdHlwZSxsaXN0ZW5fdmNjLHB2YyxzdmMsdmNjID8gJnZjYy0+cW9zIDogTlVMTCwwKTsKKwkvKiBvdGhlciBJU1AgYXBwbGljYXRpb25zIG1heSB1c2UgInJlcGx5IiAqLworfQorCisKK3N0YXRpYyB2b2lkIHB1cmdlX3ZjYyhzdHJ1Y3QgYXRtX3ZjYyAqdmNjKQoreworCWlmIChza19hdG0odmNjKS0+c2tfZmFtaWx5ID09IFBGX0FUTVNWQyAmJgorCSAgICAhdGVzdF9iaXQoQVRNX1ZGX01FVEEsJnZjYy0+ZmxhZ3MpKSB7CisJCXNldF9iaXQoQVRNX1ZGX1JFTEVBU0VELCZ2Y2MtPmZsYWdzKTsKKwkJdmNjX3JlbGVhc2VfYXN5bmModmNjLCAtRVVOQVRDSCk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHNpZ2RfY2xvc2Uoc3RydWN0IGF0bV92Y2MgKnZjYykKK3sKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlzdHJ1Y3Qgc29jayAqczsKKwlpbnQgaTsKKworCURQUklOVEsoInNpZ2RfY2xvc2VcbiIpOworCXNpZ2QgPSBOVUxMOworCWlmIChza2JfcGVlaygmc2tfYXRtKHZjYyktPnNrX3JlY2VpdmVfcXVldWUpKQorCQlwcmludGsoS0VSTl9FUlIgInNpZ2RfY2xvc2U6IGNsb3Npbmcgd2l0aCByZXF1ZXN0cyBwZW5kaW5nXG4iKTsKKwlza2JfcXVldWVfcHVyZ2UoJnNrX2F0bSh2Y2MpLT5za19yZWNlaXZlX3F1ZXVlKTsKKworCXJlYWRfbG9jaygmdmNjX3NrbGlzdF9sb2NrKTsKKwlmb3IoaSA9IDA7IGkgPCBWQ0NfSFRBQkxFX1NJWkU7ICsraSkgeworCQlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCA9ICZ2Y2NfaGFzaFtpXTsKKworCQlza19mb3JfZWFjaChzLCBub2RlLCBoZWFkKSB7CisJCQlzdHJ1Y3QgYXRtX3ZjYyAqdmNjID0gYXRtX3NrKHMpOworCisJCQlpZiAodmNjLT5kZXYpCisJCQkJcHVyZ2VfdmNjKHZjYyk7CisJCX0KKwl9CisJcmVhZF91bmxvY2soJnZjY19za2xpc3RfbG9jayk7Cit9CisKKworc3RhdGljIHN0cnVjdCBhdG1kZXZfb3BzIHNpZ2RfZGV2X29wcyA9IHsKKwkuY2xvc2UgPSBzaWdkX2Nsb3NlLAorCS5zZW5kID0Jc2lnZF9zZW5kCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgYXRtX2RldiBzaWdkX2RldiA9IHsKKwkub3BzID0JCSZzaWdkX2Rldl9vcHMsCisJLnR5cGUgPQkJInNpZyIsCisJLm51bWJlciA9CTk5OSwKKwkubG9jayA9CQlTUElOX0xPQ0tfVU5MT0NLRUQKK307CisKKworaW50IHNpZ2RfYXR0YWNoKHN0cnVjdCBhdG1fdmNjICp2Y2MpCit7CisJaWYgKHNpZ2QpIHJldHVybiAtRUFERFJJTlVTRTsKKwlEUFJJTlRLKCJzaWdkX2F0dGFjaFxuIik7CisJc2lnZCA9IHZjYzsKKwl2Y2MtPmRldiA9ICZzaWdkX2RldjsKKwl2Y2NfaW5zZXJ0X3NvY2tldChza19hdG0odmNjKSk7CisJc2V0X2JpdChBVE1fVkZfTUVUQSwmdmNjLT5mbGFncyk7CisJc2V0X2JpdChBVE1fVkZfUkVBRFksJnZjYy0+ZmxhZ3MpOworI2lmZGVmIFdBSVRfRk9SX0RFTU9OCisJd2FrZV91cCgmc2lnZF9zbGVlcCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25ldC9hdG0vc2lnbmFsaW5nLmggYi9uZXQvYXRtL3NpZ25hbGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNGVhZDQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYXRtL3NpZ25hbGluZy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qIG5ldC9hdG0vc2lnbmFsaW5nLmggLSBBVE0gc2lnbmFsaW5nICovCisgCisvKiBXcml0dGVuIDE5OTUtMjAwMCBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIEVQRkwgTFJDL0lDQSAqLworIAorCisjaWZuZGVmIE5FVF9BVE1fU0lHTkFMSU5HX0gKKyNkZWZpbmUgTkVUX0FUTV9TSUdOQUxJTkdfSAorCisjaW5jbHVkZSA8bGludXgvYXRtLmg+CisjaW5jbHVkZSA8bGludXgvYXRtZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvYXRtc3ZjLmg+CisKKworZXh0ZXJuIHN0cnVjdCBhdG1fdmNjICpzaWdkOyAvKiBuZWVkZWQgaW4gc3ZjX3JlbGVhc2UgKi8KKworCisvKgorICogc2lnZF9lbnEgaXMgYSB3cmFwcGVyIGZvciBzaWdkX2VucTIsIGNvdmVyaW5nIHRoZSBtb3JlIGNvbW1vbiBjYXNlcywgYW5kCisgKiBhdm9pZGluZyBodWdlIGxpc3RzIG9mIG51bGwgdmFsdWVzLgorICovCisKK3ZvaWQgc2lnZF9lbnEyKHN0cnVjdCBhdG1fdmNjICp2Y2MsZW51bSBhdG1zdmNfbXNnX3R5cGUgdHlwZSwKKyAgICBzdHJ1Y3QgYXRtX3ZjYyAqbGlzdGVuX3ZjYyxjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfYXRtcHZjICpwdmMsCisgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2F0bXN2YyAqc3ZjLGNvbnN0IHN0cnVjdCBhdG1fcW9zICpxb3MsaW50IHJlcGx5KTsKK3ZvaWQgc2lnZF9lbnEoc3RydWN0IGF0bV92Y2MgKnZjYyxlbnVtIGF0bXN2Y19tc2dfdHlwZSB0eXBlLAorICAgIHN0cnVjdCBhdG1fdmNjICpsaXN0ZW5fdmNjLGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9hdG1wdmMgKnB2YywKKyAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjICpzdmMpOworaW50IHNpZ2RfYXR0YWNoKHN0cnVjdCBhdG1fdmNjICp2Y2MpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9hdG0vc3ZjLmMgYi9uZXQvYXRtL3N2Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZjUzNzQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYXRtL3N2Yy5jCkBAIC0wLDAgKzEsNjc0IEBACisvKiBuZXQvYXRtL3N2Yy5jIC0gQVRNIFNWQyBzb2NrZXRzICovCisKKy8qIFdyaXR0ZW4gMTk5NS0yMDAwIGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgRVBGTCBMUkMvSUNBICovCisKKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgkJLyogc3RydWN0IHNvY2tldCwgc3RydWN0IHByb3RvX29wcyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CS8qIGVycm9yIGNvZGVzICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIHByaW50ayAqLworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgkvKiBqaWZmaWVzIGFuZCBIWiAqLworI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CS8qIE9fTk9OQkxPQ0sgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYXRtLmg+CQkvKiBBVE0gc3R1ZmYgKi8KKyNpbmNsdWRlIDxsaW51eC9hdG1zYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgkJLyogZm9yIHNvY2tfbm9fKiAqLworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJyZXNvdXJjZXMuaCIKKyNpbmNsdWRlICJjb21tb24uaCIJCS8qIGNvbW1vbiBmb3IgUFZDcyBhbmQgU1ZDcyAqLworI2luY2x1ZGUgInNpZ25hbGluZy5oIgorI2luY2x1ZGUgImFkZHIuaCIKKworCisjaWYgMAorI2RlZmluZSBEUFJJTlRLKGZvcm1hdCxhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQsIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgRFBSSU5USyhmb3JtYXQsYXJncy4uLikKKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgc3ZjX2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLGludCBwcm90b2NvbCk7CisKKworLyoKKyAqIE5vdGU6IHNpbmNlIGFsbCB0aGlzIGlzIHN0aWxsIG5pY2VseSBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgc2lnbmFsaW5nIGRlbW9uLAorICogICAgICAgdGhlcmUncyBubyBuZWVkIHRvIHByb3RlY3Qgc2xlZXAgbG9vcHMgd2l0aCBjbGlzLiBJZiBzaWduYWxpbmcgaXMKKyAqICAgICAgIG1vdmVkIGludG8gdGhlIGtlcm5lbCwgdGhhdCB3b3VsZCBjaGFuZ2UuCisgKi8KKworCitzdGF0aWMgaW50IHN2Y19zaHV0ZG93bihzdHJ1Y3Qgc29ja2V0ICpzb2NrLGludCBob3cpCit7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgc3ZjX2Rpc2Nvbm5lY3Qoc3RydWN0IGF0bV92Y2MgKnZjYykKK3sKKwlERUZJTkVfV0FJVCh3YWl0KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBzb2NrICpzayA9IHNrX2F0bSh2Y2MpOworCisJRFBSSU5USygic3ZjX2Rpc2Nvbm5lY3QgJXBcbiIsdmNjKTsKKwlpZiAodGVzdF9iaXQoQVRNX1ZGX1JFR0lTLCZ2Y2MtPmZsYWdzKSkgeworCQlwcmVwYXJlX3RvX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzaWdkX2VucSh2Y2MsYXNfY2xvc2UsTlVMTCxOVUxMLE5VTEwpOworCQl3aGlsZSAoIXRlc3RfYml0KEFUTV9WRl9SRUxFQVNFRCwmdmNjLT5mbGFncykgJiYgc2lnZCkgeworCQkJc2NoZWR1bGUoKTsKKwkJCXByZXBhcmVfdG9fd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCX0KKwkJZmluaXNoX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJfQorCS8qIGJld2FyZSAtIHNvY2tldCBpcyBzdGlsbCBpbiB1c2UgYnkgYXRtc2lnZCB1bnRpbCB0aGUgbGFzdAorCSAgIGFzX2luZGljYXRlIGhhcyBiZWVuIGFuc3dlcmVkICovCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKSAhPSBOVUxMKSB7CisJCWF0bV9yZXR1cm4odmNjLCBza2ItPnRydWVzaXplKTsKKwkJRFBSSU5USygiTElTVEVOIFJFTFxuIik7CisJCXNpZ2RfZW5xMihOVUxMLGFzX3JlamVjdCx2Y2MsTlVMTCxOVUxMLCZ2Y2MtPnFvcywwKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCX0KKwljbGVhcl9iaXQoQVRNX1ZGX1JFR0lTLCAmdmNjLT5mbGFncyk7CisJLyogLi4uIG1heSByZXRyeSBsYXRlciAqLworfQorCisKK3N0YXRpYyBpbnQgc3ZjX3JlbGVhc2Uoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgYXRtX3ZjYyAqdmNjOworCisJaWYgKHNrKSAgeworCQl2Y2MgPSBBVE1fU0Qoc29jayk7CisJCURQUklOVEsoInN2Y19yZWxlYXNlICVwXG4iLCB2Y2MpOworCQljbGVhcl9iaXQoQVRNX1ZGX1JFQURZLCAmdmNjLT5mbGFncyk7CisJCS8qIFZDQyBwb2ludGVyIGlzIHVzZWQgYXMgYSByZWZlcmVuY2UsIHNvIHdlIG11c3Qgbm90IGZyZWUgaXQKKwkJICAgKHRoZXJlYnkgc3ViamVjdGluZyBpdCB0byByZS11c2UpIGJlZm9yZSBhbGwgcGVuZGluZyBjb25uZWN0aW9ucworCSAgICAgICAgICAgYXJlIGNsb3NlZCAqLworCQlzdmNfZGlzY29ubmVjdCh2Y2MpOworCQl2Y2NfcmVsZWFzZShzb2NrKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBzdmNfYmluZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLHN0cnVjdCBzb2NrYWRkciAqc29ja2FkZHIsCisgICAgaW50IHNvY2thZGRyX2xlbikKK3sKKwlERUZJTkVfV0FJVCh3YWl0KTsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjICphZGRyOworCXN0cnVjdCBhdG1fdmNjICp2Y2M7CisJaW50IGVycm9yOworCisJaWYgKHNvY2thZGRyX2xlbiAhPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2F0bXN2YykpCisJCXJldHVybiAtRUlOVkFMOworCWxvY2tfc29jayhzayk7CisJaWYgKHNvY2stPnN0YXRlID09IFNTX0NPTk5FQ1RFRCkgeworCQllcnJvciA9IC1FSVNDT05OOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHNvY2stPnN0YXRlICE9IFNTX1VOQ09OTkVDVEVEKSB7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCXZjYyA9IEFUTV9TRChzb2NrKTsKKwlpZiAodGVzdF9iaXQoQVRNX1ZGX1NFU1NJT04sICZ2Y2MtPmZsYWdzKSkgeworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlhZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9hdG1zdmMgKikgc29ja2FkZHI7CisJaWYgKGFkZHItPnNhc19mYW1pbHkgIT0gQUZfQVRNU1ZDKSB7CisJCWVycm9yID0gLUVBRk5PU1VQUE9SVDsKKwkJZ290byBvdXQ7CisJfQorCWNsZWFyX2JpdChBVE1fVkZfQk9VTkQsJnZjYy0+ZmxhZ3MpOworCSAgICAvKiBmYWlsaW5nIHJlYmluZCB3aWxsIGtpbGwgb2xkIGJpbmRpbmcgKi8KKwkvKiBAQEAgY2hlY2sgbWVtb3J5IChkZSlhbGxvY2F0aW9uIG9uIHJlYmluZCAqLworCWlmICghdGVzdF9iaXQoQVRNX1ZGX0hBU1FPUywmdmNjLT5mbGFncykpIHsKKwkJZXJyb3IgPSAtRUJBREZEOworCQlnb3RvIG91dDsKKwl9CisJdmNjLT5sb2NhbCA9ICphZGRyOworCXNldF9iaXQoQVRNX1ZGX1dBSVRJTkcsICZ2Y2MtPmZsYWdzKTsKKwlwcmVwYXJlX3RvX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCXNpZ2RfZW5xKHZjYyxhc19iaW5kLE5VTEwsTlVMTCwmdmNjLT5sb2NhbCk7CisJd2hpbGUgKHRlc3RfYml0KEFUTV9WRl9XQUlUSU5HLCAmdmNjLT5mbGFncykgJiYgc2lnZCkgeworCQlzY2hlZHVsZSgpOworCQlwcmVwYXJlX3RvX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCX0KKwlmaW5pc2hfd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwljbGVhcl9iaXQoQVRNX1ZGX1JFR0lTLCZ2Y2MtPmZsYWdzKTsgLyogZG9lc24ndCBjb3VudCAqLworCWlmICghc2lnZCkgeworCQllcnJvciA9IC1FVU5BVENIOworCQlnb3RvIG91dDsKKwl9CisgICAgICAgIGlmICghc2stPnNrX2VycikKKwkJc2V0X2JpdChBVE1fVkZfQk9VTkQsJnZjYy0+ZmxhZ3MpOworCWVycm9yID0gLXNrLT5za19lcnI7CitvdXQ6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworc3RhdGljIGludCBzdmNfY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLHN0cnVjdCBzb2NrYWRkciAqc29ja2FkZHIsCisgICAgaW50IHNvY2thZGRyX2xlbixpbnQgZmxhZ3MpCit7CisJREVGSU5FX1dBSVQod2FpdCk7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHNvY2thZGRyX2F0bXN2YyAqYWRkcjsKKwlzdHJ1Y3QgYXRtX3ZjYyAqdmNjID0gQVRNX1NEKHNvY2spOworCWludCBlcnJvcjsKKworCURQUklOVEsoInN2Y19jb25uZWN0ICVwXG4iLHZjYyk7CisJbG9ja19zb2NrKHNrKTsKKwlpZiAoc29ja2FkZHJfbGVuICE9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjKSkgeworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXN3aXRjaCAoc29jay0+c3RhdGUpIHsKKwlkZWZhdWx0OgorCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCWNhc2UgU1NfQ09OTkVDVEVEOgorCQllcnJvciA9IC1FSVNDT05OOworCQlnb3RvIG91dDsKKwljYXNlIFNTX0NPTk5FQ1RJTkc6CisJCWlmICh0ZXN0X2JpdChBVE1fVkZfV0FJVElORywgJnZjYy0+ZmxhZ3MpKSB7CisJCQllcnJvciA9IC1FQUxSRUFEWTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CisJCWlmIChzay0+c2tfZXJyKSB7CisJCQllcnJvciA9IC1zay0+c2tfZXJyOworCQkJZ290byBvdXQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTU19VTkNPTk5FQ1RFRDoKKwkJYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjICopIHNvY2thZGRyOworCQlpZiAoYWRkci0+c2FzX2ZhbWlseSAhPSBBRl9BVE1TVkMpIHsKKwkJCWVycm9yID0gLUVBRk5PU1VQUE9SVDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmICghdGVzdF9iaXQoQVRNX1ZGX0hBU1FPUywgJnZjYy0+ZmxhZ3MpKSB7CisJCQllcnJvciA9IC1FQkFERkQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAodmNjLT5xb3MudHh0cC50cmFmZmljX2NsYXNzID09IEFUTV9BTllDTEFTUyB8fAorCQkgICAgdmNjLT5xb3Mucnh0cC50cmFmZmljX2NsYXNzID09IEFUTV9BTllDTEFTUykgeworCQkJZXJyb3IgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKCF2Y2MtPnFvcy50eHRwLnRyYWZmaWNfY2xhc3MgJiYKKwkJICAgICF2Y2MtPnFvcy5yeHRwLnRyYWZmaWNfY2xhc3MpIHsKKwkJCWVycm9yID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCXZjYy0+cmVtb3RlID0gKmFkZHI7CisJCXNldF9iaXQoQVRNX1ZGX1dBSVRJTkcsICZ2Y2MtPmZsYWdzKTsKKwkJcHJlcGFyZV90b193YWl0KHNrLT5za19zbGVlcCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNpZ2RfZW5xKHZjYyxhc19jb25uZWN0LE5VTEwsTlVMTCwmdmNjLT5yZW1vdGUpOworCQlpZiAoZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlmaW5pc2hfd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwkJCXNvY2stPnN0YXRlID0gU1NfQ09OTkVDVElORzsKKwkJCWVycm9yID0gLUVJTlBST0dSRVNTOworCQkJZ290byBvdXQ7CisJCX0KKwkJZXJyb3IgPSAwOworCQl3aGlsZSAodGVzdF9iaXQoQVRNX1ZGX1dBSVRJTkcsICZ2Y2MtPmZsYWdzKSAmJiBzaWdkKSB7CisJCQlzY2hlZHVsZSgpOworCQkJaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXByZXBhcmVfdG9fd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJRFBSSU5USygiKkFCT1JUKlxuIik7CisJCQkvKgorCQkJICogVGhpcyBpcyB0cmlja3k6CisJCQkgKiAgIEtlcm5lbCAtLS1jbG9zZS0tPiBEZW1vbgorCQkJICogICBLZXJuZWwgPC0tY2xvc2UtLS0gRGVtb24KKwkJICAgICAgICAgKiBvcgorCQkJICogICBLZXJuZWwgLS0tY2xvc2UtLT4gRGVtb24KKwkJCSAqICAgS2VybmVsIDwtLWVycm9yLS0tIERlbW9uCisJCQkgKiBvcgorCQkJICogICBLZXJuZWwgLS0tY2xvc2UtLT4gRGVtb24KKwkJCSAqICAgS2VybmVsIDwtLW9rYXktLS0tIERlbW9uCisJCQkgKiAgIEtlcm5lbCA8LS1jbG9zZS0tLSBEZW1vbgorCQkJICovCisJCQlzaWdkX2VucSh2Y2MsYXNfY2xvc2UsTlVMTCxOVUxMLE5VTEwpOworCQkJd2hpbGUgKHRlc3RfYml0KEFUTV9WRl9XQUlUSU5HLCAmdmNjLT5mbGFncykgJiYgc2lnZCkgeworCQkJCXByZXBhcmVfdG9fd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJCXNjaGVkdWxlKCk7CisJCQl9CisJCQlpZiAoIXNrLT5za19lcnIpCisJCQkJd2hpbGUgKCF0ZXN0X2JpdChBVE1fVkZfUkVMRUFTRUQsJnZjYy0+ZmxhZ3MpCisJCQkJICAgICYmIHNpZ2QpIHsKKwkJCQkJcHJlcGFyZV90b193YWl0KHNrLT5za19zbGVlcCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQkJCXNjaGVkdWxlKCk7CisJCQkJfQorCQkJY2xlYXJfYml0KEFUTV9WRl9SRUdJUywmdmNjLT5mbGFncyk7CisJCQljbGVhcl9iaXQoQVRNX1ZGX1JFTEVBU0VELCZ2Y2MtPmZsYWdzKTsKKwkJCWNsZWFyX2JpdChBVE1fVkZfQ0xPU0UsJnZjYy0+ZmxhZ3MpOworCQkJICAgIC8qIHdlJ3JlIGdvbmUgbm93IGJ1dCBtYXkgY29ubmVjdCBsYXRlciAqLworCQkJZXJyb3IgPSAtRUlOVFI7CisJCQlicmVhazsKKwkJfQorCQlmaW5pc2hfd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJCWlmICghc2lnZCkgeworCQkJZXJyb3IgPSAtRVVOQVRDSDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChzay0+c2tfZXJyKSB7CisJCQllcnJvciA9IC1zay0+c2tfZXJyOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisvKgorICogTm90IHN1cHBvcnRlZCB5ZXQKKyAqCisgKiAjaWZuZGVmIENPTkZJR19TSU5HTEVfU0lHSVRGCisgKi8KKwl2Y2MtPnFvcy50eHRwLm1heF9wY3IgPSBTRUxFQ1RfVE9QX1BDUih2Y2MtPnFvcy50eHRwKTsKKwl2Y2MtPnFvcy50eHRwLnBjciA9IDA7CisJdmNjLT5xb3MudHh0cC5taW5fcGNyID0gMDsKKy8qCisgKiAjZW5kaWYKKyAqLworCWlmICghKGVycm9yID0gdmNjX2Nvbm5lY3Qoc29jaywgdmNjLT5pdGYsIHZjYy0+dnBpLCB2Y2MtPnZjaSkpKQorCQlzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKwllbHNlCisJCSh2b2lkKSBzdmNfZGlzY29ubmVjdCh2Y2MpOworb3V0OgorCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycm9yOworfQorCisKK3N0YXRpYyBpbnQgc3ZjX2xpc3RlbihzdHJ1Y3Qgc29ja2V0ICpzb2NrLGludCBiYWNrbG9nKQoreworCURFRklORV9XQUlUKHdhaXQpOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBhdG1fdmNjICp2Y2MgPSBBVE1fU0Qoc29jayk7CisJaW50IGVycm9yOworCisJRFBSSU5USygic3ZjX2xpc3RlbiAlcFxuIix2Y2MpOworCWxvY2tfc29jayhzayk7CisJLyogbGV0IHNlcnZlciBoYW5kbGUgbGlzdGVuIG9uIHVuYm91bmQgc29ja2V0cyAqLworCWlmICh0ZXN0X2JpdChBVE1fVkZfU0VTU0lPTiwmdmNjLT5mbGFncykpIHsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJc2V0X2JpdChBVE1fVkZfV0FJVElORywgJnZjYy0+ZmxhZ3MpOworCXByZXBhcmVfdG9fd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJc2lnZF9lbnEodmNjLGFzX2xpc3RlbixOVUxMLE5VTEwsJnZjYy0+bG9jYWwpOworCXdoaWxlICh0ZXN0X2JpdChBVE1fVkZfV0FJVElORywgJnZjYy0+ZmxhZ3MpICYmIHNpZ2QpIHsKKwkJc2NoZWR1bGUoKTsKKwkJcHJlcGFyZV90b193YWl0KHNrLT5za19zbGVlcCwgJndhaXQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwl9CisJZmluaXNoX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJaWYgKCFzaWdkKSB7CisJCWVycm9yID0gLUVVTkFUQ0g7CisJCWdvdG8gb3V0OworCX0KKwlzZXRfYml0KEFUTV9WRl9MSVNURU4sJnZjYy0+ZmxhZ3MpOworCXNrLT5za19tYXhfYWNrX2JhY2tsb2cgPSBiYWNrbG9nID4gMCA/IGJhY2tsb2cgOiBBVE1fQkFDS0xPR19ERUZBVUxUOworCWVycm9yID0gLXNrLT5za19lcnI7CitvdXQ6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworc3RhdGljIGludCBzdmNfYWNjZXB0KHN0cnVjdCBzb2NrZXQgKnNvY2ssc3RydWN0IHNvY2tldCAqbmV3c29jayxpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgYXRtc3ZjX21zZyAqbXNnOworCXN0cnVjdCBhdG1fdmNjICpvbGRfdmNjID0gQVRNX1NEKHNvY2spOworCXN0cnVjdCBhdG1fdmNjICpuZXdfdmNjOworCWludCBlcnJvcjsKKworCWxvY2tfc29jayhzayk7CisKKwllcnJvciA9IHN2Y19jcmVhdGUobmV3c29jaywwKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJbmV3X3ZjYyA9IEFUTV9TRChuZXdzb2NrKTsKKworCURQUklOVEsoInN2Y19hY2NlcHQgJXAgLT4gJXBcbiIsb2xkX3ZjYyxuZXdfdmNjKTsKKwl3aGlsZSAoMSkgeworCQlERUZJTkVfV0FJVCh3YWl0KTsKKworCQlwcmVwYXJlX3RvX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJd2hpbGUgKCEoc2tiID0gc2tiX2RlcXVldWUoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSkgJiYKKwkJICAgICAgIHNpZ2QpIHsKKwkJCWlmICh0ZXN0X2JpdChBVE1fVkZfUkVMRUFTRUQsJm9sZF92Y2MtPmZsYWdzKSkgYnJlYWs7CisJCQlpZiAodGVzdF9iaXQoQVRNX1ZGX0NMT1NFLCZvbGRfdmNjLT5mbGFncykpIHsKKwkJCQllcnJvciA9IC1zay0+c2tfZXJyOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWVycm9yID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXJlbGVhc2Vfc29jayhzayk7CisJCQlzY2hlZHVsZSgpOworCQkJbG9ja19zb2NrKHNrKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWVycm9yID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCQkJcHJlcGFyZV90b193YWl0KHNrLT5za19zbGVlcCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCX0KKwkJZmluaXNoX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0OworCQlpZiAoIXNrYikgeworCQkJZXJyb3IgPSAtRVVOQVRDSDsKKwkJCWdvdG8gb3V0OworCQl9CisJCW1zZyA9IChzdHJ1Y3QgYXRtc3ZjX21zZyAqKSBza2ItPmRhdGE7CisJCW5ld192Y2MtPnFvcyA9IG1zZy0+cW9zOworCQlzZXRfYml0KEFUTV9WRl9IQVNRT1MsJm5ld192Y2MtPmZsYWdzKTsKKwkJbmV3X3ZjYy0+cmVtb3RlID0gbXNnLT5zdmM7CisJCW5ld192Y2MtPmxvY2FsID0gbXNnLT5sb2NhbDsKKwkJbmV3X3ZjYy0+c2FwID0gbXNnLT5zYXA7CisJCWVycm9yID0gdmNjX2Nvbm5lY3QobmV3c29jaywgbXNnLT5wdmMuc2FwX2FkZHIuaXRmLAorCQkJCSAgICBtc2ctPnB2Yy5zYXBfYWRkci52cGksIG1zZy0+cHZjLnNhcF9hZGRyLnZjaSk7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJc2stPnNrX2Fja19iYWNrbG9nLS07CisJCWlmIChlcnJvcikgeworCQkJc2lnZF9lbnEyKE5VTEwsYXNfcmVqZWN0LG9sZF92Y2MsTlVMTCxOVUxMLAorCQkJICAgICZvbGRfdmNjLT5xb3MsZXJyb3IpOworCQkJZXJyb3IgPSBlcnJvciA9PSAtRUFHQUlOID8gLUVCVVNZIDogZXJyb3I7CisJCQlnb3RvIG91dDsKKwkJfQorCQkvKiB3YWl0IHNob3VsZCBiZSBzaG9ydCwgc28gd2UgaWdub3JlIHRoZSBub24tYmxvY2tpbmcgZmxhZyAqLworCQlzZXRfYml0KEFUTV9WRl9XQUlUSU5HLCAmbmV3X3ZjYy0+ZmxhZ3MpOworCQlwcmVwYXJlX3RvX3dhaXQoc2tfYXRtKG5ld192Y2MpLT5za19zbGVlcCwgJndhaXQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2lnZF9lbnEobmV3X3ZjYyxhc19hY2NlcHQsb2xkX3ZjYyxOVUxMLE5VTEwpOworCQl3aGlsZSAodGVzdF9iaXQoQVRNX1ZGX1dBSVRJTkcsICZuZXdfdmNjLT5mbGFncykgJiYgc2lnZCkgeworCQkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJCXNjaGVkdWxlKCk7CisJCQlsb2NrX3NvY2soc2spOworCQkJcHJlcGFyZV90b193YWl0KHNrX2F0bShuZXdfdmNjKS0+c2tfc2xlZXAsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCX0KKwkJZmluaXNoX3dhaXQoc2tfYXRtKG5ld192Y2MpLT5za19zbGVlcCwgJndhaXQpOworCQlpZiAoIXNpZ2QpIHsKKwkJCWVycm9yID0gLUVVTkFUQ0g7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoIXNrX2F0bShuZXdfdmNjKS0+c2tfZXJyKQorCQkJYnJlYWs7CisJCWlmIChza19hdG0obmV3X3ZjYyktPnNrX2VyciAhPSBFUkVTVEFSVFNZUykgeworCQkJZXJyb3IgPSAtc2tfYXRtKG5ld192Y2MpLT5za19lcnI7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwluZXdzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKK291dDoKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnJvcjsKK30KKworCitzdGF0aWMgaW50IHN2Y19nZXRuYW1lKHN0cnVjdCBzb2NrZXQgKnNvY2ssc3RydWN0IHNvY2thZGRyICpzb2NrYWRkciwKKyAgICBpbnQgKnNvY2thZGRyX2xlbixpbnQgcGVlcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjICphZGRyOworCisJKnNvY2thZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjKTsKKwlhZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9hdG1zdmMgKikgc29ja2FkZHI7CisJbWVtY3B5KGFkZHIscGVlciA/ICZBVE1fU0Qoc29jayktPnJlbW90ZSA6ICZBVE1fU0Qoc29jayktPmxvY2FsLAorCSAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2F0bXN2YykpOworCXJldHVybiAwOworfQorCisKK2ludCBzdmNfY2hhbmdlX3FvcyhzdHJ1Y3QgYXRtX3ZjYyAqdmNjLHN0cnVjdCBhdG1fcW9zICpxb3MpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc2tfYXRtKHZjYyk7CisJREVGSU5FX1dBSVQod2FpdCk7CisKKwlzZXRfYml0KEFUTV9WRl9XQUlUSU5HLCAmdmNjLT5mbGFncyk7CisJcHJlcGFyZV90b193YWl0KHNrLT5za19zbGVlcCwgJndhaXQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlzaWdkX2VucTIodmNjLGFzX21vZGlmeSxOVUxMLE5VTEwsJnZjYy0+bG9jYWwscW9zLDApOworCXdoaWxlICh0ZXN0X2JpdChBVE1fVkZfV0FJVElORywgJnZjYy0+ZmxhZ3MpICYmCisJICAgICAgICF0ZXN0X2JpdChBVE1fVkZfUkVMRUFTRUQsICZ2Y2MtPmZsYWdzKSAmJiBzaWdkKSB7CisJCXNjaGVkdWxlKCk7CisJCXByZXBhcmVfdG9fd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJfQorCWZpbmlzaF93YWl0KHNrLT5za19zbGVlcCwgJndhaXQpOworCWlmICghc2lnZCkgcmV0dXJuIC1FVU5BVENIOworCXJldHVybiAtc2stPnNrX2VycjsKK30KKworCitzdGF0aWMgaW50IHN2Y19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGF0bV92Y2MgKnZjYyA9IEFUTV9TRChzb2NrKTsKKwlpbnQgdmFsdWUsIGVycm9yID0gMDsKKworCWxvY2tfc29jayhzayk7CisJc3dpdGNoIChvcHRuYW1lKSB7CisJCWNhc2UgU09fQVRNU0FQOgorCQkJaWYgKGxldmVsICE9IFNPTF9BVE0gfHwgb3B0bGVuICE9IHNpemVvZihzdHJ1Y3QgYXRtX3NhcCkpIHsKKwkJCQllcnJvciA9IC1FSU5WQUw7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnZjYy0+c2FwLCBvcHR2YWwsIG9wdGxlbikpIHsKKwkJCQllcnJvciA9IC1FRkFVTFQ7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlzZXRfYml0KEFUTV9WRl9IQVNTQVAsICZ2Y2MtPmZsYWdzKTsKKwkJCWJyZWFrOworIAkJY2FzZSBTT19NVUxUSVBPSU5UOgorCQkJaWYgKGxldmVsICE9IFNPTF9BVE0gfHwgb3B0bGVuICE9IHNpemVvZihpbnQpKSB7CisJCQkJZXJyb3IgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQkJfQorIAkJCWlmIChnZXRfdXNlcih2YWx1ZSwgKGludCBfX3VzZXIgKikgb3B0dmFsKSkgeworIAkJCQllcnJvciA9IC1FRkFVTFQ7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlpZiAodmFsdWUgPT0gMSkgeworCQkJCXNldF9iaXQoQVRNX1ZGX1NFU1NJT04sICZ2Y2MtPmZsYWdzKTsKKwkJCX0gZWxzZSBpZiAodmFsdWUgPT0gMCkgeworCQkJCWNsZWFyX2JpdChBVE1fVkZfU0VTU0lPTiwgJnZjYy0+ZmxhZ3MpOworCQkJfSBlbHNlIHsKKwkJCQllcnJvciA9IC1FSU5WQUw7CisJCQl9CisgIAkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyb3IgPSB2Y2Nfc2V0c29ja29wdChzb2NrLCBsZXZlbCwgb3B0bmFtZSwKKwkJCQkJICAgICAgIG9wdHZhbCwgb3B0bGVuKTsKKwl9CisKK291dDoKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnJvcjsKK30KKworCitzdGF0aWMgaW50IHN2Y19nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssaW50IGxldmVsLGludCBvcHRuYW1lLAorICAgIGNoYXIgX191c2VyICpvcHR2YWwsaW50IF9fdXNlciAqb3B0bGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnJvciA9IDAsIGxlbjsKKworCWxvY2tfc29jayhzayk7CisJaWYgKCFfX1NPX0xFVkVMX01BVENIKG9wdG5hbWUsIGxldmVsKSB8fCBvcHRuYW1lICE9IFNPX0FUTVNBUCkgeworCQllcnJvciA9IHZjY19nZXRzb2Nrb3B0KHNvY2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoZ2V0X3VzZXIobGVuLCBvcHRsZW4pKSB7CisJCWVycm9yID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCWlmIChsZW4gIT0gc2l6ZW9mKHN0cnVjdCBhdG1fc2FwKSkgeworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoY29weV90b191c2VyKG9wdHZhbCwgJkFUTV9TRChzb2NrKS0+c2FwLCBzaXplb2Yoc3RydWN0IGF0bV9zYXApKSkgeworCQllcnJvciA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KK291dDoKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnJvcjsKK30KKworCitzdGF0aWMgaW50IHN2Y19hZGRwYXJ0eShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnNvY2thZGRyLAorCQkJaW50IHNvY2thZGRyX2xlbiwgaW50IGZsYWdzKQoreworCURFRklORV9XQUlUKHdhaXQpOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBhdG1fdmNjICp2Y2MgPSBBVE1fU0Qoc29jayk7CisJaW50IGVycm9yOworCisJbG9ja19zb2NrKHNrKTsKKwlzZXRfYml0KEFUTV9WRl9XQUlUSU5HLCAmdmNjLT5mbGFncyk7CisJcHJlcGFyZV90b193YWl0KHNrLT5za19zbGVlcCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJc2lnZF9lbnEodmNjLCBhc19hZGRwYXJ0eSwgTlVMTCwgTlVMTCwKKwkgICAgICAgICAoc3RydWN0IHNvY2thZGRyX2F0bXN2YyAqKSBzb2NrYWRkcik7CisJaWYgKGZsYWdzICYgT19OT05CTE9DSykgeworCQlmaW5pc2hfd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwkJZXJyb3IgPSAtRUlOUFJPR1JFU1M7CisJCWdvdG8gb3V0OworCX0KKwlEUFJJTlRLKCJzdmNfYWRkcGFydHkgYWRkZWQgd2FpdCBxdWV1ZVxuIik7CisJd2hpbGUgKHRlc3RfYml0KEFUTV9WRl9XQUlUSU5HLCAmdmNjLT5mbGFncykgJiYgc2lnZCkgeworCQlzY2hlZHVsZSgpOworCQlwcmVwYXJlX3RvX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwl9CisJZmluaXNoX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJZXJyb3IgPSB4Y2hnKCZzay0+c2tfZXJyX3NvZnQsIDApOworb3V0OgorCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycm9yOworfQorCisKK3N0YXRpYyBpbnQgc3ZjX2Ryb3BwYXJ0eShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgZXBfcmVmKQoreworCURFRklORV9XQUlUKHdhaXQpOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBhdG1fdmNjICp2Y2MgPSBBVE1fU0Qoc29jayk7CisJaW50IGVycm9yOworCisJbG9ja19zb2NrKHNrKTsKKwlzZXRfYml0KEFUTV9WRl9XQUlUSU5HLCAmdmNjLT5mbGFncyk7CisJcHJlcGFyZV90b193YWl0KHNrLT5za19zbGVlcCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJc2lnZF9lbnEyKHZjYywgYXNfZHJvcHBhcnR5LCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBlcF9yZWYpOworCXdoaWxlICh0ZXN0X2JpdChBVE1fVkZfV0FJVElORywgJnZjYy0+ZmxhZ3MpICYmIHNpZ2QpIHsKKwkJc2NoZWR1bGUoKTsKKwkJcHJlcGFyZV90b193YWl0KHNrLT5za19zbGVlcCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJfQorCWZpbmlzaF93YWl0KHNrLT5za19zbGVlcCwgJndhaXQpOworCWlmICghc2lnZCkgeworCQllcnJvciA9IC1FVU5BVENIOworCQlnb3RvIG91dDsKKwl9CisJZXJyb3IgPSB4Y2hnKCZzay0+c2tfZXJyX3NvZnQsIDApOworb3V0OgorCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycm9yOworfQorCisKK3N0YXRpYyBpbnQgc3ZjX2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworIAlpbnQgZXJyb3IsIGVwX3JlZjsKKyAJc3RydWN0IHNvY2thZGRyX2F0bXN2YyBzYTsKKwlzdHJ1Y3QgYXRtX3ZjYyAqdmNjID0gQVRNX1NEKHNvY2spOworICAKKwlzd2l0Y2ggKGNtZCkgeworIAkJY2FzZSBBVE1fQUREUEFSVFk6CisgCQkJaWYgKCF0ZXN0X2JpdChBVE1fVkZfU0VTU0lPTiwgJnZjYy0+ZmxhZ3MpKQorIAkJCQlyZXR1cm4gLUVJTlZBTDsKKyAJCQlpZiAoY29weV9mcm9tX3VzZXIoJnNhLCAodm9pZCBfX3VzZXIgKikgYXJnLCBzaXplb2Yoc2EpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKyAJCQllcnJvciA9IHN2Y19hZGRwYXJ0eShzb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZzYSwgc2l6ZW9mKHNhKSwgMCk7CisgCQkJYnJlYWs7CisgCQljYXNlIEFUTV9EUk9QUEFSVFk6CisgCQkJaWYgKCF0ZXN0X2JpdChBVE1fVkZfU0VTU0lPTiwgJnZjYy0+ZmxhZ3MpKQorIAkJCQlyZXR1cm4gLUVJTlZBTDsKKyAJCQlpZiAoY29weV9mcm9tX3VzZXIoJmVwX3JlZiwgKHZvaWQgX191c2VyICopIGFyZywgc2l6ZW9mKGludCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworIAkJCWVycm9yID0gc3ZjX2Ryb3BwYXJ0eShzb2NrLCBlcF9yZWYpOworIAkJCWJyZWFrOworICAJCWRlZmF1bHQ6CisJCQllcnJvciA9IHZjY19pb2N0bChzb2NrLCBjbWQsIGFyZyk7CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBzdmNfcHJvdG9fb3BzID0geworCS5mYW1pbHkgPQlQRl9BVE1TVkMsCisJLm93bmVyID0JVEhJU19NT0RVTEUsCisKKwkucmVsZWFzZSA9CXN2Y19yZWxlYXNlLAorCS5iaW5kID0JCXN2Y19iaW5kLAorCS5jb25uZWN0ID0Jc3ZjX2Nvbm5lY3QsCisJLnNvY2tldHBhaXIgPQlzb2NrX25vX3NvY2tldHBhaXIsCisJLmFjY2VwdCA9CXN2Y19hY2NlcHQsCisJLmdldG5hbWUgPQlzdmNfZ2V0bmFtZSwKKwkucG9sbCA9CQl2Y2NfcG9sbCwKKwkuaW9jdGwgPQlzdmNfaW9jdGwsCisJLmxpc3RlbiA9CXN2Y19saXN0ZW4sCisJLnNodXRkb3duID0Jc3ZjX3NodXRkb3duLAorCS5zZXRzb2Nrb3B0ID0Jc3ZjX3NldHNvY2tvcHQsCisJLmdldHNvY2tvcHQgPQlzdmNfZ2V0c29ja29wdCwKKwkuc2VuZG1zZyA9CXZjY19zZW5kbXNnLAorCS5yZWN2bXNnID0JdmNjX3JlY3Ztc2csCisJLm1tYXAgPQkJc29ja19ub19tbWFwLAorCS5zZW5kcGFnZSA9CXNvY2tfbm9fc2VuZHBhZ2UsCit9OworCisKK3N0YXRpYyBpbnQgc3ZjX2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLGludCBwcm90b2NvbCkKK3sKKwlpbnQgZXJyb3I7CisKKwlzb2NrLT5vcHMgPSAmc3ZjX3Byb3RvX29wczsKKwllcnJvciA9IHZjY19jcmVhdGUoc29jaywgcHJvdG9jb2wsIEFGX0FUTVNWQyk7CisJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisJQVRNX1NEKHNvY2spLT5sb2NhbC5zYXNfZmFtaWx5ID0gQUZfQVRNU1ZDOworCUFUTV9TRChzb2NrKS0+cmVtb3RlLnNhc19mYW1pbHkgPSBBRl9BVE1TVkM7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5IHN2Y19mYW1pbHlfb3BzID0geworCS5mYW1pbHkgPSBQRl9BVE1TVkMsCisJLmNyZWF0ZSA9IHN2Y19jcmVhdGUsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworCisKKy8qCisgKglJbml0aWFsaXplIHRoZSBBVE0gU1ZDIHByb3RvY29sIGZhbWlseQorICovCisKK2ludCBfX2luaXQgYXRtc3ZjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc29ja19yZWdpc3Rlcigmc3ZjX2ZhbWlseV9vcHMpOworfQorCit2b2lkIGF0bXN2Y19leGl0KHZvaWQpCit7CisJc29ja191bnJlZ2lzdGVyKFBGX0FUTVNWQyk7Cit9CmRpZmYgLS1naXQgYS9uZXQvYXgyNS9LY29uZmlnIGIvbmV0L2F4MjUvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODk5M2EwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2F4MjUvS2NvbmZpZwpAQCAtMCwwICsxLDExMCBAQAorIworIyBBbWF0ZXVyIFJhZGlvIHByb3RvY29scyBhbmQgQVguMjUgZGV2aWNlIGNvbmZpZ3VyYXRpb24KKyMKKyMgMTk5NzExMzAJTm93IGluIGFuIG93biBjYXRlZ29yeSB0byBtYWtlIGNvcnJlY3QgY29tcGlsYXRpb24gb2YgdGhlCisjCQlBWC4yNSBzdHVmZiBlYXNpZXIuLi4KKyMJCUpvZXJnIFJldXRlciBETDFCS0UgPGpyZXV0ZXJAeWFpbmEuZGU+CisjIDE5OTgwMTI5CU1vdmVkIHRvIG5ldC9heDI1L0NvbmZpZy5pbiwgc291cmNpbmcgZGV2aWNlIGRyaXZlcnMuCisKK21lbnVjb25maWcgSEFNUkFESU8KKwlkZXBlbmRzIG9uIE5FVAorCWJvb2wgIkFtYXRldXIgUmFkaW8gc3VwcG9ydCIKKwloZWxwCisJICBJZiB5b3Ugd2FudCB0byBjb25uZWN0IHlvdXIgTGludXggYm94IHRvIGFuIGFtYXRldXIgcmFkaW8sIGFuc3dlciBZCisJICBoZXJlLiBZb3Ugd2FudCB0byByZWFkIDxodHRwOi8vd3d3LnRhcHIub3JnL3RhcHIvaHRtbC9wa3Rob21lLmh0bWw+IGFuZAorCSAgdGhlIEFYMjUtSE9XVE8sIGF2YWlsYWJsZSBmcm9tIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIE5vdGUgdGhhdCB0aGUgYW5zd2VyIHRvIHRoaXMgcXVlc3Rpb24gd29uJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZQorCSAga2VybmVsOiBzYXlpbmcgTiB3aWxsIGp1c3QgY2F1c2UgdGhlIGNvbmZpZ3VyYXRvciB0byBza2lwIGFsbAorCSAgdGhlIHF1ZXN0aW9ucyBhYm91dCBhbWF0ZXVyIHJhZGlvLgorCitjb21tZW50ICJQYWNrZXQgUmFkaW8gcHJvdG9jb2xzIgorCWRlcGVuZHMgb24gSEFNUkFESU8gJiYgTkVUCisKK2NvbmZpZyBBWDI1CisJdHJpc3RhdGUgIkFtYXRldXIgUmFkaW8gQVguMjUgTGV2ZWwgMiBwcm90b2NvbCIKKwlkZXBlbmRzIG9uIEhBTVJBRElPICYmIE5FVAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgdGhlIHByb3RvY29sIHVzZWQgZm9yIGNvbXB1dGVyIGNvbW11bmljYXRpb24gb3ZlciBhbWF0ZXVyCisJICByYWRpby4gSXQgaXMgZWl0aGVyIHVzZWQgYnkgaXRzZWxmIGZvciBwb2ludC10by1wb2ludCBsaW5rcywgb3IgdG8KKwkgIGNhcnJ5IG90aGVyIHByb3RvY29scyBzdWNoIGFzIHRjcC9pcC4gVG8gdXNlIGl0LCB5b3UgbmVlZCBhIGRldmljZQorCSAgdGhhdCBjb25uZWN0cyB5b3VyIExpbnV4IGJveCB0byB5b3VyIGFtYXRldXIgcmFkaW8uIFlvdSBjYW4gZWl0aGVyCisJICB1c2UgYSBsb3cgc3BlZWQgVE5DIChhIFRlcm1pbmFsIE5vZGUgQ29udHJvbGxlciBhY3RzIGFzIGEga2luZCBvZgorCSAgbW9kZW0gY29ubmVjdGluZyB5b3VyIGNvbXB1dGVyJ3Mgc2VyaWFsIHBvcnQgdG8geW91ciByYWRpbydzCisJICBtaWNyb3Bob25lIGlucHV0IGFuZCBzcGVha2VyIG91dHB1dCkgc3VwcG9ydGluZyB0aGUgS0lTUyBwcm90b2NvbCBvcgorCSAgb25lIG9mIHRoZSB2YXJpb3VzIFNDQyBjYXJkcyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGdlbmVyaWMgWjg1MzAKKwkgIG9yIHRoZSBETUEgU0NDIGRyaXZlci4gQW5vdGhlciBvcHRpb24gYXJlIHRoZSBCYXljb20gbW9kZW0gc2VyaWFsCisJICBhbmQgcGFyYWxsZWwgcG9ydCBoYWNrcyBvciB0aGUgc291bmQgY2FyZCBtb2RlbSAoc3VwcG9ydGVkIGJ5IHRoZWlyCisJICBvd24gZHJpdmVycykuIElmIHlvdSBzYXkgWSBoZXJlLCB5b3UgYWxzbyBoYXZlIHRvIHNheSBZIHRvIG9uZSBvZgorCSAgdGhvc2UgZHJpdmVycy4KKworCSAgSW5mb3JtYXRpb24gYWJvdXQgd2hlcmUgdG8gZ2V0IHN1cHBvcnRpbmcgc29mdHdhcmUgZm9yIExpbnV4IGFtYXRldXIKKwkgIHJhZGlvIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGNvbmZpZ3VyZSBhbiBBWC4yNSBwb3J0IGlzCisJICBjb250YWluZWQgaW4gdGhlIEFYMjUtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiBZb3UgbWlnaHQgYWxzbyB3YW50IHRvCisJICBjaGVjayBvdXQgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2F4MjUudHh0PiBpbiB0aGUKKwkgIGtlcm5lbCBzb3VyY2UuIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZGlnaXRhbCBhbWF0ZXVyIHJhZGlvIGluCisJICBnZW5lcmFsIGlzIG9uIHRoZSBXV1cgYXQKKwkgIDxodHRwOi8vd3d3LnRhcHIub3JnL3RhcHIvaHRtbC9wa3Rob21lLmh0bWw+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBheDI1LgorCitjb25maWcgQVgyNV9EQU1BX1NMQVZFCisJYm9vbCAiQVguMjUgREFNQSBTbGF2ZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVgyNQorCWhlbHAKKwkgIERBTUEgaXMgYSBtZWNoYW5pc20gdG8gcHJldmVudCBjb2xsaXNpb25zIHdoZW4gZG9pbmcgQVguMjUKKwkgIG5ldHdvcmtpbmcuIEEgREFNQSBzZXJ2ZXIgKGNhbGxlZCAibWFzdGVyIikgYWNjZXB0cyBpbmNvbWluZyB0cmFmZmljCisJICBmcm9tIGNsaWVudHMgKGNhbGxlZCAic2xhdmVzIikgYW5kIHJlZGlzdHJpYnV0ZXMgaXQgdG8gb3RoZXIgc2xhdmVzLgorCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdXIgTGludXggYm94IHdpbGwgYWN0IGFzIGEgREFNQSBzbGF2ZTsgdGhpcyBpcworCSAgdHJhbnNwYXJlbnQgaW4gdGhhdCB5b3UgZG9uJ3QgaGF2ZSB0byBkbyBhbnkgc3BlY2lhbCBEQU1BCisJICBjb25maWd1cmF0aW9uLiAoTGludXggY2Fubm90IHlldCBhY3QgYXMgYSBEQU1BIHNlcnZlci4pIElmIHVuc3VyZSwKKwkgIHNheSBOLgorCisjCSBib29sICcgICAgQVguMjUgREFNQSBNYXN0ZXIgc3VwcG9ydCcgQ09ORklHX0FYMjVfREFNQV9NQVNURVIKK2NvbmZpZyBORVRST00KKwl0cmlzdGF0ZSAiQW1hdGV1ciBSYWRpbyBORVQvUk9NIHByb3RvY29sIgorCWRlcGVuZHMgb24gQVgyNQorCS0tLWhlbHAtLS0KKwkgIE5FVC9ST00gaXMgYSBuZXR3b3JrIGxheWVyIHByb3RvY29sIG9uIHRvcCBvZiBBWC4yNSB1c2VmdWwgZm9yCisJICByb3V0aW5nLgorCisJICBBIGNvbXByZWhlbnNpdmUgbGlzdGluZyBvZiBhbGwgdGhlIHNvZnR3YXJlIGZvciBMaW51eCBhbWF0ZXVyIHJhZGlvCisJICB1c2VycyBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBjb25maWd1cmUgYW4gQVguMjUgcG9ydCBpcworCSAgY29udGFpbmVkIGluIHRoZSBBWDI1LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gWW91IGFsc28gbWlnaHQgd2FudCB0bworCSAgY2hlY2sgb3V0IHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9heDI1LnR4dD4uIE1vcmUKKwkgIGluZm9ybWF0aW9uIGFib3V0IGRpZ2l0YWwgYW1hdGV1ciByYWRpbyBpbiBnZW5lcmFsIGlzIG9uIHRoZSBXV1cgYXQKKwkgIDxodHRwOi8vd3d3LnRhcHIub3JnL3RhcHIvaHRtbC9wa3Rob21lLmh0bWw+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBuZXRyb20uCisKK2NvbmZpZyBST1NFCisJdHJpc3RhdGUgIkFtYXRldXIgUmFkaW8gWC4yNSBQTFAgKFJvc2UpIgorCWRlcGVuZHMgb24gQVgyNQorCS0tLWhlbHAtLS0KKwkgIFRoZSBQYWNrZXQgTGF5ZXIgUHJvdG9jb2wgKFBMUCkgaXMgYSB3YXkgdG8gcm91dGUgcGFja2V0cyBvdmVyIFguMjUKKwkgIGNvbm5lY3Rpb25zIGluIGdlbmVyYWwgYW5kIGFtYXRldXIgcmFkaW8gQVguMjUgY29ubmVjdGlvbnMgaW4KKwkgIHBhcnRpY3VsYXIsIGVzc2VudGlhbGx5IGFuIGFsdGVybmF0aXZlIHRvIE5FVC9ST00uCisKKwkgIEEgY29tcHJlaGVuc2l2ZSBsaXN0aW5nIG9mIGFsbCB0aGUgc29mdHdhcmUgZm9yIExpbnV4IGFtYXRldXIgcmFkaW8KKwkgIHVzZXJzIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGNvbmZpZ3VyZSBhbiBBWC4yNSBwb3J0IGlzCisJICBjb250YWluZWQgaW4gdGhlIEFYMjUtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiAgWW91IGFsc28gbWlnaHQgd2FudCB0bworCSAgY2hlY2sgb3V0IHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9heDI1LnR4dD4uIE1vcmUKKwkgIGluZm9ybWF0aW9uIGFib3V0IGRpZ2l0YWwgYW1hdGV1ciByYWRpbyBpbiBnZW5lcmFsIGlzIG9uIHRoZSBXV1cgYXQKKwkgIDxodHRwOi8vd3d3LnRhcHIub3JnL3RhcHIvaHRtbC9wa3Rob21lLmh0bWw+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCByb3NlLgorCisKK21lbnUgIkFYLjI1IG5ldHdvcmsgZGV2aWNlIGRyaXZlcnMiCisJZGVwZW5kcyBvbiBIQU1SQURJTyAmJiBORVQgJiYgQVgyNSE9bgorCitzb3VyY2UgImRyaXZlcnMvbmV0L2hhbXJhZGlvL0tjb25maWciCisKK2VuZG1lbnUKKwpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvTWFrZWZpbGUgYi9uZXQvYXgyNS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2M0NmQyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2F4MjUvTWFrZWZpbGUKQEAgLTAsMCArMSwxMSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IEFYLjI1IGxheWVyLgorIworCitvYmotJChDT05GSUdfQVgyNSkgKz0gYXgyNS5vCisKK2F4MjUteQkgOj0gYXgyNV9hZGRyLm8gYXgyNV9kZXYubyBheDI1X2lmYWNlLm8gYXgyNV9pbi5vIGF4MjVfaXAubyBheDI1X291dC5vIFwKKwkgICAgYXgyNV9yb3V0ZS5vIGF4MjVfc3RkX2luLm8gYXgyNV9zdGRfc3Vici5vIGF4MjVfc3RkX3RpbWVyLm8gXAorCSAgICBheDI1X3N1YnIubyBheDI1X3RpbWVyLm8gYXgyNV91aWQubyBhZl9heDI1Lm8KK2F4MjUtJChDT05GSUdfQVgyNV9EQU1BX1NMQVZFKSArPSBheDI1X2RzX2luLm8gYXgyNV9kc19zdWJyLm8gYXgyNV9kc190aW1lci5vCitheDI1LSQoQ09ORklHX1NZU0NUTCkgKz0gc3lzY3RsX25ldF9heDI1Lm8KZGlmZiAtLWdpdCBhL25ldC9heDI1L1RPRE8gYi9uZXQvYXgyNS9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwODljNDkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYXgyNS9UT0RPCkBAIC0wLDAgKzEsMjQgQEAKK0RvIHRoZSBheDI1X2xpc3RfbG9jaywgYXgyNV9kZXZfbG9jaywgbGlua2ZhaWxfbG9ja3JlYWxseSwgYXgyNV9mcmFnX2xvY2sgYW5kCitsaXN0ZW5fbG9jayBoYXZlIHRvIGJlIGJoLXNhZmU/CisKK0RvIHRoZSBuZXRyb20gYW5kIHJvc2UgbG9ja3MgaGF2ZSB0byBiZSBiaC1zYWZlPworCitBIGRldmljZSBtaWdodCBiZSBkZWxldGVkIGFmdGVyIGxvb2t1cCBpbiB0aGUgU0lPQ0FERFJUIGlvY3RsIGJ1dCBiZWZvcmUgaXQncworYmVpbmcgdXNlZC4KKworUm91dGVzIHRvIGEgZGV2aWNlIGJlaW5nIHRha2VuIGRvd24gbWlnaHQgYmUgZGVsZXRlZCBieSBheDI1X3J0X2RldmljZV9kb3duCitidXQgYWRkZWQgYnkgc29tZWJvZHkgZWxzZSBiZWZvcmUgdGhlIGRldmljZSBoYXMgYmVlbiBkZWxldGVkIGZ1bGx5LgorCitNYXNzaXZlIGFtb3VudHMgb2YgbG9ja19rZXJuZWwgLyB1bmxvY2tfa2VybmVsIGFyZSBqdXN0IGEgdGVtcG9yYXJ5IHNvbHV0aW9uIHRvCitnZXQgYXJvdW5kIHRoZSByZW1vdmFsIG9mIFNPQ0tPUFNfV1JBUC4gIEEgc2VyaW91cyBsb2NraW5nIHN0cmF0ZWd5IGhhcyB0byBiZQoraW1wbGVtZW50ZWQuCisKK1RoZSBheDI1X3J0X2ZpbmRfcm91dGUgc3lub3BzeXMgaXMgcGVydmVydCBidXQgSSBzb21laG93IGhhZCB0byBkZWFsIHdpdGgKK3RoZSByYWNlIGNhdXNlZCBieSB0aGUgc3RhdGljIHZhcmlhYmxlIGluIGl0J3MgcHJldmlvdXMgaW1wbGVtZW50YXRpb24uCisKK0ltcGxlbWVudCBwcm9wZXIgc29ja2V0IGxvY2tpbmcgaW4gbmV0cm9tIGFuZCByb3NlLgorCitDaGVjayBzb2NrZXQgbG9ja2luZyB3aGVuIGF4MjVfcmN2IGlzIHNlbmRpbmcgdG8gcmF3IHNvY2tldHMuICBJbiBwYXJ0aWN1bGFyCitheDI1X3NlbmRfdG9fcmF3KCkgc2VlbXMgZmlzaHkuICBIZWNrIC0gYXgyNV9yY3YgaXMgZmlzaHkuCisKK0hhbmRsZSBYSUQgYW5kIFRFU1QgZnJhbWVzIHByb3Blcmx5LgpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYWZfYXgyNS5jIGIvbmV0L2F4MjUvYWZfYXgyNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYjFhMzcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYXgyNS9hZl9heDI1LmMKQEAgLTAsMCArMSwyMDUwIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIEFsYW4gQ294IEdXNFBUUyAoYWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrKQorICogQ29weXJpZ2h0IChDKSBKb25hdGhhbiBOYXlsb3IgRzRLTFggKGc0a2x4QGc0a2x4LmRlbW9uLmNvLnVrKQorICogQ29weXJpZ2h0IChDKSBEYXJyeWwgTWlsZXMgRzdMRUQgKGRsbUBnN2xlZC5kZW1vbi5jby51aykKKyAqIENvcHlyaWdodCAoQykgU3RldmVuIFdoaXRlaG91c2UgR1c3UlJNIChzdGV2ZXdAYWNtLm9yZykKKyAqIENvcHlyaWdodCAoQykgSm9lcmcgUmV1dGVyIERMMUJLRSAoanJldXRlckB5YWluYS5kZSkKKyAqIENvcHlyaWdodCAoQykgSGFucy1Kb2FjaGltIEhldHNjaGVyIEREOE5FIChkZDhuZUBibnYtYmFtYmVyZy5kZSkKKyAqIENvcHlyaWdodCAoQykgSGFucyBBbGJsYXMgUEUxQVlYIChoYW5zQGVzcmFjLmVsZS50dWUubmwpCisgKiBDb3B5cmlnaHQgKEMpIEZyZWRlcmljIFJpYmxlIEYxT0FUIChmcmlibGVAdGVhc2VyLmZyKQorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPG5ldC9heDI1Lmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC90ZXJtaW9zLmg+CS8qIEZvciBUSU9DSU5RL09VVFEgKi8KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorCisKKworSExJU1RfSEVBRChheDI1X2xpc3QpOworREVGSU5FX1NQSU5MT0NLKGF4MjVfbGlzdF9sb2NrKTsKKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgYXgyNV9wcm90b19vcHM7CisKK3N0YXRpYyB2b2lkIGF4MjVfZnJlZV9zb2NrKHN0cnVjdCBzb2NrICpzaykKK3sKKwlheDI1X2NiX3B1dChheDI1X3NrKHNrKSk7Cit9CisKKy8qCisgKglTb2NrZXQgcmVtb3ZhbCBkdXJpbmcgYW4gaW50ZXJydXB0IGlzIG5vdyBzYWZlLgorICovCitzdGF0aWMgdm9pZCBheDI1X2NiX2RlbChheDI1X2NiICpheDI1KQoreworCWlmICghaGxpc3RfdW5oYXNoZWQoJmF4MjUtPmF4MjVfbm9kZSkpIHsKKwkJc3Bpbl9sb2NrX2JoKCZheDI1X2xpc3RfbG9jayk7CisJCWhsaXN0X2RlbF9pbml0KCZheDI1LT5heDI1X25vZGUpOworCQlzcGluX3VubG9ja19iaCgmYXgyNV9saXN0X2xvY2spOworCQlheDI1X2NiX3B1dChheDI1KTsKKwl9Cit9CisKKy8qCisgKglLaWxsIGFsbCBib3VuZCBzb2NrZXRzIG9uIGEgZHJvcHBlZCBkZXZpY2UuCisgKi8KK3N0YXRpYyB2b2lkIGF4MjVfa2lsbF9ieV9kZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlheDI1X2RldiAqYXgyNV9kZXY7CisJYXgyNV9jYiAqczsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCWlmICgoYXgyNV9kZXYgPSBheDI1X2Rldl9heDI1ZGV2KGRldikpID09IE5VTEwpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19iaCgmYXgyNV9saXN0X2xvY2spOworCWF4MjVfZm9yX2VhY2gocywgbm9kZSwgJmF4MjVfbGlzdCkgeworCQlpZiAocy0+YXgyNV9kZXYgPT0gYXgyNV9kZXYpIHsKKwkJCXMtPmF4MjVfZGV2ID0gTlVMTDsKKwkJCWF4MjVfZGlzY29ubmVjdChzLCBFTkVUVU5SRUFDSCk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJmF4MjVfbGlzdF9sb2NrKTsKK30KKworLyoKKyAqCUhhbmRsZSBkZXZpY2Ugc3RhdHVzIGNoYW5nZXMuCisgKi8KK3N0YXRpYyBpbnQgYXgyNV9kZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGV2ZW50LAorCXZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopcHRyOworCisJLyogUmVqZWN0IG5vbiBBWC4yNSBkZXZpY2VzICovCisJaWYgKGRldi0+dHlwZSAhPSBBUlBIUkRfQVgyNSkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX1VQOgorCQlheDI1X2Rldl9kZXZpY2VfdXAoZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfRE9XTjoKKwkJYXgyNV9raWxsX2J5X2RldmljZShkZXYpOworCQlheDI1X3J0X2RldmljZV9kb3duKGRldik7CisJCWF4MjVfZGV2X2RldmljZV9kb3duKGRldik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworLyoKKyAqCUFkZCBhIHNvY2tldCB0byB0aGUgYm91bmQgc29ja2V0cyBsaXN0LgorICovCit2b2lkIGF4MjVfY2JfYWRkKGF4MjVfY2IgKmF4MjUpCit7CisJc3Bpbl9sb2NrX2JoKCZheDI1X2xpc3RfbG9jayk7CisJYXgyNV9jYl9ob2xkKGF4MjUpOworCWhsaXN0X2FkZF9oZWFkKCZheDI1LT5heDI1X25vZGUsICZheDI1X2xpc3QpOworCXNwaW5fdW5sb2NrX2JoKCZheDI1X2xpc3RfbG9jayk7Cit9CisKKy8qCisgKglGaW5kIGEgc29ja2V0IHRoYXQgd2FudHMgdG8gYWNjZXB0IHRoZSBTQUJNIHdlIGhhdmUganVzdAorICoJcmVjZWl2ZWQuCisgKi8KK3N0cnVjdCBzb2NrICpheDI1X2ZpbmRfbGlzdGVuZXIoYXgyNV9hZGRyZXNzICphZGRyLCBpbnQgZGlnaSwKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdHlwZSkKK3sKKwlheDI1X2NiICpzOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJc3Bpbl9sb2NrX2JoKCZheDI1X2xpc3RfbG9jayk7CisJYXgyNV9mb3JfZWFjaChzLCBub2RlLCAmYXgyNV9saXN0KSB7CisJCWlmICgocy0+aWFtZGlnaSAmJiAhZGlnaSkgfHwgKCFzLT5pYW1kaWdpICYmIGRpZ2kpKQorCQkJY29udGludWU7CisJCWlmIChzLT5zayAmJiAhYXgyNWNtcCgmcy0+c291cmNlX2FkZHIsIGFkZHIpICYmCisJCSAgICBzLT5zay0+c2tfdHlwZSA9PSB0eXBlICYmIHMtPnNrLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOKSB7CisJCQkvKiBJZiBkZXZpY2UgaXMgbnVsbCB3ZSBtYXRjaCBhbnkgZGV2aWNlICovCisJCQlpZiAocy0+YXgyNV9kZXYgPT0gTlVMTCB8fCBzLT5heDI1X2Rldi0+ZGV2ID09IGRldikgeworCQkJCXNvY2tfaG9sZChzLT5zayk7CisJCQkJc3Bpbl91bmxvY2tfYmgoJmF4MjVfbGlzdF9sb2NrKTsKKwkJCQlyZXR1cm4gcy0+c2s7CisJCQl9CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJmF4MjVfbGlzdF9sb2NrKTsKKworCXJldHVybiBOVUxMOworfQorCisvKgorICoJRmluZCBhbiBBWC4yNSBzb2NrZXQgZ2l2ZW4gYm90aCBlbmRzLgorICovCitzdHJ1Y3Qgc29jayAqYXgyNV9nZXRfc29ja2V0KGF4MjVfYWRkcmVzcyAqbXlfYWRkciwgYXgyNV9hZGRyZXNzICpkZXN0X2FkZHIsCisJaW50IHR5cGUpCit7CisJc3RydWN0IHNvY2sgKnNrID0gTlVMTDsKKwlheDI1X2NiICpzOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJc3Bpbl9sb2NrX2JoKCZheDI1X2xpc3RfbG9jayk7CisJYXgyNV9mb3JfZWFjaChzLCBub2RlLCAmYXgyNV9saXN0KSB7CisJCWlmIChzLT5zayAmJiAhYXgyNWNtcCgmcy0+c291cmNlX2FkZHIsIG15X2FkZHIpICYmCisJCSAgICAhYXgyNWNtcCgmcy0+ZGVzdF9hZGRyLCBkZXN0X2FkZHIpICYmCisJCSAgICBzLT5zay0+c2tfdHlwZSA9PSB0eXBlKSB7CisJCQlzayA9IHMtPnNrOworCQkJc29ja19ob2xkKHNrKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfYmgoJmF4MjVfbGlzdF9sb2NrKTsKKworCXJldHVybiBzazsKK30KKworLyoKKyAqCUZpbmQgYW4gQVguMjUgY29udHJvbCBibG9jayBnaXZlbiBib3RoIGVuZHMuIEl0IHdpbGwgb25seSBwaWNrIHVwCisgKglmbG9hdGluZyBBWC4yNSBjb250cm9sIGJsb2NrcyBvciBub24gUmF3IHNvY2tldCBib3VuZCBjb250cm9sIGJsb2Nrcy4KKyAqLworYXgyNV9jYiAqYXgyNV9maW5kX2NiKGF4MjVfYWRkcmVzcyAqc3JjX2FkZHIsIGF4MjVfYWRkcmVzcyAqZGVzdF9hZGRyLAorCWF4MjVfZGlnaSAqZGlnaSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlheDI1X2NiICpzOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJc3Bpbl9sb2NrX2JoKCZheDI1X2xpc3RfbG9jayk7CisJYXgyNV9mb3JfZWFjaChzLCBub2RlLCAmYXgyNV9saXN0KSB7CisJCWlmIChzLT5zayAmJiBzLT5zay0+c2tfdHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCkKKwkJCWNvbnRpbnVlOworCQlpZiAocy0+YXgyNV9kZXYgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlpZiAoYXgyNWNtcCgmcy0+c291cmNlX2FkZHIsIHNyY19hZGRyKSA9PSAwICYmIGF4MjVjbXAoJnMtPmRlc3RfYWRkciwgZGVzdF9hZGRyKSA9PSAwICYmIHMtPmF4MjVfZGV2LT5kZXYgPT0gZGV2KSB7CisJCQlpZiAoZGlnaSAhPSBOVUxMICYmIGRpZ2ktPm5kaWdpICE9IDApIHsKKwkJCQlpZiAocy0+ZGlnaXBlYXQgPT0gTlVMTCkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKGF4MjVkaWdpY21wKHMtPmRpZ2lwZWF0LCBkaWdpKSAhPSAwKQorCQkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHMtPmRpZ2lwZWF0ICE9IE5VTEwgJiYgcy0+ZGlnaXBlYXQtPm5kaWdpICE9IDApCisJCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYXgyNV9jYl9ob2xkKHMpOworCQkJc3Bpbl91bmxvY2tfYmgoJmF4MjVfbGlzdF9sb2NrKTsKKworCQkJcmV0dXJuIHM7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJmF4MjVfbGlzdF9sb2NrKTsKKworCXJldHVybiBOVUxMOworfQorCit2b2lkIGF4MjVfc2VuZF90b19yYXcoYXgyNV9hZGRyZXNzICphZGRyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcHJvdG8pCit7CisJYXgyNV9jYiAqczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqY29weTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCXNwaW5fbG9ja19iaCgmYXgyNV9saXN0X2xvY2spOworCWF4MjVfZm9yX2VhY2gocywgbm9kZSwgJmF4MjVfbGlzdCkgeworCQlpZiAocy0+c2sgIT0gTlVMTCAmJiBheDI1Y21wKCZzLT5zb3VyY2VfYWRkciwgYWRkcikgPT0gMCAmJgorCQkgICAgcy0+c2stPnNrX3R5cGUgPT0gU09DS19SQVcgJiYKKwkJICAgIHMtPnNrLT5za19wcm90b2NvbCA9PSBwcm90byAmJgorCQkgICAgcy0+YXgyNV9kZXYtPmRldiA9PSBza2ItPmRldiAmJgorCQkgICAgYXRvbWljX3JlYWQoJnMtPnNrLT5za19ybWVtX2FsbG9jKSA8PSBzLT5zay0+c2tfcmN2YnVmKSB7CisJCQlpZiAoKGNvcHkgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChzb2NrX3F1ZXVlX3Jjdl9za2Iocy0+c2ssIGNvcHkpICE9IDApCisJCQkJa2ZyZWVfc2tiKGNvcHkpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2JoKCZheDI1X2xpc3RfbG9jayk7Cit9CisKKy8qCisgKglEZWZlcnJlZCBkZXN0cm95LgorICovCit2b2lkIGF4MjVfZGVzdHJveV9zb2NrZXQoYXgyNV9jYiAqKTsKKworLyoKKyAqCUhhbmRsZXIgZm9yIGRlZmVycmVkIGtpbGxzLgorICovCitzdGF0aWMgdm9pZCBheDI1X2Rlc3Ryb3lfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCWF4MjVfY2IgKmF4MjU9KGF4MjVfY2IgKilkYXRhOworCXN0cnVjdCBzb2NrICpzazsKKwkKKwlzaz1heDI1LT5zazsKKwkKKwliaF9sb2NrX3NvY2soc2spOworCXNvY2tfaG9sZChzayk7CisJYXgyNV9kZXN0cm95X3NvY2tldChheDI1KTsKKwliaF91bmxvY2tfc29jayhzayk7CisJc29ja19wdXQoc2spOworfQorCisvKgorICoJVGhpcyBpcyBjYWxsZWQgZnJvbSB1c2VyIG1vZGUgYW5kIHRoZSB0aW1lcnMuIFRodXMgaXQgcHJvdGVjdHMgaXRzZWxmCisgKglhZ2FpbnN0IGludGVycnVwdCB1c2VycyBidXQgZG9lc24ndCB3b3JyeSBhYm91dCBiZWluZyBjYWxsZWQgZHVyaW5nCisgKgl3b3JrLiBPbmNlIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWUgbm8gaW50ZXJydXB0IG9yIGJvdHRvbSBoYWxmCisgKgl3aWxsIHRvdWNoIGl0IGFuZCB3ZSBhcmUgKGZhaXJseSA4LSkgKSBzYWZlLgorICovCit2b2lkIGF4MjVfZGVzdHJveV9zb2NrZXQoYXgyNV9jYiAqYXgyNSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJYXgyNV9jYl9kZWwoYXgyNSk7CisKKwlheDI1X3N0b3BfaGVhcnRiZWF0KGF4MjUpOworCWF4MjVfc3RvcF90MXRpbWVyKGF4MjUpOworCWF4MjVfc3RvcF90MnRpbWVyKGF4MjUpOworCWF4MjVfc3RvcF90M3RpbWVyKGF4MjUpOworCWF4MjVfc3RvcF9pZGxldGltZXIoYXgyNSk7CisKKwlheDI1X2NsZWFyX3F1ZXVlcyhheDI1KTsJLyogRmx1c2ggdGhlIHF1ZXVlcyAqLworCisJaWYgKGF4MjUtPnNrICE9IE5VTEwpIHsKKwkJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmYXgyNS0+c2stPnNrX3JlY2VpdmVfcXVldWUpKSAhPSBOVUxMKSB7CisJCQlpZiAoc2tiLT5zayAhPSBheDI1LT5zaykgeworCQkJCS8qIEEgcGVuZGluZyBjb25uZWN0aW9uICovCisJCQkJYXgyNV9jYiAqc2F4MjUgPSBheDI1X3NrKHNrYi0+c2spOworCisJCQkJLyogUXVldWUgdGhlIHVuYWNjZXB0ZWQgc29ja2V0IGZvciBkZWF0aCAqLworCQkJCXNvY2tfb3JwaGFuKHNrYi0+c2spOworCisJCQkJYXgyNV9zdGFydF9oZWFydGJlYXQoc2F4MjUpOworCQkJCXNheDI1LT5zdGF0ZSA9IEFYMjVfU1RBVEVfMDsKKwkJCX0KKworCQkJa2ZyZWVfc2tiKHNrYik7CisJCX0KKwkJc2tiX3F1ZXVlX3B1cmdlKCZheDI1LT5zay0+c2tfd3JpdGVfcXVldWUpOworCX0KKworCWlmIChheDI1LT5zayAhPSBOVUxMKSB7CisJCWlmIChhdG9taWNfcmVhZCgmYXgyNS0+c2stPnNrX3dtZW1fYWxsb2MpIHx8CisJCSAgICBhdG9taWNfcmVhZCgmYXgyNS0+c2stPnNrX3JtZW1fYWxsb2MpKSB7CisJCQkvKiBEZWZlcjogb3V0c3RhbmRpbmcgYnVmZmVycyAqLworCQkJaW5pdF90aW1lcigmYXgyNS0+ZHRpbWVyKTsKKwkJCWF4MjUtPmR0aW1lci5leHBpcmVzICA9IGppZmZpZXMgKyAyICogSFo7CisJCQlheDI1LT5kdGltZXIuZnVuY3Rpb24gPSBheDI1X2Rlc3Ryb3lfdGltZXI7CisJCQlheDI1LT5kdGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZylheDI1OworCQkJYWRkX3RpbWVyKCZheDI1LT5kdGltZXIpOworCQl9IGVsc2UgeworCQkJc3RydWN0IHNvY2sgKnNrPWF4MjUtPnNrOworCQkJYXgyNS0+c2s9TlVMTDsKKwkJCXNvY2tfcHV0KHNrKTsKKwkJfQorCX0gZWxzZSB7CisJCWF4MjVfY2JfcHV0KGF4MjUpOworCX0KK30KKworLyoKKyAqIGRsMWJrZSA5NjAzMTE6IHNldCBwYXJhbWV0ZXJzIGZvciBleGlzdGluZyBBWC4yNSBjb25uZWN0aW9ucywKKyAqCQkgIGluY2x1ZGVzIGEgS0lMTCBjb21tYW5kIHRvIGFib3J0IGFueSBjb25uZWN0aW9uLgorICoJCSAgVkVSWSB1c2VmdWwgZm9yIGRlYnVnZ2luZyA7LSkKKyAqLworc3RhdGljIGludCBheDI1X2N0bF9pb2N0bChjb25zdCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBheDI1X2N0bF9zdHJ1Y3QgYXgyNV9jdGw7CisJYXgyNV9kaWdpIGRpZ2k7CisJYXgyNV9kZXYgKmF4MjVfZGV2OworCWF4MjVfY2IgKmF4MjU7CisJdW5zaWduZWQgaW50IGs7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmF4MjVfY3RsLCBhcmcsIHNpemVvZihheDI1X2N0bCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICgoYXgyNV9kZXYgPSBheDI1X2FkZHJfYXgyNWRldigmYXgyNV9jdGwucG9ydF9hZGRyKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoYXgyNV9jdGwuZGlnaV9jb3VudCA+IEFYMjVfTUFYX0RJR0lTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRpZ2kubmRpZ2kgPSBheDI1X2N0bC5kaWdpX2NvdW50OworCWZvciAoayA9IDA7IGsgPCBkaWdpLm5kaWdpOyBrKyspCisJCWRpZ2kuY2FsbHNba10gPSBheDI1X2N0bC5kaWdpX2FkZHJba107CisKKwlpZiAoKGF4MjUgPSBheDI1X2ZpbmRfY2IoJmF4MjVfY3RsLnNvdXJjZV9hZGRyLCAmYXgyNV9jdGwuZGVzdF9hZGRyLCAmZGlnaSwgYXgyNV9kZXYtPmRldikpID09IE5VTEwpCisJCXJldHVybiAtRU5PVENPTk47CisKKwlzd2l0Y2ggKGF4MjVfY3RsLmNtZCkgeworCWNhc2UgQVgyNV9LSUxMOgorCQlheDI1X3NlbmRfY29udHJvbChheDI1LCBBWDI1X0RJU0MsIEFYMjVfUE9MTE9OLCBBWDI1X0NPTU1BTkQpOworI2lmZGVmIENPTkZJR19BWDI1X0RBTUFfU0xBVkUKKwkJaWYgKGF4MjVfZGV2LT5kYW1hLnNsYXZlICYmIGF4MjUtPmF4MjVfZGV2LT52YWx1ZXNbQVgyNV9WQUxVRVNfUFJPVE9DT0xdID09IEFYMjVfUFJPVE9fREFNQV9TTEFWRSkKKwkJCWF4MjVfZGFtYV9vZmYoYXgyNSk7CisjZW5kaWYKKwkJYXgyNV9kaXNjb25uZWN0KGF4MjUsIEVORVRSRVNFVCk7CisJCWJyZWFrOworCisgIAljYXNlIEFYMjVfV0lORE9XOgorICAJCWlmIChheDI1LT5tb2R1bHVzID09IEFYMjVfTU9EVUxVUykgeworICAJCQlpZiAoYXgyNV9jdGwuYXJnIDwgMSB8fCBheDI1X2N0bC5hcmcgPiA3KQorICAJCQkJcmV0dXJuIC1FSU5WQUw7CisgIAkJfSBlbHNlIHsKKyAgCQkJaWYgKGF4MjVfY3RsLmFyZyA8IDEgfHwgYXgyNV9jdGwuYXJnID4gNjMpCisgIAkJCQlyZXR1cm4gLUVJTlZBTDsKKyAgCQl9CisgIAkJYXgyNS0+d2luZG93ID0gYXgyNV9jdGwuYXJnOworICAJCWJyZWFrOworCisgIAljYXNlIEFYMjVfVDE6CisJCWlmIChheDI1X2N0bC5hcmcgPCAxKQorICAJCQlyZXR1cm4gLUVJTlZBTDsKKyAgCQlheDI1LT5ydHQgPSAoYXgyNV9jdGwuYXJnICogSFopIC8gMjsKKyAgCQlheDI1LT50MSAgPSBheDI1X2N0bC5hcmcgKiBIWjsKKyAgCQlicmVhazsKKworICAJY2FzZSBBWDI1X1QyOgorICAJCWlmIChheDI1X2N0bC5hcmcgPCAxKQorICAJCQlyZXR1cm4gLUVJTlZBTDsKKyAgCQlheDI1LT50MiA9IGF4MjVfY3RsLmFyZyAqIEhaOworICAJCWJyZWFrOworCisgIAljYXNlIEFYMjVfTjI6CisgIAkJaWYgKGF4MjVfY3RsLmFyZyA8IDEgfHwgYXgyNV9jdGwuYXJnID4gMzEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKyAgCQlheDI1LT5uMmNvdW50ID0gMDsKKyAgCQlheDI1LT5uMiA9IGF4MjVfY3RsLmFyZzsKKyAgCQlicmVhazsKKworICAJY2FzZSBBWDI1X1QzOgorICAJCWlmIChheDI1X2N0bC5hcmcgPCAwKQorICAJCQlyZXR1cm4gLUVJTlZBTDsKKyAgCQlheDI1LT50MyA9IGF4MjVfY3RsLmFyZyAqIEhaOworICAJCWJyZWFrOworCisgIAljYXNlIEFYMjVfSURMRToKKyAgCQlpZiAoYXgyNV9jdGwuYXJnIDwgMCkKKyAgCQkJcmV0dXJuIC1FSU5WQUw7CisgIAkJYXgyNS0+aWRsZSA9IGF4MjVfY3RsLmFyZyAqIDYwICogSFo7CisgIAkJYnJlYWs7CisKKyAgCWNhc2UgQVgyNV9QQUNMRU46CisgIAkJaWYgKGF4MjVfY3RsLmFyZyA8IDE2IHx8IGF4MjVfY3RsLmFyZyA+IDY1NTM1KQorICAJCQlyZXR1cm4gLUVJTlZBTDsKKyAgCQlheDI1LT5wYWNsZW4gPSBheDI1X2N0bC5hcmc7CisgIAkJYnJlYWs7CisKKyAgCWRlZmF1bHQ6CisgIAkJcmV0dXJuIC1FSU5WQUw7CisJICB9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCUZpbGwgaW4gYSBjcmVhdGVkIEFYLjI1IGNyZWF0ZWQgY29udHJvbCBibG9jayB3aXRoIHRoZSBkZWZhdWx0CisgKgl2YWx1ZXMgZm9yIGEgcGFydGljdWxhciBkZXZpY2UuCisgKi8KK3ZvaWQgYXgyNV9maWxsaW5fY2IoYXgyNV9jYiAqYXgyNSwgYXgyNV9kZXYgKmF4MjVfZGV2KQoreworCWF4MjUtPmF4MjVfZGV2ID0gYXgyNV9kZXY7CisKKwlpZiAoYXgyNS0+YXgyNV9kZXYgIT0gTlVMTCkgeworCQlheDI1LT5ydHQgICAgID0gYXgyNV9kZXYtPnZhbHVlc1tBWDI1X1ZBTFVFU19UMV0gLyAyOworCQlheDI1LT50MSAgICAgID0gYXgyNV9kZXYtPnZhbHVlc1tBWDI1X1ZBTFVFU19UMV07CisJCWF4MjUtPnQyICAgICAgPSBheDI1X2Rldi0+dmFsdWVzW0FYMjVfVkFMVUVTX1QyXTsKKwkJYXgyNS0+dDMgICAgICA9IGF4MjVfZGV2LT52YWx1ZXNbQVgyNV9WQUxVRVNfVDNdOworCQlheDI1LT5uMiAgICAgID0gYXgyNV9kZXYtPnZhbHVlc1tBWDI1X1ZBTFVFU19OMl07CisJCWF4MjUtPnBhY2xlbiAgPSBheDI1X2Rldi0+dmFsdWVzW0FYMjVfVkFMVUVTX1BBQ0xFTl07CisJCWF4MjUtPmlkbGUgICAgPSBheDI1X2Rldi0+dmFsdWVzW0FYMjVfVkFMVUVTX0lETEVdOworCQlheDI1LT5iYWNrb2ZmID0gYXgyNV9kZXYtPnZhbHVlc1tBWDI1X1ZBTFVFU19CQUNLT0ZGXTsKKworCQlpZiAoYXgyNV9kZXYtPnZhbHVlc1tBWDI1X1ZBTFVFU19BWERFRk1PREVdKSB7CisJCQlheDI1LT5tb2R1bHVzID0gQVgyNV9FTU9EVUxVUzsKKwkJCWF4MjUtPndpbmRvdyAgPSBheDI1X2Rldi0+dmFsdWVzW0FYMjVfVkFMVUVTX0VXSU5ET1ddOworCQl9IGVsc2UgeworCQkJYXgyNS0+bW9kdWx1cyA9IEFYMjVfTU9EVUxVUzsKKwkJCWF4MjUtPndpbmRvdyAgPSBheDI1X2Rldi0+dmFsdWVzW0FYMjVfVkFMVUVTX1dJTkRPV107CisJCX0KKwl9IGVsc2UgeworCQlheDI1LT5ydHQgICAgID0gQVgyNV9ERUZfVDEgLyAyOworCQlheDI1LT50MSAgICAgID0gQVgyNV9ERUZfVDE7CisJCWF4MjUtPnQyICAgICAgPSBBWDI1X0RFRl9UMjsKKwkJYXgyNS0+dDMgICAgICA9IEFYMjVfREVGX1QzOworCQlheDI1LT5uMiAgICAgID0gQVgyNV9ERUZfTjI7CisJCWF4MjUtPnBhY2xlbiAgPSBBWDI1X0RFRl9QQUNMRU47CisJCWF4MjUtPmlkbGUgICAgPSBBWDI1X0RFRl9JRExFOworCQlheDI1LT5iYWNrb2ZmID0gQVgyNV9ERUZfQkFDS09GRjsKKworCQlpZiAoQVgyNV9ERUZfQVhERUZNT0RFKSB7CisJCQlheDI1LT5tb2R1bHVzID0gQVgyNV9FTU9EVUxVUzsKKwkJCWF4MjUtPndpbmRvdyAgPSBBWDI1X0RFRl9FV0lORE9XOworCQl9IGVsc2UgeworCQkJYXgyNS0+bW9kdWx1cyA9IEFYMjVfTU9EVUxVUzsKKwkJCWF4MjUtPndpbmRvdyAgPSBBWDI1X0RFRl9XSU5ET1c7CisJCX0KKwl9Cit9CisKKy8qCisgKiBDcmVhdGUgYW4gZW1wdHkgQVguMjUgY29udHJvbCBibG9jay4KKyAqLworYXgyNV9jYiAqYXgyNV9jcmVhdGVfY2Iodm9pZCkKK3sKKwlheDI1X2NiICpheDI1OworCisJaWYgKChheDI1ID0ga21hbGxvYyhzaXplb2YoKmF4MjUpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQoYXgyNSwgMHgwMCwgc2l6ZW9mKCpheDI1KSk7CisJYXRvbWljX3NldCgmYXgyNS0+cmVmY291bnQsIDEpOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmYXgyNS0+d3JpdGVfcXVldWUpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmF4MjUtPmZyYWdfcXVldWUpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmF4MjUtPmFja19xdWV1ZSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmYXgyNS0+cmVzZXFfcXVldWUpOworCisJaW5pdF90aW1lcigmYXgyNS0+dGltZXIpOworCWluaXRfdGltZXIoJmF4MjUtPnQxdGltZXIpOworCWluaXRfdGltZXIoJmF4MjUtPnQydGltZXIpOworCWluaXRfdGltZXIoJmF4MjUtPnQzdGltZXIpOworCWluaXRfdGltZXIoJmF4MjUtPmlkbGV0aW1lcik7CisKKwlheDI1X2ZpbGxpbl9jYihheDI1LCBOVUxMKTsKKworCWF4MjUtPnN0YXRlID0gQVgyNV9TVEFURV8wOworCisJcmV0dXJuIGF4MjU7Cit9CisKKy8qCisgKglIYW5kbGluZyBmb3Igc3lzdGVtIGNhbGxzIGFwcGxpZWQgdmlhIHRoZSB2YXJpb3VzIGludGVyZmFjZXMgdG8gYW4KKyAqCUFYMjUgc29ja2V0IG9iamVjdAorICovCisKK3N0YXRpYyBpbnQgYXgyNV9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlheDI1X2NiICpheDI1OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJY2hhciBkZXZuYW1lW0lGTkFNU0laXTsKKwlpbnQgb3B0LCByZXMgPSAwOworCisJaWYgKGxldmVsICE9IFNPTF9BWDI1KQorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCisJaWYgKG9wdGxlbiA8IHNpemVvZihpbnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChnZXRfdXNlcihvcHQsIChpbnQgX191c2VyICopb3B0dmFsKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlsb2NrX3NvY2soc2spOworCWF4MjUgPSBheDI1X3NrKHNrKTsKKworCXN3aXRjaCAob3B0bmFtZSkgeworCWNhc2UgQVgyNV9XSU5ET1c6CisJCWlmIChheDI1LT5tb2R1bHVzID09IEFYMjVfTU9EVUxVUykgeworCQkJaWYgKG9wdCA8IDEgfHwgb3B0ID4gNykgeworCQkJCXJlcyA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAob3B0IDwgMSB8fCBvcHQgPiA2MykgeworCQkJCXJlcyA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYXgyNS0+d2luZG93ID0gb3B0OworCQlicmVhazsKKworCWNhc2UgQVgyNV9UMToKKwkJaWYgKG9wdCA8IDEpIHsKKwkJCXJlcyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlheDI1LT5ydHQgPSAob3B0ICogSFopIC8gMjsKKwkJYXgyNS0+dDEgID0gb3B0ICogSFo7CisJCWJyZWFrOworCisJY2FzZSBBWDI1X1QyOgorCQlpZiAob3B0IDwgMSkgeworCQkJcmVzID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWF4MjUtPnQyID0gb3B0ICogSFo7CisJCWJyZWFrOworCisJY2FzZSBBWDI1X04yOgorCQlpZiAob3B0IDwgMSB8fCBvcHQgPiAzMSkgeworCQkJcmVzID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWF4MjUtPm4yID0gb3B0OworCQlicmVhazsKKworCWNhc2UgQVgyNV9UMzoKKwkJaWYgKG9wdCA8IDEpIHsKKwkJCXJlcyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlheDI1LT50MyA9IG9wdCAqIEhaOworCQlicmVhazsKKworCWNhc2UgQVgyNV9JRExFOgorCQlpZiAob3B0IDwgMCkgeworCQkJcmVzID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWF4MjUtPmlkbGUgPSBvcHQgKiA2MCAqIEhaOworCQlicmVhazsKKworCWNhc2UgQVgyNV9CQUNLT0ZGOgorCQlpZiAob3B0IDwgMCB8fCBvcHQgPiAyKSB7CisJCQlyZXMgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJYXgyNS0+YmFja29mZiA9IG9wdDsKKwkJYnJlYWs7CisKKwljYXNlIEFYMjVfRVhUU0VROgorCQlheDI1LT5tb2R1bHVzID0gb3B0ID8gQVgyNV9FTU9EVUxVUyA6IEFYMjVfTU9EVUxVUzsKKwkJYnJlYWs7CisKKwljYXNlIEFYMjVfUElESU5DTDoKKwkJYXgyNS0+cGlkaW5jbCA9IG9wdCA/IDEgOiAwOworCQlicmVhazsKKworCWNhc2UgQVgyNV9JQU1ESUdJOgorCQlheDI1LT5pYW1kaWdpID0gb3B0ID8gMSA6IDA7CisJCWJyZWFrOworCisJY2FzZSBBWDI1X1BBQ0xFTjoKKwkJaWYgKG9wdCA8IDE2IHx8IG9wdCA+IDY1NTM1KSB7CisJCQlyZXMgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJYXgyNS0+cGFjbGVuID0gb3B0OworCQlicmVhazsKKworCWNhc2UgU09fQklORFRPREVWSUNFOgorCQlpZiAob3B0bGVuID4gSUZOQU1TSVopCisJCQlvcHRsZW49SUZOQU1TSVo7CisJCWlmIChjb3B5X2Zyb21fdXNlcihkZXZuYW1lLCBvcHR2YWwsIG9wdGxlbikpIHsKKwkJcmVzID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJZGV2ID0gZGV2X2dldF9ieV9uYW1lKGRldm5hbWUpOworCQlpZiAoZGV2ID09IE5VTEwpIHsKKwkJCXJlcyA9IC1FTk9ERVY7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzay0+c2tfdHlwZSA9PSBTT0NLX1NFUVBBQ0tFVCAmJgorCQkgICAoc29jay0+c3RhdGUgIT0gU1NfVU5DT05ORUNURUQgfHwKKwkJICAgIHNrLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOKSkgeworCQkJcmVzID0gLUVBRERSTk9UQVZBSUw7CisJCQlkZXZfcHV0KGRldik7CisJCQlicmVhazsKKwkJfQorCisJCWF4MjUtPmF4MjVfZGV2ID0gYXgyNV9kZXZfYXgyNWRldihkZXYpOworCQlheDI1X2ZpbGxpbl9jYihheDI1LCBheDI1LT5heDI1X2Rldik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmVzID0gLUVOT1BST1RPT1BUOworCX0KKwlyZWxlYXNlX3NvY2soc2spOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBheDI1X2dldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwljaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJYXgyNV9jYiAqYXgyNTsKKwlzdHJ1Y3QgYXgyNV9kZXYgKmF4MjVfZGV2OworCWNoYXIgZGV2bmFtZVtJRk5BTVNJWl07CisJdm9pZCAqdmFscHRyOworCWludCB2YWwgPSAwOworCWludCBtYXhsZW4sIGxlbmd0aDsKKworCWlmIChsZXZlbCAhPSBTT0xfQVgyNSkKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKworCWlmIChnZXRfdXNlcihtYXhsZW4sIG9wdGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKG1heGxlbiA8IDEpCisJCXJldHVybiAtRUZBVUxUOworCisJdmFscHRyID0gKHZvaWQgKikgJnZhbDsKKwlsZW5ndGggPSBtaW5fdCh1bnNpZ25lZCBpbnQsIG1heGxlbiwgc2l6ZW9mKGludCkpOworCisJbG9ja19zb2NrKHNrKTsKKwlheDI1ID0gYXgyNV9zayhzayk7CisKKwlzd2l0Y2ggKG9wdG5hbWUpIHsKKwljYXNlIEFYMjVfV0lORE9XOgorCQl2YWwgPSBheDI1LT53aW5kb3c7CisJCWJyZWFrOworCisJY2FzZSBBWDI1X1QxOgorCQl2YWwgPSBheDI1LT50MSAvIEhaOworCQlicmVhazsKKworCWNhc2UgQVgyNV9UMjoKKwkJdmFsID0gYXgyNS0+dDIgLyBIWjsKKwkJYnJlYWs7CisKKwljYXNlIEFYMjVfTjI6CisJCXZhbCA9IGF4MjUtPm4yOworCQlicmVhazsKKworCWNhc2UgQVgyNV9UMzoKKwkJdmFsID0gYXgyNS0+dDMgLyBIWjsKKwkJYnJlYWs7CisKKwljYXNlIEFYMjVfSURMRToKKwkJdmFsID0gYXgyNS0+aWRsZSAvICg2MCAqIEhaKTsKKwkJYnJlYWs7CisKKwljYXNlIEFYMjVfQkFDS09GRjoKKwkJdmFsID0gYXgyNS0+YmFja29mZjsKKwkJYnJlYWs7CisKKwljYXNlIEFYMjVfRVhUU0VROgorCQl2YWwgPSAoYXgyNS0+bW9kdWx1cyA9PSBBWDI1X0VNT0RVTFVTKTsKKwkJYnJlYWs7CisKKwljYXNlIEFYMjVfUElESU5DTDoKKwkJdmFsID0gYXgyNS0+cGlkaW5jbDsKKwkJYnJlYWs7CisKKwljYXNlIEFYMjVfSUFNRElHSToKKwkJdmFsID0gYXgyNS0+aWFtZGlnaTsKKwkJYnJlYWs7CisKKwljYXNlIEFYMjVfUEFDTEVOOgorCQl2YWwgPSBheDI1LT5wYWNsZW47CisJCWJyZWFrOworCisJY2FzZSBTT19CSU5EVE9ERVZJQ0U6CisJCWF4MjVfZGV2ID0gYXgyNS0+YXgyNV9kZXY7CisKKwkJaWYgKGF4MjVfZGV2ICE9IE5VTEwgJiYgYXgyNV9kZXYtPmRldiAhPSBOVUxMKSB7CisJCQlzdHJsY3B5KGRldm5hbWUsIGF4MjVfZGV2LT5kZXYtPm5hbWUsIHNpemVvZihkZXZuYW1lKSk7CisJCQlsZW5ndGggPSBzdHJsZW4oZGV2bmFtZSkgKyAxOworCQl9IGVsc2UgeworCQkJKmRldm5hbWUgPSAnXDAnOworCQkJbGVuZ3RoID0gMTsKKwkJfQorCisJCXZhbHB0ciA9ICh2b2lkICopIGRldm5hbWU7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKwl9CisJcmVsZWFzZV9zb2NrKHNrKTsKKworCWlmIChwdXRfdXNlcihsZW5ndGgsIG9wdGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGNvcHlfdG9fdXNlcihvcHR2YWwsIHZhbHB0ciwgbGVuZ3RoKSA/IC1FRkFVTFQgOiAwOworfQorCitzdGF0aWMgaW50IGF4MjVfbGlzdGVuKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBiYWNrbG9nKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCByZXMgPSAwOworCisJbG9ja19zb2NrKHNrKTsKKwlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19TRVFQQUNLRVQgJiYgc2stPnNrX3N0YXRlICE9IFRDUF9MSVNURU4pIHsKKwkJc2stPnNrX21heF9hY2tfYmFja2xvZyA9IGJhY2tsb2c7CisJCXNrLT5za19zdGF0ZSAgICAgICAgICAgPSBUQ1BfTElTVEVOOworCQlnb3RvIG91dDsKKwl9CisJcmVzID0gLUVPUE5PVFNVUFA7CisKK291dDoKKwlyZWxlYXNlX3NvY2soc2spOworCisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqIFhYWDogd2hlbiBjcmVhdGluZyBheDI1X3NvY2sgd2Ugc2hvdWxkIHVwZGF0ZSB0aGUgLm9ial9zaXplIHNldHRpbmcKKyAqIGJlbG93LgorICovCitzdGF0aWMgc3RydWN0IHByb3RvIGF4MjVfcHJvdG8gPSB7CisJLm5hbWUJICA9ICJBWDI1IiwKKwkub3duZXIJICA9IFRISVNfTU9EVUxFLAorCS5vYmpfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc29jayksCit9OworCitzdGF0aWMgaW50IGF4MjVfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisJYXgyNV9jYiAqYXgyNTsKKworCXN3aXRjaCAoc29jay0+dHlwZSkgeworCWNhc2UgU09DS19ER1JBTToKKwkJaWYgKHByb3RvY29sID09IDAgfHwgcHJvdG9jb2wgPT0gUEZfQVgyNSkKKwkJCXByb3RvY29sID0gQVgyNV9QX1RFWFQ7CisJCWJyZWFrOworCisJY2FzZSBTT0NLX1NFUVBBQ0tFVDoKKwkJc3dpdGNoIChwcm90b2NvbCkgeworCQljYXNlIDA6CisJCWNhc2UgUEZfQVgyNToJLyogRm9yIENMWCAqLworCQkJcHJvdG9jb2wgPSBBWDI1X1BfVEVYVDsKKwkJCWJyZWFrOworCQljYXNlIEFYMjVfUF9TRUdNRU5UOgorI2lmZGVmIENPTkZJR19JTkVUCisJCWNhc2UgQVgyNV9QX0FSUDoKKwkJY2FzZSBBWDI1X1BfSVA6CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTkVUUk9NCisJCWNhc2UgQVgyNV9QX05FVFJPTToKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ST1NFCisJCWNhc2UgQVgyNV9QX1JPU0U6CisjZW5kaWYKKwkJCXJldHVybiAtRVNPQ0tUTk9TVVBQT1JUOworI2lmZGVmIENPTkZJR19ORVRST01fTU9EVUxFCisJCWNhc2UgQVgyNV9QX05FVFJPTToKKwkJCWlmIChheDI1X3Byb3RvY29sX2lzX3JlZ2lzdGVyZWQoQVgyNV9QX05FVFJPTSkpCisJCQkJcmV0dXJuIC1FU09DS1ROT1NVUFBPUlQ7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUk9TRV9NT0RVTEUKKwkJY2FzZSBBWDI1X1BfUk9TRToKKwkJCWlmIChheDI1X3Byb3RvY29sX2lzX3JlZ2lzdGVyZWQoQVgyNV9QX1JPU0UpKQorCQkJCXJldHVybiAtRVNPQ0tUTk9TVVBQT1JUOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU09DS19SQVc6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRVNPQ0tUTk9TVVBQT1JUOworCX0KKworCWlmICgoc2sgPSBza19hbGxvYyhQRl9BWDI1LCBHRlBfQVRPTUlDLCAmYXgyNV9wcm90bywgMSkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJYXgyNSA9IHNrLT5za19wcm90aW5mbyA9IGF4MjVfY3JlYXRlX2NiKCk7CisJaWYgKCFheDI1KSB7CisJCXNrX2ZyZWUoc2spOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisKKwlzay0+c2tfZGVzdHJ1Y3QgPSBheDI1X2ZyZWVfc29jazsKKwlzb2NrLT5vcHMgICAgPSAmYXgyNV9wcm90b19vcHM7CisJc2stPnNrX3Byb3RvY29sID0gcHJvdG9jb2w7CisKKwlheDI1LT5zayAgICA9IHNrOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzb2NrICpheDI1X21ha2VfbmV3KHN0cnVjdCBzb2NrICpvc2ssIHN0cnVjdCBheDI1X2RldiAqYXgyNV9kZXYpCit7CisJc3RydWN0IHNvY2sgKnNrOworCWF4MjVfY2IgKmF4MjUsICpvYXgyNTsKKworCWlmICgoc2sgPSBza19hbGxvYyhQRl9BWDI1LCBHRlBfQVRPTUlDLCBvc2stPnNrX3Byb3QsIDEpKSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICgoYXgyNSA9IGF4MjVfY3JlYXRlX2NiKCkpID09IE5VTEwpIHsKKwkJc2tfZnJlZShzayk7CisJCXJldHVybiBOVUxMOworCX0KKworCXN3aXRjaCAob3NrLT5za190eXBlKSB7CisJY2FzZSBTT0NLX0RHUkFNOgorCQlicmVhazsKKwljYXNlIFNPQ0tfU0VRUEFDS0VUOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlza19mcmVlKHNrKTsKKwkJYXgyNV9jYl9wdXQoYXgyNSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXNvY2tfaW5pdF9kYXRhKE5VTEwsIHNrKTsKKworCXNrLT5za19kZXN0cnVjdCA9IGF4MjVfZnJlZV9zb2NrOworCXNrLT5za190eXBlICAgICA9IG9zay0+c2tfdHlwZTsKKwlzay0+c2tfc29ja2V0ICAgPSBvc2stPnNrX3NvY2tldDsKKwlzay0+c2tfcHJpb3JpdHkgPSBvc2stPnNrX3ByaW9yaXR5OworCXNrLT5za19wcm90b2NvbCA9IG9zay0+c2tfcHJvdG9jb2w7CisJc2stPnNrX3JjdmJ1ZiAgID0gb3NrLT5za19yY3ZidWY7CisJc2stPnNrX3NuZGJ1ZiAgID0gb3NrLT5za19zbmRidWY7CisJc2stPnNrX3N0YXRlICAgID0gVENQX0VTVEFCTElTSEVEOworCXNrLT5za19zbGVlcCAgICA9IG9zay0+c2tfc2xlZXA7CisKKwlpZiAoc29ja19mbGFnKG9zaywgU09DS19EQkcpKQorCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX0RCRyk7CisKKwlpZiAoc29ja19mbGFnKG9zaywgU09DS19aQVBQRUQpKQorCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX1pBUFBFRCk7CisKKwlvYXgyNSA9IGF4MjVfc2sob3NrKTsKKworCWF4MjUtPm1vZHVsdXMgPSBvYXgyNS0+bW9kdWx1czsKKwlheDI1LT5iYWNrb2ZmID0gb2F4MjUtPmJhY2tvZmY7CisJYXgyNS0+cGlkaW5jbCA9IG9heDI1LT5waWRpbmNsOworCWF4MjUtPmlhbWRpZ2kgPSBvYXgyNS0+aWFtZGlnaTsKKwlheDI1LT5ydHQgICAgID0gb2F4MjUtPnJ0dDsKKwlheDI1LT50MSAgICAgID0gb2F4MjUtPnQxOworCWF4MjUtPnQyICAgICAgPSBvYXgyNS0+dDI7CisJYXgyNS0+dDMgICAgICA9IG9heDI1LT50MzsKKwlheDI1LT5uMiAgICAgID0gb2F4MjUtPm4yOworCWF4MjUtPmlkbGUgICAgPSBvYXgyNS0+aWRsZTsKKwlheDI1LT5wYWNsZW4gID0gb2F4MjUtPnBhY2xlbjsKKwlheDI1LT53aW5kb3cgID0gb2F4MjUtPndpbmRvdzsKKworCWF4MjUtPmF4MjVfZGV2ICAgID0gYXgyNV9kZXY7CisJYXgyNS0+c291cmNlX2FkZHIgPSBvYXgyNS0+c291cmNlX2FkZHI7CisKKwlpZiAob2F4MjUtPmRpZ2lwZWF0ICE9IE5VTEwpIHsKKwkJaWYgKChheDI1LT5kaWdpcGVhdCA9IGttYWxsb2Moc2l6ZW9mKGF4MjVfZGlnaSksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCQlza19mcmVlKHNrKTsKKwkJCWF4MjVfY2JfcHV0KGF4MjUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZW1jcHkoYXgyNS0+ZGlnaXBlYXQsIG9heDI1LT5kaWdpcGVhdCwgc2l6ZW9mKGF4MjVfZGlnaSkpOworCX0KKworCXNrLT5za19wcm90aW5mbyA9IGF4MjU7CisJYXgyNS0+c2sgICAgPSBzazsKKworCXJldHVybiBzazsKK30KKworc3RhdGljIGludCBheDI1X3JlbGVhc2Uoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlheDI1X2NiICpheDI1OworCisJaWYgKHNrID09IE5VTEwpCisJCXJldHVybiAwOworCisJc29ja19ob2xkKHNrKTsKKwlzb2NrX29ycGhhbihzayk7CisJbG9ja19zb2NrKHNrKTsKKwlheDI1ID0gYXgyNV9zayhzayk7CisKKwlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19TRVFQQUNLRVQpIHsKKwkJc3dpdGNoIChheDI1LT5zdGF0ZSkgeworCQljYXNlIEFYMjVfU1RBVEVfMDoKKwkJCXJlbGVhc2Vfc29jayhzayk7CisJCQlheDI1X2Rpc2Nvbm5lY3QoYXgyNSwgMCk7CisJCQlsb2NrX3NvY2soc2spOworCQkJYXgyNV9kZXN0cm95X3NvY2tldChheDI1KTsKKwkJCWJyZWFrOworCisJCWNhc2UgQVgyNV9TVEFURV8xOgorCQljYXNlIEFYMjVfU1RBVEVfMjoKKwkJCWF4MjVfc2VuZF9jb250cm9sKGF4MjUsIEFYMjVfRElTQywgQVgyNV9QT0xMT04sIEFYMjVfQ09NTUFORCk7CisJCQlyZWxlYXNlX3NvY2soc2spOworCQkJYXgyNV9kaXNjb25uZWN0KGF4MjUsIDApOworCQkJbG9ja19zb2NrKHNrKTsKKwkJCWF4MjVfZGVzdHJveV9zb2NrZXQoYXgyNSk7CisJCQlicmVhazsKKworCQljYXNlIEFYMjVfU1RBVEVfMzoKKwkJY2FzZSBBWDI1X1NUQVRFXzQ6CisJCQlheDI1X2NsZWFyX3F1ZXVlcyhheDI1KTsKKwkJCWF4MjUtPm4yY291bnQgPSAwOworCisJCQlzd2l0Y2ggKGF4MjUtPmF4MjVfZGV2LT52YWx1ZXNbQVgyNV9WQUxVRVNfUFJPVE9DT0xdKSB7CisJCQljYXNlIEFYMjVfUFJPVE9fU1REX1NJTVBMRVg6CisJCQljYXNlIEFYMjVfUFJPVE9fU1REX0RVUExFWDoKKwkJCQlheDI1X3NlbmRfY29udHJvbChheDI1LAorCQkJCQkJICBBWDI1X0RJU0MsCisJCQkJCQkgIEFYMjVfUE9MTE9OLAorCQkJCQkJICBBWDI1X0NPTU1BTkQpOworCQkJCWF4MjVfc3RvcF90MnRpbWVyKGF4MjUpOworCQkJCWF4MjVfc3RvcF90M3RpbWVyKGF4MjUpOworCQkJCWF4MjVfc3RvcF9pZGxldGltZXIoYXgyNSk7CisJCQkJYnJlYWs7CisjaWZkZWYgQ09ORklHX0FYMjVfREFNQV9TTEFWRQorCQkJY2FzZSBBWDI1X1BST1RPX0RBTUFfU0xBVkU6CisJCQkJYXgyNV9zdG9wX3QzdGltZXIoYXgyNSk7CisJCQkJYXgyNV9zdG9wX2lkbGV0aW1lcihheDI1KTsKKwkJCQlicmVhazsKKyNlbmRpZgorCQkJfQorCQkJYXgyNV9jYWxjdWxhdGVfdDEoYXgyNSk7CisJCQlheDI1X3N0YXJ0X3QxdGltZXIoYXgyNSk7CisJCQlheDI1LT5zdGF0ZSA9IEFYMjVfU1RBVEVfMjsKKwkJCXNrLT5za19zdGF0ZSAgICAgICAgICAgICAgICA9IFRDUF9DTE9TRTsKKwkJCXNrLT5za19zaHV0ZG93biAgICAgICAgICAgIHw9IFNFTkRfU0hVVERPV047CisJCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKKwkJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfREVTVFJPWSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlzay0+c2tfc3RhdGUgICAgID0gVENQX0NMT1NFOworCQlzay0+c2tfc2h1dGRvd24gfD0gU0VORF9TSFVURE9XTjsKKwkJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisJCWF4MjVfZGVzdHJveV9zb2NrZXQoYXgyNSk7CisJfQorCisJc29jay0+c2sgICA9IE5VTEw7CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlzb2NrX3B1dChzayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCVdlIHN1cHBvcnQgYSBmdW5ueSBleHRlbnNpb24gaGVyZSBzbyB5b3UgY2FuIChhcyByb290KSBnaXZlIGFueSBjYWxsc2lnbgorICoJZGlnaXBlYXRlZCB2aWEgYSBsb2NhbCBhZGRyZXNzIGFzIHNvdXJjZS4gVGhpcyBoYWNrIGlzIG9ic29sZXRlIG5vdworICoJdGhhdCB3ZSd2ZSBpbXBsZW1lbnRlZCBzdXBwb3J0IGZvciBTT19CSU5EVE9ERVZJQ0UuIEl0IGlzIGhvd2V2ZXIgc21hbGwKKyAqCWFuZCB0cml2aWFsbHkgYmFja3dhcmQgY29tcGF0aWJsZS4KKyAqLworc3RhdGljIGludCBheDI1X2JpbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwgaW50IGFkZHJfbGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBmdWxsX3NvY2thZGRyX2F4MjUgKmFkZHIgPSAoc3RydWN0IGZ1bGxfc29ja2FkZHJfYXgyNSAqKXVhZGRyOworCWF4MjVfZGV2ICpheDI1X2RldiA9IE5VTEw7CisJYXgyNV9hZGRyZXNzICpjYWxsOworCWF4MjVfY2IgKmF4MjU7CisJaW50IGVyciA9IDA7CisKKwlpZiAoYWRkcl9sZW4gIT0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9heDI1KSAmJgorCSAgICBhZGRyX2xlbiAhPSBzaXplb2Yoc3RydWN0IGZ1bGxfc29ja2FkZHJfYXgyNSkpIHsKKwkJLyogc3VwcG9ydCBmb3Igb2xkIHN0cnVjdHVyZSBtYXkgZ28gYXdheSBzb21lIHRpbWUgKi8KKwkJaWYgKChhZGRyX2xlbiA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfYXgyNSkgKyBzaXplb2YoYXgyNV9hZGRyZXNzKSAqIDYpIHx8CisJCSAgICAoYWRkcl9sZW4gPiBzaXplb2Yoc3RydWN0IGZ1bGxfc29ja2FkZHJfYXgyNSkpKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXgyNV9iaW5kKCk6ICVzIHVzZXMgb2xkICg2IGRpZ2lwZWF0ZXIpIHNvY2tldCBzdHJ1Y3R1cmUuXG4iLAorCQkJY3VycmVudC0+Y29tbSk7CisJfQorCisJaWYgKGFkZHItPmZzYV9heDI1LnNheDI1X2ZhbWlseSAhPSBBRl9BWDI1KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNhbGwgPSBheDI1X2ZpbmRieXVpZChjdXJyZW50LT5ldWlkKTsKKwlpZiAoY2FsbCA9PSBOVUxMICYmIGF4MjVfdWlkX3BvbGljeSAmJiAhY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwlsb2NrX3NvY2soc2spOworCisJYXgyNSA9IGF4MjVfc2soc2spOworCWlmICghc29ja19mbGFnKHNrLCBTT0NLX1pBUFBFRCkpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGNhbGwgPT0gTlVMTCkKKwkJYXgyNS0+c291cmNlX2FkZHIgPSBhZGRyLT5mc2FfYXgyNS5zYXgyNV9jYWxsOworCWVsc2UKKwkJYXgyNS0+c291cmNlX2FkZHIgPSAqY2FsbDsKKworCS8qCisJICogVXNlciBhbHJlYWR5IHNldCBpbnRlcmZhY2Ugd2l0aCBTT19CSU5EVE9ERVZJQ0UKKwkgKi8KKwlpZiAoYXgyNS0+YXgyNV9kZXYgIT0gTlVMTCkKKwkJZ290byBkb25lOworCisJaWYgKGFkZHJfbGVuID4gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9heDI1KSAmJiBhZGRyLT5mc2FfYXgyNS5zYXgyNV9uZGlnaXMgPT0gMSkgeworCQlpZiAoYXgyNWNtcCgmYWRkci0+ZnNhX2RpZ2lwZWF0ZXJbMF0sICZudWxsX2F4MjVfYWRkcmVzcykgIT0gMCAmJgorCQkgICAgKGF4MjVfZGV2ID0gYXgyNV9hZGRyX2F4MjVkZXYoJmFkZHItPmZzYV9kaWdpcGVhdGVyWzBdKSkgPT0gTlVMTCkgeworCQkJZXJyID0gLUVBRERSTk9UQVZBSUw7CisJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgoYXgyNV9kZXYgPSBheDI1X2FkZHJfYXgyNWRldigmYWRkci0+ZnNhX2F4MjUuc2F4MjVfY2FsbCkpID09IE5VTEwpIHsKKwkJCWVyciA9IC1FQUREUk5PVEFWQUlMOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoYXgyNV9kZXYgIT0gTlVMTCkKKwkJYXgyNV9maWxsaW5fY2IoYXgyNSwgYXgyNV9kZXYpOworCitkb25lOgorCWF4MjVfY2JfYWRkKGF4MjUpOworCXNvY2tfcmVzZXRfZmxhZyhzaywgU09DS19aQVBQRUQpOworCitvdXQ6CisJcmVsZWFzZV9zb2NrKHNrKTsKKworCXJldHVybiAwOworfQorCisvKgorICoJRklYTUU6IG5vbmJsb2NrIGJlaGF2aW91ciBsb29rcyBsaWtlIGl0IG1heSBoYXZlIGEgYnVnLgorICovCitzdGF0aWMgaW50IGF4MjVfY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLAorCWludCBhZGRyX2xlbiwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWF4MjVfY2IgKmF4MjUgPSBheDI1X3NrKHNrKSwgKmF4MjV0OworCXN0cnVjdCBmdWxsX3NvY2thZGRyX2F4MjUgKmZzYSA9IChzdHJ1Y3QgZnVsbF9zb2NrYWRkcl9heDI1ICopdWFkZHI7CisJYXgyNV9kaWdpICpkaWdpID0gTlVMTDsKKwlpbnQgY3QgPSAwLCBlcnIgPSAwOworCisJLyoKKwkgKiBzb21lIHNhbml0eSBjaGVja3MuIGNvZGUgZnVydGhlciBkb3duIGRlcGVuZHMgb24gdGhpcworCSAqLworCisJaWYgKGFkZHJfbGVuID09IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfYXgyNSkpIHsKKwkJLyogc3VwcG9ydCBmb3IgdGhpcyB3aWxsIGdvIGF3YXkgaW4gZWFybHkgMi41LnggKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXgyNV9jb25uZWN0KCk6ICVzIHVzZXMgb2Jzb2xldGUgc29ja2V0IHN0cnVjdHVyZVxuIiwKKwkJCWN1cnJlbnQtPmNvbW0pOworCX0KKwllbHNlIGlmIChhZGRyX2xlbiAhPSBzaXplb2Yoc3RydWN0IGZ1bGxfc29ja2FkZHJfYXgyNSkpIHsKKwkJLyogc3VwcG9ydCBmb3Igb2xkIHN0cnVjdHVyZSBtYXkgZ28gYXdheSBzb21lIHRpbWUgKi8KKwkJaWYgKChhZGRyX2xlbiA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfYXgyNSkgKyBzaXplb2YoYXgyNV9hZGRyZXNzKSAqIDYpIHx8CisJCSAgICAoYWRkcl9sZW4gPiBzaXplb2Yoc3RydWN0IGZ1bGxfc29ja2FkZHJfYXgyNSkpKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImF4MjVfY29ubmVjdCgpOiAlcyB1c2VzIG9sZCAoNiBkaWdpcGVhdGVyKSBzb2NrZXQgc3RydWN0dXJlLlxuIiwKKwkJCWN1cnJlbnQtPmNvbW0pOworCX0KKworCWlmIChmc2EtPmZzYV9heDI1LnNheDI1X2ZhbWlseSAhPSBBRl9BWDI1KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxvY2tfc29jayhzayk7CisKKwkvKiBkZWFsIHdpdGggcmVzdGFydHMgKi8KKwlpZiAoc29jay0+c3RhdGUgPT0gU1NfQ09OTkVDVElORykgeworCQlzd2l0Y2ggKHNrLT5za19zdGF0ZSkgeworCQljYXNlIFRDUF9TWU5fU0VOVDogLyogc3RpbGwgdHJ5aW5nICovCisJCQllcnIgPSAtRUlOUFJPR1JFU1M7CisJCQlnb3RvIG91dDsKKworCQljYXNlIFRDUF9FU1RBQkxJU0hFRDogLyogY29ubmVjdGlvbiBlc3RhYmxpc2hlZCAqLworCQkJc29jay0+c3RhdGUgPSBTU19DT05ORUNURUQ7CisJCQlnb3RvIG91dDsKKworCQljYXNlIFRDUF9DTE9TRTogLyogY29ubmVjdGlvbiByZWZ1c2VkICovCisJCQlzb2NrLT5zdGF0ZSA9IFNTX1VOQ09OTkVDVEVEOworCQkJZXJyID0gLUVDT05OUkVGVVNFRDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfRVNUQUJMSVNIRUQgJiYgc2stPnNrX3R5cGUgPT0gU09DS19TRVFQQUNLRVQpIHsKKwkJZXJyID0gLUVJU0NPTk47CS8qIE5vIHJlY29ubmVjdCBvbiBhIHNlcXBhY2tldCBzb2NrZXQgKi8KKwkJZ290byBvdXQ7CisJfQorCisJc2stPnNrX3N0YXRlICAgPSBUQ1BfQ0xPU0U7CisJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKKworCWlmIChheDI1LT5kaWdpcGVhdCAhPSBOVUxMKSB7CisJCWtmcmVlKGF4MjUtPmRpZ2lwZWF0KTsKKwkJYXgyNS0+ZGlnaXBlYXQgPSBOVUxMOworCX0KKworCS8qCisJICoJSGFuZGxlIGRpZ2ktcGVhdGVycyB0byBiZSB1c2VkLgorCSAqLworCWlmIChhZGRyX2xlbiA+IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfYXgyNSkgJiYKKwkgICAgZnNhLT5mc2FfYXgyNS5zYXgyNV9uZGlnaXMgIT0gMCkgeworCQkvKiBWYWxpZCBudW1iZXIgb2YgZGlnaXBlYXRlcnMgPyAqLworCQlpZiAoZnNhLT5mc2FfYXgyNS5zYXgyNV9uZGlnaXMgPCAxIHx8IGZzYS0+ZnNhX2F4MjUuc2F4MjVfbmRpZ2lzID4gQVgyNV9NQVhfRElHSVMpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmICgoZGlnaSA9IGttYWxsb2Moc2l6ZW9mKGF4MjVfZGlnaSksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCQllcnIgPSAtRU5PQlVGUzsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZGlnaS0+bmRpZ2kgICAgICA9IGZzYS0+ZnNhX2F4MjUuc2F4MjVfbmRpZ2lzOworCQlkaWdpLT5sYXN0cmVwZWF0ID0gLTE7CisKKwkJd2hpbGUgKGN0IDwgZnNhLT5mc2FfYXgyNS5zYXgyNV9uZGlnaXMpIHsKKwkJCWlmICgoZnNhLT5mc2FfZGlnaXBlYXRlcltjdF0uYXgyNV9jYWxsWzZdICYKKwkJCSAgICAgQVgyNV9IQklUKSAmJiBheDI1LT5pYW1kaWdpKSB7CisJCQkJZGlnaS0+cmVwZWF0ZWRbY3RdID0gMTsKKwkJCQlkaWdpLT5sYXN0cmVwZWF0ICAgPSBjdDsKKwkJCX0gZWxzZSB7CisJCQkJZGlnaS0+cmVwZWF0ZWRbY3RdID0gMDsKKwkJCX0KKwkJCWRpZ2ktPmNhbGxzW2N0XSA9IGZzYS0+ZnNhX2RpZ2lwZWF0ZXJbY3RdOworCQkJY3QrKzsKKwkJfQorCX0KKworCS8qCisJICoJTXVzdCBiaW5kIGZpcnN0IC0gYXV0b2JpbmRpbmcgaW4gdGhpcyBtYXkgb3IgbWF5IG5vdCB3b3JrLiBJZgorCSAqCXRoZSBzb2NrZXQgaXMgYWxyZWFkeSBib3VuZCwgY2hlY2sgdG8gc2VlIGlmIHRoZSBkZXZpY2UgaGFzCisJICoJYmVlbiBmaWxsZWQgaW4sIGVycm9yIGlmIGl0IGhhc24ndC4KKwkgKi8KKwlpZiAoc29ja19mbGFnKHNrLCBTT0NLX1pBUFBFRCkpIHsKKwkJLyogY2hlY2sgaWYgd2UgY2FuIHJlbW92ZSB0aGlzIGZlYXR1cmUuIEl0IGlzIGJyb2tlbi4gKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXgyNV9jb25uZWN0KCk6ICVzIHVzZXMgYXV0b2JpbmQsIHBsZWFzZSBjb250YWN0IGpyZXV0ZXJAeWFpbmEuZGVcbiIsCisJCQljdXJyZW50LT5jb21tKTsKKwkJaWYgKChlcnIgPSBheDI1X3J0X2F1dG9iaW5kKGF4MjUsICZmc2EtPmZzYV9heDI1LnNheDI1X2NhbGwpKSA8IDApIHsKKwkJCWtmcmVlKGRpZ2kpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlheDI1X2ZpbGxpbl9jYihheDI1LCBheDI1LT5heDI1X2Rldik7CisJCWF4MjVfY2JfYWRkKGF4MjUpOworCX0gZWxzZSB7CisJCWlmIChheDI1LT5heDI1X2RldiA9PSBOVUxMKSB7CisJCQlrZnJlZShkaWdpKTsKKwkJCWVyciA9IC1FSE9TVFVOUkVBQ0g7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmIChzay0+c2tfdHlwZSA9PSBTT0NLX1NFUVBBQ0tFVCAmJgorCSAgICAoYXgyNXQ9YXgyNV9maW5kX2NiKCZheDI1LT5zb3VyY2VfYWRkciwgJmZzYS0+ZnNhX2F4MjUuc2F4MjVfY2FsbCwgZGlnaSwKKwkJICAgIAkgYXgyNS0+YXgyNV9kZXYtPmRldikpKSB7CisJCWtmcmVlKGRpZ2kpOworCQllcnIgPSAtRUFERFJJTlVTRTsJCS8qIEFscmVhZHkgc3VjaCBhIGNvbm5lY3Rpb24gKi8KKwkJYXgyNV9jYl9wdXQoYXgyNXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlheDI1LT5kZXN0X2FkZHIgPSBmc2EtPmZzYV9heDI1LnNheDI1X2NhbGw7CisJYXgyNS0+ZGlnaXBlYXQgID0gZGlnaTsKKworCS8qIEZpcnN0IHRoZSBlYXN5IG9uZSAqLworCWlmIChzay0+c2tfdHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCkgeworCQlzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKwkJc2stPnNrX3N0YXRlICAgPSBUQ1BfRVNUQUJMSVNIRUQ7CisJCWdvdG8gb3V0OworCX0KKworCS8qIE1vdmUgdG8gY29ubmVjdGluZyBzb2NrZXQsIGF4LjI1IGxhcGIgV0FJVF9VQS4uICovCisJc29jay0+c3RhdGUgICAgICAgID0gU1NfQ09OTkVDVElORzsKKwlzay0+c2tfc3RhdGUgICAgICAgICAgPSBUQ1BfU1lOX1NFTlQ7CisKKwlzd2l0Y2ggKGF4MjUtPmF4MjVfZGV2LT52YWx1ZXNbQVgyNV9WQUxVRVNfUFJPVE9DT0xdKSB7CisJY2FzZSBBWDI1X1BST1RPX1NURF9TSU1QTEVYOgorCWNhc2UgQVgyNV9QUk9UT19TVERfRFVQTEVYOgorCQlheDI1X3N0ZF9lc3RhYmxpc2hfZGF0YV9saW5rKGF4MjUpOworCQlicmVhazsKKworI2lmZGVmIENPTkZJR19BWDI1X0RBTUFfU0xBVkUKKwljYXNlIEFYMjVfUFJPVE9fREFNQV9TTEFWRToKKwkJYXgyNS0+bW9kdWx1cyA9IEFYMjVfTU9EVUxVUzsKKwkJYXgyNS0+d2luZG93ICA9IGF4MjUtPmF4MjVfZGV2LT52YWx1ZXNbQVgyNV9WQUxVRVNfV0lORE9XXTsKKwkJaWYgKGF4MjUtPmF4MjVfZGV2LT5kYW1hLnNsYXZlKQorCQkJYXgyNV9kc19lc3RhYmxpc2hfZGF0YV9saW5rKGF4MjUpOworCQllbHNlCisJCQlheDI1X3N0ZF9lc3RhYmxpc2hfZGF0YV9saW5rKGF4MjUpOworCQlicmVhazsKKyNlbmRpZgorCX0KKworCWF4MjUtPnN0YXRlID0gQVgyNV9TVEFURV8xOworCisJYXgyNV9zdGFydF9oZWFydGJlYXQoYXgyNSk7CisKKwkvKiBOb3cgdGhlIGxvb3AgKi8KKwlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCAmJiAoZmxhZ3MgJiBPX05PTkJMT0NLKSkgeworCQllcnIgPSAtRUlOUFJPR1JFU1M7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX1NZTl9TRU5UKSB7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKwkJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgdHNrKTsKKworCQlhZGRfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwkJZm9yICg7OykgeworCQkJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfU1lOX1NFTlQpCisJCQkJYnJlYWs7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJCWlmICghc2lnbmFsX3BlbmRpbmcodHNrKSkgeworCQkJCXNjaGVkdWxlKCk7CisJCQkJbG9ja19zb2NrKHNrKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQkJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQl9CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQlyZW1vdmVfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwl9CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkgeworCQkvKiBOb3QgaW4gQUJNLCBub3QgaW4gV0FJVF9VQSAtPiBmYWlsZWQgKi8KKwkJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKKwkJZXJyID0gc29ja19lcnJvcihzayk7CS8qIEFsd2F5cyBzZXQgYXQgdGhpcyBwb2ludCAqLworCQlnb3RvIG91dDsKKwl9CisKKwlzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKworCWVycj0wOworb3V0OgorCXJlbGVhc2Vfc29jayhzayk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgYXgyNV9hY2NlcHQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2tldCAqbmV3c29jaywgaW50IGZsYWdzKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCB0c2spOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHNvY2sgKm5ld3NrOworCXN0cnVjdCBzb2NrICpzazsKKwlpbnQgZXJyID0gMDsKKworCWlmIChzb2NrLT5zdGF0ZSAhPSBTU19VTkNPTk5FQ1RFRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKHNrID0gc29jay0+c2spID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJbG9ja19zb2NrKHNrKTsKKwlpZiAoc2stPnNrX3R5cGUgIT0gU09DS19TRVFQQUNLRVQpIHsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0xJU1RFTikgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqCVRoZSByZWFkIHF1ZXVlIHRoaXMgdGltZSBpcyBob2xkaW5nIHNvY2tldHMgcmVhZHkgdG8gdXNlCisJICoJaG9va2VkIGludG8gdGhlIFNBQk0gd2Ugc2F2ZWQKKwkgKi8KKwlhZGRfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwlmb3IgKDs7KSB7CisJCXNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJCWlmIChza2IpCisJCQlicmVhazsKKworCQlyZWxlYXNlX3NvY2soc2spOworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwkJaWYgKGZsYWdzICYgT19OT05CTE9DSykgeworCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJCQlyZW1vdmVfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwkJCXJldHVybiAtRVdPVUxEQkxPQ0s7CisJCX0KKwkJaWYgKCFzaWduYWxfcGVuZGluZyh0c2spKSB7CisJCQlzY2hlZHVsZSgpOworCQkJbG9ja19zb2NrKHNrKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQlyZW1vdmVfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisKKwluZXdzawkJID0gc2tiLT5zazsKKwluZXdzay0+c2tfc29ja2V0ID0gbmV3c29jazsKKwluZXdzay0+c2tfc2xlZXAJID0gJm5ld3NvY2stPndhaXQ7CisKKwkvKiBOb3cgYXR0YWNoIHVwIHRoZSBuZXcgc29ja2V0ICovCisJa2ZyZWVfc2tiKHNrYik7CisJc2stPnNrX2Fja19iYWNrbG9nLS07CisJbmV3c29jay0+c2sgICAgPSBuZXdzazsKKwluZXdzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKworb3V0OgorCXJlbGVhc2Vfc29jayhzayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGF4MjVfZ2V0bmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLAorCWludCAqdWFkZHJfbGVuLCBpbnQgcGVlcikKK3sKKwlzdHJ1Y3QgZnVsbF9zb2NrYWRkcl9heDI1ICpmc2EgPSAoc3RydWN0IGZ1bGxfc29ja2FkZHJfYXgyNSAqKXVhZGRyOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXVuc2lnbmVkIGNoYXIgbmRpZ2ksIGk7CisJYXgyNV9jYiAqYXgyNTsKKwlpbnQgZXJyID0gMDsKKworCWxvY2tfc29jayhzayk7CisJYXgyNSA9IGF4MjVfc2soc2spOworCisJaWYgKHBlZXIgIT0gMCkgeworCQlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkgeworCQkJZXJyID0gLUVOT1RDT05OOworCQkJZ290byBvdXQ7CisJCX0KKworCQlmc2EtPmZzYV9heDI1LnNheDI1X2ZhbWlseSA9IEFGX0FYMjU7CisJCWZzYS0+ZnNhX2F4MjUuc2F4MjVfY2FsbCAgID0gYXgyNS0+ZGVzdF9hZGRyOworCQlmc2EtPmZzYV9heDI1LnNheDI1X25kaWdpcyA9IDA7CisKKwkJaWYgKGF4MjUtPmRpZ2lwZWF0ICE9IE5VTEwpIHsKKwkJCW5kaWdpID0gYXgyNS0+ZGlnaXBlYXQtPm5kaWdpOworCQkJZnNhLT5mc2FfYXgyNS5zYXgyNV9uZGlnaXMgPSBuZGlnaTsKKwkJCWZvciAoaSA9IDA7IGkgPCBuZGlnaTsgaSsrKQorCQkJCWZzYS0+ZnNhX2RpZ2lwZWF0ZXJbaV0gPQorCQkJCQkJYXgyNS0+ZGlnaXBlYXQtPmNhbGxzW2ldOworCQl9CisJfSBlbHNlIHsKKwkJZnNhLT5mc2FfYXgyNS5zYXgyNV9mYW1pbHkgPSBBRl9BWDI1OworCQlmc2EtPmZzYV9heDI1LnNheDI1X2NhbGwgICA9IGF4MjUtPnNvdXJjZV9hZGRyOworCQlmc2EtPmZzYV9heDI1LnNheDI1X25kaWdpcyA9IDE7CisJCWlmIChheDI1LT5heDI1X2RldiAhPSBOVUxMKSB7CisJCQltZW1jcHkoJmZzYS0+ZnNhX2RpZ2lwZWF0ZXJbMF0sCisJCQkgICAgICAgYXgyNS0+YXgyNV9kZXYtPmRldi0+ZGV2X2FkZHIsIEFYMjVfQUREUl9MRU4pOworCQl9IGVsc2UgeworCQkJZnNhLT5mc2FfZGlnaXBlYXRlclswXSA9IG51bGxfYXgyNV9hZGRyZXNzOworCQl9CisJfQorCSp1YWRkcl9sZW4gPSBzaXplb2YgKHN0cnVjdCBmdWxsX3NvY2thZGRyX2F4MjUpOworCitvdXQ6CisJcmVsZWFzZV9zb2NrKHNrKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYXgyNV9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCXN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfYXgyNSAqdXNheCA9IChzdHJ1Y3Qgc29ja2FkZHJfYXgyNSAqKW1zZy0+bXNnX25hbWU7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHNvY2thZGRyX2F4MjUgc2F4OworCXN0cnVjdCBza19idWZmICpza2I7CisJYXgyNV9kaWdpIGR0bXAsICpkcDsKKwl1bnNpZ25lZCBjaGFyICphc21wdHI7CisJYXgyNV9jYiAqYXgyNTsKKwlzaXplX3Qgc2l6ZTsKKwlpbnQgbHYsIGVyciwgYWRkcl9sZW4gPSBtc2ctPm1zZ19uYW1lbGVuOworCisJaWYgKG1zZy0+bXNnX2ZsYWdzICYgfihNU0dfRE9OVFdBSVR8TVNHX0VPUnxNU0dfQ01TR19DT01QQVQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxvY2tfc29jayhzayk7CisJYXgyNSA9IGF4MjVfc2soc2spOworCisJaWYgKHNvY2tfZmxhZyhzaywgU09DS19aQVBQRUQpKSB7CisJCWVyciA9IC1FQUREUk5PVEFWQUlMOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoc2stPnNrX3NodXRkb3duICYgU0VORF9TSFVURE9XTikgeworCQlzZW5kX3NpZyhTSUdQSVBFLCBjdXJyZW50LCAwKTsKKwkJZXJyID0gLUVQSVBFOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYXgyNS0+YXgyNV9kZXYgPT0gTlVMTCkgeworCQllcnIgPSAtRU5FVFVOUkVBQ0g7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChsZW4gPiBheDI1LT5heDI1X2Rldi0+ZGV2LT5tdHUpIHsKKwkJZXJyID0gLUVNU0dTSVpFOworCQlnb3RvIG91dDsKKwl9CisJCQorCWlmICh1c2F4ICE9IE5VTEwpIHsKKwkJaWYgKHVzYXgtPnNheDI1X2ZhbWlseSAhPSBBRl9BWDI1KSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoYWRkcl9sZW4gPT0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9heDI1KSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXgyNV9zZW5kbXNnKCk6ICVzIHVzZXMgb2Jzb2xldGUgc29ja2V0IHN0cnVjdHVyZVxuIiwKKwkJCQljdXJyZW50LT5jb21tKTsKKwkJfQorCQllbHNlIGlmIChhZGRyX2xlbiAhPSBzaXplb2Yoc3RydWN0IGZ1bGxfc29ja2FkZHJfYXgyNSkpIHsKKwkJCS8qIHN1cHBvcnQgZm9yIG9sZCBzdHJ1Y3R1cmUgbWF5IGdvIGF3YXkgc29tZSB0aW1lICovCisJCQlpZiAoKGFkZHJfbGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9heDI1KSArIHNpemVvZihheDI1X2FkZHJlc3MpICogNikgfHwKKwkJICAgIAkgICAgKGFkZHJfbGVuID4gc2l6ZW9mKHN0cnVjdCBmdWxsX3NvY2thZGRyX2F4MjUpKSkgeworCQkgICAgCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJheDI1X3NlbmRtc2coKTogJXMgdXNlcyBvbGQgKDYgZGlnaXBlYXRlcikgc29ja2V0IHN0cnVjdHVyZS5cbiIsCisJCQkJY3VycmVudC0+Y29tbSk7CisJCX0KKworCQlpZiAoYWRkcl9sZW4gPiBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2F4MjUpICYmIHVzYXgtPnNheDI1X25kaWdpcyAhPSAwKSB7CisJCQlpbnQgY3QgICAgICAgICAgID0gMDsKKwkJCXN0cnVjdCBmdWxsX3NvY2thZGRyX2F4MjUgKmZzYSA9IChzdHJ1Y3QgZnVsbF9zb2NrYWRkcl9heDI1ICopdXNheDsKKworCQkJLyogVmFsaWQgbnVtYmVyIG9mIGRpZ2lwZWF0ZXJzID8gKi8KKwkJCWlmICh1c2F4LT5zYXgyNV9uZGlnaXMgPCAxIHx8IHVzYXgtPnNheDI1X25kaWdpcyA+IEFYMjVfTUFYX0RJR0lTKSB7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJZHRtcC5uZGlnaSAgICAgID0gdXNheC0+c2F4MjVfbmRpZ2lzOworCisJCQl3aGlsZSAoY3QgPCB1c2F4LT5zYXgyNV9uZGlnaXMpIHsKKwkJCQlkdG1wLnJlcGVhdGVkW2N0XSA9IDA7CisJCQkJZHRtcC5jYWxsc1tjdF0gICAgPSBmc2EtPmZzYV9kaWdpcGVhdGVyW2N0XTsKKwkJCQljdCsrOworCQkJfQorCisJCQlkdG1wLmxhc3RyZXBlYXQgPSAwOworCQl9CisKKwkJc2F4ID0gKnVzYXg7CisJCWlmIChzay0+c2tfdHlwZSA9PSBTT0NLX1NFUVBBQ0tFVCAmJgorCQkgICAgYXgyNWNtcCgmYXgyNS0+ZGVzdF9hZGRyLCAmc2F4LnNheDI1X2NhbGwpKSB7CisJCQllcnIgPSAtRUlTQ09OTjsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmICh1c2F4LT5zYXgyNV9uZGlnaXMgPT0gMCkKKwkJCWRwID0gTlVMTDsKKwkJZWxzZQorCQkJZHAgPSAmZHRtcDsKKwl9IGVsc2UgeworCQkvKgorCQkgKglGSVhNRTogMTAwMy4xZyAtIGlmIHRoZSBzb2NrZXQgaXMgbGlrZSB0aGlzIGJlY2F1c2UKKwkJICoJaXQgaGFzIGJlY29tZSBjbG9zZWQgKG5vdCBzdGFydGVkIGNsb3NlZCkgYW5kIGlzIFZDCisJCSAqCXdlIG91Z2h0IHRvIFNJR1BJUEUsIEVQSVBFCisJCSAqLworCQlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkgeworCQkJZXJyID0gLUVOT1RDT05OOworCQkJZ290byBvdXQ7CisJCX0KKwkJc2F4LnNheDI1X2ZhbWlseSA9IEFGX0FYMjU7CisJCXNheC5zYXgyNV9jYWxsICAgPSBheDI1LT5kZXN0X2FkZHI7CisJCWRwID0gYXgyNS0+ZGlnaXBlYXQ7CisJfQorCisJU09DS19ERUJVRyhzaywgIkFYLjI1OiBzZW5kdG86IEFkZHJlc3NlcyBidWlsdC5cbiIpOworCisJLyogQnVpbGQgYSBwYWNrZXQgKi8KKwlTT0NLX0RFQlVHKHNrLCAiQVguMjU6IHNlbmR0bzogYnVpbGRpbmcgcGFja2V0LlxuIik7CisKKwkvKiBBc3N1bWUgdGhlIHdvcnN0IGNhc2UgKi8KKwlzaXplID0gbGVuICsgYXgyNS0+YXgyNV9kZXYtPmRldi0+aGFyZF9oZWFkZXJfbGVuOworCisJc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywgc2l6ZSwgbXNnLT5tc2dfZmxhZ3MmTVNHX0RPTlRXQUlULCAmZXJyKTsKKwlpZiAoc2tiID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJc2tiX3Jlc2VydmUoc2tiLCBzaXplIC0gbGVuKTsKKworCVNPQ0tfREVCVUcoc2ssICJBWC4yNTogQXBwZW5kaW5nIHVzZXIgZGF0YVxuIik7CisKKwkvKiBVc2VyIGRhdGEgZm9sbG93cyBpbW1lZGlhdGVseSBhZnRlciB0aGUgQVguMjUgZGF0YSAqLworCWlmIChtZW1jcHlfZnJvbWlvdmVjKHNrYl9wdXQoc2tiLCBsZW4pLCBtc2ctPm1zZ19pb3YsIGxlbikpIHsKKwkJZXJyID0gLUVGQVVMVDsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWdvdG8gb3V0OworCX0KKworCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCisJLyogQWRkIHRoZSBQSUQgaWYgb25lIGlzIG5vdCBzdXBwbGllZCBieSB0aGUgdXNlciBpbiB0aGUgc2tiICovCisJaWYgKCFheDI1LT5waWRpbmNsKSB7CisJCWFzbXB0ciAgPSBza2JfcHVzaChza2IsIDEpOworCQkqYXNtcHRyID0gc2stPnNrX3Byb3RvY29sOworCX0KKworCVNPQ0tfREVCVUcoc2ssICJBWC4yNTogVHJhbnNtaXR0aW5nIGJ1ZmZlclxuIik7CisKKwlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19TRVFQQUNLRVQpIHsKKwkJLyogQ29ubmVjdGVkIG1vZGUgc29ja2V0cyBnbyB2aWEgdGhlIExBUEIgbWFjaGluZSAqLworCQlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQllcnIgPSAtRU5PVENPTk47CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIFNob3ZlIGl0IG9udG8gdGhlIHF1ZXVlIGFuZCBraWNrICovCisJCWF4MjVfb3V0cHV0KGF4MjUsIGF4MjUtPnBhY2xlbiwgc2tiKTsKKworCQllcnIgPSBsZW47CisJCWdvdG8gb3V0OworCX0KKworCWFzbXB0ciA9IHNrYl9wdXNoKHNrYiwgMSArIGF4MjVfYWRkcl9zaXplKGRwKSk7CisKKwlTT0NLX0RFQlVHKHNrLCAiQnVpbGRpbmcgQVguMjUgSGVhZGVyIChkcD0lcCkuXG4iLCBkcCk7CisKKwlpZiAoZHAgIT0gTlVMTCkKKwkJU09DS19ERUJVRyhzaywgIk51bSBkaWdpcGVhdGVycz0lZFxuIiwgZHAtPm5kaWdpKTsKKworCS8qIEJ1aWxkIGFuIEFYLjI1IGhlYWRlciAqLworCWFzbXB0ciArPSAobHYgPSBheDI1X2FkZHJfYnVpbGQoYXNtcHRyLCAmYXgyNS0+c291cmNlX2FkZHIsCisJCQkJCSZzYXguc2F4MjVfY2FsbCwgZHAsCisJCQkJCUFYMjVfQ09NTUFORCwgQVgyNV9NT0RVTFVTKSk7CisKKwlTT0NLX0RFQlVHKHNrLCAiQnVpbHQgaGVhZGVyICglZCBieXRlcylcbiIsbHYpOworCisJc2tiLT5oLnJhdyA9IGFzbXB0cjsKKworCVNPQ0tfREVCVUcoc2ssICJiYXNlPSVwIHBvcz0lcFxuIiwgc2tiLT5kYXRhLCBhc21wdHIpOworCisJKmFzbXB0ciA9IEFYMjVfVUk7CisKKwkvKiBEYXRhZ3JhbSBmcmFtZXMgZ28gc3RyYWlnaHQgb3V0IG9mIHRoZSBkb29yIGFzIFVJICovCisJc2tiLT5kZXYgPSBheDI1LT5heDI1X2Rldi0+ZGV2OworCisJYXgyNV9xdWV1ZV94bWl0KHNrYik7CisKKwllcnIgPSBsZW47CisKK291dDoKKwlyZWxlYXNlX3NvY2soc2spOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBheDI1X3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCXN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBjb3BpZWQ7CisJaW50IGVyciA9IDA7CisKKwlsb2NrX3NvY2soc2spOworCS8qCisJICogCVRoaXMgd29ya3MgZm9yIHNlcXBhY2tldCB0b28uIFRoZSByZWNlaXZlciBoYXMgb3JkZXJlZCB0aGUKKwkgKglxdWV1ZSBmb3IgdXMhIFdlIGRvIG9uZSBxdWljayBjaGVjayBmaXJzdCB0aG91Z2gKKwkgKi8KKwlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19TRVFQQUNLRVQgJiYgc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkgeworCQllcnIgPSAgLUVOT1RDT05OOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBOb3cgd2UgY2FuIHRyZWF0IGFsbCBhbGlrZSAqLworCXNrYiA9IHNrYl9yZWN2X2RhdGFncmFtKHNrLCBmbGFncyAmIH5NU0dfRE9OVFdBSVQsCisJICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJiBNU0dfRE9OVFdBSVQsICZlcnIpOworCWlmIChza2IgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlpZiAoIWF4MjVfc2soc2spLT5waWRpbmNsKQorCQlza2JfcHVsbChza2IsIDEpOwkJLyogUmVtb3ZlIFBJRCAqLworCisJc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwljb3BpZWQgICAgID0gc2tiLT5sZW47CisKKwlpZiAoY29waWVkID4gc2l6ZSkgeworCQljb3BpZWQgPSBzaXplOworCQltc2ctPm1zZ19mbGFncyB8PSBNU0dfVFJVTkM7CisJfQorCisJc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCAwLCBtc2ctPm1zZ19pb3YsIGNvcGllZCk7CisKKwlpZiAobXNnLT5tc2dfbmFtZWxlbiAhPSAwKSB7CisJCXN0cnVjdCBzb2NrYWRkcl9heDI1ICpzYXggPSAoc3RydWN0IHNvY2thZGRyX2F4MjUgKiltc2ctPm1zZ19uYW1lOworCQlheDI1X2RpZ2kgZGlnaTsKKwkJYXgyNV9hZGRyZXNzIHNyYzsKKworCQlheDI1X2FkZHJfcGFyc2Uoc2tiLT5tYWMucmF3KzEsIHNrYi0+ZGF0YS1za2ItPm1hYy5yYXctMSwgJnNyYywgTlVMTCwgJmRpZ2ksIE5VTEwsIE5VTEwpOworCisJCXNheC0+c2F4MjVfZmFtaWx5ID0gQUZfQVgyNTsKKwkJLyogV2Ugc2V0IHRoaXMgY29ycmVjdGx5LCBldmVuIHRob3VnaCB3ZSBtYXkgbm90IGxldCB0aGUKKwkJICAgYXBwbGljYXRpb24ga25vdyB0aGUgZGlnaSBjYWxscyBmdXJ0aGVyIGRvd24gKGJlY2F1c2UgaXQKKwkJICAgZGlkIE5PVCBhc2sgdG8ga25vdyB0aGVtKS4gIFRoaXMgY291bGQgZ2V0IHBvbGl0aWNhbC4uLiAqKi8KKwkJc2F4LT5zYXgyNV9uZGlnaXMgPSBkaWdpLm5kaWdpOworCQlzYXgtPnNheDI1X2NhbGwgICA9IHNyYzsKKworCQlpZiAoc2F4LT5zYXgyNV9uZGlnaXMgIT0gMCkgeworCQkJaW50IGN0OworCQkJc3RydWN0IGZ1bGxfc29ja2FkZHJfYXgyNSAqZnNhID0gKHN0cnVjdCBmdWxsX3NvY2thZGRyX2F4MjUgKilzYXg7CisKKwkJCWZvciAoY3QgPSAwOyBjdCA8IGRpZ2kubmRpZ2k7IGN0KyspCisJCQkJZnNhLT5mc2FfZGlnaXBlYXRlcltjdF0gPSBkaWdpLmNhbGxzW2N0XTsKKwkJfQorCQltc2ctPm1zZ19uYW1lbGVuID0gc2l6ZW9mKHN0cnVjdCBmdWxsX3NvY2thZGRyX2F4MjUpOworCX0KKworCXNrYl9mcmVlX2RhdGFncmFtKHNrLCBza2IpOworCWVyciA9IGNvcGllZDsKKworb3V0OgorCXJlbGVhc2Vfc29jayhzayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGF4MjVfc2h1dGRvd24oc3RydWN0IHNvY2tldCAqc2ssIGludCBob3cpCit7CisJLyogRklYTUUgLSBnZW5lcmF0ZSBETSBhbmQgUk5SIHN0YXRlcyAqLworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGludCBheDI1X2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCByZXMgPSAwOworCisJbG9ja19zb2NrKHNrKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVElPQ09VVFE6IHsKKwkJbG9uZyBhbW91bnQ7CisJCWFtb3VudCA9IHNrLT5za19zbmRidWYgLSBhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpOworCQlpZiAoYW1vdW50IDwgMCkKKwkJCWFtb3VudCA9IDA7CisJCXJlcyA9IHB1dF91c2VyKGFtb3VudCwgKGludCBfX3VzZXIgKilhcmdwKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBUSU9DSU5ROiB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWxvbmcgYW1vdW50ID0gMEw7CisJCS8qIFRoZXNlIHR3byBhcmUgc2FmZSBvbiBhIHNpbmdsZSBDUFUgc3lzdGVtIGFzIG9ubHkgdXNlciB0YXNrcyBmaWRkbGUgaGVyZSAqLworCQlpZiAoKHNrYiA9IHNrYl9wZWVrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpICE9IE5VTEwpCisJCQlhbW91bnQgPSBza2ItPmxlbjsKKwkJcmVzID0gcHV0X3VzZXIoYW1vdW50LCAoaW50IF9fdXNlciAqKWFyZ3ApOworCQlicmVhazsKKwl9CisKKwljYXNlIFNJT0NHU1RBTVA6CisJCWlmIChzayAhPSBOVUxMKSB7CisJCQlyZXMgPSBzb2NrX2dldF90aW1lc3RhbXAoc2ssIGFyZ3ApOworCQkJYnJlYWs7CisJIAl9CisJCXJlcyA9IC1FSU5WQUw7CisJCWJyZWFrOworCisJY2FzZSBTSU9DQVgyNUFERFVJRDoJLyogQWRkIGEgdWlkIHRvIHRoZSB1aWQvY2FsbCBtYXAgdGFibGUgKi8KKwljYXNlIFNJT0NBWDI1REVMVUlEOgkvKiBEZWxldGUgYSB1aWQgZnJvbSB0aGUgdWlkL2NhbGwgbWFwIHRhYmxlICovCisJY2FzZSBTSU9DQVgyNUdFVFVJRDogeworCQlzdHJ1Y3Qgc29ja2FkZHJfYXgyNSBzYXgyNTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzYXgyNSwgYXJncCwgc2l6ZW9mKHNheDI1KSkpIHsKKwkJCXJlcyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlyZXMgPSBheDI1X3VpZF9pb2N0bChjbWQsICZzYXgyNSk7CisJCWJyZWFrOworCX0KKworCWNhc2UgU0lPQ0FYMjVOT1VJRDogewkvKiBTZXQgdGhlIGRlZmF1bHQgcG9saWN5IChkZWZhdWx0L2JhcikgKi8KKwkJbG9uZyBhbW91bnQ7CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJcmVzID0gLUVQRVJNOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGdldF91c2VyKGFtb3VudCwgKGxvbmcgX191c2VyICopYXJncCkpIHsKKwkJCXJlcyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlpZiAoYW1vdW50ID4gQVgyNV9OT1VJRF9CTE9DSykgeworCQkJcmVzID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWF4MjVfdWlkX3BvbGljeSA9IGFtb3VudDsKKwkJcmVzID0gMDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBTSU9DQUREUlQ6CisJY2FzZSBTSU9DREVMUlQ6CisJY2FzZSBTSU9DQVgyNU9QVFJUOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCXJlcyA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisJCXJlcyA9IGF4MjVfcnRfaW9jdGwoY21kLCBhcmdwKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NBWDI1Q1RMQ09OOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCXJlcyA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisJCXJlcyA9IGF4MjVfY3RsX2lvY3RsKGNtZCwgYXJncCk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DQVgyNUdFVElORk86CisJY2FzZSBTSU9DQVgyNUdFVElORk9PTEQ6IHsKKwkJYXgyNV9jYiAqYXgyNSA9IGF4MjVfc2soc2spOworCQlzdHJ1Y3QgYXgyNV9pbmZvX3N0cnVjdCBheDI1X2luZm87CisKKwkJYXgyNV9pbmZvLnQxICAgICAgICA9IGF4MjUtPnQxICAgLyBIWjsKKwkJYXgyNV9pbmZvLnQyICAgICAgICA9IGF4MjUtPnQyICAgLyBIWjsKKwkJYXgyNV9pbmZvLnQzICAgICAgICA9IGF4MjUtPnQzICAgLyBIWjsKKwkJYXgyNV9pbmZvLmlkbGUgICAgICA9IGF4MjUtPmlkbGUgLyAoNjAgKiBIWik7CisJCWF4MjVfaW5mby5uMiAgICAgICAgPSBheDI1LT5uMjsKKwkJYXgyNV9pbmZvLnQxdGltZXIgICA9IGF4MjVfZGlzcGxheV90aW1lcigmYXgyNS0+dDF0aW1lcikgICAvIEhaOworCQlheDI1X2luZm8udDJ0aW1lciAgID0gYXgyNV9kaXNwbGF5X3RpbWVyKCZheDI1LT50MnRpbWVyKSAgIC8gSFo7CisJCWF4MjVfaW5mby50M3RpbWVyICAgPSBheDI1X2Rpc3BsYXlfdGltZXIoJmF4MjUtPnQzdGltZXIpICAgLyBIWjsKKwkJYXgyNV9pbmZvLmlkbGV0aW1lciA9IGF4MjVfZGlzcGxheV90aW1lcigmYXgyNS0+aWRsZXRpbWVyKSAvICg2MCAqIEhaKTsKKwkJYXgyNV9pbmZvLm4yY291bnQgICA9IGF4MjUtPm4yY291bnQ7CisJCWF4MjVfaW5mby5zdGF0ZSAgICAgPSBheDI1LT5zdGF0ZTsKKwkJYXgyNV9pbmZvLnJjdl9xICAgICA9IGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYyk7CisJCWF4MjVfaW5mby5zbmRfcSAgICAgPSBhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpOworCQlheDI1X2luZm8udnMgICAgICAgID0gYXgyNS0+dnM7CisJCWF4MjVfaW5mby52ciAgICAgICAgPSBheDI1LT52cjsKKwkJYXgyNV9pbmZvLnZhICAgICAgICA9IGF4MjUtPnZhOworCQlheDI1X2luZm8udnNfbWF4ICAgID0gYXgyNS0+dnM7IC8qIHJlc2VydmVkICovCisJCWF4MjVfaW5mby5wYWNsZW4gICAgPSBheDI1LT5wYWNsZW47CisJCWF4MjVfaW5mby53aW5kb3cgICAgPSBheDI1LT53aW5kb3c7CisKKwkJLyogb2xkIHN0cnVjdHVyZT8gKi8KKwkJaWYgKGNtZCA9PSBTSU9DQVgyNUdFVElORk9PTEQpIHsKKwkJCXN0YXRpYyBpbnQgd2FybmVkID0gMDsKKwkJCWlmICghd2FybmVkKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgdXNlcyBvbGQgU0lPQ0FYMjVHRVRJTkZPXG4iLAorCQkJCQljdXJyZW50LT5jb21tKTsKKwkJCQl3YXJuZWQ9MTsKKwkJCX0KKworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmYXgyNV9pbmZvLCBzaXplb2Yoc3RydWN0IGF4MjVfaW5mb19zdHJ1Y3RfZGVwcmVjYXRlZCkpKSB7CisJCQkJcmVzID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmF4MjVfaW5mbywgc2l6ZW9mKHN0cnVjdCBheDI1X2luZm9fc3RydWN0KSkpIHsKKwkJCQlyZXMgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJlcyA9IDA7CisJCWJyZWFrOworCX0KKworCWNhc2UgU0lPQ0FYMjVBRERGV0Q6CisJY2FzZSBTSU9DQVgyNURFTEZXRDogeworCQlzdHJ1Y3QgYXgyNV9md2Rfc3RydWN0IGF4MjVfZndkOworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCXJlcyA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcigmYXgyNV9md2QsIGFyZ3AsIHNpemVvZihheDI1X2Z3ZCkpKSB7CisJCQlyZXMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJcmVzID0gYXgyNV9md2RfaW9jdGwoY21kLCAmYXgyNV9md2QpOworCQlicmVhazsKKwl9CisKKwljYXNlIFNJT0NHSUZBRERSOgorCWNhc2UgU0lPQ1NJRkFERFI6CisJY2FzZSBTSU9DR0lGRFNUQUREUjoKKwljYXNlIFNJT0NTSUZEU1RBRERSOgorCWNhc2UgU0lPQ0dJRkJSREFERFI6CisJY2FzZSBTSU9DU0lGQlJEQUREUjoKKwljYXNlIFNJT0NHSUZORVRNQVNLOgorCWNhc2UgU0lPQ1NJRk5FVE1BU0s6CisJY2FzZSBTSU9DR0lGTUVUUklDOgorCWNhc2UgU0lPQ1NJRk1FVFJJQzoKKwkJcmVzID0gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXMgPSBkZXZfaW9jdGwoY21kLCBhcmdwKTsKKwkJYnJlYWs7CisJfQorCXJlbGVhc2Vfc29jayhzayk7CisKKwlyZXR1cm4gcmVzOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworc3RhdGljIHZvaWQgKmF4MjVfaW5mb19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGF4MjVfY2IgKmF4MjU7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJaW50IGkgPSAwOworCisJc3Bpbl9sb2NrX2JoKCZheDI1X2xpc3RfbG9jayk7CisJYXgyNV9mb3JfZWFjaChheDI1LCBub2RlLCAmYXgyNV9saXN0KSB7CisJCWlmIChpID09ICpwb3MpCisJCQlyZXR1cm4gYXgyNTsKKwkJKytpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKmF4MjVfaW5mb19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwkrKypwb3M7CisKKwlyZXR1cm4gaGxpc3RfZW50cnkoICgoc3RydWN0IGF4MjVfY2IgKil2KS0+YXgyNV9ub2RlLm5leHQsCisJCQkgICAgc3RydWN0IGF4MjVfY2IsIGF4MjVfbm9kZSk7Cit9CisJCitzdGF0aWMgdm9pZCBheDI1X2luZm9fc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzcGluX3VubG9ja19iaCgmYXgyNV9saXN0X2xvY2spOworfQorCitzdGF0aWMgaW50IGF4MjVfaW5mb19zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWF4MjVfY2IgKmF4MjUgPSB2OworCWludCBrOworCisKKwkvKgorCSAqIE5ldyBmb3JtYXQ6CisJICogbWFnaWMgZGV2IHNyY19hZGRyIGRlc3RfYWRkcixkaWdpMSxkaWdpMiwuLiBzdCB2cyB2ciB2YSB0MSB0MSB0MiB0MiB0MyB0MyBpZGxlIGlkbGUgbjIgbjIgcnR0IHdpbmRvdyBwYWNsZW4gU25kLVEgUmN2LVEgaW5vZGUKKwkgKi8KKworCXNlcV9wcmludGYoc2VxLCAiJTguOGx4ICVzICVzJXMgIiwKKwkJICAgKGxvbmcpIGF4MjUsCisJCSAgIGF4MjUtPmF4MjVfZGV2ID09IE5VTEw/ICI/Pz8iIDogYXgyNS0+YXgyNV9kZXYtPmRldi0+bmFtZSwKKwkJICAgYXgyYXNjKCZheDI1LT5zb3VyY2VfYWRkciksCisJCSAgIGF4MjUtPmlhbWRpZ2k/ICIqIjoiIik7CisJc2VxX3ByaW50ZihzZXEsICIlcyIsIGF4MmFzYygmYXgyNS0+ZGVzdF9hZGRyKSk7CisKKwlmb3IgKGs9MDsgKGF4MjUtPmRpZ2lwZWF0ICE9IE5VTEwpICYmIChrIDwgYXgyNS0+ZGlnaXBlYXQtPm5kaWdpKTsgaysrKSB7CisJCXNlcV9wcmludGYoc2VxLCAiLCVzJXMiLAorCQkJICAgYXgyYXNjKCZheDI1LT5kaWdpcGVhdC0+Y2FsbHNba10pLAorCQkJICAgYXgyNS0+ZGlnaXBlYXQtPnJlcGVhdGVkW2tdPyAiKiI6IiIpOworCX0KKworCXNlcV9wcmludGYoc2VxLCAiICVkICVkICVkICVkICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWQgJWQgJWx1ICVkICVkIiwKKwkJICAgYXgyNS0+c3RhdGUsCisJCSAgIGF4MjUtPnZzLCBheDI1LT52ciwgYXgyNS0+dmEsCisJCSAgIGF4MjVfZGlzcGxheV90aW1lcigmYXgyNS0+dDF0aW1lcikgLyBIWiwgYXgyNS0+dDEgLyBIWiwKKwkJICAgYXgyNV9kaXNwbGF5X3RpbWVyKCZheDI1LT50MnRpbWVyKSAvIEhaLCBheDI1LT50MiAvIEhaLAorCQkgICBheDI1X2Rpc3BsYXlfdGltZXIoJmF4MjUtPnQzdGltZXIpIC8gSFosIGF4MjUtPnQzIC8gSFosCisJCSAgIGF4MjVfZGlzcGxheV90aW1lcigmYXgyNS0+aWRsZXRpbWVyKSAvICg2MCAqIEhaKSwKKwkJICAgYXgyNS0+aWRsZSAvICg2MCAqIEhaKSwKKwkJICAgYXgyNS0+bjJjb3VudCwgYXgyNS0+bjIsCisJCSAgIGF4MjUtPnJ0dCAvIEhaLAorCQkgICBheDI1LT53aW5kb3csCisJCSAgIGF4MjUtPnBhY2xlbik7CisKKwlpZiAoYXgyNS0+c2sgIT0gTlVMTCkgeworCQliaF9sb2NrX3NvY2soYXgyNS0+c2spOworCQlzZXFfcHJpbnRmKHNlcSwiICVkICVkICVsZFxuIiwKKwkJCSAgIGF0b21pY19yZWFkKCZheDI1LT5zay0+c2tfd21lbV9hbGxvYyksCisJCQkgICBhdG9taWNfcmVhZCgmYXgyNS0+c2stPnNrX3JtZW1fYWxsb2MpLAorCQkJICAgYXgyNS0+c2stPnNrX3NvY2tldCAhPSBOVUxMID8gU09DS19JTk9ERShheDI1LT5zay0+c2tfc29ja2V0KS0+aV9pbm8gOiAwTCk7CisJCWJoX3VubG9ja19zb2NrKGF4MjUtPnNrKTsKKwl9IGVsc2UgeworCQlzZXFfcHV0cyhzZXEsICIgKiAqICpcbiIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBheDI1X2luZm9fc2Vxb3BzID0geworCS5zdGFydCA9IGF4MjVfaW5mb19zdGFydCwKKwkubmV4dCA9IGF4MjVfaW5mb19uZXh0LAorCS5zdG9wID0gYXgyNV9pbmZvX3N0b3AsCisJLnNob3cgPSBheDI1X2luZm9fc2hvdywKK307CisKK3N0YXRpYyBpbnQgYXgyNV9pbmZvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZheDI1X2luZm9fc2Vxb3BzKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXgyNV9pbmZvX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBheDI1X2luZm9fb3BlbiwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG5ldF9wcm90b19mYW1pbHkgYXgyNV9mYW1pbHlfb3BzID0geworCS5mYW1pbHkgPQlQRl9BWDI1LAorCS5jcmVhdGUgPQlheDI1X2NyZWF0ZSwKKwkub3duZXIJPQlUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIGF4MjVfcHJvdG9fb3BzID0geworCS5mYW1pbHkgPQlQRl9BWDI1LAorCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5yZWxlYXNlID0JYXgyNV9yZWxlYXNlLAorCS5iaW5kID0JCWF4MjVfYmluZCwKKwkuY29ubmVjdCA9CWF4MjVfY29ubmVjdCwKKwkuc29ja2V0cGFpciA9CXNvY2tfbm9fc29ja2V0cGFpciwKKwkuYWNjZXB0ID0JYXgyNV9hY2NlcHQsCisJLmdldG5hbWUgPQlheDI1X2dldG5hbWUsCisJLnBvbGwgPQkJZGF0YWdyYW1fcG9sbCwKKwkuaW9jdGwgPQlheDI1X2lvY3RsLAorCS5saXN0ZW4gPQlheDI1X2xpc3RlbiwKKwkuc2h1dGRvd24gPQlheDI1X3NodXRkb3duLAorCS5zZXRzb2Nrb3B0ID0JYXgyNV9zZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0ID0JYXgyNV9nZXRzb2Nrb3B0LAorCS5zZW5kbXNnID0JYXgyNV9zZW5kbXNnLAorCS5yZWN2bXNnID0JYXgyNV9yZWN2bXNnLAorCS5tbWFwID0JCXNvY2tfbm9fbW1hcCwKKwkuc2VuZHBhZ2UgPQlzb2NrX25vX3NlbmRwYWdlLAorfTsKKworLyoKKyAqCUNhbGxlZCBieSBzb2NrZXQuYyBvbiBrZXJuZWwgc3RhcnQgdXAKKyAqLworc3RhdGljIHN0cnVjdCBwYWNrZXRfdHlwZSBheDI1X3BhY2tldF90eXBlID0geworCS50eXBlCT0JX19jb25zdGFudF9odG9ucyhFVEhfUF9BWDI1KSwKKwkuZGV2CT0JTlVMTCwJCQkJLyogQWxsIGRldmljZXMgKi8KKwkuZnVuYwk9CWF4MjVfa2lzc19yY3YsCit9OworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGF4MjVfZGV2X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID1heDI1X2RldmljZV9ldmVudCwKK307CisKK0VYUE9SVF9TWU1CT0woYXgyNV9lbmNhcHN1bGF0ZSk7CitFWFBPUlRfU1lNQk9MKGF4MjVfcmVidWlsZF9oZWFkZXIpOworRVhQT1JUX1NZTUJPTChheDI1X2ZpbmRieXVpZCk7CitFWFBPUlRfU1lNQk9MKGF4MjVfZmluZF9jYik7CitFWFBPUlRfU1lNQk9MKGF4MjVfbGlua2ZhaWxfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChheDI1X2xpbmtmYWlsX3JlbGVhc2UpOworRVhQT1JUX1NZTUJPTChheDI1X2xpc3Rlbl9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGF4MjVfbGlzdGVuX3JlbGVhc2UpOworRVhQT1JUX1NZTUJPTChheDI1X3Byb3RvY29sX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woYXgyNV9wcm90b2NvbF9yZWxlYXNlKTsKK0VYUE9SVF9TWU1CT0woYXgyNV9zZW5kX2ZyYW1lKTsKK0VYUE9SVF9TWU1CT0woYXgyNV91aWRfcG9saWN5KTsKK0VYUE9SVF9TWU1CT0woYXgyNWNtcCk7CitFWFBPUlRfU1lNQk9MKGF4MmFzYyk7CitFWFBPUlRfU1lNQk9MKGFzYzJheCk7CitFWFBPUlRfU1lNQk9MKG51bGxfYXgyNV9hZGRyZXNzKTsKK0VYUE9SVF9TWU1CT0woYXgyNV9kaXNwbGF5X3RpbWVyKTsKKworc3RhdGljIGludCBfX2luaXQgYXgyNV9pbml0KHZvaWQpCit7CisJaW50IHJjID0gcHJvdG9fcmVnaXN0ZXIoJmF4MjVfcHJvdG8sIDApOworCisJaWYgKHJjICE9IDApCisJCWdvdG8gb3V0OworCisJc29ja19yZWdpc3RlcigmYXgyNV9mYW1pbHlfb3BzKTsKKwlkZXZfYWRkX3BhY2soJmF4MjVfcGFja2V0X3R5cGUpOworCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmYXgyNV9kZXZfbm90aWZpZXIpOworCWF4MjVfcmVnaXN0ZXJfc3lzY3RsKCk7CisKKwlwcm9jX25ldF9mb3BzX2NyZWF0ZSgiYXgyNV9yb3V0ZSIsIFNfSVJVR08sICZheDI1X3JvdXRlX2ZvcHMpOworCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJheDI1IiwgU19JUlVHTywgJmF4MjVfaW5mb19mb3BzKTsKKwlwcm9jX25ldF9mb3BzX2NyZWF0ZSgiYXgyNV9jYWxscyIsIFNfSVJVR08sICZheDI1X3VpZF9mb3BzKTsKK291dDoKKwlyZXR1cm4gcmM7Cit9Cittb2R1bGVfaW5pdChheDI1X2luaXQpOworCisKK01PRFVMRV9BVVRIT1IoIkpvbmF0aGFuIE5heWxvciBHNEtMWCA8ZzRrbHhAZzRrbHguZGVtb24uY28udWs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRoZSBhbWF0ZXVyIHJhZGlvIEFYLjI1IGxpbmsgbGF5ZXIgcHJvdG9jb2wiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19ORVRQUk9UTyhQRl9BWDI1KTsKKworc3RhdGljIHZvaWQgX19leGl0IGF4MjVfZXhpdCh2b2lkKQoreworCXByb2NfbmV0X3JlbW92ZSgiYXgyNV9yb3V0ZSIpOworCXByb2NfbmV0X3JlbW92ZSgiYXgyNSIpOworCXByb2NfbmV0X3JlbW92ZSgiYXgyNV9jYWxscyIpOworCWF4MjVfcnRfZnJlZSgpOworCWF4MjVfdWlkX2ZyZWUoKTsKKwlheDI1X2Rldl9mcmVlKCk7CisKKwlheDI1X3VucmVnaXN0ZXJfc3lzY3RsKCk7CisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmF4MjVfZGV2X25vdGlmaWVyKTsKKworCWRldl9yZW1vdmVfcGFjaygmYXgyNV9wYWNrZXRfdHlwZSk7CisKKwlzb2NrX3VucmVnaXN0ZXIoUEZfQVgyNSk7CisJcHJvdG9fdW5yZWdpc3RlcigmYXgyNV9wcm90byk7Cit9Cittb2R1bGVfZXhpdChheDI1X2V4aXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYXgyNV9hZGRyLmMgYi9uZXQvYXgyNS9heDI1X2FkZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGZhNmRmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2F4MjUvYXgyNV9hZGRyLmMKQEAgLTAsMCArMSwyOTAgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgSm9uYXRoYW4gTmF5bG9yIEc0S0xYIChnNGtseEBnNGtseC5kZW1vbi5jby51aykKKyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bmV0L2F4MjUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKy8qCisgKglUaGUgbnVsbCBhZGRyZXNzIGlzIGRlZmluZWQgYXMgYSBjYWxsc2lnbiBvZiBhbGwgc3BhY2VzIHdpdGggYW4KKyAqCVNTSUQgb2YgemVyby4KKyAqLworYXgyNV9hZGRyZXNzIG51bGxfYXgyNV9hZGRyZXNzID0ge3sweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDAwfX07CisKKy8qCisgKglheDI1IC0+IGFzY2lpIGNvbnZlcnNpb24KKyAqLworY2hhciAqYXgyYXNjKGF4MjVfYWRkcmVzcyAqYSkKK3sKKwlzdGF0aWMgY2hhciBidWZbMTFdOworCWNoYXIgYywgKnM7CisJaW50IG47CisKKwlmb3IgKG4gPSAwLCBzID0gYnVmOyBuIDwgNjsgbisrKSB7CisJCWMgPSAoYS0+YXgyNV9jYWxsW25dID4+IDEpICYgMHg3RjsKKworCQlpZiAoYyAhPSAnICcpICpzKysgPSBjOworCX0KKworCSpzKysgPSAnLSc7CisKKwlpZiAoKG4gPSAoKGEtPmF4MjVfY2FsbFs2XSA+PiAxKSAmIDB4MEYpKSA+IDkpIHsKKwkJKnMrKyA9ICcxJzsKKwkJbiAtPSAxMDsKKwl9CisKKwkqcysrID0gbiArICcwJzsKKwkqcysrID0gJ1wwJzsKKworCWlmICgqYnVmID09ICdcMCcgfHwgKmJ1ZiA9PSAnLScpCisJICAgcmV0dXJuICIqIjsKKworCXJldHVybiBidWY7CisKK30KKworLyoKKyAqCWFzY2lpIC0+IGF4MjUgY29udmVyc2lvbgorICovCitheDI1X2FkZHJlc3MgKmFzYzJheChjaGFyICpjYWxsc2lnbikKK3sKKwlzdGF0aWMgYXgyNV9hZGRyZXNzIGFkZHI7CisJY2hhciAqczsKKwlpbnQgbjsKKworCWZvciAocyA9IGNhbGxzaWduLCBuID0gMDsgbiA8IDY7IG4rKykgeworCQlpZiAoKnMgIT0gJ1wwJyAmJiAqcyAhPSAnLScpCisJCQlhZGRyLmF4MjVfY2FsbFtuXSA9ICpzKys7CisJCWVsc2UKKwkJCWFkZHIuYXgyNV9jYWxsW25dID0gJyAnOworCQlhZGRyLmF4MjVfY2FsbFtuXSA8PD0gMTsKKwkJYWRkci5heDI1X2NhbGxbbl0gJj0gMHhGRTsKKwl9CisKKwlpZiAoKnMrKyA9PSAnXDAnKSB7CisJCWFkZHIuYXgyNV9jYWxsWzZdID0gMHgwMDsKKwkJcmV0dXJuICZhZGRyOworCX0KKworCWFkZHIuYXgyNV9jYWxsWzZdID0gKnMrKyAtICcwJzsKKworCWlmICgqcyAhPSAnXDAnKSB7CisJCWFkZHIuYXgyNV9jYWxsWzZdICo9IDEwOworCQlhZGRyLmF4MjVfY2FsbFs2XSArPSAqcysrIC0gJzAnOworCX0KKworCWFkZHIuYXgyNV9jYWxsWzZdIDw8PSAxOworCWFkZHIuYXgyNV9jYWxsWzZdICY9IDB4MUU7CisKKwlyZXR1cm4gJmFkZHI7Cit9CisKKy8qCisgKglDb21wYXJlIHR3byBheC4yNSBhZGRyZXNzZXMKKyAqLworaW50IGF4MjVjbXAoYXgyNV9hZGRyZXNzICphLCBheDI1X2FkZHJlc3MgKmIpCit7CisJaW50IGN0ID0gMDsKKworCXdoaWxlIChjdCA8IDYpIHsKKwkJaWYgKChhLT5heDI1X2NhbGxbY3RdICYgMHhGRSkgIT0gKGItPmF4MjVfY2FsbFtjdF0gJiAweEZFKSkJLyogQ2xlYW4gb2ZmIHJlcGVhdGVyIGJpdHMgKi8KKwkJCXJldHVybiAxOworCQljdCsrOworCX0KKworIAlpZiAoKGEtPmF4MjVfY2FsbFtjdF0gJiAweDFFKSA9PSAoYi0+YXgyNV9jYWxsW2N0XSAmIDB4MUUpKQkvKiBTU0lEIHdpdGhvdXQgY29udHJvbCBiaXQgKi8KKyAJCXJldHVybiAwOworCisgCXJldHVybiAyOwkJCS8qIFBhcnRpYWwgbWF0Y2ggKi8KK30KKworLyoKKyAqCUNvbXBhcmUgdHdvIEFYLjI1IGRpZ2lwZWF0ZXIgcGF0aHMuCisgKi8KK2ludCBheDI1ZGlnaWNtcChheDI1X2RpZ2kgKmRpZ2kxLCBheDI1X2RpZ2kgKmRpZ2kyKQoreworCWludCBpOworCisJaWYgKGRpZ2kxLT5uZGlnaSAhPSBkaWdpMi0+bmRpZ2kpCisJCXJldHVybiAxOworCisJaWYgKGRpZ2kxLT5sYXN0cmVwZWF0ICE9IGRpZ2kyLT5sYXN0cmVwZWF0KQorCQlyZXR1cm4gMTsKKworCWZvciAoaSA9IDA7IGkgPCBkaWdpMS0+bmRpZ2k7IGkrKykKKwkJaWYgKGF4MjVjbXAoJmRpZ2kxLT5jYWxsc1tpXSwgJmRpZ2kyLT5jYWxsc1tpXSkgIT0gMCkKKwkJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglHaXZlbiBhbiBBWC4yNSBhZGRyZXNzIHB1bGwgb2YgdG8sIGZyb20sIGRpZ2kgbGlzdCwgY29tbWFuZC9yZXNwb25zZSBhbmQgdGhlIHN0YXJ0IG9mIGRhdGEKKyAqCisgKi8KK3Vuc2lnbmVkIGNoYXIgKmF4MjVfYWRkcl9wYXJzZSh1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4sIGF4MjVfYWRkcmVzcyAqc3JjLCBheDI1X2FkZHJlc3MgKmRlc3QsIGF4MjVfZGlnaSAqZGlnaSwgaW50ICpmbGFncywgaW50ICpkYW1hKQoreworCWludCBkID0gMDsKKworCWlmIChsZW4gPCAxNCkgcmV0dXJuIE5VTEw7CisKKwlpZiAoZmxhZ3MgIT0gTlVMTCkgeworCQkqZmxhZ3MgPSAwOworCisJCWlmIChidWZbNl0gJiBBWDI1X0NCSVQpCisJCQkqZmxhZ3MgPSBBWDI1X0NPTU1BTkQ7CisJCWlmIChidWZbMTNdICYgQVgyNV9DQklUKQorCQkJKmZsYWdzID0gQVgyNV9SRVNQT05TRTsKKwl9CisKKwlpZiAoZGFtYSAhPSBOVUxMKQorCQkqZGFtYSA9IH5idWZbMTNdICYgQVgyNV9EQU1BX0ZMQUc7CisKKwkvKiBDb3B5IHRvLCBmcm9tICovCisJaWYgKGRlc3QgIT0gTlVMTCkKKwkJbWVtY3B5KGRlc3QsIGJ1ZiArIDAsIEFYMjVfQUREUl9MRU4pOworCWlmIChzcmMgIT0gTlVMTCkKKwkJbWVtY3B5KHNyYywgIGJ1ZiArIDcsIEFYMjVfQUREUl9MRU4pOworCisJYnVmICs9IDIgKiBBWDI1X0FERFJfTEVOOworCWxlbiAtPSAyICogQVgyNV9BRERSX0xFTjsKKworCWRpZ2ktPmxhc3RyZXBlYXQgPSAtMTsKKwlkaWdpLT5uZGlnaSAgICAgID0gMDsKKworCXdoaWxlICghKGJ1ZlstMV0gJiBBWDI1X0VCSVQpKSB7CisJCWlmIChkID49IEFYMjVfTUFYX0RJR0lTKSAgcmV0dXJuIE5VTEw7CS8qIE1heCBvZiA2IGRpZ2lzICovCisJCWlmIChsZW4gPCA3KSByZXR1cm4gTlVMTDsJLyogU2hvcnQgcGFja2V0ICovCisKKwkJbWVtY3B5KCZkaWdpLT5jYWxsc1tkXSwgYnVmLCBBWDI1X0FERFJfTEVOKTsKKwkJZGlnaS0+bmRpZ2kgPSBkICsgMTsKKworCQlpZiAoYnVmWzZdICYgQVgyNV9IQklUKSB7CisJCQlkaWdpLT5yZXBlYXRlZFtkXSA9IDE7CisJCQlkaWdpLT5sYXN0cmVwZWF0ICA9IGQ7CisJCX0gZWxzZSB7CisJCQlkaWdpLT5yZXBlYXRlZFtkXSA9IDA7CisJCX0KKworCQlidWYgKz0gQVgyNV9BRERSX0xFTjsKKwkJbGVuIC09IEFYMjVfQUREUl9MRU47CisJCWQrKzsKKwl9CisKKwlyZXR1cm4gYnVmOworfQorCisvKgorICoJQXNzZW1ibGUgYW4gQVguMjUgaGVhZGVyIGZyb20gdGhlIGJpdHMKKyAqLworaW50IGF4MjVfYWRkcl9idWlsZCh1bnNpZ25lZCBjaGFyICpidWYsIGF4MjVfYWRkcmVzcyAqc3JjLCBheDI1X2FkZHJlc3MgKmRlc3QsIGF4MjVfZGlnaSAqZCwgaW50IGZsYWcsIGludCBtb2R1bHVzKQoreworCWludCBsZW4gPSAwOworCWludCBjdCAgPSAwOworCisJbWVtY3B5KGJ1ZiwgZGVzdCwgQVgyNV9BRERSX0xFTik7CisJYnVmWzZdICY9IH4oQVgyNV9FQklUIHwgQVgyNV9DQklUKTsKKwlidWZbNl0gfD0gQVgyNV9TU1NJRF9TUEFSRTsKKworCWlmIChmbGFnID09IEFYMjVfQ09NTUFORCkgYnVmWzZdIHw9IEFYMjVfQ0JJVDsKKworCWJ1ZiArPSBBWDI1X0FERFJfTEVOOworCWxlbiArPSBBWDI1X0FERFJfTEVOOworCisJbWVtY3B5KGJ1Ziwgc3JjLCBBWDI1X0FERFJfTEVOKTsKKwlidWZbNl0gJj0gfihBWDI1X0VCSVQgfCBBWDI1X0NCSVQpOworCWJ1Zls2XSAmPSB+QVgyNV9TU1NJRF9TUEFSRTsKKworCWlmIChtb2R1bHVzID09IEFYMjVfTU9EVUxVUykKKwkJYnVmWzZdIHw9IEFYMjVfU1NTSURfU1BBUkU7CisJZWxzZQorCQlidWZbNl0gfD0gQVgyNV9FU1NJRF9TUEFSRTsKKworCWlmIChmbGFnID09IEFYMjVfUkVTUE9OU0UpIGJ1Zls2XSB8PSBBWDI1X0NCSVQ7CisKKwkvKgorCSAqCUZhc3QgcGF0aCB0aGUgbm9ybWFsIGRpZ2lsZXNzIHBhdGgKKwkgKi8KKwlpZiAoZCA9PSBOVUxMIHx8IGQtPm5kaWdpID09IDApIHsKKwkJYnVmWzZdIHw9IEFYMjVfRUJJVDsKKwkJcmV0dXJuIDIgKiBBWDI1X0FERFJfTEVOOworCX0KKworCWJ1ZiArPSBBWDI1X0FERFJfTEVOOworCWxlbiArPSBBWDI1X0FERFJfTEVOOworCisJd2hpbGUgKGN0IDwgZC0+bmRpZ2kpIHsKKwkJbWVtY3B5KGJ1ZiwgJmQtPmNhbGxzW2N0XSwgQVgyNV9BRERSX0xFTik7CisKKwkJaWYgKGQtPnJlcGVhdGVkW2N0XSkKKwkJCWJ1Zls2XSB8PSBBWDI1X0hCSVQ7CisJCWVsc2UKKwkJCWJ1Zls2XSAmPSB+QVgyNV9IQklUOworCisJCWJ1Zls2XSAmPSB+QVgyNV9FQklUOworCQlidWZbNl0gfD0gQVgyNV9TU1NJRF9TUEFSRTsKKworCQlidWYgKz0gQVgyNV9BRERSX0xFTjsKKwkJbGVuICs9IEFYMjVfQUREUl9MRU47CisJCWN0Kys7CisJfQorCisJYnVmWy0xXSB8PSBBWDI1X0VCSVQ7CisKKwlyZXR1cm4gbGVuOworfQorCitpbnQgYXgyNV9hZGRyX3NpemUoYXgyNV9kaWdpICpkcCkKK3sKKwlpZiAoZHAgPT0gTlVMTCkKKwkJcmV0dXJuIDIgKiBBWDI1X0FERFJfTEVOOworCisJcmV0dXJuIEFYMjVfQUREUl9MRU4gKiAoMiArIGRwLT5uZGlnaSk7Cit9CisKKy8qCisgKglSZXZlcnNlIERpZ2lwZWF0IExpc3QuIE1heSBub3QgcGFzcyBib3RoIHBhcmFtZXRlcnMgYXMgc2FtZSBzdHJ1Y3QKKyAqLwordm9pZCBheDI1X2RpZ2lfaW52ZXJ0KGF4MjVfZGlnaSAqaW4sIGF4MjVfZGlnaSAqb3V0KQoreworCWludCBjdDsKKworCW91dC0+bmRpZ2kgICAgICA9IGluLT5uZGlnaTsKKwlvdXQtPmxhc3RyZXBlYXQgPSBpbi0+bmRpZ2kgLSBpbi0+bGFzdHJlcGVhdCAtIDI7CisKKwkvKiBJbnZlcnQgdGhlIGRpZ2lwZWF0ZXJzICovCisJZm9yIChjdCA9IDA7IGN0IDwgaW4tPm5kaWdpOyBjdCsrKSB7CisJCW91dC0+Y2FsbHNbY3RdID0gaW4tPmNhbGxzW2luLT5uZGlnaSAtIGN0IC0gMV07CisKKwkJaWYgKGN0IDw9IG91dC0+bGFzdHJlcGVhdCkgeworCQkJb3V0LT5jYWxsc1tjdF0uYXgyNV9jYWxsWzZdIHw9IEFYMjVfSEJJVDsKKwkJCW91dC0+cmVwZWF0ZWRbY3RdICAgICAgICAgICAgPSAxOworCQl9IGVsc2UgeworCQkJb3V0LT5jYWxsc1tjdF0uYXgyNV9jYWxsWzZdICY9IH5BWDI1X0hCSVQ7CisJCQlvdXQtPnJlcGVhdGVkW2N0XSAgICAgICAgICAgID0gMDsKKwkJfQorCX0KK30KKwpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYXgyNV9kZXYuYyBiL25ldC9heDI1L2F4MjVfZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFiNzdlZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9heDI1L2F4MjVfZGV2LmMKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgSm9uYXRoYW4gTmF5bG9yIEc0S0xYIChnNGtseEBnNGtseC5kZW1vbi5jby51aykKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxuZXQvYXgyNS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKK2F4MjVfZGV2ICpheDI1X2Rldl9saXN0OworREVGSU5FX1NQSU5MT0NLKGF4MjVfZGV2X2xvY2spOworCitheDI1X2RldiAqYXgyNV9hZGRyX2F4MjVkZXYoYXgyNV9hZGRyZXNzICphZGRyKQoreworCWF4MjVfZGV2ICpheDI1X2RldiwgKnJlcyA9IE5VTEw7CisKKwlzcGluX2xvY2tfYmgoJmF4MjVfZGV2X2xvY2spOworCWZvciAoYXgyNV9kZXYgPSBheDI1X2Rldl9saXN0OyBheDI1X2RldiAhPSBOVUxMOyBheDI1X2RldiA9IGF4MjVfZGV2LT5uZXh0KQorCQlpZiAoYXgyNWNtcChhZGRyLCAoYXgyNV9hZGRyZXNzICopYXgyNV9kZXYtPmRldi0+ZGV2X2FkZHIpID09IDApIHsKKwkJCXJlcyA9IGF4MjVfZGV2OworCQl9CisJc3Bpbl91bmxvY2tfYmgoJmF4MjVfZGV2X2xvY2spOworCisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqCVRoaXMgaXMgY2FsbGVkIHdoZW4gYW4gaW50ZXJmYWNlIGlzIGJyb3VnaHQgdXAuIFRoZXNlIGFyZQorICoJcmVhc29uYWJsZSBkZWZhdWx0cy4KKyAqLwordm9pZCBheDI1X2Rldl9kZXZpY2VfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlheDI1X2RldiAqYXgyNV9kZXY7CisKKwlpZiAoKGF4MjVfZGV2ID0ga21hbGxvYyhzaXplb2YoKmF4MjVfZGV2KSwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJBWC4yNTogYXgyNV9kZXZfZGV2aWNlX3VwIC0gb3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybjsKKwl9CisKKwlheDI1X3VucmVnaXN0ZXJfc3lzY3RsKCk7CisKKwltZW1zZXQoYXgyNV9kZXYsIDB4MDAsIHNpemVvZigqYXgyNV9kZXYpKTsKKworCWRldi0+YXgyNV9wdHIgICAgID0gYXgyNV9kZXY7CisJYXgyNV9kZXYtPmRldiAgICAgPSBkZXY7CisJZGV2X2hvbGQoZGV2KTsKKwlheDI1X2Rldi0+Zm9yd2FyZCA9IE5VTEw7CisKKwlheDI1X2Rldi0+dmFsdWVzW0FYMjVfVkFMVUVTX0lQREVGTU9ERV0gPSBBWDI1X0RFRl9JUERFRk1PREU7CisJYXgyNV9kZXYtPnZhbHVlc1tBWDI1X1ZBTFVFU19BWERFRk1PREVdID0gQVgyNV9ERUZfQVhERUZNT0RFOworCWF4MjVfZGV2LT52YWx1ZXNbQVgyNV9WQUxVRVNfQkFDS09GRl0gICA9IEFYMjVfREVGX0JBQ0tPRkY7CisJYXgyNV9kZXYtPnZhbHVlc1tBWDI1X1ZBTFVFU19DT05NT0RFXSAgID0gQVgyNV9ERUZfQ09OTU9ERTsKKwlheDI1X2Rldi0+dmFsdWVzW0FYMjVfVkFMVUVTX1dJTkRPV10gICAgPSBBWDI1X0RFRl9XSU5ET1c7CisJYXgyNV9kZXYtPnZhbHVlc1tBWDI1X1ZBTFVFU19FV0lORE9XXSAgID0gQVgyNV9ERUZfRVdJTkRPVzsKKwlheDI1X2Rldi0+dmFsdWVzW0FYMjVfVkFMVUVTX1QxXSAgICAgICAgPSBBWDI1X0RFRl9UMTsKKwlheDI1X2Rldi0+dmFsdWVzW0FYMjVfVkFMVUVTX1QyXSAgICAgICAgPSBBWDI1X0RFRl9UMjsKKwlheDI1X2Rldi0+dmFsdWVzW0FYMjVfVkFMVUVTX1QzXSAgICAgICAgPSBBWDI1X0RFRl9UMzsKKwlheDI1X2Rldi0+dmFsdWVzW0FYMjVfVkFMVUVTX0lETEVdCT0gQVgyNV9ERUZfSURMRTsKKwlheDI1X2Rldi0+dmFsdWVzW0FYMjVfVkFMVUVTX04yXSAgICAgICAgPSBBWDI1X0RFRl9OMjsKKwlheDI1X2Rldi0+dmFsdWVzW0FYMjVfVkFMVUVTX1BBQ0xFTl0JPSBBWDI1X0RFRl9QQUNMRU47CisJYXgyNV9kZXYtPnZhbHVlc1tBWDI1X1ZBTFVFU19QUk9UT0NPTF0gID0gQVgyNV9ERUZfUFJPVE9DT0w7CisJYXgyNV9kZXYtPnZhbHVlc1tBWDI1X1ZBTFVFU19EU19USU1FT1VUXT0gQVgyNV9ERUZfRFNfVElNRU9VVDsKKworI2lmIGRlZmluZWQoQ09ORklHX0FYMjVfREFNQV9TTEFWRSkgfHwgZGVmaW5lZChDT05GSUdfQVgyNV9EQU1BX01BU1RFUikKKwlpbml0X3RpbWVyKCZheDI1X2Rldi0+ZGFtYS5zbGF2ZV90aW1lcik7CisjZW5kaWYKKworCXNwaW5fbG9ja19iaCgmYXgyNV9kZXZfbG9jayk7CisJYXgyNV9kZXYtPm5leHQgPSBheDI1X2Rldl9saXN0OworCWF4MjVfZGV2X2xpc3QgID0gYXgyNV9kZXY7CisJc3Bpbl91bmxvY2tfYmgoJmF4MjVfZGV2X2xvY2spOworCisJYXgyNV9yZWdpc3Rlcl9zeXNjdGwoKTsKK30KKwordm9pZCBheDI1X2Rldl9kZXZpY2VfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWF4MjVfZGV2ICpzLCAqYXgyNV9kZXY7CisKKwlpZiAoKGF4MjVfZGV2ID0gYXgyNV9kZXZfYXgyNWRldihkZXYpKSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlheDI1X3VucmVnaXN0ZXJfc3lzY3RsKCk7CisKKwlzcGluX2xvY2tfYmgoJmF4MjVfZGV2X2xvY2spOworCisjaWZkZWYgQ09ORklHX0FYMjVfREFNQV9TTEFWRQorCWF4MjVfZHNfZGVsX3RpbWVyKGF4MjVfZGV2KTsKKyNlbmRpZgorCisJLyoKKwkgKglSZW1vdmUgYW55IHBhY2tldCBmb3J3YXJkaW5nIHRoYXQgcG9pbnRzIHRvIHRoaXMgZGV2aWNlLgorCSAqLworCWZvciAocyA9IGF4MjVfZGV2X2xpc3Q7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCisJCWlmIChzLT5mb3J3YXJkID09IGRldikKKwkJCXMtPmZvcndhcmQgPSBOVUxMOworCisJaWYgKChzID0gYXgyNV9kZXZfbGlzdCkgPT0gYXgyNV9kZXYpIHsKKwkJYXgyNV9kZXZfbGlzdCA9IHMtPm5leHQ7CisJCXNwaW5fdW5sb2NrX2JoKCZheDI1X2Rldl9sb2NrKTsKKwkJZGV2X3B1dChkZXYpOworCQlrZnJlZShheDI1X2Rldik7CisJCWF4MjVfcmVnaXN0ZXJfc3lzY3RsKCk7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAocyAhPSBOVUxMICYmIHMtPm5leHQgIT0gTlVMTCkgeworCQlpZiAocy0+bmV4dCA9PSBheDI1X2RldikgeworCQkJcy0+bmV4dCA9IGF4MjVfZGV2LT5uZXh0OworCQkJc3Bpbl91bmxvY2tfYmgoJmF4MjVfZGV2X2xvY2spOworCQkJZGV2X3B1dChkZXYpOworCQkJa2ZyZWUoYXgyNV9kZXYpOworCQkJYXgyNV9yZWdpc3Rlcl9zeXNjdGwoKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXMgPSBzLT5uZXh0OworCX0KKwlzcGluX3VubG9ja19iaCgmYXgyNV9kZXZfbG9jayk7CisJZGV2LT5heDI1X3B0ciA9IE5VTEw7CisKKwlheDI1X3JlZ2lzdGVyX3N5c2N0bCgpOworfQorCitpbnQgYXgyNV9md2RfaW9jdGwodW5zaWduZWQgaW50IGNtZCwgc3RydWN0IGF4MjVfZndkX3N0cnVjdCAqZndkKQoreworCWF4MjVfZGV2ICpheDI1X2RldiwgKmZ3ZF9kZXY7CisKKwlpZiAoKGF4MjVfZGV2ID0gYXgyNV9hZGRyX2F4MjVkZXYoJmZ3ZC0+cG9ydF9mcm9tKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0FYMjVBRERGV0Q6CisJCWlmICgoZndkX2RldiA9IGF4MjVfYWRkcl9heDI1ZGV2KCZmd2QtPnBvcnRfdG8pKSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChheDI1X2Rldi0+Zm9yd2FyZCAhPSBOVUxMKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWF4MjVfZGV2LT5mb3J3YXJkID0gZndkX2Rldi0+ZGV2OworCQlicmVhazsKKworCWNhc2UgU0lPQ0FYMjVERUxGV0Q6CisJCWlmIChheDI1X2Rldi0+Zm9yd2FyZCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWF4MjVfZGV2LT5mb3J3YXJkID0gTlVMTDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IG5ldF9kZXZpY2UgKmF4MjVfZndkX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWF4MjVfZGV2ICpheDI1X2RldjsKKworCWlmICgoYXgyNV9kZXYgPSBheDI1X2Rldl9heDI1ZGV2KGRldikpID09IE5VTEwpCisJCXJldHVybiBkZXY7CisKKwlpZiAoYXgyNV9kZXYtPmZvcndhcmQgPT0gTlVMTCkKKwkJcmV0dXJuIGRldjsKKworCXJldHVybiBheDI1X2Rldi0+Zm9yd2FyZDsKK30KKworLyoKKyAqCUZyZWUgYWxsIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggZGV2aWNlIHN0cnVjdHVyZXMuCisgKi8KK3ZvaWQgX19leGl0IGF4MjVfZGV2X2ZyZWUodm9pZCkKK3sKKwlheDI1X2RldiAqcywgKmF4MjVfZGV2OworCisJc3Bpbl9sb2NrX2JoKCZheDI1X2Rldl9sb2NrKTsKKwlheDI1X2RldiA9IGF4MjVfZGV2X2xpc3Q7CisJd2hpbGUgKGF4MjVfZGV2ICE9IE5VTEwpIHsKKwkJcyAgICAgICAgPSBheDI1X2RldjsKKwkJZGV2X3B1dChheDI1X2Rldi0+ZGV2KTsKKwkJYXgyNV9kZXYgPSBheDI1X2Rldi0+bmV4dDsKKwkJa2ZyZWUocyk7CisJfQorCWF4MjVfZGV2X2xpc3QgPSBOVUxMOworCXNwaW5fdW5sb2NrX2JoKCZheDI1X2Rldl9sb2NrKTsKK30KZGlmZiAtLWdpdCBhL25ldC9heDI1L2F4MjVfZHNfaW4uYyBiL25ldC9heDI1L2F4MjVfZHNfaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWRjMDAyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2F4MjUvYXgyNV9kc19pbi5jCkBAIC0wLDAgKzEsMzA1IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIEpvbmF0aGFuIE5heWxvciBHNEtMWCAoZzRrbHhAZzRrbHguZGVtb24uY28udWspCisgKiBDb3B5cmlnaHQgKEMpIEpvZXJnIFJldXRlciBETDFCS0UgKGpyZXV0ZXJAeWFpbmEuZGUpCisgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPG5ldC9heDI1Lmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CQkJLyogRm9yIGlwX3JjdiAqLworI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKy8qCisgKglTdGF0ZSBtYWNoaW5lIGZvciBzdGF0ZSAxLCBBd2FpdGluZyBDb25uZWN0aW9uIFN0YXRlLgorICoJVGhlIGhhbmRsaW5nIG9mIHRoZSB0aW1lcihzKSBpcyBpbiBmaWxlIGF4MjVfZHNfdGltZXIuYy4KKyAqCUhhbmRsaW5nIG9mIHN0YXRlIDAgYW5kIGNvbm5lY3Rpb24gcmVsZWFzZSBpcyBpbiBheDI1LmMuCisgKi8KK3N0YXRpYyBpbnQgYXgyNV9kc19zdGF0ZTFfbWFjaGluZShheDI1X2NiICpheDI1LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZnJhbWV0eXBlLCBpbnQgcGYsIGludCB0eXBlKQoreworCXN3aXRjaCAoZnJhbWV0eXBlKSB7CisJY2FzZSBBWDI1X1NBQk06CisJCWF4MjUtPm1vZHVsdXMgPSBBWDI1X01PRFVMVVM7CisJCWF4MjUtPndpbmRvdyAgPSBheDI1LT5heDI1X2Rldi0+dmFsdWVzW0FYMjVfVkFMVUVTX1dJTkRPV107CisJCWF4MjVfc2VuZF9jb250cm9sKGF4MjUsIEFYMjVfVUEsIHBmLCBBWDI1X1JFU1BPTlNFKTsKKwkJYnJlYWs7CisKKwljYXNlIEFYMjVfU0FCTUU6CisJCWF4MjUtPm1vZHVsdXMgPSBBWDI1X0VNT0RVTFVTOworCQlheDI1LT53aW5kb3cgID0gIGF4MjUtPmF4MjVfZGV2LT52YWx1ZXNbQVgyNV9WQUxVRVNfRVdJTkRPV107CisJCWF4MjVfc2VuZF9jb250cm9sKGF4MjUsIEFYMjVfVUEsIHBmLCBBWDI1X1JFU1BPTlNFKTsKKwkJYnJlYWs7CisKKwljYXNlIEFYMjVfRElTQzoKKwkJYXgyNV9zZW5kX2NvbnRyb2woYXgyNSwgQVgyNV9ETSwgcGYsIEFYMjVfUkVTUE9OU0UpOworCQlicmVhazsKKworCWNhc2UgQVgyNV9VQToKKwkJYXgyNV9jYWxjdWxhdGVfcnR0KGF4MjUpOworCQlheDI1X3N0b3BfdDF0aW1lcihheDI1KTsKKwkJYXgyNV9zdGFydF90M3RpbWVyKGF4MjUpOworCQlheDI1X3N0YXJ0X2lkbGV0aW1lcihheDI1KTsKKwkJYXgyNS0+dnMgICAgICA9IDA7CisJCWF4MjUtPnZhICAgICAgPSAwOworCQlheDI1LT52ciAgICAgID0gMDsKKwkJYXgyNS0+c3RhdGUgICA9IEFYMjVfU1RBVEVfMzsKKwkJYXgyNS0+bjJjb3VudCA9IDA7CisJCWlmIChheDI1LT5zayAhPSBOVUxMKSB7CisJCQliaF9sb2NrX3NvY2soYXgyNS0+c2spOworCQkJYXgyNS0+c2stPnNrX3N0YXRlID0gVENQX0VTVEFCTElTSEVEOworCQkJLyoKKwkJCSAqIEZvciBXQUlUX1NBQk0gY29ubmVjdGlvbnMgd2Ugd2lsbCBwcm9kdWNlIGFuIGFjY2VwdAorCQkJICogcmVhZHkgc29ja2V0IGhlcmUKKwkJCSAqLworCQkJaWYgKCFzb2NrX2ZsYWcoYXgyNS0+c2ssIFNPQ0tfREVBRCkpCisJCQkJYXgyNS0+c2stPnNrX3N0YXRlX2NoYW5nZShheDI1LT5zayk7CisJCQliaF91bmxvY2tfc29jayhheDI1LT5zayk7CisJCX0KKwkJYXgyNV9kYW1hX29uKGF4MjUpOworCisJCS8qIGFjY29yZGluZyB0byBESzRFR7RzIHNwZWMgd2UgYXJlIHJlcXVpcmVkIHRvCisJCSAqIHNlbmQgYSBSUiBSRVNQT05TRSBGSU5BTCBOUj0wLgorCQkgKi8KKworCQlheDI1X3N0ZF9lbnF1aXJ5X3Jlc3BvbnNlKGF4MjUpOworCQlicmVhazsKKworCWNhc2UgQVgyNV9ETToKKwkJaWYgKHBmKQorCQkJYXgyNV9kaXNjb25uZWN0KGF4MjUsIEVDT05OUkVGVVNFRCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJaWYgKHBmKQorCQkJYXgyNV9zZW5kX2NvbnRyb2woYXgyNSwgQVgyNV9TQUJNLCBBWDI1X1BPTExPTiwgQVgyNV9DT01NQU5EKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglTdGF0ZSBtYWNoaW5lIGZvciBzdGF0ZSAyLCBBd2FpdGluZyBSZWxlYXNlIFN0YXRlLgorICoJVGhlIGhhbmRsaW5nIG9mIHRoZSB0aW1lcihzKSBpcyBpbiBmaWxlIGF4MjVfZHNfdGltZXIuYworICoJSGFuZGxpbmcgb2Ygc3RhdGUgMCBhbmQgY29ubmVjdGlvbiByZWxlYXNlIGlzIGluIGF4MjUuYy4KKyAqLworc3RhdGljIGludCBheDI1X2RzX3N0YXRlMl9tYWNoaW5lKGF4MjVfY2IgKmF4MjUsIHN0cnVjdCBza19idWZmICpza2IsIGludCBmcmFtZXR5cGUsIGludCBwZiwgaW50IHR5cGUpCit7CisJc3dpdGNoIChmcmFtZXR5cGUpIHsKKwljYXNlIEFYMjVfU0FCTToKKwljYXNlIEFYMjVfU0FCTUU6CisJCWF4MjVfc2VuZF9jb250cm9sKGF4MjUsIEFYMjVfRElTQywgQVgyNV9QT0xMT04sIEFYMjVfQ09NTUFORCk7CisJCWF4MjVfZGFtYV9vZmYoYXgyNSk7CisJCWJyZWFrOworCisJY2FzZSBBWDI1X0RJU0M6CisJCWF4MjVfc2VuZF9jb250cm9sKGF4MjUsIEFYMjVfVUEsIHBmLCBBWDI1X1JFU1BPTlNFKTsKKwkJYXgyNV9kYW1hX29mZihheDI1KTsKKwkJYXgyNV9kaXNjb25uZWN0KGF4MjUsIDApOworCQlicmVhazsKKworCWNhc2UgQVgyNV9ETToKKwljYXNlIEFYMjVfVUE6CisJCWlmIChwZikgeworCQkJYXgyNV9kYW1hX29mZihheDI1KTsKKwkJCWF4MjVfZGlzY29ubmVjdChheDI1LCAwKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQVgyNV9JOgorCWNhc2UgQVgyNV9SRUo6CisJY2FzZSBBWDI1X1JOUjoKKwljYXNlIEFYMjVfUlI6CisJCWlmIChwZikgeworCQkJYXgyNV9zZW5kX2NvbnRyb2woYXgyNSwgQVgyNV9ESVNDLCBBWDI1X1BPTExPTiwgQVgyNV9DT01NQU5EKTsKKwkJCWF4MjVfZGFtYV9vZmYoYXgyNSk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCVN0YXRlIG1hY2hpbmUgZm9yIHN0YXRlIDMsIENvbm5lY3RlZCBTdGF0ZS4KKyAqCVRoZSBoYW5kbGluZyBvZiB0aGUgdGltZXIocykgaXMgaW4gZmlsZSBheDI1X3RpbWVyLmMKKyAqCUhhbmRsaW5nIG9mIHN0YXRlIDAgYW5kIGNvbm5lY3Rpb24gcmVsZWFzZSBpcyBpbiBheDI1LmMuCisgKi8KK3N0YXRpYyBpbnQgYXgyNV9kc19zdGF0ZTNfbWFjaGluZShheDI1X2NiICpheDI1LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZnJhbWV0eXBlLCBpbnQgbnMsIGludCBuciwgaW50IHBmLCBpbnQgdHlwZSkKK3sKKwlpbnQgcXVldWVkID0gMDsKKworCXN3aXRjaCAoZnJhbWV0eXBlKSB7CisJY2FzZSBBWDI1X1NBQk06CisJY2FzZSBBWDI1X1NBQk1FOgorCQlpZiAoZnJhbWV0eXBlID09IEFYMjVfU0FCTSkgeworCQkJYXgyNS0+bW9kdWx1cyAgID0gQVgyNV9NT0RVTFVTOworCQkJYXgyNS0+d2luZG93ICAgID0gYXgyNS0+YXgyNV9kZXYtPnZhbHVlc1tBWDI1X1ZBTFVFU19XSU5ET1ddOworCQl9IGVsc2UgeworCQkJYXgyNS0+bW9kdWx1cyAgID0gQVgyNV9FTU9EVUxVUzsKKwkJCWF4MjUtPndpbmRvdyAgICA9IGF4MjUtPmF4MjVfZGV2LT52YWx1ZXNbQVgyNV9WQUxVRVNfRVdJTkRPV107CisJCX0KKwkJYXgyNV9zZW5kX2NvbnRyb2woYXgyNSwgQVgyNV9VQSwgcGYsIEFYMjVfUkVTUE9OU0UpOworCQlheDI1X3N0b3BfdDF0aW1lcihheDI1KTsKKwkJYXgyNV9zdGFydF90M3RpbWVyKGF4MjUpOworCQlheDI1X3N0YXJ0X2lkbGV0aW1lcihheDI1KTsKKwkJYXgyNS0+Y29uZGl0aW9uID0gMHgwMDsKKwkJYXgyNS0+dnMgICAgICAgID0gMDsKKwkJYXgyNS0+dmEgICAgICAgID0gMDsKKwkJYXgyNS0+dnIgICAgICAgID0gMDsKKwkJYXgyNV9yZXF1ZXVlX2ZyYW1lcyhheDI1KTsKKwkJYXgyNV9kYW1hX29uKGF4MjUpOworCQlicmVhazsKKworCWNhc2UgQVgyNV9ESVNDOgorCQlheDI1X3NlbmRfY29udHJvbChheDI1LCBBWDI1X1VBLCBwZiwgQVgyNV9SRVNQT05TRSk7CisJCWF4MjVfZGFtYV9vZmYoYXgyNSk7CisJCWF4MjVfZGlzY29ubmVjdChheDI1LCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIEFYMjVfRE06CisJCWF4MjVfZGFtYV9vZmYoYXgyNSk7CisJCWF4MjVfZGlzY29ubmVjdChheDI1LCBFQ09OTlJFU0VUKTsKKwkJYnJlYWs7CisKKwljYXNlIEFYMjVfUlI6CisJY2FzZSBBWDI1X1JOUjoKKwkJaWYgKGZyYW1ldHlwZSA9PSBBWDI1X1JSKQorCQkJYXgyNS0+Y29uZGl0aW9uICY9IH5BWDI1X0NPTkRfUEVFUl9SWF9CVVNZOworCQllbHNlCisJCQlheDI1LT5jb25kaXRpb24gfD0gQVgyNV9DT05EX1BFRVJfUlhfQlVTWTsKKworCQlpZiAoYXgyNV92YWxpZGF0ZV9ucihheDI1LCBucikpIHsKKwkJCWlmIChheDI1X2NoZWNrX2lmcmFtZXNfYWNrZWQoYXgyNSwgbnIpKQorCQkJCWF4MjUtPm4yY291bnQ9MDsKKwkJCWlmICh0eXBlID09IEFYMjVfQ09NTUFORCAmJiBwZikKKwkJCQlheDI1X2RzX2VucXVpcnlfcmVzcG9uc2UoYXgyNSk7CisJCX0gZWxzZSB7CisJCQlheDI1X2RzX25yX2Vycm9yX3JlY292ZXJ5KGF4MjUpOworCQkJYXgyNS0+c3RhdGUgPSBBWDI1X1NUQVRFXzE7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFYMjVfUkVKOgorCQlheDI1LT5jb25kaXRpb24gJj0gfkFYMjVfQ09ORF9QRUVSX1JYX0JVU1k7CisKKwkJaWYgKGF4MjVfdmFsaWRhdGVfbnIoYXgyNSwgbnIpKSB7CisJCQlpZiAoYXgyNS0+dmEgIT0gbnIpCisJCQkJYXgyNS0+bjJjb3VudD0wOworCisJCQlheDI1X2ZyYW1lc19hY2tlZChheDI1LCBucik7CisJCQlheDI1X2NhbGN1bGF0ZV9ydHQoYXgyNSk7CisJCQlheDI1X3N0b3BfdDF0aW1lcihheDI1KTsKKwkJCWF4MjVfc3RhcnRfdDN0aW1lcihheDI1KTsKKwkJCWF4MjVfcmVxdWV1ZV9mcmFtZXMoYXgyNSk7CisKKwkJCWlmICh0eXBlID09IEFYMjVfQ09NTUFORCAmJiBwZikKKwkJCQlheDI1X2RzX2VucXVpcnlfcmVzcG9uc2UoYXgyNSk7CisJCX0gZWxzZSB7CisJCQlheDI1X2RzX25yX2Vycm9yX3JlY292ZXJ5KGF4MjUpOworCQkJYXgyNS0+c3RhdGUgPSBBWDI1X1NUQVRFXzE7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFYMjVfSToKKwkJaWYgKCFheDI1X3ZhbGlkYXRlX25yKGF4MjUsIG5yKSkgeworCQkJYXgyNV9kc19ucl9lcnJvcl9yZWNvdmVyeShheDI1KTsKKwkJCWF4MjUtPnN0YXRlID0gQVgyNV9TVEFURV8xOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGF4MjUtPmNvbmRpdGlvbiAmIEFYMjVfQ09ORF9QRUVSX1JYX0JVU1kpIHsKKwkJCWF4MjVfZnJhbWVzX2Fja2VkKGF4MjUsIG5yKTsKKwkJCWF4MjUtPm4yY291bnQgPSAwOworCQl9IGVsc2UgeworCQkJaWYgKGF4MjVfY2hlY2tfaWZyYW1lc19hY2tlZChheDI1LCBucikpCisJCQkJYXgyNS0+bjJjb3VudCA9IDA7CisJCX0KKwkJaWYgKGF4MjUtPmNvbmRpdGlvbiAmIEFYMjVfQ09ORF9PV05fUlhfQlVTWSkgeworCQkJaWYgKHBmKSBheDI1X2RzX2VucXVpcnlfcmVzcG9uc2UoYXgyNSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAobnMgPT0gYXgyNS0+dnIpIHsKKwkJCWF4MjUtPnZyID0gKGF4MjUtPnZyICsgMSkgJSBheDI1LT5tb2R1bHVzOworCQkJcXVldWVkID0gYXgyNV9yeF9pZnJhbWUoYXgyNSwgc2tiKTsKKwkJCWlmIChheDI1LT5jb25kaXRpb24gJiBBWDI1X0NPTkRfT1dOX1JYX0JVU1kpCisJCQkJYXgyNS0+dnIgPSBuczsJLyogYXgyNS0+dnIgLSAxICovCisJCQlheDI1LT5jb25kaXRpb24gJj0gfkFYMjVfQ09ORF9SRUpFQ1Q7CisJCQlpZiAocGYpIHsKKwkJCQlheDI1X2RzX2VucXVpcnlfcmVzcG9uc2UoYXgyNSk7CisJCQl9IGVsc2UgeworCQkJCWlmICghKGF4MjUtPmNvbmRpdGlvbiAmIEFYMjVfQ09ORF9BQ0tfUEVORElORykpIHsKKwkJCQkJYXgyNS0+Y29uZGl0aW9uIHw9IEFYMjVfQ09ORF9BQ0tfUEVORElORzsKKwkJCQkJYXgyNV9zdGFydF90MnRpbWVyKGF4MjUpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChheDI1LT5jb25kaXRpb24gJiBBWDI1X0NPTkRfUkVKRUNUKSB7CisJCQkJaWYgKHBmKSBheDI1X2RzX2VucXVpcnlfcmVzcG9uc2UoYXgyNSk7CisJCQl9IGVsc2UgeworCQkJCWF4MjUtPmNvbmRpdGlvbiB8PSBBWDI1X0NPTkRfUkVKRUNUOworCQkJCWF4MjVfZHNfZW5xdWlyeV9yZXNwb25zZShheDI1KTsKKwkJCQlheDI1LT5jb25kaXRpb24gJj0gfkFYMjVfQ09ORF9BQ0tfUEVORElORzsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgQVgyNV9GUk1SOgorCWNhc2UgQVgyNV9JTExFR0FMOgorCQlheDI1X2RzX2VzdGFibGlzaF9kYXRhX2xpbmsoYXgyNSk7CisJCWF4MjUtPnN0YXRlID0gQVgyNV9TVEFURV8xOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBxdWV1ZWQ7Cit9CisKKy8qCisgKglIaWdoZXIgbGV2ZWwgdXBjYWxsIGZvciBhIExBUEIgZnJhbWUKKyAqLworaW50IGF4MjVfZHNfZnJhbWVfaW4oYXgyNV9jYiAqYXgyNSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHR5cGUpCit7CisJaW50IHF1ZXVlZCA9IDAsIGZyYW1ldHlwZSwgbnMsIG5yLCBwZjsKKworCWZyYW1ldHlwZSA9IGF4MjVfZGVjb2RlKGF4MjUsIHNrYiwgJm5zLCAmbnIsICZwZik7CisKKwlzd2l0Y2ggKGF4MjUtPnN0YXRlKSB7CisJY2FzZSBBWDI1X1NUQVRFXzE6CisJCXF1ZXVlZCA9IGF4MjVfZHNfc3RhdGUxX21hY2hpbmUoYXgyNSwgc2tiLCBmcmFtZXR5cGUsIHBmLCB0eXBlKTsKKwkJYnJlYWs7CisJY2FzZSBBWDI1X1NUQVRFXzI6CisJCXF1ZXVlZCA9IGF4MjVfZHNfc3RhdGUyX21hY2hpbmUoYXgyNSwgc2tiLCBmcmFtZXR5cGUsIHBmLCB0eXBlKTsKKwkJYnJlYWs7CisJY2FzZSBBWDI1X1NUQVRFXzM6CisJCXF1ZXVlZCA9IGF4MjVfZHNfc3RhdGUzX21hY2hpbmUoYXgyNSwgc2tiLCBmcmFtZXR5cGUsIG5zLCBuciwgcGYsIHR5cGUpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcXVldWVkOworfQorCmRpZmYgLS1naXQgYS9uZXQvYXgyNS9heDI1X2RzX3N1YnIuYyBiL25ldC9heDI1L2F4MjVfZHNfc3Vici5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZmZkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYXgyNS9heDI1X2RzX3N1YnIuYwpAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQ29weXJpZ2h0IChDKSBKb25hdGhhbiBOYXlsb3IgRzRLTFggKGc0a2x4QGc0a2x4LmRlbW9uLmNvLnVrKQorICogQ29weXJpZ2h0IChDKSBKb2VyZyBSZXV0ZXIgREwxQktFIChqcmV1dGVyQHlhaW5hLmRlKQorICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPG5ldC9heDI1Lmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCit2b2lkIGF4MjVfZHNfbnJfZXJyb3JfcmVjb3ZlcnkoYXgyNV9jYiAqYXgyNSkKK3sKKwlheDI1X2RzX2VzdGFibGlzaF9kYXRhX2xpbmsoYXgyNSk7Cit9CisKKy8qCisgKglkbDFia2UgOTYwMTE0OiB0cmFuc21pdCBJIGZyYW1lcyBvbiBEQU1BIHBvbGwKKyAqLwordm9pZCBheDI1X2RzX2VucXVpcnlfcmVzcG9uc2UoYXgyNV9jYiAqYXgyNSkKK3sKKwlheDI1X2NiICpheDI1bzsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCS8qIFBsZWFzZSBub3RlIHRoYXQgbmVpdGhlciBESzRFR7RzIG5vciBERzJGRUa0cworCSAqIERBTUEgc3BlYyBtZW50aW9uIHRoZSBmb2xsb3dpbmcgYmVoYXZpb3VyIGFzIHNlZW4KKwkgKiB3aXRoIFRoZUZpcm13YXJlOgorCSAqCisJICogCURCMEFDSC0+REwxQktFIDxSUiBDIFAgUjA+IFtEQU1BXQorCSAqCURMMUJLRS0+REIwQUNIIDxJIE5SPTAgTlM9MD4KKwkgKglETDFCS0UtNy0+REIwUFJBLTYgREIwQUNIIDxJIEMgUzMgUjU+CisJICoJREwxQktFLT5EQjBBQ0ggPFJSIFIgRiBSMD4KKwkgKgorCSAqIFRoZSBGbGV4bmV0IERBTUEgTWFzdGVyIGltcGxlbWVudGF0aW9uIGFwcGFyZW50bHkKKwkgKiBpbnNpc3RzIG9uIHRoZSAicHJvcGVyIiBBWC4yNSBiZWhhdmlvdXI6CisJICoKKwkgKiAJREIwQUNILT5ETDFCS0UgPFJSIEMgUCBSMD4gW0RBTUFdCisJICoJREwxQktFLT5EQjBBQ0ggPFJSIFIgRiBSMD4KKwkgKglETDFCS0UtPkRCMEFDSCA8SSBOUj0wIE5TPTA+CisJICoJREwxQktFLTctPkRCMFBSQS02IERCMEFDSCA8SSBDIFMzIFI1PgorCSAqCisJICogRmxleG5ldCByZWZ1c2VzIHRvIHNlbmQgdXMgKmFueSogSSBmcmFtZSBpZiB3ZSBzZW5kCisJICogYSBSRUogaW4gY2FzZSBBWDI1X0NPTkRfUkVKRUNUIGlzIHNldC4gSXQgaXMgc3VwZXJmbHVvdXMgaW4KKwkgKiB0aGlzIG1vZGUgYW55d2F5IChhIFJSIG9yIFJOUiBpbnZva2VzIHRoZSByZXRyYW5zbWlzc2lvbikuCisJICogSXMgdGhpcyBhIEZsZXhuZXQgYnVnPworCSAqLworCisJYXgyNV9zdGRfZW5xdWlyeV9yZXNwb25zZShheDI1KTsKKworCWlmICghKGF4MjUtPmNvbmRpdGlvbiAmIEFYMjVfQ09ORF9QRUVSX1JYX0JVU1kpKSB7CisJCWF4MjVfcmVxdWV1ZV9mcmFtZXMoYXgyNSk7CisJCWF4MjVfa2ljayhheDI1KTsKKwl9CisKKwlpZiAoYXgyNS0+c3RhdGUgPT0gQVgyNV9TVEFURV8xIHx8IGF4MjUtPnN0YXRlID09IEFYMjVfU1RBVEVfMiB8fCBza2JfcGVlaygmYXgyNS0+YWNrX3F1ZXVlKSAhPSBOVUxMKQorCQlheDI1X2RzX3QxX3RpbWVvdXQoYXgyNSk7CisJZWxzZQorCQlheDI1LT5uMmNvdW50ID0gMDsKKworCWF4MjVfc3RhcnRfdDN0aW1lcihheDI1KTsKKwlheDI1X2RzX3NldF90aW1lcihheDI1LT5heDI1X2Rldik7CisKKwlzcGluX2xvY2tfYmgoJmF4MjVfbGlzdF9sb2NrKTsKKwlheDI1X2Zvcl9lYWNoKGF4MjVvLCBub2RlLCAmYXgyNV9saXN0KSB7CisJCWlmIChheDI1byA9PSBheDI1KQorCQkJY29udGludWU7CisKKwkJaWYgKGF4MjVvLT5heDI1X2RldiAhPSBheDI1LT5heDI1X2RldikKKwkJCWNvbnRpbnVlOworCisJCWlmIChheDI1by0+c3RhdGUgPT0gQVgyNV9TVEFURV8xIHx8IGF4MjVvLT5zdGF0ZSA9PSBBWDI1X1NUQVRFXzIpIHsKKwkJCWF4MjVfZHNfdDFfdGltZW91dChheDI1byk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghKGF4MjVvLT5jb25kaXRpb24gJiBBWDI1X0NPTkRfUEVFUl9SWF9CVVNZKSAmJiBheDI1by0+c3RhdGUgPT0gQVgyNV9TVEFURV8zKSB7CisJCQlheDI1X3JlcXVldWVfZnJhbWVzKGF4MjVvKTsKKwkJCWF4MjVfa2ljayhheDI1byk7CisJCX0KKworCQlpZiAoYXgyNW8tPnN0YXRlID09IEFYMjVfU1RBVEVfMSB8fCBheDI1by0+c3RhdGUgPT0gQVgyNV9TVEFURV8yIHx8IHNrYl9wZWVrKCZheDI1by0+YWNrX3F1ZXVlKSAhPSBOVUxMKQorCQkJYXgyNV9kc190MV90aW1lb3V0KGF4MjVvKTsKKworCQkvKiBkbyBub3Qgc3RhcnQgVDMgZm9yIGxpc3RlbmluZyBzb2NrZXRzICh0bnggREQ4TkUpICovCisKKwkJaWYgKGF4MjVvLT5zdGF0ZSAhPSBBWDI1X1NUQVRFXzApCisJCQlheDI1X3N0YXJ0X3QzdGltZXIoYXgyNW8pOworCX0KKwlzcGluX3VubG9ja19iaCgmYXgyNV9saXN0X2xvY2spOworfQorCit2b2lkIGF4MjVfZHNfZXN0YWJsaXNoX2RhdGFfbGluayhheDI1X2NiICpheDI1KQoreworCWF4MjUtPmNvbmRpdGlvbiAmPSBBWDI1X0NPTkRfREFNQV9NT0RFOworCWF4MjUtPm4yY291bnQgICAgPSAwOworCWF4MjVfY2FsY3VsYXRlX3QxKGF4MjUpOworCWF4MjVfc3RhcnRfdDF0aW1lcihheDI1KTsKKwlheDI1X3N0b3BfdDJ0aW1lcihheDI1KTsKKwlheDI1X3N0YXJ0X3QzdGltZXIoYXgyNSk7Cit9CisKKy8qCisgKgk6OjpGSVhNRTo6OgorICoJVGhpcyBpcyBhIGtsdWRnZS4gTm90IGFsbCBkcml2ZXJzIHJlY29nbml6ZSBraXNzIGNvbW1hbmRzLgorICoJV2UgbmVlZCBhIGRyaXZlciBsZXZlbCAgcmVxdWVzdCB0byBzd2l0Y2ggZHVwbGV4IG1vZGUsIHRoYXQgZG9lcworICoJZWl0aGVyIFNDQyBjaGFuZ2luZywgUEkgY29uZmlnIG9yIEtJU1MgYXMgcmVxdWlyZWQuIEN1cnJlbnRseQorICoJdGhpcyByZXF1ZXN0IGlzbid0IHJlbGlhYmxlLgorICovCitzdGF0aWMgdm9pZCBheDI1X2tpc3NfY21kKGF4MjVfZGV2ICpheDI1X2RldiwgdW5zaWduZWQgY2hhciBjbWQsIHVuc2lnbmVkIGNoYXIgcGFyYW0pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyICpwOworCisJaWYgKGF4MjVfZGV2LT5kZXYgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKChza2IgPSBhbGxvY19za2IoMiwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJCXJldHVybjsKKworCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCXAgPSBza2JfcHV0KHNrYiwgMik7CisKKwkqcCsrID0gY21kOworCSpwKysgPSBwYXJhbTsKKworCXNrYi0+ZGV2ICAgICAgPSBheDI1X2Rldi0+ZGV2OworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9BWDI1KTsKKworCWRldl9xdWV1ZV94bWl0KHNrYik7Cit9CisKKy8qCisgKglBIG5hc3R5IHByb2JsZW0gYXJpc2VzIGlmIHdlIGNvdW50IHRoZSBudW1iZXIgb2YgREFNQSBjb25uZWN0aW9ucworICoJd3JvbmcsIGVzcGVjaWFsbHkgd2hlbiBjb25uZWN0aW9ucyBvbiB0aGUgZGV2aWNlIGFscmVhZHkgZXhpc3RlZAorICoJYW5kIG91ciBuZXR3b3JrIG5vZGUgKG9yIHRoZSBzeXNvcCkgZGVjaWRlcyB0byB0dXJuIG9uIERBTUEgTWFzdGVyCisgKgltb2RlLiBXZSB0aHVzIGZsYWcgdGhlICdyZWFsJyBzbGF2ZSBjb25uZWN0aW9ucyB3aXRoCisgKglheDI1LT5kYW1hX3NsYXZlPTEgYW5kIGxvb2sgb24gZXZlcnkgZGlzY29ubmVjdCBpZiBzdGlsbCBzbGF2ZQorICoJY29ubmVjdGlvbnMgZXhpc3QuCisgKi8KK3N0YXRpYyBpbnQgYXgyNV9jaGVja19kYW1hX3NsYXZlKGF4MjVfZGV2ICpheDI1X2RldikKK3sKKwlheDI1X2NiICpheDI1OworCWludCByZXMgPSAwOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJc3Bpbl9sb2NrX2JoKCZheDI1X2xpc3RfbG9jayk7CisJYXgyNV9mb3JfZWFjaChheDI1LCBub2RlLCAmYXgyNV9saXN0KQorCQlpZiAoYXgyNS0+YXgyNV9kZXYgPT0gYXgyNV9kZXYgJiYgKGF4MjUtPmNvbmRpdGlvbiAmIEFYMjVfQ09ORF9EQU1BX01PREUpICYmIGF4MjUtPnN0YXRlID4gQVgyNV9TVEFURV8xKSB7CisJCQlyZXMgPSAxOworCQkJYnJlYWs7CisJCX0KKwlzcGluX3VubG9ja19iaCgmYXgyNV9saXN0X2xvY2spOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgYXgyNV9kZXZfZGFtYV9vbihheDI1X2RldiAqYXgyNV9kZXYpCit7CisJaWYgKGF4MjVfZGV2ID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChheDI1X2Rldi0+ZGFtYS5zbGF2ZSA9PSAwKQorCQlheDI1X2tpc3NfY21kKGF4MjVfZGV2LCA1LCAxKTsKKworCWF4MjVfZGV2LT5kYW1hLnNsYXZlID0gMTsKKwlheDI1X2RzX3NldF90aW1lcihheDI1X2Rldik7Cit9CisKK3ZvaWQgYXgyNV9kZXZfZGFtYV9vZmYoYXgyNV9kZXYgKmF4MjVfZGV2KQoreworCWlmIChheDI1X2RldiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoYXgyNV9kZXYtPmRhbWEuc2xhdmUgJiYgIWF4MjVfY2hlY2tfZGFtYV9zbGF2ZShheDI1X2RldikpIHsKKwkJYXgyNV9raXNzX2NtZChheDI1X2RldiwgNSwgMCk7CisJCWF4MjVfZGV2LT5kYW1hLnNsYXZlID0gMDsKKwkJYXgyNV9kc19kZWxfdGltZXIoYXgyNV9kZXYpOworCX0KK30KKwordm9pZCBheDI1X2RhbWFfb24oYXgyNV9jYiAqYXgyNSkKK3sKKwlheDI1X2Rldl9kYW1hX29uKGF4MjUtPmF4MjVfZGV2KTsKKwlheDI1LT5jb25kaXRpb24gfD0gQVgyNV9DT05EX0RBTUFfTU9ERTsKK30KKwordm9pZCBheDI1X2RhbWFfb2ZmKGF4MjVfY2IgKmF4MjUpCit7CisJYXgyNS0+Y29uZGl0aW9uICY9IH5BWDI1X0NPTkRfREFNQV9NT0RFOworCWF4MjVfZGV2X2RhbWFfb2ZmKGF4MjUtPmF4MjVfZGV2KTsKK30KKwpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYXgyNV9kc190aW1lci5jIGIvbmV0L2F4MjUvYXgyNV9kc190aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOGI2NzMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYXgyNS9heDI1X2RzX3RpbWVyLmMKQEAgLTAsMCArMSwyNDEgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgSm9uYXRoYW4gTmF5bG9yIEc0S0xYIChnNGtseEBnNGtseC5kZW1vbi5jby51aykKKyAqIENvcHlyaWdodCAoQykgSm9lcmcgUmV1dGVyIERMMUJLRSAoanJldXRlckB5YWluYS5kZSkKKyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvYXgyNS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworc3RhdGljIHZvaWQgYXgyNV9kc190aW1lb3V0KHVuc2lnbmVkIGxvbmcpOworCisvKgorICoJQWRkIERBTUEgc2xhdmUgdGltZW91dCB0aW1lciB0byB0aW1lciBsaXN0LgorICoJVW5saWtlIHRoZSBjb25uZWN0aW9uIGJhc2VkIHRpbWVycyB0aGUgdGltZW91dCBmdW5jdGlvbiBnZXRzCisgKgl0cmlnZ2VyZWQgZXZlcnkgc2Vjb25kLiBQbGVhc2Ugbm90ZSB0aGF0IE5FVF9BWDI1X0RBTUFfU0xBVkVfVElNRU9VVAorICoJKGFrYSAvcHJvYy9zeXMvbmV0L2F4MjUve2Rldn0vZGFtYV9zbGF2ZV90aW1lb3V0KSBpcyBzdGlsbCBpbgorICoJMS8xMHRoIG9mIGEgc2Vjb25kLgorICovCisKK3N0YXRpYyB2b2lkIGF4MjVfZHNfYWRkX3RpbWVyKGF4MjVfZGV2ICpheDI1X2RldikKK3sKKwlzdHJ1Y3QgdGltZXJfbGlzdCAqdCA9ICZheDI1X2Rldi0+ZGFtYS5zbGF2ZV90aW1lcjsKKwl0LT5kYXRhCQk9ICh1bnNpZ25lZCBsb25nKSBheDI1X2RldjsKKwl0LT5mdW5jdGlvbgk9ICZheDI1X2RzX3RpbWVvdXQ7CisJdC0+ZXhwaXJlcwk9IGppZmZpZXMgKyBIWjsKKwlhZGRfdGltZXIodCk7Cit9CisKK3ZvaWQgYXgyNV9kc19kZWxfdGltZXIoYXgyNV9kZXYgKmF4MjVfZGV2KQoreworCWlmIChheDI1X2RldikKKwkJZGVsX3RpbWVyKCZheDI1X2Rldi0+ZGFtYS5zbGF2ZV90aW1lcik7Cit9CisKK3ZvaWQgYXgyNV9kc19zZXRfdGltZXIoYXgyNV9kZXYgKmF4MjVfZGV2KQoreworCWlmIChheDI1X2RldiA9PSBOVUxMKQkJLyogcGFyYW5vaWEgKi8KKwkJcmV0dXJuOworCisJZGVsX3RpbWVyKCZheDI1X2Rldi0+ZGFtYS5zbGF2ZV90aW1lcik7CisJYXgyNV9kZXYtPmRhbWEuc2xhdmVfdGltZW91dCA9IGF4MjVfZGV2LT52YWx1ZXNbQVgyNV9WQUxVRVNfRFNfVElNRU9VVF0gLyAxMDsKKwlheDI1X2RzX2FkZF90aW1lcihheDI1X2Rldik7Cit9CisKKy8qCisgKglEQU1BIFNsYXZlIFRpbWVvdXQKKyAqCVNpbGVudGx5IGRpc2NhcmQgYWxsIChzbGF2ZSkgY29ubmVjdGlvbnMgaW4gY2FzZSBvdXIgbWFzdGVyIGZvcmdvdCB1cy4uLgorICovCisKK3N0YXRpYyB2b2lkIGF4MjVfZHNfdGltZW91dCh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlheDI1X2RldiAqYXgyNV9kZXYgPSAoc3RydWN0IGF4MjVfZGV2ICopIGFyZzsKKwlheDI1X2NiICpheDI1OworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJaWYgKGF4MjVfZGV2ID09IE5VTEwgfHwgIWF4MjVfZGV2LT5kYW1hLnNsYXZlKQorCQlyZXR1cm47CQkJLyogWWlrZXMhICovCisKKwlpZiAoIWF4MjVfZGV2LT5kYW1hLnNsYXZlX3RpbWVvdXQgfHwgLS1heDI1X2Rldi0+ZGFtYS5zbGF2ZV90aW1lb3V0KSB7CisJCWF4MjVfZHNfc2V0X3RpbWVyKGF4MjVfZGV2KTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19iaCgmYXgyNV9saXN0X2xvY2spOworCWF4MjVfZm9yX2VhY2goYXgyNSwgbm9kZSwgJmF4MjVfbGlzdCkgeworCQlpZiAoYXgyNS0+YXgyNV9kZXYgIT0gYXgyNV9kZXYgfHwgIShheDI1LT5jb25kaXRpb24gJiBBWDI1X0NPTkRfREFNQV9NT0RFKSkKKwkJCWNvbnRpbnVlOworCisJCWF4MjVfc2VuZF9jb250cm9sKGF4MjUsIEFYMjVfRElTQywgQVgyNV9QT0xMT04sIEFYMjVfQ09NTUFORCk7CisJCWF4MjVfZGlzY29ubmVjdChheDI1LCBFVElNRURPVVQpOworCX0KKwlzcGluX3VubG9ja19iaCgmYXgyNV9saXN0X2xvY2spOworCisJYXgyNV9kZXZfZGFtYV9vZmYoYXgyNV9kZXYpOworfQorCit2b2lkIGF4MjVfZHNfaGVhcnRiZWF0X2V4cGlyeShheDI1X2NiICpheDI1KQoreworCXN0cnVjdCBzb2NrICpzaz1heDI1LT5zazsKKworCWlmIChzaykKKwkJYmhfbG9ja19zb2NrKHNrKTsKKworCXN3aXRjaCAoYXgyNS0+c3RhdGUpIHsKKworCWNhc2UgQVgyNV9TVEFURV8wOgorCQkvKiBNYWdpYyBoZXJlOiBJZiB3ZSBsaXN0ZW4oKSBhbmQgYSBuZXcgbGluayBkaWVzIGJlZm9yZSBpdAorCQkgICBpcyBhY2NlcHRlZCgpIGl0IGlzbid0ICdkZWFkJyBzbyBkb2Vzbid0IGdldCByZW1vdmVkLiAqLworCQlpZiAoIXNrIHx8IHNvY2tfZmxhZyhzaywgU09DS19ERVNUUk9ZKSB8fAorCQkgICAgKHNrLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOICYmCisJCSAgICAgc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKSkgeworCQkJaWYgKHNrKSB7CisJCQkJc29ja19ob2xkKHNrKTsKKwkJCQlheDI1X2Rlc3Ryb3lfc29ja2V0KGF4MjUpOworCQkJCXNvY2tfcHV0KHNrKTsKKwkJCQliaF91bmxvY2tfc29jayhzayk7CisJCQl9IGVsc2UKKwkJCQlheDI1X2Rlc3Ryb3lfc29ja2V0KGF4MjUpOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBWDI1X1NUQVRFXzM6CisJCS8qCisJCSAqIENoZWNrIHRoZSBzdGF0ZSBvZiB0aGUgcmVjZWl2ZSBidWZmZXIuCisJCSAqLworCQlpZiAoc2sgIT0gTlVMTCkgeworCQkJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPAorCQkJICAgIChzay0+c2tfcmN2YnVmIC8gMikgJiYKKwkJCSAgICAoYXgyNS0+Y29uZGl0aW9uICYgQVgyNV9DT05EX09XTl9SWF9CVVNZKSkgeworCQkJCWF4MjUtPmNvbmRpdGlvbiAmPSB+QVgyNV9DT05EX09XTl9SWF9CVVNZOworCQkJCWF4MjUtPmNvbmRpdGlvbiAmPSB+QVgyNV9DT05EX0FDS19QRU5ESU5HOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCWlmIChzaykKKwkJYmhfdW5sb2NrX3NvY2soc2spOworCisJYXgyNV9zdGFydF9oZWFydGJlYXQoYXgyNSk7Cit9CisKKy8qIGRsMWJrZSA5NjAxMTQ6IFQzIHdvcmtzIG11Y2ggbGlrZSB0aGUgSURMRSB0aW1lb3V0LCBidXQKKyAqICAgICAgICAgICAgICAgIGdldHMgcmVsb2FkZWQgd2l0aCBldmVyeSBmcmFtZSBmb3IgdGhpcworICoJCSAgY29ubmVjdGlvbi4KKyAqLwordm9pZCBheDI1X2RzX3QzdGltZXJfZXhwaXJ5KGF4MjVfY2IgKmF4MjUpCit7CisJYXgyNV9zZW5kX2NvbnRyb2woYXgyNSwgQVgyNV9ESVNDLCBBWDI1X1BPTExPTiwgQVgyNV9DT01NQU5EKTsKKwlheDI1X2RhbWFfb2ZmKGF4MjUpOworCWF4MjVfZGlzY29ubmVjdChheDI1LCBFVElNRURPVVQpOworfQorCisvKiBkbDFia2UgOTYwMjI4OiBjbG9zZSB0aGUgY29ubmVjdGlvbiB3aGVuIElETEUgZXhwaXJlcy4KKyAqCQkgIHVubGlrZSBUMyB0aGlzIHRpbWVyIGdldHMgcmVsb2FkZWQgb25seSBvbgorICoJCSAgSSBmcmFtZXMuCisgKi8KK3ZvaWQgYXgyNV9kc19pZGxldGltZXJfZXhwaXJ5KGF4MjVfY2IgKmF4MjUpCit7CisJYXgyNV9jbGVhcl9xdWV1ZXMoYXgyNSk7CisKKwlheDI1LT5uMmNvdW50ID0gMDsKKwlheDI1LT5zdGF0ZSA9IEFYMjVfU1RBVEVfMjsKKworCWF4MjVfY2FsY3VsYXRlX3QxKGF4MjUpOworCWF4MjVfc3RhcnRfdDF0aW1lcihheDI1KTsKKwlheDI1X3N0b3BfdDN0aW1lcihheDI1KTsKKworCWlmIChheDI1LT5zayAhPSBOVUxMKSB7CisJCWJoX2xvY2tfc29jayhheDI1LT5zayk7CisJCWF4MjUtPnNrLT5za19zdGF0ZSAgICAgPSBUQ1BfQ0xPU0U7CisJCWF4MjUtPnNrLT5za19lcnIgICAgICAgPSAwOworCQlheDI1LT5zay0+c2tfc2h1dGRvd24gfD0gU0VORF9TSFVURE9XTjsKKwkJaWYgKCFzb2NrX2ZsYWcoYXgyNS0+c2ssIFNPQ0tfREVBRCkpIHsKKwkJCWF4MjUtPnNrLT5za19zdGF0ZV9jaGFuZ2UoYXgyNS0+c2spOworCQkJc29ja19zZXRfZmxhZyhheDI1LT5zaywgU09DS19ERUFEKTsKKwkJfQorCQliaF91bmxvY2tfc29jayhheDI1LT5zayk7CisJfQorfQorCisvKiBkbDFia2UgOTYwMTE0OiBUaGUgREFNQSBwcm90b2NvbCByZXF1aXJlcyB0byBzZW5kIGRhdGEgYW5kIFNBQk0vRElTQworICogICAgICAgICAgICAgICAgd2l0aGluIHRoZSBwb2xsIG9mIGFueSBjb25uZWN0ZWQgY2hhbm5lbC4gUmVtZW1iZXIKKyAqICAgICAgICAgICAgICAgIHRoYXQgd2UgYXJlIG5vdCBhbGxvd2VkIHRvIHNlbmQgYW55dGhpbmcgdW5sZXNzIHdlCisgKiAgICAgICAgICAgICAgICBnZXQgcG9sbGVkIGJ5IHRoZSBNYXN0ZXIuCisgKgorICogICAgICAgICAgICAgICAgVGh1cyB3ZSdsbCBoYXZlIHRvIGRvIHBhcnRzIG9mIG91ciBUMSBoYW5kbGluZyBpbgorICogICAgICAgICAgICAgICAgYXgyNV9lbnF1aXJ5X3Jlc3BvbnNlKCkuCisgKi8KK3ZvaWQgYXgyNV9kc190MV90aW1lb3V0KGF4MjVfY2IgKmF4MjUpCit7CisJc3dpdGNoIChheDI1LT5zdGF0ZSkgeworCWNhc2UgQVgyNV9TVEFURV8xOgorCQlpZiAoYXgyNS0+bjJjb3VudCA9PSBheDI1LT5uMikgeworCQkJaWYgKGF4MjUtPm1vZHVsdXMgPT0gQVgyNV9NT0RVTFVTKSB7CisJCQkJYXgyNV9kaXNjb25uZWN0KGF4MjUsIEVUSU1FRE9VVCk7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIHsKKwkJCQlheDI1LT5tb2R1bHVzID0gQVgyNV9NT0RVTFVTOworCQkJCWF4MjUtPndpbmRvdyAgPSBheDI1LT5heDI1X2Rldi0+dmFsdWVzW0FYMjVfVkFMVUVTX1dJTkRPV107CisJCQkJYXgyNS0+bjJjb3VudCA9IDA7CisJCQkJYXgyNV9zZW5kX2NvbnRyb2woYXgyNSwgQVgyNV9TQUJNLCBBWDI1X1BPTExPRkYsIEFYMjVfQ09NTUFORCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlheDI1LT5uMmNvdW50Kys7CisJCQlpZiAoYXgyNS0+bW9kdWx1cyA9PSBBWDI1X01PRFVMVVMpCisJCQkJYXgyNV9zZW5kX2NvbnRyb2woYXgyNSwgQVgyNV9TQUJNLCBBWDI1X1BPTExPRkYsIEFYMjVfQ09NTUFORCk7CisJCQllbHNlCisJCQkJYXgyNV9zZW5kX2NvbnRyb2woYXgyNSwgQVgyNV9TQUJNRSwgQVgyNV9QT0xMT0ZGLCBBWDI1X0NPTU1BTkQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBWDI1X1NUQVRFXzI6CisJCWlmIChheDI1LT5uMmNvdW50ID09IGF4MjUtPm4yKSB7CisJCQlheDI1X3NlbmRfY29udHJvbChheDI1LCBBWDI1X0RJU0MsIEFYMjVfUE9MTE9OLCBBWDI1X0NPTU1BTkQpOworCQkJYXgyNV9kaXNjb25uZWN0KGF4MjUsIEVUSU1FRE9VVCk7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQlheDI1LT5uMmNvdW50Kys7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFYMjVfU1RBVEVfMzoKKwkJaWYgKGF4MjUtPm4yY291bnQgPT0gYXgyNS0+bjIpIHsKKwkJCWF4MjVfc2VuZF9jb250cm9sKGF4MjUsIEFYMjVfRE0sIEFYMjVfUE9MTE9OLCBBWDI1X1JFU1BPTlNFKTsKKwkJCWF4MjVfZGlzY29ubmVjdChheDI1LCBFVElNRURPVVQpOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJYXgyNS0+bjJjb3VudCsrOworCQl9CisJCWJyZWFrOworCX0KKworCWF4MjVfY2FsY3VsYXRlX3QxKGF4MjUpOworCWF4MjVfc3RhcnRfdDF0aW1lcihheDI1KTsKK30KZGlmZiAtLWdpdCBhL25ldC9heDI1L2F4MjVfaWZhY2UuYyBiL25ldC9heDI1L2F4MjVfaWZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjhhZmYxCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2F4MjUvYXgyNV9pZmFjZS5jCkBAIC0wLDAgKzEsMjY2IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIEpvbmF0aGFuIE5heWxvciBHNEtMWCAoZzRrbHhAZzRrbHguZGVtb24uY28udWspCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bmV0L2F4MjUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9jb2xfc3RydWN0IHsKKwlzdHJ1Y3QgcHJvdG9jb2xfc3RydWN0ICpuZXh0OworCXVuc2lnbmVkIGludCBwaWQ7CisJaW50ICgqZnVuYykoc3RydWN0IHNrX2J1ZmYgKiwgYXgyNV9jYiAqKTsKK30gKnByb3RvY29sX2xpc3QgPSBOVUxMOworc3RhdGljIERFRklORV9SV0xPQ0socHJvdG9jb2xfbGlzdF9sb2NrKTsKKworc3RhdGljIHN0cnVjdCBsaW5rZmFpbF9zdHJ1Y3QgeworCXN0cnVjdCBsaW5rZmFpbF9zdHJ1Y3QgKm5leHQ7CisJdm9pZCAoKmZ1bmMpKGF4MjVfY2IgKiwgaW50KTsKK30gKmxpbmtmYWlsX2xpc3QgPSBOVUxMOworc3RhdGljIERFRklORV9TUElOTE9DSyhsaW5rZmFpbF9sb2NrKTsKKworc3RhdGljIHN0cnVjdCBsaXN0ZW5fc3RydWN0IHsKKwlzdHJ1Y3QgbGlzdGVuX3N0cnVjdCAqbmV4dDsKKwlheDI1X2FkZHJlc3MgIGNhbGxzaWduOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Cit9ICpsaXN0ZW5fbGlzdCA9IE5VTEw7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxpc3Rlbl9sb2NrKTsKKworaW50IGF4MjVfcHJvdG9jb2xfcmVnaXN0ZXIodW5zaWduZWQgaW50IHBpZCwKKwlpbnQgKCpmdW5jKShzdHJ1Y3Qgc2tfYnVmZiAqLCBheDI1X2NiICopKQoreworCXN0cnVjdCBwcm90b2NvbF9zdHJ1Y3QgKnByb3RvY29sOworCisJaWYgKHBpZCA9PSBBWDI1X1BfVEVYVCB8fCBwaWQgPT0gQVgyNV9QX1NFR01FTlQpCisJCXJldHVybiAwOworI2lmZGVmIENPTkZJR19JTkVUCisJaWYgKHBpZCA9PSBBWDI1X1BfSVAgfHwgcGlkID09IEFYMjVfUF9BUlApCisJCXJldHVybiAwOworI2VuZGlmCisJaWYgKChwcm90b2NvbCA9IGttYWxsb2Moc2l6ZW9mKCpwcm90b2NvbCksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXByb3RvY29sLT5waWQgID0gcGlkOworCXByb3RvY29sLT5mdW5jID0gZnVuYzsKKworCXdyaXRlX2xvY2soJnByb3RvY29sX2xpc3RfbG9jayk7CisJcHJvdG9jb2wtPm5leHQgPSBwcm90b2NvbF9saXN0OworCXByb3RvY29sX2xpc3QgID0gcHJvdG9jb2w7CisJd3JpdGVfdW5sb2NrKCZwcm90b2NvbF9saXN0X2xvY2spOworCisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgYXgyNV9wcm90b2NvbF9yZWxlYXNlKHVuc2lnbmVkIGludCBwaWQpCit7CisJc3RydWN0IHByb3RvY29sX3N0cnVjdCAqcywgKnByb3RvY29sOworCisJd3JpdGVfbG9jaygmcHJvdG9jb2xfbGlzdF9sb2NrKTsKKwlwcm90b2NvbCA9IHByb3RvY29sX2xpc3Q7CisJaWYgKHByb3RvY29sID09IE5VTEwpIHsKKwkJd3JpdGVfdW5sb2NrKCZwcm90b2NvbF9saXN0X2xvY2spOworCQlyZXR1cm47CisJfQorCisJaWYgKHByb3RvY29sLT5waWQgPT0gcGlkKSB7CisJCXByb3RvY29sX2xpc3QgPSBwcm90b2NvbC0+bmV4dDsKKwkJd3JpdGVfdW5sb2NrKCZwcm90b2NvbF9saXN0X2xvY2spOworCQlrZnJlZShwcm90b2NvbCk7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAocHJvdG9jb2wgIT0gTlVMTCAmJiBwcm90b2NvbC0+bmV4dCAhPSBOVUxMKSB7CisJCWlmIChwcm90b2NvbC0+bmV4dC0+cGlkID09IHBpZCkgeworCQkJcyA9IHByb3RvY29sLT5uZXh0OworCQkJcHJvdG9jb2wtPm5leHQgPSBwcm90b2NvbC0+bmV4dC0+bmV4dDsKKwkJCXdyaXRlX3VubG9jaygmcHJvdG9jb2xfbGlzdF9sb2NrKTsKKwkJCWtmcmVlKHMpOworCQkJcmV0dXJuOworCQl9CisKKwkJcHJvdG9jb2wgPSBwcm90b2NvbC0+bmV4dDsKKwl9CisJd3JpdGVfdW5sb2NrKCZwcm90b2NvbF9saXN0X2xvY2spOworfQorCitpbnQgYXgyNV9saW5rZmFpbF9yZWdpc3Rlcih2b2lkICgqZnVuYykoYXgyNV9jYiAqLCBpbnQpKQoreworCXN0cnVjdCBsaW5rZmFpbF9zdHJ1Y3QgKmxpbmtmYWlsOworCisJaWYgKChsaW5rZmFpbCA9IGttYWxsb2Moc2l6ZW9mKCpsaW5rZmFpbCksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWxpbmtmYWlsLT5mdW5jID0gZnVuYzsKKworCXNwaW5fbG9ja19iaCgmbGlua2ZhaWxfbG9jayk7CisJbGlua2ZhaWwtPm5leHQgPSBsaW5rZmFpbF9saXN0OworCWxpbmtmYWlsX2xpc3QgID0gbGlua2ZhaWw7CisJc3Bpbl91bmxvY2tfYmgoJmxpbmtmYWlsX2xvY2spOworCisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgYXgyNV9saW5rZmFpbF9yZWxlYXNlKHZvaWQgKCpmdW5jKShheDI1X2NiICosIGludCkpCit7CisJc3RydWN0IGxpbmtmYWlsX3N0cnVjdCAqcywgKmxpbmtmYWlsOworCisJc3Bpbl9sb2NrX2JoKCZsaW5rZmFpbF9sb2NrKTsKKwlsaW5rZmFpbCA9IGxpbmtmYWlsX2xpc3Q7CisJaWYgKGxpbmtmYWlsID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfYmgoJmxpbmtmYWlsX2xvY2spOworCQlyZXR1cm47CisJfQorCisJaWYgKGxpbmtmYWlsLT5mdW5jID09IGZ1bmMpIHsKKwkJbGlua2ZhaWxfbGlzdCA9IGxpbmtmYWlsLT5uZXh0OworCQlzcGluX3VubG9ja19iaCgmbGlua2ZhaWxfbG9jayk7CisJCWtmcmVlKGxpbmtmYWlsKTsKKwkJcmV0dXJuOworCX0KKworCXdoaWxlIChsaW5rZmFpbCAhPSBOVUxMICYmIGxpbmtmYWlsLT5uZXh0ICE9IE5VTEwpIHsKKwkJaWYgKGxpbmtmYWlsLT5uZXh0LT5mdW5jID09IGZ1bmMpIHsKKwkJCXMgPSBsaW5rZmFpbC0+bmV4dDsKKwkJCWxpbmtmYWlsLT5uZXh0ID0gbGlua2ZhaWwtPm5leHQtPm5leHQ7CisJCQlzcGluX3VubG9ja19iaCgmbGlua2ZhaWxfbG9jayk7CisJCQlrZnJlZShzKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWxpbmtmYWlsID0gbGlua2ZhaWwtPm5leHQ7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZsaW5rZmFpbF9sb2NrKTsKK30KKworaW50IGF4MjVfbGlzdGVuX3JlZ2lzdGVyKGF4MjVfYWRkcmVzcyAqY2FsbHNpZ24sIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxpc3Rlbl9zdHJ1Y3QgKmxpc3RlbjsKKworCWlmIChheDI1X2xpc3Rlbl9taW5lKGNhbGxzaWduLCBkZXYpKQorCQlyZXR1cm4gMDsKKworCWlmICgobGlzdGVuID0ga21hbGxvYyhzaXplb2YoKmxpc3RlbiksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWxpc3Rlbi0+Y2FsbHNpZ24gPSAqY2FsbHNpZ247CisJbGlzdGVuLT5kZXYgICAgICA9IGRldjsKKworCXNwaW5fbG9ja19iaCgmbGlzdGVuX2xvY2spOworCWxpc3Rlbi0+bmV4dCA9IGxpc3Rlbl9saXN0OworCWxpc3Rlbl9saXN0ICA9IGxpc3RlbjsKKwlzcGluX3VubG9ja19iaCgmbGlzdGVuX2xvY2spOworCisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgYXgyNV9saXN0ZW5fcmVsZWFzZShheDI1X2FkZHJlc3MgKmNhbGxzaWduLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsaXN0ZW5fc3RydWN0ICpzLCAqbGlzdGVuOworCisJc3Bpbl9sb2NrX2JoKCZsaXN0ZW5fbG9jayk7CisJbGlzdGVuID0gbGlzdGVuX2xpc3Q7CisJaWYgKGxpc3RlbiA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZsaXN0ZW5fbG9jayk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoYXgyNWNtcCgmbGlzdGVuLT5jYWxsc2lnbiwgY2FsbHNpZ24pID09IDAgJiYgbGlzdGVuLT5kZXYgPT0gZGV2KSB7CisJCWxpc3Rlbl9saXN0ID0gbGlzdGVuLT5uZXh0OworCQlzcGluX3VubG9ja19iaCgmbGlzdGVuX2xvY2spOworCQlrZnJlZShsaXN0ZW4pOworCQlyZXR1cm47CisJfQorCisJd2hpbGUgKGxpc3RlbiAhPSBOVUxMICYmIGxpc3Rlbi0+bmV4dCAhPSBOVUxMKSB7CisJCWlmIChheDI1Y21wKCZsaXN0ZW4tPm5leHQtPmNhbGxzaWduLCBjYWxsc2lnbikgPT0gMCAmJiBsaXN0ZW4tPm5leHQtPmRldiA9PSBkZXYpIHsKKwkJCXMgPSBsaXN0ZW4tPm5leHQ7CisJCQlsaXN0ZW4tPm5leHQgPSBsaXN0ZW4tPm5leHQtPm5leHQ7CisJCQlzcGluX3VubG9ja19iaCgmbGlzdGVuX2xvY2spOworCQkJa2ZyZWUocyk7CisJCQlyZXR1cm47CisJCX0KKworCQlsaXN0ZW4gPSBsaXN0ZW4tPm5leHQ7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZsaXN0ZW5fbG9jayk7Cit9CisKK2ludCAoKmF4MjVfcHJvdG9jb2xfZnVuY3Rpb24odW5zaWduZWQgaW50IHBpZCkpKHN0cnVjdCBza19idWZmICosIGF4MjVfY2IgKikKK3sKKwlpbnQgKCpyZXMpKHN0cnVjdCBza19idWZmICosIGF4MjVfY2IgKikgPSBOVUxMOworCXN0cnVjdCBwcm90b2NvbF9zdHJ1Y3QgKnByb3RvY29sOworCisJcmVhZF9sb2NrKCZwcm90b2NvbF9saXN0X2xvY2spOworCWZvciAocHJvdG9jb2wgPSBwcm90b2NvbF9saXN0OyBwcm90b2NvbCAhPSBOVUxMOyBwcm90b2NvbCA9IHByb3RvY29sLT5uZXh0KQorCQlpZiAocHJvdG9jb2wtPnBpZCA9PSBwaWQpIHsKKwkJCXJlcyA9IHByb3RvY29sLT5mdW5jOworCQkJYnJlYWs7CisJCX0KKwlyZWFkX3VubG9jaygmcHJvdG9jb2xfbGlzdF9sb2NrKTsKKworCXJldHVybiByZXM7Cit9CisKK2ludCBheDI1X2xpc3Rlbl9taW5lKGF4MjVfYWRkcmVzcyAqY2FsbHNpZ24sIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxpc3Rlbl9zdHJ1Y3QgKmxpc3RlbjsKKworCXNwaW5fbG9ja19iaCgmbGlzdGVuX2xvY2spOworCWZvciAobGlzdGVuID0gbGlzdGVuX2xpc3Q7IGxpc3RlbiAhPSBOVUxMOyBsaXN0ZW4gPSBsaXN0ZW4tPm5leHQpCisJCWlmIChheDI1Y21wKCZsaXN0ZW4tPmNhbGxzaWduLCBjYWxsc2lnbikgPT0gMCAmJiAobGlzdGVuLT5kZXYgPT0gZGV2IHx8IGxpc3Rlbi0+ZGV2ID09IE5VTEwpKSB7CisJCQlzcGluX3VubG9ja19iaCgmbGlzdGVuX2xvY2spOworCQkJcmV0dXJuIDE7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZsaXN0ZW5fbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBheDI1X2xpbmtfZmFpbGVkKGF4MjVfY2IgKmF4MjUsIGludCByZWFzb24pCit7CisJc3RydWN0IGxpbmtmYWlsX3N0cnVjdCAqbGlua2ZhaWw7CisKKwlzcGluX2xvY2tfYmgoJmxpbmtmYWlsX2xvY2spOworCWZvciAobGlua2ZhaWwgPSBsaW5rZmFpbF9saXN0OyBsaW5rZmFpbCAhPSBOVUxMOyBsaW5rZmFpbCA9IGxpbmtmYWlsLT5uZXh0KQorCQkobGlua2ZhaWwtPmZ1bmMpKGF4MjUsIHJlYXNvbik7CisJc3Bpbl91bmxvY2tfYmgoJmxpbmtmYWlsX2xvY2spOworfQorCitpbnQgYXgyNV9wcm90b2NvbF9pc19yZWdpc3RlcmVkKHVuc2lnbmVkIGludCBwaWQpCit7CisJc3RydWN0IHByb3RvY29sX3N0cnVjdCAqcHJvdG9jb2w7CisJaW50IHJlcyA9IDA7CisKKwlyZWFkX2xvY2soJnByb3RvY29sX2xpc3RfbG9jayk7CisJZm9yIChwcm90b2NvbCA9IHByb3RvY29sX2xpc3Q7IHByb3RvY29sICE9IE5VTEw7IHByb3RvY29sID0gcHJvdG9jb2wtPm5leHQpCisJCWlmIChwcm90b2NvbC0+cGlkID09IHBpZCkgeworCQkJcmVzID0gMTsKKwkJCWJyZWFrOworCQl9CisJcmVhZF91bmxvY2soJnByb3RvY29sX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gcmVzOworfQpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYXgyNV9pbi5jIGIvbmV0L2F4MjUvYXgyNV9pbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYzgwOGYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYXgyNS9heDI1X2luLmMKQEAgLTAsMCArMSw0NzAgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgQWxhbiBDb3ggR1c0UFRTIChhbGFuQGx4b3JndWsudWt1dS5vcmcudWspCisgKiBDb3B5cmlnaHQgKEMpIEpvbmF0aGFuIE5heWxvciBHNEtMWCAoZzRrbHhAZzRrbHguZGVtb24uY28udWspCisgKiBDb3B5cmlnaHQgKEMpIEpvZXJnIFJldXRlciBETDFCS0UgKGpyZXV0ZXJAeWFpbmEuZGUpCisgKiBDb3B5cmlnaHQgKEMpIEhhbnMtSm9hY2hpbSBIZXRzY2hlciBERDhORSAoZGQ4bmVAYm52LWJhbWJlcmcuZGUpCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPG5ldC9heDI1Lmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CQkJLyogRm9yIGlwX3JjdiAqLworI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CQkJLyogRm9yIGFycF9yY3YgKi8KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKy8qCisgKglHaXZlbiBhIGZyYWdtZW50LCBxdWV1ZSBpdCBvbiB0aGUgZnJhZ21lbnQgcXVldWUgYW5kIGlmIHRoZSBmcmFnbWVudAorICoJaXMgY29tcGxldGUsIHNlbmQgaXQgYmFjayB0byBheDI1X3J4X2lmcmFtZS4KKyAqLworc3RhdGljIGludCBheDI1X3J4X2ZyYWdtZW50KGF4MjVfY2IgKmF4MjUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYm4sICpza2JvOworCisJaWYgKGF4MjUtPmZyYWdubyAhPSAwKSB7CisJCWlmICghKCpza2ItPmRhdGEgJiBBWDI1X1NFR19GSVJTVCkpIHsKKwkJCWlmICgoYXgyNS0+ZnJhZ25vIC0gMSkgPT0gKCpza2ItPmRhdGEgJiBBWDI1X1NFR19SRU0pKSB7CisJCQkJLyogRW5xdWV1ZSBmcmFnbWVudCAqLworCQkJCWF4MjUtPmZyYWdubyA9ICpza2ItPmRhdGEgJiBBWDI1X1NFR19SRU07CisJCQkJc2tiX3B1bGwoc2tiLCAxKTsJLyogc2tpcCBmcmFnbm8gKi8KKwkJCQlheDI1LT5mcmFnbGVuICs9IHNrYi0+bGVuOworCQkJCXNrYl9xdWV1ZV90YWlsKCZheDI1LT5mcmFnX3F1ZXVlLCBza2IpOworCisJCQkJLyogTGFzdCBmcmFnbWVudCByZWNlaXZlZCA/ICovCisJCQkJaWYgKGF4MjUtPmZyYWdubyA9PSAwKSB7CisJCQkJCXNrYm4gPSBhbGxvY19za2IoQVgyNV9NQVhfSEVBREVSX0xFTiArCisJCQkJCQkJIGF4MjUtPmZyYWdsZW4sCisJCQkJCQkJIEdGUF9BVE9NSUMpOworCQkJCQlpZiAoIXNrYm4pIHsKKwkJCQkJCXNrYl9xdWV1ZV9wdXJnZSgmYXgyNS0+ZnJhZ19xdWV1ZSk7CisJCQkJCQlyZXR1cm4gMTsKKwkJCQkJfQorCisJCQkJCXNrYl9yZXNlcnZlKHNrYm4sIEFYMjVfTUFYX0hFQURFUl9MRU4pOworCisJCQkJCXNrYm4tPmRldiAgID0gYXgyNS0+YXgyNV9kZXYtPmRldjsKKwkJCQkJc2tibi0+aC5yYXcgPSBza2JuLT5kYXRhOworCQkJCQlza2JuLT5uaC5yYXcgPSBza2JuLT5kYXRhOworCisJCQkJCS8qIENvcHkgZGF0YSBmcm9tIHRoZSBmcmFnbWVudHMgKi8KKwkJCQkJd2hpbGUgKChza2JvID0gc2tiX2RlcXVldWUoJmF4MjUtPmZyYWdfcXVldWUpKSAhPSBOVUxMKSB7CisJCQkJCQltZW1jcHkoc2tiX3B1dChza2JuLCBza2JvLT5sZW4pLCBza2JvLT5kYXRhLCBza2JvLT5sZW4pOworCQkJCQkJa2ZyZWVfc2tiKHNrYm8pOworCQkJCQl9CisKKwkJCQkJYXgyNS0+ZnJhZ2xlbiA9IDA7CisKKwkJCQkJaWYgKGF4MjVfcnhfaWZyYW1lKGF4MjUsIHNrYm4pID09IDApCisJCQkJCQlrZnJlZV9za2Ioc2tibik7CisJCQkJfQorCisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBGaXJzdCBmcmFnbWVudCByZWNlaXZlZCAqLworCQlpZiAoKnNrYi0+ZGF0YSAmIEFYMjVfU0VHX0ZJUlNUKSB7CisJCQlza2JfcXVldWVfcHVyZ2UoJmF4MjUtPmZyYWdfcXVldWUpOworCQkJYXgyNS0+ZnJhZ25vID0gKnNrYi0+ZGF0YSAmIEFYMjVfU0VHX1JFTTsKKwkJCXNrYl9wdWxsKHNrYiwgMSk7CQkvKiBza2lwIGZyYWdubyAqLworCQkJYXgyNS0+ZnJhZ2xlbiA9IHNrYi0+bGVuOworCQkJc2tiX3F1ZXVlX3RhaWwoJmF4MjUtPmZyYWdfcXVldWUsIHNrYik7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKgorICoJVGhpcyBpcyB3aGVyZSBhbGwgdmFsaWQgSSBmcmFtZXMgYXJlIHNlbnQgdG8sIHRvIGJlIGRpc3BhdGNoZWQgdG8KKyAqCXdoaWNoZXZlciBwcm90b2NvbCByZXF1aXJlcyB0aGVtLgorICovCitpbnQgYXgyNV9yeF9pZnJhbWUoYXgyNV9jYiAqYXgyNSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgKCpmdW5jKShzdHJ1Y3Qgc2tfYnVmZiAqLCBheDI1X2NiICopOworCXZvbGF0aWxlIGludCBxdWV1ZWQgPSAwOworCXVuc2lnbmVkIGNoYXIgcGlkOworCisJaWYgKHNrYiA9PSBOVUxMKSByZXR1cm4gMDsKKworCWF4MjVfc3RhcnRfaWRsZXRpbWVyKGF4MjUpOworCisJcGlkID0gKnNrYi0+ZGF0YTsKKworI2lmZGVmIENPTkZJR19JTkVUCisJaWYgKHBpZCA9PSBBWDI1X1BfSVApIHsKKwkJLyogd29ya2luZyBhcm91bmQgYSBUQ1AgYnVnIHRvIGtlZXAgYWRkaXRpb25hbCBsaXN0ZW5lcnMKKwkJICogaGFwcHkuIFRDUCByZS11c2VzIHRoZSBidWZmZXIgYW5kIGRlc3Ryb3lzIHRoZSBvcmlnaW5hbAorCQkgKiBjb250ZW50LgorCQkgKi8KKwkJc3RydWN0IHNrX2J1ZmYgKnNrYm4gPSBza2JfY29weShza2IsIEdGUF9BVE9NSUMpOworCQlpZiAoc2tibiAhPSBOVUxMKSB7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXNrYiA9IHNrYm47CisJCX0KKworCQlza2JfcHVsbChza2IsIDEpOwkvKiBSZW1vdmUgUElEICovCisJCXNrYi0+aC5yYXcgICAgPSBza2ItPmRhdGE7CisJCXNrYi0+bmgucmF3ICAgPSBza2ItPmRhdGE7CisJCXNrYi0+ZGV2ICAgICAgPSBheDI1LT5heDI1X2Rldi0+ZGV2OworCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CisJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisJCWlwX3Jjdihza2IsIHNrYi0+ZGV2LCBOVUxMKTsJLyogV3JvbmcgcHR5cGUgKi8KKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisJaWYgKHBpZCA9PSBBWDI1X1BfU0VHTUVOVCkgeworCQlza2JfcHVsbChza2IsIDEpOwkvKiBSZW1vdmUgUElEICovCisJCXJldHVybiBheDI1X3J4X2ZyYWdtZW50KGF4MjUsIHNrYik7CisJfQorCisJaWYgKChmdW5jID0gYXgyNV9wcm90b2NvbF9mdW5jdGlvbihwaWQpKSAhPSBOVUxMKSB7CisJCXNrYl9wdWxsKHNrYiwgMSk7CS8qIFJlbW92ZSBQSUQgKi8KKwkJcmV0dXJuICgqZnVuYykoc2tiLCBheDI1KTsKKwl9CisKKwlpZiAoYXgyNS0+c2sgIT0gTlVMTCAmJiBheDI1LT5heDI1X2Rldi0+dmFsdWVzW0FYMjVfVkFMVUVTX0NPTk1PREVdID09IDIpIHsKKwkJaWYgKCghYXgyNS0+cGlkaW5jbCAmJiBheDI1LT5zay0+c2tfcHJvdG9jb2wgPT0gcGlkKSB8fAorCQkgICAgYXgyNS0+cGlkaW5jbCkgeworCQkJaWYgKHNvY2tfcXVldWVfcmN2X3NrYihheDI1LT5zaywgc2tiKSA9PSAwKQorCQkJCXF1ZXVlZCA9IDE7CisJCQllbHNlCisJCQkJYXgyNS0+Y29uZGl0aW9uIHw9IEFYMjVfQ09ORF9PV05fUlhfQlVTWTsKKwkJfQorCX0KKworCXJldHVybiBxdWV1ZWQ7Cit9CisKKy8qCisgKglIaWdoZXIgbGV2ZWwgdXBjYWxsIGZvciBhIExBUEIgZnJhbWUKKyAqLworc3RhdGljIGludCBheDI1X3Byb2Nlc3NfcnhfZnJhbWUoYXgyNV9jYiAqYXgyNSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHR5cGUsIGludCBkYW1hKQoreworCWludCBxdWV1ZWQgPSAwOworCisJaWYgKGF4MjUtPnN0YXRlID09IEFYMjVfU1RBVEVfMCkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGF4MjUtPmF4MjVfZGV2LT52YWx1ZXNbQVgyNV9WQUxVRVNfUFJPVE9DT0xdKSB7CisJY2FzZSBBWDI1X1BST1RPX1NURF9TSU1QTEVYOgorCWNhc2UgQVgyNV9QUk9UT19TVERfRFVQTEVYOgorCQlxdWV1ZWQgPSBheDI1X3N0ZF9mcmFtZV9pbihheDI1LCBza2IsIHR5cGUpOworCQlicmVhazsKKworI2lmZGVmIENPTkZJR19BWDI1X0RBTUFfU0xBVkUKKwljYXNlIEFYMjVfUFJPVE9fREFNQV9TTEFWRToKKwkJaWYgKGRhbWEgfHwgYXgyNS0+YXgyNV9kZXYtPmRhbWEuc2xhdmUpCisJCQlxdWV1ZWQgPSBheDI1X2RzX2ZyYW1lX2luKGF4MjUsIHNrYiwgdHlwZSk7CisJCWVsc2UKKwkJCXF1ZXVlZCA9IGF4MjVfc3RkX2ZyYW1lX2luKGF4MjUsIHNrYiwgdHlwZSk7CisJCWJyZWFrOworI2VuZGlmCisJfQorCisJcmV0dXJuIHF1ZXVlZDsKK30KKworc3RhdGljIGludCBheDI1X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCWF4MjVfYWRkcmVzcyAqZGV2X2FkZHIsIHN0cnVjdCBwYWNrZXRfdHlwZSAqcHR5cGUpCit7CisJYXgyNV9hZGRyZXNzIHNyYywgZGVzdCwgKm5leHRfZGlnaSA9IE5VTEw7CisJaW50IHR5cGUgPSAwLCBtaW5lID0gMCwgZGFtYTsKKwlzdHJ1Y3Qgc29jayAqbWFrZSwgKnNrOworCWF4MjVfZGlnaSBkcCwgcmV2ZXJzZV9kcDsKKwlheDI1X2NiICpheDI1OworCWF4MjVfZGV2ICpheDI1X2RldjsKKworCS8qCisJICoJUHJvY2VzcyB0aGUgQVguMjUvTEFQQiBmcmFtZS4KKwkgKi8KKworCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisKKwlpZiAoKGF4MjVfZGV2ID0gYXgyNV9kZXZfYXgyNWRldihkZXYpKSA9PSBOVUxMKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqCVBhcnNlIHRoZSBhZGRyZXNzIGhlYWRlci4KKwkgKi8KKworCWlmIChheDI1X2FkZHJfcGFyc2Uoc2tiLT5kYXRhLCBza2ItPmxlbiwgJnNyYywgJmRlc3QsICZkcCwgJnR5cGUsICZkYW1hKSA9PSBOVUxMKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqCU91cnMgcGVyaGFwcyA/CisJICovCisJaWYgKGRwLmxhc3RyZXBlYXQgKyAxIDwgZHAubmRpZ2kpCQkvKiBOb3QgeWV0IGRpZ2lwZWF0ZWQgY29tcGxldGVseSAqLworCQluZXh0X2RpZ2kgPSAmZHAuY2FsbHNbZHAubGFzdHJlcGVhdCArIDFdOworCisJLyoKKwkgKglQdWxsIG9mIHRoZSBBWC4yNSBoZWFkZXJzIGxlYXZpbmcgdGhlIENUUkwvUElEIGJ5dGVzCisJICovCisJc2tiX3B1bGwoc2tiLCBheDI1X2FkZHJfc2l6ZSgmZHApKTsKKworCS8qIEZvciBvdXIgcG9ydCBhZGRyZXNzZXMgPyAqLworCWlmIChheDI1Y21wKCZkZXN0LCBkZXZfYWRkcikgPT0gMCAmJiBkcC5sYXN0cmVwZWF0ICsgMSA9PSBkcC5uZGlnaSkKKwkJbWluZSA9IDE7CisKKwkvKiBBbHNvIG1hdGNoIG9uIGFueSByZWdpc3RlcmVkIGNhbGxzaWduIGZyb20gTDMvNCAqLworCWlmICghbWluZSAmJiBheDI1X2xpc3Rlbl9taW5lKCZkZXN0LCBkZXYpICYmIGRwLmxhc3RyZXBlYXQgKyAxID09IGRwLm5kaWdpKQorCQltaW5lID0gMTsKKworCS8qIFVJIGZyYW1lIC0gYnlwYXNzIExBUEIgcHJvY2Vzc2luZyAqLworCWlmICgoKnNrYi0+ZGF0YSAmIH4weDEwKSA9PSBBWDI1X1VJICYmIGRwLmxhc3RyZXBlYXQgKyAxID09IGRwLm5kaWdpKSB7CisJCXNrYi0+aC5yYXcgPSBza2ItPmRhdGEgKyAyOwkJLyogc2tpcCBjb250cm9sIGFuZCBwaWQgKi8KKworCQlheDI1X3NlbmRfdG9fcmF3KCZkZXN0LCBza2IsIHNrYi0+ZGF0YVsxXSk7CisKKwkJaWYgKCFtaW5lICYmIGF4MjVjbXAoJmRlc3QsIChheDI1X2FkZHJlc3MgKilkZXYtPmJyb2FkY2FzdCkgIT0gMCkgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIE5vdyB3ZSBhcmUgcG9pbnRpbmcgYXQgdGhlIHBpZCBieXRlICovCisJCXN3aXRjaCAoc2tiLT5kYXRhWzFdKSB7CisjaWZkZWYgQ09ORklHX0lORVQKKwkJY2FzZSBBWDI1X1BfSVA6CisJCQlza2JfcHVsbChza2IsMik7CQkvKiBkcm9wIFBJRC9DVFJMICovCisJCQlza2ItPmgucmF3ICAgID0gc2tiLT5kYXRhOworCQkJc2tiLT5uaC5yYXcgICA9IHNrYi0+ZGF0YTsKKwkJCXNrYi0+ZGV2ICAgICAgPSBkZXY7CisJCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CisJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOworCQkJaXBfcmN2KHNrYiwgZGV2LCBwdHlwZSk7CS8qIE5vdGUgcHR5cGUgaGVyZSBpcyB0aGUgd3Jvbmcgb25lLCBmaXggbWUgbGF0ZXIgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgQVgyNV9QX0FSUDoKKwkJCXNrYl9wdWxsKHNrYiwyKTsKKwkJCXNrYi0+aC5yYXcgICAgPSBza2ItPmRhdGE7CisJCQlza2ItPm5oLnJhdyAgID0gc2tiLT5kYXRhOworCQkJc2tiLT5kZXYgICAgICA9IGRldjsKKwkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKKwkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9BUlApOworCQkJYXJwX3Jjdihza2IsIGRldiwgcHR5cGUpOwkvKiBOb3RlIHB0eXBlIGhlcmUgaXMgd3JvbmcuLi4gKi8KKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgQVgyNV9QX1RFWFQ6CisJCQkvKiBOb3cgZmluZCBhIHN1aXRhYmxlIGRncmFtIHNvY2tldCAqLworCQkJc2sgPSBheDI1X2dldF9zb2NrZXQoJmRlc3QsICZzcmMsIFNPQ0tfREdSQU0pOworCQkJaWYgKHNrICE9IE5VTEwpIHsKKwkJCQliaF9sb2NrX3NvY2soc2spOworCQkJCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpID49CisJCQkJICAgIHNrLT5za19yY3ZidWYpIHsKKwkJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyoKKwkJCQkJICoJUmVtb3ZlIHRoZSBjb250cm9sIGFuZCBQSUQuCisJCQkJCSAqLworCQkJCQlza2JfcHVsbChza2IsIDIpOworCQkJCQlpZiAoc29ja19xdWV1ZV9yY3Zfc2tiKHNrLCBza2IpICE9IDApCisJCQkJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCQl9CisJCQkJYmhfdW5sb2NrX3NvY2soc2spOworCQkJCXNvY2tfcHV0KHNrKTsKKwkJCX0gZWxzZSB7CisJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJa2ZyZWVfc2tiKHNrYik7CS8qIFdpbGwgc2NhbiBTT0NLX0FYMjUgUkFXIHNvY2tldHMgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKglJcyBjb25uZWN0ZWQgbW9kZSBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UgPworCSAqCUlmIG5vdCwgc2hvdWxkIHdlIERNIHRoZSBpbmNvbWluZyBmcmFtZSAoZXhjZXB0IERNcykgb3IKKwkgKglzaWxlbnRseSBpZ25vcmUgdGhlbS4gRm9yIG5vdyB3ZSBzdGF5IHF1aWV0LgorCSAqLworCWlmIChheDI1X2Rldi0+dmFsdWVzW0FYMjVfVkFMVUVTX0NPTk1PREVdID09IDApIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKworCS8qIExBUEIgKi8KKworCS8qIEFYLjI1IHN0YXRlIDEtNCAqLworCisJYXgyNV9kaWdpX2ludmVydCgmZHAsICZyZXZlcnNlX2RwKTsKKworCWlmICgoYXgyNSA9IGF4MjVfZmluZF9jYigmZGVzdCwgJnNyYywgJnJldmVyc2VfZHAsIGRldikpICE9IE5VTEwpIHsKKwkJLyoKKwkJICoJUHJvY2VzcyB0aGUgZnJhbWUuIElmIGl0IGlzIHF1ZXVlZCB1cCBpbnRlcm5hbGx5IGl0CisJCSAqCXJldHVybnMgb25lIG90aGVyd2lzZSB3ZSBmcmVlIGl0IGltbWVkaWF0ZWx5LiBUaGlzCisJCSAqCXJvdXRpbmUgaXRzZWxmIHdha2VzIHRoZSB1c2VyIGNvbnRleHQgbGF5ZXJzIHNvIHdlIGRvCisJCSAqCW5vIGZ1cnRoZXIgd29yaworCQkgKi8KKwkJaWYgKGF4MjVfcHJvY2Vzc19yeF9mcmFtZShheDI1LCBza2IsIHR5cGUsIGRhbWEpID09IDApCisJCQlrZnJlZV9za2Ioc2tiKTsKKworCQlheDI1X2NiX3B1dChheDI1KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQVguMjUgc3RhdGUgMCAoZGlzY29ubmVjdGVkKSAqLworCisJLyogYSkgcmVjZWl2ZWQgbm90IGEgU0FCTShFKSAqLworCisJaWYgKCgqc2tiLT5kYXRhICYgfkFYMjVfUEYpICE9IEFYMjVfU0FCTSAmJgorCSAgICAoKnNrYi0+ZGF0YSAmIH5BWDI1X1BGKSAhPSBBWDI1X1NBQk1FKSB7CisJCS8qCisJCSAqCU5ldmVyIHJlcGx5IHRvIGEgRE0uIEFsc28gaWdub3JlIGFueSBjb25uZWN0cyBmb3IKKwkJICoJYWRkcmVzc2VzIHRoYXQgYXJlIG5vdCBvdXIgaW50ZXJmYWNlcyBhbmQgbm90IGEgc29ja2V0LgorCQkgKi8KKwkJaWYgKCgqc2tiLT5kYXRhICYgfkFYMjVfUEYpICE9IEFYMjVfRE0gJiYgbWluZSkKKwkJCWF4MjVfcmV0dXJuX2RtKGRldiwgJnNyYywgJmRlc3QsICZkcCk7CisKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKworCS8qIGIpIHJlY2VpdmVkIFNBQk0oRSkgKi8KKworCWlmIChkcC5sYXN0cmVwZWF0ICsgMSA9PSBkcC5uZGlnaSkKKwkJc2sgPSBheDI1X2ZpbmRfbGlzdGVuZXIoJmRlc3QsIDAsIGRldiwgU09DS19TRVFQQUNLRVQpOworCWVsc2UKKwkJc2sgPSBheDI1X2ZpbmRfbGlzdGVuZXIobmV4dF9kaWdpLCAxLCBkZXYsIFNPQ0tfU0VRUEFDS0VUKTsKKworCWlmIChzayAhPSBOVUxMKSB7CisJCWJoX2xvY2tfc29jayhzayk7CisJCWlmIChza19hY2NlcHRxX2lzX2Z1bGwoc2spIHx8CisJCSAgICAobWFrZSA9IGF4MjVfbWFrZV9uZXcoc2ssIGF4MjVfZGV2KSkgPT0gTlVMTCkgeworCQkJaWYgKG1pbmUpCisJCQkJYXgyNV9yZXR1cm5fZG0oZGV2LCAmc3JjLCAmZGVzdCwgJmRwKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJYmhfdW5sb2NrX3NvY2soc2spOworCQkJc29ja19wdXQoc2spOworCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWF4MjUgPSBheDI1X3NrKG1ha2UpOworCQlza2Jfc2V0X293bmVyX3Ioc2tiLCBtYWtlKTsKKwkJc2tiX3F1ZXVlX2hlYWQoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpOworCisJCW1ha2UtPnNrX3N0YXRlID0gVENQX0VTVEFCTElTSEVEOworCisJCXNrLT5za19hY2tfYmFja2xvZysrOworCQliaF91bmxvY2tfc29jayhzayk7CisJfSBlbHNlIHsKKwkJaWYgKCFtaW5lKSB7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKChheDI1ID0gYXgyNV9jcmVhdGVfY2IoKSkgPT0gTlVMTCkgeworCQkJYXgyNV9yZXR1cm5fZG0oZGV2LCAmc3JjLCAmZGVzdCwgJmRwKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlheDI1X2ZpbGxpbl9jYihheDI1LCBheDI1X2Rldik7CisJfQorCisJYXgyNS0+c291cmNlX2FkZHIgPSBkZXN0OworCWF4MjUtPmRlc3RfYWRkciAgID0gc3JjOworCisJLyoKKwkgKglTb3J0IG91dCBhbnkgZGlnaXBlYXRlZCBwYXRocy4KKwkgKi8KKwlpZiAoZHAubmRpZ2kgJiYgIWF4MjUtPmRpZ2lwZWF0ICYmCisJICAgIChheDI1LT5kaWdpcGVhdCA9IGttYWxsb2Moc2l6ZW9mKGF4MjVfZGlnaSksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlheDI1X2Rlc3Ryb3lfc29ja2V0KGF4MjUpOworCQlpZiAoc2spCisJCQlzb2NrX3B1dChzayk7CisJCXJldHVybiAwOworCX0KKworCWlmIChkcC5uZGlnaSA9PSAwKSB7CisJCWlmIChheDI1LT5kaWdpcGVhdCAhPSBOVUxMKSB7CisJCQlrZnJlZShheDI1LT5kaWdpcGVhdCk7CisJCQlheDI1LT5kaWdpcGVhdCA9IE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQkvKiBSZXZlcnNlIHRoZSBzb3VyY2UgU0FCTSdzIHBhdGggKi8KKwkJbWVtY3B5KGF4MjUtPmRpZ2lwZWF0LCAmcmV2ZXJzZV9kcCwgc2l6ZW9mKGF4MjVfZGlnaSkpOworCX0KKworCWlmICgoKnNrYi0+ZGF0YSAmIH5BWDI1X1BGKSA9PSBBWDI1X1NBQk1FKSB7CisJCWF4MjUtPm1vZHVsdXMgPSBBWDI1X0VNT0RVTFVTOworCQlheDI1LT53aW5kb3cgID0gYXgyNV9kZXYtPnZhbHVlc1tBWDI1X1ZBTFVFU19FV0lORE9XXTsKKwl9IGVsc2UgeworCQlheDI1LT5tb2R1bHVzID0gQVgyNV9NT0RVTFVTOworCQlheDI1LT53aW5kb3cgID0gYXgyNV9kZXYtPnZhbHVlc1tBWDI1X1ZBTFVFU19XSU5ET1ddOworCX0KKworCWF4MjVfc2VuZF9jb250cm9sKGF4MjUsIEFYMjVfVUEsIEFYMjVfUE9MTE9OLCBBWDI1X1JFU1BPTlNFKTsKKworI2lmZGVmIENPTkZJR19BWDI1X0RBTUFfU0xBVkUKKwlpZiAoZGFtYSAmJiBheDI1LT5heDI1X2Rldi0+dmFsdWVzW0FYMjVfVkFMVUVTX1BST1RPQ09MXSA9PSBBWDI1X1BST1RPX0RBTUFfU0xBVkUpCisJCWF4MjVfZGFtYV9vbihheDI1KTsKKyNlbmRpZgorCisJYXgyNS0+c3RhdGUgPSBBWDI1X1NUQVRFXzM7CisKKwlheDI1X2NiX2FkZChheDI1KTsKKworCWF4MjVfc3RhcnRfaGVhcnRiZWF0KGF4MjUpOworCWF4MjVfc3RhcnRfdDN0aW1lcihheDI1KTsKKwlheDI1X3N0YXJ0X2lkbGV0aW1lcihheDI1KTsKKworCWlmIChzaykgeworCQlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkKKwkJCXNrLT5za19kYXRhX3JlYWR5KHNrLCBza2ItPmxlbik7CisJCXNvY2tfcHV0KHNrKTsKKwl9IGVsc2UKKwkJa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCVJlY2VpdmUgYW4gQVguMjUgZnJhbWUgdmlhIGEgU0xJUCBpbnRlcmZhY2UuCisgKi8KK2ludCBheDI1X2tpc3NfcmN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgc3RydWN0IHBhY2tldF90eXBlICpwdHlwZSkKK3sKKwlza2ItPnNrID0gTlVMTDsJCS8qIEluaXRpYWxseSB3ZSBkb24ndCBrbm93IHdobyBpdCdzIGZvciAqLworCXNrYi0+ZGVzdHJ1Y3RvciA9IE5VTEw7CS8qIFdobyBpbml0aWFsaXplcyB0aGlzLCBkYW1taXQ/ISAqLworCisJaWYgKCgqc2tiLT5kYXRhICYgMHgwRikgIT0gMCkgeworCQlrZnJlZV9za2Ioc2tiKTsJLyogTm90IGEgS0lTUyBkYXRhIGZyYW1lICovCisJCXJldHVybiAwOworCX0KKworCXNrYl9wdWxsKHNrYiwgQVgyNV9LSVNTX0hFQURFUl9MRU4pOwkvKiBSZW1vdmUgdGhlIEtJU1MgYnl0ZSAqLworCisJcmV0dXJuIGF4MjVfcmN2KHNrYiwgZGV2LCAoYXgyNV9hZGRyZXNzICopZGV2LT5kZXZfYWRkciwgcHR5cGUpOworfQpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYXgyNV9pcC5jIGIvbmV0L2F4MjUvYXgyNV9pcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZDcxMTMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYXgyNS9heDI1X2lwLmMKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgSm9uYXRoYW4gTmF5bG9yIEc0S0xYIChnNGtseEBnNGtseC5kZW1vbi5jby51aykKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bmV0L2F4MjUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4JLyogRm9yIFRJT0NJTlEvT1VUUSAqLworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKworLyoKKyAqCUlQIG92ZXIgQVguMjUgZW5jYXBzdWxhdGlvbi4KKyAqLworCisvKgorICoJU2hvdmUgYW4gQVguMjUgVUkgaGVhZGVyIG9uIGFuIElQIHBhY2tldCBhbmQgaGFuZGxlIEFSUAorICovCisKKyNpZmRlZiBDT05GSUdfSU5FVAorCitpbnQgYXgyNV9lbmNhcHN1bGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB0eXBlLCB2b2lkICpkYWRkciwgdm9pZCAqc2FkZHIsIHVuc2lnbmVkIGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICpidWZmOworCisJLyogdGhleSBzb21ldGltZXMgY29tZSBiYWNrIHRvIHVzLi4uICovCisJaWYgKHR5cGUgPT0gRVRIX1BfQVgyNSkKKwkJcmV0dXJuIDA7CisKKyAgCS8qIGhlYWRlciBpcyBhbiBBWC4yNSBVSSBmcmFtZSBmcm9tIHVzIHRvIHRoZW0gKi8KKyAJYnVmZiA9IHNrYl9wdXNoKHNrYiwgQVgyNV9IRUFERVJfTEVOKTsKKyAgCSpidWZmKysgPSAweDAwOwkvKiBLSVNTIERBVEEgKi8KKworCWlmIChkYWRkciAhPSBOVUxMKQorCQltZW1jcHkoYnVmZiwgZGFkZHIsIGRldi0+YWRkcl9sZW4pOwkvKiBBZGRyZXNzIHNwZWNpZmllZCAqLworCisgIAlidWZmWzZdICY9IH5BWDI1X0NCSVQ7CisgIAlidWZmWzZdICY9IH5BWDI1X0VCSVQ7CisgIAlidWZmWzZdIHw9IEFYMjVfU1NTSURfU1BBUkU7CisgIAlidWZmICAgICs9IEFYMjVfQUREUl9MRU47CisKKyAgCWlmIChzYWRkciAhPSBOVUxMKQorICAJCW1lbWNweShidWZmLCBzYWRkciwgZGV2LT5hZGRyX2xlbik7CisgIAllbHNlCisgIAkJbWVtY3B5KGJ1ZmYsIGRldi0+ZGV2X2FkZHIsIGRldi0+YWRkcl9sZW4pOworCisgIAlidWZmWzZdICY9IH5BWDI1X0NCSVQ7CisgIAlidWZmWzZdIHw9IEFYMjVfRUJJVDsKKyAgCWJ1ZmZbNl0gfD0gQVgyNV9TU1NJRF9TUEFSRTsKKyAgCWJ1ZmYgICAgKz0gQVgyNV9BRERSX0xFTjsKKworICAJKmJ1ZmYrKyAgPSBBWDI1X1VJOwkvKiBVSSAqLworCisgIAkvKiBBcHBlbmQgYSBzdWl0YWJsZSBBWC4yNSBQSUQgKi8KKyAgCXN3aXRjaCAodHlwZSkgeworICAJY2FzZSBFVEhfUF9JUDoKKyAgCQkqYnVmZisrID0gQVgyNV9QX0lQOworIAkJYnJlYWs7CisgIAljYXNlIEVUSF9QX0FSUDoKKyAgCQkqYnVmZisrID0gQVgyNV9QX0FSUDsKKyAgCQlicmVhazsKKyAgCWRlZmF1bHQ6CisgIAkJcHJpbnRrKEtFUk5fRVJSICJBWC4yNTogYXgyNV9lbmNhcHN1bGF0ZSAtIHdyb25nIHByb3RvY29sIHR5cGUgMHglMi4yeFxuIiwgdHlwZSk7CisgIAkJKmJ1ZmYrKyA9IDA7CisgIAkJYnJlYWs7CisgCX0KKworCWlmIChkYWRkciAhPSBOVUxMKQorCSAgCXJldHVybiBBWDI1X0hFQURFUl9MRU47CisKKwlyZXR1cm4gLUFYMjVfSEVBREVSX0xFTjsJLyogVW5maW5pc2hlZCBoZWFkZXIgKi8KK30KKworaW50IGF4MjVfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqb3Vyc2tiOworCXVuc2lnbmVkIGNoYXIgKmJwICA9IHNrYi0+ZGF0YTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWF4MjVfYWRkcmVzcyAqc3JjLCAqZHN0OworCWF4MjVfZGV2ICpheDI1X2RldjsKKwlheDI1X3JvdXRlIF9yb3V0ZSwgKnJvdXRlID0gJl9yb3V0ZTsKKwlheDI1X2NiICpheDI1OworCisJZHN0ID0gKGF4MjVfYWRkcmVzcyAqKShicCArIDEpOworCXNyYyA9IChheDI1X2FkZHJlc3MgKikoYnAgKyA4KTsKKworICAJaWYgKGFycF9maW5kKGJwICsgMSwgc2tiKSkKKyAgCQlyZXR1cm4gMTsKKworCXJvdXRlID0gYXgyNV9ydF9maW5kX3JvdXRlKHJvdXRlLCBkc3QsIE5VTEwpOworCWRldiAgICAgID0gcm91dGUtPmRldjsKKworCWlmIChkZXYgPT0gTlVMTCkKKwkJZGV2ID0gc2tiLT5kZXY7CisKKyAgICAgICAgaWYgKChheDI1X2RldiA9IGF4MjVfZGV2X2F4MjVkZXYoZGV2KSkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGdvdG8gcHV0OworCX0KKworCWlmIChicFsxNl0gPT0gQVgyNV9QX0lQKSB7CisJCWlmIChyb3V0ZS0+aXBfbW9kZSA9PSAnVicgfHwgKHJvdXRlLT5pcF9tb2RlID09ICcgJyAmJiBheDI1X2Rldi0+dmFsdWVzW0FYMjVfVkFMVUVTX0lQREVGTU9ERV0pKSB7CisJCQkvKgorCQkJICoJV2UgY29weSB0aGUgYnVmZmVyIGFuZCByZWxlYXNlIHRoZSBvcmlnaW5hbCB0aGVyZWJ5CisJCQkgKglrZWVwaW5nIGl0IHN0cmFpZ2h0CisJCQkgKgorCQkJICoJTm90ZTogd2UgcmVwb3J0IDEgYmFjayBzbyB0aGUgY2FsbGVyIHdpbGwKKwkJCSAqCW5vdCBmZWVkIHRoZSBmcmFtZSBkaXJlY3QgdG8gdGhlIHBoeXNpY2FsIGRldmljZQorCQkJICoJV2UgZG9uJ3Qgd2FudCB0aGF0IHRvIGhhcHBlbi4gKEl0IHdvbid0IGJlIHVwc2V0CisJCQkgKglhcyB3ZSBoYXZlIHB1bGxlZCB0aGUgZnJhbWUgZnJvbSB0aGUgcXVldWUgYnkKKwkJCSAqCWZyZWVpbmcgaXQpLgorCQkJICoKKwkJCSAqCU5COiBUQ1AgbW9kaWZpZXMgYnVmZmVycyB0aGF0IGFyZSBzdGlsbAorCQkJICoJb24gYSBkZXZpY2UgcXVldWUsIHRodXMgd2UgdXNlIHNrYl9jb3B5KCkKKwkJCSAqICAgICAgaW5zdGVhZCBvZiB1c2luZyBza2JfY2xvbmUoKSB1bmxlc3MgdGhpcworCQkJICoJZ2V0cyBmaXhlZC4KKwkJCSAqLworCisJCQlheDI1X2FkZHJlc3Mgc3JjX2M7CisJCQlheDI1X2FkZHJlc3MgZHN0X2M7CisKKwkJCWlmICgob3Vyc2tiID0gc2tiX2NvcHkoc2tiLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgeworCQkJCWtmcmVlX3NrYihza2IpOworCQkJCWdvdG8gcHV0OworCQkJfQorCisJCQlpZiAoc2tiLT5zayAhPSBOVUxMKQorCQkJCXNrYl9zZXRfb3duZXJfdyhvdXJza2IsIHNrYi0+c2spOworCisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCS8qIGRsOXNhdTogYnVnZml4CisJCQkgKiBhZnRlciBrZnJlZV9za2IoKSwgZHN0IGFuZCBzcmMgd2hpY2ggd2VyZSBwb2ludGVyCisJCQkgKiB0byBicCB3aGljaCBpcyBwYXJ0IG9mIHNrYi0+ZGF0YSB3b3VsZCBub3QgYmUgdmFsaWQKKwkJCSAqIGFueW1vcmUgaG9wZSB0aGF0IGFmdGVyIHNrYl9wdWxsKG91cnNrYiwgLi4pIG91cgorCQkJICogZHNjX2MgYW5kIHNyY19jIHdpbGwgbm90IGJlY29tZSBpbnZhbGlkCisJCQkgKi8KKwkJCWJwICA9IG91cnNrYi0+ZGF0YTsKKwkJCWRzdF9jID0gKihheDI1X2FkZHJlc3MgKikoYnAgKyAxKTsKKwkJCXNyY19jID0gKihheDI1X2FkZHJlc3MgKikoYnAgKyA4KTsKKworCQkJc2tiX3B1bGwob3Vyc2tiLCBBWDI1X0hFQURFUl9MRU4gLSAxKTsJLyogS2VlcCBQSUQgKi8KKwkJCW91cnNrYi0+bmgucmF3ID0gb3Vyc2tiLT5kYXRhOworCisJCQlheDI1PWF4MjVfc2VuZF9mcmFtZSgKKwkJCSAgICBvdXJza2IsIAorCQkJICAgIGF4MjVfZGV2LT52YWx1ZXNbQVgyNV9WQUxVRVNfUEFDTEVOXSwgCisJCQkgICAgJnNyY19jLAorCQkJICAgICZkc3RfYywgcm91dGUtPmRpZ2lwZWF0LCBkZXYpOworCQkJaWYgKGF4MjUpIHsKKwkJCQlheDI1X2NiX3B1dChheDI1KTsKKwkJCX0KKwkJCWdvdG8gcHV0OworCQl9CisJfQorCisgIAlicFs3XSAgJj0gfkFYMjVfQ0JJVDsKKyAgCWJwWzddICAmPSB+QVgyNV9FQklUOworICAJYnBbN10gIHw9IEFYMjVfU1NTSURfU1BBUkU7CisKKyAgCWJwWzE0XSAmPSB+QVgyNV9DQklUOworICAJYnBbMTRdIHw9IEFYMjVfRUJJVDsKKyAgCWJwWzE0XSB8PSBBWDI1X1NTU0lEX1NQQVJFOworCisJc2tiX3B1bGwoc2tiLCBBWDI1X0tJU1NfSEVBREVSX0xFTik7CisKKwlpZiAocm91dGUtPmRpZ2lwZWF0ICE9IE5VTEwpIHsKKwkJaWYgKChvdXJza2IgPSBheDI1X3J0X2J1aWxkX3BhdGgoc2tiLCBzcmMsIGRzdCwgcm91dGUtPmRpZ2lwZWF0KSkgPT0gTlVMTCkgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlnb3RvIHB1dDsKKwkJfQorCisJCXNrYiA9IG91cnNrYjsKKwl9CisKKwlza2ItPmRldiAgICAgID0gZGV2OworCisJYXgyNV9xdWV1ZV94bWl0KHNrYik7CisKK3B1dDoKKwlheDI1X3B1dF9yb3V0ZShyb3V0ZSk7CisKKyAgCXJldHVybiAxOworfQorCisjZWxzZQkvKiBJTkVUICovCisKK2ludCBheDI1X2VuY2Fwc3VsYXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQgKmRhZGRyLCB2b2lkICpzYWRkciwgdW5zaWduZWQgbGVuKQoreworCXJldHVybiAtQVgyNV9IRUFERVJfTEVOOworfQorCitpbnQgYXgyNV9yZWJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAxOworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYXgyNV9vdXQuYyBiL25ldC9heDI1L2F4MjVfb3V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ3NWEzYQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9heDI1L2F4MjVfb3V0LmMKQEAgLTAsMCArMSwzODMgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgQWxhbiBDb3ggR1c0UFRTIChhbGFuQGx4b3JndWsudWt1dS5vcmcudWspCisgKiBDb3B5cmlnaHQgKEMpIEpvbmF0aGFuIE5heWxvciBHNEtMWCAoZzRrbHhAZzRrbHguZGVtb24uY28udWspCisgKiBDb3B5cmlnaHQgKEMpIEpvZXJnIFJldXRlciBETDFCS0UgKGpyZXV0ZXJAeWFpbmEuZGUpCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bmV0L2F4MjUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYXgyNV9mcmFnX2xvY2spOworCitheDI1X2NiICpheDI1X3NlbmRfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHBhY2xlbiwgYXgyNV9hZGRyZXNzICpzcmMsIGF4MjVfYWRkcmVzcyAqZGVzdCwgYXgyNV9kaWdpICpkaWdpLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWF4MjVfZGV2ICpheDI1X2RldjsKKwlheDI1X2NiICpheDI1OworCisJLyoKKwkgKiBUYWtlIHRoZSBkZWZhdWx0IHBhY2tldCBsZW5ndGggZm9yIHRoZSBkZXZpY2UgaWYgemVybyBpcworCSAqIHNwZWNpZmllZC4KKwkgKi8KKwlpZiAocGFjbGVuID09IDApIHsKKwkJaWYgKChheDI1X2RldiA9IGF4MjVfZGV2X2F4MjVkZXYoZGV2KSkgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCisJCXBhY2xlbiA9IGF4MjVfZGV2LT52YWx1ZXNbQVgyNV9WQUxVRVNfUEFDTEVOXTsKKwl9CisKKwkvKgorCSAqIExvb2sgZm9yIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24uCisJICovCisJaWYgKChheDI1ID0gYXgyNV9maW5kX2NiKHNyYywgZGVzdCwgZGlnaSwgZGV2KSkgIT0gTlVMTCkgeworCQlheDI1X291dHB1dChheDI1LCBwYWNsZW4sIHNrYik7CisJCXJldHVybiBheDI1OwkJLyogSXQgYWxyZWFkeSBleGlzdGVkICovCisJfQorCisJaWYgKChheDI1X2RldiA9IGF4MjVfZGV2X2F4MjVkZXYoZGV2KSkgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoKGF4MjUgPSBheDI1X2NyZWF0ZV9jYigpKSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWF4MjVfZmlsbGluX2NiKGF4MjUsIGF4MjVfZGV2KTsKKworCWF4MjUtPnNvdXJjZV9hZGRyID0gKnNyYzsKKwlheDI1LT5kZXN0X2FkZHIgICA9ICpkZXN0OworCisJaWYgKGRpZ2kgIT0gTlVMTCkgeworCQlpZiAoKGF4MjUtPmRpZ2lwZWF0ID0ga21hbGxvYyhzaXplb2YoYXgyNV9kaWdpKSwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwkJCWF4MjVfY2JfcHV0KGF4MjUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJbWVtY3B5KGF4MjUtPmRpZ2lwZWF0LCBkaWdpLCBzaXplb2YoYXgyNV9kaWdpKSk7CisJfQorCisJc3dpdGNoIChheDI1LT5heDI1X2Rldi0+dmFsdWVzW0FYMjVfVkFMVUVTX1BST1RPQ09MXSkgeworCWNhc2UgQVgyNV9QUk9UT19TVERfU0lNUExFWDoKKwljYXNlIEFYMjVfUFJPVE9fU1REX0RVUExFWDoKKwkJYXgyNV9zdGRfZXN0YWJsaXNoX2RhdGFfbGluayhheDI1KTsKKwkJYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfQVgyNV9EQU1BX1NMQVZFCisJY2FzZSBBWDI1X1BST1RPX0RBTUFfU0xBVkU6CisJCWlmIChheDI1X2Rldi0+ZGFtYS5zbGF2ZSkKKwkJCWF4MjVfZHNfZXN0YWJsaXNoX2RhdGFfbGluayhheDI1KTsKKwkJZWxzZQorCQkJYXgyNV9zdGRfZXN0YWJsaXNoX2RhdGFfbGluayhheDI1KTsKKwkJYnJlYWs7CisjZW5kaWYKKwl9CisKKwlheDI1X2NiX2FkZChheDI1KTsKKworCWF4MjUtPnN0YXRlID0gQVgyNV9TVEFURV8xOworCisJYXgyNV9zdGFydF9oZWFydGJlYXQoYXgyNSk7CisKKwlheDI1X291dHB1dChheDI1LCBwYWNsZW4sIHNrYik7CisKKwlyZXR1cm4gYXgyNTsJCQkvKiBXZSBoYWQgdG8gY3JlYXRlIGl0ICovCit9CisKKy8qCisgKglBbGwgb3V0Z29pbmcgQVguMjUgSSBmcmFtZXMgcGFzcyB2aWEgdGhpcyByb3V0aW5lLiBUaGVyZWZvcmUgdGhpcyBpcworICoJd2hlcmUgdGhlIGZyYWdtZW50YXRpb24gb2YgZnJhbWVzIHRha2VzIHBsYWNlLiBJZiBmcmFnbWVudCBpcyBzZXQgdG8KKyAqCXplcm8gdGhlbiB3ZSBhcmUgbm90IGFsbG93ZWQgdG8gZG8gZnJhZ21lbnRhdGlvbiwgZXZlbiBpZiB0aGUgZnJhbWUKKyAqCWlzIHRvbyBsYXJnZS4KKyAqLwordm9pZCBheDI1X291dHB1dChheDI1X2NiICpheDI1LCBpbnQgcGFjbGVuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmICpza2JuOworCXVuc2lnbmVkIGNoYXIgKnA7CisJaW50IGZyb250bGVuLCBsZW4sIGZyYWdubywga2E5cWZyYWcsIGZpcnN0ID0gMTsKKworCWlmICgoc2tiLT5sZW4gLSAxKSA+IHBhY2xlbikgeworCQlpZiAoKnNrYi0+ZGF0YSA9PSBBWDI1X1BfVEVYVCkgeworCQkJc2tiX3B1bGwoc2tiLCAxKTsgLyogc2tpcCBQSUQgKi8KKwkJCWthOXFmcmFnID0gMDsKKwkJfSBlbHNlIHsKKwkJCXBhY2xlbiAtPSAyOwkvKiBBbGxvdyBmb3IgZnJhZ21lbnQgY29udHJvbCBpbmZvICovCisJCQlrYTlxZnJhZyA9IDE7CisJCX0KKworCQlmcmFnbm8gPSBza2ItPmxlbiAvIHBhY2xlbjsKKwkJaWYgKHNrYi0+bGVuICUgcGFjbGVuID09IDApIGZyYWduby0tOworCisJCWZyb250bGVuID0gc2tiX2hlYWRyb29tKHNrYik7CS8qIEFkZHJlc3Mgc3BhY2UgKyBDVFJMICovCisKKwkJd2hpbGUgKHNrYi0+bGVuID4gMCkgeworCQkJc3Bpbl9sb2NrX2JoKCZheDI1X2ZyYWdfbG9jayk7CisJCQlpZiAoKHNrYm4gPSBhbGxvY19za2IocGFjbGVuICsgMiArIGZyb250bGVuLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgeworCQkJCXNwaW5fdW5sb2NrX2JoKCZheDI1X2ZyYWdfbG9jayk7CisJCQkJcHJpbnRrKEtFUk5fQ1JJVCAiQVguMjU6IGF4MjVfb3V0cHV0IC0gb3V0IG9mIG1lbW9yeVxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlpZiAoc2tiLT5zayAhPSBOVUxMKQorCQkJCXNrYl9zZXRfb3duZXJfdyhza2JuLCBza2ItPnNrKTsKKworCQkJc3Bpbl91bmxvY2tfYmgoJmF4MjVfZnJhZ19sb2NrKTsKKworCQkJbGVuID0gKHBhY2xlbiA+IHNrYi0+bGVuKSA/IHNrYi0+bGVuIDogcGFjbGVuOworCisJCQlpZiAoa2E5cWZyYWcgPT0gMSkgeworCQkJCXNrYl9yZXNlcnZlKHNrYm4sIGZyb250bGVuICsgMik7CisJCQkJc2tibi0+bmgucmF3ID0gc2tibi0+ZGF0YSArIChza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YSk7CisJCQkJbWVtY3B5KHNrYl9wdXQoc2tibiwgbGVuKSwgc2tiLT5kYXRhLCBsZW4pOworCQkJCXAgPSBza2JfcHVzaChza2JuLCAyKTsKKworCQkJCSpwKysgPSBBWDI1X1BfU0VHTUVOVDsKKworCQkJCSpwID0gZnJhZ25vLS07CisJCQkJaWYgKGZpcnN0KSB7CisJCQkJCSpwIHw9IEFYMjVfU0VHX0ZJUlNUOworCQkJCQlmaXJzdCA9IDA7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlza2JfcmVzZXJ2ZShza2JuLCBmcm9udGxlbiArIDEpOworCQkJCXNrYm4tPm5oLnJhdyA9IHNrYm4tPmRhdGEgKyAoc2tiLT5uaC5yYXcgLSBza2ItPmRhdGEpOworCQkJCW1lbWNweShza2JfcHV0KHNrYm4sIGxlbiksIHNrYi0+ZGF0YSwgbGVuKTsKKwkJCQlwID0gc2tiX3B1c2goc2tibiwgMSk7CisJCQkJKnAgPSBBWDI1X1BfVEVYVDsKKwkJCX0KKworCQkJc2tiX3B1bGwoc2tiLCBsZW4pOworCQkJc2tiX3F1ZXVlX3RhaWwoJmF4MjUtPndyaXRlX3F1ZXVlLCBza2JuKTsgLyogVGhyb3cgaXQgb24gdGhlIHF1ZXVlICovCisJCX0KKworCQlrZnJlZV9za2Ioc2tiKTsKKwl9IGVsc2UgeworCQlza2JfcXVldWVfdGFpbCgmYXgyNS0+d3JpdGVfcXVldWUsIHNrYik7CSAgLyogVGhyb3cgaXQgb24gdGhlIHF1ZXVlICovCisJfQorCisJc3dpdGNoIChheDI1LT5heDI1X2Rldi0+dmFsdWVzW0FYMjVfVkFMVUVTX1BST1RPQ09MXSkgeworCWNhc2UgQVgyNV9QUk9UT19TVERfU0lNUExFWDoKKwljYXNlIEFYMjVfUFJPVE9fU1REX0RVUExFWDoKKwkJYXgyNV9raWNrKGF4MjUpOworCQlicmVhazsKKworI2lmZGVmIENPTkZJR19BWDI1X0RBTUFfU0xBVkUKKwkvKgorCSAqIEEgREFNQSBzbGF2ZSBpcyBfcmVxdWlyZWRfIHRvIHdvcmsgYXMgbm9ybWFsIEFYLjI1TDJWMgorCSAqIGlmIG5vIERBTUEgbWFzdGVyIGlzIGF2YWlsYWJsZS4KKwkgKi8KKwljYXNlIEFYMjVfUFJPVE9fREFNQV9TTEFWRToKKwkJaWYgKCFheDI1LT5heDI1X2Rldi0+ZGFtYS5zbGF2ZSkgYXgyNV9raWNrKGF4MjUpOworCQlicmVhazsKKyNlbmRpZgorCX0KK30KKworLyoKKyAqICBUaGlzIHByb2NlZHVyZSBpcyBwYXNzZWQgYSBidWZmZXIgZGVzY3JpcHRvciBmb3IgYW4gaWZyYW1lLiBJdCBidWlsZHMKKyAqICB0aGUgcmVzdCBvZiB0aGUgY29udHJvbCBwYXJ0IG9mIHRoZSBmcmFtZSBhbmQgdGhlbiB3cml0ZXMgaXQgb3V0LgorICovCitzdGF0aWMgdm9pZCBheDI1X3NlbmRfaWZyYW1lKGF4MjVfY2IgKmF4MjUsIHN0cnVjdCBza19idWZmICpza2IsIGludCBwb2xsX2JpdCkKK3sKKwl1bnNpZ25lZCBjaGFyICpmcmFtZTsKKworCWlmIChza2IgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisKKwlpZiAoYXgyNS0+bW9kdWx1cyA9PSBBWDI1X01PRFVMVVMpIHsKKwkJZnJhbWUgPSBza2JfcHVzaChza2IsIDEpOworCisJCSpmcmFtZSA9IEFYMjVfSTsKKwkJKmZyYW1lIHw9IChwb2xsX2JpdCkgPyBBWDI1X1BGIDogMDsKKwkJKmZyYW1lIHw9IChheDI1LT52ciA8PCA1KTsKKwkJKmZyYW1lIHw9IChheDI1LT52cyA8PCAxKTsKKwl9IGVsc2UgeworCQlmcmFtZSA9IHNrYl9wdXNoKHNrYiwgMik7CisKKwkJZnJhbWVbMF0gPSBBWDI1X0k7CisJCWZyYW1lWzBdIHw9IChheDI1LT52cyA8PCAxKTsKKwkJZnJhbWVbMV0gPSAocG9sbF9iaXQpID8gQVgyNV9FUEYgOiAwOworCQlmcmFtZVsxXSB8PSAoYXgyNS0+dnIgPDwgMSk7CisJfQorCisJYXgyNV9zdGFydF9pZGxldGltZXIoYXgyNSk7CisKKwlheDI1X3RyYW5zbWl0X2J1ZmZlcihheDI1LCBza2IsIEFYMjVfQ09NTUFORCk7Cit9CisKK3ZvaWQgYXgyNV9raWNrKGF4MjVfY2IgKmF4MjUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnNrYm47CisJaW50IGxhc3QgPSAxOworCXVuc2lnbmVkIHNob3J0IHN0YXJ0LCBlbmQsIG5leHQ7CisKKwlpZiAoYXgyNS0+c3RhdGUgIT0gQVgyNV9TVEFURV8zICYmIGF4MjUtPnN0YXRlICE9IEFYMjVfU1RBVEVfNCkKKwkJcmV0dXJuOworCisJaWYgKGF4MjUtPmNvbmRpdGlvbiAmIEFYMjVfQ09ORF9QRUVSX1JYX0JVU1kpCisJCXJldHVybjsKKworCWlmIChza2JfcGVlaygmYXgyNS0+d3JpdGVfcXVldWUpID09IE5VTEwpCisJCXJldHVybjsKKworCXN0YXJ0ID0gKHNrYl9wZWVrKCZheDI1LT5hY2tfcXVldWUpID09IE5VTEwpID8gYXgyNS0+dmEgOiBheDI1LT52czsKKwllbmQgICA9IChheDI1LT52YSArIGF4MjUtPndpbmRvdykgJSBheDI1LT5tb2R1bHVzOworCisJaWYgKHN0YXJ0ID09IGVuZCkKKwkJcmV0dXJuOworCisJYXgyNS0+dnMgPSBzdGFydDsKKworCS8qCisJICogVHJhbnNtaXQgZGF0YSB1bnRpbCBlaXRoZXIgd2UncmUgb3V0IG9mIGRhdGEgdG8gc2VuZCBvcgorCSAqIHRoZSB3aW5kb3cgaXMgZnVsbC4gU2VuZCBhIHBvbGwgb24gdGhlIGZpbmFsIEkgZnJhbWUgaWYKKwkgKiB0aGUgd2luZG93IGlzIGZpbGxlZC4KKwkgKi8KKworCS8qCisJICogRGVxdWV1ZSB0aGUgZnJhbWUgYW5kIGNvcHkgaXQuCisJICovCisJc2tiICA9IHNrYl9kZXF1ZXVlKCZheDI1LT53cml0ZV9xdWV1ZSk7CisKKwlkbyB7CisJCWlmICgoc2tibiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCQlza2JfcXVldWVfaGVhZCgmYXgyNS0+d3JpdGVfcXVldWUsIHNrYik7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChza2ItPnNrICE9IE5VTEwpCisJCQlza2Jfc2V0X293bmVyX3coc2tibiwgc2tiLT5zayk7CisKKwkJbmV4dCA9IChheDI1LT52cyArIDEpICUgYXgyNS0+bW9kdWx1czsKKwkJbGFzdCA9IChuZXh0ID09IGVuZCk7CisKKwkJLyoKKwkJICogVHJhbnNtaXQgdGhlIGZyYW1lIGNvcHkuCisJCSAqIGJrZSA5NjAxMTQ6IGRvIG5vdCBzZXQgdGhlIFBvbGwgYml0IG9uIHRoZSBsYXN0IGZyYW1lCisJCSAqIGluIERBTUEgbW9kZS4KKwkJICovCisJCXN3aXRjaCAoYXgyNS0+YXgyNV9kZXYtPnZhbHVlc1tBWDI1X1ZBTFVFU19QUk9UT0NPTF0pIHsKKwkJY2FzZSBBWDI1X1BST1RPX1NURF9TSU1QTEVYOgorCQljYXNlIEFYMjVfUFJPVE9fU1REX0RVUExFWDoKKwkJCWF4MjVfc2VuZF9pZnJhbWUoYXgyNSwgc2tibiwgKGxhc3QpID8gQVgyNV9QT0xMT04gOiBBWDI1X1BPTExPRkYpOworCQkJYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfQVgyNV9EQU1BX1NMQVZFCisJCWNhc2UgQVgyNV9QUk9UT19EQU1BX1NMQVZFOgorCQkJYXgyNV9zZW5kX2lmcmFtZShheDI1LCBza2JuLCBBWDI1X1BPTExPRkYpOworCQkJYnJlYWs7CisjZW5kaWYKKwkJfQorCisJCWF4MjUtPnZzID0gbmV4dDsKKworCQkvKgorCQkgKiBSZXF1ZXVlIHRoZSBvcmlnaW5hbCBkYXRhIGZyYW1lLgorCQkgKi8KKwkJc2tiX3F1ZXVlX3RhaWwoJmF4MjUtPmFja19xdWV1ZSwgc2tiKTsKKworCX0gd2hpbGUgKCFsYXN0ICYmIChza2IgPSBza2JfZGVxdWV1ZSgmYXgyNS0+d3JpdGVfcXVldWUpKSAhPSBOVUxMKTsKKworCWF4MjUtPmNvbmRpdGlvbiAmPSB+QVgyNV9DT05EX0FDS19QRU5ESU5HOworCisJaWYgKCFheDI1X3QxdGltZXJfcnVubmluZyhheDI1KSkgeworCQlheDI1X3N0b3BfdDN0aW1lcihheDI1KTsKKwkJYXgyNV9jYWxjdWxhdGVfdDEoYXgyNSk7CisJCWF4MjVfc3RhcnRfdDF0aW1lcihheDI1KTsKKwl9Cit9CisKK3ZvaWQgYXgyNV90cmFuc21pdF9idWZmZXIoYXgyNV9jYiAqYXgyNSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHR5cGUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYm47CisJdW5zaWduZWQgY2hhciAqcHRyOworCWludCBoZWFkcm9vbTsKKworCWlmIChheDI1LT5heDI1X2RldiA9PSBOVUxMKSB7CisJCWF4MjVfZGlzY29ubmVjdChheDI1LCBFTkVUVU5SRUFDSCk7CisJCXJldHVybjsKKwl9CisKKwloZWFkcm9vbSA9IGF4MjVfYWRkcl9zaXplKGF4MjUtPmRpZ2lwZWF0KTsKKworCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IGhlYWRyb29tKSB7CisJCWlmICgoc2tibiA9IHNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwgaGVhZHJvb20pKSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9DUklUICJBWC4yNTogYXgyNV90cmFuc21pdF9idWZmZXIgLSBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKHNrYi0+c2sgIT0gTlVMTCkKKwkJCXNrYl9zZXRfb3duZXJfdyhza2JuLCBza2ItPnNrKTsKKworCQlrZnJlZV9za2Ioc2tiKTsKKwkJc2tiID0gc2tibjsKKwl9CisKKwlwdHIgPSBza2JfcHVzaChza2IsIGhlYWRyb29tKTsKKworCWF4MjVfYWRkcl9idWlsZChwdHIsICZheDI1LT5zb3VyY2VfYWRkciwgJmF4MjUtPmRlc3RfYWRkciwgYXgyNS0+ZGlnaXBlYXQsIHR5cGUsIGF4MjUtPm1vZHVsdXMpOworCisJc2tiLT5kZXYgPSBheDI1LT5heDI1X2Rldi0+ZGV2OworCisJYXgyNV9xdWV1ZV94bWl0KHNrYik7Cit9CisKKy8qCisgKglBIHNtYWxsIHNoaW0gdG8gZGV2X3F1ZXVlX3htaXQgdG8gYWRkIHRoZSBLSVNTIGNvbnRyb2wgYnl0ZSwgYW5kIGRvCisgKglhbnkgcGFja2V0IGZvcndhcmRpbmcgaW4gb3BlcmF0aW9uLgorICovCit2b2lkIGF4MjVfcXVldWVfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9BWDI1KTsKKwlza2ItPmRldiAgICAgID0gYXgyNV9md2RfZGV2KHNrYi0+ZGV2KTsKKworCXB0ciAgPSBza2JfcHVzaChza2IsIDEpOworCSpwdHIgPSAweDAwOwkJCS8qIEtJU1MgKi8KKworCWRldl9xdWV1ZV94bWl0KHNrYik7Cit9CisKK2ludCBheDI1X2NoZWNrX2lmcmFtZXNfYWNrZWQoYXgyNV9jYiAqYXgyNSwgdW5zaWduZWQgc2hvcnQgbnIpCit7CisJaWYgKGF4MjUtPnZzID09IG5yKSB7CisJCWF4MjVfZnJhbWVzX2Fja2VkKGF4MjUsIG5yKTsKKwkJYXgyNV9jYWxjdWxhdGVfcnR0KGF4MjUpOworCQlheDI1X3N0b3BfdDF0aW1lcihheDI1KTsKKwkJYXgyNV9zdGFydF90M3RpbWVyKGF4MjUpOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQlpZiAoYXgyNS0+dmEgIT0gbnIpIHsKKwkJCWF4MjVfZnJhbWVzX2Fja2VkKGF4MjUsIG5yKTsKKwkJCWF4MjVfY2FsY3VsYXRlX3QxKGF4MjUpOworCQkJYXgyNV9zdGFydF90MXRpbWVyKGF4MjUpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL25ldC9heDI1L2F4MjVfcm91dGUuYyBiL25ldC9heDI1L2F4MjVfcm91dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGI5OWIxCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2F4MjUvYXgyNV9yb3V0ZS5jCkBAIC0wLDAgKzEsNTM0IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIEFsYW4gQ294IEdXNFBUUyAoYWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrKQorICogQ29weXJpZ2h0IChDKSBKb25hdGhhbiBOYXlsb3IgRzRLTFggKGc0a2x4QGc0a2x4LmRlbW9uLmNvLnVrKQorICogQ29weXJpZ2h0IChDKSBTdGV2ZW4gV2hpdGVob3VzZSBHVzdSUk0gKHN0ZXZld0BhY20ub3JnKQorICogQ29weXJpZ2h0IChDKSBKb2VyZyBSZXV0ZXIgREwxQktFIChqcmV1dGVyQHlhaW5hLmRlKQorICogQ29weXJpZ2h0IChDKSBIYW5zLUpvYWNoaW0gSGV0c2NoZXIgREQ4TkUgKGRkOG5lQGJudi1iYW1iZXJnLmRlKQorICogQ29weXJpZ2h0IChDKSBGcmVkZXJpYyBSaWJsZSBGMU9BVCAoZnJpYmxlQHRlYXNlci5mcikKKyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bmV0L2F4MjUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworc3RhdGljIGF4MjVfcm91dGUgKmF4MjVfcm91dGVfbGlzdDsKK3N0YXRpYyBERUZJTkVfUldMT0NLKGF4MjVfcm91dGVfbG9jayk7CisKK3N0YXRpYyBheDI1X3JvdXRlICpheDI1X2dldF9yb3V0ZShheDI1X2FkZHJlc3MgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CisKK3ZvaWQgYXgyNV9ydF9kZXZpY2VfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWF4MjVfcm91dGUgKnMsICp0LCAqYXgyNV9ydDsKKworCXdyaXRlX2xvY2soJmF4MjVfcm91dGVfbG9jayk7CisJYXgyNV9ydCA9IGF4MjVfcm91dGVfbGlzdDsKKwl3aGlsZSAoYXgyNV9ydCAhPSBOVUxMKSB7CisJCXMgICAgICAgPSBheDI1X3J0OworCQlheDI1X3J0ID0gYXgyNV9ydC0+bmV4dDsKKworCQlpZiAocy0+ZGV2ID09IGRldikgeworCQkJaWYgKGF4MjVfcm91dGVfbGlzdCA9PSBzKSB7CisJCQkJYXgyNV9yb3V0ZV9saXN0ID0gcy0+bmV4dDsKKwkJCQlpZiAocy0+ZGlnaXBlYXQgIT0gTlVMTCkKKwkJCQkJa2ZyZWUocy0+ZGlnaXBlYXQpOworCQkJCWtmcmVlKHMpOworCQkJfSBlbHNlIHsKKwkJCQlmb3IgKHQgPSBheDI1X3JvdXRlX2xpc3Q7IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpIHsKKwkJCQkJaWYgKHQtPm5leHQgPT0gcykgeworCQkJCQkJdC0+bmV4dCA9IHMtPm5leHQ7CisJCQkJCQlpZiAocy0+ZGlnaXBlYXQgIT0gTlVMTCkKKwkJCQkJCQlrZnJlZShzLT5kaWdpcGVhdCk7CisJCQkJCQlrZnJlZShzKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCXdyaXRlX3VubG9jaygmYXgyNV9yb3V0ZV9sb2NrKTsKK30KKworc3RhdGljIGludCBheDI1X3J0X2FkZChzdHJ1Y3QgYXgyNV9yb3V0ZXNfc3RydWN0ICpyb3V0ZSkKK3sKKwlheDI1X3JvdXRlICpheDI1X3J0OworCWF4MjVfZGV2ICpheDI1X2RldjsKKwlpbnQgaTsKKworCWlmICgoYXgyNV9kZXYgPSBheDI1X2FkZHJfYXgyNWRldigmcm91dGUtPnBvcnRfYWRkcikpID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChyb3V0ZS0+ZGlnaV9jb3VudCA+IEFYMjVfTUFYX0RJR0lTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdyaXRlX2xvY2soJmF4MjVfcm91dGVfbG9jayk7CisKKwlheDI1X3J0ID0gYXgyNV9yb3V0ZV9saXN0OworCXdoaWxlIChheDI1X3J0ICE9IE5VTEwpIHsKKwkJaWYgKGF4MjVjbXAoJmF4MjVfcnQtPmNhbGxzaWduLCAmcm91dGUtPmRlc3RfYWRkcikgPT0gMCAmJgorCQkgICAgICAgICAgICBheDI1X3J0LT5kZXYgPT0gYXgyNV9kZXYtPmRldikgeworCQkJaWYgKGF4MjVfcnQtPmRpZ2lwZWF0ICE9IE5VTEwpIHsKKwkJCQlrZnJlZShheDI1X3J0LT5kaWdpcGVhdCk7CisJCQkJYXgyNV9ydC0+ZGlnaXBlYXQgPSBOVUxMOworCQkJfQorCQkJaWYgKHJvdXRlLT5kaWdpX2NvdW50ICE9IDApIHsKKwkJCQlpZiAoKGF4MjVfcnQtPmRpZ2lwZWF0ID0ga21hbGxvYyhzaXplb2YoYXgyNV9kaWdpKSwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwkJCQkJd3JpdGVfdW5sb2NrKCZheDI1X3JvdXRlX2xvY2spOworCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQl9CisJCQkJYXgyNV9ydC0+ZGlnaXBlYXQtPmxhc3RyZXBlYXQgPSAtMTsKKwkJCQlheDI1X3J0LT5kaWdpcGVhdC0+bmRpZ2kgICAgICA9IHJvdXRlLT5kaWdpX2NvdW50OworCQkJCWZvciAoaSA9IDA7IGkgPCByb3V0ZS0+ZGlnaV9jb3VudDsgaSsrKSB7CisJCQkJCWF4MjVfcnQtPmRpZ2lwZWF0LT5yZXBlYXRlZFtpXSA9IDA7CisJCQkJCWF4MjVfcnQtPmRpZ2lwZWF0LT5jYWxsc1tpXSAgICA9IHJvdXRlLT5kaWdpX2FkZHJbaV07CisJCQkJfQorCQkJfQorCQkJd3JpdGVfdW5sb2NrKCZheDI1X3JvdXRlX2xvY2spOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYXgyNV9ydCA9IGF4MjVfcnQtPm5leHQ7CisJfQorCisJaWYgKChheDI1X3J0ID0ga21hbGxvYyhzaXplb2YoYXgyNV9yb3V0ZSksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCXdyaXRlX3VubG9jaygmYXgyNV9yb3V0ZV9sb2NrKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYXRvbWljX3NldCgmYXgyNV9ydC0+cmVmLCAwKTsKKwlheDI1X3J0LT5jYWxsc2lnbiAgICAgPSByb3V0ZS0+ZGVzdF9hZGRyOworCWF4MjVfcnQtPmRldiAgICAgICAgICA9IGF4MjVfZGV2LT5kZXY7CisJYXgyNV9ydC0+ZGlnaXBlYXQgICAgID0gTlVMTDsKKwlheDI1X3J0LT5pcF9tb2RlICAgICAgPSAnICc7CisJaWYgKHJvdXRlLT5kaWdpX2NvdW50ICE9IDApIHsKKwkJaWYgKChheDI1X3J0LT5kaWdpcGVhdCA9IGttYWxsb2Moc2l6ZW9mKGF4MjVfZGlnaSksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCQl3cml0ZV91bmxvY2soJmF4MjVfcm91dGVfbG9jayk7CisJCQlrZnJlZShheDI1X3J0KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWF4MjVfcnQtPmRpZ2lwZWF0LT5sYXN0cmVwZWF0ID0gLTE7CisJCWF4MjVfcnQtPmRpZ2lwZWF0LT5uZGlnaSAgICAgID0gcm91dGUtPmRpZ2lfY291bnQ7CisJCWZvciAoaSA9IDA7IGkgPCByb3V0ZS0+ZGlnaV9jb3VudDsgaSsrKSB7CisJCQlheDI1X3J0LT5kaWdpcGVhdC0+cmVwZWF0ZWRbaV0gPSAwOworCQkJYXgyNV9ydC0+ZGlnaXBlYXQtPmNhbGxzW2ldICAgID0gcm91dGUtPmRpZ2lfYWRkcltpXTsKKwkJfQorCX0KKwlheDI1X3J0LT5uZXh0ICAgPSBheDI1X3JvdXRlX2xpc3Q7CisJYXgyNV9yb3V0ZV9saXN0ID0gYXgyNV9ydDsKKwl3cml0ZV91bmxvY2soJmF4MjVfcm91dGVfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXgyNV9ydF9kZXN0cm95KGF4MjVfcm91dGUgKmF4MjVfcnQpCit7CisJaWYgKGF0b21pY19yZWFkKCZheDI1X3J0LT5yZWYpID09IDApIHsKKwkJaWYgKGF4MjVfcnQtPmRpZ2lwZWF0ICE9IE5VTEwpCisJCQlrZnJlZShheDI1X3J0LT5kaWdpcGVhdCk7CisJCWtmcmVlKGF4MjVfcnQpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBVaC4uLiAgUm91dGUgaXMgc3RpbGwgaW4gdXNlOyB3ZSBjYW4ndCB5ZXQgZGVzdHJveSBpdC4gIFJldHJ5IGxhdGVyLgorCSAqLworCWluaXRfdGltZXIoJmF4MjVfcnQtPnRpbWVyKTsKKwlheDI1X3J0LT50aW1lci5kYXRhCT0gKHVuc2lnbmVkIGxvbmcpIGF4MjVfcnQ7CisJYXgyNV9ydC0+dGltZXIuZnVuY3Rpb24JPSAodm9pZCAqKSBheDI1X3J0X2Rlc3Ryb3k7CisJYXgyNV9ydC0+dGltZXIuZXhwaXJlcwk9IGppZmZpZXMgKyA1ICogSFo7CisKKwlhZGRfdGltZXIoJmF4MjVfcnQtPnRpbWVyKTsKK30KKworc3RhdGljIGludCBheDI1X3J0X2RlbChzdHJ1Y3QgYXgyNV9yb3V0ZXNfc3RydWN0ICpyb3V0ZSkKK3sKKwlheDI1X3JvdXRlICpzLCAqdCwgKmF4MjVfcnQ7CisJYXgyNV9kZXYgKmF4MjVfZGV2OworCisJaWYgKChheDI1X2RldiA9IGF4MjVfYWRkcl9heDI1ZGV2KCZyb3V0ZS0+cG9ydF9hZGRyKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3cml0ZV9sb2NrKCZheDI1X3JvdXRlX2xvY2spOworCisJYXgyNV9ydCA9IGF4MjVfcm91dGVfbGlzdDsKKwl3aGlsZSAoYXgyNV9ydCAhPSBOVUxMKSB7CisJCXMgICAgICAgPSBheDI1X3J0OworCQlheDI1X3J0ID0gYXgyNV9ydC0+bmV4dDsKKwkJaWYgKHMtPmRldiA9PSBheDI1X2Rldi0+ZGV2ICYmCisJCSAgICBheDI1Y21wKCZyb3V0ZS0+ZGVzdF9hZGRyLCAmcy0+Y2FsbHNpZ24pID09IDApIHsKKwkJCWlmIChheDI1X3JvdXRlX2xpc3QgPT0gcykgeworCQkJCWF4MjVfcm91dGVfbGlzdCA9IHMtPm5leHQ7CisJCQkJYXgyNV9ydF9kZXN0cm95KHMpOworCQkJfSBlbHNlIHsKKwkJCQlmb3IgKHQgPSBheDI1X3JvdXRlX2xpc3Q7IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpIHsKKwkJCQkJaWYgKHQtPm5leHQgPT0gcykgeworCQkJCQkJdC0+bmV4dCA9IHMtPm5leHQ7CisJCQkJCQlheDI1X3J0X2Rlc3Ryb3kocyk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwl3cml0ZV91bmxvY2soJmF4MjVfcm91dGVfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBheDI1X3J0X29wdChzdHJ1Y3QgYXgyNV9yb3V0ZV9vcHRfc3RydWN0ICpydF9vcHRpb24pCit7CisJYXgyNV9yb3V0ZSAqYXgyNV9ydDsKKwlheDI1X2RldiAqYXgyNV9kZXY7CisJaW50IGVyciA9IDA7CisKKwlpZiAoKGF4MjVfZGV2ID0gYXgyNV9hZGRyX2F4MjVkZXYoJnJ0X29wdGlvbi0+cG9ydF9hZGRyKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3cml0ZV9sb2NrKCZheDI1X3JvdXRlX2xvY2spOworCisJYXgyNV9ydCA9IGF4MjVfcm91dGVfbGlzdDsKKwl3aGlsZSAoYXgyNV9ydCAhPSBOVUxMKSB7CisJCWlmIChheDI1X3J0LT5kZXYgPT0gYXgyNV9kZXYtPmRldiAmJgorCQkgICAgYXgyNWNtcCgmcnRfb3B0aW9uLT5kZXN0X2FkZHIsICZheDI1X3J0LT5jYWxsc2lnbikgPT0gMCkgeworCQkJc3dpdGNoIChydF9vcHRpb24tPmNtZCkgeworCQkJY2FzZSBBWDI1X1NFVF9SVF9JUE1PREU6CisJCQkJc3dpdGNoIChydF9vcHRpb24tPmFyZykgeworCQkJCWNhc2UgJyAnOgorCQkJCWNhc2UgJ0QnOgorCQkJCWNhc2UgJ1YnOgorCQkJCQlheDI1X3J0LT5pcF9tb2RlID0gcnRfb3B0aW9uLT5hcmc7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlheDI1X3J0ID0gYXgyNV9ydC0+bmV4dDsKKwl9CisKK291dDoKKwl3cml0ZV91bmxvY2soJmF4MjVfcm91dGVfbG9jayk7CisJcmV0dXJuIGVycjsKK30KKworaW50IGF4MjVfcnRfaW9jdGwodW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgYXgyNV9yb3V0ZV9vcHRfc3RydWN0IHJ0X29wdGlvbjsKKwlzdHJ1Y3QgYXgyNV9yb3V0ZXNfc3RydWN0IHJvdXRlOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NBRERSVDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZyb3V0ZSwgYXJnLCBzaXplb2Yocm91dGUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gYXgyNV9ydF9hZGQoJnJvdXRlKTsKKworCWNhc2UgU0lPQ0RFTFJUOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnJvdXRlLCBhcmcsIHNpemVvZihyb3V0ZSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiBheDI1X3J0X2RlbCgmcm91dGUpOworCisJY2FzZSBTSU9DQVgyNU9QVFJUOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnJ0X29wdGlvbiwgYXJnLCBzaXplb2YocnRfb3B0aW9uKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIGF4MjVfcnRfb3B0KCZydF9vcHRpb24pOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworc3RhdGljIHZvaWQgKmF4MjVfcnRfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgYXgyNV9yb3V0ZSAqYXgyNV9ydDsKKwlpbnQgaSA9IDE7CisgCisgCXJlYWRfbG9jaygmYXgyNV9yb3V0ZV9sb2NrKTsKKwlpZiAoKnBvcyA9PSAwKQorCQlyZXR1cm4gU0VRX1NUQVJUX1RPS0VOOworCisJZm9yIChheDI1X3J0ID0gYXgyNV9yb3V0ZV9saXN0OyBheDI1X3J0ICE9IE5VTEw7IGF4MjVfcnQgPSBheDI1X3J0LT5uZXh0KSB7CisJCWlmIChpID09ICpwb3MpCisJCQlyZXR1cm4gYXgyNV9ydDsKKwkJKytpOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCAqYXgyNV9ydF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJKysqcG9zOworCXJldHVybiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pID8gYXgyNV9yb3V0ZV9saXN0IDogCisJCSgoc3RydWN0IGF4MjVfcm91dGUgKikgdiktPm5leHQ7Cit9CisKK3N0YXRpYyB2b2lkIGF4MjVfcnRfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJcmVhZF91bmxvY2soJmF4MjVfcm91dGVfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgYXgyNV9ydF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXNlcV9wdXRzKHNlcSwgImNhbGxzaWduICBkZXYgIG1vZGUgZGlnaXBlYXRlcnNcbiIpOworCWVsc2UgeworCQlzdHJ1Y3QgYXgyNV9yb3V0ZSAqYXgyNV9ydCA9IHY7CisJCWNvbnN0IGNoYXIgKmNhbGxzaWduOworCQlpbnQgaTsKKworCQlpZiAoYXgyNWNtcCgmYXgyNV9ydC0+Y2FsbHNpZ24sICZudWxsX2F4MjVfYWRkcmVzcykgPT0gMCkKKwkJCWNhbGxzaWduID0gImRlZmF1bHQiOworCQllbHNlCisJCQljYWxsc2lnbiA9IGF4MmFzYygmYXgyNV9ydC0+Y2FsbHNpZ24pOworCisJCXNlcV9wcmludGYoc2VxLCAiJS05cyAlLTRzIiwKKwkJCWNhbGxzaWduLAorCQkJYXgyNV9ydC0+ZGV2ID8gYXgyNV9ydC0+ZGV2LT5uYW1lIDogIj8/PyIpOworCisJCXN3aXRjaCAoYXgyNV9ydC0+aXBfbW9kZSkgeworCQljYXNlICdWJzoKKwkJCXNlcV9wdXRzKHNlcSwgIiAgIHZjIik7CisJCQlicmVhazsKKwkJY2FzZSAnRCc6CisJCQlzZXFfcHV0cyhzZXEsICIgICBkZyIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzZXFfcHV0cyhzZXEsICIgICAgKiIpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoYXgyNV9ydC0+ZGlnaXBlYXQgIT0gTlVMTCkKKwkJCWZvciAoaSA9IDA7IGkgPCBheDI1X3J0LT5kaWdpcGVhdC0+bmRpZ2k7IGkrKykKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiAlcyIsIGF4MmFzYygmYXgyNV9ydC0+ZGlnaXBlYXQtPmNhbGxzW2ldKSk7CisKKwkJc2VxX3B1dHMoc2VxLCAiXG4iKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgYXgyNV9ydF9zZXFvcHMgPSB7CisJLnN0YXJ0ID0gYXgyNV9ydF9zZXFfc3RhcnQsCisJLm5leHQgPSBheDI1X3J0X3NlcV9uZXh0LAorCS5zdG9wID0gYXgyNV9ydF9zZXFfc3RvcCwKKwkuc2hvdyA9IGF4MjVfcnRfc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IGF4MjVfcnRfaW5mb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmYXgyNV9ydF9zZXFvcHMpOworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF4MjVfcm91dGVfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IGF4MjVfcnRfaW5mb19vcGVuLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKworI2VuZGlmCisKKy8qCisgKglGaW5kIEFYLjI1IHJvdXRlCisgKgorICoJT25seSByb3V0ZXMgd2l0aCBhIHJlZmVybmNlIHJvdXQgb2YgemVybyBjYW4gYmUgZGVzdHJveWVkLgorICovCitzdGF0aWMgYXgyNV9yb3V0ZSAqYXgyNV9nZXRfcm91dGUoYXgyNV9hZGRyZXNzICphZGRyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWF4MjVfcm91dGUgKmF4MjVfc3BlX3J0ID0gTlVMTDsKKwlheDI1X3JvdXRlICpheDI1X2RlZl9ydCA9IE5VTEw7CisJYXgyNV9yb3V0ZSAqYXgyNV9ydDsKKworCXJlYWRfbG9jaygmYXgyNV9yb3V0ZV9sb2NrKTsKKwkvKgorCSAqCUJpbmQgdG8gdGhlIHBoeXNpY2FsIGludGVyZmFjZSB3ZSBoZWFyZCB0aGVtIG9uLCBvciB0aGUgZGVmYXVsdAorCSAqCXJvdXRlIGlmIG5vbmUgaXMgZm91bmQ7CisJICovCisJZm9yIChheDI1X3J0ID0gYXgyNV9yb3V0ZV9saXN0OyBheDI1X3J0ICE9IE5VTEw7IGF4MjVfcnQgPSBheDI1X3J0LT5uZXh0KSB7CisJCWlmIChkZXYgPT0gTlVMTCkgeworCQkJaWYgKGF4MjVjbXAoJmF4MjVfcnQtPmNhbGxzaWduLCBhZGRyKSA9PSAwICYmIGF4MjVfcnQtPmRldiAhPSBOVUxMKQorCQkJCWF4MjVfc3BlX3J0ID0gYXgyNV9ydDsKKwkJCWlmIChheDI1Y21wKCZheDI1X3J0LT5jYWxsc2lnbiwgJm51bGxfYXgyNV9hZGRyZXNzKSA9PSAwICYmIGF4MjVfcnQtPmRldiAhPSBOVUxMKQorCQkJCWF4MjVfZGVmX3J0ID0gYXgyNV9ydDsKKwkJfSBlbHNlIHsKKwkJCWlmIChheDI1Y21wKCZheDI1X3J0LT5jYWxsc2lnbiwgYWRkcikgPT0gMCAmJiBheDI1X3J0LT5kZXYgPT0gZGV2KQorCQkJCWF4MjVfc3BlX3J0ID0gYXgyNV9ydDsKKwkJCWlmIChheDI1Y21wKCZheDI1X3J0LT5jYWxsc2lnbiwgJm51bGxfYXgyNV9hZGRyZXNzKSA9PSAwICYmIGF4MjVfcnQtPmRldiA9PSBkZXYpCisJCQkJYXgyNV9kZWZfcnQgPSBheDI1X3J0OworCQl9CisJfQorCisJYXgyNV9ydCA9IGF4MjVfZGVmX3J0OworCWlmIChheDI1X3NwZV9ydCAhPSBOVUxMKQorCQlheDI1X3J0ID0gYXgyNV9zcGVfcnQ7CisKKwlpZiAoYXgyNV9ydCAhPSBOVUxMKQorCQlhdG9taWNfaW5jKCZheDI1X3J0LT5yZWYpOworCisJcmVhZF91bmxvY2soJmF4MjVfcm91dGVfbG9jayk7CisKKwlyZXR1cm4gYXgyNV9ydDsKK30KKworLyoKKyAqCUFkanVzdCBwYXRoOiBJZiB5b3Ugc3BlY2lmeSBhIGRlZmF1bHQgcm91dGUgYW5kIHdhbnQgdG8gY29ubmVjdAorICogICAgICBhIHRhcmdldCBvbiB0aGUgZGlnaXBlYXRlciBwYXRoIGJ1dCB3L28gaGF2aW5nIGEgc3BlY2lhbCByb3V0ZQorICoJc2V0IGJlZm9yZSwgdGhlIHBhdGggaGFzIHRvIGJlIHRydW5jYXRlZCBmcm9tIHlvdXIgdGFyZ2V0IG9uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYXgyNV9hZGp1c3RfcGF0aChheDI1X2FkZHJlc3MgKmFkZHIsIGF4MjVfZGlnaSAqZGlnaXBlYXQpCit7CisJaW50IGs7CisKKwlmb3IgKGsgPSAwOyBrIDwgZGlnaXBlYXQtPm5kaWdpOyBrKyspIHsKKwkJaWYgKGF4MjVjbXAoYWRkciwgJmRpZ2lwZWF0LT5jYWxsc1trXSkgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCWRpZ2lwZWF0LT5uZGlnaSA9IGs7Cit9CisKKworLyoKKyAqCUZpbmQgd2hpY2ggaW50ZXJmYWNlIHRvIHVzZS4KKyAqLworaW50IGF4MjVfcnRfYXV0b2JpbmQoYXgyNV9jYiAqYXgyNSwgYXgyNV9hZGRyZXNzICphZGRyKQoreworCWF4MjVfcm91dGUgKmF4MjVfcnQ7CisJYXgyNV9hZGRyZXNzICpjYWxsOworCWludCBlcnI7CisKKwlpZiAoKGF4MjVfcnQgPSBheDI1X2dldF9yb3V0ZShhZGRyLCBOVUxMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSE9TVFVOUkVBQ0g7CisKKwlpZiAoKGF4MjUtPmF4MjVfZGV2ID0gYXgyNV9kZXZfYXgyNWRldihheDI1X3J0LT5kZXYpKSA9PSBOVUxMKSB7CisJCWVyciA9IC1FSE9TVFVOUkVBQ0g7CisJCWdvdG8gcHV0OworCX0KKworCWlmICgoY2FsbCA9IGF4MjVfZmluZGJ5dWlkKGN1cnJlbnQtPmV1aWQpKSA9PSBOVUxMKSB7CisJCWlmIChheDI1X3VpZF9wb2xpY3kgJiYgIWNhcGFibGUoQ0FQX05FVF9CSU5EX1NFUlZJQ0UpKSB7CisJCQllcnIgPSAtRVBFUk07CisJCQlnb3RvIHB1dDsKKwkJfQorCQljYWxsID0gKGF4MjVfYWRkcmVzcyAqKWF4MjUtPmF4MjVfZGV2LT5kZXYtPmRldl9hZGRyOworCX0KKworCWF4MjUtPnNvdXJjZV9hZGRyID0gKmNhbGw7CisKKwlpZiAoYXgyNV9ydC0+ZGlnaXBlYXQgIT0gTlVMTCkgeworCQlpZiAoKGF4MjUtPmRpZ2lwZWF0ID0ga21hbGxvYyhzaXplb2YoYXgyNV9kaWdpKSwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIHB1dDsKKwkJfQorCQltZW1jcHkoYXgyNS0+ZGlnaXBlYXQsIGF4MjVfcnQtPmRpZ2lwZWF0LCBzaXplb2YoYXgyNV9kaWdpKSk7CisJCWF4MjVfYWRqdXN0X3BhdGgoYWRkciwgYXgyNS0+ZGlnaXBlYXQpOworCX0KKworCWlmIChheDI1LT5zayAhPSBOVUxMKSB7CisJCWJoX2xvY2tfc29jayhheDI1LT5zayk7CisJCXNvY2tfcmVzZXRfZmxhZyhheDI1LT5zaywgU09DS19aQVBQRUQpOworCQliaF91bmxvY2tfc29jayhheDI1LT5zayk7CisJfQorCitwdXQ6CisJYXgyNV9wdXRfcm91dGUoYXgyNV9ydCk7CisKKwlyZXR1cm4gMDsKK30KKworYXgyNV9yb3V0ZSAqYXgyNV9ydF9maW5kX3JvdXRlKGF4MjVfcm91dGUgKiByb3V0ZSwgYXgyNV9hZGRyZXNzICphZGRyLAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJYXgyNV9yb3V0ZSAqYXgyNV9ydDsKKworCWlmICgoYXgyNV9ydCA9IGF4MjVfZ2V0X3JvdXRlKGFkZHIsIGRldikpKQorCQlyZXR1cm4gYXgyNV9ydDsKKworCXJvdXRlLT5uZXh0ICAgICA9IE5VTEw7CisJYXRvbWljX3NldCgmcm91dGUtPnJlZiwgMSk7CisJcm91dGUtPmNhbGxzaWduID0gKmFkZHI7CisJcm91dGUtPmRldiAgICAgID0gZGV2OworCXJvdXRlLT5kaWdpcGVhdCA9IE5VTEw7CisJcm91dGUtPmlwX21vZGUgID0gJyAnOworCisJcmV0dXJuIHJvdXRlOworfQorCitzdHJ1Y3Qgc2tfYnVmZiAqYXgyNV9ydF9idWlsZF9wYXRoKHN0cnVjdCBza19idWZmICpza2IsIGF4MjVfYWRkcmVzcyAqc3JjLAorCWF4MjVfYWRkcmVzcyAqZGVzdCwgYXgyNV9kaWdpICpkaWdpKQoreworCXN0cnVjdCBza19idWZmICpza2JuOworCXVuc2lnbmVkIGNoYXIgKmJwOworCWludCBsZW47CisKKwlsZW4gPSBkaWdpLT5uZGlnaSAqIEFYMjVfQUREUl9MRU47CisKKwlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCBsZW4pIHsKKwkJaWYgKChza2JuID0gc2tiX3JlYWxsb2NfaGVhZHJvb20oc2tiLCBsZW4pKSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9DUklUICJBWC4yNTogYXgyNV9kZ19idWlsZF9wYXRoIC0gb3V0IG9mIG1lbW9yeVxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWlmIChza2ItPnNrICE9IE5VTEwpCisJCQlza2Jfc2V0X293bmVyX3coc2tibiwgc2tiLT5zayk7CisKKwkJa2ZyZWVfc2tiKHNrYik7CisKKwkJc2tiID0gc2tibjsKKwl9CisKKwlicCA9IHNrYl9wdXNoKHNrYiwgbGVuKTsKKworCWF4MjVfYWRkcl9idWlsZChicCwgc3JjLCBkZXN0LCBkaWdpLCBBWDI1X0NPTU1BTkQsIEFYMjVfTU9EVUxVUyk7CisKKwlyZXR1cm4gc2tiOworfQorCisvKgorICoJRnJlZSBhbGwgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCByb3V0aW5nIHN0cnVjdHVyZXMuCisgKi8KK3ZvaWQgX19leGl0IGF4MjVfcnRfZnJlZSh2b2lkKQoreworCWF4MjVfcm91dGUgKnMsICpheDI1X3J0ID0gYXgyNV9yb3V0ZV9saXN0OworCisJd3JpdGVfbG9jaygmYXgyNV9yb3V0ZV9sb2NrKTsKKwl3aGlsZSAoYXgyNV9ydCAhPSBOVUxMKSB7CisJCXMgICAgICAgPSBheDI1X3J0OworCQlheDI1X3J0ID0gYXgyNV9ydC0+bmV4dDsKKworCQlpZiAocy0+ZGlnaXBlYXQgIT0gTlVMTCkKKwkJCWtmcmVlKHMtPmRpZ2lwZWF0KTsKKworCQlrZnJlZShzKTsKKwl9CisJd3JpdGVfdW5sb2NrKCZheDI1X3JvdXRlX2xvY2spOworfQpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYXgyNV9zdGRfaW4uYyBiL25ldC9heDI1L2F4MjVfc3RkX2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzMTg3MwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9heDI1L2F4MjVfc3RkX2luLmMKQEAgLTAsMCArMSw0NDkgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgQWxhbiBDb3ggR1c0UFRTIChhbGFuQGx4b3JndWsudWt1dS5vcmcudWspCisgKiBDb3B5cmlnaHQgKEMpIEpvbmF0aGFuIE5heWxvciBHNEtMWCAoZzRrbHhAZzRrbHguZGVtb24uY28udWspCisgKiBDb3B5cmlnaHQgKEMpIEpvZXJnIFJldXRlciBETDFCS0UgKGpyZXV0ZXJAeWFpbmEuZGUpCisgKiBDb3B5cmlnaHQgKEMpIEhhbnMtSm9hY2hpbSBIZXRzY2hlciBERDhORSAoZGQ4bmVAYm52LWJhbWJlcmcuZGUpCisgKgorICogTW9zdCBvZiB0aGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIFNETCBkaWFncmFtcyBwdWJsaXNoZWQgaW4gdGhlIDd0aCBBUlJMCisgKiBDb21wdXRlciBOZXR3b3JraW5nIENvbmZlcmVuY2UgcGFwZXJzLiBUaGUgZGlhZ3JhbXMgaGF2ZSBtaXN0YWtlcyBpbiB0aGVtLAorICogYnV0IGFyZSBtb3N0bHkgY29ycmVjdC4gQmVmb3JlIHlvdSBtb2RpZnkgdGhlIGNvZGUgY291bGQgeW91IHJlYWQgdGhlIFNETAorICogZGlhZ3JhbXMgYXMgdGhlIGNvZGUgaXMgbm90IG9idmlvdXMgYW5kIHByb2JhYmx5IHZlcnkgZWFzeSB0byBicmVhay4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bmV0L2F4MjUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4JCQkvKiBGb3IgaXBfcmN2ICovCisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworLyoKKyAqCVN0YXRlIG1hY2hpbmUgZm9yIHN0YXRlIDEsIEF3YWl0aW5nIENvbm5lY3Rpb24gU3RhdGUuCisgKglUaGUgaGFuZGxpbmcgb2YgdGhlIHRpbWVyKHMpIGlzIGluIGZpbGUgYXgyNV9zdGRfdGltZXIuYy4KKyAqCUhhbmRsaW5nIG9mIHN0YXRlIDAgYW5kIGNvbm5lY3Rpb24gcmVsZWFzZSBpcyBpbiBheDI1LmMuCisgKi8KK3N0YXRpYyBpbnQgYXgyNV9zdGRfc3RhdGUxX21hY2hpbmUoYXgyNV9jYiAqYXgyNSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGZyYW1ldHlwZSwgaW50IHBmLCBpbnQgdHlwZSkKK3sKKwlzd2l0Y2ggKGZyYW1ldHlwZSkgeworCWNhc2UgQVgyNV9TQUJNOgorCQlheDI1LT5tb2R1bHVzID0gQVgyNV9NT0RVTFVTOworCQlheDI1LT53aW5kb3cgID0gYXgyNS0+YXgyNV9kZXYtPnZhbHVlc1tBWDI1X1ZBTFVFU19XSU5ET1ddOworCQlheDI1X3NlbmRfY29udHJvbChheDI1LCBBWDI1X1VBLCBwZiwgQVgyNV9SRVNQT05TRSk7CisJCWJyZWFrOworCisJY2FzZSBBWDI1X1NBQk1FOgorCQlheDI1LT5tb2R1bHVzID0gQVgyNV9FTU9EVUxVUzsKKwkJYXgyNS0+d2luZG93ICA9IGF4MjUtPmF4MjVfZGV2LT52YWx1ZXNbQVgyNV9WQUxVRVNfRVdJTkRPV107CisJCWF4MjVfc2VuZF9jb250cm9sKGF4MjUsIEFYMjVfVUEsIHBmLCBBWDI1X1JFU1BPTlNFKTsKKwkJYnJlYWs7CisKKwljYXNlIEFYMjVfRElTQzoKKwkJYXgyNV9zZW5kX2NvbnRyb2woYXgyNSwgQVgyNV9ETSwgcGYsIEFYMjVfUkVTUE9OU0UpOworCQlicmVhazsKKworCWNhc2UgQVgyNV9VQToKKwkJaWYgKHBmKSB7CisJCQlheDI1X2NhbGN1bGF0ZV9ydHQoYXgyNSk7CisJCQlheDI1X3N0b3BfdDF0aW1lcihheDI1KTsKKwkJCWF4MjVfc3RhcnRfdDN0aW1lcihheDI1KTsKKwkJCWF4MjVfc3RhcnRfaWRsZXRpbWVyKGF4MjUpOworCQkJYXgyNS0+dnMgICAgICA9IDA7CisJCQlheDI1LT52YSAgICAgID0gMDsKKwkJCWF4MjUtPnZyICAgICAgPSAwOworCQkJYXgyNS0+c3RhdGUgICA9IEFYMjVfU1RBVEVfMzsKKwkJCWF4MjUtPm4yY291bnQgPSAwOworCQkJaWYgKGF4MjUtPnNrICE9IE5VTEwpIHsKKwkJCQliaF9sb2NrX3NvY2soYXgyNS0+c2spOworCQkJCWF4MjUtPnNrLT5za19zdGF0ZSA9IFRDUF9FU1RBQkxJU0hFRDsKKwkJCQkvKiBGb3IgV0FJVF9TQUJNIGNvbm5lY3Rpb25zIHdlIHdpbGwgcHJvZHVjZSBhbiBhY2NlcHQgcmVhZHkgc29ja2V0IGhlcmUgKi8KKwkJCQlpZiAoIXNvY2tfZmxhZyhheDI1LT5zaywgU09DS19ERUFEKSkKKwkJCQkJYXgyNS0+c2stPnNrX3N0YXRlX2NoYW5nZShheDI1LT5zayk7CisJCQkJYmhfdW5sb2NrX3NvY2soYXgyNS0+c2spOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBBWDI1X0RNOgorCQlpZiAocGYpIHsKKwkJCWlmIChheDI1LT5tb2R1bHVzID09IEFYMjVfTU9EVUxVUykgeworCQkJCWF4MjVfZGlzY29ubmVjdChheDI1LCBFQ09OTlJFRlVTRUQpOworCQkJfSBlbHNlIHsKKwkJCQlheDI1LT5tb2R1bHVzID0gQVgyNV9NT0RVTFVTOworCQkJCWF4MjUtPndpbmRvdyAgPSBheDI1LT5heDI1X2Rldi0+dmFsdWVzW0FYMjVfVkFMVUVTX1dJTkRPV107CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCVN0YXRlIG1hY2hpbmUgZm9yIHN0YXRlIDIsIEF3YWl0aW5nIFJlbGVhc2UgU3RhdGUuCisgKglUaGUgaGFuZGxpbmcgb2YgdGhlIHRpbWVyKHMpIGlzIGluIGZpbGUgYXgyNV9zdGRfdGltZXIuYworICoJSGFuZGxpbmcgb2Ygc3RhdGUgMCBhbmQgY29ubmVjdGlvbiByZWxlYXNlIGlzIGluIGF4MjUuYy4KKyAqLworc3RhdGljIGludCBheDI1X3N0ZF9zdGF0ZTJfbWFjaGluZShheDI1X2NiICpheDI1LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZnJhbWV0eXBlLCBpbnQgcGYsIGludCB0eXBlKQoreworCXN3aXRjaCAoZnJhbWV0eXBlKSB7CisJY2FzZSBBWDI1X1NBQk06CisJY2FzZSBBWDI1X1NBQk1FOgorCQlheDI1X3NlbmRfY29udHJvbChheDI1LCBBWDI1X0RNLCBwZiwgQVgyNV9SRVNQT05TRSk7CisJCWJyZWFrOworCisJY2FzZSBBWDI1X0RJU0M6CisJCWF4MjVfc2VuZF9jb250cm9sKGF4MjUsIEFYMjVfVUEsIHBmLCBBWDI1X1JFU1BPTlNFKTsKKwkJYXgyNV9kaXNjb25uZWN0KGF4MjUsIDApOworCQlicmVhazsKKworCWNhc2UgQVgyNV9ETToKKwljYXNlIEFYMjVfVUE6CisJCWlmIChwZikKKwkJCWF4MjVfZGlzY29ubmVjdChheDI1LCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIEFYMjVfSToKKwljYXNlIEFYMjVfUkVKOgorCWNhc2UgQVgyNV9STlI6CisJY2FzZSBBWDI1X1JSOgorCQlpZiAocGYpIGF4MjVfc2VuZF9jb250cm9sKGF4MjUsIEFYMjVfRE0sIEFYMjVfUE9MTE9OLCBBWDI1X1JFU1BPTlNFKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCVN0YXRlIG1hY2hpbmUgZm9yIHN0YXRlIDMsIENvbm5lY3RlZCBTdGF0ZS4KKyAqCVRoZSBoYW5kbGluZyBvZiB0aGUgdGltZXIocykgaXMgaW4gZmlsZSBheDI1X3N0ZF90aW1lci5jCisgKglIYW5kbGluZyBvZiBzdGF0ZSAwIGFuZCBjb25uZWN0aW9uIHJlbGVhc2UgaXMgaW4gYXgyNS5jLgorICovCitzdGF0aWMgaW50IGF4MjVfc3RkX3N0YXRlM19tYWNoaW5lKGF4MjVfY2IgKmF4MjUsIHN0cnVjdCBza19idWZmICpza2IsIGludCBmcmFtZXR5cGUsIGludCBucywgaW50IG5yLCBpbnQgcGYsIGludCB0eXBlKQoreworCWludCBxdWV1ZWQgPSAwOworCisJc3dpdGNoIChmcmFtZXR5cGUpIHsKKwljYXNlIEFYMjVfU0FCTToKKwljYXNlIEFYMjVfU0FCTUU6CisJCWlmIChmcmFtZXR5cGUgPT0gQVgyNV9TQUJNKSB7CisJCQlheDI1LT5tb2R1bHVzID0gQVgyNV9NT0RVTFVTOworCQkJYXgyNS0+d2luZG93ICA9IGF4MjUtPmF4MjVfZGV2LT52YWx1ZXNbQVgyNV9WQUxVRVNfV0lORE9XXTsKKwkJfSBlbHNlIHsKKwkJCWF4MjUtPm1vZHVsdXMgPSBBWDI1X0VNT0RVTFVTOworCQkJYXgyNS0+d2luZG93ICA9IGF4MjUtPmF4MjVfZGV2LT52YWx1ZXNbQVgyNV9WQUxVRVNfRVdJTkRPV107CisJCX0KKwkJYXgyNV9zZW5kX2NvbnRyb2woYXgyNSwgQVgyNV9VQSwgcGYsIEFYMjVfUkVTUE9OU0UpOworCQlheDI1X3N0b3BfdDF0aW1lcihheDI1KTsKKwkJYXgyNV9zdG9wX3QydGltZXIoYXgyNSk7CisJCWF4MjVfc3RhcnRfdDN0aW1lcihheDI1KTsKKwkJYXgyNV9zdGFydF9pZGxldGltZXIoYXgyNSk7CisJCWF4MjUtPmNvbmRpdGlvbiA9IDB4MDA7CisJCWF4MjUtPnZzICAgICAgICA9IDA7CisJCWF4MjUtPnZhICAgICAgICA9IDA7CisJCWF4MjUtPnZyICAgICAgICA9IDA7CisJCWF4MjVfcmVxdWV1ZV9mcmFtZXMoYXgyNSk7CisJCWJyZWFrOworCisJY2FzZSBBWDI1X0RJU0M6CisJCWF4MjVfc2VuZF9jb250cm9sKGF4MjUsIEFYMjVfVUEsIHBmLCBBWDI1X1JFU1BPTlNFKTsKKwkJYXgyNV9kaXNjb25uZWN0KGF4MjUsIDApOworCQlicmVhazsKKworCWNhc2UgQVgyNV9ETToKKwkJYXgyNV9kaXNjb25uZWN0KGF4MjUsIEVDT05OUkVTRVQpOworCQlicmVhazsKKworCWNhc2UgQVgyNV9SUjoKKwljYXNlIEFYMjVfUk5SOgorCQlpZiAoZnJhbWV0eXBlID09IEFYMjVfUlIpCisJCQlheDI1LT5jb25kaXRpb24gJj0gfkFYMjVfQ09ORF9QRUVSX1JYX0JVU1k7CisJCWVsc2UKKwkJCWF4MjUtPmNvbmRpdGlvbiB8PSBBWDI1X0NPTkRfUEVFUl9SWF9CVVNZOworCQlpZiAodHlwZSA9PSBBWDI1X0NPTU1BTkQgJiYgcGYpCisJCQlheDI1X3N0ZF9lbnF1aXJ5X3Jlc3BvbnNlKGF4MjUpOworCQlpZiAoYXgyNV92YWxpZGF0ZV9ucihheDI1LCBucikpIHsKKwkJCWF4MjVfY2hlY2tfaWZyYW1lc19hY2tlZChheDI1LCBucik7CisJCX0gZWxzZSB7CisJCQlheDI1X3N0ZF9ucl9lcnJvcl9yZWNvdmVyeShheDI1KTsKKwkJCWF4MjUtPnN0YXRlID0gQVgyNV9TVEFURV8xOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBWDI1X1JFSjoKKwkJYXgyNS0+Y29uZGl0aW9uICY9IH5BWDI1X0NPTkRfUEVFUl9SWF9CVVNZOworCQlpZiAodHlwZSA9PSBBWDI1X0NPTU1BTkQgJiYgcGYpCisJCQlheDI1X3N0ZF9lbnF1aXJ5X3Jlc3BvbnNlKGF4MjUpOworCQlpZiAoYXgyNV92YWxpZGF0ZV9ucihheDI1LCBucikpIHsKKwkJCWF4MjVfZnJhbWVzX2Fja2VkKGF4MjUsIG5yKTsKKwkJCWF4MjVfY2FsY3VsYXRlX3J0dChheDI1KTsKKwkJCWF4MjVfc3RvcF90MXRpbWVyKGF4MjUpOworCQkJYXgyNV9zdGFydF90M3RpbWVyKGF4MjUpOworCQkJYXgyNV9yZXF1ZXVlX2ZyYW1lcyhheDI1KTsKKwkJfSBlbHNlIHsKKwkJCWF4MjVfc3RkX25yX2Vycm9yX3JlY292ZXJ5KGF4MjUpOworCQkJYXgyNS0+c3RhdGUgPSBBWDI1X1NUQVRFXzE7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFYMjVfSToKKwkJaWYgKCFheDI1X3ZhbGlkYXRlX25yKGF4MjUsIG5yKSkgeworCQkJYXgyNV9zdGRfbnJfZXJyb3JfcmVjb3ZlcnkoYXgyNSk7CisJCQlheDI1LT5zdGF0ZSA9IEFYMjVfU1RBVEVfMTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChheDI1LT5jb25kaXRpb24gJiBBWDI1X0NPTkRfUEVFUl9SWF9CVVNZKSB7CisJCQlheDI1X2ZyYW1lc19hY2tlZChheDI1LCBucik7CisJCX0gZWxzZSB7CisJCQlheDI1X2NoZWNrX2lmcmFtZXNfYWNrZWQoYXgyNSwgbnIpOworCQl9CisJCWlmIChheDI1LT5jb25kaXRpb24gJiBBWDI1X0NPTkRfT1dOX1JYX0JVU1kpIHsKKwkJCWlmIChwZikgYXgyNV9zdGRfZW5xdWlyeV9yZXNwb25zZShheDI1KTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChucyA9PSBheDI1LT52cikgeworCQkJYXgyNS0+dnIgPSAoYXgyNS0+dnIgKyAxKSAlIGF4MjUtPm1vZHVsdXM7CisJCQlxdWV1ZWQgPSBheDI1X3J4X2lmcmFtZShheDI1LCBza2IpOworCQkJaWYgKGF4MjUtPmNvbmRpdGlvbiAmIEFYMjVfQ09ORF9PV05fUlhfQlVTWSkKKwkJCQlheDI1LT52ciA9IG5zOwkvKiBheDI1LT52ciAtIDEgKi8KKwkJCWF4MjUtPmNvbmRpdGlvbiAmPSB+QVgyNV9DT05EX1JFSkVDVDsKKwkJCWlmIChwZikgeworCQkJCWF4MjVfc3RkX2VucXVpcnlfcmVzcG9uc2UoYXgyNSk7CisJCQl9IGVsc2UgeworCQkJCWlmICghKGF4MjUtPmNvbmRpdGlvbiAmIEFYMjVfQ09ORF9BQ0tfUEVORElORykpIHsKKwkJCQkJYXgyNS0+Y29uZGl0aW9uIHw9IEFYMjVfQ09ORF9BQ0tfUEVORElORzsKKwkJCQkJYXgyNV9zdGFydF90MnRpbWVyKGF4MjUpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChheDI1LT5jb25kaXRpb24gJiBBWDI1X0NPTkRfUkVKRUNUKSB7CisJCQkJaWYgKHBmKSBheDI1X3N0ZF9lbnF1aXJ5X3Jlc3BvbnNlKGF4MjUpOworCQkJfSBlbHNlIHsKKwkJCQlheDI1LT5jb25kaXRpb24gfD0gQVgyNV9DT05EX1JFSkVDVDsKKwkJCQlheDI1X3NlbmRfY29udHJvbChheDI1LCBBWDI1X1JFSiwgcGYsIEFYMjVfUkVTUE9OU0UpOworCQkJCWF4MjUtPmNvbmRpdGlvbiAmPSB+QVgyNV9DT05EX0FDS19QRU5ESU5HOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBBWDI1X0ZSTVI6CisJY2FzZSBBWDI1X0lMTEVHQUw6CisJCWF4MjVfc3RkX2VzdGFibGlzaF9kYXRhX2xpbmsoYXgyNSk7CisJCWF4MjUtPnN0YXRlID0gQVgyNV9TVEFURV8xOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBxdWV1ZWQ7Cit9CisKKy8qCisgKglTdGF0ZSBtYWNoaW5lIGZvciBzdGF0ZSA0LCBUaW1lciBSZWNvdmVyeSBTdGF0ZS4KKyAqCVRoZSBoYW5kbGluZyBvZiB0aGUgdGltZXIocykgaXMgaW4gZmlsZSBheDI1X3N0ZF90aW1lci5jCisgKglIYW5kbGluZyBvZiBzdGF0ZSAwIGFuZCBjb25uZWN0aW9uIHJlbGVhc2UgaXMgaW4gYXgyNS5jLgorICovCitzdGF0aWMgaW50IGF4MjVfc3RkX3N0YXRlNF9tYWNoaW5lKGF4MjVfY2IgKmF4MjUsIHN0cnVjdCBza19idWZmICpza2IsIGludCBmcmFtZXR5cGUsIGludCBucywgaW50IG5yLCBpbnQgcGYsIGludCB0eXBlKQoreworCWludCBxdWV1ZWQgPSAwOworCisJc3dpdGNoIChmcmFtZXR5cGUpIHsKKwljYXNlIEFYMjVfU0FCTToKKwljYXNlIEFYMjVfU0FCTUU6CisJCWlmIChmcmFtZXR5cGUgPT0gQVgyNV9TQUJNKSB7CisJCQlheDI1LT5tb2R1bHVzID0gQVgyNV9NT0RVTFVTOworCQkJYXgyNS0+d2luZG93ICA9IGF4MjUtPmF4MjVfZGV2LT52YWx1ZXNbQVgyNV9WQUxVRVNfV0lORE9XXTsKKwkJfSBlbHNlIHsKKwkJCWF4MjUtPm1vZHVsdXMgPSBBWDI1X0VNT0RVTFVTOworCQkJYXgyNS0+d2luZG93ICA9IGF4MjUtPmF4MjVfZGV2LT52YWx1ZXNbQVgyNV9WQUxVRVNfRVdJTkRPV107CisJCX0KKwkJYXgyNV9zZW5kX2NvbnRyb2woYXgyNSwgQVgyNV9VQSwgcGYsIEFYMjVfUkVTUE9OU0UpOworCQlheDI1X3N0b3BfdDF0aW1lcihheDI1KTsKKwkJYXgyNV9zdG9wX3QydGltZXIoYXgyNSk7CisJCWF4MjVfc3RhcnRfdDN0aW1lcihheDI1KTsKKwkJYXgyNV9zdGFydF9pZGxldGltZXIoYXgyNSk7CisJCWF4MjUtPmNvbmRpdGlvbiA9IDB4MDA7CisJCWF4MjUtPnZzICAgICAgICA9IDA7CisJCWF4MjUtPnZhICAgICAgICA9IDA7CisJCWF4MjUtPnZyICAgICAgICA9IDA7CisJCWF4MjUtPnN0YXRlICAgICA9IEFYMjVfU1RBVEVfMzsKKwkJYXgyNS0+bjJjb3VudCAgID0gMDsKKwkJYXgyNV9yZXF1ZXVlX2ZyYW1lcyhheDI1KTsKKwkJYnJlYWs7CisKKwljYXNlIEFYMjVfRElTQzoKKwkJYXgyNV9zZW5kX2NvbnRyb2woYXgyNSwgQVgyNV9VQSwgcGYsIEFYMjVfUkVTUE9OU0UpOworCQlheDI1X2Rpc2Nvbm5lY3QoYXgyNSwgMCk7CisJCWJyZWFrOworCisJY2FzZSBBWDI1X0RNOgorCQlheDI1X2Rpc2Nvbm5lY3QoYXgyNSwgRUNPTk5SRVNFVCk7CisJCWJyZWFrOworCisJY2FzZSBBWDI1X1JSOgorCWNhc2UgQVgyNV9STlI6CisJCWlmIChmcmFtZXR5cGUgPT0gQVgyNV9SUikKKwkJCWF4MjUtPmNvbmRpdGlvbiAmPSB+QVgyNV9DT05EX1BFRVJfUlhfQlVTWTsKKwkJZWxzZQorCQkJYXgyNS0+Y29uZGl0aW9uIHw9IEFYMjVfQ09ORF9QRUVSX1JYX0JVU1k7CisJCWlmICh0eXBlID09IEFYMjVfUkVTUE9OU0UgJiYgcGYpIHsKKwkJCWF4MjVfc3RvcF90MXRpbWVyKGF4MjUpOworCQkJYXgyNS0+bjJjb3VudCA9IDA7CisJCQlpZiAoYXgyNV92YWxpZGF0ZV9ucihheDI1LCBucikpIHsKKwkJCQlheDI1X2ZyYW1lc19hY2tlZChheDI1LCBucik7CisJCQkJaWYgKGF4MjUtPnZzID09IGF4MjUtPnZhKSB7CisJCQkJCWF4MjVfc3RhcnRfdDN0aW1lcihheDI1KTsKKwkJCQkJYXgyNS0+c3RhdGUgICA9IEFYMjVfU1RBVEVfMzsKKwkJCQl9IGVsc2UgeworCQkJCQlheDI1X3JlcXVldWVfZnJhbWVzKGF4MjUpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJYXgyNV9zdGRfbnJfZXJyb3JfcmVjb3ZlcnkoYXgyNSk7CisJCQkJYXgyNS0+c3RhdGUgPSBBWDI1X1NUQVRFXzE7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlpZiAodHlwZSA9PSBBWDI1X0NPTU1BTkQgJiYgcGYpCisJCQlheDI1X3N0ZF9lbnF1aXJ5X3Jlc3BvbnNlKGF4MjUpOworCQlpZiAoYXgyNV92YWxpZGF0ZV9ucihheDI1LCBucikpIHsKKwkJCWF4MjVfZnJhbWVzX2Fja2VkKGF4MjUsIG5yKTsKKwkJfSBlbHNlIHsKKwkJCWF4MjVfc3RkX25yX2Vycm9yX3JlY292ZXJ5KGF4MjUpOworCQkJYXgyNS0+c3RhdGUgPSBBWDI1X1NUQVRFXzE7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFYMjVfUkVKOgorCQlheDI1LT5jb25kaXRpb24gJj0gfkFYMjVfQ09ORF9QRUVSX1JYX0JVU1k7CisJCWlmIChwZiAmJiB0eXBlID09IEFYMjVfUkVTUE9OU0UpIHsKKwkJCWF4MjVfc3RvcF90MXRpbWVyKGF4MjUpOworCQkJYXgyNS0+bjJjb3VudCA9IDA7CisJCQlpZiAoYXgyNV92YWxpZGF0ZV9ucihheDI1LCBucikpIHsKKwkJCQlheDI1X2ZyYW1lc19hY2tlZChheDI1LCBucik7CisJCQkJaWYgKGF4MjUtPnZzID09IGF4MjUtPnZhKSB7CisJCQkJCWF4MjVfc3RhcnRfdDN0aW1lcihheDI1KTsKKwkJCQkJYXgyNS0+c3RhdGUgICA9IEFYMjVfU1RBVEVfMzsKKwkJCQl9IGVsc2UgeworCQkJCQlheDI1X3JlcXVldWVfZnJhbWVzKGF4MjUpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJYXgyNV9zdGRfbnJfZXJyb3JfcmVjb3ZlcnkoYXgyNSk7CisJCQkJYXgyNS0+c3RhdGUgPSBBWDI1X1NUQVRFXzE7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlpZiAodHlwZSA9PSBBWDI1X0NPTU1BTkQgJiYgcGYpCisJCQlheDI1X3N0ZF9lbnF1aXJ5X3Jlc3BvbnNlKGF4MjUpOworCQlpZiAoYXgyNV92YWxpZGF0ZV9ucihheDI1LCBucikpIHsKKwkJCWF4MjVfZnJhbWVzX2Fja2VkKGF4MjUsIG5yKTsKKwkJCWF4MjVfcmVxdWV1ZV9mcmFtZXMoYXgyNSk7CisJCX0gZWxzZSB7CisJCQlheDI1X3N0ZF9ucl9lcnJvcl9yZWNvdmVyeShheDI1KTsKKwkJCWF4MjUtPnN0YXRlID0gQVgyNV9TVEFURV8xOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBWDI1X0k6CisJCWlmICghYXgyNV92YWxpZGF0ZV9ucihheDI1LCBucikpIHsKKwkJCWF4MjVfc3RkX25yX2Vycm9yX3JlY292ZXJ5KGF4MjUpOworCQkJYXgyNS0+c3RhdGUgPSBBWDI1X1NUQVRFXzE7CisJCQlicmVhazsKKwkJfQorCQlheDI1X2ZyYW1lc19hY2tlZChheDI1LCBucik7CisJCWlmIChheDI1LT5jb25kaXRpb24gJiBBWDI1X0NPTkRfT1dOX1JYX0JVU1kpIHsKKwkJCWlmIChwZikKKwkJCQlheDI1X3N0ZF9lbnF1aXJ5X3Jlc3BvbnNlKGF4MjUpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKG5zID09IGF4MjUtPnZyKSB7CisJCQlheDI1LT52ciA9IChheDI1LT52ciArIDEpICUgYXgyNS0+bW9kdWx1czsKKwkJCXF1ZXVlZCA9IGF4MjVfcnhfaWZyYW1lKGF4MjUsIHNrYik7CisJCQlpZiAoYXgyNS0+Y29uZGl0aW9uICYgQVgyNV9DT05EX09XTl9SWF9CVVNZKQorCQkJCWF4MjUtPnZyID0gbnM7CS8qIGF4MjUtPnZyIC0gMSAqLworCQkJYXgyNS0+Y29uZGl0aW9uICY9IH5BWDI1X0NPTkRfUkVKRUNUOworCQkJaWYgKHBmKSB7CisJCQkJYXgyNV9zdGRfZW5xdWlyeV9yZXNwb25zZShheDI1KTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCEoYXgyNS0+Y29uZGl0aW9uICYgQVgyNV9DT05EX0FDS19QRU5ESU5HKSkgeworCQkJCQlheDI1LT5jb25kaXRpb24gfD0gQVgyNV9DT05EX0FDS19QRU5ESU5HOworCQkJCQlheDI1X3N0YXJ0X3QydGltZXIoYXgyNSk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGF4MjUtPmNvbmRpdGlvbiAmIEFYMjVfQ09ORF9SRUpFQ1QpIHsKKwkJCQlpZiAocGYpIGF4MjVfc3RkX2VucXVpcnlfcmVzcG9uc2UoYXgyNSk7CisJCQl9IGVsc2UgeworCQkJCWF4MjUtPmNvbmRpdGlvbiB8PSBBWDI1X0NPTkRfUkVKRUNUOworCQkJCWF4MjVfc2VuZF9jb250cm9sKGF4MjUsIEFYMjVfUkVKLCBwZiwgQVgyNV9SRVNQT05TRSk7CisJCQkJYXgyNS0+Y29uZGl0aW9uICY9IH5BWDI1X0NPTkRfQUNLX1BFTkRJTkc7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFYMjVfRlJNUjoKKwljYXNlIEFYMjVfSUxMRUdBTDoKKwkJYXgyNV9zdGRfZXN0YWJsaXNoX2RhdGFfbGluayhheDI1KTsKKwkJYXgyNS0+c3RhdGUgPSBBWDI1X1NUQVRFXzE7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHF1ZXVlZDsKK30KKworLyoKKyAqCUhpZ2hlciBsZXZlbCB1cGNhbGwgZm9yIGEgTEFQQiBmcmFtZQorICovCitpbnQgYXgyNV9zdGRfZnJhbWVfaW4oYXgyNV9jYiAqYXgyNSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHR5cGUpCit7CisJaW50IHF1ZXVlZCA9IDAsIGZyYW1ldHlwZSwgbnMsIG5yLCBwZjsKKworCWZyYW1ldHlwZSA9IGF4MjVfZGVjb2RlKGF4MjUsIHNrYiwgJm5zLCAmbnIsICZwZik7CisKKwlzd2l0Y2ggKGF4MjUtPnN0YXRlKSB7CisJY2FzZSBBWDI1X1NUQVRFXzE6CisJCXF1ZXVlZCA9IGF4MjVfc3RkX3N0YXRlMV9tYWNoaW5lKGF4MjUsIHNrYiwgZnJhbWV0eXBlLCBwZiwgdHlwZSk7CisJCWJyZWFrOworCWNhc2UgQVgyNV9TVEFURV8yOgorCQlxdWV1ZWQgPSBheDI1X3N0ZF9zdGF0ZTJfbWFjaGluZShheDI1LCBza2IsIGZyYW1ldHlwZSwgcGYsIHR5cGUpOworCQlicmVhazsKKwljYXNlIEFYMjVfU1RBVEVfMzoKKwkJcXVldWVkID0gYXgyNV9zdGRfc3RhdGUzX21hY2hpbmUoYXgyNSwgc2tiLCBmcmFtZXR5cGUsIG5zLCBuciwgcGYsIHR5cGUpOworCQlicmVhazsKKwljYXNlIEFYMjVfU1RBVEVfNDoKKwkJcXVldWVkID0gYXgyNV9zdGRfc3RhdGU0X21hY2hpbmUoYXgyNSwgc2tiLCBmcmFtZXR5cGUsIG5zLCBuciwgcGYsIHR5cGUpOworCQlicmVhazsKKwl9CisKKwlheDI1X2tpY2soYXgyNSk7CisKKwlyZXR1cm4gcXVldWVkOworfQpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYXgyNV9zdGRfc3Vici5jIGIvbmV0L2F4MjUvYXgyNV9zdGRfc3Vici5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiM2M4MDEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYXgyNS9heDI1X3N0ZF9zdWJyLmMKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQ29weXJpZ2h0IChDKSBKb25hdGhhbiBOYXlsb3IgRzRLTFggKGc0a2x4QGc0a2x4LmRlbW9uLmNvLnVrKQorICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxuZXQvYXgyNS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYXJlIHRha2VuIGZyb20gcGFnZSAxNzAgb2YgdGhlIDd0aCBBUlJMIENvbXB1dGVyCisgKiBOZXR3b3JraW5nIENvbmZlcmVuY2UgcGFwZXIsIGFzIGlzIHRoZSB3aG9sZSBzdGF0ZSBtYWNoaW5lLgorICovCisKK3ZvaWQgYXgyNV9zdGRfbnJfZXJyb3JfcmVjb3ZlcnkoYXgyNV9jYiAqYXgyNSkKK3sKKwlheDI1X3N0ZF9lc3RhYmxpc2hfZGF0YV9saW5rKGF4MjUpOworfQorCit2b2lkIGF4MjVfc3RkX2VzdGFibGlzaF9kYXRhX2xpbmsoYXgyNV9jYiAqYXgyNSkKK3sKKwlheDI1LT5jb25kaXRpb24gPSAweDAwOworCWF4MjUtPm4yY291bnQgICA9IDA7CisKKwlpZiAoYXgyNS0+bW9kdWx1cyA9PSBBWDI1X01PRFVMVVMpCisJCWF4MjVfc2VuZF9jb250cm9sKGF4MjUsIEFYMjVfU0FCTSwgQVgyNV9QT0xMT04sIEFYMjVfQ09NTUFORCk7CisJZWxzZQorCQlheDI1X3NlbmRfY29udHJvbChheDI1LCBBWDI1X1NBQk1FLCBBWDI1X1BPTExPTiwgQVgyNV9DT01NQU5EKTsKKworCWF4MjVfY2FsY3VsYXRlX3QxKGF4MjUpOworCWF4MjVfc3RvcF9pZGxldGltZXIoYXgyNSk7CisJYXgyNV9zdG9wX3QzdGltZXIoYXgyNSk7CisJYXgyNV9zdG9wX3QydGltZXIoYXgyNSk7CisJYXgyNV9zdGFydF90MXRpbWVyKGF4MjUpOworfQorCit2b2lkIGF4MjVfc3RkX3RyYW5zbWl0X2VucXVpcnkoYXgyNV9jYiAqYXgyNSkKK3sKKwlpZiAoYXgyNS0+Y29uZGl0aW9uICYgQVgyNV9DT05EX09XTl9SWF9CVVNZKQorCQlheDI1X3NlbmRfY29udHJvbChheDI1LCBBWDI1X1JOUiwgQVgyNV9QT0xMT04sIEFYMjVfQ09NTUFORCk7CisJZWxzZQorCQlheDI1X3NlbmRfY29udHJvbChheDI1LCBBWDI1X1JSLCBBWDI1X1BPTExPTiwgQVgyNV9DT01NQU5EKTsKKworCWF4MjUtPmNvbmRpdGlvbiAmPSB+QVgyNV9DT05EX0FDS19QRU5ESU5HOworCisJYXgyNV9jYWxjdWxhdGVfdDEoYXgyNSk7CisJYXgyNV9zdGFydF90MXRpbWVyKGF4MjUpOworfQorCit2b2lkIGF4MjVfc3RkX2VucXVpcnlfcmVzcG9uc2UoYXgyNV9jYiAqYXgyNSkKK3sKKwlpZiAoYXgyNS0+Y29uZGl0aW9uICYgQVgyNV9DT05EX09XTl9SWF9CVVNZKQorCQlheDI1X3NlbmRfY29udHJvbChheDI1LCBBWDI1X1JOUiwgQVgyNV9QT0xMT04sIEFYMjVfUkVTUE9OU0UpOworCWVsc2UKKwkJYXgyNV9zZW5kX2NvbnRyb2woYXgyNSwgQVgyNV9SUiwgQVgyNV9QT0xMT04sIEFYMjVfUkVTUE9OU0UpOworCisJYXgyNS0+Y29uZGl0aW9uICY9IH5BWDI1X0NPTkRfQUNLX1BFTkRJTkc7Cit9CisKK3ZvaWQgYXgyNV9zdGRfdGltZW91dF9yZXNwb25zZShheDI1X2NiICpheDI1KQoreworCWlmIChheDI1LT5jb25kaXRpb24gJiBBWDI1X0NPTkRfT1dOX1JYX0JVU1kpCisJCWF4MjVfc2VuZF9jb250cm9sKGF4MjUsIEFYMjVfUk5SLCBBWDI1X1BPTExPRkYsIEFYMjVfUkVTUE9OU0UpOworCWVsc2UKKwkJYXgyNV9zZW5kX2NvbnRyb2woYXgyNSwgQVgyNV9SUiwgQVgyNV9QT0xMT0ZGLCBBWDI1X1JFU1BPTlNFKTsKKworCWF4MjUtPmNvbmRpdGlvbiAmPSB+QVgyNV9DT05EX0FDS19QRU5ESU5HOworfQpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYXgyNV9zdGRfdGltZXIuYyBiL25ldC9heDI1L2F4MjVfc3RkX3RpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY2ODk3YgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9heDI1L2F4MjVfc3RkX3RpbWVyLmMKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgQWxhbiBDb3ggR1c0UFRTIChhbGFuQGx4b3JndWsudWt1dS5vcmcudWspCisgKiBDb3B5cmlnaHQgKEMpIEpvbmF0aGFuIE5heWxvciBHNEtMWCAoZzRrbHhAZzRrbHguZGVtb24uY28udWspCisgKiBDb3B5cmlnaHQgKEMpIEpvZXJnIFJldXRlciBETDFCS0UgKGpyZXV0ZXJAeWFpbmEuZGUpCisgKiBDb3B5cmlnaHQgKEMpIEZyZWRlcmljIFJpYmxlIEYxT0FUIChmcmlibGVAdGVhc2VyLmZyKQorICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxuZXQvYXgyNS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKK3ZvaWQgYXgyNV9zdGRfaGVhcnRiZWF0X2V4cGlyeShheDI1X2NiICpheDI1KQoreworCXN0cnVjdCBzb2NrICpzaz1heDI1LT5zazsKKwkKKwlpZiAoc2spCisJCWJoX2xvY2tfc29jayhzayk7CisKKwlzd2l0Y2ggKGF4MjUtPnN0YXRlKSB7CisJY2FzZSBBWDI1X1NUQVRFXzA6CisJCS8qIE1hZ2ljIGhlcmU6IElmIHdlIGxpc3RlbigpIGFuZCBhIG5ldyBsaW5rIGRpZXMgYmVmb3JlIGl0CisJCSAgIGlzIGFjY2VwdGVkKCkgaXQgaXNuJ3QgJ2RlYWQnIHNvIGRvZXNuJ3QgZ2V0IHJlbW92ZWQuICovCisJCWlmICghc2sgfHwgc29ja19mbGFnKHNrLCBTT0NLX0RFU1RST1kpIHx8CisJCSAgICAoc2stPnNrX3N0YXRlID09IFRDUF9MSVNURU4gJiYKKwkJICAgICBzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpKSB7CisJCQlpZiAoc2spIHsKKwkJCQlzb2NrX2hvbGQoc2spOworCQkJCWF4MjVfZGVzdHJveV9zb2NrZXQoYXgyNSk7CisJCQkJYmhfdW5sb2NrX3NvY2soc2spOworCQkJCXNvY2tfcHV0KHNrKTsKKwkJCX0gZWxzZQorCQkJCWF4MjVfZGVzdHJveV9zb2NrZXQoYXgyNSk7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFYMjVfU1RBVEVfMzoKKwljYXNlIEFYMjVfU1RBVEVfNDoKKwkJLyoKKwkJICogQ2hlY2sgdGhlIHN0YXRlIG9mIHRoZSByZWNlaXZlIGJ1ZmZlci4KKwkJICovCisJCWlmIChzayAhPSBOVUxMKSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSA8CisJCQkgICAgKHNrLT5za19yY3ZidWYgLyAyKSAmJgorCQkJICAgIChheDI1LT5jb25kaXRpb24gJiBBWDI1X0NPTkRfT1dOX1JYX0JVU1kpKSB7CisJCQkJYXgyNS0+Y29uZGl0aW9uICY9IH5BWDI1X0NPTkRfT1dOX1JYX0JVU1k7CisJCQkJYXgyNS0+Y29uZGl0aW9uICY9IH5BWDI1X0NPTkRfQUNLX1BFTkRJTkc7CisJCQkJYXgyNV9zZW5kX2NvbnRyb2woYXgyNSwgQVgyNV9SUiwgQVgyNV9QT0xMT0ZGLCBBWDI1X1JFU1BPTlNFKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmIChzaykKKwkJYmhfdW5sb2NrX3NvY2soc2spOworCisJYXgyNV9zdGFydF9oZWFydGJlYXQoYXgyNSk7Cit9CisKK3ZvaWQgYXgyNV9zdGRfdDJ0aW1lcl9leHBpcnkoYXgyNV9jYiAqYXgyNSkKK3sKKwlpZiAoYXgyNS0+Y29uZGl0aW9uICYgQVgyNV9DT05EX0FDS19QRU5ESU5HKSB7CisJCWF4MjUtPmNvbmRpdGlvbiAmPSB+QVgyNV9DT05EX0FDS19QRU5ESU5HOworCQlheDI1X3N0ZF90aW1lb3V0X3Jlc3BvbnNlKGF4MjUpOworCX0KK30KKwordm9pZCBheDI1X3N0ZF90M3RpbWVyX2V4cGlyeShheDI1X2NiICpheDI1KQoreworCWF4MjUtPm4yY291bnQgPSAwOworCWF4MjVfc3RkX3RyYW5zbWl0X2VucXVpcnkoYXgyNSk7CisJYXgyNS0+c3RhdGUgICA9IEFYMjVfU1RBVEVfNDsKK30KKwordm9pZCBheDI1X3N0ZF9pZGxldGltZXJfZXhwaXJ5KGF4MjVfY2IgKmF4MjUpCit7CisJYXgyNV9jbGVhcl9xdWV1ZXMoYXgyNSk7CisKKwlheDI1LT5uMmNvdW50ID0gMDsKKwlheDI1X3NlbmRfY29udHJvbChheDI1LCBBWDI1X0RJU0MsIEFYMjVfUE9MTE9OLCBBWDI1X0NPTU1BTkQpOworCWF4MjUtPnN0YXRlICAgPSBBWDI1X1NUQVRFXzI7CisKKwlheDI1X2NhbGN1bGF0ZV90MShheDI1KTsKKwlheDI1X3N0YXJ0X3QxdGltZXIoYXgyNSk7CisJYXgyNV9zdG9wX3QydGltZXIoYXgyNSk7CisJYXgyNV9zdG9wX3QzdGltZXIoYXgyNSk7CisKKwlpZiAoYXgyNS0+c2sgIT0gTlVMTCkgeworCQliaF9sb2NrX3NvY2soYXgyNS0+c2spOworCQlheDI1LT5zay0+c2tfc3RhdGUgICAgID0gVENQX0NMT1NFOworCQlheDI1LT5zay0+c2tfZXJyICAgICAgID0gMDsKKwkJYXgyNS0+c2stPnNrX3NodXRkb3duIHw9IFNFTkRfU0hVVERPV047CisJCWlmICghc29ja19mbGFnKGF4MjUtPnNrLCBTT0NLX0RFQUQpKSB7CisJCQlheDI1LT5zay0+c2tfc3RhdGVfY2hhbmdlKGF4MjUtPnNrKTsKKwkJCXNvY2tfc2V0X2ZsYWcoYXgyNS0+c2ssIFNPQ0tfREVBRCk7CisJCX0KKwkJYmhfdW5sb2NrX3NvY2soYXgyNS0+c2spOworCX0KK30KKwordm9pZCBheDI1X3N0ZF90MXRpbWVyX2V4cGlyeShheDI1X2NiICpheDI1KQoreworCXN3aXRjaCAoYXgyNS0+c3RhdGUpIHsKKwljYXNlIEFYMjVfU1RBVEVfMToKKwkJaWYgKGF4MjUtPm4yY291bnQgPT0gYXgyNS0+bjIpIHsKKwkJCWlmIChheDI1LT5tb2R1bHVzID09IEFYMjVfTU9EVUxVUykgeworCQkJCWF4MjVfZGlzY29ubmVjdChheDI1LCBFVElNRURPVVQpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSB7CisJCQkJYXgyNS0+bW9kdWx1cyA9IEFYMjVfTU9EVUxVUzsKKwkJCQlheDI1LT53aW5kb3cgID0gYXgyNS0+YXgyNV9kZXYtPnZhbHVlc1tBWDI1X1ZBTFVFU19XSU5ET1ddOworCQkJCWF4MjUtPm4yY291bnQgPSAwOworCQkJCWF4MjVfc2VuZF9jb250cm9sKGF4MjUsIEFYMjVfU0FCTSwgQVgyNV9QT0xMT04sIEFYMjVfQ09NTUFORCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlheDI1LT5uMmNvdW50Kys7CisJCQlpZiAoYXgyNS0+bW9kdWx1cyA9PSBBWDI1X01PRFVMVVMpCisJCQkJYXgyNV9zZW5kX2NvbnRyb2woYXgyNSwgQVgyNV9TQUJNLCBBWDI1X1BPTExPTiwgQVgyNV9DT01NQU5EKTsKKwkJCWVsc2UKKwkJCQlheDI1X3NlbmRfY29udHJvbChheDI1LCBBWDI1X1NBQk1FLCBBWDI1X1BPTExPTiwgQVgyNV9DT01NQU5EKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQVgyNV9TVEFURV8yOgorCQlpZiAoYXgyNS0+bjJjb3VudCA9PSBheDI1LT5uMikgeworCQkJYXgyNV9zZW5kX2NvbnRyb2woYXgyNSwgQVgyNV9ESVNDLCBBWDI1X1BPTExPTiwgQVgyNV9DT01NQU5EKTsKKwkJCWF4MjVfZGlzY29ubmVjdChheDI1LCBFVElNRURPVVQpOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJYXgyNS0+bjJjb3VudCsrOworCQkJYXgyNV9zZW5kX2NvbnRyb2woYXgyNSwgQVgyNV9ESVNDLCBBWDI1X1BPTExPTiwgQVgyNV9DT01NQU5EKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQVgyNV9TVEFURV8zOgorCQlheDI1LT5uMmNvdW50ID0gMTsKKwkJYXgyNV9zdGRfdHJhbnNtaXRfZW5xdWlyeShheDI1KTsKKwkJYXgyNS0+c3RhdGUgICA9IEFYMjVfU1RBVEVfNDsKKwkJYnJlYWs7CisKKwljYXNlIEFYMjVfU1RBVEVfNDoKKwkJaWYgKGF4MjUtPm4yY291bnQgPT0gYXgyNS0+bjIpIHsKKwkJCWF4MjVfc2VuZF9jb250cm9sKGF4MjUsIEFYMjVfRE0sIEFYMjVfUE9MTE9OLCBBWDI1X1JFU1BPTlNFKTsKKwkJCWF4MjVfZGlzY29ubmVjdChheDI1LCBFVElNRURPVVQpOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJYXgyNS0+bjJjb3VudCsrOworCQkJYXgyNV9zdGRfdHJhbnNtaXRfZW5xdWlyeShheDI1KTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlheDI1X2NhbGN1bGF0ZV90MShheDI1KTsKKwlheDI1X3N0YXJ0X3QxdGltZXIoYXgyNSk7Cit9CmRpZmYgLS1naXQgYS9uZXQvYXgyNS9heDI1X3N1YnIuYyBiL25ldC9heDI1L2F4MjVfc3Vici5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZjcyNzAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYXgyNS9heDI1X3N1YnIuYwpAQCAtMCwwICsxLDI5NSBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQ29weXJpZ2h0IChDKSBBbGFuIENveCBHVzRQVFMgKGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51aykKKyAqIENvcHlyaWdodCAoQykgSm9uYXRoYW4gTmF5bG9yIEc0S0xYIChnNGtseEBnNGtseC5kZW1vbi5jby51aykKKyAqIENvcHlyaWdodCAoQykgSm9lcmcgUmV1dGVyIERMMUJLRSAoanJldXRlckB5YWluYS5kZSkKKyAqIENvcHlyaWdodCAoQykgRnJlZGVyaWMgUmlibGUgRjFPQVQgKGZyaWJsZUB0ZWFzZXIuZnIpCisgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPG5ldC9heDI1Lmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworLyoKKyAqCVRoaXMgcm91dGluZSBwdXJnZXMgYWxsIHRoZSBxdWV1ZXMgb2YgZnJhbWVzLgorICovCit2b2lkIGF4MjVfY2xlYXJfcXVldWVzKGF4MjVfY2IgKmF4MjUpCit7CisJc2tiX3F1ZXVlX3B1cmdlKCZheDI1LT53cml0ZV9xdWV1ZSk7CisJc2tiX3F1ZXVlX3B1cmdlKCZheDI1LT5hY2tfcXVldWUpOworCXNrYl9xdWV1ZV9wdXJnZSgmYXgyNS0+cmVzZXFfcXVldWUpOworCXNrYl9xdWV1ZV9wdXJnZSgmYXgyNS0+ZnJhZ19xdWV1ZSk7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgcHVyZ2VzIHRoZSBpbnB1dCBxdWV1ZSBvZiB0aG9zZSBmcmFtZXMgdGhhdCBoYXZlIGJlZW4KKyAqIGFja25vd2xlZGdlZC4gVGhpcyByZXBsYWNlcyB0aGUgYm94ZXMgbGFiZWxsZWQgIlYoYSkgPC0gTihyKSIgb24gdGhlCisgKiBTREwgZGlhZ3JhbS4KKyAqLwordm9pZCBheDI1X2ZyYW1lc19hY2tlZChheDI1X2NiICpheDI1LCB1bnNpZ25lZCBzaG9ydCBucikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJLyoKKwkgKiBSZW1vdmUgYWxsIHRoZSBhY2stZWQgZnJhbWVzIGZyb20gdGhlIGFjayBxdWV1ZS4KKwkgKi8KKwlpZiAoYXgyNS0+dmEgIT0gbnIpIHsKKwkJd2hpbGUgKHNrYl9wZWVrKCZheDI1LT5hY2tfcXVldWUpICE9IE5VTEwgJiYgYXgyNS0+dmEgIT0gbnIpIHsKKwkJICAgICAgICBza2IgPSBza2JfZGVxdWV1ZSgmYXgyNS0+YWNrX3F1ZXVlKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJYXgyNS0+dmEgPSAoYXgyNS0+dmEgKyAxKSAlIGF4MjUtPm1vZHVsdXM7CisJCX0KKwl9Cit9CisKK3ZvaWQgYXgyNV9yZXF1ZXVlX2ZyYW1lcyhheDI1X2NiICpheDI1KQoreworICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqc2tiX3ByZXYgPSBOVUxMOworCisJLyoKKwkgKiBSZXF1ZXVlIGFsbCB0aGUgdW4tYWNrLWVkIGZyYW1lcyBvbiB0aGUgb3V0cHV0IHF1ZXVlIHRvIGJlIHBpY2tlZAorCSAqIHVwIGJ5IGF4MjVfa2ljayBjYWxsZWQgZnJvbSB0aGUgdGltZXIuIFRoaXMgYXJyYW5nZW1lbnQgaGFuZGxlcyB0aGUKKwkgKiBwb3NzaWJpbGl0eSBvZiBhbiBlbXB0eSBvdXRwdXQgcXVldWUuCisJICovCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmYXgyNS0+YWNrX3F1ZXVlKSkgIT0gTlVMTCkgeworCQlpZiAoc2tiX3ByZXYgPT0gTlVMTCkKKwkJCXNrYl9xdWV1ZV9oZWFkKCZheDI1LT53cml0ZV9xdWV1ZSwgc2tiKTsKKwkJZWxzZQorCQkJc2tiX2FwcGVuZChza2JfcHJldiwgc2tiKTsKKwkJc2tiX3ByZXYgPSBza2I7CisJfQorfQorCisvKgorICoJVmFsaWRhdGUgdGhhdCB0aGUgdmFsdWUgb2YgbnIgaXMgYmV0d2VlbiB2YSBhbmQgdnMuIFJldHVybiB0cnVlIG9yCisgKglmYWxzZSBmb3IgdGVzdGluZy4KKyAqLworaW50IGF4MjVfdmFsaWRhdGVfbnIoYXgyNV9jYiAqYXgyNSwgdW5zaWduZWQgc2hvcnQgbnIpCit7CisJdW5zaWduZWQgc2hvcnQgdmMgPSBheDI1LT52YTsKKworCXdoaWxlICh2YyAhPSBheDI1LT52cykgeworCQlpZiAobnIgPT0gdmMpIHJldHVybiAxOworCQl2YyA9ICh2YyArIDEpICUgYXgyNS0+bW9kdWx1czsKKwl9CisKKwlpZiAobnIgPT0gYXgyNS0+dnMpIHJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglUaGlzIHJvdXRpbmUgaXMgdGhlIGNlbnRyYWxpc2VkIHJvdXRpbmUgZm9yIHBhcnNpbmcgdGhlIGNvbnRyb2wKKyAqCWluZm9ybWF0aW9uIGZvciB0aGUgZGlmZmVyZW50IGZyYW1lIGZvcm1hdHMuCisgKi8KK2ludCBheDI1X2RlY29kZShheDI1X2NiICpheDI1LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgKm5zLCBpbnQgKm5yLCBpbnQgKnBmKQoreworCXVuc2lnbmVkIGNoYXIgKmZyYW1lOworCWludCBmcmFtZXR5cGUgPSBBWDI1X0lMTEVHQUw7CisKKwlmcmFtZSA9IHNrYi0+ZGF0YTsKKwkqbnMgPSAqbnIgPSAqcGYgPSAwOworCisJaWYgKGF4MjUtPm1vZHVsdXMgPT0gQVgyNV9NT0RVTFVTKSB7CisJCWlmICgoZnJhbWVbMF0gJiBBWDI1X1MpID09IDApIHsKKwkJCWZyYW1ldHlwZSA9IEFYMjVfSTsJCQkvKiBJIGZyYW1lIC0gY2FycmllcyBOUi9OUy9QRiAqLworCQkJKm5zID0gKGZyYW1lWzBdID4+IDEpICYgMHgwNzsKKwkJCSpuciA9IChmcmFtZVswXSA+PiA1KSAmIDB4MDc7CisJCQkqcGYgPSBmcmFtZVswXSAmIEFYMjVfUEY7CisJCX0gZWxzZSBpZiAoKGZyYW1lWzBdICYgQVgyNV9VKSA9PSAxKSB7IAkvKiBTIGZyYW1lIC0gdGFrZSBvdXQgUEYvTlIgKi8KKwkJCWZyYW1ldHlwZSA9IGZyYW1lWzBdICYgMHgwRjsKKwkJCSpuciA9IChmcmFtZVswXSA+PiA1KSAmIDB4MDc7CisJCQkqcGYgPSBmcmFtZVswXSAmIEFYMjVfUEY7CisJCX0gZWxzZSBpZiAoKGZyYW1lWzBdICYgQVgyNV9VKSA9PSAzKSB7IAkvKiBVIGZyYW1lIC0gdGFrZSBvdXQgUEYgKi8KKwkJCWZyYW1ldHlwZSA9IGZyYW1lWzBdICYgfkFYMjVfUEY7CisJCQkqcGYgPSBmcmFtZVswXSAmIEFYMjVfUEY7CisJCX0KKwkJc2tiX3B1bGwoc2tiLCAxKTsKKwl9IGVsc2UgeworCQlpZiAoKGZyYW1lWzBdICYgQVgyNV9TKSA9PSAwKSB7CisJCQlmcmFtZXR5cGUgPSBBWDI1X0k7CQkJLyogSSBmcmFtZSAtIGNhcnJpZXMgTlIvTlMvUEYgKi8KKwkJCSpucyA9IChmcmFtZVswXSA+PiAxKSAmIDB4N0Y7CisJCQkqbnIgPSAoZnJhbWVbMV0gPj4gMSkgJiAweDdGOworCQkJKnBmID0gZnJhbWVbMV0gJiBBWDI1X0VQRjsKKwkJCXNrYl9wdWxsKHNrYiwgMik7CisJCX0gZWxzZSBpZiAoKGZyYW1lWzBdICYgQVgyNV9VKSA9PSAxKSB7IAkvKiBTIGZyYW1lIC0gdGFrZSBvdXQgUEYvTlIgKi8KKwkJCWZyYW1ldHlwZSA9IGZyYW1lWzBdICYgMHgwRjsKKwkJCSpuciA9IChmcmFtZVsxXSA+PiAxKSAmIDB4N0Y7CisJCQkqcGYgPSBmcmFtZVsxXSAmIEFYMjVfRVBGOworCQkJc2tiX3B1bGwoc2tiLCAyKTsKKwkJfSBlbHNlIGlmICgoZnJhbWVbMF0gJiBBWDI1X1UpID09IDMpIHsgCS8qIFUgZnJhbWUgLSB0YWtlIG91dCBQRiAqLworCQkJZnJhbWV0eXBlID0gZnJhbWVbMF0gJiB+QVgyNV9QRjsKKwkJCSpwZiA9IGZyYW1lWzBdICYgQVgyNV9QRjsKKwkJCXNrYl9wdWxsKHNrYiwgMSk7CisJCX0KKwl9CisKKwlyZXR1cm4gZnJhbWV0eXBlOworfQorCisvKgorICoJVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHRoZSBIRExDIGxheWVyIGludGVybmFsbHkgIGdlbmVyYXRlcyBhCisgKgljb21tYW5kIG9yICByZXNwb25zZSAgZm9yICB0aGUgcmVtb3RlIG1hY2hpbmUgKCBlZy4gUlIsIFVBIGV0Yy4gKS4KKyAqCU9ubHkgc3VwZXJ2aXNvcnkgb3IgdW5udW1iZXJlZCBmcmFtZXMgYXJlIHByb2Nlc3NlZC4KKyAqLwordm9pZCBheDI1X3NlbmRfY29udHJvbChheDI1X2NiICpheDI1LCBpbnQgZnJhbWV0eXBlLCBpbnQgcG9sbF9iaXQsIGludCB0eXBlKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgY2hhciAgKmRwdHI7CisKKwlpZiAoKHNrYiA9IGFsbG9jX3NrYihheDI1LT5heDI1X2Rldi0+ZGV2LT5oYXJkX2hlYWRlcl9sZW4gKyAyLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc2tiX3Jlc2VydmUoc2tiLCBheDI1LT5heDI1X2Rldi0+ZGV2LT5oYXJkX2hlYWRlcl9sZW4pOworCisJc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisKKwkvKiBBc3N1bWUgYSByZXNwb25zZSAtIGFkZHJlc3Mgc3RydWN0dXJlIGZvciBEVEUgKi8KKwlpZiAoYXgyNS0+bW9kdWx1cyA9PSBBWDI1X01PRFVMVVMpIHsKKwkJZHB0ciA9IHNrYl9wdXQoc2tiLCAxKTsKKwkJKmRwdHIgPSBmcmFtZXR5cGU7CisJCSpkcHRyIHw9IChwb2xsX2JpdCkgPyBBWDI1X1BGIDogMDsKKwkJaWYgKChmcmFtZXR5cGUgJiBBWDI1X1UpID09IEFYMjVfUykJCS8qIFMgZnJhbWVzIGNhcnJ5IE5SICovCisJCQkqZHB0ciB8PSAoYXgyNS0+dnIgPDwgNSk7CisJfSBlbHNlIHsKKwkJaWYgKChmcmFtZXR5cGUgJiBBWDI1X1UpID09IEFYMjVfVSkgeworCQkJZHB0ciA9IHNrYl9wdXQoc2tiLCAxKTsKKwkJCSpkcHRyID0gZnJhbWV0eXBlOworCQkJKmRwdHIgfD0gKHBvbGxfYml0KSA/IEFYMjVfUEYgOiAwOworCQl9IGVsc2UgeworCQkJZHB0ciA9IHNrYl9wdXQoc2tiLCAyKTsKKwkJCWRwdHJbMF0gPSBmcmFtZXR5cGU7CisJCQlkcHRyWzFdID0gKGF4MjUtPnZyIDw8IDEpOworCQkJZHB0clsxXSB8PSAocG9sbF9iaXQpID8gQVgyNV9FUEYgOiAwOworCQl9CisJfQorCisJYXgyNV90cmFuc21pdF9idWZmZXIoYXgyNSwgc2tiLCB0eXBlKTsKK30KKworLyoKKyAqCVNlbmQgYSAnRE0nIHRvIGFuIHVua25vd24gY29ubmVjdGlvbiBhdHRlbXB0LCBvciBhbiBpbnZhbGlkIGNhbGxlci4KKyAqCisgKglOb3RlOiBzcmMgaGVyZSBpcyB0aGUgc2VuZGVyLCB0aHVzIGl0J3MgdGhlIHRhcmdldCBvZiB0aGUgRE0KKyAqLwordm9pZCBheDI1X3JldHVybl9kbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBheDI1X2FkZHJlc3MgKnNyYywgYXgyNV9hZGRyZXNzICpkZXN0LCBheDI1X2RpZ2kgKmRpZ2kpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwljaGFyICpkcHRyOworCWF4MjVfZGlnaSByZXRkaWdpOworCisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoKHNrYiA9IGFsbG9jX3NrYihkZXYtPmhhcmRfaGVhZGVyX2xlbiArIDEsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQlyZXR1cm47CS8qIE5leHQgU0FCTSB3aWxsIGdldCBETSdkICovCisKKwlza2JfcmVzZXJ2ZShza2IsIGRldi0+aGFyZF9oZWFkZXJfbGVuKTsKKwlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKworCWF4MjVfZGlnaV9pbnZlcnQoZGlnaSwgJnJldGRpZ2kpOworCisJZHB0ciA9IHNrYl9wdXQoc2tiLCAxKTsKKworCSpkcHRyID0gQVgyNV9ETSB8IEFYMjVfUEY7CisKKwkvKgorCSAqCURvIHRoZSBhZGRyZXNzIG91cnNlbHZlcworCSAqLworCWRwdHIgID0gc2tiX3B1c2goc2tiLCBheDI1X2FkZHJfc2l6ZShkaWdpKSk7CisJZHB0ciArPSBheDI1X2FkZHJfYnVpbGQoZHB0ciwgZGVzdCwgc3JjLCAmcmV0ZGlnaSwgQVgyNV9SRVNQT05TRSwgQVgyNV9NT0RVTFVTKTsKKworCXNrYi0+ZGV2ICAgICAgPSBkZXY7CisKKwlheDI1X3F1ZXVlX3htaXQoc2tiKTsKK30KKworLyoKKyAqCUV4cG9uZW50aWFsIGJhY2tvZmYgZm9yIEFYLjI1CisgKi8KK3ZvaWQgYXgyNV9jYWxjdWxhdGVfdDEoYXgyNV9jYiAqYXgyNSkKK3sKKwlpbnQgbiwgdCA9IDI7CisKKwlzd2l0Y2ggKGF4MjUtPmJhY2tvZmYpIHsKKwljYXNlIDA6CisJCWJyZWFrOworCisJY2FzZSAxOgorCQl0ICs9IDIgKiBheDI1LT5uMmNvdW50OworCQlicmVhazsKKworCWNhc2UgMjoKKwkJZm9yIChuID0gMDsgbiA8IGF4MjUtPm4yY291bnQ7IG4rKykKKwkJCXQgKj0gMjsKKwkJaWYgKHQgPiA4KSB0ID0gODsKKwkJYnJlYWs7CisJfQorCisJYXgyNS0+dDEgPSB0ICogYXgyNS0+cnR0OworfQorCisvKgorICoJQ2FsY3VsYXRlIHRoZSBSb3VuZCBUcmlwIFRpbWUKKyAqLwordm9pZCBheDI1X2NhbGN1bGF0ZV9ydHQoYXgyNV9jYiAqYXgyNSkKK3sKKwlpZiAoYXgyNS0+YmFja29mZiA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAoYXgyNV90MXRpbWVyX3J1bm5pbmcoYXgyNSkgJiYgYXgyNS0+bjJjb3VudCA9PSAwKQorCQlheDI1LT5ydHQgPSAoOSAqIGF4MjUtPnJ0dCArIGF4MjUtPnQxIC0gYXgyNV9kaXNwbGF5X3RpbWVyKCZheDI1LT50MXRpbWVyKSkgLyAxMDsKKworCWlmIChheDI1LT5ydHQgPCBBWDI1X1QxQ0xBTVBMTykKKwkJYXgyNS0+cnR0ID0gQVgyNV9UMUNMQU1QTE87CisKKwlpZiAoYXgyNS0+cnR0ID4gQVgyNV9UMUNMQU1QSEkpCisJCWF4MjUtPnJ0dCA9IEFYMjVfVDFDTEFNUEhJOworfQorCit2b2lkIGF4MjVfZGlzY29ubmVjdChheDI1X2NiICpheDI1LCBpbnQgcmVhc29uKQoreworCWF4MjVfY2xlYXJfcXVldWVzKGF4MjUpOworCisJYXgyNV9zdG9wX3QxdGltZXIoYXgyNSk7CisJYXgyNV9zdG9wX3QydGltZXIoYXgyNSk7CisJYXgyNV9zdG9wX3QzdGltZXIoYXgyNSk7CisJYXgyNV9zdG9wX2lkbGV0aW1lcihheDI1KTsKKworCWF4MjUtPnN0YXRlID0gQVgyNV9TVEFURV8wOworCisJYXgyNV9saW5rX2ZhaWxlZChheDI1LCByZWFzb24pOworCisJaWYgKGF4MjUtPnNrICE9IE5VTEwpIHsKKwkJYmhfbG9ja19zb2NrKGF4MjUtPnNrKTsKKwkJYXgyNS0+c2stPnNrX3N0YXRlICAgICA9IFRDUF9DTE9TRTsKKwkJYXgyNS0+c2stPnNrX2VyciAgICAgICA9IHJlYXNvbjsKKwkJYXgyNS0+c2stPnNrX3NodXRkb3duIHw9IFNFTkRfU0hVVERPV047CisJCWlmICghc29ja19mbGFnKGF4MjUtPnNrLCBTT0NLX0RFQUQpKSB7CisJCQlheDI1LT5zay0+c2tfc3RhdGVfY2hhbmdlKGF4MjUtPnNrKTsKKwkJCXNvY2tfc2V0X2ZsYWcoYXgyNS0+c2ssIFNPQ0tfREVBRCk7CisJCX0KKwkJYmhfdW5sb2NrX3NvY2soYXgyNS0+c2spOworCX0KK30KZGlmZiAtLWdpdCBhL25ldC9heDI1L2F4MjVfdGltZXIuYyBiL25ldC9heDI1L2F4MjVfdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTZiNTBhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2F4MjUvYXgyNV90aW1lci5jCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIEFsYW4gQ294IEdXNFBUUyAoYWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrKQorICogQ29weXJpZ2h0IChDKSBKb25hdGhhbiBOYXlsb3IgRzRLTFggKGc0a2x4QGc0a2x4LmRlbW9uLmNvLnVrKQorICogQ29weXJpZ2h0IChDKSBUb21pIE1hbm5pbmVuIE9IMkJOUyAob2gyYm5zQHNyYWwuZmkpCisgKiBDb3B5cmlnaHQgKEMpIERhcnJ5bCBNaWxlcyBHN0xFRCAoZGxtQGc3bGVkLmRlbW9uLmNvLnVrKQorICogQ29weXJpZ2h0IChDKSBKb2VyZyBSZXV0ZXIgREwxQktFIChqcmV1dGVyQHlhaW5hLmRlKQorICogQ29weXJpZ2h0IChDKSBGcmVkZXJpYyBSaWJsZSBGMU9BVCAoZnJpYmxlQHRlYXNlci5mcikKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSYWxmIEJhZWNobGUgRE8xR1JCIChyYWxmQGdudS5vcmcpCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bmV0L2F4MjUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKK3N0YXRpYyB2b2lkIGF4MjVfaGVhcnRiZWF0X2V4cGlyeSh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyB2b2lkIGF4MjVfdDF0aW1lcl9leHBpcnkodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCBheDI1X3QydGltZXJfZXhwaXJ5KHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgYXgyNV90M3RpbWVyX2V4cGlyeSh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyB2b2lkIGF4MjVfaWRsZXRpbWVyX2V4cGlyeSh1bnNpZ25lZCBsb25nKTsKKwordm9pZCBheDI1X3N0YXJ0X2hlYXJ0YmVhdChheDI1X2NiICpheDI1KQoreworCWRlbF90aW1lcigmYXgyNS0+dGltZXIpOworCisJYXgyNS0+dGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZylheDI1OworCWF4MjUtPnRpbWVyLmZ1bmN0aW9uID0gJmF4MjVfaGVhcnRiZWF0X2V4cGlyeTsKKwlheDI1LT50aW1lci5leHBpcmVzICA9IGppZmZpZXMgKyA1ICogSFo7CisKKwlhZGRfdGltZXIoJmF4MjUtPnRpbWVyKTsKK30KKwordm9pZCBheDI1X3N0YXJ0X3QxdGltZXIoYXgyNV9jYiAqYXgyNSkKK3sKKwlkZWxfdGltZXIoJmF4MjUtPnQxdGltZXIpOworCisJYXgyNS0+dDF0aW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKWF4MjU7CisJYXgyNS0+dDF0aW1lci5mdW5jdGlvbiA9ICZheDI1X3QxdGltZXJfZXhwaXJ5OworCWF4MjUtPnQxdGltZXIuZXhwaXJlcyAgPSBqaWZmaWVzICsgYXgyNS0+dDE7CisKKwlhZGRfdGltZXIoJmF4MjUtPnQxdGltZXIpOworfQorCit2b2lkIGF4MjVfc3RhcnRfdDJ0aW1lcihheDI1X2NiICpheDI1KQoreworCWRlbF90aW1lcigmYXgyNS0+dDJ0aW1lcik7CisKKwlheDI1LT50MnRpbWVyLmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpYXgyNTsKKwlheDI1LT50MnRpbWVyLmZ1bmN0aW9uID0gJmF4MjVfdDJ0aW1lcl9leHBpcnk7CisJYXgyNS0+dDJ0aW1lci5leHBpcmVzICA9IGppZmZpZXMgKyBheDI1LT50MjsKKworCWFkZF90aW1lcigmYXgyNS0+dDJ0aW1lcik7Cit9CisKK3ZvaWQgYXgyNV9zdGFydF90M3RpbWVyKGF4MjVfY2IgKmF4MjUpCit7CisJZGVsX3RpbWVyKCZheDI1LT50M3RpbWVyKTsKKworCWlmIChheDI1LT50MyA+IDApIHsKKwkJYXgyNS0+dDN0aW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKWF4MjU7CisJCWF4MjUtPnQzdGltZXIuZnVuY3Rpb24gPSAmYXgyNV90M3RpbWVyX2V4cGlyeTsKKwkJYXgyNS0+dDN0aW1lci5leHBpcmVzICA9IGppZmZpZXMgKyBheDI1LT50MzsKKworCQlhZGRfdGltZXIoJmF4MjUtPnQzdGltZXIpOworCX0KK30KKwordm9pZCBheDI1X3N0YXJ0X2lkbGV0aW1lcihheDI1X2NiICpheDI1KQoreworCWRlbF90aW1lcigmYXgyNS0+aWRsZXRpbWVyKTsKKworCWlmIChheDI1LT5pZGxlID4gMCkgeworCQlheDI1LT5pZGxldGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZylheDI1OworCQlheDI1LT5pZGxldGltZXIuZnVuY3Rpb24gPSAmYXgyNV9pZGxldGltZXJfZXhwaXJ5OworCQlheDI1LT5pZGxldGltZXIuZXhwaXJlcyAgPSBqaWZmaWVzICsgYXgyNS0+aWRsZTsKKworCQlhZGRfdGltZXIoJmF4MjUtPmlkbGV0aW1lcik7CisJfQorfQorCit2b2lkIGF4MjVfc3RvcF9oZWFydGJlYXQoYXgyNV9jYiAqYXgyNSkKK3sKKwlkZWxfdGltZXIoJmF4MjUtPnRpbWVyKTsKK30KKwordm9pZCBheDI1X3N0b3BfdDF0aW1lcihheDI1X2NiICpheDI1KQoreworCWRlbF90aW1lcigmYXgyNS0+dDF0aW1lcik7Cit9CisKK3ZvaWQgYXgyNV9zdG9wX3QydGltZXIoYXgyNV9jYiAqYXgyNSkKK3sKKwlkZWxfdGltZXIoJmF4MjUtPnQydGltZXIpOworfQorCit2b2lkIGF4MjVfc3RvcF90M3RpbWVyKGF4MjVfY2IgKmF4MjUpCit7CisJZGVsX3RpbWVyKCZheDI1LT50M3RpbWVyKTsKK30KKwordm9pZCBheDI1X3N0b3BfaWRsZXRpbWVyKGF4MjVfY2IgKmF4MjUpCit7CisJZGVsX3RpbWVyKCZheDI1LT5pZGxldGltZXIpOworfQorCitpbnQgYXgyNV90MXRpbWVyX3J1bm5pbmcoYXgyNV9jYiAqYXgyNSkKK3sKKwlyZXR1cm4gdGltZXJfcGVuZGluZygmYXgyNS0+dDF0aW1lcik7Cit9CisKK3Vuc2lnbmVkIGxvbmcgYXgyNV9kaXNwbGF5X3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKK3sKKwlpZiAoIXRpbWVyX3BlbmRpbmcodGltZXIpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiB0aW1lci0+ZXhwaXJlcyAtIGppZmZpZXM7Cit9CisKK3N0YXRpYyB2b2lkIGF4MjVfaGVhcnRiZWF0X2V4cGlyeSh1bnNpZ25lZCBsb25nIHBhcmFtKQoreworCWludCBwcm90byA9IEFYMjVfUFJPVE9fU1REX1NJTVBMRVg7CisJYXgyNV9jYiAqYXgyNSA9IChheDI1X2NiICopcGFyYW07CisKKwlpZiAoYXgyNS0+YXgyNV9kZXYpCisJCXByb3RvID0gYXgyNS0+YXgyNV9kZXYtPnZhbHVlc1tBWDI1X1ZBTFVFU19QUk9UT0NPTF07CisKKwlzd2l0Y2ggKHByb3RvKSB7CisJY2FzZSBBWDI1X1BST1RPX1NURF9TSU1QTEVYOgorCWNhc2UgQVgyNV9QUk9UT19TVERfRFVQTEVYOgorCQlheDI1X3N0ZF9oZWFydGJlYXRfZXhwaXJ5KGF4MjUpOworCQlicmVhazsKKworI2lmZGVmIENPTkZJR19BWDI1X0RBTUFfU0xBVkUKKwljYXNlIEFYMjVfUFJPVE9fREFNQV9TTEFWRToKKwkJaWYgKGF4MjUtPmF4MjVfZGV2LT5kYW1hLnNsYXZlKQorCQkJYXgyNV9kc19oZWFydGJlYXRfZXhwaXJ5KGF4MjUpOworCQllbHNlCisJCQlheDI1X3N0ZF9oZWFydGJlYXRfZXhwaXJ5KGF4MjUpOworCQlicmVhazsKKyNlbmRpZgorCX0KK30KKworc3RhdGljIHZvaWQgYXgyNV90MXRpbWVyX2V4cGlyeSh1bnNpZ25lZCBsb25nIHBhcmFtKQoreworCWF4MjVfY2IgKmF4MjUgPSAoYXgyNV9jYiAqKXBhcmFtOworCisJc3dpdGNoIChheDI1LT5heDI1X2Rldi0+dmFsdWVzW0FYMjVfVkFMVUVTX1BST1RPQ09MXSkgeworCWNhc2UgQVgyNV9QUk9UT19TVERfU0lNUExFWDoKKwljYXNlIEFYMjVfUFJPVE9fU1REX0RVUExFWDoKKwkJYXgyNV9zdGRfdDF0aW1lcl9leHBpcnkoYXgyNSk7CisJCWJyZWFrOworCisjaWZkZWYgQ09ORklHX0FYMjVfREFNQV9TTEFWRQorCWNhc2UgQVgyNV9QUk9UT19EQU1BX1NMQVZFOgorCQlpZiAoIWF4MjUtPmF4MjVfZGV2LT5kYW1hLnNsYXZlKQorCQkJYXgyNV9zdGRfdDF0aW1lcl9leHBpcnkoYXgyNSk7CisJCWJyZWFrOworI2VuZGlmCisJfQorfQorCitzdGF0aWMgdm9pZCBheDI1X3QydGltZXJfZXhwaXJ5KHVuc2lnbmVkIGxvbmcgcGFyYW0pCit7CisJYXgyNV9jYiAqYXgyNSA9IChheDI1X2NiICopcGFyYW07CisKKwlzd2l0Y2ggKGF4MjUtPmF4MjVfZGV2LT52YWx1ZXNbQVgyNV9WQUxVRVNfUFJPVE9DT0xdKSB7CisJY2FzZSBBWDI1X1BST1RPX1NURF9TSU1QTEVYOgorCWNhc2UgQVgyNV9QUk9UT19TVERfRFVQTEVYOgorCQlheDI1X3N0ZF90MnRpbWVyX2V4cGlyeShheDI1KTsKKwkJYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfQVgyNV9EQU1BX1NMQVZFCisJY2FzZSBBWDI1X1BST1RPX0RBTUFfU0xBVkU6CisJCWlmICghYXgyNS0+YXgyNV9kZXYtPmRhbWEuc2xhdmUpCisJCQlheDI1X3N0ZF90MnRpbWVyX2V4cGlyeShheDI1KTsKKwkJYnJlYWs7CisjZW5kaWYKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGF4MjVfdDN0aW1lcl9leHBpcnkodW5zaWduZWQgbG9uZyBwYXJhbSkKK3sKKwlheDI1X2NiICpheDI1ID0gKGF4MjVfY2IgKilwYXJhbTsKKworCXN3aXRjaCAoYXgyNS0+YXgyNV9kZXYtPnZhbHVlc1tBWDI1X1ZBTFVFU19QUk9UT0NPTF0pIHsKKwljYXNlIEFYMjVfUFJPVE9fU1REX1NJTVBMRVg6CisJY2FzZSBBWDI1X1BST1RPX1NURF9EVVBMRVg6CisJCWF4MjVfc3RkX3QzdGltZXJfZXhwaXJ5KGF4MjUpOworCQlicmVhazsKKworI2lmZGVmIENPTkZJR19BWDI1X0RBTUFfU0xBVkUKKwljYXNlIEFYMjVfUFJPVE9fREFNQV9TTEFWRToKKwkJaWYgKGF4MjUtPmF4MjVfZGV2LT5kYW1hLnNsYXZlKQorCQkJYXgyNV9kc190M3RpbWVyX2V4cGlyeShheDI1KTsKKwkJZWxzZQorCQkJYXgyNV9zdGRfdDN0aW1lcl9leHBpcnkoYXgyNSk7CisJCWJyZWFrOworI2VuZGlmCisJfQorfQorCitzdGF0aWMgdm9pZCBheDI1X2lkbGV0aW1lcl9leHBpcnkodW5zaWduZWQgbG9uZyBwYXJhbSkKK3sKKwlheDI1X2NiICpheDI1ID0gKGF4MjVfY2IgKilwYXJhbTsKKworCXN3aXRjaCAoYXgyNS0+YXgyNV9kZXYtPnZhbHVlc1tBWDI1X1ZBTFVFU19QUk9UT0NPTF0pIHsKKwljYXNlIEFYMjVfUFJPVE9fU1REX1NJTVBMRVg6CisJY2FzZSBBWDI1X1BST1RPX1NURF9EVVBMRVg6CisJCWF4MjVfc3RkX2lkbGV0aW1lcl9leHBpcnkoYXgyNSk7CisJCWJyZWFrOworCisjaWZkZWYgQ09ORklHX0FYMjVfREFNQV9TTEFWRQorCWNhc2UgQVgyNV9QUk9UT19EQU1BX1NMQVZFOgorCQlpZiAoYXgyNS0+YXgyNV9kZXYtPmRhbWEuc2xhdmUpCisJCQlheDI1X2RzX2lkbGV0aW1lcl9leHBpcnkoYXgyNSk7CisJCWVsc2UKKwkJCWF4MjVfc3RkX2lkbGV0aW1lcl9leHBpcnkoYXgyNSk7CisJCWJyZWFrOworI2VuZGlmCisJfQorfQpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYXgyNV91aWQuYyBiL25ldC9heDI1L2F4MjVfdWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VhNmI3ZAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9heDI1L2F4MjVfdWlkLmMKQEAgLTAsMCArMSwyMjggQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgSm9uYXRoYW4gTmF5bG9yIEc0S0xYIChnNGtseEBnNGtseC5kZW1vbi5jby51aykKKyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxuZXQvYXgyNS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisKKy8qCisgKglDYWxsc2lnbi9VSUQgbWFwcGVyLiBUaGlzIGlzIGluIGtlcm5lbCBzcGFjZSBmb3Igc2VjdXJpdHkgb24gbXVsdGktYW1hdGV1ciBtYWNoaW5lcy4KKyAqLworCitzdGF0aWMgYXgyNV91aWRfYXNzb2MgKmF4MjVfdWlkX2xpc3Q7CitzdGF0aWMgREVGSU5FX1JXTE9DSyhheDI1X3VpZF9sb2NrKTsKKworaW50IGF4MjVfdWlkX3BvbGljeSA9IDA7CisKK2F4MjVfYWRkcmVzcyAqYXgyNV9maW5kYnl1aWQodWlkX3QgdWlkKQoreworCWF4MjVfdWlkX2Fzc29jICpheDI1X3VpZDsKKwlheDI1X2FkZHJlc3MgKnJlcyA9IE5VTEw7CisKKwlyZWFkX2xvY2soJmF4MjVfdWlkX2xvY2spOworCWZvciAoYXgyNV91aWQgPSBheDI1X3VpZF9saXN0OyBheDI1X3VpZCAhPSBOVUxMOyBheDI1X3VpZCA9IGF4MjVfdWlkLT5uZXh0KSB7CisJCWlmIChheDI1X3VpZC0+dWlkID09IHVpZCkgeworCQkJcmVzID0gJmF4MjVfdWlkLT5jYWxsOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmVhZF91bmxvY2soJmF4MjVfdWlkX2xvY2spOworCisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBheDI1X3VpZF9pb2N0bChpbnQgY21kLCBzdHJ1Y3Qgc29ja2FkZHJfYXgyNSAqc2F4KQoreworCWF4MjVfdWlkX2Fzc29jICpzLCAqYXgyNV91aWQ7CisJdW5zaWduZWQgbG9uZyByZXM7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0FYMjVHRVRVSUQ6CisJCXJlcyA9IC1FTk9FTlQ7CisJCXJlYWRfbG9jaygmYXgyNV91aWRfbG9jayk7CisJCWZvciAoYXgyNV91aWQgPSBheDI1X3VpZF9saXN0OyBheDI1X3VpZCAhPSBOVUxMOyBheDI1X3VpZCA9IGF4MjVfdWlkLT5uZXh0KSB7CisJCQlpZiAoYXgyNWNtcCgmc2F4LT5zYXgyNV9jYWxsLCAmYXgyNV91aWQtPmNhbGwpID09IDApIHsKKwkJCQlyZXMgPSBheDI1X3VpZC0+dWlkOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJlYWRfdW5sb2NrKCZheDI1X3VpZF9sb2NrKTsKKworCQlyZXR1cm4gcmVzOworCisJY2FzZSBTSU9DQVgyNUFERFVJRDoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGF4MjVfZmluZGJ5dWlkKHNheC0+c2F4MjVfdWlkKSkKKwkJCXJldHVybiAtRUVYSVNUOworCQlpZiAoc2F4LT5zYXgyNV91aWQgPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoKGF4MjVfdWlkID0ga21hbGxvYyhzaXplb2YoKmF4MjVfdWlkKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlheDI1X3VpZC0+dWlkICA9IHNheC0+c2F4MjVfdWlkOworCQlheDI1X3VpZC0+Y2FsbCA9IHNheC0+c2F4MjVfY2FsbDsKKworCQl3cml0ZV9sb2NrKCZheDI1X3VpZF9sb2NrKTsKKwkJYXgyNV91aWQtPm5leHQgPSBheDI1X3VpZF9saXN0OworCQlheDI1X3VpZF9saXN0ICA9IGF4MjVfdWlkOworCQl3cml0ZV91bmxvY2soJmF4MjVfdWlkX2xvY2spOworCisJCXJldHVybiAwOworCisJY2FzZSBTSU9DQVgyNURFTFVJRDoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQl3cml0ZV9sb2NrKCZheDI1X3VpZF9sb2NrKTsKKwkJZm9yIChheDI1X3VpZCA9IGF4MjVfdWlkX2xpc3Q7IGF4MjVfdWlkICE9IE5VTEw7IGF4MjVfdWlkID0gYXgyNV91aWQtPm5leHQpIHsKKwkJCWlmIChheDI1Y21wKCZzYXgtPnNheDI1X2NhbGwsICZheDI1X3VpZC0+Y2FsbCkgPT0gMCkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChheDI1X3VpZCA9PSBOVUxMKSB7CisJCQl3cml0ZV91bmxvY2soJmF4MjVfdWlkX2xvY2spOworCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0KKwkJaWYgKChzID0gYXgyNV91aWRfbGlzdCkgPT0gYXgyNV91aWQpIHsKKwkJCWF4MjVfdWlkX2xpc3QgPSBzLT5uZXh0OworCQkJd3JpdGVfdW5sb2NrKCZheDI1X3VpZF9sb2NrKTsKKwkJCWtmcmVlKGF4MjVfdWlkKTsKKwkJCXJldHVybiAwOworCQl9CisJCXdoaWxlIChzICE9IE5VTEwgJiYgcy0+bmV4dCAhPSBOVUxMKSB7CisJCQlpZiAocy0+bmV4dCA9PSBheDI1X3VpZCkgeworCQkJCXMtPm5leHQgPSBheDI1X3VpZC0+bmV4dDsKKwkJCQl3cml0ZV91bmxvY2soJmF4MjVfdWlkX2xvY2spOworCQkJCWtmcmVlKGF4MjVfdWlkKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXMgPSBzLT5uZXh0OworCQl9CisJCXdyaXRlX3VubG9jaygmYXgyNV91aWRfbG9jayk7CisKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsJLypOT1RSRUFDSEVEICovCit9CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCitzdGF0aWMgdm9pZCAqYXgyNV91aWRfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgYXgyNV91aWRfYXNzb2MgKnB0OworCWludCBpID0gMTsKKworCXJlYWRfbG9jaygmYXgyNV91aWRfbG9jayk7CisJaWYgKCpwb3MgPT0gMCkKKwkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKKworCWZvciAocHQgPSBheDI1X3VpZF9saXN0OyBwdCAhPSBOVUxMOyBwdCA9IHB0LT5uZXh0KSB7CisJCWlmIChpID09ICpwb3MpCisJCQlyZXR1cm4gcHQ7CisJCSsraTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICpheDI1X3VpZF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJKysqcG9zOworCXJldHVybiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pID8gYXgyNV91aWRfbGlzdCA6IAorCQkoKHN0cnVjdCBheDI1X3VpZF9hc3NvYyAqKSB2KS0+bmV4dDsKK30KKworc3RhdGljIHZvaWQgYXgyNV91aWRfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJcmVhZF91bmxvY2soJmF4MjVfdWlkX2xvY2spOworfQorCitzdGF0aWMgaW50IGF4MjVfdWlkX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKKwkJc2VxX3ByaW50ZihzZXEsICJQb2xpY3k6ICVkXG4iLCBheDI1X3VpZF9wb2xpY3kpOworCWVsc2UgeworCQlzdHJ1Y3QgYXgyNV91aWRfYXNzb2MgKnB0ID0gdjsKKwkJCisKKwkJc2VxX3ByaW50ZihzZXEsICIlNmQgJXNcbiIsIHB0LT51aWQsIGF4MmFzYygmcHQtPmNhbGwpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgYXgyNV91aWRfc2Vxb3BzID0geworCS5zdGFydCA9IGF4MjVfdWlkX3NlcV9zdGFydCwKKwkubmV4dCA9IGF4MjVfdWlkX3NlcV9uZXh0LAorCS5zdG9wID0gYXgyNV91aWRfc2VxX3N0b3AsCisJLnNob3cgPSBheDI1X3VpZF9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgYXgyNV91aWRfaW5mb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmYXgyNV91aWRfc2Vxb3BzKTsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBheDI1X3VpZF9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gYXgyNV91aWRfaW5mb19vcGVuLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKworI2VuZGlmCisKKy8qCisgKglGcmVlIGFsbCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIFVJRC9DYWxsc2lnbiBzdHJ1Y3R1cmVzLgorICovCit2b2lkIF9fZXhpdCBheDI1X3VpZF9mcmVlKHZvaWQpCit7CisJYXgyNV91aWRfYXNzb2MgKnMsICpheDI1X3VpZDsKKworCXdyaXRlX2xvY2soJmF4MjVfdWlkX2xvY2spOworCWF4MjVfdWlkID0gYXgyNV91aWRfbGlzdDsKKwl3aGlsZSAoYXgyNV91aWQgIT0gTlVMTCkgeworCQlzICAgICAgICA9IGF4MjVfdWlkOworCQlheDI1X3VpZCA9IGF4MjVfdWlkLT5uZXh0OworCisJCWtmcmVlKHMpOworCX0KKwlheDI1X3VpZF9saXN0ID0gTlVMTDsKKwl3cml0ZV91bmxvY2soJmF4MjVfdWlkX2xvY2spOworfQpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvc3lzY3RsX25ldF9heDI1LmMgYi9uZXQvYXgyNS9zeXNjdGxfbmV0X2F4MjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjc3MTFmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2F4MjUvc3lzY3RsX25ldF9heDI1LmMKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiBNaWtlIFNoYXZlciAoc2hhdmVyQHplcm9rbm93bGVkZ2UuY29tKQorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPG5ldC9heDI1Lmg+CisKK3N0YXRpYyBpbnQgbWluX2lwZGVmbW9kZVsxXSwgICAgCW1heF9pcGRlZm1vZGVbXSA9IHsxfTsKK3N0YXRpYyBpbnQgbWluX2F4ZGVmbW9kZVsxXSwgICAgICAgICAgICBtYXhfYXhkZWZtb2RlW10gPSB7MX07CitzdGF0aWMgaW50IG1pbl9iYWNrb2ZmWzFdLAkJbWF4X2JhY2tvZmZbXSA9IHsyfTsKK3N0YXRpYyBpbnQgbWluX2Nvbm1vZGVbMV0sCQltYXhfY29ubW9kZVtdID0gezJ9Oworc3RhdGljIGludCBtaW5fd2luZG93W10gPSB7MX0sCQltYXhfd2luZG93W10gPSB7N307CitzdGF0aWMgaW50IG1pbl9ld2luZG93W10gPSB7MX0sCQltYXhfZXdpbmRvd1tdID0gezYzfTsKK3N0YXRpYyBpbnQgbWluX3QxW10gPSB7MX0sCQltYXhfdDFbXSA9IHszMCAqIEhafTsKK3N0YXRpYyBpbnQgbWluX3QyW10gPSB7MX0sCQltYXhfdDJbXSA9IHsyMCAqIEhafTsKK3N0YXRpYyBpbnQgbWluX3QzWzFdLCAgIAkJbWF4X3QzW10gPSB7MzYwMCAqIEhafTsKK3N0YXRpYyBpbnQgbWluX2lkbGVbMV0sICAJCW1heF9pZGxlW10gPSB7NjU1MzUgKiBIWn07CitzdGF0aWMgaW50IG1pbl9uMltdID0gezF9LAkJbWF4X24yW10gPSB7MzF9Oworc3RhdGljIGludCBtaW5fcGFjbGVuW10gPSB7MX0sCQltYXhfcGFjbGVuW10gPSB7NTEyfTsKK3N0YXRpYyBpbnQgbWluX3Byb3RvWzFdLAkJbWF4X3Byb3RvW10gPSB7M307CitzdGF0aWMgaW50IG1pbl9kc190aW1lb3V0WzFdLCAgIAltYXhfZHNfdGltZW91dFtdID0gezY1NTM1ICogSFp9OworCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmF4MjVfdGFibGVfaGVhZGVyOworCitzdGF0aWMgY3RsX3RhYmxlICpheDI1X3RhYmxlOworc3RhdGljIGludCBheDI1X3RhYmxlX3NpemU7CisKK3N0YXRpYyBjdGxfdGFibGUgYXgyNV9kaXJfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9BWDI1LAorCQkucHJvY25hbWUJPSAiYXgyNSIsCisJCS5tb2RlCQk9IDA1NTUsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIGN0bF90YWJsZSBheDI1X3Jvb3RfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9ORVQsCisJCS5wcm9jbmFtZQk9ICJuZXQiLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gYXgyNV9kaXJfdGFibGUKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCitzdGF0aWMgY29uc3QgY3RsX3RhYmxlIGF4MjVfcGFyYW1fdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9BWDI1X0lQX0RFRkFVTFRfTU9ERSwKKwkJLnByb2NuYW1lCT0gImlwX2RlZmF1bHRfbW9kZSIsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZtaW5faXBkZWZtb2RlLAorCQkuZXh0cmEyCQk9ICZtYXhfaXBkZWZtb2RlCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9BWDI1X0RFRkFVTFRfTU9ERSwKKwkJLnByb2NuYW1lCT0gImF4MjVfZGVmYXVsdF9tb2RlIiwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl9heGRlZm1vZGUsCisJCS5leHRyYTIJCT0gJm1heF9heGRlZm1vZGUKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0FYMjVfQkFDS09GRl9UWVBFLAorCQkucHJvY25hbWUJPSAiYmFja29mZl90eXBlIiwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl9iYWNrb2ZmLAorCQkuZXh0cmEyCQk9ICZtYXhfYmFja29mZgorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfQVgyNV9DT05ORUNUX01PREUsCisJCS5wcm9jbmFtZQk9ICJjb25uZWN0X21vZGUiLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmbWluX2Nvbm1vZGUsCisJCS5leHRyYTIJCT0gJm1heF9jb25tb2RlCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9BWDI1X1NUQU5EQVJEX1dJTkRPVywKKwkJLnByb2NuYW1lCT0gInN0YW5kYXJkX3dpbmRvd19zaXplIiwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl93aW5kb3csCisJCS5leHRyYTIJCT0gJm1heF93aW5kb3cKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0FYMjVfRVhURU5ERURfV0lORE9XLAorCQkucHJvY25hbWUJPSAiZXh0ZW5kZWRfd2luZG93X3NpemUiLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmbWluX2V3aW5kb3csCisJCS5leHRyYTIJCT0gJm1heF9ld2luZG93CisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9BWDI1X1QxX1RJTUVPVVQsCisJCS5wcm9jbmFtZQk9ICJ0MV90aW1lb3V0IiwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl90MSwKKwkJLmV4dHJhMgkJPSAmbWF4X3QxCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9BWDI1X1QyX1RJTUVPVVQsCisJCS5wcm9jbmFtZQk9ICJ0Ml90aW1lb3V0IiwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl90MiwKKwkJLmV4dHJhMgkJPSAmbWF4X3QyCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9BWDI1X1QzX1RJTUVPVVQsCisJCS5wcm9jbmFtZQk9ICJ0M190aW1lb3V0IiwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl90MywKKwkJLmV4dHJhMgkJPSAmbWF4X3QzCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9BWDI1X0lETEVfVElNRU9VVCwKKwkJLnByb2NuYW1lCT0gImlkbGVfdGltZW91dCIsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZtaW5faWRsZSwKKwkJLmV4dHJhMgkJPSAmbWF4X2lkbGUKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0FYMjVfTjIsCisJCS5wcm9jbmFtZQk9ICJtYXhpbXVtX3JldHJ5X2NvdW50IiwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl9uMiwKKwkJLmV4dHJhMgkJPSAmbWF4X24yCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9BWDI1X1BBQ0xFTiwKKwkJLnByb2NuYW1lCT0gIm1heGltdW1fcGFja2V0X2xlbmd0aCIsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZtaW5fcGFjbGVuLAorCQkuZXh0cmEyCQk9ICZtYXhfcGFjbGVuCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9BWDI1X1BST1RPQ09MLAorCQkucHJvY25hbWUJPSAicHJvdG9jb2wiLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmbWluX3Byb3RvLAorCQkuZXh0cmEyCQk9ICZtYXhfcHJvdG8KKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0FYMjVfREFNQV9TTEFWRV9USU1FT1VULAorCQkucHJvY25hbWUJPSAiZGFtYV9zbGF2ZV90aW1lb3V0IiwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl9kc190aW1lb3V0LAorCQkuZXh0cmEyCQk9ICZtYXhfZHNfdGltZW91dAorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0JLyogdGhhdCdzIGFsbCwgZm9sa3MhICovCit9OworCit2b2lkIGF4MjVfcmVnaXN0ZXJfc3lzY3RsKHZvaWQpCit7CisJYXgyNV9kZXYgKmF4MjVfZGV2OworCWludCBuLCBrOworCisJc3Bpbl9sb2NrX2JoKCZheDI1X2Rldl9sb2NrKTsKKwlmb3IgKGF4MjVfdGFibGVfc2l6ZSA9IHNpemVvZihjdGxfdGFibGUpLCBheDI1X2RldiA9IGF4MjVfZGV2X2xpc3Q7IGF4MjVfZGV2ICE9IE5VTEw7IGF4MjVfZGV2ID0gYXgyNV9kZXYtPm5leHQpCisJCWF4MjVfdGFibGVfc2l6ZSArPSBzaXplb2YoY3RsX3RhYmxlKTsKKworCWlmICgoYXgyNV90YWJsZSA9IGttYWxsb2MoYXgyNV90YWJsZV9zaXplLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19iaCgmYXgyNV9kZXZfbG9jayk7CisJCXJldHVybjsKKwl9CisKKwltZW1zZXQoYXgyNV90YWJsZSwgMHgwMCwgYXgyNV90YWJsZV9zaXplKTsKKworCWZvciAobiA9IDAsIGF4MjVfZGV2ID0gYXgyNV9kZXZfbGlzdDsgYXgyNV9kZXYgIT0gTlVMTDsgYXgyNV9kZXYgPSBheDI1X2Rldi0+bmV4dCkgeworCQljdGxfdGFibGUgKmNoaWxkID0ga21hbGxvYyhzaXplb2YoYXgyNV9wYXJhbV90YWJsZSksIEdGUF9BVE9NSUMpOworCQlpZiAoIWNoaWxkKSB7CisJCQl3aGlsZSAobi0tKQorCQkJCWtmcmVlKGF4MjVfdGFibGVbbl0uY2hpbGQpOworCQkJa2ZyZWUoYXgyNV90YWJsZSk7CisJCQlzcGluX3VubG9ja19iaCgmYXgyNV9kZXZfbG9jayk7CisJCQlyZXR1cm47CisJCX0KKwkJbWVtY3B5KGNoaWxkLCBheDI1X3BhcmFtX3RhYmxlLCBzaXplb2YoYXgyNV9wYXJhbV90YWJsZSkpOworCQlheDI1X3RhYmxlW25dLmNoaWxkID0gYXgyNV9kZXYtPnN5c3RhYmxlID0gY2hpbGQ7CisJCWF4MjVfdGFibGVbbl0uY3RsX25hbWUgICAgID0gbiArIDE7CisJCWF4MjVfdGFibGVbbl0ucHJvY25hbWUgICAgID0gYXgyNV9kZXYtPmRldi0+bmFtZTsKKwkJYXgyNV90YWJsZVtuXS5tb2RlICAgICAgICAgPSAwNTU1OworCisjaWZuZGVmIENPTkZJR19BWDI1X0RBTUFfU0xBVkUKKwkJLyoKKwkJICogV2UgZG8gbm90IHdpc2ggdG8gaGF2ZSBhIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcGFyYW1ldGVyCisJCSAqIGluIC9wcm9jL3N5cy8gd2hlbiBjb25maWd1cmVkICpub3QqIHRvIGluY2x1ZGUgdGhlCisJCSAqIEFYLjI1IERBTUEgc2xhdmUgY29kZSwgZG8gd2U/CisJCSAqLworCisJCWNoaWxkW0FYMjVfVkFMVUVTX0RTX1RJTUVPVVRdLnByb2NuYW1lID0gTlVMTDsKKyNlbmRpZgorCisJCWNoaWxkW0FYMjVfTUFYX1ZBTFVFU10uY3RsX25hbWUgPSAwOwkvKiBqdXN0IGluIGNhc2UuLi4gKi8KKworCQlmb3IgKGsgPSAwOyBrIDwgQVgyNV9NQVhfVkFMVUVTOyBrKyspCisJCQljaGlsZFtrXS5kYXRhID0gJmF4MjVfZGV2LT52YWx1ZXNba107CisKKwkJbisrOworCX0KKwlzcGluX3VubG9ja19iaCgmYXgyNV9kZXZfbG9jayk7CisKKwlheDI1X2Rpcl90YWJsZVswXS5jaGlsZCA9IGF4MjVfdGFibGU7CisKKwlheDI1X3RhYmxlX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZShheDI1X3Jvb3RfdGFibGUsIDEpOworfQorCit2b2lkIGF4MjVfdW5yZWdpc3Rlcl9zeXNjdGwodm9pZCkKK3sKKwljdGxfdGFibGUgKnA7CisJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoYXgyNV90YWJsZV9oZWFkZXIpOworCisJYXgyNV9kaXJfdGFibGVbMF0uY2hpbGQgPSBOVUxMOworCWZvciAocCA9IGF4MjVfdGFibGU7IHAtPmN0bF9uYW1lOyBwKyspCisJCWtmcmVlKHAtPmNoaWxkKTsKKwlrZnJlZShheDI1X3RhYmxlKTsKK30KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvS2NvbmZpZyBiL25ldC9ibHVldG9vdGgvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTI5NDkwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9LY29uZmlnCkBAIC0wLDAgKzEsNjMgQEAKKyMKKyMgQmx1ZXRvb3RoIHN1YnN5c3RlbSBjb25maWd1cmF0aW9uCisjCisKK21lbnVjb25maWcgQlQKKwlkZXBlbmRzIG9uIE5FVAorCXRyaXN0YXRlICJCbHVldG9vdGggc3Vic3lzdGVtIHN1cHBvcnQiCisJaGVscAorCSAgQmx1ZXRvb3RoIGlzIGxvdy1jb3N0LCBsb3ctcG93ZXIsIHNob3J0LXJhbmdlIHdpcmVsZXNzIHRlY2hub2xvZ3kuCisJICBJdCB3YXMgZGVzaWduZWQgYXMgYSByZXBsYWNlbWVudCBmb3IgY2FibGVzIGFuZCBvdGhlciBzaG9ydC1yYW5nZQorCSAgdGVjaG5vbG9naWVzIGxpa2UgSXJEQS4gIEJsdWV0b290aCBvcGVyYXRlcyBpbiBwZXJzb25hbCBhcmVhIHJhbmdlCisJICB0aGF0IHR5cGljYWxseSBleHRlbmRzIHVwIHRvIDEwIG1ldGVycy4gIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQKKwkgIEJsdWV0b290aCBjYW4gYmUgZm91bmQgYXQgPGh0dHA6Ly93d3cuYmx1ZXRvb3RoLmNvbS8+LgorCisJICBMaW51eCBCbHVldG9vdGggc3Vic3lzdGVtIGNvbnNpc3Qgb2Ygc2V2ZXJhbCBsYXllcnM6CisJICAgICBCbHVldG9vdGggQ29yZSAoSENJIGRldmljZSBhbmQgY29ubmVjdGlvbiBtYW5hZ2VyLCBzY2hlZHVsZXIpCisJICAgICBIQ0kgRGV2aWNlIGRyaXZlcnMgKEludGVyZmFjZSB0byB0aGUgaGFyZHdhcmUpCisJICAgICBTQ08gTW9kdWxlIChTQ08gYXVkaW8gbGlua3MpCisJICAgICBMMkNBUCBNb2R1bGUgKExvZ2ljYWwgTGluayBDb250cm9sIGFuZCBBZGFwdGF0aW9uIFByb3RvY29sKQorCSAgICAgUkZDT01NIE1vZHVsZSAoUkZDT01NIFByb3RvY29sKSAgCisJICAgICBCTkVQIE1vZHVsZSAoQmx1ZXRvb3RoIE5ldHdvcmsgRW5jYXBzdWxhdGlvbiBQcm90b2NvbCkKKwkgICAgIENNVFAgTW9kdWxlIChDQVBJIE1lc3NhZ2UgVHJhbnNwb3J0IFByb3RvY29sKQorCSAgICAgSElEUCBNb2R1bGUgKEh1bWFuIEludGVyZmFjZSBEZXZpY2UgUHJvdG9jb2wpCisKKwkgIFNheSBZIGhlcmUgdG8gY29tcGlsZSBCbHVldG9vdGggc3VwcG9ydCBpbnRvIHRoZSBrZXJuZWwgb3Igc2F5IE0gdG8KKwkgIGNvbXBpbGUgaXQgYXMgbW9kdWxlIChibHVldG9vdGgpLgorCisJICBUbyB1c2UgTGludXggQmx1ZXRvb3RoIHN1YnN5c3RlbSwgeW91IHdpbGwgbmVlZCBzZXZlcmFsIHVzZXItc3BhY2UKKwkgIHV0aWxpdGllcyBsaWtlIGhjaWNvbmZpZyBhbmQgaGNpZC4gIFRoZXNlIHV0aWxpdGllcyBhbmQgdXBkYXRlcyB0bworCSAgQmx1ZXRvb3RoIGtlcm5lbCBtb2R1bGVzIGFyZSBwcm92aWRlZCBpbiB0aGUgQmx1ZVogcGFja2FnZXMuCisJICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxodHRwOi8vd3d3LmJsdWV6Lm9yZy8+LgorCitjb25maWcgQlRfTDJDQVAKKwl0cmlzdGF0ZSAiTDJDQVAgcHJvdG9jb2wgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJUCisJaGVscAorCSAgTDJDQVAgKExvZ2ljYWwgTGluayBDb250cm9sIGFuZCBBZGFwdGF0aW9uIFByb3RvY29sKSBwcm92aWRlcworCSAgY29ubmVjdGlvbiBvcmllbnRlZCBhbmQgY29ubmVjdGlvbi1sZXNzIGRhdGEgdHJhbnNwb3J0LiAgTDJDQVAKKwkgIHN1cHBvcnQgaXMgcmVxdWlyZWQgZm9yIG1vc3QgQmx1ZXRvb3RoIGFwcGxpY2F0aW9ucy4KKworCSAgU2F5IFkgaGVyZSB0byBjb21waWxlIEwyQ0FQIHN1cHBvcnQgaW50byB0aGUga2VybmVsIG9yIHNheSBNIHRvCisJICBjb21waWxlIGl0IGFzIG1vZHVsZSAobDJjYXApLgorCitjb25maWcgQlRfU0NPCisJdHJpc3RhdGUgIlNDTyBsaW5rcyBzdXBwb3J0IgorCWRlcGVuZHMgb24gQlQKKwloZWxwCisJICBTQ08gbGluayBwcm92aWRlcyB2b2ljZSB0cmFuc3BvcnQgb3ZlciBCbHVldG9vdGguICBTQ08gc3VwcG9ydCBpcworCSAgcmVxdWlyZWQgZm9yIHZvaWNlIGFwcGxpY2F0aW9ucyBsaWtlIEhlYWRzZXQgYW5kIEF1ZGlvLgorCisJICBTYXkgWSBoZXJlIHRvIGNvbXBpbGUgU0NPIHN1cHBvcnQgaW50byB0aGUga2VybmVsIG9yIHNheSBNIHRvCisJICBjb21waWxlIGl0IGFzIG1vZHVsZSAoc2NvKS4KKworc291cmNlICJuZXQvYmx1ZXRvb3RoL3JmY29tbS9LY29uZmlnIgorCitzb3VyY2UgIm5ldC9ibHVldG9vdGgvYm5lcC9LY29uZmlnIgorCitzb3VyY2UgIm5ldC9ibHVldG9vdGgvY210cC9LY29uZmlnIgorCitzb3VyY2UgIm5ldC9ibHVldG9vdGgvaGlkcC9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvYmx1ZXRvb3RoL0tjb25maWciCisKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvTWFrZWZpbGUgYi9uZXQvYmx1ZXRvb3RoL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZTQzM2YKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL01ha2VmaWxlCkBAIC0wLDAgKzEsMTMgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBCbHVldG9vdGggc3Vic3lzdGVtLgorIworCitvYmotJChDT05GSUdfQlQpCSs9IGJsdWV0b290aC5vCitvYmotJChDT05GSUdfQlRfTDJDQVApCSs9IGwyY2FwLm8KK29iai0kKENPTkZJR19CVF9TQ08pCSs9IHNjby5vCitvYmotJChDT05GSUdfQlRfUkZDT01NKQkrPSByZmNvbW0vCitvYmotJChDT05GSUdfQlRfQk5FUCkJKz0gYm5lcC8KK29iai0kKENPTkZJR19CVF9DTVRQKQkrPSBjbXRwLworb2JqLSQoQ09ORklHX0JUX0hJRFApCSs9IGhpZHAvCisKK2JsdWV0b290aC1vYmpzIDo9IGFmX2JsdWV0b290aC5vIGhjaV9jb3JlLm8gaGNpX2Nvbm4ubyBoY2lfZXZlbnQubyBoY2lfc29jay5vIGhjaV9zeXNmcy5vIGxpYi5vCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jIGIvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjUwYzZiCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguYwpAQCAtMCwwICsxLDM1NSBAQAorLyogCisgICBCbHVlWiAtIEJsdWV0b290aCBwcm90b2NvbCBzdGFjayBmb3IgTGludXgKKyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIFF1YWxjb21tIEluY29ycG9yYXRlZAorCisgICBXcml0dGVuIDIwMDAsMjAwMSBieSBNYXhpbSBLcmFzbnlhbnNreSA8bWF4a0BxdWFsY29tbS5jb20+CisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQgT0YgVEhJUkQgUEFSVFkgUklHSFRTLgorICAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIoUykgQU5EIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWQorICAgQ0xBSU0sIE9SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgCisgICBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gCisgICBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiAKKyAgIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyAgIEFMTCBMSUFCSUxJVFksIElOQ0xVRElORyBMSUFCSUxJVFkgRk9SIElORlJJTkdFTUVOVCBPRiBBTlkgUEFURU5UUywgCisgICBDT1BZUklHSFRTLCBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUywgUkVMQVRJTkcgVE8gVVNFIE9GIFRISVMgCisgICBTT0ZUV0FSRSBJUyBESVNDTEFJTUVELgorKi8KKworLyogQmx1ZXRvb3RoIGFkZHJlc3MgZmFtaWx5IGFuZCBzb2NrZXRzLiAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2lmIGRlZmluZWQoQ09ORklHX0tNT0QpCisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgorCisjaWZuZGVmIENPTkZJR19CVF9TT0NLX0RFQlVHCisjdW5kZWYgIEJUX0RCRworI2RlZmluZSBCVF9EQkcoRC4uLikKKyNlbmRpZgorCisjZGVmaW5lIFZFUlNJT04gIjIuNyIKKworc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2J0OworRVhQT1JUX1NZTUJPTChwcm9jX2J0KTsKKworLyogQmx1ZXRvb3RoIHNvY2tldHMgKi8KKyNkZWZpbmUgQlRfTUFYX1BST1RPCTgKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSAqYnRfcHJvdG9bQlRfTUFYX1BST1RPXTsKKworaW50IGJ0X3NvY2tfcmVnaXN0ZXIoaW50IHByb3RvLCBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSAqb3BzKQoreworCWlmIChwcm90byA8IDAgfHwgcHJvdG8gPj0gQlRfTUFYX1BST1RPKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChidF9wcm90b1twcm90b10pCisJCXJldHVybiAtRUVYSVNUOworCisJYnRfcHJvdG9bcHJvdG9dID0gb3BzOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChidF9zb2NrX3JlZ2lzdGVyKTsKKworaW50IGJ0X3NvY2tfdW5yZWdpc3RlcihpbnQgcHJvdG8pCit7CisJaWYgKHByb3RvIDwgMCB8fCBwcm90byA+PSBCVF9NQVhfUFJPVE8pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFidF9wcm90b1twcm90b10pCisJCXJldHVybiAtRU5PRU5UOworCisJYnRfcHJvdG9bcHJvdG9dID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYnRfc29ja191bnJlZ2lzdGVyKTsKKworc3RhdGljIGludCBidF9zb2NrX2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgcHJvdG8pCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAocHJvdG8gPCAwIHx8IHByb3RvID49IEJUX01BWF9QUk9UTykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKyNpZiBkZWZpbmVkKENPTkZJR19LTU9EKQorCWlmICghYnRfcHJvdG9bcHJvdG9dKSB7CisJCXJlcXVlc3RfbW9kdWxlKCJidC1wcm90by0lZCIsIHByb3RvKTsKKwl9CisjZW5kaWYKKwllcnIgPSAtRVBST1RPTk9TVVBQT1JUOworCWlmIChidF9wcm90b1twcm90b10gJiYgdHJ5X21vZHVsZV9nZXQoYnRfcHJvdG9bcHJvdG9dLT5vd25lcikpIHsKKwkJZXJyID0gYnRfcHJvdG9bcHJvdG9dLT5jcmVhdGUoc29jaywgcHJvdG8pOworCQltb2R1bGVfcHV0KGJ0X3Byb3RvW3Byb3RvXS0+b3duZXIpOworCX0KKwlyZXR1cm4gZXJyOyAKK30KKwordm9pZCBidF9zb2NrX2xpbmsoc3RydWN0IGJ0X3NvY2tfbGlzdCAqbCwgc3RydWN0IHNvY2sgKnNrKQoreworCXdyaXRlX2xvY2tfYmgoJmwtPmxvY2spOworCXNrX2FkZF9ub2RlKHNrLCAmbC0+aGVhZCk7CisJd3JpdGVfdW5sb2NrX2JoKCZsLT5sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0woYnRfc29ja19saW5rKTsKKwordm9pZCBidF9zb2NrX3VubGluayhzdHJ1Y3QgYnRfc29ja19saXN0ICpsLCBzdHJ1Y3Qgc29jayAqc2spCit7CisJd3JpdGVfbG9ja19iaCgmbC0+bG9jayk7CisJc2tfZGVsX25vZGVfaW5pdChzayk7CisJd3JpdGVfdW5sb2NrX2JoKCZsLT5sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0woYnRfc29ja191bmxpbmspOworCit2b2lkIGJ0X2FjY2VwdF9lbnF1ZXVlKHN0cnVjdCBzb2NrICpwYXJlbnQsIHN0cnVjdCBzb2NrICpzaykKK3sKKwlCVF9EQkcoInBhcmVudCAlcCwgc2sgJXAiLCBwYXJlbnQsIHNrKTsKKworCXNvY2tfaG9sZChzayk7CisJbGlzdF9hZGRfdGFpbCgmYnRfc2soc2spLT5hY2NlcHRfcSwgJmJ0X3NrKHBhcmVudCktPmFjY2VwdF9xKTsKKwlidF9zayhzayktPnBhcmVudCA9IHBhcmVudDsKKwlwYXJlbnQtPnNrX2Fja19iYWNrbG9nKys7Cit9CitFWFBPUlRfU1lNQk9MKGJ0X2FjY2VwdF9lbnF1ZXVlKTsKKwordm9pZCBidF9hY2NlcHRfdW5saW5rKHN0cnVjdCBzb2NrICpzaykKK3sKKwlCVF9EQkcoInNrICVwIHN0YXRlICVkIiwgc2ssIHNrLT5za19zdGF0ZSk7CisKKwlsaXN0X2RlbF9pbml0KCZidF9zayhzayktPmFjY2VwdF9xKTsKKwlidF9zayhzayktPnBhcmVudC0+c2tfYWNrX2JhY2tsb2ctLTsKKwlidF9zayhzayktPnBhcmVudCA9IE5VTEw7CisJc29ja19wdXQoc2spOworfQorRVhQT1JUX1NZTUJPTChidF9hY2NlcHRfdW5saW5rKTsKKworc3RydWN0IHNvY2sgKmJ0X2FjY2VwdF9kZXF1ZXVlKHN0cnVjdCBzb2NrICpwYXJlbnQsIHN0cnVjdCBzb2NrZXQgKm5ld3NvY2spCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKm47CisJc3RydWN0IHNvY2sgKnNrOworCisJQlRfREJHKCJwYXJlbnQgJXAiLCBwYXJlbnQpOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZidF9zayhwYXJlbnQpLT5hY2NlcHRfcSkgeworCQlzayA9IChzdHJ1Y3Qgc29jayAqKSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBidF9zb2NrLCBhY2NlcHRfcSk7CisKKwkJbG9ja19zb2NrKHNrKTsKKworCQkvKiBGSVhNRTogSXMgdGhpcyBjaGVjayBzdGlsbCBuZWVkZWQgKi8KKwkJaWYgKHNrLT5za19zdGF0ZSA9PSBCVF9DTE9TRUQpIHsKKwkJCXJlbGVhc2Vfc29jayhzayk7CisJCQlidF9hY2NlcHRfdW5saW5rKHNrKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHNrLT5za19zdGF0ZSA9PSBCVF9DT05ORUNURUQgfHwgIW5ld3NvY2spIHsKKwkJCWJ0X2FjY2VwdF91bmxpbmsoc2spOworCQkJaWYgKG5ld3NvY2spCisJCQkJc29ja19ncmFmdChzaywgbmV3c29jayk7CisJCQlyZWxlYXNlX3NvY2soc2spOworCQkJcmV0dXJuIHNrOworCQl9CisKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGJ0X2FjY2VwdF9kZXF1ZXVlKTsKKworaW50IGJ0X3NvY2tfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLCBpbnQgZmxhZ3MpCit7CisJaW50IG5vYmxvY2sgPSBmbGFncyAmIE1TR19ET05UV0FJVDsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXNpemVfdCBjb3BpZWQ7CisJaW50IGVycjsKKworCUJUX0RCRygic29jayAlcCBzayAlcCBsZW4gJWQiLCBzb2NrLCBzaywgbGVuKTsKKworCWlmIChmbGFncyAmIChNU0dfT09CKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKCEoc2tiID0gc2tiX3JlY3ZfZGF0YWdyYW0oc2ssIGZsYWdzLCBub2Jsb2NrLCAmZXJyKSkpIHsKKwkJaWYgKHNrLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikKKwkJCXJldHVybiAwOworCQlyZXR1cm4gZXJyOworCX0KKworCW1zZy0+bXNnX25hbWVsZW4gPSAwOworCisJY29waWVkID0gc2tiLT5sZW47CisJaWYgKGxlbiA8IGNvcGllZCkgeworCQltc2ctPm1zZ19mbGFncyB8PSBNU0dfVFJVTkM7CisJCWNvcGllZCA9IGxlbjsKKwl9CisKKwlza2ItPmgucmF3ID0gc2tiLT5kYXRhOworCWVyciA9IHNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgMCwgbXNnLT5tc2dfaW92LCBjb3BpZWQpOworCisJc2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7CisKKwlyZXR1cm4gZXJyID8gOiBjb3BpZWQ7Cit9CitFWFBPUlRfU1lNQk9MKGJ0X3NvY2tfcmVjdm1zZyk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGJ0X2FjY2VwdF9wb2xsKHN0cnVjdCBzb2NrICpwYXJlbnQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKm47CisJc3RydWN0IHNvY2sgKnNrOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZidF9zayhwYXJlbnQpLT5hY2NlcHRfcSkgeworCQlzayA9IChzdHJ1Y3Qgc29jayAqKSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBidF9zb2NrLCBhY2NlcHRfcSk7CisJCWlmIChzay0+c2tfc3RhdGUgPT0gQlRfQ09OTkVDVEVEKQorCQkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGludCBidF9zb2NrX3BvbGwoc3RydWN0IGZpbGUgKiBmaWxlLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCUJUX0RCRygic29jayAlcCwgc2sgJXAiLCBzb2NrLCBzayk7CisKKwlwb2xsX3dhaXQoZmlsZSwgc2stPnNrX3NsZWVwLCB3YWl0KTsKKworCWlmIChzay0+c2tfc3RhdGUgPT0gQlRfTElTVEVOKQorCQlyZXR1cm4gYnRfYWNjZXB0X3BvbGwoc2spOworCisJaWYgKHNrLT5za19lcnIgfHwgIXNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX2Vycm9yX3F1ZXVlKSkKKwkJbWFzayB8PSBQT0xMRVJSOworCisJaWYgKHNrLT5za19zaHV0ZG93biA9PSBTSFVURE9XTl9NQVNLKQorCQltYXNrIHw9IFBPTExIVVA7CisKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3JlY2VpdmVfcXVldWUpIHx8IAorCQkJKHNrLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKworCWlmIChzay0+c2tfc3RhdGUgPT0gQlRfQ0xPU0VEKQorCQltYXNrIHw9IFBPTExIVVA7CisKKwlpZiAoc2stPnNrX3N0YXRlID09IEJUX0NPTk5FQ1QgfHwKKwkJCXNrLT5za19zdGF0ZSA9PSBCVF9DT05ORUNUMiB8fAorCQkJc2stPnNrX3N0YXRlID09IEJUX0NPTkZJRykKKwkJcmV0dXJuIG1hc2s7CisKKwlpZiAoc29ja193cml0ZWFibGUoc2spKQorCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNIHwgUE9MTFdSQkFORDsKKwllbHNlCisJCXNldF9iaXQoU09DS19BU1lOQ19OT1NQQUNFLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOworCisJcmV0dXJuIG1hc2s7Cit9CitFWFBPUlRfU1lNQk9MKGJ0X3NvY2tfcG9sbCk7CisKK2ludCBidF9zb2NrX3dhaXRfc3RhdGUoc3RydWN0IHNvY2sgKnNrLCBpbnQgc3RhdGUsIHVuc2lnbmVkIGxvbmcgdGltZW8pCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJaW50IGVyciA9IDA7CisKKwlCVF9EQkcoInNrICVwIiwgc2spOworCisJYWRkX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJd2hpbGUgKHNrLT5za19zdGF0ZSAhPSBzdGF0ZSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCWlmICghdGltZW8pIHsKKwkJCWVyciA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJZXJyID0gc29ja19pbnRyX2Vycm5vKHRpbWVvKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJdGltZW8gPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvKTsKKwkJbG9ja19zb2NrKHNrKTsKKworCQlpZiAoc2stPnNrX2VycikgeworCQkJZXJyID0gc29ja19lcnJvcihzayk7CisJCQlicmVhazsKKwkJfQorCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGJ0X3NvY2tfd2FpdF9zdGF0ZSk7CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSBidF9zb2NrX2ZhbWlseV9vcHMgPSB7CisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmZhbWlseQk9IFBGX0JMVUVUT09USCwKKwkuY3JlYXRlCT0gYnRfc29ja19jcmVhdGUsCit9OworCitleHRlcm4gaW50IGhjaV9zb2NrX2luaXQodm9pZCk7CitleHRlcm4gaW50IGhjaV9zb2NrX2NsZWFudXAodm9pZCk7CisKK2V4dGVybiBpbnQgYnRfc3lzZnNfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgYnRfc3lzZnNfY2xlYW51cCh2b2lkKTsKKworc3RhdGljIGludCBfX2luaXQgYnRfaW5pdCh2b2lkKQoreworCUJUX0lORk8oIkNvcmUgdmVyICVzIiwgVkVSU0lPTik7CisKKwlwcm9jX2J0ID0gcHJvY19ta2RpcigiYmx1ZXRvb3RoIiwgTlVMTCk7CisJaWYgKHByb2NfYnQpCisJCXByb2NfYnQtPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwlzb2NrX3JlZ2lzdGVyKCZidF9zb2NrX2ZhbWlseV9vcHMpOworCisJQlRfSU5GTygiSENJIGRldmljZSBhbmQgY29ubmVjdGlvbiBtYW5hZ2VyIGluaXRpYWxpemVkIik7CisKKwlidF9zeXNmc19pbml0KCk7CisKKwloY2lfc29ja19pbml0KCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGJ0X2V4aXQodm9pZCkKK3sKKwloY2lfc29ja19jbGVhbnVwKCk7CisKKwlidF9zeXNmc19jbGVhbnVwKCk7CisKKwlzb2NrX3VucmVnaXN0ZXIoUEZfQkxVRVRPT1RIKTsKKworCXJlbW92ZV9wcm9jX2VudHJ5KCJibHVldG9vdGgiLCBOVUxMKTsKK30KKworc3Vic3lzX2luaXRjYWxsKGJ0X2luaXQpOworbW9kdWxlX2V4aXQoYnRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1heGltIEtyYXNueWFuc2t5IDxtYXhrQHF1YWxjb21tLmNvbT4sIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmx1ZXRvb3RoIENvcmUgdmVyICIgVkVSU0lPTik7CitNT0RVTEVfVkVSU0lPTihWRVJTSU9OKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19ORVRQUk9UTyhQRl9CTFVFVE9PVEgpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9ibmVwL0tjb25maWcgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTE1OGIwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9ibmVwL0tjb25maWcKQEAgLTAsMCArMSwyNCBAQAorY29uZmlnIEJUX0JORVAKKwl0cmlzdGF0ZSAiQk5FUCBwcm90b2NvbCBzdXBwb3J0IgorCWRlcGVuZHMgb24gQlQgJiYgQlRfTDJDQVAKKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBCTkVQIChCbHVldG9vdGggTmV0d29yayBFbmNhcHN1bGF0aW9uIFByb3RvY29sKSBpcyBFdGhlcm5ldAorCSAgZW11bGF0aW9uIGxheWVyIG9uIHRvcCBvZiBCbHVldG9vdGguICBCTkVQIGlzIHJlcXVpcmVkIGZvcgorCSAgQmx1ZXRvb3RoIFBBTiAoUGVyc29uYWwgQXJlYSBOZXR3b3JrKS4KKworCSAgU2F5IFkgaGVyZSB0byBjb21waWxlIEJORVAgc3VwcG9ydCBpbnRvIHRoZSBrZXJuZWwgb3Igc2F5IE0gdG8KKwkgIGNvbXBpbGUgaXQgYXMgbW9kdWxlIChibmVwKS4KKworY29uZmlnIEJUX0JORVBfTUNfRklMVEVSCisJYm9vbCAiTXVsdGljYXN0IGZpbHRlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gQlRfQk5FUAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIG11bHRpY2FzdCBmaWx0ZXIgc3VwcG9ydCBmb3IgQk5FUC4KKworY29uZmlnIEJUX0JORVBfUFJPVE9fRklMVEVSCisJYm9vbCAiUHJvdG9jb2wgZmlsdGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBCVF9CTkVQCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgcHJvdG9jb2wgZmlsdGVyIHN1cHBvcnQgZm9yIEJORVAuCisKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvYm5lcC9NYWtlZmlsZSBiL25ldC9ibHVldG9vdGgvYm5lcC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzgyMWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9ibmVwL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IEJsdWV0b290aCBCTkVQIGxheWVyLgorIworCitvYmotJChDT05GSUdfQlRfQk5FUCkgKz0gYm5lcC5vCisKK2JuZXAtb2JqcyA6PSBjb3JlLm8gc29jay5vIG5ldGRldi5vCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2JuZXAvYm5lcC5oIGIvbmV0L2JsdWV0b290aC9ibmVwL2JuZXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmIxZWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9ibmVwL2JuZXAuaApAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAgQk5FUCBwcm90b2NvbCBkZWZpbml0aW9uIGZvciBMaW51eCBCbHVldG9vdGggc3RhY2sgKEJsdWVaKS4KKyAgQ29weXJpZ2h0IChDKSAyMDAyIE1heGltIEtyYXNueWFuc2t5IDxtYXhrQHF1YWxjb21tLmNvbT4KKwkKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorKi8KKworLyoKKyAqICRJZDogYm5lcC5oLHYgMS41IDIwMDIvMDgvMDQgMjE6MjM6NTggbWF4ayBFeHAgJAorICovCisKKyNpZm5kZWYgX0JORVBfSAorI2RlZmluZSBfQk5FUF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KKworLy8gTGltaXRzCisjZGVmaW5lIEJORVBfTUFYX1BST1RPX0ZJTFRFUlMgICAgIDUKKyNkZWZpbmUgQk5FUF9NQVhfTVVMVElDQVNUX0ZJTFRFUlMgMjAKKworLy8gVVVJRHMKKyNkZWZpbmUgQk5FUF9CQVNFX1VVSUQgMHgwMDAwMDAwMDAwMDAxMDAwODAwMDAwODA1RjlCMzRGQgorI2RlZmluZSBCTkVQX1VVSUQxNiAgICAweDAyCisjZGVmaW5lIEJORVBfVVVJRDMyICAgIDB4MDQKKyNkZWZpbmUgQk5FUF9VVUlEMTI4ICAgMHgxNgorCisjZGVmaW5lIEJORVBfU1ZDX1BBTlUgIDB4MTExNQorI2RlZmluZSBCTkVQX1NWQ19OQVAgICAweDExMTYKKyNkZWZpbmUgQk5FUF9TVkNfR04gICAgMHgxMTE3CisKKy8vIFBhY2tldCB0eXBlcworI2RlZmluZSBCTkVQX0dFTkVSQUwgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEJORVBfQ09OVFJPTCAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQk5FUF9DT01QUkVTU0VEICAgICAgICAgICAgMHgwMgorI2RlZmluZSBCTkVQX0NPTVBSRVNTRURfU1JDX09OTFkgICAweDAzCisjZGVmaW5lIEJORVBfQ09NUFJFU1NFRF9EU1RfT05MWSAgIDB4MDQKKworLy8gQ29udHJvbCB0eXBlcworI2RlZmluZSBCTkVQX0NNRF9OT1RfVU5ERVJTVE9PRCAgICAweDAwCisjZGVmaW5lIEJORVBfU0VUVVBfQ09OTl9SRVEgICAgICAgIDB4MDEKKyNkZWZpbmUgQk5FUF9TRVRVUF9DT05OX1JTUCAgICAgICAgMHgwMgorI2RlZmluZSBCTkVQX0ZJTFRFUl9ORVRfVFlQRV9TRVQgICAweDAzCisjZGVmaW5lIEJORVBfRklMVEVSX05FVF9UWVBFX1JTUCAgIDB4MDQKKyNkZWZpbmUgQk5FUF9GSUxURVJfTVVMVElfQUREUl9TRVQgMHgwNQorI2RlZmluZSBCTkVQX0ZJTFRFUl9NVUxUSV9BRERSX1JTUCAweDA2CisKKy8vIEV4dGVuc2lvbiB0eXBlcworI2RlZmluZSBCTkVQX0VYVF9DT05UUk9MICAgICAgICAgICAweDAwCisKKy8vIFJlc3BvbnNlIG1lc3NhZ2VzIAorI2RlZmluZSBCTkVQX1NVQ0NFU1MgICAgICAgICAgICAgICAweDAwCisKKyNkZWZpbmUgQk5FUF9DT05OX0lOVkFMSURfRFNUICAgICAgMHgwMQorI2RlZmluZSBCTkVQX0NPTk5fSU5WQUxJRF9TUkMgICAgICAweDAyCisjZGVmaW5lIEJORVBfQ09OTl9JTlZBTElEX1NWQyAgICAgIDB4MDMKKyNkZWZpbmUgQk5FUF9DT05OX05PVF9BTExPV0VEICAgICAgMHgwNAorCisjZGVmaW5lIEJORVBfRklMVEVSX1VOU1VQUE9SVEVEX1JFUSAgICAweDAxCisjZGVmaW5lIEJORVBfRklMVEVSX0lOVkFMSURfUkFOR0UgICAgICAweDAyCisjZGVmaW5lIEJORVBfRklMVEVSX0lOVkFMSURfTUNBRERSICAgICAweDAyCisjZGVmaW5lIEJORVBfRklMVEVSX0xJTUlUX1JFQUNIRUQgICAgICAweDAzCisjZGVmaW5lIEJORVBfRklMVEVSX0RFTklFRF9TRUNVUklUWSAgICAweDA0CisKKy8vIEwyQ0FQIHNldHRpbmdzCisjZGVmaW5lIEJORVBfTVRVICAgICAgICAgMTY5MQorI2RlZmluZSBCTkVQX1BTTQkgMHgwZgorI2RlZmluZSBCTkVQX0ZMVVNIX1RPICAgIDB4ZmZmZgorI2RlZmluZSBCTkVQX0NPTk5FQ1RfVE8gIDE1CisjZGVmaW5lIEJORVBfRklMVEVSX1RPICAgMTUKKworLy8gSGVhZGVycyAKKyNkZWZpbmUgQk5FUF9UWVBFX01BU0sJIDB4N2YKKyNkZWZpbmUgQk5FUF9FWFRfSEVBREVSCSAweDgwCisKK3N0cnVjdCBibmVwX3NldHVwX2Nvbm5fcmVxIHsKKwlfX3U4ICB0eXBlOworCV9fdTggIGN0cmw7CisJX191OCAgdXVpZF9zaXplOworCV9fdTggIHNlcnZpY2VbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgYm5lcF9zZXRfZmlsdGVyX3JlcSB7CisJX191OCAgdHlwZTsKKwlfX3U4ICBjdHJsOworCV9fdTE2IGxlbjsKKwlfX3U4ICBsaXN0WzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGJuZXBfY29udHJvbF9yc3AgeworCV9fdTggIHR5cGU7CisJX191OCAgY3RybDsKKwlfX3UxNiByZXNwOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGJuZXBfZXh0X2hkciB7CisJX191OCAgdHlwZTsKKwlfX3U4ICBsZW47CisJX191OCAgZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIEJORVAgaW9jdGwgZGVmaW5lcyAqLworI2RlZmluZSBCTkVQQ09OTkFERAlfSU9XKCdCJywgMjAwLCBpbnQpCisjZGVmaW5lIEJORVBDT05OREVMCV9JT1coJ0InLCAyMDEsIGludCkKKyNkZWZpbmUgQk5FUEdFVENPTk5MSVNUCV9JT1IoJ0InLCAyMTAsIGludCkKKyNkZWZpbmUgQk5FUEdFVENPTk5JTkZPCV9JT1IoJ0InLCAyMTEsIGludCkKKworc3RydWN0IGJuZXBfY29ubmFkZF9yZXEgeworCWludCAgIHNvY2s7ICAgICAgIC8vIENvbm5lY3RlZCBzb2NrZXQKKwlfX3UzMiBmbGFnczsKKwlfX3UxNiByb2xlOworCWNoYXIgIGRldmljZVsxNl07IC8vIE5hbWUgb2YgdGhlIEV0aGVybmV0IGRldmljZQorfTsKKworc3RydWN0IGJuZXBfY29ubmRlbF9yZXEgeworCV9fdTMyIGZsYWdzOworCV9fdTggIGRzdFtFVEhfQUxFTl07Cit9OworCitzdHJ1Y3QgYm5lcF9jb25uaW5mbyB7CisJX191MzIgZmxhZ3M7CisJX191MTYgcm9sZTsKKwlfX3UxNiBzdGF0ZTsJCisJX191OCAgZHN0W0VUSF9BTEVOXTsKKwljaGFyICBkZXZpY2VbMTZdOworfTsKKworc3RydWN0IGJuZXBfY29ubmxpc3RfcmVxIHsKKwlfX3UzMiAgY251bTsKKwlzdHJ1Y3QgYm5lcF9jb25uaW5mbyBfX3VzZXIgKmNpOworfTsKKworc3RydWN0IGJuZXBfcHJvdG9fZmlsdGVyIHsKKwlfX3UxNiBzdGFydDsKKwlfX3UxNiBlbmQ7Cit9OworCitpbnQgYm5lcF9hZGRfY29ubmVjdGlvbihzdHJ1Y3QgYm5lcF9jb25uYWRkX3JlcSAqcmVxLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrKTsKK2ludCBibmVwX2RlbF9jb25uZWN0aW9uKHN0cnVjdCBibmVwX2Nvbm5kZWxfcmVxICpyZXEpOworaW50IGJuZXBfZ2V0X2Nvbm5saXN0KHN0cnVjdCBibmVwX2Nvbm5saXN0X3JlcSAqcmVxKTsKK2ludCBibmVwX2dldF9jb25uaW5mbyhzdHJ1Y3QgYm5lcF9jb25uaW5mbyAqY2kpOworCisvLyBCTkVQIHNlc3Npb25zCitzdHJ1Y3QgYm5lcF9zZXNzaW9uIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJCisJdW5zaWduZWQgaW50ICByb2xlOworICAgICAgICB1bnNpZ25lZCBsb25nIHN0YXRlOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCWF0b21pY190ICAgICAga2lsbGVkOworCisJc3RydWN0IGV0aGhkciBlaDsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKworCXN0cnVjdCBibmVwX3Byb3RvX2ZpbHRlciBwcm90b19maWx0ZXJbQk5FUF9NQVhfUFJPVE9fRklMVEVSU107CisJdTY0ICAgIG1jX2ZpbHRlcjsKKwkKKwlzdHJ1Y3Qgc29ja2V0ICAgICpzb2NrOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7Cit9OworCit2b2lkIGJuZXBfbmV0X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IGJuZXBfc29ja19pbml0KHZvaWQpOworaW50IGJuZXBfc29ja19jbGVhbnVwKHZvaWQpOworCitzdGF0aWMgaW5saW5lIGludCBibmVwX21jX2hhc2goX191OCAqYWRkcikKK3sKKyAgICAgICAgcmV0dXJuIChjcmMzMl9iZSh+MCwgYWRkciwgRVRIX0FMRU4pID4+IDI2KTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2JuZXAvY29yZS5jIGIvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODJiZjIwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYwpAQCAtMCwwICsxLDcxMyBAQAorLyogCisgICBCTkVQIGltcGxlbWVudGF0aW9uIGZvciBMaW51eCBCbHVldG9vdGggc3RhY2sgKEJsdWVaKS4KKyAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEludmVudGVsIFN5c3RlbWVzCisgICBXcml0dGVuIDIwMDEtMjAwMiBieQorCUNs6W1lbnQgTW9yZWF1IDxjbGVtZW50Lm1vcmVhdUBpbnZlbnRlbC5mcj4KKwlEYXZpZCBMaWJhdWx0ICA8ZGF2aWQubGliYXVsdEBpbnZlbnRlbC5mcj4KKworICAgQ29weXJpZ2h0IChDKSAyMDAyIE1heGltIEtyYXNueWFuc2t5IDxtYXhrQHF1YWxjb21tLmNvbT4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBBTkQgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyAKKyAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiAKKyAgIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIAorICAgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworICAgQUxMIExJQUJJTElUWSwgSU5DTFVESU5HIExJQUJJTElUWSBGT1IgSU5GUklOR0VNRU5UIE9GIEFOWSBQQVRFTlRTLCAKKyAgIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLCBSRUxBVElORyBUTyBVU0UgT0YgVEhJUyAKKyAgIFNPRlRXQVJFIElTIERJU0NMQUlNRUQuCisqLworCisvKgorICogJElkOiBjb3JlLmMsdiAxLjIwIDIwMDIvMDgvMDQgMjE6MjM6NTggbWF4ayBFeHAgJAorICovIAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2wyY2FwLmg+CisKKyNpbmNsdWRlICJibmVwLmgiCisKKyNpZm5kZWYgQ09ORklHX0JUX0JORVBfREVCVUcKKyN1bmRlZiAgQlRfREJHCisjZGVmaW5lIEJUX0RCRyhELi4uKQorI2VuZGlmCisKKyNkZWZpbmUgVkVSU0lPTiAiMS4yIgorCitzdGF0aWMgTElTVF9IRUFEKGJuZXBfc2Vzc2lvbl9saXN0KTsKK3N0YXRpYyBERUNMQVJFX1JXU0VNKGJuZXBfc2Vzc2lvbl9zZW0pOworCitzdGF0aWMgc3RydWN0IGJuZXBfc2Vzc2lvbiAqX19ibmVwX2dldF9zZXNzaW9uKHU4ICpkc3QpCit7CisJc3RydWN0IGJuZXBfc2Vzc2lvbiAqczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCisJQlRfREJHKCIiKTsKKworCWxpc3RfZm9yX2VhY2gocCwgJmJuZXBfc2Vzc2lvbl9saXN0KSB7CisJCXMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBibmVwX3Nlc3Npb24sIGxpc3QpOwkKKwkJaWYgKCFtZW1jbXAoZHN0LCBzLT5laC5oX3NvdXJjZSwgRVRIX0FMRU4pKQorCQkJcmV0dXJuIHM7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBfX2JuZXBfbGlua19zZXNzaW9uKHN0cnVjdCBibmVwX3Nlc3Npb24gKnMpCit7CisJLyogSXQncyBzYWZlIHRvIGNhbGwgX19tb2R1bGVfZ2V0KCkgaGVyZSBiZWNhdXNlIHNlc3Npb25zIGFyZSBhZGRlZAorCSAgIGJ5IHRoZSBzb2NrZXQgbGF5ZXIgd2hpY2ggaGFzIHRvIGhvbGQgdGhlIHJlZmZlcmVuY2UgdG8gdGhpcyBtb2R1bGUuCisJICovCisJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKwlsaXN0X2FkZCgmcy0+bGlzdCwgJmJuZXBfc2Vzc2lvbl9saXN0KTsJCit9CisKK3N0YXRpYyB2b2lkIF9fYm5lcF91bmxpbmtfc2Vzc2lvbihzdHJ1Y3QgYm5lcF9zZXNzaW9uICpzKQoreworCWxpc3RfZGVsKCZzLT5saXN0KTsKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKK30KKworc3RhdGljIGludCBibmVwX3NlbmQoc3RydWN0IGJuZXBfc2Vzc2lvbiAqcywgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gcy0+c29jazsKKwlzdHJ1Y3Qga3ZlYyBpdiA9IHsgZGF0YSwgbGVuIH07CisKKwlyZXR1cm4ga2VybmVsX3NlbmRtc2coc29jaywgJnMtPm1zZywgJml2LCAxLCBsZW4pOworfQorCitzdGF0aWMgaW50IGJuZXBfc2VuZF9yc3Aoc3RydWN0IGJuZXBfc2Vzc2lvbiAqcywgdTggY3RybCwgdTE2IHJlc3ApCit7CisJc3RydWN0IGJuZXBfY29udHJvbF9yc3AgcnNwOworCXJzcC50eXBlID0gQk5FUF9DT05UUk9MOworCXJzcC5jdHJsID0gY3RybDsKKwlyc3AucmVzcCA9IGh0b25zKHJlc3ApOworCXJldHVybiBibmVwX3NlbmQocywgJnJzcCwgc2l6ZW9mKHJzcCkpOworfQorCisjaWZkZWYgQ09ORklHX0JUX0JORVBfUFJPVE9fRklMVEVSCitzdGF0aWMgaW5saW5lIHZvaWQgYm5lcF9zZXRfZGVmYXVsdF9wcm90b19maWx0ZXIoc3RydWN0IGJuZXBfc2Vzc2lvbiAqcykKK3sKKwkvKiAoSVB2NCwgQVJQKSAgKi8KKwlzLT5wcm90b19maWx0ZXJbMF0uc3RhcnQgPSBodG9ucygweDA4MDApOworCXMtPnByb3RvX2ZpbHRlclswXS5lbmQgICA9IGh0b25zKDB4MDgwNik7CisJLyogKFJBUlAsIEFwcGxlVGFsaykgKi8KKwlzLT5wcm90b19maWx0ZXJbMV0uc3RhcnQgPSBodG9ucygweDgwMzUpOworCXMtPnByb3RvX2ZpbHRlclsxXS5lbmQgICA9IGh0b25zKDB4ODBGMyk7CisJLyogKElQWCwgSVB2NikgKi8KKwlzLT5wcm90b19maWx0ZXJbMl0uc3RhcnQgPSBodG9ucygweDgxMzcpOworCXMtPnByb3RvX2ZpbHRlclsyXS5lbmQgICA9IGh0b25zKDB4ODZERCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBibmVwX2N0cmxfc2V0X25ldGZpbHRlcihzdHJ1Y3QgYm5lcF9zZXNzaW9uICpzLCB1MTYgKmRhdGEsIGludCBsZW4pCit7CisJaW50IG47CisKKwlpZiAobGVuIDwgMikKKwkJcmV0dXJuIC1FSUxTRVE7CisKKwluID0gbnRvaHMoZ2V0X3VuYWxpZ25lZChkYXRhKSk7CisJZGF0YSsrOyBsZW4gLT0gMjsKKworCWlmIChsZW4gPCBuKQorCQlyZXR1cm4gLUVJTFNFUTsKKworCUJUX0RCRygiZmlsdGVyIGxlbiAlZCIsIG4pOworCisjaWZkZWYgQ09ORklHX0JUX0JORVBfUFJPVE9fRklMVEVSCisJbiAvPSA0OworCWlmIChuIDw9IEJORVBfTUFYX1BST1RPX0ZJTFRFUlMpIHsKKwkJc3RydWN0IGJuZXBfcHJvdG9fZmlsdGVyICpmID0gcy0+cHJvdG9fZmlsdGVyOworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQlmW2ldLnN0YXJ0ID0gZ2V0X3VuYWxpZ25lZChkYXRhKyspOworCQkJZltpXS5lbmQgICA9IGdldF91bmFsaWduZWQoZGF0YSsrKTsKKworCQkJQlRfREJHKCJwcm90byBmaWx0ZXIgc3RhcnQgJWQgZW5kICVkIiwKKwkJCQlmW2ldLnN0YXJ0LCBmW2ldLmVuZCk7CisJCX0KKworCQlpZiAoaSA8IEJORVBfTUFYX1BST1RPX0ZJTFRFUlMpCisJCQltZW1zZXQoZiArIGksIDAsIHNpemVvZigqZikpOworCisJCWlmIChuID09IDApCisJCQlibmVwX3NldF9kZWZhdWx0X3Byb3RvX2ZpbHRlcihzKTsKKworCQlibmVwX3NlbmRfcnNwKHMsIEJORVBfRklMVEVSX05FVF9UWVBFX1JTUCwgQk5FUF9TVUNDRVNTKTsKKwl9IGVsc2UgeworCQlibmVwX3NlbmRfcnNwKHMsIEJORVBfRklMVEVSX05FVF9UWVBFX1JTUCwgQk5FUF9GSUxURVJfTElNSVRfUkVBQ0hFRCk7CisJfQorI2Vsc2UKKwlibmVwX3NlbmRfcnNwKHMsIEJORVBfRklMVEVSX05FVF9UWVBFX1JTUCwgQk5FUF9GSUxURVJfVU5TVVBQT1JURURfUkVRKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJuZXBfY3RybF9zZXRfbWNmaWx0ZXIoc3RydWN0IGJuZXBfc2Vzc2lvbiAqcywgdTggKmRhdGEsIGludCBsZW4pCit7CisJaW50IG47CisKKwlpZiAobGVuIDwgMikKKwkJcmV0dXJuIC1FSUxTRVE7CisKKwluID0gbnRvaHMoZ2V0X3VuYWxpZ25lZCgodTE2ICopIGRhdGEpKTsgCisJZGF0YSArPSAyOyBsZW4gLT0gMjsKKworCWlmIChsZW4gPCBuKQorCQlyZXR1cm4gLUVJTFNFUTsKKworCUJUX0RCRygiZmlsdGVyIGxlbiAlZCIsIG4pOworCisjaWZkZWYgQ09ORklHX0JUX0JORVBfTUNfRklMVEVSCisJbiAvPSAoRVRIX0FMRU4gKiAyKTsKKworCWlmIChuID4gMCkgeworCQlzLT5tY19maWx0ZXIgPSAwOworCisJCS8qIEFsd2F5cyBzZW5kIGJyb2FkY2FzdCAqLworCQlzZXRfYml0KGJuZXBfbWNfaGFzaChzLT5kZXYtPmJyb2FkY2FzdCksICh1bG9uZyAqKSAmcy0+bWNfZmlsdGVyKTsKKworCQkvKiBBZGQgYWRkcmVzcyByYW5nZXMgdG8gdGhlIG11bHRpY2FzdCBoYXNoICovCisJCWZvciAoOyBuID4gMDsgbi0tKSB7CisJCQl1OCBhMVs2XSwgKmEyOworCisJCQltZW1jcHkoYTEsIGRhdGEsIEVUSF9BTEVOKTsgZGF0YSArPSBFVEhfQUxFTjsKKwkJCWEyID0gZGF0YTsgZGF0YSArPSBFVEhfQUxFTjsKKwkKKwkJCUJUX0RCRygibWMgZmlsdGVyICVzIC0+ICVzIiwKKwkJCQliYXRvc3RyKCh2b2lkICopIGExKSwgYmF0b3N0cigodm9pZCAqKSBhMikpOworCisJCQkjZGVmaW5lIElOQ0EoYSkgeyBpbnQgaSA9IDU7IHdoaWxlIChpID49MCAmJiArK2FbaS0tXSA9PSAwKTsgfQorCisJCQkvKiBJdGVyYXRlIGZyb20gYTEgdG8gYTIgKi8KKwkJCXNldF9iaXQoYm5lcF9tY19oYXNoKGExKSwgKHVsb25nICopICZzLT5tY19maWx0ZXIpOworCQkJd2hpbGUgKG1lbWNtcChhMSwgYTIsIDYpIDwgMCAmJiBzLT5tY19maWx0ZXIgIT0gfjBMTCkgeworCQkJCUlOQ0EoYTEpOworCQkJCXNldF9iaXQoYm5lcF9tY19oYXNoKGExKSwgKHVsb25nICopICZzLT5tY19maWx0ZXIpOworCQkJfQorCQl9CisJfQorCisJQlRfREJHKCJtYyBmaWx0ZXIgaGFzaCAweCVsbHgiLCBzLT5tY19maWx0ZXIpOworCisJYm5lcF9zZW5kX3JzcChzLCBCTkVQX0ZJTFRFUl9NVUxUSV9BRERSX1JTUCwgQk5FUF9TVUNDRVNTKTsKKyNlbHNlCisJYm5lcF9zZW5kX3JzcChzLCBCTkVQX0ZJTFRFUl9NVUxUSV9BRERSX1JTUCwgQk5FUF9GSUxURVJfVU5TVVBQT1JURURfUkVRKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJuZXBfcnhfY29udHJvbChzdHJ1Y3QgYm5lcF9zZXNzaW9uICpzLCB2b2lkICpkYXRhLCBpbnQgbGVuKQoreworCXU4ICBjbWQgPSAqKHU4ICopZGF0YTsKKwlpbnQgZXJyID0gMDsKKworCWRhdGErKzsgbGVuLS07CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQk5FUF9DTURfTk9UX1VOREVSU1RPT0Q6CisJY2FzZSBCTkVQX1NFVFVQX0NPTk5fUkVROgorCWNhc2UgQk5FUF9TRVRVUF9DT05OX1JTUDoKKwljYXNlIEJORVBfRklMVEVSX05FVF9UWVBFX1JTUDoKKwljYXNlIEJORVBfRklMVEVSX01VTFRJX0FERFJfUlNQOgorCQkvKiBJZ25vcmUgdGhlc2UgZm9yIG5vdyAqLworCQlicmVhazsKKworCWNhc2UgQk5FUF9GSUxURVJfTkVUX1RZUEVfU0VUOgorCQllcnIgPSBibmVwX2N0cmxfc2V0X25ldGZpbHRlcihzLCBkYXRhLCBsZW4pOworCQlicmVhazsKKworCWNhc2UgQk5FUF9GSUxURVJfTVVMVElfQUREUl9TRVQ6CisJCWVyciA9IGJuZXBfY3RybF9zZXRfbWNmaWx0ZXIocywgZGF0YSwgbGVuKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OiB7CisJCQl1OCBwa3RbM107CisJCQlwa3RbMF0gPSBCTkVQX0NPTlRST0w7CisJCQlwa3RbMV0gPSBCTkVQX0NNRF9OT1RfVU5ERVJTVE9PRDsKKwkJCXBrdFsyXSA9IGNtZDsKKwkJCWJuZXBfc2VuZChzLCBwa3QsIHNpemVvZihwa3QpKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGJuZXBfcnhfZXh0ZW5zaW9uKHN0cnVjdCBibmVwX3Nlc3Npb24gKnMsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGJuZXBfZXh0X2hkciAqaDsKKwlpbnQgZXJyID0gMDsKKworCWRvIHsKKwkJaCA9ICh2b2lkICopIHNrYi0+ZGF0YTsKKwkJaWYgKCFza2JfcHVsbChza2IsIHNpemVvZigqaCkpKSB7CisJCQllcnIgPSAtRUlMU0VROworCQkJYnJlYWs7CisJCX0KKworCQlCVF9EQkcoInR5cGUgMHgleCBsZW4gJWQiLCBoLT50eXBlLCBoLT5sZW4pOworCQorCQlzd2l0Y2ggKGgtPnR5cGUgJiBCTkVQX1RZUEVfTUFTSykgeworCQljYXNlIEJORVBfRVhUX0NPTlRST0w6CisJCQlibmVwX3J4X2NvbnRyb2wocywgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJLyogVW5rbm93biBleHRlbnNpb24sIHNraXAgaXQuICovCisJCQlicmVhazsKKwkJfQorCisJCWlmICghc2tiX3B1bGwoc2tiLCBoLT5sZW4pKSB7CisJCQllcnIgPSAtRUlMU0VROworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICghZXJyICYmIChoLT50eXBlICYgQk5FUF9FWFRfSEVBREVSKSk7CisJCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHU4IF9fYm5lcF9yeF9obGVuW10gPSB7CisJRVRIX0hMRU4sICAgICAvKiBCTkVQX0dFTkVSQUwgKi8KKwkwLCAgICAgICAgICAgIC8qIEJORVBfQ09OVFJPTCAqLworCTIsICAgICAgICAgICAgLyogQk5FUF9DT01QUkVTU0VEICovCisJRVRIX0FMRU4gKyAyLCAvKiBCTkVQX0NPTVBSRVNTRURfU1JDX09OTFkgKi8KKwlFVEhfQUxFTiArIDIgIC8qIEJORVBfQ09NUFJFU1NFRF9EU1RfT05MWSAqLworfTsKKyNkZWZpbmUgQk5FUF9SWF9UWVBFUwkoc2l6ZW9mKF9fYm5lcF9yeF9obGVuKSAtIDEpCisKK3N0YXRpYyBpbmxpbmUgaW50IGJuZXBfcnhfZnJhbWUoc3RydWN0IGJuZXBfc2Vzc2lvbiAqcywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcy0+ZGV2OworCXN0cnVjdCBza19idWZmICpuc2tiOworCXU4IHR5cGU7CisKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCXMtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCisJdHlwZSA9ICoodTggKikgc2tiLT5kYXRhOyBza2JfcHVsbChza2IsIDEpOworCisJaWYgKCh0eXBlICYgQk5FUF9UWVBFX01BU0spID4gQk5FUF9SWF9UWVBFUykKKwkJZ290byBiYWRmcmFtZTsKKwkKKwlpZiAoKHR5cGUgJiBCTkVQX1RZUEVfTUFTSykgPT0gQk5FUF9DT05UUk9MKSB7CisJCWJuZXBfcnhfY29udHJvbChzLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKworCS8qIFZlcmlmeSBhbmQgcHVsbCBvdXQgaGVhZGVyICovCisJaWYgKCFza2JfcHVsbChza2IsIF9fYm5lcF9yeF9obGVuW3R5cGUgJiBCTkVQX1RZUEVfTUFTS10pKQorCQlnb3RvIGJhZGZyYW1lOworCisJcy0+ZWguaF9wcm90byA9IGdldF91bmFsaWduZWQoKHUxNiAqKSAoc2tiLT5kYXRhIC0gMikpOworCisJaWYgKHR5cGUgJiBCTkVQX0VYVF9IRUFERVIpIHsKKwkJaWYgKGJuZXBfcnhfZXh0ZW5zaW9uKHMsIHNrYikgPCAwKQorCQkJZ290byBiYWRmcmFtZTsKKwl9CisKKwkvKiBTdHJpcCA4MDIuMXAgaGVhZGVyICovCisJaWYgKG50b2hzKHMtPmVoLmhfcHJvdG8pID09IDB4ODEwMCkgeworCQlpZiAoIXNrYl9wdWxsKHNrYiwgNCkpCisJCQlnb3RvIGJhZGZyYW1lOworCQlzLT5laC5oX3Byb3RvID0gZ2V0X3VuYWxpZ25lZCgodTE2ICopIChza2ItPmRhdGEgLSAyKSk7CisJfQorCQorCS8qIFdlIGhhdmUgdG8gYWxsb2MgbmV3IHNrYiBhbmQgY29weSBkYXRhIGhlcmUgOiguIEJlY2F1c2Ugb3JpZ2luYWwgc2tiCisJICogbWF5IG5vdCBiZSBtb2RpZmllZCBhbmQgYmVjYXVzZSBvZiB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cy4gKi8KKwluc2tiID0gYWxsb2Nfc2tiKDIgKyBFVEhfSExFTiArIHNrYi0+bGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5za2IpIHsKKwkJcy0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXNrYl9yZXNlcnZlKG5za2IsIDIpOworCisJLyogRGVjb21wcmVzcyBoZWFkZXIgYW5kIGNvbnN0cnVjdCBldGhlciBmcmFtZSAqLworCXN3aXRjaCAodHlwZSAmIEJORVBfVFlQRV9NQVNLKSB7CisJY2FzZSBCTkVQX0NPTVBSRVNTRUQ6CisJCW1lbWNweShfX3NrYl9wdXQobnNrYiwgRVRIX0hMRU4pLCAmcy0+ZWgsIEVUSF9ITEVOKTsKKwkJYnJlYWs7CisJCisJY2FzZSBCTkVQX0NPTVBSRVNTRURfU1JDX09OTFk6CisJCW1lbWNweShfX3NrYl9wdXQobnNrYiwgRVRIX0FMRU4pLCBzLT5laC5oX2Rlc3QsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KF9fc2tiX3B1dChuc2tiLCBFVEhfQUxFTiksIHNrYi0+bWFjLnJhdywgRVRIX0FMRU4pOworCQlwdXRfdW5hbGlnbmVkKHMtPmVoLmhfcHJvdG8sICh1MTYgKikgX19za2JfcHV0KG5za2IsIDIpKTsKKwkJYnJlYWs7CisKKwljYXNlIEJORVBfQ09NUFJFU1NFRF9EU1RfT05MWToKKwkJbWVtY3B5KF9fc2tiX3B1dChuc2tiLCBFVEhfQUxFTiksIHNrYi0+bWFjLnJhdywgRVRIX0FMRU4pOworCQltZW1jcHkoX19za2JfcHV0KG5za2IsIEVUSF9BTEVOICsgMiksIHMtPmVoLmhfc291cmNlLCBFVEhfQUxFTiArIDIpOworCQlicmVhazsKKworCWNhc2UgQk5FUF9HRU5FUkFMOgorCQltZW1jcHkoX19za2JfcHV0KG5za2IsIEVUSF9BTEVOICogMiksIHNrYi0+bWFjLnJhdywgRVRIX0FMRU4gKiAyKTsKKwkJcHV0X3VuYWxpZ25lZChzLT5laC5oX3Byb3RvLCAodTE2ICopIF9fc2tiX3B1dChuc2tiLCAyKSk7CisJCWJyZWFrOworCX0KKworCW1lbWNweShfX3NrYl9wdXQobnNrYiwgc2tiLT5sZW4pLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlrZnJlZV9za2Ioc2tiKTsKKwkKKwlzLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJbnNrYi0+ZGV2ICAgICAgID0gZGV2OworCW5za2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJbnNrYi0+cHJvdG9jb2wgID0gZXRoX3R5cGVfdHJhbnMobnNrYiwgZGV2KTsKKwluZXRpZl9yeF9uaShuc2tiKTsKKwlyZXR1cm4gMDsKKworYmFkZnJhbWU6CisJcy0+c3RhdHMucnhfZXJyb3JzKys7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1OCBfX2JuZXBfdHhfdHlwZXNbXSA9IHsKKwlCTkVQX0dFTkVSQUwsCisJQk5FUF9DT01QUkVTU0VEX1NSQ19PTkxZLAorCUJORVBfQ09NUFJFU1NFRF9EU1RfT05MWSwKKwlCTkVQX0NPTVBSRVNTRUQKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGJuZXBfdHhfZnJhbWUoc3RydWN0IGJuZXBfc2Vzc2lvbiAqcywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZXRoaGRyICplaCA9ICh2b2lkICopIHNrYi0+ZGF0YTsKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gcy0+c29jazsKKwlzdHJ1Y3Qga3ZlYyBpdlszXTsKKwlpbnQgbGVuID0gMCwgaWwgPSAwOworCXU4IHR5cGUgPSAwOworCisJQlRfREJHKCJza2IgJXAgZGV2ICVwIHR5cGUgJWQiLCBza2IsIHNrYi0+ZGV2LCBza2ItPnBrdF90eXBlKTsKKworCWlmICghc2tiLT5kZXYpIHsKKwkJLyogQ29udHJvbCBmcmFtZSBzZW50IGJ5IHVzICovCisJCWdvdG8gc2VuZDsKKwl9CisKKwlpdltpbCsrXSA9IChzdHJ1Y3Qga3ZlYykgeyAmdHlwZSwgMSB9OworCWxlbisrOworCisJaWYgKCFtZW1jbXAoZWgtPmhfZGVzdCwgcy0+ZWguaF9zb3VyY2UsIEVUSF9BTEVOKSkKKwkJdHlwZSB8PSAweDAxOworCisJaWYgKCFtZW1jbXAoZWgtPmhfc291cmNlLCBzLT5laC5oX2Rlc3QsIEVUSF9BTEVOKSkKKwkJdHlwZSB8PSAweDAyOworCisJaWYgKHR5cGUpCisJCXNrYl9wdWxsKHNrYiwgRVRIX0FMRU4gKiAyKTsKKworCXR5cGUgPSBfX2JuZXBfdHhfdHlwZXNbdHlwZV07CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBCTkVQX0NPTVBSRVNTRURfU1JDX09OTFk6CisJCWl2W2lsKytdID0gKHN0cnVjdCBrdmVjKSB7IGVoLT5oX3NvdXJjZSwgRVRIX0FMRU4gfTsKKwkJbGVuICs9IEVUSF9BTEVOOworCQlicmVhazsKKwkJCisJY2FzZSBCTkVQX0NPTVBSRVNTRURfRFNUX09OTFk6CisJCWl2W2lsKytdID0gKHN0cnVjdCBrdmVjKSB7IGVoLT5oX2Rlc3QsIEVUSF9BTEVOIH07CisJCWxlbiArPSBFVEhfQUxFTjsKKwkJYnJlYWs7CisJfQorCitzZW5kOgorCWl2W2lsKytdID0gKHN0cnVjdCBrdmVjKSB7IHNrYi0+ZGF0YSwgc2tiLT5sZW4gfTsKKwlsZW4gKz0gc2tiLT5sZW47CisJCisJLyogRklYTUU6IGxpbmVhcml6ZSBza2IgKi8KKwl7CisJCWxlbiA9IGtlcm5lbF9zZW5kbXNnKHNvY2ssICZzLT5tc2csIGl2LCBpbCwgbGVuKTsKKwl9CisJa2ZyZWVfc2tiKHNrYik7CisKKwlpZiAobGVuID4gMCkgeworCQlzLT5zdGF0cy50eF9ieXRlcyArPSBsZW47CisJCXMtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBibmVwX3Nlc3Npb24odm9pZCAqYXJnKQoreworCXN0cnVjdCBibmVwX3Nlc3Npb24gKnMgPSBhcmc7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHMtPmRldjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzLT5zb2NrLT5zazsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXdhaXRfcXVldWVfdCB3YWl0OworCisJQlRfREJHKCIiKTsKKworICAgICAgICBkYWVtb25pemUoImtibmVwZCAlcyIsIGRldi0+bmFtZSk7CisJc2V0X3VzZXJfbmljZShjdXJyZW50LCAtMTUpOworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOworCisJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOworCWFkZF93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOworCXdoaWxlICghYXRvbWljX3JlYWQoJnMtPmtpbGxlZCkpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQkvLyBSWAorCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpKSB7CisJCQlza2Jfb3JwaGFuKHNrYik7CisJCQlibmVwX3J4X2ZyYW1lKHMsIHNrYik7CisJCX0KKworCQlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0NPTk5FQ1RFRCkKKwkJCWJyZWFrOworCQorCQkvLyBUWAorCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfd3JpdGVfcXVldWUpKSkKKwkJCWlmIChibmVwX3R4X2ZyYW1lKHMsIHNrYikpCisJCQkJYnJlYWs7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkKKwkJc2NoZWR1bGUoKTsKKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKKworCS8qIENsZWFudXAgc2Vzc2lvbiAqLworCWRvd25fd3JpdGUoJmJuZXBfc2Vzc2lvbl9zZW0pOworCisJLyogRGVsZXRlIG5ldHdvcmsgZGV2aWNlICovCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworCS8qIFJlbGVhc2UgdGhlIHNvY2tldCAqLworCWZwdXQocy0+c29jay0+ZmlsZSk7CisKKwlfX2JuZXBfdW5saW5rX3Nlc3Npb24ocyk7CisKKwl1cF93cml0ZSgmYm5lcF9zZXNzaW9uX3NlbSk7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGJuZXBfYWRkX2Nvbm5lY3Rpb24oc3RydWN0IGJuZXBfY29ubmFkZF9yZXEgKnJlcSwgc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBibmVwX3Nlc3Npb24gKnMsICpzczsKKwl1OCBkc3RbRVRIX0FMRU5dLCBzcmNbRVRIX0FMRU5dOworCWludCBlcnI7CisKKwlCVF9EQkcoIiIpOworCisJYmFzd2FwKCh2b2lkICopIGRzdCwgJmJ0X3NrKHNvY2stPnNrKS0+ZHN0KTsKKwliYXN3YXAoKHZvaWQgKikgc3JjLCAmYnRfc2soc29jay0+c2spLT5zcmMpOworCisJLyogc2Vzc2lvbiBzdHJ1Y3QgYWxsb2NhdGVkIGFzIHByaXZhdGUgcGFydCBvZiBuZXRfZGV2aWNlICovCisJZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgYm5lcF9zZXNzaW9uKSwKKwkJCSAgICgqcmVxLT5kZXZpY2UpID8gcmVxLT5kZXZpY2UgOiAiYm5lcCVkIiwKKwkJCSAgIGJuZXBfbmV0X3NldHVwKTsKKwlpZiAoIWRldikgCisJCXJldHVybiBFTk9NRU07CisKKworCWRvd25fd3JpdGUoJmJuZXBfc2Vzc2lvbl9zZW0pOworCisJc3MgPSBfX2JuZXBfZ2V0X3Nlc3Npb24oZHN0KTsKKwlpZiAoc3MgJiYgc3MtPnN0YXRlID09IEJUX0NPTk5FQ1RFRCkgeworCQllcnIgPSAtRUVYSVNUOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlzID0gZGV2LT5wcml2OworCisJLyogVGhpcyBpcyByeCBoZWFkZXIgdGhlcmVmb3JlIGFkZHJlc3NlcyBhcmUgc3dhcHBlZC4KKwkgKiBpZSBlaC5oX2Rlc3QgaXMgb3VyIGxvY2FsIGFkZHJlc3MuICovCisJbWVtY3B5KHMtPmVoLmhfZGVzdCwgICAmc3JjLCBFVEhfQUxFTik7CisJbWVtY3B5KHMtPmVoLmhfc291cmNlLCAmZHN0LCBFVEhfQUxFTik7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHMtPmVoLmhfZGVzdCwgRVRIX0FMRU4pOworCisJcy0+ZGV2ID0gZGV2OworCXMtPnNvY2sgID0gc29jazsKKwlzLT5yb2xlICA9IHJlcS0+cm9sZTsKKwlzLT5zdGF0ZSA9IEJUX0NPTk5FQ1RFRDsKKwkKKwlzLT5tc2cubXNnX2ZsYWdzID0gTVNHX05PU0lHTkFMOworCisjaWZkZWYgQ09ORklHX0JUX0JORVBfTUNfRklMVEVSCisJLyogU2V0IGRlZmF1bHQgbWMgZmlsdGVyICovCisJc2V0X2JpdChibmVwX21jX2hhc2goZGV2LT5icm9hZGNhc3QpLCAodWxvbmcgKikgJnMtPm1jX2ZpbHRlcik7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19CVF9CTkVQX1BST1RPX0ZJTFRFUgorCS8qIFNldCBkZWZhdWx0IHByb3RvY29sIGZpbHRlciAqLworCWJuZXBfc2V0X2RlZmF1bHRfcHJvdG9fZmlsdGVyKHMpOworI2VuZGlmCisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCWdvdG8gZmFpbGVkOworCX0KKworCV9fYm5lcF9saW5rX3Nlc3Npb24ocyk7CisJCisJZXJyID0ga2VybmVsX3RocmVhZChibmVwX3Nlc3Npb24sIHMsIENMT05FX0tFUk5FTCk7CisJaWYgKGVyciA8IDApIHsKKwkJLyogU2Vzc2lvbiB0aHJlYWQgc3RhcnQgZmFpbGVkLCBnb3R0YSBjbGVhbnVwLiAqLworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQlfX2JuZXBfdW5saW5rX3Nlc3Npb24ocyk7CisJCWdvdG8gZmFpbGVkOworCX0KKworCXVwX3dyaXRlKCZibmVwX3Nlc3Npb25fc2VtKTsKKwlzdHJjcHkocmVxLT5kZXZpY2UsIGRldi0+bmFtZSk7CisJcmV0dXJuIDA7CisKK2ZhaWxlZDoKKwl1cF93cml0ZSgmYm5lcF9zZXNzaW9uX3NlbSk7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgYm5lcF9kZWxfY29ubmVjdGlvbihzdHJ1Y3QgYm5lcF9jb25uZGVsX3JlcSAqcmVxKQoreworCXN0cnVjdCBibmVwX3Nlc3Npb24gKnM7CisJaW50ICBlcnIgPSAwOworCisJQlRfREJHKCIiKTsKKworCWRvd25fcmVhZCgmYm5lcF9zZXNzaW9uX3NlbSk7CisKKwlzID0gX19ibmVwX2dldF9zZXNzaW9uKHJlcS0+ZHN0KTsKKwlpZiAocykgeworCQkvKiBXYWtldXAgdXNlci1zcGFjZSB3aGljaCBpcyBwb2xsaW5nIGZvciBzb2NrZXQgZXJyb3JzLgorCQkgKiBUaGlzIGlzIHRlbXBvcmFyeSBoYWNrIHVudGlsbCB3ZSBoYXZlIHNodXRkb3duIGluIEwyQ0FQICovCisJCXMtPnNvY2stPnNrLT5za19lcnIgPSBFVU5BVENIOworCQkKKwkJLyogS2lsbCBzZXNzaW9uIHRocmVhZCAqLworCQlhdG9taWNfaW5jKCZzLT5raWxsZWQpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUocy0+c29jay0+c2stPnNrX3NsZWVwKTsKKwl9IGVsc2UKKwkJZXJyID0gLUVOT0VOVDsKKworCXVwX3JlYWQoJmJuZXBfc2Vzc2lvbl9zZW0pOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fYm5lcF9jb3B5X2NpKHN0cnVjdCBibmVwX2Nvbm5pbmZvICpjaSwgc3RydWN0IGJuZXBfc2Vzc2lvbiAqcykKK3sKKwltZW1jcHkoY2ktPmRzdCwgcy0+ZWguaF9zb3VyY2UsIEVUSF9BTEVOKTsKKwlzdHJjcHkoY2ktPmRldmljZSwgcy0+ZGV2LT5uYW1lKTsKKwljaS0+ZmxhZ3MgPSBzLT5mbGFnczsKKwljaS0+c3RhdGUgPSBzLT5zdGF0ZTsKKwljaS0+cm9sZSAgPSBzLT5yb2xlOworfQorCitpbnQgYm5lcF9nZXRfY29ubmxpc3Qoc3RydWN0IGJuZXBfY29ubmxpc3RfcmVxICpyZXEpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlpbnQgZXJyID0gMCwgbiA9IDA7CisKKwlkb3duX3JlYWQoJmJuZXBfc2Vzc2lvbl9zZW0pOworCisJbGlzdF9mb3JfZWFjaChwLCAmYm5lcF9zZXNzaW9uX2xpc3QpIHsKKwkJc3RydWN0IGJuZXBfc2Vzc2lvbiAqczsKKwkJc3RydWN0IGJuZXBfY29ubmluZm8gY2k7CisKKwkJcyA9IGxpc3RfZW50cnkocCwgc3RydWN0IGJuZXBfc2Vzc2lvbiwgbGlzdCk7CisKKwkJX19ibmVwX2NvcHlfY2koJmNpLCBzKTsKKwkJCisJCWlmIChjb3B5X3RvX3VzZXIocmVxLT5jaSwgJmNpLCBzaXplb2YoY2kpKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCsrbiA+PSByZXEtPmNudW0pCisJCQlicmVhazsKKworCQlyZXEtPmNpKys7CisJfQorCXJlcS0+Y251bSA9IG47CisKKwl1cF9yZWFkKCZibmVwX3Nlc3Npb25fc2VtKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgYm5lcF9nZXRfY29ubmluZm8oc3RydWN0IGJuZXBfY29ubmluZm8gKmNpKQoreworCXN0cnVjdCBibmVwX3Nlc3Npb24gKnM7CisJaW50IGVyciA9IDA7CisKKwlkb3duX3JlYWQoJmJuZXBfc2Vzc2lvbl9zZW0pOworCisJcyA9IF9fYm5lcF9nZXRfc2Vzc2lvbihjaS0+ZHN0KTsKKwlpZiAocykKKwkJX19ibmVwX2NvcHlfY2koY2ksIHMpOworCWVsc2UKKwkJZXJyID0gLUVOT0VOVDsKKworCXVwX3JlYWQoJmJuZXBfc2Vzc2lvbl9zZW0pOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGJuZXBfaW5pdCh2b2lkKQorewkKKwljaGFyIGZsdFs1MF0gPSAiIjsKKworCWwyY2FwX2xvYWQoKTsKKworI2lmZGVmIENPTkZJR19CVF9CTkVQX1BST1RPX0ZJTFRFUgorCXN0cmNhdChmbHQsICJwcm90b2NvbCAiKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0JUX0JORVBfTUNfRklMVEVSCisJc3RyY2F0KGZsdCwgIm11bHRpY2FzdCIpOworI2VuZGlmCisKKwlCVF9JTkZPKCJCTkVQIChFdGhlcm5ldCBFbXVsYXRpb24pIHZlciAlcyIsIFZFUlNJT04pOworCWlmIChmbHRbMF0pCisJCUJUX0lORk8oIkJORVAgZmlsdGVyczogJXMiLCBmbHQpOworCisJYm5lcF9zb2NrX2luaXQoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGJuZXBfZXhpdCh2b2lkKQoreworCWJuZXBfc29ja19jbGVhbnVwKCk7Cit9CisKK21vZHVsZV9pbml0KGJuZXBfaW5pdCk7Cittb2R1bGVfZXhpdChibmVwX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBMaWJhdWx0IDxkYXZpZC5saWJhdWx0QGludmVudGVsLmZyPiwgTWF4aW0gS3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCbHVldG9vdGggQk5FUCB2ZXIgIiBWRVJTSU9OKTsKK01PRFVMRV9WRVJTSU9OKFZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJidC1wcm90by00Iik7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2JuZXAvbmV0ZGV2LmMgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvbmV0ZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIxMjA0ZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9ibHVldG9vdGgvYm5lcC9uZXRkZXYuYwpAQCAtMCwwICsxLDI0NyBAQAorLyogCisgICBCTkVQIGltcGxlbWVudGF0aW9uIGZvciBMaW51eCBCbHVldG9vdGggc3RhY2sgKEJsdWVaKS4KKyAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEludmVudGVsIFN5c3RlbWVzCisgICBXcml0dGVuIDIwMDEtMjAwMiBieQorCUNs6W1lbnQgTW9yZWF1IDxjbGVtZW50Lm1vcmVhdUBpbnZlbnRlbC5mcj4KKwlEYXZpZCBMaWJhdWx0ICA8ZGF2aWQubGliYXVsdEBpbnZlbnRlbC5mcj4KKworICAgQ29weXJpZ2h0IChDKSAyMDAyIE1heGltIEtyYXNueWFuc2t5IDxtYXhrQHF1YWxjb21tLmNvbT4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBBTkQgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyAKKyAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiAKKyAgIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIAorICAgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworICAgQUxMIExJQUJJTElUWSwgSU5DTFVESU5HIExJQUJJTElUWSBGT1IgSU5GUklOR0VNRU5UIE9GIEFOWSBQQVRFTlRTLCAKKyAgIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLCBSRUxBVElORyBUTyBVU0UgT0YgVEhJUyAKKyAgIFNPRlRXQVJFIElTIERJU0NMQUlNRUQuCisqLworCisvKgorICogJElkOiBuZXRkZXYuYyx2IDEuOCAyMDAyLzA4LzA0IDIxOjIzOjU4IG1heGsgRXhwICQKKyAqLyAKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2wyY2FwLmg+CisKKyNpbmNsdWRlICJibmVwLmgiCisKKyNpZm5kZWYgQ09ORklHX0JUX0JORVBfREVCVUcKKyN1bmRlZiAgQlRfREJHCisjZGVmaW5lIEJUX0RCRyggQS4uLiApCisjZW5kaWYKKworI2RlZmluZSBCTkVQX1RYX1FVRVVFX0xFTiAyMAorCitzdGF0aWMgaW50IGJuZXBfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJuZXBfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmJuZXBfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBibmVwX3Nlc3Npb24gKnMgPSBkZXYtPnByaXY7CisJcmV0dXJuICZzLT5zdGF0czsKK30KKworc3RhdGljIHZvaWQgYm5lcF9uZXRfc2V0X21jX2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZmRlZiBDT05GSUdfQlRfQk5FUF9NQ19GSUxURVIKKwlzdHJ1Y3QgYm5lcF9zZXNzaW9uICpzID0gZGV2LT5wcml2OworCXN0cnVjdCBzb2NrICpzayA9IHMtPnNvY2stPnNrOworCXN0cnVjdCBibmVwX3NldF9maWx0ZXJfcmVxICpyOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHNpemU7CisKKwlCVF9EQkcoIiVzIG1jX2NvdW50ICVkIiwgZGV2LT5uYW1lLCBkZXYtPm1jX2NvdW50KTsKKworCXNpemUgPSBzaXplb2YoKnIpICsgKEJORVBfTUFYX01VTFRJQ0FTVF9GSUxURVJTICsgMSkgKiBFVEhfQUxFTiAqIDI7CisJc2tiICA9IGFsbG9jX3NrYihzaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikgeworCQlCVF9FUlIoIiVzIE11bHRpY2FzdCBsaXN0IGFsbG9jYXRpb24gZmFpbGVkIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCXIgPSAodm9pZCAqKSBza2ItPmRhdGE7CisJX19za2JfcHV0KHNrYiwgc2l6ZW9mKCpyKSk7CisKKwlyLT50eXBlID0gQk5FUF9DT05UUk9MOworCXItPmN0cmwgPSBCTkVQX0ZJTFRFUl9NVUxUSV9BRERSX1NFVDsKKworICAgICAgICBpZiAoZGV2LT5mbGFncyAmIChJRkZfUFJPTUlTQyB8IElGRl9BTExNVUxUSSkpIHsKKwkJdTggc3RhcnRbRVRIX0FMRU5dID0geyAweDAxIH07CisKKwkJLyogUmVxdWVzdCBhbGwgYWRkcmVzc2VzICovCisJCW1lbWNweShfX3NrYl9wdXQoc2tiLCBFVEhfQUxFTiksIHN0YXJ0LCBFVEhfQUxFTik7CisJCW1lbWNweShfX3NrYl9wdXQoc2tiLCBFVEhfQUxFTiksIGRldi0+YnJvYWRjYXN0LCBFVEhfQUxFTik7CisJCXItPmxlbiA9IGh0b25zKEVUSF9BTEVOICogMik7CisJfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA9IGRldi0+bWNfbGlzdDsKKwkJaW50IGksIGxlbiA9IHNrYi0+bGVuOworCisJCWlmIChkZXYtPmZsYWdzICYgSUZGX0JST0FEQ0FTVCkgeworCQkJbWVtY3B5KF9fc2tiX3B1dChza2IsIEVUSF9BTEVOKSwgZGV2LT5icm9hZGNhc3QsIEVUSF9BTEVOKTsKKwkJCW1lbWNweShfX3NrYl9wdXQoc2tiLCBFVEhfQUxFTiksIGRldi0+YnJvYWRjYXN0LCBFVEhfQUxFTik7CisJCX0JCisJCQorCQkvKiBGSVhNRTogV2Ugc2hvdWxkIGdyb3VwIGFkZHJlc3NlcyBoZXJlLiAqLworCisJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50ICYmIGkgPCBCTkVQX01BWF9NVUxUSUNBU1RfRklMVEVSUzsgaSsrKSB7CisJCQltZW1jcHkoX19za2JfcHV0KHNrYiwgRVRIX0FMRU4pLCBkbWktPmRtaV9hZGRyLCBFVEhfQUxFTik7CisJCQltZW1jcHkoX19za2JfcHV0KHNrYiwgRVRIX0FMRU4pLCBkbWktPmRtaV9hZGRyLCBFVEhfQUxFTik7CisJCQlkbWkgPSBkbWktPm5leHQ7CisJCX0KKwkJci0+bGVuID0gaHRvbnMoc2tiLT5sZW4gLSBsZW4pOworCX0KKworCXNrYl9xdWV1ZV90YWlsKCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYik7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHNrLT5za19zbGVlcCk7CisjZW5kaWYKK30KKworc3RhdGljIGludCBibmVwX25ldF9zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYXJnKQoreworCUJUX0RCRygiJXMiLCBkZXYtPm5hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBibmVwX25ldF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJQlRfREJHKCJuZXRfdGltZW91dCIpOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCBibmVwX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworI2lmZGVmIENPTkZJR19CVF9CTkVQX01DX0ZJTFRFUgorc3RhdGljIGlubGluZSBpbnQgYm5lcF9uZXRfbWNfZmlsdGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBibmVwX3Nlc3Npb24gKnMpCit7CisJc3RydWN0IGV0aGhkciAqZWggPSAodm9pZCAqKSBza2ItPmRhdGE7CisKKwlpZiAoKGVoLT5oX2Rlc3RbMF0gJiAxKSAmJiAhdGVzdF9iaXQoYm5lcF9tY19oYXNoKGVoLT5oX2Rlc3QpLCAodWxvbmcgKikgJnMtPm1jX2ZpbHRlcikpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQlRfQk5FUF9QUk9UT19GSUxURVIKKy8qIERldGVybWluZSBldGhlciBwcm90b2NvbC4gQmFzZWQgb24gZXRoX3R5cGVfdHJhbnMuICovCitzdGF0aWMgaW5saW5lIHUxNiBibmVwX25ldF9ldGhfcHJvdG8oc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZXRoaGRyICplaCA9ICh2b2lkICopIHNrYi0+ZGF0YTsKKwkKKwlpZiAobnRvaHMoZWgtPmhfcHJvdG8pID49IDE1MzYpCisJCXJldHVybiBlaC0+aF9wcm90bzsKKwkJCisJaWYgKGdldF91bmFsaWduZWQoKHUxNiAqKSBza2ItPmRhdGEpID09IDB4RkZGRikKKwkJcmV0dXJuIGh0b25zKEVUSF9QXzgwMl8zKTsKKwkJCisJcmV0dXJuIGh0b25zKEVUSF9QXzgwMl8yKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYm5lcF9uZXRfcHJvdG9fZmlsdGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBibmVwX3Nlc3Npb24gKnMpCit7CisJdTE2IHByb3RvID0gYm5lcF9uZXRfZXRoX3Byb3RvKHNrYik7CisJc3RydWN0IGJuZXBfcHJvdG9fZmlsdGVyICpmID0gcy0+cHJvdG9fZmlsdGVyOworCWludCBpOworCQorCWZvciAoaSA9IDA7IGkgPCBCTkVQX01BWF9QUk9UT19GSUxURVJTICYmIGZbaV0uZW5kOyBpKyspIHsKKwkJaWYgKHByb3RvID49IGZbaV0uc3RhcnQgJiYgcHJvdG8gPD0gZltpXS5lbmQpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlCVF9EQkcoIkJORVA6IGZpbHRlcmVkIHNrYiAlcCwgcHJvdG8gMHglLjR4Iiwgc2tiLCBwcm90byk7CisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBibmVwX25ldF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJuZXBfc2Vzc2lvbiAqcyA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzLT5zb2NrLT5zazsKKworCUJUX0RCRygic2tiICVwLCBkZXYgJXAiLCBza2IsIGRldik7CisKKyNpZmRlZiBDT05GSUdfQlRfQk5FUF9NQ19GSUxURVIKKwlpZiAoYm5lcF9uZXRfbWNfZmlsdGVyKHNrYiwgcykpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCQorI2lmZGVmIENPTkZJR19CVF9CTkVQX1BST1RPX0ZJTFRFUgorCWlmIChibmVwX25ldF9wcm90b19maWx0ZXIoc2tiLCBzKSkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisJCisJLyoKKwkgKiBXZSBjYW5ub3Qgc2VuZCBMMkNBUCBwYWNrZXRzIGZyb20gaGVyZSBhcyB3ZSBhcmUgcG90ZW50aWFsbHkgaW4gYSBiaC4KKwkgKiBTbyB3ZSBoYXZlIHRvIHF1ZXVlIHRoZW0gYW5kIHdha2UgdXAgc2Vzc2lvbiB0aHJlYWQgd2hpY2ggaXMgc2xlZXBpbmcKKwkgKiBvbiB0aGUgc2stPnNrX3NsZWVwLgorCSAqLworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXNrYl9xdWV1ZV90YWlsKCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYik7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHNrLT5za19zbGVlcCk7CisKKwlpZiAoc2tiX3F1ZXVlX2xlbigmc2stPnNrX3dyaXRlX3F1ZXVlKSA+PSBCTkVQX1RYX1FVRVVFX0xFTikgeworCQlCVF9EQkcoInR4IHF1ZXVlIGlzIGZ1bGwiKTsKKworCQkvKiBTdG9wIHF1ZXVpbmcuCisJCSAqIFNlc3Npb24gdGhyZWFkIHdpbGwgZG8gbmV0aWZfd2FrZV9xdWV1ZSgpICovCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBibmVwX25ldF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJbWVtc2V0KGRldi0+YnJvYWRjYXN0LCAweGZmLCBFVEhfQUxFTik7CisJZGV2LT5hZGRyX2xlbiA9IEVUSF9BTEVOOworCisJZXRoZXJfc2V0dXAoZGV2KTsKKworCWRldi0+b3BlbiAgICAgICAgICAgID0gYm5lcF9uZXRfb3BlbjsKKwlkZXYtPnN0b3AgICAgICAgICAgICA9IGJuZXBfbmV0X2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gYm5lcF9uZXRfeG1pdDsKKwlkZXYtPmdldF9zdGF0cyAgICAgICA9IGJuZXBfbmV0X2dldF9zdGF0czsKKwlkZXYtPmRvX2lvY3RsICAgICAgICA9IGJuZXBfbmV0X2lvY3RsOworCWRldi0+c2V0X21hY19hZGRyZXNzID0gYm5lcF9uZXRfc2V0X21hY19hZGRyOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gYm5lcF9uZXRfc2V0X21jX2xpc3Q7CisKKwlkZXYtPndhdGNoZG9nX3RpbWVvICA9IEhaICogMjsKKwlkZXYtPnR4X3RpbWVvdXQgICAgICA9IGJuZXBfbmV0X3RpbWVvdXQ7Cit9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2JuZXAvc29jay5jIGIvbmV0L2JsdWV0b290aC9ibmVwL3NvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YThkOTlhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9ibmVwL3NvY2suYwpAQCAtMCwwICsxLDIzNyBAQAorLyogCisgICBCTkVQIGltcGxlbWVudGF0aW9uIGZvciBMaW51eCBCbHVldG9vdGggc3RhY2sgKEJsdWVaKS4KKyAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEludmVudGVsIFN5c3RlbWVzCisgICBXcml0dGVuIDIwMDEtMjAwMiBieQorCURhdmlkIExpYmF1bHQgIDxkYXZpZC5saWJhdWx0QGludmVudGVsLmZyPgorCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgTWF4aW0gS3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIFRISVJEIFBBUlRZIFJJR0hUUy4KKyAgIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIEFORCBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkKKyAgIENMQUlNLCBPUiBBTlkgU1BFQ0lBTCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIE9SIEFOWSBEQU1BR0VTIAorICAgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIAorICAgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgCisgICBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisgICBBTEwgTElBQklMSVRZLCBJTkNMVURJTkcgTElBQklMSVRZIEZPUiBJTkZSSU5HRU1FTlQgT0YgQU5ZIFBBVEVOVFMsIAorICAgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMsIFJFTEFUSU5HIFRPIFVTRSBPRiBUSElTIAorICAgU09GVFdBUkUgSVMgRElTQ0xBSU1FRC4KKyovCisKKy8qCisgKiAkSWQ6IHNvY2suYyx2IDEuNCAyMDAyLzA4LzA0IDIxOjIzOjU4IG1heGsgRXhwICQKKyAqLyAKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgImJuZXAuaCIKKworI2lmbmRlZiBDT05GSUdfQlRfQk5FUF9ERUJVRworI3VuZGVmICBCVF9EQkcKKyNkZWZpbmUgQlRfREJHKCBBLi4uICkKKyNlbmRpZgorCitzdGF0aWMgaW50IGJuZXBfc29ja19yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisKKwlCVF9EQkcoInNvY2sgJXAgc2sgJXAiLCBzb2NrLCBzayk7CisKKwlpZiAoIXNrKQorCQlyZXR1cm4gMDsKKworCXNvY2tfb3JwaGFuKHNrKTsKKwlzb2NrX3B1dChzayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYm5lcF9zb2NrX2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBibmVwX2Nvbm5saXN0X3JlcSBjbDsKKwlzdHJ1Y3QgYm5lcF9jb25uYWRkX3JlcSAgY2E7CisJc3RydWN0IGJuZXBfY29ubmRlbF9yZXEgIGNkOworCXN0cnVjdCBibmVwX2Nvbm5pbmZvIGNpOworCXN0cnVjdCBzb2NrZXQgKm5zb2NrOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBlcnI7CisKKwlCVF9EQkcoImNtZCAleCBhcmcgJWx4IiwgY21kLCBhcmcpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEJORVBDT05OQUREOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmNhLCBhcmdwLCBzaXplb2YoY2EpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQorCQluc29jayA9IHNvY2tmZF9sb29rdXAoY2Euc29jaywgJmVycik7CisJCWlmICghbnNvY2spCisJCQlyZXR1cm4gZXJyOworCisJCWlmIChuc29jay0+c2stPnNrX3N0YXRlICE9IEJUX0NPTk5FQ1RFRCkgeworCQkJZnB1dChuc29jay0+ZmlsZSk7CisJCQlyZXR1cm4gLUVCQURGRDsKKwkJfQorCisJCWVyciA9IGJuZXBfYWRkX2Nvbm5lY3Rpb24oJmNhLCBuc29jayk7CisJCWlmICghZXJyKSB7CisgICAgCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2EsIHNpemVvZihjYSkpKQorCQkJCWVyciA9IC1FRkFVTFQ7CisJCX0gZWxzZQorCQkJZnB1dChuc29jay0+ZmlsZSk7CisKKwkJcmV0dXJuIGVycjsKKwkKKwljYXNlIEJORVBDT05OREVMOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmNkLCBhcmdwLCBzaXplb2YoY2QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQorCQlyZXR1cm4gYm5lcF9kZWxfY29ubmVjdGlvbigmY2QpOworCisJY2FzZSBCTkVQR0VUQ09OTkxJU1Q6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2wsIGFyZ3AsIHNpemVvZihjbCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGNsLmNudW0gPD0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQorCQllcnIgPSBibmVwX2dldF9jb25ubGlzdCgmY2wpOworCQlpZiAoIWVyciAmJiBjb3B5X3RvX3VzZXIoYXJncCwgJmNsLCBzaXplb2YoY2wpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiBlcnI7CisKKwljYXNlIEJORVBHRVRDT05OSU5GTzoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjaSwgYXJncCwgc2l6ZW9mKGNpKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQllcnIgPSBibmVwX2dldF9jb25uaW5mbygmY2kpOworCQlpZiAoIWVyciAmJiBjb3B5X3RvX3VzZXIoYXJncCwgJmNpLCBzaXplb2YoY2kpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiBlcnI7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgYm5lcF9zb2NrX29wcyA9IHsKKwkuZmFtaWx5ICAgICA9IFBGX0JMVUVUT09USCwKKwkub3duZXIgICAgICA9IFRISVNfTU9EVUxFLAorCS5yZWxlYXNlICAgID0gYm5lcF9zb2NrX3JlbGVhc2UsCisJLmlvY3RsICAgICAgPSBibmVwX3NvY2tfaW9jdGwsCisJLmJpbmQgICAgICAgPSBzb2NrX25vX2JpbmQsCisJLmdldG5hbWUgICAgPSBzb2NrX25vX2dldG5hbWUsCisJLnNlbmRtc2cgICAgPSBzb2NrX25vX3NlbmRtc2csCisJLnJlY3Ztc2cgICAgPSBzb2NrX25vX3JlY3Ztc2csCisJLnBvbGwgICAgICAgPSBzb2NrX25vX3BvbGwsCisJLmxpc3RlbiAgICAgPSBzb2NrX25vX2xpc3RlbiwKKwkuc2h1dGRvd24gICA9IHNvY2tfbm9fc2h1dGRvd24sCisJLnNldHNvY2tvcHQgPSBzb2NrX25vX3NldHNvY2tvcHQsCisJLmdldHNvY2tvcHQgPSBzb2NrX25vX2dldHNvY2tvcHQsCisJLmNvbm5lY3QgICAgPSBzb2NrX25vX2Nvbm5lY3QsCisJLnNvY2tldHBhaXIgPSBzb2NrX25vX3NvY2tldHBhaXIsCisJLmFjY2VwdCAgICAgPSBzb2NrX25vX2FjY2VwdCwKKwkubW1hcCAgICAgICA9IHNvY2tfbm9fbW1hcAorfTsKKworc3RhdGljIHN0cnVjdCBwcm90byBibmVwX3Byb3RvID0geworCS5uYW1lCQk9ICJCTkVQIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9ial9zaXplCT0gc2l6ZW9mKHN0cnVjdCBidF9zb2NrKQorfTsKKworc3RhdGljIGludCBibmVwX3NvY2tfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlCVF9EQkcoInNvY2sgJXAiLCBzb2NrKTsKKworCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfUkFXKQorCQlyZXR1cm4gLUVTT0NLVE5PU1VQUE9SVDsKKworCXNrID0gc2tfYWxsb2MoUEZfQkxVRVRPT1RILCBHRlBfS0VSTkVMLCAmYm5lcF9wcm90bywgMSk7CisJaWYgKCFzaykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisKKwlzb2NrLT5vcHMgPSAmYm5lcF9zb2NrX29wczsKKworCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CisKKwlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKworCXNrLT5za19wcm90b2NvbCA9IHByb3RvY29sOworCXNrLT5za19zdGF0ZQk9IEJUX09QRU47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5IGJuZXBfc29ja19mYW1pbHlfb3BzID0geworCS5mYW1pbHkgPSBQRl9CTFVFVE9PVEgsCisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmNyZWF0ZSA9IGJuZXBfc29ja19jcmVhdGUKK307CisKK2ludCBfX2luaXQgYm5lcF9zb2NrX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcHJvdG9fcmVnaXN0ZXIoJmJuZXBfcHJvdG8sIDApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gYnRfc29ja19yZWdpc3RlcihCVFBST1RPX0JORVAsICZibmVwX3NvY2tfZmFtaWx5X29wcyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJQlRfRVJSKCJDYW4ndCByZWdpc3RlciBCTkVQIHNvY2tldCIpOworCXByb3RvX3VucmVnaXN0ZXIoJmJuZXBfcHJvdG8pOworCXJldHVybiBlcnI7Cit9CisKK2ludCBfX2V4aXQgYm5lcF9zb2NrX2NsZWFudXAodm9pZCkKK3sKKwlpZiAoYnRfc29ja191bnJlZ2lzdGVyKEJUUFJPVE9fQk5FUCkgPCAwKQorCQlCVF9FUlIoIkNhbid0IHVucmVnaXN0ZXIgQk5FUCBzb2NrZXQiKTsKKworCXByb3RvX3VucmVnaXN0ZXIoJmJuZXBfcHJvdG8pOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2NtdHAvS2NvbmZpZyBiL25ldC9ibHVldG9vdGgvY210cC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YjAzODIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL2NtdHAvS2NvbmZpZwpAQCAtMCwwICsxLDExIEBACitjb25maWcgQlRfQ01UUAorCXRyaXN0YXRlICJDTVRQIHByb3RvY29sIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBCVCAmJiBCVF9MMkNBUCAmJiBJU0ROX0NBUEkKKwloZWxwCisJICBDTVRQIChDQVBJIE1lc3NhZ2UgVHJhbnNwb3J0IFByb3RvY29sKSBpcyBhIHRyYW5zcG9ydCBsYXllcgorCSAgZm9yIENBUEkgbWVzc2FnZXMuICBDTVRQIGlzIHJlcXVpcmVkIGZvciB0aGUgQmx1ZXRvb3RoIENvbW1vbgorCSAgSVNETiBBY2Nlc3MgUHJvZmlsZS4KKworCSAgU2F5IFkgaGVyZSB0byBjb21waWxlIENNVFAgc3VwcG9ydCBpbnRvIHRoZSBrZXJuZWwgb3Igc2F5IE0gdG8KKwkgIGNvbXBpbGUgaXQgYXMgbW9kdWxlIChjbXRwKS4KKwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9jbXRwL01ha2VmaWxlIGIvbmV0L2JsdWV0b290aC9jbXRwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MGE5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL2NtdHAvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggQmx1ZXRvb3RoIENNVFAgbGF5ZXIKKyMKKworb2JqLSQoQ09ORklHX0JUX0NNVFApICs9IGNtdHAubworCitjbXRwLW9ianMgOj0gY29yZS5vIHNvY2subyBjYXBpLm8KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvY210cC9jYXBpLmMgYi9uZXQvYmx1ZXRvb3RoL2NtdHAvY2FwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNWMwMzAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL2NtdHAvY2FwaS5jCkBAIC0wLDAgKzEsNjAwIEBACisvKiAKKyAgIENNVFAgaW1wbGVtZW50YXRpb24gZm9yIExpbnV4IEJsdWV0b290aCBzdGFjayAoQmx1ZVopLgorICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgTWFyY2VsIEhvbHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIFRISVJEIFBBUlRZIFJJR0hUUy4KKyAgIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIEFORCBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkKKyAgIENMQUlNLCBPUiBBTlkgU1BFQ0lBTCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIE9SIEFOWSBEQU1BR0VTIAorICAgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIAorICAgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgCisgICBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisgICBBTEwgTElBQklMSVRZLCBJTkNMVURJTkcgTElBQklMSVRZIEZPUiBJTkZSSU5HRU1FTlQgT0YgQU5ZIFBBVEVOVFMsIAorICAgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMsIFJFTEFUSU5HIFRPIFVTRSBPRiBUSElTIAorICAgU09GVFdBUkUgSVMgRElTQ0xBSU1FRC4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisjaW5jbHVkZSA8bGludXgvaXNkbi9jYXBpbGxpLmg+CisjaW5jbHVkZSA8bGludXgvaXNkbi9jYXBpY21kLmg+CisjaW5jbHVkZSA8bGludXgvaXNkbi9jYXBpdXRpbC5oPgorCisjaW5jbHVkZSAiY210cC5oIgorCisjaWZuZGVmIENPTkZJR19CVF9DTVRQX0RFQlVHCisjdW5kZWYgIEJUX0RCRworI2RlZmluZSBCVF9EQkcoRC4uLikKKyNlbmRpZgorCisjZGVmaW5lIENBUElfSU5URVJPUEVSQUJJTElUWQkJMHgyMAorCisjZGVmaW5lIENBUElfSU5URVJPUEVSQUJJTElUWV9SRVEJQ0FQSUNNRChDQVBJX0lOVEVST1BFUkFCSUxJVFksIENBUElfUkVRKQorI2RlZmluZSBDQVBJX0lOVEVST1BFUkFCSUxJVFlfQ09ORglDQVBJQ01EKENBUElfSU5URVJPUEVSQUJJTElUWSwgQ0FQSV9DT05GKQorI2RlZmluZSBDQVBJX0lOVEVST1BFUkFCSUxJVFlfSU5ECUNBUElDTUQoQ0FQSV9JTlRFUk9QRVJBQklMSVRZLCBDQVBJX0lORCkKKyNkZWZpbmUgQ0FQSV9JTlRFUk9QRVJBQklMSVRZX1JFU1AJQ0FQSUNNRChDQVBJX0lOVEVST1BFUkFCSUxJVFksIENBUElfUkVTUCkKKworI2RlZmluZSBDQVBJX0lOVEVST1BFUkFCSUxJVFlfUkVRX0xFTgkoQ0FQSV9NU0dfQkFTRUxFTiArIDIpCisjZGVmaW5lIENBUElfSU5URVJPUEVSQUJJTElUWV9DT05GX0xFTgkoQ0FQSV9NU0dfQkFTRUxFTiArIDQpCisjZGVmaW5lIENBUElfSU5URVJPUEVSQUJJTElUWV9JTkRfTEVOCShDQVBJX01TR19CQVNFTEVOICsgMikKKyNkZWZpbmUgQ0FQSV9JTlRFUk9QRVJBQklMSVRZX1JFU1BfTEVOCShDQVBJX01TR19CQVNFTEVOICsgMikKKworI2RlZmluZSBDQVBJX0ZVTkNUSU9OX1JFR0lTVEVSCQkwCisjZGVmaW5lIENBUElfRlVOQ1RJT05fUkVMRUFTRQkJMQorI2RlZmluZSBDQVBJX0ZVTkNUSU9OX0dFVF9QUk9GSUxFCTIKKyNkZWZpbmUgQ0FQSV9GVU5DVElPTl9HRVRfTUFOVUZBQ1RVUkVSCTMKKyNkZWZpbmUgQ0FQSV9GVU5DVElPTl9HRVRfVkVSU0lPTgk0CisjZGVmaW5lIENBUElfRlVOQ1RJT05fR0VUX1NFUklBTF9OVU1CRVIJNQorI2RlZmluZSBDQVBJX0ZVTkNUSU9OX01BTlVGQUNUVVJFUgk2CisjZGVmaW5lIENBUElfRlVOQ1RJT05fTE9PUEJBQ0sJCTcKKworCisjZGVmaW5lIENNVFBfTVNHTlVNCTEKKyNkZWZpbmUgQ01UUF9BUFBMSUQJMgorI2RlZmluZSBDTVRQX01BUFBJTkcJMworCitzdGF0aWMgc3RydWN0IGNtdHBfYXBwbGljYXRpb24gKmNtdHBfYXBwbGljYXRpb25fYWRkKHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24sIF9fdTE2IGFwcGwpCit7CisJc3RydWN0IGNtdHBfYXBwbGljYXRpb24gKmFwcCA9IGttYWxsb2Moc2l6ZW9mKCphcHApLCBHRlBfS0VSTkVMKTsKKworCUJUX0RCRygic2Vzc2lvbiAlcCBhcHBsaWNhdGlvbiAlcCBhcHBsICVkIiwgc2Vzc2lvbiwgYXBwLCBhcHBsKTsKKworCWlmICghYXBwKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldChhcHAsIDAsIHNpemVvZigqYXBwKSk7CisKKwlhcHAtPnN0YXRlID0gQlRfT1BFTjsKKwlhcHAtPmFwcGwgPSBhcHBsOworCisJbGlzdF9hZGRfdGFpbCgmYXBwLT5saXN0LCAmc2Vzc2lvbi0+YXBwbGljYXRpb25zKTsKKworCXJldHVybiBhcHA7Cit9CisKK3N0YXRpYyB2b2lkIGNtdHBfYXBwbGljYXRpb25fZGVsKHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24sIHN0cnVjdCBjbXRwX2FwcGxpY2F0aW9uICphcHApCit7CisJQlRfREJHKCJzZXNzaW9uICVwIGFwcGxpY2F0aW9uICVwIiwgc2Vzc2lvbiwgYXBwKTsKKworCWlmIChhcHApIHsKKwkJbGlzdF9kZWwoJmFwcC0+bGlzdCk7CisJCWtmcmVlKGFwcCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGNtdHBfYXBwbGljYXRpb24gKmNtdHBfYXBwbGljYXRpb25fZ2V0KHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24sIGludCBwYXR0ZXJuLCBfX3UxNiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgY210cF9hcHBsaWNhdGlvbiAqYXBwOworCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZzZXNzaW9uLT5hcHBsaWNhdGlvbnMpIHsKKwkJYXBwID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgY210cF9hcHBsaWNhdGlvbiwgbGlzdCk7CisJCXN3aXRjaCAocGF0dGVybikgeworCQljYXNlIENNVFBfTVNHTlVNOgorCQkJaWYgKGFwcC0+bXNnbnVtID09IHZhbHVlKQorCQkJCXJldHVybiBhcHA7CisJCQlicmVhazsKKwkJY2FzZSBDTVRQX0FQUExJRDoKKwkJCWlmIChhcHAtPmFwcGwgPT0gdmFsdWUpCisJCQkJcmV0dXJuIGFwcDsKKwkJCWJyZWFrOworCQljYXNlIENNVFBfTUFQUElORzoKKwkJCWlmIChhcHAtPm1hcHBpbmcgPT0gdmFsdWUpCisJCQkJcmV0dXJuIGFwcDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgY210cF9tc2dudW1fZ2V0KHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24pCit7CisJc2Vzc2lvbi0+bXNnbnVtKys7CisKKwlpZiAoKHNlc3Npb24tPm1zZ251bSAmIDB4ZmYpID4gMjAwKQorCQlzZXNzaW9uLT5tc2dudW0gPSBDTVRQX0lOSVRJQUxfTVNHTlVNICsgMTsKKworCXJldHVybiBzZXNzaW9uLT5tc2dudW07Cit9CisKK3N0YXRpYyB2b2lkIGNtdHBfc2VuZF9jYXBpbXNnKHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGNtdHBfc2NiICpzY2IgPSAodm9pZCAqKSBza2ItPmNiOworCisJQlRfREJHKCJzZXNzaW9uICVwIHNrYiAlcCBsZW4gJWQiLCBzZXNzaW9uLCBza2IsIHNrYi0+bGVuKTsKKworCXNjYi0+aWQgPSAtMTsKKwlzY2ItPmRhdGEgPSAoQ0FQSU1TR19DT01NQU5EKHNrYi0+ZGF0YSkgPT0gQ0FQSV9EQVRBX0IzKTsKKworCXNrYl9xdWV1ZV90YWlsKCZzZXNzaW9uLT50cmFuc21pdCwgc2tiKTsKKworCWNtdHBfc2NoZWR1bGUoc2Vzc2lvbik7Cit9CisKK3N0YXRpYyB2b2lkIGNtdHBfc2VuZF9pbnRlcm9wbXNnKHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24sCisJCQkJCV9fdTggc3ViY21kLCBfX3UxNiBhcHBsLCBfX3UxNiBtc2dudW0sCisJCQkJCV9fdTE2IGZ1bmN0aW9uLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyICpzOworCisJQlRfREJHKCJzZXNzaW9uICVwIHN1YmNtZCAweCUwMnggYXBwbCAlZCBtc2dudW0gJWQiLCBzZXNzaW9uLCBzdWJjbWQsIGFwcGwsIG1zZ251bSk7CisKKwlpZiAoIShza2IgPSBhbGxvY19za2IoQ0FQSV9NU0dfQkFTRUxFTiArIDYgKyBsZW4sIEdGUF9BVE9NSUMpKSkgeworCQlCVF9FUlIoIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgaW50ZXJvcGVyYWJpbGl0eSBwYWNrZXQiKTsKKwkJcmV0dXJuOworCX0KKworCXMgPSBza2JfcHV0KHNrYiwgQ0FQSV9NU0dfQkFTRUxFTiArIDYgKyBsZW4pOworCisJY2FwaW1zZ19zZXR1MTYocywgMCwgQ0FQSV9NU0dfQkFTRUxFTiArIDYgKyBsZW4pOworCWNhcGltc2dfc2V0dTE2KHMsIDIsIGFwcGwpOworCWNhcGltc2dfc2V0dTggKHMsIDQsIENBUElfSU5URVJPUEVSQUJJTElUWSk7CisJY2FwaW1zZ19zZXR1OCAocywgNSwgc3ViY21kKTsKKwljYXBpbXNnX3NldHUxNihzLCA2LCBtc2dudW0pOworCisJLyogSW50ZXJvcGVyYWJpbGl0eSBzZWxlY3RvciAoQmx1ZXRvb3RoIERldmljZSBNYW5hZ2VtZW50KSAqLworCWNhcGltc2dfc2V0dTE2KHMsIDgsIDB4MDAwMSk7CisKKwljYXBpbXNnX3NldHU4IChzLCAxMCwgMyArIGxlbik7CisJY2FwaW1zZ19zZXR1MTYocywgMTEsIGZ1bmN0aW9uKTsKKwljYXBpbXNnX3NldHU4IChzLCAxMywgbGVuKTsKKworCWlmIChsZW4gPiAwKQorCQltZW1jcHkocyArIDE0LCBidWYsIGxlbik7CisKKwljbXRwX3NlbmRfY2FwaW1zZyhzZXNzaW9uLCBza2IpOworfQorCitzdGF0aWMgdm9pZCBjbXRwX3JlY3ZfaW50ZXJvcG1zZyhzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBjYXBpX2N0ciAqY3RybCA9ICZzZXNzaW9uLT5jdHJsOworCXN0cnVjdCBjbXRwX2FwcGxpY2F0aW9uICphcHBsaWNhdGlvbjsKKwlfX3UxNiBhcHBsLCBtc2dudW0sIGZ1bmMsIGluZm87CisJX191MzIgY29udHJvbGxlcjsKKworCUJUX0RCRygic2Vzc2lvbiAlcCBza2IgJXAgbGVuICVkIiwgc2Vzc2lvbiwgc2tiLCBza2ItPmxlbik7CisKKwlzd2l0Y2ggKENBUElNU0dfU1VCQ09NTUFORChza2ItPmRhdGEpKSB7CisJY2FzZSBDQVBJX0NPTkY6CisJCWZ1bmMgPSBDQVBJTVNHX1UxNihza2ItPmRhdGEsIENBUElfTVNHX0JBU0VMRU4gKyA1KTsKKwkJaW5mbyA9IENBUElNU0dfVTE2KHNrYi0+ZGF0YSwgQ0FQSV9NU0dfQkFTRUxFTiArIDgpOworCisJCXN3aXRjaCAoZnVuYykgeworCQljYXNlIENBUElfRlVOQ1RJT05fUkVHSVNURVI6CisJCQltc2dudW0gPSBDQVBJTVNHX01TR0lEKHNrYi0+ZGF0YSk7CisKKwkJCWFwcGxpY2F0aW9uID0gY210cF9hcHBsaWNhdGlvbl9nZXQoc2Vzc2lvbiwgQ01UUF9NU0dOVU0sIG1zZ251bSk7CisJCQlpZiAoYXBwbGljYXRpb24pIHsKKwkJCQlhcHBsaWNhdGlvbi0+c3RhdGUgPSBCVF9DT05ORUNURUQ7CisJCQkJYXBwbGljYXRpb24tPm1zZ251bSA9IDA7CisJCQkJYXBwbGljYXRpb24tPm1hcHBpbmcgPSBDQVBJTVNHX0FQUElEKHNrYi0+ZGF0YSk7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZXNzaW9uLT53YWl0KTsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBDQVBJX0ZVTkNUSU9OX1JFTEVBU0U6CisJCQlhcHBsID0gQ0FQSU1TR19BUFBJRChza2ItPmRhdGEpOworCisJCQlhcHBsaWNhdGlvbiA9IGNtdHBfYXBwbGljYXRpb25fZ2V0KHNlc3Npb24sIENNVFBfTUFQUElORywgYXBwbCk7CisJCQlpZiAoYXBwbGljYXRpb24pIHsKKwkJCQlhcHBsaWNhdGlvbi0+c3RhdGUgPSBCVF9DTE9TRUQ7CisJCQkJYXBwbGljYXRpb24tPm1zZ251bSA9IDA7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZXNzaW9uLT53YWl0KTsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBDQVBJX0ZVTkNUSU9OX0dFVF9QUk9GSUxFOgorCQkJY29udHJvbGxlciA9IENBUElNU0dfVTE2KHNrYi0+ZGF0YSwgQ0FQSV9NU0dfQkFTRUxFTiArIDExKTsKKwkJCW1zZ251bSA9IENBUElNU0dfTVNHSUQoc2tiLT5kYXRhKTsKKworCQkJaWYgKCFpbmZvICYmIChtc2dudW0gPT0gQ01UUF9JTklUSUFMX01TR05VTSkpIHsKKwkJCQlzZXNzaW9uLT5uY29udHJvbGxlciA9IGNvbnRyb2xsZXI7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZXNzaW9uLT53YWl0KTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKCFpbmZvICYmIGN0cmwpIHsKKwkJCQltZW1jcHkoJmN0cmwtPnByb2ZpbGUsCisJCQkJCXNrYi0+ZGF0YSArIENBUElfTVNHX0JBU0VMRU4gKyAxMSwKKwkJCQkJc2l6ZW9mKGNhcGlfcHJvZmlsZSkpOworCQkJCXNlc3Npb24tPnN0YXRlID0gQlRfQ09OTkVDVEVEOworCQkJCWNhcGlfY3RyX3JlYWR5KGN0cmwpOworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIENBUElfRlVOQ1RJT05fR0VUX01BTlVGQUNUVVJFUjoKKwkJCWNvbnRyb2xsZXIgPSBDQVBJTVNHX1UzMihza2ItPmRhdGEsIENBUElfTVNHX0JBU0VMRU4gKyAxMCk7CisKKwkJCWlmICghaW5mbyAmJiBjdHJsKSB7CisJCQkJc3RybmNweShjdHJsLT5tYW51LAorCQkJCQlza2ItPmRhdGEgKyBDQVBJX01TR19CQVNFTEVOICsgMTUsCisJCQkJCXNrYi0+ZGF0YVtDQVBJX01TR19CQVNFTEVOICsgMTRdKTsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBDQVBJX0ZVTkNUSU9OX0dFVF9WRVJTSU9OOgorCQkJY29udHJvbGxlciA9IENBUElNU0dfVTMyKHNrYi0+ZGF0YSwgQ0FQSV9NU0dfQkFTRUxFTiArIDEyKTsKKworCQkJaWYgKCFpbmZvICYmIGN0cmwpIHsKKwkJCQljdHJsLT52ZXJzaW9uLm1ham9ydmVyc2lvbiA9IENBUElNU0dfVTMyKHNrYi0+ZGF0YSwgQ0FQSV9NU0dfQkFTRUxFTiArIDE2KTsKKwkJCQljdHJsLT52ZXJzaW9uLm1pbm9ydmVyc2lvbiA9IENBUElNU0dfVTMyKHNrYi0+ZGF0YSwgQ0FQSV9NU0dfQkFTRUxFTiArIDIwKTsKKwkJCQljdHJsLT52ZXJzaW9uLm1ham9ybWFudXZlcnNpb24gPSBDQVBJTVNHX1UzMihza2ItPmRhdGEsIENBUElfTVNHX0JBU0VMRU4gKyAyNCk7CisJCQkJY3RybC0+dmVyc2lvbi5taW5vcm1hbnV2ZXJzaW9uID0gQ0FQSU1TR19VMzIoc2tiLT5kYXRhLCBDQVBJX01TR19CQVNFTEVOICsgMjgpOworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIENBUElfRlVOQ1RJT05fR0VUX1NFUklBTF9OVU1CRVI6CisJCQljb250cm9sbGVyID0gQ0FQSU1TR19VMzIoc2tiLT5kYXRhLCBDQVBJX01TR19CQVNFTEVOICsgMTIpOworCisJCQlpZiAoIWluZm8gJiYgY3RybCkgeworCQkJCW1lbXNldChjdHJsLT5zZXJpYWwsIDAsIENBUElfU0VSSUFMX0xFTik7CisJCQkJc3RybmNweShjdHJsLT5zZXJpYWwsCisJCQkJCXNrYi0+ZGF0YSArIENBUElfTVNHX0JBU0VMRU4gKyAxNywKKwkJCQkJc2tiLT5kYXRhW0NBUElfTVNHX0JBU0VMRU4gKyAxNl0pOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBDQVBJX0lORDoKKwkJZnVuYyA9IENBUElNU0dfVTE2KHNrYi0+ZGF0YSwgQ0FQSV9NU0dfQkFTRUxFTiArIDMpOworCisJCWlmIChmdW5jID09IENBUElfRlVOQ1RJT05fTE9PUEJBQ0spIHsKKwkJCWFwcGwgPSBDQVBJTVNHX0FQUElEKHNrYi0+ZGF0YSk7CisJCQltc2dudW0gPSBDQVBJTVNHX01TR0lEKHNrYi0+ZGF0YSk7CisJCQljbXRwX3NlbmRfaW50ZXJvcG1zZyhzZXNzaW9uLCBDQVBJX1JFU1AsIGFwcGwsIG1zZ251bSwgZnVuYywKKwkJCQkJCXNrYi0+ZGF0YSArIENBUElfTVNHX0JBU0VMRU4gKyA2LAorCQkJCQkJc2tiLT5kYXRhW0NBUElfTVNHX0JBU0VMRU4gKyA1XSk7CisJCX0KKworCQlicmVhazsKKwl9CisKKwlrZnJlZV9za2Ioc2tiKTsKK30KKwordm9pZCBjbXRwX3JlY3ZfY2FwaW1zZyhzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBjYXBpX2N0ciAqY3RybCA9ICZzZXNzaW9uLT5jdHJsOworCXN0cnVjdCBjbXRwX2FwcGxpY2F0aW9uICphcHBsaWNhdGlvbjsKKwlfX3UxNiBjbWQsIGFwcGw7CisJX191MzIgY29udHI7CisKKwlCVF9EQkcoInNlc3Npb24gJXAgc2tiICVwIGxlbiAlZCIsIHNlc3Npb24sIHNrYiwgc2tiLT5sZW4pOworCisJaWYgKENBUElNU0dfQ09NTUFORChza2ItPmRhdGEpID09IENBUElfSU5URVJPUEVSQUJJTElUWSkgeworCQljbXRwX3JlY3ZfaW50ZXJvcG1zZyhzZXNzaW9uLCBza2IpOworCQlyZXR1cm47CisJfQorCisJaWYgKHNlc3Npb24tPmZsYWdzICYgKDEgPDwgQ01UUF9MT09QQkFDSykpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisKKwljbWQgPSBDQVBJQ01EKENBUElNU0dfQ09NTUFORChza2ItPmRhdGEpLCBDQVBJTVNHX1NVQkNPTU1BTkQoc2tiLT5kYXRhKSk7CisJYXBwbCA9IENBUElNU0dfQVBQSUQoc2tiLT5kYXRhKTsKKwljb250ciA9IENBUElNU0dfQ09OVFJPTChza2ItPmRhdGEpOworCisJYXBwbGljYXRpb24gPSBjbXRwX2FwcGxpY2F0aW9uX2dldChzZXNzaW9uLCBDTVRQX01BUFBJTkcsIGFwcGwpOworCWlmIChhcHBsaWNhdGlvbikgeworCQlhcHBsID0gYXBwbGljYXRpb24tPmFwcGw7CisJCUNBUElNU0dfU0VUQVBQSUQoc2tiLT5kYXRhLCBhcHBsKTsKKwl9IGVsc2UgeworCQlCVF9FUlIoIkNhbid0IGZpbmQgYXBwbGljYXRpb24gd2l0aCBpZCAlZCIsIGFwcGwpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgoY29udHIgJiAweDdmKSA9PSAweDAxKSB7CisJCWNvbnRyID0gKGNvbnRyICYgMHhmZmZmZmY4MCkgfCBzZXNzaW9uLT5udW07CisJCUNBUElNU0dfU0VUQ09OVFJPTChza2ItPmRhdGEsIGNvbnRyKTsKKwl9CisKKwlpZiAoIWN0cmwpIHsKKwkJQlRfRVJSKCJDYW4ndCBmaW5kIGNvbnRyb2xsZXIgJWQgZm9yIG1lc3NhZ2UiLCBzZXNzaW9uLT5udW0pOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKworCWNhcGlfY3RyX2hhbmRsZV9tZXNzYWdlKGN0cmwsIGFwcGwsIHNrYik7Cit9CisKK3N0YXRpYyBpbnQgY210cF9sb2FkX2Zpcm13YXJlKHN0cnVjdCBjYXBpX2N0ciAqY3RybCwgY2FwaWxvYWRkYXRhICpkYXRhKQoreworCUJUX0RCRygiY3RybCAlcCBkYXRhICVwIiwgY3RybCwgZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY210cF9yZXNldF9jdHIoc3RydWN0IGNhcGlfY3RyICpjdHJsKQoreworCXN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24gPSBjdHJsLT5kcml2ZXJkYXRhOworCisJQlRfREJHKCJjdHJsICVwIiwgY3RybCk7CisKKwljYXBpX2N0cl9yZXNldGVkKGN0cmwpOworCisJYXRvbWljX2luYygmc2Vzc2lvbi0+dGVybWluYXRlKTsKKwljbXRwX3NjaGVkdWxlKHNlc3Npb24pOworfQorCitzdGF0aWMgdm9pZCBjbXRwX3JlZ2lzdGVyX2FwcGwoc3RydWN0IGNhcGlfY3RyICpjdHJsLCBfX3UxNiBhcHBsLCBjYXBpX3JlZ2lzdGVyX3BhcmFtcyAqcnApCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3RydWN0IGNtdHBfc2Vzc2lvbiAqc2Vzc2lvbiA9IGN0cmwtPmRyaXZlcmRhdGE7CisJc3RydWN0IGNtdHBfYXBwbGljYXRpb24gKmFwcGxpY2F0aW9uOworCXVuc2lnbmVkIGxvbmcgdGltZW8gPSBDTVRQX0lOVEVST1BfVElNRU9VVDsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKKwlpbnQgZXJyID0gMCwgbmNvbm4sIHdhbnQgPSBycC0+bGV2ZWwzY250OworCisJQlRfREJHKCJjdHJsICVwIGFwcGwgJWQgbGV2ZWwzY250ICVkIGRhdGFibGtjbnQgJWQgZGF0YWJsa2xlbiAlZCIsCisJCWN0cmwsIGFwcGwsIHJwLT5sZXZlbDNjbnQsIHJwLT5kYXRhYmxrY250LCBycC0+ZGF0YWJsa2xlbik7CisKKwlhcHBsaWNhdGlvbiA9IGNtdHBfYXBwbGljYXRpb25fYWRkKHNlc3Npb24sIGFwcGwpOworCWlmICghYXBwbGljYXRpb24pIHsKKwkJQlRfRVJSKCJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIG5ldyBhcHBsaWNhdGlvbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKHdhbnQgPCAwKQorCQluY29ubiA9IGN0cmwtPnByb2ZpbGUubmJjaGFubmVsICogLXdhbnQ7CisJZWxzZQorCQluY29ubiA9IHdhbnQ7CisKKwlpZiAobmNvbm4gPT0gMCkKKwkJbmNvbm4gPSBjdHJsLT5wcm9maWxlLm5iY2hhbm5lbDsKKworCWNhcGltc2dfc2V0dTE2KGJ1ZiwgMCwgbmNvbm4pOworCWNhcGltc2dfc2V0dTE2KGJ1ZiwgMiwgcnAtPmRhdGFibGtjbnQpOworCWNhcGltc2dfc2V0dTE2KGJ1ZiwgNCwgcnAtPmRhdGFibGtsZW4pOworCisJYXBwbGljYXRpb24tPnN0YXRlID0gQlRfQ09ORklHOworCWFwcGxpY2F0aW9uLT5tc2dudW0gPSBjbXRwX21zZ251bV9nZXQoc2Vzc2lvbik7CisKKwljbXRwX3NlbmRfaW50ZXJvcG1zZyhzZXNzaW9uLCBDQVBJX1JFUSwgMHgwMDAwLCBhcHBsaWNhdGlvbi0+bXNnbnVtLAorCQkJCUNBUElfRlVOQ1RJT05fUkVHSVNURVIsIGJ1ZiwgNik7CisKKwlhZGRfd2FpdF9xdWV1ZSgmc2Vzc2lvbi0+d2FpdCwgJndhaXQpOworCXdoaWxlICgxKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJaWYgKCF0aW1lbykgeworCQkJZXJyID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGFwcGxpY2F0aW9uLT5zdGF0ZSA9PSBCVF9DTE9TRUQpIHsKKwkJCWVyciA9IC1hcHBsaWNhdGlvbi0+ZXJyOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoYXBwbGljYXRpb24tPnN0YXRlID09IEJUX0NPTk5FQ1RFRCkKKwkJCWJyZWFrOworCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJZXJyID0gLUVJTlRSOworCQkJYnJlYWs7CisJCX0KKworCQl0aW1lbyA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW8pOworCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZzZXNzaW9uLT53YWl0LCAmd2FpdCk7CisKKwlpZiAoZXJyKSB7CisJCWNtdHBfYXBwbGljYXRpb25fZGVsKHNlc3Npb24sIGFwcGxpY2F0aW9uKTsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIHZvaWQgY210cF9yZWxlYXNlX2FwcGwoc3RydWN0IGNhcGlfY3RyICpjdHJsLCBfX3UxNiBhcHBsKQoreworCXN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24gPSBjdHJsLT5kcml2ZXJkYXRhOworCXN0cnVjdCBjbXRwX2FwcGxpY2F0aW9uICphcHBsaWNhdGlvbjsKKworCUJUX0RCRygiY3RybCAlcCBhcHBsICVkIiwgY3RybCwgYXBwbCk7CisKKwlhcHBsaWNhdGlvbiA9IGNtdHBfYXBwbGljYXRpb25fZ2V0KHNlc3Npb24sIENNVFBfQVBQTElELCBhcHBsKTsKKwlpZiAoIWFwcGxpY2F0aW9uKSB7CisJCUJUX0VSUigiQ2FuJ3QgZmluZCBhcHBsaWNhdGlvbiIpOworCQlyZXR1cm47CisJfQorCisJYXBwbGljYXRpb24tPm1zZ251bSA9IGNtdHBfbXNnbnVtX2dldChzZXNzaW9uKTsKKworCWNtdHBfc2VuZF9pbnRlcm9wbXNnKHNlc3Npb24sIENBUElfUkVRLCBhcHBsaWNhdGlvbi0+bWFwcGluZywgYXBwbGljYXRpb24tPm1zZ251bSwKKwkJCQlDQVBJX0ZVTkNUSU9OX1JFTEVBU0UsIE5VTEwsIDApOworCisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoc2Vzc2lvbi0+d2FpdCwKKwkJCShhcHBsaWNhdGlvbi0+c3RhdGUgPT0gQlRfQ0xPU0VEKSwgQ01UUF9JTlRFUk9QX1RJTUVPVVQpOworCisJY210cF9hcHBsaWNhdGlvbl9kZWwoc2Vzc2lvbiwgYXBwbGljYXRpb24pOworfQorCitzdGF0aWMgdTE2IGNtdHBfc2VuZF9tZXNzYWdlKHN0cnVjdCBjYXBpX2N0ciAqY3RybCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uID0gY3RybC0+ZHJpdmVyZGF0YTsKKwlzdHJ1Y3QgY210cF9hcHBsaWNhdGlvbiAqYXBwbGljYXRpb247CisJX191MTYgYXBwbDsKKwlfX3UzMiBjb250cjsKKworCUJUX0RCRygiY3RybCAlcCBza2IgJXAiLCBjdHJsLCBza2IpOworCisJYXBwbCA9IENBUElNU0dfQVBQSUQoc2tiLT5kYXRhKTsKKwljb250ciA9IENBUElNU0dfQ09OVFJPTChza2ItPmRhdGEpOworCisJYXBwbGljYXRpb24gPSBjbXRwX2FwcGxpY2F0aW9uX2dldChzZXNzaW9uLCBDTVRQX0FQUExJRCwgYXBwbCk7CisJaWYgKCghYXBwbGljYXRpb24pIHx8IChhcHBsaWNhdGlvbi0+c3RhdGUgIT0gQlRfQ09OTkVDVEVEKSkgeworCQlCVF9FUlIoIkNhbid0IGZpbmQgYXBwbGljYXRpb24gd2l0aCBpZCAlZCIsIGFwcGwpOworCQlyZXR1cm4gQ0FQSV9JTExBUFBOUjsKKwl9CisKKwlDQVBJTVNHX1NFVEFQUElEKHNrYi0+ZGF0YSwgYXBwbGljYXRpb24tPm1hcHBpbmcpOworCisJaWYgKChjb250ciAmIDB4N2YpID09IHNlc3Npb24tPm51bSkgeworCQljb250ciA9IChjb250ciAmIDB4ZmZmZmZmODApIHwgMHgwMTsKKwkJQ0FQSU1TR19TRVRDT05UUk9MKHNrYi0+ZGF0YSwgY29udHIpOworCX0KKworCWNtdHBfc2VuZF9jYXBpbXNnKHNlc3Npb24sIHNrYik7CisKKwlyZXR1cm4gQ0FQSV9OT0VSUk9SOworfQorCitzdGF0aWMgY2hhciAqY210cF9wcm9jaW5mbyhzdHJ1Y3QgY2FwaV9jdHIgKmN0cmwpCit7CisJcmV0dXJuICJDQVBJIE1lc3NhZ2UgVHJhbnNwb3J0IFByb3RvY29sIjsKK30KKworc3RhdGljIGludCBjbXRwX2N0cl9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHN0cnVjdCBjYXBpX2N0ciAqY3RybCkKK3sKKwlzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uID0gY3RybC0+ZHJpdmVyZGF0YTsKKwlzdHJ1Y3QgY210cF9hcHBsaWNhdGlvbiAqYXBwOworCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOworCWludCBsZW4gPSAwOworCisJbGVuICs9IHNwcmludGYocGFnZSArIGxlbiwgIiVzXG5cbiIsIGNtdHBfcHJvY2luZm8oY3RybCkpOworCWxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJhZGRyICVzXG4iLCBzZXNzaW9uLT5uYW1lKTsKKwlsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAiY3RybCAlZFxuIiwgc2Vzc2lvbi0+bnVtKTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuLCAmc2Vzc2lvbi0+YXBwbGljYXRpb25zKSB7CisJCWFwcCA9IGxpc3RfZW50cnkocCwgc3RydWN0IGNtdHBfYXBwbGljYXRpb24sIGxpc3QpOworCQlsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAiYXBwbCAlZCAtPiAlZFxuIiwgYXBwLT5hcHBsLCBhcHAtPm1hcHBpbmcpOworCX0KKworCWlmIChvZmYgKyBjb3VudCA+PSBsZW4pCisJCSplb2YgPSAxOworCisJaWYgKGxlbiA8IG9mZikKKwkJcmV0dXJuIDA7CisKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCisJcmV0dXJuICgoY291bnQgPCBsZW4gLSBvZmYpID8gY291bnQgOiBsZW4gLSBvZmYpOworfQorCisKK2ludCBjbXRwX2F0dGFjaF9kZXZpY2Uoc3RydWN0IGNtdHBfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKKwlsb25nIHJldDsKKworCUJUX0RCRygic2Vzc2lvbiAlcCIsIHNlc3Npb24pOworCisJY2FwaW1zZ19zZXR1MzIoYnVmLCAwLCAwKTsKKworCWNtdHBfc2VuZF9pbnRlcm9wbXNnKHNlc3Npb24sIENBUElfUkVRLCAweGZmZmYsIENNVFBfSU5JVElBTF9NU0dOVU0sCisJCQkJQ0FQSV9GVU5DVElPTl9HRVRfUFJPRklMRSwgYnVmLCA0KTsKKworCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHNlc3Npb24tPndhaXQsCisJCQlzZXNzaW9uLT5uY29udHJvbGxlciwgQ01UUF9JTlRFUk9QX1RJTUVPVVQpOworCQorCUJUX0lORk8oIkZvdW5kICVkIENBUEkgY29udHJvbGxlcihzKSBvbiBkZXZpY2UgJXMiLCBzZXNzaW9uLT5uY29udHJvbGxlciwgc2Vzc2lvbi0+bmFtZSk7CisKKwlpZiAoIXJldCkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlpZiAoIXNlc3Npb24tPm5jb250cm9sbGVyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChzZXNzaW9uLT5uY29udHJvbGxlciA+IDEpCisJCUJUX0lORk8oIlNldHRpbmcgdXAgb25seSBDQVBJIGNvbnRyb2xsZXIgMSIpOworCisJc2Vzc2lvbi0+Y3RybC5vd25lciAgICAgID0gVEhJU19NT0RVTEU7CisJc2Vzc2lvbi0+Y3RybC5kcml2ZXJkYXRhID0gc2Vzc2lvbjsKKwlzdHJjcHkoc2Vzc2lvbi0+Y3RybC5uYW1lLCBzZXNzaW9uLT5uYW1lKTsKKworCXNlc3Npb24tPmN0cmwuZHJpdmVyX25hbWUgICA9ICJjbXRwIjsKKwlzZXNzaW9uLT5jdHJsLmxvYWRfZmlybXdhcmUgPSBjbXRwX2xvYWRfZmlybXdhcmU7CisJc2Vzc2lvbi0+Y3RybC5yZXNldF9jdHIgICAgID0gY210cF9yZXNldF9jdHI7CisJc2Vzc2lvbi0+Y3RybC5yZWdpc3Rlcl9hcHBsID0gY210cF9yZWdpc3Rlcl9hcHBsOworCXNlc3Npb24tPmN0cmwucmVsZWFzZV9hcHBsICA9IGNtdHBfcmVsZWFzZV9hcHBsOworCXNlc3Npb24tPmN0cmwuc2VuZF9tZXNzYWdlICA9IGNtdHBfc2VuZF9tZXNzYWdlOworCisJc2Vzc2lvbi0+Y3RybC5wcm9jaW5mbyAgICAgID0gY210cF9wcm9jaW5mbzsKKwlzZXNzaW9uLT5jdHJsLmN0cl9yZWFkX3Byb2MgPSBjbXRwX2N0cl9yZWFkX3Byb2M7CisKKwlpZiAoYXR0YWNoX2NhcGlfY3RyKCZzZXNzaW9uLT5jdHJsKSA8IDApIHsKKwkJQlRfRVJSKCJDYW4ndCBhdHRhY2ggbmV3IGNvbnRyb2xsZXIiKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlzZXNzaW9uLT5udW0gPSBzZXNzaW9uLT5jdHJsLmNucjsKKworCUJUX0RCRygic2Vzc2lvbiAlcCBudW0gJWQiLCBzZXNzaW9uLCBzZXNzaW9uLT5udW0pOworCisJY2FwaW1zZ19zZXR1MzIoYnVmLCAwLCAxKTsKKworCWNtdHBfc2VuZF9pbnRlcm9wbXNnKHNlc3Npb24sIENBUElfUkVRLCAweGZmZmYsIGNtdHBfbXNnbnVtX2dldChzZXNzaW9uKSwKKwkJCQlDQVBJX0ZVTkNUSU9OX0dFVF9NQU5VRkFDVFVSRVIsIGJ1ZiwgNCk7CisKKwljbXRwX3NlbmRfaW50ZXJvcG1zZyhzZXNzaW9uLCBDQVBJX1JFUSwgMHhmZmZmLCBjbXRwX21zZ251bV9nZXQoc2Vzc2lvbiksCisJCQkJQ0FQSV9GVU5DVElPTl9HRVRfVkVSU0lPTiwgYnVmLCA0KTsKKworCWNtdHBfc2VuZF9pbnRlcm9wbXNnKHNlc3Npb24sIENBUElfUkVRLCAweGZmZmYsIGNtdHBfbXNnbnVtX2dldChzZXNzaW9uKSwKKwkJCQlDQVBJX0ZVTkNUSU9OX0dFVF9TRVJJQUxfTlVNQkVSLCBidWYsIDQpOworCisJY210cF9zZW5kX2ludGVyb3Btc2coc2Vzc2lvbiwgQ0FQSV9SRVEsIDB4ZmZmZiwgY210cF9tc2dudW1fZ2V0KHNlc3Npb24pLAorCQkJCUNBUElfRlVOQ1RJT05fR0VUX1BST0ZJTEUsIGJ1ZiwgNCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjbXRwX2RldGFjaF9kZXZpY2Uoc3RydWN0IGNtdHBfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwlCVF9EQkcoInNlc3Npb24gJXAiLCBzZXNzaW9uKTsKKworCWRldGFjaF9jYXBpX2N0cigmc2Vzc2lvbi0+Y3RybCk7Cit9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2NtdHAvY210cC5oIGIvbmV0L2JsdWV0b290aC9jbXRwL2NtdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGUzZGZlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9jbXRwL2NtdHAuaApAQCAtMCwwICsxLDEzNSBAQAorLyogCisgICBDTVRQIGltcGxlbWVudGF0aW9uIGZvciBMaW51eCBCbHVldG9vdGggc3RhY2sgKEJsdWVaKS4KKyAgIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBBTkQgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyAKKyAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiAKKyAgIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIAorICAgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworICAgQUxMIExJQUJJTElUWSwgSU5DTFVESU5HIExJQUJJTElUWSBGT1IgSU5GUklOR0VNRU5UIE9GIEFOWSBQQVRFTlRTLCAKKyAgIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLCBSRUxBVElORyBUTyBVU0UgT0YgVEhJUyAKKyAgIFNPRlRXQVJFIElTIERJU0NMQUlNRUQuCisqLworCisjaWZuZGVmIF9fQ01UUF9ICisjZGVmaW5lIF9fQ01UUF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CisKKyNkZWZpbmUgQlROQU1TSVogMTgKKworLyogQ01UUCBpb2N0bCBkZWZpbmVzICovCisjZGVmaW5lIENNVFBDT05OQURECV9JT1coJ0MnLCAyMDAsIGludCkKKyNkZWZpbmUgQ01UUENPTk5ERUwJX0lPVygnQycsIDIwMSwgaW50KQorI2RlZmluZSBDTVRQR0VUQ09OTkxJU1QJX0lPUignQycsIDIxMCwgaW50KQorI2RlZmluZSBDTVRQR0VUQ09OTklORk8JX0lPUignQycsIDIxMSwgaW50KQorCisjZGVmaW5lIENNVFBfTE9PUEJBQ0sJMAorCitzdHJ1Y3QgY210cF9jb25uYWRkX3JlcSB7CisJaW50ICAgc29jazsJLy8gQ29ubmVjdGVkIHNvY2tldAorCV9fdTMyIGZsYWdzOworfTsKKworc3RydWN0IGNtdHBfY29ubmRlbF9yZXEgeworCWJkYWRkcl90IGJkYWRkcjsKKwlfX3UzMiAgICBmbGFnczsKK307CisKK3N0cnVjdCBjbXRwX2Nvbm5pbmZvIHsKKwliZGFkZHJfdCBiZGFkZHI7CisJX191MzIgICAgZmxhZ3M7CisJX191MTYgICAgc3RhdGU7CisJaW50ICAgICAgbnVtOworfTsKKworc3RydWN0IGNtdHBfY29ubmxpc3RfcmVxIHsKKwlfX3UzMiAgY251bTsKKwlzdHJ1Y3QgY210cF9jb25uaW5mbyBfX3VzZXIgKmNpOworfTsKKworaW50IGNtdHBfYWRkX2Nvbm5lY3Rpb24oc3RydWN0IGNtdHBfY29ubmFkZF9yZXEgKnJlcSwgc3RydWN0IHNvY2tldCAqc29jayk7CitpbnQgY210cF9kZWxfY29ubmVjdGlvbihzdHJ1Y3QgY210cF9jb25uZGVsX3JlcSAqcmVxKTsKK2ludCBjbXRwX2dldF9jb25ubGlzdChzdHJ1Y3QgY210cF9jb25ubGlzdF9yZXEgKnJlcSk7CitpbnQgY210cF9nZXRfY29ubmluZm8oc3RydWN0IGNtdHBfY29ubmluZm8gKmNpKTsKKworLyogQ01UUCBzZXNzaW9uIGRlZmluZXMgKi8KKyNkZWZpbmUgQ01UUF9JTlRFUk9QX1RJTUVPVVQJKEhaICogNSkKKyNkZWZpbmUgQ01UUF9JTklUSUFMX01TR05VTQkweGZmMDAKKworc3RydWN0IGNtdHBfc2Vzc2lvbiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJc3RydWN0IHNvY2tldCAqc29jazsKKworCWJkYWRkcl90IGJkYWRkcjsKKworCXVuc2lnbmVkIGxvbmcgc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXVpbnQgbXR1OworCisJY2hhciBuYW1lW0JUTkFNU0laXTsKKworCWF0b21pY190IHRlcm1pbmF0ZTsKKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CisKKwlpbnQgbmNvbnRyb2xsZXI7CisJaW50IG51bTsKKwlzdHJ1Y3QgY2FwaV9jdHIgY3RybDsKKworCXN0cnVjdCBsaXN0X2hlYWQgYXBwbGljYXRpb25zOworCisJdW5zaWduZWQgbG9uZyBibG9ja2lkczsKKwlpbnQgbXNnbnVtOworCisJc3RydWN0IHNrX2J1ZmZfaGVhZCB0cmFuc21pdDsKKworCXN0cnVjdCBza19idWZmICpyZWFzc2VtYmx5WzE2XTsKK307CisKK3N0cnVjdCBjbXRwX2FwcGxpY2F0aW9uIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwl1bnNpZ25lZCBsb25nIHN0YXRlOworCWludCBlcnI7CisKKwlfX3UxNiBhcHBsOworCV9fdTE2IG1hcHBpbmc7CisKKwlfX3UxNiBtc2dudW07Cit9OworCitzdHJ1Y3QgY210cF9zY2IgeworCWludCBpZDsKKwlpbnQgZGF0YTsKK307CisKK2ludCAgY210cF9hdHRhY2hfZGV2aWNlKHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24pOwordm9pZCBjbXRwX2RldGFjaF9kZXZpY2Uoc3RydWN0IGNtdHBfc2Vzc2lvbiAqc2Vzc2lvbik7CisKK3ZvaWQgY210cF9yZWN2X2NhcGltc2coc3RydWN0IGNtdHBfc2Vzc2lvbiAqc2Vzc2lvbiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbXRwX3NjaGVkdWxlKHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc2Vzc2lvbi0+c29jay0+c2s7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoc2stPnNrX3NsZWVwKTsKK30KKworLyogQ01UUCBpbml0IGRlZmluZXMgKi8KK2ludCBjbXRwX2luaXRfc29ja2V0cyh2b2lkKTsKK3ZvaWQgY210cF9jbGVhbnVwX3NvY2tldHModm9pZCk7CisKKyNlbmRpZiAvKiBfX0NNVFBfSCAqLwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9jbXRwL2NvcmUuYyBiL25ldC9ibHVldG9vdGgvY210cC9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBjZTA0ZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9ibHVldG9vdGgvY210cC9jb3JlLmMKQEAgLTAsMCArMSw1MDQgQEAKKy8qIAorICAgQ01UUCBpbXBsZW1lbnRhdGlvbiBmb3IgTGludXggQmx1ZXRvb3RoIHN0YWNrIChCbHVlWikuCisgICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBNYXJjZWwgSG9sdG1hbm4gPG1hcmNlbEBob2x0bWFubi5vcmc+CisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQgT0YgVEhJUkQgUEFSVFkgUklHSFRTLgorICAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIoUykgQU5EIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWQorICAgQ0xBSU0sIE9SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgCisgICBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gCisgICBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiAKKyAgIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyAgIEFMTCBMSUFCSUxJVFksIElOQ0xVRElORyBMSUFCSUxJVFkgRk9SIElORlJJTkdFTUVOVCBPRiBBTlkgUEFURU5UUywgCisgICBDT1BZUklHSFRTLCBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUywgUkVMQVRJTkcgVE8gVVNFIE9GIFRISVMgCisgICBTT0ZUV0FSRSBJUyBESVNDTEFJTUVELgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pc2RuL2NhcGlsbGkuaD4KKworI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9sMmNhcC5oPgorCisjaW5jbHVkZSAiY210cC5oIgorCisjaWZuZGVmIENPTkZJR19CVF9DTVRQX0RFQlVHCisjdW5kZWYgIEJUX0RCRworI2RlZmluZSBCVF9EQkcoRC4uLikKKyNlbmRpZgorCisjZGVmaW5lIFZFUlNJT04gIjEuMCIKKworc3RhdGljIERFQ0xBUkVfUldTRU0oY210cF9zZXNzaW9uX3NlbSk7CitzdGF0aWMgTElTVF9IRUFEKGNtdHBfc2Vzc2lvbl9saXN0KTsKKworc3RhdGljIHN0cnVjdCBjbXRwX3Nlc3Npb24gKl9fY210cF9nZXRfc2Vzc2lvbihiZGFkZHJfdCAqYmRhZGRyKQoreworCXN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb247CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworCUJUX0RCRygiIik7CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZjbXRwX3Nlc3Npb25fbGlzdCkgeworCQlzZXNzaW9uID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgY210cF9zZXNzaW9uLCBsaXN0KTsKKwkJaWYgKCFiYWNtcChiZGFkZHIsICZzZXNzaW9uLT5iZGFkZHIpKQorCQkJcmV0dXJuIHNlc3Npb247CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBfX2NtdHBfbGlua19zZXNzaW9uKHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24pCit7CisJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKwlsaXN0X2FkZCgmc2Vzc2lvbi0+bGlzdCwgJmNtdHBfc2Vzc2lvbl9saXN0KTsKK30KKworc3RhdGljIHZvaWQgX19jbXRwX3VubGlua19zZXNzaW9uKHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24pCit7CisJbGlzdF9kZWwoJnNlc3Npb24tPmxpc3QpOworCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworfQorCitzdGF0aWMgdm9pZCBfX2NtdHBfY29weV9zZXNzaW9uKHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24sIHN0cnVjdCBjbXRwX2Nvbm5pbmZvICpjaSkKK3sKKwliYWNweSgmY2ktPmJkYWRkciwgJnNlc3Npb24tPmJkYWRkcik7CisKKwljaS0+ZmxhZ3MgPSBzZXNzaW9uLT5mbGFnczsKKwljaS0+c3RhdGUgPSBzZXNzaW9uLT5zdGF0ZTsKKworCWNpLT5udW0gPSBzZXNzaW9uLT5udW07Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgY210cF9hbGxvY19ibG9ja19pZChzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uKQoreworCWludCBpLCBpZCA9IC0xOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCWlmICghdGVzdF9hbmRfc2V0X2JpdChpLCAmc2Vzc2lvbi0+YmxvY2tpZHMpKSB7CisJCQlpZCA9IGk7CisJCQlicmVhazsKKwkJfQorCisJcmV0dXJuIGlkOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY210cF9mcmVlX2Jsb2NrX2lkKHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24sIGludCBpZCkKK3sKKwljbGVhcl9iaXQoaWQsICZzZXNzaW9uLT5ibG9ja2lkcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbXRwX2FkZF9tc2dwYXJ0KHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24sIGludCBpZCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNlc3Npb24tPnJlYXNzZW1ibHlbaWRdLCAqbnNrYjsKKwlpbnQgc2l6ZTsKKworCUJUX0RCRygic2Vzc2lvbiAlcCBidWYgJXAgY291bnQgJWQiLCBzZXNzaW9uLCBidWYsIGNvdW50KTsKKworCXNpemUgPSAoc2tiKSA/IHNrYi0+bGVuICsgY291bnQgOiBjb3VudDsKKworCWlmICghKG5za2IgPSBhbGxvY19za2Ioc2l6ZSwgR0ZQX0FUT01JQykpKSB7CisJCUJUX0VSUigiQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBDQVBJIG1lc3NhZ2UiKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChza2IgJiYgKHNrYi0+bGVuID4gMCkpCisJCW1lbWNweShza2JfcHV0KG5za2IsIHNrYi0+bGVuKSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisKKwltZW1jcHkoc2tiX3B1dChuc2tiLCBjb3VudCksIGJ1ZiwgY291bnQpOworCisJc2Vzc2lvbi0+cmVhc3NlbWJseVtpZF0gPSBuc2tiOworCisJaWYgKHNrYikKKwkJa2ZyZWVfc2tiKHNrYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNtdHBfcmVjdl9mcmFtZShzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCV9fdTggaGRyLCBoZHJsZW4sIGlkOworCV9fdTE2IGxlbjsKKworCUJUX0RCRygic2Vzc2lvbiAlcCBza2IgJXAgbGVuICVkIiwgc2Vzc2lvbiwgc2tiLCBza2ItPmxlbik7CisKKwl3aGlsZSAoc2tiLT5sZW4gPiAwKSB7CisJCWhkciA9IHNrYi0+ZGF0YVswXTsKKworCQlzd2l0Y2ggKGhkciAmIDB4YzApIHsKKwkJY2FzZSAweDQwOgorCQkJaGRybGVuID0gMjsKKwkJCWxlbiA9IHNrYi0+ZGF0YVsxXTsKKwkJCWJyZWFrOworCQljYXNlIDB4ODA6CisJCQloZHJsZW4gPSAzOworCQkJbGVuID0gc2tiLT5kYXRhWzFdIHwgKHNrYi0+ZGF0YVsyXSA8PCA4KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaGRybGVuID0gMTsKKwkJCWxlbiA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCWlkID0gKGhkciAmIDB4M2MpID4+IDI7CisKKwkJQlRfREJHKCJoZHIgMHglMDJ4IGhkcmxlbiAlZCBsZW4gJWQgaWQgJWQiLCBoZHIsIGhkcmxlbiwgbGVuLCBpZCk7CisKKwkJaWYgKGhkcmxlbiArIGxlbiA+IHNrYi0+bGVuKSB7CisJCQlCVF9FUlIoIldyb25nIHNpemUgb3IgaGVhZGVyIGluZm9ybWF0aW9uIGluIENNVFAgZnJhbWUiKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGxlbiA9PSAwKSB7CisJCQlza2JfcHVsbChza2IsIGhkcmxlbik7CisJCQljb250aW51ZTsKKwkJfQorCisJCXN3aXRjaCAoaGRyICYgMHgwMykgeworCQljYXNlIDB4MDA6CisJCQljbXRwX2FkZF9tc2dwYXJ0KHNlc3Npb24sIGlkLCBza2ItPmRhdGEgKyBoZHJsZW4sIGxlbik7CisJCQljbXRwX3JlY3ZfY2FwaW1zZyhzZXNzaW9uLCBzZXNzaW9uLT5yZWFzc2VtYmx5W2lkXSk7CisJCQlzZXNzaW9uLT5yZWFzc2VtYmx5W2lkXSA9IE5VTEw7CisJCQlicmVhazsKKwkJY2FzZSAweDAxOgorCQkJY210cF9hZGRfbXNncGFydChzZXNzaW9uLCBpZCwgc2tiLT5kYXRhICsgaGRybGVuLCBsZW4pOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAoc2Vzc2lvbi0+cmVhc3NlbWJseVtpZF0gIT0gTlVMTCkKKwkJCQlrZnJlZV9za2Ioc2Vzc2lvbi0+cmVhc3NlbWJseVtpZF0pOworCQkJc2Vzc2lvbi0+cmVhc3NlbWJseVtpZF0gPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKworCQlza2JfcHVsbChza2IsIGhkcmxlbiArIGxlbik7CisJfQorCisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY210cF9zZW5kX2ZyYW1lKHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24sIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IHNvY2tldCAqc29jayA9IHNlc3Npb24tPnNvY2s7CisJc3RydWN0IGt2ZWMgaXYgPSB7IGRhdGEsIGxlbiB9OworCXN0cnVjdCBtc2doZHIgbXNnOworCisJQlRfREJHKCJzZXNzaW9uICVwIGRhdGEgJXAgbGVuICVkIiwgc2Vzc2lvbiwgZGF0YSwgbGVuKTsKKworCWlmICghbGVuKQorCQlyZXR1cm4gMDsKKworCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisKKwlyZXR1cm4ga2VybmVsX3NlbmRtc2coc29jaywgJm1zZywgJml2LCAxLCBsZW4pOworfQorCitzdGF0aWMgaW50IGNtdHBfcHJvY2Vzc190cmFuc21pdChzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uKQoreworCXN0cnVjdCBza19idWZmICpza2IsICpuc2tiOworCXVuc2lnbmVkIGNoYXIgKmhkcjsKKwl1bnNpZ25lZCBpbnQgc2l6ZSwgdGFpbDsKKworCUJUX0RCRygic2Vzc2lvbiAlcCIsIHNlc3Npb24pOworCisJaWYgKCEobnNrYiA9IGFsbG9jX3NrYihzZXNzaW9uLT5tdHUsIEdGUF9BVE9NSUMpKSkgeworCQlCVF9FUlIoIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgbmV3IGZyYW1lIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnNlc3Npb24tPnRyYW5zbWl0KSkpIHsKKwkJc3RydWN0IGNtdHBfc2NiICpzY2IgPSAodm9pZCAqKSBza2ItPmNiOworCisJCWlmICgodGFpbCA9IChzZXNzaW9uLT5tdHUgLSBuc2tiLT5sZW4pKSA8IDUpIHsKKwkJCWNtdHBfc2VuZF9mcmFtZShzZXNzaW9uLCBuc2tiLT5kYXRhLCBuc2tiLT5sZW4pOworCQkJc2tiX3RyaW0obnNrYiwgMCk7CisJCQl0YWlsID0gc2Vzc2lvbi0+bXR1OworCQl9CisKKwkJc2l6ZSA9IG1pbl90KHVpbnQsICgodGFpbCA8IDI1OCkgPyAodGFpbCAtIDIpIDogKHRhaWwgLSAzKSksIHNrYi0+bGVuKTsKKworCQlpZiAoKHNjYi0+aWQgPCAwKSAmJiAoKHNjYi0+aWQgPSBjbXRwX2FsbG9jX2Jsb2NrX2lkKHNlc3Npb24pKSA8IDApKSB7CisJCQlza2JfcXVldWVfaGVhZCgmc2Vzc2lvbi0+dHJhbnNtaXQsIHNrYik7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzaXplIDwgMjU2KSB7CisJCQloZHIgPSBza2JfcHV0KG5za2IsIDIpOworCQkJaGRyWzBdID0gMHg0MAorCQkJCXwgKChzY2ItPmlkIDw8IDIpICYgMHgzYykKKwkJCQl8ICgoc2tiLT5sZW4gPT0gc2l6ZSkgPyAweDAwIDogMHgwMSk7CisJCQloZHJbMV0gPSBzaXplOworCQl9IGVsc2UgeworCQkJaGRyID0gc2tiX3B1dChuc2tiLCAzKTsKKwkJCWhkclswXSA9IDB4ODAKKwkJCQl8ICgoc2NiLT5pZCA8PCAyKSAmIDB4M2MpCisJCQkJfCAoKHNrYi0+bGVuID09IHNpemUpID8gMHgwMCA6IDB4MDEpOworCQkJaGRyWzFdID0gc2l6ZSAmIDB4ZmY7CisJCQloZHJbMl0gPSBzaXplID4+IDg7CisJCX0KKworCQltZW1jcHkoc2tiX3B1dChuc2tiLCBzaXplKSwgc2tiLT5kYXRhLCBzaXplKTsKKwkJc2tiX3B1bGwoc2tiLCBzaXplKTsKKworCQlpZiAoc2tiLT5sZW4gPiAwKSB7CisJCQlza2JfcXVldWVfaGVhZCgmc2Vzc2lvbi0+dHJhbnNtaXQsIHNrYik7CisJCX0gZWxzZSB7CisJCQljbXRwX2ZyZWVfYmxvY2tfaWQoc2Vzc2lvbiwgc2NiLT5pZCk7CisJCQlpZiAoc2NiLT5kYXRhKSB7CisJCQkJY210cF9zZW5kX2ZyYW1lKHNlc3Npb24sIG5za2ItPmRhdGEsIG5za2ItPmxlbik7CisJCQkJc2tiX3RyaW0obnNrYiwgMCk7CisJCQl9CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJfQorCX0KKworCWNtdHBfc2VuZF9mcmFtZShzZXNzaW9uLCBuc2tiLT5kYXRhLCBuc2tiLT5sZW4pOworCisJa2ZyZWVfc2tiKG5za2IpOworCisJcmV0dXJuIHNrYl9xdWV1ZV9sZW4oJnNlc3Npb24tPnRyYW5zbWl0KTsKK30KKworc3RhdGljIGludCBjbXRwX3Nlc3Npb24odm9pZCAqYXJnKQoreworCXN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24gPSBhcmc7CisJc3RydWN0IHNvY2sgKnNrID0gc2Vzc2lvbi0+c29jay0+c2s7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl3YWl0X3F1ZXVlX3Qgd2FpdDsKKworCUJUX0RCRygic2Vzc2lvbiAlcCIsIHNlc3Npb24pOworCisJZGFlbW9uaXplKCJrY210cGRfY3RyXyVkIiwgc2Vzc2lvbi0+bnVtKTsKKwlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0xNSk7CisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CisKKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CisJYWRkX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJd2hpbGUgKCFhdG9taWNfcmVhZCgmc2Vzc2lvbi0+dGVybWluYXRlKSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCWlmIChzay0+c2tfc3RhdGUgIT0gQlRfQ09OTkVDVEVEKQorCQkJYnJlYWs7CisKKwkJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKSkgeworCQkJc2tiX29ycGhhbihza2IpOworCQkJY210cF9yZWN2X2ZyYW1lKHNlc3Npb24sIHNrYik7CisJCX0KKworCQljbXRwX3Byb2Nlc3NfdHJhbnNtaXQoc2Vzc2lvbik7CisKKwkJc2NoZWR1bGUoKTsKKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKKworCWRvd25fd3JpdGUoJmNtdHBfc2Vzc2lvbl9zZW0pOworCisJaWYgKCEoc2Vzc2lvbi0+ZmxhZ3MgJiAoMSA8PCBDTVRQX0xPT1BCQUNLKSkpCisJCWNtdHBfZGV0YWNoX2RldmljZShzZXNzaW9uKTsKKworCWZwdXQoc2Vzc2lvbi0+c29jay0+ZmlsZSk7CisKKwlfX2NtdHBfdW5saW5rX3Nlc3Npb24oc2Vzc2lvbik7CisKKwl1cF93cml0ZSgmY210cF9zZXNzaW9uX3NlbSk7CisKKwlrZnJlZShzZXNzaW9uKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGNtdHBfYWRkX2Nvbm5lY3Rpb24oc3RydWN0IGNtdHBfY29ubmFkZF9yZXEgKnJlcSwgc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uLCAqczsKKwliZGFkZHJfdCBzcmMsIGRzdDsKKwlpbnQgaSwgZXJyOworCisJQlRfREJHKCIiKTsKKworCWJhc3dhcCgmc3JjLCAmYnRfc2soc29jay0+c2spLT5zcmMpOworCWJhc3dhcCgmZHN0LCAmYnRfc2soc29jay0+c2spLT5kc3QpOworCisJc2Vzc2lvbiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbXRwX3Nlc3Npb24pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNlc3Npb24pIAorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoc2Vzc2lvbiwgMCwgc2l6ZW9mKHN0cnVjdCBjbXRwX3Nlc3Npb24pKTsKKworCWRvd25fd3JpdGUoJmNtdHBfc2Vzc2lvbl9zZW0pOworCisJcyA9IF9fY210cF9nZXRfc2Vzc2lvbigmYnRfc2soc29jay0+c2spLT5kc3QpOworCWlmIChzICYmIHMtPnN0YXRlID09IEJUX0NPTk5FQ1RFRCkgeworCQllcnIgPSAtRUVYSVNUOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwliYWNweSgmc2Vzc2lvbi0+YmRhZGRyLCAmYnRfc2soc29jay0+c2spLT5kc3QpOworCisJc2Vzc2lvbi0+bXR1ID0gbWluX3QodWludCwgbDJjYXBfcGkoc29jay0+c2spLT5vbXR1LCBsMmNhcF9waShzb2NrLT5zayktPmltdHUpOworCisJQlRfREJHKCJtdHUgJWQiLCBzZXNzaW9uLT5tdHUpOworCisJc3ByaW50ZihzZXNzaW9uLT5uYW1lLCAiJXMiLCBiYXRvc3RyKCZkc3QpKTsKKworCXNlc3Npb24tPnNvY2sgID0gc29jazsKKwlzZXNzaW9uLT5zdGF0ZSA9IEJUX0NPTkZJRzsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNlc3Npb24tPndhaXQpOworCisJc2Vzc2lvbi0+bXNnbnVtID0gQ01UUF9JTklUSUFMX01TR05VTTsKKworCUlOSVRfTElTVF9IRUFEKCZzZXNzaW9uLT5hcHBsaWNhdGlvbnMpOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2Vzc2lvbi0+dHJhbnNtaXQpOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCXNlc3Npb24tPnJlYXNzZW1ibHlbaV0gPSBOVUxMOworCisJc2Vzc2lvbi0+ZmxhZ3MgPSByZXEtPmZsYWdzOworCisJX19jbXRwX2xpbmtfc2Vzc2lvbihzZXNzaW9uKTsKKworCWVyciA9IGtlcm5lbF90aHJlYWQoY210cF9zZXNzaW9uLCBzZXNzaW9uLCBDTE9ORV9LRVJORUwpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIHVubGluazsKKworCWlmICghKHNlc3Npb24tPmZsYWdzICYgKDEgPDwgQ01UUF9MT09QQkFDSykpKSB7CisJCWVyciA9IGNtdHBfYXR0YWNoX2RldmljZShzZXNzaW9uKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGRldGFjaDsKKwl9CisKKwl1cF93cml0ZSgmY210cF9zZXNzaW9uX3NlbSk7CisJcmV0dXJuIDA7CisKK2RldGFjaDoKKwljbXRwX2RldGFjaF9kZXZpY2Uoc2Vzc2lvbik7CisKK3VubGluazoKKwlfX2NtdHBfdW5saW5rX3Nlc3Npb24oc2Vzc2lvbik7CisKK2ZhaWxlZDoKKwl1cF93cml0ZSgmY210cF9zZXNzaW9uX3NlbSk7CisJa2ZyZWUoc2Vzc2lvbik7CisJcmV0dXJuIGVycjsKK30KKworaW50IGNtdHBfZGVsX2Nvbm5lY3Rpb24oc3RydWN0IGNtdHBfY29ubmRlbF9yZXEgKnJlcSkKK3sKKwlzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uOworCWludCBlcnIgPSAwOworCisJQlRfREJHKCIiKTsKKworCWRvd25fcmVhZCgmY210cF9zZXNzaW9uX3NlbSk7CisKKwlzZXNzaW9uID0gX19jbXRwX2dldF9zZXNzaW9uKCZyZXEtPmJkYWRkcik7CisJaWYgKHNlc3Npb24pIHsKKwkJLyogRmx1c2ggdGhlIHRyYW5zbWl0IHF1ZXVlICovCisJCXNrYl9xdWV1ZV9wdXJnZSgmc2Vzc2lvbi0+dHJhbnNtaXQpOworCisJCS8qIEtpbGwgc2Vzc2lvbiB0aHJlYWQgKi8KKwkJYXRvbWljX2luYygmc2Vzc2lvbi0+dGVybWluYXRlKTsKKwkJY210cF9zY2hlZHVsZShzZXNzaW9uKTsKKwl9IGVsc2UKKwkJZXJyID0gLUVOT0VOVDsKKworCXVwX3JlYWQoJmNtdHBfc2Vzc2lvbl9zZW0pOworCXJldHVybiBlcnI7Cit9CisKK2ludCBjbXRwX2dldF9jb25ubGlzdChzdHJ1Y3QgY210cF9jb25ubGlzdF9yZXEgKnJlcSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCWludCBlcnIgPSAwLCBuID0gMDsKKworCUJUX0RCRygiIik7CisKKwlkb3duX3JlYWQoJmNtdHBfc2Vzc2lvbl9zZW0pOworCisJbGlzdF9mb3JfZWFjaChwLCAmY210cF9zZXNzaW9uX2xpc3QpIHsKKwkJc3RydWN0IGNtdHBfc2Vzc2lvbiAqc2Vzc2lvbjsKKwkJc3RydWN0IGNtdHBfY29ubmluZm8gY2k7CisKKwkJc2Vzc2lvbiA9IGxpc3RfZW50cnkocCwgc3RydWN0IGNtdHBfc2Vzc2lvbiwgbGlzdCk7CisKKwkJX19jbXRwX2NvcHlfc2Vzc2lvbihzZXNzaW9uLCAmY2kpOworCisJCWlmIChjb3B5X3RvX3VzZXIocmVxLT5jaSwgJmNpLCBzaXplb2YoY2kpKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCsrbiA+PSByZXEtPmNudW0pCisJCQlicmVhazsKKworCQlyZXEtPmNpKys7CisJfQorCXJlcS0+Y251bSA9IG47CisKKwl1cF9yZWFkKCZjbXRwX3Nlc3Npb25fc2VtKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgY210cF9nZXRfY29ubmluZm8oc3RydWN0IGNtdHBfY29ubmluZm8gKmNpKQoreworCXN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb247CisJaW50IGVyciA9IDA7CisKKwlkb3duX3JlYWQoJmNtdHBfc2Vzc2lvbl9zZW0pOworCisJc2Vzc2lvbiA9IF9fY210cF9nZXRfc2Vzc2lvbigmY2ktPmJkYWRkcik7CisJaWYgKHNlc3Npb24pCisJCV9fY210cF9jb3B5X3Nlc3Npb24oc2Vzc2lvbiwgY2kpOworCWVsc2UKKwkJZXJyID0gLUVOT0VOVDsKKworCXVwX3JlYWQoJmNtdHBfc2Vzc2lvbl9zZW0pOworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgY210cF9pbml0KHZvaWQpCit7CisJbDJjYXBfbG9hZCgpOworCisJQlRfSU5GTygiQ01UUCAoQ0FQSSBFbXVsYXRpb24pIHZlciAlcyIsIFZFUlNJT04pOworCisJY210cF9pbml0X3NvY2tldHMoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY210cF9leGl0KHZvaWQpCit7CisJY210cF9jbGVhbnVwX3NvY2tldHMoKTsKK30KKworbW9kdWxlX2luaXQoY210cF9pbml0KTsKK21vZHVsZV9leGl0KGNtdHBfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmx1ZXRvb3RoIENNVFAgdmVyICIgVkVSU0lPTik7CitNT0RVTEVfVkVSU0lPTihWRVJTSU9OKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiYnQtcHJvdG8tNSIpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9jbXRwL3NvY2suYyBiL25ldC9ibHVldG9vdGgvY210cC9zb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM3ZjllMgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9ibHVldG9vdGgvY210cC9zb2NrLmMKQEAgLTAsMCArMSwyMjYgQEAKKy8qIAorICAgQ01UUCBpbXBsZW1lbnRhdGlvbiBmb3IgTGludXggQmx1ZXRvb3RoIHN0YWNrIChCbHVlWikuCisgICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBNYXJjZWwgSG9sdG1hbm4gPG1hcmNlbEBob2x0bWFubi5vcmc+CisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQgT0YgVEhJUkQgUEFSVFkgUklHSFRTLgorICAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIoUykgQU5EIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWQorICAgQ0xBSU0sIE9SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgCisgICBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gCisgICBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiAKKyAgIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyAgIEFMTCBMSUFCSUxJVFksIElOQ0xVRElORyBMSUFCSUxJVFkgRk9SIElORlJJTkdFTUVOVCBPRiBBTlkgUEFURU5UUywgCisgICBDT1BZUklHSFRTLCBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUywgUkVMQVRJTkcgVE8gVVNFIE9GIFRISVMgCisgICBTT0ZUV0FSRSBJUyBESVNDTEFJTUVELgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2luY2x1ZGUgPGxpbnV4L2lzZG4vY2FwaWxsaS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJjbXRwLmgiCisKKyNpZm5kZWYgQ09ORklHX0JUX0NNVFBfREVCVUcKKyN1bmRlZiAgQlRfREJHCisjZGVmaW5lIEJUX0RCRyhELi4uKQorI2VuZGlmCisKK3N0YXRpYyBpbnQgY210cF9zb2NrX3JlbGVhc2Uoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKworCUJUX0RCRygic29jayAlcCBzayAlcCIsIHNvY2ssIHNrKTsKKworCWlmICghc2spCisJCXJldHVybiAwOworCisJc29ja19vcnBoYW4oc2spOworCXNvY2tfcHV0KHNrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNtdHBfc29ja19pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY210cF9jb25uYWRkX3JlcSBjYTsKKwlzdHJ1Y3QgY210cF9jb25uZGVsX3JlcSBjZDsKKwlzdHJ1Y3QgY210cF9jb25ubGlzdF9yZXEgY2w7CisJc3RydWN0IGNtdHBfY29ubmluZm8gY2k7CisJc3RydWN0IHNvY2tldCAqbnNvY2s7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IGVycjsKKworCUJUX0RCRygiY21kICV4IGFyZyAlbHgiLCBjbWQsIGFyZyk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQ01UUENPTk5BREQ6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2EsIGFyZ3AsIHNpemVvZihjYSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJbnNvY2sgPSBzb2NrZmRfbG9va3VwKGNhLnNvY2ssICZlcnIpOworCQlpZiAoIW5zb2NrKQorCQkJcmV0dXJuIGVycjsKKworCQlpZiAobnNvY2stPnNrLT5za19zdGF0ZSAhPSBCVF9DT05ORUNURUQpIHsKKwkJCWZwdXQobnNvY2stPmZpbGUpOworCQkJcmV0dXJuIC1FQkFERkQ7CisJCX0KKworCQllcnIgPSBjbXRwX2FkZF9jb25uZWN0aW9uKCZjYSwgbnNvY2spOworCQlpZiAoIWVycikgeworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2EsIHNpemVvZihjYSkpKQorCQkJCWVyciA9IC1FRkFVTFQ7CisJCX0gZWxzZQorCQkJZnB1dChuc29jay0+ZmlsZSk7CisKKwkJcmV0dXJuIGVycjsKKworCWNhc2UgQ01UUENPTk5ERUw6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2QsIGFyZ3AsIHNpemVvZihjZCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIGNtdHBfZGVsX2Nvbm5lY3Rpb24oJmNkKTsKKworCWNhc2UgQ01UUEdFVENPTk5MSVNUOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmNsLCBhcmdwLCBzaXplb2YoY2wpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChjbC5jbnVtIDw9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQllcnIgPSBjbXRwX2dldF9jb25ubGlzdCgmY2wpOworCQlpZiAoIWVyciAmJiBjb3B5X3RvX3VzZXIoYXJncCwgJmNsLCBzaXplb2YoY2wpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiBlcnI7CisKKwljYXNlIENNVFBHRVRDT05OSU5GTzoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjaSwgYXJncCwgc2l6ZW9mKGNpKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQllcnIgPSBjbXRwX2dldF9jb25uaW5mbygmY2kpOworCQlpZiAoIWVyciAmJiBjb3B5X3RvX3VzZXIoYXJncCwgJmNpLCBzaXplb2YoY2kpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIGNtdHBfc29ja19vcHMgPSB7CisJLmZhbWlseQkJPSBQRl9CTFVFVE9PVEgsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWxlYXNlCT0gY210cF9zb2NrX3JlbGVhc2UsCisJLmlvY3RsCQk9IGNtdHBfc29ja19pb2N0bCwKKwkuYmluZAkJPSBzb2NrX25vX2JpbmQsCisJLmdldG5hbWUJPSBzb2NrX25vX2dldG5hbWUsCisJLnNlbmRtc2cJPSBzb2NrX25vX3NlbmRtc2csCisJLnJlY3Ztc2cJPSBzb2NrX25vX3JlY3Ztc2csCisJLnBvbGwJCT0gc29ja19ub19wb2xsLAorCS5saXN0ZW4JCT0gc29ja19ub19saXN0ZW4sCisJLnNodXRkb3duCT0gc29ja19ub19zaHV0ZG93biwKKwkuc2V0c29ja29wdAk9IHNvY2tfbm9fc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdAk9IHNvY2tfbm9fZ2V0c29ja29wdCwKKwkuY29ubmVjdAk9IHNvY2tfbm9fY29ubmVjdCwKKwkuc29ja2V0cGFpcgk9IHNvY2tfbm9fc29ja2V0cGFpciwKKwkuYWNjZXB0CQk9IHNvY2tfbm9fYWNjZXB0LAorCS5tbWFwCQk9IHNvY2tfbm9fbW1hcAorfTsKKworc3RhdGljIHN0cnVjdCBwcm90byBjbXRwX3Byb3RvID0geworCS5uYW1lCQk9ICJDTVRQIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9ial9zaXplCT0gc2l6ZW9mKHN0cnVjdCBidF9zb2NrKQorfTsKKworc3RhdGljIGludCBjbXRwX3NvY2tfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlCVF9EQkcoInNvY2sgJXAiLCBzb2NrKTsKKworCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfUkFXKQorCQlyZXR1cm4gLUVTT0NLVE5PU1VQUE9SVDsKKworCXNrID0gc2tfYWxsb2MoUEZfQkxVRVRPT1RILCBHRlBfS0VSTkVMLCAmY210cF9wcm90bywgMSk7CisJaWYgKCFzaykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisKKwlzb2NrLT5vcHMgPSAmY210cF9zb2NrX29wczsKKworCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CisKKwlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKworCXNrLT5za19wcm90b2NvbCA9IHByb3RvY29sOworCXNrLT5za19zdGF0ZSAgICA9IEJUX09QRU47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5IGNtdHBfc29ja19mYW1pbHlfb3BzID0geworCS5mYW1pbHkJPSBQRl9CTFVFVE9PVEgsCisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmNyZWF0ZQk9IGNtdHBfc29ja19jcmVhdGUKK307CisKK2ludCBjbXRwX2luaXRfc29ja2V0cyh2b2lkKQoreworCWludCBlcnI7CisKKwllcnIgPSBwcm90b19yZWdpc3RlcigmY210cF9wcm90bywgMCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBidF9zb2NrX3JlZ2lzdGVyKEJUUFJPVE9fQ01UUCwgJmNtdHBfc29ja19mYW1pbHlfb3BzKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlCVF9FUlIoIkNhbid0IHJlZ2lzdGVyIENNVFAgc29ja2V0Iik7CisJcHJvdG9fdW5yZWdpc3RlcigmY210cF9wcm90byk7CisJcmV0dXJuIGVycjsKK30KKwordm9pZCBjbXRwX2NsZWFudXBfc29ja2V0cyh2b2lkKQoreworCWlmIChidF9zb2NrX3VucmVnaXN0ZXIoQlRQUk9UT19DTVRQKSA8IDApCisJCUJUX0VSUigiQ2FuJ3QgdW5yZWdpc3RlciBDTVRQIHNvY2tldCIpOworCisJcHJvdG9fdW5yZWdpc3RlcigmY210cF9wcm90byk7Cit9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3NjJkNwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX2Nvbm4uYwpAQCAtMCwwICsxLDQ3MSBAQAorLyogCisgICBCbHVlWiAtIEJsdWV0b290aCBwcm90b2NvbCBzdGFjayBmb3IgTGludXgKKyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIFF1YWxjb21tIEluY29ycG9yYXRlZAorCisgICBXcml0dGVuIDIwMDAsMjAwMSBieSBNYXhpbSBLcmFzbnlhbnNreSA8bWF4a0BxdWFsY29tbS5jb20+CisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQgT0YgVEhJUkQgUEFSVFkgUklHSFRTLgorICAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIoUykgQU5EIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWQorICAgQ0xBSU0sIE9SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgCisgICBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gCisgICBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiAKKyAgIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyAgIEFMTCBMSUFCSUxJVFksIElOQ0xVRElORyBMSUFCSUxJVFkgRk9SIElORlJJTkdFTUVOVCBPRiBBTlkgUEFURU5UUywgCisgICBDT1BZUklHSFRTLCBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUywgUkVMQVRJTkcgVE8gVVNFIE9GIFRISVMgCisgICBTT0ZUV0FSRSBJUyBESVNDTEFJTUVELgorKi8KKworLyogQmx1ZXRvb3RoIEhDSSBjb25uZWN0aW9uIGhhbmRsaW5nLiAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmg+CisKKyNpZm5kZWYgQ09ORklHX0JUX0hDSV9DT1JFX0RFQlVHCisjdW5kZWYgIEJUX0RCRworI2RlZmluZSBCVF9EQkcoRC4uLikKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBoY2lfYWNsX2Nvbm5lY3Qoc3RydWN0IGhjaV9jb25uICpjb25uKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gY29ubi0+aGRldjsKKwlzdHJ1Y3QgaW5xdWlyeV9lbnRyeSAqaWU7CisJc3RydWN0IGhjaV9jcF9jcmVhdGVfY29ubiBjcDsKKworCUJUX0RCRygiJXAiLCBjb25uKTsKKworCWNvbm4tPnN0YXRlID0gQlRfQ09OTkVDVDsKKwljb25uLT5vdXQgICA9IDE7CisJY29ubi0+bGlua19tb2RlID0gSENJX0xNX01BU1RFUjsKKworCW1lbXNldCgmY3AsIDAsIHNpemVvZihjcCkpOworCWJhY3B5KCZjcC5iZGFkZHIsICZjb25uLT5kc3QpOworCWNwLnBzY2FuX3JlcF9tb2RlID0gMHgwMjsKKworCWlmICgoaWUgPSBoY2lfaW5xdWlyeV9jYWNoZV9sb29rdXAoaGRldiwgJmNvbm4tPmRzdCkpICYmCisJCQlpbnF1aXJ5X2VudHJ5X2FnZShpZSkgPD0gSU5RVUlSWV9FTlRSWV9BR0VfTUFYKSB7CisJCWNwLnBzY2FuX3JlcF9tb2RlID0gaWUtPmRhdGEucHNjYW5fcmVwX21vZGU7CisJCWNwLnBzY2FuX21vZGUgICAgID0gaWUtPmRhdGEucHNjYW5fbW9kZTsKKwkJY3AuY2xvY2tfb2Zmc2V0ICAgPSBpZS0+ZGF0YS5jbG9ja19vZmZzZXQgfCBfX2NwdV90b19sZTE2KDB4ODAwMCk7CisJCW1lbWNweShjb25uLT5kZXZfY2xhc3MsIGllLT5kYXRhLmRldl9jbGFzcywgMyk7CisJfQorCisJY3AucGt0X3R5cGUgPSBfX2NwdV90b19sZTE2KGhkZXYtPnBrdF90eXBlICYgQUNMX1BUWVBFX01BU0spOworCWlmIChsbXBfcnN3aXRjaF9jYXBhYmxlKGhkZXYpICYmICEoaGRldi0+bGlua19tb2RlICYgSENJX0xNX01BU1RFUikpCisJCWNwLnJvbGVfc3dpdGNoCT0gMHgwMTsKKwllbHNlCisJCWNwLnJvbGVfc3dpdGNoCT0gMHgwMDsKKwkJCisJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9MSU5LX0NUTCwgT0NGX0NSRUFURV9DT05OLCBzaXplb2YoY3ApLCAmY3ApOworfQorCit2b2lkIGhjaV9hY2xfZGlzY29ubihzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIF9fdTggcmVhc29uKQoreworCXN0cnVjdCBoY2lfY3BfZGlzY29ubmVjdCBjcDsKKworCUJUX0RCRygiJXAiLCBjb25uKTsKKworCWNvbm4tPnN0YXRlID0gQlRfRElTQ09OTjsKKworCWNwLmhhbmRsZSA9IF9fY3B1X3RvX2xlMTYoY29ubi0+aGFuZGxlKTsKKwljcC5yZWFzb24gPSByZWFzb247CisJaGNpX3NlbmRfY21kKGNvbm4tPmhkZXYsIE9HRl9MSU5LX0NUTCwgT0NGX0RJU0NPTk5FQ1QsIHNpemVvZihjcCksICZjcCk7Cit9CisKK3ZvaWQgaGNpX2FkZF9zY28oc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3UxNiBoYW5kbGUpCit7CisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBjb25uLT5oZGV2OworCXN0cnVjdCBoY2lfY3BfYWRkX3NjbyBjcDsKKworCUJUX0RCRygiJXAiLCBjb25uKTsKKworCWNvbm4tPnN0YXRlID0gQlRfQ09OTkVDVDsKKwljb25uLT5vdXQgPSAxOworCisJY3AucGt0X3R5cGUgPSBfX2NwdV90b19sZTE2KGhkZXYtPnBrdF90eXBlICYgU0NPX1BUWVBFX01BU0spOworCWNwLmhhbmRsZSAgID0gX19jcHVfdG9fbGUxNihoYW5kbGUpOworCisJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9MSU5LX0NUTCwgT0NGX0FERF9TQ08sIHNpemVvZihjcCksICZjcCk7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9jb25uX3RpbWVvdXQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGhjaV9jb25uICpjb25uID0gKHZvaWQgKilhcmc7CisJc3RydWN0IGhjaV9kZXYgICpoZGV2ID0gY29ubi0+aGRldjsKKworCUJUX0RCRygiY29ubiAlcCBzdGF0ZSAlZCIsIGNvbm4sIGNvbm4tPnN0YXRlKTsKKworCWlmIChhdG9taWNfcmVhZCgmY29ubi0+cmVmY250KSkKKwkJcmV0dXJuOworCisJaGNpX2Rldl9sb2NrKGhkZXYpOworIAlpZiAoY29ubi0+c3RhdGUgPT0gQlRfQ09OTkVDVEVEKQorCQloY2lfYWNsX2Rpc2Nvbm4oY29ubiwgMHgxMyk7CisJZWxzZQorCQljb25uLT5zdGF0ZSA9IEJUX0NMT1NFRDsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9jb25uX2luaXRfdGltZXIoc3RydWN0IGhjaV9jb25uICpjb25uKQoreworCWluaXRfdGltZXIoJmNvbm4tPnRpbWVyKTsKKwljb25uLT50aW1lci5mdW5jdGlvbiA9IGhjaV9jb25uX3RpbWVvdXQ7CisJY29ubi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWNvbm47Cit9CisKK3N0cnVjdCBoY2lfY29ubiAqaGNpX2Nvbm5fYWRkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBpbnQgdHlwZSwgYmRhZGRyX3QgKmRzdCkKK3sKKwlzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm47CisKKwlCVF9EQkcoIiVzIGRzdCAlcyIsIGhkZXYtPm5hbWUsIGJhdG9zdHIoZHN0KSk7CisKKwlpZiAoIShjb25uID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhjaV9jb25uKSwgR0ZQX0FUT01JQykpKQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQoY29ubiwgMCwgc2l6ZW9mKHN0cnVjdCBoY2lfY29ubikpOworCisJYmFjcHkoJmNvbm4tPmRzdCwgZHN0KTsKKwljb25uLT50eXBlICAgPSB0eXBlOworCWNvbm4tPmhkZXYgICA9IGhkZXY7CisJY29ubi0+c3RhdGUgID0gQlRfT1BFTjsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNvbm4tPmRhdGFfcSk7CisJaGNpX2Nvbm5faW5pdF90aW1lcihjb25uKTsKKworCWF0b21pY19zZXQoJmNvbm4tPnJlZmNudCwgMCk7CisKKwloY2lfZGV2X2hvbGQoaGRldik7CisKKwl0YXNrbGV0X2Rpc2FibGUoJmhkZXYtPnR4X3Rhc2spOworCisJaGNpX2Nvbm5faGFzaF9hZGQoaGRldiwgY29ubik7CisJaWYgKGhkZXYtPm5vdGlmeSkKKwkJaGRldi0+bm90aWZ5KGhkZXYsIEhDSV9OT1RJRllfQ09OTl9BREQpOworCisJdGFza2xldF9lbmFibGUoJmhkZXYtPnR4X3Rhc2spOworCisJcmV0dXJuIGNvbm47Cit9CisKK2ludCBoY2lfY29ubl9kZWwoc3RydWN0IGhjaV9jb25uICpjb25uKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gY29ubi0+aGRldjsKKworCUJUX0RCRygiJXMgY29ubiAlcCBoYW5kbGUgJWQiLCBoZGV2LT5uYW1lLCBjb25uLCBjb25uLT5oYW5kbGUpOworCisJaGNpX2Nvbm5fZGVsX3RpbWVyKGNvbm4pOworCisJaWYgKGNvbm4tPnR5cGUgPT0gU0NPX0xJTkspIHsKKwkJc3RydWN0IGhjaV9jb25uICphY2wgPSBjb25uLT5saW5rOworCQlpZiAoYWNsKSB7CisJCQlhY2wtPmxpbmsgPSBOVUxMOworCQkJaGNpX2Nvbm5fcHV0KGFjbCk7CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3QgaGNpX2Nvbm4gKnNjbyA9IGNvbm4tPmxpbms7CisJCWlmIChzY28pCisJCQlzY28tPmxpbmsgPSBOVUxMOworCisJCS8qIFVuYWNrZWQgZnJhbWVzICovCisJCWhkZXYtPmFjbF9jbnQgKz0gY29ubi0+c2VudDsKKwl9CisKKwl0YXNrbGV0X2Rpc2FibGUoJmhkZXYtPnR4X3Rhc2spOworCisJaGNpX2Nvbm5faGFzaF9kZWwoaGRldiwgY29ubik7CisJaWYgKGhkZXYtPm5vdGlmeSkKKwkJaGRldi0+bm90aWZ5KGhkZXYsIEhDSV9OT1RJRllfQ09OTl9ERUwpOworCisJdGFza2xldF9lbmFibGUoJmhkZXYtPnR4X3Rhc2spOworCisJc2tiX3F1ZXVlX3B1cmdlKCZjb25uLT5kYXRhX3EpOworCisJaGNpX2Rldl9wdXQoaGRldik7CisKKwlrZnJlZShjb25uKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGhjaV9kZXYgKmhjaV9nZXRfcm91dGUoYmRhZGRyX3QgKmRzdCwgYmRhZGRyX3QgKnNyYykKK3sKKwlpbnQgdXNlX3NyYyA9IGJhY21wKHNyYywgQkRBRERSX0FOWSk7CisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisKKwlCVF9EQkcoIiVzIC0+ICVzIiwgYmF0b3N0cihzcmMpLCBiYXRvc3RyKGRzdCkpOworCisJcmVhZF9sb2NrX2JoKCZoY2lfZGV2X2xpc3RfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZoY2lfZGV2X2xpc3QpIHsKKwkJc3RydWN0IGhjaV9kZXYgKmQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoY2lfZGV2LCBsaXN0KTsKKworCQlpZiAoIXRlc3RfYml0KEhDSV9VUCwgJmQtPmZsYWdzKSB8fCB0ZXN0X2JpdChIQ0lfUkFXLCAmZC0+ZmxhZ3MpKQorCQkJY29udGludWU7CisKKwkJLyogU2ltcGxlIHJvdXRpbmc6IAorCQkgKiAgIE5vIHNvdXJjZSBhZGRyZXNzIC0gZmluZCBpbnRlcmZhY2Ugd2l0aCBiZGFkZHIgIT0gZHN0CisJCSAqICAgU291cmNlIGFkZHJlc3MgICAgLSBmaW5kIGludGVyZmFjZSB3aXRoIGJkYWRkciA9PSBzcmMKKwkJICovCisKKwkJaWYgKHVzZV9zcmMpIHsKKwkJCWlmICghYmFjbXAoJmQtPmJkYWRkciwgc3JjKSkgeworCQkJCWhkZXYgPSBkOyBicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChiYWNtcCgmZC0+YmRhZGRyLCBkc3QpKSB7CisJCQkJaGRldiA9IGQ7IGJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKGhkZXYpCisJCWhkZXYgPSBoY2lfZGV2X2hvbGQoaGRldik7CisKKwlyZWFkX3VubG9ja19iaCgmaGNpX2Rldl9saXN0X2xvY2spOworCXJldHVybiBoZGV2OworfQorRVhQT1JUX1NZTUJPTChoY2lfZ2V0X3JvdXRlKTsKKworLyogQ3JlYXRlIFNDTyBvciBBQ0wgY29ubmVjdGlvbi4KKyAqIERldmljZSBfbXVzdF8gYmUgbG9ja2VkICovCitzdHJ1Y3QgaGNpX2Nvbm4gKiBoY2lfY29ubmVjdChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgaW50IHR5cGUsIGJkYWRkcl90ICpkc3QpCit7CisJc3RydWN0IGhjaV9jb25uICphY2w7CisKKwlCVF9EQkcoIiVzIGRzdCAlcyIsIGhkZXYtPm5hbWUsIGJhdG9zdHIoZHN0KSk7CisKKwlpZiAoIShhY2wgPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9iYShoZGV2LCBBQ0xfTElOSywgZHN0KSkpIHsKKwkJaWYgKCEoYWNsID0gaGNpX2Nvbm5fYWRkKGhkZXYsIEFDTF9MSU5LLCBkc3QpKSkKKwkJCXJldHVybiBOVUxMOworCX0KKworCWhjaV9jb25uX2hvbGQoYWNsKTsKKworCWlmIChhY2wtPnN0YXRlID09IEJUX09QRU4gfHwgYWNsLT5zdGF0ZSA9PSBCVF9DTE9TRUQpCisJCWhjaV9hY2xfY29ubmVjdChhY2wpOworCisJaWYgKHR5cGUgPT0gU0NPX0xJTkspIHsKKwkJc3RydWN0IGhjaV9jb25uICpzY287CisKKwkJaWYgKCEoc2NvID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfYmEoaGRldiwgU0NPX0xJTkssIGRzdCkpKSB7CisJCQlpZiAoIShzY28gPSBoY2lfY29ubl9hZGQoaGRldiwgU0NPX0xJTkssIGRzdCkpKSB7CisJCQkJaGNpX2Nvbm5fcHV0KGFjbCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwkJYWNsLT5saW5rID0gc2NvOworCQlzY28tPmxpbmsgPSBhY2w7CisKKwkJaGNpX2Nvbm5faG9sZChzY28pOworCisJCWlmIChhY2wtPnN0YXRlID09IEJUX0NPTk5FQ1RFRCAmJiAKKwkJCQkoc2NvLT5zdGF0ZSA9PSBCVF9PUEVOIHx8IHNjby0+c3RhdGUgPT0gQlRfQ0xPU0VEKSkKKwkJCWhjaV9hZGRfc2NvKHNjbywgYWNsLT5oYW5kbGUpOworCisJCXJldHVybiBzY287CisJfSBlbHNlIHsKKwkJcmV0dXJuIGFjbDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGhjaV9jb25uZWN0KTsKKworLyogQXV0aGVudGljYXRlIHJlbW90ZSBkZXZpY2UgKi8KK2ludCBoY2lfY29ubl9hdXRoKHN0cnVjdCBoY2lfY29ubiAqY29ubikKK3sKKwlCVF9EQkcoImNvbm4gJXAiLCBjb25uKTsKKworCWlmIChjb25uLT5saW5rX21vZGUgJiBIQ0lfTE1fQVVUSCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoSENJX0NPTk5fQVVUSF9QRU5ELCAmY29ubi0+cGVuZCkpIHsKKwkJc3RydWN0IGhjaV9jcF9hdXRoX3JlcXVlc3RlZCBjcDsKKwkJY3AuaGFuZGxlID0gX19jcHVfdG9fbGUxNihjb25uLT5oYW5kbGUpOworCQloY2lfc2VuZF9jbWQoY29ubi0+aGRldiwgT0dGX0xJTktfQ1RMLCBPQ0ZfQVVUSF9SRVFVRVNURUQsIHNpemVvZihjcCksICZjcCk7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChoY2lfY29ubl9hdXRoKTsKKworLyogRW5hYmxlIGVuY3J5cHRpb24gKi8KK2ludCBoY2lfY29ubl9lbmNyeXB0KHN0cnVjdCBoY2lfY29ubiAqY29ubikKK3sKKwlCVF9EQkcoImNvbm4gJXAiLCBjb25uKTsKKworCWlmIChjb25uLT5saW5rX21vZGUgJiBIQ0lfTE1fRU5DUllQVCkKKwkJcmV0dXJuIDE7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChIQ0lfQ09OTl9FTkNSWVBUX1BFTkQsICZjb25uLT5wZW5kKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaGNpX2Nvbm5fYXV0aChjb25uKSkgeworCQlzdHJ1Y3QgaGNpX2NwX3NldF9jb25uX2VuY3J5cHQgY3A7CisJCWNwLmhhbmRsZSAgPSBfX2NwdV90b19sZTE2KGNvbm4tPmhhbmRsZSk7CisJCWNwLmVuY3J5cHQgPSAxOyAKKwkJaGNpX3NlbmRfY21kKGNvbm4tPmhkZXYsIE9HRl9MSU5LX0NUTCwgT0NGX1NFVF9DT05OX0VOQ1JZUFQsIHNpemVvZihjcCksICZjcCk7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChoY2lfY29ubl9lbmNyeXB0KTsKKworLyogQ2hhbmdlIGxpbmsga2V5ICovCitpbnQgaGNpX2Nvbm5fY2hhbmdlX2xpbmtfa2V5KHN0cnVjdCBoY2lfY29ubiAqY29ubikKK3sKKwlCVF9EQkcoImNvbm4gJXAiLCBjb25uKTsKKworCWlmICghdGVzdF9hbmRfc2V0X2JpdChIQ0lfQ09OTl9BVVRIX1BFTkQsICZjb25uLT5wZW5kKSkgeworCQlzdHJ1Y3QgaGNpX2NwX2NoYW5nZV9jb25uX2xpbmtfa2V5IGNwOworCQljcC5oYW5kbGUgPSBfX2NwdV90b19sZTE2KGNvbm4tPmhhbmRsZSk7CisJCWhjaV9zZW5kX2NtZChjb25uLT5oZGV2LCBPR0ZfTElOS19DVEwsIE9DRl9DSEFOR0VfQ09OTl9MSU5LX0tFWSwgc2l6ZW9mKGNwKSwgJmNwKTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGhjaV9jb25uX2NoYW5nZV9saW5rX2tleSk7CisKKy8qIFN3aXRjaCByb2xlICovCitpbnQgaGNpX2Nvbm5fc3dpdGNoX3JvbGUoc3RydWN0IGhjaV9jb25uICpjb25uLCB1aW50OF90IHJvbGUpCit7CisJQlRfREJHKCJjb25uICVwIiwgY29ubik7CisKKwlpZiAoIXJvbGUgJiYgY29ubi0+bGlua19tb2RlICYgSENJX0xNX01BU1RFUikKKwkJcmV0dXJuIDE7CisKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoSENJX0NPTk5fUlNXSVRDSF9QRU5ELCAmY29ubi0+cGVuZCkpIHsKKwkJc3RydWN0IGhjaV9jcF9zd2l0Y2hfcm9sZSBjcDsKKwkJYmFjcHkoJmNwLmJkYWRkciwgJmNvbm4tPmRzdCk7CisJCWNwLnJvbGUgPSByb2xlOworCQloY2lfc2VuZF9jbWQoY29ubi0+aGRldiwgT0dGX0xJTktfUE9MSUNZLCBPQ0ZfU1dJVENIX1JPTEUsIHNpemVvZihjcCksICZjcCk7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChoY2lfY29ubl9zd2l0Y2hfcm9sZSk7CisKKy8qIERyb3AgYWxsIGNvbm5lY3Rpb24gb24gdGhlIGRldmljZSAqLwordm9pZCBoY2lfY29ubl9oYXNoX2ZsdXNoKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXN0cnVjdCBoY2lfY29ubl9oYXNoICpoID0gJmhkZXYtPmNvbm5faGFzaDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCisJQlRfREJHKCJoZGV2ICVzIiwgaGRldi0+bmFtZSk7CisKKwlwID0gaC0+bGlzdC5uZXh0OworCXdoaWxlIChwICE9ICZoLT5saXN0KSB7CisJCXN0cnVjdCBoY2lfY29ubiAqYzsKKworCQljID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGNpX2Nvbm4sIGxpc3QpOworCQlwID0gcC0+bmV4dDsKKworCQljLT5zdGF0ZSA9IEJUX0NMT1NFRDsKKworCQloY2lfcHJvdG9fZGlzY29ubl9pbmQoYywgMHgxNik7CisJCWhjaV9jb25uX2RlbChjKTsKKwl9Cit9CisKK2ludCBoY2lfZ2V0X2Nvbm5fbGlzdCh2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBoY2lfY29ubl9saXN0X3JlcSByZXEsICpjbDsKKwlzdHJ1Y3QgaGNpX2Nvbm5faW5mbyAqY2k7CisJc3RydWN0IGhjaV9kZXYgKmhkZXY7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlpbnQgbiA9IDAsIHNpemUsIGVycjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxLCBhcmcsIHNpemVvZihyZXEpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoIXJlcS5jb25uX251bSB8fCByZXEuY29ubl9udW0gPiAoUEFHRV9TSVpFICogMikgLyBzaXplb2YoKmNpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzaXplID0gc2l6ZW9mKHJlcSkgKyByZXEuY29ubl9udW0gKiBzaXplb2YoKmNpKTsKKworCWlmICghKGNsID0gKHZvaWQgKikga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKSkpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKCEoaGRldiA9IGhjaV9kZXZfZ2V0KHJlcS5kZXZfaWQpKSkgeworCQlrZnJlZShjbCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWNpID0gY2wtPmNvbm5faW5mbzsKKworCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKKwlsaXN0X2Zvcl9lYWNoKHAsICZoZGV2LT5jb25uX2hhc2gubGlzdCkgeworCQlyZWdpc3RlciBzdHJ1Y3QgaGNpX2Nvbm4gKmM7CisJCWMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoY2lfY29ubiwgbGlzdCk7CisKKwkJYmFjcHkoJihjaSArIG4pLT5iZGFkZHIsICZjLT5kc3QpOworCQkoY2kgKyBuKS0+aGFuZGxlID0gYy0+aGFuZGxlOworCQkoY2kgKyBuKS0+dHlwZSAgPSBjLT50eXBlOworCQkoY2kgKyBuKS0+b3V0ICAgPSBjLT5vdXQ7CisJCShjaSArIG4pLT5zdGF0ZSA9IGMtPnN0YXRlOworCQkoY2kgKyBuKS0+bGlua19tb2RlID0gYy0+bGlua19tb2RlOworCQlpZiAoKytuID49IHJlcS5jb25uX251bSkKKwkJCWJyZWFrOworCX0KKwloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKworCWNsLT5kZXZfaWQgPSBoZGV2LT5pZDsKKwljbC0+Y29ubl9udW0gPSBuOworCXNpemUgPSBzaXplb2YocmVxKSArIG4gKiBzaXplb2YoKmNpKTsKKworCWhjaV9kZXZfcHV0KGhkZXYpOworCisJZXJyID0gY29weV90b191c2VyKGFyZywgY2wsIHNpemUpOworCWtmcmVlKGNsKTsKKworCXJldHVybiBlcnIgPyAtRUZBVUxUIDogMDsKK30KKworaW50IGhjaV9nZXRfY29ubl9pbmZvKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBoY2lfY29ubl9pbmZvX3JlcSByZXE7CisJc3RydWN0IGhjaV9jb25uX2luZm8gY2k7CisJc3RydWN0IGhjaV9jb25uICpjb25uOworCWNoYXIgX191c2VyICpwdHIgPSBhcmcgKyBzaXplb2YocmVxKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxLCBhcmcsIHNpemVvZihyZXEpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwloY2lfZGV2X2xvY2tfYmgoaGRldik7CisJY29ubiA9IGhjaV9jb25uX2hhc2hfbG9va3VwX2JhKGhkZXYsIHJlcS50eXBlLCAmcmVxLmJkYWRkcik7CisJaWYgKGNvbm4pIHsKKwkJYmFjcHkoJmNpLmJkYWRkciwgJmNvbm4tPmRzdCk7CisJCWNpLmhhbmRsZSA9IGNvbm4tPmhhbmRsZTsKKwkJY2kudHlwZSAgPSBjb25uLT50eXBlOworCQljaS5vdXQgICA9IGNvbm4tPm91dDsKKwkJY2kuc3RhdGUgPSBjb25uLT5zdGF0ZTsKKwkJY2kubGlua19tb2RlID0gY29ubi0+bGlua19tb2RlOworCX0KKwloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKworCWlmICghY29ubikKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlyZXR1cm4gY29weV90b191c2VyKHB0ciwgJmNpLCBzaXplb2YoY2kpKSA/IC1FRkFVTFQgOiAwOworfQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfY29yZS5jIGIvbmV0L2JsdWV0b290aC9oY2lfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MGRiYTcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmMKQEAgLTAsMCArMSwxNDM0IEBACisvKiAKKyAgIEJsdWVaIC0gQmx1ZXRvb3RoIHByb3RvY29sIHN0YWNrIGZvciBMaW51eAorICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEgUXVhbGNvbW0gSW5jb3Jwb3JhdGVkCisKKyAgIFdyaXR0ZW4gMjAwMCwyMDAxIGJ5IE1heGltIEtyYXNueWFuc2t5IDxtYXhrQHF1YWxjb21tLmNvbT4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBBTkQgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyAKKyAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiAKKyAgIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIAorICAgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworICAgQUxMIExJQUJJTElUWSwgSU5DTFVESU5HIExJQUJJTElUWSBGT1IgSU5GUklOR0VNRU5UIE9GIEFOWSBQQVRFTlRTLCAKKyAgIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLCBSRUxBVElORyBUTyBVU0UgT0YgVEhJUyAKKyAgIFNPRlRXQVJFIElTIERJU0NMQUlNRUQuCisqLworCisvKiBCbHVldG9vdGggSENJIGNvcmUuICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmg+CisKKyNpZm5kZWYgQ09ORklHX0JUX0hDSV9DT1JFX0RFQlVHCisjdW5kZWYgIEJUX0RCRworI2RlZmluZSBCVF9EQkcoRC4uLikKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBoY2lfY21kX3Rhc2sodW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHZvaWQgaGNpX3J4X3Rhc2sodW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHZvaWQgaGNpX3R4X3Rhc2sodW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHZvaWQgaGNpX25vdGlmeShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgaW50IGV2ZW50KTsKKworc3RhdGljIERFRklORV9SV0xPQ0soaGNpX3Rhc2tfbG9jayk7CisKKy8qIEhDSSBkZXZpY2UgbGlzdCAqLworTElTVF9IRUFEKGhjaV9kZXZfbGlzdCk7CitERUZJTkVfUldMT0NLKGhjaV9kZXZfbGlzdF9sb2NrKTsKKworLyogSENJIGNhbGxiYWNrIGxpc3QgKi8KK0xJU1RfSEVBRChoY2lfY2JfbGlzdCk7CitERUZJTkVfUldMT0NLKGhjaV9jYl9saXN0X2xvY2spOworCisvKiBIQ0kgcHJvdG9jb2xzICovCisjZGVmaW5lIEhDSV9NQVhfUFJPVE8JMgorc3RydWN0IGhjaV9wcm90byAqaGNpX3Byb3RvW0hDSV9NQVhfUFJPVE9dOworCisvKiBIQ0kgbm90aWZpZXJzIGxpc3QgKi8KK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKmhjaV9ub3RpZmllcjsKKworLyogLS0tLSBIQ0kgbm90aWZpY2F0aW9ucyAtLS0tICovCisKK2ludCBoY2lfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJmhjaV9ub3RpZmllciwgbmIpOworfQorCitpbnQgaGNpX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmaGNpX25vdGlmaWVyLCBuYik7Cit9CisKK3ZvaWQgaGNpX25vdGlmeShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgaW50IGV2ZW50KQoreworCW5vdGlmaWVyX2NhbGxfY2hhaW4oJmhjaV9ub3RpZmllciwgZXZlbnQsIGhkZXYpOworfQorCisvKiAtLS0tIEhDSSByZXF1ZXN0cyAtLS0tICovCisKK3ZvaWQgaGNpX3JlcV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgaW50IHJlc3VsdCkKK3sKKwlCVF9EQkcoIiVzIHJlc3VsdCAweCUyLjJ4IiwgaGRldi0+bmFtZSwgcmVzdWx0KTsKKworCWlmIChoZGV2LT5yZXFfc3RhdHVzID09IEhDSV9SRVFfUEVORCkgeworCQloZGV2LT5yZXFfcmVzdWx0ID0gcmVzdWx0OworCQloZGV2LT5yZXFfc3RhdHVzID0gSENJX1JFUV9ET05FOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmhkZXYtPnJlcV93YWl0X3EpOworCX0KK30KKworc3RhdGljIHZvaWQgaGNpX3JlcV9jYW5jZWwoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGludCBlcnIpCit7CisJQlRfREJHKCIlcyBlcnIgMHglMi4yeCIsIGhkZXYtPm5hbWUsIGVycik7CisKKwlpZiAoaGRldi0+cmVxX3N0YXR1cyA9PSBIQ0lfUkVRX1BFTkQpIHsKKwkJaGRldi0+cmVxX3Jlc3VsdCA9IGVycjsKKwkJaGRldi0+cmVxX3N0YXR1cyA9IEhDSV9SRVFfQ0FOQ0VMRUQ7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaGRldi0+cmVxX3dhaXRfcSk7CisJfQorfQorCisvKiBFeGVjdXRlIHJlcXVlc3QgYW5kIHdhaXQgZm9yIGNvbXBsZXRpb24uICovCitzdGF0aWMgaW50IF9faGNpX3JlcXVlc3Qoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHZvaWQgKCpyZXEpKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1bnNpZ25lZCBsb25nIG9wdCksIAorCQkJCXVuc2lnbmVkIGxvbmcgb3B0LCBfX3UzMiB0aW1lb3V0KQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCWludCBlcnIgPSAwOworCisJQlRfREJHKCIlcyBzdGFydCIsIGhkZXYtPm5hbWUpOworCisJaGRldi0+cmVxX3N0YXR1cyA9IEhDSV9SRVFfUEVORDsKKworCWFkZF93YWl0X3F1ZXVlKCZoZGV2LT5yZXFfd2FpdF9xLCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCXJlcShoZGV2LCBvcHQpOworCXNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CisKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmaGRldi0+cmVxX3dhaXRfcSwgJndhaXQpOworCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXR1cm4gLUVJTlRSOworCisJc3dpdGNoIChoZGV2LT5yZXFfc3RhdHVzKSB7CisJY2FzZSBIQ0lfUkVRX0RPTkU6CisJCWVyciA9IC1idF9lcnIoaGRldi0+cmVxX3Jlc3VsdCk7CisJCWJyZWFrOworCisJY2FzZSBIQ0lfUkVRX0NBTkNFTEVEOgorCQllcnIgPSAtaGRldi0+cmVxX3Jlc3VsdDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRVRJTUVET1VUOworCQlicmVhazsKKwl9OworCisJaGRldi0+cmVxX3N0YXR1cyA9IGhkZXYtPnJlcV9yZXN1bHQgPSAwOworCisJQlRfREJHKCIlcyBlbmQ6IGVyciAlZCIsIGhkZXYtPm5hbWUsIGVycik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lIGludCBoY2lfcmVxdWVzdChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdm9pZCAoKnJlcSkoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHVuc2lnbmVkIGxvbmcgb3B0KSwKKwkJCQl1bnNpZ25lZCBsb25nIG9wdCwgX191MzIgdGltZW91dCkKK3sKKwlpbnQgcmV0OworCisJLyogU2VyaWFsaXplIGFsbCByZXF1ZXN0cyAqLworCWhjaV9yZXFfbG9jayhoZGV2KTsKKwlyZXQgPSBfX2hjaV9yZXF1ZXN0KGhkZXYsIHJlcSwgb3B0LCB0aW1lb3V0KTsKKwloY2lfcmVxX3VubG9jayhoZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9yZXNldF9yZXEoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHVuc2lnbmVkIGxvbmcgb3B0KQoreworCUJUX0RCRygiJXMgJWxkIiwgaGRldi0+bmFtZSwgb3B0KTsKKworCS8qIFJlc2V0IGRldmljZSAqLworCWhjaV9zZW5kX2NtZChoZGV2LCBPR0ZfSE9TVF9DVEwsIE9DRl9SRVNFVCwgMCwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9pbml0X3JlcShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdW5zaWduZWQgbG9uZyBvcHQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlfX3UxNiBwYXJhbTsKKworCUJUX0RCRygiJXMgJWxkIiwgaGRldi0+bmFtZSwgb3B0KTsKKworCS8qIERyaXZlciBpbml0aWFsaXphdGlvbiAqLworCisJLyogU3BlY2lhbCBjb21tYW5kcyAqLworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmhkZXYtPmRyaXZlcl9pbml0KSkpIHsKKwkJc2tiLT5wa3RfdHlwZSA9IEhDSV9DT01NQU5EX1BLVDsKKwkJc2tiLT5kZXYgPSAodm9pZCAqKSBoZGV2OworCQlza2JfcXVldWVfdGFpbCgmaGRldi0+Y21kX3EsIHNrYik7CisJCWhjaV9zY2hlZF9jbWQoaGRldik7CisJfQorCXNrYl9xdWV1ZV9wdXJnZSgmaGRldi0+ZHJpdmVyX2luaXQpOworCisJLyogTWFuZGF0b3J5IGluaXRpYWxpemF0aW9uICovCisKKwkvKiBSZXNldCAqLworCWlmICh0ZXN0X2JpdChIQ0lfUVVJUktfUkVTRVRfT05fSU5JVCwgJmhkZXYtPnF1aXJrcykpCisJCQloY2lfc2VuZF9jbWQoaGRldiwgT0dGX0hPU1RfQ1RMLCBPQ0ZfUkVTRVQsIDAsIE5VTEwpOworCisJLyogUmVhZCBMb2NhbCBTdXBwb3J0ZWQgRmVhdHVyZXMgKi8KKwloY2lfc2VuZF9jbWQoaGRldiwgT0dGX0lORk9fUEFSQU0sIE9DRl9SRUFEX0xPQ0FMX0ZFQVRVUkVTLCAwLCBOVUxMKTsKKworCS8qIFJlYWQgQnVmZmVyIFNpemUgKEFDTCBtdHUsIG1heCBwa3QsIGV0Yy4pICovCisJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9JTkZPX1BBUkFNLCBPQ0ZfUkVBRF9CVUZGRVJfU0laRSwgMCwgTlVMTCk7CisKKyNpZiAwCisJLyogSG9zdCBidWZmZXIgc2l6ZSAqLworCXsKKwkJc3RydWN0IGhjaV9jcF9ob3N0X2J1ZmZlcl9zaXplIGNwOworCQljcC5hY2xfbXR1ID0gX19jcHVfdG9fbGUxNihIQ0lfTUFYX0FDTF9TSVpFKTsKKwkJY3Auc2NvX210dSA9IEhDSV9NQVhfU0NPX1NJWkU7CisJCWNwLmFjbF9tYXhfcGt0ID0gX19jcHVfdG9fbGUxNigweGZmZmYpOworCQljcC5zY29fbWF4X3BrdCA9IF9fY3B1X3RvX2xlMTYoMHhmZmZmKTsKKwkJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9IT1NUX0NUTCwgT0NGX0hPU1RfQlVGRkVSX1NJWkUsIHNpemVvZihjcCksICZjcCk7CisJfQorI2VuZGlmCisKKwkvKiBSZWFkIEJEIEFkZHJlc3MgKi8KKwloY2lfc2VuZF9jbWQoaGRldiwgT0dGX0lORk9fUEFSQU0sIE9DRl9SRUFEX0JEX0FERFIsIDAsIE5VTEwpOworCisJLyogUmVhZCBWb2ljZSBTZXR0aW5nICovCisJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9IT1NUX0NUTCwgT0NGX1JFQURfVk9JQ0VfU0VUVElORywgMCwgTlVMTCk7CisKKwkvKiBPcHRpb25hbCBpbml0aWFsaXphdGlvbiAqLworCisJLyogQ2xlYXIgRXZlbnQgRmlsdGVycyAqLworCXsKKwkJc3RydWN0IGhjaV9jcF9zZXRfZXZlbnRfZmx0IGNwOworCQljcC5mbHRfdHlwZSAgPSBIQ0lfRkxUX0NMRUFSX0FMTDsKKwkJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9IT1NUX0NUTCwgT0NGX1NFVF9FVkVOVF9GTFQsIHNpemVvZihjcCksICZjcCk7CisJfQorCisJLyogUGFnZSB0aW1lb3V0IH4yMCBzZWNzICovCisJcGFyYW0gPSBfX2NwdV90b19sZTE2KDB4ODAwMCk7CisJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9IT1NUX0NUTCwgT0NGX1dSSVRFX1BHX1RJTUVPVVQsIDIsICZwYXJhbSk7CisKKwkvKiBDb25uZWN0aW9uIGFjY2VwdCB0aW1lb3V0IH4yMCBzZWNzICovCisJcGFyYW0gPSBfX2NwdV90b19sZTE2KDB4N2QwMCk7CisJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9IT1NUX0NUTCwgT0NGX1dSSVRFX0NBX1RJTUVPVVQsIDIsICZwYXJhbSk7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9zY2FuX3JlcShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdW5zaWduZWQgbG9uZyBvcHQpCit7CisJX191OCBzY2FuID0gb3B0OworCisJQlRfREJHKCIlcyAleCIsIGhkZXYtPm5hbWUsIHNjYW4pOworCisJLyogSW5xdWlyeSBhbmQgUGFnZSBzY2FucyAqLworCWhjaV9zZW5kX2NtZChoZGV2LCBPR0ZfSE9TVF9DVEwsIE9DRl9XUklURV9TQ0FOX0VOQUJMRSwgMSwgJnNjYW4pOworfQorCitzdGF0aWMgdm9pZCBoY2lfYXV0aF9yZXEoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHVuc2lnbmVkIGxvbmcgb3B0KQoreworCV9fdTggYXV0aCA9IG9wdDsKKworCUJUX0RCRygiJXMgJXgiLCBoZGV2LT5uYW1lLCBhdXRoKTsKKworCS8qIEF1dGhlbnRpY2F0aW9uICovCisJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9IT1NUX0NUTCwgT0NGX1dSSVRFX0FVVEhfRU5BQkxFLCAxLCAmYXV0aCk7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9lbmNyeXB0X3JlcShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdW5zaWduZWQgbG9uZyBvcHQpCit7CisJX191OCBlbmNyeXB0ID0gb3B0OworCisJQlRfREJHKCIlcyAleCIsIGhkZXYtPm5hbWUsIGVuY3J5cHQpOworCisJLyogQXV0aGVudGljYXRpb24gKi8KKwloY2lfc2VuZF9jbWQoaGRldiwgT0dGX0hPU1RfQ1RMLCBPQ0ZfV1JJVEVfRU5DUllQVF9NT0RFLCAxLCAmZW5jcnlwdCk7Cit9CisKKy8qIEdldCBIQ0kgZGV2aWNlIGJ5IGluZGV4LiAKKyAqIERldmljZSBpcyBoZWxkIG9uIHJldHVybi4gKi8KK3N0cnVjdCBoY2lfZGV2ICpoY2lfZGV2X2dldChpbnQgaW5kZXgpCit7CisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisKKwlCVF9EQkcoIiVkIiwgaW5kZXgpOworCisJaWYgKGluZGV4IDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZWFkX2xvY2soJmhjaV9kZXZfbGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKHAsICZoY2lfZGV2X2xpc3QpIHsKKwkJc3RydWN0IGhjaV9kZXYgKmQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoY2lfZGV2LCBsaXN0KTsKKwkJaWYgKGQtPmlkID09IGluZGV4KSB7CisJCQloZGV2ID0gaGNpX2Rldl9ob2xkKGQpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmVhZF91bmxvY2soJmhjaV9kZXZfbGlzdF9sb2NrKTsKKwlyZXR1cm4gaGRldjsKK30KK0VYUE9SVF9TWU1CT0woaGNpX2Rldl9nZXQpOworCisvKiAtLS0tIElucXVpcnkgc3VwcG9ydCAtLS0tICovCitzdGF0aWMgdm9pZCBpbnF1aXJ5X2NhY2hlX2ZsdXNoKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXN0cnVjdCBpbnF1aXJ5X2NhY2hlICpjYWNoZSA9ICZoZGV2LT5pbnFfY2FjaGU7CisJc3RydWN0IGlucXVpcnlfZW50cnkgKm5leHQgID0gY2FjaGUtPmxpc3QsICplOworCisJQlRfREJHKCJjYWNoZSAlcCIsIGNhY2hlKTsKKworCWNhY2hlLT5saXN0ID0gTlVMTDsKKwl3aGlsZSAoKGUgPSBuZXh0KSkgeworCQluZXh0ID0gZS0+bmV4dDsKKwkJa2ZyZWUoZSk7CisJfQorfQorCitzdHJ1Y3QgaW5xdWlyeV9lbnRyeSAqaGNpX2lucXVpcnlfY2FjaGVfbG9va3VwKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyKQoreworCXN0cnVjdCBpbnF1aXJ5X2NhY2hlICpjYWNoZSA9ICZoZGV2LT5pbnFfY2FjaGU7CisJc3RydWN0IGlucXVpcnlfZW50cnkgKmU7CisKKwlCVF9EQkcoImNhY2hlICVwLCAlcyIsIGNhY2hlLCBiYXRvc3RyKGJkYWRkcikpOworCisJZm9yIChlID0gY2FjaGUtPmxpc3Q7IGU7IGUgPSBlLT5uZXh0KQorCQlpZiAoIWJhY21wKCZlLT5kYXRhLmJkYWRkciwgYmRhZGRyKSkKKwkJCWJyZWFrOworCXJldHVybiBlOworfQorCit2b2lkIGhjaV9pbnF1aXJ5X2NhY2hlX3VwZGF0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IGlucXVpcnlfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgaW5xdWlyeV9jYWNoZSAqY2FjaGUgPSAmaGRldi0+aW5xX2NhY2hlOworCXN0cnVjdCBpbnF1aXJ5X2VudHJ5ICplOworCisJQlRfREJHKCJjYWNoZSAlcCwgJXMiLCBjYWNoZSwgYmF0b3N0cigmZGF0YS0+YmRhZGRyKSk7CisKKwlpZiAoIShlID0gaGNpX2lucXVpcnlfY2FjaGVfbG9va3VwKGhkZXYsICZkYXRhLT5iZGFkZHIpKSkgeworCQkvKiBFbnRyeSBub3QgaW4gdGhlIGNhY2hlLiBBZGQgbmV3IG9uZS4gKi8KKwkJaWYgKCEoZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbnF1aXJ5X2VudHJ5KSwgR0ZQX0FUT01JQykpKQorCQkJcmV0dXJuOworCQltZW1zZXQoZSwgMCwgc2l6ZW9mKHN0cnVjdCBpbnF1aXJ5X2VudHJ5KSk7CisJCWUtPm5leHQgICAgID0gY2FjaGUtPmxpc3Q7CisJCWNhY2hlLT5saXN0ID0gZTsKKwl9CisKKwltZW1jcHkoJmUtPmRhdGEsIGRhdGEsIHNpemVvZigqZGF0YSkpOworCWUtPnRpbWVzdGFtcCA9IGppZmZpZXM7CisJY2FjaGUtPnRpbWVzdGFtcCA9IGppZmZpZXM7Cit9CisKK3N0YXRpYyBpbnQgaW5xdWlyeV9jYWNoZV9kdW1wKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBpbnQgbnVtLCBfX3U4ICpidWYpCit7CisJc3RydWN0IGlucXVpcnlfY2FjaGUgKmNhY2hlID0gJmhkZXYtPmlucV9jYWNoZTsKKwlzdHJ1Y3QgaW5xdWlyeV9pbmZvICppbmZvID0gKHN0cnVjdCBpbnF1aXJ5X2luZm8gKikgYnVmOworCXN0cnVjdCBpbnF1aXJ5X2VudHJ5ICplOworCWludCBjb3BpZWQgPSAwOworCisJZm9yIChlID0gY2FjaGUtPmxpc3Q7IGUgJiYgY29waWVkIDwgbnVtOyBlID0gZS0+bmV4dCwgY29waWVkKyspIHsKKwkJc3RydWN0IGlucXVpcnlfZGF0YSAqZGF0YSA9ICZlLT5kYXRhOworCQliYWNweSgmaW5mby0+YmRhZGRyLCAmZGF0YS0+YmRhZGRyKTsKKwkJaW5mby0+cHNjYW5fcmVwX21vZGUJPSBkYXRhLT5wc2Nhbl9yZXBfbW9kZTsKKwkJaW5mby0+cHNjYW5fcGVyaW9kX21vZGUJPSBkYXRhLT5wc2Nhbl9wZXJpb2RfbW9kZTsKKwkJaW5mby0+cHNjYW5fbW9kZQk9IGRhdGEtPnBzY2FuX21vZGU7CisJCW1lbWNweShpbmZvLT5kZXZfY2xhc3MsIGRhdGEtPmRldl9jbGFzcywgMyk7CisJCWluZm8tPmNsb2NrX29mZnNldAk9IGRhdGEtPmNsb2NrX29mZnNldDsKKwkJaW5mbysrOworCX0KKworCUJUX0RCRygiY2FjaGUgJXAsIGNvcGllZCAlZCIsIGNhY2hlLCBjb3BpZWQpOworCXJldHVybiBjb3BpZWQ7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9pbnFfcmVxKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1bnNpZ25lZCBsb25nIG9wdCkKK3sKKwlzdHJ1Y3QgaGNpX2lucXVpcnlfcmVxICppciA9IChzdHJ1Y3QgaGNpX2lucXVpcnlfcmVxICopIG9wdDsKKwlzdHJ1Y3QgaGNpX2NwX2lucXVpcnkgY3A7CisKKwlCVF9EQkcoIiVzIiwgaGRldi0+bmFtZSk7CisKKwlpZiAodGVzdF9iaXQoSENJX0lOUVVJUlksICZoZGV2LT5mbGFncykpCisJCXJldHVybjsKKworCS8qIFN0YXJ0IElucXVpcnkgKi8KKwltZW1jcHkoJmNwLmxhcCwgJmlyLT5sYXAsIDMpOworCWNwLmxlbmd0aCAgPSBpci0+bGVuZ3RoOworCWNwLm51bV9yc3AgPSBpci0+bnVtX3JzcDsKKwloY2lfc2VuZF9jbWQoaGRldiwgT0dGX0xJTktfQ1RMLCBPQ0ZfSU5RVUlSWSwgc2l6ZW9mKGNwKSwgJmNwKTsKK30KKworaW50IGhjaV9pbnF1aXJ5KHZvaWQgX191c2VyICphcmcpCit7CisJX191OCBfX3VzZXIgKnB0ciA9IGFyZzsKKwlzdHJ1Y3QgaGNpX2lucXVpcnlfcmVxIGlyOworCXN0cnVjdCBoY2lfZGV2ICpoZGV2OworCWludCBlcnIgPSAwLCBkb19pbnF1aXJ5ID0gMCwgbWF4X3JzcDsKKwlsb25nIHRpbWVvOworCV9fdTggKmJ1ZjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmaXIsIHB0ciwgc2l6ZW9mKGlyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCEoaGRldiA9IGhjaV9kZXZfZ2V0KGlyLmRldl9pZCkpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKKwlpZiAoaW5xdWlyeV9jYWNoZV9hZ2UoaGRldikgPiBJTlFVSVJZX0NBQ0hFX0FHRV9NQVggfHwgCisJCQkJCWlucXVpcnlfY2FjaGVfZW1wdHkoaGRldikgfHwKKwkJCQkJaXIuZmxhZ3MgJiBJUkVRX0NBQ0hFX0ZMVVNIKSB7CisJCWlucXVpcnlfY2FjaGVfZmx1c2goaGRldik7CisJCWRvX2lucXVpcnkgPSAxOworCX0KKwloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKworCXRpbWVvID0gaXIubGVuZ3RoICogMiAqIEhaOworCWlmIChkb19pbnF1aXJ5ICYmIChlcnIgPSBoY2lfcmVxdWVzdChoZGV2LCBoY2lfaW5xX3JlcSwgKHVuc2lnbmVkIGxvbmcpJmlyLCB0aW1lbykpIDwgMCkKKwkJZ290byBkb25lOworCisJLyogZm9yIHVubGltaXRlZCBudW1iZXIgb2YgcmVzcG9uc2VzIHdlIHdpbGwgdXNlIGJ1ZmZlciB3aXRoIDI1NSBlbnRyaWVzICovCisJbWF4X3JzcCA9IChpci5udW1fcnNwID09IDApID8gMjU1IDogaXIubnVtX3JzcDsKKworCS8qIGNhY2hlX2R1bXAgY2FuJ3Qgc2xlZXAuIFRoZXJlZm9yZSB3ZSBhbGxvY2F0ZSB0ZW1wIGJ1ZmZlciBhbmQgdGhlbgorCSAqIGNvcHkgaXQgdG8gdGhlIHVzZXIgc3BhY2UuCisJICovCisJaWYgKCEoYnVmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlucXVpcnlfaW5mbykgKiBtYXhfcnNwLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBkb25lOworCX0KKworCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKKwlpci5udW1fcnNwID0gaW5xdWlyeV9jYWNoZV9kdW1wKGhkZXYsIG1heF9yc3AsIGJ1Zik7CisJaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CisKKwlCVF9EQkcoIm51bV9yc3AgJWQiLCBpci5udW1fcnNwKTsKKworCWlmICghY29weV90b191c2VyKHB0ciwgJmlyLCBzaXplb2YoaXIpKSkgeworCQlwdHIgKz0gc2l6ZW9mKGlyKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihwdHIsIGJ1Ziwgc2l6ZW9mKHN0cnVjdCBpbnF1aXJ5X2luZm8pICoKKwkJCQkJaXIubnVtX3JzcCkpCisJCQllcnIgPSAtRUZBVUxUOworCX0gZWxzZSAKKwkJZXJyID0gLUVGQVVMVDsKKworCWtmcmVlKGJ1Zik7CisKK2RvbmU6CisJaGNpX2Rldl9wdXQoaGRldik7CisJcmV0dXJuIGVycjsKK30KKworLyogLS0tLSBIQ0kgaW9jdGwgaGVscGVycyAtLS0tICovCisKK2ludCBoY2lfZGV2X29wZW4oX191MTYgZGV2KQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2OworCWludCByZXQgPSAwOworCisJaWYgKCEoaGRldiA9IGhjaV9kZXZfZ2V0KGRldikpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCUJUX0RCRygiJXMgJXAiLCBoZGV2LT5uYW1lLCBoZGV2KTsKKworCWhjaV9yZXFfbG9jayhoZGV2KTsKKworCWlmICh0ZXN0X2JpdChIQ0lfVVAsICZoZGV2LT5mbGFncykpIHsKKwkJcmV0ID0gLUVBTFJFQURZOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHRlc3RfYml0KEhDSV9RVUlSS19SQVdfREVWSUNFLCAmaGRldi0+cXVpcmtzKSkKKwkJc2V0X2JpdChIQ0lfUkFXLCAmaGRldi0+ZmxhZ3MpOworCisJaWYgKGhkZXYtPm9wZW4oaGRldikpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBkb25lOworCX0KKworCWlmICghdGVzdF9iaXQoSENJX1JBVywgJmhkZXYtPmZsYWdzKSkgeworCQlhdG9taWNfc2V0KCZoZGV2LT5jbWRfY250LCAxKTsKKwkJc2V0X2JpdChIQ0lfSU5JVCwgJmhkZXYtPmZsYWdzKTsKKworCQkvL19faGNpX3JlcXVlc3QoaGRldiwgaGNpX3Jlc2V0X3JlcSwgMCwgSFopOworCQlyZXQgPSBfX2hjaV9yZXF1ZXN0KGhkZXYsIGhjaV9pbml0X3JlcSwgMCwgSENJX0lOSVRfVElNRU9VVCk7CisKKwkJY2xlYXJfYml0KEhDSV9JTklULCAmaGRldi0+ZmxhZ3MpOworCX0KKworCWlmICghcmV0KSB7CisJCWhjaV9kZXZfaG9sZChoZGV2KTsKKwkJc2V0X2JpdChIQ0lfVVAsICZoZGV2LT5mbGFncyk7CisJCWhjaV9ub3RpZnkoaGRldiwgSENJX0RFVl9VUCk7CisJfSBlbHNlIHsJCisJCS8qIEluaXQgZmFpbGVkLCBjbGVhbnVwICovCisJCXRhc2tsZXRfa2lsbCgmaGRldi0+cnhfdGFzayk7CisJCXRhc2tsZXRfa2lsbCgmaGRldi0+dHhfdGFzayk7CisJCXRhc2tsZXRfa2lsbCgmaGRldi0+Y21kX3Rhc2spOworCisJCXNrYl9xdWV1ZV9wdXJnZSgmaGRldi0+Y21kX3EpOworCQlza2JfcXVldWVfcHVyZ2UoJmhkZXYtPnJ4X3EpOworCisJCWlmIChoZGV2LT5mbHVzaCkKKwkJCWhkZXYtPmZsdXNoKGhkZXYpOworCisJCWlmIChoZGV2LT5zZW50X2NtZCkgeworCQkJa2ZyZWVfc2tiKGhkZXYtPnNlbnRfY21kKTsKKwkJCWhkZXYtPnNlbnRfY21kID0gTlVMTDsKKwkJfQorCisJCWhkZXYtPmNsb3NlKGhkZXYpOworCQloZGV2LT5mbGFncyA9IDA7CisJfQorCitkb25lOgorCWhjaV9yZXFfdW5sb2NrKGhkZXYpOworCWhjaV9kZXZfcHV0KGhkZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaGNpX2Rldl9kb19jbG9zZShzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3sKKwlCVF9EQkcoIiVzICVwIiwgaGRldi0+bmFtZSwgaGRldik7CisKKwloY2lfcmVxX2NhbmNlbChoZGV2LCBFTk9ERVYpOworCWhjaV9yZXFfbG9jayhoZGV2KTsKKworCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KEhDSV9VUCwgJmhkZXYtPmZsYWdzKSkgeworCQloY2lfcmVxX3VubG9jayhoZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogS2lsbCBSWCBhbmQgVFggdGFza3MgKi8KKwl0YXNrbGV0X2tpbGwoJmhkZXYtPnJ4X3Rhc2spOworCXRhc2tsZXRfa2lsbCgmaGRldi0+dHhfdGFzayk7CisKKwloY2lfZGV2X2xvY2tfYmgoaGRldik7CisJaW5xdWlyeV9jYWNoZV9mbHVzaChoZGV2KTsKKwloY2lfY29ubl9oYXNoX2ZsdXNoKGhkZXYpOworCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOworCisJaGNpX25vdGlmeShoZGV2LCBIQ0lfREVWX0RPV04pOworCisJaWYgKGhkZXYtPmZsdXNoKQorCQloZGV2LT5mbHVzaChoZGV2KTsKKworCS8qIFJlc2V0IGRldmljZSAqLworCXNrYl9xdWV1ZV9wdXJnZSgmaGRldi0+Y21kX3EpOworCWF0b21pY19zZXQoJmhkZXYtPmNtZF9jbnQsIDEpOworCWlmICghdGVzdF9iaXQoSENJX1JBVywgJmhkZXYtPmZsYWdzKSkgeworCQlzZXRfYml0KEhDSV9JTklULCAmaGRldi0+ZmxhZ3MpOworCQlfX2hjaV9yZXF1ZXN0KGhkZXYsIGhjaV9yZXNldF9yZXEsIDAsIEhaLzQpOworCQljbGVhcl9iaXQoSENJX0lOSVQsICZoZGV2LT5mbGFncyk7CisJfQorCisJLyogS2lsbCBjbWQgdGFzayAqLworCXRhc2tsZXRfa2lsbCgmaGRldi0+Y21kX3Rhc2spOworCisJLyogRHJvcCBxdWV1ZXMgKi8KKwlza2JfcXVldWVfcHVyZ2UoJmhkZXYtPnJ4X3EpOworCXNrYl9xdWV1ZV9wdXJnZSgmaGRldi0+Y21kX3EpOworCXNrYl9xdWV1ZV9wdXJnZSgmaGRldi0+cmF3X3EpOworCisJLyogRHJvcCBsYXN0IHNlbnQgY29tbWFuZCAqLworCWlmIChoZGV2LT5zZW50X2NtZCkgeworCQlrZnJlZV9za2IoaGRldi0+c2VudF9jbWQpOworCQloZGV2LT5zZW50X2NtZCA9IE5VTEw7CisJfQorCisJLyogQWZ0ZXIgdGhpcyBwb2ludCBvdXIgcXVldWVzIGFyZSBlbXB0eQorCSAqIGFuZCBubyB0YXNrcyBhcmUgc2NoZWR1bGVkLiAqLworCWhkZXYtPmNsb3NlKGhkZXYpOworCisJLyogQ2xlYXIgZmxhZ3MgKi8KKwloZGV2LT5mbGFncyA9IDA7CisKKwloY2lfcmVxX3VubG9jayhoZGV2KTsKKworCWhjaV9kZXZfcHV0KGhkZXYpOworCXJldHVybiAwOworfQorCitpbnQgaGNpX2Rldl9jbG9zZShfX3UxNiBkZXYpCit7CisJc3RydWN0IGhjaV9kZXYgKmhkZXY7CisJaW50IGVycjsKKworCWlmICghKGhkZXYgPSBoY2lfZGV2X2dldChkZXYpKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJZXJyID0gaGNpX2Rldl9kb19jbG9zZShoZGV2KTsKKwloY2lfZGV2X3B1dChoZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgaGNpX2Rldl9yZXNldChfX3UxNiBkZXYpCit7CisJc3RydWN0IGhjaV9kZXYgKmhkZXY7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIShoZGV2ID0gaGNpX2Rldl9nZXQoZGV2KSkpCisJCXJldHVybiAtRU5PREVWOworCisJaGNpX3JlcV9sb2NrKGhkZXYpOworCXRhc2tsZXRfZGlzYWJsZSgmaGRldi0+dHhfdGFzayk7CisKKwlpZiAoIXRlc3RfYml0KEhDSV9VUCwgJmhkZXYtPmZsYWdzKSkKKwkJZ290byBkb25lOworCisJLyogRHJvcCBxdWV1ZXMgKi8KKwlza2JfcXVldWVfcHVyZ2UoJmhkZXYtPnJ4X3EpOworCXNrYl9xdWV1ZV9wdXJnZSgmaGRldi0+Y21kX3EpOworCisJaGNpX2Rldl9sb2NrX2JoKGhkZXYpOworCWlucXVpcnlfY2FjaGVfZmx1c2goaGRldik7CisJaGNpX2Nvbm5faGFzaF9mbHVzaChoZGV2KTsKKwloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKworCWlmIChoZGV2LT5mbHVzaCkKKwkJaGRldi0+Zmx1c2goaGRldik7CisKKwlhdG9taWNfc2V0KCZoZGV2LT5jbWRfY250LCAxKTsgCisJaGRldi0+YWNsX2NudCA9IDA7IGhkZXYtPnNjb19jbnQgPSAwOworCisJaWYgKCF0ZXN0X2JpdChIQ0lfUkFXLCAmaGRldi0+ZmxhZ3MpKQorCQlyZXQgPSBfX2hjaV9yZXF1ZXN0KGhkZXYsIGhjaV9yZXNldF9yZXEsIDAsIEhDSV9JTklUX1RJTUVPVVQpOworCitkb25lOgorCXRhc2tsZXRfZW5hYmxlKCZoZGV2LT50eF90YXNrKTsKKwloY2lfcmVxX3VubG9jayhoZGV2KTsKKwloY2lfZGV2X3B1dChoZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaGNpX2Rldl9yZXNldF9zdGF0KF9fdTE2IGRldikKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghKGhkZXYgPSBoY2lfZGV2X2dldChkZXYpKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltZW1zZXQoJmhkZXYtPnN0YXQsIDAsIHNpemVvZihzdHJ1Y3QgaGNpX2Rldl9zdGF0cykpOworCisJaGNpX2Rldl9wdXQoaGRldik7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaGNpX2Rldl9jbWQodW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKKwlzdHJ1Y3QgaGNpX2Rldl9yZXEgZHI7CisJaW50IGVyciA9IDA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmRyLCBhcmcsIHNpemVvZihkcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICghKGhkZXYgPSBoY2lfZGV2X2dldChkci5kZXZfaWQpKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSENJU0VUQVVUSDoKKwkJZXJyID0gaGNpX3JlcXVlc3QoaGRldiwgaGNpX2F1dGhfcmVxLCBkci5kZXZfb3B0LCBIQ0lfSU5JVF9USU1FT1VUKTsKKwkJYnJlYWs7CisKKwljYXNlIEhDSVNFVEVOQ1JZUFQ6CisJCWlmICghbG1wX2VuY3J5cHRfY2FwYWJsZShoZGV2KSkgeworCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKwkJfQorCisJCWlmICghdGVzdF9iaXQoSENJX0FVVEgsICZoZGV2LT5mbGFncykpIHsKKwkJCS8qIEF1dGggbXVzdCBiZSBlbmFibGVkIGZpcnN0ICovCisJCQllcnIgPSBoY2lfcmVxdWVzdChoZGV2LCBoY2lfYXV0aF9yZXEsCisJCQkJCWRyLmRldl9vcHQsIEhDSV9JTklUX1RJTUVPVVQpOworCQkJaWYgKGVycikKKwkJCQlicmVhazsKKwkJfQorCisJCWVyciA9IGhjaV9yZXF1ZXN0KGhkZXYsIGhjaV9lbmNyeXB0X3JlcSwKKwkJCQkJZHIuZGV2X29wdCwgSENJX0lOSVRfVElNRU9VVCk7CisJCWJyZWFrOworCisJY2FzZSBIQ0lTRVRTQ0FOOgorCQllcnIgPSBoY2lfcmVxdWVzdChoZGV2LCBoY2lfc2Nhbl9yZXEsIGRyLmRldl9vcHQsIEhDSV9JTklUX1RJTUVPVVQpOworCQlicmVhazsKKworCWNhc2UgSENJU0VUUFRZUEU6CisJCWhkZXYtPnBrdF90eXBlID0gKF9fdTE2KSBkci5kZXZfb3B0OworCQlicmVhazsKKworCWNhc2UgSENJU0VUTElOS1BPTDoKKwkJaGRldi0+bGlua19wb2xpY3kgPSAoX191MTYpIGRyLmRldl9vcHQ7CisJCWJyZWFrOworCisJY2FzZSBIQ0lTRVRMSU5LTU9ERToKKwkJaGRldi0+bGlua19tb2RlID0gKChfX3UxNikgZHIuZGV2X29wdCkgJiAoSENJX0xNX01BU1RFUiB8IEhDSV9MTV9BQ0NFUFQpOworCQlicmVhazsKKworCWNhc2UgSENJU0VUQUNMTVRVOgorCQloZGV2LT5hY2xfbXR1ICA9ICooKF9fdTE2ICopJmRyLmRldl9vcHQgKyAxKTsKKwkJaGRldi0+YWNsX3BrdHMgPSAqKChfX3UxNiAqKSZkci5kZXZfb3B0ICsgMCk7CisJCWJyZWFrOworCisJY2FzZSBIQ0lTRVRTQ09NVFU6CisJCWhkZXYtPnNjb19tdHUgID0gKigoX191MTYgKikmZHIuZGV2X29wdCArIDEpOworCQloZGV2LT5zY29fcGt0cyA9ICooKF9fdTE2ICopJmRyLmRldl9vcHQgKyAwKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJaGNpX2Rldl9wdXQoaGRldik7CisJcmV0dXJuIGVycjsKK30KKworaW50IGhjaV9nZXRfZGV2X2xpc3Qodm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgaGNpX2Rldl9saXN0X3JlcSAqZGw7CisJc3RydWN0IGhjaV9kZXZfcmVxICpkcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCWludCBuID0gMCwgc2l6ZSwgZXJyOworCV9fdTE2IGRldl9udW07CisKKwlpZiAoZ2V0X3VzZXIoZGV2X251bSwgKF9fdTE2IF9fdXNlciAqKSBhcmcpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICghZGV2X251bSB8fCBkZXZfbnVtID4gKFBBR0VfU0laRSAqIDIpIC8gc2l6ZW9mKCpkcikpCisJCXJldHVybiAtRUlOVkFMOworCisJc2l6ZSA9IHNpemVvZigqZGwpICsgZGV2X251bSAqIHNpemVvZigqZHIpOworCisJaWYgKCEoZGwgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkciA9IGRsLT5kZXZfcmVxOworCisJcmVhZF9sb2NrX2JoKCZoY2lfZGV2X2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaChwLCAmaGNpX2Rldl9saXN0KSB7CisJCXN0cnVjdCBoY2lfZGV2ICpoZGV2OworCQloZGV2ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGNpX2RldiwgbGlzdCk7CisJCShkciArIG4pLT5kZXZfaWQgID0gaGRldi0+aWQ7CisJCShkciArIG4pLT5kZXZfb3B0ID0gaGRldi0+ZmxhZ3M7CisJCWlmICgrK24gPj0gZGV2X251bSkKKwkJCWJyZWFrOworCX0KKwlyZWFkX3VubG9ja19iaCgmaGNpX2Rldl9saXN0X2xvY2spOworCisJZGwtPmRldl9udW0gPSBuOworCXNpemUgPSBzaXplb2YoKmRsKSArIG4gKiBzaXplb2YoKmRyKTsKKworCWVyciA9IGNvcHlfdG9fdXNlcihhcmcsIGRsLCBzaXplKTsKKwlrZnJlZShkbCk7CisKKwlyZXR1cm4gZXJyID8gLUVGQVVMVCA6IDA7Cit9CisKK2ludCBoY2lfZ2V0X2Rldl9pbmZvKHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGhjaV9kZXYgKmhkZXY7CisJc3RydWN0IGhjaV9kZXZfaW5mbyBkaTsKKwlpbnQgZXJyID0gMDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZGksIGFyZywgc2l6ZW9mKGRpKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCEoaGRldiA9IGhjaV9kZXZfZ2V0KGRpLmRldl9pZCkpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN0cmNweShkaS5uYW1lLCBoZGV2LT5uYW1lKTsKKwlkaS5iZGFkZHIgICA9IGhkZXYtPmJkYWRkcjsKKwlkaS50eXBlICAgICA9IGhkZXYtPnR5cGU7CisJZGkuZmxhZ3MgICAgPSBoZGV2LT5mbGFnczsKKwlkaS5wa3RfdHlwZSA9IGhkZXYtPnBrdF90eXBlOworCWRpLmFjbF9tdHUgID0gaGRldi0+YWNsX210dTsKKwlkaS5hY2xfcGt0cyA9IGhkZXYtPmFjbF9wa3RzOworCWRpLnNjb19tdHUgID0gaGRldi0+c2NvX210dTsKKwlkaS5zY29fcGt0cyA9IGhkZXYtPnNjb19wa3RzOworCWRpLmxpbmtfcG9saWN5ID0gaGRldi0+bGlua19wb2xpY3k7CisJZGkubGlua19tb2RlICAgPSBoZGV2LT5saW5rX21vZGU7CisKKwltZW1jcHkoJmRpLnN0YXQsICZoZGV2LT5zdGF0LCBzaXplb2YoZGkuc3RhdCkpOworCW1lbWNweSgmZGkuZmVhdHVyZXMsICZoZGV2LT5mZWF0dXJlcywgc2l6ZW9mKGRpLmZlYXR1cmVzKSk7CisKKwlpZiAoY29weV90b191c2VyKGFyZywgJmRpLCBzaXplb2YoZGkpKSkKKwkJZXJyID0gLUVGQVVMVDsKKworCWhjaV9kZXZfcHV0KGhkZXYpOworCisJcmV0dXJuIGVycjsKK30KKworLyogLS0tLSBJbnRlcmZhY2UgdG8gSENJIGRyaXZlcnMgLS0tLSAqLworCisvKiBBbGxvYyBIQ0kgZGV2aWNlICovCitzdHJ1Y3QgaGNpX2RldiAqaGNpX2FsbG9jX2Rldih2b2lkKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2OworCisJaGRldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBoY2lfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoZGV2KQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldChoZGV2LCAwLCBzaXplb2Yoc3RydWN0IGhjaV9kZXYpKTsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmhkZXYtPmRyaXZlcl9pbml0KTsKKworCXJldHVybiBoZGV2OworfQorRVhQT1JUX1NZTUJPTChoY2lfYWxsb2NfZGV2KTsKKworLyogRnJlZSBIQ0kgZGV2aWNlICovCit2b2lkIGhjaV9mcmVlX2RldihzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3sKKwlza2JfcXVldWVfcHVyZ2UoJmhkZXYtPmRyaXZlcl9pbml0KTsKKworCS8qIHdpbGwgZnJlZSB2aWEgY2xhc3MgcmVsZWFzZSAqLworCWNsYXNzX2RldmljZV9wdXQoJmhkZXYtPmNsYXNzX2Rldik7Cit9CitFWFBPUlRfU1lNQk9MKGhjaV9mcmVlX2Rldik7CisKKy8qIFJlZ2lzdGVyIEhDSSBkZXZpY2UgKi8KK2ludCBoY2lfcmVnaXN0ZXJfZGV2KHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmaGNpX2Rldl9saXN0LCAqcDsKKwlpbnQgaWQgPSAwOworCisJQlRfREJHKCIlcCBuYW1lICVzIHR5cGUgJWQgb3duZXIgJXAiLCBoZGV2LCBoZGV2LT5uYW1lLCBoZGV2LT50eXBlLCBoZGV2LT5vd25lcik7CisKKwlpZiAoIWhkZXYtPm9wZW4gfHwgIWhkZXYtPmNsb3NlIHx8ICFoZGV2LT5kZXN0cnVjdCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3cml0ZV9sb2NrX2JoKCZoY2lfZGV2X2xpc3RfbG9jayk7CisKKwkvKiBGaW5kIGZpcnN0IGF2YWlsYWJsZSBkZXZpY2UgaWQgKi8KKwlsaXN0X2Zvcl9lYWNoKHAsICZoY2lfZGV2X2xpc3QpIHsKKwkJaWYgKGxpc3RfZW50cnkocCwgc3RydWN0IGhjaV9kZXYsIGxpc3QpLT5pZCAhPSBpZCkKKwkJCWJyZWFrOworCQloZWFkID0gcDsgaWQrKzsKKwl9CisJCisJc3ByaW50ZihoZGV2LT5uYW1lLCAiaGNpJWQiLCBpZCk7CisJaGRldi0+aWQgPSBpZDsKKwlsaXN0X2FkZCgmaGRldi0+bGlzdCwgaGVhZCk7CisKKwlhdG9taWNfc2V0KCZoZGV2LT5yZWZjbnQsIDEpOworCXNwaW5fbG9ja19pbml0KCZoZGV2LT5sb2NrKTsKKworCWhkZXYtPmZsYWdzID0gMDsKKwloZGV2LT5wa3RfdHlwZSAgPSAoSENJX0RNMSB8IEhDSV9ESDEgfCBIQ0lfSFYxKTsKKwloZGV2LT5saW5rX21vZGUgPSAoSENJX0xNX0FDQ0VQVCk7CisKKwl0YXNrbGV0X2luaXQoJmhkZXYtPmNtZF90YXNrLCBoY2lfY21kX3Rhc2ssKHVuc2lnbmVkIGxvbmcpIGhkZXYpOworCXRhc2tsZXRfaW5pdCgmaGRldi0+cnhfdGFzaywgaGNpX3J4X3Rhc2ssICh1bnNpZ25lZCBsb25nKSBoZGV2KTsKKwl0YXNrbGV0X2luaXQoJmhkZXYtPnR4X3Rhc2ssIGhjaV90eF90YXNrLCAodW5zaWduZWQgbG9uZykgaGRldik7CisKKwlza2JfcXVldWVfaGVhZF9pbml0KCZoZGV2LT5yeF9xKTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZoZGV2LT5jbWRfcSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmaGRldi0+cmF3X3EpOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmaGRldi0+cmVxX3dhaXRfcSk7CisJaW5pdF9NVVRFWCgmaGRldi0+cmVxX2xvY2spOworCisJaW5xdWlyeV9jYWNoZV9pbml0KGhkZXYpOworCisJaGNpX2Nvbm5faGFzaF9pbml0KGhkZXYpOworCisJbWVtc2V0KCZoZGV2LT5zdGF0LCAwLCBzaXplb2Yoc3RydWN0IGhjaV9kZXZfc3RhdHMpKTsKKworCWF0b21pY19zZXQoJmhkZXYtPnByb21pc2MsIDApOworCisJd3JpdGVfdW5sb2NrX2JoKCZoY2lfZGV2X2xpc3RfbG9jayk7CisKKwloY2lfcmVnaXN0ZXJfc3lzZnMoaGRldik7CisKKwloY2lfbm90aWZ5KGhkZXYsIEhDSV9ERVZfUkVHKTsKKworCXJldHVybiBpZDsKK30KK0VYUE9SVF9TWU1CT0woaGNpX3JlZ2lzdGVyX2Rldik7CisKKy8qIFVucmVnaXN0ZXIgSENJIGRldmljZSAqLworaW50IGhjaV91bnJlZ2lzdGVyX2RldihzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3sKKwlCVF9EQkcoIiVwIG5hbWUgJXMgdHlwZSAlZCIsIGhkZXYsIGhkZXYtPm5hbWUsIGhkZXYtPnR5cGUpOworCisJaGNpX3VucmVnaXN0ZXJfc3lzZnMoaGRldik7CisKKwl3cml0ZV9sb2NrX2JoKCZoY2lfZGV2X2xpc3RfbG9jayk7CisJbGlzdF9kZWwoJmhkZXYtPmxpc3QpOworCXdyaXRlX3VubG9ja19iaCgmaGNpX2Rldl9saXN0X2xvY2spOworCisJaGNpX2Rldl9kb19jbG9zZShoZGV2KTsKKworCWhjaV9ub3RpZnkoaGRldiwgSENJX0RFVl9VTlJFRyk7CisKKwlfX2hjaV9kZXZfcHV0KGhkZXYpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChoY2lfdW5yZWdpc3Rlcl9kZXYpOworCisvKiBTdXNwZW5kIEhDSSBkZXZpY2UgKi8KK2ludCBoY2lfc3VzcGVuZF9kZXYoc3RydWN0IGhjaV9kZXYgKmhkZXYpCit7CisJaGNpX25vdGlmeShoZGV2LCBIQ0lfREVWX1NVU1BFTkQpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChoY2lfc3VzcGVuZF9kZXYpOworCisvKiBSZXN1bWUgSENJIGRldmljZSAqLworaW50IGhjaV9yZXN1bWVfZGV2KHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCWhjaV9ub3RpZnkoaGRldiwgSENJX0RFVl9SRVNVTUUpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChoY2lfcmVzdW1lX2Rldik7CisKKy8qIC0tLS0gSW50ZXJmYWNlIHRvIHVwcGVyIHByb3RvY29scyAtLS0tICovCisKKy8qIFJlZ2lzdGVyL1VucmVnaXN0ZXIgcHJvdG9jb2xzLgorICogaGNpX3Rhc2tfbG9jayBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IG5vIHRhc2tzIGFyZSBydW5uaW5nLiAqLworaW50IGhjaV9yZWdpc3Rlcl9wcm90byhzdHJ1Y3QgaGNpX3Byb3RvICpocCkKK3sKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygiJXAgbmFtZSAlcyBpZCAlZCIsIGhwLCBocC0+bmFtZSwgaHAtPmlkKTsKKworCWlmIChocC0+aWQgPj0gSENJX01BWF9QUk9UTykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3cml0ZV9sb2NrX2JoKCZoY2lfdGFza19sb2NrKTsKKworCWlmICghaGNpX3Byb3RvW2hwLT5pZF0pCisJCWhjaV9wcm90b1tocC0+aWRdID0gaHA7CisJZWxzZQorCQllcnIgPSAtRUVYSVNUOworCisJd3JpdGVfdW5sb2NrX2JoKCZoY2lfdGFza19sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGhjaV9yZWdpc3Rlcl9wcm90byk7CisKK2ludCBoY2lfdW5yZWdpc3Rlcl9wcm90byhzdHJ1Y3QgaGNpX3Byb3RvICpocCkKK3sKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygiJXAgbmFtZSAlcyBpZCAlZCIsIGhwLCBocC0+bmFtZSwgaHAtPmlkKTsKKworCWlmIChocC0+aWQgPj0gSENJX01BWF9QUk9UTykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3cml0ZV9sb2NrX2JoKCZoY2lfdGFza19sb2NrKTsKKworCWlmIChoY2lfcHJvdG9baHAtPmlkXSkKKwkJaGNpX3Byb3RvW2hwLT5pZF0gPSBOVUxMOworCWVsc2UKKwkJZXJyID0gLUVOT0VOVDsKKworCXdyaXRlX3VubG9ja19iaCgmaGNpX3Rhc2tfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChoY2lfdW5yZWdpc3Rlcl9wcm90byk7CisKK2ludCBoY2lfcmVnaXN0ZXJfY2Ioc3RydWN0IGhjaV9jYiAqY2IpCit7CisJQlRfREJHKCIlcCBuYW1lICVzIiwgY2IsIGNiLT5uYW1lKTsKKworCXdyaXRlX2xvY2tfYmgoJmhjaV9jYl9saXN0X2xvY2spOworCWxpc3RfYWRkKCZjYi0+bGlzdCwgJmhjaV9jYl9saXN0KTsKKwl3cml0ZV91bmxvY2tfYmgoJmhjaV9jYl9saXN0X2xvY2spOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGhjaV9yZWdpc3Rlcl9jYik7CisKK2ludCBoY2lfdW5yZWdpc3Rlcl9jYihzdHJ1Y3QgaGNpX2NiICpjYikKK3sKKwlCVF9EQkcoIiVwIG5hbWUgJXMiLCBjYiwgY2ItPm5hbWUpOworCisJd3JpdGVfbG9ja19iaCgmaGNpX2NiX2xpc3RfbG9jayk7CisJbGlzdF9kZWwoJmNiLT5saXN0KTsKKwl3cml0ZV91bmxvY2tfYmgoJmhjaV9jYl9saXN0X2xvY2spOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGhjaV91bnJlZ2lzdGVyX2NiKTsKKworc3RhdGljIGludCBoY2lfc2VuZF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gKHN0cnVjdCBoY2lfZGV2ICopIHNrYi0+ZGV2OworCisJaWYgKCFoZGV2KSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlCVF9EQkcoIiVzIHR5cGUgJWQgbGVuICVkIiwgaGRldi0+bmFtZSwgc2tiLT5wa3RfdHlwZSwgc2tiLT5sZW4pOworCisJaWYgKGF0b21pY19yZWFkKCZoZGV2LT5wcm9taXNjKSkgeworCQkvKiBUaW1lIHN0YW1wICovCisJCWRvX2dldHRpbWVvZmRheSgmc2tiLT5zdGFtcCk7CisKKwkJaGNpX3NlbmRfdG9fc29jayhoZGV2LCBza2IpOworCX0KKworCS8qIEdldCByaWQgb2Ygc2tiIG93bmVyLCBwcmlvciB0byBzZW5kaW5nIHRvIHRoZSBkcml2ZXIuICovCisJc2tiX29ycGhhbihza2IpOworCisJcmV0dXJuIGhkZXYtPnNlbmQoc2tiKTsKK30KKworLyogU2VuZCBIQ0kgY29tbWFuZCAqLworaW50IGhjaV9zZW5kX2NtZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgX191MTYgb2dmLCBfX3UxNiBvY2YsIF9fdTMyIHBsZW4sIHZvaWQgKnBhcmFtKQoreworCWludCBsZW4gPSBIQ0lfQ09NTUFORF9IRFJfU0laRSArIHBsZW47CisJc3RydWN0IGhjaV9jb21tYW5kX2hkciAqaGRyOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlCVF9EQkcoIiVzIG9nZiAweCV4IG9jZiAweCV4IHBsZW4gJWQiLCBoZGV2LT5uYW1lLCBvZ2YsIG9jZiwgcGxlbik7CisKKwlza2IgPSBidF9za2JfYWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikgeworCQlCVF9FUlIoIiVzIENhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgSENJIGNvbW1hbmQiLCBoZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaGRyID0gKHN0cnVjdCBoY2lfY29tbWFuZF9oZHIgKikgc2tiX3B1dChza2IsIEhDSV9DT01NQU5EX0hEUl9TSVpFKTsKKwloZHItPm9wY29kZSA9IF9fY3B1X3RvX2xlMTYoaGNpX29wY29kZV9wYWNrKG9nZiwgb2NmKSk7CisJaGRyLT5wbGVuICAgPSBwbGVuOworCisJaWYgKHBsZW4pCisJCW1lbWNweShza2JfcHV0KHNrYiwgcGxlbiksIHBhcmFtLCBwbGVuKTsKKworCUJUX0RCRygic2tiIGxlbiAlZCIsIHNrYi0+bGVuKTsKKworCXNrYi0+cGt0X3R5cGUgPSBIQ0lfQ09NTUFORF9QS1Q7CisJc2tiLT5kZXYgPSAodm9pZCAqKSBoZGV2OworCXNrYl9xdWV1ZV90YWlsKCZoZGV2LT5jbWRfcSwgc2tiKTsKKwloY2lfc2NoZWRfY21kKGhkZXYpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGhjaV9zZW5kX2NtZCk7CisKKy8qIEdldCBkYXRhIGZyb20gdGhlIHByZXZpb3VzbHkgc2VudCBjb21tYW5kICovCit2b2lkICpoY2lfc2VudF9jbWRfZGF0YShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgX191MTYgb2dmLCBfX3UxNiBvY2YpCit7CisJc3RydWN0IGhjaV9jb21tYW5kX2hkciAqaGRyOworCisJaWYgKCFoZGV2LT5zZW50X2NtZCkKKwkJcmV0dXJuIE5VTEw7CisKKwloZHIgPSAodm9pZCAqKSBoZGV2LT5zZW50X2NtZC0+ZGF0YTsKKworCWlmIChoZHItPm9wY29kZSAhPSBfX2NwdV90b19sZTE2KGhjaV9vcGNvZGVfcGFjayhvZ2YsIG9jZikpKQorCQlyZXR1cm4gTlVMTDsKKworCUJUX0RCRygiJXMgb2dmIDB4JXggb2NmIDB4JXgiLCBoZGV2LT5uYW1lLCBvZ2YsIG9jZik7CisKKwlyZXR1cm4gaGRldi0+c2VudF9jbWQtPmRhdGEgKyBIQ0lfQ09NTUFORF9IRFJfU0laRTsKK30KKworLyogU2VuZCBBQ0wgZGF0YSAqLworc3RhdGljIHZvaWQgaGNpX2FkZF9hY2xfaGRyKHN0cnVjdCBza19idWZmICpza2IsIF9fdTE2IGhhbmRsZSwgX191MTYgZmxhZ3MpCit7CisJc3RydWN0IGhjaV9hY2xfaGRyICpoZHI7CisJaW50IGxlbiA9IHNrYi0+bGVuOworCisJaGRyID0gKHN0cnVjdCBoY2lfYWNsX2hkciAqKSBza2JfcHVzaChza2IsIEhDSV9BQ0xfSERSX1NJWkUpOworCWhkci0+aGFuZGxlID0gX19jcHVfdG9fbGUxNihoY2lfaGFuZGxlX3BhY2soaGFuZGxlLCBmbGFncykpOworCWhkci0+ZGxlbiAgID0gX19jcHVfdG9fbGUxNihsZW4pOworCisJc2tiLT5oLnJhdyA9ICh2b2lkICopIGhkcjsKK30KKworaW50IGhjaV9zZW5kX2FjbChzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIHN0cnVjdCBza19idWZmICpza2IsIF9fdTE2IGZsYWdzKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gY29ubi0+aGRldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbGlzdDsKKworCUJUX0RCRygiJXMgY29ubiAlcCBmbGFncyAweCV4IiwgaGRldi0+bmFtZSwgY29ubiwgZmxhZ3MpOworCisJc2tiLT5kZXYgPSAodm9pZCAqKSBoZGV2OworCXNrYi0+cGt0X3R5cGUgPSBIQ0lfQUNMREFUQV9QS1Q7CisJaGNpX2FkZF9hY2xfaGRyKHNrYiwgY29ubi0+aGFuZGxlLCBmbGFncyB8IEFDTF9TVEFSVCk7CisKKwlpZiAoIShsaXN0ID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QpKSB7CisJCS8qIE5vbiBmcmFnbWVudGVkICovCisJCUJUX0RCRygiJXMgbm9uZnJhZyBza2IgJXAgbGVuICVkIiwgaGRldi0+bmFtZSwgc2tiLCBza2ItPmxlbik7CisKKwkJc2tiX3F1ZXVlX3RhaWwoJmNvbm4tPmRhdGFfcSwgc2tiKTsKKwl9IGVsc2UgeworCQkvKiBGcmFnbWVudGVkICovCisJCUJUX0RCRygiJXMgZnJhZyAlcCBsZW4gJWQiLCBoZGV2LT5uYW1lLCBza2IsIHNrYi0+bGVuKTsKKworCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCA9IE5VTEw7CisKKwkJLyogUXVldWUgYWxsIGZyYWdtZW50cyBhdG9taWNhbGx5ICovCisJCXNwaW5fbG9ja19iaCgmY29ubi0+ZGF0YV9xLmxvY2spOworCisJCV9fc2tiX3F1ZXVlX3RhaWwoJmNvbm4tPmRhdGFfcSwgc2tiKTsKKwkJZG8geworCQkJc2tiID0gbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQ7CisJCQkKKwkJCXNrYi0+ZGV2ID0gKHZvaWQgKikgaGRldjsKKwkJCXNrYi0+cGt0X3R5cGUgPSBIQ0lfQUNMREFUQV9QS1Q7CisJCQloY2lfYWRkX2FjbF9oZHIoc2tiLCBjb25uLT5oYW5kbGUsIGZsYWdzIHwgQUNMX0NPTlQpOworCisJCQlCVF9EQkcoIiVzIGZyYWcgJXAgbGVuICVkIiwgaGRldi0+bmFtZSwgc2tiLCBza2ItPmxlbik7CisKKwkJCV9fc2tiX3F1ZXVlX3RhaWwoJmNvbm4tPmRhdGFfcSwgc2tiKTsKKwkJfSB3aGlsZSAobGlzdCk7CisKKwkJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPmRhdGFfcS5sb2NrKTsKKwl9CisKKwloY2lfc2NoZWRfdHgoaGRldik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGhjaV9zZW5kX2FjbCk7CisKKy8qIFNlbmQgU0NPIGRhdGEgKi8KK2ludCBoY2lfc2VuZF9zY28oc3RydWN0IGhjaV9jb25uICpjb25uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gY29ubi0+aGRldjsKKwlzdHJ1Y3QgaGNpX3Njb19oZHIgaGRyOworCisJQlRfREJHKCIlcyBsZW4gJWQiLCBoZGV2LT5uYW1lLCBza2ItPmxlbik7CisKKwlpZiAoc2tiLT5sZW4gPiBoZGV2LT5zY29fbXR1KSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwloZHIuaGFuZGxlID0gX19jcHVfdG9fbGUxNihjb25uLT5oYW5kbGUpOworCWhkci5kbGVuICAgPSBza2ItPmxlbjsKKworCXNrYi0+aC5yYXcgPSBza2JfcHVzaChza2IsIEhDSV9TQ09fSERSX1NJWkUpOworCW1lbWNweShza2ItPmgucmF3LCAmaGRyLCBIQ0lfU0NPX0hEUl9TSVpFKTsKKworCXNrYi0+ZGV2ID0gKHZvaWQgKikgaGRldjsKKwlza2ItPnBrdF90eXBlID0gSENJX1NDT0RBVEFfUEtUOworCXNrYl9xdWV1ZV90YWlsKCZjb25uLT5kYXRhX3EsIHNrYik7CisJaGNpX3NjaGVkX3R4KGhkZXYpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChoY2lfc2VuZF9zY28pOworCisvKiAtLS0tIEhDSSBUWCB0YXNrIChvdXRnb2luZyBkYXRhKSAtLS0tICovCisKKy8qIEhDSSBDb25uZWN0aW9uIHNjaGVkdWxlciAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaGNpX2Nvbm4gKmhjaV9sb3dfc2VudChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgX191OCB0eXBlLCBpbnQgKnF1b3RlKQoreworCXN0cnVjdCBoY2lfY29ubl9oYXNoICpoID0gJmhkZXYtPmNvbm5faGFzaDsKKwlzdHJ1Y3QgaGNpX2Nvbm4gICpjb25uID0gTlVMTDsKKwlpbnQgbnVtID0gMCwgbWluID0gfjA7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworCS8qIFdlIGRvbid0IGhhdmUgdG8gbG9jayBkZXZpY2UgaGVyZS4gQ29ubmVjdGlvbnMgYXJlIGFsd2F5cyAKKwkgKiBhZGRlZCBhbmQgcmVtb3ZlZCB3aXRoIFRYIHRhc2sgZGlzYWJsZWQuICovCisJbGlzdF9mb3JfZWFjaChwLCAmaC0+bGlzdCkgeworCQlzdHJ1Y3QgaGNpX2Nvbm4gKmM7CisJCWMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoY2lfY29ubiwgbGlzdCk7CisKKwkJaWYgKGMtPnR5cGUgIT0gdHlwZSB8fCBjLT5zdGF0ZSAhPSBCVF9DT05ORUNURUQKKwkJCQl8fCBza2JfcXVldWVfZW1wdHkoJmMtPmRhdGFfcSkpCisJCQljb250aW51ZTsKKwkJbnVtKys7CisKKwkJaWYgKGMtPnNlbnQgPCBtaW4pIHsKKwkJCW1pbiAgPSBjLT5zZW50OworCQkJY29ubiA9IGM7CisJCX0KKwl9CisKKwlpZiAoY29ubikgeworCQlpbnQgY250ID0gKHR5cGUgPT0gQUNMX0xJTksgPyBoZGV2LT5hY2xfY250IDogaGRldi0+c2NvX2NudCk7CisJCWludCBxID0gY250IC8gbnVtOworCQkqcXVvdGUgPSBxID8gcSA6IDE7CisJfSBlbHNlCisJCSpxdW90ZSA9IDA7CisKKwlCVF9EQkcoImNvbm4gJXAgcXVvdGUgJWQiLCBjb25uLCAqcXVvdGUpOworCXJldHVybiBjb25uOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2FjbF90eF90byhzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3sKKwlzdHJ1Y3QgaGNpX2Nvbm5faGFzaCAqaCA9ICZoZGV2LT5jb25uX2hhc2g7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgaGNpX2Nvbm4gICpjOworCisJQlRfRVJSKCIlcyBBQ0wgdHggdGltZW91dCIsIGhkZXYtPm5hbWUpOworCisJLyogS2lsbCBzdGFsbGVkIGNvbm5lY3Rpb25zICovCisJbGlzdF9mb3JfZWFjaChwLCAmaC0+bGlzdCkgeworCQljID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGNpX2Nvbm4sIGxpc3QpOworCQlpZiAoYy0+dHlwZSA9PSBBQ0xfTElOSyAmJiBjLT5zZW50KSB7CisJCQlCVF9FUlIoIiVzIGtpbGxpbmcgc3RhbGxlZCBBQ0wgY29ubmVjdGlvbiAlcyIsCisJCQkJaGRldi0+bmFtZSwgYmF0b3N0cigmYy0+ZHN0KSk7CisJCQloY2lfYWNsX2Rpc2Nvbm4oYywgMHgxMyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfc2NoZWRfYWNsKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXN0cnVjdCBoY2lfY29ubiAqY29ubjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBxdW90ZTsKKworCUJUX0RCRygiJXMiLCBoZGV2LT5uYW1lKTsKKworCWlmICghdGVzdF9iaXQoSENJX1JBVywgJmhkZXYtPmZsYWdzKSkgeworCQkvKiBBQ0wgdHggdGltZW91dCBtdXN0IGJlIGxvbmdlciB0aGFuIG1heGltdW0KKwkJICogbGluayBzdXBlcnZpc2lvbiB0aW1lb3V0ICg0MC45IHNlY29uZHMpICovCisJCWlmICghaGRldi0+YWNsX2NudCAmJiAoamlmZmllcyAtIGhkZXYtPmFjbF9sYXN0X3R4KSA+IChIWiAqIDQ1KSkKKwkJCWhjaV9hY2xfdHhfdG8oaGRldik7CisJfQorCisJd2hpbGUgKGhkZXYtPmFjbF9jbnQgJiYgKGNvbm4gPSBoY2lfbG93X3NlbnQoaGRldiwgQUNMX0xJTkssICZxdW90ZSkpKSB7CisJCXdoaWxlIChxdW90ZS0tICYmIChza2IgPSBza2JfZGVxdWV1ZSgmY29ubi0+ZGF0YV9xKSkpIHsKKwkJCUJUX0RCRygic2tiICVwIGxlbiAlZCIsIHNrYiwgc2tiLT5sZW4pOworCQkJaGNpX3NlbmRfZnJhbWUoc2tiKTsKKwkJCWhkZXYtPmFjbF9sYXN0X3R4ID0gamlmZmllczsKKworCQkJaGRldi0+YWNsX2NudC0tOworCQkJY29ubi0+c2VudCsrOworCQl9CisJfQorfQorCisvKiBTY2hlZHVsZSBTQ08gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfc2NoZWRfc2NvKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXN0cnVjdCBoY2lfY29ubiAqY29ubjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBxdW90ZTsKKworCUJUX0RCRygiJXMiLCBoZGV2LT5uYW1lKTsKKworCXdoaWxlIChoZGV2LT5zY29fY250ICYmIChjb25uID0gaGNpX2xvd19zZW50KGhkZXYsIFNDT19MSU5LLCAmcXVvdGUpKSkgeworCQl3aGlsZSAocXVvdGUtLSAmJiAoc2tiID0gc2tiX2RlcXVldWUoJmNvbm4tPmRhdGFfcSkpKSB7CisJCQlCVF9EQkcoInNrYiAlcCBsZW4gJWQiLCBza2IsIHNrYi0+bGVuKTsKKwkJCWhjaV9zZW5kX2ZyYW1lKHNrYik7CisKKwkJCWNvbm4tPnNlbnQrKzsKKwkJCWlmIChjb25uLT5zZW50ID09IH4wKQorCQkJCWNvbm4tPnNlbnQgPSAwOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBoY2lfdHhfdGFzayh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IChzdHJ1Y3QgaGNpX2RldiAqKSBhcmc7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXJlYWRfbG9jaygmaGNpX3Rhc2tfbG9jayk7CisKKwlCVF9EQkcoIiVzIGFjbCAlZCBzY28gJWQiLCBoZGV2LT5uYW1lLCBoZGV2LT5hY2xfY250LCBoZGV2LT5zY29fY250KTsKKworCS8qIFNjaGVkdWxlIHF1ZXVlcyBhbmQgc2VuZCBzdHVmZiB0byBIQ0kgZHJpdmVyICovCisKKwloY2lfc2NoZWRfYWNsKGhkZXYpOworCisJaGNpX3NjaGVkX3NjbyhoZGV2KTsKKworCS8qIFNlbmQgbmV4dCBxdWV1ZWQgcmF3ICh1bmtub3duIHR5cGUpIHBhY2tldCAqLworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmhkZXYtPnJhd19xKSkpCisJCWhjaV9zZW5kX2ZyYW1lKHNrYik7CisKKwlyZWFkX3VubG9jaygmaGNpX3Rhc2tfbG9jayk7Cit9CisKKy8qIC0tLS0tIEhDSSBSWCB0YXNrIChpbmNvbWluZyBkYXRhIHByb2NjZXNzaW5nKSAtLS0tLSAqLworCisvKiBBQ0wgZGF0YSBwYWNrZXQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfYWNsZGF0YV9wYWNrZXQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGhjaV9hY2xfaGRyICpoZHIgPSAodm9pZCAqKSBza2ItPmRhdGE7CisJc3RydWN0IGhjaV9jb25uICpjb25uOworCV9fdTE2IGhhbmRsZSwgZmxhZ3M7CisKKwlza2JfcHVsbChza2IsIEhDSV9BQ0xfSERSX1NJWkUpOworCisJaGFuZGxlID0gX19sZTE2X3RvX2NwdShoZHItPmhhbmRsZSk7CisJZmxhZ3MgID0gaGNpX2ZsYWdzKGhhbmRsZSk7CisJaGFuZGxlID0gaGNpX2hhbmRsZShoYW5kbGUpOworCisJQlRfREJHKCIlcyBsZW4gJWQgaGFuZGxlIDB4JXggZmxhZ3MgMHgleCIsIGhkZXYtPm5hbWUsIHNrYi0+bGVuLCBoYW5kbGUsIGZsYWdzKTsKKworCWhkZXYtPnN0YXQuYWNsX3J4Kys7CisKKwloY2lfZGV2X2xvY2soaGRldik7CisJY29ubiA9IGhjaV9jb25uX2hhc2hfbG9va3VwX2hhbmRsZShoZGV2LCBoYW5kbGUpOworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworCQorCWlmIChjb25uKSB7CisJCXJlZ2lzdGVyIHN0cnVjdCBoY2lfcHJvdG8gKmhwOworCisJCS8qIFNlbmQgdG8gdXBwZXIgcHJvdG9jb2wgKi8KKwkJaWYgKChocCA9IGhjaV9wcm90b1tIQ0lfUFJPVE9fTDJDQVBdKSAmJiBocC0+cmVjdl9hY2xkYXRhKSB7CisJCQlocC0+cmVjdl9hY2xkYXRhKGNvbm4sIHNrYiwgZmxhZ3MpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJQlRfRVJSKCIlcyBBQ0wgcGFja2V0IGZvciB1bmtub3duIGNvbm5lY3Rpb24gaGFuZGxlICVkIiwgCisJCQloZGV2LT5uYW1lLCBoYW5kbGUpOworCX0KKworCWtmcmVlX3NrYihza2IpOworfQorCisvKiBTQ08gZGF0YSBwYWNrZXQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfc2NvZGF0YV9wYWNrZXQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGhjaV9zY29faGRyICpoZHIgPSAodm9pZCAqKSBza2ItPmRhdGE7CisJc3RydWN0IGhjaV9jb25uICpjb25uOworCV9fdTE2IGhhbmRsZTsKKworCXNrYl9wdWxsKHNrYiwgSENJX1NDT19IRFJfU0laRSk7CisKKwloYW5kbGUgPSBfX2xlMTZfdG9fY3B1KGhkci0+aGFuZGxlKTsKKworCUJUX0RCRygiJXMgbGVuICVkIGhhbmRsZSAweCV4IiwgaGRldi0+bmFtZSwgc2tiLT5sZW4sIGhhbmRsZSk7CisKKwloZGV2LT5zdGF0LnNjb19yeCsrOworCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCWNvbm4gPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9oYW5kbGUoaGRldiwgaGFuZGxlKTsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKKworCWlmIChjb25uKSB7CisJCXJlZ2lzdGVyIHN0cnVjdCBoY2lfcHJvdG8gKmhwOworCisJCS8qIFNlbmQgdG8gdXBwZXIgcHJvdG9jb2wgKi8KKwkJaWYgKChocCA9IGhjaV9wcm90b1tIQ0lfUFJPVE9fU0NPXSkgJiYgaHAtPnJlY3Zfc2NvZGF0YSkgeworCQkJaHAtPnJlY3Zfc2NvZGF0YShjb25uLCBza2IpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJQlRfRVJSKCIlcyBTQ08gcGFja2V0IGZvciB1bmtub3duIGNvbm5lY3Rpb24gaGFuZGxlICVkIiwgCisJCQloZGV2LT5uYW1lLCBoYW5kbGUpOworCX0KKworCWtmcmVlX3NrYihza2IpOworfQorCit2b2lkIGhjaV9yeF90YXNrKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gKHN0cnVjdCBoY2lfZGV2ICopIGFyZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJQlRfREJHKCIlcyIsIGhkZXYtPm5hbWUpOworCisJcmVhZF9sb2NrKCZoY2lfdGFza19sb2NrKTsKKworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmhkZXYtPnJ4X3EpKSkgeworCQlpZiAoYXRvbWljX3JlYWQoJmhkZXYtPnByb21pc2MpKSB7CisJCQkvKiBTZW5kIGNvcHkgdG8gdGhlIHNvY2tldHMgKi8KKwkJCWhjaV9zZW5kX3RvX3NvY2soaGRldiwgc2tiKTsKKwkJfQorCisJCWlmICh0ZXN0X2JpdChIQ0lfUkFXLCAmaGRldi0+ZmxhZ3MpKSB7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHRlc3RfYml0KEhDSV9JTklULCAmaGRldi0+ZmxhZ3MpKSB7CisJCQkvKiBEb24ndCBwcm9jZXNzIGRhdGEgcGFja2V0cyBpbiB0aGlzIHN0YXRlcy4gKi8KKwkJCXN3aXRjaCAoc2tiLT5wa3RfdHlwZSkgeworCQkJY2FzZSBIQ0lfQUNMREFUQV9QS1Q6CisJCQljYXNlIEhDSV9TQ09EQVRBX1BLVDoKKwkJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCQljb250aW51ZTsKKwkJCX07CisJCX0KKworCQkvKiBQcm9jZXNzIGZyYW1lICovCisJCXN3aXRjaCAoc2tiLT5wa3RfdHlwZSkgeworCQljYXNlIEhDSV9FVkVOVF9QS1Q6CisJCQloY2lfZXZlbnRfcGFja2V0KGhkZXYsIHNrYik7CisJCQlicmVhazsKKworCQljYXNlIEhDSV9BQ0xEQVRBX1BLVDoKKwkJCUJUX0RCRygiJXMgQUNMIGRhdGEgcGFja2V0IiwgaGRldi0+bmFtZSk7CisJCQloY2lfYWNsZGF0YV9wYWNrZXQoaGRldiwgc2tiKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSENJX1NDT0RBVEFfUEtUOgorCQkJQlRfREJHKCIlcyBTQ08gZGF0YSBwYWNrZXQiLCBoZGV2LT5uYW1lKTsKKwkJCWhjaV9zY29kYXRhX3BhY2tldChoZGV2LCBza2IpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWtmcmVlX3NrYihza2IpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZWFkX3VubG9jaygmaGNpX3Rhc2tfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9jbWRfdGFzayh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IChzdHJ1Y3QgaGNpX2RldiAqKSBhcmc7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCUJUX0RCRygiJXMgY21kICVkIiwgaGRldi0+bmFtZSwgYXRvbWljX3JlYWQoJmhkZXYtPmNtZF9jbnQpKTsKKworCWlmICghYXRvbWljX3JlYWQoJmhkZXYtPmNtZF9jbnQpICYmIChqaWZmaWVzIC0gaGRldi0+Y21kX2xhc3RfdHgpID4gSFopIHsKKwkJQlRfRVJSKCIlcyBjb21tYW5kIHR4IHRpbWVvdXQiLCBoZGV2LT5uYW1lKTsKKwkJYXRvbWljX3NldCgmaGRldi0+Y21kX2NudCwgMSk7CisJfQorCisJLyogU2VuZCBxdWV1ZWQgY29tbWFuZHMgKi8KKwlpZiAoYXRvbWljX3JlYWQoJmhkZXYtPmNtZF9jbnQpICYmIChza2IgPSBza2JfZGVxdWV1ZSgmaGRldi0+Y21kX3EpKSkgeworCQlpZiAoaGRldi0+c2VudF9jbWQpCisJCQlrZnJlZV9za2IoaGRldi0+c2VudF9jbWQpOworCisJCWlmICgoaGRldi0+c2VudF9jbWQgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKSkpIHsKKwkJCWF0b21pY19kZWMoJmhkZXYtPmNtZF9jbnQpOworCQkJaGNpX3NlbmRfZnJhbWUoc2tiKTsKKwkJCWhkZXYtPmNtZF9sYXN0X3R4ID0gamlmZmllczsKKwkJfSBlbHNlIHsKKwkJCXNrYl9xdWV1ZV9oZWFkKCZoZGV2LT5jbWRfcSwgc2tiKTsKKwkJCWhjaV9zY2hlZF9jbWQoaGRldik7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9ldmVudC5jIGIvbmV0L2JsdWV0b290aC9oY2lfZXZlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2NiYThlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfZXZlbnQuYwpAQCAtMCwwICsxLDEwNDQgQEAKKy8qIAorICAgQmx1ZVogLSBCbHVldG9vdGggcHJvdG9jb2wgc3RhY2sgZm9yIExpbnV4CisgICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSBRdWFsY29tbSBJbmNvcnBvcmF0ZWQKKworICAgV3JpdHRlbiAyMDAwLDIwMDEgYnkgTWF4aW0gS3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIFRISVJEIFBBUlRZIFJJR0hUUy4KKyAgIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIEFORCBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkKKyAgIENMQUlNLCBPUiBBTlkgU1BFQ0lBTCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIE9SIEFOWSBEQU1BR0VTIAorICAgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIAorICAgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgCisgICBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisgICBBTEwgTElBQklMSVRZLCBJTkNMVURJTkcgTElBQklMSVRZIEZPUiBJTkZSSU5HRU1FTlQgT0YgQU5ZIFBBVEVOVFMsIAorICAgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMsIFJFTEFUSU5HIFRPIFVTRSBPRiBUSElTIAorICAgU09GVFdBUkUgSVMgRElTQ0xBSU1FRC4KKyovCisKKy8qIEJsdWV0b290aCBIQ0kgZXZlbnQgaGFuZGxpbmcuICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KKworI2lmbmRlZiBDT05GSUdfQlRfSENJX0NPUkVfREVCVUcKKyN1bmRlZiAgQlRfREJHCisjZGVmaW5lIEJUX0RCRyhELi4uKQorI2VuZGlmCisKKy8qIEhhbmRsZSBIQ0kgRXZlbnQgcGFja2V0cyAqLworCisvKiBDb21tYW5kIENvbXBsZXRlIE9HRiBMSU5LX0NUTCAgKi8KK3N0YXRpYyB2b2lkIGhjaV9jY19saW5rX2N0bChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgX191MTYgb2NmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCV9fdTggc3RhdHVzOworCisJQlRfREJHKCIlcyBvY2YgMHgleCIsIGhkZXYtPm5hbWUsIG9jZik7CisKKwlzd2l0Y2ggKG9jZikgeworCWNhc2UgT0NGX0lOUVVJUllfQ0FOQ0VMOgorCQlzdGF0dXMgPSAqKChfX3U4ICopIHNrYi0+ZGF0YSk7CisKKwkJaWYgKHN0YXR1cykgeworCQkJQlRfREJHKCIlcyBJbnF1aXJ5IGNhbmNlbCBlcnJvcjogc3RhdHVzIDB4JXgiLCBoZGV2LT5uYW1lLCBzdGF0dXMpOworCQl9IGVsc2UgeworCQkJY2xlYXJfYml0KEhDSV9JTlFVSVJZLCAmaGRldi0+ZmxhZ3MpOworCQkJaGNpX3JlcV9jb21wbGV0ZShoZGV2LCBzdGF0dXMpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlRfREJHKCIlcyBDb21tYW5kIGNvbXBsZXRlOiBvZ2YgTElOS19DVEwgb2NmICV4IiwgaGRldi0+bmFtZSwgb2NmKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBDb21tYW5kIENvbXBsZXRlIE9HRiBMSU5LX1BPTElDWSAgKi8KK3N0YXRpYyB2b2lkIGhjaV9jY19saW5rX3BvbGljeShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgX191MTYgb2NmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfY29ubiAqY29ubjsKKwlzdHJ1Y3QgaGNpX3JwX3JvbGVfZGlzY292ZXJ5ICpyZDsKKworCUJUX0RCRygiJXMgb2NmIDB4JXgiLCBoZGV2LT5uYW1lLCBvY2YpOworCisJc3dpdGNoIChvY2YpIHsKKwljYXNlIE9DRl9ST0xFX0RJU0NPVkVSWTogCisJCXJkID0gKHZvaWQgKikgc2tiLT5kYXRhOworCisJCWlmIChyZC0+c3RhdHVzKQorCQkJYnJlYWs7CisKKwkJaGNpX2Rldl9sb2NrKGhkZXYpOworCisJCWNvbm4gPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9oYW5kbGUoaGRldiwgX19sZTE2X3RvX2NwdShyZC0+aGFuZGxlKSk7CisJCWlmIChjb25uKSB7CisJCQlpZiAocmQtPnJvbGUpCisJCQkJY29ubi0+bGlua19tb2RlICY9IH5IQ0lfTE1fTUFTVEVSOworCQkJZWxzZQorCQkJCWNvbm4tPmxpbmtfbW9kZSB8PSBIQ0lfTE1fTUFTVEVSOworCQl9CisKKwkJaGNpX2Rldl91bmxvY2soaGRldik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlRfREJHKCIlczogQ29tbWFuZCBjb21wbGV0ZTogb2dmIExJTktfUE9MSUNZIG9jZiAleCIsIAorCQkJCWhkZXYtPm5hbWUsIG9jZik7CisJCWJyZWFrOworCX0KK30KKworLyogQ29tbWFuZCBDb21wbGV0ZSBPR0YgSE9TVF9DVEwgICovCitzdGF0aWMgdm9pZCBoY2lfY2NfaG9zdF9jdGwoc3RydWN0IGhjaV9kZXYgKmhkZXYsIF9fdTE2IG9jZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlfX3U4IHN0YXR1cywgcGFyYW07CisJX191MTYgc2V0dGluZzsKKwlzdHJ1Y3QgaGNpX3JwX3JlYWRfdm9pY2Vfc2V0dGluZyAqdnM7CisJdm9pZCAqc2VudDsKKworCUJUX0RCRygiJXMgb2NmIDB4JXgiLCBoZGV2LT5uYW1lLCBvY2YpOworCisJc3dpdGNoIChvY2YpIHsKKwljYXNlIE9DRl9SRVNFVDoKKwkJc3RhdHVzID0gKigoX191OCAqKSBza2ItPmRhdGEpOworCQloY2lfcmVxX2NvbXBsZXRlKGhkZXYsIHN0YXR1cyk7CisJCWJyZWFrOworCisJY2FzZSBPQ0ZfU0VUX0VWRU5UX0ZMVDoKKwkJc3RhdHVzID0gKigoX191OCAqKSBza2ItPmRhdGEpOworCQlpZiAoc3RhdHVzKSB7CisJCQlCVF9EQkcoIiVzIFNFVF9FVkVOVF9GTFQgZmFpbGVkICVkIiwgaGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJfSBlbHNlIHsKKwkJCUJUX0RCRygiJXMgU0VUX0VWRU5UX0ZMVCBzdWNjZXNlZnVsIiwgaGRldi0+bmFtZSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE9DRl9XUklURV9BVVRIX0VOQUJMRToKKwkJc2VudCA9IGhjaV9zZW50X2NtZF9kYXRhKGhkZXYsIE9HRl9IT1NUX0NUTCwgT0NGX1dSSVRFX0FVVEhfRU5BQkxFKTsKKwkJaWYgKCFzZW50KQorCQkJYnJlYWs7CisKKwkJc3RhdHVzID0gKigoX191OCAqKSBza2ItPmRhdGEpOworCQlwYXJhbSAgPSAqKChfX3U4ICopIHNlbnQpOworCisJCWlmICghc3RhdHVzKSB7CisJCQlpZiAocGFyYW0gPT0gQVVUSF9FTkFCTEVEKQorCQkJCXNldF9iaXQoSENJX0FVVEgsICZoZGV2LT5mbGFncyk7CisJCQllbHNlCisJCQkJY2xlYXJfYml0KEhDSV9BVVRILCAmaGRldi0+ZmxhZ3MpOworCQl9CisJCWhjaV9yZXFfY29tcGxldGUoaGRldiwgc3RhdHVzKTsKKwkJYnJlYWs7CisKKwljYXNlIE9DRl9XUklURV9FTkNSWVBUX01PREU6CisJCXNlbnQgPSBoY2lfc2VudF9jbWRfZGF0YShoZGV2LCBPR0ZfSE9TVF9DVEwsIE9DRl9XUklURV9FTkNSWVBUX01PREUpOworCQlpZiAoIXNlbnQpCisJCQlicmVhazsKKworCQlzdGF0dXMgPSAqKChfX3U4ICopIHNrYi0+ZGF0YSk7CisJCXBhcmFtICA9ICooKF9fdTggKikgc2VudCk7CisKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCWlmIChwYXJhbSkKKwkJCQlzZXRfYml0KEhDSV9FTkNSWVBULCAmaGRldi0+ZmxhZ3MpOworCQkJZWxzZQorCQkJCWNsZWFyX2JpdChIQ0lfRU5DUllQVCwgJmhkZXYtPmZsYWdzKTsKKwkJfQorCQloY2lfcmVxX2NvbXBsZXRlKGhkZXYsIHN0YXR1cyk7CisJCWJyZWFrOworCisJY2FzZSBPQ0ZfV1JJVEVfQ0FfVElNRU9VVDoKKwkJc3RhdHVzID0gKigoX191OCAqKSBza2ItPmRhdGEpOworCQlpZiAoc3RhdHVzKSB7CisJCQlCVF9EQkcoIiVzIE9DRl9XUklURV9DQV9USU1FT1VUIGZhaWxlZCAlZCIsIGhkZXYtPm5hbWUsIHN0YXR1cyk7CisJCX0gZWxzZSB7CisJCQlCVF9EQkcoIiVzIE9DRl9XUklURV9DQV9USU1FT1VUIHN1Y2Nlc2VmdWwiLCBoZGV2LT5uYW1lKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgT0NGX1dSSVRFX1BHX1RJTUVPVVQ6CisJCXN0YXR1cyA9ICooKF9fdTggKikgc2tiLT5kYXRhKTsKKwkJaWYgKHN0YXR1cykgeworCQkJQlRfREJHKCIlcyBPQ0ZfV1JJVEVfUEdfVElNRU9VVCBmYWlsZWQgJWQiLCBoZGV2LT5uYW1lLCBzdGF0dXMpOworCQl9IGVsc2UgeworCQkJQlRfREJHKCIlczogT0NGX1dSSVRFX1BHX1RJTUVPVVQgc3VjY2VzZWZ1bCIsIGhkZXYtPm5hbWUpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBPQ0ZfV1JJVEVfU0NBTl9FTkFCTEU6CisJCXNlbnQgPSBoY2lfc2VudF9jbWRfZGF0YShoZGV2LCBPR0ZfSE9TVF9DVEwsIE9DRl9XUklURV9TQ0FOX0VOQUJMRSk7CisJCWlmICghc2VudCkKKwkJCWJyZWFrOworCisJCXN0YXR1cyA9ICooKF9fdTggKikgc2tiLT5kYXRhKTsKKwkJcGFyYW0gID0gKigoX191OCAqKSBzZW50KTsKKworCQlCVF9EQkcoInBhcmFtIDB4JXgiLCBwYXJhbSk7CisKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCWNsZWFyX2JpdChIQ0lfUFNDQU4sICZoZGV2LT5mbGFncyk7CisJCQljbGVhcl9iaXQoSENJX0lTQ0FOLCAmaGRldi0+ZmxhZ3MpOworCQkJaWYgKHBhcmFtICYgU0NBTl9JTlFVSVJZKSAKKwkJCQlzZXRfYml0KEhDSV9JU0NBTiwgJmhkZXYtPmZsYWdzKTsKKworCQkJaWYgKHBhcmFtICYgU0NBTl9QQUdFKSAKKwkJCQlzZXRfYml0KEhDSV9QU0NBTiwgJmhkZXYtPmZsYWdzKTsKKwkJfQorCQloY2lfcmVxX2NvbXBsZXRlKGhkZXYsIHN0YXR1cyk7CisJCWJyZWFrOworCisJY2FzZSBPQ0ZfUkVBRF9WT0lDRV9TRVRUSU5HOgorCQl2cyA9IChzdHJ1Y3QgaGNpX3JwX3JlYWRfdm9pY2Vfc2V0dGluZyAqKSBza2ItPmRhdGE7CisKKwkJaWYgKHZzLT5zdGF0dXMpIHsKKwkJCUJUX0RCRygiJXMgUkVBRF9WT0lDRV9TRVRUSU5HIGZhaWxlZCAlZCIsIGhkZXYtPm5hbWUsIHZzLT5zdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKworCQlzZXR0aW5nID0gX19sZTE2X3RvX2NwdSh2cy0+dm9pY2Vfc2V0dGluZyk7CisKKwkJaWYgKGhkZXYtPnZvaWNlX3NldHRpbmcgIT0gc2V0dGluZyApIHsKKwkJCWhkZXYtPnZvaWNlX3NldHRpbmcgPSBzZXR0aW5nOworCisJCQlCVF9EQkcoIiVzOiB2b2ljZSBzZXR0aW5nIDB4JTA0eCIsIGhkZXYtPm5hbWUsIHNldHRpbmcpOworCisJCQlpZiAoaGRldi0+bm90aWZ5KSB7CisJCQkJdGFza2xldF9kaXNhYmxlKCZoZGV2LT50eF90YXNrKTsKKwkJCQloZGV2LT5ub3RpZnkoaGRldiwgSENJX05PVElGWV9WT0lDRV9TRVRUSU5HKTsKKwkJCQl0YXNrbGV0X2VuYWJsZSgmaGRldi0+dHhfdGFzayk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE9DRl9XUklURV9WT0lDRV9TRVRUSU5HOgorCQlzZW50ID0gaGNpX3NlbnRfY21kX2RhdGEoaGRldiwgT0dGX0hPU1RfQ1RMLCBPQ0ZfV1JJVEVfVk9JQ0VfU0VUVElORyk7CisJCWlmICghc2VudCkKKwkJCWJyZWFrOworCisJCXN0YXR1cyA9ICooKF9fdTggKikgc2tiLT5kYXRhKTsKKwkJc2V0dGluZyA9IF9fbGUxNl90b19jcHUoZ2V0X3VuYWxpZ25lZCgoX191MTYgKikgc2VudCkpOworCisJCWlmICghc3RhdHVzICYmIGhkZXYtPnZvaWNlX3NldHRpbmcgIT0gc2V0dGluZykgeworCQkJaGRldi0+dm9pY2Vfc2V0dGluZyA9IHNldHRpbmc7CisKKwkJCUJUX0RCRygiJXM6IHZvaWNlIHNldHRpbmcgMHglMDR4IiwgaGRldi0+bmFtZSwgc2V0dGluZyk7CisKKwkJCWlmIChoZGV2LT5ub3RpZnkpIHsKKwkJCQl0YXNrbGV0X2Rpc2FibGUoJmhkZXYtPnR4X3Rhc2spOworCQkJCWhkZXYtPm5vdGlmeShoZGV2LCBIQ0lfTk9USUZZX1ZPSUNFX1NFVFRJTkcpOworCQkJCXRhc2tsZXRfZW5hYmxlKCZoZGV2LT50eF90YXNrKTsKKwkJCX0KKwkJfQorCQloY2lfcmVxX2NvbXBsZXRlKGhkZXYsIHN0YXR1cyk7CisJCWJyZWFrOworCisJY2FzZSBPQ0ZfSE9TVF9CVUZGRVJfU0laRToKKwkJc3RhdHVzID0gKigoX191OCAqKSBza2ItPmRhdGEpOworCQlpZiAoc3RhdHVzKSB7CisJCQlCVF9EQkcoIiVzIE9DRl9CVUZGRVJfU0laRSBmYWlsZWQgJWQiLCBoZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJaGNpX3JlcV9jb21wbGV0ZShoZGV2LCBzdGF0dXMpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlRfREJHKCIlcyBDb21tYW5kIGNvbXBsZXRlOiBvZ2YgSE9TVF9DVEwgb2NmICV4IiwgaGRldi0+bmFtZSwgb2NmKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBDb21tYW5kIENvbXBsZXRlIE9HRiBJTkZPX1BBUkFNICAqLworc3RhdGljIHZvaWQgaGNpX2NjX2luZm9fcGFyYW0oc3RydWN0IGhjaV9kZXYgKmhkZXYsIF9fdTE2IG9jZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaGNpX3JwX3JlYWRfbG9jX2ZlYXR1cmVzICpsZjsKKwlzdHJ1Y3QgaGNpX3JwX3JlYWRfYnVmZmVyX3NpemUgKmJzOworCXN0cnVjdCBoY2lfcnBfcmVhZF9iZF9hZGRyICpiYTsKKworCUJUX0RCRygiJXMgb2NmIDB4JXgiLCBoZGV2LT5uYW1lLCBvY2YpOworCisJc3dpdGNoIChvY2YpIHsKKwljYXNlIE9DRl9SRUFEX0xPQ0FMX0ZFQVRVUkVTOgorCQlsZiA9IChzdHJ1Y3QgaGNpX3JwX3JlYWRfbG9jX2ZlYXR1cmVzICopIHNrYi0+ZGF0YTsKKworCQlpZiAobGYtPnN0YXR1cykgeworCQkJQlRfREJHKCIlcyBSRUFEX0xPQ0FMX0ZFQVRVUkVTIGZhaWxlZCAlZCIsIGhkZXYtPm5hbWUsIGxmLT5zdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKworCQltZW1jcHkoaGRldi0+ZmVhdHVyZXMsIGxmLT5mZWF0dXJlcywgc2l6ZW9mKGhkZXYtPmZlYXR1cmVzKSk7CisKKwkJLyogQWRqdXN0IGRlZmF1bHQgc2V0dGluZ3MgYWNjb3JkaW5nIHRvIGZlYXR1cmVzIAorCQkgKiBzdXBwb3J0ZWQgYnkgZGV2aWNlLiAqLworCQlpZiAoaGRldi0+ZmVhdHVyZXNbMF0gJiBMTVBfM1NMT1QpCisJCQloZGV2LT5wa3RfdHlwZSB8PSAoSENJX0RNMyB8IEhDSV9ESDMpOworCisJCWlmIChoZGV2LT5mZWF0dXJlc1swXSAmIExNUF81U0xPVCkKKwkJCWhkZXYtPnBrdF90eXBlIHw9IChIQ0lfRE01IHwgSENJX0RINSk7CisKKwkJaWYgKGhkZXYtPmZlYXR1cmVzWzFdICYgTE1QX0hWMikKKwkJCWhkZXYtPnBrdF90eXBlIHw9IChIQ0lfSFYyKTsKKworCQlpZiAoaGRldi0+ZmVhdHVyZXNbMV0gJiBMTVBfSFYzKQorCQkJaGRldi0+cGt0X3R5cGUgfD0gKEhDSV9IVjMpOworCisJCUJUX0RCRygiJXM6IGZlYXR1cmVzIDB4JXggMHgleCAweCV4IiwgaGRldi0+bmFtZSwgbGYtPmZlYXR1cmVzWzBdLCBsZi0+ZmVhdHVyZXNbMV0sIGxmLT5mZWF0dXJlc1syXSk7CisKKwkJYnJlYWs7CisKKwljYXNlIE9DRl9SRUFEX0JVRkZFUl9TSVpFOgorCQlicyA9IChzdHJ1Y3QgaGNpX3JwX3JlYWRfYnVmZmVyX3NpemUgKikgc2tiLT5kYXRhOworCisJCWlmIChicy0+c3RhdHVzKSB7CisJCQlCVF9EQkcoIiVzIFJFQURfQlVGRkVSX1NJWkUgZmFpbGVkICVkIiwgaGRldi0+bmFtZSwgYnMtPnN0YXR1cyk7CisJCQloY2lfcmVxX2NvbXBsZXRlKGhkZXYsIGJzLT5zdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKworCQloZGV2LT5hY2xfbXR1ICA9IF9fbGUxNl90b19jcHUoYnMtPmFjbF9tdHUpOworCQloZGV2LT5zY29fbXR1ICA9IGJzLT5zY29fbXR1ID8gYnMtPnNjb19tdHUgOiA2NDsKKwkJaGRldi0+YWNsX3BrdHMgPSBoZGV2LT5hY2xfY250ID0gX19sZTE2X3RvX2NwdShicy0+YWNsX21heF9wa3QpOworCQloZGV2LT5zY29fcGt0cyA9IGhkZXYtPnNjb19jbnQgPSBfX2xlMTZfdG9fY3B1KGJzLT5zY29fbWF4X3BrdCk7CisKKwkJQlRfREJHKCIlcyBtdHU6IGFjbCAlZCwgc2NvICVkIG1heF9wa3Q6IGFjbCAlZCwgc2NvICVkIiwgaGRldi0+bmFtZSwKKwkJCWhkZXYtPmFjbF9tdHUsIGhkZXYtPnNjb19tdHUsIGhkZXYtPmFjbF9wa3RzLCBoZGV2LT5zY29fcGt0cyk7CisJCWJyZWFrOworCisJY2FzZSBPQ0ZfUkVBRF9CRF9BRERSOgorCQliYSA9IChzdHJ1Y3QgaGNpX3JwX3JlYWRfYmRfYWRkciAqKSBza2ItPmRhdGE7CisKKwkJaWYgKCFiYS0+c3RhdHVzKSB7CisJCQliYWNweSgmaGRldi0+YmRhZGRyLCAmYmEtPmJkYWRkcik7CisJCX0gZWxzZSB7CisJCQlCVF9EQkcoIiVzOiBSRUFEX0JEX0FERFIgZmFpbGVkICVkIiwgaGRldi0+bmFtZSwgYmEtPnN0YXR1cyk7CisJCX0KKworCQloY2lfcmVxX2NvbXBsZXRlKGhkZXYsIGJhLT5zdGF0dXMpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJUX0RCRygiJXMgQ29tbWFuZCBjb21wbGV0ZTogb2dmIElORk9fUEFSQU0gb2NmICV4IiwgaGRldi0+bmFtZSwgb2NmKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBDb21tYW5kIFN0YXR1cyBPR0YgTElOS19DVEwgICovCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2NzX2NyZWF0ZV9jb25uKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBfX3U4IHN0YXR1cykKK3sKKwlzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm47CisJc3RydWN0IGhjaV9jcF9jcmVhdGVfY29ubiAqY3AgPSBoY2lfc2VudF9jbWRfZGF0YShoZGV2LCBPR0ZfTElOS19DVEwsIE9DRl9DUkVBVEVfQ09OTik7CisKKwlpZiAoIWNwKQorCQlyZXR1cm47CisKKwloY2lfZGV2X2xvY2soaGRldik7CisKKwljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfYmEoaGRldiwgQUNMX0xJTkssICZjcC0+YmRhZGRyKTsKKworCUJUX0RCRygiJXMgc3RhdHVzIDB4JXggYmRhZGRyICVzIGNvbm4gJXAiLCBoZGV2LT5uYW1lLAorCQkJc3RhdHVzLCBiYXRvc3RyKCZjcC0+YmRhZGRyKSwgY29ubik7CisKKwlpZiAoc3RhdHVzKSB7CisJCWlmIChjb25uICYmIGNvbm4tPnN0YXRlID09IEJUX0NPTk5FQ1QpIHsKKwkJCWNvbm4tPnN0YXRlID0gQlRfQ0xPU0VEOworCQkJaGNpX3Byb3RvX2Nvbm5lY3RfY2ZtKGNvbm4sIHN0YXR1cyk7CisJCQloY2lfY29ubl9kZWwoY29ubik7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIWNvbm4pIHsKKwkJCWNvbm4gPSBoY2lfY29ubl9hZGQoaGRldiwgQUNMX0xJTkssICZjcC0+YmRhZGRyKTsKKwkJCWlmIChjb25uKSB7CisJCQkJY29ubi0+b3V0ID0gMTsKKwkJCQljb25uLT5saW5rX21vZGUgfD0gSENJX0xNX01BU1RFUjsKKwkJCX0gZWxzZQorCQkJCUJUX0VSUigiTm8gbWVtbW9yeSBmb3IgbmV3IGNvbm5lY3Rpb24iKTsKKwkJfQorCX0KKworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworfQorCitzdGF0aWMgdm9pZCBoY2lfY3NfbGlua19jdGwoc3RydWN0IGhjaV9kZXYgKmhkZXYsIF9fdTE2IG9jZiwgX191OCBzdGF0dXMpCit7CisJQlRfREJHKCIlcyBvY2YgMHgleCIsIGhkZXYtPm5hbWUsIG9jZik7CisKKwlzd2l0Y2ggKG9jZikgeworCWNhc2UgT0NGX0NSRUFURV9DT05OOgorCQloY2lfY3NfY3JlYXRlX2Nvbm4oaGRldiwgc3RhdHVzKTsKKwkJYnJlYWs7CisKKwljYXNlIE9DRl9BRERfU0NPOgorCQlpZiAoc3RhdHVzKSB7CisJCQlzdHJ1Y3QgaGNpX2Nvbm4gKmFjbCwgKnNjbzsKKwkJCXN0cnVjdCBoY2lfY3BfYWRkX3NjbyAqY3AgPSBoY2lfc2VudF9jbWRfZGF0YShoZGV2LCBPR0ZfTElOS19DVEwsIE9DRl9BRERfU0NPKTsKKwkJCV9fdTE2IGhhbmRsZTsKKworCQkJaWYgKCFjcCkKKwkJCQlicmVhazsKKworCQkJaGFuZGxlID0gX19sZTE2X3RvX2NwdShjcC0+aGFuZGxlKTsKKworCQkJQlRfREJHKCIlcyBBZGQgU0NPIGVycm9yOiBoYW5kbGUgJWQgc3RhdHVzIDB4JXgiLCBoZGV2LT5uYW1lLCBoYW5kbGUsIHN0YXR1cyk7CisKKwkJCWhjaV9kZXZfbG9jayhoZGV2KTsKKworCQkJYWNsID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfaGFuZGxlKGhkZXYsIGhhbmRsZSk7CisJCQlpZiAoYWNsICYmIChzY28gPSBhY2wtPmxpbmspKSB7CisJCQkJc2NvLT5zdGF0ZSA9IEJUX0NMT1NFRDsKKworCQkJCWhjaV9wcm90b19jb25uZWN0X2NmbShzY28sIHN0YXR1cyk7CisJCQkJaGNpX2Nvbm5fZGVsKHNjbyk7CisJCQl9CisKKwkJCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBPQ0ZfSU5RVUlSWToKKwkJaWYgKHN0YXR1cykgeworCQkJQlRfREJHKCIlcyBJbnF1aXJ5IGVycm9yOiBzdGF0dXMgMHgleCIsIGhkZXYtPm5hbWUsIHN0YXR1cyk7CisJCQloY2lfcmVxX2NvbXBsZXRlKGhkZXYsIHN0YXR1cyk7CisJCX0gZWxzZSB7CisJCQlzZXRfYml0KEhDSV9JTlFVSVJZLCAmaGRldi0+ZmxhZ3MpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlRfREJHKCIlcyBDb21tYW5kIHN0YXR1czogb2dmIExJTktfQ1RMIG9jZiAleCBzdGF0dXMgJWQiLCAKKwkJCWhkZXYtPm5hbWUsIG9jZiwgc3RhdHVzKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBDb21tYW5kIFN0YXR1cyBPR0YgTElOS19QT0xJQ1kgKi8KK3N0YXRpYyB2b2lkIGhjaV9jc19saW5rX3BvbGljeShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgX191MTYgb2NmLCBfX3U4IHN0YXR1cykKK3sKKwlCVF9EQkcoIiVzIG9jZiAweCV4IiwgaGRldi0+bmFtZSwgb2NmKTsKKworCXN3aXRjaCAob2NmKSB7CisJZGVmYXVsdDoKKwkJQlRfREJHKCIlcyBDb21tYW5kIHN0YXR1czogb2dmIEhPU1RfUE9MSUNZIG9jZiAleCIsIGhkZXYtPm5hbWUsIG9jZik7CisJCWJyZWFrOworCX0KK30KKworLyogQ29tbWFuZCBTdGF0dXMgT0dGIEhPU1RfQ1RMICovCitzdGF0aWMgdm9pZCBoY2lfY3NfaG9zdF9jdGwoc3RydWN0IGhjaV9kZXYgKmhkZXYsIF9fdTE2IG9jZiwgX191OCBzdGF0dXMpCit7CisJQlRfREJHKCIlcyBvY2YgMHgleCIsIGhkZXYtPm5hbWUsIG9jZik7CisKKwlzd2l0Y2ggKG9jZikgeworCWRlZmF1bHQ6CisJCUJUX0RCRygiJXMgQ29tbWFuZCBzdGF0dXM6IG9nZiBIT1NUX0NUTCBvY2YgJXgiLCBoZGV2LT5uYW1lLCBvY2YpOworCQlicmVhazsKKwl9Cit9CisKKy8qIENvbW1hbmQgU3RhdHVzIE9HRiBJTkZPX1BBUkFNICAqLworc3RhdGljIHZvaWQgaGNpX2NzX2luZm9fcGFyYW0oc3RydWN0IGhjaV9kZXYgKmhkZXYsIF9fdTE2IG9jZiwgX191OCBzdGF0dXMpCit7CisJQlRfREJHKCIlczogaGNpX2NzX2luZm9fcGFyYW06IG9jZiAweCV4IiwgaGRldi0+bmFtZSwgb2NmKTsKKworCXN3aXRjaCAob2NmKSB7CisJZGVmYXVsdDoKKwkJQlRfREJHKCIlcyBDb21tYW5kIHN0YXR1czogb2dmIElORk9fUEFSQU0gb2NmICV4IiwgaGRldi0+bmFtZSwgb2NmKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBJbnF1aXJ5IENvbXBsZXRlICovCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2lucXVpcnlfY29tcGxldGVfZXZ0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCV9fdTggc3RhdHVzID0gKigoX191OCAqKSBza2ItPmRhdGEpOworCisJQlRfREJHKCIlcyBzdGF0dXMgJWQiLCBoZGV2LT5uYW1lLCBzdGF0dXMpOworCisJY2xlYXJfYml0KEhDSV9JTlFVSVJZLCAmaGRldi0+ZmxhZ3MpOworCWhjaV9yZXFfY29tcGxldGUoaGRldiwgc3RhdHVzKTsKK30KKworLyogSW5xdWlyeSBSZXN1bHQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfaW5xdWlyeV9yZXN1bHRfZXZ0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpbnF1aXJ5X2luZm8gKmluZm8gPSAoc3RydWN0IGlucXVpcnlfaW5mbyAqKSAoc2tiLT5kYXRhICsgMSk7CisJaW50IG51bV9yc3AgPSAqKChfX3U4ICopIHNrYi0+ZGF0YSk7CisKKwlCVF9EQkcoIiVzIG51bV9yc3AgJWQiLCBoZGV2LT5uYW1lLCBudW1fcnNwKTsKKworCWhjaV9kZXZfbG9jayhoZGV2KTsKKwlmb3IgKDsgbnVtX3JzcDsgbnVtX3JzcC0tKSB7CisJCXN0cnVjdCBpbnF1aXJ5X2RhdGEgZGF0YTsKKwkJYmFjcHkoJmRhdGEuYmRhZGRyLCAmaW5mby0+YmRhZGRyKTsKKwkJZGF0YS5wc2Nhbl9yZXBfbW9kZQk9IGluZm8tPnBzY2FuX3JlcF9tb2RlOworCQlkYXRhLnBzY2FuX3BlcmlvZF9tb2RlCT0gaW5mby0+cHNjYW5fcGVyaW9kX21vZGU7CisJCWRhdGEucHNjYW5fbW9kZQkJPSBpbmZvLT5wc2Nhbl9tb2RlOworCQltZW1jcHkoZGF0YS5kZXZfY2xhc3MsIGluZm8tPmRldl9jbGFzcywgMyk7CisJCWRhdGEuY2xvY2tfb2Zmc2V0CT0gaW5mby0+Y2xvY2tfb2Zmc2V0OworCQlkYXRhLnJzc2kJCT0gMHgwMDsKKwkJaW5mbysrOworCQloY2lfaW5xdWlyeV9jYWNoZV91cGRhdGUoaGRldiwgJmRhdGEpOworCX0KKwloY2lfZGV2X3VubG9jayhoZGV2KTsKK30KKworLyogSW5xdWlyeSBSZXN1bHQgV2l0aCBSU1NJICovCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2lucXVpcnlfcmVzdWx0X3dpdGhfcnNzaV9ldnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlucXVpcnlfaW5mb193aXRoX3Jzc2kgKmluZm8gPSAoc3RydWN0IGlucXVpcnlfaW5mb193aXRoX3Jzc2kgKikgKHNrYi0+ZGF0YSArIDEpOworCWludCBudW1fcnNwID0gKigoX191OCAqKSBza2ItPmRhdGEpOworCisJQlRfREJHKCIlcyBudW1fcnNwICVkIiwgaGRldi0+bmFtZSwgbnVtX3JzcCk7CisKKwloY2lfZGV2X2xvY2soaGRldik7CisJZm9yICg7IG51bV9yc3A7IG51bV9yc3AtLSkgeworCQlzdHJ1Y3QgaW5xdWlyeV9kYXRhIGRhdGE7CisJCWJhY3B5KCZkYXRhLmJkYWRkciwgJmluZm8tPmJkYWRkcik7CisJCWRhdGEucHNjYW5fcmVwX21vZGUJPSBpbmZvLT5wc2Nhbl9yZXBfbW9kZTsKKwkJZGF0YS5wc2Nhbl9wZXJpb2RfbW9kZQk9IGluZm8tPnBzY2FuX3BlcmlvZF9tb2RlOworCQlkYXRhLnBzY2FuX21vZGUJCT0gMHgwMDsKKwkJbWVtY3B5KGRhdGEuZGV2X2NsYXNzLCBpbmZvLT5kZXZfY2xhc3MsIDMpOworCQlkYXRhLmNsb2NrX29mZnNldAk9IGluZm8tPmNsb2NrX29mZnNldDsKKwkJZGF0YS5yc3NpCQk9IGluZm8tPnJzc2k7CisJCWluZm8rKzsKKwkJaGNpX2lucXVpcnlfY2FjaGVfdXBkYXRlKGhkZXYsICZkYXRhKTsKKwl9CisJaGNpX2Rldl91bmxvY2soaGRldik7Cit9CisKKy8qIENvbm5lY3QgUmVxdWVzdCAqLworc3RhdGljIGlubGluZSB2b2lkIGhjaV9jb25uX3JlcXVlc3RfZXZ0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfZXZfY29ubl9yZXF1ZXN0ICpldiA9IChzdHJ1Y3QgaGNpX2V2X2Nvbm5fcmVxdWVzdCAqKSBza2ItPmRhdGE7CisJaW50IG1hc2sgPSBoZGV2LT5saW5rX21vZGU7CisKKwlCVF9EQkcoIiVzIENvbm5lY3Rpb24gcmVxdWVzdDogJXMgdHlwZSAweCV4IiwgaGRldi0+bmFtZSwKKwkJCWJhdG9zdHIoJmV2LT5iZGFkZHIpLCBldi0+bGlua190eXBlKTsKKworCW1hc2sgfD0gaGNpX3Byb3RvX2Nvbm5lY3RfaW5kKGhkZXYsICZldi0+YmRhZGRyLCBldi0+bGlua190eXBlKTsKKworCWlmIChtYXNrICYgSENJX0xNX0FDQ0VQVCkgeworCQkvKiBDb25uZWN0aW9uIGFjY2VwdGVkICovCisJCXN0cnVjdCBoY2lfY29ubiAqY29ubjsKKwkJc3RydWN0IGhjaV9jcF9hY2NlcHRfY29ubl9yZXEgY3A7CisKKwkJaGNpX2Rldl9sb2NrKGhkZXYpOworCQljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfYmEoaGRldiwgZXYtPmxpbmtfdHlwZSwgJmV2LT5iZGFkZHIpOworCQlpZiAoIWNvbm4pIHsKKwkJCWlmICghKGNvbm4gPSBoY2lfY29ubl9hZGQoaGRldiwgZXYtPmxpbmtfdHlwZSwgJmV2LT5iZGFkZHIpKSkgeworCQkJCUJUX0VSUigiTm8gbWVtbW9yeSBmb3IgbmV3IGNvbm5lY3Rpb24iKTsKKwkJCQloY2lfZGV2X3VubG9jayhoZGV2KTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJbWVtY3B5KGNvbm4tPmRldl9jbGFzcywgZXYtPmRldl9jbGFzcywgMyk7CisJCWNvbm4tPnN0YXRlID0gQlRfQ09OTkVDVDsKKwkJaGNpX2Rldl91bmxvY2soaGRldik7CisKKwkJYmFjcHkoJmNwLmJkYWRkciwgJmV2LT5iZGFkZHIpOworCisJCWlmIChsbXBfcnN3aXRjaF9jYXBhYmxlKGhkZXYpICYmIChtYXNrICYgSENJX0xNX01BU1RFUikpCisJCQljcC5yb2xlID0gMHgwMDsgLyogQmVjb21lIG1hc3RlciAqLworCQllbHNlCisJCQljcC5yb2xlID0gMHgwMTsgLyogUmVtYWluIHNsYXZlICovCisKKwkJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9MSU5LX0NUTCwgT0NGX0FDQ0VQVF9DT05OX1JFUSwgc2l6ZW9mKGNwKSwgJmNwKTsKKwl9IGVsc2UgeworCQkvKiBDb25uZWN0aW9uIHJlamVjdGVkICovCisJCXN0cnVjdCBoY2lfY3BfcmVqZWN0X2Nvbm5fcmVxIGNwOworCisJCWJhY3B5KCZjcC5iZGFkZHIsICZldi0+YmRhZGRyKTsKKwkJY3AucmVhc29uID0gMHgwZjsKKwkJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9MSU5LX0NUTCwgT0NGX1JFSkVDVF9DT05OX1JFUSwgc2l6ZW9mKGNwKSwgJmNwKTsKKwl9Cit9CisKKy8qIENvbm5lY3QgQ29tcGxldGUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfY29ubl9jb21wbGV0ZV9ldnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGhjaV9ldl9jb25uX2NvbXBsZXRlICpldiA9IChzdHJ1Y3QgaGNpX2V2X2Nvbm5fY29tcGxldGUgKikgc2tiLT5kYXRhOworCXN0cnVjdCBoY2lfY29ubiAqY29ubiA9IE5VTEw7CisKKwlCVF9EQkcoIiVzIiwgaGRldi0+bmFtZSk7CisKKwloY2lfZGV2X2xvY2soaGRldik7CisKKwljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfYmEoaGRldiwgZXYtPmxpbmtfdHlwZSwgJmV2LT5iZGFkZHIpOworCWlmICghY29ubikgeworCQloY2lfZGV2X3VubG9jayhoZGV2KTsKKwkJcmV0dXJuOworCX0KKworCWlmICghZXYtPnN0YXR1cykgeworCQljb25uLT5oYW5kbGUgPSBfX2xlMTZfdG9fY3B1KGV2LT5oYW5kbGUpOworCQljb25uLT5zdGF0ZSAgPSBCVF9DT05ORUNURUQ7CisKKwkJaWYgKHRlc3RfYml0KEhDSV9BVVRILCAmaGRldi0+ZmxhZ3MpKQorCQkJY29ubi0+bGlua19tb2RlIHw9IEhDSV9MTV9BVVRIOworCisJCWlmICh0ZXN0X2JpdChIQ0lfRU5DUllQVCwgJmhkZXYtPmZsYWdzKSkKKwkJCWNvbm4tPmxpbmtfbW9kZSB8PSBIQ0lfTE1fRU5DUllQVDsKKworCQkvKiBTZXQgbGluayBwb2xpY3kgKi8KKwkJaWYgKGNvbm4tPnR5cGUgPT0gQUNMX0xJTksgJiYgaGRldi0+bGlua19wb2xpY3kpIHsKKwkJCXN0cnVjdCBoY2lfY3Bfd3JpdGVfbGlua19wb2xpY3kgY3A7CisJCQljcC5oYW5kbGUgPSBldi0+aGFuZGxlOworCQkJY3AucG9saWN5ID0gX19jcHVfdG9fbGUxNihoZGV2LT5saW5rX3BvbGljeSk7CisJCQloY2lfc2VuZF9jbWQoaGRldiwgT0dGX0xJTktfUE9MSUNZLCBPQ0ZfV1JJVEVfTElOS19QT0xJQ1ksIHNpemVvZihjcCksICZjcCk7CisJCX0KKworCQkvKiBTZXQgcGFja2V0IHR5cGUgZm9yIGluY29taW5nIGNvbm5lY3Rpb24gKi8KKwkJaWYgKCFjb25uLT5vdXQpIHsKKwkJCXN0cnVjdCBoY2lfY3BfY2hhbmdlX2Nvbm5fcHR5cGUgY3A7CisJCQljcC5oYW5kbGUgPSBldi0+aGFuZGxlOworCQkJY3AucGt0X3R5cGUgPSAoY29ubi0+dHlwZSA9PSBBQ0xfTElOSykgPyAKKwkJCQlfX2NwdV90b19sZTE2KGhkZXYtPnBrdF90eXBlICYgQUNMX1BUWVBFX01BU0spOgorCQkJCV9fY3B1X3RvX2xlMTYoaGRldi0+cGt0X3R5cGUgJiBTQ09fUFRZUEVfTUFTSyk7CisKKwkJCWhjaV9zZW5kX2NtZChoZGV2LCBPR0ZfTElOS19DVEwsIE9DRl9DSEFOR0VfQ09OTl9QVFlQRSwgc2l6ZW9mKGNwKSwgJmNwKTsKKwkJfQorCX0gZWxzZQorCQljb25uLT5zdGF0ZSA9IEJUX0NMT1NFRDsKKworCWlmIChjb25uLT50eXBlID09IEFDTF9MSU5LKSB7CisJCXN0cnVjdCBoY2lfY29ubiAqc2NvID0gY29ubi0+bGluazsKKwkJaWYgKHNjbykgeworCQkJaWYgKCFldi0+c3RhdHVzKQorCQkJCWhjaV9hZGRfc2NvKHNjbywgY29ubi0+aGFuZGxlKTsKKwkJCWVsc2UgeworCQkJCWhjaV9wcm90b19jb25uZWN0X2NmbShzY28sIGV2LT5zdGF0dXMpOworCQkJCWhjaV9jb25uX2RlbChzY28pOworCQkJfQorCQl9CisJfQorCisJaGNpX3Byb3RvX2Nvbm5lY3RfY2ZtKGNvbm4sIGV2LT5zdGF0dXMpOworCWlmIChldi0+c3RhdHVzKQorCQloY2lfY29ubl9kZWwoY29ubik7CisKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKK30KKworLyogRGlzY29ubmVjdCBDb21wbGV0ZSAqLworc3RhdGljIGlubGluZSB2b2lkIGhjaV9kaXNjb25uX2NvbXBsZXRlX2V2dChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaGNpX2V2X2Rpc2Nvbm5fY29tcGxldGUgKmV2ID0gKHN0cnVjdCBoY2lfZXZfZGlzY29ubl9jb21wbGV0ZSAqKSBza2ItPmRhdGE7CisJc3RydWN0IGhjaV9jb25uICpjb25uID0gTlVMTDsKKwlfX3UxNiBoYW5kbGUgPSBfX2xlMTZfdG9fY3B1KGV2LT5oYW5kbGUpOworCisJQlRfREJHKCIlcyBzdGF0dXMgJWQiLCBoZGV2LT5uYW1lLCBldi0+c3RhdHVzKTsKKworCWlmIChldi0+c3RhdHVzKQorCQlyZXR1cm47CisKKwloY2lfZGV2X2xvY2soaGRldik7CisKKwljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfaGFuZGxlKGhkZXYsIGhhbmRsZSk7CisJaWYgKGNvbm4pIHsKKwkJY29ubi0+c3RhdGUgPSBCVF9DTE9TRUQ7CisJCWhjaV9wcm90b19kaXNjb25uX2luZChjb25uLCBldi0+cmVhc29uKTsKKwkJaGNpX2Nvbm5fZGVsKGNvbm4pOworCX0KKworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworfQorCisvKiBOdW1iZXIgb2YgY29tcGxldGVkIHBhY2tldHMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfbnVtX2NvbXBfcGt0c19ldnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGhjaV9ldl9udW1fY29tcF9wa3RzICpldiA9IChzdHJ1Y3QgaGNpX2V2X251bV9jb21wX3BrdHMgKikgc2tiLT5kYXRhOworCV9fdTE2ICpwdHI7CisJaW50IGk7CisKKwlza2JfcHVsbChza2IsIHNpemVvZigqZXYpKTsKKworCUJUX0RCRygiJXMgbnVtX2huZGwgJWQiLCBoZGV2LT5uYW1lLCBldi0+bnVtX2huZGwpOworCisJaWYgKHNrYi0+bGVuIDwgZXYtPm51bV9obmRsICogNCkgeworCQlCVF9EQkcoIiVzIGJhZCBwYXJhbWV0ZXJzIiwgaGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwl0YXNrbGV0X2Rpc2FibGUoJmhkZXYtPnR4X3Rhc2spOworCisJZm9yIChpID0gMCwgcHRyID0gKF9fdTE2ICopIHNrYi0+ZGF0YTsgaSA8IGV2LT5udW1faG5kbDsgaSsrKSB7CisJCXN0cnVjdCBoY2lfY29ubiAqY29ubjsKKwkJX191MTYgIGhhbmRsZSwgY291bnQ7CisKKwkJaGFuZGxlID0gX19sZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKHB0cisrKSk7CisJCWNvdW50ICA9IF9fbGUxNl90b19jcHUoZ2V0X3VuYWxpZ25lZChwdHIrKykpOworCisJCWNvbm4gPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9oYW5kbGUoaGRldiwgaGFuZGxlKTsKKwkJaWYgKGNvbm4pIHsKKwkJCWNvbm4tPnNlbnQgLT0gY291bnQ7CisKKwkJCWlmIChjb25uLT50eXBlID09IFNDT19MSU5LKSB7CisJCQkJaWYgKChoZGV2LT5zY29fY250ICs9IGNvdW50KSA+IGhkZXYtPnNjb19wa3RzKQorCQkJCQloZGV2LT5zY29fY250ID0gaGRldi0+c2NvX3BrdHM7CisJCQl9IGVsc2UgeworCQkJCWlmICgoaGRldi0+YWNsX2NudCArPSBjb3VudCkgPiBoZGV2LT5hY2xfcGt0cykKKwkJCQkJaGRldi0+YWNsX2NudCA9IGhkZXYtPmFjbF9wa3RzOworCQkJfQorCQl9CisJfQorCWhjaV9zY2hlZF90eChoZGV2KTsKKworCXRhc2tsZXRfZW5hYmxlKCZoZGV2LT50eF90YXNrKTsKK30KKworLyogUm9sZSBDaGFuZ2UgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfcm9sZV9jaGFuZ2VfZXZ0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfZXZfcm9sZV9jaGFuZ2UgKmV2ID0gKHN0cnVjdCBoY2lfZXZfcm9sZV9jaGFuZ2UgKikgc2tiLT5kYXRhOworCXN0cnVjdCBoY2lfY29ubiAqY29ubiA9IE5VTEw7CisKKwlCVF9EQkcoIiVzIHN0YXR1cyAlZCIsIGhkZXYtPm5hbWUsIGV2LT5zdGF0dXMpOworCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCisJY29ubiA9IGhjaV9jb25uX2hhc2hfbG9va3VwX2JhKGhkZXYsIEFDTF9MSU5LLCAmZXYtPmJkYWRkcik7CisJaWYgKGNvbm4pIHsKKwkJaWYgKCFldi0+c3RhdHVzKSB7CisJCQlpZiAoZXYtPnJvbGUpCisJCQkJY29ubi0+bGlua19tb2RlICY9IH5IQ0lfTE1fTUFTVEVSOworCQkJZWxzZQorCQkJCWNvbm4tPmxpbmtfbW9kZSB8PSBIQ0lfTE1fTUFTVEVSOworCQl9CisKKwkJY2xlYXJfYml0KEhDSV9DT05OX1JTV0lUQ0hfUEVORCwgJmNvbm4tPnBlbmQpOworCisJCWhjaV9yb2xlX3N3aXRjaF9jZm0oY29ubiwgZXYtPnN0YXR1cywgZXYtPnJvbGUpOworCX0KKworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworfQorCisvKiBBdXRoZW50aWNhdGlvbiBDb21wbGV0ZSAqLworc3RhdGljIGlubGluZSB2b2lkIGhjaV9hdXRoX2NvbXBsZXRlX2V2dChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaGNpX2V2X2F1dGhfY29tcGxldGUgKmV2ID0gKHN0cnVjdCBoY2lfZXZfYXV0aF9jb21wbGV0ZSAqKSBza2ItPmRhdGE7CisJc3RydWN0IGhjaV9jb25uICpjb25uID0gTlVMTDsKKwlfX3UxNiBoYW5kbGUgPSBfX2xlMTZfdG9fY3B1KGV2LT5oYW5kbGUpOworCisJQlRfREJHKCIlcyBzdGF0dXMgJWQiLCBoZGV2LT5uYW1lLCBldi0+c3RhdHVzKTsKKworCWhjaV9kZXZfbG9jayhoZGV2KTsKKworCWNvbm4gPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9oYW5kbGUoaGRldiwgaGFuZGxlKTsKKwlpZiAoY29ubikgeworCQlpZiAoIWV2LT5zdGF0dXMpCisJCQljb25uLT5saW5rX21vZGUgfD0gSENJX0xNX0FVVEg7CisKKwkJY2xlYXJfYml0KEhDSV9DT05OX0FVVEhfUEVORCwgJmNvbm4tPnBlbmQpOworCisJCWhjaV9hdXRoX2NmbShjb25uLCBldi0+c3RhdHVzKTsKKworCQlpZiAodGVzdF9iaXQoSENJX0NPTk5fRU5DUllQVF9QRU5ELCAmY29ubi0+cGVuZCkpIHsKKwkJCWlmICghZXYtPnN0YXR1cykgeworCQkJCXN0cnVjdCBoY2lfY3Bfc2V0X2Nvbm5fZW5jcnlwdCBjcDsKKwkJCQljcC5oYW5kbGUgID0gX19jcHVfdG9fbGUxNihjb25uLT5oYW5kbGUpOworCQkJCWNwLmVuY3J5cHQgPSAxOworCQkJCWhjaV9zZW5kX2NtZChjb25uLT5oZGV2LCBPR0ZfTElOS19DVEwsCisJCQkJCQlPQ0ZfU0VUX0NPTk5fRU5DUllQVCwKKwkJCQkJCXNpemVvZihjcCksICZjcCk7CisJCQl9IGVsc2UgeworCQkJCWNsZWFyX2JpdChIQ0lfQ09OTl9FTkNSWVBUX1BFTkQsICZjb25uLT5wZW5kKTsKKwkJCQloY2lfZW5jcnlwdF9jZm0oY29ubiwgZXYtPnN0YXR1cywgMHgwMCk7CisJCQl9CisJCX0KKwl9CisKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKK30KKworLyogRW5jcnlwdGlvbiBDaGFuZ2UgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfZW5jcnlwdF9jaGFuZ2VfZXZ0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfZXZfZW5jcnlwdF9jaGFuZ2UgKmV2ID0gKHN0cnVjdCBoY2lfZXZfZW5jcnlwdF9jaGFuZ2UgKikgc2tiLT5kYXRhOworCXN0cnVjdCBoY2lfY29ubiAqY29ubiA9IE5VTEw7CisJX191MTYgaGFuZGxlID0gX19sZTE2X3RvX2NwdShldi0+aGFuZGxlKTsKKworCUJUX0RCRygiJXMgc3RhdHVzICVkIiwgaGRldi0+bmFtZSwgZXYtPnN0YXR1cyk7CisKKwloY2lfZGV2X2xvY2soaGRldik7CisKKwljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfaGFuZGxlKGhkZXYsIGhhbmRsZSk7CisJaWYgKGNvbm4pIHsKKwkJaWYgKCFldi0+c3RhdHVzKSB7CisJCQlpZiAoZXYtPmVuY3J5cHQpCisJCQkJY29ubi0+bGlua19tb2RlIHw9IEhDSV9MTV9FTkNSWVBUOworCQkJZWxzZQorCQkJCWNvbm4tPmxpbmtfbW9kZSAmPSB+SENJX0xNX0VOQ1JZUFQ7CisJCX0KKworCQljbGVhcl9iaXQoSENJX0NPTk5fRU5DUllQVF9QRU5ELCAmY29ubi0+cGVuZCk7CisKKwkJaGNpX2VuY3J5cHRfY2ZtKGNvbm4sIGV2LT5zdGF0dXMsIGV2LT5lbmNyeXB0KTsKKwl9CisKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKK30KKworLyogQ2hhbmdlIENvbm5lY3Rpb24gTGluayBLZXkgQ29tcGxldGUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfY2hhbmdlX2Nvbm5fbGlua19rZXlfY29tcGxldGVfZXZ0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfZXZfY2hhbmdlX2Nvbm5fbGlua19rZXlfY29tcGxldGUgKmV2ID0gKHN0cnVjdCBoY2lfZXZfY2hhbmdlX2Nvbm5fbGlua19rZXlfY29tcGxldGUgKikgc2tiLT5kYXRhOworCXN0cnVjdCBoY2lfY29ubiAqY29ubiA9IE5VTEw7CisJX191MTYgaGFuZGxlID0gX19sZTE2X3RvX2NwdShldi0+aGFuZGxlKTsKKworCUJUX0RCRygiJXMgc3RhdHVzICVkIiwgaGRldi0+bmFtZSwgZXYtPnN0YXR1cyk7CisKKwloY2lfZGV2X2xvY2soaGRldik7CisKKwljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfaGFuZGxlKGhkZXYsIGhhbmRsZSk7CisJaWYgKGNvbm4pIHsKKwkJaWYgKCFldi0+c3RhdHVzKQorCQkJY29ubi0+bGlua19tb2RlIHw9IEhDSV9MTV9TRUNVUkU7CisKKwkJY2xlYXJfYml0KEhDSV9DT05OX0FVVEhfUEVORCwgJmNvbm4tPnBlbmQpOworCisJCWhjaV9rZXlfY2hhbmdlX2NmbShjb25uLCBldi0+c3RhdHVzKTsKKwl9CisKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKK30KKworLyogUGluIENvZGUgUmVxdWVzdCovCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX3Bpbl9jb2RlX3JlcXVlc3RfZXZ0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworfQorCisvKiBMaW5rIEtleSBSZXF1ZXN0ICovCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2xpbmtfa2V5X3JlcXVlc3RfZXZ0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworfQorCisvKiBMaW5rIEtleSBOb3RpZmljYXRpb24gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfbGlua19rZXlfbm90aWZ5X2V2dChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKK30KKworLyogQ2xvY2sgT2Zmc2V0ICovCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2Nsb2NrX29mZnNldF9ldnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGhjaV9ldl9jbG9ja19vZmZzZXQgKmV2ID0gKHN0cnVjdCBoY2lfZXZfY2xvY2tfb2Zmc2V0ICopIHNrYi0+ZGF0YTsKKwlzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4gPSBOVUxMOworCV9fdTE2IGhhbmRsZSA9IF9fbGUxNl90b19jcHUoZXYtPmhhbmRsZSk7CisKKwlCVF9EQkcoIiVzIHN0YXR1cyAlZCIsIGhkZXYtPm5hbWUsIGV2LT5zdGF0dXMpOworCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCisJY29ubiA9IGhjaV9jb25uX2hhc2hfbG9va3VwX2hhbmRsZShoZGV2LCBoYW5kbGUpOworCWlmIChjb25uICYmICFldi0+c3RhdHVzKSB7CisJCXN0cnVjdCBpbnF1aXJ5X2VudHJ5ICppZTsKKworCQlpZiAoKGllID0gaGNpX2lucXVpcnlfY2FjaGVfbG9va3VwKGhkZXYsICZjb25uLT5kc3QpKSkgeworCQkJaWUtPmRhdGEuY2xvY2tfb2Zmc2V0ID0gZXYtPmNsb2NrX29mZnNldDsKKwkJCWllLT50aW1lc3RhbXAgPSBqaWZmaWVzOworCQl9CisJfQorCisJaGNpX2Rldl91bmxvY2soaGRldik7Cit9CisKK3ZvaWQgaGNpX2V2ZW50X3BhY2tldChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaGNpX2V2ZW50X2hkciAqaGRyID0gKHN0cnVjdCBoY2lfZXZlbnRfaGRyICopIHNrYi0+ZGF0YTsKKwlzdHJ1Y3QgaGNpX2V2X2NtZF9jb21wbGV0ZSAqZWM7CisJc3RydWN0IGhjaV9ldl9jbWRfc3RhdHVzICpjczsKKwl1MTYgb3Bjb2RlLCBvY2YsIG9nZjsKKworCXNrYl9wdWxsKHNrYiwgSENJX0VWRU5UX0hEUl9TSVpFKTsKKworCUJUX0RCRygiJXMgZXZ0IDB4JXgiLCBoZGV2LT5uYW1lLCBoZHItPmV2dCk7CisKKwlzd2l0Y2ggKGhkci0+ZXZ0KSB7CisJY2FzZSBIQ0lfRVZfTlVNX0NPTVBfUEtUUzoKKwkJaGNpX251bV9jb21wX3BrdHNfZXZ0KGhkZXYsIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBIQ0lfRVZfSU5RVUlSWV9DT01QTEVURToKKwkJaGNpX2lucXVpcnlfY29tcGxldGVfZXZ0KGhkZXYsIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBIQ0lfRVZfSU5RVUlSWV9SRVNVTFQ6CisJCWhjaV9pbnF1aXJ5X3Jlc3VsdF9ldnQoaGRldiwgc2tiKTsKKwkJYnJlYWs7CisKKwljYXNlIEhDSV9FVl9JTlFVSVJZX1JFU1VMVF9XSVRIX1JTU0k6CisJCWhjaV9pbnF1aXJ5X3Jlc3VsdF93aXRoX3Jzc2lfZXZ0KGhkZXYsIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBIQ0lfRVZfQ09OTl9SRVFVRVNUOgorCQloY2lfY29ubl9yZXF1ZXN0X2V2dChoZGV2LCBza2IpOworCQlicmVhazsKKworCWNhc2UgSENJX0VWX0NPTk5fQ09NUExFVEU6CisJCWhjaV9jb25uX2NvbXBsZXRlX2V2dChoZGV2LCBza2IpOworCQlicmVhazsKKworCWNhc2UgSENJX0VWX0RJU0NPTk5fQ09NUExFVEU6CisJCWhjaV9kaXNjb25uX2NvbXBsZXRlX2V2dChoZGV2LCBza2IpOworCQlicmVhazsKKworCWNhc2UgSENJX0VWX1JPTEVfQ0hBTkdFOgorCQloY2lfcm9sZV9jaGFuZ2VfZXZ0KGhkZXYsIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBIQ0lfRVZfQVVUSF9DT01QTEVURToKKwkJaGNpX2F1dGhfY29tcGxldGVfZXZ0KGhkZXYsIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBIQ0lfRVZfRU5DUllQVF9DSEFOR0U6CisJCWhjaV9lbmNyeXB0X2NoYW5nZV9ldnQoaGRldiwgc2tiKTsKKwkJYnJlYWs7CisKKwljYXNlIEhDSV9FVl9DSEFOR0VfQ09OTl9MSU5LX0tFWV9DT01QTEVURToKKwkJaGNpX2NoYW5nZV9jb25uX2xpbmtfa2V5X2NvbXBsZXRlX2V2dChoZGV2LCBza2IpOworCQlicmVhazsKKworCWNhc2UgSENJX0VWX1BJTl9DT0RFX1JFUToKKwkJaGNpX3Bpbl9jb2RlX3JlcXVlc3RfZXZ0KGhkZXYsIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBIQ0lfRVZfTElOS19LRVlfUkVROgorCQloY2lfbGlua19rZXlfcmVxdWVzdF9ldnQoaGRldiwgc2tiKTsKKwkJYnJlYWs7CisKKwljYXNlIEhDSV9FVl9MSU5LX0tFWV9OT1RJRlk6CisJCWhjaV9saW5rX2tleV9ub3RpZnlfZXZ0KGhkZXYsIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBIQ0lfRVZfQ0xPQ0tfT0ZGU0VUOgorCQloY2lfY2xvY2tfb2Zmc2V0X2V2dChoZGV2LCBza2IpOworCQlicmVhazsKKworCWNhc2UgSENJX0VWX0NNRF9TVEFUVVM6CisJCWNzID0gKHN0cnVjdCBoY2lfZXZfY21kX3N0YXR1cyAqKSBza2ItPmRhdGE7CisJCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKGNzKSk7CisKKwkJb3Bjb2RlID0gX19sZTE2X3RvX2NwdShjcy0+b3Bjb2RlKTsKKwkJb2dmID0gaGNpX29wY29kZV9vZ2Yob3Bjb2RlKTsKKwkJb2NmID0gaGNpX29wY29kZV9vY2Yob3Bjb2RlKTsKKworCQlzd2l0Y2ggKG9nZikgeworCQljYXNlIE9HRl9JTkZPX1BBUkFNOgorCQkJaGNpX2NzX2luZm9fcGFyYW0oaGRldiwgb2NmLCBjcy0+c3RhdHVzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0dGX0hPU1RfQ1RMOgorCQkJaGNpX2NzX2hvc3RfY3RsKGhkZXYsIG9jZiwgY3MtPnN0YXR1cyk7CisJCQlicmVhazsKKworCQljYXNlIE9HRl9MSU5LX0NUTDoKKwkJCWhjaV9jc19saW5rX2N0bChoZGV2LCBvY2YsIGNzLT5zdGF0dXMpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPR0ZfTElOS19QT0xJQ1k6CisJCQloY2lfY3NfbGlua19wb2xpY3koaGRldiwgb2NmLCBjcy0+c3RhdHVzKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlCVF9EQkcoIiVzIENvbW1hbmQgU3RhdHVzIE9HRiAleCIsIGhkZXYtPm5hbWUsIG9nZik7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChjcy0+bmNtZCkgeworCQkJYXRvbWljX3NldCgmaGRldi0+Y21kX2NudCwgMSk7CisJCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmaGRldi0+Y21kX3EpKQorCQkJCWhjaV9zY2hlZF9jbWQoaGRldik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEhDSV9FVl9DTURfQ09NUExFVEU6CisJCWVjID0gKHN0cnVjdCBoY2lfZXZfY21kX2NvbXBsZXRlICopIHNrYi0+ZGF0YTsKKwkJc2tiX3B1bGwoc2tiLCBzaXplb2YoKmVjKSk7CisKKwkJb3Bjb2RlID0gX19sZTE2X3RvX2NwdShlYy0+b3Bjb2RlKTsKKwkJb2dmID0gaGNpX29wY29kZV9vZ2Yob3Bjb2RlKTsKKwkJb2NmID0gaGNpX29wY29kZV9vY2Yob3Bjb2RlKTsKKworCQlzd2l0Y2ggKG9nZikgeworCQljYXNlIE9HRl9JTkZPX1BBUkFNOgorCQkJaGNpX2NjX2luZm9fcGFyYW0oaGRldiwgb2NmLCBza2IpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPR0ZfSE9TVF9DVEw6CisJCQloY2lfY2NfaG9zdF9jdGwoaGRldiwgb2NmLCBza2IpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPR0ZfTElOS19DVEw6CisJCQloY2lfY2NfbGlua19jdGwoaGRldiwgb2NmLCBza2IpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPR0ZfTElOS19QT0xJQ1k6CisJCQloY2lfY2NfbGlua19wb2xpY3koaGRldiwgb2NmLCBza2IpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCUJUX0RCRygiJXMgQ29tbWFuZCBDb21wbGV0ZWQgT0dGICV4IiwgaGRldi0+bmFtZSwgb2dmKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGVjLT5uY21kKSB7CisJCQlhdG9taWNfc2V0KCZoZGV2LT5jbWRfY250LCAxKTsKKwkJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZoZGV2LT5jbWRfcSkpCisJCQkJaGNpX3NjaGVkX2NtZChoZGV2KTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlrZnJlZV9za2Ioc2tiKTsKKwloZGV2LT5zdGF0LmV2dF9yeCsrOworfQorCisvKiBHZW5lcmF0ZSBpbnRlcm5hbCBzdGFjayBldmVudCAqLwordm9pZCBoY2lfc2lfZXZlbnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGludCB0eXBlLCBpbnQgZGxlbiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaGNpX2V2ZW50X2hkciAqaGRyOworCXN0cnVjdCBoY2lfZXZfc3RhY2tfaW50ZXJuYWwgKmV2OworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBidF9za2JfYWxsb2MoSENJX0VWRU5UX0hEUl9TSVpFICsgc2l6ZW9mKCpldikgKyBkbGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuOworCisJaGRyID0gKHZvaWQgKikgc2tiX3B1dChza2IsIEhDSV9FVkVOVF9IRFJfU0laRSk7CisJaGRyLT5ldnQgID0gSENJX0VWX1NUQUNLX0lOVEVSTkFMOworCWhkci0+cGxlbiA9IHNpemVvZigqZXYpICsgZGxlbjsKKworCWV2ICA9ICh2b2lkICopIHNrYl9wdXQoc2tiLCBzaXplb2YoKmV2KSArIGRsZW4pOworCWV2LT50eXBlID0gdHlwZTsKKwltZW1jcHkoZXYtPmRhdGEsIGRhdGEsIGRsZW4pOworCisJc2tiLT5wa3RfdHlwZSA9IEhDSV9FVkVOVF9QS1Q7CisJc2tiLT5kZXYgPSAodm9pZCAqKSBoZGV2OworCWhjaV9zZW5kX3RvX3NvY2soaGRldiwgc2tiKTsKKwlrZnJlZV9za2Ioc2tiKTsKK30KK0VYUE9SVF9TWU1CT0woaGNpX3NpX2V2ZW50KTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX3NvY2suYyBiL25ldC9ibHVldG9vdGgvaGNpX3NvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTc5MmJhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfc29jay5jCkBAIC0wLDAgKzEsNzA3IEBACisvKiAKKyAgIEJsdWVaIC0gQmx1ZXRvb3RoIHByb3RvY29sIHN0YWNrIGZvciBMaW51eAorICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEgUXVhbGNvbW0gSW5jb3Jwb3JhdGVkCisKKyAgIFdyaXR0ZW4gMjAwMCwyMDAxIGJ5IE1heGltIEtyYXNueWFuc2t5IDxtYXhrQHF1YWxjb21tLmNvbT4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBBTkQgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyAKKyAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiAKKyAgIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIAorICAgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworICAgQUxMIExJQUJJTElUWSwgSU5DTFVESU5HIExJQUJJTElUWSBGT1IgSU5GUklOR0VNRU5UIE9GIEFOWSBQQVRFTlRTLCAKKyAgIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLCBSRUxBVElORyBUTyBVU0UgT0YgVEhJUyAKKyAgIFNPRlRXQVJFIElTIERJU0NMQUlNRUQuCisqLworCisvKiBCbHVldG9vdGggSENJIHNvY2tldHMuICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KKworI2lmbmRlZiBDT05GSUdfQlRfSENJX1NPQ0tfREVCVUcKKyN1bmRlZiAgQlRfREJHCisjZGVmaW5lIEJUX0RCRyhELi4uKQorI2VuZGlmCisKKy8qIC0tLS0tIEhDSSBzb2NrZXQgaW50ZXJmYWNlIC0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGhjaV90ZXN0X2JpdChpbnQgbnIsIHZvaWQgKmFkZHIpCit7CisJcmV0dXJuICooKF9fdTMyICopIGFkZHIgKyAobnIgPj4gNSkpICYgKChfX3UzMikgMSA8PCAobnIgJiAzMSkpOworfQorCisvKiBTZWN1cml0eSBmaWx0ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgaGNpX3NlY19maWx0ZXIgaGNpX3NlY19maWx0ZXIgPSB7CisJLyogUGFja2V0IHR5cGVzICovCisJMHgxMCwKKwkvKiBFdmVudHMgKi8KKwl7IDB4MTAwMGQ5ZmUsIDB4MDAwMDMwMGMgfSwKKwkvKiBDb21tYW5kcyAqLworCXsKKwkJeyAweDAgfSwKKwkJLyogT0dGX0xJTktfQ1RMICovCisJCXsgMHhiZTAwMDAwNiwgMHgwMDAwMDAwMSwgMHgwMDAwLCAweDAwIH0sCisJCS8qIE9HRl9MSU5LX1BPTElDWSAqLworCQl7IDB4MDAwMDUyMDAsIDB4MDAwMDAwMDAsIDB4MDAwMCwgMHgwMCB9LAorCQkvKiBPR0ZfSE9TVF9DVEwgKi8KKwkJeyAweGFhYjAwMjAwLCAweDJiNDAyYWFhLCAweDAxNTQsIDB4MDAgfSwKKwkJLyogT0dGX0lORk9fUEFSQU0gKi8KKwkJeyAweDAwMDAwMmJlLCAweDAwMDAwMDAwLCAweDAwMDAsIDB4MDAgfSwKKwkJLyogT0dGX1NUQVRVU19QQVJBTSAqLworCQl7IDB4MDAwMDAwZWEsIDB4MDAwMDAwMDAsIDB4MDAwMCwgMHgwMCB9CisJfQorfTsKKworc3RhdGljIHN0cnVjdCBidF9zb2NrX2xpc3QgaGNpX3NrX2xpc3QgPSB7CisJLmxvY2sgPSBSV19MT0NLX1VOTE9DS0VECit9OworCisvKiBTZW5kIGZyYW1lIHRvIFJBVyBzb2NrZXQgKi8KK3ZvaWQgaGNpX3NlbmRfdG9fc29jayhzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisKKwlCVF9EQkcoImhkZXYgJXAgbGVuICVkIiwgaGRldiwgc2tiLT5sZW4pOworCisJcmVhZF9sb2NrKCZoY2lfc2tfbGlzdC5sb2NrKTsKKwlza19mb3JfZWFjaChzaywgbm9kZSwgJmhjaV9za19saXN0LmhlYWQpIHsKKwkJc3RydWN0IGhjaV9maWx0ZXIgKmZsdDsKKwkJc3RydWN0IHNrX2J1ZmYgKm5za2I7CisKKwkJaWYgKHNrLT5za19zdGF0ZSAhPSBCVF9CT1VORCB8fCBoY2lfcGkoc2spLT5oZGV2ICE9IGhkZXYpCisJCQljb250aW51ZTsKKworCQkvKiBEb24ndCBzZW5kIGZyYW1lIHRvIHRoZSBzb2NrZXQgaXQgY2FtZSBmcm9tICovCisJCWlmIChza2ItPnNrID09IHNrKQorCQkJY29udGludWU7CisKKwkJLyogQXBwbHkgZmlsdGVyICovCisJCWZsdCA9ICZoY2lfcGkoc2spLT5maWx0ZXI7CisKKwkJaWYgKCF0ZXN0X2JpdCgoc2tiLT5wa3RfdHlwZSA9PSBIQ0lfVkVORE9SX1BLVCkgPworCQkJCTAgOiAoc2tiLT5wa3RfdHlwZSAmIEhDSV9GTFRfVFlQRV9CSVRTKSwgJmZsdC0+dHlwZV9tYXNrKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChza2ItPnBrdF90eXBlID09IEhDSV9FVkVOVF9QS1QpIHsKKwkJCXJlZ2lzdGVyIGludCBldnQgPSAoKihfX3U4ICopc2tiLT5kYXRhICYgSENJX0ZMVF9FVkVOVF9CSVRTKTsKKworCQkJaWYgKCFoY2lfdGVzdF9iaXQoZXZ0LCAmZmx0LT5ldmVudF9tYXNrKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGZsdC0+b3Bjb2RlICYmICgoZXZ0ID09IEhDSV9FVl9DTURfQ09NUExFVEUgJiYgCisJCQkJCWZsdC0+b3Bjb2RlICE9ICooX191MTYgKikoc2tiLT5kYXRhICsgMykpIHx8CisJCQkJCShldnQgPT0gSENJX0VWX0NNRF9TVEFUVVMgJiYgCisJCQkJCWZsdC0+b3Bjb2RlICE9ICooX191MTYgKikoc2tiLT5kYXRhICsgNCkpKSkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghKG5za2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKSkpCisJCQljb250aW51ZTsKKworCQkvKiBQdXQgdHlwZSBieXRlIGJlZm9yZSB0aGUgZGF0YSAqLworCQltZW1jcHkoc2tiX3B1c2gobnNrYiwgMSksICZuc2tiLT5wa3RfdHlwZSwgMSk7CisKKwkJaWYgKHNvY2tfcXVldWVfcmN2X3NrYihzaywgbnNrYikpCisJCQlrZnJlZV9za2IobnNrYik7CisJfQorCXJlYWRfdW5sb2NrKCZoY2lfc2tfbGlzdC5sb2NrKTsKK30KKworc3RhdGljIGludCBoY2lfc29ja19yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBoY2lfcGkoc2spLT5oZGV2OworCisJQlRfREJHKCJzb2NrICVwIHNrICVwIiwgc29jaywgc2spOworCisJaWYgKCFzaykKKwkJcmV0dXJuIDA7CisKKwlidF9zb2NrX3VubGluaygmaGNpX3NrX2xpc3QsIHNrKTsKKworCWlmIChoZGV2KSB7CisJCWF0b21pY19kZWMoJmhkZXYtPnByb21pc2MpOworCQloY2lfZGV2X3B1dChoZGV2KTsKKwl9CisKKwlzb2NrX29ycGhhbihzayk7CisKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za193cml0ZV9xdWV1ZSk7CisKKwlzb2NrX3B1dChzayk7CisJcmV0dXJuIDA7Cit9CisKKy8qIElvY3RscyB0aGF0IHJlcXVpcmUgYm91bmQgc29ja2V0ICovIAorc3RhdGljIGlubGluZSBpbnQgaGNpX3NvY2tfYm91bmRfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGhjaV9waShzayktPmhkZXY7CisKKwlpZiAoIWhkZXYpCisJCXJldHVybiAtRUJBREZEOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEhDSVNFVFJBVzoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKKwkJaWYgKHRlc3RfYml0KEhDSV9RVUlSS19SQVdfREVWSUNFLCAmaGRldi0+cXVpcmtzKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKGFyZykKKwkJCXNldF9iaXQoSENJX1JBVywgJmhkZXYtPmZsYWdzKTsKKwkJZWxzZQorCQkJY2xlYXJfYml0KEhDSV9SQVcsICZoZGV2LT5mbGFncyk7CisKKwkJcmV0dXJuIDA7CisKKwljYXNlIEhDSVNFVFNFQ01HUjoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKKwkJaWYgKGFyZykKKwkJCXNldF9iaXQoSENJX1NFQ01HUiwgJmhkZXYtPmZsYWdzKTsKKwkJZWxzZQorCQkJY2xlYXJfYml0KEhDSV9TRUNNR1IsICZoZGV2LT5mbGFncyk7CisKKwkJcmV0dXJuIDA7CisKKwljYXNlIEhDSUdFVENPTk5JTkZPOgorCQlyZXR1cm4gaGNpX2dldF9jb25uX2luZm8oaGRldiwgKHZvaWQgX191c2VyICopYXJnKTsKKworCWRlZmF1bHQ6CisJCWlmIChoZGV2LT5pb2N0bCkKKwkJCXJldHVybiBoZGV2LT5pb2N0bChoZGV2LCBjbWQsIGFyZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludCBoY2lfc29ja19pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgZXJyOworCisJQlRfREJHKCJjbWQgJXggYXJnICVseCIsIGNtZCwgYXJnKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBIQ0lHRVRERVZMSVNUOgorCQlyZXR1cm4gaGNpX2dldF9kZXZfbGlzdChhcmdwKTsKKworCWNhc2UgSENJR0VUREVWSU5GTzoKKwkJcmV0dXJuIGhjaV9nZXRfZGV2X2luZm8oYXJncCk7CisKKwljYXNlIEhDSUdFVENPTk5MSVNUOgorCQlyZXR1cm4gaGNpX2dldF9jb25uX2xpc3QoYXJncCk7CisKKwljYXNlIEhDSURFVlVQOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJcmV0dXJuIGhjaV9kZXZfb3BlbihhcmcpOworCisJY2FzZSBIQ0lERVZET1dOOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJcmV0dXJuIGhjaV9kZXZfY2xvc2UoYXJnKTsKKworCWNhc2UgSENJREVWUkVTRVQ6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQlyZXR1cm4gaGNpX2Rldl9yZXNldChhcmcpOworCisJY2FzZSBIQ0lERVZSRVNUQVQ6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQlyZXR1cm4gaGNpX2Rldl9yZXNldF9zdGF0KGFyZyk7CisKKwljYXNlIEhDSVNFVFNDQU46CisJY2FzZSBIQ0lTRVRBVVRIOgorCWNhc2UgSENJU0VURU5DUllQVDoKKwljYXNlIEhDSVNFVFBUWVBFOgorCWNhc2UgSENJU0VUTElOS1BPTDoKKwljYXNlIEhDSVNFVExJTktNT0RFOgorCWNhc2UgSENJU0VUQUNMTVRVOgorCWNhc2UgSENJU0VUU0NPTVRVOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJcmV0dXJuIGhjaV9kZXZfY21kKGNtZCwgYXJncCk7CisKKwljYXNlIEhDSUlOUVVJUlk6CisJCXJldHVybiBoY2lfaW5xdWlyeShhcmdwKTsKKworCWRlZmF1bHQ6CisJCWxvY2tfc29jayhzayk7CisJCWVyciA9IGhjaV9zb2NrX2JvdW5kX2lvY3RsKHNrLCBjbWQsIGFyZyk7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCXJldHVybiBlcnI7CisJfQorfQorCitzdGF0aWMgaW50IGhjaV9zb2NrX2JpbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcl9sZW4pCit7CisJc3RydWN0IHNvY2thZGRyX2hjaSAqaGFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2hjaSAqKSBhZGRyOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gTlVMTDsKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygic29jayAlcCBzayAlcCIsIHNvY2ssIHNrKTsKKworCWlmICghaGFkZHIgfHwgaGFkZHItPmhjaV9mYW1pbHkgIT0gQUZfQkxVRVRPT1RIKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxvY2tfc29jayhzayk7CisKKwlpZiAoaGNpX3BpKHNrKS0+aGRldikgeworCQllcnIgPSAtRUFMUkVBRFk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoaGFkZHItPmhjaV9kZXYgIT0gSENJX0RFVl9OT05FKSB7CisJCWlmICghKGhkZXYgPSBoY2lfZGV2X2dldChoYWRkci0+aGNpX2RldikpKSB7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBkb25lOworCQl9CisKKwkJYXRvbWljX2luYygmaGRldi0+cHJvbWlzYyk7CisJfQorCisJaGNpX3BpKHNrKS0+aGRldiA9IGhkZXY7CisJc2stPnNrX3N0YXRlID0gQlRfQk9VTkQ7CisKK2RvbmU6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGhjaV9zb2NrX2dldG5hbWUoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgKmFkZHJfbGVuLCBpbnQgcGVlcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaGNpICpoYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaGNpICopIGFkZHI7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisKKwlCVF9EQkcoInNvY2sgJXAgc2sgJXAiLCBzb2NrLCBzayk7CisKKwlsb2NrX3NvY2soc2spOworCisJKmFkZHJfbGVuID0gc2l6ZW9mKCpoYWRkcik7CisJaGFkZHItPmhjaV9mYW1pbHkgPSBBRl9CTFVFVE9PVEg7CisJaGFkZHItPmhjaV9kZXYgICAgPSBoY2lfcGkoc2spLT5oZGV2LT5pZDsKKworCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfc29ja19jbXNnKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCV9fdTMyIG1hc2sgPSBoY2lfcGkoc2spLT5jbXNnX21hc2s7CisKKwlpZiAobWFzayAmIEhDSV9DTVNHX0RJUikKKwkJcHV0X2Ntc2cobXNnLCBTT0xfSENJLCBIQ0lfQ01TR19ESVIsIHNpemVvZihpbnQpLCAmYnRfY2Ioc2tiKS0+aW5jb21pbmcpOworCisJaWYgKG1hc2sgJiBIQ0lfQ01TR19UU1RBTVApCisJCXB1dF9jbXNnKG1zZywgU09MX0hDSSwgSENJX0NNU0dfVFNUQU1QLCBzaXplb2Yoc2tiLT5zdGFtcCksICZza2ItPnN0YW1wKTsKK30KKyAKK3N0YXRpYyBpbnQgaGNpX3NvY2tfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIAorCQkJCXN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwgaW50IGZsYWdzKQoreworCWludCBub2Jsb2NrID0gZmxhZ3MgJiBNU0dfRE9OVFdBSVQ7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgY29waWVkLCBlcnI7CisKKwlCVF9EQkcoInNvY2sgJXAsIHNrICVwIiwgc29jaywgc2spOworCisJaWYgKGZsYWdzICYgKE1TR19PT0IpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoc2stPnNrX3N0YXRlID09IEJUX0NMT1NFRCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIShza2IgPSBza2JfcmVjdl9kYXRhZ3JhbShzaywgZmxhZ3MsIG5vYmxvY2ssICZlcnIpKSkKKwkJcmV0dXJuIGVycjsKKworCW1zZy0+bXNnX25hbWVsZW4gPSAwOworCisJY29waWVkID0gc2tiLT5sZW47CisJaWYgKGxlbiA8IGNvcGllZCkgeworCQltc2ctPm1zZ19mbGFncyB8PSBNU0dfVFJVTkM7CisJCWNvcGllZCA9IGxlbjsKKwl9CisKKwlza2ItPmgucmF3ID0gc2tiLT5kYXRhOworCWVyciA9IHNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgMCwgbXNnLT5tc2dfaW92LCBjb3BpZWQpOworCisJaGNpX3NvY2tfY21zZyhzaywgbXNnLCBza2IpOworCisJc2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7CisKKwlyZXR1cm4gZXJyID8gOiBjb3BpZWQ7Cit9CisKK3N0YXRpYyBpbnQgaGNpX3NvY2tfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIAorCQkJICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBlcnI7CisKKwlCVF9EQkcoInNvY2sgJXAgc2sgJXAiLCBzb2NrLCBzayk7CisKKwlpZiAobXNnLT5tc2dfZmxhZ3MgJiBNU0dfT09CKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAobXNnLT5tc2dfZmxhZ3MgJiB+KE1TR19ET05UV0FJVHxNU0dfTk9TSUdOQUx8TVNHX0VSUlFVRVVFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobGVuIDwgNCB8fCBsZW4gPiBIQ0lfTUFYX0ZSQU1FX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJbG9ja19zb2NrKHNrKTsKKworCWlmICghKGhkZXYgPSBoY2lfcGkoc2spLT5oZGV2KSkgeworCQllcnIgPSAtRUJBREZEOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKCEoc2tiID0gYnRfc2tiX3NlbmRfYWxsb2Moc2ssIGxlbiwgbXNnLT5tc2dfZmxhZ3MgJiBNU0dfRE9OVFdBSVQsICZlcnIpKSkKKwkJZ290byBkb25lOworCisJaWYgKG1lbWNweV9mcm9taW92ZWMoc2tiX3B1dChza2IsIGxlbiksIG1zZy0+bXNnX2lvdiwgbGVuKSkgeworCQllcnIgPSAtRUZBVUxUOworCQlnb3RvIGRyb3A7CisJfQorCisJc2tiLT5wa3RfdHlwZSA9ICooKHVuc2lnbmVkIGNoYXIgKikgc2tiLT5kYXRhKTsKKwlza2JfcHVsbChza2IsIDEpOworCXNrYi0+ZGV2ID0gKHZvaWQgKikgaGRldjsKKworCWlmIChza2ItPnBrdF90eXBlID09IEhDSV9DT01NQU5EX1BLVCkgeworCQl1MTYgb3Bjb2RlID0gX19sZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKCh1MTYgKilza2ItPmRhdGEpKTsKKwkJdTE2IG9nZiA9IGhjaV9vcGNvZGVfb2dmKG9wY29kZSk7CisJCXUxNiBvY2YgPSBoY2lfb3Bjb2RlX29jZihvcGNvZGUpOworCisJCWlmICgoKG9nZiA+IEhDSV9TRkxUX01BWF9PR0YpIHx8CisJCQkJIWhjaV90ZXN0X2JpdChvY2YgJiBIQ0lfRkxUX09DRl9CSVRTLCAmaGNpX3NlY19maWx0ZXIub2NmX21hc2tbb2dmXSkpICYmCisJCQkJCSFjYXBhYmxlKENBUF9ORVRfUkFXKSkgeworCQkJZXJyID0gLUVQRVJNOworCQkJZ290byBkcm9wOworCQl9CisKKwkJaWYgKHRlc3RfYml0KEhDSV9SQVcsICZoZGV2LT5mbGFncykgfHwgKG9nZiA9PSBPR0ZfVkVORE9SX0NNRCkpIHsKKwkJCXNrYl9xdWV1ZV90YWlsKCZoZGV2LT5yYXdfcSwgc2tiKTsKKwkJCWhjaV9zY2hlZF90eChoZGV2KTsKKwkJfSBlbHNlIHsKKwkJCXNrYl9xdWV1ZV90YWlsKCZoZGV2LT5jbWRfcSwgc2tiKTsKKwkJCWhjaV9zY2hlZF9jbWQoaGRldik7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9SQVcpKSB7CisJCQllcnIgPSAtRVBFUk07CisJCQlnb3RvIGRyb3A7CisJCX0KKworCQlza2JfcXVldWVfdGFpbCgmaGRldi0+cmF3X3EsIHNrYik7CisJCWhjaV9zY2hlZF90eChoZGV2KTsKKwl9CisKKwllcnIgPSBsZW47CisKK2RvbmU6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworCitkcm9wOgorCWtmcmVlX3NrYihza2IpOworCWdvdG8gZG9uZTsKK30KKworc3RhdGljIGludCBoY2lfc29ja19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBsZW4pCit7CisJc3RydWN0IGhjaV91ZmlsdGVyIHVmID0geyAub3Bjb2RlID0gMCB9OworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnIgPSAwLCBvcHQgPSAwOworCisJQlRfREJHKCJzayAlcCwgb3B0ICVkIiwgc2ssIG9wdG5hbWUpOworCisJbG9ja19zb2NrKHNrKTsKKworCXN3aXRjaCAob3B0bmFtZSkgeworCWNhc2UgSENJX0RBVEFfRElSOgorCQlpZiAoZ2V0X3VzZXIob3B0LCAoaW50IF9fdXNlciAqKW9wdHZhbCkpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChvcHQpCisJCQloY2lfcGkoc2spLT5jbXNnX21hc2sgfD0gSENJX0NNU0dfRElSOworCQllbHNlCisJCQloY2lfcGkoc2spLT5jbXNnX21hc2sgJj0gfkhDSV9DTVNHX0RJUjsKKwkJYnJlYWs7CisKKwljYXNlIEhDSV9USU1FX1NUQU1QOgorCQlpZiAoZ2V0X3VzZXIob3B0LCAoaW50IF9fdXNlciAqKW9wdHZhbCkpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChvcHQpCisJCQloY2lfcGkoc2spLT5jbXNnX21hc2sgfD0gSENJX0NNU0dfVFNUQU1QOworCQllbHNlCisJCQloY2lfcGkoc2spLT5jbXNnX21hc2sgJj0gfkhDSV9DTVNHX1RTVEFNUDsKKwkJYnJlYWs7CisKKwljYXNlIEhDSV9GSUxURVI6CisJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLCBzaXplb2YodWYpKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ1Ziwgb3B0dmFsLCBsZW4pKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9SQVcpKSB7CisJCQl1Zi50eXBlX21hc2sgJj0gaGNpX3NlY19maWx0ZXIudHlwZV9tYXNrOworCQkJdWYuZXZlbnRfbWFza1swXSAmPSAqKCh1MzIgKikgaGNpX3NlY19maWx0ZXIuZXZlbnRfbWFzayArIDApOworCQkJdWYuZXZlbnRfbWFza1sxXSAmPSAqKCh1MzIgKikgaGNpX3NlY19maWx0ZXIuZXZlbnRfbWFzayArIDEpOworCQl9CisKKwkJeworCQkJc3RydWN0IGhjaV9maWx0ZXIgKmYgPSAmaGNpX3BpKHNrKS0+ZmlsdGVyOworCisJCQlmLT50eXBlX21hc2sgPSB1Zi50eXBlX21hc2s7CisJCQlmLT5vcGNvZGUgICAgPSB1Zi5vcGNvZGU7CisJCQkqKCh1MzIgKikgZi0+ZXZlbnRfbWFzayArIDApID0gdWYuZXZlbnRfbWFza1swXTsKKwkJCSooKHUzMiAqKSBmLT5ldmVudF9tYXNrICsgMSkgPSB1Zi5ldmVudF9tYXNrWzFdOworCQl9CisJCWJyZWFrOyAKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FTk9QUk9UT09QVDsKKwkJYnJlYWs7CisJfQorCisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGhjaV9zb2NrX2dldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoreworCXN0cnVjdCBoY2lfdWZpbHRlciB1ZjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlpbnQgbGVuLCBvcHQ7IAorCisJaWYgKGdldF91c2VyKGxlbiwgb3B0bGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKG9wdG5hbWUpIHsKKwljYXNlIEhDSV9EQVRBX0RJUjoKKwkJaWYgKGhjaV9waShzayktPmNtc2dfbWFzayAmIEhDSV9DTVNHX0RJUikKKwkJCW9wdCA9IDE7CisJCWVsc2UgCisJCQlvcHQgPSAwOworCisJCWlmIChwdXRfdXNlcihvcHQsIG9wdHZhbCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisKKwljYXNlIEhDSV9USU1FX1NUQU1QOgorCQlpZiAoaGNpX3BpKHNrKS0+Y21zZ19tYXNrICYgSENJX0NNU0dfVFNUQU1QKQorCQkJb3B0ID0gMTsKKwkJZWxzZSAKKwkJCW9wdCA9IDA7CisKKwkJaWYgKHB1dF91c2VyKG9wdCwgb3B0dmFsKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgSENJX0ZJTFRFUjoKKwkJeworCQkJc3RydWN0IGhjaV9maWx0ZXIgKmYgPSAmaGNpX3BpKHNrKS0+ZmlsdGVyOworCisJCQl1Zi50eXBlX21hc2sgPSBmLT50eXBlX21hc2s7CisJCQl1Zi5vcGNvZGUgICAgPSBmLT5vcGNvZGU7CisJCQl1Zi5ldmVudF9tYXNrWzBdID0gKigodTMyICopIGYtPmV2ZW50X21hc2sgKyAwKTsKKwkJCXVmLmV2ZW50X21hc2tbMV0gPSAqKCh1MzIgKikgZi0+ZXZlbnRfbWFzayArIDEpOworCQl9CisKKwkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sIHNpemVvZih1ZikpOworCQlpZiAoY29weV90b191c2VyKG9wdHZhbCwgJnVmLCBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIGhjaV9zb2NrX29wcyA9IHsKKwkuZmFtaWx5CQk9IFBGX0JMVUVUT09USCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnJlbGVhc2UJPSBoY2lfc29ja19yZWxlYXNlLAorCS5iaW5kCQk9IGhjaV9zb2NrX2JpbmQsCisJLmdldG5hbWUJPSBoY2lfc29ja19nZXRuYW1lLAorCS5zZW5kbXNnCT0gaGNpX3NvY2tfc2VuZG1zZywKKwkucmVjdm1zZwk9IGhjaV9zb2NrX3JlY3Ztc2csCisJLmlvY3RsCQk9IGhjaV9zb2NrX2lvY3RsLAorCS5wb2xsCQk9IGRhdGFncmFtX3BvbGwsCisJLmxpc3RlbgkJPSBzb2NrX25vX2xpc3RlbiwKKwkuc2h1dGRvd24JPSBzb2NrX25vX3NodXRkb3duLAorCS5zZXRzb2Nrb3B0CT0gaGNpX3NvY2tfc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdAk9IGhjaV9zb2NrX2dldHNvY2tvcHQsCisJLmNvbm5lY3QJPSBzb2NrX25vX2Nvbm5lY3QsCisJLnNvY2tldHBhaXIJPSBzb2NrX25vX3NvY2tldHBhaXIsCisJLmFjY2VwdAkJPSBzb2NrX25vX2FjY2VwdCwKKwkubW1hcAkJPSBzb2NrX25vX21tYXAKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG8gaGNpX3NrX3Byb3RvID0geworCS5uYW1lCQk9ICJIQ0kiLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub2JqX3NpemUJPSBzaXplb2Yoc3RydWN0IGhjaV9waW5mbykKK307CisKK3N0YXRpYyBpbnQgaGNpX3NvY2tfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlCVF9EQkcoInNvY2sgJXAiLCBzb2NrKTsKKworCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfUkFXKQorCQlyZXR1cm4gLUVTT0NLVE5PU1VQUE9SVDsKKworCXNvY2stPm9wcyA9ICZoY2lfc29ja19vcHM7CisKKwlzayA9IHNrX2FsbG9jKFBGX0JMVUVUT09USCwgR0ZQX0tFUk5FTCwgJmhjaV9za19wcm90bywgMSk7CisJaWYgKCFzaykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisKKwlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKworCXNrLT5za19wcm90b2NvbCA9IHByb3RvY29sOworCisJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKKwlzay0+c2tfc3RhdGUgPSBCVF9PUEVOOworCisJYnRfc29ja19saW5rKCZoY2lfc2tfbGlzdCwgc2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhjaV9zb2NrX2Rldl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IChzdHJ1Y3QgaGNpX2RldiAqKSBwdHI7CisJc3RydWN0IGhjaV9ldl9zaV9kZXZpY2UgZXY7CisKKwlCVF9EQkcoImhkZXYgJXMgZXZlbnQgJWxkIiwgaGRldi0+bmFtZSwgZXZlbnQpOworCisJLyogU2VuZCBldmVudCB0byBzb2NrZXRzICovCisJZXYuZXZlbnQgID0gZXZlbnQ7CisJZXYuZGV2X2lkID0gaGRldi0+aWQ7CisJaGNpX3NpX2V2ZW50KE5VTEwsIEhDSV9FVl9TSV9ERVZJQ0UsIHNpemVvZihldiksICZldik7CisKKwlpZiAoZXZlbnQgPT0gSENJX0RFVl9VTlJFRykgeworCQlzdHJ1Y3Qgc29jayAqc2s7CisJCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJCS8qIERldGFjaCBzb2NrZXRzIGZyb20gZGV2aWNlICovCisJCXJlYWRfbG9jaygmaGNpX3NrX2xpc3QubG9jayk7CisJCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmaGNpX3NrX2xpc3QuaGVhZCkgeworCQkJYmhfbG9ja19zb2NrKHNrKTsKKwkJCWlmIChoY2lfcGkoc2spLT5oZGV2ID09IGhkZXYpIHsKKwkJCQloY2lfcGkoc2spLT5oZGV2ID0gTlVMTDsKKwkJCQlzay0+c2tfZXJyID0gRVBJUEU7CisJCQkJc2stPnNrX3N0YXRlID0gQlRfT1BFTjsKKwkJCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKKworCQkJCWhjaV9kZXZfcHV0KGhkZXYpOworCQkJfQorCQkJYmhfdW5sb2NrX3NvY2soc2spOworCQl9CisJCXJlYWRfdW5sb2NrKCZoY2lfc2tfbGlzdC5sb2NrKTsKKwl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSBoY2lfc29ja19mYW1pbHlfb3BzID0geworCS5mYW1pbHkJPSBQRl9CTFVFVE9PVEgsCisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmNyZWF0ZQk9IGhjaV9zb2NrX2NyZWF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaGNpX3NvY2tfbmJsb2NrID0geworCS5ub3RpZmllcl9jYWxsID0gaGNpX3NvY2tfZGV2X2V2ZW50Cit9OworCitpbnQgX19pbml0IGhjaV9zb2NrX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcHJvdG9fcmVnaXN0ZXIoJmhjaV9za19wcm90bywgMCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBidF9zb2NrX3JlZ2lzdGVyKEJUUFJPVE9fSENJLCAmaGNpX3NvY2tfZmFtaWx5X29wcyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisKKwloY2lfcmVnaXN0ZXJfbm90aWZpZXIoJmhjaV9zb2NrX25ibG9jayk7CisKKwlCVF9JTkZPKCJIQ0kgc29ja2V0IGxheWVyIGluaXRpYWxpemVkIik7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJQlRfRVJSKCJIQ0kgc29ja2V0IHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKwlwcm90b191bnJlZ2lzdGVyKCZoY2lfc2tfcHJvdG8pOworCXJldHVybiBlcnI7Cit9CisKK2ludCBfX2V4aXQgaGNpX3NvY2tfY2xlYW51cCh2b2lkKQoreworCWlmIChidF9zb2NrX3VucmVnaXN0ZXIoQlRQUk9UT19IQ0kpIDwgMCkKKwkJQlRfRVJSKCJIQ0kgc29ja2V0IHVucmVnaXN0cmF0aW9uIGZhaWxlZCIpOworCisJaGNpX3VucmVnaXN0ZXJfbm90aWZpZXIoJmhjaV9zb2NrX25ibG9jayk7CisKKwlwcm90b191bnJlZ2lzdGVyKCZoY2lfc2tfcHJvdG8pOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9zeXNmcy5jIGIvbmV0L2JsdWV0b290aC9oY2lfc3lzZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODU2YmMyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfc3lzZnMuYwpAQCAtMCwwICsxLDE1MyBAQAorLyogQmx1ZXRvb3RoIEhDSSBkcml2ZXIgbW9kZWwgc3VwcG9ydC4gKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgorCisjaWZuZGVmIENPTkZJR19CVF9IQ0lfQ09SRV9ERUJVRworI3VuZGVmICBCVF9EQkcKKyNkZWZpbmUgQlRfREJHKEQuLi4pCisjZW5kaWYKKworc3RhdGljIHNzaXplX3Qgc2hvd19uYW1lKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNsYXNzX2dldF9kZXZkYXRhKGNkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBoZGV2LT5uYW1lKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd190eXBlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNsYXNzX2dldF9kZXZkYXRhKGNkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBoZGV2LT50eXBlKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19hZGRyZXNzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNsYXNzX2dldF9kZXZkYXRhKGNkZXYpOworCWJkYWRkcl90IGJkYWRkcjsKKwliYXN3YXAoJmJkYWRkciwgJmhkZXYtPmJkYWRkcik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGJhdG9zdHIoJmJkYWRkcikpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2ZsYWdzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNsYXNzX2dldF9kZXZkYXRhKGNkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JWx4XG4iLCBoZGV2LT5mbGFncyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW5xdWlyeV9jYWNoZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBjbGFzc19nZXRfZGV2ZGF0YShjZGV2KTsKKwlzdHJ1Y3QgaW5xdWlyeV9jYWNoZSAqY2FjaGUgPSAmaGRldi0+aW5xX2NhY2hlOworCXN0cnVjdCBpbnF1aXJ5X2VudHJ5ICplOworCWludCBuID0gMDsKKworCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKKworCWZvciAoZSA9IGNhY2hlLT5saXN0OyBlOyBlID0gZS0+bmV4dCkgeworCQlzdHJ1Y3QgaW5xdWlyeV9kYXRhICpkYXRhID0gJmUtPmRhdGE7CisJCWJkYWRkcl90IGJkYWRkcjsKKwkJYmFzd2FwKCZiZGFkZHIsICZkYXRhLT5iZGFkZHIpOworCQluICs9IHNwcmludGYoYnVmICsgbiwgIiVzICVkICVkICVkIDB4JS4yeCUuMnglLjJ4IDB4JS40eCAlZCAldVxuIiwKKwkJCQliYXRvc3RyKCZiZGFkZHIpLAorCQkJCWRhdGEtPnBzY2FuX3JlcF9tb2RlLCBkYXRhLT5wc2Nhbl9wZXJpb2RfbW9kZSwgZGF0YS0+cHNjYW5fbW9kZSwKKwkJCQlkYXRhLT5kZXZfY2xhc3NbMl0sIGRhdGEtPmRldl9jbGFzc1sxXSwgZGF0YS0+ZGV2X2NsYXNzWzBdLAorCQkJCV9fbGUxNl90b19jcHUoZGF0YS0+Y2xvY2tfb2Zmc2V0KSwgZGF0YS0+cnNzaSwgZS0+dGltZXN0YW1wKTsKKwl9CisKKwloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIHNob3dfbmFtZSwgTlVMTCk7CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIodHlwZSwgU19JUlVHTywgc2hvd190eXBlLCBOVUxMKTsKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihhZGRyZXNzLCBTX0lSVUdPLCBzaG93X2FkZHJlc3MsIE5VTEwpOworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGZsYWdzLCBTX0lSVUdPLCBzaG93X2ZsYWdzLCBOVUxMKTsKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihpbnF1aXJ5X2NhY2hlLCBTX0lSVUdPLCBzaG93X2lucXVpcnlfY2FjaGUsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKmJ0X2F0dHJzW10gPSB7CisJJmNsYXNzX2RldmljZV9hdHRyX25hbWUsCisJJmNsYXNzX2RldmljZV9hdHRyX3R5cGUsCisJJmNsYXNzX2RldmljZV9hdHRyX2FkZHJlc3MsCisJJmNsYXNzX2RldmljZV9hdHRyX2ZsYWdzLAorCSZjbGFzc19kZXZpY2VfYXR0cl9pbnF1aXJ5X2NhY2hlLAorCU5VTEwKK307CisKKyNpZmRlZiBDT05GSUdfSE9UUExVRworc3RhdGljIGludCBidF9ob3RwbHVnKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBjbGFzc19nZXRfZGV2ZGF0YShjZGV2KTsKKwlpbnQgbiwgaSA9IDA7CisKKwllbnZwW2krK10gPSBidWY7CisJbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZSwgIklOVEVSRkFDRT0lcyIsIGhkZXYtPm5hbWUpICsgMTsKKwlidWYgKz0gbjsKKwlzaXplIC09IG47CisKKwlpZiAoKHNpemUgPD0gMCkgfHwgKGkgPj0gbnVtX2VudnApKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVudnBbaV0gPSBOVUxMOworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGJ0X3JlbGVhc2Uoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldikKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNsYXNzX2dldF9kZXZkYXRhKGNkZXYpOworCisJa2ZyZWUoaGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgYnRfY2xhc3MgPSB7CisJLm5hbWUJCT0gImJsdWV0b290aCIsCisJLnJlbGVhc2UJPSBidF9yZWxlYXNlLAorI2lmZGVmIENPTkZJR19IT1RQTFVHCisJLmhvdHBsdWcJPSBidF9ob3RwbHVnLAorI2VuZGlmCit9OworCitpbnQgaGNpX3JlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYgPSAmaGRldi0+Y2xhc3NfZGV2OworCXVuc2lnbmVkIGludCBpOworCWludCBlcnI7CisKKwlCVF9EQkcoIiVwIG5hbWUgJXMgdHlwZSAlZCIsIGhkZXYsIGhkZXYtPm5hbWUsIGhkZXYtPnR5cGUpOworCisJY2Rldi0+Y2xhc3MgPSAmYnRfY2xhc3M7CisJY2xhc3Nfc2V0X2RldmRhdGEoY2RldiwgaGRldik7CisKKwlzdHJsY3B5KGNkZXYtPmNsYXNzX2lkLCBoZGV2LT5uYW1lLCBCVVNfSURfU0laRSk7CisJZXJyID0gY2xhc3NfZGV2aWNlX3JlZ2lzdGVyKGNkZXYpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZm9yIChpID0gMDsgYnRfYXR0cnNbaV07IGkrKykKKwkJY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGNkZXYsIGJ0X2F0dHJzW2ldKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGhjaV91bnJlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXN0cnVjdCBjbGFzc19kZXZpY2UgKiBjZGV2ID0gJmhkZXYtPmNsYXNzX2RldjsKKworCUJUX0RCRygiJXAgbmFtZSAlcyB0eXBlICVkIiwgaGRldiwgaGRldi0+bmFtZSwgaGRldi0+dHlwZSk7CisKKwljbGFzc19kZXZpY2VfZGVsKGNkZXYpOworfQorCitpbnQgX19pbml0IGJ0X3N5c2ZzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gY2xhc3NfcmVnaXN0ZXIoJmJ0X2NsYXNzKTsKK30KKwordm9pZCBfX2V4aXQgYnRfc3lzZnNfY2xlYW51cCh2b2lkKQoreworCWNsYXNzX3VucmVnaXN0ZXIoJmJ0X2NsYXNzKTsKK30KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGlkcC9LY29uZmlnIGIvbmV0L2JsdWV0b290aC9oaWRwL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5NThmNwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9ibHVldG9vdGgvaGlkcC9LY29uZmlnCkBAIC0wLDAgKzEsMTIgQEAKK2NvbmZpZyBCVF9ISURQCisJdHJpc3RhdGUgIkhJRFAgcHJvdG9jb2wgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJUICYmIEJUX0wyQ0FQCisJc2VsZWN0IElOUFVUCisJaGVscAorCSAgSElEUCAoSHVtYW4gSW50ZXJmYWNlIERldmljZSBQcm90b2NvbCkgaXMgYSB0cmFuc3BvcnQgbGF5ZXIKKwkgIGZvciBISUQgcmVwb3J0cy4gIEhJRFAgaXMgcmVxdWlyZWQgZm9yIHRoZSBCbHVldG9vdGggSHVtYW4KKwkgIEludGVyZmFjZSBEZXZpY2UgUHJvZmlsZS4KKworCSAgU2F5IFkgaGVyZSB0byBjb21waWxlIEhJRFAgc3VwcG9ydCBpbnRvIHRoZSBrZXJuZWwgb3Igc2F5IE0gdG8KKwkgIGNvbXBpbGUgaXQgYXMgbW9kdWxlIChoaWRwKS4KKwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oaWRwL01ha2VmaWxlIGIvbmV0L2JsdWV0b290aC9oaWRwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZWUxMTUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL2hpZHAvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggQmx1ZXRvb3RoIEhJRFAgbGF5ZXIKKyMKKworb2JqLSQoQ09ORklHX0JUX0hJRFApICs9IGhpZHAubworCitoaWRwLW9ianMgOj0gY29yZS5vIHNvY2subwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYyBiL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNmOThjZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMKQEAgLTAsMCArMSw3NzIgQEAKKy8qIAorICAgSElEUCBpbXBsZW1lbnRhdGlvbiBmb3IgTGludXggQmx1ZXRvb3RoIHN0YWNrIChCbHVlWikuCisgICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBNYXJjZWwgSG9sdG1hbm4gPG1hcmNlbEBob2x0bWFubi5vcmc+CisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQgT0YgVEhJUkQgUEFSVFkgUklHSFRTLgorICAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIoUykgQU5EIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWQorICAgQ0xBSU0sIE9SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgCisgICBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gCisgICBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiAKKyAgIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyAgIEFMTCBMSUFCSUxJVFksIElOQ0xVRElORyBMSUFCSUxJVFkgRk9SIElORlJJTkdFTUVOVCBPRiBBTlkgUEFURU5UUywgCisgICBDT1BZUklHSFRTLCBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUywgUkVMQVRJTkcgVE8gVVNFIE9GIFRISVMgCisgICBTT0ZUV0FSRSBJUyBESVNDTEFJTUVELgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKworI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9sMmNhcC5oPgorCisjaW5jbHVkZSAiaGlkcC5oIgorCisjaWZuZGVmIENPTkZJR19CVF9ISURQX0RFQlVHCisjdW5kZWYgIEJUX0RCRworI2RlZmluZSBCVF9EQkcoRC4uLikKKyNlbmRpZgorCisjZGVmaW5lIFZFUlNJT04gIjEuMSIKKworc3RhdGljIERFQ0xBUkVfUldTRU0oaGlkcF9zZXNzaW9uX3NlbSk7CitzdGF0aWMgTElTVF9IRUFEKGhpZHBfc2Vzc2lvbl9saXN0KTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgaGlkcF9rZXljb2RlWzI1Nl0gPSB7CisJICAwLCAgMCwgIDAsICAwLCAzMCwgNDgsIDQ2LCAzMiwgMTgsIDMzLCAzNCwgMzUsIDIzLCAzNiwgMzcsIDM4LAorCSA1MCwgNDksIDI0LCAyNSwgMTYsIDE5LCAzMSwgMjAsIDIyLCA0NywgMTcsIDQ1LCAyMSwgNDQsICAyLCAgMywKKwkgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAyOCwgIDEsIDE0LCAxNSwgNTcsIDEyLCAxMywgMjYsCisJIDI3LCA0MywgNDMsIDM5LCA0MCwgNDEsIDUxLCA1MiwgNTMsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LAorCSA2NSwgNjYsIDY3LCA2OCwgODcsIDg4LCA5OSwgNzAsMTE5LDExMCwxMDIsMTA0LDExMSwxMDcsMTA5LDEwNiwKKwkxMDUsMTA4LDEwMywgNjksIDk4LCA1NSwgNzQsIDc4LCA5NiwgNzksIDgwLCA4MSwgNzUsIDc2LCA3NywgNzEsCisJIDcyLCA3MywgODIsIDgzLCA4NiwxMjcsMTE2LDExNywxODMsMTg0LDE4NSwxODYsMTg3LDE4OCwxODksMTkwLAorCTE5MSwxOTIsMTkzLDE5NCwxMzQsMTM4LDEzMCwxMzIsMTI4LDEyOSwxMzEsMTM3LDEzMywxMzUsMTM2LDExMywKKwkxMTUsMTE0LCAgMCwgIDAsICAwLDEyMSwgIDAsIDg5LCA5MywxMjQsIDkyLCA5NCwgOTUsICAwLCAgMCwgIDAsCisJMTIyLDEyMywgOTAsIDkxLCA4NSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorCSAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKwkgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisJICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorCSAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKwkgMjksIDQyLCA1NiwxMjUsIDk3LCA1NCwxMDAsMTI2LDE2NCwxNjYsMTY1LDE2MywxNjEsMTE1LDExNCwxMTMsCisJMTUwLDE1OCwxNTksMTI4LDEzNiwxNzcsMTc4LDE3NiwxNDIsMTUyLDE3MywxNDAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGhpZHBfbWtleXNwYXRbXSA9IHsgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSB9OworCitzdGF0aWMgc3RydWN0IGhpZHBfc2Vzc2lvbiAqX19oaWRwX2dldF9zZXNzaW9uKGJkYWRkcl90ICpiZGFkZHIpCit7CisJc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCisJQlRfREJHKCIiKTsKKworCWxpc3RfZm9yX2VhY2gocCwgJmhpZHBfc2Vzc2lvbl9saXN0KSB7CisJCXNlc3Npb24gPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoaWRwX3Nlc3Npb24sIGxpc3QpOworCQlpZiAoIWJhY21wKGJkYWRkciwgJnNlc3Npb24tPmJkYWRkcikpCisJCQlyZXR1cm4gc2Vzc2lvbjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIF9faGlkcF9saW5rX3Nlc3Npb24oc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCWxpc3RfYWRkKCZzZXNzaW9uLT5saXN0LCAmaGlkcF9zZXNzaW9uX2xpc3QpOworfQorCitzdGF0aWMgdm9pZCBfX2hpZHBfdW5saW5rX3Nlc3Npb24oc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwlsaXN0X2RlbCgmc2Vzc2lvbi0+bGlzdCk7CisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faGlkcF9jb3B5X3Nlc3Npb24oc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbiwgc3RydWN0IGhpZHBfY29ubmluZm8gKmNpKQoreworCWJhY3B5KCZjaS0+YmRhZGRyLCAmc2Vzc2lvbi0+YmRhZGRyKTsKKworCWNpLT5mbGFncyA9IHNlc3Npb24tPmZsYWdzOworCWNpLT5zdGF0ZSA9IHNlc3Npb24tPnN0YXRlOworCisJY2ktPnZlbmRvciAgPSAweDAwMDA7CisJY2ktPnByb2R1Y3QgPSAweDAwMDA7CisJY2ktPnZlcnNpb24gPSAweDAwMDA7CisJbWVtc2V0KGNpLT5uYW1lLCAwLCAxMjgpOworCisJaWYgKHNlc3Npb24tPmlucHV0KSB7CisJCWNpLT52ZW5kb3IgID0gc2Vzc2lvbi0+aW5wdXQtPmlkLnZlbmRvcjsKKwkJY2ktPnByb2R1Y3QgPSBzZXNzaW9uLT5pbnB1dC0+aWQucHJvZHVjdDsKKwkJY2ktPnZlcnNpb24gPSBzZXNzaW9uLT5pbnB1dC0+aWQudmVyc2lvbjsKKwkJaWYgKHNlc3Npb24tPmlucHV0LT5uYW1lKQorCQkJc3RybmNweShjaS0+bmFtZSwgc2Vzc2lvbi0+aW5wdXQtPm5hbWUsIDEyOCk7CisJCWVsc2UKKwkJCXN0cm5jcHkoY2ktPm5hbWUsICJISUQgQm9vdCBEZXZpY2UiLCAxMjgpOworCX0KK30KKworc3RhdGljIGludCBoaWRwX2lucHV0X2V2ZW50KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbiA9IGRldi0+cHJpdmF0ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGNoYXIgbmV3bGVkczsKKworCUJUX0RCRygiaW5wdXQgJXAgdHlwZSAlZCBjb2RlICVkIHZhbHVlICVkIiwgZGV2LCB0eXBlLCBjb2RlLCB2YWx1ZSk7CisKKwlpZiAodHlwZSAhPSBFVl9MRUQpCisJCXJldHVybiAtMTsKKworCW5ld2xlZHMgPSAoISF0ZXN0X2JpdChMRURfS0FOQSwgICAgZGV2LT5sZWQpIDw8IDMpIHwKKwkJICAoISF0ZXN0X2JpdChMRURfQ09NUE9TRSwgZGV2LT5sZWQpIDw8IDMpIHwKKwkJICAoISF0ZXN0X2JpdChMRURfU0NST0xMTCwgZGV2LT5sZWQpIDw8IDIpIHwKKwkJICAoISF0ZXN0X2JpdChMRURfQ0FQU0wsICAgZGV2LT5sZWQpIDw8IDEpIHwKKwkJICAoISF0ZXN0X2JpdChMRURfTlVNTCwgICAgZGV2LT5sZWQpKTsKKworCWlmIChzZXNzaW9uLT5sZWRzID09IG5ld2xlZHMpCisJCXJldHVybiAwOworCisJc2Vzc2lvbi0+bGVkcyA9IG5ld2xlZHM7CisKKwlpZiAoIShza2IgPSBhbGxvY19za2IoMywgR0ZQX0FUT01JQykpKSB7CisJCUJUX0VSUigiQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBuZXcgZnJhbWUiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJKnNrYl9wdXQoc2tiLCAxKSA9IEhJRFBfVFJBTlNfREFUQSB8IEhJRFBfREFUQV9SVFlQRV9PVVBVVDsKKwkqc2tiX3B1dChza2IsIDEpID0gMHgwMTsKKwkqc2tiX3B1dChza2IsIDEpID0gbmV3bGVkczsKKworCXNrYl9xdWV1ZV90YWlsKCZzZXNzaW9uLT5pbnRyX3RyYW5zbWl0LCBza2IpOworCisJaGlkcF9zY2hlZHVsZShzZXNzaW9uKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoaWRwX2lucHV0X3JlcG9ydChzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHNlc3Npb24tPmlucHV0OworCXVuc2lnbmVkIGNoYXIgKmtleXMgPSBzZXNzaW9uLT5rZXlzOworCXVuc2lnbmVkIGNoYXIgKnVkYXRhID0gc2tiLT5kYXRhICsgMTsKKwlzaWduZWQgY2hhciAqc2RhdGEgPSBza2ItPmRhdGEgKyAxOworCWludCBpLCBzaXplID0gc2tiLT5sZW4gLSAxOworCisJc3dpdGNoIChza2ItPmRhdGFbMF0pIHsKKwljYXNlIDB4MDE6CS8qIEtleWJvYXJkIHJlcG9ydCAqLworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIGhpZHBfa2V5Y29kZVtpICsgMjI0XSwgKHVkYXRhWzBdID4+IGkpICYgMSk7CisKKwkJLyogSWYgYWxsIHRoZSBrZXkgY29kZXMgaGF2ZSBiZWVuIHNldCB0byAweDAxLCBpdCBtZWFucworCQkgKiB0b28gbWFueSBrZXlzIHdlcmUgcHJlc3NlZCBhdCB0aGUgc2FtZSB0aW1lLiAqLworCQlpZiAoIW1lbWNtcCh1ZGF0YSArIDIsIGhpZHBfbWtleXNwYXQsIDYpKQorCQkJYnJlYWs7CisKKwkJZm9yIChpID0gMjsgaSA8IDg7IGkrKykgeworCQkJaWYgKGtleXNbaV0gPiAzICYmIG1lbXNjYW4odWRhdGEgKyAyLCBrZXlzW2ldLCA2KSA9PSB1ZGF0YSArIDgpIHsKKwkJCQlpZiAoaGlkcF9rZXljb2RlW2tleXNbaV1dKQorCQkJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgaGlkcF9rZXljb2RlW2tleXNbaV1dLCAwKTsKKwkJCQllbHNlCisJCQkJCUJUX0VSUigiVW5rbm93biBrZXkgKHNjYW5jb2RlICUjeCkgcmVsZWFzZWQuIiwga2V5c1tpXSk7CisJCQl9CisKKwkJCWlmICh1ZGF0YVtpXSA+IDMgJiYgbWVtc2NhbihrZXlzICsgMiwgdWRhdGFbaV0sIDYpID09IGtleXMgKyA4KSB7CisJCQkJaWYgKGhpZHBfa2V5Y29kZVt1ZGF0YVtpXV0pCisJCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBoaWRwX2tleWNvZGVbdWRhdGFbaV1dLCAxKTsKKwkJCQllbHNlCisJCQkJCUJUX0VSUigiVW5rbm93biBrZXkgKHNjYW5jb2RlICUjeCkgcHJlc3NlZC4iLCB1ZGF0YVtpXSk7CisJCQl9CisJCX0KKworCQltZW1jcHkoa2V5cywgdWRhdGEsIDgpOworCQlicmVhazsKKworCWNhc2UgMHgwMjoJLyogTW91c2UgcmVwb3J0ICovCisJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgICBzZGF0YVswXSAmIDB4MDEpOworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1JJR0hULCAgc2RhdGFbMF0gJiAweDAyKTsKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9NSURETEUsIHNkYXRhWzBdICYgMHgwNCk7CisJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fU0lERSwgICBzZGF0YVswXSAmIDB4MDgpOworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0VYVFJBLCAgc2RhdGFbMF0gJiAweDEwKTsKKworCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1gsIHNkYXRhWzFdKTsKKwkJaW5wdXRfcmVwb3J0X3JlbChkZXYsIFJFTF9ZLCBzZGF0YVsyXSk7CisKKwkJaWYgKHNpemUgPiAzKQorCQkJaW5wdXRfcmVwb3J0X3JlbChkZXYsIFJFTF9XSEVFTCwgc2RhdGFbM10pOworCQlicmVhazsKKwl9CisKKwlpbnB1dF9zeW5jKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGhpZHBfaWRsZV90aW1lb3V0KHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24gPSAoc3RydWN0IGhpZHBfc2Vzc2lvbiAqKSBhcmc7CisKKwlhdG9taWNfaW5jKCZzZXNzaW9uLT50ZXJtaW5hdGUpOworCWhpZHBfc2NoZWR1bGUoc2Vzc2lvbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWRwX3NldF90aW1lcihzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uKQoreworCWlmIChzZXNzaW9uLT5pZGxlX3RvID4gMCkKKwkJbW9kX3RpbWVyKCZzZXNzaW9uLT50aW1lciwgamlmZmllcyArIEhaICogc2Vzc2lvbi0+aWRsZV90byk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWRwX2RlbF90aW1lcihzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uKQoreworCWlmIChzZXNzaW9uLT5pZGxlX3RvID4gMCkKKwkJZGVsX3RpbWVyKCZzZXNzaW9uLT50aW1lcik7Cit9CisKK3N0YXRpYyBpbnQgX19oaWRwX3NlbmRfY3RybF9tZXNzYWdlKHN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24sCisJCQl1bnNpZ25lZCBjaGFyIGhkciwgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IHNpemUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCUJUX0RCRygic2Vzc2lvbiAlcCBkYXRhICVwIHNpemUgJWQiLCBzZXNzaW9uLCBkYXRhLCBzaXplKTsKKworCWlmICghKHNrYiA9IGFsbG9jX3NrYihzaXplICsgMSwgR0ZQX0FUT01JQykpKSB7CisJCUJUX0VSUigiQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBuZXcgZnJhbWUiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJKnNrYl9wdXQoc2tiLCAxKSA9IGhkcjsKKwlpZiAoZGF0YSAmJiBzaXplID4gMCkKKwkJbWVtY3B5KHNrYl9wdXQoc2tiLCBzaXplKSwgZGF0YSwgc2l6ZSk7CisKKwlza2JfcXVldWVfdGFpbCgmc2Vzc2lvbi0+Y3RybF90cmFuc21pdCwgc2tiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlubGluZSBoaWRwX3NlbmRfY3RybF9tZXNzYWdlKHN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24sCisJCQl1bnNpZ25lZCBjaGFyIGhkciwgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IHNpemUpCit7CisJaW50IGVycjsKKworCWVyciA9IF9faGlkcF9zZW5kX2N0cmxfbWVzc2FnZShzZXNzaW9uLCBoZHIsIGRhdGEsIHNpemUpOworCisJaGlkcF9zY2hlZHVsZShzZXNzaW9uKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWRwX3Byb2Nlc3NfaGFuZHNoYWtlKHN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24sIHVuc2lnbmVkIGNoYXIgcGFyYW0pCit7CisJQlRfREJHKCJzZXNzaW9uICVwIHBhcmFtIDB4JTAyeCIsIHNlc3Npb24sIHBhcmFtKTsKKworCXN3aXRjaCAocGFyYW0pIHsKKwljYXNlIEhJRFBfSFNIS19TVUNDRVNTRlVMOgorCQkvKiBGSVhNRTogQ2FsbCBpbnRvIFNFVF8gR0VUXyBoYW5kbGVycyBoZXJlICovCisJCWJyZWFrOworCisJY2FzZSBISURQX0hTSEtfTk9UX1JFQURZOgorCWNhc2UgSElEUF9IU0hLX0VSUl9JTlZBTElEX1JFUE9SVF9JRDoKKwljYXNlIEhJRFBfSFNIS19FUlJfVU5TVVBQT1JURURfUkVRVUVTVDoKKwljYXNlIEhJRFBfSFNIS19FUlJfSU5WQUxJRF9QQVJBTUVURVI6CisJCS8qIEZJWE1FOiBDYWxsIGludG8gU0VUXyBHRVRfIGhhbmRsZXJzIGhlcmUgKi8KKwkJYnJlYWs7CisKKwljYXNlIEhJRFBfSFNIS19FUlJfVU5LTk9XTjoKKwkJYnJlYWs7CisKKwljYXNlIEhJRFBfSFNIS19FUlJfRkFUQUw6CisJCS8qIERldmljZSByZXF1ZXN0cyBhIHJlYm9vdCwgYXMgdGhpcyBpcyB0aGUgb25seSB3YXkgdGhpcyBlcnJvcgorIAkJICogY2FuIGJlIHJlY292ZXJlZC4gKi8KKwkJX19oaWRwX3NlbmRfY3RybF9tZXNzYWdlKHNlc3Npb24sCisJCQlISURQX1RSQU5TX0hJRF9DT05UUk9MIHwgSElEUF9DVFJMX1NPRlRfUkVTRVQsIE5VTEwsIDApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCV9faGlkcF9zZW5kX2N0cmxfbWVzc2FnZShzZXNzaW9uLAorCQkJSElEUF9UUkFOU19IQU5EU0hBS0UgfCBISURQX0hTSEtfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCBOVUxMLCAwKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGlkcF9wcm9jZXNzX2hpZF9jb250cm9sKHN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24sIHVuc2lnbmVkIGNoYXIgcGFyYW0pCit7CisJQlRfREJHKCJzZXNzaW9uICVwIHBhcmFtIDB4JTAyeCIsIHNlc3Npb24sIHBhcmFtKTsKKworCXN3aXRjaCAocGFyYW0pIHsKKwljYXNlIEhJRFBfQ1RSTF9OT1A6CisJCWJyZWFrOworCisJY2FzZSBISURQX0NUUkxfVklSVFVBTF9DQUJMRV9VTlBMVUc6CisJCS8qIEZsdXNoIHRoZSB0cmFuc21pdCBxdWV1ZXMgKi8KKwkJc2tiX3F1ZXVlX3B1cmdlKCZzZXNzaW9uLT5jdHJsX3RyYW5zbWl0KTsKKwkJc2tiX3F1ZXVlX3B1cmdlKCZzZXNzaW9uLT5pbnRyX3RyYW5zbWl0KTsKKworCQkvKiBLaWxsIHNlc3Npb24gdGhyZWFkICovCisJCWF0b21pY19pbmMoJnNlc3Npb24tPnRlcm1pbmF0ZSk7CisJCWJyZWFrOworCisJY2FzZSBISURQX0NUUkxfSEFSRF9SRVNFVDoKKwljYXNlIEhJRFBfQ1RSTF9TT0ZUX1JFU0VUOgorCWNhc2UgSElEUF9DVFJMX1NVU1BFTkQ6CisJY2FzZSBISURQX0NUUkxfRVhJVF9TVVNQRU5EOgorCQkvKiBGSVhNRTogV2UgaGF2ZSB0byBwYXJzZSB0aGVzZSBhbmQgcmV0dXJuIG5vIGVycm9yICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJX19oaWRwX3NlbmRfY3RybF9tZXNzYWdlKHNlc3Npb24sCisJCQlISURQX1RSQU5TX0hBTkRTSEFLRSB8IEhJRFBfSFNIS19FUlJfSU5WQUxJRF9QQVJBTUVURVIsIE5VTEwsIDApOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWRwX3Byb2Nlc3NfZGF0YShzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBjaGFyIHBhcmFtKQoreworCUJUX0RCRygic2Vzc2lvbiAlcCBza2IgJXAgbGVuICVkIHBhcmFtIDB4JTAyeCIsIHNlc3Npb24sIHNrYiwgc2tiLT5sZW4sIHBhcmFtKTsKKworCXN3aXRjaCAocGFyYW0pIHsKKwljYXNlIEhJRFBfREFUQV9SVFlQRV9JTlBVVDoKKwkJaGlkcF9zZXRfdGltZXIoc2Vzc2lvbik7CisKKwkJaWYgKHNlc3Npb24tPmlucHV0KQorCQkJaGlkcF9pbnB1dF9yZXBvcnQoc2Vzc2lvbiwgc2tiKTsKKwkJYnJlYWs7CisKKwljYXNlIEhJRFBfREFUQV9SVFlQRV9PVEhFUjoKKwljYXNlIEhJRFBfREFUQV9SVFlQRV9PVVBVVDoKKwljYXNlIEhJRFBfREFUQV9SVFlQRV9GRUFUVVJFOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCV9faGlkcF9zZW5kX2N0cmxfbWVzc2FnZShzZXNzaW9uLAorCQkJSElEUF9UUkFOU19IQU5EU0hBS0UgfCBISURQX0hTSEtfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCBOVUxMLCAwKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWRwX3JlY3ZfY3RybF9mcmFtZShzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXVuc2lnbmVkIGNoYXIgaGRyLCB0eXBlLCBwYXJhbTsKKworCUJUX0RCRygic2Vzc2lvbiAlcCBza2IgJXAgbGVuICVkIiwgc2Vzc2lvbiwgc2tiLCBza2ItPmxlbik7CisKKwloZHIgPSBza2ItPmRhdGFbMF07CisJc2tiX3B1bGwoc2tiLCAxKTsKKworCXR5cGUgPSBoZHIgJiBISURQX0hFQURFUl9UUkFOU19NQVNLOworCXBhcmFtID0gaGRyICYgSElEUF9IRUFERVJfUEFSQU1fTUFTSzsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSElEUF9UUkFOU19IQU5EU0hBS0U6CisJCWhpZHBfcHJvY2Vzc19oYW5kc2hha2Uoc2Vzc2lvbiwgcGFyYW0pOworCQlicmVhazsKKworCWNhc2UgSElEUF9UUkFOU19ISURfQ09OVFJPTDoKKwkJaGlkcF9wcm9jZXNzX2hpZF9jb250cm9sKHNlc3Npb24sIHBhcmFtKTsKKwkJYnJlYWs7CisKKwljYXNlIEhJRFBfVFJBTlNfREFUQToKKwkJaGlkcF9wcm9jZXNzX2RhdGEoc2Vzc2lvbiwgc2tiLCBwYXJhbSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJX19oaWRwX3NlbmRfY3RybF9tZXNzYWdlKHNlc3Npb24sCisJCQlISURQX1RSQU5TX0hBTkRTSEFLRSB8IEhJRFBfSFNIS19FUlJfVU5TVVBQT1JURURfUkVRVUVTVCwgTlVMTCwgMCk7CisJCWJyZWFrOworCX0KKworCWtmcmVlX3NrYihza2IpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGlkcF9yZWN2X2ludHJfZnJhbWUoc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1bnNpZ25lZCBjaGFyIGhkcjsKKworCUJUX0RCRygic2Vzc2lvbiAlcCBza2IgJXAgbGVuICVkIiwgc2Vzc2lvbiwgc2tiLCBza2ItPmxlbik7CisKKwloZHIgPSBza2ItPmRhdGFbMF07CisJc2tiX3B1bGwoc2tiLCAxKTsKKworCWlmIChoZHIgPT0gKEhJRFBfVFJBTlNfREFUQSB8IEhJRFBfREFUQV9SVFlQRV9JTlBVVCkpIHsKKwkJaGlkcF9zZXRfdGltZXIoc2Vzc2lvbik7CisJCWlmIChzZXNzaW9uLT5pbnB1dCkKKwkJCWhpZHBfaW5wdXRfcmVwb3J0KHNlc3Npb24sIHNrYik7CisJfSBlbHNlIHsKKwkJQlRfREJHKCJVbnN1cHBvcnRlZCBwcm90b2NvbCBoZWFkZXIgMHglMDJ4IiwgaGRyKTsKKwl9CisKKwlrZnJlZV9za2Ioc2tiKTsKK30KKworc3RhdGljIGludCBoaWRwX3NlbmRfZnJhbWUoc3RydWN0IHNvY2tldCAqc29jaywgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qga3ZlYyBpdiA9IHsgZGF0YSwgbGVuIH07CisJc3RydWN0IG1zZ2hkciBtc2c7CisKKwlCVF9EQkcoInNvY2sgJXAgZGF0YSAlcCBsZW4gJWQiLCBzb2NrLCBkYXRhLCBsZW4pOworCisJaWYgKCFsZW4pCisJCXJldHVybiAwOworCisJbWVtc2V0KCZtc2csIDAsIHNpemVvZihtc2cpKTsKKworCXJldHVybiBrZXJuZWxfc2VuZG1zZyhzb2NrLCAmbXNnLCAmaXYsIDEsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgaGlkcF9wcm9jZXNzX3RyYW5zbWl0KHN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCUJUX0RCRygic2Vzc2lvbiAlcCIsIHNlc3Npb24pOworCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2Vzc2lvbi0+Y3RybF90cmFuc21pdCkpKSB7CisJCWlmIChoaWRwX3NlbmRfZnJhbWUoc2Vzc2lvbi0+Y3RybF9zb2NrLCBza2ItPmRhdGEsIHNrYi0+bGVuKSA8IDApIHsKKwkJCXNrYl9xdWV1ZV9oZWFkKCZzZXNzaW9uLT5jdHJsX3RyYW5zbWl0LCBza2IpOworCQkJYnJlYWs7CisJCX0KKworCQloaWRwX3NldF90aW1lcihzZXNzaW9uKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJfQorCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2Vzc2lvbi0+aW50cl90cmFuc21pdCkpKSB7CisJCWlmIChoaWRwX3NlbmRfZnJhbWUoc2Vzc2lvbi0+aW50cl9zb2NrLCBza2ItPmRhdGEsIHNrYi0+bGVuKSA8IDApIHsKKwkJCXNrYl9xdWV1ZV9oZWFkKCZzZXNzaW9uLT5pbnRyX3RyYW5zbWl0LCBza2IpOworCQkJYnJlYWs7CisJCX0KKworCQloaWRwX3NldF90aW1lcihzZXNzaW9uKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJfQorCisJcmV0dXJuIHNrYl9xdWV1ZV9sZW4oJnNlc3Npb24tPmN0cmxfdHJhbnNtaXQpICsKKwkJCQlza2JfcXVldWVfbGVuKCZzZXNzaW9uLT5pbnRyX3RyYW5zbWl0KTsKK30KKworc3RhdGljIGludCBoaWRwX3Nlc3Npb24odm9pZCAqYXJnKQoreworCXN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24gPSBhcmc7CisJc3RydWN0IHNvY2sgKmN0cmxfc2sgPSBzZXNzaW9uLT5jdHJsX3NvY2stPnNrOworCXN0cnVjdCBzb2NrICppbnRyX3NrID0gc2Vzc2lvbi0+aW50cl9zb2NrLT5zazsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCB2ZW5kb3IgPSAweDAwMDAsIHByb2R1Y3QgPSAweDAwMDA7CisJd2FpdF9xdWV1ZV90IGN0cmxfd2FpdCwgaW50cl93YWl0OworCisJQlRfREJHKCJzZXNzaW9uICVwIiwgc2Vzc2lvbik7CisKKwlpZiAoc2Vzc2lvbi0+aW5wdXQpIHsKKwkJdmVuZG9yICA9IHNlc3Npb24tPmlucHV0LT5pZC52ZW5kb3I7CisJCXByb2R1Y3QgPSBzZXNzaW9uLT5pbnB1dC0+aWQucHJvZHVjdDsKKwl9CisKKwlkYWVtb25pemUoImtoaWRwZF8lMDR4JTA0eCIsIHZlbmRvciwgcHJvZHVjdCk7CisJc2V0X3VzZXJfbmljZShjdXJyZW50LCAtMTUpOworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOworCisJaW5pdF93YWl0cXVldWVfZW50cnkoJmN0cmxfd2FpdCwgY3VycmVudCk7CisJaW5pdF93YWl0cXVldWVfZW50cnkoJmludHJfd2FpdCwgY3VycmVudCk7CisJYWRkX3dhaXRfcXVldWUoY3RybF9zay0+c2tfc2xlZXAsICZjdHJsX3dhaXQpOworCWFkZF93YWl0X3F1ZXVlKGludHJfc2stPnNrX3NsZWVwLCAmaW50cl93YWl0KTsKKwl3aGlsZSAoIWF0b21pY19yZWFkKCZzZXNzaW9uLT50ZXJtaW5hdGUpKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJaWYgKGN0cmxfc2stPnNrX3N0YXRlICE9IEJUX0NPTk5FQ1RFRCB8fCBpbnRyX3NrLT5za19zdGF0ZSAhPSBCVF9DT05ORUNURUQpCisJCQlicmVhazsKKworCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZjdHJsX3NrLT5za19yZWNlaXZlX3F1ZXVlKSkpIHsKKwkJCXNrYl9vcnBoYW4oc2tiKTsKKwkJCWhpZHBfcmVjdl9jdHJsX2ZyYW1lKHNlc3Npb24sIHNrYik7CisJCX0KKworCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZpbnRyX3NrLT5za19yZWNlaXZlX3F1ZXVlKSkpIHsKKwkJCXNrYl9vcnBoYW4oc2tiKTsKKwkJCWhpZHBfcmVjdl9pbnRyX2ZyYW1lKHNlc3Npb24sIHNrYik7CisJCX0KKworCQloaWRwX3Byb2Nlc3NfdHJhbnNtaXQoc2Vzc2lvbik7CisKKwkJc2NoZWR1bGUoKTsKKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZShpbnRyX3NrLT5za19zbGVlcCwgJmludHJfd2FpdCk7CisJcmVtb3ZlX3dhaXRfcXVldWUoY3RybF9zay0+c2tfc2xlZXAsICZjdHJsX3dhaXQpOworCisJZG93bl93cml0ZSgmaGlkcF9zZXNzaW9uX3NlbSk7CisKKwloaWRwX2RlbF90aW1lcihzZXNzaW9uKTsKKworCWlmIChpbnRyX3NrLT5za19zdGF0ZSAhPSBCVF9DT05ORUNURUQpCisJCXdhaXRfZXZlbnRfdGltZW91dCgqKGN0cmxfc2stPnNrX3NsZWVwKSwgKGN0cmxfc2stPnNrX3N0YXRlID09IEJUX0NMT1NFRCksIEhaKTsKKworCWZwdXQoc2Vzc2lvbi0+Y3RybF9zb2NrLT5maWxlKTsKKworCXdhaXRfZXZlbnRfdGltZW91dCgqKGludHJfc2stPnNrX3NsZWVwKSwgKGludHJfc2stPnNrX3N0YXRlID09IEJUX0NMT1NFRCksIEhaKTsKKworCWZwdXQoc2Vzc2lvbi0+aW50cl9zb2NrLT5maWxlKTsKKworCV9faGlkcF91bmxpbmtfc2Vzc2lvbihzZXNzaW9uKTsKKworCWlmIChzZXNzaW9uLT5pbnB1dCkgeworCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShzZXNzaW9uLT5pbnB1dCk7CisJCWtmcmVlKHNlc3Npb24tPmlucHV0KTsKKwl9CisKKwl1cF93cml0ZSgmaGlkcF9zZXNzaW9uX3NlbSk7CisKKwlrZnJlZShzZXNzaW9uKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhpZHBfc2V0dXBfaW5wdXQoc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbiwgc3RydWN0IGhpZHBfY29ubmFkZF9yZXEgKnJlcSkKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCA9IHNlc3Npb24tPmlucHV0OworCWludCBpOworCisJaW5wdXQtPnByaXZhdGUgPSBzZXNzaW9uOworCisJaW5wdXQtPmlkLmJ1c3R5cGUgPSBCVVNfQkxVRVRPT1RIOworCWlucHV0LT5pZC52ZW5kb3IgID0gcmVxLT52ZW5kb3I7CisJaW5wdXQtPmlkLnByb2R1Y3QgPSByZXEtPnByb2R1Y3Q7CisJaW5wdXQtPmlkLnZlcnNpb24gPSByZXEtPnZlcnNpb247CisKKwlpZiAocmVxLT5zdWJjbGFzcyAmIDB4NDApIHsKKwkJc2V0X2JpdChFVl9LRVksIGlucHV0LT5ldmJpdCk7CisJCXNldF9iaXQoRVZfTEVELCBpbnB1dC0+ZXZiaXQpOworCQlzZXRfYml0KEVWX1JFUCwgaW5wdXQtPmV2Yml0KTsKKworCQlzZXRfYml0KExFRF9OVU1MLCAgICBpbnB1dC0+bGVkYml0KTsKKwkJc2V0X2JpdChMRURfQ0FQU0wsICAgaW5wdXQtPmxlZGJpdCk7CisJCXNldF9iaXQoTEVEX1NDUk9MTEwsIGlucHV0LT5sZWRiaXQpOworCQlzZXRfYml0KExFRF9DT01QT1NFLCBpbnB1dC0+bGVkYml0KTsKKwkJc2V0X2JpdChMRURfS0FOQSwgICAgaW5wdXQtPmxlZGJpdCk7CisKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihoaWRwX2tleWNvZGUpOyBpKyspCisJCQlzZXRfYml0KGhpZHBfa2V5Y29kZVtpXSwgaW5wdXQtPmtleWJpdCk7CisJCWNsZWFyX2JpdCgwLCBpbnB1dC0+a2V5Yml0KTsKKwl9CisKKwlpZiAocmVxLT5zdWJjbGFzcyAmIDB4ODApIHsKKwkJaW5wdXQtPmV2Yml0WzBdID0gQklUKEVWX0tFWSkgfCBCSVQoRVZfUkVMKTsKKwkJaW5wdXQtPmtleWJpdFtMT05HKEJUTl9NT1VTRSldID0gQklUKEJUTl9MRUZUKSB8IEJJVChCVE5fUklHSFQpIHwgQklUKEJUTl9NSURETEUpOworCQlpbnB1dC0+cmVsYml0WzBdID0gQklUKFJFTF9YKSB8IEJJVChSRUxfWSk7CisJCWlucHV0LT5rZXliaXRbTE9ORyhCVE5fTU9VU0UpXSB8PSBCSVQoQlROX1NJREUpIHwgQklUKEJUTl9FWFRSQSk7CisJCWlucHV0LT5yZWxiaXRbMF0gfD0gQklUKFJFTF9XSEVFTCk7CisJfQorCisJaW5wdXQtPmV2ZW50ID0gaGlkcF9pbnB1dF9ldmVudDsKKworCWlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dCk7Cit9CisKK2ludCBoaWRwX2FkZF9jb25uZWN0aW9uKHN0cnVjdCBoaWRwX2Nvbm5hZGRfcmVxICpyZXEsIHN0cnVjdCBzb2NrZXQgKmN0cmxfc29jaywgc3RydWN0IHNvY2tldCAqaW50cl9zb2NrKQoreworCXN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24sICpzOworCWludCBlcnI7CisKKwlCVF9EQkcoIiIpOworCisJaWYgKGJhY21wKCZidF9zayhjdHJsX3NvY2stPnNrKS0+c3JjLCAmYnRfc2soaW50cl9zb2NrLT5zayktPnNyYykgfHwKKwkJCWJhY21wKCZidF9zayhjdHJsX3NvY2stPnNrKS0+ZHN0LCAmYnRfc2soaW50cl9zb2NrLT5zayktPmRzdCkpCisJCXJldHVybiAtRU5PVFVOSVE7CisKKwlzZXNzaW9uID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhpZHBfc2Vzc2lvbiksIEdGUF9LRVJORUwpOworCWlmICghc2Vzc2lvbikgCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChzZXNzaW9uLCAwLCBzaXplb2Yoc3RydWN0IGhpZHBfc2Vzc2lvbikpOworCisJc2Vzc2lvbi0+aW5wdXQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW5wdXRfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZXNzaW9uLT5pbnB1dCkgeworCQlrZnJlZShzZXNzaW9uKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChzZXNzaW9uLT5pbnB1dCwgMCwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9kZXYpKTsKKworCWRvd25fd3JpdGUoJmhpZHBfc2Vzc2lvbl9zZW0pOworCisJcyA9IF9faGlkcF9nZXRfc2Vzc2lvbigmYnRfc2soY3RybF9zb2NrLT5zayktPmRzdCk7CisJaWYgKHMgJiYgcy0+c3RhdGUgPT0gQlRfQ09OTkVDVEVEKSB7CisJCWVyciA9IC1FRVhJU1Q7CisJCWdvdG8gZmFpbGVkOworCX0KKworCWJhY3B5KCZzZXNzaW9uLT5iZGFkZHIsICZidF9zayhjdHJsX3NvY2stPnNrKS0+ZHN0KTsKKworCXNlc3Npb24tPmN0cmxfbXR1ID0gbWluX3QodWludCwgbDJjYXBfcGkoY3RybF9zb2NrLT5zayktPm9tdHUsIGwyY2FwX3BpKGN0cmxfc29jay0+c2spLT5pbXR1KTsKKwlzZXNzaW9uLT5pbnRyX210dSA9IG1pbl90KHVpbnQsIGwyY2FwX3BpKGludHJfc29jay0+c2spLT5vbXR1LCBsMmNhcF9waShpbnRyX3NvY2stPnNrKS0+aW10dSk7CisKKwlCVF9EQkcoImN0cmwgbXR1ICVkIGludHIgbXR1ICVkIiwgc2Vzc2lvbi0+Y3RybF9tdHUsIHNlc3Npb24tPmludHJfbXR1KTsKKworCXNlc3Npb24tPmN0cmxfc29jayA9IGN0cmxfc29jazsKKwlzZXNzaW9uLT5pbnRyX3NvY2sgPSBpbnRyX3NvY2s7CisJc2Vzc2lvbi0+c3RhdGUgICAgID0gQlRfQ09OTkVDVEVEOworCisJaW5pdF90aW1lcigmc2Vzc2lvbi0+dGltZXIpOworCisJc2Vzc2lvbi0+dGltZXIuZnVuY3Rpb24gPSBoaWRwX2lkbGVfdGltZW91dDsKKwlzZXNzaW9uLT50aW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKSBzZXNzaW9uOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2Vzc2lvbi0+Y3RybF90cmFuc21pdCk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2Vzc2lvbi0+aW50cl90cmFuc21pdCk7CisKKwlzZXNzaW9uLT5mbGFncyAgID0gcmVxLT5mbGFncyAmICgxIDw8IEhJRFBfQkxVRVRPT1RIX1ZFTkRPUl9JRCk7CisJc2Vzc2lvbi0+aWRsZV90byA9IHJlcS0+aWRsZV90bzsKKworCWlmIChzZXNzaW9uLT5pbnB1dCkKKwkJaGlkcF9zZXR1cF9pbnB1dChzZXNzaW9uLCByZXEpOworCisJX19oaWRwX2xpbmtfc2Vzc2lvbihzZXNzaW9uKTsKKworCWhpZHBfc2V0X3RpbWVyKHNlc3Npb24pOworCisJZXJyID0ga2VybmVsX3RocmVhZChoaWRwX3Nlc3Npb24sIHNlc3Npb24sIENMT05FX0tFUk5FTCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gdW5saW5rOworCisJaWYgKHNlc3Npb24tPmlucHV0KSB7CisJCWhpZHBfc2VuZF9jdHJsX21lc3NhZ2Uoc2Vzc2lvbiwKKwkJCUhJRFBfVFJBTlNfU0VUX1BST1RPQ09MIHwgSElEUF9QUk9UT19CT09ULCBOVUxMLCAwKTsKKwkJc2Vzc2lvbi0+ZmxhZ3MgfD0gKDEgPDwgSElEUF9CT09UX1BST1RPQ09MX01PREUpOworCisJCXNlc3Npb24tPmxlZHMgPSAweGZmOworCQloaWRwX2lucHV0X2V2ZW50KHNlc3Npb24tPmlucHV0LCBFVl9MRUQsIDAsIDApOworCX0KKworCXVwX3dyaXRlKCZoaWRwX3Nlc3Npb25fc2VtKTsKKwlyZXR1cm4gMDsKKwordW5saW5rOgorCWhpZHBfZGVsX3RpbWVyKHNlc3Npb24pOworCisJX19oaWRwX3VubGlua19zZXNzaW9uKHNlc3Npb24pOworCisJaWYgKHNlc3Npb24tPmlucHV0KQorCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShzZXNzaW9uLT5pbnB1dCk7CisKK2ZhaWxlZDoKKwl1cF93cml0ZSgmaGlkcF9zZXNzaW9uX3NlbSk7CisKKwlpZiAoc2Vzc2lvbi0+aW5wdXQpCisJCWtmcmVlKHNlc3Npb24tPmlucHV0KTsKKworCWtmcmVlKHNlc3Npb24pOworCXJldHVybiBlcnI7Cit9CisKK2ludCBoaWRwX2RlbF9jb25uZWN0aW9uKHN0cnVjdCBoaWRwX2Nvbm5kZWxfcmVxICpyZXEpCit7CisJc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbjsKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygiIik7CisKKwlkb3duX3JlYWQoJmhpZHBfc2Vzc2lvbl9zZW0pOworCisJc2Vzc2lvbiA9IF9faGlkcF9nZXRfc2Vzc2lvbigmcmVxLT5iZGFkZHIpOworCWlmIChzZXNzaW9uKSB7CisJCWlmIChyZXEtPmZsYWdzICYgKDEgPDwgSElEUF9WSVJUVUFMX0NBQkxFX1VOUExVRykpIHsKKwkJCWhpZHBfc2VuZF9jdHJsX21lc3NhZ2Uoc2Vzc2lvbiwKKwkJCQlISURQX1RSQU5TX0hJRF9DT05UUk9MIHwgSElEUF9DVFJMX1ZJUlRVQUxfQ0FCTEVfVU5QTFVHLCBOVUxMLCAwKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEZsdXNoIHRoZSB0cmFuc21pdCBxdWV1ZXMgKi8KKwkJCXNrYl9xdWV1ZV9wdXJnZSgmc2Vzc2lvbi0+Y3RybF90cmFuc21pdCk7CisJCQlza2JfcXVldWVfcHVyZ2UoJnNlc3Npb24tPmludHJfdHJhbnNtaXQpOworCisJCQkvKiBLaWxsIHNlc3Npb24gdGhyZWFkICovCisJCQlhdG9taWNfaW5jKCZzZXNzaW9uLT50ZXJtaW5hdGUpOworCQkJaGlkcF9zY2hlZHVsZShzZXNzaW9uKTsKKwkJfQorCX0gZWxzZQorCQllcnIgPSAtRU5PRU5UOworCisJdXBfcmVhZCgmaGlkcF9zZXNzaW9uX3NlbSk7CisJcmV0dXJuIGVycjsKK30KKworaW50IGhpZHBfZ2V0X2Nvbm5saXN0KHN0cnVjdCBoaWRwX2Nvbm5saXN0X3JlcSAqcmVxKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJaW50IGVyciA9IDAsIG4gPSAwOworCisJQlRfREJHKCIiKTsKKworCWRvd25fcmVhZCgmaGlkcF9zZXNzaW9uX3NlbSk7CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZoaWRwX3Nlc3Npb25fbGlzdCkgeworCQlzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uOworCQlzdHJ1Y3QgaGlkcF9jb25uaW5mbyBjaTsKKworCQlzZXNzaW9uID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGlkcF9zZXNzaW9uLCBsaXN0KTsKKworCQlfX2hpZHBfY29weV9zZXNzaW9uKHNlc3Npb24sICZjaSk7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihyZXEtPmNpLCAmY2ksIHNpemVvZihjaSkpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKytuID49IHJlcS0+Y251bSkKKwkJCWJyZWFrOworCisJCXJlcS0+Y2krKzsKKwl9CisJcmVxLT5jbnVtID0gbjsKKworCXVwX3JlYWQoJmhpZHBfc2Vzc2lvbl9zZW0pOworCXJldHVybiBlcnI7Cit9CisKK2ludCBoaWRwX2dldF9jb25uaW5mbyhzdHJ1Y3QgaGlkcF9jb25uaW5mbyAqY2kpCit7CisJc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbjsKKwlpbnQgZXJyID0gMDsKKworCWRvd25fcmVhZCgmaGlkcF9zZXNzaW9uX3NlbSk7CisKKwlzZXNzaW9uID0gX19oaWRwX2dldF9zZXNzaW9uKCZjaS0+YmRhZGRyKTsKKwlpZiAoc2Vzc2lvbikKKwkJX19oaWRwX2NvcHlfc2Vzc2lvbihzZXNzaW9uLCBjaSk7CisJZWxzZQorCQllcnIgPSAtRU5PRU5UOworCisJdXBfcmVhZCgmaGlkcF9zZXNzaW9uX3NlbSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2luaXQgaGlkcF9pbml0KHZvaWQpCit7CisJbDJjYXBfbG9hZCgpOworCisJQlRfSU5GTygiSElEUCAoSHVtYW4gSW50ZXJmYWNlIEVtdWxhdGlvbikgdmVyICVzIiwgVkVSU0lPTik7CisKKwlyZXR1cm4gaGlkcF9pbml0X3NvY2tldHMoKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGhpZHBfZXhpdCh2b2lkKQoreworCWhpZHBfY2xlYW51cF9zb2NrZXRzKCk7Cit9CisKK21vZHVsZV9pbml0KGhpZHBfaW5pdCk7Cittb2R1bGVfZXhpdChoaWRwX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNYXJjZWwgSG9sdG1hbm4gPG1hcmNlbEBob2x0bWFubi5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJsdWV0b290aCBISURQIHZlciAiIFZFUlNJT04pOworTU9EVUxFX1ZFUlNJT04oVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImJ0LXByb3RvLTYiKTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGlkcC9oaWRwLmggYi9uZXQvYmx1ZXRvb3RoL2hpZHAvaGlkcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNzc1ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL2hpZHAvaGlkcC5oCkBAIC0wLDAgKzEsMTY3IEBACisvKiAKKyAgIEhJRFAgaW1wbGVtZW50YXRpb24gZm9yIExpbnV4IEJsdWV0b290aCBzdGFjayAoQmx1ZVopLgorICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgTWFyY2VsIEhvbHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIFRISVJEIFBBUlRZIFJJR0hUUy4KKyAgIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIEFORCBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkKKyAgIENMQUlNLCBPUiBBTlkgU1BFQ0lBTCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIE9SIEFOWSBEQU1BR0VTIAorICAgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIAorICAgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgCisgICBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisgICBBTEwgTElBQklMSVRZLCBJTkNMVURJTkcgTElBQklMSVRZIEZPUiBJTkZSSU5HRU1FTlQgT0YgQU5ZIFBBVEVOVFMsIAorICAgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMsIFJFTEFUSU5HIFRPIFVTRSBPRiBUSElTIAorICAgU09GVFdBUkUgSVMgRElTQ0xBSU1FRC4KKyovCisKKyNpZm5kZWYgX19ISURQX0gKKyNkZWZpbmUgX19ISURQX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KKworLyogSElEUCBoZWFkZXIgbWFza3MgKi8KKyNkZWZpbmUgSElEUF9IRUFERVJfVFJBTlNfTUFTSwkJCTB4ZjAKKyNkZWZpbmUgSElEUF9IRUFERVJfUEFSQU1fTUFTSwkJCTB4MGYKKworLyogSElEUCB0cmFuc2FjdGlvbiB0eXBlcyAqLworI2RlZmluZSBISURQX1RSQU5TX0hBTkRTSEFLRQkJCTB4MDAKKyNkZWZpbmUgSElEUF9UUkFOU19ISURfQ09OVFJPTAkJCTB4MTAKKyNkZWZpbmUgSElEUF9UUkFOU19HRVRfUkVQT1JUCQkJMHg0MAorI2RlZmluZSBISURQX1RSQU5TX1NFVF9SRVBPUlQJCQkweDUwCisjZGVmaW5lIEhJRFBfVFJBTlNfR0VUX1BST1RPQ09MCQkJMHg2MAorI2RlZmluZSBISURQX1RSQU5TX1NFVF9QUk9UT0NPTAkJCTB4NzAKKyNkZWZpbmUgSElEUF9UUkFOU19HRVRfSURMRQkJCTB4ODAKKyNkZWZpbmUgSElEUF9UUkFOU19TRVRfSURMRQkJCTB4OTAKKyNkZWZpbmUgSElEUF9UUkFOU19EQVRBCQkJCTB4YTAKKyNkZWZpbmUgSElEUF9UUkFOU19EQVRDCQkJCTB4YjAKKworLyogSElEUCBoYW5kc2hha2UgcmVzdWx0cyAqLworI2RlZmluZSBISURQX0hTSEtfU1VDQ0VTU0ZVTAkJCTB4MDAKKyNkZWZpbmUgSElEUF9IU0hLX05PVF9SRUFEWQkJCTB4MDEKKyNkZWZpbmUgSElEUF9IU0hLX0VSUl9JTlZBTElEX1JFUE9SVF9JRAkJMHgwMgorI2RlZmluZSBISURQX0hTSEtfRVJSX1VOU1VQUE9SVEVEX1JFUVVFU1QJMHgwMworI2RlZmluZSBISURQX0hTSEtfRVJSX0lOVkFMSURfUEFSQU1FVEVSCQkweDA0CisjZGVmaW5lIEhJRFBfSFNIS19FUlJfVU5LTk9XTgkJCTB4MGUKKyNkZWZpbmUgSElEUF9IU0hLX0VSUl9GQVRBTAkJCTB4MGYKKworLyogSElEUCBjb250cm9sIG9wZXJhdGlvbiBwYXJhbWV0ZXJzICovCisjZGVmaW5lIEhJRFBfQ1RSTF9OT1AJCQkJMHgwMAorI2RlZmluZSBISURQX0NUUkxfSEFSRF9SRVNFVAkJCTB4MDEKKyNkZWZpbmUgSElEUF9DVFJMX1NPRlRfUkVTRVQJCQkweDAyCisjZGVmaW5lIEhJRFBfQ1RSTF9TVVNQRU5ECQkJMHgwMworI2RlZmluZSBISURQX0NUUkxfRVhJVF9TVVNQRU5ECQkJMHgwNAorI2RlZmluZSBISURQX0NUUkxfVklSVFVBTF9DQUJMRV9VTlBMVUcJCTB4MDUKKworLyogSElEUCBkYXRhIHRyYW5zYWN0aW9uIGhlYWRlcnMgKi8KKyNkZWZpbmUgSElEUF9EQVRBX1JUWVBFX01BU0sJCQkweDAzCisjZGVmaW5lIEhJRFBfREFUQV9SU1JWRF9NQVNLCQkJMHgwYworI2RlZmluZSBISURQX0RBVEFfUlRZUEVfT1RIRVIJCQkweDAwCisjZGVmaW5lIEhJRFBfREFUQV9SVFlQRV9JTlBVVAkJCTB4MDEKKyNkZWZpbmUgSElEUF9EQVRBX1JUWVBFX09VUFVUCQkJMHgwMgorI2RlZmluZSBISURQX0RBVEFfUlRZUEVfRkVBVFVSRQkJCTB4MDMKKworLyogSElEUCBwcm90b2NvbCBoZWFkZXIgcGFyYW1ldGVycyAqLworI2RlZmluZSBISURQX1BST1RPX0JPT1QJCQkJMHgwMAorI2RlZmluZSBISURQX1BST1RPX1JFUE9SVAkJCTB4MDEKKworLyogSElEUCBpb2N0bCBkZWZpbmVzICovCisjZGVmaW5lIEhJRFBDT05OQURECV9JT1coJ0gnLCAyMDAsIGludCkKKyNkZWZpbmUgSElEUENPTk5ERUwJX0lPVygnSCcsIDIwMSwgaW50KQorI2RlZmluZSBISURQR0VUQ09OTkxJU1QJX0lPUignSCcsIDIxMCwgaW50KQorI2RlZmluZSBISURQR0VUQ09OTklORk8JX0lPUignSCcsIDIxMSwgaW50KQorCisjZGVmaW5lIEhJRFBfVklSVFVBTF9DQUJMRV9VTlBMVUcJMAorI2RlZmluZSBISURQX0JPT1RfUFJPVE9DT0xfTU9ERQkJMQorI2RlZmluZSBISURQX0JMVUVUT09USF9WRU5ET1JfSUQJOQorCitzdHJ1Y3QgaGlkcF9jb25uYWRkX3JlcSB7CisJaW50ICAgY3RybF9zb2NrOwkvLyBDb25uZWN0ZWQgY29udHJvbCBzb2NrZXQKKwlpbnQgICBpbnRyX3NvY2s7CS8vIENvbm50ZXRlZCBpbnRlcnJ1cHQgc29ja2V0CisJX191MTYgcGFyc2VyOworCV9fdTE2IHJkX3NpemU7CisJX191OCAqcmRfZGF0YTsKKwlfX3U4ICBjb3VudHJ5OworCV9fdTggIHN1YmNsYXNzOworCV9fdTE2IHZlbmRvcjsKKwlfX3UxNiBwcm9kdWN0OworCV9fdTE2IHZlcnNpb247CisJX191MzIgZmxhZ3M7CisJX191MzIgaWRsZV90bzsKKwljaGFyICBuYW1lWzEyOF07Cit9OworCitzdHJ1Y3QgaGlkcF9jb25uZGVsX3JlcSB7CisJYmRhZGRyX3QgYmRhZGRyOworCV9fdTMyICAgIGZsYWdzOworfTsKKworc3RydWN0IGhpZHBfY29ubmluZm8geworCWJkYWRkcl90IGJkYWRkcjsKKwlfX3UzMiAgICBmbGFnczsKKwlfX3UxNiAgICBzdGF0ZTsKKwlfX3UxNiAgICB2ZW5kb3I7CisJX191MTYgICAgcHJvZHVjdDsKKwlfX3UxNiAgICB2ZXJzaW9uOworCWNoYXIgICAgIG5hbWVbMTI4XTsKK307CisKK3N0cnVjdCBoaWRwX2Nvbm5saXN0X3JlcSB7CisJX191MzIgIGNudW07CisJc3RydWN0IGhpZHBfY29ubmluZm8gX191c2VyICpjaTsKK307CisKK2ludCBoaWRwX2FkZF9jb25uZWN0aW9uKHN0cnVjdCBoaWRwX2Nvbm5hZGRfcmVxICpyZXEsIHN0cnVjdCBzb2NrZXQgKmN0cmxfc29jaywgc3RydWN0IHNvY2tldCAqaW50cl9zb2NrKTsKK2ludCBoaWRwX2RlbF9jb25uZWN0aW9uKHN0cnVjdCBoaWRwX2Nvbm5kZWxfcmVxICpyZXEpOworaW50IGhpZHBfZ2V0X2Nvbm5saXN0KHN0cnVjdCBoaWRwX2Nvbm5saXN0X3JlcSAqcmVxKTsKK2ludCBoaWRwX2dldF9jb25uaW5mbyhzdHJ1Y3QgaGlkcF9jb25uaW5mbyAqY2kpOworCisvKiBISURQIHNlc3Npb24gZGVmaW5lcyAqLworc3RydWN0IGhpZHBfc2Vzc2lvbiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJc3RydWN0IHNvY2tldCAqY3RybF9zb2NrOworCXN0cnVjdCBzb2NrZXQgKmludHJfc29jazsKKworCWJkYWRkcl90IGJkYWRkcjsKKworCXVuc2lnbmVkIGxvbmcgc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGlkbGVfdG87CisKKwl1aW50IGN0cmxfbXR1OworCXVpbnQgaW50cl9tdHU7CisKKwlhdG9taWNfdCB0ZXJtaW5hdGU7CisKKwl1bnNpZ25lZCBjaGFyIGtleXNbOF07CisJdW5zaWduZWQgY2hhciBsZWRzOworCisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKworCXN0cnVjdCBza19idWZmX2hlYWQgY3RybF90cmFuc21pdDsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGludHJfdHJhbnNtaXQ7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgaGlkcF9zY2hlZHVsZShzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uKQoreworCXN0cnVjdCBzb2NrICpjdHJsX3NrID0gc2Vzc2lvbi0+Y3RybF9zb2NrLT5zazsKKwlzdHJ1Y3Qgc29jayAqaW50cl9zayA9IHNlc3Npb24tPmludHJfc29jay0+c2s7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoY3RybF9zay0+c2tfc2xlZXApOworCXdha2VfdXBfaW50ZXJydXB0aWJsZShpbnRyX3NrLT5za19zbGVlcCk7Cit9CisKKy8qIEhJRFAgaW5pdCBkZWZpbmVzICovCitleHRlcm4gaW50IF9faW5pdCBoaWRwX2luaXRfc29ja2V0cyh2b2lkKTsKK2V4dGVybiB2b2lkIF9fZXhpdCBoaWRwX2NsZWFudXBfc29ja2V0cyh2b2lkKTsKKworI2VuZGlmIC8qIF9fSElEUF9IICovCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hpZHAvc29jay5jIGIvbmV0L2JsdWV0b290aC9oaWRwL3NvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWJiMzZkCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9oaWRwL3NvY2suYwpAQCAtMCwwICsxLDIzMiBAQAorLyogCisgICBISURQIGltcGxlbWVudGF0aW9uIGZvciBMaW51eCBCbHVldG9vdGggc3RhY2sgKEJsdWVaKS4KKyAgIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBBTkQgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyAKKyAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiAKKyAgIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIAorICAgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworICAgQUxMIExJQUJJTElUWSwgSU5DTFVESU5HIExJQUJJTElUWSBGT1IgSU5GUklOR0VNRU5UIE9GIEFOWSBQQVRFTlRTLCAKKyAgIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLCBSRUxBVElORyBUTyBVU0UgT0YgVEhJUyAKKyAgIFNPRlRXQVJFIElTIERJU0NMQUlNRUQuCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2luY2x1ZGUgImhpZHAuaCIKKworI2lmbmRlZiBDT05GSUdfQlRfSElEUF9ERUJVRworI3VuZGVmICBCVF9EQkcKKyNkZWZpbmUgQlRfREJHKEQuLi4pCisjZW5kaWYKKworc3RhdGljIGludCBoaWRwX3NvY2tfcmVsZWFzZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCisJQlRfREJHKCJzb2NrICVwIHNrICVwIiwgc29jaywgc2spOworCisJaWYgKCFzaykKKwkJcmV0dXJuIDA7CisKKwlzb2NrX29ycGhhbihzayk7CisJc29ja19wdXQoc2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGlkcF9zb2NrX2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopIGFyZzsKKwlzdHJ1Y3QgaGlkcF9jb25uYWRkX3JlcSBjYTsKKwlzdHJ1Y3QgaGlkcF9jb25uZGVsX3JlcSBjZDsKKwlzdHJ1Y3QgaGlkcF9jb25ubGlzdF9yZXEgY2w7CisJc3RydWN0IGhpZHBfY29ubmluZm8gY2k7CisJc3RydWN0IHNvY2tldCAqY3NvY2s7CisJc3RydWN0IHNvY2tldCAqaXNvY2s7CisJaW50IGVycjsKKworCUJUX0RCRygiY21kICV4IGFyZyAlbHgiLCBjbWQsIGFyZyk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSElEUENPTk5BREQ6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2EsIGFyZ3AsIHNpemVvZihjYSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJY3NvY2sgPSBzb2NrZmRfbG9va3VwKGNhLmN0cmxfc29jaywgJmVycik7CisJCWlmICghY3NvY2spCisJCQlyZXR1cm4gZXJyOworCisJCWlzb2NrID0gc29ja2ZkX2xvb2t1cChjYS5pbnRyX3NvY2ssICZlcnIpOworCQlpZiAoIWlzb2NrKSB7CisJCQlmcHV0KGNzb2NrLT5maWxlKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQlpZiAoY3NvY2stPnNrLT5za19zdGF0ZSAhPSBCVF9DT05ORUNURUQgfHwgaXNvY2stPnNrLT5za19zdGF0ZSAhPSBCVF9DT05ORUNURUQpIHsKKwkJCWZwdXQoY3NvY2stPmZpbGUpOworCQkJZnB1dChpc29jay0+ZmlsZSk7CisJCQlyZXR1cm4gLUVCQURGRDsKKwkJfQorCisJCWVyciA9IGhpZHBfYWRkX2Nvbm5lY3Rpb24oJmNhLCBjc29jaywgaXNvY2spOworCQlpZiAoIWVycikgeworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2EsIHNpemVvZihjYSkpKQorCQkJCWVyciA9IC1FRkFVTFQ7CisJCX0gZWxzZSB7CisJCQlmcHV0KGNzb2NrLT5maWxlKTsKKwkJCWZwdXQoaXNvY2stPmZpbGUpOworCQl9CisKKwkJcmV0dXJuIGVycjsKKworCWNhc2UgSElEUENPTk5ERUw6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2QsIGFyZ3AsIHNpemVvZihjZCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIGhpZHBfZGVsX2Nvbm5lY3Rpb24oJmNkKTsKKworCWNhc2UgSElEUEdFVENPTk5MSVNUOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmNsLCBhcmdwLCBzaXplb2YoY2wpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChjbC5jbnVtIDw9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQllcnIgPSBoaWRwX2dldF9jb25ubGlzdCgmY2wpOworCQlpZiAoIWVyciAmJiBjb3B5X3RvX3VzZXIoYXJncCwgJmNsLCBzaXplb2YoY2wpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiBlcnI7CisKKwljYXNlIEhJRFBHRVRDT05OSU5GTzoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjaSwgYXJncCwgc2l6ZW9mKGNpKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQllcnIgPSBoaWRwX2dldF9jb25uaW5mbygmY2kpOworCQlpZiAoIWVyciAmJiBjb3B5X3RvX3VzZXIoYXJncCwgJmNpLCBzaXplb2YoY2kpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIGhpZHBfc29ja19vcHMgPSB7CisJLmZhbWlseQkJPSBQRl9CTFVFVE9PVEgsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWxlYXNlCT0gaGlkcF9zb2NrX3JlbGVhc2UsCisJLmlvY3RsCQk9IGhpZHBfc29ja19pb2N0bCwKKwkuYmluZAkJPSBzb2NrX25vX2JpbmQsCisJLmdldG5hbWUJPSBzb2NrX25vX2dldG5hbWUsCisJLnNlbmRtc2cJPSBzb2NrX25vX3NlbmRtc2csCisJLnJlY3Ztc2cJPSBzb2NrX25vX3JlY3Ztc2csCisJLnBvbGwJCT0gc29ja19ub19wb2xsLAorCS5saXN0ZW4JCT0gc29ja19ub19saXN0ZW4sCisJLnNodXRkb3duCT0gc29ja19ub19zaHV0ZG93biwKKwkuc2V0c29ja29wdAk9IHNvY2tfbm9fc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdAk9IHNvY2tfbm9fZ2V0c29ja29wdCwKKwkuY29ubmVjdAk9IHNvY2tfbm9fY29ubmVjdCwKKwkuc29ja2V0cGFpcgk9IHNvY2tfbm9fc29ja2V0cGFpciwKKwkuYWNjZXB0CQk9IHNvY2tfbm9fYWNjZXB0LAorCS5tbWFwCQk9IHNvY2tfbm9fbW1hcAorfTsKKworc3RhdGljIHN0cnVjdCBwcm90byBoaWRwX3Byb3RvID0geworCS5uYW1lCQk9ICJISURQIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9ial9zaXplCT0gc2l6ZW9mKHN0cnVjdCBidF9zb2NrKQorfTsKKworc3RhdGljIGludCBoaWRwX3NvY2tfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlCVF9EQkcoInNvY2sgJXAiLCBzb2NrKTsKKworCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfUkFXKQorCQlyZXR1cm4gLUVTT0NLVE5PU1VQUE9SVDsKKworCXNrID0gc2tfYWxsb2MoUEZfQkxVRVRPT1RILCBHRlBfS0VSTkVMLCAmaGlkcF9wcm90bywgMSk7CisJaWYgKCFzaykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisKKwlzb2NrLT5vcHMgPSAmaGlkcF9zb2NrX29wczsKKworCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CisKKwlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKworCXNrLT5za19wcm90b2NvbCA9IHByb3RvY29sOworCXNrLT5za19zdGF0ZQk9IEJUX09QRU47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5IGhpZHBfc29ja19mYW1pbHlfb3BzID0geworCS5mYW1pbHkJPSBQRl9CTFVFVE9PVEgsCisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmNyZWF0ZQk9IGhpZHBfc29ja19jcmVhdGUKK307CisKK2ludCBfX2luaXQgaGlkcF9pbml0X3NvY2tldHModm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcHJvdG9fcmVnaXN0ZXIoJmhpZHBfcHJvdG8sIDApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gYnRfc29ja19yZWdpc3RlcihCVFBST1RPX0hJRFAsICZoaWRwX3NvY2tfZmFtaWx5X29wcyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJQlRfRVJSKCJDYW4ndCByZWdpc3RlciBISURQIHNvY2tldCIpOworCXByb3RvX3VucmVnaXN0ZXIoJmhpZHBfcHJvdG8pOworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgX19leGl0IGhpZHBfY2xlYW51cF9zb2NrZXRzKHZvaWQpCit7CisJaWYgKGJ0X3NvY2tfdW5yZWdpc3RlcihCVFBST1RPX0hJRFApIDwgMCkKKwkJQlRfRVJSKCJDYW4ndCB1bnJlZ2lzdGVyIEhJRFAgc29ja2V0Iik7CisKKwlwcm90b191bnJlZ2lzdGVyKCZoaWRwX3Byb3RvKTsKK30KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbDJjYXAuYyBiL25ldC9ibHVldG9vdGgvbDJjYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTJiYWJjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9sMmNhcC5jCkBAIC0wLDAgKzEsMjMyOSBAQAorLyogCisgICBCbHVlWiAtIEJsdWV0b290aCBwcm90b2NvbCBzdGFjayBmb3IgTGludXgKKyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIFF1YWxjb21tIEluY29ycG9yYXRlZAorCisgICBXcml0dGVuIDIwMDAsMjAwMSBieSBNYXhpbSBLcmFzbnlhbnNreSA8bWF4a0BxdWFsY29tbS5jb20+CisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQgT0YgVEhJUkQgUEFSVFkgUklHSFRTLgorICAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIoUykgQU5EIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWQorICAgQ0xBSU0sIE9SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgCisgICBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gCisgICBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiAKKyAgIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyAgIEFMTCBMSUFCSUxJVFksIElOQ0xVRElORyBMSUFCSUxJVFkgRk9SIElORlJJTkdFTUVOVCBPRiBBTlkgUEFURU5UUywgCisgICBDT1BZUklHSFRTLCBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUywgUkVMQVRJTkcgVE8gVVNFIE9GIFRISVMgCisgICBTT0ZUV0FSRSBJUyBESVNDTEFJTUVELgorKi8KKworLyogQmx1ZXRvb3RoIEwyQ0FQIGNvcmUgYW5kIHNvY2tldHMuICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvbDJjYXAuaD4KKworI2lmbmRlZiBDT05GSUdfQlRfTDJDQVBfREVCVUcKKyN1bmRlZiAgQlRfREJHCisjZGVmaW5lIEJUX0RCRyhELi4uKQorI2VuZGlmCisKKyNkZWZpbmUgVkVSU0lPTiAiMi43IgorCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBsMmNhcF9zb2NrX29wczsKKworc3RhdGljIHN0cnVjdCBidF9zb2NrX2xpc3QgbDJjYXBfc2tfbGlzdCA9IHsKKwkubG9jayA9IFJXX0xPQ0tfVU5MT0NLRUQKK307CisKK3N0YXRpYyBpbnQgbDJjYXBfY29ubl9kZWwoc3RydWN0IGhjaV9jb25uICpjb25uLCBpbnQgZXJyKTsKKworc3RhdGljIHZvaWQgX19sMmNhcF9jaGFuX2FkZChzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29jayAqcGFyZW50KTsKK3N0YXRpYyB2b2lkIGwyY2FwX2NoYW5fZGVsKHN0cnVjdCBzb2NrICpzaywgaW50IGVycik7CisKK3N0YXRpYyB2b2lkIF9fbDJjYXBfc29ja19jbG9zZShzdHJ1Y3Qgc29jayAqc2ssIGludCByZWFzb24pOworc3RhdGljIHZvaWQgbDJjYXBfc29ja19jbG9zZShzdHJ1Y3Qgc29jayAqc2spOworc3RhdGljIHZvaWQgbDJjYXBfc29ja19raWxsKHN0cnVjdCBzb2NrICpzayk7CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqbDJjYXBfYnVpbGRfY21kKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLAorCQkJCXU4IGNvZGUsIHU4IGlkZW50LCB1MTYgZGxlbiwgdm9pZCAqZGF0YSk7CisKKy8qIC0tLS0gTDJDQVAgdGltZXJzIC0tLS0gKi8KK3N0YXRpYyB2b2lkIGwyY2FwX3NvY2tfdGltZW91dCh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSAoc3RydWN0IHNvY2sgKikgYXJnOworCisJQlRfREJHKCJzb2NrICVwIHN0YXRlICVkIiwgc2ssIHNrLT5za19zdGF0ZSk7CisKKwliaF9sb2NrX3NvY2soc2spOworCV9fbDJjYXBfc29ja19jbG9zZShzaywgRVRJTUVET1VUKTsKKwliaF91bmxvY2tfc29jayhzayk7CisKKwlsMmNhcF9zb2NrX2tpbGwoc2spOworCXNvY2tfcHV0KHNrKTsKK30KKworc3RhdGljIHZvaWQgbDJjYXBfc29ja19zZXRfdGltZXIoc3RydWN0IHNvY2sgKnNrLCBsb25nIHRpbWVvdXQpCit7CisJQlRfREJHKCJzayAlcCBzdGF0ZSAlZCB0aW1lb3V0ICVsZCIsIHNrLCBzay0+c2tfc3RhdGUsIHRpbWVvdXQpOworCXNrX3Jlc2V0X3RpbWVyKHNrLCAmc2stPnNrX3RpbWVyLCBqaWZmaWVzICsgdGltZW91dCk7Cit9CisKK3N0YXRpYyB2b2lkIGwyY2FwX3NvY2tfY2xlYXJfdGltZXIoc3RydWN0IHNvY2sgKnNrKQoreworCUJUX0RCRygic29jayAlcCBzdGF0ZSAlZCIsIHNrLCBzay0+c2tfc3RhdGUpOworCXNrX3N0b3BfdGltZXIoc2ssICZzay0+c2tfdGltZXIpOworfQorCitzdGF0aWMgdm9pZCBsMmNhcF9zb2NrX2luaXRfdGltZXIoc3RydWN0IHNvY2sgKnNrKQoreworCWluaXRfdGltZXIoJnNrLT5za190aW1lcik7CisJc2stPnNrX3RpbWVyLmZ1bmN0aW9uID0gbDJjYXBfc29ja190aW1lb3V0OworCXNrLT5za190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpc2s7Cit9CisKKy8qIC0tLS0gTDJDQVAgY29ubmVjdGlvbnMgLS0tLSAqLworc3RhdGljIHN0cnVjdCBsMmNhcF9jb25uICpsMmNhcF9jb25uX2FkZChzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIHU4IHN0YXR1cykKK3sKKwlzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubjsKKworCWlmICgoY29ubiA9IGhjb24tPmwyY2FwX2RhdGEpKQorCQlyZXR1cm4gY29ubjsKKworCWlmIChzdGF0dXMpCisJCXJldHVybiBjb25uOworCisJaWYgKCEoY29ubiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsMmNhcF9jb25uKSwgR0ZQX0FUT01JQykpKQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQoY29ubiwgMCwgc2l6ZW9mKHN0cnVjdCBsMmNhcF9jb25uKSk7CisKKwloY29uLT5sMmNhcF9kYXRhID0gY29ubjsKKwljb25uLT5oY29uID0gaGNvbjsKKworCWNvbm4tPm10dSA9IGhjb24tPmhkZXYtPmFjbF9tdHU7CisJY29ubi0+c3JjID0gJmhjb24tPmhkZXYtPmJkYWRkcjsKKwljb25uLT5kc3QgPSAmaGNvbi0+ZHN0OworCisJc3Bpbl9sb2NrX2luaXQoJmNvbm4tPmxvY2spOworCXJ3bG9ja19pbml0KCZjb25uLT5jaGFuX2xpc3QubG9jayk7CisKKwlCVF9EQkcoImhjb24gJXAgY29ubiAlcCIsIGhjb24sIGNvbm4pOworCXJldHVybiBjb25uOworfQorCitzdGF0aWMgaW50IGwyY2FwX2Nvbm5fZGVsKHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgaW50IGVycikKK3sKKwlzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubjsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlpZiAoIShjb25uID0gaGNvbi0+bDJjYXBfZGF0YSkpIAorCQlyZXR1cm4gMDsKKworCUJUX0RCRygiaGNvbiAlcCBjb25uICVwLCBlcnIgJWQiLCBoY29uLCBjb25uLCBlcnIpOworCisJaWYgKGNvbm4tPnJ4X3NrYikKKwkJa2ZyZWVfc2tiKGNvbm4tPnJ4X3NrYik7CisKKwkvKiBLaWxsIGNoYW5uZWxzICovCisJd2hpbGUgKChzayA9IGNvbm4tPmNoYW5fbGlzdC5oZWFkKSkgeworCQliaF9sb2NrX3NvY2soc2spOworCQlsMmNhcF9jaGFuX2RlbChzaywgZXJyKTsKKwkJYmhfdW5sb2NrX3NvY2soc2spOworCQlsMmNhcF9zb2NrX2tpbGwoc2spOworCX0KKworCWhjb24tPmwyY2FwX2RhdGEgPSBOVUxMOworCWtmcmVlKGNvbm4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbDJjYXBfY2hhbl9hZGQoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2sgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgbDJjYXBfY2hhbl9saXN0ICpsID0gJmNvbm4tPmNoYW5fbGlzdDsKKwl3cml0ZV9sb2NrKCZsLT5sb2NrKTsKKwlfX2wyY2FwX2NoYW5fYWRkKGNvbm4sIHNrLCBwYXJlbnQpOworCXdyaXRlX3VubG9jaygmbC0+bG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggbDJjYXBfZ2V0X2lkZW50KHN0cnVjdCBsMmNhcF9jb25uICpjb25uKQoreworCXU4IGlkOworCisJLyogR2V0IG5leHQgYXZhaWxhYmxlIGlkZW50aWZpY2F0b3IuCisJICogICAgMSAtIDEyOCBhcmUgdXNlZCBieSBrZXJuZWwuCisJICogIDEyOSAtIDE5OSBhcmUgcmVzZXJ2ZWQuCisJICogIDIwMCAtIDI1NCBhcmUgdXNlZCBieSB1dGlsaXRpZXMgbGlrZSBsMnBpbmcsIGV0Yy4KKwkgKi8KKworCXNwaW5fbG9jaygmY29ubi0+bG9jayk7CisKKwlpZiAoKytjb25uLT50eF9pZGVudCA+IDEyOCkKKwkJY29ubi0+dHhfaWRlbnQgPSAxOworCisJaWQgPSBjb25uLT50eF9pZGVudDsKKworCXNwaW5fdW5sb2NrKCZjb25uLT5sb2NrKTsKKworCXJldHVybiBpZDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbDJjYXBfc2VuZF9jbWQoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHU4IGlkZW50LCB1OCBjb2RlLCB1MTYgbGVuLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBsMmNhcF9idWlsZF9jbWQoY29ubiwgY29kZSwgaWRlbnQsIGxlbiwgZGF0YSk7CisKKwlCVF9EQkcoImNvZGUgMHglMi4yeCIsIGNvZGUpOworCisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIGhjaV9zZW5kX2FjbChjb25uLT5oY29uLCBza2IsIDApOworfQorCisvKiAtLS0tIFNvY2tldCBpbnRlcmZhY2UgLS0tLSAqLworc3RhdGljIHN0cnVjdCBzb2NrICpfX2wyY2FwX2dldF9zb2NrX2J5X2FkZHIodTE2IHBzbSwgYmRhZGRyX3QgKnNyYykKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZsMmNhcF9za19saXN0LmhlYWQpCisJCWlmIChsMmNhcF9waShzayktPnNwb3J0ID09IHBzbSAmJiAhYmFjbXAoJmJ0X3NrKHNrKS0+c3JjLCBzcmMpKQorCQkJZ290byBmb3VuZDsKKwlzayA9IE5VTEw7Citmb3VuZDoKKwlyZXR1cm4gc2s7Cit9CisKKy8qIEZpbmQgc29ja2V0IHdpdGggcHNtIGFuZCBzb3VyY2UgYmRhZGRyLgorICogUmV0dXJucyBjbG9zZXN0IG1hdGNoLgorICovCitzdGF0aWMgc3RydWN0IHNvY2sgKl9fbDJjYXBfZ2V0X3NvY2tfYnlfcHNtKGludCBzdGF0ZSwgdTE2IHBzbSwgYmRhZGRyX3QgKnNyYykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBOVUxMLCAqc2sxID0gTlVMTDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmbDJjYXBfc2tfbGlzdC5oZWFkKSB7CisJCWlmIChzdGF0ZSAmJiBzay0+c2tfc3RhdGUgIT0gc3RhdGUpCisJCQljb250aW51ZTsKKworCQlpZiAobDJjYXBfcGkoc2spLT5wc20gPT0gcHNtKSB7CisJCQkvKiBFeGFjdCBtYXRjaC4gKi8KKwkJCWlmICghYmFjbXAoJmJ0X3NrKHNrKS0+c3JjLCBzcmMpKQorCQkJCWJyZWFrOworCisJCQkvKiBDbG9zZXN0IG1hdGNoICovCisJCQlpZiAoIWJhY21wKCZidF9zayhzayktPnNyYywgQkRBRERSX0FOWSkpCisJCQkJc2sxID0gc2s7CisJCX0KKwl9CisJcmV0dXJuIG5vZGUgPyBzayA6IHNrMTsKK30KKworLyogRmluZCBzb2NrZXQgd2l0aCBnaXZlbiBhZGRyZXNzIChwc20sIHNyYykuCisgKiBSZXR1cm5zIGxvY2tlZCBzb2NrZXQgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2sgKmwyY2FwX2dldF9zb2NrX2J5X3BzbShpbnQgc3RhdGUsIHUxNiBwc20sIGJkYWRkcl90ICpzcmMpCit7CisJc3RydWN0IHNvY2sgKnM7CisJcmVhZF9sb2NrKCZsMmNhcF9za19saXN0LmxvY2spOworCXMgPSBfX2wyY2FwX2dldF9zb2NrX2J5X3BzbShzdGF0ZSwgcHNtLCBzcmMpOworCWlmIChzKSBiaF9sb2NrX3NvY2socyk7CisJcmVhZF91bmxvY2soJmwyY2FwX3NrX2xpc3QubG9jayk7CisJcmV0dXJuIHM7Cit9CisKK3N0YXRpYyB2b2lkIGwyY2FwX3NvY2tfZGVzdHJ1Y3Qoc3RydWN0IHNvY2sgKnNrKQoreworCUJUX0RCRygic2sgJXAiLCBzayk7CisKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za193cml0ZV9xdWV1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGwyY2FwX3NvY2tfY2xlYW51cF9saXN0ZW4oc3RydWN0IHNvY2sgKnBhcmVudCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlCVF9EQkcoInBhcmVudCAlcCIsIHBhcmVudCk7CisKKwkvKiBDbG9zZSBub3QgeWV0IGFjY2VwdGVkIGNoYW5uZWxzICovCisJd2hpbGUgKChzayA9IGJ0X2FjY2VwdF9kZXF1ZXVlKHBhcmVudCwgTlVMTCkpKQorCQlsMmNhcF9zb2NrX2Nsb3NlKHNrKTsKKworCXBhcmVudC0+c2tfc3RhdGUgID0gQlRfQ0xPU0VEOworCXNvY2tfc2V0X2ZsYWcocGFyZW50LCBTT0NLX1pBUFBFRCk7Cit9CisKKy8qIEtpbGwgc29ja2V0IChvbmx5IGlmIHphcHBlZCBhbmQgb3JwaGFuKQorICogTXVzdCBiZSBjYWxsZWQgb24gdW5sb2NrZWQgc29ja2V0LgorICovCitzdGF0aWMgdm9pZCBsMmNhcF9zb2NrX2tpbGwoc3RydWN0IHNvY2sgKnNrKQoreworCWlmICghc29ja19mbGFnKHNrLCBTT0NLX1pBUFBFRCkgfHwgc2stPnNrX3NvY2tldCkKKwkJcmV0dXJuOworCisJQlRfREJHKCJzayAlcCBzdGF0ZSAlZCIsIHNrLCBzay0+c2tfc3RhdGUpOworCisJLyogS2lsbCBwb29yIG9ycGhhbiAqLworCWJ0X3NvY2tfdW5saW5rKCZsMmNhcF9za19saXN0LCBzayk7CisJc29ja19zZXRfZmxhZyhzaywgU09DS19ERUFEKTsKKwlzb2NrX3B1dChzayk7Cit9CisKK3N0YXRpYyB2b2lkIF9fbDJjYXBfc29ja19jbG9zZShzdHJ1Y3Qgc29jayAqc2ssIGludCByZWFzb24pCit7CisJQlRfREJHKCJzayAlcCBzdGF0ZSAlZCBzb2NrZXQgJXAiLCBzaywgc2stPnNrX3N0YXRlLCBzay0+c2tfc29ja2V0KTsKKworCXN3aXRjaCAoc2stPnNrX3N0YXRlKSB7CisJY2FzZSBCVF9MSVNURU46CisJCWwyY2FwX3NvY2tfY2xlYW51cF9saXN0ZW4oc2spOworCQlicmVhazsKKworCWNhc2UgQlRfQ09OTkVDVEVEOgorCWNhc2UgQlRfQ09ORklHOgorCWNhc2UgQlRfQ09OTkVDVDI6CisJCWlmIChzay0+c2tfdHlwZSA9PSBTT0NLX1NFUVBBQ0tFVCkgeworCQkJc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4gPSBsMmNhcF9waShzayktPmNvbm47CisJCQlzdHJ1Y3QgbDJjYXBfZGlzY29ubl9yZXEgcmVxOworCisJCQlzay0+c2tfc3RhdGUgPSBCVF9ESVNDT05OOworCQkJbDJjYXBfc29ja19zZXRfdGltZXIoc2ssIHNrLT5za19zbmR0aW1lbyk7CisKKwkJCXJlcS5kY2lkID0gX19jcHVfdG9fbGUxNihsMmNhcF9waShzayktPmRjaWQpOworCQkJcmVxLnNjaWQgPSBfX2NwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+c2NpZCk7CisJCQlsMmNhcF9zZW5kX2NtZChjb25uLCBsMmNhcF9nZXRfaWRlbnQoY29ubiksCisJCQkJCUwyQ0FQX0RJU0NPTk5fUkVRLCBzaXplb2YocmVxKSwgJnJlcSk7CisJCX0gZWxzZSB7CisJCQlsMmNhcF9jaGFuX2RlbChzaywgcmVhc29uKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQlRfQ09OTkVDVDoKKwljYXNlIEJUX0RJU0NPTk46CisJCWwyY2FwX2NoYW5fZGVsKHNrLCByZWFzb24pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBNdXN0IGJlIGNhbGxlZCBvbiB1bmxvY2tlZCBzb2NrZXQuICovCitzdGF0aWMgdm9pZCBsMmNhcF9zb2NrX2Nsb3NlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlsMmNhcF9zb2NrX2NsZWFyX3RpbWVyKHNrKTsKKwlsb2NrX3NvY2soc2spOworCV9fbDJjYXBfc29ja19jbG9zZShzaywgRUNPTk5SRVNFVCk7CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlsMmNhcF9zb2NrX2tpbGwoc2spOworfQorCitzdGF0aWMgdm9pZCBsMmNhcF9zb2NrX2luaXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29jayAqcGFyZW50KQoreworCXN0cnVjdCBsMmNhcF9waW5mbyAqcGkgPSBsMmNhcF9waShzayk7CisKKwlCVF9EQkcoInNrICVwIiwgc2spOworCisJaWYgKHBhcmVudCkgeworCQlzay0+c2tfdHlwZSA9IHBhcmVudC0+c2tfdHlwZTsKKwkJcGktPmltdHUgPSBsMmNhcF9waShwYXJlbnQpLT5pbXR1OworCQlwaS0+b210dSA9IGwyY2FwX3BpKHBhcmVudCktPm9tdHU7CisJCXBpLT5saW5rX21vZGUgPSBsMmNhcF9waShwYXJlbnQpLT5saW5rX21vZGU7CisJfSBlbHNlIHsKKwkJcGktPmltdHUgPSBMMkNBUF9ERUZBVUxUX01UVTsKKwkJcGktPm9tdHUgPSAwOworCQlwaS0+bGlua19tb2RlID0gMDsKKwl9CisKKwkvKiBEZWZhdWx0IGNvbmZpZyBvcHRpb25zICovCisJcGktPmNvbmZfbXR1ID0gTDJDQVBfREVGQVVMVF9NVFU7CisJcGktPmZsdXNoX3RvID0gTDJDQVBfREVGQVVMVF9GTFVTSF9UTzsKK30KKworc3RhdGljIHN0cnVjdCBwcm90byBsMmNhcF9wcm90byA9IHsKKwkubmFtZQkJPSAiTDJDQVAiLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub2JqX3NpemUJPSBzaXplb2Yoc3RydWN0IGwyY2FwX3BpbmZvKQorfTsKKworc3RhdGljIHN0cnVjdCBzb2NrICpsMmNhcF9zb2NrX2FsbG9jKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90bywgaW50IHByaW8pCit7CisJc3RydWN0IHNvY2sgKnNrOworCisJc2sgPSBza19hbGxvYyhQRl9CTFVFVE9PVEgsIHByaW8sICZsMmNhcF9wcm90bywgMSk7CisJaWYgKCFzaykKKwkJcmV0dXJuIE5VTEw7CisKKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisJSU5JVF9MSVNUX0hFQUQoJmJ0X3NrKHNrKS0+YWNjZXB0X3EpOworCisJc2stPnNrX2Rlc3RydWN0ID0gbDJjYXBfc29ja19kZXN0cnVjdDsKKwlzay0+c2tfc25kdGltZW8gPSBMMkNBUF9DT05OX1RJTUVPVVQ7CisKKwlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKworCXNrLT5za19wcm90b2NvbCA9IHByb3RvOworCXNrLT5za19zdGF0ZSAgICA9IEJUX09QRU47CisKKwlsMmNhcF9zb2NrX2luaXRfdGltZXIoc2spOworCisJYnRfc29ja19saW5rKCZsMmNhcF9za19saXN0LCBzayk7CisJcmV0dXJuIHNrOworfQorCitzdGF0aWMgaW50IGwyY2FwX3NvY2tfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlCVF9EQkcoInNvY2sgJXAiLCBzb2NrKTsKKworCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CisKKwlpZiAoc29jay0+dHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCAmJgorCQkJc29jay0+dHlwZSAhPSBTT0NLX0RHUkFNICYmIHNvY2stPnR5cGUgIT0gU09DS19SQVcpCisJCXJldHVybiAtRVNPQ0tUTk9TVVBQT1JUOworCisJaWYgKHNvY2stPnR5cGUgPT0gU09DS19SQVcgJiYgIWNhcGFibGUoQ0FQX05FVF9SQVcpKQorCQlyZXR1cm4gLUVQRVJNOworCisJc29jay0+b3BzID0gJmwyY2FwX3NvY2tfb3BzOworCisJc2sgPSBsMmNhcF9zb2NrX2FsbG9jKHNvY2ssIHByb3RvY29sLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWwyY2FwX3NvY2tfaW5pdChzaywgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbDJjYXBfc29ja19iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IGFkZHJfbGVuKQoreworCXN0cnVjdCBzb2NrYWRkcl9sMiAqbGEgPSAoc3RydWN0IHNvY2thZGRyX2wyICopIGFkZHI7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJaW50IGVyciA9IDA7CisKKwlCVF9EQkcoInNrICVwLCAlcyAlZCIsIHNrLCBiYXRvc3RyKCZsYS0+bDJfYmRhZGRyKSwgbGEtPmwyX3BzbSk7CisKKwlpZiAoIWFkZHIgfHwgYWRkci0+c2FfZmFtaWx5ICE9IEFGX0JMVUVUT09USCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsb2NrX3NvY2soc2spOworCisJaWYgKHNrLT5za19zdGF0ZSAhPSBCVF9PUEVOKSB7CisJCWVyciA9IC1FQkFERkQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl3cml0ZV9sb2NrX2JoKCZsMmNhcF9za19saXN0LmxvY2spOworCisJaWYgKGxhLT5sMl9wc20gJiYgX19sMmNhcF9nZXRfc29ja19ieV9hZGRyKGxhLT5sMl9wc20sICZsYS0+bDJfYmRhZGRyKSkgeworCQllcnIgPSAtRUFERFJJTlVTRTsKKwl9IGVsc2UgeworCQkvKiBTYXZlIHNvdXJjZSBhZGRyZXNzICovCisJCWJhY3B5KCZidF9zayhzayktPnNyYywgJmxhLT5sMl9iZGFkZHIpOworCQlsMmNhcF9waShzayktPnBzbSAgID0gbGEtPmwyX3BzbTsKKwkJbDJjYXBfcGkoc2spLT5zcG9ydCA9IGxhLT5sMl9wc207CisJCXNrLT5za19zdGF0ZSA9IEJUX0JPVU5EOworCX0KKworCXdyaXRlX3VubG9ja19iaCgmbDJjYXBfc2tfbGlzdC5sb2NrKTsKKworZG9uZToKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbDJjYXBfZG9fY29ubmVjdChzdHJ1Y3Qgc29jayAqc2spCit7CisJYmRhZGRyX3QgKnNyYyA9ICZidF9zayhzayktPnNyYzsKKwliZGFkZHJfdCAqZHN0ID0gJmJ0X3NrKHNrKS0+ZHN0OworCXN0cnVjdCBsMmNhcF9jb25uICpjb25uOworCXN0cnVjdCBoY2lfY29ubiAqaGNvbjsKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygiJXMgLT4gJXMgcHNtIDB4JTIuMngiLCBiYXRvc3RyKHNyYyksIGJhdG9zdHIoZHN0KSwgbDJjYXBfcGkoc2spLT5wc20pOworCisJaWYgKCEoaGRldiA9IGhjaV9nZXRfcm91dGUoZHN0LCBzcmMpKSkKKwkJcmV0dXJuIC1FSE9TVFVOUkVBQ0g7CisKKwloY2lfZGV2X2xvY2tfYmgoaGRldik7CisKKwllcnIgPSAtRU5PTUVNOworCisJaGNvbiA9IGhjaV9jb25uZWN0KGhkZXYsIEFDTF9MSU5LLCBkc3QpOworCWlmICghaGNvbikKKwkJZ290byBkb25lOworCisJY29ubiA9IGwyY2FwX2Nvbm5fYWRkKGhjb24sIDApOworCWlmICghY29ubikgeworCQloY2lfY29ubl9wdXQoaGNvbik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwllcnIgPSAwOworCisJLyogVXBkYXRlIHNvdXJjZSBhZGRyIG9mIHRoZSBzb2NrZXQgKi8KKwliYWNweShzcmMsIGNvbm4tPnNyYyk7CisKKwlsMmNhcF9jaGFuX2FkZChjb25uLCBzaywgTlVMTCk7CisKKwlzay0+c2tfc3RhdGUgPSBCVF9DT05ORUNUOworCWwyY2FwX3NvY2tfc2V0X3RpbWVyKHNrLCBzay0+c2tfc25kdGltZW8pOworCisJaWYgKGhjb24tPnN0YXRlID09IEJUX0NPTk5FQ1RFRCkgeworCQlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19TRVFQQUNLRVQpIHsKKwkJCXN0cnVjdCBsMmNhcF9jb25uX3JlcSByZXE7CisJCQlsMmNhcF9waShzayktPmlkZW50ID0gbDJjYXBfZ2V0X2lkZW50KGNvbm4pOworCQkJcmVxLnNjaWQgPSBfX2NwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+c2NpZCk7CisJCQlyZXEucHNtICA9IGwyY2FwX3BpKHNrKS0+cHNtOworCQkJbDJjYXBfc2VuZF9jbWQoY29ubiwgbDJjYXBfcGkoc2spLT5pZGVudCwKKwkJCQkJTDJDQVBfQ09OTl9SRVEsIHNpemVvZihyZXEpLCAmcmVxKTsKKwkJfSBlbHNlIHsKKwkJCWwyY2FwX3NvY2tfY2xlYXJfdGltZXIoc2spOworCQkJc2stPnNrX3N0YXRlID0gQlRfQ09OTkVDVEVEOworCQl9CisJfQorCitkb25lOgorCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOworCWhjaV9kZXZfcHV0KGhkZXYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbDJjYXBfc29ja19jb25uZWN0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IGFsZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfbDIgKmxhID0gKHN0cnVjdCBzb2NrYWRkcl9sMiAqKSBhZGRyOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnIgPSAwOworCisJbG9ja19zb2NrKHNrKTsKKworCUJUX0RCRygic2sgJXAiLCBzayk7CisKKwlpZiAoYWRkci0+c2FfZmFtaWx5ICE9IEFGX0JMVUVUT09USCB8fCBhbGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9sMikpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChzay0+c2tfdHlwZSA9PSBTT0NLX1NFUVBBQ0tFVCAmJiAhbGEtPmwyX3BzbSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJc3dpdGNoKHNrLT5za19zdGF0ZSkgeworCWNhc2UgQlRfQ09OTkVDVDoKKwljYXNlIEJUX0NPTk5FQ1QyOgorCWNhc2UgQlRfQ09ORklHOgorCQkvKiBBbHJlYWR5IGNvbm5lY3RpbmcgKi8KKwkJZ290byB3YWl0OworCisJY2FzZSBCVF9DT05ORUNURUQ6CisJCS8qIEFscmVhZHkgY29ubmVjdGVkICovCisJCWdvdG8gZG9uZTsKKworCWNhc2UgQlRfT1BFTjoKKwljYXNlIEJUX0JPVU5EOgorCQkvKiBDYW4gY29ubmVjdCAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FQkFERkQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBTZXQgZGVzdGluYXRpb24gYWRkcmVzcyBhbmQgcHNtICovCisJYmFjcHkoJmJ0X3NrKHNrKS0+ZHN0LCAmbGEtPmwyX2JkYWRkcik7CisJbDJjYXBfcGkoc2spLT5wc20gPSBsYS0+bDJfcHNtOworCisJaWYgKChlcnIgPSBsMmNhcF9kb19jb25uZWN0KHNrKSkpCisJCWdvdG8gZG9uZTsKKword2FpdDoKKwllcnIgPSBidF9zb2NrX3dhaXRfc3RhdGUoc2ssIEJUX0NPTk5FQ1RFRCwKKwkJCXNvY2tfc25kdGltZW8oc2ssIGZsYWdzICYgT19OT05CTE9DSykpOworZG9uZToKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbDJjYXBfc29ja19saXN0ZW4oc3RydWN0IHNvY2tldCAqc29jaywgaW50IGJhY2tsb2cpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJaW50IGVyciA9IDA7CisKKwlCVF9EQkcoInNrICVwIGJhY2tsb2cgJWQiLCBzaywgYmFja2xvZyk7CisKKwlsb2NrX3NvY2soc2spOworCisJaWYgKHNrLT5za19zdGF0ZSAhPSBCVF9CT1VORCB8fCBzb2NrLT50eXBlICE9IFNPQ0tfU0VRUEFDS0VUKSB7CisJCWVyciA9IC1FQkFERkQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoIWwyY2FwX3BpKHNrKS0+cHNtKSB7CisJCWJkYWRkcl90ICpzcmMgPSAmYnRfc2soc2spLT5zcmM7CisJCXUxNiBwc207CisKKwkJZXJyID0gLUVJTlZBTDsKKworCQl3cml0ZV9sb2NrX2JoKCZsMmNhcF9za19saXN0LmxvY2spOworCisJCWZvciAocHNtID0gMHgxMDAxOyBwc20gPCAweDExMDA7IHBzbSArPSAyKQorCQkJaWYgKCFfX2wyY2FwX2dldF9zb2NrX2J5X2FkZHIocHNtLCBzcmMpKSB7CisJCQkJbDJjYXBfcGkoc2spLT5wc20gICA9IGh0b2JzKHBzbSk7CisJCQkJbDJjYXBfcGkoc2spLT5zcG9ydCA9IGh0b2JzKHBzbSk7CisJCQkJZXJyID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKworCQl3cml0ZV91bmxvY2tfYmgoJmwyY2FwX3NrX2xpc3QubG9jayk7CisKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGRvbmU7CisJfQorCisJc2stPnNrX21heF9hY2tfYmFja2xvZyA9IGJhY2tsb2c7CisJc2stPnNrX2Fja19iYWNrbG9nID0gMDsKKwlzay0+c2tfc3RhdGUgPSBCVF9MSVNURU47CisKK2RvbmU6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGwyY2FwX3NvY2tfYWNjZXB0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrZXQgKm5ld3NvY2ssIGludCBmbGFncykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zaywgKm5zazsKKwlsb25nIHRpbWVvOworCWludCBlcnIgPSAwOworCisJbG9ja19zb2NrKHNrKTsKKworCWlmIChzay0+c2tfc3RhdGUgIT0gQlRfTElTVEVOKSB7CisJCWVyciA9IC1FQkFERkQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl0aW1lbyA9IHNvY2tfcmN2dGltZW8oc2ssIGZsYWdzICYgT19OT05CTE9DSyk7CisKKwlCVF9EQkcoInNrICVwIHRpbWVvICVsZCIsIHNrLCB0aW1lbyk7CisKKwkvKiBXYWl0IGZvciBhbiBpbmNvbWluZyBjb25uZWN0aW9uLiAod2FrZS1vbmUpLiAqLworCWFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwl3aGlsZSAoIShuc2sgPSBidF9hY2NlcHRfZGVxdWV1ZShzaywgbmV3c29jaykpKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmICghdGltZW8pIHsKKwkJCWVyciA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJfQorCisJCXJlbGVhc2Vfc29jayhzayk7CisJCXRpbWVvID0gc2NoZWR1bGVfdGltZW91dCh0aW1lbyk7CisJCWxvY2tfc29jayhzayk7CisKKwkJaWYgKHNrLT5za19zdGF0ZSAhPSBCVF9MSVNURU4pIHsKKwkJCWVyciA9IC1FQkFERkQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJZXJyID0gc29ja19pbnRyX2Vycm5vKHRpbWVvKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisKKwlpZiAoZXJyKQorCQlnb3RvIGRvbmU7CisKKwluZXdzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKworCUJUX0RCRygibmV3IHNvY2tldCAlcCIsIG5zayk7CisKK2RvbmU6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGwyY2FwX3NvY2tfZ2V0bmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCAqbGVuLCBpbnQgcGVlcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfbDIgKmxhID0gKHN0cnVjdCBzb2NrYWRkcl9sMiAqKSBhZGRyOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCisJQlRfREJHKCJzb2NrICVwLCBzayAlcCIsIHNvY2ssIHNrKTsKKworCWFkZHItPnNhX2ZhbWlseSA9IEFGX0JMVUVUT09USDsKKwkqbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9sMik7CisKKwlpZiAocGVlcikKKwkJYmFjcHkoJmxhLT5sMl9iZGFkZHIsICZidF9zayhzayktPmRzdCk7CisJZWxzZQorCQliYWNweSgmbGEtPmwyX2JkYWRkciwgJmJ0X3NrKHNrKS0+c3JjKTsKKworCWxhLT5sMl9wc20gPSBsMmNhcF9waShzayktPnBzbTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbDJjYXBfZG9fc2VuZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgaW50IGxlbikKK3sKKwlzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiA9IGwyY2FwX3BpKHNrKS0+Y29ubjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqKmZyYWc7CisJaW50IGVyciwgaGxlbiwgY291bnQsIHNlbnQ9MDsKKwlzdHJ1Y3QgbDJjYXBfaGRyICpsaDsKKworCUJUX0RCRygic2sgJXAgbGVuICVkIiwgc2ssIGxlbik7CisKKwkvKiBGaXJzdCBmcmFnbWVudCAod2l0aCBMMkNBUCBoZWFkZXIpICovCisJaWYgKHNrLT5za190eXBlID09IFNPQ0tfREdSQU0pCisJCWhsZW4gPSBMMkNBUF9IRFJfU0laRSArIDI7CisJZWxzZQorCQlobGVuID0gTDJDQVBfSERSX1NJWkU7CisKKwljb3VudCA9IG1pbl90KHVuc2lnbmVkIGludCwgKGNvbm4tPm10dSAtIGhsZW4pLCBsZW4pOworCisJc2tiID0gYnRfc2tiX3NlbmRfYWxsb2Moc2ssIGhsZW4gKyBjb3VudCwKKwkJCW1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlULCAmZXJyKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIGVycjsKKworCS8qIENyZWF0ZSBMMkNBUCBoZWFkZXIgKi8KKwlsaCA9IChzdHJ1Y3QgbDJjYXBfaGRyICopIHNrYl9wdXQoc2tiLCBMMkNBUF9IRFJfU0laRSk7CisJbGgtPmNpZCA9IF9fY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5kY2lkKTsKKwlsaC0+bGVuID0gX19jcHVfdG9fbGUxNihsZW4gKyAoaGxlbiAtIEwyQ0FQX0hEUl9TSVpFKSk7CisKKwlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19ER1JBTSkKKwkJcHV0X3VuYWxpZ25lZChsMmNhcF9waShzayktPnBzbSwgKHUxNiAqKSBza2JfcHV0KHNrYiwgMikpOworCisJaWYgKG1lbWNweV9mcm9taW92ZWMoc2tiX3B1dChza2IsIGNvdW50KSwgbXNnLT5tc2dfaW92LCBjb3VudCkpIHsKKwkJZXJyID0gLUVGQVVMVDsKKwkJZ290byBmYWlsOworCX0KKworCXNlbnQgKz0gY291bnQ7CisJbGVuICAtPSBjb3VudDsKKworCS8qIENvbnRpbnVhdGlvbiBmcmFnbWVudHMgKG5vIEwyQ0FQIGhlYWRlcikgKi8KKwlmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0OworCXdoaWxlIChsZW4pIHsKKwkJY291bnQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbm4tPm10dSwgbGVuKTsKKworCQkqZnJhZyA9IGJ0X3NrYl9zZW5kX2FsbG9jKHNrLCBjb3VudCwgbXNnLT5tc2dfZmxhZ3MgJiBNU0dfRE9OVFdBSVQsICZlcnIpOworCQlpZiAoISpmcmFnKQorCQkJZ290byBmYWlsOworCQkKKwkJaWYgKG1lbWNweV9mcm9taW92ZWMoc2tiX3B1dCgqZnJhZywgY291bnQpLCBtc2ctPm1zZ19pb3YsIGNvdW50KSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCXNlbnQgKz0gY291bnQ7CisJCWxlbiAgLT0gY291bnQ7CisKKwkJZnJhZyA9ICYoKmZyYWcpLT5uZXh0OworCX0KKworCWlmICgoZXJyID0gaGNpX3NlbmRfYWNsKGNvbm4tPmhjb24sIHNrYiwgMCkpIDwgMCkKKwkJZ290byBmYWlsOworCisJcmV0dXJuIHNlbnQ7CisKK2ZhaWw6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBsMmNhcF9zb2NrX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJaW50IGVyciA9IDA7CisKKwlCVF9EQkcoInNvY2sgJXAsIHNrICVwIiwgc29jaywgc2spOworCisJaWYgKHNrLT5za19lcnIpCisJCXJldHVybiBzb2NrX2Vycm9yKHNrKTsKKworCWlmIChtc2ctPm1zZ19mbGFncyAmIE1TR19PT0IpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCS8qIENoZWNrIG91dGdvaW5nIE1UVSAqLworCWlmIChzay0+c2tfdHlwZSAhPSBTT0NLX1JBVyAmJiBsZW4gPiBsMmNhcF9waShzayktPm9tdHUpCisJCXJldHVybiAtRUlOVkFMOworCisJbG9ja19zb2NrKHNrKTsKKworCWlmIChzay0+c2tfc3RhdGUgPT0gQlRfQ09OTkVDVEVEKQorCQllcnIgPSBsMmNhcF9kb19zZW5kKHNrLCBtc2csIGxlbik7CisJZWxzZQorCQllcnIgPSAtRU5PVENPTk47CisKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbDJjYXBfc29ja19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGwyY2FwX29wdGlvbnMgb3B0czsKKwlpbnQgZXJyID0gMCwgbGVuOworCXUzMiBvcHQ7CisKKwlCVF9EQkcoInNrICVwIiwgc2spOworCisJbG9ja19zb2NrKHNrKTsKKworCXN3aXRjaCAob3B0bmFtZSkgeworCWNhc2UgTDJDQVBfT1BUSU9OUzoKKwkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBzaXplb2Yob3B0cyksIG9wdGxlbik7CisJCWlmIChjb3B5X2Zyb21fdXNlcigoY2hhciAqKSAmb3B0cywgb3B0dmFsLCBsZW4pKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJbDJjYXBfcGkoc2spLT5pbXR1ICA9IG9wdHMuaW10dTsKKwkJbDJjYXBfcGkoc2spLT5vbXR1ICA9IG9wdHMub210dTsKKwkJYnJlYWs7CisKKwljYXNlIEwyQ0FQX0xNOgorCQlpZiAoZ2V0X3VzZXIob3B0LCAodTMyIF9fdXNlciAqKSBvcHR2YWwpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlsMmNhcF9waShzayktPmxpbmtfbW9kZSA9IG9wdDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PUFJPVE9PUFQ7CisJCWJyZWFrOworCX0KKworCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBsMmNhcF9zb2NrX2dldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBsMmNhcF9vcHRpb25zIG9wdHM7CisJc3RydWN0IGwyY2FwX2Nvbm5pbmZvIGNpbmZvOworCWludCBsZW4sIGVyciA9IDA7CisKKwlCVF9EQkcoInNrICVwIiwgc2spOworCisJaWYgKGdldF91c2VyKGxlbiwgb3B0bGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlsb2NrX3NvY2soc2spOworCisJc3dpdGNoIChvcHRuYW1lKSB7CisJY2FzZSBMMkNBUF9PUFRJT05TOgorCQlvcHRzLmltdHUgICAgID0gbDJjYXBfcGkoc2spLT5pbXR1OworCQlvcHRzLm9tdHUgICAgID0gbDJjYXBfcGkoc2spLT5vbXR1OworCQlvcHRzLmZsdXNoX3RvID0gbDJjYXBfcGkoc2spLT5mbHVzaF90bzsKKwkJb3B0cy5tb2RlICAgICA9IDB4MDA7CisKKwkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sIHNpemVvZihvcHRzKSk7CisJCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAoY2hhciAqKSAmb3B0cywgbGVuKSkKKwkJCWVyciA9IC1FRkFVTFQ7CisKKwkJYnJlYWs7CisKKwljYXNlIEwyQ0FQX0xNOgorCQlpZiAocHV0X3VzZXIobDJjYXBfcGkoc2spLT5saW5rX21vZGUsICh1MzIgX191c2VyICopIG9wdHZhbCkpCisJCQllcnIgPSAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgTDJDQVBfQ09OTklORk86CisJCWlmIChzay0+c2tfc3RhdGUgIT0gQlRfQ09OTkVDVEVEKSB7CisJCQllcnIgPSAtRU5PVENPTk47CisJCQlicmVhazsKKwkJfQorCisJCWNpbmZvLmhjaV9oYW5kbGUgPSBsMmNhcF9waShzayktPmNvbm4tPmhjb24tPmhhbmRsZTsKKwkJbWVtY3B5KGNpbmZvLmRldl9jbGFzcywgbDJjYXBfcGkoc2spLT5jb25uLT5oY29uLT5kZXZfY2xhc3MsIDMpOworCisJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLCBzaXplb2YoY2luZm8pKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsIChjaGFyICopICZjaW5mbywgbGVuKSkKKwkJCWVyciA9IC1FRkFVTFQ7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PUFJPVE9PUFQ7CisJCWJyZWFrOworCX0KKworCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBsMmNhcF9zb2NrX3NodXRkb3duKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBob3cpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJaW50IGVyciA9IDA7CisKKwlCVF9EQkcoInNvY2sgJXAsIHNrICVwIiwgc29jaywgc2spOworCisJaWYgKCFzaykKKwkJcmV0dXJuIDA7CisKKwlsb2NrX3NvY2soc2spOworCWlmICghc2stPnNrX3NodXRkb3duKSB7CisJCXNrLT5za19zaHV0ZG93biA9IFNIVVRET1dOX01BU0s7CisJCWwyY2FwX3NvY2tfY2xlYXJfdGltZXIoc2spOworCQlfX2wyY2FwX3NvY2tfY2xvc2Uoc2ssIDApOworCisJCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfTElOR0VSKSAmJiBzay0+c2tfbGluZ2VydGltZSkKKwkJCWVyciA9IGJ0X3NvY2tfd2FpdF9zdGF0ZShzaywgQlRfQ0xPU0VELCBzay0+c2tfbGluZ2VydGltZSk7CisJfQorCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBsMmNhcF9zb2NrX3JlbGVhc2Uoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlpbnQgZXJyOworCisJQlRfREJHKCJzb2NrICVwLCBzayAlcCIsIHNvY2ssIHNrKTsKKworCWlmICghc2spCisJCXJldHVybiAwOworCisJZXJyID0gbDJjYXBfc29ja19zaHV0ZG93bihzb2NrLCAyKTsKKworCXNvY2tfb3JwaGFuKHNrKTsKKwlsMmNhcF9zb2NrX2tpbGwoc2spOworCXJldHVybiBlcnI7Cit9CisKKy8qIC0tLS0gTDJDQVAgY2hhbm5lbHMgLS0tLSAqLworc3RhdGljIHN0cnVjdCBzb2NrICpfX2wyY2FwX2dldF9jaGFuX2J5X2RjaWQoc3RydWN0IGwyY2FwX2NoYW5fbGlzdCAqbCwgdTE2IGNpZCkKK3sKKwlzdHJ1Y3Qgc29jayAqczsKKwlmb3IgKHMgPSBsLT5oZWFkOyBzOyBzID0gbDJjYXBfcGkocyktPm5leHRfYykgeworCQlpZiAobDJjYXBfcGkocyktPmRjaWQgPT0gY2lkKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBzOworfQorCitzdGF0aWMgc3RydWN0IHNvY2sgKl9fbDJjYXBfZ2V0X2NoYW5fYnlfc2NpZChzdHJ1Y3QgbDJjYXBfY2hhbl9saXN0ICpsLCB1MTYgY2lkKQoreworCXN0cnVjdCBzb2NrICpzOworCWZvciAocyA9IGwtPmhlYWQ7IHM7IHMgPSBsMmNhcF9waShzKS0+bmV4dF9jKSB7CisJCWlmIChsMmNhcF9waShzKS0+c2NpZCA9PSBjaWQpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIHM7Cit9CisKKy8qIEZpbmQgY2hhbm5lbCB3aXRoIGdpdmVuIFNDSUQuCisgKiBSZXR1cm5zIGxvY2tlZCBzb2NrZXQgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2sgKmwyY2FwX2dldF9jaGFuX2J5X3NjaWQoc3RydWN0IGwyY2FwX2NoYW5fbGlzdCAqbCwgdTE2IGNpZCkKK3sKKwlzdHJ1Y3Qgc29jayAqczsKKwlyZWFkX2xvY2soJmwtPmxvY2spOworCXMgPSBfX2wyY2FwX2dldF9jaGFuX2J5X3NjaWQobCwgY2lkKTsKKwlpZiAocykgYmhfbG9ja19zb2NrKHMpOworCXJlYWRfdW5sb2NrKCZsLT5sb2NrKTsKKwlyZXR1cm4gczsKK30KKworc3RhdGljIHN0cnVjdCBzb2NrICpfX2wyY2FwX2dldF9jaGFuX2J5X2lkZW50KHN0cnVjdCBsMmNhcF9jaGFuX2xpc3QgKmwsIHU4IGlkZW50KQoreworCXN0cnVjdCBzb2NrICpzOworCWZvciAocyA9IGwtPmhlYWQ7IHM7IHMgPSBsMmNhcF9waShzKS0+bmV4dF9jKSB7CisJCWlmIChsMmNhcF9waShzKS0+aWRlbnQgPT0gaWRlbnQpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2sgKmwyY2FwX2dldF9jaGFuX2J5X2lkZW50KHN0cnVjdCBsMmNhcF9jaGFuX2xpc3QgKmwsIHU4IGlkZW50KQoreworCXN0cnVjdCBzb2NrICpzOworCXJlYWRfbG9jaygmbC0+bG9jayk7CisJcyA9IF9fbDJjYXBfZ2V0X2NoYW5fYnlfaWRlbnQobCwgaWRlbnQpOworCWlmIChzKSBiaF9sb2NrX3NvY2socyk7CisJcmVhZF91bmxvY2soJmwtPmxvY2spOworCXJldHVybiBzOworfQorCitzdGF0aWMgdTE2IGwyY2FwX2FsbG9jX2NpZChzdHJ1Y3QgbDJjYXBfY2hhbl9saXN0ICpsKQoreworCXUxNiBjaWQgPSAweDAwNDA7CisKKwlmb3IgKDsgY2lkIDwgMHhmZmZmOyBjaWQrKykgeworCQlpZighX19sMmNhcF9nZXRfY2hhbl9ieV9zY2lkKGwsIGNpZCkpCisJCQlyZXR1cm4gY2lkOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19sMmNhcF9jaGFuX2xpbmsoc3RydWN0IGwyY2FwX2NoYW5fbGlzdCAqbCwgc3RydWN0IHNvY2sgKnNrKQoreworCXNvY2tfaG9sZChzayk7CisKKwlpZiAobC0+aGVhZCkKKwkJbDJjYXBfcGkobC0+aGVhZCktPnByZXZfYyA9IHNrOworCisJbDJjYXBfcGkoc2spLT5uZXh0X2MgPSBsLT5oZWFkOworCWwyY2FwX3BpKHNrKS0+cHJldl9jID0gTlVMTDsKKwlsLT5oZWFkID0gc2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsMmNhcF9jaGFuX3VubGluayhzdHJ1Y3QgbDJjYXBfY2hhbl9saXN0ICpsLCBzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHNvY2sgKm5leHQgPSBsMmNhcF9waShzayktPm5leHRfYywgKnByZXYgPSBsMmNhcF9waShzayktPnByZXZfYzsKKworCXdyaXRlX2xvY2soJmwtPmxvY2spOworCWlmIChzayA9PSBsLT5oZWFkKQorCQlsLT5oZWFkID0gbmV4dDsKKworCWlmIChuZXh0KQorCQlsMmNhcF9waShuZXh0KS0+cHJldl9jID0gcHJldjsKKwlpZiAocHJldikKKwkJbDJjYXBfcGkocHJldiktPm5leHRfYyA9IG5leHQ7CisJd3JpdGVfdW5sb2NrKCZsLT5sb2NrKTsKKworCV9fc29ja19wdXQoc2spOworfQorCitzdGF0aWMgdm9pZCBfX2wyY2FwX2NoYW5fYWRkKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrICpwYXJlbnQpCit7CisJc3RydWN0IGwyY2FwX2NoYW5fbGlzdCAqbCA9ICZjb25uLT5jaGFuX2xpc3Q7CisKKwlCVF9EQkcoImNvbm4gJXAsIHBzbSAweCUyLjJ4LCBkY2lkIDB4JTQuNHgiLCBjb25uLCBsMmNhcF9waShzayktPnBzbSwgbDJjYXBfcGkoc2spLT5kY2lkKTsKKworCWwyY2FwX3BpKHNrKS0+Y29ubiA9IGNvbm47CisKKwlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19TRVFQQUNLRVQpIHsKKwkJLyogQWxsb2MgQ0lEIGZvciBjb25uZWN0aW9uLW9yaWVudGVkIHNvY2tldCAqLworCQlsMmNhcF9waShzayktPnNjaWQgPSBsMmNhcF9hbGxvY19jaWQobCk7CisJfSBlbHNlIGlmIChzay0+c2tfdHlwZSA9PSBTT0NLX0RHUkFNKSB7CisJCS8qIENvbm5lY3Rpb25sZXNzIHNvY2tldCAqLworCQlsMmNhcF9waShzayktPnNjaWQgPSAweDAwMDI7CisJCWwyY2FwX3BpKHNrKS0+ZGNpZCA9IDB4MDAwMjsKKwkJbDJjYXBfcGkoc2spLT5vbXR1ID0gTDJDQVBfREVGQVVMVF9NVFU7CisJfSBlbHNlIHsKKwkJLyogUmF3IHNvY2tldCBjYW4gc2VuZC9yZWN2IHNpZ25hbGxpbmcgbWVzc2FnZXMgb25seSAqLworCQlsMmNhcF9waShzayktPnNjaWQgPSAweDAwMDE7CisJCWwyY2FwX3BpKHNrKS0+ZGNpZCA9IDB4MDAwMTsKKwkJbDJjYXBfcGkoc2spLT5vbXR1ID0gTDJDQVBfREVGQVVMVF9NVFU7CisJfQorCisJX19sMmNhcF9jaGFuX2xpbmsobCwgc2spOworCisJaWYgKHBhcmVudCkKKwkJYnRfYWNjZXB0X2VucXVldWUocGFyZW50LCBzayk7Cit9CisKKy8qIERlbGV0ZSBjaGFubmVsLiAKKyAqIE11c3QgYmUgY2FsbGVkIG9uIHRoZSBsb2NrZWQgc29ja2V0LiAqLworc3RhdGljIHZvaWQgbDJjYXBfY2hhbl9kZWwoc3RydWN0IHNvY2sgKnNrLCBpbnQgZXJyKQoreworCXN0cnVjdCBsMmNhcF9jb25uICpjb25uID0gbDJjYXBfcGkoc2spLT5jb25uOworCXN0cnVjdCBzb2NrICpwYXJlbnQgPSBidF9zayhzayktPnBhcmVudDsKKworCWwyY2FwX3NvY2tfY2xlYXJfdGltZXIoc2spOworCisJQlRfREJHKCJzayAlcCwgY29ubiAlcCwgZXJyICVkIiwgc2ssIGNvbm4sIGVycik7CisKKwlpZiAoY29ubikgeyAKKwkJLyogVW5saW5rIGZyb20gY2hhbm5lbCBsaXN0ICovCisJCWwyY2FwX2NoYW5fdW5saW5rKCZjb25uLT5jaGFuX2xpc3QsIHNrKTsKKwkJbDJjYXBfcGkoc2spLT5jb25uID0gTlVMTDsKKwkJaGNpX2Nvbm5fcHV0KGNvbm4tPmhjb24pOworCX0KKworCXNrLT5za19zdGF0ZSAgPSBCVF9DTE9TRUQ7CisJc29ja19zZXRfZmxhZyhzaywgU09DS19aQVBQRUQpOworCisJaWYgKGVycikKKwkJc2stPnNrX2VyciA9IGVycjsKKworCWlmIChwYXJlbnQpIHsKKwkJYnRfYWNjZXB0X3VubGluayhzayk7CisJCXBhcmVudC0+c2tfZGF0YV9yZWFkeShwYXJlbnQsIDApOworCX0gZWxzZQorCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKK30KKworc3RhdGljIHZvaWQgbDJjYXBfY29ubl9yZWFkeShzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubikKK3sKKwlzdHJ1Y3QgbDJjYXBfY2hhbl9saXN0ICpsID0gJmNvbm4tPmNoYW5fbGlzdDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlCVF9EQkcoImNvbm4gJXAiLCBjb25uKTsKKworCXJlYWRfbG9jaygmbC0+bG9jayk7CisKKwlmb3IgKHNrID0gbC0+aGVhZDsgc2s7IHNrID0gbDJjYXBfcGkoc2spLT5uZXh0X2MpIHsKKwkJYmhfbG9ja19zb2NrKHNrKTsKKworCQlpZiAoc2stPnNrX3R5cGUgIT0gU09DS19TRVFQQUNLRVQpIHsKKwkJCWwyY2FwX3NvY2tfY2xlYXJfdGltZXIoc2spOworCQkJc2stPnNrX3N0YXRlID0gQlRfQ09OTkVDVEVEOworCQkJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisJCX0gZWxzZSBpZiAoc2stPnNrX3N0YXRlID09IEJUX0NPTk5FQ1QpIHsKKwkJCXN0cnVjdCBsMmNhcF9jb25uX3JlcSByZXE7CisJCQlsMmNhcF9waShzayktPmlkZW50ID0gbDJjYXBfZ2V0X2lkZW50KGNvbm4pOworCQkJcmVxLnNjaWQgPSBfX2NwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+c2NpZCk7CisJCQlyZXEucHNtICA9IGwyY2FwX3BpKHNrKS0+cHNtOworCQkJbDJjYXBfc2VuZF9jbWQoY29ubiwgbDJjYXBfcGkoc2spLT5pZGVudCwgTDJDQVBfQ09OTl9SRVEsIHNpemVvZihyZXEpLCAmcmVxKTsKKwkJfQorCisJCWJoX3VubG9ja19zb2NrKHNrKTsKKwl9CisKKwlyZWFkX3VubG9jaygmbC0+bG9jayk7Cit9CisKKy8qIE5vdGlmeSBzb2NrZXRzIHRoYXQgd2UgY2Fubm90IGd1YXJhbnR5IHJlbGlhYmlsaXR5IGFueW1vcmUgKi8KK3N0YXRpYyB2b2lkIGwyY2FwX2Nvbm5fdW5yZWxpYWJsZShzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgaW50IGVycikKK3sKKwlzdHJ1Y3QgbDJjYXBfY2hhbl9saXN0ICpsID0gJmNvbm4tPmNoYW5fbGlzdDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlCVF9EQkcoImNvbm4gJXAiLCBjb25uKTsKKworCXJlYWRfbG9jaygmbC0+bG9jayk7CisJZm9yIChzayA9IGwtPmhlYWQ7IHNrOyBzayA9IGwyY2FwX3BpKHNrKS0+bmV4dF9jKSB7CisJCWlmIChsMmNhcF9waShzayktPmxpbmtfbW9kZSAmIEwyQ0FQX0xNX1JFTElBQkxFKQorCQkJc2stPnNrX2VyciA9IGVycjsKKwl9CisJcmVhZF91bmxvY2soJmwtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBsMmNhcF9jaGFuX3JlYWR5KHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3Qgc29jayAqcGFyZW50ID0gYnRfc2soc2spLT5wYXJlbnQ7CisKKwlCVF9EQkcoInNrICVwLCBwYXJlbnQgJXAiLCBzaywgcGFyZW50KTsKKworCWwyY2FwX3BpKHNrKS0+Y29uZl9zdGF0ZSA9IDA7CisJbDJjYXBfc29ja19jbGVhcl90aW1lcihzayk7CisKKwlpZiAoIXBhcmVudCkgeworCQkvKiBPdXRnb2luZyBjaGFubmVsLgorCQkgKiBXYWtlIHVwIHNvY2tldCBzbGVlcGluZyBvbiBjb25uZWN0LgorCQkgKi8KKwkJc2stPnNrX3N0YXRlID0gQlRfQ09OTkVDVEVEOworCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKKwl9IGVsc2UgeworCQkvKiBJbmNvbWluZyBjaGFubmVsLgorCQkgKiBXYWtlIHVwIHNvY2tldCBzbGVlcGluZyBvbiBhY2NlcHQuCisJCSAqLworCQlwYXJlbnQtPnNrX2RhdGFfcmVhZHkocGFyZW50LCAwKTsKKwl9Cit9CisKKy8qIENvcHkgZnJhbWUgdG8gYWxsIHJhdyBzb2NrZXRzIG9uIHRoYXQgY29ubmVjdGlvbiAqLworc3RhdGljIHZvaWQgbDJjYXBfcmF3X3JlY3Yoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGwyY2FwX2NoYW5fbGlzdCAqbCA9ICZjb25uLT5jaGFuX2xpc3Q7CisJc3RydWN0IHNrX2J1ZmYgKm5za2I7CisJc3RydWN0IHNvY2sgKiBzazsKKworCUJUX0RCRygiY29ubiAlcCIsIGNvbm4pOworCisJcmVhZF9sb2NrKCZsLT5sb2NrKTsKKwlmb3IgKHNrID0gbC0+aGVhZDsgc2s7IHNrID0gbDJjYXBfcGkoc2spLT5uZXh0X2MpIHsKKwkJaWYgKHNrLT5za190eXBlICE9IFNPQ0tfUkFXKQorCQkJY29udGludWU7CisKKwkJLyogRG9uJ3Qgc2VuZCBmcmFtZSB0byB0aGUgc29ja2V0IGl0IGNhbWUgZnJvbSAqLworCQlpZiAoc2tiLT5zayA9PSBzaykKKwkJCWNvbnRpbnVlOworCisJCWlmICghKG5za2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKSkpCisJCQljb250aW51ZTsKKworCQlpZiAoc29ja19xdWV1ZV9yY3Zfc2tiKHNrLCBuc2tiKSkKKwkJCWtmcmVlX3NrYihuc2tiKTsKKwl9CisJcmVhZF91bmxvY2soJmwtPmxvY2spOworfQorCisvKiAtLS0tIEwyQ0FQIHNpZ25hbGxpbmcgY29tbWFuZHMgLS0tLSAqLworc3RhdGljIHN0cnVjdCBza19idWZmICpsMmNhcF9idWlsZF9jbWQoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sCisJCQkJdTggY29kZSwgdTggaWRlbnQsIHUxNiBkbGVuLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBza19idWZmICpza2IsICoqZnJhZzsKKwlzdHJ1Y3QgbDJjYXBfY21kX2hkciAqY21kOworCXN0cnVjdCBsMmNhcF9oZHIgKmxoOworCWludCBsZW4sIGNvdW50OworCisJQlRfREJHKCJjb25uICVwLCBjb2RlIDB4JTIuMngsIGlkZW50IDB4JTIuMngsIGxlbiAlZCIsIGNvbm4sIGNvZGUsIGlkZW50LCBkbGVuKTsKKworCWxlbiA9IEwyQ0FQX0hEUl9TSVpFICsgTDJDQVBfQ01EX0hEUl9TSVpFICsgZGxlbjsKKwljb3VudCA9IG1pbl90KHVuc2lnbmVkIGludCwgY29ubi0+bXR1LCBsZW4pOworCisJc2tiID0gYnRfc2tiX2FsbG9jKGNvdW50LCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwlsaCA9IChzdHJ1Y3QgbDJjYXBfaGRyICopIHNrYl9wdXQoc2tiLCBMMkNBUF9IRFJfU0laRSk7CisJbGgtPmxlbiA9IF9fY3B1X3RvX2xlMTYoTDJDQVBfQ01EX0hEUl9TSVpFICsgZGxlbik7CisJbGgtPmNpZCA9IF9fY3B1X3RvX2xlMTYoMHgwMDAxKTsKKworCWNtZCA9IChzdHJ1Y3QgbDJjYXBfY21kX2hkciAqKSBza2JfcHV0KHNrYiwgTDJDQVBfQ01EX0hEUl9TSVpFKTsKKwljbWQtPmNvZGUgID0gY29kZTsKKwljbWQtPmlkZW50ID0gaWRlbnQ7CisJY21kLT5sZW4gICA9IF9fY3B1X3RvX2xlMTYoZGxlbik7CisKKwlpZiAoZGxlbikgeworCQljb3VudCAtPSBMMkNBUF9IRFJfU0laRSArIEwyQ0FQX0NNRF9IRFJfU0laRTsKKwkJbWVtY3B5KHNrYl9wdXQoc2tiLCBjb3VudCksIGRhdGEsIGNvdW50KTsKKwkJZGF0YSArPSBjb3VudDsKKwl9CisKKwlsZW4gLT0gc2tiLT5sZW47CisKKwkvKiBDb250aW51YXRpb24gZnJhZ21lbnRzIChubyBMMkNBUCBoZWFkZXIpICovCisJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKKwl3aGlsZSAobGVuKSB7CisJCWNvdW50ID0gbWluX3QodW5zaWduZWQgaW50LCBjb25uLT5tdHUsIGxlbik7CisKKwkJKmZyYWcgPSBidF9za2JfYWxsb2MoY291bnQsIEdGUF9BVE9NSUMpOworCQlpZiAoISpmcmFnKQorCQkJZ290byBmYWlsOworCisJCW1lbWNweShza2JfcHV0KCpmcmFnLCBjb3VudCksIGRhdGEsIGNvdW50KTsKKworCQlsZW4gIC09IGNvdW50OworCQlkYXRhICs9IGNvdW50OworCisJCWZyYWcgPSAmKCpmcmFnKS0+bmV4dDsKKwl9CisKKwlyZXR1cm4gc2tiOworCitmYWlsOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGludCBsMmNhcF9nZXRfY29uZl9vcHQodm9pZCAqKnB0ciwgaW50ICp0eXBlLCBpbnQgKm9sZW4sIHVuc2lnbmVkIGxvbmcgKnZhbCkKK3sKKwlzdHJ1Y3QgbDJjYXBfY29uZl9vcHQgKm9wdCA9ICpwdHI7CisJaW50IGxlbjsKKworCWxlbiA9IEwyQ0FQX0NPTkZfT1BUX1NJWkUgKyBvcHQtPmxlbjsKKwkqcHRyICs9IGxlbjsKKworCSp0eXBlID0gb3B0LT50eXBlOworCSpvbGVuID0gb3B0LT5sZW47CisKKwlzd2l0Y2ggKG9wdC0+bGVuKSB7CisJY2FzZSAxOgorCQkqdmFsID0gKigodTggKikgb3B0LT52YWwpOworCQlicmVhazsKKworCWNhc2UgMjoKKwkJKnZhbCA9IF9fbGUxNl90b19jcHUoKigodTE2ICopb3B0LT52YWwpKTsKKwkJYnJlYWs7CisKKwljYXNlIDQ6CisJCSp2YWwgPSBfX2xlMzJfdG9fY3B1KCooKHUzMiAqKW9wdC0+dmFsKSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJKnZhbCA9ICh1bnNpZ25lZCBsb25nKSBvcHQtPnZhbDsKKwkJYnJlYWs7CisJfQorCisJQlRfREJHKCJ0eXBlIDB4JTIuMnggbGVuICVkIHZhbCAweCVseCIsICp0eXBlLCBvcHQtPmxlbiwgKnZhbCk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGwyY2FwX3BhcnNlX2NvbmZfcmVxKHN0cnVjdCBzb2NrICpzaywgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwlpbnQgdHlwZSwgaGludCwgb2xlbjsgCisJdW5zaWduZWQgbG9uZyB2YWw7CisJdm9pZCAqcHRyID0gZGF0YTsKKworCUJUX0RCRygic2sgJXAgbGVuICVkIiwgc2ssIGxlbik7CisKKwl3aGlsZSAobGVuID49IEwyQ0FQX0NPTkZfT1BUX1NJWkUpIHsKKwkJbGVuIC09IGwyY2FwX2dldF9jb25mX29wdCgmcHRyLCAmdHlwZSwgJm9sZW4sICZ2YWwpOworCisJCWhpbnQgID0gdHlwZSAmIDB4ODA7CisJCXR5cGUgJj0gMHg3ZjsKKworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBMMkNBUF9DT05GX01UVToKKwkJCWwyY2FwX3BpKHNrKS0+Y29uZl9tdHUgPSB2YWw7CisJCQlicmVhazsKKworCQljYXNlIEwyQ0FQX0NPTkZfRkxVU0hfVE86CisJCQlsMmNhcF9waShzayktPmZsdXNoX3RvID0gdmFsOworCQkJYnJlYWs7CisKKwkJY2FzZSBMMkNBUF9DT05GX1FPUzoKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlpZiAoaGludCkKKwkJCQlicmVhazsKKworCQkJLyogRklYTUU6IFJlamVjdCB1bmtub3duIG9wdGlvbiAqLworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGwyY2FwX2FkZF9jb25mX29wdCh2b2lkICoqcHRyLCB1OCB0eXBlLCB1OCBsZW4sIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCXN0cnVjdCBsMmNhcF9jb25mX29wdCAqb3B0ID0gKnB0cjsKKworCUJUX0RCRygidHlwZSAweCUyLjJ4IGxlbiAlZCB2YWwgMHglbHgiLCB0eXBlLCBsZW4sIHZhbCk7CisKKwlvcHQtPnR5cGUgPSB0eXBlOworCW9wdC0+bGVuICA9IGxlbjsKKworCXN3aXRjaCAobGVuKSB7CisJY2FzZSAxOgorCQkqKCh1OCAqKSBvcHQtPnZhbCkgID0gdmFsOworCQlicmVhazsKKworCWNhc2UgMjoKKwkJKigodTE2ICopIG9wdC0+dmFsKSA9IF9fY3B1X3RvX2xlMTYodmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIDQ6CisJCSooKHUzMiAqKSBvcHQtPnZhbCkgPSBfX2NwdV90b19sZTMyKHZhbCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJbWVtY3B5KG9wdC0+dmFsLCAodm9pZCAqKSB2YWwsIGxlbik7CisJCWJyZWFrOworCX0KKworCSpwdHIgKz0gTDJDQVBfQ09ORl9PUFRfU0laRSArIGxlbjsKK30KKworc3RhdGljIGludCBsMmNhcF9idWlsZF9jb25mX3JlcShzdHJ1Y3Qgc29jayAqc2ssIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGwyY2FwX3BpbmZvICpwaSA9IGwyY2FwX3BpKHNrKTsKKwlzdHJ1Y3QgbDJjYXBfY29uZl9yZXEgKnJlcSA9IGRhdGE7CisJdm9pZCAqcHRyID0gcmVxLT5kYXRhOworCisJQlRfREJHKCJzayAlcCIsIHNrKTsKKworCWlmIChwaS0+aW10dSAhPSBMMkNBUF9ERUZBVUxUX01UVSkKKwkJbDJjYXBfYWRkX2NvbmZfb3B0KCZwdHIsIEwyQ0FQX0NPTkZfTVRVLCAyLCBwaS0+aW10dSk7CisKKwkvKiBGSVhNRTogTmVlZCBhY3R1YWwgdmFsdWUgb2YgdGhlIGZsdXNoIHRpbWVvdXQgKi8KKwkvL2lmIChmbHVzaF90byAhPSBMMkNBUF9ERUZBVUxUX0ZMVVNIX1RPKQorCS8vICAgbDJjYXBfYWRkX2NvbmZfb3B0KCZwdHIsIEwyQ0FQX0NPTkZfRkxVU0hfVE8sIDIsIHBpLT5mbHVzaF90byk7CisKKwlyZXEtPmRjaWQgID0gX19jcHVfdG9fbGUxNihwaS0+ZGNpZCk7CisJcmVxLT5mbGFncyA9IF9fY3B1X3RvX2xlMTYoMCk7CisKKwlyZXR1cm4gcHRyIC0gZGF0YTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbDJjYXBfY29uZl9vdXRwdXQoc3RydWN0IHNvY2sgKnNrLCB2b2lkICoqcHRyKQoreworCXN0cnVjdCBsMmNhcF9waW5mbyAqcGkgPSBsMmNhcF9waShzayk7CisJaW50IHJlc3VsdCA9IDA7CisKKwkvKiBDb25maWd1cmUgb3V0cHV0IG9wdGlvbnMgYW5kIGxldCB0aGUgb3RoZXIgc2lkZSBrbm93CisJICogd2hpY2ggb25lcyB3ZSBkb24ndCBsaWtlLiAqLworCWlmIChwaS0+Y29uZl9tdHUgPCBwaS0+b210dSkgeworCQlsMmNhcF9hZGRfY29uZl9vcHQocHRyLCBMMkNBUF9DT05GX01UVSwgMiwgcGktPm9tdHUpOworCQlyZXN1bHQgPSBMMkNBUF9DT05GX1VOQUNDRVBUOworCX0gZWxzZSB7CisJCXBpLT5vbXR1ID0gcGktPmNvbmZfbXR1OworCX0KKworCUJUX0RCRygic2sgJXAgcmVzdWx0ICVkIiwgc2ssIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBsMmNhcF9idWlsZF9jb25mX3JzcChzdHJ1Y3Qgc29jayAqc2ssIHZvaWQgKmRhdGEsIGludCAqcmVzdWx0KQoreworCXN0cnVjdCBsMmNhcF9jb25mX3JzcCAqcnNwID0gZGF0YTsKKwl2b2lkICpwdHIgPSByc3AtPmRhdGE7CisJdTE2IGZsYWdzID0gMDsKKworCUJUX0RCRygic2sgJXAgY29tcGxldGUgJWQiLCBzaywgcmVzdWx0ID8gMSA6IDApOworCisJaWYgKHJlc3VsdCkKKwkJKnJlc3VsdCA9IGwyY2FwX2NvbmZfb3V0cHV0KHNrLCAmcHRyKTsKKwllbHNlCisJCWZsYWdzID0gMHgwMDAxOworCisJcnNwLT5zY2lkICAgPSBfX2NwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+ZGNpZCk7CisJcnNwLT5yZXN1bHQgPSBfX2NwdV90b19sZTE2KHJlc3VsdCA/ICpyZXN1bHQgOiAwKTsKKwlyc3AtPmZsYWdzICA9IF9fY3B1X3RvX2xlMTYoZmxhZ3MpOworCisJcmV0dXJuIHB0ciAtIGRhdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGwyY2FwX2Nvbm5lY3RfcmVxKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLCBzdHJ1Y3QgbDJjYXBfY21kX2hkciAqY21kLCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbDJjYXBfY2hhbl9saXN0ICpsaXN0ID0gJmNvbm4tPmNoYW5fbGlzdDsKKwlzdHJ1Y3QgbDJjYXBfY29ubl9yZXEgKnJlcSA9IChzdHJ1Y3QgbDJjYXBfY29ubl9yZXEgKikgZGF0YTsKKwlzdHJ1Y3QgbDJjYXBfY29ubl9yc3AgcnNwOworCXN0cnVjdCBzb2NrICpzaywgKnBhcmVudDsKKwlpbnQgcmVzdWx0ID0gMCwgc3RhdHVzID0gMDsKKworCXUxNiBkY2lkID0gMCwgc2NpZCA9IF9fbGUxNl90b19jcHUocmVxLT5zY2lkKTsKKwl1MTYgcHNtICA9IHJlcS0+cHNtOworCisJQlRfREJHKCJwc20gMHglMi4yeCBzY2lkIDB4JTQuNHgiLCBwc20sIHNjaWQpOworCisJLyogQ2hlY2sgaWYgd2UgaGF2ZSBzb2NrZXQgbGlzdGVuaW5nIG9uIHBzbSAqLworCXBhcmVudCA9IGwyY2FwX2dldF9zb2NrX2J5X3BzbShCVF9MSVNURU4sIHBzbSwgY29ubi0+c3JjKTsKKwlpZiAoIXBhcmVudCkgeworCQlyZXN1bHQgPSBMMkNBUF9DUl9CQURfUFNNOworCQlnb3RvIHNlbmRyZXNwOworCX0KKworCXJlc3VsdCA9IEwyQ0FQX0NSX05PX01FTTsKKworCS8qIENoZWNrIGZvciBiYWNrbG9nIHNpemUgKi8KKwlpZiAoc2tfYWNjZXB0cV9pc19mdWxsKHBhcmVudCkpIHsKKwkJQlRfREJHKCJiYWNrbG9nIGZ1bGwgJWQiLCBwYXJlbnQtPnNrX2Fja19iYWNrbG9nKTsgCisJCWdvdG8gcmVzcG9uc2U7CisJfQorCisJc2sgPSBsMmNhcF9zb2NrX2FsbG9jKE5VTEwsIEJUUFJPVE9fTDJDQVAsIEdGUF9BVE9NSUMpOworCWlmICghc2spCisJCWdvdG8gcmVzcG9uc2U7CisKKwl3cml0ZV9sb2NrKCZsaXN0LT5sb2NrKTsKKworCS8qIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBjaGFubmVsIHdpdGggdGhhdCBkY2lkICovCisJaWYgKF9fbDJjYXBfZ2V0X2NoYW5fYnlfZGNpZChsaXN0LCBzY2lkKSkgeworCQl3cml0ZV91bmxvY2soJmxpc3QtPmxvY2spOworCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX1pBUFBFRCk7CisJCWwyY2FwX3NvY2tfa2lsbChzayk7CisJCWdvdG8gcmVzcG9uc2U7CisJfQorCisJaGNpX2Nvbm5faG9sZChjb25uLT5oY29uKTsKKworCWwyY2FwX3NvY2tfaW5pdChzaywgcGFyZW50KTsKKwliYWNweSgmYnRfc2soc2spLT5zcmMsIGNvbm4tPnNyYyk7CisJYmFjcHkoJmJ0X3NrKHNrKS0+ZHN0LCBjb25uLT5kc3QpOworCWwyY2FwX3BpKHNrKS0+cHNtICA9IHBzbTsKKwlsMmNhcF9waShzayktPmRjaWQgPSBzY2lkOworCisJX19sMmNhcF9jaGFuX2FkZChjb25uLCBzaywgcGFyZW50KTsKKwlkY2lkID0gbDJjYXBfcGkoc2spLT5zY2lkOworCisJbDJjYXBfc29ja19zZXRfdGltZXIoc2ssIHNrLT5za19zbmR0aW1lbyk7CisKKwkvKiBTZXJ2aWNlIGxldmVsIHNlY3VyaXR5ICovCisJcmVzdWx0ID0gTDJDQVBfQ1JfUEVORDsKKwlzdGF0dXMgPSBMMkNBUF9DU19BVVRIRU5fUEVORDsKKwlzay0+c2tfc3RhdGUgPSBCVF9DT05ORUNUMjsKKwlsMmNhcF9waShzayktPmlkZW50ID0gY21kLT5pZGVudDsKKworCWlmICgobDJjYXBfcGkoc2spLT5saW5rX21vZGUgJiBMMkNBUF9MTV9FTkNSWVBUKSB8fAorCQkJKGwyY2FwX3BpKHNrKS0+bGlua19tb2RlICYgTDJDQVBfTE1fU0VDVVJFKSkgeworCQlpZiAoIWhjaV9jb25uX2VuY3J5cHQoY29ubi0+aGNvbikpCisJCQlnb3RvIGRvbmU7CisJfSBlbHNlIGlmIChsMmNhcF9waShzayktPmxpbmtfbW9kZSAmIEwyQ0FQX0xNX0FVVEgpIHsKKwkJaWYgKCFoY2lfY29ubl9hdXRoKGNvbm4tPmhjb24pKQorCQkJZ290byBkb25lOworCX0KKworCXNrLT5za19zdGF0ZSA9IEJUX0NPTkZJRzsKKwlyZXN1bHQgPSBzdGF0dXMgPSAwOworCitkb25lOgorCXdyaXRlX3VubG9jaygmbGlzdC0+bG9jayk7CisKK3Jlc3BvbnNlOgorCWJoX3VubG9ja19zb2NrKHBhcmVudCk7CisKK3NlbmRyZXNwOgorCXJzcC5zY2lkICAgPSBfX2NwdV90b19sZTE2KHNjaWQpOworCXJzcC5kY2lkICAgPSBfX2NwdV90b19sZTE2KGRjaWQpOworCXJzcC5yZXN1bHQgPSBfX2NwdV90b19sZTE2KHJlc3VsdCk7CisJcnNwLnN0YXR1cyA9IF9fY3B1X3RvX2xlMTYoc3RhdHVzKTsKKwlsMmNhcF9zZW5kX2NtZChjb25uLCBjbWQtPmlkZW50LCBMMkNBUF9DT05OX1JTUCwgc2l6ZW9mKHJzcCksICZyc3ApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBsMmNhcF9jb25uZWN0X3JzcChzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgc3RydWN0IGwyY2FwX2NtZF9oZHIgKmNtZCwgdTggKmRhdGEpCit7CisJc3RydWN0IGwyY2FwX2Nvbm5fcnNwICpyc3AgPSAoc3RydWN0IGwyY2FwX2Nvbm5fcnNwICopIGRhdGE7CisJdTE2IHNjaWQsIGRjaWQsIHJlc3VsdCwgc3RhdHVzOworCXN0cnVjdCBzb2NrICpzazsKKwl1OCByZXFbMTI4XTsKKworCXNjaWQgICA9IF9fbGUxNl90b19jcHUocnNwLT5zY2lkKTsKKwlkY2lkICAgPSBfX2xlMTZfdG9fY3B1KHJzcC0+ZGNpZCk7CisJcmVzdWx0ID0gX19sZTE2X3RvX2NwdShyc3AtPnJlc3VsdCk7CisJc3RhdHVzID0gX19sZTE2X3RvX2NwdShyc3AtPnN0YXR1cyk7CisKKwlCVF9EQkcoImRjaWQgMHglNC40eCBzY2lkIDB4JTQuNHggcmVzdWx0IDB4JTIuMnggc3RhdHVzIDB4JTIuMngiLCBkY2lkLCBzY2lkLCByZXN1bHQsIHN0YXR1cyk7CisKKwlpZiAoc2NpZCkgeworCQlpZiAoIShzayA9IGwyY2FwX2dldF9jaGFuX2J5X3NjaWQoJmNvbm4tPmNoYW5fbGlzdCwgc2NpZCkpKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJaWYgKCEoc2sgPSBsMmNhcF9nZXRfY2hhbl9ieV9pZGVudCgmY29ubi0+Y2hhbl9saXN0LCBjbWQtPmlkZW50KSkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKHJlc3VsdCkgeworCWNhc2UgTDJDQVBfQ1JfU1VDQ0VTUzoKKwkJc2stPnNrX3N0YXRlID0gQlRfQ09ORklHOworCQlsMmNhcF9waShzayktPmlkZW50ID0gMDsKKwkJbDJjYXBfcGkoc2spLT5kY2lkID0gZGNpZDsKKwkJbDJjYXBfcGkoc2spLT5jb25mX3N0YXRlIHw9IEwyQ0FQX0NPTkZfUkVRX1NFTlQ7CisKKwkJbDJjYXBfc2VuZF9jbWQoY29ubiwgbDJjYXBfZ2V0X2lkZW50KGNvbm4pLCBMMkNBUF9DT05GX1JFUSwKKwkJCQkJbDJjYXBfYnVpbGRfY29uZl9yZXEoc2ssIHJlcSksIHJlcSk7CisJCWJyZWFrOworCisJY2FzZSBMMkNBUF9DUl9QRU5EOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWwyY2FwX2NoYW5fZGVsKHNrLCBFQ09OTlJFRlVTRUQpOworCQlicmVhazsKKwl9CisKKwliaF91bmxvY2tfc29jayhzayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGwyY2FwX2NvbmZpZ19yZXEoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHN0cnVjdCBsMmNhcF9jbWRfaGRyICpjbWQsIHU4ICpkYXRhKQoreworCXN0cnVjdCBsMmNhcF9jb25mX3JlcSAqcmVxID0gKHN0cnVjdCBsMmNhcF9jb25mX3JlcSAqKSBkYXRhOworCXUxNiBkY2lkLCBmbGFnczsKKwl1OCByc3BbNjRdOworCXN0cnVjdCBzb2NrICpzazsKKwlpbnQgcmVzdWx0OworCisJZGNpZCAgPSBfX2xlMTZfdG9fY3B1KHJlcS0+ZGNpZCk7CisJZmxhZ3MgPSBfX2xlMTZfdG9fY3B1KHJlcS0+ZmxhZ3MpOworCisJQlRfREJHKCJkY2lkIDB4JTQuNHggZmxhZ3MgMHglMi4yeCIsIGRjaWQsIGZsYWdzKTsKKworCWlmICghKHNrID0gbDJjYXBfZ2V0X2NoYW5fYnlfc2NpZCgmY29ubi0+Y2hhbl9saXN0LCBkY2lkKSkpCisJCXJldHVybiAtRU5PRU5UOworCisJbDJjYXBfcGFyc2VfY29uZl9yZXEoc2ssIHJlcS0+ZGF0YSwgY21kLT5sZW4gLSBzaXplb2YoKnJlcSkpOworCisJaWYgKGZsYWdzICYgMHgwMDAxKSB7CisJCS8qIEluY29tcGxldGUgY29uZmlnLiBTZW5kIGVtcHR5IHJlc3BvbnNlLiAqLworCQlsMmNhcF9zZW5kX2NtZChjb25uLCBjbWQtPmlkZW50LCBMMkNBUF9DT05GX1JTUCwKKwkJCQlsMmNhcF9idWlsZF9jb25mX3JzcChzaywgcnNwLCBOVUxMKSwgcnNwKTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJLyogQ29tcGxldGUgY29uZmlnLiAqLworCWwyY2FwX3NlbmRfY21kKGNvbm4sIGNtZC0+aWRlbnQsIEwyQ0FQX0NPTkZfUlNQLAorCQkJbDJjYXBfYnVpbGRfY29uZl9yc3Aoc2ssIHJzcCwgJnJlc3VsdCksIHJzcCk7CisKKwlpZiAocmVzdWx0KQorCQlnb3RvIHVubG9jazsKKworCS8qIE91dHB1dCBjb25maWcgZG9uZSAqLworCWwyY2FwX3BpKHNrKS0+Y29uZl9zdGF0ZSB8PSBMMkNBUF9DT05GX09VVFBVVF9ET05FOworCisJaWYgKGwyY2FwX3BpKHNrKS0+Y29uZl9zdGF0ZSAmIEwyQ0FQX0NPTkZfSU5QVVRfRE9ORSkgeworCQlzay0+c2tfc3RhdGUgPSBCVF9DT05ORUNURUQ7CisJCWwyY2FwX2NoYW5fcmVhZHkoc2spOworCX0gZWxzZSBpZiAoIShsMmNhcF9waShzayktPmNvbmZfc3RhdGUgJiBMMkNBUF9DT05GX1JFUV9TRU5UKSkgeworCQl1OCByZXFbNjRdOworCQlsMmNhcF9zZW5kX2NtZChjb25uLCBsMmNhcF9nZXRfaWRlbnQoY29ubiksIEwyQ0FQX0NPTkZfUkVRLAorCQkJCQlsMmNhcF9idWlsZF9jb25mX3JlcShzaywgcmVxKSwgcmVxKTsKKwl9CisKK3VubG9jazoKKwliaF91bmxvY2tfc29jayhzayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGwyY2FwX2NvbmZpZ19yc3Aoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHN0cnVjdCBsMmNhcF9jbWRfaGRyICpjbWQsIHU4ICpkYXRhKQoreworCXN0cnVjdCBsMmNhcF9jb25mX3JzcCAqcnNwID0gKHN0cnVjdCBsMmNhcF9jb25mX3JzcCAqKWRhdGE7CisJdTE2IHNjaWQsIGZsYWdzLCByZXN1bHQ7CisJc3RydWN0IHNvY2sgKnNrOworCisJc2NpZCAgID0gX19sZTE2X3RvX2NwdShyc3AtPnNjaWQpOworCWZsYWdzICA9IF9fbGUxNl90b19jcHUocnNwLT5mbGFncyk7CisJcmVzdWx0ID0gX19sZTE2X3RvX2NwdShyc3AtPnJlc3VsdCk7CisKKwlCVF9EQkcoInNjaWQgMHglNC40eCBmbGFncyAweCUyLjJ4IHJlc3VsdCAweCUyLjJ4Iiwgc2NpZCwgZmxhZ3MsIHJlc3VsdCk7CisKKwlpZiAoIShzayA9IGwyY2FwX2dldF9jaGFuX2J5X3NjaWQoJmNvbm4tPmNoYW5fbGlzdCwgc2NpZCkpKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAocmVzdWx0KSB7CisJY2FzZSBMMkNBUF9DT05GX1NVQ0NFU1M6CisJCWJyZWFrOworCisJY2FzZSBMMkNBUF9DT05GX1VOQUNDRVBUOgorCQlpZiAoKytsMmNhcF9waShzayktPmNvbmZfcmV0cnkgPCBMMkNBUF9DT05GX01BWF9SRVRSSUVTKSB7CisJCQljaGFyIHJlcVsxMjhdOworCQkJLyogSXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBhZGp1c3QgTDJDQVAgcGFyYW1ldGVycworCQkJICogdGhhdCBhcmUgY3VycmVudGx5IGRlZmluZWQgaW4gdGhlIHNwZWMuIFdlIHNpbXBseQorCQkJICogcmVzZW5kIGNvbmZpZyByZXF1ZXN0IHRoYXQgd2Ugc2VudCBlYXJsaWVyLiBJdCBpcworCQkJICogc3R1cGlkLCBidXQgaXQgaGVscHMgcXVhbGlmaWNhdGlvbiB0ZXN0aW5nIHdoaWNoCisJCQkgKiBleHBlY3RzIGF0IGxlYXN0IHNvbWUgcmVzcG9uc2UgZnJvbSB1cy4gKi8KKwkJCWwyY2FwX3NlbmRfY21kKGNvbm4sIGwyY2FwX2dldF9pZGVudChjb25uKSwgTDJDQVBfQ09ORl9SRVEsCisJCQkJCQlsMmNhcF9idWlsZF9jb25mX3JlcShzaywgcmVxKSwgcmVxKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJZGVmYXVsdDogCisJCXNrLT5za19zdGF0ZSA9IEJUX0RJU0NPTk47CisJCXNrLT5za19lcnIgICA9IEVDT05OUkVTRVQ7CisJCWwyY2FwX3NvY2tfc2V0X3RpbWVyKHNrLCBIWiAqIDUpOworCQl7CisJCQlzdHJ1Y3QgbDJjYXBfZGlzY29ubl9yZXEgcmVxOworCQkJcmVxLmRjaWQgPSBfX2NwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+ZGNpZCk7CisJCQlyZXEuc2NpZCA9IF9fY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5zY2lkKTsKKwkJCWwyY2FwX3NlbmRfY21kKGNvbm4sIGwyY2FwX2dldF9pZGVudChjb25uKSwKKwkJCQkJTDJDQVBfRElTQ09OTl9SRVEsIHNpemVvZihyZXEpLCAmcmVxKTsKKwkJfQorCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGZsYWdzICYgMHgwMSkKKwkJZ290byBkb25lOworCisJLyogSW5wdXQgY29uZmlnIGRvbmUgKi8KKwlsMmNhcF9waShzayktPmNvbmZfc3RhdGUgfD0gTDJDQVBfQ09ORl9JTlBVVF9ET05FOworCisJaWYgKGwyY2FwX3BpKHNrKS0+Y29uZl9zdGF0ZSAmIEwyQ0FQX0NPTkZfT1VUUFVUX0RPTkUpIHsKKwkJc2stPnNrX3N0YXRlID0gQlRfQ09OTkVDVEVEOworCQlsMmNhcF9jaGFuX3JlYWR5KHNrKTsKKwl9CisKK2RvbmU6CisJYmhfdW5sb2NrX3NvY2soc2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBsMmNhcF9kaXNjb25uZWN0X3JlcShzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgc3RydWN0IGwyY2FwX2NtZF9oZHIgKmNtZCwgdTggKmRhdGEpCit7CisJc3RydWN0IGwyY2FwX2Rpc2Nvbm5fcmVxICpyZXEgPSAoc3RydWN0IGwyY2FwX2Rpc2Nvbm5fcmVxICopIGRhdGE7CisJc3RydWN0IGwyY2FwX2Rpc2Nvbm5fcnNwIHJzcDsKKwl1MTYgZGNpZCwgc2NpZDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlzY2lkID0gX19sZTE2X3RvX2NwdShyZXEtPnNjaWQpOworCWRjaWQgPSBfX2xlMTZfdG9fY3B1KHJlcS0+ZGNpZCk7CisKKwlCVF9EQkcoInNjaWQgMHglNC40eCBkY2lkIDB4JTQuNHgiLCBzY2lkLCBkY2lkKTsKKworCWlmICghKHNrID0gbDJjYXBfZ2V0X2NoYW5fYnlfc2NpZCgmY29ubi0+Y2hhbl9saXN0LCBkY2lkKSkpCisJCXJldHVybiAwOworCisJcnNwLmRjaWQgPSBfX2NwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+c2NpZCk7CisJcnNwLnNjaWQgPSBfX2NwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+ZGNpZCk7CisJbDJjYXBfc2VuZF9jbWQoY29ubiwgY21kLT5pZGVudCwgTDJDQVBfRElTQ09OTl9SU1AsIHNpemVvZihyc3ApLCAmcnNwKTsKKworCXNrLT5za19zaHV0ZG93biA9IFNIVVRET1dOX01BU0s7CisKKwlsMmNhcF9jaGFuX2RlbChzaywgRUNPTk5SRVNFVCk7CisJYmhfdW5sb2NrX3NvY2soc2spOworCisJbDJjYXBfc29ja19raWxsKHNrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbDJjYXBfZGlzY29ubmVjdF9yc3Aoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHN0cnVjdCBsMmNhcF9jbWRfaGRyICpjbWQsIHU4ICpkYXRhKQoreworCXN0cnVjdCBsMmNhcF9kaXNjb25uX3JzcCAqcnNwID0gKHN0cnVjdCBsMmNhcF9kaXNjb25uX3JzcCAqKSBkYXRhOworCXUxNiBkY2lkLCBzY2lkOworCXN0cnVjdCBzb2NrICpzazsKKworCXNjaWQgPSBfX2xlMTZfdG9fY3B1KHJzcC0+c2NpZCk7CisJZGNpZCA9IF9fbGUxNl90b19jcHUocnNwLT5kY2lkKTsKKworCUJUX0RCRygiZGNpZCAweCU0LjR4IHNjaWQgMHglNC40eCIsIGRjaWQsIHNjaWQpOworCisJaWYgKCEoc2sgPSBsMmNhcF9nZXRfY2hhbl9ieV9zY2lkKCZjb25uLT5jaGFuX2xpc3QsIHNjaWQpKSkKKwkJcmV0dXJuIDA7CisKKwlsMmNhcF9jaGFuX2RlbChzaywgMCk7CisJYmhfdW5sb2NrX3NvY2soc2spOworCisJbDJjYXBfc29ja19raWxsKHNrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbDJjYXBfaW5mb3JtYXRpb25fcmVxKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLCBzdHJ1Y3QgbDJjYXBfY21kX2hkciAqY21kLCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbDJjYXBfaW5mb19yZXEgKnJlcSA9IChzdHJ1Y3QgbDJjYXBfaW5mb19yZXEgKikgZGF0YTsKKwlzdHJ1Y3QgbDJjYXBfaW5mb19yc3AgcnNwOworCXUxNiB0eXBlOworCisJdHlwZSA9IF9fbGUxNl90b19jcHUocmVxLT50eXBlKTsKKworCUJUX0RCRygidHlwZSAweCU0LjR4IiwgdHlwZSk7CisKKwlyc3AudHlwZSAgID0gX19jcHVfdG9fbGUxNih0eXBlKTsKKwlyc3AucmVzdWx0ID0gX19jcHVfdG9fbGUxNihMMkNBUF9JUl9OT1RTVVBQKTsKKwlsMmNhcF9zZW5kX2NtZChjb25uLCBjbWQtPmlkZW50LCBMMkNBUF9JTkZPX1JTUCwgc2l6ZW9mKHJzcCksICZyc3ApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGwyY2FwX2luZm9ybWF0aW9uX3JzcChzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgc3RydWN0IGwyY2FwX2NtZF9oZHIgKmNtZCwgdTggKmRhdGEpCit7CisJc3RydWN0IGwyY2FwX2luZm9fcnNwICpyc3AgPSAoc3RydWN0IGwyY2FwX2luZm9fcnNwICopIGRhdGE7CisJdTE2IHR5cGUsIHJlc3VsdDsKKworCXR5cGUgICA9IF9fbGUxNl90b19jcHUocnNwLT50eXBlKTsKKwlyZXN1bHQgPSBfX2xlMTZfdG9fY3B1KHJzcC0+cmVzdWx0KTsKKworCUJUX0RCRygidHlwZSAweCU0LjR4IHJlc3VsdCAweCUyLjJ4IiwgdHlwZSwgcmVzdWx0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbDJjYXBfc2lnX2NoYW5uZWwoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTggKmRhdGEgPSBza2ItPmRhdGE7CisJaW50IGxlbiA9IHNrYi0+bGVuOworCXN0cnVjdCBsMmNhcF9jbWRfaGRyIGNtZDsKKwlpbnQgZXJyID0gMDsKKworCWwyY2FwX3Jhd19yZWN2KGNvbm4sIHNrYik7CisKKwl3aGlsZSAobGVuID49IEwyQ0FQX0NNRF9IRFJfU0laRSkgeworCQltZW1jcHkoJmNtZCwgZGF0YSwgTDJDQVBfQ01EX0hEUl9TSVpFKTsKKwkJZGF0YSArPSBMMkNBUF9DTURfSERSX1NJWkU7CisJCWxlbiAgLT0gTDJDQVBfQ01EX0hEUl9TSVpFOworCisJCWNtZC5sZW4gPSBfX2xlMTZfdG9fY3B1KGNtZC5sZW4pOworCisJCUJUX0RCRygiY29kZSAweCUyLjJ4IGxlbiAlZCBpZCAweCUyLjJ4IiwgY21kLmNvZGUsIGNtZC5sZW4sIGNtZC5pZGVudCk7CisKKwkJaWYgKGNtZC5sZW4gPiBsZW4gfHwgIWNtZC5pZGVudCkgeworCQkJQlRfREJHKCJjb3JydXB0ZWQgY29tbWFuZCIpOworCQkJYnJlYWs7CisJCX0KKworCQlzd2l0Y2ggKGNtZC5jb2RlKSB7CisJCWNhc2UgTDJDQVBfQ09NTUFORF9SRUo6CisJCQkvKiBGSVhNRTogV2Ugc2hvdWxkIHByb2Nlc3MgdGhpcyAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBMMkNBUF9DT05OX1JFUToKKwkJCWVyciA9IGwyY2FwX2Nvbm5lY3RfcmVxKGNvbm4sICZjbWQsIGRhdGEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBMMkNBUF9DT05OX1JTUDoKKwkJCWVyciA9IGwyY2FwX2Nvbm5lY3RfcnNwKGNvbm4sICZjbWQsIGRhdGEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBMMkNBUF9DT05GX1JFUToKKwkJCWVyciA9IGwyY2FwX2NvbmZpZ19yZXEoY29ubiwgJmNtZCwgZGF0YSk7CisJCQlicmVhazsKKworCQljYXNlIEwyQ0FQX0NPTkZfUlNQOgorCQkJZXJyID0gbDJjYXBfY29uZmlnX3JzcChjb25uLCAmY21kLCBkYXRhKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTDJDQVBfRElTQ09OTl9SRVE6CisJCQllcnIgPSBsMmNhcF9kaXNjb25uZWN0X3JlcShjb25uLCAmY21kLCBkYXRhKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTDJDQVBfRElTQ09OTl9SU1A6CisJCQllcnIgPSBsMmNhcF9kaXNjb25uZWN0X3JzcChjb25uLCAmY21kLCBkYXRhKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTDJDQVBfRUNIT19SRVE6CisJCQlsMmNhcF9zZW5kX2NtZChjb25uLCBjbWQuaWRlbnQsIEwyQ0FQX0VDSE9fUlNQLCBjbWQubGVuLCBkYXRhKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTDJDQVBfRUNIT19SU1A6CisJCQlicmVhazsKKworCQljYXNlIEwyQ0FQX0lORk9fUkVROgorCQkJZXJyID0gbDJjYXBfaW5mb3JtYXRpb25fcmVxKGNvbm4sICZjbWQsIGRhdGEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBMMkNBUF9JTkZPX1JTUDoKKwkJCWVyciA9IGwyY2FwX2luZm9ybWF0aW9uX3JzcChjb25uLCAmY21kLCBkYXRhKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlCVF9FUlIoIlVua25vd24gc2lnbmFsaW5nIGNvbW1hbmQgMHglMi4yeCIsIGNtZC5jb2RlKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChlcnIpIHsKKwkJCXN0cnVjdCBsMmNhcF9jbWRfcmVqIHJlajsKKwkJCUJUX0RCRygiZXJyb3IgJWQiLCBlcnIpOworCisJCQkvKiBGSVhNRTogTWFwIGVyciB0byBhIHZhbGlkIHJlYXNvbiAqLworCQkJcmVqLnJlYXNvbiA9IF9fY3B1X3RvX2xlMTYoMCk7CisJCQlsMmNhcF9zZW5kX2NtZChjb25uLCBjbWQuaWRlbnQsIEwyQ0FQX0NPTU1BTkRfUkVKLCBzaXplb2YocmVqKSwgJnJlaik7CisJCX0KKworCQlkYXRhICs9IGNtZC5sZW47CisJCWxlbiAgLT0gY21kLmxlbjsKKwl9CisKKwlrZnJlZV9za2Ioc2tiKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbDJjYXBfZGF0YV9jaGFubmVsKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLCB1MTYgY2lkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBzb2NrICpzazsKKworCXNrID0gbDJjYXBfZ2V0X2NoYW5fYnlfc2NpZCgmY29ubi0+Y2hhbl9saXN0LCBjaWQpOworCWlmICghc2spIHsKKwkJQlRfREJHKCJ1bmtub3duIGNpZCAweCU0LjR4IiwgY2lkKTsKKwkJZ290byBkcm9wOworCX0KKworCUJUX0RCRygic2sgJXAsIGxlbiAlZCIsIHNrLCBza2ItPmxlbik7CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0NPTk5FQ1RFRCkKKwkJZ290byBkcm9wOworCisJaWYgKGwyY2FwX3BpKHNrKS0+aW10dSA8IHNrYi0+bGVuKQorCQlnb3RvIGRyb3A7CisKKwkvKiBJZiBzb2NrZXQgcmVjdiBidWZmZXJzIG92ZXJmbG93cyB3ZSBkcm9wIGRhdGEgaGVyZQorCSAqIHdoaWNoIGlzICpiYWQqIGJlY2F1c2UgTDJDQVAgaGFzIHRvIGJlIHJlbGlhYmxlLgorCSAqIEJ1dCB3ZSBkb24ndCBoYXZlIGFueSBvdGhlciBjaG9pY2UuIEwyQ0FQIGRvZXNuJ3QKKwkgKiBwcm92aWRlIGZsb3cgY29udHJvbCBtZWNoYW5pc20uICovCisKKwlpZiAoIXNvY2tfcXVldWVfcmN2X3NrYihzaywgc2tiKSkKKwkJZ290byBkb25lOworCitkcm9wOgorCWtmcmVlX3NrYihza2IpOworCitkb25lOgorCWlmIChzaykgYmhfdW5sb2NrX3NvY2soc2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBsMmNhcF9jb25sZXNzX2NoYW5uZWwoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHUxNiBwc20sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNvY2sgKnNrOworCisJc2sgPSBsMmNhcF9nZXRfc29ja19ieV9wc20oMCwgcHNtLCBjb25uLT5zcmMpOworCWlmICghc2spCisJCWdvdG8gZHJvcDsKKworCUJUX0RCRygic2sgJXAsIGxlbiAlZCIsIHNrLCBza2ItPmxlbik7CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0JPVU5EICYmIHNrLT5za19zdGF0ZSAhPSBCVF9DT05ORUNURUQpCisJCWdvdG8gZHJvcDsKKworCWlmIChsMmNhcF9waShzayktPmltdHUgPCBza2ItPmxlbikKKwkJZ290byBkcm9wOworCisJaWYgKCFzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYikpCisJCWdvdG8gZG9uZTsKKworZHJvcDoKKwlrZnJlZV9za2Ioc2tiKTsKKworZG9uZToKKwlpZiAoc2spIGJoX3VubG9ja19zb2NrKHNrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbDJjYXBfcmVjdl9mcmFtZShzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbDJjYXBfaGRyICpsaCA9ICh2b2lkICopIHNrYi0+ZGF0YTsKKwl1MTYgY2lkLCBwc20sIGxlbjsKKworCXNrYl9wdWxsKHNrYiwgTDJDQVBfSERSX1NJWkUpOworCWNpZCA9IF9fbGUxNl90b19jcHUobGgtPmNpZCk7CisJbGVuID0gX19sZTE2X3RvX2NwdShsaC0+bGVuKTsKKworCUJUX0RCRygibGVuICVkLCBjaWQgMHglNC40eCIsIGxlbiwgY2lkKTsKKworCXN3aXRjaCAoY2lkKSB7CisJY2FzZSAweDAwMDE6CisJCWwyY2FwX3NpZ19jaGFubmVsKGNvbm4sIHNrYik7CisJCWJyZWFrOworCisJY2FzZSAweDAwMDI6CisJCXBzbSA9IGdldF91bmFsaWduZWQoKHUxNiAqKSBza2ItPmRhdGEpOworCQlza2JfcHVsbChza2IsIDIpOworCQlsMmNhcF9jb25sZXNzX2NoYW5uZWwoY29ubiwgcHNtLCBza2IpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWwyY2FwX2RhdGFfY2hhbm5lbChjb25uLCBjaWQsIHNrYik7CisJCWJyZWFrOworCX0KK30KKworLyogLS0tLSBMMkNBUCBpbnRlcmZhY2Ugd2l0aCBsb3dlciBsYXllciAoSENJKSAtLS0tICovCisKK3N0YXRpYyBpbnQgbDJjYXBfY29ubmVjdF9pbmQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsIHU4IHR5cGUpCit7CisJaW50IGV4YWN0ID0gMCwgbG0xID0gMCwgbG0yID0gMDsKKwlyZWdpc3RlciBzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisKKwlpZiAodHlwZSAhPSBBQ0xfTElOSykKKwkJcmV0dXJuIDA7CisKKwlCVF9EQkcoImhkZXYgJXMsIGJkYWRkciAlcyIsIGhkZXYtPm5hbWUsIGJhdG9zdHIoYmRhZGRyKSk7CisKKwkvKiBGaW5kIGxpc3RlbmluZyBzb2NrZXRzIGFuZCBjaGVjayB0aGVpciBsaW5rX21vZGUgKi8KKwlyZWFkX2xvY2soJmwyY2FwX3NrX2xpc3QubG9jayk7CisJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZsMmNhcF9za19saXN0LmhlYWQpIHsKKwkJaWYgKHNrLT5za19zdGF0ZSAhPSBCVF9MSVNURU4pCisJCQljb250aW51ZTsKKworCQlpZiAoIWJhY21wKCZidF9zayhzayktPnNyYywgJmhkZXYtPmJkYWRkcikpIHsKKwkJCWxtMSB8PSAoSENJX0xNX0FDQ0VQVCB8IGwyY2FwX3BpKHNrKS0+bGlua19tb2RlKTsKKwkJCWV4YWN0Kys7CisJCX0gZWxzZSBpZiAoIWJhY21wKCZidF9zayhzayktPnNyYywgQkRBRERSX0FOWSkpCisJCQlsbTIgfD0gKEhDSV9MTV9BQ0NFUFQgfCBsMmNhcF9waShzayktPmxpbmtfbW9kZSk7CisJfQorCXJlYWRfdW5sb2NrKCZsMmNhcF9za19saXN0LmxvY2spOworCisJcmV0dXJuIGV4YWN0ID8gbG0xIDogbG0yOworfQorCitzdGF0aWMgaW50IGwyY2FwX2Nvbm5lY3RfY2ZtKHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgdTggc3RhdHVzKQoreworCUJUX0RCRygiaGNvbiAlcCBiZGFkZHIgJXMgc3RhdHVzICVkIiwgaGNvbiwgYmF0b3N0cigmaGNvbi0+ZHN0KSwgc3RhdHVzKTsKKworCWlmIChoY29uLT50eXBlICE9IEFDTF9MSU5LKQorCQlyZXR1cm4gMDsKKworCWlmICghc3RhdHVzKSB7CisJCXN0cnVjdCBsMmNhcF9jb25uICpjb25uOworCisJCWNvbm4gPSBsMmNhcF9jb25uX2FkZChoY29uLCBzdGF0dXMpOworCQlpZiAoY29ubikKKwkJCWwyY2FwX2Nvbm5fcmVhZHkoY29ubik7CisJfSBlbHNlIAorCQlsMmNhcF9jb25uX2RlbChoY29uLCBidF9lcnIoc3RhdHVzKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsMmNhcF9kaXNjb25uX2luZChzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIHU4IHJlYXNvbikKK3sKKwlCVF9EQkcoImhjb24gJXAgcmVhc29uICVkIiwgaGNvbiwgcmVhc29uKTsKKworCWlmIChoY29uLT50eXBlICE9IEFDTF9MSU5LKQorCQlyZXR1cm4gMDsKKworCWwyY2FwX2Nvbm5fZGVsKGhjb24sIGJ0X2VycihyZWFzb24pKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsMmNhcF9hdXRoX2NmbShzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIHU4IHN0YXR1cykKK3sKKwlzdHJ1Y3QgbDJjYXBfY2hhbl9saXN0ICpsOworCXN0cnVjdCBsMmNhcF9jb25uICpjb25uOworCXN0cnVjdCBsMmNhcF9jb25uX3JzcCByc3A7CisJc3RydWN0IHNvY2sgKnNrOworCWludCByZXN1bHQ7CisKKwlpZiAoIShjb25uID0gaGNvbi0+bDJjYXBfZGF0YSkpCisJCXJldHVybiAwOworCWwgPSAmY29ubi0+Y2hhbl9saXN0OworCisJQlRfREJHKCJjb25uICVwIiwgY29ubik7CisKKwlyZWFkX2xvY2soJmwtPmxvY2spOworCisJZm9yIChzayA9IGwtPmhlYWQ7IHNrOyBzayA9IGwyY2FwX3BpKHNrKS0+bmV4dF9jKSB7CisJCWJoX2xvY2tfc29jayhzayk7CisKKwkJaWYgKHNrLT5za19zdGF0ZSAhPSBCVF9DT05ORUNUMiB8fAorCQkJCShsMmNhcF9waShzayktPmxpbmtfbW9kZSAmIEwyQ0FQX0xNX0VOQ1JZUFQpIHx8CisJCQkJKGwyY2FwX3BpKHNrKS0+bGlua19tb2RlICYgTDJDQVBfTE1fU0VDVVJFKSkgeworCQkJYmhfdW5sb2NrX3NvY2soc2spOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIXN0YXR1cykgeworCQkJc2stPnNrX3N0YXRlID0gQlRfQ09ORklHOworCQkJcmVzdWx0ID0gMDsKKwkJfSBlbHNlIHsKKwkJCXNrLT5za19zdGF0ZSA9IEJUX0RJU0NPTk47CisJCQlsMmNhcF9zb2NrX3NldF90aW1lcihzaywgSFovMTApOworCQkJcmVzdWx0ID0gTDJDQVBfQ1JfU0VDX0JMT0NLOworCQl9CisKKwkJcnNwLnNjaWQgICA9IF9fY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5kY2lkKTsKKwkJcnNwLmRjaWQgICA9IF9fY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5zY2lkKTsKKwkJcnNwLnJlc3VsdCA9IF9fY3B1X3RvX2xlMTYocmVzdWx0KTsKKwkJcnNwLnN0YXR1cyA9IF9fY3B1X3RvX2xlMTYoMCk7CisJCWwyY2FwX3NlbmRfY21kKGNvbm4sIGwyY2FwX3BpKHNrKS0+aWRlbnQsCisJCQkJTDJDQVBfQ09OTl9SU1AsIHNpemVvZihyc3ApLCAmcnNwKTsKKworCQliaF91bmxvY2tfc29jayhzayk7CisJfQorCisJcmVhZF91bmxvY2soJmwtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGwyY2FwX2VuY3J5cHRfY2ZtKHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgdTggc3RhdHVzKQoreworCXN0cnVjdCBsMmNhcF9jaGFuX2xpc3QgKmw7CisJc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm47CisJc3RydWN0IGwyY2FwX2Nvbm5fcnNwIHJzcDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJaW50IHJlc3VsdDsKKworCWlmICghKGNvbm4gPSBoY29uLT5sMmNhcF9kYXRhKSkKKwkJcmV0dXJuIDA7CisJbCA9ICZjb25uLT5jaGFuX2xpc3Q7CisKKwlCVF9EQkcoImNvbm4gJXAiLCBjb25uKTsKKworCXJlYWRfbG9jaygmbC0+bG9jayk7CisKKwlmb3IgKHNrID0gbC0+aGVhZDsgc2s7IHNrID0gbDJjYXBfcGkoc2spLT5uZXh0X2MpIHsKKwkJYmhfbG9ja19zb2NrKHNrKTsKKworCQlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0NPTk5FQ1QyKSB7CisJCQliaF91bmxvY2tfc29jayhzayk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghc3RhdHVzKSB7CisJCQlzay0+c2tfc3RhdGUgPSBCVF9DT05GSUc7CisJCQlyZXN1bHQgPSAwOworCQl9IGVsc2UgeworCQkJc2stPnNrX3N0YXRlID0gQlRfRElTQ09OTjsKKwkJCWwyY2FwX3NvY2tfc2V0X3RpbWVyKHNrLCBIWi8xMCk7CisJCQlyZXN1bHQgPSBMMkNBUF9DUl9TRUNfQkxPQ0s7CisJCX0KKworCQlyc3Auc2NpZCAgID0gX19jcHVfdG9fbGUxNihsMmNhcF9waShzayktPmRjaWQpOworCQlyc3AuZGNpZCAgID0gX19jcHVfdG9fbGUxNihsMmNhcF9waShzayktPnNjaWQpOworCQlyc3AucmVzdWx0ID0gX19jcHVfdG9fbGUxNihyZXN1bHQpOworCQlyc3Auc3RhdHVzID0gX19jcHVfdG9fbGUxNigwKTsKKwkJbDJjYXBfc2VuZF9jbWQoY29ubiwgbDJjYXBfcGkoc2spLT5pZGVudCwKKwkJCQlMMkNBUF9DT05OX1JTUCwgc2l6ZW9mKHJzcCksICZyc3ApOworCisJCWlmIChsMmNhcF9waShzayktPmxpbmtfbW9kZSAmIEwyQ0FQX0xNX1NFQ1VSRSkKKwkJCWhjaV9jb25uX2NoYW5nZV9saW5rX2tleShoY29uKTsKKworCQliaF91bmxvY2tfc29jayhzayk7CisJfQorCisJcmVhZF91bmxvY2soJmwtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGwyY2FwX3JlY3ZfYWNsZGF0YShzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIHN0cnVjdCBza19idWZmICpza2IsIHUxNiBmbGFncykKK3sKKwlzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiA9IGhjb24tPmwyY2FwX2RhdGE7CisKKwlpZiAoIWNvbm4gJiYgIShjb25uID0gbDJjYXBfY29ubl9hZGQoaGNvbiwgMCkpKQorCQlnb3RvIGRyb3A7CisKKwlCVF9EQkcoImNvbm4gJXAgbGVuICVkIGZsYWdzIDB4JXgiLCBjb25uLCBza2ItPmxlbiwgZmxhZ3MpOworCisJaWYgKGZsYWdzICYgQUNMX1NUQVJUKSB7CisJCXN0cnVjdCBsMmNhcF9oZHIgKmhkcjsKKwkJaW50IGxlbjsKKworCQlpZiAoY29ubi0+cnhfbGVuKSB7CisJCQlCVF9FUlIoIlVuZXhwZWN0ZWQgc3RhcnQgZnJhbWUgKGxlbiAlZCkiLCBza2ItPmxlbik7CisJCQlrZnJlZV9za2IoY29ubi0+cnhfc2tiKTsKKwkJCWNvbm4tPnJ4X3NrYiA9IE5VTEw7CisJCQljb25uLT5yeF9sZW4gPSAwOworCQkJbDJjYXBfY29ubl91bnJlbGlhYmxlKGNvbm4sIEVDT01NKTsKKwkJfQorCisJCWlmIChza2ItPmxlbiA8IDIpIHsKKwkJCUJUX0VSUigiRnJhbWUgaXMgdG9vIHNob3J0IChsZW4gJWQpIiwgc2tiLT5sZW4pOworCQkJbDJjYXBfY29ubl91bnJlbGlhYmxlKGNvbm4sIEVDT01NKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCisJCWhkciA9IChzdHJ1Y3QgbDJjYXBfaGRyICopIHNrYi0+ZGF0YTsKKwkJbGVuID0gX19sZTE2X3RvX2NwdShoZHItPmxlbikgKyBMMkNBUF9IRFJfU0laRTsKKworCQlpZiAobGVuID09IHNrYi0+bGVuKSB7CisJCQkvKiBDb21wbGV0ZSBmcmFtZSByZWNlaXZlZCAqLworCQkJbDJjYXBfcmVjdl9mcmFtZShjb25uLCBza2IpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlCVF9EQkcoIlN0YXJ0OiB0b3RhbCBsZW4gJWQsIGZyYWcgbGVuICVkIiwgbGVuLCBza2ItPmxlbik7CisKKwkJaWYgKHNrYi0+bGVuID4gbGVuKSB7CisJCQlCVF9FUlIoIkZyYW1lIGlzIHRvbyBsb25nIChsZW4gJWQsIGV4cGVjdGVkIGxlbiAlZCkiLAorCQkJCXNrYi0+bGVuLCBsZW4pOworCQkJbDJjYXBfY29ubl91bnJlbGlhYmxlKGNvbm4sIEVDT01NKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCisJCS8qIEFsbG9jYXRlIHNrYiBmb3IgdGhlIGNvbXBsZXRlIGZyYW1lICh3aXRoIGhlYWRlcikgKi8KKwkJaWYgKCEoY29ubi0+cnhfc2tiID0gYnRfc2tiX2FsbG9jKGxlbiwgR0ZQX0FUT01JQykpKQorCQkJZ290byBkcm9wOworCisJCW1lbWNweShza2JfcHV0KGNvbm4tPnJ4X3NrYiwgc2tiLT5sZW4pLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJY29ubi0+cnhfbGVuID0gbGVuIC0gc2tiLT5sZW47CisJfSBlbHNlIHsKKwkJQlRfREJHKCJDb250OiBmcmFnIGxlbiAlZCAoZXhwZWN0aW5nICVkKSIsIHNrYi0+bGVuLCBjb25uLT5yeF9sZW4pOworCisJCWlmICghY29ubi0+cnhfbGVuKSB7CisJCQlCVF9FUlIoIlVuZXhwZWN0ZWQgY29udGludWF0aW9uIGZyYW1lIChsZW4gJWQpIiwgc2tiLT5sZW4pOworCQkJbDJjYXBfY29ubl91bnJlbGlhYmxlKGNvbm4sIEVDT01NKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCisJCWlmIChza2ItPmxlbiA+IGNvbm4tPnJ4X2xlbikgeworCQkJQlRfRVJSKCJGcmFnbWVudCBpcyB0b28gbG9uZyAobGVuICVkLCBleHBlY3RlZCAlZCkiLAorCQkJCQlza2ItPmxlbiwgY29ubi0+cnhfbGVuKTsKKwkJCWtmcmVlX3NrYihjb25uLT5yeF9za2IpOworCQkJY29ubi0+cnhfc2tiID0gTlVMTDsKKwkJCWNvbm4tPnJ4X2xlbiA9IDA7CisJCQlsMmNhcF9jb25uX3VucmVsaWFibGUoY29ubiwgRUNPTU0pOworCQkJZ290byBkcm9wOworCQl9CisKKwkJbWVtY3B5KHNrYl9wdXQoY29ubi0+cnhfc2tiLCBza2ItPmxlbiksIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQljb25uLT5yeF9sZW4gLT0gc2tiLT5sZW47CisKKwkJaWYgKCFjb25uLT5yeF9sZW4pIHsKKwkJCS8qIENvbXBsZXRlIGZyYW1lIHJlY2VpdmVkICovCisJCQlsMmNhcF9yZWN2X2ZyYW1lKGNvbm4sIGNvbm4tPnJ4X3NrYik7CisJCQljb25uLT5yeF9za2IgPSBOVUxMOworCQl9CisJfQorCitkcm9wOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCisvKiAtLS0tIFByb2MgZnMgc3VwcG9ydCAtLS0tICovCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyB2b2lkICpsMmNhcF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlsb2ZmX3QgbCA9ICpwb3M7CisKKwlyZWFkX2xvY2tfYmgoJmwyY2FwX3NrX2xpc3QubG9jayk7CisKKwlza19mb3JfZWFjaChzaywgbm9kZSwgJmwyY2FwX3NrX2xpc3QuaGVhZCkKKwkJaWYgKCFsLS0pCisJCQlnb3RvIGZvdW5kOworCXNrID0gTlVMTDsKK2ZvdW5kOgorCXJldHVybiBzazsKK30KKworc3RhdGljIHZvaWQgKmwyY2FwX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICplLCBsb2ZmX3QgKnBvcykKK3sKKwkoKnBvcykrKzsKKwlyZXR1cm4gc2tfbmV4dChlKTsKK30KKworc3RhdGljIHZvaWQgbDJjYXBfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKmUpCit7CisJcmVhZF91bmxvY2tfYmgoJmwyY2FwX3NrX2xpc3QubG9jayk7Cit9CisKK3N0YXRpYyBpbnQgIGwyY2FwX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICplKQoreworCXN0cnVjdCBzb2NrICpzayA9IGU7CisJc3RydWN0IGwyY2FwX3BpbmZvICpwaSA9IGwyY2FwX3BpKHNrKTsKKworCXNlcV9wcmludGYoc2VxLCAiJXMgJXMgJWQgJWQgMHglNC40eCAweCU0LjR4ICVkICVkIDB4JXhcbiIsCisJCQliYXRvc3RyKCZidF9zayhzayktPnNyYyksIGJhdG9zdHIoJmJ0X3NrKHNrKS0+ZHN0KSwgCisJCQlzay0+c2tfc3RhdGUsIHBpLT5wc20sIHBpLT5zY2lkLCBwaS0+ZGNpZCwgcGktPmltdHUsCisJCQlwaS0+b210dSwgcGktPmxpbmtfbW9kZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbDJjYXBfc2VxX29wcyA9IHsKKwkuc3RhcnQJPSBsMmNhcF9zZXFfc3RhcnQsCisJLm5leHQJPSBsMmNhcF9zZXFfbmV4dCwKKwkuc3RvcAk9IGwyY2FwX3NlcV9zdG9wLAorCS5zaG93CT0gbDJjYXBfc2VxX3Nob3cgCit9OworCitzdGF0aWMgaW50IGwyY2FwX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmbDJjYXBfc2VxX29wcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGwyY2FwX3NlcV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBsMmNhcF9zZXFfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbDJjYXBfcHJvY19pbml0KHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwID0gY3JlYXRlX3Byb2NfZW50cnkoImwyY2FwIiwgU19JUlVHTywgcHJvY19idCk7CisJaWYgKCFwKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwLT5vd25lciAgICAgPSBUSElTX01PRFVMRTsKKwlwLT5wcm9jX2ZvcHMgPSAmbDJjYXBfc2VxX2ZvcHM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBsMmNhcF9wcm9jX2NsZWFudXAodm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeSgibDJjYXAiLCBwcm9jX2J0KTsKK30KKworI2Vsc2UgLyogQ09ORklHX1BST0NfRlMgKi8KKworc3RhdGljIGludCBfX2luaXQgbDJjYXBfcHJvY19pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBsMmNhcF9wcm9jX2NsZWFudXAodm9pZCkKK3sKKwlyZXR1cm47Cit9CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgbDJjYXBfc29ja19vcHMgPSB7CisJLmZhbWlseQkJPSBQRl9CTFVFVE9PVEgsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWxlYXNlCT0gbDJjYXBfc29ja19yZWxlYXNlLAorCS5iaW5kCQk9IGwyY2FwX3NvY2tfYmluZCwKKwkuY29ubmVjdAk9IGwyY2FwX3NvY2tfY29ubmVjdCwKKwkubGlzdGVuCQk9IGwyY2FwX3NvY2tfbGlzdGVuLAorCS5hY2NlcHQJCT0gbDJjYXBfc29ja19hY2NlcHQsCisJLmdldG5hbWUJPSBsMmNhcF9zb2NrX2dldG5hbWUsCisJLnNlbmRtc2cJPSBsMmNhcF9zb2NrX3NlbmRtc2csCisJLnJlY3Ztc2cJPSBidF9zb2NrX3JlY3Ztc2csCisJLnBvbGwJCT0gYnRfc29ja19wb2xsLAorCS5tbWFwCQk9IHNvY2tfbm9fbW1hcCwKKwkuc29ja2V0cGFpcgk9IHNvY2tfbm9fc29ja2V0cGFpciwKKwkuaW9jdGwJCT0gc29ja19ub19pb2N0bCwKKwkuc2h1dGRvd24JPSBsMmNhcF9zb2NrX3NodXRkb3duLAorCS5zZXRzb2Nrb3B0CT0gbDJjYXBfc29ja19zZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0CT0gbDJjYXBfc29ja19nZXRzb2Nrb3B0Cit9OworCitzdGF0aWMgc3RydWN0IG5ldF9wcm90b19mYW1pbHkgbDJjYXBfc29ja19mYW1pbHlfb3BzID0geworCS5mYW1pbHkJPSBQRl9CTFVFVE9PVEgsCisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmNyZWF0ZQk9IGwyY2FwX3NvY2tfY3JlYXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBoY2lfcHJvdG8gbDJjYXBfaGNpX3Byb3RvID0geworCS5uYW1lCQk9ICJMMkNBUCIsCisJLmlkCQk9IEhDSV9QUk9UT19MMkNBUCwKKwkuY29ubmVjdF9pbmQJPSBsMmNhcF9jb25uZWN0X2luZCwKKwkuY29ubmVjdF9jZm0JPSBsMmNhcF9jb25uZWN0X2NmbSwKKwkuZGlzY29ubl9pbmQJPSBsMmNhcF9kaXNjb25uX2luZCwKKwkuYXV0aF9jZm0JPSBsMmNhcF9hdXRoX2NmbSwKKwkuZW5jcnlwdF9jZm0JPSBsMmNhcF9lbmNyeXB0X2NmbSwKKwkucmVjdl9hY2xkYXRhCT0gbDJjYXBfcmVjdl9hY2xkYXRhCit9OworCitzdGF0aWMgaW50IF9faW5pdCBsMmNhcF9pbml0KHZvaWQpCit7CisJaW50IGVycjsKKwkKKwllcnIgPSBwcm90b19yZWdpc3RlcigmbDJjYXBfcHJvdG8sIDApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gYnRfc29ja19yZWdpc3RlcihCVFBST1RPX0wyQ0FQLCAmbDJjYXBfc29ja19mYW1pbHlfb3BzKTsKKwlpZiAoZXJyIDwgMCkgeworCQlCVF9FUlIoIkwyQ0FQIHNvY2tldCByZWdpc3RyYXRpb24gZmFpbGVkIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZXJyID0gaGNpX3JlZ2lzdGVyX3Byb3RvKCZsMmNhcF9oY2lfcHJvdG8pOworCWlmIChlcnIgPCAwKSB7CisJCUJUX0VSUigiTDJDQVAgcHJvdG9jb2wgcmVnaXN0cmF0aW9uIGZhaWxlZCIpOworCQlidF9zb2NrX3VucmVnaXN0ZXIoQlRQUk9UT19MMkNBUCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJbDJjYXBfcHJvY19pbml0KCk7CisKKwlCVF9JTkZPKCJMMkNBUCB2ZXIgJXMiLCBWRVJTSU9OKTsKKwlCVF9JTkZPKCJMMkNBUCBzb2NrZXQgbGF5ZXIgaW5pdGlhbGl6ZWQiKTsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlwcm90b191bnJlZ2lzdGVyKCZsMmNhcF9wcm90byk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGwyY2FwX2V4aXQodm9pZCkKK3sKKwlsMmNhcF9wcm9jX2NsZWFudXAoKTsKKworCWlmIChidF9zb2NrX3VucmVnaXN0ZXIoQlRQUk9UT19MMkNBUCkgPCAwKQorCQlCVF9FUlIoIkwyQ0FQIHNvY2tldCB1bnJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKworCWlmIChoY2lfdW5yZWdpc3Rlcl9wcm90bygmbDJjYXBfaGNpX3Byb3RvKSA8IDApCisJCUJUX0VSUigiTDJDQVAgcHJvdG9jb2wgdW5yZWdpc3RyYXRpb24gZmFpbGVkIik7CisKKwlwcm90b191bnJlZ2lzdGVyKCZsMmNhcF9wcm90byk7Cit9CisKK3ZvaWQgbDJjYXBfbG9hZCh2b2lkKQoreworCS8qIER1bW15IGZ1bmN0aW9uIHRvIHRyaWdnZXIgYXV0b21hdGljIEwyQ0FQIG1vZHVsZSBsb2FkaW5nIGJ5CisJICogb3RoZXIgbW9kdWxlcyB0aGF0IHVzZSBMMkNBUCBzb2NrZXRzIGJ1dCBkb24ndCB1c2UgYW55IG90aGVyCisJICogc3ltYm9scyBmcm9tIGl0LiAqLworCXJldHVybjsKK30KK0VYUE9SVF9TWU1CT0wobDJjYXBfbG9hZCk7CisKK21vZHVsZV9pbml0KGwyY2FwX2luaXQpOworbW9kdWxlX2V4aXQobDJjYXBfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1heGltIEtyYXNueWFuc2t5IDxtYXhrQHF1YWxjb21tLmNvbT4sIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmx1ZXRvb3RoIEwyQ0FQIHZlciAiIFZFUlNJT04pOworTU9EVUxFX1ZFUlNJT04oVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImJ0LXByb3RvLTAiKTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbGliLmMgYi9uZXQvYmx1ZXRvb3RoL2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZmIwYTAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL2xpYi5jCkBAIC0wLDAgKzEsMTc4IEBACisvKiAKKyAgIEJsdWVaIC0gQmx1ZXRvb3RoIHByb3RvY29sIHN0YWNrIGZvciBMaW51eAorICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEgUXVhbGNvbW0gSW5jb3Jwb3JhdGVkCisKKyAgIFdyaXR0ZW4gMjAwMCwyMDAxIGJ5IE1heGltIEtyYXNueWFuc2t5IDxtYXhrQHF1YWxjb21tLmNvbT4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBBTkQgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyAKKyAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiAKKyAgIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIAorICAgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworICAgQUxMIExJQUJJTElUWSwgSU5DTFVESU5HIExJQUJJTElUWSBGT1IgSU5GUklOR0VNRU5UIE9GIEFOWSBQQVRFTlRTLCAKKyAgIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLCBSRUxBVElORyBUTyBVU0UgT0YgVEhJUyAKKyAgIFNPRlRXQVJFIElTIERJU0NMQUlNRUQuCisqLworCisvKiBCbHVldG9vdGgga2VybmVsIGxpYnJhcnkuICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorCisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KKwordm9pZCBidF9kdW1wKGNoYXIgKnByZWYsIF9fdTggKmJ1ZiwgaW50IGNvdW50KQoreworCWNoYXIgKnB0cjsKKwljaGFyIGxpbmVbMTAwXTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBkdW1wLCBsZW4gJWRcbiIsIHByZWYsIGNvdW50KTsKKworCXB0ciA9IGxpbmU7CisJKnB0ciA9IDA7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJcHRyICs9IHNwcmludGYocHRyLCAiICUyLjJYIiwgYnVmW2ldKTsKKworCQlpZiAoaSAmJiAhKChpICsgMSkgJSAyMCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiVzXG4iLCBwcmVmLCBsaW5lKTsKKwkJCXB0ciA9IGxpbmU7CisJCQkqcHRyID0gMDsKKwkJfQorCX0KKworCWlmIChsaW5lWzBdKQorCQlwcmludGsoS0VSTl9JTkZPICIlczolc1xuIiwgcHJlZiwgbGluZSk7Cit9CitFWFBPUlRfU1lNQk9MKGJ0X2R1bXApOworCit2b2lkIGJhc3dhcChiZGFkZHJfdCAqZHN0LCBiZGFkZHJfdCAqc3JjKQoreworCXVuc2lnbmVkIGNoYXIgKmQgPSAodW5zaWduZWQgY2hhciAqKSBkc3Q7CisJdW5zaWduZWQgY2hhciAqcyA9ICh1bnNpZ25lZCBjaGFyICopIHNyYzsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWRbaV0gPSBzWzUgLSBpXTsKK30KK0VYUE9SVF9TWU1CT0woYmFzd2FwKTsKKworY2hhciAqYmF0b3N0cihiZGFkZHJfdCAqYmEpCit7CisJc3RhdGljIGNoYXIgc3RyWzJdWzE4XTsKKwlzdGF0aWMgaW50IGkgPSAxOworCisJaSBePSAxOworCXNwcmludGYoc3RyW2ldLCAiJTIuMlg6JTIuMlg6JTIuMlg6JTIuMlg6JTIuMlg6JTIuMlgiLAorCQliYS0+YlswXSwgYmEtPmJbMV0sIGJhLT5iWzJdLAorCQliYS0+YlszXSwgYmEtPmJbNF0sIGJhLT5iWzVdKTsKKworCXJldHVybiBzdHJbaV07Cit9CitFWFBPUlRfU1lNQk9MKGJhdG9zdHIpOworCisvKiBCbHVldG9vdGggZXJyb3IgY29kZXMgdG8gVW5peCBlcnJubyBtYXBwaW5nICovCitpbnQgYnRfZXJyKF9fdTE2IGNvZGUpCit7CisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSAwOgorCQlyZXR1cm4gMDsKKworCWNhc2UgMHgwMToKKwkJcmV0dXJuIEVCQURSUUM7CisKKwljYXNlIDB4MDI6CisJCXJldHVybiBFTk9UQ09OTjsKKworCWNhc2UgMHgwMzoKKwkJcmV0dXJuIEVJTzsKKworCWNhc2UgMHgwNDoKKwkJcmV0dXJuIEVIT1NURE9XTjsKKworCWNhc2UgMHgwNToKKwkJcmV0dXJuIEVBQ0NFUzsKKworCWNhc2UgMHgwNjoKKwkJcmV0dXJuIEVCQURFOworCisJY2FzZSAweDA3OgorCQlyZXR1cm4gRU5PTUVNOworCisJY2FzZSAweDA4OgorCQlyZXR1cm4gRVRJTUVET1VUOworCisJY2FzZSAweDA5OgorCQlyZXR1cm4gRU1MSU5LOworCisJY2FzZSAweDBhOgorCQlyZXR1cm4gRU1MSU5LOworCisJY2FzZSAweDBiOgorCQlyZXR1cm4gRUFMUkVBRFk7CisKKwljYXNlIDB4MGM6CisJCXJldHVybiBFQlVTWTsKKworCWNhc2UgMHgwZDoKKwljYXNlIDB4MGU6CisJY2FzZSAweDBmOgorCQlyZXR1cm4gRUNPTk5SRUZVU0VEOworCisJY2FzZSAweDEwOgorCQlyZXR1cm4gRVRJTUVET1VUOworCisJY2FzZSAweDExOgorCWNhc2UgMHgyNzoKKwljYXNlIDB4Mjk6CisJY2FzZSAweDIwOgorCQlyZXR1cm4gRU9QTk9UU1VQUDsKKworCWNhc2UgMHgxMjoKKwkJcmV0dXJuIEVJTlZBTDsKKworCWNhc2UgMHgxMzoKKwljYXNlIDB4MTQ6CisJY2FzZSAweDE1OgorCQlyZXR1cm4gRUNPTk5SRVNFVDsKKworCWNhc2UgMHgxNjoKKwkJcmV0dXJuIEVDT05OQUJPUlRFRDsKKworCWNhc2UgMHgxNzoKKwkJcmV0dXJuIEVMT09QOworCisJY2FzZSAweDE4OgorCQlyZXR1cm4gRUFDQ0VTOworCisJY2FzZSAweDFhOgorCQlyZXR1cm4gRVBST1RPTk9TVVBQT1JUOworCisJY2FzZSAweDFiOgorCQlyZXR1cm4gRUNPTk5SRUZVU0VEOworCisJY2FzZSAweDE5OgorCWNhc2UgMHgxZToKKwljYXNlIDB4MjM6CisJY2FzZSAweDI0OgorCWNhc2UgMHgyNToKKwkJcmV0dXJuIEVQUk9UTzsKKworCWRlZmF1bHQ6CisJCXJldHVybiBFTk9TWVM7CisJfQorfQorRVhQT1JUX1NZTUJPTChidF9lcnIpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9yZmNvbW0vS2NvbmZpZyBiL25ldC9ibHVldG9vdGgvcmZjb21tL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA1YTBlNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9ibHVldG9vdGgvcmZjb21tL0tjb25maWcKQEAgLTAsMCArMSwxNyBAQAorY29uZmlnIEJUX1JGQ09NTQorCXRyaXN0YXRlICJSRkNPTU0gcHJvdG9jb2wgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJUICYmIEJUX0wyQ0FQCisJaGVscAorCSAgUkZDT01NIHByb3ZpZGVzIGNvbm5lY3Rpb24gb3JpZW50ZWQgc3RyZWFtIHRyYW5zcG9ydC4gIFJGQ09NTQorCSAgc3VwcG9ydCBpcyByZXF1aXJlZCBmb3IgRGlhbHVwIE5ldHdvcmtpbmcsIE9CRVggYW5kIG90aGVyIEJsdWV0b290aAorCSAgYXBwbGljYXRpb25zLgorCisJICBTYXkgWSBoZXJlIHRvIGNvbXBpbGUgUkZDT01NIHN1cHBvcnQgaW50byB0aGUga2VybmVsIG9yIHNheSBNIHRvCisJICBjb21waWxlIGl0IGFzIG1vZHVsZSAocmZjb21tKS4KKworY29uZmlnIEJUX1JGQ09NTV9UVFkKKwlib29sICJSRkNPTU0gVFRZIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBCVF9SRkNPTU0KKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIFRUWSBlbXVsYXRpb24gc3VwcG9ydCBmb3IgUkZDT01NIGNoYW5uZWxzLgorCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS9NYWtlZmlsZSBiL25ldC9ibHVldG9vdGgvcmZjb21tL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlY2VjNDUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBCbHVldG9vdGggUkZDT01NIGxheWVyLgorIworCitvYmotJChDT05GSUdfQlRfUkZDT01NKSArPSByZmNvbW0ubworCityZmNvbW0teQkJCTo9IGNvcmUubyBzb2NrLm8gY3JjLm8KK3JmY29tbS0kKENPTkZJR19CVF9SRkNPTU1fVFRZKQkrPSB0dHkubwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9yZmNvbW0vY29yZS5jIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZTZmZGEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jb3JlLmMKQEAgLTAsMCArMSwyMTI3IEBACisvKiAKKyAgIFJGQ09NTSBpbXBsZW1lbnRhdGlvbiBmb3IgTGludXggQmx1ZXRvb3RoIHN0YWNrIChCbHVlWikuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgTWF4aW0gS3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPgorICAgQ29weXJpZ2h0IChDKSAyMDAyIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBBTkQgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyAKKyAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiAKKyAgIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIAorICAgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworICAgQUxMIExJQUJJTElUWSwgSU5DTFVESU5HIExJQUJJTElUWSBGT1IgSU5GUklOR0VNRU5UIE9GIEFOWSBQQVRFTlRTLCAKKyAgIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLCBSRUxBVElORyBUTyBVU0UgT0YgVEhJUyAKKyAgIFNPRlRXQVJFIElTIERJU0NMQUlNRUQuCisqLworCisvKiAKKyAgIFJQTiBzdXBwb3J0ICAgIC0gICAgRGlyayBIdXNlbWFubiA8aHVkQHp1cmljaC5pYm0uY29tPgorKi8KKworLyoKKyAqIEJsdWV0b290aCBSRkNPTU0gY29yZS4KKyAqCisgKiAkSWQ6IGNvcmUuYyx2IDEuNDIgMjAwMi8xMC8wMSAyMzoyNjoyNSBtYXhrIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2wyY2FwLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9yZmNvbW0uaD4KKworI2RlZmluZSBWRVJTSU9OICIxLjUiCisKKyNpZm5kZWYgQ09ORklHX0JUX1JGQ09NTV9ERUJVRworI3VuZGVmICBCVF9EQkcKKyNkZWZpbmUgQlRfREJHKEQuLi4pCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfYnRfcmZjb21tOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnJmY29tbV90aHJlYWQ7CisKK3N0YXRpYyBERUNMQVJFX01VVEVYKHJmY29tbV9zZW0pOworI2RlZmluZSByZmNvbW1fbG9jaygpCWRvd24oJnJmY29tbV9zZW0pOworI2RlZmluZSByZmNvbW1fdW5sb2NrKCkJdXAoJnJmY29tbV9zZW0pOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyByZmNvbW1fZXZlbnQ7CisKK3N0YXRpYyBMSVNUX0hFQUQoc2Vzc2lvbl9saXN0KTsKK3N0YXRpYyBhdG9taWNfdCB0ZXJtaW5hdGUsIHJ1bm5pbmc7CisKK3N0YXRpYyBpbnQgcmZjb21tX3NlbmRfZnJhbWUoc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCB1OCAqZGF0YSwgaW50IGxlbik7CitzdGF0aWMgaW50IHJmY29tbV9zZW5kX3NhYm0oc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCB1OCBkbGNpKTsKK3N0YXRpYyBpbnQgcmZjb21tX3NlbmRfZGlzYyhzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIHU4IGRsY2kpOworc3RhdGljIGludCByZmNvbW1fcXVldWVfZGlzYyhzdHJ1Y3QgcmZjb21tX2RsYyAqZCk7CitzdGF0aWMgaW50IHJmY29tbV9zZW5kX25zYyhzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIGludCBjciwgdTggdHlwZSk7CitzdGF0aWMgaW50IHJmY29tbV9zZW5kX3BuKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgaW50IGNyLCBzdHJ1Y3QgcmZjb21tX2RsYyAqZCk7CitzdGF0aWMgaW50IHJmY29tbV9zZW5kX21zYyhzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIGludCBjciwgdTggZGxjaSwgdTggdjI0X3NpZyk7CitzdGF0aWMgaW50IHJmY29tbV9zZW5kX3Rlc3Qoc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCBpbnQgY3IsIHU4ICpwYXR0ZXJuLCBpbnQgbGVuKTsKK3N0YXRpYyBpbnQgcmZjb21tX3NlbmRfY3JlZGl0cyhzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIHU4IGFkZHIsIHU4IGNyZWRpdHMpOworc3RhdGljIHZvaWQgcmZjb21tX21ha2VfdWloKHN0cnVjdCBza19idWZmICpza2IsIHU4IGFkZHIpOworCitzdGF0aWMgdm9pZCByZmNvbW1fcHJvY2Vzc19jb25uZWN0KHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnJmY29tbV9zZXNzaW9uX2NyZWF0ZShiZGFkZHJfdCAqc3JjLCBiZGFkZHJfdCAqZHN0LCBpbnQgKmVycik7CitzdGF0aWMgc3RydWN0IHJmY29tbV9zZXNzaW9uICpyZmNvbW1fc2Vzc2lvbl9nZXQoYmRhZGRyX3QgKnNyYywgYmRhZGRyX3QgKmRzdCk7CitzdGF0aWMgdm9pZCByZmNvbW1fc2Vzc2lvbl9kZWwoc3RydWN0IHJmY29tbV9zZXNzaW9uICpzKTsKKworLyogLS0tLSBSRkNPTU0gZnJhbWUgcGFyc2luZyBtYWNyb3MgLS0tLSAqLworI2RlZmluZSBfX2dldF9kbGNpKGIpICAgICAoKGIgJiAweGZjKSA+PiAyKQorI2RlZmluZSBfX2dldF9jaGFubmVsKGIpICAoKGIgJiAweGY4KSA+PiAzKQorI2RlZmluZSBfX2dldF9kaXIoYikgICAgICAoKGIgJiAweDA0KSA+PiAyKQorI2RlZmluZSBfX2dldF90eXBlKGIpICAgICAoKGIgJiAweGVmKSkKKworI2RlZmluZSBfX3Rlc3RfZWEoYikgICAgICAoKGIgJiAweDAxKSkKKyNkZWZpbmUgX190ZXN0X2NyKGIpICAgICAgKChiICYgMHgwMikpCisjZGVmaW5lIF9fdGVzdF9wZihiKSAgICAgICgoYiAmIDB4MTApKQorCisjZGVmaW5lIF9fYWRkcihjciwgZGxjaSkgICAgICAgKCgoZGxjaSAmIDB4M2YpIDw8IDIpIHwgKGNyIDw8IDEpIHwgMHgwMSkKKyNkZWZpbmUgX19jdHJsKHR5cGUsIHBmKSAgICAgICAoKCh0eXBlICYgMHhlZikgfCAocGYgPDwgNCkpKQorI2RlZmluZSBfX2RsY2koZGlyLCBjaG4pICAgICAgICgoKGNobiAmIDB4MWYpIDw8IDEpIHwgZGlyKQorI2RlZmluZSBfX3Nydl9jaGFubmVsKGRsY2kpICAgIChkbGNpID4+IDEpCisjZGVmaW5lIF9fZGlyKGRsY2kpICAgICAgICAgICAgKGRsY2kgJiAweDAxKQorCisjZGVmaW5lIF9fbGVuOChsZW4pICAgICAgICgoKGxlbikgPDwgMSkgfCAxKQorI2RlZmluZSBfX2xlbjE2KGxlbikgICAgICAoKGxlbikgPDwgMSkKKworLyogTUNDIG1hY3JvcyAqLworI2RlZmluZSBfX21jY190eXBlKGNyLCB0eXBlKSAgICgoKHR5cGUgPDwgMikgfCAoY3IgPDwgMSkgfCAweDAxKSkKKyNkZWZpbmUgX19nZXRfbWNjX3R5cGUoYikgKChiICYgMHhmYykgPj4gMikKKyNkZWZpbmUgX19nZXRfbWNjX2xlbihiKSAgKChiICYgMHhmZSkgPj4gMSkKKworLyogUlBOIG1hY3JvcyAqLworI2RlZmluZSBfX3Jwbl9saW5lX3NldHRpbmdzKGRhdGEsIHN0b3AsIHBhcml0eSkgICgoZGF0YSAmIDB4MykgfCAoKHN0b3AgJiAweDEpIDw8IDIpIHwgKChwYXJpdHkgJiAweDMpIDw8IDMpKQorI2RlZmluZSBfX2dldF9ycG5fZGF0YV9iaXRzKGxpbmUpICgobGluZSkgJiAweDMpCisjZGVmaW5lIF9fZ2V0X3Jwbl9zdG9wX2JpdHMobGluZSkgKCgobGluZSkgPj4gMikgJiAweDEpCisjZGVmaW5lIF9fZ2V0X3Jwbl9wYXJpdHkobGluZSkgICAgKCgobGluZSkgPj4gMykgJiAweDMpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZmNvbW1fc2NoZWR1bGUodWludCBldmVudCkKK3sKKwlpZiAoIXJmY29tbV90aHJlYWQpCisJCXJldHVybjsKKwkvL3NldF9iaXQoZXZlbnQsICZyZmNvbW1fZXZlbnQpOworCXNldF9iaXQoUkZDT01NX1NDSEVEX1dBS0VVUCwgJnJmY29tbV9ldmVudCk7CisJd2FrZV91cF9wcm9jZXNzKHJmY29tbV90aHJlYWQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmZjb21tX3Nlc3Npb25fcHV0KHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcykKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcy0+cmVmY250KSkKKwkJcmZjb21tX3Nlc3Npb25fZGVsKHMpOworfQorCisvKiAtLS0tIFJGQ09NTSBGQ1MgY29tcHV0YXRpb24gLS0tLSAqLworCisvKiBDUkMgb24gMiBieXRlcyAqLworI2RlZmluZSBfX2NyYyhkYXRhKSAocmZjb21tX2NyY190YWJsZVtyZmNvbW1fY3JjX3RhYmxlWzB4ZmYgXiBkYXRhWzBdXSBeIGRhdGFbMV1dKQorCisvKiBGQ1Mgb24gMiBieXRlcyAqLyAKK3N0YXRpYyBpbmxpbmUgdTggX19mY3ModTggKmRhdGEpCit7CisJcmV0dXJuICgweGZmIC0gX19jcmMoZGF0YSkpOworfQorCisvKiBGQ1Mgb24gMyBieXRlcyAqLyAKK3N0YXRpYyBpbmxpbmUgdTggX19mY3MyKHU4ICpkYXRhKQoreworCXJldHVybiAoMHhmZiAtIHJmY29tbV9jcmNfdGFibGVbX19jcmMoZGF0YSkgXiBkYXRhWzJdXSk7Cit9CisKKy8qIENoZWNrIEZDUyAqLworc3RhdGljIGlubGluZSBpbnQgX19jaGVja19mY3ModTggKmRhdGEsIGludCB0eXBlLCB1OCBmY3MpCit7CisJdTggZiA9IF9fY3JjKGRhdGEpOworCisJaWYgKHR5cGUgIT0gUkZDT01NX1VJSCkKKwkJZiA9IHJmY29tbV9jcmNfdGFibGVbZiBeIGRhdGFbMl1dOworCisJcmV0dXJuIHJmY29tbV9jcmNfdGFibGVbZiBeIGZjc10gIT0gMHhjZjsKK30KKworLyogLS0tLSBMMkNBUCBjYWxsYmFja3MgLS0tLSAqLworc3RhdGljIHZvaWQgcmZjb21tX2wyc3RhdGVfY2hhbmdlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlCVF9EQkcoIiVwIHN0YXRlICVkIiwgc2ssIHNrLT5za19zdGF0ZSk7CisJcmZjb21tX3NjaGVkdWxlKFJGQ09NTV9TQ0hFRF9TVEFURSk7Cit9CisKK3N0YXRpYyB2b2lkIHJmY29tbV9sMmRhdGFfcmVhZHkoc3RydWN0IHNvY2sgKnNrLCBpbnQgYnl0ZXMpCit7CisJQlRfREJHKCIlcCBieXRlcyAlZCIsIHNrLCBieXRlcyk7CisJcmZjb21tX3NjaGVkdWxlKFJGQ09NTV9TQ0hFRF9SWCk7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX2wyc29ja19jcmVhdGUoc3RydWN0IHNvY2tldCAqKnNvY2spCit7CisJaW50IGVycjsKKworCUJUX0RCRygiIik7CisKKwllcnIgPSBzb2NrX2NyZWF0ZV9rZXJuKFBGX0JMVUVUT09USCwgU09DS19TRVFQQUNLRVQsIEJUUFJPVE9fTDJDQVAsIHNvY2spOworCWlmICghZXJyKSB7CisJCXN0cnVjdCBzb2NrICpzayA9ICgqc29jayktPnNrOworCQlzay0+c2tfZGF0YV9yZWFkeSAgID0gcmZjb21tX2wyZGF0YV9yZWFkeTsKKwkJc2stPnNrX3N0YXRlX2NoYW5nZSA9IHJmY29tbV9sMnN0YXRlX2NoYW5nZTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyogLS0tLSBSRkNPTU0gRExDcyAtLS0tICovCitzdGF0aWMgdm9pZCByZmNvbW1fZGxjX3RpbWVvdXQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHJmY29tbV9kbGMgKmQgPSAodm9pZCAqKSBhcmc7CisKKwlCVF9EQkcoImRsYyAlcCBzdGF0ZSAlbGQiLCBkLCBkLT5zdGF0ZSk7CisKKwlzZXRfYml0KFJGQ09NTV9USU1FRF9PVVQsICZkLT5mbGFncyk7CisJcmZjb21tX2RsY19wdXQoZCk7CisJcmZjb21tX3NjaGVkdWxlKFJGQ09NTV9TQ0hFRF9USU1FTyk7Cit9CisKK3N0YXRpYyB2b2lkIHJmY29tbV9kbGNfc2V0X3RpbWVyKHN0cnVjdCByZmNvbW1fZGxjICpkLCBsb25nIHRpbWVvdXQpCit7CisJQlRfREJHKCJkbGMgJXAgc3RhdGUgJWxkIHRpbWVvdXQgJWxkIiwgZCwgZC0+c3RhdGUsIHRpbWVvdXQpOworCisJaWYgKCFtb2RfdGltZXIoJmQtPnRpbWVyLCBqaWZmaWVzICsgdGltZW91dCkpCisJCXJmY29tbV9kbGNfaG9sZChkKTsKK30KKworc3RhdGljIHZvaWQgcmZjb21tX2RsY19jbGVhcl90aW1lcihzdHJ1Y3QgcmZjb21tX2RsYyAqZCkKK3sKKwlCVF9EQkcoImRsYyAlcCBzdGF0ZSAlbGQiLCBkLCBkLT5zdGF0ZSk7CisKKwlpZiAodGltZXJfcGVuZGluZygmZC0+dGltZXIpICYmIGRlbF90aW1lcigmZC0+dGltZXIpKQorCQlyZmNvbW1fZGxjX3B1dChkKTsKK30KKworc3RhdGljIHZvaWQgcmZjb21tX2RsY19jbGVhcl9zdGF0ZShzdHJ1Y3QgcmZjb21tX2RsYyAqZCkKK3sKKwlCVF9EQkcoIiVwIiwgZCk7CisKKwlkLT5zdGF0ZSAgICAgID0gQlRfT1BFTjsKKwlkLT5mbGFncyAgICAgID0gMDsKKwlkLT5tc2NleCAgICAgID0gMDsKKwlkLT5tdHUgICAgICAgID0gUkZDT01NX0RFRkFVTFRfTVRVOworCWQtPnYyNF9zaWcgICAgPSBSRkNPTU1fVjI0X1JUQyB8IFJGQ09NTV9WMjRfUlRSIHwgUkZDT01NX1YyNF9EVjsKKworCWQtPmNmYyAgICAgICAgPSBSRkNPTU1fQ0ZDX0RJU0FCTEVEOworCWQtPnJ4X2NyZWRpdHMgPSBSRkNPTU1fREVGQVVMVF9DUkVESVRTOworfQorCitzdHJ1Y3QgcmZjb21tX2RsYyAqcmZjb21tX2RsY19hbGxvYyhpbnQgcHJpbykKK3sKKwlzdHJ1Y3QgcmZjb21tX2RsYyAqZCA9IGttYWxsb2Moc2l6ZW9mKCpkKSwgcHJpbyk7CisJaWYgKCFkKQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQoZCwgMCwgc2l6ZW9mKCpkKSk7CisKKwlpbml0X3RpbWVyKCZkLT50aW1lcik7CisJZC0+dGltZXIuZnVuY3Rpb24gPSByZmNvbW1fZGxjX3RpbWVvdXQ7CisJZC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmZC0+dHhfcXVldWUpOworCXNwaW5fbG9ja19pbml0KCZkLT5sb2NrKTsKKwlhdG9taWNfc2V0KCZkLT5yZWZjbnQsIDEpOworCisJcmZjb21tX2RsY19jbGVhcl9zdGF0ZShkKTsKKwkKKwlCVF9EQkcoIiVwIiwgZCk7CisJcmV0dXJuIGQ7Cit9CisKK3ZvaWQgcmZjb21tX2RsY19mcmVlKHN0cnVjdCByZmNvbW1fZGxjICpkKQoreworCUJUX0RCRygiJXAiLCBkKTsKKworCXNrYl9xdWV1ZV9wdXJnZSgmZC0+dHhfcXVldWUpOworCWtmcmVlKGQpOworfQorCitzdGF0aWMgdm9pZCByZmNvbW1fZGxjX2xpbmsoc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCBzdHJ1Y3QgcmZjb21tX2RsYyAqZCkKK3sKKwlCVF9EQkcoImRsYyAlcCBzZXNzaW9uICVwIiwgZCwgcyk7CisKKwlyZmNvbW1fc2Vzc2lvbl9ob2xkKHMpOworCisJcmZjb21tX2RsY19ob2xkKGQpOworCWxpc3RfYWRkKCZkLT5saXN0LCAmcy0+ZGxjcyk7CisJZC0+c2Vzc2lvbiA9IHM7Cit9CisKK3N0YXRpYyB2b2lkIHJmY29tbV9kbGNfdW5saW5rKHN0cnVjdCByZmNvbW1fZGxjICpkKQoreworCXN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcyA9IGQtPnNlc3Npb247CisKKwlCVF9EQkcoImRsYyAlcCByZWZjbnQgJWQgc2Vzc2lvbiAlcCIsIGQsIGF0b21pY19yZWFkKCZkLT5yZWZjbnQpLCBzKTsKKworCWxpc3RfZGVsKCZkLT5saXN0KTsKKwlkLT5zZXNzaW9uID0gTlVMTDsKKwlyZmNvbW1fZGxjX3B1dChkKTsKKworCXJmY29tbV9zZXNzaW9uX3B1dChzKTsKK30KKworc3RhdGljIHN0cnVjdCByZmNvbW1fZGxjICpyZmNvbW1fZGxjX2dldChzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIHU4IGRsY2kpCit7CisJc3RydWN0IHJmY29tbV9kbGMgKmQ7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworCWxpc3RfZm9yX2VhY2gocCwgJnMtPmRsY3MpIHsKKwkJZCA9IGxpc3RfZW50cnkocCwgc3RydWN0IHJmY29tbV9kbGMsIGxpc3QpOworCQlpZiAoZC0+ZGxjaSA9PSBkbGNpKQorCQkJcmV0dXJuIGQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IF9fcmZjb21tX2RsY19vcGVuKHN0cnVjdCByZmNvbW1fZGxjICpkLCBiZGFkZHJfdCAqc3JjLCBiZGFkZHJfdCAqZHN0LCB1OCBjaGFubmVsKQoreworCXN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqczsKKwlpbnQgZXJyID0gMDsKKwl1OCBkbGNpOworCisJQlRfREJHKCJkbGMgJXAgc3RhdGUgJWxkICVzICVzIGNoYW5uZWwgJWQiLCAKKwkJCWQsIGQtPnN0YXRlLCBiYXRvc3RyKHNyYyksIGJhdG9zdHIoZHN0KSwgY2hhbm5lbCk7CisKKwlpZiAoY2hhbm5lbCA8IDEgfHwgY2hhbm5lbCA+IDMwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChkLT5zdGF0ZSAhPSBCVF9PUEVOICYmIGQtPnN0YXRlICE9IEJUX0NMT1NFRCkKKwkJcmV0dXJuIDA7CisKKwlzID0gcmZjb21tX3Nlc3Npb25fZ2V0KHNyYywgZHN0KTsKKwlpZiAoIXMpIHsKKwkJcyA9IHJmY29tbV9zZXNzaW9uX2NyZWF0ZShzcmMsIGRzdCwgJmVycik7CisJCWlmICghcykKKwkJCXJldHVybiBlcnI7CisJfQorCisJZGxjaSA9IF9fZGxjaSghcy0+aW5pdGlhdG9yLCBjaGFubmVsKTsKKworCS8qIENoZWNrIGlmIERMQ0kgYWxyZWFkeSBleGlzdHMgKi8KKwlpZiAocmZjb21tX2RsY19nZXQocywgZGxjaSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZmNvbW1fZGxjX2NsZWFyX3N0YXRlKGQpOworCisJZC0+ZGxjaSAgICAgPSBkbGNpOworCWQtPmFkZHIgICAgID0gX19hZGRyKHMtPmluaXRpYXRvciwgZGxjaSk7CisJZC0+cHJpb3JpdHkgPSA3OworCisJZC0+c3RhdGUgICAgPSBCVF9DT05GSUc7CisJcmZjb21tX2RsY19saW5rKHMsIGQpOworCisJZC0+bXR1ID0gcy0+bXR1OworCWQtPmNmYyA9IChzLT5jZmMgPT0gUkZDT01NX0NGQ19VTktOT1dOKSA/IDAgOiBzLT5jZmM7CisKKwlpZiAocy0+c3RhdGUgPT0gQlRfQ09OTkVDVEVEKQorCQlyZmNvbW1fc2VuZF9wbihzLCAxLCBkKTsKKwlyZmNvbW1fZGxjX3NldF90aW1lcihkLCBSRkNPTU1fQ09OTl9USU1FT1VUKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJmY29tbV9kbGNfb3BlbihzdHJ1Y3QgcmZjb21tX2RsYyAqZCwgYmRhZGRyX3QgKnNyYywgYmRhZGRyX3QgKmRzdCwgdTggY2hhbm5lbCkKK3sKKwlpbnQgcjsKKworCXJmY29tbV9sb2NrKCk7CisKKwlyID0gX19yZmNvbW1fZGxjX29wZW4oZCwgc3JjLCBkc3QsIGNoYW5uZWwpOworCisJcmZjb21tX3VubG9jaygpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9fcmZjb21tX2RsY19jbG9zZShzdHJ1Y3QgcmZjb21tX2RsYyAqZCwgaW50IGVycikKK3sKKwlzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMgPSBkLT5zZXNzaW9uOworCWlmICghcykKKwkJcmV0dXJuIDA7CisKKwlCVF9EQkcoImRsYyAlcCBzdGF0ZSAlbGQgZGxjaSAlZCBlcnIgJWQgc2Vzc2lvbiAlcCIsCisJCQlkLCBkLT5zdGF0ZSwgZC0+ZGxjaSwgZXJyLCBzKTsKKworCXN3aXRjaCAoZC0+c3RhdGUpIHsKKwljYXNlIEJUX0NPTk5FQ1RFRDoKKwljYXNlIEJUX0NPTkZJRzoKKwljYXNlIEJUX0NPTk5FQ1Q6CisJCWQtPnN0YXRlID0gQlRfRElTQ09OTjsKKwkJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmZC0+dHhfcXVldWUpKSB7CisJCQlyZmNvbW1fc2VuZF9kaXNjKHMsIGQtPmRsY2kpOworCQkJcmZjb21tX2RsY19zZXRfdGltZXIoZCwgUkZDT01NX0RJU0NfVElNRU9VVCk7CisJCX0gZWxzZSB7CisJCQlyZmNvbW1fcXVldWVfZGlzYyhkKTsKKwkJCXJmY29tbV9kbGNfc2V0X3RpbWVyKGQsIFJGQ09NTV9ESVNDX1RJTUVPVVQgKiAyKTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJmY29tbV9kbGNfY2xlYXJfdGltZXIoZCk7CisKKwkJcmZjb21tX2RsY19sb2NrKGQpOworCQlkLT5zdGF0ZSA9IEJUX0NMT1NFRDsKKwkJZC0+c3RhdGVfY2hhbmdlKGQsIGVycik7CisJCXJmY29tbV9kbGNfdW5sb2NrKGQpOworCisJCXNrYl9xdWV1ZV9wdXJnZSgmZC0+dHhfcXVldWUpOworCQlyZmNvbW1fc2Vzc2lvbl9wdXQocyk7CisKKwkJcmZjb21tX2RsY191bmxpbmsoZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCByZmNvbW1fZGxjX2Nsb3NlKHN0cnVjdCByZmNvbW1fZGxjICpkLCBpbnQgZXJyKQoreworCWludCByOworCisJcmZjb21tX2xvY2soKTsKKworCXIgPSBfX3JmY29tbV9kbGNfY2xvc2UoZCwgZXJyKTsKKworCXJmY29tbV91bmxvY2soKTsKKwlyZXR1cm4gcjsKK30KKworaW50IHJmY29tbV9kbGNfc2VuZChzdHJ1Y3QgcmZjb21tX2RsYyAqZCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgbGVuID0gc2tiLT5sZW47CisKKwlpZiAoZC0+c3RhdGUgIT0gQlRfQ09OTkVDVEVEKQorCQlyZXR1cm4gLUVOT1RDT05OOworCisJQlRfREJHKCJkbGMgJXAgbXR1ICVkIGxlbiAlZCIsIGQsIGQtPm10dSwgbGVuKTsKKworCWlmIChsZW4gPiBkLT5tdHUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmZjb21tX21ha2VfdWloKHNrYiwgZC0+YWRkcik7CisJc2tiX3F1ZXVlX3RhaWwoJmQtPnR4X3F1ZXVlLCBza2IpOworCisJaWYgKCF0ZXN0X2JpdChSRkNPTU1fVFhfVEhST1RUTEVELCAmZC0+ZmxhZ3MpKQorCQlyZmNvbW1fc2NoZWR1bGUoUkZDT01NX1NDSEVEX1RYKTsKKwlyZXR1cm4gbGVuOworfQorCit2b2lkIGZhc3RjYWxsIF9fcmZjb21tX2RsY190aHJvdHRsZShzdHJ1Y3QgcmZjb21tX2RsYyAqZCkKK3sKKwlCVF9EQkcoImRsYyAlcCBzdGF0ZSAlbGQiLCBkLCBkLT5zdGF0ZSk7CisKKwlpZiAoIWQtPmNmYykgeworCQlkLT52MjRfc2lnIHw9IFJGQ09NTV9WMjRfRkM7CisJCXNldF9iaXQoUkZDT01NX01TQ19QRU5ESU5HLCAmZC0+ZmxhZ3MpOworCX0KKwlyZmNvbW1fc2NoZWR1bGUoUkZDT01NX1NDSEVEX1RYKTsKK30KKwordm9pZCBmYXN0Y2FsbCBfX3JmY29tbV9kbGNfdW50aHJvdHRsZShzdHJ1Y3QgcmZjb21tX2RsYyAqZCkKK3sKKwlCVF9EQkcoImRsYyAlcCBzdGF0ZSAlbGQiLCBkLCBkLT5zdGF0ZSk7CisKKwlpZiAoIWQtPmNmYykgeworCQlkLT52MjRfc2lnICY9IH5SRkNPTU1fVjI0X0ZDOworCQlzZXRfYml0KFJGQ09NTV9NU0NfUEVORElORywgJmQtPmZsYWdzKTsKKwl9CisJcmZjb21tX3NjaGVkdWxlKFJGQ09NTV9TQ0hFRF9UWCk7Cit9CisKKy8qIAorICAgU2V0L2dldCBtb2RlbSBzdGF0dXMgZnVuY3Rpb25zIHVzZSBfbG9jYWxfIHN0YXR1cyBpLmUuIHdoYXQgd2UgcmVwb3J0CisgICB0byB0aGUgb3RoZXIgc2lkZS4KKyAgIFJlbW90ZSBzdGF0dXMgaXMgcHJvdmlkZWQgYnkgZGxjLT5tb2RlbV9zdGF0dXMoKSBjYWxsYmFjay4KKyAqLworaW50IHJmY29tbV9kbGNfc2V0X21vZGVtX3N0YXR1cyhzdHJ1Y3QgcmZjb21tX2RsYyAqZCwgdTggdjI0X3NpZykKK3sKKwlCVF9EQkcoImRsYyAlcCBzdGF0ZSAlbGQgdjI0X3NpZyAweCV4IiwgCisJCQlkLCBkLT5zdGF0ZSwgdjI0X3NpZyk7CisKKwlpZiAodGVzdF9iaXQoUkZDT01NX1JYX1RIUk9UVExFRCwgJmQtPmZsYWdzKSkKKwkJdjI0X3NpZyB8PSBSRkNPTU1fVjI0X0ZDOworCWVsc2UKKwkJdjI0X3NpZyAmPSB+UkZDT01NX1YyNF9GQzsKKwkKKwlkLT52MjRfc2lnID0gdjI0X3NpZzsKKworCWlmICghdGVzdF9hbmRfc2V0X2JpdChSRkNPTU1fTVNDX1BFTkRJTkcsICZkLT5mbGFncykpCisJCXJmY29tbV9zY2hlZHVsZShSRkNPTU1fU0NIRURfVFgpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCByZmNvbW1fZGxjX2dldF9tb2RlbV9zdGF0dXMoc3RydWN0IHJmY29tbV9kbGMgKmQsIHU4ICp2MjRfc2lnKQoreworCUJUX0RCRygiZGxjICVwIHN0YXRlICVsZCB2MjRfc2lnIDB4JXgiLCAKKwkJCWQsIGQtPnN0YXRlLCBkLT52MjRfc2lnKTsKKworCSp2MjRfc2lnID0gZC0+djI0X3NpZzsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLSBSRkNPTU0gc2Vzc2lvbnMgLS0tLSAqLworc3RhdGljIHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcmZjb21tX3Nlc3Npb25fYWRkKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOworCWlmICghcykKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KHMsIDAsIHNpemVvZigqcykpOworCisJQlRfREJHKCJzZXNzaW9uICVwIHNvY2sgJXAiLCBzLCBzb2NrKTsKKworCUlOSVRfTElTVF9IRUFEKCZzLT5kbGNzKTsKKwlzLT5zdGF0ZSA9IHN0YXRlOworCXMtPnNvY2sgID0gc29jazsKKworCXMtPm10dSA9IFJGQ09NTV9ERUZBVUxUX01UVTsKKwlzLT5jZmMgPSBSRkNPTU1fQ0ZDX1VOS05PV047CisKKwkvKiBEbyBub3QgaW5jcmVtZW50IG1vZHVsZSB1c2FnZSBjb3VudCBmb3IgbGlzdGVuaW5nIHNlc3Npb25zLgorCSAqIE90aGVyd2lzZSB3ZSB3b24ndCBiZSBhYmxlIHRvIHVubG9hZCB0aGUgbW9kdWxlLiAqLworCWlmIChzdGF0ZSAhPSBCVF9MSVNURU4pCisJCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKSB7CisJCQlrZnJlZShzKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwlsaXN0X2FkZCgmcy0+bGlzdCwgJnNlc3Npb25fbGlzdCk7CisKKwlyZXR1cm4gczsKK30KKworc3RhdGljIHZvaWQgcmZjb21tX3Nlc3Npb25fZGVsKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcykKK3sKKwlpbnQgc3RhdGUgPSBzLT5zdGF0ZTsKKworCUJUX0RCRygic2Vzc2lvbiAlcCBzdGF0ZSAlbGQiLCBzLCBzLT5zdGF0ZSk7CisKKwlsaXN0X2RlbCgmcy0+bGlzdCk7CisKKwlpZiAoc3RhdGUgPT0gQlRfQ09OTkVDVEVEKQorCQlyZmNvbW1fc2VuZF9kaXNjKHMsIDApOworCisJc29ja19yZWxlYXNlKHMtPnNvY2spOworCWtmcmVlKHMpOworCisJaWYgKHN0YXRlICE9IEJUX0xJU1RFTikKKwkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnJmY29tbV9zZXNzaW9uX2dldChiZGFkZHJfdCAqc3JjLCBiZGFkZHJfdCAqZHN0KQoreworCXN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbjsKKwlzdHJ1Y3QgYnRfc29jayAqc2s7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZzZXNzaW9uX2xpc3QpIHsKKwkJcyA9IGxpc3RfZW50cnkocCwgc3RydWN0IHJmY29tbV9zZXNzaW9uLCBsaXN0KTsKKwkJc2sgPSBidF9zayhzLT5zb2NrLT5zayk7IAorCisJCWlmICgoIWJhY21wKHNyYywgQkRBRERSX0FOWSkgfHwgIWJhY21wKCZzay0+c3JjLCBzcmMpKSAmJgorCQkJCSFiYWNtcCgmc2stPmRzdCwgZHN0KSkKKwkJCXJldHVybiBzOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcmZjb21tX3Nlc3Npb25fY2xvc2Uoc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCBpbnQgZXJyKQoreworCXN0cnVjdCByZmNvbW1fZGxjICpkOworCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOworCisJQlRfREJHKCJzZXNzaW9uICVwIHN0YXRlICVsZCBlcnIgJWQiLCBzLCBzLT5zdGF0ZSwgZXJyKTsKKworCXJmY29tbV9zZXNzaW9uX2hvbGQocyk7CisKKwlzLT5zdGF0ZSA9IEJUX0NMT1NFRDsKKworCS8qIENsb3NlIGFsbCBkbGNzICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZzLT5kbGNzKSB7CisJCWQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZmNvbW1fZGxjLCBsaXN0KTsKKwkJZC0+c3RhdGUgPSBCVF9DTE9TRUQ7CisJCV9fcmZjb21tX2RsY19jbG9zZShkLCBlcnIpOworCX0KKworCXJmY29tbV9zZXNzaW9uX3B1dChzKTsKK30KKworc3RhdGljIHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcmZjb21tX3Nlc3Npb25fY3JlYXRlKGJkYWRkcl90ICpzcmMsIGJkYWRkcl90ICpkc3QsIGludCAqZXJyKQoreworCXN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcyA9IE5VTEw7CisJc3RydWN0IHNvY2thZGRyX2wyIGFkZHI7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlCVF9EQkcoIiVzICVzIiwgYmF0b3N0cihzcmMpLCBiYXRvc3RyKGRzdCkpOworCisJKmVyciA9IHJmY29tbV9sMnNvY2tfY3JlYXRlKCZzb2NrKTsKKwlpZiAoKmVyciA8IDApCisJCXJldHVybiBOVUxMOworCisJYmFjcHkoJmFkZHIubDJfYmRhZGRyLCBzcmMpOworCWFkZHIubDJfZmFtaWx5ID0gQUZfQkxVRVRPT1RIOworCWFkZHIubDJfcHNtICAgID0gMDsKKwkqZXJyID0gc29jay0+b3BzLT5iaW5kKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSk7CisJaWYgKCplcnIgPCAwKQorCQlnb3RvIGZhaWxlZDsKKworCS8qIFNldCBMMkNBUCBvcHRpb25zICovCisJc2sgPSBzb2NrLT5zazsKKwlsb2NrX3NvY2soc2spOworCWwyY2FwX3BpKHNrKS0+aW10dSA9IFJGQ09NTV9NQVhfTDJDQVBfTVRVOworCXJlbGVhc2Vfc29jayhzayk7CisKKwlzID0gcmZjb21tX3Nlc3Npb25fYWRkKHNvY2ssIEJUX0JPVU5EKTsKKwlpZiAoIXMpIHsKKwkJKmVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbGVkOworCX0KKworCXJmY29tbV9zZXNzaW9uX2hvbGQocyk7CisKKwlzLT5pbml0aWF0b3IgPSAxOworCisJYmFjcHkoJmFkZHIubDJfYmRhZGRyLCBkc3QpOworCWFkZHIubDJfZmFtaWx5ID0gQUZfQkxVRVRPT1RIOworCWFkZHIubDJfcHNtICAgID0gaHRvYnMoUkZDT01NX1BTTSk7CisJKmVyciA9IHNvY2stPm9wcy0+Y29ubmVjdChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkciksIE9fTk9OQkxPQ0spOworCWlmICgqZXJyID09IDAgfHwgKmVyciA9PSAtRUFHQUlOKQorCQlyZXR1cm4gczsKKworCXJmY29tbV9zZXNzaW9uX2RlbChzKTsKKwlyZXR1cm4gTlVMTDsKKworZmFpbGVkOgorCXNvY2tfcmVsZWFzZShzb2NrKTsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCByZmNvbW1fc2Vzc2lvbl9nZXRhZGRyKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgYmRhZGRyX3QgKnNyYywgYmRhZGRyX3QgKmRzdCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzLT5zb2NrLT5zazsKKwlpZiAoc3JjKQorCQliYWNweShzcmMsICZidF9zayhzayktPnNyYyk7CisJaWYgKGRzdCkKKwkJYmFjcHkoZHN0LCAmYnRfc2soc2spLT5kc3QpOworfQorCisvKiAtLS0tIFJGQ09NTSBmcmFtZSBzZW5kaW5nIC0tLS0gKi8KK3N0YXRpYyBpbnQgcmZjb21tX3NlbmRfZnJhbWUoc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCB1OCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gcy0+c29jazsKKwlzdHJ1Y3Qga3ZlYyBpdiA9IHsgZGF0YSwgbGVuIH07CisJc3RydWN0IG1zZ2hkciBtc2c7CisKKwlCVF9EQkcoInNlc3Npb24gJXAgbGVuICVkIiwgcywgbGVuKTsKKworCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisKKwlyZXR1cm4ga2VybmVsX3NlbmRtc2coc29jaywgJm1zZywgJml2LCAxLCBsZW4pOworfQorCitzdGF0aWMgaW50IHJmY29tbV9zZW5kX3NhYm0oc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCB1OCBkbGNpKQoreworCXN0cnVjdCByZmNvbW1fY21kIGNtZDsKKworCUJUX0RCRygiJXAgZGxjaSAlZCIsIHMsIGRsY2kpOworCisJY21kLmFkZHIgPSBfX2FkZHIocy0+aW5pdGlhdG9yLCBkbGNpKTsKKwljbWQuY3RybCA9IF9fY3RybChSRkNPTU1fU0FCTSwgMSk7CisJY21kLmxlbiAgPSBfX2xlbjgoMCk7CisJY21kLmZjcyAgPSBfX2ZjczIoKHU4ICopICZjbWQpOworCisJcmV0dXJuIHJmY29tbV9zZW5kX2ZyYW1lKHMsICh2b2lkICopICZjbWQsIHNpemVvZihjbWQpKTsKK30KKworc3RhdGljIGludCByZmNvbW1fc2VuZF91YShzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIHU4IGRsY2kpCit7CisJc3RydWN0IHJmY29tbV9jbWQgY21kOworCisJQlRfREJHKCIlcCBkbGNpICVkIiwgcywgZGxjaSk7CisKKwljbWQuYWRkciA9IF9fYWRkcighcy0+aW5pdGlhdG9yLCBkbGNpKTsKKwljbWQuY3RybCA9IF9fY3RybChSRkNPTU1fVUEsIDEpOworCWNtZC5sZW4gID0gX19sZW44KDApOworCWNtZC5mY3MgID0gX19mY3MyKCh1OCAqKSAmY21kKTsKKworCXJldHVybiByZmNvbW1fc2VuZF9mcmFtZShzLCAodm9pZCAqKSAmY21kLCBzaXplb2YoY21kKSk7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NlbmRfZGlzYyhzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIHU4IGRsY2kpCit7CisJc3RydWN0IHJmY29tbV9jbWQgY21kOworCisJQlRfREJHKCIlcCBkbGNpICVkIiwgcywgZGxjaSk7CisKKwljbWQuYWRkciA9IF9fYWRkcihzLT5pbml0aWF0b3IsIGRsY2kpOworCWNtZC5jdHJsID0gX19jdHJsKFJGQ09NTV9ESVNDLCAxKTsKKwljbWQubGVuICA9IF9fbGVuOCgwKTsKKwljbWQuZmNzICA9IF9fZmNzMigodTggKikgJmNtZCk7CisKKwlyZXR1cm4gcmZjb21tX3NlbmRfZnJhbWUocywgKHZvaWQgKikgJmNtZCwgc2l6ZW9mKGNtZCkpOworfQorCitzdGF0aWMgaW50IHJmY29tbV9xdWV1ZV9kaXNjKHN0cnVjdCByZmNvbW1fZGxjICpkKQoreworCXN0cnVjdCByZmNvbW1fY21kICpjbWQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCUJUX0RCRygiZGxjICVwIGRsY2kgJWQiLCBkLCBkLT5kbGNpKTsKKworCXNrYiA9IGFsbG9jX3NrYihzaXplb2YoKmNtZCksIEdGUF9LRVJORUwpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNtZCA9ICh2b2lkICopIF9fc2tiX3B1dChza2IsIHNpemVvZigqY21kKSk7CisJY21kLT5hZGRyID0gZC0+YWRkcjsKKwljbWQtPmN0cmwgPSBfX2N0cmwoUkZDT01NX0RJU0MsIDEpOworCWNtZC0+bGVuICA9IF9fbGVuOCgwKTsKKwljbWQtPmZjcyAgPSBfX2ZjczIoKHU4ICopIGNtZCk7CisKKwlza2JfcXVldWVfdGFpbCgmZC0+dHhfcXVldWUsIHNrYik7CisJcmZjb21tX3NjaGVkdWxlKFJGQ09NTV9TQ0hFRF9UWCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NlbmRfZG0oc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCB1OCBkbGNpKQoreworCXN0cnVjdCByZmNvbW1fY21kIGNtZDsKKworCUJUX0RCRygiJXAgZGxjaSAlZCIsIHMsIGRsY2kpOworCisJY21kLmFkZHIgPSBfX2FkZHIoIXMtPmluaXRpYXRvciwgZGxjaSk7CisJY21kLmN0cmwgPSBfX2N0cmwoUkZDT01NX0RNLCAxKTsKKwljbWQubGVuICA9IF9fbGVuOCgwKTsKKwljbWQuZmNzICA9IF9fZmNzMigodTggKikgJmNtZCk7CisKKwlyZXR1cm4gcmZjb21tX3NlbmRfZnJhbWUocywgKHZvaWQgKikgJmNtZCwgc2l6ZW9mKGNtZCkpOworfQorCitzdGF0aWMgaW50IHJmY29tbV9zZW5kX25zYyhzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIGludCBjciwgdTggdHlwZSkKK3sKKwlzdHJ1Y3QgcmZjb21tX2hkciAqaGRyOworCXN0cnVjdCByZmNvbW1fbWNjICptY2M7CisJdTggYnVmWzE2XSwgKnB0ciA9IGJ1ZjsKKworCUJUX0RCRygiJXAgY3IgJWQgdHlwZSAlZCIsIHMsIGNyLCB0eXBlKTsKKworCWhkciA9ICh2b2lkICopIHB0cjsgcHRyICs9IHNpemVvZigqaGRyKTsKKwloZHItPmFkZHIgPSBfX2FkZHIocy0+aW5pdGlhdG9yLCAwKTsKKwloZHItPmN0cmwgPSBfX2N0cmwoUkZDT01NX1VJSCwgMCk7CisJaGRyLT5sZW4gID0gX19sZW44KHNpemVvZigqbWNjKSArIDEpOworCisJbWNjID0gKHZvaWQgKikgcHRyOyBwdHIgKz0gc2l6ZW9mKCptY2MpOworCW1jYy0+dHlwZSA9IF9fbWNjX3R5cGUoY3IsIFJGQ09NTV9OU0MpOworCW1jYy0+bGVuICA9IF9fbGVuOCgxKTsKKworCS8qIFR5cGUgdGhhdCB3ZSBkaWRuJ3QgbGlrZSAqLworCSpwdHIgPSBfX21jY190eXBlKGNyLCB0eXBlKTsgcHRyKys7CisKKwkqcHRyID0gX19mY3MoYnVmKTsgcHRyKys7CisKKwlyZXR1cm4gcmZjb21tX3NlbmRfZnJhbWUocywgYnVmLCBwdHIgLSBidWYpOworfQorCitzdGF0aWMgaW50IHJmY29tbV9zZW5kX3BuKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgaW50IGNyLCBzdHJ1Y3QgcmZjb21tX2RsYyAqZCkKK3sKKwlzdHJ1Y3QgcmZjb21tX2hkciAqaGRyOworCXN0cnVjdCByZmNvbW1fbWNjICptY2M7CisJc3RydWN0IHJmY29tbV9wbiAgKnBuOworCXU4IGJ1ZlsxNl0sICpwdHIgPSBidWY7CisKKwlCVF9EQkcoIiVwIGNyICVkIGRsY2kgJWQgbXR1ICVkIiwgcywgY3IsIGQtPmRsY2ksIGQtPm10dSk7CisKKwloZHIgPSAodm9pZCAqKSBwdHI7IHB0ciArPSBzaXplb2YoKmhkcik7CisJaGRyLT5hZGRyID0gX19hZGRyKHMtPmluaXRpYXRvciwgMCk7CisJaGRyLT5jdHJsID0gX19jdHJsKFJGQ09NTV9VSUgsIDApOworCWhkci0+bGVuICA9IF9fbGVuOChzaXplb2YoKm1jYykgKyBzaXplb2YoKnBuKSk7CisKKwltY2MgPSAodm9pZCAqKSBwdHI7IHB0ciArPSBzaXplb2YoKm1jYyk7CisJbWNjLT50eXBlID0gX19tY2NfdHlwZShjciwgUkZDT01NX1BOKTsKKwltY2MtPmxlbiAgPSBfX2xlbjgoc2l6ZW9mKCpwbikpOworCisJcG4gPSAodm9pZCAqKSBwdHI7IHB0ciArPSBzaXplb2YoKnBuKTsKKwlwbi0+ZGxjaSAgICAgICAgPSBkLT5kbGNpOworCXBuLT5wcmlvcml0eSAgICA9IGQtPnByaW9yaXR5OworCXBuLT5hY2tfdGltZXIgICA9IDA7CisJcG4tPm1heF9yZXRyYW5zID0gMDsKKworCWlmIChzLT5jZmMpIHsKKwkJcG4tPmZsb3dfY3RybCA9IGNyID8gMHhmMCA6IDB4ZTA7CisJCXBuLT5jcmVkaXRzID0gUkZDT01NX0RFRkFVTFRfQ1JFRElUUzsKKwl9IGVsc2UgeworCQlwbi0+Zmxvd19jdHJsID0gMDsKKwkJcG4tPmNyZWRpdHMgICA9IDA7CisJfQorCisJcG4tPm10dSA9IGh0b2JzKGQtPm10dSk7CisKKwkqcHRyID0gX19mY3MoYnVmKTsgcHRyKys7CisKKwlyZXR1cm4gcmZjb21tX3NlbmRfZnJhbWUocywgYnVmLCBwdHIgLSBidWYpOworfQorCitzdGF0aWMgaW50IHJmY29tbV9zZW5kX3JwbihzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIGludCBjciwgdTggZGxjaSwKKwkJCSAgIHU4IGJpdF9yYXRlLCB1OCBkYXRhX2JpdHMsIHU4IHN0b3BfYml0cywKKwkJCSAgIHU4IHBhcml0eSwgdTggZmxvd19jdHJsX3NldHRpbmdzLCAKKwkJCSAgIHU4IHhvbl9jaGFyLCB1OCB4b2ZmX2NoYXIsIHUxNiBwYXJhbV9tYXNrKQoreworCXN0cnVjdCByZmNvbW1faGRyICpoZHI7CisJc3RydWN0IHJmY29tbV9tY2MgKm1jYzsKKwlzdHJ1Y3QgcmZjb21tX3JwbiAqcnBuOworCXU4IGJ1ZlsxNl0sICpwdHIgPSBidWY7CisKKwlCVF9EQkcoIiVwIGNyICVkIGRsY2kgJWQgYml0X3IgMHgleCBkYXRhX2IgMHgleCBzdG9wX2IgMHgleCBwYXJpdHkgMHgleCIKKwkgICAgICAgImZsd2NfcyAweCV4IHhvbl9jIDB4JXggeG9mZl9jIDB4JXggcF9tYXNrIDB4JXgiLCAKKwkJCXMsIGNyLCBkbGNpLCBiaXRfcmF0ZSwgZGF0YV9iaXRzLCBzdG9wX2JpdHMsIHBhcml0eSwgCisJCQlmbG93X2N0cmxfc2V0dGluZ3MsIHhvbl9jaGFyLCB4b2ZmX2NoYXIsIHBhcmFtX21hc2spOworCisJaGRyID0gKHZvaWQgKikgcHRyOyBwdHIgKz0gc2l6ZW9mKCpoZHIpOworCWhkci0+YWRkciA9IF9fYWRkcihzLT5pbml0aWF0b3IsIDApOworCWhkci0+Y3RybCA9IF9fY3RybChSRkNPTU1fVUlILCAwKTsKKwloZHItPmxlbiAgPSBfX2xlbjgoc2l6ZW9mKCptY2MpICsgc2l6ZW9mKCpycG4pKTsKKworCW1jYyA9ICh2b2lkICopIHB0cjsgcHRyICs9IHNpemVvZigqbWNjKTsKKwltY2MtPnR5cGUgPSBfX21jY190eXBlKGNyLCBSRkNPTU1fUlBOKTsKKwltY2MtPmxlbiAgPSBfX2xlbjgoc2l6ZW9mKCpycG4pKTsKKworCXJwbiA9ICh2b2lkICopIHB0cjsgcHRyICs9IHNpemVvZigqcnBuKTsKKwlycG4tPmRsY2kgICAgICAgICAgPSBfX2FkZHIoMSwgZGxjaSk7CisJcnBuLT5iaXRfcmF0ZSAgICAgID0gYml0X3JhdGU7CisJcnBuLT5saW5lX3NldHRpbmdzID0gX19ycG5fbGluZV9zZXR0aW5ncyhkYXRhX2JpdHMsIHN0b3BfYml0cywgcGFyaXR5KTsKKwlycG4tPmZsb3dfY3RybCAgICAgPSBmbG93X2N0cmxfc2V0dGluZ3M7CisJcnBuLT54b25fY2hhciAgICAgID0geG9uX2NoYXI7CisJcnBuLT54b2ZmX2NoYXIgICAgID0geG9mZl9jaGFyOworCXJwbi0+cGFyYW1fbWFzayAgICA9IHBhcmFtX21hc2s7CisKKwkqcHRyID0gX19mY3MoYnVmKTsgcHRyKys7CisKKwlyZXR1cm4gcmZjb21tX3NlbmRfZnJhbWUocywgYnVmLCBwdHIgLSBidWYpOworfQorCitzdGF0aWMgaW50IHJmY29tbV9zZW5kX3JscyhzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIGludCBjciwgdTggZGxjaSwgdTggc3RhdHVzKQoreworCXN0cnVjdCByZmNvbW1faGRyICpoZHI7CisJc3RydWN0IHJmY29tbV9tY2MgKm1jYzsKKwlzdHJ1Y3QgcmZjb21tX3JscyAqcmxzOworCXU4IGJ1ZlsxNl0sICpwdHIgPSBidWY7CisKKwlCVF9EQkcoIiVwIGNyICVkIHN0YXR1cyAweCV4IiwgcywgY3IsIHN0YXR1cyk7CisKKwloZHIgPSAodm9pZCAqKSBwdHI7IHB0ciArPSBzaXplb2YoKmhkcik7CisJaGRyLT5hZGRyID0gX19hZGRyKHMtPmluaXRpYXRvciwgMCk7CisJaGRyLT5jdHJsID0gX19jdHJsKFJGQ09NTV9VSUgsIDApOworCWhkci0+bGVuICA9IF9fbGVuOChzaXplb2YoKm1jYykgKyBzaXplb2YoKnJscykpOworCisJbWNjID0gKHZvaWQgKikgcHRyOyBwdHIgKz0gc2l6ZW9mKCptY2MpOworCW1jYy0+dHlwZSA9IF9fbWNjX3R5cGUoY3IsIFJGQ09NTV9STFMpOworCW1jYy0+bGVuICA9IF9fbGVuOChzaXplb2YoKnJscykpOworCisJcmxzID0gKHZvaWQgKikgcHRyOyBwdHIgKz0gc2l6ZW9mKCpybHMpOworCXJscy0+ZGxjaSAgID0gX19hZGRyKDEsIGRsY2kpOworCXJscy0+c3RhdHVzID0gc3RhdHVzOworCisJKnB0ciA9IF9fZmNzKGJ1Zik7IHB0cisrOworCisJcmV0dXJuIHJmY29tbV9zZW5kX2ZyYW1lKHMsIGJ1ZiwgcHRyIC0gYnVmKTsKK30KKworc3RhdGljIGludCByZmNvbW1fc2VuZF9tc2Moc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCBpbnQgY3IsIHU4IGRsY2ksIHU4IHYyNF9zaWcpCit7CisJc3RydWN0IHJmY29tbV9oZHIgKmhkcjsKKwlzdHJ1Y3QgcmZjb21tX21jYyAqbWNjOworCXN0cnVjdCByZmNvbW1fbXNjICptc2M7CisJdTggYnVmWzE2XSwgKnB0ciA9IGJ1ZjsKKworCUJUX0RCRygiJXAgY3IgJWQgdjI0IDB4JXgiLCBzLCBjciwgdjI0X3NpZyk7CisKKwloZHIgPSAodm9pZCAqKSBwdHI7IHB0ciArPSBzaXplb2YoKmhkcik7CisJaGRyLT5hZGRyID0gX19hZGRyKHMtPmluaXRpYXRvciwgMCk7CisJaGRyLT5jdHJsID0gX19jdHJsKFJGQ09NTV9VSUgsIDApOworCWhkci0+bGVuICA9IF9fbGVuOChzaXplb2YoKm1jYykgKyBzaXplb2YoKm1zYykpOworCisJbWNjID0gKHZvaWQgKikgcHRyOyBwdHIgKz0gc2l6ZW9mKCptY2MpOworCW1jYy0+dHlwZSA9IF9fbWNjX3R5cGUoY3IsIFJGQ09NTV9NU0MpOworCW1jYy0+bGVuICA9IF9fbGVuOChzaXplb2YoKm1zYykpOworCisJbXNjID0gKHZvaWQgKikgcHRyOyBwdHIgKz0gc2l6ZW9mKCptc2MpOworCW1zYy0+ZGxjaSAgICA9IF9fYWRkcigxLCBkbGNpKTsKKwltc2MtPnYyNF9zaWcgPSB2MjRfc2lnIHwgMHgwMTsKKworCSpwdHIgPSBfX2ZjcyhidWYpOyBwdHIrKzsKKworCXJldHVybiByZmNvbW1fc2VuZF9mcmFtZShzLCBidWYsIHB0ciAtIGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NlbmRfZmNvZmYoc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCBpbnQgY3IpCit7CisJc3RydWN0IHJmY29tbV9oZHIgKmhkcjsKKwlzdHJ1Y3QgcmZjb21tX21jYyAqbWNjOworCXU4IGJ1ZlsxNl0sICpwdHIgPSBidWY7CisKKwlCVF9EQkcoIiVwIGNyICVkIiwgcywgY3IpOworCisJaGRyID0gKHZvaWQgKikgcHRyOyBwdHIgKz0gc2l6ZW9mKCpoZHIpOworCWhkci0+YWRkciA9IF9fYWRkcihzLT5pbml0aWF0b3IsIDApOworCWhkci0+Y3RybCA9IF9fY3RybChSRkNPTU1fVUlILCAwKTsKKwloZHItPmxlbiAgPSBfX2xlbjgoc2l6ZW9mKCptY2MpKTsKKworCW1jYyA9ICh2b2lkICopIHB0cjsgcHRyICs9IHNpemVvZigqbWNjKTsKKwltY2MtPnR5cGUgPSBfX21jY190eXBlKGNyLCBSRkNPTU1fRkNPRkYpOworCW1jYy0+bGVuICA9IF9fbGVuOCgwKTsKKworCSpwdHIgPSBfX2ZjcyhidWYpOyBwdHIrKzsKKworCXJldHVybiByZmNvbW1fc2VuZF9mcmFtZShzLCBidWYsIHB0ciAtIGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NlbmRfZmNvbihzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIGludCBjcikKK3sKKwlzdHJ1Y3QgcmZjb21tX2hkciAqaGRyOworCXN0cnVjdCByZmNvbW1fbWNjICptY2M7CisJdTggYnVmWzE2XSwgKnB0ciA9IGJ1ZjsKKworCUJUX0RCRygiJXAgY3IgJWQiLCBzLCBjcik7CisKKwloZHIgPSAodm9pZCAqKSBwdHI7IHB0ciArPSBzaXplb2YoKmhkcik7CisJaGRyLT5hZGRyID0gX19hZGRyKHMtPmluaXRpYXRvciwgMCk7CisJaGRyLT5jdHJsID0gX19jdHJsKFJGQ09NTV9VSUgsIDApOworCWhkci0+bGVuICA9IF9fbGVuOChzaXplb2YoKm1jYykpOworCisJbWNjID0gKHZvaWQgKikgcHRyOyBwdHIgKz0gc2l6ZW9mKCptY2MpOworCW1jYy0+dHlwZSA9IF9fbWNjX3R5cGUoY3IsIFJGQ09NTV9GQ09OKTsKKwltY2MtPmxlbiAgPSBfX2xlbjgoMCk7CisKKwkqcHRyID0gX19mY3MoYnVmKTsgcHRyKys7CisKKwlyZXR1cm4gcmZjb21tX3NlbmRfZnJhbWUocywgYnVmLCBwdHIgLSBidWYpOworfQorCitzdGF0aWMgaW50IHJmY29tbV9zZW5kX3Rlc3Qoc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCBpbnQgY3IsIHU4ICpwYXR0ZXJuLCBpbnQgbGVuKQoreworCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBzLT5zb2NrOworCXN0cnVjdCBrdmVjIGl2WzNdOworCXN0cnVjdCBtc2doZHIgbXNnOworCXVuc2lnbmVkIGNoYXIgaGRyWzVdLCBjcmNbMV07CisKKwlpZiAobGVuID4gMTI1KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCUJUX0RCRygiJXAgY3IgJWQiLCBzLCBjcik7CisKKwloZHJbMF0gPSBfX2FkZHIocy0+aW5pdGlhdG9yLCAwKTsKKwloZHJbMV0gPSBfX2N0cmwoUkZDT01NX1VJSCwgMCk7CisJaGRyWzJdID0gMHgwMSB8ICgobGVuICsgMikgPDwgMSk7CisJaGRyWzNdID0gMHgwMSB8ICgoY3IgJiAweDAxKSA8PCAxKSB8IChSRkNPTU1fVEVTVCA8PCAyKTsKKwloZHJbNF0gPSAweDAxIHwgKGxlbiA8PCAxKTsKKworCWNyY1swXSA9IF9fZmNzKGhkcik7CisKKwlpdlswXS5pb3ZfYmFzZSA9IGhkcjsKKwlpdlswXS5pb3ZfbGVuICA9IDU7CisJaXZbMV0uaW92X2Jhc2UgPSBwYXR0ZXJuOworCWl2WzFdLmlvdl9sZW4gID0gbGVuOworCWl2WzJdLmlvdl9iYXNlID0gY3JjOworCWl2WzJdLmlvdl9sZW4gID0gMTsKKworCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisKKwlyZXR1cm4ga2VybmVsX3NlbmRtc2coc29jaywgJm1zZywgaXYsIDMsIDYgKyBsZW4pOworfQorCitzdGF0aWMgaW50IHJmY29tbV9zZW5kX2NyZWRpdHMoc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCB1OCBhZGRyLCB1OCBjcmVkaXRzKQoreworCXN0cnVjdCByZmNvbW1faGRyICpoZHI7CisJdTggYnVmWzE2XSwgKnB0ciA9IGJ1ZjsKKworCUJUX0RCRygiJXAgYWRkciAlZCBjcmVkaXRzICVkIiwgcywgYWRkciwgY3JlZGl0cyk7CisKKwloZHIgPSAodm9pZCAqKSBwdHI7IHB0ciArPSBzaXplb2YoKmhkcik7CisJaGRyLT5hZGRyID0gYWRkcjsKKwloZHItPmN0cmwgPSBfX2N0cmwoUkZDT01NX1VJSCwgMSk7CisJaGRyLT5sZW4gID0gX19sZW44KDApOworCisJKnB0ciA9IGNyZWRpdHM7IHB0cisrOworCisJKnB0ciA9IF9fZmNzKGJ1Zik7IHB0cisrOworCisJcmV0dXJuIHJmY29tbV9zZW5kX2ZyYW1lKHMsIGJ1ZiwgcHRyIC0gYnVmKTsKK30KKworc3RhdGljIHZvaWQgcmZjb21tX21ha2VfdWloKHN0cnVjdCBza19idWZmICpza2IsIHU4IGFkZHIpCit7CisJc3RydWN0IHJmY29tbV9oZHIgKmhkcjsKKwlpbnQgbGVuID0gc2tiLT5sZW47CisJdTggKmNyYzsKKworCWlmIChsZW4gPiAxMjcpIHsKKwkJaGRyID0gKHZvaWQgKikgc2tiX3B1c2goc2tiLCA0KTsKKwkJcHV0X3VuYWxpZ25lZChodG9icyhfX2xlbjE2KGxlbikpLCAodTE2ICopICZoZHItPmxlbik7CisJfSBlbHNlIHsKKwkJaGRyID0gKHZvaWQgKikgc2tiX3B1c2goc2tiLCAzKTsKKwkJaGRyLT5sZW4gPSBfX2xlbjgobGVuKTsKKwl9CisJaGRyLT5hZGRyID0gYWRkcjsKKwloZHItPmN0cmwgPSBfX2N0cmwoUkZDT01NX1VJSCwgMCk7CisKKwljcmMgPSBza2JfcHV0KHNrYiwgMSk7CisJKmNyYyA9IF9fZmNzKCh2b2lkICopIGhkcik7Cit9CisKKy8qIC0tLS0gUkZDT01NIGZyYW1lIHJlY2VwdGlvbiAtLS0tICovCitzdGF0aWMgaW50IHJmY29tbV9yZWN2X3VhKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgdTggZGxjaSkKK3sKKwlCVF9EQkcoInNlc3Npb24gJXAgc3RhdGUgJWxkIGRsY2kgJWQiLCBzLCBzLT5zdGF0ZSwgZGxjaSk7CisKKwlpZiAoZGxjaSkgeworCQkvKiBEYXRhIGNoYW5uZWwgKi8KKwkJc3RydWN0IHJmY29tbV9kbGMgKmQgPSByZmNvbW1fZGxjX2dldChzLCBkbGNpKTsKKwkJaWYgKCFkKSB7CisJCQlyZmNvbW1fc2VuZF9kbShzLCBkbGNpKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJc3dpdGNoIChkLT5zdGF0ZSkgeworCQljYXNlIEJUX0NPTk5FQ1Q6CisJCQlyZmNvbW1fZGxjX2NsZWFyX3RpbWVyKGQpOworCisJCQlyZmNvbW1fZGxjX2xvY2soZCk7CisJCQlkLT5zdGF0ZSA9IEJUX0NPTk5FQ1RFRDsKKwkJCWQtPnN0YXRlX2NoYW5nZShkLCAwKTsKKwkJCXJmY29tbV9kbGNfdW5sb2NrKGQpOworCisJCQlyZmNvbW1fc2VuZF9tc2MocywgMSwgZGxjaSwgZC0+djI0X3NpZyk7CisJCQlicmVhazsKKworCQljYXNlIEJUX0RJU0NPTk46CisJCQlkLT5zdGF0ZSA9IEJUX0NMT1NFRDsKKwkJCV9fcmZjb21tX2RsY19jbG9zZShkLCAwKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJLyogQ29udHJvbCBjaGFubmVsICovCisJCXN3aXRjaCAocy0+c3RhdGUpIHsKKwkJY2FzZSBCVF9DT05ORUNUOgorCQkJcy0+c3RhdGUgPSBCVF9DT05ORUNURUQ7CisJCQlyZmNvbW1fcHJvY2Vzc19jb25uZWN0KHMpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3JlY3ZfZG0oc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCB1OCBkbGNpKQoreworCWludCBlcnIgPSAwOworCisJQlRfREJHKCJzZXNzaW9uICVwIHN0YXRlICVsZCBkbGNpICVkIiwgcywgcy0+c3RhdGUsIGRsY2kpOworCisJaWYgKGRsY2kpIHsKKwkJLyogRGF0YSBETEMgKi8KKwkJc3RydWN0IHJmY29tbV9kbGMgKmQgPSByZmNvbW1fZGxjX2dldChzLCBkbGNpKTsKKwkJaWYgKGQpIHsKKwkJCWlmIChkLT5zdGF0ZSA9PSBCVF9DT05ORUNUIHx8IGQtPnN0YXRlID09IEJUX0NPTkZJRykKKwkJCQllcnIgPSBFQ09OTlJFRlVTRUQ7CisJCQllbHNlCisJCQkJZXJyID0gRUNPTk5SRVNFVDsKKworCQkJZC0+c3RhdGUgPSBCVF9DTE9TRUQ7CisJCQlfX3JmY29tbV9kbGNfY2xvc2UoZCwgZXJyKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChzLT5zdGF0ZSA9PSBCVF9DT05ORUNUKQorCQkJZXJyID0gRUNPTk5SRUZVU0VEOworCQllbHNlCisJCQllcnIgPSBFQ09OTlJFU0VUOworCisJCXMtPnN0YXRlID0gQlRfQ0xPU0VEOworCQlyZmNvbW1fc2Vzc2lvbl9jbG9zZShzLCBlcnIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZmNvbW1fcmVjdl9kaXNjKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgdTggZGxjaSkKK3sKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygic2Vzc2lvbiAlcCBzdGF0ZSAlbGQgZGxjaSAlZCIsIHMsIHMtPnN0YXRlLCBkbGNpKTsKKworCWlmIChkbGNpKSB7CisJCXN0cnVjdCByZmNvbW1fZGxjICpkID0gcmZjb21tX2RsY19nZXQocywgZGxjaSk7CisJCWlmIChkKSB7CisJCQlyZmNvbW1fc2VuZF91YShzLCBkbGNpKTsKKworCQkJaWYgKGQtPnN0YXRlID09IEJUX0NPTk5FQ1QgfHwgZC0+c3RhdGUgPT0gQlRfQ09ORklHKQorCQkJCWVyciA9IEVDT05OUkVGVVNFRDsKKwkJCWVsc2UKKwkJCQllcnIgPSBFQ09OTlJFU0VUOworCisJCQlkLT5zdGF0ZSA9IEJUX0NMT1NFRDsKKwkJCV9fcmZjb21tX2RsY19jbG9zZShkLCBlcnIpOworCQl9IGVsc2UgCisJCQlyZmNvbW1fc2VuZF9kbShzLCBkbGNpKTsKKwkJCQorCX0gZWxzZSB7CisJCXJmY29tbV9zZW5kX3VhKHMsIDApOworCisJCWlmIChzLT5zdGF0ZSA9PSBCVF9DT05ORUNUKQorCQkJZXJyID0gRUNPTk5SRUZVU0VEOworCQllbHNlCisJCQllcnIgPSBFQ09OTlJFU0VUOworCisJCXMtPnN0YXRlID0gQlRfQ0xPU0VEOworCQlyZmNvbW1fc2Vzc2lvbl9jbG9zZShzLCBlcnIpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCByZmNvbW1fY2hlY2tfbGlua19tb2RlKHN0cnVjdCByZmNvbW1fZGxjICpkKQoreworCXN0cnVjdCBzb2NrICpzayA9IGQtPnNlc3Npb24tPnNvY2stPnNrOworCisJaWYgKGQtPmxpbmtfbW9kZSAmIChSRkNPTU1fTE1fRU5DUllQVCB8IFJGQ09NTV9MTV9TRUNVUkUpKSB7CisJCWlmICghaGNpX2Nvbm5fZW5jcnlwdChsMmNhcF9waShzayktPmNvbm4tPmhjb24pKQorCQkJcmV0dXJuIDE7CisJfSBlbHNlIGlmIChkLT5saW5rX21vZGUgJiBSRkNPTU1fTE1fQVVUSCkgeworCQlpZiAoIWhjaV9jb25uX2F1dGgobDJjYXBfcGkoc2spLT5jb25uLT5oY29uKSkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZmNvbW1fZGxjX2FjY2VwdChzdHJ1Y3QgcmZjb21tX2RsYyAqZCkKK3sKKwlCVF9EQkcoImRsYyAlcCIsIGQpOworCisJcmZjb21tX3NlbmRfdWEoZC0+c2Vzc2lvbiwgZC0+ZGxjaSk7CisKKwlyZmNvbW1fZGxjX2xvY2soZCk7CisJZC0+c3RhdGUgPSBCVF9DT05ORUNURUQ7CisJZC0+c3RhdGVfY2hhbmdlKGQsIDApOworCXJmY29tbV9kbGNfdW5sb2NrKGQpOworCisJcmZjb21tX3NlbmRfbXNjKGQtPnNlc3Npb24sIDEsIGQtPmRsY2ksIGQtPnYyNF9zaWcpOworfQorCitzdGF0aWMgaW50IHJmY29tbV9yZWN2X3NhYm0oc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCB1OCBkbGNpKQoreworCXN0cnVjdCByZmNvbW1fZGxjICpkOworCXU4IGNoYW5uZWw7CisKKwlCVF9EQkcoInNlc3Npb24gJXAgc3RhdGUgJWxkIGRsY2kgJWQiLCBzLCBzLT5zdGF0ZSwgZGxjaSk7CisKKwlpZiAoIWRsY2kpIHsKKwkJcmZjb21tX3NlbmRfdWEocywgMCk7CisKKwkJaWYgKHMtPnN0YXRlID09IEJUX09QRU4pIHsKKwkJCXMtPnN0YXRlID0gQlRfQ09OTkVDVEVEOworCQkJcmZjb21tX3Byb2Nlc3NfY29ubmVjdChzKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDaGVjayBpZiBETEMgZXhpc3RzICovCisJZCA9IHJmY29tbV9kbGNfZ2V0KHMsIGRsY2kpOworCWlmIChkKSB7CisJCWlmIChkLT5zdGF0ZSA9PSBCVF9PUEVOKSB7CisJCQkvKiBETEMgd2FzIHByZXZpb3VzbHkgb3BlbmVkIGJ5IFBOIHJlcXVlc3QgKi8KKwkJCWlmIChyZmNvbW1fY2hlY2tfbGlua19tb2RlKGQpKSB7CisJCQkJc2V0X2JpdChSRkNPTU1fQVVUSF9QRU5ESU5HLCAmZC0+ZmxhZ3MpOworCQkJCXJmY29tbV9kbGNfc2V0X3RpbWVyKGQsIFJGQ09NTV9BVVRIX1RJTUVPVVQpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlyZmNvbW1fZGxjX2FjY2VwdChkKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBOb3RpZnkgc29ja2V0IGxheWVyIGFib3V0IGluY29taW5nIGNvbm5lY3Rpb24gKi8KKwljaGFubmVsID0gX19zcnZfY2hhbm5lbChkbGNpKTsKKwlpZiAocmZjb21tX2Nvbm5lY3RfaW5kKHMsIGNoYW5uZWwsICZkKSkgeworCQlkLT5kbGNpID0gZGxjaTsKKwkJZC0+YWRkciA9IF9fYWRkcihzLT5pbml0aWF0b3IsIGRsY2kpOworCQlyZmNvbW1fZGxjX2xpbmsocywgZCk7CisKKwkJaWYgKHJmY29tbV9jaGVja19saW5rX21vZGUoZCkpIHsKKwkJCXNldF9iaXQoUkZDT01NX0FVVEhfUEVORElORywgJmQtPmZsYWdzKTsKKwkJCXJmY29tbV9kbGNfc2V0X3RpbWVyKGQsIFJGQ09NTV9BVVRIX1RJTUVPVVQpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlyZmNvbW1fZGxjX2FjY2VwdChkKTsKKwl9IGVsc2UgeworCQlyZmNvbW1fc2VuZF9kbShzLCBkbGNpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZmNvbW1fYXBwbHlfcG4oc3RydWN0IHJmY29tbV9kbGMgKmQsIGludCBjciwgc3RydWN0IHJmY29tbV9wbiAqcG4pCit7CisJc3RydWN0IHJmY29tbV9zZXNzaW9uICpzID0gZC0+c2Vzc2lvbjsKKworCUJUX0RCRygiZGxjICVwIHN0YXRlICVsZCBkbGNpICVkIG10dSAlZCBmYyAweCV4IGNyZWRpdHMgJWQiLCAKKwkJCWQsIGQtPnN0YXRlLCBkLT5kbGNpLCBwbi0+bXR1LCBwbi0+Zmxvd19jdHJsLCBwbi0+Y3JlZGl0cyk7CisKKwlpZiAocG4tPmZsb3dfY3RybCA9PSAweGYwIHx8IHBuLT5mbG93X2N0cmwgPT0gMHhlMCkgeworCQlkLT5jZmMgPSBzLT5jZmMgPSBSRkNPTU1fQ0ZDX0VOQUJMRUQ7CisJCWQtPnR4X2NyZWRpdHMgPSBwbi0+Y3JlZGl0czsKKwl9IGVsc2UgeworCQlkLT5jZmMgPSBzLT5jZmMgPSBSRkNPTU1fQ0ZDX0RJU0FCTEVEOworCQlzZXRfYml0KFJGQ09NTV9UWF9USFJPVFRMRUQsICZkLT5mbGFncyk7CisJfQorCisJZC0+cHJpb3JpdHkgPSBwbi0+cHJpb3JpdHk7CisKKwlkLT5tdHUgPSBzLT5tdHUgPSBidG9ocyhwbi0+bXR1KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJmY29tbV9yZWN2X3BuKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgaW50IGNyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByZmNvbW1fcG4gKnBuID0gKHZvaWQgKikgc2tiLT5kYXRhOworCXN0cnVjdCByZmNvbW1fZGxjICpkOworCXU4IGRsY2kgPSBwbi0+ZGxjaTsKKworCUJUX0RCRygic2Vzc2lvbiAlcCBzdGF0ZSAlbGQgZGxjaSAlZCIsIHMsIHMtPnN0YXRlLCBkbGNpKTsKKworCWlmICghZGxjaSkKKwkJcmV0dXJuIDA7CisKKwlkID0gcmZjb21tX2RsY19nZXQocywgZGxjaSk7CisJaWYgKGQpIHsKKwkJaWYgKGNyKSB7CisJCQkvKiBQTiByZXF1ZXN0ICovCisJCQlyZmNvbW1fYXBwbHlfcG4oZCwgY3IsIHBuKTsKKwkJCXJmY29tbV9zZW5kX3BuKHMsIDAsIGQpOworCQl9IGVsc2UgeworCQkJLyogUE4gcmVzcG9uc2UgKi8KKwkJCXN3aXRjaCAoZC0+c3RhdGUpIHsKKwkJCWNhc2UgQlRfQ09ORklHOgorCQkJCXJmY29tbV9hcHBseV9wbihkLCBjciwgcG4pOworCisJCQkJZC0+c3RhdGUgPSBCVF9DT05ORUNUOworCQkJCXJmY29tbV9zZW5kX3NhYm0ocywgZC0+ZGxjaSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQl1OCBjaGFubmVsID0gX19zcnZfY2hhbm5lbChkbGNpKTsKKworCQlpZiAoIWNyKQorCQkJcmV0dXJuIDA7CisKKwkJLyogUE4gcmVxdWVzdCBmb3Igbm9uIGV4aXN0aW5nIERMQy4KKwkJICogQXNzdW1lIGluY29taW5nIGNvbm5lY3Rpb24uICovCisJCWlmIChyZmNvbW1fY29ubmVjdF9pbmQocywgY2hhbm5lbCwgJmQpKSB7CisJCQlkLT5kbGNpID0gZGxjaTsKKwkJCWQtPmFkZHIgPSBfX2FkZHIocy0+aW5pdGlhdG9yLCBkbGNpKTsKKwkJCXJmY29tbV9kbGNfbGluayhzLCBkKTsKKworCQkJcmZjb21tX2FwcGx5X3BuKGQsIGNyLCBwbik7CisKKwkJCWQtPnN0YXRlID0gQlRfT1BFTjsKKwkJCXJmY29tbV9zZW5kX3BuKHMsIDAsIGQpOworCQl9IGVsc2UgeworCQkJcmZjb21tX3NlbmRfZG0ocywgZGxjaSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3JlY3ZfcnBuKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgaW50IGNyLCBpbnQgbGVuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByZmNvbW1fcnBuICpycG4gPSAodm9pZCAqKSBza2ItPmRhdGE7CisJdTggZGxjaSA9IF9fZ2V0X2RsY2kocnBuLT5kbGNpKTsKKworCXU4IGJpdF9yYXRlICA9IDA7CisJdTggZGF0YV9iaXRzID0gMDsKKwl1OCBzdG9wX2JpdHMgPSAwOworCXU4IHBhcml0eSAgICA9IDA7CisJdTggZmxvd19jdHJsID0gMDsKKwl1OCB4b25fY2hhciAgPSAwOworCXU4IHhvZmZfY2hhciA9IDA7CisJdTE2IHJwbl9tYXNrID0gUkZDT01NX1JQTl9QTV9BTEw7CisJCisJQlRfREJHKCJkbGNpICVkIGNyICVkIGxlbiAweCV4IGJpdHIgMHgleCBsaW5lIDB4JXggZmxvdyAweCV4IHhvbmMgMHgleCB4b2ZmYyAweCV4IHBtIDB4JXgiLCAKKwkgICAgICAgZGxjaSwgY3IsIGxlbiwgcnBuLT5iaXRfcmF0ZSwgcnBuLT5saW5lX3NldHRpbmdzLCBycG4tPmZsb3dfY3RybCwKKwkgICAgICAgcnBuLT54b25fY2hhciwgcnBuLT54b2ZmX2NoYXIsIHJwbi0+cGFyYW1fbWFzayk7CisJCisJaWYgKCFjcikgCisJCXJldHVybiAwOworCQorCWlmIChsZW4gPT0gMSkgeworCQkvKiByZXF1ZXN0OiByZXR1cm4gZGVmYXVsdCBzZXR0aW5nICovCisJCWJpdF9yYXRlICA9IFJGQ09NTV9SUE5fQlJfMTE1MjAwOworCQlkYXRhX2JpdHMgPSBSRkNPTU1fUlBOX0RBVEFfODsKKwkJc3RvcF9iaXRzID0gUkZDT01NX1JQTl9TVE9QXzE7CisJCXBhcml0eSAgICA9IFJGQ09NTV9SUE5fUEFSSVRZX05PTkU7CisJCWZsb3dfY3RybCA9IFJGQ09NTV9SUE5fRkxPV19OT05FOworCQl4b25fY2hhciAgPSBSRkNPTU1fUlBOX1hPTl9DSEFSOworCQl4b2ZmX2NoYXIgPSBSRkNPTU1fUlBOX1hPRkZfQ0hBUjsKKworCQlnb3RvIHJwbl9vdXQ7CisJfQorCS8qIGNoZWNrIGZvciBzYW5lIHZhbHVlczogaWdub3JlL2FjY2VwdCBiaXRfcmF0ZSwgOCBiaXRzLCAxIHN0b3AgYml0LCBubyBwYXJpdHksCisJICAgICAgICAgICAgICAgICAgICAgICAgICBubyBmbG93IGNvbnRyb2wgbGluZXMsIG5vcm1hbCBYT04vWE9GRiBjaGFycyAqLworCWlmIChycG4tPnBhcmFtX21hc2sgJiBSRkNPTU1fUlBOX1BNX0JJVFJBVEUpIHsKKwkJYml0X3JhdGUgPSBycG4tPmJpdF9yYXRlOworCQlpZiAoYml0X3JhdGUgIT0gUkZDT01NX1JQTl9CUl8xMTUyMDApIHsKKwkJCUJUX0RCRygiUlBOIGJpdCByYXRlIG1pc21hdGNoIDB4JXgiLCBiaXRfcmF0ZSk7CisJCQliaXRfcmF0ZSA9IFJGQ09NTV9SUE5fQlJfMTE1MjAwOworCQkJcnBuX21hc2sgXj0gUkZDT01NX1JQTl9QTV9CSVRSQVRFOworCQl9CisJfQorCWlmIChycG4tPnBhcmFtX21hc2sgJiBSRkNPTU1fUlBOX1BNX0RBVEEpIHsKKwkJZGF0YV9iaXRzID0gX19nZXRfcnBuX2RhdGFfYml0cyhycG4tPmxpbmVfc2V0dGluZ3MpOworCQlpZiAoZGF0YV9iaXRzICE9IFJGQ09NTV9SUE5fREFUQV84KSB7CisJCQlCVF9EQkcoIlJQTiBkYXRhIGJpdHMgbWlzbWF0Y2ggMHgleCIsIGRhdGFfYml0cyk7CisJCQlkYXRhX2JpdHMgPSBSRkNPTU1fUlBOX0RBVEFfODsKKwkJCXJwbl9tYXNrIF49IFJGQ09NTV9SUE5fUE1fREFUQTsKKwkJfQorCX0KKwlpZiAocnBuLT5wYXJhbV9tYXNrICYgUkZDT01NX1JQTl9QTV9TVE9QKSB7CisJCXN0b3BfYml0cyA9IF9fZ2V0X3Jwbl9zdG9wX2JpdHMocnBuLT5saW5lX3NldHRpbmdzKTsKKwkJaWYgKHN0b3BfYml0cyAhPSBSRkNPTU1fUlBOX1NUT1BfMSkgeworCQkJQlRfREJHKCJSUE4gc3RvcCBiaXRzIG1pc21hdGNoIDB4JXgiLCBzdG9wX2JpdHMpOworCQkJc3RvcF9iaXRzID0gUkZDT01NX1JQTl9TVE9QXzE7CisJCQlycG5fbWFzayBePSBSRkNPTU1fUlBOX1BNX1NUT1A7CisJCX0KKwl9CisJaWYgKHJwbi0+cGFyYW1fbWFzayAmIFJGQ09NTV9SUE5fUE1fUEFSSVRZKSB7CisJCXBhcml0eSA9IF9fZ2V0X3Jwbl9wYXJpdHkocnBuLT5saW5lX3NldHRpbmdzKTsKKwkJaWYgKHBhcml0eSAhPSBSRkNPTU1fUlBOX1BBUklUWV9OT05FKSB7CisJCQlCVF9EQkcoIlJQTiBwYXJpdHkgbWlzbWF0Y2ggMHgleCIsIHBhcml0eSk7CisJCQlwYXJpdHkgPSBSRkNPTU1fUlBOX1BBUklUWV9OT05FOworCQkJcnBuX21hc2sgXj0gUkZDT01NX1JQTl9QTV9QQVJJVFk7CisJCX0KKwl9CisJaWYgKHJwbi0+cGFyYW1fbWFzayAmIFJGQ09NTV9SUE5fUE1fRkxPVykgeworCQlmbG93X2N0cmwgPSBycG4tPmZsb3dfY3RybDsKKwkJaWYgKGZsb3dfY3RybCAhPSBSRkNPTU1fUlBOX0ZMT1dfTk9ORSkgeworCQkJQlRfREJHKCJSUE4gZmxvdyBjdHJsIG1pc21hdGNoIDB4JXgiLCBmbG93X2N0cmwpOworCQkJZmxvd19jdHJsID0gUkZDT01NX1JQTl9GTE9XX05PTkU7CisJCQlycG5fbWFzayBePSBSRkNPTU1fUlBOX1BNX0ZMT1c7CisJCX0KKwl9CisJaWYgKHJwbi0+cGFyYW1fbWFzayAmIFJGQ09NTV9SUE5fUE1fWE9OKSB7CisJCXhvbl9jaGFyID0gcnBuLT54b25fY2hhcjsKKwkJaWYgKHhvbl9jaGFyICE9IFJGQ09NTV9SUE5fWE9OX0NIQVIpIHsKKwkJCUJUX0RCRygiUlBOIFhPTiBjaGFyIG1pc21hdGNoIDB4JXgiLCB4b25fY2hhcik7CisJCQl4b25fY2hhciA9IFJGQ09NTV9SUE5fWE9OX0NIQVI7CisJCQlycG5fbWFzayBePSBSRkNPTU1fUlBOX1BNX1hPTjsKKwkJfQorCX0KKwlpZiAocnBuLT5wYXJhbV9tYXNrICYgUkZDT01NX1JQTl9QTV9YT0ZGKSB7CisJCXhvZmZfY2hhciA9IHJwbi0+eG9mZl9jaGFyOworCQlpZiAoeG9mZl9jaGFyICE9IFJGQ09NTV9SUE5fWE9GRl9DSEFSKSB7CisJCQlCVF9EQkcoIlJQTiBYT0ZGIGNoYXIgbWlzbWF0Y2ggMHgleCIsIHhvZmZfY2hhcik7CisJCQl4b2ZmX2NoYXIgPSBSRkNPTU1fUlBOX1hPRkZfQ0hBUjsKKwkJCXJwbl9tYXNrIF49IFJGQ09NTV9SUE5fUE1fWE9GRjsKKwkJfQorCX0KKworcnBuX291dDoKKwlyZmNvbW1fc2VuZF9ycG4ocywgMCwgZGxjaSwgCisJCQliaXRfcmF0ZSwgZGF0YV9iaXRzLCBzdG9wX2JpdHMsIHBhcml0eSwgZmxvd19jdHJsLAorCQkJeG9uX2NoYXIsIHhvZmZfY2hhciwgcnBuX21hc2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3JlY3ZfcmxzKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgaW50IGNyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByZmNvbW1fcmxzICpybHMgPSAodm9pZCAqKSBza2ItPmRhdGE7CisJdTggZGxjaSA9IF9fZ2V0X2RsY2kocmxzLT5kbGNpKTsKKworCUJUX0RCRygiZGxjaSAlZCBjciAlZCBzdGF0dXMgMHgleCIsIGRsY2ksIGNyLCBybHMtPnN0YXR1cyk7CisJCisJaWYgKCFjcikKKwkJcmV0dXJuIDA7CisKKwkvKiBGSVhNRTogV2Ugc2hvdWxkIHByb2JhYmx5IGRvIHNvbWV0aGluZyB3aXRoIHRoaXMKKwkgICBpbmZvcm1hdGlvbiBoZXJlLiBCdXQgZm9yIG5vdyBpdCdzIHN1ZmZpY2llbnQganVzdAorCSAgIHRvIHJlcGx5IC0tIEJsdWV0b290aCAxLjEgc2F5cyBpdCdzIG1hbmRhdG9yeSB0byAKKwkgICByZWNvZ25pc2UgYW5kIHJlc3BvbmQgdG8gUkxTICovCisKKwlyZmNvbW1fc2VuZF9ybHMocywgMCwgZGxjaSwgcmxzLT5zdGF0dXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3JlY3ZfbXNjKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgaW50IGNyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByZmNvbW1fbXNjICptc2MgPSAodm9pZCAqKSBza2ItPmRhdGE7CisJc3RydWN0IHJmY29tbV9kbGMgKmQ7CisJdTggZGxjaSA9IF9fZ2V0X2RsY2kobXNjLT5kbGNpKTsKKworCUJUX0RCRygiZGxjaSAlZCBjciAlZCB2MjQgMHgleCIsIGRsY2ksIGNyLCBtc2MtPnYyNF9zaWcpOworCisJZCA9IHJmY29tbV9kbGNfZ2V0KHMsIGRsY2kpOworCWlmICghZCkgCisJCXJldHVybiAwOworCisJaWYgKGNyKSB7CisJCWlmIChtc2MtPnYyNF9zaWcgJiBSRkNPTU1fVjI0X0ZDICYmICFkLT5jZmMpCisJCQlzZXRfYml0KFJGQ09NTV9UWF9USFJPVFRMRUQsICZkLT5mbGFncyk7CisJCWVsc2UKKwkJCWNsZWFyX2JpdChSRkNPTU1fVFhfVEhST1RUTEVELCAmZC0+ZmxhZ3MpOworCQkKKwkJcmZjb21tX2RsY19sb2NrKGQpOworCQlpZiAoZC0+bW9kZW1fc3RhdHVzKQorCQkJZC0+bW9kZW1fc3RhdHVzKGQsIG1zYy0+djI0X3NpZyk7CisJCXJmY29tbV9kbGNfdW5sb2NrKGQpOworCQkKKwkJcmZjb21tX3NlbmRfbXNjKHMsIDAsIGRsY2ksIG1zYy0+djI0X3NpZyk7CisKKwkJZC0+bXNjZXggfD0gUkZDT01NX01TQ0VYX1JYOworCX0gZWxzZSAKKwkJZC0+bXNjZXggfD0gUkZDT01NX01TQ0VYX1RYOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3JlY3ZfbWNjKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcmZjb21tX21jYyAqbWNjID0gKHZvaWQgKikgc2tiLT5kYXRhOworCXU4IHR5cGUsIGNyLCBsZW47CisKKwljciAgID0gX190ZXN0X2NyKG1jYy0+dHlwZSk7CisJdHlwZSA9IF9fZ2V0X21jY190eXBlKG1jYy0+dHlwZSk7CisJbGVuICA9IF9fZ2V0X21jY19sZW4obWNjLT5sZW4pOworCisJQlRfREJHKCIlcCB0eXBlIDB4JXggY3IgJWQiLCBzLCB0eXBlLCBjcik7CisKKwlza2JfcHVsbChza2IsIDIpOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBSRkNPTU1fUE46CisJCXJmY29tbV9yZWN2X3BuKHMsIGNyLCBza2IpOworCQlicmVhazsKKworCWNhc2UgUkZDT01NX1JQTjoKKwkJcmZjb21tX3JlY3ZfcnBuKHMsIGNyLCBsZW4sIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBSRkNPTU1fUkxTOgorCQlyZmNvbW1fcmVjdl9ybHMocywgY3IsIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBSRkNPTU1fTVNDOgorCQlyZmNvbW1fcmVjdl9tc2MocywgY3IsIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBSRkNPTU1fRkNPRkY6CisJCWlmIChjcikgeworCQkJc2V0X2JpdChSRkNPTU1fVFhfVEhST1RUTEVELCAmcy0+ZmxhZ3MpOworCQkJcmZjb21tX3NlbmRfZmNvZmYocywgMCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFJGQ09NTV9GQ09OOgorCQlpZiAoY3IpIHsKKwkJCWNsZWFyX2JpdChSRkNPTU1fVFhfVEhST1RUTEVELCAmcy0+ZmxhZ3MpOworCQkJcmZjb21tX3NlbmRfZmNvbihzLCAwKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUkZDT01NX1RFU1Q6CisJCWlmIChjcikKKwkJCXJmY29tbV9zZW5kX3Rlc3QocywgMCwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCWJyZWFrOworCisJY2FzZSBSRkNPTU1fTlNDOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJUX0VSUigiVW5rbm93biBjb250cm9sIHR5cGUgMHglMDJ4IiwgdHlwZSk7CisJCXJmY29tbV9zZW5kX25zYyhzLCBjciwgdHlwZSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZmNvbW1fcmVjdl9kYXRhKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgdTggZGxjaSwgaW50IHBmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByZmNvbW1fZGxjICpkOworCisJQlRfREJHKCJzZXNzaW9uICVwIHN0YXRlICVsZCBkbGNpICVkIHBmICVkIiwgcywgcy0+c3RhdGUsIGRsY2ksIHBmKTsKKworCWQgPSByZmNvbW1fZGxjX2dldChzLCBkbGNpKTsKKwlpZiAoIWQpIHsKKwkJcmZjb21tX3NlbmRfZG0ocywgZGxjaSk7CisJCWdvdG8gZHJvcDsKKwl9CisKKwlpZiAocGYgJiYgZC0+Y2ZjKSB7CisJCXU4IGNyZWRpdHMgPSAqKHU4ICopIHNrYi0+ZGF0YTsgc2tiX3B1bGwoc2tiLCAxKTsKKworCQlkLT50eF9jcmVkaXRzICs9IGNyZWRpdHM7CisJCWlmIChkLT50eF9jcmVkaXRzKQorCQkJY2xlYXJfYml0KFJGQ09NTV9UWF9USFJPVFRMRUQsICZkLT5mbGFncyk7CisJfQorCisJaWYgKHNrYi0+bGVuICYmIGQtPnN0YXRlID09IEJUX0NPTk5FQ1RFRCkgeworCQlyZmNvbW1fZGxjX2xvY2soZCk7CisJCWQtPnJ4X2NyZWRpdHMtLTsKKwkJZC0+ZGF0YV9yZWFkeShkLCBza2IpOworCQlyZmNvbW1fZGxjX3VubG9jayhkKTsKKwkJcmV0dXJuIDA7CisJfQorCitkcm9wOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJmY29tbV9yZWN2X2ZyYW1lKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcmZjb21tX2hkciAqaGRyID0gKHZvaWQgKikgc2tiLT5kYXRhOworCXU4IHR5cGUsIGRsY2ksIGZjczsKKworCWRsY2kgPSBfX2dldF9kbGNpKGhkci0+YWRkcik7CisJdHlwZSA9IF9fZ2V0X3R5cGUoaGRyLT5jdHJsKTsKKworCS8qIFRyaW0gRkNTICovCisJc2tiLT5sZW4tLTsgc2tiLT50YWlsLS07CisJZmNzID0gKih1OCAqKSBza2ItPnRhaWw7CisKKwlpZiAoX19jaGVja19mY3Moc2tiLT5kYXRhLCB0eXBlLCBmY3MpKSB7CisJCUJUX0VSUigiYmFkIGNoZWNrc3VtIGluIHBhY2tldCIpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC1FSUxTRVE7CisJfQorCisJaWYgKF9fdGVzdF9lYShoZHItPmxlbikpCisJCXNrYl9wdWxsKHNrYiwgMyk7CisJZWxzZQorCQlza2JfcHVsbChza2IsIDQpOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBSRkNPTU1fU0FCTToKKwkJaWYgKF9fdGVzdF9wZihoZHItPmN0cmwpKQorCQkJcmZjb21tX3JlY3Zfc2FibShzLCBkbGNpKTsKKwkJYnJlYWs7CisKKwljYXNlIFJGQ09NTV9ESVNDOgorCQlpZiAoX190ZXN0X3BmKGhkci0+Y3RybCkpCisJCQlyZmNvbW1fcmVjdl9kaXNjKHMsIGRsY2kpOworCQlicmVhazsKKworCWNhc2UgUkZDT01NX1VBOgorCQlpZiAoX190ZXN0X3BmKGhkci0+Y3RybCkpCisJCQlyZmNvbW1fcmVjdl91YShzLCBkbGNpKTsKKwkJYnJlYWs7CisKKwljYXNlIFJGQ09NTV9ETToKKwkJcmZjb21tX3JlY3ZfZG0ocywgZGxjaSk7CisJCWJyZWFrOworCisJY2FzZSBSRkNPTU1fVUlIOgorCQlpZiAoZGxjaSkKKwkJCXJldHVybiByZmNvbW1fcmVjdl9kYXRhKHMsIGRsY2ksIF9fdGVzdF9wZihoZHItPmN0cmwpLCBza2IpOworCisJCXJmY29tbV9yZWN2X21jYyhzLCBza2IpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJUX0VSUigiVW5rbm93biBwYWNrZXQgdHlwZSAweCUwMnhcbiIsIHR5cGUpOworCQlicmVhazsKKwl9CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0gQ29ubmVjdGlvbiBhbmQgZGF0YSBwcm9jZXNzaW5nIC0tLS0gKi8KKworc3RhdGljIHZvaWQgcmZjb21tX3Byb2Nlc3NfY29ubmVjdChzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMpCit7CisJc3RydWN0IHJmY29tbV9kbGMgKmQ7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKm47CisKKwlCVF9EQkcoInNlc3Npb24gJXAgc3RhdGUgJWxkIiwgcywgcy0+c3RhdGUpOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZzLT5kbGNzKSB7CisJCWQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZmNvbW1fZGxjLCBsaXN0KTsKKwkJaWYgKGQtPnN0YXRlID09IEJUX0NPTkZJRykgeworCQkJZC0+bXR1ID0gcy0+bXR1OworCQkJcmZjb21tX3NlbmRfcG4ocywgMSwgZCk7CisJCX0KKwl9Cit9CisKKy8qIFNlbmQgZGF0YSBxdWV1ZWQgZm9yIHRoZSBETEMuCisgKiBSZXR1cm4gbnVtYmVyIG9mIGZyYW1lcyBsZWZ0IGluIHRoZSBxdWV1ZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcmZjb21tX3Byb2Nlc3NfdHgoc3RydWN0IHJmY29tbV9kbGMgKmQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgZXJyOworCisJQlRfREJHKCJkbGMgJXAgc3RhdGUgJWxkIGNmYyAlZCByeF9jcmVkaXRzICVkIHR4X2NyZWRpdHMgJWQiLCAKKwkJCWQsIGQtPnN0YXRlLCBkLT5jZmMsIGQtPnJ4X2NyZWRpdHMsIGQtPnR4X2NyZWRpdHMpOworCisJLyogU2VuZCBwZW5kaW5nIE1TQyAqLworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUkZDT01NX01TQ19QRU5ESU5HLCAmZC0+ZmxhZ3MpKQorCQlyZmNvbW1fc2VuZF9tc2MoZC0+c2Vzc2lvbiwgMSwgZC0+ZGxjaSwgZC0+djI0X3NpZyk7IAorCisJaWYgKGQtPmNmYykgeworCQkvKiBDRkMgZW5hYmxlZC4gCisJCSAqIEdpdmUgdGhlbSBzb21lIGNyZWRpdHMgKi8KKwkJaWYgKCF0ZXN0X2JpdChSRkNPTU1fUlhfVEhST1RUTEVELCAmZC0+ZmxhZ3MpICYmCisJCQkgICAgICAgCWQtPnJ4X2NyZWRpdHMgPD0gKGQtPmNmYyA+PiAyKSkgeworCQkJcmZjb21tX3NlbmRfY3JlZGl0cyhkLT5zZXNzaW9uLCBkLT5hZGRyLCBkLT5jZmMgLSBkLT5yeF9jcmVkaXRzKTsKKwkJCWQtPnJ4X2NyZWRpdHMgPSBkLT5jZmM7CisJCX0KKwl9IGVsc2UgeworCQkvKiBDRkMgZGlzYWJsZWQuCisJCSAqIEdpdmUgb3Vyc2VsdmVzIHNvbWUgY3JlZGl0cyAqLworCQlkLT50eF9jcmVkaXRzID0gNTsKKwl9CisKKwlpZiAodGVzdF9iaXQoUkZDT01NX1RYX1RIUk9UVExFRCwgJmQtPmZsYWdzKSkKKwkJcmV0dXJuIHNrYl9xdWV1ZV9sZW4oJmQtPnR4X3F1ZXVlKTsKKworCXdoaWxlIChkLT50eF9jcmVkaXRzICYmIChza2IgPSBza2JfZGVxdWV1ZSgmZC0+dHhfcXVldWUpKSkgeworCQllcnIgPSByZmNvbW1fc2VuZF9mcmFtZShkLT5zZXNzaW9uLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXNrYl9xdWV1ZV9oZWFkKCZkLT50eF9xdWV1ZSwgc2tiKTsKKwkJCWJyZWFrOworCQl9CisJCWtmcmVlX3NrYihza2IpOworCQlkLT50eF9jcmVkaXRzLS07CisJfQorCisJaWYgKGQtPmNmYyAmJiAhZC0+dHhfY3JlZGl0cykgeworCQkvKiBXZSdyZSBvdXQgb2YgVFggY3JlZGl0cy4KKwkJICogU2V0IFRYX1RIUk9UVExFRCBmbGFnIHRvIGF2b2lkIHVubmVzYXJ5IHdha2V1cHMgYnkgZGxjX3NlbmQuICovCisJCXNldF9iaXQoUkZDT01NX1RYX1RIUk9UVExFRCwgJmQtPmZsYWdzKTsKKwl9CisKKwlyZXR1cm4gc2tiX3F1ZXVlX2xlbigmZC0+dHhfcXVldWUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmZjb21tX3Byb2Nlc3NfZGxjcyhzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMpCit7CisJc3RydWN0IHJmY29tbV9kbGMgKmQ7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKm47CisKKwlCVF9EQkcoInNlc3Npb24gJXAgc3RhdGUgJWxkIiwgcywgcy0+c3RhdGUpOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZzLT5kbGNzKSB7CisJCWQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZmNvbW1fZGxjLCBsaXN0KTsKKworCQlpZiAodGVzdF9iaXQoUkZDT01NX1RJTUVEX09VVCwgJmQtPmZsYWdzKSkgeworCQkJX19yZmNvbW1fZGxjX2Nsb3NlKGQsIEVUSU1FRE9VVCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUkZDT01NX0FVVEhfQUNDRVBULCAmZC0+ZmxhZ3MpKSB7CisJCQlyZmNvbW1fZGxjX2NsZWFyX3RpbWVyKGQpOworCQkJcmZjb21tX2RsY19hY2NlcHQoZCk7CisJCQlpZiAoZC0+bGlua19tb2RlICYgUkZDT01NX0xNX1NFQ1VSRSkgeworCQkJCXN0cnVjdCBzb2NrICpzayA9IHMtPnNvY2stPnNrOworCQkJCWhjaV9jb25uX2NoYW5nZV9saW5rX2tleShsMmNhcF9waShzayktPmNvbm4tPmhjb24pOworCQkJfQorCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJGQ09NTV9BVVRIX1JFSkVDVCwgJmQtPmZsYWdzKSkgeworCQkJcmZjb21tX2RsY19jbGVhcl90aW1lcihkKTsKKwkJCXJmY29tbV9zZW5kX2RtKHMsIGQtPmRsY2kpOworCQkJX19yZmNvbW1fZGxjX2Nsb3NlKGQsIEVDT05OUkVGVVNFRCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICh0ZXN0X2JpdChSRkNPTU1fVFhfVEhST1RUTEVELCAmcy0+ZmxhZ3MpKQorCQkJY29udGludWU7CisKKwkJaWYgKChkLT5zdGF0ZSA9PSBCVF9DT05ORUNURUQgfHwgZC0+c3RhdGUgPT0gQlRfRElTQ09OTikgJiYKKwkJCQlkLT5tc2NleCA9PSBSRkNPTU1fTVNDRVhfT0spCisJCQlyZmNvbW1fcHJvY2Vzc190eChkKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZmNvbW1fcHJvY2Vzc19yeChzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMpCit7CisJc3RydWN0IHNvY2tldCAqc29jayA9IHMtPnNvY2s7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCUJUX0RCRygic2Vzc2lvbiAlcCBzdGF0ZSAlbGQgcWxlbiAlZCIsIHMsIHMtPnN0YXRlLCBza2JfcXVldWVfbGVuKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpOworCisJLyogR2V0IGRhdGEgZGlyZWN0bHkgZnJvbSBzb2NrZXQgcmVjZWl2ZSBxdWV1ZSB3aXRob3V0IGNvcHlpbmcgaXQuICovCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKSkgeworCQlza2Jfb3JwaGFuKHNrYik7CisJCXJmY29tbV9yZWN2X2ZyYW1lKHMsIHNrYik7CisJfQorCisJaWYgKHNrLT5za19zdGF0ZSA9PSBCVF9DTE9TRUQpIHsKKwkJaWYgKCFzLT5pbml0aWF0b3IpCisJCQlyZmNvbW1fc2Vzc2lvbl9wdXQocyk7CisKKwkJcmZjb21tX3Nlc3Npb25fY2xvc2Uocywgc2stPnNrX2Vycik7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmZjb21tX2FjY2VwdF9jb25uZWN0aW9uKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcykKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gcy0+c29jaywgKm5zb2NrOworCWludCBlcnI7CisKKwkvKiBGYXN0IGNoZWNrIGZvciBhIG5ldyBjb25uZWN0aW9uLgorCSAqIEF2b2lkcyB1bm5lc2VzYXJ5IHNvY2tldCBhbGxvY2F0aW9ucy4gKi8KKwlpZiAobGlzdF9lbXB0eSgmYnRfc2soc29jay0+c2spLT5hY2NlcHRfcSkpCisJCXJldHVybjsKKworCUJUX0RCRygic2Vzc2lvbiAlcCIsIHMpOworCisJaWYgKHNvY2tfY3JlYXRlX2xpdGUoUEZfQkxVRVRPT1RILCBzb2NrLT50eXBlLCBCVFBST1RPX0wyQ0FQLCAmbnNvY2spKQorCQlyZXR1cm47CisKKwluc29jay0+b3BzICA9IHNvY2stPm9wczsKKworCV9fbW9kdWxlX2dldChuc29jay0+b3BzLT5vd25lcik7CisKKwllcnIgPSBzb2NrLT5vcHMtPmFjY2VwdChzb2NrLCBuc29jaywgT19OT05CTE9DSyk7CisJaWYgKGVyciA8IDApIHsKKwkJc29ja19yZWxlYXNlKG5zb2NrKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFNldCBvdXIgY2FsbGJhY2tzICovCisJbnNvY2stPnNrLT5za19kYXRhX3JlYWR5ICAgPSByZmNvbW1fbDJkYXRhX3JlYWR5OworCW5zb2NrLT5zay0+c2tfc3RhdGVfY2hhbmdlID0gcmZjb21tX2wyc3RhdGVfY2hhbmdlOworCisJcyA9IHJmY29tbV9zZXNzaW9uX2FkZChuc29jaywgQlRfT1BFTik7CisJaWYgKHMpIHsKKwkJcmZjb21tX3Nlc3Npb25faG9sZChzKTsKKwkJcmZjb21tX3NjaGVkdWxlKFJGQ09NTV9TQ0hFRF9SWCk7CisJfSBlbHNlCisJCXNvY2tfcmVsZWFzZShuc29jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZmNvbW1fY2hlY2tfY29ubmVjdGlvbihzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMpCit7CisJc3RydWN0IHNvY2sgKnNrID0gcy0+c29jay0+c2s7CisKKwlCVF9EQkcoIiVwIHN0YXRlICVsZCIsIHMsIHMtPnN0YXRlKTsKKworCXN3aXRjaChzay0+c2tfc3RhdGUpIHsKKwljYXNlIEJUX0NPTk5FQ1RFRDoKKwkJcy0+c3RhdGUgPSBCVF9DT05ORUNUOworCisJCS8qIFdlIGNhbiBhZGp1c3QgTVRVIG9uIG91dGdvaW5nIHNlc3Npb25zLgorCQkgKiBMMkNBUCBNVFUgbWludXMgVUlIIGhlYWRlciBhbmQgRkNTLiAqLworCQlzLT5tdHUgPSBtaW4obDJjYXBfcGkoc2spLT5vbXR1LCBsMmNhcF9waShzayktPmltdHUpIC0gNTsKKworCQlyZmNvbW1fc2VuZF9zYWJtKHMsIDApOworCQlicmVhazsKKworCWNhc2UgQlRfQ0xPU0VEOgorCQlzLT5zdGF0ZSA9IEJUX0NMT1NFRDsKKwkJcmZjb21tX3Nlc3Npb25fY2xvc2Uocywgc2stPnNrX2Vycik7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJmY29tbV9wcm9jZXNzX3Nlc3Npb25zKHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKm47CisKKwlyZmNvbW1fbG9jaygpOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZzZXNzaW9uX2xpc3QpIHsKKwkJc3RydWN0IHJmY29tbV9zZXNzaW9uICpzOworCQlzID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgcmZjb21tX3Nlc3Npb24sIGxpc3QpOworCisJCWlmIChzLT5zdGF0ZSA9PSBCVF9MSVNURU4pIHsKKwkJCXJmY29tbV9hY2NlcHRfY29ubmVjdGlvbihzKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmZjb21tX3Nlc3Npb25faG9sZChzKTsKKworCQlzd2l0Y2ggKHMtPnN0YXRlKSB7CisJCWNhc2UgQlRfQk9VTkQ6CisJCQlyZmNvbW1fY2hlY2tfY29ubmVjdGlvbihzKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZmNvbW1fcHJvY2Vzc19yeChzKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmZjb21tX3Byb2Nlc3NfZGxjcyhzKTsKKworCQlyZmNvbW1fc2Vzc2lvbl9wdXQocyk7CisJfQorCisJcmZjb21tX3VubG9jaygpOworfQorCitzdGF0aWMgdm9pZCByZmNvbW1fd29ya2VyKHZvaWQpCit7CisJQlRfREJHKCIiKTsKKworCXdoaWxlICghYXRvbWljX3JlYWQoJnRlcm1pbmF0ZSkpIHsKKwkJaWYgKCF0ZXN0X2JpdChSRkNPTU1fU0NIRURfV0FLRVVQLCAmcmZjb21tX2V2ZW50KSkgeworCQkJLyogTm8gcGVuZGluZyBldmVudHMuIExldCdzIHNsZWVwLgorCQkJICogSW5jb21pbmcgY29ubmVjdGlvbnMgYW5kIGRhdGEgd2lsbCB3YWtlIHVzIHVwLiAqLworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlKCk7CisJCX0KKworCQkvKiBQcm9jZXNzIHN0dWZmICovCisJCWNsZWFyX2JpdChSRkNPTU1fU0NIRURfV0FLRVVQLCAmcmZjb21tX2V2ZW50KTsKKwkJcmZjb21tX3Byb2Nlc3Nfc2Vzc2lvbnMoKTsKKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX2FkZF9saXN0ZW5lcihiZGFkZHJfdCAqYmEpCit7CisJc3RydWN0IHNvY2thZGRyX2wyIGFkZHI7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IHJmY29tbV9zZXNzaW9uICpzOworCWludCAgICBlcnIgPSAwOworCisJLyogQ3JlYXRlIHNvY2tldCAqLworCWVyciA9IHJmY29tbV9sMnNvY2tfY3JlYXRlKCZzb2NrKTsKKwlpZiAoZXJyIDwgMCkgeyAKKwkJQlRfRVJSKCJDcmVhdGUgc29ja2V0IGZhaWxlZCAlZCIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogQmluZCBzb2NrZXQgKi8KKwliYWNweSgmYWRkci5sMl9iZGFkZHIsIGJhKTsKKwlhZGRyLmwyX2ZhbWlseSA9IEFGX0JMVUVUT09USDsKKwlhZGRyLmwyX3BzbSAgICA9IGh0b2JzKFJGQ09NTV9QU00pOworCWVyciA9IHNvY2stPm9wcy0+YmluZChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpOworCWlmIChlcnIgPCAwKSB7CisJCUJUX0VSUigiQmluZCBmYWlsZWQgJWQiLCBlcnIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwkvKiBTZXQgTDJDQVAgb3B0aW9ucyAqLworCXNrID0gc29jay0+c2s7CisJbG9ja19zb2NrKHNrKTsKKwlsMmNhcF9waShzayktPmltdHUgPSBSRkNPTU1fTUFYX0wyQ0FQX01UVTsKKwlyZWxlYXNlX3NvY2soc2spOworCisJLyogU3RhcnQgbGlzdGVuaW5nIG9uIHRoZSBzb2NrZXQgKi8KKwllcnIgPSBzb2NrLT5vcHMtPmxpc3Rlbihzb2NrLCAxMCk7CisJaWYgKGVycikgeworCQlCVF9FUlIoIkxpc3RlbiBmYWlsZWQgJWQiLCBlcnIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwkvKiBBZGQgbGlzdGVuaW5nIHNlc3Npb24gKi8KKwlzID0gcmZjb21tX3Nlc3Npb25fYWRkKHNvY2ssIEJUX0xJU1RFTik7CisJaWYgKCFzKQorCQlnb3RvIGZhaWxlZDsKKworCXJmY29tbV9zZXNzaW9uX2hvbGQocyk7CisJcmV0dXJuIDA7CitmYWlsZWQ6CisJc29ja19yZWxlYXNlKHNvY2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHJmY29tbV9raWxsX2xpc3RlbmVyKHZvaWQpCit7CisJc3RydWN0IHJmY29tbV9zZXNzaW9uICpzOworCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOworCisJQlRfREJHKCIiKTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuLCAmc2Vzc2lvbl9saXN0KSB7CisJCXMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZmNvbW1fc2Vzc2lvbiwgbGlzdCk7CisJCXJmY29tbV9zZXNzaW9uX2RlbChzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3J1bih2b2lkICp1bnVzZWQpCit7CisJcmZjb21tX3RocmVhZCA9IGN1cnJlbnQ7CisKKwlhdG9taWNfaW5jKCZydW5uaW5nKTsKKworCWRhZW1vbml6ZSgia3JmY29tbWQiKTsKKwlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0xMCk7CisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CisKKwlCVF9EQkcoIiIpOworCisJcmZjb21tX2FkZF9saXN0ZW5lcihCREFERFJfQU5ZKTsKKworCXJmY29tbV93b3JrZXIoKTsKKworCXJmY29tbV9raWxsX2xpc3RlbmVyKCk7CisKKwlhdG9taWNfZGVjKCZydW5uaW5nKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmZjb21tX2F1dGhfY2ZtKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgdTggc3RhdHVzKQoreworCXN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqczsKKwlzdHJ1Y3QgcmZjb21tX2RsYyAqZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbjsKKworCUJUX0RCRygiY29ubiAlcCBzdGF0dXMgMHglMDJ4IiwgY29ubiwgc3RhdHVzKTsKKworCXMgPSByZmNvbW1fc2Vzc2lvbl9nZXQoJmNvbm4tPmhkZXYtPmJkYWRkciwgJmNvbm4tPmRzdCk7CisJaWYgKCFzKQorCQlyZXR1cm47CisKKwlyZmNvbW1fc2Vzc2lvbl9ob2xkKHMpOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZzLT5kbGNzKSB7CisJCWQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZmNvbW1fZGxjLCBsaXN0KTsKKworCQlpZiAoZC0+bGlua19tb2RlICYgKFJGQ09NTV9MTV9FTkNSWVBUIHwgUkZDT01NX0xNX1NFQ1VSRSkpCisJCQljb250aW51ZTsKKworCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChSRkNPTU1fQVVUSF9QRU5ESU5HLCAmZC0+ZmxhZ3MpKQorCQkJY29udGludWU7CisKKwkJaWYgKCFzdGF0dXMpCisJCQlzZXRfYml0KFJGQ09NTV9BVVRIX0FDQ0VQVCwgJmQtPmZsYWdzKTsKKwkJZWxzZQorCQkJc2V0X2JpdChSRkNPTU1fQVVUSF9SRUpFQ1QsICZkLT5mbGFncyk7CisJfQorCisJcmZjb21tX3Nlc3Npb25fcHV0KHMpOworCisJcmZjb21tX3NjaGVkdWxlKFJGQ09NTV9TQ0hFRF9BVVRIKTsKK30KKworc3RhdGljIHZvaWQgcmZjb21tX2VuY3J5cHRfY2ZtKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgdTggc3RhdHVzLCB1OCBlbmNyeXB0KQoreworCXN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqczsKKwlzdHJ1Y3QgcmZjb21tX2RsYyAqZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbjsKKworCUJUX0RCRygiY29ubiAlcCBzdGF0dXMgMHglMDJ4IGVuY3J5cHQgMHglMDJ4IiwgY29ubiwgc3RhdHVzLCBlbmNyeXB0KTsKKworCXMgPSByZmNvbW1fc2Vzc2lvbl9nZXQoJmNvbm4tPmhkZXYtPmJkYWRkciwgJmNvbm4tPmRzdCk7CisJaWYgKCFzKQorCQlyZXR1cm47CisKKwlyZmNvbW1fc2Vzc2lvbl9ob2xkKHMpOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZzLT5kbGNzKSB7CisJCWQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZmNvbW1fZGxjLCBsaXN0KTsKKworCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChSRkNPTU1fQVVUSF9QRU5ESU5HLCAmZC0+ZmxhZ3MpKQorCQkJY29udGludWU7CisKKwkJaWYgKCFzdGF0dXMgJiYgZW5jcnlwdCkKKwkJCXNldF9iaXQoUkZDT01NX0FVVEhfQUNDRVBULCAmZC0+ZmxhZ3MpOworCQllbHNlCisJCQlzZXRfYml0KFJGQ09NTV9BVVRIX1JFSkVDVCwgJmQtPmZsYWdzKTsKKwl9CisKKwlyZmNvbW1fc2Vzc2lvbl9wdXQocyk7CisKKwlyZmNvbW1fc2NoZWR1bGUoUkZDT01NX1NDSEVEX0FVVEgpOworfQorCitzdGF0aWMgc3RydWN0IGhjaV9jYiByZmNvbW1fY2IgPSB7CisJLm5hbWUJCT0gIlJGQ09NTSIsCisJLmF1dGhfY2ZtCT0gcmZjb21tX2F1dGhfY2ZtLAorCS5lbmNyeXB0X2NmbQk9IHJmY29tbV9lbmNyeXB0X2NmbQorfTsKKworLyogLS0tLSBQcm9jIGZzIHN1cHBvcnQgLS0tLSAqLworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgdm9pZCAqcmZjb21tX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHJmY29tbV9zZXNzaW9uICpzOworCXN0cnVjdCBsaXN0X2hlYWQgKnBwLCAqcDsKKwlsb2ZmX3QgbCA9ICpwb3M7CisKKwlyZmNvbW1fbG9jaygpOworCisJbGlzdF9mb3JfZWFjaChwLCAmc2Vzc2lvbl9saXN0KSB7CisJCXMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZmNvbW1fc2Vzc2lvbiwgbGlzdCk7CisJCWxpc3RfZm9yX2VhY2gocHAsICZzLT5kbGNzKQorCQkJaWYgKCFsLS0pIHsKKwkJCQlzZXEtPnByaXZhdGUgPSBzOworCQkJCXJldHVybiBwcDsKKwkJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICpyZmNvbW1fc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKmUsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcyA9IHNlcS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwcCwgKnAgPSBlOworCSgqcG9zKSsrOworCisJaWYgKHAtPm5leHQgIT0gJnMtPmRsY3MpCisJCXJldHVybiBwLT5uZXh0OworCisJbGlzdF9mb3JfZWFjaChwLCAmc2Vzc2lvbl9saXN0KSB7CisJCXMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZmNvbW1fc2Vzc2lvbiwgbGlzdCk7CisJCV9fbGlzdF9mb3JfZWFjaChwcCwgJnMtPmRsY3MpIHsKKwkJCXNlcS0+cHJpdmF0ZSA9IHM7CisJCQlyZXR1cm4gcHA7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHJmY29tbV9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqZSkKK3sKKwlyZmNvbW1fdW5sb2NrKCk7Cit9CisKK3N0YXRpYyBpbnQgIHJmY29tbV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqZSkKK3sKKwlzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMgPSBzZXEtPnByaXZhdGU7CisJc3RydWN0IHNvY2sgKnNrID0gcy0+c29jay0+c2s7CisJc3RydWN0IHJmY29tbV9kbGMgKmQgPSBsaXN0X2VudHJ5KGUsIHN0cnVjdCByZmNvbW1fZGxjLCBsaXN0KTsKKworCXNlcV9wcmludGYoc2VxLCAiJXMgJXMgJWxkICVkICVkICVkICVkXG4iLAorCQkJYmF0b3N0cigmYnRfc2soc2spLT5zcmMpLCBiYXRvc3RyKCZidF9zayhzayktPmRzdCksCisJCQlkLT5zdGF0ZSwgZC0+ZGxjaSwgZC0+bXR1LCBkLT5yeF9jcmVkaXRzLCBkLT50eF9jcmVkaXRzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyByZmNvbW1fc2VxX29wcyA9IHsKKwkuc3RhcnQgID0gcmZjb21tX3NlcV9zdGFydCwKKwkubmV4dCAgID0gcmZjb21tX3NlcV9uZXh0LAorCS5zdG9wICAgPSByZmNvbW1fc2VxX3N0b3AsCisJLnNob3cgICA9IHJmY29tbV9zZXFfc2hvdyAKK307CisKK3N0YXRpYyBpbnQgcmZjb21tX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmcmZjb21tX3NlcV9vcHMpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZmNvbW1fc2VxX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gcmZjb21tX3NlcV9vcGVuLAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgIF9faW5pdCByZmNvbW1fcHJvY19pbml0KHZvaWQpCit7CisgICAgICAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcDsKKworCXByb2NfYnRfcmZjb21tID0gcHJvY19ta2RpcigicmZjb21tIiwgcHJvY19idCk7CisJaWYgKHByb2NfYnRfcmZjb21tKSB7CisJCXByb2NfYnRfcmZjb21tLT5vd25lciA9IFRISVNfTU9EVUxFOworCisgICAgICAgIAlwID0gY3JlYXRlX3Byb2NfZW50cnkoImRsYyIsIFNfSVJVR08sIHByb2NfYnRfcmZjb21tKTsKKwkJaWYgKHApCisgICAgICAgIAkJcC0+cHJvY19mb3BzID0gJnJmY29tbV9zZXFfZm9wczsKKwl9CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcmZjb21tX3Byb2NfY2xlYW51cCh2b2lkKQoreworICAgICAgICByZW1vdmVfcHJvY19lbnRyeSgiZGxjIiwgcHJvY19idF9yZmNvbW0pOworCisJcmVtb3ZlX3Byb2NfZW50cnkoInJmY29tbSIsIHByb2NfYnQpOworfQorCisjZWxzZSAvKiBDT05GSUdfUFJPQ19GUyAqLworCitzdGF0aWMgaW50ICBfX2luaXQgcmZjb21tX3Byb2NfaW5pdCh2b2lkKQoreworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHJmY29tbV9wcm9jX2NsZWFudXAodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuOworfQorI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKKy8qIC0tLS0gSW5pdGlhbGl6YXRpb24gLS0tLSAqLworc3RhdGljIGludCBfX2luaXQgcmZjb21tX2luaXQodm9pZCkKK3sKKwlsMmNhcF9sb2FkKCk7CisKKwloY2lfcmVnaXN0ZXJfY2IoJnJmY29tbV9jYik7CisKKwlrZXJuZWxfdGhyZWFkKHJmY29tbV9ydW4sIE5VTEwsIENMT05FX0tFUk5FTCk7CisKKwlCVF9JTkZPKCJSRkNPTU0gdmVyICVzIiwgVkVSU0lPTik7CisKKwlyZmNvbW1fcHJvY19pbml0KCk7CisKKwlyZmNvbW1faW5pdF9zb2NrZXRzKCk7CisKKyNpZmRlZiBDT05GSUdfQlRfUkZDT01NX1RUWQorCXJmY29tbV9pbml0X3R0eXMoKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCByZmNvbW1fZXhpdCh2b2lkKQoreworCWhjaV91bnJlZ2lzdGVyX2NiKCZyZmNvbW1fY2IpOworCisJLyogVGVybWluYXRlIHdvcmtpbmcgdGhyZWFkLgorCSAqIGllLiBTZXQgdGVybWluYXRlIGZsYWcgYW5kIHdha2UgaXQgdXAgKi8KKwlhdG9taWNfaW5jKCZ0ZXJtaW5hdGUpOworCXJmY29tbV9zY2hlZHVsZShSRkNPTU1fU0NIRURfU1RBVEUpOworCisJLyogV2FpdCB1bnRpbCB0aHJlYWQgaXMgcnVubmluZyAqLworCXdoaWxlIChhdG9taWNfcmVhZCgmcnVubmluZykpCisJCXNjaGVkdWxlKCk7CisKKyNpZmRlZiBDT05GSUdfQlRfUkZDT01NX1RUWQorCXJmY29tbV9jbGVhbnVwX3R0eXMoKTsKKyNlbmRpZgorCisJcmZjb21tX2NsZWFudXBfc29ja2V0cygpOworCisJcmZjb21tX3Byb2NfY2xlYW51cCgpOworfQorCittb2R1bGVfaW5pdChyZmNvbW1faW5pdCk7Cittb2R1bGVfZXhpdChyZmNvbW1fZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1heGltIEtyYXNueWFuc2t5IDxtYXhrQHF1YWxjb21tLmNvbT4sIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmx1ZXRvb3RoIFJGQ09NTSB2ZXIgIiBWRVJTSU9OKTsKK01PRFVMRV9WRVJTSU9OKFZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJidC1wcm90by0zIik7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jcmMuYyBiL25ldC9ibHVldG9vdGgvcmZjb21tL2NyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMTFiYzQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jcmMuYwpAQCAtMCwwICsxLDcxIEBACisvKiAKKyAgIFJGQ09NTSBpbXBsZW1lbnRhdGlvbiBmb3IgTGludXggQmx1ZXRvb3RoIHN0YWNrIChCbHVlWikuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgTWF4aW0gS3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPgorICAgQ29weXJpZ2h0IChDKSAyMDAyIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBBTkQgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyAKKyAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiAKKyAgIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIAorICAgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworICAgQUxMIExJQUJJTElUWSwgSU5DTFVESU5HIExJQUJJTElUWSBGT1IgSU5GUklOR0VNRU5UIE9GIEFOWSBQQVRFTlRTLCAKKyAgIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLCBSRUxBVElORyBUTyBVU0UgT0YgVEhJUyAKKyAgIFNPRlRXQVJFIElTIERJU0NMQUlNRUQuCisqLworCisvKgorICogUkZDT01NIEZDUyBjYWxjdWxhdGlvbi4KKyAqCisgKiAkSWQ6IGNyYy5jLHYgMS4yIDIwMDIvMDkvMjEgMDk6NTQ6MzIgaG9sdG1hbm4gRXhwICQKKyAqLworCisvKiByZXZlcnNlZCwgOC1iaXQsIHBvbHk9MHgwNyAqLwordW5zaWduZWQgY2hhciByZmNvbW1fY3JjX3RhYmxlWzI1Nl0gPSB7IAorCTB4MDAsIDB4OTEsIDB4ZTMsIDB4NzIsIDB4MDcsIDB4OTYsIDB4ZTQsIDB4NzUsCisJMHgwZSwgMHg5ZiwgMHhlZCwgMHg3YywgMHgwOSwgMHg5OCwgMHhlYSwgMHg3YiwKKwkweDFjLCAweDhkLCAweGZmLCAweDZlLCAweDFiLCAweDhhLCAweGY4LCAweDY5LAorCTB4MTIsIDB4ODMsIDB4ZjEsIDB4NjAsIDB4MTUsIDB4ODQsIDB4ZjYsIDB4NjcsCisKKwkweDM4LCAweGE5LCAweGRiLCAweDRhLCAweDNmLCAweGFlLCAweGRjLCAweDRkLAorCTB4MzYsIDB4YTcsIDB4ZDUsIDB4NDQsIDB4MzEsIDB4YTAsIDB4ZDIsIDB4NDMsCisJMHgyNCwgMHhiNSwgMHhjNywgMHg1NiwgMHgyMywgMHhiMiwgMHhjMCwgMHg1MSwKKwkweDJhLCAweGJiLCAweGM5LCAweDU4LCAweDJkLCAweGJjLCAweGNlLCAweDVmLAorCisJMHg3MCwgMHhlMSwgMHg5MywgMHgwMiwgMHg3NywgMHhlNiwgMHg5NCwgMHgwNSwKKwkweDdlLCAweGVmLCAweDlkLCAweDBjLCAweDc5LCAweGU4LCAweDlhLCAweDBiLAorCTB4NmMsIDB4ZmQsIDB4OGYsIDB4MWUsIDB4NmIsIDB4ZmEsIDB4ODgsIDB4MTksCisJMHg2MiwgMHhmMywgMHg4MSwgMHgxMCwgMHg2NSwgMHhmNCwgMHg4NiwgMHgxNywKKworCTB4NDgsIDB4ZDksIDB4YWIsIDB4M2EsIDB4NGYsIDB4ZGUsIDB4YWMsIDB4M2QsCisJMHg0NiwgMHhkNywgMHhhNSwgMHgzNCwgMHg0MSwgMHhkMCwgMHhhMiwgMHgzMywKKwkweDU0LCAweGM1LCAweGI3LCAweDI2LCAweDUzLCAweGMyLCAweGIwLCAweDIxLAorCTB4NWEsIDB4Y2IsIDB4YjksIDB4MjgsIDB4NWQsIDB4Y2MsIDB4YmUsIDB4MmYsCisKKwkweGUwLCAweDcxLCAweDAzLCAweDkyLCAweGU3LCAweDc2LCAweDA0LCAweDk1LAorCTB4ZWUsIDB4N2YsIDB4MGQsIDB4OWMsIDB4ZTksIDB4NzgsIDB4MGEsIDB4OWIsCisJMHhmYywgMHg2ZCwgMHgxZiwgMHg4ZSwgMHhmYiwgMHg2YSwgMHgxOCwgMHg4OSwKKwkweGYyLCAweDYzLCAweDExLCAweDgwLCAweGY1LCAweDY0LCAweDE2LCAweDg3LAorCisJMHhkOCwgMHg0OSwgMHgzYiwgMHhhYSwgMHhkZiwgMHg0ZSwgMHgzYywgMHhhZCwKKwkweGQ2LCAweDQ3LCAweDM1LCAweGE0LCAweGQxLCAweDQwLCAweDMyLCAweGEzLAorCTB4YzQsIDB4NTUsIDB4MjcsIDB4YjYsIDB4YzMsIDB4NTIsIDB4MjAsIDB4YjEsCisJMHhjYSwgMHg1YiwgMHgyOSwgMHhiOCwgMHhjZCwgMHg1YywgMHgyZSwgMHhiZiwKKworCTB4OTAsIDB4MDEsIDB4NzMsIDB4ZTIsIDB4OTcsIDB4MDYsIDB4NzQsIDB4ZTUsCisJMHg5ZSwgMHgwZiwgMHg3ZCwgMHhlYywgMHg5OSwgMHgwOCwgMHg3YSwgMHhlYiwKKwkweDhjLCAweDFkLCAweDZmLCAweGZlLCAweDhiLCAweDFhLCAweDY4LCAweGY5LAorCTB4ODIsIDB4MTMsIDB4NjEsIDB4ZjAsIDB4ODUsIDB4MTQsIDB4NjYsIDB4ZjcsCisKKwkweGE4LCAweDM5LCAweDRiLCAweGRhLCAweGFmLCAweDNlLCAweDRjLCAweGRkLAorCTB4YTYsIDB4MzcsIDB4NDUsIDB4ZDQsIDB4YTEsIDB4MzAsIDB4NDIsIDB4ZDMsCisJMHhiNCwgMHgyNSwgMHg1NywgMHhjNiwgMHhiMywgMHgyMiwgMHg1MCwgMHhjMSwKKwkweGJhLCAweDJiLCAweDU5LCAweGM4LCAweGJkLCAweDJjLCAweDVlLCAweGNmCit9OwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9yZmNvbW0vc29jay5jIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vc29jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MDAyOGEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9zb2NrLmMKQEAgLTAsMCArMSwxMDEwIEBACisvKiAKKyAgIFJGQ09NTSBpbXBsZW1lbnRhdGlvbiBmb3IgTGludXggQmx1ZXRvb3RoIHN0YWNrIChCbHVlWikuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgTWF4aW0gS3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPgorICAgQ29weXJpZ2h0IChDKSAyMDAyIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBBTkQgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyAKKyAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiAKKyAgIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIAorICAgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworICAgQUxMIExJQUJJTElUWSwgSU5DTFVESU5HIExJQUJJTElUWSBGT1IgSU5GUklOR0VNRU5UIE9GIEFOWSBQQVRFTlRTLCAKKyAgIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLCBSRUxBVElORyBUTyBVU0UgT0YgVEhJUyAKKyAgIFNPRlRXQVJFIElTIERJU0NMQUlNRUQuCisqLworCisvKgorICogUkZDT01NIHNvY2tldHMuCisgKgorICogJElkOiBzb2NrLmMsdiAxLjI0IDIwMDIvMTAvMDMgMDE6MDA6MzQgbWF4ayBFeHAgJAorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9sMmNhcC5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvcmZjb21tLmg+CisKKyNpZm5kZWYgQ09ORklHX0JUX1JGQ09NTV9ERUJVRworI3VuZGVmICBCVF9EQkcKKyNkZWZpbmUgQlRfREJHKEQuLi4pCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgcmZjb21tX3NvY2tfb3BzOworCitzdGF0aWMgc3RydWN0IGJ0X3NvY2tfbGlzdCByZmNvbW1fc2tfbGlzdCA9IHsKKwkubG9jayA9IFJXX0xPQ0tfVU5MT0NLRUQKK307CisKK3N0YXRpYyB2b2lkIHJmY29tbV9zb2NrX2Nsb3NlKHN0cnVjdCBzb2NrICpzayk7CitzdGF0aWMgdm9pZCByZmNvbW1fc29ja19raWxsKHN0cnVjdCBzb2NrICpzayk7CisKKy8qIC0tLS0gRExDIGNhbGxiYWNrcyAtLS0tCisgKgorICogY2FsbGVkIHVuZGVyIHJmY29tbV9kbGNfbG9jaygpCisgKi8KK3N0YXRpYyB2b2lkIHJmY29tbV9za19kYXRhX3JlYWR5KHN0cnVjdCByZmNvbW1fZGxjICpkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBzb2NrICpzayA9IGQtPm93bmVyOworCWlmICghc2spCisJCXJldHVybjsKKworCWF0b21pY19hZGQoc2tiLT5sZW4sICZzay0+c2tfcm1lbV9hbGxvYyk7CisJc2tiX3F1ZXVlX3RhaWwoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpOworCXNrLT5za19kYXRhX3JlYWR5KHNrLCBza2ItPmxlbik7CisKKwlpZiAoYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSA+PSBzay0+c2tfcmN2YnVmKQorCQlyZmNvbW1fZGxjX3Rocm90dGxlKGQpOworfQorCitzdGF0aWMgdm9pZCByZmNvbW1fc2tfc3RhdGVfY2hhbmdlKHN0cnVjdCByZmNvbW1fZGxjICpkLCBpbnQgZXJyKQoreworCXN0cnVjdCBzb2NrICpzayA9IGQtPm93bmVyLCAqcGFyZW50OworCWlmICghc2spCisJCXJldHVybjsKKworCUJUX0RCRygiZGxjICVwIHN0YXRlICVsZCBlcnIgJWQiLCBkLCBkLT5zdGF0ZSwgZXJyKTsKKworCWJoX2xvY2tfc29jayhzayk7CisKKwlpZiAoZXJyKQorCQlzay0+c2tfZXJyID0gZXJyOworCisJc2stPnNrX3N0YXRlID0gZC0+c3RhdGU7CisKKwlwYXJlbnQgPSBidF9zayhzayktPnBhcmVudDsKKwlpZiAocGFyZW50KSB7CisJCWlmIChkLT5zdGF0ZSA9PSBCVF9DTE9TRUQpIHsKKwkJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKwkJCWJ0X2FjY2VwdF91bmxpbmsoc2spOworCQl9CisJCXBhcmVudC0+c2tfZGF0YV9yZWFkeShwYXJlbnQsIDApOworCX0gZWxzZSB7CisJCWlmIChkLT5zdGF0ZSA9PSBCVF9DT05ORUNURUQpCisJCQlyZmNvbW1fc2Vzc2lvbl9nZXRhZGRyKGQtPnNlc3Npb24sICZidF9zayhzayktPnNyYywgTlVMTCk7CisJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCX0KKworCWJoX3VubG9ja19zb2NrKHNrKTsKKworCWlmIChwYXJlbnQgJiYgc29ja19mbGFnKHNrLCBTT0NLX1pBUFBFRCkpIHsKKwkJLyogV2UgaGF2ZSB0byBkcm9wIERMQyBsb2NrIGhlcmUsIG90aGVyd2lzZQorCQkgKiByZmNvbW1fc29ja19kZXN0cnVjdCgpIHdpbGwgZGVhZCBsb2NrLiAqLworCQlyZmNvbW1fZGxjX3VubG9jayhkKTsKKwkJcmZjb21tX3NvY2tfa2lsbChzayk7CisJCXJmY29tbV9kbGNfbG9jayhkKTsKKwl9Cit9CisKKy8qIC0tLS0gU29ja2V0IGZ1bmN0aW9ucyAtLS0tICovCitzdGF0aWMgc3RydWN0IHNvY2sgKl9fcmZjb21tX2dldF9zb2NrX2J5X2FkZHIodTggY2hhbm5lbCwgYmRhZGRyX3QgKnNyYykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBOVUxMOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZyZmNvbW1fc2tfbGlzdC5oZWFkKSB7CisJCWlmIChyZmNvbW1fcGkoc2spLT5jaGFubmVsID09IGNoYW5uZWwgJiYgCisJCQkJIWJhY21wKCZidF9zayhzayktPnNyYywgc3JjKSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBub2RlID8gc2sgOiBOVUxMOworfQorCisvKiBGaW5kIHNvY2tldCB3aXRoIGNoYW5uZWwgYW5kIHNvdXJjZSBiZGFkZHIuCisgKiBSZXR1cm5zIGNsb3Nlc3QgbWF0Y2guCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29jayAqX19yZmNvbW1fZ2V0X3NvY2tfYnlfY2hhbm5lbChpbnQgc3RhdGUsIHU4IGNoYW5uZWwsIGJkYWRkcl90ICpzcmMpCit7CisJc3RydWN0IHNvY2sgKnNrID0gTlVMTCwgKnNrMSA9IE5VTEw7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisKKwlza19mb3JfZWFjaChzaywgbm9kZSwgJnJmY29tbV9za19saXN0LmhlYWQpIHsKKwkJaWYgKHN0YXRlICYmIHNrLT5za19zdGF0ZSAhPSBzdGF0ZSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChyZmNvbW1fcGkoc2spLT5jaGFubmVsID09IGNoYW5uZWwpIHsKKwkJCS8qIEV4YWN0IG1hdGNoLiAqLworCQkJaWYgKCFiYWNtcCgmYnRfc2soc2spLT5zcmMsIHNyYykpCisJCQkJYnJlYWs7CisKKwkJCS8qIENsb3Nlc3QgbWF0Y2ggKi8KKwkJCWlmICghYmFjbXAoJmJ0X3NrKHNrKS0+c3JjLCBCREFERFJfQU5ZKSkKKwkJCQlzazEgPSBzazsKKwkJfQorCX0KKwlyZXR1cm4gbm9kZSA/IHNrIDogc2sxOworfQorCisvKiBGaW5kIHNvY2tldCB3aXRoIGdpdmVuIGFkZHJlc3MgKGNoYW5uZWwsIHNyYykuCisgKiBSZXR1cm5zIGxvY2tlZCBzb2NrZXQgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2sgKnJmY29tbV9nZXRfc29ja19ieV9jaGFubmVsKGludCBzdGF0ZSwgdTggY2hhbm5lbCwgYmRhZGRyX3QgKnNyYykKK3sKKwlzdHJ1Y3Qgc29jayAqczsKKwlyZWFkX2xvY2soJnJmY29tbV9za19saXN0LmxvY2spOworCXMgPSBfX3JmY29tbV9nZXRfc29ja19ieV9jaGFubmVsKHN0YXRlLCBjaGFubmVsLCBzcmMpOworCWlmIChzKSBiaF9sb2NrX3NvY2socyk7CisJcmVhZF91bmxvY2soJnJmY29tbV9za19saXN0LmxvY2spOworCXJldHVybiBzOworfQorCitzdGF0aWMgdm9pZCByZmNvbW1fc29ja19kZXN0cnVjdChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHJmY29tbV9kbGMgKmQgPSByZmNvbW1fcGkoc2spLT5kbGM7CisKKwlCVF9EQkcoInNrICVwIGRsYyAlcCIsIHNrLCBkKTsKKworCXNrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCXNrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX3dyaXRlX3F1ZXVlKTsKKworCXJmY29tbV9kbGNfbG9jayhkKTsKKwlyZmNvbW1fcGkoc2spLT5kbGMgPSBOVUxMOworCisJLyogRGV0YWNoIERMQyBpZiBpdCdzIG93bmVkIGJ5IHRoaXMgc29ja2V0ICovCisJaWYgKGQtPm93bmVyID09IHNrKQorCQlkLT5vd25lciA9IE5VTEw7CisJcmZjb21tX2RsY191bmxvY2soZCk7CisKKwlyZmNvbW1fZGxjX3B1dChkKTsKK30KKworc3RhdGljIHZvaWQgcmZjb21tX3NvY2tfY2xlYW51cF9saXN0ZW4oc3RydWN0IHNvY2sgKnBhcmVudCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlCVF9EQkcoInBhcmVudCAlcCIsIHBhcmVudCk7CisKKwkvKiBDbG9zZSBub3QgeWV0IGFjY2VwdGVkIGRsY3MgKi8KKwl3aGlsZSAoKHNrID0gYnRfYWNjZXB0X2RlcXVldWUocGFyZW50LCBOVUxMKSkpIHsKKwkJcmZjb21tX3NvY2tfY2xvc2Uoc2spOworCQlyZmNvbW1fc29ja19raWxsKHNrKTsKKwl9CisKKwlwYXJlbnQtPnNrX3N0YXRlICA9IEJUX0NMT1NFRDsKKwlzb2NrX3NldF9mbGFnKHBhcmVudCwgU09DS19aQVBQRUQpOworfQorCisvKiBLaWxsIHNvY2tldCAob25seSBpZiB6YXBwZWQgYW5kIG9ycGhhbikKKyAqIE11c3QgYmUgY2FsbGVkIG9uIHVubG9ja2VkIHNvY2tldC4KKyAqLworc3RhdGljIHZvaWQgcmZjb21tX3NvY2tfa2lsbChzdHJ1Y3Qgc29jayAqc2spCit7CisJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKSB8fCBzay0+c2tfc29ja2V0KQorCQlyZXR1cm47CisKKwlCVF9EQkcoInNrICVwIHN0YXRlICVkIHJlZmNudCAlZCIsIHNrLCBzay0+c2tfc3RhdGUsIGF0b21pY19yZWFkKCZzay0+c2tfcmVmY250KSk7CisKKwkvKiBLaWxsIHBvb3Igb3JwaGFuICovCisJYnRfc29ja191bmxpbmsoJnJmY29tbV9za19saXN0LCBzayk7CisJc29ja19zZXRfZmxhZyhzaywgU09DS19ERUFEKTsKKwlzb2NrX3B1dChzayk7Cit9CisKK3N0YXRpYyB2b2lkIF9fcmZjb21tX3NvY2tfY2xvc2Uoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCByZmNvbW1fZGxjICpkID0gcmZjb21tX3BpKHNrKS0+ZGxjOworCisJQlRfREJHKCJzayAlcCBzdGF0ZSAlZCBzb2NrZXQgJXAiLCBzaywgc2stPnNrX3N0YXRlLCBzay0+c2tfc29ja2V0KTsKKworCXN3aXRjaCAoc2stPnNrX3N0YXRlKSB7CisJY2FzZSBCVF9MSVNURU46CisJCXJmY29tbV9zb2NrX2NsZWFudXBfbGlzdGVuKHNrKTsKKwkJYnJlYWs7CisKKwljYXNlIEJUX0NPTk5FQ1Q6CisJY2FzZSBCVF9DT05ORUNUMjoKKwljYXNlIEJUX0NPTkZJRzoKKwljYXNlIEJUX0NPTk5FQ1RFRDoKKwkJcmZjb21tX2RsY19jbG9zZShkLCAwKTsKKworCWRlZmF1bHQ6CisJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBDbG9zZSBzb2NrZXQuCisgKiBNdXN0IGJlIGNhbGxlZCBvbiB1bmxvY2tlZCBzb2NrZXQuCisgKi8KK3N0YXRpYyB2b2lkIHJmY29tbV9zb2NrX2Nsb3NlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlsb2NrX3NvY2soc2spOworCV9fcmZjb21tX3NvY2tfY2xvc2Uoc2spOworCXJlbGVhc2Vfc29jayhzayk7Cit9CisKK3N0YXRpYyB2b2lkIHJmY29tbV9zb2NrX2luaXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29jayAqcGFyZW50KQoreworCXN0cnVjdCByZmNvbW1fcGluZm8gKnBpID0gcmZjb21tX3BpKHNrKTsKKworCUJUX0RCRygic2sgJXAiLCBzayk7CisKKwlpZiAocGFyZW50KSB7CisJCXNrLT5za190eXBlID0gcGFyZW50LT5za190eXBlOworCQlwaS0+bGlua19tb2RlID0gcmZjb21tX3BpKHBhcmVudCktPmxpbmtfbW9kZTsKKwl9IGVsc2UgeworCQlwaS0+bGlua19tb2RlID0gMDsKKwl9CisKKwlwaS0+ZGxjLT5saW5rX21vZGUgPSBwaS0+bGlua19tb2RlOworfQorCitzdGF0aWMgc3RydWN0IHByb3RvIHJmY29tbV9wcm90byA9IHsKKwkubmFtZQkJPSAiUkZDT01NIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9ial9zaXplCT0gc2l6ZW9mKHN0cnVjdCByZmNvbW1fcGluZm8pCit9OworCitzdGF0aWMgc3RydWN0IHNvY2sgKnJmY29tbV9zb2NrX2FsbG9jKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90bywgaW50IHByaW8pCit7CisJc3RydWN0IHJmY29tbV9kbGMgKmQ7CisJc3RydWN0IHNvY2sgKnNrOworCisJc2sgPSBza19hbGxvYyhQRl9CTFVFVE9PVEgsIHByaW8sICZyZmNvbW1fcHJvdG8sIDEpOworCWlmICghc2spCisJCXJldHVybiBOVUxMOworCisJc29ja19pbml0X2RhdGEoc29jaywgc2spOworCUlOSVRfTElTVF9IRUFEKCZidF9zayhzayktPmFjY2VwdF9xKTsKKworCWQgPSByZmNvbW1fZGxjX2FsbG9jKHByaW8pOworCWlmICghZCkgeworCQlza19mcmVlKHNrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZC0+ZGF0YV9yZWFkeSAgID0gcmZjb21tX3NrX2RhdGFfcmVhZHk7CisJZC0+c3RhdGVfY2hhbmdlID0gcmZjb21tX3NrX3N0YXRlX2NoYW5nZTsKKworCXJmY29tbV9waShzayktPmRsYyA9IGQ7CisJZC0+b3duZXIgPSBzazsKKworCXNrLT5za19kZXN0cnVjdCA9IHJmY29tbV9zb2NrX2Rlc3RydWN0OworCXNrLT5za19zbmR0aW1lbyA9IFJGQ09NTV9DT05OX1RJTUVPVVQ7CisKKwlzay0+c2tfc25kYnVmICAgPSBSRkNPTU1fTUFYX0NSRURJVFMgKiBSRkNPTU1fREVGQVVMVF9NVFUgKiAxMDsKKwlzay0+c2tfcmN2YnVmICAgPSBSRkNPTU1fTUFYX0NSRURJVFMgKiBSRkNPTU1fREVGQVVMVF9NVFUgKiAxMDsKKworCXNvY2tfcmVzZXRfZmxhZyhzaywgU09DS19aQVBQRUQpOworCisJc2stPnNrX3Byb3RvY29sID0gcHJvdG87CisJc2stPnNrX3N0YXRlCT0gQlRfT1BFTjsKKworCWJ0X3NvY2tfbGluaygmcmZjb21tX3NrX2xpc3QsIHNrKTsKKworCUJUX0RCRygic2sgJXAiLCBzayk7CisJcmV0dXJuIHNrOworfQorCitzdGF0aWMgaW50IHJmY29tbV9zb2NrX2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgcHJvdG9jb2wpCit7CisJc3RydWN0IHNvY2sgKnNrOworCisJQlRfREJHKCJzb2NrICVwIiwgc29jayk7CisKKwlzb2NrLT5zdGF0ZSA9IFNTX1VOQ09OTkVDVEVEOworCisJaWYgKHNvY2stPnR5cGUgIT0gU09DS19TVFJFQU0gJiYgc29jay0+dHlwZSAhPSBTT0NLX1JBVykKKwkJcmV0dXJuIC1FU09DS1ROT1NVUFBPUlQ7CisKKwlzb2NrLT5vcHMgPSAmcmZjb21tX3NvY2tfb3BzOworCisJaWYgKCEoc2sgPSByZmNvbW1fc29ja19hbGxvYyhzb2NrLCBwcm90b2NvbCwgR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJmY29tbV9zb2NrX2luaXQoc2ssIE5VTEwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJmY29tbV9zb2NrX2JpbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcl9sZW4pCit7CisJc3RydWN0IHNvY2thZGRyX3JjICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHJfcmMgKikgYWRkcjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygic2sgJXAgJXMiLCBzaywgYmF0b3N0cigmc2EtPnJjX2JkYWRkcikpOworCisJaWYgKCFhZGRyIHx8IGFkZHItPnNhX2ZhbWlseSAhPSBBRl9CTFVFVE9PVEgpCisJCXJldHVybiAtRUlOVkFMOworCisJbG9ja19zb2NrKHNrKTsKKworCWlmIChzay0+c2tfc3RhdGUgIT0gQlRfT1BFTikgeworCQllcnIgPSAtRUJBREZEOworCQlnb3RvIGRvbmU7CisJfQorCisJd3JpdGVfbG9ja19iaCgmcmZjb21tX3NrX2xpc3QubG9jayk7CisKKwlpZiAoc2EtPnJjX2NoYW5uZWwgJiYgX19yZmNvbW1fZ2V0X3NvY2tfYnlfYWRkcihzYS0+cmNfY2hhbm5lbCwgJnNhLT5yY19iZGFkZHIpKSB7CisJCWVyciA9IC1FQUREUklOVVNFOworCX0gZWxzZSB7CisJCS8qIFNhdmUgc291cmNlIGFkZHJlc3MgKi8KKwkJYmFjcHkoJmJ0X3NrKHNrKS0+c3JjLCAmc2EtPnJjX2JkYWRkcik7CisJCXJmY29tbV9waShzayktPmNoYW5uZWwgPSBzYS0+cmNfY2hhbm5lbDsKKwkJc2stPnNrX3N0YXRlID0gQlRfQk9VTkQ7CisJfQorCisJd3JpdGVfdW5sb2NrX2JoKCZyZmNvbW1fc2tfbGlzdC5sb2NrKTsKKworZG9uZToKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NvY2tfY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCBhbGVuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2thZGRyX3JjICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHJfcmMgKikgYWRkcjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgcmZjb21tX2RsYyAqZCA9IHJmY29tbV9waShzayktPmRsYzsKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygic2sgJXAiLCBzayk7CisKKwlpZiAoYWRkci0+c2FfZmFtaWx5ICE9IEFGX0JMVUVUT09USCB8fCBhbGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9yYykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHNrLT5za19zdGF0ZSAhPSBCVF9PUEVOICYmIHNrLT5za19zdGF0ZSAhPSBCVF9CT1VORCkKKwkJcmV0dXJuIC1FQkFERkQ7CisKKwlpZiAoc2stPnNrX3R5cGUgIT0gU09DS19TVFJFQU0pCisJCXJldHVybiAtRUlOVkFMOworCisJbG9ja19zb2NrKHNrKTsKKworCXNrLT5za19zdGF0ZSA9IEJUX0NPTk5FQ1Q7CisJYmFjcHkoJmJ0X3NrKHNrKS0+ZHN0LCAmc2EtPnJjX2JkYWRkcik7CisJcmZjb21tX3BpKHNrKS0+Y2hhbm5lbCA9IHNhLT5yY19jaGFubmVsOworCisJZXJyID0gcmZjb21tX2RsY19vcGVuKGQsICZidF9zayhzayktPnNyYywgJnNhLT5yY19iZGFkZHIsIHNhLT5yY19jaGFubmVsKTsKKwlpZiAoIWVycikKKwkJZXJyID0gYnRfc29ja193YWl0X3N0YXRlKHNrLCBCVF9DT05ORUNURUQsCisJCQkJc29ja19zbmR0aW1lbyhzaywgZmxhZ3MgJiBPX05PTkJMT0NLKSk7CisKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NvY2tfbGlzdGVuKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBiYWNrbG9nKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnIgPSAwOworCisJQlRfREJHKCJzayAlcCBiYWNrbG9nICVkIiwgc2ssIGJhY2tsb2cpOworCisJbG9ja19zb2NrKHNrKTsKKworCWlmIChzay0+c2tfc3RhdGUgIT0gQlRfQk9VTkQpIHsKKwkJZXJyID0gLUVCQURGRDsKKwkJZ290byBkb25lOworCX0KKworCWlmICghcmZjb21tX3BpKHNrKS0+Y2hhbm5lbCkgeworCQliZGFkZHJfdCAqc3JjID0gJmJ0X3NrKHNrKS0+c3JjOworCQl1OCBjaGFubmVsOworCisJCWVyciA9IC1FSU5WQUw7CisKKwkJd3JpdGVfbG9ja19iaCgmcmZjb21tX3NrX2xpc3QubG9jayk7CisKKwkJZm9yIChjaGFubmVsID0gMTsgY2hhbm5lbCA8IDMxOyBjaGFubmVsKyspCisJCQlpZiAoIV9fcmZjb21tX2dldF9zb2NrX2J5X2FkZHIoY2hhbm5lbCwgc3JjKSkgeworCQkJCXJmY29tbV9waShzayktPmNoYW5uZWwgPSBjaGFubmVsOworCQkJCWVyciA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJd3JpdGVfdW5sb2NrX2JoKCZyZmNvbW1fc2tfbGlzdC5sb2NrKTsKKworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwlzay0+c2tfbWF4X2Fja19iYWNrbG9nID0gYmFja2xvZzsKKwlzay0+c2tfYWNrX2JhY2tsb2cgPSAwOworCXNrLT5za19zdGF0ZSA9IEJUX0xJU1RFTjsKKworZG9uZToKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NvY2tfYWNjZXB0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrZXQgKm5ld3NvY2ssIGludCBmbGFncykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zaywgKm5zazsKKwlsb25nIHRpbWVvOworCWludCBlcnIgPSAwOworCisJbG9ja19zb2NrKHNrKTsKKworCWlmIChzay0+c2tfc3RhdGUgIT0gQlRfTElTVEVOKSB7CisJCWVyciA9IC1FQkFERkQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl0aW1lbyA9IHNvY2tfcmN2dGltZW8oc2ssIGZsYWdzICYgT19OT05CTE9DSyk7CisKKwlCVF9EQkcoInNrICVwIHRpbWVvICVsZCIsIHNrLCB0aW1lbyk7CisKKwkvKiBXYWl0IGZvciBhbiBpbmNvbWluZyBjb25uZWN0aW9uLiAod2FrZS1vbmUpLiAqLworCWFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwl3aGlsZSAoIShuc2sgPSBidF9hY2NlcHRfZGVxdWV1ZShzaywgbmV3c29jaykpKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmICghdGltZW8pIHsKKwkJCWVyciA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJfQorCisJCXJlbGVhc2Vfc29jayhzayk7CisJCXRpbWVvID0gc2NoZWR1bGVfdGltZW91dCh0aW1lbyk7CisJCWxvY2tfc29jayhzayk7CisKKwkJaWYgKHNrLT5za19zdGF0ZSAhPSBCVF9MSVNURU4pIHsKKwkJCWVyciA9IC1FQkFERkQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJZXJyID0gc29ja19pbnRyX2Vycm5vKHRpbWVvKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisKKwlpZiAoZXJyKQorCQlnb3RvIGRvbmU7CisKKwluZXdzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKworCUJUX0RCRygibmV3IHNvY2tldCAlcCIsIG5zayk7CisKK2RvbmU6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHJmY29tbV9zb2NrX2dldG5hbWUoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgKmxlbiwgaW50IHBlZXIpCit7CisJc3RydWN0IHNvY2thZGRyX3JjICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHJfcmMgKikgYWRkcjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKworCUJUX0RCRygic29jayAlcCwgc2sgJXAiLCBzb2NrLCBzayk7CisKKwlzYS0+cmNfZmFtaWx5ICA9IEFGX0JMVUVUT09USDsKKwlzYS0+cmNfY2hhbm5lbCA9IHJmY29tbV9waShzayktPmNoYW5uZWw7CisJaWYgKHBlZXIpCisJCWJhY3B5KCZzYS0+cmNfYmRhZGRyLCAmYnRfc2soc2spLT5kc3QpOworCWVsc2UKKwkJYmFjcHkoJnNhLT5yY19iZGFkZHIsICZidF9zayhzayktPnNyYyk7CisKKwkqbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9yYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NvY2tfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCByZmNvbW1fZGxjICpkID0gcmZjb21tX3BpKHNrKS0+ZGxjOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGVycjsKKwlpbnQgc2VudCA9IDA7CisKKwlpZiAobXNnLT5tc2dfZmxhZ3MgJiBNU0dfT09CKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoc2stPnNrX3NodXRkb3duICYgU0VORF9TSFVURE9XTikKKwkJcmV0dXJuIC1FUElQRTsKKworCUJUX0RCRygic29jayAlcCwgc2sgJXAiLCBzb2NrLCBzayk7CisKKwlsb2NrX3NvY2soc2spOworCisJd2hpbGUgKGxlbikgeworCQlzaXplX3Qgc2l6ZSA9IG1pbl90KHNpemVfdCwgbGVuLCBkLT5tdHUpOworCQkKKwkJc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywgc2l6ZSArIFJGQ09NTV9TS0JfUkVTRVJWRSwKKwkJCQltc2ctPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVCwgJmVycik7CisJCWlmICghc2tiKQorCQkJYnJlYWs7CisJCXNrYl9yZXNlcnZlKHNrYiwgUkZDT01NX1NLQl9IRUFEX1JFU0VSVkUpOworCisJCWVyciA9IG1lbWNweV9mcm9taW92ZWMoc2tiX3B1dChza2IsIHNpemUpLCBtc2ctPm1zZ19pb3YsIHNpemUpOworCQlpZiAoZXJyKSB7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXNlbnQgPSBlcnI7CisJCQlicmVhazsKKwkJfQorCisJCWVyciA9IHJmY29tbV9kbGNfc2VuZChkLCBza2IpOworCQlpZiAoZXJyIDwgMCkgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlicmVhazsKKwkJfQorCisJCXNlbnQgKz0gc2l6ZTsKKwkJbGVuICAtPSBzaXplOworCX0KKworCXJlbGVhc2Vfc29jayhzayk7CisKKwlyZXR1cm4gc2VudCA/IHNlbnQgOiBlcnI7Cit9CisKK3N0YXRpYyBsb25nIHJmY29tbV9zb2NrX2RhdGFfd2FpdChzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgdGltZW8pCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlhZGRfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwlmb3IgKDs7KSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJaWYgKHNrYl9xdWV1ZV9sZW4oJnNrLT5za19yZWNlaXZlX3F1ZXVlKSB8fCBzay0+c2tfZXJyIHx8IChzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pIHx8CisJCQkJc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgfHwgIXRpbWVvKQorCQkJYnJlYWs7CisKKwkJc2V0X2JpdChTT0NLX0FTWU5DX1dBSVREQVRBLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOworCQlyZWxlYXNlX3NvY2soc2spOworCQl0aW1lbyA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW8pOworCQlsb2NrX3NvY2soc2spOworCQljbGVhcl9iaXQoU09DS19BU1lOQ19XQUlUREFUQSwgJnNrLT5za19zb2NrZXQtPmZsYWdzKTsKKwl9CisKKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJcmV0dXJuIHRpbWVvOworfQorCitzdGF0aWMgaW50IHJmY29tbV9zb2NrX3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJICAgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlpbnQgZXJyID0gMDsKKwlzaXplX3QgdGFyZ2V0LCBjb3BpZWQgPSAwOworCWxvbmcgdGltZW87CisKKwlpZiAoZmxhZ3MgJiBNU0dfT09CKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwltc2ctPm1zZ19uYW1lbGVuID0gMDsKKworCUJUX0RCRygic2sgJXAgc2l6ZSAlZCIsIHNrLCBzaXplKTsKKworCWxvY2tfc29jayhzayk7CisKKwl0YXJnZXQgPSBzb2NrX3Jjdmxvd2F0KHNrLCBmbGFncyAmIE1TR19XQUlUQUxMLCBzaXplKTsKKwl0aW1lbyAgPSBzb2NrX3JjdnRpbWVvKHNrLCBmbGFncyAmIE1TR19ET05UV0FJVCk7CisKKwlkbyB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWludCBjaHVuazsKKworCQlza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCQlpZiAoIXNrYikgeworCQkJaWYgKGNvcGllZCA+PSB0YXJnZXQpCisJCQkJYnJlYWs7CisKKwkJCWlmICgoZXJyID0gc29ja19lcnJvcihzaykpICE9IDApCisJCQkJYnJlYWs7CisJCQlpZiAoc2stPnNrX3NodXRkb3duICYgUkNWX1NIVVRET1dOKQorCQkJCWJyZWFrOworCisJCQllcnIgPSAtRUFHQUlOOworCQkJaWYgKCF0aW1lbykKKwkJCQlicmVhazsKKworCQkJdGltZW8gPSByZmNvbW1fc29ja19kYXRhX3dhaXQoc2ssIHRpbWVvKTsKKworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJZXJyID0gc29ja19pbnRyX2Vycm5vKHRpbWVvKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJY2h1bmsgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHNrYi0+bGVuLCBzaXplKTsKKwkJaWYgKG1lbWNweV90b2lvdmVjKG1zZy0+bXNnX2lvdiwgc2tiLT5kYXRhLCBjaHVuaykpIHsKKwkJCXNrYl9xdWV1ZV9oZWFkKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKKwkJCWlmICghY29waWVkKQorCQkJCWNvcGllZCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQljb3BpZWQgKz0gY2h1bms7CisJCXNpemUgICAtPSBjaHVuazsKKworCQlpZiAoIShmbGFncyAmIE1TR19QRUVLKSkgeworCQkJYXRvbWljX3N1YihjaHVuaywgJnNrLT5za19ybWVtX2FsbG9jKTsKKworCQkJc2tiX3B1bGwoc2tiLCBjaHVuayk7CisJCQlpZiAoc2tiLT5sZW4pIHsKKwkJCQlza2JfcXVldWVfaGVhZCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlrZnJlZV9za2Ioc2tiKTsKKworCQl9IGVsc2UgeworCQkJLyogcHV0IG1lc3NhZ2UgYmFjayBhbmQgcmV0dXJuICovCisJCQlza2JfcXVldWVfaGVhZCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKHNpemUpOworCitvdXQ6CisJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPD0gKHNrLT5za19yY3ZidWYgPj4gMikpCisJCXJmY29tbV9kbGNfdW50aHJvdHRsZShyZmNvbW1fcGkoc2spLT5kbGMpOworCisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gY29waWVkID8gOiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NvY2tfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnIgPSAwOworCXUzMiBvcHQ7CisKKwlCVF9EQkcoInNrICVwIiwgc2spOworCisJbG9ja19zb2NrKHNrKTsKKworCXN3aXRjaCAob3B0bmFtZSkgeworCWNhc2UgUkZDT01NX0xNOgorCQlpZiAoZ2V0X3VzZXIob3B0LCAodTMyIF9fdXNlciAqKSBvcHR2YWwpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlyZmNvbW1fcGkoc2spLT5saW5rX21vZGUgPSBvcHQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT1BST1RPT1BUOworCQlicmVhazsKKwl9CisKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NvY2tfZ2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHNvY2sgKmwyY2FwX3NrOworCXN0cnVjdCByZmNvbW1fY29ubmluZm8gY2luZm87CisJaW50IGxlbiwgZXJyID0gMDsKKworCUJUX0RCRygic2sgJXAiLCBzayk7CisKKwlpZiAoZ2V0X3VzZXIobGVuLCBvcHRsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWxvY2tfc29jayhzayk7CisKKwlzd2l0Y2ggKG9wdG5hbWUpIHsKKwljYXNlIFJGQ09NTV9MTToKKwkJaWYgKHB1dF91c2VyKHJmY29tbV9waShzayktPmxpbmtfbW9kZSwgKHUzMiBfX3VzZXIgKikgb3B0dmFsKSkKKwkJCWVyciA9IC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBSRkNPTU1fQ09OTklORk86CisJCWlmIChzay0+c2tfc3RhdGUgIT0gQlRfQ09OTkVDVEVEKSB7CisJCQllcnIgPSAtRU5PVENPTk47CisJCQlicmVhazsKKwkJfQorCisJCWwyY2FwX3NrID0gcmZjb21tX3BpKHNrKS0+ZGxjLT5zZXNzaW9uLT5zb2NrLT5zazsKKworCQljaW5mby5oY2lfaGFuZGxlID0gbDJjYXBfcGkobDJjYXBfc2spLT5jb25uLT5oY29uLT5oYW5kbGU7CisJCW1lbWNweShjaW5mby5kZXZfY2xhc3MsIGwyY2FwX3BpKGwyY2FwX3NrKS0+Y29ubi0+aGNvbi0+ZGV2X2NsYXNzLCAzKTsKKworCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgc2l6ZW9mKGNpbmZvKSk7CisJCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAoY2hhciAqKSAmY2luZm8sIGxlbikpCisJCQllcnIgPSAtRUZBVUxUOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT1BST1RPT1BUOworCQlicmVhazsKKwl9CisKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NvY2tfaW9jdGwoc3RydWN0IHNvY2tldCAqc29jaywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJaW50IGVycjsKKworCWxvY2tfc29jayhzayk7CisKKyNpZmRlZiBDT05GSUdfQlRfUkZDT01NX1RUWQorCWVyciA9IHJmY29tbV9kZXZfaW9jdGwoc2ssIGNtZCwgKHZvaWQgX191c2VyICopYXJnKTsKKyNlbHNlCisJZXJyID0gLUVPUE5PVFNVUFA7CisjZW5kaWYKKworCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCByZmNvbW1fc29ja19zaHV0ZG93bihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgaG93KQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnIgPSAwOworCisJQlRfREJHKCJzb2NrICVwLCBzayAlcCIsIHNvY2ssIHNrKTsKKworCWlmICghc2spIHJldHVybiAwOworCisJbG9ja19zb2NrKHNrKTsKKwlpZiAoIXNrLT5za19zaHV0ZG93bikgeworCQlzay0+c2tfc2h1dGRvd24gPSBTSFVURE9XTl9NQVNLOworCQlfX3JmY29tbV9zb2NrX2Nsb3NlKHNrKTsKKworCQlpZiAoc29ja19mbGFnKHNrLCBTT0NLX0xJTkdFUikgJiYgc2stPnNrX2xpbmdlcnRpbWUpCisJCQllcnIgPSBidF9zb2NrX3dhaXRfc3RhdGUoc2ssIEJUX0NMT1NFRCwgc2stPnNrX2xpbmdlcnRpbWUpOworCX0KKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NvY2tfcmVsZWFzZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnI7CisKKwlCVF9EQkcoInNvY2sgJXAsIHNrICVwIiwgc29jaywgc2spOworCisJaWYgKCFzaykKKwkJcmV0dXJuIDA7CisKKwllcnIgPSByZmNvbW1fc29ja19zaHV0ZG93bihzb2NrLCAyKTsKKworCXNvY2tfb3JwaGFuKHNrKTsKKwlyZmNvbW1fc29ja19raWxsKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiAtLS0tIFJGQ09NTSBjb3JlIGxheWVyIGNhbGxiYWNrcyAtLS0tIAorICoKKyAqIGNhbGxlZCB1bmRlciByZmNvbW1fbG9jaygpCisgKi8KK2ludCByZmNvbW1fY29ubmVjdF9pbmQoc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCB1OCBjaGFubmVsLCBzdHJ1Y3QgcmZjb21tX2RsYyAqKmQpCit7CisJc3RydWN0IHNvY2sgKnNrLCAqcGFyZW50OworCWJkYWRkcl90IHNyYywgZHN0OworCWludCByZXN1bHQgPSAwOworCisJQlRfREJHKCJzZXNzaW9uICVwIGNoYW5uZWwgJWQiLCBzLCBjaGFubmVsKTsKKworCXJmY29tbV9zZXNzaW9uX2dldGFkZHIocywgJnNyYywgJmRzdCk7CisKKwkvKiBDaGVjayBpZiB3ZSBoYXZlIHNvY2tldCBsaXN0ZW5pbmcgb24gY2hhbm5lbCAqLworCXBhcmVudCA9IHJmY29tbV9nZXRfc29ja19ieV9jaGFubmVsKEJUX0xJU1RFTiwgY2hhbm5lbCwgJnNyYyk7CisJaWYgKCFwYXJlbnQpCisJCXJldHVybiAwOworCisJLyogQ2hlY2sgZm9yIGJhY2tsb2cgc2l6ZSAqLworCWlmIChza19hY2NlcHRxX2lzX2Z1bGwocGFyZW50KSkgeworCQlCVF9EQkcoImJhY2tsb2cgZnVsbCAlZCIsIHBhcmVudC0+c2tfYWNrX2JhY2tsb2cpOyAKKwkJZ290byBkb25lOworCX0KKworCXNrID0gcmZjb21tX3NvY2tfYWxsb2MoTlVMTCwgQlRQUk9UT19SRkNPTU0sIEdGUF9BVE9NSUMpOworCWlmICghc2spCisJCWdvdG8gZG9uZTsKKworCXJmY29tbV9zb2NrX2luaXQoc2ssIHBhcmVudCk7CisJYmFjcHkoJmJ0X3NrKHNrKS0+c3JjLCAmc3JjKTsKKwliYWNweSgmYnRfc2soc2spLT5kc3QsICZkc3QpOworCXJmY29tbV9waShzayktPmNoYW5uZWwgPSBjaGFubmVsOworCisJc2stPnNrX3N0YXRlID0gQlRfQ09ORklHOworCWJ0X2FjY2VwdF9lbnF1ZXVlKHBhcmVudCwgc2spOworCisJLyogQWNjZXB0IGNvbm5lY3Rpb24gYW5kIHJldHVybiBzb2NrZXQgRExDICovCisJKmQgPSByZmNvbW1fcGkoc2spLT5kbGM7CisJcmVzdWx0ID0gMTsKKworZG9uZToKKwliaF91bmxvY2tfc29jayhwYXJlbnQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIC0tLS0gUHJvYyBmcyBzdXBwb3J0IC0tLS0gKi8KKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIHZvaWQgKnJmY29tbV9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlsb2ZmX3QgbCA9ICpwb3M7CisKKwlyZWFkX2xvY2tfYmgoJnJmY29tbV9za19saXN0LmxvY2spOworCisJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZyZmNvbW1fc2tfbGlzdC5oZWFkKQorCQlpZiAoIWwtLSkKKwkJCXJldHVybiBzazsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKnJmY29tbV9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqZSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHNvY2sgKnNrID0gZTsKKwkoKnBvcykrKzsKKwlyZXR1cm4gc2tfbmV4dChzayk7Cit9CisKK3N0YXRpYyB2b2lkIHJmY29tbV9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqZSkKK3sKKwlyZWFkX3VubG9ja19iaCgmcmZjb21tX3NrX2xpc3QubG9jayk7Cit9CisKK3N0YXRpYyBpbnQgIHJmY29tbV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqZSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBlOworCXNlcV9wcmludGYoc2VxLCAiJXMgJXMgJWQgJWRcbiIsCisJCQliYXRvc3RyKCZidF9zayhzayktPnNyYyksIGJhdG9zdHIoJmJ0X3NrKHNrKS0+ZHN0KSwKKwkJCXNrLT5za19zdGF0ZSwgcmZjb21tX3BpKHNrKS0+Y2hhbm5lbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcmZjb21tX3NlcV9vcHMgPSB7CisJLnN0YXJ0ICA9IHJmY29tbV9zZXFfc3RhcnQsCisJLm5leHQgICA9IHJmY29tbV9zZXFfbmV4dCwKKwkuc3RvcCAgID0gcmZjb21tX3NlcV9zdG9wLAorCS5zaG93ICAgPSByZmNvbW1fc2VxX3Nob3cgCit9OworCitzdGF0aWMgaW50IHJmY29tbV9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJnJmY29tbV9zZXFfb3BzKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmZjb21tX3NlcV9mb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICA9IHJmY29tbV9zZXFfb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50ICBfX2luaXQgcmZjb21tX3NvY2tfcHJvY19pbml0KHZvaWQpCit7CisgICAgICAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJzb2NrIiwgU19JUlVHTywgcHJvY19idF9yZmNvbW0pOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgIHAtPnByb2NfZm9wcyA9ICZyZmNvbW1fc2VxX2ZvcHM7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcmZjb21tX3NvY2tfcHJvY19jbGVhbnVwKHZvaWQpCit7CisgICAgICAgIHJlbW92ZV9wcm9jX2VudHJ5KCJzb2NrIiwgcHJvY19idF9yZmNvbW0pOworfQorCisjZWxzZSAvKiBDT05GSUdfUFJPQ19GUyAqLworCitzdGF0aWMgaW50ICBfX2luaXQgcmZjb21tX3NvY2tfcHJvY19pbml0KHZvaWQpCit7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcmZjb21tX3NvY2tfcHJvY19jbGVhbnVwKHZvaWQpCit7CisgICAgICAgIHJldHVybjsKK30KKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyByZmNvbW1fc29ja19vcHMgPSB7CisJLmZhbWlseQkJPSBQRl9CTFVFVE9PVEgsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWxlYXNlCT0gcmZjb21tX3NvY2tfcmVsZWFzZSwKKwkuYmluZAkJPSByZmNvbW1fc29ja19iaW5kLAorCS5jb25uZWN0CT0gcmZjb21tX3NvY2tfY29ubmVjdCwKKwkubGlzdGVuCQk9IHJmY29tbV9zb2NrX2xpc3RlbiwKKwkuYWNjZXB0CQk9IHJmY29tbV9zb2NrX2FjY2VwdCwKKwkuZ2V0bmFtZQk9IHJmY29tbV9zb2NrX2dldG5hbWUsCisJLnNlbmRtc2cJPSByZmNvbW1fc29ja19zZW5kbXNnLAorCS5yZWN2bXNnCT0gcmZjb21tX3NvY2tfcmVjdm1zZywKKwkuc2h1dGRvd24JPSByZmNvbW1fc29ja19zaHV0ZG93biwKKwkuc2V0c29ja29wdAk9IHJmY29tbV9zb2NrX3NldHNvY2tvcHQsCisJLmdldHNvY2tvcHQJPSByZmNvbW1fc29ja19nZXRzb2Nrb3B0LAorCS5pb2N0bAkJPSByZmNvbW1fc29ja19pb2N0bCwKKwkucG9sbAkJPSBidF9zb2NrX3BvbGwsCisJLnNvY2tldHBhaXIJPSBzb2NrX25vX3NvY2tldHBhaXIsCisJLm1tYXAJCT0gc29ja19ub19tbWFwCit9OworCitzdGF0aWMgc3RydWN0IG5ldF9wcm90b19mYW1pbHkgcmZjb21tX3NvY2tfZmFtaWx5X29wcyA9IHsKKwkuZmFtaWx5CQk9IFBGX0JMVUVUT09USCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmNyZWF0ZQkJPSByZmNvbW1fc29ja19jcmVhdGUKK307CisKK2ludCAgX19pbml0IHJmY29tbV9pbml0X3NvY2tldHModm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcHJvdG9fcmVnaXN0ZXIoJnJmY29tbV9wcm90bywgMCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBidF9zb2NrX3JlZ2lzdGVyKEJUUFJPVE9fUkZDT01NLCAmcmZjb21tX3NvY2tfZmFtaWx5X29wcyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlyZmNvbW1fc29ja19wcm9jX2luaXQoKTsKKworCUJUX0lORk8oIlJGQ09NTSBzb2NrZXQgbGF5ZXIgaW5pdGlhbGl6ZWQiKTsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlCVF9FUlIoIlJGQ09NTSBzb2NrZXQgbGF5ZXIgcmVnaXN0cmF0aW9uIGZhaWxlZCIpOworCXByb3RvX3VucmVnaXN0ZXIoJnJmY29tbV9wcm90byk7CisJcmV0dXJuIGVycjsKK30KKwordm9pZCBfX2V4aXQgcmZjb21tX2NsZWFudXBfc29ja2V0cyh2b2lkKQoreworCXJmY29tbV9zb2NrX3Byb2NfY2xlYW51cCgpOworCisJaWYgKGJ0X3NvY2tfdW5yZWdpc3RlcihCVFBST1RPX1JGQ09NTSkgPCAwKQorCQlCVF9FUlIoIlJGQ09NTSBzb2NrZXQgbGF5ZXIgdW5yZWdpc3RyYXRpb24gZmFpbGVkIik7CisKKwlwcm90b191bnJlZ2lzdGVyKCZyZmNvbW1fcHJvdG8pOworfQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9yZmNvbW0vdHR5LmMgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS90dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDY4OTIwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vdHR5LmMKQEAgLTAsMCArMSw5MzAgQEAKKy8qIAorICAgUkZDT01NIGltcGxlbWVudGF0aW9uIGZvciBMaW51eCBCbHVldG9vdGggc3RhY2sgKEJsdWVaKS4KKyAgIENvcHlyaWdodCAoQykgMjAwMiBNYXhpbSBLcmFzbnlhbnNreSA8bWF4a0BxdWFsY29tbS5jb20+CisgICBDb3B5cmlnaHQgKEMpIDIwMDIgTWFyY2VsIEhvbHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIFRISVJEIFBBUlRZIFJJR0hUUy4KKyAgIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIEFORCBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkKKyAgIENMQUlNLCBPUiBBTlkgU1BFQ0lBTCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIE9SIEFOWSBEQU1BR0VTIAorICAgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIAorICAgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgCisgICBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisgICBBTEwgTElBQklMSVRZLCBJTkNMVURJTkcgTElBQklMSVRZIEZPUiBJTkZSSU5HRU1FTlQgT0YgQU5ZIFBBVEVOVFMsIAorICAgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMsIFJFTEFUSU5HIFRPIFVTRSBPRiBUSElTIAorICAgU09GVFdBUkUgSVMgRElTQ0xBSU1FRC4KKyovCisKKy8qCisgKiBSRkNPTU0gVFRZLgorICoKKyAqICRJZDogdHR5LmMsdiAxLjI0IDIwMDIvMTAvMDMgMDE6NTQ6MzggaG9sdG1hbm4gRXhwICQKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9yZmNvbW0uaD4KKworI2lmbmRlZiBDT05GSUdfQlRfUkZDT01NX0RFQlVHCisjdW5kZWYgIEJUX0RCRworI2RlZmluZSBCVF9EQkcoRC4uLikKKyNlbmRpZgorCisjZGVmaW5lIFJGQ09NTV9UVFlfTUFHSUMgMHg2ZDAyCQkvKiBtYWdpYyBudW1iZXIgZm9yIHJmY29tbSBzdHJ1Y3QgKi8KKyNkZWZpbmUgUkZDT01NX1RUWV9QT1JUUyBSRkNPTU1fTUFYX0RFVgkvKiB3aG9sZSBsb3R0YSByZmNvbW0gZGV2aWNlcyAqLworI2RlZmluZSBSRkNPTU1fVFRZX01BSk9SIDIxNgkJLyogZGV2aWNlIG5vZGUgbWFqb3IgaWQgb2YgdGhlIHVzYi9ibHVldG9vdGguYyBkcml2ZXIgKi8KKyNkZWZpbmUgUkZDT01NX1RUWV9NSU5PUiAwCisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqcmZjb21tX3R0eV9kcml2ZXI7CisKK3N0cnVjdCByZmNvbW1fZGV2IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJYXRvbWljX3QJCXJlZmNudDsKKworCWNoYXIJCQluYW1lWzEyXTsKKwlpbnQJCQlpZDsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwlpbnQJCQlvcGVuZWQ7CisJaW50CQkJZXJyOworCisJYmRhZGRyX3QJCXNyYzsKKwliZGFkZHJfdAkJZHN0OworCXU4IAkJCWNoYW5uZWw7CisKKwl1aW50IAkJCW1vZGVtX3N0YXR1czsKKworCXN0cnVjdCByZmNvbW1fZGxjCSpkbGM7CisJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAgICAgICB3YWl0OworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAgIHdha2V1cF90YXNrOworCisJYXRvbWljX3QgCQl3bWVtX2FsbG9jOworfTsKKworc3RhdGljIExJU1RfSEVBRChyZmNvbW1fZGV2X2xpc3QpOworc3RhdGljIERFRklORV9SV0xPQ0socmZjb21tX2Rldl9sb2NrKTsKKworc3RhdGljIHZvaWQgcmZjb21tX2Rldl9kYXRhX3JlYWR5KHN0cnVjdCByZmNvbW1fZGxjICpkbGMsIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgcmZjb21tX2Rldl9zdGF0ZV9jaGFuZ2Uoc3RydWN0IHJmY29tbV9kbGMgKmRsYywgaW50IGVycik7CitzdGF0aWMgdm9pZCByZmNvbW1fZGV2X21vZGVtX3N0YXR1cyhzdHJ1Y3QgcmZjb21tX2RsYyAqZGxjLCB1OCB2MjRfc2lnKTsKKworc3RhdGljIHZvaWQgcmZjb21tX3R0eV93YWtldXAodW5zaWduZWQgbG9uZyBhcmcpOworCisvKiAtLS0tIERldmljZSBmdW5jdGlvbnMgLS0tLSAqLworc3RhdGljIHZvaWQgcmZjb21tX2Rldl9kZXN0cnVjdChzdHJ1Y3QgcmZjb21tX2RldiAqZGV2KQoreworCXN0cnVjdCByZmNvbW1fZGxjICpkbGMgPSBkZXYtPmRsYzsKKworCUJUX0RCRygiZGV2ICVwIGRsYyAlcCIsIGRldiwgZGxjKTsKKworCXJmY29tbV9kbGNfbG9jayhkbGMpOworCS8qIERldGFjaCBETEMgaWYgaXQncyBvd25lZCBieSB0aGlzIGRldiAqLworCWlmIChkbGMtPm93bmVyID09IGRldikKKwkJZGxjLT5vd25lciA9IE5VTEw7CisJcmZjb21tX2RsY191bmxvY2soZGxjKTsKKworCXJmY29tbV9kbGNfcHV0KGRsYyk7CisKKwl0dHlfdW5yZWdpc3Rlcl9kZXZpY2UocmZjb21tX3R0eV9kcml2ZXIsIGRldi0+aWQpOworCisJLyogUmVmY291bnQgc2hvdWxkIG9ubHkgaGl0IHplcm8gd2hlbiBjYWxsZWQgZnJvbSByZmNvbW1fZGV2X2RlbCgpCisJICAgd2hpY2ggd2lsbCBoYXZlIHRha2VuIHVzIG9mZiB0aGUgbGlzdC4gRXZlcnl0aGluZyBlbHNlIGFyZQorCSAgIHJlZmNvdW50aW5nIGJ1Z3MuICovCisJQlVHX09OKCFsaXN0X2VtcHR5KCZkZXYtPmxpc3QpKTsKKworCWtmcmVlKGRldik7CisKKwkvKiBJdCdzIHNhZmUgdG8gY2FsbCBtb2R1bGVfcHV0KCkgaGVyZSBiZWNhdXNlIHNvY2tldCBzdGlsbCAKKwkgICBob2xkcyByZWZlcmVuY2UgdG8gdGhpcyBtb2R1bGUuICovCisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZmNvbW1fZGV2X2hvbGQoc3RydWN0IHJmY29tbV9kZXYgKmRldikKK3sKKwlhdG9taWNfaW5jKCZkZXYtPnJlZmNudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZmNvbW1fZGV2X3B1dChzdHJ1Y3QgcmZjb21tX2RldiAqZGV2KQoreworCS8qIFRoZSByZWFzb24gdGhpcyBpc24ndCBhY3R1YWxseSBhIHJhY2UsIGFzIHlvdSBubworCSAgIGRvdWJ0IGhhdmUgYSBsaXR0bGUgdm9pY2Ugc2NyZWFtaW5nIGF0IHlvdSBpbiB5b3VyCisJICAgaGVhZCwgaXMgdGhhdCB0aGUgcmVmY291bnQgc2hvdWxkIG5ldmVyIGFjdHVhbGx5CisJICAgcmVhY2ggemVybyB1bmxlc3MgdGhlIGRldmljZSBoYXMgYWxyZWFkeSBiZWVuIHRha2VuCisJICAgb2ZmIHRoZSBsaXN0LCBpbiByZmNvbW1fZGV2X2RlbCgpLiBBbmQgaWYgdGhhdCdzIG5vdAorCSAgIHRydWUsIHdlJ2xsIGhpdCB0aGUgQlVHKCkgaW4gcmZjb21tX2Rldl9kZXN0cnVjdCgpCisJICAgYW55d2F5LiAqLworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkZXYtPnJlZmNudCkpCisJCXJmY29tbV9kZXZfZGVzdHJ1Y3QoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCByZmNvbW1fZGV2ICpfX3JmY29tbV9kZXZfZ2V0KGludCBpZCkKK3sKKwlzdHJ1Y3QgcmZjb21tX2RldiAqZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgICpwOworCisJbGlzdF9mb3JfZWFjaChwLCAmcmZjb21tX2Rldl9saXN0KSB7CisJCWRldiA9IGxpc3RfZW50cnkocCwgc3RydWN0IHJmY29tbV9kZXYsIGxpc3QpOworCQlpZiAoZGV2LT5pZCA9PSBpZCkKKwkJCXJldHVybiBkZXY7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJmY29tbV9kZXYgKnJmY29tbV9kZXZfZ2V0KGludCBpZCkKK3sKKwlzdHJ1Y3QgcmZjb21tX2RldiAqZGV2OworCisJcmVhZF9sb2NrKCZyZmNvbW1fZGV2X2xvY2spOworCisJZGV2ID0gX19yZmNvbW1fZGV2X2dldChpZCk7CisJaWYgKGRldikKKwkJcmZjb21tX2Rldl9ob2xkKGRldik7CisKKwlyZWFkX3VubG9jaygmcmZjb21tX2Rldl9sb2NrKTsKKworCXJldHVybiBkZXY7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX2Rldl9hZGQoc3RydWN0IHJmY29tbV9kZXZfcmVxICpyZXEsIHN0cnVjdCByZmNvbW1fZGxjICpkbGMpCit7CisJc3RydWN0IHJmY29tbV9kZXYgKmRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJnJmY29tbV9kZXZfbGlzdCwgKnA7CisJaW50IGVyciA9IDA7CisKKwlCVF9EQkcoImlkICVkIGNoYW5uZWwgJWQiLCByZXEtPmRldl9pZCwgcmVxLT5jaGFubmVsKTsKKwkKKwlkZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmZjb21tX2RldiksIEdGUF9LRVJORUwpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZGV2LCAwLCBzaXplb2Yoc3RydWN0IHJmY29tbV9kZXYpKTsKKworCXdyaXRlX2xvY2tfYmgoJnJmY29tbV9kZXZfbG9jayk7CisKKwlpZiAocmVxLT5kZXZfaWQgPCAwKSB7CisJCWRldi0+aWQgPSAwOworCisJCWxpc3RfZm9yX2VhY2gocCwgJnJmY29tbV9kZXZfbGlzdCkgeworCQkJaWYgKGxpc3RfZW50cnkocCwgc3RydWN0IHJmY29tbV9kZXYsIGxpc3QpLT5pZCAhPSBkZXYtPmlkKQorCQkJCWJyZWFrOworCisJCQlkZXYtPmlkKys7CisJCQloZWFkID0gcDsKKwkJfQorCX0gZWxzZSB7CisJCWRldi0+aWQgPSByZXEtPmRldl9pZDsKKworCQlsaXN0X2Zvcl9lYWNoKHAsICZyZmNvbW1fZGV2X2xpc3QpIHsKKwkJCXN0cnVjdCByZmNvbW1fZGV2ICplbnRyeSA9IGxpc3RfZW50cnkocCwgc3RydWN0IHJmY29tbV9kZXYsIGxpc3QpOworCisJCQlpZiAoZW50cnktPmlkID09IGRldi0+aWQpIHsKKwkJCQllcnIgPSAtRUFERFJJTlVTRTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJaWYgKGVudHJ5LT5pZCA+IGRldi0+aWQgLSAxKQorCQkJCWJyZWFrOworCisJCQloZWFkID0gcDsKKwkJfQorCX0KKworCWlmICgoZGV2LT5pZCA8IDApIHx8IChkZXYtPmlkID4gUkZDT01NX01BWF9ERVYgLSAxKSkgeworCQllcnIgPSAtRU5GSUxFOworCQlnb3RvIG91dDsKKwl9CisKKwlzcHJpbnRmKGRldi0+bmFtZSwgInJmY29tbSVkIiwgZGV2LT5pZCk7CisKKwlsaXN0X2FkZCgmZGV2LT5saXN0LCBoZWFkKTsKKwlhdG9taWNfc2V0KCZkZXYtPnJlZmNudCwgMSk7CisKKwliYWNweSgmZGV2LT5zcmMsICZyZXEtPnNyYyk7CisJYmFjcHkoJmRldi0+ZHN0LCAmcmVxLT5kc3QpOworCWRldi0+Y2hhbm5lbCA9IHJlcS0+Y2hhbm5lbDsKKworCWRldi0+ZmxhZ3MgPSByZXEtPmZsYWdzICYgCisJCSgoMSA8PCBSRkNPTU1fUkVMRUFTRV9PTkhVUCkgfCAoMSA8PCBSRkNPTU1fUkVVU0VfRExDKSk7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPndhaXQpOworCXRhc2tsZXRfaW5pdCgmZGV2LT53YWtldXBfdGFzaywgcmZjb21tX3R0eV93YWtldXAsICh1bnNpZ25lZCBsb25nKSBkZXYpOworCisJcmZjb21tX2RsY19sb2NrKGRsYyk7CisJZGxjLT5kYXRhX3JlYWR5ICAgPSByZmNvbW1fZGV2X2RhdGFfcmVhZHk7CisJZGxjLT5zdGF0ZV9jaGFuZ2UgPSByZmNvbW1fZGV2X3N0YXRlX2NoYW5nZTsKKwlkbGMtPm1vZGVtX3N0YXR1cyA9IHJmY29tbV9kZXZfbW9kZW1fc3RhdHVzOworCisJZGxjLT5vd25lciA9IGRldjsKKwlkZXYtPmRsYyAgID0gZGxjOworCXJmY29tbV9kbGNfdW5sb2NrKGRsYyk7CisKKwkvKiBJdCdzIHNhZmUgdG8gY2FsbCBfX21vZHVsZV9nZXQoKSBoZXJlIGJlY2F1c2Ugc29ja2V0IGFscmVhZHkgCisJICAgaG9sZHMgcmVmZXJlbmNlIHRvIHRoaXMgbW9kdWxlLiAqLworCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisKK291dDoKKwl3cml0ZV91bmxvY2tfYmgoJnJmY29tbV9kZXZfbG9jayk7CisKKwlpZiAoZXJyKSB7CisJCWtmcmVlKGRldik7CisJCXJldHVybiBlcnI7CisJfQorCisJdHR5X3JlZ2lzdGVyX2RldmljZShyZmNvbW1fdHR5X2RyaXZlciwgZGV2LT5pZCwgTlVMTCk7CisKKwlyZXR1cm4gZGV2LT5pZDsKK30KKworc3RhdGljIHZvaWQgcmZjb21tX2Rldl9kZWwoc3RydWN0IHJmY29tbV9kZXYgKmRldikKK3sKKwlCVF9EQkcoImRldiAlcCIsIGRldik7CisKKwl3cml0ZV9sb2NrX2JoKCZyZmNvbW1fZGV2X2xvY2spOworCWxpc3RfZGVsX2luaXQoJmRldi0+bGlzdCk7CisJd3JpdGVfdW5sb2NrX2JoKCZyZmNvbW1fZGV2X2xvY2spOworCisJcmZjb21tX2Rldl9wdXQoZGV2KTsKK30KKworLyogLS0tLSBTZW5kIGJ1ZmZlciAtLS0tICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCByZmNvbW1fcm9vbShzdHJ1Y3QgcmZjb21tX2RsYyAqZGxjKQoreworCS8qIFdlIGNhbid0IGxldCBpdCBiZSB6ZXJvLCBiZWNhdXNlIHdlIGRvbid0IGdldCBhIGNhbGxiYWNrCisJICAgd2hlbiB0eF9jcmVkaXRzIGJlY29tZXMgbm9uemVybywgaGVuY2Ugd2UnZCBuZXZlciB3YWtlIHVwICovCisJcmV0dXJuIGRsYy0+bXR1ICogKGRsYy0+dHhfY3JlZGl0cz86MSk7Cit9CisKK3N0YXRpYyB2b2lkIHJmY29tbV93ZnJlZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByZmNvbW1fZGV2ICpkZXYgPSAodm9pZCAqKSBza2ItPnNrOworCWF0b21pY19zdWIoc2tiLT50cnVlc2l6ZSwgJmRldi0+d21lbV9hbGxvYyk7CisJaWYgKHRlc3RfYml0KFJGQ09NTV9UVFlfQVRUQUNIRUQsICZkZXYtPmZsYWdzKSkKKwkJdGFza2xldF9zY2hlZHVsZSgmZGV2LT53YWtldXBfdGFzayk7CisJcmZjb21tX2Rldl9wdXQoZGV2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJmY29tbV9zZXRfb3duZXJfdyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgcmZjb21tX2RldiAqZGV2KQoreworCXJmY29tbV9kZXZfaG9sZChkZXYpOworCWF0b21pY19hZGQoc2tiLT50cnVlc2l6ZSwgJmRldi0+d21lbV9hbGxvYyk7CisJc2tiLT5zayA9ICh2b2lkICopIGRldjsKKwlza2ItPmRlc3RydWN0b3IgPSByZmNvbW1fd2ZyZWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqcmZjb21tX3dtYWxsb2Moc3RydWN0IHJmY29tbV9kZXYgKmRldiwgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgcHJpb3JpdHkpCit7CisJaWYgKGF0b21pY19yZWFkKCZkZXYtPndtZW1fYWxsb2MpIDwgcmZjb21tX3Jvb20oZGV2LT5kbGMpKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBhbGxvY19za2Ioc2l6ZSwgcHJpb3JpdHkpOworCQlpZiAoc2tiKSB7CisJCQlyZmNvbW1fc2V0X293bmVyX3coc2tiLCBkZXYpOworCQkJcmV0dXJuIHNrYjsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogLS0tLSBEZXZpY2UgSU9DVExzIC0tLS0gKi8KKworI2RlZmluZSBOT0NBUF9GTEFHUyAoKDEgPDwgUkZDT01NX1JFVVNFX0RMQykgfCAoMSA8PCBSRkNPTU1fUkVMRUFTRV9PTkhVUCkpCisKK3N0YXRpYyBpbnQgcmZjb21tX2NyZWF0ZV9kZXYoc3RydWN0IHNvY2sgKnNrLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCByZmNvbW1fZGV2X3JlcSByZXE7CisJc3RydWN0IHJmY29tbV9kbGMgKmRsYzsKKwlpbnQgaWQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcSwgYXJnLCBzaXplb2YocmVxKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJQlRfREJHKCJzayAlcCBkZXZfaWQgJWlkIGZsYWdzIDB4JXgiLCBzaywgcmVxLmRldl9pZCwgcmVxLmZsYWdzKTsKKworCWlmIChyZXEuZmxhZ3MgIT0gTk9DQVBfRkxBR1MgJiYgIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAocmVxLmZsYWdzICYgKDEgPDwgUkZDT01NX1JFVVNFX0RMQykpIHsKKwkJLyogU29ja2V0IG11c3QgYmUgY29ubmVjdGVkICovCisJCWlmIChzay0+c2tfc3RhdGUgIT0gQlRfQ09OTkVDVEVEKQorCQkJcmV0dXJuIC1FQkFERkQ7CisKKwkJZGxjID0gcmZjb21tX3BpKHNrKS0+ZGxjOworCQlyZmNvbW1fZGxjX2hvbGQoZGxjKTsKKwl9IGVsc2UgeworCQlkbGMgPSByZmNvbW1fZGxjX2FsbG9jKEdGUF9LRVJORUwpOworCQlpZiAoIWRsYykKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlkID0gcmZjb21tX2Rldl9hZGQoJnJlcSwgZGxjKTsKKwlpZiAoaWQgPCAwKSB7CisJCXJmY29tbV9kbGNfcHV0KGRsYyk7CisJCXJldHVybiBpZDsKKwl9CisKKwlpZiAocmVxLmZsYWdzICYgKDEgPDwgUkZDT01NX1JFVVNFX0RMQykpIHsKKwkJLyogRExDIGlzIG5vdyB1c2VkIGJ5IGRldmljZS4KKwkJICogU29ja2V0IG11c3QgYmUgZGlzY29ubmVjdGVkICovCisJCXNrLT5za19zdGF0ZSA9IEJUX0NMT1NFRDsKKwl9CisKKwlyZXR1cm4gaWQ7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3JlbGVhc2VfZGV2KHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IHJmY29tbV9kZXZfcmVxIHJlcTsKKwlzdHJ1Y3QgcmZjb21tX2RldiAqZGV2OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXEsIGFyZywgc2l6ZW9mKHJlcSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCUJUX0RCRygiZGV2X2lkICVpZCBmbGFncyAweCV4IiwgcmVxLmRldl9pZCwgcmVxLmZsYWdzKTsKKworCWlmICghKGRldiA9IHJmY29tbV9kZXZfZ2V0KHJlcS5kZXZfaWQpKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoZGV2LT5mbGFncyAhPSBOT0NBUF9GTEFHUyAmJiAhY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQlyZmNvbW1fZGV2X3B1dChkZXYpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWlmIChyZXEuZmxhZ3MgJiAoMSA8PCBSRkNPTU1fSEFOR1VQX05PVykpCisJCXJmY29tbV9kbGNfY2xvc2UoZGV2LT5kbGMsIDApOworCisJcmZjb21tX2Rldl9kZWwoZGV2KTsKKwlyZmNvbW1fZGV2X3B1dChkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJmY29tbV9nZXRfZGV2X2xpc3Qodm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgcmZjb21tX2Rldl9saXN0X3JlcSAqZGw7CisJc3RydWN0IHJmY29tbV9kZXZfaW5mbyAqZGk7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlpbnQgbiA9IDAsIHNpemUsIGVycjsKKwl1MTYgZGV2X251bTsKKworCUJUX0RCRygiIik7CisKKwlpZiAoZ2V0X3VzZXIoZGV2X251bSwgKHUxNiBfX3VzZXIgKikgYXJnKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoIWRldl9udW0gfHwgZGV2X251bSA+IChQQUdFX1NJWkUgKiA0KSAvIHNpemVvZigqZGkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNpemUgPSBzaXplb2YoKmRsKSArIGRldl9udW0gKiBzaXplb2YoKmRpKTsKKworCWlmICghKGRsID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKSkpCisJCXJldHVybiAtRU5PTUVNOworCisJZGkgPSBkbC0+ZGV2X2luZm87CisKKwlyZWFkX2xvY2tfYmgoJnJmY29tbV9kZXZfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZyZmNvbW1fZGV2X2xpc3QpIHsKKwkJc3RydWN0IHJmY29tbV9kZXYgKmRldiA9IGxpc3RfZW50cnkocCwgc3RydWN0IHJmY29tbV9kZXYsIGxpc3QpOworCQkoZGkgKyBuKS0+aWQgICAgICA9IGRldi0+aWQ7CisJCShkaSArIG4pLT5mbGFncyAgID0gZGV2LT5mbGFnczsKKwkJKGRpICsgbiktPnN0YXRlICAgPSBkZXYtPmRsYy0+c3RhdGU7CisJCShkaSArIG4pLT5jaGFubmVsID0gZGV2LT5jaGFubmVsOworCQliYWNweSgmKGRpICsgbiktPnNyYywgJmRldi0+c3JjKTsKKwkJYmFjcHkoJihkaSArIG4pLT5kc3QsICZkZXYtPmRzdCk7CisJCWlmICgrK24gPj0gZGV2X251bSkKKwkJCWJyZWFrOworCX0KKworCXJlYWRfdW5sb2NrX2JoKCZyZmNvbW1fZGV2X2xvY2spOworCisJZGwtPmRldl9udW0gPSBuOworCXNpemUgPSBzaXplb2YoKmRsKSArIG4gKiBzaXplb2YoKmRpKTsKKworCWVyciA9IGNvcHlfdG9fdXNlcihhcmcsIGRsLCBzaXplKTsKKwlrZnJlZShkbCk7CisKKwlyZXR1cm4gZXJyID8gLUVGQVVMVCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX2dldF9kZXZfaW5mbyh2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCByZmNvbW1fZGV2ICpkZXY7CisJc3RydWN0IHJmY29tbV9kZXZfaW5mbyBkaTsKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygiIik7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmRpLCBhcmcsIHNpemVvZihkaSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICghKGRldiA9IHJmY29tbV9kZXZfZ2V0KGRpLmlkKSkpCisJCXJldHVybiAtRU5PREVWOworCisJZGkuZmxhZ3MgICA9IGRldi0+ZmxhZ3M7CisJZGkuY2hhbm5lbCA9IGRldi0+Y2hhbm5lbDsKKwlkaS5zdGF0ZSAgID0gZGV2LT5kbGMtPnN0YXRlOworCWJhY3B5KCZkaS5zcmMsICZkZXYtPnNyYyk7CisJYmFjcHkoJmRpLmRzdCwgJmRldi0+ZHN0KTsKKworCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmZGksIHNpemVvZihkaSkpKQorCQllcnIgPSAtRUZBVUxUOworCisJcmZjb21tX2Rldl9wdXQoZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgcmZjb21tX2Rldl9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJQlRfREJHKCJjbWQgJWQgYXJnICVwIiwgY21kLCBhcmcpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJGQ09NTUNSRUFURURFVjoKKwkJcmV0dXJuIHJmY29tbV9jcmVhdGVfZGV2KHNrLCBhcmcpOworCisJY2FzZSBSRkNPTU1SRUxFQVNFREVWOgorCQlyZXR1cm4gcmZjb21tX3JlbGVhc2VfZGV2KGFyZyk7CisKKwljYXNlIFJGQ09NTUdFVERFVkxJU1Q6CisJCXJldHVybiByZmNvbW1fZ2V0X2Rldl9saXN0KGFyZyk7CisKKwljYXNlIFJGQ09NTUdFVERFVklORk86CisJCXJldHVybiByZmNvbW1fZ2V0X2Rldl9pbmZvKGFyZyk7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qIC0tLS0gRExDIGNhbGxiYWNrcyAtLS0tICovCitzdGF0aWMgdm9pZCByZmNvbW1fZGV2X2RhdGFfcmVhZHkoc3RydWN0IHJmY29tbV9kbGMgKmRsYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcmZjb21tX2RldiAqZGV2ID0gZGxjLT5vd25lcjsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworICAgICAgIAorCWlmICghZGV2IHx8ICEodHR5ID0gZGV2LT50dHkpKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorCisJQlRfREJHKCJkbGMgJXAgdHR5ICVwIGxlbiAlZCIsIGRsYywgdHR5LCBza2ItPmxlbik7CisKKwlpZiAodGVzdF9iaXQoVFRZX0RPTlRfRkxJUCwgJnR0eS0+ZmxhZ3MpKSB7CisJCXJlZ2lzdGVyIGludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgc2tiLT5sZW47IGkrKykgeworCQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKQorCQkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CisKKwkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgc2tiLT5kYXRhW2ldLCAwKTsKKwkJfQorCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworCX0gZWxzZQorCQl0dHktPmxkaXNjLnJlY2VpdmVfYnVmKHR0eSwgc2tiLT5kYXRhLCBOVUxMLCBza2ItPmxlbik7CisKKwlrZnJlZV9za2Ioc2tiKTsKK30KKworc3RhdGljIHZvaWQgcmZjb21tX2Rldl9zdGF0ZV9jaGFuZ2Uoc3RydWN0IHJmY29tbV9kbGMgKmRsYywgaW50IGVycikKK3sKKwlzdHJ1Y3QgcmZjb21tX2RldiAqZGV2ID0gZGxjLT5vd25lcjsKKwlpZiAoIWRldikKKwkJcmV0dXJuOworCQorCUJUX0RCRygiZGxjICVwIGRldiAlcCBlcnIgJWQiLCBkbGMsIGRldiwgZXJyKTsKKworCWRldi0+ZXJyID0gZXJyOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT53YWl0KTsKKworCWlmIChkbGMtPnN0YXRlID09IEJUX0NMT1NFRCkgeworCQlpZiAoIWRldi0+dHR5KSB7CisJCQlpZiAodGVzdF9iaXQoUkZDT01NX1JFTEVBU0VfT05IVVAsICZkZXYtPmZsYWdzKSkgeworCQkJCXJmY29tbV9kZXZfaG9sZChkZXYpOworCQkJCXJmY29tbV9kZXZfZGVsKGRldik7CisKKwkJCQkvKiBXZSBoYXZlIHRvIGRyb3AgRExDIGxvY2sgaGVyZSwgb3RoZXJ3aXNlCisJCQkJICAgcmZjb21tX2Rldl9wdXQoKSB3aWxsIGRlYWQgbG9jayBpZiBpdCdzCisJCQkJICAgdGhlIGxhc3QgcmVmZXJlbmNlLiAqLworCQkJCXJmY29tbV9kbGNfdW5sb2NrKGRsYyk7CisJCQkJcmZjb21tX2Rldl9wdXQoZGV2KTsKKwkJCQlyZmNvbW1fZGxjX2xvY2soZGxjKTsKKwkJCX0KKwkJfSBlbHNlIAorCQkJdHR5X2hhbmd1cChkZXYtPnR0eSk7CisJfQorfQorCitzdGF0aWMgdm9pZCByZmNvbW1fZGV2X21vZGVtX3N0YXR1cyhzdHJ1Y3QgcmZjb21tX2RsYyAqZGxjLCB1OCB2MjRfc2lnKQoreworCXN0cnVjdCByZmNvbW1fZGV2ICpkZXYgPSBkbGMtPm93bmVyOworCWlmICghZGV2KQorCQlyZXR1cm47CisJCisJQlRfREJHKCJkbGMgJXAgZGV2ICVwIHYyNF9zaWcgMHglMDJ4IiwgZGxjLCBkZXYsIHYyNF9zaWcpOworCisJZGV2LT5tb2RlbV9zdGF0dXMgPSAKKwkJKCh2MjRfc2lnICYgUkZDT01NX1YyNF9SVEMpID8gKFRJT0NNX0RTUiB8IFRJT0NNX0RUUikgOiAwKSB8CisJCSgodjI0X3NpZyAmIFJGQ09NTV9WMjRfUlRSKSA/IChUSU9DTV9SVFMgfCBUSU9DTV9DVFMpIDogMCkgfAorCQkoKHYyNF9zaWcgJiBSRkNPTU1fVjI0X0lDKSAgPyBUSU9DTV9SSSA6IDApIHwKKwkJKCh2MjRfc2lnICYgUkZDT01NX1YyNF9EVikgID8gVElPQ01fQ0QgOiAwKTsKK30KKworLyogLS0tLSBUVFkgZnVuY3Rpb25zIC0tLS0gKi8KK3N0YXRpYyB2b2lkIHJmY29tbV90dHlfd2FrZXVwKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCByZmNvbW1fZGV2ICpkZXYgPSAodm9pZCAqKSBhcmc7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGRldi0+dHR5OworCWlmICghdHR5KQorCQlyZXR1cm47CisKKwlCVF9EQkcoImRldiAlcCB0dHkgJXAiLCBkZXYsIHR0eSk7CisKKwlpZiAodGVzdF9iaXQoVFRZX0RPX1dSSVRFX1dBS0VVUCwgJnR0eS0+ZmxhZ3MpICYmIHR0eS0+bGRpc2Mud3JpdGVfd2FrZXVwKQorICAgICAgICAgICAgICAgICh0dHktPmxkaXNjLndyaXRlX3dha2V1cCkodHR5KTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKyNpZmRlZiBTRVJJQUxfSEFWRV9QT0xMX1dBSVQKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+cG9sbF93YWl0KTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IHJmY29tbV90dHlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3QgcmZjb21tX2RldiAqZGV2OworCXN0cnVjdCByZmNvbW1fZGxjICpkbGM7CisJaW50IGVyciwgaWQ7CisKKyAgICAgICAgaWQgPSB0dHktPmluZGV4OworCisJQlRfREJHKCJ0dHkgJXAgaWQgJWQiLCB0dHksIGlkKTsKKworCS8qIFdlIGRvbid0IGxlYWsgdGhpcyByZWZjb3VudC4gRm9yIHJlYXNvbnMgd2hpY2ggYXJlIG5vdCBlbnRpcmVseQorCSAgIGNsZWFyLCB0aGUgVFRZIGxheWVyIHdpbGwgY2FsbCBvdXIgLT5jbG9zZSgpIG1ldGhvZCBldmVuIGlmIHRoZQorCSAgIG9wZW4gZmFpbHMuIFdlIGRlY3JlYXNlIHRoZSByZWZjb3VudCB0aGVyZSwgYW5kIGRlY3JlYXNpbmcgaXQKKwkgICBoZXJlIHRvbyB3b3VsZCBjYXVzZSBicmVha2FnZS4gKi8KKwlkZXYgPSByZmNvbW1fZGV2X2dldChpZCk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJQlRfREJHKCJkZXYgJXAgZHN0ICVzIGNoYW5uZWwgJWQgb3BlbmVkICVkIiwgZGV2LCBiYXRvc3RyKCZkZXYtPmRzdCksIGRldi0+Y2hhbm5lbCwgZGV2LT5vcGVuZWQpOworCisJaWYgKGRldi0+b3BlbmVkKysgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlkbGMgPSBkZXYtPmRsYzsKKworCS8qIEF0dGFjaCBUVFkgYW5kIG9wZW4gRExDICovCisKKwlyZmNvbW1fZGxjX2xvY2soZGxjKTsKKwl0dHktPmRyaXZlcl9kYXRhID0gZGV2OworCWRldi0+dHR5ID0gdHR5OworCXJmY29tbV9kbGNfdW5sb2NrKGRsYyk7CisJc2V0X2JpdChSRkNPTU1fVFRZX0FUVEFDSEVELCAmZGV2LT5mbGFncyk7CisKKwllcnIgPSByZmNvbW1fZGxjX29wZW4oZGxjLCAmZGV2LT5zcmMsICZkZXYtPmRzdCwgZGV2LT5jaGFubmVsKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCS8qIFdhaXQgZm9yIERMQyB0byBjb25uZWN0ICovCisJYWRkX3dhaXRfcXVldWUoJmRldi0+d2FpdCwgJndhaXQpOworCXdoaWxlICgxKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJaWYgKGRsYy0+c3RhdGUgPT0gQlRfQ0xPU0VEKSB7CisJCQllcnIgPSAtZGV2LT5lcnI7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChkbGMtPnN0YXRlID09IEJUX0NPTk5FQ1RFRCkKKwkJCWJyZWFrOworCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJZXJyID0gLUVJTlRSOworCQkJYnJlYWs7CisJCX0KKworCQlzY2hlZHVsZSgpOworCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZkZXYtPndhaXQsICZ3YWl0KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHJmY29tbV90dHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHJmY29tbV9kZXYgKmRldiA9IChzdHJ1Y3QgcmZjb21tX2RldiAqKSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghZGV2KQorCQlyZXR1cm47CisKKwlCVF9EQkcoInR0eSAlcCBkZXYgJXAgZGxjICVwIG9wZW5lZCAlZCIsIHR0eSwgZGV2LCBkZXYtPmRsYywgZGV2LT5vcGVuZWQpOworCisJaWYgKC0tZGV2LT5vcGVuZWQgPT0gMCkgeworCQkvKiBDbG9zZSBETEMgYW5kIGRldHRhY2ggVFRZICovCisJCXJmY29tbV9kbGNfY2xvc2UoZGV2LT5kbGMsIDApOworCisJCWNsZWFyX2JpdChSRkNPTU1fVFRZX0FUVEFDSEVELCAmZGV2LT5mbGFncyk7CisJCXRhc2tsZXRfa2lsbCgmZGV2LT53YWtldXBfdGFzayk7CisKKwkJcmZjb21tX2RsY19sb2NrKGRldi0+ZGxjKTsKKwkJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7CisJCWRldi0+dHR5ID0gTlVMTDsKKwkJcmZjb21tX2RsY191bmxvY2soZGV2LT5kbGMpOworCX0KKworCXJmY29tbV9kZXZfcHV0KGRldik7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3R0eV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgcmZjb21tX2RldiAqZGV2ID0gKHN0cnVjdCByZmNvbW1fZGV2ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHJmY29tbV9kbGMgKmRsYyA9IGRldi0+ZGxjOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGVyciA9IDAsIHNlbnQgPSAwLCBzaXplOworCisJQlRfREJHKCJ0dHkgJXAgY291bnQgJWQiLCB0dHksIGNvdW50KTsKKworCXdoaWxlIChjb3VudCkgeworCQlzaXplID0gbWluX3QodWludCwgY291bnQsIGRsYy0+bXR1KTsKKworCQlza2IgPSByZmNvbW1fd21hbGxvYyhkZXYsIHNpemUgKyBSRkNPTU1fU0tCX1JFU0VSVkUsIEdGUF9BVE9NSUMpOworCQkKKwkJaWYgKCFza2IpCisJCQlicmVhazsKKworCQlza2JfcmVzZXJ2ZShza2IsIFJGQ09NTV9TS0JfSEVBRF9SRVNFUlZFKTsKKworCQltZW1jcHkoc2tiX3B1dChza2IsIHNpemUpLCBidWYgKyBzZW50LCBzaXplKTsKKworCQlpZiAoKGVyciA9IHJmY29tbV9kbGNfc2VuZChkbGMsIHNrYikpIDwgMCkgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlicmVhazsKKwkJfQorCisJCXNlbnQgICs9IHNpemU7CisJCWNvdW50IC09IHNpemU7CisJfQorCisJcmV0dXJuIHNlbnQgPyBzZW50IDogZXJyOworfQorCitzdGF0aWMgaW50IHJmY29tbV90dHlfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCByZmNvbW1fZGV2ICpkZXYgPSAoc3RydWN0IHJmY29tbV9kZXYgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgcm9vbTsKKworCUJUX0RCRygidHR5ICVwIiwgdHR5KTsKKworCXJvb20gPSByZmNvbW1fcm9vbShkZXYtPmRsYykgLSBhdG9taWNfcmVhZCgmZGV2LT53bWVtX2FsbG9jKTsKKwlpZiAocm9vbSA8IDApCisJCXJvb20gPSAwOworCXJldHVybiByb29tOworfQorCitzdGF0aWMgaW50IHJmY29tbV90dHlfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCUJUX0RCRygidHR5ICVwIGNtZCAweCUwMngiLCB0dHksIGNtZCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVENHRVRTOgorCQlCVF9EQkcoIlRDR0VUUyBpcyBub3Qgc3VwcG9ydGVkIik7CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKwljYXNlIFRDU0VUUzoKKwkJQlRfREJHKCJUQ1NFVFMgaXMgbm90IHN1cHBvcnRlZCIpOworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJY2FzZSBUSU9DTUlXQUlUOgorCQlCVF9EQkcoIlRJT0NNSVdBSVQiKTsKKwkJYnJlYWs7CisKKwljYXNlIFRJT0NHSUNPVU5UOgorCQlCVF9EQkcoIlRJT0NHSUNPVU5UIik7CisJCWJyZWFrOworCisJY2FzZSBUSU9DR1NFUklBTDoKKwkJQlRfRVJSKCJUSU9DR1NFUklBTCBpcyBub3Qgc3VwcG9ydGVkIik7CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKwljYXNlIFRJT0NTU0VSSUFMOgorCQlCVF9FUlIoIlRJT0NTU0VSSUFMIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworCWNhc2UgVElPQ1NFUkdTVFJVQ1Q6CisJCUJUX0VSUigiVElPQ1NFUkdTVFJVQ1QgaXMgbm90IHN1cHBvcnRlZCIpOworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJY2FzZSBUSU9DU0VSR0VUTFNSOgorCQlCVF9FUlIoIlRJT0NTRVJHRVRMU1IgaXMgbm90IHN1cHBvcnRlZCIpOworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJY2FzZSBUSU9DU0VSQ09ORklHOgorCQlCVF9FUlIoIlRJT0NTRVJDT05GSUcgaXMgbm90IHN1cHBvcnRlZCIpOworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsJLyogaW9jdGxzIHdoaWNoIHdlIG11c3QgaWdub3JlICovCisKKwl9CisKKwlyZXR1cm4gLUVOT0lPQ1RMQ01EOworfQorCisjZGVmaW5lIFJFTEVWQU5UX0lGTEFHKGlmbGFnKSAoaWZsYWcgJiAoSUdOQlJLfEJSS0lOVHxJR05QQVJ8UEFSTVJLfElOUENLKSkKKworc3RhdGljIHZvaWQgcmZjb21tX3R0eV9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkKQoreworCUJUX0RCRygidHR5ICVwIiwgdHR5KTsKKworCWlmICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnID09IG9sZC0+Y19jZmxhZykgJiYKKwkJKFJFTEVWQU5UX0lGTEFHKHR0eS0+dGVybWlvcy0+Y19pZmxhZykgPT0gUkVMRVZBTlRfSUZMQUcob2xkLT5jX2lmbGFnKSkpCisJCXJldHVybjsKKworCS8qIGhhbmRsZSB0dXJuaW5nIG9mZiBDUlRTQ1RTICovCisJaWYgKChvbGQtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJiAhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSB7CisJCUJUX0RCRygidHVybmluZyBvZmYgQ1JUU0NUUyIpOworCX0KK30KKworc3RhdGljIHZvaWQgcmZjb21tX3R0eV90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCByZmNvbW1fZGV2ICpkZXYgPSAoc3RydWN0IHJmY29tbV9kZXYgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCUJUX0RCRygidHR5ICVwIGRldiAlcCIsIHR0eSwgZGV2KTsKKwkKKwlyZmNvbW1fZGxjX3Rocm90dGxlKGRldi0+ZGxjKTsKK30KKworc3RhdGljIHZvaWQgcmZjb21tX3R0eV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHJmY29tbV9kZXYgKmRldiA9IChzdHJ1Y3QgcmZjb21tX2RldiAqKSB0dHktPmRyaXZlcl9kYXRhOworCisJQlRfREJHKCJ0dHkgJXAgZGV2ICVwIiwgdHR5LCBkZXYpOworCQorCXJmY29tbV9kbGNfdW50aHJvdHRsZShkZXYtPmRsYyk7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3R0eV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgcmZjb21tX2RldiAqZGV2ID0gKHN0cnVjdCByZmNvbW1fZGV2ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHJmY29tbV9kbGMgKmRsYyA9IGRldi0+ZGxjOworCisJQlRfREJHKCJ0dHkgJXAgZGV2ICVwIiwgdHR5LCBkZXYpOworCisJaWYgKHNrYl9xdWV1ZV9sZW4oJmRsYy0+dHhfcXVldWUpKQorCQlyZXR1cm4gZGxjLT5tdHU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmZjb21tX3R0eV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgcmZjb21tX2RldiAqZGV2ID0gKHN0cnVjdCByZmNvbW1fZGV2ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCFkZXYpCisJCXJldHVybjsKKworCUJUX0RCRygidHR5ICVwIGRldiAlcCIsIHR0eSwgZGV2KTsKKworCXNrYl9xdWV1ZV9wdXJnZSgmZGV2LT5kbGMtPnR4X3F1ZXVlKTsKKworCWlmICh0ZXN0X2JpdChUVFlfRE9fV1JJVEVfV0FLRVVQLCAmdHR5LT5mbGFncykgJiYgdHR5LT5sZGlzYy53cml0ZV93YWtldXApCisJCXR0eS0+bGRpc2Mud3JpdGVfd2FrZXVwKHR0eSk7Cit9CisKK3N0YXRpYyB2b2lkIHJmY29tbV90dHlfc2VuZF94Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyIGNoKQoreworCUJUX0RCRygidHR5ICVwIGNoICVjIiwgdHR5LCBjaCk7Cit9CisKK3N0YXRpYyB2b2lkIHJmY29tbV90dHlfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQoreworCUJUX0RCRygidHR5ICVwIHRpbWVvdXQgJWQiLCB0dHksIHRpbWVvdXQpOworfQorCitzdGF0aWMgdm9pZCByZmNvbW1fdHR5X2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCByZmNvbW1fZGV2ICpkZXYgPSAoc3RydWN0IHJmY29tbV9kZXYgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIWRldikKKwkJcmV0dXJuOworCisJQlRfREJHKCJ0dHkgJXAgZGV2ICVwIiwgdHR5LCBkZXYpOworCisJcmZjb21tX3R0eV9mbHVzaF9idWZmZXIodHR5KTsKKworCWlmICh0ZXN0X2JpdChSRkNPTU1fUkVMRUFTRV9PTkhVUCwgJmRldi0+ZmxhZ3MpKQorCQlyZmNvbW1fZGV2X2RlbChkZXYpOworfQorCitzdGF0aWMgaW50IHJmY29tbV90dHlfcmVhZF9wcm9jKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW4sIGludCAqZW9mLCB2b2lkICp1bnVzZWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3R0eV90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKyAJc3RydWN0IHJmY29tbV9kZXYgKmRldiA9IChzdHJ1Y3QgcmZjb21tX2RldiAqKSB0dHktPmRyaXZlcl9kYXRhOworCisJQlRfREJHKCJ0dHkgJXAgZGV2ICVwIiwgdHR5LCBkZXYpOworCisgCXJldHVybiBkZXYtPm1vZGVtX3N0YXR1czsKK30KKworc3RhdGljIGludCByZmNvbW1fdHR5X3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCit7CisgCXN0cnVjdCByZmNvbW1fZGV2ICpkZXYgPSAoc3RydWN0IHJmY29tbV9kZXYgKikgdHR5LT5kcml2ZXJfZGF0YTsKKyAJc3RydWN0IHJmY29tbV9kbGMgKmRsYyA9IGRldi0+ZGxjOworIAl1OCB2MjRfc2lnOworCisJQlRfREJHKCJ0dHkgJXAgZGV2ICVwIHNldCAweCUwMnggY2xlYXIgMHglMDJ4IiwgdHR5LCBkZXYsIHNldCwgY2xlYXIpOworCisgCXJmY29tbV9kbGNfZ2V0X21vZGVtX3N0YXR1cyhkbGMsICZ2MjRfc2lnKTsKKworIAlpZiAoc2V0ICYgVElPQ01fRFNSIHx8IHNldCAmIFRJT0NNX0RUUikKKyAJCXYyNF9zaWcgfD0gUkZDT01NX1YyNF9SVEM7CisgCWlmIChzZXQgJiBUSU9DTV9SVFMgfHwgc2V0ICYgVElPQ01fQ1RTKQorIAkJdjI0X3NpZyB8PSBSRkNPTU1fVjI0X1JUUjsKKyAJaWYgKHNldCAmIFRJT0NNX1JJKQorIAkJdjI0X3NpZyB8PSBSRkNPTU1fVjI0X0lDOworIAlpZiAoc2V0ICYgVElPQ01fQ0QpCisgCQl2MjRfc2lnIHw9IFJGQ09NTV9WMjRfRFY7CisKKyAJaWYgKGNsZWFyICYgVElPQ01fRFNSIHx8IGNsZWFyICYgVElPQ01fRFRSKQorIAkJdjI0X3NpZyAmPSB+UkZDT01NX1YyNF9SVEM7CisgCWlmIChjbGVhciAmIFRJT0NNX1JUUyB8fCBjbGVhciAmIFRJT0NNX0NUUykKKyAJCXYyNF9zaWcgJj0gflJGQ09NTV9WMjRfUlRSOworIAlpZiAoY2xlYXIgJiBUSU9DTV9SSSkKKyAJCXYyNF9zaWcgJj0gflJGQ09NTV9WMjRfSUM7CisgCWlmIChjbGVhciAmIFRJT0NNX0NEKQorIAkJdjI0X3NpZyAmPSB+UkZDT01NX1YyNF9EVjsKKworIAlyZmNvbW1fZGxjX3NldF9tb2RlbV9zdGF0dXMoZGxjLCB2MjRfc2lnKTsKKworIAlyZXR1cm4gMDsKK30KKworLyogLS0tLSBUVFkgc3RydWN0dXJlIC0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyByZmNvbW1fb3BzID0geworCS5vcGVuCQkJPSByZmNvbW1fdHR5X29wZW4sCisJLmNsb3NlCQkJPSByZmNvbW1fdHR5X2Nsb3NlLAorCS53cml0ZQkJCT0gcmZjb21tX3R0eV93cml0ZSwKKwkud3JpdGVfcm9vbQkJPSByZmNvbW1fdHR5X3dyaXRlX3Jvb20sCisJLmNoYXJzX2luX2J1ZmZlcgk9IHJmY29tbV90dHlfY2hhcnNfaW5fYnVmZmVyLAorCS5mbHVzaF9idWZmZXIJCT0gcmZjb21tX3R0eV9mbHVzaF9idWZmZXIsCisJLmlvY3RsCQkJPSByZmNvbW1fdHR5X2lvY3RsLAorCS50aHJvdHRsZQkJPSByZmNvbW1fdHR5X3Rocm90dGxlLAorCS51bnRocm90dGxlCQk9IHJmY29tbV90dHlfdW50aHJvdHRsZSwKKwkuc2V0X3Rlcm1pb3MJCT0gcmZjb21tX3R0eV9zZXRfdGVybWlvcywKKwkuc2VuZF94Y2hhcgkJPSByZmNvbW1fdHR5X3NlbmRfeGNoYXIsCisJLmhhbmd1cAkJCT0gcmZjb21tX3R0eV9oYW5ndXAsCisJLndhaXRfdW50aWxfc2VudAk9IHJmY29tbV90dHlfd2FpdF91bnRpbF9zZW50LAorCS5yZWFkX3Byb2MJCT0gcmZjb21tX3R0eV9yZWFkX3Byb2MsCisJLnRpb2NtZ2V0CQk9IHJmY29tbV90dHlfdGlvY21nZXQsCisJLnRpb2Ntc2V0CQk9IHJmY29tbV90dHlfdGlvY21zZXQsCit9OworCitpbnQgcmZjb21tX2luaXRfdHR5cyh2b2lkKQoreworCXJmY29tbV90dHlfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihSRkNPTU1fVFRZX1BPUlRTKTsKKwlpZiAoIXJmY29tbV90dHlfZHJpdmVyKQorCQlyZXR1cm4gLTE7CisKKwlyZmNvbW1fdHR5X2RyaXZlci0+b3duZXIJPSBUSElTX01PRFVMRTsKKwlyZmNvbW1fdHR5X2RyaXZlci0+ZHJpdmVyX25hbWUJPSAicmZjb21tIjsKKwlyZmNvbW1fdHR5X2RyaXZlci0+ZGV2ZnNfbmFtZQk9ICJibHVldG9vdGgvcmZjb21tLyI7CisJcmZjb21tX3R0eV9kcml2ZXItPm5hbWUJCT0gInJmY29tbSI7CisJcmZjb21tX3R0eV9kcml2ZXItPm1ham9yCT0gUkZDT01NX1RUWV9NQUpPUjsKKwlyZmNvbW1fdHR5X2RyaXZlci0+bWlub3Jfc3RhcnQJPSBSRkNPTU1fVFRZX01JTk9SOworCXJmY29tbV90dHlfZHJpdmVyLT50eXBlCQk9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJcmZjb21tX3R0eV9kcml2ZXItPnN1YnR5cGUJPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisJcmZjb21tX3R0eV9kcml2ZXItPmZsYWdzCT0gVFRZX0RSSVZFUl9SRUFMX1JBVyB8IFRUWV9EUklWRVJfTk9fREVWRlM7CisJcmZjb21tX3R0eV9kcml2ZXItPmluaXRfdGVybWlvcwk9IHR0eV9zdGRfdGVybWlvczsKKwlyZmNvbW1fdHR5X2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcJPSBCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7CisJdHR5X3NldF9vcGVyYXRpb25zKHJmY29tbV90dHlfZHJpdmVyLCAmcmZjb21tX29wcyk7CisKKwlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihyZmNvbW1fdHR5X2RyaXZlcikpIHsKKwkJQlRfRVJSKCJDYW4ndCByZWdpc3RlciBSRkNPTU0gVFRZIGRyaXZlciIpOworCQlwdXRfdHR5X2RyaXZlcihyZmNvbW1fdHR5X2RyaXZlcik7CisJCXJldHVybiAtMTsKKwl9CisKKwlCVF9JTkZPKCJSRkNPTU0gVFRZIGxheWVyIGluaXRpYWxpemVkIik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCByZmNvbW1fY2xlYW51cF90dHlzKHZvaWQpCit7CisJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHJmY29tbV90dHlfZHJpdmVyKTsKKwlwdXRfdHR5X2RyaXZlcihyZmNvbW1fdHR5X2RyaXZlcik7Cit9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3Njby5jIGIvbmV0L2JsdWV0b290aC9zY28uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTc1MGVmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9zY28uYwpAQCAtMCwwICsxLDEwNzEgQEAKKy8qIAorICAgQmx1ZVogLSBCbHVldG9vdGggcHJvdG9jb2wgc3RhY2sgZm9yIExpbnV4CisgICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSBRdWFsY29tbSBJbmNvcnBvcmF0ZWQKKworICAgV3JpdHRlbiAyMDAwLDIwMDEgYnkgTWF4aW0gS3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIFRISVJEIFBBUlRZIFJJR0hUUy4KKyAgIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIEFORCBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkKKyAgIENMQUlNLCBPUiBBTlkgU1BFQ0lBTCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIE9SIEFOWSBEQU1BR0VTIAorICAgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIAorICAgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgCisgICBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisgICBBTEwgTElBQklMSVRZLCBJTkNMVURJTkcgTElBQklMSVRZIEZPUiBJTkZSSU5HRU1FTlQgT0YgQU5ZIFBBVEVOVFMsIAorICAgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMsIFJFTEFUSU5HIFRPIFVTRSBPRiBUSElTIAorICAgU09GVFdBUkUgSVMgRElTQ0xBSU1FRC4KKyovCisKKy8qIEJsdWV0b290aCBTQ08gc29ja2V0cy4gKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL3Njby5oPgorCisjaWZuZGVmIENPTkZJR19CVF9TQ09fREVCVUcKKyN1bmRlZiAgQlRfREJHCisjZGVmaW5lIEJUX0RCRyhELi4uKQorI2VuZGlmCisKKyNkZWZpbmUgVkVSU0lPTiAiMC40IgorCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBzY29fc29ja19vcHM7CisKK3N0YXRpYyBzdHJ1Y3QgYnRfc29ja19saXN0IHNjb19za19saXN0ID0geworCS5sb2NrID0gUldfTE9DS19VTkxPQ0tFRAorfTsKKworc3RhdGljIHZvaWQgX19zY29fY2hhbl9hZGQoc3RydWN0IHNjb19jb25uICpjb25uLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrICpwYXJlbnQpOworc3RhdGljIHZvaWQgc2NvX2NoYW5fZGVsKHN0cnVjdCBzb2NrICpzaywgaW50IGVycik7CisKK3N0YXRpYyBpbnQgIHNjb19jb25uX2RlbChzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIGludCBlcnIpOworCitzdGF0aWMgdm9pZCBzY29fc29ja19jbG9zZShzdHJ1Y3Qgc29jayAqc2spOworc3RhdGljIHZvaWQgc2NvX3NvY2tfa2lsbChzdHJ1Y3Qgc29jayAqc2spOworCisvKiAtLS0tIFNDTyB0aW1lcnMgLS0tLSAqLworc3RhdGljIHZvaWQgc2NvX3NvY2tfdGltZW91dCh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSAoc3RydWN0IHNvY2sgKikgYXJnOworCisJQlRfREJHKCJzb2NrICVwIHN0YXRlICVkIiwgc2ssIHNrLT5za19zdGF0ZSk7CisKKwliaF9sb2NrX3NvY2soc2spOworCXNrLT5za19lcnIgPSBFVElNRURPVVQ7CisJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisJYmhfdW5sb2NrX3NvY2soc2spOworCisJc2NvX3NvY2tfa2lsbChzayk7CisJc29ja19wdXQoc2spOworfQorCitzdGF0aWMgdm9pZCBzY29fc29ja19zZXRfdGltZXIoc3RydWN0IHNvY2sgKnNrLCBsb25nIHRpbWVvdXQpCit7CisJQlRfREJHKCJzb2NrICVwIHN0YXRlICVkIHRpbWVvdXQgJWxkIiwgc2ssIHNrLT5za19zdGF0ZSwgdGltZW91dCk7CisJc2tfcmVzZXRfdGltZXIoc2ssICZzay0+c2tfdGltZXIsIGppZmZpZXMgKyB0aW1lb3V0KTsKK30KKworc3RhdGljIHZvaWQgc2NvX3NvY2tfY2xlYXJfdGltZXIoc3RydWN0IHNvY2sgKnNrKQoreworCUJUX0RCRygic29jayAlcCBzdGF0ZSAlZCIsIHNrLCBzay0+c2tfc3RhdGUpOworCXNrX3N0b3BfdGltZXIoc2ssICZzay0+c2tfdGltZXIpOworfQorCitzdGF0aWMgdm9pZCBzY29fc29ja19pbml0X3RpbWVyKHN0cnVjdCBzb2NrICpzaykKK3sKKwlpbml0X3RpbWVyKCZzay0+c2tfdGltZXIpOworCXNrLT5za190aW1lci5mdW5jdGlvbiA9IHNjb19zb2NrX3RpbWVvdXQ7CisJc2stPnNrX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylzazsKK30KKworLyogLS0tLSBTQ08gY29ubmVjdGlvbnMgLS0tLSAqLworc3RhdGljIHN0cnVjdCBzY29fY29ubiAqc2NvX2Nvbm5fYWRkKHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgX191OCBzdGF0dXMpCit7CisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBoY29uLT5oZGV2OworCXN0cnVjdCBzY29fY29ubiAqY29ubjsKKworCWlmICgoY29ubiA9IGhjb24tPnNjb19kYXRhKSkKKwkJcmV0dXJuIGNvbm47CisKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gY29ubjsKKworCWlmICghKGNvbm4gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NvX2Nvbm4pLCBHRlBfQVRPTUlDKSkpCisJCXJldHVybiBOVUxMOworCW1lbXNldChjb25uLCAwLCBzaXplb2Yoc3RydWN0IHNjb19jb25uKSk7CisKKwlzcGluX2xvY2tfaW5pdCgmY29ubi0+bG9jayk7CisKKwloY29uLT5zY29fZGF0YSA9IGNvbm47CisJY29ubi0+aGNvbiA9IGhjb247CisKKwljb25uLT5zcmMgPSAmaGRldi0+YmRhZGRyOworCWNvbm4tPmRzdCA9ICZoY29uLT5kc3Q7CisKKwlpZiAoaGRldi0+c2NvX210dSA+IDApCisJCWNvbm4tPm10dSA9IGhkZXYtPnNjb19tdHU7CisJZWxzZQorCQljb25uLT5tdHUgPSA2MDsKKworCUJUX0RCRygiaGNvbiAlcCBjb25uICVwIiwgaGNvbiwgY29ubik7CisJcmV0dXJuIGNvbm47Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2sgKnNjb19jaGFuX2dldChzdHJ1Y3Qgc2NvX2Nvbm4gKmNvbm4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gTlVMTDsKKwlzY29fY29ubl9sb2NrKGNvbm4pOworCXNrID0gY29ubi0+c2s7CisJc2NvX2Nvbm5fdW5sb2NrKGNvbm4pOworCXJldHVybiBzazsKK30KKworc3RhdGljIGludCBzY29fY29ubl9kZWwoc3RydWN0IGhjaV9jb25uICpoY29uLCBpbnQgZXJyKQoreworCXN0cnVjdCBzY29fY29ubiAqY29ubjsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlpZiAoIShjb25uID0gaGNvbi0+c2NvX2RhdGEpKSAKKwkJcmV0dXJuIDA7CisKKwlCVF9EQkcoImhjb24gJXAgY29ubiAlcCwgZXJyICVkIiwgaGNvbiwgY29ubiwgZXJyKTsKKworCS8qIEtpbGwgc29ja2V0ICovCisJaWYgKChzayA9IHNjb19jaGFuX2dldChjb25uKSkpIHsKKwkJYmhfbG9ja19zb2NrKHNrKTsKKwkJc2NvX3NvY2tfY2xlYXJfdGltZXIoc2spOworCQlzY29fY2hhbl9kZWwoc2ssIGVycik7CisJCWJoX3VubG9ja19zb2NrKHNrKTsKKwkJc2NvX3NvY2tfa2lsbChzayk7CisJfQorCisJaGNvbi0+c2NvX2RhdGEgPSBOVUxMOworCWtmcmVlKGNvbm4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzY29fY2hhbl9hZGQoc3RydWN0IHNjb19jb25uICpjb25uLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrICpwYXJlbnQpCit7CisJaW50IGVyciA9IDA7CisKKwlzY29fY29ubl9sb2NrKGNvbm4pOworCWlmIChjb25uLT5zaykgeworCQllcnIgPSAtRUJVU1k7CisJfSBlbHNlIHsKKwkJX19zY29fY2hhbl9hZGQoY29ubiwgc2ssIHBhcmVudCk7CisJfQorCXNjb19jb25uX3VubG9jayhjb25uKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNjb19jb25uZWN0KHN0cnVjdCBzb2NrICpzaykKK3sKKwliZGFkZHJfdCAqc3JjID0gJmJ0X3NrKHNrKS0+c3JjOworCWJkYWRkcl90ICpkc3QgPSAmYnRfc2soc2spLT5kc3Q7CisJc3RydWN0IHNjb19jb25uICpjb25uOworCXN0cnVjdCBoY2lfY29ubiAqaGNvbjsKKwlzdHJ1Y3QgaGNpX2RldiAgKmhkZXY7CisJaW50IGVyciA9IDA7CisKKwlCVF9EQkcoIiVzIC0+ICVzIiwgYmF0b3N0cihzcmMpLCBiYXRvc3RyKGRzdCkpOworCisJaWYgKCEoaGRldiA9IGhjaV9nZXRfcm91dGUoZHN0LCBzcmMpKSkKKwkJcmV0dXJuIC1FSE9TVFVOUkVBQ0g7CisKKwloY2lfZGV2X2xvY2tfYmgoaGRldik7CisKKwllcnIgPSAtRU5PTUVNOworCisJaGNvbiA9IGhjaV9jb25uZWN0KGhkZXYsIFNDT19MSU5LLCBkc3QpOworCWlmICghaGNvbikKKwkJZ290byBkb25lOworCisJY29ubiA9IHNjb19jb25uX2FkZChoY29uLCAwKTsKKwlpZiAoIWNvbm4pIHsKKwkJaGNpX2Nvbm5fcHV0KGhjb24pOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogVXBkYXRlIHNvdXJjZSBhZGRyIG9mIHRoZSBzb2NrZXQgKi8KKwliYWNweShzcmMsIGNvbm4tPnNyYyk7CisKKwllcnIgPSBzY29fY2hhbl9hZGQoY29ubiwgc2ssIE5VTEwpOworCWlmIChlcnIpCisJCWdvdG8gZG9uZTsKKworCWlmIChoY29uLT5zdGF0ZSA9PSBCVF9DT05ORUNURUQpIHsKKwkJc2NvX3NvY2tfY2xlYXJfdGltZXIoc2spOworCQlzay0+c2tfc3RhdGUgPSBCVF9DT05ORUNURUQ7CisJfSBlbHNlIHsKKwkJc2stPnNrX3N0YXRlID0gQlRfQ09OTkVDVDsKKwkJc2NvX3NvY2tfc2V0X3RpbWVyKHNrLCBzay0+c2tfc25kdGltZW8pOworCX0KK2RvbmU6CisJaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CisJaGNpX2Rldl9wdXQoaGRldik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2NvX3NlbmRfZnJhbWUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIGludCBsZW4pCit7CisJc3RydWN0IHNjb19jb25uICpjb25uID0gc2NvX3BpKHNrKS0+Y29ubjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBlcnIsIGNvdW50OworCisJLyogQ2hlY2sgb3V0Z29pbmcgTVRVICovCisJaWYgKGxlbiA+IGNvbm4tPm10dSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlCVF9EQkcoInNrICVwIGxlbiAlZCIsIHNrLCBsZW4pOworCisJY291bnQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbm4tPm10dSwgbGVuKTsKKwlpZiAoIShza2IgPSBidF9za2Jfc2VuZF9hbGxvYyhzaywgY291bnQsIG1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlULCAmZXJyKSkpCisJCXJldHVybiBlcnI7CisKKwlpZiAobWVtY3B5X2Zyb21pb3ZlYyhza2JfcHV0KHNrYiwgY291bnQpLCBtc2ctPm1zZ19pb3YsIGNvdW50KSkgeworCQllcnIgPSAtRUZBVUxUOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKChlcnIgPSBoY2lfc2VuZF9zY28oY29ubi0+aGNvbiwgc2tiKSkgPCAwKQorCQlnb3RvIGZhaWw7CisKKwlyZXR1cm4gY291bnQ7CisKK2ZhaWw6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNjb19yZWN2X2ZyYW1lKHN0cnVjdCBzY29fY29ubiAqY29ubiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzY29fY2hhbl9nZXQoY29ubik7CisKKwlpZiAoIXNrKQorCQlnb3RvIGRyb3A7CisKKwlCVF9EQkcoInNrICVwIGxlbiAlZCIsIHNrLCBza2ItPmxlbik7CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0NPTk5FQ1RFRCkKKwkJZ290byBkcm9wOworCisJaWYgKCFzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYikpCisJCXJldHVybjsKKworZHJvcDoKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm47Cit9CisKKy8qIC0tLS0tLS0tIFNvY2tldCBpbnRlcmZhY2UgLS0tLS0tLS0tLSAqLworc3RhdGljIHN0cnVjdCBzb2NrICpfX3Njb19nZXRfc29ja19ieV9hZGRyKGJkYWRkcl90ICpiYSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisKKwlza19mb3JfZWFjaChzaywgbm9kZSwgJnNjb19za19saXN0LmhlYWQpCisJCWlmICghYmFjbXAoJmJ0X3NrKHNrKS0+c3JjLCBiYSkpCisJCQlnb3RvIGZvdW5kOworCXNrID0gTlVMTDsKK2ZvdW5kOgorCXJldHVybiBzazsKK30KKworLyogRmluZCBzb2NrZXQgbGlzdGVuaW5nIG9uIHNvdXJjZSBiZGFkZHIuCisgKiBSZXR1cm5zIGNsb3Nlc3QgbWF0Y2guCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29jayAqc2NvX2dldF9zb2NrX2xpc3RlbihiZGFkZHJfdCAqc3JjKQoreworCXN0cnVjdCBzb2NrICpzayA9IE5VTEwsICpzazEgPSBOVUxMOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJcmVhZF9sb2NrKCZzY29fc2tfbGlzdC5sb2NrKTsKKworCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmc2NvX3NrX2xpc3QuaGVhZCkgeworCQlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0xJU1RFTikKKwkJCWNvbnRpbnVlOworCisJCS8qIEV4YWN0IG1hdGNoLiAqLworCQlpZiAoIWJhY21wKCZidF9zayhzayktPnNyYywgc3JjKSkKKwkJCWJyZWFrOworCisJCS8qIENsb3Nlc3QgbWF0Y2ggKi8KKwkJaWYgKCFiYWNtcCgmYnRfc2soc2spLT5zcmMsIEJEQUREUl9BTlkpKQorCQkJc2sxID0gc2s7CisJfQorCisJcmVhZF91bmxvY2soJnNjb19za19saXN0LmxvY2spOworCisJcmV0dXJuIG5vZGUgPyBzayA6IHNrMTsKK30KKworc3RhdGljIHZvaWQgc2NvX3NvY2tfZGVzdHJ1Y3Qoc3RydWN0IHNvY2sgKnNrKQoreworCUJUX0RCRygic2sgJXAiLCBzayk7CisKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za193cml0ZV9xdWV1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjb19zb2NrX2NsZWFudXBfbGlzdGVuKHN0cnVjdCBzb2NrICpwYXJlbnQpCit7CisJc3RydWN0IHNvY2sgKnNrOworCisJQlRfREJHKCJwYXJlbnQgJXAiLCBwYXJlbnQpOworCisJLyogQ2xvc2Ugbm90IHlldCBhY2NlcHRlZCBjaGFubmVscyAqLworCXdoaWxlICgoc2sgPSBidF9hY2NlcHRfZGVxdWV1ZShwYXJlbnQsIE5VTEwpKSkgeworCQlzY29fc29ja19jbG9zZShzayk7CisJCXNjb19zb2NrX2tpbGwoc2spOworCX0KKworCXBhcmVudC0+c2tfc3RhdGUgID0gQlRfQ0xPU0VEOworCXNvY2tfc2V0X2ZsYWcocGFyZW50LCBTT0NLX1pBUFBFRCk7Cit9CisKKy8qIEtpbGwgc29ja2V0IChvbmx5IGlmIHphcHBlZCBhbmQgb3JwaGFuKQorICogTXVzdCBiZSBjYWxsZWQgb24gdW5sb2NrZWQgc29ja2V0LgorICovCitzdGF0aWMgdm9pZCBzY29fc29ja19raWxsKHN0cnVjdCBzb2NrICpzaykKK3sKKwlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19aQVBQRUQpIHx8IHNrLT5za19zb2NrZXQpCisJCXJldHVybjsKKworCUJUX0RCRygic2sgJXAgc3RhdGUgJWQiLCBzaywgc2stPnNrX3N0YXRlKTsKKworCS8qIEtpbGwgcG9vciBvcnBoYW4gKi8KKwlidF9zb2NrX3VubGluaygmc2NvX3NrX2xpc3QsIHNrKTsKKwlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX0RFQUQpOworCXNvY2tfcHV0KHNrKTsKK30KKworLyogQ2xvc2Ugc29ja2V0LgorICogTXVzdCBiZSBjYWxsZWQgb24gdW5sb2NrZWQgc29ja2V0LgorICovCitzdGF0aWMgdm9pZCBzY29fc29ja19jbG9zZShzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHNjb19jb25uICpjb25uOworCisJc2NvX3NvY2tfY2xlYXJfdGltZXIoc2spOworCisJbG9ja19zb2NrKHNrKTsKKworCWNvbm4gPSBzY29fcGkoc2spLT5jb25uOworCisJQlRfREJHKCJzayAlcCBzdGF0ZSAlZCBjb25uICVwIHNvY2tldCAlcCIsIHNrLCBzay0+c2tfc3RhdGUsIGNvbm4sIHNrLT5za19zb2NrZXQpOworCisJc3dpdGNoIChzay0+c2tfc3RhdGUpIHsKKwljYXNlIEJUX0xJU1RFTjoKKwkJc2NvX3NvY2tfY2xlYW51cF9saXN0ZW4oc2spOworCQlicmVhazsKKworCWNhc2UgQlRfQ09OTkVDVEVEOgorCWNhc2UgQlRfQ09ORklHOgorCWNhc2UgQlRfQ09OTkVDVDoKKwljYXNlIEJUX0RJU0NPTk46CisJCXNjb19jaGFuX2RlbChzaywgRUNPTk5SRVNFVCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc29ja19zZXRfZmxhZyhzaywgU09DS19aQVBQRUQpOworCQlicmVhazsKKwl9OworCisJcmVsZWFzZV9zb2NrKHNrKTsKKworCXNjb19zb2NrX2tpbGwoc2spOworfQorCitzdGF0aWMgdm9pZCBzY29fc29ja19pbml0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2sgKnBhcmVudCkKK3sKKwlCVF9EQkcoInNrICVwIiwgc2spOworCisJaWYgKHBhcmVudCkgCisJCXNrLT5za190eXBlID0gcGFyZW50LT5za190eXBlOworfQorCitzdGF0aWMgc3RydWN0IHByb3RvIHNjb19wcm90byA9IHsKKwkubmFtZQkJPSAiU0NPIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9ial9zaXplCT0gc2l6ZW9mKHN0cnVjdCBzY29fcGluZm8pCit9OworCitzdGF0aWMgc3RydWN0IHNvY2sgKnNjb19zb2NrX2FsbG9jKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90bywgaW50IHByaW8pCit7CisJc3RydWN0IHNvY2sgKnNrOworCisJc2sgPSBza19hbGxvYyhQRl9CTFVFVE9PVEgsIHByaW8sICZzY29fcHJvdG8sIDEpOworCWlmICghc2spCisJCXJldHVybiBOVUxMOworCisJc29ja19pbml0X2RhdGEoc29jaywgc2spOworCUlOSVRfTElTVF9IRUFEKCZidF9zayhzayktPmFjY2VwdF9xKTsKKworCXNrLT5za19kZXN0cnVjdCA9IHNjb19zb2NrX2Rlc3RydWN0OworCXNrLT5za19zbmR0aW1lbyA9IFNDT19DT05OX1RJTUVPVVQ7CisKKwlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKworCXNrLT5za19wcm90b2NvbCA9IHByb3RvOworCXNrLT5za19zdGF0ZSAgICA9IEJUX09QRU47CisKKwlzY29fc29ja19pbml0X3RpbWVyKHNrKTsKKworCWJ0X3NvY2tfbGluaygmc2NvX3NrX2xpc3QsIHNrKTsKKwlyZXR1cm4gc2s7Cit9CisKK3N0YXRpYyBpbnQgc2NvX3NvY2tfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlCVF9EQkcoInNvY2sgJXAiLCBzb2NrKTsKKworCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CisKKwlpZiAoc29jay0+dHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCkKKwkJcmV0dXJuIC1FU09DS1ROT1NVUFBPUlQ7CisKKwlzb2NrLT5vcHMgPSAmc2NvX3NvY2tfb3BzOworCisJaWYgKCEoc2sgPSBzY29fc29ja19hbGxvYyhzb2NrLCBwcm90b2NvbCwgR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNjb19zb2NrX2luaXQoc2ssIE5VTEwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjb19zb2NrX2JpbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcl9sZW4pCit7CisJc3RydWN0IHNvY2thZGRyX3NjbyAqc2EgPSAoc3RydWN0IHNvY2thZGRyX3NjbyAqKSBhZGRyOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWJkYWRkcl90ICpzcmMgPSAmc2EtPnNjb19iZGFkZHI7CisJaW50IGVyciA9IDA7CisKKwlCVF9EQkcoInNrICVwICVzIiwgc2ssIGJhdG9zdHIoJnNhLT5zY29fYmRhZGRyKSk7CisKKwlpZiAoIWFkZHIgfHwgYWRkci0+c2FfZmFtaWx5ICE9IEFGX0JMVUVUT09USCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsb2NrX3NvY2soc2spOworCisJaWYgKHNrLT5za19zdGF0ZSAhPSBCVF9PUEVOKSB7CisJCWVyciA9IC1FQkFERkQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl3cml0ZV9sb2NrX2JoKCZzY29fc2tfbGlzdC5sb2NrKTsKKworCWlmIChiYWNtcChzcmMsIEJEQUREUl9BTlkpICYmIF9fc2NvX2dldF9zb2NrX2J5X2FkZHIoc3JjKSkgeworCQllcnIgPSAtRUFERFJJTlVTRTsKKwl9IGVsc2UgeworCQkvKiBTYXZlIHNvdXJjZSBhZGRyZXNzICovCisJCWJhY3B5KCZidF9zayhzayktPnNyYywgJnNhLT5zY29fYmRhZGRyKTsKKwkJc2stPnNrX3N0YXRlID0gQlRfQk9VTkQ7CisJfQorCisJd3JpdGVfdW5sb2NrX2JoKCZzY29fc2tfbGlzdC5sb2NrKTsKKworZG9uZToKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc2NvX3NvY2tfY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCBhbGVuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2thZGRyX3NjbyAqc2EgPSAoc3RydWN0IHNvY2thZGRyX3NjbyAqKSBhZGRyOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnIgPSAwOworCisKKwlCVF9EQkcoInNrICVwIiwgc2spOworCisJaWYgKGFkZHItPnNhX2ZhbWlseSAhPSBBRl9CTFVFVE9PVEggfHwgYWxlbiA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfc2NvKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IEJUX09QRU4gJiYgc2stPnNrX3N0YXRlICE9IEJUX0JPVU5EKQorCQlyZXR1cm4gLUVCQURGRDsKKworCWlmIChzay0+c2tfdHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsb2NrX3NvY2soc2spOworCisJLyogU2V0IGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kIHBzbSAqLworCWJhY3B5KCZidF9zayhzayktPmRzdCwgJnNhLT5zY29fYmRhZGRyKTsKKworCWlmICgoZXJyID0gc2NvX2Nvbm5lY3Qoc2spKSkKKwkJZ290byBkb25lOworCisJZXJyID0gYnRfc29ja193YWl0X3N0YXRlKHNrLCBCVF9DT05ORUNURUQsIAorCQkJc29ja19zbmR0aW1lbyhzaywgZmxhZ3MgJiBPX05PTkJMT0NLKSk7CisKK2RvbmU6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNjb19zb2NrX2xpc3RlbihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgYmFja2xvZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygic2sgJXAgYmFja2xvZyAlZCIsIHNrLCBiYWNrbG9nKTsKKworCWxvY2tfc29jayhzayk7CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0JPVU5EIHx8IHNvY2stPnR5cGUgIT0gU09DS19TRVFQQUNLRVQpIHsKKwkJZXJyID0gLUVCQURGRDsKKwkJZ290byBkb25lOworCX0KKworCXNrLT5za19tYXhfYWNrX2JhY2tsb2cgPSBiYWNrbG9nOworCXNrLT5za19hY2tfYmFja2xvZyA9IDA7CisJc2stPnNrX3N0YXRlID0gQlRfTElTVEVOOworCitkb25lOgorCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzY29fc29ja19hY2NlcHQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2tldCAqbmV3c29jaywgaW50IGZsYWdzKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrLCAqY2g7CisJbG9uZyB0aW1lbzsKKwlpbnQgZXJyID0gMDsKKworCWxvY2tfc29jayhzayk7CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0xJU1RFTikgeworCQllcnIgPSAtRUJBREZEOworCQlnb3RvIGRvbmU7CisJfQorCisJdGltZW8gPSBzb2NrX3JjdnRpbWVvKHNrLCBmbGFncyAmIE9fTk9OQkxPQ0spOworCisJQlRfREJHKCJzayAlcCB0aW1lbyAlbGQiLCBzaywgdGltZW8pOworCisJLyogV2FpdCBmb3IgYW4gaW5jb21pbmcgY29ubmVjdGlvbi4gKHdha2Utb25lKS4gKi8KKwlhZGRfd2FpdF9xdWV1ZV9leGNsdXNpdmUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJd2hpbGUgKCEoY2ggPSBidF9hY2NlcHRfZGVxdWV1ZShzaywgbmV3c29jaykpKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmICghdGltZW8pIHsKKwkJCWVyciA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJfQorCisJCXJlbGVhc2Vfc29jayhzayk7CisJCXRpbWVvID0gc2NoZWR1bGVfdGltZW91dCh0aW1lbyk7CisJCWxvY2tfc29jayhzayk7CisKKwkJaWYgKHNrLT5za19zdGF0ZSAhPSBCVF9MSVNURU4pIHsKKwkJCWVyciA9IC1FQkFERkQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJZXJyID0gc29ja19pbnRyX2Vycm5vKHRpbWVvKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisKKwlpZiAoZXJyKQorCQlnb3RvIGRvbmU7CisKKwluZXdzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKworCUJUX0RCRygibmV3IHNvY2tldCAlcCIsIGNoKTsKKworZG9uZToKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc2NvX3NvY2tfZ2V0bmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCAqbGVuLCBpbnQgcGVlcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfc2NvICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHJfc2NvICopIGFkZHI7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisKKwlCVF9EQkcoInNvY2sgJXAsIHNrICVwIiwgc29jaywgc2spOworCisJYWRkci0+c2FfZmFtaWx5ID0gQUZfQkxVRVRPT1RIOworCSpsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3Njbyk7CisKKwlpZiAocGVlcikKKwkJYmFjcHkoJnNhLT5zY29fYmRhZGRyLCAmYnRfc2soc2spLT5kc3QpOworCWVsc2UKKwkJYmFjcHkoJnNhLT5zY29fYmRhZGRyLCAmYnRfc2soc2spLT5zcmMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NvX3NvY2tfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIAorCQkJICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygic29jayAlcCwgc2sgJXAiLCBzb2NrLCBzayk7CisKKwlpZiAoc2stPnNrX2VycikKKwkJcmV0dXJuIHNvY2tfZXJyb3Ioc2spOworCisJaWYgKG1zZy0+bXNnX2ZsYWdzICYgTVNHX09PQikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJbG9ja19zb2NrKHNrKTsKKworCWlmIChzay0+c2tfc3RhdGUgPT0gQlRfQ09OTkVDVEVEKQorCQllcnIgPSBzY29fc2VuZF9mcmFtZShzaywgbXNnLCBsZW4pOworCWVsc2UKKwkJZXJyID0gLUVOT1RDT05OOworCisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNjb19zb2NrX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygic2sgJXAiLCBzayk7CisKKwlsb2NrX3NvY2soc2spOworCisJc3dpdGNoIChvcHRuYW1lKSB7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT1BST1RPT1BUOworCQlicmVhazsKKwl9CisKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc2NvX3NvY2tfZ2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHNjb19vcHRpb25zIG9wdHM7CisJc3RydWN0IHNjb19jb25uaW5mbyBjaW5mbzsKKwlpbnQgbGVuLCBlcnIgPSAwOyAKKworCUJUX0RCRygic2sgJXAiLCBzayk7CisKKwlpZiAoZ2V0X3VzZXIobGVuLCBvcHRsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWxvY2tfc29jayhzayk7CisKKwlzd2l0Y2ggKG9wdG5hbWUpIHsKKwljYXNlIFNDT19PUFRJT05TOgorCQlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0NPTk5FQ1RFRCkgeworCQkJZXJyID0gLUVOT1RDT05OOworCQkJYnJlYWs7CisJCX0KKworCQlvcHRzLm10dSA9IHNjb19waShzayktPmNvbm4tPm10dTsKKworCQlCVF9EQkcoIm10dSAlZCIsIG9wdHMubXR1KTsKKworCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgc2l6ZW9mKG9wdHMpKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsIChjaGFyICopJm9wdHMsIGxlbikpCisJCQllcnIgPSAtRUZBVUxUOworCisJCWJyZWFrOworCisJY2FzZSBTQ09fQ09OTklORk86CisJCWlmIChzay0+c2tfc3RhdGUgIT0gQlRfQ09OTkVDVEVEKSB7CisJCQllcnIgPSAtRU5PVENPTk47CisJCQlicmVhazsKKwkJfQorCisJCWNpbmZvLmhjaV9oYW5kbGUgPSBzY29fcGkoc2spLT5jb25uLT5oY29uLT5oYW5kbGU7CisJCW1lbWNweShjaW5mby5kZXZfY2xhc3MsIHNjb19waShzayktPmNvbm4tPmhjb24tPmRldl9jbGFzcywgMyk7CisKKwkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sIHNpemVvZihjaW5mbykpOworCQlpZiAoY29weV90b191c2VyKG9wdHZhbCwgKGNoYXIgKikmY2luZm8sIGxlbikpCisJCQllcnIgPSAtRUZBVUxUOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT1BST1RPT1BUOworCQlicmVhazsKKwl9CisKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc2NvX3NvY2tfcmVsZWFzZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnIgPSAwOworCisJQlRfREJHKCJzb2NrICVwLCBzayAlcCIsIHNvY2ssIHNrKTsKKworCWlmICghc2spCisJCXJldHVybiAwOworCisJc2NvX3NvY2tfY2xvc2Uoc2spOworCisJaWYgKHNvY2tfZmxhZyhzaywgU09DS19MSU5HRVIpICYmIHNrLT5za19saW5nZXJ0aW1lKSB7CisJCWxvY2tfc29jayhzayk7CisJCWVyciA9IGJ0X3NvY2tfd2FpdF9zdGF0ZShzaywgQlRfQ0xPU0VELCBzay0+c2tfbGluZ2VydGltZSk7CisJCXJlbGVhc2Vfc29jayhzayk7CisJfQorCisJc29ja19vcnBoYW4oc2spOworCXNjb19zb2NrX2tpbGwoc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fc2NvX2NoYW5fYWRkKHN0cnVjdCBzY29fY29ubiAqY29ubiwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29jayAqcGFyZW50KQoreworCUJUX0RCRygiY29ubiAlcCIsIGNvbm4pOworCisJc2NvX3BpKHNrKS0+Y29ubiA9IGNvbm47CisJY29ubi0+c2sgPSBzazsKKworCWlmIChwYXJlbnQpCisJCWJ0X2FjY2VwdF9lbnF1ZXVlKHBhcmVudCwgc2spOworfQorCisvKiBEZWxldGUgY2hhbm5lbC4gCisgKiBNdXN0IGJlIGNhbGxlZCBvbiB0aGUgbG9ja2VkIHNvY2tldC4gKi8KK3N0YXRpYyB2b2lkIHNjb19jaGFuX2RlbChzdHJ1Y3Qgc29jayAqc2ssIGludCBlcnIpCit7CisJc3RydWN0IHNjb19jb25uICpjb25uOworCisJY29ubiA9IHNjb19waShzayktPmNvbm47CisKKwlCVF9EQkcoInNrICVwLCBjb25uICVwLCBlcnIgJWQiLCBzaywgY29ubiwgZXJyKTsKKworCWlmIChjb25uKSB7IAorCQlzY29fY29ubl9sb2NrKGNvbm4pOworCQljb25uLT5zayA9IE5VTEw7CisJCXNjb19waShzayktPmNvbm4gPSBOVUxMOworCQlzY29fY29ubl91bmxvY2soY29ubik7CisJCWhjaV9jb25uX3B1dChjb25uLT5oY29uKTsKKwl9CisKKwlzay0+c2tfc3RhdGUgPSBCVF9DTE9TRUQ7CisJc2stPnNrX2VyciAgID0gZXJyOworCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCisJc29ja19zZXRfZmxhZyhzaywgU09DS19aQVBQRUQpOworfQorCitzdGF0aWMgdm9pZCBzY29fY29ubl9yZWFkeShzdHJ1Y3Qgc2NvX2Nvbm4gKmNvbm4pCit7CisJc3RydWN0IHNvY2sgKnBhcmVudCwgKnNrOworCisJQlRfREJHKCJjb25uICVwIiwgY29ubik7CisKKwlzY29fY29ubl9sb2NrKGNvbm4pOworCisJaWYgKChzayA9IGNvbm4tPnNrKSkgeworCQlzY29fc29ja19jbGVhcl90aW1lcihzayk7CisJCWJoX2xvY2tfc29jayhzayk7CisJCXNrLT5za19zdGF0ZSA9IEJUX0NPTk5FQ1RFRDsKKwkJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisJCWJoX3VubG9ja19zb2NrKHNrKTsKKwl9IGVsc2UgeworCQlwYXJlbnQgPSBzY29fZ2V0X3NvY2tfbGlzdGVuKGNvbm4tPnNyYyk7CisJCWlmICghcGFyZW50KQorCQkJZ290byBkb25lOworCisJCWJoX2xvY2tfc29jayhwYXJlbnQpOworCisJCXNrID0gc2NvX3NvY2tfYWxsb2MoTlVMTCwgQlRQUk9UT19TQ08sIEdGUF9BVE9NSUMpOworCQlpZiAoIXNrKSB7CisJCQliaF91bmxvY2tfc29jayhwYXJlbnQpOworCQkJZ290byBkb25lOworCQl9CisKKwkJc2NvX3NvY2tfaW5pdChzaywgcGFyZW50KTsKKworCQliYWNweSgmYnRfc2soc2spLT5zcmMsIGNvbm4tPnNyYyk7CisJCWJhY3B5KCZidF9zayhzayktPmRzdCwgY29ubi0+ZHN0KTsKKworCQloY2lfY29ubl9ob2xkKGNvbm4tPmhjb24pOworCQlfX3Njb19jaGFuX2FkZChjb25uLCBzaywgcGFyZW50KTsKKworCQlzay0+c2tfc3RhdGUgPSBCVF9DT05ORUNURUQ7CisKKwkJLyogV2FrZSB1cCBwYXJlbnQgKi8KKwkJcGFyZW50LT5za19kYXRhX3JlYWR5KHBhcmVudCwgMSk7CisKKwkJYmhfdW5sb2NrX3NvY2socGFyZW50KTsKKwl9CisKK2RvbmU6CisJc2NvX2Nvbm5fdW5sb2NrKGNvbm4pOworfQorCisvKiAtLS0tLSBTQ08gaW50ZXJmYWNlIHdpdGggbG93ZXIgbGF5ZXIgKEhDSSkgLS0tLS0gKi8KK3N0YXRpYyBpbnQgc2NvX2Nvbm5lY3RfaW5kKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLCBfX3U4IHR5cGUpCit7CisJQlRfREJHKCJoZGV2ICVzLCBiZGFkZHIgJXMiLCBoZGV2LT5uYW1lLCBiYXRvc3RyKGJkYWRkcikpOworCisJLyogQWx3YXlzIGFjY2VwdCBjb25uZWN0aW9uICovCisJcmV0dXJuIEhDSV9MTV9BQ0NFUFQ7Cit9CisKK3N0YXRpYyBpbnQgc2NvX2Nvbm5lY3RfY2ZtKHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgX191OCBzdGF0dXMpCit7CisJQlRfREJHKCJoY29uICVwIGJkYWRkciAlcyBzdGF0dXMgJWQiLCBoY29uLCBiYXRvc3RyKCZoY29uLT5kc3QpLCBzdGF0dXMpOworCisJaWYgKGhjb24tPnR5cGUgIT0gU0NPX0xJTkspCisJCXJldHVybiAwOworCisJaWYgKCFzdGF0dXMpIHsKKwkJc3RydWN0IHNjb19jb25uICpjb25uOworCisJCWNvbm4gPSBzY29fY29ubl9hZGQoaGNvbiwgc3RhdHVzKTsKKwkJaWYgKGNvbm4pCisJCQlzY29fY29ubl9yZWFkeShjb25uKTsKKwl9IGVsc2UgCisJCXNjb19jb25uX2RlbChoY29uLCBidF9lcnIoc3RhdHVzKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY29fZGlzY29ubl9pbmQoc3RydWN0IGhjaV9jb25uICpoY29uLCBfX3U4IHJlYXNvbikKK3sKKwlCVF9EQkcoImhjb24gJXAgcmVhc29uICVkIiwgaGNvbiwgcmVhc29uKTsKKworCWlmIChoY29uLT50eXBlICE9IFNDT19MSU5LKQorCQlyZXR1cm4gMDsKKworCXNjb19jb25uX2RlbChoY29uLCBidF9lcnIocmVhc29uKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NvX3JlY3Zfc2NvZGF0YShzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNjb19jb25uICpjb25uID0gaGNvbi0+c2NvX2RhdGE7CisKKwlpZiAoIWNvbm4pCisJCWdvdG8gZHJvcDsKKworCUJUX0RCRygiY29ubiAlcCBsZW4gJWQiLCBjb25uLCBza2ItPmxlbik7CisKKwlpZiAoc2tiLT5sZW4pIHsKKwkJc2NvX3JlY3ZfZnJhbWUoY29ubiwgc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCitkcm9wOgorCWtmcmVlX3NrYihza2IpOwkKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLSBQcm9jIGZzIHN1cHBvcnQgLS0tLSAqLworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgdm9pZCAqc2NvX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHNvY2sgKnNrOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCWxvZmZfdCBsID0gKnBvczsKKworCXJlYWRfbG9ja19iaCgmc2NvX3NrX2xpc3QubG9jayk7CisKKwlza19mb3JfZWFjaChzaywgbm9kZSwgJnNjb19za19saXN0LmhlYWQpCisJCWlmICghbC0tKQorCQkJZ290byBmb3VuZDsKKwlzayA9IE5VTEw7Citmb3VuZDoKKwlyZXR1cm4gc2s7Cit9CisKK3N0YXRpYyB2b2lkICpzY29fc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKmUsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBzb2NrICpzayA9IGU7CisJKCpwb3MpKys7CisJcmV0dXJuIHNrX25leHQoc2spOworfQorCitzdGF0aWMgdm9pZCBzY29fc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKmUpCit7CisJcmVhZF91bmxvY2tfYmgoJnNjb19za19saXN0LmxvY2spOworfQorCitzdGF0aWMgaW50ICBzY29fc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKmUpCit7CisJc3RydWN0IHNvY2sgKnNrID0gZTsKKwlzZXFfcHJpbnRmKHNlcSwgIiVzICVzICVkXG4iLAorCQkJYmF0b3N0cigmYnRfc2soc2spLT5zcmMpLCBiYXRvc3RyKCZidF9zayhzayktPmRzdCksIHNrLT5za19zdGF0ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgc2NvX3NlcV9vcHMgPSB7CisJLnN0YXJ0CT0gc2NvX3NlcV9zdGFydCwKKwkubmV4dAk9IHNjb19zZXFfbmV4dCwKKwkuc3RvcAk9IHNjb19zZXFfc3RvcCwKKwkuc2hvdwk9IHNjb19zZXFfc2hvdyAKK307CisKK3N0YXRpYyBpbnQgc2NvX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmc2NvX3NlcV9vcHMpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzY29fc2VxX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHNjb19zZXFfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2NvX3Byb2NfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJzY28iLCBTX0lSVUdPLCBwcm9jX2J0KTsKKwlpZiAoIXApCisJCXJldHVybiAtRU5PTUVNOworCXAtPm93bmVyICAgICA9IFRISVNfTU9EVUxFOworCXAtPnByb2NfZm9wcyA9ICZzY29fc2VxX2ZvcHM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzY29fcHJvY19jbGVhbnVwKHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoInNjbyIsIHByb2NfYnQpOworfQorCisjZWxzZSAvKiBDT05GSUdfUFJPQ19GUyAqLworCitzdGF0aWMgaW50IF9faW5pdCBzY29fcHJvY19pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzY29fcHJvY19jbGVhbnVwKHZvaWQpCit7CisJcmV0dXJuOworfQorI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIHNjb19zb2NrX29wcyA9IHsKKwkuZmFtaWx5CQk9IFBGX0JMVUVUT09USCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnJlbGVhc2UJPSBzY29fc29ja19yZWxlYXNlLAorCS5iaW5kCQk9IHNjb19zb2NrX2JpbmQsCisJLmNvbm5lY3QJPSBzY29fc29ja19jb25uZWN0LAorCS5saXN0ZW4JCT0gc2NvX3NvY2tfbGlzdGVuLAorCS5hY2NlcHQJCT0gc2NvX3NvY2tfYWNjZXB0LAorCS5nZXRuYW1lCT0gc2NvX3NvY2tfZ2V0bmFtZSwKKwkuc2VuZG1zZwk9IHNjb19zb2NrX3NlbmRtc2csCisJLnJlY3Ztc2cJPSBidF9zb2NrX3JlY3Ztc2csCisJLnBvbGwJCT0gYnRfc29ja19wb2xsLAorCS5pb2N0bAkJPSBzb2NrX25vX2lvY3RsLAorCS5tbWFwCQk9IHNvY2tfbm9fbW1hcCwKKwkuc29ja2V0cGFpcgk9IHNvY2tfbm9fc29ja2V0cGFpciwKKwkuc2h1dGRvd24JPSBzb2NrX25vX3NodXRkb3duLAorCS5zZXRzb2Nrb3B0CT0gc2NvX3NvY2tfc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdAk9IHNjb19zb2NrX2dldHNvY2tvcHQKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSBzY29fc29ja19mYW1pbHlfb3BzID0geworCS5mYW1pbHkJPSBQRl9CTFVFVE9PVEgsCisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmNyZWF0ZQk9IHNjb19zb2NrX2NyZWF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGNpX3Byb3RvIHNjb19oY2lfcHJvdG8gPSB7CisJLm5hbWUJCT0gIlNDTyIsCisJLmlkCQk9IEhDSV9QUk9UT19TQ08sCisJLmNvbm5lY3RfaW5kCT0gc2NvX2Nvbm5lY3RfaW5kLAorCS5jb25uZWN0X2NmbQk9IHNjb19jb25uZWN0X2NmbSwKKwkuZGlzY29ubl9pbmQJPSBzY29fZGlzY29ubl9pbmQsCisJLnJlY3Zfc2NvZGF0YQk9IHNjb19yZWN2X3Njb2RhdGEKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNjb19pbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCWVyciA9IHByb3RvX3JlZ2lzdGVyKCZzY29fcHJvdG8sIDApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gYnRfc29ja19yZWdpc3RlcihCVFBST1RPX1NDTywgJnNjb19zb2NrX2ZhbWlseV9vcHMpOworCWlmIChlcnIgPCAwKSB7CisJCUJUX0VSUigiU0NPIHNvY2tldCByZWdpc3RyYXRpb24gZmFpbGVkIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZXJyID0gaGNpX3JlZ2lzdGVyX3Byb3RvKCZzY29faGNpX3Byb3RvKTsKKwlpZiAoZXJyIDwgMCkgeworCQlCVF9FUlIoIlNDTyBwcm90b2NvbCByZWdpc3RyYXRpb24gZmFpbGVkIik7CisJCWJ0X3NvY2tfdW5yZWdpc3RlcihCVFBST1RPX1NDTyk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJc2NvX3Byb2NfaW5pdCgpOworCisJQlRfSU5GTygiU0NPIChWb2ljZSBMaW5rKSB2ZXIgJXMiLCBWRVJTSU9OKTsKKwlCVF9JTkZPKCJTQ08gc29ja2V0IGxheWVyIGluaXRpYWxpemVkIik7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJcHJvdG9fdW5yZWdpc3Rlcigmc2NvX3Byb3RvKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2NvX2V4aXQodm9pZCkKK3sKKwlzY29fcHJvY19jbGVhbnVwKCk7CisKKwlpZiAoYnRfc29ja191bnJlZ2lzdGVyKEJUUFJPVE9fU0NPKSA8IDApCisJCUJUX0VSUigiU0NPIHNvY2tldCB1bnJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKworCWlmIChoY2lfdW5yZWdpc3Rlcl9wcm90bygmc2NvX2hjaV9wcm90bykgPCAwKQorCQlCVF9FUlIoIlNDTyBwcm90b2NvbCB1bnJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKworCXByb3RvX3VucmVnaXN0ZXIoJnNjb19wcm90byk7Cit9CisKK21vZHVsZV9pbml0KHNjb19pbml0KTsKK21vZHVsZV9leGl0KHNjb19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWF4aW0gS3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPiwgTWFyY2VsIEhvbHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCbHVldG9vdGggU0NPIHZlciAiIFZFUlNJT04pOworTU9EVUxFX1ZFUlNJT04oVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImJ0LXByb3RvLTIiKTsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvTWFrZWZpbGUgYi9uZXQvYnJpZGdlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NTU2ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYnJpZGdlL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBJRUVFIDgwMi4xZCBldGhlcm5ldCBicmlkZ2luZyBsYXllci4KKyMKKworb2JqLSQoQ09ORklHX0JSSURHRSkgKz0gYnJpZGdlLm8KKworYnJpZGdlLXkJOj0gYnIubyBicl9kZXZpY2UubyBicl9mZGIubyBicl9mb3J3YXJkLm8gYnJfaWYubyBicl9pbnB1dC5vIFwKKwkJCWJyX2lvY3RsLm8gYnJfbm90aWZ5Lm8gYnJfc3RwLm8gYnJfc3RwX2JwZHUubyBcCisJCQlicl9zdHBfaWYubyBicl9zdHBfdGltZXIubworCiticmlkZ2UtJChDT05GSUdfU1lTRlMpICs9IGJyX3N5c2ZzX2lmLm8gYnJfc3lzZnNfYnIubworCiticmlkZ2UtJChDT05GSUdfQlJJREdFX05FVEZJTFRFUikgKz0gYnJfbmV0ZmlsdGVyLm8KKworb2JqLSQoQ09ORklHX0JSSURHRV9ORl9FQlRBQkxFUykgKz0gbmV0ZmlsdGVyLwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9ici5jIGIvbmV0L2JyaWRnZS9ici5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZjE4NDkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYnJpZGdlL2JyLmMKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqCUdlbmVyaWMgcGFydHMKKyAqCUxpbnV4IGV0aGVybmV0IGJyaWRnZQorICoKKyAqCUF1dGhvcnM6CisgKglMZW5uZXJ0IEJ1eXRlbmhlawkJPGJ1eXRlbmhAZ251Lm9yZz4KKyAqCisgKgkkSWQ6IGJyLmMsdiAxLjQ3IDIwMDEvMTIvMjQgMDA6NTY6NDEgZGF2ZW0gRXhwICQKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgImJyX3ByaXZhdGUuaCIKKworaW50ICgqYnJfc2hvdWxkX3JvdXRlX2hvb2spIChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpID0gTlVMTDsKKworc3RhdGljIGludCBfX2luaXQgYnJfaW5pdCh2b2lkKQoreworCWJyX2ZkYl9pbml0KCk7CisKKyNpZmRlZiBDT05GSUdfQlJJREdFX05FVEZJTFRFUgorCWlmIChicl9uZXRmaWx0ZXJfaW5pdCgpKQorCQlyZXR1cm4gMTsKKyNlbmRpZgorCWJyaW9jdGxfc2V0KGJyX2lvY3RsX2RldmljZWxlc3Nfc3R1Yik7CisJYnJfaGFuZGxlX2ZyYW1lX2hvb2sgPSBicl9oYW5kbGVfZnJhbWU7CisKKwlicl9mZGJfZ2V0X2hvb2sgPSBicl9mZGJfZ2V0OworCWJyX2ZkYl9wdXRfaG9vayA9IGJyX2ZkYl9wdXQ7CisKKwlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmJyX2RldmljZV9ub3RpZmllcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGJyX2RlaW5pdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19CUklER0VfTkVURklMVEVSCisJYnJfbmV0ZmlsdGVyX2ZpbmkoKTsKKyNlbmRpZgorCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZicl9kZXZpY2Vfbm90aWZpZXIpOworCWJyaW9jdGxfc2V0KE5VTEwpOworCisJYnJfY2xlYW51cF9icmlkZ2VzKCk7CisKKwlzeW5jaHJvbml6ZV9uZXQoKTsKKworCWJyX2ZkYl9nZXRfaG9vayA9IE5VTEw7CisJYnJfZmRiX3B1dF9ob29rID0gTlVMTDsKKworCWJyX2hhbmRsZV9mcmFtZV9ob29rID0gTlVMTDsKKwlicl9mZGJfZmluaSgpOworfQorCitFWFBPUlRfU1lNQk9MKGJyX3Nob3VsZF9yb3V0ZV9ob29rKTsKKworbW9kdWxlX2luaXQoYnJfaW5pdCkKK21vZHVsZV9leGl0KGJyX2RlaW5pdCkKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfZGV2aWNlLmMgYi9uZXQvYnJpZGdlL2JyX2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YjcyZmQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYnJpZGdlL2JyX2RldmljZS5jCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICoJRGV2aWNlIGhhbmRsaW5nIGNvZGUKKyAqCUxpbnV4IGV0aGVybmV0IGJyaWRnZQorICoKKyAqCUF1dGhvcnM6CisgKglMZW5uZXJ0IEJ1eXRlbmhlawkJPGJ1eXRlbmhAZ251Lm9yZz4KKyAqCisgKgkkSWQ6IGJyX2RldmljZS5jLHYgMS42IDIwMDEvMTIvMjQgMDA6NTk6NTUgZGF2ZW0gRXhwICQKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgImJyX3ByaXZhdGUuaCIKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpicl9kZXZfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyOworCisJYnIgPSBkZXYtPnByaXY7CisKKwlyZXR1cm4gJmJyLT5zdGF0aXN0aWNzOworfQorCitpbnQgYnJfZGV2X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSBuZXRkZXZfcHJpdihkZXYpOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmRlc3QgPSBza2ItPmRhdGE7CisJc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpkc3Q7CisKKwlici0+c3RhdGlzdGljcy50eF9wYWNrZXRzKys7CisJYnItPnN0YXRpc3RpY3MudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3B1bGwoc2tiLCBFVEhfSExFTik7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKGRlc3RbMF0gJiAxKSAKKwkJYnJfZmxvb2RfZGVsaXZlcihiciwgc2tiLCAwKTsKKwllbHNlIGlmICgoZHN0ID0gX19icl9mZGJfZ2V0KGJyLCBkZXN0KSkgIT0gTlVMTCkKKwkJYnJfZGVsaXZlcihkc3QtPmRzdCwgc2tiKTsKKwllbHNlCisJCWJyX2Zsb29kX2RlbGl2ZXIoYnIsIHNrYiwgMCk7CisKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBicl9kZXZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlicl9zdHBfZW5hYmxlX2JyaWRnZShkZXYtPnByaXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJyX2Rldl9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKK30KKworc3RhdGljIGludCBicl9kZXZfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWJyX3N0cF9kaXNhYmxlX2JyaWRnZShkZXYtPnByaXYpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnJfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlpZiAoKG5ld19tdHUgPCA2OCkgfHwgbmV3X210dSA+IGJyX21pbl9tdHUoZGV2LT5wcml2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXYtPm10dSA9IG5ld19tdHU7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYnJfZGV2X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbWVtc2V0KGRldi0+ZGV2X2FkZHIsIDAsIEVUSF9BTEVOKTsKKworCWV0aGVyX3NldHVwKGRldik7CisKKwlkZXYtPmRvX2lvY3RsID0gYnJfZGV2X2lvY3RsOworCWRldi0+Z2V0X3N0YXRzID0gYnJfZGV2X2dldF9zdGF0czsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGJyX2Rldl94bWl0OworCWRldi0+b3BlbiA9IGJyX2Rldl9vcGVuOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gYnJfZGV2X3NldF9tdWx0aWNhc3RfbGlzdDsKKwlkZXYtPmNoYW5nZV9tdHUgPSBicl9jaGFuZ2VfbXR1OworCWRldi0+ZGVzdHJ1Y3RvciA9IGZyZWVfbmV0ZGV2OworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlkZXYtPnN0b3AgPSBicl9kZXZfc3RvcDsKKwlkZXYtPnR4X3F1ZXVlX2xlbiA9IDA7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBOVUxMOworCWRldi0+cHJpdl9mbGFncyA9IElGRl9FQlJJREdFOworfQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9mZGIuYyBiL25ldC9icmlkZ2UvYnJfZmRiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZjMjIwMAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9icmlkZ2UvYnJfZmRiLmMKQEAgLTAsMCArMSwzNjggQEAKKy8qCisgKglGb3J3YXJkaW5nIGRhdGFiYXNlCisgKglMaW51eCBldGhlcm5ldCBicmlkZ2UKKyAqCisgKglBdXRob3JzOgorICoJTGVubmVydCBCdXl0ZW5oZWsJCTxidXl0ZW5oQGdudS5vcmc+CisgKgorICoJJElkOiBicl9mZGIuYyx2IDEuNiAyMDAyLzAxLzE3IDAwOjU3OjA3IGRhdmVtIEV4cCAkCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgImJyX3ByaXZhdGUuaCIKKworc3RhdGljIGttZW1fY2FjaGVfdCAqYnJfZmRiX2NhY2hlOworc3RhdGljIGludCBmZGJfaW5zZXJ0KHN0cnVjdCBuZXRfYnJpZGdlICpiciwgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqc291cmNlLAorCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyKTsKKwordm9pZCBfX2luaXQgYnJfZmRiX2luaXQodm9pZCkKK3sKKwlicl9mZGJfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiYnJpZGdlX2ZkYl9jYWNoZSIsCisJCQkJCSBzaXplb2Yoc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5KSwKKwkJCQkJIDAsCisJCQkJCSBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwsIE5VTEwpOworfQorCit2b2lkIF9fZXhpdCBicl9mZGJfZmluaSh2b2lkKQoreworCWttZW1fY2FjaGVfZGVzdHJveShicl9mZGJfY2FjaGUpOworfQorCisKKy8qIGlmIHRvcG9sb2d5X2NoYW5naW5nIHRoZW4gdXNlIGZvcndhcmRfZGVsYXkgKGRlZmF1bHQgMTUgc2VjKQorICogb3RoZXJ3aXNlIGtlZXAgbG9uZ2VyIChkZWZhdWx0IDUgbWludXRlcykKKyAqLworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBob2xkX3RpbWUoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyKQoreworCXJldHVybiBici0+dG9wb2xvZ3lfY2hhbmdlID8gYnItPmZvcndhcmRfZGVsYXkgOiBici0+YWdlaW5nX3RpbWU7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBoYXNfZXhwaXJlZChjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCisJCQkJICBjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmZkYikKK3sKKwlyZXR1cm4gIWZkYi0+aXNfc3RhdGljIAorCQkmJiB0aW1lX2JlZm9yZV9lcShmZGItPmFnZWluZ190aW1lciArIGhvbGRfdGltZShiciksIGppZmZpZXMpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgYnJfbWFjX2hhc2goY29uc3QgdW5zaWduZWQgY2hhciAqbWFjKQoreworCXJldHVybiBqaGFzaChtYWMsIEVUSF9BTEVOLCAwKSAmIChCUl9IQVNIX1NJWkUgLSAxKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBmZGJfZGVsZXRlKHN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZikKK3sKKwlobGlzdF9kZWxfcmN1KCZmLT5obGlzdCk7CisJYnJfZmRiX3B1dChmKTsKK30KKwordm9pZCBicl9mZGJfY2hhbmdlYWRkcihzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpuZXdhZGRyKQoreworCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IHAtPmJyOworCWludCBpOworCQorCXNwaW5fbG9ja19iaCgmYnItPmhhc2hfbG9jayk7CisKKwkvKiBTZWFyY2ggYWxsIGNoYWlucyBzaW5jZSBvbGQgYWRkcmVzcy9oYXNoIGlzIHVua25vd24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgQlJfSEFTSF9TSVpFOyBpKyspIHsKKwkJc3RydWN0IGhsaXN0X25vZGUgKmg7CisJCWhsaXN0X2Zvcl9lYWNoKGgsICZici0+aGFzaFtpXSkgeworCQkJc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmOworCisJCQlmID0gaGxpc3RfZW50cnkoaCwgc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5LCBobGlzdCk7CisJCQlpZiAoZi0+ZHN0ID09IHAgJiYgZi0+aXNfbG9jYWwpIHsKKwkJCQkvKiBtYXliZSBhbm90aGVyIHBvcnQgaGFzIHNhbWUgaHcgYWRkcj8gKi8KKwkJCQlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpvcDsKKwkJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wLCAmYnItPnBvcnRfbGlzdCwgbGlzdCkgeworCQkJCQlpZiAob3AgIT0gcCAmJiAKKwkJCQkJICAgICFtZW1jbXAob3AtPmRldi0+ZGV2X2FkZHIsCisJCQkJCQkgICAgZi0+YWRkci5hZGRyLCBFVEhfQUxFTikpIHsKKwkJCQkJCWYtPmRzdCA9IG9wOworCQkJCQkJZ290byBpbnNlcnQ7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvKiBkZWxldGUgb2xkIG9uZSAqLworCQkJCWZkYl9kZWxldGUoZik7CisJCQkJZ290byBpbnNlcnQ7CisJCQl9CisJCX0KKwl9CisgaW5zZXJ0OgorCS8qIGluc2VydCBuZXcgYWRkcmVzcywgIG1heSBmYWlsIGlmIGludmFsaWQgYWRkcmVzcyBvciBkdXAuICovCisJZmRiX2luc2VydChiciwgcCwgbmV3YWRkcik7CisKKwlzcGluX3VubG9ja19iaCgmYnItPmhhc2hfbG9jayk7Cit9CisKK3ZvaWQgYnJfZmRiX2NsZWFudXAodW5zaWduZWQgbG9uZyBfZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSAoc3RydWN0IG5ldF9icmlkZ2UgKilfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRlbGF5ID0gaG9sZF90aW1lKGJyKTsKKwlpbnQgaTsKKworCXNwaW5fbG9ja19iaCgmYnItPmhhc2hfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IEJSX0hBU0hfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZjsKKwkJc3RydWN0IGhsaXN0X25vZGUgKmgsICpuOworCisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZiwgaCwgbiwgJmJyLT5oYXNoW2ldLCBobGlzdCkgeworCQkJaWYgKCFmLT5pc19zdGF0aWMgJiYgCisJCQkgICAgdGltZV9iZWZvcmVfZXEoZi0+YWdlaW5nX3RpbWVyICsgZGVsYXksIGppZmZpZXMpKSAKKwkJCQlmZGJfZGVsZXRlKGYpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2JoKCZici0+aGFzaF9sb2NrKTsKKworCW1vZF90aW1lcigmYnItPmdjX3RpbWVyLCBqaWZmaWVzICsgSFovMTApOworfQorCit2b2lkIGJyX2ZkYl9kZWxldGVfYnlfcG9ydChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApCit7CisJaW50IGk7CisKKwlzcGluX2xvY2tfYmgoJmJyLT5oYXNoX2xvY2spOworCWZvciAoaSA9IDA7IGkgPCBCUl9IQVNIX1NJWkU7IGkrKykgeworCQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqaCwgKmc7CisJCQorCQlobGlzdF9mb3JfZWFjaF9zYWZlKGgsIGcsICZici0+aGFzaFtpXSkgeworCQkJc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmCisJCQkJPSBobGlzdF9lbnRyeShoLCBzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnksIGhsaXN0KTsKKwkJCWlmIChmLT5kc3QgIT0gcCkgCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkgKiBpZiBtdWx0aXBsZSBwb3J0cyBhbGwgaGF2ZSB0aGUgc2FtZSBkZXZpY2UgYWRkcmVzcworCQkJICogdGhlbiB3aGVuIG9uZSBwb3J0IGlzIGRlbGV0ZWQsIGFzc2lnbgorCQkJICogdGhlIGxvY2FsIGVudHJ5IHRvIG90aGVyIHBvcnQKKwkJCSAqLworCQkJaWYgKGYtPmlzX2xvY2FsKSB7CisJCQkJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqb3A7CisJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShvcCwgJmJyLT5wb3J0X2xpc3QsIGxpc3QpIHsKKwkJCQkJaWYgKG9wICE9IHAgJiYgCisJCQkJCSAgICAhbWVtY21wKG9wLT5kZXYtPmRldl9hZGRyLAorCQkJCQkJICAgIGYtPmFkZHIuYWRkciwgRVRIX0FMRU4pKSB7CisJCQkJCQlmLT5kc3QgPSBvcDsKKwkJCQkJCWdvdG8gc2tpcF9kZWxldGU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWZkYl9kZWxldGUoZik7CisJCXNraXBfZGVsZXRlOiA7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJmJyLT5oYXNoX2xvY2spOworfQorCisvKiBObyBsb2NraW5nIG9yIHJlZmNvdW50aW5nLCBhc3N1bWVzIGNhbGxlciBoYXMgbm8gcHJlZW1wdCAocmN1X3JlYWRfbG9jaykgKi8KK3N0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqX19icl9mZGJfZ2V0KHN0cnVjdCBuZXRfYnJpZGdlICpiciwKKwkJCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyKQoreworCXN0cnVjdCBobGlzdF9ub2RlICpoOworCXN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZmRiOworCisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGZkYiwgaCwgJmJyLT5oYXNoW2JyX21hY19oYXNoKGFkZHIpXSwgaGxpc3QpIHsKKwkJaWYgKCFtZW1jbXAoZmRiLT5hZGRyLmFkZHIsIGFkZHIsIEVUSF9BTEVOKSkgeworCQkJaWYgKHVubGlrZWx5KGhhc19leHBpcmVkKGJyLCBmZGIpKSkKKwkJCQlicmVhazsKKwkJCXJldHVybiBmZGI7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogSW50ZXJmYWNlIHVzZWQgYnkgQVRNIGhvb2sgdGhhdCBrZWVwcyBhIHJlZiBjb3VudCAqLworc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpicl9mZGJfZ2V0KHN0cnVjdCBuZXRfYnJpZGdlICpiciwgCisJCQkJCXVuc2lnbmVkIGNoYXIgKmFkZHIpCit7CisJc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmZGI7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJZmRiID0gX19icl9mZGJfZ2V0KGJyLCBhZGRyKTsKKwlpZiAoZmRiKSAKKwkJYXRvbWljX2luYygmZmRiLT51c2VfY291bnQpOworCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiBmZGI7Cit9CisKK3N0YXRpYyB2b2lkIGZkYl9yY3VfZnJlZShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICplbnQKKwkJPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5LCByY3UpOworCWttZW1fY2FjaGVfZnJlZShicl9mZGJfY2FjaGUsIGVudCk7Cit9CisKKy8qIFNldCBlbnRyeSB1cCBmb3IgZGVsZXRpb24gd2l0aCBSQ1UgICovCit2b2lkIGJyX2ZkYl9wdXQoc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICplbnQpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmVudC0+dXNlX2NvdW50KSkKKwkJY2FsbF9yY3UoJmVudC0+cmN1LCBmZGJfcmN1X2ZyZWUpOworfQorCisvKgorICogRmlsbCBidWZmZXIgd2l0aCBmb3J3YXJkaW5nIHRhYmxlIHJlY29yZHMgaW4gCisgKiB0aGUgQVBJIGZvcm1hdC4KKyAqLworaW50IGJyX2ZkYl9maWxsYnVmKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgdm9pZCAqYnVmLAorCQkgICB1bnNpZ25lZCBsb25nIG1heG51bSwgdW5zaWduZWQgbG9uZyBza2lwKQoreworCXN0cnVjdCBfX2ZkYl9lbnRyeSAqZmUgPSBidWY7CisJaW50IGksIG51bSA9IDA7CisJc3RydWN0IGhsaXN0X25vZGUgKmg7CisJc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmOworCisJbWVtc2V0KGJ1ZiwgMCwgbWF4bnVtKnNpemVvZihzdHJ1Y3QgX19mZGJfZW50cnkpKTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlmb3IgKGkgPSAwOyBpIDwgQlJfSEFTSF9TSVpFOyBpKyspIHsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGYsIGgsICZici0+aGFzaFtpXSwgaGxpc3QpIHsKKwkJCWlmIChudW0gPj0gbWF4bnVtKQorCQkJCWdvdG8gb3V0OworCisJCQlpZiAoaGFzX2V4cGlyZWQoYnIsIGYpKSAKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHNraXApIHsKKwkJCQktLXNraXA7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIGNvbnZlcnQgZnJvbSBpbnRlcm5hbCBmb3JtYXQgdG8gQVBJICovCisJCQltZW1jcHkoZmUtPm1hY19hZGRyLCBmLT5hZGRyLmFkZHIsIEVUSF9BTEVOKTsKKwkJCWZlLT5wb3J0X25vID0gZi0+ZHN0LT5wb3J0X25vOworCQkJZmUtPmlzX2xvY2FsID0gZi0+aXNfbG9jYWw7CisJCQlpZiAoIWYtPmlzX3N0YXRpYykKKwkJCQlmZS0+YWdlaW5nX3RpbWVyX3ZhbHVlID0gamlmZmllc190b19jbG9ja190KGppZmZpZXMgLSBmLT5hZ2VpbmdfdGltZXIpOworCQkJKytmZTsKKwkJCSsrbnVtOworCQl9CisJfQorCisgb3V0OgorCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIG51bTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmZkYl9maW5kKHN0cnVjdCBobGlzdF9oZWFkICpoZWFkLAorCQkJCQkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIpCit7CisJc3RydWN0IGhsaXN0X25vZGUgKmg7CisJc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmZGI7CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZmRiLCBoLCBoZWFkLCBobGlzdCkgeworCQlpZiAoIW1lbWNtcChmZGItPmFkZHIuYWRkciwgYWRkciwgRVRIX0FMRU4pKQorCQkJcmV0dXJuIGZkYjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmZkYl9jcmVhdGUoc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQsCisJCQkJCSAgICAgICBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpzb3VyY2UsCisJCQkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyLCAKKwkJCQkJICAgICAgIGludCBpc19sb2NhbCkKK3sKKwlzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmZkYjsKKworCWZkYiA9IGttZW1fY2FjaGVfYWxsb2MoYnJfZmRiX2NhY2hlLCBHRlBfQVRPTUlDKTsKKwlpZiAoZmRiKSB7CisJCW1lbWNweShmZGItPmFkZHIuYWRkciwgYWRkciwgRVRIX0FMRU4pOworCQlhdG9taWNfc2V0KCZmZGItPnVzZV9jb3VudCwgMSk7CisJCWhsaXN0X2FkZF9oZWFkX3JjdSgmZmRiLT5obGlzdCwgaGVhZCk7CisKKwkJZmRiLT5kc3QgPSBzb3VyY2U7CisJCWZkYi0+aXNfbG9jYWwgPSBpc19sb2NhbDsKKwkJZmRiLT5pc19zdGF0aWMgPSBpc19sb2NhbDsKKwkJZmRiLT5hZ2VpbmdfdGltZXIgPSBqaWZmaWVzOworCX0KKwlyZXR1cm4gZmRiOworfQorCitzdGF0aWMgaW50IGZkYl9pbnNlcnQoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpzb3VyY2UsCisJCSAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkcikKK3sKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCA9ICZici0+aGFzaFticl9tYWNfaGFzaChhZGRyKV07CisJc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmZGI7CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkcikpCisJCXJldHVybiAtRUlOVkFMOworCisJZmRiID0gZmRiX2ZpbmQoaGVhZCwgYWRkcik7CisJaWYgKGZkYikgeworCQkvKiBpdCBpcyBva2F5IHRvIGhhdmUgbXVsdGlwbGUgcG9ydHMgd2l0aCBzYW1lIAorCQkgKiBhZGRyZXNzLCBqdXN0IHVzZSB0aGUgZmlyc3Qgb25lLgorCQkgKi8KKwkJaWYgKGZkYi0+aXNfbG9jYWwpIAorCQkJcmV0dXJuIDA7CisKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgYWRkaW5nIGludGVyZmFjZSB3aXRoIHNhbWUgYWRkcmVzcyAiCisJCSAgICAgICAiYXMgYSByZWNlaXZlZCBwYWNrZXRcbiIsCisJCSAgICAgICBzb3VyY2UtPmRldi0+bmFtZSk7CisJCWZkYl9kZWxldGUoZmRiKTsKKyAJfQorCisJaWYgKCFmZGJfY3JlYXRlKGhlYWQsIHNvdXJjZSwgYWRkciwgMSkpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBicl9mZGJfaW5zZXJ0KHN0cnVjdCBuZXRfYnJpZGdlICpiciwgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqc291cmNlLAorCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIpCit7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19iaCgmYnItPmhhc2hfbG9jayk7CisJcmV0ID0gZmRiX2luc2VydChiciwgc291cmNlLCBhZGRyKTsKKwlzcGluX3VubG9ja19iaCgmYnItPmhhc2hfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBicl9mZGJfdXBkYXRlKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqc291cmNlLAorCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyKQoreworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkID0gJmJyLT5oYXNoW2JyX21hY19oYXNoKGFkZHIpXTsKKwlzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmZkYjsKKworCS8qIHNvbWUgdXNlcnMgd2FudCB0byBhbHdheXMgZmxvb2QuICovCisJaWYgKGhvbGRfdGltZShicikgPT0gMCkKKwkJcmV0dXJuOworCisJcmN1X3JlYWRfbG9jaygpOworCWZkYiA9IGZkYl9maW5kKGhlYWQsIGFkZHIpOworCWlmIChsaWtlbHkoZmRiKSkgeworCQkvKiBhdHRlbXB0IHRvIHVwZGF0ZSBhbiBlbnRyeSBmb3IgYSBsb2NhbCBpbnRlcmZhY2UgKi8KKwkJaWYgKHVubGlrZWx5KGZkYi0+aXNfbG9jYWwpKSB7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKSAKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcmVjZWl2ZWQgcGFja2V0IHdpdGggIgorCQkJCSAgICAgICAiIG93biBhZGRyZXNzIGFzIHNvdXJjZSBhZGRyZXNzXG4iLAorCQkJCSAgICAgICBzb3VyY2UtPmRldi0+bmFtZSk7CisJCX0gZWxzZSB7CisJCQkvKiBmYXN0cGF0aDogdXBkYXRlIG9mIGV4aXN0aW5nIGVudHJ5ICovCisJCQlmZGItPmRzdCA9IHNvdXJjZTsKKwkJCWZkYi0+YWdlaW5nX3RpbWVyID0gamlmZmllczsKKwkJfQorCX0gZWxzZSB7CisJCXNwaW5fbG9ja19iaCgmYnItPmhhc2hfbG9jayk7CisJCWlmICghZmRiX2ZpbmQoaGVhZCwgYWRkcikpCisJCQlmZGJfY3JlYXRlKGhlYWQsIHNvdXJjZSwgYWRkciwgMCk7CisJCS8qIGVsc2UgIHdlIGxvc2UgcmFjZSBhbmQgc29tZW9uZSBlbHNlIGluc2VydHMKKwkJICogaXQgZmlyc3QsIGRvbid0IGJvdGhlciB1cGRhdGluZworCQkgKi8KKwkJc3Bpbl91bmxvY2tfYmgoJmJyLT5oYXNoX2xvY2spOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKK30KZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfZm9yd2FyZC5jIGIvbmV0L2JyaWRnZS9icl9mb3J3YXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY5ZjIwOQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9icmlkZ2UvYnJfZm9yd2FyZC5jCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICoJRm9yd2FyZGluZyBkZWNpc2lvbgorICoJTGludXggZXRoZXJuZXQgYnJpZGdlCisgKgorICoJQXV0aG9yczoKKyAqCUxlbm5lcnQgQnV5dGVuaGVrCQk8YnV5dGVuaEBnbnUub3JnPgorICoKKyAqCSRJZDogYnJfZm9yd2FyZC5jLHYgMS40IDIwMDEvMDgvMTQgMjI6MDU6NTcgZGF2ZW0gRXhwICQKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlLmg+CisjaW5jbHVkZSAiYnJfcHJpdmF0ZS5oIgorCitzdGF0aWMgaW5saW5lIGludCBzaG91bGRfZGVsaXZlcihjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCAKKwkJCQkgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAoc2tiLT5kZXYgPT0gcC0+ZGV2IHx8CisJICAgIHAtPnN0YXRlICE9IEJSX1NUQVRFX0ZPUldBUkRJTkcpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBicl9kZXZfcXVldWVfcHVzaF94bWl0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKHNrYi0+bGVuID4gc2tiLT5kZXYtPm10dSkgCisJCWtmcmVlX3NrYihza2IpOworCWVsc2UgeworI2lmZGVmIENPTkZJR19CUklER0VfTkVURklMVEVSCisJCS8qIGlwX3JlZnJhZyBjYWxscyBpcF9mcmFnbWVudCwgZG9lc24ndCBjb3B5IHRoZSBNQUMgaGVhZGVyLiAqLworCQluZl9icmlkZ2VfbWF5YmVfY29weV9oZWFkZXIoc2tiKTsKKyNlbmRpZgorCQlza2JfcHVzaChza2IsIEVUSF9ITEVOKTsKKworCQlkZXZfcXVldWVfeG1pdChza2IpOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgYnJfZm9yd2FyZF9maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlORl9IT09LKFBGX0JSSURHRSwgTkZfQlJfUE9TVF9ST1VUSU5HLCBza2IsIE5VTEwsIHNrYi0+ZGV2LAorCQkJYnJfZGV2X3F1ZXVlX3B1c2hfeG1pdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19icl9kZWxpdmVyKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnRvLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNrYi0+ZGV2ID0gdG8tPmRldjsKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCisJc2tiLT5uZl9kZWJ1ZyA9IDA7CisjZW5kaWYKKwlORl9IT09LKFBGX0JSSURHRSwgTkZfQlJfTE9DQUxfT1VULCBza2IsIE5VTEwsIHNrYi0+ZGV2LAorCQkJYnJfZm9yd2FyZF9maW5pc2gpOworfQorCitzdGF0aWMgdm9pZCBfX2JyX2ZvcndhcmQoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqdG8sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmluZGV2OworCisJaW5kZXYgPSBza2ItPmRldjsKKwlza2ItPmRldiA9IHRvLT5kZXY7CisJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCisJTkZfSE9PSyhQRl9CUklER0UsIE5GX0JSX0ZPUldBUkQsIHNrYiwgaW5kZXYsIHNrYi0+ZGV2LAorCQkJYnJfZm9yd2FyZF9maW5pc2gpOworfQorCisvKiBjYWxsZWQgd2l0aCByY3VfcmVhZF9sb2NrICovCit2b2lkIGJyX2RlbGl2ZXIoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqdG8sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKHNob3VsZF9kZWxpdmVyKHRvLCBza2IpKSB7CisJCV9fYnJfZGVsaXZlcih0bywgc2tiKTsKKwkJcmV0dXJuOworCX0KKworCWtmcmVlX3NrYihza2IpOworfQorCisvKiBjYWxsZWQgd2l0aCByY3VfcmVhZF9sb2NrICovCit2b2lkIGJyX2ZvcndhcmQoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqdG8sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKHNob3VsZF9kZWxpdmVyKHRvLCBza2IpKSB7CisJCV9fYnJfZm9yd2FyZCh0bywgc2tiKTsKKwkJcmV0dXJuOworCX0KKworCWtmcmVlX3NrYihza2IpOworfQorCisvKiBjYWxsZWQgdW5kZXIgYnJpZGdlIGxvY2sgKi8KK3N0YXRpYyB2b2lkIGJyX2Zsb29kKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGNsb25lLAorCXZvaWQgKCpfX3BhY2tldF9ob29rKShjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCAKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpKQoreworCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnA7CisJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcHJldjsKKworCWlmIChjbG9uZSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKKworCQlpZiAoKHNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgeworCQkJYnItPnN0YXRpc3RpY3MudHhfZHJvcHBlZCsrOworCQkJcmV0dXJuOworCQl9CisKKwkJc2tiID0gc2tiMjsKKwl9CisKKwlwcmV2ID0gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHAsICZici0+cG9ydF9saXN0LCBsaXN0KSB7CisJCWlmIChzaG91bGRfZGVsaXZlcihwLCBza2IpKSB7CisJCQlpZiAocHJldiAhPSBOVUxMKSB7CisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjI7CisKKwkJCQlpZiAoKHNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgeworCQkJCQlici0+c3RhdGlzdGljcy50eF9kcm9wcGVkKys7CisJCQkJCWtmcmVlX3NrYihza2IpOworCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQkJX19wYWNrZXRfaG9vayhwcmV2LCBza2IyKTsKKwkJCX0KKworCQkJcHJldiA9IHA7CisJCX0KKwl9CisKKwlpZiAocHJldiAhPSBOVUxMKSB7CisJCV9fcGFja2V0X2hvb2socHJldiwgc2tiKTsKKwkJcmV0dXJuOworCX0KKworCWtmcmVlX3NrYihza2IpOworfQorCisKKy8qIGNhbGxlZCB3aXRoIHJjdV9yZWFkX2xvY2sgKi8KK3ZvaWQgYnJfZmxvb2RfZGVsaXZlcihzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHN0cnVjdCBza19idWZmICpza2IsIGludCBjbG9uZSkKK3sKKwlicl9mbG9vZChiciwgc2tiLCBjbG9uZSwgX19icl9kZWxpdmVyKTsKK30KKworLyogY2FsbGVkIHVuZGVyIGJyaWRnZSBsb2NrICovCit2b2lkIGJyX2Zsb29kX2ZvcndhcmQoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgY2xvbmUpCit7CisJYnJfZmxvb2QoYnIsIHNrYiwgY2xvbmUsIF9fYnJfZm9yd2FyZCk7Cit9CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2lmLmMgYi9uZXQvYnJpZGdlL2JyX2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk4NzJiZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9icmlkZ2UvYnJfaWYuYwpAQCAtMCwwICsxLDM4OCBAQAorLyoKKyAqCVVzZXJzcGFjZSBpbnRlcmZhY2UKKyAqCUxpbnV4IGV0aGVybmV0IGJyaWRnZQorICoKKyAqCUF1dGhvcnM6CisgKglMZW5uZXJ0IEJ1eXRlbmhlawkJPGJ1eXRlbmhAZ251Lm9yZz4KKyAqCisgKgkkSWQ6IGJyX2lmLmMsdiAxLjcgMjAwMS8xMi8yNCAwMDo1OTo1NSBkYXZlbSBFeHAgJAorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2luY2x1ZGUgImJyX3ByaXZhdGUuaCIKKworLyoKKyAqIERldGVybWluZSBpbml0aWFsIHBhdGggY29zdCBiYXNlZCBvbiBzcGVlZC4KKyAqIHVzaW5nIHJlY29tbWVuZGF0aW9ucyBmcm9tIDgwMi4xZCBzdGFuZGFyZAorICoKKyAqIE5lZWQgdG8gc2ltdWxhdGUgdXNlciBpb2N0bCBiZWNhdXNlIG5vdCBhbGwgZGV2aWNlJ3MgdGhhdCBzdXBwb3J0CisgKiBldGh0b29sLCB1c2UgZXRodG9vbF9vcHMuICBBbHNvLCBzaW5jZSBkcml2ZXIgbWlnaHQgc2xlZXAgbmVlZCB0bworICogbm90IGJlIGhvbGRpbmcgYW55IGxvY2tzLgorICovCitzdGF0aWMgaW50IGJyX2luaXRpYWxfcG9ydF9jb3N0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKwlzdHJ1Y3QgZXRodG9vbF9jbWQgZWNtZCA9IHsgRVRIVE9PTF9HU0VUIH07CisJc3RydWN0IGlmcmVxIGlmcjsKKwltbV9zZWdtZW50X3Qgb2xkX2ZzOworCWludCBlcnI7CisKKwlzdHJuY3B5KGlmci5pZnJfbmFtZSwgZGV2LT5uYW1lLCBJRk5BTVNJWik7CisJaWZyLmlmcl9kYXRhID0gKHZvaWQgX191c2VyICopICZlY21kOworCisJb2xkX2ZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKEtFUk5FTF9EUyk7CisJZXJyID0gZGV2X2V0aHRvb2woJmlmcik7CisJc2V0X2ZzKG9sZF9mcyk7CisJCisJaWYgKCFlcnIpIHsKKwkJc3dpdGNoKGVjbWQuc3BlZWQpIHsKKwkJY2FzZSBTUEVFRF8xMDA6CisJCQlyZXR1cm4gMTk7CisJCWNhc2UgU1BFRURfMTAwMDoKKwkJCXJldHVybiA0OworCQljYXNlIFNQRUVEXzEwMDAwOgorCQkJcmV0dXJuIDI7CisJCWNhc2UgU1BFRURfMTA6CisJCQlyZXR1cm4gMTAwOworCQlkZWZhdWx0OgorCQkJcHJfaW5mbygiYnJpZGdlOiBjYW4ndCBkZWNvZGUgc3BlZWQgZnJvbSAlczogJWRcbiIsCisJCQkJZGV2LT5uYW1lLCBlY21kLnNwZWVkKTsKKwkJCXJldHVybiAxMDA7CisJCX0KKwl9CisKKwkvKiBPbGQgc2lsbHkgaGV1cmlzdGljcyBiYXNlZCBvbiBuYW1lICovCisJaWYgKCFzdHJuY21wKGRldi0+bmFtZSwgImxlYyIsIDMpKQorCQlyZXR1cm4gNzsKKworCWlmICghc3RybmNtcChkZXYtPm5hbWUsICJwbGlwIiwgNCkpCisJCXJldHVybiAyNTAwOworCisJcmV0dXJuIDEwMDsJLyogYXNzdW1lIG9sZCAxME1icHMgKi8KK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9uYnAoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcC0+ZGV2OworCisJZGV2LT5icl9wb3J0ID0gTlVMTDsKKwlwLT5iciA9IE5VTEw7CisJcC0+ZGV2ID0gTlVMTDsKKwlkZXZfcHV0KGRldik7CisKKwlicl9zeXNmc19mcmVlaWYocCk7Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfbmJwX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCA9CisJCQljb250YWluZXJfb2YoaGVhZCwgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCwgcmN1KTsKKwlkZXN0cm95X25icChwKTsKK30KKworLyogY2FsbGVkIHdpdGggUlROTCAqLworc3RhdGljIHZvaWQgZGVsX25icChzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKQoreworCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IHAtPmJyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwLT5kZXY7CisKKwlkZXZfc2V0X3Byb21pc2N1aXR5KGRldiwgLTEpOworCisJc3Bpbl9sb2NrX2JoKCZici0+bG9jayk7CisJYnJfc3RwX2Rpc2FibGVfcG9ydChwKTsKKwlzcGluX3VubG9ja19iaCgmYnItPmxvY2spOworCisJYnJfZmRiX2RlbGV0ZV9ieV9wb3J0KGJyLCBwKTsKKworCWxpc3RfZGVsX3JjdSgmcC0+bGlzdCk7CisKKwlkZWxfdGltZXJfc3luYygmcC0+bWVzc2FnZV9hZ2VfdGltZXIpOworCWRlbF90aW1lcl9zeW5jKCZwLT5mb3J3YXJkX2RlbGF5X3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmcC0+aG9sZF90aW1lcik7CisJCisJY2FsbF9yY3UoJnAtPnJjdSwgZGVzdHJveV9uYnBfcmN1KTsKK30KKworLyogY2FsbGVkIHdpdGggUlROTCAqLworc3RhdGljIHZvaWQgZGVsX2JyKHN0cnVjdCBuZXRfYnJpZGdlICpicikKK3sKKwlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCAqbjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwLCBuLCAmYnItPnBvcnRfbGlzdCwgbGlzdCkgeworCQlicl9zeXNmc19yZW1vdmVpZihwKTsKKwkJZGVsX25icChwKTsKKwl9CisKKwlkZWxfdGltZXJfc3luYygmYnItPmdjX3RpbWVyKTsKKworCWJyX3N5c2ZzX2RlbGJyKGJyLT5kZXYpOworIAl1bnJlZ2lzdGVyX25ldGRldmljZShici0+ZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpuZXdfYnJpZGdlX2Rldihjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBuZXRfYnJpZGdlICpicjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2JyaWRnZSksIG5hbWUsCisJCQkgICBicl9kZXZfc2V0dXApOworCQorCWlmICghZGV2KQorCQlyZXR1cm4gTlVMTDsKKworCWJyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlici0+ZGV2ID0gZGV2OworCisJc3Bpbl9sb2NrX2luaXQoJmJyLT5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmYnItPnBvcnRfbGlzdCk7CisJc3Bpbl9sb2NrX2luaXQoJmJyLT5oYXNoX2xvY2spOworCisJYnItPmJyaWRnZV9pZC5wcmlvWzBdID0gMHg4MDsKKwlici0+YnJpZGdlX2lkLnByaW9bMV0gPSAweDAwOworCW1lbXNldChici0+YnJpZGdlX2lkLmFkZHIsIDAsIEVUSF9BTEVOKTsKKworCWJyLT5zdHBfZW5hYmxlZCA9IDA7CisJYnItPmRlc2lnbmF0ZWRfcm9vdCA9IGJyLT5icmlkZ2VfaWQ7CisJYnItPnJvb3RfcGF0aF9jb3N0ID0gMDsKKwlici0+cm9vdF9wb3J0ID0gMDsKKwlici0+YnJpZGdlX21heF9hZ2UgPSBici0+bWF4X2FnZSA9IDIwICogSFo7CisJYnItPmJyaWRnZV9oZWxsb190aW1lID0gYnItPmhlbGxvX3RpbWUgPSAyICogSFo7CisJYnItPmJyaWRnZV9mb3J3YXJkX2RlbGF5ID0gYnItPmZvcndhcmRfZGVsYXkgPSAxNSAqIEhaOworCWJyLT50b3BvbG9neV9jaGFuZ2UgPSAwOworCWJyLT50b3BvbG9neV9jaGFuZ2VfZGV0ZWN0ZWQgPSAwOworCWJyLT5hZ2VpbmdfdGltZSA9IDMwMCAqIEhaOworCUlOSVRfTElTVF9IRUFEKCZici0+YWdlX2xpc3QpOworCisJYnJfc3RwX3RpbWVyX2luaXQoYnIpOworCisJcmV0dXJuIGRldjsKK30KKworLyogZmluZCBhbiBhdmFpbGFibGUgcG9ydCBudW1iZXIgKi8KK3N0YXRpYyBpbnQgZmluZF9wb3J0bm8oc3RydWN0IG5ldF9icmlkZ2UgKmJyKQoreworCWludCBpbmRleDsKKwlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwOworCXVuc2lnbmVkIGxvbmcgKmludXNlOworCisJaW51c2UgPSBrbWFsbG9jKEJJVFNfVE9fTE9OR1MoQlJfTUFYX1BPUlRTKSpzaXplb2YodW5zaWduZWQgbG9uZyksCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWludXNlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChpbnVzZSwgMCwgQklUU19UT19MT05HUyhCUl9NQVhfUE9SVFMpKnNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJc2V0X2JpdCgwLCBpbnVzZSk7CS8qIHplcm8gaXMgcmVzZXJ2ZWQgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZici0+cG9ydF9saXN0LCBsaXN0KSB7CisJCXNldF9iaXQocC0+cG9ydF9ubywgaW51c2UpOworCX0KKwlpbmRleCA9IGZpbmRfZmlyc3RfemVyb19iaXQoaW51c2UsIEJSX01BWF9QT1JUUyk7CisJa2ZyZWUoaW51c2UpOworCisJcmV0dXJuIChpbmRleCA+PSBCUl9NQVhfUE9SVFMpID8gLUVYRlVMTCA6IGluZGV4OworfQorCisvKiBjYWxsZWQgd2l0aCBSVE5MICovCitzdGF0aWMgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqbmV3X25icChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIAorCQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGNvc3QpCit7CisJaW50IGluZGV4OworCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnA7CisJCisJaW5kZXggPSBmaW5kX3BvcnRubyhicik7CisJaWYgKGluZGV4IDwgMCkKKwkJcmV0dXJuIEVSUl9QVFIoaW5kZXgpOworCisJcCA9IGttYWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7CisJcC0+YnIgPSBicjsKKwlkZXZfaG9sZChkZXYpOworCXAtPmRldiA9IGRldjsKKwlwLT5wYXRoX2Nvc3QgPSBjb3N0OworIAlwLT5wcmlvcml0eSA9IDB4ODAwMCA+PiBCUl9QT1JUX0JJVFM7CisJZGV2LT5icl9wb3J0ID0gcDsKKwlwLT5wb3J0X25vID0gaW5kZXg7CisJYnJfaW5pdF9wb3J0KHApOworCXAtPnN0YXRlID0gQlJfU1RBVEVfRElTQUJMRUQ7CisJa29iamVjdF9pbml0KCZwLT5rb2JqKTsKKworCXJldHVybiBwOworfQorCitpbnQgYnJfYWRkX2JyaWRnZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IHJldDsKKworCWRldiA9IG5ld19icmlkZ2VfZGV2KG5hbWUpOworCWlmICghZGV2KSAKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlydG5sX2xvY2soKTsKKwlpZiAoc3RyY2hyKGRldi0+bmFtZSwgJyUnKSkgeworCQlyZXQgPSBkZXZfYWxsb2NfbmFtZShkZXYsIGRldi0+bmFtZSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnIxOworCX0KKworCXJldCA9IHJlZ2lzdGVyX25ldGRldmljZShkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyMjsKKworCS8qIG5ldHdvcmsgZGV2aWNlIGtvYmplY3QgaXMgbm90IHNldHVwIHVudGlsCisJICogYWZ0ZXIgcnRubF91bmxvY2sgZG9lcyBpdCdzIGhvdHBsdWcgbWFnaWMuCisJICogc28gaG9sZCByZWZlcmVuY2UgdG8gYXZvaWQgcmFjZS4KKwkgKi8KKwlkZXZfaG9sZChkZXYpOworCXJ0bmxfdW5sb2NrKCk7CisKKwlyZXQgPSBicl9zeXNmc19hZGRicihkZXYpOworCWRldl9wdXQoZGV2KTsKKworCWlmIChyZXQpIAorCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworIG91dDoKKwlyZXR1cm4gcmV0OworCisgZXJyMjoKKwlmcmVlX25ldGRldihkZXYpOworIGVycjE6CisJcnRubF91bmxvY2soKTsKKwlnb3RvIG91dDsKK30KKworaW50IGJyX2RlbF9icmlkZ2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCByZXQgPSAwOworCisJcnRubF9sb2NrKCk7CisJZGV2ID0gX19kZXZfZ2V0X2J5X25hbWUobmFtZSk7CisJaWYgKGRldiA9PSBOVUxMKSAKKwkJcmV0ID0gIC1FTlhJTzsgCS8qIENvdWxkIG5vdCBmaW5kIGRldmljZSAqLworCisJZWxzZSBpZiAoIShkZXYtPnByaXZfZmxhZ3MgJiBJRkZfRUJSSURHRSkpIHsKKwkJLyogQXR0ZW1wdCB0byBkZWxldGUgbm9uIGJyaWRnZSBkZXZpY2UhICovCisJCXJldCA9IC1FUEVSTTsKKwl9CisKKwllbHNlIGlmIChkZXYtPmZsYWdzICYgSUZGX1VQKSB7CisJCS8qIE5vdCBzaHV0ZG93biB5ZXQuICovCisJCXJldCA9IC1FQlVTWTsKKwl9IAorCisJZWxzZSAKKwkJZGVsX2JyKG5ldGRldl9wcml2KGRldikpOworCisJcnRubF91bmxvY2soKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBNdHUgb2YgdGhlIGJyaWRnZSBwc2V1ZG8tZGV2aWNlIDE1MDAgb3IgdGhlIG1pbmltdW0gb2YgdGhlIHBvcnRzICovCitpbnQgYnJfbWluX210dShjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIpCit7CisJY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcDsKKwlpbnQgbXR1ID0gMDsKKworCUFTU0VSVF9SVE5MKCk7CisKKwlpZiAobGlzdF9lbXB0eSgmYnItPnBvcnRfbGlzdCkpCisJCW10dSA9IDE1MDA7CisJZWxzZSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmJyLT5wb3J0X2xpc3QsIGxpc3QpIHsKKwkJCWlmICghbXR1ICB8fCBwLT5kZXYtPm10dSA8IG10dSkKKwkJCQltdHUgPSBwLT5kZXYtPm10dTsKKwkJfQorCX0KKwlyZXR1cm4gbXR1OworfQorCisvKiBjYWxsZWQgd2l0aCBSVE5MICovCitpbnQgYnJfYWRkX2lmKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwOworCWludCBlcnIgPSAwOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0sgfHwgZGV2LT50eXBlICE9IEFSUEhSRF9FVEhFUikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZGV2LT5oYXJkX3N0YXJ0X3htaXQgPT0gYnJfZGV2X3htaXQpCisJCXJldHVybiAtRUxPT1A7CisKKwlpZiAoZGV2LT5icl9wb3J0ICE9IE5VTEwpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoSVNfRVJSKHAgPSBuZXdfbmJwKGJyLCBkZXYsIGJyX2luaXRpYWxfcG9ydF9jb3N0KGRldikpKSkKKwkJcmV0dXJuIFBUUl9FUlIocCk7CisKKyAJaWYgKChlcnIgPSBicl9mZGJfaW5zZXJ0KGJyLCBwLCBkZXYtPmRldl9hZGRyKSkpCisJCWRlc3Ryb3lfbmJwKHApOworIAorCWVsc2UgaWYgKChlcnIgPSBicl9zeXNmc19hZGRpZihwKSkpCisJCWRlbF9uYnAocCk7CisJZWxzZSB7CisJCWRldl9zZXRfcHJvbWlzY3VpdHkoZGV2LCAxKTsKKworCQlsaXN0X2FkZF9yY3UoJnAtPmxpc3QsICZici0+cG9ydF9saXN0KTsKKworCQlzcGluX2xvY2tfYmgoJmJyLT5sb2NrKTsKKwkJYnJfc3RwX3JlY2FsY3VsYXRlX2JyaWRnZV9pZChicik7CisJCWlmICgoYnItPmRldi0+ZmxhZ3MgJiBJRkZfVVApIAorCQkgICAgJiYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApICYmIG5ldGlmX2NhcnJpZXJfb2soZGV2KSkKKwkJCWJyX3N0cF9lbmFibGVfcG9ydChwKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmJyLT5sb2NrKTsKKworCQlkZXZfc2V0X210dShici0+ZGV2LCBicl9taW5fbXR1KGJyKSk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyogY2FsbGVkIHdpdGggUlROTCAqLworaW50IGJyX2RlbF9pZihzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCA9IGRldi0+YnJfcG9ydDsKKwkKKwlpZiAoIXAgfHwgcC0+YnIgIT0gYnIpIAorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJyX3N5c2ZzX3JlbW92ZWlmKHApOworCWRlbF9uYnAocCk7CisKKwlzcGluX2xvY2tfYmgoJmJyLT5sb2NrKTsKKwlicl9zdHBfcmVjYWxjdWxhdGVfYnJpZGdlX2lkKGJyKTsKKwlzcGluX3VubG9ja19iaCgmYnItPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19leGl0IGJyX2NsZWFudXBfYnJpZGdlcyh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsICpueHQ7CisKKwlydG5sX2xvY2soKTsKKwlmb3IgKGRldiA9IGRldl9iYXNlOyBkZXY7IGRldiA9IG54dCkgeworCQlueHQgPSBkZXYtPm5leHQ7CisJCWlmIChkZXYtPnByaXZfZmxhZ3MgJiBJRkZfRUJSSURHRSkKKwkJCWRlbF9icihkZXYtPnByaXYpOworCX0KKwlydG5sX3VubG9jaygpOworCit9CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2lucHV0LmMgYi9uZXQvYnJpZGdlL2JyX2lucHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIxY2NlNAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9icmlkZ2UvYnJfaW5wdXQuYwpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqCUhhbmRsZSBpbmNvbWluZyBmcmFtZXMKKyAqCUxpbnV4IGV0aGVybmV0IGJyaWRnZQorICoKKyAqCUF1dGhvcnM6CisgKglMZW5uZXJ0IEJ1eXRlbmhlawkJPGJ1eXRlbmhAZ251Lm9yZz4KKyAqCisgKgkkSWQ6IGJyX2lucHV0LmMsdiAxLjEwIDIwMDEvMTIvMjQgMDQ6NTA6MjAgZGF2ZW0gRXhwICQKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UuaD4KKyNpbmNsdWRlICJicl9wcml2YXRlLmgiCisKK2NvbnN0IHVuc2lnbmVkIGNoYXIgYnJpZGdlX3VsYVs2XSA9IHsgMHgwMSwgMHg4MCwgMHhjMiwgMHgwMCwgMHgwMCwgMHgwMCB9OworCitzdGF0aWMgaW50IGJyX3Bhc3NfZnJhbWVfdXBfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IpCit7CisjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRworCXNrYi0+bmZfZGVidWcgPSAwOworI2VuZGlmCisJbmV0aWZfcngoc2tiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBicl9wYXNzX2ZyYW1lX3VwKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqaW5kZXY7CisKKwlici0+c3RhdGlzdGljcy5yeF9wYWNrZXRzKys7CisJYnItPnN0YXRpc3RpY3MucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwlpbmRldiA9IHNrYi0+ZGV2OworCXNrYi0+ZGV2ID0gYnItPmRldjsKKworCU5GX0hPT0soUEZfQlJJREdFLCBORl9CUl9MT0NBTF9JTiwgc2tiLCBpbmRldiwgTlVMTCwKKwkJCWJyX3Bhc3NfZnJhbWVfdXBfZmluaXNoKTsKK30KKworLyogbm90ZTogYWxyZWFkeSBjYWxsZWQgd2l0aCByY3VfcmVhZF9sb2NrIChwcmVlbXB0X2Rpc2FibGVkKSAqLworaW50IGJyX2hhbmRsZV9mcmFtZV9maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpkZXN0ID0gZXRoX2hkcihza2IpLT5oX2Rlc3Q7CisJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCA9IHNrYi0+ZGV2LT5icl9wb3J0OworCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IHAtPmJyOworCXN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZHN0OworCWludCBwYXNzZWR1cCA9IDA7CisKKwlpZiAoYnItPmRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKKworCQlza2IyID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJCWlmIChza2IyICE9IE5VTEwpIHsKKwkJCXBhc3NlZHVwID0gMTsKKwkJCWJyX3Bhc3NfZnJhbWVfdXAoYnIsIHNrYjIpOworCQl9CisJfQorCisJaWYgKGRlc3RbMF0gJiAxKSB7CisJCWJyX2Zsb29kX2ZvcndhcmQoYnIsIHNrYiwgIXBhc3NlZHVwKTsKKwkJaWYgKCFwYXNzZWR1cCkKKwkJCWJyX3Bhc3NfZnJhbWVfdXAoYnIsIHNrYik7CisJCWdvdG8gb3V0OworCX0KKworCWRzdCA9IF9fYnJfZmRiX2dldChiciwgZGVzdCk7CisJaWYgKGRzdCAhPSBOVUxMICYmIGRzdC0+aXNfbG9jYWwpIHsKKwkJaWYgKCFwYXNzZWR1cCkKKwkJCWJyX3Bhc3NfZnJhbWVfdXAoYnIsIHNrYik7CisJCWVsc2UKKwkJCWtmcmVlX3NrYihza2IpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZHN0ICE9IE5VTEwpIHsKKwkJYnJfZm9yd2FyZChkc3QtPmRzdCwgc2tiKTsKKwkJZ290byBvdXQ7CisJfQorCisJYnJfZmxvb2RfZm9yd2FyZChiciwgc2tiLCAwKTsKKworb3V0OgorCXJldHVybiAwOworfQorCisvKgorICogQ2FsbGVkIHZpYSBicl9oYW5kbGVfZnJhbWVfaG9vay4KKyAqIFJldHVybiAwIGlmICpwc2tiIHNob3VsZCBiZSBwcm9jZXNzZWQgZnVydGh1cgorICoJICAxIGlmICpwc2tiIGlzIGhhbmRsZWQKKyAqIG5vdGU6IGFscmVhZHkgY2FsbGVkIHdpdGggcmN1X3JlYWRfbG9jayAocHJlZW1wdF9kaXNhYmxlZCkgCisgKi8KK2ludCBicl9oYW5kbGVfZnJhbWUoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgc3RydWN0IHNrX2J1ZmYgKipwc2tiKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSAqcHNrYjsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpkZXN0ID0gZXRoX2hkcihza2IpLT5oX2Rlc3Q7CisKKwlpZiAocC0+c3RhdGUgPT0gQlJfU1RBVEVfRElTQUJMRUQpCisJCWdvdG8gZXJyOworCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UpKQorCQlnb3RvIGVycjsKKworCWlmIChwLT5zdGF0ZSA9PSBCUl9TVEFURV9MRUFSTklORyB8fAorCSAgICBwLT5zdGF0ZSA9PSBCUl9TVEFURV9GT1JXQVJESU5HKQorCQlicl9mZGJfdXBkYXRlKHAtPmJyLCBwLCBldGhfaGRyKHNrYiktPmhfc291cmNlKTsKKworCWlmIChwLT5ici0+c3RwX2VuYWJsZWQgJiYKKwkgICAgIW1lbWNtcChkZXN0LCBicmlkZ2VfdWxhLCA1KSAmJgorCSAgICAhKGRlc3RbNV0gJiAweEYwKSkgeworCQlpZiAoIWRlc3RbNV0pIHsKKwkJCU5GX0hPT0soUEZfQlJJREdFLCBORl9CUl9MT0NBTF9JTiwgc2tiLCBza2ItPmRldiwgCisJCQkJTlVMTCwgYnJfc3RwX2hhbmRsZV9icGR1KTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJZWxzZSBpZiAocC0+c3RhdGUgPT0gQlJfU1RBVEVfRk9SV0FSRElORykgeworCQlpZiAoYnJfc2hvdWxkX3JvdXRlX2hvb2spIHsKKwkJCWlmIChicl9zaG91bGRfcm91dGVfaG9vayhwc2tiKSkgCisJCQkJcmV0dXJuIDA7CisJCQlza2IgPSAqcHNrYjsKKwkJCWRlc3QgPSBldGhfaGRyKHNrYiktPmhfZGVzdDsKKwkJfQorCisJCWlmICghbWVtY21wKHAtPmJyLT5kZXYtPmRldl9hZGRyLCBkZXN0LCBFVEhfQUxFTikpCisJCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CisKKwkJTkZfSE9PSyhQRl9CUklER0UsIE5GX0JSX1BSRV9ST1VUSU5HLCBza2IsIHNrYi0+ZGV2LCBOVUxMLAorCQkJYnJfaGFuZGxlX2ZyYW1lX2ZpbmlzaCk7CisJCXJldHVybiAxOworCX0KKworZXJyOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9pb2N0bC5jIGIvbmV0L2JyaWRnZS9icl9pb2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4Y2UxNGIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYnJpZGdlL2JyX2lvY3RsLmMKQEAgLTAsMCArMSw0MTAgQEAKKy8qCisgKglJb2N0bCBoYW5kbGVyCisgKglMaW51eCBldGhlcm5ldCBicmlkZ2UKKyAqCisgKglBdXRob3JzOgorICoJTGVubmVydCBCdXl0ZW5oZWsJCTxidXl0ZW5oQGdudS5vcmc+CisgKgorICoJJElkOiBicl9pb2N0bC5jLHYgMS40IDIwMDAvMTEvMDggMDU6MTY6NDAgZGF2ZW0gRXhwICQKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9icmlkZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSAiYnJfcHJpdmF0ZS5oIgorCisvKiBjYWxsZWQgd2l0aCBSVE5MICovCitzdGF0aWMgaW50IGdldF9icmlkZ2VfaWZpbmRpY2VzKGludCAqaW5kaWNlcywgaW50IG51bSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBpID0gMDsKKworCWZvciAoZGV2ID0gZGV2X2Jhc2U7IGRldiAmJiBpIDwgbnVtOyBkZXYgPSBkZXYtPm5leHQpIHsKKwkJaWYgKGRldi0+cHJpdl9mbGFncyAmIElGRl9FQlJJREdFKSAKKwkJCWluZGljZXNbaSsrXSA9IGRldi0+aWZpbmRleDsKKwl9CisKKwlyZXR1cm4gaTsKK30KKworLyogY2FsbGVkIHdpdGggUlROTCAqLworc3RhdGljIHZvaWQgZ2V0X3BvcnRfaWZpbmRpY2VzKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgaW50ICppZmluZGljZXMsIGludCBudW0pCit7CisJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmJyLT5wb3J0X2xpc3QsIGxpc3QpIHsKKwkJaWYgKHAtPnBvcnRfbm8gPCBudW0pCisJCQlpZmluZGljZXNbcC0+cG9ydF9ub10gPSBwLT5kZXYtPmlmaW5kZXg7CisJfQorfQorCisvKgorICogRm9ybWF0IHVwIHRvIGEgcGFnZSB3b3J0aCBvZiBmb3J3YXJkaW5nIHRhYmxlIGVudHJpZXMKKyAqIHVzZXJidWYgLS0gd2hlcmUgdG8gY29weSByZXN1bHQKKyAqIG1heG51bSAgLS0gbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyBkZXNpcmVkCisgKiAgICAgICAgICAgIChsaW1pdGVkIHRvIGEgcGFnZSBmb3Igc2FuaXR5KQorICogb2Zmc2V0ICAtLSBudW1iZXIgb2YgcmVjb3JkcyB0byBza2lwCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2ZkYl9lbnRyaWVzKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgdm9pZCBfX3VzZXIgKnVzZXJidWYsIAorCQkJICAgdW5zaWduZWQgbG9uZyBtYXhudW0sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCWludCBudW07CisJdm9pZCAqYnVmOworCXNpemVfdCBzaXplID0gbWF4bnVtICogc2l6ZW9mKHN0cnVjdCBfX2ZkYl9lbnRyeSk7CisKKwlpZiAoc2l6ZSA+IFBBR0VfU0laRSkgeworCQlzaXplID0gUEFHRV9TSVpFOworCQltYXhudW0gPSBQQUdFX1NJWkUvc2l6ZW9mKHN0cnVjdCBfX2ZkYl9lbnRyeSk7CisJfQorCisJYnVmID0ga21hbGxvYyhzaXplLCBHRlBfVVNFUik7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCQorCW51bSA9IGJyX2ZkYl9maWxsYnVmKGJyLCBidWYsIG1heG51bSwgb2Zmc2V0KTsKKwlpZiAobnVtID4gMCkgeworCQlpZiAoY29weV90b191c2VyKHVzZXJidWYsIGJ1ZiwgbnVtKnNpemVvZihzdHJ1Y3QgX19mZGJfZW50cnkpKSkKKwkJCW51bSA9IC1FRkFVTFQ7CisJfQorCWtmcmVlKGJ1Zik7CisKKwlyZXR1cm4gbnVtOworfQorCitzdGF0aWMgaW50IGFkZF9kZWxfaWYoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBpbnQgaWZpbmRleCwgaW50IGlzYWRkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IHJldDsKKworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWRldiA9IGRldl9nZXRfYnlfaW5kZXgoaWZpbmRleCk7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkKKwlpZiAoaXNhZGQpCisJCXJldCA9IGJyX2FkZF9pZihiciwgZGV2KTsKKwllbHNlCisJCXJldCA9IGJyX2RlbF9pZihiciwgZGV2KTsKKworCWRldl9wdXQoZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTGVnYWN5IGlvY3RsJ3MgdGhyb3VnaCBTSU9DREVWUFJJVkFURQorICogVGhpcyBpbnRlcmZhY2UgaXMgZGVwcmVjYXRlZCBiZWNhdXNlIGl0IHdhcyB0b28gZGlmZmljdWx0IHRvCisgKiB0byBkbyB0aGUgdHJhbnNsYXRpb24gZm9yIDMyLzY0Yml0IGlvY3RsIGNvbXBhdGFiaWxpdHkuCisgKi8KK3N0YXRpYyBpbnQgb2xkX2Rldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBhcmdzWzRdOworCQorCWlmIChjb3B5X2Zyb21fdXNlcihhcmdzLCBycS0+aWZyX2RhdGEsIHNpemVvZihhcmdzKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3dpdGNoIChhcmdzWzBdKSB7CisJY2FzZSBCUkNUTF9BRERfSUY6CisJY2FzZSBCUkNUTF9ERUxfSUY6CisJCXJldHVybiBhZGRfZGVsX2lmKGJyLCBhcmdzWzFdLCBhcmdzWzBdID09IEJSQ1RMX0FERF9JRik7CisKKwljYXNlIEJSQ1RMX0dFVF9CUklER0VfSU5GTzoKKwl7CisJCXN0cnVjdCBfX2JyaWRnZV9pbmZvIGI7CisKKwkJbWVtc2V0KCZiLCAwLCBzaXplb2Yoc3RydWN0IF9fYnJpZGdlX2luZm8pKTsKKwkJcmN1X3JlYWRfbG9jaygpOworCQltZW1jcHkoJmIuZGVzaWduYXRlZF9yb290LCAmYnItPmRlc2lnbmF0ZWRfcm9vdCwgOCk7CisJCW1lbWNweSgmYi5icmlkZ2VfaWQsICZici0+YnJpZGdlX2lkLCA4KTsKKwkJYi5yb290X3BhdGhfY29zdCA9IGJyLT5yb290X3BhdGhfY29zdDsKKwkJYi5tYXhfYWdlID0gamlmZmllc190b19jbG9ja190KGJyLT5tYXhfYWdlKTsKKwkJYi5oZWxsb190aW1lID0gamlmZmllc190b19jbG9ja190KGJyLT5oZWxsb190aW1lKTsKKwkJYi5mb3J3YXJkX2RlbGF5ID0gYnItPmZvcndhcmRfZGVsYXk7CisJCWIuYnJpZGdlX21heF9hZ2UgPSBici0+YnJpZGdlX21heF9hZ2U7CisJCWIuYnJpZGdlX2hlbGxvX3RpbWUgPSBici0+YnJpZGdlX2hlbGxvX3RpbWU7CisJCWIuYnJpZGdlX2ZvcndhcmRfZGVsYXkgPSBqaWZmaWVzX3RvX2Nsb2NrX3QoYnItPmJyaWRnZV9mb3J3YXJkX2RlbGF5KTsKKwkJYi50b3BvbG9neV9jaGFuZ2UgPSBici0+dG9wb2xvZ3lfY2hhbmdlOworCQliLnRvcG9sb2d5X2NoYW5nZV9kZXRlY3RlZCA9IGJyLT50b3BvbG9neV9jaGFuZ2VfZGV0ZWN0ZWQ7CisJCWIucm9vdF9wb3J0ID0gYnItPnJvb3RfcG9ydDsKKwkJYi5zdHBfZW5hYmxlZCA9IGJyLT5zdHBfZW5hYmxlZDsKKwkJYi5hZ2VpbmdfdGltZSA9IGppZmZpZXNfdG9fY2xvY2tfdChici0+YWdlaW5nX3RpbWUpOworCQliLmhlbGxvX3RpbWVyX3ZhbHVlID0gYnJfdGltZXJfdmFsdWUoJmJyLT5oZWxsb190aW1lcik7CisJCWIudGNuX3RpbWVyX3ZhbHVlID0gYnJfdGltZXJfdmFsdWUoJmJyLT50Y25fdGltZXIpOworCQliLnRvcG9sb2d5X2NoYW5nZV90aW1lcl92YWx1ZSA9IGJyX3RpbWVyX3ZhbHVlKCZici0+dG9wb2xvZ3lfY2hhbmdlX3RpbWVyKTsKKwkJYi5nY190aW1lcl92YWx1ZSA9IGJyX3RpbWVyX3ZhbHVlKCZici0+Z2NfdGltZXIpOworCSAgICAgICAgcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmdzWzFdLCAmYiwgc2l6ZW9mKGIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCX0KKworCWNhc2UgQlJDVExfR0VUX1BPUlRfTElTVDoKKwl7CisJCWludCBudW0sICppbmRpY2VzOworCisJCW51bSA9IGFyZ3NbMl07CisJCWlmIChudW0gPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChudW0gPT0gMCkKKwkJCW51bSA9IDI1NjsKKwkJaWYgKG51bSA+IEJSX01BWF9QT1JUUykKKwkJCW51bSA9IEJSX01BWF9QT1JUUzsKKworCQlpbmRpY2VzID0ga21hbGxvYyhudW0qc2l6ZW9mKGludCksIEdGUF9LRVJORUwpOworCQlpZiAoaW5kaWNlcyA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJbWVtc2V0KGluZGljZXMsIDAsIG51bSpzaXplb2YoaW50KSk7CisKKwkJZ2V0X3BvcnRfaWZpbmRpY2VzKGJyLCBpbmRpY2VzLCBudW0pOworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZ3NbMV0sIGluZGljZXMsIG51bSpzaXplb2YoaW50KSkpCisJCQludW0gPSAgLUVGQVVMVDsKKwkJa2ZyZWUoaW5kaWNlcyk7CisJCXJldHVybiBudW07CisJfQorCisJY2FzZSBCUkNUTF9TRVRfQlJJREdFX0ZPUldBUkRfREVMQVk6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJc3Bpbl9sb2NrX2JoKCZici0+bG9jayk7CisJCWJyLT5icmlkZ2VfZm9yd2FyZF9kZWxheSA9IGNsb2NrX3RfdG9famlmZmllcyhhcmdzWzFdKTsKKwkJaWYgKGJyX2lzX3Jvb3RfYnJpZGdlKGJyKSkKKwkJCWJyLT5mb3J3YXJkX2RlbGF5ID0gYnItPmJyaWRnZV9mb3J3YXJkX2RlbGF5OworCQlzcGluX3VubG9ja19iaCgmYnItPmxvY2spOworCQlyZXR1cm4gMDsKKworCWNhc2UgQlJDVExfU0VUX0JSSURHRV9IRUxMT19USU1FOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCXNwaW5fbG9ja19iaCgmYnItPmxvY2spOworCQlici0+YnJpZGdlX2hlbGxvX3RpbWUgPSBjbG9ja190X3RvX2ppZmZpZXMoYXJnc1sxXSk7CisJCWlmIChicl9pc19yb290X2JyaWRnZShicikpCisJCQlici0+aGVsbG9fdGltZSA9IGJyLT5icmlkZ2VfaGVsbG9fdGltZTsKKwkJc3Bpbl91bmxvY2tfYmgoJmJyLT5sb2NrKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEJSQ1RMX1NFVF9CUklER0VfTUFYX0FHRToKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlzcGluX2xvY2tfYmgoJmJyLT5sb2NrKTsKKwkJYnItPmJyaWRnZV9tYXhfYWdlID0gY2xvY2tfdF90b19qaWZmaWVzKGFyZ3NbMV0pOworCQlpZiAoYnJfaXNfcm9vdF9icmlkZ2UoYnIpKQorCQkJYnItPm1heF9hZ2UgPSBici0+YnJpZGdlX21heF9hZ2U7CisJCXNwaW5fdW5sb2NrX2JoKCZici0+bG9jayk7CisJCXJldHVybiAwOworCisJY2FzZSBCUkNUTF9TRVRfQUdFSU5HX1RJTUU6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJYnItPmFnZWluZ190aW1lID0gY2xvY2tfdF90b19qaWZmaWVzKGFyZ3NbMV0pOworCQlyZXR1cm4gMDsKKworCWNhc2UgQlJDVExfR0VUX1BPUlRfSU5GTzoKKwl7CisJCXN0cnVjdCBfX3BvcnRfaW5mbyBwOworCQlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwdDsKKworCQlyY3VfcmVhZF9sb2NrKCk7CisJCWlmICgocHQgPSBicl9nZXRfcG9ydChiciwgYXJnc1syXSkpID09IE5VTEwpIHsKKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQltZW1zZXQoJnAsIDAsIHNpemVvZihzdHJ1Y3QgX19wb3J0X2luZm8pKTsKKwkJbWVtY3B5KCZwLmRlc2lnbmF0ZWRfcm9vdCwgJnB0LT5kZXNpZ25hdGVkX3Jvb3QsIDgpOworCQltZW1jcHkoJnAuZGVzaWduYXRlZF9icmlkZ2UsICZwdC0+ZGVzaWduYXRlZF9icmlkZ2UsIDgpOworCQlwLnBvcnRfaWQgPSBwdC0+cG9ydF9pZDsKKwkJcC5kZXNpZ25hdGVkX3BvcnQgPSBwdC0+ZGVzaWduYXRlZF9wb3J0OworCQlwLnBhdGhfY29zdCA9IHB0LT5wYXRoX2Nvc3Q7CisJCXAuZGVzaWduYXRlZF9jb3N0ID0gcHQtPmRlc2lnbmF0ZWRfY29zdDsKKwkJcC5zdGF0ZSA9IHB0LT5zdGF0ZTsKKwkJcC50b3BfY2hhbmdlX2FjayA9IHB0LT50b3BvbG9neV9jaGFuZ2VfYWNrOworCQlwLmNvbmZpZ19wZW5kaW5nID0gcHQtPmNvbmZpZ19wZW5kaW5nOworCQlwLm1lc3NhZ2VfYWdlX3RpbWVyX3ZhbHVlID0gYnJfdGltZXJfdmFsdWUoJnB0LT5tZXNzYWdlX2FnZV90aW1lcik7CisJCXAuZm9yd2FyZF9kZWxheV90aW1lcl92YWx1ZSA9IGJyX3RpbWVyX3ZhbHVlKCZwdC0+Zm9yd2FyZF9kZWxheV90aW1lcik7CisJCXAuaG9sZF90aW1lcl92YWx1ZSA9IGJyX3RpbWVyX3ZhbHVlKCZwdC0+aG9sZF90aW1lcik7CisKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmdzWzFdLCAmcCwgc2l6ZW9mKHApKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCX0KKworCWNhc2UgQlJDVExfU0VUX0JSSURHRV9TVFBfU1RBVEU6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJYnItPnN0cF9lbmFibGVkID0gYXJnc1sxXT8xOjA7CisJCXJldHVybiAwOworCisJY2FzZSBCUkNUTF9TRVRfQlJJREdFX1BSSU9SSVRZOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCXNwaW5fbG9ja19iaCgmYnItPmxvY2spOworCQlicl9zdHBfc2V0X2JyaWRnZV9wcmlvcml0eShiciwgYXJnc1sxXSk7CisJCXNwaW5fdW5sb2NrX2JoKCZici0+bG9jayk7CisJCXJldHVybiAwOworCisJY2FzZSBCUkNUTF9TRVRfUE9SVF9QUklPUklUWToKKwl7CisJCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnA7CisJCWludCByZXQgPSAwOworCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKGFyZ3NbMl0gPj0gKDE8PCgxNi1CUl9QT1JUX0JJVFMpKSkKKwkJCXJldHVybiAtRVJBTkdFOworCisJCXNwaW5fbG9ja19iaCgmYnItPmxvY2spOworCQlpZiAoKHAgPSBicl9nZXRfcG9ydChiciwgYXJnc1sxXSkpID09IE5VTEwpIAorCQkJcmV0ID0gLUVJTlZBTDsKKwkJZWxzZQorCQkJYnJfc3RwX3NldF9wb3J0X3ByaW9yaXR5KHAsIGFyZ3NbMl0pOworCQlzcGluX3VubG9ja19iaCgmYnItPmxvY2spOworCQlyZXR1cm4gcmV0OworCX0KKworCWNhc2UgQlJDVExfU0VUX1BBVEhfQ09TVDoKKwl7CisJCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnA7CisJCWludCByZXQgPSAwOworCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJc3Bpbl9sb2NrX2JoKCZici0+bG9jayk7CisJCWlmICgocCA9IGJyX2dldF9wb3J0KGJyLCBhcmdzWzFdKSkgPT0gTlVMTCkKKwkJCXJldCA9IC1FSU5WQUw7CisJCWVsc2UKKwkJCWJyX3N0cF9zZXRfcGF0aF9jb3N0KHAsIGFyZ3NbMl0pOworCQlzcGluX3VubG9ja19iaCgmYnItPmxvY2spOworCQlyZXR1cm4gcmV0OworCX0KKworCWNhc2UgQlJDVExfR0VUX0ZEQl9FTlRSSUVTOgorCQlyZXR1cm4gZ2V0X2ZkYl9lbnRyaWVzKGJyLCAodm9pZCBfX3VzZXIgKilhcmdzWzFdLCAKKwkJCQkgICAgICAgYXJnc1syXSwgYXJnc1szXSk7CisJfQorCisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgaW50IG9sZF9kZXZpY2VsZXNzKHZvaWQgX191c2VyICp1YXJnKQoreworCXVuc2lnbmVkIGxvbmcgYXJnc1szXTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihhcmdzLCB1YXJnLCBzaXplb2YoYXJncykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaCAoYXJnc1swXSkgeworCWNhc2UgQlJDVExfR0VUX1ZFUlNJT046CisJCXJldHVybiBCUkNUTF9WRVJTSU9OOworCisJY2FzZSBCUkNUTF9HRVRfQlJJREdFUzoKKwl7CisJCWludCAqaW5kaWNlczsKKwkJaW50IHJldCA9IDA7CisKKwkJaWYgKGFyZ3NbMl0gPj0gMjA0OCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlpbmRpY2VzID0ga21hbGxvYyhhcmdzWzJdKnNpemVvZihpbnQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGluZGljZXMgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCW1lbXNldChpbmRpY2VzLCAwLCBhcmdzWzJdKnNpemVvZihpbnQpKTsKKwkJYXJnc1syXSA9IGdldF9icmlkZ2VfaWZpbmRpY2VzKGluZGljZXMsIGFyZ3NbMl0pOworCisJCXJldCA9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmdzWzFdLCBpbmRpY2VzLCBhcmdzWzJdKnNpemVvZihpbnQpKQorCQkJPyAtRUZBVUxUIDogYXJnc1syXTsKKworCQlrZnJlZShpbmRpY2VzKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwljYXNlIEJSQ1RMX0FERF9CUklER0U6CisJY2FzZSBCUkNUTF9ERUxfQlJJREdFOgorCXsKKwkJY2hhciBidWZbSUZOQU1TSVpdOworCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgKHZvaWQgX191c2VyICopYXJnc1sxXSwgSUZOQU1TSVopKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJYnVmW0lGTkFNU0laLTFdID0gMDsKKworCQlpZiAoYXJnc1swXSA9PSBCUkNUTF9BRERfQlJJREdFKQorCQkJcmV0dXJuIGJyX2FkZF9icmlkZ2UoYnVmKTsKKworCQlyZXR1cm4gYnJfZGVsX2JyaWRnZShidWYpOworCX0KKwl9CisKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK2ludCBicl9pb2N0bF9kZXZpY2VsZXNzX3N0dWIodW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKnVhcmcpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NHSUZCUjoKKwljYXNlIFNJT0NTSUZCUjoKKwkJcmV0dXJuIG9sZF9kZXZpY2VsZXNzKHVhcmcpOworCQkKKwljYXNlIFNJT0NCUkFEREJSOgorCWNhc2UgU0lPQ0JSREVMQlI6CisJeworCQljaGFyIGJ1ZltJRk5BTVNJWl07CisKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1YXJnLCBJRk5BTVNJWikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlidWZbSUZOQU1TSVotMV0gPSAwOworCQlpZiAoY21kID09IFNJT0NCUkFEREJSKQorCQkJcmV0dXJuIGJyX2FkZF9icmlkZ2UoYnVmKTsKKworCQlyZXR1cm4gYnJfZGVsX2JyaWRnZShidWYpOworCX0KKwl9CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitpbnQgYnJfZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXN3aXRjaChjbWQpIHsKKwljYXNlIFNJT0NERVZQUklWQVRFOgorCQlyZXR1cm4gb2xkX2Rldl9pb2N0bChkZXYsIHJxLCBjbWQpOworCisJY2FzZSBTSU9DQlJBRERJRjoKKwljYXNlIFNJT0NCUkRFTElGOgorCQlyZXR1cm4gYWRkX2RlbF9pZihiciwgcnEtPmlmcl9pZmluZGV4LCBjbWQgPT0gU0lPQ0JSQURESUYpOworCisJfQorCisJcHJfZGVidWcoIkJyaWRnZSBkb2VzIG5vdCBzdXBwb3J0IGlvY3RsIDB4JXhcbiIsIGNtZCk7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYyBiL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUwM2QzYQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMKQEAgLTAsMCArMSwxMDg3IEBACisvKgorICoJSGFuZGxlIGZpcmV3YWxsaW5nCisgKglMaW51eCBldGhlcm5ldCBicmlkZ2UKKyAqCisgKglBdXRob3JzOgorICoJTGVubmVydCBCdXl0ZW5oZWsgICAgICAgICAgICAgICA8YnV5dGVuaEBnbnUub3JnPgorICoJQmFydCBEZSBTY2h1eW1lciAobWFpbnRhaW5lcikJPGJkc2NodXltQHBhbmRvcmEuYmU+CisgKgorICoJQ2hhbmdlczoKKyAqCUFwciAyOSAyMDAzOiBwaHlzZGV2IG1vZHVsZSBzdXBwb3J0IChiZHNjaHV5bSkKKyAqCUp1biAxOSAyMDAzOiBsZXQgYXJwdGFibGVzIHNlZSBicmlkZ2VkIEFSUCB0cmFmZmljIChiZHNjaHV5bSkKKyAqCU9jdCAwNiAyMDAzOiBmaWx0ZXIgZW5jYXBzdWxhdGVkIElQL0FSUCBWTEFOIHRyYWZmaWMgb24gdW50YWdnZWQgYnJpZGdlCisgKgkgICAgICAgICAgICAgKGJkc2NodXltKQorICoJU2VwIDAxIDIwMDQ6IGFkZCBJUHY2IGZpbHRlcmluZyAoYmRzY2h1eW0pCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglMZW5uZXJ0IGRlZGljYXRlcyB0aGlzIGZpbGUgdG8gS2Vyc3RpbiBXdXJkaW5nZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW5fcm91dGUuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CisjaW5jbHVkZSAiYnJfcHJpdmF0ZS5oIgorI2lmZGVmIENPTkZJR19TWVNDVEwKKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNlbmRpZgorCisjZGVmaW5lIHNrYl9vcmlnYWRkcihza2IpCSAoKChzdHJ1Y3QgYnJpZGdlX3NrYl9jYiAqKSBcCisJCQkJIChza2ItPm5mX2JyaWRnZS0+ZGF0YSkpLT5kYWRkci5pcHY0KQorI2RlZmluZSBzdG9yZV9vcmlnX2RzdGFkZHIoc2tiKQkgKHNrYl9vcmlnYWRkcihza2IpID0gKHNrYiktPm5oLmlwaC0+ZGFkZHIpCisjZGVmaW5lIGRuYXRfdG9va19wbGFjZShza2IpCSAoc2tiX29yaWdhZGRyKHNrYikgIT0gKHNrYiktPm5oLmlwaC0+ZGFkZHIpCisKKyNkZWZpbmUgaGFzX2JyaWRnZV9wYXJlbnQoZGV2aWNlKQkoKGRldmljZSktPmJyX3BvcnQgIT0gTlVMTCkKKyNkZWZpbmUgYnJpZGdlX3BhcmVudChkZXZpY2UpCQkoKGRldmljZSktPmJyX3BvcnQtPmJyLT5kZXYpCisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmJybmZfc3lzY3RsX2hlYWRlcjsKK3N0YXRpYyBpbnQgYnJuZl9jYWxsX2lwdGFibGVzID0gMTsKK3N0YXRpYyBpbnQgYnJuZl9jYWxsX2lwNnRhYmxlcyA9IDE7CitzdGF0aWMgaW50IGJybmZfY2FsbF9hcnB0YWJsZXMgPSAxOworc3RhdGljIGludCBicm5mX2ZpbHRlcl92bGFuX3RhZ2dlZCA9IDE7CisjZWxzZQorI2RlZmluZSBicm5mX2ZpbHRlcl92bGFuX3RhZ2dlZCAxCisjZW5kaWYKKworI2RlZmluZSBJU19WTEFOX0lQIChza2ItPnByb3RvY29sID09IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyMVEpICYmICAgIFwKKwloZHItPmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG8gPT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCkgJiYgIFwKKwlicm5mX2ZpbHRlcl92bGFuX3RhZ2dlZCkKKyNkZWZpbmUgSVNfVkxBTl9JUFY2IChza2ItPnByb3RvY29sID09IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyMVEpICYmICAgIFwKKwloZHItPmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG8gPT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFY2KSAmJiAgXAorCWJybmZfZmlsdGVyX3ZsYW5fdGFnZ2VkKQorI2RlZmluZSBJU19WTEFOX0FSUCAoc2tiLT5wcm90b2NvbCA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMjFRKSAmJiAgIFwKKwloZHItPmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG8gPT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9BUlApICYmIFwKKwlicm5mX2ZpbHRlcl92bGFuX3RhZ2dlZCkKKworLyogV2UgbmVlZCB0aGVzZSBmYWtlIHN0cnVjdHVyZXMgdG8gbWFrZSBuZXRmaWx0ZXIgaGFwcHkgLS0KKyAqIGxvdHMgb2YgcGxhY2VzIGFzc3VtZSB0aGF0IHNrYi0+ZHN0ICE9IE5VTEwsIHdoaWNoIGlzbid0CisgKiBhbGwgdGhhdCB1bnJlYXNvbmFibGUuCisgKgorICogQ3VycmVudGx5LCB3ZSBmaWxsIGluIHRoZSBQTVRVIGVudHJ5IGJlY2F1c2UgbmV0ZmlsdGVyCisgKiByZWZyYWdtZW50YXRpb24gbmVlZHMgaXQsIGFuZCB0aGUgcnRfZmxhZ3MgZW50cnkgYmVjYXVzZQorICogaXB0X1JFSkVDVCBuZWVkcyBpdC4gIEZ1dHVyZSBuZXRmaWx0ZXIgbW9kdWxlcyBtaWdodAorICogcmVxdWlyZSB1cyB0byBmaWxsIGFkZGl0aW9uYWwgZmllbGRzLiAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlIF9fZmFrZV9uZXRfZGV2aWNlID0geworCS5oYXJkX2hlYWRlcl9sZW4JPSBFVEhfSExFTgorfTsKKworc3RhdGljIHN0cnVjdCBydGFibGUgX19mYWtlX3J0YWJsZSA9IHsKKwkudSA9IHsKKwkJLmRzdCA9IHsKKwkJCS5fX3JlZmNudAkJPSBBVE9NSUNfSU5JVCgxKSwKKwkJCS5kZXYJCQk9ICZfX2Zha2VfbmV0X2RldmljZSwKKwkJCS5wYXRoCQkJPSAmX19mYWtlX3J0YWJsZS51LmRzdCwKKwkJCS5tZXRyaWNzCQk9IHtbUlRBWF9NVFUgLSAxXSA9IDE1MDB9LAorCQl9CisJfSwKKwkucnRfZmxhZ3MJPSAwLAorfTsKKworCisvKiBQRl9CUklER0UvUFJFX1JPVVRJTkcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVW5kbyB0aGUgY2hhbmdlcyBtYWRlIGZvciBpcDZ0YWJsZXMgUFJFUk9VVElORyBhbmQgY29udGludWUgdGhlCisgKiBicmlkZ2UgUFJFX1JPVVRJTkcgaG9vay4gKi8KK3N0YXRpYyBpbnQgYnJfbmZfcHJlX3JvdXRpbmdfZmluaXNoX2lwdjYoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmZfYnJpZGdlX2luZm8gKm5mX2JyaWRnZSA9IHNrYi0+bmZfYnJpZGdlOworCisjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRworCXNrYi0+bmZfZGVidWcgXj0gKDEgPDwgTkZfQlJfUFJFX1JPVVRJTkcpOworI2VuZGlmCisKKwlpZiAobmZfYnJpZGdlLT5tYXNrICYgQlJORl9QS1RfVFlQRSkgeworCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKKwkJbmZfYnJpZGdlLT5tYXNrIF49IEJSTkZfUEtUX1RZUEU7CisJfQorCW5mX2JyaWRnZS0+bWFzayBePSBCUk5GX05GX0JSSURHRV9QUkVST1VUSU5HOworCisJc2tiLT5kc3QgPSAoc3RydWN0IGRzdF9lbnRyeSAqKSZfX2Zha2VfcnRhYmxlOworCWRzdF9ob2xkKHNrYi0+ZHN0KTsKKworCXNrYi0+ZGV2ID0gbmZfYnJpZGdlLT5waHlzaW5kZXY7CisJaWYgKHNrYi0+cHJvdG9jb2wgPT0gX19jb25zdGFudF9odG9ucyhFVEhfUF84MDIxUSkpIHsKKwkJc2tiX3B1c2goc2tiLCBWTEFOX0hMRU4pOworCQlza2ItPm5oLnJhdyAtPSBWTEFOX0hMRU47CisJfQorCU5GX0hPT0tfVEhSRVNIKFBGX0JSSURHRSwgTkZfQlJfUFJFX1JPVVRJTkcsIHNrYiwgc2tiLT5kZXYsIE5VTEwsCisJCSAgICAgICBicl9oYW5kbGVfZnJhbWVfZmluaXNoLCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2JyX2RuYXRfY29tcGxhaW4odm9pZCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X2NvbXBsYWludDsKKworCWlmIChqaWZmaWVzIC0gbGFzdF9jb21wbGFpbnQgPj0gNSAqIEhaKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBlcmZvcm1pbmcgY3Jvc3MtYnJpZGdlIEROQVQgcmVxdWlyZXMgSVAgIgorCQkJImZvcndhcmRpbmcgdG8gYmUgZW5hYmxlZFxuIik7CisJCWxhc3RfY29tcGxhaW50ID0gamlmZmllczsKKwl9Cit9CisKKy8qIFRoaXMgcmVxdWlyZXMgc29tZSBleHBsYWluaW5nLiBJZiBETkFUIGhhcyB0YWtlbiBwbGFjZSwKKyAqIHdlIHdpbGwgbmVlZCB0byBmaXggdXAgdGhlIGRlc3RpbmF0aW9uIEV0aGVybmV0IGFkZHJlc3MsCisgKiBhbmQgdGhpcyBpcyBhIHRyaWNreSBwcm9jZXNzLgorICoKKyAqIFRoZXJlIGFyZSB0d28gY2FzZXMgdG8gY29uc2lkZXI6CisgKiAxLiBUaGUgcGFja2V0IHdhcyBETkFUJ2VkIHRvIGEgZGV2aWNlIGluIHRoZSBzYW1lIGJyaWRnZQorICogICAgcG9ydCBncm91cCBhcyBpdCB3YXMgcmVjZWl2ZWQgb24uIFdlIGNhbiBzdGlsbCBicmlkZ2UKKyAqICAgIHRoZSBwYWNrZXQuCisgKiAyLiBUaGUgcGFja2V0IHdhcyBETkFUJ2VkIHRvIGEgZGlmZmVyZW50IGRldmljZSwgZWl0aGVyCisgKiAgICBhIG5vbi1icmlkZ2VkIGRldmljZSBvciBhbm90aGVyIGJyaWRnZSBwb3J0IGdyb3VwLgorICogICAgVGhlIHBhY2tldCB3aWxsIG5lZWQgdG8gYmUgcm91dGVkLgorICoKKyAqIFRoZSBjb3JyZWN0IHdheSBvZiBkaXN0aW5ndWlzaGluZyBiZXR3ZWVuIHRoZXNlIHR3byBjYXNlcyBpcyB0bworICogY2FsbCBpcF9yb3V0ZV9pbnB1dCgpIGFuZCB0byBsb29rIGF0IHNrYi0+ZHN0LT5kZXYsIHdoaWNoIGlzCisgKiBjaGFuZ2VkIHRvIHRoZSBkZXN0aW5hdGlvbiBkZXZpY2UgaWYgaXBfcm91dGVfaW5wdXQoKSBzdWNjZWVkcy4KKyAqCisgKiBMZXQgdXMgZmlyc3QgY29uc2lkZXIgdGhlIGNhc2UgdGhhdCBpcF9yb3V0ZV9pbnB1dCgpIHN1Y2NlZWRzOgorICoKKyAqIElmIHNrYi0+ZHN0LT5kZXYgZXF1YWxzIHRoZSBsb2dpY2FsIGJyaWRnZSBkZXZpY2UgdGhlIHBhY2tldAorICogY2FtZSBpbiBvbiwgd2UgY2FuIGNvbnNpZGVyIHRoaXMgYnJpZGdpbmcuIFdlIHRoZW4gY2FsbAorICogc2tiLT5kc3QtPm91dHB1dCgpIHdoaWNoIHdpbGwgbWFrZSB0aGUgcGFja2V0IGVudGVyIGJyX25mX2xvY2FsX291dCgpCisgKiBub3QgbXVjaCBsYXRlci4gSW4gdGhhdCBmdW5jdGlvbiBpdCBpcyBhc3N1cmVkIHRoYXQgdGhlIGlwdGFibGVzCisgKiBGT1JXQVJEIGNoYWluIGlzIHRyYXZlcnNlZCBmb3IgdGhlIHBhY2tldC4KKyAqCisgKiBPdGhlcndpc2UsIHRoZSBwYWNrZXQgaXMgY29uc2lkZXJlZCB0byBiZSByb3V0ZWQgYW5kIHdlIGp1c3QKKyAqIGNoYW5nZSB0aGUgZGVzdGluYXRpb24gTUFDIGFkZHJlc3Mgc28gdGhhdCB0aGUgcGFja2V0IHdpbGwKKyAqIGxhdGVyIGJlIHBhc3NlZCB1cCB0byB0aGUgSVAgc3RhY2sgdG8gYmUgcm91dGVkLgorICoKKyAqIExldCB1cyBub3cgY29uc2lkZXIgdGhlIGNhc2UgdGhhdCBpcF9yb3V0ZV9pbnB1dCgpIGZhaWxzOgorICoKKyAqIEFmdGVyIGEgImVjaG8gJzAnID4gL3Byb2Mvc3lzL25ldC9pcHY0L2lwX2ZvcndhcmQiIGlwX3JvdXRlX2lucHV0KCkKKyAqIHdpbGwgZmFpbCwgd2hpbGUgX19pcF9yb3V0ZV9vdXRwdXRfa2V5KCkgd2lsbCByZXR1cm4gc3VjY2Vzcy4gVGhlIHNvdXJjZQorICogYWRkcmVzcyBmb3IgX19pcF9yb3V0ZV9vdXRwdXRfa2V5KCkgaXMgc2V0IHRvIHplcm8sIHNvIF9faXBfcm91dGVfb3V0cHV0X2tleQorICogdGhpbmtzIHdlJ3JlIGhhbmRsaW5nIGEgbG9jYWxseSBnZW5lcmF0ZWQgcGFja2V0IGFuZCB3b24ndCBjYXJlCisgKiBpZiBJUCBmb3J3YXJkaW5nIGlzIGFsbG93ZWQuIFdlIHNlbmQgYSB3YXJuaW5nIG1lc3NhZ2UgdG8gdGhlIHVzZXJzJ3MKKyAqIGxvZyB0ZWxsaW5nIGhlciB0byBwdXQgSVAgZm9yd2FyZGluZyBvbi4KKyAqCisgKiBpcF9yb3V0ZV9pbnB1dCgpIHdpbGwgYWxzbyBmYWlsIGlmIHRoZXJlIGlzIG5vIHJvdXRlIGF2YWlsYWJsZS4KKyAqIEluIHRoYXQgY2FzZSB3ZSBqdXN0IGRyb3AgdGhlIHBhY2tldC4KKyAqCisgKiAtLUxlbm5lcnQsIDIwMDIwNDExCisgKiAtLUJhcnQsIDIwMDIwNDE2ICh1cGRhdGVkKQorICogLS1CYXJ0LCAyMDAyMTAwNyAodXBkYXRlZCkgKi8KK3N0YXRpYyBpbnQgYnJfbmZfcHJlX3JvdXRpbmdfZmluaXNoX2JyaWRnZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKKwlza2ItPm5mX2RlYnVnIHw9ICgxIDw8IE5GX0JSX1BSRV9ST1VUSU5HKSB8ICgxIDw8IE5GX0JSX0ZPUldBUkQpOworI2VuZGlmCisKKwlpZiAoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfT1RIRVJIT1NUKSB7CisJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKKwkJc2tiLT5uZl9icmlkZ2UtPm1hc2sgfD0gQlJORl9QS1RfVFlQRTsKKwl9CisJc2tiLT5uZl9icmlkZ2UtPm1hc2sgXj0gQlJORl9ORl9CUklER0VfUFJFUk9VVElORzsKKworCXNrYi0+ZGV2ID0gYnJpZGdlX3BhcmVudChza2ItPmRldik7CisJaWYgKHNrYi0+cHJvdG9jb2wgPT0gX19jb25zdGFudF9odG9ucyhFVEhfUF84MDIxUSkpIHsKKwkJc2tiX3B1bGwoc2tiLCBWTEFOX0hMRU4pOworCQlza2ItPm5oLnJhdyArPSBWTEFOX0hMRU47CisJfQorCXNrYi0+ZHN0LT5vdXRwdXQoc2tiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBicl9uZl9wcmVfcm91dGluZ19maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CisJc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgbmZfYnJpZGdlX2luZm8gKm5mX2JyaWRnZSA9IHNrYi0+bmZfYnJpZGdlOworCisjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRworCXNrYi0+bmZfZGVidWcgXj0gKDEgPDwgTkZfQlJfUFJFX1JPVVRJTkcpOworI2VuZGlmCisKKwlpZiAobmZfYnJpZGdlLT5tYXNrICYgQlJORl9QS1RfVFlQRSkgeworCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKKwkJbmZfYnJpZGdlLT5tYXNrIF49IEJSTkZfUEtUX1RZUEU7CisJfQorCW5mX2JyaWRnZS0+bWFzayBePSBCUk5GX05GX0JSSURHRV9QUkVST1VUSU5HOworCisJaWYgKGRuYXRfdG9va19wbGFjZShza2IpKSB7CisJCWlmIChpcF9yb3V0ZV9pbnB1dChza2IsIGlwaC0+ZGFkZHIsIGlwaC0+c2FkZHIsIGlwaC0+dG9zLAorCQkgICAgZGV2KSkgeworCQkJc3RydWN0IHJ0YWJsZSAqcnQ7CisJCQlzdHJ1Y3QgZmxvd2kgZmwgPSB7IC5ubF91ID0gCisJCQl7IC5pcDRfdSA9IHsgLmRhZGRyID0gaXBoLT5kYWRkciwgLnNhZGRyID0gMCAsCisJCQkJICAgICAudG9zID0gUlRfVE9TKGlwaC0+dG9zKX0gfSwgLnByb3RvID0gMH07CisKKwkJCWlmICghaXBfcm91dGVfb3V0cHV0X2tleSgmcnQsICZmbCkpIHsKKwkJCQkvKiBCcmlkZ2VkLWFuZC1ETkFUJ2VkIHRyYWZmaWMgZG9lc24ndAorCQkJCSAqIHJlcXVpcmUgaXBfZm9yd2FyZGluZy4gKi8KKwkJCQlpZiAoKChzdHJ1Y3QgZHN0X2VudHJ5ICopcnQpLT5kZXYgPT0gZGV2KSB7CisJCQkJCXNrYi0+ZHN0ID0gKHN0cnVjdCBkc3RfZW50cnkgKilydDsKKwkJCQkJZ290byBicmlkZ2VkX2RuYXQ7CisJCQkJfQorCQkJCV9fYnJfZG5hdF9jb21wbGFpbigpOworCQkJCWRzdF9yZWxlYXNlKChzdHJ1Y3QgZHN0X2VudHJ5ICopcnQpOworCQkJfQorCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCWlmIChza2ItPmRzdC0+ZGV2ID09IGRldikgeworYnJpZGdlZF9kbmF0OgorCQkJCS8qIFRlbGwgYnJfbmZfbG9jYWxfb3V0IHRoaXMgaXMgYQorCQkJCSAqIGJyaWRnZWQgZnJhbWUgKi8KKwkJCQluZl9icmlkZ2UtPm1hc2sgfD0gQlJORl9CUklER0VEX0ROQVQ7CisJCQkJc2tiLT5kZXYgPSBuZl9icmlkZ2UtPnBoeXNpbmRldjsKKwkJCQlpZiAoc2tiLT5wcm90b2NvbCA9PQorCQkJCSAgICBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMjFRKSkgeworCQkJCQlza2JfcHVzaChza2IsIFZMQU5fSExFTik7CisJCQkJCXNrYi0+bmgucmF3IC09IFZMQU5fSExFTjsKKwkJCQl9CisJCQkJTkZfSE9PS19USFJFU0goUEZfQlJJREdFLCBORl9CUl9QUkVfUk9VVElORywKKwkJCQkJICAgICAgIHNrYiwgc2tiLT5kZXYsIE5VTEwsCisJCQkJCSAgICAgICBicl9uZl9wcmVfcm91dGluZ19maW5pc2hfYnJpZGdlLAorCQkJCQkgICAgICAgMSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQltZW1jcHkoZXRoX2hkcihza2IpLT5oX2Rlc3QsIGRldi0+ZGV2X2FkZHIsCisJCQkgICAgICAgRVRIX0FMRU4pOworCQkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOworCQl9CisJfSBlbHNlIHsKKwkJc2tiLT5kc3QgPSAoc3RydWN0IGRzdF9lbnRyeSAqKSZfX2Zha2VfcnRhYmxlOworCQlkc3RfaG9sZChza2ItPmRzdCk7CisJfQorCisJc2tiLT5kZXYgPSBuZl9icmlkZ2UtPnBoeXNpbmRldjsKKwlpZiAoc2tiLT5wcm90b2NvbCA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMjFRKSkgeworCQlza2JfcHVzaChza2IsIFZMQU5fSExFTik7CisJCXNrYi0+bmgucmF3IC09IFZMQU5fSExFTjsKKwl9CisJTkZfSE9PS19USFJFU0goUEZfQlJJREdFLCBORl9CUl9QUkVfUk9VVElORywgc2tiLCBza2ItPmRldiwgTlVMTCwKKwkJICAgICAgIGJyX2hhbmRsZV9mcmFtZV9maW5pc2gsIDEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFNvbWUgY29tbW9uIGNvZGUgZm9yIElQdjQvSVB2NiAqLworc3RhdGljIHZvaWQgc2V0dXBfcHJlX3JvdXRpbmcoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmZfYnJpZGdlX2luZm8gKm5mX2JyaWRnZSA9IHNrYi0+bmZfYnJpZGdlOworCisJaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09USEVSSE9TVCkgeworCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CisJCW5mX2JyaWRnZS0+bWFzayB8PSBCUk5GX1BLVF9UWVBFOworCX0KKworCW5mX2JyaWRnZS0+bWFzayB8PSBCUk5GX05GX0JSSURHRV9QUkVST1VUSU5HOworCW5mX2JyaWRnZS0+cGh5c2luZGV2ID0gc2tiLT5kZXY7CisJc2tiLT5kZXYgPSBicmlkZ2VfcGFyZW50KHNrYi0+ZGV2KTsKK30KKworLyogV2Ugb25seSBjaGVjayB0aGUgbGVuZ3RoLiBBIGJyaWRnZSBzaG91bGRuJ3QgZG8gYW55IGhvcC1ieS1ob3Agc3R1ZmYgYW55d2F5ICovCitzdGF0aWMgaW50IGNoZWNrX2hiaF9sZW4oc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1bnNpZ25lZCBjaGFyICpyYXcgPSAodTgqKShza2ItPm5oLmlwdjZoKzEpOworCXUzMiBwa3RfbGVuOworCWludCBvZmYgPSByYXcgLSBza2ItPm5oLnJhdzsKKwlpbnQgbGVuID0gKHJhd1sxXSsxKTw8MzsKKworCWlmICgocmF3ICsgbGVuKSAtIHNrYi0+ZGF0YSA+IHNrYl9oZWFkbGVuKHNrYikpCisJCWdvdG8gYmFkOworCisJb2ZmICs9IDI7CisJbGVuIC09IDI7CisKKwl3aGlsZSAobGVuID4gMCkgeworCQlpbnQgb3B0bGVuID0gcmF3W29mZisxXSsyOworCisJCXN3aXRjaCAoc2tiLT5uaC5yYXdbb2ZmXSkgeworCQljYXNlIElQVjZfVExWX1BBRDA6CisJCQlvcHRsZW4gPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBJUFY2X1RMVl9QQUROOgorCQkJYnJlYWs7CisKKwkJY2FzZSBJUFY2X1RMVl9KVU1CTzoKKwkJCWlmIChza2ItPm5oLnJhd1tvZmYrMV0gIT0gNCB8fCAob2ZmJjMpICE9IDIpCisJCQkJZ290byBiYWQ7CisKKwkJCXBrdF9sZW4gPSBudG9obCgqKHUzMiopKHNrYi0+bmgucmF3K29mZisyKSk7CisKKwkJCWlmIChwa3RfbGVuID4gc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKQorCQkJCWdvdG8gYmFkOworCQkJaWYgKHBrdF9sZW4gKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpIDwgc2tiLT5sZW4pIHsKKwkJCQlpZiAoX19wc2tiX3RyaW0oc2tiLAorCQkJCSAgICBwa3RfbGVuICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSkpCisJCQkJCWdvdG8gYmFkOworCQkJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykKKwkJCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAob3B0bGVuID4gbGVuKQorCQkJCWdvdG8gYmFkOworCQkJYnJlYWs7CisJCX0KKwkJb2ZmICs9IG9wdGxlbjsKKwkJbGVuIC09IG9wdGxlbjsKKwl9CisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gMDsKK2JhZDoKKwlyZXR1cm4gLTE7CisKK30KKworLyogUmVwbGljYXRlIHRoZSBjaGVja3MgdGhhdCBJUHY2IGRvZXMgb24gcGFja2V0IHJlY2VwdGlvbiBhbmQgcGFzcyB0aGUgcGFja2V0CisgKiB0byBpcDZ0YWJsZXMsIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBOQVQsIHNvIHRoaW5ncyBhcmUgZmFpcmx5IHNpbXBsZS4gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYnJfbmZfcHJlX3JvdXRpbmdfaXB2Nih1bnNpZ25lZCBpbnQgaG9vaywKKyAgIHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQoreworCXN0cnVjdCBpcHY2aGRyICpoZHI7CisJdTMyIHBrdF9sZW47CisJc3RydWN0IG5mX2JyaWRnZV9pbmZvICpuZl9icmlkZ2U7CisKKwlpZiAoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKQorCQlnb3RvIGluaGRyX2Vycm9yOworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSkpCisJCWdvdG8gaW5oZHJfZXJyb3I7CisKKwloZHIgPSBza2ItPm5oLmlwdjZoOworCisJaWYgKGhkci0+dmVyc2lvbiAhPSA2KQorCQlnb3RvIGluaGRyX2Vycm9yOworCisJcGt0X2xlbiA9IG50b2hzKGhkci0+cGF5bG9hZF9sZW4pOworCisJaWYgKHBrdF9sZW4gfHwgaGRyLT5uZXh0aGRyICE9IE5FWFRIRFJfSE9QKSB7CisJCWlmIChwa3RfbGVuICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSA+IHNrYi0+bGVuKQorCQkJZ290byBpbmhkcl9lcnJvcjsKKwkJaWYgKHBrdF9sZW4gKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpIDwgc2tiLT5sZW4pIHsKKwkJCWlmIChfX3Bza2JfdHJpbShza2IsIHBrdF9sZW4gKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKSkKKwkJCQlnb3RvIGluaGRyX2Vycm9yOworCQkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKQorCQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJfQorCX0KKwlpZiAoaGRyLT5uZXh0aGRyID09IE5FWFRIRFJfSE9QICYmIGNoZWNrX2hiaF9sZW4oc2tiKSkKKwkJCWdvdG8gaW5oZHJfZXJyb3I7CisKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCisJc2tiLT5uZl9kZWJ1ZyBePSAoMSA8PCBORl9JUDZfUFJFX1JPVVRJTkcpOworI2VuZGlmCisJaWYgKChuZl9icmlkZ2UgPSBuZl9icmlkZ2VfYWxsb2Moc2tiKSkgPT0gTlVMTCkKKwkJcmV0dXJuIE5GX0RST1A7CisJc2V0dXBfcHJlX3JvdXRpbmcoc2tiKTsKKworCU5GX0hPT0soUEZfSU5FVDYsIE5GX0lQNl9QUkVfUk9VVElORywgc2tiLCBza2ItPmRldiwgTlVMTCwKKwkJYnJfbmZfcHJlX3JvdXRpbmdfZmluaXNoX2lwdjYpOworCisJcmV0dXJuIE5GX1NUT0xFTjsKKworaW5oZHJfZXJyb3I6CisJcmV0dXJuIE5GX0RST1A7Cit9CisKKy8qIERpcmVjdCBJUHY2IHRyYWZmaWMgdG8gYnJfbmZfcHJlX3JvdXRpbmdfaXB2Ni4KKyAqIFJlcGxpY2F0ZSB0aGUgY2hlY2tzIHRoYXQgSVB2NCBkb2VzIG9uIHBhY2tldCByZWNlcHRpb24uCisgKiBTZXQgc2tiLT5kZXYgdG8gdGhlIGJyaWRnZSBkZXZpY2UgKGkuZS4gcGFyZW50IG9mIHRoZQorICogcmVjZWl2aW5nIGRldmljZSkgdG8gbWFrZSBuZXRmaWx0ZXIgaGFwcHksIHRoZSBSRURJUkVDVAorICogdGFyZ2V0IGluIHBhcnRpY3VsYXIuICBTYXZlIHRoZSBvcmlnaW5hbCBkZXN0aW5hdGlvbiBJUAorICogYWRkcmVzcyB0byBiZSBhYmxlIHRvIGRldGVjdCBETkFUIGFmdGVyd2FyZHMuICovCitzdGF0aWMgdW5zaWduZWQgaW50IGJyX25mX3ByZV9yb3V0aW5nKHVuc2lnbmVkIGludCBob29rLCBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwlfX3UzMiBsZW47CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpwc2tiOworCXN0cnVjdCBuZl9icmlkZ2VfaW5mbyAqbmZfYnJpZGdlOworCXN0cnVjdCB2bGFuX2V0aGhkciAqaGRyID0gdmxhbl9ldGhfaGRyKCpwc2tiKTsKKworCWlmIChza2ItPnByb3RvY29sID09IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVBWNikgfHwgSVNfVkxBTl9JUFY2KSB7CisjaWZkZWYgQ09ORklHX1NZU0NUTAorCQlpZiAoIWJybmZfY2FsbF9pcDZ0YWJsZXMpCisJCQlyZXR1cm4gTkZfQUNDRVBUOworI2VuZGlmCisJCWlmICgoc2tiID0gc2tiX3NoYXJlX2NoZWNrKCpwc2tiLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCisJCWlmIChza2ItPnByb3RvY29sID09IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyMVEpKSB7CisJCQlza2JfcHVsbChza2IsIFZMQU5fSExFTik7CisJCQkoc2tiKS0+bmgucmF3ICs9IFZMQU5fSExFTjsKKwkJfQorCQlyZXR1cm4gYnJfbmZfcHJlX3JvdXRpbmdfaXB2Nihob29rLCBza2IsIGluLCBvdXQsIG9rZm4pOworCX0KKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJaWYgKCFicm5mX2NhbGxfaXB0YWJsZXMpCisJCXJldHVybiBORl9BQ0NFUFQ7CisjZW5kaWYKKworCWlmIChza2ItPnByb3RvY29sICE9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApICYmICFJU19WTEFOX0lQKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJaWYgKChza2IgPSBza2Jfc2hhcmVfY2hlY2soKnBza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWlmIChza2ItPnByb3RvY29sID09IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyMVEpKSB7CisJCXNrYl9wdWxsKHNrYiwgVkxBTl9ITEVOKTsKKwkJKHNrYiktPm5oLnJhdyArPSBWTEFOX0hMRU47CisJfQorCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpKQorCQlnb3RvIGluaGRyX2Vycm9yOworCisJaXBoID0gc2tiLT5uaC5pcGg7CisJaWYgKGlwaC0+aWhsIDwgNSB8fCBpcGgtPnZlcnNpb24gIT0gNCkKKwkJZ290byBpbmhkcl9lcnJvcjsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIDQqaXBoLT5paGwpKQorCQlnb3RvIGluaGRyX2Vycm9yOworCisJaXBoID0gc2tiLT5uaC5pcGg7CisJaWYgKGlwX2Zhc3RfY3N1bSgoX191OCAqKWlwaCwgaXBoLT5paGwpICE9IDApCisJCWdvdG8gaW5oZHJfZXJyb3I7CisKKwlsZW4gPSBudG9ocyhpcGgtPnRvdF9sZW4pOworCWlmIChza2ItPmxlbiA8IGxlbiB8fCBsZW4gPCA0KmlwaC0+aWhsKQorCQlnb3RvIGluaGRyX2Vycm9yOworCisJaWYgKHNrYi0+bGVuID4gbGVuKSB7CisJCV9fcHNrYl90cmltKHNrYiwgbGVuKTsKKwkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKQorCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCX0KKworI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKKwlza2ItPm5mX2RlYnVnIF49ICgxIDw8IE5GX0lQX1BSRV9ST1VUSU5HKTsKKyNlbmRpZgorCWlmICgobmZfYnJpZGdlID0gbmZfYnJpZGdlX2FsbG9jKHNrYikpID09IE5VTEwpCisJCXJldHVybiBORl9EUk9QOworCXNldHVwX3ByZV9yb3V0aW5nKHNrYik7CisJc3RvcmVfb3JpZ19kc3RhZGRyKHNrYik7CisKKwlORl9IT09LKFBGX0lORVQsIE5GX0lQX1BSRV9ST1VUSU5HLCBza2IsIHNrYi0+ZGV2LCBOVUxMLAorCQlicl9uZl9wcmVfcm91dGluZ19maW5pc2gpOworCisJcmV0dXJuIE5GX1NUT0xFTjsKKworaW5oZHJfZXJyb3I6CisvLwlJUF9JTkNfU1RBVFNfQkgoSXBJbkhkckVycm9ycyk7CitvdXQ6CisJcmV0dXJuIE5GX0RST1A7Cit9CisKKworLyogUEZfQlJJREdFL0xPQ0FMX0lOICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRoZSBwYWNrZXQgaXMgbG9jYWxseSBkZXN0aW5lZCwgd2hpY2ggcmVxdWlyZXMgYSByZWFsCisgKiBkc3RfZW50cnksIHNvIGRldGFjaCB0aGUgZmFrZSBvbmUuICBPbiB0aGUgd2F5IHVwLCB0aGUKKyAqIHBhY2tldCB3b3VsZCBwYXNzIHRocm91Z2ggUFJFX1JPVVRJTkcgYWdhaW4gKHdoaWNoIGFscmVhZHkKKyAqIHRvb2sgcGxhY2Ugd2hlbiB0aGUgcGFja2V0IGVudGVyZWQgdGhlIGJyaWRnZSksIGJ1dCB3ZQorICogcmVnaXN0ZXIgYW4gSVB2NCBQUkVfUk9VVElORyAnc2Fib3RhZ2UnIGhvb2sgdGhhdCB3aWxsCisgKiBwcmV2ZW50IHRoaXMgZnJvbSBoYXBwZW5pbmcuICovCitzdGF0aWMgdW5zaWduZWQgaW50IGJyX25mX2xvY2FsX2luKHVuc2lnbmVkIGludCBob29rLCBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKnBza2I7CisKKwlpZiAoc2tiLT5kc3QgPT0gKHN0cnVjdCBkc3RfZW50cnkgKikmX19mYWtlX3J0YWJsZSkgeworCQlkc3RfcmVsZWFzZShza2ItPmRzdCk7CisJCXNrYi0+ZHN0ID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gTkZfQUNDRVBUOworfQorCisKKy8qIFBGX0JSSURHRS9GT1JXQVJEICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGJyX25mX2ZvcndhcmRfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5mX2JyaWRnZV9pbmZvICpuZl9icmlkZ2UgPSBza2ItPm5mX2JyaWRnZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqaW47CisJc3RydWN0IHZsYW5fZXRoaGRyICpoZHIgPSB2bGFuX2V0aF9oZHIoc2tiKTsKKworI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKKwlza2ItPm5mX2RlYnVnIF49ICgxIDw8IE5GX0JSX0ZPUldBUkQpOworI2VuZGlmCisKKwlpZiAoc2tiLT5wcm90b2NvbCAhPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0FSUCkgJiYgIUlTX1ZMQU5fQVJQKSB7CisJCWluID0gbmZfYnJpZGdlLT5waHlzaW5kZXY7CisJCWlmIChuZl9icmlkZ2UtPm1hc2sgJiBCUk5GX1BLVF9UWVBFKSB7CisJCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKKwkJCW5mX2JyaWRnZS0+bWFzayBePSBCUk5GX1BLVF9UWVBFOworCQl9CisJfSBlbHNlIHsKKwkJaW4gPSAqKChzdHJ1Y3QgbmV0X2RldmljZSAqKikoc2tiLT5jYikpOworCX0KKwlpZiAoc2tiLT5wcm90b2NvbCA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMjFRKSkgeworCQlza2JfcHVzaChza2IsIFZMQU5fSExFTik7CisJCXNrYi0+bmgucmF3IC09IFZMQU5fSExFTjsKKwl9CisJTkZfSE9PS19USFJFU0goUEZfQlJJREdFLCBORl9CUl9GT1JXQVJELCBza2IsIGluLAorCQkJc2tiLT5kZXYsIGJyX2ZvcndhcmRfZmluaXNoLCAxKTsKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBpcyB0aGUgJ3B1cmVseSBicmlkZ2VkJyBjYXNlLiAgRm9yIElQLCB3ZSBwYXNzIHRoZSBwYWNrZXQgdG8KKyAqIG5ldGZpbHRlciB3aXRoIGluZGV2IGFuZCBvdXRkZXYgc2V0IHRvIHRoZSBicmlkZ2UgZGV2aWNlLAorICogYnV0IHdlIGFyZSBzdGlsbCBhYmxlIHRvIGZpbHRlciBvbiB0aGUgJ3JlYWwnIGluZGV2L291dGRldgorICogYmVjYXVzZSBvZiB0aGUgcGh5c2RldiBtb2R1bGUuIEZvciBBUlAsIGluZGV2IGFuZCBvdXRkZXYgYXJlIHRoZQorICogYnJpZGdlIHBvcnRzLiAqLworc3RhdGljIHVuc2lnbmVkIGludCBicl9uZl9mb3J3YXJkX2lwKHVuc2lnbmVkIGludCBob29rLCBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKnBza2I7CisJc3RydWN0IG5mX2JyaWRnZV9pbmZvICpuZl9icmlkZ2U7CisJc3RydWN0IHZsYW5fZXRoaGRyICpoZHIgPSB2bGFuX2V0aF9oZHIoc2tiKTsKKwlpbnQgcGY7CisKKwlpZiAoIXNrYi0+bmZfYnJpZGdlKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJaWYgKHNrYi0+cHJvdG9jb2wgPT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCkgfHwgSVNfVkxBTl9JUCkKKwkJcGYgPSBQRl9JTkVUOworCWVsc2UKKwkJcGYgPSBQRl9JTkVUNjsKKworCWlmIChza2ItPnByb3RvY29sID09IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyMVEpKSB7CisJCXNrYl9wdWxsKCpwc2tiLCBWTEFOX0hMRU4pOworCQkoKnBza2IpLT5uaC5yYXcgKz0gVkxBTl9ITEVOOworCX0KKworI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKKwlza2ItPm5mX2RlYnVnIF49ICgxIDw8IE5GX0JSX0ZPUldBUkQpOworI2VuZGlmCisJbmZfYnJpZGdlID0gc2tiLT5uZl9icmlkZ2U7CisJaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09USEVSSE9TVCkgeworCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CisJCW5mX2JyaWRnZS0+bWFzayB8PSBCUk5GX1BLVF9UWVBFOworCX0KKworCS8qIFRoZSBwaHlzZGV2IG1vZHVsZSBjaGVja3Mgb24gdGhpcyAqLworCW5mX2JyaWRnZS0+bWFzayB8PSBCUk5GX0JSSURHRUQ7CisJbmZfYnJpZGdlLT5waHlzb3V0ZGV2ID0gc2tiLT5kZXY7CisKKwlORl9IT09LKHBmLCBORl9JUF9GT1JXQVJELCBza2IsIGJyaWRnZV9wYXJlbnQoaW4pLAorCQlicmlkZ2VfcGFyZW50KG91dCksIGJyX25mX2ZvcndhcmRfZmluaXNoKTsKKworCXJldHVybiBORl9TVE9MRU47Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYnJfbmZfZm9yd2FyZF9hcnAodW5zaWduZWQgaW50IGhvb2ssIHN0cnVjdCBza19idWZmICoqcHNrYiwKKyAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSAqcHNrYjsKKwlzdHJ1Y3Qgdmxhbl9ldGhoZHIgKmhkciA9IHZsYW5fZXRoX2hkcihza2IpOworCXN0cnVjdCBuZXRfZGV2aWNlICoqZCA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKikoc2tiLT5jYik7CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJaWYgKCFicm5mX2NhbGxfYXJwdGFibGVzKQorCQlyZXR1cm4gTkZfQUNDRVBUOworI2VuZGlmCisKKwlpZiAoc2tiLT5wcm90b2NvbCAhPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0FSUCkpIHsKKwkJaWYgKCFJU19WTEFOX0FSUCkKKwkJCXJldHVybiBORl9BQ0NFUFQ7CisJCXNrYl9wdWxsKCpwc2tiLCBWTEFOX0hMRU4pOworCQkoKnBza2IpLT5uaC5yYXcgKz0gVkxBTl9ITEVOOworCX0KKworI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKKwlza2ItPm5mX2RlYnVnIF49ICgxIDw8IE5GX0JSX0ZPUldBUkQpOworI2VuZGlmCisKKwlpZiAoc2tiLT5uaC5hcnBoLT5hcl9wbG4gIT0gNCkgeworCQlpZiAoSVNfVkxBTl9BUlApIHsKKwkJCXNrYl9wdXNoKCpwc2tiLCBWTEFOX0hMRU4pOworCQkJKCpwc2tiKS0+bmgucmF3IC09IFZMQU5fSExFTjsKKwkJfQorCQlyZXR1cm4gTkZfQUNDRVBUOworCX0KKwkqZCA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWluOworCU5GX0hPT0soTkZfQVJQLCBORl9BUlBfRk9SV0FSRCwgc2tiLCAoc3RydWN0IG5ldF9kZXZpY2UgKilpbiwKKwkJKHN0cnVjdCBuZXRfZGV2aWNlICopb3V0LCBicl9uZl9mb3J3YXJkX2ZpbmlzaCk7CisKKwlyZXR1cm4gTkZfU1RPTEVOOworfQorCisKKy8qIFBGX0JSSURHRS9MT0NBTF9PVVQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGJyX25mX2xvY2FsX291dF9maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCisJc2tiLT5uZl9kZWJ1ZyAmPSB+KDEgPDwgTkZfQlJfTE9DQUxfT1VUKTsKKyNlbmRpZgorCWlmIChza2ItPnByb3RvY29sID09IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyMVEpKSB7CisJCXNrYl9wdXNoKHNrYiwgVkxBTl9ITEVOKTsKKwkJc2tiLT5uaC5yYXcgLT0gVkxBTl9ITEVOOworCX0KKworCU5GX0hPT0tfVEhSRVNIKFBGX0JSSURHRSwgTkZfQlJfTE9DQUxfT1VULCBza2IsIE5VTEwsIHNrYi0+ZGV2LAorCQkJYnJfZm9yd2FyZF9maW5pc2gsIE5GX0JSX1BSSV9GSVJTVCArIDEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gc2VlcyBib3RoIGxvY2FsbHkgb3JpZ2luYXRlZCBJUCBwYWNrZXRzIGFuZCBmb3J3YXJkZWQKKyAqIElQIHBhY2tldHMgKGluIGJvdGggY2FzZXMgdGhlIGRlc3RpbmF0aW9uIGRldmljZSBpcyBhIGJyaWRnZQorICogZGV2aWNlKS4gSXQgYWxzbyBzZWVzIGJyaWRnZWQtYW5kLUROQVQnZWQgcGFja2V0cy4KKyAqIFRvIGJlIGFibGUgdG8gZmlsdGVyIG9uIHRoZSBwaHlzaWNhbCBicmlkZ2UgZGV2aWNlcyAod2l0aCB0aGUgcGh5c2RldgorICogbW9kdWxlKSwgd2Ugc3RlYWwgcGFja2V0cyBkZXN0aW5lZCB0byBhIGJyaWRnZSBkZXZpY2UgYXdheSBmcm9tIHRoZQorICogUEZfSU5FVC9GT1JXQVJEIGFuZCBQRl9JTkVUL09VVFBVVCBob29rIGZ1bmN0aW9ucywgYW5kIGdpdmUgdGhlbSBiYWNrIGxhdGVyLAorICogd2hlbiB3ZSBoYXZlIGRldGVybWluZWQgdGhlIHJlYWwgb3V0cHV0IGRldmljZS4gVGhpcyBpcyBkb25lIGluIGhlcmUuCisgKgorICogSWYgKG5mX2JyaWRnZS0+bWFzayAmIEJSTkZfQlJJREdFRF9ETkFUKSB0aGVuIHRoZSBwYWNrZXQgaXMgYnJpZGdlZAorICogYW5kIHdlIGZha2UgdGhlIFBGX0JSSURHRS9GT1JXQVJEIGhvb2suIFRoZSBmdW5jdGlvbiBicl9uZl9mb3J3YXJkKCkKKyAqIHdpbGwgdGhlbiBmYWtlIHRoZSBQRl9JTkVUL0ZPUldBUkQgaG9vay4gYnJfbmZfbG9jYWxfb3V0KCkgaGFzIHByaW9yaXR5CisgKiBORl9CUl9QUklfRklSU1QsIHNvIG5vIHJlbGV2YW50IFBGX0JSSURHRS9JTlBVVCBmdW5jdGlvbnMgaGF2ZSBiZWVuIG5vcgorICogd2lsbCBiZSBleGVjdXRlZC4KKyAqIE90aGVyd2lzZSwgaWYgbmZfYnJpZGdlLT5waHlzaW5kZXYgaXMgTlVMTCwgdGhlIGJyaWRnZS1uZiBjb2RlIG5ldmVyIHRvdWNoZWQKKyAqIHRoaXMgcGFja2V0IGJlZm9yZSwgYW5kIHNvIHRoZSBwYWNrZXQgd2FzIGxvY2FsbHkgb3JpZ2luYXRlZC4gV2UgZmFrZQorICogdGhlIFBGX0lORVQvTE9DQUxfT1VUIGhvb2suCisgKiBGaW5hbGx5LCBpZiBuZl9icmlkZ2UtPnBoeXNpbmRldiBpc24ndCBOVUxMLCB0aGVuIHRoZSBwYWNrZXQgd2FzIElQIHJvdXRlZCwKKyAqIHNvIHdlIGZha2UgdGhlIFBGX0lORVQvRk9SV0FSRCBob29rLiBpcF9zYWJvdGFnZV9vdXQoKSBtYWtlcyBzdXJlCisgKiBldmVuIHJvdXRlZCBwYWNrZXRzIHRoYXQgZGlkbid0IGFycml2ZSBvbiBhIGJyaWRnZSBpbnRlcmZhY2UgaGF2ZSB0aGVpcgorICogbmZfYnJpZGdlLT5waHlzaW5kZXYgc2V0LiAqLworc3RhdGljIHVuc2lnbmVkIGludCBicl9uZl9sb2NhbF9vdXQodW5zaWduZWQgaW50IGhvb2ssIHN0cnVjdCBza19idWZmICoqcHNrYiwKKyAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsaW5kZXYsICpyZWFsb3V0ZGV2OworCXN0cnVjdCBza19idWZmICpza2IgPSAqcHNrYjsKKwlzdHJ1Y3QgbmZfYnJpZGdlX2luZm8gKm5mX2JyaWRnZTsKKwlzdHJ1Y3Qgdmxhbl9ldGhoZHIgKmhkciA9IHZsYW5fZXRoX2hkcihza2IpOworCWludCBwZjsKKworCWlmICghc2tiLT5uZl9icmlkZ2UpCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwlpZiAoc2tiLT5wcm90b2NvbCA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKSB8fCBJU19WTEFOX0lQKQorCQlwZiA9IFBGX0lORVQ7CisJZWxzZQorCQlwZiA9IFBGX0lORVQ2OworCisjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRworCS8qIFNvbWV0aW1lcyB3ZSBnZXQgcGFja2V0cyB3aXRoIE5VTEwgLT5kc3QgaGVyZSAoZm9yIGV4YW1wbGUsCisJICogcnVubmluZyBhIGRoY3AgY2xpZW50IGRhZW1vbiB0cmlnZ2VycyB0aGlzKS4gVGhpcyBzaG91bGQgbm93CisJICogYmUgZml4ZWQsIGJ1dCBsZXQncyBrZWVwIHRoZSBjaGVjayBhcm91bmQuICovCisJaWYgKHNrYi0+ZHN0ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiYnJfbmV0ZmlsdGVyOiBza2ItPmRzdCA9PSBOVUxMLiIpOworCQlyZXR1cm4gTkZfQUNDRVBUOworCX0KKyNlbmRpZgorCisJbmZfYnJpZGdlID0gc2tiLT5uZl9icmlkZ2U7CisJbmZfYnJpZGdlLT5waHlzb3V0ZGV2ID0gc2tiLT5kZXY7CisJcmVhbGluZGV2ID0gbmZfYnJpZGdlLT5waHlzaW5kZXY7CisKKwkvKiBCcmlkZ2VkLCB0YWtlIFBGX0JSSURHRS9GT1JXQVJELgorCSAqIChzZWUgYmlnIG5vdGUgaW4gZnJvbnQgb2YgYnJfbmZfcHJlX3JvdXRpbmdfZmluaXNoKSAqLworCWlmIChuZl9icmlkZ2UtPm1hc2sgJiBCUk5GX0JSSURHRURfRE5BVCkgeworCQlpZiAobmZfYnJpZGdlLT5tYXNrICYgQlJORl9QS1RfVFlQRSkgeworCQkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CisJCQluZl9icmlkZ2UtPm1hc2sgXj0gQlJORl9QS1RfVFlQRTsKKwkJfQorCQlpZiAoc2tiLT5wcm90b2NvbCA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMjFRKSkgeworCQkJc2tiX3B1c2goc2tiLCBWTEFOX0hMRU4pOworCQkJc2tiLT5uaC5yYXcgLT0gVkxBTl9ITEVOOworCQl9CisKKwkJTkZfSE9PSyhQRl9CUklER0UsIE5GX0JSX0ZPUldBUkQsIHNrYiwgcmVhbGluZGV2LAorCQkJc2tiLT5kZXYsIGJyX2ZvcndhcmRfZmluaXNoKTsKKwkJZ290byBvdXQ7CisJfQorCXJlYWxvdXRkZXYgPSBicmlkZ2VfcGFyZW50KHNrYi0+ZGV2KTsKKworI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQorCS8qIGlwdGFibGVzIHNob3VsZCBtYXRjaCAtbyBicjAueCAqLworCWlmIChuZl9icmlkZ2UtPm5ldG91dGRldikKKwkJcmVhbG91dGRldiA9IG5mX2JyaWRnZS0+bmV0b3V0ZGV2OworI2VuZGlmCisJaWYgKHNrYi0+cHJvdG9jb2wgPT0gX19jb25zdGFudF9odG9ucyhFVEhfUF84MDIxUSkpIHsKKwkJc2tiX3B1bGwoc2tiLCBWTEFOX0hMRU4pOworCQkoKnBza2IpLT5uaC5yYXcgKz0gVkxBTl9ITEVOOworCX0KKwkvKiBJUCBmb3J3YXJkZWQgdHJhZmZpYyBoYXMgYSBwaHlzaW5kZXYsIGxvY2FsbHkKKwkgKiBnZW5lcmF0ZWQgdHJhZmZpYyBoYXNuJ3QuICovCisJaWYgKHJlYWxpbmRldiAhPSBOVUxMKSB7CisJCWlmICghKG5mX2JyaWRnZS0+bWFzayAmIEJSTkZfRE9OVF9UQUtFX1BBUkVOVCkgJiYKKwkJICAgIGhhc19icmlkZ2VfcGFyZW50KHJlYWxpbmRldikpCisJCQlyZWFsaW5kZXYgPSBicmlkZ2VfcGFyZW50KHJlYWxpbmRldik7CisKKwkJTkZfSE9PS19USFJFU0gocGYsIE5GX0lQX0ZPUldBUkQsIHNrYiwgcmVhbGluZGV2LAorCQkJICAgICAgIHJlYWxvdXRkZXYsIGJyX25mX2xvY2FsX291dF9maW5pc2gsCisJCQkgICAgICAgTkZfSVBfUFJJX0JSSURHRV9TQUJPVEFHRV9GT1JXQVJEICsgMSk7CisJfSBlbHNlIHsKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCisJCXNrYi0+bmZfZGVidWcgXj0gKDEgPDwgTkZfSVBfTE9DQUxfT1VUKTsKKyNlbmRpZgorCisJCU5GX0hPT0tfVEhSRVNIKHBmLCBORl9JUF9MT0NBTF9PVVQsIHNrYiwgcmVhbGluZGV2LAorCQkJICAgICAgIHJlYWxvdXRkZXYsIGJyX25mX2xvY2FsX291dF9maW5pc2gsCisJCQkgICAgICAgTkZfSVBfUFJJX0JSSURHRV9TQUJPVEFHRV9MT0NBTF9PVVQgKyAxKTsKKwl9CisKK291dDoKKwlyZXR1cm4gTkZfU1RPTEVOOworfQorCisKKy8qIFBGX0JSSURHRS9QT1NUX1JPVVRJTkcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdW5zaWduZWQgaW50IGJyX25mX3Bvc3Rfcm91dGluZyh1bnNpZ25lZCBpbnQgaG9vaywgc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpwc2tiOworCXN0cnVjdCBuZl9icmlkZ2VfaW5mbyAqbmZfYnJpZGdlID0gKCpwc2tiKS0+bmZfYnJpZGdlOworCXN0cnVjdCB2bGFuX2V0aGhkciAqaGRyID0gdmxhbl9ldGhfaGRyKHNrYik7CisJc3RydWN0IG5ldF9kZXZpY2UgKnJlYWxvdXRkZXYgPSBicmlkZ2VfcGFyZW50KHNrYi0+ZGV2KTsKKwlpbnQgcGY7CisKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCisJLyogQmUgdmVyeSBwYXJhbm9pZC4gVGhpcyBwcm9iYWJseSB3b24ndCBoYXBwZW4gYW55bW9yZSwgYnV0IGxldCdzCisJICoga2VlcCB0aGUgY2hlY2sganVzdCB0byBiZSBzdXJlLi4uICovCisJaWYgKHNrYi0+bWFjLnJhdyA8IHNrYi0+aGVhZCB8fCBza2ItPm1hYy5yYXcgKyBFVEhfSExFTiA+IHNrYi0+ZGF0YSkgeworCQlwcmludGsoS0VSTl9DUklUICJicl9uZXRmaWx0ZXI6IEFyZ2ghISBicl9uZl9wb3N0X3JvdXRpbmc6ICIKKwkJCQkgImJhZCBtYWMucmF3IHBvaW50ZXIuIik7CisJCWdvdG8gcHJpbnRfZXJyb3I7CisJfQorI2VuZGlmCisKKwlpZiAoIW5mX2JyaWRnZSkKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKworCWlmIChza2ItPnByb3RvY29sID09IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApIHx8IElTX1ZMQU5fSVApCisJCXBmID0gUEZfSU5FVDsKKwllbHNlCisJCXBmID0gUEZfSU5FVDY7CisKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCisJaWYgKHNrYi0+ZHN0ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiYnJfbmV0ZmlsdGVyOiBza2ItPmRzdCA9PSBOVUxMLiIpOworCQlnb3RvIHByaW50X2Vycm9yOworCX0KKworCXNrYi0+bmZfZGVidWcgXj0gKDEgPDwgTkZfSVBfUE9TVF9ST1VUSU5HKTsKKyNlbmRpZgorCisJLyogV2UgYXNzdW1lIGFueSBjb2RlIGZyb20gYnJfZGV2X3F1ZXVlX3B1c2hfeG1pdCBvbndhcmRzIGRvZXNuJ3QgY2FyZQorCSAqIGFib3V0IHRoZSB2YWx1ZSBvZiBza2ItPnBrdF90eXBlLiAqLworCWlmIChza2ItPnBrdF90eXBlID09IFBBQ0tFVF9PVEhFUkhPU1QpIHsKKwkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOworCQluZl9icmlkZ2UtPm1hc2sgfD0gQlJORl9QS1RfVFlQRTsKKwl9CisKKwlpZiAoc2tiLT5wcm90b2NvbCA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMjFRKSkgeworCQlza2JfcHVsbChza2IsIFZMQU5fSExFTik7CisJCXNrYi0+bmgucmF3ICs9IFZMQU5fSExFTjsKKwl9CisKKwluZl9icmlkZ2Vfc2F2ZV9oZWFkZXIoc2tiKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQorCWlmIChuZl9icmlkZ2UtPm5ldG91dGRldikKKwkJcmVhbG91dGRldiA9IG5mX2JyaWRnZS0+bmV0b3V0ZGV2OworI2VuZGlmCisJTkZfSE9PSyhwZiwgTkZfSVBfUE9TVF9ST1VUSU5HLCBza2IsIE5VTEwsIHJlYWxvdXRkZXYsCisJICAgICAgICBicl9kZXZfcXVldWVfcHVzaF94bWl0KTsKKworCXJldHVybiBORl9TVE9MRU47CisKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCitwcmludF9lcnJvcjoKKwlpZiAoc2tiLT5kZXYgIT0gTlVMTCkgeworCQlwcmludGsoIlslc10iLCBza2ItPmRldi0+bmFtZSk7CisJCWlmIChoYXNfYnJpZGdlX3BhcmVudChza2ItPmRldikpCisJCQlwcmludGsoIlslc10iLCBicmlkZ2VfcGFyZW50KHNrYi0+ZGV2KS0+bmFtZSk7CisJfQorCXByaW50aygiIGhlYWQ6JXAsIHJhdzolcCwgZGF0YTolcFxuIiwgc2tiLT5oZWFkLCBza2ItPm1hYy5yYXcsCisJCQkJCSAgICAgIHNrYi0+ZGF0YSk7CisJcmV0dXJuIE5GX0FDQ0VQVDsKKyNlbmRpZgorfQorCisKKy8qIElQL1NBQk9UQUdFICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRG9uJ3QgaGFuZCBsb2NhbGx5IGRlc3RpbmVkIHBhY2tldHMgdG8gUEZfSU5FVCg2KS9QUkVfUk9VVElORworICogZm9yIHRoZSBzZWNvbmQgdGltZS4gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXBfc2Fib3RhZ2VfaW4odW5zaWduZWQgaW50IGhvb2ssIHN0cnVjdCBza19idWZmICoqcHNrYiwKKyAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQoreworCWlmICgoKnBza2IpLT5uZl9icmlkZ2UgJiYKKwkgICAgISgoKnBza2IpLT5uZl9icmlkZ2UtPm1hc2sgJiBCUk5GX05GX0JSSURHRV9QUkVST1VUSU5HKSkgeworCQlyZXR1cm4gTkZfU1RPUDsKKwl9CisKKwlyZXR1cm4gTkZfQUNDRVBUOworfQorCisvKiBQb3N0cG9uZSBleGVjdXRpb24gb2YgUEZfSU5FVCg2KS9GT1JXQVJELCBQRl9JTkVUKDYpL0xPQ0FMX09VVAorICogYW5kIFBGX0lORVQoNikvUE9TVF9ST1VUSU5HIHVudGlsIHdlIGhhdmUgZG9uZSB0aGUgZm9yd2FyZGluZworICogZGVjaXNpb24gaW4gdGhlIGJyaWRnZSBjb2RlIGFuZCBoYXZlIGRldGVybWluZWQgbmZfYnJpZGdlLT5waHlzb3V0ZGV2LiAqLworc3RhdGljIHVuc2lnbmVkIGludCBpcF9zYWJvdGFnZV9vdXQodW5zaWduZWQgaW50IGhvb2ssIHN0cnVjdCBza19idWZmICoqcHNrYiwKKyAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSAqcHNrYjsKKworCWlmICgob3V0LT5oYXJkX3N0YXJ0X3htaXQgPT0gYnJfZGV2X3htaXQgJiYKKwkgICAgb2tmbiAhPSBicl9uZl9mb3J3YXJkX2ZpbmlzaCAmJgorCSAgICBva2ZuICE9IGJyX25mX2xvY2FsX291dF9maW5pc2ggJiYKKwkgICAgb2tmbiAhPSBicl9kZXZfcXVldWVfcHVzaF94bWl0KQorI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQorCSAgICB8fCAoKG91dC0+cHJpdl9mbGFncyAmIElGRl84MDJfMVFfVkxBTikgJiYKKwkgICAgVkxBTl9ERVZfSU5GTyhvdXQpLT5yZWFsX2Rldi0+aGFyZF9zdGFydF94bWl0ID09IGJyX2Rldl94bWl0KQorI2VuZGlmCisJICAgICkgeworCQlzdHJ1Y3QgbmZfYnJpZGdlX2luZm8gKm5mX2JyaWRnZTsKKworCQlpZiAoIXNrYi0+bmZfYnJpZGdlKSB7CisjaWZkZWYgQ09ORklHX1NZU0NUTAorCQkJLyogVGhpcyBjb2RlIGlzIGV4ZWN1dGVkIHdoaWxlIGluIHRoZSBJUCh2Nikgc3RhY2ssCisJCQkgICB0aGUgdmVyc2lvbiBzaG91bGQgYmUgNCBvciA2LiBXZSBjYW4ndCB1c2UKKwkJCSAgIHNrYi0+cHJvdG9jb2wgYmVjYXVzZSB0aGF0IGlzbid0IHNldCBvbgorCQkJICAgUEZfSU5FVCg2KS9MT0NBTF9PVVQuICovCisJCQlzdHJ1Y3QgaXBoZHIgKmlwID0gc2tiLT5uaC5pcGg7CisKKwkJCWlmIChpcC0+dmVyc2lvbiA9PSA0ICYmICFicm5mX2NhbGxfaXB0YWJsZXMpCisJCQkJcmV0dXJuIE5GX0FDQ0VQVDsKKwkJCWVsc2UgaWYgKGlwLT52ZXJzaW9uID09IDYgJiYgIWJybmZfY2FsbF9pcDZ0YWJsZXMpCisJCQkJcmV0dXJuIE5GX0FDQ0VQVDsKKyNlbmRpZgorCQkJaWYgKGhvb2sgPT0gTkZfSVBfUE9TVF9ST1VUSU5HKQorCQkJCXJldHVybiBORl9BQ0NFUFQ7CisJCQlpZiAoIW5mX2JyaWRnZV9hbGxvYyhza2IpKQorCQkJCXJldHVybiBORl9EUk9QOworCQl9CisKKwkJbmZfYnJpZGdlID0gc2tiLT5uZl9icmlkZ2U7CisKKwkJLyogVGhpcyBmcmFtZSB3aWxsIGFycml2ZSBvbiBQRl9CUklER0UvTE9DQUxfT1VUIGFuZCB3ZQorCQkgKiB3aWxsIG5lZWQgdGhlIGluZGV2IHRoZW4uIEZvciBhIGJyb3V0ZXIsIHRoZSByZWFsIGluZGV2CisJCSAqIGNhbiBiZSBhIGJyaWRnZSBwb3J0LCBzbyB3ZSBtYWtlIHN1cmUgYnJfbmZfbG9jYWxfb3V0KCkKKwkJICogZG9lc24ndCB1c2UgdGhlIGJyaWRnZSBwYXJlbnQgb2YgdGhlIGluZGV2IGJ5IHVzaW5nCisJCSAqIHRoZSBCUk5GX0RPTlRfVEFLRV9QQVJFTlQgbWFzay4gKi8KKwkJaWYgKGhvb2sgPT0gTkZfSVBfRk9SV0FSRCAmJiBuZl9icmlkZ2UtPnBoeXNpbmRldiA9PSBOVUxMKSB7CisJCQluZl9icmlkZ2UtPm1hc2sgJj0gQlJORl9ET05UX1RBS0VfUEFSRU5UOworCQkJbmZfYnJpZGdlLT5waHlzaW5kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilpbjsKKwkJfQorI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQorCQkvKiB0aGUgaXB0YWJsZXMgb3V0ZGV2IGlzIGJyMC54LCBub3QgYnIwICovCisJCWlmIChvdXQtPnByaXZfZmxhZ3MgJiBJRkZfODAyXzFRX1ZMQU4pCisJCQluZl9icmlkZ2UtPm5ldG91dGRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKW91dDsKKyNlbmRpZgorCQlyZXR1cm4gTkZfU1RPUDsKKwl9CisKKwlyZXR1cm4gTkZfQUNDRVBUOworfQorCisvKiBGb3IgYnJfbmZfbG9jYWxfb3V0IHdlIG5lZWQgKHByaW8gPSBORl9CUl9QUklfRklSU1QpLCB0byBpbnN1cmUgdGhhdCBpbm5vY2VudAorICogUEZfQlJJREdFL05GX0JSX0xPQ0FMX09VVCBmdW5jdGlvbnMgZG9uJ3QgZ2V0IGJyaWRnZWQgdHJhZmZpYyBhcyBpbnB1dC4KKyAqIEZvciBicl9uZl9wb3N0X3JvdXRpbmcsIHdlIG5lZWQgKHByaW8gPSBORl9CUl9QUklfTEFTVCksIGJlY2F1c2UKKyAqIGlwX3JlZnJhZygpIGNhbiByZXR1cm4gTkZfU1RPTEVOLiAqLworc3RhdGljIHN0cnVjdCBuZl9ob29rX29wcyBicl9uZl9vcHNbXSA9IHsKKwl7IC5ob29rID0gYnJfbmZfcHJlX3JvdXRpbmcsIAorCSAgLm93bmVyID0gVEhJU19NT0RVTEUsIAorCSAgLnBmID0gUEZfQlJJREdFLCAKKwkgIC5ob29rbnVtID0gTkZfQlJfUFJFX1JPVVRJTkcsIAorCSAgLnByaW9yaXR5ID0gTkZfQlJfUFJJX0JSTkYsIH0sCisJeyAuaG9vayA9IGJyX25mX2xvY2FsX2luLAorCSAgLm93bmVyID0gVEhJU19NT0RVTEUsCisJICAucGYgPSBQRl9CUklER0UsCisJICAuaG9va251bSA9IE5GX0JSX0xPQ0FMX0lOLAorCSAgLnByaW9yaXR5ID0gTkZfQlJfUFJJX0JSTkYsIH0sCisJeyAuaG9vayA9IGJyX25mX2ZvcndhcmRfaXAsCisJICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkgIC5wZiA9IFBGX0JSSURHRSwKKwkgIC5ob29rbnVtID0gTkZfQlJfRk9SV0FSRCwKKwkgIC5wcmlvcml0eSA9IE5GX0JSX1BSSV9CUk5GIC0gMSwgfSwKKwl7IC5ob29rID0gYnJfbmZfZm9yd2FyZF9hcnAsCisJICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkgIC5wZiA9IFBGX0JSSURHRSwKKwkgIC5ob29rbnVtID0gTkZfQlJfRk9SV0FSRCwKKwkgIC5wcmlvcml0eSA9IE5GX0JSX1BSSV9CUk5GLCB9LAorCXsgLmhvb2sgPSBicl9uZl9sb2NhbF9vdXQsCisJICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkgIC5wZiA9IFBGX0JSSURHRSwKKwkgIC5ob29rbnVtID0gTkZfQlJfTE9DQUxfT1VULAorCSAgLnByaW9yaXR5ID0gTkZfQlJfUFJJX0ZJUlNULCB9LAorCXsgLmhvb2sgPSBicl9uZl9wb3N0X3JvdXRpbmcsCisJICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkgIC5wZiA9IFBGX0JSSURHRSwKKwkgIC5ob29rbnVtID0gTkZfQlJfUE9TVF9ST1VUSU5HLAorCSAgLnByaW9yaXR5ID0gTkZfQlJfUFJJX0xBU1QsIH0sCisJeyAuaG9vayA9IGlwX3NhYm90YWdlX2luLAorCSAgLm93bmVyID0gVEhJU19NT0RVTEUsCisJICAucGYgPSBQRl9JTkVULAorCSAgLmhvb2tudW0gPSBORl9JUF9QUkVfUk9VVElORywKKwkgIC5wcmlvcml0eSA9IE5GX0lQX1BSSV9GSVJTVCwgfSwKKwl7IC5ob29rID0gaXBfc2Fib3RhZ2VfaW4sCisJICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkgIC5wZiA9IFBGX0lORVQ2LAorCSAgLmhvb2tudW0gPSBORl9JUDZfUFJFX1JPVVRJTkcsCisJICAucHJpb3JpdHkgPSBORl9JUDZfUFJJX0ZJUlNULCB9LAorCXsgLmhvb2sgPSBpcF9zYWJvdGFnZV9vdXQsCisJICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkgIC5wZiA9IFBGX0lORVQsCisJICAuaG9va251bSA9IE5GX0lQX0ZPUldBUkQsCisJICAucHJpb3JpdHkgPSBORl9JUF9QUklfQlJJREdFX1NBQk9UQUdFX0ZPUldBUkQsIH0sCisJeyAuaG9vayA9IGlwX3NhYm90YWdlX291dCwKKwkgIC5vd25lciA9IFRISVNfTU9EVUxFLAorCSAgLnBmID0gUEZfSU5FVDYsCisJICAuaG9va251bSA9IE5GX0lQNl9GT1JXQVJELAorCSAgLnByaW9yaXR5ID0gTkZfSVA2X1BSSV9CUklER0VfU0FCT1RBR0VfRk9SV0FSRCwgfSwKKwl7IC5ob29rID0gaXBfc2Fib3RhZ2Vfb3V0LAorCSAgLm93bmVyID0gVEhJU19NT0RVTEUsCisJICAucGYgPSBQRl9JTkVULAorCSAgLmhvb2tudW0gPSBORl9JUF9MT0NBTF9PVVQsCisJICAucHJpb3JpdHkgPSBORl9JUF9QUklfQlJJREdFX1NBQk9UQUdFX0xPQ0FMX09VVCwgfSwKKwl7IC5ob29rID0gaXBfc2Fib3RhZ2Vfb3V0LAorCSAgLm93bmVyID0gVEhJU19NT0RVTEUsCisJICAucGYgPSBQRl9JTkVUNiwKKwkgIC5ob29rbnVtID0gTkZfSVA2X0xPQ0FMX09VVCwKKwkgIC5wcmlvcml0eSA9IE5GX0lQNl9QUklfQlJJREdFX1NBQk9UQUdFX0xPQ0FMX09VVCwgfSwKKwl7IC5ob29rID0gaXBfc2Fib3RhZ2Vfb3V0LAorCSAgLm93bmVyID0gVEhJU19NT0RVTEUsCisJICAucGYgPSBQRl9JTkVULAorCSAgLmhvb2tudW0gPSBORl9JUF9QT1NUX1JPVVRJTkcsCisJICAucHJpb3JpdHkgPSBORl9JUF9QUklfRklSU1QsIH0sCisJeyAuaG9vayA9IGlwX3NhYm90YWdlX291dCwKKwkgIC5vd25lciA9IFRISVNfTU9EVUxFLAorCSAgLnBmID0gUEZfSU5FVDYsCisJICAuaG9va251bSA9IE5GX0lQNl9QT1NUX1JPVVRJTkcsCisJICAucHJpb3JpdHkgPSBORl9JUDZfUFJJX0ZJUlNULCB9LAorfTsKKworI2lmZGVmIENPTkZJR19TWVNDVEwKK3N0YXRpYworaW50IGJybmZfc3lzY3RsX2NhbGxfdGFibGVzKGN0bF90YWJsZSAqY3RsLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICogZmlscCwKKwkJCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQoreworCWludCByZXQ7CisKKwlyZXQgPSBwcm9jX2RvaW50dmVjKGN0bCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisKKwlpZiAod3JpdGUgJiYgKihpbnQgKikoY3RsLT5kYXRhKSkKKwkJKihpbnQgKikoY3RsLT5kYXRhKSA9IDE7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGN0bF90YWJsZSBicm5mX3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBORVRfQlJJREdFX05GX0NBTExfQVJQVEFCTEVTLAorCQkucHJvY25hbWUJPSAiYnJpZGdlLW5mLWNhbGwtYXJwdGFibGVzIiwKKwkJLmRhdGEJCT0gJmJybmZfY2FsbF9hcnB0YWJsZXMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmYnJuZl9zeXNjdGxfY2FsbF90YWJsZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9CUklER0VfTkZfQ0FMTF9JUFRBQkxFUywKKwkJLnByb2NuYW1lCT0gImJyaWRnZS1uZi1jYWxsLWlwdGFibGVzIiwKKwkJLmRhdGEJCT0gJmJybmZfY2FsbF9pcHRhYmxlcywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZicm5mX3N5c2N0bF9jYWxsX3RhYmxlcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0JSSURHRV9ORl9DQUxMX0lQNlRBQkxFUywKKwkJLnByb2NuYW1lCT0gImJyaWRnZS1uZi1jYWxsLWlwNnRhYmxlcyIsCisJCS5kYXRhCQk9ICZicm5mX2NhbGxfaXA2dGFibGVzLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJmJybmZfc3lzY3RsX2NhbGxfdGFibGVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfQlJJREdFX05GX0ZJTFRFUl9WTEFOX1RBR0dFRCwKKwkJLnByb2NuYW1lCT0gImJyaWRnZS1uZi1maWx0ZXItdmxhbi10YWdnZWQiLAorCQkuZGF0YQkJPSAmYnJuZl9maWx0ZXJfdmxhbl90YWdnZWQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmYnJuZl9zeXNjdGxfY2FsbF90YWJsZXMsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIGN0bF90YWJsZSBicm5mX2JyaWRnZV90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0JSSURHRSwKKwkJLnByb2NuYW1lCT0gImJyaWRnZSIsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSBicm5mX3RhYmxlLAorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3N0YXRpYyBjdGxfdGFibGUgYnJuZl9uZXRfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9ORVQsCisJCS5wcm9jbmFtZQk9ICJuZXQiLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gYnJuZl9icmlkZ2VfdGFibGUsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKyNlbmRpZgorCitpbnQgYnJfbmV0ZmlsdGVyX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJyX25mX29wcyk7IGkrKykgeworCQlpbnQgcmV0OworCisJCWlmICgocmV0ID0gbmZfcmVnaXN0ZXJfaG9vaygmYnJfbmZfb3BzW2ldKSkgPj0gMCkKKwkJCWNvbnRpbnVlOworCisJCXdoaWxlIChpLS0pCisJCQluZl91bnJlZ2lzdGVyX2hvb2soJmJyX25mX29wc1tpXSk7CisKKwkJcmV0dXJuIHJldDsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJYnJuZl9zeXNjdGxfaGVhZGVyID0gcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGJybmZfbmV0X3RhYmxlLCAwKTsKKwlpZiAoYnJuZl9zeXNjdGxfaGVhZGVyID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnJfbmV0ZmlsdGVyOiBjYW4ndCByZWdpc3RlciB0byBzeXNjdGwuXG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnJfbmZfb3BzKTsgaSsrKQorCQkJbmZfdW5yZWdpc3Rlcl9ob29rKCZicl9uZl9vcHNbaV0pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisjZW5kaWYKKworCXByaW50ayhLRVJOX05PVElDRSAiQnJpZGdlIGZpcmV3YWxsaW5nIHJlZ2lzdGVyZWRcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYnJfbmV0ZmlsdGVyX2Zpbmkodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IEFSUkFZX1NJWkUoYnJfbmZfb3BzKSAtIDE7IGkgPj0gMDsgaS0tKQorCQluZl91bnJlZ2lzdGVyX2hvb2soJmJyX25mX29wc1tpXSk7CisjaWZkZWYgQ09ORklHX1NZU0NUTAorCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGJybmZfc3lzY3RsX2hlYWRlcik7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfbm90aWZ5LmMgYi9uZXQvYnJpZGdlL2JyX25vdGlmeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZmI0OWUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYnJpZGdlL2JyX25vdGlmeS5jCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKglEZXZpY2UgZXZlbnQgaGFuZGxpbmcKKyAqCUxpbnV4IGV0aGVybmV0IGJyaWRnZQorICoKKyAqCUF1dGhvcnM6CisgKglMZW5uZXJ0IEJ1eXRlbmhlawkJPGJ1eXRlbmhAZ251Lm9yZz4KKyAqCisgKgkkSWQ6IGJyX25vdGlmeS5jLHYgMS4yIDIwMDAvMDIvMjEgMTU6NTE6MzQgZGF2ZW0gRXhwICQKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgImJyX3ByaXZhdGUuaCIKKworc3RhdGljIGludCBicl9kZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp1bnVzZWQsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cik7CisKK3N0cnVjdCBub3RpZmllcl9ibG9jayBicl9kZXZpY2Vfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBicl9kZXZpY2VfZXZlbnQKK307CisKKy8qCisgKiBIYW5kbGUgY2hhbmdlcyBpbiBzdGF0ZSBvZiBuZXR3b3JrIGRldmljZXMgZW5zbGF2ZWQgdG8gYSBicmlkZ2UuCisgKiAKKyAqIE5vdGU6IGRvbid0IGNhcmUgYWJvdXQgdXAvZG93biBpZiBicmlkZ2UgaXRzZWxmIGlzIGRvd24sIGJlY2F1c2UKKyAqICAgICBwb3J0IHN0YXRlIGlzIGNoZWNrZWQgd2hlbiBicmlkZ2UgaXMgYnJvdWdodCB1cC4KKyAqLworc3RhdGljIGludCBicl9kZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp1bnVzZWQsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHRyOworCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAgPSBkZXYtPmJyX3BvcnQ7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyOworCisJLyogbm90IGEgcG9ydCBvZiBhIGJyaWRnZSAqLworCWlmIChwID09IE5VTEwpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCWJyID0gcC0+YnI7CisKKwlzcGluX2xvY2tfYmgoJmJyLT5sb2NrKTsKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBORVRERVZfQ0hBTkdFTVRVOgorCQlkZXZfc2V0X210dShici0+ZGV2LCBicl9taW5fbXR1KGJyKSk7CisJCWJyZWFrOworCisJY2FzZSBORVRERVZfQ0hBTkdFQUREUjoKKwkJYnJfZmRiX2NoYW5nZWFkZHIocCwgZGV2LT5kZXZfYWRkcik7CisJCWJyX3N0cF9yZWNhbGN1bGF0ZV9icmlkZ2VfaWQoYnIpOworCQlicmVhazsKKworCWNhc2UgTkVUREVWX0NIQU5HRToJLyogZGV2aWNlIGlzIHVwIGJ1dCBjYXJyaWVyIGNoYW5nZWQgKi8KKwkJaWYgKCEoYnItPmRldi0+ZmxhZ3MgJiBJRkZfVVApKQorCQkJYnJlYWs7CisKKwkJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkgeworCQkJaWYgKHAtPnN0YXRlID09IEJSX1NUQVRFX0RJU0FCTEVEKQorCQkJCWJyX3N0cF9lbmFibGVfcG9ydChwKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwLT5zdGF0ZSAhPSBCUl9TVEFURV9ESVNBQkxFRCkKKwkJCQlicl9zdHBfZGlzYWJsZV9wb3J0KHApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBORVRERVZfRE9XTjoKKwkJaWYgKGJyLT5kZXYtPmZsYWdzICYgSUZGX1VQKQorCQkJYnJfc3RwX2Rpc2FibGVfcG9ydChwKTsKKwkJYnJlYWs7CisKKwljYXNlIE5FVERFVl9VUDoKKwkJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSAmJiAoYnItPmRldi0+ZmxhZ3MgJiBJRkZfVVApKSAKKwkJCWJyX3N0cF9lbmFibGVfcG9ydChwKTsKKwkJYnJlYWs7CisKKwljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgorCQlzcGluX3VubG9ja19iaCgmYnItPmxvY2spOworCQlicl9kZWxfaWYoYnIsIGRldik7CisJCWdvdG8gZG9uZTsKKwl9IAorCXNwaW5fdW5sb2NrX2JoKCZici0+bG9jayk7CisKKyBkb25lOgorCXJldHVybiBOT1RJRllfRE9ORTsKK30KZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oIGIvbmV0L2JyaWRnZS9icl9wcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRkNjNmMTMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYnJpZGdlL2JyX3ByaXZhdGUuaApAQCAtMCwwICsxLDI0NCBAQAorLyoKKyAqCUxpbnV4IGV0aGVybmV0IGJyaWRnZQorICoKKyAqCUF1dGhvcnM6CisgKglMZW5uZXJ0IEJ1eXRlbmhlawkJPGJ1eXRlbmhAZ251Lm9yZz4KKyAqCisgKgkkSWQ6IGJyX3ByaXZhdGUuaCx2IDEuNyAyMDAxLzEyLzI0IDAwOjU5OjU1IGRhdmVtIEV4cCAkCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9CUl9QUklWQVRFX0gKKyNkZWZpbmUgX0JSX1BSSVZBVEVfSAorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2JyaWRnZS5oPgorCisjZGVmaW5lIEJSX0hBU0hfQklUUyA4CisjZGVmaW5lIEJSX0hBU0hfU0laRSAoMSA8PCBCUl9IQVNIX0JJVFMpCisKKyNkZWZpbmUgQlJfSE9MRF9USU1FICgxKkhaKQorCisjZGVmaW5lIEJSX1BPUlRfQklUUwkxMAorI2RlZmluZSBCUl9NQVhfUE9SVFMJKDE8PEJSX1BPUlRfQklUUykKKwordHlwZWRlZiBzdHJ1Y3QgYnJpZGdlX2lkIGJyaWRnZV9pZDsKK3R5cGVkZWYgc3RydWN0IG1hY19hZGRyIG1hY19hZGRyOwordHlwZWRlZiBfX3UxNiBwb3J0X2lkOworCitzdHJ1Y3QgYnJpZGdlX2lkCit7CisJdW5zaWduZWQgY2hhcglwcmlvWzJdOworCXVuc2lnbmVkIGNoYXIJYWRkcls2XTsKK307CisKK3N0cnVjdCBtYWNfYWRkcgoreworCXVuc2lnbmVkIGNoYXIJYWRkcls2XTsKK307CisKK3N0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeQoreworCXN0cnVjdCBobGlzdF9ub2RlCQlobGlzdDsKKwlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0CQkqZHN0OworCisJc3RydWN0IHJjdV9oZWFkCQkJcmN1OworCWF0b21pY190CQkJdXNlX2NvdW50OworCXVuc2lnbmVkIGxvbmcJCQlhZ2VpbmdfdGltZXI7CisJbWFjX2FkZHIJCQlhZGRyOworCXVuc2lnbmVkIGNoYXIJCQlpc19sb2NhbDsKKwl1bnNpZ25lZCBjaGFyCQkJaXNfc3RhdGljOworfTsKKworc3RydWN0IG5ldF9icmlkZ2VfcG9ydAoreworCXN0cnVjdCBuZXRfYnJpZGdlCQkqYnI7CisJc3RydWN0IG5ldF9kZXZpY2UJCSpkZXY7CisJc3RydWN0IGxpc3RfaGVhZAkJbGlzdDsKKworCS8qIFNUUCAqLworCXU4CQkJCXByaW9yaXR5OworCXU4CQkJCXN0YXRlOworCXUxNgkJCQlwb3J0X25vOworCXVuc2lnbmVkIGNoYXIJCQl0b3BvbG9neV9jaGFuZ2VfYWNrOworCXVuc2lnbmVkIGNoYXIJCQljb25maWdfcGVuZGluZzsKKwlwb3J0X2lkCQkJCXBvcnRfaWQ7CisJcG9ydF9pZAkJCQlkZXNpZ25hdGVkX3BvcnQ7CisJYnJpZGdlX2lkCQkJZGVzaWduYXRlZF9yb290OworCWJyaWRnZV9pZAkJCWRlc2lnbmF0ZWRfYnJpZGdlOworCXUzMgkJCQlwYXRoX2Nvc3Q7CisJdTMyCQkJCWRlc2lnbmF0ZWRfY29zdDsKKworCXN0cnVjdCB0aW1lcl9saXN0CQlmb3J3YXJkX2RlbGF5X3RpbWVyOworCXN0cnVjdCB0aW1lcl9saXN0CQlob2xkX3RpbWVyOworCXN0cnVjdCB0aW1lcl9saXN0CQltZXNzYWdlX2FnZV90aW1lcjsKKwlzdHJ1Y3Qga29iamVjdAkJCWtvYmo7CisJc3RydWN0IHJjdV9oZWFkCQkJcmN1OworfTsKKworc3RydWN0IG5ldF9icmlkZ2UKK3sKKwlzcGlubG9ja190CQkJbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlwb3J0X2xpc3Q7CisJc3RydWN0IG5ldF9kZXZpY2UJCSpkZXY7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJCXN0YXRpc3RpY3M7CisJc3BpbmxvY2tfdAkJCWhhc2hfbG9jazsKKwlzdHJ1Y3QgaGxpc3RfaGVhZAkJaGFzaFtCUl9IQVNIX1NJWkVdOworCXN0cnVjdCBsaXN0X2hlYWQJCWFnZV9saXN0OworCisJLyogU1RQICovCisJYnJpZGdlX2lkCQkJZGVzaWduYXRlZF9yb290OworCWJyaWRnZV9pZAkJCWJyaWRnZV9pZDsKKwl1MzIJCQkJcm9vdF9wYXRoX2Nvc3Q7CisJdW5zaWduZWQgbG9uZwkJCW1heF9hZ2U7CisJdW5zaWduZWQgbG9uZwkJCWhlbGxvX3RpbWU7CisJdW5zaWduZWQgbG9uZwkJCWZvcndhcmRfZGVsYXk7CisJdW5zaWduZWQgbG9uZwkJCWJyaWRnZV9tYXhfYWdlOworCXVuc2lnbmVkIGxvbmcJCQlhZ2VpbmdfdGltZTsKKwl1bnNpZ25lZCBsb25nCQkJYnJpZGdlX2hlbGxvX3RpbWU7CisJdW5zaWduZWQgbG9uZwkJCWJyaWRnZV9mb3J3YXJkX2RlbGF5OworCisJdTE2CQkJCXJvb3RfcG9ydDsKKwl1bnNpZ25lZCBjaGFyCQkJc3RwX2VuYWJsZWQ7CisJdW5zaWduZWQgY2hhcgkJCXRvcG9sb2d5X2NoYW5nZTsKKwl1bnNpZ25lZCBjaGFyCQkJdG9wb2xvZ3lfY2hhbmdlX2RldGVjdGVkOworCisJc3RydWN0IHRpbWVyX2xpc3QJCWhlbGxvX3RpbWVyOworCXN0cnVjdCB0aW1lcl9saXN0CQl0Y25fdGltZXI7CisJc3RydWN0IHRpbWVyX2xpc3QJCXRvcG9sb2d5X2NoYW5nZV90aW1lcjsKKwlzdHJ1Y3QgdGltZXJfbGlzdAkJZ2NfdGltZXI7CisJc3RydWN0IGtvYmplY3QJCQlpZm9iajsKK307CisKK2V4dGVybiBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgYnJfZGV2aWNlX25vdGlmaWVyOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgYnJpZGdlX3VsYVs2XTsKKworLyogY2FsbGVkIHVuZGVyIGJyaWRnZSBsb2NrICovCitzdGF0aWMgaW5saW5lIGludCBicl9pc19yb290X2JyaWRnZShjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIpCit7CisJcmV0dXJuICFtZW1jbXAoJmJyLT5icmlkZ2VfaWQsICZici0+ZGVzaWduYXRlZF9yb290LCA4KTsKK30KKworCisvKiBicl9kZXZpY2UuYyAqLworZXh0ZXJuIHZvaWQgYnJfZGV2X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBicl9kZXZfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogYnJfZmRiLmMgKi8KK2V4dGVybiB2b2lkIGJyX2ZkYl9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgYnJfZmRiX2Zpbmkodm9pZCk7CitleHRlcm4gdm9pZCBicl9mZGJfY2hhbmdlYWRkcihzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLAorCQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbmV3YWRkcik7CitleHRlcm4gdm9pZCBicl9mZGJfY2xlYW51cCh1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gdm9pZCBicl9mZGJfZGVsZXRlX2J5X3BvcnQoc3RydWN0IG5ldF9icmlkZ2UgKmJyLAorCQkJICAgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCk7CitleHRlcm4gc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpfX2JyX2ZkYl9nZXQoc3RydWN0IG5ldF9icmlkZ2UgKmJyLAorCQkJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIpOworZXh0ZXJuIHN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqYnJfZmRiX2dldChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCisJCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyICphZGRyKTsKK2V4dGVybiB2b2lkIGJyX2ZkYl9wdXQoc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICplbnQpOworZXh0ZXJuIGludCBicl9mZGJfZmlsbGJ1ZihzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHZvaWQgKmJ1ZiwgCisJCQkgIHVuc2lnbmVkIGxvbmcgY291bnQsIHVuc2lnbmVkIGxvbmcgb2ZmKTsKK2V4dGVybiBpbnQgYnJfZmRiX2luc2VydChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCisJCQkgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqc291cmNlLAorCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIpOworZXh0ZXJuIHZvaWQgYnJfZmRiX3VwZGF0ZShzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCisJCQkgIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnNvdXJjZSwKKwkJCSAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkcik7CisKKy8qIGJyX2ZvcndhcmQuYyAqLworZXh0ZXJuIHZvaWQgYnJfZGVsaXZlcihjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICp0bywKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gaW50IGJyX2Rldl9xdWV1ZV9wdXNoX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gdm9pZCBicl9mb3J3YXJkKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnRvLAorCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiBpbnQgYnJfZm9yd2FyZF9maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gdm9pZCBicl9mbG9vZF9kZWxpdmVyKHN0cnVjdCBuZXRfYnJpZGdlICpiciwKKwkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICAgaW50IGNsb25lKTsKK2V4dGVybiB2b2lkIGJyX2Zsb29kX2ZvcndhcmQoc3RydWN0IG5ldF9icmlkZ2UgKmJyLAorCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgICBpbnQgY2xvbmUpOworCisvKiBicl9pZi5jICovCitleHRlcm4gaW50IGJyX2FkZF9icmlkZ2UoY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gaW50IGJyX2RlbF9icmlkZ2UoY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCBicl9jbGVhbnVwX2JyaWRnZXModm9pZCk7CitleHRlcm4gaW50IGJyX2FkZF9pZihzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCisJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IGJyX2RlbF9pZihzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCisJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IGJyX21pbl9tdHUoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyKTsKKworLyogYnJfaW5wdXQuYyAqLworZXh0ZXJuIGludCBicl9oYW5kbGVfZnJhbWVfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IpOworZXh0ZXJuIGludCBicl9oYW5kbGVfZnJhbWUoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgc3RydWN0IHNrX2J1ZmYgKipwc2tiKTsKKworLyogYnJfaW9jdGwuYyAqLworZXh0ZXJuIGludCBicl9kZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitleHRlcm4gaW50IGJyX2lvY3RsX2RldmljZWxlc3Nfc3R1Yih1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKTsKKworLyogYnJfbmV0ZmlsdGVyLmMgKi8KK2V4dGVybiBpbnQgYnJfbmV0ZmlsdGVyX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBicl9uZXRmaWx0ZXJfZmluaSh2b2lkKTsKKworLyogYnJfc3RwLmMgKi8KK2V4dGVybiB2b2lkIGJyX2xvZ19zdGF0ZShjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpicl9nZXRfcG9ydChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCisJCQkJICAgIAkgICB1MTYgcG9ydF9ubyk7CitleHRlcm4gdm9pZCBicl9pbml0X3BvcnQoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCk7CitleHRlcm4gdm9pZCBicl9iZWNvbWVfZGVzaWduYXRlZF9wb3J0KHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApOworCisvKiBicl9zdHBfaWYuYyAqLworZXh0ZXJuIHZvaWQgYnJfc3RwX2VuYWJsZV9icmlkZ2Uoc3RydWN0IG5ldF9icmlkZ2UgKmJyKTsKK2V4dGVybiB2b2lkIGJyX3N0cF9kaXNhYmxlX2JyaWRnZShzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIpOworZXh0ZXJuIHZvaWQgYnJfc3RwX2VuYWJsZV9wb3J0KHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApOworZXh0ZXJuIHZvaWQgYnJfc3RwX2Rpc2FibGVfcG9ydChzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKTsKK2V4dGVybiB2b2lkIGJyX3N0cF9yZWNhbGN1bGF0ZV9icmlkZ2VfaWQoc3RydWN0IG5ldF9icmlkZ2UgKmJyKTsKK2V4dGVybiB2b2lkIGJyX3N0cF9zZXRfYnJpZGdlX3ByaW9yaXR5KHN0cnVjdCBuZXRfYnJpZGdlICpiciwKKwkJCQkgICAgICAgdTE2IG5ld3ByaW8pOworZXh0ZXJuIHZvaWQgYnJfc3RwX3NldF9wb3J0X3ByaW9yaXR5KHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsCisJCQkJICAgICB1OCBuZXdwcmlvKTsKK2V4dGVybiB2b2lkIGJyX3N0cF9zZXRfcGF0aF9jb3N0KHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsCisJCQkJIHUzMiBwYXRoX2Nvc3QpOworZXh0ZXJuIHNzaXplX3QgYnJfc2hvd19icmlkZ2VfaWQoY2hhciAqYnVmLCBjb25zdCBzdHJ1Y3QgYnJpZGdlX2lkICppZCk7CisKKy8qIGJyX3N0cF9icGR1LmMgKi8KK2V4dGVybiBpbnQgYnJfc3RwX2hhbmRsZV9icGR1KHN0cnVjdCBza19idWZmICpza2IpOworCisvKiBicl9zdHBfdGltZXIuYyAqLworZXh0ZXJuIHZvaWQgYnJfc3RwX3RpbWVyX2luaXQoc3RydWN0IG5ldF9icmlkZ2UgKmJyKTsKK2V4dGVybiB2b2lkIGJyX3N0cF9wb3J0X3RpbWVyX2luaXQoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBicl90aW1lcl92YWx1ZShjb25zdCBzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpOworCisvKiBici5jICovCitleHRlcm4gc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICooKmJyX2ZkYl9nZXRfaG9vaykoc3RydWN0IG5ldF9icmlkZ2UgKmJyLAorCQkJCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmFkZHIpOworZXh0ZXJuIHZvaWQgKCpicl9mZGJfcHV0X2hvb2spKHN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZW50KTsKKworCisjaWZkZWYgQ09ORklHX1NZU0ZTCisvKiBicl9zeXNmc19pZi5jICovCitleHRlcm4gaW50IGJyX3N5c2ZzX2FkZGlmKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApOworZXh0ZXJuIHZvaWQgYnJfc3lzZnNfcmVtb3ZlaWYoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCk7CitleHRlcm4gdm9pZCBicl9zeXNmc19mcmVlaWYoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCk7CisKKy8qIGJyX3N5c2ZzX2JyLmMgKi8KK2V4dGVybiBpbnQgYnJfc3lzZnNfYWRkYnIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBicl9zeXNmc19kZWxicihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworI2Vsc2UKKworI2RlZmluZSBicl9zeXNmc19hZGRpZihwKQkoMCkKKyNkZWZpbmUgYnJfc3lzZnNfcmVtb3ZlaWYocCkJZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIGJyX3N5c2ZzX2ZyZWVpZihwKQlrZnJlZShwKQorI2RlZmluZSBicl9zeXNmc19hZGRicihkZXYpCSgwKQorI2RlZmluZSBicl9zeXNmc19kZWxicihkZXYpCWRvIHsgfSB3aGlsZSgwKQorI2VuZGlmIC8qIENPTkZJR19TWVNGUyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfcHJpdmF0ZV9zdHAuaCBiL25ldC9icmlkZ2UvYnJfcHJpdmF0ZV9zdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjlmMDFhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JyaWRnZS9icl9wcml2YXRlX3N0cC5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKglMaW51eCBldGhlcm5ldCBicmlkZ2UKKyAqCisgKglBdXRob3JzOgorICoJTGVubmVydCBCdXl0ZW5oZWsJCTxidXl0ZW5oQGdudS5vcmc+CisgKgorICoJJElkOiBicl9wcml2YXRlX3N0cC5oLHYgMS4zIDIwMDEvMDIvMDUgMDY6MDM6NDcgZGF2ZW0gRXhwICQKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0JSX1BSSVZBVEVfU1RQX0gKKyNkZWZpbmUgX0JSX1BSSVZBVEVfU1RQX0gKKworI2RlZmluZSBCUERVX1RZUEVfQ09ORklHIDAKKyNkZWZpbmUgQlBEVV9UWVBFX1RDTiAweDgwCisKK3N0cnVjdCBicl9jb25maWdfYnBkdQoreworCXVuc2lnbmVkCXRvcG9sb2d5X2NoYW5nZToxOworCXVuc2lnbmVkCXRvcG9sb2d5X2NoYW5nZV9hY2s6MTsKKwlicmlkZ2VfaWQJcm9vdDsKKwlpbnQJCXJvb3RfcGF0aF9jb3N0OworCWJyaWRnZV9pZAlicmlkZ2VfaWQ7CisJcG9ydF9pZAkJcG9ydF9pZDsKKwlpbnQJCW1lc3NhZ2VfYWdlOworCWludAkJbWF4X2FnZTsKKwlpbnQJCWhlbGxvX3RpbWU7CisJaW50CQlmb3J3YXJkX2RlbGF5OworfTsKKworLyogY2FsbGVkIHVuZGVyIGJyaWRnZSBsb2NrICovCitzdGF0aWMgaW5saW5lIGludCBicl9pc19kZXNpZ25hdGVkX3BvcnQoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCkKK3sKKwlyZXR1cm4gIW1lbWNtcCgmcC0+ZGVzaWduYXRlZF9icmlkZ2UsICZwLT5ici0+YnJpZGdlX2lkLCA4KSAmJgorCQkocC0+ZGVzaWduYXRlZF9wb3J0ID09IHAtPnBvcnRfaWQpOworfQorCisKKy8qIGJyX3N0cC5jICovCitleHRlcm4gdm9pZCBicl9iZWNvbWVfcm9vdF9icmlkZ2Uoc3RydWN0IG5ldF9icmlkZ2UgKmJyKTsKK2V4dGVybiB2b2lkIGJyX2NvbmZpZ19icGR1X2dlbmVyYXRpb24oc3RydWN0IG5ldF9icmlkZ2UgKik7CitleHRlcm4gdm9pZCBicl9jb25maWd1cmF0aW9uX3VwZGF0ZShzdHJ1Y3QgbmV0X2JyaWRnZSAqKTsKK2V4dGVybiB2b2lkIGJyX3BvcnRfc3RhdGVfc2VsZWN0aW9uKHN0cnVjdCBuZXRfYnJpZGdlICopOworZXh0ZXJuIHZvaWQgYnJfcmVjZWl2ZWRfY29uZmlnX2JwZHUoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgc3RydWN0IGJyX2NvbmZpZ19icGR1ICpicGR1KTsKK2V4dGVybiB2b2lkIGJyX3JlY2VpdmVkX3Rjbl9icGR1KHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApOworZXh0ZXJuIHZvaWQgYnJfdHJhbnNtaXRfY29uZmlnKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApOworZXh0ZXJuIHZvaWQgYnJfdHJhbnNtaXRfdGNuKHN0cnVjdCBuZXRfYnJpZGdlICpicik7CitleHRlcm4gdm9pZCBicl90b3BvbG9neV9jaGFuZ2VfZGV0ZWN0aW9uKHN0cnVjdCBuZXRfYnJpZGdlICpicik7CisKKy8qIGJyX3N0cF9icGR1LmMgKi8KK2V4dGVybiB2b2lkIGJyX3NlbmRfY29uZmlnX2JwZHUoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqLCBzdHJ1Y3QgYnJfY29uZmlnX2JwZHUgKik7CitleHRlcm4gdm9pZCBicl9zZW5kX3Rjbl9icGR1KHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9zdHAuYyBiL25ldC9icmlkZ2UvYnJfc3RwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRjYTA2MzkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYnJpZGdlL2JyX3N0cC5jCkBAIC0wLDAgKzEsNDU5IEBACisvKgorICoJU3Bhbm5pbmcgdHJlZSBwcm90b2NvbDsgZ2VuZXJpYyBwYXJ0cworICoJTGludXggZXRoZXJuZXQgYnJpZGdlCisgKgorICoJQXV0aG9yczoKKyAqCUxlbm5lcnQgQnV5dGVuaGVrCQk8YnV5dGVuaEBnbnUub3JnPgorICoKKyAqCSRJZDogYnJfc3RwLmMsdiAxLjQgMjAwMC8wNi8xOSAxMDoxMzozNSBkYXZlbSBFeHAgJAorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSAiYnJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImJyX3ByaXZhdGVfc3RwLmgiCisKKy8qIHNpbmNlIHRpbWUgdmFsdWVzIGluIGJwZHUgYXJlIGluIGppZmZpZXMgYW5kIHRoZW4gc2NhbGVkICgxLzI1NikKKyAqIGJlZm9yZSBzZW5kaW5nLCBtYWtlIHN1cmUgdGhhdCBpcyBhdCBsZWFzdCBvbmUuCisgKi8KKyNkZWZpbmUgTUVTU0FHRV9BR0VfSU5DUgkoKEhaIDwgMjU2KSA/IDEgOiAoSFovMjU2KSkKKworc3RhdGljIGNvbnN0IGNoYXIgKmJyX3BvcnRfc3RhdGVfbmFtZXNbXSA9IHsKKwlbQlJfU1RBVEVfRElTQUJMRURdID0gImRpc2FibGVkIiwgCisJW0JSX1NUQVRFX0xJU1RFTklOR10gPSAibGlzdGVuaW5nIiwKKwlbQlJfU1RBVEVfTEVBUk5JTkddID0gImxlYXJuaW5nIiwgCisJW0JSX1NUQVRFX0ZPUldBUkRJTkddID0gImZvcndhcmRpbmciLCAKKwlbQlJfU1RBVEVfQkxPQ0tJTkddID0gImJsb2NraW5nIiwKK307CisKK3ZvaWQgYnJfbG9nX3N0YXRlKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApCit7CisJcHJfaW5mbygiJXM6IHBvcnQgJWQoJXMpIGVudGVyaW5nICVzIHN0YXRlXG4iLAorCQlwLT5ici0+ZGV2LT5uYW1lLCBwLT5wb3J0X25vLCBwLT5kZXYtPm5hbWUsIAorCQlicl9wb3J0X3N0YXRlX25hbWVzW3AtPnN0YXRlXSk7CisKK30KKworLyogY2FsbGVkIHVuZGVyIGJyaWRnZSBsb2NrICovCitzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpicl9nZXRfcG9ydChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHUxNiBwb3J0X25vKQoreworCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwLCAmYnItPnBvcnRfbGlzdCwgbGlzdCkgeworCQlpZiAocC0+cG9ydF9ubyA9PSBwb3J0X25vKQorCQkJcmV0dXJuIHA7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIGNhbGxlZCB1bmRlciBicmlkZ2UgbG9jayAqLworc3RhdGljIGludCBicl9zaG91bGRfYmVjb21lX3Jvb3RfcG9ydChjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCAKKwkJCQkgICAgICB1MTYgcm9vdF9wb3J0KQoreworCXN0cnVjdCBuZXRfYnJpZGdlICpicjsKKwlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpycDsKKwlpbnQgdDsKKworCWJyID0gcC0+YnI7CisJaWYgKHAtPnN0YXRlID09IEJSX1NUQVRFX0RJU0FCTEVEIHx8CisJICAgIGJyX2lzX2Rlc2lnbmF0ZWRfcG9ydChwKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobWVtY21wKCZici0+YnJpZGdlX2lkLCAmcC0+ZGVzaWduYXRlZF9yb290LCA4KSA8PSAwKQorCQlyZXR1cm4gMDsKKworCWlmICghcm9vdF9wb3J0KQorCQlyZXR1cm4gMTsKKworCXJwID0gYnJfZ2V0X3BvcnQoYnIsIHJvb3RfcG9ydCk7CisKKwl0ID0gbWVtY21wKCZwLT5kZXNpZ25hdGVkX3Jvb3QsICZycC0+ZGVzaWduYXRlZF9yb290LCA4KTsKKwlpZiAodCA8IDApCisJCXJldHVybiAxOworCWVsc2UgaWYgKHQgPiAwKQorCQlyZXR1cm4gMDsKKworCWlmIChwLT5kZXNpZ25hdGVkX2Nvc3QgKyBwLT5wYXRoX2Nvc3QgPAorCSAgICBycC0+ZGVzaWduYXRlZF9jb3N0ICsgcnAtPnBhdGhfY29zdCkKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAocC0+ZGVzaWduYXRlZF9jb3N0ICsgcC0+cGF0aF9jb3N0ID4KKwkJIHJwLT5kZXNpZ25hdGVkX2Nvc3QgKyBycC0+cGF0aF9jb3N0KQorCQlyZXR1cm4gMDsKKworCXQgPSBtZW1jbXAoJnAtPmRlc2lnbmF0ZWRfYnJpZGdlLCAmcnAtPmRlc2lnbmF0ZWRfYnJpZGdlLCA4KTsKKwlpZiAodCA8IDApCisJCXJldHVybiAxOworCWVsc2UgaWYgKHQgPiAwKQorCQlyZXR1cm4gMDsKKworCWlmIChwLT5kZXNpZ25hdGVkX3BvcnQgPCBycC0+ZGVzaWduYXRlZF9wb3J0KQorCQlyZXR1cm4gMTsKKwllbHNlIGlmIChwLT5kZXNpZ25hdGVkX3BvcnQgPiBycC0+ZGVzaWduYXRlZF9wb3J0KQorCQlyZXR1cm4gMDsKKworCWlmIChwLT5wb3J0X2lkIDwgcnAtPnBvcnRfaWQpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGNhbGxlZCB1bmRlciBicmlkZ2UgbG9jayAqLworc3RhdGljIHZvaWQgYnJfcm9vdF9zZWxlY3Rpb24oc3RydWN0IG5ldF9icmlkZ2UgKmJyKQoreworCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnA7CisJdTE2IHJvb3RfcG9ydCA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZici0+cG9ydF9saXN0LCBsaXN0KSB7CisJCWlmIChicl9zaG91bGRfYmVjb21lX3Jvb3RfcG9ydChwLCByb290X3BvcnQpKQorCQkJcm9vdF9wb3J0ID0gcC0+cG9ydF9ubzsKKworCX0KKworCWJyLT5yb290X3BvcnQgPSByb290X3BvcnQ7CisKKwlpZiAoIXJvb3RfcG9ydCkgeworCQlici0+ZGVzaWduYXRlZF9yb290ID0gYnItPmJyaWRnZV9pZDsKKwkJYnItPnJvb3RfcGF0aF9jb3N0ID0gMDsKKwl9IGVsc2UgeworCQlwID0gYnJfZ2V0X3BvcnQoYnIsIHJvb3RfcG9ydCk7CisJCWJyLT5kZXNpZ25hdGVkX3Jvb3QgPSBwLT5kZXNpZ25hdGVkX3Jvb3Q7CisJCWJyLT5yb290X3BhdGhfY29zdCA9IHAtPmRlc2lnbmF0ZWRfY29zdCArIHAtPnBhdGhfY29zdDsKKwl9Cit9CisKKy8qIGNhbGxlZCB1bmRlciBicmlkZ2UgbG9jayAqLwordm9pZCBicl9iZWNvbWVfcm9vdF9icmlkZ2Uoc3RydWN0IG5ldF9icmlkZ2UgKmJyKQoreworCWJyLT5tYXhfYWdlID0gYnItPmJyaWRnZV9tYXhfYWdlOworCWJyLT5oZWxsb190aW1lID0gYnItPmJyaWRnZV9oZWxsb190aW1lOworCWJyLT5mb3J3YXJkX2RlbGF5ID0gYnItPmJyaWRnZV9mb3J3YXJkX2RlbGF5OworCWJyX3RvcG9sb2d5X2NoYW5nZV9kZXRlY3Rpb24oYnIpOworCWRlbF90aW1lcigmYnItPnRjbl90aW1lcik7CisKKwlpZiAoYnItPmRldi0+ZmxhZ3MgJiBJRkZfVVApIHsKKwkJYnJfY29uZmlnX2JwZHVfZ2VuZXJhdGlvbihicik7CisJCW1vZF90aW1lcigmYnItPmhlbGxvX3RpbWVyLCBqaWZmaWVzICsgYnItPmhlbGxvX3RpbWUpOworCX0KK30KKworLyogY2FsbGVkIHVuZGVyIGJyaWRnZSBsb2NrICovCit2b2lkIGJyX3RyYW5zbWl0X2NvbmZpZyhzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKQoreworCXN0cnVjdCBicl9jb25maWdfYnBkdSBicGR1OworCXN0cnVjdCBuZXRfYnJpZGdlICpicjsKKworCisJaWYgKHRpbWVyX3BlbmRpbmcoJnAtPmhvbGRfdGltZXIpKSB7CisJCXAtPmNvbmZpZ19wZW5kaW5nID0gMTsKKwkJcmV0dXJuOworCX0KKworCWJyID0gcC0+YnI7CisKKwlicGR1LnRvcG9sb2d5X2NoYW5nZSA9IGJyLT50b3BvbG9neV9jaGFuZ2U7CisJYnBkdS50b3BvbG9neV9jaGFuZ2VfYWNrID0gcC0+dG9wb2xvZ3lfY2hhbmdlX2FjazsKKwlicGR1LnJvb3QgPSBici0+ZGVzaWduYXRlZF9yb290OworCWJwZHUucm9vdF9wYXRoX2Nvc3QgPSBici0+cm9vdF9wYXRoX2Nvc3Q7CisJYnBkdS5icmlkZ2VfaWQgPSBici0+YnJpZGdlX2lkOworCWJwZHUucG9ydF9pZCA9IHAtPnBvcnRfaWQ7CisJaWYgKGJyX2lzX3Jvb3RfYnJpZGdlKGJyKSkKKwkJYnBkdS5tZXNzYWdlX2FnZSA9IDA7CisJZWxzZSB7CisJCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnJvb3QKKwkJCT0gYnJfZ2V0X3BvcnQoYnIsIGJyLT5yb290X3BvcnQpOworCQlicGR1Lm1lc3NhZ2VfYWdlID0gYnItPm1heF9hZ2UKKwkJCS0gKHJvb3QtPm1lc3NhZ2VfYWdlX3RpbWVyLmV4cGlyZXMgLSBqaWZmaWVzKQorCQkJKyBNRVNTQUdFX0FHRV9JTkNSOworCX0KKwlicGR1Lm1heF9hZ2UgPSBici0+bWF4X2FnZTsKKwlicGR1LmhlbGxvX3RpbWUgPSBici0+aGVsbG9fdGltZTsKKwlicGR1LmZvcndhcmRfZGVsYXkgPSBici0+Zm9yd2FyZF9kZWxheTsKKworCWlmIChicGR1Lm1lc3NhZ2VfYWdlIDwgYnItPm1heF9hZ2UpIHsKKwkJYnJfc2VuZF9jb25maWdfYnBkdShwLCAmYnBkdSk7CisJCXAtPnRvcG9sb2d5X2NoYW5nZV9hY2sgPSAwOworCQlwLT5jb25maWdfcGVuZGluZyA9IDA7CisJCW1vZF90aW1lcigmcC0+aG9sZF90aW1lciwgamlmZmllcyArIEJSX0hPTERfVElNRSk7CisJfQorfQorCisvKiBjYWxsZWQgdW5kZXIgYnJpZGdlIGxvY2sgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBicl9yZWNvcmRfY29uZmlnX2luZm9ybWF0aW9uKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIAorCQkJCQkJY29uc3Qgc3RydWN0IGJyX2NvbmZpZ19icGR1ICpicGR1KQoreworCXAtPmRlc2lnbmF0ZWRfcm9vdCA9IGJwZHUtPnJvb3Q7CisJcC0+ZGVzaWduYXRlZF9jb3N0ID0gYnBkdS0+cm9vdF9wYXRoX2Nvc3Q7CisJcC0+ZGVzaWduYXRlZF9icmlkZ2UgPSBicGR1LT5icmlkZ2VfaWQ7CisJcC0+ZGVzaWduYXRlZF9wb3J0ID0gYnBkdS0+cG9ydF9pZDsKKworCW1vZF90aW1lcigmcC0+bWVzc2FnZV9hZ2VfdGltZXIsIGppZmZpZXMgCisJCSAgKyAocC0+YnItPm1heF9hZ2UgLSBicGR1LT5tZXNzYWdlX2FnZSkpOworfQorCisvKiBjYWxsZWQgdW5kZXIgYnJpZGdlIGxvY2sgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBicl9yZWNvcmRfY29uZmlnX3RpbWVvdXRfdmFsdWVzKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgCisJCQkJCSAgICBjb25zdCBzdHJ1Y3QgYnJfY29uZmlnX2JwZHUgKmJwZHUpCit7CisJYnItPm1heF9hZ2UgPSBicGR1LT5tYXhfYWdlOworCWJyLT5oZWxsb190aW1lID0gYnBkdS0+aGVsbG9fdGltZTsKKwlici0+Zm9yd2FyZF9kZWxheSA9IGJwZHUtPmZvcndhcmRfZGVsYXk7CisJYnItPnRvcG9sb2d5X2NoYW5nZSA9IGJwZHUtPnRvcG9sb2d5X2NoYW5nZTsKK30KKworLyogY2FsbGVkIHVuZGVyIGJyaWRnZSBsb2NrICovCit2b2lkIGJyX3RyYW5zbWl0X3RjbihzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIpCit7CisJYnJfc2VuZF90Y25fYnBkdShicl9nZXRfcG9ydChiciwgYnItPnJvb3RfcG9ydCkpOworfQorCisvKiBjYWxsZWQgdW5kZXIgYnJpZGdlIGxvY2sgKi8KK3N0YXRpYyBpbnQgYnJfc2hvdWxkX2JlY29tZV9kZXNpZ25hdGVkX3BvcnQoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCkKK3sKKwlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnI7CisJaW50IHQ7CisKKwliciA9IHAtPmJyOworCWlmIChicl9pc19kZXNpZ25hdGVkX3BvcnQocCkpCisJCXJldHVybiAxOworCisJaWYgKG1lbWNtcCgmcC0+ZGVzaWduYXRlZF9yb290LCAmYnItPmRlc2lnbmF0ZWRfcm9vdCwgOCkpCisJCXJldHVybiAxOworCisJaWYgKGJyLT5yb290X3BhdGhfY29zdCA8IHAtPmRlc2lnbmF0ZWRfY29zdCkKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAoYnItPnJvb3RfcGF0aF9jb3N0ID4gcC0+ZGVzaWduYXRlZF9jb3N0KQorCQlyZXR1cm4gMDsKKworCXQgPSBtZW1jbXAoJmJyLT5icmlkZ2VfaWQsICZwLT5kZXNpZ25hdGVkX2JyaWRnZSwgOCk7CisJaWYgKHQgPCAwKQorCQlyZXR1cm4gMTsKKwllbHNlIGlmICh0ID4gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAocC0+cG9ydF9pZCA8IHAtPmRlc2lnbmF0ZWRfcG9ydCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyogY2FsbGVkIHVuZGVyIGJyaWRnZSBsb2NrICovCitzdGF0aWMgdm9pZCBicl9kZXNpZ25hdGVkX3BvcnRfc2VsZWN0aW9uKHN0cnVjdCBuZXRfYnJpZGdlICpicikKK3sKKwlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmYnItPnBvcnRfbGlzdCwgbGlzdCkgeworCQlpZiAocC0+c3RhdGUgIT0gQlJfU1RBVEVfRElTQUJMRUQgJiYKKwkJICAgIGJyX3Nob3VsZF9iZWNvbWVfZGVzaWduYXRlZF9wb3J0KHApKQorCQkJYnJfYmVjb21lX2Rlc2lnbmF0ZWRfcG9ydChwKTsKKworCX0KK30KKworLyogY2FsbGVkIHVuZGVyIGJyaWRnZSBsb2NrICovCitzdGF0aWMgaW50IGJyX3N1cGVyc2VkZXNfcG9ydF9pbmZvKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIHN0cnVjdCBicl9jb25maWdfYnBkdSAqYnBkdSkKK3sKKwlpbnQgdDsKKworCXQgPSBtZW1jbXAoJmJwZHUtPnJvb3QsICZwLT5kZXNpZ25hdGVkX3Jvb3QsIDgpOworCWlmICh0IDwgMCkKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAodCA+IDApCisJCXJldHVybiAwOworCisJaWYgKGJwZHUtPnJvb3RfcGF0aF9jb3N0IDwgcC0+ZGVzaWduYXRlZF9jb3N0KQorCQlyZXR1cm4gMTsKKwllbHNlIGlmIChicGR1LT5yb290X3BhdGhfY29zdCA+IHAtPmRlc2lnbmF0ZWRfY29zdCkKKwkJcmV0dXJuIDA7CisKKwl0ID0gbWVtY21wKCZicGR1LT5icmlkZ2VfaWQsICZwLT5kZXNpZ25hdGVkX2JyaWRnZSwgOCk7CisJaWYgKHQgPCAwKQorCQlyZXR1cm4gMTsKKwllbHNlIGlmICh0ID4gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAobWVtY21wKCZicGR1LT5icmlkZ2VfaWQsICZwLT5ici0+YnJpZGdlX2lkLCA4KSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoYnBkdS0+cG9ydF9pZCA8PSBwLT5kZXNpZ25hdGVkX3BvcnQpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGNhbGxlZCB1bmRlciBicmlkZ2UgbG9jayAqLworc3RhdGljIGlubGluZSB2b2lkIGJyX3RvcG9sb2d5X2NoYW5nZV9hY2tub3dsZWRnZWQoc3RydWN0IG5ldF9icmlkZ2UgKmJyKQoreworCWJyLT50b3BvbG9neV9jaGFuZ2VfZGV0ZWN0ZWQgPSAwOworCWRlbF90aW1lcigmYnItPnRjbl90aW1lcik7Cit9CisKKy8qIGNhbGxlZCB1bmRlciBicmlkZ2UgbG9jayAqLwordm9pZCBicl90b3BvbG9neV9jaGFuZ2VfZGV0ZWN0aW9uKHN0cnVjdCBuZXRfYnJpZGdlICpicikKK3sKKwlpbnQgaXNyb290ID0gYnJfaXNfcm9vdF9icmlkZ2UoYnIpOworCisJcHJfaW5mbygiJXM6IHRvcG9sb2d5IGNoYW5nZSBkZXRlY3RlZCwgJXNcbiIsIGJyLT5kZXYtPm5hbWUsCisJCWlzcm9vdCA/ICJwcm9wYWdhdGluZyIgOiAic2VuZGluZyB0Y24gYnBkdSIpOworCisJaWYgKGlzcm9vdCkgeworCQlici0+dG9wb2xvZ3lfY2hhbmdlID0gMTsKKwkJbW9kX3RpbWVyKCZici0+dG9wb2xvZ3lfY2hhbmdlX3RpbWVyLCBqaWZmaWVzCisJCQkgICsgYnItPmJyaWRnZV9mb3J3YXJkX2RlbGF5ICsgYnItPmJyaWRnZV9tYXhfYWdlKTsKKwl9IGVsc2UgaWYgKCFici0+dG9wb2xvZ3lfY2hhbmdlX2RldGVjdGVkKSB7CisJCWJyX3RyYW5zbWl0X3Rjbihicik7CisJCW1vZF90aW1lcigmYnItPnRjbl90aW1lciwgamlmZmllcyArIGJyLT5icmlkZ2VfaGVsbG9fdGltZSk7CisJfQorCisJYnItPnRvcG9sb2d5X2NoYW5nZV9kZXRlY3RlZCA9IDE7Cit9CisKKy8qIGNhbGxlZCB1bmRlciBicmlkZ2UgbG9jayAqLwordm9pZCBicl9jb25maWdfYnBkdV9nZW5lcmF0aW9uKHN0cnVjdCBuZXRfYnJpZGdlICpicikKK3sKKwlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmYnItPnBvcnRfbGlzdCwgbGlzdCkgeworCQlpZiAocC0+c3RhdGUgIT0gQlJfU1RBVEVfRElTQUJMRUQgJiYKKwkJICAgIGJyX2lzX2Rlc2lnbmF0ZWRfcG9ydChwKSkKKwkJCWJyX3RyYW5zbWl0X2NvbmZpZyhwKTsKKwl9Cit9CisKKy8qIGNhbGxlZCB1bmRlciBicmlkZ2UgbG9jayAqLworc3RhdGljIGlubGluZSB2b2lkIGJyX3JlcGx5KHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApCit7CisJYnJfdHJhbnNtaXRfY29uZmlnKHApOworfQorCisvKiBjYWxsZWQgdW5kZXIgYnJpZGdlIGxvY2sgKi8KK3ZvaWQgYnJfY29uZmlndXJhdGlvbl91cGRhdGUoc3RydWN0IG5ldF9icmlkZ2UgKmJyKQoreworCWJyX3Jvb3Rfc2VsZWN0aW9uKGJyKTsKKwlicl9kZXNpZ25hdGVkX3BvcnRfc2VsZWN0aW9uKGJyKTsKK30KKworLyogY2FsbGVkIHVuZGVyIGJyaWRnZSBsb2NrICovCit2b2lkIGJyX2JlY29tZV9kZXNpZ25hdGVkX3BvcnQoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCkKK3sKKwlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnI7CisKKwliciA9IHAtPmJyOworCXAtPmRlc2lnbmF0ZWRfcm9vdCA9IGJyLT5kZXNpZ25hdGVkX3Jvb3Q7CisJcC0+ZGVzaWduYXRlZF9jb3N0ID0gYnItPnJvb3RfcGF0aF9jb3N0OworCXAtPmRlc2lnbmF0ZWRfYnJpZGdlID0gYnItPmJyaWRnZV9pZDsKKwlwLT5kZXNpZ25hdGVkX3BvcnQgPSBwLT5wb3J0X2lkOworfQorCisKKy8qIGNhbGxlZCB1bmRlciBicmlkZ2UgbG9jayAqLworc3RhdGljIHZvaWQgYnJfbWFrZV9ibG9ja2luZyhzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKQoreworCWlmIChwLT5zdGF0ZSAhPSBCUl9TVEFURV9ESVNBQkxFRCAmJgorCSAgICBwLT5zdGF0ZSAhPSBCUl9TVEFURV9CTE9DS0lORykgeworCQlpZiAocC0+c3RhdGUgPT0gQlJfU1RBVEVfRk9SV0FSRElORyB8fAorCQkgICAgcC0+c3RhdGUgPT0gQlJfU1RBVEVfTEVBUk5JTkcpCisJCQlicl90b3BvbG9neV9jaGFuZ2VfZGV0ZWN0aW9uKHAtPmJyKTsKKworCQlwLT5zdGF0ZSA9IEJSX1NUQVRFX0JMT0NLSU5HOworCQlicl9sb2dfc3RhdGUocCk7CisJCWRlbF90aW1lcigmcC0+Zm9yd2FyZF9kZWxheV90aW1lcik7CisJfQorfQorCisvKiBjYWxsZWQgdW5kZXIgYnJpZGdlIGxvY2sgKi8KK3N0YXRpYyB2b2lkIGJyX21ha2VfZm9yd2FyZGluZyhzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKQoreworCWlmIChwLT5zdGF0ZSA9PSBCUl9TVEFURV9CTE9DS0lORykgeworCQlpZiAocC0+YnItPnN0cF9lbmFibGVkKSB7CisJCQlwLT5zdGF0ZSA9IEJSX1NUQVRFX0xJU1RFTklORzsKKwkJfSBlbHNlIHsKKwkJCXAtPnN0YXRlID0gQlJfU1RBVEVfTEVBUk5JTkc7CisJCX0KKwkJYnJfbG9nX3N0YXRlKHApOworCQltb2RfdGltZXIoJnAtPmZvcndhcmRfZGVsYXlfdGltZXIsIGppZmZpZXMgKyBwLT5ici0+Zm9yd2FyZF9kZWxheSk7CX0KK30KKworLyogY2FsbGVkIHVuZGVyIGJyaWRnZSBsb2NrICovCit2b2lkIGJyX3BvcnRfc3RhdGVfc2VsZWN0aW9uKHN0cnVjdCBuZXRfYnJpZGdlICpicikKK3sKKwlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmYnItPnBvcnRfbGlzdCwgbGlzdCkgeworCQlpZiAocC0+c3RhdGUgIT0gQlJfU1RBVEVfRElTQUJMRUQpIHsKKwkJCWlmIChwLT5wb3J0X25vID09IGJyLT5yb290X3BvcnQpIHsKKwkJCQlwLT5jb25maWdfcGVuZGluZyA9IDA7CisJCQkJcC0+dG9wb2xvZ3lfY2hhbmdlX2FjayA9IDA7CisJCQkJYnJfbWFrZV9mb3J3YXJkaW5nKHApOworCQkJfSBlbHNlIGlmIChicl9pc19kZXNpZ25hdGVkX3BvcnQocCkpIHsKKwkJCQlkZWxfdGltZXIoJnAtPm1lc3NhZ2VfYWdlX3RpbWVyKTsKKwkJCQlicl9tYWtlX2ZvcndhcmRpbmcocCk7CisJCQl9IGVsc2UgeworCQkJCXAtPmNvbmZpZ19wZW5kaW5nID0gMDsKKwkJCQlwLT50b3BvbG9neV9jaGFuZ2VfYWNrID0gMDsKKwkJCQlicl9tYWtlX2Jsb2NraW5nKHApOworCQkJfQorCQl9CisKKwl9Cit9CisKKy8qIGNhbGxlZCB1bmRlciBicmlkZ2UgbG9jayAqLworc3RhdGljIGlubGluZSB2b2lkIGJyX3RvcG9sb2d5X2NoYW5nZV9hY2tub3dsZWRnZShzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKQoreworCXAtPnRvcG9sb2d5X2NoYW5nZV9hY2sgPSAxOworCWJyX3RyYW5zbWl0X2NvbmZpZyhwKTsKK30KKworLyogY2FsbGVkIHVuZGVyIGJyaWRnZSBsb2NrICovCit2b2lkIGJyX3JlY2VpdmVkX2NvbmZpZ19icGR1KHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIHN0cnVjdCBicl9jb25maWdfYnBkdSAqYnBkdSkKK3sKKwlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnI7CisJaW50IHdhc19yb290OworIAorCWJyID0gcC0+YnI7CisJd2FzX3Jvb3QgPSBicl9pc19yb290X2JyaWRnZShicik7CisKKwlpZiAoYnJfc3VwZXJzZWRlc19wb3J0X2luZm8ocCwgYnBkdSkpIHsKKwkJYnJfcmVjb3JkX2NvbmZpZ19pbmZvcm1hdGlvbihwLCBicGR1KTsKKwkJYnJfY29uZmlndXJhdGlvbl91cGRhdGUoYnIpOworCQlicl9wb3J0X3N0YXRlX3NlbGVjdGlvbihicik7CisKKwkJaWYgKCFicl9pc19yb290X2JyaWRnZShicikgJiYgd2FzX3Jvb3QpIHsKKwkJCWRlbF90aW1lcigmYnItPmhlbGxvX3RpbWVyKTsKKwkJCWlmIChici0+dG9wb2xvZ3lfY2hhbmdlX2RldGVjdGVkKSB7CisJCQkJZGVsX3RpbWVyKCZici0+dG9wb2xvZ3lfY2hhbmdlX3RpbWVyKTsKKwkJCQlicl90cmFuc21pdF90Y24oYnIpOworCisJCQkJbW9kX3RpbWVyKCZici0+dGNuX3RpbWVyLCAKKwkJCQkJICBqaWZmaWVzICsgYnItPmJyaWRnZV9oZWxsb190aW1lKTsKKwkJCX0KKwkJfQorCisJCWlmIChwLT5wb3J0X25vID09IGJyLT5yb290X3BvcnQpIHsKKwkJCWJyX3JlY29yZF9jb25maWdfdGltZW91dF92YWx1ZXMoYnIsIGJwZHUpOworCQkJYnJfY29uZmlnX2JwZHVfZ2VuZXJhdGlvbihicik7CisJCQlpZiAoYnBkdS0+dG9wb2xvZ3lfY2hhbmdlX2FjaykKKwkJCQlicl90b3BvbG9neV9jaGFuZ2VfYWNrbm93bGVkZ2VkKGJyKTsKKwkJfQorCX0gZWxzZSBpZiAoYnJfaXNfZGVzaWduYXRlZF9wb3J0KHApKSB7CQkKKwkJYnJfcmVwbHkocCk7CQkKKwl9Cit9CisKKy8qIGNhbGxlZCB1bmRlciBicmlkZ2UgbG9jayAqLwordm9pZCBicl9yZWNlaXZlZF90Y25fYnBkdShzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKQoreworCWlmIChicl9pc19kZXNpZ25hdGVkX3BvcnQocCkpIHsKKwkJcHJfaW5mbygiJXM6IHJlY2VpdmVkIHRjbiBicGR1IG9uIHBvcnQgJWkoJXMpXG4iLAorCQkgICAgICAgcC0+YnItPmRldi0+bmFtZSwgcC0+cG9ydF9ubywgcC0+ZGV2LT5uYW1lKTsKKworCQlicl90b3BvbG9neV9jaGFuZ2VfZGV0ZWN0aW9uKHAtPmJyKTsKKwkJYnJfdG9wb2xvZ3lfY2hhbmdlX2Fja25vd2xlZGdlKHApOworCX0KK30KZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfc3RwX2JwZHUuYyBiL25ldC9icmlkZ2UvYnJfc3RwX2JwZHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTFhODc1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JyaWRnZS9icl9zdHBfYnBkdS5jCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICoJU3Bhbm5pbmcgdHJlZSBwcm90b2NvbDsgQlBEVSBoYW5kbGluZworICoJTGludXggZXRoZXJuZXQgYnJpZGdlCisgKgorICoJQXV0aG9yczoKKyAqCUxlbm5lcnQgQnV5dGVuaGVrCQk8YnV5dGVuaEBnbnUub3JnPgorICoKKyAqCSRJZDogYnJfc3RwX2JwZHUuYyx2IDEuMyAyMDAxLzExLzEwIDAyOjM1OjI1IGRhdmVtIEV4cCAkCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS5oPgorCisjaW5jbHVkZSAiYnJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImJyX3ByaXZhdGVfc3RwLmgiCisKKyNkZWZpbmUgSklGRklFU19UT19USUNLUyhqKSAoKChqKSA8PCA4KSAvIEhaKQorI2RlZmluZSBUSUNLU19UT19KSUZGSUVTKGopICgoKGopICogSFopID4+IDgpCisKK3N0YXRpYyB2b2lkIGJyX3NlbmRfYnBkdShzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuZ3RoKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgc2l6ZTsKKworCWlmICghcC0+YnItPnN0cF9lbmFibGVkKQorCQlyZXR1cm47CisKKwlzaXplID0gbGVuZ3RoICsgMipFVEhfQUxFTiArIDI7CisJaWYgKHNpemUgPCA2MCkKKwkJc2l6ZSA9IDYwOworCisJZGV2ID0gcC0+ZGV2OworCisJaWYgKChza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemUpKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0lORk8gImJyOiBtZW1vcnkgc3F1ZWV6ZSFcbiIpOworCQlyZXR1cm47CisJfQorCisJc2tiLT5kZXYgPSBkZXY7CisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QXzgwMl8yKTsKKwlza2ItPm1hYy5yYXcgPSBza2JfcHV0KHNrYiwgc2l6ZSk7CisJbWVtY3B5KHNrYi0+bWFjLnJhdywgYnJpZGdlX3VsYSwgRVRIX0FMRU4pOworCW1lbWNweShza2ItPm1hYy5yYXcrRVRIX0FMRU4sIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwlza2ItPm1hYy5yYXdbMipFVEhfQUxFTl0gPSAwOworCXNrYi0+bWFjLnJhd1syKkVUSF9BTEVOKzFdID0gbGVuZ3RoOworCXNrYi0+bmgucmF3ID0gc2tiLT5tYWMucmF3ICsgMipFVEhfQUxFTiArIDI7CisJbWVtY3B5KHNrYi0+bmgucmF3LCBkYXRhLCBsZW5ndGgpOworCW1lbXNldChza2ItPm5oLnJhdyArIGxlbmd0aCwgMHhhNSwgc2l6ZSAtIGxlbmd0aCAtIDIqRVRIX0FMRU4gLSAyKTsKKworCU5GX0hPT0soUEZfQlJJREdFLCBORl9CUl9MT0NBTF9PVVQsIHNrYiwgTlVMTCwgc2tiLT5kZXYsCisJCWRldl9xdWV1ZV94bWl0KTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBicl9zZXRfdGlja3ModW5zaWduZWQgY2hhciAqZGVzdCwgaW50IGppZmYpCit7CisJX191MTYgdGlja3M7CisKKwl0aWNrcyA9IEpJRkZJRVNfVE9fVElDS1MoamlmZik7CisJZGVzdFswXSA9ICh0aWNrcyA+PiA4KSAmIDB4RkY7CisJZGVzdFsxXSA9IHRpY2tzICYgMHhGRjsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IGJyX2dldF90aWNrcyh1bnNpZ25lZCBjaGFyICpkZXN0KQoreworCXJldHVybiBUSUNLU19UT19KSUZGSUVTKChkZXN0WzBdIDw8IDgpIHwgZGVzdFsxXSk7Cit9CisKKy8qIGNhbGxlZCB1bmRlciBicmlkZ2UgbG9jayAqLwordm9pZCBicl9zZW5kX2NvbmZpZ19icGR1KHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIHN0cnVjdCBicl9jb25maWdfYnBkdSAqYnBkdSkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZlszOF07CisKKwlidWZbMF0gPSAweDQyOworCWJ1ZlsxXSA9IDB4NDI7CisJYnVmWzJdID0gMHgwMzsKKwlidWZbM10gPSAwOworCWJ1Zls0XSA9IDA7CisJYnVmWzVdID0gMDsKKwlidWZbNl0gPSBCUERVX1RZUEVfQ09ORklHOworCWJ1Zls3XSA9IChicGR1LT50b3BvbG9neV9jaGFuZ2UgPyAweDAxIDogMCkgfAorCQkoYnBkdS0+dG9wb2xvZ3lfY2hhbmdlX2FjayA/IDB4ODAgOiAwKTsKKwlidWZbOF0gPSBicGR1LT5yb290LnByaW9bMF07CisJYnVmWzldID0gYnBkdS0+cm9vdC5wcmlvWzFdOworCWJ1ZlsxMF0gPSBicGR1LT5yb290LmFkZHJbMF07CisJYnVmWzExXSA9IGJwZHUtPnJvb3QuYWRkclsxXTsKKwlidWZbMTJdID0gYnBkdS0+cm9vdC5hZGRyWzJdOworCWJ1ZlsxM10gPSBicGR1LT5yb290LmFkZHJbM107CisJYnVmWzE0XSA9IGJwZHUtPnJvb3QuYWRkcls0XTsKKwlidWZbMTVdID0gYnBkdS0+cm9vdC5hZGRyWzVdOworCWJ1ZlsxNl0gPSAoYnBkdS0+cm9vdF9wYXRoX2Nvc3QgPj4gMjQpICYgMHhGRjsKKwlidWZbMTddID0gKGJwZHUtPnJvb3RfcGF0aF9jb3N0ID4+IDE2KSAmIDB4RkY7CisJYnVmWzE4XSA9IChicGR1LT5yb290X3BhdGhfY29zdCA+PiA4KSAmIDB4RkY7CisJYnVmWzE5XSA9IGJwZHUtPnJvb3RfcGF0aF9jb3N0ICYgMHhGRjsKKwlidWZbMjBdID0gYnBkdS0+YnJpZGdlX2lkLnByaW9bMF07CisJYnVmWzIxXSA9IGJwZHUtPmJyaWRnZV9pZC5wcmlvWzFdOworCWJ1ZlsyMl0gPSBicGR1LT5icmlkZ2VfaWQuYWRkclswXTsKKwlidWZbMjNdID0gYnBkdS0+YnJpZGdlX2lkLmFkZHJbMV07CisJYnVmWzI0XSA9IGJwZHUtPmJyaWRnZV9pZC5hZGRyWzJdOworCWJ1ZlsyNV0gPSBicGR1LT5icmlkZ2VfaWQuYWRkclszXTsKKwlidWZbMjZdID0gYnBkdS0+YnJpZGdlX2lkLmFkZHJbNF07CisJYnVmWzI3XSA9IGJwZHUtPmJyaWRnZV9pZC5hZGRyWzVdOworCWJ1ZlsyOF0gPSAoYnBkdS0+cG9ydF9pZCA+PiA4KSAmIDB4RkY7CisJYnVmWzI5XSA9IGJwZHUtPnBvcnRfaWQgJiAweEZGOworCisJYnJfc2V0X3RpY2tzKGJ1ZiszMCwgYnBkdS0+bWVzc2FnZV9hZ2UpOworCWJyX3NldF90aWNrcyhidWYrMzIsIGJwZHUtPm1heF9hZ2UpOworCWJyX3NldF90aWNrcyhidWYrMzQsIGJwZHUtPmhlbGxvX3RpbWUpOworCWJyX3NldF90aWNrcyhidWYrMzYsIGJwZHUtPmZvcndhcmRfZGVsYXkpOworCisJYnJfc2VuZF9icGR1KHAsIGJ1ZiwgMzgpOworfQorCisvKiBjYWxsZWQgdW5kZXIgYnJpZGdlIGxvY2sgKi8KK3ZvaWQgYnJfc2VuZF90Y25fYnBkdShzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKQoreworCXVuc2lnbmVkIGNoYXIgYnVmWzddOworCisJYnVmWzBdID0gMHg0MjsKKwlidWZbMV0gPSAweDQyOworCWJ1ZlsyXSA9IDB4MDM7CisJYnVmWzNdID0gMDsKKwlidWZbNF0gPSAwOworCWJ1Zls1XSA9IDA7CisJYnVmWzZdID0gQlBEVV9UWVBFX1RDTjsKKwlicl9zZW5kX2JwZHUocCwgYnVmLCA3KTsKK30KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaGVhZGVyWzZdID0gezB4NDIsIDB4NDIsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9OworCisvKiBOTyBsb2NrcyAqLworaW50IGJyX3N0cF9oYW5kbGVfYnBkdShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAgPSBza2ItPmRldi0+YnJfcG9ydDsKKwlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSBwLT5icjsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisKKwkvKiBuZWVkIGF0IGxlYXN0IHRoZSA4MDIgYW5kIFNUUCBoZWFkZXJzICovCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKGhlYWRlcikrMSkgfHwKKwkgICAgbWVtY21wKHNrYi0+ZGF0YSwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkpCisJCWdvdG8gZXJyOworCisJYnVmID0gc2tiX3B1bGwoc2tiLCBzaXplb2YoaGVhZGVyKSk7CisKKwlzcGluX2xvY2tfYmgoJmJyLT5sb2NrKTsKKwlpZiAocC0+c3RhdGUgPT0gQlJfU1RBVEVfRElTQUJMRUQgCisJICAgIHx8ICEoYnItPmRldi0+ZmxhZ3MgJiBJRkZfVVApCisJICAgIHx8ICFici0+c3RwX2VuYWJsZWQpCisJCWdvdG8gb3V0OworCisJaWYgKGJ1ZlswXSA9PSBCUERVX1RZUEVfQ09ORklHKSB7CisJCXN0cnVjdCBicl9jb25maWdfYnBkdSBicGR1OworCisJCWlmICghcHNrYl9tYXlfcHVsbChza2IsIDMyKSkKKwkJICAgIGdvdG8gb3V0OworCisJCWJ1ZiA9IHNrYi0+ZGF0YTsKKwkJYnBkdS50b3BvbG9neV9jaGFuZ2UgPSAoYnVmWzFdICYgMHgwMSkgPyAxIDogMDsKKwkJYnBkdS50b3BvbG9neV9jaGFuZ2VfYWNrID0gKGJ1ZlsxXSAmIDB4ODApID8gMSA6IDA7CisKKwkJYnBkdS5yb290LnByaW9bMF0gPSBidWZbMl07CisJCWJwZHUucm9vdC5wcmlvWzFdID0gYnVmWzNdOworCQlicGR1LnJvb3QuYWRkclswXSA9IGJ1Zls0XTsKKwkJYnBkdS5yb290LmFkZHJbMV0gPSBidWZbNV07CisJCWJwZHUucm9vdC5hZGRyWzJdID0gYnVmWzZdOworCQlicGR1LnJvb3QuYWRkclszXSA9IGJ1Zls3XTsKKwkJYnBkdS5yb290LmFkZHJbNF0gPSBidWZbOF07CisJCWJwZHUucm9vdC5hZGRyWzVdID0gYnVmWzldOworCQlicGR1LnJvb3RfcGF0aF9jb3N0ID0KKwkJCShidWZbMTBdIDw8IDI0KSB8CisJCQkoYnVmWzExXSA8PCAxNikgfAorCQkJKGJ1ZlsxMl0gPDwgOCkgfAorCQkJYnVmWzEzXTsKKwkJYnBkdS5icmlkZ2VfaWQucHJpb1swXSA9IGJ1ZlsxNF07CisJCWJwZHUuYnJpZGdlX2lkLnByaW9bMV0gPSBidWZbMTVdOworCQlicGR1LmJyaWRnZV9pZC5hZGRyWzBdID0gYnVmWzE2XTsKKwkJYnBkdS5icmlkZ2VfaWQuYWRkclsxXSA9IGJ1ZlsxN107CisJCWJwZHUuYnJpZGdlX2lkLmFkZHJbMl0gPSBidWZbMThdOworCQlicGR1LmJyaWRnZV9pZC5hZGRyWzNdID0gYnVmWzE5XTsKKwkJYnBkdS5icmlkZ2VfaWQuYWRkcls0XSA9IGJ1ZlsyMF07CisJCWJwZHUuYnJpZGdlX2lkLmFkZHJbNV0gPSBidWZbMjFdOworCQlicGR1LnBvcnRfaWQgPSAoYnVmWzIyXSA8PCA4KSB8IGJ1ZlsyM107CisKKwkJYnBkdS5tZXNzYWdlX2FnZSA9IGJyX2dldF90aWNrcyhidWYrMjQpOworCQlicGR1Lm1heF9hZ2UgPSBicl9nZXRfdGlja3MoYnVmKzI2KTsKKwkJYnBkdS5oZWxsb190aW1lID0gYnJfZ2V0X3RpY2tzKGJ1ZisyOCk7CisJCWJwZHUuZm9yd2FyZF9kZWxheSA9IGJyX2dldF90aWNrcyhidWYrMzApOworCisJCWJyX3JlY2VpdmVkX2NvbmZpZ19icGR1KHAsICZicGR1KTsKKwl9CisKKwllbHNlIGlmIChidWZbMF0gPT0gQlBEVV9UWVBFX1RDTikgeworCQlicl9yZWNlaXZlZF90Y25fYnBkdShwKTsKKwl9Cisgb3V0OgorCXNwaW5fdW5sb2NrX2JoKCZici0+bG9jayk7CisgZXJyOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9zdHBfaWYuYyBiL25ldC9icmlkZ2UvYnJfc3RwX2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRhMTFmZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9icmlkZ2UvYnJfc3RwX2lmLmMKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKglTcGFubmluZyB0cmVlIHByb3RvY29sOyBpbnRlcmZhY2UgY29kZQorICoJTGludXggZXRoZXJuZXQgYnJpZGdlCisgKgorICoJQXV0aG9yczoKKyAqCUxlbm5lcnQgQnV5dGVuaGVrCQk8YnV5dGVuaEBnbnUub3JnPgorICoKKyAqCSRJZDogYnJfc3RwX2lmLmMsdiAxLjQgMjAwMS8wNC8xNCAyMToxNDozOSBkYXZlbSBFeHAgJAorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKyNpbmNsdWRlICJicl9wcml2YXRlLmgiCisjaW5jbHVkZSAiYnJfcHJpdmF0ZV9zdHAuaCIKKworCisvKiBQb3J0IGlkIGlzIGNvbXBvc2VkIG9mIHByaW9yaXR5IGFuZCBwb3J0IG51bWJlci4KKyAqIE5COiBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHByaW9yaXR5IGFyZSBkcm9wcGVkIHRvCisgKiAgICAgbWFrZSByb29tIGZvciBtb3JlIHBvcnRzLgorICovCitzdGF0aWMgaW5saW5lIHBvcnRfaWQgYnJfbWFrZV9wb3J0X2lkKF9fdTggcHJpb3JpdHksIF9fdTE2IHBvcnRfbm8pCit7CisJcmV0dXJuICgodTE2KXByaW9yaXR5IDw8IEJSX1BPUlRfQklUUykgCisJCXwgKHBvcnRfbm8gJiAoKDE8PEJSX1BPUlRfQklUUyktMSkpOworfQorCisvKiBjYWxsZWQgdW5kZXIgYnJpZGdlIGxvY2sgKi8KK3ZvaWQgYnJfaW5pdF9wb3J0KHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApCit7CisJcC0+cG9ydF9pZCA9IGJyX21ha2VfcG9ydF9pZChwLT5wcmlvcml0eSwgcC0+cG9ydF9ubyk7CisJYnJfYmVjb21lX2Rlc2lnbmF0ZWRfcG9ydChwKTsKKwlwLT5zdGF0ZSA9IEJSX1NUQVRFX0JMT0NLSU5HOworCXAtPnRvcG9sb2d5X2NoYW5nZV9hY2sgPSAwOworCXAtPmNvbmZpZ19wZW5kaW5nID0gMDsKKworCWJyX3N0cF9wb3J0X3RpbWVyX2luaXQocCk7Cit9CisKKy8qIGNhbGxlZCB1bmRlciBicmlkZ2UgbG9jayAqLwordm9pZCBicl9zdHBfZW5hYmxlX2JyaWRnZShzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIpCit7CisJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcDsKKworCXNwaW5fbG9ja19iaCgmYnItPmxvY2spOworCW1vZF90aW1lcigmYnItPmhlbGxvX3RpbWVyLCBqaWZmaWVzICsgYnItPmhlbGxvX3RpbWUpOworCW1vZF90aW1lcigmYnItPmdjX3RpbWVyLCBqaWZmaWVzICsgSFovMTApOworCQorCWJyX2NvbmZpZ19icGR1X2dlbmVyYXRpb24oYnIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmYnItPnBvcnRfbGlzdCwgbGlzdCkgeworCQlpZiAoKHAtPmRldi0+ZmxhZ3MgJiBJRkZfVVApICYmIG5ldGlmX2NhcnJpZXJfb2socC0+ZGV2KSkKKwkJCWJyX3N0cF9lbmFibGVfcG9ydChwKTsKKworCX0KKwlzcGluX3VubG9ja19iaCgmYnItPmxvY2spOworfQorCisvKiBOTyBsb2NrcyBoZWxkICovCit2b2lkIGJyX3N0cF9kaXNhYmxlX2JyaWRnZShzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIpCit7CisJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcDsKKworCXNwaW5fbG9jaygmYnItPmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmJyLT5wb3J0X2xpc3QsIGxpc3QpIHsKKwkJaWYgKHAtPnN0YXRlICE9IEJSX1NUQVRFX0RJU0FCTEVEKQorCQkJYnJfc3RwX2Rpc2FibGVfcG9ydChwKTsKKworCX0KKworCWJyLT50b3BvbG9neV9jaGFuZ2UgPSAwOworCWJyLT50b3BvbG9neV9jaGFuZ2VfZGV0ZWN0ZWQgPSAwOworCXNwaW5fdW5sb2NrKCZici0+bG9jayk7CisKKwlkZWxfdGltZXJfc3luYygmYnItPmhlbGxvX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmYnItPnRvcG9sb2d5X2NoYW5nZV90aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJmJyLT50Y25fdGltZXIpOworCWRlbF90aW1lcl9zeW5jKCZici0+Z2NfdGltZXIpOworfQorCisvKiBjYWxsZWQgdW5kZXIgYnJpZGdlIGxvY2sgKi8KK3ZvaWQgYnJfc3RwX2VuYWJsZV9wb3J0KHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApCit7CisJYnJfaW5pdF9wb3J0KHApOworCWJyX3BvcnRfc3RhdGVfc2VsZWN0aW9uKHAtPmJyKTsKK30KKworLyogY2FsbGVkIHVuZGVyIGJyaWRnZSBsb2NrICovCit2b2lkIGJyX3N0cF9kaXNhYmxlX3BvcnQoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCkKK3sKKwlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnI7CisJaW50IHdhc3Jvb3Q7CisKKwliciA9IHAtPmJyOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBwb3J0ICVpKCVzKSBlbnRlcmluZyAlcyBzdGF0ZVxuIiwKKwkgICAgICAgYnItPmRldi0+bmFtZSwgcC0+cG9ydF9ubywgcC0+ZGV2LT5uYW1lLCAiZGlzYWJsZWQiKTsKKworCXdhc3Jvb3QgPSBicl9pc19yb290X2JyaWRnZShicik7CisJYnJfYmVjb21lX2Rlc2lnbmF0ZWRfcG9ydChwKTsKKwlwLT5zdGF0ZSA9IEJSX1NUQVRFX0RJU0FCTEVEOworCXAtPnRvcG9sb2d5X2NoYW5nZV9hY2sgPSAwOworCXAtPmNvbmZpZ19wZW5kaW5nID0gMDsKKworCWRlbF90aW1lcigmcC0+bWVzc2FnZV9hZ2VfdGltZXIpOworCWRlbF90aW1lcigmcC0+Zm9yd2FyZF9kZWxheV90aW1lcik7CisJZGVsX3RpbWVyKCZwLT5ob2xkX3RpbWVyKTsKKworCWJyX2NvbmZpZ3VyYXRpb25fdXBkYXRlKGJyKTsKKworCWJyX3BvcnRfc3RhdGVfc2VsZWN0aW9uKGJyKTsKKworCWlmIChicl9pc19yb290X2JyaWRnZShicikgJiYgIXdhc3Jvb3QpCisJCWJyX2JlY29tZV9yb290X2JyaWRnZShicik7Cit9CisKKy8qIGNhbGxlZCB1bmRlciBicmlkZ2UgbG9jayAqLworc3RhdGljIHZvaWQgYnJfc3RwX2NoYW5nZV9icmlkZ2VfaWQoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCAKKwkJCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkcikKK3sKKwl1bnNpZ25lZCBjaGFyIG9sZGFkZHJbNl07CisJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcDsKKwlpbnQgd2Fzcm9vdDsKKworCXdhc3Jvb3QgPSBicl9pc19yb290X2JyaWRnZShicik7CisKKwltZW1jcHkob2xkYWRkciwgYnItPmJyaWRnZV9pZC5hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGJyLT5icmlkZ2VfaWQuYWRkciwgYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShici0+ZGV2LT5kZXZfYWRkciwgYWRkciwgRVRIX0FMRU4pOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmYnItPnBvcnRfbGlzdCwgbGlzdCkgeworCQlpZiAoIW1lbWNtcChwLT5kZXNpZ25hdGVkX2JyaWRnZS5hZGRyLCBvbGRhZGRyLCBFVEhfQUxFTikpCisJCQltZW1jcHkocC0+ZGVzaWduYXRlZF9icmlkZ2UuYWRkciwgYWRkciwgRVRIX0FMRU4pOworCisJCWlmICghbWVtY21wKHAtPmRlc2lnbmF0ZWRfcm9vdC5hZGRyLCBvbGRhZGRyLCBFVEhfQUxFTikpCisJCQltZW1jcHkocC0+ZGVzaWduYXRlZF9yb290LmFkZHIsIGFkZHIsIEVUSF9BTEVOKTsKKworCX0KKworCWJyX2NvbmZpZ3VyYXRpb25fdXBkYXRlKGJyKTsKKwlicl9wb3J0X3N0YXRlX3NlbGVjdGlvbihicik7CisJaWYgKGJyX2lzX3Jvb3RfYnJpZGdlKGJyKSAmJiAhd2Fzcm9vdCkKKwkJYnJfYmVjb21lX3Jvb3RfYnJpZGdlKGJyKTsKK30KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYnJfbWFjX3plcm9bNl07CisKKy8qIGNhbGxlZCB1bmRlciBicmlkZ2UgbG9jayAqLwordm9pZCBicl9zdHBfcmVjYWxjdWxhdGVfYnJpZGdlX2lkKHN0cnVjdCBuZXRfYnJpZGdlICpicikKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICphZGRyID0gYnJfbWFjX3plcm87CisJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmJyLT5wb3J0X2xpc3QsIGxpc3QpIHsKKwkJaWYgKGFkZHIgPT0gYnJfbWFjX3plcm8gfHwKKwkJICAgIG1lbWNtcChwLT5kZXYtPmRldl9hZGRyLCBhZGRyLCBFVEhfQUxFTikgPCAwKQorCQkJYWRkciA9IHAtPmRldi0+ZGV2X2FkZHI7CisKKwl9CisKKwlpZiAobWVtY21wKGJyLT5icmlkZ2VfaWQuYWRkciwgYWRkciwgRVRIX0FMRU4pKQorCQlicl9zdHBfY2hhbmdlX2JyaWRnZV9pZChiciwgYWRkcik7Cit9CisKKy8qIGNhbGxlZCB1bmRlciBicmlkZ2UgbG9jayAqLwordm9pZCBicl9zdHBfc2V0X2JyaWRnZV9wcmlvcml0eShzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHUxNiBuZXdwcmlvKQoreworCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnA7CisJaW50IHdhc3Jvb3Q7CisKKwl3YXNyb290ID0gYnJfaXNfcm9vdF9icmlkZ2UoYnIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmYnItPnBvcnRfbGlzdCwgbGlzdCkgeworCQlpZiAocC0+c3RhdGUgIT0gQlJfU1RBVEVfRElTQUJMRUQgJiYKKwkJICAgIGJyX2lzX2Rlc2lnbmF0ZWRfcG9ydChwKSkgeworCQkJcC0+ZGVzaWduYXRlZF9icmlkZ2UucHJpb1swXSA9IChuZXdwcmlvID4+IDgpICYgMHhGRjsKKwkJCXAtPmRlc2lnbmF0ZWRfYnJpZGdlLnByaW9bMV0gPSBuZXdwcmlvICYgMHhGRjsKKwkJfQorCisJfQorCisJYnItPmJyaWRnZV9pZC5wcmlvWzBdID0gKG5ld3ByaW8gPj4gOCkgJiAweEZGOworCWJyLT5icmlkZ2VfaWQucHJpb1sxXSA9IG5ld3ByaW8gJiAweEZGOworCWJyX2NvbmZpZ3VyYXRpb25fdXBkYXRlKGJyKTsKKwlicl9wb3J0X3N0YXRlX3NlbGVjdGlvbihicik7CisJaWYgKGJyX2lzX3Jvb3RfYnJpZGdlKGJyKSAmJiAhd2Fzcm9vdCkKKwkJYnJfYmVjb21lX3Jvb3RfYnJpZGdlKGJyKTsKK30KKworLyogY2FsbGVkIHVuZGVyIGJyaWRnZSBsb2NrICovCit2b2lkIGJyX3N0cF9zZXRfcG9ydF9wcmlvcml0eShzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCB1OCBuZXdwcmlvKQoreworCXBvcnRfaWQgbmV3X3BvcnRfaWQgPSBicl9tYWtlX3BvcnRfaWQobmV3cHJpbywgcC0+cG9ydF9ubyk7CisKKwlpZiAoYnJfaXNfZGVzaWduYXRlZF9wb3J0KHApKQorCQlwLT5kZXNpZ25hdGVkX3BvcnQgPSBuZXdfcG9ydF9pZDsKKworCXAtPnBvcnRfaWQgPSBuZXdfcG9ydF9pZDsKKwlwLT5wcmlvcml0eSA9IG5ld3ByaW87CisJaWYgKCFtZW1jbXAoJnAtPmJyLT5icmlkZ2VfaWQsICZwLT5kZXNpZ25hdGVkX2JyaWRnZSwgOCkgJiYKKwkgICAgcC0+cG9ydF9pZCA8IHAtPmRlc2lnbmF0ZWRfcG9ydCkgeworCQlicl9iZWNvbWVfZGVzaWduYXRlZF9wb3J0KHApOworCQlicl9wb3J0X3N0YXRlX3NlbGVjdGlvbihwLT5icik7CisJfQorfQorCisvKiBjYWxsZWQgdW5kZXIgYnJpZGdlIGxvY2sgKi8KK3ZvaWQgYnJfc3RwX3NldF9wYXRoX2Nvc3Qoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgdTMyIHBhdGhfY29zdCkKK3sKKwlwLT5wYXRoX2Nvc3QgPSBwYXRoX2Nvc3Q7CisJYnJfY29uZmlndXJhdGlvbl91cGRhdGUocC0+YnIpOworCWJyX3BvcnRfc3RhdGVfc2VsZWN0aW9uKHAtPmJyKTsKK30KKworc3NpemVfdCBicl9zaG93X2JyaWRnZV9pZChjaGFyICpidWYsIGNvbnN0IHN0cnVjdCBicmlkZ2VfaWQgKmlkKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiUuMnglLjJ4LiUuMnglLjJ4JS4yeCUuMnglLjJ4JS4yeFxuIiwKKwkgICAgICAgaWQtPnByaW9bMF0sIGlkLT5wcmlvWzFdLAorCSAgICAgICBpZC0+YWRkclswXSwgaWQtPmFkZHJbMV0sIGlkLT5hZGRyWzJdLAorCSAgICAgICBpZC0+YWRkclszXSwgaWQtPmFkZHJbNF0sIGlkLT5hZGRyWzVdKTsKK30KZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfc3RwX3RpbWVyLmMgYi9uZXQvYnJpZGdlL2JyX3N0cF90aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZWY1NWYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYnJpZGdlL2JyX3N0cF90aW1lci5jCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICoJU3Bhbm5pbmcgdHJlZSBwcm90b2NvbDsgdGltZXItcmVsYXRlZCBjb2RlCisgKglMaW51eCBldGhlcm5ldCBicmlkZ2UKKyAqCisgKglBdXRob3JzOgorICoJTGVubmVydCBCdXl0ZW5oZWsJCTxidXl0ZW5oQGdudS5vcmc+CisgKgorICoJJElkOiBicl9zdHBfdGltZXIuYyx2IDEuMyAyMDAwLzA1LzA1IDAyOjE3OjE3IGRhdmVtIEV4cCAkCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSAiYnJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImJyX3ByaXZhdGVfc3RwLmgiCisKKy8qIGNhbGxlZCB1bmRlciBicmlkZ2UgbG9jayAqLworc3RhdGljIGludCBicl9pc19kZXNpZ25hdGVkX2Zvcl9zb21lX3BvcnQoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyKQoreworCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZici0+cG9ydF9saXN0LCBsaXN0KSB7CisJCWlmIChwLT5zdGF0ZSAhPSBCUl9TVEFURV9ESVNBQkxFRCAmJgorCQkgICAgIW1lbWNtcCgmcC0+ZGVzaWduYXRlZF9icmlkZ2UsICZici0+YnJpZGdlX2lkLCA4KSkgCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYnJfaGVsbG9fdGltZXJfZXhwaXJlZCh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSAoc3RydWN0IG5ldF9icmlkZ2UgKilhcmc7CisJCisJcHJfZGVidWcoIiVzOiBoZWxsbyB0aW1lciBleHBpcmVkXG4iLCBici0+ZGV2LT5uYW1lKTsKKwlzcGluX2xvY2tfYmgoJmJyLT5sb2NrKTsKKwlpZiAoYnItPmRldi0+ZmxhZ3MgJiBJRkZfVVApIHsKKwkJYnJfY29uZmlnX2JwZHVfZ2VuZXJhdGlvbihicik7CisKKwkJbW9kX3RpbWVyKCZici0+aGVsbG9fdGltZXIsIGppZmZpZXMgKyBici0+aGVsbG9fdGltZSk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZici0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGJyX21lc3NhZ2VfYWdlX3RpbWVyX2V4cGlyZWQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCA9IChzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICopIGFyZzsKKwlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSBwLT5icjsKKwljb25zdCBicmlkZ2VfaWQgKmlkID0gJnAtPmRlc2lnbmF0ZWRfYnJpZGdlOworCWludCB3YXNfcm9vdDsKKworCWlmIChwLT5zdGF0ZSA9PSBCUl9TVEFURV9ESVNBQkxFRCkKKwkJcmV0dXJuOworCisJCisJcHJfaW5mbygiJXM6IG5laWdoYm9yICUuMnglLjJ4LiUuMng6JS4yeDolLjJ4OiUuMng6JS4yeDolLjJ4IGxvc3Qgb24gcG9ydCAlZCglcylcbiIsCisJCWJyLT5kZXYtPm5hbWUsIAorCQlpZC0+cHJpb1swXSwgaWQtPnByaW9bMV0sIAorCQlpZC0+YWRkclswXSwgaWQtPmFkZHJbMV0sIGlkLT5hZGRyWzJdLCAKKwkJaWQtPmFkZHJbM10sIGlkLT5hZGRyWzRdLCBpZC0+YWRkcls1XSwKKwkJcC0+cG9ydF9ubywgcC0+ZGV2LT5uYW1lKTsKKworCS8qCisJICogQWNjb3JkaW5nIHRvIHRoZSBzcGVjLCB0aGUgbWVzc2FnZSBhZ2UgdGltZXIgY2Fubm90IGJlCisJICogcnVubmluZyB3aGVuIHdlIGFyZSB0aGUgcm9vdCBicmlkZ2UuIFNvLi4gIHRoaXMgd2FzX3Jvb3QKKwkgKiBjaGVjayBpcyByZWR1bmRhbnQuIEknbSBsZWF2aW5nIGl0IGluIGZvciBub3csIHRob3VnaC4KKwkgKi8KKwlzcGluX2xvY2tfYmgoJmJyLT5sb2NrKTsKKwlpZiAocC0+c3RhdGUgPT0gQlJfU1RBVEVfRElTQUJMRUQpCisJCWdvdG8gdW5sb2NrOworCXdhc19yb290ID0gYnJfaXNfcm9vdF9icmlkZ2UoYnIpOworCisJYnJfYmVjb21lX2Rlc2lnbmF0ZWRfcG9ydChwKTsKKwlicl9jb25maWd1cmF0aW9uX3VwZGF0ZShicik7CisJYnJfcG9ydF9zdGF0ZV9zZWxlY3Rpb24oYnIpOworCWlmIChicl9pc19yb290X2JyaWRnZShicikgJiYgIXdhc19yb290KQorCQlicl9iZWNvbWVfcm9vdF9icmlkZ2UoYnIpOworIHVubG9jazoKKwlzcGluX3VubG9ja19iaCgmYnItPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBicl9mb3J3YXJkX2RlbGF5X3RpbWVyX2V4cGlyZWQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCA9IChzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICopIGFyZzsKKwlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSBwLT5icjsKKworCXByX2RlYnVnKCIlczogJWQoJXMpIGZvcndhcmQgZGVsYXkgdGltZXJcbiIsCisJCSBici0+ZGV2LT5uYW1lLCBwLT5wb3J0X25vLCBwLT5kZXYtPm5hbWUpOworCXNwaW5fbG9ja19iaCgmYnItPmxvY2spOworCWlmIChwLT5zdGF0ZSA9PSBCUl9TVEFURV9MSVNURU5JTkcpIHsKKwkJcC0+c3RhdGUgPSBCUl9TVEFURV9MRUFSTklORzsKKwkJbW9kX3RpbWVyKCZwLT5mb3J3YXJkX2RlbGF5X3RpbWVyLAorCQkJICBqaWZmaWVzICsgYnItPmZvcndhcmRfZGVsYXkpOworCX0gZWxzZSBpZiAocC0+c3RhdGUgPT0gQlJfU1RBVEVfTEVBUk5JTkcpIHsKKwkJcC0+c3RhdGUgPSBCUl9TVEFURV9GT1JXQVJESU5HOworCQlpZiAoYnJfaXNfZGVzaWduYXRlZF9mb3Jfc29tZV9wb3J0KGJyKSkKKwkJCWJyX3RvcG9sb2d5X2NoYW5nZV9kZXRlY3Rpb24oYnIpOworCX0KKwlicl9sb2dfc3RhdGUocCk7CisJc3Bpbl91bmxvY2tfYmgoJmJyLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgYnJfdGNuX3RpbWVyX2V4cGlyZWQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gKHN0cnVjdCBuZXRfYnJpZGdlICopIGFyZzsKKworCXByX2RlYnVnKCIlczogdGNuIHRpbWVyIGV4cGlyZWRcbiIsIGJyLT5kZXYtPm5hbWUpOworCXNwaW5fbG9ja19iaCgmYnItPmxvY2spOworCWlmIChici0+ZGV2LT5mbGFncyAmIElGRl9VUCkgeworCQlicl90cmFuc21pdF90Y24oYnIpOworCQorCQltb2RfdGltZXIoJmJyLT50Y25fdGltZXIsamlmZmllcyArIGJyLT5icmlkZ2VfaGVsbG9fdGltZSk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZici0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGJyX3RvcG9sb2d5X2NoYW5nZV90aW1lcl9leHBpcmVkKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IChzdHJ1Y3QgbmV0X2JyaWRnZSAqKSBhcmc7CisKKwlwcl9kZWJ1ZygiJXM6IHRvcG8gY2hhbmdlIHRpbWVyIGV4cGlyZWRcbiIsIGJyLT5kZXYtPm5hbWUpOworCXNwaW5fbG9ja19iaCgmYnItPmxvY2spOworCWJyLT50b3BvbG9neV9jaGFuZ2VfZGV0ZWN0ZWQgPSAwOworCWJyLT50b3BvbG9neV9jaGFuZ2UgPSAwOworCXNwaW5fdW5sb2NrX2JoKCZici0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGJyX2hvbGRfdGltZXJfZXhwaXJlZCh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwID0gKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKikgYXJnOworCisJcHJfZGVidWcoIiVzOiAlZCglcykgaG9sZCB0aW1lciBleHBpcmVkXG4iLCAKKwkJIHAtPmJyLT5kZXYtPm5hbWUsICBwLT5wb3J0X25vLCBwLT5kZXYtPm5hbWUpOworCisJc3Bpbl9sb2NrX2JoKCZwLT5ici0+bG9jayk7CisJaWYgKHAtPmNvbmZpZ19wZW5kaW5nKQorCQlicl90cmFuc21pdF9jb25maWcocCk7CisJc3Bpbl91bmxvY2tfYmgoJnAtPmJyLT5sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJyX3RpbWVyX2luaXQoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyLAorCQkJICB2b2lkICgqX2Z1bmN0aW9uKSh1bnNpZ25lZCBsb25nKSwKKwkJCSAgdW5zaWduZWQgbG9uZyBfZGF0YSkKK3sKKwlpbml0X3RpbWVyKHRpbWVyKTsKKwl0aW1lci0+ZnVuY3Rpb24gPSBfZnVuY3Rpb247CisJdGltZXItPmRhdGEgPSBfZGF0YTsKK30KKwordm9pZCBicl9zdHBfdGltZXJfaW5pdChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIpCit7CisJYnJfdGltZXJfaW5pdCgmYnItPmhlbGxvX3RpbWVyLCBicl9oZWxsb190aW1lcl9leHBpcmVkLAorCQkgICAgICAodW5zaWduZWQgbG9uZykgYnIpOworCisJYnJfdGltZXJfaW5pdCgmYnItPnRjbl90aW1lciwgYnJfdGNuX3RpbWVyX2V4cGlyZWQsIAorCQkgICAgICAodW5zaWduZWQgbG9uZykgYnIpOworCisJYnJfdGltZXJfaW5pdCgmYnItPnRvcG9sb2d5X2NoYW5nZV90aW1lciwKKwkJICAgICAgYnJfdG9wb2xvZ3lfY2hhbmdlX3RpbWVyX2V4cGlyZWQsCisJCSAgICAgICh1bnNpZ25lZCBsb25nKSBicik7CisKKwlicl90aW1lcl9pbml0KCZici0+Z2NfdGltZXIsIGJyX2ZkYl9jbGVhbnVwLCAodW5zaWduZWQgbG9uZykgYnIpOworfQorCit2b2lkIGJyX3N0cF9wb3J0X3RpbWVyX2luaXQoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCkKK3sKKwlicl90aW1lcl9pbml0KCZwLT5tZXNzYWdlX2FnZV90aW1lciwgYnJfbWVzc2FnZV9hZ2VfdGltZXJfZXhwaXJlZCwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpIHApOworCisJYnJfdGltZXJfaW5pdCgmcC0+Zm9yd2FyZF9kZWxheV90aW1lciwgYnJfZm9yd2FyZF9kZWxheV90aW1lcl9leHBpcmVkLAorCQkgICAgICAodW5zaWduZWQgbG9uZykgcCk7CisJCSAgICAgIAorCWJyX3RpbWVyX2luaXQoJnAtPmhvbGRfdGltZXIsIGJyX2hvbGRfdGltZXJfZXhwaXJlZCwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpIHApOworfQkKKworLyogUmVwb3J0IHRpY2tzIGxlZnQgKGluIFVTRVJfSFopIHVzZWQgZm9yIEFQSSAqLwordW5zaWduZWQgbG9uZyBicl90aW1lcl92YWx1ZShjb25zdCBzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCit7CisJcmV0dXJuIHRpbWVyX3BlbmRpbmcodGltZXIpCisJCT8gamlmZmllc190b19jbG9ja190KHRpbWVyLT5leHBpcmVzIC0gamlmZmllcykgOiAwOworfQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9zeXNmc19ici5jIGIvbmV0L2JyaWRnZS9icl9zeXNmc19ici5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4Y2Y1M2MKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYnJpZGdlL2JyX3N5c2ZzX2JyLmMKQEAgLTAsMCArMSwzNjQgQEAKKy8qCisgKglTeXNmcyBhdHRyaWJ1dGVzIG9mIGJyaWRnZSBwb3J0cworICoJTGludXggZXRoZXJuZXQgYnJpZGdlCisgKgorICoJQXV0aG9yczoKKyAqCVN0ZXBoZW4gSGVtbWluZ2VyCQk8c2hlbW1pbmdlckBvc2RsLm9yZz4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9icmlkZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVzLmg+CisKKyNpbmNsdWRlICJicl9wcml2YXRlLmgiCisKKyNkZWZpbmUgdG9fY2xhc3NfZGV2KG9iaikgY29udGFpbmVyX29mKG9iaixzdHJ1Y3QgY2xhc3NfZGV2aWNlLGtvYmopCisjZGVmaW5lIHRvX25ldF9kZXYoY2xhc3MpIGNvbnRhaW5lcl9vZihjbGFzcywgc3RydWN0IG5ldF9kZXZpY2UsIGNsYXNzX2RldikKKyNkZWZpbmUgdG9fYnJpZGdlKGNkKQkoKHN0cnVjdCBuZXRfYnJpZGdlICopKHRvX25ldF9kZXYoY2QpLT5wcml2KSkKKworLyoKKyAqIENvbW1vbiBjb2RlIGZvciBzdG9yaW5nIGJyaWRnZSBwYXJhbWV0ZXJzLgorICovCitzdGF0aWMgc3NpemVfdCBzdG9yZV9icmlkZ2VfcGFybShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwKKwkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuLAorCQkJCSB2b2lkICgqc2V0KShzdHJ1Y3QgbmV0X2JyaWRnZSAqLCB1bnNpZ25lZCBsb25nKSkKK3sKKwlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSB0b19icmlkZ2UoY2QpOworCWNoYXIgKmVuZHA7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsICZlbmRwLCAwKTsKKwlpZiAoZW5kcCA9PSBidWYpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2JoKCZici0+bG9jayk7CisJKCpzZXQpKGJyLCB2YWwpOworCXNwaW5fdW5sb2NrX2JoKCZici0+bG9jayk7CisJcmV0dXJuIGxlbjsKK30KKworCitzdGF0aWMgc3NpemVfdCBzaG93X2ZvcndhcmRfZGVsYXkoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSB0b19icmlkZ2UoY2QpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgamlmZmllc190b19jbG9ja190KGJyLT5mb3J3YXJkX2RlbGF5KSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9mb3J3YXJkX2RlbGF5KHN0cnVjdCBuZXRfYnJpZGdlICpiciwgdW5zaWduZWQgbG9uZyB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBkZWxheSA9IGNsb2NrX3RfdG9famlmZmllcyh2YWwpOworCWJyLT5mb3J3YXJkX2RlbGF5ID0gZGVsYXk7CisJaWYgKGJyX2lzX3Jvb3RfYnJpZGdlKGJyKSkKKwkJYnItPmJyaWRnZV9mb3J3YXJkX2RlbGF5ID0gZGVsYXk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2ZvcndhcmRfZGVsYXkoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkgICBzaXplX3QgbGVuKQoreworCXJldHVybiBzdG9yZV9icmlkZ2VfcGFybShjZCwgYnVmLCBsZW4sIHNldF9mb3J3YXJkX2RlbGF5KTsKK30KK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihmb3J3YXJkX2RlbGF5LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCSBzaG93X2ZvcndhcmRfZGVsYXksIHN0b3JlX2ZvcndhcmRfZGVsYXkpOworCitzdGF0aWMgc3NpemVfdCBzaG93X2hlbGxvX3RpbWUoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsCisJCSAgICAgICBqaWZmaWVzX3RvX2Nsb2NrX3QodG9fYnJpZGdlKGNkKS0+aGVsbG9fdGltZSkpOworfQorCitzdGF0aWMgdm9pZCBzZXRfaGVsbG9fdGltZShzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgdCA9IGNsb2NrX3RfdG9famlmZmllcyh2YWwpOworCWJyLT5oZWxsb190aW1lID0gdDsKKwlpZiAoYnJfaXNfcm9vdF9icmlkZ2UoYnIpKQorCQlici0+YnJpZGdlX2hlbGxvX3RpbWUgPSB0OworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9oZWxsb190aW1lKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjb25zdCBjaGFyICpidWYsCisJCQkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gc3RvcmVfYnJpZGdlX3Bhcm0oY2QsIGJ1ZiwgbGVuLCBzZXRfaGVsbG9fdGltZSk7Cit9CisKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihoZWxsb190aW1lLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19oZWxsb190aW1lLAorCQkJIHN0b3JlX2hlbGxvX3RpbWUpOworCitzdGF0aWMgc3NpemVfdCBzaG93X21heF9hZ2Uoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsCisJCSAgICAgICBqaWZmaWVzX3RvX2Nsb2NrX3QodG9fYnJpZGdlKGNkKS0+bWF4X2FnZSkpOworfQorCitzdGF0aWMgdm9pZCBzZXRfbWF4X2FnZShzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgdCA9IGNsb2NrX3RfdG9famlmZmllcyh2YWwpOworCWJyLT5tYXhfYWdlID0gdDsKKwlpZiAoYnJfaXNfcm9vdF9icmlkZ2UoYnIpKQorCQlici0+YnJpZGdlX21heF9hZ2UgPSB0OworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9tYXhfYWdlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjb25zdCBjaGFyICpidWYsCisJCQkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gc3RvcmVfYnJpZGdlX3Bhcm0oY2QsIGJ1ZiwgbGVuLCBzZXRfbWF4X2FnZSk7Cit9CisKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihtYXhfYWdlLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19tYXhfYWdlLAorCQkJIHN0b3JlX21heF9hZ2UpOworCitzdGF0aWMgc3NpemVfdCBzaG93X2FnZWluZ190aW1lKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCit7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gdG9fYnJpZGdlKGNkKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsIGppZmZpZXNfdG9fY2xvY2tfdChici0+YWdlaW5nX3RpbWUpKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2FnZWluZ190aW1lKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgdW5zaWduZWQgbG9uZyB2YWwpCit7CisJYnItPmFnZWluZ190aW1lID0gY2xvY2tfdF90b19qaWZmaWVzKHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2FnZWluZ190aW1lKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjb25zdCBjaGFyICpidWYsCisJCQkJIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIHN0b3JlX2JyaWRnZV9wYXJtKGNkLCBidWYsIGxlbiwgc2V0X2FnZWluZ190aW1lKTsKK30KKworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGFnZWluZ190aW1lLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19hZ2VpbmdfdGltZSwKKwkJCSBzdG9yZV9hZ2VpbmdfdGltZSk7CitzdGF0aWMgc3NpemVfdCBzaG93X3N0cF9zdGF0ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQoreworCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IHRvX2JyaWRnZShjZCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGJyLT5zdHBfZW5hYmxlZCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9zdHBfc3RhdGUoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCB1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwlici0+c3RwX2VuYWJsZWQgPSB2YWw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3N0cF9zdGF0ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwKKwkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIHN0b3JlX2JyaWRnZV9wYXJtKGNkLCBidWYsIGxlbiwgc2V0X3N0cF9zdGF0ZSk7Cit9CisKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihzdHBfc3RhdGUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3N0cF9zdGF0ZSwKKwkJCSBzdG9yZV9zdHBfc3RhdGUpOworCitzdGF0aWMgc3NpemVfdCBzaG93X3ByaW9yaXR5KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCit7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gdG9fYnJpZGdlKGNkKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKKwkJICAgICAgIChici0+YnJpZGdlX2lkLnByaW9bMF0gPDwgOCkgfCBici0+YnJpZGdlX2lkLnByaW9bMV0pOworfQorCitzdGF0aWMgdm9pZCBzZXRfcHJpb3JpdHkoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCB1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwlicl9zdHBfc2V0X2JyaWRnZV9wcmlvcml0eShiciwgKHUxNikgdmFsKTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfcHJpb3JpdHkoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsCisJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXJldHVybiBzdG9yZV9icmlkZ2VfcGFybShjZCwgYnVmLCBsZW4sIHNldF9wcmlvcml0eSk7Cit9CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIocHJpb3JpdHksIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3ByaW9yaXR5LAorCQkJIHN0b3JlX3ByaW9yaXR5KTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19yb290X2lkKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCit7CisJcmV0dXJuIGJyX3Nob3dfYnJpZGdlX2lkKGJ1ZiwgJnRvX2JyaWRnZShjZCktPmRlc2lnbmF0ZWRfcm9vdCk7Cit9CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIocm9vdF9pZCwgU19JUlVHTywgc2hvd19yb290X2lkLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19icmlkZ2VfaWQoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYnJfc2hvd19icmlkZ2VfaWQoYnVmLCAmdG9fYnJpZGdlKGNkKS0+YnJpZGdlX2lkKTsKK30KK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihicmlkZ2VfaWQsIFNfSVJVR08sIHNob3dfYnJpZGdlX2lkLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19yb290X3BvcnQoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdG9fYnJpZGdlKGNkKS0+cm9vdF9wb3J0KTsKK30KK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihyb290X3BvcnQsIFNfSVJVR08sIHNob3dfcm9vdF9wb3J0LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19yb290X3BhdGhfY29zdChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0b19icmlkZ2UoY2QpLT5yb290X3BhdGhfY29zdCk7Cit9CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIocm9vdF9wYXRoX2Nvc3QsIFNfSVJVR08sIHNob3dfcm9vdF9wYXRoX2Nvc3QsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzaG93X3RvcG9sb2d5X2NoYW5nZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0b19icmlkZ2UoY2QpLT50b3BvbG9neV9jaGFuZ2UpOworfQorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKHRvcG9sb2d5X2NoYW5nZSwgU19JUlVHTywgc2hvd190b3BvbG9neV9jaGFuZ2UsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzaG93X3RvcG9sb2d5X2NoYW5nZV9kZXRlY3RlZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQoreworCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IHRvX2JyaWRnZShjZCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGJyLT50b3BvbG9neV9jaGFuZ2VfZGV0ZWN0ZWQpOworfQorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKHRvcG9sb2d5X2NoYW5nZV9kZXRlY3RlZCwgU19JUlVHTywgc2hvd190b3BvbG9neV9jaGFuZ2VfZGV0ZWN0ZWQsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzaG93X2hlbGxvX3RpbWVyKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCit7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gdG9fYnJpZGdlKGNkKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIGJyX3RpbWVyX3ZhbHVlKCZici0+aGVsbG9fdGltZXIpKTsKK30KK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihoZWxsb190aW1lciwgU19JUlVHTywgc2hvd19oZWxsb190aW1lciwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGNuX3RpbWVyKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCit7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gdG9fYnJpZGdlKGNkKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIGJyX3RpbWVyX3ZhbHVlKCZici0+dGNuX3RpbWVyKSk7Cit9CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIodGNuX3RpbWVyLCBTX0lSVUdPLCBzaG93X3Rjbl90aW1lciwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdG9wb2xvZ3lfY2hhbmdlX3RpbWVyKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCit7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gdG9fYnJpZGdlKGNkKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIGJyX3RpbWVyX3ZhbHVlKCZici0+dG9wb2xvZ3lfY2hhbmdlX3RpbWVyKSk7Cit9CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIodG9wb2xvZ3lfY2hhbmdlX3RpbWVyLCBTX0lSVUdPLCBzaG93X3RvcG9sb2d5X2NoYW5nZV90aW1lciwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZ2NfdGltZXIoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSB0b19icmlkZ2UoY2QpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgYnJfdGltZXJfdmFsdWUoJmJyLT5nY190aW1lcikpOworfQorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGdjX3RpbWVyLCBTX0lSVUdPLCBzaG93X2djX3RpbWVyLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmJyaWRnZV9hdHRyc1tdID0geworCSZjbGFzc19kZXZpY2VfYXR0cl9mb3J3YXJkX2RlbGF5LmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX2hlbGxvX3RpbWUuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfbWF4X2FnZS5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9hZ2VpbmdfdGltZS5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9zdHBfc3RhdGUuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfcHJpb3JpdHkuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfYnJpZGdlX2lkLmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX3Jvb3RfaWQuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfcm9vdF9wYXRoX2Nvc3QuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfcm9vdF9wb3J0LmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX3RvcG9sb2d5X2NoYW5nZS5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl90b3BvbG9neV9jaGFuZ2VfZGV0ZWN0ZWQuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfaGVsbG9fdGltZXIuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfdGNuX3RpbWVyLmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX3RvcG9sb2d5X2NoYW5nZV90aW1lci5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9nY190aW1lci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGJyaWRnZV9ncm91cCA9IHsKKwkubmFtZSA9IFNZU0ZTX0JSSURHRV9BVFRSLAorCS5hdHRycyA9IGJyaWRnZV9hdHRycywKK307CisKKy8qCisgKiBFeHBvcnQgdGhlIGZvcndhcmRpbmcgaW5mb3JtYXRpb24gdGFibGUgYXMgYSBiaW5hcnkgZmlsZQorICogVGhlIHJlY29yZHMgYXJlIHN0cnVjdCBfX2ZkYl9lbnRyeS4KKyAqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KKyAqLworc3RhdGljIHNzaXplX3QgYnJmb3J3YXJkX3JlYWQoc3RydWN0IGtvYmplY3QgKmtvYmosIGNoYXIgKmJ1ZiwKKwkJCSAgIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2ID0gdG9fY2xhc3NfZGV2KGtvYmopOworCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IHRvX2JyaWRnZShjZGV2KTsKKwlpbnQgbjsKKworCS8qIG11c3QgcmVhZCB3aG9sZSByZWNvcmRzICovCisJaWYgKG9mZiAlIHNpemVvZihzdHJ1Y3QgX19mZGJfZW50cnkpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJbiA9ICBicl9mZGJfZmlsbGJ1ZihiciwgYnVmLCAKKwkJCSAgICBjb3VudCAvIHNpemVvZihzdHJ1Y3QgX19mZGJfZW50cnkpLAorCQkJICAgIG9mZiAvIHNpemVvZihzdHJ1Y3QgX19mZGJfZW50cnkpKTsKKworCWlmIChuID4gMCkKKwkJbiAqPSBzaXplb2Yoc3RydWN0IF9fZmRiX2VudHJ5KTsKKwkKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIGJyaWRnZV9mb3J3YXJkID0geworCS5hdHRyID0geyAubmFtZSA9IFNZU0ZTX0JSSURHRV9GREIsCisJCSAgLm1vZGUgPSBTX0lSVUdPLCAKKwkJICAub3duZXIgPSBUSElTX01PRFVMRSwgfSwKKwkucmVhZCA9IGJyZm9yd2FyZF9yZWFkLAorfTsKKworLyoKKyAqIEFkZCBlbnRyaWVzIGluIHN5c2ZzIG9udG8gdGhlIGV4aXN0aW5nIG5ldHdvcmsgY2xhc3MgZGV2aWNlCisgKiBmb3IgdGhlIGJyaWRnZS4KKyAqICAgQWRkcyBhIGF0dHJpYnV0ZSBncm91cCAiYnJpZGdlIiBjb250YWluaW5nIHR1bmluZyBwYXJhbWV0ZXJzLgorICogICBCaW5hcnkgYXR0cmlidXRlIGNvbnRhaW5pbmcgdGhlIGZvcndhcmQgdGFibGUKKyAqICAgU3ViIGRpcmVjdG9yeSB0byBob2xkIGxpbmtzIHRvIGludGVyZmFjZXMuCisgKgorICogTm90ZTogdGhlIGlmb2JqIGV4aXN0cyBvbmx5IHRvIGJlIGEgc3ViZGlyZWN0b3J5CisgKiAgIHRvIGhvbGQgbGlua3MuICBUaGUgaWZvYmogZXhpc3RzIGluIHNhbWUgZGF0YSBzdHJ1Y3R1cmUKKyAqICAgYXMgaXQncyBwYXJlbnQgdGhlIGJyaWRnZSBzbyByZWZlcmVuY2UgY291bnRpbmcgd29ya3MuCisgKi8KK2ludCBicl9zeXNmc19hZGRicihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBrb2JqZWN0ICpicm9iaiA9ICZkZXYtPmNsYXNzX2Rldi5rb2JqOworCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKKworCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cChicm9iaiwgJmJyaWRnZV9ncm91cCk7CisJaWYgKGVycikgeworCQlwcl9pbmZvKCIlczogY2FuJ3QgY3JlYXRlIGdyb3VwICVzLyVzXG4iLAorCQkJX19GVU5DVElPTl9fLCBkZXYtPm5hbWUsIGJyaWRnZV9ncm91cC5uYW1lKTsKKwkJZ290byBvdXQxOworCX0KKworCWVyciA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZShicm9iaiwgJmJyaWRnZV9mb3J3YXJkKTsKKwlpZiAoZXJyKSB7CisJCXByX2luZm8oIiVzOiBjYW4ndCBjcmVhdGUgYXR0cmlidWUgZmlsZSAlcy8lc1xuIiwKKwkJCV9fRlVOQ1RJT05fXywgZGV2LT5uYW1lLCBicmlkZ2VfZm9yd2FyZC5hdHRyLm5hbWUpOworCQlnb3RvIG91dDI7CisJfQorCisJCisJa29iamVjdF9zZXRfbmFtZSgmYnItPmlmb2JqLCBTWVNGU19CUklER0VfUE9SVF9TVUJESVIpOworCWJyLT5pZm9iai5rdHlwZSA9IE5VTEw7CisJYnItPmlmb2JqLmtzZXQgPSBOVUxMOworCWJyLT5pZm9iai5wYXJlbnQgPSBicm9iajsKKworCWVyciA9IGtvYmplY3RfcmVnaXN0ZXIoJmJyLT5pZm9iaik7CisJaWYgKGVycikgeworCQlwcl9pbmZvKCIlczogY2FuJ3QgYWRkIGtvYmplY3QgKGRpcmVjdG9yeSkgJXMvJXNcbiIsCisJCQlfX0ZVTkNUSU9OX18sIGRldi0+bmFtZSwgYnItPmlmb2JqLm5hbWUpOworCQlnb3RvIG91dDM7CisJfQorCXJldHVybiAwOworIG91dDM6CisJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZkZXYtPmNsYXNzX2Rldi5rb2JqLCAmYnJpZGdlX2ZvcndhcmQpOworIG91dDI6CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXYtPmNsYXNzX2Rldi5rb2JqLCAmYnJpZGdlX2dyb3VwKTsKKyBvdXQxOgorCXJldHVybiBlcnI7CisKK30KKwordm9pZCBicl9zeXNmc19kZWxicihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBrb2JqZWN0ICprb2JqID0gJmRldi0+Y2xhc3NfZGV2LmtvYmo7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWtvYmplY3RfdW5yZWdpc3RlcigmYnItPmlmb2JqKTsKKwlzeXNmc19yZW1vdmVfYmluX2ZpbGUoa29iaiwgJmJyaWRnZV9mb3J3YXJkKTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoa29iaiwgJmJyaWRnZV9ncm91cCk7Cit9CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3N5c2ZzX2lmLmMgYi9uZXQvYnJpZGdlL2JyX3N5c2ZzX2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY3MjQ5YgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9icmlkZ2UvYnJfc3lzZnNfaWYuYwpAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqCVN5c2ZzIGF0dHJpYnV0ZXMgb2YgYnJpZGdlIHBvcnRzCisgKglMaW51eCBldGhlcm5ldCBicmlkZ2UKKyAqCisgKglBdXRob3JzOgorICoJU3RlcGhlbiBIZW1taW5nZXIJCTxzaGVtbWluZ2VyQG9zZGwub3JnPgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2JyaWRnZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJicl9wcml2YXRlLmgiCisKK3N0cnVjdCBicnBvcnRfYXR0cmlidXRlIHsKKwlzdHJ1Y3QgYXR0cmlidXRlCWF0dHI7CisJc3NpemVfdCAoKnNob3cpKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKiwgY2hhciAqKTsKKwlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKiwgdW5zaWduZWQgbG9uZyk7Cit9OworCisjZGVmaW5lIEJSUE9SVF9BVFRSKF9uYW1lLF9tb2RlLF9zaG93LF9zdG9yZSkJCSAgICAgICAgXAorc3RydWN0IGJycG9ydF9hdHRyaWJ1dGUgYnJwb3J0X2F0dHJfIyNfbmFtZSA9IHsgCSAgICAgICAgXAorCS5hdHRyID0gey5uYW1lID0gX19zdHJpbmdpZnkoX25hbWUpLCAJCQlcCisJCSAubW9kZSA9IF9tb2RlLCAJCQkJXAorCQkgLm93bmVyID0gVEhJU19NT0RVTEUsIH0sCQkJXAorCS5zaG93CT0gX3Nob3csCQkJCQlcCisJLnN0b3JlCT0gX3N0b3JlLAkJCQkJXAorfTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19wYXRoX2Nvc3Qoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwLT5wYXRoX2Nvc3QpOworfQorc3RhdGljIHNzaXplX3Qgc3RvcmVfcGF0aF9jb3N0KHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIHVuc2lnbmVkIGxvbmcgdikKK3sKKwlicl9zdHBfc2V0X3BhdGhfY29zdChwLCB2KTsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBCUlBPUlRfQVRUUihwYXRoX2Nvc3QsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICBzaG93X3BhdGhfY29zdCwgc3RvcmVfcGF0aF9jb3N0KTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19wcmlvcml0eShzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHAtPnByaW9yaXR5KTsKK30KK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3ByaW9yaXR5KHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIHVuc2lnbmVkIGxvbmcgdikKK3sKKwlpZiAodiA+PSAoMTw8KDE2LUJSX1BPUlRfQklUUykpKQorCQlyZXR1cm4gLUVSQU5HRTsKKwlicl9zdHBfc2V0X3BvcnRfcHJpb3JpdHkocCwgdik7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgQlJQT1JUX0FUVFIocHJpb3JpdHksIFNfSVJVR08gfCBTX0lXVVNSLAorCQkJIHNob3dfcHJpb3JpdHksIHN0b3JlX3ByaW9yaXR5KTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19kZXNpZ25hdGVkX3Jvb3Qoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgY2hhciAqYnVmKQoreworCXJldHVybiBicl9zaG93X2JyaWRnZV9pZChidWYsICZwLT5kZXNpZ25hdGVkX3Jvb3QpOworfQorc3RhdGljIEJSUE9SVF9BVFRSKGRlc2lnbmF0ZWRfcm9vdCwgU19JUlVHTywgc2hvd19kZXNpZ25hdGVkX3Jvb3QsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzaG93X2Rlc2lnbmF0ZWRfYnJpZGdlKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYnJfc2hvd19icmlkZ2VfaWQoYnVmLCAmcC0+ZGVzaWduYXRlZF9icmlkZ2UpOworfQorc3RhdGljIEJSUE9SVF9BVFRSKGRlc2lnbmF0ZWRfYnJpZGdlLCBTX0lSVUdPLCBzaG93X2Rlc2lnbmF0ZWRfYnJpZGdlLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19kZXNpZ25hdGVkX3BvcnQoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwLT5kZXNpZ25hdGVkX3BvcnQpOworfQorc3RhdGljIEJSUE9SVF9BVFRSKGRlc2lnbmF0ZWRfcG9ydCwgU19JUlVHTywgc2hvd19kZXNpZ25hdGVkX3BvcnQsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzaG93X2Rlc2lnbmF0ZWRfY29zdChzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHAtPmRlc2lnbmF0ZWRfY29zdCk7Cit9CitzdGF0aWMgQlJQT1JUX0FUVFIoZGVzaWduYXRlZF9jb3N0LCBTX0lSVUdPLCBzaG93X2Rlc2lnbmF0ZWRfY29zdCwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcG9ydF9pZChzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHgleFxuIiwgcC0+cG9ydF9pZCk7Cit9CitzdGF0aWMgQlJQT1JUX0FUVFIocG9ydF9pZCwgU19JUlVHTywgc2hvd19wb3J0X2lkLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19wb3J0X25vKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCV4XG4iLCBwLT5wb3J0X25vKTsKK30KKworc3RhdGljIEJSUE9SVF9BVFRSKHBvcnRfbm8sIFNfSVJVR08sIHNob3dfcG9ydF9ubywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfY2hhbmdlX2FjayhzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHAtPnRvcG9sb2d5X2NoYW5nZV9hY2spOworfQorc3RhdGljIEJSUE9SVF9BVFRSKGNoYW5nZV9hY2ssIFNfSVJVR08sIHNob3dfY2hhbmdlX2FjaywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfY29uZmlnX3BlbmRpbmcoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwLT5jb25maWdfcGVuZGluZyk7Cit9CitzdGF0aWMgQlJQT1JUX0FUVFIoY29uZmlnX3BlbmRpbmcsIFNfSVJVR08sIHNob3dfY29uZmlnX3BlbmRpbmcsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzaG93X3BvcnRfc3RhdGUoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwLT5zdGF0ZSk7Cit9CitzdGF0aWMgQlJQT1JUX0FUVFIoc3RhdGUsIFNfSVJVR08sIHNob3dfcG9ydF9zdGF0ZSwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfbWVzc2FnZV9hZ2VfdGltZXIoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwKKwkJCQkJICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIGJyX3RpbWVyX3ZhbHVlKCZwLT5tZXNzYWdlX2FnZV90aW1lcikpOworfQorc3RhdGljIEJSUE9SVF9BVFRSKG1lc3NhZ2VfYWdlX3RpbWVyLCBTX0lSVUdPLCBzaG93X21lc3NhZ2VfYWdlX3RpbWVyLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19mb3J3YXJkX2RlbGF5X3RpbWVyKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsCisJCQkJCSAgICBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBicl90aW1lcl92YWx1ZSgmcC0+Zm9yd2FyZF9kZWxheV90aW1lcikpOworfQorc3RhdGljIEJSUE9SVF9BVFRSKGZvcndhcmRfZGVsYXlfdGltZXIsIFNfSVJVR08sIHNob3dfZm9yd2FyZF9kZWxheV90aW1lciwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfaG9sZF90aW1lcihzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLAorCQkJCQkgICAgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgYnJfdGltZXJfdmFsdWUoJnAtPmhvbGRfdGltZXIpKTsKK30KK3N0YXRpYyBCUlBPUlRfQVRUUihob2xkX3RpbWVyLCBTX0lSVUdPLCBzaG93X2hvbGRfdGltZXIsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGJycG9ydF9hdHRyaWJ1dGUgKmJycG9ydF9hdHRyc1tdID0geworCSZicnBvcnRfYXR0cl9wYXRoX2Nvc3QsCisJJmJycG9ydF9hdHRyX3ByaW9yaXR5LAorCSZicnBvcnRfYXR0cl9wb3J0X2lkLAorCSZicnBvcnRfYXR0cl9wb3J0X25vLAorCSZicnBvcnRfYXR0cl9kZXNpZ25hdGVkX3Jvb3QsCisJJmJycG9ydF9hdHRyX2Rlc2lnbmF0ZWRfYnJpZGdlLAorCSZicnBvcnRfYXR0cl9kZXNpZ25hdGVkX3BvcnQsCisJJmJycG9ydF9hdHRyX2Rlc2lnbmF0ZWRfY29zdCwKKwkmYnJwb3J0X2F0dHJfc3RhdGUsCisJJmJycG9ydF9hdHRyX2NoYW5nZV9hY2ssCisJJmJycG9ydF9hdHRyX2NvbmZpZ19wZW5kaW5nLAorCSZicnBvcnRfYXR0cl9tZXNzYWdlX2FnZV90aW1lciwKKwkmYnJwb3J0X2F0dHJfZm9yd2FyZF9kZWxheV90aW1lciwKKwkmYnJwb3J0X2F0dHJfaG9sZF90aW1lciwKKwlOVUxMCit9OworCisjZGVmaW5lIHRvX2JycG9ydF9hdHRyKF9hdCkgY29udGFpbmVyX29mKF9hdCwgc3RydWN0IGJycG9ydF9hdHRyaWJ1dGUsIGF0dHIpCisjZGVmaW5lIHRvX2JycG9ydChvYmopCWNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQsIGtvYmopCisKK3N0YXRpYyBzc2l6ZV90IGJycG9ydF9zaG93KHN0cnVjdCBrb2JqZWN0ICoga29iaiwKKwkJCSAgIHN0cnVjdCBhdHRyaWJ1dGUgKiBhdHRyLCBjaGFyICogYnVmKQoreworCXN0cnVjdCBicnBvcnRfYXR0cmlidXRlICogYnJwb3J0X2F0dHIgPSB0b19icnBvcnRfYXR0cihhdHRyKTsKKwlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICogcCA9IHRvX2JycG9ydChrb2JqKTsKKworCXJldHVybiBicnBvcnRfYXR0ci0+c2hvdyhwLCBidWYpOworfQorCitzdGF0aWMgc3NpemVfdCBicnBvcnRfc3RvcmUoc3RydWN0IGtvYmplY3QgKiBrb2JqLAorCQkJICAgIHN0cnVjdCBhdHRyaWJ1dGUgKiBhdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKiBidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgYnJwb3J0X2F0dHJpYnV0ZSAqIGJycG9ydF9hdHRyID0gdG9fYnJwb3J0X2F0dHIoYXR0cik7CisJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqIHAgPSB0b19icnBvcnQoa29iaik7CisJc3NpemVfdCByZXQgPSAtRUlOVkFMOworCWNoYXIgKmVuZHA7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsICZlbmRwLCAwKTsKKwlpZiAoZW5kcCAhPSBidWYpIHsKKwkJcnRubF9sb2NrKCk7CisJCWlmIChwLT5kZXYgJiYgcC0+YnIgJiYgYnJwb3J0X2F0dHItPnN0b3JlKSB7CisJCQlzcGluX2xvY2tfYmgoJnAtPmJyLT5sb2NrKTsKKwkJCXJldCA9IGJycG9ydF9hdHRyLT5zdG9yZShwLCB2YWwpOworCQkJc3Bpbl91bmxvY2tfYmgoJnAtPmJyLT5sb2NrKTsKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlyZXQgPSBjb3VudDsKKwkJfQorCQlydG5sX3VubG9jaygpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBjYWxsZWQgZnJvbSBrb2JqZWN0X3B1dCB3aGVuIHBvcnQgcmVmIGNvdW50IGdvZXMgdG8gemVyby4gKi8KK3N0YXRpYyB2b2lkIGJycG9ydF9yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCWtmcmVlKGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0LCBrb2JqKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIGJycG9ydF9zeXNmc19vcHMgPSB7CisJLnNob3cgPSBicnBvcnRfc2hvdywKKwkuc3RvcmUgPSBicnBvcnRfc3RvcmUsCit9OworCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBicnBvcnRfa3R5cGUgPSB7CisJLnN5c2ZzX29wcyA9ICZicnBvcnRfc3lzZnNfb3BzLAorCS5yZWxlYXNlID0gYnJwb3J0X3JlbGVhc2UsCit9OworCisKKy8qCisgKiBBZGQgc3lzZnMgZW50cmllcyB0byBldGhlcm5ldCBkZXZpY2UgYWRkZWQgdG8gYSBicmlkZ2UuCisgKiBDcmVhdGVzIGEgYnJwb3J0IHN1YmRpcmVjdG9yeSB3aXRoIGJyaWRnZSBhdHRyaWJ1dGVzLgorICogUHV0cyBzeW1saW5rIGluIGJyaWRnZSdzIGJycG9ydCBzdWJkaXJlY3RvcnkKKyAqLworaW50IGJyX3N5c2ZzX2FkZGlmKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApCit7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gcC0+YnI7CisJc3RydWN0IGJycG9ydF9hdHRyaWJ1dGUgKiphOworCWludCBlcnI7CisKKwlBU1NFUlRfUlROTCgpOworCisJa29iamVjdF9zZXRfbmFtZSgmcC0+a29iaiwgU1lTRlNfQlJJREdFX1BPUlRfQVRUUik7CisJcC0+a29iai5rdHlwZSA9ICZicnBvcnRfa3R5cGU7CisJcC0+a29iai5wYXJlbnQgPSAmKHAtPmRldi0+Y2xhc3NfZGV2LmtvYmopOworCXAtPmtvYmoua3NldCA9IE5VTEw7CisKKwllcnIgPSBrb2JqZWN0X2FkZCgmcC0+a29iaik7CisJaWYoZXJyKQorCQlnb3RvIG91dDE7CisKKwllcnIgPSBzeXNmc19jcmVhdGVfbGluaygmcC0+a29iaiwgJmJyLT5kZXYtPmNsYXNzX2Rldi5rb2JqLCAKKwkJCQlTWVNGU19CUklER0VfUE9SVF9MSU5LKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDI7CisKKwlmb3IgKGEgPSBicnBvcnRfYXR0cnM7ICphOyArK2EpIHsKKwkJZXJyID0gc3lzZnNfY3JlYXRlX2ZpbGUoJnAtPmtvYmosICYoKCphKS0+YXR0cikpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQyOworCX0KKworCWVyciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZici0+aWZvYmosICZwLT5rb2JqLCBwLT5kZXYtPm5hbWUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MjsKKworCXJldHVybiAwOworIG91dDI6CisJa29iamVjdF9kZWwoJnAtPmtvYmopOworIG91dDE6CisJcmV0dXJuIGVycjsKK30KKwordm9pZCBicl9zeXNmc19yZW1vdmVpZihzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKQoreworCXByX2RlYnVnKCJicl9zeXNmc19yZW1vdmVpZlxuIik7CisJc3lzZnNfcmVtb3ZlX2xpbmsoJnAtPmJyLT5pZm9iaiwgcC0+ZGV2LT5uYW1lKTsKKwlrb2JqZWN0X2RlbCgmcC0+a29iaik7Cit9CisKK3ZvaWQgYnJfc3lzZnNfZnJlZWlmKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApCit7CisJcHJfZGVidWcoImJyX3N5c2ZzX2ZyZWVpZlxuIik7CisJa29iamVjdF9wdXQoJnAtPmtvYmopOworfQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvS2NvbmZpZyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhjY2VmNQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTAsMCArMSwyMTEgQEAKKyMKKyMgQnJpZGdlIG5ldGZpbHRlciBjb25maWd1cmF0aW9uCisjCisKK21lbnUgIkJyaWRnZTogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24iCisJZGVwZW5kcyBvbiBCUklER0UgJiYgTkVURklMVEVSCisKK2NvbmZpZyBCUklER0VfTkZfRUJUQUJMRVMKKwl0cmlzdGF0ZSAiRXRoZXJuZXQgQnJpZGdlIHRhYmxlcyAoZWJ0YWJsZXMpIHN1cHBvcnQiCisJaGVscAorCSAgZWJ0YWJsZXMgaXMgYSBnZW5lcmFsLCBleHRlbnNpYmxlIGZyYW1lL3BhY2tldCBpZGVudGlmaWNhdGlvbgorCSAgZnJhbWV3b3JrLiBTYXkgJ1knIG9yICdNJyBoZXJlIGlmIHlvdSB3YW50IHRvIGRvIEV0aGVybmV0CisJICBmaWx0ZXJpbmcvTkFUL2Jyb3V0aW5nIG9uIHRoZSBFdGhlcm5ldCBicmlkZ2UuCisjCisjIHRhYmxlcworIworY29uZmlnIEJSSURHRV9FQlRfQlJPVVRFCisJdHJpc3RhdGUgImVidDogYnJvdXRlIHRhYmxlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBCUklER0VfTkZfRUJUQUJMRVMKKwloZWxwCisJICBUaGUgZWJ0YWJsZXMgYnJvdXRlIHRhYmxlIGlzIHVzZWQgdG8gZGVmaW5lIHJ1bGVzIHRoYXQgZGVjaWRlIGJldHdlZW4KKwkgIGJyaWRnaW5nIGFuZCByb3V0aW5nIGZyYW1lcywgZ2l2aW5nIExpbnV4IHRoZSBmdW5jdGlvbmFsaXR5IG9mIGEKKwkgIGJyb3V0ZXIuIFNlZSB0aGUgbWFuIHBhZ2UgZm9yIGVidGFibGVzKDgpIGFuZCBleGFtcGxlcyBvbiB0aGUgZWJ0YWJsZXMKKwkgIHdlYnNpdGUuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgQlJJREdFX0VCVF9UX0ZJTFRFUgorCXRyaXN0YXRlICJlYnQ6IGZpbHRlciB0YWJsZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQlJJREdFX05GX0VCVEFCTEVTCisJaGVscAorCSAgVGhlIGVidGFibGVzIGZpbHRlciB0YWJsZSBpcyB1c2VkIHRvIGRlZmluZSBmcmFtZSBmaWx0ZXJpbmcgcnVsZXMgYXQKKwkgIGxvY2FsIGlucHV0LCBmb3J3YXJkaW5nIGFuZCBsb2NhbCBvdXRwdXQuIFNlZSB0aGUgbWFuIHBhZ2UgZm9yCisJICBlYnRhYmxlcyg4KS4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBCUklER0VfRUJUX1RfTkFUCisJdHJpc3RhdGUgImVidDogbmF0IHRhYmxlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBCUklER0VfTkZfRUJUQUJMRVMKKwloZWxwCisJICBUaGUgZWJ0YWJsZXMgbmF0IHRhYmxlIGlzIHVzZWQgdG8gZGVmaW5lIHJ1bGVzIHRoYXQgYWx0ZXIgdGhlIE1BQworCSAgc291cmNlIGFkZHJlc3MgKE1BQyBTTkFUKSBvciB0aGUgTUFDIGRlc3RpbmF0aW9uIGFkZHJlc3MgKE1BQyBETkFUKS4KKwkgIFNlZSB0aGUgbWFuIHBhZ2UgZm9yIGVidGFibGVzKDgpLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKyMKKyMgbWF0Y2hlcworIworY29uZmlnIEJSSURHRV9FQlRfODAyXzMKKwl0cmlzdGF0ZSAiZWJ0OiA4MDIuMyBmaWx0ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJSSURHRV9ORl9FQlRBQkxFUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgbWF0Y2hpbmcgc3VwcG9ydCBmb3IgODAyLjMgRXRoZXJuZXQgZnJhbWVzLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEJSSURHRV9FQlRfQU1PTkcKKwl0cmlzdGF0ZSAiZWJ0OiBhbW9uZyBmaWx0ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJSSURHRV9ORl9FQlRBQkxFUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgdGhlIGFtb25nIG1hdGNoLCB3aGljaCBhbGxvd3MgbWF0Y2hpbmcgdGhlIE1BQyBzb3VyY2UKKwkgIGFuZC9vciBkZXN0aW5hdGlvbiBhZGRyZXNzIG9uIGEgbGlzdCBvZiBhZGRyZXNzZXMuIE9wdGlvbmFsbHksCisJICBNQUMvSVAgYWRkcmVzcyBwYWlycyBjYW4gYmUgbWF0Y2hlZCwgZi5lLiBmb3IgYW50aS1zcG9vZmluZyBydWxlcy4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBCUklER0VfRUJUX0FSUAorCXRyaXN0YXRlICJlYnQ6IEFSUCBmaWx0ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJSSURHRV9ORl9FQlRBQkxFUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgdGhlIEFSUCBtYXRjaCwgd2hpY2ggYWxsb3dzIEFSUCBhbmQgUkFSUCBoZWFkZXIgZmllbGQKKwkgIGZpbHRlcmluZy4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBCUklER0VfRUJUX0lQCisJdHJpc3RhdGUgImVidDogSVAgZmlsdGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBCUklER0VfTkZfRUJUQUJMRVMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIHRoZSBJUCBtYXRjaCwgd2hpY2ggYWxsb3dzIGJhc2ljIElQIGhlYWRlciBmaWVsZAorCSAgZmlsdGVyaW5nLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEJSSURHRV9FQlRfTElNSVQKKwl0cmlzdGF0ZSAiZWJ0OiBsaW1pdCBtYXRjaCBzdXBwb3J0IgorCWRlcGVuZHMgb24gQlJJREdFX05GX0VCVEFCTEVTCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyB0aGUgbGltaXQgbWF0Y2gsIHdoaWNoIGFsbG93cyB5b3UgdG8gY29udHJvbAorCSAgdGhlIHJhdGUgYXQgd2hpY2ggYSBydWxlIGNhbiBiZSBtYXRjaGVkLiBUaGlzIG1hdGNoIGlzIHRoZQorCSAgZXF1aXZhbGVudCBvZiB0aGUgaXB0YWJsZXMgbGltaXQgbWF0Y2guCisKKwkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24va2J1aWxkL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KKworY29uZmlnIEJSSURHRV9FQlRfTUFSSworCXRyaXN0YXRlICJlYnQ6IG1hcmsgZmlsdGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBCUklER0VfTkZfRUJUQUJMRVMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIHRoZSBtYXJrIG1hdGNoLCB3aGljaCBhbGxvd3MgbWF0Y2hpbmcgZnJhbWVzIGJhc2VkIG9uCisJICB0aGUgJ25mbWFyaycgdmFsdWUgaW4gdGhlIGZyYW1lLiBUaGlzIGNhbiBiZSBzZXQgYnkgdGhlIG1hcmsgdGFyZ2V0LgorCSAgVGhpcyB2YWx1ZSBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHVzZWQgaW4gdGhlIGlwdGFibGVzIG1hcmsgbWF0Y2ggYW5kCisJICB0YXJnZXQuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgQlJJREdFX0VCVF9QS1RUWVBFCisJdHJpc3RhdGUgImVidDogcGFja2V0IHR5cGUgZmlsdGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBCUklER0VfTkZfRUJUQUJMRVMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIHRoZSBwYWNrZXQgdHlwZSBtYXRjaCwgd2hpY2ggYWxsb3dzIG1hdGNoaW5nIG9uIHRoZQorCSAgdHlwZSBvZiBwYWNrZXQgYmFzZWQgb24gaXRzIEV0aGVybmV0ICJjbGFzcyIgKGFzIGRldGVybWluZWQgYnkKKwkgIHRoZSBnZW5lcmljIG5ldHdvcmtpbmcgY29kZSk6IGJyb2FkY2FzdCwgbXVsdGljYXN0LAorCSAgZm9yIHRoaXMgaG9zdCBhbG9uZSBvciBmb3IgYW5vdGhlciBob3N0LgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEJSSURHRV9FQlRfU1RQCisJdHJpc3RhdGUgImVidDogU1RQIGZpbHRlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gQlJJREdFX05GX0VCVEFCTEVTCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyB0aGUgU3Bhbm5pbmcgVHJlZSBQcm90b2NvbCBtYXRjaCwgd2hpY2gKKwkgIGFsbG93cyBTVFAgaGVhZGVyIGZpZWxkIGZpbHRlcmluZy4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBCUklER0VfRUJUX1ZMQU4KKwl0cmlzdGF0ZSAiZWJ0OiA4MDIuMVEgVkxBTiBmaWx0ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJSSURHRV9ORl9FQlRBQkxFUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgdGhlIDgwMi4xUSB2bGFuIG1hdGNoLCB3aGljaCBhbGxvd3MgdGhlIGZpbHRlcmluZyBvZgorCSAgODAyLjFRIHZsYW4gZmllbGRzLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKyMKKyMgdGFyZ2V0cworIworY29uZmlnIEJSSURHRV9FQlRfQVJQUkVQTFkKKwl0cmlzdGF0ZSAiZWJ0OiBhcnAgcmVwbHkgdGFyZ2V0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBCUklER0VfTkZfRUJUQUJMRVMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIHRoZSBhcnAgcmVwbHkgdGFyZ2V0LCB3aGljaCBhbGxvd3MKKwkgIGF1dG9tYXRpY2FsbHkgc2VuZGluZyBhcnAgcmVwbGllcyB0byBhcnAgcmVxdWVzdHMuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgQlJJREdFX0VCVF9ETkFUCisJdHJpc3RhdGUgImVidDogZG5hdCB0YXJnZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJSSURHRV9ORl9FQlRBQkxFUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgdGhlIE1BQyBETkFUIHRhcmdldCwgd2hpY2ggYWxsb3dzIGFsdGVyaW5nIHRoZSBNQUMKKwkgIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgZnJhbWVzLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEJSSURHRV9FQlRfTUFSS19UCisJdHJpc3RhdGUgImVidDogbWFyayB0YXJnZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJSSURHRV9ORl9FQlRBQkxFUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgdGhlIG1hcmsgdGFyZ2V0LCB3aGljaCBhbGxvd3MgbWFya2luZyBmcmFtZXMgYnkKKwkgIHNldHRpbmcgdGhlICduZm1hcmsnIHZhbHVlIGluIHRoZSBmcmFtZS4KKwkgIFRoaXMgdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSB1c2VkIGluIHRoZSBpcHRhYmxlcyBtYXJrIG1hdGNoIGFuZAorCSAgdGFyZ2V0LgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEJSSURHRV9FQlRfUkVESVJFQ1QKKwl0cmlzdGF0ZSAiZWJ0OiByZWRpcmVjdCB0YXJnZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJSSURHRV9ORl9FQlRBQkxFUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgdGhlIE1BQyByZWRpcmVjdCB0YXJnZXQsIHdoaWNoIGFsbG93cyBhbHRlcmluZyB0aGUgTUFDCisJICBkZXN0aW5hdGlvbiBhZGRyZXNzIG9mIGEgZnJhbWUgdG8gdGhhdCBvZiB0aGUgZGV2aWNlIGl0IGFycml2ZWQgb24uCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgQlJJREdFX0VCVF9TTkFUCisJdHJpc3RhdGUgImVidDogc25hdCB0YXJnZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJSSURHRV9ORl9FQlRBQkxFUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgdGhlIE1BQyBTTkFUIHRhcmdldCwgd2hpY2ggYWxsb3dzIGFsdGVyaW5nIHRoZSBNQUMKKwkgIHNvdXJjZSBhZGRyZXNzIG9mIGZyYW1lcy4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisjCisjIHdhdGNoZXJzCisjCitjb25maWcgQlJJREdFX0VCVF9MT0cKKwl0cmlzdGF0ZSAiZWJ0OiBsb2cgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJSSURHRV9ORl9FQlRBQkxFUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgdGhlIGxvZyB3YXRjaGVyLCB0aGF0IHlvdSBjYW4gdXNlIGluIGFueSBydWxlCisJICBpbiBhbnkgZWJ0YWJsZXMgdGFibGUuIEl0IHJlY29yZHMgaW5mbyBhYm91dCB0aGUgZnJhbWUgaGVhZGVyCisJICB0byB0aGUgc3lzbG9nLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEJSSURHRV9FQlRfVUxPRworCXRyaXN0YXRlICJlYnQ6IHVsb2cgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJSSURHRV9ORl9FQlRBQkxFUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgdGhlIHVsb2cgd2F0Y2hlciwgdGhhdCB5b3UgY2FuIHVzZSBpbiBhbnkgcnVsZQorCSAgaW4gYW55IGVidGFibGVzIHRhYmxlLiBUaGUgcGFja2V0IGlzIHBhc3NlZCB0byBhIHVzZXJzcGFjZQorCSAgbG9nZ2luZyBkYWVtb24gdXNpbmcgbmV0bGluayBtdWx0aWNhc3Qgc29ja2V0cy4gVGhpcyBkaWZmZXJzCisJICBmcm9tIHRoZSBsb2cgd2F0Y2hlciBpbiB0aGUgc2Vuc2UgdGhhdCB0aGUgY29tcGxldGUgcGFja2V0IGlzCisJICBzZW50IHRvIHVzZXJzcGFjZSBpbnN0ZWFkIG9mIGEgZGVzY3JpcHRpdmUgdGV4dCBhbmQgdGhhdAorCSAgbmV0bGluayBtdWx0aWNhc3Qgc29ja2V0cyBhcmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBzeXNsb2cuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9NYWtlZmlsZSBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZjZkOWYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9NYWtlZmlsZQpAQCAtMCwwICsxLDMyIEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbmV0ZmlsdGVyIG1vZHVsZXMgZm9yIExpbmsgTGF5ZXIgZmlsdGVyaW5nIG9uIGEgYnJpZGdlLgorIworCitvYmotJChDT05GSUdfQlJJREdFX05GX0VCVEFCTEVTKSArPSBlYnRhYmxlcy5vCisKKyMgdGFibGVzCitvYmotJChDT05GSUdfQlJJREdFX0VCVF9CUk9VVEUpICs9IGVidGFibGVfYnJvdXRlLm8KK29iai0kKENPTkZJR19CUklER0VfRUJUX1RfRklMVEVSKSArPSBlYnRhYmxlX2ZpbHRlci5vCitvYmotJChDT05GSUdfQlJJREdFX0VCVF9UX05BVCkgKz0gZWJ0YWJsZV9uYXQubworCisjbWF0Y2hlcworb2JqLSQoQ09ORklHX0JSSURHRV9FQlRfODAyXzMpICs9IGVidF84MDJfMy5vCitvYmotJChDT05GSUdfQlJJREdFX0VCVF9BTU9ORykgKz0gZWJ0X2Ftb25nLm8KK29iai0kKENPTkZJR19CUklER0VfRUJUX0FSUCkgKz0gZWJ0X2FycC5vCitvYmotJChDT05GSUdfQlJJREdFX0VCVF9JUCkgKz0gZWJ0X2lwLm8KK29iai0kKENPTkZJR19CUklER0VfRUJUX0xJTUlUKSArPSBlYnRfbGltaXQubworb2JqLSQoQ09ORklHX0JSSURHRV9FQlRfTUFSSykgKz0gZWJ0X21hcmtfbS5vCitvYmotJChDT05GSUdfQlJJREdFX0VCVF9QS1RUWVBFKSArPSBlYnRfcGt0dHlwZS5vCitvYmotJChDT05GSUdfQlJJREdFX0VCVF9TVFApICs9IGVidF9zdHAubworb2JqLSQoQ09ORklHX0JSSURHRV9FQlRfVkxBTikgKz0gZWJ0X3ZsYW4ubworCisjIHRhcmdldHMKK29iai0kKENPTkZJR19CUklER0VfRUJUX0FSUFJFUExZKSArPSBlYnRfYXJwcmVwbHkubworb2JqLSQoQ09ORklHX0JSSURHRV9FQlRfTUFSS19UKSArPSBlYnRfbWFyay5vCitvYmotJChDT05GSUdfQlJJREdFX0VCVF9ETkFUKSArPSBlYnRfZG5hdC5vCitvYmotJChDT05GSUdfQlJJREdFX0VCVF9SRURJUkVDVCkgKz0gZWJ0X3JlZGlyZWN0Lm8KK29iai0kKENPTkZJR19CUklER0VfRUJUX1NOQVQpICs9IGVidF9zbmF0Lm8KKworIyB3YXRjaGVycworb2JqLSQoQ09ORklHX0JSSURHRV9FQlRfTE9HKSArPSBlYnRfbG9nLm8KK29iai0kKENPTkZJR19CUklER0VfRUJUX0xPRykgKz0gZWJ0X3Vsb2cubwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0XzgwMl8zLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfODAyXzMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjhlYmRmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0XzgwMl8zLmMKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIDgwMl8zCisgKgorICogQXV0aG9yOgorICogQ2hyaXMgVml0YWxlIGNzdkBibHVldGFpbC5jb20KKyAqCisgKiBNYXkgMjAwMworICogCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF84MDJfMy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCitzdGF0aWMgaW50IGVidF9maWx0ZXJfODAyXzMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFsZW4pCit7CisJc3RydWN0IGVidF84MDJfM19pbmZvICppbmZvID0gKHN0cnVjdCBlYnRfODAyXzNfaW5mbyAqKWRhdGE7CisJc3RydWN0IGVidF84MDJfM19oZHIgKmhkciA9IGVidF84MDJfM19oZHIoc2tiKTsKKwl1aW50MTZfdCB0eXBlID0gaGRyLT5sbGMudWkuY3RybCAmIElTX1VJID8gaGRyLT5sbGMudWkudHlwZSA6IGhkci0+bGxjLm5pLnR5cGU7CisKKwlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF84MDJfM19TQVApIHsKKwkJaWYgKEZXSU5WKGluZm8tPnNhcCAhPSBoZHItPmxsYy51aS5zc2FwLCBFQlRfODAyXzNfU0FQKSkgCisJCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQlpZiAoRldJTlYoaW5mby0+c2FwICE9IGhkci0+bGxjLnVpLmRzYXAsIEVCVF84MDJfM19TQVApKQorCQkJCXJldHVybiBFQlRfTk9NQVRDSDsKKwl9CisKKwlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF84MDJfM19UWVBFKSB7CisJCWlmICghKGhkci0+bGxjLnVpLmRzYXAgPT0gQ0hFQ0tfVFlQRSAmJiBoZHItPmxsYy51aS5zc2FwID09IENIRUNLX1RZUEUpKQorCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQlpZiAoRldJTlYoaW5mby0+dHlwZSAhPSB0eXBlLCBFQlRfODAyXzNfVFlQRSkpIAorCQkJcmV0dXJuIEVCVF9OT01BVENIOworCX0KKworCXJldHVybiBFQlRfTUFUQ0g7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X21hdGNoIGZpbHRlcl84MDJfMzsKK3N0YXRpYyBpbnQgZWJ0XzgwMl8zX2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgdW5zaWduZWQgaW50IGhvb2ttYXNrLAorICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeSAqZSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFsZW4pCit7CisJc3RydWN0IGVidF84MDJfM19pbmZvICppbmZvID0gKHN0cnVjdCBlYnRfODAyXzNfaW5mbyAqKWRhdGE7CisKKwlpZiAoZGF0YWxlbiA8IHNpemVvZihzdHJ1Y3QgZWJ0XzgwMl8zX2luZm8pKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaW5mby0+Yml0bWFzayAmIH5FQlRfODAyXzNfTUFTSyB8fCBpbmZvLT5pbnZmbGFncyAmIH5FQlRfODAyXzNfTUFTSykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBlYnRfbWF0Y2ggZmlsdGVyXzgwMl8zID0KK3sKKwkubmFtZQkJPSBFQlRfODAyXzNfTUFUQ0gsCisJLm1hdGNoCQk9IGVidF9maWx0ZXJfODAyXzMsCisJLmNoZWNrCQk9IGVidF84MDJfM19jaGVjaywKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJcmV0dXJuIGVidF9yZWdpc3Rlcl9tYXRjaCgmZmlsdGVyXzgwMl8zKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwllYnRfdW5yZWdpc3Rlcl9tYXRjaCgmZmlsdGVyXzgwMl8zKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9hbW9uZy5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2Ftb25nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWExZjVlMwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9hbW9uZy5jCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogIGVidF9hbW9uZworICoKKyAqCUF1dGhvcnM6CisgKglHcnplZ29yeiBCb3Jvd2lhayA8Z3J6ZXNAZ251LnVuaXYuZ2RhLnBsPgorICoKKyAqICBBdWd1c3QsIDIwMDMKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hbW9uZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKK3N0YXRpYyBpbnQgZWJ0X21hY193b3JtaGFzaF9jb250YWlucyhjb25zdCBzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaCAqd2gsCisJCQkJICAgICBjb25zdCBjaGFyICptYWMsIHVpbnQzMl90IGlwKQoreworCS8qIFlvdSBtYXkgYmUgcHV6emxlZCBhcyB0byBob3cgdGhpcyBjb2RlIHdvcmtzLgorCSAqIFNvbWUgdHJpY2tzIHdlcmUgdXNlZCwgcmVmZXIgdG8gCisJICogCWluY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfYW1vbmcuaAorCSAqIGFzIHRoZXJlIHlvdSBjYW4gZmluZCBhIHNvbHV0aW9uIG9mIHRoaXMgbXlzdGVyeS4KKwkgKi8KKwljb25zdCBzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaF90dXBsZSAqcDsKKwlpbnQgc3RhcnQsIGxpbWl0LCBpOworCXVpbnQzMl90IGNtcFsyXSA9IHsgMCwgMCB9OworCWludCBrZXkgPSAoY29uc3QgdW5zaWduZWQgY2hhcikgbWFjWzVdOworCisJbWVtY3B5KCgoY2hhciAqKSBjbXApICsgMiwgbWFjLCA2KTsKKwlzdGFydCA9IHdoLT50YWJsZVtrZXldOworCWxpbWl0ID0gd2gtPnRhYmxlW2tleSArIDFdOworCWlmIChpcCkgeworCQlmb3IgKGkgPSBzdGFydDsgaSA8IGxpbWl0OyBpKyspIHsKKwkJCXAgPSAmd2gtPnBvb2xbaV07CisJCQlpZiAoY21wWzFdID09IHAtPmNtcFsxXSAmJiBjbXBbMF0gPT0gcC0+Y21wWzBdKSB7CisJCQkJaWYgKHAtPmlwID09IDAgfHwgcC0+aXAgPT0gaXApIHsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gc3RhcnQ7IGkgPCBsaW1pdDsgaSsrKSB7CisJCQlwID0gJndoLT5wb29sW2ldOworCQkJaWYgKGNtcFsxXSA9PSBwLT5jbXBbMV0gJiYgY21wWzBdID09IHAtPmNtcFswXSkgeworCQkJCWlmIChwLT5pcCA9PSAwKSB7CisJCQkJCXJldHVybiAxOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlYnRfbWFjX3dvcm1oYXNoX2NoZWNrX2ludGVncml0eShjb25zdCBzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaAorCQkJCQkgICAgKndoKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCWlmICh3aC0+dGFibGVbaV0gPiB3aC0+dGFibGVbaSArIDFdKQorCQkJcmV0dXJuIC0weDEwMCAtIGk7CisJCWlmICh3aC0+dGFibGVbaV0gPCAwKQorCQkJcmV0dXJuIC0weDIwMCAtIGk7CisJCWlmICh3aC0+dGFibGVbaV0gPiB3aC0+cG9vbHNpemUpCisJCQlyZXR1cm4gLTB4MzAwIC0gaTsKKwl9CisJaWYgKHdoLT50YWJsZVsyNTZdID4gd2gtPnBvb2xzaXplKQorCQlyZXR1cm4gLTB4YzAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9pcF9kc3QoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdWludDMyX3QgKmFkZHIpCit7CisJaWYgKGV0aF9oZHIoc2tiKS0+aF9wcm90byA9PSBodG9ucyhFVEhfUF9JUCkpIHsKKwkJc3RydWN0IGlwaGRyIF9pcGgsICppaDsKKworCQlpaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIDAsIHNpemVvZihfaXBoKSwgJl9pcGgpOworCQlpZiAoaWggPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKwkJKmFkZHIgPSBpaC0+ZGFkZHI7CisJfSBlbHNlIGlmIChldGhfaGRyKHNrYiktPmhfcHJvdG8gPT0gaHRvbnMoRVRIX1BfQVJQKSkgeworCQlzdHJ1Y3QgYXJwaGRyIF9hcnBoLCAqYWg7CisJCXVpbnQzMl90IGJ1ZiwgKmJwOworCisJCWFoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgMCwgc2l6ZW9mKF9hcnBoKSwgJl9hcnBoKTsKKwkJaWYgKGFoID09IE5VTEwgfHwKKwkJICAgIGFoLT5hcl9wbG4gIT0gc2l6ZW9mKHVpbnQzMl90KSB8fAorCQkgICAgYWgtPmFyX2hsbiAhPSBFVEhfQUxFTikKKwkJCXJldHVybiAtMTsKKwkJYnAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBzaXplb2Yoc3RydWN0IGFycGhkcikgKworCQkJCQkyICogRVRIX0FMRU4gKyBzaXplb2YodWludDMyX3QpLAorCQkJCQlzaXplb2YodWludDMyX3QpLCAmYnVmKTsKKwkJaWYgKGJwID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisJCSphZGRyID0gKmJwOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfaXBfc3JjKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHVpbnQzMl90ICphZGRyKQoreworCWlmIChldGhfaGRyKHNrYiktPmhfcHJvdG8gPT0gaHRvbnMoRVRIX1BfSVApKSB7CisJCXN0cnVjdCBpcGhkciBfaXBoLCAqaWg7CisKKwkJaWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCAwLCBzaXplb2YoX2lwaCksICZfaXBoKTsKKwkJaWYgKGloID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisJCSphZGRyID0gaWgtPnNhZGRyOworCX0gZWxzZSBpZiAoZXRoX2hkcihza2IpLT5oX3Byb3RvID09IGh0b25zKEVUSF9QX0FSUCkpIHsKKwkJc3RydWN0IGFycGhkciBfYXJwaCwgKmFoOworCQl1aW50MzJfdCBidWYsICpicDsKKworCQlhaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIDAsIHNpemVvZihfYXJwaCksICZfYXJwaCk7CisJCWlmIChhaCA9PSBOVUxMIHx8CisJCSAgICBhaC0+YXJfcGxuICE9IHNpemVvZih1aW50MzJfdCkgfHwKKwkJICAgIGFoLT5hcl9obG4gIT0gRVRIX0FMRU4pCisJCQlyZXR1cm4gLTE7CisJCWJwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2l6ZW9mKHN0cnVjdCBhcnBoZHIpICsKKwkJCQkJRVRIX0FMRU4sIHNpemVvZih1aW50MzJfdCksICZidWYpOworCQlpZiAoYnAgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKwkJKmFkZHIgPSAqYnA7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVidF9maWx0ZXJfYW1vbmcoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3sKKwlzdHJ1Y3QgZWJ0X2Ftb25nX2luZm8gKmluZm8gPSAoc3RydWN0IGVidF9hbW9uZ19pbmZvICopIGRhdGE7CisJY29uc3QgY2hhciAqZG1hYywgKnNtYWM7CisJY29uc3Qgc3RydWN0IGVidF9tYWNfd29ybWhhc2ggKndoX2RzdCwgKndoX3NyYzsKKwl1aW50MzJfdCBkaXAgPSAwLCBzaXAgPSAwOworCisJd2hfZHN0ID0gZWJ0X2Ftb25nX3doX2RzdChpbmZvKTsKKwl3aF9zcmMgPSBlYnRfYW1vbmdfd2hfc3JjKGluZm8pOworCisJaWYgKHdoX3NyYykgeworCQlzbWFjID0gZXRoX2hkcihza2IpLT5oX3NvdXJjZTsKKwkJaWYgKGdldF9pcF9zcmMoc2tiLCAmc2lwKSkKKwkJCXJldHVybiBFQlRfTk9NQVRDSDsKKwkJaWYgKCEoaW5mby0+Yml0bWFzayAmIEVCVF9BTU9OR19TUkNfTkVHKSkgeworCQkJLyogd2UgbWF0Y2ggb25seSBpZiBpdCBjb250YWlucyAqLworCQkJaWYgKCFlYnRfbWFjX3dvcm1oYXNoX2NvbnRhaW5zKHdoX3NyYywgc21hYywgc2lwKSkKKwkJCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCX0gZWxzZSB7CisJCQkvKiB3ZSBtYXRjaCBvbmx5IGlmIGl0IERPRVMgTk9UIGNvbnRhaW4gKi8KKwkJCWlmIChlYnRfbWFjX3dvcm1oYXNoX2NvbnRhaW5zKHdoX3NyYywgc21hYywgc2lwKSkKKwkJCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCX0KKwl9CisKKwlpZiAod2hfZHN0KSB7CisJCWRtYWMgPSBldGhfaGRyKHNrYiktPmhfZGVzdDsKKwkJaWYgKGdldF9pcF9kc3Qoc2tiLCAmZGlwKSkKKwkJCXJldHVybiBFQlRfTk9NQVRDSDsKKwkJaWYgKCEoaW5mby0+Yml0bWFzayAmIEVCVF9BTU9OR19EU1RfTkVHKSkgeworCQkJLyogd2UgbWF0Y2ggb25seSBpZiBpdCBjb250YWlucyAqLworCQkJaWYgKCFlYnRfbWFjX3dvcm1oYXNoX2NvbnRhaW5zKHdoX2RzdCwgZG1hYywgZGlwKSkKKwkJCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCX0gZWxzZSB7CisJCQkvKiB3ZSBtYXRjaCBvbmx5IGlmIGl0IERPRVMgTk9UIGNvbnRhaW4gKi8KKwkJCWlmIChlYnRfbWFjX3dvcm1oYXNoX2NvbnRhaW5zKHdoX2RzdCwgZG1hYywgZGlwKSkKKwkJCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCX0KKwl9CisKKwlyZXR1cm4gRUJUX01BVENIOworfQorCitzdGF0aWMgaW50IGVidF9hbW9uZ19jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIHVuc2lnbmVkIGludCBob29rbWFzaywKKwkJCSAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnkgKmUsIHZvaWQgKmRhdGEsCisJCQkgICB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3sKKwlzdHJ1Y3QgZWJ0X2Ftb25nX2luZm8gKmluZm8gPSAoc3RydWN0IGVidF9hbW9uZ19pbmZvICopIGRhdGE7CisJaW50IGV4cGVjdGVkX2xlbmd0aCA9IHNpemVvZihzdHJ1Y3QgZWJ0X2Ftb25nX2luZm8pOworCWNvbnN0IHN0cnVjdCBlYnRfbWFjX3dvcm1oYXNoICp3aF9kc3QsICp3aF9zcmM7CisJaW50IGVycjsKKworCXdoX2RzdCA9IGVidF9hbW9uZ193aF9kc3QoaW5mbyk7CisJd2hfc3JjID0gZWJ0X2Ftb25nX3doX3NyYyhpbmZvKTsKKwlleHBlY3RlZF9sZW5ndGggKz0gZWJ0X21hY193b3JtaGFzaF9zaXplKHdoX2RzdCk7CisJZXhwZWN0ZWRfbGVuZ3RoICs9IGVidF9tYWNfd29ybWhhc2hfc2l6ZSh3aF9zcmMpOworCisJaWYgKGRhdGFsZW4gIT0gRUJUX0FMSUdOKGV4cGVjdGVkX2xlbmd0aCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgImVidGFibGVzOiBhbW9uZzogd3Jvbmcgc2l6ZTogJWQiCisJCSAgICAgICAiYWdhaW5zdCBleHBlY3RlZCAlZCwgcm91bmRlZCB0byAlWmRcbiIsCisJCSAgICAgICBkYXRhbGVuLCBleHBlY3RlZF9sZW5ndGgsCisJCSAgICAgICBFQlRfQUxJR04oZXhwZWN0ZWRfbGVuZ3RoKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAod2hfZHN0ICYmIChlcnIgPSBlYnRfbWFjX3dvcm1oYXNoX2NoZWNrX2ludGVncml0eSh3aF9kc3QpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiZWJ0YWJsZXM6IGFtb25nOiBkc3QgaW50ZWdyaXR5IGZhaWw6ICV4XG4iLCAtZXJyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICh3aF9zcmMgJiYgKGVyciA9IGVidF9tYWNfd29ybWhhc2hfY2hlY2tfaW50ZWdyaXR5KHdoX3NyYykpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJlYnRhYmxlczogYW1vbmc6IHNyYyBpbnRlZ3JpdHkgZmFpbDogJXhcbiIsIC1lcnIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X21hdGNoIGZpbHRlcl9hbW9uZyA9IHsKKwkubmFtZQkJPSBFQlRfQU1PTkdfTUFUQ0gsIAorCS5tYXRjaAkJPSBlYnRfZmlsdGVyX2Ftb25nLCAKKwkuY2hlY2sJCT0gZWJ0X2Ftb25nX2NoZWNrLAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlyZXR1cm4gZWJ0X3JlZ2lzdGVyX21hdGNoKCZmaWx0ZXJfYW1vbmcpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCWVidF91bnJlZ2lzdGVyX21hdGNoKCZmaWx0ZXJfYW1vbmcpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2FycC5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2FycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NGM0OGMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfYXJwLmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiAgZWJ0X2FycAorICoKKyAqCUF1dGhvcnM6CisgKglCYXJ0IERlIFNjaHV5bWVyIDxiZHNjaHV5bUBwYW5kb3JhLmJlPgorICoJVGltIEdhcmRuZXIgPHRpbWdAdHBpLmNvbT4KKyAqCisgKiAgQXByaWwsIDIwMDIKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCitzdGF0aWMgaW50IGVidF9maWx0ZXJfYXJwKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQoreworCXN0cnVjdCBlYnRfYXJwX2luZm8gKmluZm8gPSAoc3RydWN0IGVidF9hcnBfaW5mbyAqKWRhdGE7CisJc3RydWN0IGFycGhkciBfYXJwaCwgKmFoOworCisJYWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCAwLCBzaXplb2YoX2FycGgpLCAmX2FycGgpOworCWlmIChhaCA9PSBOVUxMKQorCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfQVJQX09QQ09ERSAmJiBGV0lOVihpbmZvLT5vcGNvZGUgIT0KKwkgICBhaC0+YXJfb3AsIEVCVF9BUlBfT1BDT0RFKSkKKwkJcmV0dXJuIEVCVF9OT01BVENIOworCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX0FSUF9IVFlQRSAmJiBGV0lOVihpbmZvLT5odHlwZSAhPQorCSAgIGFoLT5hcl9ocmQsIEVCVF9BUlBfSFRZUEUpKQorCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfQVJQX1BUWVBFICYmIEZXSU5WKGluZm8tPnB0eXBlICE9CisJICAgYWgtPmFyX3BybywgRUJUX0FSUF9QVFlQRSkpCisJCXJldHVybiBFQlRfTk9NQVRDSDsKKworCWlmIChpbmZvLT5iaXRtYXNrICYgKEVCVF9BUlBfU1JDX0lQIHwgRUJUX0FSUF9EU1RfSVApKSB7CisJCXVpbnQzMl90IF9hZGRyLCAqYXA7CisKKwkJLyogSVB2NCBhZGRyZXNzZXMgYXJlIGFsd2F5cyA0IGJ5dGVzICovCisJCWlmIChhaC0+YXJfcGxuICE9IHNpemVvZih1aW50MzJfdCkpCisJCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX0FSUF9TUkNfSVApIHsKKwkJCWFwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2l6ZW9mKHN0cnVjdCBhcnBoZHIpICsKKwkJCQkJCWFoLT5hcl9obG4sIHNpemVvZihfYWRkciksCisJCQkJCQkmX2FkZHIpOworCQkJaWYgKGFwID09IE5VTEwpCisJCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQkJaWYgKEZXSU5WKGluZm8tPnNhZGRyICE9ICgqYXAgJiBpbmZvLT5zbXNrKSwKKwkJCSAgIEVCVF9BUlBfU1JDX0lQKSkKKwkJCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCX0KKworCQlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9BUlBfRFNUX0lQKSB7CisJCQlhcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNpemVvZihzdHJ1Y3QgYXJwaGRyKSArCisJCQkJCQkyKmFoLT5hcl9obG4rc2l6ZW9mKHVpbnQzMl90KSwKKwkJCQkJCXNpemVvZihfYWRkciksICZfYWRkcik7CisJCQlpZiAoYXAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCQlpZiAoRldJTlYoaW5mby0+ZGFkZHIgIT0gKCphcCAmIGluZm8tPmRtc2spLAorCQkJICAgRUJUX0FSUF9EU1RfSVApKQorCQkJCXJldHVybiBFQlRfTk9NQVRDSDsKKwkJfQorCX0KKworCWlmIChpbmZvLT5iaXRtYXNrICYgKEVCVF9BUlBfU1JDX01BQyB8IEVCVF9BUlBfRFNUX01BQykpIHsKKwkJdW5zaWduZWQgY2hhciBfbWFjW0VUSF9BTEVOXSwgKm1wOworCQl1aW50OF90IHZlcmRpY3QsIGk7CisKKwkJLyogTUFDIGFkZHJlc3NlcyBhcmUgNiBieXRlcyAqLworCQlpZiAoYWgtPmFyX2hsbiAhPSBFVEhfQUxFTikKKwkJCXJldHVybiBFQlRfTk9NQVRDSDsKKwkJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfQVJQX1NSQ19NQUMpIHsKKwkJCW1wID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2l6ZW9mKHN0cnVjdCBhcnBoZHIpLAorCQkJCQkJc2l6ZW9mKF9tYWMpLCAmX21hYyk7CisJCQlpZiAobXAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCQl2ZXJkaWN0ID0gMDsKKwkJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQkJdmVyZGljdCB8PSAobXBbaV0gXiBpbmZvLT5zbWFkZHJbaV0pICYKKwkJCQkgICAgICAgaW5mby0+c21tc2tbaV07CisJCQlpZiAoRldJTlYodmVyZGljdCAhPSAwLCBFQlRfQVJQX1NSQ19NQUMpKQorCQkJCXJldHVybiBFQlRfTk9NQVRDSDsKKwkJfQorCisJCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX0FSUF9EU1RfTUFDKSB7CisJCQltcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNpemVvZihzdHJ1Y3QgYXJwaGRyKSArCisJCQkJCQlhaC0+YXJfaGxuICsgYWgtPmFyX3BsbiwKKwkJCQkJCXNpemVvZihfbWFjKSwgJl9tYWMpOworCQkJaWYgKG1wID09IE5VTEwpCisJCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQkJdmVyZGljdCA9IDA7CisJCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJCXZlcmRpY3QgfD0gKG1wW2ldIF4gaW5mby0+ZG1hZGRyW2ldKSAmCisJCQkJCWluZm8tPmRtbXNrW2ldOworCQkJaWYgKEZXSU5WKHZlcmRpY3QgIT0gMCwgRUJUX0FSUF9EU1RfTUFDKSkKKwkJCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCX0KKwl9CisKKwlyZXR1cm4gRUJUX01BVENIOworfQorCitzdGF0aWMgaW50IGVidF9hcnBfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLCB1bnNpZ25lZCBpbnQgaG9va21hc2ssCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5ICplLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3sKKwlzdHJ1Y3QgZWJ0X2FycF9pbmZvICppbmZvID0gKHN0cnVjdCBlYnRfYXJwX2luZm8gKilkYXRhOworCisJaWYgKGRhdGFsZW4gIT0gRUJUX0FMSUdOKHNpemVvZihzdHJ1Y3QgZWJ0X2FycF9pbmZvKSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgoZS0+ZXRocHJvdG8gIT0gaHRvbnMoRVRIX1BfQVJQKSAmJgorCSAgIGUtPmV0aHByb3RvICE9IGh0b25zKEVUSF9QX1JBUlApKSB8fAorCSAgIGUtPmludmZsYWdzICYgRUJUX0lQUk9UTykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGluZm8tPmJpdG1hc2sgJiB+RUJUX0FSUF9NQVNLIHx8IGluZm8tPmludmZsYWdzICYgfkVCVF9BUlBfTUFTSykKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X21hdGNoIGZpbHRlcl9hcnAgPQoreworCS5uYW1lCQk9IEVCVF9BUlBfTUFUQ0gsCisJLm1hdGNoCQk9IGVidF9maWx0ZXJfYXJwLAorCS5jaGVjawkJPSBlYnRfYXJwX2NoZWNrLAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlyZXR1cm4gZWJ0X3JlZ2lzdGVyX21hdGNoKCZmaWx0ZXJfYXJwKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwllYnRfdW5yZWdpc3Rlcl9tYXRjaCgmZmlsdGVyX2FycCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfYXJwcmVwbHkuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9hcnByZXBseS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MzRkZTkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfYXJwcmVwbHkuYwpAQCAtMCwwICsxLDk3IEBACisvKgorICogIGVidF9hcnByZXBseQorICoKKyAqCUF1dGhvcnM6CisgKglHcnplZ29yeiBCb3Jvd2lhayA8Z3J6ZXNAZ251LnVuaXYuZ2RhLnBsPgorICoJQmFydCBEZSBTY2h1eW1lciA8YmRzY2h1eW1AcGFuZG9yYS5iZT4KKyAqCisgKiAgQXVndXN0LCAyMDAzCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfYXJwcmVwbHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKK3N0YXRpYyBpbnQgZWJ0X3RhcmdldF9yZXBseShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGludCBob29rbnIsCisgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3sKKwlzdHJ1Y3QgZWJ0X2FycHJlcGx5X2luZm8gKmluZm8gPSAoc3RydWN0IGVidF9hcnByZXBseV9pbmZvICopZGF0YTsKKwl1MzIgX3NpcCwgKnNpcHRyLCBfZGlwLCAqZGlwdHI7CisJc3RydWN0IGFycGhkciBfYWgsICphcDsKKwl1bnNpZ25lZCBjaGFyIF9zaGFbRVRIX0FMRU5dLCAqc2hwOworCXN0cnVjdCBza19idWZmICpza2IgPSAqcHNrYjsKKworCWFwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgMCwgc2l6ZW9mKF9haCksICZfYWgpOworCWlmIChhcCA9PSBOVUxMKQorCQlyZXR1cm4gRUJUX0RST1A7CisKKwlpZiAoYXAtPmFyX29wICE9IGh0b25zKEFSUE9QX1JFUVVFU1QpIHx8CisJICAgIGFwLT5hcl9obG4gIT0gRVRIX0FMRU4gfHwKKwkgICAgYXAtPmFyX3BybyAhPSBodG9ucyhFVEhfUF9JUCkgfHwKKwkgICAgYXAtPmFyX3BsbiAhPSA0KQorCQlyZXR1cm4gRUJUX0NPTlRJTlVFOworCisJc2hwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2l6ZW9mKF9haCksIEVUSF9BTEVOLCAmX3NoYSk7CisJaWYgKHNocCA9PSBOVUxMKQorCQlyZXR1cm4gRUJUX0RST1A7CisKKwlzaXB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNpemVvZihfYWgpICsgRVRIX0FMRU4sCisJCQkJICAgc2l6ZW9mKF9zaXApLCAmX3NpcCk7CisJaWYgKHNpcHRyID09IE5VTEwpCisJCXJldHVybiBFQlRfRFJPUDsKKworCWRpcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwKKwkJCQkgICBzaXplb2YoX2FoKSArIDIgKiBFVEhfQUxFTiArIHNpemVvZihfc2lwKSwKKwkJCQkgICBzaXplb2YoX2RpcCksICZfZGlwKTsKKwlpZiAoZGlwdHIgPT0gTlVMTCkKKwkJcmV0dXJuIEVCVF9EUk9QOworCisJYXJwX3NlbmQoQVJQT1BfUkVQTFksIEVUSF9QX0FSUCwgKnNpcHRyLCAoc3RydWN0IG5ldF9kZXZpY2UgKilpbiwKKwkgICAgICAgICAqZGlwdHIsIHNocCwgaW5mby0+bWFjLCBzaHApOworCisJcmV0dXJuIGluZm8tPnRhcmdldDsKK30KKworc3RhdGljIGludCBlYnRfdGFyZ2V0X3JlcGx5X2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgdW5zaWduZWQgaW50IGhvb2ttYXNrLAorICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeSAqZSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFsZW4pCit7CisJc3RydWN0IGVidF9hcnByZXBseV9pbmZvICppbmZvID0gKHN0cnVjdCBlYnRfYXJwcmVwbHlfaW5mbyAqKWRhdGE7CisKKwlpZiAoZGF0YWxlbiAhPSBFQlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBlYnRfYXJwcmVwbHlfaW5mbykpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoQkFTRV9DSEFJTiAmJiBpbmZvLT50YXJnZXQgPT0gRUJUX1JFVFVSTikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGUtPmV0aHByb3RvICE9IGh0b25zKEVUSF9QX0FSUCkgfHwKKwkgICAgZS0+aW52ZmxhZ3MgJiBFQlRfSVBST1RPKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlDTEVBUl9CQVNFX0NIQUlOX0JJVDsKKwlpZiAoc3RyY21wKHRhYmxlbmFtZSwgIm5hdCIpIHx8IGhvb2ttYXNrICYgfigxIDw8IE5GX0JSX1BSRV9ST1VUSU5HKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X3RhcmdldCByZXBseV90YXJnZXQgPQoreworCS5uYW1lCQk9IEVCVF9BUlBSRVBMWV9UQVJHRVQsCisJLnRhcmdldAkJPSBlYnRfdGFyZ2V0X3JlcGx5LAorCS5jaGVjawkJPSBlYnRfdGFyZ2V0X3JlcGx5X2NoZWNrLAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlyZXR1cm4gZWJ0X3JlZ2lzdGVyX3RhcmdldCgmcmVwbHlfdGFyZ2V0KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwllYnRfdW5yZWdpc3Rlcl90YXJnZXQoJnJlcGx5X3RhcmdldCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfZG5hdC5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2RuYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTQ2MzA4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2RuYXQuYwpAQCAtMCwwICsxLDc2IEBACisvKgorICogIGVidF9kbmF0CisgKgorICoJQXV0aG9yczoKKyAqCUJhcnQgRGUgU2NodXltZXIgPGJkc2NodXltQHBhbmRvcmEuYmU+CisgKgorICogIEp1bmUsIDIwMDIKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9uYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCitzdGF0aWMgaW50IGVidF90YXJnZXRfZG5hdChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGludCBob29rbnIsCisgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3sKKwlzdHJ1Y3QgZWJ0X25hdF9pbmZvICppbmZvID0gKHN0cnVjdCBlYnRfbmF0X2luZm8gKilkYXRhOworCisJaWYgKHNrYl9zaGFyZWQoKnBza2IpIHx8IHNrYl9jbG9uZWQoKnBza2IpKSB7CisJCXN0cnVjdCBza19idWZmICpuc2tiOworCisJCW5za2IgPSBza2JfY29weSgqcHNrYiwgR0ZQX0FUT01JQyk7CisJCWlmICghbnNrYikKKwkJCXJldHVybiBORl9EUk9QOworCQlpZiAoKCpwc2tiKS0+c2spCisJCQlza2Jfc2V0X293bmVyX3cobnNrYiwgKCpwc2tiKS0+c2spOworCQlrZnJlZV9za2IoKnBza2IpOworCQkqcHNrYiA9IG5za2I7CisJfQorCW1lbWNweShldGhfaGRyKCpwc2tiKS0+aF9kZXN0LCBpbmZvLT5tYWMsIEVUSF9BTEVOKTsKKwlyZXR1cm4gaW5mby0+dGFyZ2V0OworfQorCitzdGF0aWMgaW50IGVidF90YXJnZXRfZG5hdF9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIHVuc2lnbmVkIGludCBob29rbWFzaywKKyAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnkgKmUsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQoreworCXN0cnVjdCBlYnRfbmF0X2luZm8gKmluZm8gPSAoc3RydWN0IGVidF9uYXRfaW5mbyAqKWRhdGE7CisKKwlpZiAoQkFTRV9DSEFJTiAmJiBpbmZvLT50YXJnZXQgPT0gRUJUX1JFVFVSTikKKwkJcmV0dXJuIC1FSU5WQUw7CisJQ0xFQVJfQkFTRV9DSEFJTl9CSVQ7CisJaWYgKCAoc3RyY21wKHRhYmxlbmFtZSwgIm5hdCIpIHx8CisJICAgKGhvb2ttYXNrICYgfigoMSA8PCBORl9CUl9QUkVfUk9VVElORykgfCAoMSA8PCBORl9CUl9MT0NBTF9PVVQpKSkpICYmCisJICAgKHN0cmNtcCh0YWJsZW5hbWUsICJicm91dGUiKSB8fCBob29rbWFzayAmIH4oMSA8PCBORl9CUl9CUk9VVElORykpICkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGRhdGFsZW4gIT0gRUJUX0FMSUdOKHNpemVvZihzdHJ1Y3QgZWJ0X25hdF9pbmZvKSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChJTlZBTElEX1RBUkdFVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X3RhcmdldCBkbmF0ID0KK3sKKwkubmFtZQkJPSBFQlRfRE5BVF9UQVJHRVQsCisJLnRhcmdldAkJPSBlYnRfdGFyZ2V0X2RuYXQsCisJLmNoZWNrCQk9IGVidF90YXJnZXRfZG5hdF9jaGVjaywKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJcmV0dXJuIGVidF9yZWdpc3Rlcl90YXJnZXQoJmRuYXQpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCWVidF91bnJlZ2lzdGVyX3RhcmdldCgmZG5hdCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfaXAuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9pcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMjM4MDUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfaXAuYwpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqICBlYnRfaXAKKyAqCisgKglBdXRob3JzOgorICoJQmFydCBEZSBTY2h1eW1lciA8YmRzY2h1eW1AcGFuZG9yYS5iZT4KKyAqCisgKiAgQXByaWwsIDIwMDIKKyAqCisgKiAgQ2hhbmdlczoKKyAqICAgIGFkZGVkIGlwLXNwb3J0IGFuZCBpcC1kcG9ydAorICogICAgSW5ub21pbmF0ZSBTZWN1cml0eSBUZWNobm9sb2dpZXMgQUcgPG1ob3BmQGlubm9taW5hdGUuY29tPgorICogICAgU2VwdGVtYmVyLCAyMDAyCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworc3RydWN0IHRjcHVkcGhkciB7CisJdWludDE2X3Qgc3JjOworCXVpbnQxNl90IGRzdDsKK307CisKK3N0YXRpYyBpbnQgZWJ0X2ZpbHRlcl9pcChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCB2b2lkICpkYXRhLAorICAgdW5zaWduZWQgaW50IGRhdGFsZW4pCit7CisJc3RydWN0IGVidF9pcF9pbmZvICppbmZvID0gKHN0cnVjdCBlYnRfaXBfaW5mbyAqKWRhdGE7CisJc3RydWN0IGlwaGRyIF9pcGgsICppaDsKKwlzdHJ1Y3QgdGNwdWRwaGRyIF9wb3J0cywgKnBwdHI7CisKKwlpaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIDAsIHNpemVvZihfaXBoKSwgJl9pcGgpOworCWlmIChpaCA9PSBOVUxMKQorCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfSVBfVE9TICYmCisJICAgRldJTlYoaW5mby0+dG9zICE9IGloLT50b3MsIEVCVF9JUF9UT1MpKQorCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfSVBfU09VUkNFICYmCisJICAgRldJTlYoKGloLT5zYWRkciAmIGluZm8tPnNtc2spICE9CisJICAgaW5mby0+c2FkZHIsIEVCVF9JUF9TT1VSQ0UpKQorCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJaWYgKChpbmZvLT5iaXRtYXNrICYgRUJUX0lQX0RFU1QpICYmCisJICAgRldJTlYoKGloLT5kYWRkciAmIGluZm8tPmRtc2spICE9CisJICAgaW5mby0+ZGFkZHIsIEVCVF9JUF9ERVNUKSkKKwkJcmV0dXJuIEVCVF9OT01BVENIOworCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX0lQX1BST1RPKSB7CisJCWlmIChGV0lOVihpbmZvLT5wcm90b2NvbCAhPSBpaC0+cHJvdG9jb2wsIEVCVF9JUF9QUk9UTykpCisJCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCWlmICghKGluZm8tPmJpdG1hc2sgJiBFQlRfSVBfRFBPUlQpICYmCisJCSAgICAhKGluZm8tPmJpdG1hc2sgJiBFQlRfSVBfU1BPUlQpKQorCQkJcmV0dXJuIEVCVF9NQVRDSDsKKwkJcHB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGloLT5paGwqNCwKKwkJCQkJICBzaXplb2YoX3BvcnRzKSwgJl9wb3J0cyk7CisJCWlmIChwcHRyID09IE5VTEwpCisJCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX0lQX0RQT1JUKSB7CisJCQl1MzIgZHN0ID0gbnRvaHMocHB0ci0+ZHN0KTsKKwkJCWlmIChGV0lOVihkc3QgPCBpbmZvLT5kcG9ydFswXSB8fAorCQkJICAgICAgICAgIGRzdCA+IGluZm8tPmRwb3J0WzFdLAorCQkJICAgICAgICAgIEVCVF9JUF9EUE9SVCkpCisJCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCX0KKwkJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfSVBfU1BPUlQpIHsKKwkJCXUzMiBzcmMgPSBudG9ocyhwcHRyLT5zcmMpOworCQkJaWYgKEZXSU5WKHNyYyA8IGluZm8tPnNwb3J0WzBdIHx8CisJCQkgICAgICAgICAgc3JjID4gaW5mby0+c3BvcnRbMV0sCisJCQkgICAgICAgICAgRUJUX0lQX1NQT1JUKSkKKwkJCXJldHVybiBFQlRfTk9NQVRDSDsKKwkJfQorCX0KKwlyZXR1cm4gRUJUX01BVENIOworfQorCitzdGF0aWMgaW50IGVidF9pcF9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIHVuc2lnbmVkIGludCBob29rbWFzaywKKyAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnkgKmUsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQoreworCXN0cnVjdCBlYnRfaXBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZWJ0X2lwX2luZm8gKilkYXRhOworCisJaWYgKGRhdGFsZW4gIT0gRUJUX0FMSUdOKHNpemVvZihzdHJ1Y3QgZWJ0X2lwX2luZm8pKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGUtPmV0aHByb3RvICE9IGh0b25zKEVUSF9QX0lQKSB8fAorCSAgIGUtPmludmZsYWdzICYgRUJUX0lQUk9UTykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGluZm8tPmJpdG1hc2sgJiB+RUJUX0lQX01BU0sgfHwgaW5mby0+aW52ZmxhZ3MgJiB+RUJUX0lQX01BU0spCisJCXJldHVybiAtRUlOVkFMOworCWlmIChpbmZvLT5iaXRtYXNrICYgKEVCVF9JUF9EUE9SVCB8IEVCVF9JUF9TUE9SVCkpIHsKKwkJaWYgKGluZm8tPmludmZsYWdzICYgRUJUX0lQX1BST1RPKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChpbmZvLT5wcm90b2NvbCAhPSBJUFBST1RPX1RDUCAmJgorCQkgICAgaW5mby0+cHJvdG9jb2wgIT0gSVBQUk9UT19VRFApCisJCQkgcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX0lQX0RQT1JUICYmIGluZm8tPmRwb3J0WzBdID4gaW5mby0+ZHBvcnRbMV0pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX0lQX1NQT1JUICYmIGluZm8tPnNwb3J0WzBdID4gaW5mby0+c3BvcnRbMV0pCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGVidF9tYXRjaCBmaWx0ZXJfaXAgPQoreworCS5uYW1lCQk9IEVCVF9JUF9NQVRDSCwKKwkubWF0Y2gJCT0gZWJ0X2ZpbHRlcl9pcCwKKwkuY2hlY2sJCT0gZWJ0X2lwX2NoZWNrLAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlyZXR1cm4gZWJ0X3JlZ2lzdGVyX21hdGNoKCZmaWx0ZXJfaXApOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCWVidF91bnJlZ2lzdGVyX21hdGNoKCZmaWx0ZXJfaXApOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xpbWl0LmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbGltaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzdjODg0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xpbWl0LmMKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiAgZWJ0X2xpbWl0CisgKgorICoJQXV0aG9yczoKKyAqCVRvbSBNYXJzaGFsbCA8dG9tbXlAaG9tZS50aWctZ3JyLmNvbT4KKyAqCisgKglNb3N0bHkgY29waWVkIGZyb20gbmV0ZmlsdGVyJ3MgaXB0X2xpbWl0LmMsIHNlZSB0aGF0IGZpbGUgZm9yCisgKgltb3JlIGV4cGxhbmF0aW9uCisgKgorICogIFNlcHRlbWJlciwgMjAwMworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2xpbWl0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxpbWl0X2xvY2spOworCisjZGVmaW5lIE1BWF9DUEogKDB4RkZGRkZGRkYgLyAoSFoqNjAqNjAqMjQpKQorCisjZGVmaW5lIF9QT1cyX0JFTE9XMih4KSAoKHgpfCgoeCk+PjEpKQorI2RlZmluZSBfUE9XMl9CRUxPVzQoeCkgKF9QT1cyX0JFTE9XMih4KXxfUE9XMl9CRUxPVzIoKHgpPj4yKSkKKyNkZWZpbmUgX1BPVzJfQkVMT1c4KHgpIChfUE9XMl9CRUxPVzQoeCl8X1BPVzJfQkVMT1c0KCh4KT4+NCkpCisjZGVmaW5lIF9QT1cyX0JFTE9XMTYoeCkgKF9QT1cyX0JFTE9XOCh4KXxfUE9XMl9CRUxPVzgoKHgpPj44KSkKKyNkZWZpbmUgX1BPVzJfQkVMT1czMih4KSAoX1BPVzJfQkVMT1cxNih4KXxfUE9XMl9CRUxPVzE2KCh4KT4+MTYpKQorI2RlZmluZSBQT1cyX0JFTE9XMzIoeCkgKChfUE9XMl9CRUxPVzMyKHgpPj4xKSArIDEpCisKKyNkZWZpbmUgQ1JFRElUU19QRVJfSklGRlkgUE9XMl9CRUxPVzMyKE1BWF9DUEopCisKK3N0YXRpYyBpbnQgZWJ0X2xpbWl0X21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3sKKwlzdHJ1Y3QgZWJ0X2xpbWl0X2luZm8gKmluZm8gPSAoc3RydWN0IGVidF9saW1pdF9pbmZvICopZGF0YTsKKwl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisKKwlzcGluX2xvY2tfYmgoJmxpbWl0X2xvY2spOworCWluZm8tPmNyZWRpdCArPSAobm93IC0geGNoZygmaW5mby0+cHJldiwgbm93KSkgKiBDUkVESVRTX1BFUl9KSUZGWTsKKwlpZiAoaW5mby0+Y3JlZGl0ID4gaW5mby0+Y3JlZGl0X2NhcCkKKwkJaW5mby0+Y3JlZGl0ID0gaW5mby0+Y3JlZGl0X2NhcDsKKworCWlmIChpbmZvLT5jcmVkaXQgPj0gaW5mby0+Y29zdCkgeworCQkvKiBXZSdyZSBub3QgbGltaXRlZC4gKi8KKwkJaW5mby0+Y3JlZGl0IC09IGluZm8tPmNvc3Q7CisJCXNwaW5fdW5sb2NrX2JoKCZsaW1pdF9sb2NrKTsKKwkJcmV0dXJuIEVCVF9NQVRDSDsKKwl9CisKKwlzcGluX3VubG9ja19iaCgmbGltaXRfbG9jayk7CisJcmV0dXJuIEVCVF9OT01BVENIOworfQorCisvKiBQcmVjaXNpb24gc2F2ZXIuICovCitzdGF0aWMgdV9pbnQzMl90Cit1c2VyMmNyZWRpdHModV9pbnQzMl90IHVzZXIpCit7CisJLyogSWYgbXVsdGlwbHlpbmcgd291bGQgb3ZlcmZsb3cuLi4gKi8KKwlpZiAodXNlciA+IDB4RkZGRkZGRkYgLyAoSFoqQ1JFRElUU19QRVJfSklGRlkpKQorCQkvKiBEaXZpZGUgZmlyc3QuICovCisJCXJldHVybiAodXNlciAvIEVCVF9MSU1JVF9TQ0FMRSkgKiBIWiAqIENSRURJVFNfUEVSX0pJRkZZOworCisJcmV0dXJuICh1c2VyICogSFogKiBDUkVESVRTX1BFUl9KSUZGWSkgLyBFQlRfTElNSVRfU0NBTEU7Cit9CisKK3N0YXRpYyBpbnQgZWJ0X2xpbWl0X2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgdW5zaWduZWQgaW50IGhvb2ttYXNrLAorICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeSAqZSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFsZW4pCit7CisJc3RydWN0IGVidF9saW1pdF9pbmZvICppbmZvID0gKHN0cnVjdCBlYnRfbGltaXRfaW5mbyAqKWRhdGE7CisKKwlpZiAoZGF0YWxlbiAhPSBFQlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBlYnRfbGltaXRfaW5mbykpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIENoZWNrIGZvciBvdmVyZmxvdy4gKi8KKwlpZiAoaW5mby0+YnVyc3QgPT0gMCB8fAorCSAgICB1c2VyMmNyZWRpdHMoaW5mby0+YXZnICogaW5mby0+YnVyc3QpIDwgdXNlcjJjcmVkaXRzKGluZm8tPmF2ZykpIHsKKwkJcHJpbnRrKCJPdmVyZmxvdyBpbiBlYnRfbGltaXQsIHRyeSBsb3dlcjogJXUvJXVcbiIsCisJCQlpbmZvLT5hdmcsIGluZm8tPmJ1cnN0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVXNlciBhdmcgaW4gc2Vjb25kcyAqIEVCVF9MSU1JVF9TQ0FMRTogY29udmVydCB0byBqaWZmaWVzICogMTI4LiAqLworCWluZm8tPnByZXYgPSBqaWZmaWVzOworCWluZm8tPmNyZWRpdCA9IHVzZXIyY3JlZGl0cyhpbmZvLT5hdmcgKiBpbmZvLT5idXJzdCk7CisJaW5mby0+Y3JlZGl0X2NhcCA9IHVzZXIyY3JlZGl0cyhpbmZvLT5hdmcgKiBpbmZvLT5idXJzdCk7CisJaW5mby0+Y29zdCA9IHVzZXIyY3JlZGl0cyhpbmZvLT5hdmcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGVidF9tYXRjaCBlYnRfbGltaXRfcmVnID0KK3sKKwkubmFtZQkJPSBFQlRfTElNSVRfTUFUQ0gsCisJLm1hdGNoCQk9IGVidF9saW1pdF9tYXRjaCwKKwkuY2hlY2sJCT0gZWJ0X2xpbWl0X2NoZWNrLAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlyZXR1cm4gZWJ0X3JlZ2lzdGVyX21hdGNoKCZlYnRfbGltaXRfcmVnKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwllYnRfdW5yZWdpc3Rlcl9tYXRjaCgmZWJ0X2xpbWl0X3JlZyk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRhZTM0YgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9sb2cuYwpAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqICBlYnRfbG9nCisgKgorICoJQXV0aG9yczoKKyAqCUJhcnQgRGUgU2NodXltZXIgPGJkc2NodXltQHBhbmRvcmEuYmU+CisgKgorICogIEFwcmlsLCAyMDAyCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbG9nLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGVidF9sb2dfbG9jayk7CisKK3N0YXRpYyBpbnQgZWJ0X2xvZ19jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIHVuc2lnbmVkIGludCBob29rbWFzaywKKyAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnkgKmUsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQoreworCXN0cnVjdCBlYnRfbG9nX2luZm8gKmluZm8gPSAoc3RydWN0IGVidF9sb2dfaW5mbyAqKWRhdGE7CisKKwlpZiAoZGF0YWxlbiAhPSBFQlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBlYnRfbG9nX2luZm8pKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGluZm8tPmJpdG1hc2sgJiB+RUJUX0xPR19NQVNLKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaW5mby0+bG9nbGV2ZWwgPj0gOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaW5mby0+cHJlZml4W0VCVF9MT0dfUFJFRklYX1NJWkUgLSAxXSA9ICdcMCc7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB0Y3B1ZHBoZHIKK3sKKwl1aW50MTZfdCBzcmM7CisJdWludDE2X3QgZHN0OworfTsKKworc3RydWN0IGFycHBheWxvYWQKK3sKKwl1bnNpZ25lZCBjaGFyIG1hY19zcmNbRVRIX0FMRU5dOworCXVuc2lnbmVkIGNoYXIgaXBfc3JjWzRdOworCXVuc2lnbmVkIGNoYXIgbWFjX2RzdFtFVEhfQUxFTl07CisJdW5zaWduZWQgY2hhciBpcF9kc3RbNF07Cit9OworCitzdGF0aWMgdm9pZCBwcmludF9NQUModW5zaWduZWQgY2hhciAqcCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrLCBwKyspCisJCXByaW50aygiJTAyeCVjIiwgKnAsIGkgPT0gRVRIX0FMRU4gLSAxID8gJyAnOic6Jyk7Cit9CisKKyNkZWZpbmUgbXlOSVBRVUFEKGEpIGFbMF0sIGFbMV0sIGFbMl0sIGFbM10KK3N0YXRpYyB2b2lkIGVidF9sb2coY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGhvb2tuciwKKyAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQoreworCXN0cnVjdCBlYnRfbG9nX2luZm8gKmluZm8gPSAoc3RydWN0IGVidF9sb2dfaW5mbyAqKWRhdGE7CisJY2hhciBsZXZlbF9zdHJpbmdbNF0gPSAiPCA+IjsKKwl1bmlvbiB7c3RydWN0IGlwaGRyIGlwaDsgc3RydWN0IHRjcHVkcGhkciBwb3J0czsKKwkgICAgICAgc3RydWN0IGFycGhkciBhcnBoOyBzdHJ1Y3QgYXJwcGF5bG9hZCBhcnBwO30gdTsKKworCWxldmVsX3N0cmluZ1sxXSA9ICcwJyArIGluZm8tPmxvZ2xldmVsOworCXNwaW5fbG9ja19iaCgmZWJ0X2xvZ19sb2NrKTsKKwlwcmludGsobGV2ZWxfc3RyaW5nKTsKKwlwcmludGsoIiVzIElOPSVzIE9VVD0lcyAiLCBpbmZvLT5wcmVmaXgsIGluID8gaW4tPm5hbWUgOiAiIiwKKwkgICBvdXQgPyBvdXQtPm5hbWUgOiAiIik7CisKKwlwcmludGsoIk1BQyBzb3VyY2UgPSAiKTsKKwlwcmludF9NQUMoZXRoX2hkcihza2IpLT5oX3NvdXJjZSk7CisJcHJpbnRrKCJNQUMgZGVzdCA9ICIpOworCXByaW50X01BQyhldGhfaGRyKHNrYiktPmhfZGVzdCk7CisKKwlwcmludGsoInByb3RvID0gMHglMDR4IiwgbnRvaHMoZXRoX2hkcihza2IpLT5oX3Byb3RvKSk7CisKKwlpZiAoKGluZm8tPmJpdG1hc2sgJiBFQlRfTE9HX0lQKSAmJiBldGhfaGRyKHNrYiktPmhfcHJvdG8gPT0KKwkgICBodG9ucyhFVEhfUF9JUCkpeworCQlzdHJ1Y3QgaXBoZHIgX2lwaCwgKmloOworCisJCWloID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgMCwgc2l6ZW9mKF9pcGgpLCAmX2lwaCk7CisJCWlmIChpaCA9PSBOVUxMKSB7CisJCQlwcmludGsoIiBJTkNPTVBMRVRFIElQIGhlYWRlciIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJcHJpbnRrKCIgSVAgU1JDPSV1LiV1LiV1LiV1IElQIERTVD0ldS4ldS4ldS4ldSwiLAorCQkgICBOSVBRVUFEKGloLT5zYWRkciksIE5JUFFVQUQoaWgtPmRhZGRyKSk7CisJCXByaW50aygiIElQIHRvcz0weCUwMlgsIElQIHByb3RvPSVkIiwgdS5pcGgudG9zLAorCQkgICAgICAgaWgtPnByb3RvY29sKTsKKwkJaWYgKGloLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCB8fAorCQkgICAgaWgtPnByb3RvY29sID09IElQUFJPVE9fVURQKSB7CisJCQlzdHJ1Y3QgdGNwdWRwaGRyIF9wb3J0cywgKnBwdHI7CisKKwkJCXBwdHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpaC0+aWhsKjQsCisJCQkJCQkgIHNpemVvZihfcG9ydHMpLCAmX3BvcnRzKTsKKwkJCWlmIChwcHRyID09IE5VTEwpIHsKKwkJCQlwcmludGsoIiBJTkNPTVBMRVRFIFRDUC9VRFAgaGVhZGVyIik7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlwcmludGsoIiBTUFQ9JXUgRFBUPSV1IiwgbnRvaHMocHB0ci0+c3JjKSwKKwkJCSAgIG50b2hzKHBwdHItPmRzdCkpOworCQl9CisJCWdvdG8gb3V0OworCX0KKworCWlmICgoaW5mby0+Yml0bWFzayAmIEVCVF9MT0dfQVJQKSAmJgorCSAgICAoKGV0aF9oZHIoc2tiKS0+aF9wcm90byA9PSBodG9ucyhFVEhfUF9BUlApKSB8fAorCSAgICAgKGV0aF9oZHIoc2tiKS0+aF9wcm90byA9PSBodG9ucyhFVEhfUF9SQVJQKSkpKSB7CisJCXN0cnVjdCBhcnBoZHIgX2FycGgsICphaDsKKworCQlhaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIDAsIHNpemVvZihfYXJwaCksICZfYXJwaCk7CisJCWlmIChhaCA9PSBOVUxMKSB7CisJCQlwcmludGsoIiBJTkNPTVBMRVRFIEFSUCBoZWFkZXIiKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXByaW50aygiIEFSUCBIVFlQRT0lZCwgUFRZUEU9MHglMDR4LCBPUENPREU9JWQiLAorCQkgICAgICAgbnRvaHMoYWgtPmFyX2hyZCksIG50b2hzKGFoLT5hcl9wcm8pLAorCQkgICAgICAgbnRvaHMoYWgtPmFyX29wKSk7CisKKwkJLyogSWYgaXQncyBmb3IgRXRoZXJuZXQgYW5kIHRoZSBsZW5ndGhzIGFyZSBPSywKKwkJICogdGhlbiBsb2cgdGhlIEFSUCBwYXlsb2FkICovCisJCWlmIChhaC0+YXJfaHJkID09IGh0b25zKDEpICYmCisJCSAgICBhaC0+YXJfaGxuID09IEVUSF9BTEVOICYmCisJCSAgICBhaC0+YXJfcGxuID09IHNpemVvZih1aW50MzJfdCkpIHsKKwkJCXN0cnVjdCBhcnBwYXlsb2FkIF9hcnBwLCAqYXA7CisKKwkJCWFwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2l6ZW9mKHUuYXJwaCksCisJCQkJCQlzaXplb2YoX2FycHApLCAmX2FycHApOworCQkJaWYgKGFwID09IE5VTEwpIHsKKwkJCQlwcmludGsoIiBJTkNPTVBMRVRFIEFSUCBwYXlsb2FkIik7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlwcmludGsoIiBBUlAgTUFDIFNSQz0iKTsKKwkJCXByaW50X01BQyhhcC0+bWFjX3NyYyk7CisJCQlwcmludGsoIiBBUlAgSVAgU1JDPSV1LiV1LiV1LiV1IiwKKwkJCSAgICAgICBteU5JUFFVQUQoYXAtPmlwX3NyYykpOworCQkJcHJpbnRrKCIgQVJQIE1BQyBEU1Q9Iik7CisJCQlwcmludF9NQUMoYXAtPm1hY19kc3QpOworCQkJcHJpbnRrKCIgQVJQIElQIERTVD0ldS4ldS4ldS4ldSIsCisJCQkgICAgICAgbXlOSVBRVUFEKGFwLT5pcF9kc3QpKTsKKwkJfQorCX0KK291dDoKKwlwcmludGsoIlxuIik7CisJc3Bpbl91bmxvY2tfYmgoJmVidF9sb2dfbG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X3dhdGNoZXIgbG9nID0KK3sKKwkubmFtZQkJPSBFQlRfTE9HX1dBVENIRVIsCisJLndhdGNoZXIJPSBlYnRfbG9nLAorCS5jaGVjawkJPSBlYnRfbG9nX2NoZWNrLAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlyZXR1cm4gZWJ0X3JlZ2lzdGVyX3dhdGNoZXIoJmxvZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJZWJ0X3VucmVnaXN0ZXJfd2F0Y2hlcigmbG9nKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9tYXJrLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbWFyay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYzYzMmIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbWFyay5jCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiAgZWJ0X21hcmsKKyAqCisgKglBdXRob3JzOgorICoJQmFydCBEZSBTY2h1eW1lciA8YmRzY2h1eW1AcGFuZG9yYS5iZT4KKyAqCisgKiAgSnVseSwgMjAwMgorICoKKyAqLworCisvKiBUaGUgbWFyayB0YXJnZXQgY2FuIGJlIHVzZWQgaW4gYW55IGNoYWluLAorICogSSBiZWxpZXZlIGFkZGluZyBhIG1hbmdsZSB0YWJsZSBqdXN0IGZvciBtYXJraW5nIGlzIHRvdGFsIG92ZXJraWxsLgorICogTWFya2luZyBhIGZyYW1lIGRvZXNuJ3QgcmVhbGx5IGNoYW5nZSBhbnl0aGluZyBpbiB0aGUgZnJhbWUgYW55d2F5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbWFya190Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKK3N0YXRpYyBpbnQgZWJ0X3RhcmdldF9tYXJrKHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgaW50IGhvb2tuciwKKyAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQoreworCXN0cnVjdCBlYnRfbWFya190X2luZm8gKmluZm8gPSAoc3RydWN0IGVidF9tYXJrX3RfaW5mbyAqKWRhdGE7CisKKwlpZiAoKCpwc2tiKS0+bmZtYXJrICE9IGluZm8tPm1hcmspIHsKKwkJKCpwc2tiKS0+bmZtYXJrID0gaW5mby0+bWFyazsKKwkJKCpwc2tiKS0+bmZjYWNoZSB8PSBORkNfQUxURVJFRDsKKwl9CisJcmV0dXJuIGluZm8tPnRhcmdldDsKK30KKworc3RhdGljIGludCBlYnRfdGFyZ2V0X21hcmtfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLCB1bnNpZ25lZCBpbnQgaG9va21hc2ssCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5ICplLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3sKKwlzdHJ1Y3QgZWJ0X21hcmtfdF9pbmZvICppbmZvID0gKHN0cnVjdCBlYnRfbWFya190X2luZm8gKilkYXRhOworCisJaWYgKGRhdGFsZW4gIT0gRUJUX0FMSUdOKHNpemVvZihzdHJ1Y3QgZWJ0X21hcmtfdF9pbmZvKSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChCQVNFX0NIQUlOICYmIGluZm8tPnRhcmdldCA9PSBFQlRfUkVUVVJOKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlDTEVBUl9CQVNFX0NIQUlOX0JJVDsKKwlpZiAoSU5WQUxJRF9UQVJHRVQpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGVidF90YXJnZXQgbWFya190YXJnZXQgPQoreworCS5uYW1lCQk9IEVCVF9NQVJLX1RBUkdFVCwKKwkudGFyZ2V0CQk9IGVidF90YXJnZXRfbWFyaywKKwkuY2hlY2sJCT0gZWJ0X3RhcmdldF9tYXJrX2NoZWNrLAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlyZXR1cm4gZWJ0X3JlZ2lzdGVyX3RhcmdldCgmbWFya190YXJnZXQpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCWVidF91bnJlZ2lzdGVyX3RhcmdldCgmbWFya190YXJnZXQpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X21hcmtfbS5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X21hcmtfbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNTEwMmQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbWFya19tLmMKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqICBlYnRfbWFya19tCisgKgorICoJQXV0aG9yczoKKyAqCUJhcnQgRGUgU2NodXltZXIgPGJkc2NodXltQHBhbmRvcmEuYmU+CisgKgorICogIEp1bHksIDIwMDIKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9tYXJrX20uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworc3RhdGljIGludCBlYnRfZmlsdGVyX21hcmsoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgdm9pZCAqZGF0YSwKKyAgIHVuc2lnbmVkIGludCBkYXRhbGVuKQoreworCXN0cnVjdCBlYnRfbWFya19tX2luZm8gKmluZm8gPSAoc3RydWN0IGVidF9tYXJrX21faW5mbyAqKSBkYXRhOworCisJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfTUFSS19PUikKKwkJcmV0dXJuICEoISEoc2tiLT5uZm1hcmsgJiBpbmZvLT5tYXNrKSBeIGluZm8tPmludmVydCk7CisJcmV0dXJuICEoKChza2ItPm5mbWFyayAmIGluZm8tPm1hc2spID09IGluZm8tPm1hcmspIF4gaW5mby0+aW52ZXJ0KTsKK30KKworc3RhdGljIGludCBlYnRfbWFya19jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIHVuc2lnbmVkIGludCBob29rbWFzaywKKyAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnkgKmUsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQoreworICAgICAgICBzdHJ1Y3QgZWJ0X21hcmtfbV9pbmZvICppbmZvID0gKHN0cnVjdCBlYnRfbWFya19tX2luZm8gKikgZGF0YTsKKworCWlmIChkYXRhbGVuICE9IEVCVF9BTElHTihzaXplb2Yoc3RydWN0IGVidF9tYXJrX21faW5mbykpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaW5mby0+Yml0bWFzayAmIH5FQlRfTUFSS19NQVNLKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoKGluZm8tPmJpdG1hc2sgJiBFQlRfTUFSS19PUikgJiYgKGluZm8tPmJpdG1hc2sgJiBFQlRfTUFSS19BTkQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWluZm8tPmJpdG1hc2spCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGVidF9tYXRjaCBmaWx0ZXJfbWFyayA9Cit7CisJLm5hbWUJCT0gRUJUX01BUktfTUFUQ0gsCisJLm1hdGNoCQk9IGVidF9maWx0ZXJfbWFyaywKKwkuY2hlY2sJCT0gZWJ0X21hcmtfY2hlY2ssCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCXJldHVybiBlYnRfcmVnaXN0ZXJfbWF0Y2goJmZpbHRlcl9tYXJrKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwllYnRfdW5yZWdpc3Rlcl9tYXRjaCgmZmlsdGVyX21hcmspOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3BrdHR5cGUuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9wa3R0eXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNkM2I0MgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9wa3R0eXBlLmMKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqICBlYnRfcGt0dHlwZQorICoKKyAqCUF1dGhvcnM6CisgKglCYXJ0IERlIFNjaHV5bWVyIDxiZHNjaHV5bUBwYW5kb3JhLmJlPgorICoKKyAqICBBcHJpbCwgMjAwMworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3BrdHR5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworc3RhdGljIGludCBlYnRfZmlsdGVyX3BrdHR5cGUoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICBjb25zdCB2b2lkICpkYXRhLAorICAgdW5zaWduZWQgaW50IGRhdGFsZW4pCit7CisJc3RydWN0IGVidF9wa3R0eXBlX2luZm8gKmluZm8gPSAoc3RydWN0IGVidF9wa3R0eXBlX2luZm8gKilkYXRhOworCisJcmV0dXJuIChza2ItPnBrdF90eXBlICE9IGluZm8tPnBrdF90eXBlKSBeIGluZm8tPmludmVydDsKK30KKworc3RhdGljIGludCBlYnRfcGt0dHlwZV9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIHVuc2lnbmVkIGludCBob29rbWFzaywKKyAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnkgKmUsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQoreworCXN0cnVjdCBlYnRfcGt0dHlwZV9pbmZvICppbmZvID0gKHN0cnVjdCBlYnRfcGt0dHlwZV9pbmZvICopZGF0YTsKKworCWlmIChkYXRhbGVuICE9IEVCVF9BTElHTihzaXplb2Yoc3RydWN0IGVidF9wa3R0eXBlX2luZm8pKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGluZm8tPmludmVydCAhPSAwICYmIGluZm8tPmludmVydCAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBBbGxvdyBhbnkgcGt0X3R5cGUgdmFsdWUgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBlYnRfbWF0Y2ggZmlsdGVyX3BrdHR5cGUgPQoreworCS5uYW1lCQk9IEVCVF9QS1RUWVBFX01BVENILAorCS5tYXRjaAkJPSBlYnRfZmlsdGVyX3BrdHR5cGUsCisJLmNoZWNrCQk9IGVidF9wa3R0eXBlX2NoZWNrLAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlyZXR1cm4gZWJ0X3JlZ2lzdGVyX21hdGNoKCZmaWx0ZXJfcGt0dHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJZWJ0X3VucmVnaXN0ZXJfbWF0Y2goJmZpbHRlcl9wa3R0eXBlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9yZWRpcmVjdC5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3JlZGlyZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzOGI0MwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9yZWRpcmVjdC5jCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiAgZWJ0X3JlZGlyZWN0CisgKgorICoJQXV0aG9yczoKKyAqCUJhcnQgRGUgU2NodXltZXIgPGJkc2NodXltQHBhbmRvcmEuYmU+CisgKgorICogIEFwcmlsLCAyMDAyCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfcmVkaXJlY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgIi4uL2JyX3ByaXZhdGUuaCIKKworc3RhdGljIGludCBlYnRfdGFyZ2V0X3JlZGlyZWN0KHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgaW50IGhvb2tuciwKKyAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQoreworCXN0cnVjdCBlYnRfcmVkaXJlY3RfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZWJ0X3JlZGlyZWN0X2luZm8gKilkYXRhOworCisJaWYgKHNrYl9zaGFyZWQoKnBza2IpIHx8IHNrYl9jbG9uZWQoKnBza2IpKSB7CisJCXN0cnVjdCBza19idWZmICpuc2tiOworCisJCW5za2IgPSBza2JfY29weSgqcHNrYiwgR0ZQX0FUT01JQyk7CisJCWlmICghbnNrYikKKwkJCXJldHVybiBORl9EUk9QOworCQlpZiAoKCpwc2tiKS0+c2spCisJCQlza2Jfc2V0X293bmVyX3cobnNrYiwgKCpwc2tiKS0+c2spOworCQlrZnJlZV9za2IoKnBza2IpOworCQkqcHNrYiA9IG5za2I7CisJfQorCWlmIChob29rbnIgIT0gTkZfQlJfQlJPVVRJTkcpCisJCW1lbWNweShldGhfaGRyKCpwc2tiKS0+aF9kZXN0LAorCQkgICAgICAgaW4tPmJyX3BvcnQtPmJyLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJZWxzZQorCQltZW1jcHkoZXRoX2hkcigqcHNrYiktPmhfZGVzdCwgaW4tPmRldl9hZGRyLCBFVEhfQUxFTik7CisJKCpwc2tiKS0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKKwlyZXR1cm4gaW5mby0+dGFyZ2V0OworfQorCitzdGF0aWMgaW50IGVidF90YXJnZXRfcmVkaXJlY3RfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLCB1bnNpZ25lZCBpbnQgaG9va21hc2ssCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5ICplLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3sKKwlzdHJ1Y3QgZWJ0X3JlZGlyZWN0X2luZm8gKmluZm8gPSAoc3RydWN0IGVidF9yZWRpcmVjdF9pbmZvICopZGF0YTsKKworCWlmIChkYXRhbGVuICE9IEVCVF9BTElHTihzaXplb2Yoc3RydWN0IGVidF9yZWRpcmVjdF9pbmZvKSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChCQVNFX0NIQUlOICYmIGluZm8tPnRhcmdldCA9PSBFQlRfUkVUVVJOKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlDTEVBUl9CQVNFX0NIQUlOX0JJVDsKKwlpZiAoIChzdHJjbXAodGFibGVuYW1lLCAibmF0IikgfHwgaG9va21hc2sgJiB+KDEgPDwgTkZfQlJfUFJFX1JPVVRJTkcpKSAmJgorCSAgICAgKHN0cmNtcCh0YWJsZW5hbWUsICJicm91dGUiKSB8fCBob29rbWFzayAmIH4oMSA8PCBORl9CUl9CUk9VVElORykpICkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKElOVkFMSURfVEFSR0VUKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBlYnRfdGFyZ2V0IHJlZGlyZWN0X3RhcmdldCA9Cit7CisJLm5hbWUJCT0gRUJUX1JFRElSRUNUX1RBUkdFVCwKKwkudGFyZ2V0CQk9IGVidF90YXJnZXRfcmVkaXJlY3QsCisJLmNoZWNrCQk9IGVidF90YXJnZXRfcmVkaXJlY3RfY2hlY2ssCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCXJldHVybiBlYnRfcmVnaXN0ZXJfdGFyZ2V0KCZyZWRpcmVjdF90YXJnZXQpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCWVidF91bnJlZ2lzdGVyX3RhcmdldCgmcmVkaXJlY3RfdGFyZ2V0KTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9zbmF0LmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfc25hdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MjliZGMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfc25hdC5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiAgZWJ0X3NuYXQKKyAqCisgKglBdXRob3JzOgorICoJQmFydCBEZSBTY2h1eW1lciA8YmRzY2h1eW1AcGFuZG9yYS5iZT4KKyAqCisgKiAgSnVuZSwgMjAwMgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X25hdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKK3N0YXRpYyBpbnQgZWJ0X3RhcmdldF9zbmF0KHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgaW50IGhvb2tuciwKKyAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQoreworCXN0cnVjdCBlYnRfbmF0X2luZm8gKmluZm8gPSAoc3RydWN0IGVidF9uYXRfaW5mbyAqKSBkYXRhOworCisJaWYgKHNrYl9zaGFyZWQoKnBza2IpIHx8IHNrYl9jbG9uZWQoKnBza2IpKSB7CisJCXN0cnVjdCBza19idWZmICpuc2tiOworCisJCW5za2IgPSBza2JfY29weSgqcHNrYiwgR0ZQX0FUT01JQyk7CisJCWlmICghbnNrYikKKwkJCXJldHVybiBORl9EUk9QOworCQlpZiAoKCpwc2tiKS0+c2spCisJCQlza2Jfc2V0X293bmVyX3cobnNrYiwgKCpwc2tiKS0+c2spOworCQlrZnJlZV9za2IoKnBza2IpOworCQkqcHNrYiA9IG5za2I7CisJfQorCW1lbWNweShldGhfaGRyKCpwc2tiKS0+aF9zb3VyY2UsIGluZm8tPm1hYywgRVRIX0FMRU4pOworCXJldHVybiBpbmZvLT50YXJnZXQ7Cit9CisKK3N0YXRpYyBpbnQgZWJ0X3RhcmdldF9zbmF0X2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgdW5zaWduZWQgaW50IGhvb2ttYXNrLAorICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeSAqZSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFsZW4pCit7CisJc3RydWN0IGVidF9uYXRfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZWJ0X25hdF9pbmZvICopIGRhdGE7CisKKwlpZiAoZGF0YWxlbiAhPSBFQlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBlYnRfbmF0X2luZm8pKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKEJBU0VfQ0hBSU4gJiYgaW5mby0+dGFyZ2V0ID09IEVCVF9SRVRVUk4pCisJCXJldHVybiAtRUlOVkFMOworCUNMRUFSX0JBU0VfQ0hBSU5fQklUOworCWlmIChzdHJjbXAodGFibGVuYW1lLCAibmF0IikpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChob29rbWFzayAmIH4oMSA8PCBORl9CUl9QT1NUX1JPVVRJTkcpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoSU5WQUxJRF9UQVJHRVQpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGVidF90YXJnZXQgc25hdCA9Cit7CisJLm5hbWUJCT0gRUJUX1NOQVRfVEFSR0VULAorCS50YXJnZXQJCT0gZWJ0X3RhcmdldF9zbmF0LAorCS5jaGVjawkJPSBlYnRfdGFyZ2V0X3NuYXRfY2hlY2ssCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCXJldHVybiBlYnRfcmVnaXN0ZXJfdGFyZ2V0KCZzbmF0KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwllYnRfdW5yZWdpc3Rlcl90YXJnZXQoJnNuYXQpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3N0cC5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3N0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YThjZGUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfc3RwLmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiAgZWJ0X3N0cAorICoKKyAqCUF1dGhvcnM6CisgKglCYXJ0IERlIFNjaHV5bWVyIDxiZHNjaHV5bUBwYW5kb3JhLmJlPgorICoJU3RlcGhlbiBIZW1taW5nZXIgPHNoZW1taW5nZXJAb3NkbC5vcmc+CisgKgorICogIEp1bHksIDIwMDMKKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3N0cC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjZGVmaW5lIEJQRFVfVFlQRV9DT05GSUcgMAorI2RlZmluZSBCUERVX1RZUEVfVENOIDB4ODAKKworc3RydWN0IHN0cF9oZWFkZXIgeworCXVpbnQ4X3QgZHNhcDsKKwl1aW50OF90IHNzYXA7CisJdWludDhfdCBjdHJsOworCXVpbnQ4X3QgcGlkOworCXVpbnQ4X3QgdmVyczsKKwl1aW50OF90IHR5cGU7Cit9OworCitzdHJ1Y3Qgc3RwX2NvbmZpZ19wZHUgeworCXVpbnQ4X3QgZmxhZ3M7CisJdWludDhfdCByb290WzhdOworCXVpbnQ4X3Qgcm9vdF9jb3N0WzRdOworCXVpbnQ4X3Qgc2VuZGVyWzhdOworCXVpbnQ4X3QgcG9ydFsyXTsKKwl1aW50OF90IG1zZ19hZ2VbMl07CisJdWludDhfdCBtYXhfYWdlWzJdOworCXVpbnQ4X3QgaGVsbG9fdGltZVsyXTsKKwl1aW50OF90IGZvcndhcmRfZGVsYXlbMl07Cit9OworCisjZGVmaW5lIE5SMTYocCkgKHBbMF0gPDwgOCB8IHBbMV0pCisjZGVmaW5lIE5SMzIocCkgKChwWzBdIDw8IDI0KSB8IChwWzFdIDw8IDE2KSB8IChwWzJdIDw8IDgpIHwgcFszXSkKKworc3RhdGljIGludCBlYnRfZmlsdGVyX2NvbmZpZyhzdHJ1Y3QgZWJ0X3N0cF9pbmZvICppbmZvLAorICAgc3RydWN0IHN0cF9jb25maWdfcGR1ICpzdHBjKQoreworCXN0cnVjdCBlYnRfc3RwX2NvbmZpZ19pbmZvICpjOworCXVpbnQxNl90IHYxNjsKKwl1aW50MzJfdCB2MzI7CisJaW50IHZlcmRpY3QsIGk7CisKKwljID0gJmluZm8tPmNvbmZpZzsKKwlpZiAoKGluZm8tPmJpdG1hc2sgJiBFQlRfU1RQX0ZMQUdTKSAmJgorCSAgICBGV0lOVihjLT5mbGFncyAhPSBzdHBjLT5mbGFncywgRUJUX1NUUF9GTEFHUykpCisJCXJldHVybiBFQlRfTk9NQVRDSDsKKwlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9TVFBfUk9PVFBSSU8pIHsKKwkJdjE2ID0gTlIxNihzdHBjLT5yb290KTsKKwkJaWYgKEZXSU5WKHYxNiA8IGMtPnJvb3RfcHJpb2wgfHwKKwkJICAgIHYxNiA+IGMtPnJvb3RfcHJpb3UsIEVCVF9TVFBfUk9PVFBSSU8pKQorCQkJcmV0dXJuIEVCVF9OT01BVENIOworCX0KKwlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9TVFBfUk9PVEFERFIpIHsKKwkJdmVyZGljdCA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQl2ZXJkaWN0IHw9IChzdHBjLT5yb290WzIraV0gXiBjLT5yb290X2FkZHJbaV0pICYKKwkJCSAgICAgICAgICAgYy0+cm9vdF9hZGRybXNrW2ldOworCQlpZiAoRldJTlYodmVyZGljdCAhPSAwLCBFQlRfU1RQX1JPT1RBRERSKSkKKwkJCXJldHVybiBFQlRfTk9NQVRDSDsKKwl9CisJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfU1RQX1JPT1RDT1NUKSB7CisJCXYzMiA9IE5SMzIoc3RwYy0+cm9vdF9jb3N0KTsKKwkJaWYgKEZXSU5WKHYzMiA8IGMtPnJvb3RfY29zdGwgfHwKKwkJICAgIHYzMiA+IGMtPnJvb3RfY29zdHUsIEVCVF9TVFBfUk9PVENPU1QpKQorCQkJcmV0dXJuIEVCVF9OT01BVENIOworCX0KKwlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9TVFBfU0VOREVSUFJJTykgeworCQl2MTYgPSBOUjE2KHN0cGMtPnNlbmRlcik7CisJCWlmIChGV0lOVih2MTYgPCBjLT5zZW5kZXJfcHJpb2wgfHwKKwkJICAgIHYxNiA+IGMtPnNlbmRlcl9wcmlvdSwgRUJUX1NUUF9TRU5ERVJQUklPKSkKKwkJCXJldHVybiBFQlRfTk9NQVRDSDsKKwl9CisJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfU1RQX1NFTkRFUkFERFIpIHsKKwkJdmVyZGljdCA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQl2ZXJkaWN0IHw9IChzdHBjLT5zZW5kZXJbMitpXSBeIGMtPnNlbmRlcl9hZGRyW2ldKSAmCisJCQkgICAgICAgICAgIGMtPnNlbmRlcl9hZGRybXNrW2ldOworCQlpZiAoRldJTlYodmVyZGljdCAhPSAwLCBFQlRfU1RQX1NFTkRFUkFERFIpKQorCQkJcmV0dXJuIEVCVF9OT01BVENIOworCX0KKwlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9TVFBfUE9SVCkgeworCQl2MTYgPSBOUjE2KHN0cGMtPnBvcnQpOworCQlpZiAoRldJTlYodjE2IDwgYy0+cG9ydGwgfHwKKwkJICAgIHYxNiA+IGMtPnBvcnR1LCBFQlRfU1RQX1BPUlQpKQorCQkJcmV0dXJuIEVCVF9OT01BVENIOworCX0KKwlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9TVFBfTVNHQUdFKSB7CisJCXYxNiA9IE5SMTYoc3RwYy0+bXNnX2FnZSk7CisJCWlmIChGV0lOVih2MTYgPCBjLT5tc2dfYWdlbCB8fAorCQkgICAgdjE2ID4gYy0+bXNnX2FnZXUsIEVCVF9TVFBfTVNHQUdFKSkKKwkJCXJldHVybiBFQlRfTk9NQVRDSDsKKwl9CisJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfU1RQX01BWEFHRSkgeworCQl2MTYgPSBOUjE2KHN0cGMtPm1heF9hZ2UpOworCQlpZiAoRldJTlYodjE2IDwgYy0+bWF4X2FnZWwgfHwKKwkJICAgIHYxNiA+IGMtPm1heF9hZ2V1LCBFQlRfU1RQX01BWEFHRSkpCisJCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJfQorCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX1NUUF9IRUxMT1RJTUUpIHsKKwkJdjE2ID0gTlIxNihzdHBjLT5oZWxsb190aW1lKTsKKwkJaWYgKEZXSU5WKHYxNiA8IGMtPmhlbGxvX3RpbWVsIHx8CisJCSAgICB2MTYgPiBjLT5oZWxsb190aW1ldSwgRUJUX1NUUF9IRUxMT1RJTUUpKQorCQkJcmV0dXJuIEVCVF9OT01BVENIOworCX0KKwlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9TVFBfRldERCkgeworCQl2MTYgPSBOUjE2KHN0cGMtPmZvcndhcmRfZGVsYXkpOworCQlpZiAoRldJTlYodjE2IDwgYy0+Zm9yd2FyZF9kZWxheWwgfHwKKwkJICAgIHYxNiA+IGMtPmZvcndhcmRfZGVsYXl1LCBFQlRfU1RQX0ZXREQpKQorCQkJcmV0dXJuIEVCVF9OT01BVENIOworCX0KKwlyZXR1cm4gRUJUX01BVENIOworfQorCitzdGF0aWMgaW50IGVidF9maWx0ZXJfc3RwKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQoreworCXN0cnVjdCBlYnRfc3RwX2luZm8gKmluZm8gPSAoc3RydWN0IGVidF9zdHBfaW5mbyAqKWRhdGE7CisJc3RydWN0IHN0cF9oZWFkZXIgX3N0cGgsICpzcDsKKwl1aW50OF90IGhlYWRlcls2XSA9IHsweDQyLCAweDQyLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKKworCXNwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgMCwgc2l6ZW9mKF9zdHBoKSwgJl9zdHBoKTsKKwlpZiAoc3AgPT0gTlVMTCkKKwkJcmV0dXJuIEVCVF9OT01BVENIOworCisJLyogVGhlIHN0cCBjb2RlIG9ubHkgY29uc2lkZXJzIHRoZXNlICovCisJaWYgKG1lbWNtcChzcCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkpCisJCXJldHVybiBFQlRfTk9NQVRDSDsKKworCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX1NUUF9UWVBFCisJICAgICYmIEZXSU5WKGluZm8tPnR5cGUgIT0gc3AtPnR5cGUsIEVCVF9TVFBfVFlQRSkpCisJCXJldHVybiBFQlRfTk9NQVRDSDsKKworCWlmIChzcC0+dHlwZSA9PSBCUERVX1RZUEVfQ09ORklHICYmCisJICAgIGluZm8tPmJpdG1hc2sgJiBFQlRfU1RQX0NPTkZJR19NQVNLKSB7CisJCXN0cnVjdCBzdHBfY29uZmlnX3BkdSBfc3RwYywgKnN0OworCisJCXN0ID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2l6ZW9mKF9zdHBoKSwKKwkJCQkJc2l6ZW9mKF9zdHBjKSwgJl9zdHBjKTsKKwkJaWYgKHN0ID09IE5VTEwpCisJCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCXJldHVybiBlYnRfZmlsdGVyX2NvbmZpZyhpbmZvLCBzdCk7CisJfQorCXJldHVybiBFQlRfTUFUQ0g7Cit9CisKK3N0YXRpYyBpbnQgZWJ0X3N0cF9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIHVuc2lnbmVkIGludCBob29rbWFzaywKKyAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnkgKmUsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQoreworCXN0cnVjdCBlYnRfc3RwX2luZm8gKmluZm8gPSAoc3RydWN0IGVidF9zdHBfaW5mbyAqKWRhdGE7CisJaW50IGxlbiA9IEVCVF9BTElHTihzaXplb2Yoc3RydWN0IGVidF9zdHBfaW5mbykpOworCXVpbnQ4X3QgYnJpZGdlX3VsYVs2XSA9IHsgMHgwMSwgMHg4MCwgMHhjMiwgMHgwMCwgMHgwMCwgMHgwMCB9OworCXVpbnQ4X3QgbXNrWzZdID0geyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIH07CisKKwlpZiAoaW5mby0+Yml0bWFzayAmIH5FQlRfU1RQX01BU0sgfHwgaW5mby0+aW52ZmxhZ3MgJiB+RUJUX1NUUF9NQVNLIHx8CisJICAgICEoaW5mby0+Yml0bWFzayAmIEVCVF9TVFBfTUFTSykpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChkYXRhbGVuICE9IGxlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyogTWFrZSBzdXJlIHRoZSBtYXRjaCBvbmx5IHJlY2VpdmVzIHN0cCBmcmFtZXMgKi8KKwlpZiAobWVtY21wKGUtPmRlc3RtYWMsIGJyaWRnZV91bGEsIEVUSF9BTEVOKSB8fAorCSAgICBtZW1jbXAoZS0+ZGVzdG1zaywgbXNrLCBFVEhfQUxFTikgfHwgIShlLT5iaXRtYXNrICYgRUJUX0RFU1RNQUMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGVidF9tYXRjaCBmaWx0ZXJfc3RwID0KK3sKKwkubmFtZQkJPSBFQlRfU1RQX01BVENILAorCS5tYXRjaAkJPSBlYnRfZmlsdGVyX3N0cCwKKwkuY2hlY2sJCT0gZWJ0X3N0cF9jaGVjaywKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJcmV0dXJuIGVidF9yZWdpc3Rlcl9tYXRjaCgmZmlsdGVyX3N0cCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJZWJ0X3VucmVnaXN0ZXJfbWF0Y2goJmZpbHRlcl9zdHApOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3Vsb2cuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF91bG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFhZjRmYwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF91bG9nLmMKQEAgLTAsMCArMSwyOTUgQEAKKy8qCisgKiBuZXRmaWx0ZXIgbW9kdWxlIGZvciB1c2Vyc3BhY2UgYnJpZGdlZCBFdGhlcm5ldCBmcmFtZXMgbG9nZ2luZyBkYWVtb25zCisgKgorICoJQXV0aG9yczoKKyAqCUJhcnQgRGUgU2NodXltZXIgPGJkc2NodXltQHBhbmRvcmEuYmU+CisgKgorICogIE5vdmVtYmVyLCAyMDA0CisgKgorICogQmFzZWQgb24gaXB0X1VMT0cuYywgd2hpY2ggaXMKKyAqIChDKSAyMDAwLTIwMDIgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBtb2R1bGUgYWNjZXB0cyB0d28gcGFyYW1ldGVyczogCisgKiAKKyAqIG5sYnVmc2l6OgorICogICBUaGUgcGFyYW1ldGVyIHNwZWNpZmllcyBob3cgYmlnIHRoZSBidWZmZXIgZm9yIGVhY2ggbmV0bGluayBtdWx0aWNhc3QKKyAqIGdyb3VwIGlzLiBlLmcuIElmIHlvdSBzYXkgbmxidWZzaXo9ODE5MiwgdXAgdG8gZWlnaHQga2Igb2YgcGFja2V0cyB3aWxsCisgKiBnZXQgYWNjdW11bGF0ZWQgaW4gdGhlIGtlcm5lbCB1bnRpbCB0aGV5IGFyZSBzZW50IHRvIHVzZXJzcGFjZS4gSXQgaXMKKyAqIE5PVCBwb3NzaWJsZSB0byBhbGxvY2F0ZSBtb3JlIHRoYW4gMTI4a0IsIGFuZCBpdCBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZCwKKyAqIGJlY2F1c2UgYXRvbWljYWxseSBhbGxvY2F0aW5nIDEyOGtCIGluc2lkZSB0aGUgbmV0d29yayByeCBzb2Z0aXJxIGlzIG5vdAorICogcmVsaWFibGUuIFBsZWFzZSBhbHNvIGtlZXAgaW4gbWluZCB0aGF0IHRoaXMgYnVmZmVyIHNpemUgaXMgYWxsb2NhdGVkIGZvcgorICogZWFjaCBubGdyb3VwIHlvdSBhcmUgdXNpbmcsIHNvIHRoZSB0b3RhbCBrZXJuZWwgbWVtb3J5IHVzYWdlIGluY3JlYXNlcworICogYnkgdGhhdCBmYWN0b3IuCisgKgorICogZmx1c2h0aW1lb3V0OgorICogICBTcGVjaWZ5LCBhZnRlciBob3cgbWFueSBodW5kcmVkdGhzIG9mIGEgc2Vjb25kIHRoZSBxdWV1ZSBzaG91bGQgYmUKKyAqICAgZmx1c2hlZCBldmVuIGlmIGl0IGlzIG5vdCBmdWxsIHlldC4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3Vsb2cuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgIi4uL2JyX3ByaXZhdGUuaCIKKworI2RlZmluZSBQUklOVFIoZm9ybWF0LCBhcmdzLi4uKSBkbyB7IGlmIChuZXRfcmF0ZWxpbWl0KCkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKGZvcm1hdCAsICMjIGFyZ3MpOyB9IHdoaWxlICgwKQorCitzdGF0aWMgdW5zaWduZWQgaW50IG5sYnVmc2l6ID0gNDA5NjsKK21vZHVsZV9wYXJhbShubGJ1ZnNpeiwgdWludCwgMDYwMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5sYnVmc2l6LCAibmV0bGluayBidWZmZXIgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGRlZmF1bHRzIHRvIDQwOTYpIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZmx1c2h0aW1lb3V0ID0gMTA7Cittb2R1bGVfcGFyYW0oZmx1c2h0aW1lb3V0LCB1aW50LCAwNjAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZmx1c2h0aW1lb3V0LCAiYnVmZmVyIGZsdXNoIHRpbWVvdXQgKGh1bmRyZWR0aHMgb2ZhIHNlY29uZCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZGVmYXVsdHMgdG8gMTApIik7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgcWxlbjsJCS8qIG51bWJlciBvZiBubG1zZ3MnIGluIHRoZSBza2IgKi8KKwlzdHJ1Y3Qgbmxtc2doZHIgKmxhc3RubGg7CS8qIG5ldGxpbmsgaGVhZGVyIG9mIGxhc3QgbXNnIGluIHNrYiAqLworCXN0cnVjdCBza19idWZmICpza2I7CQkvKiB0aGUgcHJlLWFsbG9jYXRlZCBza2IgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsJLyogdGhlIHRpbWVyIGZ1bmN0aW9uICovCisJc3BpbmxvY2tfdCBsb2NrOwkJLyogdGhlIHBlci1xdWV1ZSBsb2NrICovCit9IGVidF91bG9nX2J1ZmZfdDsKKworc3RhdGljIGVidF91bG9nX2J1ZmZfdCB1bG9nX2J1ZmZlcnNbRUJUX1VMT0dfTUFYTkxHUk9VUFNdOworc3RhdGljIHN0cnVjdCBzb2NrICplYnR1bG9nbmw7CisKKy8qIHNlbmQgb25lIHVsb2dfYnVmZl90IHRvIHVzZXJzcGFjZSAqLworc3RhdGljIHZvaWQgdWxvZ19zZW5kKHVuc2lnbmVkIGludCBubGdyb3VwKQoreworCWVidF91bG9nX2J1ZmZfdCAqdWIgPSAmdWxvZ19idWZmZXJzW25sZ3JvdXBdOworCisJaWYgKHRpbWVyX3BlbmRpbmcoJnViLT50aW1lcikpCisJCWRlbF90aW1lcigmdWItPnRpbWVyKTsKKworCS8qIGxhc3Qgbmxtc2cgbmVlZHMgTkxNU0dfRE9ORSAqLworCWlmICh1Yi0+cWxlbiA+IDEpCisJCXViLT5sYXN0bmxoLT5ubG1zZ190eXBlID0gTkxNU0dfRE9ORTsKKworCU5FVExJTktfQ0IodWItPnNrYikuZHN0X2dyb3VwcyA9IDEgPDwgbmxncm91cDsKKwluZXRsaW5rX2Jyb2FkY2FzdChlYnR1bG9nbmwsIHViLT5za2IsIDAsIDEgPDwgbmxncm91cCwgR0ZQX0FUT01JQyk7CisKKwl1Yi0+cWxlbiA9IDA7CisJdWItPnNrYiA9IE5VTEw7Cit9CisKKy8qIHRpbWVyIGZ1bmN0aW9uIHRvIGZsdXNoIHF1ZXVlIGluIGZsdXNodGltZW91dCB0aW1lICovCitzdGF0aWMgdm9pZCB1bG9nX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzcGluX2xvY2tfYmgoJnVsb2dfYnVmZmVyc1tkYXRhXS5sb2NrKTsKKwlpZiAodWxvZ19idWZmZXJzW2RhdGFdLnNrYikKKwkJdWxvZ19zZW5kKGRhdGEpOworCXNwaW5fdW5sb2NrX2JoKCZ1bG9nX2J1ZmZlcnNbZGF0YV0ubG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqdWxvZ19hbGxvY19za2IodW5zaWduZWQgaW50IHNpemUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXNrYiA9IGFsbG9jX3NrYihubGJ1ZnNpeiwgR0ZQX0FUT01JQyk7CisJaWYgKCFza2IpIHsKKwkJUFJJTlRSKEtFUk5fRVJSICJlYnRfdWxvZzogY2FuJ3QgYWxsb2Mgd2hvbGUgYnVmZmVyICIKKwkJICAgICAgICJvZiBzaXplICV1YiFcbiIsIG5sYnVmc2l6KTsKKwkJaWYgKHNpemUgPCBubGJ1ZnNpeikgeworCQkJLyogdHJ5IHRvIGFsbG9jYXRlIG9ubHkgYXMgbXVjaCBhcyB3ZSBuZWVkIGZvcgorCQkJICogY3VycmVudCBwYWNrZXQgKi8KKwkJCXNrYiA9IGFsbG9jX3NrYihzaXplLCBHRlBfQVRPTUlDKTsKKwkJCWlmICghc2tiKQorCQkJCVBSSU5UUihLRVJOX0VSUiAiZWJ0X3Vsb2c6IGNhbid0IGV2ZW4gYWxsb2NhdGUgIgorCQkJCSAgICAgICAiYnVmZmVyIG9mIHNpemUgJXViXG4iLCBzaXplKTsKKwkJfQorCX0KKworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyB2b2lkIGVidF91bG9nKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBob29rbnIsCisgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3sKKwllYnRfdWxvZ19wYWNrZXRfbXNnX3QgKnBtOworCXNpemVfdCBzaXplLCBjb3B5X2xlbjsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwlzdHJ1Y3QgZWJ0X3Vsb2dfaW5mbyAqdWxvZ2luZm8gPSAoc3RydWN0IGVidF91bG9nX2luZm8gKilkYXRhOworCXVuc2lnbmVkIGludCBncm91cCA9IHVsb2dpbmZvLT5ubGdyb3VwOworCWVidF91bG9nX2J1ZmZfdCAqdWIgPSAmdWxvZ19idWZmZXJzW2dyb3VwXTsKKwlzcGlubG9ja190ICpsb2NrID0gJnViLT5sb2NrOworCisJaWYgKCh1bG9naW5mby0+Y3ByYW5nZSA9PSAwKSB8fAorCSAgICAodWxvZ2luZm8tPmNwcmFuZ2UgPiBza2ItPmxlbiArIEVUSF9ITEVOKSkKKwkJY29weV9sZW4gPSBza2ItPmxlbiArIEVUSF9ITEVOOworCWVsc2UKKwkJY29weV9sZW4gPSB1bG9naW5mby0+Y3ByYW5nZTsKKworCXNpemUgPSBOTE1TR19TUEFDRShzaXplb2YoKnBtKSArIGNvcHlfbGVuKTsKKwlpZiAoc2l6ZSA+IG5sYnVmc2l6KSB7CisJCVBSSU5UUigiZWJ0X3Vsb2c6IFNpemUgJVpkIG5lZWRlZCwgYnV0IG5sYnVmc2l6PSVkXG4iLAorCQkgICAgICAgc2l6ZSwgbmxidWZzaXopOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2JoKGxvY2spOworCisJaWYgKCF1Yi0+c2tiKSB7CisJCWlmICghKHViLT5za2IgPSB1bG9nX2FsbG9jX3NrYihzaXplKSkpCisJCQlnb3RvIGFsbG9jX2ZhaWx1cmU7CisJfSBlbHNlIGlmIChzaXplID4gc2tiX3RhaWxyb29tKHViLT5za2IpKSB7CisJCXVsb2dfc2VuZChncm91cCk7CisKKwkJaWYgKCEodWItPnNrYiA9IHVsb2dfYWxsb2Nfc2tiKHNpemUpKSkKKwkJCWdvdG8gYWxsb2NfZmFpbHVyZTsKKwl9CisKKwlubGggPSBOTE1TR19QVVQodWItPnNrYiwgMCwgdWItPnFsZW4sIDAsCisJICAgICAgICAgICAgICAgIHNpemUgLSBOTE1TR19BTElHTihzaXplb2YoKm5saCkpKTsKKwl1Yi0+cWxlbisrOworCisJcG0gPSBOTE1TR19EQVRBKG5saCk7CisKKwkvKiBGaWxsIGluIHRoZSB1bG9nIGRhdGEgKi8KKwlwbS0+dmVyc2lvbiA9IEVCVF9VTE9HX1ZFUlNJT047CisJZG9fZ2V0dGltZW9mZGF5KCZwbS0+c3RhbXApOworCWlmICh1Yi0+cWxlbiA9PSAxKQorCQl1Yi0+c2tiLT5zdGFtcCA9IHBtLT5zdGFtcDsKKwlwbS0+ZGF0YV9sZW4gPSBjb3B5X2xlbjsKKwlwbS0+bWFyayA9IHNrYi0+bmZtYXJrOworCXBtLT5ob29rID0gaG9va25yOworCWlmICh1bG9naW5mby0+cHJlZml4ICE9IE5VTEwpCisJCXN0cmNweShwbS0+cHJlZml4LCB1bG9naW5mby0+cHJlZml4KTsKKwllbHNlCisJCSoocG0tPnByZWZpeCkgPSAnXDAnOworCisJaWYgKGluKSB7CisJCXN0cmNweShwbS0+cGh5c2luZGV2LCBpbi0+bmFtZSk7CisJCS8qIElmIGluIGlzbid0IGEgYnJpZGdlLCB0aGVuIHBoeXNpbmRldj09aW5kZXYgKi8KKwkJaWYgKGluLT5icl9wb3J0KQorCQkJc3RyY3B5KHBtLT5pbmRldiwgaW4tPmJyX3BvcnQtPmJyLT5kZXYtPm5hbWUpOworCQllbHNlCisJCQlzdHJjcHkocG0tPmluZGV2LCBpbi0+bmFtZSk7CisJfSBlbHNlCisJCXBtLT5pbmRldlswXSA9IHBtLT5waHlzaW5kZXZbMF0gPSAnXDAnOworCisJaWYgKG91dCkgeworCQkvKiBJZiBvdXQgZXhpc3RzLCB0aGVuIG91dCBpcyBhIGJyaWRnZSBwb3J0ICovCisJCXN0cmNweShwbS0+cGh5c291dGRldiwgb3V0LT5uYW1lKTsKKwkJc3RyY3B5KHBtLT5vdXRkZXYsIG91dC0+YnJfcG9ydC0+YnItPmRldi0+bmFtZSk7CisJfSBlbHNlCisJCXBtLT5vdXRkZXZbMF0gPSBwbS0+cGh5c291dGRldlswXSA9ICdcMCc7CisKKwlpZiAoc2tiX2NvcHlfYml0cyhza2IsIC1FVEhfSExFTiwgcG0tPmRhdGEsIGNvcHlfbGVuKSA8IDApCisJCUJVRygpOworCisJaWYgKHViLT5xbGVuID4gMSkKKwkJdWItPmxhc3RubGgtPm5sbXNnX2ZsYWdzIHw9IE5MTV9GX01VTFRJOworCisJdWItPmxhc3RubGggPSBubGg7CisKKwlpZiAodWItPnFsZW4gPj0gdWxvZ2luZm8tPnF0aHJlc2hvbGQpCisJCXVsb2dfc2VuZChncm91cCk7CisJZWxzZSBpZiAoIXRpbWVyX3BlbmRpbmcoJnViLT50aW1lcikpIHsKKwkJdWItPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgZmx1c2h0aW1lb3V0ICogSFogLyAxMDA7CisJCWFkZF90aW1lcigmdWItPnRpbWVyKTsKKwl9CisKK3VubG9jazoKKwlzcGluX3VubG9ja19iaChsb2NrKTsKKworCXJldHVybjsKKworbmxtc2dfZmFpbHVyZToKKwlwcmludGsoS0VSTl9DUklUICJlYnRfdWxvZzogZXJyb3IgZHVyaW5nIE5MTVNHX1BVVC4gVGhpcyBzaG91bGQgIgorCSAgICAgICAibm90IGhhcHBlbiwgcGxlYXNlIHJlcG9ydCB0byBhdXRob3IuXG4iKTsKKwlnb3RvIHVubG9jazsKK2FsbG9jX2ZhaWx1cmU6CisJZ290byB1bmxvY2s7Cit9CisKK3N0YXRpYyBpbnQgZWJ0X3Vsb2dfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLCB1bnNpZ25lZCBpbnQgaG9va21hc2ssCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5ICplLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3sKKwlzdHJ1Y3QgZWJ0X3Vsb2dfaW5mbyAqdWxvZ2luZm8gPSAoc3RydWN0IGVidF91bG9nX2luZm8gKilkYXRhOworCisJaWYgKGRhdGFsZW4gIT0gRUJUX0FMSUdOKHNpemVvZihzdHJ1Y3QgZWJ0X3Vsb2dfaW5mbykpIHx8CisJICAgIHVsb2dpbmZvLT5ubGdyb3VwID4gMzEpCisJCXJldHVybiAtRUlOVkFMOworCisJdWxvZ2luZm8tPnByZWZpeFtFQlRfVUxPR19QUkVGSVhfTEVOIC0gMV0gPSAnXDAnOworCisJaWYgKHVsb2dpbmZvLT5xdGhyZXNob2xkID4gRUJUX1VMT0dfTUFYX1FMRU4pCisJCXVsb2dpbmZvLT5xdGhyZXNob2xkID0gRUJUX1VMT0dfTUFYX1FMRU47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBlYnRfd2F0Y2hlciB1bG9nID0geworCS5uYW1lCQk9IEVCVF9VTE9HX1dBVENIRVIsCisJLndhdGNoZXIJPSBlYnRfdWxvZywKKwkuY2hlY2sJCT0gZWJ0X3Vsb2dfY2hlY2ssCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWludCBpLCByZXQgPSAwOworCisJaWYgKG5sYnVmc2l6ID49IDEyOCoxMDI0KSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiZWJ0X3Vsb2c6IE5ldGxpbmsgYnVmZmVyIGhhcyB0byBiZSA8PSAxMjhrQiwiCisJCSAgICAgICAiIHBsZWFzZSB0cnkgYSBzbWFsbGVyIG5sYnVmc2l6IHBhcmFtZXRlci5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBpbml0aWFsaXplIHVsb2dfYnVmZmVycyAqLworCWZvciAoaSA9IDA7IGkgPCBFQlRfVUxPR19NQVhOTEdST1VQUzsgaSsrKSB7CisJCWluaXRfdGltZXIoJnVsb2dfYnVmZmVyc1tpXS50aW1lcik7CisJCXVsb2dfYnVmZmVyc1tpXS50aW1lci5mdW5jdGlvbiA9IHVsb2dfdGltZXI7CisJCXVsb2dfYnVmZmVyc1tpXS50aW1lci5kYXRhID0gaTsKKwkJc3Bpbl9sb2NrX2luaXQoJnVsb2dfYnVmZmVyc1tpXS5sb2NrKTsKKwl9CisKKwllYnR1bG9nbmwgPSBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoTkVUTElOS19ORkxPRywgTlVMTCk7CisJaWYgKCFlYnR1bG9nbmwpCisJCXJldCA9IC1FTk9NRU07CisJZWxzZSBpZiAoKHJldCA9IGVidF9yZWdpc3Rlcl93YXRjaGVyKCZ1bG9nKSkpCisJCXNvY2tfcmVsZWFzZShlYnR1bG9nbmwtPnNrX3NvY2tldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCWVidF91bG9nX2J1ZmZfdCAqdWI7CisJaW50IGk7CisKKwllYnRfdW5yZWdpc3Rlcl93YXRjaGVyKCZ1bG9nKTsKKwlmb3IgKGkgPSAwOyBpIDwgRUJUX1VMT0dfTUFYTkxHUk9VUFM7IGkrKykgeworCQl1YiA9ICZ1bG9nX2J1ZmZlcnNbaV07CisJCWlmICh0aW1lcl9wZW5kaW5nKCZ1Yi0+dGltZXIpKQorCQkJZGVsX3RpbWVyKCZ1Yi0+dGltZXIpOworCQlzcGluX2xvY2tfYmgoJnViLT5sb2NrKTsKKwkJaWYgKHViLT5za2IpIHsKKwkJCWtmcmVlX3NrYih1Yi0+c2tiKTsKKwkJCXViLT5za2IgPSBOVUxMOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZ1Yi0+bG9jayk7CisJfQorCXNvY2tfcmVsZWFzZShlYnR1bG9nbmwtPnNrX3NvY2tldCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJCYXJ0IERlIFNjaHV5bWVyIDxiZHNjaHV5bUBwYW5kb3JhLmJlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJlYnRhYmxlcyB1c2Vyc3BhY2UgbG9nZ2luZyBtb2R1bGUgZm9yIGJyaWRnZWQgRXRoZXJuZXQiCisgICAgICAgICAgICAgICAgICAgIiBmcmFtZXMiKTsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF92bGFuLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfdmxhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNjBkNzMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfdmxhbi5jCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogRGVzY3JpcHRpb246IEVCVGFibGVzIDgwMi4xUSBtYXRjaCBleHRlbnNpb24ga2VybmVsc3BhY2UgbW9kdWxlLgorICogQXV0aG9yczogTmljayBGZWRjaGlrIDxuaWNrQGZlZGNoaWsub3JnLnVhPgorICogICAgICAgICAgQmFydCBEZSBTY2h1eW1lciA8YmRzY2h1eW1AcGFuZG9yYS5iZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3ZsYW4uaD4KKworc3RhdGljIGludCBkZWJ1ZzsKKyNkZWZpbmUgTU9EVUxFX1ZFUlMgIjAuNiIKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImRlYnVnPTEgaXMgdHVybiBvbiBkZWJ1ZyBtZXNzYWdlcyIpOworTU9EVUxFX0FVVEhPUigiTmljayBGZWRjaGlrIDxuaWNrQGZlZGNoaWsub3JnLnVhPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCI4MDIuMVEgbWF0Y2ggbW9kdWxlIChlYnRhYmxlcyBleHRlbnNpb24pLCB2IgorCQkgICBNT0RVTEVfVkVSUyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworI2RlZmluZSBERUJVR19NU0coYXJncy4uLikgaWYgKGRlYnVnKSBwcmludGsgKEtFUk5fREVCVUcgImVidF92bGFuOiAiIGFyZ3MpCisjZGVmaW5lIElOVl9GTEFHKF9pbnZfZmxhZ18pIChpbmZvLT5pbnZmbGFncyAmIF9pbnZfZmxhZ18pID8gIiEiIDogIiIKKyNkZWZpbmUgR0VUX0JJVE1BU0soX0JJVF9NQVNLXykgaW5mby0+Yml0bWFzayAmIF9CSVRfTUFTS18KKyNkZWZpbmUgU0VUX0JJVE1BU0soX0JJVF9NQVNLXykgaW5mby0+Yml0bWFzayB8PSBfQklUX01BU0tfCisjZGVmaW5lIEVYSVRfT05fTUlTTUFUQ0goX01BVENIXyxfTUFTS18pIHtpZiAoISgoaW5mby0+X01BVENIXyA9PSBfTUFUQ0hfKV4hIShpbmZvLT5pbnZmbGFncyAmIF9NQVNLXykpKSByZXR1cm4gRUJUX05PTUFUQ0g7fQorCitzdGF0aWMgaW50CitlYnRfZmlsdGVyX3ZsYW4oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQljb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3sKKwlzdHJ1Y3QgZWJ0X3ZsYW5faW5mbyAqaW5mbyA9IChzdHJ1Y3QgZWJ0X3ZsYW5faW5mbyAqKSBkYXRhOworCXN0cnVjdCB2bGFuX2hkciBfZnJhbWUsICpmcDsKKworCXVuc2lnbmVkIHNob3J0IFRDSTsJLyogV2hvbGUgVENJLCBnaXZlbiBmcm9tIHBhcnNlZCBmcmFtZSAqLworCXVuc2lnbmVkIHNob3J0IGlkOwkvKiBWTEFOIElELCBnaXZlbiBmcm9tIGZyYW1lIFRDSSAqLworCXVuc2lnbmVkIGNoYXIgcHJpbzsJLyogdXNlcl9wcmlvcml0eSwgZ2l2ZW4gZnJvbSBmcmFtZSBUQ0kgKi8KKwkvKiBWTEFOIGVuY2Fwc3VsYXRlZCBUeXBlL0xlbmd0aCBmaWVsZCwgZ2l2ZW4gZnJvbSBvcmlnIGZyYW1lICovCisJdW5zaWduZWQgc2hvcnQgZW5jYXA7CisKKwlmcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIDAsIHNpemVvZihfZnJhbWUpLCAmX2ZyYW1lKTsKKwlpZiAoZnAgPT0gTlVMTCkKKwkJcmV0dXJuIEVCVF9OT01BVENIOworCisJLyogVGFnIENvbnRyb2wgSW5mb3JtYXRpb24gKFRDSSkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBlbGVtZW50czoKKwkgKiAtIFVzZXJfcHJpb3JpdHkuIFRoZSB1c2VyX3ByaW9yaXR5IGZpZWxkIGlzIHRocmVlIGJpdHMgaW4gbGVuZ3RoLAorCSAqIGludGVycHJldGVkIGFzIGEgYmluYXJ5IG51bWJlci4KKwkgKiAtIENhbm9uaWNhbCBGb3JtYXQgSW5kaWNhdG9yIChDRkkpLiBUaGUgQ2Fub25pY2FsIEZvcm1hdCBJbmRpY2F0b3IKKwkgKiAoQ0ZJKSBpcyBhIHNpbmdsZSBiaXQgZmxhZyB2YWx1ZS4gQ3VycmVudGx5IGlnbm9yZWQuCisJICogLSBWTEFOIElkZW50aWZpZXIgKFZJRCkuIFRoZSBWSUQgaXMgZW5jb2RlZCBhcworCSAqIGFuIHVuc2lnbmVkIGJpbmFyeSBudW1iZXIuICovCisJVENJID0gbnRvaHMoZnAtPmhfdmxhbl9UQ0kpOworCWlkID0gVENJICYgVkxBTl9WSURfTUFTSzsKKwlwcmlvID0gKFRDSSA+PiAxMykgJiAweDc7CisJZW5jYXAgPSBmcC0+aF92bGFuX2VuY2Fwc3VsYXRlZF9wcm90bzsKKworCS8qIENoZWNraW5nIFZMQU4gSWRlbnRpZmllciAoVklEKSAqLworCWlmIChHRVRfQklUTUFTSyhFQlRfVkxBTl9JRCkpCisJCUVYSVRfT05fTUlTTUFUQ0goaWQsIEVCVF9WTEFOX0lEKTsKKworCS8qIENoZWNraW5nIHVzZXJfcHJpb3JpdHkgKi8KKwlpZiAoR0VUX0JJVE1BU0soRUJUX1ZMQU5fUFJJTykpCisJCUVYSVRfT05fTUlTTUFUQ0gocHJpbywgRUJUX1ZMQU5fUFJJTyk7CisKKwkvKiBDaGVja2luZyBFbmNhcHN1bGF0ZWQgUHJvdG8gKExlbmd0aC9UeXBlKSBmaWVsZCAqLworCWlmIChHRVRfQklUTUFTSyhFQlRfVkxBTl9FTkNBUCkpCisJCUVYSVRfT05fTUlTTUFUQ0goZW5jYXAsIEVCVF9WTEFOX0VOQ0FQKTsKKworCXJldHVybiBFQlRfTUFUQ0g7Cit9CisKK3N0YXRpYyBpbnQKK2VidF9jaGVja192bGFuKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkgICAgICAgdW5zaWduZWQgaW50IGhvb2tuciwKKwkgICAgICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeSAqZSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFsZW4pCit7CisJc3RydWN0IGVidF92bGFuX2luZm8gKmluZm8gPSAoc3RydWN0IGVidF92bGFuX2luZm8gKikgZGF0YTsKKworCS8qIFBhcmFtZXRlcnMgYnVmZmVyIG92ZXJmbG93IGNoZWNrICovCisJaWYgKGRhdGFsZW4gIT0gRUJUX0FMSUdOKHNpemVvZihzdHJ1Y3QgZWJ0X3ZsYW5faW5mbykpKSB7CisJCURFQlVHX01TRworCQkgICAgKCJwYXNzZWQgc2l6ZSAlZCBpcyBub3QgZXEgdG8gZWJ0X3ZsYW5faW5mbyAoJVpkKVxuIiwKKwkJICAgICBkYXRhbGVuLCBzaXplb2Yoc3RydWN0IGVidF92bGFuX2luZm8pKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogSXMgaXQgODAyLjFRIGZyYW1lIGNoZWNrZWQ/ICovCisJaWYgKGUtPmV0aHByb3RvICE9IGh0b25zKEVUSF9QXzgwMjFRKSkgeworCQlERUJVR19NU0cKKwkJICAgICgicGFzc2VkIGVudHJ5IHByb3RvICUyLjRYIGlzIG5vdCA4MDIuMVEgKDgxMDApXG4iLAorCQkgICAgICh1bnNpZ25lZCBzaG9ydCkgbnRvaHMoZS0+ZXRocHJvdG8pKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2hlY2sgZm9yIGJpdG1hc2sgcmFuZ2UKKwkgKiBUcnVlIGlmIGV2ZW4gb25lIGJpdCBpcyBvdXQgb2YgbWFzayAqLworCWlmIChpbmZvLT5iaXRtYXNrICYgfkVCVF9WTEFOX01BU0spIHsKKwkJREVCVUdfTVNHKCJiaXRtYXNrICUyWCBpcyBvdXQgb2YgbWFzayAoJTJYKVxuIiwKKwkJCSAgaW5mby0+Yml0bWFzaywgRUJUX1ZMQU5fTUFTSyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENoZWNrIGZvciBpbnZlcnNpb24gZmxhZ3MgcmFuZ2UgKi8KKwlpZiAoaW5mby0+aW52ZmxhZ3MgJiB+RUJUX1ZMQU5fTUFTSykgeworCQlERUJVR19NU0coImludmVyc2lvbiBmbGFncyAlMlggaXMgb3V0IG9mIG1hc2sgKCUyWClcbiIsCisJCQkgIGluZm8tPmludmZsYWdzLCBFQlRfVkxBTl9NQVNLKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogUmVzZXJ2ZWQgVkxBTiBJRCAoVklEKSB2YWx1ZXMKKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIDAgLSBUaGUgbnVsbCBWTEFOIElELiAKKwkgKiAxIC0gVGhlIGRlZmF1bHQgUG9ydCBWSUQgKFBWSUQpCisJICogMHgwRkZGIC0gUmVzZXJ2ZWQgZm9yIGltcGxlbWVudGF0aW9uIHVzZS4gCisJICogaWZfdmxhbi5oOiBWTEFOX0dST1VQX0FSUkFZX0xFTiA0MDk2LiAqLworCWlmIChHRVRfQklUTUFTSyhFQlRfVkxBTl9JRCkpIHsKKwkJaWYgKCEhaW5mby0+aWQpIHsgLyogaWYgaWQhPTAgPT4gY2hlY2sgdmlkIHJhbmdlICovCisJCQlpZiAoaW5mby0+aWQgPiBWTEFOX0dST1VQX0FSUkFZX0xFTikgeworCQkJCURFQlVHX01TRworCQkJCSAgICAoImlkICVkIGlzIG91dCBvZiByYW5nZSAoMS00MDk2KVxuIiwKKwkJCQkgICAgIGluZm8tPmlkKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCS8qIE5vdGU6IFRoaXMgaXMgdmFsaWQgVkxBTi10YWdnZWQgZnJhbWUgcG9pbnQuCisJCQkgKiBBbnkgdmFsdWUgb2YgdXNlcl9wcmlvcml0eSBhcmUgYWNjZXB0YWJsZSwgCisJCQkgKiBidXQgc2hvdWxkIGJlIGlnbm9yZWQgYWNjb3JkaW5nIHRvIDgwMi4xUSBTdGQuCisJCQkgKiBTbyB3ZSBqdXN0IGRyb3AgdGhlIHByaW8gZmxhZy4gKi8KKwkJCWluZm8tPmJpdG1hc2sgJj0gfkVCVF9WTEFOX1BSSU87CisJCX0KKwkJLyogRWxzZSwgaWQ9MCAobnVsbCBWTEFOIElEKSAgPT4gdXNlcl9wcmlvcml0eSByYW5nZSAoYW55PykgKi8KKwl9CisKKwlpZiAoR0VUX0JJVE1BU0soRUJUX1ZMQU5fUFJJTykpIHsKKwkJaWYgKCh1bnNpZ25lZCBjaGFyKSBpbmZvLT5wcmlvID4gNykgeworCQkJREVCVUdfTVNHKCJwcmlvICVkIGlzIG91dCBvZiByYW5nZSAoMC03KVxuIiwKKwkJCSAgICAgaW5mby0+cHJpbyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwkvKiBDaGVjayBmb3IgZW5jYXBzdWxhdGVkIHByb3RvIHJhbmdlIC0gaXQgaXMgcG9zc2libGUgdG8gYmUKKwkgKiBhbnkgdmFsdWUgZm9yIHVfc2hvcnQgcmFuZ2UuCisJICogaWZfZXRoZXIuaDogIEVUSF9aTEVOICAgICAgICA2MCAgIC0gIE1pbi4gb2N0ZXRzIGluIGZyYW1lIHNhbnMgRkNTICovCisJaWYgKEdFVF9CSVRNQVNLKEVCVF9WTEFOX0VOQ0FQKSkgeworCQlpZiAoKHVuc2lnbmVkIHNob3J0KSBudG9ocyhpbmZvLT5lbmNhcCkgPCBFVEhfWkxFTikgeworCQkJREVCVUdfTVNHCisJCQkgICAgKCJlbmNhcCBmcmFtZSBsZW5ndGggJWQgaXMgbGVzcyB0aGFuIG1pbmltYWxcbiIsCisJCQkgICAgIG50b2hzKGluZm8tPmVuY2FwKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGVidF9tYXRjaCBmaWx0ZXJfdmxhbiA9IHsKKwkubmFtZQkJPSBFQlRfVkxBTl9NQVRDSCwKKwkubWF0Y2gJCT0gZWJ0X2ZpbHRlcl92bGFuLAorCS5jaGVjawkJPSBlYnRfY2hlY2tfdmxhbiwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJREVCVUdfTVNHKCJlYnRhYmxlcyA4MDIuMVEgZXh0ZW5zaW9uIG1vZHVsZSB2IgorCQkgIE1PRFVMRV9WRVJTICJcbiIpOworCURFQlVHX01TRygibW9kdWxlIGRlYnVnPSVkXG4iLCAhIWRlYnVnKTsKKwlyZXR1cm4gZWJ0X3JlZ2lzdGVyX21hdGNoKCZmaWx0ZXJfdmxhbik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJZWJ0X3VucmVnaXN0ZXJfbWF0Y2goJmZpbHRlcl92bGFuKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVfYnJvdXRlLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlX2Jyb3V0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NjdjOTQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlX2Jyb3V0ZS5jCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiAgZWJ0YWJsZV9icm91dGUKKyAqCisgKglBdXRob3JzOgorICoJQmFydCBEZSBTY2h1eW1lciA8YmRzY2h1eW1AcGFuZG9yYS5iZT4KKyAqCisgKiAgQXByaWwsIDIwMDIKKyAqCisgKiAgVGhpcyB0YWJsZSBsZXRzIHlvdSBjaG9vc2UgYmV0d2VlbiByb3V0aW5nIGFuZCBicmlkZ2luZyBmb3IgZnJhbWVzCisgKiAgZW50ZXJpbmcgb24gYSBicmlkZ2UgZW5zbGF2ZWQgbmljLiBUaGlzIHRhYmxlIGlzIHRyYXZlcnNlZCBiZWZvcmUgYW55CisgKiAgb3RoZXIgZWJ0YWJsZXMgdGFibGUuIFNlZSBuZXQvYnJpZGdlL2JyX2lucHV0LmMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9icmlkZ2UuaD4KKworLyogRUJUX0FDQ0VQVCBtZWFucyB0aGUgZnJhbWUgd2lsbCBiZSBicmlkZ2VkCisgKiBFQlRfRFJPUCBtZWFucyB0aGUgZnJhbWUgd2lsbCBiZSByb3V0ZWQKKyAqLworc3RhdGljIHN0cnVjdCBlYnRfZW50cmllcyBpbml0aWFsX2NoYWluID0geworCS5uYW1lCQk9ICJCUk9VVElORyIsCisJLnBvbGljeQkJPSBFQlRfQUNDRVBULAorfTsKKworc3RhdGljIHN0cnVjdCBlYnRfcmVwbGFjZSBpbml0aWFsX3RhYmxlID0KK3sKKwkubmFtZQkJPSAiYnJvdXRlIiwKKwkudmFsaWRfaG9va3MJPSAxIDw8IE5GX0JSX0JST1VUSU5HLAorCS5lbnRyaWVzX3NpemUJPSBzaXplb2Yoc3RydWN0IGVidF9lbnRyaWVzKSwKKwkuaG9va19lbnRyeQk9IHsKKwkJW05GX0JSX0JST1VUSU5HXQk9ICZpbml0aWFsX2NoYWluLAorCX0sCisJLmVudHJpZXMJPSAoY2hhciAqKSZpbml0aWFsX2NoYWluLAorfTsKKworc3RhdGljIGludCBjaGVjayhjb25zdCBzdHJ1Y3QgZWJ0X3RhYmxlX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCB2YWxpZF9ob29rcykKK3sKKwlpZiAodmFsaWRfaG9va3MgJiB+KDEgPDwgTkZfQlJfQlJPVVRJTkcpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBlYnRfdGFibGUgYnJvdXRlX3RhYmxlID0KK3sKKwkubmFtZQkJPSAiYnJvdXRlIiwKKwkudGFibGUJCT0gJmluaXRpYWxfdGFibGUsCisJLnZhbGlkX2hvb2tzCT0gMSA8PCBORl9CUl9CUk9VVElORywKKwkubG9jawkJPSBSV19MT0NLX1VOTE9DS0VELAorCS5jaGVjawkJPSBjaGVjaywKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IGVidF9icm91dGUoc3RydWN0IHNrX2J1ZmYgKipwc2tiKQoreworCWludCByZXQ7CisKKwlyZXQgPSBlYnRfZG9fdGFibGUoTkZfQlJfQlJPVVRJTkcsIHBza2IsICgqcHNrYiktPmRldiwgTlVMTCwKKwkgICAmYnJvdXRlX3RhYmxlKTsKKwlpZiAocmV0ID09IE5GX0RST1ApCisJCXJldHVybiAxOyAvKiByb3V0ZSBpdCAqLworCXJldHVybiAwOyAvKiBicmlkZ2UgaXQgKi8KK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBlYnRfcmVnaXN0ZXJfdGFibGUoJmJyb3V0ZV90YWJsZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJLyogc2VlIGJyX2lucHV0LmMgKi8KKwlicl9zaG91bGRfcm91dGVfaG9vayA9IGVidF9icm91dGU7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlicl9zaG91bGRfcm91dGVfaG9vayA9IE5VTEw7CisJc3luY2hyb25pemVfbmV0KCk7CisJZWJ0X3VucmVnaXN0ZXJfdGFibGUoJmJyb3V0ZV90YWJsZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlX2ZpbHRlci5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZV9maWx0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTg2NjZlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZV9maWx0ZXIuYwpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqICBlYnRhYmxlX2ZpbHRlcgorICoKKyAqCUF1dGhvcnM6CisgKglCYXJ0IERlIFNjaHV5bWVyIDxiZHNjaHV5bUBwYW5kb3JhLmJlPgorICoKKyAqICBBcHJpbCwgMjAwMgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjZGVmaW5lIEZJTFRFUl9WQUxJRF9IT09LUyAoKDEgPDwgTkZfQlJfTE9DQUxfSU4pIHwgKDEgPDwgTkZfQlJfRk9SV0FSRCkgfCBcCisgICAoMSA8PCBORl9CUl9MT0NBTF9PVVQpKQorCitzdGF0aWMgc3RydWN0IGVidF9lbnRyaWVzIGluaXRpYWxfY2hhaW5zW10gPQoreworCXsKKwkJLm5hbWUJPSAiSU5QVVQiLAorCQkucG9saWN5CT0gRUJUX0FDQ0VQVCwKKwl9LAorCXsKKwkJLm5hbWUJPSAiRk9SV0FSRCIsCisJCS5wb2xpY3kJPSBFQlRfQUNDRVBULAorCX0sCisJeworCQkubmFtZQk9ICJPVVRQVVQiLAorCQkucG9saWN5CT0gRUJUX0FDQ0VQVCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBlYnRfcmVwbGFjZSBpbml0aWFsX3RhYmxlID0KK3sKKwkubmFtZQkJPSAiZmlsdGVyIiwKKwkudmFsaWRfaG9va3MJPSBGSUxURVJfVkFMSURfSE9PS1MsCisJLmVudHJpZXNfc2l6ZQk9IDMgKiBzaXplb2Yoc3RydWN0IGVidF9lbnRyaWVzKSwKKwkuaG9va19lbnRyeQk9IHsKKwkJW05GX0JSX0xPQ0FMX0lOXQk9ICZpbml0aWFsX2NoYWluc1swXSwKKwkJW05GX0JSX0ZPUldBUkRdCQk9ICZpbml0aWFsX2NoYWluc1sxXSwKKwkJW05GX0JSX0xPQ0FMX09VVF0JPSAmaW5pdGlhbF9jaGFpbnNbMl0sCisJfSwKKwkuZW50cmllcwk9IChjaGFyICopaW5pdGlhbF9jaGFpbnMsCit9OworCitzdGF0aWMgaW50IGNoZWNrKGNvbnN0IHN0cnVjdCBlYnRfdGFibGVfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzKQoreworCWlmICh2YWxpZF9ob29rcyAmIH5GSUxURVJfVkFMSURfSE9PS1MpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGVidF90YWJsZSBmcmFtZV9maWx0ZXIgPQoreyAKKwkubmFtZQkJPSAiZmlsdGVyIiwKKwkudGFibGUJCT0gJmluaXRpYWxfdGFibGUsCisJLnZhbGlkX2hvb2tzCT0gRklMVEVSX1ZBTElEX0hPT0tTLCAKKwkubG9jawkJPSBSV19MT0NLX1VOTE9DS0VELAorCS5jaGVjawkJPSBjaGVjaywKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50CitlYnRfaG9vayAodW5zaWduZWQgaW50IGhvb2ssIHN0cnVjdCBza19idWZmICoqcHNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCit7CisJcmV0dXJuIGVidF9kb190YWJsZShob29rLCBwc2tiLCBpbiwgb3V0LCAmZnJhbWVfZmlsdGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBuZl9ob29rX29wcyBlYnRfb3BzX2ZpbHRlcltdID0geworCXsKKwkJLmhvb2sJCT0gZWJ0X2hvb2ssCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkJLnBmCQk9IFBGX0JSSURHRSwKKwkJLmhvb2tudW0JPSBORl9CUl9MT0NBTF9JTiwKKwkJLnByaW9yaXR5CT0gTkZfQlJfUFJJX0ZJTFRFUl9CUklER0VELAorCX0sCisJeworCQkuaG9vawkJPSBlYnRfaG9vaywKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkucGYJCT0gUEZfQlJJREdFLAorCQkuaG9va251bQk9IE5GX0JSX0ZPUldBUkQsCisJCS5wcmlvcml0eQk9IE5GX0JSX1BSSV9GSUxURVJfQlJJREdFRCwKKwl9LAorCXsKKwkJLmhvb2sJCT0gZWJ0X2hvb2ssCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkJLnBmCQk9IFBGX0JSSURHRSwKKwkJLmhvb2tudW0JPSBORl9CUl9MT0NBTF9PVVQsCisJCS5wcmlvcml0eQk9IE5GX0JSX1BSSV9GSUxURVJfT1RIRVIsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgaSwgaiwgcmV0OworCisJcmV0ID0gZWJ0X3JlZ2lzdGVyX3RhYmxlKCZmcmFtZV9maWx0ZXIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGVidF9vcHNfZmlsdGVyKTsgaSsrKQorCQlpZiAoKHJldCA9IG5mX3JlZ2lzdGVyX2hvb2soJmVidF9vcHNfZmlsdGVyW2ldKSkgPCAwKQorCQkJZ290byBjbGVhbnVwOworCXJldHVybiByZXQ7CitjbGVhbnVwOgorCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCisJCW5mX3VucmVnaXN0ZXJfaG9vaygmZWJ0X29wc19maWx0ZXJbal0pOworCWVidF91bnJlZ2lzdGVyX3RhYmxlKCZmcmFtZV9maWx0ZXIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlYnRfb3BzX2ZpbHRlcik7IGkrKykKKwkJbmZfdW5yZWdpc3Rlcl9ob29rKCZlYnRfb3BzX2ZpbHRlcltpXSk7CisJZWJ0X3VucmVnaXN0ZXJfdGFibGUoJmZyYW1lX2ZpbHRlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlX25hdC5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZV9uYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjhjYWMyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZV9uYXQuYwpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqICBlYnRhYmxlX25hdAorICoKKyAqCUF1dGhvcnM6CisgKglCYXJ0IERlIFNjaHV5bWVyIDxiZHNjaHV5bUBwYW5kb3JhLmJlPgorICoKKyAqICBBcHJpbCwgMjAwMgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjZGVmaW5lIE5BVF9WQUxJRF9IT09LUyAoKDEgPDwgTkZfQlJfUFJFX1JPVVRJTkcpIHwgKDEgPDwgTkZfQlJfTE9DQUxfT1VUKSB8IFwKKyAgICgxIDw8IE5GX0JSX1BPU1RfUk9VVElORykpCisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X2VudHJpZXMgaW5pdGlhbF9jaGFpbnNbXSA9Cit7CisJeworCQkubmFtZQk9ICJQUkVST1VUSU5HIiwKKwkJLnBvbGljeQk9IEVCVF9BQ0NFUFQsCisJfSwKKwl7CisJCS5uYW1lCT0gIk9VVFBVVCIsCisJCS5wb2xpY3kJPSBFQlRfQUNDRVBULAorCX0sCisJeworCQkubmFtZQk9ICJQT1NUUk9VVElORyIsCisJCS5wb2xpY3kJPSBFQlRfQUNDRVBULAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X3JlcGxhY2UgaW5pdGlhbF90YWJsZSA9Cit7CisJLm5hbWUJCT0gIm5hdCIsCisJLnZhbGlkX2hvb2tzCT0gTkFUX1ZBTElEX0hPT0tTLAorCS5lbnRyaWVzX3NpemUJPSAzICogc2l6ZW9mKHN0cnVjdCBlYnRfZW50cmllcyksCisJLmhvb2tfZW50cnkJPSB7CisJCVtORl9CUl9QUkVfUk9VVElOR10JPSAmaW5pdGlhbF9jaGFpbnNbMF0sCisJCVtORl9CUl9MT0NBTF9PVVRdCT0gJmluaXRpYWxfY2hhaW5zWzFdLAorCQlbTkZfQlJfUE9TVF9ST1VUSU5HXQk9ICZpbml0aWFsX2NoYWluc1syXSwKKwl9LAorCS5lbnRyaWVzCT0gKGNoYXIgKilpbml0aWFsX2NoYWlucywKK307CisKK3N0YXRpYyBpbnQgY2hlY2soY29uc3Qgc3RydWN0IGVidF90YWJsZV9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgdmFsaWRfaG9va3MpCit7CisJaWYgKHZhbGlkX2hvb2tzICYgfk5BVF9WQUxJRF9IT09LUykKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X3RhYmxlIGZyYW1lX25hdCA9Cit7CisJLm5hbWUJCT0gIm5hdCIsCisJLnRhYmxlCQk9ICZpbml0aWFsX3RhYmxlLAorCS52YWxpZF9ob29rcwk9IE5BVF9WQUxJRF9IT09LUywKKwkubG9jawkJPSBSV19MT0NLX1VOTE9DS0VELAorCS5jaGVjawkJPSBjaGVjaywKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50CitlYnRfbmF0X2RzdCh1bnNpZ25lZCBpbnQgaG9vaywgc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4KKyAgICwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCit7CisJcmV0dXJuIGVidF9kb190YWJsZShob29rLCBwc2tiLCBpbiwgb3V0LCAmZnJhbWVfbmF0KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorZWJ0X25hdF9zcmModW5zaWduZWQgaW50IGhvb2ssIHN0cnVjdCBza19idWZmICoqcHNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluCisgICAsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQoreworCXJldHVybiBlYnRfZG9fdGFibGUoaG9vaywgcHNrYiwgaW4sIG91dCwgJmZyYW1lX25hdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZfaG9va19vcHMgZWJ0X29wc19uYXRbXSA9IHsKKwl7CisJCS5ob29rCQk9IGVidF9uYXRfZHN0LAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5wZgkJPSBQRl9CUklER0UsCisJCS5ob29rbnVtCT0gTkZfQlJfTE9DQUxfT1VULAorCQkucHJpb3JpdHkJPSBORl9CUl9QUklfTkFUX0RTVF9PVEhFUiwKKwl9LAorCXsKKwkJLmhvb2sJCT0gZWJ0X25hdF9zcmMsCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkJLnBmCQk9IFBGX0JSSURHRSwKKwkJLmhvb2tudW0JPSBORl9CUl9QT1NUX1JPVVRJTkcsCisJCS5wcmlvcml0eQk9IE5GX0JSX1BSSV9OQVRfU1JDLAorCX0sCisJeworCQkuaG9vawkJPSBlYnRfbmF0X2RzdCwKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkucGYJCT0gUEZfQlJJREdFLAorCQkuaG9va251bQk9IE5GX0JSX1BSRV9ST1VUSU5HLAorCQkucHJpb3JpdHkJPSBORl9CUl9QUklfTkFUX0RTVF9CUklER0VELAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaW50IGksIHJldCwgajsKKworCXJldCA9IGVidF9yZWdpc3Rlcl90YWJsZSgmZnJhbWVfbmF0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlYnRfb3BzX25hdCk7IGkrKykKKwkJaWYgKChyZXQgPSBuZl9yZWdpc3Rlcl9ob29rKCZlYnRfb3BzX25hdFtpXSkpIDwgMCkKKwkJCWdvdG8gY2xlYW51cDsKKwlyZXR1cm4gcmV0OworY2xlYW51cDoKKwlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorCQluZl91bnJlZ2lzdGVyX2hvb2soJmVidF9vcHNfbmF0W2pdKTsKKwllYnRfdW5yZWdpc3Rlcl90YWJsZSgmZnJhbWVfbmF0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZWJ0X29wc19uYXQpOyBpKyspCisJCW5mX3VucmVnaXN0ZXJfaG9vaygmZWJ0X29wc19uYXRbaV0pOworCWVidF91bnJlZ2lzdGVyX3RhYmxlKCZmcmFtZV9uYXQpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZXMuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlYmM2NgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVzLmMKQEAgLTAsMCArMSwxNTA3IEBACisvKgorICogIGVidGFibGVzCisgKgorICogIEF1dGhvcjoKKyAqICBCYXJ0IERlIFNjaHV5bWVyCQk8YmRzY2h1eW1AcGFuZG9yYS5iZT4KKyAqCisgKiAgZWJ0YWJsZXMuYyx2IDIuMCwgSnVseSwgMjAwMgorICoKKyAqICBUaGlzIGNvZGUgaXMgc3RvbmdseSBpbnNwaXJlZCBvbiB0aGUgaXB0YWJsZXMgY29kZSB3aGljaCBpcworICogIENvcHlyaWdodCAoQykgMTk5OSBQYXVsIGBSdXN0eScgUnVzc2VsbCAmIE1pY2hhZWwgSi4gTmV1bGluZworICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKy8qIHVzZWQgZm9yIHByaW50X3N0cmluZyAqLworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKy8qIG5lZWRlZCBmb3IgbG9naWNhbCBbaW4sb3V0XS1kZXYgZmlsdGVyaW5nICovCisjaW5jbHVkZSAiLi4vYnJfcHJpdmF0ZS5oIgorCisvKiBsaXN0X25hbWVkX2ZpbmQgKi8KKyNkZWZpbmUgQVNTRVJUX1JFQURfTE9DSyh4KQorI2RlZmluZSBBU1NFUlRfV1JJVEVfTE9DSyh4KQorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2xpc3RoZWxwLmg+CisKKyNpZiAwCisvKiB1c2UgdGhpcyBmb3IgcmVtb3RlIGRlYnVnZ2luZworICogQ29weXJpZ2h0IChDKSAxOTk4IGJ5IE9yaSBQb21lcmFudHoKKyAqIFByaW50IHRoZSBzdHJpbmcgdG8gdGhlIGFwcHJvcHJpYXRlIHR0eSwgdGhlIG9uZQorICogdGhlIGN1cnJlbnQgdGFzayB1c2VzCisgKi8KK3N0YXRpYyB2b2lkIHByaW50X3N0cmluZyhjaGFyICpzdHIpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKm15X3R0eTsKKworCS8qIFRoZSB0dHkgZm9yIHRoZSBjdXJyZW50IHRhc2sgKi8KKwlteV90dHkgPSBjdXJyZW50LT5zaWduYWwtPnR0eTsKKwlpZiAobXlfdHR5ICE9IE5VTEwpIHsKKwkJbXlfdHR5LT5kcml2ZXItPndyaXRlKG15X3R0eSwgMCwgc3RyLCBzdHJsZW4oc3RyKSk7CisJCW15X3R0eS0+ZHJpdmVyLT53cml0ZShteV90dHksIDAsICJcMDE1XDAxMiIsIDIpOworCX0KK30KKworI2RlZmluZSBCVUdQUklOVChhcmdzKSBwcmludF9zdHJpbmcoYXJncyk7CisjZWxzZQorI2RlZmluZSBCVUdQUklOVChmb3JtYXQsIGFyZ3MuLi4pIHByaW50aygia2VybmVsIG1zZzogZWJ0YWJsZXMgYnVnOiBwbGVhc2UgIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcG9ydCB0byBhdXRob3I6ICJmb3JtYXQsICMjIGFyZ3MpCisvKiAjZGVmaW5lIEJVR1BSSU5UKGZvcm1hdCwgYXJncy4uLikgKi8KKyNlbmRpZgorI2RlZmluZSBNRU1QUklOVChmb3JtYXQsIGFyZ3MuLi4pIHByaW50aygia2VybmVsIG1zZzogZWJ0YWJsZXMgIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogb3V0IG9mIG1lbW9yeTogImZvcm1hdCwgIyMgYXJncykKKy8qICNkZWZpbmUgTUVNUFJJTlQoZm9ybWF0LCBhcmdzLi4uKSAqLworCisKKworLyoKKyAqIEVhY2ggY3B1IGhhcyBpdHMgb3duIHNldCBvZiBjb3VudGVycywgc28gdGhlcmUgaXMgbm8gbmVlZCBmb3Igd3JpdGVfbG9jayBpbgorICogdGhlIHNvZnRpcnEKKyAqIEZvciByZWFkaW5nIG9yIHVwZGF0aW5nIHRoZSBjb3VudGVycywgdGhlIHVzZXIgY29udGV4dCBuZWVkcyB0bworICogZ2V0IGEgd3JpdGVfbG9jaworICovCisKKy8qIFRoZSBzaXplIG9mIGVhY2ggc2V0IG9mIGNvdW50ZXJzIGlzIGFsdGVyZWQgdG8gZ2V0IGNhY2hlIGFsaWdubWVudCAqLworI2RlZmluZSBTTVBfQUxJR04oeCkgKCgoeCkgKyBTTVBfQ0FDSEVfQllURVMtMSkgJiB+KFNNUF9DQUNIRV9CWVRFUy0xKSkKKyNkZWZpbmUgQ09VTlRFUl9PRkZTRVQobikgKFNNUF9BTElHTihuICogc2l6ZW9mKHN0cnVjdCBlYnRfY291bnRlcikpKQorI2RlZmluZSBDT1VOVEVSX0JBU0UoYywgbiwgY3B1KSAoKHN0cnVjdCBlYnRfY291bnRlciAqKSgoKGNoYXIgKiljKSArIFwKKyAgIENPVU5URVJfT0ZGU0VUKG4pICogY3B1KSkKKworCisKK3N0YXRpYyBERUNMQVJFX01VVEVYKGVidF9tdXRleCk7CitzdGF0aWMgTElTVF9IRUFEKGVidF90YWJsZXMpOworc3RhdGljIExJU1RfSEVBRChlYnRfdGFyZ2V0cyk7CitzdGF0aWMgTElTVF9IRUFEKGVidF9tYXRjaGVzKTsKK3N0YXRpYyBMSVNUX0hFQUQoZWJ0X3dhdGNoZXJzKTsKKworc3RhdGljIHN0cnVjdCBlYnRfdGFyZ2V0IGVidF9zdGFuZGFyZF90YXJnZXQgPQoreyB7TlVMTCwgTlVMTH0sIEVCVF9TVEFOREFSRF9UQVJHRVQsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEx9OworCitzdGF0aWMgaW5saW5lIGludCBlYnRfZG9fd2F0Y2hlciAoc3RydWN0IGVidF9lbnRyeV93YXRjaGVyICp3LAorICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGhvb2tuciwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCkKK3sKKwl3LT51LndhdGNoZXItPndhdGNoZXIoc2tiLCBob29rbnIsIGluLCBvdXQsIHctPmRhdGEsCisJICAgdy0+d2F0Y2hlcl9zaXplKTsKKwkvKiB3YXRjaGVycyBkb24ndCBnaXZlIGEgdmVyZGljdCAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBlYnRfZG9fbWF0Y2ggKHN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKm0sCisgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0KQoreworCXJldHVybiBtLT51Lm1hdGNoLT5tYXRjaChza2IsIGluLCBvdXQsIG0tPmRhdGEsCisJICAgbS0+bWF0Y2hfc2l6ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGVidF9kZXZfY2hlY2soY2hhciAqZW50cnksIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXZpY2UpCit7CisJaW50IGkgPSAwOworCWNoYXIgKmRldm5hbWUgPSBkZXZpY2UtPm5hbWU7CisKKwlpZiAoKmVudHJ5ID09ICdcMCcpCisJCXJldHVybiAwOworCWlmICghZGV2aWNlKQorCQlyZXR1cm4gMTsKKwkvKiAxIGlzIHRoZSB3aWxkY2FyZCB0b2tlbiAqLworCXdoaWxlIChlbnRyeVtpXSAhPSAnXDAnICYmIGVudHJ5W2ldICE9IDEgJiYgZW50cnlbaV0gPT0gZGV2bmFtZVtpXSkKKwkJaSsrOworCXJldHVybiAoZGV2bmFtZVtpXSAhPSBlbnRyeVtpXSAmJiBlbnRyeVtpXSAhPSAxKTsKK30KKworI2RlZmluZSBGV0lOVjIoYm9vbCxpbnZmbGcpICgoYm9vbCkgXiAhIShlLT5pbnZmbGFncyAmIGludmZsZykpCisvKiBwcm9jZXNzIHN0YW5kYXJkIG1hdGNoZXMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGVidF9iYXNpY19tYXRjaChzdHJ1Y3QgZWJ0X2VudHJ5ICplLCBzdHJ1Y3QgZXRoaGRyICpoLAorICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0KQoreworCWludCB2ZXJkaWN0LCBpOworCisJaWYgKGUtPmJpdG1hc2sgJiBFQlRfODAyXzMpIHsKKwkJaWYgKEZXSU5WMihudG9ocyhoLT5oX3Byb3RvKSA+PSAxNTM2LCBFQlRfSVBST1RPKSkKKwkJCXJldHVybiAxOworCX0gZWxzZSBpZiAoIShlLT5iaXRtYXNrICYgRUJUX05PUFJPVE8pICYmCisJICAgRldJTlYyKGUtPmV0aHByb3RvICE9IGgtPmhfcHJvdG8sIEVCVF9JUFJPVE8pKQorCQlyZXR1cm4gMTsKKworCWlmIChGV0lOVjIoZWJ0X2Rldl9jaGVjayhlLT5pbiwgaW4pLCBFQlRfSUlOKSkKKwkJcmV0dXJuIDE7CisJaWYgKEZXSU5WMihlYnRfZGV2X2NoZWNrKGUtPm91dCwgb3V0KSwgRUJUX0lPVVQpKQorCQlyZXR1cm4gMTsKKwlpZiAoKCFpbiB8fCAhaW4tPmJyX3BvcnQpID8gMCA6IEZXSU5WMihlYnRfZGV2X2NoZWNrKAorCSAgIGUtPmxvZ2ljYWxfaW4sIGluLT5icl9wb3J0LT5ici0+ZGV2KSwgRUJUX0lMT0dJQ0FMSU4pKQorCQlyZXR1cm4gMTsKKwlpZiAoKCFvdXQgfHwgIW91dC0+YnJfcG9ydCkgPyAwIDogRldJTlYyKGVidF9kZXZfY2hlY2soCisJICAgZS0+bG9naWNhbF9vdXQsIG91dC0+YnJfcG9ydC0+YnItPmRldiksIEVCVF9JTE9HSUNBTE9VVCkpCisJCXJldHVybiAxOworCisJaWYgKGUtPmJpdG1hc2sgJiBFQlRfU09VUkNFTUFDKSB7CisJCXZlcmRpY3QgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJdmVyZGljdCB8PSAoaC0+aF9zb3VyY2VbaV0gXiBlLT5zb3VyY2VtYWNbaV0pICYKKwkJCSAgIGUtPnNvdXJjZW1za1tpXTsKKwkJaWYgKEZXSU5WMih2ZXJkaWN0ICE9IDAsIEVCVF9JU09VUkNFKSApCisJCQlyZXR1cm4gMTsKKwl9CisJaWYgKGUtPmJpdG1hc2sgJiBFQlRfREVTVE1BQykgeworCQl2ZXJkaWN0ID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCXZlcmRpY3QgfD0gKGgtPmhfZGVzdFtpXSBeIGUtPmRlc3RtYWNbaV0pICYKKwkJCSAgIGUtPmRlc3Rtc2tbaV07CisJCWlmIChGV0lOVjIodmVyZGljdCAhPSAwLCBFQlRfSURFU1QpICkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogRG8gc29tZSBmaXJld2FsbGluZyAqLwordW5zaWduZWQgaW50IGVidF9kb190YWJsZSAodW5zaWduZWQgaW50IGhvb2ssIHN0cnVjdCBza19idWZmICoqcHNrYiwKKyAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgIHN0cnVjdCBlYnRfdGFibGUgKnRhYmxlKQoreworCWludCBpLCBuZW50cmllczsKKwlzdHJ1Y3QgZWJ0X2VudHJ5ICpwb2ludDsKKwlzdHJ1Y3QgZWJ0X2NvdW50ZXIgKmNvdW50ZXJfYmFzZSwgKmNiX2Jhc2U7CisJc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKnQ7CisJaW50IHZlcmRpY3QsIHNwID0gMDsKKwlzdHJ1Y3QgZWJ0X2NoYWluc3RhY2sgKmNzOworCXN0cnVjdCBlYnRfZW50cmllcyAqY2hhaW5pbmZvOworCWNoYXIgKmJhc2U7CisJc3RydWN0IGVidF90YWJsZV9pbmZvICpwcml2YXRlOworCisJcmVhZF9sb2NrX2JoKCZ0YWJsZS0+bG9jayk7CisJcHJpdmF0ZSA9IHRhYmxlLT5wcml2YXRlOworCWNiX2Jhc2UgPSBDT1VOVEVSX0JBU0UocHJpdmF0ZS0+Y291bnRlcnMsIHByaXZhdGUtPm5lbnRyaWVzLAorCSAgIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJaWYgKHByaXZhdGUtPmNoYWluc3RhY2spCisJCWNzID0gcHJpdmF0ZS0+Y2hhaW5zdGFja1tzbXBfcHJvY2Vzc29yX2lkKCldOworCWVsc2UKKwkJY3MgPSBOVUxMOworCWNoYWluaW5mbyA9IHByaXZhdGUtPmhvb2tfZW50cnlbaG9va107CisJbmVudHJpZXMgPSBwcml2YXRlLT5ob29rX2VudHJ5W2hvb2tdLT5uZW50cmllczsKKwlwb2ludCA9IChzdHJ1Y3QgZWJ0X2VudHJ5ICopKHByaXZhdGUtPmhvb2tfZW50cnlbaG9va10tPmRhdGEpOworCWNvdW50ZXJfYmFzZSA9IGNiX2Jhc2UgKyBwcml2YXRlLT5ob29rX2VudHJ5W2hvb2tdLT5jb3VudGVyX29mZnNldDsKKwkvKiBiYXNlIGZvciBjaGFpbiBqdW1wcyAqLworCWJhc2UgPSBwcml2YXRlLT5lbnRyaWVzOworCWkgPSAwOworCXdoaWxlIChpIDwgbmVudHJpZXMpIHsKKwkJaWYgKGVidF9iYXNpY19tYXRjaChwb2ludCwgZXRoX2hkcigqcHNrYiksIGluLCBvdXQpKQorCQkJZ290byBsZXRzY29udGludWU7CisKKwkJaWYgKEVCVF9NQVRDSF9JVEVSQVRFKHBvaW50LCBlYnRfZG9fbWF0Y2gsICpwc2tiLCBpbiwgb3V0KSAhPSAwKQorCQkJZ290byBsZXRzY29udGludWU7CisKKwkJLyogaW5jcmVhc2UgY291bnRlciAqLworCQkoKihjb3VudGVyX2Jhc2UgKyBpKSkucGNudCsrOworCQkoKihjb3VudGVyX2Jhc2UgKyBpKSkuYmNudCs9KCoqcHNrYikubGVuOworCisJCS8qIHRoZXNlIHNob3VsZCBvbmx5IHdhdGNoOiBub3QgbW9kaWZ5LCBub3IgdGVsbCB1cworCQkgICB3aGF0IHRvIGRvIHdpdGggdGhlIHBhY2tldCAqLworCQlFQlRfV0FUQ0hFUl9JVEVSQVRFKHBvaW50LCBlYnRfZG9fd2F0Y2hlciwgKnBza2IsIGhvb2ssIGluLAorCQkgICBvdXQpOworCisJCXQgPSAoc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKikKKwkJICAgKCgoY2hhciAqKXBvaW50KSArIHBvaW50LT50YXJnZXRfb2Zmc2V0KTsKKwkJLyogc3RhbmRhcmQgdGFyZ2V0ICovCisJCWlmICghdC0+dS50YXJnZXQtPnRhcmdldCkKKwkJCXZlcmRpY3QgPSAoKHN0cnVjdCBlYnRfc3RhbmRhcmRfdGFyZ2V0ICopdCktPnZlcmRpY3Q7CisJCWVsc2UKKwkJCXZlcmRpY3QgPSB0LT51LnRhcmdldC0+dGFyZ2V0KHBza2IsIGhvb2ssCisJCQkgICBpbiwgb3V0LCB0LT5kYXRhLCB0LT50YXJnZXRfc2l6ZSk7CisJCWlmICh2ZXJkaWN0ID09IEVCVF9BQ0NFUFQpIHsKKwkJCXJlYWRfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7CisJCQlyZXR1cm4gTkZfQUNDRVBUOworCQl9CisJCWlmICh2ZXJkaWN0ID09IEVCVF9EUk9QKSB7CisJCQlyZWFkX3VubG9ja19iaCgmdGFibGUtPmxvY2spOworCQkJcmV0dXJuIE5GX0RST1A7CisJCX0KKwkJaWYgKHZlcmRpY3QgPT0gRUJUX1JFVFVSTikgeworbGV0c3JldHVybjoKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCisJCQlpZiAoc3AgPT0gMCkgeworCQkJCUJVR1BSSU5UKCJSRVRVUk4gb24gYmFzZSBjaGFpbiIpOworCQkJCS8qIGFjdCBsaWtlIHRoaXMgaXMgRUJUX0NPTlRJTlVFICovCisJCQkJZ290byBsZXRzY29udGludWU7CisJCQl9CisjZW5kaWYKKwkJCXNwLS07CisJCQkvKiBwdXQgYWxsIHRoZSBsb2NhbCB2YXJpYWJsZXMgcmlnaHQgKi8KKwkJCWkgPSBjc1tzcF0ubjsKKwkJCWNoYWluaW5mbyA9IGNzW3NwXS5jaGFpbmluZm87CisJCQluZW50cmllcyA9IGNoYWluaW5mby0+bmVudHJpZXM7CisJCQlwb2ludCA9IGNzW3NwXS5lOworCQkJY291bnRlcl9iYXNlID0gY2JfYmFzZSArCisJCQkgICBjaGFpbmluZm8tPmNvdW50ZXJfb2Zmc2V0OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHZlcmRpY3QgPT0gRUJUX0NPTlRJTlVFKQorCQkJZ290byBsZXRzY29udGludWU7CisjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRworCQlpZiAodmVyZGljdCA8IDApIHsKKwkJCUJVR1BSSU5UKCJib2d1cyBzdGFuZGFyZCB2ZXJkaWN0XG4iKTsKKwkJCXJlYWRfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7CisJCQlyZXR1cm4gTkZfRFJPUDsKKwkJfQorI2VuZGlmCisJCS8qIGp1bXAgdG8gYSB1ZGMgKi8KKwkJY3Nbc3BdLm4gPSBpICsgMTsKKwkJY3Nbc3BdLmNoYWluaW5mbyA9IGNoYWluaW5mbzsKKwkJY3Nbc3BdLmUgPSAoc3RydWN0IGVidF9lbnRyeSAqKQorCQkgICAoKChjaGFyICopcG9pbnQpICsgcG9pbnQtPm5leHRfb2Zmc2V0KTsKKwkJaSA9IDA7CisJCWNoYWluaW5mbyA9IChzdHJ1Y3QgZWJ0X2VudHJpZXMgKikgKGJhc2UgKyB2ZXJkaWN0KTsKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCisJCWlmIChjaGFpbmluZm8tPmRpc3Rpbmd1aXNoZXIpIHsKKwkJCUJVR1BSSU5UKCJqdW1wIHRvIG5vbi1jaGFpblxuIik7CisJCQlyZWFkX3VubG9ja19iaCgmdGFibGUtPmxvY2spOworCQkJcmV0dXJuIE5GX0RST1A7CisJCX0KKyNlbmRpZgorCQluZW50cmllcyA9IGNoYWluaW5mby0+bmVudHJpZXM7CisJCXBvaW50ID0gKHN0cnVjdCBlYnRfZW50cnkgKiljaGFpbmluZm8tPmRhdGE7CisJCWNvdW50ZXJfYmFzZSA9IGNiX2Jhc2UgKyBjaGFpbmluZm8tPmNvdW50ZXJfb2Zmc2V0OworCQlzcCsrOworCQljb250aW51ZTsKK2xldHNjb250aW51ZToKKwkJcG9pbnQgPSAoc3RydWN0IGVidF9lbnRyeSAqKQorCQkgICAoKChjaGFyICopcG9pbnQpICsgcG9pbnQtPm5leHRfb2Zmc2V0KTsKKwkJaSsrOworCX0KKworCS8qIEkgYWN0dWFsbHkgbGlrZSB0aGlzIDopICovCisJaWYgKGNoYWluaW5mby0+cG9saWN5ID09IEVCVF9SRVRVUk4pCisJCWdvdG8gbGV0c3JldHVybjsKKwlpZiAoY2hhaW5pbmZvLT5wb2xpY3kgPT0gRUJUX0FDQ0VQVCkgeworCQlyZWFkX3VubG9ja19iaCgmdGFibGUtPmxvY2spOworCQlyZXR1cm4gTkZfQUNDRVBUOworCX0KKwlyZWFkX3VubG9ja19iaCgmdGFibGUtPmxvY2spOworCXJldHVybiBORl9EUk9QOworfQorCisvKiBJZiBpdCBzdWNjZWVkcywgcmV0dXJucyBlbGVtZW50IGFuZCBsb2NrcyBtdXRleCAqLworc3RhdGljIGlubGluZSB2b2lkICoKK2ZpbmRfaW5saXN0X2xvY2tfbm9sb2FkKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIGNvbnN0IGNoYXIgKm5hbWUsIGludCAqZXJyb3IsCisgICBzdHJ1Y3Qgc2VtYXBob3JlICptdXRleCkKK3sKKwl2b2lkICpyZXQ7CisKKwkqZXJyb3IgPSBkb3duX2ludGVycnVwdGlibGUobXV0ZXgpOworCWlmICgqZXJyb3IgIT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQgPSBsaXN0X25hbWVkX2ZpbmQoaGVhZCwgbmFtZSk7CisJaWYgKCFyZXQpIHsKKwkJKmVycm9yID0gLUVOT0VOVDsKKwkJdXAobXV0ZXgpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisjaWZuZGVmIENPTkZJR19LTU9ECisjZGVmaW5lIGZpbmRfaW5saXN0X2xvY2soaCxuLHAsZSxtKSBmaW5kX2lubGlzdF9sb2NrX25vbG9hZCgoaCksKG4pLChlKSwobSkpCisjZWxzZQorc3RhdGljIHZvaWQgKgorZmluZF9pbmxpc3RfbG9jayhzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpwcmVmaXgsCisgICBpbnQgKmVycm9yLCBzdHJ1Y3Qgc2VtYXBob3JlICptdXRleCkKK3sKKwl2b2lkICpyZXQ7CisKKwlyZXQgPSBmaW5kX2lubGlzdF9sb2NrX25vbG9hZChoZWFkLCBuYW1lLCBlcnJvciwgbXV0ZXgpOworCWlmICghcmV0KSB7CisJCXJlcXVlc3RfbW9kdWxlKCIlcyVzIiwgcHJlZml4LCBuYW1lKTsKKwkJcmV0ID0gZmluZF9pbmxpc3RfbG9ja19ub2xvYWQoaGVhZCwgbmFtZSwgZXJyb3IsIG11dGV4KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBlYnRfdGFibGUgKgorZmluZF90YWJsZV9sb2NrKGNvbnN0IGNoYXIgKm5hbWUsIGludCAqZXJyb3IsIHN0cnVjdCBzZW1hcGhvcmUgKm11dGV4KQoreworCXJldHVybiBmaW5kX2lubGlzdF9sb2NrKCZlYnRfdGFibGVzLCBuYW1lLCAiZWJ0YWJsZV8iLCBlcnJvciwgbXV0ZXgpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBlYnRfbWF0Y2ggKgorZmluZF9tYXRjaF9sb2NrKGNvbnN0IGNoYXIgKm5hbWUsIGludCAqZXJyb3IsIHN0cnVjdCBzZW1hcGhvcmUgKm11dGV4KQoreworCXJldHVybiBmaW5kX2lubGlzdF9sb2NrKCZlYnRfbWF0Y2hlcywgbmFtZSwgImVidF8iLCBlcnJvciwgbXV0ZXgpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBlYnRfd2F0Y2hlciAqCitmaW5kX3dhdGNoZXJfbG9jayhjb25zdCBjaGFyICpuYW1lLCBpbnQgKmVycm9yLCBzdHJ1Y3Qgc2VtYXBob3JlICptdXRleCkKK3sKKwlyZXR1cm4gZmluZF9pbmxpc3RfbG9jaygmZWJ0X3dhdGNoZXJzLCBuYW1lLCAiZWJ0XyIsIGVycm9yLCBtdXRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGVidF90YXJnZXQgKgorZmluZF90YXJnZXRfbG9jayhjb25zdCBjaGFyICpuYW1lLCBpbnQgKmVycm9yLCBzdHJ1Y3Qgc2VtYXBob3JlICptdXRleCkKK3sKKwlyZXR1cm4gZmluZF9pbmxpc3RfbG9jaygmZWJ0X3RhcmdldHMsIG5hbWUsICJlYnRfIiwgZXJyb3IsIG11dGV4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2VidF9jaGVja19tYXRjaChzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptLCBzdHJ1Y3QgZWJ0X2VudHJ5ICplLAorICAgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IGhvb2ttYXNrLCB1bnNpZ25lZCBpbnQgKmNudCkKK3sKKwlzdHJ1Y3QgZWJ0X21hdGNoICptYXRjaDsKKwlpbnQgcmV0OworCisJaWYgKCgoY2hhciAqKW0pICsgbS0+bWF0Y2hfc2l6ZSArIHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoKSA+CisJICAgKChjaGFyICopZSkgKyBlLT53YXRjaGVyc19vZmZzZXQpCisJCXJldHVybiAtRUlOVkFMOworCW1hdGNoID0gZmluZF9tYXRjaF9sb2NrKG0tPnUubmFtZSwgJnJldCwgJmVidF9tdXRleCk7CisJaWYgKCFtYXRjaCkKKwkJcmV0dXJuIHJldDsKKwltLT51Lm1hdGNoID0gbWF0Y2g7CisJaWYgKCF0cnlfbW9kdWxlX2dldChtYXRjaC0+bWUpKSB7CisJCXVwKCZlYnRfbXV0ZXgpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJdXAoJmVidF9tdXRleCk7CisJaWYgKG1hdGNoLT5jaGVjayAmJgorCSAgIG1hdGNoLT5jaGVjayhuYW1lLCBob29rbWFzaywgZSwgbS0+ZGF0YSwgbS0+bWF0Y2hfc2l6ZSkgIT0gMCkgeworCQlCVUdQUklOVCgibWF0Y2gtPmNoZWNrIGZhaWxlZFxuIik7CisJCW1vZHVsZV9wdXQobWF0Y2gtPm1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCSgqY250KSsrOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorZWJ0X2NoZWNrX3dhdGNoZXIoc3RydWN0IGVidF9lbnRyeV93YXRjaGVyICp3LCBzdHJ1Y3QgZWJ0X2VudHJ5ICplLAorICAgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IGhvb2ttYXNrLCB1bnNpZ25lZCBpbnQgKmNudCkKK3sKKwlzdHJ1Y3QgZWJ0X3dhdGNoZXIgKndhdGNoZXI7CisJaW50IHJldDsKKworCWlmICgoKGNoYXIgKil3KSArIHctPndhdGNoZXJfc2l6ZSArIHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIpID4KKwkgICAoKGNoYXIgKillKSArIGUtPnRhcmdldF9vZmZzZXQpCisJCXJldHVybiAtRUlOVkFMOworCXdhdGNoZXIgPSBmaW5kX3dhdGNoZXJfbG9jayh3LT51Lm5hbWUsICZyZXQsICZlYnRfbXV0ZXgpOworCWlmICghd2F0Y2hlcikKKwkJcmV0dXJuIHJldDsKKwl3LT51LndhdGNoZXIgPSB3YXRjaGVyOworCWlmICghdHJ5X21vZHVsZV9nZXQod2F0Y2hlci0+bWUpKSB7CisJCXVwKCZlYnRfbXV0ZXgpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJdXAoJmVidF9tdXRleCk7CisJaWYgKHdhdGNoZXItPmNoZWNrICYmCisJICAgd2F0Y2hlci0+Y2hlY2sobmFtZSwgaG9va21hc2ssIGUsIHctPmRhdGEsIHctPndhdGNoZXJfc2l6ZSkgIT0gMCkgeworCQlCVUdQUklOVCgid2F0Y2hlci0+Y2hlY2sgZmFpbGVkXG4iKTsKKwkJbW9kdWxlX3B1dCh3YXRjaGVyLT5tZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkoKmNudCkrKzsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHRoaXMgb25lIGlzIHZlcnkgY2FyZWZ1bCwgYXMgaXQgaXMgdGhlIGZpcnN0IGZ1bmN0aW9uCisgKiB0byBwYXJzZSB0aGUgdXNlcnNwYWNlIGRhdGEKKyAqLworc3RhdGljIGlubGluZSBpbnQKK2VidF9jaGVja19lbnRyeV9zaXplX2FuZF9ob29rcyhzdHJ1Y3QgZWJ0X2VudHJ5ICplLAorICAgc3RydWN0IGVidF90YWJsZV9pbmZvICpuZXdpbmZvLCBjaGFyICpiYXNlLCBjaGFyICpsaW1pdCwKKyAgIHN0cnVjdCBlYnRfZW50cmllcyAqKmhvb2tfZW50cmllcywgdW5zaWduZWQgaW50ICpuLCB1bnNpZ25lZCBpbnQgKmNudCwKKyAgIHVuc2lnbmVkIGludCAqdG90YWxjbnQsIHVuc2lnbmVkIGludCAqdWRjX2NudCwgdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5GX0JSX05VTUhPT0tTOyBpKyspIHsKKwkJaWYgKCh2YWxpZF9ob29rcyAmICgxIDw8IGkpKSA9PSAwKQorCQkJY29udGludWU7CisJCWlmICggKGNoYXIgKilob29rX2VudHJpZXNbaV0gLSBiYXNlID09CisJCSAgIChjaGFyICopZSAtIG5ld2luZm8tPmVudHJpZXMpCisJCQlicmVhazsKKwl9CisJLyogYmVnaW5uaW5nIG9mIGEgbmV3IGNoYWluCisJICAgaWYgaSA9PSBORl9CUl9OVU1IT09LUyBpdCBtdXN0IGJlIGEgdXNlciBkZWZpbmVkIGNoYWluICovCisJaWYgKGkgIT0gTkZfQlJfTlVNSE9PS1MgfHwgIShlLT5iaXRtYXNrICYgRUJUX0VOVFJZX09SX0VOVFJJRVMpKSB7CisJCWlmICgoZS0+Yml0bWFzayAmIEVCVF9FTlRSWV9PUl9FTlRSSUVTKSAhPSAwKSB7CisJCQkvKiB3ZSBtYWtlIHVzZXJzcGFjZSBzZXQgdGhpcyByaWdodCwKKwkJCSAgIHNvIHRoZXJlIGlzIG5vIG1pc3VuZGVyc3RhbmRpbmcgKi8KKwkJCUJVR1BSSU5UKCJFQlRfRU5UUllfT1JfRU5UUklFUyBzaG91bGRuJ3QgYmUgc2V0ICIKKwkJCSAgICAgICAgICJpbiBkaXN0aW5ndWlzaGVyXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qIHRoaXMgY2hlY2tzIGlmIHRoZSBwcmV2aW91cyBjaGFpbiBoYXMgYXMgbWFueSBlbnRyaWVzCisJCSAgIGFzIGl0IHNhaWQgaXQgaGFzICovCisJCWlmICgqbiAhPSAqY250KSB7CisJCQlCVUdQUklOVCgibmVudHJpZXMgZG9lcyBub3QgZXF1YWwgdGhlIG5yIG9mIGVudHJpZXMgIgorCQkgICAgICAgICAgICAgICAgICJpbiB0aGUgY2hhaW5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyogYmVmb3JlIHdlIGxvb2sgYXQgdGhlIHN0cnVjdCwgYmUgc3VyZSBpdCBpcyBub3QgdG9vIGJpZyAqLworCQlpZiAoKGNoYXIgKilob29rX2VudHJpZXNbaV0gKyBzaXplb2Yoc3RydWN0IGVidF9lbnRyaWVzKQorCQkgICA+IGxpbWl0KSB7CisJCQlCVUdQUklOVCgiZW50cmllc19zaXplIHRvbyBzbWFsbFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoKChzdHJ1Y3QgZWJ0X2VudHJpZXMgKillKS0+cG9saWN5ICE9IEVCVF9EUk9QICYmCisJCSAgICgoc3RydWN0IGVidF9lbnRyaWVzICopZSktPnBvbGljeSAhPSBFQlRfQUNDRVBUKSB7CisJCQkvKiBvbmx5IFJFVFVSTiBmcm9tIHVkYyAqLworCQkJaWYgKGkgIT0gTkZfQlJfTlVNSE9PS1MgfHwKKwkJCSAgICgoc3RydWN0IGVidF9lbnRyaWVzICopZSktPnBvbGljeSAhPSBFQlRfUkVUVVJOKSB7CisJCQkJQlVHUFJJTlQoImJhZCBwb2xpY3lcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJCWlmIChpID09IE5GX0JSX05VTUhPT0tTKSAvKiBpdCdzIGEgdXNlciBkZWZpbmVkIGNoYWluICovCisJCQkoKnVkY19jbnQpKys7CisJCWVsc2UKKwkJCW5ld2luZm8tPmhvb2tfZW50cnlbaV0gPSAoc3RydWN0IGVidF9lbnRyaWVzICopZTsKKwkJaWYgKCgoc3RydWN0IGVidF9lbnRyaWVzICopZSktPmNvdW50ZXJfb2Zmc2V0ICE9ICp0b3RhbGNudCkgeworCQkJQlVHUFJJTlQoImNvdW50ZXJfb2Zmc2V0ICE9IHRvdGFsY250Iik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkqbiA9ICgoc3RydWN0IGVidF9lbnRyaWVzICopZSktPm5lbnRyaWVzOworCQkqY250ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCS8qIGEgcGxhaW4gb2xkIGVudHJ5LCBoZWggKi8KKwlpZiAoc2l6ZW9mKHN0cnVjdCBlYnRfZW50cnkpID4gZS0+d2F0Y2hlcnNfb2Zmc2V0IHx8CisJICAgZS0+d2F0Y2hlcnNfb2Zmc2V0ID4gZS0+dGFyZ2V0X29mZnNldCB8fAorCSAgIGUtPnRhcmdldF9vZmZzZXQgPj0gZS0+bmV4dF9vZmZzZXQpIHsKKwkJQlVHUFJJTlQoImVudHJ5IG9mZnNldHMgbm90IGluIHJpZ2h0IG9yZGVyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIHRoaXMgaXMgbm90IGNoZWNrZWQgYW55d2hlcmUgZWxzZSAqLworCWlmIChlLT5uZXh0X29mZnNldCAtIGUtPnRhcmdldF9vZmZzZXQgPCBzaXplb2Yoc3RydWN0IGVidF9lbnRyeV90YXJnZXQpKSB7CisJCUJVR1BSSU5UKCJ0YXJnZXQgc2l6ZSB0b28gc21hbGxcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkoKmNudCkrKzsKKwkoKnRvdGFsY250KSsrOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZWJ0X2NsX3N0YWNrCit7CisJc3RydWN0IGVidF9jaGFpbnN0YWNrIGNzOworCWludCBmcm9tOworCXVuc2lnbmVkIGludCBob29rbWFzazsKK307CisKKy8qCisgKiB3ZSBuZWVkIHRoZXNlIHBvc2l0aW9ucyB0byBjaGVjayB0aGF0IHRoZSBqdW1wcyB0byBhIGRpZmZlcmVudCBwYXJ0IG9mIHRoZQorICogZW50cmllcyBpcyBhIGp1bXAgdG8gdGhlIGJlZ2lubmluZyBvZiBhIG5ldyBjaGFpbi4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2VidF9nZXRfdWRjX3Bvc2l0aW9ucyhzdHJ1Y3QgZWJ0X2VudHJ5ICplLCBzdHJ1Y3QgZWJ0X3RhYmxlX2luZm8gKm5ld2luZm8sCisgICBzdHJ1Y3QgZWJ0X2VudHJpZXMgKipob29rX2VudHJpZXMsIHVuc2lnbmVkIGludCAqbiwgdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzLAorICAgc3RydWN0IGVidF9jbF9zdGFjayAqdWRjKQoreworCWludCBpOworCisJLyogd2UncmUgb25seSBpbnRlcmVzdGVkIGluIGNoYWluIHN0YXJ0cyAqLworCWlmIChlLT5iaXRtYXNrICYgRUJUX0VOVFJZX09SX0VOVFJJRVMpCisJCXJldHVybiAwOworCWZvciAoaSA9IDA7IGkgPCBORl9CUl9OVU1IT09LUzsgaSsrKSB7CisJCWlmICgodmFsaWRfaG9va3MgJiAoMSA8PCBpKSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAobmV3aW5mby0+aG9va19lbnRyeVtpXSA9PSAoc3RydWN0IGVidF9lbnRyaWVzICopZSkKKwkJCWJyZWFrOworCX0KKwkvKiBvbmx5IGNhcmUgYWJvdXQgdWRjICovCisJaWYgKGkgIT0gTkZfQlJfTlVNSE9PS1MpCisJCXJldHVybiAwOworCisJdWRjWypuXS5jcy5jaGFpbmluZm8gPSAoc3RydWN0IGVidF9lbnRyaWVzICopZTsKKwkvKiB0aGVzZSBpbml0aWFsaXNhdGlvbnMgYXJlIGRlcGVuZGVkIG9uIGxhdGVyIGluIGNoZWNrX2NoYWlubG9vcHMoKSAqLworCXVkY1sqbl0uY3MubiA9IDA7CisJdWRjWypuXS5ob29rbWFzayA9IDA7CisKKwkoKm4pKys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitlYnRfY2xlYW51cF9tYXRjaChzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptLCB1bnNpZ25lZCBpbnQgKmkpCit7CisJaWYgKGkgJiYgKCppKS0tID09IDApCisJCXJldHVybiAxOworCWlmIChtLT51Lm1hdGNoLT5kZXN0cm95KQorCQltLT51Lm1hdGNoLT5kZXN0cm95KG0tPmRhdGEsIG0tPm1hdGNoX3NpemUpOworCW1vZHVsZV9wdXQobS0+dS5tYXRjaC0+bWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitlYnRfY2xlYW51cF93YXRjaGVyKHN0cnVjdCBlYnRfZW50cnlfd2F0Y2hlciAqdywgdW5zaWduZWQgaW50ICppKQoreworCWlmIChpICYmICgqaSktLSA9PSAwKQorCQlyZXR1cm4gMTsKKwlpZiAody0+dS53YXRjaGVyLT5kZXN0cm95KQorCQl3LT51LndhdGNoZXItPmRlc3Ryb3kody0+ZGF0YSwgdy0+d2F0Y2hlcl9zaXplKTsKKwltb2R1bGVfcHV0KHctPnUud2F0Y2hlci0+bWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitlYnRfY2xlYW51cF9lbnRyeShzdHJ1Y3QgZWJ0X2VudHJ5ICplLCB1bnNpZ25lZCBpbnQgKmNudCkKK3sKKwlzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdDsKKworCWlmICgoZS0+Yml0bWFzayAmIEVCVF9FTlRSWV9PUl9FTlRSSUVTKSA9PSAwKQorCQlyZXR1cm4gMDsKKwkvKiB3ZSdyZSBkb25lICovCisJaWYgKGNudCAmJiAoKmNudCktLSA9PSAwKQorCQlyZXR1cm4gMTsKKwlFQlRfV0FUQ0hFUl9JVEVSQVRFKGUsIGVidF9jbGVhbnVwX3dhdGNoZXIsIE5VTEwpOworCUVCVF9NQVRDSF9JVEVSQVRFKGUsIGVidF9jbGVhbnVwX21hdGNoLCBOVUxMKTsKKwl0ID0gKHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICopKCgoY2hhciAqKWUpICsgZS0+dGFyZ2V0X29mZnNldCk7CisJaWYgKHQtPnUudGFyZ2V0LT5kZXN0cm95KQorCQl0LT51LnRhcmdldC0+ZGVzdHJveSh0LT5kYXRhLCB0LT50YXJnZXRfc2l6ZSk7CisJbW9kdWxlX3B1dCh0LT51LnRhcmdldC0+bWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitlYnRfY2hlY2tfZW50cnkoc3RydWN0IGVidF9lbnRyeSAqZSwgc3RydWN0IGVidF90YWJsZV9pbmZvICpuZXdpbmZvLAorICAgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50ICpjbnQsIHVuc2lnbmVkIGludCB2YWxpZF9ob29rcywKKyAgIHN0cnVjdCBlYnRfY2xfc3RhY2sgKmNsX3MsIHVuc2lnbmVkIGludCB1ZGNfY250KQoreworCXN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICp0OworCXN0cnVjdCBlYnRfdGFyZ2V0ICp0YXJnZXQ7CisJdW5zaWduZWQgaW50IGksIGosIGhvb2sgPSAwLCBob29rbWFzayA9IDA7CisJaW50IHJldDsKKworCS8qIGRvbid0IG1lc3Mgd2l0aCB0aGUgc3RydWN0IGVidF9lbnRyaWVzICovCisJaWYgKChlLT5iaXRtYXNrICYgRUJUX0VOVFJZX09SX0VOVFJJRVMpID09IDApCisJCXJldHVybiAwOworCisJaWYgKGUtPmJpdG1hc2sgJiB+RUJUX0ZfTUFTSykgeworCQlCVUdQUklOVCgiVW5rbm93biBmbGFnIGZvciBiaXRtYXNrXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChlLT5pbnZmbGFncyAmIH5FQlRfSU5WX01BU0spIHsKKwkJQlVHUFJJTlQoIlVua25vd24gZmxhZyBmb3IgaW52IGJpdG1hc2tcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCAoZS0+Yml0bWFzayAmIEVCVF9OT1BST1RPKSAmJiAoZS0+Yml0bWFzayAmIEVCVF84MDJfMykgKSB7CisJCUJVR1BSSU5UKCJOT1BST1RPICYgODAyXzMgbm90IGFsbG93ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyogd2hhdCBob29rIGRvIHdlIGJlbG9uZyB0bz8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgTkZfQlJfTlVNSE9PS1M7IGkrKykgeworCQlpZiAoKHZhbGlkX2hvb2tzICYgKDEgPDwgaSkpID09IDApCisJCQljb250aW51ZTsKKwkJaWYgKChjaGFyICopbmV3aW5mby0+aG9va19lbnRyeVtpXSA8IChjaGFyICopZSkKKwkJCWhvb2sgPSBpOworCQllbHNlCisJCQlicmVhazsKKwl9CisJLyogKDEgPDwgTkZfQlJfTlVNSE9PS1MpIHRlbGxzIHRoZSBjaGVjayBmdW5jdGlvbnMgdGhlIHJ1bGUgaXMgb24KKwkgICBhIGJhc2UgY2hhaW4gKi8KKwlpZiAoaSA8IE5GX0JSX05VTUhPT0tTKQorCQlob29rbWFzayA9ICgxIDw8IGhvb2spIHwgKDEgPDwgTkZfQlJfTlVNSE9PS1MpOworCWVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgdWRjX2NudDsgaSsrKQorCQkJaWYgKChjaGFyICopKGNsX3NbaV0uY3MuY2hhaW5pbmZvKSA+IChjaGFyICopZSkKKwkJCQlicmVhazsKKwkJaWYgKGkgPT0gMCkKKwkJCWhvb2ttYXNrID0gKDEgPDwgaG9vaykgfCAoMSA8PCBORl9CUl9OVU1IT09LUyk7CisJCWVsc2UKKwkJCWhvb2ttYXNrID0gY2xfc1tpIC0gMV0uaG9va21hc2s7CisJfQorCWkgPSAwOworCXJldCA9IEVCVF9NQVRDSF9JVEVSQVRFKGUsIGVidF9jaGVja19tYXRjaCwgZSwgbmFtZSwgaG9va21hc2ssICZpKTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gY2xlYW51cF9tYXRjaGVzOworCWogPSAwOworCXJldCA9IEVCVF9XQVRDSEVSX0lURVJBVEUoZSwgZWJ0X2NoZWNrX3dhdGNoZXIsIGUsIG5hbWUsIGhvb2ttYXNrLCAmaik7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIGNsZWFudXBfd2F0Y2hlcnM7CisJdCA9IChzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqKSgoKGNoYXIgKillKSArIGUtPnRhcmdldF9vZmZzZXQpOworCXRhcmdldCA9IGZpbmRfdGFyZ2V0X2xvY2sodC0+dS5uYW1lLCAmcmV0LCAmZWJ0X211dGV4KTsKKwlpZiAoIXRhcmdldCkKKwkJZ290byBjbGVhbnVwX3dhdGNoZXJzOworCWlmICghdHJ5X21vZHVsZV9nZXQodGFyZ2V0LT5tZSkpIHsKKwkJdXAoJmVidF9tdXRleCk7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gY2xlYW51cF93YXRjaGVyczsKKwl9CisJdXAoJmVidF9tdXRleCk7CisKKwl0LT51LnRhcmdldCA9IHRhcmdldDsKKwlpZiAodC0+dS50YXJnZXQgPT0gJmVidF9zdGFuZGFyZF90YXJnZXQpIHsKKwkJaWYgKGUtPnRhcmdldF9vZmZzZXQgKyBzaXplb2Yoc3RydWN0IGVidF9zdGFuZGFyZF90YXJnZXQpID4KKwkJICAgZS0+bmV4dF9vZmZzZXQpIHsKKwkJCUJVR1BSSU5UKCJTdGFuZGFyZCB0YXJnZXQgc2l6ZSB0b28gYmlnXG4iKTsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIGNsZWFudXBfd2F0Y2hlcnM7CisJCX0KKwkJaWYgKCgoc3RydWN0IGVidF9zdGFuZGFyZF90YXJnZXQgKil0KS0+dmVyZGljdCA8CisJCSAgIC1OVU1fU1RBTkRBUkRfVEFSR0VUUykgeworCQkJQlVHUFJJTlQoIkludmFsaWQgc3RhbmRhcmQgdGFyZ2V0XG4iKTsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIGNsZWFudXBfd2F0Y2hlcnM7CisJCX0KKwl9IGVsc2UgaWYgKChlLT50YXJnZXRfb2Zmc2V0ICsgdC0+dGFyZ2V0X3NpemUgKworCSAgIHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCkgPiBlLT5uZXh0X29mZnNldCkgfHwKKwkgICAodC0+dS50YXJnZXQtPmNoZWNrICYmCisJICAgdC0+dS50YXJnZXQtPmNoZWNrKG5hbWUsIGhvb2ttYXNrLCBlLCB0LT5kYXRhLCB0LT50YXJnZXRfc2l6ZSkgIT0gMCkpeworCQltb2R1bGVfcHV0KHQtPnUudGFyZ2V0LT5tZSk7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gY2xlYW51cF93YXRjaGVyczsKKwl9CisJKCpjbnQpKys7CisJcmV0dXJuIDA7CitjbGVhbnVwX3dhdGNoZXJzOgorCUVCVF9XQVRDSEVSX0lURVJBVEUoZSwgZWJ0X2NsZWFudXBfd2F0Y2hlciwgJmopOworY2xlYW51cF9tYXRjaGVzOgorCUVCVF9NQVRDSF9JVEVSQVRFKGUsIGVidF9jbGVhbnVwX21hdGNoLCAmaSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGNoZWNrcyBmb3IgbG9vcHMgYW5kIHNldHMgdGhlIGhvb2sgbWFzayBmb3IgdWRjCisgKiB0aGUgaG9vayBtYXNrIGZvciB1ZGMgdGVsbHMgdXMgZnJvbSB3aGljaCBiYXNlIGNoYWlucyB0aGUgdWRjIGNhbiBiZQorICogYWNjZXNzZWQuIFRoaXMgbWFzayBpcyBhIHBhcmFtZXRlciB0byB0aGUgY2hlY2soKSBmdW5jdGlvbnMgb2YgdGhlIGV4dGVuc2lvbnMKKyAqLworc3RhdGljIGludCBjaGVja19jaGFpbmxvb3BzKHN0cnVjdCBlYnRfZW50cmllcyAqY2hhaW4sIHN0cnVjdCBlYnRfY2xfc3RhY2sgKmNsX3MsCisgICB1bnNpZ25lZCBpbnQgdWRjX2NudCwgdW5zaWduZWQgaW50IGhvb2tuciwgY2hhciAqYmFzZSkKK3sKKwlpbnQgaSwgY2hhaW5fbnIgPSAtMSwgcG9zID0gMCwgbmVudHJpZXMgPSBjaGFpbi0+bmVudHJpZXMsIHZlcmRpY3Q7CisJc3RydWN0IGVidF9lbnRyeSAqZSA9IChzdHJ1Y3QgZWJ0X2VudHJ5ICopY2hhaW4tPmRhdGE7CisJc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKnQ7CisKKwl3aGlsZSAocG9zIDwgbmVudHJpZXMgfHwgY2hhaW5fbnIgIT0gLTEpIHsKKwkJLyogZW5kIG9mIHVkYywgZ28gYmFjayBvbmUgJ3JlY3Vyc2lvbicgc3RlcCAqLworCQlpZiAocG9zID09IG5lbnRyaWVzKSB7CisJCQkvKiBwdXQgYmFjayB2YWx1ZXMgb2YgdGhlIHRpbWUgd2hlbiB0aGlzIGNoYWluIHdhcyBjYWxsZWQgKi8KKwkJCWUgPSBjbF9zW2NoYWluX25yXS5jcy5lOworCQkJaWYgKGNsX3NbY2hhaW5fbnJdLmZyb20gIT0gLTEpCisJCQkJbmVudHJpZXMgPQorCQkJCWNsX3NbY2xfc1tjaGFpbl9ucl0uZnJvbV0uY3MuY2hhaW5pbmZvLT5uZW50cmllczsKKwkJCWVsc2UKKwkJCQluZW50cmllcyA9IGNoYWluLT5uZW50cmllczsKKwkJCXBvcyA9IGNsX3NbY2hhaW5fbnJdLmNzLm47CisJCQkvKiBtYWtlIHN1cmUgd2Ugd29uJ3Qgc2VlIGEgbG9vcCB0aGF0IGlzbid0IG9uZSAqLworCQkJY2xfc1tjaGFpbl9ucl0uY3MubiA9IDA7CisJCQljaGFpbl9uciA9IGNsX3NbY2hhaW5fbnJdLmZyb207CisJCQlpZiAocG9zID09IG5lbnRyaWVzKQorCQkJCWNvbnRpbnVlOworCQl9CisJCXQgPSAoc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKikKKwkJICAgKCgoY2hhciAqKWUpICsgZS0+dGFyZ2V0X29mZnNldCk7CisJCWlmIChzdHJjbXAodC0+dS5uYW1lLCBFQlRfU1RBTkRBUkRfVEFSR0VUKSkKKwkJCWdvdG8gbGV0c2NvbnRpbnVlOworCQlpZiAoZS0+dGFyZ2V0X29mZnNldCArIHNpemVvZihzdHJ1Y3QgZWJ0X3N0YW5kYXJkX3RhcmdldCkgPgorCQkgICBlLT5uZXh0X29mZnNldCkgeworCQkJQlVHUFJJTlQoIlN0YW5kYXJkIHRhcmdldCBzaXplIHRvbyBiaWdcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXZlcmRpY3QgPSAoKHN0cnVjdCBlYnRfc3RhbmRhcmRfdGFyZ2V0ICopdCktPnZlcmRpY3Q7CisJCWlmICh2ZXJkaWN0ID49IDApIHsgLyoganVtcCB0byBhbm90aGVyIGNoYWluICovCisJCQlzdHJ1Y3QgZWJ0X2VudHJpZXMgKmhscDIgPQorCQkJICAgKHN0cnVjdCBlYnRfZW50cmllcyAqKShiYXNlICsgdmVyZGljdCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgdWRjX2NudDsgaSsrKQorCQkJCWlmIChobHAyID09IGNsX3NbaV0uY3MuY2hhaW5pbmZvKQorCQkJCQlicmVhazsKKwkJCS8qIGJhZCBkZXN0aW5hdGlvbiBvciBsb29wICovCisJCQlpZiAoaSA9PSB1ZGNfY250KSB7CisJCQkJQlVHUFJJTlQoImJhZCBkZXN0aW5hdGlvblxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGNsX3NbaV0uY3MubikgeworCQkJCUJVR1BSSU5UKCJsb29wXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQkvKiB0aGlzIGNhbid0IGJlIDAsIHNvIHRoZSBhYm92ZSB0ZXN0IGlzIGNvcnJlY3QgKi8KKwkJCWNsX3NbaV0uY3MubiA9IHBvcyArIDE7CisJCQlwb3MgPSAwOworCQkJY2xfc1tpXS5jcy5lID0gKCh2b2lkICopZSArIGUtPm5leHRfb2Zmc2V0KTsKKwkJCWUgPSAoc3RydWN0IGVidF9lbnRyeSAqKShobHAyLT5kYXRhKTsKKwkJCW5lbnRyaWVzID0gaGxwMi0+bmVudHJpZXM7CisJCQljbF9zW2ldLmZyb20gPSBjaGFpbl9ucjsKKwkJCWNoYWluX25yID0gaTsKKwkJCS8qIHRoaXMgdWRjIGlzIGFjY2Vzc2libGUgZnJvbSB0aGUgYmFzZSBjaGFpbiBmb3IgaG9va25yICovCisJCQljbF9zW2ldLmhvb2ttYXNrIHw9ICgxIDw8IGhvb2tucik7CisJCQljb250aW51ZTsKKwkJfQorbGV0c2NvbnRpbnVlOgorCQllID0gKHZvaWQgKillICsgZS0+bmV4dF9vZmZzZXQ7CisJCXBvcysrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogZG8gdGhlIHBhcnNpbmcgb2YgdGhlIHRhYmxlL2NoYWlucy9lbnRyaWVzL21hdGNoZXMvd2F0Y2hlcnMvdGFyZ2V0cywgaGVoICovCitzdGF0aWMgaW50IHRyYW5zbGF0ZV90YWJsZShzdHJ1Y3QgZWJ0X3JlcGxhY2UgKnJlcGwsCisgICBzdHJ1Y3QgZWJ0X3RhYmxlX2luZm8gKm5ld2luZm8pCit7CisJdW5zaWduZWQgaW50IGksIGosIGssIHVkY19jbnQ7CisJaW50IHJldDsKKwlzdHJ1Y3QgZWJ0X2NsX3N0YWNrICpjbF9zID0gTlVMTDsgLyogdXNlZCBpbiB0aGUgY2hlY2tpbmcgZm9yIGNoYWluIGxvb3BzICovCisKKwlpID0gMDsKKwl3aGlsZSAoaSA8IE5GX0JSX05VTUhPT0tTICYmICEocmVwbC0+dmFsaWRfaG9va3MgJiAoMSA8PCBpKSkpCisJCWkrKzsKKwlpZiAoaSA9PSBORl9CUl9OVU1IT09LUykgeworCQlCVUdQUklOVCgiTm8gdmFsaWQgaG9va3Mgc3BlY2lmaWVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChyZXBsLT5ob29rX2VudHJ5W2ldICE9IChzdHJ1Y3QgZWJ0X2VudHJpZXMgKilyZXBsLT5lbnRyaWVzKSB7CisJCUJVR1BSSU5UKCJDaGFpbnMgZG9uJ3Qgc3RhcnQgYXQgYmVnaW5uaW5nXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIG1ha2Ugc3VyZSBjaGFpbnMgYXJlIG9yZGVyZWQgYWZ0ZXIgZWFjaCBvdGhlciBpbiBzYW1lIG9yZGVyCisJICAgYXMgdGhlaXIgY29ycmVzcG9uZGluZyBob29rcyAqLworCWZvciAoaiA9IGkgKyAxOyBqIDwgTkZfQlJfTlVNSE9PS1M7IGorKykgeworCQlpZiAoIShyZXBsLT52YWxpZF9ob29rcyAmICgxIDw8IGopKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIHJlcGwtPmhvb2tfZW50cnlbal0gPD0gcmVwbC0+aG9va19lbnRyeVtpXSApIHsKKwkJCUJVR1BSSU5UKCJIb29rIG9yZGVyIG11c3QgYmUgZm9sbG93ZWRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaSA9IGo7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE5GX0JSX05VTUhPT0tTOyBpKyspCisJCW5ld2luZm8tPmhvb2tfZW50cnlbaV0gPSBOVUxMOworCisJbmV3aW5mby0+ZW50cmllc19zaXplID0gcmVwbC0+ZW50cmllc19zaXplOworCW5ld2luZm8tPm5lbnRyaWVzID0gcmVwbC0+bmVudHJpZXM7CisKKwkvKiBkbyBzb21lIGVhcmx5IGNoZWNraW5ncyBhbmQgaW5pdGlhbGl6ZSBzb21lIHRoaW5ncyAqLworCWkgPSAwOyAvKiBob2xkcyB0aGUgZXhwZWN0ZWQgbnIuIG9mIGVudHJpZXMgZm9yIHRoZSBjaGFpbiAqLworCWogPSAwOyAvKiBob2xkcyB0aGUgdXAgdG8gbm93IGNvdW50ZWQgZW50cmllcyBmb3IgdGhlIGNoYWluICovCisJayA9IDA7IC8qIGhvbGRzIHRoZSB0b3RhbCBuci4gb2YgZW50cmllcywgc2hvdWxkIGVxdWFsCisJICAgICAgICAgIG5ld2luZm8tPm5lbnRyaWVzIGFmdGVyd2FyZHMgKi8KKwl1ZGNfY250ID0gMDsgLyogd2lsbCBob2xkIHRoZSBuci4gb2YgdXNlciBkZWZpbmVkIGNoYWlucyAodWRjKSAqLworCXJldCA9IEVCVF9FTlRSWV9JVEVSQVRFKG5ld2luZm8tPmVudHJpZXMsIG5ld2luZm8tPmVudHJpZXNfc2l6ZSwKKwkgICBlYnRfY2hlY2tfZW50cnlfc2l6ZV9hbmRfaG9va3MsIG5ld2luZm8sIHJlcGwtPmVudHJpZXMsCisJICAgcmVwbC0+ZW50cmllcyArIHJlcGwtPmVudHJpZXNfc2l6ZSwgcmVwbC0+aG9va19lbnRyeSwgJmksICZqLCAmaywKKwkgICAmdWRjX2NudCwgcmVwbC0+dmFsaWRfaG9va3MpOworCisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGkgIT0gaikgeworCQlCVUdQUklOVCgibmVudHJpZXMgZG9lcyBub3QgZXF1YWwgdGhlIG5yIG9mIGVudHJpZXMgaW4gdGhlICIKKwkJICAgICAgICAgIihsYXN0KSBjaGFpblxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoayAhPSBuZXdpbmZvLT5uZW50cmllcykgeworCQlCVUdQUklOVCgiVG90YWwgbmVudHJpZXMgaXMgd3JvbmdcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBjaGVjayBpZiBhbGwgdmFsaWQgaG9va3MgaGF2ZSBhIGNoYWluICovCisJZm9yIChpID0gMDsgaSA8IE5GX0JSX05VTUhPT0tTOyBpKyspIHsKKwkJaWYgKG5ld2luZm8tPmhvb2tfZW50cnlbaV0gPT0gTlVMTCAmJgorCQkgICAocmVwbC0+dmFsaWRfaG9va3MgJiAoMSA8PCBpKSkpIHsKKwkJCUJVR1BSSU5UKCJWYWxpZCBob29rIHdpdGhvdXQgY2hhaW5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwkvKiBnZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSB1ZGMsIHB1dCB0aGVtIGluIGFuIGFycmF5CisJICAgd2hpbGUgd2UncmUgYXQgaXQsIGFsbG9jYXRlIHRoZSBjaGFpbnN0YWNrICovCisJaWYgKHVkY19jbnQpIHsKKwkJLyogdGhpcyB3aWxsIGdldCBmcmVlJ2QgaW4gZG9fcmVwbGFjZSgpL2VidF9yZWdpc3Rlcl90YWJsZSgpCisJCSAgIGlmIGFuIGVycm9yIG9jY3VycyAqLworCQluZXdpbmZvLT5jaGFpbnN0YWNrID0gKHN0cnVjdCBlYnRfY2hhaW5zdGFjayAqKikKKwkJICAgdm1hbGxvYyhudW1fcG9zc2libGVfY3B1cygpICogc2l6ZW9mKHN0cnVjdCBlYnRfY2hhaW5zdGFjaykpOworCQlpZiAoIW5ld2luZm8tPmNoYWluc3RhY2spCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9wb3NzaWJsZV9jcHVzKCk7IGkrKykgeworCQkJbmV3aW5mby0+Y2hhaW5zdGFja1tpXSA9CisJCQkgICB2bWFsbG9jKHVkY19jbnQgKiBzaXplb2Yoc3RydWN0IGVidF9jaGFpbnN0YWNrKSk7CisJCQlpZiAoIW5ld2luZm8tPmNoYWluc3RhY2tbaV0pIHsKKwkJCQl3aGlsZSAoaSkKKwkJCQkJdmZyZWUobmV3aW5mby0+Y2hhaW5zdGFja1stLWldKTsKKwkJCQl2ZnJlZShuZXdpbmZvLT5jaGFpbnN0YWNrKTsKKwkJCQluZXdpbmZvLT5jaGFpbnN0YWNrID0gTlVMTDsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJfQorCisJCWNsX3MgPSAoc3RydWN0IGVidF9jbF9zdGFjayAqKQorCQkgICB2bWFsbG9jKHVkY19jbnQgKiBzaXplb2Yoc3RydWN0IGVidF9jbF9zdGFjaykpOworCQlpZiAoIWNsX3MpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJaSA9IDA7IC8qIHRoZSBpJ3RoIHVkYyAqLworCQlFQlRfRU5UUllfSVRFUkFURShuZXdpbmZvLT5lbnRyaWVzLCBuZXdpbmZvLT5lbnRyaWVzX3NpemUsCisJCSAgIGVidF9nZXRfdWRjX3Bvc2l0aW9ucywgbmV3aW5mbywgcmVwbC0+aG9va19lbnRyeSwgJmksCisJCSAgIHJlcGwtPnZhbGlkX2hvb2tzLCBjbF9zKTsKKwkJLyogc2FuaXR5IGNoZWNrICovCisJCWlmIChpICE9IHVkY19jbnQpIHsKKwkJCUJVR1BSSU5UKCJpICE9IHVkY19jbnRcbiIpOworCQkJdmZyZWUoY2xfcyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKworCS8qIENoZWNrIGZvciBsb29wcyAqLworCWZvciAoaSA9IDA7IGkgPCBORl9CUl9OVU1IT09LUzsgaSsrKQorCQlpZiAocmVwbC0+dmFsaWRfaG9va3MgJiAoMSA8PCBpKSkKKwkJCWlmIChjaGVja19jaGFpbmxvb3BzKG5ld2luZm8tPmhvb2tfZW50cnlbaV0sCisJCQkgICBjbF9zLCB1ZGNfY250LCBpLCBuZXdpbmZvLT5lbnRyaWVzKSkgeworCQkJCWlmIChjbF9zKQorCQkJCQl2ZnJlZShjbF9zKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCS8qIHdlIG5vdyBrbm93IHRoZSBmb2xsb3dpbmcgKGFsb25nIHdpdGggRT1tY7IpOgorCSAgIC0gdGhlIG5yIG9mIGVudHJpZXMgaW4gZWFjaCBjaGFpbiBpcyByaWdodAorCSAgIC0gdGhlIHNpemUgb2YgdGhlIGFsbG9jYXRlZCBzcGFjZSBpcyByaWdodAorCSAgIC0gYWxsIHZhbGlkIGhvb2tzIGhhdmUgYSBjb3JyZXNwb25kaW5nIGNoYWluCisJICAgLSB0aGVyZSBhcmUgbm8gbG9vcHMKKwkgICAtIHdyb25nIGRhdGEgY2FuIHN0aWxsIGJlIG9uIHRoZSBsZXZlbCBvZiBhIHNpbmdsZSBlbnRyeQorCSAgIC0gY291bGQgYmUgdGhlcmUgYXJlIGp1bXBzIHRvIHBsYWNlcyB0aGF0IGFyZSBub3QgdGhlCisJICAgICBiZWdpbm5pbmcgb2YgYSBjaGFpbi4gVGhpcyBjYW4gb25seSBvY2N1ciBpbiBjaGFpbnMgdGhhdAorCSAgICAgYXJlIG5vdCBhY2Nlc3NpYmxlIGZyb20gYW55IGJhc2UgY2hhaW5zLCBzbyB3ZSBkb24ndCBjYXJlLiAqLworCisJLyogdXNlZCB0byBrbm93IHdoYXQgd2UgbmVlZCB0byBjbGVhbiB1cCBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyAqLworCWkgPSAwOworCXJldCA9IEVCVF9FTlRSWV9JVEVSQVRFKG5ld2luZm8tPmVudHJpZXMsIG5ld2luZm8tPmVudHJpZXNfc2l6ZSwKKwkgICBlYnRfY2hlY2tfZW50cnksIG5ld2luZm8sIHJlcGwtPm5hbWUsICZpLCByZXBsLT52YWxpZF9ob29rcywKKwkgICBjbF9zLCB1ZGNfY250KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJRUJUX0VOVFJZX0lURVJBVEUobmV3aW5mby0+ZW50cmllcywgbmV3aW5mby0+ZW50cmllc19zaXplLAorCQkgICBlYnRfY2xlYW51cF9lbnRyeSwgJmkpOworCX0KKwlpZiAoY2xfcykKKwkJdmZyZWUoY2xfcyk7CisJcmV0dXJuIHJldDsKK30KKworLyogY2FsbGVkIHVuZGVyIHdyaXRlX2xvY2sgKi8KK3N0YXRpYyB2b2lkIGdldF9jb3VudGVycyhzdHJ1Y3QgZWJ0X2NvdW50ZXIgKm9sZGNvdW50ZXJzLAorICAgc3RydWN0IGVidF9jb3VudGVyICpjb3VudGVycywgdW5zaWduZWQgaW50IG5lbnRyaWVzKQoreworCWludCBpLCBjcHU7CisJc3RydWN0IGVidF9jb3VudGVyICpjb3VudGVyX2Jhc2U7CisKKwkvKiBjb3VudGVycyBvZiBjcHUgMCAqLworCW1lbWNweShjb3VudGVycywgb2xkY291bnRlcnMsCisJICAgc2l6ZW9mKHN0cnVjdCBlYnRfY291bnRlcikgKiBuZW50cmllcyk7CisJLyogYWRkIG90aGVyIGNvdW50ZXJzIHRvIHRob3NlIG9mIGNwdSAwICovCisJZm9yIChjcHUgPSAxOyBjcHUgPCBudW1fcG9zc2libGVfY3B1cygpOyBjcHUrKykgeworCQljb3VudGVyX2Jhc2UgPSBDT1VOVEVSX0JBU0Uob2xkY291bnRlcnMsIG5lbnRyaWVzLCBjcHUpOworCQlmb3IgKGkgPSAwOyBpIDwgbmVudHJpZXM7IGkrKykgeworCQkJY291bnRlcnNbaV0ucGNudCArPSBjb3VudGVyX2Jhc2VbaV0ucGNudDsKKwkJCWNvdW50ZXJzW2ldLmJjbnQgKz0gY291bnRlcl9iYXNlW2ldLmJjbnQ7CisJCX0KKwl9Cit9CisKKy8qIHJlcGxhY2UgdGhlIHRhYmxlICovCitzdGF0aWMgaW50IGRvX3JlcGxhY2Uodm9pZCBfX3VzZXIgKnVzZXIsIHVuc2lnbmVkIGludCBsZW4pCit7CisJaW50IHJldCwgaSwgY291bnRlcnNpemU7CisJc3RydWN0IGVidF90YWJsZV9pbmZvICpuZXdpbmZvOworCXN0cnVjdCBlYnRfcmVwbGFjZSB0bXA7CisJc3RydWN0IGVidF90YWJsZSAqdDsKKwlzdHJ1Y3QgZWJ0X2NvdW50ZXIgKmNvdW50ZXJzdG1wID0gTlVMTDsKKwkvKiB1c2VkIHRvIGJlIGFibGUgdG8gdW5sb2NrIGVhcmxpZXIgKi8KKwlzdHJ1Y3QgZWJ0X3RhYmxlX2luZm8gKnRhYmxlOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXAsIHVzZXIsIHNpemVvZih0bXApKSAhPSAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChsZW4gIT0gc2l6ZW9mKHRtcCkgKyB0bXAuZW50cmllc19zaXplKSB7CisJCUJVR1BSSU5UKCJXcm9uZyBsZW4gYXJndW1lbnRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodG1wLmVudHJpZXNfc2l6ZSA9PSAwKSB7CisJCUJVR1BSSU5UKCJFbnRyaWVzX3NpemUgbmV2ZXIgemVyb1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwljb3VudGVyc2l6ZSA9IENPVU5URVJfT0ZGU0VUKHRtcC5uZW50cmllcykgKiBudW1fcG9zc2libGVfY3B1cygpOworCW5ld2luZm8gPSAoc3RydWN0IGVidF90YWJsZV9pbmZvICopCisJICAgdm1hbGxvYyhzaXplb2Yoc3RydWN0IGVidF90YWJsZV9pbmZvKSArIGNvdW50ZXJzaXplKTsKKwlpZiAoIW5ld2luZm8pCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGNvdW50ZXJzaXplKQorCQltZW1zZXQobmV3aW5mby0+Y291bnRlcnMsIDAsIGNvdW50ZXJzaXplKTsKKworCW5ld2luZm8tPmVudHJpZXMgPSAoY2hhciAqKXZtYWxsb2ModG1wLmVudHJpZXNfc2l6ZSk7CisJaWYgKCFuZXdpbmZvLT5lbnRyaWVzKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZnJlZV9uZXdpbmZvOworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIoCisJICAgbmV3aW5mby0+ZW50cmllcywgdG1wLmVudHJpZXMsIHRtcC5lbnRyaWVzX3NpemUpICE9IDApIHsKKwkJQlVHUFJJTlQoIkNvdWxkbid0IGNvcHkgZW50cmllcyBmcm9tIHVzZXJzcGFjZVxuIik7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZnJlZV9lbnRyaWVzOworCX0KKworCS8qIHRoZSB1c2VyIHdhbnRzIGNvdW50ZXJzIGJhY2sKKwkgICB0aGUgY2hlY2sgb24gdGhlIHNpemUgaXMgZG9uZSBsYXRlciwgd2hlbiB3ZSBoYXZlIHRoZSBsb2NrICovCisJaWYgKHRtcC5udW1fY291bnRlcnMpIHsKKwkJY291bnRlcnN0bXAgPSAoc3RydWN0IGVidF9jb3VudGVyICopCisJCSAgIHZtYWxsb2ModG1wLm51bV9jb3VudGVycyAqIHNpemVvZihzdHJ1Y3QgZWJ0X2NvdW50ZXIpKTsKKwkJaWYgKCFjb3VudGVyc3RtcCkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZnJlZV9lbnRyaWVzOworCQl9CisJfQorCWVsc2UKKwkJY291bnRlcnN0bXAgPSBOVUxMOworCisJLyogdGhpcyBjYW4gZ2V0IGluaXRpYWxpemVkIGJ5IHRyYW5zbGF0ZV90YWJsZSgpICovCisJbmV3aW5mby0+Y2hhaW5zdGFjayA9IE5VTEw7CisJcmV0ID0gdHJhbnNsYXRlX3RhYmxlKCZ0bXAsIG5ld2luZm8pOworCisJaWYgKHJldCAhPSAwKQorCQlnb3RvIGZyZWVfY291bnRlcnN0bXA7CisKKwl0ID0gZmluZF90YWJsZV9sb2NrKHRtcC5uYW1lLCAmcmV0LCAmZWJ0X211dGV4KTsKKwlpZiAoIXQpIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBmcmVlX2l0ZXJhdGU7CisJfQorCisJLyogdGhlIHRhYmxlIGRvZXNuJ3QgbGlrZSBpdCAqLworCWlmICh0LT5jaGVjayAmJiAocmV0ID0gdC0+Y2hlY2sobmV3aW5mbywgdG1wLnZhbGlkX2hvb2tzKSkpCisJCWdvdG8gZnJlZV91bmxvY2s7CisKKwlpZiAodG1wLm51bV9jb3VudGVycyAmJiB0bXAubnVtX2NvdW50ZXJzICE9IHQtPnByaXZhdGUtPm5lbnRyaWVzKSB7CisJCUJVR1BSSU5UKCJXcm9uZyBuci4gb2YgY291bnRlcnMgcmVxdWVzdGVkXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmcmVlX3VubG9jazsKKwl9CisKKwkvKiB3ZSBoYXZlIHRoZSBtdXRleCBsb2NrLCBzbyBubyBkYW5nZXIgaW4gcmVhZGluZyB0aGlzIHBvaW50ZXIgKi8KKwl0YWJsZSA9IHQtPnByaXZhdGU7CisJLyogbWFrZSBzdXJlIHRoZSB0YWJsZSBjYW4gb25seSBiZSBybW1vZCdlZCBpZiBpdCBjb250YWlucyBubyBydWxlcyAqLworCWlmICghdGFibGUtPm5lbnRyaWVzICYmIG5ld2luZm8tPm5lbnRyaWVzICYmICF0cnlfbW9kdWxlX2dldCh0LT5tZSkpIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBmcmVlX3VubG9jazsKKwl9IGVsc2UgaWYgKHRhYmxlLT5uZW50cmllcyAmJiAhbmV3aW5mby0+bmVudHJpZXMpCisJCW1vZHVsZV9wdXQodC0+bWUpOworCS8qIHdlIG5lZWQgYW4gYXRvbWljIHNuYXBzaG90IG9mIHRoZSBjb3VudGVycyAqLworCXdyaXRlX2xvY2tfYmgoJnQtPmxvY2spOworCWlmICh0bXAubnVtX2NvdW50ZXJzKQorCQlnZXRfY291bnRlcnModC0+cHJpdmF0ZS0+Y291bnRlcnMsIGNvdW50ZXJzdG1wLAorCQkgICB0LT5wcml2YXRlLT5uZW50cmllcyk7CisKKwl0LT5wcml2YXRlID0gbmV3aW5mbzsKKwl3cml0ZV91bmxvY2tfYmgoJnQtPmxvY2spOworCXVwKCZlYnRfbXV0ZXgpOworCS8qIHNvLCBhIHVzZXIgY2FuIGNoYW5nZSB0aGUgY2hhaW5zIHdoaWxlIGhhdmluZyBtZXNzZWQgdXAgaGVyIGNvdW50ZXIKKwkgICBhbGxvY2F0aW9uLiBPbmx5IHJlYXNvbiB3aHkgdGhpcyBpcyBkb25lIGlzIGJlY2F1c2UgdGhpcyB3YXkgdGhlIGxvY2sKKwkgICBpcyBoZWxkIG9ubHkgb25jZSwgd2hpbGUgdGhpcyBkb2Vzbid0IGJyaW5nIHRoZSBrZXJuZWwgaW50byBhCisJICAgZGFuZ2Vyb3VzIHN0YXRlLiAqLworCWlmICh0bXAubnVtX2NvdW50ZXJzICYmCisJICAgY29weV90b191c2VyKHRtcC5jb3VudGVycywgY291bnRlcnN0bXAsCisJICAgdG1wLm51bV9jb3VudGVycyAqIHNpemVvZihzdHJ1Y3QgZWJ0X2NvdW50ZXIpKSkgeworCQlCVUdQUklOVCgiQ291bGRuJ3QgY29weSBjb3VudGVycyB0byB1c2Vyc3BhY2VcbiIpOworCQlyZXQgPSAtRUZBVUxUOworCX0KKwllbHNlCisJCXJldCA9IDA7CisKKwkvKiBkZWNyZWFzZSBtb2R1bGUgY291bnQgYW5kIGZyZWUgcmVzb3VyY2VzICovCisJRUJUX0VOVFJZX0lURVJBVEUodGFibGUtPmVudHJpZXMsIHRhYmxlLT5lbnRyaWVzX3NpemUsCisJICAgZWJ0X2NsZWFudXBfZW50cnksIE5VTEwpOworCisJdmZyZWUodGFibGUtPmVudHJpZXMpOworCWlmICh0YWJsZS0+Y2hhaW5zdGFjaykgeworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3Bvc3NpYmxlX2NwdXMoKTsgaSsrKQorCQkJdmZyZWUodGFibGUtPmNoYWluc3RhY2tbaV0pOworCQl2ZnJlZSh0YWJsZS0+Y2hhaW5zdGFjayk7CisJfQorCXZmcmVlKHRhYmxlKTsKKworCWlmIChjb3VudGVyc3RtcCkKKwkJdmZyZWUoY291bnRlcnN0bXApOworCXJldHVybiByZXQ7CisKK2ZyZWVfdW5sb2NrOgorCXVwKCZlYnRfbXV0ZXgpOworZnJlZV9pdGVyYXRlOgorCUVCVF9FTlRSWV9JVEVSQVRFKG5ld2luZm8tPmVudHJpZXMsIG5ld2luZm8tPmVudHJpZXNfc2l6ZSwKKwkgICBlYnRfY2xlYW51cF9lbnRyeSwgTlVMTCk7CitmcmVlX2NvdW50ZXJzdG1wOgorCWlmIChjb3VudGVyc3RtcCkKKwkJdmZyZWUoY291bnRlcnN0bXApOworCS8qIGNhbiBiZSBpbml0aWFsaXplZCBpbiB0cmFuc2xhdGVfdGFibGUoKSAqLworCWlmIChuZXdpbmZvLT5jaGFpbnN0YWNrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fcG9zc2libGVfY3B1cygpOyBpKyspCisJCQl2ZnJlZShuZXdpbmZvLT5jaGFpbnN0YWNrW2ldKTsKKwkJdmZyZWUobmV3aW5mby0+Y2hhaW5zdGFjayk7CisJfQorZnJlZV9lbnRyaWVzOgorCWlmIChuZXdpbmZvLT5lbnRyaWVzKQorCQl2ZnJlZShuZXdpbmZvLT5lbnRyaWVzKTsKK2ZyZWVfbmV3aW5mbzoKKwlpZiAobmV3aW5mbykKKwkJdmZyZWUobmV3aW5mbyk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGVidF9yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGVidF90YXJnZXQgKnRhcmdldCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZlYnRfbXV0ZXgpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAoIWxpc3RfbmFtZWRfaW5zZXJ0KCZlYnRfdGFyZ2V0cywgdGFyZ2V0KSkgeworCQl1cCgmZWJ0X211dGV4KTsKKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCXVwKCZlYnRfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZWJ0X3VucmVnaXN0ZXJfdGFyZ2V0KHN0cnVjdCBlYnRfdGFyZ2V0ICp0YXJnZXQpCit7CisJZG93bigmZWJ0X211dGV4KTsKKwlMSVNUX0RFTEVURSgmZWJ0X3RhcmdldHMsIHRhcmdldCk7CisJdXAoJmVidF9tdXRleCk7Cit9CisKK2ludCBlYnRfcmVnaXN0ZXJfbWF0Y2goc3RydWN0IGVidF9tYXRjaCAqbWF0Y2gpCit7CisJaW50IHJldDsKKworCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmZWJ0X211dGV4KTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisJaWYgKCFsaXN0X25hbWVkX2luc2VydCgmZWJ0X21hdGNoZXMsIG1hdGNoKSkgeworCQl1cCgmZWJ0X211dGV4KTsKKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCXVwKCZlYnRfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZWJ0X3VucmVnaXN0ZXJfbWF0Y2goc3RydWN0IGVidF9tYXRjaCAqbWF0Y2gpCit7CisJZG93bigmZWJ0X211dGV4KTsKKwlMSVNUX0RFTEVURSgmZWJ0X21hdGNoZXMsIG1hdGNoKTsKKwl1cCgmZWJ0X211dGV4KTsKK30KKworaW50IGVidF9yZWdpc3Rlcl93YXRjaGVyKHN0cnVjdCBlYnRfd2F0Y2hlciAqd2F0Y2hlcikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZlYnRfbXV0ZXgpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAoIWxpc3RfbmFtZWRfaW5zZXJ0KCZlYnRfd2F0Y2hlcnMsIHdhdGNoZXIpKSB7CisJCXVwKCZlYnRfbXV0ZXgpOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisJdXAoJmVidF9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBlYnRfdW5yZWdpc3Rlcl93YXRjaGVyKHN0cnVjdCBlYnRfd2F0Y2hlciAqd2F0Y2hlcikKK3sKKwlkb3duKCZlYnRfbXV0ZXgpOworCUxJU1RfREVMRVRFKCZlYnRfd2F0Y2hlcnMsIHdhdGNoZXIpOworCXVwKCZlYnRfbXV0ZXgpOworfQorCitpbnQgZWJ0X3JlZ2lzdGVyX3RhYmxlKHN0cnVjdCBlYnRfdGFibGUgKnRhYmxlKQoreworCXN0cnVjdCBlYnRfdGFibGVfaW5mbyAqbmV3aW5mbzsKKwlpbnQgcmV0LCBpLCBjb3VudGVyc2l6ZTsKKworCWlmICghdGFibGUgfHwgIXRhYmxlLT50YWJsZSB8fCF0YWJsZS0+dGFibGUtPmVudHJpZXMgfHwKKwkgICAgdGFibGUtPnRhYmxlLT5lbnRyaWVzX3NpemUgPT0gMCB8fAorCSAgICB0YWJsZS0+dGFibGUtPmNvdW50ZXJzIHx8IHRhYmxlLT5wcml2YXRlKSB7CisJCUJVR1BSSU5UKCJCYWQgdGFibGUgZGF0YSBmb3IgZWJ0X3JlZ2lzdGVyX3RhYmxlISEhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY291bnRlcnNpemUgPSBDT1VOVEVSX09GRlNFVCh0YWJsZS0+dGFibGUtPm5lbnRyaWVzKSAqIG51bV9wb3NzaWJsZV9jcHVzKCk7CisJbmV3aW5mbyA9IChzdHJ1Y3QgZWJ0X3RhYmxlX2luZm8gKikKKwkgICB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgZWJ0X3RhYmxlX2luZm8pICsgY291bnRlcnNpemUpOworCXJldCA9IC1FTk9NRU07CisJaWYgKCFuZXdpbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5ld2luZm8tPmVudHJpZXMgPSAoY2hhciAqKXZtYWxsb2ModGFibGUtPnRhYmxlLT5lbnRyaWVzX3NpemUpOworCWlmICghKG5ld2luZm8tPmVudHJpZXMpKQorCQlnb3RvIGZyZWVfbmV3aW5mbzsKKworCW1lbWNweShuZXdpbmZvLT5lbnRyaWVzLCB0YWJsZS0+dGFibGUtPmVudHJpZXMsCisJICAgdGFibGUtPnRhYmxlLT5lbnRyaWVzX3NpemUpOworCisJaWYgKGNvdW50ZXJzaXplKQorCQltZW1zZXQobmV3aW5mby0+Y291bnRlcnMsIDAsIGNvdW50ZXJzaXplKTsKKworCS8qIGZpbGwgaW4gbmV3aW5mbyBhbmQgcGFyc2UgdGhlIGVudHJpZXMgKi8KKwluZXdpbmZvLT5jaGFpbnN0YWNrID0gTlVMTDsKKwlyZXQgPSB0cmFuc2xhdGVfdGFibGUodGFibGUtPnRhYmxlLCBuZXdpbmZvKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJQlVHUFJJTlQoIlRyYW5zbGF0ZV90YWJsZSBmYWlsZWRcbiIpOworCQlnb3RvIGZyZWVfY2hhaW5zdGFjazsKKwl9CisKKwlpZiAodGFibGUtPmNoZWNrICYmIHRhYmxlLT5jaGVjayhuZXdpbmZvLCB0YWJsZS0+dmFsaWRfaG9va3MpKSB7CisJCUJVR1BSSU5UKCJUaGUgdGFibGUgZG9lc24ndCBsaWtlIGl0cyBvd24gaW5pdGlhbCBkYXRhLCBsb2xcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl0YWJsZS0+cHJpdmF0ZSA9IG5ld2luZm87CisJcndsb2NrX2luaXQoJnRhYmxlLT5sb2NrKTsKKwlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJmVidF9tdXRleCk7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIGZyZWVfY2hhaW5zdGFjazsKKworCWlmIChsaXN0X25hbWVkX2ZpbmQoJmVidF90YWJsZXMsIHRhYmxlLT5uYW1lKSkgeworCQlyZXQgPSAtRUVYSVNUOworCQlCVUdQUklOVCgiVGFibGUgbmFtZSBhbHJlYWR5IGV4aXN0c1xuIik7CisJCWdvdG8gZnJlZV91bmxvY2s7CisJfQorCisJLyogSG9sZCBhIHJlZmVyZW5jZSBjb3VudCBpZiB0aGUgY2hhaW5zIGFyZW4ndCBlbXB0eSAqLworCWlmIChuZXdpbmZvLT5uZW50cmllcyAmJiAhdHJ5X21vZHVsZV9nZXQodGFibGUtPm1lKSkgeworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGZyZWVfdW5sb2NrOworCX0KKwlsaXN0X3ByZXBlbmQoJmVidF90YWJsZXMsIHRhYmxlKTsKKwl1cCgmZWJ0X211dGV4KTsKKwlyZXR1cm4gMDsKK2ZyZWVfdW5sb2NrOgorCXVwKCZlYnRfbXV0ZXgpOworZnJlZV9jaGFpbnN0YWNrOgorCWlmIChuZXdpbmZvLT5jaGFpbnN0YWNrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fcG9zc2libGVfY3B1cygpOyBpKyspCisJCQl2ZnJlZShuZXdpbmZvLT5jaGFpbnN0YWNrW2ldKTsKKwkJdmZyZWUobmV3aW5mby0+Y2hhaW5zdGFjayk7CisJfQorCXZmcmVlKG5ld2luZm8tPmVudHJpZXMpOworZnJlZV9uZXdpbmZvOgorCXZmcmVlKG5ld2luZm8pOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgZWJ0X3VucmVnaXN0ZXJfdGFibGUoc3RydWN0IGVidF90YWJsZSAqdGFibGUpCit7CisJaW50IGk7CisKKwlpZiAoIXRhYmxlKSB7CisJCUJVR1BSSU5UKCJSZXF1ZXN0IHRvIHVucmVnaXN0ZXIgTlVMTCB0YWJsZSEhIVxuIik7CisJCXJldHVybjsKKwl9CisJZG93bigmZWJ0X211dGV4KTsKKwlMSVNUX0RFTEVURSgmZWJ0X3RhYmxlcywgdGFibGUpOworCXVwKCZlYnRfbXV0ZXgpOworCWlmICh0YWJsZS0+cHJpdmF0ZS0+ZW50cmllcykKKwkJdmZyZWUodGFibGUtPnByaXZhdGUtPmVudHJpZXMpOworCWlmICh0YWJsZS0+cHJpdmF0ZS0+Y2hhaW5zdGFjaykgeworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3Bvc3NpYmxlX2NwdXMoKTsgaSsrKQorCQkJdmZyZWUodGFibGUtPnByaXZhdGUtPmNoYWluc3RhY2tbaV0pOworCQl2ZnJlZSh0YWJsZS0+cHJpdmF0ZS0+Y2hhaW5zdGFjayk7CisJfQorCXZmcmVlKHRhYmxlLT5wcml2YXRlKTsKK30KKworLyogdXNlcnNwYWNlIGp1c3Qgc3VwcGxpZWQgdXMgd2l0aCBjb3VudGVycyAqLworc3RhdGljIGludCB1cGRhdGVfY291bnRlcnModm9pZCBfX3VzZXIgKnVzZXIsIHVuc2lnbmVkIGludCBsZW4pCit7CisJaW50IGksIHJldDsKKwlzdHJ1Y3QgZWJ0X2NvdW50ZXIgKnRtcDsKKwlzdHJ1Y3QgZWJ0X3JlcGxhY2UgaGxwOworCXN0cnVjdCBlYnRfdGFibGUgKnQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmhscCwgdXNlciwgc2l6ZW9mKGhscCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChsZW4gIT0gc2l6ZW9mKGhscCkgKyBobHAubnVtX2NvdW50ZXJzICogc2l6ZW9mKHN0cnVjdCBlYnRfY291bnRlcikpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChobHAubnVtX2NvdW50ZXJzID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCAhKHRtcCA9IChzdHJ1Y3QgZWJ0X2NvdW50ZXIgKikKKwkgICB2bWFsbG9jKGhscC5udW1fY291bnRlcnMgKiBzaXplb2Yoc3RydWN0IGVidF9jb3VudGVyKSkpICl7CisJCU1FTVBSSU5UKCJVcGRhdGVfY291bnRlcnMgJiYgbm9tZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl0ID0gZmluZF90YWJsZV9sb2NrKGhscC5uYW1lLCAmcmV0LCAmZWJ0X211dGV4KTsKKwlpZiAoIXQpCisJCWdvdG8gZnJlZV90bXA7CisKKwlpZiAoaGxwLm51bV9jb3VudGVycyAhPSB0LT5wcml2YXRlLT5uZW50cmllcykgeworCQlCVUdQUklOVCgiV3JvbmcgbnIgb2YgY291bnRlcnNcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHVubG9ja19tdXRleDsKKwl9CisKKwlpZiAoIGNvcHlfZnJvbV91c2VyKHRtcCwgaGxwLmNvdW50ZXJzLAorCSAgIGhscC5udW1fY291bnRlcnMgKiBzaXplb2Yoc3RydWN0IGVidF9jb3VudGVyKSkgKSB7CisJCUJVR1BSSU5UKCJVcGRhdGFfY291bnRlcnMgJiYgIWNmdVxuIik7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gdW5sb2NrX211dGV4OworCX0KKworCS8qIHdlIHdhbnQgYW4gYXRvbWljIGFkZCBvZiB0aGUgY291bnRlcnMgKi8KKwl3cml0ZV9sb2NrX2JoKCZ0LT5sb2NrKTsKKworCS8qIHdlIGFkZCB0byB0aGUgY291bnRlcnMgb2YgdGhlIGZpcnN0IGNwdSAqLworCWZvciAoaSA9IDA7IGkgPCBobHAubnVtX2NvdW50ZXJzOyBpKyspIHsKKwkJdC0+cHJpdmF0ZS0+Y291bnRlcnNbaV0ucGNudCArPSB0bXBbaV0ucGNudDsKKwkJdC0+cHJpdmF0ZS0+Y291bnRlcnNbaV0uYmNudCArPSB0bXBbaV0uYmNudDsKKwl9CisKKwl3cml0ZV91bmxvY2tfYmgoJnQtPmxvY2spOworCXJldCA9IDA7Cit1bmxvY2tfbXV0ZXg6CisJdXAoJmVidF9tdXRleCk7CitmcmVlX3RtcDoKKwl2ZnJlZSh0bXApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGVidF9tYWtlX21hdGNobmFtZShzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptLAorICAgY2hhciAqYmFzZSwgY2hhciAqdWJhc2UpCit7CisJY2hhciAqaGxwID0gdWJhc2UgLSBiYXNlICsgKGNoYXIgKiltOworCWlmIChjb3B5X3RvX3VzZXIoaGxwLCBtLT51Lm1hdGNoLT5uYW1lLCBFQlRfRlVOQ1RJT05fTUFYTkFNRUxFTikpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBlYnRfbWFrZV93YXRjaGVybmFtZShzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIgKncsCisgICBjaGFyICpiYXNlLCBjaGFyICp1YmFzZSkKK3sKKwljaGFyICpobHAgPSB1YmFzZSAtIGJhc2UgKyAoY2hhciAqKXc7CisJaWYgKGNvcHlfdG9fdXNlcihobHAgLCB3LT51LndhdGNoZXItPm5hbWUsIEVCVF9GVU5DVElPTl9NQVhOQU1FTEVOKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGVidF9tYWtlX25hbWVzKHN0cnVjdCBlYnRfZW50cnkgKmUsIGNoYXIgKmJhc2UsIGNoYXIgKnViYXNlKQoreworCWludCByZXQ7CisJY2hhciAqaGxwOworCXN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICp0OworCisJaWYgKChlLT5iaXRtYXNrICYgRUJUX0VOVFJZX09SX0VOVFJJRVMpID09IDApCisJCXJldHVybiAwOworCisJaGxwID0gdWJhc2UgLSBiYXNlICsgKGNoYXIgKillICsgZS0+dGFyZ2V0X29mZnNldDsKKwl0ID0gKHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICopKCgoY2hhciAqKWUpICsgZS0+dGFyZ2V0X29mZnNldCk7CisJCisJcmV0ID0gRUJUX01BVENIX0lURVJBVEUoZSwgZWJ0X21ha2VfbWF0Y2huYW1lLCBiYXNlLCB1YmFzZSk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCXJldCA9IEVCVF9XQVRDSEVSX0lURVJBVEUoZSwgZWJ0X21ha2Vfd2F0Y2hlcm5hbWUsIGJhc2UsIHViYXNlKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisJaWYgKGNvcHlfdG9fdXNlcihobHAsIHQtPnUudGFyZ2V0LT5uYW1lLCBFQlRfRlVOQ1RJT05fTUFYTkFNRUxFTikpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisvKiBjYWxsZWQgd2l0aCBlYnRfbXV0ZXggZG93biAqLworc3RhdGljIGludCBjb3B5X2V2ZXJ5dGhpbmdfdG9fdXNlcihzdHJ1Y3QgZWJ0X3RhYmxlICp0LCB2b2lkIF9fdXNlciAqdXNlciwKKyAgIGludCAqbGVuLCBpbnQgY21kKQoreworCXN0cnVjdCBlYnRfcmVwbGFjZSB0bXA7CisJc3RydWN0IGVidF9jb3VudGVyICpjb3VudGVyc3RtcCwgKm9sZGNvdW50ZXJzOworCXVuc2lnbmVkIGludCBlbnRyaWVzX3NpemUsIG5lbnRyaWVzOworCWNoYXIgKmVudHJpZXM7CisKKwlpZiAoY21kID09IEVCVF9TT19HRVRfRU5UUklFUykgeworCQllbnRyaWVzX3NpemUgPSB0LT5wcml2YXRlLT5lbnRyaWVzX3NpemU7CisJCW5lbnRyaWVzID0gdC0+cHJpdmF0ZS0+bmVudHJpZXM7CisJCWVudHJpZXMgPSB0LT5wcml2YXRlLT5lbnRyaWVzOworCQlvbGRjb3VudGVycyA9IHQtPnByaXZhdGUtPmNvdW50ZXJzOworCX0gZWxzZSB7CisJCWVudHJpZXNfc2l6ZSA9IHQtPnRhYmxlLT5lbnRyaWVzX3NpemU7CisJCW5lbnRyaWVzID0gdC0+dGFibGUtPm5lbnRyaWVzOworCQllbnRyaWVzID0gdC0+dGFibGUtPmVudHJpZXM7CisJCW9sZGNvdW50ZXJzID0gdC0+dGFibGUtPmNvdW50ZXJzOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wLCB1c2VyLCBzaXplb2YodG1wKSkpIHsKKwkJQlVHUFJJTlQoIkNmdSBkaWRuJ3Qgd29ya1xuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmICgqbGVuICE9IHNpemVvZihzdHJ1Y3QgZWJ0X3JlcGxhY2UpICsgZW50cmllc19zaXplICsKKwkgICAodG1wLm51bV9jb3VudGVycz8gbmVudHJpZXMgKiBzaXplb2Yoc3RydWN0IGVidF9jb3VudGVyKTogMCkpIHsKKwkJQlVHUFJJTlQoIldyb25nIHNpemVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodG1wLm5lbnRyaWVzICE9IG5lbnRyaWVzKSB7CisJCUJVR1BSSU5UKCJOZW50cmllcyB3cm9uZ1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh0bXAuZW50cmllc19zaXplICE9IGVudHJpZXNfc2l6ZSkgeworCQlCVUdQUklOVCgiV3Jvbmcgc2l6ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHVzZXJzcGFjZSBtaWdodCBub3QgbmVlZCB0aGUgY291bnRlcnMgKi8KKwlpZiAodG1wLm51bV9jb3VudGVycykgeworCQlpZiAodG1wLm51bV9jb3VudGVycyAhPSBuZW50cmllcykgeworCQkJQlVHUFJJTlQoIk51bV9jb3VudGVycyB3cm9uZ1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQljb3VudGVyc3RtcCA9IChzdHJ1Y3QgZWJ0X2NvdW50ZXIgKikKKwkJICAgdm1hbGxvYyhuZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgZWJ0X2NvdW50ZXIpKTsKKwkJaWYgKCFjb3VudGVyc3RtcCkgeworCQkJTUVNUFJJTlQoIkNvdWxkbid0IGNvcHkgY291bnRlcnMsIG91dCBvZiBtZW1vcnlcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJd3JpdGVfbG9ja19iaCgmdC0+bG9jayk7CisJCWdldF9jb3VudGVycyhvbGRjb3VudGVycywgY291bnRlcnN0bXAsIG5lbnRyaWVzKTsKKwkJd3JpdGVfdW5sb2NrX2JoKCZ0LT5sb2NrKTsKKworCQlpZiAoY29weV90b191c2VyKHRtcC5jb3VudGVycywgY291bnRlcnN0bXAsCisJCSAgIG5lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBlYnRfY291bnRlcikpKSB7CisJCQlCVUdQUklOVCgiQ291bGRuJ3QgY29weSBjb3VudGVycyB0byB1c2Vyc3BhY2VcbiIpOworCQkJdmZyZWUoY291bnRlcnN0bXApOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJdmZyZWUoY291bnRlcnN0bXApOworCX0KKworCWlmIChjb3B5X3RvX3VzZXIodG1wLmVudHJpZXMsIGVudHJpZXMsIGVudHJpZXNfc2l6ZSkpIHsKKwkJQlVHUFJJTlQoIkNvdWxkbid0IGNvcHkgZW50cmllcyB0byB1c2Vyc3BhY2VcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJLyogc2V0IHRoZSBtYXRjaC93YXRjaGVyL3RhcmdldCBuYW1lcyByaWdodCAqLworCXJldHVybiBFQlRfRU5UUllfSVRFUkFURShlbnRyaWVzLCBlbnRyaWVzX3NpemUsCisJICAgZWJ0X21ha2VfbmFtZXMsIGVudHJpZXMsIHRtcC5lbnRyaWVzKTsKK30KKworc3RhdGljIGludCBkb19lYnRfc2V0X2N0bChzdHJ1Y3Qgc29jayAqc2ssCisJaW50IGNtZCwgdm9pZCBfX3VzZXIgKnVzZXIsIHVuc2lnbmVkIGludCBsZW4pCit7CisJaW50IHJldDsKKworCXN3aXRjaChjbWQpIHsKKwljYXNlIEVCVF9TT19TRVRfRU5UUklFUzoKKwkJcmV0ID0gZG9fcmVwbGFjZSh1c2VyLCBsZW4pOworCQlicmVhazsKKwljYXNlIEVCVF9TT19TRVRfQ09VTlRFUlM6CisJCXJldCA9IHVwZGF0ZV9jb3VudGVycyh1c2VyLCBsZW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworICB9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkb19lYnRfZ2V0X2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHZvaWQgX191c2VyICp1c2VyLCBpbnQgKmxlbikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBlYnRfcmVwbGFjZSB0bXA7CisJc3RydWN0IGVidF90YWJsZSAqdDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wLCB1c2VyLCBzaXplb2YodG1wKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJdCA9IGZpbmRfdGFibGVfbG9jayh0bXAubmFtZSwgJnJldCwgJmVidF9tdXRleCk7CisJaWYgKCF0KQorCQlyZXR1cm4gcmV0OworCisJc3dpdGNoKGNtZCkgeworCWNhc2UgRUJUX1NPX0dFVF9JTkZPOgorCWNhc2UgRUJUX1NPX0dFVF9JTklUX0lORk86CisJCWlmICgqbGVuICE9IHNpemVvZihzdHJ1Y3QgZWJ0X3JlcGxhY2UpKXsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQl1cCgmZWJ0X211dGV4KTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjbWQgPT0gRUJUX1NPX0dFVF9JTkZPKSB7CisJCQl0bXAubmVudHJpZXMgPSB0LT5wcml2YXRlLT5uZW50cmllczsKKwkJCXRtcC5lbnRyaWVzX3NpemUgPSB0LT5wcml2YXRlLT5lbnRyaWVzX3NpemU7CisJCQl0bXAudmFsaWRfaG9va3MgPSB0LT52YWxpZF9ob29rczsKKwkJfSBlbHNlIHsKKwkJCXRtcC5uZW50cmllcyA9IHQtPnRhYmxlLT5uZW50cmllczsKKwkJCXRtcC5lbnRyaWVzX3NpemUgPSB0LT50YWJsZS0+ZW50cmllc19zaXplOworCQkJdG1wLnZhbGlkX2hvb2tzID0gdC0+dGFibGUtPnZhbGlkX2hvb2tzOworCQl9CisJCXVwKCZlYnRfbXV0ZXgpOworCQlpZiAoY29weV90b191c2VyKHVzZXIsICZ0bXAsICpsZW4pICE9IDApeworCQkJQlVHUFJJTlQoImMydSBEaWRuJ3Qgd29ya1xuIik7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIEVCVF9TT19HRVRfRU5UUklFUzoKKwljYXNlIEVCVF9TT19HRVRfSU5JVF9FTlRSSUVTOgorCQlyZXQgPSBjb3B5X2V2ZXJ5dGhpbmdfdG9fdXNlcih0LCB1c2VyLCBsZW4sIGNtZCk7CisJCXVwKCZlYnRfbXV0ZXgpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXVwKCZlYnRfbXV0ZXgpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZfc29ja29wdF9vcHMgZWJ0X3NvY2tvcHRzID0KK3sgeyBOVUxMLCBOVUxMIH0sIFBGX0lORVQsIEVCVF9CQVNFX0NUTCwgRUJUX1NPX1NFVF9NQVggKyAxLCBkb19lYnRfc2V0X2N0bCwKKyAgICBFQlRfQkFTRV9DVEwsIEVCVF9TT19HRVRfTUFYICsgMSwgZG9fZWJ0X2dldF9jdGwsIDAsIE5VTEwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJZG93bigmZWJ0X211dGV4KTsKKwlsaXN0X25hbWVkX2luc2VydCgmZWJ0X3RhcmdldHMsICZlYnRfc3RhbmRhcmRfdGFyZ2V0KTsKKwl1cCgmZWJ0X211dGV4KTsKKwlpZiAoKHJldCA9IG5mX3JlZ2lzdGVyX3NvY2tvcHQoJmVidF9zb2Nrb3B0cykpIDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXByaW50ayhLRVJOX05PVElDRSAiRWJ0YWJsZXMgdjIuMCByZWdpc3RlcmVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwluZl91bnJlZ2lzdGVyX3NvY2tvcHQoJmVidF9zb2Nrb3B0cyk7CisJcHJpbnRrKEtFUk5fTk9USUNFICJFYnRhYmxlcyB2Mi4wIHVucmVnaXN0ZXJlZFxuIik7Cit9CisKK0VYUE9SVF9TWU1CT0woZWJ0X3JlZ2lzdGVyX3RhYmxlKTsKK0VYUE9SVF9TWU1CT0woZWJ0X3VucmVnaXN0ZXJfdGFibGUpOworRVhQT1JUX1NZTUJPTChlYnRfcmVnaXN0ZXJfbWF0Y2gpOworRVhQT1JUX1NZTUJPTChlYnRfdW5yZWdpc3Rlcl9tYXRjaCk7CitFWFBPUlRfU1lNQk9MKGVidF9yZWdpc3Rlcl93YXRjaGVyKTsKK0VYUE9SVF9TWU1CT0woZWJ0X3VucmVnaXN0ZXJfd2F0Y2hlcik7CitFWFBPUlRfU1lNQk9MKGVidF9yZWdpc3Rlcl90YXJnZXQpOworRVhQT1JUX1NZTUJPTChlYnRfdW5yZWdpc3Rlcl90YXJnZXQpOworRVhQT1JUX1NZTUJPTChlYnRfZG9fdGFibGUpOworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9jb21wYXQuYyBiL25ldC9jb21wYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTVkOTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2NvbXBhdC5jCkBAIC0wLDAgKzEsNjA1IEBACisvKiAKKyAqIDMyYml0IFNvY2tldCBzeXNjYWxsIGVtdWxhdGlvbi4gQmFzZWQgb24gYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXNfc3BhcmMzMi5jLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMAkJVkEgTGludXggQ28KKyAqIENvcHlyaWdodCAoQykgMjAwMAkJRG9uIER1Z2dlciA8bjBhbm9AdmFsaW51eC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgCQlBcnVuIFNoYXJtYSA8YXJ1bi5zaGFybWFAaW50ZWwuY29tPgorICogQ29weXJpZ2h0IChDKSAxOTk3LDE5OTggCUpha3ViIEplbGluZWsgKGpqQHN1bnNpdGUubWZmLmN1bmkuY3opCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgCQlEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAJCUhld2xldHQtUGFja2FyZCBDby4KKyAqIENvcHlyaWdodCAoQykgMjAwMAkJRGF2aWQgTW9zYmVyZ2VyLVRhbmcgPGRhdmlkbUBocGwuaHAuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEJQW5kaSBLbGVlbiwgU3VTRSBMYWJzIAorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaWNtcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorCisjaW5jbHVkZSA8bmV0L3NjbS5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxuZXQvY29tcGF0Lmg+CisKK3N0YXRpYyBpbmxpbmUgaW50IGlvdl9mcm9tX3VzZXJfY29tcGF0X3RvX2tlcm4oc3RydWN0IGlvdmVjICpraW92LAorCQkJCQkgIHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICp1aW92MzIsCisJCQkJCSAgaW50IG5pb3YpCit7CisJaW50IHRvdF9sZW4gPSAwOworCisJd2hpbGUobmlvdiA+IDApIHsKKwkJY29tcGF0X3VwdHJfdCBidWY7CisJCWNvbXBhdF9zaXplX3QgbGVuOworCisJCWlmKGdldF91c2VyKGxlbiwgJnVpb3YzMi0+aW92X2xlbikgfHwKKwkJICAgZ2V0X3VzZXIoYnVmLCAmdWlvdjMyLT5pb3ZfYmFzZSkpIHsKKwkJCXRvdF9sZW4gPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJdG90X2xlbiArPSBsZW47CisJCWtpb3YtPmlvdl9iYXNlID0gY29tcGF0X3B0cihidWYpOworCQlraW92LT5pb3ZfbGVuID0gKF9fa2VybmVsX3NpemVfdCkgbGVuOworCQl1aW92MzIrKzsKKwkJa2lvdisrOworCQluaW92LS07CisJfQorCXJldHVybiB0b3RfbGVuOworfQorCitpbnQgZ2V0X2NvbXBhdF9tc2doZHIoc3RydWN0IG1zZ2hkciAqa21zZywgc3RydWN0IGNvbXBhdF9tc2doZHIgX191c2VyICp1bXNnKQoreworCWNvbXBhdF91cHRyX3QgdG1wMSwgdG1wMiwgdG1wMzsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1bXNnLCBzaXplb2YoKnVtc2cpKSB8fAorCSAgICBfX2dldF91c2VyKHRtcDEsICZ1bXNnLT5tc2dfbmFtZSkgfHwKKwkgICAgX19nZXRfdXNlcihrbXNnLT5tc2dfbmFtZWxlbiwgJnVtc2ctPm1zZ19uYW1lbGVuKSB8fAorCSAgICBfX2dldF91c2VyKHRtcDIsICZ1bXNnLT5tc2dfaW92KSB8fAorCSAgICBfX2dldF91c2VyKGttc2ctPm1zZ19pb3ZsZW4sICZ1bXNnLT5tc2dfaW92bGVuKSB8fAorCSAgICBfX2dldF91c2VyKHRtcDMsICZ1bXNnLT5tc2dfY29udHJvbCkgfHwKKwkgICAgX19nZXRfdXNlcihrbXNnLT5tc2dfY29udHJvbGxlbiwgJnVtc2ctPm1zZ19jb250cm9sbGVuKSB8fAorCSAgICBfX2dldF91c2VyKGttc2ctPm1zZ19mbGFncywgJnVtc2ctPm1zZ19mbGFncykpCisJCXJldHVybiAtRUZBVUxUOworCWttc2ctPm1zZ19uYW1lID0gY29tcGF0X3B0cih0bXAxKTsKKwlrbXNnLT5tc2dfaW92ID0gY29tcGF0X3B0cih0bXAyKTsKKwlrbXNnLT5tc2dfY29udHJvbCA9IGNvbXBhdF9wdHIodG1wMyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEkndmUgbmFtZWQgdGhlIGFyZ3Mgc28gaXQgaXMgZWFzeSB0byB0ZWxsIHdob3NlIHNwYWNlIHRoZSBwb2ludGVycyBhcmUgaW4uICovCitpbnQgdmVyaWZ5X2NvbXBhdF9pb3ZlYyhzdHJ1Y3QgbXNnaGRyICprZXJuX21zZywgc3RydWN0IGlvdmVjICprZXJuX2lvdiwKKwkJICAgY2hhciAqa2Vybl9hZGRyZXNzLCBpbnQgbW9kZSkKK3sKKwlpbnQgdG90X2xlbjsKKworCWlmKGtlcm5fbXNnLT5tc2dfbmFtZWxlbikgeworCQlpZihtb2RlPT1WRVJJRllfUkVBRCkgeworCQkJaW50IGVyciA9IG1vdmVfYWRkcl90b19rZXJuZWwoa2Vybl9tc2ctPm1zZ19uYW1lLAorCQkJCQkJICAgICAga2Vybl9tc2ctPm1zZ19uYW1lbGVuLAorCQkJCQkJICAgICAga2Vybl9hZGRyZXNzKTsKKwkJCWlmKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCQlrZXJuX21zZy0+bXNnX25hbWUgPSBrZXJuX2FkZHJlc3M7CisJfSBlbHNlCisJCWtlcm5fbXNnLT5tc2dfbmFtZSA9IE5VTEw7CisKKwlpZihrZXJuX21zZy0+bXNnX2lvdmxlbiA+IFVJT19GQVNUSU9WKSB7CisJCWtlcm5faW92ID0ga21hbGxvYyhrZXJuX21zZy0+bXNnX2lvdmxlbiAqIHNpemVvZihzdHJ1Y3QgaW92ZWMpLAorCQkJCSAgIEdGUF9LRVJORUwpOworCQlpZigha2Vybl9pb3YpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl0b3RfbGVuID0gaW92X2Zyb21fdXNlcl9jb21wYXRfdG9fa2VybihrZXJuX2lvdiwKKwkJCQkJICAoc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKilrZXJuX21zZy0+bXNnX2lvdiwKKwkJCQkJICBrZXJuX21zZy0+bXNnX2lvdmxlbik7CisJaWYodG90X2xlbiA+PSAwKQorCQlrZXJuX21zZy0+bXNnX2lvdiA9IGtlcm5faW92OworCWVsc2UgaWYoa2Vybl9tc2ctPm1zZ19pb3ZsZW4gPiBVSU9fRkFTVElPVikKKwkJa2ZyZWUoa2Vybl9pb3YpOworCisJcmV0dXJuIHRvdF9sZW47Cit9CisKKy8qIEJsZWVjaC4uLiAqLworI2RlZmluZSBDTVNHX0NPTVBBVF9BTElHTihsZW4pCUFMSUdOKChsZW4pLCBzaXplb2YoczMyKSkKKworI2RlZmluZSBDTVNHX0NPTVBBVF9EQVRBKGNtc2cpCQkJCVwKKwkoKHZvaWQgX191c2VyICopKChjaGFyIF9fdXNlciAqKShjbXNnKSArIENNU0dfQ09NUEFUX0FMSUdOKHNpemVvZihzdHJ1Y3QgY29tcGF0X2Ntc2doZHIpKSkpCisjZGVmaW5lIENNU0dfQ09NUEFUX1NQQUNFKGxlbikJCQkJXAorCShDTVNHX0NPTVBBVF9BTElHTihzaXplb2Yoc3RydWN0IGNvbXBhdF9jbXNnaGRyKSkgKyBDTVNHX0NPTVBBVF9BTElHTihsZW4pKQorI2RlZmluZSBDTVNHX0NPTVBBVF9MRU4obGVuKQkJCQlcCisJKENNU0dfQ09NUEFUX0FMSUdOKHNpemVvZihzdHJ1Y3QgY29tcGF0X2Ntc2doZHIpKSArIChsZW4pKQorCisjZGVmaW5lIENNU0dfQ09NUEFUX0ZJUlNUSERSKG1zZykJCQlcCisJKCgobXNnKS0+bXNnX2NvbnRyb2xsZW4pID49IHNpemVvZihzdHJ1Y3QgY29tcGF0X2Ntc2doZHIpID8JXAorCSAoc3RydWN0IGNvbXBhdF9jbXNnaGRyIF9fdXNlciAqKSgobXNnKS0+bXNnX2NvbnRyb2wpIDoJCVwKKwkgKHN0cnVjdCBjb21wYXRfY21zZ2hkciBfX3VzZXIgKilOVUxMKQorCisjZGVmaW5lIENNU0dfQ09NUEFUX09LKHVjbWxlbiwgdWNtc2csIG1oZHIpIFwKKwkoKHVjbWxlbikgPj0gc2l6ZW9mKHN0cnVjdCBjb21wYXRfY21zZ2hkcikgJiYgXAorCSAodWNtbGVuKSA8PSAodW5zaWduZWQgbG9uZykgXAorCSAoKG1oZHIpLT5tc2dfY29udHJvbGxlbiAtIFwKKwkgICgoY2hhciAqKSh1Y21zZykgLSAoY2hhciAqKShtaGRyKS0+bXNnX2NvbnRyb2wpKSkKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgY29tcGF0X2Ntc2doZHIgX191c2VyICpjbXNnX2NvbXBhdF9ueHRoZHIoc3RydWN0IG1zZ2hkciAqbXNnLAorCQlzdHJ1Y3QgY29tcGF0X2Ntc2doZHIgX191c2VyICpjbXNnLCBpbnQgY21zZ19sZW4pCit7CisJY2hhciBfX3VzZXIgKnB0ciA9IChjaGFyIF9fdXNlciAqKWNtc2cgKyBDTVNHX0NPTVBBVF9BTElHTihjbXNnX2xlbik7CisJaWYgKCh1bnNpZ25lZCBsb25nKShwdHIgKyAxIC0gKGNoYXIgX191c2VyICopbXNnLT5tc2dfY29udHJvbCkgPgorCQkJbXNnLT5tc2dfY29udHJvbGxlbikKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIChzdHJ1Y3QgY29tcGF0X2Ntc2doZHIgX191c2VyICopcHRyOworfQorCisvKiBUaGVyZSBpcyBhIGxvdCBvZiBoYWlyIGhlcmUgYmVjYXVzZSB0aGUgYWxpZ25tZW50IHJ1bGVzIChhbmQKKyAqIHRodXMgcGxhY2VtZW50KSBvZiBjbXNnIGhlYWRlcnMgYW5kIGxlbmd0aCBhcmUgZGlmZmVyZW50IGZvcgorICogMzItYml0IGFwcHMuICAtRGF2ZU0KKyAqLworaW50IGNtc2doZHJfZnJvbV91c2VyX2NvbXBhdF90b19rZXJuKHN0cnVjdCBtc2doZHIgKmttc2csCisJCQkgICAgICAgdW5zaWduZWQgY2hhciAqc3RhY2tidWYsIGludCBzdGFja2J1Zl9zaXplKQoreworCXN0cnVjdCBjb21wYXRfY21zZ2hkciBfX3VzZXIgKnVjbXNnOworCXN0cnVjdCBjbXNnaGRyICprY21zZywgKmtjbXNnX2Jhc2U7CisJY29tcGF0X3NpemVfdCB1Y21sZW47CisJX19rZXJuZWxfc2l6ZV90IGtjbWxlbiwgdG1wOworCisJa2NtbGVuID0gMDsKKwlrY21zZ19iYXNlID0ga2Ntc2cgPSAoc3RydWN0IGNtc2doZHIgKilzdGFja2J1ZjsKKwl1Y21zZyA9IENNU0dfQ09NUEFUX0ZJUlNUSERSKGttc2cpOworCXdoaWxlKHVjbXNnICE9IE5VTEwpIHsKKwkJaWYoZ2V0X3VzZXIodWNtbGVuLCAmdWNtc2ctPmNtc2dfbGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCS8qIENhdGNoIGJvZ29ucy4gKi8KKwkJaWYgKCFDTVNHX0NPTVBBVF9PSyh1Y21sZW4sIHVjbXNnLCBrbXNnKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXRtcCA9ICgodWNtbGVuIC0gQ01TR19DT01QQVRfQUxJR04oc2l6ZW9mKCp1Y21zZykpKSArCisJCSAgICAgICBDTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgY21zZ2hkcikpKTsKKwkJa2NtbGVuICs9IHRtcDsKKwkJdWNtc2cgPSBjbXNnX2NvbXBhdF9ueHRoZHIoa21zZywgdWNtc2csIHVjbWxlbik7CisJfQorCWlmKGtjbWxlbiA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFRoZSBrY21sZW4gaG9sZHMgdGhlIDY0LWJpdCB2ZXJzaW9uIG9mIHRoZSBjb250cm9sIGxlbmd0aC4KKwkgKiBJdCBtYXkgbm90IGJlIG1vZGlmaWVkIGFzIHdlIGRvIG5vdCBzdGljayBpdCBpbnRvIHRoZSBrbXNnCisJICogdW50aWwgd2UgaGF2ZSBzdWNjZXNzZnVsbHkgY29waWVkIG92ZXIgYWxsIG9mIHRoZSBkYXRhCisJICogZnJvbSB0aGUgdXNlci4KKwkgKi8KKwlpZihrY21sZW4gPiBzdGFja2J1Zl9zaXplKQorCQlrY21zZ19iYXNlID0ga2Ntc2cgPSBrbWFsbG9jKGtjbWxlbiwgR0ZQX0tFUk5FTCk7CisJaWYoa2Ntc2cgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJLyogTm93IGNvcHkgdGhlbSBvdmVyIG5lYXRseS4gKi8KKwltZW1zZXQoa2Ntc2csIDAsIGtjbWxlbik7CisJdWNtc2cgPSBDTVNHX0NPTVBBVF9GSVJTVEhEUihrbXNnKTsKKwl3aGlsZSh1Y21zZyAhPSBOVUxMKSB7CisJCV9fZ2V0X3VzZXIodWNtbGVuLCAmdWNtc2ctPmNtc2dfbGVuKTsKKwkJdG1wID0gKCh1Y21sZW4gLSBDTVNHX0NPTVBBVF9BTElHTihzaXplb2YoKnVjbXNnKSkpICsKKwkJICAgICAgIENNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBjbXNnaGRyKSkpOworCQlrY21zZy0+Y21zZ19sZW4gPSB0bXA7CisJCV9fZ2V0X3VzZXIoa2Ntc2ctPmNtc2dfbGV2ZWwsICZ1Y21zZy0+Y21zZ19sZXZlbCk7CisJCV9fZ2V0X3VzZXIoa2Ntc2ctPmNtc2dfdHlwZSwgJnVjbXNnLT5jbXNnX3R5cGUpOworCisJCS8qIENvcHkgb3ZlciB0aGUgZGF0YS4gKi8KKwkJaWYoY29weV9mcm9tX3VzZXIoQ01TR19EQVRBKGtjbXNnKSwKKwkJCQkgIENNU0dfQ09NUEFUX0RBVEEodWNtc2cpLAorCQkJCSAgKHVjbWxlbiAtIENNU0dfQ09NUEFUX0FMSUdOKHNpemVvZigqdWNtc2cpKSkpKQorCQkJZ290byBvdXRfZnJlZV9lZmF1bHQ7CisKKwkJLyogQWR2YW5jZS4gKi8KKwkJa2Ntc2cgPSAoc3RydWN0IGNtc2doZHIgKikoKGNoYXIgKilrY21zZyArIENNU0dfQUxJR04odG1wKSk7CisJCXVjbXNnID0gY21zZ19jb21wYXRfbnh0aGRyKGttc2csIHVjbXNnLCB1Y21sZW4pOworCX0KKworCS8qIE9rLCBsb29rcyBsaWtlIHdlIG1hZGUgaXQuICBIb29rIGl0IHVwIGFuZCByZXR1cm4gc3VjY2Vzcy4gKi8KKwlrbXNnLT5tc2dfY29udHJvbCA9IGtjbXNnX2Jhc2U7CisJa21zZy0+bXNnX2NvbnRyb2xsZW4gPSBrY21sZW47CisJcmV0dXJuIDA7CisKK291dF9mcmVlX2VmYXVsdDoKKwlpZihrY21zZ19iYXNlICE9IChzdHJ1Y3QgY21zZ2hkciAqKXN0YWNrYnVmKQorCQlrZnJlZShrY21zZ19iYXNlKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworaW50IHB1dF9jbXNnX2NvbXBhdChzdHJ1Y3QgbXNnaGRyICprbXNnLCBpbnQgbGV2ZWwsIGludCB0eXBlLCBpbnQgbGVuLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBjb21wYXRfdGltZXZhbCBjdHY7CisJc3RydWN0IGNvbXBhdF9jbXNnaGRyIF9fdXNlciAqY20gPSAoc3RydWN0IGNvbXBhdF9jbXNnaGRyIF9fdXNlciAqKSBrbXNnLT5tc2dfY29udHJvbDsKKwlzdHJ1Y3QgY29tcGF0X2Ntc2doZHIgY21oZHI7CisJaW50IGNtbGVuOworCisJaWYoY20gPT0gTlVMTCB8fCBrbXNnLT5tc2dfY29udHJvbGxlbiA8IHNpemVvZigqY20pKSB7CisJCWttc2ctPm1zZ19mbGFncyB8PSBNU0dfQ1RSVU5DOworCQlyZXR1cm4gMDsgLyogWFhYOiByZXR1cm4gZXJyb3I/IGNoZWNrIHNwZWMuICovCisJfQorCisJaWYgKGxldmVsID09IFNPTF9TT0NLRVQgJiYgdHlwZSA9PSBTT19USU1FU1RBTVApIHsgCisJCXN0cnVjdCB0aW1ldmFsICp0diA9IChzdHJ1Y3QgdGltZXZhbCAqKWRhdGE7CisJCWN0di50dl9zZWMgPSB0di0+dHZfc2VjOworCQljdHYudHZfdXNlYyA9IHR2LT50dl91c2VjOworCQlkYXRhID0gJmN0djsKKwkJbGVuID0gc2l6ZW9mKHN0cnVjdCBjb21wYXRfdGltZXZhbCk7CisJfSAKKwkKKwljbWxlbiA9IENNU0dfQ09NUEFUX0xFTihsZW4pOworCWlmKGttc2ctPm1zZ19jb250cm9sbGVuIDwgY21sZW4pIHsKKwkJa21zZy0+bXNnX2ZsYWdzIHw9IE1TR19DVFJVTkM7CisJCWNtbGVuID0ga21zZy0+bXNnX2NvbnRyb2xsZW47CisJfQorCWNtaGRyLmNtc2dfbGV2ZWwgPSBsZXZlbDsKKwljbWhkci5jbXNnX3R5cGUgPSB0eXBlOworCWNtaGRyLmNtc2dfbGVuID0gY21sZW47CisKKwlpZihjb3B5X3RvX3VzZXIoY20sICZjbWhkciwgc2l6ZW9mIGNtaGRyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYoY29weV90b191c2VyKENNU0dfQ09NUEFUX0RBVEEoY20pLCBkYXRhLCBjbWxlbiAtIHNpemVvZihzdHJ1Y3QgY29tcGF0X2Ntc2doZHIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJY21sZW4gPSBDTVNHX0NPTVBBVF9TUEFDRShsZW4pOworCWttc2ctPm1zZ19jb250cm9sICs9IGNtbGVuOworCWttc2ctPm1zZ19jb250cm9sbGVuIC09IGNtbGVuOworCXJldHVybiAwOworfQorCit2b2lkIHNjbV9kZXRhY2hfZmRzX2NvbXBhdChzdHJ1Y3QgbXNnaGRyICprbXNnLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKQoreworCXN0cnVjdCBjb21wYXRfY21zZ2hkciBfX3VzZXIgKmNtID0gKHN0cnVjdCBjb21wYXRfY21zZ2hkciBfX3VzZXIgKikga21zZy0+bXNnX2NvbnRyb2w7CisJaW50IGZkbWF4ID0gKGttc2ctPm1zZ19jb250cm9sbGVuIC0gc2l6ZW9mKHN0cnVjdCBjb21wYXRfY21zZ2hkcikpIC8gc2l6ZW9mKGludCk7CisJaW50IGZkbnVtID0gc2NtLT5mcC0+Y291bnQ7CisJc3RydWN0IGZpbGUgKipmcCA9IHNjbS0+ZnAtPmZwOworCWludCBfX3VzZXIgKmNtZnB0cjsKKwlpbnQgZXJyID0gMCwgaTsKKworCWlmIChmZG51bSA8IGZkbWF4KQorCQlmZG1heCA9IGZkbnVtOworCisJZm9yIChpID0gMCwgY21mcHRyID0gKGludCBfX3VzZXIgKikgQ01TR19DT01QQVRfREFUQShjbSk7IGkgPCBmZG1heDsgaSsrLCBjbWZwdHIrKykgeworCQlpbnQgbmV3X2ZkOworCQllcnIgPSBzZWN1cml0eV9maWxlX3JlY2VpdmUoZnBbaV0pOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJCWVyciA9IGdldF91bnVzZWRfZmQoKTsKKwkJaWYgKGVyciA8IDApCisJCQlicmVhazsKKwkJbmV3X2ZkID0gZXJyOworCQllcnIgPSBwdXRfdXNlcihuZXdfZmQsIGNtZnB0cik7CisJCWlmIChlcnIpIHsKKwkJCXB1dF91bnVzZWRfZmQobmV3X2ZkKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIEJ1bXAgdGhlIHVzYWdlIGNvdW50IGFuZCBpbnN0YWxsIHRoZSBmaWxlLiAqLworCQlnZXRfZmlsZShmcFtpXSk7CisJCWZkX2luc3RhbGwobmV3X2ZkLCBmcFtpXSk7CisJfQorCisJaWYgKGkgPiAwKSB7CisJCWludCBjbWxlbiA9IENNU0dfQ09NUEFUX0xFTihpICogc2l6ZW9mKGludCkpOworCQlpZiAoIWVycikKKwkJCWVyciA9IHB1dF91c2VyKFNPTF9TT0NLRVQsICZjbS0+Y21zZ19sZXZlbCk7CisJCWlmICghZXJyKQorCQkJZXJyID0gcHV0X3VzZXIoU0NNX1JJR0hUUywgJmNtLT5jbXNnX3R5cGUpOworCQlpZiAoIWVycikKKwkJCWVyciA9IHB1dF91c2VyKGNtbGVuLCAmY20tPmNtc2dfbGVuKTsKKwkJaWYgKCFlcnIpIHsKKwkJCWNtbGVuID0gQ01TR19DT01QQVRfU1BBQ0UoaSAqIHNpemVvZihpbnQpKTsKKwkJCWttc2ctPm1zZ19jb250cm9sICs9IGNtbGVuOworCQkJa21zZy0+bXNnX2NvbnRyb2xsZW4gLT0gY21sZW47CisJCX0KKwl9CisJaWYgKGkgPCBmZG51bSkKKwkJa21zZy0+bXNnX2ZsYWdzIHw9IE1TR19DVFJVTkM7CisKKwkvKgorCSAqIEFsbCBvZiB0aGUgZmlsZXMgdGhhdCBmaXQgaW4gdGhlIG1lc3NhZ2UgaGF2ZSBoYWQgdGhlaXIKKwkgKiB1c2FnZSBjb3VudHMgaW5jcmVtZW50ZWQsIHNvIHdlIGp1c3QgZnJlZSB0aGUgbGlzdC4KKwkgKi8KKwlfX3NjbV9kZXN0cm95KHNjbSk7Cit9CisKKy8qCisgKiBGb3Igbm93LCB3ZSBhc3N1bWUgdGhhdCB0aGUgY29tcGF0aWJpbGl0eSBhbmQgbmF0aXZlIHZlcnNpb24KKyAqIG9mIHN0cnVjdCBpcHRfZW50cnkgYXJlIHRoZSBzYW1lIC0gc2ZyLiAgRklYTUUKKyAqLworc3RydWN0IGNvbXBhdF9pcHRfcmVwbGFjZSB7CisJY2hhcgkJCW5hbWVbSVBUX1RBQkxFX01BWE5BTUVMRU5dOworCXUzMgkJCXZhbGlkX2hvb2tzOworCXUzMgkJCW51bV9lbnRyaWVzOworCXUzMgkJCXNpemU7CisJdTMyCQkJaG9va19lbnRyeVtORl9JUF9OVU1IT09LU107CisJdTMyCQkJdW5kZXJmbG93W05GX0lQX05VTUhPT0tTXTsKKwl1MzIJCQludW1fY291bnRlcnM7CisJY29tcGF0X3VwdHJfdAkJY291bnRlcnM7CS8qIHN0cnVjdCBpcHRfY291bnRlcnMgKiAqLworCXN0cnVjdCBpcHRfZW50cnkJZW50cmllc1swXTsKK307CisKK3N0YXRpYyBpbnQgZG9fbmV0ZmlsdGVyX3JlcGxhY2UoaW50IGZkLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCit7CisJc3RydWN0IGNvbXBhdF9pcHRfcmVwbGFjZSBfX3VzZXIgKnVyZXBsOworCXN0cnVjdCBpcHRfcmVwbGFjZSBfX3VzZXIgKnJlcGxfbmF0OworCWNoYXIgbmFtZVtJUFRfVEFCTEVfTUFYTkFNRUxFTl07CisJdTMyIG9yaWdzaXplLCB0bXAzMiwgbnVtX2NvdW50ZXJzOworCXVuc2lnbmVkIGludCByZXBsX25hdF9zaXplOworCWludCByZXQ7CisJaW50IGk7CisJY29tcGF0X3VwdHJfdCB1Y250cnM7CisKKwl1cmVwbCA9IChzdHJ1Y3QgY29tcGF0X2lwdF9yZXBsYWNlIF9fdXNlciAqKW9wdHZhbDsKKwlpZiAoZ2V0X3VzZXIob3JpZ3NpemUsICZ1cmVwbC0+c2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogSGFjazogQ2F1c2VzIGlwY2hhaW5zIHRvIGdpdmUgY29ycmVjdCBlcnJvciBtc2cgLS1SUiAqLworCWlmIChvcHRsZW4gIT0gc2l6ZW9mKCp1cmVwbCkgKyBvcmlnc2l6ZSkKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKworCS8qIFhYWCBBc3N1bWVzIHRoYXQgc2l6ZSBvZiBpcHRfZW50cnkgaXMgdGhlIHNhbWUgYm90aCBpbgorCSAqICAgICBuYXRpdmUgYW5kIGNvbXBhdCBlbnZpcm9ubWVudHMuCisJICovCisJcmVwbF9uYXRfc2l6ZSA9IHNpemVvZigqcmVwbF9uYXQpICsgb3JpZ3NpemU7CisJcmVwbF9uYXQgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShyZXBsX25hdF9zaXplKTsKKworCXJldCA9IC1FRkFVTFQ7CisJaWYgKHB1dF91c2VyKG9yaWdzaXplLCAmcmVwbF9uYXQtPnNpemUpKQorCQlnb3RvIG91dDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1cmVwbCwgb3B0bGVuKSB8fAorCSAgICAhYWNjZXNzX29rKFZFUklGWV9XUklURSwgcmVwbF9uYXQsIG9wdGxlbikpCisJCWdvdG8gb3V0OworCisJaWYgKF9fY29weV9mcm9tX3VzZXIobmFtZSwgdXJlcGwtPm5hbWUsIHNpemVvZih1cmVwbC0+bmFtZSkpIHx8CisJICAgIF9fY29weV90b191c2VyKHJlcGxfbmF0LT5uYW1lLCBuYW1lLCBzaXplb2YocmVwbF9uYXQtPm5hbWUpKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoX19nZXRfdXNlcih0bXAzMiwgJnVyZXBsLT52YWxpZF9ob29rcykgfHwKKwkgICAgX19wdXRfdXNlcih0bXAzMiwgJnJlcGxfbmF0LT52YWxpZF9ob29rcykpCisJCWdvdG8gb3V0OworCisJaWYgKF9fZ2V0X3VzZXIodG1wMzIsICZ1cmVwbC0+bnVtX2VudHJpZXMpIHx8CisJICAgIF9fcHV0X3VzZXIodG1wMzIsICZyZXBsX25hdC0+bnVtX2VudHJpZXMpKQorCQlnb3RvIG91dDsKKworCWlmIChfX2dldF91c2VyKG51bV9jb3VudGVycywgJnVyZXBsLT5udW1fY291bnRlcnMpIHx8CisJICAgIF9fcHV0X3VzZXIobnVtX2NvdW50ZXJzLCAmcmVwbF9uYXQtPm51bV9jb3VudGVycykpCisJCWdvdG8gb3V0OworCisJaWYgKF9fZ2V0X3VzZXIodWNudHJzLCAmdXJlcGwtPmNvdW50ZXJzKSB8fAorCSAgICBfX3B1dF91c2VyKGNvbXBhdF9wdHIodWNudHJzKSwgJnJlcGxfbmF0LT5jb3VudGVycykpCisJCWdvdG8gb3V0OworCisJaWYgKF9fY29weV9pbl91c2VyKCZyZXBsX25hdC0+ZW50cmllc1swXSwKKwkJCSAgICZ1cmVwbC0+ZW50cmllc1swXSwKKwkJCSAgIG9yaWdzaXplKSkKKwkJZ290byBvdXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgTkZfSVBfTlVNSE9PS1M7IGkrKykgeworCQlpZiAoX19nZXRfdXNlcih0bXAzMiwgJnVyZXBsLT5ob29rX2VudHJ5W2ldKSB8fAorCQkgICAgX19wdXRfdXNlcih0bXAzMiwgJnJlcGxfbmF0LT5ob29rX2VudHJ5W2ldKSB8fAorCQkgICAgX19nZXRfdXNlcih0bXAzMiwgJnVyZXBsLT51bmRlcmZsb3dbaV0pIHx8CisJCSAgICBfX3B1dF91c2VyKHRtcDMyLCAmcmVwbF9uYXQtPnVuZGVyZmxvd1tpXSkpCisJCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFNpbmNlIHN0cnVjdCBpcHRfY291bnRlcnMganVzdCBjb250YWlucyB0d28gdV9pbnQ2NF90IG1lbWJlcnMKKwkgKiB3ZSBjYW4ganVzdCBkbyB0aGUgYWNjZXNzX29rIGNoZWNrIGhlcmUgYW5kIHBhc3MgdGhlIChjb252ZXJ0ZWQpCisJICogcG9pbnRlciBpbnRvIHRoZSBzdGFuZGFyZCBzeXNjYWxsLiAgV2UgaG9wZSB0aGF0IHRoZSBwb2ludGVyIGlzCisJICogbm90IG1pc2FsaWduZWQgLi4uCisJICovCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBjb21wYXRfcHRyKHVjbnRycyksCisJCSAgICAgICBudW1fY291bnRlcnMgKiBzaXplb2Yoc3RydWN0IGlwdF9jb3VudGVycykpKQorCQlnb3RvIG91dDsKKworCisJcmV0ID0gc3lzX3NldHNvY2tvcHQoZmQsIGxldmVsLCBvcHRuYW1lLAorCQkJICAgICAoY2hhciBfX3VzZXIgKilyZXBsX25hdCwgcmVwbF9uYXRfc2l6ZSk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQSBzdHJ1Y3Qgc29ja19maWx0ZXIgaXMgYXJjaGl0ZWN0dXJlIGluZGVwZW5kZW50LgorICovCitzdHJ1Y3QgY29tcGF0X3NvY2tfZnByb2cgeworCXUxNgkJbGVuOworCWNvbXBhdF91cHRyX3QJZmlsdGVyOwkJLyogc3RydWN0IHNvY2tfZmlsdGVyICogKi8KK307CisKK3N0YXRpYyBpbnQgZG9fc2V0X2F0dGFjaF9maWx0ZXIoaW50IGZkLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCit7CisJc3RydWN0IGNvbXBhdF9zb2NrX2Zwcm9nIF9fdXNlciAqZnByb2czMiA9IChzdHJ1Y3QgY29tcGF0X3NvY2tfZnByb2cgX191c2VyICopb3B0dmFsOworCXN0cnVjdCBzb2NrX2Zwcm9nIF9fdXNlciAqa2Zwcm9nID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKHN0cnVjdCBzb2NrX2Zwcm9nKSk7IAorCWNvbXBhdF91cHRyX3QgcHRyOworCXUxNiBsZW47CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnByb2czMiwgc2l6ZW9mKCpmcHJvZzMyKSkgfHwKKwkgICAgIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGtmcHJvZywgc2l6ZW9mKHN0cnVjdCBzb2NrX2Zwcm9nKSkgfHwKKwkgICAgX19nZXRfdXNlcihsZW4sICZmcHJvZzMyLT5sZW4pIHx8CisJICAgIF9fZ2V0X3VzZXIocHRyLCAmZnByb2czMi0+ZmlsdGVyKSB8fAorCSAgICBfX3B1dF91c2VyKGxlbiwgJmtmcHJvZy0+bGVuKSB8fAorCSAgICBfX3B1dF91c2VyKGNvbXBhdF9wdHIocHRyKSwgJmtmcHJvZy0+ZmlsdGVyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gc3lzX3NldHNvY2tvcHQoZmQsIGxldmVsLCBvcHRuYW1lLCAoY2hhciBfX3VzZXIgKilrZnByb2csIAorCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrX2Zwcm9nKSk7Cit9CisKK3N0YXRpYyBpbnQgZG9fc2V0X3NvY2tfdGltZW91dChpbnQgZmQsIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCit7CisJc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqdXAgPSAoc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqKSBvcHR2YWw7CisJc3RydWN0IHRpbWV2YWwga3RpbWU7CisJbW1fc2VnbWVudF90IG9sZF9mczsKKwlpbnQgZXJyOworCisJaWYgKG9wdGxlbiA8IHNpemVvZigqdXApKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdXAsIHNpemVvZigqdXApKSB8fAorCSAgICBfX2dldF91c2VyKGt0aW1lLnR2X3NlYywgJnVwLT50dl9zZWMpIHx8CisJICAgIF9fZ2V0X3VzZXIoa3RpbWUudHZfdXNlYywgJnVwLT50dl91c2VjKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJb2xkX2ZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKEtFUk5FTF9EUyk7CisJZXJyID0gc3lzX3NldHNvY2tvcHQoZmQsIGxldmVsLCBvcHRuYW1lLCAoY2hhciAqKSAma3RpbWUsIHNpemVvZihrdGltZSkpOworCXNldF9mcyhvbGRfZnMpOworCisJcmV0dXJuIGVycjsKK30KKworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfc2V0c29ja29wdChpbnQgZmQsIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCQkJY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK3sKKwkvKiBTT19TRVRfUkVQTEFDRSBzZWVtcyB0byBiZSB0aGUgc2FtZSBpbiBhbGwgbGV2ZWxzICovCisJaWYgKG9wdG5hbWUgPT0gSVBUX1NPX1NFVF9SRVBMQUNFKQorCQlyZXR1cm4gZG9fbmV0ZmlsdGVyX3JlcGxhY2UoZmQsIGxldmVsLCBvcHRuYW1lLAorCQkJCQkgICAgb3B0dmFsLCBvcHRsZW4pOworCWlmIChsZXZlbCA9PSBTT0xfU09DS0VUICYmIG9wdG5hbWUgPT0gU09fQVRUQUNIX0ZJTFRFUikKKwkJcmV0dXJuIGRvX3NldF9hdHRhY2hfZmlsdGVyKGZkLCBsZXZlbCwgb3B0bmFtZSwKKwkJCQkJICAgIG9wdHZhbCwgb3B0bGVuKTsKKwlpZiAobGV2ZWwgPT0gU09MX1NPQ0tFVCAmJgorCSAgICAob3B0bmFtZSA9PSBTT19SQ1ZUSU1FTyB8fCBvcHRuYW1lID09IFNPX1NORFRJTUVPKSkKKwkJcmV0dXJuIGRvX3NldF9zb2NrX3RpbWVvdXQoZmQsIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CisKKwlyZXR1cm4gc3lzX3NldHNvY2tvcHQoZmQsIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7Cit9CisKK3N0YXRpYyBpbnQgZG9fZ2V0X3NvY2tfdGltZW91dChpbnQgZmQsIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCWNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKK3sKKwlzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICp1cDsKKwlzdHJ1Y3QgdGltZXZhbCBrdGltZTsKKwltbV9zZWdtZW50X3Qgb2xkX2ZzOworCWludCBsZW4sIGVycjsKKworCXVwID0gKHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKikgb3B0dmFsOworCWlmIChnZXRfdXNlcihsZW4sIG9wdGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChsZW4gPCBzaXplb2YoKnVwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbGVuID0gc2l6ZW9mKGt0aW1lKTsKKwlvbGRfZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwllcnIgPSBzeXNfZ2V0c29ja29wdChmZCwgbGV2ZWwsIG9wdG5hbWUsIChjaGFyICopICZrdGltZSwgJmxlbik7CisJc2V0X2ZzKG9sZF9mcyk7CisKKwlpZiAoIWVycikgeworCQlpZiAocHV0X3VzZXIoc2l6ZW9mKCp1cCksIG9wdGxlbikgfHwKKwkJICAgICFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1cCwgc2l6ZW9mKCp1cCkpIHx8CisJCSAgICBfX3B1dF91c2VyKGt0aW1lLnR2X3NlYywgJnVwLT50dl9zZWMpIHx8CisJCSAgICBfX3B1dF91c2VyKGt0aW1lLnR2X3VzZWMsICZ1cC0+dHZfdXNlYykpCisJCQllcnIgPSAtRUZBVUxUOworCX0KKwlyZXR1cm4gZXJyOworfQorCithc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19nZXRzb2Nrb3B0KGludCBmZCwgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJCQljaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCit7CisJaWYgKGxldmVsID09IFNPTF9TT0NLRVQgJiYKKwkgICAgKG9wdG5hbWUgPT0gU09fUkNWVElNRU8gfHwgb3B0bmFtZSA9PSBTT19TTkRUSU1FTykpCisJCXJldHVybiBkb19nZXRfc29ja190aW1lb3V0KGZkLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOworCXJldHVybiBzeXNfZ2V0c29ja29wdChmZCwgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKK30KKworLyogQXJndW1lbnQgbGlzdCBzaXplcyBmb3IgY29tcGF0X3N5c19zb2NrZXRjYWxsICovCisjZGVmaW5lIEFMKHgpICgoeCkgKiBzaXplb2YodTMyKSkKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG5hc1sxOF09e0FMKDApLEFMKDMpLEFMKDMpLEFMKDMpLEFMKDIpLEFMKDMpLAorCQkJCUFMKDMpLEFMKDMpLEFMKDQpLEFMKDQpLEFMKDQpLEFMKDYpLAorCQkJCUFMKDYpLEFMKDIpLEFMKDUpLEFMKDUpLEFMKDMpLEFMKDMpfTsKKyN1bmRlZiBBTAorCithc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19zZW5kbXNnKGludCBmZCwgc3RydWN0IGNvbXBhdF9tc2doZHIgX191c2VyICptc2csIHVuc2lnbmVkIGZsYWdzKQoreworCXJldHVybiBzeXNfc2VuZG1zZyhmZCwgKHN0cnVjdCBtc2doZHIgX191c2VyICopbXNnLCBmbGFncyB8IE1TR19DTVNHX0NPTVBBVCk7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3JlY3Ztc2coaW50IGZkLCBzdHJ1Y3QgY29tcGF0X21zZ2hkciBfX3VzZXIgKm1zZywgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXJldHVybiBzeXNfcmVjdm1zZyhmZCwgKHN0cnVjdCBtc2doZHIgX191c2VyICopbXNnLCBmbGFncyB8IE1TR19DTVNHX0NPTVBBVCk7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3NvY2tldGNhbGwoaW50IGNhbGwsIHUzMiBfX3VzZXIgKmFyZ3MpCit7CisJaW50IHJldDsKKwl1MzIgYVs2XTsKKwl1MzIgYTAsIGExOworCQkJCSAKKwlpZiAoY2FsbCA8IFNZU19TT0NLRVQgfHwgY2FsbCA+IFNZU19SRUNWTVNHKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY29weV9mcm9tX3VzZXIoYSwgYXJncywgbmFzW2NhbGxdKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJYTAgPSBhWzBdOworCWExID0gYVsxXTsKKwkKKwlzd2l0Y2goY2FsbCkgeworCWNhc2UgU1lTX1NPQ0tFVDoKKwkJcmV0ID0gc3lzX3NvY2tldChhMCwgYTEsIGFbMl0pOworCQlicmVhazsKKwljYXNlIFNZU19CSU5EOgorCQlyZXQgPSBzeXNfYmluZChhMCwgY29tcGF0X3B0cihhMSksIGFbMl0pOworCQlicmVhazsKKwljYXNlIFNZU19DT05ORUNUOgorCQlyZXQgPSBzeXNfY29ubmVjdChhMCwgY29tcGF0X3B0cihhMSksIGFbMl0pOworCQlicmVhazsKKwljYXNlIFNZU19MSVNURU46CisJCXJldCA9IHN5c19saXN0ZW4oYTAsIGExKTsKKwkJYnJlYWs7CisJY2FzZSBTWVNfQUNDRVBUOgorCQlyZXQgPSBzeXNfYWNjZXB0KGEwLCBjb21wYXRfcHRyKGExKSwgY29tcGF0X3B0cihhWzJdKSk7CisJCWJyZWFrOworCWNhc2UgU1lTX0dFVFNPQ0tOQU1FOgorCQlyZXQgPSBzeXNfZ2V0c29ja25hbWUoYTAsIGNvbXBhdF9wdHIoYTEpLCBjb21wYXRfcHRyKGFbMl0pKTsKKwkJYnJlYWs7CisJY2FzZSBTWVNfR0VUUEVFUk5BTUU6CisJCXJldCA9IHN5c19nZXRwZWVybmFtZShhMCwgY29tcGF0X3B0cihhMSksIGNvbXBhdF9wdHIoYVsyXSkpOworCQlicmVhazsKKwljYXNlIFNZU19TT0NLRVRQQUlSOgorCQlyZXQgPSBzeXNfc29ja2V0cGFpcihhMCwgYTEsIGFbMl0sIGNvbXBhdF9wdHIoYVszXSkpOworCQlicmVhazsKKwljYXNlIFNZU19TRU5EOgorCQlyZXQgPSBzeXNfc2VuZChhMCwgY29tcGF0X3B0cihhMSksIGFbMl0sIGFbM10pOworCQlicmVhazsKKwljYXNlIFNZU19TRU5EVE86CisJCXJldCA9IHN5c19zZW5kdG8oYTAsIGNvbXBhdF9wdHIoYTEpLCBhWzJdLCBhWzNdLCBjb21wYXRfcHRyKGFbNF0pLCBhWzVdKTsKKwkJYnJlYWs7CisJY2FzZSBTWVNfUkVDVjoKKwkJcmV0ID0gc3lzX3JlY3YoYTAsIGNvbXBhdF9wdHIoYTEpLCBhWzJdLCBhWzNdKTsKKwkJYnJlYWs7CisJY2FzZSBTWVNfUkVDVkZST006CisJCXJldCA9IHN5c19yZWN2ZnJvbShhMCwgY29tcGF0X3B0cihhMSksIGFbMl0sIGFbM10sIGNvbXBhdF9wdHIoYVs0XSksIGNvbXBhdF9wdHIoYVs1XSkpOworCQlicmVhazsKKwljYXNlIFNZU19TSFVURE9XTjoKKwkJcmV0ID0gc3lzX3NodXRkb3duKGEwLGExKTsKKwkJYnJlYWs7CisJY2FzZSBTWVNfU0VUU09DS09QVDoKKwkJcmV0ID0gY29tcGF0X3N5c19zZXRzb2Nrb3B0KGEwLCBhMSwgYVsyXSwKKwkJCQljb21wYXRfcHRyKGFbM10pLCBhWzRdKTsKKwkJYnJlYWs7CisJY2FzZSBTWVNfR0VUU09DS09QVDoKKwkJcmV0ID0gY29tcGF0X3N5c19nZXRzb2Nrb3B0KGEwLCBhMSwgYVsyXSwKKwkJCQljb21wYXRfcHRyKGFbM10pLCBjb21wYXRfcHRyKGFbNF0pKTsKKwkJYnJlYWs7CisJY2FzZSBTWVNfU0VORE1TRzoKKwkJcmV0ID0gY29tcGF0X3N5c19zZW5kbXNnKGEwLCBjb21wYXRfcHRyKGExKSwgYVsyXSk7CisJCWJyZWFrOworCWNhc2UgU1lTX1JFQ1ZNU0c6CisJCXJldCA9IGNvbXBhdF9zeXNfcmVjdm1zZyhhMCwgY29tcGF0X3B0cihhMSksIGFbMl0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL25ldC9jb3JlL01ha2VmaWxlIGIvbmV0L2NvcmUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFmMDMyNAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9jb3JlL01ha2VmaWxlCkBAIC0wLDAgKzEsMTcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBuZXR3b3JraW5nIGNvcmUuCisjCisKK29iai15IDo9IHNvY2subyBza2J1ZmYubyBpb3ZlYy5vIGRhdGFncmFtLm8gc3RyZWFtLm8gc2NtLm8gZ2VuX3N0YXRzLm8gZ2VuX2VzdGltYXRvci5vCisKK29iai0kKENPTkZJR19TWVNDVEwpICs9IHN5c2N0bF9uZXRfY29yZS5vCisKK29iai15CQkgICAgICs9IGZsb3cubyBkZXYubyBldGh0b29sLm8gZGV2X21jYXN0Lm8gZHN0Lm8gXAorCQkJbmVpZ2hib3VyLm8gcnRuZXRsaW5rLm8gdXRpbHMubyBsaW5rX3dhdGNoLm8gZmlsdGVyLm8KKworb2JqLSQoQ09ORklHX1NZU0ZTKSArPSBuZXQtc3lzZnMubworb2JqLSQoQ09ORklHX05FVEZJTFRFUikgKz0gbmV0ZmlsdGVyLm8KK29iai0kKENPTkZJR19ORVRfRElWRVJUKSArPSBkdi5vCitvYmotJChDT05GSUdfTkVUX1BLVEdFTikgKz0gcGt0Z2VuLm8KK29iai0kKENPTkZJR19ORVRfUkFESU8pICs9IHdpcmVsZXNzLm8KK29iai0kKENPTkZJR19ORVRQT0xMKSArPSBuZXRwb2xsLm8KZGlmZiAtLWdpdCBhL25ldC9jb3JlL2RhdGFncmFtLmMgYi9uZXQvY29yZS9kYXRhZ3JhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYmZkMjcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvY29yZS9kYXRhZ3JhbS5jCkBAIC0wLDAgKzEsNDgyIEBACisvKgorICoJU1VDUyBORVQzOgorICoKKyAqCUdlbmVyaWMgZGF0YWdyYW0gaGFuZGxpbmcgcm91dGluZXMuIFRoZXNlIGFyZSBnZW5lcmljIGZvciBhbGwKKyAqCXByb3RvY29scy4gUG9zc2libHkgYSBnZW5lcmljIElQIHZlcnNpb24gb24gdG9wIG9mIHRoZXNlIHdvdWxkCisgKgltYWtlIHNlbnNlLiBOb3QgdG9uaWdodCBob3dldmVyIDgtKS4KKyAqCVRoaXMgaXMgdXNlZCBiZWNhdXNlIFVEUCwgUkFXLCBQQUNLRVQsIEREUCwgSVBYLCBBWC4yNSBhbmQKKyAqCU5ldFJPTSBsYXllciBhbGwgaGF2ZSBpZGVudGljYWwgcG9sbCBjb2RlIGFuZCBtb3N0bHkKKyAqCWlkZW50aWNhbCByZWN2bXNnKCkgY29kZS4gU28gd2Ugc2hhcmUgaXQgaGVyZS4gVGhlIHBvbGwgd2FzCisgKglzaGFyZWQgYmVmb3JlIGJ1dCBidXJpZWQgaW4gdWRwLmMgc28gSSBtb3ZlZCBpdC4KKyAqCisgKglBdXRob3JzOglBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPi4gKGRhdGFncmFtX3BvbGwoKSBmcm9tIG9sZAorICoJCQkJCQkgICAgIHVkcC5jIGNvZGUpCisgKgorICoJRml4ZXM6CisgKgkJQWxhbiBDb3gJOglOVUxMIHJldHVybiBmcm9tIHNrYl9wZWVrX2NvcHkoKQorICoJCQkJCXVuZGVyc3Rvb2QKKyAqCQlBbGFuIENveAk6CVJld3JvdGUgc2tiX3JlYWRfZGF0YWdyYW0gdG8gYXZvaWQgdGhlCisgKgkJCQkJc2tiX3BlZWtfY29weSBzdHVmZi4KKyAqCQlBbGFuIENveAk6CUFkZGVkIHN1cHBvcnQgZm9yIFNPQ0tfU0VRUEFDS0VULgorICoJCQkJCUlQWCBjYW4gbm8gbG9uZ2VyIHVzZSB0aGUgU09fVFlQRSBoYWNrCisgKgkJCQkJYnV0IEFYLjI1IG5vdyB3b3JrcyByaWdodCwgYW5kIFNQWCBpcworICoJCQkJCWZlYXNpYmxlLgorICoJCUFsYW4gQ294CToJRml4ZWQgd3JpdGUgcG9sbCBvZiBub24gSVAgcHJvdG9jb2wKKyAqCQkJCQljcmFzaC4KKyAqCQlGbG9yaWFuICBMYSBSb2NoZToJQ2hhbmdlZCBmb3IgbXkgbmV3IHNrYnVmZiBoYW5kbGluZy4KKyAqCQlEYXJyeWwgTWlsZXMJOglGaXhlZCBub24tYmxvY2tpbmcgU09DS19TRVFQQUNLRVQuCisgKgkJTGludXMgVG9ydmFsZHMJOglCU0Qgc2VtYW50aWMgZml4ZXMuCisgKgkJQWxhbiBDb3gJOglEYXRhZ3JhbSBpb3ZlYyBoYW5kbGluZworICoJCURhcnJ5bCBNaWxlcwk6CUZpeGVkIG5vbi1ibG9ja2luZyBTT0NLX1NUUkVBTS4KKyAqCQlBbGFuIENveAk6CVBPU0lYaXNtcworICoJCVBldGUgV3lja29mZiAgICA6ICAgICAgIFVuY29ubmVjdGVkIGFjY2VwdCgpIGZpeC4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisKKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorCisKKy8qCisgKglJcyBhIHNvY2tldCAnY29ubmVjdGlvbiBvcmllbnRlZCcgPworICovCitzdGF0aWMgaW5saW5lIGludCBjb25uZWN0aW9uX2Jhc2VkKHN0cnVjdCBzb2NrICpzaykKK3sKKwlyZXR1cm4gc2stPnNrX3R5cGUgPT0gU09DS19TRVFQQUNLRVQgfHwgc2stPnNrX3R5cGUgPT0gU09DS19TVFJFQU07Cit9CisKKy8qCisgKiBXYWl0IGZvciBhIHBhY2tldC4uCisgKi8KK3N0YXRpYyBpbnQgd2FpdF9mb3JfcGFja2V0KHN0cnVjdCBzb2NrICpzaywgaW50ICplcnIsIGxvbmcgKnRpbWVvX3ApCit7CisJaW50IGVycm9yOworCURFRklORV9XQUlUKHdhaXQpOworCisJcHJlcGFyZV90b193YWl0X2V4Y2x1c2l2ZShzay0+c2tfc2xlZXAsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCisJLyogU29ja2V0IGVycm9ycz8gKi8KKwllcnJvciA9IHNvY2tfZXJyb3Ioc2spOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfZXJyOworCisJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSkKKwkJZ290byBvdXQ7CisKKwkvKiBTb2NrZXQgc2h1dCBkb3duPyAqLworCWlmIChzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pCisJCWdvdG8gb3V0X25vZXJyOworCisJLyogU2VxdWVuY2VkIHBhY2tldHMgY2FuIGNvbWUgZGlzY29ubmVjdGVkLgorCSAqIElmIHNvIHdlIHJlcG9ydCB0aGUgcHJvYmxlbQorCSAqLworCWVycm9yID0gLUVOT1RDT05OOworCWlmIChjb25uZWN0aW9uX2Jhc2VkKHNrKSAmJgorCSAgICAhKHNrLT5za19zdGF0ZSA9PSBUQ1BfRVNUQUJMSVNIRUQgfHwgc2stPnNrX3N0YXRlID09IFRDUF9MSVNURU4pKQorCQlnb3RvIG91dF9lcnI7CisKKwkvKiBoYW5kbGUgc2lnbmFscyAqLworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJZ290byBpbnRlcnJ1cHRlZDsKKworCWVycm9yID0gMDsKKwkqdGltZW9fcCA9IHNjaGVkdWxlX3RpbWVvdXQoKnRpbWVvX3ApOworb3V0OgorCWZpbmlzaF93YWl0KHNrLT5za19zbGVlcCwgJndhaXQpOworCXJldHVybiBlcnJvcjsKK2ludGVycnVwdGVkOgorCWVycm9yID0gc29ja19pbnRyX2Vycm5vKCp0aW1lb19wKTsKK291dF9lcnI6CisJKmVyciA9IGVycm9yOworCWdvdG8gb3V0Oworb3V0X25vZXJyOgorCSplcnIgPSAwOworCWVycm9yID0gMTsKKwlnb3RvIG91dDsKK30KKworLyoqCisgKglza2JfcmVjdl9kYXRhZ3JhbSAtIFJlY2VpdmUgYSBkYXRhZ3JhbSBza2J1ZmYKKyAqCUBzayAtIHNvY2tldAorICoJQGZsYWdzIC0gTVNHXyBmbGFncworICoJQG5vYmxvY2sgLSBibG9ja2luZyBvcGVyYXRpb24/CisgKglAZXJyIC0gZXJyb3IgY29kZSByZXR1cm5lZAorICoKKyAqCUdldCBhIGRhdGFncmFtIHNrYnVmZiwgdW5kZXJzdGFuZHMgdGhlIHBlZWtpbmcsIG5vbmJsb2NraW5nIHdha2V1cHMKKyAqCWFuZCBwb3NzaWJsZSByYWNlcy4gVGhpcyByZXBsYWNlcyBpZGVudGljYWwgY29kZSBpbiBwYWNrZXQsIHJhdyBhbmQKKyAqCXVkcCwgYXMgd2VsbCBhcyB0aGUgSVBYIEFYLjI1IGFuZCBBcHBsZXRhbGsuIEl0IGFsc28gZmluYWxseSBmaXhlcworICoJdGhlIGxvbmcgc3RhbmRpbmcgcGVlayBhbmQgcmVhZCByYWNlIGZvciBkYXRhZ3JhbSBzb2NrZXRzLiBJZiB5b3UKKyAqCWFsdGVyIHRoaXMgcm91dGluZSByZW1lbWJlciBpdCBtdXN0IGJlIHJlLWVudHJhbnQuCisgKgorICoJVGhpcyBmdW5jdGlvbiB3aWxsIGxvY2sgdGhlIHNvY2tldCBpZiBhIHNrYiBpcyByZXR1cm5lZCwgc28gdGhlIGNhbGxlcgorICoJbmVlZHMgdG8gdW5sb2NrIHRoZSBzb2NrZXQgaW4gdGhhdCBjYXNlICh1c3VhbGx5IGJ5IGNhbGxpbmcKKyAqCXNrYl9mcmVlX2RhdGFncmFtKQorICoKKyAqCSogSXQgZG9lcyBub3QgbG9jayBzb2NrZXQgc2luY2UgdG9kYXkuIFRoaXMgZnVuY3Rpb24gaXMKKyAqCSogZnJlZSBvZiByYWNlIGNvbmRpdGlvbnMuIFRoaXMgbWVhc3VyZSBzaG91bGQvY2FuIGltcHJvdmUKKyAqCSogc2lnbmlmaWNhbnRseSBkYXRhZ3JhbSBzb2NrZXQgbGF0ZW5jaWVzIGF0IGhpZ2ggbG9hZHMsCisgKgkqIHdoZW4gZGF0YSBjb3B5aW5nIHRvIHVzZXIgc3BhY2UgdGFrZXMgbG90cyBvZiB0aW1lLgorICoJKiAoQlRXIEkndmUganVzdCBraWxsZWQgdGhlIGxhc3QgY2xpKCkgaW4gSVAvSVB2Ni9jb3JlL25ldGxpbmsvcGFja2V0CisgKgkqICA4KSBHcmVhdCB3aW4uKQorICoJKgkJCSAgICAgICAgICAgICAgICAgICAgLS1BTksgKDk4MDcyOSkKKyAqCisgKglUaGUgb3JkZXIgb2YgdGhlIHRlc3RzIHdoZW4gd2UgZmluZCBubyBkYXRhIHdhaXRpbmcgYXJlIHNwZWNpZmllZAorICoJcXVpdGUgZXhwbGljaXRseSBieSBQT1NJWCAxMDAzLjFnLCBkb24ndCBjaGFuZ2UgdGhlbSB3aXRob3V0IGhhdmluZworICoJdGhlIHN0YW5kYXJkIGFyb3VuZCBwbGVhc2UuCisgKi8KK3N0cnVjdCBza19idWZmICpza2JfcmVjdl9kYXRhZ3JhbShzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGZsYWdzLAorCQkJCSAgaW50IG5vYmxvY2ssIGludCAqZXJyKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJbG9uZyB0aW1lbzsKKwkvKgorCSAqIENhbGxlciBpcyBhbGxvd2VkIG5vdCB0byBjaGVjayBzay0+c2tfZXJyIGJlZm9yZSBza2JfcmVjdl9kYXRhZ3JhbSgpCisJICovCisJaW50IGVycm9yID0gc29ja19lcnJvcihzayk7CisKKwlpZiAoZXJyb3IpCisJCWdvdG8gbm9fcGFja2V0OworCisJdGltZW8gPSBzb2NrX3JjdnRpbWVvKHNrLCBub2Jsb2NrKTsKKworCWRvIHsKKwkJLyogQWdhaW4gb25seSB1c2VyIGxldmVsIGNvZGUgY2FsbHMgdGhpcyBmdW5jdGlvbiwgc28gbm90aGluZworCQkgKiBpbnRlcnJ1cHQgbGV2ZWwgd2lsbCBzdWRkZW5seSBlYXQgdGhlIHJlY2VpdmVfcXVldWUuCisJCSAqCisJCSAqIExvb2sgYXQgY3VycmVudCBuZnMgY2xpZW50IGJ5IHRoZSB3YXkuLi4KKwkJICogSG93ZXZlciwgdGhpcyBmdW5jdGlvbiB3YXMgY29ycmVudCBpbiBhbnkgY2FzZS4gOCkKKwkJICovCisJCWlmIChmbGFncyAmIE1TR19QRUVLKSB7CisJCQl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2ssCisJCQkJCSAgY3B1X2ZsYWdzKTsKKwkJCXNrYiA9IHNrYl9wZWVrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJCQlpZiAoc2tiKQorCQkJCWF0b21pY19pbmMoJnNrYi0+dXNlcnMpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCX0gZWxzZQorCQkJc2tiID0gc2tiX2RlcXVldWUoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKworCQlpZiAoc2tiKQorCQkJcmV0dXJuIHNrYjsKKworCQkvKiBVc2VyIGRvZXNuJ3Qgd2FudCB0byB3YWl0ICovCisJCWVycm9yID0gLUVBR0FJTjsKKwkJaWYgKCF0aW1lbykKKwkJCWdvdG8gbm9fcGFja2V0OworCisJfSB3aGlsZSAoIXdhaXRfZm9yX3BhY2tldChzaywgZXJyLCAmdGltZW8pKTsKKworCXJldHVybiBOVUxMOworCitub19wYWNrZXQ6CisJKmVyciA9IGVycm9yOworCXJldHVybiBOVUxMOworfQorCit2b2lkIHNrYl9mcmVlX2RhdGFncmFtKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlrZnJlZV9za2Ioc2tiKTsKK30KKworLyoqCisgKglza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyAtIENvcHkgYSBkYXRhZ3JhbSB0byBhbiBpb3ZlYy4KKyAqCUBza2IgLSBidWZmZXIgdG8gY29weQorICoJQG9mZnNldCAtIG9mZnNldCBpbiB0aGUgYnVmZmVyIHRvIHN0YXJ0IGNvcHlpbmcgZnJvbQorICoJQGlvdmVjIC0gaW8gdmVjdG9yIHRvIGNvcHkgdG8KKyAqCUBsZW4gLSBhbW91bnQgb2YgZGF0YSB0byBjb3B5IGZyb20gYnVmZmVyIHRvIGlvdmVjCisgKgorICoJTm90ZTogdGhlIGlvdmVjIGlzIG1vZGlmaWVkIGR1cmluZyB0aGUgY29weS4KKyAqLworaW50IHNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGludCBvZmZzZXQsCisJCQkgICAgc3RydWN0IGlvdmVjICp0bywgaW50IGxlbikKK3sKKwlpbnQgc3RhcnQgPSBza2JfaGVhZGxlbihza2IpOworCWludCBpLCBjb3B5ID0gc3RhcnQgLSBvZmZzZXQ7CisKKwkvKiBDb3B5IGhlYWRlci4gKi8KKwlpZiAoY29weSA+IDApIHsKKwkJaWYgKGNvcHkgPiBsZW4pCisJCQljb3B5ID0gbGVuOworCQlpZiAobWVtY3B5X3RvaW92ZWModG8sIHNrYi0+ZGF0YSArIG9mZnNldCwgY29weSkpCisJCQlnb3RvIGZhdWx0OworCQlpZiAoKGxlbiAtPSBjb3B5KSA9PSAwKQorCQkJcmV0dXJuIDA7CisJCW9mZnNldCArPSBjb3B5OworCX0KKworCS8qIENvcHkgcGFnZWQgYXBwZW5kaXguIEhtbS4uLiB3aHkgZG9lcyB0aGlzIGxvb2sgc28gY29tcGxpY2F0ZWQ/ICovCisJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykgeworCQlpbnQgZW5kOworCisJCUJVR19UUkFQKHN0YXJ0IDw9IG9mZnNldCArIGxlbik7CisKKwkJZW5kID0gc3RhcnQgKyBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CisJCWlmICgoY29weSA9IGVuZCAtIG9mZnNldCkgPiAwKSB7CisJCQlpbnQgZXJyOworCQkJdTggICp2YWRkcjsKKwkJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKKwkJCXN0cnVjdCBwYWdlICpwYWdlID0gZnJhZy0+cGFnZTsKKworCQkJaWYgKGNvcHkgPiBsZW4pCisJCQkJY29weSA9IGxlbjsKKwkJCXZhZGRyID0ga21hcChwYWdlKTsKKwkJCWVyciA9IG1lbWNweV90b2lvdmVjKHRvLCB2YWRkciArIGZyYWctPnBhZ2Vfb2Zmc2V0ICsKKwkJCQkJICAgICBvZmZzZXQgLSBzdGFydCwgY29weSk7CisJCQlrdW5tYXAocGFnZSk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gZmF1bHQ7CisJCQlpZiAoIShsZW4gLT0gY29weSkpCisJCQkJcmV0dXJuIDA7CisJCQlvZmZzZXQgKz0gY29weTsKKwkJfQorCQlzdGFydCA9IGVuZDsKKwl9CisKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKmxpc3QgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKKworCQlmb3IgKDsgbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJCWludCBlbmQ7CisKKwkJCUJVR19UUkFQKHN0YXJ0IDw9IG9mZnNldCArIGxlbik7CisKKwkJCWVuZCA9IHN0YXJ0ICsgbGlzdC0+bGVuOworCQkJaWYgKChjb3B5ID0gZW5kIC0gb2Zmc2V0KSA+IDApIHsKKwkJCQlpZiAoY29weSA+IGxlbikKKwkJCQkJY29weSA9IGxlbjsKKwkJCQlpZiAoc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMobGlzdCwKKwkJCQkJCQkgICAgb2Zmc2V0IC0gc3RhcnQsCisJCQkJCQkJICAgIHRvLCBjb3B5KSkKKwkJCQkJZ290byBmYXVsdDsKKwkJCQlpZiAoKGxlbiAtPSBjb3B5KSA9PSAwKQorCQkJCQlyZXR1cm4gMDsKKwkJCQlvZmZzZXQgKz0gY29weTsKKwkJCX0KKwkJCXN0YXJ0ID0gZW5kOworCQl9CisJfQorCWlmICghbGVuKQorCQlyZXR1cm4gMDsKKworZmF1bHQ6CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKK3N0YXRpYyBpbnQgc2tiX2NvcHlfYW5kX2NzdW1fZGF0YWdyYW0oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCwKKwkJCQkgICAgICB1OCBfX3VzZXIgKnRvLCBpbnQgbGVuLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCAqY3N1bXApCit7CisJaW50IHN0YXJ0ID0gc2tiX2hlYWRsZW4oc2tiKTsKKwlpbnQgcG9zID0gMDsKKwlpbnQgaSwgY29weSA9IHN0YXJ0IC0gb2Zmc2V0OworCisJLyogQ29weSBoZWFkZXIuICovCisJaWYgKGNvcHkgPiAwKSB7CisJCWludCBlcnIgPSAwOworCQlpZiAoY29weSA+IGxlbikKKwkJCWNvcHkgPSBsZW47CisJCSpjc3VtcCA9IGNzdW1fYW5kX2NvcHlfdG9fdXNlcihza2ItPmRhdGEgKyBvZmZzZXQsIHRvLCBjb3B5LAorCQkJCQkgICAgICAgKmNzdW1wLCAmZXJyKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZmF1bHQ7CisJCWlmICgobGVuIC09IGNvcHkpID09IDApCisJCQlyZXR1cm4gMDsKKwkJb2Zmc2V0ICs9IGNvcHk7CisJCXRvICs9IGNvcHk7CisJCXBvcyA9IGNvcHk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykgeworCQlpbnQgZW5kOworCisJCUJVR19UUkFQKHN0YXJ0IDw9IG9mZnNldCArIGxlbik7CisKKwkJZW5kID0gc3RhcnQgKyBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CisJCWlmICgoY29weSA9IGVuZCAtIG9mZnNldCkgPiAwKSB7CisJCQl1bnNpZ25lZCBpbnQgY3N1bTI7CisJCQlpbnQgZXJyID0gMDsKKwkJCXU4ICAqdmFkZHI7CisJCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGZyYWctPnBhZ2U7CisKKwkJCWlmIChjb3B5ID4gbGVuKQorCQkJCWNvcHkgPSBsZW47CisJCQl2YWRkciA9IGttYXAocGFnZSk7CisJCQljc3VtMiA9IGNzdW1fYW5kX2NvcHlfdG9fdXNlcih2YWRkciArCisJCQkJCQkJZnJhZy0+cGFnZV9vZmZzZXQgKworCQkJCQkJCW9mZnNldCAtIHN0YXJ0LAorCQkJCQkJICAgICAgdG8sIGNvcHksIDAsICZlcnIpOworCQkJa3VubWFwKHBhZ2UpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIGZhdWx0OworCQkJKmNzdW1wID0gY3N1bV9ibG9ja19hZGQoKmNzdW1wLCBjc3VtMiwgcG9zKTsKKwkJCWlmICghKGxlbiAtPSBjb3B5KSkKKwkJCQlyZXR1cm4gMDsKKwkJCW9mZnNldCArPSBjb3B5OworCQkJdG8gKz0gY29weTsKKwkJCXBvcyArPSBjb3B5OworCQl9CisJCXN0YXJ0ID0gZW5kOworCX0KKworCWlmIChza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqbGlzdCA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0OworCisJCWZvciAoOyBsaXN0OyBsaXN0PWxpc3QtPm5leHQpIHsKKwkJCWludCBlbmQ7CisKKwkJCUJVR19UUkFQKHN0YXJ0IDw9IG9mZnNldCArIGxlbik7CisKKwkJCWVuZCA9IHN0YXJ0ICsgbGlzdC0+bGVuOworCQkJaWYgKChjb3B5ID0gZW5kIC0gb2Zmc2V0KSA+IDApIHsKKwkJCQl1bnNpZ25lZCBpbnQgY3N1bTIgPSAwOworCQkJCWlmIChjb3B5ID4gbGVuKQorCQkJCQljb3B5ID0gbGVuOworCQkJCWlmIChza2JfY29weV9hbmRfY3N1bV9kYXRhZ3JhbShsaXN0LAorCQkJCQkJCSAgICAgICBvZmZzZXQgLSBzdGFydCwKKwkJCQkJCQkgICAgICAgdG8sIGNvcHksCisJCQkJCQkJICAgICAgICZjc3VtMikpCisJCQkJCWdvdG8gZmF1bHQ7CisJCQkJKmNzdW1wID0gY3N1bV9ibG9ja19hZGQoKmNzdW1wLCBjc3VtMiwgcG9zKTsKKwkJCQlpZiAoKGxlbiAtPSBjb3B5KSA9PSAwKQorCQkJCQlyZXR1cm4gMDsKKwkJCQlvZmZzZXQgKz0gY29weTsKKwkJCQl0byArPSBjb3B5OworCQkJCXBvcyArPSBjb3B5OworCQkJfQorCQkJc3RhcnQgPSBlbmQ7CisJCX0KKwl9CisJaWYgKCFsZW4pCisJCXJldHVybiAwOworCitmYXVsdDoKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworLyoqCisgKglza2JfY29weV9hbmRfY3N1bV9kYXRhZ3JhbV9pb3ZlYyAtIENvcHkgYW5kIGNoZWNrdW0gc2tiIHRvIHVzZXIgaW92ZWMuCisgKglAc2tiIC0gc2tidWZmCisgKglAaGxlbiAtIGhhcmR3YXJlIGxlbmd0aAorICoJQGlvdmVjIC0gaW8gdmVjdG9yCisgKiAKKyAqCUNhbGxlciBfbXVzdF8gY2hlY2sgdGhhdCBza2Igd2lsbCBmaXQgdG8gdGhpcyBpb3ZlYy4KKyAqCisgKglSZXR1cm5zOiAwICAgICAgIC0gc3VjY2Vzcy4KKyAqCQkgLUVJTlZBTCAtIGNoZWNrc3VtIGZhaWx1cmUuCisgKgkJIC1FRkFVTFQgLSBmYXVsdCBkdXJpbmcgY29weS4gQmV3YXJlLCBpbiB0aGlzIGNhc2UgaW92ZWMKKyAqCQkJICAgY2FuIGJlIG1vZGlmaWVkIQorICovCitpbnQgc2tiX2NvcHlfYW5kX2NzdW1fZGF0YWdyYW1faW92ZWMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgIGludCBobGVuLCBzdHJ1Y3QgaW92ZWMgKmlvdikKK3sKKwl1bnNpZ25lZCBpbnQgY3N1bTsKKwlpbnQgY2h1bmsgPSBza2ItPmxlbiAtIGhsZW47CisKKwkvKiBTa2lwIGZpbGxlZCBlbGVtZW50cy4KKwkgKiBQcmV0dHkgc2lsbHksIGxvb2sgYXQgbWVtY3B5X3RvaW92ZWMsIHRob3VnaCA4KQorCSAqLworCXdoaWxlICghaW92LT5pb3ZfbGVuKQorCQlpb3YrKzsKKworCWlmIChpb3YtPmlvdl9sZW4gPCBjaHVuaykgeworCQlpZiAoKHVuc2lnbmVkIHNob3J0KWNzdW1fZm9sZChza2JfY2hlY2tzdW0oc2tiLCAwLCBjaHVuayArIGhsZW4sCisJCQkJCQkJICAgc2tiLT5jc3VtKSkpCisJCQlnb3RvIGNzdW1fZXJyb3I7CisJCWlmIChza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhza2IsIGhsZW4sIGlvdiwgY2h1bmspKQorCQkJZ290byBmYXVsdDsKKwl9IGVsc2UgeworCQljc3VtID0gY3N1bV9wYXJ0aWFsKHNrYi0+ZGF0YSwgaGxlbiwgc2tiLT5jc3VtKTsKKwkJaWYgKHNrYl9jb3B5X2FuZF9jc3VtX2RhdGFncmFtKHNrYiwgaGxlbiwgaW92LT5pb3ZfYmFzZSwKKwkJCQkJICAgICAgIGNodW5rLCAmY3N1bSkpCisJCQlnb3RvIGZhdWx0OworCQlpZiAoKHVuc2lnbmVkIHNob3J0KWNzdW1fZm9sZChjc3VtKSkKKwkJCWdvdG8gY3N1bV9lcnJvcjsKKwkJaW92LT5pb3ZfbGVuIC09IGNodW5rOworCQlpb3YtPmlvdl9iYXNlICs9IGNodW5rOworCX0KKwlyZXR1cm4gMDsKK2NzdW1fZXJyb3I6CisJcmV0dXJuIC1FSU5WQUw7CitmYXVsdDoKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworLyoqCisgKiAJZGF0YWdyYW1fcG9sbCAtIGdlbmVyaWMgZGF0YWdyYW0gcG9sbAorICoJQGZpbGUgLSBmaWxlIHN0cnVjdAorICoJQHNvY2sgLSBzb2NrZXQKKyAqCUB3YWl0IC0gcG9sbCB0YWJsZQorICoKKyAqCURhdGFncmFtIHBvbGw6IEFnYWluIHRvdGFsbHkgZ2VuZXJpYy4gVGhpcyBhbHNvIGhhbmRsZXMKKyAqCXNlcXVlbmNlZCBwYWNrZXQgc29ja2V0cyBwcm92aWRpbmcgdGhlIHNvY2tldCByZWNlaXZlIHF1ZXVlCisgKglpcyBvbmx5IGV2ZXIgaG9sZGluZyBkYXRhIHJlYWR5IHRvIHJlY2VpdmUuCisgKgorICoJTm90ZTogd2hlbiB5b3UgX2Rvbid0XyB1c2UgdGhpcyByb3V0aW5lIGZvciB0aGlzIHByb3RvY29sLAorICoJYW5kIHlvdSB1c2UgYSBkaWZmZXJlbnQgd3JpdGUgcG9saWN5IGZyb20gc29ja193cml0ZWFibGUoKQorICoJdGhlbiBwbGVhc2Ugc3VwcGx5IHlvdXIgb3duIHdyaXRlX3NwYWNlIGNhbGxiYWNrLgorICovCit1bnNpZ25lZCBpbnQgZGF0YWdyYW1fcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCSAgIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJdW5zaWduZWQgaW50IG1hc2s7CisKKwlwb2xsX3dhaXQoZmlsZSwgc2stPnNrX3NsZWVwLCB3YWl0KTsKKwltYXNrID0gMDsKKworCS8qIGV4Y2VwdGlvbmFsIGV2ZW50cz8gKi8KKwlpZiAoc2stPnNrX2VyciB8fCAhc2tiX3F1ZXVlX2VtcHR5KCZzay0+c2tfZXJyb3JfcXVldWUpKQorCQltYXNrIHw9IFBPTExFUlI7CisJaWYgKHNrLT5za19zaHV0ZG93biA9PSBTSFVURE9XTl9NQVNLKQorCQltYXNrIHw9IFBPTExIVVA7CisKKwkvKiByZWFkYWJsZT8gKi8KKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3JlY2VpdmVfcXVldWUpIHx8CisJICAgIChzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pKQorCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisKKwkvKiBDb25uZWN0aW9uLWJhc2VkIG5lZWQgdG8gY2hlY2sgZm9yIHRlcm1pbmF0aW9uIGFuZCBzdGFydHVwICovCisJaWYgKGNvbm5lY3Rpb25fYmFzZWQoc2spKSB7CisJCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0NMT1NFKQorCQkJbWFzayB8PSBQT0xMSFVQOworCQkvKiBjb25uZWN0aW9uIGhhc24ndCBzdGFydGVkIHlldD8gKi8KKwkJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfU1lOX1NFTlQpCisJCQlyZXR1cm4gbWFzazsKKwl9CisKKwkvKiB3cml0YWJsZT8gKi8KKwlpZiAoc29ja193cml0ZWFibGUoc2spKQorCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNIHwgUE9MTFdSQkFORDsKKwllbHNlCisJCXNldF9iaXQoU09DS19BU1lOQ19OT1NQQUNFLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOworCisJcmV0dXJuIG1hc2s7Cit9CisKK0VYUE9SVF9TWU1CT0woZGF0YWdyYW1fcG9sbCk7CitFWFBPUlRfU1lNQk9MKHNrYl9jb3B5X2FuZF9jc3VtX2RhdGFncmFtX2lvdmVjKTsKK0VYUE9SVF9TWU1CT0woc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMpOworRVhQT1JUX1NZTUJPTChza2JfZnJlZV9kYXRhZ3JhbSk7CitFWFBPUlRfU1lNQk9MKHNrYl9yZWN2X2RhdGFncmFtKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Rldi5jIGIvbmV0L2NvcmUvZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIzNDRkOQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9jb3JlL2Rldi5jCkBAIC0wLDAgKzEsMzM1OSBAQAorLyoKKyAqIAlORVQzCVByb3RvY29sIGluZGVwZW5kZW50IGRldmljZSBzdXBwb3J0IHJvdXRpbmVzLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCURlcml2ZWQgZnJvbSB0aGUgbm9uIElQIHBhcnRzIG9mIGRldi5jIDEuMC4xOQorICogCQlBdXRob3JzOglSb3NzIEJpcm8sIDxiaXI3QGxlbGFuZC5TdGFuZm9yZC5FZHU+CisgKgkJCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCQkJCU1hcmsgRXZhbnMsIDxldmFuc21wQHVodXJhLmFzdG9uLmFjLnVrPgorICoKKyAqCUFkZGl0aW9uYWwgQXV0aG9yczoKKyAqCQlGbG9yaWFuIGxhIFJvY2hlIDxyenNmbEByei51bmktc2IuZGU+CisgKgkJQWxhbiBDb3ggPGd3NHB0c0BndzRwdHMuYW1wci5vcmc+CisgKgkJRGF2aWQgSGluZHMgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICoJCUFsZXhleSBLdXpuZXRzb3YgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoJCUFkYW0gU3VsbWlja2kgPGFkYW1AY2Zhci51bWQuZWR1PgorICogICAgICAgICAgICAgIFBla2thIFJpaWtvbmVuIDxwcmlpa29uZUBwb2VzaWRvbi5wc3B0LmZpPgorICoKKyAqCUNoYW5nZXM6CisgKiAgICAgICAgICAgICAgRC5KLiBCYXJyb3cgICAgIDogICAgICAgRml4ZWQgYnVnIHdoZXJlIGRldi0+cmVmY250IGdldHMgc2V0CisgKiAgICAgICAgICAgICAgCQkJdG8gMiBpZiByZWdpc3Rlcl9uZXRkZXYgZ2V0cyBjYWxsZWQKKyAqICAgICAgICAgICAgICAJCQliZWZvcmUgbmV0X2Rldl9pbml0ICYgYWxzbyByZW1vdmVkIGEKKyAqICAgICAgICAgICAgICAJCQlmZXcgbGluZXMgb2YgY29kZSBpbiB0aGUgcHJvY2Vzcy4KKyAqCQlBbGFuIENveAk6CWRldmljZSBwcml2YXRlIGlvY3RsIGNvcGllcyBmaWVsZHMgYmFjay4KKyAqCQlBbGFuIENveAk6CVRyYW5zbWl0IHF1ZXVlIGNvZGUgZG9lcyByZWxldmFudAorICoJCQkJCXN0dW50cyB0byBrZWVwIHRoZSBxdWV1ZSBzYWZlLgorICoJCUFsYW4gQ294CToJRml4ZWQgZG91YmxlIGxvY2suCisgKgkJQWxhbiBDb3gJOglGaXhlZCBwcm9taXNjIE5VTEwgcG9pbnRlciB0cmFwCisgKgkJPz8/Pz8/Pz8JOglTdXBwb3J0IHRoZSBmdWxsIHByaXZhdGUgaW9jdGwgcmFuZ2UKKyAqCQlBbGFuIENveAk6CU1vdmVkIGlvY3RsIHBlcm1pc3Npb24gY2hlY2sgaW50bworICoJCQkJCWRyaXZlcnMKKyAqCQlUaW0gS29yZGFzCToJU0lPQ0FERE1VTFRJL1NJT0NERUxNVUxUSQorICoJCUFsYW4gQ294CToJMTAwIGJhY2tsb2cganVzdCBkb2Vzbid0IGN1dCBpdCB3aGVuCisgKgkJCQkJeW91IHN0YXJ0IGRvaW5nIG11bHRpY2FzdCB2aWRlbyA4KQorICoJCUFsYW4gQ294CToJUmV3cm90ZSBuZXRfYmggYW5kIGxpc3QgbWFuYWdlci4KKyAqCQlBbGFuIENveAk6IAlGaXggRVRIX1BfQUxMIGVjaG9iYWNrIGxlbmd0aHMuCisgKgkJQWxhbiBDb3gJOglUb29rIG91dCB0cmFuc21pdCBldmVyeSBwYWNrZXQgcGFzcworICoJCQkJCVNhdmVkIGEgZmV3IGJ5dGVzIGluIHRoZSBpb2N0bCBoYW5kbGVyCisgKgkJQWxhbiBDb3gJOglOZXR3b3JrIGRyaXZlciBzZXRzIHBhY2tldCB0eXBlIGJlZm9yZQorICoJCQkJCWNhbGxpbmcgbmV0aWZfcnguIFNhdmVzIGEgZnVuY3Rpb24KKyAqCQkJCQljYWxsIGEgcGFja2V0LgorICoJCUFsYW4gQ294CToJSGFzaGVkIG5ldF9iaCgpCisgKgkJUmljaGFyZCBLb29pam1hbjoJVGltZXN0YW1wIGZpeGVzLgorICoJCUFsYW4gQ294CToJV3JvbmcgZmllbGQgaW4gU0lPQ0dJRkRTVEFERFIKKyAqCQlBbGFuIENveAk6CURldmljZSBsb2NrIHByb3RlY3Rpb24uCisgKgkJQWxhbiBDb3gJOiAJRml4ZWQgbmFzdHkgc2lkZSBlZmZlY3Qgb2YgZGV2aWNlIGNsb3NlCisgKgkJCQkJY2hhbmdlcy4KKyAqCQlSdWRpIENpbGlicmFzaQk6CVBhc3MgdGhlIHJpZ2h0IHRoaW5nIHRvCisgKgkJCQkJc2V0X21hY19hZGRyZXNzKCkKKyAqCQlEYXZlIE1pbGxlcgk6CTMyYml0IHF1YW50aXR5IGZvciB0aGUgZGV2aWNlIGxvY2sgdG8KKyAqCQkJCQltYWtlIGl0IHdvcmsgb3V0IG9uIGEgU3BhcmMuCisgKgkJQmpvcm4gRWt3YWxsCToJQWRkZWQgS0VSTkVMRCBoYWNrLgorICoJCUFsYW4gQ294CToJQ2xlYW5lZCB1cCB0aGUgYmFja2xvZyBpbml0aWFsaXNlLgorICoJCUNyYWlnIE1ldHoJOglTSU9DR0lGQ09ORiBmaXggaWYgc3BhY2UgZm9yIHVuZGVyCisgKgkJCQkJMSBkZXZpY2UuCisgKgkgICAgVGhvbWFzIEJvZ2VuZG9lcmZlciA6CVJldHVybiBFTk9ERVYgZm9yIGRldl9vcGVuLCBpZiB0aGVyZQorICoJCQkJCWlzIG5vIGRldmljZSBvcGVuIGZ1bmN0aW9uLgorICoJCUFuZGkgS2xlZW4JOglGaXggZXJyb3IgcmVwb3J0aW5nIGZvciBTSU9DR0lGQ09ORgorICoJICAgIE1pY2hhZWwgQ2hhc3RhaW4JOglGaXggc2lnbmVkL3Vuc2lnbmVkIGZvciBTSU9DR0lGQ09ORgorICoJCUN5cnVzIER1cmdpbgk6CUNsZWFuZWQgZm9yIEtNT0QKKyAqCQlBZGFtIFN1bG1pY2tpICAgOglCdWcgRml4IDogTmV0d29yayBEZXZpY2UgVW5sb2FkCisgKgkJCQkJQSBuZXR3b3JrIGRldmljZSB1bmxvYWQgbmVlZHMgdG8gcHVyZ2UKKyAqCQkJCQl0aGUgYmFja2xvZyBxdWV1ZS4KKyAqCVBhdWwgUnVzdHkgUnVzc2VsbAk6CVNJT0NTSUZOQU1FCisgKiAgICAgICAgICAgICAgUGVra2EgUmlpa29uZW4gIDoJTmV0ZGV2IGJvb3QtdGltZSBzZXR0aW5ncyBjb2RlCisgKiAgICAgICAgICAgICAgQW5kcmV3IE1vcnRvbiAgIDogICAgICAgTWFrZSB1bnJlZ2lzdGVyX25ldGRldmljZSB3YWl0CisgKiAgICAgICAgICAgICAgCQkJaW5kZWZpbml0ZWx5IG9uIGRldi0+cmVmY250CisgKiAJCUogSGFkaSBTYWxpbQk6CS0gQmFja2xvZyBxdWV1ZSBzYW1wbGluZworICoJCQkJICAgICAgICAtIG5ldGlmX3J4KCkgZmVlZGJhY2sKKyAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfYnJpZGdlLmg+CisjaW5jbHVkZSA8bGludXgvZGl2ZXJ0Lmg+CisjaW5jbHVkZSA8bmV0L2RzdC5oPgorI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldHBvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaWZkZWYgQ09ORklHX05FVF9SQURJTworI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CQkvKiBOb3RlIDogd2lsbCBkZWZpbmUgV0lSRUxFU1NfRVhUICovCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNlbmRpZgkvKiBDT05GSUdfTkVUX1JBRElPICovCisjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KKworLyogVGhpcyBkZWZpbmUsIGlmIHNldCwgd2lsbCByYW5kb21seSBkcm9wIGEgcGFja2V0IHdoZW4gY29uZ2VzdGlvbgorICogaXMgbW9yZSB0aGFuIG1vZGVyYXRlLiAgSXQgaGVscHMgZmFpcm5lc3MgaW4gdGhlIG11bHRpLWludGVyZmFjZQorICogY2FzZSB3aGVuIG9uZSBvZiB0aGVtIGlzIGEgaG9nLCBidXQgaXQga2lsbHMgcGVyZm9ybWFuY2UgZm9yIHRoZQorICogc2luZ2xlIGludGVyZmFjZSBjYXNlIHNvIGl0IGlzIG9mZiBub3cgYnkgZGVmYXVsdC4KKyAqLworI3VuZGVmIFJBTkRfTElFCisKKy8qIFNldHRpbmcgdGhpcyB3aWxsIHNhbXBsZSB0aGUgcXVldWUgbGVuZ3RocyBhbmQgdGh1cyBjb25nZXN0aW9uCisgKiB2aWEgYSB0aW1lciBpbnN0ZWFkIG9mIGFzIGVhY2ggcGFja2V0IGlzIHJlY2VpdmVkLgorICovCisjdW5kZWYgT0ZGTElORV9TQU1QTEUKKworLyoKKyAqCVRoZSBsaXN0IG9mIHBhY2tldCB0eXBlcyB3ZSB3aWxsIHJlY2VpdmUgKGFzIG9wcG9zZWQgdG8gZGlzY2FyZCkKKyAqCWFuZCB0aGUgcm91dGluZXMgdG8gaW52b2tlLgorICoKKyAqCVdoeSAxNi4gQmVjYXVzZSB3aXRoIDE2IHRoZSBvbmx5IG92ZXJsYXAgd2UgZ2V0IG9uIGEgaGFzaCBvZiB0aGUKKyAqCWxvdyBuaWJibGUgb2YgdGhlIHByb3RvY29sIHZhbHVlIGlzIFJBUlAvU05BUC9YLjI1LgorICoKKyAqICAgICAgTk9URTogIFRoYXQgaXMgbm8gbG9uZ2VyIHRydWUgd2l0aCB0aGUgYWRkaXRpb24gb2YgVkxBTiB0YWdzLiAgTm90CisgKiAgICAgICAgICAgICBzdXJlIHdoaWNoIHNob3VsZCBnbyBmaXJzdCwgYnV0IEkgYmV0IGl0IHdvbid0IG1ha2UgbXVjaAorICogICAgICAgICAgICAgZGlmZmVyZW5jZSBpZiB3ZSBhcmUgcnVubmluZyBWTEFOcy4gIFRoZSBnb29kIG5ld3MgaXMgdGhhdAorICogICAgICAgICAgICAgdGhpcyBwcm90b2NvbCB3b24ndCBiZSBpbiB0aGUgbGlzdCB1bmxlc3MgY29tcGlsZWQgaW4sIHNvCisgKiAgICAgICAgICAgICB0aGUgYXZlcmFnZSB1c2VyICh3L291dCBWTEFOcykgd2lsbCBub3QgYmUgYWR2ZXJzbHkgYWZmZWN0ZWQuCisgKiAgICAgICAgICAgICAtLUJMRworICoKKyAqCQkwODAwCUlQCisgKgkJODEwMCAgICA4MDIuMVEgVkxBTgorICoJCTAwMDEJODAyLjMKKyAqCQkwMDAyCUFYLjI1CisgKgkJMDAwNAk4MDIuMgorICoJCTgwMzUJUkFSUAorICoJCTAwMDUJU05BUAorICoJCTA4MDUJWC4yNQorICoJCTA4MDYJQVJQCisgKgkJODEzNwlJUFgKKyAqCQkwMDA5CUxvY2FsdGFsaworICoJCTg2REQJSVB2NgorICovCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socHR5cGVfbG9jayk7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBwdHlwZV9iYXNlWzE2XTsJLyogMTYgd2F5IGhhc2hlZCBsaXN0ICovCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBwdHlwZV9hbGw7CQkvKiBUYXBzICovCisKKyNpZmRlZiBPRkZMSU5FX1NBTVBMRQorc3RhdGljIHZvaWQgc2FtcGxlX3F1ZXVlKHVuc2lnbmVkIGxvbmcgZHVtbXkpOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHNhbXBfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihzYW1wbGVfcXVldWUsIDAsIDApOworI2VuZGlmCisKKy8qCisgKiBUaGUgQGRldl9iYXNlIGxpc3QgaXMgcHJvdGVjdGVkIGJ5IEBkZXZfYmFzZV9sb2NrIGFuZCB0aGUgcnRsbgorICogc2VtYXBob3JlLgorICoKKyAqIFB1cmUgcmVhZGVycyBob2xkIGRldl9iYXNlX2xvY2sgZm9yIHJlYWRpbmcuCisgKgorICogV3JpdGVycyBtdXN0IGhvbGQgdGhlIHJ0bmwgc2VtYXBob3JlIHdoaWxlIHRoZXkgbG9vcCB0aHJvdWdoIHRoZQorICogZGV2X2Jhc2UgbGlzdCwgYW5kIGhvbGQgZGV2X2Jhc2VfbG9jayBmb3Igd3JpdGluZyB3aGVuIHRoZXkgZG8gdGhlCisgKiBhY3R1YWwgdXBkYXRlcy4gIFRoaXMgYWxsb3dzIHB1cmUgcmVhZGVycyB0byBhY2Nlc3MgdGhlIGxpc3QgZXZlbgorICogd2hpbGUgYSB3cml0ZXIgaXMgcHJlcGFyaW5nIHRvIHVwZGF0ZSBpdC4KKyAqCisgKiBUbyBwdXQgaXQgYW5vdGhlciB3YXksIGRldl9iYXNlX2xvY2sgaXMgaGVsZCBmb3Igd3JpdGluZyBvbmx5IHRvCisgKiBwcm90ZWN0IGFnYWluc3QgcHVyZSByZWFkZXJzOyB0aGUgcnRubCBzZW1hcGhvcmUgcHJvdmlkZXMgdGhlCisgKiBwcm90ZWN0aW9uIGFnYWluc3Qgb3RoZXIgd3JpdGVycy4KKyAqCisgKiBTZWUsIGZvciBleGFtcGxlIHVzYWdlcywgcmVnaXN0ZXJfbmV0ZGV2aWNlKCkgYW5kCisgKiB1bnJlZ2lzdGVyX25ldGRldmljZSgpLCB3aGljaCBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBydG5sCisgKiBzZW1hcGhvcmUgaGVsZC4KKyAqLworc3RydWN0IG5ldF9kZXZpY2UgKmRldl9iYXNlOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICoqZGV2X3RhaWwgPSAmZGV2X2Jhc2U7CitERUZJTkVfUldMT0NLKGRldl9iYXNlX2xvY2spOworCitFWFBPUlRfU1lNQk9MKGRldl9iYXNlKTsKK0VYUE9SVF9TWU1CT0woZGV2X2Jhc2VfbG9jayk7CisKKyNkZWZpbmUgTkVUREVWX0hBU0hCSVRTCTgKK3N0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCBkZXZfbmFtZV9oZWFkWzE8PE5FVERFVl9IQVNIQklUU107CitzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgZGV2X2luZGV4X2hlYWRbMTw8TkVUREVWX0hBU0hCSVRTXTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaGxpc3RfaGVhZCAqZGV2X25hbWVfaGFzaChjb25zdCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGhhc2ggPSBmdWxsX25hbWVfaGFzaChuYW1lLCBzdHJubGVuKG5hbWUsIElGTkFNU0laKSk7CisJcmV0dXJuICZkZXZfbmFtZV9oZWFkW2hhc2ggJiAoKDE8PE5FVERFVl9IQVNIQklUUyktMSldOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBobGlzdF9oZWFkICpkZXZfaW5kZXhfaGFzaChpbnQgaWZpbmRleCkKK3sKKwlyZXR1cm4gJmRldl9pbmRleF9oZWFkW2lmaW5kZXggJiAoKDE8PE5FVERFVl9IQVNIQklUUyktMSldOworfQorCisvKgorICoJT3VyIG5vdGlmaWVyIGxpc3QKKyAqLworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZXRkZXZfY2hhaW47CisKKy8qCisgKglEZXZpY2UgZHJpdmVycyBjYWxsIG91ciByb3V0aW5lcyB0byBxdWV1ZSBwYWNrZXRzIGhlcmUuIFdlIGVtcHR5IHRoZQorICoJcXVldWUgaW4gdGhlIGxvY2FsIHNvZnRuZXQgaGFuZGxlci4KKyAqLworREVGSU5FX1BFUl9DUFUoc3RydWN0IHNvZnRuZXRfZGF0YSwgc29mdG5ldF9kYXRhKSA9IHsgMCwgfTsKKworI2lmZGVmIENPTkZJR19TWVNGUworZXh0ZXJuIGludCBuZXRkZXZfc3lzZnNfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgbmV0ZGV2X3JlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBuZXRfZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbmV0ZGV2X3VucmVnaXN0ZXJfc3lzZnMoc3RydWN0IG5ldF9kZXZpY2UgKik7CisjZWxzZQorI2RlZmluZSBuZXRkZXZfc3lzZnNfaW5pdCgpCSAJKDApCisjZGVmaW5lIG5ldGRldl9yZWdpc3Rlcl9zeXNmcyhkZXYpCSgwKQorI2RlZmluZQluZXRkZXZfdW5yZWdpc3Rlcl9zeXNmcyhkZXYpCWRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCQlQcm90b2NvbCBtYW5hZ2VtZW50IGFuZCByZWdpc3RyYXRpb24gcm91dGluZXMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUZvciBlZmZpY2llbmN5CisgKi8KKworaW50IG5ldGRldl9uaXQ7CisKKy8qCisgKglBZGQgYSBwcm90b2NvbCBJRCB0byB0aGUgbGlzdC4gTm93IHRoYXQgdGhlIGlucHV0IGhhbmRsZXIgaXMKKyAqCXNtYXJ0ZXIgd2UgY2FuIGRpc3BlbnNlIHdpdGggYWxsIHRoZSBtZXNzeSBzdHVmZiB0aGF0IHVzZWQgdG8gYmUKKyAqCWhlcmUuCisgKgorICoJQkVXQVJFISEhIFByb3RvY29sIGhhbmRsZXJzLCBtYW5nbGluZyBpbnB1dCBwYWNrZXRzLAorICoJTVVTVCBCRSBsYXN0IGluIGhhc2ggYnVja2V0cyBhbmQgY2hlY2tpbmcgcHJvdG9jb2wgaGFuZGxlcnMKKyAqCU1VU1Qgc3RhcnQgZnJvbSBwcm9taXNjdW91cyBwdHlwZV9hbGwgY2hhaW4gaW4gbmV0X2JoLgorICoJSXQgaXMgdHJ1ZSBub3csIGRvIG5vdCBjaGFuZ2UgaXQuCisgKglFeHBsYW5hdGlvbiBmb2xsb3dzOiBpZiBwcm90b2NvbCBoYW5kbGVyLCBtYW5nbGluZyBwYWNrZXQsIHdpbGwKKyAqCWJlIHRoZSBmaXJzdCBvbiBsaXN0LCBpdCBpcyBub3QgYWJsZSB0byBzZW5zZSwgdGhhdCBwYWNrZXQKKyAqCWlzIGNsb25lZCBhbmQgc2hvdWxkIGJlIGNvcGllZC1vbi13cml0ZSwgc28gdGhhdCBpdCB3aWxsCisgKgljaGFuZ2UgaXQgYW5kIHN1YnNlcXVlbnQgcmVhZGVycyB3aWxsIGdldCBicm9rZW4gcGFja2V0LgorICoJCQkJCQkJLS1BTksgKDk4MDgwMykKKyAqLworCisvKioKKyAqCWRldl9hZGRfcGFjayAtIGFkZCBwYWNrZXQgaGFuZGxlcgorICoJQHB0OiBwYWNrZXQgdHlwZSBkZWNsYXJhdGlvbgorICoKKyAqCUFkZCBhIHByb3RvY29sIGhhbmRsZXIgdG8gdGhlIG5ldHdvcmtpbmcgc3RhY2suIFRoZSBwYXNzZWQgJnBhY2tldF90eXBlCisgKglpcyBsaW5rZWQgaW50byBrZXJuZWwgbGlzdHMgYW5kIG1heSBub3QgYmUgZnJlZWQgdW50aWwgaXQgaGFzIGJlZW4KKyAqCXJlbW92ZWQgZnJvbSB0aGUga2VybmVsIGxpc3RzLgorICoKKyAqCVRoaXMgY2FsbCBkb2VzIG5vdCBzbGVlcCB0aGVyZWZvcmUgaXQgY2FuIG5vdCAKKyAqCWd1YXJhbnRlZSBhbGwgQ1BVJ3MgdGhhdCBhcmUgaW4gbWlkZGxlIG9mIHJlY2VpdmluZyBwYWNrZXRzCisgKgl3aWxsIHNlZSB0aGUgbmV3IHBhY2tldCB0eXBlICh1bnRpbCB0aGUgbmV4dCByZWNlaXZlZCBwYWNrZXQpLgorICovCisKK3ZvaWQgZGV2X2FkZF9wYWNrKHN0cnVjdCBwYWNrZXRfdHlwZSAqcHQpCit7CisJaW50IGhhc2g7CisKKwlzcGluX2xvY2tfYmgoJnB0eXBlX2xvY2spOworCWlmIChwdC0+dHlwZSA9PSBodG9ucyhFVEhfUF9BTEwpKSB7CisJCW5ldGRldl9uaXQrKzsKKwkJbGlzdF9hZGRfcmN1KCZwdC0+bGlzdCwgJnB0eXBlX2FsbCk7CisJfSBlbHNlIHsKKwkJaGFzaCA9IG50b2hzKHB0LT50eXBlKSAmIDE1OworCQlsaXN0X2FkZF9yY3UoJnB0LT5saXN0LCAmcHR5cGVfYmFzZVtoYXNoXSk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZwdHlwZV9sb2NrKTsKK30KKworZXh0ZXJuIHZvaWQgbGlua3dhdGNoX3J1bl9xdWV1ZSh2b2lkKTsKKworCisKKy8qKgorICoJX19kZXZfcmVtb3ZlX3BhY2sJIC0gcmVtb3ZlIHBhY2tldCBoYW5kbGVyCisgKglAcHQ6IHBhY2tldCB0eXBlIGRlY2xhcmF0aW9uCisgKgorICoJUmVtb3ZlIGEgcHJvdG9jb2wgaGFuZGxlciB0aGF0IHdhcyBwcmV2aW91c2x5IGFkZGVkIHRvIHRoZSBrZXJuZWwKKyAqCXByb3RvY29sIGhhbmRsZXJzIGJ5IGRldl9hZGRfcGFjaygpLiBUaGUgcGFzc2VkICZwYWNrZXRfdHlwZSBpcyByZW1vdmVkCisgKglmcm9tIHRoZSBrZXJuZWwgbGlzdHMgYW5kIGNhbiBiZSBmcmVlZCBvciByZXVzZWQgb25jZSB0aGlzIGZ1bmN0aW9uCisgKglyZXR1cm5zLiAKKyAqCisgKiAgICAgIFRoZSBwYWNrZXQgdHlwZSBtaWdodCBzdGlsbCBiZSBpbiB1c2UgYnkgcmVjZWl2ZXJzCisgKglhbmQgbXVzdCBub3QgYmUgZnJlZWQgdW50aWwgYWZ0ZXIgYWxsIHRoZSBDUFUncyBoYXZlIGdvbmUKKyAqCXRocm91Z2ggYSBxdWllc2NlbnQgc3RhdGUuCisgKi8KK3ZvaWQgX19kZXZfcmVtb3ZlX3BhY2soc3RydWN0IHBhY2tldF90eXBlICpwdCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOworCXN0cnVjdCBwYWNrZXRfdHlwZSAqcHQxOworCisJc3Bpbl9sb2NrX2JoKCZwdHlwZV9sb2NrKTsKKworCWlmIChwdC0+dHlwZSA9PSBodG9ucyhFVEhfUF9BTEwpKSB7CisJCW5ldGRldl9uaXQtLTsKKwkJaGVhZCA9ICZwdHlwZV9hbGw7CisJfSBlbHNlCisJCWhlYWQgPSAmcHR5cGVfYmFzZVtudG9ocyhwdC0+dHlwZSkgJiAxNV07CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHB0MSwgaGVhZCwgbGlzdCkgeworCQlpZiAocHQgPT0gcHQxKSB7CisJCQlsaXN0X2RlbF9yY3UoJnB0LT5saXN0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJcHJpbnRrKEtFUk5fV0FSTklORyAiZGV2X3JlbW92ZV9wYWNrOiAlcCBub3QgZm91bmQuXG4iLCBwdCk7CitvdXQ6CisJc3Bpbl91bmxvY2tfYmgoJnB0eXBlX2xvY2spOworfQorLyoqCisgKglkZXZfcmVtb3ZlX3BhY2sJIC0gcmVtb3ZlIHBhY2tldCBoYW5kbGVyCisgKglAcHQ6IHBhY2tldCB0eXBlIGRlY2xhcmF0aW9uCisgKgorICoJUmVtb3ZlIGEgcHJvdG9jb2wgaGFuZGxlciB0aGF0IHdhcyBwcmV2aW91c2x5IGFkZGVkIHRvIHRoZSBrZXJuZWwKKyAqCXByb3RvY29sIGhhbmRsZXJzIGJ5IGRldl9hZGRfcGFjaygpLiBUaGUgcGFzc2VkICZwYWNrZXRfdHlwZSBpcyByZW1vdmVkCisgKglmcm9tIHRoZSBrZXJuZWwgbGlzdHMgYW5kIGNhbiBiZSBmcmVlZCBvciByZXVzZWQgb25jZSB0aGlzIGZ1bmN0aW9uCisgKglyZXR1cm5zLgorICoKKyAqCVRoaXMgY2FsbCBzbGVlcHMgdG8gZ3VhcmFudGVlIHRoYXQgbm8gQ1BVIGlzIGxvb2tpbmcgYXQgdGhlIHBhY2tldAorICoJdHlwZSBhZnRlciByZXR1cm4uCisgKi8KK3ZvaWQgZGV2X3JlbW92ZV9wYWNrKHN0cnVjdCBwYWNrZXRfdHlwZSAqcHQpCit7CisJX19kZXZfcmVtb3ZlX3BhY2socHQpOworCQorCXN5bmNocm9uaXplX25ldCgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwkJICAgICAgRGV2aWNlIEJvb3QtdGltZSBTZXR0aW5ncyBSb3V0aW5lcworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBCb290IHRpbWUgY29uZmlndXJhdGlvbiB0YWJsZSAqLworc3RhdGljIHN0cnVjdCBuZXRkZXZfYm9vdF9zZXR1cCBkZXZfYm9vdF9zZXR1cFtORVRERVZfQk9PVF9TRVRVUF9NQVhdOworCisvKioKKyAqCW5ldGRldl9ib290X3NldHVwX2FkZAktIGFkZCBuZXcgc2V0dXAgZW50cnkKKyAqCUBuYW1lOiBuYW1lIG9mIHRoZSBkZXZpY2UKKyAqCUBtYXA6IGNvbmZpZ3VyZWQgc2V0dGluZ3MgZm9yIHRoZSBkZXZpY2UKKyAqCisgKglBZGRzIG5ldyBzZXR1cCBlbnRyeSB0byB0aGUgZGV2X2Jvb3Rfc2V0dXAgbGlzdC4gIFRoZSBmdW5jdGlvbgorICoJcmV0dXJucyAwIG9uIGVycm9yIGFuZCAxIG9uIHN1Y2Nlc3MuICBUaGlzIGlzIGEgZ2VuZXJpYyByb3V0aW5lIHRvCisgKglhbGwgbmV0ZGV2aWNlcy4KKyAqLworc3RhdGljIGludCBuZXRkZXZfYm9vdF9zZXR1cF9hZGQoY2hhciAqbmFtZSwgc3RydWN0IGlmbWFwICptYXApCit7CisJc3RydWN0IG5ldGRldl9ib290X3NldHVwICpzOworCWludCBpOworCisJcyA9IGRldl9ib290X3NldHVwOworCWZvciAoaSA9IDA7IGkgPCBORVRERVZfQk9PVF9TRVRVUF9NQVg7IGkrKykgeworCQlpZiAoc1tpXS5uYW1lWzBdID09ICdcMCcgfHwgc1tpXS5uYW1lWzBdID09ICcgJykgeworCQkJbWVtc2V0KHNbaV0ubmFtZSwgMCwgc2l6ZW9mKHNbaV0ubmFtZSkpOworCQkJc3RyY3B5KHNbaV0ubmFtZSwgbmFtZSk7CisJCQltZW1jcHkoJnNbaV0ubWFwLCBtYXAsIHNpemVvZihzW2ldLm1hcCkpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gaSA+PSBORVRERVZfQk9PVF9TRVRVUF9NQVggPyAwIDogMTsKK30KKworLyoqCisgKgluZXRkZXZfYm9vdF9zZXR1cF9jaGVjawktIGNoZWNrIGJvb3QgdGltZSBzZXR0aW5ncworICoJQGRldjogdGhlIG5ldGRldmljZQorICoKKyAqIAlDaGVjayBib290IHRpbWUgc2V0dGluZ3MgZm9yIHRoZSBkZXZpY2UuCisgKglUaGUgZm91bmQgc2V0dGluZ3MgYXJlIHNldCBmb3IgdGhlIGRldmljZSB0byBiZSB1c2VkCisgKglsYXRlciBpbiB0aGUgZGV2aWNlIHByb2JpbmcuCisgKglSZXR1cm5zIDAgaWYgbm8gc2V0dGluZ3MgZm91bmQsIDEgaWYgdGhleSBhcmUuCisgKi8KK2ludCBuZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfYm9vdF9zZXR1cCAqcyA9IGRldl9ib290X3NldHVwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5FVERFVl9CT09UX1NFVFVQX01BWDsgaSsrKSB7CisJCWlmIChzW2ldLm5hbWVbMF0gIT0gJ1wwJyAmJiBzW2ldLm5hbWVbMF0gIT0gJyAnICYmCisJCSAgICAhc3RybmNtcChkZXYtPm5hbWUsIHNbaV0ubmFtZSwgc3RybGVuKHNbaV0ubmFtZSkpKSB7CisJCQlkZXYtPmlycSAJPSBzW2ldLm1hcC5pcnE7CisJCQlkZXYtPmJhc2VfYWRkciAJPSBzW2ldLm1hcC5iYXNlX2FkZHI7CisJCQlkZXYtPm1lbV9zdGFydCAJPSBzW2ldLm1hcC5tZW1fc3RhcnQ7CisJCQlkZXYtPm1lbV9lbmQgCT0gc1tpXS5tYXAubWVtX2VuZDsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCisKKy8qKgorICoJbmV0ZGV2X2Jvb3RfYmFzZQktIGdldCBhZGRyZXNzIGZyb20gYm9vdCB0aW1lIHNldHRpbmdzCisgKglAcHJlZml4OiBwcmVmaXggZm9yIG5ldHdvcmsgZGV2aWNlCisgKglAdW5pdDogaWQgZm9yIG5ldHdvcmsgZGV2aWNlCisgKgorICogCUNoZWNrIGJvb3QgdGltZSBzZXR0aW5ncyBmb3IgdGhlIGJhc2UgYWRkcmVzcyBvZiBkZXZpY2UuCisgKglUaGUgZm91bmQgc2V0dGluZ3MgYXJlIHNldCBmb3IgdGhlIGRldmljZSB0byBiZSB1c2VkCisgKglsYXRlciBpbiB0aGUgZGV2aWNlIHByb2JpbmcuCisgKglSZXR1cm5zIDAgaWYgbm8gc2V0dGluZ3MgZm91bmQuCisgKi8KK3Vuc2lnbmVkIGxvbmcgbmV0ZGV2X2Jvb3RfYmFzZShjb25zdCBjaGFyICpwcmVmaXgsIGludCB1bml0KQoreworCWNvbnN0IHN0cnVjdCBuZXRkZXZfYm9vdF9zZXR1cCAqcyA9IGRldl9ib290X3NldHVwOworCWNoYXIgbmFtZVtJRk5BTVNJWl07CisJaW50IGk7CisKKwlzcHJpbnRmKG5hbWUsICIlcyVkIiwgcHJlZml4LCB1bml0KTsKKworCS8qCisJICogSWYgZGV2aWNlIGFscmVhZHkgcmVnaXN0ZXJlZCB0aGVuIHJldHVybiBiYXNlIG9mIDEKKwkgKiB0byBpbmRpY2F0ZSBub3QgdG8gcHJvYmUgZm9yIHRoaXMgaW50ZXJmYWNlCisJICovCisJaWYgKF9fZGV2X2dldF9ieV9uYW1lKG5hbWUpKQorCQlyZXR1cm4gMTsKKworCWZvciAoaSA9IDA7IGkgPCBORVRERVZfQk9PVF9TRVRVUF9NQVg7IGkrKykKKwkJaWYgKCFzdHJjbXAobmFtZSwgc1tpXS5uYW1lKSkKKwkJCXJldHVybiBzW2ldLm1hcC5iYXNlX2FkZHI7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTYXZlcyBhdCBib290IHRpbWUgY29uZmlndXJlZCBzZXR0aW5ncyBmb3IgYW55IG5ldGRldmljZS4KKyAqLworaW50IF9faW5pdCBuZXRkZXZfYm9vdF9zZXR1cChjaGFyICpzdHIpCit7CisJaW50IGludHNbNV07CisJc3RydWN0IGlmbWFwIG1hcDsKKworCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisJaWYgKCFzdHIgfHwgISpzdHIpCisJCXJldHVybiAwOworCisJLyogU2F2ZSBzZXR0aW5ncyAqLworCW1lbXNldCgmbWFwLCAwLCBzaXplb2YobWFwKSk7CisJaWYgKGludHNbMF0gPiAwKQorCQltYXAuaXJxID0gaW50c1sxXTsKKwlpZiAoaW50c1swXSA+IDEpCisJCW1hcC5iYXNlX2FkZHIgPSBpbnRzWzJdOworCWlmIChpbnRzWzBdID4gMikKKwkJbWFwLm1lbV9zdGFydCA9IGludHNbM107CisJaWYgKGludHNbMF0gPiAzKQorCQltYXAubWVtX2VuZCA9IGludHNbNF07CisKKwkvKiBBZGQgbmV3IGVudHJ5IHRvIHRoZSBsaXN0ICovCisJcmV0dXJuIG5ldGRldl9ib290X3NldHVwX2FkZChzdHIsICZtYXApOworfQorCitfX3NldHVwKCJuZXRkZXY9IiwgbmV0ZGV2X2Jvb3Rfc2V0dXApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJCQkgICAgRGV2aWNlIEludGVyZmFjZSBTdWJyb3V0aW5lcworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqCV9fZGV2X2dldF9ieV9uYW1lCS0gZmluZCBhIGRldmljZSBieSBpdHMgbmFtZQorICoJQG5hbWU6IG5hbWUgdG8gZmluZAorICoKKyAqCUZpbmQgYW4gaW50ZXJmYWNlIGJ5IG5hbWUuIE11c3QgYmUgY2FsbGVkIHVuZGVyIFJUTkwgc2VtYXBob3JlCisgKglvciBAZGV2X2Jhc2VfbG9jay4gSWYgdGhlIG5hbWUgaXMgZm91bmQgYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UKKyAqCWlzIHJldHVybmVkLiBJZiB0aGUgbmFtZSBpcyBub3QgZm91bmQgdGhlbiAlTlVMTCBpcyByZXR1cm5lZC4gVGhlCisgKglyZWZlcmVuY2UgY291bnRlcnMgYXJlIG5vdCBpbmNyZW1lbnRlZCBzbyB0aGUgY2FsbGVyIG11c3QgYmUKKyAqCWNhcmVmdWwgd2l0aCBsb2Nrcy4KKyAqLworCitzdHJ1Y3QgbmV0X2RldmljZSAqX19kZXZfZ2V0X2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcDsKKworCWhsaXN0X2Zvcl9lYWNoKHAsIGRldl9uYW1lX2hhc2gobmFtZSkpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldgorCQkJPSBobGlzdF9lbnRyeShwLCBzdHJ1Y3QgbmV0X2RldmljZSwgbmFtZV9obGlzdCk7CisJCWlmICghc3RybmNtcChkZXYtPm5hbWUsIG5hbWUsIElGTkFNU0laKSkKKwkJCXJldHVybiBkZXY7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKioKKyAqCWRldl9nZXRfYnlfbmFtZQkJLSBmaW5kIGEgZGV2aWNlIGJ5IGl0cyBuYW1lCisgKglAbmFtZTogbmFtZSB0byBmaW5kCisgKgorICoJRmluZCBhbiBpbnRlcmZhY2UgYnkgbmFtZS4gVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gYW55CisgKgljb250ZXh0IGFuZCBkb2VzIGl0cyBvd24gbG9ja2luZy4gVGhlIHJldHVybmVkIGhhbmRsZSBoYXMKKyAqCXRoZSB1c2FnZSBjb3VudCBpbmNyZW1lbnRlZCBhbmQgdGhlIGNhbGxlciBtdXN0IHVzZSBkZXZfcHV0KCkgdG8KKyAqCXJlbGVhc2UgaXQgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkLiAlTlVMTCBpcyByZXR1cm5lZCBpZiBubworICoJbWF0Y2hpbmcgZGV2aWNlIGlzIGZvdW5kLgorICovCisKK3N0cnVjdCBuZXRfZGV2aWNlICpkZXZfZ2V0X2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKwlkZXYgPSBfX2Rldl9nZXRfYnlfbmFtZShuYW1lKTsKKwlpZiAoZGV2KQorCQlkZXZfaG9sZChkZXYpOworCXJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKwlyZXR1cm4gZGV2OworfQorCisvKioKKyAqCV9fZGV2X2dldF9ieV9pbmRleCAtIGZpbmQgYSBkZXZpY2UgYnkgaXRzIGlmaW5kZXgKKyAqCUBpZmluZGV4OiBpbmRleCBvZiBkZXZpY2UKKyAqCisgKglTZWFyY2ggZm9yIGFuIGludGVyZmFjZSBieSBpbmRleC4gUmV0dXJucyAlTlVMTCBpZiB0aGUgZGV2aWNlCisgKglpcyBub3QgZm91bmQgb3IgYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UuIFRoZSBkZXZpY2UgaGFzIG5vdAorICoJaGFkIGl0cyByZWZlcmVuY2UgY291bnRlciBpbmNyZWFzZWQgc28gdGhlIGNhbGxlciBtdXN0IGJlIGNhcmVmdWwKKyAqCWFib3V0IGxvY2tpbmcuIFRoZSBjYWxsZXIgbXVzdCBob2xkIGVpdGhlciB0aGUgUlROTCBzZW1hcGhvcmUKKyAqCW9yIEBkZXZfYmFzZV9sb2NrLgorICovCisKK3N0cnVjdCBuZXRfZGV2aWNlICpfX2Rldl9nZXRfYnlfaW5kZXgoaW50IGlmaW5kZXgpCit7CisJc3RydWN0IGhsaXN0X25vZGUgKnA7CisKKwlobGlzdF9mb3JfZWFjaChwLCBkZXZfaW5kZXhfaGFzaChpZmluZGV4KSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisJCQk9IGhsaXN0X2VudHJ5KHAsIHN0cnVjdCBuZXRfZGV2aWNlLCBpbmRleF9obGlzdCk7CisJCWlmIChkZXYtPmlmaW5kZXggPT0gaWZpbmRleCkKKwkJCXJldHVybiBkZXY7CisJfQorCXJldHVybiBOVUxMOworfQorCisKKy8qKgorICoJZGV2X2dldF9ieV9pbmRleCAtIGZpbmQgYSBkZXZpY2UgYnkgaXRzIGlmaW5kZXgKKyAqCUBpZmluZGV4OiBpbmRleCBvZiBkZXZpY2UKKyAqCisgKglTZWFyY2ggZm9yIGFuIGludGVyZmFjZSBieSBpbmRleC4gUmV0dXJucyBOVUxMIGlmIHRoZSBkZXZpY2UKKyAqCWlzIG5vdCBmb3VuZCBvciBhIHBvaW50ZXIgdG8gdGhlIGRldmljZS4gVGhlIGRldmljZSByZXR1cm5lZCBoYXMKKyAqCWhhZCBhIHJlZmVyZW5jZSBhZGRlZCBhbmQgdGhlIHBvaW50ZXIgaXMgc2FmZSB1bnRpbCB0aGUgdXNlciBjYWxscworICoJZGV2X3B1dCB0byBpbmRpY2F0ZSB0aGV5IGhhdmUgZmluaXNoZWQgd2l0aCBpdC4KKyAqLworCitzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X2dldF9ieV9pbmRleChpbnQgaWZpbmRleCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKwlkZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgoaWZpbmRleCk7CisJaWYgKGRldikKKwkJZGV2X2hvbGQoZGV2KTsKKwlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7CisJcmV0dXJuIGRldjsKK30KKworLyoqCisgKglkZXZfZ2V0Ynlod2FkZHIgLSBmaW5kIGEgZGV2aWNlIGJ5IGl0cyBoYXJkd2FyZSBhZGRyZXNzCisgKglAdHlwZTogbWVkaWEgdHlwZSBvZiBkZXZpY2UKKyAqCUBoYTogaGFyZHdhcmUgYWRkcmVzcworICoKKyAqCVNlYXJjaCBmb3IgYW4gaW50ZXJmYWNlIGJ5IE1BQyBhZGRyZXNzLiBSZXR1cm5zIE5VTEwgaWYgdGhlIGRldmljZQorICoJaXMgbm90IGZvdW5kIG9yIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlLiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUKKyAqCXJ0bmwgc2VtYXBob3JlLiBUaGUgcmV0dXJuZWQgZGV2aWNlIGhhcyBub3QgaGFkIGl0cyByZWYgY291bnQgaW5jcmVhc2VkCisgKglhbmQgdGhlIGNhbGxlciBtdXN0IHRoZXJlZm9yZSBiZSBjYXJlZnVsIGFib3V0IGxvY2tpbmcKKyAqCisgKglCVUdTOgorICoJSWYgdGhlIEFQSSB3YXMgY29uc2lzdGVudCB0aGlzIHdvdWxkIGJlIF9fZGV2X2dldF9ieV9od2FkZHIKKyAqLworCitzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X2dldGJ5aHdhZGRyKHVuc2lnbmVkIHNob3J0IHR5cGUsIGNoYXIgKmhhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwlBU1NFUlRfUlROTCgpOworCisJZm9yIChkZXYgPSBkZXZfYmFzZTsgZGV2OyBkZXYgPSBkZXYtPm5leHQpCisJCWlmIChkZXYtPnR5cGUgPT0gdHlwZSAmJgorCQkgICAgIW1lbWNtcChkZXYtPmRldl9hZGRyLCBoYSwgZGV2LT5hZGRyX2xlbikpCisJCQlicmVhazsKKwlyZXR1cm4gZGV2OworfQorCitzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X2dldGZpcnN0Ynlod3R5cGUodW5zaWduZWQgc2hvcnQgdHlwZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJcnRubF9sb2NrKCk7CisJZm9yIChkZXYgPSBkZXZfYmFzZTsgZGV2OyBkZXYgPSBkZXYtPm5leHQpIHsKKwkJaWYgKGRldi0+dHlwZSA9PSB0eXBlKSB7CisJCQlkZXZfaG9sZChkZXYpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcnRubF91bmxvY2soKTsKKwlyZXR1cm4gZGV2OworfQorCitFWFBPUlRfU1lNQk9MKGRldl9nZXRmaXJzdGJ5aHd0eXBlKTsKKworLyoqCisgKglkZXZfZ2V0X2J5X2ZsYWdzIC0gZmluZCBhbnkgZGV2aWNlIHdpdGggZ2l2ZW4gZmxhZ3MKKyAqCUBpZl9mbGFnczogSUZGXyogdmFsdWVzCisgKglAbWFzazogYml0bWFzayBvZiBiaXRzIGluIGlmX2ZsYWdzIHRvIGNoZWNrCisgKgorICoJU2VhcmNoIGZvciBhbnkgaW50ZXJmYWNlIHdpdGggdGhlIGdpdmVuIGZsYWdzLiBSZXR1cm5zIE5VTEwgaWYgYSBkZXZpY2UKKyAqCWlzIG5vdCBmb3VuZCBvciBhIHBvaW50ZXIgdG8gdGhlIGRldmljZS4gVGhlIGRldmljZSByZXR1cm5lZCBoYXMgCisgKgloYWQgYSByZWZlcmVuY2UgYWRkZWQgYW5kIHRoZSBwb2ludGVyIGlzIHNhZmUgdW50aWwgdGhlIHVzZXIgY2FsbHMKKyAqCWRldl9wdXQgdG8gaW5kaWNhdGUgdGhleSBoYXZlIGZpbmlzaGVkIHdpdGggaXQuCisgKi8KKworc3RydWN0IG5ldF9kZXZpY2UgKiBkZXZfZ2V0X2J5X2ZsYWdzKHVuc2lnbmVkIHNob3J0IGlmX2ZsYWdzLCB1bnNpZ25lZCBzaG9ydCBtYXNrKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOworCWZvciAoZGV2ID0gZGV2X2Jhc2U7IGRldiAhPSBOVUxMOyBkZXYgPSBkZXYtPm5leHQpIHsKKwkJaWYgKCgoZGV2LT5mbGFncyBeIGlmX2ZsYWdzKSAmIG1hc2spID09IDApIHsKKwkJCWRldl9ob2xkKGRldik7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7CisJcmV0dXJuIGRldjsKK30KKworLyoqCisgKglkZXZfdmFsaWRfbmFtZSAtIGNoZWNrIGlmIG5hbWUgaXMgb2theSBmb3IgbmV0d29yayBkZXZpY2UKKyAqCUBuYW1lOiBuYW1lIHN0cmluZworICoKKyAqCU5ldHdvcmsgZGV2aWNlIG5hbWVzIG5lZWQgdG8gYmUgdmFsaWQgZmlsZSBuYW1lcyB0bworICoJdG8gYWxsb3cgc3lzZnMgdG8gd29yaworICovCitzdGF0aWMgaW50IGRldl92YWxpZF9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuICEoKm5hbWUgPT0gJ1wwJyAKKwkJIHx8ICFzdHJjbXAobmFtZSwgIi4iKQorCQkgfHwgIXN0cmNtcChuYW1lLCAiLi4iKQorCQkgfHwgc3RyY2hyKG5hbWUsICcvJykpOworfQorCisvKioKKyAqCWRldl9hbGxvY19uYW1lIC0gYWxsb2NhdGUgYSBuYW1lIGZvciBhIGRldmljZQorICoJQGRldjogZGV2aWNlCisgKglAbmFtZTogbmFtZSBmb3JtYXQgc3RyaW5nCisgKgorICoJUGFzc2VkIGEgZm9ybWF0IHN0cmluZyAtIGVnICJsdCVkIiBpdCB3aWxsIHRyeSBhbmQgZmluZCBhIHN1aXRhYmxlCisgKglpZC4gTm90IGVmZmljaWVudCBmb3IgbWFueSBkZXZpY2VzLCBub3QgY2FsbGVkIGEgbG90LiBUaGUgY2FsbGVyCisgKgltdXN0IGhvbGQgdGhlIGRldl9iYXNlIG9yIHJ0bmwgbG9jayB3aGlsZSBhbGxvY2F0aW5nIHRoZSBuYW1lIGFuZAorICoJYWRkaW5nIHRoZSBkZXZpY2UgaW4gb3JkZXIgdG8gYXZvaWQgZHVwbGljYXRlcy4gUmV0dXJucyB0aGUgbnVtYmVyCisgKglvZiB0aGUgdW5pdCBhc3NpZ25lZCBvciBhIG5lZ2F0aXZlIGVycm5vIGNvZGUuCisgKi8KKworaW50IGRldl9hbGxvY19uYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGkgPSAwOworCWNoYXIgYnVmW0lGTkFNU0laXTsKKwljb25zdCBjaGFyICpwOworCWNvbnN0IGludCBtYXhfbmV0ZGV2aWNlcyA9IDgqUEFHRV9TSVpFOworCWxvbmcgKmludXNlOworCXN0cnVjdCBuZXRfZGV2aWNlICpkOworCisJcCA9IHN0cm5jaHIobmFtZSwgSUZOQU1TSVotMSwgJyUnKTsKKwlpZiAocCkgeworCQkvKgorCQkgKiBWZXJpZnkgdGhlIHN0cmluZyBhcyB0aGlzIHRoaW5nIG1heSBoYXZlIGNvbWUgZnJvbQorCQkgKiB0aGUgdXNlci4gIFRoZXJlIG11c3QgYmUgZWl0aGVyIG9uZSAiJWQiIGFuZCBubyBvdGhlciAiJSIKKwkJICogY2hhcmFjdGVycy4KKwkJICovCisJCWlmIChwWzFdICE9ICdkJyB8fCBzdHJjaHIocCArIDIsICclJykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkvKiBVc2Ugb25lIHBhZ2UgYXMgYSBiaXQgYXJyYXkgb2YgcG9zc2libGUgc2xvdHMgKi8KKwkJaW51c2UgPSAobG9uZyAqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0FUT01JQyk7CisJCWlmICghaW51c2UpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlmb3IgKGQgPSBkZXZfYmFzZTsgZDsgZCA9IGQtPm5leHQpIHsKKwkJCWlmICghc3NjYW5mKGQtPm5hbWUsIG5hbWUsICZpKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChpIDwgMCB8fCBpID49IG1heF9uZXRkZXZpY2VzKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiAgYXZvaWQgY2FzZXMgd2hlcmUgc3NjYW5mIGlzIG5vdCBleGFjdCBpbnZlcnNlIG9mIHByaW50ZiAqLworCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgbmFtZSwgaSk7CisJCQlpZiAoIXN0cm5jbXAoYnVmLCBkLT5uYW1lLCBJRk5BTVNJWikpCisJCQkJc2V0X2JpdChpLCBpbnVzZSk7CisJCX0KKworCQlpID0gZmluZF9maXJzdF96ZXJvX2JpdChpbnVzZSwgbWF4X25ldGRldmljZXMpOworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGludXNlKTsKKwl9CisKKwlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBuYW1lLCBpKTsKKwlpZiAoIV9fZGV2X2dldF9ieV9uYW1lKGJ1ZikpIHsKKwkJc3RybGNweShkZXYtPm5hbWUsIGJ1ZiwgSUZOQU1TSVopOworCQlyZXR1cm4gaTsKKwl9CisKKwkvKiBJdCBpcyBwb3NzaWJsZSB0byBydW4gb3V0IG9mIHBvc3NpYmxlIHNsb3RzCisJICogd2hlbiB0aGUgbmFtZSBpcyBsb25nIGFuZCB0aGVyZSBpc24ndCBlbm91Z2ggc3BhY2UgbGVmdAorCSAqIGZvciB0aGUgZGlnaXRzLCBvciBpZiBhbGwgYml0cyBhcmUgdXNlZC4KKwkgKi8KKwlyZXR1cm4gLUVORklMRTsKK30KKworCisvKioKKyAqCWRldl9jaGFuZ2VfbmFtZSAtIGNoYW5nZSBuYW1lIG9mIGEgZGV2aWNlCisgKglAZGV2OiBkZXZpY2UKKyAqCUBuZXduYW1lOiBuYW1lIChvciBmb3JtYXQgc3RyaW5nKSBtdXN0IGJlIGF0IGxlYXN0IElGTkFNU0laCisgKgorICoJQ2hhbmdlIG5hbWUgb2YgYSBkZXZpY2UsIGNhbiBwYXNzIGZvcm1hdCBzdHJpbmdzICJldGglZCIuCisgKglmb3Igd2lsZGNhcmRpbmcuCisgKi8KK2ludCBkZXZfY2hhbmdlX25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqbmV3bmFtZSkKK3sKKwlpbnQgZXJyID0gMDsKKworCUFTU0VSVF9SVE5MKCk7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9VUCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICghZGV2X3ZhbGlkX25hbWUobmV3bmFtZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHN0cmNocihuZXduYW1lLCAnJScpKSB7CisJCWVyciA9IGRldl9hbGxvY19uYW1lKGRldiwgbmV3bmFtZSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJc3RyY3B5KG5ld25hbWUsIGRldi0+bmFtZSk7CisJfQorCWVsc2UgaWYgKF9fZGV2X2dldF9ieV9uYW1lKG5ld25hbWUpKQorCQlyZXR1cm4gLUVFWElTVDsKKwllbHNlCisJCXN0cmxjcHkoZGV2LT5uYW1lLCBuZXduYW1lLCBJRk5BTVNJWik7CisKKwllcnIgPSBjbGFzc19kZXZpY2VfcmVuYW1lKCZkZXYtPmNsYXNzX2RldiwgZGV2LT5uYW1lKTsKKwlpZiAoIWVycikgeworCQlobGlzdF9kZWwoJmRldi0+bmFtZV9obGlzdCk7CisJCWhsaXN0X2FkZF9oZWFkKCZkZXYtPm5hbWVfaGxpc3QsIGRldl9uYW1lX2hhc2goZGV2LT5uYW1lKSk7CisJCW5vdGlmaWVyX2NhbGxfY2hhaW4oJm5ldGRldl9jaGFpbiwgTkVUREVWX0NIQU5HRU5BTUUsIGRldik7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKgluZXRkZXZfc3RhdGVfY2hhbmdlIC0gZGV2aWNlIGNoYW5nZXMgc3RhdGUKKyAqCUBkZXY6IGRldmljZSB0byBjYXVzZSBub3RpZmljYXRpb24KKyAqCisgKglDYWxsZWQgdG8gaW5kaWNhdGUgYSBkZXZpY2UgaGFzIGNoYW5nZWQgc3RhdGUuIFRoaXMgZnVuY3Rpb24gY2FsbHMKKyAqCXRoZSBub3RpZmllciBjaGFpbnMgZm9yIG5ldGRldl9jaGFpbiBhbmQgc2VuZHMgYSBORVdMSU5LIG1lc3NhZ2UKKyAqCXRvIHRoZSByb3V0aW5nIHNvY2tldC4KKyAqLwordm9pZCBuZXRkZXZfc3RhdGVfY2hhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApIHsKKwkJbm90aWZpZXJfY2FsbF9jaGFpbigmbmV0ZGV2X2NoYWluLCBORVRERVZfQ0hBTkdFLCBkZXYpOworCQlydG1zZ19pZmluZm8oUlRNX05FV0xJTkssIGRldiwgMCk7CisJfQorfQorCisvKioKKyAqCWRldl9sb2FkIAktIGxvYWQgYSBuZXR3b3JrIG1vZHVsZQorICoJQG5hbWU6IG5hbWUgb2YgaW50ZXJmYWNlCisgKgorICoJSWYgYSBuZXR3b3JrIGludGVyZmFjZSBpcyBub3QgcHJlc2VudCBhbmQgdGhlIHByb2Nlc3MgaGFzIHN1aXRhYmxlCisgKglwcml2aWxlZ2VzIHRoaXMgZnVuY3Rpb24gbG9hZHMgdGhlIG1vZHVsZS4gSWYgbW9kdWxlIGxvYWRpbmcgaXMgbm90CisgKglhdmFpbGFibGUgaW4gdGhpcyBrZXJuZWwgdGhlbiBpdCBiZWNvbWVzIGEgbm9wLgorICovCisKK3ZvaWQgZGV2X2xvYWQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OyAgCisKKwlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOworCWRldiA9IF9fZGV2X2dldF9ieV9uYW1lKG5hbWUpOworCXJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKworCWlmICghZGV2ICYmIGNhcGFibGUoQ0FQX1NZU19NT0RVTEUpKQorCQlyZXF1ZXN0X21vZHVsZSgiJXMiLCBuYW1lKTsKK30KKworc3RhdGljIGludCBkZWZhdWx0X3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBkZWZhdWx0X3JlYnVpbGRfaGVhZGVyIGNhbGxlZCAtLSBCVUchXG4iLAorCSAgICAgICBza2ItPmRldiA/IHNrYi0+ZGV2LT5uYW1lIDogIk5VTEwhISEiKTsKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMTsKK30KKworCisvKioKKyAqCWRldl9vcGVuCS0gcHJlcGFyZSBhbiBpbnRlcmZhY2UgZm9yIHVzZS4KKyAqCUBkZXY6CWRldmljZSB0byBvcGVuCisgKgorICoJVGFrZXMgYSBkZXZpY2UgZnJvbSBkb3duIHRvIHVwIHN0YXRlLiBUaGUgZGV2aWNlJ3MgcHJpdmF0ZSBvcGVuCisgKglmdW5jdGlvbiBpcyBpbnZva2VkIGFuZCB0aGVuIHRoZSBtdWx0aWNhc3QgbGlzdHMgYXJlIGxvYWRlZC4gRmluYWxseQorICoJdGhlIGRldmljZSBpcyBtb3ZlZCBpbnRvIHRoZSB1cCBzdGF0ZSBhbmQgYSAlTkVUREVWX1VQIG1lc3NhZ2UgaXMKKyAqCXNlbnQgdG8gdGhlIG5ldGRldiBub3RpZmllciBjaGFpbi4KKyAqCisgKglDYWxsaW5nIHRoaXMgZnVuY3Rpb24gb24gYW4gYWN0aXZlIGludGVyZmFjZSBpcyBhIG5vcC4gT24gYSBmYWlsdXJlCisgKglhIG5lZ2F0aXZlIGVycm5vIGNvZGUgaXMgcmV0dXJuZWQuCisgKi8KK2ludCBkZXZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByZXQgPSAwOworCisJLyoKKwkgKglJcyBpdCBhbHJlYWR5IHVwPworCSAqLworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApCisJCXJldHVybiAwOworCisJLyoKKwkgKglJcyBpdCBldmVuIHByZXNlbnQ/CisJICovCisJaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qCisJICoJQ2FsbCBkZXZpY2UgcHJpdmF0ZSBvcGVuIG1ldGhvZAorCSAqLworCXNldF9iaXQoX19MSU5LX1NUQVRFX1NUQVJULCAmZGV2LT5zdGF0ZSk7CisJaWYgKGRldi0+b3BlbikgeworCQlyZXQgPSBkZXYtPm9wZW4oZGV2KTsKKwkJaWYgKHJldCkKKwkJCWNsZWFyX2JpdChfX0xJTktfU1RBVEVfU1RBUlQsICZkZXYtPnN0YXRlKTsKKwl9CisKKyAJLyoKKwkgKglJZiBpdCB3ZW50IG9wZW4gT0sgdGhlbjoKKwkgKi8KKworCWlmICghcmV0KSB7CisJCS8qCisJCSAqCVNldCB0aGUgZmxhZ3MuCisJCSAqLworCQlkZXYtPmZsYWdzIHw9IElGRl9VUDsKKworCQkvKgorCQkgKglJbml0aWFsaXplIG11bHRpY2FzdGluZyBzdGF0dXMKKwkJICovCisJCWRldl9tY191cGxvYWQoZGV2KTsKKworCQkvKgorCQkgKglXYWtldXAgdHJhbnNtaXQgcXVldWUgZW5naW5lCisJCSAqLworCQlkZXZfYWN0aXZhdGUoZGV2KTsKKworCQkvKgorCQkgKgkuLi4gYW5kIGFubm91bmNlIG5ldyBpbnRlcmZhY2UuCisJCSAqLworCQlub3RpZmllcl9jYWxsX2NoYWluKCZuZXRkZXZfY2hhaW4sIE5FVERFVl9VUCwgZGV2KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKglkZXZfY2xvc2UgLSBzaHV0ZG93biBhbiBpbnRlcmZhY2UuCisgKglAZGV2OiBkZXZpY2UgdG8gc2h1dGRvd24KKyAqCisgKglUaGlzIGZ1bmN0aW9uIG1vdmVzIGFuIGFjdGl2ZSBkZXZpY2UgaW50byBkb3duIHN0YXRlLiBBCisgKgklTkVUREVWX0dPSU5HX0RPV04gaXMgc2VudCB0byB0aGUgbmV0ZGV2IG5vdGlmaWVyIGNoYWluLiBUaGUgZGV2aWNlCisgKglpcyB0aGVuIGRlYWN0aXZhdGVkIGFuZCBmaW5hbGx5IGEgJU5FVERFVl9ET1dOIGlzIHNlbnQgdG8gdGhlIG5vdGlmaWVyCisgKgljaGFpbi4KKyAqLworaW50IGRldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmICghKGRldi0+ZmxhZ3MgJiBJRkZfVVApKQorCQlyZXR1cm4gMDsKKworCS8qCisJICoJVGVsbCBwZW9wbGUgd2UgYXJlIGdvaW5nIGRvd24sIHNvIHRoYXQgdGhleSBjYW4KKwkgKglwcmVwYXJlIHRvIGRlYXRoLCB3aGVuIGRldmljZSBpcyBzdGlsbCBvcGVyYXRpbmcuCisJICovCisJbm90aWZpZXJfY2FsbF9jaGFpbigmbmV0ZGV2X2NoYWluLCBORVRERVZfR09JTkdfRE9XTiwgZGV2KTsKKworCWRldl9kZWFjdGl2YXRlKGRldik7CisKKwljbGVhcl9iaXQoX19MSU5LX1NUQVRFX1NUQVJULCAmZGV2LT5zdGF0ZSk7CisKKwkvKiBTeW5jaHJvbml6ZSB0byBzY2hlZHVsZWQgcG9sbC4gV2UgY2Fubm90IHRvdWNoIHBvbGwgbGlzdCwKKwkgKiBpdCBjYW4gYmUgZXZlbiBvbiBkaWZmZXJlbnQgY3B1LiBTbyBqdXN0IGNsZWFyIG5ldGlmX3J1bm5pbmcoKSwKKwkgKiBhbmQgd2FpdCB3aGVuIHBvbGwgcmVhbGx5IHdpbGwgaGFwcGVuLiBBY3R1YWxseSwgdGhlIGJlc3QgcGxhY2UKKwkgKiBmb3IgdGhpcyBpcyBpbnNpZGUgZGV2LT5zdG9wKCkgYWZ0ZXIgZGV2aWNlIHN0b3BwZWQgaXRzIGlycQorCSAqIGVuZ2luZSwgYnV0IHRoaXMgcmVxdWlyZXMgbW9yZSBjaGFuZ2VzIGluIGRldmljZXMuICovCisKKwlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOyAvKiBDb21taXQgbmV0aWZfcnVubmluZygpLiAqLworCXdoaWxlICh0ZXN0X2JpdChfX0xJTktfU1RBVEVfUlhfU0NIRUQsICZkZXYtPnN0YXRlKSkgeworCQkvKiBObyBodXJyeS4gKi8KKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfQorCisJLyoKKwkgKglDYWxsIHRoZSBkZXZpY2Ugc3BlY2lmaWMgY2xvc2UuIFRoaXMgY2Fubm90IGZhaWwuCisJICoJT25seSBpZiBkZXZpY2UgaXMgVVAKKwkgKgorCSAqCVdlIGFsbG93IGl0IHRvIGJlIGNhbGxlZCBldmVuIGFmdGVyIGEgREVUQUNIIGhvdC1wbHVnCisJICoJZXZlbnQuCisJICovCisJaWYgKGRldi0+c3RvcCkKKwkJZGV2LT5zdG9wKGRldik7CisKKwkvKgorCSAqCURldmljZSBpcyBub3cgZG93bi4KKwkgKi8KKworCWRldi0+ZmxhZ3MgJj0gfklGRl9VUDsKKworCS8qCisJICogVGVsbCBwZW9wbGUgd2UgYXJlIGRvd24KKwkgKi8KKwlub3RpZmllcl9jYWxsX2NoYWluKCZuZXRkZXZfY2hhaW4sIE5FVERFVl9ET1dOLCBkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqCURldmljZSBjaGFuZ2UgcmVnaXN0ZXIvdW5yZWdpc3Rlci4gVGhlc2UgYXJlIG5vdCBpbmxpbmUgb3Igc3RhdGljCisgKglhcyB3ZSBleHBvcnQgdGhlbSB0byB0aGUgd29ybGQuCisgKi8KKworLyoqCisgKglyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIgLSByZWdpc3RlciBhIG5ldHdvcmsgbm90aWZpZXIgYmxvY2sKKyAqCUBuYjogbm90aWZpZXIKKyAqCisgKglSZWdpc3RlciBhIG5vdGlmaWVyIHRvIGJlIGNhbGxlZCB3aGVuIG5ldHdvcmsgZGV2aWNlIGV2ZW50cyBvY2N1ci4KKyAqCVRoZSBub3RpZmllciBwYXNzZWQgaXMgbGlua2VkIGludG8gdGhlIGtlcm5lbCBzdHJ1Y3R1cmVzIGFuZCBtdXN0CisgKglub3QgYmUgcmV1c2VkIHVudGlsIGl0IGhhcyBiZWVuIHVucmVnaXN0ZXJlZC4gQSBuZWdhdGl2ZSBlcnJubyBjb2RlCisgKglpcyByZXR1cm5lZCBvbiBhIGZhaWx1cmUuCisgKgorICogCVdoZW4gcmVnaXN0ZXJlZCBhbGwgcmVnaXN0cmF0aW9uIGFuZCB1cCBldmVudHMgYXJlIHJlcGxheWVkCisgKgl0byB0aGUgbmV3IG5vdGlmaWVyIHRvIGFsbG93IGRldmljZSB0byBoYXZlIGEgcmFjZSBmcmVlIAorICoJdmlldyBvZiB0aGUgbmV0d29yayBkZXZpY2UgbGlzdC4KKyAqLworCitpbnQgcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgZXJyOworCisJcnRubF9sb2NrKCk7CisJZXJyID0gbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJm5ldGRldl9jaGFpbiwgbmIpOworCWlmICghZXJyKSB7CisJCWZvciAoZGV2ID0gZGV2X2Jhc2U7IGRldjsgZGV2ID0gZGV2LT5uZXh0KSB7CisJCQluYi0+bm90aWZpZXJfY2FsbChuYiwgTkVUREVWX1JFR0lTVEVSLCBkZXYpOworCisJCQlpZiAoZGV2LT5mbGFncyAmIElGRl9VUCkgCisJCQkJbmItPm5vdGlmaWVyX2NhbGwobmIsIE5FVERFVl9VUCwgZGV2KTsKKwkJfQorCX0KKwlydG5sX3VubG9jaygpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICoJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIgLSB1bnJlZ2lzdGVyIGEgbmV0d29yayBub3RpZmllciBibG9jaworICoJQG5iOiBub3RpZmllcgorICoKKyAqCVVucmVnaXN0ZXIgYSBub3RpZmllciBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgYnkKKyAqCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigpLiBUaGUgbm90aWZpZXIgaXMgdW5saW5rZWQgaW50byB0aGUKKyAqCWtlcm5lbCBzdHJ1Y3R1cmVzIGFuZCBtYXkgdGhlbiBiZSByZXVzZWQuIEEgbmVnYXRpdmUgZXJybm8gY29kZQorICoJaXMgcmV0dXJuZWQgb24gYSBmYWlsdXJlLgorICovCisKK2ludCB1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCXJldHVybiBub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZuZXRkZXZfY2hhaW4sIG5iKTsKK30KKworLyoqCisgKgljYWxsX25ldGRldmljZV9ub3RpZmllcnMgLSBjYWxsIGFsbCBuZXR3b3JrIG5vdGlmaWVyIGJsb2NrcworICogICAgICBAdmFsOiB2YWx1ZSBwYXNzZWQgdW5tb2RpZmllZCB0byBub3RpZmllciBmdW5jdGlvbgorICogICAgICBAdjogICBwb2ludGVyIHBhc3NlZCB1bm1vZGlmaWVkIHRvIG5vdGlmaWVyIGZ1bmN0aW9uCisgKgorICoJQ2FsbCBhbGwgbmV0d29yayBub3RpZmllciBibG9ja3MuICBQYXJhbWV0ZXJzIGFuZCByZXR1cm4gdmFsdWUKKyAqCWFyZSBhcyBmb3Igbm90aWZpZXJfY2FsbF9jaGFpbigpLgorICovCisKK2ludCBjYWxsX25ldGRldmljZV9ub3RpZmllcnModW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKnYpCit7CisJcmV0dXJuIG5vdGlmaWVyX2NhbGxfY2hhaW4oJm5ldGRldl9jaGFpbiwgdmFsLCB2KTsKK30KKworLyogV2hlbiA+IDAgdGhlcmUgYXJlIGNvbnN1bWVycyBvZiByeCBza2IgdGltZSBzdGFtcHMgKi8KK3N0YXRpYyBhdG9taWNfdCBuZXRzdGFtcF9uZWVkZWQgPSBBVE9NSUNfSU5JVCgwKTsKKwordm9pZCBuZXRfZW5hYmxlX3RpbWVzdGFtcCh2b2lkKQoreworCWF0b21pY19pbmMoJm5ldHN0YW1wX25lZWRlZCk7Cit9CisKK3ZvaWQgbmV0X2Rpc2FibGVfdGltZXN0YW1wKHZvaWQpCit7CisJYXRvbWljX2RlYygmbmV0c3RhbXBfbmVlZGVkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5ldF90aW1lc3RhbXAoc3RydWN0IHRpbWV2YWwgKnN0YW1wKQoreworCWlmIChhdG9taWNfcmVhZCgmbmV0c3RhbXBfbmVlZGVkKSkKKwkJZG9fZ2V0dGltZW9mZGF5KHN0YW1wKTsKKwllbHNlIHsKKwkJc3RhbXAtPnR2X3NlYyA9IDA7CisJCXN0YW1wLT50dl91c2VjID0gMDsKKwl9Cit9CisKKy8qCisgKglTdXBwb3J0IHJvdXRpbmUuIFNlbmRzIG91dGdvaW5nIGZyYW1lcyB0byBhbnkgbmV0d29yaworICoJdGFwcyBjdXJyZW50bHkgaW4gdXNlLgorICovCisKK3ZvaWQgZGV2X3F1ZXVlX3htaXRfbml0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBhY2tldF90eXBlICpwdHlwZTsKKwluZXRfdGltZXN0YW1wKCZza2ItPnN0YW1wKTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwdHlwZSwgJnB0eXBlX2FsbCwgbGlzdCkgeworCQkvKiBOZXZlciBzZW5kIHBhY2tldHMgYmFjayB0byB0aGUgc29ja2V0CisJCSAqIHRoZXkgb3JpZ2luYXRlZCBmcm9tIC0gTXZTIChtaXF1ZWxzQGRyaW5rZWwub3cub3JnKQorCQkgKi8KKwkJaWYgKChwdHlwZS0+ZGV2ID09IGRldiB8fCAhcHR5cGUtPmRldikgJiYKKwkJICAgIChwdHlwZS0+YWZfcGFja2V0X3ByaXYgPT0gTlVMTCB8fAorCQkgICAgIChzdHJ1Y3Qgc29jayAqKXB0eXBlLT5hZl9wYWNrZXRfcHJpdiAhPSBza2ItPnNrKSkgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjI9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCQkJaWYgKCFza2IyKQorCQkJCWJyZWFrOworCisJCQkvKiBza2ItPm5oIHNob3VsZCBiZSBjb3JyZWN0bHkKKwkJCSAgIHNldCBieSBzZW5kZXIsIHNvIHRoYXQgdGhlIHNlY29uZCBzdGF0ZW1lbnQgaXMKKwkJCSAgIGp1c3QgcHJvdGVjdGlvbiBhZ2FpbnN0IGJ1Z2d5IHByb3RvY29scy4KKwkJCSAqLworCQkJc2tiMi0+bWFjLnJhdyA9IHNrYjItPmRhdGE7CisKKwkJCWlmIChza2IyLT5uaC5yYXcgPCBza2IyLT5kYXRhIHx8CisJCQkgICAgc2tiMi0+bmgucmF3ID4gc2tiMi0+dGFpbCkgeworCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJCXByaW50ayhLRVJOX0NSSVQgInByb3RvY29sICUwNHggaXMgIgorCQkJCQkgICAgICAgImJ1Z2d5LCBkZXYgJXNcbiIsCisJCQkJCSAgICAgICBza2IyLT5wcm90b2NvbCwgZGV2LT5uYW1lKTsKKwkJCQlza2IyLT5uaC5yYXcgPSBza2IyLT5kYXRhOworCQkJfQorCisJCQlza2IyLT5oLnJhdyA9IHNrYjItPm5oLnJhdzsKKwkJCXNrYjItPnBrdF90eXBlID0gUEFDS0VUX09VVEdPSU5HOworCQkJcHR5cGUtPmZ1bmMoc2tiMiwgc2tiLT5kZXYsIHB0eXBlKTsKKwkJfQorCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKK30KKworLyoKKyAqIEludmFsaWRhdGUgaGFyZHdhcmUgY2hlY2tzdW0gd2hlbiBwYWNrZXQgaXMgdG8gYmUgbWFuZ2xlZCwgYW5kCisgKiBjb21wbGV0ZSBjaGVja3N1bSBtYW51YWxseSBvbiBvdXRnb2luZyBwYXRoLgorICovCitpbnQgc2tiX2NoZWNrc3VtX2hlbHAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGlud2FyZCkKK3sKKwl1bnNpZ25lZCBpbnQgY3N1bTsKKwlpbnQgcmV0ID0gMCwgb2Zmc2V0ID0gc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YTsKKworCWlmIChpbndhcmQpIHsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoc2tiX2Nsb25lZChza2IpKSB7CisJCXJldCA9IHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCAwLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKworCWlmIChvZmZzZXQgPiAoaW50KXNrYi0+bGVuKQorCQlCVUcoKTsKKwljc3VtID0gc2tiX2NoZWNrc3VtKHNrYiwgb2Zmc2V0LCBza2ItPmxlbi1vZmZzZXQsIDApOworCisJb2Zmc2V0ID0gc2tiLT50YWlsIC0gc2tiLT5oLnJhdzsKKwlpZiAob2Zmc2V0IDw9IDApCisJCUJVRygpOworCWlmIChza2ItPmNzdW0gKyAyID4gb2Zmc2V0KQorCQlCVUcoKTsKKworCSoodTE2Kikoc2tiLT5oLnJhdyArIHNrYi0+Y3N1bSkgPSBjc3VtX2ZvbGQoY3N1bSk7CisJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworb3V0OgkKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX0hJR0hNRU0KKy8qIEFjdHVhbGx5LCB3ZSBzaG91bGQgZWxpbWluYXRlIHRoaXMgY2hlY2sgYXMgc29vbiBhcyB3ZSBrbm93LCB0aGF0OgorICogMS4gSU9NTVUgaXMgcHJlc2VudCBhbmQgYWxsb3dzIHRvIG1hcCBhbGwgdGhlIG1lbW9yeS4KKyAqIDIuIE5vIGhpZ2ggbWVtb3J5IHJlYWxseSBleGlzdHMgb24gdGhpcyBtYWNoaW5lLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGlsbGVnYWxfaGlnaGRtYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBpOworCisJaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hJR0hETUEpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykKKwkJaWYgKFBhZ2VIaWdoTWVtKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZSkpCisJCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgaWxsZWdhbF9oaWdoZG1hKGRldiwgc2tiKQkoMCkKKyNlbmRpZgorCitleHRlcm4gdm9pZCBza2JfcmVsZWFzZV9kYXRhKHN0cnVjdCBza19idWZmICopOworCisvKiBLZWVwIGhlYWQgdGhlIHNhbWU6IHJlcGxhY2UgZGF0YSAqLworaW50IF9fc2tiX2xpbmVhcml6ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZ2ZwX21hc2spCit7CisJdW5zaWduZWQgaW50IHNpemU7CisJdTggKmRhdGE7CisJbG9uZyBvZmZzZXQ7CisJc3RydWN0IHNrYl9zaGFyZWRfaW5mbyAqbmluZm87CisJaW50IGhlYWRlcmxlbiA9IHNrYi0+ZGF0YSAtIHNrYi0+aGVhZDsKKwlpbnQgZXhwYW5kID0gKHNrYi0+dGFpbCArIHNrYi0+ZGF0YV9sZW4pIC0gc2tiLT5lbmQ7CisKKwlpZiAoc2tiX3NoYXJlZChza2IpKQorCQlCVUcoKTsKKworCWlmIChleHBhbmQgPD0gMCkKKwkJZXhwYW5kID0gMDsKKworCXNpemUgPSBza2ItPmVuZCAtIHNrYi0+aGVhZCArIGV4cGFuZDsKKwlzaXplID0gU0tCX0RBVEFfQUxJR04oc2l6ZSk7CisJZGF0YSA9IGttYWxsb2Moc2l6ZSArIHNpemVvZihzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvKSwgZ2ZwX21hc2spOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBDb3B5IGVudGlyZSB0aGluZyAqLworCWlmIChza2JfY29weV9iaXRzKHNrYiwgLWhlYWRlcmxlbiwgZGF0YSwgaGVhZGVybGVuICsgc2tiLT5sZW4pKQorCQlCVUcoKTsKKworCS8qIFNldCB1cCBzaGluZm8gKi8KKwluaW5mbyA9IChzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvKikoZGF0YSArIHNpemUpOworCWF0b21pY19zZXQoJm5pbmZvLT5kYXRhcmVmLCAxKTsKKwluaW5mby0+dHNvX3NpemUgPSBza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplOworCW5pbmZvLT50c29fc2VncyA9IHNrYl9zaGluZm8oc2tiKS0+dHNvX3NlZ3M7CisJbmluZm8tPm5yX2ZyYWdzID0gMDsKKwluaW5mby0+ZnJhZ19saXN0ID0gTlVMTDsKKworCS8qIE9mZnNldCBiZXR3ZWVuIHRoZSB0d28gaW4gYnl0ZXMgKi8KKwlvZmZzZXQgPSBkYXRhIC0gc2tiLT5oZWFkOworCisJLyogRnJlZSBvbGQgZGF0YS4gKi8KKwlza2JfcmVsZWFzZV9kYXRhKHNrYik7CisKKwlza2ItPmhlYWQgPSBkYXRhOworCXNrYi0+ZW5kICA9IGRhdGEgKyBzaXplOworCisJLyogU2V0IHVwIG5ldyBwb2ludGVycyAqLworCXNrYi0+aC5yYXcgICArPSBvZmZzZXQ7CisJc2tiLT5uaC5yYXcgICs9IG9mZnNldDsKKwlza2ItPm1hYy5yYXcgKz0gb2Zmc2V0OworCXNrYi0+dGFpbCAgICArPSBvZmZzZXQ7CisJc2tiLT5kYXRhICAgICs9IG9mZnNldDsKKworCS8qIFdlIGFyZSBubyBsb25nZXIgYSBjbG9uZSwgZXZlbiBpZiB3ZSB3ZXJlLiAqLworCXNrYi0+Y2xvbmVkICAgID0gMDsKKworCXNrYi0+dGFpbCAgICAgKz0gc2tiLT5kYXRhX2xlbjsKKwlza2ItPmRhdGFfbGVuICA9IDA7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgSEFSRF9UWF9MT0NLKGRldiwgY3B1KSB7CQkJXAorCWlmICgoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfTExUWCkgPT0gMCkgewlcCisJCXNwaW5fbG9jaygmZGV2LT54bWl0X2xvY2spOwkJXAorCQlkZXYtPnhtaXRfbG9ja19vd25lciA9IGNwdTsJCVwKKwl9CQkJCQkJXAorfQorCisjZGVmaW5lIEhBUkRfVFhfVU5MT0NLKGRldikgewkJCQlcCisJaWYgKChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9MTFRYKSA9PSAwKSB7CVwKKwkJZGV2LT54bWl0X2xvY2tfb3duZXIgPSAtMTsJCVwKKwkJc3Bpbl91bmxvY2soJmRldi0+eG1pdF9sb2NrKTsJCVwKKwl9CQkJCQkJXAorfQorCisvKioKKyAqCWRldl9xdWV1ZV94bWl0IC0gdHJhbnNtaXQgYSBidWZmZXIKKyAqCUBza2I6IGJ1ZmZlciB0byB0cmFuc21pdAorICoKKyAqCVF1ZXVlIGEgYnVmZmVyIGZvciB0cmFuc21pc3Npb24gdG8gYSBuZXR3b3JrIGRldmljZS4gVGhlIGNhbGxlciBtdXN0CisgKgloYXZlIHNldCB0aGUgZGV2aWNlIGFuZCBwcmlvcml0eSBhbmQgYnVpbHQgdGhlIGJ1ZmZlciBiZWZvcmUgY2FsbGluZworICoJdGhpcyBmdW5jdGlvbi4gVGhlIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgZnJvbSBhbiBpbnRlcnJ1cHQuCisgKgorICoJQSBuZWdhdGl2ZSBlcnJubyBjb2RlIGlzIHJldHVybmVkIG9uIGEgZmFpbHVyZS4gQSBzdWNjZXNzIGRvZXMgbm90CisgKglndWFyYW50ZWUgdGhlIGZyYW1lIHdpbGwgYmUgdHJhbnNtaXR0ZWQgYXMgaXQgbWF5IGJlIGRyb3BwZWQgZHVlCisgKgl0byBjb25nZXN0aW9uIG9yIHRyYWZmaWMgc2hhcGluZy4KKyAqLworCitpbnQgZGV2X3F1ZXVlX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CisJc3RydWN0IFFkaXNjICpxOworCWludCByYyA9IC1FTk9NRU07CisKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QgJiYKKwkgICAgIShkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9GUkFHTElTVCkgJiYKKwkgICAgX19za2JfbGluZWFyaXplKHNrYiwgR0ZQX0FUT01JQykpCisJCWdvdG8gb3V0X2tmcmVlX3NrYjsKKworCS8qIEZyYWdtZW50ZWQgc2tiIGlzIGxpbmVhcml6ZWQgaWYgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgU0csCisJICogb3IgaWYgYXQgbGVhc3Qgb25lIG9mIGZyYWdtZW50cyBpcyBpbiBoaWdobWVtIGFuZCBkZXZpY2UKKwkgKiBkb2VzIG5vdCBzdXBwb3J0IERNQSBmcm9tIGl0LgorCSAqLworCWlmIChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICYmCisJICAgICghKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1NHKSB8fCBpbGxlZ2FsX2hpZ2hkbWEoZGV2LCBza2IpKSAmJgorCSAgICBfX3NrYl9saW5lYXJpemUoc2tiLCBHRlBfQVRPTUlDKSkKKwkJZ290byBvdXRfa2ZyZWVfc2tiOworCisJLyogSWYgcGFja2V0IGlzIG5vdCBjaGVja3N1bW1lZCBhbmQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQKKwkgKiBjaGVja3N1bW1pbmcgZm9yIHRoaXMgcHJvdG9jb2wsIGNvbXBsZXRlIGNoZWNrc3VtbWluZyBoZXJlLgorCSAqLworCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVyAmJgorCSAgICAoIShkZXYtPmZlYXR1cmVzICYgKE5FVElGX0ZfSFdfQ1NVTSB8IE5FVElGX0ZfTk9fQ1NVTSkpICYmCisJICAgICAoIShkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9JUF9DU1VNKSB8fAorCSAgICAgIHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfSVApKSkpCisJICAgICAgCWlmIChza2JfY2hlY2tzdW1faGVscChza2IsIDApKQorCSAgICAgIAkJZ290byBvdXRfa2ZyZWVfc2tiOworCisJLyogRGlzYWJsZSBzb2Z0IGlycXMgZm9yIHZhcmlvdXMgbG9ja3MgYmVsb3cuIEFsc28gCisJICogc3RvcHMgcHJlZW1wdGlvbiBmb3IgUkNVLiAKKwkgKi8KKwlsb2NhbF9iaF9kaXNhYmxlKCk7IAorCisJLyogVXBkYXRlcyBvZiBxZGlzYyBhcmUgc2VyaWFsaXplZCBieSBxdWV1ZV9sb2NrLiAKKwkgKiBUaGUgc3RydWN0IFFkaXNjIHdoaWNoIGlzIHBvaW50ZWQgdG8gYnkgcWRpc2MgaXMgbm93IGEgCisJICogcmN1IHN0cnVjdHVyZSAtIGl0IG1heSBiZSBhY2Nlc3NlZCB3aXRob3V0IGFjcXVpcmluZyAKKwkgKiBhIGxvY2sgKGJ1dCB0aGUgc3RydWN0dXJlIG1heSBiZSBzdGFsZS4pIFRoZSBmcmVlaW5nIG9mIHRoZQorCSAqIHFkaXNjIHdpbGwgYmUgZGVmZXJyZWQgdW50aWwgaXQncyBrbm93biB0aGF0IHRoZXJlIGFyZSBubyAKKwkgKiBtb3JlIHJlZmVyZW5jZXMgdG8gaXQuCisJICogCisJICogSWYgdGhlIHFkaXNjIGhhcyBhbiBlbnF1ZXVlIGZ1bmN0aW9uLCB3ZSBzdGlsbCBuZWVkIHRvIAorCSAqIGhvbGQgdGhlIHF1ZXVlX2xvY2sgYmVmb3JlIGNhbGxpbmcgaXQsIHNpbmNlIHF1ZXVlX2xvY2sKKwkgKiBhbHNvIHNlcmlhbGl6ZXMgYWNjZXNzIHRvIHRoZSBkZXZpY2UgcXVldWUuCisJICovCisKKwlxID0gcmN1X2RlcmVmZXJlbmNlKGRldi0+cWRpc2MpOworI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAorCXNrYi0+dGNfdmVyZCA9IFNFVF9UQ19BVChza2ItPnRjX3ZlcmQsQVRfRUdSRVNTKTsKKyNlbmRpZgorCWlmIChxLT5lbnF1ZXVlKSB7CisJCS8qIEdyYWIgZGV2aWNlIHF1ZXVlICovCisJCXNwaW5fbG9jaygmZGV2LT5xdWV1ZV9sb2NrKTsKKworCQlyYyA9IHEtPmVucXVldWUoc2tiLCBxKTsKKworCQlxZGlzY19ydW4oZGV2KTsKKworCQlzcGluX3VubG9jaygmZGV2LT5xdWV1ZV9sb2NrKTsKKwkJcmMgPSByYyA9PSBORVRfWE1JVF9CWVBBU1MgPyBORVRfWE1JVF9TVUNDRVNTIDogcmM7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFRoZSBkZXZpY2UgaGFzIG5vIHF1ZXVlLiBDb21tb24gY2FzZSBmb3Igc29mdHdhcmUgZGV2aWNlczoKKwkgICBsb29wYmFjaywgYWxsIHRoZSBzb3J0cyBvZiB0dW5uZWxzLi4uCisKKwkgICBSZWFsbHksIGl0IGlzIHVubGlrZWx5IHRoYXQgeG1pdF9sb2NrIHByb3RlY3Rpb24gaXMgbmVjZXNzYXJ5IGhlcmUuCisJICAgKGYuZS4gbG9vcGJhY2sgYW5kIElQIHR1bm5lbHMgYXJlIGNsZWFuIGlnbm9yaW5nIHN0YXRpc3RpY3MKKwkgICBjb3VudGVycy4pCisJICAgSG93ZXZlciwgaXQgaXMgcG9zc2libGUsIHRoYXQgdGhleSByZWx5IG9uIHByb3RlY3Rpb24KKwkgICBtYWRlIGJ5IHVzIGhlcmUuCisKKwkgICBDaGVjayB0aGlzIGFuZCBzaG90IHRoZSBsb2NrLiBJdCBpcyBub3QgcHJvbmUgZnJvbSBkZWFkbG9ja3MuCisJICAgRWl0aGVyIHNob3Qgbm9xdWV1ZSBxZGlzYywgaXQgaXMgZXZlbiBzaW1wbGVyIDgpCisJICovCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApIHsKKwkJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsgLyogb2sgYmVjYXVzZSBCSHMgYXJlIG9mZiAqLworCisJCWlmIChkZXYtPnhtaXRfbG9ja19vd25lciAhPSBjcHUpIHsKKworCQkJSEFSRF9UWF9MT0NLKGRldiwgY3B1KTsKKworCQkJaWYgKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKKwkJCQlpZiAobmV0ZGV2X25pdCkKKwkJCQkJZGV2X3F1ZXVlX3htaXRfbml0KHNrYiwgZGV2KTsKKworCQkJCXJjID0gMDsKKwkJCQlpZiAoIWRldi0+aGFyZF9zdGFydF94bWl0KHNrYiwgZGV2KSkgeworCQkJCQlIQVJEX1RYX1VOTE9DSyhkZXYpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQl9CisJCQlIQVJEX1RYX1VOTE9DSyhkZXYpOworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQlwcmludGsoS0VSTl9DUklUICJWaXJ0dWFsIGRldmljZSAlcyBhc2tzIHRvICIKKwkJCQkgICAgICAgInF1ZXVlIHBhY2tldCFcbiIsIGRldi0+bmFtZSk7CisJCX0gZWxzZSB7CisJCQkvKiBSZWN1cnNpb24gaXMgZGV0ZWN0ZWQhIEl0IGlzIHBvc3NpYmxlLAorCQkJICogdW5mb3J0dW5hdGVseSAqLworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQlwcmludGsoS0VSTl9DUklUICJEZWFkIGxvb3Agb24gdmlydHVhbCBkZXZpY2UgIgorCQkJCSAgICAgICAiJXMsIGZpeCBpdCB1cmdlbnRseSFcbiIsIGRldi0+bmFtZSk7CisJCX0KKwl9CisKKwlyYyA9IC1FTkVURE9XTjsKKwlsb2NhbF9iaF9lbmFibGUoKTsKKworb3V0X2tmcmVlX3NrYjoKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gcmM7CitvdXQ6CisJbG9jYWxfYmhfZW5hYmxlKCk7CisJcmV0dXJuIHJjOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJCVJlY2VpdmVyIHJvdXRpbmVzCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworaW50IG5ldGRldl9tYXhfYmFja2xvZyA9IDMwMDsKK2ludCB3ZWlnaHRfcCA9IDY0OyAgICAgICAgICAgIC8qIG9sZCBiYWNrbG9nIHdlaWdodCAqLworLyogVGhlc2UgbnVtYmVycyBhcmUgc2VsZWN0ZWQgYmFzZWQgb24gaW50dWl0aW9uIGFuZCBzb21lCisgKiBleHBlcmltZW50YXRpb20sIGlmIHlvdSBoYXZlIG1vcmUgc2NpZW50aWZpYyB3YXkgb2YgZG9pbmcgdGhpcworICogcGxlYXNlIGdvIGFoZWFkIGFuZCBmaXggdGhpbmdzLgorICovCitpbnQgbm9fY29uZ190aHJlc2ggPSAxMDsKK2ludCBub19jb25nID0gMjA7CitpbnQgbG9fY29uZyA9IDEwMDsKK2ludCBtb2RfY29uZyA9IDI5MDsKKworREVGSU5FX1BFUl9DUFUoc3RydWN0IG5ldGlmX3J4X3N0YXRzLCBuZXRkZXZfcnhfc3RhdCkgPSB7IDAsIH07CisKKworc3RhdGljIHZvaWQgZ2V0X3NhbXBsZV9zdGF0cyhpbnQgY3B1KQoreworI2lmZGVmIFJBTkRfTElFCisJdW5zaWduZWQgbG9uZyByZDsKKwlpbnQgcnE7CisjZW5kaWYKKwlzdHJ1Y3Qgc29mdG5ldF9kYXRhICpzZCA9ICZwZXJfY3B1KHNvZnRuZXRfZGF0YSwgY3B1KTsKKwlpbnQgYmxvZyA9IHNkLT5pbnB1dF9wa3RfcXVldWUucWxlbjsKKwlpbnQgYXZnX2Jsb2cgPSBzZC0+YXZnX2Jsb2c7CisKKwlhdmdfYmxvZyA9IChhdmdfYmxvZyA+PiAxKSArIChibG9nID4+IDEpOworCisJaWYgKGF2Z19ibG9nID4gbW9kX2NvbmcpIHsKKwkJLyogQWJvdmUgbW9kZXJhdGUgY29uZ2VzdGlvbiBsZXZlbHMuICovCisJCXNkLT5jbmdfbGV2ZWwgPSBORVRfUlhfQ05fSElHSDsKKyNpZmRlZiBSQU5EX0xJRQorCQlyZCA9IG5ldF9yYW5kb20oKTsKKwkJcnEgPSByZCAlIG5ldGRldl9tYXhfYmFja2xvZzsKKwkJaWYgKHJxIDwgYXZnX2Jsb2cpIC8qIHVubHVja3kgYmFzdGFyZCAqLworCQkJc2QtPmNuZ19sZXZlbCA9IE5FVF9SWF9EUk9QOworI2VuZGlmCisJfSBlbHNlIGlmIChhdmdfYmxvZyA+IGxvX2NvbmcpIHsKKwkJc2QtPmNuZ19sZXZlbCA9IE5FVF9SWF9DTl9NT0Q7CisjaWZkZWYgUkFORF9MSUUKKwkJcmQgPSBuZXRfcmFuZG9tKCk7CisJCXJxID0gcmQgJSBuZXRkZXZfbWF4X2JhY2tsb2c7CisJCQlpZiAocnEgPCBhdmdfYmxvZykgLyogdW5sdWNreSBiYXN0YXJkICovCisJCQkJc2QtPmNuZ19sZXZlbCA9IE5FVF9SWF9DTl9ISUdIOworI2VuZGlmCisJfSBlbHNlIGlmIChhdmdfYmxvZyA+IG5vX2NvbmcpCisJCXNkLT5jbmdfbGV2ZWwgPSBORVRfUlhfQ05fTE9XOworCWVsc2UgIC8qIG5vIGNvbmdlc3Rpb24gKi8KKwkJc2QtPmNuZ19sZXZlbCA9IE5FVF9SWF9TVUNDRVNTOworCisJc2QtPmF2Z19ibG9nID0gYXZnX2Jsb2c7Cit9CisKKyNpZmRlZiBPRkZMSU5FX1NBTVBMRQorc3RhdGljIHZvaWQgc2FtcGxlX3F1ZXVlKHVuc2lnbmVkIGxvbmcgZHVtbXkpCit7CisvKiAxMCBtcyAwciAxbXMgLS0gaSBkb24ndCBjYXJlIC0tIEpIUyAqLworCWludCBuZXh0X3RpY2sgPSAxOworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlnZXRfc2FtcGxlX3N0YXRzKGNwdSk7CisJbmV4dF90aWNrICs9IGppZmZpZXM7CisJbW9kX3RpbWVyKCZzYW1wX3RpbWVyLCBuZXh0X3RpY2spOworfQorI2VuZGlmCisKKworLyoqCisgKgluZXRpZl9yeAktCXBvc3QgYnVmZmVyIHRvIHRoZSBuZXR3b3JrIGNvZGUKKyAqCUBza2I6IGJ1ZmZlciB0byBwb3N0CisgKgorICoJVGhpcyBmdW5jdGlvbiByZWNlaXZlcyBhIHBhY2tldCBmcm9tIGEgZGV2aWNlIGRyaXZlciBhbmQgcXVldWVzIGl0IGZvcgorICoJdGhlIHVwcGVyIChwcm90b2NvbCkgbGV2ZWxzIHRvIHByb2Nlc3MuICBJdCBhbHdheXMgc3VjY2VlZHMuIFRoZSBidWZmZXIKKyAqCW1heSBiZSBkcm9wcGVkIGR1cmluZyBwcm9jZXNzaW5nIGZvciBjb25nZXN0aW9uIGNvbnRyb2wgb3IgYnkgdGhlCisgKglwcm90b2NvbCBsYXllcnMuCisgKgorICoJcmV0dXJuIHZhbHVlczoKKyAqCU5FVF9SWF9TVUNDRVNTCShubyBjb25nZXN0aW9uKQorICoJTkVUX1JYX0NOX0xPVyAgIChsb3cgY29uZ2VzdGlvbikKKyAqCU5FVF9SWF9DTl9NT0QgICAobW9kZXJhdGUgY29uZ2VzdGlvbikKKyAqCU5FVF9SWF9DTl9ISUdIICAoaGlnaCBjb25nZXN0aW9uKQorICoJTkVUX1JYX0RST1AgICAgIChwYWNrZXQgd2FzIGRyb3BwZWQpCisgKgorICovCisKK2ludCBuZXRpZl9yeChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCB0aGlzX2NwdTsKKwlzdHJ1Y3Qgc29mdG5ldF9kYXRhICpxdWV1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogaWYgbmV0cG9sbCB3YW50cyBpdCwgcHJldGVuZCB3ZSBuZXZlciBzYXcgaXQgKi8KKwlpZiAobmV0cG9sbF9yeChza2IpKQorCQlyZXR1cm4gTkVUX1JYX0RST1A7CisKKwlpZiAoIXNrYi0+c3RhbXAudHZfc2VjKQorCQluZXRfdGltZXN0YW1wKCZza2ItPnN0YW1wKTsKKworCS8qCisJICogVGhlIGNvZGUgaXMgcmVhcnJhbmdlZCBzbyB0aGF0IHRoZSBwYXRoIGlzIHRoZSBtb3N0CisJICogc2hvcnQgd2hlbiBDUFUgaXMgY29uZ2VzdGVkLCBidXQgaXMgc3RpbGwgb3BlcmF0aW5nLgorCSAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwl0aGlzX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlxdWV1ZSA9ICZfX2dldF9jcHVfdmFyKHNvZnRuZXRfZGF0YSk7CisKKwlfX2dldF9jcHVfdmFyKG5ldGRldl9yeF9zdGF0KS50b3RhbCsrOworCWlmIChxdWV1ZS0+aW5wdXRfcGt0X3F1ZXVlLnFsZW4gPD0gbmV0ZGV2X21heF9iYWNrbG9nKSB7CisJCWlmIChxdWV1ZS0+aW5wdXRfcGt0X3F1ZXVlLnFsZW4pIHsKKwkJCWlmIChxdWV1ZS0+dGhyb3R0bGUpCisJCQkJZ290byBkcm9wOworCitlbnF1ZXVlOgorCQkJZGV2X2hvbGQoc2tiLT5kZXYpOworCQkJX19za2JfcXVldWVfdGFpbCgmcXVldWUtPmlucHV0X3BrdF9xdWV1ZSwgc2tiKTsKKyNpZm5kZWYgT0ZGTElORV9TQU1QTEUKKwkJCWdldF9zYW1wbGVfc3RhdHModGhpc19jcHUpOworI2VuZGlmCisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQlyZXR1cm4gcXVldWUtPmNuZ19sZXZlbDsKKwkJfQorCisJCWlmIChxdWV1ZS0+dGhyb3R0bGUpCisJCQlxdWV1ZS0+dGhyb3R0bGUgPSAwOworCisJCW5ldGlmX3J4X3NjaGVkdWxlKCZxdWV1ZS0+YmFja2xvZ19kZXYpOworCQlnb3RvIGVucXVldWU7CisJfQorCisJaWYgKCFxdWV1ZS0+dGhyb3R0bGUpIHsKKwkJcXVldWUtPnRocm90dGxlID0gMTsKKwkJX19nZXRfY3B1X3ZhcihuZXRkZXZfcnhfc3RhdCkudGhyb3R0bGVkKys7CisJfQorCitkcm9wOgorCV9fZ2V0X2NwdV92YXIobmV0ZGV2X3J4X3N0YXQpLmRyb3BwZWQrKzsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gTkVUX1JYX0RST1A7Cit9CisKK2ludCBuZXRpZl9yeF9uaShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBlcnI7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwllcnIgPSBuZXRpZl9yeChza2IpOworCWlmIChsb2NhbF9zb2Z0aXJxX3BlbmRpbmcoKSkKKwkJZG9fc29mdGlycSgpOworCXByZWVtcHRfZW5hYmxlKCk7CisKKwlyZXR1cm4gZXJyOworfQorCitFWFBPUlRfU1lNQk9MKG5ldGlmX3J4X25pKTsKKworc3RhdGljIF9faW5saW5lX18gdm9pZCBza2JfYm9uZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKKworCWlmIChkZXYtPm1hc3RlcikgeworCQlza2ItPnJlYWxfZGV2ID0gc2tiLT5kZXY7CisJCXNrYi0+ZGV2ID0gZGV2LT5tYXN0ZXI7CisJfQorfQorCitzdGF0aWMgdm9pZCBuZXRfdHhfYWN0aW9uKHN0cnVjdCBzb2Z0aXJxX2FjdGlvbiAqaCkKK3sKKwlzdHJ1Y3Qgc29mdG5ldF9kYXRhICpzZCA9ICZfX2dldF9jcHVfdmFyKHNvZnRuZXRfZGF0YSk7CisKKwlpZiAoc2QtPmNvbXBsZXRpb25fcXVldWUpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKmNsaXN0OworCisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCWNsaXN0ID0gc2QtPmNvbXBsZXRpb25fcXVldWU7CisJCXNkLT5jb21wbGV0aW9uX3F1ZXVlID0gTlVMTDsKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJCXdoaWxlIChjbGlzdCkgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGNsaXN0OworCQkJY2xpc3QgPSBjbGlzdC0+bmV4dDsKKworCQkJQlVHX1RSQVAoIWF0b21pY19yZWFkKCZza2ItPnVzZXJzKSk7CisJCQlfX2tmcmVlX3NrYihza2IpOworCQl9CisJfQorCisJaWYgKHNkLT5vdXRwdXRfcXVldWUpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmhlYWQ7CisKKwkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJaGVhZCA9IHNkLT5vdXRwdXRfcXVldWU7CisJCXNkLT5vdXRwdXRfcXVldWUgPSBOVUxMOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwkJd2hpbGUgKGhlYWQpIHsKKwkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBoZWFkOworCQkJaGVhZCA9IGhlYWQtPm5leHRfc2NoZWQ7CisKKwkJCXNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpOworCQkJY2xlYXJfYml0KF9fTElOS19TVEFURV9TQ0hFRCwgJmRldi0+c3RhdGUpOworCisJCQlpZiAoc3Bpbl90cnlsb2NrKCZkZXYtPnF1ZXVlX2xvY2spKSB7CisJCQkJcWRpc2NfcnVuKGRldik7CisJCQkJc3Bpbl91bmxvY2soJmRldi0+cXVldWVfbG9jayk7CisJCQl9IGVsc2UgeworCQkJCW5ldGlmX3NjaGVkdWxlKGRldik7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBkZWxpdmVyX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgc3RydWN0IHBhY2tldF90eXBlICpwdF9wcmV2KQoreworCWF0b21pY19pbmMoJnNrYi0+dXNlcnMpOworCXJldHVybiBwdF9wcmV2LT5mdW5jKHNrYiwgc2tiLT5kZXYsIHB0X3ByZXYpOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfQlJJREdFKSB8fCBkZWZpbmVkIChDT05GSUdfQlJJREdFX01PRFVMRSkKK2ludCAoKmJyX2hhbmRsZV9mcmFtZV9ob29rKShzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpOworc3RydWN0IG5ldF9icmlkZ2U7CitzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKigqYnJfZmRiX2dldF9ob29rKShzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCisJCQkJCQl1bnNpZ25lZCBjaGFyICphZGRyKTsKK3ZvaWQgKCpicl9mZGJfcHV0X2hvb2spKHN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZW50KTsKKworc3RhdGljIF9faW5saW5lX18gaW50IGhhbmRsZV9icmlkZ2Uoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCSAgICBzdHJ1Y3QgcGFja2V0X3R5cGUgKipwdF9wcmV2LCBpbnQgKnJldCkKK3sKKwlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0OworCisJaWYgKCgqcHNrYiktPnBrdF90eXBlID09IFBBQ0tFVF9MT09QQkFDSyB8fAorCSAgICAocG9ydCA9IHJjdV9kZXJlZmVyZW5jZSgoKnBza2IpLT5kZXYtPmJyX3BvcnQpKSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWlmICgqcHRfcHJldikgeworCQkqcmV0ID0gZGVsaXZlcl9za2IoKnBza2IsICpwdF9wcmV2KTsKKwkJKnB0X3ByZXYgPSBOVUxMOworCX0gCisJCisJcmV0dXJuIGJyX2hhbmRsZV9mcmFtZV9ob29rKHBvcnQsIHBza2IpOworfQorI2Vsc2UKKyNkZWZpbmUgaGFuZGxlX2JyaWRnZShza2IsIHB0X3ByZXYsIHJldCkJKDApCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAorLyogVE9ETzogTWF5YmUgd2Ugc2hvdWxkIGp1c3QgZm9yY2Ugc2NoX2luZ3Jlc3MgdG8gYmUgY29tcGlsZWQgaW4KKyAqIHdoZW4gQ09ORklHX05FVF9DTFNfQUNUIGlzPyBvdGhlcndpc2Ugc29tZSB1c2VsZXNzIGluc3RydWN0aW9ucworICogYSBjb21wYXJlIGFuZCAyIHN0b3JlcyBleHRyYSByaWdodCBub3cgaWYgd2UgZG9udCBoYXZlIGl0IG9uCisgKiBidXQgaGF2ZSBDT05GSUdfTkVUX0NMU19BQ1QKKyAqIE5PVEU6IFRoaXMgZG9lc250IHN0b3AgYW55IGZ1bmN0aW9uYWxpdHk7IGlmIHlvdSBkb250IGhhdmUgCisgKiB0aGUgaW5ncmVzcyBzY2hlZHVsZXIsIHlvdSBqdXN0IGNhbnQgYWRkIHBvbGljaWVzIG9uIGluZ3Jlc3MuCisgKgorICovCitzdGF0aWMgaW50IGluZ19maWx0ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikgCit7CisJc3RydWN0IFFkaXNjICpxOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKKwlpbnQgcmVzdWx0ID0gVENfQUNUX09LOworCQorCWlmIChkZXYtPnFkaXNjX2luZ3Jlc3MpIHsKKwkJX191MzIgdHRsID0gKF9fdTMyKSBHX1RDX1JUVEwoc2tiLT50Y192ZXJkKTsKKwkJaWYgKE1BWF9SRURfTE9PUCA8IHR0bCsrKSB7CisJCQlwcmludGsoIlJlZGlyIGxvb3AgZGV0ZWN0ZWQgRHJvcHBpbmcgcGFja2V0ICglcy0+JXMpXG4iLAorCQkJCXNrYi0+aW5wdXRfZGV2P3NrYi0+aW5wdXRfZGV2LT5uYW1lOiI/PyIsc2tiLT5kZXYtPm5hbWUpOworCQkJcmV0dXJuIFRDX0FDVF9TSE9UOworCQl9CisKKwkJc2tiLT50Y192ZXJkID0gU0VUX1RDX1JUVEwoc2tiLT50Y192ZXJkLHR0bCk7CisKKwkJc2tiLT50Y192ZXJkID0gU0VUX1RDX0FUKHNrYi0+dGNfdmVyZCxBVF9JTkdSRVNTKTsKKwkJaWYgKE5VTEwgPT0gc2tiLT5pbnB1dF9kZXYpIHsKKwkJCXNrYi0+aW5wdXRfZGV2ID0gc2tiLT5kZXY7CisJCQlwcmludGsoImluZ19maWx0ZXI6ICBmaXhlZCAgJXMgb3V0ICVzXG4iLHNrYi0+aW5wdXRfZGV2LT5uYW1lLHNrYi0+ZGV2LT5uYW1lKTsKKwkJfQorCQlzcGluX2xvY2soJmRldi0+aW5ncmVzc19sb2NrKTsKKwkJaWYgKChxID0gZGV2LT5xZGlzY19pbmdyZXNzKSAhPSBOVUxMKQorCQkJcmVzdWx0ID0gcS0+ZW5xdWV1ZShza2IsIHEpOworCQlzcGluX3VubG9jaygmZGV2LT5pbmdyZXNzX2xvY2spOworCisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCitpbnQgbmV0aWZfcmVjZWl2ZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0eXBlLCAqcHRfcHJldjsKKwlpbnQgcmV0ID0gTkVUX1JYX0RST1A7CisJdW5zaWduZWQgc2hvcnQgdHlwZTsKKworCS8qIGlmIHdlJ3ZlIGdvdHRlbiBoZXJlIHRocm91Z2ggTkFQSSwgY2hlY2sgbmV0cG9sbCAqLworCWlmIChza2ItPmRldi0+cG9sbCAmJiBuZXRwb2xsX3J4KHNrYikpCisJCXJldHVybiBORVRfUlhfRFJPUDsKKworCWlmICghc2tiLT5zdGFtcC50dl9zZWMpCisJCW5ldF90aW1lc3RhbXAoJnNrYi0+c3RhbXApOworCisJc2tiX2JvbmQoc2tiKTsKKworCV9fZ2V0X2NwdV92YXIobmV0ZGV2X3J4X3N0YXQpLnRvdGFsKys7CisKKwlza2ItPmgucmF3ID0gc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisJc2tiLT5tYWNfbGVuID0gc2tiLT5uaC5yYXcgLSBza2ItPm1hYy5yYXc7CisKKwlwdF9wcmV2ID0gTlVMTDsKKworCXJjdV9yZWFkX2xvY2soKTsKKworI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAorCWlmIChza2ItPnRjX3ZlcmQgJiBUQ19OQ0xTKSB7CisJCXNrYi0+dGNfdmVyZCA9IENMUl9UQ19OQ0xTKHNrYi0+dGNfdmVyZCk7CisJCWdvdG8gbmNsczsKKwl9CisjZW5kaWYKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHB0eXBlLCAmcHR5cGVfYWxsLCBsaXN0KSB7CisJCWlmICghcHR5cGUtPmRldiB8fCBwdHlwZS0+ZGV2ID09IHNrYi0+ZGV2KSB7CisJCQlpZiAocHRfcHJldikgCisJCQkJcmV0ID0gZGVsaXZlcl9za2Ioc2tiLCBwdF9wcmV2KTsKKwkJCXB0X3ByZXYgPSBwdHlwZTsKKwkJfQorCX0KKworI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAorCWlmIChwdF9wcmV2KSB7CisJCXJldCA9IGRlbGl2ZXJfc2tiKHNrYiwgcHRfcHJldik7CisJCXB0X3ByZXYgPSBOVUxMOyAvKiBub29uZSBlbHNlIHNob3VsZCBwcm9jZXNzIHRoaXMgYWZ0ZXIqLworCX0gZWxzZSB7CisJCXNrYi0+dGNfdmVyZCA9IFNFVF9UQ19PSzJNVU5HRShza2ItPnRjX3ZlcmQpOworCX0KKworCXJldCA9IGluZ19maWx0ZXIoc2tiKTsKKworCWlmIChyZXQgPT0gVENfQUNUX1NIT1QgfHwgKHJldCA9PSBUQ19BQ1RfU1RPTEVOKSkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJZ290byBvdXQ7CisJfQorCisJc2tiLT50Y192ZXJkID0gMDsKK25jbHM6CisjZW5kaWYKKworCWhhbmRsZV9kaXZlcnRlcihza2IpOworCisJaWYgKGhhbmRsZV9icmlkZ2UoJnNrYiwgJnB0X3ByZXYsICZyZXQpKQorCQlnb3RvIG91dDsKKworCXR5cGUgPSBza2ItPnByb3RvY29sOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHB0eXBlLCAmcHR5cGVfYmFzZVtudG9ocyh0eXBlKSYxNV0sIGxpc3QpIHsKKwkJaWYgKHB0eXBlLT50eXBlID09IHR5cGUgJiYKKwkJICAgICghcHR5cGUtPmRldiB8fCBwdHlwZS0+ZGV2ID09IHNrYi0+ZGV2KSkgeworCQkJaWYgKHB0X3ByZXYpIAorCQkJCXJldCA9IGRlbGl2ZXJfc2tiKHNrYiwgcHRfcHJldik7CisJCQlwdF9wcmV2ID0gcHR5cGU7CisJCX0KKwl9CisKKwlpZiAocHRfcHJldikgeworCQlyZXQgPSBwdF9wcmV2LT5mdW5jKHNrYiwgc2tiLT5kZXYsIHB0X3ByZXYpOworCX0gZWxzZSB7CisJCWtmcmVlX3NrYihza2IpOworCQkvKiBKYW1hbCwgbm93IHlvdSB3aWxsIG5vdCBhYmxlIHRvIGVzY2FwZSBleHBsYWluaW5nCisJCSAqIG1lIGhvdyB5b3Ugd2VyZSBnb2luZyB0byB1c2UgdGhpcy4gOi0pCisJCSAqLworCQlyZXQgPSBORVRfUlhfRFJPUDsKKwl9CisKK291dDoKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfYmFja2xvZyhzdHJ1Y3QgbmV0X2RldmljZSAqYmFja2xvZ19kZXYsIGludCAqYnVkZ2V0KQoreworCWludCB3b3JrID0gMDsKKwlpbnQgcXVvdGEgPSBtaW4oYmFja2xvZ19kZXYtPnF1b3RhLCAqYnVkZ2V0KTsKKwlzdHJ1Y3Qgc29mdG5ldF9kYXRhICpxdWV1ZSA9ICZfX2dldF9jcHVfdmFyKHNvZnRuZXRfZGF0YSk7CisJdW5zaWduZWQgbG9uZyBzdGFydF90aW1lID0gamlmZmllczsKKworCWZvciAoOzspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQlza2IgPSBfX3NrYl9kZXF1ZXVlKCZxdWV1ZS0+aW5wdXRfcGt0X3F1ZXVlKTsKKwkJaWYgKCFza2IpCisJCQlnb3RvIGpvYl9kb25lOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwkJZGV2ID0gc2tiLT5kZXY7CisKKwkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKworCQlkZXZfcHV0KGRldik7CisKKwkJd29yaysrOworCisJCWlmICh3b3JrID49IHF1b3RhIHx8IGppZmZpZXMgLSBzdGFydF90aW1lID4gMSkKKwkJCWJyZWFrOworCisJfQorCisJYmFja2xvZ19kZXYtPnF1b3RhIC09IHdvcms7CisJKmJ1ZGdldCAtPSB3b3JrOworCXJldHVybiAtMTsKKworam9iX2RvbmU6CisJYmFja2xvZ19kZXYtPnF1b3RhIC09IHdvcms7CisJKmJ1ZGdldCAtPSB3b3JrOworCisJbGlzdF9kZWwoJmJhY2tsb2dfZGV2LT5wb2xsX2xpc3QpOworCXNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpOworCW5ldGlmX3BvbGxfZW5hYmxlKGJhY2tsb2dfZGV2KTsKKworCWlmIChxdWV1ZS0+dGhyb3R0bGUpCisJCXF1ZXVlLT50aHJvdHRsZSA9IDA7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBuZXRfcnhfYWN0aW9uKHN0cnVjdCBzb2Z0aXJxX2FjdGlvbiAqaCkKK3sKKwlzdHJ1Y3Qgc29mdG5ldF9kYXRhICpxdWV1ZSA9ICZfX2dldF9jcHVfdmFyKHNvZnRuZXRfZGF0YSk7CisJdW5zaWduZWQgbG9uZyBzdGFydF90aW1lID0gamlmZmllczsKKwlpbnQgYnVkZ2V0ID0gbmV0ZGV2X21heF9iYWNrbG9nOworCisJCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmcXVldWUtPnBvbGxfbGlzdCkpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCQlpZiAoYnVkZ2V0IDw9IDAgfHwgamlmZmllcyAtIHN0YXJ0X3RpbWUgPiAxKQorCQkJZ290byBzb2Z0bmV0X2JyZWFrOworCisJCWxvY2FsX2lycV9lbmFibGUoKTsKKworCQlkZXYgPSBsaXN0X2VudHJ5KHF1ZXVlLT5wb2xsX2xpc3QubmV4dCwKKwkJCQkgc3RydWN0IG5ldF9kZXZpY2UsIHBvbGxfbGlzdCk7CisJCW5ldHBvbGxfcG9sbF9sb2NrKGRldik7CisKKwkJaWYgKGRldi0+cXVvdGEgPD0gMCB8fCBkZXYtPnBvbGwoZGV2LCAmYnVkZ2V0KSkgeworCQkJbmV0cG9sbF9wb2xsX3VubG9jayhkZXYpOworCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJCWxpc3RfZGVsKCZkZXYtPnBvbGxfbGlzdCk7CisJCQlsaXN0X2FkZF90YWlsKCZkZXYtPnBvbGxfbGlzdCwgJnF1ZXVlLT5wb2xsX2xpc3QpOworCQkJaWYgKGRldi0+cXVvdGEgPCAwKQorCQkJCWRldi0+cXVvdGEgKz0gZGV2LT53ZWlnaHQ7CisJCQllbHNlCisJCQkJZGV2LT5xdW90YSA9IGRldi0+d2VpZ2h0OworCQl9IGVsc2UgeworCQkJbmV0cG9sbF9wb2xsX3VubG9jayhkZXYpOworCQkJZGV2X3B1dChkZXYpOworCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJfQorCX0KK291dDoKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJcmV0dXJuOworCitzb2Z0bmV0X2JyZWFrOgorCV9fZ2V0X2NwdV92YXIobmV0ZGV2X3J4X3N0YXQpLnRpbWVfc3F1ZWV6ZSsrOworCV9fcmFpc2Vfc29mdGlycV9pcnFvZmYoTkVUX1JYX1NPRlRJUlEpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgZ2lmY29uZl9mdW5jX3QgKiBnaWZjb25mX2xpc3QgW05QUk9UT107CisKKy8qKgorICoJcmVnaXN0ZXJfZ2lmY29uZgktCXJlZ2lzdGVyIGEgU0lPQ0dJRiBoYW5kbGVyCisgKglAZmFtaWx5OiBBZGRyZXNzIGZhbWlseQorICoJQGdpZmNvbmY6IEZ1bmN0aW9uIGhhbmRsZXIKKyAqCisgKglSZWdpc3RlciBwcm90b2NvbCBkZXBlbmRlbnQgYWRkcmVzcyBkdW1waW5nIHJvdXRpbmVzLiBUaGUgaGFuZGxlcgorICoJdGhhdCBpcyBwYXNzZWQgbXVzdCBub3QgYmUgZnJlZWQgb3IgcmV1c2VkIHVudGlsIGl0IGhhcyBiZWVuIHJlcGxhY2VkCisgKglieSBhbm90aGVyIGhhbmRsZXIuCisgKi8KK2ludCByZWdpc3Rlcl9naWZjb25mKHVuc2lnbmVkIGludCBmYW1pbHksIGdpZmNvbmZfZnVuY190ICogZ2lmY29uZikKK3sKKwlpZiAoZmFtaWx5ID49IE5QUk9UTykKKwkJcmV0dXJuIC1FSU5WQUw7CisJZ2lmY29uZl9saXN0W2ZhbWlseV0gPSBnaWZjb25mOworCXJldHVybiAwOworfQorCisKKy8qCisgKglNYXAgYW4gaW50ZXJmYWNlIGluZGV4IHRvIGl0cyBuYW1lIChTSU9DR0lGTkFNRSkKKyAqLworCisvKgorICoJV2UgbmVlZCB0aGlzIGlvY3RsIGZvciBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlCisgKglpZl9pbmRleHRvbmFtZSgpIGZ1bmN0aW9uIHJlcXVpcmVkIGJ5IHRoZSBJUHY2IEFQSS4gIFdpdGhvdXQKKyAqCWl0LCB3ZSB3b3VsZCBoYXZlIHRvIHNlYXJjaCBhbGwgdGhlIGludGVyZmFjZXMgdG8gZmluZCBhCisgKgltYXRjaC4gIC0tcGIKKyAqLworCitzdGF0aWMgaW50IGRldl9pZm5hbWUoc3RydWN0IGlmcmVxIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGlmcmVxIGlmcjsKKworCS8qCisJICoJRmV0Y2ggdGhlIGNhbGxlcidzIGluZm8gYmxvY2suCisJICovCisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmlmciwgYXJnLCBzaXplb2Yoc3RydWN0IGlmcmVxKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKwlkZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgoaWZyLmlmcl9pZmluZGV4KTsKKwlpZiAoIWRldikgeworCQlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXN0cmNweShpZnIuaWZyX25hbWUsIGRldi0+bmFtZSk7CisJcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOworCisJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZpZnIsIHNpemVvZihzdHJ1Y3QgaWZyZXEpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglQZXJmb3JtIGEgU0lPQ0dJRkNPTkYgY2FsbC4gVGhpcyBzdHJ1Y3R1cmUgd2lsbCBjaGFuZ2UKKyAqCXNpemUgZXZlbnR1YWxseSwgYW5kIHRoZXJlIGlzIG5vdGhpbmcgSSBjYW4gZG8gYWJvdXQgaXQuCisgKglUaHVzIHdlIHdpbGwgbmVlZCBhICdjb21wYXRpYmlsaXR5IG1vZGUnLgorICovCisKK3N0YXRpYyBpbnQgZGV2X2lmY29uZihjaGFyIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBpZmNvbmYgaWZjOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJY2hhciBfX3VzZXIgKnBvczsKKwlpbnQgbGVuOworCWludCB0b3RhbDsKKwlpbnQgaTsKKworCS8qCisJICoJRmV0Y2ggdGhlIGNhbGxlcidzIGluZm8gYmxvY2suCisJICovCisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmlmYywgYXJnLCBzaXplb2Yoc3RydWN0IGlmY29uZikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXBvcyA9IGlmYy5pZmNfYnVmOworCWxlbiA9IGlmYy5pZmNfbGVuOworCisJLyoKKwkgKglMb29wIG92ZXIgdGhlIGludGVyZmFjZXMsIGFuZCB3cml0ZSBhbiBpbmZvIGJsb2NrIGZvciBlYWNoLgorCSAqLworCisJdG90YWwgPSAwOworCWZvciAoZGV2ID0gZGV2X2Jhc2U7IGRldjsgZGV2ID0gZGV2LT5uZXh0KSB7CisJCWZvciAoaSA9IDA7IGkgPCBOUFJPVE87IGkrKykgeworCQkJaWYgKGdpZmNvbmZfbGlzdFtpXSkgeworCQkJCWludCBkb25lOworCQkJCWlmICghcG9zKQorCQkJCQlkb25lID0gZ2lmY29uZl9saXN0W2ldKGRldiwgTlVMTCwgMCk7CisJCQkJZWxzZQorCQkJCQlkb25lID0gZ2lmY29uZl9saXN0W2ldKGRldiwgcG9zICsgdG90YWwsCisJCQkJCQkJICAgICAgIGxlbiAtIHRvdGFsKTsKKwkJCQlpZiAoZG9uZSA8IDApCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXRvdGFsICs9IGRvbmU7CisJCQl9CisJCX0KKyAgCX0KKworCS8qCisJICoJQWxsIGRvbmUuICBXcml0ZSB0aGUgdXBkYXRlZCBjb250cm9sIGJsb2NrIGJhY2sgdG8gdGhlIGNhbGxlci4KKwkgKi8KKwlpZmMuaWZjX2xlbiA9IHRvdGFsOworCisJLyoKKwkgKiAJQm90aCBCU0QgYW5kIFNvbGFyaXMgcmV0dXJuIDAgaGVyZSwgc28gd2UgZG8gdG9vLgorCSAqLworCXJldHVybiBjb3B5X3RvX3VzZXIoYXJnLCAmaWZjLCBzaXplb2Yoc3RydWN0IGlmY29uZikpID8gLUVGQVVMVCA6IDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworLyoKKyAqCVRoaXMgaXMgaW52b2tlZCBieSB0aGUgL3Byb2MgZmlsZXN5c3RlbSBoYW5kbGVyIHRvIGRpc3BsYXkgYSBkZXZpY2UKKyAqCWluIGRldGFpbC4KKyAqLworc3RhdGljIF9faW5saW5lX18gc3RydWN0IG5ldF9kZXZpY2UgKmRldl9nZXRfaWR4KGxvZmZfdCBwb3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlsb2ZmX3QgaTsKKworCWZvciAoaSA9IDAsIGRldiA9IGRldl9iYXNlOyBkZXYgJiYgaSA8IHBvczsgKytpLCBkZXYgPSBkZXYtPm5leHQpOworCisJcmV0dXJuIGkgPT0gcG9zID8gZGV2IDogTlVMTDsKK30KKwordm9pZCAqZGV2X3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKwlyZXR1cm4gKnBvcyA/IGRldl9nZXRfaWR4KCpwb3MgLSAxKSA6IFNFUV9TVEFSVF9UT0tFTjsKK30KKwordm9pZCAqZGV2X3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwkrKypwb3M7CisJcmV0dXJuIHYgPT0gU0VRX1NUQVJUX1RPS0VOID8gZGV2X2Jhc2UgOiAoKHN0cnVjdCBuZXRfZGV2aWNlICopdiktPm5leHQ7Cit9CisKK3ZvaWQgZGV2X3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgZGV2X3NlcV9wcmludGZfc3RhdHMoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKGRldi0+Z2V0X3N0YXRzKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGRldi0+Z2V0X3N0YXRzKGRldik7CisKKwkJc2VxX3ByaW50ZihzZXEsICIlNnM6JThsdSAlN2x1ICU0bHUgJTRsdSAlNGx1ICU1bHUgJTEwbHUgJTlsdSAiCisJCQkJIiU4bHUgJTdsdSAlNGx1ICU0bHUgJTRsdSAlNWx1ICU3bHUgJTEwbHVcbiIsCisJCQkgICBkZXYtPm5hbWUsIHN0YXRzLT5yeF9ieXRlcywgc3RhdHMtPnJ4X3BhY2tldHMsCisJCQkgICBzdGF0cy0+cnhfZXJyb3JzLAorCQkJICAgc3RhdHMtPnJ4X2Ryb3BwZWQgKyBzdGF0cy0+cnhfbWlzc2VkX2Vycm9ycywKKwkJCSAgIHN0YXRzLT5yeF9maWZvX2Vycm9ycywKKwkJCSAgIHN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzICsgc3RhdHMtPnJ4X292ZXJfZXJyb3JzICsKKwkJCSAgICAgc3RhdHMtPnJ4X2NyY19lcnJvcnMgKyBzdGF0cy0+cnhfZnJhbWVfZXJyb3JzLAorCQkJICAgc3RhdHMtPnJ4X2NvbXByZXNzZWQsIHN0YXRzLT5tdWx0aWNhc3QsCisJCQkgICBzdGF0cy0+dHhfYnl0ZXMsIHN0YXRzLT50eF9wYWNrZXRzLAorCQkJICAgc3RhdHMtPnR4X2Vycm9ycywgc3RhdHMtPnR4X2Ryb3BwZWQsCisJCQkgICBzdGF0cy0+dHhfZmlmb19lcnJvcnMsIHN0YXRzLT5jb2xsaXNpb25zLAorCQkJICAgc3RhdHMtPnR4X2NhcnJpZXJfZXJyb3JzICsKKwkJCSAgICAgc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzICsKKwkJCSAgICAgc3RhdHMtPnR4X3dpbmRvd19lcnJvcnMgKworCQkJICAgICBzdGF0cy0+dHhfaGVhcnRiZWF0X2Vycm9ycywKKwkJCSAgIHN0YXRzLT50eF9jb21wcmVzc2VkKTsKKwl9IGVsc2UKKwkJc2VxX3ByaW50ZihzZXEsICIlNnM6IE5vIHN0YXRpc3RpY3MgYXZhaWxhYmxlLlxuIiwgZGV2LT5uYW1lKTsKK30KKworLyoKKyAqCUNhbGxlZCBmcm9tIHRoZSBQUk9DZnMgbW9kdWxlLiBUaGlzIG5vdyB1c2VzIHRoZSBuZXcgYXJiaXRyYXJ5IHNpemVkCisgKgkvcHJvYy9uZXQgaW50ZXJmYWNlIHRvIGNyZWF0ZSAvcHJvYy9uZXQvZGV2CisgKi8KK3N0YXRpYyBpbnQgZGV2X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKKwkJc2VxX3B1dHMoc2VxLCAiSW50ZXItfCAgIFJlY2VpdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgorCQkJICAgICAgIiAgICAgICAgICAgICAgICAgICAgfCAgVHJhbnNtaXRcbiIKKwkJCSAgICAgICIgZmFjZSB8Ynl0ZXMgICAgcGFja2V0cyBlcnJzIGRyb3AgZmlmbyBmcmFtZSAiCisJCQkgICAgICAiY29tcHJlc3NlZCBtdWx0aWNhc3R8Ynl0ZXMgICAgcGFja2V0cyBlcnJzICIKKwkJCSAgICAgICJkcm9wIGZpZm8gY29sbHMgY2FycmllciBjb21wcmVzc2VkXG4iKTsKKwllbHNlCisJCWRldl9zZXFfcHJpbnRmX3N0YXRzKHNlcSwgdik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0aWZfcnhfc3RhdHMgKnNvZnRuZXRfZ2V0X29ubGluZShsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgbmV0aWZfcnhfc3RhdHMgKnJjID0gTlVMTDsKKworCXdoaWxlICgqcG9zIDwgTlJfQ1BVUykKKwkgICAgICAgCWlmIChjcHVfb25saW5lKCpwb3MpKSB7CisJCQlyYyA9ICZwZXJfY3B1KG5ldGRldl9yeF9zdGF0LCAqcG9zKTsKKwkJCWJyZWFrOworCQl9IGVsc2UKKwkJCSsrKnBvczsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkICpzb2Z0bmV0X3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJcmV0dXJuIHNvZnRuZXRfZ2V0X29ubGluZShwb3MpOworfQorCitzdGF0aWMgdm9pZCAqc29mdG5ldF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJKysqcG9zOworCXJldHVybiBzb2Z0bmV0X2dldF9vbmxpbmUocG9zKTsKK30KKworc3RhdGljIHZvaWQgc29mdG5ldF9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKK30KKworc3RhdGljIGludCBzb2Z0bmV0X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBuZXRpZl9yeF9zdGF0cyAqcyA9IHY7CisKKwlzZXFfcHJpbnRmKHNlcSwgIiUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLAorCQkgICBzLT50b3RhbCwgcy0+ZHJvcHBlZCwgcy0+dGltZV9zcXVlZXplLCBzLT50aHJvdHRsZWQsCisJCSAgIHMtPmZhc3Ryb3V0ZV9oaXQsIHMtPmZhc3Ryb3V0ZV9zdWNjZXNzLCBzLT5mYXN0cm91dGVfZGVmZXIsCisJCSAgIHMtPmZhc3Ryb3V0ZV9kZWZlcnJlZF9vdXQsCisjaWYgMAorCQkgICBzLT5mYXN0cm91dGVfbGF0ZW5jeV9yZWR1Y3Rpb24KKyNlbHNlCisJCSAgIHMtPmNwdV9jb2xsaXNpb24KKyNlbmRpZgorCQkgICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZGV2X3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gZGV2X3NlcV9zdGFydCwKKwkubmV4dCAgPSBkZXZfc2VxX25leHQsCisJLnN0b3AgID0gZGV2X3NlcV9zdG9wLAorCS5zaG93ICA9IGRldl9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgZGV2X3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmZGV2X3NlcV9vcHMpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZXZfc2VxX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gZGV2X3NlcV9vcGVuLAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgc29mdG5ldF9zZXFfb3BzID0geworCS5zdGFydCA9IHNvZnRuZXRfc2VxX3N0YXJ0LAorCS5uZXh0ICA9IHNvZnRuZXRfc2VxX25leHQsCisJLnN0b3AgID0gc29mdG5ldF9zZXFfc3RvcCwKKwkuc2hvdyAgPSBzb2Z0bmV0X3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBzb2Z0bmV0X3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmc29mdG5ldF9zZXFfb3BzKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc29mdG5ldF9zZXFfZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgPSBzb2Z0bmV0X3NlcV9vcGVuLAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKKyNpZmRlZiBXSVJFTEVTU19FWFQKK2V4dGVybiBpbnQgd2lyZWxlc3NfcHJvY19pbml0KHZvaWQpOworI2Vsc2UKKyNkZWZpbmUgd2lyZWxlc3NfcHJvY19pbml0KCkgMAorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IGRldl9wcm9jX2luaXQodm9pZCkKK3sKKwlpbnQgcmMgPSAtRU5PTUVNOworCisJaWYgKCFwcm9jX25ldF9mb3BzX2NyZWF0ZSgiZGV2IiwgU19JUlVHTywgJmRldl9zZXFfZm9wcykpCisJCWdvdG8gb3V0OworCWlmICghcHJvY19uZXRfZm9wc19jcmVhdGUoInNvZnRuZXRfc3RhdCIsIFNfSVJVR08sICZzb2Z0bmV0X3NlcV9mb3BzKSkKKwkJZ290byBvdXRfZGV2OworCWlmICh3aXJlbGVzc19wcm9jX2luaXQoKSkKKwkJZ290byBvdXRfc29mdG5ldDsKKwlyYyA9IDA7CitvdXQ6CisJcmV0dXJuIHJjOworb3V0X3NvZnRuZXQ6CisJcHJvY19uZXRfcmVtb3ZlKCJzb2Z0bmV0X3N0YXQiKTsKK291dF9kZXY6CisJcHJvY19uZXRfcmVtb3ZlKCJkZXYiKTsKKwlnb3RvIG91dDsKK30KKyNlbHNlCisjZGVmaW5lIGRldl9wcm9jX2luaXQoKSAwCisjZW5kaWYJLyogQ09ORklHX1BST0NfRlMgKi8KKworCisvKioKKyAqCW5ldGRldl9zZXRfbWFzdGVyCS0Jc2V0IHVwIG1hc3Rlci9zbGF2ZSBwYWlyCisgKglAc2xhdmU6IHNsYXZlIGRldmljZQorICoJQG1hc3RlcjogbmV3IG1hc3RlciBkZXZpY2UKKyAqCisgKglDaGFuZ2VzIHRoZSBtYXN0ZXIgZGV2aWNlIG9mIHRoZSBzbGF2ZS4gUGFzcyAlTlVMTCB0byBicmVhayB0aGUKKyAqCWJvbmRpbmcuIFRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZSBSVE5MIHNlbWFwaG9yZS4gT24gYSBmYWlsdXJlCisgKglhIG5lZ2F0aXZlIGVycm5vIGNvZGUgaXMgcmV0dXJuZWQuIE9uIHN1Y2Nlc3MgdGhlIHJlZmVyZW5jZSBjb3VudHMKKyAqCWFyZSBhZGp1c3RlZCwgJVJUTV9ORVdMSU5LIGlzIHNlbnQgdG8gdGhlIHJvdXRpbmcgc29ja2V0IGFuZCB0aGUKKyAqCWZ1bmN0aW9uIHJldHVybnMgemVyby4KKyAqLworaW50IG5ldGRldl9zZXRfbWFzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZSwgc3RydWN0IG5ldF9kZXZpY2UgKm1hc3RlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqb2xkID0gc2xhdmUtPm1hc3RlcjsKKworCUFTU0VSVF9SVE5MKCk7CisKKwlpZiAobWFzdGVyKSB7CisJCWlmIChvbGQpCisJCQlyZXR1cm4gLUVCVVNZOworCQlkZXZfaG9sZChtYXN0ZXIpOworCX0KKworCXNsYXZlLT5tYXN0ZXIgPSBtYXN0ZXI7CisJCisJc3luY2hyb25pemVfbmV0KCk7CisKKwlpZiAob2xkKQorCQlkZXZfcHV0KG9sZCk7CisKKwlpZiAobWFzdGVyKQorCQlzbGF2ZS0+ZmxhZ3MgfD0gSUZGX1NMQVZFOworCWVsc2UKKwkJc2xhdmUtPmZsYWdzICY9IH5JRkZfU0xBVkU7CisKKwlydG1zZ19pZmluZm8oUlRNX05FV0xJTkssIHNsYXZlLCBJRkZfU0xBVkUpOworCXJldHVybiAwOworfQorCisvKioKKyAqCWRldl9zZXRfcHJvbWlzY3VpdHkJLSB1cGRhdGUgcHJvbWlzY3VpdHkgY291bnQgb24gYSBkZXZpY2UKKyAqCUBkZXY6IGRldmljZQorICoJQGluYzogbW9kaWZpZXIKKyAqCisgKglBZGQgb3IgcmVtb3ZlIHByb21zaWN1aXR5IGZyb20gYSBkZXZpY2UuIFdoaWxlIHRoZSBjb3VudCBpbiB0aGUgZGV2aWNlCisgKglyZW1haW5zIGFib3ZlIHplcm8gdGhlIGludGVyZmFjZSByZW1haW5zIHByb21pc2N1b3VzLiBPbmNlIGl0IGhpdHMgemVybworICoJdGhlIGRldmljZSByZXZlcnRzIGJhY2sgdG8gbm9ybWFsIGZpbHRlcmluZyBvcGVyYXRpb24uIEEgbmVnYXRpdmUgaW5jCisgKgl2YWx1ZSBpcyB1c2VkIHRvIGRyb3AgcHJvbWlzY3VpdHkgb24gdGhlIGRldmljZS4KKyAqLwordm9pZCBkZXZfc2V0X3Byb21pc2N1aXR5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbmMpCit7CisJdW5zaWduZWQgc2hvcnQgb2xkX2ZsYWdzID0gZGV2LT5mbGFnczsKKworCWRldi0+ZmxhZ3MgfD0gSUZGX1BST01JU0M7CisJaWYgKChkZXYtPnByb21pc2N1aXR5ICs9IGluYykgPT0gMCkKKwkJZGV2LT5mbGFncyAmPSB+SUZGX1BST01JU0M7CisJaWYgKGRldi0+ZmxhZ3MgXiBvbGRfZmxhZ3MpIHsKKwkJZGV2X21jX3VwbG9hZChkZXYpOworCQlwcmludGsoS0VSTl9JTkZPICJkZXZpY2UgJXMgJXMgcHJvbWlzY3VvdXMgbW9kZVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgPyAiZW50ZXJlZCIgOgorCQkgICAgICAgCQkJCQkgICAgICAgImxlZnQiKTsKKwl9Cit9CisKKy8qKgorICoJZGV2X3NldF9hbGxtdWx0aQktIHVwZGF0ZSBhbGxtdWx0aSBjb3VudCBvbiBhIGRldmljZQorICoJQGRldjogZGV2aWNlCisgKglAaW5jOiBtb2RpZmllcgorICoKKyAqCUFkZCBvciByZW1vdmUgcmVjZXB0aW9uIG9mIGFsbCBtdWx0aWNhc3QgZnJhbWVzIHRvIGEgZGV2aWNlLiBXaGlsZSB0aGUKKyAqCWNvdW50IGluIHRoZSBkZXZpY2UgcmVtYWlucyBhYm92ZSB6ZXJvIHRoZSBpbnRlcmZhY2UgcmVtYWlucyBsaXN0ZW5pbmcKKyAqCXRvIGFsbCBpbnRlcmZhY2VzLiBPbmNlIGl0IGhpdHMgemVybyB0aGUgZGV2aWNlIHJldmVydHMgYmFjayB0byBub3JtYWwKKyAqCWZpbHRlcmluZyBvcGVyYXRpb24uIEEgbmVnYXRpdmUgQGluYyB2YWx1ZSBpcyB1c2VkIHRvIGRyb3AgdGhlIGNvdW50ZXIKKyAqCXdoZW4gcmVsZWFzaW5nIGEgcmVzb3VyY2UgbmVlZGluZyBhbGwgbXVsdGljYXN0cy4KKyAqLworCit2b2lkIGRldl9zZXRfYWxsbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGluYykKK3sKKwl1bnNpZ25lZCBzaG9ydCBvbGRfZmxhZ3MgPSBkZXYtPmZsYWdzOworCisJZGV2LT5mbGFncyB8PSBJRkZfQUxMTVVMVEk7CisJaWYgKChkZXYtPmFsbG11bHRpICs9IGluYykgPT0gMCkKKwkJZGV2LT5mbGFncyAmPSB+SUZGX0FMTE1VTFRJOworCWlmIChkZXYtPmZsYWdzIF4gb2xkX2ZsYWdzKQorCQlkZXZfbWNfdXBsb2FkKGRldik7Cit9CisKK3Vuc2lnbmVkIGRldl9nZXRfZmxhZ3MoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBmbGFnczsKKworCWZsYWdzID0gKGRldi0+ZmxhZ3MgJiB+KElGRl9QUk9NSVNDIHwKKwkJCQlJRkZfQUxMTVVMVEkgfAorCQkJCUlGRl9SVU5OSU5HKSkgfCAKKwkJKGRldi0+Z2ZsYWdzICYgKElGRl9QUk9NSVNDIHwKKwkJCQlJRkZfQUxMTVVMVEkpKTsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikgJiYgbmV0aWZfY2Fycmllcl9vayhkZXYpKQorCQlmbGFncyB8PSBJRkZfUlVOTklORzsKKworCXJldHVybiBmbGFnczsKK30KKworaW50IGRldl9jaGFuZ2VfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgZmxhZ3MpCit7CisJaW50IHJldDsKKwlpbnQgb2xkX2ZsYWdzID0gZGV2LT5mbGFnczsKKworCS8qCisJICoJU2V0IHRoZSBmbGFncyBvbiBvdXIgZGV2aWNlLgorCSAqLworCisJZGV2LT5mbGFncyA9IChmbGFncyAmIChJRkZfREVCVUcgfCBJRkZfTk9UUkFJTEVSUyB8IElGRl9OT0FSUCB8CisJCQkgICAgICAgSUZGX0RZTkFNSUMgfCBJRkZfTVVMVElDQVNUIHwgSUZGX1BPUlRTRUwgfAorCQkJICAgICAgIElGRl9BVVRPTUVESUEpKSB8CisJCSAgICAgKGRldi0+ZmxhZ3MgJiAoSUZGX1VQIHwgSUZGX1ZPTEFUSUxFIHwgSUZGX1BST01JU0MgfAorCQkJCSAgICBJRkZfQUxMTVVMVEkpKTsKKworCS8qCisJICoJTG9hZCBpbiB0aGUgY29ycmVjdCBtdWx0aWNhc3QgbGlzdCBub3cgdGhlIGZsYWdzIGhhdmUgY2hhbmdlZC4KKwkgKi8KKworCWRldl9tY191cGxvYWQoZGV2KTsKKworCS8qCisJICoJSGF2ZSB3ZSBkb3duZWQgdGhlIGludGVyZmFjZS4gV2UgaGFuZGxlIElGRl9VUCBvdXJzZWx2ZXMKKwkgKglhY2NvcmRpbmcgdG8gdXNlciBhdHRlbXB0cyB0byBzZXQgaXQsIHJhdGhlciB0aGFuIGJsaW5kbHkKKwkgKglzZXR0aW5nIGl0LgorCSAqLworCisJcmV0ID0gMDsKKwlpZiAoKG9sZF9mbGFncyBeIGZsYWdzKSAmIElGRl9VUCkgewkvKiBCaXQgaXMgZGlmZmVyZW50ICA/ICovCisJCXJldCA9ICgob2xkX2ZsYWdzICYgSUZGX1VQKSA/IGRldl9jbG9zZSA6IGRldl9vcGVuKShkZXYpOworCisJCWlmICghcmV0KQorCQkJZGV2X21jX3VwbG9hZChkZXYpOworCX0KKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQICYmCisJICAgICgob2xkX2ZsYWdzIF4gZGV2LT5mbGFncykgJn4gKElGRl9VUCB8IElGRl9QUk9NSVNDIHwgSUZGX0FMTE1VTFRJIHwKKwkJCQkJICBJRkZfVk9MQVRJTEUpKSkKKwkJbm90aWZpZXJfY2FsbF9jaGFpbigmbmV0ZGV2X2NoYWluLCBORVRERVZfQ0hBTkdFLCBkZXYpOworCisJaWYgKChmbGFncyBeIGRldi0+Z2ZsYWdzKSAmIElGRl9QUk9NSVNDKSB7CisJCWludCBpbmMgPSAoZmxhZ3MgJiBJRkZfUFJPTUlTQykgPyArMSA6IC0xOworCQlkZXYtPmdmbGFncyBePSBJRkZfUFJPTUlTQzsKKwkJZGV2X3NldF9wcm9taXNjdWl0eShkZXYsIGluYyk7CisJfQorCisJLyogTk9URTogb3JkZXIgb2Ygc3luY2hyb25pemF0aW9uIG9mIElGRl9QUk9NSVNDIGFuZCBJRkZfQUxMTVVMVEkKKwkgICBpcyBpbXBvcnRhbnQuIFNvbWUgKGJyb2tlbikgZHJpdmVycyBzZXQgSUZGX1BST01JU0MsIHdoZW4KKwkgICBJRkZfQUxMTVVMVEkgaXMgcmVxdWVzdGVkIG5vdCBhc2tpbmcgdXMgYW5kIG5vdCByZXBvcnRpbmcuCisJICovCisJaWYgKChmbGFncyBeIGRldi0+Z2ZsYWdzKSAmIElGRl9BTExNVUxUSSkgeworCQlpbnQgaW5jID0gKGZsYWdzICYgSUZGX0FMTE1VTFRJKSA/ICsxIDogLTE7CisJCWRldi0+Z2ZsYWdzIF49IElGRl9BTExNVUxUSTsKKwkJZGV2X3NldF9hbGxtdWx0aShkZXYsIGluYyk7CisJfQorCisJaWYgKG9sZF9mbGFncyBeIGRldi0+ZmxhZ3MpCisJCXJ0bXNnX2lmaW5mbyhSVE1fTkVXTElOSywgZGV2LCBvbGRfZmxhZ3MgXiBkZXYtPmZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBkZXZfc2V0X210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlpbnQgZXJyOworCisJaWYgKG5ld19tdHUgPT0gZGV2LT5tdHUpCisJCXJldHVybiAwOworCisJLyoJTVRVIG11c3QgYmUgcG9zaXRpdmUuCSAqLworCWlmIChuZXdfbXR1IDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJCXJldHVybiAtRU5PREVWOworCisJZXJyID0gMDsKKwlpZiAoZGV2LT5jaGFuZ2VfbXR1KQorCQllcnIgPSBkZXYtPmNoYW5nZV9tdHUoZGV2LCBuZXdfbXR1KTsKKwllbHNlCisJCWRldi0+bXR1ID0gbmV3X210dTsKKwlpZiAoIWVyciAmJiBkZXYtPmZsYWdzICYgSUZGX1VQKQorCQlub3RpZmllcl9jYWxsX2NoYWluKCZuZXRkZXZfY2hhaW4sCisJCQkJICAgIE5FVERFVl9DSEFOR0VNVFUsIGRldik7CisJcmV0dXJuIGVycjsKK30KKworaW50IGRldl9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNvY2thZGRyICpzYSkKK3sKKwlpbnQgZXJyOworCisJaWYgKCFkZXYtPnNldF9tYWNfYWRkcmVzcykKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmIChzYS0+c2FfZmFtaWx5ICE9IGRldi0+dHlwZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwllcnIgPSBkZXYtPnNldF9tYWNfYWRkcmVzcyhkZXYsIHNhKTsKKwlpZiAoIWVycikKKwkJbm90aWZpZXJfY2FsbF9jaGFpbigmbmV0ZGV2X2NoYWluLCBORVRERVZfQ0hBTkdFQUREUiwgZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJUGVyZm9ybSB0aGUgU0lPQ3hJRnh4eCBjYWxscy4KKyAqLworc3RhdGljIGludCBkZXZfaWZzaW9jKHN0cnVjdCBpZnJlcSAqaWZyLCB1bnNpZ25lZCBpbnQgY21kKQoreworCWludCBlcnI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IF9fZGV2X2dldF9ieV9uYW1lKGlmci0+aWZyX25hbWUpOworCisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBTSU9DR0lGRkxBR1M6CS8qIEdldCBpbnRlcmZhY2UgZmxhZ3MgKi8KKwkJCWlmci0+aWZyX2ZsYWdzID0gZGV2X2dldF9mbGFncyhkZXYpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTSU9DU0lGRkxBR1M6CS8qIFNldCBpbnRlcmZhY2UgZmxhZ3MgKi8KKwkJCXJldHVybiBkZXZfY2hhbmdlX2ZsYWdzKGRldiwgaWZyLT5pZnJfZmxhZ3MpOworCisJCWNhc2UgU0lPQ0dJRk1FVFJJQzoJLyogR2V0IHRoZSBtZXRyaWMgb24gdGhlIGludGVyZmFjZQorCQkJCQkgICAoY3VycmVudGx5IHVudXNlZCkgKi8KKwkJCWlmci0+aWZyX21ldHJpYyA9IDA7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNJT0NTSUZNRVRSSUM6CS8qIFNldCB0aGUgbWV0cmljIG9uIHRoZSBpbnRlcmZhY2UKKwkJCQkJICAgKGN1cnJlbnRseSB1bnVzZWQpICovCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkJY2FzZSBTSU9DR0lGTVRVOgkvKiBHZXQgdGhlIE1UVSBvZiBhIGRldmljZSAqLworCQkJaWZyLT5pZnJfbXR1ID0gZGV2LT5tdHU7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNJT0NTSUZNVFU6CS8qIFNldCB0aGUgTVRVIG9mIGEgZGV2aWNlICovCisJCQlyZXR1cm4gZGV2X3NldF9tdHUoZGV2LCBpZnItPmlmcl9tdHUpOworCisJCWNhc2UgU0lPQ0dJRkhXQUREUjoKKwkJCWlmICghZGV2LT5hZGRyX2xlbikKKwkJCQltZW1zZXQoaWZyLT5pZnJfaHdhZGRyLnNhX2RhdGEsIDAsIHNpemVvZiBpZnItPmlmcl9od2FkZHIuc2FfZGF0YSk7CisJCQllbHNlCisJCQkJbWVtY3B5KGlmci0+aWZyX2h3YWRkci5zYV9kYXRhLCBkZXYtPmRldl9hZGRyLAorCQkJCSAgICAgICBtaW4oc2l6ZW9mIGlmci0+aWZyX2h3YWRkci5zYV9kYXRhLCAoc2l6ZV90KSBkZXYtPmFkZHJfbGVuKSk7CisJCQlpZnItPmlmcl9od2FkZHIuc2FfZmFtaWx5ID0gZGV2LT50eXBlOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTSU9DU0lGSFdBRERSOgorCQkJcmV0dXJuIGRldl9zZXRfbWFjX2FkZHJlc3MoZGV2LCAmaWZyLT5pZnJfaHdhZGRyKTsKKworCQljYXNlIFNJT0NTSUZIV0JST0FEQ0FTVDoKKwkJCWlmIChpZnItPmlmcl9od2FkZHIuc2FfZmFtaWx5ICE9IGRldi0+dHlwZSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCW1lbWNweShkZXYtPmJyb2FkY2FzdCwgaWZyLT5pZnJfaHdhZGRyLnNhX2RhdGEsCisJCQkgICAgICAgbWluKHNpemVvZiBpZnItPmlmcl9od2FkZHIuc2FfZGF0YSwgKHNpemVfdCkgZGV2LT5hZGRyX2xlbikpOworCQkJbm90aWZpZXJfY2FsbF9jaGFpbigmbmV0ZGV2X2NoYWluLAorCQkJCQkgICAgTkVUREVWX0NIQU5HRUFERFIsIGRldik7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNJT0NHSUZNQVA6CisJCQlpZnItPmlmcl9tYXAubWVtX3N0YXJ0ID0gZGV2LT5tZW1fc3RhcnQ7CisJCQlpZnItPmlmcl9tYXAubWVtX2VuZCAgID0gZGV2LT5tZW1fZW5kOworCQkJaWZyLT5pZnJfbWFwLmJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOworCQkJaWZyLT5pZnJfbWFwLmlycSAgICAgICA9IGRldi0+aXJxOworCQkJaWZyLT5pZnJfbWFwLmRtYSAgICAgICA9IGRldi0+ZG1hOworCQkJaWZyLT5pZnJfbWFwLnBvcnQgICAgICA9IGRldi0+aWZfcG9ydDsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU0lPQ1NJRk1BUDoKKwkJCWlmIChkZXYtPnNldF9jb25maWcpIHsKKwkJCQlpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJCQkJCXJldHVybiAtRU5PREVWOworCQkJCXJldHVybiBkZXYtPnNldF9jb25maWcoZGV2LCAmaWZyLT5pZnJfbWFwKTsKKwkJCX0KKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCQljYXNlIFNJT0NBRERNVUxUSToKKwkJCWlmICghZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgfHwKKwkJCSAgICBpZnItPmlmcl9od2FkZHIuc2FfZmFtaWx5ICE9IEFGX1VOU1BFQykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmICghbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCXJldHVybiBkZXZfbWNfYWRkKGRldiwgaWZyLT5pZnJfaHdhZGRyLnNhX2RhdGEsCisJCQkJCSAgZGV2LT5hZGRyX2xlbiwgMSk7CisKKwkJY2FzZSBTSU9DREVMTVVMVEk6CisJCQlpZiAoIWRldi0+c2V0X211bHRpY2FzdF9saXN0IHx8CisJCQkgICAgaWZyLT5pZnJfaHdhZGRyLnNhX2ZhbWlseSAhPSBBRl9VTlNQRUMpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQlyZXR1cm4gZGV2X21jX2RlbGV0ZShkZXYsIGlmci0+aWZyX2h3YWRkci5zYV9kYXRhLAorCQkJCQkgICAgIGRldi0+YWRkcl9sZW4sIDEpOworCisJCWNhc2UgU0lPQ0dJRklOREVYOgorCQkJaWZyLT5pZnJfaWZpbmRleCA9IGRldi0+aWZpbmRleDsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU0lPQ0dJRlRYUUxFTjoKKwkJCWlmci0+aWZyX3FsZW4gPSBkZXYtPnR4X3F1ZXVlX2xlbjsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU0lPQ1NJRlRYUUxFTjoKKwkJCWlmIChpZnItPmlmcl9xbGVuIDwgMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWRldi0+dHhfcXVldWVfbGVuID0gaWZyLT5pZnJfcWxlbjsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU0lPQ1NJRk5BTUU6CisJCQlpZnItPmlmcl9uZXduYW1lW0lGTkFNU0laLTFdID0gJ1wwJzsKKwkJCXJldHVybiBkZXZfY2hhbmdlX25hbWUoZGV2LCBpZnItPmlmcl9uZXduYW1lKTsKKworCQkvKgorCQkgKglVbmtub3duIG9yIHByaXZhdGUgaW9jdGwKKwkJICovCisKKwkJZGVmYXVsdDoKKwkJCWlmICgoY21kID49IFNJT0NERVZQUklWQVRFICYmCisJCQkgICAgY21kIDw9IFNJT0NERVZQUklWQVRFICsgMTUpIHx8CisJCQkgICAgY21kID09IFNJT0NCT05ERU5TTEFWRSB8fAorCQkJICAgIGNtZCA9PSBTSU9DQk9ORFJFTEVBU0UgfHwKKwkJCSAgICBjbWQgPT0gU0lPQ0JPTkRTRVRIV0FERFIgfHwKKwkJCSAgICBjbWQgPT0gU0lPQ0JPTkRTTEFWRUlORk9RVUVSWSB8fAorCQkJICAgIGNtZCA9PSBTSU9DQk9ORElORk9RVUVSWSB8fAorCQkJICAgIGNtZCA9PSBTSU9DQk9ORENIQU5HRUFDVElWRSB8fAorCQkJICAgIGNtZCA9PSBTSU9DR01JSVBIWSB8fAorCQkJICAgIGNtZCA9PSBTSU9DR01JSVJFRyB8fAorCQkJICAgIGNtZCA9PSBTSU9DU01JSVJFRyB8fAorCQkJICAgIGNtZCA9PSBTSU9DQlJBRERJRiB8fAorCQkJICAgIGNtZCA9PSBTSU9DQlJERUxJRiB8fAorCQkJICAgIGNtZCA9PSBTSU9DV0FOREVWKSB7CisJCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCQkJaWYgKGRldi0+ZG9faW9jdGwpIHsKKwkJCQkJaWYgKG5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJCQkJCQllcnIgPSBkZXYtPmRvX2lvY3RsKGRldiwgaWZyLAorCQkJCQkJCQkgICAgY21kKTsKKwkJCQkJZWxzZQorCQkJCQkJZXJyID0gLUVOT0RFVjsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQllcnIgPSAtRUlOVkFMOworCisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgYWxsICJpbnRlcmZhY2UiLXR5cGUgSS9PIGNvbnRyb2wgcmVxdWVzdHMuIFRoZSBhY3R1YWwKKyAqCSdkb2luZycgcGFydCBvZiB0aGlzIGlzIGRldl9pZnNpb2MgYWJvdmUuCisgKi8KKworLyoqCisgKglkZXZfaW9jdGwJLQluZXR3b3JrIGRldmljZSBpb2N0bAorICoJQGNtZDogY29tbWFuZCB0byBpc3N1ZQorICoJQGFyZzogcG9pbnRlciB0byBhIHN0cnVjdCBpZnJlcSBpbiB1c2VyIHNwYWNlCisgKgorICoJSXNzdWUgaW9jdGwgZnVuY3Rpb25zIHRvIGRldmljZXMuIFRoaXMgaXMgbm9ybWFsbHkgY2FsbGVkIGJ5IHRoZQorICoJdXNlciBzcGFjZSBzeXNjYWxsIGludGVyZmFjZXMgYnV0IGNhbiBzb21ldGltZXMgYmUgdXNlZnVsIGZvcgorICoJb3RoZXIgcHVycG9zZXMuIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHJldHVybiBmcm9tIHRoZSBzeXNjYWxsIGlmCisgKglwb3NpdGl2ZSBvciBhIG5lZ2F0aXZlIGVycm5vIGNvZGUgb24gZXJyb3IuCisgKi8KKworaW50IGRldl9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IHJldDsKKwljaGFyICpjb2xvbjsKKworCS8qIE9uZSBzcGVjaWFsIGNhc2U6IFNJT0NHSUZDT05GIHRha2VzIGlmY29uZiBhcmd1bWVudAorCSAgIGFuZCByZXF1aXJlcyBzaGFyZWQgbG9jaywgYmVjYXVzZSBpdCBzbGVlcHMgd3JpdGluZworCSAgIHRvIHVzZXIgc3BhY2UuCisJICovCisKKwlpZiAoY21kID09IFNJT0NHSUZDT05GKSB7CisJCXJ0bmxfc2hsb2NrKCk7CisJCXJldCA9IGRldl9pZmNvbmYoKGNoYXIgX191c2VyICopIGFyZyk7CisJCXJ0bmxfc2h1bmxvY2soKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKGNtZCA9PSBTSU9DR0lGTkFNRSkKKwkJcmV0dXJuIGRldl9pZm5hbWUoKHN0cnVjdCBpZnJlcSBfX3VzZXIgKilhcmcpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZpZnIsIGFyZywgc2l6ZW9mKHN0cnVjdCBpZnJlcSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmci5pZnJfbmFtZVtJRk5BTVNJWi0xXSA9IDA7CisKKwljb2xvbiA9IHN0cmNocihpZnIuaWZyX25hbWUsICc6Jyk7CisJaWYgKGNvbG9uKQorCQkqY29sb24gPSAwOworCisJLyoKKwkgKglTZWUgd2hpY2ggaW50ZXJmYWNlIHRoZSBjYWxsZXIgaXMgdGFsa2luZyBhYm91dC4KKwkgKi8KKworCXN3aXRjaCAoY21kKSB7CisJCS8qCisJCSAqCVRoZXNlIGlvY3RsIGNhbGxzOgorCQkgKgktIGNhbiBiZSBkb25lIGJ5IGFsbC4KKwkJICoJLSBhdG9taWMgYW5kIGRvIG5vdCByZXF1aXJlIGxvY2tpbmcuCisJCSAqCS0gcmV0dXJuIGEgdmFsdWUKKwkJICovCisJCWNhc2UgU0lPQ0dJRkZMQUdTOgorCQljYXNlIFNJT0NHSUZNRVRSSUM6CisJCWNhc2UgU0lPQ0dJRk1UVToKKwkJY2FzZSBTSU9DR0lGSFdBRERSOgorCQljYXNlIFNJT0NHSUZTTEFWRToKKwkJY2FzZSBTSU9DR0lGTUFQOgorCQljYXNlIFNJT0NHSUZJTkRFWDoKKwkJY2FzZSBTSU9DR0lGVFhRTEVOOgorCQkJZGV2X2xvYWQoaWZyLmlmcl9uYW1lKTsKKwkJCXJlYWRfbG9jaygmZGV2X2Jhc2VfbG9jayk7CisJCQlyZXQgPSBkZXZfaWZzaW9jKCZpZnIsIGNtZCk7CisJCQlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7CisJCQlpZiAoIXJldCkgeworCQkJCWlmIChjb2xvbikKKwkJCQkJKmNvbG9uID0gJzonOworCQkJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmaWZyLAorCQkJCQkJIHNpemVvZihzdHJ1Y3QgaWZyZXEpKSkKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCX0KKwkJCXJldHVybiByZXQ7CisKKwkJY2FzZSBTSU9DRVRIVE9PTDoKKwkJCWRldl9sb2FkKGlmci5pZnJfbmFtZSk7CisJCQlydG5sX2xvY2soKTsKKwkJCXJldCA9IGRldl9ldGh0b29sKCZpZnIpOworCQkJcnRubF91bmxvY2soKTsKKwkJCWlmICghcmV0KSB7CisJCQkJaWYgKGNvbG9uKQorCQkJCQkqY29sb24gPSAnOic7CisJCQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZpZnIsCisJCQkJCQkgc2l6ZW9mKHN0cnVjdCBpZnJlcSkpKQorCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJfQorCQkJcmV0dXJuIHJldDsKKworCQkvKgorCQkgKglUaGVzZSBpb2N0bCBjYWxsczoKKwkJICoJLSByZXF1aXJlIHN1cGVydXNlciBwb3dlci4KKwkJICoJLSByZXF1aXJlIHN0cmljdCBzZXJpYWxpemF0aW9uLgorCQkgKgktIHJldHVybiBhIHZhbHVlCisJCSAqLworCQljYXNlIFNJT0NHTUlJUEhZOgorCQljYXNlIFNJT0NHTUlJUkVHOgorCQljYXNlIFNJT0NTSUZOQU1FOgorCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJCXJldHVybiAtRVBFUk07CisJCQlkZXZfbG9hZChpZnIuaWZyX25hbWUpOworCQkJcnRubF9sb2NrKCk7CisJCQlyZXQgPSBkZXZfaWZzaW9jKCZpZnIsIGNtZCk7CisJCQlydG5sX3VubG9jaygpOworCQkJaWYgKCFyZXQpIHsKKwkJCQlpZiAoY29sb24pCisJCQkJCSpjb2xvbiA9ICc6JzsKKwkJCQlpZiAoY29weV90b191c2VyKGFyZywgJmlmciwKKwkJCQkJCSBzaXplb2Yoc3RydWN0IGlmcmVxKSkpCisJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQl9CisJCQlyZXR1cm4gcmV0OworCisJCS8qCisJCSAqCVRoZXNlIGlvY3RsIGNhbGxzOgorCQkgKgktIHJlcXVpcmUgc3VwZXJ1c2VyIHBvd2VyLgorCQkgKgktIHJlcXVpcmUgc3RyaWN0IHNlcmlhbGl6YXRpb24uCisJCSAqCS0gZG8gbm90IHJldHVybiBhIHZhbHVlCisJCSAqLworCQljYXNlIFNJT0NTSUZGTEFHUzoKKwkJY2FzZSBTSU9DU0lGTUVUUklDOgorCQljYXNlIFNJT0NTSUZNVFU6CisJCWNhc2UgU0lPQ1NJRk1BUDoKKwkJY2FzZSBTSU9DU0lGSFdBRERSOgorCQljYXNlIFNJT0NTSUZTTEFWRToKKwkJY2FzZSBTSU9DQURETVVMVEk6CisJCWNhc2UgU0lPQ0RFTE1VTFRJOgorCQljYXNlIFNJT0NTSUZIV0JST0FEQ0FTVDoKKwkJY2FzZSBTSU9DU0lGVFhRTEVOOgorCQljYXNlIFNJT0NTTUlJUkVHOgorCQljYXNlIFNJT0NCT05ERU5TTEFWRToKKwkJY2FzZSBTSU9DQk9ORFJFTEVBU0U6CisJCWNhc2UgU0lPQ0JPTkRTRVRIV0FERFI6CisJCWNhc2UgU0lPQ0JPTkRTTEFWRUlORk9RVUVSWToKKwkJY2FzZSBTSU9DQk9ORElORk9RVUVSWToKKwkJY2FzZSBTSU9DQk9ORENIQU5HRUFDVElWRToKKwkJY2FzZSBTSU9DQlJBRERJRjoKKwkJY2FzZSBTSU9DQlJERUxJRjoKKwkJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJZGV2X2xvYWQoaWZyLmlmcl9uYW1lKTsKKwkJCXJ0bmxfbG9jaygpOworCQkJcmV0ID0gZGV2X2lmc2lvYygmaWZyLCBjbWQpOworCQkJcnRubF91bmxvY2soKTsKKwkJCXJldHVybiByZXQ7CisKKwkJY2FzZSBTSU9DR0lGTUVNOgorCQkJLyogR2V0IHRoZSBwZXIgZGV2aWNlIG1lbW9yeSBzcGFjZS4gV2UgY2FuIGFkZCB0aGlzIGJ1dAorCQkJICogY3VycmVudGx5IGRvIG5vdCBzdXBwb3J0IGl0ICovCisJCWNhc2UgU0lPQ1NJRk1FTToKKwkJCS8qIFNldCB0aGUgcGVyIGRldmljZSBtZW1vcnkgYnVmZmVyIHNwYWNlLgorCQkJICogTm90IGFwcGxpY2FibGUgaW4gb3VyIGNhc2UgKi8KKwkJY2FzZSBTSU9DU0lGTElOSzoKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qCisJCSAqCVVua25vd24gb3IgcHJpdmF0ZSBpb2N0bC4KKwkJICovCisJCWRlZmF1bHQ6CisJCQlpZiAoY21kID09IFNJT0NXQU5ERVYgfHwKKwkJCSAgICAoY21kID49IFNJT0NERVZQUklWQVRFICYmCisJCQkgICAgIGNtZCA8PSBTSU9DREVWUFJJVkFURSArIDE1KSkgeworCQkJCWRldl9sb2FkKGlmci5pZnJfbmFtZSk7CisJCQkJcnRubF9sb2NrKCk7CisJCQkJcmV0ID0gZGV2X2lmc2lvYygmaWZyLCBjbWQpOworCQkJCXJ0bmxfdW5sb2NrKCk7CisJCQkJaWYgKCFyZXQgJiYgY29weV90b191c2VyKGFyZywgJmlmciwKKwkJCQkJCQkgc2l6ZW9mKHN0cnVjdCBpZnJlcSkpKQorCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCXJldHVybiByZXQ7CisJCQl9CisjaWZkZWYgV0lSRUxFU1NfRVhUCisJCQkvKiBUYWtlIGNhcmUgb2YgV2lyZWxlc3MgRXh0ZW5zaW9ucyAqLworCQkJaWYgKGNtZCA+PSBTSU9DSVdGSVJTVCAmJiBjbWQgPD0gU0lPQ0lXTEFTVCkgeworCQkJCS8qIElmIGNvbW1hbmQgaXMgYHNldCBhIHBhcmFtZXRlcicsIG9yCisJCQkJICogYGdldCB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycycsIGNoZWNrIGlmCisJCQkJICogdGhlIHVzZXIgaGFzIHRoZSByaWdodCB0byBkbyBpdCAqLworCQkJCWlmIChJV19JU19TRVQoY21kKSB8fCBjbWQgPT0gU0lPQ0dJV0VOQ09ERSkgeworCQkJCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQkJCQlyZXR1cm4gLUVQRVJNOworCQkJCX0KKwkJCQlkZXZfbG9hZChpZnIuaWZyX25hbWUpOworCQkJCXJ0bmxfbG9jaygpOworCQkJCS8qIEZvbGxvdyBtZSBpbiBuZXQvY29yZS93aXJlbGVzcy5jICovCisJCQkJcmV0ID0gd2lyZWxlc3NfcHJvY2Vzc19pb2N0bCgmaWZyLCBjbWQpOworCQkJCXJ0bmxfdW5sb2NrKCk7CisJCQkJaWYgKElXX0lTX0dFVChjbWQpICYmCisJCQkJICAgIGNvcHlfdG9fdXNlcihhcmcsICZpZnIsCisJCQkJCSAgICAJIHNpemVvZihzdHJ1Y3QgaWZyZXEpKSkKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCisKKy8qKgorICoJZGV2X25ld19pbmRleAktCWFsbG9jYXRlIGFuIGlmaW5kZXgKKyAqCisgKglSZXR1cm5zIGEgc3VpdGFibGUgdW5pcXVlIHZhbHVlIGZvciBhIG5ldyBkZXZpY2UgaW50ZXJmYWNlCisgKgludW1iZXIuICBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgcnRubCBzZW1hcGhvcmUgb3IgdGhlCisgKglkZXZfYmFzZV9sb2NrIHRvIGJlIHN1cmUgaXQgcmVtYWlucyB1bmlxdWUuCisgKi8KK3N0YXRpYyBpbnQgZGV2X25ld19pbmRleCh2b2lkKQoreworCXN0YXRpYyBpbnQgaWZpbmRleDsKKwlmb3IgKDs7KSB7CisJCWlmICgrK2lmaW5kZXggPD0gMCkKKwkJCWlmaW5kZXggPSAxOworCQlpZiAoIV9fZGV2X2dldF9ieV9pbmRleChpZmluZGV4KSkKKwkJCXJldHVybiBpZmluZGV4OworCX0KK30KKworc3RhdGljIGludCBkZXZfYm9vdF9waGFzZSA9IDE7CisKKy8qIERlbGF5ZWQgcmVnaXN0cmF0aW9uL3VucmVnaXN0ZXJhdGlvbiAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhuZXRfdG9kb19saXN0X2xvY2spOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgbmV0X3RvZG9fbGlzdCA9IExJU1RfSEVBRF9JTklUKG5ldF90b2RvX2xpc3QpOworCitzdGF0aWMgaW5saW5lIHZvaWQgbmV0X3NldF90b2RvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3Bpbl9sb2NrKCZuZXRfdG9kb19saXN0X2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmRldi0+dG9kb19saXN0LCAmbmV0X3RvZG9fbGlzdCk7CisJc3Bpbl91bmxvY2soJm5ldF90b2RvX2xpc3RfbG9jayk7Cit9CisKKy8qKgorICoJcmVnaXN0ZXJfbmV0ZGV2aWNlCS0gcmVnaXN0ZXIgYSBuZXR3b3JrIGRldmljZQorICoJQGRldjogZGV2aWNlIHRvIHJlZ2lzdGVyCisgKgorICoJVGFrZSBhIGNvbXBsZXRlZCBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUgYW5kIGFkZCBpdCB0byB0aGUga2VybmVsCisgKglpbnRlcmZhY2VzLiBBICVORVRERVZfUkVHSVNURVIgbWVzc2FnZSBpcyBzZW50IHRvIHRoZSBuZXRkZXYgbm90aWZpZXIKKyAqCWNoYWluLiAwIGlzIHJldHVybmVkIG9uIHN1Y2Nlc3MuIEEgbmVnYXRpdmUgZXJybm8gY29kZSBpcyByZXR1cm5lZAorICoJb24gYSBmYWlsdXJlIHRvIHNldCB1cCB0aGUgZGV2aWNlLCBvciBpZiB0aGUgbmFtZSBpcyBhIGR1cGxpY2F0ZS4KKyAqCisgKglDYWxsZXJzIG11c3QgaG9sZCB0aGUgcnRubCBzZW1hcGhvcmUuIFlvdSBtYXkgd2FudAorICoJcmVnaXN0ZXJfbmV0ZGV2KCkgaW5zdGVhZCBvZiB0aGlzLgorICoKKyAqCUJVR1M6CisgKglUaGUgbG9ja2luZyBhcHBlYXJzIGluc3VmZmljaWVudCB0byBndWFyYW50ZWUgdHdvIHBhcmFsbGVsIHJlZ2lzdGVycworICoJd2lsbCBub3QgZ2V0IHRoZSBzYW1lIG5hbWUuCisgKi8KKworaW50IHJlZ2lzdGVyX25ldGRldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCXN0cnVjdCBobGlzdF9ub2RlICpwOworCWludCByZXQ7CisKKwlCVUdfT04oZGV2X2Jvb3RfcGhhc2UpOworCUFTU0VSVF9SVE5MKCk7CisKKwkvKiBXaGVuIG5ldF9kZXZpY2UncyBhcmUgcGVyc2lzdGVudCwgdGhpcyB3aWxsIGJlIGZhdGFsLiAqLworCUJVR19PTihkZXYtPnJlZ19zdGF0ZSAhPSBORVRSRUdfVU5JTklUSUFMSVpFRCk7CisKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT5xdWV1ZV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT54bWl0X2xvY2spOworCWRldi0+eG1pdF9sb2NrX293bmVyID0gLTE7CisjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCisJc3Bpbl9sb2NrX2luaXQoJmRldi0+aW5ncmVzc19sb2NrKTsKKyNlbmRpZgorCisJcmV0ID0gYWxsb2NfZGl2ZXJ0X2JsayhkZXYpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJZGV2LT5pZmxpbmsgPSAtMTsKKworCS8qIEluaXQsIGlmIHRoaXMgZnVuY3Rpb24gaXMgYXZhaWxhYmxlICovCisJaWYgKGRldi0+aW5pdCkgeworCQlyZXQgPSBkZXYtPmluaXQoZGV2KTsKKwkJaWYgKHJldCkgeworCQkJaWYgKHJldCA+IDApCisJCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCX0KKyAKKwlpZiAoIWRldl92YWxpZF9uYW1lKGRldi0+bmFtZSkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZXJyOworCX0KKworCWRldi0+aWZpbmRleCA9IGRldl9uZXdfaW5kZXgoKTsKKwlpZiAoZGV2LT5pZmxpbmsgPT0gLTEpCisJCWRldi0+aWZsaW5rID0gZGV2LT5pZmluZGV4OworCisJLyogQ2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiBuYW1lICovCisJaGVhZCA9IGRldl9uYW1lX2hhc2goZGV2LT5uYW1lKTsKKwlobGlzdF9mb3JfZWFjaChwLCBoZWFkKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkCisJCQk9IGhsaXN0X2VudHJ5KHAsIHN0cnVjdCBuZXRfZGV2aWNlLCBuYW1lX2hsaXN0KTsKKwkJaWYgKCFzdHJuY21wKGQtPm5hbWUsIGRldi0+bmFtZSwgSUZOQU1TSVopKSB7CisJCQlyZXQgPSAtRUVYSVNUOworIAkJCWdvdG8gb3V0X2VycjsKKwkJfQorIAl9CisKKwkvKiBGaXggaWxsZWdhbCBTRytDU1VNIGNvbWJpbmF0aW9ucy4gKi8KKwlpZiAoKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1NHKSAmJgorCSAgICAhKGRldi0+ZmVhdHVyZXMgJiAoTkVUSUZfRl9JUF9DU1VNIHwKKwkJCSAgICAgICBORVRJRl9GX05PX0NTVU0gfAorCQkJICAgICAgIE5FVElGX0ZfSFdfQ1NVTSkpKSB7CisJCXByaW50aygiJXM6IERyb3BwaW5nIE5FVElGX0ZfU0cgc2luY2Ugbm8gY2hlY2tzdW0gZmVhdHVyZS5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX1NHOworCX0KKworCS8qIFRTTyByZXF1aXJlcyB0aGF0IFNHIGlzIHByZXNlbnQgYXMgd2VsbC4gKi8KKwlpZiAoKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1RTTykgJiYKKwkgICAgIShkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9TRykpIHsKKwkJcHJpbnRrKCIlczogRHJvcHBpbmcgTkVUSUZfRl9UU08gc2luY2Ugbm8gU0cgZmVhdHVyZS5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX1RTTzsKKwl9CisKKwkvKgorCSAqCW5pbCByZWJ1aWxkX2hlYWRlciByb3V0aW5lLAorCSAqCXRoYXQgc2hvdWxkIGJlIG5ldmVyIGNhbGxlZCBhbmQgdXNlZCBhcyBqdXN0IGJ1ZyB0cmFwLgorCSAqLworCisJaWYgKCFkZXYtPnJlYnVpbGRfaGVhZGVyKQorCQlkZXYtPnJlYnVpbGRfaGVhZGVyID0gZGVmYXVsdF9yZWJ1aWxkX2hlYWRlcjsKKworCS8qCisJICoJRGVmYXVsdCBpbml0aWFsIHN0YXRlIGF0IHJlZ2lzdHJ5IGlzIHRoYXQgdGhlCisJICoJZGV2aWNlIGlzIHByZXNlbnQuCisJICovCisKKwlzZXRfYml0KF9fTElOS19TVEFURV9QUkVTRU5ULCAmZGV2LT5zdGF0ZSk7CisKKwlkZXYtPm5leHQgPSBOVUxMOworCWRldl9pbml0X3NjaGVkdWxlcihkZXYpOworCXdyaXRlX2xvY2tfYmgoJmRldl9iYXNlX2xvY2spOworCSpkZXZfdGFpbCA9IGRldjsKKwlkZXZfdGFpbCA9ICZkZXYtPm5leHQ7CisJaGxpc3RfYWRkX2hlYWQoJmRldi0+bmFtZV9obGlzdCwgaGVhZCk7CisJaGxpc3RfYWRkX2hlYWQoJmRldi0+aW5kZXhfaGxpc3QsIGRldl9pbmRleF9oYXNoKGRldi0+aWZpbmRleCkpOworCWRldl9ob2xkKGRldik7CisJZGV2LT5yZWdfc3RhdGUgPSBORVRSRUdfUkVHSVNURVJJTkc7CisJd3JpdGVfdW5sb2NrX2JoKCZkZXZfYmFzZV9sb2NrKTsKKworCS8qIE5vdGlmeSBwcm90b2NvbHMsIHRoYXQgYSBuZXcgZGV2aWNlIGFwcGVhcmVkLiAqLworCW5vdGlmaWVyX2NhbGxfY2hhaW4oJm5ldGRldl9jaGFpbiwgTkVUREVWX1JFR0lTVEVSLCBkZXYpOworCisJLyogRmluaXNoIHJlZ2lzdHJhdGlvbiBhZnRlciB1bmxvY2sgKi8KKwluZXRfc2V0X3RvZG8oZGV2KTsKKwlyZXQgPSAwOworCitvdXQ6CisJcmV0dXJuIHJldDsKK291dF9lcnI6CisJZnJlZV9kaXZlcnRfYmxrKGRldik7CisJZ290byBvdXQ7Cit9CisKKy8qKgorICoJcmVnaXN0ZXJfbmV0ZGV2CS0gcmVnaXN0ZXIgYSBuZXR3b3JrIGRldmljZQorICoJQGRldjogZGV2aWNlIHRvIHJlZ2lzdGVyCisgKgorICoJVGFrZSBhIGNvbXBsZXRlZCBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUgYW5kIGFkZCBpdCB0byB0aGUga2VybmVsCisgKglpbnRlcmZhY2VzLiBBICVORVRERVZfUkVHSVNURVIgbWVzc2FnZSBpcyBzZW50IHRvIHRoZSBuZXRkZXYgbm90aWZpZXIKKyAqCWNoYWluLiAwIGlzIHJldHVybmVkIG9uIHN1Y2Nlc3MuIEEgbmVnYXRpdmUgZXJybm8gY29kZSBpcyByZXR1cm5lZAorICoJb24gYSBmYWlsdXJlIHRvIHNldCB1cCB0aGUgZGV2aWNlLCBvciBpZiB0aGUgbmFtZSBpcyBhIGR1cGxpY2F0ZS4KKyAqCisgKglUaGlzIGlzIGEgd3JhcHBlciBhcm91bmQgcmVnaXN0ZXJfbmV0ZGV2IHRoYXQgdGFrZXMgdGhlIHJ0bmwgc2VtYXBob3JlCisgKglhbmQgZXhwYW5kcyB0aGUgZGV2aWNlIG5hbWUgaWYgeW91IHBhc3NlZCBhIGZvcm1hdCBzdHJpbmcgdG8KKyAqCWFsbG9jX25ldGRldi4KKyAqLworaW50IHJlZ2lzdGVyX25ldGRldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBlcnI7CisKKwlydG5sX2xvY2soKTsKKworCS8qCisJICogSWYgdGhlIG5hbWUgaXMgYSBmb3JtYXQgc3RyaW5nIHRoZSBjYWxsZXIgd2FudHMgdXMgdG8gZG8gYQorCSAqIG5hbWUgYWxsb2NhdGlvbi4KKwkgKi8KKwlpZiAoc3RyY2hyKGRldi0+bmFtZSwgJyUnKSkgeworCQllcnIgPSBkZXZfYWxsb2NfbmFtZShkZXYsIGRldi0+bmFtZSk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXQ7CisJfQorCQorCS8qCisJICogQmFjayBjb21wYXRpYmlsaXR5IGhvb2suIEtpbGwgdGhpcyBvbmUgaW4gMi41CisJICovCisJaWYgKGRldi0+bmFtZVswXSA9PSAwIHx8IGRldi0+bmFtZVswXSA9PSAnICcpIHsKKwkJZXJyID0gZGV2X2FsbG9jX25hbWUoZGV2LCAiZXRoJWQiKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKK291dDoKKwlydG5sX3VubG9jaygpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX25ldGRldik7CisKKy8qCisgKiBuZXRkZXZfd2FpdF9hbGxyZWZzIC0gd2FpdCB1bnRpbCBhbGwgcmVmZXJlbmNlcyBhcmUgZ29uZS4KKyAqCisgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHVucmVnaXN0ZXJpbmcgbmV0d29yayBkZXZpY2VzLgorICoKKyAqIEFueSBwcm90b2NvbCBvciBkZXZpY2UgdGhhdCBob2xkcyBhIHJlZmVyZW5jZSBzaG91bGQgcmVnaXN0ZXIKKyAqIGZvciBuZXRkZXZpY2Ugbm90aWZpY2F0aW9uLCBhbmQgY2xlYW51cCBhbmQgcHV0IGJhY2sgdGhlCisgKiByZWZlcmVuY2UgaWYgdGhleSByZWNlaXZlIGFuIFVOUkVHSVNURVIgZXZlbnQuCisgKiBXZSBjYW4gZ2V0IHN0dWNrIGhlcmUgaWYgYnVnZ3kgcHJvdG9jb2xzIGRvbid0IGNvcnJlY3RseQorICogY2FsbCBkZXZfcHV0LiAKKyAqLworc3RhdGljIHZvaWQgbmV0ZGV2X3dhaXRfYWxscmVmcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgcmVicm9hZGNhc3RfdGltZSwgd2FybmluZ190aW1lOworCisJcmVicm9hZGNhc3RfdGltZSA9IHdhcm5pbmdfdGltZSA9IGppZmZpZXM7CisJd2hpbGUgKGF0b21pY19yZWFkKCZkZXYtPnJlZmNudCkgIT0gMCkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCByZWJyb2FkY2FzdF90aW1lICsgMSAqIEhaKSkgeworCQkJcnRubF9zaGxvY2soKTsKKworCQkJLyogUmVicm9hZGNhc3QgdW5yZWdpc3RlciBub3RpZmljYXRpb24gKi8KKwkJCW5vdGlmaWVyX2NhbGxfY2hhaW4oJm5ldGRldl9jaGFpbiwKKwkJCQkJICAgIE5FVERFVl9VTlJFR0lTVEVSLCBkZXYpOworCisJCQlpZiAodGVzdF9iaXQoX19MSU5LX1NUQVRFX0xJTktXQVRDSF9QRU5ESU5HLAorCQkJCSAgICAgJmRldi0+c3RhdGUpKSB7CisJCQkJLyogV2UgbXVzdCBub3QgaGF2ZSBsaW5rd2F0Y2ggZXZlbnRzCisJCQkJICogcGVuZGluZyBvbiB1bnJlZ2lzdGVyLiBJZiB0aGlzCisJCQkJICogaGFwcGVucywgd2Ugc2ltcGx5IHJ1biB0aGUgcXVldWUKKwkJCQkgKiB1bnNjaGVkdWxlZCwgcmVzdWx0aW5nIGluIGEgbm9vcAorCQkJCSAqIGZvciB0aGlzIGRldmljZS4KKwkJCQkgKi8KKwkJCQlsaW5rd2F0Y2hfcnVuX3F1ZXVlKCk7CisJCQl9CisKKwkJCXJ0bmxfc2h1bmxvY2soKTsKKworCQkJcmVicm9hZGNhc3RfdGltZSA9IGppZmZpZXM7CisJCX0KKworCQltc2xlZXAoMjUwKTsKKworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB3YXJuaW5nX3RpbWUgKyAxMCAqIEhaKSkgeworCQkJcHJpbnRrKEtFUk5fRU1FUkcgInVucmVnaXN0ZXJfbmV0ZGV2aWNlOiAiCisJCQkgICAgICAgIndhaXRpbmcgZm9yICVzIHRvIGJlY29tZSBmcmVlLiBVc2FnZSAiCisJCQkgICAgICAgImNvdW50ID0gJWRcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBhdG9taWNfcmVhZCgmZGV2LT5yZWZjbnQpKTsKKwkJCXdhcm5pbmdfdGltZSA9IGppZmZpZXM7CisJCX0KKwl9Cit9CisKKy8qIFRoZSBzZXF1ZW5jZSBpczoKKyAqCisgKglydG5sX2xvY2soKTsKKyAqCS4uLgorICoJcmVnaXN0ZXJfbmV0ZGV2aWNlKHgxKTsKKyAqCXJlZ2lzdGVyX25ldGRldmljZSh4Mik7CisgKgkuLi4KKyAqCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKHkxKTsKKyAqCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKHkyKTsKKyAqICAgICAgLi4uCisgKglydG5sX3VubG9jaygpOworICoJZnJlZV9uZXRkZXYoeTEpOworICoJZnJlZV9uZXRkZXYoeTIpOworICoKKyAqIFdlIGFyZSBpbnZva2VkIGJ5IHJ0bmxfdW5sb2NrKCkgYWZ0ZXIgaXQgZHJvcHMgdGhlIHNlbWFwaG9yZS4KKyAqIFRoaXMgYWxsb3dzIHVzIHRvIGRlYWwgd2l0aCBwcm9ibGVtczoKKyAqIDEpIFdlIGNhbiBjcmVhdGUvZGVsZXRlIHN5c2ZzIG9iamVjdHMgd2hpY2ggaW52b2tlIGhvdHBsdWcKKyAqICAgIHdpdGhvdXQgZGVhZGxvY2tpbmcgd2l0aCBsaW5rd2F0Y2ggdmlhIGtldmVudGQuCisgKiAyKSBTaW5jZSB3ZSBydW4gd2l0aCB0aGUgUlROTCBzZW1hcGhvcmUgbm90IGhlbGQsIHdlIGNhbiBzbGVlcAorICogICAgc2FmZWx5IGluIG9yZGVyIHRvIHdhaXQgZm9yIHRoZSBuZXRkZXYgcmVmY250IHRvIGRyb3AgdG8gemVyby4KKyAqLworc3RhdGljIERFQ0xBUkVfTVVURVgobmV0X3RvZG9fcnVuX211dGV4KTsKK3ZvaWQgbmV0ZGV2X3J1bl90b2RvKHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0ID0gTElTVF9IRUFEX0lOSVQobGlzdCk7CisJaW50IGVycjsKKworCisJLyogTmVlZCB0byBndWFyZCBhZ2FpbnN0IG11bHRpcGxlIGNwdSdzIGdldHRpbmcgb3V0IG9mIG9yZGVyLiAqLworCWRvd24oJm5ldF90b2RvX3J1bl9tdXRleCk7CisKKwkvKiBOb3Qgc2FmZSB0byBkbyBvdXRzaWRlIHRoZSBzZW1hcGhvcmUuICBXZSBtdXN0IG5vdCByZXR1cm4KKwkgKiB1bnRpbCBhbGwgdW5yZWdpc3RlciBldmVudHMgaW52b2tlZCBieSB0aGUgbG9jYWwgcHJvY2Vzc29yCisJICogaGF2ZSBiZWVuIGNvbXBsZXRlZCAoZWl0aGVyIGJ5IHRoaXMgdG9kbyBydW4sIG9yIG9uZSBvbgorCSAqIGFub3RoZXIgY3B1KS4KKwkgKi8KKwlpZiAobGlzdF9lbXB0eSgmbmV0X3RvZG9fbGlzdCkpCisJCWdvdG8gb3V0OworCisJLyogU25hcHNob3QgbGlzdCwgYWxsb3cgbGF0ZXIgcmVxdWVzdHMgKi8KKwlzcGluX2xvY2soJm5ldF90b2RvX2xpc3RfbG9jayk7CisJbGlzdF9zcGxpY2VfaW5pdCgmbmV0X3RvZG9fbGlzdCwgJmxpc3QpOworCXNwaW5fdW5sb2NrKCZuZXRfdG9kb19saXN0X2xvY2spOworCQkKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmxpc3QpKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKwkJCT0gbGlzdF9lbnRyeShsaXN0Lm5leHQsIHN0cnVjdCBuZXRfZGV2aWNlLCB0b2RvX2xpc3QpOworCQlsaXN0X2RlbCgmZGV2LT50b2RvX2xpc3QpOworCisJCXN3aXRjaChkZXYtPnJlZ19zdGF0ZSkgeworCQljYXNlIE5FVFJFR19SRUdJU1RFUklORzoKKwkJCWVyciA9IG5ldGRldl9yZWdpc3Rlcl9zeXNmcyhkZXYpOworCQkJaWYgKGVycikKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgc3lzZnMgcmVnaXN0cmF0aW9uICglZClcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJCWRldi0+cmVnX3N0YXRlID0gTkVUUkVHX1JFR0lTVEVSRUQ7CisJCQlicmVhazsKKworCQljYXNlIE5FVFJFR19VTlJFR0lTVEVSSU5HOgorCQkJbmV0ZGV2X3VucmVnaXN0ZXJfc3lzZnMoZGV2KTsKKwkJCWRldi0+cmVnX3N0YXRlID0gTkVUUkVHX1VOUkVHSVNURVJFRDsKKworCQkJbmV0ZGV2X3dhaXRfYWxscmVmcyhkZXYpOworCisJCQkvKiBwYXJhbm9pYSAqLworCQkJQlVHX09OKGF0b21pY19yZWFkKCZkZXYtPnJlZmNudCkpOworCQkJQlVHX1RSQVAoIWRldi0+aXBfcHRyKTsKKwkJCUJVR19UUkFQKCFkZXYtPmlwNl9wdHIpOworCQkJQlVHX1RSQVAoIWRldi0+ZG5fcHRyKTsKKworCisJCQkvKiBJdCBtdXN0IGJlIHRoZSB2ZXJ5IGxhc3QgYWN0aW9uLCAKKwkJCSAqIGFmdGVyIHRoaXMgJ2RldicgbWF5IHBvaW50IHRvIGZyZWVkIHVwIG1lbW9yeS4KKwkJCSAqLworCQkJaWYgKGRldi0+ZGVzdHJ1Y3RvcikKKwkJCQlkZXYtPmRlc3RydWN0b3IoZGV2KTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgIm5ldHdvcmsgdG9kbyAnJXMnIGJ1dCBzdGF0ZSAlZFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGRldi0+cmVnX3N0YXRlKTsKKwkJCWJyZWFrOworCQl9CisJfQorCitvdXQ6CisJdXAoJm5ldF90b2RvX3J1bl9tdXRleCk7Cit9CisKKy8qKgorICoJYWxsb2NfbmV0ZGV2IC0gYWxsb2NhdGUgbmV0d29yayBkZXZpY2UKKyAqCUBzaXplb2ZfcHJpdjoJc2l6ZSBvZiBwcml2YXRlIGRhdGEgdG8gYWxsb2NhdGUgc3BhY2UgZm9yCisgKglAbmFtZToJCWRldmljZSBuYW1lIGZvcm1hdCBzdHJpbmcKKyAqCUBzZXR1cDoJCWNhbGxiYWNrIHRvIGluaXRpYWxpemUgZGV2aWNlCisgKgorICoJQWxsb2NhdGVzIGEgc3RydWN0IG5ldF9kZXZpY2Ugd2l0aCBwcml2YXRlIGRhdGEgYXJlYSBmb3IgZHJpdmVyIHVzZQorICoJYW5kIHBlcmZvcm1zIGJhc2ljIGluaXRpYWxpemF0aW9uLgorICovCitzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfbmV0ZGV2KGludCBzaXplb2ZfcHJpdiwgY29uc3QgY2hhciAqbmFtZSwKKwkJdm9pZCAoKnNldHVwKShzdHJ1Y3QgbmV0X2RldmljZSAqKSkKK3sKKwl2b2lkICpwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGFsbG9jX3NpemU7CisKKwkvKiBlbnN1cmUgMzItYnl0ZSBhbGlnbm1lbnQgb2YgYm90aCB0aGUgZGV2aWNlIGFuZCBwcml2YXRlIGFyZWEgKi8KKwlhbGxvY19zaXplID0gKHNpemVvZigqZGV2KSArIE5FVERFVl9BTElHTl9DT05TVCkgJiB+TkVUREVWX0FMSUdOX0NPTlNUOworCWFsbG9jX3NpemUgKz0gc2l6ZW9mX3ByaXYgKyBORVRERVZfQUxJR05fQ09OU1Q7CisKKwlwID0ga21hbGxvYyhhbGxvY19zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhbGxvY19kZXY6IFVuYWJsZSB0byBhbGxvY2F0ZSBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldChwLCAwLCBhbGxvY19zaXplKTsKKworCWRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKQorCQkoKChsb25nKXAgKyBORVRERVZfQUxJR05fQ09OU1QpICYgfk5FVERFVl9BTElHTl9DT05TVCk7CisJZGV2LT5wYWRkZWQgPSAoY2hhciAqKWRldiAtIChjaGFyICopcDsKKworCWlmIChzaXplb2ZfcHJpdikKKwkJZGV2LT5wcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNldHVwKGRldik7CisJc3RyY3B5KGRldi0+bmFtZSwgbmFtZSk7CisJcmV0dXJuIGRldjsKK30KK0VYUE9SVF9TWU1CT0woYWxsb2NfbmV0ZGV2KTsKKworLyoqCisgKglmcmVlX25ldGRldiAtIGZyZWUgbmV0d29yayBkZXZpY2UKKyAqCUBkZXY6IGRldmljZQorICoKKyAqCVRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgbGFzdCBzdGFnZSBvZiBkZXN0cm95aW5nIGFuIGFsbG9jYXRlZCBkZXZpY2UgCisgKiAJaW50ZXJmYWNlLiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBkZXZpY2Ugb2JqZWN0IGlzIHJlbGVhc2VkLiAgCisgKglJZiB0aGlzIGlzIHRoZSBsYXN0IHJlZmVyZW5jZSB0aGVuIGl0IHdpbGwgYmUgZnJlZWQuCisgKi8KK3ZvaWQgZnJlZV9uZXRkZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZmRlZiBDT05GSUdfU1lTRlMKKwkvKiAgQ29tcGF0aWFibGl0eSB3aXRoIGVycm9yIGhhbmRsaW5nIGluIGRyaXZlcnMgKi8KKwlpZiAoZGV2LT5yZWdfc3RhdGUgPT0gTkVUUkVHX1VOSU5JVElBTElaRUQpIHsKKwkJa2ZyZWUoKGNoYXIgKilkZXYgLSBkZXYtPnBhZGRlZCk7CisJCXJldHVybjsKKwl9CisKKwlCVUdfT04oZGV2LT5yZWdfc3RhdGUgIT0gTkVUUkVHX1VOUkVHSVNURVJFRCk7CisJZGV2LT5yZWdfc3RhdGUgPSBORVRSRUdfUkVMRUFTRUQ7CisKKwkvKiB3aWxsIGZyZWUgdmlhIGNsYXNzIHJlbGVhc2UgKi8KKwljbGFzc19kZXZpY2VfcHV0KCZkZXYtPmNsYXNzX2Rldik7CisjZWxzZQorCWtmcmVlKChjaGFyICopZGV2IC0gZGV2LT5wYWRkZWQpOworI2VuZGlmCit9CisgCisvKiBTeW5jaHJvbml6ZSB3aXRoIHBhY2tldCByZWNlaXZlIHByb2Nlc3NpbmcuICovCit2b2lkIHN5bmNocm9uaXplX25ldCh2b2lkKSAKK3sKKwltaWdodF9zbGVlcCgpOworCXN5bmNocm9uaXplX2tlcm5lbCgpOworfQorCisvKioKKyAqCXVucmVnaXN0ZXJfbmV0ZGV2aWNlIC0gcmVtb3ZlIGRldmljZSBmcm9tIHRoZSBrZXJuZWwKKyAqCUBkZXY6IGRldmljZQorICoKKyAqCVRoaXMgZnVuY3Rpb24gc2h1dHMgZG93biBhIGRldmljZSBpbnRlcmZhY2UgYW5kIHJlbW92ZXMgaXQKKyAqCWZyb20gdGhlIGtlcm5lbCB0YWJsZXMuIE9uIHN1Y2Nlc3MgMCBpcyByZXR1cm5lZCwgb24gYSBmYWlsdXJlCisgKglhIG5lZ2F0aXZlIGVycm5vIGNvZGUgaXMgcmV0dXJuZWQuCisgKgorICoJQ2FsbGVycyBtdXN0IGhvbGQgdGhlIHJ0bmwgc2VtYXBob3JlLiAgWW91IG1heSB3YW50CisgKgl1bnJlZ2lzdGVyX25ldGRldigpIGluc3RlYWQgb2YgdGhpcy4KKyAqLworCitpbnQgdW5yZWdpc3Rlcl9uZXRkZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZCwgKipkcDsKKworCUJVR19PTihkZXZfYm9vdF9waGFzZSk7CisJQVNTRVJUX1JUTkwoKTsKKworCS8qIFNvbWUgZGV2aWNlcyBjYWxsIHdpdGhvdXQgcmVnaXN0ZXJpbmcgZm9yIGluaXRpYWxpemF0aW9uIHVud2luZC4gKi8KKwlpZiAoZGV2LT5yZWdfc3RhdGUgPT0gTkVUUkVHX1VOSU5JVElBTElaRUQpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInVucmVnaXN0ZXJfbmV0ZGV2aWNlOiBkZXZpY2UgJXMvJXAgbmV2ZXIgIgorCQkJCSAgIndhcyByZWdpc3RlcmVkXG4iLCBkZXYtPm5hbWUsIGRldik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCUJVR19PTihkZXYtPnJlZ19zdGF0ZSAhPSBORVRSRUdfUkVHSVNURVJFRCk7CisKKwkvKiBJZiBkZXZpY2UgaXMgcnVubmluZywgY2xvc2UgaXQgZmlyc3QuICovCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApCisJCWRldl9jbG9zZShkZXYpOworCisJLyogQW5kIHVubGluayBpdCBmcm9tIGRldmljZSBjaGFpbi4gKi8KKwlmb3IgKGRwID0gJmRldl9iYXNlOyAoZCA9ICpkcCkgIT0gTlVMTDsgZHAgPSAmZC0+bmV4dCkgeworCQlpZiAoZCA9PSBkZXYpIHsKKwkJCXdyaXRlX2xvY2tfYmgoJmRldl9iYXNlX2xvY2spOworCQkJaGxpc3RfZGVsKCZkZXYtPm5hbWVfaGxpc3QpOworCQkJaGxpc3RfZGVsKCZkZXYtPmluZGV4X2hsaXN0KTsKKwkJCWlmIChkZXZfdGFpbCA9PSAmZGV2LT5uZXh0KQorCQkJCWRldl90YWlsID0gZHA7CisJCQkqZHAgPSBkLT5uZXh0OworCQkJd3JpdGVfdW5sb2NrX2JoKCZkZXZfYmFzZV9sb2NrKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghZCkgeworCQlwcmludGsoS0VSTl9FUlIgInVucmVnaXN0ZXIgbmV0X2RldmljZTogJyVzJyBub3QgZm91bmRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkZXYtPnJlZ19zdGF0ZSA9IE5FVFJFR19VTlJFR0lTVEVSSU5HOworCisJc3luY2hyb25pemVfbmV0KCk7CisKKwkvKiBTaHV0ZG93biBxdWV1ZWluZyBkaXNjaXBsaW5lLiAqLworCWRldl9zaHV0ZG93bihkZXYpOworCisJCisJLyogTm90aWZ5IHByb3RvY29scywgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gZGVzdHJveQorCSAgIHRoaXMgZGV2aWNlLiBUaGV5IHNob3VsZCBjbGVhbiBhbGwgdGhlIHRoaW5ncy4KKwkqLworCW5vdGlmaWVyX2NhbGxfY2hhaW4oJm5ldGRldl9jaGFpbiwgTkVUREVWX1VOUkVHSVNURVIsIGRldik7CisJCisJLyoKKwkgKglGbHVzaCB0aGUgbXVsdGljYXN0IGNoYWluCisJICovCisJZGV2X21jX2Rpc2NhcmQoZGV2KTsKKworCWlmIChkZXYtPnVuaW5pdCkKKwkJZGV2LT51bmluaXQoZGV2KTsKKworCS8qIE5vdGlmaWVyIGNoYWluIE1VU1QgZGV0YWNoIHVzIGZyb20gbWFzdGVyIGRldmljZS4gKi8KKwlCVUdfVFJBUCghZGV2LT5tYXN0ZXIpOworCisJZnJlZV9kaXZlcnRfYmxrKGRldik7CisKKwkvKiBGaW5pc2ggcHJvY2Vzc2luZyB1bnJlZ2lzdGVyIGFmdGVyIHVubG9jayAqLworCW5ldF9zZXRfdG9kbyhkZXYpOworCisJc3luY2hyb25pemVfbmV0KCk7CisKKwlkZXZfcHV0KGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJdW5yZWdpc3Rlcl9uZXRkZXYgLSByZW1vdmUgZGV2aWNlIGZyb20gdGhlIGtlcm5lbAorICoJQGRldjogZGV2aWNlCisgKgorICoJVGhpcyBmdW5jdGlvbiBzaHV0cyBkb3duIGEgZGV2aWNlIGludGVyZmFjZSBhbmQgcmVtb3ZlcyBpdAorICoJZnJvbSB0aGUga2VybmVsIHRhYmxlcy4gT24gc3VjY2VzcyAwIGlzIHJldHVybmVkLCBvbiBhIGZhaWx1cmUKKyAqCWEgbmVnYXRpdmUgZXJybm8gY29kZSBpcyByZXR1cm5lZC4KKyAqCisgKglUaGlzIGlzIGp1c3QgYSB3cmFwcGVyIGZvciB1bnJlZ2lzdGVyX25ldGRldmljZSB0aGF0IHRha2VzCisgKgl0aGUgcnRubCBzZW1hcGhvcmUuICBJbiBnZW5lcmFsIHlvdSB3YW50IHRvIHVzZSB0aGlzIGFuZCBub3QKKyAqCXVucmVnaXN0ZXJfbmV0ZGV2aWNlLgorICovCit2b2lkIHVucmVnaXN0ZXJfbmV0ZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcnRubF9sb2NrKCk7CisJdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKKwlydG5sX3VubG9jaygpOworfQorCitFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfbmV0ZGV2KTsKKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorc3RhdGljIGludCBkZXZfY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLAorCQkJICAgIHZvaWQgKm9jcHUpCit7CisJc3RydWN0IHNrX2J1ZmYgKipsaXN0X3NrYjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqKmxpc3RfbmV0OworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgaW50IGNwdSwgb2xkY3B1ID0gKHVuc2lnbmVkIGxvbmcpb2NwdTsKKwlzdHJ1Y3Qgc29mdG5ldF9kYXRhICpzZCwgKm9sZHNkOworCisJaWYgKGFjdGlvbiAhPSBDUFVfREVBRCkKKwkJcmV0dXJuIE5PVElGWV9PSzsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXNkID0gJnBlcl9jcHUoc29mdG5ldF9kYXRhLCBjcHUpOworCW9sZHNkID0gJnBlcl9jcHUoc29mdG5ldF9kYXRhLCBvbGRjcHUpOworCisJLyogRmluZCBlbmQgb2Ygb3VyIGNvbXBsZXRpb25fcXVldWUuICovCisJbGlzdF9za2IgPSAmc2QtPmNvbXBsZXRpb25fcXVldWU7CisJd2hpbGUgKCpsaXN0X3NrYikKKwkJbGlzdF9za2IgPSAmKCpsaXN0X3NrYiktPm5leHQ7CisJLyogQXBwZW5kIGNvbXBsZXRpb24gcXVldWUgZnJvbSBvZmZsaW5lIENQVS4gKi8KKwkqbGlzdF9za2IgPSBvbGRzZC0+Y29tcGxldGlvbl9xdWV1ZTsKKwlvbGRzZC0+Y29tcGxldGlvbl9xdWV1ZSA9IE5VTEw7CisKKwkvKiBGaW5kIGVuZCBvZiBvdXIgb3V0cHV0X3F1ZXVlLiAqLworCWxpc3RfbmV0ID0gJnNkLT5vdXRwdXRfcXVldWU7CisJd2hpbGUgKCpsaXN0X25ldCkKKwkJbGlzdF9uZXQgPSAmKCpsaXN0X25ldCktPm5leHRfc2NoZWQ7CisJLyogQXBwZW5kIG91dHB1dCBxdWV1ZSBmcm9tIG9mZmxpbmUgQ1BVLiAqLworCSpsaXN0X25ldCA9IG9sZHNkLT5vdXRwdXRfcXVldWU7CisJb2xkc2QtPm91dHB1dF9xdWV1ZSA9IE5VTEw7CisKKwlyYWlzZV9zb2Z0aXJxX2lycW9mZihORVRfVFhfU09GVElSUSk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJLyogUHJvY2VzcyBvZmZsaW5lIENQVSdzIGlucHV0X3BrdF9xdWV1ZSAqLworCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZSgmb2xkc2QtPmlucHV0X3BrdF9xdWV1ZSkpKQorCQluZXRpZl9yeChza2IpOworCisJcmV0dXJuIE5PVElGWV9PSzsKK30KKyNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KKworCisvKgorICoJSW5pdGlhbGl6ZSB0aGUgREVWIG1vZHVsZS4gQXQgYm9vdCB0aW1lIHRoaXMgd2Fsa3MgdGhlIGRldmljZSBsaXN0IGFuZAorICoJdW5ob29rcyBhbnkgZGV2aWNlcyB0aGF0IGZhaWwgdG8gaW5pdGlhbGlzZSAobm9ybWFsbHkgaGFyZHdhcmUgbm90CisgKglwcmVzZW50KSBhbmQgbGVhdmVzIHVzIHdpdGggYSB2YWxpZCBsaXN0IG9mIHByZXNlbnQgYW5kIGFjdGl2ZSBkZXZpY2VzLgorICoKKyAqLworCisvKgorICogICAgICAgVGhpcyBpcyBjYWxsZWQgc2luZ2xlIHRocmVhZGVkIGR1cmluZyBib290LCBzbyBubyBuZWVkCisgKiAgICAgICB0byB0YWtlIHRoZSBydG5sIHNlbWFwaG9yZS4KKyAqLworc3RhdGljIGludCBfX2luaXQgbmV0X2Rldl9pbml0KHZvaWQpCit7CisJaW50IGksIHJjID0gLUVOT01FTTsKKworCUJVR19PTighZGV2X2Jvb3RfcGhhc2UpOworCisJbmV0X3JhbmRvbV9pbml0KCk7CisKKwlpZiAoZGV2X3Byb2NfaW5pdCgpKQorCQlnb3RvIG91dDsKKworCWlmIChuZXRkZXZfc3lzZnNfaW5pdCgpKQorCQlnb3RvIG91dDsKKworCUlOSVRfTElTVF9IRUFEKCZwdHlwZV9hbGwpOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSAKKwkJSU5JVF9MSVNUX0hFQUQoJnB0eXBlX2Jhc2VbaV0pOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGV2X25hbWVfaGVhZCk7IGkrKykKKwkJSU5JVF9ITElTVF9IRUFEKCZkZXZfbmFtZV9oZWFkW2ldKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRldl9pbmRleF9oZWFkKTsgaSsrKQorCQlJTklUX0hMSVNUX0hFQUQoJmRldl9pbmRleF9oZWFkW2ldKTsKKworCS8qCisJICoJSW5pdGlhbGlzZSB0aGUgcGFja2V0IHJlY2VpdmUgcXVldWVzLgorCSAqLworCisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlzdHJ1Y3Qgc29mdG5ldF9kYXRhICpxdWV1ZTsKKworCQlxdWV1ZSA9ICZwZXJfY3B1KHNvZnRuZXRfZGF0YSwgaSk7CisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnF1ZXVlLT5pbnB1dF9wa3RfcXVldWUpOworCQlxdWV1ZS0+dGhyb3R0bGUgPSAwOworCQlxdWV1ZS0+Y25nX2xldmVsID0gMDsKKwkJcXVldWUtPmF2Z19ibG9nID0gMTA7IC8qIGFyYml0cmFyeSBub24temVybyAqLworCQlxdWV1ZS0+Y29tcGxldGlvbl9xdWV1ZSA9IE5VTEw7CisJCUlOSVRfTElTVF9IRUFEKCZxdWV1ZS0+cG9sbF9saXN0KTsKKwkJc2V0X2JpdChfX0xJTktfU1RBVEVfU1RBUlQsICZxdWV1ZS0+YmFja2xvZ19kZXYuc3RhdGUpOworCQlxdWV1ZS0+YmFja2xvZ19kZXYud2VpZ2h0ID0gd2VpZ2h0X3A7CisJCXF1ZXVlLT5iYWNrbG9nX2Rldi5wb2xsID0gcHJvY2Vzc19iYWNrbG9nOworCQlhdG9taWNfc2V0KCZxdWV1ZS0+YmFja2xvZ19kZXYucmVmY250LCAxKTsKKwl9CisKKyNpZmRlZiBPRkZMSU5FX1NBTVBMRQorCXNhbXBfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoMTAgKiBIWik7CisJYWRkX3RpbWVyKCZzYW1wX3RpbWVyKTsKKyNlbmRpZgorCisJZGV2X2Jvb3RfcGhhc2UgPSAwOworCisJb3Blbl9zb2Z0aXJxKE5FVF9UWF9TT0ZUSVJRLCBuZXRfdHhfYWN0aW9uLCBOVUxMKTsKKwlvcGVuX3NvZnRpcnEoTkVUX1JYX1NPRlRJUlEsIG5ldF9yeF9hY3Rpb24sIE5VTEwpOworCisJaG90Y3B1X25vdGlmaWVyKGRldl9jcHVfY2FsbGJhY2ssIDApOworCWRzdF9pbml0KCk7CisJZGV2X21jYXN0X2luaXQoKTsKKwlyYyA9IDA7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdWJzeXNfaW5pdGNhbGwobmV0X2Rldl9pbml0KTsKKworRVhQT1JUX1NZTUJPTChfX2Rldl9nZXRfYnlfaW5kZXgpOworRVhQT1JUX1NZTUJPTChfX2Rldl9nZXRfYnlfbmFtZSk7CitFWFBPUlRfU1lNQk9MKF9fZGV2X3JlbW92ZV9wYWNrKTsKK0VYUE9SVF9TWU1CT0woX19za2JfbGluZWFyaXplKTsKK0VYUE9SVF9TWU1CT0woZGV2X2FkZF9wYWNrKTsKK0VYUE9SVF9TWU1CT0woZGV2X2FsbG9jX25hbWUpOworRVhQT1JUX1NZTUJPTChkZXZfY2xvc2UpOworRVhQT1JUX1NZTUJPTChkZXZfZ2V0X2J5X2ZsYWdzKTsKK0VYUE9SVF9TWU1CT0woZGV2X2dldF9ieV9pbmRleCk7CitFWFBPUlRfU1lNQk9MKGRldl9nZXRfYnlfbmFtZSk7CitFWFBPUlRfU1lNQk9MKGRldl9pb2N0bCk7CitFWFBPUlRfU1lNQk9MKGRldl9vcGVuKTsKK0VYUE9SVF9TWU1CT0woZGV2X3F1ZXVlX3htaXQpOworRVhQT1JUX1NZTUJPTChkZXZfcmVtb3ZlX3BhY2spOworRVhQT1JUX1NZTUJPTChkZXZfc2V0X2FsbG11bHRpKTsKK0VYUE9SVF9TWU1CT0woZGV2X3NldF9wcm9taXNjdWl0eSk7CitFWFBPUlRfU1lNQk9MKGRldl9jaGFuZ2VfZmxhZ3MpOworRVhQT1JUX1NZTUJPTChkZXZfc2V0X210dSk7CitFWFBPUlRfU1lNQk9MKGRldl9zZXRfbWFjX2FkZHJlc3MpOworRVhQT1JUX1NZTUJPTChmcmVlX25ldGRldik7CitFWFBPUlRfU1lNQk9MKG5ldGRldl9ib290X3NldHVwX2NoZWNrKTsKK0VYUE9SVF9TWU1CT0wobmV0ZGV2X3NldF9tYXN0ZXIpOworRVhQT1JUX1NZTUJPTChuZXRkZXZfc3RhdGVfY2hhbmdlKTsKK0VYUE9SVF9TWU1CT0wobmV0aWZfcmVjZWl2ZV9za2IpOworRVhQT1JUX1NZTUJPTChuZXRpZl9yeCk7CitFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX2dpZmNvbmYpOworRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9uZXRkZXZpY2UpOworRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIpOworRVhQT1JUX1NZTUJPTChza2JfY2hlY2tzdW1faGVscCk7CitFWFBPUlRfU1lNQk9MKHN5bmNocm9uaXplX25ldCk7CitFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfbmV0ZGV2aWNlKTsKK0VYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIpOworRVhQT1JUX1NZTUJPTChuZXRfZW5hYmxlX3RpbWVzdGFtcCk7CitFWFBPUlRfU1lNQk9MKG5ldF9kaXNhYmxlX3RpbWVzdGFtcCk7CitFWFBPUlRfU1lNQk9MKGRldl9nZXRfZmxhZ3MpOworCisjaWYgZGVmaW5lZChDT05GSUdfQlJJREdFKSB8fCBkZWZpbmVkKENPTkZJR19CUklER0VfTU9EVUxFKQorRVhQT1JUX1NZTUJPTChicl9oYW5kbGVfZnJhbWVfaG9vayk7CitFWFBPUlRfU1lNQk9MKGJyX2ZkYl9nZXRfaG9vayk7CitFWFBPUlRfU1lNQk9MKGJyX2ZkYl9wdXRfaG9vayk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19LTU9ECitFWFBPUlRfU1lNQk9MKGRldl9sb2FkKTsKKyNlbmRpZgorCitFWFBPUlRfUEVSX0NQVV9TWU1CT0woc29mdG5ldF9kYXRhKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Rldl9tY2FzdC5jIGIvbmV0L2NvcmUvZGV2X21jYXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIwOThmZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9jb3JlL2Rldl9tY2FzdC5jCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICoJTGludXggTkVUMzoJTXVsdGljYXN0IExpc3QgbWFpbnRlbmFuY2UuIAorICoKKyAqCUF1dGhvcnM6CisgKgkJVGltIEtvcmRhcyA8dGprQG5vc3Ryb21vLmVlYXAuY3dydS5lZHU+IAorICoJCVJpY2hhcmQgVW5kZXJ3b29kIDxyaWNoYXJkQHd1enouZGVtb24uY28udWs+CisgKgorICoJU3RpciBmcmllZCB0b2dldGhlciBmcm9tIHRoZSBJUCBtdWx0aWNhc3QgYW5kIENBUCBwYXRjaGVzIGFib3ZlCisgKgkJQWxhbiBDb3ggPEFsYW4uQ294QGxpbnV4Lm9yZz4JCisgKgorICoJRml4ZXM6CisgKgkJQWxhbiBDb3gJOglVcGRhdGUgdGhlIGRldmljZSBvbiBhIHJlYWwgZGVsZXRlCisgKgkJCQkJcmF0aGVyIHRoYW4gYW55IHRpbWUgYnV0Li4uCisgKgkJQWxhbiBDb3gJOglJRkZfQUxMTVVMVEkgc3VwcG9ydC4KKyAqCQlBbGFuIENveAk6IAlOZXcgZm9ybWF0IHNldF9tdWx0aWNhc3RfbGlzdCgpIGNhbGxzLgorICoJCUdsZWIgTmF0YXBvdiAgICA6ICAgICAgIFJlbW92ZSBkZXZfbWNfbG9jay4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4gCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+IAorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisKKworLyoKKyAqCURldmljZSBtdWx0aWNhc3QgbGlzdCBtYWludGVuYW5jZS4gCisgKgorICoJVGhpcyBpcyB1c2VkIGJvdGggYnkgSVAgYW5kIGJ5IHRoZSB1c2VyIGxldmVsIG1haW50ZW5hbmNlIGZ1bmN0aW9ucy4gCisgKglVbmxpa2UgQlNEIHdlIG1haW50YWluIGEgdXNhZ2UgY291bnQgb24gYSBnaXZlbiBtdWx0aWNhc3QgYWRkcmVzcyBzbyAKKyAqCXRoYXQgYSBjYXN1YWwgdXNlciBhcHBsaWNhdGlvbiBjYW4gYWRkL2RlbGV0ZSBtdWx0aWNhc3RzIHVzZWQgYnkgCisgKglwcm90b2NvbHMgd2l0aG91dCBkb2luZyBkYW1hZ2UgdG8gdGhlIHByb3RvY29scyB3aGVuIGl0IGRlbGV0ZXMgdGhlCisgKgllbnRyaWVzLiBJdCBhbHNvIGhlbHBzIElQIGFzIGl0IHRyYWNrcyBvdmVybGFwcGluZyBtYXBzLgorICoKKyAqCURldmljZSBtYyBsaXN0cyBhcmUgY2hhbmdlZCBieSBiaCBhdCBsZWFzdCBpZiBJUHY2IGlzIGVuYWJsZWQsCisgKglzbyB0aGF0IGl0IG11c3QgYmUgYmggcHJvdGVjdGVkLgorICoKKyAqCVdlIGJsb2NrIGFjY2Vzc2VzIHRvIGRldmljZSBtYyBmaWx0ZXJzIHdpdGggZGV2LT54bWl0X2xvY2suCisgKi8KKworLyoKKyAqCVVwZGF0ZSB0aGUgbXVsdGljYXN0IGxpc3QgaW50byB0aGUgcGh5c2ljYWwgTklDIGNvbnRyb2xsZXIuCisgKi8KKyAKK3N0YXRpYyB2b2lkIF9fZGV2X21jX3VwbG9hZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIERvbid0IGRvIGFueXRoaW5nIHRpbGwgd2UgdXAgdGhlIGludGVyZmFjZQorCSAqIFtkZXZfb3BlbiB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiBzbyB0aGUgbGlzdCB3aWxsCisJICogc3RheSBzYW5lXQorCSAqLworCisJaWYgKCEoZGV2LT5mbGFncyZJRkZfVVApKQorCQlyZXR1cm47CisKKwkvKgorCSAqCURldmljZXMgd2l0aCBubyBzZXQgbXVsdGljYXN0IG9yIHdoaWNoIGhhdmUgYmVlbgorCSAqCWRldGFjaGVkIGRvbid0IGdldCBzZXQuCisJICovCisKKwlpZiAoZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPT0gTlVMTCB8fAorCSAgICAhbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKKwkJcmV0dXJuOworCisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QoZGV2KTsKK30KKwordm9pZCBkZXZfbWNfdXBsb2FkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3Bpbl9sb2NrX2JoKCZkZXYtPnhtaXRfbG9jayk7CisJX19kZXZfbWNfdXBsb2FkKGRldik7CisJc3Bpbl91bmxvY2tfYmgoJmRldi0+eG1pdF9sb2NrKTsKK30KKworLyoKKyAqCURlbGV0ZSBhIGRldmljZSBsZXZlbCBtdWx0aWNhc3QKKyAqLworIAoraW50IGRldl9tY19kZWxldGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkciwgaW50IGFsZW4sIGludCBnbGJsKQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pLCAqKmRtaXA7CisKKwlzcGluX2xvY2tfYmgoJmRldi0+eG1pdF9sb2NrKTsKKworCWZvciAoZG1pcCA9ICZkZXYtPm1jX2xpc3Q7IChkbWkgPSAqZG1pcCkgIT0gTlVMTDsgZG1pcCA9ICZkbWktPm5leHQpIHsKKwkJLyoKKwkJICoJRmluZCB0aGUgZW50cnkgd2Ugd2FudCB0byBkZWxldGUuIFRoZSBkZXZpY2UgY291bGQKKwkJICoJaGF2ZSB2YXJpYWJsZSBsZW5ndGggZW50cmllcyBzbyBjaGVjayB0aGVzZSB0b28uCisJCSAqLworCQlpZiAobWVtY21wKGRtaS0+ZG1pX2FkZHIsIGFkZHIsIGRtaS0+ZG1pX2FkZHJsZW4pID09IDAgJiYKKwkJICAgIGFsZW4gPT0gZG1pLT5kbWlfYWRkcmxlbikgeworCQkJaWYgKGdsYmwpIHsKKwkJCQlpbnQgb2xkX2dsYmwgPSBkbWktPmRtaV9ndXNlcnM7CisJCQkJZG1pLT5kbWlfZ3VzZXJzID0gMDsKKwkJCQlpZiAob2xkX2dsYmwgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoLS1kbWktPmRtaV91c2VycykKKwkJCQlnb3RvIGRvbmU7CisKKwkJCS8qCisJCQkgKglMYXN0IHVzZXIuIFNvIGRlbGV0ZSB0aGUgZW50cnkuCisJCQkgKi8KKwkJCSpkbWlwID0gZG1pLT5uZXh0OworCQkJZGV2LT5tY19jb3VudC0tOworCisJCQlrZnJlZShkbWkpOworCisJCQkvKgorCQkJICoJV2UgaGF2ZSBhbHRlcmVkIHRoZSBsaXN0LCBzbyB0aGUgY2FyZAorCQkJICoJbG9hZGVkIGZpbHRlciBpcyBub3cgd3JvbmcuIEZpeCBpdAorCQkJICovCisJCQlfX2Rldl9tY191cGxvYWQoZGV2KTsKKwkJCQorCQkJc3Bpbl91bmxvY2tfYmgoJmRldi0+eG1pdF9sb2NrKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWVyciA9IC1FTk9FTlQ7Citkb25lOgorCXNwaW5fdW5sb2NrX2JoKCZkZXYtPnhtaXRfbG9jayk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqCUFkZCBhIGRldmljZSBsZXZlbCBtdWx0aWNhc3QKKyAqLworIAoraW50IGRldl9tY19hZGQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkciwgaW50IGFsZW4sIGludCBnbGJsKQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pLCAqZG1pMTsKKworCWRtaTEgPSAoc3RydWN0IGRldl9tY19saXN0ICopa21hbGxvYyhzaXplb2YoKmRtaSksIEdGUF9BVE9NSUMpOworCisJc3Bpbl9sb2NrX2JoKCZkZXYtPnhtaXRfbG9jayk7CisJZm9yIChkbWkgPSBkZXYtPm1jX2xpc3Q7IGRtaSAhPSBOVUxMOyBkbWkgPSBkbWktPm5leHQpIHsKKwkJaWYgKG1lbWNtcChkbWktPmRtaV9hZGRyLCBhZGRyLCBkbWktPmRtaV9hZGRybGVuKSA9PSAwICYmCisJCSAgICBkbWktPmRtaV9hZGRybGVuID09IGFsZW4pIHsKKwkJCWlmIChnbGJsKSB7CisJCQkJaW50IG9sZF9nbGJsID0gZG1pLT5kbWlfZ3VzZXJzOworCQkJCWRtaS0+ZG1pX2d1c2VycyA9IDE7CisJCQkJaWYgKG9sZF9nbGJsKQorCQkJCQlnb3RvIGRvbmU7CisJCQl9CisJCQlkbWktPmRtaV91c2VycysrOworCQkJZ290byBkb25lOworCQl9CisJfQorCisJaWYgKChkbWkgPSBkbWkxKSA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZkZXYtPnhtaXRfbG9jayk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1jcHkoZG1pLT5kbWlfYWRkciwgYWRkciwgYWxlbik7CisJZG1pLT5kbWlfYWRkcmxlbiA9IGFsZW47CisJZG1pLT5uZXh0ID0gZGV2LT5tY19saXN0OworCWRtaS0+ZG1pX3VzZXJzID0gMTsKKwlkbWktPmRtaV9ndXNlcnMgPSBnbGJsID8gMSA6IDA7CisJZGV2LT5tY19saXN0ID0gZG1pOworCWRldi0+bWNfY291bnQrKzsKKworCV9fZGV2X21jX3VwbG9hZChkZXYpOworCQorCXNwaW5fdW5sb2NrX2JoKCZkZXYtPnhtaXRfbG9jayk7CisJcmV0dXJuIDA7CisKK2RvbmU6CisJc3Bpbl91bmxvY2tfYmgoJmRldi0+eG1pdF9sb2NrKTsKKwlpZiAoZG1pMSkKKwkJa2ZyZWUoZG1pMSk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqCURpc2NhcmQgbXVsdGljYXN0IGxpc3Qgd2hlbiBhIGRldmljZSBpcyBkb3duZWQKKyAqLworCit2b2lkIGRldl9tY19kaXNjYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3Bpbl9sb2NrX2JoKCZkZXYtPnhtaXRfbG9jayk7CisJCisJd2hpbGUgKGRldi0+bWNfbGlzdCAhPSBOVUxMKSB7CisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqdG1wID0gZGV2LT5tY19saXN0OworCQlkZXYtPm1jX2xpc3QgPSB0bXAtPm5leHQ7CisJCWlmICh0bXAtPmRtaV91c2VycyA+IHRtcC0+ZG1pX2d1c2VycykKKwkJCXByaW50aygiZGV2X21jX2Rpc2NhcmQ6IG11bHRpY2FzdCBsZWFrYWdlISBkbWlfdXNlcnM9JWRcbiIsIHRtcC0+ZG1pX3VzZXJzKTsKKwkJa2ZyZWUodG1wKTsKKwl9CisJZGV2LT5tY19jb3VudCA9IDA7CisKKwlzcGluX3VubG9ja19iaCgmZGV2LT54bWl0X2xvY2spOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyB2b2lkICpkZXZfbWNfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWxvZmZfdCBvZmYgPSAwOworCisJcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKwlmb3IgKGRldiA9IGRldl9iYXNlOyBkZXY7IGRldiA9IGRldi0+bmV4dCkgeworCQlpZiAob2ZmKysgPT0gKnBvcykgCisJCQlyZXR1cm4gZGV2OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKmRldl9tY19zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHY7CisJKysqcG9zOworCXJldHVybiBkZXYtPm5leHQ7Cit9CisKK3N0YXRpYyB2b2lkIGRldl9tY19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7Cit9CisKKworc3RhdGljIGludCBkZXZfbWNfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IGRldl9tY19saXN0ICptOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB2OworCisJc3Bpbl9sb2NrX2JoKCZkZXYtPnhtaXRfbG9jayk7CisJZm9yIChtID0gZGV2LT5tY19saXN0OyBtOyBtID0gbS0+bmV4dCkgeworCQlpbnQgaTsKKworCQlzZXFfcHJpbnRmKHNlcSwgIiUtNGQgJS0xNXMgJS01ZCAlLTVkICIsIGRldi0+aWZpbmRleCwKKwkJCSAgIGRldi0+bmFtZSwgbS0+ZG1pX3VzZXJzLCBtLT5kbWlfZ3VzZXJzKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbS0+ZG1pX2FkZHJsZW47IGkrKykKKwkJCXNlcV9wcmludGYoc2VxLCAiJTAyeCIsIG0tPmRtaV9hZGRyW2ldKTsKKworCQlzZXFfcHV0YyhzZXEsICdcbicpOworCX0KKwlzcGluX3VubG9ja19iaCgmZGV2LT54bWl0X2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGRldl9tY19zZXFfb3BzID0geworCS5zdGFydCA9IGRldl9tY19zZXFfc3RhcnQsCisJLm5leHQgID0gZGV2X21jX3NlcV9uZXh0LAorCS5zdG9wICA9IGRldl9tY19zZXFfc3RvcCwKKwkuc2hvdyAgPSBkZXZfbWNfc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IGRldl9tY19zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmRldl9tY19zZXFfb3BzKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGV2X21jX3NlcV9mb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICA9IGRldl9tY19zZXFfb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworCisjZW5kaWYKKwordm9pZCBfX2luaXQgZGV2X21jYXN0X2luaXQodm9pZCkKK3sKKwlwcm9jX25ldF9mb3BzX2NyZWF0ZSgiZGV2X21jYXN0IiwgMCwgJmRldl9tY19zZXFfZm9wcyk7Cit9CisKK0VYUE9SVF9TWU1CT0woZGV2X21jX2FkZCk7CitFWFBPUlRfU1lNQk9MKGRldl9tY19kZWxldGUpOworRVhQT1JUX1NZTUJPTChkZXZfbWNfdXBsb2FkKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2RzdC5jIGIvbmV0L2NvcmUvZHN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JmNmNjNAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9jb3JlL2RzdC5jCkBAIC0wLDAgKzEsMjc2IEBACisvKgorICogbmV0L2NvcmUvZHN0LmMJUHJvdG9jb2wgaW5kZXBlbmRlbnQgZGVzdGluYXRpb24gY2FjaGUuCisgKgorICogQXV0aG9yczoJCUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8bmV0L2RzdC5oPgorCisvKiBMb2NraW5nIHN0cmF0ZWd5OgorICogMSkgR2FyYmFnZSBjb2xsZWN0aW9uIHN0YXRlIG9mIGRlYWQgZGVzdGluYXRpb24gY2FjaGUKKyAqICAgIGVudHJpZXMgaXMgcHJvdGVjdGVkIGJ5IGRzdF9sb2NrLgorICogMikgR0MgaXMgcnVuIG9ubHkgZnJvbSBCSCBjb250ZXh0LCBhbmQgaXMgdGhlIG9ubHkgcmVtb3ZlcgorICogICAgb2YgZW50cmllcy4KKyAqIDMpIEVudHJpZXMgYXJlIGFkZGVkIHRvIHRoZSBnYXJiYWdlIGxpc3QgZnJvbSBib3RoIEJICisgKiAgICBhbmQgbm9uLUJIIGNvbnRleHQsIHNvIGxvY2FsIEJIIGRpc2FibGluZyBpcyBuZWVkZWQuCisgKiA0KSBBbGwgb3BlcmF0aW9ucyBtb2RpZnkgc3RhdGUsIHNvIGEgc3BpbmxvY2sgaXMgdXNlZC4KKyAqLworc3RhdGljIHN0cnVjdCBkc3RfZW50cnkgCSpkc3RfZ2FyYmFnZV9saXN0OworI2lmIFJUX0NBQ0hFX0RFQlVHID49IDIgCitzdGF0aWMgYXRvbWljX3QJCQkgZHN0X3RvdGFsID0gQVRPTUlDX0lOSVQoMCk7CisjZW5kaWYKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZHN0X2xvY2spOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkc3RfZ2NfdGltZXJfZXhwaXJlczsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRzdF9nY190aW1lcl9pbmMgPSBEU1RfR0NfTUFYOworc3RhdGljIHZvaWQgZHN0X3J1bl9nYyh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyB2b2lkIF9fX2RzdF9mcmVlKHN0cnVjdCBkc3RfZW50cnkgKiBkc3QpOworCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgZHN0X2djX3RpbWVyID0KKwlUSU1FUl9JTklUSUFMSVpFUihkc3RfcnVuX2djLCBEU1RfR0NfTUlOLCAwKTsKKworc3RhdGljIHZvaWQgZHN0X3J1bl9nYyh1bnNpZ25lZCBsb25nIGR1bW15KQoreworCWludCAgICBkZWxheWVkID0gMDsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICogZHN0LCAqKmRzdHA7CisKKwlpZiAoIXNwaW5fdHJ5bG9jaygmZHN0X2xvY2spKSB7CisJCW1vZF90aW1lcigmZHN0X2djX3RpbWVyLCBqaWZmaWVzICsgSFovMTApOworCQlyZXR1cm47CisJfQorCisKKwlkZWxfdGltZXIoJmRzdF9nY190aW1lcik7CisJZHN0cCA9ICZkc3RfZ2FyYmFnZV9saXN0OworCXdoaWxlICgoZHN0ID0gKmRzdHApICE9IE5VTEwpIHsKKwkJaWYgKGF0b21pY19yZWFkKCZkc3QtPl9fcmVmY250KSkgeworCQkJZHN0cCA9ICZkc3QtPm5leHQ7CisJCQlkZWxheWVkKys7CisJCQljb250aW51ZTsKKwkJfQorCQkqZHN0cCA9IGRzdC0+bmV4dDsKKworCQlkc3QgPSBkc3RfZGVzdHJveShkc3QpOworCQlpZiAoZHN0KSB7CisJCQkvKiBOT0hBU0ggYW5kIHN0aWxsIHJlZmVyZW5jZWQuIFVubGVzcyBpdCBpcyBhbHJlYWR5CisJCQkgKiBvbiBnYyBsaXN0LCBpbnZhbGlkYXRlIGl0IGFuZCBhZGQgdG8gZ2MgbGlzdC4KKwkJCSAqCisJCQkgKiBOb3RlOiB0aGlzIGlzIHRlbXBvcmFyeS4gQWN0dWFsbHksIE5PSEFTSCBkc3QncworCQkJICogbXVzdCBiZSBvYnNvbGV0ZWQgd2hlbiBwYXJlbnQgaXMgb2Jzb2xldGVkLgorCQkJICogQnV0IHdlIGRvIG5vdCBoYXZlIHN0YXRlICJvYnNvbGV0ZWQsIGJ1dAorCQkJICogcmVmZXJlbmNlZCBieSBwYXJlbnQiLCBzbyBpdCBpcyByaWdodC4KKwkJCSAqLworCQkJaWYgKGRzdC0+b2Jzb2xldGUgPiAxKQorCQkJCWNvbnRpbnVlOworCisJCQlfX19kc3RfZnJlZShkc3QpOworCQkJZHN0LT5uZXh0ID0gKmRzdHA7CisJCQkqZHN0cCA9IGRzdDsKKwkJCWRzdHAgPSAmZHN0LT5uZXh0OworCQl9CisJfQorCWlmICghZHN0X2dhcmJhZ2VfbGlzdCkgeworCQlkc3RfZ2NfdGltZXJfaW5jID0gRFNUX0dDX01BWDsKKwkJZ290byBvdXQ7CisJfQorCWlmICgoZHN0X2djX3RpbWVyX2V4cGlyZXMgKz0gZHN0X2djX3RpbWVyX2luYykgPiBEU1RfR0NfTUFYKQorCQlkc3RfZ2NfdGltZXJfZXhwaXJlcyA9IERTVF9HQ19NQVg7CisJZHN0X2djX3RpbWVyX2luYyArPSBEU1RfR0NfSU5DOworCWRzdF9nY190aW1lci5leHBpcmVzID0gamlmZmllcyArIGRzdF9nY190aW1lcl9leHBpcmVzOworI2lmIFJUX0NBQ0hFX0RFQlVHID49IDIKKwlwcmludGsoImRzdF90b3RhbDogJWQvJWQgJWxkXG4iLAorCSAgICAgICBhdG9taWNfcmVhZCgmZHN0X3RvdGFsKSwgZGVsYXllZCwgIGRzdF9nY190aW1lcl9leHBpcmVzKTsKKyNlbmRpZgorCWFkZF90aW1lcigmZHN0X2djX3RpbWVyKTsKKworb3V0OgorCXNwaW5fdW5sb2NrKCZkc3RfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgZHN0X2Rpc2NhcmRfaW4oc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkc3RfZGlzY2FyZF9vdXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCAqIGRzdF9hbGxvYyhzdHJ1Y3QgZHN0X29wcyAqIG9wcykKK3sKKwlzdHJ1Y3QgZHN0X2VudHJ5ICogZHN0OworCisJaWYgKG9wcy0+Z2MgJiYgYXRvbWljX3JlYWQoJm9wcy0+ZW50cmllcykgPiBvcHMtPmdjX3RocmVzaCkgeworCQlpZiAob3BzLT5nYygpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWRzdCA9IGttZW1fY2FjaGVfYWxsb2Mob3BzLT5rbWVtX2NhY2hlcCwgU0xBQl9BVE9NSUMpOworCWlmICghZHN0KQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQoZHN0LCAwLCBvcHMtPmVudHJ5X3NpemUpOworCWF0b21pY19zZXQoJmRzdC0+X19yZWZjbnQsIDApOworCWRzdC0+b3BzID0gb3BzOworCWRzdC0+bGFzdHVzZSA9IGppZmZpZXM7CisJZHN0LT5wYXRoID0gZHN0OworCWRzdC0+aW5wdXQgPSBkc3RfZGlzY2FyZF9pbjsKKwlkc3QtPm91dHB1dCA9IGRzdF9kaXNjYXJkX291dDsKKyNpZiBSVF9DQUNIRV9ERUJVRyA+PSAyIAorCWF0b21pY19pbmMoJmRzdF90b3RhbCk7CisjZW5kaWYKKwlhdG9taWNfaW5jKCZvcHMtPmVudHJpZXMpOworCXJldHVybiBkc3Q7Cit9CisKK3N0YXRpYyB2b2lkIF9fX2RzdF9mcmVlKHN0cnVjdCBkc3RfZW50cnkgKiBkc3QpCit7CisJLyogVGhlIGZpcnN0IGNhc2UgKGRldj09TlVMTCkgaXMgcmVxdWlyZWQsIHdoZW4KKwkgICBwcm90b2NvbCBtb2R1bGUgaXMgdW5sb2FkZWQuCisJICovCisJaWYgKGRzdC0+ZGV2ID09IE5VTEwgfHwgIShkc3QtPmRldi0+ZmxhZ3MmSUZGX1VQKSkgeworCQlkc3QtPmlucHV0ID0gZHN0X2Rpc2NhcmRfaW47CisJCWRzdC0+b3V0cHV0ID0gZHN0X2Rpc2NhcmRfb3V0OworCX0KKwlkc3QtPm9ic29sZXRlID0gMjsKK30KKwordm9pZCBfX2RzdF9mcmVlKHN0cnVjdCBkc3RfZW50cnkgKiBkc3QpCit7CisJc3Bpbl9sb2NrX2JoKCZkc3RfbG9jayk7CisJX19fZHN0X2ZyZWUoZHN0KTsKKwlkc3QtPm5leHQgPSBkc3RfZ2FyYmFnZV9saXN0OworCWRzdF9nYXJiYWdlX2xpc3QgPSBkc3Q7CisJaWYgKGRzdF9nY190aW1lcl9pbmMgPiBEU1RfR0NfSU5DKSB7CisJCWRzdF9nY190aW1lcl9pbmMgPSBEU1RfR0NfSU5DOworCQlkc3RfZ2NfdGltZXJfZXhwaXJlcyA9IERTVF9HQ19NSU47CisJCW1vZF90aW1lcigmZHN0X2djX3RpbWVyLCBqaWZmaWVzICsgZHN0X2djX3RpbWVyX2V4cGlyZXMpOworCX0KKwlzcGluX3VubG9ja19iaCgmZHN0X2xvY2spOworfQorCitzdHJ1Y3QgZHN0X2VudHJ5ICpkc3RfZGVzdHJveShzdHJ1Y3QgZHN0X2VudHJ5ICogZHN0KQoreworCXN0cnVjdCBkc3RfZW50cnkgKmNoaWxkOworCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoOworCXN0cnVjdCBoaF9jYWNoZSAqaGg7CisKKwlzbXBfcm1iKCk7CisKK2FnYWluOgorCW5laWdoID0gZHN0LT5uZWlnaGJvdXI7CisJaGggPSBkc3QtPmhoOworCWNoaWxkID0gZHN0LT5jaGlsZDsKKworCWRzdC0+aGggPSBOVUxMOworCWlmIChoaCAmJiBhdG9taWNfZGVjX2FuZF90ZXN0KCZoaC0+aGhfcmVmY250KSkKKwkJa2ZyZWUoaGgpOworCisJaWYgKG5laWdoKSB7CisJCWRzdC0+bmVpZ2hib3VyID0gTlVMTDsKKwkJbmVpZ2hfcmVsZWFzZShuZWlnaCk7CisJfQorCisJYXRvbWljX2RlYygmZHN0LT5vcHMtPmVudHJpZXMpOworCisJaWYgKGRzdC0+b3BzLT5kZXN0cm95KQorCQlkc3QtPm9wcy0+ZGVzdHJveShkc3QpOworCWlmIChkc3QtPmRldikKKwkJZGV2X3B1dChkc3QtPmRldik7CisjaWYgUlRfQ0FDSEVfREVCVUcgPj0gMiAKKwlhdG9taWNfZGVjKCZkc3RfdG90YWwpOworI2VuZGlmCisJa21lbV9jYWNoZV9mcmVlKGRzdC0+b3BzLT5rbWVtX2NhY2hlcCwgZHN0KTsKKworCWRzdCA9IGNoaWxkOworCWlmIChkc3QpIHsKKwkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmRzdC0+X19yZWZjbnQpKSB7CisJCQkvKiBXZSB3ZXJlIHJlYWwgcGFyZW50IG9mIHRoaXMgZHN0LCBzbyBraWxsIGNoaWxkLiAqLworCQkJaWYgKGRzdC0+ZmxhZ3MmRFNUX05PSEFTSCkKKwkJCQlnb3RvIGFnYWluOworCQl9IGVsc2UgeworCQkJLyogQ2hpbGQgaXMgc3RpbGwgcmVmZXJlbmNlZCwgcmV0dXJuIGl0IGZvciBmcmVlaW5nLiAqLworCQkJaWYgKGRzdC0+ZmxhZ3MmRFNUX05PSEFTSCkKKwkJCQlyZXR1cm4gZHN0OworCQkJLyogQ2hpbGQgaXMgc3RpbGwgaW4gaGlzIGhhc2ggdGFibGUgKi8KKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogRGlydHkgaGFjay4gV2UgZGlkIGl0IGluIDIuMiAoaW4gX19kc3RfZnJlZSksCisgKiB3ZSBoYXZlIF92ZXJ5XyBnb29kIHJlYXNvbnMgbm90IHRvIHJlcGVhdAorICogdGhpcyBtaXN0YWtlIGluIDIuMywgYnV0IHdlIGhhdmUgbm8gY2hvaWNlCisgKiBub3cuIF9JdF8gX2lzXyBfZXhwbGljaXRfIF9kZWxpYmVyYXRlXworICogX3JhY2VfIF9jb25kaXRpb25fLgorICoKKyAqIENvbW1lbnRlZCBhbmQgb3JpZ2luYWxseSB3cml0dGVuIGJ5IEFsZXhleS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGRzdF9pZmRvd24oc3RydWN0IGRzdF9lbnRyeSAqZHN0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgaW50IHVucmVnaXN0ZXIpCit7CisJaWYgKGRzdC0+b3BzLT5pZmRvd24pCisJCWRzdC0+b3BzLT5pZmRvd24oZHN0LCBkZXYsIHVucmVnaXN0ZXIpOworCisJaWYgKGRldiAhPSBkc3QtPmRldikKKwkJcmV0dXJuOworCisJaWYgKCF1bnJlZ2lzdGVyKSB7CisJCWRzdC0+aW5wdXQgPSBkc3RfZGlzY2FyZF9pbjsKKwkJZHN0LT5vdXRwdXQgPSBkc3RfZGlzY2FyZF9vdXQ7CisJfSBlbHNlIHsKKwkJZHN0LT5kZXYgPSAmbG9vcGJhY2tfZGV2OworCQlkZXZfaG9sZCgmbG9vcGJhY2tfZGV2KTsKKwkJZGV2X3B1dChkZXYpOworCQlpZiAoZHN0LT5uZWlnaGJvdXIgJiYgZHN0LT5uZWlnaGJvdXItPmRldiA9PSBkZXYpIHsKKwkJCWRzdC0+bmVpZ2hib3VyLT5kZXYgPSAmbG9vcGJhY2tfZGV2OworCQkJZGV2X3B1dChkZXYpOworCQkJZGV2X2hvbGQoJmxvb3BiYWNrX2Rldik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgZHN0X2Rldl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHRyOworCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgorCWNhc2UgTkVUREVWX0RPV046CisJCXNwaW5fbG9ja19iaCgmZHN0X2xvY2spOworCQlmb3IgKGRzdCA9IGRzdF9nYXJiYWdlX2xpc3Q7IGRzdDsgZHN0ID0gZHN0LT5uZXh0KSB7CisJCQlkc3RfaWZkb3duKGRzdCwgZGV2LCBldmVudCAhPSBORVRERVZfRE9XTik7CisJCX0KKwkJc3Bpbl91bmxvY2tfYmgoJmRzdF9sb2NrKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBkc3RfZGV2X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsCT0gZHN0X2Rldl9ldmVudCwKK307CisKK3ZvaWQgX19pbml0IGRzdF9pbml0KHZvaWQpCit7CisJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZkc3RfZGV2X25vdGlmaWVyKTsKK30KKworRVhQT1JUX1NZTUJPTChfX2RzdF9mcmVlKTsKK0VYUE9SVF9TWU1CT0woZHN0X2FsbG9jKTsKK0VYUE9SVF9TWU1CT0woZHN0X2Rlc3Ryb3kpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZHYuYyBiL25ldC9jb3JlL2R2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YyNWY0YQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9jb3JlL2R2LmMKQEAgLTAsMCArMSw1NDggQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJR2VuZXJpYyBmcmFtZSBkaXZlcnNpb24KKyAqCisgKiBBdXRob3JzOgkKKyAqIAkJQmVub2l0IExPQ0hFUjoJaW5pdGlhbCBpbnRlZ3JhdGlvbiB3aXRoaW4gdGhlIGtlcm5lbCB3aXRoIHN1cHBvcnQgZm9yIGV0aGVybmV0CisgKiAJCURhdmUgTWlsbGVyOglpbXByb3ZlbWVudCBvbiB0aGUgY29kZSAoY29ycmVjdG5lc3MsIHBlcmZvcm1hbmNlIGFuZCBzb3VyY2UgZmlsZXMpCisgKgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPG5ldC9kc3QuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgorI2luY2x1ZGUgPGxpbnV4L2RpdmVydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKworY29uc3QgY2hhciBzeXNjdGxfZGl2ZXJ0X3ZlcnNpb25bMzJdPSIwLjQ2IjsJLyogQ3VycmVudCB2ZXJzaW9uICovCisKK3N0YXRpYyBpbnQgX19pbml0IGR2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KGR2X2luaXQpOworCisvKgorICogQWxsb2NhdGUgYSBkaXZlcnRfYmxrIGZvciBhIGRldmljZS4gVGhpcyBtdXN0IGJlIGFuIGV0aGVybmV0IG5pYy4KKyAqLworaW50IGFsbG9jX2RpdmVydF9ibGsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgYWxsb2Nfc2l6ZSA9IChzaXplb2Yoc3RydWN0IGRpdmVydF9ibGspICsgMykgJiB+MzsKKworCWRldi0+ZGl2ZXJ0ID0gTlVMTDsKKwlpZiAoZGV2LT50eXBlID09IEFSUEhSRF9FVEhFUikgeworCQlkZXYtPmRpdmVydCA9IChzdHJ1Y3QgZGl2ZXJ0X2JsayAqKQorCQkJa21hbGxvYyhhbGxvY19zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGRldi0+ZGl2ZXJ0ID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImRpdmVydDogdW5hYmxlIHRvIGFsbG9jYXRlIGRpdmVydF9ibGsgZm9yICVzXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCW1lbXNldChkZXYtPmRpdmVydCwgMCwgc2l6ZW9mKHN0cnVjdCBkaXZlcnRfYmxrKSk7CisJCWRldl9ob2xkKGRldik7CisJfQorCisJcmV0dXJuIDA7Cit9IAorCisvKgorICogRnJlZSBhIGRpdmVydF9ibGsgYWxsb2NhdGVkIGJ5IHRoZSBhYm92ZSBmdW5jdGlvbiwgaWYgaXQgd2FzIAorICogYWxsb2NhdGVkIG9uIHRoYXQgZGV2aWNlLgorICovCit2b2lkIGZyZWVfZGl2ZXJ0X2JsayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmIChkZXYtPmRpdmVydCkgeworCQlrZnJlZShkZXYtPmRpdmVydCk7CisJCWRldi0+ZGl2ZXJ0PU5VTEw7CisJCWRldl9wdXQoZGV2KTsKKwl9Cit9CisKKy8qCisgKiBBZGRzIGEgdGNwL3VkcCAoc291cmNlIG9yIGRlc3QpIHBvcnQgdG8gYW4gYXJyYXkKKyAqLworc3RhdGljIGludCBhZGRfcG9ydCh1MTYgcG9ydHNbXSwgdTE2IHBvcnQpCit7CisJaW50IGk7CisKKwlpZiAocG9ydCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFN0b3JpbmcgZGlyZWN0bHkgaW4gbmV0d29yayBmb3JtYXQgZm9yIHBlcmZvcm1hbmNlLAorCSAqIHRoYW5rcyBEYXZlIDopCisJICovCisJcG9ydCA9IGh0b25zKHBvcnQpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9ESVZFUlRfUE9SVFM7IGkrKykgeworCQlpZiAocG9ydHNbaV0gPT0gcG9ydCkKKwkJCXJldHVybiAtRUFMUkVBRFk7CisJfQorCQorCWZvciAoaSA9IDA7IGkgPCBNQVhfRElWRVJUX1BPUlRTOyBpKyspIHsKKwkJaWYgKHBvcnRzW2ldID09IDApIHsKKwkJCXBvcnRzW2ldID0gcG9ydDsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIC1FTk9CVUZTOworfQorCisvKgorICogUmVtb3ZlcyBhIHBvcnQgZnJvbSBhbiBhcnJheSB0Y3AvdWRwIChzb3VyY2Ugb3IgZGVzdCkKKyAqLworc3RhdGljIGludCByZW1vdmVfcG9ydCh1MTYgcG9ydHNbXSwgdTE2IHBvcnQpCit7CisJaW50IGk7CisKKwlpZiAocG9ydCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkKKwkvKiBTdG9yaW5nIGRpcmVjdGx5IGluIG5ldHdvcmsgZm9ybWF0IGZvciBwZXJmb3JtYW5jZSwKKwkgKiB0aGFua3MgRGF2ZSAhCisJICovCisJcG9ydCA9IGh0b25zKHBvcnQpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9ESVZFUlRfUE9SVFM7IGkrKykgeworCQlpZiAocG9ydHNbaV0gPT0gcG9ydCkgeworCQkJcG9ydHNbaV0gPSAwOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogU29tZSBiYXNpYyBzYW5pdHkgY2hlY2tzIG9uIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIGRpdmVydF9pb2N0bCgpICovCitzdGF0aWMgaW50IGNoZWNrX2FyZ3Moc3RydWN0IGRpdmVydF9jZiAqZGl2X2NmLCBzdHJ1Y3QgbmV0X2RldmljZSAqKmRldikKK3sKKwljaGFyIGRldm5hbWVbMzJdOworCWludCByZXQ7CisKKwlpZiAoZGV2ID09IE5VTEwpCisJCXJldHVybiAtRUZBVUxUOworCQorCS8qIEdFVFZFUlNJT046IGFsbCBvdGhlciBhcmdzIGFyZSB1bnVzZWQgKi8KKwlpZiAoZGl2X2NmLT5jbWQgPT0gRElWQ01EX0dFVFZFUlNJT04pCisJCXJldHVybiAwOworCQorCS8qIE5ldHdvcmsgZGV2aWNlIGluZGV4IHNob3VsZCByZWFzb25hYmx5IGJlIGJldHdlZW4gMCBhbmQgMTAwMCA6KSAqLworCWlmIChkaXZfY2YtPmRldl9pbmRleCA8IDAgfHwgZGl2X2NmLT5kZXZfaW5kZXggPiAxMDAwKSAKKwkJcmV0dXJuIC1FSU5WQUw7CisJCQkKKwkvKiBMZXQncyB0cnkgdG8gZmluZCB0aGUgaWZuYW1lICovCisJc3ByaW50ZihkZXZuYW1lLCAiZXRoJWQiLCBkaXZfY2YtPmRldl9pbmRleCk7CisJKmRldiA9IGRldl9nZXRfYnlfbmFtZShkZXZuYW1lKTsKKwkKKwkvKiBkZXYgc2hvdWxkIE5PVCBiZSBudWxsICovCisJaWYgKCpkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSAwOworCisJLyogdXNlciBpc3N1aW5nIHRoZSBpb2N0bCBtdXN0IGJlIGEgc3VwZXIgb25lIDopICovCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJCXJldCA9IC1FUEVSTTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRGV2aWNlIG11c3QgaGF2ZSBhIGRpdmVydF9ibGsgbWVtYmVyIE5PVCBudWxsICovCisJaWYgKCgqZGV2KS0+ZGl2ZXJ0ID09IE5VTEwpCisJCXJldCA9IC1FSU5WQUw7CitvdXQ6CisJZGV2X3B1dCgqZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogY29udHJvbCBmdW5jdGlvbiBvZiB0aGUgZGl2ZXJ0ZXIKKyAqLworI2lmIDAKKyNkZWZpbmUJRFZEQkcoYSkJXAorCXByaW50ayhLRVJOX0RFQlVHICJkaXZlcnRfaW9jdGwoKSBsaW5lICVkICVzXG4iLCBfX0xJTkVfXywgKGEpKQorI2Vsc2UKKyNkZWZpbmUJRFZEQkcoYSkKKyNlbmRpZgorCitpbnQgZGl2ZXJ0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBkaXZlcnRfY2YgX191c2VyICphcmcpCit7CisJc3RydWN0IGRpdmVydF9jZglkaXZfY2Y7CisJc3RydWN0IGRpdmVydF9ibGsJKmRpdl9ibGs7CisJc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKKwlpbnQJCQlyZXQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0dJRkRJVkVSVDoKKwkJRFZEQkcoIlNJT0NHSUZESVZFUlQsIGNvcHlfZnJvbV91c2VyIik7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmZGl2X2NmLCBhcmcsIHNpemVvZihzdHJ1Y3QgZGl2ZXJ0X2NmKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJRFZEQkcoImJlZm9yZSBjaGVja19hcmdzIik7CisJCXJldCA9IGNoZWNrX2FyZ3MoJmRpdl9jZiwgJmRldik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlEVkRCRygiYWZ0ZXIgY2hlY2thcmdzIik7CisJCWRpdl9ibGsgPSBkZXYtPmRpdmVydDsKKwkJCQorCQlEVkRCRygiYmVmcmUgc3dpdGNoKCkiKTsKKwkJc3dpdGNoIChkaXZfY2YuY21kKSB7CisJCWNhc2UgRElWQ01EX0dFVFNUQVRVUzoKKwkJCS8qIE5vdywganVzdCBnaXZlIHRoZSB1c2VyIHRoZSByYXcgZGl2ZXJ0IGJsb2NrCisJCQkgKiBmb3IgaGltIHRvIHBsYXkgd2l0aCA6KQorCQkJICovCisJCQlpZiAoY29weV90b191c2VyKGRpdl9jZi5hcmcxLnB0ciwgZGV2LT5kaXZlcnQsCisJCQkJCSBzaXplb2Yoc3RydWN0IGRpdmVydF9ibGspKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCisJCWNhc2UgRElWQ01EX0dFVFZFUlNJT046CisJCQlEVkRCRygiR0VUVkVSU0lPTjogY2hlY2tpbmcgcHRyIik7CisJCQlpZiAoZGl2X2NmLmFyZzEucHRyID09IE5VTEwpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlEVkRCRygiR0VUVkVSU0lPTjogY29weWluZyBkYXRhIHRvIHVzZXJsYW5kIik7CisJCQlpZiAoY29weV90b191c2VyKGRpdl9jZi5hcmcxLnB0ciwKKwkJCQkJIHN5c2N0bF9kaXZlcnRfdmVyc2lvbiwgMzIpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJRFZEQkcoIkdFVFZFUlNJT046IGRhdGEgY29waWVkIik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgU0lPQ1NJRkRJVkVSVDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZkaXZfY2YsIGFyZywgc2l6ZW9mKHN0cnVjdCBkaXZlcnRfY2YpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldCA9IGNoZWNrX2FyZ3MoJmRpdl9jZiwgJmRldik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWRpdl9ibGsgPSBkZXYtPmRpdmVydDsKKworCQlzd2l0Y2goZGl2X2NmLmNtZCkgeworCQljYXNlIERJVkNNRF9SRVNFVDoKKwkJCWRpdl9ibGstPmRpdmVydCA9IDA7CisJCQlkaXZfYmxrLT5wcm90b3MgPSBESVZFUlRfUFJPVE9fTk9ORTsKKwkJCW1lbXNldChkaXZfYmxrLT50Y3BfZHN0LCAwLAorCQkJICAgICAgIE1BWF9ESVZFUlRfUE9SVFMgKiBzaXplb2YodTE2KSk7CisJCQltZW1zZXQoZGl2X2Jsay0+dGNwX3NyYywgMCwKKwkJCSAgICAgICBNQVhfRElWRVJUX1BPUlRTICogc2l6ZW9mKHUxNikpOworCQkJbWVtc2V0KGRpdl9ibGstPnVkcF9kc3QsIDAsCisJCQkgICAgICAgTUFYX0RJVkVSVF9QT1JUUyAqIHNpemVvZih1MTYpKTsKKwkJCW1lbXNldChkaXZfYmxrLT51ZHBfc3JjLCAwLAorCQkJICAgICAgIE1BWF9ESVZFUlRfUE9SVFMgKiBzaXplb2YodTE2KSk7CisJCQlyZXR1cm4gMDsKKwkJCQkKKwkJY2FzZSBESVZDTURfRElWRVJUOgorCQkJc3dpdGNoKGRpdl9jZi5hcmcxLmludDMyKSB7CisJCQljYXNlIERJVkFSRzFfRU5BQkxFOgorCQkJCWlmIChkaXZfYmxrLT5kaXZlcnQpCisJCQkJCXJldHVybiAtRUFMUkVBRFk7CisJCQkJZGl2X2Jsay0+ZGl2ZXJ0ID0gMTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBESVZBUkcxX0RJU0FCTEU6CisJCQkJaWYgKCFkaXZfYmxrLT5kaXZlcnQpCisJCQkJCXJldHVybiAtRUFMUkVBRFk7CisJCQkJZGl2X2Jsay0+ZGl2ZXJ0ID0gMDsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBESVZDTURfSVA6CisJCQlzd2l0Y2goZGl2X2NmLmFyZzEuaW50MzIpIHsKKwkJCWNhc2UgRElWQVJHMV9FTkFCTEU6CisJCQkJaWYgKGRpdl9ibGstPnByb3RvcyAmIERJVkVSVF9QUk9UT19JUCkKKwkJCQkJcmV0dXJuIC1FQUxSRUFEWTsKKwkJCQlkaXZfYmxrLT5wcm90b3MgfD0gRElWRVJUX1BST1RPX0lQOworCQkJCWJyZWFrOworCisJCQljYXNlIERJVkFSRzFfRElTQUJMRToKKwkJCQlpZiAoIShkaXZfYmxrLT5wcm90b3MgJiBESVZFUlRfUFJPVE9fSVApKQorCQkJCQlyZXR1cm4gLUVBTFJFQURZOworCQkJCWRpdl9ibGstPnByb3RvcyAmPSB+RElWRVJUX1BST1RPX0lQOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIERJVkNNRF9UQ1A6CisJCQlzd2l0Y2goZGl2X2NmLmFyZzEuaW50MzIpIHsKKwkJCWNhc2UgRElWQVJHMV9FTkFCTEU6CisJCQkJaWYgKGRpdl9ibGstPnByb3RvcyAmIERJVkVSVF9QUk9UT19UQ1ApCisJCQkJCXJldHVybiAtRUFMUkVBRFk7CisJCQkJZGl2X2Jsay0+cHJvdG9zIHw9IERJVkVSVF9QUk9UT19UQ1A7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRElWQVJHMV9ESVNBQkxFOgorCQkJCWlmICghKGRpdl9ibGstPnByb3RvcyAmIERJVkVSVF9QUk9UT19UQ1ApKQorCQkJCQlyZXR1cm4gLUVBTFJFQURZOworCQkJCWRpdl9ibGstPnByb3RvcyAmPSB+RElWRVJUX1BST1RPX1RDUDsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBESVZDTURfVENQRFNUOgorCQkJc3dpdGNoKGRpdl9jZi5hcmcxLmludDMyKSB7CisJCQljYXNlIERJVkFSRzFfQUREOgorCQkJCXJldHVybiBhZGRfcG9ydChkaXZfYmxrLT50Y3BfZHN0LAorCQkJCQkJZGl2X2NmLmFyZzIudWludDE2KTsKKwkJCQkKKwkJCWNhc2UgRElWQVJHMV9SRU1PVkU6CisJCQkJcmV0dXJuIHJlbW92ZV9wb3J0KGRpdl9ibGstPnRjcF9kc3QsCisJCQkJCQkgICBkaXZfY2YuYXJnMi51aW50MTYpOworCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIERJVkNNRF9UQ1BTUkM6CisJCQlzd2l0Y2goZGl2X2NmLmFyZzEuaW50MzIpIHsKKwkJCWNhc2UgRElWQVJHMV9BREQ6CisJCQkJcmV0dXJuIGFkZF9wb3J0KGRpdl9ibGstPnRjcF9zcmMsCisJCQkJCQlkaXZfY2YuYXJnMi51aW50MTYpOworCisJCQljYXNlIERJVkFSRzFfUkVNT1ZFOgorCQkJCXJldHVybiByZW1vdmVfcG9ydChkaXZfYmxrLT50Y3Bfc3JjLAorCQkJCQkJICAgZGl2X2NmLmFyZzIudWludDE2KTsKKworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBESVZDTURfVURQOgorCQkJc3dpdGNoKGRpdl9jZi5hcmcxLmludDMyKSB7CisJCQljYXNlIERJVkFSRzFfRU5BQkxFOgorCQkJCWlmIChkaXZfYmxrLT5wcm90b3MgJiBESVZFUlRfUFJPVE9fVURQKQorCQkJCQlyZXR1cm4gLUVBTFJFQURZOworCQkJCWRpdl9ibGstPnByb3RvcyB8PSBESVZFUlRfUFJPVE9fVURQOworCQkJCWJyZWFrOworCisJCQljYXNlIERJVkFSRzFfRElTQUJMRToKKwkJCQlpZiAoIShkaXZfYmxrLT5wcm90b3MgJiBESVZFUlRfUFJPVE9fVURQKSkKKwkJCQkJcmV0dXJuIC1FQUxSRUFEWTsKKwkJCQlkaXZfYmxrLT5wcm90b3MgJj0gfkRJVkVSVF9QUk9UT19VRFA7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgRElWQ01EX1VEUERTVDoKKwkJCXN3aXRjaChkaXZfY2YuYXJnMS5pbnQzMikgeworCQkJY2FzZSBESVZBUkcxX0FERDoKKwkJCQlyZXR1cm4gYWRkX3BvcnQoZGl2X2Jsay0+dWRwX2RzdCwKKwkJCQkJCWRpdl9jZi5hcmcyLnVpbnQxNik7CisKKwkJCWNhc2UgRElWQVJHMV9SRU1PVkU6CisJCQkJcmV0dXJuIHJlbW92ZV9wb3J0KGRpdl9ibGstPnVkcF9kc3QsCisJCQkJCQkgICBkaXZfY2YuYXJnMi51aW50MTYpOworCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIERJVkNNRF9VRFBTUkM6CisJCQlzd2l0Y2goZGl2X2NmLmFyZzEuaW50MzIpIHsKKwkJCWNhc2UgRElWQVJHMV9BREQ6CisJCQkJcmV0dXJuIGFkZF9wb3J0KGRpdl9ibGstPnVkcF9zcmMsCisJCQkJCQlkaXZfY2YuYXJnMi51aW50MTYpOworCisJCQljYXNlIERJVkFSRzFfUkVNT1ZFOgorCQkJCXJldHVybiByZW1vdmVfcG9ydChkaXZfYmxrLT51ZHBfc3JjLAorCQkJCQkJICAgZGl2X2NmLmFyZzIudWludDE2KTsKKworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBESVZDTURfSUNNUDoKKwkJCXN3aXRjaChkaXZfY2YuYXJnMS5pbnQzMikgeworCQkJY2FzZSBESVZBUkcxX0VOQUJMRToKKwkJCQlpZiAoZGl2X2Jsay0+cHJvdG9zICYgRElWRVJUX1BST1RPX0lDTVApCisJCQkJCXJldHVybiAtRUFMUkVBRFk7CisJCQkJZGl2X2Jsay0+cHJvdG9zIHw9IERJVkVSVF9QUk9UT19JQ01QOworCQkJCWJyZWFrOworCisJCQljYXNlIERJVkFSRzFfRElTQUJMRToKKwkJCQlpZiAoIShkaXZfYmxrLT5wcm90b3MgJiBESVZFUlRfUFJPVE9fSUNNUCkpCisJCQkJCXJldHVybiAtRUFMUkVBRFk7CisJCQkJZGl2X2Jsay0+cHJvdG9zICY9IH5ESVZFUlRfUFJPVE9fSUNNUDsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogQ2hlY2sgaWYgcGFja2V0IHNob3VsZCBoYXZlIGl0cyBkZXN0IG1hYyBhZGRyZXNzIHNldCB0byB0aGUgYm94IGl0c2VsZgorICogZm9yIGRpdmVyc2lvbgorICovCisKKyNkZWZpbmUJRVRIX0RJVkVSVF9GUkFNRShza2IpIFwKKwltZW1jcHkoZXRoX2hkcihza2IpLCBza2ItPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsgXAorCXNrYi0+cGt0X3R5cGU9UEFDS0VUX0hPU1QKKwkJCit2b2lkIGRpdmVydF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBldGhoZHIJCQkqZXRoID0gZXRoX2hkcihza2IpOworCXN0cnVjdCBpcGhkcgkJCSppcGg7CisJc3RydWN0IHRjcGhkcgkJCSp0Y3BoOworCXN0cnVjdCB1ZHBoZHIJCQkqdWRwaDsKKwlzdHJ1Y3QgZGl2ZXJ0X2JsawkJKmRpdmVydCA9IHNrYi0+ZGV2LT5kaXZlcnQ7CisJaW50CQkJCWksIHNyYywgZHN0OworCXVuc2lnbmVkIGNoYXIJCQkqc2tiX2RhdGFfZW5kID0gc2tiLT5kYXRhICsgc2tiLT5sZW47CisKKwkvKiBQYWNrZXQgaXMgYWxyZWFkeSBhaW1lZCBhdCB1cywgcmV0dXJuICovCisJaWYgKCFtZW1jbXAoZXRoLCBza2ItPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSkKKwkJcmV0dXJuOworCQorCS8qIHByb3RvIGlzIG5vdCBJUCwgZG8gbm90aGluZyAqLworCWlmIChldGgtPmhfcHJvdG8gIT0gaHRvbnMoRVRIX1BfSVApKQorCQlyZXR1cm47CisJCisJLyogRGl2ZXJ0IGFsbCBJUCBmcmFtZXMgPyAqLworCWlmIChkaXZlcnQtPnByb3RvcyAmIERJVkVSVF9QUk9UT19JUCkgeworCQlFVEhfRElWRVJUX0ZSQU1FKHNrYik7CisJCXJldHVybjsKKwl9CisJCisJLyogQ2hlY2sgZm9yIHBvc3NpYmxlIChtYWxpY2lvdXNseSkgbWFsZm9ybWVkIElQIGZyYW1lICh0aGFua3MgRGF2ZSkgKi8KKwlpcGggPSAoc3RydWN0IGlwaGRyICopIHNrYi0+ZGF0YTsKKwlpZiAoKChpcGgtPmlobDw8MikrKHVuc2lnbmVkIGNoYXIqKShpcGgpKSA+PSBza2JfZGF0YV9lbmQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZGl2ZXJ0OiBtYWxmb3JtZWQgSVAgcGFja2V0ICFcbiIpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChpcGgtPnByb3RvY29sKSB7CisJLyogRGl2ZXJ0IGFsbCBJQ01QIGZyYW1lcyA/ICovCisJY2FzZSBJUFBST1RPX0lDTVA6CisJCWlmIChkaXZlcnQtPnByb3RvcyAmIERJVkVSVF9QUk9UT19JQ01QKSB7CisJCQlFVEhfRElWRVJUX0ZSQU1FKHNrYik7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisKKwkvKiBEaXZlcnQgYWxsIFRDUCBmcmFtZXMgPyAqLworCWNhc2UgSVBQUk9UT19UQ1A6CisJCWlmIChkaXZlcnQtPnByb3RvcyAmIERJVkVSVF9QUk9UT19UQ1ApIHsKKwkJCUVUSF9ESVZFUlRfRlJBTUUoc2tiKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIENoZWNrIGZvciBwb3NzaWJsZSAobWFsaWNpb3VzbHkpIG1hbGZvcm1lZCBJUAorCQkgKiBmcmFtZSAodGhhbnggRGF2ZSkKKwkJICovCisJCXRjcGggPSAoc3RydWN0IHRjcGhkciAqKQorCQkJKCgodW5zaWduZWQgY2hhciAqKWlwaCkgKyAoaXBoLT5paGw8PDIpKTsKKwkJaWYgKCgodW5zaWduZWQgY2hhciAqKSh0Y3BoKzEpKSA+PSBza2JfZGF0YV9lbmQpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImRpdmVydDogbWFsZm9ybWVkIFRDUCBwYWNrZXQgIVxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBEaXZlcnQgc29tZSB0Y3AgZHN0L3NyYyBwb3J0cyBvbmx5ID8qLworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0RJVkVSVF9QT1JUUzsgaSsrKSB7CisJCQlkc3QgPSBkaXZlcnQtPnRjcF9kc3RbaV07CisJCQlzcmMgPSBkaXZlcnQtPnRjcF9zcmNbaV07CisJCQlpZiAoKGRzdCAmJiBkc3QgPT0gdGNwaC0+ZGVzdCkgfHwKKwkJCSAgICAoc3JjICYmIHNyYyA9PSB0Y3BoLT5zb3VyY2UpKSB7CisJCQkJRVRIX0RJVkVSVF9GUkFNRShza2IpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCS8qIERpdmVydCBhbGwgVURQIGZyYW1lcyA/ICovCisJY2FzZSBJUFBST1RPX1VEUDoKKwkJaWYgKGRpdmVydC0+cHJvdG9zICYgRElWRVJUX1BST1RPX1VEUCkgeworCQkJRVRIX0RJVkVSVF9GUkFNRShza2IpOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogQ2hlY2sgZm9yIHBvc3NpYmxlIChtYWxpY2lvdXNseSkgbWFsZm9ybWVkIElQCisJCSAqIHBhY2tldCAodGhhbmtzIERhdmUpCisJCSAqLworCQl1ZHBoID0gKHN0cnVjdCB1ZHBoZHIgKikKKwkJCSgoKHVuc2lnbmVkIGNoYXIgKilpcGgpICsgKGlwaC0+aWhsPDwyKSk7CisJCWlmICgoKHVuc2lnbmVkIGNoYXIgKikodWRwaCsxKSkgPj0gc2tiX2RhdGFfZW5kKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgImRpdmVydDogbWFsZm9ybWVkIFVEUCBwYWNrZXQgIVxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBEaXZlcnQgc29tZSB1ZHAgZHN0L3NyYyBwb3J0cyBvbmx5ID8gKi8KKwkJZm9yIChpID0gMDsgaSA8IE1BWF9ESVZFUlRfUE9SVFM7IGkrKykgeworCQkJZHN0ID0gZGl2ZXJ0LT51ZHBfZHN0W2ldOworCQkJc3JjID0gZGl2ZXJ0LT51ZHBfc3JjW2ldOworCQkJaWYgKChkc3QgJiYgZHN0ID09IHVkcGgtPmRlc3QpIHx8CisJCQkgICAgKHNyYyAmJiBzcmMgPT0gdWRwaC0+c291cmNlKSkgeworCQkJCUVUSF9ESVZFUlRfRlJBTUUoc2tiKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorfQpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZXRodG9vbC5jIGIvbmV0L2NvcmUvZXRodG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNWZkZTkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvY29yZS9ldGh0b29sLmMKQEAgLTAsMCArMSw4MTkgQEAKKy8qCisgKiBuZXQvY29yZS9ldGh0b29sLmMgLSBFdGh0b29sIGlvY3RsIGhhbmRsZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNYXR0aGV3IFdpbGNveCA8bWF0dGhld0B3aWwuY3g+CisgKgorICogVGhpcyBmaWxlIGlzIHdoZXJlIHdlIGNhbGwgYWxsIHRoZSBldGh0b29sX29wcyBjb21tYW5kcyB0byBnZXQKKyAqIHRoZSBpbmZvcm1hdGlvbiBldGh0b29sIG5lZWRzLiAgV2UgZmFsbCBiYWNrIHRvIGNhbGxpbmcgZG9faW9jdGwoKQorICogZm9yIGRyaXZlcnMgd2hpY2ggaGF2ZW4ndCBiZWVuIGNvbnZlcnRlZCB0byBldGh0b29sX29wcyB5ZXQuCisgKgorICogSXQncyBHUEwsIHN0dXBpZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKiAKKyAqIFNvbWUgdXNlZnVsIGV0aHRvb2xfb3BzIG1ldGhvZHMgdGhhdCdyZSBkZXZpY2UgaW5kZXBlbmRlbnQuCisgKiBJZiB3ZSBmaW5kIHRoYXQgYWxsIGRyaXZlcnMgd2FudCB0byBkbyB0aGUgc2FtZSB0aGluZyBoZXJlLAorICogd2UgY2FuIHR1cm4gdGhlc2UgaW50byBkZXZfKCkgZnVuY3Rpb24gY2FsbHMuCisgKi8KKwordTMyIGV0aHRvb2xfb3BfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gbmV0aWZfY2Fycmllcl9vayhkZXYpID8gMSA6IDA7Cit9CisKK3UzMiBldGh0b29sX29wX2dldF90eF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9JUF9DU1VNKSAhPSAwOworfQorCitpbnQgZXRodG9vbF9vcF9zZXRfdHhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKK3sKKwlpZiAoZGF0YSkKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0lQX0NTVU07CisJZWxzZQorCQlkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX0lQX0NTVU07CisKKwlyZXR1cm4gMDsKK30KKwordTMyIGV0aHRvb2xfb3BfZ2V0X3NnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9TRykgIT0gMDsKK30KKworaW50IGV0aHRvb2xfb3Bfc2V0X3NnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQoreworCWlmIChkYXRhKQorCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0c7CisJZWxzZQorCQlkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX1NHOworCisJcmV0dXJuIDA7Cit9CisKK3UzMiBldGh0b29sX29wX2dldF90c28oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1RTTykgIT0gMDsKK30KKworaW50IGV0aHRvb2xfb3Bfc2V0X3RzbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKK3sKKwlpZiAoZGF0YSkKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzsKKwllbHNlCisJCWRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfVFNPOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEhhbmRsZXJzIGZvciBlYWNoIGV0aHRvb2wgY29tbWFuZCAqLworCitzdGF0aWMgaW50IGV0aHRvb2xfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgX191c2VyICp1c2VyYWRkcikKK3sKKwlzdHJ1Y3QgZXRodG9vbF9jbWQgY21kID0geyBFVEhUT09MX0dTRVQgfTsKKwlpbnQgZXJyOworCisJaWYgKCFkZXYtPmV0aHRvb2xfb3BzLT5nZXRfc2V0dGluZ3MpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWVyciA9IGRldi0+ZXRodG9vbF9vcHMtPmdldF9zZXR0aW5ncyhkZXYsICZjbWQpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGNvcHlfdG9fdXNlcih1c2VyYWRkciwgJmNtZCwgc2l6ZW9mKGNtZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBldGh0b29sX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkIF9fdXNlciAqdXNlcmFkZHIpCit7CisJc3RydWN0IGV0aHRvb2xfY21kIGNtZDsKKworCWlmICghZGV2LT5ldGh0b29sX29wcy0+c2V0X3NldHRpbmdzKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgdXNlcmFkZHIsIHNpemVvZihjbWQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gZGV2LT5ldGh0b29sX29wcy0+c2V0X3NldHRpbmdzKGRldiwgJmNtZCk7Cit9CisKK3N0YXRpYyBpbnQgZXRodG9vbF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkIF9fdXNlciAqdXNlcmFkZHIpCit7CisJc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyBpbmZvOworCXN0cnVjdCBldGh0b29sX29wcyAqb3BzID0gZGV2LT5ldGh0b29sX29wczsKKworCWlmICghb3BzLT5nZXRfZHJ2aW5mbykKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCWluZm8uY21kID0gRVRIVE9PTF9HRFJWSU5GTzsKKwlvcHMtPmdldF9kcnZpbmZvKGRldiwgJmluZm8pOworCisJaWYgKG9wcy0+c2VsZl90ZXN0X2NvdW50KQorCQlpbmZvLnRlc3RpbmZvX2xlbiA9IG9wcy0+c2VsZl90ZXN0X2NvdW50KGRldik7CisJaWYgKG9wcy0+Z2V0X3N0YXRzX2NvdW50KQorCQlpbmZvLm5fc3RhdHMgPSBvcHMtPmdldF9zdGF0c19jb3VudChkZXYpOworCWlmIChvcHMtPmdldF9yZWdzX2xlbikKKwkJaW5mby5yZWdkdW1wX2xlbiA9IG9wcy0+Z2V0X3JlZ3NfbGVuKGRldik7CisJaWYgKG9wcy0+Z2V0X2VlcHJvbV9sZW4pCisJCWluZm8uZWVkdW1wX2xlbiA9IG9wcy0+Z2V0X2VlcHJvbV9sZW4oZGV2KTsKKworCWlmIChjb3B5X3RvX3VzZXIodXNlcmFkZHIsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBldGh0b29sX2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgX191c2VyICp1c2VyYWRkcikKK3sKKwlzdHJ1Y3QgZXRodG9vbF9yZWdzIHJlZ3M7CisJc3RydWN0IGV0aHRvb2xfb3BzICpvcHMgPSBkZXYtPmV0aHRvb2xfb3BzOworCXZvaWQgKnJlZ2J1ZjsKKwlpbnQgcmVnbGVuLCByZXQ7CisKKwlpZiAoIW9wcy0+Z2V0X3JlZ3MgfHwgIW9wcy0+Z2V0X3JlZ3NfbGVuKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlZ3MsIHVzZXJhZGRyLCBzaXplb2YocmVncykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJlZ2xlbiA9IG9wcy0+Z2V0X3JlZ3NfbGVuKGRldik7CisJaWYgKHJlZ3MubGVuID4gcmVnbGVuKQorCQlyZWdzLmxlbiA9IHJlZ2xlbjsKKworCXJlZ2J1ZiA9IGttYWxsb2MocmVnbGVuLCBHRlBfVVNFUik7CisJaWYgKCFyZWdidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJb3BzLT5nZXRfcmVncyhkZXYsICZyZWdzLCByZWdidWYpOworCisJcmV0ID0gLUVGQVVMVDsKKwlpZiAoY29weV90b191c2VyKHVzZXJhZGRyLCAmcmVncywgc2l6ZW9mKHJlZ3MpKSkKKwkJZ290byBvdXQ7CisJdXNlcmFkZHIgKz0gb2Zmc2V0b2Yoc3RydWN0IGV0aHRvb2xfcmVncywgZGF0YSk7CisJaWYgKGNvcHlfdG9fdXNlcih1c2VyYWRkciwgcmVnYnVmLCByZWdzLmxlbikpCisJCWdvdG8gb3V0OworCXJldCA9IDA7CisKKyBvdXQ6CisJa2ZyZWUocmVnYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGV0aHRvb2xfZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyIF9fdXNlciAqdXNlcmFkZHIpCit7CisJc3RydWN0IGV0aHRvb2xfd29saW5mbyB3b2wgPSB7IEVUSFRPT0xfR1dPTCB9OworCisJaWYgKCFkZXYtPmV0aHRvb2xfb3BzLT5nZXRfd29sKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlkZXYtPmV0aHRvb2xfb3BzLT5nZXRfd29sKGRldiwgJndvbCk7CisKKwlpZiAoY29weV90b191c2VyKHVzZXJhZGRyLCAmd29sLCBzaXplb2Yod29sKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV0aHRvb2xfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyIF9fdXNlciAqdXNlcmFkZHIpCit7CisJc3RydWN0IGV0aHRvb2xfd29saW5mbyB3b2w7CisKKwlpZiAoIWRldi0+ZXRodG9vbF9vcHMtPnNldF93b2wpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmd29sLCB1c2VyYWRkciwgc2l6ZW9mKHdvbCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkZXYtPmV0aHRvb2xfb3BzLT5zZXRfd29sKGRldiwgJndvbCk7Cit9CisKK3N0YXRpYyBpbnQgZXRodG9vbF9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciBfX3VzZXIgKnVzZXJhZGRyKQoreworCXN0cnVjdCBldGh0b29sX3ZhbHVlIGVkYXRhID0geyBFVEhUT09MX0dNU0dMVkwgfTsKKworCWlmICghZGV2LT5ldGh0b29sX29wcy0+Z2V0X21zZ2xldmVsKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwllZGF0YS5kYXRhID0gZGV2LT5ldGh0b29sX29wcy0+Z2V0X21zZ2xldmVsKGRldik7CisKKwlpZiAoY29weV90b191c2VyKHVzZXJhZGRyLCAmZWRhdGEsIHNpemVvZihlZGF0YSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBldGh0b29sX3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyIF9fdXNlciAqdXNlcmFkZHIpCit7CisJc3RydWN0IGV0aHRvb2xfdmFsdWUgZWRhdGE7CisKKwlpZiAoIWRldi0+ZXRodG9vbF9vcHMtPnNldF9tc2dsZXZlbCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZlZGF0YSwgdXNlcmFkZHIsIHNpemVvZihlZGF0YSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRldi0+ZXRodG9vbF9vcHMtPnNldF9tc2dsZXZlbChkZXYsIGVkYXRhLmRhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV0aHRvb2xfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmICghZGV2LT5ldGh0b29sX29wcy0+bndheV9yZXNldCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJcmV0dXJuIGRldi0+ZXRodG9vbF9vcHMtPm53YXlfcmVzZXQoZGV2KTsKK30KKworc3RhdGljIGludCBldGh0b29sX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgX191c2VyICp1c2VyYWRkcikKK3sKKwlzdHJ1Y3QgZXRodG9vbF92YWx1ZSBlZGF0YSA9IHsgRVRIVE9PTF9HTElOSyB9OworCisJaWYgKCFkZXYtPmV0aHRvb2xfb3BzLT5nZXRfbGluaykKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJZWRhdGEuZGF0YSA9IGRldi0+ZXRodG9vbF9vcHMtPmdldF9saW5rKGRldik7CisKKwlpZiAoY29weV90b191c2VyKHVzZXJhZGRyLCAmZWRhdGEsIHNpemVvZihlZGF0YSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBldGh0b29sX2dldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCBfX3VzZXIgKnVzZXJhZGRyKQoreworCXN0cnVjdCBldGh0b29sX2VlcHJvbSBlZXByb207CisJc3RydWN0IGV0aHRvb2xfb3BzICpvcHMgPSBkZXYtPmV0aHRvb2xfb3BzOworCXU4ICpkYXRhOworCWludCByZXQ7CisKKwlpZiAoIW9wcy0+Z2V0X2VlcHJvbSB8fCAhb3BzLT5nZXRfZWVwcm9tX2xlbikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZlZXByb20sIHVzZXJhZGRyLCBzaXplb2YoZWVwcm9tKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogQ2hlY2sgZm9yIHdyYXAgYW5kIHplcm8gKi8KKwlpZiAoZWVwcm9tLm9mZnNldCArIGVlcHJvbS5sZW4gPD0gZWVwcm9tLm9mZnNldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBDaGVjayBmb3IgZXhjZWVkaW5nIHRvdGFsIGVlcHJvbSBsZW4gKi8KKwlpZiAoZWVwcm9tLm9mZnNldCArIGVlcHJvbS5sZW4gPiBvcHMtPmdldF9lZXByb21fbGVuKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJZGF0YSA9IGttYWxsb2MoZWVwcm9tLmxlbiwgR0ZQX1VTRVIpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcihkYXRhLCB1c2VyYWRkciArIHNpemVvZihlZXByb20pLCBlZXByb20ubGVuKSkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBvcHMtPmdldF9lZXByb20oZGV2LCAmZWVwcm9tLCBkYXRhKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IC1FRkFVTFQ7CisJaWYgKGNvcHlfdG9fdXNlcih1c2VyYWRkciwgJmVlcHJvbSwgc2l6ZW9mKGVlcHJvbSkpKQorCQlnb3RvIG91dDsKKwlpZiAoY29weV90b191c2VyKHVzZXJhZGRyICsgc2l6ZW9mKGVlcHJvbSksIGRhdGEsIGVlcHJvbS5sZW4pKQorCQlnb3RvIG91dDsKKwlyZXQgPSAwOworCisgb3V0OgorCWtmcmVlKGRhdGEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZXRodG9vbF9zZXRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgX191c2VyICp1c2VyYWRkcikKK3sKKwlzdHJ1Y3QgZXRodG9vbF9lZXByb20gZWVwcm9tOworCXN0cnVjdCBldGh0b29sX29wcyAqb3BzID0gZGV2LT5ldGh0b29sX29wczsKKwl1OCAqZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKCFvcHMtPnNldF9lZXByb20gfHwgIW9wcy0+Z2V0X2VlcHJvbV9sZW4pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZWVwcm9tLCB1c2VyYWRkciwgc2l6ZW9mKGVlcHJvbSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIENoZWNrIGZvciB3cmFwIGFuZCB6ZXJvICovCisJaWYgKGVlcHJvbS5vZmZzZXQgKyBlZXByb20ubGVuIDw9IGVlcHJvbS5vZmZzZXQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ2hlY2sgZm9yIGV4Y2VlZGluZyB0b3RhbCBlZXByb20gbGVuICovCisJaWYgKGVlcHJvbS5vZmZzZXQgKyBlZXByb20ubGVuID4gb3BzLT5nZXRfZWVwcm9tX2xlbihkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRhdGEgPSBrbWFsbG9jKGVlcHJvbS5sZW4sIEdGUF9VU0VSKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gLUVGQVVMVDsKKwlpZiAoY29weV9mcm9tX3VzZXIoZGF0YSwgdXNlcmFkZHIgKyBzaXplb2YoZWVwcm9tKSwgZWVwcm9tLmxlbikpCisJCWdvdG8gb3V0OworCisJcmV0ID0gb3BzLT5zZXRfZWVwcm9tKGRldiwgJmVlcHJvbSwgZGF0YSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpZiAoY29weV90b191c2VyKHVzZXJhZGRyICsgc2l6ZW9mKGVlcHJvbSksIGRhdGEsIGVlcHJvbS5sZW4pKQorCQlyZXQgPSAtRUZBVUxUOworCisgb3V0OgorCWtmcmVlKGRhdGEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZXRodG9vbF9nZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCBfX3VzZXIgKnVzZXJhZGRyKQoreworCXN0cnVjdCBldGh0b29sX2NvYWxlc2NlIGNvYWxlc2NlID0geyBFVEhUT09MX0dDT0FMRVNDRSB9OworCisJaWYgKCFkZXYtPmV0aHRvb2xfb3BzLT5nZXRfY29hbGVzY2UpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWRldi0+ZXRodG9vbF9vcHMtPmdldF9jb2FsZXNjZShkZXYsICZjb2FsZXNjZSk7CisKKwlpZiAoY29weV90b191c2VyKHVzZXJhZGRyLCAmY29hbGVzY2UsIHNpemVvZihjb2FsZXNjZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBldGh0b29sX3NldF9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkIF9fdXNlciAqdXNlcmFkZHIpCit7CisJc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgY29hbGVzY2U7CisKKwlpZiAoIWRldi0+ZXRodG9vbF9vcHMtPmdldF9jb2FsZXNjZSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjb2FsZXNjZSwgdXNlcmFkZHIsIHNpemVvZihjb2FsZXNjZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkZXYtPmV0aHRvb2xfb3BzLT5zZXRfY29hbGVzY2UoZGV2LCAmY29hbGVzY2UpOworfQorCitzdGF0aWMgaW50IGV0aHRvb2xfZ2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkIF9fdXNlciAqdXNlcmFkZHIpCit7CisJc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtIHJpbmdwYXJhbSA9IHsgRVRIVE9PTF9HUklOR1BBUkFNIH07CisKKwlpZiAoIWRldi0+ZXRodG9vbF9vcHMtPmdldF9yaW5ncGFyYW0pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWRldi0+ZXRodG9vbF9vcHMtPmdldF9yaW5ncGFyYW0oZGV2LCAmcmluZ3BhcmFtKTsKKworCWlmIChjb3B5X3RvX3VzZXIodXNlcmFkZHIsICZyaW5ncGFyYW0sIHNpemVvZihyaW5ncGFyYW0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXRodG9vbF9zZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgX191c2VyICp1c2VyYWRkcikKK3sKKwlzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gcmluZ3BhcmFtOworCisJaWYgKCFkZXYtPmV0aHRvb2xfb3BzLT5zZXRfcmluZ3BhcmFtKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJpbmdwYXJhbSwgdXNlcmFkZHIsIHNpemVvZihyaW5ncGFyYW0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gZGV2LT5ldGh0b29sX29wcy0+c2V0X3JpbmdwYXJhbShkZXYsICZyaW5ncGFyYW0pOworfQorCitzdGF0aWMgaW50IGV0aHRvb2xfZ2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCBfX3VzZXIgKnVzZXJhZGRyKQoreworCXN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gcGF1c2VwYXJhbSA9IHsgRVRIVE9PTF9HUEFVU0VQQVJBTSB9OworCisJaWYgKCFkZXYtPmV0aHRvb2xfb3BzLT5nZXRfcGF1c2VwYXJhbSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJZGV2LT5ldGh0b29sX29wcy0+Z2V0X3BhdXNlcGFyYW0oZGV2LCAmcGF1c2VwYXJhbSk7CisKKwlpZiAoY29weV90b191c2VyKHVzZXJhZGRyLCAmcGF1c2VwYXJhbSwgc2l6ZW9mKHBhdXNlcGFyYW0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXRodG9vbF9zZXRfcGF1c2VwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkIF9fdXNlciAqdXNlcmFkZHIpCit7CisJc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSBwYXVzZXBhcmFtOworCisJaWYgKCFkZXYtPmV0aHRvb2xfb3BzLT5nZXRfcGF1c2VwYXJhbSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZwYXVzZXBhcmFtLCB1c2VyYWRkciwgc2l6ZW9mKHBhdXNlcGFyYW0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gZGV2LT5ldGh0b29sX29wcy0+c2V0X3BhdXNlcGFyYW0oZGV2LCAmcGF1c2VwYXJhbSk7Cit9CisKK3N0YXRpYyBpbnQgZXRodG9vbF9nZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyIF9fdXNlciAqdXNlcmFkZHIpCit7CisJc3RydWN0IGV0aHRvb2xfdmFsdWUgZWRhdGEgPSB7IEVUSFRPT0xfR1JYQ1NVTSB9OworCisJaWYgKCFkZXYtPmV0aHRvb2xfb3BzLT5nZXRfcnhfY3N1bSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJZWRhdGEuZGF0YSA9IGRldi0+ZXRodG9vbF9vcHMtPmdldF9yeF9jc3VtKGRldik7CisKKwlpZiAoY29weV90b191c2VyKHVzZXJhZGRyLCAmZWRhdGEsIHNpemVvZihlZGF0YSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBldGh0b29sX3NldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgX191c2VyICp1c2VyYWRkcikKK3sKKwlzdHJ1Y3QgZXRodG9vbF92YWx1ZSBlZGF0YTsKKworCWlmICghZGV2LT5ldGh0b29sX29wcy0+c2V0X3J4X2NzdW0pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZWRhdGEsIHVzZXJhZGRyLCBzaXplb2YoZWRhdGEpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkZXYtPmV0aHRvb2xfb3BzLT5zZXRfcnhfY3N1bShkZXYsIGVkYXRhLmRhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV0aHRvb2xfZ2V0X3R4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciBfX3VzZXIgKnVzZXJhZGRyKQoreworCXN0cnVjdCBldGh0b29sX3ZhbHVlIGVkYXRhID0geyBFVEhUT09MX0dUWENTVU0gfTsKKworCWlmICghZGV2LT5ldGh0b29sX29wcy0+Z2V0X3R4X2NzdW0pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWVkYXRhLmRhdGEgPSBkZXYtPmV0aHRvb2xfb3BzLT5nZXRfdHhfY3N1bShkZXYpOworCisJaWYgKGNvcHlfdG9fdXNlcih1c2VyYWRkciwgJmVkYXRhLCBzaXplb2YoZWRhdGEpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19ldGh0b29sX3NldF9zZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKK3sKKwlpbnQgZXJyOworCisJaWYgKCFkYXRhICYmIGRldi0+ZXRodG9vbF9vcHMtPnNldF90c28pIHsKKwkJZXJyID0gZGV2LT5ldGh0b29sX29wcy0+c2V0X3RzbyhkZXYsIDApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gZGV2LT5ldGh0b29sX29wcy0+c2V0X3NnKGRldiwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgZXRodG9vbF9zZXRfdHhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyIF9fdXNlciAqdXNlcmFkZHIpCit7CisJc3RydWN0IGV0aHRvb2xfdmFsdWUgZWRhdGE7CisJaW50IGVycjsKKworCWlmICghZGV2LT5ldGh0b29sX29wcy0+c2V0X3R4X2NzdW0pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZWRhdGEsIHVzZXJhZGRyLCBzaXplb2YoZWRhdGEpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoIWVkYXRhLmRhdGEgJiYgZGV2LT5ldGh0b29sX29wcy0+c2V0X3NnKSB7CisJCWVyciA9IF9fZXRodG9vbF9zZXRfc2coZGV2LCAwKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIGRldi0+ZXRodG9vbF9vcHMtPnNldF90eF9jc3VtKGRldiwgZWRhdGEuZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgZXRodG9vbF9nZXRfc2coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciBfX3VzZXIgKnVzZXJhZGRyKQoreworCXN0cnVjdCBldGh0b29sX3ZhbHVlIGVkYXRhID0geyBFVEhUT09MX0dTRyB9OworCisJaWYgKCFkZXYtPmV0aHRvb2xfb3BzLT5nZXRfc2cpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWVkYXRhLmRhdGEgPSBkZXYtPmV0aHRvb2xfb3BzLT5nZXRfc2coZGV2KTsKKworCWlmIChjb3B5X3RvX3VzZXIodXNlcmFkZHIsICZlZGF0YSwgc2l6ZW9mKGVkYXRhKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV0aHRvb2xfc2V0X3NnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgX191c2VyICp1c2VyYWRkcikKK3sKKwlzdHJ1Y3QgZXRodG9vbF92YWx1ZSBlZGF0YTsKKworCWlmICghZGV2LT5ldGh0b29sX29wcy0+c2V0X3NnKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmVkYXRhLCB1c2VyYWRkciwgc2l6ZW9mKGVkYXRhKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGVkYXRhLmRhdGEgJiYgCisJICAgICEoZGV2LT5mZWF0dXJlcyAmIChORVRJRl9GX0lQX0NTVU0gfAorCQkJICAgICAgIE5FVElGX0ZfTk9fQ1NVTSB8CisJCQkgICAgICAgTkVUSUZfRl9IV19DU1VNKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIF9fZXRodG9vbF9zZXRfc2coZGV2LCBlZGF0YS5kYXRhKTsKK30KKworc3RhdGljIGludCBldGh0b29sX2dldF90c28oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciBfX3VzZXIgKnVzZXJhZGRyKQoreworCXN0cnVjdCBldGh0b29sX3ZhbHVlIGVkYXRhID0geyBFVEhUT09MX0dUU08gfTsKKworCWlmICghZGV2LT5ldGh0b29sX29wcy0+Z2V0X3RzbykKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJZWRhdGEuZGF0YSA9IGRldi0+ZXRodG9vbF9vcHMtPmdldF90c28oZGV2KTsKKworCWlmIChjb3B5X3RvX3VzZXIodXNlcmFkZHIsICZlZGF0YSwgc2l6ZW9mKGVkYXRhKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV0aHRvb2xfc2V0X3RzbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyIF9fdXNlciAqdXNlcmFkZHIpCit7CisJc3RydWN0IGV0aHRvb2xfdmFsdWUgZWRhdGE7CisKKwlpZiAoIWRldi0+ZXRodG9vbF9vcHMtPnNldF90c28pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZWRhdGEsIHVzZXJhZGRyLCBzaXplb2YoZWRhdGEpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoZWRhdGEuZGF0YSAmJiAhKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1NHKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gZGV2LT5ldGh0b29sX29wcy0+c2V0X3RzbyhkZXYsIGVkYXRhLmRhdGEpOworfQorCitzdGF0aWMgaW50IGV0aHRvb2xfc2VsZl90ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgX191c2VyICp1c2VyYWRkcikKK3sKKwlzdHJ1Y3QgZXRodG9vbF90ZXN0IHRlc3Q7CisJc3RydWN0IGV0aHRvb2xfb3BzICpvcHMgPSBkZXYtPmV0aHRvb2xfb3BzOworCXU2NCAqZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKCFvcHMtPnNlbGZfdGVzdCB8fCAhb3BzLT5zZWxmX3Rlc3RfY291bnQpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdGVzdCwgdXNlcmFkZHIsIHNpemVvZih0ZXN0KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJdGVzdC5sZW4gPSBvcHMtPnNlbGZfdGVzdF9jb3VudChkZXYpOworCWRhdGEgPSBrbWFsbG9jKHRlc3QubGVuICogc2l6ZW9mKHU2NCksIEdGUF9VU0VSKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJb3BzLT5zZWxmX3Rlc3QoZGV2LCAmdGVzdCwgZGF0YSk7CisKKwlyZXQgPSAtRUZBVUxUOworCWlmIChjb3B5X3RvX3VzZXIodXNlcmFkZHIsICZ0ZXN0LCBzaXplb2YodGVzdCkpKQorCQlnb3RvIG91dDsKKwl1c2VyYWRkciArPSBzaXplb2YodGVzdCk7CisJaWYgKGNvcHlfdG9fdXNlcih1c2VyYWRkciwgZGF0YSwgdGVzdC5sZW4gKiBzaXplb2YodTY0KSkpCisJCWdvdG8gb3V0OworCXJldCA9IDA7CisKKyBvdXQ6CisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBldGh0b29sX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgX191c2VyICp1c2VyYWRkcikKK3sKKwlzdHJ1Y3QgZXRodG9vbF9nc3RyaW5ncyBnc3RyaW5nczsKKwlzdHJ1Y3QgZXRodG9vbF9vcHMgKm9wcyA9IGRldi0+ZXRodG9vbF9vcHM7CisJdTggKmRhdGE7CisJaW50IHJldDsKKworCWlmICghb3BzLT5nZXRfc3RyaW5ncykKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZnc3RyaW5ncywgdXNlcmFkZHIsIHNpemVvZihnc3RyaW5ncykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaCAoZ3N0cmluZ3Muc3RyaW5nX3NldCkgeworCWNhc2UgRVRIX1NTX1RFU1Q6CisJCWlmICghb3BzLT5zZWxmX3Rlc3RfY291bnQpCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCWdzdHJpbmdzLmxlbiA9IG9wcy0+c2VsZl90ZXN0X2NvdW50KGRldik7CisJCWJyZWFrOworCWNhc2UgRVRIX1NTX1NUQVRTOgorCQlpZiAoIW9wcy0+Z2V0X3N0YXRzX2NvdW50KQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQlnc3RyaW5ncy5sZW4gPSBvcHMtPmdldF9zdGF0c19jb3VudChkZXYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkYXRhID0ga21hbGxvYyhnc3RyaW5ncy5sZW4gKiBFVEhfR1NUUklOR19MRU4sIEdGUF9VU0VSKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJb3BzLT5nZXRfc3RyaW5ncyhkZXYsIGdzdHJpbmdzLnN0cmluZ19zZXQsIGRhdGEpOworCisJcmV0ID0gLUVGQVVMVDsKKwlpZiAoY29weV90b191c2VyKHVzZXJhZGRyLCAmZ3N0cmluZ3MsIHNpemVvZihnc3RyaW5ncykpKQorCQlnb3RvIG91dDsKKwl1c2VyYWRkciArPSBzaXplb2YoZ3N0cmluZ3MpOworCWlmIChjb3B5X3RvX3VzZXIodXNlcmFkZHIsIGRhdGEsIGdzdHJpbmdzLmxlbiAqIEVUSF9HU1RSSU5HX0xFTikpCisJCWdvdG8gb3V0OworCXJldCA9IDA7CisKKyBvdXQ6CisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBldGh0b29sX3BoeXNfaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCBfX3VzZXIgKnVzZXJhZGRyKQoreworCXN0cnVjdCBldGh0b29sX3ZhbHVlIGlkOworCisJaWYgKCFkZXYtPmV0aHRvb2xfb3BzLT5waHlzX2lkKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmlkLCB1c2VyYWRkciwgc2l6ZW9mKGlkKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGRldi0+ZXRodG9vbF9vcHMtPnBoeXNfaWQoZGV2LCBpZC5kYXRhKTsKK30KKworc3RhdGljIGludCBldGh0b29sX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkIF9fdXNlciAqdXNlcmFkZHIpCit7CisJc3RydWN0IGV0aHRvb2xfc3RhdHMgc3RhdHM7CisJc3RydWN0IGV0aHRvb2xfb3BzICpvcHMgPSBkZXYtPmV0aHRvb2xfb3BzOworCXU2NCAqZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKCFvcHMtPmdldF9ldGh0b29sX3N0YXRzIHx8ICFvcHMtPmdldF9zdGF0c19jb3VudCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzdGF0cywgdXNlcmFkZHIsIHNpemVvZihzdGF0cykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN0YXRzLm5fc3RhdHMgPSBvcHMtPmdldF9zdGF0c19jb3VudChkZXYpOworCWRhdGEgPSBrbWFsbG9jKHN0YXRzLm5fc3RhdHMgKiBzaXplb2YodTY0KSwgR0ZQX1VTRVIpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlvcHMtPmdldF9ldGh0b29sX3N0YXRzKGRldiwgJnN0YXRzLCBkYXRhKTsKKworCXJldCA9IC1FRkFVTFQ7CisJaWYgKGNvcHlfdG9fdXNlcih1c2VyYWRkciwgJnN0YXRzLCBzaXplb2Yoc3RhdHMpKSkKKwkJZ290byBvdXQ7CisJdXNlcmFkZHIgKz0gc2l6ZW9mKHN0YXRzKTsKKwlpZiAoY29weV90b191c2VyKHVzZXJhZGRyLCBkYXRhLCBzdGF0cy5uX3N0YXRzICogc2l6ZW9mKHU2NCkpKQorCQlnb3RvIG91dDsKKwlyZXQgPSAwOworCisgb3V0OgorCWtmcmVlKGRhdGEpOworCXJldHVybiByZXQ7Cit9CisKKy8qIFRoZSBtYWluIGVudHJ5IHBvaW50IGluIHRoaXMgZmlsZS4gIENhbGxlZCBmcm9tIG5ldC9jb3JlL2Rldi5jICovCisKK2ludCBkZXZfZXRodG9vbChzdHJ1Y3QgaWZyZXEgKmlmcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gX19kZXZfZ2V0X2J5X25hbWUoaWZyLT5pZnJfbmFtZSk7CisJdm9pZCBfX3VzZXIgKnVzZXJhZGRyID0gaWZyLT5pZnJfZGF0YTsKKwl1MzIgZXRoY21kOworCWludCByYzsKKworCS8qCisJICogWFhYOiBUaGlzIGNhbiBiZSBwdXNoZWQgZG93biBpbnRvIHRoZSBldGh0b29sXyogaGFuZGxlcnMgdGhhdAorCSAqIG5lZWQgaXQuICBLZWVwIGV4aXN0aW5nIGJlaGF2aW91ciBmb3IgdGhlIG1vbWVudC4KKwkgKi8KKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoIWRldiB8fCAhbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWRldi0+ZXRodG9vbF9vcHMpCisJCWdvdG8gaW9jdGw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmV0aGNtZCwgdXNlcmFkZHIsIHNpemVvZiAoZXRoY21kKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYoZGV2LT5ldGh0b29sX29wcy0+YmVnaW4pCisJCWlmICgocmMgPSBkZXYtPmV0aHRvb2xfb3BzLT5iZWdpbihkZXYpKSA8IDApCisJCQlyZXR1cm4gcmM7CisKKwlzd2l0Y2ggKGV0aGNtZCkgeworCWNhc2UgRVRIVE9PTF9HU0VUOgorCQlyYyA9IGV0aHRvb2xfZ2V0X3NldHRpbmdzKGRldiwgdXNlcmFkZHIpOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfU1NFVDoKKwkJcmMgPSBldGh0b29sX3NldF9zZXR0aW5ncyhkZXYsIHVzZXJhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBFVEhUT09MX0dEUlZJTkZPOgorCQlyYyA9IGV0aHRvb2xfZ2V0X2RydmluZm8oZGV2LCB1c2VyYWRkcik7CisKKwkJYnJlYWs7CisJY2FzZSBFVEhUT09MX0dSRUdTOgorCQlyYyA9IGV0aHRvb2xfZ2V0X3JlZ3MoZGV2LCB1c2VyYWRkcik7CisJCWJyZWFrOworCWNhc2UgRVRIVE9PTF9HV09MOgorCQlyYyA9IGV0aHRvb2xfZ2V0X3dvbChkZXYsIHVzZXJhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBFVEhUT09MX1NXT0w6CisJCXJjID0gZXRodG9vbF9zZXRfd29sKGRldiwgdXNlcmFkZHIpOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfR01TR0xWTDoKKwkJcmMgPSBldGh0b29sX2dldF9tc2dsZXZlbChkZXYsIHVzZXJhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBFVEhUT09MX1NNU0dMVkw6CisJCXJjID0gZXRodG9vbF9zZXRfbXNnbGV2ZWwoZGV2LCB1c2VyYWRkcik7CisJCWJyZWFrOworCWNhc2UgRVRIVE9PTF9OV0FZX1JTVDoKKwkJcmMgPSBldGh0b29sX253YXlfcmVzZXQoZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBFVEhUT09MX0dMSU5LOgorCQlyYyA9IGV0aHRvb2xfZ2V0X2xpbmsoZGV2LCB1c2VyYWRkcik7CisJCWJyZWFrOworCWNhc2UgRVRIVE9PTF9HRUVQUk9NOgorCQlyYyA9IGV0aHRvb2xfZ2V0X2VlcHJvbShkZXYsIHVzZXJhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBFVEhUT09MX1NFRVBST006CisJCXJjID0gZXRodG9vbF9zZXRfZWVwcm9tKGRldiwgdXNlcmFkZHIpOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfR0NPQUxFU0NFOgorCQlyYyA9IGV0aHRvb2xfZ2V0X2NvYWxlc2NlKGRldiwgdXNlcmFkZHIpOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfU0NPQUxFU0NFOgorCQlyYyA9IGV0aHRvb2xfc2V0X2NvYWxlc2NlKGRldiwgdXNlcmFkZHIpOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfR1JJTkdQQVJBTToKKwkJcmMgPSBldGh0b29sX2dldF9yaW5ncGFyYW0oZGV2LCB1c2VyYWRkcik7CisJCWJyZWFrOworCWNhc2UgRVRIVE9PTF9TUklOR1BBUkFNOgorCQlyYyA9IGV0aHRvb2xfc2V0X3JpbmdwYXJhbShkZXYsIHVzZXJhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBFVEhUT09MX0dQQVVTRVBBUkFNOgorCQlyYyA9IGV0aHRvb2xfZ2V0X3BhdXNlcGFyYW0oZGV2LCB1c2VyYWRkcik7CisJCWJyZWFrOworCWNhc2UgRVRIVE9PTF9TUEFVU0VQQVJBTToKKwkJcmMgPSBldGh0b29sX3NldF9wYXVzZXBhcmFtKGRldiwgdXNlcmFkZHIpOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfR1JYQ1NVTToKKwkJcmMgPSBldGh0b29sX2dldF9yeF9jc3VtKGRldiwgdXNlcmFkZHIpOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfU1JYQ1NVTToKKwkJcmMgPSBldGh0b29sX3NldF9yeF9jc3VtKGRldiwgdXNlcmFkZHIpOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfR1RYQ1NVTToKKwkJcmMgPSBldGh0b29sX2dldF90eF9jc3VtKGRldiwgdXNlcmFkZHIpOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfU1RYQ1NVTToKKwkJcmMgPSBldGh0b29sX3NldF90eF9jc3VtKGRldiwgdXNlcmFkZHIpOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfR1NHOgorCQlyYyA9IGV0aHRvb2xfZ2V0X3NnKGRldiwgdXNlcmFkZHIpOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfU1NHOgorCQlyYyA9IGV0aHRvb2xfc2V0X3NnKGRldiwgdXNlcmFkZHIpOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfR1RTTzoKKwkJcmMgPSBldGh0b29sX2dldF90c28oZGV2LCB1c2VyYWRkcik7CisJCWJyZWFrOworCWNhc2UgRVRIVE9PTF9TVFNPOgorCQlyYyA9IGV0aHRvb2xfc2V0X3RzbyhkZXYsIHVzZXJhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBFVEhUT09MX1RFU1Q6CisJCXJjID0gZXRodG9vbF9zZWxmX3Rlc3QoZGV2LCB1c2VyYWRkcik7CisJCWJyZWFrOworCWNhc2UgRVRIVE9PTF9HU1RSSU5HUzoKKwkJcmMgPSBldGh0b29sX2dldF9zdHJpbmdzKGRldiwgdXNlcmFkZHIpOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfUEhZU19JRDoKKwkJcmMgPSBldGh0b29sX3BoeXNfaWQoZGV2LCB1c2VyYWRkcik7CisJCWJyZWFrOworCWNhc2UgRVRIVE9PTF9HU1RBVFM6CisJCXJjID0gZXRodG9vbF9nZXRfc3RhdHMoZGV2LCB1c2VyYWRkcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gIC1FT1BOT1RTVVBQOworCX0KKwkKKwlpZihkZXYtPmV0aHRvb2xfb3BzLT5jb21wbGV0ZSkKKwkJZGV2LT5ldGh0b29sX29wcy0+Y29tcGxldGUoZGV2KTsKKwlyZXR1cm4gcmM7CisKKyBpb2N0bDoKKwlpZiAoZGV2LT5kb19pb2N0bCkKKwkJcmV0dXJuIGRldi0+ZG9faW9jdGwoZGV2LCBpZnIsIFNJT0NFVEhUT09MKTsKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK0VYUE9SVF9TWU1CT0woZGV2X2V0aHRvb2wpOworRVhQT1JUX1NZTUJPTChldGh0b29sX29wX2dldF9saW5rKTsKK0VYUE9SVF9TWU1CT0woZXRodG9vbF9vcF9nZXRfc2cpOworRVhQT1JUX1NZTUJPTChldGh0b29sX29wX2dldF90c28pOworRVhQT1JUX1NZTUJPTChldGh0b29sX29wX2dldF90eF9jc3VtKTsKK0VYUE9SVF9TWU1CT0woZXRodG9vbF9vcF9zZXRfc2cpOworRVhQT1JUX1NZTUJPTChldGh0b29sX29wX3NldF90c28pOworRVhQT1JUX1NZTUJPTChldGh0b29sX29wX3NldF90eF9jc3VtKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2ZpbHRlci5jIGIvbmV0L2NvcmUvZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiODgyMAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9jb3JlL2ZpbHRlci5jCkBAIC0wLDAgKzEsNDMyIEBACisvKgorICogTGludXggU29ja2V0IEZpbHRlciAtIEtlcm5lbCBsZXZlbCBzb2NrZXQgZmlsdGVyaW5nCisgKgorICogQXV0aG9yOgorICogICAgIEpheSBTY2h1bGlzdCA8anNjaGxzdEBzYW1iYS5vcmc+CisgKgorICogQmFzZWQgb24gdGhlIGRlc2lnbiBvZjoKKyAqICAgICAtIFRoZSBCZXJrZWxleSBQYWNrZXQgRmlsdGVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBbmRpIEtsZWVuIC0gRml4IGEgZmV3IGJhZCBidWdzIGFuZCByYWNlcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9wYWNrZXQuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KKworLyogTm8gaHVycnkgaW4gdGhpcyBicmFuY2ggKi8KK3N0YXRpYyB1OCAqbG9hZF9wb2ludGVyKHN0cnVjdCBza19idWZmICpza2IsIGludCBrKQoreworCXU4ICpwdHIgPSBOVUxMOworCisJaWYgKGsgPj0gU0tGX05FVF9PRkYpCisJCXB0ciA9IHNrYi0+bmgucmF3ICsgayAtIFNLRl9ORVRfT0ZGOworCWVsc2UgaWYgKGsgPj0gU0tGX0xMX09GRikKKwkJcHRyID0gc2tiLT5tYWMucmF3ICsgayAtIFNLRl9MTF9PRkY7CisKKwlpZiAocHRyID49IHNrYi0+aGVhZCAmJiBwdHIgPCBza2ItPnRhaWwpCisJCXJldHVybiBwdHI7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICoJc2tfcnVuX2ZpbHRlcgktIAlydW4gYSBmaWx0ZXIgb24gYSBzb2NrZXQKKyAqCUBza2I6IGJ1ZmZlciB0byBydW4gdGhlIGZpbHRlciBvbgorICoJQGZpbHRlcjogZmlsdGVyIHRvIGFwcGx5CisgKglAZmxlbjogbGVuZ3RoIG9mIGZpbHRlcgorICoKKyAqIERlY29kZSBhbmQgYXBwbHkgZmlsdGVyIGluc3RydWN0aW9ucyB0byB0aGUgc2tiLT5kYXRhLgorICogUmV0dXJuIGxlbmd0aCB0byBrZWVwLCAwIGZvciBub25lLiBza2IgaXMgdGhlIGRhdGEgd2UgYXJlCisgKiBmaWx0ZXJpbmcsIGZpbHRlciBpcyB0aGUgYXJyYXkgb2YgZmlsdGVyIGluc3RydWN0aW9ucywgYW5kCisgKiBsZW4gaXMgdGhlIG51bWJlciBvZiBmaWx0ZXIgYmxvY2tzIGluIHRoZSBhcnJheS4KKyAqLworIAoraW50IHNrX3J1bl9maWx0ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNvY2tfZmlsdGVyICpmaWx0ZXIsIGludCBmbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSBza2ItPmRhdGE7CisJLyogbGVuIGlzIFVOU0lHTkVELiBCeXRlIHdpZGUgaW5zbnMgcmVsaWVzIG9ubHkgb24gaW1wbGljaXQKKwkgICB0eXBlIGNhc3RzIHRvIHByZXZlbnQgcmVhZGluZyBhcmJpdHJhcnkgbWVtb3J5IGxvY2F0aW9ucy4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgbGVuID0gc2tiLT5sZW4tc2tiLT5kYXRhX2xlbjsKKwlzdHJ1Y3Qgc29ja19maWx0ZXIgKmZlbnRyeTsJLyogV2Ugd2FsayBkb3duIHRoZXNlICovCisJdTMyIEEgPSAwOwkgICAJCS8qIEFjY3VtdWxhdG9yICovCisJdTMyIFggPSAwOyAgIAkJCS8qIEluZGV4IFJlZ2lzdGVyICovCisJdTMyIG1lbVtCUEZfTUVNV09SRFNdOwkJLyogU2NyYXRjaCBNZW1vcnkgU3RvcmUgKi8KKwlpbnQgazsKKwlpbnQgcGM7CisKKwkvKgorCSAqIFByb2Nlc3MgYXJyYXkgb2YgZmlsdGVyIGluc3RydWN0aW9ucy4KKwkgKi8KKwlmb3IgKHBjID0gMDsgcGMgPCBmbGVuOyBwYysrKSB7CisJCWZlbnRyeSA9ICZmaWx0ZXJbcGNdOworCQkJCisJCXN3aXRjaCAoZmVudHJ5LT5jb2RlKSB7CisJCWNhc2UgQlBGX0FMVXxCUEZfQUREfEJQRl9YOgorCQkJQSArPSBYOworCQkJY29udGludWU7CisJCWNhc2UgQlBGX0FMVXxCUEZfQUREfEJQRl9LOgorCQkJQSArPSBmZW50cnktPms7CisJCQljb250aW51ZTsKKwkJY2FzZSBCUEZfQUxVfEJQRl9TVUJ8QlBGX1g6CisJCQlBIC09IFg7CisJCQljb250aW51ZTsKKwkJY2FzZSBCUEZfQUxVfEJQRl9TVUJ8QlBGX0s6CisJCQlBIC09IGZlbnRyeS0+azsKKwkJCWNvbnRpbnVlOworCQljYXNlIEJQRl9BTFV8QlBGX01VTHxCUEZfWDoKKwkJCUEgKj0gWDsKKwkJCWNvbnRpbnVlOworCQljYXNlIEJQRl9BTFV8QlBGX01VTHxCUEZfSzoKKwkJCUEgKj0gZmVudHJ5LT5rOworCQkJY29udGludWU7CisJCWNhc2UgQlBGX0FMVXxCUEZfRElWfEJQRl9YOgorCQkJaWYgKFggPT0gMCkKKwkJCQlyZXR1cm4gMDsKKwkJCUEgLz0gWDsKKwkJCWNvbnRpbnVlOworCQljYXNlIEJQRl9BTFV8QlBGX0RJVnxCUEZfSzoKKwkJCWlmIChmZW50cnktPmsgPT0gMCkKKwkJCQlyZXR1cm4gMDsKKwkJCUEgLz0gZmVudHJ5LT5rOworCQkJY29udGludWU7CisJCWNhc2UgQlBGX0FMVXxCUEZfQU5EfEJQRl9YOgorCQkJQSAmPSBYOworCQkJY29udGludWU7CisJCWNhc2UgQlBGX0FMVXxCUEZfQU5EfEJQRl9LOgorCQkJQSAmPSBmZW50cnktPms7CisJCQljb250aW51ZTsKKwkJY2FzZSBCUEZfQUxVfEJQRl9PUnxCUEZfWDoKKwkJCUEgfD0gWDsKKwkJCWNvbnRpbnVlOworCQljYXNlIEJQRl9BTFV8QlBGX09SfEJQRl9LOgorCQkJQSB8PSBmZW50cnktPms7CisJCQljb250aW51ZTsKKwkJY2FzZSBCUEZfQUxVfEJQRl9MU0h8QlBGX1g6CisJCQlBIDw8PSBYOworCQkJY29udGludWU7CisJCWNhc2UgQlBGX0FMVXxCUEZfTFNIfEJQRl9LOgorCQkJQSA8PD0gZmVudHJ5LT5rOworCQkJY29udGludWU7CisJCWNhc2UgQlBGX0FMVXxCUEZfUlNIfEJQRl9YOgorCQkJQSA+Pj0gWDsKKwkJCWNvbnRpbnVlOworCQljYXNlIEJQRl9BTFV8QlBGX1JTSHxCUEZfSzoKKwkJCUEgPj49IGZlbnRyeS0+azsKKwkJCWNvbnRpbnVlOworCQljYXNlIEJQRl9BTFV8QlBGX05FRzoKKwkJCUEgPSAtQTsKKwkJCWNvbnRpbnVlOworCQljYXNlIEJQRl9KTVB8QlBGX0pBOgorCQkJcGMgKz0gZmVudHJ5LT5rOworCQkJY29udGludWU7CisJCWNhc2UgQlBGX0pNUHxCUEZfSkdUfEJQRl9LOgorCQkJcGMgKz0gKEEgPiBmZW50cnktPmspID8gZmVudHJ5LT5qdCA6IGZlbnRyeS0+amY7CisJCQljb250aW51ZTsKKwkJY2FzZSBCUEZfSk1QfEJQRl9KR0V8QlBGX0s6CisJCQlwYyArPSAoQSA+PSBmZW50cnktPmspID8gZmVudHJ5LT5qdCA6IGZlbnRyeS0+amY7CisJCQljb250aW51ZTsKKwkJY2FzZSBCUEZfSk1QfEJQRl9KRVF8QlBGX0s6CisJCQlwYyArPSAoQSA9PSBmZW50cnktPmspID8gZmVudHJ5LT5qdCA6IGZlbnRyeS0+amY7CisJCQljb250aW51ZTsKKwkJY2FzZSBCUEZfSk1QfEJQRl9KU0VUfEJQRl9LOgorCQkJcGMgKz0gKEEgJiBmZW50cnktPmspID8gZmVudHJ5LT5qdCA6IGZlbnRyeS0+amY7CisJCQljb250aW51ZTsKKwkJY2FzZSBCUEZfSk1QfEJQRl9KR1R8QlBGX1g6CisJCQlwYyArPSAoQSA+IFgpID8gZmVudHJ5LT5qdCA6IGZlbnRyeS0+amY7CisJCQljb250aW51ZTsKKwkJY2FzZSBCUEZfSk1QfEJQRl9KR0V8QlBGX1g6CisJCQlwYyArPSAoQSA+PSBYKSA/IGZlbnRyeS0+anQgOiBmZW50cnktPmpmOworCQkJY29udGludWU7CisJCWNhc2UgQlBGX0pNUHxCUEZfSkVRfEJQRl9YOgorCQkJcGMgKz0gKEEgPT0gWCkgPyBmZW50cnktPmp0IDogZmVudHJ5LT5qZjsKKwkJCWNvbnRpbnVlOworCQljYXNlIEJQRl9KTVB8QlBGX0pTRVR8QlBGX1g6CisJCQlwYyArPSAoQSAmIFgpID8gZmVudHJ5LT5qdCA6IGZlbnRyeS0+amY7CisJCQljb250aW51ZTsKKwkJY2FzZSBCUEZfTER8QlBGX1d8QlBGX0FCUzoKKwkJCWsgPSBmZW50cnktPms7CisgbG9hZF93OgorCQkJaWYgKGsgPj0gMCAmJiAodW5zaWduZWQgaW50KShrK3NpemVvZih1MzIpKSA8PSBsZW4pIHsKKwkJCQlBID0gbnRvaGwoKih1MzIqKSZkYXRhW2tdKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChrIDwgMCkgeworCQkJCXU4ICpwdHI7CisKKwkJCQlpZiAoayA+PSBTS0ZfQURfT0ZGKQorCQkJCQlicmVhazsKKwkJCQlwdHIgPSBsb2FkX3BvaW50ZXIoc2tiLCBrKTsKKwkJCQlpZiAocHRyKSB7CisJCQkJCUEgPSBudG9obCgqKHUzMiopcHRyKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQl1MzIgX3RtcCwgKnA7CisJCQkJcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGssIDQsICZfdG1wKTsKKwkJCQlpZiAocCAhPSBOVUxMKSB7CisJCQkJCUEgPSBudG9obCgqcCk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiAwOworCQljYXNlIEJQRl9MRHxCUEZfSHxCUEZfQUJTOgorCQkJayA9IGZlbnRyeS0+azsKKyBsb2FkX2g6CisJCQlpZiAoayA+PSAwICYmICh1bnNpZ25lZCBpbnQpKGsgKyBzaXplb2YodTE2KSkgPD0gbGVuKSB7CisJCQkJQSA9IG50b2hzKCoodTE2KikmZGF0YVtrXSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoayA8IDApIHsKKwkJCQl1OCAqcHRyOworCisJCQkJaWYgKGsgPj0gU0tGX0FEX09GRikKKwkJCQkJYnJlYWs7CisJCQkJcHRyID0gbG9hZF9wb2ludGVyKHNrYiwgayk7CisJCQkJaWYgKHB0cikgeworCQkJCQlBID0gbnRvaHMoKih1MTYqKXB0cik7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJdTE2IF90bXAsICpwOworCQkJCXAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBrLCAyLCAmX3RtcCk7CisJCQkJaWYgKHAgIT0gTlVMTCkgeworCQkJCQlBID0gbnRvaHMoKnApOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBCUEZfTER8QlBGX0J8QlBGX0FCUzoKKwkJCWsgPSBmZW50cnktPms7Citsb2FkX2I6CisJCQlpZiAoayA+PSAwICYmICh1bnNpZ25lZCBpbnQpayA8IGxlbikgeworCQkJCUEgPSBkYXRhW2tdOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGsgPCAwKSB7CisJCQkJdTggKnB0cjsKKworCQkJCWlmIChrID49IFNLRl9BRF9PRkYpCisJCQkJCWJyZWFrOworCQkJCXB0ciA9IGxvYWRfcG9pbnRlcihza2IsIGspOworCQkJCWlmIChwdHIpIHsKKwkJCQkJQSA9ICpwdHI7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJdTggX3RtcCwgKnA7CisJCQkJcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGssIDEsICZfdG1wKTsKKwkJCQlpZiAocCAhPSBOVUxMKSB7CisJCQkJCUEgPSAqcDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIDA7CisJCWNhc2UgQlBGX0xEfEJQRl9XfEJQRl9MRU46CisJCQlBID0gbGVuOworCQkJY29udGludWU7CisJCWNhc2UgQlBGX0xEWHxCUEZfV3xCUEZfTEVOOgorCQkJWCA9IGxlbjsKKwkJCWNvbnRpbnVlOworCQljYXNlIEJQRl9MRHxCUEZfV3xCUEZfSU5EOgorCQkJayA9IFggKyBmZW50cnktPms7CisJCQlnb3RvIGxvYWRfdzsKKwkJY2FzZSBCUEZfTER8QlBGX0h8QlBGX0lORDoKKwkJCWsgPSBYICsgZmVudHJ5LT5rOworCQkJZ290byBsb2FkX2g7CisJCWNhc2UgQlBGX0xEfEJQRl9CfEJQRl9JTkQ6CisJCQlrID0gWCArIGZlbnRyeS0+azsKKwkJCWdvdG8gbG9hZF9iOworCQljYXNlIEJQRl9MRFh8QlBGX0J8QlBGX01TSDoKKwkJCWlmIChmZW50cnktPmsgPj0gbGVuKQorCQkJCXJldHVybiAwOworCQkJWCA9IChkYXRhW2ZlbnRyeS0+a10gJiAweGYpIDw8IDI7CisJCQljb250aW51ZTsKKwkJY2FzZSBCUEZfTER8QlBGX0lNTToKKwkJCUEgPSBmZW50cnktPms7CisJCQljb250aW51ZTsKKwkJY2FzZSBCUEZfTERYfEJQRl9JTU06CisJCQlYID0gZmVudHJ5LT5rOworCQkJY29udGludWU7CisJCWNhc2UgQlBGX0xEfEJQRl9NRU06CisJCQlBID0gbWVtW2ZlbnRyeS0+a107CisJCQljb250aW51ZTsKKwkJY2FzZSBCUEZfTERYfEJQRl9NRU06CisJCQlYID0gbWVtW2ZlbnRyeS0+a107CisJCQljb250aW51ZTsKKwkJY2FzZSBCUEZfTUlTQ3xCUEZfVEFYOgorCQkJWCA9IEE7CisJCQljb250aW51ZTsKKwkJY2FzZSBCUEZfTUlTQ3xCUEZfVFhBOgorCQkJQSA9IFg7CisJCQljb250aW51ZTsKKwkJY2FzZSBCUEZfUkVUfEJQRl9LOgorCQkJcmV0dXJuICgodW5zaWduZWQgaW50KWZlbnRyeS0+ayk7CisJCWNhc2UgQlBGX1JFVHxCUEZfQToKKwkJCXJldHVybiAoKHVuc2lnbmVkIGludClBKTsKKwkJY2FzZSBCUEZfU1Q6CisJCQltZW1bZmVudHJ5LT5rXSA9IEE7CisJCQljb250aW51ZTsKKwkJY2FzZSBCUEZfU1RYOgorCQkJbWVtW2ZlbnRyeS0+a10gPSBYOworCQkJY29udGludWU7CisJCWRlZmF1bHQ6CisJCQkvKiBJbnZhbGlkIGluc3RydWN0aW9uIGNvdW50cyBhcyBSRVQgKi8KKwkJCXJldHVybiAwOworCQl9CisKKwkJLyoKKwkJICogSGFuZGxlIGFuY2lsbGFyeSBkYXRhLCB3aGljaCBhcmUgaW1wb3NzaWJsZQorCQkgKiAob3IgdmVyeSBkaWZmaWN1bHQpIHRvIGdldCBwYXJzaW5nIHBhY2tldCBjb250ZW50cy4KKwkJICovCisJCXN3aXRjaCAoay1TS0ZfQURfT0ZGKSB7CisJCWNhc2UgU0tGX0FEX1BST1RPQ09MOgorCQkJQSA9IGh0b25zKHNrYi0+cHJvdG9jb2wpOworCQkJY29udGludWU7CisJCWNhc2UgU0tGX0FEX1BLVFRZUEU6CisJCQlBID0gc2tiLT5wa3RfdHlwZTsKKwkJCWNvbnRpbnVlOworCQljYXNlIFNLRl9BRF9JRklOREVYOgorCQkJQSA9IHNrYi0+ZGV2LT5pZmluZGV4OworCQkJY29udGludWU7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqCXNrX2Noa19maWx0ZXIgLSB2ZXJpZnkgc29ja2V0IGZpbHRlciBjb2RlCisgKglAZmlsdGVyOiBmaWx0ZXIgdG8gdmVyaWZ5CisgKglAZmxlbjogbGVuZ3RoIG9mIGZpbHRlcgorICoKKyAqIENoZWNrIHRoZSB1c2VyJ3MgZmlsdGVyIGNvZGUuIElmIHdlIGxldCBzb21lIHVnbHkKKyAqIGZpbHRlciBjb2RlIHNsaXAgdGhyb3VnaCBrYWJvb20hIFRoZSBmaWx0ZXIgbXVzdCBjb250YWluCisgKiBubyByZWZlcmVuY2VzIG9yIGp1bXBzIHRoYXQgYXJlIG91dCBvZiByYW5nZSwgbm8gaWxsZWdhbCBpbnN0cnVjdGlvbnMKKyAqIGFuZCBubyBiYWNrd2FyZCBqdW1wcy4gSXQgbXVzdCBlbmQgd2l0aCBhIFJFVCBpbnN0cnVjdGlvbgorICoKKyAqIFJldHVybnMgMCBpZiB0aGUgcnVsZSBzZXQgaXMgbGVnYWwgb3IgYSBuZWdhdGl2ZSBlcnJubyBjb2RlIGlmIG5vdC4KKyAqLworaW50IHNrX2Noa19maWx0ZXIoc3RydWN0IHNvY2tfZmlsdGVyICpmaWx0ZXIsIGludCBmbGVuKQoreworCXN0cnVjdCBzb2NrX2ZpbHRlciAqZnRlc3Q7CisJaW50IHBjOworCisJaWYgKCgodW5zaWduZWQgaW50KWZsZW4gPj0gKH4wVSAvIHNpemVvZihzdHJ1Y3Qgc29ja19maWx0ZXIpKSkgfHwgZmxlbiA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGNoZWNrIHRoZSBmaWx0ZXIgY29kZSBub3cgKi8KKwlmb3IgKHBjID0gMDsgcGMgPCBmbGVuOyBwYysrKSB7CisJCS8qIGFsbCBqdW1wcyBhcmUgZm9yd2FyZCBhcyB0aGV5IGFyZSBub3Qgc2lnbmVkICovCisJCWZ0ZXN0ID0gJmZpbHRlcltwY107CisJCWlmIChCUEZfQ0xBU1MoZnRlc3QtPmNvZGUpID09IEJQRl9KTVApIHsKKwkJCS8qIGJ1dCB0aGV5IG11c3RuJ3QganVtcCBvZmYgdGhlIGVuZCAqLworCQkJaWYgKEJQRl9PUChmdGVzdC0+Y29kZSkgPT0gQlBGX0pBKSB7CisJCQkJLyoKKwkJCQkgKiBOb3RlLCB0aGUgbGFyZ2UgZnRlc3QtPmsgbWlnaHQgY2F1c2UgbG9vcHMuCisJCQkJICogQ29tcGFyZSB0aGlzIHdpdGggY29uZGl0aW9uYWwganVtcHMgYmVsb3csCisJCQkJICogd2hlcmUgb2Zmc2V0cyBhcmUgbGltaXRlZC4gLS1BTksgKDk4MTAxNikKKwkJCQkgKi8KKwkJCQlpZiAoZnRlc3QtPmsgPj0gKHVuc2lnbmVkKShmbGVuLXBjLTEpKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0gZWxzZSB7CisJCQkJLyogZm9yIGNvbmRpdGlvbmFscyBib3RoIG11c3QgYmUgc2FmZSAqLworIAkJCQlpZiAocGMgKyBmdGVzdC0+anQgKzEgPj0gZmxlbiB8fAorCQkJCSAgICBwYyArIGZ0ZXN0LT5qZiArMSA+PSBmbGVuKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCisJCS8qIGNoZWNrIHRoYXQgbWVtb3J5IG9wZXJhdGlvbnMgdXNlIHZhbGlkIGFkZHJlc3Nlcy4gKi8KKwkJaWYgKGZ0ZXN0LT5rID49IEJQRl9NRU1XT1JEUykgeworCQkJLyogYnV0IGl0IG1pZ2h0IG5vdCBiZSBhIG1lbW9yeSBvcGVyYXRpb24uLi4gKi8KKwkJCXN3aXRjaCAoZnRlc3QtPmNvZGUpIHsKKwkJCWNhc2UgQlBGX1NUOgkKKwkJCWNhc2UgQlBGX1NUWDoJCisJCQljYXNlIEJQRl9MRHxCUEZfTUVNOgkKKwkJCWNhc2UgQlBGX0xEWHxCUEZfTUVNOgkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogVGhlIHByb2dyYW0gbXVzdCBlbmQgd2l0aCBhIHJldHVybi4gV2UgZG9uJ3QgY2FyZSB3aGVyZSB0aGV5CisJICoganVtcGVkIHdpdGhpbiB0aGUgc2NyaXB0IChpdHMgYWx3YXlzIGZvcndhcmRzKSBidXQgaW4gdGhlIGVuZAorCSAqIHRoZXkgX3dpbGxfIGhpdCB0aGlzLgorCSAqLworICAgICAgICByZXR1cm4gKEJQRl9DTEFTUyhmaWx0ZXJbZmxlbiAtIDFdLmNvZGUpID09IEJQRl9SRVQpID8gMCA6IC1FSU5WQUw7Cit9CisKKy8qKgorICoJc2tfYXR0YWNoX2ZpbHRlciAtIGF0dGFjaCBhIHNvY2tldCBmaWx0ZXIKKyAqCUBmcHJvZzogdGhlIGZpbHRlciBwcm9ncmFtCisgKglAc2s6IHRoZSBzb2NrZXQgdG8gdXNlCisgKgorICogQXR0YWNoIHRoZSB1c2VyJ3MgZmlsdGVyIGNvZGUuIFdlIGZpcnN0IHJ1biBzb21lIHNhbml0eSBjaGVja3Mgb24KKyAqIGl0IHRvIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBleHBsb2RlIG9uIHVzIGxhdGVyLiBJZiBhbiBlcnJvcgorICogb2NjdXJzIG9yIHRoZXJlIGlzIGluc3VmZmljaWVudCBtZW1vcnkgZm9yIHRoZSBmaWx0ZXIgYSBuZWdhdGl2ZQorICogZXJybm8gY29kZSBpcyByZXR1cm5lZC4gT24gc3VjY2VzcyB0aGUgcmV0dXJuIGlzIHplcm8uCisgKi8KK2ludCBza19hdHRhY2hfZmlsdGVyKHN0cnVjdCBzb2NrX2Zwcm9nICpmcHJvZywgc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBza19maWx0ZXIgKmZwOyAKKwl1bnNpZ25lZCBpbnQgZnNpemUgPSBzaXplb2Yoc3RydWN0IHNvY2tfZmlsdGVyKSAqIGZwcm9nLT5sZW47CisJaW50IGVycjsKKworCS8qIE1ha2Ugc3VyZSBuZXcgZmlsdGVyIGlzIHRoZXJlIGFuZCBpbiB0aGUgcmlnaHQgYW1vdW50cy4gKi8KKyAgICAgICAgaWYgKGZwcm9nLT5maWx0ZXIgPT0gTlVMTCB8fCBmcHJvZy0+bGVuID4gQlBGX01BWElOU05TKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisJZnAgPSBzb2NrX2ttYWxsb2Moc2ssIGZzaXplK3NpemVvZigqZnApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZwKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoY29weV9mcm9tX3VzZXIoZnAtPmluc25zLCBmcHJvZy0+ZmlsdGVyLCBmc2l6ZSkpIHsKKwkJc29ja19rZnJlZV9zKHNrLCBmcCwgZnNpemUrc2l6ZW9mKCpmcCkpOyAKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJYXRvbWljX3NldCgmZnAtPnJlZmNudCwgMSk7CisJZnAtPmxlbiA9IGZwcm9nLT5sZW47CisKKwllcnIgPSBza19jaGtfZmlsdGVyKGZwLT5pbnNucywgZnAtPmxlbik7CisJaWYgKCFlcnIpIHsKKwkJc3RydWN0IHNrX2ZpbHRlciAqb2xkX2ZwOworCisJCXNwaW5fbG9ja19iaCgmc2stPnNrX2xvY2suc2xvY2spOworCQlvbGRfZnAgPSBzay0+c2tfZmlsdGVyOworCQlzay0+c2tfZmlsdGVyID0gZnA7CisJCXNwaW5fdW5sb2NrX2JoKCZzay0+c2tfbG9jay5zbG9jayk7CisJCWZwID0gb2xkX2ZwOworCX0KKworCWlmIChmcCkKKwkJc2tfZmlsdGVyX3JlbGVhc2Uoc2ssIGZwKTsKKwlyZXR1cm4gZXJyOworfQorCitFWFBPUlRfU1lNQk9MKHNrX2Noa19maWx0ZXIpOworRVhQT1JUX1NZTUJPTChza19ydW5fZmlsdGVyKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Zsb3cuYyBiL25ldC9jb3JlL2Zsb3cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjg5NTcwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2NvcmUvZmxvdy5jCkBAIC0wLDAgKzEsMzcxIEBACisvKiBmbG93LmM6IEdlbmVyaWMgZmxvdyBjYWNoZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQWxleGV5IE4uIEt1em5ldHNvdiAoa3V6bmV0QG1zMi5pbnIuYWMucnUpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvamhhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPG5ldC9mbG93Lmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworc3RydWN0IGZsb3dfY2FjaGVfZW50cnkgeworCXN0cnVjdCBmbG93X2NhY2hlX2VudHJ5CSpuZXh0OworCXUxNgkJCWZhbWlseTsKKwl1OAkJCWRpcjsKKwlzdHJ1Y3QgZmxvd2kJCWtleTsKKwl1MzIJCQlnZW5pZDsKKwl2b2lkCQkJKm9iamVjdDsKKwlhdG9taWNfdAkJKm9iamVjdF9yZWY7Cit9OworCithdG9taWNfdCBmbG93X2NhY2hlX2dlbmlkID0gQVRPTUlDX0lOSVQoMCk7CisKK3N0YXRpYyB1MzIgZmxvd19oYXNoX3NoaWZ0OworI2RlZmluZSBmbG93X2hhc2hfc2l6ZQkoMSA8PCBmbG93X2hhc2hfc2hpZnQpCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGZsb3dfY2FjaGVfZW50cnkgKiosIGZsb3dfdGFibGVzKSA9IHsgTlVMTCB9OworCisjZGVmaW5lIGZsb3dfdGFibGUoY3B1KSAocGVyX2NwdShmbG93X3RhYmxlcywgY3B1KSkKKworc3RhdGljIGttZW1fY2FjaGVfdCAqZmxvd19jYWNoZXA7CisKK3N0YXRpYyBpbnQgZmxvd19sd20sIGZsb3dfaHdtOworCitzdHJ1Y3QgZmxvd19wZXJjcHVfaW5mbyB7CisJaW50IGhhc2hfcm5kX3JlY2FsYzsKKwl1MzIgaGFzaF9ybmQ7CisJaW50IGNvdW50OworfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGZsb3dfcGVyY3B1X2luZm8sIGZsb3dfaGFzaF9pbmZvKSA9IHsgMCB9OworCisjZGVmaW5lIGZsb3dfaGFzaF9ybmRfcmVjYWxjKGNwdSkgXAorCShwZXJfY3B1KGZsb3dfaGFzaF9pbmZvLCBjcHUpLmhhc2hfcm5kX3JlY2FsYykKKyNkZWZpbmUgZmxvd19oYXNoX3JuZChjcHUpIFwKKwkocGVyX2NwdShmbG93X2hhc2hfaW5mbywgY3B1KS5oYXNoX3JuZCkKKyNkZWZpbmUgZmxvd19jb3VudChjcHUpIFwKKwkocGVyX2NwdShmbG93X2hhc2hfaW5mbywgY3B1KS5jb3VudCkKKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGZsb3dfaGFzaF9ybmRfdGltZXI7CisKKyNkZWZpbmUgRkxPV19IQVNIX1JORF9QRVJJT0QJKDEwICogNjAgKiBIWikKKworc3RydWN0IGZsb3dfZmx1c2hfaW5mbyB7CisJYXRvbWljX3QgY3B1bGVmdDsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0aW9uOworfTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QsIGZsb3dfZmx1c2hfdGFza2xldHMpID0geyBOVUxMIH07CisKKyNkZWZpbmUgZmxvd19mbHVzaF90YXNrbGV0KGNwdSkgKCZwZXJfY3B1KGZsb3dfZmx1c2hfdGFza2xldHMsIGNwdSkpCisKK3N0YXRpYyB2b2lkIGZsb3dfY2FjaGVfbmV3X2hhc2hybmQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGk7CisKKwlmb3JfZWFjaF9jcHUoaSkKKwkJZmxvd19oYXNoX3JuZF9yZWNhbGMoaSkgPSAxOworCisJZmxvd19oYXNoX3JuZF90aW1lci5leHBpcmVzID0gamlmZmllcyArIEZMT1dfSEFTSF9STkRfUEVSSU9EOworCWFkZF90aW1lcigmZmxvd19oYXNoX3JuZF90aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZmxvd19jYWNoZV9zaHJpbmsoaW50IGNwdSwgaW50IHNocmlua190bykKK3sKKwlzdHJ1Y3QgZmxvd19jYWNoZV9lbnRyeSAqZmxlLCAqKmZscDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBmbG93X2hhc2hfc2l6ZTsgaSsrKSB7CisJCWludCBrID0gMDsKKworCQlmbHAgPSAmZmxvd190YWJsZShjcHUpW2ldOworCQl3aGlsZSAoKGZsZSA9ICpmbHApICE9IE5VTEwgJiYgayA8IHNocmlua190bykgeworCQkJaysrOworCQkJZmxwID0gJmZsZS0+bmV4dDsKKwkJfQorCQl3aGlsZSAoKGZsZSA9ICpmbHApICE9IE5VTEwpIHsKKwkJCSpmbHAgPSBmbGUtPm5leHQ7CisJCQlpZiAoZmxlLT5vYmplY3QpCisJCQkJYXRvbWljX2RlYyhmbGUtPm9iamVjdF9yZWYpOworCQkJa21lbV9jYWNoZV9mcmVlKGZsb3dfY2FjaGVwLCBmbGUpOworCQkJZmxvd19jb3VudChjcHUpLS07CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZsb3dfY2FjaGVfc2hyaW5rKGludCBjcHUpCit7CisJaW50IHNocmlua190byA9IGZsb3dfbHdtIC8gZmxvd19oYXNoX3NpemU7CisKKwlfX2Zsb3dfY2FjaGVfc2hyaW5rKGNwdSwgc2hyaW5rX3RvKTsKK30KKworc3RhdGljIHZvaWQgZmxvd19uZXdfaGFzaF9ybmQoaW50IGNwdSkKK3sKKwlnZXRfcmFuZG9tX2J5dGVzKCZmbG93X2hhc2hfcm5kKGNwdSksIHNpemVvZih1MzIpKTsKKwlmbG93X2hhc2hfcm5kX3JlY2FsYyhjcHUpID0gMDsKKworCV9fZmxvd19jYWNoZV9zaHJpbmsoY3B1LCAwKTsKK30KKworc3RhdGljIHUzMiBmbG93X2hhc2hfY29kZShzdHJ1Y3QgZmxvd2kgKmtleSwgaW50IGNwdSkKK3sKKwl1MzIgKmsgPSAodTMyICopIGtleTsKKworCXJldHVybiAoamhhc2gyKGssIChzaXplb2YoKmtleSkgLyBzaXplb2YodTMyKSksIGZsb3dfaGFzaF9ybmQoY3B1KSkgJgorCQkoZmxvd19oYXNoX3NpemUgLSAxKSk7Cit9CisKKyNpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkKK3R5cGVkZWYgdTY0IGZsb3dfY29tcGFyZV90OworI2Vsc2UKK3R5cGVkZWYgdTMyIGZsb3dfY29tcGFyZV90OworI2VuZGlmCisKK2V4dGVybiB2b2lkIGZsb3dpX2lzX21pc3NpemVkKHZvaWQpOworCisvKiBJIGhlYXIgd2hhdCB5b3UncmUgc2F5aW5nLCB1c2UgbWVtY21wLiAgQnV0IG1lbWNtcCBjYW5ub3QgbWFrZQorICogaW1wb3J0YW50IGFzc3VtcHRpb25zIHRoYXQgd2UgY2FuIGhlcmUsIHN1Y2ggYXMgYWxpZ25tZW50IGFuZAorICogY29uc3RhbnQgc2l6ZS4KKyAqLworc3RhdGljIGludCBmbG93X2tleV9jb21wYXJlKHN0cnVjdCBmbG93aSAqa2V5MSwgc3RydWN0IGZsb3dpICprZXkyKQoreworCWZsb3dfY29tcGFyZV90ICprMSwgKmsxX2xpbSwgKmsyOworCWNvbnN0IGludCBuX2VsZW0gPSBzaXplb2Yoc3RydWN0IGZsb3dpKSAvIHNpemVvZihmbG93X2NvbXBhcmVfdCk7CisKKwlpZiAoc2l6ZW9mKHN0cnVjdCBmbG93aSkgJSBzaXplb2YoZmxvd19jb21wYXJlX3QpKQorCQlmbG93aV9pc19taXNzaXplZCgpOworCisJazEgPSAoZmxvd19jb21wYXJlX3QgKikga2V5MTsKKwlrMV9saW0gPSBrMSArIG5fZWxlbTsKKworCWsyID0gKGZsb3dfY29tcGFyZV90ICopIGtleTI7CisKKwlkbyB7CisJCWlmICgqazErKyAhPSAqazIrKykKKwkJCXJldHVybiAxOworCX0gd2hpbGUgKGsxIDwgazFfbGltKTsKKworCXJldHVybiAwOworfQorCit2b2lkICpmbG93X2NhY2hlX2xvb2t1cChzdHJ1Y3QgZmxvd2kgKmtleSwgdTE2IGZhbWlseSwgdTggZGlyLAorCQkJZmxvd19yZXNvbHZlX3QgcmVzb2x2ZXIpCit7CisJc3RydWN0IGZsb3dfY2FjaGVfZW50cnkgKmZsZSwgKipoZWFkOworCXVuc2lnbmVkIGludCBoYXNoOworCWludCBjcHU7CisKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJZmxlID0gTlVMTDsKKwkvKiBQYWNrZXQgcmVhbGx5IGVhcmx5IGluIGluaXQ/ICBNYWtpbmcgZmxvd19jYWNoZV9pbml0IGEKKwkgKiBwcmUtc21wIGluaXRjYWxsIHdvdWxkIHNvbHZlIHRoaXMuICAtLVJSICovCisJaWYgKCFmbG93X3RhYmxlKGNwdSkpCisJCWdvdG8gbm9jYWNoZTsKKworCWlmIChmbG93X2hhc2hfcm5kX3JlY2FsYyhjcHUpKQorCQlmbG93X25ld19oYXNoX3JuZChjcHUpOworCWhhc2ggPSBmbG93X2hhc2hfY29kZShrZXksIGNwdSk7CisKKwloZWFkID0gJmZsb3dfdGFibGUoY3B1KVtoYXNoXTsKKwlmb3IgKGZsZSA9ICpoZWFkOyBmbGU7IGZsZSA9IGZsZS0+bmV4dCkgeworCQlpZiAoZmxlLT5mYW1pbHkgPT0gZmFtaWx5ICYmCisJCSAgICBmbGUtPmRpciA9PSBkaXIgJiYKKwkJICAgIGZsb3dfa2V5X2NvbXBhcmUoa2V5LCAmZmxlLT5rZXkpID09IDApIHsKKwkJCWlmIChmbGUtPmdlbmlkID09IGF0b21pY19yZWFkKCZmbG93X2NhY2hlX2dlbmlkKSkgeworCQkJCXZvaWQgKnJldCA9IGZsZS0+b2JqZWN0OworCisJCQkJaWYgKHJldCkKKwkJCQkJYXRvbWljX2luYyhmbGUtPm9iamVjdF9yZWYpOworCQkJCWxvY2FsX2JoX2VuYWJsZSgpOworCisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFmbGUpIHsKKwkJaWYgKGZsb3dfY291bnQoY3B1KSA+IGZsb3dfaHdtKQorCQkJZmxvd19jYWNoZV9zaHJpbmsoY3B1KTsKKworCQlmbGUgPSBrbWVtX2NhY2hlX2FsbG9jKGZsb3dfY2FjaGVwLCBTTEFCX0FUT01JQyk7CisJCWlmIChmbGUpIHsKKwkJCWZsZS0+bmV4dCA9ICpoZWFkOworCQkJKmhlYWQgPSBmbGU7CisJCQlmbGUtPmZhbWlseSA9IGZhbWlseTsKKwkJCWZsZS0+ZGlyID0gZGlyOworCQkJbWVtY3B5KCZmbGUtPmtleSwga2V5LCBzaXplb2YoKmtleSkpOworCQkJZmxlLT5vYmplY3QgPSBOVUxMOworCQkJZmxvd19jb3VudChjcHUpKys7CisJCX0KKwl9CisKK25vY2FjaGU6CisJeworCQl2b2lkICpvYmo7CisJCWF0b21pY190ICpvYmpfcmVmOworCisJCXJlc29sdmVyKGtleSwgZmFtaWx5LCBkaXIsICZvYmosICZvYmpfcmVmKTsKKworCQlpZiAoZmxlKSB7CisJCQlmbGUtPmdlbmlkID0gYXRvbWljX3JlYWQoJmZsb3dfY2FjaGVfZ2VuaWQpOworCisJCQlpZiAoZmxlLT5vYmplY3QpCisJCQkJYXRvbWljX2RlYyhmbGUtPm9iamVjdF9yZWYpOworCisJCQlmbGUtPm9iamVjdCA9IG9iajsKKwkJCWZsZS0+b2JqZWN0X3JlZiA9IG9ial9yZWY7CisJCQlpZiAob2JqKQorCQkJCWF0b21pY19pbmMoZmxlLT5vYmplY3RfcmVmKTsKKwkJfQorCQlsb2NhbF9iaF9lbmFibGUoKTsKKworCQlyZXR1cm4gb2JqOworCX0KK30KKworc3RhdGljIHZvaWQgZmxvd19jYWNoZV9mbHVzaF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgZmxvd19mbHVzaF9pbmZvICppbmZvID0gKHZvaWQgKilkYXRhOworCWludCBpOworCWludCBjcHU7CisKKwljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJZm9yIChpID0gMDsgaSA8IGZsb3dfaGFzaF9zaXplOyBpKyspIHsKKwkJc3RydWN0IGZsb3dfY2FjaGVfZW50cnkgKmZsZTsKKworCQlmbGUgPSBmbG93X3RhYmxlKGNwdSlbaV07CisJCWZvciAoOyBmbGU7IGZsZSA9IGZsZS0+bmV4dCkgeworCQkJdW5zaWduZWQgZ2VuaWQgPSBhdG9taWNfcmVhZCgmZmxvd19jYWNoZV9nZW5pZCk7CisKKwkJCWlmICghZmxlLT5vYmplY3QgfHwgZmxlLT5nZW5pZCA9PSBnZW5pZCkKKwkJCQljb250aW51ZTsKKworCQkJZmxlLT5vYmplY3QgPSBOVUxMOworCQkJYXRvbWljX2RlYyhmbGUtPm9iamVjdF9yZWYpOworCQl9CisJfQorCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmluZm8tPmNwdWxlZnQpKQorCQljb21wbGV0ZSgmaW5mby0+Y29tcGxldGlvbik7Cit9CisKK3N0YXRpYyB2b2lkIGZsb3dfY2FjaGVfZmx1c2hfcGVyX2NwdSh2b2lkICopIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKTsKK3N0YXRpYyB2b2lkIGZsb3dfY2FjaGVfZmx1c2hfcGVyX2NwdSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBmbG93X2ZsdXNoX2luZm8gKmluZm8gPSBkYXRhOworCWludCBjcHU7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0ICp0YXNrbGV0OworCisJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJdGFza2xldCA9IGZsb3dfZmx1c2hfdGFza2xldChjcHUpOworCXRhc2tsZXQtPmRhdGEgPSAodW5zaWduZWQgbG9uZylpbmZvOworCXRhc2tsZXRfc2NoZWR1bGUodGFza2xldCk7Cit9CisKK3ZvaWQgZmxvd19jYWNoZV9mbHVzaCh2b2lkKQoreworCXN0cnVjdCBmbG93X2ZsdXNoX2luZm8gaW5mbzsKKwlzdGF0aWMgREVDTEFSRV9NVVRFWChmbG93X2ZsdXNoX3NlbSk7CisKKwkvKiBEb24ndCB3YW50IGNwdXMgZ29pbmcgZG93biBvciB1cCBkdXJpbmcgdGhpcy4gKi8KKwlsb2NrX2NwdV9ob3RwbHVnKCk7CisJZG93bigmZmxvd19mbHVzaF9zZW0pOworCWF0b21pY19zZXQoJmluZm8uY3B1bGVmdCwgbnVtX29ubGluZV9jcHVzKCkpOworCWluaXRfY29tcGxldGlvbigmaW5mby5jb21wbGV0aW9uKTsKKworCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwlzbXBfY2FsbF9mdW5jdGlvbihmbG93X2NhY2hlX2ZsdXNoX3Blcl9jcHUsICZpbmZvLCAxLCAwKTsKKwlmbG93X2NhY2hlX2ZsdXNoX3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpJmluZm8pOworCWxvY2FsX2JoX2VuYWJsZSgpOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmaW5mby5jb21wbGV0aW9uKTsKKwl1cCgmZmxvd19mbHVzaF9zZW0pOworCXVubG9ja19jcHVfaG90cGx1ZygpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZmxvd19jYWNoZV9jcHVfcHJlcGFyZShpbnQgY3B1KQoreworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqdGFza2xldDsKKwl1bnNpZ25lZCBsb25nIG9yZGVyOworCisJZm9yIChvcmRlciA9IDA7CisJICAgICAoUEFHRV9TSVpFIDw8IG9yZGVyKSA8CisJCSAgICAgKHNpemVvZihzdHJ1Y3QgZmxvd19jYWNoZV9lbnRyeSAqKSpmbG93X2hhc2hfc2l6ZSk7CisJICAgICBvcmRlcisrKQorCQkvKiBOT1RISU5HICovOworCisJZmxvd190YWJsZShjcHUpID0gKHN0cnVjdCBmbG93X2NhY2hlX2VudHJ5ICoqKQorCQlfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIG9yZGVyKTsKKwlpZiAoIWZsb3dfdGFibGUoY3B1KSkKKwkJcGFuaWMoIk5FVDogZmFpbGVkIHRvIGFsbG9jYXRlIGZsb3cgY2FjaGUgb3JkZXIgJWx1XG4iLCBvcmRlcik7CisKKwltZW1zZXQoZmxvd190YWJsZShjcHUpLCAwLCBQQUdFX1NJWkUgPDwgb3JkZXIpOworCisJZmxvd19oYXNoX3JuZF9yZWNhbGMoY3B1KSA9IDE7CisJZmxvd19jb3VudChjcHUpID0gMDsKKworCXRhc2tsZXQgPSBmbG93X2ZsdXNoX3Rhc2tsZXQoY3B1KTsKKwl0YXNrbGV0X2luaXQodGFza2xldCwgZmxvd19jYWNoZV9mbHVzaF90YXNrbGV0LCAwKTsKK30KKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorc3RhdGljIGludCBmbG93X2NhY2hlX2NwdShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKKwkJCSAgdW5zaWduZWQgbG9uZyBhY3Rpb24sCisJCQkgIHZvaWQgKmhjcHUpCit7CisJaWYgKGFjdGlvbiA9PSBDUFVfREVBRCkKKwkJX19mbG93X2NhY2hlX3NocmluaygodW5zaWduZWQgbG9uZyloY3B1LCAwKTsKKwlyZXR1cm4gTk9USUZZX09LOworfQorI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLworCitzdGF0aWMgaW50IF9faW5pdCBmbG93X2NhY2hlX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZsb3dfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImZsb3dfY2FjaGUiLAorCQkJCQlzaXplb2Yoc3RydWN0IGZsb3dfY2FjaGVfZW50cnkpLAorCQkJCQkwLCBTTEFCX0hXQ0FDSEVfQUxJR04sCisJCQkJCU5VTEwsIE5VTEwpOworCisJaWYgKCFmbG93X2NhY2hlcCkKKwkJcGFuaWMoIk5FVDogZmFpbGVkIHRvIGFsbG9jYXRlIGZsb3cgY2FjaGUgc2xhYlxuIik7CisKKwlmbG93X2hhc2hfc2hpZnQgPSAxMDsKKwlmbG93X2x3bSA9IDIgKiBmbG93X2hhc2hfc2l6ZTsKKwlmbG93X2h3bSA9IDQgKiBmbG93X2hhc2hfc2l6ZTsKKworCWluaXRfdGltZXIoJmZsb3dfaGFzaF9ybmRfdGltZXIpOworCWZsb3dfaGFzaF9ybmRfdGltZXIuZnVuY3Rpb24gPSBmbG93X2NhY2hlX25ld19oYXNocm5kOworCWZsb3dfaGFzaF9ybmRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBGTE9XX0hBU0hfUk5EX1BFUklPRDsKKwlhZGRfdGltZXIoJmZsb3dfaGFzaF9ybmRfdGltZXIpOworCisJZm9yX2VhY2hfY3B1KGkpCisJCWZsb3dfY2FjaGVfY3B1X3ByZXBhcmUoaSk7CisKKwlob3RjcHVfbm90aWZpZXIoZmxvd19jYWNoZV9jcHUsIDApOworCXJldHVybiAwOworfQorCittb2R1bGVfaW5pdChmbG93X2NhY2hlX2luaXQpOworCitFWFBPUlRfU1lNQk9MKGZsb3dfY2FjaGVfZ2VuaWQpOworRVhQT1JUX1NZTUJPTChmbG93X2NhY2hlX2xvb2t1cCk7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9nZW5fZXN0aW1hdG9yLmMgYi9uZXQvY29yZS9nZW5fZXN0aW1hdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3YzAyOQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9jb3JlL2dlbl9lc3RpbWF0b3IuYwpAQCAtMCwwICsxLDI1MCBAQAorLyoKKyAqIG5ldC9zY2hlZC9nZW5fZXN0aW1hdG9yLmMJU2ltcGxlIHJhdGUgZXN0aW1hdG9yLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKiBDaGFuZ2VzOgorICogICAgICAgICAgICAgIEphbWFsIEhhZGkgU2FsaW0gLSBtb3ZlZCBpdCB0byBuZXQvY29yZSBhbmQgcmVzaHVsZmVkCisgKiAgICAgICAgICAgICAgbmFtZXMgdG8gbWFrZSBpdCB1c2FibGUgaW4gZ2VuZXJhbCBuZXQgc3Vic3lzdGVtLgorICovCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9nZW5fc3RhdHMuaD4KKworLyoKKyAgIFRoaXMgY29kZSBpcyBOT1QgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3Igc3RhdGlzdGljcyBjb2xsZWN0aW9uLAorICAgaXRzIHB1cnBvc2UgaXMgdG8gcHJvdmlkZSBhIGJhc2UgZm9yIHN0YXRpc3RpY2FsIG11bHRpcGxleGluZworICAgZm9yIGNvbnRyb2xsZWQgbG9hZCBzZXJ2aWNlLgorICAgSWYgeW91IG5lZWQgb25seSBzdGF0aXN0aWNzLCBydW4gYSB1c2VyIGxldmVsIGRhZW1vbiB3aGljaAorICAgcGVyaW9kaWNhbGx5IHJlYWRzIGJ5dGUgY291bnRlcnMuCisKKyAgIFVuZm9ydHVuYXRlbHksIHJhdGUgZXN0aW1hdGlvbiBpcyBub3QgYSB2ZXJ5IGVhc3kgdGFzay4KKyAgIEYuZS4gSSBkaWQgbm90IGZpbmQgYSBzaW1wbGUgd2F5IHRvIGVzdGltYXRlIHRoZSBjdXJyZW50IHBlYWsgcmF0ZQorICAgYW5kIGV2ZW4gZmFpbGVkIHRvIGZvcm11bGF0ZSB0aGUgcHJvYmxlbSA4KTgpCisKKyAgIFNvIEkgcHJlZmVycmVkIG5vdCB0byBidWlsdCBhbiBlc3RpbWF0b3IgaW50byB0aGUgc2NoZWR1bGVyLAorICAgYnV0IHJ1biB0aGlzIHRhc2sgc2VwYXJhdGVseS4KKyAgIElkZWFsbHksIGl0IHNob3VsZCBiZSBrZXJuZWwgdGhyZWFkKHMpLCBidXQgZm9yIG5vdyBpdCBydW5zCisgICBmcm9tIHRpbWVycywgd2hpY2ggcHV0cyBhcHBhcmVudCB0b3AgYm91bmRzIG9uIHRoZSBudW1iZXIgb2YgcmF0ZWQKKyAgIGZsb3dzLCBoYXMgbWluaW1hbCBvdmVyaGVhZCBvbiBzbWFsbCwgYnV0IGlzIGVub3VnaAorICAgdG8gaGFuZGxlIGNvbnRyb2xsZWQgbG9hZCBzZXJ2aWNlLCBzZXRzIG9mIGFnZ3JlZ2F0ZXMuCisKKyAgIFdlIG1lYXN1cmUgcmF0ZSBvdmVyIEE9KDE8PGludGVydmFsKSBzZWNvbmRzIGFuZCBldmFsdWF0ZSBFV01BOgorCisgICBhdnJhdGUgPSBhdnJhdGUqKDEtVykgKyByYXRlKlcKKworICAgd2hlcmUgVyBpcyBjaG9zZW4gYXMgbmVnYXRpdmUgcG93ZXIgb2YgMjogVyA9IDJeKC1ld21hX2xvZykKKworICAgVGhlIHJlc3VsdGluZyB0aW1lIGNvbnN0YW50IGlzOgorCisgICBUID0gQS8oLWxuKDEtVykpCisKKworICAgTk9URVMuCisKKyAgICogVGhlIHN0b3JlZCB2YWx1ZSBmb3IgYXZicHMgaXMgc2NhbGVkIGJ5IDJeNSwgc28gdGhhdCBtYXhpbWFsCisgICAgIHJhdGUgaXMgfjFHYml0LCBhdnBwcyBpcyBzY2FsZWQgYnkgMl4xMC4KKworICAgKiBNaW5pbWFsIGludGVydmFsIGlzIEhaLzQ9MjUwbXNlYyAoaXQgaXMgdGhlIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yCisgICAgIGZvciBIWj0xMDAgYW5kIEhaPTEwMjQgOCkpLCBtYXhpbWFsIGludGVydmFsCisgICAgIGlzIChIWioyXkVTVF9NQVhfSU5URVJWQUwpLzQgPSA4c2VjLiBTaG9ydGVyIGludGVydmFscworICAgICBhcmUgdG9vIGV4cGVuc2l2ZSwgbG9uZ2VyIG9uZXMgY2FuIGJlIGltcGxlbWVudGVkCisgICAgIGF0IHVzZXIgbGV2ZWwgcGFpbmxlc3NseS4KKyAqLworCisjZGVmaW5lIEVTVF9NQVhfSU5URVJWQUwJNQorCitzdHJ1Y3QgZ2VuX2VzdGltYXRvcgoreworCXN0cnVjdCBnZW5fZXN0aW1hdG9yCSpuZXh0OworCXN0cnVjdCBnbmV0X3N0YXRzX2Jhc2ljCSpic3RhdHM7CisJc3RydWN0IGduZXRfc3RhdHNfcmF0ZV9lc3QJKnJhdGVfZXN0OworCXNwaW5sb2NrX3QJCSpzdGF0c19sb2NrOworCXVuc2lnbmVkCQlpbnRlcnZhbDsKKwlpbnQJCQlld21hX2xvZzsKKwl1NjQJCQlsYXN0X2J5dGVzOworCXUzMgkJCWxhc3RfcGFja2V0czsKKwl1MzIJCQlhdnBwczsKKwl1MzIJCQlhdmJwczsKK307CisKK3N0cnVjdCBnZW5fZXN0aW1hdG9yX2hlYWQKK3sKKwlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsKKwlzdHJ1Y3QgZ2VuX2VzdGltYXRvcgkqbGlzdDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ2VuX2VzdGltYXRvcl9oZWFkIGVsaXN0W0VTVF9NQVhfSU5URVJWQUwrMV07CisKKy8qIEVzdGltYXRvciBhcnJheSBsb2NrICovCitzdGF0aWMgREVGSU5FX1JXTE9DSyhlc3RfbG9jayk7CisKK3N0YXRpYyB2b2lkIGVzdF90aW1lcih1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgaWR4ID0gKGludClhcmc7CisJc3RydWN0IGdlbl9lc3RpbWF0b3IgKmU7CisKKwlyZWFkX2xvY2soJmVzdF9sb2NrKTsKKwlmb3IgKGUgPSBlbGlzdFtpZHhdLmxpc3Q7IGU7IGUgPSBlLT5uZXh0KSB7CisJCXU2NCBuYnl0ZXM7CisJCXUzMiBucGFja2V0czsKKwkJdTMyIHJhdGU7CisKKwkJc3Bpbl9sb2NrKGUtPnN0YXRzX2xvY2spOworCQluYnl0ZXMgPSBlLT5ic3RhdHMtPmJ5dGVzOworCQlucGFja2V0cyA9IGUtPmJzdGF0cy0+cGFja2V0czsKKwkJcmF0ZSA9IChuYnl0ZXMgLSBlLT5sYXN0X2J5dGVzKTw8KDcgLSBpZHgpOworCQllLT5sYXN0X2J5dGVzID0gbmJ5dGVzOworCQllLT5hdmJwcyArPSAoKGxvbmcpcmF0ZSAtIChsb25nKWUtPmF2YnBzKSA+PiBlLT5ld21hX2xvZzsKKwkJZS0+cmF0ZV9lc3QtPmJwcyA9IChlLT5hdmJwcysweEYpPj41OworCisJCXJhdGUgPSAobnBhY2tldHMgLSBlLT5sYXN0X3BhY2tldHMpPDwoMTIgLSBpZHgpOworCQllLT5sYXN0X3BhY2tldHMgPSBucGFja2V0czsKKwkJZS0+YXZwcHMgKz0gKChsb25nKXJhdGUgLSAobG9uZyllLT5hdnBwcykgPj4gZS0+ZXdtYV9sb2c7CisJCWUtPnJhdGVfZXN0LT5wcHMgPSAoZS0+YXZwcHMrMHgxRkYpPj4xMDsKKwkJc3Bpbl91bmxvY2soZS0+c3RhdHNfbG9jayk7CisJfQorCisJbW9kX3RpbWVyKCZlbGlzdFtpZHhdLnRpbWVyLCBqaWZmaWVzICsgKChIWjw8aWR4KS80KSk7CisJcmVhZF91bmxvY2soJmVzdF9sb2NrKTsKK30KKworLyoqCisgKiBnZW5fbmV3X2VzdGltYXRvciAtIGNyZWF0ZSBhIG5ldyByYXRlIGVzdGltYXRvcgorICogQGJzdGF0czogYmFzaWMgc3RhdGlzdGljcworICogQHJhdGVfZXN0OiByYXRlIGVzdGltYXRvciBzdGF0aXN0aWNzCisgKiBAc3RhdHNfbG9jazogc3RhdGlzdGljcyBsb2NrCisgKiBAb3B0OiByYXRlIGVzdGltYXRvciBjb25maWd1cmF0aW9uIFRMVgorICoKKyAqIENyZWF0ZXMgYSBuZXcgcmF0ZSBlc3RpbWF0b3Igd2l0aCAmYnN0YXRzIGFzIHNvdXJjZSBhbmQgJnJhdGVfZXN0CisgKiBhcyBkZXN0aW5hdGlvbi4gQSBuZXcgdGltZXIgd2l0aCB0aGUgaW50ZXJ2YWwgc3BlY2lmaWVkIGluIHRoZQorICogY29uZmlndXJhdGlvbiBUTFYgaXMgY3JlYXRlZC4gVXBvbiBlYWNoIGludGVydmFsLCB0aGUgbGF0ZXN0IHN0YXRpc3RpY3MKKyAqIHdpbGwgYmUgcmVhZCBmcm9tICZic3RhdHMgYW5kIHRoZSBlc3RpbWF0ZWQgcmF0ZSB3aWxsIGJlIHN0b3JlZCBpbgorICogJnJhdGVfZXN0IHdpdGggdGhlIHN0YXRpc3RpY3MgbG9jayBncmFiZWQgZHVyaW5nIHRoaXMgcGVyaW9kLgorICogCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK2ludCBnZW5fbmV3X2VzdGltYXRvcihzdHJ1Y3QgZ25ldF9zdGF0c19iYXNpYyAqYnN0YXRzLAorCXN0cnVjdCBnbmV0X3N0YXRzX3JhdGVfZXN0ICpyYXRlX2VzdCwgc3BpbmxvY2tfdCAqc3RhdHNfbG9jaywgc3RydWN0IHJ0YXR0ciAqb3B0KQoreworCXN0cnVjdCBnZW5fZXN0aW1hdG9yICplc3Q7CisJc3RydWN0IGduZXRfZXN0aW1hdG9yICpwYXJtID0gUlRBX0RBVEEob3B0KTsKKworCWlmIChSVEFfUEFZTE9BRChvcHQpIDwgc2l6ZW9mKCpwYXJtKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocGFybS0+aW50ZXJ2YWwgPCAtMiB8fCBwYXJtLT5pbnRlcnZhbCA+IDMpCisJCXJldHVybiAtRUlOVkFMOworCisJZXN0ID0ga21hbGxvYyhzaXplb2YoKmVzdCksIEdGUF9LRVJORUwpOworCWlmIChlc3QgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJbWVtc2V0KGVzdCwgMCwgc2l6ZW9mKCplc3QpKTsKKwllc3QtPmludGVydmFsID0gcGFybS0+aW50ZXJ2YWwgKyAyOworCWVzdC0+YnN0YXRzID0gYnN0YXRzOworCWVzdC0+cmF0ZV9lc3QgPSByYXRlX2VzdDsKKwllc3QtPnN0YXRzX2xvY2sgPSBzdGF0c19sb2NrOworCWVzdC0+ZXdtYV9sb2cgPSBwYXJtLT5ld21hX2xvZzsKKwllc3QtPmxhc3RfYnl0ZXMgPSBic3RhdHMtPmJ5dGVzOworCWVzdC0+YXZicHMgPSByYXRlX2VzdC0+YnBzPDw1OworCWVzdC0+bGFzdF9wYWNrZXRzID0gYnN0YXRzLT5wYWNrZXRzOworCWVzdC0+YXZwcHMgPSByYXRlX2VzdC0+cHBzPDwxMDsKKworCWVzdC0+bmV4dCA9IGVsaXN0W2VzdC0+aW50ZXJ2YWxdLmxpc3Q7CisJaWYgKGVzdC0+bmV4dCA9PSBOVUxMKSB7CisJCWluaXRfdGltZXIoJmVsaXN0W2VzdC0+aW50ZXJ2YWxdLnRpbWVyKTsKKwkJZWxpc3RbZXN0LT5pbnRlcnZhbF0udGltZXIuZGF0YSA9IGVzdC0+aW50ZXJ2YWw7CisJCWVsaXN0W2VzdC0+aW50ZXJ2YWxdLnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKChIWjw8ZXN0LT5pbnRlcnZhbCkvNCk7CisJCWVsaXN0W2VzdC0+aW50ZXJ2YWxdLnRpbWVyLmZ1bmN0aW9uID0gZXN0X3RpbWVyOworCQlhZGRfdGltZXIoJmVsaXN0W2VzdC0+aW50ZXJ2YWxdLnRpbWVyKTsKKwl9CisJd3JpdGVfbG9ja19iaCgmZXN0X2xvY2spOworCWVsaXN0W2VzdC0+aW50ZXJ2YWxdLmxpc3QgPSBlc3Q7CisJd3JpdGVfdW5sb2NrX2JoKCZlc3RfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZ2VuX2tpbGxfZXN0aW1hdG9yIC0gcmVtb3ZlIGEgcmF0ZSBlc3RpbWF0b3IKKyAqIEBic3RhdHM6IGJhc2ljIHN0YXRpc3RpY3MKKyAqIEByYXRlX2VzdDogcmF0ZSBlc3RpbWF0b3Igc3RhdGlzdGljcworICoKKyAqIFJlbW92ZXMgdGhlIHJhdGUgZXN0aW1hdG9yIHNwZWNpZmllZCBieSAmYnN0YXRzIGFuZCAmcmF0ZV9lc3QKKyAqIGFuZCBkZWxldGVzIHRoZSB0aW1lci4KKyAqLwordm9pZCBnZW5fa2lsbF9lc3RpbWF0b3Ioc3RydWN0IGduZXRfc3RhdHNfYmFzaWMgKmJzdGF0cywKKwlzdHJ1Y3QgZ25ldF9zdGF0c19yYXRlX2VzdCAqcmF0ZV9lc3QpCit7CisJaW50IGlkeDsKKwlzdHJ1Y3QgZ2VuX2VzdGltYXRvciAqZXN0LCAqKnBlc3Q7CisKKwlmb3IgKGlkeD0wOyBpZHggPD0gRVNUX01BWF9JTlRFUlZBTDsgaWR4KyspIHsKKwkJaW50IGtpbGxlZCA9IDA7CisJCXBlc3QgPSAmZWxpc3RbaWR4XS5saXN0OworCQl3aGlsZSAoKGVzdD0qcGVzdCkgIT0gTlVMTCkgeworCQkJaWYgKGVzdC0+cmF0ZV9lc3QgIT0gcmF0ZV9lc3QgfHwgZXN0LT5ic3RhdHMgIT0gYnN0YXRzKSB7CisJCQkJcGVzdCA9ICZlc3QtPm5leHQ7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXdyaXRlX2xvY2tfYmgoJmVzdF9sb2NrKTsKKwkJCSpwZXN0ID0gZXN0LT5uZXh0OworCQkJd3JpdGVfdW5sb2NrX2JoKCZlc3RfbG9jayk7CisKKwkJCWtmcmVlKGVzdCk7CisJCQlraWxsZWQrKzsKKwkJfQorCQlpZiAoa2lsbGVkICYmIGVsaXN0W2lkeF0ubGlzdCA9PSBOVUxMKQorCQkJZGVsX3RpbWVyKCZlbGlzdFtpZHhdLnRpbWVyKTsKKwl9Cit9CisKKy8qKgorICogZ2VuX3JlcGxhY2VfZXN0aW1hdG9yIC0gcmVwbGFjZSByYXRlIGVzdGltYXRvciBjb25maWdydWF0aW9uCisgKiBAYnN0YXRzOiBiYXNpYyBzdGF0aXN0aWNzCisgKiBAcmF0ZV9lc3Q6IHJhdGUgZXN0aW1hdG9yIHN0YXRpc3RpY3MKKyAqIEBzdGF0c19sb2NrOiBzdGF0aXN0aWNzIGxvY2sKKyAqIEBvcHQ6IHJhdGUgZXN0aW1hdG9yIGNvbmZpZ3VyYXRpb24gVExWCisgKgorICogUmVwbGFjZXMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSByYXRlIGVzdGltYXRvciBieSBjYWxsaW5nCisgKiBnZW5fa2lsbF9lc3RpbWF0b3IoKSBhbmQgZ2VuX25ld19lc3RpbWF0b3IoKS4KKyAqIAorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitpbnQKK2dlbl9yZXBsYWNlX2VzdGltYXRvcihzdHJ1Y3QgZ25ldF9zdGF0c19iYXNpYyAqYnN0YXRzLAorCXN0cnVjdCBnbmV0X3N0YXRzX3JhdGVfZXN0ICpyYXRlX2VzdCwgc3BpbmxvY2tfdCAqc3RhdHNfbG9jaywKKwlzdHJ1Y3QgcnRhdHRyICpvcHQpCit7CisgICAgZ2VuX2tpbGxfZXN0aW1hdG9yKGJzdGF0cywgcmF0ZV9lc3QpOworICAgIHJldHVybiBnZW5fbmV3X2VzdGltYXRvcihic3RhdHMsIHJhdGVfZXN0LCBzdGF0c19sb2NrLCBvcHQpOworfQorICAgIAorCitFWFBPUlRfU1lNQk9MKGdlbl9raWxsX2VzdGltYXRvcik7CitFWFBPUlRfU1lNQk9MKGdlbl9uZXdfZXN0aW1hdG9yKTsKK0VYUE9SVF9TWU1CT0woZ2VuX3JlcGxhY2VfZXN0aW1hdG9yKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2dlbl9zdGF0cy5jIGIvbmV0L2NvcmUvZ2VuX3N0YXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYyMTQ5MDMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvY29yZS9nZW5fc3RhdHMuYwpAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqIG5ldC9jb3JlL2dlbl9zdGF0cy5jCisgKgorICogICAgICAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAgICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOiAgVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKiAgICAgICAgICAgSmFtYWwgSGFkaSBTYWxpbQorICogICAgICAgICAgIEFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKiBTZWUgRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2dlbl9zdGF0cy50eHQKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5fc3RhdHMuaD4KKyNpbmNsdWRlIDxuZXQvZ2VuX3N0YXRzLmg+CisKKworc3RhdGljIGlubGluZSBpbnQKK2duZXRfc3RhdHNfY29weShzdHJ1Y3QgZ25ldF9kdW1wICpkLCBpbnQgdHlwZSwgdm9pZCAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlSVEFfUFVUKGQtPnNrYiwgdHlwZSwgc2l6ZSwgYnVmKTsKKwlyZXR1cm4gMDsKKworcnRhdHRyX2ZhaWx1cmU6CisJc3Bpbl91bmxvY2tfYmgoZC0+bG9jayk7CisJcmV0dXJuIC0xOworfQorCisvKioKKyAqIGduZXRfc3RhdHNfc3RhcnRfY29weV9jb21wYXQgLSBzdGFydCBkdW1waW5nIHByb2NlZHVyZSBpbiBjb21wYXRpYmlsaXR5IG1vZGUKKyAqIEBza2I6IHNvY2tldCBidWZmZXIgdG8gcHV0IHN0YXRpc3RpY3MgVExWcyBpbnRvCisgKiBAdHlwZTogVExWIHR5cGUgZm9yIHRvcCBsZXZlbCBzdGF0aXN0aWMgVExWCisgKiBAdGNfc3RhdHNfdHlwZTogVExWIHR5cGUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgc3RydWN0IHRjX3N0YXRzIFRMVgorICogQHhzdGF0c190eXBlOiBUTFYgdHlwZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB4c3RhdHMgVExWCisgKiBAbG9jazogc3RhdGlzdGljcyBsb2NrCisgKiBAZDogZHVtcGluZyBoYW5kbGUKKyAqCisgKiBJbml0aWFsaXplcyB0aGUgZHVtcGluZyBoYW5kbGUsIGdyYWJzIHRoZSBzdGF0aXN0aWMgbG9jayBhbmQgYXBwZW5kcworICogYW4gZW1wdHkgVExWIGhlYWRlciB0byB0aGUgc29ja2V0IGJ1ZmZlciBmb3IgdXNlIGEgY29udGFpbmVyIGZvciBhbGwKKyAqIG90aGVyIHN0YXRpc3RpYyBUTFZTLgorICoKKyAqIFRoZSBkdW1waW5nIGhhbmRsZSBpcyBtYXJrZWQgdG8gYmUgaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eSBtb2RlIHRlbGxpbmcKKyAqIGFsbCBnbmV0X3N0YXRzX2NvcHlfWFhYKCkgZnVuY3Rpb25zIHRvIGZpbGwgYSBsb2NhbCBjb3B5IG9mIHN0cnVjdCB0Y19zdGF0cy4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciAtMSBpZiB0aGUgcm9vbSBpbiB0aGUgc29ja2V0IGJ1ZmZlciB3YXMgbm90IHN1ZmZpY2llbnQuCisgKi8KK2ludAorZ25ldF9zdGF0c19zdGFydF9jb3B5X2NvbXBhdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgdHlwZSwgaW50IHRjX3N0YXRzX3R5cGUsCisJaW50IHhzdGF0c190eXBlLCBzcGlubG9ja190ICpsb2NrLCBzdHJ1Y3QgZ25ldF9kdW1wICpkKQoreworCW1lbXNldChkLCAwLCBzaXplb2YoKmQpKTsKKwkKKwlzcGluX2xvY2tfYmgobG9jayk7CisJZC0+bG9jayA9IGxvY2s7CisJaWYgKHR5cGUpCisJCWQtPnRhaWwgPSAoc3RydWN0IHJ0YXR0ciAqKSBza2ItPnRhaWw7CisJZC0+c2tiID0gc2tiOworCWQtPmNvbXBhdF90Y19zdGF0cyA9IHRjX3N0YXRzX3R5cGU7CisJZC0+Y29tcGF0X3hzdGF0cyA9IHhzdGF0c190eXBlOworCisJaWYgKGQtPnRhaWwpCisJCXJldHVybiBnbmV0X3N0YXRzX2NvcHkoZCwgdHlwZSwgTlVMTCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBnbmV0X3N0YXRzX3N0YXJ0X2NvcHlfY29tcGF0IC0gc3RhcnQgZHVtcGluZyBwcm9jZWR1cmUgaW4gY29tcGF0aWJpbGl0eSBtb2RlCisgKiBAc2tiOiBzb2NrZXQgYnVmZmVyIHRvIHB1dCBzdGF0aXN0aWNzIFRMVnMgaW50bworICogQHR5cGU6IFRMViB0eXBlIGZvciB0b3AgbGV2ZWwgc3RhdGlzdGljIFRMVgorICogQGxvY2s6IHN0YXRpc3RpY3MgbG9jaworICogQGQ6IGR1bXBpbmcgaGFuZGxlCisgKgorICogSW5pdGlhbGl6ZXMgdGhlIGR1bXBpbmcgaGFuZGxlLCBncmFicyB0aGUgc3RhdGlzdGljIGxvY2sgYW5kIGFwcGVuZHMKKyAqIGFuIGVtcHR5IFRMViBoZWFkZXIgdG8gdGhlIHNvY2tldCBidWZmZXIgZm9yIHVzZSBhIGNvbnRhaW5lciBmb3IgYWxsCisgKiBvdGhlciBzdGF0aXN0aWMgVExWUy4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciAtMSBpZiB0aGUgcm9vbSBpbiB0aGUgc29ja2V0IGJ1ZmZlciB3YXMgbm90IHN1ZmZpY2llbnQuCisgKi8KK2ludAorZ25ldF9zdGF0c19zdGFydF9jb3B5KHN0cnVjdCBza19idWZmICpza2IsIGludCB0eXBlLCBzcGlubG9ja190ICpsb2NrLAorCXN0cnVjdCBnbmV0X2R1bXAgKmQpCit7CisJcmV0dXJuIGduZXRfc3RhdHNfc3RhcnRfY29weV9jb21wYXQoc2tiLCB0eXBlLCAwLCAwLCBsb2NrLCBkKTsKK30KKworLyoqCisgKiBnbmV0X3N0YXRzX2NvcHlfYmFzaWMgLSBjb3B5IGJhc2ljIHN0YXRpc3RpY3MgaW50byBzdGF0aXN0aWMgVExWCisgKiBAZDogZHVtcGluZyBoYW5kbGUKKyAqIEBiOiBiYXNpYyBzdGF0aXN0aWNzCisgKgorICogQXBwZW5kcyB0aGUgYmFzaWMgc3RhdGlzdGljcyB0byB0aGUgdG9wIGxldmVsIFRMViBjcmVhdGVkIGJ5CisgKiBnbmV0X3N0YXRzX3N0YXJ0X2NvcHkoKS4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciAtMSB3aXRoIHRoZSBzdGF0aXN0aWMgbG9jayByZWxlYXNlZAorICogaWYgdGhlIHJvb20gaW4gdGhlIHNvY2tldCBidWZmZXIgd2FzIG5vdCBzdWZmaWNpZW50LgorICovCitpbnQKK2duZXRfc3RhdHNfY29weV9iYXNpYyhzdHJ1Y3QgZ25ldF9kdW1wICpkLCBzdHJ1Y3QgZ25ldF9zdGF0c19iYXNpYyAqYikKK3sKKwlpZiAoZC0+Y29tcGF0X3RjX3N0YXRzKSB7CisJCWQtPnRjX3N0YXRzLmJ5dGVzID0gYi0+Ynl0ZXM7CisJCWQtPnRjX3N0YXRzLnBhY2tldHMgPSBiLT5wYWNrZXRzOworCX0KKworCWlmIChkLT50YWlsKQorCQlyZXR1cm4gZ25ldF9zdGF0c19jb3B5KGQsIFRDQV9TVEFUU19CQVNJQywgYiwgc2l6ZW9mKCpiKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBnbmV0X3N0YXRzX2NvcHlfcmF0ZV9lc3QgLSBjb3B5IHJhdGUgZXN0aW1hdG9yIHN0YXRpc3RpY3MgaW50byBzdGF0aXN0aWNzIFRMVgorICogQGQ6IGR1bXBpbmcgaGFuZGxlCisgKiBAcjogcmF0ZSBlc3RpbWF0b3Igc3RhdGlzdGljcworICoKKyAqIEFwcGVuZHMgdGhlIHJhdGUgZXN0aW1hdG9yIHN0YXRpc3RpY3MgdG8gdGhlIHRvcCBsZXZlbCBUTFYgY3JlYXRlZCBieQorICogZ25ldF9zdGF0c19zdGFydF9jb3B5KCkuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLTEgd2l0aCB0aGUgc3RhdGlzdGljIGxvY2sgcmVsZWFzZWQKKyAqIGlmIHRoZSByb29tIGluIHRoZSBzb2NrZXQgYnVmZmVyIHdhcyBub3Qgc3VmZmljaWVudC4KKyAqLworaW50CitnbmV0X3N0YXRzX2NvcHlfcmF0ZV9lc3Qoc3RydWN0IGduZXRfZHVtcCAqZCwgc3RydWN0IGduZXRfc3RhdHNfcmF0ZV9lc3QgKnIpCit7CisJaWYgKGQtPmNvbXBhdF90Y19zdGF0cykgeworCQlkLT50Y19zdGF0cy5icHMgPSByLT5icHM7CisJCWQtPnRjX3N0YXRzLnBwcyA9IHItPnBwczsKKwl9CisKKwlpZiAoZC0+dGFpbCkKKwkJcmV0dXJuIGduZXRfc3RhdHNfY29weShkLCBUQ0FfU1RBVFNfUkFURV9FU1QsIHIsIHNpemVvZigqcikpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZ25ldF9zdGF0c19jb3B5X3F1ZXVlIC0gY29weSBxdWV1ZSBzdGF0aXN0aWNzIGludG8gc3RhdGlzdGljcyBUTFYKKyAqIEBkOiBkdW1waW5nIGhhbmRsZQorICogQHE6IHF1ZXVlIHN0YXRpc3RpY3MKKyAqCisgKiBBcHBlbmRzIHRoZSBxdWV1ZSBzdGF0aXN0aWNzIHRvIHRoZSB0b3AgbGV2ZWwgVExWIGNyZWF0ZWQgYnkKKyAqIGduZXRfc3RhdHNfc3RhcnRfY29weSgpLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC0xIHdpdGggdGhlIHN0YXRpc3RpYyBsb2NrIHJlbGVhc2VkCisgKiBpZiB0aGUgcm9vbSBpbiB0aGUgc29ja2V0IGJ1ZmZlciB3YXMgbm90IHN1ZmZpY2llbnQuCisgKi8KK2ludAorZ25ldF9zdGF0c19jb3B5X3F1ZXVlKHN0cnVjdCBnbmV0X2R1bXAgKmQsIHN0cnVjdCBnbmV0X3N0YXRzX3F1ZXVlICpxKQoreworCWlmIChkLT5jb21wYXRfdGNfc3RhdHMpIHsKKwkJZC0+dGNfc3RhdHMuZHJvcHMgPSBxLT5kcm9wczsKKwkJZC0+dGNfc3RhdHMucWxlbiA9IHEtPnFsZW47CisJCWQtPnRjX3N0YXRzLmJhY2tsb2cgPSBxLT5iYWNrbG9nOworCQlkLT50Y19zdGF0cy5vdmVybGltaXRzID0gcS0+b3ZlcmxpbWl0czsKKwl9CisKKwlpZiAoZC0+dGFpbCkKKwkJcmV0dXJuIGduZXRfc3RhdHNfY29weShkLCBUQ0FfU1RBVFNfUVVFVUUsIHEsIHNpemVvZigqcSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZ25ldF9zdGF0c19jb3B5X2FwcCAtIGNvcHkgYXBwbGljYXRpb24gc3BlY2lmaWMgc3RhdGlzdGljcyBpbnRvIHN0YXRpc3RpY3MgVExWCisgKiBAZDogZHVtcGluZyBoYW5kbGUKKyAqIEBzdDogYXBwbGljYXRpb24gc3BlY2lmaWMgc3RhdGlzdGljcyBkYXRhCisgKiBAbGVuOiBsZW5ndGggb2YgZGF0YQorICoKKyAqIEFwcGVuZHMgdGhlIGFwcGxpY2F0aW9uIHNlcGVjaWZpYyBzdGF0aXN0aWNzIHRvIHRoZSB0b3AgbGV2ZWwgVExWIGNyZWF0ZWQgYnkKKyAqIGduZXRfc3RhdHNfc3RhcnRfY29weSgpIGFuZCByZW1lbWJlcnMgdGhlIGRhdGEgZm9yIFhTVEFUUyBpZiB0aGUgZHVtcGluZworICogaGFuZGxlIGlzIGluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbW9kZS4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciAtMSB3aXRoIHRoZSBzdGF0aXN0aWMgbG9jayByZWxlYXNlZAorICogaWYgdGhlIHJvb20gaW4gdGhlIHNvY2tldCBidWZmZXIgd2FzIG5vdCBzdWZmaWNpZW50LgorICovCitpbnQKK2duZXRfc3RhdHNfY29weV9hcHAoc3RydWN0IGduZXRfZHVtcCAqZCwgdm9pZCAqc3QsIGludCBsZW4pCit7CisJaWYgKGQtPmNvbXBhdF94c3RhdHMpIHsKKwkJZC0+eHN0YXRzID0gc3Q7CisJCWQtPnhzdGF0c19sZW4gPSBsZW47CisJfQorCisJaWYgKGQtPnRhaWwpCisJCXJldHVybiBnbmV0X3N0YXRzX2NvcHkoZCwgVENBX1NUQVRTX0FQUCwgc3QsIGxlbik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBnbmV0X3N0YXRzX2ZpbmlzaF9jb3B5IC0gZmluaXNoIGR1bXBpbmcgcHJvY2VkdXJlCisgKiBAZDogZHVtcGluZyBoYW5kbGUKKyAqCisgKiBDb3JyZWN0cyB0aGUgbGVuZ3RoIG9mIHRoZSB0b3AgbGV2ZWwgVExWIHRvIGluY2x1ZGUgYWxsIFRMVnMgYWRkZWQKKyAqIGJ5IGduZXRfc3RhdHNfY29weV9YWFgoKSBjYWxscy4gQWRkcyB0aGUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBUTFZzCisgKiBpZiBnbmV0X3N0YXRzX3N0YXJ0X2NvcHlfY29tcGF0KCkgd2FzIHVzZWQgYW5kIHJlbGVhc2VzIHRoZSBzdGF0aXN0aWNzCisgKiBsb2NrLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC0xIHdpdGggdGhlIHN0YXRpc3RpYyBsb2NrIHJlbGVhc2VkCisgKiBpZiB0aGUgcm9vbSBpbiB0aGUgc29ja2V0IGJ1ZmZlciB3YXMgbm90IHN1ZmZpY2llbnQuCisgKi8KK2ludAorZ25ldF9zdGF0c19maW5pc2hfY29weShzdHJ1Y3QgZ25ldF9kdW1wICpkKQoreworCWlmIChkLT50YWlsKQorCQlkLT50YWlsLT5ydGFfbGVuID0gZC0+c2tiLT50YWlsIC0gKHU4ICopIGQtPnRhaWw7CisKKwlpZiAoZC0+Y29tcGF0X3RjX3N0YXRzKQorCQlpZiAoZ25ldF9zdGF0c19jb3B5KGQsIGQtPmNvbXBhdF90Y19zdGF0cywgJmQtPnRjX3N0YXRzLAorCQkJc2l6ZW9mKGQtPnRjX3N0YXRzKSkgPCAwKQorCQkJcmV0dXJuIC0xOworCisJaWYgKGQtPmNvbXBhdF94c3RhdHMgJiYgZC0+eHN0YXRzKSB7CisJCWlmIChnbmV0X3N0YXRzX2NvcHkoZCwgZC0+Y29tcGF0X3hzdGF0cywgZC0+eHN0YXRzLAorCQkJZC0+eHN0YXRzX2xlbikgPCAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCXNwaW5fdW5sb2NrX2JoKGQtPmxvY2spOworCXJldHVybiAwOworfQorCisKK0VYUE9SVF9TWU1CT0woZ25ldF9zdGF0c19zdGFydF9jb3B5KTsKK0VYUE9SVF9TWU1CT0woZ25ldF9zdGF0c19zdGFydF9jb3B5X2NvbXBhdCk7CitFWFBPUlRfU1lNQk9MKGduZXRfc3RhdHNfY29weV9iYXNpYyk7CitFWFBPUlRfU1lNQk9MKGduZXRfc3RhdHNfY29weV9yYXRlX2VzdCk7CitFWFBPUlRfU1lNQk9MKGduZXRfc3RhdHNfY29weV9xdWV1ZSk7CitFWFBPUlRfU1lNQk9MKGduZXRfc3RhdHNfY29weV9hcHApOworRVhQT1JUX1NZTUJPTChnbmV0X3N0YXRzX2ZpbmlzaF9jb3B5KTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2lvdmVjLmMgYi9uZXQvY29yZS9pb3ZlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1N2FjZTkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvY29yZS9pb3ZlYy5jCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICoJaW92ZWMgbWFuaXB1bGF0aW9uIHJvdXRpbmVzLgorICoKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglGaXhlczoKKyAqCQlBbmRyZXcgTHVubgk6CUVycm9ycyBpbiBpb3ZlYyBjb3B5aW5nLgorICoJCVBlZHJvIFJvcXVlCToJQWRkZWQgbWVtY3B5X2Zyb21pb3ZlY2VuZCBhbmQKKyAqCQkJCQljc3VtXy4uLl9mcm9taW92ZWNlbmQuCisgKgkJQW5kaSBLbGVlbgk6CWZpeGVkIGVycm9yIGhhbmRsaW5nIGZvciAyLjEKKyAqCQlBbGV4ZXkgS3V6bmV0c292OgkyLjEgb3B0aW1pc2F0aW9ucworICoJCUFuZGkgS2xlZW4JOglGaXggY3N1bSpmcm9taW92ZWNlbmQgZm9yIElQdjYuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisvKgorICoJVmVyaWZ5IGlvdmVjLiBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgdGhlIGlvdmVjIGlzIGJpZyBlbm91Z2gKKyAqCXRvIGhvbGQgdGhlIG1lc3NhZ2UgaW92ZWMuCisgKgorICoJU2F2ZSB0aW1lIG5vdCBkb2luZyB2ZXJpZnlfYXJlYS4gY29weV8qX3VzZXIgd2lsbCBtYWtlIHRoaXMgd29yaworICoJaW4gYW55IGNhc2UuCisgKi8KKworaW50IHZlcmlmeV9pb3ZlYyhzdHJ1Y3QgbXNnaGRyICptLCBzdHJ1Y3QgaW92ZWMgKmlvdiwgY2hhciAqYWRkcmVzcywgaW50IG1vZGUpCit7CisJaW50IHNpemUsIGVyciwgY3Q7CisJCisJaWYgKG0tPm1zZ19uYW1lbGVuKSB7CisJCWlmIChtb2RlID09IFZFUklGWV9SRUFEKSB7CisJCQllcnIgPSBtb3ZlX2FkZHJfdG9fa2VybmVsKG0tPm1zZ19uYW1lLCBtLT5tc2dfbmFtZWxlbiwKKwkJCQkJCSAgYWRkcmVzcyk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJCW0tPm1zZ19uYW1lID0gYWRkcmVzczsKKwl9IGVsc2UgeworCQltLT5tc2dfbmFtZSA9IE5VTEw7CisJfQorCisJc2l6ZSA9IG0tPm1zZ19pb3ZsZW4gKiBzaXplb2Yoc3RydWN0IGlvdmVjKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoaW92LCBtLT5tc2dfaW92LCBzaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltLT5tc2dfaW92ID0gaW92OworCWVyciA9IDA7CisKKwlmb3IgKGN0ID0gMDsgY3QgPCBtLT5tc2dfaW92bGVuOyBjdCsrKSB7CisJCWVyciArPSBpb3ZbY3RdLmlvdl9sZW47CisJCS8qCisJCSAqIEdvYWwgaXMgbm90IHRvIHZlcmlmeSB1c2VyIGRhdGEsIGJ1dCB0byBwcmV2ZW50IHJldHVybmluZworCQkgKiBuZWdhdGl2ZSB2YWx1ZSwgd2hpY2ggaXMgaW50ZXJwcmV0ZWQgYXMgZXJybm8uCisJCSAqIE92ZXJmbG93IGlzIHN0aWxsIHBvc3NpYmxlLCBidXQgaXQgaXMgaGFybWxlc3MuCisJCSAqLworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiAtRU1TR1NJWkU7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqCUNvcHkga2VybmVsIHRvIGlvdmVjLiBSZXR1cm5zIC1FRkFVTFQgb24gZXJyb3IuCisgKgorICoJTm90ZTogdGhpcyBtb2RpZmllcyB0aGUgb3JpZ2luYWwgaW92ZWMuCisgKi8KKyAKK2ludCBtZW1jcHlfdG9pb3ZlYyhzdHJ1Y3QgaW92ZWMgKmlvdiwgdW5zaWduZWQgY2hhciAqa2RhdGEsIGludCBsZW4pCit7CisJd2hpbGUgKGxlbiA+IDApIHsKKwkJaWYgKGlvdi0+aW92X2xlbikgeworCQkJaW50IGNvcHkgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGlvdi0+aW92X2xlbiwgbGVuKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoaW92LT5pb3ZfYmFzZSwga2RhdGEsIGNvcHkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJa2RhdGEgKz0gY29weTsKKwkJCWxlbiAtPSBjb3B5OworCQkJaW92LT5pb3ZfbGVuIC09IGNvcHk7CisJCQlpb3YtPmlvdl9iYXNlICs9IGNvcHk7CisJCX0KKwkJaW92Kys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglDb3B5IGlvdmVjIHRvIGtlcm5lbC4gUmV0dXJucyAtRUZBVUxUIG9uIGVycm9yLgorICoKKyAqCU5vdGU6IHRoaXMgbW9kaWZpZXMgdGhlIG9yaWdpbmFsIGlvdmVjLgorICovCisgCitpbnQgbWVtY3B5X2Zyb21pb3ZlYyh1bnNpZ25lZCBjaGFyICprZGF0YSwgc3RydWN0IGlvdmVjICppb3YsIGludCBsZW4pCit7CisJd2hpbGUgKGxlbiA+IDApIHsKKwkJaWYgKGlvdi0+aW92X2xlbikgeworCQkJaW50IGNvcHkgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgaW92LT5pb3ZfbGVuKTsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihrZGF0YSwgaW92LT5pb3ZfYmFzZSwgY29weSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlsZW4gLT0gY29weTsKKwkJCWtkYXRhICs9IGNvcHk7CisJCQlpb3YtPmlvdl9iYXNlICs9IGNvcHk7CisJCQlpb3YtPmlvdl9sZW4gLT0gY29weTsKKwkJfQorCQlpb3YrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCUZvciB1c2Ugd2l0aCBpcF9idWlsZF94bWl0CisgKi8KK2ludCBtZW1jcHlfZnJvbWlvdmVjZW5kKHVuc2lnbmVkIGNoYXIgKmtkYXRhLCBzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IG9mZnNldCwKKwkJCWludCBsZW4pCit7CisJLyogU2tpcCBvdmVyIHRoZSBmaW5pc2hlZCBpb3ZlY3MgKi8KKwl3aGlsZSAob2Zmc2V0ID49IGlvdi0+aW92X2xlbikgeworCQlvZmZzZXQgLT0gaW92LT5pb3ZfbGVuOworCQlpb3YrKzsKKwl9CisKKwl3aGlsZSAobGVuID4gMCkgeworCQl1OCBfX3VzZXIgKmJhc2UgPSBpb3YtPmlvdl9iYXNlICsgb2Zmc2V0OworCQlpbnQgY29weSA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLCBpb3YtPmlvdl9sZW4gLSBvZmZzZXQpOworCisJCW9mZnNldCA9IDA7CisJCWlmIChjb3B5X2Zyb21fdXNlcihrZGF0YSwgYmFzZSwgY29weSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJbGVuIC09IGNvcHk7CisJCWtkYXRhICs9IGNvcHk7CisJCWlvdisrOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICoJQW5kIG5vdyBmb3IgdGhlIGFsbC1pbi1vbmU6IGNvcHkgYW5kIGNoZWNrc3VtIGZyb20gYSB1c2VyIGlvdmVjCisgKglkaXJlY3RseSB0byBhIGRhdGFncmFtCisgKglDYWxscyB0byBjc3VtX3BhcnRpYWwgYnV0IHRoZSBsYXN0IG11c3QgYmUgaW4gMzIgYml0IGNodW5rcworICoKKyAqCWlwX2J1aWxkX3htaXQgbXVzdCBlbnN1cmUgdGhhdCB3aGVuIGZyYWdtZW50aW5nIG9ubHkgdGhlIGxhc3QKKyAqCWNhbGwgdG8gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVuYWxpZ25lZCBhbHNvLgorICovCitpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbWlvdmVjZW5kKHVuc2lnbmVkIGNoYXIgKmtkYXRhLCBzdHJ1Y3QgaW92ZWMgKmlvdiwKKwkJCQkgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGxlbiwgaW50ICpjc3VtcCkKK3sKKwlpbnQgY3N1bSA9ICpjc3VtcDsKKwlpbnQgcGFydGlhbF9jbnQgPSAwLCBlcnIgPSAwOworCisJLyogU2tpcCBvdmVyIHRoZSBmaW5pc2hlZCBpb3ZlY3MgKi8KKwl3aGlsZSAob2Zmc2V0ID49IGlvdi0+aW92X2xlbikgeworCQlvZmZzZXQgLT0gaW92LT5pb3ZfbGVuOworCQlpb3YrKzsKKwl9CisKKwl3aGlsZSAobGVuID4gMCkgeworCQl1OCBfX3VzZXIgKmJhc2UgPSBpb3YtPmlvdl9iYXNlICsgb2Zmc2V0OworCQlpbnQgY29weSA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLCBpb3YtPmlvdl9sZW4gLSBvZmZzZXQpOworCisJCW9mZnNldCA9IDA7CisKKwkJLyogVGhlcmUgaXMgYSByZW1uYW50IGZyb20gcHJldmlvdXMgaW92LiAqLworCQlpZiAocGFydGlhbF9jbnQpIHsKKwkJCWludCBwYXJfbGVuID0gNCAtIHBhcnRpYWxfY250OworCisJCQkvKiBpb3YgY29tcG9uZW50IGlzIHRvbyBzaG9ydCAuLi4gKi8KKwkJCWlmIChwYXJfbGVuID4gY29weSkgeworCQkJCWlmIChjb3B5X2Zyb21fdXNlcihrZGF0YSwgYmFzZSwgY29weSkpCisJCQkJCWdvdG8gb3V0X2ZhdWx0OworCQkJCWtkYXRhICs9IGNvcHk7CisJCQkJYmFzZSArPSBjb3B5OworCQkJCXBhcnRpYWxfY250ICs9IGNvcHk7CisJCQkJbGVuIC09IGNvcHk7CisJCQkJaW92Kys7CisJCQkJaWYgKGxlbikKKwkJCQkJY29udGludWU7CisJCQkJKmNzdW1wID0gY3N1bV9wYXJ0aWFsKGtkYXRhIC0gcGFydGlhbF9jbnQsCisJCQkJCQkJIHBhcnRpYWxfY250LCBjc3VtKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWlmIChjb3B5X2Zyb21fdXNlcihrZGF0YSwgYmFzZSwgcGFyX2xlbikpCisJCQkJZ290byBvdXRfZmF1bHQ7CisJCQljc3VtID0gY3N1bV9wYXJ0aWFsKGtkYXRhIC0gcGFydGlhbF9jbnQsIDQsIGNzdW0pOworCQkJa2RhdGEgKz0gcGFyX2xlbjsKKwkJCWJhc2UgICs9IHBhcl9sZW47CisJCQljb3B5ICAtPSBwYXJfbGVuOworCQkJbGVuICAgLT0gcGFyX2xlbjsKKwkJCXBhcnRpYWxfY250ID0gMDsKKwkJfQorCisJCWlmIChsZW4gPiBjb3B5KSB7CisJCQlwYXJ0aWFsX2NudCA9IGNvcHkgJSA0OworCQkJaWYgKHBhcnRpYWxfY250KSB7CisJCQkJY29weSAtPSBwYXJ0aWFsX2NudDsKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIoa2RhdGEgKyBjb3B5LCBiYXNlICsgY29weSwKKwkJCQkgCQlwYXJ0aWFsX2NudCkpCisJCQkJCWdvdG8gb3V0X2ZhdWx0OworCQkJfQorCQl9CisKKwkJaWYgKGNvcHkpIHsKKwkJCWNzdW0gPSBjc3VtX2FuZF9jb3B5X2Zyb21fdXNlcihiYXNlLCBrZGF0YSwgY29weSwKKwkJCQkJCQljc3VtLCAmZXJyKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CisJCX0KKwkJbGVuICAgLT0gY29weSArIHBhcnRpYWxfY250OworCQlrZGF0YSArPSBjb3B5ICsgcGFydGlhbF9jbnQ7CisJCWlvdisrOworCX0KKyAgICAgICAgKmNzdW1wID0gY3N1bTsKK291dDoKKwlyZXR1cm4gZXJyOworCitvdXRfZmF1bHQ6CisJZXJyID0gLUVGQVVMVDsKKwlnb3RvIG91dDsKK30KKworRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weV9mcm9taW92ZWNlbmQpOworRVhQT1JUX1NZTUJPTChtZW1jcHlfZnJvbWlvdmVjKTsKK0VYUE9SVF9TWU1CT0wobWVtY3B5X2Zyb21pb3ZlY2VuZCk7CitFWFBPUlRfU1lNQk9MKG1lbWNweV90b2lvdmVjKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2xpbmtfd2F0Y2guYyBiL25ldC9jb3JlL2xpbmtfd2F0Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODU5Yjc0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2NvcmUvbGlua193YXRjaC5jCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogTGludXggbmV0d29yayBkZXZpY2UgbGluayBzdGF0ZSBub3RpZmljYXRpb24KKyAqCisgKiBBdXRob3I6CisgKiAgICAgU3RlZmFuIFJvbXBmIDxzdXhAbG9wbG9mLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworCitlbnVtIGx3X2JpdHMgeworCUxXX1JVTk5JTkcgPSAwLAorCUxXX1NFX1VTRUQKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxpbmt3YXRjaF9mbGFnczsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxpbmt3YXRjaF9uZXh0ZXZlbnQ7CisKK3N0YXRpYyB2b2lkIGxpbmt3YXRjaF9ldmVudCh2b2lkICpkdW1teSk7CitzdGF0aWMgREVDTEFSRV9XT1JLKGxpbmt3YXRjaF93b3JrLCBsaW5rd2F0Y2hfZXZlbnQsIE5VTEwpOworCitzdGF0aWMgTElTVF9IRUFEKGx3ZXZlbnRsaXN0KTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobHdldmVudGxpc3RfbG9jayk7CisKK3N0cnVjdCBsd19ldmVudCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Cit9OworCisvKiBBdm9pZCBrbWFsbG9jKCkgZm9yIG1vc3Qgc3lzdGVtcyAqLworc3RhdGljIHN0cnVjdCBsd19ldmVudCBzaW5nbGVldmVudDsKKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgcnRubCBzZW1hcGhvcmUgaGVsZCAqLwordm9pZCBsaW5rd2F0Y2hfcnVuX3F1ZXVlKHZvaWQpCit7CisJTElTVF9IRUFEKGhlYWQpOworCXN0cnVjdCBsaXN0X2hlYWQgKm4sICpuZXh0OworCisJc3Bpbl9sb2NrX2lycSgmbHdldmVudGxpc3RfbG9jayk7CisJbGlzdF9zcGxpY2VfaW5pdCgmbHdldmVudGxpc3QsICZoZWFkKTsKKwlzcGluX3VubG9ja19pcnEoJmx3ZXZlbnRsaXN0X2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKG4sIG5leHQsICZoZWFkKSB7CisJCXN0cnVjdCBsd19ldmVudCAqZXZlbnQgPSBsaXN0X2VudHJ5KG4sIHN0cnVjdCBsd19ldmVudCwgbGlzdCk7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBldmVudC0+ZGV2OworCisJCWlmIChldmVudCA9PSAmc2luZ2xlZXZlbnQpIHsKKwkJCWNsZWFyX2JpdChMV19TRV9VU0VELCAmbGlua3dhdGNoX2ZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCWtmcmVlKGV2ZW50KTsKKwkJfQorCisJCS8qIFdlIGFyZSBhYm91dCB0byBoYW5kbGUgdGhpcyBkZXZpY2UsCisJCSAqIHNvIG5ldyBldmVudHMgY2FuIGJlIGFjY2VwdGVkCisJCSAqLworCQljbGVhcl9iaXQoX19MSU5LX1NUQVRFX0xJTktXQVRDSF9QRU5ESU5HLCAmZGV2LT5zdGF0ZSk7CisKKwkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApIHsKKwkJCW5ldGRldl9zdGF0ZV9jaGFuZ2UoZGV2KTsKKwkJfQorCisJCWRldl9wdXQoZGV2KTsKKwl9Cit9ICAgICAgIAorCisKK3N0YXRpYyB2b2lkIGxpbmt3YXRjaF9ldmVudCh2b2lkICpkdW1teSkKK3sKKwkvKiBMaW1pdCB0aGUgbnVtYmVyIG9mIGxpbmt3YXRjaCBldmVudHMgdG8gb25lCisJICogcGVyIHNlY29uZCBzbyB0aGF0IGEgcnVuYXdheSBkcml2ZXIgZG9lcyBub3QKKwkgKiBjYXVzZSBhIHN0b3JtIG9mIG1lc3NhZ2VzIG9uIHRoZSBuZXRsaW5rCisJICogc29ja2V0CisJICovCQorCWxpbmt3YXRjaF9uZXh0ZXZlbnQgPSBqaWZmaWVzICsgSFo7CisJY2xlYXJfYml0KExXX1JVTk5JTkcsICZsaW5rd2F0Y2hfZmxhZ3MpOworCisJcnRubF9zaGxvY2soKTsKKwlsaW5rd2F0Y2hfcnVuX3F1ZXVlKCk7CisJcnRubF9zaHVubG9jaygpOworfQorCisKK3ZvaWQgbGlua3dhdGNoX2ZpcmVfZXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoX19MSU5LX1NUQVRFX0xJTktXQVRDSF9QRU5ESU5HLCAmZGV2LT5zdGF0ZSkpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJc3RydWN0IGx3X2V2ZW50ICpldmVudDsKKworCQlpZiAodGVzdF9hbmRfc2V0X2JpdChMV19TRV9VU0VELCAmbGlua3dhdGNoX2ZsYWdzKSkgeworCQkJZXZlbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbHdfZXZlbnQpLCBHRlBfQVRPTUlDKTsKKworCQkJaWYgKHVubGlrZWx5KGV2ZW50ID09IE5VTEwpKSB7CisJCQkJY2xlYXJfYml0KF9fTElOS19TVEFURV9MSU5LV0FUQ0hfUEVORElORywgJmRldi0+c3RhdGUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWV2ZW50ID0gJnNpbmdsZWV2ZW50OworCQl9CisKKwkJZGV2X2hvbGQoZGV2KTsKKwkJZXZlbnQtPmRldiA9IGRldjsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbHdldmVudGxpc3RfbG9jaywgZmxhZ3MpOworCQlsaXN0X2FkZF90YWlsKCZldmVudC0+bGlzdCwgJmx3ZXZlbnRsaXN0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHdldmVudGxpc3RfbG9jaywgZmxhZ3MpOworCisJCWlmICghdGVzdF9hbmRfc2V0X2JpdChMV19SVU5OSU5HLCAmbGlua3dhdGNoX2ZsYWdzKSkgeworCQkJdW5zaWduZWQgbG9uZyB0aGlzZXZlbnQgPSBqaWZmaWVzOworCisJCQlpZiAodGhpc2V2ZW50ID49IGxpbmt3YXRjaF9uZXh0ZXZlbnQpIHsKKwkJCQlzY2hlZHVsZV93b3JrKCZsaW5rd2F0Y2hfd29yayk7CisJCQl9IGVsc2UgeworCQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbGlua3dhdGNoX3dvcmssIGxpbmt3YXRjaF9uZXh0ZXZlbnQgLSB0aGlzZXZlbnQpOworCQkJfQorCQl9CisJfQorfQorCitFWFBPUlRfU1lNQk9MKGxpbmt3YXRjaF9maXJlX2V2ZW50KTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25laWdoYm91ci5jIGIvbmV0L2NvcmUvbmVpZ2hib3VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEyZjY3YgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9jb3JlL25laWdoYm91ci5jCkBAIC0wLDAgKzEsMjM2MiBAQAorLyoKKyAqCUdlbmVyaWMgYWRkcmVzcyByZXNvbHV0aW9uIGVudGl0eQorICoKKyAqCUF1dGhvcnM6CisgKglQZWRybyBSb3F1ZQkJPHJvcXVlQGRpLmZjLnVsLnB0PgorICoJQWxleGV5IEt1em5ldHNvdgk8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglGaXhlczoKKyAqCVZpdGFseSBFLiBMYXZyb3YJcmVsZWFzaW5nIE5VTEwgbmVpZ2hib3IgaW4gbmVpZ2hfYWRkLgorICoJSGFyYWxkIFdlbHRlCQlBZGQgbmVpZ2hib3VyIGNhY2hlIHN0YXRpc3RpY3MgbGlrZSBydHN0YXQKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC90aW1lcy5oPgorI2luY2x1ZGUgPG5ldC9uZWlnaGJvdXIuaD4KKyNpbmNsdWRlIDxuZXQvZHN0Lmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKworI2RlZmluZSBORUlHSF9ERUJVRyAxCisKKyNkZWZpbmUgTkVJR0hfUFJJTlRLKHguLi4pIHByaW50ayh4KQorI2RlZmluZSBORUlHSF9OT1BSSU5USyh4Li4uKSBkbyB7IDsgfSB3aGlsZSgwKQorI2RlZmluZSBORUlHSF9QUklOVEswIE5FSUdIX1BSSU5USworI2RlZmluZSBORUlHSF9QUklOVEsxIE5FSUdIX05PUFJJTlRLCisjZGVmaW5lIE5FSUdIX1BSSU5USzIgTkVJR0hfTk9QUklOVEsKKworI2lmIE5FSUdIX0RFQlVHID49IDEKKyN1bmRlZiBORUlHSF9QUklOVEsxCisjZGVmaW5lIE5FSUdIX1BSSU5USzEgTkVJR0hfUFJJTlRLCisjZW5kaWYKKyNpZiBORUlHSF9ERUJVRyA+PSAyCisjdW5kZWYgTkVJR0hfUFJJTlRLMgorI2RlZmluZSBORUlHSF9QUklOVEsyIE5FSUdIX1BSSU5USworI2VuZGlmCisKKyNkZWZpbmUgUE5FSUdIX0hBU0hNQVNLCQkweEYKKworc3RhdGljIHZvaWQgbmVpZ2hfdGltZXJfaGFuZGxlcih1bnNpZ25lZCBsb25nIGFyZyk7CisjaWZkZWYgQ09ORklHX0FSUEQKK3N0YXRpYyB2b2lkIG5laWdoX2FwcF9ub3RpZnkoc3RydWN0IG5laWdoYm91ciAqbik7CisjZW5kaWYKK3N0YXRpYyBpbnQgcG5laWdoX2lmZG93bihzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIG5laWdoX2NoYW5nZWFkZHIoc3RydWN0IG5laWdoX3RhYmxlICp0YmwsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgc3RydWN0IG5laWdoX3RhYmxlICpuZWlnaF90YWJsZXM7CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBuZWlnaF9zdGF0X3NlcV9mb3BzOworCisvKgorICAgTmVpZ2hib3VyIGhhc2ggdGFibGUgYnVja2V0cyBhcmUgcHJvdGVjdGVkIHdpdGggcndsb2NrIHRibC0+bG9jay4KKworICAgLSBBbGwgdGhlIHNjYW5zL3VwZGF0ZXMgdG8gaGFzaCBidWNrZXRzIE1VU1QgYmUgbWFkZSB1bmRlciB0aGlzIGxvY2suCisgICAtIE5PVEhJTkcgY2xldmVyIHNob3VsZCBiZSBtYWRlIHVuZGVyIHRoaXMgbG9jazogbm8gY2FsbGJhY2tzCisgICAgIHRvIHByb3RvY29sIGJhY2tlbmRzLCBubyBhdHRlbXB0cyB0byBzZW5kIHNvbWV0aGluZyB0byBuZXR3b3JrLgorICAgICBJdCB3aWxsIHJlc3VsdCBpbiBkZWFkbG9ja3MsIGlmIGJhY2tlbmQvZHJpdmVyIHdhbnRzIHRvIHVzZSBuZWlnaGJvdXIKKyAgICAgY2FjaGUuCisgICAtIElmIHRoZSBlbnRyeSByZXF1aXJlcyBzb21lIG5vbi10cml2aWFsIGFjdGlvbnMsIGluY3JlYXNlCisgICAgIGl0cyByZWZlcmVuY2UgY291bnQgYW5kIHJlbGVhc2UgdGFibGUgbG9jay4KKworICAgTmVpZ2hib3VyIGVudHJpZXMgYXJlIHByb3RlY3RlZDoKKyAgIC0gd2l0aCByZWZlcmVuY2UgY291bnQuCisgICAtIHdpdGggcndsb2NrIG5laWdoLT5sb2NrCisKKyAgIFJlZmVyZW5jZSBjb3VudCBwcmV2ZW50cyBkZXN0cnVjdGlvbi4KKworICAgbmVpZ2gtPmxvY2sgbWFpbmx5IHNlcmlhbGl6ZXMgbGwgYWRkcmVzcyBkYXRhIGFuZCBpdHMgdmFsaWRpdHkgc3RhdGUuCisgICBIb3dldmVyLCB0aGUgc2FtZSBsb2NrIGlzIHVzZWQgdG8gcHJvdGVjdCBhbm90aGVyIGVudHJ5IGZpZWxkczoKKyAgICAtIHRpbWVyCisgICAgLSByZXNvbHV0aW9uIHF1ZXVlCisKKyAgIEFnYWluLCBub3RoaW5nIGNsZXZlciBzaGFsbCBiZSBtYWRlIHVuZGVyIG5laWdoLT5sb2NrLAorICAgdGhlIG1vc3QgY29tcGxpY2F0ZWQgcHJvY2VkdXJlLCB3aGljaCB3ZSBhbGxvdyBpcyBkZXYtPmhhcmRfaGVhZGVyLgorICAgSXQgaXMgc3VwcG9zZWQsIHRoYXQgZGV2LT5oYXJkX2hlYWRlciBpcyBzaW1wbGlzdGljIGFuZCBkb2VzCisgICBub3QgbWFrZSBjYWxsYmFja3MgdG8gbmVpZ2hib3VyIHRhYmxlcy4KKworICAgVGhlIGxhc3QgbG9jayBpcyBuZWlnaF90YmxfbG9jay4gSXQgaXMgcHVyZSBTTVAgbG9jaywgcHJvdGVjdGluZworICAgbGlzdCBvZiBuZWlnaGJvdXIgdGFibGVzLiBUaGlzIGxpc3QgaXMgdXNlZCBvbmx5IGluIHByb2Nlc3MgY29udGV4dCwKKyAqLworCitzdGF0aWMgREVGSU5FX1JXTE9DSyhuZWlnaF90YmxfbG9jayk7CisKK3N0YXRpYyBpbnQgbmVpZ2hfYmxhY2tob2xlKHN0cnVjdCBza19idWZmICpza2IpCit7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIC1FTkVURE9XTjsKK30KKworLyoKKyAqIEl0IGlzIHJhbmRvbSBkaXN0cmlidXRpb24gaW4gdGhlIGludGVydmFsICgxLzIpKmJhc2UuLi4oMy8yKSpiYXNlLgorICogSXQgY29ycmVzcG9uZHMgdG8gZGVmYXVsdCBJUHY2IHNldHRpbmdzIGFuZCBpcyBub3Qgb3ZlcnJpZGFibGUsCisgKiBiZWNhdXNlIGl0IGlzIHJlYWxseSByZWFzb25hYmxlIGNob2ljZS4KKyAqLworCit1bnNpZ25lZCBsb25nIG5laWdoX3JhbmRfcmVhY2hfdGltZSh1bnNpZ25lZCBsb25nIGJhc2UpCit7CisJcmV0dXJuIChiYXNlID8gKG5ldF9yYW5kb20oKSAlIGJhc2UpICsgKGJhc2UgPj4gMSkgOiAwKTsKK30KKworCitzdGF0aWMgaW50IG5laWdoX2ZvcmNlZF9nYyhzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCkKK3sKKwlpbnQgc2hydW5rID0gMDsKKwlpbnQgaTsKKworCU5FSUdIX0NBQ0hFX1NUQVRfSU5DKHRibCwgZm9yY2VkX2djX3J1bnMpOworCisJd3JpdGVfbG9ja19iaCgmdGJsLT5sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDw9IHRibC0+aGFzaF9tYXNrOyBpKyspIHsKKwkJc3RydWN0IG5laWdoYm91ciAqbiwgKipucDsKKworCQlucCA9ICZ0YmwtPmhhc2hfYnVja2V0c1tpXTsKKwkJd2hpbGUgKChuID0gKm5wKSAhPSBOVUxMKSB7CisJCQkvKiBOZWlnaGJvdXIgcmVjb3JkIG1heSBiZSBkaXNjYXJkZWQgaWY6CisJCQkgKiAtIG5vYm9keSByZWZlcnMgdG8gaXQuCisJCQkgKiAtIGl0IGlzIG5vdCBwZXJtYW5lbnQKKwkJCSAqLworCQkJd3JpdGVfbG9jaygmbi0+bG9jayk7CisJCQlpZiAoYXRvbWljX3JlYWQoJm4tPnJlZmNudCkgPT0gMSAmJgorCQkJICAgICEobi0+bnVkX3N0YXRlICYgTlVEX1BFUk1BTkVOVCkpIHsKKwkJCQkqbnAJPSBuLT5uZXh0OworCQkJCW4tPmRlYWQgPSAxOworCQkJCXNocnVuawk9IDE7CisJCQkJd3JpdGVfdW5sb2NrKCZuLT5sb2NrKTsKKwkJCQluZWlnaF9yZWxlYXNlKG4pOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJd3JpdGVfdW5sb2NrKCZuLT5sb2NrKTsKKwkJCW5wID0gJm4tPm5leHQ7CisJCX0KKwl9CisKKwl0YmwtPmxhc3RfZmx1c2ggPSBqaWZmaWVzOworCisJd3JpdGVfdW5sb2NrX2JoKCZ0YmwtPmxvY2spOworCisJcmV0dXJuIHNocnVuazsKK30KKworc3RhdGljIGludCBuZWlnaF9kZWxfdGltZXIoc3RydWN0IG5laWdoYm91ciAqbikKK3sKKwlpZiAoKG4tPm51ZF9zdGF0ZSAmIE5VRF9JTl9USU1FUikgJiYKKwkgICAgZGVsX3RpbWVyKCZuLT50aW1lcikpIHsKKwkJbmVpZ2hfcmVsZWFzZShuKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwbmVpZ2hfcXVldWVfcHVyZ2Uoc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZShsaXN0KSkgIT0gTlVMTCkgeworCQlkZXZfcHV0KHNrYi0+ZGV2KTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJfQorfQorCit2b2lkIG5laWdoX2NoYW5nZWFkZHIoc3RydWN0IG5laWdoX3RhYmxlICp0YmwsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisKKwl3cml0ZV9sb2NrX2JoKCZ0YmwtPmxvY2spOworCisJZm9yIChpPTA7IGkgPD0gdGJsLT5oYXNoX21hc2s7IGkrKykgeworCQlzdHJ1Y3QgbmVpZ2hib3VyICpuLCAqKm5wOworCisJCW5wID0gJnRibC0+aGFzaF9idWNrZXRzW2ldOworCQl3aGlsZSAoKG4gPSAqbnApICE9IE5VTEwpIHsKKwkJCWlmIChkZXYgJiYgbi0+ZGV2ICE9IGRldikgeworCQkJCW5wID0gJm4tPm5leHQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQkqbnAgPSBuLT5uZXh0OworCQkJd3JpdGVfbG9ja19iaCgmbi0+bG9jayk7CisJCQluLT5kZWFkID0gMTsKKwkJCW5laWdoX2RlbF90aW1lcihuKTsKKwkJCXdyaXRlX3VubG9ja19iaCgmbi0+bG9jayk7CisJCQluZWlnaF9yZWxlYXNlKG4pOworCQl9CisJfQorCisgICAgICAgIHdyaXRlX3VubG9ja19iaCgmdGJsLT5sb2NrKTsKK30KKworaW50IG5laWdoX2lmZG93bihzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKworCXdyaXRlX2xvY2tfYmgoJnRibC0+bG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IHRibC0+aGFzaF9tYXNrOyBpKyspIHsKKwkJc3RydWN0IG5laWdoYm91ciAqbiwgKipucCA9ICZ0YmwtPmhhc2hfYnVja2V0c1tpXTsKKworCQl3aGlsZSAoKG4gPSAqbnApICE9IE5VTEwpIHsKKwkJCWlmIChkZXYgJiYgbi0+ZGV2ICE9IGRldikgeworCQkJCW5wID0gJm4tPm5leHQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQkqbnAgPSBuLT5uZXh0OworCQkJd3JpdGVfbG9jaygmbi0+bG9jayk7CisJCQluZWlnaF9kZWxfdGltZXIobik7CisJCQluLT5kZWFkID0gMTsKKworCQkJaWYgKGF0b21pY19yZWFkKCZuLT5yZWZjbnQpICE9IDEpIHsKKwkJCQkvKiBUaGUgbW9zdCB1bnBsZWFzYW50IHNpdHVhdGlvbi4KKwkJCQkgICBXZSBtdXN0IGRlc3Ryb3kgbmVpZ2hib3VyIGVudHJ5LAorCQkJCSAgIGJ1dCBzb21lb25lIHN0aWxsIHVzZXMgaXQuCisKKwkJCQkgICBUaGUgZGVzdHJveSB3aWxsIGJlIGRlbGF5ZWQgdW50aWwKKwkJCQkgICB0aGUgbGFzdCB1c2VyIHJlbGVhc2VzIHVzLCBidXQKKwkJCQkgICB3ZSBtdXN0IGtpbGwgdGltZXJzIGV0Yy4gYW5kIG1vdmUKKwkJCQkgICBpdCB0byBzYWZlIHN0YXRlLgorCQkJCSAqLworCQkJCXNrYl9xdWV1ZV9wdXJnZSgmbi0+YXJwX3F1ZXVlKTsKKwkJCQluLT5vdXRwdXQgPSBuZWlnaF9ibGFja2hvbGU7CisJCQkJaWYgKG4tPm51ZF9zdGF0ZSAmIE5VRF9WQUxJRCkKKwkJCQkJbi0+bnVkX3N0YXRlID0gTlVEX05PQVJQOworCQkJCWVsc2UKKwkJCQkJbi0+bnVkX3N0YXRlID0gTlVEX05PTkU7CisJCQkJTkVJR0hfUFJJTlRLMigibmVpZ2ggJXAgaXMgc3RyYXkuXG4iLCBuKTsKKwkJCX0KKwkJCXdyaXRlX3VubG9jaygmbi0+bG9jayk7CisJCQluZWlnaF9yZWxlYXNlKG4pOworCQl9CisJfQorCisJcG5laWdoX2lmZG93bih0YmwsIGRldik7CisJd3JpdGVfdW5sb2NrX2JoKCZ0YmwtPmxvY2spOworCisJZGVsX3RpbWVyX3N5bmMoJnRibC0+cHJveHlfdGltZXIpOworCXBuZWlnaF9xdWV1ZV9wdXJnZSgmdGJsLT5wcm94eV9xdWV1ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaF9hbGxvYyhzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCkKK3sKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisJaW50IGVudHJpZXM7CisKKwllbnRyaWVzID0gYXRvbWljX2luY19yZXR1cm4oJnRibC0+ZW50cmllcykgLSAxOworCWlmIChlbnRyaWVzID49IHRibC0+Z2NfdGhyZXNoMyB8fAorCSAgICAoZW50cmllcyA+PSB0YmwtPmdjX3RocmVzaDIgJiYKKwkgICAgIHRpbWVfYWZ0ZXIobm93LCB0YmwtPmxhc3RfZmx1c2ggKyA1ICogSFopKSkgeworCQlpZiAoIW5laWdoX2ZvcmNlZF9nYyh0YmwpICYmCisJCSAgICBlbnRyaWVzID49IHRibC0+Z2NfdGhyZXNoMykKKwkJCWdvdG8gb3V0X2VudHJpZXM7CisJfQorCisJbiA9IGttZW1fY2FjaGVfYWxsb2ModGJsLT5rbWVtX2NhY2hlcCwgU0xBQl9BVE9NSUMpOworCWlmICghbikKKwkJZ290byBvdXRfZW50cmllczsKKworCW1lbXNldChuLCAwLCB0YmwtPmVudHJ5X3NpemUpOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbi0+YXJwX3F1ZXVlKTsKKwlyd2xvY2tfaW5pdCgmbi0+bG9jayk7CisJbi0+dXBkYXRlZAkgID0gbi0+dXNlZCA9IG5vdzsKKwluLT5udWRfc3RhdGUJICA9IE5VRF9OT05FOworCW4tPm91dHB1dAkgID0gbmVpZ2hfYmxhY2tob2xlOworCW4tPnBhcm1zCSAgPSBuZWlnaF9wYXJtc19jbG9uZSgmdGJsLT5wYXJtcyk7CisJaW5pdF90aW1lcigmbi0+dGltZXIpOworCW4tPnRpbWVyLmZ1bmN0aW9uID0gbmVpZ2hfdGltZXJfaGFuZGxlcjsKKwluLT50aW1lci5kYXRhCSAgPSAodW5zaWduZWQgbG9uZyluOworCisJTkVJR0hfQ0FDSEVfU1RBVF9JTkModGJsLCBhbGxvY3MpOworCW4tPnRibAkJICA9IHRibDsKKwlhdG9taWNfc2V0KCZuLT5yZWZjbnQsIDEpOworCW4tPmRlYWQJCSAgPSAxOworb3V0OgorCXJldHVybiBuOworCitvdXRfZW50cmllczoKKwlhdG9taWNfZGVjKCZ0YmwtPmVudHJpZXMpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgc3RydWN0IG5laWdoYm91ciAqKm5laWdoX2hhc2hfYWxsb2ModW5zaWduZWQgaW50IGVudHJpZXMpCit7CisJdW5zaWduZWQgbG9uZyBzaXplID0gZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgbmVpZ2hib3VyICopOworCXN0cnVjdCBuZWlnaGJvdXIgKipyZXQ7CisKKwlpZiAoc2l6ZSA8PSBQQUdFX1NJWkUpIHsKKwkJcmV0ID0ga21hbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKKwl9IGVsc2UgeworCQlyZXQgPSAoc3RydWN0IG5laWdoYm91ciAqKikKKwkJCV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0FUT01JQywgZ2V0X29yZGVyKHNpemUpKTsKKwl9CisJaWYgKHJldCkKKwkJbWVtc2V0KHJldCwgMCwgc2l6ZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBuZWlnaF9oYXNoX2ZyZWUoc3RydWN0IG5laWdoYm91ciAqKmhhc2gsIHVuc2lnbmVkIGludCBlbnRyaWVzKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IGVudHJpZXMgKiBzaXplb2Yoc3RydWN0IG5laWdoYm91ciAqKTsKKworCWlmIChzaXplIDw9IFBBR0VfU0laRSkKKwkJa2ZyZWUoaGFzaCk7CisJZWxzZQorCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWhhc2gsIGdldF9vcmRlcihzaXplKSk7Cit9CisKK3N0YXRpYyB2b2lkIG5laWdoX2hhc2hfZ3JvdyhzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCwgdW5zaWduZWQgbG9uZyBuZXdfZW50cmllcykKK3sKKwlzdHJ1Y3QgbmVpZ2hib3VyICoqbmV3X2hhc2gsICoqb2xkX2hhc2g7CisJdW5zaWduZWQgaW50IGksIG5ld19oYXNoX21hc2ssIG9sZF9lbnRyaWVzOworCisJTkVJR0hfQ0FDSEVfU1RBVF9JTkModGJsLCBoYXNoX2dyb3dzKTsKKworCUJVR19PTihuZXdfZW50cmllcyAmIChuZXdfZW50cmllcyAtIDEpKTsKKwluZXdfaGFzaCA9IG5laWdoX2hhc2hfYWxsb2MobmV3X2VudHJpZXMpOworCWlmICghbmV3X2hhc2gpCisJCXJldHVybjsKKworCW9sZF9lbnRyaWVzID0gdGJsLT5oYXNoX21hc2sgKyAxOworCW5ld19oYXNoX21hc2sgPSBuZXdfZW50cmllcyAtIDE7CisJb2xkX2hhc2ggPSB0YmwtPmhhc2hfYnVja2V0czsKKworCWdldF9yYW5kb21fYnl0ZXMoJnRibC0+aGFzaF9ybmQsIHNpemVvZih0YmwtPmhhc2hfcm5kKSk7CisJZm9yIChpID0gMDsgaSA8IG9sZF9lbnRyaWVzOyBpKyspIHsKKwkJc3RydWN0IG5laWdoYm91ciAqbiwgKm5leHQ7CisKKwkJZm9yIChuID0gb2xkX2hhc2hbaV07IG47IG4gPSBuZXh0KSB7CisJCQl1bnNpZ25lZCBpbnQgaGFzaF92YWwgPSB0YmwtPmhhc2gobi0+cHJpbWFyeV9rZXksIG4tPmRldik7CisKKwkJCWhhc2hfdmFsICY9IG5ld19oYXNoX21hc2s7CisJCQluZXh0ID0gbi0+bmV4dDsKKworCQkJbi0+bmV4dCA9IG5ld19oYXNoW2hhc2hfdmFsXTsKKwkJCW5ld19oYXNoW2hhc2hfdmFsXSA9IG47CisJCX0KKwl9CisJdGJsLT5oYXNoX2J1Y2tldHMgPSBuZXdfaGFzaDsKKwl0YmwtPmhhc2hfbWFzayA9IG5ld19oYXNoX21hc2s7CisKKwluZWlnaF9oYXNoX2ZyZWUob2xkX2hhc2gsIG9sZF9lbnRyaWVzKTsKK30KKworc3RydWN0IG5laWdoYm91ciAqbmVpZ2hfbG9va3VwKHN0cnVjdCBuZWlnaF90YWJsZSAqdGJsLCBjb25zdCB2b2lkICpwa2V5LAorCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5laWdoYm91ciAqbjsKKwlpbnQga2V5X2xlbiA9IHRibC0+a2V5X2xlbjsKKwl1MzIgaGFzaF92YWwgPSB0YmwtPmhhc2gocGtleSwgZGV2KSAmIHRibC0+aGFzaF9tYXNrOworCQorCU5FSUdIX0NBQ0hFX1NUQVRfSU5DKHRibCwgbG9va3Vwcyk7CisKKwlyZWFkX2xvY2tfYmgoJnRibC0+bG9jayk7CisJZm9yIChuID0gdGJsLT5oYXNoX2J1Y2tldHNbaGFzaF92YWxdOyBuOyBuID0gbi0+bmV4dCkgeworCQlpZiAoZGV2ID09IG4tPmRldiAmJiAhbWVtY21wKG4tPnByaW1hcnlfa2V5LCBwa2V5LCBrZXlfbGVuKSkgeworCQkJbmVpZ2hfaG9sZChuKTsKKwkJCU5FSUdIX0NBQ0hFX1NUQVRfSU5DKHRibCwgaGl0cyk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZWFkX3VubG9ja19iaCgmdGJsLT5sb2NrKTsKKwlyZXR1cm4gbjsKK30KKworc3RydWN0IG5laWdoYm91ciAqbmVpZ2hfbG9va3VwX25vZGV2KHN0cnVjdCBuZWlnaF90YWJsZSAqdGJsLCBjb25zdCB2b2lkICpwa2V5KQoreworCXN0cnVjdCBuZWlnaGJvdXIgKm47CisJaW50IGtleV9sZW4gPSB0YmwtPmtleV9sZW47CisJdTMyIGhhc2hfdmFsID0gdGJsLT5oYXNoKHBrZXksIE5VTEwpICYgdGJsLT5oYXNoX21hc2s7CisKKwlORUlHSF9DQUNIRV9TVEFUX0lOQyh0YmwsIGxvb2t1cHMpOworCisJcmVhZF9sb2NrX2JoKCZ0YmwtPmxvY2spOworCWZvciAobiA9IHRibC0+aGFzaF9idWNrZXRzW2hhc2hfdmFsXTsgbjsgbiA9IG4tPm5leHQpIHsKKwkJaWYgKCFtZW1jbXAobi0+cHJpbWFyeV9rZXksIHBrZXksIGtleV9sZW4pKSB7CisJCQluZWlnaF9ob2xkKG4pOworCQkJTkVJR0hfQ0FDSEVfU1RBVF9JTkModGJsLCBoaXRzKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJlYWRfdW5sb2NrX2JoKCZ0YmwtPmxvY2spOworCXJldHVybiBuOworfQorCitzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaF9jcmVhdGUoc3RydWN0IG5laWdoX3RhYmxlICp0YmwsIGNvbnN0IHZvaWQgKnBrZXksCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1MzIgaGFzaF92YWw7CisJaW50IGtleV9sZW4gPSB0YmwtPmtleV9sZW47CisJaW50IGVycm9yOworCXN0cnVjdCBuZWlnaGJvdXIgKm4xLCAqcmMsICpuID0gbmVpZ2hfYWxsb2ModGJsKTsKKworCWlmICghbikgeworCQlyYyA9IEVSUl9QVFIoLUVOT0JVRlMpOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1jcHkobi0+cHJpbWFyeV9rZXksIHBrZXksIGtleV9sZW4pOworCW4tPmRldiA9IGRldjsKKwlkZXZfaG9sZChkZXYpOworCisJLyogUHJvdG9jb2wgc3BlY2lmaWMgc2V0dXAuICovCisJaWYgKHRibC0+Y29uc3RydWN0b3IgJiYJKGVycm9yID0gdGJsLT5jb25zdHJ1Y3RvcihuKSkgPCAwKSB7CisJCXJjID0gRVJSX1BUUihlcnJvcik7CisJCWdvdG8gb3V0X25laWdoX3JlbGVhc2U7CisJfQorCisJLyogRGV2aWNlIHNwZWNpZmljIHNldHVwLiAqLworCWlmIChuLT5wYXJtcy0+bmVpZ2hfc2V0dXAgJiYKKwkgICAgKGVycm9yID0gbi0+cGFybXMtPm5laWdoX3NldHVwKG4pKSA8IDApIHsKKwkJcmMgPSBFUlJfUFRSKGVycm9yKTsKKwkJZ290byBvdXRfbmVpZ2hfcmVsZWFzZTsKKwl9CisKKwluLT5jb25maXJtZWQgPSBqaWZmaWVzIC0gKG4tPnBhcm1zLT5iYXNlX3JlYWNoYWJsZV90aW1lIDw8IDEpOworCisJd3JpdGVfbG9ja19iaCgmdGJsLT5sb2NrKTsKKworCWlmIChhdG9taWNfcmVhZCgmdGJsLT5lbnRyaWVzKSA+ICh0YmwtPmhhc2hfbWFzayArIDEpKQorCQluZWlnaF9oYXNoX2dyb3codGJsLCAodGJsLT5oYXNoX21hc2sgKyAxKSA8PCAxKTsKKworCWhhc2hfdmFsID0gdGJsLT5oYXNoKHBrZXksIGRldikgJiB0YmwtPmhhc2hfbWFzazsKKworCWlmIChuLT5wYXJtcy0+ZGVhZCkgeworCQlyYyA9IEVSUl9QVFIoLUVJTlZBTCk7CisJCWdvdG8gb3V0X3RibF91bmxvY2s7CisJfQorCisJZm9yIChuMSA9IHRibC0+aGFzaF9idWNrZXRzW2hhc2hfdmFsXTsgbjE7IG4xID0gbjEtPm5leHQpIHsKKwkJaWYgKGRldiA9PSBuMS0+ZGV2ICYmICFtZW1jbXAobjEtPnByaW1hcnlfa2V5LCBwa2V5LCBrZXlfbGVuKSkgeworCQkJbmVpZ2hfaG9sZChuMSk7CisJCQlyYyA9IG4xOworCQkJZ290byBvdXRfdGJsX3VubG9jazsKKwkJfQorCX0KKworCW4tPm5leHQgPSB0YmwtPmhhc2hfYnVja2V0c1toYXNoX3ZhbF07CisJdGJsLT5oYXNoX2J1Y2tldHNbaGFzaF92YWxdID0gbjsKKwluLT5kZWFkID0gMDsKKwluZWlnaF9ob2xkKG4pOworCXdyaXRlX3VubG9ja19iaCgmdGJsLT5sb2NrKTsKKwlORUlHSF9QUklOVEsyKCJuZWlnaCAlcCBpcyBjcmVhdGVkLlxuIiwgbik7CisJcmMgPSBuOworb3V0OgorCXJldHVybiByYzsKK291dF90YmxfdW5sb2NrOgorCXdyaXRlX3VubG9ja19iaCgmdGJsLT5sb2NrKTsKK291dF9uZWlnaF9yZWxlYXNlOgorCW5laWdoX3JlbGVhc2Uobik7CisJZ290byBvdXQ7Cit9CisKK3N0cnVjdCBwbmVpZ2hfZW50cnkgKiBwbmVpZ2hfbG9va3VwKHN0cnVjdCBuZWlnaF90YWJsZSAqdGJsLCBjb25zdCB2b2lkICpwa2V5LAorCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY3JlYXQpCit7CisJc3RydWN0IHBuZWlnaF9lbnRyeSAqbjsKKwlpbnQga2V5X2xlbiA9IHRibC0+a2V5X2xlbjsKKwl1MzIgaGFzaF92YWwgPSAqKHUzMiAqKShwa2V5ICsga2V5X2xlbiAtIDQpOworCisJaGFzaF92YWwgXj0gKGhhc2hfdmFsID4+IDE2KTsKKwloYXNoX3ZhbCBePSBoYXNoX3ZhbCA+PiA4OworCWhhc2hfdmFsIF49IGhhc2hfdmFsID4+IDQ7CisJaGFzaF92YWwgJj0gUE5FSUdIX0hBU0hNQVNLOworCisJcmVhZF9sb2NrX2JoKCZ0YmwtPmxvY2spOworCisJZm9yIChuID0gdGJsLT5waGFzaF9idWNrZXRzW2hhc2hfdmFsXTsgbjsgbiA9IG4tPm5leHQpIHsKKwkJaWYgKCFtZW1jbXAobi0+a2V5LCBwa2V5LCBrZXlfbGVuKSAmJgorCQkgICAgKG4tPmRldiA9PSBkZXYgfHwgIW4tPmRldikpIHsKKwkJCXJlYWRfdW5sb2NrX2JoKCZ0YmwtPmxvY2spOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJcmVhZF91bmxvY2tfYmgoJnRibC0+bG9jayk7CisJbiA9IE5VTEw7CisJaWYgKCFjcmVhdCkKKwkJZ290byBvdXQ7CisKKwluID0ga21hbGxvYyhzaXplb2YoKm4pICsga2V5X2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuKQorCQlnb3RvIG91dDsKKworCW1lbWNweShuLT5rZXksIHBrZXksIGtleV9sZW4pOworCW4tPmRldiA9IGRldjsKKwlpZiAoZGV2KQorCQlkZXZfaG9sZChkZXYpOworCisJaWYgKHRibC0+cGNvbnN0cnVjdG9yICYmIHRibC0+cGNvbnN0cnVjdG9yKG4pKSB7CisJCWlmIChkZXYpCisJCQlkZXZfcHV0KGRldik7CisJCWtmcmVlKG4pOworCQluID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCisJd3JpdGVfbG9ja19iaCgmdGJsLT5sb2NrKTsKKwluLT5uZXh0ID0gdGJsLT5waGFzaF9idWNrZXRzW2hhc2hfdmFsXTsKKwl0YmwtPnBoYXNoX2J1Y2tldHNbaGFzaF92YWxdID0gbjsKKwl3cml0ZV91bmxvY2tfYmgoJnRibC0+bG9jayk7CitvdXQ6CisJcmV0dXJuIG47Cit9CisKKworaW50IHBuZWlnaF9kZWxldGUoc3RydWN0IG5laWdoX3RhYmxlICp0YmwsIGNvbnN0IHZvaWQgKnBrZXksCisJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcG5laWdoX2VudHJ5ICpuLCAqKm5wOworCWludCBrZXlfbGVuID0gdGJsLT5rZXlfbGVuOworCXUzMiBoYXNoX3ZhbCA9ICoodTMyICopKHBrZXkgKyBrZXlfbGVuIC0gNCk7CisKKwloYXNoX3ZhbCBePSAoaGFzaF92YWwgPj4gMTYpOworCWhhc2hfdmFsIF49IGhhc2hfdmFsID4+IDg7CisJaGFzaF92YWwgXj0gaGFzaF92YWwgPj4gNDsKKwloYXNoX3ZhbCAmPSBQTkVJR0hfSEFTSE1BU0s7CisKKwl3cml0ZV9sb2NrX2JoKCZ0YmwtPmxvY2spOworCWZvciAobnAgPSAmdGJsLT5waGFzaF9idWNrZXRzW2hhc2hfdmFsXTsgKG4gPSAqbnApICE9IE5VTEw7CisJICAgICBucCA9ICZuLT5uZXh0KSB7CisJCWlmICghbWVtY21wKG4tPmtleSwgcGtleSwga2V5X2xlbikgJiYgbi0+ZGV2ID09IGRldikgeworCQkJKm5wID0gbi0+bmV4dDsKKwkJCXdyaXRlX3VubG9ja19iaCgmdGJsLT5sb2NrKTsKKwkJCWlmICh0YmwtPnBkZXN0cnVjdG9yKQorCQkJCXRibC0+cGRlc3RydWN0b3Iobik7CisJCQlpZiAobi0+ZGV2KQorCQkJCWRldl9wdXQobi0+ZGV2KTsKKwkJCWtmcmVlKG4pOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZ0YmwtPmxvY2spOworCXJldHVybiAtRU5PRU5UOworfQorCitzdGF0aWMgaW50IHBuZWlnaF9pZmRvd24oc3RydWN0IG5laWdoX3RhYmxlICp0YmwsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBuZWlnaF9lbnRyeSAqbiwgKipucDsKKwl1MzIgaDsKKworCWZvciAoaCA9IDA7IGggPD0gUE5FSUdIX0hBU0hNQVNLOyBoKyspIHsKKwkJbnAgPSAmdGJsLT5waGFzaF9idWNrZXRzW2hdOworCQl3aGlsZSAoKG4gPSAqbnApICE9IE5VTEwpIHsKKwkJCWlmICghZGV2IHx8IG4tPmRldiA9PSBkZXYpIHsKKwkJCQkqbnAgPSBuLT5uZXh0OworCQkJCWlmICh0YmwtPnBkZXN0cnVjdG9yKQorCQkJCQl0YmwtPnBkZXN0cnVjdG9yKG4pOworCQkJCWlmIChuLT5kZXYpCisJCQkJCWRldl9wdXQobi0+ZGV2KTsKKwkJCQlrZnJlZShuKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCW5wID0gJm4tPm5leHQ7CisJCX0KKwl9CisJcmV0dXJuIC1FTk9FTlQ7Cit9CisKKworLyoKKyAqCW5laWdoYm91ciBtdXN0IGFscmVhZHkgYmUgb3V0IG9mIHRoZSB0YWJsZTsKKyAqCisgKi8KK3ZvaWQgbmVpZ2hfZGVzdHJveShzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCkKK3sKKwlzdHJ1Y3QgaGhfY2FjaGUgKmhoOworCisJTkVJR0hfQ0FDSEVfU1RBVF9JTkMobmVpZ2gtPnRibCwgZGVzdHJveXMpOworCisJaWYgKCFuZWlnaC0+ZGVhZCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiRGVzdHJveWluZyBhbGl2ZSBuZWlnaGJvdXIgJXBcbiIsIG5laWdoKTsKKwkJZHVtcF9zdGFjaygpOworCQlyZXR1cm47CisJfQorCisJaWYgKG5laWdoX2RlbF90aW1lcihuZWlnaCkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkltcG9zc2libGUgZXZlbnQuXG4iKTsKKworCXdoaWxlICgoaGggPSBuZWlnaC0+aGgpICE9IE5VTEwpIHsKKwkJbmVpZ2gtPmhoID0gaGgtPmhoX25leHQ7CisJCWhoLT5oaF9uZXh0ID0gTlVMTDsKKwkJd3JpdGVfbG9ja19iaCgmaGgtPmhoX2xvY2spOworCQloaC0+aGhfb3V0cHV0ID0gbmVpZ2hfYmxhY2tob2xlOworCQl3cml0ZV91bmxvY2tfYmgoJmhoLT5oaF9sb2NrKTsKKwkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmhoLT5oaF9yZWZjbnQpKQorCQkJa2ZyZWUoaGgpOworCX0KKworCWlmIChuZWlnaC0+b3BzICYmIG5laWdoLT5vcHMtPmRlc3RydWN0b3IpCisJCShuZWlnaC0+b3BzLT5kZXN0cnVjdG9yKShuZWlnaCk7CisKKwlza2JfcXVldWVfcHVyZ2UoJm5laWdoLT5hcnBfcXVldWUpOworCisJZGV2X3B1dChuZWlnaC0+ZGV2KTsKKwluZWlnaF9wYXJtc19wdXQobmVpZ2gtPnBhcm1zKTsKKworCU5FSUdIX1BSSU5USzIoIm5laWdoICVwIGlzIGRlc3Ryb3llZC5cbiIsIG5laWdoKTsKKworCWF0b21pY19kZWMoJm5laWdoLT50YmwtPmVudHJpZXMpOworCWttZW1fY2FjaGVfZnJlZShuZWlnaC0+dGJsLT5rbWVtX2NhY2hlcCwgbmVpZ2gpOworfQorCisvKiBOZWlnaGJvdXIgc3RhdGUgaXMgc3VzcGljaW91czsKKyAgIGRpc2FibGUgZmFzdCBwYXRoLgorCisgICBDYWxsZWQgd2l0aCB3cml0ZV9sb2NrZWQgbmVpZ2guCisgKi8KK3N0YXRpYyB2b2lkIG5laWdoX3N1c3BlY3Qoc3RydWN0IG5laWdoYm91ciAqbmVpZ2gpCit7CisJc3RydWN0IGhoX2NhY2hlICpoaDsKKworCU5FSUdIX1BSSU5USzIoIm5laWdoICVwIGlzIHN1c3BlY3RlZC5cbiIsIG5laWdoKTsKKworCW5laWdoLT5vdXRwdXQgPSBuZWlnaC0+b3BzLT5vdXRwdXQ7CisKKwlmb3IgKGhoID0gbmVpZ2gtPmhoOyBoaDsgaGggPSBoaC0+aGhfbmV4dCkKKwkJaGgtPmhoX291dHB1dCA9IG5laWdoLT5vcHMtPm91dHB1dDsKK30KKworLyogTmVpZ2hib3VyIHN0YXRlIGlzIE9LOworICAgZW5hYmxlIGZhc3QgcGF0aC4KKworICAgQ2FsbGVkIHdpdGggd3JpdGVfbG9ja2VkIG5laWdoLgorICovCitzdGF0aWMgdm9pZCBuZWlnaF9jb25uZWN0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoKQoreworCXN0cnVjdCBoaF9jYWNoZSAqaGg7CisKKwlORUlHSF9QUklOVEsyKCJuZWlnaCAlcCBpcyBjb25uZWN0ZWQuXG4iLCBuZWlnaCk7CisKKwluZWlnaC0+b3V0cHV0ID0gbmVpZ2gtPm9wcy0+Y29ubmVjdGVkX291dHB1dDsKKworCWZvciAoaGggPSBuZWlnaC0+aGg7IGhoOyBoaCA9IGhoLT5oaF9uZXh0KQorCQloaC0+aGhfb3V0cHV0ID0gbmVpZ2gtPm9wcy0+aGhfb3V0cHV0OworfQorCitzdGF0aWMgdm9pZCBuZWlnaF9wZXJpb2RpY190aW1lcih1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCA9IChzdHJ1Y3QgbmVpZ2hfdGFibGUgKilhcmc7CisJc3RydWN0IG5laWdoYm91ciAqbiwgKipucDsKKwl1bnNpZ25lZCBsb25nIGV4cGlyZSwgbm93ID0gamlmZmllczsKKworCU5FSUdIX0NBQ0hFX1NUQVRfSU5DKHRibCwgcGVyaW9kaWNfZ2NfcnVucyk7CisKKwl3cml0ZV9sb2NrKCZ0YmwtPmxvY2spOworCisJLyoKKwkgKglwZXJpb2RpY2FsbHkgcmVjb21wdXRlIFJlYWNoYWJsZVRpbWUgZnJvbSByYW5kb20gZnVuY3Rpb24KKwkgKi8KKworCWlmICh0aW1lX2FmdGVyKG5vdywgdGJsLT5sYXN0X3JhbmQgKyAzMDAgKiBIWikpIHsKKwkJc3RydWN0IG5laWdoX3Bhcm1zICpwOworCQl0YmwtPmxhc3RfcmFuZCA9IG5vdzsKKwkJZm9yIChwID0gJnRibC0+cGFybXM7IHA7IHAgPSBwLT5uZXh0KQorCQkJcC0+cmVhY2hhYmxlX3RpbWUgPQorCQkJCW5laWdoX3JhbmRfcmVhY2hfdGltZShwLT5iYXNlX3JlYWNoYWJsZV90aW1lKTsKKwl9CisKKwlucCA9ICZ0YmwtPmhhc2hfYnVja2V0c1t0YmwtPmhhc2hfY2hhaW5fZ2NdOworCXRibC0+aGFzaF9jaGFpbl9nYyA9ICgodGJsLT5oYXNoX2NoYWluX2djICsgMSkgJiB0YmwtPmhhc2hfbWFzayk7CisKKwl3aGlsZSAoKG4gPSAqbnApICE9IE5VTEwpIHsKKwkJdW5zaWduZWQgaW50IHN0YXRlOworCisJCXdyaXRlX2xvY2soJm4tPmxvY2spOworCisJCXN0YXRlID0gbi0+bnVkX3N0YXRlOworCQlpZiAoc3RhdGUgJiAoTlVEX1BFUk1BTkVOVCB8IE5VRF9JTl9USU1FUikpIHsKKwkJCXdyaXRlX3VubG9jaygmbi0+bG9jayk7CisJCQlnb3RvIG5leHRfZWx0OworCQl9CisKKwkJaWYgKHRpbWVfYmVmb3JlKG4tPnVzZWQsIG4tPmNvbmZpcm1lZCkpCisJCQluLT51c2VkID0gbi0+Y29uZmlybWVkOworCisJCWlmIChhdG9taWNfcmVhZCgmbi0+cmVmY250KSA9PSAxICYmCisJCSAgICAoc3RhdGUgPT0gTlVEX0ZBSUxFRCB8fAorCQkgICAgIHRpbWVfYWZ0ZXIobm93LCBuLT51c2VkICsgbi0+cGFybXMtPmdjX3N0YWxldGltZSkpKSB7CisJCQkqbnAgPSBuLT5uZXh0OworCQkJbi0+ZGVhZCA9IDE7CisJCQl3cml0ZV91bmxvY2soJm4tPmxvY2spOworCQkJbmVpZ2hfcmVsZWFzZShuKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXdyaXRlX3VubG9jaygmbi0+bG9jayk7CisKK25leHRfZWx0OgorCQlucCA9ICZuLT5uZXh0OworCX0KKworIAkvKiBDeWNsZSB0aHJvdWdoIGFsbCBoYXNoIGJ1Y2tldHMgZXZlcnkgYmFzZV9yZWFjaGFibGVfdGltZS8yIHRpY2tzLgorIAkgKiBBUlAgZW50cnkgdGltZW91dHMgcmFuZ2UgZnJvbSAxLzIgYmFzZV9yZWFjaGFibGVfdGltZSB0byAzLzIKKyAJICogYmFzZV9yZWFjaGFibGVfdGltZS4KKwkgKi8KKwlleHBpcmUgPSB0YmwtPnBhcm1zLmJhc2VfcmVhY2hhYmxlX3RpbWUgPj4gMTsKKwlleHBpcmUgLz0gKHRibC0+aGFzaF9tYXNrICsgMSk7CisJaWYgKCFleHBpcmUpCisJCWV4cGlyZSA9IDE7CisKKyAJbW9kX3RpbWVyKCZ0YmwtPmdjX3RpbWVyLCBub3cgKyBleHBpcmUpOworCisJd3JpdGVfdW5sb2NrKCZ0YmwtPmxvY2spOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgbmVpZ2hfbWF4X3Byb2JlcyhzdHJ1Y3QgbmVpZ2hib3VyICpuKQoreworCXN0cnVjdCBuZWlnaF9wYXJtcyAqcCA9IG4tPnBhcm1zOworCXJldHVybiAobi0+bnVkX3N0YXRlICYgTlVEX1BST0JFID8KKwkJcC0+dWNhc3RfcHJvYmVzIDoKKwkJcC0+dWNhc3RfcHJvYmVzICsgcC0+YXBwX3Byb2JlcyArIHAtPm1jYXN0X3Byb2Jlcyk7Cit9CisKKworLyogQ2FsbGVkIHdoZW4gYSB0aW1lciBleHBpcmVzIGZvciBhIG5laWdoYm91ciBlbnRyeS4gKi8KKworc3RhdGljIHZvaWQgbmVpZ2hfdGltZXJfaGFuZGxlcih1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl1bnNpZ25lZCBsb25nIG5vdywgbmV4dDsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCA9IChzdHJ1Y3QgbmVpZ2hib3VyICopYXJnOworCXVuc2lnbmVkIHN0YXRlOworCWludCBub3RpZnkgPSAwOworCisJd3JpdGVfbG9jaygmbmVpZ2gtPmxvY2spOworCisJc3RhdGUgPSBuZWlnaC0+bnVkX3N0YXRlOworCW5vdyA9IGppZmZpZXM7CisJbmV4dCA9IG5vdyArIEhaOworCisJaWYgKCEoc3RhdGUgJiBOVURfSU5fVElNRVIpKSB7CisjaWZuZGVmIENPTkZJR19TTVAKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibmVpZ2g6IHRpbWVyICYgIW51ZF9pbl90aW1lclxuIik7CisjZW5kaWYKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHN0YXRlICYgTlVEX1JFQUNIQUJMRSkgeworCQlpZiAodGltZV9iZWZvcmVfZXEobm93LCAKKwkJCQkgICBuZWlnaC0+Y29uZmlybWVkICsgbmVpZ2gtPnBhcm1zLT5yZWFjaGFibGVfdGltZSkpIHsKKwkJCU5FSUdIX1BSSU5USzIoIm5laWdoICVwIGlzIHN0aWxsIGFsaXZlLlxuIiwgbmVpZ2gpOworCQkJbmV4dCA9IG5laWdoLT5jb25maXJtZWQgKyBuZWlnaC0+cGFybXMtPnJlYWNoYWJsZV90aW1lOworCQl9IGVsc2UgaWYgKHRpbWVfYmVmb3JlX2VxKG5vdywKKwkJCQkJICBuZWlnaC0+dXNlZCArIG5laWdoLT5wYXJtcy0+ZGVsYXlfcHJvYmVfdGltZSkpIHsKKwkJCU5FSUdIX1BSSU5USzIoIm5laWdoICVwIGlzIGRlbGF5ZWQuXG4iLCBuZWlnaCk7CisJCQluZWlnaC0+bnVkX3N0YXRlID0gTlVEX0RFTEFZOworCQkJbmVpZ2hfc3VzcGVjdChuZWlnaCk7CisJCQluZXh0ID0gbm93ICsgbmVpZ2gtPnBhcm1zLT5kZWxheV9wcm9iZV90aW1lOworCQl9IGVsc2UgeworCQkJTkVJR0hfUFJJTlRLMigibmVpZ2ggJXAgaXMgc3VzcGVjdGVkLlxuIiwgbmVpZ2gpOworCQkJbmVpZ2gtPm51ZF9zdGF0ZSA9IE5VRF9TVEFMRTsKKwkJCW5laWdoX3N1c3BlY3QobmVpZ2gpOworCQl9CisJfSBlbHNlIGlmIChzdGF0ZSAmIE5VRF9ERUxBWSkgeworCQlpZiAodGltZV9iZWZvcmVfZXEobm93LCAKKwkJCQkgICBuZWlnaC0+Y29uZmlybWVkICsgbmVpZ2gtPnBhcm1zLT5kZWxheV9wcm9iZV90aW1lKSkgeworCQkJTkVJR0hfUFJJTlRLMigibmVpZ2ggJXAgaXMgbm93IHJlYWNoYWJsZS5cbiIsIG5laWdoKTsKKwkJCW5laWdoLT5udWRfc3RhdGUgPSBOVURfUkVBQ0hBQkxFOworCQkJbmVpZ2hfY29ubmVjdChuZWlnaCk7CisJCQluZXh0ID0gbmVpZ2gtPmNvbmZpcm1lZCArIG5laWdoLT5wYXJtcy0+cmVhY2hhYmxlX3RpbWU7CisJCX0gZWxzZSB7CisJCQlORUlHSF9QUklOVEsyKCJuZWlnaCAlcCBpcyBwcm9iZWQuXG4iLCBuZWlnaCk7CisJCQluZWlnaC0+bnVkX3N0YXRlID0gTlVEX1BST0JFOworCQkJYXRvbWljX3NldCgmbmVpZ2gtPnByb2JlcywgMCk7CisJCQluZXh0ID0gbm93ICsgbmVpZ2gtPnBhcm1zLT5yZXRyYW5zX3RpbWU7CisJCX0KKwl9IGVsc2UgeworCQkvKiBOVURfUFJPQkV8TlVEX0lOQ09NUExFVEUgKi8KKwkJbmV4dCA9IG5vdyArIG5laWdoLT5wYXJtcy0+cmV0cmFuc190aW1lOworCX0KKworCWlmICgobmVpZ2gtPm51ZF9zdGF0ZSAmIChOVURfSU5DT01QTEVURSB8IE5VRF9QUk9CRSkpICYmCisJICAgIGF0b21pY19yZWFkKCZuZWlnaC0+cHJvYmVzKSA+PSBuZWlnaF9tYXhfcHJvYmVzKG5laWdoKSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCW5laWdoLT5udWRfc3RhdGUgPSBOVURfRkFJTEVEOworCQlub3RpZnkgPSAxOworCQlORUlHSF9DQUNIRV9TVEFUX0lOQyhuZWlnaC0+dGJsLCByZXNfZmFpbGVkKTsKKwkJTkVJR0hfUFJJTlRLMigibmVpZ2ggJXAgaXMgZmFpbGVkLlxuIiwgbmVpZ2gpOworCisJCS8qIEl0IGlzIHZlcnkgdGhpbiBwbGFjZS4gcmVwb3J0X3VucmVhY2hhYmxlIGlzIHZlcnkgY29tcGxpY2F0ZWQKKwkJICAgcm91dGluZS4gUGFydGljdWxhcmx5LCBpdCBjYW4gaGl0IHRoZSBzYW1lIG5laWdoYm91ciBlbnRyeSEKKworCQkgICBTbyB0aGF0LCB3ZSB0cnkgdG8gYmUgYWNjdXJhdGUgYW5kIGF2b2lkIGRlYWQgbG9vcC4gLS1BTksKKwkJICovCisJCXdoaWxlIChuZWlnaC0+bnVkX3N0YXRlID09IE5VRF9GQUlMRUQgJiYKKwkJICAgICAgIChza2IgPSBfX3NrYl9kZXF1ZXVlKCZuZWlnaC0+YXJwX3F1ZXVlKSkgIT0gTlVMTCkgeworCQkJd3JpdGVfdW5sb2NrKCZuZWlnaC0+bG9jayk7CisJCQluZWlnaC0+b3BzLT5lcnJvcl9yZXBvcnQobmVpZ2gsIHNrYik7CisJCQl3cml0ZV9sb2NrKCZuZWlnaC0+bG9jayk7CisJCX0KKwkJc2tiX3F1ZXVlX3B1cmdlKCZuZWlnaC0+YXJwX3F1ZXVlKTsKKwl9CisKKwlpZiAobmVpZ2gtPm51ZF9zdGF0ZSAmIE5VRF9JTl9USU1FUikgeworCQluZWlnaF9ob2xkKG5laWdoKTsKKwkJaWYgKHRpbWVfYmVmb3JlKG5leHQsIGppZmZpZXMgKyBIWi8yKSkKKwkJCW5leHQgPSBqaWZmaWVzICsgSFovMjsKKwkJbmVpZ2gtPnRpbWVyLmV4cGlyZXMgPSBuZXh0OworCQlhZGRfdGltZXIoJm5laWdoLT50aW1lcik7CisJfQorCWlmIChuZWlnaC0+bnVkX3N0YXRlICYgKE5VRF9JTkNPTVBMRVRFIHwgTlVEX1BST0JFKSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2tiX3BlZWsoJm5laWdoLT5hcnBfcXVldWUpOworCQkvKiBrZWVwIHNrYiBhbGl2ZSBldmVuIGlmIGFycF9xdWV1ZSBvdmVyZmxvd3MgKi8KKwkJaWYgKHNrYikKKwkJCXNrYl9nZXQoc2tiKTsKKwkJd3JpdGVfdW5sb2NrKCZuZWlnaC0+bG9jayk7CisJCW5laWdoLT5vcHMtPnNvbGljaXQobmVpZ2gsIHNrYik7CisJCWF0b21pY19pbmMoJm5laWdoLT5wcm9iZXMpOworCQlpZiAoc2tiKQorCQkJa2ZyZWVfc2tiKHNrYik7CisJfSBlbHNlIHsKK291dDoKKwkJd3JpdGVfdW5sb2NrKCZuZWlnaC0+bG9jayk7CisJfQorCisjaWZkZWYgQ09ORklHX0FSUEQKKwlpZiAobm90aWZ5ICYmIG5laWdoLT5wYXJtcy0+YXBwX3Byb2JlcykKKwkJbmVpZ2hfYXBwX25vdGlmeShuZWlnaCk7CisjZW5kaWYKKwluZWlnaF9yZWxlYXNlKG5laWdoKTsKK30KKworaW50IF9fbmVpZ2hfZXZlbnRfc2VuZChzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyBub3c7CisKKwl3cml0ZV9sb2NrX2JoKCZuZWlnaC0+bG9jayk7CisKKwlyYyA9IDA7CisJaWYgKG5laWdoLT5udWRfc3RhdGUgJiAoTlVEX0NPTk5FQ1RFRCB8IE5VRF9ERUxBWSB8IE5VRF9QUk9CRSkpCisJCWdvdG8gb3V0X3VubG9ja19iaDsKKworCW5vdyA9IGppZmZpZXM7CisJCisJaWYgKCEobmVpZ2gtPm51ZF9zdGF0ZSAmIChOVURfU1RBTEUgfCBOVURfSU5DT01QTEVURSkpKSB7CisJCWlmIChuZWlnaC0+cGFybXMtPm1jYXN0X3Byb2JlcyArIG5laWdoLT5wYXJtcy0+YXBwX3Byb2JlcykgeworCQkJYXRvbWljX3NldCgmbmVpZ2gtPnByb2JlcywgbmVpZ2gtPnBhcm1zLT51Y2FzdF9wcm9iZXMpOworCQkJbmVpZ2gtPm51ZF9zdGF0ZSAgICAgPSBOVURfSU5DT01QTEVURTsKKwkJCW5laWdoX2hvbGQobmVpZ2gpOworCQkJbmVpZ2gtPnRpbWVyLmV4cGlyZXMgPSBub3cgKyAxOworCQkJYWRkX3RpbWVyKCZuZWlnaC0+dGltZXIpOworCQl9IGVsc2UgeworCQkJbmVpZ2gtPm51ZF9zdGF0ZSA9IE5VRF9GQUlMRUQ7CisJCQl3cml0ZV91bmxvY2tfYmgoJm5laWdoLT5sb2NrKTsKKworCQkJaWYgKHNrYikKKwkJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAxOworCQl9CisJfSBlbHNlIGlmIChuZWlnaC0+bnVkX3N0YXRlICYgTlVEX1NUQUxFKSB7CisJCU5FSUdIX1BSSU5USzIoIm5laWdoICVwIGlzIGRlbGF5ZWQuXG4iLCBuZWlnaCk7CisJCW5laWdoX2hvbGQobmVpZ2gpOworCQluZWlnaC0+bnVkX3N0YXRlID0gTlVEX0RFTEFZOworCQluZWlnaC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBuZWlnaC0+cGFybXMtPmRlbGF5X3Byb2JlX3RpbWU7CisJCWFkZF90aW1lcigmbmVpZ2gtPnRpbWVyKTsKKwl9CisKKwlpZiAobmVpZ2gtPm51ZF9zdGF0ZSA9PSBOVURfSU5DT01QTEVURSkgeworCQlpZiAoc2tiKSB7CisJCQlpZiAoc2tiX3F1ZXVlX2xlbigmbmVpZ2gtPmFycF9xdWV1ZSkgPj0KKwkJCSAgICBuZWlnaC0+cGFybXMtPnF1ZXVlX2xlbikgeworCQkJCXN0cnVjdCBza19idWZmICpidWZmOworCQkJCWJ1ZmYgPSBuZWlnaC0+YXJwX3F1ZXVlLm5leHQ7CisJCQkJX19za2JfdW5saW5rKGJ1ZmYsICZuZWlnaC0+YXJwX3F1ZXVlKTsKKwkJCQlrZnJlZV9za2IoYnVmZik7CisJCQl9CisJCQlfX3NrYl9xdWV1ZV90YWlsKCZuZWlnaC0+YXJwX3F1ZXVlLCBza2IpOworCQl9CisJCXJjID0gMTsKKwl9CitvdXRfdW5sb2NrX2JoOgorCXdyaXRlX3VubG9ja19iaCgmbmVpZ2gtPmxvY2spOworCXJldHVybiByYzsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBuZWlnaF91cGRhdGVfaGhzKHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoKQoreworCXN0cnVjdCBoaF9jYWNoZSAqaGg7CisJdm9pZCAoKnVwZGF0ZSkoc3RydWN0IGhoX2NhY2hlKiwgc3RydWN0IG5ldF9kZXZpY2UqLCB1bnNpZ25lZCBjaGFyICopID0KKwkJbmVpZ2gtPmRldi0+aGVhZGVyX2NhY2hlX3VwZGF0ZTsKKworCWlmICh1cGRhdGUpIHsKKwkJZm9yIChoaCA9IG5laWdoLT5oaDsgaGg7IGhoID0gaGgtPmhoX25leHQpIHsKKwkJCXdyaXRlX2xvY2tfYmgoJmhoLT5oaF9sb2NrKTsKKwkJCXVwZGF0ZShoaCwgbmVpZ2gtPmRldiwgbmVpZ2gtPmhhKTsKKwkJCXdyaXRlX3VubG9ja19iaCgmaGgtPmhoX2xvY2spOworCQl9CisJfQorfQorCisKKworLyogR2VuZXJpYyB1cGRhdGUgcm91dGluZS4KKyAgIC0tIGxsYWRkciBpcyBuZXcgbGxhZGRyIG9yIE5VTEwsIGlmIGl0IGlzIG5vdCBzdXBwbGllZC4KKyAgIC0tIG5ldyAgICBpcyBuZXcgc3RhdGUuCisgICAtLSBmbGFncworCU5FSUdIX1VQREFURV9GX09WRVJSSURFIGFsbG93cyB0byBvdmVycmlkZSBleGlzdGluZyBsbGFkZHIsCisJCQkJaWYgaXQgaXMgZGlmZmVyZW50LgorCU5FSUdIX1VQREFURV9GX1dFQUtfT1ZFUlJJREUgd2lsbCBzdXNwZWN0IGV4aXN0aW5nICJjb25uZWN0ZWQiCisJCQkJbGxhZGRyIGluc3RlYWQgb2Ygb3ZlcnJpZGluZyBpdCAKKwkJCQlpZiBpdCBpcyBkaWZmZXJlbnQuCisJCQkJSXQgYWxzbyBhbGxvd3MgdG8gcmV0YWluIGN1cnJlbnQgc3RhdGUKKwkJCQlpZiBsbGFkZHIgaXMgdW5jaGFuZ2VkLgorCU5FSUdIX1VQREFURV9GX0FETUlOCW1lYW5zIHRoYXQgdGhlIGNoYW5nZSBpcyBhZG1pbmlzdHJhdGl2ZS4KKworCU5FSUdIX1VQREFURV9GX09WRVJSSURFX0lTUk9VVEVSIGFsbG93cyB0byBvdmVycmlkZSBleGlzdGluZyAKKwkJCQlOVEZfUk9VVEVSIGZsYWcuCisJTkVJR0hfVVBEQVRFX0ZfSVNST1VURVIJaW5kaWNhdGVzIGlmIHRoZSBuZWlnaGJvdXIgaXMga25vd24gYXMKKwkJCQlhIHJvdXRlci4KKworICAgQ2FsbGVyIE1VU1QgaG9sZCByZWZlcmVuY2UgY291bnQgb24gdGhlIGVudHJ5LgorICovCisKK2ludCBuZWlnaF91cGRhdGUoc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsIGNvbnN0IHU4ICpsbGFkZHIsIHU4IG5ldywKKwkJIHUzMiBmbGFncykKK3sKKwl1OCBvbGQ7CisJaW50IGVycjsKKyNpZmRlZiBDT05GSUdfQVJQRAorCWludCBub3RpZnkgPSAwOworI2VuZGlmCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgdXBkYXRlX2lzcm91dGVyID0gMDsKKworCXdyaXRlX2xvY2tfYmgoJm5laWdoLT5sb2NrKTsKKworCWRldiAgICA9IG5laWdoLT5kZXY7CisJb2xkICAgID0gbmVpZ2gtPm51ZF9zdGF0ZTsKKwllcnIgICAgPSAtRVBFUk07CisKKwlpZiAoIShmbGFncyAmIE5FSUdIX1VQREFURV9GX0FETUlOKSAmJiAKKwkgICAgKG9sZCAmIChOVURfTk9BUlAgfCBOVURfUEVSTUFORU5UKSkpCisJCWdvdG8gb3V0OworCisJaWYgKCEobmV3ICYgTlVEX1ZBTElEKSkgeworCQluZWlnaF9kZWxfdGltZXIobmVpZ2gpOworCQlpZiAob2xkICYgTlVEX0NPTk5FQ1RFRCkKKwkJCW5laWdoX3N1c3BlY3QobmVpZ2gpOworCQluZWlnaC0+bnVkX3N0YXRlID0gbmV3OworCQllcnIgPSAwOworI2lmZGVmIENPTkZJR19BUlBECisJCW5vdGlmeSA9IG9sZCAmIE5VRF9WQUxJRDsKKyNlbmRpZgorCQlnb3RvIG91dDsKKwl9CisKKwkvKiBDb21wYXJlIG5ldyBsbGFkZHIgd2l0aCBjYWNoZWQgb25lICovCisJaWYgKCFkZXYtPmFkZHJfbGVuKSB7CisJCS8qIEZpcnN0IGNhc2U6IGRldmljZSBuZWVkcyBubyBhZGRyZXNzLiAqLworCQlsbGFkZHIgPSBuZWlnaC0+aGE7CisJfSBlbHNlIGlmIChsbGFkZHIpIHsKKwkJLyogVGhlIHNlY29uZCBjYXNlOiBpZiBzb21ldGhpbmcgaXMgYWxyZWFkeSBjYWNoZWQKKwkJICAgYW5kIGEgbmV3IGFkZHJlc3MgaXMgcHJvcG9zZWQ6CisJCSAgIC0gY29tcGFyZSBuZXcgJiBvbGQKKwkJICAgLSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQsIGNoZWNrIG92ZXJyaWRlIGZsYWcKKwkJICovCisJCWlmICgob2xkICYgTlVEX1ZBTElEKSAmJiAKKwkJICAgICFtZW1jbXAobGxhZGRyLCBuZWlnaC0+aGEsIGRldi0+YWRkcl9sZW4pKQorCQkJbGxhZGRyID0gbmVpZ2gtPmhhOworCX0gZWxzZSB7CisJCS8qIE5vIGFkZHJlc3MgaXMgc3VwcGxpZWQ7IGlmIHdlIGtub3cgc29tZXRoaW5nLAorCQkgICB1c2UgaXQsIG90aGVyd2lzZSBkaXNjYXJkIHRoZSByZXF1ZXN0LgorCQkgKi8KKwkJZXJyID0gLUVJTlZBTDsKKwkJaWYgKCEob2xkICYgTlVEX1ZBTElEKSkKKwkJCWdvdG8gb3V0OworCQlsbGFkZHIgPSBuZWlnaC0+aGE7CisJfQorCisJaWYgKG5ldyAmIE5VRF9DT05ORUNURUQpCisJCW5laWdoLT5jb25maXJtZWQgPSBqaWZmaWVzOworCW5laWdoLT51cGRhdGVkID0gamlmZmllczsKKworCS8qIElmIGVudHJ5IHdhcyB2YWxpZCBhbmQgYWRkcmVzcyBpcyBub3QgY2hhbmdlZCwKKwkgICBkbyBub3QgY2hhbmdlIGVudHJ5IHN0YXRlLCBpZiBuZXcgb25lIGlzIFNUQUxFLgorCSAqLworCWVyciA9IDA7CisJdXBkYXRlX2lzcm91dGVyID0gZmxhZ3MgJiBORUlHSF9VUERBVEVfRl9PVkVSUklERV9JU1JPVVRFUjsKKwlpZiAob2xkICYgTlVEX1ZBTElEKSB7CisJCWlmIChsbGFkZHIgIT0gbmVpZ2gtPmhhICYmICEoZmxhZ3MgJiBORUlHSF9VUERBVEVfRl9PVkVSUklERSkpIHsKKwkJCXVwZGF0ZV9pc3JvdXRlciA9IDA7CisJCQlpZiAoKGZsYWdzICYgTkVJR0hfVVBEQVRFX0ZfV0VBS19PVkVSUklERSkgJiYKKwkJCSAgICAob2xkICYgTlVEX0NPTk5FQ1RFRCkpIHsKKwkJCQlsbGFkZHIgPSBuZWlnaC0+aGE7CisJCQkJbmV3ID0gTlVEX1NUQUxFOworCQkJfSBlbHNlCisJCQkJZ290byBvdXQ7CisJCX0gZWxzZSB7CisJCQlpZiAobGxhZGRyID09IG5laWdoLT5oYSAmJiBuZXcgPT0gTlVEX1NUQUxFICYmCisJCQkgICAgKChmbGFncyAmIE5FSUdIX1VQREFURV9GX1dFQUtfT1ZFUlJJREUpIHx8CisJCQkgICAgIChvbGQgJiBOVURfQ09OTkVDVEVEKSkKKwkJCSAgICApCisJCQkJbmV3ID0gb2xkOworCQl9CisJfQorCisJaWYgKG5ldyAhPSBvbGQpIHsKKwkJbmVpZ2hfZGVsX3RpbWVyKG5laWdoKTsKKwkJaWYgKG5ldyAmIE5VRF9JTl9USU1FUikgeworCQkJbmVpZ2hfaG9sZChuZWlnaCk7CisJCQluZWlnaC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAKKwkJCQkJCSgobmV3ICYgTlVEX1JFQUNIQUJMRSkgPyAKKwkJCQkJCSBuZWlnaC0+cGFybXMtPnJlYWNoYWJsZV90aW1lIDogMCk7CisJCQlhZGRfdGltZXIoJm5laWdoLT50aW1lcik7CisJCX0KKwkJbmVpZ2gtPm51ZF9zdGF0ZSA9IG5ldzsKKwl9CisKKwlpZiAobGxhZGRyICE9IG5laWdoLT5oYSkgeworCQltZW1jcHkoJm5laWdoLT5oYSwgbGxhZGRyLCBkZXYtPmFkZHJfbGVuKTsKKwkJbmVpZ2hfdXBkYXRlX2hocyhuZWlnaCk7CisJCWlmICghKG5ldyAmIE5VRF9DT05ORUNURUQpKQorCQkJbmVpZ2gtPmNvbmZpcm1lZCA9IGppZmZpZXMgLQorCQkJCSAgICAgIChuZWlnaC0+cGFybXMtPmJhc2VfcmVhY2hhYmxlX3RpbWUgPDwgMSk7CisjaWZkZWYgQ09ORklHX0FSUEQKKwkJbm90aWZ5ID0gMTsKKyNlbmRpZgorCX0KKwlpZiAobmV3ID09IG9sZCkKKwkJZ290byBvdXQ7CisJaWYgKG5ldyAmIE5VRF9DT05ORUNURUQpCisJCW5laWdoX2Nvbm5lY3QobmVpZ2gpOworCWVsc2UKKwkJbmVpZ2hfc3VzcGVjdChuZWlnaCk7CisJaWYgKCEob2xkICYgTlVEX1ZBTElEKSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCS8qIEFnYWluOiBhdm9pZCBkZWFkIGxvb3AgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcgKi8KKworCQl3aGlsZSAobmVpZ2gtPm51ZF9zdGF0ZSAmIE5VRF9WQUxJRCAmJgorCQkgICAgICAgKHNrYiA9IF9fc2tiX2RlcXVldWUoJm5laWdoLT5hcnBfcXVldWUpKSAhPSBOVUxMKSB7CisJCQlzdHJ1Y3QgbmVpZ2hib3VyICpuMSA9IG5laWdoOworCQkJd3JpdGVfdW5sb2NrX2JoKCZuZWlnaC0+bG9jayk7CisJCQkvKiBPbiBzaGFwZXIvZXFsIHNrYi0+ZHN0LT5uZWlnaGJvdXIgIT0gbmVpZ2ggOiggKi8KKwkJCWlmIChza2ItPmRzdCAmJiBza2ItPmRzdC0+bmVpZ2hib3VyKQorCQkJCW4xID0gc2tiLT5kc3QtPm5laWdoYm91cjsKKwkJCW4xLT5vdXRwdXQoc2tiKTsKKwkJCXdyaXRlX2xvY2tfYmgoJm5laWdoLT5sb2NrKTsKKwkJfQorCQlza2JfcXVldWVfcHVyZ2UoJm5laWdoLT5hcnBfcXVldWUpOworCX0KK291dDoKKwlpZiAodXBkYXRlX2lzcm91dGVyKSB7CisJCW5laWdoLT5mbGFncyA9IChmbGFncyAmIE5FSUdIX1VQREFURV9GX0lTUk9VVEVSKSA/CisJCQkobmVpZ2gtPmZsYWdzIHwgTlRGX1JPVVRFUikgOgorCQkJKG5laWdoLT5mbGFncyAmIH5OVEZfUk9VVEVSKTsKKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZuZWlnaC0+bG9jayk7CisjaWZkZWYgQ09ORklHX0FSUEQKKwlpZiAobm90aWZ5ICYmIG5laWdoLT5wYXJtcy0+YXBwX3Byb2JlcykKKwkJbmVpZ2hfYXBwX25vdGlmeShuZWlnaCk7CisjZW5kaWYKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaF9ldmVudF9ucyhzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCwKKwkJCQkgdTggKmxsYWRkciwgdm9pZCAqc2FkZHIsCisJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5laWdoYm91ciAqbmVpZ2ggPSBfX25laWdoX2xvb2t1cCh0YmwsIHNhZGRyLCBkZXYsCisJCQkJCQkgbGxhZGRyIHx8ICFkZXYtPmFkZHJfbGVuKTsKKwlpZiAobmVpZ2gpCisJCW5laWdoX3VwZGF0ZShuZWlnaCwgbGxhZGRyLCBOVURfU1RBTEUsIAorCQkJICAgICBORUlHSF9VUERBVEVfRl9PVkVSUklERSk7CisJcmV0dXJuIG5laWdoOworfQorCitzdGF0aWMgdm9pZCBuZWlnaF9oaF9pbml0KHN0cnVjdCBuZWlnaGJvdXIgKm4sIHN0cnVjdCBkc3RfZW50cnkgKmRzdCwKKwkJCSAgdTE2IHByb3RvY29sKQoreworCXN0cnVjdCBoaF9jYWNoZQkqaGg7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRzdC0+ZGV2OworCisJZm9yIChoaCA9IG4tPmhoOyBoaDsgaGggPSBoaC0+aGhfbmV4dCkKKwkJaWYgKGhoLT5oaF90eXBlID09IHByb3RvY29sKQorCQkJYnJlYWs7CisKKwlpZiAoIWhoICYmIChoaCA9IGttYWxsb2Moc2l6ZW9mKCpoaCksIEdGUF9BVE9NSUMpKSAhPSBOVUxMKSB7CisJCW1lbXNldChoaCwgMCwgc2l6ZW9mKHN0cnVjdCBoaF9jYWNoZSkpOworCQlyd2xvY2tfaW5pdCgmaGgtPmhoX2xvY2spOworCQloaC0+aGhfdHlwZSA9IHByb3RvY29sOworCQlhdG9taWNfc2V0KCZoaC0+aGhfcmVmY250LCAwKTsKKwkJaGgtPmhoX25leHQgPSBOVUxMOworCQlpZiAoZGV2LT5oYXJkX2hlYWRlcl9jYWNoZShuLCBoaCkpIHsKKwkJCWtmcmVlKGhoKTsKKwkJCWhoID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCWF0b21pY19pbmMoJmhoLT5oaF9yZWZjbnQpOworCQkJaGgtPmhoX25leHQgPSBuLT5oaDsKKwkJCW4tPmhoCSAgICA9IGhoOworCQkJaWYgKG4tPm51ZF9zdGF0ZSAmIE5VRF9DT05ORUNURUQpCisJCQkJaGgtPmhoX291dHB1dCA9IG4tPm9wcy0+aGhfb3V0cHV0OworCQkJZWxzZQorCQkJCWhoLT5oaF9vdXRwdXQgPSBuLT5vcHMtPm91dHB1dDsKKwkJfQorCX0KKwlpZiAoaGgpCXsKKwkJYXRvbWljX2luYygmaGgtPmhoX3JlZmNudCk7CisJCWRzdC0+aGggPSBoaDsKKwl9Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgaW4gY29udGV4dHMsIHdoZXJlIG9ubHkgb2xkIGRldl9xdWV1ZV94bWl0CisgICB3b3JrZWQsIGYuZS4gaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgbm9ybWFsIG91dHB1dCBwYXRoIChlcWwsIHNoYXBlciksCisgICBidXQgcmVzb2x1dGlvbiBpcyBub3QgbWFkZSB5ZXQuCisgKi8KKworaW50IG5laWdoX2NvbXBhdF9vdXRwdXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CisKKwlfX3NrYl9wdWxsKHNrYiwgc2tiLT5uaC5yYXcgLSBza2ItPmRhdGEpOworCisJaWYgKGRldi0+aGFyZF9oZWFkZXIgJiYKKwkgICAgZGV2LT5oYXJkX2hlYWRlcihza2IsIGRldiwgbnRvaHMoc2tiLT5wcm90b2NvbCksIE5VTEwsIE5VTEwsCisJCSAgICAJICAgICBza2ItPmxlbikgPCAwICYmCisJICAgIGRldi0+cmVidWlsZF9oZWFkZXIoc2tiKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZGV2X3F1ZXVlX3htaXQoc2tiKTsKK30KKworLyogU2xvdyBhbmQgY2FyZWZ1bC4gKi8KKworaW50IG5laWdoX3Jlc29sdmVfb3V0cHV0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiLT5kc3Q7CisJc3RydWN0IG5laWdoYm91ciAqbmVpZ2g7CisJaW50IHJjID0gMDsKKworCWlmICghZHN0IHx8ICEobmVpZ2ggPSBkc3QtPm5laWdoYm91cikpCisJCWdvdG8gZGlzY2FyZDsKKworCV9fc2tiX3B1bGwoc2tiLCBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YSk7CisKKwlpZiAoIW5laWdoX2V2ZW50X3NlbmQobmVpZ2gsIHNrYikpIHsKKwkJaW50IGVycjsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5laWdoLT5kZXY7CisJCWlmIChkZXYtPmhhcmRfaGVhZGVyX2NhY2hlICYmICFkc3QtPmhoKSB7CisJCQl3cml0ZV9sb2NrX2JoKCZuZWlnaC0+bG9jayk7CisJCQlpZiAoIWRzdC0+aGgpCisJCQkJbmVpZ2hfaGhfaW5pdChuZWlnaCwgZHN0LCBkc3QtPm9wcy0+cHJvdG9jb2wpOworCQkJZXJyID0gZGV2LT5oYXJkX2hlYWRlcihza2IsIGRldiwgbnRvaHMoc2tiLT5wcm90b2NvbCksCisJCQkJCSAgICAgICBuZWlnaC0+aGEsIE5VTEwsIHNrYi0+bGVuKTsKKwkJCXdyaXRlX3VubG9ja19iaCgmbmVpZ2gtPmxvY2spOworCQl9IGVsc2UgeworCQkJcmVhZF9sb2NrX2JoKCZuZWlnaC0+bG9jayk7CisJCQllcnIgPSBkZXYtPmhhcmRfaGVhZGVyKHNrYiwgZGV2LCBudG9ocyhza2ItPnByb3RvY29sKSwKKwkJCQkJICAgICAgIG5laWdoLT5oYSwgTlVMTCwgc2tiLT5sZW4pOworCQkJcmVhZF91bmxvY2tfYmgoJm5laWdoLT5sb2NrKTsKKwkJfQorCQlpZiAoZXJyID49IDApCisJCQlyYyA9IG5laWdoLT5vcHMtPnF1ZXVlX3htaXQoc2tiKTsKKwkJZWxzZQorCQkJZ290byBvdXRfa2ZyZWVfc2tiOworCX0KK291dDoKKwlyZXR1cm4gcmM7CitkaXNjYXJkOgorCU5FSUdIX1BSSU5USzEoIm5laWdoX3Jlc29sdmVfb3V0cHV0OiBkc3Q9JXAgbmVpZ2g9JXBcbiIsCisJCSAgICAgIGRzdCwgZHN0ID8gZHN0LT5uZWlnaGJvdXIgOiBOVUxMKTsKK291dF9rZnJlZV9za2I6CisJcmMgPSAtRUlOVkFMOworCWtmcmVlX3NrYihza2IpOworCWdvdG8gb3V0OworfQorCisvKiBBcyBmYXN0IGFzIHBvc3NpYmxlIHdpdGhvdXQgaGggY2FjaGUgKi8KKworaW50IG5laWdoX2Nvbm5lY3RlZF9vdXRwdXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYi0+ZHN0OworCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoID0gZHN0LT5uZWlnaGJvdXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5laWdoLT5kZXY7CisKKwlfX3NrYl9wdWxsKHNrYiwgc2tiLT5uaC5yYXcgLSBza2ItPmRhdGEpOworCisJcmVhZF9sb2NrX2JoKCZuZWlnaC0+bG9jayk7CisJZXJyID0gZGV2LT5oYXJkX2hlYWRlcihza2IsIGRldiwgbnRvaHMoc2tiLT5wcm90b2NvbCksCisJCQkgICAgICAgbmVpZ2gtPmhhLCBOVUxMLCBza2ItPmxlbik7CisJcmVhZF91bmxvY2tfYmgoJm5laWdoLT5sb2NrKTsKKwlpZiAoZXJyID49IDApCisJCWVyciA9IG5laWdoLT5vcHMtPnF1ZXVlX3htaXQoc2tiKTsKKwllbHNlIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJa2ZyZWVfc2tiKHNrYik7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIG5laWdoX3Byb3h5X3Byb2Nlc3ModW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG5laWdoX3RhYmxlICp0YmwgPSAoc3RydWN0IG5laWdoX3RhYmxlICopYXJnOworCWxvbmcgc2NoZWRfbmV4dCA9IDA7CisJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlzcGluX2xvY2soJnRibC0+cHJveHlfcXVldWUubG9jayk7CisKKwlza2IgPSB0YmwtPnByb3h5X3F1ZXVlLm5leHQ7CisKKwl3aGlsZSAoc2tiICE9IChzdHJ1Y3Qgc2tfYnVmZiAqKSZ0YmwtPnByb3h5X3F1ZXVlKSB7CisJCXN0cnVjdCBza19idWZmICpiYWNrID0gc2tiOworCQlsb25nIHRkaWYgPSBiYWNrLT5zdGFtcC50dl91c2VjIC0gbm93OworCisJCXNrYiA9IHNrYi0+bmV4dDsKKwkJaWYgKHRkaWYgPD0gMCkgeworCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGJhY2stPmRldjsKKwkJCV9fc2tiX3VubGluayhiYWNrLCAmdGJsLT5wcm94eV9xdWV1ZSk7CisJCQlpZiAodGJsLT5wcm94eV9yZWRvICYmIG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJCQl0YmwtPnByb3h5X3JlZG8oYmFjayk7CisJCQllbHNlCisJCQkJa2ZyZWVfc2tiKGJhY2spOworCisJCQlkZXZfcHV0KGRldik7CisJCX0gZWxzZSBpZiAoIXNjaGVkX25leHQgfHwgdGRpZiA8IHNjaGVkX25leHQpCisJCQlzY2hlZF9uZXh0ID0gdGRpZjsKKwl9CisJZGVsX3RpbWVyKCZ0YmwtPnByb3h5X3RpbWVyKTsKKwlpZiAoc2NoZWRfbmV4dCkKKwkJbW9kX3RpbWVyKCZ0YmwtPnByb3h5X3RpbWVyLCBqaWZmaWVzICsgc2NoZWRfbmV4dCk7CisJc3Bpbl91bmxvY2soJnRibC0+cHJveHlfcXVldWUubG9jayk7Cit9CisKK3ZvaWQgcG5laWdoX2VucXVldWUoc3RydWN0IG5laWdoX3RhYmxlICp0YmwsIHN0cnVjdCBuZWlnaF9wYXJtcyAqcCwKKwkJICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOworCXVuc2lnbmVkIGxvbmcgc2NoZWRfbmV4dCA9IG5vdyArIChuZXRfcmFuZG9tKCkgJSBwLT5wcm94eV9kZWxheSk7CisKKwlpZiAodGJsLT5wcm94eV9xdWV1ZS5xbGVuID4gcC0+cHJveHlfcWxlbikgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKwlza2ItPnN0YW1wLnR2X3NlYyAgPSBMT0NBTExZX0VOUVVFVUVEOworCXNrYi0+c3RhbXAudHZfdXNlYyA9IHNjaGVkX25leHQ7CisKKwlzcGluX2xvY2soJnRibC0+cHJveHlfcXVldWUubG9jayk7CisJaWYgKGRlbF90aW1lcigmdGJsLT5wcm94eV90aW1lcikpIHsKKwkJaWYgKHRpbWVfYmVmb3JlKHRibC0+cHJveHlfdGltZXIuZXhwaXJlcywgc2NoZWRfbmV4dCkpCisJCQlzY2hlZF9uZXh0ID0gdGJsLT5wcm94eV90aW1lci5leHBpcmVzOworCX0KKwlkc3RfcmVsZWFzZShza2ItPmRzdCk7CisJc2tiLT5kc3QgPSBOVUxMOworCWRldl9ob2xkKHNrYi0+ZGV2KTsKKwlfX3NrYl9xdWV1ZV90YWlsKCZ0YmwtPnByb3h5X3F1ZXVlLCBza2IpOworCW1vZF90aW1lcigmdGJsLT5wcm94eV90aW1lciwgc2NoZWRfbmV4dCk7CisJc3Bpbl91bmxvY2soJnRibC0+cHJveHlfcXVldWUubG9jayk7Cit9CisKKworc3RydWN0IG5laWdoX3Bhcm1zICpuZWlnaF9wYXJtc19hbGxvYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBuZWlnaF90YWJsZSAqdGJsKQoreworCXN0cnVjdCBuZWlnaF9wYXJtcyAqcCA9IGttYWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAocCkgeworCQltZW1jcHkocCwgJnRibC0+cGFybXMsIHNpemVvZigqcCkpOworCQlwLT50YmwJCSAgPSB0Ymw7CisJCWF0b21pY19zZXQoJnAtPnJlZmNudCwgMSk7CisJCUlOSVRfUkNVX0hFQUQoJnAtPnJjdV9oZWFkKTsKKwkJcC0+cmVhY2hhYmxlX3RpbWUgPQorCQkJCW5laWdoX3JhbmRfcmVhY2hfdGltZShwLT5iYXNlX3JlYWNoYWJsZV90aW1lKTsKKwkJaWYgKGRldiAmJiBkZXYtPm5laWdoX3NldHVwICYmIGRldi0+bmVpZ2hfc2V0dXAoZGV2LCBwKSkgeworCQkJa2ZyZWUocCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlwLT5zeXNjdGxfdGFibGUgPSBOVUxMOworCQl3cml0ZV9sb2NrX2JoKCZ0YmwtPmxvY2spOworCQlwLT5uZXh0CQk9IHRibC0+cGFybXMubmV4dDsKKwkJdGJsLT5wYXJtcy5uZXh0ID0gcDsKKwkJd3JpdGVfdW5sb2NrX2JoKCZ0YmwtPmxvY2spOworCX0KKwlyZXR1cm4gcDsKK30KKworc3RhdGljIHZvaWQgbmVpZ2hfcmN1X2ZyZWVfcGFybXMoc3RydWN0IHJjdV9oZWFkICpoZWFkKQoreworCXN0cnVjdCBuZWlnaF9wYXJtcyAqcGFybXMgPQorCQljb250YWluZXJfb2YoaGVhZCwgc3RydWN0IG5laWdoX3Bhcm1zLCByY3VfaGVhZCk7CisKKwluZWlnaF9wYXJtc19wdXQocGFybXMpOworfQorCit2b2lkIG5laWdoX3Bhcm1zX3JlbGVhc2Uoc3RydWN0IG5laWdoX3RhYmxlICp0YmwsIHN0cnVjdCBuZWlnaF9wYXJtcyAqcGFybXMpCit7CisJc3RydWN0IG5laWdoX3Bhcm1zICoqcDsKKworCWlmICghcGFybXMgfHwgcGFybXMgPT0gJnRibC0+cGFybXMpCisJCXJldHVybjsKKwl3cml0ZV9sb2NrX2JoKCZ0YmwtPmxvY2spOworCWZvciAocCA9ICZ0YmwtPnBhcm1zLm5leHQ7ICpwOyBwID0gJigqcCktPm5leHQpIHsKKwkJaWYgKCpwID09IHBhcm1zKSB7CisJCQkqcCA9IHBhcm1zLT5uZXh0OworCQkJcGFybXMtPmRlYWQgPSAxOworCQkJd3JpdGVfdW5sb2NrX2JoKCZ0YmwtPmxvY2spOworCQkJY2FsbF9yY3UoJnBhcm1zLT5yY3VfaGVhZCwgbmVpZ2hfcmN1X2ZyZWVfcGFybXMpOworCQkJcmV0dXJuOworCQl9CisJfQorCXdyaXRlX3VubG9ja19iaCgmdGJsLT5sb2NrKTsKKwlORUlHSF9QUklOVEsxKCJuZWlnaF9wYXJtc19yZWxlYXNlOiBub3QgZm91bmRcbiIpOworfQorCit2b2lkIG5laWdoX3Bhcm1zX2Rlc3Ryb3koc3RydWN0IG5laWdoX3Bhcm1zICpwYXJtcykKK3sKKwlrZnJlZShwYXJtcyk7Cit9CisKKwordm9pZCBuZWlnaF90YWJsZV9pbml0KHN0cnVjdCBuZWlnaF90YWJsZSAqdGJsKQoreworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKwl1bnNpZ25lZCBsb25nIHBoc2l6ZTsKKworCWF0b21pY19zZXQoJnRibC0+cGFybXMucmVmY250LCAxKTsKKwlJTklUX1JDVV9IRUFEKCZ0YmwtPnBhcm1zLnJjdV9oZWFkKTsKKwl0YmwtPnBhcm1zLnJlYWNoYWJsZV90aW1lID0KKwkJCSAgbmVpZ2hfcmFuZF9yZWFjaF90aW1lKHRibC0+cGFybXMuYmFzZV9yZWFjaGFibGVfdGltZSk7CisKKwlpZiAoIXRibC0+a21lbV9jYWNoZXApCisJCXRibC0+a21lbV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSh0YmwtPmlkLAorCQkJCQkJICAgICB0YmwtPmVudHJ5X3NpemUsCisJCQkJCQkgICAgIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwKKwkJCQkJCSAgICAgTlVMTCwgTlVMTCk7CisKKwlpZiAoIXRibC0+a21lbV9jYWNoZXApCisJCXBhbmljKCJjYW5ub3QgY3JlYXRlIG5laWdoYm91ciBjYWNoZSIpOworCisJdGJsLT5zdGF0cyA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgbmVpZ2hfc3RhdGlzdGljcyk7CisJaWYgKCF0YmwtPnN0YXRzKQorCQlwYW5pYygiY2Fubm90IGNyZWF0ZSBuZWlnaGJvdXIgY2FjaGUgc3RhdGlzdGljcyIpOworCQorI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJdGJsLT5wZGUgPSBjcmVhdGVfcHJvY19lbnRyeSh0YmwtPmlkLCAwLCBwcm9jX25ldF9zdGF0KTsKKwlpZiAoIXRibC0+cGRlKSAKKwkJcGFuaWMoImNhbm5vdCBjcmVhdGUgbmVpZ2hib3VyIHByb2MgZGlyIGVudHJ5Iik7CisJdGJsLT5wZGUtPnByb2NfZm9wcyA9ICZuZWlnaF9zdGF0X3NlcV9mb3BzOworCXRibC0+cGRlLT5kYXRhID0gdGJsOworI2VuZGlmCisKKwl0YmwtPmhhc2hfbWFzayA9IDE7CisJdGJsLT5oYXNoX2J1Y2tldHMgPSBuZWlnaF9oYXNoX2FsbG9jKHRibC0+aGFzaF9tYXNrICsgMSk7CisKKwlwaHNpemUgPSAoUE5FSUdIX0hBU0hNQVNLICsgMSkgKiBzaXplb2Yoc3RydWN0IHBuZWlnaF9lbnRyeSAqKTsKKwl0YmwtPnBoYXNoX2J1Y2tldHMgPSBrbWFsbG9jKHBoc2l6ZSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXRibC0+aGFzaF9idWNrZXRzIHx8ICF0YmwtPnBoYXNoX2J1Y2tldHMpCisJCXBhbmljKCJjYW5ub3QgYWxsb2NhdGUgbmVpZ2hib3VyIGNhY2hlIGhhc2hlcyIpOworCisJbWVtc2V0KHRibC0+cGhhc2hfYnVja2V0cywgMCwgcGhzaXplKTsKKworCWdldF9yYW5kb21fYnl0ZXMoJnRibC0+aGFzaF9ybmQsIHNpemVvZih0YmwtPmhhc2hfcm5kKSk7CisKKwlyd2xvY2tfaW5pdCgmdGJsLT5sb2NrKTsKKwlpbml0X3RpbWVyKCZ0YmwtPmdjX3RpbWVyKTsKKwl0YmwtPmdjX3RpbWVyLmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpdGJsOworCXRibC0+Z2NfdGltZXIuZnVuY3Rpb24gPSBuZWlnaF9wZXJpb2RpY190aW1lcjsKKwl0YmwtPmdjX3RpbWVyLmV4cGlyZXMgID0gbm93ICsgMTsKKwlhZGRfdGltZXIoJnRibC0+Z2NfdGltZXIpOworCisJaW5pdF90aW1lcigmdGJsLT5wcm94eV90aW1lcik7CisJdGJsLT5wcm94eV90aW1lci5kYXRhCSAgPSAodW5zaWduZWQgbG9uZyl0Ymw7CisJdGJsLT5wcm94eV90aW1lci5mdW5jdGlvbiA9IG5laWdoX3Byb3h5X3Byb2Nlc3M7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmdGJsLT5wcm94eV9xdWV1ZSk7CisKKwl0YmwtPmxhc3RfZmx1c2ggPSBub3c7CisJdGJsLT5sYXN0X3JhbmQJPSBub3cgKyB0YmwtPnBhcm1zLnJlYWNoYWJsZV90aW1lICogMjA7CisJd3JpdGVfbG9jaygmbmVpZ2hfdGJsX2xvY2spOworCXRibC0+bmV4dAk9IG5laWdoX3RhYmxlczsKKwluZWlnaF90YWJsZXMJPSB0Ymw7CisJd3JpdGVfdW5sb2NrKCZuZWlnaF90YmxfbG9jayk7Cit9CisKK2ludCBuZWlnaF90YWJsZV9jbGVhcihzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCkKK3sKKwlzdHJ1Y3QgbmVpZ2hfdGFibGUgKip0cDsKKworCS8qIEl0IGlzIG5vdCBjbGVhbi4uLiBGaXggaXQgdG8gdW5sb2FkIElQdjYgbW9kdWxlIHNhZmVseSAqLworCWRlbF90aW1lcl9zeW5jKCZ0YmwtPmdjX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmdGJsLT5wcm94eV90aW1lcik7CisJcG5laWdoX3F1ZXVlX3B1cmdlKCZ0YmwtPnByb3h5X3F1ZXVlKTsKKwluZWlnaF9pZmRvd24odGJsLCBOVUxMKTsKKwlpZiAoYXRvbWljX3JlYWQoJnRibC0+ZW50cmllcykpCisJCXByaW50ayhLRVJOX0NSSVQgIm5laWdoYm91ciBsZWFrYWdlXG4iKTsKKwl3cml0ZV9sb2NrKCZuZWlnaF90YmxfbG9jayk7CisJZm9yICh0cCA9ICZuZWlnaF90YWJsZXM7ICp0cDsgdHAgPSAmKCp0cCktPm5leHQpIHsKKwkJaWYgKCp0cCA9PSB0YmwpIHsKKwkJCSp0cCA9IHRibC0+bmV4dDsKKwkJCWJyZWFrOworCQl9CisJfQorCXdyaXRlX3VubG9jaygmbmVpZ2hfdGJsX2xvY2spOworCisJbmVpZ2hfaGFzaF9mcmVlKHRibC0+aGFzaF9idWNrZXRzLCB0YmwtPmhhc2hfbWFzayArIDEpOworCXRibC0+aGFzaF9idWNrZXRzID0gTlVMTDsKKworCWtmcmVlKHRibC0+cGhhc2hfYnVja2V0cyk7CisJdGJsLT5waGFzaF9idWNrZXRzID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitpbnQgbmVpZ2hfZGVsZXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpCit7CisJc3RydWN0IG5kbXNnICpuZG0gPSBOTE1TR19EQVRBKG5saCk7CisJc3RydWN0IHJ0YXR0ciAqKm5kYSA9IGFyZzsKKwlzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlpbnQgZXJyID0gLUVOT0RFVjsKKworCWlmIChuZG0tPm5kbV9pZmluZGV4ICYmCisJICAgIChkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KG5kbS0+bmRtX2lmaW5kZXgpKSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCXJlYWRfbG9jaygmbmVpZ2hfdGJsX2xvY2spOworCWZvciAodGJsID0gbmVpZ2hfdGFibGVzOyB0Ymw7IHRibCA9IHRibC0+bmV4dCkgeworCQlzdHJ1Y3QgcnRhdHRyICpkc3RfYXR0ciA9IG5kYVtOREFfRFNUIC0gMV07CisJCXN0cnVjdCBuZWlnaGJvdXIgKm47CisKKwkJaWYgKHRibC0+ZmFtaWx5ICE9IG5kbS0+bmRtX2ZhbWlseSkKKwkJCWNvbnRpbnVlOworCQlyZWFkX3VubG9jaygmbmVpZ2hfdGJsX2xvY2spOworCisJCWVyciA9IC1FSU5WQUw7CisJCWlmICghZHN0X2F0dHIgfHwgUlRBX1BBWUxPQUQoZHN0X2F0dHIpIDwgdGJsLT5rZXlfbGVuKQorCQkJZ290byBvdXRfZGV2X3B1dDsKKworCQlpZiAobmRtLT5uZG1fZmxhZ3MgJiBOVEZfUFJPWFkpIHsKKwkJCWVyciA9IHBuZWlnaF9kZWxldGUodGJsLCBSVEFfREFUQShkc3RfYXR0ciksIGRldik7CisJCQlnb3RvIG91dF9kZXZfcHV0OworCQl9CisKKwkJaWYgKCFkZXYpCisJCQlnb3RvIG91dDsKKworCQluID0gbmVpZ2hfbG9va3VwKHRibCwgUlRBX0RBVEEoZHN0X2F0dHIpLCBkZXYpOworCQlpZiAobikgeworCQkJZXJyID0gbmVpZ2hfdXBkYXRlKG4sIE5VTEwsIE5VRF9GQUlMRUQsIAorCQkJCQkgICBORUlHSF9VUERBVEVfRl9PVkVSUklERXwKKwkJCQkJICAgTkVJR0hfVVBEQVRFX0ZfQURNSU4pOworCQkJbmVpZ2hfcmVsZWFzZShuKTsKKwkJfQorCQlnb3RvIG91dF9kZXZfcHV0OworCX0KKwlyZWFkX3VubG9jaygmbmVpZ2hfdGJsX2xvY2spOworCWVyciA9IC1FQUREUk5PVEFWQUlMOworb3V0X2Rldl9wdXQ6CisJaWYgKGRldikKKwkJZGV2X3B1dChkZXYpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK2ludCBuZWlnaF9hZGQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbmRtc2cgKm5kbSA9IE5MTVNHX0RBVEEobmxoKTsKKwlzdHJ1Y3QgcnRhdHRyICoqbmRhID0gYXJnOworCXN0cnVjdCBuZWlnaF90YWJsZSAqdGJsOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCWludCBlcnIgPSAtRU5PREVWOworCisJaWYgKG5kbS0+bmRtX2lmaW5kZXggJiYKKwkgICAgKGRldiA9IGRldl9nZXRfYnlfaW5kZXgobmRtLT5uZG1faWZpbmRleCkpID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJcmVhZF9sb2NrKCZuZWlnaF90YmxfbG9jayk7CisJZm9yICh0YmwgPSBuZWlnaF90YWJsZXM7IHRibDsgdGJsID0gdGJsLT5uZXh0KSB7CisJCXN0cnVjdCBydGF0dHIgKmxsYWRkcl9hdHRyID0gbmRhW05EQV9MTEFERFIgLSAxXTsKKwkJc3RydWN0IHJ0YXR0ciAqZHN0X2F0dHIgPSBuZGFbTkRBX0RTVCAtIDFdOworCQlpbnQgb3ZlcnJpZGUgPSAxOworCQlzdHJ1Y3QgbmVpZ2hib3VyICpuOworCisJCWlmICh0YmwtPmZhbWlseSAhPSBuZG0tPm5kbV9mYW1pbHkpCisJCQljb250aW51ZTsKKwkJcmVhZF91bmxvY2soJm5laWdoX3RibF9sb2NrKTsKKworCQllcnIgPSAtRUlOVkFMOworCQlpZiAoIWRzdF9hdHRyIHx8IFJUQV9QQVlMT0FEKGRzdF9hdHRyKSA8IHRibC0+a2V5X2xlbikKKwkJCWdvdG8gb3V0X2Rldl9wdXQ7CisKKwkJaWYgKG5kbS0+bmRtX2ZsYWdzICYgTlRGX1BST1hZKSB7CisJCQllcnIgPSAtRU5PQlVGUzsKKwkJCWlmIChwbmVpZ2hfbG9va3VwKHRibCwgUlRBX0RBVEEoZHN0X2F0dHIpLCBkZXYsIDEpKQorCQkJCWVyciA9IDA7CisJCQlnb3RvIG91dF9kZXZfcHV0OworCQl9CisKKwkJZXJyID0gLUVJTlZBTDsKKwkJaWYgKCFkZXYpCisJCQlnb3RvIG91dDsKKwkJaWYgKGxsYWRkcl9hdHRyICYmIFJUQV9QQVlMT0FEKGxsYWRkcl9hdHRyKSA8IGRldi0+YWRkcl9sZW4pCisJCQlnb3RvIG91dF9kZXZfcHV0OworCQorCQluID0gbmVpZ2hfbG9va3VwKHRibCwgUlRBX0RBVEEoZHN0X2F0dHIpLCBkZXYpOworCQlpZiAobikgeworCQkJaWYgKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9FWENMKSB7CisJCQkJZXJyID0gLUVFWElTVDsKKwkJCQluZWlnaF9yZWxlYXNlKG4pOworCQkJCWdvdG8gb3V0X2Rldl9wdXQ7CisJCQl9CisJCQkKKwkJCW92ZXJyaWRlID0gbmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX1JFUExBQ0U7CisJCX0gZWxzZSBpZiAoIShubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfQ1JFQVRFKSkgeworCQkJZXJyID0gLUVOT0VOVDsKKwkJCWdvdG8gb3V0X2Rldl9wdXQ7CisJCX0gZWxzZSB7CisJCQluID0gX19uZWlnaF9sb29rdXBfZXJybm8odGJsLCBSVEFfREFUQShkc3RfYXR0ciksIGRldik7CisJCQlpZiAoSVNfRVJSKG4pKSB7CisJCQkJZXJyID0gUFRSX0VSUihuKTsKKwkJCQlnb3RvIG91dF9kZXZfcHV0OworCQkJfQorCQl9CisKKwkJZXJyID0gbmVpZ2hfdXBkYXRlKG4sCisJCQkJICAgbGxhZGRyX2F0dHIgPyBSVEFfREFUQShsbGFkZHJfYXR0cikgOiBOVUxMLAorCQkJCSAgIG5kbS0+bmRtX3N0YXRlLAorCQkJCSAgIChvdmVycmlkZSA/IE5FSUdIX1VQREFURV9GX09WRVJSSURFIDogMCkgfAorCQkJCSAgIE5FSUdIX1VQREFURV9GX0FETUlOKTsKKworCQluZWlnaF9yZWxlYXNlKG4pOworCQlnb3RvIG91dF9kZXZfcHV0OworCX0KKworCXJlYWRfdW5sb2NrKCZuZWlnaF90YmxfbG9jayk7CisJZXJyID0gLUVBRERSTk9UQVZBSUw7CitvdXRfZGV2X3B1dDoKKwlpZiAoZGV2KQorCQlkZXZfcHV0KGRldik7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IG5laWdoX2ZpbGxfaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmVpZ2hib3VyICpuLAorCQkJICAgdTMyIHBpZCwgdTMyIHNlcSwgaW50IGV2ZW50KQoreworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXN0cnVjdCBuZGFfY2FjaGVpbmZvIGNpOworCWludCBsb2NrZWQgPSAwOworCXUzMiBwcm9iZXM7CisJc3RydWN0IG5sbXNnaGRyICpubGggPSBOTE1TR19QVVQoc2tiLCBwaWQsIHNlcSwgZXZlbnQsCisJCQkJCSBzaXplb2Yoc3RydWN0IG5kbXNnKSk7CisJc3RydWN0IG5kbXNnICpuZG0gPSBOTE1TR19EQVRBKG5saCk7CisKKwlubGgtPm5sbXNnX2ZsYWdzID0gcGlkID8gTkxNX0ZfTVVMVEkgOiAwOworCW5kbS0+bmRtX2ZhbWlseQkgPSBuLT5vcHMtPmZhbWlseTsKKwluZG0tPm5kbV9mbGFncwkgPSBuLT5mbGFnczsKKwluZG0tPm5kbV90eXBlCSA9IG4tPnR5cGU7CisJbmRtLT5uZG1faWZpbmRleCA9IG4tPmRldi0+aWZpbmRleDsKKwlSVEFfUFVUKHNrYiwgTkRBX0RTVCwgbi0+dGJsLT5rZXlfbGVuLCBuLT5wcmltYXJ5X2tleSk7CisJcmVhZF9sb2NrX2JoKCZuLT5sb2NrKTsKKwlsb2NrZWQJCSA9IDE7CisJbmRtLT5uZG1fc3RhdGUJID0gbi0+bnVkX3N0YXRlOworCWlmIChuLT5udWRfc3RhdGUgJiBOVURfVkFMSUQpCisJCVJUQV9QVVQoc2tiLCBOREFfTExBRERSLCBuLT5kZXYtPmFkZHJfbGVuLCBuLT5oYSk7CisJY2kubmRtX3VzZWQJID0gbm93IC0gbi0+dXNlZDsKKwljaS5uZG1fY29uZmlybWVkID0gbm93IC0gbi0+Y29uZmlybWVkOworCWNpLm5kbV91cGRhdGVkCSA9IG5vdyAtIG4tPnVwZGF0ZWQ7CisJY2kubmRtX3JlZmNudAkgPSBhdG9taWNfcmVhZCgmbi0+cmVmY250KSAtIDE7CisJcHJvYmVzID0gYXRvbWljX3JlYWQoJm4tPnByb2Jlcyk7CisJcmVhZF91bmxvY2tfYmgoJm4tPmxvY2spOworCWxvY2tlZAkJID0gMDsKKwlSVEFfUFVUKHNrYiwgTkRBX0NBQ0hFSU5GTywgc2l6ZW9mKGNpKSwgJmNpKTsKKwlSVEFfUFVUKHNrYiwgTkRBX1BST0JFUywgc2l6ZW9mKHByb2JlcyksICZwcm9iZXMpOworCW5saC0+bmxtc2dfbGVuCSA9IHNrYi0+dGFpbCAtIGI7CisJcmV0dXJuIHNrYi0+bGVuOworCitubG1zZ19mYWlsdXJlOgorcnRhdHRyX2ZhaWx1cmU6CisJaWYgKGxvY2tlZCkKKwkJcmVhZF91bmxvY2tfYmgoJm4tPmxvY2spOworCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorCisKK3N0YXRpYyBpbnQgbmVpZ2hfZHVtcF90YWJsZShzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJc3RydWN0IG5laWdoYm91ciAqbjsKKwlpbnQgcmMsIGgsIHNfaCA9IGNiLT5hcmdzWzFdOworCWludCBpZHgsIHNfaWR4ID0gaWR4ID0gY2ItPmFyZ3NbMl07CisKKwlmb3IgKGggPSAwOyBoIDw9IHRibC0+aGFzaF9tYXNrOyBoKyspIHsKKwkJaWYgKGggPCBzX2gpCisJCQljb250aW51ZTsKKwkJaWYgKGggPiBzX2gpCisJCQlzX2lkeCA9IDA7CisJCXJlYWRfbG9ja19iaCgmdGJsLT5sb2NrKTsKKwkJZm9yIChuID0gdGJsLT5oYXNoX2J1Y2tldHNbaF0sIGlkeCA9IDA7IG47IG4gPSBuLT5uZXh0LCBpZHgrKykgeworCQkJaWYgKGlkeCA8IHNfaWR4KQorCQkJCWNvbnRpbnVlOworCQkJaWYgKG5laWdoX2ZpbGxfaW5mbyhza2IsIG4sIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLAorCQkJCQkgICAgY2ItPm5saC0+bmxtc2dfc2VxLAorCQkJCQkgICAgUlRNX05FV05FSUdIKSA8PSAwKSB7CisJCQkJcmVhZF91bmxvY2tfYmgoJnRibC0+bG9jayk7CisJCQkJcmMgPSAtMTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlyZWFkX3VubG9ja19iaCgmdGJsLT5sb2NrKTsKKwl9CisJcmMgPSBza2ItPmxlbjsKK291dDoKKwljYi0+YXJnc1sxXSA9IGg7CisJY2ItPmFyZ3NbMl0gPSBpZHg7CisJcmV0dXJuIHJjOworfQorCitpbnQgbmVpZ2hfZHVtcF9pbmZvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibDsKKwlpbnQgdCwgZmFtaWx5LCBzX3Q7CisKKwlyZWFkX2xvY2soJm5laWdoX3RibF9sb2NrKTsKKwlmYW1pbHkgPSAoKHN0cnVjdCBydGdlbm1zZyAqKU5MTVNHX0RBVEEoY2ItPm5saCkpLT5ydGdlbl9mYW1pbHk7CisJc190ID0gY2ItPmFyZ3NbMF07CisKKwlmb3IgKHRibCA9IG5laWdoX3RhYmxlcywgdCA9IDA7IHRibDsgdGJsID0gdGJsLT5uZXh0LCB0KyspIHsKKwkJaWYgKHQgPCBzX3QgfHwgKGZhbWlseSAmJiB0YmwtPmZhbWlseSAhPSBmYW1pbHkpKQorCQkJY29udGludWU7CisJCWlmICh0ID4gc190KQorCQkJbWVtc2V0KCZjYi0+YXJnc1sxXSwgMCwgc2l6ZW9mKGNiLT5hcmdzKSAtCisJCQkJCQlzaXplb2YoY2ItPmFyZ3NbMF0pKTsKKwkJaWYgKG5laWdoX2R1bXBfdGFibGUodGJsLCBza2IsIGNiKSA8IDApCisJCQlicmVhazsKKwl9CisJcmVhZF91bmxvY2soJm5laWdoX3RibF9sb2NrKTsKKworCWNiLT5hcmdzWzBdID0gdDsKKwlyZXR1cm4gc2tiLT5sZW47Cit9CisKK3ZvaWQgbmVpZ2hfZm9yX2VhY2goc3RydWN0IG5laWdoX3RhYmxlICp0YmwsIHZvaWQgKCpjYikoc3RydWN0IG5laWdoYm91ciAqLCB2b2lkICopLCB2b2lkICpjb29raWUpCit7CisJaW50IGNoYWluOworCisJcmVhZF9sb2NrX2JoKCZ0YmwtPmxvY2spOworCWZvciAoY2hhaW4gPSAwOyBjaGFpbiA8PSB0YmwtPmhhc2hfbWFzazsgY2hhaW4rKykgeworCQlzdHJ1Y3QgbmVpZ2hib3VyICpuOworCisJCWZvciAobiA9IHRibC0+aGFzaF9idWNrZXRzW2NoYWluXTsgbjsgbiA9IG4tPm5leHQpCisJCQljYihuLCBjb29raWUpOworCX0KKwlyZWFkX3VubG9ja19iaCgmdGJsLT5sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0wobmVpZ2hfZm9yX2VhY2gpOworCisvKiBUaGUgdGJsLT5sb2NrIG11c3QgYmUgaGVsZCBhcyBhIHdyaXRlciBhbmQgQkggZGlzYWJsZWQuICovCit2b2lkIF9fbmVpZ2hfZm9yX2VhY2hfcmVsZWFzZShzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCwKKwkJCSAgICAgIGludCAoKmNiKShzdHJ1Y3QgbmVpZ2hib3VyICopKQoreworCWludCBjaGFpbjsKKworCWZvciAoY2hhaW4gPSAwOyBjaGFpbiA8PSB0YmwtPmhhc2hfbWFzazsgY2hhaW4rKykgeworCQlzdHJ1Y3QgbmVpZ2hib3VyICpuLCAqKm5wOworCisJCW5wID0gJnRibC0+aGFzaF9idWNrZXRzW2NoYWluXTsKKwkJd2hpbGUgKChuID0gKm5wKSAhPSBOVUxMKSB7CisJCQlpbnQgcmVsZWFzZTsKKworCQkJd3JpdGVfbG9jaygmbi0+bG9jayk7CisJCQlyZWxlYXNlID0gY2Iobik7CisJCQlpZiAocmVsZWFzZSkgeworCQkJCSpucCA9IG4tPm5leHQ7CisJCQkJbi0+ZGVhZCA9IDE7CisJCQl9IGVsc2UKKwkJCQlucCA9ICZuLT5uZXh0OworCQkJd3JpdGVfdW5sb2NrKCZuLT5sb2NrKTsKKwkJCWlmIChyZWxlYXNlKQorCQkJCW5laWdoX3JlbGVhc2Uobik7CisJCX0KKwl9Cit9CitFWFBPUlRfU1lNQk9MKF9fbmVpZ2hfZm9yX2VhY2hfcmVsZWFzZSk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCitzdGF0aWMgc3RydWN0IG5laWdoYm91ciAqbmVpZ2hfZ2V0X2ZpcnN0KHN0cnVjdCBzZXFfZmlsZSAqc2VxKQoreworCXN0cnVjdCBuZWlnaF9zZXFfc3RhdGUgKnN0YXRlID0gc2VxLT5wcml2YXRlOworCXN0cnVjdCBuZWlnaF90YWJsZSAqdGJsID0gc3RhdGUtPnRibDsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuID0gTlVMTDsKKwlpbnQgYnVja2V0ID0gc3RhdGUtPmJ1Y2tldDsKKworCXN0YXRlLT5mbGFncyAmPSB+TkVJR0hfU0VRX0lTX1BORUlHSDsKKwlmb3IgKGJ1Y2tldCA9IDA7IGJ1Y2tldCA8PSB0YmwtPmhhc2hfbWFzazsgYnVja2V0KyspIHsKKwkJbiA9IHRibC0+aGFzaF9idWNrZXRzW2J1Y2tldF07CisKKwkJd2hpbGUgKG4pIHsKKwkJCWlmIChzdGF0ZS0+bmVpZ2hfc3ViX2l0ZXIpIHsKKwkJCQlsb2ZmX3QgZmFrZXAgPSAwOworCQkJCXZvaWQgKnY7CisKKwkJCQl2ID0gc3RhdGUtPm5laWdoX3N1Yl9pdGVyKHN0YXRlLCBuLCAmZmFrZXApOworCQkJCWlmICghdikKKwkJCQkJZ290byBuZXh0OworCQkJfQorCQkJaWYgKCEoc3RhdGUtPmZsYWdzICYgTkVJR0hfU0VRX1NLSVBfTk9BUlApKQorCQkJCWJyZWFrOworCQkJaWYgKG4tPm51ZF9zdGF0ZSAmIH5OVURfTk9BUlApCisJCQkJYnJlYWs7CisJCW5leHQ6CisJCQluID0gbi0+bmV4dDsKKwkJfQorCisJCWlmIChuKQorCQkJYnJlYWs7CisJfQorCXN0YXRlLT5idWNrZXQgPSBidWNrZXQ7CisKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoX2dldF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLAorCQkJCQlzdHJ1Y3QgbmVpZ2hib3VyICpuLAorCQkJCQlsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgbmVpZ2hfc2VxX3N0YXRlICpzdGF0ZSA9IHNlcS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCA9IHN0YXRlLT50Ymw7CisKKwlpZiAoc3RhdGUtPm5laWdoX3N1Yl9pdGVyKSB7CisJCXZvaWQgKnYgPSBzdGF0ZS0+bmVpZ2hfc3ViX2l0ZXIoc3RhdGUsIG4sIHBvcyk7CisJCWlmICh2KQorCQkJcmV0dXJuIG47CisJfQorCW4gPSBuLT5uZXh0OworCisJd2hpbGUgKDEpIHsKKwkJd2hpbGUgKG4pIHsKKwkJCWlmIChzdGF0ZS0+bmVpZ2hfc3ViX2l0ZXIpIHsKKwkJCQl2b2lkICp2ID0gc3RhdGUtPm5laWdoX3N1Yl9pdGVyKHN0YXRlLCBuLCBwb3MpOworCQkJCWlmICh2KQorCQkJCQlyZXR1cm4gbjsKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCQlpZiAoIShzdGF0ZS0+ZmxhZ3MgJiBORUlHSF9TRVFfU0tJUF9OT0FSUCkpCisJCQkJYnJlYWs7CisKKwkJCWlmIChuLT5udWRfc3RhdGUgJiB+TlVEX05PQVJQKQorCQkJCWJyZWFrOworCQluZXh0OgorCQkJbiA9IG4tPm5leHQ7CisJCX0KKworCQlpZiAobikKKwkJCWJyZWFrOworCisJCWlmICgrK3N0YXRlLT5idWNrZXQgPiB0YmwtPmhhc2hfbWFzaykKKwkJCWJyZWFrOworCisJCW4gPSB0YmwtPmhhc2hfYnVja2V0c1tzdGF0ZS0+YnVja2V0XTsKKwl9CisKKwlpZiAobiAmJiBwb3MpCisJCS0tKCpwb3MpOworCXJldHVybiBuOworfQorCitzdGF0aWMgc3RydWN0IG5laWdoYm91ciAqbmVpZ2hfZ2V0X2lkeChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IG5laWdoYm91ciAqbiA9IG5laWdoX2dldF9maXJzdChzZXEpOworCisJaWYgKG4pIHsKKwkJd2hpbGUgKCpwb3MpIHsKKwkJCW4gPSBuZWlnaF9nZXRfbmV4dChzZXEsIG4sIHBvcyk7CisJCQlpZiAoIW4pCisJCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuICpwb3MgPyBOVUxMIDogbjsKK30KKworc3RhdGljIHN0cnVjdCBwbmVpZ2hfZW50cnkgKnBuZWlnaF9nZXRfZmlyc3Qoc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc3RydWN0IG5laWdoX3NlcV9zdGF0ZSAqc3RhdGUgPSBzZXEtPnByaXZhdGU7CisJc3RydWN0IG5laWdoX3RhYmxlICp0YmwgPSBzdGF0ZS0+dGJsOworCXN0cnVjdCBwbmVpZ2hfZW50cnkgKnBuID0gTlVMTDsKKwlpbnQgYnVja2V0ID0gc3RhdGUtPmJ1Y2tldDsKKworCXN0YXRlLT5mbGFncyB8PSBORUlHSF9TRVFfSVNfUE5FSUdIOworCWZvciAoYnVja2V0ID0gMDsgYnVja2V0IDw9IFBORUlHSF9IQVNITUFTSzsgYnVja2V0KyspIHsKKwkJcG4gPSB0YmwtPnBoYXNoX2J1Y2tldHNbYnVja2V0XTsKKwkJaWYgKHBuKQorCQkJYnJlYWs7CisJfQorCXN0YXRlLT5idWNrZXQgPSBidWNrZXQ7CisKKwlyZXR1cm4gcG47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcG5laWdoX2VudHJ5ICpwbmVpZ2hfZ2V0X25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsCisJCQkJCSAgICBzdHJ1Y3QgcG5laWdoX2VudHJ5ICpwbiwKKwkJCQkJICAgIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBuZWlnaF9zZXFfc3RhdGUgKnN0YXRlID0gc2VxLT5wcml2YXRlOworCXN0cnVjdCBuZWlnaF90YWJsZSAqdGJsID0gc3RhdGUtPnRibDsKKworCXBuID0gcG4tPm5leHQ7CisJd2hpbGUgKCFwbikgeworCQlpZiAoKytzdGF0ZS0+YnVja2V0ID4gUE5FSUdIX0hBU0hNQVNLKQorCQkJYnJlYWs7CisJCXBuID0gdGJsLT5waGFzaF9idWNrZXRzW3N0YXRlLT5idWNrZXRdOworCQlpZiAocG4pCisJCQlicmVhazsKKwl9CisKKwlpZiAocG4gJiYgcG9zKQorCQktLSgqcG9zKTsKKworCXJldHVybiBwbjsKK30KKworc3RhdGljIHN0cnVjdCBwbmVpZ2hfZW50cnkgKnBuZWlnaF9nZXRfaWR4KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgcG5laWdoX2VudHJ5ICpwbiA9IHBuZWlnaF9nZXRfZmlyc3Qoc2VxKTsKKworCWlmIChwbikgeworCQl3aGlsZSAoKnBvcykgeworCQkJcG4gPSBwbmVpZ2hfZ2V0X25leHQoc2VxLCBwbiwgcG9zKTsKKwkJCWlmICghcG4pCisJCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuICpwb3MgPyBOVUxMIDogcG47Cit9CisKK3N0YXRpYyB2b2lkICpuZWlnaF9nZXRfaWR4X2FueShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IG5laWdoX3NlcV9zdGF0ZSAqc3RhdGUgPSBzZXEtPnByaXZhdGU7CisJdm9pZCAqcmM7CisKKwlyYyA9IG5laWdoX2dldF9pZHgoc2VxLCBwb3MpOworCWlmICghcmMgJiYgIShzdGF0ZS0+ZmxhZ3MgJiBORUlHSF9TRVFfTkVJR0hfT05MWSkpCisJCXJjID0gcG5laWdoX2dldF9pZHgoc2VxLCBwb3MpOworCisJcmV0dXJuIHJjOworfQorCit2b2lkICpuZWlnaF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zLCBzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCwgdW5zaWduZWQgaW50IG5laWdoX3NlcV9mbGFncykKK3sKKwlzdHJ1Y3QgbmVpZ2hfc2VxX3N0YXRlICpzdGF0ZSA9IHNlcS0+cHJpdmF0ZTsKKwlsb2ZmX3QgcG9zX21pbnVzX29uZTsKKworCXN0YXRlLT50YmwgPSB0Ymw7CisJc3RhdGUtPmJ1Y2tldCA9IDA7CisJc3RhdGUtPmZsYWdzID0gKG5laWdoX3NlcV9mbGFncyAmIH5ORUlHSF9TRVFfSVNfUE5FSUdIKTsKKworCXJlYWRfbG9ja19iaCgmdGJsLT5sb2NrKTsKKworCXBvc19taW51c19vbmUgPSAqcG9zIC0gMTsKKwlyZXR1cm4gKnBvcyA/IG5laWdoX2dldF9pZHhfYW55KHNlcSwgJnBvc19taW51c19vbmUpIDogU0VRX1NUQVJUX1RPS0VOOworfQorRVhQT1JUX1NZTUJPTChuZWlnaF9zZXFfc3RhcnQpOworCit2b2lkICpuZWlnaF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IG5laWdoX3NlcV9zdGF0ZSAqc3RhdGU7CisJdm9pZCAqcmM7CisKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJcmMgPSBuZWlnaF9nZXRfaWR4KHNlcSwgcG9zKTsKKwkJZ290byBvdXQ7CisJfQorCisJc3RhdGUgPSBzZXEtPnByaXZhdGU7CisJaWYgKCEoc3RhdGUtPmZsYWdzICYgTkVJR0hfU0VRX0lTX1BORUlHSCkpIHsKKwkJcmMgPSBuZWlnaF9nZXRfbmV4dChzZXEsIHYsIE5VTEwpOworCQlpZiAocmMpCisJCQlnb3RvIG91dDsKKwkJaWYgKCEoc3RhdGUtPmZsYWdzICYgTkVJR0hfU0VRX05FSUdIX09OTFkpKQorCQkJcmMgPSBwbmVpZ2hfZ2V0X2ZpcnN0KHNlcSk7CisJfSBlbHNlIHsKKwkJQlVHX09OKHN0YXRlLT5mbGFncyAmIE5FSUdIX1NFUV9ORUlHSF9PTkxZKTsKKwkJcmMgPSBwbmVpZ2hfZ2V0X25leHQoc2VxLCB2LCBOVUxMKTsKKwl9CitvdXQ6CisJKysoKnBvcyk7CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChuZWlnaF9zZXFfbmV4dCk7CisKK3ZvaWQgbmVpZ2hfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IG5laWdoX3NlcV9zdGF0ZSAqc3RhdGUgPSBzZXEtPnByaXZhdGU7CisJc3RydWN0IG5laWdoX3RhYmxlICp0YmwgPSBzdGF0ZS0+dGJsOworCisJcmVhZF91bmxvY2tfYmgoJnRibC0+bG9jayk7Cit9CitFWFBPUlRfU1lNQk9MKG5laWdoX3NlcV9zdG9wKTsKKworLyogc3RhdGlzdGljcyB2aWEgc2VxX2ZpbGUgKi8KKworc3RhdGljIHZvaWQgKm5laWdoX3N0YXRfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IHNlcS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCA9IHBkZS0+ZGF0YTsKKwlpbnQgY3B1OworCisJaWYgKCpwb3MgPT0gMCkKKwkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKKwkKKwlmb3IgKGNwdSA9ICpwb3MtMTsgY3B1IDwgTlJfQ1BVUzsgKytjcHUpIHsKKwkJaWYgKCFjcHVfcG9zc2libGUoY3B1KSkKKwkJCWNvbnRpbnVlOworCQkqcG9zID0gY3B1KzE7CisJCXJldHVybiBwZXJfY3B1X3B0cih0YmwtPnN0YXRzLCBjcHUpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKm5laWdoX3N0YXRfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gc2VxLT5wcml2YXRlOworCXN0cnVjdCBuZWlnaF90YWJsZSAqdGJsID0gcGRlLT5kYXRhOworCWludCBjcHU7CisKKwlmb3IgKGNwdSA9ICpwb3M7IGNwdSA8IE5SX0NQVVM7ICsrY3B1KSB7CisJCWlmICghY3B1X3Bvc3NpYmxlKGNwdSkpCisJCQljb250aW51ZTsKKwkJKnBvcyA9IGNwdSsxOworCQlyZXR1cm4gcGVyX2NwdV9wdHIodGJsLT5zdGF0cywgY3B1KTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIG5laWdoX3N0YXRfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisKK30KKworc3RhdGljIGludCBuZWlnaF9zdGF0X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gc2VxLT5wcml2YXRlOworCXN0cnVjdCBuZWlnaF90YWJsZSAqdGJsID0gcGRlLT5kYXRhOworCXN0cnVjdCBuZWlnaF9zdGF0aXN0aWNzICpzdCA9IHY7CisKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJc2VxX3ByaW50ZihzZXEsICJlbnRyaWVzICBhbGxvY3MgZGVzdHJveXMgaGFzaF9ncm93cyAgbG9va3VwcyBoaXRzICByZXNfZmFpbGVkICByY3ZfcHJvYmVzX21jYXN0IHJjdl9wcm9iZXNfdWNhc3QgIHBlcmlvZGljX2djX3J1bnMgZm9yY2VkX2djX3J1bnMgZm9yY2VkX2djX2dvYWxfbWlzc1xuIik7CisJCXJldHVybiAwOworCX0KKworCXNlcV9wcmludGYoc2VxLCAiJTA4eCAgJTA4bHggJTA4bHggJTA4bHggICUwOGx4ICUwOGx4ICAlMDhseCAgIgorCQkJIiUwOGx4ICUwOGx4ICAlMDhseCAlMDhseFxuIiwKKwkJICAgYXRvbWljX3JlYWQoJnRibC0+ZW50cmllcyksCisKKwkJICAgc3QtPmFsbG9jcywKKwkJICAgc3QtPmRlc3Ryb3lzLAorCQkgICBzdC0+aGFzaF9ncm93cywKKworCQkgICBzdC0+bG9va3VwcywKKwkJICAgc3QtPmhpdHMsCisKKwkJICAgc3QtPnJlc19mYWlsZWQsCisKKwkJICAgc3QtPnJjdl9wcm9iZXNfbWNhc3QsCisJCSAgIHN0LT5yY3ZfcHJvYmVzX3VjYXN0LAorCisJCSAgIHN0LT5wZXJpb2RpY19nY19ydW5zLAorCQkgICBzdC0+Zm9yY2VkX2djX3J1bnMKKwkJICAgKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIG5laWdoX3N0YXRfc2VxX29wcyA9IHsKKwkuc3RhcnQJPSBuZWlnaF9zdGF0X3NlcV9zdGFydCwKKwkubmV4dAk9IG5laWdoX3N0YXRfc2VxX25leHQsCisJLnN0b3AJPSBuZWlnaF9zdGF0X3NlcV9zdG9wLAorCS5zaG93CT0gbmVpZ2hfc3RhdF9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgbmVpZ2hfc3RhdF9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgcmV0ID0gc2VxX29wZW4oZmlsZSwgJm5laWdoX3N0YXRfc2VxX29wcyk7CisKKwlpZiAoIXJldCkgeworCQlzdHJ1Y3Qgc2VxX2ZpbGUgKnNmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCQlzZi0+cHJpdmF0ZSA9IFBERShpbm9kZSk7CisJfQorCXJldHVybiByZXQ7Cit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBuZWlnaF9zdGF0X3NlcV9mb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkub3BlbiAJID0gbmVpZ2hfc3RhdF9zZXFfb3BlbiwKKwkucmVhZAkgPSBzZXFfcmVhZCwKKwkubGxzZWVrCSA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKKyNpZmRlZiBDT05GSUdfQVJQRAordm9pZCBuZWlnaF9hcHBfbnMoc3RydWN0IG5laWdoYm91ciAqbikKK3sKKwlzdHJ1Y3Qgbmxtc2doZHIgICpubGg7CisJaW50IHNpemUgPSBOTE1TR19TUEFDRShzaXplb2Yoc3RydWN0IG5kbXNnKSArIDI1Nik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFsbG9jX3NrYihzaXplLCBHRlBfQVRPTUlDKTsKKworCWlmICghc2tiKQorCQlyZXR1cm47CisKKwlpZiAobmVpZ2hfZmlsbF9pbmZvKHNrYiwgbiwgMCwgMCwgUlRNX0dFVE5FSUdIKSA8IDApIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisJbmxoCQkJICAgPSAoc3RydWN0IG5sbXNnaGRyICopc2tiLT5kYXRhOworCW5saC0+bmxtc2dfZmxhZ3MJICAgPSBOTE1fRl9SRVFVRVNUOworCU5FVExJTktfQ0Ioc2tiKS5kc3RfZ3JvdXBzID0gUlRNR1JQX05FSUdIOworCW5ldGxpbmtfYnJvYWRjYXN0KHJ0bmwsIHNrYiwgMCwgUlRNR1JQX05FSUdILCBHRlBfQVRPTUlDKTsKK30KKworc3RhdGljIHZvaWQgbmVpZ2hfYXBwX25vdGlmeShzdHJ1Y3QgbmVpZ2hib3VyICpuKQoreworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCWludCBzaXplID0gTkxNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBuZG1zZykgKyAyNTYpOworCXN0cnVjdCBza19idWZmICpza2IgPSBhbGxvY19za2Ioc2l6ZSwgR0ZQX0FUT01JQyk7CisKKwlpZiAoIXNrYikKKwkJcmV0dXJuOworCisJaWYgKG5laWdoX2ZpbGxfaW5mbyhza2IsIG4sIDAsIDAsIFJUTV9ORVdORUlHSCkgPCAwKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorCW5saAkJCSAgID0gKHN0cnVjdCBubG1zZ2hkciAqKXNrYi0+ZGF0YTsKKwlORVRMSU5LX0NCKHNrYikuZHN0X2dyb3VwcyA9IFJUTUdSUF9ORUlHSDsKKwluZXRsaW5rX2Jyb2FkY2FzdChydG5sLCBza2IsIDAsIFJUTUdSUF9ORUlHSCwgR0ZQX0FUT01JQyk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfQVJQRCAqLworCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCitzdGF0aWMgc3RydWN0IG5laWdoX3N5c2N0bF90YWJsZSB7CisJc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKnN5c2N0bF9oZWFkZXI7CisJY3RsX3RhYmxlCQluZWlnaF92YXJzW19fTkVUX05FSUdIX01BWF07CisJY3RsX3RhYmxlCQluZWlnaF9kZXZbMl07CisJY3RsX3RhYmxlCQluZWlnaF9uZWlnaF9kaXJbMl07CisJY3RsX3RhYmxlCQluZWlnaF9wcm90b19kaXJbMl07CisJY3RsX3RhYmxlCQluZWlnaF9yb290X2RpclsyXTsKK30gbmVpZ2hfc3lzY3RsX3RlbXBsYXRlID0geworCS5uZWlnaF92YXJzID0geworCQl7CisJCQkuY3RsX25hbWUJPSBORVRfTkVJR0hfTUNBU1RfU09MSUNJVCwKKwkJCS5wcm9jbmFtZQk9ICJtY2FzdF9zb2xpY2l0IiwKKwkJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCQkubW9kZQkJPSAwNjQ0LAorCQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCQl9LAorCQl7CisJCQkuY3RsX25hbWUJPSBORVRfTkVJR0hfVUNBU1RfU09MSUNJVCwKKwkJCS5wcm9jbmFtZQk9ICJ1Y2FzdF9zb2xpY2l0IiwKKwkJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCQkubW9kZQkJPSAwNjQ0LAorCQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCQl9LAorCQl7CisJCQkuY3RsX25hbWUJPSBORVRfTkVJR0hfQVBQX1NPTElDSVQsCisJCQkucHJvY25hbWUJPSAiYXBwX3NvbGljaXQiLAorCQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJCS5tb2RlCQk9IDA2NDQsCisJCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJCX0sCisJCXsKKwkJCS5jdGxfbmFtZQk9IE5FVF9ORUlHSF9SRVRSQU5TX1RJTUUsCisJCQkucHJvY25hbWUJPSAicmV0cmFuc190aW1lIiwKKwkJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCQkubW9kZQkJPSAwNjQ0LAorCQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX3VzZXJoel9qaWZmaWVzLAorCQl9LAorCQl7CisJCQkuY3RsX25hbWUJPSBORVRfTkVJR0hfUkVBQ0hBQkxFX1RJTUUsCisJCQkucHJvY25hbWUJPSAiYmFzZV9yZWFjaGFibGVfdGltZSIsCisJCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkJLm1vZGUJCT0gMDY0NCwKKwkJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCQkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9qaWZmaWVzLAorCQl9LAorCQl7CisJCQkuY3RsX25hbWUJPSBORVRfTkVJR0hfREVMQVlfUFJPQkVfVElNRSwKKwkJCS5wcm9jbmFtZQk9ICJkZWxheV9maXJzdF9wcm9iZV90aW1lIiwKKwkJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCQkubW9kZQkJPSAwNjQ0LAorCQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ppZmZpZXMsCisJCX0sCisJCXsKKwkJCS5jdGxfbmFtZQk9IE5FVF9ORUlHSF9HQ19TVEFMRV9USU1FLAorCQkJLnByb2NuYW1lCT0gImdjX3N0YWxlX3RpbWUiLAorCQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJCS5tb2RlCQk9IDA2NDQsCisJCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwkJCS5zdHJhdGVneQk9ICZzeXNjdGxfamlmZmllcywKKwkJfSwKKwkJeworCQkJLmN0bF9uYW1lCT0gTkVUX05FSUdIX1VOUkVTX1FMRU4sCisJCQkucHJvY25hbWUJPSAidW5yZXNfcWxlbiIsCisJCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkJLm1vZGUJCT0gMDY0NCwKKwkJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwkJfSwKKwkJeworCQkJLmN0bF9uYW1lCT0gTkVUX05FSUdIX1BST1hZX1FMRU4sCisJCQkucHJvY25hbWUJPSAicHJveHlfcWxlbiIsCisJCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkJLm1vZGUJCT0gMDY0NCwKKwkJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwkJfSwKKwkJeworCQkJLmN0bF9uYW1lCT0gTkVUX05FSUdIX0FOWUNBU1RfREVMQVksCisJCQkucHJvY25hbWUJPSAiYW55Y2FzdF9kZWxheSIsCisJCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkJLm1vZGUJCT0gMDY0NCwKKwkJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY191c2VyaHpfamlmZmllcywKKwkJfSwKKwkJeworCQkJLmN0bF9uYW1lCT0gTkVUX05FSUdIX1BST1hZX0RFTEFZLAorCQkJLnByb2NuYW1lCT0gInByb3h5X2RlbGF5IiwKKwkJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCQkubW9kZQkJPSAwNjQ0LAorCQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX3VzZXJoel9qaWZmaWVzLAorCQl9LAorCQl7CisJCQkuY3RsX25hbWUJPSBORVRfTkVJR0hfTE9DS1RJTUUsCisJCQkucHJvY25hbWUJPSAibG9ja3RpbWUiLAorCQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJCS5tb2RlCQk9IDA2NDQsCisJCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfdXNlcmh6X2ppZmZpZXMsCisJCX0sCisJCXsKKwkJCS5jdGxfbmFtZQk9IE5FVF9ORUlHSF9HQ19JTlRFUlZBTCwKKwkJCS5wcm9jbmFtZQk9ICJnY19pbnRlcnZhbCIsCisJCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkJLm1vZGUJCT0gMDY0NCwKKwkJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCQkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9qaWZmaWVzLAorCQl9LAorCQl7CisJCQkuY3RsX25hbWUJPSBORVRfTkVJR0hfR0NfVEhSRVNIMSwKKwkJCS5wcm9jbmFtZQk9ICJnY190aHJlc2gxIiwKKwkJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCQkubW9kZQkJPSAwNjQ0LAorCQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCQl9LAorCQl7CisJCQkuY3RsX25hbWUJPSBORVRfTkVJR0hfR0NfVEhSRVNIMiwKKwkJCS5wcm9jbmFtZQk9ICJnY190aHJlc2gyIiwKKwkJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCQkubW9kZQkJPSAwNjQ0LAorCQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCQl9LAorCQl7CisJCQkuY3RsX25hbWUJPSBORVRfTkVJR0hfR0NfVEhSRVNIMywKKwkJCS5wcm9jbmFtZQk9ICJnY190aHJlc2gzIiwKKwkJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCQkubW9kZQkJPSAwNjQ0LAorCQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCQl9LAorCQl7CisJCQkuY3RsX25hbWUJPSBORVRfTkVJR0hfUkVUUkFOU19USU1FX01TLAorCQkJLnByb2NuYW1lCT0gInJldHJhbnNfdGltZV9tcyIsCisJCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkJLm1vZGUJCT0gMDY0NCwKKwkJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19tc19qaWZmaWVzLAorCQkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9tc19qaWZmaWVzLAorCQl9LAorCQl7CisJCQkuY3RsX25hbWUJPSBORVRfTkVJR0hfUkVBQ0hBQkxFX1RJTUVfTVMsCisJCQkucHJvY25hbWUJPSAiYmFzZV9yZWFjaGFibGVfdGltZV9tcyIsCisJCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkJLm1vZGUJCT0gMDY0NCwKKwkJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19tc19qaWZmaWVzLAorCQkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9tc19qaWZmaWVzLAorCQl9LAorCX0sCisJLm5laWdoX2RldiA9IHsKKwkJeworCQkJLmN0bF9uYW1lCT0gTkVUX1BST1RPX0NPTkZfREVGQVVMVCwKKwkJCS5wcm9jbmFtZQk9ICJkZWZhdWx0IiwKKwkJCS5tb2RlCQk9IDA1NTUsCisJCX0sCisJfSwKKwkubmVpZ2hfbmVpZ2hfZGlyID0geworCQl7CisJCQkucHJvY25hbWUJPSAibmVpZ2giLAorCQkJLm1vZGUJCT0gMDU1NSwKKwkJfSwKKwl9LAorCS5uZWlnaF9wcm90b19kaXIgPSB7CisJCXsKKwkJCS5tb2RlCQk9IDA1NTUsCisJCX0sCisJfSwKKwkubmVpZ2hfcm9vdF9kaXIgPSB7CisJCXsKKwkJCS5jdGxfbmFtZQk9IENUTF9ORVQsCisJCQkucHJvY25hbWUJPSAibmV0IiwKKwkJCS5tb2RlCQk9IDA1NTUsCisJCX0sCisJfSwKK307CisKK2ludCBuZWlnaF9zeXNjdGxfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5laWdoX3Bhcm1zICpwLAorCQkJICBpbnQgcF9pZCwgaW50IHBkZXZfaWQsIGNoYXIgKnBfbmFtZSwgCisJCQkgIHByb2NfaGFuZGxlciAqaGFuZGxlciwgY3RsX2hhbmRsZXIgKnN0cmF0ZWd5KQoreworCXN0cnVjdCBuZWlnaF9zeXNjdGxfdGFibGUgKnQgPSBrbWFsbG9jKHNpemVvZigqdCksIEdGUF9LRVJORUwpOworCWNvbnN0IGNoYXIgKmRldl9uYW1lX3NvdXJjZSA9IE5VTEw7CisJY2hhciAqZGV2X25hbWUgPSBOVUxMOworCWludCBlcnIgPSAwOworCisJaWYgKCF0KQorCQlyZXR1cm4gLUVOT0JVRlM7CisJbWVtY3B5KHQsICZuZWlnaF9zeXNjdGxfdGVtcGxhdGUsIHNpemVvZigqdCkpOworCXQtPm5laWdoX3ZhcnNbMF0uZGF0YSAgPSAmcC0+bWNhc3RfcHJvYmVzOworCXQtPm5laWdoX3ZhcnNbMV0uZGF0YSAgPSAmcC0+dWNhc3RfcHJvYmVzOworCXQtPm5laWdoX3ZhcnNbMl0uZGF0YSAgPSAmcC0+YXBwX3Byb2JlczsKKwl0LT5uZWlnaF92YXJzWzNdLmRhdGEgID0gJnAtPnJldHJhbnNfdGltZTsKKwl0LT5uZWlnaF92YXJzWzRdLmRhdGEgID0gJnAtPmJhc2VfcmVhY2hhYmxlX3RpbWU7CisJdC0+bmVpZ2hfdmFyc1s1XS5kYXRhICA9ICZwLT5kZWxheV9wcm9iZV90aW1lOworCXQtPm5laWdoX3ZhcnNbNl0uZGF0YSAgPSAmcC0+Z2Nfc3RhbGV0aW1lOworCXQtPm5laWdoX3ZhcnNbN10uZGF0YSAgPSAmcC0+cXVldWVfbGVuOworCXQtPm5laWdoX3ZhcnNbOF0uZGF0YSAgPSAmcC0+cHJveHlfcWxlbjsKKwl0LT5uZWlnaF92YXJzWzldLmRhdGEgID0gJnAtPmFueWNhc3RfZGVsYXk7CisJdC0+bmVpZ2hfdmFyc1sxMF0uZGF0YSA9ICZwLT5wcm94eV9kZWxheTsKKwl0LT5uZWlnaF92YXJzWzExXS5kYXRhID0gJnAtPmxvY2t0aW1lOworCisJaWYgKGRldikgeworCQlkZXZfbmFtZV9zb3VyY2UgPSBkZXYtPm5hbWU7CisJCXQtPm5laWdoX2RldlswXS5jdGxfbmFtZSA9IGRldi0+aWZpbmRleDsKKwkJdC0+bmVpZ2hfdmFyc1sxMl0ucHJvY25hbWUgPSBOVUxMOworCQl0LT5uZWlnaF92YXJzWzEzXS5wcm9jbmFtZSA9IE5VTEw7CisJCXQtPm5laWdoX3ZhcnNbMTRdLnByb2NuYW1lID0gTlVMTDsKKwkJdC0+bmVpZ2hfdmFyc1sxNV0ucHJvY25hbWUgPSBOVUxMOworCX0gZWxzZSB7CisgCQlkZXZfbmFtZV9zb3VyY2UgPSB0LT5uZWlnaF9kZXZbMF0ucHJvY25hbWU7CisJCXQtPm5laWdoX3ZhcnNbMTJdLmRhdGEgPSAoaW50ICopKHAgKyAxKTsKKwkJdC0+bmVpZ2hfdmFyc1sxM10uZGF0YSA9IChpbnQgKikocCArIDEpICsgMTsKKwkJdC0+bmVpZ2hfdmFyc1sxNF0uZGF0YSA9IChpbnQgKikocCArIDEpICsgMjsKKwkJdC0+bmVpZ2hfdmFyc1sxNV0uZGF0YSA9IChpbnQgKikocCArIDEpICsgMzsKKwl9CisKKwl0LT5uZWlnaF92YXJzWzE2XS5kYXRhICA9ICZwLT5yZXRyYW5zX3RpbWU7CisJdC0+bmVpZ2hfdmFyc1sxN10uZGF0YSAgPSAmcC0+YmFzZV9yZWFjaGFibGVfdGltZTsKKworCWlmIChoYW5kbGVyIHx8IHN0cmF0ZWd5KSB7CisJCS8qIFJldHJhbnNUaW1lICovCisJCXQtPm5laWdoX3ZhcnNbM10ucHJvY19oYW5kbGVyID0gaGFuZGxlcjsKKwkJdC0+bmVpZ2hfdmFyc1szXS5zdHJhdGVneSA9IHN0cmF0ZWd5OworCQl0LT5uZWlnaF92YXJzWzNdLmV4dHJhMSA9IGRldjsKKwkJLyogUmVhY2hhYmxlVGltZSAqLworCQl0LT5uZWlnaF92YXJzWzRdLnByb2NfaGFuZGxlciA9IGhhbmRsZXI7CisJCXQtPm5laWdoX3ZhcnNbNF0uc3RyYXRlZ3kgPSBzdHJhdGVneTsKKwkJdC0+bmVpZ2hfdmFyc1s0XS5leHRyYTEgPSBkZXY7CisJCS8qIFJldHJhbnNUaW1lIChpbiBtaWxsaXNlY29uZHMpKi8KKwkJdC0+bmVpZ2hfdmFyc1sxNl0ucHJvY19oYW5kbGVyID0gaGFuZGxlcjsKKwkJdC0+bmVpZ2hfdmFyc1sxNl0uc3RyYXRlZ3kgPSBzdHJhdGVneTsKKwkJdC0+bmVpZ2hfdmFyc1sxNl0uZXh0cmExID0gZGV2OworCQkvKiBSZWFjaGFibGVUaW1lIChpbiBtaWxsaXNlY29uZHMpICovCisJCXQtPm5laWdoX3ZhcnNbMTddLnByb2NfaGFuZGxlciA9IGhhbmRsZXI7CisJCXQtPm5laWdoX3ZhcnNbMTddLnN0cmF0ZWd5ID0gc3RyYXRlZ3k7CisJCXQtPm5laWdoX3ZhcnNbMTddLmV4dHJhMSA9IGRldjsKKwl9CisKKwlkZXZfbmFtZSA9IG5ldF9zeXNjdGxfc3RyZHVwKGRldl9uYW1lX3NvdXJjZSk7CisJaWYgKCFkZXZfbmFtZSkgeworCQllcnIgPSAtRU5PQlVGUzsKKwkJZ290byBmcmVlOworCX0KKworIAl0LT5uZWlnaF9kZXZbMF0ucHJvY25hbWUgPSBkZXZfbmFtZTsKKworCXQtPm5laWdoX25laWdoX2RpclswXS5jdGxfbmFtZSA9IHBkZXZfaWQ7CisKKwl0LT5uZWlnaF9wcm90b19kaXJbMF0ucHJvY25hbWUgPSBwX25hbWU7CisJdC0+bmVpZ2hfcHJvdG9fZGlyWzBdLmN0bF9uYW1lID0gcF9pZDsKKworCXQtPm5laWdoX2RldlswXS5jaGlsZAkgICAgICAgPSB0LT5uZWlnaF92YXJzOworCXQtPm5laWdoX25laWdoX2RpclswXS5jaGlsZCAgICA9IHQtPm5laWdoX2RldjsKKwl0LT5uZWlnaF9wcm90b19kaXJbMF0uY2hpbGQgICAgPSB0LT5uZWlnaF9uZWlnaF9kaXI7CisJdC0+bmVpZ2hfcm9vdF9kaXJbMF0uY2hpbGQgICAgID0gdC0+bmVpZ2hfcHJvdG9fZGlyOworCisJdC0+c3lzY3RsX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZSh0LT5uZWlnaF9yb290X2RpciwgMCk7CisJaWYgKCF0LT5zeXNjdGxfaGVhZGVyKSB7CisJCWVyciA9IC1FTk9CVUZTOworCQlnb3RvIGZyZWVfcHJvY25hbWU7CisJfQorCXAtPnN5c2N0bF90YWJsZSA9IHQ7CisJcmV0dXJuIDA7CisKKwkvKiBlcnJvciBwYXRoICovCisgZnJlZV9wcm9jbmFtZToKKwlrZnJlZShkZXZfbmFtZSk7CisgZnJlZToKKwlrZnJlZSh0KTsKKworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgbmVpZ2hfc3lzY3RsX3VucmVnaXN0ZXIoc3RydWN0IG5laWdoX3Bhcm1zICpwKQoreworCWlmIChwLT5zeXNjdGxfdGFibGUpIHsKKwkJc3RydWN0IG5laWdoX3N5c2N0bF90YWJsZSAqdCA9IHAtPnN5c2N0bF90YWJsZTsKKwkJcC0+c3lzY3RsX3RhYmxlID0gTlVMTDsKKwkJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUodC0+c3lzY3RsX2hlYWRlcik7CisJCWtmcmVlKHQtPm5laWdoX2RldlswXS5wcm9jbmFtZSk7CisJCWtmcmVlKHQpOworCX0KK30KKworI2VuZGlmCS8qIENPTkZJR19TWVNDVEwgKi8KKworRVhQT1JUX1NZTUJPTChfX25laWdoX2V2ZW50X3NlbmQpOworRVhQT1JUX1NZTUJPTChuZWlnaF9hZGQpOworRVhQT1JUX1NZTUJPTChuZWlnaF9jaGFuZ2VhZGRyKTsKK0VYUE9SVF9TWU1CT0wobmVpZ2hfY29tcGF0X291dHB1dCk7CitFWFBPUlRfU1lNQk9MKG5laWdoX2Nvbm5lY3RlZF9vdXRwdXQpOworRVhQT1JUX1NZTUJPTChuZWlnaF9jcmVhdGUpOworRVhQT1JUX1NZTUJPTChuZWlnaF9kZWxldGUpOworRVhQT1JUX1NZTUJPTChuZWlnaF9kZXN0cm95KTsKK0VYUE9SVF9TWU1CT0wobmVpZ2hfZHVtcF9pbmZvKTsKK0VYUE9SVF9TWU1CT0wobmVpZ2hfZXZlbnRfbnMpOworRVhQT1JUX1NZTUJPTChuZWlnaF9pZmRvd24pOworRVhQT1JUX1NZTUJPTChuZWlnaF9sb29rdXApOworRVhQT1JUX1NZTUJPTChuZWlnaF9sb29rdXBfbm9kZXYpOworRVhQT1JUX1NZTUJPTChuZWlnaF9wYXJtc19hbGxvYyk7CitFWFBPUlRfU1lNQk9MKG5laWdoX3Bhcm1zX3JlbGVhc2UpOworRVhQT1JUX1NZTUJPTChuZWlnaF9yYW5kX3JlYWNoX3RpbWUpOworRVhQT1JUX1NZTUJPTChuZWlnaF9yZXNvbHZlX291dHB1dCk7CitFWFBPUlRfU1lNQk9MKG5laWdoX3RhYmxlX2NsZWFyKTsKK0VYUE9SVF9TWU1CT0wobmVpZ2hfdGFibGVfaW5pdCk7CitFWFBPUlRfU1lNQk9MKG5laWdoX3VwZGF0ZSk7CitFWFBPUlRfU1lNQk9MKG5laWdoX3VwZGF0ZV9oaHMpOworRVhQT1JUX1NZTUJPTChwbmVpZ2hfZW5xdWV1ZSk7CitFWFBPUlRfU1lNQk9MKHBuZWlnaF9sb29rdXApOworCisjaWZkZWYgQ09ORklHX0FSUEQKK0VYUE9SVF9TWU1CT0wobmVpZ2hfYXBwX25zKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNDVEwKK0VYUE9SVF9TWU1CT0wobmVpZ2hfc3lzY3RsX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0wobmVpZ2hfc3lzY3RsX3VucmVnaXN0ZXIpOworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvY29yZS9uZXQtc3lzZnMuYyBiL25ldC9jb3JlL25ldC1zeXNmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MGY3MDMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvY29yZS9uZXQtc3lzZnMuYwpAQCAtMCwwICsxLDQ2MSBAQAorLyoKKyAqIG5ldC1zeXNmcy5jIC0gbmV0d29yayBkZXZpY2UgY2xhc3MgYW5kIGF0dHJpYnV0ZXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgU3RlcGhlbiBIZW1taW5nZXIgPHNoZW1taW5nZXJAb3NkbC5vcmc+CisgKiAKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKworI2RlZmluZSB0b19jbGFzc19kZXYob2JqKSBjb250YWluZXJfb2Yob2JqLHN0cnVjdCBjbGFzc19kZXZpY2Usa29iaikKKyNkZWZpbmUgdG9fbmV0X2RldihjbGFzcykgY29udGFpbmVyX29mKGNsYXNzLCBzdHJ1Y3QgbmV0X2RldmljZSwgY2xhc3NfZGV2KQorCitzdGF0aWMgY29uc3QgY2hhciBmbXRfaGV4W10gPSAiJSN4XG4iOworc3RhdGljIGNvbnN0IGNoYXIgZm10X2RlY1tdID0gIiVkXG4iOworc3RhdGljIGNvbnN0IGNoYXIgZm10X3Vsb25nW10gPSAiJWx1XG4iOworCitzdGF0aWMgaW5saW5lIGludCBkZXZfaXNhbGl2ZShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlyZXR1cm4gZGV2LT5yZWdfc3RhdGUgPT0gTkVUUkVHX1JFR0lTVEVSRUQ7Cit9CisKKy8qIHVzZSBzYW1lIGxvY2tpbmcgcnVsZXMgYXMgR0lGKiBpb2N0bCdzICovCitzdGF0aWMgc3NpemVfdCBuZXRkZXZfc2hvdyhjb25zdCBzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmLAorCQkJICAgc3NpemVfdCAoKmZvcm1hdCkoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKiwgY2hhciAqKSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ID0gdG9fbmV0X2RldihjZCk7CisJc3NpemVfdCByZXQgPSAtRUlOVkFMOworCisJcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKwlpZiAoZGV2X2lzYWxpdmUobmV0KSkKKwkJcmV0ID0gKCpmb3JtYXQpKG5ldCwgYnVmKTsKKwlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBnZW5lcmF0ZSBhIHNob3cgZnVuY3Rpb24gZm9yIHNpbXBsZSBmaWVsZCAqLworI2RlZmluZSBORVRERVZJQ0VfU0hPVyhmaWVsZCwgZm9ybWF0X3N0cmluZykJCQkJXAorc3RhdGljIHNzaXplX3QgZm9ybWF0XyMjZmllbGQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgZm9ybWF0X3N0cmluZywgbmV0LT5maWVsZCk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyNmaWVsZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gbmV0ZGV2X3Nob3coY2QsIGJ1ZiwgZm9ybWF0XyMjZmllbGQpOwkJCVwKK30KKworCisvKiB1c2Ugc2FtZSBsb2NraW5nIGFuZCBwZXJtaXNzaW9uIHJ1bGVzIGFzIFNJRiogaW9jdGwncyAqLworc3RhdGljIHNzaXplX3QgbmV0ZGV2X3N0b3JlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldiwKKwkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4sCisJCQkgICAgaW50ICgqc2V0KShzdHJ1Y3QgbmV0X2RldmljZSAqLCB1bnNpZ25lZCBsb25nKSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ID0gdG9fbmV0X2RldihkZXYpOworCWNoYXIgKmVuZHA7CisJdW5zaWduZWQgbG9uZyBuZXc7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwluZXcgPSBzaW1wbGVfc3RydG91bChidWYsICZlbmRwLCAwKTsKKwlpZiAoZW5kcCA9PSBidWYpCisJCWdvdG8gZXJyOworCisJcnRubF9sb2NrKCk7CisJaWYgKGRldl9pc2FsaXZlKG5ldCkpIHsKKwkJaWYgKChyZXQgPSAoKnNldCkobmV0LCBuZXcpKSA9PSAwKQorCQkJcmV0ID0gbGVuOworCX0KKwlydG5sX3VubG9jaygpOworIGVycjoKKwlyZXR1cm4gcmV0OworfQorCisvKiBnZW5lcmF0ZSBhIHJlYWQtb25seSBuZXR3b3JrIGRldmljZSBjbGFzcyBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUgTkVUREVWSUNFX0FUVFIoZmllbGQsIGZvcm1hdF9zdHJpbmcpCQkJCVwKK05FVERFVklDRV9TSE9XKGZpZWxkLCBmb3JtYXRfc3RyaW5nKQkJCQkJXAorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGZpZWxkLCBTX0lSVUdPLCBzaG93XyMjZmllbGQsIE5VTEwpCQlcCisKK05FVERFVklDRV9BVFRSKGFkZHJfbGVuLCBmbXRfZGVjKTsKK05FVERFVklDRV9BVFRSKGlmbGluaywgZm10X2RlYyk7CitORVRERVZJQ0VfQVRUUihpZmluZGV4LCBmbXRfZGVjKTsKK05FVERFVklDRV9BVFRSKGZlYXR1cmVzLCBmbXRfaGV4KTsKK05FVERFVklDRV9BVFRSKHR5cGUsIGZtdF9kZWMpOworCisvKiB1c2Ugc2FtZSBsb2NraW5nIHJ1bGVzIGFzIEdJRkhXQUREUiBpb2N0bCdzICovCitzdGF0aWMgc3NpemVfdCBmb3JtYXRfYWRkcihjaGFyICpidWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsIGludCBsZW4pCit7CisJaW50IGk7CisJY2hhciAqY3AgPSBidWY7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCWNwICs9IHNwcmludGYoY3AsICIlMDJ4JWMiLCBhZGRyW2ldLAorCQkJICAgICAgaSA9PSAobGVuIC0gMSkgPyAnXG4nIDogJzonKTsKKwlyZXR1cm4gY3AgLSBidWY7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYWRkcmVzcyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ID0gdG9fbmV0X2RldihkZXYpOworCXNzaXplX3QgcmV0ID0gLUVJTlZBTDsKKworCXJlYWRfbG9jaygmZGV2X2Jhc2VfbG9jayk7CisJaWYgKGRldl9pc2FsaXZlKG5ldCkpCisJICAgIHJldCA9IGZvcm1hdF9hZGRyKGJ1ZiwgbmV0LT5kZXZfYWRkciwgbmV0LT5hZGRyX2xlbik7CisJcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYnJvYWRjYXN0KHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXQgPSB0b19uZXRfZGV2KGRldik7CisJaWYgKGRldl9pc2FsaXZlKG5ldCkpCisJCXJldHVybiBmb3JtYXRfYWRkcihidWYsIG5ldC0+YnJvYWRjYXN0LCBuZXQtPmFkZHJfbGVuKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19jYXJyaWVyKHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSB0b19uZXRfZGV2KGRldik7CisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCQlyZXR1cm4gc3ByaW50ZihidWYsIGZtdF9kZWMsICEhbmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihhZGRyZXNzLCBTX0lSVUdPLCBzaG93X2FkZHJlc3MsIE5VTEwpOworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGJyb2FkY2FzdCwgU19JUlVHTywgc2hvd19icm9hZGNhc3QsIE5VTEwpOworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGNhcnJpZXIsIFNfSVJVR08sIHNob3dfY2FycmllciwgTlVMTCk7CisKKy8qIHJlYWQtd3JpdGUgYXR0cmlidXRlcyAqLworTkVUREVWSUNFX1NIT1cobXR1LCBmbXRfZGVjKTsKKworc3RhdGljIGludCBjaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHVuc2lnbmVkIGxvbmcgbmV3X210dSkKK3sKKwlyZXR1cm4gZGV2X3NldF9tdHUobmV0LCAoaW50KSBuZXdfbXR1KTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfbXR1KHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXJldHVybiBuZXRkZXZfc3RvcmUoZGV2LCBidWYsIGxlbiwgY2hhbmdlX210dSk7Cit9CisKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihtdHUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X210dSwgc3RvcmVfbXR1KTsKKworTkVUREVWSUNFX1NIT1coZmxhZ3MsIGZtdF9oZXgpOworCitzdGF0aWMgaW50IGNoYW5nZV9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LCB1bnNpZ25lZCBsb25nIG5ld19mbGFncykKK3sKKwlyZXR1cm4gZGV2X2NoYW5nZV9mbGFncyhuZXQsICh1bnNpZ25lZCkgbmV3X2ZsYWdzKTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfZmxhZ3Moc3RydWN0IGNsYXNzX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIG5ldGRldl9zdG9yZShkZXYsIGJ1ZiwgbGVuLCBjaGFuZ2VfZmxhZ3MpOworfQorCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoZmxhZ3MsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X2ZsYWdzLCBzdG9yZV9mbGFncyk7CisKK05FVERFVklDRV9TSE9XKHR4X3F1ZXVlX2xlbiwgZm10X3Vsb25nKTsKKworc3RhdGljIGludCBjaGFuZ2VfdHhfcXVldWVfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHVuc2lnbmVkIGxvbmcgbmV3X2xlbikKK3sKKwluZXQtPnR4X3F1ZXVlX2xlbiA9IG5ld19sZW47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3R4X3F1ZXVlX2xlbihzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gbmV0ZGV2X3N0b3JlKGRldiwgYnVmLCBsZW4sIGNoYW5nZV90eF9xdWV1ZV9sZW4pOworfQorCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIodHhfcXVldWVfbGVuLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd190eF9xdWV1ZV9sZW4sIAorCQkJIHN0b3JlX3R4X3F1ZXVlX2xlbik7CisKKworc3RhdGljIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICpuZXRfY2xhc3NfYXR0cmlidXRlc1tdID0geworCSZjbGFzc19kZXZpY2VfYXR0cl9pZmluZGV4LAorCSZjbGFzc19kZXZpY2VfYXR0cl9pZmxpbmssCisJJmNsYXNzX2RldmljZV9hdHRyX2FkZHJfbGVuLAorCSZjbGFzc19kZXZpY2VfYXR0cl90eF9xdWV1ZV9sZW4sCisJJmNsYXNzX2RldmljZV9hdHRyX2ZlYXR1cmVzLAorCSZjbGFzc19kZXZpY2VfYXR0cl9tdHUsCisJJmNsYXNzX2RldmljZV9hdHRyX2ZsYWdzLAorCSZjbGFzc19kZXZpY2VfYXR0cl90eXBlLAorCSZjbGFzc19kZXZpY2VfYXR0cl9hZGRyZXNzLAorCSZjbGFzc19kZXZpY2VfYXR0cl9icm9hZGNhc3QsCisJJmNsYXNzX2RldmljZV9hdHRyX2NhcnJpZXIsCisJTlVMTAorfTsKKworLyogU2hvdyBhIGdpdmVuIGFuIGF0dHJpYnV0ZSBpbiB0aGUgc3RhdGlzdGljcyBncm91cCAqLworc3RhdGljIHNzaXplX3QgbmV0c3RhdF9zaG93KGNvbnN0IHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYsIAorCQkJICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB0b19uZXRfZGV2KGNkKTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHM7CisJc3NpemVfdCByZXQgPSAtRUlOVkFMOworCisJaWYgKG9mZnNldCA+IHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykgfHwKKwkgICAgb2Zmc2V0ICUgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICE9IDApCisJCVdBUk5fT04oMSk7CisKKwlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOworCWlmIChkZXZfaXNhbGl2ZShkZXYpICYmIGRldi0+Z2V0X3N0YXRzICYmCisJICAgIChzdGF0cyA9ICgqZGV2LT5nZXRfc3RhdHMpKGRldikpKSAKKwkJcmV0ID0gc3ByaW50ZihidWYsIGZtdF91bG9uZywKKwkJCSAgICAgICoodW5zaWduZWQgbG9uZyAqKSgoKHU4ICopIHN0YXRzKSArIG9mZnNldCkpOworCisJcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qIGdlbmVyYXRlIGEgcmVhZC1vbmx5IHN0YXRpc3RpY3MgYXR0cmlidXRlICovCisjZGVmaW5lIE5FVFNUQVRfRU5UUlkobmFtZSkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjbmFtZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKSAJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIG5ldHN0YXRfc2hvdyhjZCwgYnVmLCAJCQkJCVwKKwkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cywgbmFtZSkpOwlcCit9CQkJCQkJCQkJXAorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIHNob3dfIyNuYW1lLCBOVUxMKQorCitORVRTVEFUX0VOVFJZKHJ4X3BhY2tldHMpOworTkVUU1RBVF9FTlRSWSh0eF9wYWNrZXRzKTsKK05FVFNUQVRfRU5UUlkocnhfYnl0ZXMpOworTkVUU1RBVF9FTlRSWSh0eF9ieXRlcyk7CitORVRTVEFUX0VOVFJZKHJ4X2Vycm9ycyk7CitORVRTVEFUX0VOVFJZKHR4X2Vycm9ycyk7CitORVRTVEFUX0VOVFJZKHJ4X2Ryb3BwZWQpOworTkVUU1RBVF9FTlRSWSh0eF9kcm9wcGVkKTsKK05FVFNUQVRfRU5UUlkobXVsdGljYXN0KTsKK05FVFNUQVRfRU5UUlkoY29sbGlzaW9ucyk7CitORVRTVEFUX0VOVFJZKHJ4X2xlbmd0aF9lcnJvcnMpOworTkVUU1RBVF9FTlRSWShyeF9vdmVyX2Vycm9ycyk7CitORVRTVEFUX0VOVFJZKHJ4X2NyY19lcnJvcnMpOworTkVUU1RBVF9FTlRSWShyeF9mcmFtZV9lcnJvcnMpOworTkVUU1RBVF9FTlRSWShyeF9maWZvX2Vycm9ycyk7CitORVRTVEFUX0VOVFJZKHJ4X21pc3NlZF9lcnJvcnMpOworTkVUU1RBVF9FTlRSWSh0eF9hYm9ydGVkX2Vycm9ycyk7CitORVRTVEFUX0VOVFJZKHR4X2NhcnJpZXJfZXJyb3JzKTsKK05FVFNUQVRfRU5UUlkodHhfZmlmb19lcnJvcnMpOworTkVUU1RBVF9FTlRSWSh0eF9oZWFydGJlYXRfZXJyb3JzKTsKK05FVFNUQVRfRU5UUlkodHhfd2luZG93X2Vycm9ycyk7CitORVRTVEFUX0VOVFJZKHJ4X2NvbXByZXNzZWQpOworTkVUU1RBVF9FTlRSWSh0eF9jb21wcmVzc2VkKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm5ldHN0YXRfYXR0cnNbXSA9IHsKKwkmY2xhc3NfZGV2aWNlX2F0dHJfcnhfcGFja2V0cy5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl90eF9wYWNrZXRzLmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX3J4X2J5dGVzLmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX3R4X2J5dGVzLmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX3J4X2Vycm9ycy5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl90eF9lcnJvcnMuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfcnhfZHJvcHBlZC5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl90eF9kcm9wcGVkLmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX211bHRpY2FzdC5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9jb2xsaXNpb25zLmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX3J4X2xlbmd0aF9lcnJvcnMuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfcnhfb3Zlcl9lcnJvcnMuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfcnhfY3JjX2Vycm9ycy5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9yeF9mcmFtZV9lcnJvcnMuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfcnhfZmlmb19lcnJvcnMuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfcnhfbWlzc2VkX2Vycm9ycy5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl90eF9hYm9ydGVkX2Vycm9ycy5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl90eF9jYXJyaWVyX2Vycm9ycy5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl90eF9maWZvX2Vycm9ycy5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl90eF9oZWFydGJlYXRfZXJyb3JzLmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX3R4X3dpbmRvd19lcnJvcnMuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfcnhfY29tcHJlc3NlZC5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl90eF9jb21wcmVzc2VkLmF0dHIsCisJTlVMTAorfTsKKworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBuZXRzdGF0X2dyb3VwID0geworCS5uYW1lICA9ICJzdGF0aXN0aWNzIiwKKwkuYXR0cnMgID0gbmV0c3RhdF9hdHRycywKK307CisKKyNpZmRlZiBXSVJFTEVTU19FWFQKKy8qIGhlbHBlciBmdW5jdGlvbiB0aGF0IGRvZXMgYWxsIHRoZSBsb2NraW5nIGV0YyBmb3Igd2lyZWxlc3Mgc3RhdHMgKi8KK3N0YXRpYyBzc2l6ZV90IHdpcmVsZXNzX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZiwKKwkJCSAgICAgc3NpemVfdCAoKmZvcm1hdCkoY29uc3Qgc3RydWN0IGl3X3N0YXRpc3RpY3MgKiwKKwkJCQkJICAgICAgIGNoYXIgKikpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRvX25ldF9kZXYoY2QpOworCWNvbnN0IHN0cnVjdCBpd19zdGF0aXN0aWNzICppdzsKKwlzc2l6ZV90IHJldCA9IC1FSU5WQUw7CisJCisJcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKwlpZiAoZGV2X2lzYWxpdmUoZGV2KSAmJiBkZXYtPmdldF93aXJlbGVzc19zdGF0cyAKKwkgICAgJiYgKGl3ID0gZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMoZGV2KSkgIT0gTlVMTCkgCisJCXJldCA9ICgqZm9ybWF0KShpdywgYnVmKTsKKwlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBzaG93IGZ1bmN0aW9uIHRlbXBsYXRlIGZvciB3aXJlbGVzcyBmaWVsZHMgKi8KKyNkZWZpbmUgV0lSRUxFU1NfU0hPVyhuYW1lLCBmaWVsZCwgZm9ybWF0X3N0cmluZykJCQlcCitzdGF0aWMgc3NpemVfdCBmb3JtYXRfaXdfIyNuYW1lKGNvbnN0IHN0cnVjdCBpd19zdGF0aXN0aWNzICppdywgY2hhciAqYnVmKSBcCit7CQkJCQkJCQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgZm9ybWF0X3N0cmluZywgaXctPmZpZWxkKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19pd18jI25hbWUoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gd2lyZWxlc3Nfc2hvdyhjZCwgYnVmLCBmb3JtYXRfaXdfIyNuYW1lKTsJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgc2hvd19pd18jI25hbWUsIE5VTEwpCisKK1dJUkVMRVNTX1NIT1coc3RhdHVzLCBzdGF0dXMsIGZtdF9oZXgpOworV0lSRUxFU1NfU0hPVyhsaW5rLCBxdWFsLnF1YWwsIGZtdF9kZWMpOworV0lSRUxFU1NfU0hPVyhsZXZlbCwgcXVhbC5sZXZlbCwgZm10X2RlYyk7CitXSVJFTEVTU19TSE9XKG5vaXNlLCBxdWFsLm5vaXNlLCBmbXRfZGVjKTsKK1dJUkVMRVNTX1NIT1cobndpZCwgZGlzY2FyZC5ud2lkLCBmbXRfZGVjKTsKK1dJUkVMRVNTX1NIT1coY3J5cHQsIGRpc2NhcmQuY29kZSwgZm10X2RlYyk7CitXSVJFTEVTU19TSE9XKGZyYWdtZW50LCBkaXNjYXJkLmZyYWdtZW50LCBmbXRfZGVjKTsKK1dJUkVMRVNTX1NIT1cobWlzYywgZGlzY2FyZC5taXNjLCBmbXRfZGVjKTsKK1dJUkVMRVNTX1NIT1cocmV0cmllcywgZGlzY2FyZC5yZXRyaWVzLCBmbXRfZGVjKTsKK1dJUkVMRVNTX1NIT1coYmVhY29uLCBtaXNzLmJlYWNvbiwgZm10X2RlYyk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp3aXJlbGVzc19hdHRyc1tdID0geworCSZjbGFzc19kZXZpY2VfYXR0cl9zdGF0dXMuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfbGluay5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9sZXZlbC5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9ub2lzZS5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9ud2lkLmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX2NyeXB0LmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX2ZyYWdtZW50LmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX3JldHJpZXMuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfbWlzYy5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9iZWFjb24uYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB3aXJlbGVzc19ncm91cCA9IHsKKwkubmFtZSA9ICJ3aXJlbGVzcyIsCisJLmF0dHJzID0gd2lyZWxlc3NfYXR0cnMsCit9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfSE9UUExVRworc3RhdGljIGludCBuZXRkZXZfaG90cGx1ZyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqKmVudnAsCisJCQkgIGludCBudW1fZW52cCwgY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdG9fbmV0X2RldihjZCk7CisJaW50IGkgPSAwOworCWludCBuOworCisJLyogcGFzcyBpbnRlcmZhY2UgaW4gZW52IHRvIGhvdHBsdWcuICovCisJZW52cFtpKytdID0gYnVmOworCW4gPSBzbnByaW50ZihidWYsIHNpemUsICJJTlRFUkZBQ0U9JXMiLCBkZXYtPm5hbWUpICsgMTsKKwlidWYgKz0gbjsKKwlzaXplIC09IG47CisKKwlpZiAoKHNpemUgPD0gMCkgfHwgKGkgPj0gbnVtX2VudnApKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVudnBbaV0gPSBOVUxMOworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qCisgKgluZXRkZXZfcmVsZWFzZSAtLSBkZXN0cm95IGFuZCBmcmVlIGEgZGVhZCBkZXZpY2UuIAorICoJQ2FsbGVkIHdoZW4gbGFzdCByZWZlcmVuY2UgdG8gY2xhc3NfZGV2aWNlIGtvYmplY3QgaXMgZ29uZS4KKyAqLworc3RhdGljIHZvaWQgbmV0ZGV2X3JlbGVhc2Uoc3RydWN0IGNsYXNzX2RldmljZSAqY2QpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiAKKwkJPSBjb250YWluZXJfb2YoY2QsIHN0cnVjdCBuZXRfZGV2aWNlLCBjbGFzc19kZXYpOworCisJQlVHX09OKGRldi0+cmVnX3N0YXRlICE9IE5FVFJFR19SRUxFQVNFRCk7CisKKwlrZnJlZSgoY2hhciAqKWRldiAtIGRldi0+cGFkZGVkKTsKK30KKworc3RhdGljIHN0cnVjdCBjbGFzcyBuZXRfY2xhc3MgPSB7CisJLm5hbWUgPSAibmV0IiwKKwkucmVsZWFzZSA9IG5ldGRldl9yZWxlYXNlLAorI2lmZGVmIENPTkZJR19IT1RQTFVHCisJLmhvdHBsdWcgPSBuZXRkZXZfaG90cGx1ZywKKyNlbmRpZgorfTsKKwordm9pZCBuZXRkZXZfdW5yZWdpc3Rlcl9zeXNmcyhzdHJ1Y3QgbmV0X2RldmljZSAqIG5ldCkKK3sKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICogY2xhc3NfZGV2ID0gJihuZXQtPmNsYXNzX2Rldik7CisKKwlpZiAobmV0LT5nZXRfc3RhdHMpCisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xhc3NfZGV2LT5rb2JqLCAmbmV0c3RhdF9ncm91cCk7CisKKyNpZmRlZiBXSVJFTEVTU19FWFQKKwlpZiAobmV0LT5nZXRfd2lyZWxlc3Nfc3RhdHMpCisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xhc3NfZGV2LT5rb2JqLCAmd2lyZWxlc3NfZ3JvdXApOworI2VuZGlmCisJY2xhc3NfZGV2aWNlX2RlbChjbGFzc19kZXYpOworCit9CisKKy8qIENyZWF0ZSBzeXNmcyBlbnRyaWVzIGZvciBuZXR3b3JrIGRldmljZS4gKi8KK2ludCBuZXRkZXZfcmVnaXN0ZXJfc3lzZnMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKK3sKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYgPSAmKG5ldC0+Y2xhc3NfZGV2KTsKKwlpbnQgaTsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cjsKKwlpbnQgcmV0OworCisJY2xhc3NfZGV2LT5jbGFzcyA9ICZuZXRfY2xhc3M7CisJY2xhc3NfZGV2LT5jbGFzc19kYXRhID0gbmV0OworCisJc3RybGNweShjbGFzc19kZXYtPmNsYXNzX2lkLCBuZXQtPm5hbWUsIEJVU19JRF9TSVpFKTsKKwlpZiAoKHJldCA9IGNsYXNzX2RldmljZV9yZWdpc3RlcihjbGFzc19kZXYpKSkKKwkJZ290byBvdXQ7CisKKwlmb3IgKGkgPSAwOyAoYXR0ciA9IG5ldF9jbGFzc19hdHRyaWJ1dGVzW2ldKSAhPSBOVUxMOyBpKyspIHsKKwkJaWYgKChyZXQgPSBjbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoY2xhc3NfZGV2LCBhdHRyKSkpCisJCSAgICBnb3RvIG91dF91bnJlZzsKKwl9CisKKworCWlmIChuZXQtPmdldF9zdGF0cyAmJgorCSAgICAocmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGFzc19kZXYtPmtvYmosICZuZXRzdGF0X2dyb3VwKSkpCisJCWdvdG8gb3V0X3VucmVnOyAKKworI2lmZGVmIFdJUkVMRVNTX0VYVAorCWlmIChuZXQtPmdldF93aXJlbGVzc19zdGF0cyAmJgorCSAgICAocmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGFzc19kZXYtPmtvYmosICZ3aXJlbGVzc19ncm91cCkpKQorCQlnb3RvIG91dF9jbGVhbnVwOyAKKworCXJldHVybiAwOworb3V0X2NsZWFudXA6CisJaWYgKG5ldC0+Z2V0X3N0YXRzKQorCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsYXNzX2Rldi0+a29iaiwgJm5ldHN0YXRfZ3JvdXApOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorCitvdXRfdW5yZWc6CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHN5c2ZzIGF0dHJpYnV0ZSByZWdpc3RyYXRpb24gZmFpbGVkICVkXG4iLAorCSAgICAgICBuZXQtPm5hbWUsIHJldCk7CisJY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoY2xhc3NfZGV2KTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbmV0ZGV2X3N5c2ZzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gY2xhc3NfcmVnaXN0ZXIoJm5ldF9jbGFzcyk7Cit9CmRpZmYgLS1naXQgYS9uZXQvY29yZS9uZXRmaWx0ZXIuYyBiL25ldC9jb3JlL25ldGZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MWNmYTQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvY29yZS9uZXRmaWx0ZXIuYwpAQCAtMCwwICsxLDc5OSBAQAorLyogbmV0ZmlsdGVyLmM6IGxvb2sgYWZ0ZXIgdGhlIGZpbHRlcnMgZm9yIHZhcmlvdXMgcHJvdG9jb2xzLiAKKyAqIEhlYXZpbHkgaW5mbHVlbmNlZCBieSB0aGUgb2xkIGZpcmV3YWxsLmMgYnkgRGF2aWQgQm9ubiBhbmQgQWxhbiBDb3guCisgKgorICogVGhhbmtzIHRvIFJvYiBgQ21kclRhY28nIE1hbGRhIGZvciBub3QgaW5mbHVlbmNpbmcgdGhpcyBjb2RlIGluIGFueQorICogd2F5LgorICoKKyAqIFJ1c3R5IFJ1c3NlbGwgKEMpMjAwMCAtLSBUaGlzIGNvZGUgaXMgR1BMLgorICoKKyAqIEZlYnJ1YXJ5IDIwMDA6IE1vZGlmaWVkIGJ5IEphbWVzIE1vcnJpcyB0byBoYXZlIDEgcXVldWUgcGVyIHByb3RvY29sLgorICogMTUtTWFyLTIwMDA6ICAgQWRkZWQgTkZfUkVQRUFUIC0tUlIuCisgKiAwOC1NYXktMjAwMzoJICBJbnRlcm5hbCBsb2dnaW5nIGludGVyZmFjZSBhZGRlZCBieSBKb3pzZWYgS2FkbGVjc2lrLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorCisvKiBJbiB0aGlzIGNvZGUsIHdlIGNhbiBiZSB3YWl0aW5nIGluZGVmaW5pdGVseSBmb3IgdXNlcnNwYWNlIHRvCisgKiBzZXJ2aWNlIGEgcGFja2V0IGlmIGEgaG9vayByZXR1cm5zIE5GX1FVRVVFLiAgV2UgY291bGQga2VlcCBhIGNvdW50CisgKiBvZiBza2J1ZmZzIHF1ZXVlZCBmb3IgdXNlcnNwYWNlLCBhbmQgbm90IGRlcmVnaXN0ZXIgYSBob29rIHVubGVzcworICogdGhpcyBpcyB6ZXJvLCBidXQgdGhhdCBzdWNrcy4gIE5vdywgd2Ugc2ltcGx5IGNoZWNrIHdoZW4gdGhlCisgKiBwYWNrZXRzIGNvbWUgYmFjazogaWYgdGhlIGhvb2sgaXMgZ29uZSwgdGhlIHBhY2tldCBpcyBkaXNjYXJkZWQuICovCisjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRworI2RlZmluZSBORkRFQlVHKGZvcm1hdCwgYXJncy4uLikgIHByaW50ayhmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgTkZERUJVRyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworLyogU29ja29wdHMgb25seSByZWdpc3RlcmVkIGFuZCBjYWxsZWQgZnJvbSB1c2VyIGNvbnRleHQsIHNvCisgICBuZXQgbG9ja2luZyB3b3VsZCBiZSBvdmVya2lsbC4gIEFsc28sIFtnc11ldHNvY2tvcHQgY2FsbHMgbWF5CisgICBzbGVlcC4gKi8KK3N0YXRpYyBERUNMQVJFX01VVEVYKG5mX3NvY2tvcHRfbXV0ZXgpOworCitzdHJ1Y3QgbGlzdF9oZWFkIG5mX2hvb2tzW05QUk9UT11bTkZfTUFYX0hPT0tTXTsKK3N0YXRpYyBMSVNUX0hFQUQobmZfc29ja29wdHMpOworc3RhdGljIERFRklORV9TUElOTE9DSyhuZl9ob29rX2xvY2spOworCisvKiAKKyAqIEEgcXVldWUgaGFuZGxlciBtYXkgYmUgcmVnaXN0ZXJlZCBmb3IgZWFjaCBwcm90b2NvbC4gIEVhY2ggaXMgcHJvdGVjdGVkIGJ5CisgKiBsb25nIHRlcm0gbXV0ZXguICBUaGUgaGFuZGxlciBtdXN0IHByb3ZpZGUgYW4gYW4gb3V0Zm4oKSB0byBhY2NlcHQgcGFja2V0cworICogZm9yIHF1ZXVlaW5nIGFuZCBtdXN0IHJlaW5qZWN0IGFsbCBwYWNrZXRzIGl0IHJlY2VpdmVzLCBubyBtYXR0ZXIgd2hhdC4KKyAqLworc3RhdGljIHN0cnVjdCBuZl9xdWV1ZV9oYW5kbGVyX3QgeworCW5mX3F1ZXVlX291dGZuX3Qgb3V0Zm47CisJdm9pZCAqZGF0YTsKK30gcXVldWVfaGFuZGxlcltOUFJPVE9dOworc3RhdGljIERFRklORV9SV0xPQ0socXVldWVfaGFuZGxlcl9sb2NrKTsKKworaW50IG5mX3JlZ2lzdGVyX2hvb2soc3RydWN0IG5mX2hvb2tfb3BzICpyZWcpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqaTsKKworCXNwaW5fbG9ja19iaCgmbmZfaG9va19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKGksICZuZl9ob29rc1tyZWctPnBmXVtyZWctPmhvb2tudW1dKSB7CisJCWlmIChyZWctPnByaW9yaXR5IDwgKChzdHJ1Y3QgbmZfaG9va19vcHMgKilpKS0+cHJpb3JpdHkpCisJCQlicmVhazsKKwl9CisJbGlzdF9hZGRfcmN1KCZyZWctPmxpc3QsIGktPnByZXYpOworCXNwaW5fdW5sb2NrX2JoKCZuZl9ob29rX2xvY2spOworCisJc3luY2hyb25pemVfbmV0KCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbmZfdW5yZWdpc3Rlcl9ob29rKHN0cnVjdCBuZl9ob29rX29wcyAqcmVnKQoreworCXNwaW5fbG9ja19iaCgmbmZfaG9va19sb2NrKTsKKwlsaXN0X2RlbF9yY3UoJnJlZy0+bGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJm5mX2hvb2tfbG9jayk7CisKKwlzeW5jaHJvbml6ZV9uZXQoKTsKK30KKworLyogRG8gZXhjbHVzaXZlIHJhbmdlcyBvdmVybGFwPyAqLworc3RhdGljIGlubGluZSBpbnQgb3ZlcmxhcChpbnQgbWluMSwgaW50IG1heDEsIGludCBtaW4yLCBpbnQgbWF4MikKK3sKKwlyZXR1cm4gbWF4MSA+IG1pbjIgJiYgbWluMSA8IG1heDI7Cit9CisKKy8qIEZ1bmN0aW9ucyB0byByZWdpc3RlciBzb2Nrb3B0IHJhbmdlcyAoZXhjbHVzaXZlKS4gKi8KK2ludCBuZl9yZWdpc3Rlcl9zb2Nrb3B0KHN0cnVjdCBuZl9zb2Nrb3B0X29wcyAqcmVnKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmk7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZuZl9zb2Nrb3B0X211dGV4KSAhPSAwKQorCQlyZXR1cm4gLUVJTlRSOworCisJbGlzdF9mb3JfZWFjaChpLCAmbmZfc29ja29wdHMpIHsKKwkJc3RydWN0IG5mX3NvY2tvcHRfb3BzICpvcHMgPSAoc3RydWN0IG5mX3NvY2tvcHRfb3BzICopaTsKKwkJaWYgKG9wcy0+cGYgPT0gcmVnLT5wZgorCQkgICAgJiYgKG92ZXJsYXAob3BzLT5zZXRfb3B0bWluLCBvcHMtPnNldF9vcHRtYXgsIAorCQkJCXJlZy0+c2V0X29wdG1pbiwgcmVnLT5zZXRfb3B0bWF4KQorCQkJfHwgb3ZlcmxhcChvcHMtPmdldF9vcHRtaW4sIG9wcy0+Z2V0X29wdG1heCwgCisJCQkJICAgcmVnLT5nZXRfb3B0bWluLCByZWctPmdldF9vcHRtYXgpKSkgeworCQkJTkZERUJVRygibmZfc29jayBvdmVybGFwOiAldS0ldS8ldS0ldSB2ICV1LSV1LyV1LSV1XG4iLAorCQkJCW9wcy0+c2V0X29wdG1pbiwgb3BzLT5zZXRfb3B0bWF4LCAKKwkJCQlvcHMtPmdldF9vcHRtaW4sIG9wcy0+Z2V0X29wdG1heCwgCisJCQkJcmVnLT5zZXRfb3B0bWluLCByZWctPnNldF9vcHRtYXgsCisJCQkJcmVnLT5nZXRfb3B0bWluLCByZWctPmdldF9vcHRtYXgpOworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlsaXN0X2FkZCgmcmVnLT5saXN0LCAmbmZfc29ja29wdHMpOworb3V0OgorCXVwKCZuZl9zb2Nrb3B0X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG5mX3VucmVnaXN0ZXJfc29ja29wdChzdHJ1Y3QgbmZfc29ja29wdF9vcHMgKnJlZykKK3sKKwkvKiBObyBwb2ludCBiZWluZyBpbnRlcnJ1cHRpYmxlOiB3ZSdyZSBwcm9iYWJseSBpbiBjbGVhbnVwX21vZHVsZSgpICovCisgcmVzdGFydDoKKwlkb3duKCZuZl9zb2Nrb3B0X211dGV4KTsKKwlpZiAocmVnLT51c2UgIT0gMCkgeworCQkvKiBUbyBiZSB3b2tlbiBieSBuZl9zb2Nrb3B0IGNhbGwuLi4gKi8KKwkJLyogRklYTUU6IFN0dWFydCBZb3VuZydzIG5hbWUgYXBwZWFycyBncmF0dWl0b3VzbHkuICovCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJcmVnLT5jbGVhbnVwX3Rhc2sgPSBjdXJyZW50OworCQl1cCgmbmZfc29ja29wdF9tdXRleCk7CisJCXNjaGVkdWxlKCk7CisJCWdvdG8gcmVzdGFydDsKKwl9CisJbGlzdF9kZWwoJnJlZy0+bGlzdCk7CisJdXAoJm5mX3NvY2tvcHRfbXV0ZXgpOworfQorCisjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRworI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorCitzdGF0aWMgdm9pZCBkZWJ1Z19wcmludF9ob29rc19pcCh1bnNpZ25lZCBpbnQgbmZfZGVidWcpCit7CisJaWYgKG5mX2RlYnVnICYgKDEgPDwgTkZfSVBfUFJFX1JPVVRJTkcpKSB7CisJCXByaW50aygiUFJFX1JPVVRJTkcgIik7CisJCW5mX2RlYnVnIF49ICgxIDw8IE5GX0lQX1BSRV9ST1VUSU5HKTsKKwl9CisJaWYgKG5mX2RlYnVnICYgKDEgPDwgTkZfSVBfTE9DQUxfSU4pKSB7CisJCXByaW50aygiTE9DQUxfSU4gIik7CisJCW5mX2RlYnVnIF49ICgxIDw8IE5GX0lQX0xPQ0FMX0lOKTsKKwl9CisJaWYgKG5mX2RlYnVnICYgKDEgPDwgTkZfSVBfRk9SV0FSRCkpIHsKKwkJcHJpbnRrKCJGT1JXQVJEICIpOworCQluZl9kZWJ1ZyBePSAoMSA8PCBORl9JUF9GT1JXQVJEKTsKKwl9CisJaWYgKG5mX2RlYnVnICYgKDEgPDwgTkZfSVBfTE9DQUxfT1VUKSkgeworCQlwcmludGsoIkxPQ0FMX09VVCAiKTsKKwkJbmZfZGVidWcgXj0gKDEgPDwgTkZfSVBfTE9DQUxfT1VUKTsKKwl9CisJaWYgKG5mX2RlYnVnICYgKDEgPDwgTkZfSVBfUE9TVF9ST1VUSU5HKSkgeworCQlwcmludGsoIlBPU1RfUk9VVElORyAiKTsKKwkJbmZfZGVidWcgXj0gKDEgPDwgTkZfSVBfUE9TVF9ST1VUSU5HKTsKKwl9CisJaWYgKG5mX2RlYnVnKQorCQlwcmludGsoIkNyYXAgYml0czogMHglMDRYIiwgbmZfZGVidWcpOworCXByaW50aygiXG4iKTsKK30KKworc3RhdGljIHZvaWQgbmZfZHVtcF9za2IoaW50IHBmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXByaW50aygic2tiOiBwZj0laSAlcyBkZXY9JXMgbGVuPSV1XG4iLCAKKwkgICAgICAgcGYsCisJICAgICAgIHNrYi0+c2sgPyAiKG93bmVkKSIgOiAiKHVub3duZWQpIiwKKwkgICAgICAgc2tiLT5kZXYgPyBza2ItPmRldi0+bmFtZSA6ICIobm8gZGV2KSIsCisJICAgICAgIHNrYi0+bGVuKTsKKwlzd2l0Y2ggKHBmKSB7CisJY2FzZSBQRl9JTkVUOiB7CisJCWNvbnN0IHN0cnVjdCBpcGhkciAqaXAgPSBza2ItPm5oLmlwaDsKKwkJX191MzIgKm9wdCA9IChfX3UzMiAqKSAoaXAgKyAxKTsKKwkJaW50IG9wdGk7CisJCV9fdTE2IHNyY19wb3J0ID0gMCwgZHN0X3BvcnQgPSAwOworCisJCWlmIChpcC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1AKKwkJICAgIHx8IGlwLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkgeworCQkJc3RydWN0IHRjcGhkciAqdGNwPShzdHJ1Y3QgdGNwaGRyICopKChfX3UzMiAqKWlwK2lwLT5paGwpOworCQkJc3JjX3BvcnQgPSBudG9ocyh0Y3AtPnNvdXJjZSk7CisJCQlkc3RfcG9ydCA9IG50b2hzKHRjcC0+ZGVzdCk7CisJCX0KKwkKKwkJcHJpbnRrKCJQUk9UTz0lZCAldS4ldS4ldS4ldTolaHUgJXUuJXUuJXUuJXU6JWh1IgorCQkgICAgICAgIiBMPSVodSBTPTB4JTIuMmhYIEk9JWh1IEY9MHglNC40aFggVD0laHUiLAorCQkgICAgICAgaXAtPnByb3RvY29sLCBOSVBRVUFEKGlwLT5zYWRkciksCisJCSAgICAgICBzcmNfcG9ydCwgTklQUVVBRChpcC0+ZGFkZHIpLAorCQkgICAgICAgZHN0X3BvcnQsCisJCSAgICAgICBudG9ocyhpcC0+dG90X2xlbiksIGlwLT50b3MsIG50b2hzKGlwLT5pZCksCisJCSAgICAgICBudG9ocyhpcC0+ZnJhZ19vZmYpLCBpcC0+dHRsKTsKKworCQlmb3IgKG9wdGkgPSAwOyBvcHRpIDwgKGlwLT5paGwgLSBzaXplb2Yoc3RydWN0IGlwaGRyKSAvIDQpOyBvcHRpKyspCisJCQlwcmludGsoIiBPPTB4JTguOFgiLCAqb3B0KyspOworCQlwcmludGsoIlxuIik7CisJfQorCX0KK30KKwordm9pZCBuZl9kZWJ1Z19pcF9sb2NhbF9kZWxpdmVyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJLyogSWYgaXQncyBhIGxvb3BiYWNrIHBhY2tldCwgaXQgbXVzdCBoYXZlIGNvbWUgdGhyb3VnaAorCSAqIE5GX0lQX0xPQ0FMX09VVCwgTkZfSVBfUkFXX0lOUFVULCBORl9JUF9QUkVfUk9VVElORyBhbmQKKwkgKiBORl9JUF9MT0NBTF9JTi4gIE90aGVyd2lzZSwgbXVzdCBoYXZlIGdvbmUgdGhyb3VnaAorCSAqIE5GX0lQX1JBV19JTlBVVCBhbmQgTkZfSVBfUFJFX1JPVVRJTkcuICAqLworCWlmICghc2tiLT5kZXYpIHsKKwkJcHJpbnRrKCJpcF9sb2NhbF9kZWxpdmVyOiBza2ItPmRldiBpcyBOVUxMLlxuIik7CisJfQorCWVsc2UgaWYgKHN0cmNtcChza2ItPmRldi0+bmFtZSwgImxvIikgPT0gMCkgeworCQlpZiAoc2tiLT5uZl9kZWJ1ZyAhPSAoKDEgPDwgTkZfSVBfTE9DQUxfT1VUKQorCQkJCSAgICAgIHwgKDEgPDwgTkZfSVBfUE9TVF9ST1VUSU5HKQorCQkJCSAgICAgIHwgKDEgPDwgTkZfSVBfUFJFX1JPVVRJTkcpCisJCQkJICAgICAgfCAoMSA8PCBORl9JUF9MT0NBTF9JTikpKSB7CisJCQlwcmludGsoImlwX2xvY2FsX2RlbGl2ZXI6IGJhZCBsb29wYmFjayBza2I6ICIpOworCQkJZGVidWdfcHJpbnRfaG9va3NfaXAoc2tiLT5uZl9kZWJ1Zyk7CisJCQluZl9kdW1wX3NrYihQRl9JTkVULCBza2IpOworCQl9CisJfQorCWVsc2UgeworCQlpZiAoc2tiLT5uZl9kZWJ1ZyAhPSAoKDE8PE5GX0lQX1BSRV9ST1VUSU5HKQorCQkJCSAgICAgIHwgKDE8PE5GX0lQX0xPQ0FMX0lOKSkpIHsKKwkJCXByaW50aygiaXBfbG9jYWxfZGVsaXZlcjogYmFkIG5vbi1sbyBza2I6ICIpOworCQkJZGVidWdfcHJpbnRfaG9va3NfaXAoc2tiLT5uZl9kZWJ1Zyk7CisJCQluZl9kdW1wX3NrYihQRl9JTkVULCBza2IpOworCQl9CisJfQorfQorCit2b2lkIG5mX2RlYnVnX2lwX2xvb3BiYWNrX3htaXQoc3RydWN0IHNrX2J1ZmYgKm5ld3NrYikKK3sKKwlpZiAobmV3c2tiLT5uZl9kZWJ1ZyAhPSAoKDEgPDwgTkZfSVBfTE9DQUxfT1VUKQorCQkJCSB8ICgxIDw8IE5GX0lQX1BPU1RfUk9VVElORykpKSB7CisJCXByaW50aygiaXBfZGV2X2xvb3BiYWNrX3htaXQ6IGJhZCBvd25lZCBza2IgPSAlcDogIiwgCisJCSAgICAgICBuZXdza2IpOworCQlkZWJ1Z19wcmludF9ob29rc19pcChuZXdza2ItPm5mX2RlYnVnKTsKKwkJbmZfZHVtcF9za2IoUEZfSU5FVCwgbmV3c2tiKTsKKwl9CisJLyogQ2xlYXIgdG8gYXZvaWQgY29uZnVzaW5nIGlucHV0IGNoZWNrICovCisJbmV3c2tiLT5uZl9kZWJ1ZyA9IDA7Cit9CisKK3ZvaWQgbmZfZGVidWdfaXBfZmluaXNoX291dHB1dDIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKiBJZiBpdCdzIG93bmVkLCBpdCBtdXN0IGhhdmUgZ29uZSB0aHJvdWdoIHRoZQorCSAqIE5GX0lQX0xPQ0FMX09VVCBhbmQgTkZfSVBfUE9TVF9ST1VUSU5HLgorCSAqIE90aGVyd2lzZSwgbXVzdCBoYXZlIGdvbmUgdGhyb3VnaAorCSAqIE5GX0lQX1BSRV9ST1VUSU5HLCBORl9JUF9GT1JXQVJEIGFuZCBORl9JUF9QT1NUX1JPVVRJTkcuCisJICovCisJaWYgKHNrYi0+c2spIHsKKwkJaWYgKHNrYi0+bmZfZGVidWcgIT0gKCgxIDw8IE5GX0lQX0xPQ0FMX09VVCkKKwkJCQkgICAgICB8ICgxIDw8IE5GX0lQX1BPU1RfUk9VVElORykpKSB7CisJCQlwcmludGsoImlwX2ZpbmlzaF9vdXRwdXQ6IGJhZCBvd25lZCBza2IgPSAlcDogIiwgc2tiKTsKKwkJCWRlYnVnX3ByaW50X2hvb2tzX2lwKHNrYi0+bmZfZGVidWcpOworCQkJbmZfZHVtcF9za2IoUEZfSU5FVCwgc2tiKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChza2ItPm5mX2RlYnVnICE9ICgoMSA8PCBORl9JUF9QUkVfUk9VVElORykKKwkJCQkgICAgICB8ICgxIDw8IE5GX0lQX0ZPUldBUkQpCisJCQkJICAgICAgfCAoMSA8PCBORl9JUF9QT1NUX1JPVVRJTkcpKSkgeworCQkJLyogRnJhZ21lbnRzLCBlbnR1bm5lbGxlZCBwYWNrZXRzLCBUQ1AgUlNUcworICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkIGJ5IGlwdF9SRUpFQ1Qgd2lsbCBoYXZlIG5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcnMsIGJ1dCBzdGlsbCBtYXkgYmUgbG9jYWwgKi8KKwkJCWlmIChza2ItPm5mX2RlYnVnICE9ICgoMSA8PCBORl9JUF9MT0NBTF9PVVQpCisJCQkJCSAgICAgIHwgKDEgPDwgTkZfSVBfUE9TVF9ST1VUSU5HKSkpeworCQkJCXByaW50aygiaXBfZmluaXNoX291dHB1dDoiCisJCQkJICAgICAgICIgYmFkIHVub3duZWQgc2tiID0gJXA6ICIsc2tiKTsKKwkJCQlkZWJ1Z19wcmludF9ob29rc19pcChza2ItPm5mX2RlYnVnKTsKKwkJCQluZl9kdW1wX3NrYihQRl9JTkVULCBza2IpOworCQkJfQorCQl9CisJfQorfQorI2VuZGlmIC8qQ09ORklHX05FVEZJTFRFUl9ERUJVRyovCisKKy8qIENhbGwgZ2V0L3NldHNvY2tvcHQoKSAqLworc3RhdGljIGludCBuZl9zb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IHBmLCBpbnQgdmFsLCAKKwkJICAgICAgY2hhciBfX3VzZXIgKm9wdCwgaW50ICpsZW4sIGludCBnZXQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqaTsKKwlzdHJ1Y3QgbmZfc29ja29wdF9vcHMgKm9wczsKKwlpbnQgcmV0OworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmbmZfc29ja29wdF9tdXRleCkgIT0gMCkKKwkJcmV0dXJuIC1FSU5UUjsKKworCWxpc3RfZm9yX2VhY2goaSwgJm5mX3NvY2tvcHRzKSB7CisJCW9wcyA9IChzdHJ1Y3QgbmZfc29ja29wdF9vcHMgKilpOworCQlpZiAob3BzLT5wZiA9PSBwZikgeworCQkJaWYgKGdldCkgeworCQkJCWlmICh2YWwgPj0gb3BzLT5nZXRfb3B0bWluCisJCQkJICAgICYmIHZhbCA8IG9wcy0+Z2V0X29wdG1heCkgeworCQkJCQlvcHMtPnVzZSsrOworCQkJCQl1cCgmbmZfc29ja29wdF9tdXRleCk7CisJCQkJCXJldCA9IG9wcy0+Z2V0KHNrLCB2YWwsIG9wdCwgbGVuKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAodmFsID49IG9wcy0+c2V0X29wdG1pbgorCQkJCSAgICAmJiB2YWwgPCBvcHMtPnNldF9vcHRtYXgpIHsKKwkJCQkJb3BzLT51c2UrKzsKKwkJCQkJdXAoJm5mX3NvY2tvcHRfbXV0ZXgpOworCQkJCQlyZXQgPSBvcHMtPnNldChzaywgdmFsLCBvcHQsICpsZW4pOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJdXAoJm5mX3NvY2tvcHRfbXV0ZXgpOworCXJldHVybiAtRU5PUFJPVE9PUFQ7CisJCisgb3V0OgorCWRvd24oJm5mX3NvY2tvcHRfbXV0ZXgpOworCW9wcy0+dXNlLS07CisJaWYgKG9wcy0+Y2xlYW51cF90YXNrKQorCQl3YWtlX3VwX3Byb2Nlc3Mob3BzLT5jbGVhbnVwX3Rhc2spOworCXVwKCZuZl9zb2Nrb3B0X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbmZfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBwZiwgaW50IHZhbCwgY2hhciBfX3VzZXIgKm9wdCwKKwkJICBpbnQgbGVuKQoreworCXJldHVybiBuZl9zb2Nrb3B0KHNrLCBwZiwgdmFsLCBvcHQsICZsZW4sIDApOworfQorCitpbnQgbmZfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBwZiwgaW50IHZhbCwgY2hhciBfX3VzZXIgKm9wdCwgaW50ICpsZW4pCit7CisJcmV0dXJuIG5mX3NvY2tvcHQoc2ssIHBmLCB2YWwsIG9wdCwgbGVuLCAxKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBuZl9pdGVyYXRlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKipza2IsCisJCQkgICAgICAgaW50IGhvb2ssCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluZGV2LAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXRkZXYsCisJCQkgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqKmksCisJCQkgICAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKiksCisJCQkgICAgICAgaW50IGhvb2tfdGhyZXNoKQoreworCXVuc2lnbmVkIGludCB2ZXJkaWN0OworCisJLyoKKwkgKiBUaGUgY2FsbGVyIG11c3Qgbm90IGJsb2NrIGJldHdlZW4gY2FsbHMgdG8gdGhpcworCSAqIGZ1bmN0aW9uIGJlY2F1c2Ugb2YgcmlzayBvZiBjb250aW51aW5nIGZyb20gZGVsZXRlZCBlbGVtZW50LgorCSAqLworCWxpc3RfZm9yX2VhY2hfY29udGludWVfcmN1KCppLCBoZWFkKSB7CisJCXN0cnVjdCBuZl9ob29rX29wcyAqZWxlbSA9IChzdHJ1Y3QgbmZfaG9va19vcHMgKikqaTsKKworCQlpZiAoaG9va190aHJlc2ggPiBlbGVtLT5wcmlvcml0eSkKKwkJCWNvbnRpbnVlOworCisJCS8qIE9wdGltaXphdGlvbjogd2UgZG9uJ3QgbmVlZCB0byBob2xkIG1vZHVsZQorICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSBoZXJlLCBzaW5jZSBmdW5jdGlvbiBjYW4ndCBzbGVlcC4gLS1SUiAqLworCQl2ZXJkaWN0ID0gZWxlbS0+aG9vayhob29rLCBza2IsIGluZGV2LCBvdXRkZXYsIG9rZm4pOworCQlpZiAodmVyZGljdCAhPSBORl9BQ0NFUFQpIHsKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCisJCQlpZiAodW5saWtlbHkodmVyZGljdCA+IE5GX01BWF9WRVJESUNUKSkgeworCQkJCU5GREVCVUcoIkV2aWwgcmV0dXJuIGZyb20gJXAoJXUpLlxuIiwKKwkJCQkgICAgICAgIGVsZW0tPmhvb2ssIGhvb2spOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmCisJCQlpZiAodmVyZGljdCAhPSBORl9SRVBFQVQpCisJCQkJcmV0dXJuIHZlcmRpY3Q7CisJCQkqaSA9ICgqaSktPnByZXY7CisJCX0KKwl9CisJcmV0dXJuIE5GX0FDQ0VQVDsKK30KKworaW50IG5mX3JlZ2lzdGVyX3F1ZXVlX2hhbmRsZXIoaW50IHBmLCBuZl9xdWV1ZV9vdXRmbl90IG91dGZuLCB2b2lkICpkYXRhKQoreyAgICAgIAorCWludCByZXQ7CisKKwl3cml0ZV9sb2NrX2JoKCZxdWV1ZV9oYW5kbGVyX2xvY2spOworCWlmIChxdWV1ZV9oYW5kbGVyW3BmXS5vdXRmbikKKwkJcmV0ID0gLUVCVVNZOworCWVsc2UgeworCQlxdWV1ZV9oYW5kbGVyW3BmXS5vdXRmbiA9IG91dGZuOworCQlxdWV1ZV9oYW5kbGVyW3BmXS5kYXRhID0gZGF0YTsKKwkJcmV0ID0gMDsKKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZxdWV1ZV9oYW5kbGVyX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyogVGhlIGNhbGxlciBtdXN0IGZsdXNoIHRoZWlyIHF1ZXVlIGJlZm9yZSB0aGlzICovCitpbnQgbmZfdW5yZWdpc3Rlcl9xdWV1ZV9oYW5kbGVyKGludCBwZikKK3sKKwl3cml0ZV9sb2NrX2JoKCZxdWV1ZV9oYW5kbGVyX2xvY2spOworCXF1ZXVlX2hhbmRsZXJbcGZdLm91dGZuID0gTlVMTDsKKwlxdWV1ZV9oYW5kbGVyW3BmXS5kYXRhID0gTlVMTDsKKwl3cml0ZV91bmxvY2tfYmgoJnF1ZXVlX2hhbmRsZXJfbG9jayk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIAorICogQW55IHBhY2tldCB0aGF0IGxlYXZlcyB2aWEgdGhpcyBmdW5jdGlvbiBtdXN0IGNvbWUgYmFjayAKKyAqIHRocm91Z2ggbmZfcmVpbmplY3QoKS4KKyAqLworc3RhdGljIGludCBuZl9xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAKKwkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKmVsZW0sIAorCQkgICAgaW50IHBmLCB1bnNpZ25lZCBpbnQgaG9vaywKKwkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICppbmRldiwKKwkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpvdXRkZXYsCisJCSAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBuZl9pbmZvICppbmZvOworI2lmZGVmIENPTkZJR19CUklER0VfTkVURklMVEVSCisJc3RydWN0IG5ldF9kZXZpY2UgKnBoeXNpbmRldiA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKnBoeXNvdXRkZXYgPSBOVUxMOworI2VuZGlmCisKKwkvKiBRVUVVRSA9PSBEUk9QIGlmIG5vb25lIGlzIHdhaXRpbmcsIHRvIGJlIHNhZmUuICovCisJcmVhZF9sb2NrKCZxdWV1ZV9oYW5kbGVyX2xvY2spOworCWlmICghcXVldWVfaGFuZGxlcltwZl0ub3V0Zm4pIHsKKwkJcmVhZF91bmxvY2soJnF1ZXVlX2hhbmRsZXJfbG9jayk7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWluZm8pIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX0VSUiAiT09NIHF1ZXVlaW5nIHBhY2tldCAlcFxuIiwKKwkJCSAgICAgICBza2IpOworCQlyZWFkX3VubG9jaygmcXVldWVfaGFuZGxlcl9sb2NrKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAxOworCX0KKworCSppbmZvID0gKHN0cnVjdCBuZl9pbmZvKSB7IAorCQkoc3RydWN0IG5mX2hvb2tfb3BzICopZWxlbSwgcGYsIGhvb2ssIGluZGV2LCBvdXRkZXYsIG9rZm4gfTsKKworCS8qIElmIGl0J3MgZ29pbmcgYXdheSwgaWdub3JlIGhvb2suICovCisJaWYgKCF0cnlfbW9kdWxlX2dldChpbmZvLT5lbGVtLT5vd25lcikpIHsKKwkJcmVhZF91bmxvY2soJnF1ZXVlX2hhbmRsZXJfbG9jayk7CisJCWtmcmVlKGluZm8pOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBCdW1wIGRldiByZWZzIHNvIHRoZXkgZG9uJ3QgdmFuaXNoIHdoaWxlIHBhY2tldCBpcyBvdXQgKi8KKwlpZiAoaW5kZXYpIGRldl9ob2xkKGluZGV2KTsKKwlpZiAob3V0ZGV2KSBkZXZfaG9sZChvdXRkZXYpOworCisjaWZkZWYgQ09ORklHX0JSSURHRV9ORVRGSUxURVIKKwlpZiAoc2tiLT5uZl9icmlkZ2UpIHsKKwkJcGh5c2luZGV2ID0gc2tiLT5uZl9icmlkZ2UtPnBoeXNpbmRldjsKKwkJaWYgKHBoeXNpbmRldikgZGV2X2hvbGQocGh5c2luZGV2KTsKKwkJcGh5c291dGRldiA9IHNrYi0+bmZfYnJpZGdlLT5waHlzb3V0ZGV2OworCQlpZiAocGh5c291dGRldikgZGV2X2hvbGQocGh5c291dGRldik7CisJfQorI2VuZGlmCisKKwlzdGF0dXMgPSBxdWV1ZV9oYW5kbGVyW3BmXS5vdXRmbihza2IsIGluZm8sIHF1ZXVlX2hhbmRsZXJbcGZdLmRhdGEpOworCXJlYWRfdW5sb2NrKCZxdWV1ZV9oYW5kbGVyX2xvY2spOworCisJaWYgKHN0YXR1cyA8IDApIHsKKwkJLyogSmFtZXMgTSBkb2Vzbid0IHNheSBmdWNrIGVub3VnaC4gKi8KKwkJaWYgKGluZGV2KSBkZXZfcHV0KGluZGV2KTsKKwkJaWYgKG91dGRldikgZGV2X3B1dChvdXRkZXYpOworI2lmZGVmIENPTkZJR19CUklER0VfTkVURklMVEVSCisJCWlmIChwaHlzaW5kZXYpIGRldl9wdXQocGh5c2luZGV2KTsKKwkJaWYgKHBoeXNvdXRkZXYpIGRldl9wdXQocGh5c291dGRldik7CisjZW5kaWYKKwkJbW9kdWxlX3B1dChpbmZvLT5lbGVtLT5vd25lcik7CisJCWtmcmVlKGluZm8pOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAxOworfQorCisvKiBSZXR1cm5zIDEgaWYgb2tmbigpIG5lZWRzIHRvIGJlIGV4ZWN1dGVkIGJ5IHRoZSBjYWxsZXIsCisgKiAtRVBFUk0gZm9yIE5GX0RST1AsIDAgb3RoZXJ3aXNlLiAqLworaW50IG5mX2hvb2tfc2xvdyhpbnQgcGYsIHVuc2lnbmVkIGludCBob29rLCBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCSBzdHJ1Y3QgbmV0X2RldmljZSAqaW5kZXYsCisJCSBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0ZGV2LAorCQkgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKiksCisJCSBpbnQgaG9va190aHJlc2gpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZWxlbTsKKwl1bnNpZ25lZCBpbnQgdmVyZGljdDsKKwlpbnQgcmV0ID0gMDsKKworCS8qIFdlIG1heSBhbHJlYWR5IGhhdmUgdGhpcywgYnV0IHJlYWQtbG9ja3MgbmVzdCBhbnl3YXkgKi8KKwlyY3VfcmVhZF9sb2NrKCk7CisKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCisJaWYgKHVubGlrZWx5KCgqcHNrYiktPm5mX2RlYnVnICYgKDEgPDwgaG9vaykpKSB7CisJCXByaW50aygibmZfaG9vazogaG9vayAlaSBhbHJlYWR5IHNldC5cbiIsIGhvb2spOworCQluZl9kdW1wX3NrYihwZiwgKnBza2IpOworCX0KKwkoKnBza2IpLT5uZl9kZWJ1ZyB8PSAoMSA8PCBob29rKTsKKyNlbmRpZgorCisJZWxlbSA9ICZuZl9ob29rc1twZl1baG9va107CituZXh0X2hvb2s6CisJdmVyZGljdCA9IG5mX2l0ZXJhdGUoJm5mX2hvb2tzW3BmXVtob29rXSwgcHNrYiwgaG9vaywgaW5kZXYsCisJCQkgICAgIG91dGRldiwgJmVsZW0sIG9rZm4sIGhvb2tfdGhyZXNoKTsKKwlpZiAodmVyZGljdCA9PSBORl9BQ0NFUFQgfHwgdmVyZGljdCA9PSBORl9TVE9QKSB7CisJCXJldCA9IDE7CisJCWdvdG8gdW5sb2NrOworCX0gZWxzZSBpZiAodmVyZGljdCA9PSBORl9EUk9QKSB7CisJCWtmcmVlX3NrYigqcHNrYik7CisJCXJldCA9IC1FUEVSTTsKKwl9IGVsc2UgaWYgKHZlcmRpY3QgPT0gTkZfUVVFVUUpIHsKKwkJTkZERUJVRygibmZfaG9vazogVmVyZGljdCA9IFFVRVVFLlxuIik7CisJCWlmICghbmZfcXVldWUoKnBza2IsIGVsZW0sIHBmLCBob29rLCBpbmRldiwgb3V0ZGV2LCBva2ZuKSkKKwkJCWdvdG8gbmV4dF9ob29rOworCX0KK3VubG9jazoKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG5mX3JlaW5qZWN0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZl9pbmZvICppbmZvLAorCQkgdW5zaWduZWQgaW50IHZlcmRpY3QpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZWxlbSA9ICZpbmZvLT5lbGVtLT5saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgKmk7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwkvKiBSZWxlYXNlIHRob3NlIGRldmljZXMgd2UgaGVsZCwgb3IgQWxleGV5IHdpbGwga2lsbCBtZS4gKi8KKwlpZiAoaW5mby0+aW5kZXYpIGRldl9wdXQoaW5mby0+aW5kZXYpOworCWlmIChpbmZvLT5vdXRkZXYpIGRldl9wdXQoaW5mby0+b3V0ZGV2KTsKKyNpZmRlZiBDT05GSUdfQlJJREdFX05FVEZJTFRFUgorCWlmIChza2ItPm5mX2JyaWRnZSkgeworCQlpZiAoc2tiLT5uZl9icmlkZ2UtPnBoeXNpbmRldikKKwkJCWRldl9wdXQoc2tiLT5uZl9icmlkZ2UtPnBoeXNpbmRldik7CisJCWlmIChza2ItPm5mX2JyaWRnZS0+cGh5c291dGRldikKKwkJCWRldl9wdXQoc2tiLT5uZl9icmlkZ2UtPnBoeXNvdXRkZXYpOworCX0KKyNlbmRpZgorCisJLyogRHJvcCByZWZlcmVuY2UgdG8gb3duZXIgb2YgaG9vayB3aGljaCBxdWV1ZWQgdXMuICovCisJbW9kdWxlX3B1dChpbmZvLT5lbGVtLT5vd25lcik7CisKKwlsaXN0X2Zvcl9lYWNoX3JjdShpLCAmbmZfaG9va3NbaW5mby0+cGZdW2luZm8tPmhvb2tdKSB7CisJCWlmIChpID09IGVsZW0pIAorICAJCQlicmVhazsKKyAgCX0KKyAgCisJaWYgKGVsZW0gPT0gJm5mX2hvb2tzW2luZm8tPnBmXVtpbmZvLT5ob29rXSkgeworCQkvKiBUaGUgbW9kdWxlIHdoaWNoIHNlbnQgaXQgdG8gdXNlcnNwYWNlIGlzIGdvbmUuICovCisJCU5GREVCVUcoIiVzOiBtb2R1bGUgZGlzYXBwZWFyZWQsIGRyb3BwaW5nIHBhY2tldC5cbiIsCisJCQlfX0ZVTkNUSU9OX18pOworCQl2ZXJkaWN0ID0gTkZfRFJPUDsKKwl9CisKKwkvKiBDb250aW51ZSB0cmF2ZXJzYWwgaWZmIHVzZXJzcGFjZSBzYWlkIG9rLi4uICovCisJaWYgKHZlcmRpY3QgPT0gTkZfUkVQRUFUKSB7CisJCWVsZW0gPSBlbGVtLT5wcmV2OworCQl2ZXJkaWN0ID0gTkZfQUNDRVBUOworCX0KKworCWlmICh2ZXJkaWN0ID09IE5GX0FDQ0VQVCkgeworCW5leHRfaG9vazoKKwkJdmVyZGljdCA9IG5mX2l0ZXJhdGUoJm5mX2hvb2tzW2luZm8tPnBmXVtpbmZvLT5ob29rXSwKKwkJCQkgICAgICZza2IsIGluZm8tPmhvb2ssIAorCQkJCSAgICAgaW5mby0+aW5kZXYsIGluZm8tPm91dGRldiwgJmVsZW0sCisJCQkJICAgICBpbmZvLT5va2ZuLCBJTlRfTUlOKTsKKwl9CisKKwlzd2l0Y2ggKHZlcmRpY3QpIHsKKwljYXNlIE5GX0FDQ0VQVDoKKwkJaW5mby0+b2tmbihza2IpOworCQlicmVhazsKKworCWNhc2UgTkZfUVVFVUU6CisJCWlmICghbmZfcXVldWUoc2tiLCBlbGVtLCBpbmZvLT5wZiwgaW5mby0+aG9vaywgCisJCQkgICAgICBpbmZvLT5pbmRldiwgaW5mby0+b3V0ZGV2LCBpbmZvLT5va2ZuKSkKKwkJCWdvdG8gbmV4dF9ob29rOworCQlicmVhazsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlpZiAodmVyZGljdCA9PSBORl9EUk9QKQorCQlrZnJlZV9za2Ioc2tiKTsKKworCWtmcmVlKGluZm8pOworCXJldHVybjsKK30KKworI2lmZGVmIENPTkZJR19JTkVUCisvKiByb3V0ZV9tZV9oYXJkZXIgZnVuY3Rpb24sIHVzZWQgYnkgaXB0YWJsZV9uYXQsIGlwdGFibGVfbWFuZ2xlICsgaXBfcXVldWUgKi8KK2ludCBpcF9yb3V0ZV9tZV9oYXJkZXIoc3RydWN0IHNrX2J1ZmYgKipwc2tiKQoreworCXN0cnVjdCBpcGhkciAqaXBoID0gKCpwc2tiKS0+bmguaXBoOworCXN0cnVjdCBydGFibGUgKnJ0OworCXN0cnVjdCBmbG93aSBmbCA9IHt9OworCXN0cnVjdCBkc3RfZW50cnkgKm9kc3Q7CisJdW5zaWduZWQgaW50IGhoX2xlbjsKKworCS8qIHNvbWUgbm9uLXN0YW5kYXJkIGhhY2tzIGxpa2UgaXB0X1JFSkVDVC5jOnNlbmRfcmVzZXQoKSBjYW4gY2F1c2UKKwkgKiBwYWNrZXRzIHdpdGggZm9yZWlnbiBzYWRkciB0byBhcHBlYXIgb24gdGhlIE5GX0lQX0xPQ0FMX09VVCBob29rLgorCSAqLworCWlmIChpbmV0X2FkZHJfdHlwZShpcGgtPnNhZGRyKSA9PSBSVE5fTE9DQUwpIHsKKwkJZmwubmxfdS5pcDRfdS5kYWRkciA9IGlwaC0+ZGFkZHI7CisJCWZsLm5sX3UuaXA0X3Uuc2FkZHIgPSBpcGgtPnNhZGRyOworCQlmbC5ubF91LmlwNF91LnRvcyA9IFJUX1RPUyhpcGgtPnRvcyk7CisJCWZsLm9pZiA9ICgqcHNrYiktPnNrID8gKCpwc2tiKS0+c2stPnNrX2JvdW5kX2Rldl9pZiA6IDA7CisjaWZkZWYgQ09ORklHX0lQX1JPVVRFX0ZXTUFSSworCQlmbC5ubF91LmlwNF91LmZ3bWFyayA9ICgqcHNrYiktPm5mbWFyazsKKyNlbmRpZgorCQlmbC5wcm90byA9IGlwaC0+cHJvdG9jb2w7CisJCWlmIChpcF9yb3V0ZV9vdXRwdXRfa2V5KCZydCwgJmZsKSAhPSAwKQorCQkJcmV0dXJuIC0xOworCisJCS8qIERyb3Agb2xkIHJvdXRlLiAqLworCQlkc3RfcmVsZWFzZSgoKnBza2IpLT5kc3QpOworCQkoKnBza2IpLT5kc3QgPSAmcnQtPnUuZHN0OworCX0gZWxzZSB7CisJCS8qIG5vbi1sb2NhbCBzcmMsIGZpbmQgdmFsaWQgaWlmIHRvIHNhdGlzZnkKKwkJICogcnAtZmlsdGVyIHdoZW4gY2FsbGluZyBpcF9yb3V0ZV9pbnB1dC4gKi8KKwkJZmwubmxfdS5pcDRfdS5kYWRkciA9IGlwaC0+c2FkZHI7CisJCWlmIChpcF9yb3V0ZV9vdXRwdXRfa2V5KCZydCwgJmZsKSAhPSAwKQorCQkJcmV0dXJuIC0xOworCisJCW9kc3QgPSAoKnBza2IpLT5kc3Q7CisJCWlmIChpcF9yb3V0ZV9pbnB1dCgqcHNrYiwgaXBoLT5kYWRkciwgaXBoLT5zYWRkciwKKwkJCQkgICBSVF9UT1MoaXBoLT50b3MpLCBydC0+dS5kc3QuZGV2KSAhPSAwKSB7CisJCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwkJZHN0X3JlbGVhc2Uob2RzdCk7CisJfQorCQorCWlmICgoKnBza2IpLT5kc3QtPmVycm9yKQorCQlyZXR1cm4gLTE7CisKKwkvKiBDaGFuZ2UgaW4gb2lmIG1heSBtZWFuIGNoYW5nZSBpbiBoaF9sZW4uICovCisJaGhfbGVuID0gKCpwc2tiKS0+ZHN0LT5kZXYtPmhhcmRfaGVhZGVyX2xlbjsKKwlpZiAoc2tiX2hlYWRyb29tKCpwc2tiKSA8IGhoX2xlbikgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKKworCQluc2tiID0gc2tiX3JlYWxsb2NfaGVhZHJvb20oKnBza2IsIGhoX2xlbik7CisJCWlmICghbnNrYikgCisJCQlyZXR1cm4gLTE7CisJCWlmICgoKnBza2IpLT5zaykKKwkJCXNrYl9zZXRfb3duZXJfdyhuc2tiLCAoKnBza2IpLT5zayk7CisJCWtmcmVlX3NrYigqcHNrYik7CisJCSpwc2tiID0gbnNrYjsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaXBfcm91dGVfbWVfaGFyZGVyKTsKKworaW50IHNrYl9pcF9tYWtlX3dyaXRhYmxlKHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgaW50IHdyaXRhYmxlX2xlbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKKworCWlmICh3cml0YWJsZV9sZW4gPiAoKnBza2IpLT5sZW4pCisJCXJldHVybiAwOworCisJLyogTm90IGV4Y2x1c2l2ZSB1c2Ugb2YgcGFja2V0PyAgTXVzdCBjb3B5LiAqLworCWlmIChza2Jfc2hhcmVkKCpwc2tiKSB8fCBza2JfY2xvbmVkKCpwc2tiKSkKKwkJZ290byBjb3B5X3NrYjsKKworCXJldHVybiBwc2tiX21heV9wdWxsKCpwc2tiLCB3cml0YWJsZV9sZW4pOworCitjb3B5X3NrYjoKKwluc2tiID0gc2tiX2NvcHkoKnBza2IsIEdGUF9BVE9NSUMpOworCWlmICghbnNrYikKKwkJcmV0dXJuIDA7CisJQlVHX09OKHNrYl9pc19ub25saW5lYXIobnNrYikpOworCisJLyogUmVzdCBvZiBrZXJuZWwgd2lsbCBnZXQgdmVyeSB1bmhhcHB5IGlmIHdlIHBhc3MgaXQgYQorCSAgIHN1ZGRlbmx5LW9ycGhhbmVkIHNrYnVmZiAqLworCWlmICgoKnBza2IpLT5zaykKKwkJc2tiX3NldF9vd25lcl93KG5za2IsICgqcHNrYiktPnNrKTsKKwlrZnJlZV9za2IoKnBza2IpOworCSpwc2tiID0gbnNrYjsKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0woc2tiX2lwX21ha2Vfd3JpdGFibGUpOworI2VuZGlmIC8qQ09ORklHX0lORVQqLworCisvKiBJbnRlcm5hbCBsb2dnaW5nIGludGVyZmFjZSwgd2hpY2ggcmVsaWVzIG9uIHRoZSByZWFsIAorICAgTE9HIHRhcmdldCBtb2R1bGVzICovCisKKyNkZWZpbmUgTkZfTE9HX1BSRUZJWExFTgkJMTI4CisKK3N0YXRpYyBuZl9sb2dmbiAqbmZfbG9nZ2luZ1tOUFJPVE9dOyAvKiA9IE5VTEwgKi8KK3N0YXRpYyBpbnQgcmVwb3J0ZWQgPSAwOworc3RhdGljIERFRklORV9TUElOTE9DSyhuZl9sb2dfbG9jayk7CisKK2ludCBuZl9sb2dfcmVnaXN0ZXIoaW50IHBmLCBuZl9sb2dmbiAqbG9nZm4pCit7CisJaW50IHJldCA9IC1FQlVTWTsKKworCS8qIEFueSBzZXR1cCBvZiBsb2dnaW5nIG1lbWJlcnMgbXVzdCBiZSBkb25lIGJlZm9yZQorCSAqIHN1YnN0aXR1dGluZyBwb2ludGVyLiAqLworCXNwaW5fbG9jaygmbmZfbG9nX2xvY2spOworCWlmICghbmZfbG9nZ2luZ1twZl0pIHsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKG5mX2xvZ2dpbmdbcGZdLCBsb2dmbik7CisJCXJldCA9IDA7CisJfQorCXNwaW5fdW5sb2NrKCZuZl9sb2dfbG9jayk7CisJcmV0dXJuIHJldDsKK30JCQorCit2b2lkIG5mX2xvZ191bnJlZ2lzdGVyKGludCBwZiwgbmZfbG9nZm4gKmxvZ2ZuKQoreworCXNwaW5fbG9jaygmbmZfbG9nX2xvY2spOworCWlmIChuZl9sb2dnaW5nW3BmXSA9PSBsb2dmbikKKwkJbmZfbG9nZ2luZ1twZl0gPSBOVUxMOworCXNwaW5fdW5sb2NrKCZuZl9sb2dfbG9jayk7CisKKwkvKiBHaXZlIHRpbWUgdG8gY29uY3VycmVudCByZWFkZXJzLiAqLworCXN5bmNocm9uaXplX25ldCgpOworfQkJCisKK3ZvaWQgbmZfbG9nX3BhY2tldChpbnQgcGYsCisJCSAgIHVuc2lnbmVkIGludCBob29rbnVtLAorCQkgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCSAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwljaGFyIHByZWZpeFtORl9MT0dfUFJFRklYTEVOXTsKKwluZl9sb2dmbiAqbG9nZm47CisJCisJcmN1X3JlYWRfbG9jaygpOworCWxvZ2ZuID0gcmN1X2RlcmVmZXJlbmNlKG5mX2xvZ2dpbmdbcGZdKTsKKwlpZiAobG9nZm4pIHsKKwkJdmFfc3RhcnQoYXJncywgZm10KTsKKwkJdnNucHJpbnRmKHByZWZpeCwgc2l6ZW9mKHByZWZpeCksIGZtdCwgYXJncyk7CisJCXZhX2VuZChhcmdzKTsKKwkJLyogV2UgbXVzdCByZWFkIGxvZ2dpbmcgYmVmb3JlIG5mX2xvZ2ZuW3BmXSAqLworCQlsb2dmbihob29rbnVtLCBza2IsIGluLCBvdXQsIHByZWZpeCk7CisJfSBlbHNlIGlmICghcmVwb3J0ZWQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibmZfbG9nX3BhY2tldDogY2FuXCd0IGxvZyB5ZXQsICIKKwkJICAgICAgICJubyBiYWNrZW5kIGxvZ2dpbmcgbW9kdWxlIGxvYWRlZCBpbiFcbiIpOworCQlyZXBvcnRlZCsrOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKK30KK0VYUE9SVF9TWU1CT0wobmZfbG9nX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0wobmZfbG9nX3VucmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChuZl9sb2dfcGFja2V0KTsKKworLyogVGhpcyBkb2VzIG5vdCBiZWxvbmcgaGVyZSwgYnV0IGxvY2FsbHkgZ2VuZXJhdGVkIGVycm9ycyBuZWVkIGl0IGlmIGNvbm5lY3Rpb24KKyAgIHRyYWNraW5nIGluIHVzZTogd2l0aG91dCB0aGlzLCBjb25uZWN0aW9uIG1heSBub3QgYmUgaW4gaGFzaCB0YWJsZSwgYW5kIGhlbmNlCisgICBtYW51ZmFjdHVyZWQgSUNNUCBvciBSU1QgcGFja2V0cyB3aWxsIG5vdCBiZSBhc3NvY2lhdGVkIHdpdGggaXQuICovCit2b2lkICgqaXBfY3RfYXR0YWNoKShzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKKwordm9pZCBuZl9jdF9hdHRhY2goc3RydWN0IHNrX2J1ZmYgKm5ldywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl2b2lkICgqYXR0YWNoKShzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKKworCWlmIChza2ItPm5mY3QgJiYgKGF0dGFjaCA9IGlwX2N0X2F0dGFjaCkgIT0gTlVMTCkgeworCQltYigpOyAvKiBKdXN0IHRvIGJlIHN1cmU6IG11c3QgYmUgcmVhZCBiZWZvcmUgZXhlY3V0aW5nIHRoaXMgKi8KKwkJYXR0YWNoKG5ldywgc2tiKTsKKwl9Cit9CisKK3ZvaWQgX19pbml0IG5ldGZpbHRlcl9pbml0KHZvaWQpCit7CisJaW50IGksIGg7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlBST1RPOyBpKyspIHsKKwkJZm9yIChoID0gMDsgaCA8IE5GX01BWF9IT09LUzsgaCsrKQorCQkJSU5JVF9MSVNUX0hFQUQoJm5mX2hvb2tzW2ldW2hdKTsKKwl9Cit9CisKK0VYUE9SVF9TWU1CT0woaXBfY3RfYXR0YWNoKTsKK0VYUE9SVF9TWU1CT0wobmZfY3RfYXR0YWNoKTsKK0VYUE9SVF9TWU1CT0wobmZfZ2V0c29ja29wdCk7CitFWFBPUlRfU1lNQk9MKG5mX2hvb2tfc2xvdyk7CitFWFBPUlRfU1lNQk9MKG5mX2hvb2tzKTsKK0VYUE9SVF9TWU1CT0wobmZfcmVnaXN0ZXJfaG9vayk7CitFWFBPUlRfU1lNQk9MKG5mX3JlZ2lzdGVyX3F1ZXVlX2hhbmRsZXIpOworRVhQT1JUX1NZTUJPTChuZl9yZWdpc3Rlcl9zb2Nrb3B0KTsKK0VYUE9SVF9TWU1CT0wobmZfcmVpbmplY3QpOworRVhQT1JUX1NZTUJPTChuZl9zZXRzb2Nrb3B0KTsKK0VYUE9SVF9TWU1CT0wobmZfdW5yZWdpc3Rlcl9ob29rKTsKK0VYUE9SVF9TWU1CT0wobmZfdW5yZWdpc3Rlcl9xdWV1ZV9oYW5kbGVyKTsKK0VYUE9SVF9TWU1CT0wobmZfdW5yZWdpc3Rlcl9zb2Nrb3B0KTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldHBvbGwuYyBiL25ldC9jb3JlL25ldHBvbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTE5Njk2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2NvcmUvbmV0cG9sbC5jCkBAIC0wLDAgKzEsNzM1IEBACisvKgorICogQ29tbW9uIGZyYW1ld29yayBmb3IgbG93LWxldmVsIG5ldHdvcmsgY29uc29sZSwgZHVtcCwgYW5kIGRlYnVnZ2VyIGNvZGUKKyAqCisgKiBTZXAgOCAyMDAzICBNYXR0IE1hY2thbGwgPG1wbUBzZWxlbmljLmNvbT4KKyAqCisgKiBiYXNlZCBvbiB0aGUgbmV0Y29uc29sZSBjb2RlIGZyb206CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxICBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwMiAgUmVkIEhhdCwgSW5jLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRwb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPG5ldC91ZHAuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKy8qCisgKiBXZSBtYWludGFpbiBhIHNtYWxsIHBvb2wgb2YgZnVsbHktc2l6ZWQgc2ticywgdG8gbWFrZSBzdXJlIHRoZQorICogbWVzc2FnZSBnZXRzIG91dCBldmVuIGluIGV4dHJlbWUgT09NIHNpdHVhdGlvbnMuCisgKi8KKworI2RlZmluZSBNQVhfVURQX0NIVU5LIDE0NjAKKyNkZWZpbmUgTUFYX1NLQlMgMzIKKyNkZWZpbmUgTUFYX1FVRVVFX0RFUFRIIChNQVhfU0tCUyAvIDIpCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2tiX2xpc3RfbG9jayk7CitzdGF0aWMgaW50IG5yX3NrYnM7CitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnNrYnM7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socXVldWVfbG9jayk7CitzdGF0aWMgaW50IHF1ZXVlX2RlcHRoOworc3RhdGljIHN0cnVjdCBza19idWZmICpxdWV1ZV9oZWFkLCAqcXVldWVfdGFpbDsKKworc3RhdGljIGF0b21pY190IHRyYXBwZWQ7CisKKyNkZWZpbmUgTkVUUE9MTF9SWF9FTkFCTEVEICAxCisjZGVmaW5lIE5FVFBPTExfUlhfRFJPUCAgICAgMgorCisjZGVmaW5lIE1BWF9TS0JfU0laRSBcCisJCShNQVhfVURQX0NIVU5LICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpICsgXAorCQkJCXNpemVvZihzdHJ1Y3QgaXBoZHIpICsgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKQorCitzdGF0aWMgdm9pZCB6YXBfY29tcGxldGlvbl9xdWV1ZSh2b2lkKTsKKworc3RhdGljIHZvaWQgcXVldWVfcHJvY2Vzcyh2b2lkICpwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXdoaWxlIChxdWV1ZV9oZWFkKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZV9sb2NrLCBmbGFncyk7CisKKwkJc2tiID0gcXVldWVfaGVhZDsKKwkJcXVldWVfaGVhZCA9IHNrYi0+bmV4dDsKKwkJaWYgKHNrYiA9PSBxdWV1ZV90YWlsKQorCQkJcXVldWVfaGVhZCA9IE5VTEw7CisKKwkJcXVldWVfZGVwdGgtLTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZV9sb2NrLCBmbGFncyk7CisKKwkJZGV2X3F1ZXVlX3htaXQoc2tiKTsKKwl9Cit9CisKK3N0YXRpYyBERUNMQVJFX1dPUksoc2VuZF9xdWV1ZSwgcXVldWVfcHJvY2VzcywgTlVMTCk7CisKK3ZvaWQgbmV0cG9sbF9xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocXVldWVfZGVwdGggPT0gTUFYX1FVRVVFX0RFUFRIKSB7CisJCV9fa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWVfbG9jaywgZmxhZ3MpOworCWlmICghcXVldWVfaGVhZCkKKwkJcXVldWVfaGVhZCA9IHNrYjsKKwllbHNlCisJCXF1ZXVlX3RhaWwtPm5leHQgPSBza2I7CisJcXVldWVfdGFpbCA9IHNrYjsKKwlxdWV1ZV9kZXB0aCsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCXNjaGVkdWxlX3dvcmsoJnNlbmRfcXVldWUpOworfQorCitzdGF0aWMgaW50IGNoZWNrc3VtX3VkcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdWRwaGRyICp1aCwKKwkJCSAgICAgdW5zaWduZWQgc2hvcnQgdWxlbiwgdTMyIHNhZGRyLCB1MzIgZGFkZHIpCit7CisJaWYgKHVoLT5jaGVjayA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykKKwkJcmV0dXJuIGNzdW1fdGNwdWRwX21hZ2ljKAorCQkJc2FkZHIsIGRhZGRyLCB1bGVuLCBJUFBST1RPX1VEUCwgc2tiLT5jc3VtKTsKKworCXNrYi0+Y3N1bSA9IGNzdW1fdGNwdWRwX25vZm9sZChzYWRkciwgZGFkZHIsIHVsZW4sIElQUFJPVE9fVURQLCAwKTsKKworCXJldHVybiBjc3VtX2ZvbGQoc2tiX2NoZWNrc3VtKHNrYiwgMCwgc2tiLT5sZW4sIHNrYi0+Y3N1bSkpOworfQorCisvKgorICogQ2hlY2sgd2hldGhlciBkZWxheWVkIHByb2Nlc3Npbmcgd2FzIHNjaGVkdWxlZCBmb3Igb3VyIE5JQy4gSWYgc28sCisgKiB3ZSBhdHRlbXB0IHRvIGdyYWIgdGhlIHBvbGwgbG9jayBhbmQgdXNlIC0+cG9sbCgpIHRvIHB1bXAgdGhlIGNhcmQuCisgKiBJZiB0aGlzIGZhaWxzLCBlaXRoZXIgd2UndmUgcmVjdXJzZWQgaW4gLT5wb2xsKCkgb3IgaXQncyBhbHJlYWR5CisgKiBydW5uaW5nIG9uIGFub3RoZXIgQ1BVLgorICoKKyAqIE5vdGU6IHdlIGRvbid0IG1hc2sgaW50ZXJydXB0cyB3aXRoIHRoaXMgbG9jayBiZWNhdXNlIHdlJ3JlIHVzaW5nCisgKiB0cnlsb2NrIGhlcmUgYW5kIGludGVycnVwdHMgYXJlIGFscmVhZHkgZGlzYWJsZWQgaW4gdGhlIHNvZnRpcnEKKyAqIGNhc2UuIEZ1cnRoZXIsIHdlIHRlc3QgdGhlIHBvbGxfb3duZXIgdG8gYXZvaWQgcmVjdXJzaW9uIG9uIFVQCisgKiBzeXN0ZW1zIHdoZXJlIHRoZSBsb2NrIGRvZXNuJ3QgZXhpc3QuCisgKgorICogSW4gY2FzZXMgd2hlcmUgdGhlcmUgaXMgYmktZGlyZWN0aW9uYWwgY29tbXVuaWNhdGlvbnMsIHJlYWRpbmcgb25seQorICogb25lIG1lc3NhZ2UgYXQgYSB0aW1lIGNhbiBsZWFkIHRvIHBhY2tldHMgYmVpbmcgZHJvcHBlZCBieSB0aGUKKyAqIG5ldHdvcmsgYWRhcHRlciwgZm9yY2luZyBzdXBlcmZsdW91cyByZXRyaWVzIGFuZCBwb3NzaWJseSB0aW1lb3V0cy4KKyAqIFRodXMsIHdlIHNldCBvdXIgYnVkZ2V0IHRvIGdyZWF0ZXIgdGhhbiAxLgorICovCitzdGF0aWMgdm9pZCBwb2xsX25hcGkoc3RydWN0IG5ldHBvbGwgKm5wKQoreworCWludCBidWRnZXQgPSAxNjsKKworCWlmICh0ZXN0X2JpdChfX0xJTktfU1RBVEVfUlhfU0NIRUQsICZucC0+ZGV2LT5zdGF0ZSkgJiYKKwkgICAgbnAtPnBvbGxfb3duZXIgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpICYmCisJICAgIHNwaW5fdHJ5bG9jaygmbnAtPnBvbGxfbG9jaykpIHsKKwkJbnAtPnJ4X2ZsYWdzIHw9IE5FVFBPTExfUlhfRFJPUDsKKwkJYXRvbWljX2luYygmdHJhcHBlZCk7CisKKwkJbnAtPmRldi0+cG9sbChucC0+ZGV2LCAmYnVkZ2V0KTsKKworCQlhdG9taWNfZGVjKCZ0cmFwcGVkKTsKKwkJbnAtPnJ4X2ZsYWdzICY9IH5ORVRQT0xMX1JYX0RST1A7CisJCXNwaW5fdW5sb2NrKCZucC0+cG9sbF9sb2NrKTsKKwl9Cit9CisKK3ZvaWQgbmV0cG9sbF9wb2xsKHN0cnVjdCBuZXRwb2xsICpucCkKK3sKKwlpZighbnAtPmRldiB8fCAhbmV0aWZfcnVubmluZyhucC0+ZGV2KSB8fCAhbnAtPmRldi0+cG9sbF9jb250cm9sbGVyKQorCQlyZXR1cm47CisKKwkvKiBQcm9jZXNzIHBlbmRpbmcgd29yayBvbiBOSUMgKi8KKwlucC0+ZGV2LT5wb2xsX2NvbnRyb2xsZXIobnAtPmRldik7CisJaWYgKG5wLT5kZXYtPnBvbGwpCisJCXBvbGxfbmFwaShucCk7CisKKwl6YXBfY29tcGxldGlvbl9xdWV1ZSgpOworfQorCitzdGF0aWMgdm9pZCByZWZpbGxfc2ticyh2b2lkKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZza2JfbGlzdF9sb2NrLCBmbGFncyk7CisJd2hpbGUgKG5yX3NrYnMgPCBNQVhfU0tCUykgeworCQlza2IgPSBhbGxvY19za2IoTUFYX1NLQl9TSVpFLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFza2IpCisJCQlicmVhazsKKworCQlza2ItPm5leHQgPSBza2JzOworCQlza2JzID0gc2tiOworCQlucl9za2JzKys7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNrYl9saXN0X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgemFwX2NvbXBsZXRpb25fcXVldWUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzb2Z0bmV0X2RhdGEgKnNkID0gJmdldF9jcHVfdmFyKHNvZnRuZXRfZGF0YSk7CisKKwlpZiAoc2QtPmNvbXBsZXRpb25fcXVldWUpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKmNsaXN0OworCisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJY2xpc3QgPSBzZC0+Y29tcGxldGlvbl9xdWV1ZTsKKwkJc2QtPmNvbXBsZXRpb25fcXVldWUgPSBOVUxMOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwkJd2hpbGUgKGNsaXN0ICE9IE5VTEwpIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSBjbGlzdDsKKwkJCWNsaXN0ID0gY2xpc3QtPm5leHQ7CisJCQlpZihza2ItPmRlc3RydWN0b3IpCisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsgLyogcHV0IHRoaXMgb25lIGJhY2sgKi8KKwkJCWVsc2UKKwkJCQlfX2tmcmVlX3NrYihza2IpOworCQl9CisJfQorCisJcHV0X2NwdV92YXIoc29mdG5ldF9kYXRhKTsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICogZmluZF9za2Ioc3RydWN0IG5ldHBvbGwgKm5wLCBpbnQgbGVuLCBpbnQgcmVzZXJ2ZSkKK3sKKwlpbnQgb25jZSA9IDEsIGNvdW50ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCisJemFwX2NvbXBsZXRpb25fcXVldWUoKTsKK3JlcGVhdDoKKwlpZiAobnJfc2ticyA8IE1BWF9TS0JTKQorCQlyZWZpbGxfc2ticygpOworCisJc2tiID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0FUT01JQyk7CisKKwlpZiAoIXNrYikgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2tiX2xpc3RfbG9jaywgZmxhZ3MpOworCQlza2IgPSBza2JzOworCQlpZiAoc2tiKSB7CisJCQlza2JzID0gc2tiLT5uZXh0OworCQkJc2tiLT5uZXh0ID0gTlVMTDsKKwkJCW5yX3NrYnMtLTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZza2JfbGlzdF9sb2NrLCBmbGFncyk7CisJfQorCisJaWYoIXNrYikgeworCQljb3VudCsrOworCQlpZiAob25jZSAmJiAoY291bnQgPT0gMTAwMDAwMCkpIHsKKwkJCXByaW50aygib3V0IG9mIG5ldHBvbGwgc2ticyFcbiIpOworCQkJb25jZSA9IDA7CisJCX0KKwkJbmV0cG9sbF9wb2xsKG5wKTsKKwkJZ290byByZXBlYXQ7CisJfQorCisJYXRvbWljX3NldCgmc2tiLT51c2VycywgMSk7CisJc2tiX3Jlc2VydmUoc2tiLCByZXNlcnZlKTsKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgdm9pZCBuZXRwb2xsX3NlbmRfc2tiKHN0cnVjdCBuZXRwb2xsICpucCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgc3RhdHVzOworCityZXBlYXQ6CisJaWYoIW5wIHx8ICFucC0+ZGV2IHx8ICFuZXRpZl9ydW5uaW5nKG5wLT5kZXYpKSB7CisJCV9fa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisKKwkvKiBhdm9pZCByZWN1cnNpb24gKi8KKwlpZihucC0+cG9sbF9vd25lciA9PSBzbXBfcHJvY2Vzc29yX2lkKCkgfHwKKwkgICBucC0+ZGV2LT54bWl0X2xvY2tfb3duZXIgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKSB7CisJCWlmIChucC0+ZHJvcCkKKwkJCW5wLT5kcm9wKHNrYik7CisJCWVsc2UKKwkJCV9fa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2soJm5wLT5kZXYtPnhtaXRfbG9jayk7CisJbnAtPmRldi0+eG1pdF9sb2NrX293bmVyID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJLyoKKwkgKiBuZXR3b3JrIGRyaXZlcnMgZG8gbm90IGV4cGVjdCB0byBiZSBjYWxsZWQgaWYgdGhlIHF1ZXVlIGlzCisJICogc3RvcHBlZC4KKwkgKi8KKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChucC0+ZGV2KSkgeworCQlucC0+ZGV2LT54bWl0X2xvY2tfb3duZXIgPSAtMTsKKwkJc3Bpbl91bmxvY2soJm5wLT5kZXYtPnhtaXRfbG9jayk7CisKKwkJbmV0cG9sbF9wb2xsKG5wKTsKKwkJZ290byByZXBlYXQ7CisJfQorCisJc3RhdHVzID0gbnAtPmRldi0+aGFyZF9zdGFydF94bWl0KHNrYiwgbnAtPmRldik7CisJbnAtPmRldi0+eG1pdF9sb2NrX293bmVyID0gLTE7CisJc3Bpbl91bmxvY2soJm5wLT5kZXYtPnhtaXRfbG9jayk7CisKKwkvKiB0cmFuc21pdCBidXN5ICovCisJaWYoc3RhdHVzKSB7CisJCW5ldHBvbGxfcG9sbChucCk7CisJCWdvdG8gcmVwZWF0OworCX0KK30KKwordm9pZCBuZXRwb2xsX3NlbmRfdWRwKHN0cnVjdCBuZXRwb2xsICpucCwgY29uc3QgY2hhciAqbXNnLCBpbnQgbGVuKQoreworCWludCB0b3RhbF9sZW4sIGV0aF9sZW4sIGlwX2xlbiwgdWRwX2xlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCB1ZHBoZHIgKnVkcGg7CisJc3RydWN0IGlwaGRyICppcGg7CisJc3RydWN0IGV0aGhkciAqZXRoOworCisJdWRwX2xlbiA9IGxlbiArIHNpemVvZigqdWRwaCk7CisJaXBfbGVuID0gZXRoX2xlbiA9IHVkcF9sZW4gKyBzaXplb2YoKmlwaCk7CisJdG90YWxfbGVuID0gZXRoX2xlbiArIEVUSF9ITEVOICsgTkVUX0lQX0FMSUdOOworCisJc2tiID0gZmluZF9za2IobnAsIHRvdGFsX2xlbiwgdG90YWxfbGVuIC0gbGVuKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuOworCisJbWVtY3B5KHNrYi0+ZGF0YSwgbXNnLCBsZW4pOworCXNrYi0+bGVuICs9IGxlbjsKKworCXVkcGggPSAoc3RydWN0IHVkcGhkciAqKSBza2JfcHVzaChza2IsIHNpemVvZigqdWRwaCkpOworCXVkcGgtPnNvdXJjZSA9IGh0b25zKG5wLT5sb2NhbF9wb3J0KTsKKwl1ZHBoLT5kZXN0ID0gaHRvbnMobnAtPnJlbW90ZV9wb3J0KTsKKwl1ZHBoLT5sZW4gPSBodG9ucyh1ZHBfbGVuKTsKKwl1ZHBoLT5jaGVjayA9IDA7CisKKwlpcGggPSAoc3RydWN0IGlwaGRyICopc2tiX3B1c2goc2tiLCBzaXplb2YoKmlwaCkpOworCisJLyogaXBoLT52ZXJzaW9uID0gNDsgaXBoLT5paGwgPSA1OyAqLworCXB1dF91bmFsaWduZWQoMHg0NSwgKHVuc2lnbmVkIGNoYXIgKilpcGgpOworCWlwaC0+dG9zICAgICAgPSAwOworCXB1dF91bmFsaWduZWQoaHRvbnMoaXBfbGVuKSwgJihpcGgtPnRvdF9sZW4pKTsKKwlpcGgtPmlkICAgICAgID0gMDsKKwlpcGgtPmZyYWdfb2ZmID0gMDsKKwlpcGgtPnR0bCAgICAgID0gNjQ7CisJaXBoLT5wcm90b2NvbCA9IElQUFJPVE9fVURQOworCWlwaC0+Y2hlY2sgICAgPSAwOworCXB1dF91bmFsaWduZWQoaHRvbmwobnAtPmxvY2FsX2lwKSwgJihpcGgtPnNhZGRyKSk7CisJcHV0X3VuYWxpZ25lZChodG9ubChucC0+cmVtb3RlX2lwKSwgJihpcGgtPmRhZGRyKSk7CisJaXBoLT5jaGVjayAgICA9IGlwX2Zhc3RfY3N1bSgodW5zaWduZWQgY2hhciAqKWlwaCwgaXBoLT5paGwpOworCisJZXRoID0gKHN0cnVjdCBldGhoZHIgKikgc2tiX3B1c2goc2tiLCBFVEhfSExFTik7CisKKwlldGgtPmhfcHJvdG8gPSBodG9ucyhFVEhfUF9JUCk7CisJbWVtY3B5KGV0aC0+aF9zb3VyY2UsIG5wLT5sb2NhbF9tYWMsIDYpOworCW1lbWNweShldGgtPmhfZGVzdCwgbnAtPnJlbW90ZV9tYWMsIDYpOworCisJc2tiLT5kZXYgPSBucC0+ZGV2OworCisJbmV0cG9sbF9zZW5kX3NrYihucCwgc2tiKTsKK30KKworc3RhdGljIHZvaWQgYXJwX3JlcGx5KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGFycGhkciAqYXJwOworCXVuc2lnbmVkIGNoYXIgKmFycF9wdHI7CisJaW50IHNpemUsIHR5cGUgPSBBUlBPUF9SRVBMWSwgcHR5cGUgPSBFVEhfUF9BUlA7CisJdTMyIHNpcCwgdGlwOworCXN0cnVjdCBza19idWZmICpzZW5kX3NrYjsKKwlzdHJ1Y3QgbmV0cG9sbCAqbnAgPSBza2ItPmRldi0+bnA7CisKKwlpZiAoIW5wKSByZXR1cm47CisKKwkvKiBObyBhcnAgb24gdGhpcyBpbnRlcmZhY2UgKi8KKwlpZiAoc2tiLT5kZXYtPmZsYWdzICYgSUZGX05PQVJQKQorCQlyZXR1cm47CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCAoc2l6ZW9mKHN0cnVjdCBhcnBoZHIpICsKKwkJCQkgKDIgKiBza2ItPmRldi0+YWRkcl9sZW4pICsKKwkJCQkgKDIgKiBzaXplb2YodTMyKSkpKSkKKwkJcmV0dXJuOworCisJc2tiLT5oLnJhdyA9IHNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCWFycCA9IHNrYi0+bmguYXJwaDsKKworCWlmICgoYXJwLT5hcl9ocmQgIT0gaHRvbnMoQVJQSFJEX0VUSEVSKSAmJgorCSAgICAgYXJwLT5hcl9ocmQgIT0gaHRvbnMoQVJQSFJEX0lFRUU4MDIpKSB8fAorCSAgICBhcnAtPmFyX3BybyAhPSBodG9ucyhFVEhfUF9JUCkgfHwKKwkgICAgYXJwLT5hcl9vcCAhPSBodG9ucyhBUlBPUF9SRVFVRVNUKSkKKwkJcmV0dXJuOworCisJYXJwX3B0ciA9ICh1bnNpZ25lZCBjaGFyICopKGFycCsxKSArIHNrYi0+ZGV2LT5hZGRyX2xlbjsKKwltZW1jcHkoJnNpcCwgYXJwX3B0ciwgNCk7CisJYXJwX3B0ciArPSA0ICsgc2tiLT5kZXYtPmFkZHJfbGVuOworCW1lbWNweSgmdGlwLCBhcnBfcHRyLCA0KTsKKworCS8qIFNob3VsZCB3ZSBpZ25vcmUgYXJwPyAqLworCWlmICh0aXAgIT0gaHRvbmwobnAtPmxvY2FsX2lwKSB8fCBMT09QQkFDSyh0aXApIHx8IE1VTFRJQ0FTVCh0aXApKQorCQlyZXR1cm47CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBhcnBoZHIpICsgMiAqIChza2ItPmRldi0+YWRkcl9sZW4gKyA0KTsKKwlzZW5kX3NrYiA9IGZpbmRfc2tiKG5wLCBzaXplICsgTExfUkVTRVJWRURfU1BBQ0UobnAtPmRldiksCisJCQkgICAgTExfUkVTRVJWRURfU1BBQ0UobnAtPmRldikpOworCisJaWYgKCFzZW5kX3NrYikKKwkJcmV0dXJuOworCisJc2VuZF9za2ItPm5oLnJhdyA9IHNlbmRfc2tiLT5kYXRhOworCWFycCA9IChzdHJ1Y3QgYXJwaGRyICopIHNrYl9wdXQoc2VuZF9za2IsIHNpemUpOworCXNlbmRfc2tiLT5kZXYgPSBza2ItPmRldjsKKwlzZW5kX3NrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9BUlApOworCisJLyogRmlsbCB0aGUgZGV2aWNlIGhlYWRlciBmb3IgdGhlIEFSUCBmcmFtZSAqLworCisJaWYgKG5wLT5kZXYtPmhhcmRfaGVhZGVyICYmCisJICAgIG5wLT5kZXYtPmhhcmRfaGVhZGVyKHNlbmRfc2tiLCBza2ItPmRldiwgcHR5cGUsCisJCQkJICAgICAgIG5wLT5yZW1vdGVfbWFjLCBucC0+bG9jYWxfbWFjLAorCQkJCSAgICAgICBzZW5kX3NrYi0+bGVuKSA8IDApIHsKKwkJa2ZyZWVfc2tiKHNlbmRfc2tiKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogRmlsbCBvdXQgdGhlIGFycCBwcm90b2NvbCBwYXJ0LgorCSAqCisJICogd2Ugb25seSBzdXBwb3J0IGV0aGVybmV0IGRldmljZSB0eXBlLAorCSAqIHdoaWNoIChhY2NvcmRpbmcgdG8gUkZDIDEzOTApIHNob3VsZCBhbHdheXMgZXF1YWwgMSAoRXRoZXJuZXQpLgorCSAqLworCisJYXJwLT5hcl9ocmQgPSBodG9ucyhucC0+ZGV2LT50eXBlKTsKKwlhcnAtPmFyX3BybyA9IGh0b25zKEVUSF9QX0lQKTsKKwlhcnAtPmFyX2hsbiA9IG5wLT5kZXYtPmFkZHJfbGVuOworCWFycC0+YXJfcGxuID0gNDsKKwlhcnAtPmFyX29wID0gaHRvbnModHlwZSk7CisKKwlhcnBfcHRyPSh1bnNpZ25lZCBjaGFyICopKGFycCArIDEpOworCW1lbWNweShhcnBfcHRyLCBucC0+ZGV2LT5kZXZfYWRkciwgbnAtPmRldi0+YWRkcl9sZW4pOworCWFycF9wdHIgKz0gbnAtPmRldi0+YWRkcl9sZW47CisJbWVtY3B5KGFycF9wdHIsICZ0aXAsIDQpOworCWFycF9wdHIgKz0gNDsKKwltZW1jcHkoYXJwX3B0ciwgbnAtPnJlbW90ZV9tYWMsIG5wLT5kZXYtPmFkZHJfbGVuKTsKKwlhcnBfcHRyICs9IG5wLT5kZXYtPmFkZHJfbGVuOworCW1lbWNweShhcnBfcHRyLCAmc2lwLCA0KTsKKworCW5ldHBvbGxfc2VuZF9za2IobnAsIHNlbmRfc2tiKTsKK30KKworaW50IF9fbmV0cG9sbF9yeChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBwcm90bywgbGVuLCB1bGVuOworCXN0cnVjdCBpcGhkciAqaXBoOworCXN0cnVjdCB1ZHBoZHIgKnVoOworCXN0cnVjdCBuZXRwb2xsICpucCA9IHNrYi0+ZGV2LT5ucDsKKworCWlmICghbnAtPnJ4X2hvb2spCisJCWdvdG8gb3V0OworCWlmIChza2ItPmRldi0+dHlwZSAhPSBBUlBIUkRfRVRIRVIpCisJCWdvdG8gb3V0OworCisJLyogY2hlY2sgaWYgbmV0cG9sbCBjbGllbnRzIG5lZWQgQVJQICovCisJaWYgKHNrYi0+cHJvdG9jb2wgPT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9BUlApICYmCisJICAgIGF0b21pY19yZWFkKCZ0cmFwcGVkKSkgeworCQlhcnBfcmVwbHkoc2tiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcHJvdG8gPSBudG9ocyhldGhfaGRyKHNrYiktPmhfcHJvdG8pOworCWlmIChwcm90byAhPSBFVEhfUF9JUCkKKwkJZ290byBvdXQ7CisJaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09USEVSSE9TVCkKKwkJZ290byBvdXQ7CisJaWYgKHNrYl9zaGFyZWQoc2tiKSkKKwkJZ290byBvdXQ7CisKKwlpcGggPSAoc3RydWN0IGlwaGRyICopc2tiLT5kYXRhOworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKSkKKwkJZ290byBvdXQ7CisJaWYgKGlwaC0+aWhsIDwgNSB8fCBpcGgtPnZlcnNpb24gIT0gNCkKKwkJZ290byBvdXQ7CisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgaXBoLT5paGwqNCkpCisJCWdvdG8gb3V0OworCWlmIChpcF9mYXN0X2NzdW0oKHU4ICopaXBoLCBpcGgtPmlobCkgIT0gMCkKKwkJZ290byBvdXQ7CisKKwlsZW4gPSBudG9ocyhpcGgtPnRvdF9sZW4pOworCWlmIChza2ItPmxlbiA8IGxlbiB8fCBsZW4gPCBpcGgtPmlobCo0KQorCQlnb3RvIG91dDsKKworCWlmIChpcGgtPnByb3RvY29sICE9IElQUFJPVE9fVURQKQorCQlnb3RvIG91dDsKKworCWxlbiAtPSBpcGgtPmlobCo0OworCXVoID0gKHN0cnVjdCB1ZHBoZHIgKikoKChjaGFyICopaXBoKSArIGlwaC0+aWhsKjQpOworCXVsZW4gPSBudG9ocyh1aC0+bGVuKTsKKworCWlmICh1bGVuICE9IGxlbikKKwkJZ290byBvdXQ7CisJaWYgKGNoZWNrc3VtX3VkcChza2IsIHVoLCB1bGVuLCBpcGgtPnNhZGRyLCBpcGgtPmRhZGRyKSA8IDApCisJCWdvdG8gb3V0OworCWlmIChucC0+bG9jYWxfaXAgJiYgbnAtPmxvY2FsX2lwICE9IG50b2hsKGlwaC0+ZGFkZHIpKQorCQlnb3RvIG91dDsKKwlpZiAobnAtPnJlbW90ZV9pcCAmJiBucC0+cmVtb3RlX2lwICE9IG50b2hsKGlwaC0+c2FkZHIpKQorCQlnb3RvIG91dDsKKwlpZiAobnAtPmxvY2FsX3BvcnQgJiYgbnAtPmxvY2FsX3BvcnQgIT0gbnRvaHModWgtPmRlc3QpKQorCQlnb3RvIG91dDsKKworCW5wLT5yeF9ob29rKG5wLCBudG9ocyh1aC0+c291cmNlKSwKKwkJICAgIChjaGFyICopKHVoKzEpLAorCQkgICAgdWxlbiAtIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7CisKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMTsKKworb3V0OgorCWlmIChhdG9taWNfcmVhZCgmdHJhcHBlZCkpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgbmV0cG9sbF9wYXJzZV9vcHRpb25zKHN0cnVjdCBuZXRwb2xsICpucCwgY2hhciAqb3B0KQoreworCWNoYXIgKmN1cj1vcHQsICpkZWxpbTsKKworCWlmKCpjdXIgIT0gJ0AnKSB7CisJCWlmICgoZGVsaW0gPSBzdHJjaHIoY3VyLCAnQCcpKSA9PSBOVUxMKQorCQkJZ290byBwYXJzZV9mYWlsZWQ7CisJCSpkZWxpbT0wOworCQlucC0+bG9jYWxfcG9ydD1zaW1wbGVfc3RydG9sKGN1ciwgTlVMTCwgMTApOworCQljdXI9ZGVsaW07CisJfQorCWN1cisrOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBsb2NhbCBwb3J0ICVkXG4iLCBucC0+bmFtZSwgbnAtPmxvY2FsX3BvcnQpOworCisJaWYoKmN1ciAhPSAnLycpIHsKKwkJaWYgKChkZWxpbSA9IHN0cmNocihjdXIsICcvJykpID09IE5VTEwpCisJCQlnb3RvIHBhcnNlX2ZhaWxlZDsKKwkJKmRlbGltPTA7CisJCW5wLT5sb2NhbF9pcD1udG9obChpbl9hdG9uKGN1cikpOworCQljdXI9ZGVsaW07CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxvY2FsIElQICVkLiVkLiVkLiVkXG4iLAorCQkgICAgICAgbnAtPm5hbWUsIEhJUFFVQUQobnAtPmxvY2FsX2lwKSk7CisJfQorCWN1cisrOworCisJaWYgKCAqY3VyICE9ICcsJykgeworCQkvKiBwYXJzZSBvdXQgZGV2IG5hbWUgKi8KKwkJaWYgKChkZWxpbSA9IHN0cmNocihjdXIsICcsJykpID09IE5VTEwpCisJCQlnb3RvIHBhcnNlX2ZhaWxlZDsKKwkJKmRlbGltPTA7CisJCXN0cmxjcHkobnAtPmRldl9uYW1lLCBjdXIsIHNpemVvZihucC0+ZGV2X25hbWUpKTsKKwkJY3VyPWRlbGltOworCX0KKwljdXIrKzsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbnRlcmZhY2UgJXNcbiIsIG5wLT5uYW1lLCBucC0+ZGV2X25hbWUpOworCisJaWYgKCAqY3VyICE9ICdAJyApIHsKKwkJLyogZHN0IHBvcnQgKi8KKwkJaWYgKChkZWxpbSA9IHN0cmNocihjdXIsICdAJykpID09IE5VTEwpCisJCQlnb3RvIHBhcnNlX2ZhaWxlZDsKKwkJKmRlbGltPTA7CisJCW5wLT5yZW1vdGVfcG9ydD1zaW1wbGVfc3RydG9sKGN1ciwgTlVMTCwgMTApOworCQljdXI9ZGVsaW07CisJfQorCWN1cisrOworCXByaW50ayhLRVJOX0lORk8gIiVzOiByZW1vdGUgcG9ydCAlZFxuIiwgbnAtPm5hbWUsIG5wLT5yZW1vdGVfcG9ydCk7CisKKwkvKiBkc3QgaXAgKi8KKwlpZiAoKGRlbGltID0gc3RyY2hyKGN1ciwgJy8nKSkgPT0gTlVMTCkKKwkJZ290byBwYXJzZV9mYWlsZWQ7CisJKmRlbGltPTA7CisJbnAtPnJlbW90ZV9pcD1udG9obChpbl9hdG9uKGN1cikpOworCWN1cj1kZWxpbSsxOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlbW90ZSBJUCAlZC4lZC4lZC4lZFxuIiwKKwkJICAgICAgIG5wLT5uYW1lLCBISVBRVUFEKG5wLT5yZW1vdGVfaXApKTsKKworCWlmKCAqY3VyICE9IDAgKQorCXsKKwkJLyogTUFDIGFkZHJlc3MgKi8KKwkJaWYgKChkZWxpbSA9IHN0cmNocihjdXIsICc6JykpID09IE5VTEwpCisJCQlnb3RvIHBhcnNlX2ZhaWxlZDsKKwkJKmRlbGltPTA7CisJCW5wLT5yZW1vdGVfbWFjWzBdPXNpbXBsZV9zdHJ0b2woY3VyLCBOVUxMLCAxNik7CisJCWN1cj1kZWxpbSsxOworCQlpZiAoKGRlbGltID0gc3RyY2hyKGN1ciwgJzonKSkgPT0gTlVMTCkKKwkJCWdvdG8gcGFyc2VfZmFpbGVkOworCQkqZGVsaW09MDsKKwkJbnAtPnJlbW90ZV9tYWNbMV09c2ltcGxlX3N0cnRvbChjdXIsIE5VTEwsIDE2KTsKKwkJY3VyPWRlbGltKzE7CisJCWlmICgoZGVsaW0gPSBzdHJjaHIoY3VyLCAnOicpKSA9PSBOVUxMKQorCQkJZ290byBwYXJzZV9mYWlsZWQ7CisJCSpkZWxpbT0wOworCQlucC0+cmVtb3RlX21hY1syXT1zaW1wbGVfc3RydG9sKGN1ciwgTlVMTCwgMTYpOworCQljdXI9ZGVsaW0rMTsKKwkJaWYgKChkZWxpbSA9IHN0cmNocihjdXIsICc6JykpID09IE5VTEwpCisJCQlnb3RvIHBhcnNlX2ZhaWxlZDsKKwkJKmRlbGltPTA7CisJCW5wLT5yZW1vdGVfbWFjWzNdPXNpbXBsZV9zdHJ0b2woY3VyLCBOVUxMLCAxNik7CisJCWN1cj1kZWxpbSsxOworCQlpZiAoKGRlbGltID0gc3RyY2hyKGN1ciwgJzonKSkgPT0gTlVMTCkKKwkJCWdvdG8gcGFyc2VfZmFpbGVkOworCQkqZGVsaW09MDsKKwkJbnAtPnJlbW90ZV9tYWNbNF09c2ltcGxlX3N0cnRvbChjdXIsIE5VTEwsIDE2KTsKKwkJY3VyPWRlbGltKzE7CisJCW5wLT5yZW1vdGVfbWFjWzVdPXNpbXBsZV9zdHJ0b2woY3VyLCBOVUxMLCAxNik7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlbW90ZSBldGhlcm5ldCBhZGRyZXNzICIKKwkgICAgICAgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSAgICAgICBucC0+bmFtZSwKKwkgICAgICAgbnAtPnJlbW90ZV9tYWNbMF0sCisJICAgICAgIG5wLT5yZW1vdGVfbWFjWzFdLAorCSAgICAgICBucC0+cmVtb3RlX21hY1syXSwKKwkgICAgICAgbnAtPnJlbW90ZV9tYWNbM10sCisJICAgICAgIG5wLT5yZW1vdGVfbWFjWzRdLAorCSAgICAgICBucC0+cmVtb3RlX21hY1s1XSk7CisKKwlyZXR1cm4gMDsKKworIHBhcnNlX2ZhaWxlZDoKKwlwcmludGsoS0VSTl9JTkZPICIlczogY291bGRuJ3QgcGFyc2UgY29uZmlnIGF0ICVzIVxuIiwKKwkgICAgICAgbnAtPm5hbWUsIGN1cik7CisJcmV0dXJuIC0xOworfQorCitpbnQgbmV0cG9sbF9zZXR1cChzdHJ1Y3QgbmV0cG9sbCAqbnApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBOVUxMOworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKworCW5wLT5wb2xsX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CisJbnAtPnBvbGxfb3duZXIgPSAtMTsKKworCWlmIChucC0+ZGV2X25hbWUpCisJCW5kZXYgPSBkZXZfZ2V0X2J5X25hbWUobnAtPmRldl9uYW1lKTsKKwlpZiAoIW5kZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgZG9lc24ndCBleGlzdCwgYWJvcnRpbmcuXG4iLAorCQkgICAgICAgbnAtPm5hbWUsIG5wLT5kZXZfbmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlucC0+ZGV2ID0gbmRldjsKKwluZGV2LT5ucCA9IG5wOworCisJaWYgKCFuZGV2LT5wb2xsX2NvbnRyb2xsZXIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgZG9lc24ndCBzdXBwb3J0IHBvbGxpbmcsIGFib3J0aW5nLlxuIiwKKwkJICAgICAgIG5wLT5uYW1lLCBucC0+ZGV2X25hbWUpOworCQlnb3RvIHJlbGVhc2U7CisJfQorCisJaWYgKCFuZXRpZl9ydW5uaW5nKG5kZXYpKSB7CisJCXVuc2lnbmVkIGxvbmcgYXRtb3N0LCBhdGxlYXN0OworCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBkZXZpY2UgJXMgbm90IHVwIHlldCwgZm9yY2luZyBpdFxuIiwKKwkJICAgICAgIG5wLT5uYW1lLCBucC0+ZGV2X25hbWUpOworCisJCXJ0bmxfc2hsb2NrKCk7CisJCWlmIChkZXZfY2hhbmdlX2ZsYWdzKG5kZXYsIG5kZXYtPmZsYWdzIHwgSUZGX1VQKSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBvcGVuICVzXG4iLAorCQkJICAgICAgIG5wLT5uYW1lLCBucC0+ZGV2X25hbWUpOworCQkJcnRubF9zaHVubG9jaygpOworCQkJZ290byByZWxlYXNlOworCQl9CisJCXJ0bmxfc2h1bmxvY2soKTsKKworCQlhdGxlYXN0ID0gamlmZmllcyArIEhaLzEwOworIAkJYXRtb3N0ID0gamlmZmllcyArIDQqSFo7CisJCXdoaWxlICghbmV0aWZfY2Fycmllcl9vayhuZGV2KSkgeworCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgYXRtb3N0KSkgeworCQkJCXByaW50ayhLRVJOX05PVElDRQorCQkJCSAgICAgICAiJXM6IHRpbWVvdXQgd2FpdGluZyBmb3IgY2FycmllclxuIiwKKwkJCQkgICAgICAgbnAtPm5hbWUpOworCQkJCWJyZWFrOworCQkJfQorCQkJY29uZF9yZXNjaGVkKCk7CisJCX0KKworCQkvKiBJZiBjYXJyaWVyIGFwcGVhcnMgdG8gY29tZSB1cCBpbnN0YW50bHksIHdlIGRvbid0CisJCSAqIHRydXN0IGl0IGFuZCBwYXVzZSBzbyB0aGF0IHdlIGRvbid0IHB1bXAgYWxsIG91cgorCQkgKiBxdWV1ZWQgY29uc29sZSBtZXNzYWdlcyBpbnRvIHRoZSBiaXRidWNrZXQuCisJCSAqLworCisJCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBhdGxlYXN0KSkgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogY2FycmllciBkZXRlY3QgYXBwZWFycyIKKwkJCSAgICAgICAiIHVudHJ1c3R3b3J0aHksIHdhaXRpbmcgNCBzZWNvbmRzXG4iLAorCQkJICAgICAgIG5wLT5uYW1lKTsKKwkJCW1zbGVlcCg0MDAwKTsKKwkJfQorCX0KKworCWlmICghbWVtY21wKG5wLT5sb2NhbF9tYWMsICJcMFwwXDBcMFwwXDAiLCA2KSAmJiBuZGV2LT5kZXZfYWRkcikKKwkJbWVtY3B5KG5wLT5sb2NhbF9tYWMsIG5kZXYtPmRldl9hZGRyLCA2KTsKKworCWlmICghbnAtPmxvY2FsX2lwKSB7CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJaW5fZGV2ID0gX19pbl9kZXZfZ2V0KG5kZXYpOworCisJCWlmICghaW5fZGV2IHx8ICFpbl9kZXYtPmlmYV9saXN0KSB7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIElQIGFkZHJlc3MgZm9yICVzLCBhYm9ydGluZ1xuIiwKKwkJCSAgICAgICBucC0+bmFtZSwgbnAtPmRldl9uYW1lKTsKKwkJCWdvdG8gcmVsZWFzZTsKKwkJfQorCisJCW5wLT5sb2NhbF9pcCA9IG50b2hsKGluX2Rldi0+aWZhX2xpc3QtPmlmYV9sb2NhbCk7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlwcmludGsoS0VSTl9JTkZPICIlczogbG9jYWwgSVAgJWQuJWQuJWQuJWRcbiIsCisJCSAgICAgICBucC0+bmFtZSwgSElQUVVBRChucC0+bG9jYWxfaXApKTsKKwl9CisKKwlpZihucC0+cnhfaG9vaykKKwkJbnAtPnJ4X2ZsYWdzID0gTkVUUE9MTF9SWF9FTkFCTEVEOworCisJcmV0dXJuIDA7CisKKyByZWxlYXNlOgorCW5kZXYtPm5wID0gTlVMTDsKKwlucC0+ZGV2ID0gTlVMTDsKKwlkZXZfcHV0KG5kZXYpOworCXJldHVybiAtMTsKK30KKwordm9pZCBuZXRwb2xsX2NsZWFudXAoc3RydWN0IG5ldHBvbGwgKm5wKQoreworCWlmIChucC0+ZGV2KQorCQlucC0+ZGV2LT5ucCA9IE5VTEw7CisJZGV2X3B1dChucC0+ZGV2KTsKKwlucC0+ZGV2ID0gTlVMTDsKK30KKworaW50IG5ldHBvbGxfdHJhcCh2b2lkKQoreworCXJldHVybiBhdG9taWNfcmVhZCgmdHJhcHBlZCk7Cit9CisKK3ZvaWQgbmV0cG9sbF9zZXRfdHJhcChpbnQgdHJhcCkKK3sKKwlpZiAodHJhcCkKKwkJYXRvbWljX2luYygmdHJhcHBlZCk7CisJZWxzZQorCQlhdG9taWNfZGVjKCZ0cmFwcGVkKTsKK30KKworRVhQT1JUX1NZTUJPTChuZXRwb2xsX3NldF90cmFwKTsKK0VYUE9SVF9TWU1CT0wobmV0cG9sbF90cmFwKTsKK0VYUE9SVF9TWU1CT0wobmV0cG9sbF9wYXJzZV9vcHRpb25zKTsKK0VYUE9SVF9TWU1CT0wobmV0cG9sbF9zZXR1cCk7CitFWFBPUlRfU1lNQk9MKG5ldHBvbGxfY2xlYW51cCk7CitFWFBPUlRfU1lNQk9MKG5ldHBvbGxfc2VuZF91ZHApOworRVhQT1JUX1NZTUJPTChuZXRwb2xsX3BvbGwpOworRVhQT1JUX1NZTUJPTChuZXRwb2xsX3F1ZXVlKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3BrdGdlbi5jIGIvbmV0L2NvcmUvcGt0Z2VuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU3YjA2YgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9jb3JlL3BrdGdlbi5jCkBAIC0wLDAgKzEsMzEzMiBAQAorLyoKKyAqIEF1dGhvcnM6CisgKiBDb3B5cmlnaHQgMjAwMSwgMjAwMiBieSBSb2JlcnQgT2xzc29uIDxyb2JlcnQub2xzc29uQGl0cy51dS5zZT4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcHBzYWxhIFVuaXZlcnNpdHkgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3dlZGlzaCBVbml2ZXJzaXR5IG9mIEFncmljdWx0dXJhbCBTY2llbmNlcworICoKKyAqIEFsZXhleSBLdXpuZXRzb3YgIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqIEJlbiBHcmVlYXIgPGdyZWVhcmJAY2FuZGVsYXRlY2guY29tPgorICogSmVucyBM5eVzIDxqZW5zLmxhYXNAZGF0YS5zbHUuc2U+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgorICogQSB0b29sIGZvciBsb2FkaW5nIHRoZSBuZXR3b3JrIHdpdGggcHJlY29uZmlndXJhdGVkIHBhY2tldHMuCisgKiBUaGUgdG9vbCBpcyBpbXBsZW1lbnRlZCBhcyBhIGxpbnV4IG1vZHVsZS4gIFBhcmFtZXRlcnMgYXJlIG91dHB1dCAKKyAqIGRldmljZSwgZGVsYXkgKHRvIGhhcmRfeG1pdCksIG51bWJlciBvZiBwYWNrZXRzLCBhbmQgd2hldGhlcgorICogdG8gdXNlIG11bHRpcGxlIFNLQnMgb3IganVzdCB0aGUgc2FtZSBvbmUuCisgKiBwa3RnZW4gdXNlcyB0aGUgaW5zdGFsbGVkIGludGVyZmFjZSdzIG91dHB1dCByb3V0aW5lLgorICoKKyAqIEFkZGl0aW9uYWwgaGFja2luZyBieToKKyAqCisgKiBKZW5zLkxhYXNAZGF0YS5zbHUuc2UKKyAqIEltcHJvdmVkIGJ5IEFOSy4gMDEwMTIwLgorICogSW1wcm92ZWQgYnkgQU5LIGV2ZW4gbW9yZS4gMDEwMjEyLgorICogTUFDIGFkZHJlc3MgdHlwbyBmaXhlZC4gMDEwNDE3IC0tcm8KKyAqIEludGVncmF0ZWQuICAwMjAzMDEgLS1EYXZlTQorICogQWRkZWQgbXVsdGlza2Igb3B0aW9uIDAyMDMwMSAtLURhdmVNCisgKiBTY2FsaW5nIG9mIHJlc3VsdHMuIDAyMDQxNy0tc2lndXJkdXJAbGlucHJvLm5vCisgKiBTaWduaWZpY2FudCByZS13b3JrIG9mIHRoZSBtb2R1bGU6CisgKiAgICogIENvbnZlcnQgdG8gdGhyZWFkZWQgbW9kZWwgdG8gbW9yZSBlZmZpY2llbnRseSBiZSBhYmxlIHRvIHRyYW5zbWl0CisgKiAgICAgICBhbmQgcmVjZWl2ZSBvbiBtdWx0aXBsZSBpbnRlcmZhY2VzIGF0IG9uY2UuCisgKiAgICogIENvbnZlcnRlZCBtYW55IGNvdW50ZXJzIHRvIF9fdTY0IHRvIGFsbG93IGxvbmdlciBydW5zLgorICogICAqICBBbGxvdyBjb25maWd1cmF0aW9uIG9mIHJhbmdlcywgbGlrZSBtaW4vbWF4IElQIGFkZHJlc3MsIE1BQ3MsCisgKiAgICAgICBhbmQgVURQLXBvcnRzLCBmb3IgYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uLCBhbmQgY2FuCisgKiAgICAgICBzZXQgdG8gdXNlIGEgcmFuZG9tIGRpc3RyaWJ1dGlvbiBvciBzZXF1ZW50aWFsbHkgd2FsayB0aGUgcmFuZ2UuCisgKiAgICogIENhbiBub3cgY2hhbmdlIG1vc3QgdmFsdWVzIGFmdGVyIHN0YXJ0aW5nLgorICogICAqICBQbGFjZSAxMi1ieXRlIHBhY2tldCBpbiBVRFAgcGF5bG9hZCB3aXRoIG1hZ2ljIG51bWJlciwKKyAqICAgICAgIHNlcXVlbmNlIG51bWJlciwgYW5kIHRpbWVzdGFtcC4KKyAqICAgKiAgQWRkIHJlY2VpdmVyIGNvZGUgdGhhdCBkZXRlY3RzIGRyb3BwZWQgcGt0cywgcmUtb3JkZXJlZCBwa3RzLCBhbmQKKyAqICAgICAgIGxhdGVuY2llcyAod2l0aCBtaWNyby1zZWNvbmQpIHByZWNpc2lvbi4KKyAqICAgKiAgQWRkIElPQ1RMIGludGVyZmFjZSB0byBlYXNpbHkgZ2V0IGNvdW50ZXJzICYgY29uZmlndXJhdGlvbi4KKyAqICAgLS1CZW4gR3JlZWFyIDxncmVlYXJiQGNhbmRlbGF0ZWNoLmNvbT4KKyAqCisgKiBSZW5hbWVkIG11bHRpc2tiIHRvIGNsb25lX3NrYiBhbmQgY2xlYW5lZCB1cCBzZW5kaW5nIGNvcmUgZm9yIHR3byBkaXN0aW5jdCAKKyAqIHNrYiBtb2Rlcy4gQSBjbG9uZV9za2I9MCBtb2RlIGZvciBCZW4gInJhbmdlcyIgd29yayBhbmQgYSBjbG9uZV9za2IgIT0gMCAKKyAqIGFzIGEgImZhc3RwYXRoIiB3aXRoIGEgY29uZmlndXJhYmxlIG51bWJlciBvZiBjbG9uZXMgYWZ0ZXIgYWxsb2Mncy4KKyAqIGNsb25lX3NrYj0wIG1lYW5zIGFsbCBwYWNrZXRzIGFyZSBhbGxvY2F0ZWQgdGhpcyBhbHNvIG1lYW5zIHJhbmdlcyB0aW1lIAorICogc3RhbXBzIGV0YyBjYW4gYmUgdXNlZC4gY2xvbmVfc2tiPTEwMCBtZWFucyAxIG1hbGxvYyBpcyBmb2xsb3dlZCBieSAxMDAgCisgKiBjbG9uZXMuCisgKgorICogQWxzbyBtb3ZlZCB0byAvcHJvYy9uZXQvcGt0Z2VuLyAKKyAqIC0tcm8KKyAqCisgKiBTZXB0IDEwOiAgRml4ZWQgdGhyZWFkaW5nL2xvY2tpbmcuICBMb3RzIG9mIGJvbmUtaGVhZGVkIGFuZCBtb3JlIGNsZXZlcgorICogICAgbWlzdGFrZXMuICBBbHNvIG1lcmdlZCBpbiBEYXZlTSdzIHBhdGNoIGluIHRoZSAtcHJlNiBwYXRjaC4KKyAqIC0tQmVuIEdyZWVhciA8Z3JlZWFyYkBjYW5kZWxhdGVjaC5jb20+CisgKgorICogSW50ZWdyYXRlZCB0byAyLjUueCAwMjEwMjkgLS1MdWNpbyBNYWNpZWwgKGx1Y2lvbWFjaWVsQHppcG1haWwuY29tLmJyKQorICoKKyAqIAorICogMDIxMTI0IEZpbmlzaGVkIG1ham9yIHJlZGVzaWduIGFuZCByZXdyaXRlIGZvciBuZXcgZnVuY3Rpb25hbGl0eS4KKyAqIFNlZSBEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcGt0Z2VuLnR4dCBmb3IgaG93IHRvIHVzZSB0aGlzLgorICoKKyAqIFRoZSBuZXcgb3BlcmF0aW9uOgorICogRm9yIGVhY2ggQ1BVIG9uZSB0aHJlYWQvcHJvY2VzcyBpcyBjcmVhdGVkIGF0IHN0YXJ0LiBUaGlzIHByb2Nlc3MgY2hlY2tzIAorICogZm9yIHJ1bm5pbmcgZGV2aWNlcyBpbiB0aGUgaWZfbGlzdCBhbmQgc2VuZHMgcGFja2V0cyB1bnRpbCBjb3VudCBpcyAwIGl0IAorICogYWxzbyB0aGUgdGhyZWFkIGNoZWNrcyB0aGUgdGhyZWFkLT5jb250cm9sIHdoaWNoIGlzIHVzZWQgZm9yIGludGVyLXByb2Nlc3MgCisgKiBjb21tdW5pY2F0aW9uLiBjb250cm9sbGluZyBwcm9jZXNzICJwb3N0cyIgb3BlcmF0aW9ucyB0byB0aGUgdGhyZWFkcyB0aGlzIAorICogd2F5LiBUaGUgaWZfbG9jayBzaG91bGQgYmUgcG9zc2libGUgdG8gcmVtb3ZlIHdoZW4gYWRkL3JlbV9kZXZpY2UgaXMgbWVyZ2VkCisgKiBpbnRvIHRoaXMgdG9vLgorICoKKyAqIEJ5IGRlc2lnbiB0aGVyZSBzaG91bGQgb25seSBiZSAqb25lKiAiY29udHJvbGxpbmciIHByb2Nlc3MuIEluIHByYWN0aWNlIAorICogbXVsdGlwbGUgd3JpdGUgYWNjZXNzZXMgZ2l2ZXMgdW5wcmVkaWN0YWJsZSByZXN1bHQuIFVuZGVyc3Rvb2QgYnkgIndyaXRlIiAKKyAqIHRvIC9wcm9jIGdpdmVzIHJlc3VsdCBjb2RlIHRoYXRzIHNob3VsZCBiZSByZWFkIGJlIHRoZSAid3JpdGVyIi4KKyAqIEZvciBwcmF0aWNhbCB1c2UgdGhpcyBzaG91bGQgYmUgbm8gcHJvYmxlbS4KKyAqCisgKiBOb3RlIHdoZW4gYWRkaW5nIGRldmljZXMgdG8gYSBzcGVjaWZpYyBDUFUgdGhlcmUgZ29vZCBpZGVhIHRvIGFsc28gYXNzaWduIAorICogL3Byb2MvaXJxL1hYL3NtcF9hZmZpbml0eSBzbyBUWC1pbnRlcnJ1cHRzIGdldHMgYm91bmQgdG8gdGhlIHNhbWUgQ1BVLiAKKyAqIC0tcm8KKyAqCisgKiBGaXggcmVmY291bnQgb2ZmIGJ5IG9uZSBpZiBmaXJzdCBwYWNrZXQgZmFpbHMsIHBvdGVudGlhbCBudWxsIGRlcmVmLCAKKyAqIG1lbWxlYWsgMDMwNzEwLSBLSlAKKyAqCisgKiBGaXJzdCAicmFuZ2VzIiBmdW5jdGlvbmFsaXR5IGZvciBpcHY2IDAzMDcyNiAtLXJvCisgKgorICogSW5jbHVkZWQgZmxvdyBzdXBwb3J0LiAwMzA4MDIgQU5LLgorICoKKyAqIEZpeGVkIHVuYWxpZ25lZCBhY2Nlc3Mgb24gSUEtNjQgR3JhbnQgR3J1bmRsZXIgPGdydW5kbGVyQHBhcmlzYy1saW51eC5vcmc+CisgKiAKKyAqIFJlbW92ZSBpZiBmaXggZnJvbSBhZGRlZCBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4gMDQwNDE5CisgKiBpYTY0IGNvbXBpbGF0aW9uIGZpeCBmcm9tICBBcm9uIEdyaWZmaXMgPGFyb25AaHAuY29tPiAwNDA2MDQKKyAqCisgKiBOZXcgeG1pdCgpIHJldHVybiwgZG9fZGl2IGFuZCBtaXNjIGNsZWFuIHVwIGJ5IFN0ZXBoZW4gSGVtbWluZ2VyIAorICogPHNoZW1taW5nZXJAb3NkbC5vcmc+IDA0MDkyMworICoKKyAqIFJhbnkgRHVubGFwIGZpeGVkIHU2NCBwcmludGsgY29tcGlsZXIgd2FyaW5nIAorICoKKyAqIFJlbW92ZSBGQ1MgZnJvbSBCVyBjYWxjdWxhdGlvbi4gIExlbm5lcnQgQnV5dGVuaGVrIDxidXl0ZW5oQHdhbnRzdG9mbHkub3JnPgorICogTmV3IHRpbWUgaGFuZGxpbmcuIExlbm5lcnQgQnV5dGVuaGVrIDxidXl0ZW5oQHdhbnRzdG9mbHkub3JnPiAwNDEyMTMKKyAqCisgKiBDb3JyZWN0aW9ucyBmcm9tIE5pa29sYWkgTWFseWtoIChubWFseWtoQGJpbGltLmNvbSkgCisgKiBSZW1vdmVkIHVudXNlZCBmbGFncyBGX1NFVF9TUkNNQUMgJiBGX1NFVF9TUkNJUCAwNDEyMzAKKyAqCisgKiBpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoKSByZXBsYWNlZCBOaXNoYW50aCBBcmF2YW11ZGFuIDxuYWNjQHVzLmlibS5jb20+IAorICogMDUwMTAzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zeXMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvYWRkcmNvbmYuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+IC8qIGRvX2RpdiAqLworI2luY2x1ZGUgPGFzbS90aW1leC5oPgorCisKKyNkZWZpbmUgVkVSU0lPTiAgInBrdGdlbiB2Mi42MTogUGFja2V0IEdlbmVyYXRvciBmb3IgcGFja2V0IHBlcmZvcm1hbmNlIHRlc3RpbmcuXG4iCisKKy8qICNkZWZpbmUgUEdfREVCVUcoYSkgYSAqLworI2RlZmluZSBQR19ERUJVRyhhKSAKKworLyogVGhlIGJ1Y2tldHMgYXJlIGV4cG9uZW50aWFsIGluICd3aWR0aCcgKi8KKyNkZWZpbmUgTEFUX0JVQ0tFVFNfTUFYIDMyCisjZGVmaW5lIElQX05BTUVfU1ogMzIKKworLyogRGV2aWNlIGZsYWcgYml0cyAqLworI2RlZmluZSBGX0lQU1JDX1JORCAgICgxPDwwKSAgLyogSVAtU3JjIFJhbmRvbSAgKi8KKyNkZWZpbmUgRl9JUERTVF9STkQgICAoMTw8MSkgIC8qIElQLURzdCBSYW5kb20gICovCisjZGVmaW5lIEZfVURQU1JDX1JORCAgKDE8PDIpICAvKiBVRFAtU3JjIFJhbmRvbSAqLworI2RlZmluZSBGX1VEUERTVF9STkQgICgxPDwzKSAgLyogVURQLURzdCBSYW5kb20gKi8KKyNkZWZpbmUgRl9NQUNTUkNfUk5EICAoMTw8NCkgIC8qIE1BQy1TcmMgUmFuZG9tICovCisjZGVmaW5lIEZfTUFDRFNUX1JORCAgKDE8PDUpICAvKiBNQUMtRHN0IFJhbmRvbSAqLworI2RlZmluZSBGX1RYU0laRV9STkQgICgxPDw2KSAgLyogVHJhbnNtaXQgc2l6ZSBpcyByYW5kb20gKi8KKyNkZWZpbmUgRl9JUFY2ICAgICAgICAoMTw8NykgIC8qIEludGVyZmFjZSBpbiBJUFY2IE1vZGUgKi8KKworLyogVGhyZWFkIGNvbnRyb2wgZmxhZyBiaXRzICovCisjZGVmaW5lIFRfVEVSTUlOQVRFICAgKDE8PDApICAKKyNkZWZpbmUgVF9TVE9QICAgICAgICAoMTw8MSkgIC8qIFN0b3AgcnVuICovCisjZGVmaW5lIFRfUlVOICAgICAgICAgKDE8PDIpICAvKiBTdGFydCBydW4gKi8KKyNkZWZpbmUgVF9SRU1ERVYgICAgICAoMTw8MykgIC8qIFJlbW92ZSBhbGwgZGV2cyAqLworCisvKiBMb2NrcyAqLworI2RlZmluZSAgIHRocmVhZF9sb2NrKCkgICAgICAgIHNwaW5fbG9jaygmX3RocmVhZF9sb2NrKQorI2RlZmluZSAgIHRocmVhZF91bmxvY2soKSAgICAgIHNwaW5fdW5sb2NrKCZfdGhyZWFkX2xvY2spCisKKy8qIElmIGxvY2sgLS0gY2FuIGJlIHJlbW92ZWQgYWZ0ZXIgc29tZSB3b3JrICovCisjZGVmaW5lICAgaWZfbG9jayh0KSAgICAgICAgICAgc3Bpbl9sb2NrKCYodC0+aWZfbG9jaykpOworI2RlZmluZSAgIGlmX3VubG9jayh0KSAgICAgICAgICAgc3Bpbl91bmxvY2soJih0LT5pZl9sb2NrKSk7CisKKy8qIFVzZWQgdG8gaGVscCB3aXRoIGRldGVybWluaW5nIHRoZSBwa3RzIG9uIHJlY2VpdmUgKi8KKyNkZWZpbmUgUEtUR0VOX01BR0lDIDB4YmU5YmU5NTUKKyNkZWZpbmUgUEdfUFJPQ19ESVIgInBrdGdlbiIKKworI2RlZmluZSBNQVhfQ0ZMT1dTICA2NTUzNgorCitzdHJ1Y3QgZmxvd19zdGF0ZQoreworCV9fdTMyCQljdXJfZGFkZHI7CisJaW50CQljb3VudDsKK307CisKK3N0cnVjdCBwa3RnZW5fZGV2IHsKKworCS8qCisJICogVHJ5IHRvIGtlZXAgZnJlcXVlbnQvaW5mcmVxdWVudCB1c2VkIHZhcnMuIHNlcGFyYXRlZC4KKwkgKi8KKworICAgICAgICBjaGFyIGlmbmFtZVszMl07CisgICAgICAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19lbnQ7CisgICAgICAgIGNoYXIgcmVzdWx0WzUxMl07CisgICAgICAgIC8qIHByb2MgZmlsZSBuYW1lcyAqLworICAgICAgICBjaGFyIGZuYW1lWzgwXTsKKworICAgICAgICBzdHJ1Y3QgcGt0Z2VuX3RocmVhZCogcGdfdGhyZWFkOyAvKiB0aGUgb3duZXIgKi8KKyAgICAgICAgc3RydWN0IHBrdGdlbl9kZXYgKm5leHQ7IC8qIFVzZWQgZm9yIGNoYWluaW5nIGluIHRoZSB0aHJlYWQncyBydW4tcXVldWUgKi8KKworICAgICAgICBpbnQgcnVubmluZzsgIC8qIGlmIHRoaXMgY2hhbmdlcyB0byBmYWxzZSwgdGhlIHRlc3Qgd2lsbCBzdG9wICovCisgICAgICAgIAorICAgICAgICAvKiBJZiBtaW4gIT0gbWF4LCB0aGVuIHdlIHdpbGwgZWl0aGVyIGRvIGEgbGluZWFyIGl0ZXJhdGlvbiwgb3IKKyAgICAgICAgICogd2Ugd2lsbCBkbyBhIHJhbmRvbSBzZWxlY3Rpb24gZnJvbSB3aXRoaW4gdGhlIHJhbmdlLgorICAgICAgICAgKi8KKyAgICAgICAgX191MzIgZmxhZ3M7ICAgICAKKworICAgICAgICBpbnQgbWluX3BrdF9zaXplOyAgICAvKiA9IEVUSF9aTEVOOyAqLworICAgICAgICBpbnQgbWF4X3BrdF9zaXplOyAgICAvKiA9IEVUSF9aTEVOOyAqLworICAgICAgICBpbnQgbmZyYWdzOworICAgICAgICBfX3UzMiBkZWxheV91czsgICAgLyogRGVmYXVsdCBkZWxheSAqLworICAgICAgICBfX3UzMiBkZWxheV9uczsKKyAgICAgICAgX191NjQgY291bnQ7ICAvKiBEZWZhdWx0IE5vIHBhY2tldHMgdG8gc2VuZCAqLworICAgICAgICBfX3U2NCBzb2ZhcjsgIC8qIEhvdyBtYW55IHBrdHMgd2UndmUgc2VudCBzbyBmYXIgKi8KKyAgICAgICAgX191NjQgdHhfYnl0ZXM7IC8qIEhvdyBtYW55IGJ5dGVzIHdlJ3ZlIHRyYW5zbWl0dGVkICovCisgICAgICAgIF9fdTY0IGVycm9yczsgICAgLyogRXJyb3JzIHdoZW4gdHJ5aW5nIHRvIHRyYW5zbWl0LCBwa3RzIHdpbGwgYmUgcmUtc2VudCAqLworCisgICAgICAgIC8qIHJ1bnRpbWUgY291bnRlcnMgcmVsYXRpbmcgdG8gY2xvbmVfc2tiICovCisgICAgICAgIF9fdTY0IG5leHRfdHhfdXM7ICAgICAgICAgIC8qIHRpbWVzdGFtcCBvZiB3aGVuIHRvIHR4IG5leHQgKi8KKyAgICAgICAgX191MzIgbmV4dF90eF9uczsKKyAgICAgICAgCisgICAgICAgIF9fdTY0IGFsbG9jYXRlZF9za2JzOworICAgICAgICBfX3UzMiBjbG9uZV9jb3VudDsKKwlpbnQgbGFzdF9vazsgICAgICAgICAgIC8qIFdhcyBsYXN0IHNrYiBzZW50PyAKKwkgICAgICAgICAgICAgICAgICAgICAgICAqIE9yIGEgZmFpbGVkIHRyYW5zbWl0IG9mIHNvbWUgc29ydD8gIFRoaXMgd2lsbCBrZWVwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2VxdWVuY2UgbnVtYmVycyBpbiBvcmRlciwgZm9yIGV4YW1wbGUuCisJCQkJKi8KKyAgICAgICAgX191NjQgc3RhcnRlZF9hdDsgLyogbWljcm8tc2Vjb25kcyAqLworICAgICAgICBfX3U2NCBzdG9wcGVkX2F0OyAvKiBtaWNyby1zZWNvbmRzICovCisgICAgICAgIF9fdTY0IGlkbGVfYWNjOyAvKiBtaWNyby1zZWNvbmRzICovCisgICAgICAgIF9fdTMyIHNlcV9udW07CisgICAgICAgIAorICAgICAgICBpbnQgY2xvbmVfc2tiOyAvKiBVc2UgbXVsdGlwbGUgU0tCcyBkdXJpbmcgcGFja2V0IGdlbi4gIElmIHRoaXMgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICogaXMgZ3JlYXRlciB0aGFuIDEsIHRoZW4gdGhhdCBtYW55IGNvcHBpZXMgb2YgdGhlIHNhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwYWNrZXQgd2lsbCBiZSBzZW50IGJlZm9yZSBhIG5ldyBwYWNrZXQgaXMgYWxsb2NhdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAqIEZvciBpbnN0YW5jZSwgaWYgeW91IHdhbnQgdG8gc2VuZCAxMDI0IGlkZW50aWNhbCBwYWNrZXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICogYmVmb3JlIGNyZWF0aW5nIGEgbmV3IHBhY2tldCwgc2V0IGNsb25lX3NrYiB0byAxMDI0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAKKyAgICAgICAgY2hhciBkc3RfbWluW0lQX05BTUVfU1pdOyAvKiBJUCwgaWUgMS4yLjMuNCAqLworICAgICAgICBjaGFyIGRzdF9tYXhbSVBfTkFNRV9TWl07IC8qIElQLCBpZSAxLjIuMy40ICovCisgICAgICAgIGNoYXIgc3JjX21pbltJUF9OQU1FX1NaXTsgLyogSVAsIGllIDEuMi4zLjQgKi8KKyAgICAgICAgY2hhciBzcmNfbWF4W0lQX05BTUVfU1pdOyAvKiBJUCwgaWUgMS4yLjMuNCAqLworCisJc3RydWN0IGluNl9hZGRyICBpbjZfc2FkZHI7CisJc3RydWN0IGluNl9hZGRyICBpbjZfZGFkZHI7CisJc3RydWN0IGluNl9hZGRyICBjdXJfaW42X2RhZGRyOworCXN0cnVjdCBpbjZfYWRkciAgY3VyX2luNl9zYWRkcjsKKwkvKiBGb3IgcmFuZ2VzICovCisJc3RydWN0IGluNl9hZGRyICBtaW5faW42X2RhZGRyOworCXN0cnVjdCBpbjZfYWRkciAgbWF4X2luNl9kYWRkcjsKKwlzdHJ1Y3QgaW42X2FkZHIgIG1pbl9pbjZfc2FkZHI7CisJc3RydWN0IGluNl9hZGRyICBtYXhfaW42X3NhZGRyOworCisgICAgICAgIC8qIElmIHdlJ3JlIGRvaW5nIHJhbmdlcywgcmFuZG9tIG9yIGluY3JlbWVudGFsLCB0aGVuIHRoaXMKKyAgICAgICAgICogZGVmaW5lcyB0aGUgbWluL21heCBmb3IgdGhvc2UgcmFuZ2VzLgorICAgICAgICAgKi8KKyAgICAgICAgX191MzIgc2FkZHJfbWluOyAvKiBpbmNsdXNpdmUsIHNvdXJjZSBJUCBhZGRyZXNzICovCisgICAgICAgIF9fdTMyIHNhZGRyX21heDsgLyogZXhjbHVzaXZlLCBzb3VyY2UgSVAgYWRkcmVzcyAqLworICAgICAgICBfX3UzMiBkYWRkcl9taW47IC8qIGluY2x1c2l2ZSwgZGVzdCBJUCBhZGRyZXNzICovCisgICAgICAgIF9fdTMyIGRhZGRyX21heDsgLyogZXhjbHVzaXZlLCBkZXN0IElQIGFkZHJlc3MgKi8KKworICAgICAgICBfX3UxNiB1ZHBfc3JjX21pbjsgLyogaW5jbHVzaXZlLCBzb3VyY2UgVURQIHBvcnQgKi8KKyAgICAgICAgX191MTYgdWRwX3NyY19tYXg7IC8qIGV4Y2x1c2l2ZSwgc291cmNlIFVEUCBwb3J0ICovCisgICAgICAgIF9fdTE2IHVkcF9kc3RfbWluOyAvKiBpbmNsdXNpdmUsIGRlc3QgVURQIHBvcnQgKi8KKyAgICAgICAgX191MTYgdWRwX2RzdF9tYXg7IC8qIGV4Y2x1c2l2ZSwgZGVzdCBVRFAgcG9ydCAqLworCisgICAgICAgIF9fdTMyIHNyY19tYWNfY291bnQ7IC8qIEhvdyBtYW55IE1BQ3MgdG8gaXRlcmF0ZSB0aHJvdWdoICovCisgICAgICAgIF9fdTMyIGRzdF9tYWNfY291bnQ7IC8qIEhvdyBtYW55IE1BQ3MgdG8gaXRlcmF0ZSB0aHJvdWdoICovCisgICAgICAgIAorICAgICAgICB1bnNpZ25lZCBjaGFyIGRzdF9tYWNbNl07CisgICAgICAgIHVuc2lnbmVkIGNoYXIgc3JjX21hY1s2XTsKKyAgICAgICAgCisgICAgICAgIF9fdTMyIGN1cl9kc3RfbWFjX29mZnNldDsKKyAgICAgICAgX191MzIgY3VyX3NyY19tYWNfb2Zmc2V0OworICAgICAgICBfX3UzMiBjdXJfc2FkZHI7CisgICAgICAgIF9fdTMyIGN1cl9kYWRkcjsKKyAgICAgICAgX191MTYgY3VyX3VkcF9kc3Q7CisgICAgICAgIF9fdTE2IGN1cl91ZHBfc3JjOworICAgICAgICBfX3UzMiBjdXJfcGt0X3NpemU7CisgICAgICAgIAorICAgICAgICBfX3U4IGhoWzE0XTsKKyAgICAgICAgLyogPSB7IAorICAgICAgICAgICAweDAwLCAweDgwLCAweEM4LCAweDc5LCAweEIzLCAweENCLCAKKyAgICAgICAgICAgCisgICAgICAgICAgIFdlIGZpbGwgaW4gU1JDIGFkZHJlc3MgbGF0ZXIKKyAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgICAgMHgwOCwgMHgwMAorICAgICAgICAgICB9OworICAgICAgICAqLworICAgICAgICBfX3UxNiBwYWQ7IC8qIHBhZCBvdXQgdGhlIGhoIHN0cnVjdCB0byBhbiBldmVuIDE2IGJ5dGVzICovCisKKyAgICAgICAgc3RydWN0IHNrX2J1ZmYqIHNrYjsgLyogc2tiIHdlIGFyZSB0byB0cmFuc21pdCBuZXh0LCBtYWlubHkgdXNlZCBmb3Igd2hlbiB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhcmUgdHJhbnNtaXR0aW5nIHRoZSBzYW1lIG9uZSBtdWx0aXBsZSB0aW1lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UqIG9kZXY7IC8qIFRoZSBvdXQtZ29pbmcgZGV2aWNlLiAgTm90ZSB0aGF0IHRoZSBkZXZpY2Ugc2hvdWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBoYXZlIGl0J3MgcGdfaW5mbyBwb2ludGVyIHBvaW50aW5nIGJhY2sgdG8gdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZGV2aWNlLiAgVGhpcyB3aWxsIGJlIHNldCB3aGVuIHRoZSB1c2VyIHNwZWNpZmllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIG91dC1nb2luZyBkZXZpY2UgbmFtZSAobm90IHdoZW4gdGhlIGluamVjdCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3RhcnRlZCBhcyBpdCB1c2VkIHRvIGRvLikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXN0cnVjdCBmbG93X3N0YXRlICpmbG93czsKKwl1bnNpZ25lZCBjZmxvd3M7ICAgICAgICAgLyogQ29uY3VycmVudCBmbG93cyAoY29uZmlnKSAqLworCXVuc2lnbmVkIGxmbG93OyAgICAgICAgICAvKiBGbG93IGxlbmd0aCAgKGNvbmZpZykgKi8KKwl1bnNpZ25lZCBuZmxvd3M7ICAgICAgICAgLyogYWNjdW11bGF0ZWQgZmxvd3MgKHN0YXRzKSAqLworfTsKKworc3RydWN0IHBrdGdlbl9oZHIgeworICAgICAgICBfX3UzMiBwZ2hfbWFnaWM7CisgICAgICAgIF9fdTMyIHNlcV9udW07CisJX191MzIgdHZfc2VjOworCV9fdTMyIHR2X3VzZWM7Cit9OworCitzdHJ1Y3QgcGt0Z2VuX3RocmVhZCB7CisgICAgICAgIHNwaW5sb2NrX3QgaWZfbG9jazsKKyAgICAgICAgc3RydWN0IHBrdGdlbl9kZXYgKmlmX2xpc3Q7ICAgICAgICAgICAvKiBBbGwgZGV2aWNlIGhlcmUgKi8KKyAgICAgICAgc3RydWN0IHBrdGdlbl90aHJlYWQqIG5leHQ7CisgICAgICAgIGNoYXIgbmFtZVszMl07CisgICAgICAgIGNoYXIgZm5hbWVbMTI4XTsgLyogbmFtZSBvZiBwcm9jIGZpbGUgKi8KKyAgICAgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2VudDsKKyAgICAgICAgY2hhciByZXN1bHRbNTEyXTsKKyAgICAgICAgdTMyIG1heF9iZWZvcmVfc29mdGlycTsgLyogV2UnbGwgY2FsbCBkb19zb2Z0aXJxIHRvIHByZXZlbnQgc3RhcnZhdGlvbi4gKi8KKyAgICAgICAgCisJLyogRmllbGQgZm9yIHRocmVhZCB0byByZWNlaXZlICJwb3N0ZWQiIGV2ZW50cyB0ZXJtaW5hdGUsIHN0b3AgaWZzIGV0Yy4qLworCisgICAgICAgIHUzMiBjb250cm9sOworCWludCBwaWQ7CisJaW50IGNwdTsKKworICAgICAgICB3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZTsKK307CisKKyNkZWZpbmUgUkVNT1ZFIDEKKyNkZWZpbmUgRklORCAgIDAKKworLyogIFRoaXMgY29kZSB3b3JrcyBhcm91bmQgdGhlIGZhY3QgdGhhdCBkb19kaXYgY2Fubm90IGhhbmRsZSB0d28gNjQtYml0CisgICAgbnVtYmVycywgYW5kIHJlZ3VsYXIgNjQtYml0IGRpdmlzaW9uIGRvZXNuJ3Qgd29yayBvbiB4ODYga2VybmVscy4KKyAgICAtLUJlbgorKi8KKworI2RlZmluZSBQR19ESVYgMAorCisvKiBUaGlzIHdhcyBlbWFpbGVkIHRvIExNS0wgYnk6IENocmlzIENhcHV0byA8Y2NhcHV0b0BhbHQubmV0PgorICogRnVuY3Rpb24gY29waWVkL2FkYXB0ZWQvb3B0aW1pemVkIGZyb206CisgKgorICogIG5lbWVzaXMuc291cmNlZm9yZ2UubmV0L2Jyb3dzZS9saWIvc3RhdGljL2ludG1hdGgvaXg4Ni9pbnRtYXRoLmMuaHRtbAorICoKKyAqIENvcHlyaWdodCAxOTk0LCBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZSBDb21wdXRlciBMYWJvcmF0b3J5CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworaW5saW5lIHN0YXRpYyBzNjQgZGl2cmVtZGkzKHM2NCB4LCBzNjQgeSwgaW50IHR5cGUpIAoreworICAgICAgICB1NjQgYSA9ICh4IDwgMCkgPyAteCA6IHg7CisgICAgICAgIHU2NCBiID0gKHkgPCAwKSA/IC15IDogeTsKKyAgICAgICAgdTY0IHJlcyA9IDAsIGQgPSAxOworCisgICAgICAgIGlmIChiID4gMCkgeworICAgICAgICAgICAgICAgIHdoaWxlIChiIDwgYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYiA8PD0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQgPDw9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaWYgKCBhID49IGIgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhIC09IGI7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgKz0gZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYiA+Pj0gMTsKKyAgICAgICAgICAgICAgICBkID4+PSAxOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChkKTsKKworICAgICAgICBpZiAoUEdfRElWID09IHR5cGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKCgoeCBeIHkpICYgKDFsbDw8NjMpKSA9PSAwKSA/IHJlcyA6IC0oczY0KXJlczsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKCh4ICYgKDFsbDw8NjMpKSA9PSAwKSA/IGEgOiAtKHM2NClhOworICAgICAgICB9Cit9CisKKy8qIEVuZCBvZiBoYWNrcyB0byBkZWFsIHdpdGggNjQtYml0IG1hdGggb24geDg2ICovCisKKy8qKiBDb252ZXJ0IHRvIG1pbGlzZWNvbmRzICovCitzdGF0aWMgaW5saW5lIF9fdTY0IHR2X3RvX21zKGNvbnN0IHN0cnVjdCB0aW1ldmFsKiB0dikgCit7CisgICAgICAgIF9fdTY0IG1zID0gdHYtPnR2X3VzZWMgLyAxMDAwOworICAgICAgICBtcyArPSAoX191NjQpdHYtPnR2X3NlYyAqIChfX3U2NCkxMDAwOworICAgICAgICByZXR1cm4gbXM7Cit9CisKKworLyoqIENvbnZlcnQgdG8gbWljcm8tc2Vjb25kcyAqLworc3RhdGljIGlubGluZSBfX3U2NCB0dl90b191cyhjb25zdCBzdHJ1Y3QgdGltZXZhbCogdHYpIAoreworICAgICAgICBfX3U2NCB1cyA9IHR2LT50dl91c2VjOworICAgICAgICB1cyArPSAoX191NjQpdHYtPnR2X3NlYyAqIChfX3U2NCkxMDAwMDAwOworICAgICAgICByZXR1cm4gdXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191NjQgcGdfZGl2KF9fdTY0IG4sIF9fdTMyIGJhc2UpIHsKKyAgICAgICAgX191NjQgdG1wID0gbjsKKyAgICAgICAgZG9fZGl2KHRtcCwgYmFzZSk7CisgICAgICAgIC8qIHByaW50aygicGt0Z2VuOiBwZ19kaXYsIG46ICVsbHUgIGJhc2U6ICVkICBydjogJWxsdVxuIiwKKyAgICAgICAgICAgICAgICAgIG4sIGJhc2UsIHRtcCk7ICovCisgICAgICAgIHJldHVybiB0bXA7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191NjQgcGdfZGl2NjQoX191NjQgbiwgX191NjQgYmFzZSkgCit7CisgICAgICAgIF9fdTY0IHRtcCA9IG47CisvKgorICogSG93IGRvIHdlIGtub3cgaWYgdGhlIGFyY2hpdGVjdHJ1cmUgd2UgYXJlIHJ1bm5pbmcgb24KKyAqIHN1cHBvcnRzIGRpdmlzaW9uIHdpdGggNjQgYml0IGJhc2U/CisgKiAKKyAqLworI2lmIGRlZmluZWQoX19zcGFyY192OV9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwYzY0X18pIHx8IGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19pYTY0X18pIAorCisJCWRvX2Rpdih0bXAsIGJhc2UpOworI2Vsc2UKKwkJdG1wID0gZGl2cmVtZGkzKG4sIGJhc2UsIFBHX0RJVik7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIHRtcDsKK30KKworc3RhdGljIGlubGluZSB1MzIgcGt0Z2VuX3JhbmRvbSh2b2lkKQoreworI2lmIDAKKwlfX3UzMiBuOworCWdldF9yYW5kb21fYnl0ZXMoJm4sIDQpOworCXJldHVybiBuOworI2Vsc2UKKwlyZXR1cm4gbmV0X3JhbmRvbSgpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgX191NjQgZ2V0Q3VyTXModm9pZCkgCit7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgICAgICBkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKyAgICAgICAgcmV0dXJuIHR2X3RvX21zKCZ0dik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191NjQgZ2V0Q3VyVXModm9pZCkgCit7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgICAgICBkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKyAgICAgICAgcmV0dXJuIHR2X3RvX3VzKCZ0dik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191NjQgdHZfZGlmZihjb25zdCBzdHJ1Y3QgdGltZXZhbCogYSwgY29uc3Qgc3RydWN0IHRpbWV2YWwqIGIpIAoreworICAgICAgICByZXR1cm4gdHZfdG9fdXMoYSkgLSB0dl90b191cyhiKTsKK30KKworCisvKiBvbGQgaW5jbHVkZSBlbmQgKi8KKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPSBWRVJTSU9OOworCitzdGF0aWMgc3NpemVfdCBwcm9jX3BnY3RybF9yZWFkKHN0cnVjdCBmaWxlKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIHNzaXplX3QgcHJvY19wZ2N0cmxfd3JpdGUoc3RydWN0IGZpbGUqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CitzdGF0aWMgaW50IHByb2NfaWZfcmVhZChjaGFyICpidWYgLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbiwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworCitzdGF0aWMgaW50IHByb2NfdGhyZWFkX3JlYWQoY2hhciAqYnVmICwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW4sIGludCAqZW9mLCB2b2lkICpkYXRhKTsKK3N0YXRpYyBpbnQgcHJvY19pZl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKTsKK3N0YXRpYyBpbnQgcHJvY190aHJlYWRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSk7CitzdGF0aWMgaW50IGNyZWF0ZV9wcm9jX2Rpcih2b2lkKTsKK3N0YXRpYyBpbnQgcmVtb3ZlX3Byb2NfZGlyKHZvaWQpOworCitzdGF0aWMgaW50IHBrdGdlbl9yZW1vdmVfZGV2aWNlKHN0cnVjdCBwa3RnZW5fdGhyZWFkKiB0LCBzdHJ1Y3QgcGt0Z2VuX2RldiAqaSk7CitzdGF0aWMgaW50IHBrdGdlbl9hZGRfZGV2aWNlKHN0cnVjdCBwa3RnZW5fdGhyZWFkKiB0LCBjb25zdCBjaGFyKiBpZm5hbWUpOworc3RhdGljIHN0cnVjdCBwa3RnZW5fdGhyZWFkKiBwa3RnZW5fZmluZF90aHJlYWQoY29uc3QgY2hhciogbmFtZSk7CitzdGF0aWMgc3RydWN0IHBrdGdlbl9kZXYgKnBrdGdlbl9maW5kX2RldihzdHJ1Y3QgcGt0Z2VuX3RocmVhZCogdCwgY29uc3QgY2hhciogaWZuYW1lKTsKK3N0YXRpYyBpbnQgcGt0Z2VuX2RldmljZV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZywgdm9pZCAqKTsKK3N0YXRpYyB2b2lkIHBrdGdlbl9ydW5fYWxsX3RocmVhZHModm9pZCk7CitzdGF0aWMgdm9pZCBwa3RnZW5fc3RvcF9hbGxfdGhyZWFkc19pZnModm9pZCk7CitzdGF0aWMgaW50IHBrdGdlbl9zdG9wX2RldmljZShzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2Rldik7CitzdGF0aWMgdm9pZCBwa3RnZW5fc3RvcChzdHJ1Y3QgcGt0Z2VuX3RocmVhZCogdCk7CitzdGF0aWMgdm9pZCBwa3RnZW5fY2xlYXJfY291bnRlcnMoc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpOworc3RhdGljIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RnZW5fTk5fdGhyZWFkcyhjb25zdCBjaGFyKiBkZXZfbmFtZSwgaW50IHJlbW92ZSk7CitzdGF0aWMgdW5zaWduZWQgaW50IHNjYW5faXA2KGNvbnN0IGNoYXIgKnMsY2hhciBpcFsxNl0pOworc3RhdGljIHVuc2lnbmVkIGludCBmbXRfaXA2KGNoYXIgKnMsY29uc3QgY2hhciBpcFsxNl0pOworCisvKiBNb2R1bGUgcGFyYW1ldGVycywgZGVmYXVsdHMuICovCitzdGF0aWMgaW50IHBnX2NvdW50X2QgPSAxMDAwOyAvKiAxMDAwIHBrdHMgYnkgZGVmYXVsdCAqLworc3RhdGljIGludCBwZ19kZWxheV9kID0gMDsKK3N0YXRpYyBpbnQgcGdfY2xvbmVfc2tiX2QgPSAwOworc3RhdGljIGludCBkZWJ1ZyA9IDA7CisKK3N0YXRpYyBzcGlubG9ja190IF90aHJlYWRfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqcGt0Z2VuX3RocmVhZHMgPSBOVUxMOworCitzdGF0aWMgY2hhciBtb2R1bGVfZm5hbWVbMTI4XTsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKm1vZHVsZV9wcm9jX2VudCA9IE5VTEw7CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcGt0Z2VuX25vdGlmaWVyX2Jsb2NrID0geworCS5ub3RpZmllcl9jYWxsID0gcGt0Z2VuX2RldmljZV9ldmVudCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBrdGdlbl9mb3BzID0geworICAgICAgICAucmVhZCAgICAgPSBwcm9jX3BnY3RybF9yZWFkLAorICAgICAgICAud3JpdGUgICAgPSBwcm9jX3BnY3RybF93cml0ZSwKKwkvKiAgLmlvY3RsICAgID0gcGt0Z2VuX2lvY3RsLCBsYXRlciBtYXliZSAqLworfTsKKworLyoKKyAqIC9wcm9jIGhhbmRsaW5nIGZ1bmN0aW9ucyAKKyAqCisgKi8KKworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGdfcHJvY19kaXIgPSBOVUxMOworc3RhdGljIGludCBwcm9jX3BnY3RybF9yZWFkX2VvZj0wOworCitzdGF0aWMgc3NpemVfdCBwcm9jX3BnY3RybF9yZWFkKHN0cnVjdCBmaWxlKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreyAKKwljaGFyIGRhdGFbMjAwXTsKKwlpbnQgbGVuID0gMDsKKworCWlmKHByb2NfcGdjdHJsX3JlYWRfZW9mKSB7CisJCXByb2NfcGdjdHJsX3JlYWRfZW9mPTA7CisJCWxlbiA9IDA7CisJCWdvdG8gb3V0OworCX0KKworCXNwcmludGYoZGF0YSwgIiVzIiwgVkVSU0lPTik7IAorCisJbGVuID0gc3RybGVuKGRhdGEpOworCisJaWYobGVuID4gY291bnQpIHsKKwkJbGVuID0tRUZBVUxUOworCQlnb3RvIG91dDsKKwl9ICAJCisKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgZGF0YSwgbGVuKSkgeworCQlsZW4gPS1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0gIAorCisJKnBwb3MgKz0gbGVuOworCXByb2NfcGdjdHJsX3JlYWRfZW9mPTE7IC8qIEVPRiBuZXh0IGNhbGwgKi8KKworIG91dDoKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBwcm9jX3BnY3RybF93cml0ZShzdHJ1Y3QgZmlsZSogZmlsZSxjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciAqZGF0YSA9IE5VTEw7CisJaW50IGVyciA9IDA7CisKKyAgICAgICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKXsKKyAgICAgICAgICAgICAgICBlcnIgPSAtRVBFUk07CisJCWdvdG8gb3V0OworICAgICAgICB9CisKKwlkYXRhID0gKHZvaWQqKXZtYWxsb2MgKCh1bnNpZ25lZCBpbnQpY291bnQpOworCisJaWYoIWRhdGEpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChjb3B5X2Zyb21fdXNlcihkYXRhLCBidWYsIGNvdW50KSkgeworCQllcnIgPS1FRkFVTFQ7CisJCWdvdG8gb3V0X2ZyZWU7CisJfSAgCisJZGF0YVtjb3VudC0xXSA9IDA7IC8qIE1ha2Ugc3RyaW5nICovCisKKwlpZiAoIXN0cmNtcChkYXRhLCAic3RvcCIpKSAKKwkJcGt0Z2VuX3N0b3BfYWxsX3RocmVhZHNfaWZzKCk7CisKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChkYXRhLCAic3RhcnQiKSkgCisJCXBrdGdlbl9ydW5fYWxsX3RocmVhZHMoKTsKKworCWVsc2UgCisJCXByaW50aygicGt0Z2VuOiBVbmtub3duIGNvbW1hbmQ6ICVzXG4iLCBkYXRhKTsKKworCWVyciA9IGNvdW50OworCisgb3V0X2ZyZWU6CisJdmZyZWUgKGRhdGEpOworIG91dDoKKyAgICAgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBwcm9jX2lmX3JlYWQoY2hhciAqYnVmICwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwljaGFyICpwOworCWludCBpOworICAgICAgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldiA9IChzdHJ1Y3QgcGt0Z2VuX2RldiopKGRhdGEpOworICAgICAgICBfX3U2NCBzYTsKKyAgICAgICAgX191NjQgc3RvcHBlZDsKKyAgICAgICAgX191NjQgbm93ID0gZ2V0Q3VyVXMoKTsKKyAgICAgICAgCisJcCA9IGJ1ZjsKKwlwICs9IHNwcmludGYocCwgIlBhcmFtczogY291bnQgJWxsdSAgbWluX3BrdF9zaXplOiAldSAgbWF4X3BrdF9zaXplOiAldVxuIiwKKwkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwa3RfZGV2LT5jb3VudCwKKwkJICAgICBwa3RfZGV2LT5taW5fcGt0X3NpemUsIHBrdF9kZXYtPm1heF9wa3Rfc2l6ZSk7CisKKwlwICs9IHNwcmludGYocCwgIiAgICAgZnJhZ3M6ICVkICBkZWxheTogJXUgIGNsb25lX3NrYjogJWQgIGlmbmFtZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5uZnJhZ3MsIDEwMDAqcGt0X2Rldi0+ZGVsYXlfdXMrcGt0X2Rldi0+ZGVsYXlfbnMsIHBrdF9kZXYtPmNsb25lX3NrYiwgcGt0X2Rldi0+aWZuYW1lKTsKKworCXAgKz0gc3ByaW50ZihwLCAiICAgICBmbG93czogJXUgZmxvd2xlbjogJXVcbiIsIHBrdF9kZXYtPmNmbG93cywgcGt0X2Rldi0+bGZsb3cpOworCisKKwlpZihwa3RfZGV2LT5mbGFncyAmIEZfSVBWNikgeworCQljaGFyIGIxWzEyOF0sIGIyWzEyOF0sIGIzWzEyOF07CisJCWZtdF9pcDYoYjEsICBwa3RfZGV2LT5pbjZfc2FkZHIuczZfYWRkcik7CisJCWZtdF9pcDYoYjIsICBwa3RfZGV2LT5taW5faW42X3NhZGRyLnM2X2FkZHIpOworCQlmbXRfaXA2KGIzLCAgcGt0X2Rldi0+bWF4X2luNl9zYWRkci5zNl9hZGRyKTsKKwkJcCArPSBzcHJpbnRmKHAsICIgICAgIHNhZGRyOiAlcyAgbWluX3NhZGRyOiAlcyAgbWF4X3NhZGRyOiAlc1xuIiwgYjEsIGIyLCBiMyk7CisKKwkJZm10X2lwNihiMSwgIHBrdF9kZXYtPmluNl9kYWRkci5zNl9hZGRyKTsKKwkJZm10X2lwNihiMiwgIHBrdF9kZXYtPm1pbl9pbjZfZGFkZHIuczZfYWRkcik7CisJCWZtdF9pcDYoYjMsICBwa3RfZGV2LT5tYXhfaW42X2RhZGRyLnM2X2FkZHIpOworCQlwICs9IHNwcmludGYocCwgIiAgICAgZGFkZHI6ICVzICBtaW5fZGFkZHI6ICVzICBtYXhfZGFkZHI6ICVzXG4iLCBiMSwgYjIsIGIzKTsKKworCX0gCisJZWxzZSAKKwkJcCArPSBzcHJpbnRmKHAsICIgICAgIGRzdF9taW46ICVzICBkc3RfbWF4OiAlc1xuICAgICBzcmNfbWluOiAlcyAgc3JjX21heDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5kc3RfbWluLCBwa3RfZGV2LT5kc3RfbWF4LCBwa3RfZGV2LT5zcmNfbWluLCBwa3RfZGV2LT5zcmNfbWF4KTsKKworICAgICAgICBwICs9IHNwcmludGYocCwgIiAgICAgc3JjX21hYzogIik7CisKKwlpZiAoKHBrdF9kZXYtPnNyY19tYWNbMF0gPT0gMCkgJiYgCisJICAgIChwa3RfZGV2LT5zcmNfbWFjWzFdID09IDApICYmIAorCSAgICAocGt0X2Rldi0+c3JjX21hY1syXSA9PSAwKSAmJiAKKwkgICAgKHBrdF9kZXYtPnNyY19tYWNbM10gPT0gMCkgJiYgCisJICAgIChwa3RfZGV2LT5zcmNfbWFjWzRdID09IDApICYmIAorCSAgICAocGt0X2Rldi0+c3JjX21hY1s1XSA9PSAwKSkgCisKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgCisJCQlwICs9IHNwcmludGYocCwgIiUwMlglcyIsIHBrdF9kZXYtPm9kZXYtPmRldl9hZGRyW2ldLCBpID09IDUgPyAiICAiIDogIjoiKTsKKworCWVsc2UgCisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIAorCQkJcCArPSBzcHJpbnRmKHAsICIlMDJYJXMiLCBwa3RfZGV2LT5zcmNfbWFjW2ldLCBpID09IDUgPyAiICAiIDogIjoiKTsKKworICAgICAgICBwICs9IHNwcmludGYocCwgImRzdF9tYWM6ICIpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIAorCQlwICs9IHNwcmludGYocCwgIiUwMlglcyIsIHBrdF9kZXYtPmRzdF9tYWNbaV0sIGkgPT0gNSA/ICJcbiIgOiAiOiIpOworCisgICAgICAgIHAgKz0gc3ByaW50ZihwLCAiICAgICB1ZHBfc3JjX21pbjogJWQgIHVkcF9zcmNfbWF4OiAlZCAgdWRwX2RzdF9taW46ICVkICB1ZHBfZHN0X21heDogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT51ZHBfc3JjX21pbiwgcGt0X2Rldi0+dWRwX3NyY19tYXgsIHBrdF9kZXYtPnVkcF9kc3RfbWluLAorICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+dWRwX2RzdF9tYXgpOworCisgICAgICAgIHAgKz0gc3ByaW50ZihwLCAiICAgICBzcmNfbWFjX2NvdW50OiAlZCAgZHN0X21hY19jb3VudDogJWQgXG4gICAgIEZsYWdzOiAiLAorICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+c3JjX21hY19jb3VudCwgcGt0X2Rldi0+ZHN0X21hY19jb3VudCk7CisKKworICAgICAgICBpZiAocGt0X2Rldi0+ZmxhZ3MgJiAgRl9JUFY2KSAKKyAgICAgICAgICAgICAgICBwICs9IHNwcmludGYocCwgIklQVjYgICIpOworCisgICAgICAgIGlmIChwa3RfZGV2LT5mbGFncyAmICBGX0lQU1JDX1JORCkgCisgICAgICAgICAgICAgICAgcCArPSBzcHJpbnRmKHAsICJJUFNSQ19STkQgICIpOworCisgICAgICAgIGlmIChwa3RfZGV2LT5mbGFncyAmIEZfSVBEU1RfUk5EKSAKKyAgICAgICAgICAgICAgICBwICs9IHNwcmludGYocCwgIklQRFNUX1JORCAgIik7CisgICAgICAgIAorICAgICAgICBpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX1RYU0laRV9STkQpIAorICAgICAgICAgICAgICAgIHAgKz0gc3ByaW50ZihwLCAiVFhTSVpFX1JORCAgIik7CisgICAgICAgIAorICAgICAgICBpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX1VEUFNSQ19STkQpIAorICAgICAgICAgICAgICAgIHAgKz0gc3ByaW50ZihwLCAiVURQU1JDX1JORCAgIik7CisgICAgICAgIAorICAgICAgICBpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX1VEUERTVF9STkQpIAorICAgICAgICAgICAgICAgIHAgKz0gc3ByaW50ZihwLCAiVURQRFNUX1JORCAgIik7CisgICAgICAgIAorICAgICAgICBpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX01BQ1NSQ19STkQpIAorICAgICAgICAgICAgICAgIHAgKz0gc3ByaW50ZihwLCAiTUFDU1JDX1JORCAgIik7CisgICAgICAgIAorICAgICAgICBpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX01BQ0RTVF9STkQpIAorICAgICAgICAgICAgICAgIHAgKz0gc3ByaW50ZihwLCAiTUFDRFNUX1JORCAgIik7CisKKyAgICAgICAgCisgICAgICAgIHAgKz0gc3ByaW50ZihwLCAiXG4iKTsKKyAgICAgICAgCisgICAgICAgIHNhID0gcGt0X2Rldi0+c3RhcnRlZF9hdDsKKyAgICAgICAgc3RvcHBlZCA9IHBrdF9kZXYtPnN0b3BwZWRfYXQ7CisgICAgICAgIGlmIChwa3RfZGV2LT5ydW5uaW5nKSAKKyAgICAgICAgICAgICAgICBzdG9wcGVkID0gbm93OyAvKiBub3QgcmVhbGx5IHN0b3BwZWQsIG1vcmUgbGlrZSBsYXN0LXJ1bm5pbmctYXQgKi8KKyAgICAgICAgCisgICAgICAgIHAgKz0gc3ByaW50ZihwLCAiQ3VycmVudDpcbiAgICAgcGt0cy1zb2ZhcjogJWxsdSAgZXJyb3JzOiAlbGx1XG4gICAgIHN0YXJ0ZWQ6ICVsbHV1cyAgc3RvcHBlZDogJWxsdXVzIGlkbGU6ICVsbHV1c1xuIiwKKwkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwa3RfZGV2LT5zb2ZhciwKKwkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwa3RfZGV2LT5lcnJvcnMsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc2EsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RvcHBlZCwgCisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0X2Rldi0+aWRsZV9hY2MpOworCisgICAgICAgIHAgKz0gc3ByaW50ZihwLCAiICAgICBzZXFfbnVtOiAlZCAgY3VyX2RzdF9tYWNfb2Zmc2V0OiAlZCAgY3VyX3NyY19tYWNfb2Zmc2V0OiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPnNlcV9udW0sIHBrdF9kZXYtPmN1cl9kc3RfbWFjX29mZnNldCwgcGt0X2Rldi0+Y3VyX3NyY19tYWNfb2Zmc2V0KTsKKworCWlmKHBrdF9kZXYtPmZsYWdzICYgRl9JUFY2KSB7CisJCWNoYXIgYjFbMTI4XSwgYjJbMTI4XTsKKwkJZm10X2lwNihiMSwgIHBrdF9kZXYtPmN1cl9pbjZfZGFkZHIuczZfYWRkcik7CisJCWZtdF9pcDYoYjIsICBwa3RfZGV2LT5jdXJfaW42X3NhZGRyLnM2X2FkZHIpOworCQlwICs9IHNwcmludGYocCwgIiAgICAgY3VyX3NhZGRyOiAlcyAgY3VyX2RhZGRyOiAlc1xuIiwgYjIsIGIxKTsKKwl9IAorCWVsc2UgCisJCXAgKz0gc3ByaW50ZihwLCAiICAgICBjdXJfc2FkZHI6IDB4JXggIGN1cl9kYWRkcjogMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmN1cl9zYWRkciwgcGt0X2Rldi0+Y3VyX2RhZGRyKTsKKworCisJcCArPSBzcHJpbnRmKHAsICIgICAgIGN1cl91ZHBfZHN0OiAlZCAgY3VyX3VkcF9zcmM6ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX3VkcF9kc3QsIHBrdF9kZXYtPmN1cl91ZHBfc3JjKTsKKworCXAgKz0gc3ByaW50ZihwLCAiICAgICBmbG93czogJXVcbiIsIHBrdF9kZXYtPm5mbG93cyk7CisKKwlpZiAocGt0X2Rldi0+cmVzdWx0WzBdKQorCQlwICs9IHNwcmludGYocCwgIlJlc3VsdDogJXNcbiIsIHBrdF9kZXYtPnJlc3VsdCk7CisJZWxzZQorCQlwICs9IHNwcmludGYocCwgIlJlc3VsdDogSWRsZVxuIik7CisJKmVvZiA9IDE7CisKKwlyZXR1cm4gcCAtIGJ1ZjsKK30KKworCitzdGF0aWMgaW50IGNvdW50X3RyYWlsX2NoYXJzKGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZmZlciwgdW5zaWduZWQgaW50IG1heGxlbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBtYXhsZW47IGkrKykgeworICAgICAgICAgICAgICAgIGNoYXIgYzsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIoYywgJnVzZXJfYnVmZmVyW2ldKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgeworCQljYXNlICdcIic6CisJCWNhc2UgJ1xuJzoKKwkJY2FzZSAnXHInOgorCQljYXNlICdcdCc6CisJCWNhc2UgJyAnOgorCQljYXNlICc9JzoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBkb25lOworCQl9OworCX0KK2RvbmU6CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG51bV9hcmcoY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmZmVyLCB1bnNpZ25lZCBsb25nIG1heGxlbiwgCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgKm51bSkKK3sKKwlpbnQgaSA9IDA7CisJKm51bSA9IDA7CisgIAorCWZvcig7IGkgPCBtYXhsZW47IGkrKykgeworICAgICAgICAgICAgICAgIGNoYXIgYzsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIoYywgJnVzZXJfYnVmZmVyW2ldKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICAgICAgICAgIGlmICgoYyA+PSAnMCcpICYmIChjIDw9ICc5JykpIHsKKwkJCSpudW0gKj0gMTA7CisJCQkqbnVtICs9IGMgLScwJzsKKwkJfSBlbHNlCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgc3Rybl9sZW4oY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmZmVyLCB1bnNpZ25lZCBpbnQgbWF4bGVuKQoreworCWludCBpID0gMDsKKworCWZvcig7IGkgPCBtYXhsZW47IGkrKykgeworICAgICAgICAgICAgICAgIGNoYXIgYzsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIoYywgJnVzZXJfYnVmZmVyW2ldKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgeworCQljYXNlICdcIic6CisJCWNhc2UgJ1xuJzoKKwkJY2FzZSAnXHInOgorCQljYXNlICdcdCc6CisJCWNhc2UgJyAnOgorCQkJZ290byBkb25lX3N0cjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX07CisJfQorZG9uZV9zdHI6CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBwcm9jX2lmX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgaSA9IDAsIG1heCwgbGVuOworCWNoYXIgbmFtZVsxNl0sIHZhbHN0clszMl07CisJdW5zaWduZWQgbG9uZyB2YWx1ZSA9IDA7CisgICAgICAgIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2ID0gKHN0cnVjdCBwa3RnZW5fZGV2KikoZGF0YSk7CisgICAgICAgIGNoYXIqIHBnX3Jlc3VsdCA9IE5VTEw7CisgICAgICAgIGludCB0bXAgPSAwOworCWNoYXIgYnVmWzEyOF07CisgICAgICAgIAorICAgICAgICBwZ19yZXN1bHQgPSAmKHBrdF9kZXYtPnJlc3VsdFswXSk7CisgICAgICAgIAorCWlmIChjb3VudCA8IDEpIHsKKwkJcHJpbnRrKCJwa3RnZW46IHdyb25nIGNvbW1hbmQgZm9ybWF0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorICAKKwltYXggPSBjb3VudCAtIGk7CisJdG1wID0gY291bnRfdHJhaWxfY2hhcnMoJnVzZXJfYnVmZmVyW2ldLCBtYXgpOworICAgICAgICBpZiAodG1wIDwgMCkgeyAKKwkJcHJpbnRrKCJwa3RnZW46IGlsbGVnYWwgZm9ybWF0XG4iKTsKKwkJcmV0dXJuIHRtcDsgCisJfQorICAgICAgICBpICs9IHRtcDsKKyAgICAgICAgCisJLyogUmVhZCB2YXJpYWJsZSBuYW1lICovCisKKwlsZW4gPSBzdHJuX2xlbigmdXNlcl9idWZmZXJbaV0sIHNpemVvZihuYW1lKSAtIDEpOworICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CisJbWVtc2V0KG5hbWUsIDAsIHNpemVvZihuYW1lKSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKG5hbWUsICZ1c2VyX2J1ZmZlcltpXSwgbGVuKSApCisJCXJldHVybiAtRUZBVUxUOworCWkgKz0gbGVuOworICAKKwltYXggPSBjb3VudCAtaTsKKwlsZW4gPSBjb3VudF90cmFpbF9jaGFycygmdXNlcl9idWZmZXJbaV0sIG1heCk7CisgICAgICAgIGlmIChsZW4gPCAwKSAKKyAgICAgICAgICAgICAgICByZXR1cm4gbGVuOworICAgICAgICAKKwlpICs9IGxlbjsKKworCWlmIChkZWJ1ZykgeworICAgICAgICAgICAgICAgIGNoYXIgdGJbY291bnQgKyAxXTsKKyAgICAgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIodGIsIHVzZXJfYnVmZmVyLCBjb3VudCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgICAgICAgICB0Yltjb3VudF0gPSAwOworCQlwcmludGsoInBrdGdlbjogJXMsJWx1ICBidWZmZXIgLTolczotXG4iLCBuYW1lLCBjb3VudCwgdGIpOworICAgICAgICB9CisKKwlpZiAoIXN0cmNtcChuYW1lLCAibWluX3BrdF9zaXplIikpIHsKKwkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KKwkJaSArPSBsZW47CisJCWlmICh2YWx1ZSA8IDE0KzIwKzgpCisJCQl2YWx1ZSA9IDE0KzIwKzg7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IHBrdF9kZXYtPm1pbl9wa3Rfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+bWluX3BrdF9zaXplID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfcGt0X3NpemUgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IG1pbl9wa3Rfc2l6ZT0ldSIsIHBrdF9kZXYtPm1pbl9wa3Rfc2l6ZSk7CisJCXJldHVybiBjb3VudDsKKwl9CisKKyAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIm1heF9wa3Rfc2l6ZSIpKSB7CisJCWxlbiA9IG51bV9hcmcoJnVzZXJfYnVmZmVyW2ldLCAxMCwgJnZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CisJCWkgKz0gbGVuOworCQlpZiAodmFsdWUgPCAxNCsyMCs4KQorCQkJdmFsdWUgPSAxNCsyMCs4OworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBwa3RfZGV2LT5tYXhfcGt0X3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPm1heF9wa3Rfc2l6ZSA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX3BrdF9zaXplID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBtYXhfcGt0X3NpemU9JXUiLCBwa3RfZGV2LT5tYXhfcGt0X3NpemUpOworCQlyZXR1cm4gY291bnQ7CisJfQorCisgICAgICAgIC8qIFNob3J0Y3V0IGZvciBtaW4gPSBtYXggKi8KKworCWlmICghc3RyY21wKG5hbWUsICJwa3Rfc2l6ZSIpKSB7CisJCWxlbiA9IG51bV9hcmcoJnVzZXJfYnVmZmVyW2ldLCAxMCwgJnZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CisJCWkgKz0gbGVuOworCQlpZiAodmFsdWUgPCAxNCsyMCs4KQorCQkJdmFsdWUgPSAxNCsyMCs4OworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBwa3RfZGV2LT5taW5fcGt0X3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPm1pbl9wa3Rfc2l6ZSA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+bWF4X3BrdF9zaXplID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfcGt0X3NpemUgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IHBrdF9zaXplPSV1IiwgcGt0X2Rldi0+bWluX3BrdF9zaXplKTsKKwkJcmV0dXJuIGNvdW50OworCX0KKworICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiZGVidWciKSkgeworCQlsZW4gPSBudW1fYXJnKCZ1c2VyX2J1ZmZlcltpXSwgMTAsICZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQorCQlpICs9IGxlbjsKKyAgICAgICAgICAgICAgICBkZWJ1ZyA9IHZhbHVlOworCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBkZWJ1Zz0ldSIsIGRlYnVnKTsKKwkJcmV0dXJuIGNvdW50OworCX0KKworICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiZnJhZ3MiKSkgeworCQlsZW4gPSBudW1fYXJnKCZ1c2VyX2J1ZmZlcltpXSwgMTAsICZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQorCQlpICs9IGxlbjsKKwkJcGt0X2Rldi0+bmZyYWdzID0gdmFsdWU7CisJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGZyYWdzPSV1IiwgcGt0X2Rldi0+bmZyYWdzKTsKKwkJcmV0dXJuIGNvdW50OworCX0KKwlpZiAoIXN0cmNtcChuYW1lLCAiZGVsYXkiKSkgeworCQlsZW4gPSBudW1fYXJnKCZ1c2VyX2J1ZmZlcltpXSwgMTAsICZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQorCQlpICs9IGxlbjsKKwkJaWYgKHZhbHVlID09IDB4N0ZGRkZGRkYpIHsKKwkJCXBrdF9kZXYtPmRlbGF5X3VzID0gMHg3RkZGRkZGRjsKKwkJCXBrdF9kZXYtPmRlbGF5X25zID0gMDsKKwkJfSBlbHNlIHsKKwkJCXBrdF9kZXYtPmRlbGF5X3VzID0gdmFsdWUgLyAxMDAwOworCQkJcGt0X2Rldi0+ZGVsYXlfbnMgPSB2YWx1ZSAlIDEwMDA7CisJCX0KKwkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogZGVsYXk9JXUiLCAxMDAwKnBrdF9kZXYtPmRlbGF5X3VzK3BrdF9kZXYtPmRlbGF5X25zKTsKKwkJcmV0dXJuIGNvdW50OworCX0KKyAJaWYgKCFzdHJjbXAobmFtZSwgInVkcF9zcmNfbWluIikpIHsKKwkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KKwkJaSArPSBsZW47CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IHBrdF9kZXYtPnVkcF9zcmNfbWluKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT51ZHBfc3JjX21pbiA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX3VkcF9zcmMgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9ICAgICAgIAorCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiB1ZHBfc3JjX21pbj0ldSIsIHBrdF9kZXYtPnVkcF9zcmNfbWluKTsKKwkJcmV0dXJuIGNvdW50OworCX0KKyAJaWYgKCFzdHJjbXAobmFtZSwgInVkcF9kc3RfbWluIikpIHsKKwkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KKwkJaSArPSBsZW47CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IHBrdF9kZXYtPnVkcF9kc3RfbWluKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT51ZHBfZHN0X21pbiA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX3VkcF9kc3QgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IHVkcF9kc3RfbWluPSV1IiwgcGt0X2Rldi0+dWRwX2RzdF9taW4pOworCQlyZXR1cm4gY291bnQ7CisJfQorIAlpZiAoIXN0cmNtcChuYW1lLCAidWRwX3NyY19tYXgiKSkgeworCQlsZW4gPSBudW1fYXJnKCZ1c2VyX2J1ZmZlcltpXSwgMTAsICZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQorCQlpICs9IGxlbjsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gcGt0X2Rldi0+dWRwX3NyY19tYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPnVkcF9zcmNfbWF4ID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfdWRwX3NyYyA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0KKwkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogdWRwX3NyY19tYXg9JXUiLCBwa3RfZGV2LT51ZHBfc3JjX21heCk7CisJCXJldHVybiBjb3VudDsKKwl9CisgCWlmICghc3RyY21wKG5hbWUsICJ1ZHBfZHN0X21heCIpKSB7CisJCWxlbiA9IG51bV9hcmcoJnVzZXJfYnVmZmVyW2ldLCAxMCwgJnZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CisJCWkgKz0gbGVuOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBwa3RfZGV2LT51ZHBfZHN0X21heCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+dWRwX2RzdF9tYXggPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmN1cl91ZHBfZHN0ID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiB1ZHBfZHN0X21heD0ldSIsIHBrdF9kZXYtPnVkcF9kc3RfbWF4KTsKKwkJcmV0dXJuIGNvdW50OworCX0KKwlpZiAoIXN0cmNtcChuYW1lLCAiY2xvbmVfc2tiIikpIHsKKwkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KKwkJaSArPSBsZW47CisgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y2xvbmVfc2tiID0gdmFsdWU7CisJCisJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGNsb25lX3NrYj0lZCIsIHBrdF9kZXYtPmNsb25lX3NrYik7CisJCXJldHVybiBjb3VudDsKKwl9CisJaWYgKCFzdHJjbXAobmFtZSwgImNvdW50IikpIHsKKwkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KKwkJaSArPSBsZW47CisJCXBrdF9kZXYtPmNvdW50ID0gdmFsdWU7CisJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGNvdW50PSVsbHUiLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0X2Rldi0+Y291bnQpOworCQlyZXR1cm4gY291bnQ7CisJfQorCWlmICghc3RyY21wKG5hbWUsICJzcmNfbWFjX2NvdW50IikpIHsKKwkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KKwkJaSArPSBsZW47CisJCWlmIChwa3RfZGV2LT5zcmNfbWFjX2NvdW50ICE9IHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5zcmNfbWFjX2NvdW50ID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfc3JjX21hY19vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIH0KKwkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogc3JjX21hY19jb3VudD0lZCIsIHBrdF9kZXYtPnNyY19tYWNfY291bnQpOworCQlyZXR1cm4gY291bnQ7CisJfQorCWlmICghc3RyY21wKG5hbWUsICJkc3RfbWFjX2NvdW50IikpIHsKKwkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KKwkJaSArPSBsZW47CisJCWlmIChwa3RfZGV2LT5kc3RfbWFjX2NvdW50ICE9IHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5kc3RfbWFjX2NvdW50ID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfZHN0X21hY19vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIH0KKwkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogZHN0X21hY19jb3VudD0lZCIsIHBrdF9kZXYtPmRzdF9tYWNfY291bnQpOworCQlyZXR1cm4gY291bnQ7CisJfQorCWlmICghc3RyY21wKG5hbWUsICJmbGFnIikpIHsKKyAgICAgICAgICAgICAgICBjaGFyIGZbMzJdOworICAgICAgICAgICAgICAgIG1lbXNldChmLCAwLCAzMik7CisJCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKGYpIC0gMSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQorCQlpZiAoY29weV9mcm9tX3VzZXIoZiwgJnVzZXJfYnVmZmVyW2ldLCBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWkgKz0gbGVuOworICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoZiwgIklQU1JDX1JORCIpID09IDApIAorICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+ZmxhZ3MgfD0gRl9JUFNSQ19STkQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGYsICIhSVBTUkNfUk5EIikgPT0gMCkgCisgICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5mbGFncyAmPSB+Rl9JUFNSQ19STkQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGYsICJUWFNJWkVfUk5EIikgPT0gMCkgCisgICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5mbGFncyB8PSBGX1RYU0laRV9STkQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGYsICIhVFhTSVpFX1JORCIpID09IDApIAorICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+ZmxhZ3MgJj0gfkZfVFhTSVpFX1JORDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoZiwgIklQRFNUX1JORCIpID09IDApIAorICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+ZmxhZ3MgfD0gRl9JUERTVF9STkQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGYsICIhSVBEU1RfUk5EIikgPT0gMCkgCisgICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5mbGFncyAmPSB+Rl9JUERTVF9STkQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGYsICJVRFBTUkNfUk5EIikgPT0gMCkgCisgICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5mbGFncyB8PSBGX1VEUFNSQ19STkQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGYsICIhVURQU1JDX1JORCIpID09IDApIAorICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+ZmxhZ3MgJj0gfkZfVURQU1JDX1JORDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoZiwgIlVEUERTVF9STkQiKSA9PSAwKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmZsYWdzIHw9IEZfVURQRFNUX1JORDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoZiwgIiFVRFBEU1RfUk5EIikgPT0gMCkgCisgICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5mbGFncyAmPSB+Rl9VRFBEU1RfUk5EOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChmLCAiTUFDU1JDX1JORCIpID09IDApIAorICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+ZmxhZ3MgfD0gRl9NQUNTUkNfUk5EOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChmLCAiIU1BQ1NSQ19STkQiKSA9PSAwKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmZsYWdzICY9IH5GX01BQ1NSQ19STkQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGYsICJNQUNEU1RfUk5EIikgPT0gMCkgCisgICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5mbGFncyB8PSBGX01BQ0RTVF9STkQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGYsICIhTUFDRFNUX1JORCIpID09IDApIAorICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+ZmxhZ3MgJj0gfkZfTUFDRFNUX1JORDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYocGdfcmVzdWx0LCAiRmxhZyAtOiVzOi0gdW5rbm93blxuQXZhaWxhYmxlIGZsYWdzLCAocHJlcGVuZCAhIHRvIHVuLXNldCBmbGFnKTpcbiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklQU1JDX1JORCwgSVBEU1RfUk5ELCBUWFNJWkVfUk5ELCBVRFBTUkNfUk5ELCBVRFBEU1RfUk5ELCBNQUNTUkNfUk5ELCBNQUNEU1RfUk5EXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsKKyAgICAgICAgICAgICAgICB9CisJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGZsYWdzPTB4JXgiLCBwa3RfZGV2LT5mbGFncyk7CisJCXJldHVybiBjb3VudDsKKwl9CisJaWYgKCFzdHJjbXAobmFtZSwgImRzdF9taW4iKSB8fCAhc3RyY21wKG5hbWUsICJkc3QiKSkgeworCQlsZW4gPSBzdHJuX2xlbigmdXNlcl9idWZmZXJbaV0sIHNpemVvZihwa3RfZGV2LT5kc3RfbWluKSAtIDEpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KKworICAgICAgICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcihidWYsICZ1c2VyX2J1ZmZlcltpXSwgbGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworICAgICAgICAgICAgICAgIGJ1ZltsZW5dID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGJ1ZiwgcGt0X2Rldi0+ZHN0X21pbikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHBrdF9kZXYtPmRzdF9taW4sIDAsIHNpemVvZihwa3RfZGV2LT5kc3RfbWluKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KHBrdF9kZXYtPmRzdF9taW4sIGJ1ZiwgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmRhZGRyX21pbiA9IGluX2F0b24ocGt0X2Rldi0+ZHN0X21pbik7CisgICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfZGFkZHIgPSBwa3RfZGV2LT5kYWRkcl9taW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKGRlYnVnKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJwa3RnZW46IGRzdF9taW4gc2V0IHRvOiAlc1xuIiwgcGt0X2Rldi0+ZHN0X21pbik7CisgICAgICAgICAgICAgICAgaSArPSBsZW47CisJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGRzdF9taW49JXMiLCBwa3RfZGV2LT5kc3RfbWluKTsKKwkJcmV0dXJuIGNvdW50OworCX0KKwlpZiAoIXN0cmNtcChuYW1lLCAiZHN0X21heCIpKSB7CisJCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKHBrdF9kZXYtPmRzdF9tYXgpIC0gMSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQorCisgICAgICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgJnVzZXJfYnVmZmVyW2ldLCBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKyAgICAgICAgICAgICAgICBidWZbbGVuXSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChidWYsIHBrdF9kZXYtPmRzdF9tYXgpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChwa3RfZGV2LT5kc3RfbWF4LCAwLCBzaXplb2YocGt0X2Rldi0+ZHN0X21heCkpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNweShwa3RfZGV2LT5kc3RfbWF4LCBidWYsIGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5kYWRkcl9tYXggPSBpbl9hdG9uKHBrdF9kZXYtPmRzdF9tYXgpOworICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX2RhZGRyID0gcGt0X2Rldi0+ZGFkZHJfbWF4OworICAgICAgICAgICAgICAgIH0KKwkJaWYoZGVidWcpCisJCQlwcmludGsoInBrdGdlbjogZHN0X21heCBzZXQgdG86ICVzXG4iLCBwa3RfZGV2LT5kc3RfbWF4KTsKKwkJaSArPSBsZW47CisJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGRzdF9tYXg9JXMiLCBwa3RfZGV2LT5kc3RfbWF4KTsKKwkJcmV0dXJuIGNvdW50OworCX0KKwlpZiAoIXN0cmNtcChuYW1lLCAiZHN0NiIpKSB7CisJCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKGJ1ZikgLSAxKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgcmV0dXJuIGxlbjsgCisKKwkJcGt0X2Rldi0+ZmxhZ3MgfD0gRl9JUFY2OworCisgICAgICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgJnVzZXJfYnVmZmVyW2ldLCBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgYnVmW2xlbl0gPSAwOworCisJCXNjYW5faXA2KGJ1ZiwgcGt0X2Rldi0+aW42X2RhZGRyLnM2X2FkZHIpOworCQlmbXRfaXA2KGJ1ZiwgIHBrdF9kZXYtPmluNl9kYWRkci5zNl9hZGRyKTsKKworCQlpcHY2X2FkZHJfY29weSgmcGt0X2Rldi0+Y3VyX2luNl9kYWRkciwgJnBrdF9kZXYtPmluNl9kYWRkcik7CisKKyAgICAgICAgICAgICAgICBpZihkZWJ1ZykgCisJCQlwcmludGsoInBrdGdlbjogZHN0NiBzZXQgdG86ICVzXG4iLCBidWYpOworCisgICAgICAgICAgICAgICAgaSArPSBsZW47CisJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGRzdDY9JXMiLCBidWYpOworCQlyZXR1cm4gY291bnQ7CisJfQorCWlmICghc3RyY21wKG5hbWUsICJkc3Q2X21pbiIpKSB7CisJCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKGJ1ZikgLSAxKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgcmV0dXJuIGxlbjsgCisKKwkJcGt0X2Rldi0+ZmxhZ3MgfD0gRl9JUFY2OworCisgICAgICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgJnVzZXJfYnVmZmVyW2ldLCBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgYnVmW2xlbl0gPSAwOworCisJCXNjYW5faXA2KGJ1ZiwgcGt0X2Rldi0+bWluX2luNl9kYWRkci5zNl9hZGRyKTsKKwkJZm10X2lwNihidWYsICBwa3RfZGV2LT5taW5faW42X2RhZGRyLnM2X2FkZHIpOworCisJCWlwdjZfYWRkcl9jb3B5KCZwa3RfZGV2LT5jdXJfaW42X2RhZGRyLCAmcGt0X2Rldi0+bWluX2luNl9kYWRkcik7CisgICAgICAgICAgICAgICAgaWYoZGVidWcpIAorCQkJcHJpbnRrKCJwa3RnZW46IGRzdDZfbWluIHNldCB0bzogJXNcbiIsIGJ1Zik7CisKKyAgICAgICAgICAgICAgICBpICs9IGxlbjsKKwkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogZHN0Nl9taW49JXMiLCBidWYpOworCQlyZXR1cm4gY291bnQ7CisJfQorCWlmICghc3RyY21wKG5hbWUsICJkc3Q2X21heCIpKSB7CisJCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKGJ1ZikgLSAxKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgcmV0dXJuIGxlbjsgCisKKwkJcGt0X2Rldi0+ZmxhZ3MgfD0gRl9JUFY2OworCisgICAgICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgJnVzZXJfYnVmZmVyW2ldLCBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgYnVmW2xlbl0gPSAwOworCisJCXNjYW5faXA2KGJ1ZiwgcGt0X2Rldi0+bWF4X2luNl9kYWRkci5zNl9hZGRyKTsKKwkJZm10X2lwNihidWYsICBwa3RfZGV2LT5tYXhfaW42X2RhZGRyLnM2X2FkZHIpOworCisgICAgICAgICAgICAgICAgaWYoZGVidWcpIAorCQkJcHJpbnRrKCJwa3RnZW46IGRzdDZfbWF4IHNldCB0bzogJXNcbiIsIGJ1Zik7CisKKyAgICAgICAgICAgICAgICBpICs9IGxlbjsKKwkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogZHN0Nl9tYXg9JXMiLCBidWYpOworCQlyZXR1cm4gY291bnQ7CisJfQorCWlmICghc3RyY21wKG5hbWUsICJzcmM2IikpIHsKKwkJbGVuID0gc3Rybl9sZW4oJnVzZXJfYnVmZmVyW2ldLCBzaXplb2YoYnVmKSAtIDEpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSByZXR1cm4gbGVuOyAKKworCQlwa3RfZGV2LT5mbGFncyB8PSBGX0lQVjY7CisKKyAgICAgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoYnVmLCAmdXNlcl9idWZmZXJbaV0sIGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgICAgICAgICBidWZbbGVuXSA9IDA7CisKKwkJc2Nhbl9pcDYoYnVmLCBwa3RfZGV2LT5pbjZfc2FkZHIuczZfYWRkcik7CisJCWZtdF9pcDYoYnVmLCAgcGt0X2Rldi0+aW42X3NhZGRyLnM2X2FkZHIpOworCisJCWlwdjZfYWRkcl9jb3B5KCZwa3RfZGV2LT5jdXJfaW42X3NhZGRyLCAmcGt0X2Rldi0+aW42X3NhZGRyKTsKKworICAgICAgICAgICAgICAgIGlmKGRlYnVnKSAKKwkJCXByaW50aygicGt0Z2VuOiBzcmM2IHNldCB0bzogJXNcbiIsIGJ1Zik7CisJCQorICAgICAgICAgICAgICAgIGkgKz0gbGVuOworCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBzcmM2PSVzIiwgYnVmKTsKKwkJcmV0dXJuIGNvdW50OworCX0KKwlpZiAoIXN0cmNtcChuYW1lLCAic3JjX21pbiIpKSB7CisJCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKHBrdF9kZXYtPnNyY19taW4pIC0gMSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQorICAgICAgICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcihidWYsICZ1c2VyX2J1ZmZlcltpXSwgbGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworICAgICAgICAgICAgICAgIGJ1ZltsZW5dID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGJ1ZiwgcGt0X2Rldi0+c3JjX21pbikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHBrdF9kZXYtPnNyY19taW4sIDAsIHNpemVvZihwa3RfZGV2LT5zcmNfbWluKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KHBrdF9kZXYtPnNyY19taW4sIGJ1ZiwgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPnNhZGRyX21pbiA9IGluX2F0b24ocGt0X2Rldi0+c3JjX21pbik7CisgICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfc2FkZHIgPSBwa3RfZGV2LT5zYWRkcl9taW47CisgICAgICAgICAgICAgICAgfQorCQlpZihkZWJ1ZykKKwkJCXByaW50aygicGt0Z2VuOiBzcmNfbWluIHNldCB0bzogJXNcbiIsIHBrdF9kZXYtPnNyY19taW4pOworCQlpICs9IGxlbjsKKwkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogc3JjX21pbj0lcyIsIHBrdF9kZXYtPnNyY19taW4pOworCQlyZXR1cm4gY291bnQ7CisJfQorCWlmICghc3RyY21wKG5hbWUsICJzcmNfbWF4IikpIHsKKwkJbGVuID0gc3Rybl9sZW4oJnVzZXJfYnVmZmVyW2ldLCBzaXplb2YocGt0X2Rldi0+c3JjX21heCkgLSAxKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CisgICAgICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgJnVzZXJfYnVmZmVyW2ldLCBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgYnVmW2xlbl0gPSAwOworICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoYnVmLCBwa3RfZGV2LT5zcmNfbWF4KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQocGt0X2Rldi0+c3JjX21heCwgMCwgc2l6ZW9mKHBrdF9kZXYtPnNyY19tYXgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkocGt0X2Rldi0+c3JjX21heCwgYnVmLCBsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+c2FkZHJfbWF4ID0gaW5fYXRvbihwa3RfZGV2LT5zcmNfbWF4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmN1cl9zYWRkciA9IHBrdF9kZXYtPnNhZGRyX21heDsKKyAgICAgICAgICAgICAgICB9CisJCWlmKGRlYnVnKQorCQkJcHJpbnRrKCJwa3RnZW46IHNyY19tYXggc2V0IHRvOiAlc1xuIiwgcGt0X2Rldi0+c3JjX21heCk7CisJCWkgKz0gbGVuOworCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBzcmNfbWF4PSVzIiwgcGt0X2Rldi0+c3JjX21heCk7CisJCXJldHVybiBjb3VudDsKKwl9CisJaWYgKCFzdHJjbXAobmFtZSwgImRzdF9tYWMiKSkgeworCQljaGFyICp2ID0gdmFsc3RyOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgb2xkX2RtYWNbNl07CisJCXVuc2lnbmVkIGNoYXIgKm0gPSBwa3RfZGV2LT5kc3RfbWFjOworICAgICAgICAgICAgICAgIG1lbWNweShvbGRfZG1hYywgcGt0X2Rldi0+ZHN0X21hYywgNik7CisgICAgICAgICAgICAgICAgCisJCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKHZhbHN0cikgLSAxKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CisJCW1lbXNldCh2YWxzdHIsIDAsIHNpemVvZih2YWxzdHIpKTsKKwkJaWYoIGNvcHlfZnJvbV91c2VyKHZhbHN0ciwgJnVzZXJfYnVmZmVyW2ldLCBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWkgKz0gbGVuOworCisJCWZvcigqbSA9IDA7KnYgJiYgbSA8IHBrdF9kZXYtPmRzdF9tYWMgKyA2OyB2KyspIHsKKwkJCWlmICgqdiA+PSAnMCcgJiYgKnYgPD0gJzknKSB7CisJCQkJKm0gKj0gMTY7CisJCQkJKm0gKz0gKnYgLSAnMCc7CisJCQl9CisJCQlpZiAoKnYgPj0gJ0EnICYmICp2IDw9ICdGJykgeworCQkJCSptICo9IDE2OworCQkJCSptICs9ICp2IC0gJ0EnICsgMTA7CisJCQl9CisJCQlpZiAoKnYgPj0gJ2EnICYmICp2IDw9ICdmJykgeworCQkJCSptICo9IDE2OworCQkJCSptICs9ICp2IC0gJ2EnICsgMTA7CisJCQl9CisJCQlpZiAoKnYgPT0gJzonKSB7CisJCQkJbSsrOworCQkJCSptID0gMDsKKwkJCX0KKwkJfQorCisJCS8qIFNldCB1cCBEZXN0IE1BQyAqLworICAgICAgICAgICAgICAgIGlmIChtZW1jbXAob2xkX2RtYWMsIHBrdF9kZXYtPmRzdF9tYWMsIDYpICE9IDApIAorICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCYocGt0X2Rldi0+aGhbMF0pLCBwa3RfZGV2LT5kc3RfbWFjLCA2KTsKKyAgICAgICAgICAgICAgICAKKwkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogZHN0bWFjIik7CisJCXJldHVybiBjb3VudDsKKwl9CisJaWYgKCFzdHJjbXAobmFtZSwgInNyY19tYWMiKSkgeworCQljaGFyICp2ID0gdmFsc3RyOworCQl1bnNpZ25lZCBjaGFyICptID0gcGt0X2Rldi0+c3JjX21hYzsKKworCQlsZW4gPSBzdHJuX2xlbigmdXNlcl9idWZmZXJbaV0sIHNpemVvZih2YWxzdHIpIC0gMSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQorCQltZW1zZXQodmFsc3RyLCAwLCBzaXplb2YodmFsc3RyKSk7CisJCWlmKCBjb3B5X2Zyb21fdXNlcih2YWxzdHIsICZ1c2VyX2J1ZmZlcltpXSwgbGVuKSkgCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaSArPSBsZW47CisKKwkJZm9yKCptID0gMDsqdiAmJiBtIDwgcGt0X2Rldi0+c3JjX21hYyArIDY7IHYrKykgeworCQkJaWYgKCp2ID49ICcwJyAmJiAqdiA8PSAnOScpIHsKKwkJCQkqbSAqPSAxNjsKKwkJCQkqbSArPSAqdiAtICcwJzsKKwkJCX0KKwkJCWlmICgqdiA+PSAnQScgJiYgKnYgPD0gJ0YnKSB7CisJCQkJKm0gKj0gMTY7CisJCQkJKm0gKz0gKnYgLSAnQScgKyAxMDsKKwkJCX0KKwkJCWlmICgqdiA+PSAnYScgJiYgKnYgPD0gJ2YnKSB7CisJCQkJKm0gKj0gMTY7CisJCQkJKm0gKz0gKnYgLSAnYScgKyAxMDsKKwkJCX0KKwkJCWlmICgqdiA9PSAnOicpIHsKKwkJCQltKys7CisJCQkJKm0gPSAwOworCQkJfQorCQl9CSAgCisKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBzcmNtYWMiKTsKKwkJcmV0dXJuIGNvdW50OworCX0KKworICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiY2xlYXJfY291bnRlcnMiKSkgeworICAgICAgICAgICAgICAgIHBrdGdlbl9jbGVhcl9jb3VudGVycyhwa3RfZGV2KTsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBDbGVhcmluZyBjb3VudGVycy5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsKKyAgICAgICAgfQorCisJaWYgKCFzdHJjbXAobmFtZSwgImZsb3dzIikpIHsKKwkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KKwkJaSArPSBsZW47CisJCWlmICh2YWx1ZSA+IE1BWF9DRkxPV1MpCisJCQl2YWx1ZSA9IE1BWF9DRkxPV1M7CisKKwkJcGt0X2Rldi0+Y2Zsb3dzID0gdmFsdWU7CisJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGZsb3dzPSV1IiwgcGt0X2Rldi0+Y2Zsb3dzKTsKKwkJcmV0dXJuIGNvdW50OworCX0KKworCWlmICghc3RyY21wKG5hbWUsICJmbG93bGVuIikpIHsKKwkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KKwkJaSArPSBsZW47CisJCXBrdF9kZXYtPmxmbG93ID0gdmFsdWU7CisJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGZsb3dsZW49JXUiLCBwa3RfZGV2LT5sZmxvdyk7CisJCXJldHVybiBjb3VudDsKKwl9CisgICAgICAgIAorCXNwcmludGYocGt0X2Rldi0+cmVzdWx0LCAiTm8gc3VjaCBwYXJhbWV0ZXIgXCIlc1wiIiwgbmFtZSk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgcHJvY190aHJlYWRfcmVhZChjaGFyICpidWYgLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwljaGFyICpwOworICAgICAgICBzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCA9IChzdHJ1Y3QgcGt0Z2VuX3RocmVhZCopKGRhdGEpOworICAgICAgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldiA9IE5VTEw7CisKKworICAgICAgICBpZiAoIXQpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoInBrdGdlbjogRVJST1I6IGNvdWxkIG5vdCBmaW5kIHRocmVhZCBpbiBwcm9jX3RocmVhZF9yZWFkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisJcCA9IGJ1ZjsKKwlwICs9IHNwcmludGYocCwgIk5hbWU6ICVzICBtYXhfYmVmb3JlX3NvZnRpcnE6ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgdC0+bmFtZSwgdC0+bWF4X2JlZm9yZV9zb2Z0aXJxKTsKKworICAgICAgICBwICs9IHNwcmludGYocCwgIlJ1bm5pbmc6ICIpOworICAgICAgICAKKyAgICAgICAgaWZfbG9jayh0KTsKKyAgICAgICAgZm9yKHBrdF9kZXYgPSB0LT5pZl9saXN0O3BrdF9kZXY7IHBrdF9kZXYgPSBwa3RfZGV2LT5uZXh0KSAKKwkJaWYocGt0X2Rldi0+cnVubmluZykKKwkJCXAgKz0gc3ByaW50ZihwLCAiJXMgIiwgcGt0X2Rldi0+aWZuYW1lKTsKKyAgICAgICAgCisgICAgICAgIHAgKz0gc3ByaW50ZihwLCAiXG5TdG9wcGVkOiAiKTsKKworICAgICAgICBmb3IocGt0X2RldiA9IHQtPmlmX2xpc3Q7cGt0X2RldjsgcGt0X2RldiA9IHBrdF9kZXYtPm5leHQpIAorCQlpZighcGt0X2Rldi0+cnVubmluZykKKwkJCXAgKz0gc3ByaW50ZihwLCAiJXMgIiwgcGt0X2Rldi0+aWZuYW1lKTsKKworCWlmICh0LT5yZXN1bHRbMF0pCisJCXAgKz0gc3ByaW50ZihwLCAiXG5SZXN1bHQ6ICVzXG4iLCB0LT5yZXN1bHQpOworCWVsc2UKKwkJcCArPSBzcHJpbnRmKHAsICJcblJlc3VsdDogTkFcbiIpOworCisJKmVvZiA9IDE7CisKKyAgICAgICAgaWZfdW5sb2NrKHQpOworCisJcmV0dXJuIHAgLSBidWY7Cit9CisKK3N0YXRpYyBpbnQgcHJvY190aHJlYWRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgaSA9IDAsIG1heCwgbGVuLCByZXQ7CisJY2hhciBuYW1lWzQwXTsKKyAgICAgICAgc3RydWN0IHBrdGdlbl90aHJlYWQgKnQ7CisgICAgICAgIGNoYXIgKnBnX3Jlc3VsdDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZSA9IDA7CisgICAgICAgIAorCWlmIChjb3VudCA8IDEpIHsKKwkJLy8Jc3ByaW50ZihwZ19yZXN1bHQsICJXcm9uZyBjb21tYW5kIGZvcm1hdCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisgIAorCW1heCA9IGNvdW50IC0gaTsKKyAgICAgICAgbGVuID0gY291bnRfdHJhaWxfY2hhcnMoJnVzZXJfYnVmZmVyW2ldLCBtYXgpOworICAgICAgICBpZiAobGVuIDwgMCkgCisJCXJldHVybiBsZW47IAorICAgICAKKwlpICs9IGxlbjsKKyAgCisJLyogUmVhZCB2YXJpYWJsZSBuYW1lICovCisKKwlsZW4gPSBzdHJuX2xlbigmdXNlcl9idWZmZXJbaV0sIHNpemVvZihuYW1lKSAtIDEpOworICAgICAgICBpZiAobGVuIDwgMCkgIAorCQlyZXR1cm4gbGVuOyAKKwkKKwltZW1zZXQobmFtZSwgMCwgc2l6ZW9mKG5hbWUpKTsKKwlpZiAoY29weV9mcm9tX3VzZXIobmFtZSwgJnVzZXJfYnVmZmVyW2ldLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpICs9IGxlbjsKKyAgCisJbWF4ID0gY291bnQgLWk7CisJbGVuID0gY291bnRfdHJhaWxfY2hhcnMoJnVzZXJfYnVmZmVyW2ldLCBtYXgpOworICAgICAgICBpZiAobGVuIDwgMCkgIAorCQlyZXR1cm4gbGVuOyAKKwkKKwlpICs9IGxlbjsKKworCWlmIChkZWJ1ZykgCisJCXByaW50aygicGt0Z2VuOiB0PSVzLCBjb3VudD0lbHVcbiIsIG5hbWUsIGNvdW50KTsKKyAgICAgICAgCisKKyAgICAgICAgdCA9IChzdHJ1Y3QgcGt0Z2VuX3RocmVhZCopKGRhdGEpOworCWlmKCF0KSB7CisJCXByaW50aygicGt0Z2VuOiBFUlJPUjogTm8gdGhyZWFkXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJcGdfcmVzdWx0ID0gJih0LT5yZXN1bHRbMF0pOworCisgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJhZGRfZGV2aWNlIikpIHsKKyAgICAgICAgICAgICAgICBjaGFyIGZbMzJdOworICAgICAgICAgICAgICAgIG1lbXNldChmLCAwLCAzMik7CisJCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKGYpIC0gMSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgCisJCQlyZXQgPSBsZW47IAorCQkJZ290byBvdXQ7CisJCX0KKwkJaWYoIGNvcHlfZnJvbV91c2VyKGYsICZ1c2VyX2J1ZmZlcltpXSwgbGVuKSApCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaSArPSBsZW47CisJCXRocmVhZF9sb2NrKCk7CisgICAgICAgICAgICAgICAgcGt0Z2VuX2FkZF9kZXZpY2UodCwgZik7CisJCXRocmVhZF91bmxvY2soKTsKKyAgICAgICAgICAgICAgICByZXQgPSBjb3VudDsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBhZGRfZGV2aWNlPSVzIiwgZik7CisJCWdvdG8gb3V0OworCX0KKworICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAicmVtX2RldmljZV9hbGwiKSkgeworCQl0aHJlYWRfbG9jaygpOworCQl0LT5jb250cm9sIHw9IFRfUkVNREVWOworCQl0aHJlYWRfdW5sb2NrKCk7CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQlzY2hlZHVsZV90aW1lb3V0KEhaLzgpOyAgLyogUHJvcGFnYXRlIHRocmVhZC0+Y29udHJvbCAgKi8KKwkJcmV0ID0gY291bnQ7CisgICAgICAgICAgICAgICAgc3ByaW50ZihwZ19yZXN1bHQsICJPSzogcmVtX2RldmljZV9hbGwiKTsKKwkJZ290byBvdXQ7CisJfQorCisgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJtYXhfYmVmb3JlX3NvZnRpcnEiKSkgeworICAgICAgICAgICAgICAgIGxlbiA9IG51bV9hcmcoJnVzZXJfYnVmZmVyW2ldLCAxMCwgJnZhbHVlKTsKKwkJdGhyZWFkX2xvY2soKTsKKyAgICAgICAgICAgICAgICB0LT5tYXhfYmVmb3JlX3NvZnRpcnEgPSB2YWx1ZTsKKwkJdGhyZWFkX3VubG9jaygpOworICAgICAgICAgICAgICAgIHJldCA9IGNvdW50OworICAgICAgICAgICAgICAgIHNwcmludGYocGdfcmVzdWx0LCAiT0s6IG1heF9iZWZvcmVfc29mdGlycT0lbHUiLCB2YWx1ZSk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IC1FSU5WQUw7Cisgb3V0OgorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjcmVhdGVfcHJvY19kaXIodm9pZCkKK3sKKyAgICAgICAgaW50ICAgICBsZW47CisgICAgICAgIC8qICBkb2VzIHByb2NfZGlyIGFscmVhZHkgZXhpc3RzICovCisgICAgICAgIGxlbiA9IHN0cmxlbihQR19QUk9DX0RJUik7CisKKyAgICAgICAgZm9yIChwZ19wcm9jX2RpciA9IHByb2NfbmV0LT5zdWJkaXI7IHBnX3Byb2NfZGlyOyBwZ19wcm9jX2Rpcj1wZ19wcm9jX2Rpci0+bmV4dCkgeworICAgICAgICAgICAgICAgIGlmICgocGdfcHJvY19kaXItPm5hbWVsZW4gPT0gbGVuKSAmJgorCQkgICAgKCEgbWVtY21wKHBnX3Byb2NfZGlyLT5uYW1lLCBQR19QUk9DX0RJUiwgbGVuKSkpIAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghcGdfcHJvY19kaXIpIAorICAgICAgICAgICAgICAgIHBnX3Byb2NfZGlyID0gY3JlYXRlX3Byb2NfZW50cnkoUEdfUFJPQ19ESVIsIFNfSUZESVIsIHByb2NfbmV0KTsKKyAgICAgICAgCisgICAgICAgIGlmICghcGdfcHJvY19kaXIpIAorICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVtb3ZlX3Byb2NfZGlyKHZvaWQpCit7CisgICAgICAgIHJlbW92ZV9wcm9jX2VudHJ5KFBHX1BST0NfRElSLCBwcm9jX25ldCk7CisgICAgICAgIHJldHVybiAwOworfQorCisvKiBUaGluayBmaW5kIG9yIHJlbW92ZSBmb3IgTk4gKi8KK3N0YXRpYyBzdHJ1Y3QgcGt0Z2VuX2RldiAqX19wa3RnZW5fTk5fdGhyZWFkcyhjb25zdCBjaGFyKiBpZm5hbWUsIGludCByZW1vdmUpIAoreworCXN0cnVjdCBwa3RnZW5fdGhyZWFkICp0OworCXN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2ID0gTlVMTDsKKworICAgICAgICB0ID0gcGt0Z2VuX3RocmVhZHM7CisgICAgICAgICAgICAgICAgCisJd2hpbGUgKHQpIHsKKwkJcGt0X2RldiA9IHBrdGdlbl9maW5kX2Rldih0LCBpZm5hbWUpOworCQlpZiAocGt0X2RldikgeworCQkgICAgICAgICAgICAgICAgaWYocmVtb3ZlKSB7IAorCQkJCSAgICAgICAgaWZfbG9jayh0KTsKKwkJCQkgICAgICAgIHBrdGdlbl9yZW1vdmVfZGV2aWNlKHQsIHBrdF9kZXYpOworCQkJCSAgICAgICAgaWZfdW5sb2NrKHQpOworCQkJCX0KKwkJCWJyZWFrOworCQl9CisJCXQgPSB0LT5uZXh0OworCX0KKyAgICAgICAgcmV0dXJuIHBrdF9kZXY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0Z2VuX05OX3RocmVhZHMoY29uc3QgY2hhciogaWZuYW1lLCBpbnQgcmVtb3ZlKSAKK3sKKwlzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldiA9IE5VTEw7CisJdGhyZWFkX2xvY2soKTsKKwlwa3RfZGV2ID0gX19wa3RnZW5fTk5fdGhyZWFkcyhpZm5hbWUsIHJlbW92ZSk7CisgICAgICAgIHRocmVhZF91bmxvY2soKTsKKwlyZXR1cm4gcGt0X2RldjsKK30KKworc3RhdGljIGludCBwa3RnZW5fZGV2aWNlX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdW51c2VkLCB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpIAoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikocHRyKTsKKworCS8qIEl0IGlzIE9LIHRoYXQgd2UgZG8gbm90IGhvbGQgdGhlIGdyb3VwIGxvY2sgcmlnaHQgbm93LAorCSAqIGFzIHdlIHJ1biB1bmRlciB0aGUgUlROTCBsb2NrLgorCSAqLworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX0NIQU5HRUFERFI6CisJY2FzZSBORVRERVZfR09JTkdfRE9XTjoKKwljYXNlIE5FVERFVl9ET1dOOgorCWNhc2UgTkVUREVWX1VQOgorCQkvKiBJZ25vcmUgZm9yIG5vdyAqLworCQlicmVhazsKKwkJCisJY2FzZSBORVRERVZfVU5SRUdJU1RFUjoKKyAgICAgICAgICAgICAgICBwa3RnZW5fTk5fdGhyZWFkcyhkZXYtPm5hbWUsIFJFTU9WRSk7CisJCWJyZWFrOworCX07CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKy8qIEFzc29jaWF0ZSBwa3RnZW5fZGV2IHdpdGggYSBkZXZpY2UuICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSogcGt0Z2VuX3NldHVwX2RldihzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikgeworCXN0cnVjdCBuZXRfZGV2aWNlICpvZGV2OworCisJLyogQ2xlYW4gb2xkIHNldHVwcyAqLworCisJaWYgKHBrdF9kZXYtPm9kZXYpIHsKKwkJZGV2X3B1dChwa3RfZGV2LT5vZGV2KTsKKyAgICAgICAgICAgICAgICBwa3RfZGV2LT5vZGV2ID0gTlVMTDsKKyAgICAgICAgfQorCisJb2RldiA9IGRldl9nZXRfYnlfbmFtZShwa3RfZGV2LT5pZm5hbWUpOworCisJaWYgKCFvZGV2KSB7CisJCXByaW50aygicGt0Z2VuOiBubyBzdWNoIG5ldGRldmljZTogXCIlc1wiXG4iLCBwa3RfZGV2LT5pZm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKG9kZXYtPnR5cGUgIT0gQVJQSFJEX0VUSEVSKSB7CisJCXByaW50aygicGt0Z2VuOiBub3QgYW4gZXRoZXJuZXQgZGV2aWNlOiBcIiVzXCJcbiIsIHBrdF9kZXYtPmlmbmFtZSk7CisJCWdvdG8gb3V0X3B1dDsKKwl9CisJaWYgKCFuZXRpZl9ydW5uaW5nKG9kZXYpKSB7CisJCXByaW50aygicGt0Z2VuOiBkZXZpY2UgaXMgZG93bjogXCIlc1wiXG4iLCBwa3RfZGV2LT5pZm5hbWUpOworCQlnb3RvIG91dF9wdXQ7CisJfQorCXBrdF9kZXYtPm9kZXYgPSBvZGV2OworCQorICAgICAgICByZXR1cm4gcGt0X2Rldi0+b2RldjsKKworb3V0X3B1dDoKKwlkZXZfcHV0KG9kZXYpOworb3V0OgorIAlyZXR1cm4gTlVMTDsKKworfQorCisvKiBSZWFkIHBrdF9kZXYgZnJvbSB0aGUgaW50ZXJmYWNlIGFuZCBzZXQgdXAgaW50ZXJuYWwgcGt0Z2VuX2RldgorICogc3RydWN0dXJlIHRvIGhhdmUgdGhlIHJpZ2h0IGluZm9ybWF0aW9uIHRvIGNyZWF0ZS9zZW5kIHBhY2tldHMKKyAqLworc3RhdGljIHZvaWQgcGt0Z2VuX3NldHVwX2luamVjdChzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikKK3sKKwkvKiBUcnkgb25jZSBtb3JlLCBqdXN0IGluIGNhc2UgaXQgd29ya3Mgbm93LiAqLworICAgICAgICBpZiAoIXBrdF9kZXYtPm9kZXYpIAorICAgICAgICAgICAgICAgIHBrdGdlbl9zZXR1cF9kZXYocGt0X2Rldik7CisgICAgICAgIAorICAgICAgICBpZiAoIXBrdF9kZXYtPm9kZXYpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoInBrdGdlbjogRVJST1I6IHBrdF9kZXYtPm9kZXYgPT0gTlVMTCBpbiBzZXR1cF9pbmplY3QuXG4iKTsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHBrdF9kZXYtPnJlc3VsdCwgIkVSUk9SOiBwa3RfZGV2LT5vZGV2ID09IE5VTEwgaW4gc2V0dXBfaW5qZWN0LlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBEZWZhdWx0IHRvIHRoZSBpbnRlcmZhY2UncyBtYWMgaWYgbm90IGV4cGxpY2l0bHkgc2V0LiAqLworCisJaWYgKChwa3RfZGV2LT5zcmNfbWFjWzBdID09IDApICYmIAorCSAgICAocGt0X2Rldi0+c3JjX21hY1sxXSA9PSAwKSAmJiAKKwkgICAgKHBrdF9kZXYtPnNyY19tYWNbMl0gPT0gMCkgJiYgCisJICAgIChwa3RfZGV2LT5zcmNfbWFjWzNdID09IDApICYmIAorCSAgICAocGt0X2Rldi0+c3JjX21hY1s0XSA9PSAwKSAmJiAKKwkgICAgKHBrdF9kZXYtPnNyY19tYWNbNV0gPT0gMCkpIHsKKworCSAgICAgICBtZW1jcHkoJihwa3RfZGV2LT5oaFs2XSksIHBrdF9kZXYtPm9kZXYtPmRldl9hZGRyLCA2KTsKKyAgICAgICB9CisgICAgICAgIC8qIFNldCB1cCBEZXN0IE1BQyAqLworICAgICAgICBtZW1jcHkoJihwa3RfZGV2LT5oaFswXSksIHBrdF9kZXYtPmRzdF9tYWMsIDYpOworCisgICAgICAgIC8qIFNldCB1cCBwa3Qgc2l6ZSAqLworICAgICAgICBwa3RfZGV2LT5jdXJfcGt0X3NpemUgPSBwa3RfZGV2LT5taW5fcGt0X3NpemU7CisJCisJaWYocGt0X2Rldi0+ZmxhZ3MgJiBGX0lQVjYpIHsKKwkJLyoKKwkJICogU2tpcCB0aGlzIGF1dG9tYXRpYyBhZGRyZXNzIHNldHRpbmcgdW50aWwgbG9ja3Mgb3IgZnVuY3Rpb25zIAorCQkgKiBnZXRzIGV4cG9ydGVkCisJCSAqLworCisjaWZkZWYgTk9UTk9XCisJCWludCBpLCBzZXQgPSAwLCBlcnI9MTsKKwkJc3RydWN0IGluZXQ2X2RldiAqaWRldjsKKworCQlmb3IoaT0wOyBpPCBJTjZfQUREUl9IU0laRTsgaSsrKQorCQkJaWYocGt0X2Rldi0+Y3VyX2luNl9zYWRkci5zNl9hZGRyW2ldKSB7CisJCQkJc2V0ID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKworCQlpZighc2V0KSB7CisJCQkKKwkJCS8qCisJCQkgKiBVc2UgbGlua2xldmVsIGFkZHJlc3MgaWYgdW5jb25maWd1cmVkLgorCQkJICoKKwkJCSAqIHVzZSBpcHY2X2dldF9sbGFkZHIgaWYvd2hlbiBpdCdzIGdldCBleHBvcnRlZAorCQkJICovCisKKworCQkJcmVhZF9sb2NrKCZhZGRyY29uZl9sb2NrKTsKKwkJCWlmICgoaWRldiA9IF9faW42X2Rldl9nZXQocGt0X2Rldi0+b2RldikpICE9IE5VTEwpIHsKKwkJCQlzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnA7CisKKwkJCQlyZWFkX2xvY2tfYmgoJmlkZXYtPmxvY2spOworCQkJCWZvciAoaWZwPWlkZXYtPmFkZHJfbGlzdDsgaWZwOyBpZnA9aWZwLT5pZl9uZXh0KSB7CisJCQkJCWlmIChpZnAtPnNjb3BlID09IElGQV9MSU5LICYmICEoaWZwLT5mbGFncyZJRkFfRl9URU5UQVRJVkUpKSB7CisJCQkJCQlpcHY2X2FkZHJfY29weSgmcGt0X2Rldi0+Y3VyX2luNl9zYWRkciwgJmlmcC0+YWRkcik7CisJCQkJCQllcnIgPSAwOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOworCQkJfQorCQkJcmVhZF91bmxvY2soJmFkZHJjb25mX2xvY2spOworCQkJaWYoZXJyKQlwcmludGsoInBrdGdlbjogRVJST1I6IElQdjYgbGluayBhZGRyZXNzIG5vdCBhdmFpbGJsZS5cbiIpOworCQl9CisjZW5kaWYKKwl9IAorCWVsc2UgeworCQlwa3RfZGV2LT5zYWRkcl9taW4gPSAwOworCQlwa3RfZGV2LT5zYWRkcl9tYXggPSAwOworCQlpZiAoc3RybGVuKHBrdF9kZXYtPnNyY19taW4pID09IDApIHsKKwkJCQorCQkJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OyAKKworCQkJcmN1X3JlYWRfbG9jaygpOworCQkJaW5fZGV2ID0gX19pbl9kZXZfZ2V0KHBrdF9kZXYtPm9kZXYpOworCQkJaWYgKGluX2RldikgeworCQkJCWlmIChpbl9kZXYtPmlmYV9saXN0KSB7CisJCQkJCXBrdF9kZXYtPnNhZGRyX21pbiA9IGluX2Rldi0+aWZhX2xpc3QtPmlmYV9hZGRyZXNzOworCQkJCQlwa3RfZGV2LT5zYWRkcl9tYXggPSBwa3RfZGV2LT5zYWRkcl9taW47CisJCQkJfQorCQkJCV9faW5fZGV2X3B1dChpbl9kZXYpOwkKKwkJCX0KKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQl9CisJCWVsc2UgeworCQkJcGt0X2Rldi0+c2FkZHJfbWluID0gaW5fYXRvbihwa3RfZGV2LT5zcmNfbWluKTsKKwkJCXBrdF9kZXYtPnNhZGRyX21heCA9IGluX2F0b24ocGt0X2Rldi0+c3JjX21heCk7CisJCX0KKworCQlwa3RfZGV2LT5kYWRkcl9taW4gPSBpbl9hdG9uKHBrdF9kZXYtPmRzdF9taW4pOworCQlwa3RfZGV2LT5kYWRkcl9tYXggPSBpbl9hdG9uKHBrdF9kZXYtPmRzdF9tYXgpOworCX0KKyAgICAgICAgLyogSW5pdGlhbGl6ZSBjdXJyZW50IHZhbHVlcy4gKi8KKyAgICAgICAgcGt0X2Rldi0+Y3VyX2RzdF9tYWNfb2Zmc2V0ID0gMDsKKyAgICAgICAgcGt0X2Rldi0+Y3VyX3NyY19tYWNfb2Zmc2V0ID0gMDsKKyAgICAgICAgcGt0X2Rldi0+Y3VyX3NhZGRyID0gcGt0X2Rldi0+c2FkZHJfbWluOworICAgICAgICBwa3RfZGV2LT5jdXJfZGFkZHIgPSBwa3RfZGV2LT5kYWRkcl9taW47CisgICAgICAgIHBrdF9kZXYtPmN1cl91ZHBfZHN0ID0gcGt0X2Rldi0+dWRwX2RzdF9taW47CisgICAgICAgIHBrdF9kZXYtPmN1cl91ZHBfc3JjID0gcGt0X2Rldi0+dWRwX3NyY19taW47CisJcGt0X2Rldi0+bmZsb3dzID0gMDsKK30KKworc3RhdGljIHZvaWQgc3BpbihzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldiwgX191NjQgc3Bpbl91bnRpbF91cykKK3sKKwlfX3U2NCBzdGFydDsKKwlfX3U2NCBub3c7CisKKwlzdGFydCA9IG5vdyA9IGdldEN1clVzKCk7CisJcHJpbnRrKEtFUk5fSU5GTyAic2xlZXBpbmcgZm9yICVkXG4iLCAoaW50KShzcGluX3VudGlsX3VzIC0gbm93KSk7CisJd2hpbGUgKG5vdyA8IHNwaW5fdW50aWxfdXMpIHsKKwkJLyogVE9ETzogb3B0aW1pc2Ugc2xlZXBpbmcgYmVoYXZpb3IgKi8KKwkJaWYgKHNwaW5fdW50aWxfdXMgLSBub3cgPiAoMTAwMDAwMC9IWikrMSkgeworCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQl9IGVsc2UgaWYgKHNwaW5fdW50aWxfdXMgLSBub3cgPiAxMDApIHsKKwkJCWRvX3NvZnRpcnEoKTsKKwkJCWlmICghcGt0X2Rldi0+cnVubmluZykKKwkJCQlyZXR1cm47CisJCQlpZiAobmVlZF9yZXNjaGVkKCkpCisJCQkJc2NoZWR1bGUoKTsKKwkJfQorCisJCW5vdyA9IGdldEN1clVzKCk7CisJfQorCisJcGt0X2Rldi0+aWRsZV9hY2MgKz0gbm93IC0gc3RhcnQ7Cit9CisKKworLyogSW5jcmVtZW50L3JhbmRvbWl6ZSBoZWFkZXJzIGFjY29yZGluZyB0byBmbGFncyBhbmQgY3VycmVudCB2YWx1ZXMKKyAqIGZvciBJUCBzcmMvZGVzdCwgVURQIHNyYy9kc3QgcG9ydCwgTUFDLUFkZHIgc3JjL2RzdAorICovCitzdGF0aWMgdm9pZCBtb2RfY3VyX2hlYWRlcnMoc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpIHsgICAgICAgIAorICAgICAgICBfX3UzMiBpbW47CisgICAgICAgIF9fdTMyIGlteDsKKwlpbnQgIGZsb3cgPSAwOworCisJaWYocGt0X2Rldi0+Y2Zsb3dzKSAgeworCQlmbG93ID0gcGt0Z2VuX3JhbmRvbSgpICUgcGt0X2Rldi0+Y2Zsb3dzOworCQkKKwkJaWYgKHBrdF9kZXYtPmZsb3dzW2Zsb3ddLmNvdW50ID4gcGt0X2Rldi0+bGZsb3cpCisJCQlwa3RfZGV2LT5mbG93c1tmbG93XS5jb3VudCA9IDA7CisJfQkJCQkJCQorCisKKwkvKiAgRGVhbCB3aXRoIHNvdXJjZSBNQUMgKi8KKyAgICAgICAgaWYgKHBrdF9kZXYtPnNyY19tYWNfY291bnQgPiAxKSB7CisgICAgICAgICAgICAgICAgX191MzIgbWM7CisgICAgICAgICAgICAgICAgX191MzIgdG1wOworCisgICAgICAgICAgICAgICAgaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9NQUNTUkNfUk5EKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIG1jID0gcGt0Z2VuX3JhbmRvbSgpICUgKHBrdF9kZXYtPnNyY19tYWNfY291bnQpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbWMgPSBwa3RfZGV2LT5jdXJfc3JjX21hY19vZmZzZXQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwa3RfZGV2LT5jdXJfc3JjX21hY19vZmZzZXQgPiBwa3RfZGV2LT5zcmNfbWFjX2NvdW50KSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX3NyY19tYWNfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0bXAgPSBwa3RfZGV2LT5zcmNfbWFjWzVdICsgKG1jICYgMHhGRik7CisgICAgICAgICAgICAgICAgcGt0X2Rldi0+aGhbMTFdID0gdG1wOworICAgICAgICAgICAgICAgIHRtcCA9IChwa3RfZGV2LT5zcmNfbWFjWzRdICsgKChtYyA+PiA4KSAmIDB4RkYpICsgKHRtcCA+PiA4KSk7CisgICAgICAgICAgICAgICAgcGt0X2Rldi0+aGhbMTBdID0gdG1wOworICAgICAgICAgICAgICAgIHRtcCA9IChwa3RfZGV2LT5zcmNfbWFjWzNdICsgKChtYyA+PiAxNikgJiAweEZGKSArICh0bXAgPj4gOCkpOworICAgICAgICAgICAgICAgIHBrdF9kZXYtPmhoWzldID0gdG1wOworICAgICAgICAgICAgICAgIHRtcCA9IChwa3RfZGV2LT5zcmNfbWFjWzJdICsgKChtYyA+PiAyNCkgJiAweEZGKSArICh0bXAgPj4gOCkpOworICAgICAgICAgICAgICAgIHBrdF9kZXYtPmhoWzhdID0gdG1wOworICAgICAgICAgICAgICAgIHRtcCA9IChwa3RfZGV2LT5zcmNfbWFjWzFdICsgKHRtcCA+PiA4KSk7CisgICAgICAgICAgICAgICAgcGt0X2Rldi0+aGhbN10gPSB0bXA7ICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIC8qICBEZWFsIHdpdGggRGVzdGluYXRpb24gTUFDICovCisgICAgICAgIGlmIChwa3RfZGV2LT5kc3RfbWFjX2NvdW50ID4gMSkgeworICAgICAgICAgICAgICAgIF9fdTMyIG1jOworICAgICAgICAgICAgICAgIF9fdTMyIHRtcDsKKworICAgICAgICAgICAgICAgIGlmIChwa3RfZGV2LT5mbGFncyAmIEZfTUFDRFNUX1JORCkgCisgICAgICAgICAgICAgICAgICAgICAgICBtYyA9IHBrdGdlbl9yYW5kb20oKSAlIChwa3RfZGV2LT5kc3RfbWFjX2NvdW50KTsKKworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbWMgPSBwa3RfZGV2LT5jdXJfZHN0X21hY19vZmZzZXQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwa3RfZGV2LT5jdXJfZHN0X21hY19vZmZzZXQgPiBwa3RfZGV2LT5kc3RfbWFjX2NvdW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmN1cl9kc3RfbWFjX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdG1wID0gcGt0X2Rldi0+ZHN0X21hY1s1XSArIChtYyAmIDB4RkYpOworICAgICAgICAgICAgICAgIHBrdF9kZXYtPmhoWzVdID0gdG1wOworICAgICAgICAgICAgICAgIHRtcCA9IChwa3RfZGV2LT5kc3RfbWFjWzRdICsgKChtYyA+PiA4KSAmIDB4RkYpICsgKHRtcCA+PiA4KSk7CisgICAgICAgICAgICAgICAgcGt0X2Rldi0+aGhbNF0gPSB0bXA7CisgICAgICAgICAgICAgICAgdG1wID0gKHBrdF9kZXYtPmRzdF9tYWNbM10gKyAoKG1jID4+IDE2KSAmIDB4RkYpICsgKHRtcCA+PiA4KSk7CisgICAgICAgICAgICAgICAgcGt0X2Rldi0+aGhbM10gPSB0bXA7CisgICAgICAgICAgICAgICAgdG1wID0gKHBrdF9kZXYtPmRzdF9tYWNbMl0gKyAoKG1jID4+IDI0KSAmIDB4RkYpICsgKHRtcCA+PiA4KSk7CisgICAgICAgICAgICAgICAgcGt0X2Rldi0+aGhbMl0gPSB0bXA7CisgICAgICAgICAgICAgICAgdG1wID0gKHBrdF9kZXYtPmRzdF9tYWNbMV0gKyAodG1wID4+IDgpKTsKKyAgICAgICAgICAgICAgICBwa3RfZGV2LT5oaFsxXSA9IHRtcDsgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgaWYgKHBrdF9kZXYtPnVkcF9zcmNfbWluIDwgcGt0X2Rldi0+dWRwX3NyY19tYXgpIHsKKyAgICAgICAgICAgICAgICBpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX1VEUFNSQ19STkQpIAorICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX3VkcF9zcmMgPSAoKHBrdGdlbl9yYW5kb20oKSAlIChwa3RfZGV2LT51ZHBfc3JjX21heCAtIHBrdF9kZXYtPnVkcF9zcmNfbWluKSkgKyBwa3RfZGV2LT51ZHBfc3JjX21pbik7CisKKyAgICAgICAgICAgICAgICBlbHNlIHsKKwkJCXBrdF9kZXYtPmN1cl91ZHBfc3JjKys7CisJCQlpZiAocGt0X2Rldi0+Y3VyX3VkcF9zcmMgPj0gcGt0X2Rldi0+dWRwX3NyY19tYXgpCisJCQkJcGt0X2Rldi0+Y3VyX3VkcF9zcmMgPSBwa3RfZGV2LT51ZHBfc3JjX21pbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocGt0X2Rldi0+dWRwX2RzdF9taW4gPCBwa3RfZGV2LT51ZHBfZHN0X21heCkgeworICAgICAgICAgICAgICAgIGlmIChwa3RfZGV2LT5mbGFncyAmIEZfVURQRFNUX1JORCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX3VkcF9kc3QgPSAoKHBrdGdlbl9yYW5kb20oKSAlIChwa3RfZGV2LT51ZHBfZHN0X21heCAtIHBrdF9kZXYtPnVkcF9kc3RfbWluKSkgKyBwa3RfZGV2LT51ZHBfZHN0X21pbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworCQkJcGt0X2Rldi0+Y3VyX3VkcF9kc3QrKzsKKwkJCWlmIChwa3RfZGV2LT5jdXJfdWRwX2RzdCA+PSBwa3RfZGV2LT51ZHBfZHN0X21heCkgCisJCQkJcGt0X2Rldi0+Y3VyX3VkcF9kc3QgPSBwa3RfZGV2LT51ZHBfZHN0X21pbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworCWlmICghKHBrdF9kZXYtPmZsYWdzICYgRl9JUFY2KSkgeworCisJCWlmICgoaW1uID0gbnRvaGwocGt0X2Rldi0+c2FkZHJfbWluKSkgPCAoaW14ID0gbnRvaGwocGt0X2Rldi0+c2FkZHJfbWF4KSkpIHsKKwkJCV9fdTMyIHQ7CisJCQlpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX0lQU1JDX1JORCkgCisJCQkJdCA9ICgocGt0Z2VuX3JhbmRvbSgpICUgKGlteCAtIGltbikpICsgaW1uKTsKKwkJCWVsc2UgeworCQkJCXQgPSBudG9obChwa3RfZGV2LT5jdXJfc2FkZHIpOworCQkJCXQrKzsKKwkJCQlpZiAodCA+IGlteCkgeworCQkJCQl0ID0gaW1uOworCQkJCX0KKwkJCX0KKwkJCXBrdF9kZXYtPmN1cl9zYWRkciA9IGh0b25sKHQpOworCQl9CisJCQorCQlpZiAocGt0X2Rldi0+Y2Zsb3dzICYmIHBrdF9kZXYtPmZsb3dzW2Zsb3ddLmNvdW50ICE9IDApIHsKKwkJCXBrdF9kZXYtPmN1cl9kYWRkciA9IHBrdF9kZXYtPmZsb3dzW2Zsb3ddLmN1cl9kYWRkcjsKKwkJfSBlbHNlIHsKKworCQkJaWYgKChpbW4gPSBudG9obChwa3RfZGV2LT5kYWRkcl9taW4pKSA8IChpbXggPSBudG9obChwa3RfZGV2LT5kYWRkcl9tYXgpKSkgeworCQkJCV9fdTMyIHQ7CisJCQkJaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9JUERTVF9STkQpIHsKKworCQkJCQl0ID0gKChwa3RnZW5fcmFuZG9tKCkgJSAoaW14IC0gaW1uKSkgKyBpbW4pOworCQkJCQl0ID0gaHRvbmwodCk7CisKKwkJCQkJd2hpbGUoIExPT1BCQUNLKHQpIHx8IE1VTFRJQ0FTVCh0KSB8fCBCQURDTEFTUyh0KSB8fCBaRVJPTkVUKHQpIHx8ICBMT0NBTF9NQ0FTVCh0KSApIHsKKwkJCQkJCXQgPSAoKHBrdGdlbl9yYW5kb20oKSAlIChpbXggLSBpbW4pKSArIGltbik7CisJCQkJCQl0ID0gaHRvbmwodCk7CisJCQkJCX0KKwkJCQkJcGt0X2Rldi0+Y3VyX2RhZGRyID0gdDsKKwkJCQl9CisJCQkJCisJCQkJZWxzZSB7CisJCQkJCXQgPSBudG9obChwa3RfZGV2LT5jdXJfZGFkZHIpOworCQkJCQl0Kys7CisJCQkJCWlmICh0ID4gaW14KSB7CisJCQkJCQl0ID0gaW1uOworCQkJCQl9CisJCQkJCXBrdF9kZXYtPmN1cl9kYWRkciA9IGh0b25sKHQpOworCQkJCX0KKwkJCX0KKwkJCWlmKHBrdF9kZXYtPmNmbG93cykgewkKKwkJCQlwa3RfZGV2LT5mbG93c1tmbG93XS5jdXJfZGFkZHIgPSBwa3RfZGV2LT5jdXJfZGFkZHI7CisJCQkJcGt0X2Rldi0+bmZsb3dzKys7CisJCQl9CisJCX0KKwl9CisJZWxzZSAvKiBJUFY2ICogKi8KKwl7CisJCWlmKHBrdF9kZXYtPm1pbl9pbjZfZGFkZHIuczZfYWRkcjMyWzBdID09IDAgJiYKKwkJICAgcGt0X2Rldi0+bWluX2luNl9kYWRkci5zNl9hZGRyMzJbMV0gPT0gMCAmJgorCQkgICBwa3RfZGV2LT5taW5faW42X2RhZGRyLnM2X2FkZHIzMlsyXSA9PSAwICYmCisJCSAgIHBrdF9kZXYtPm1pbl9pbjZfZGFkZHIuczZfYWRkcjMyWzNdID09IDApOworCQllbHNlIHsKKwkJCWludCBpOworCisJCQkvKiBPbmx5IHJhbmRvbSBkZXN0aW5hdGlvbnMgeWV0ICovCisKKwkJCWZvcihpPTA7IGkgPCA0OyBpKyspIHsKKwkJCQlwa3RfZGV2LT5jdXJfaW42X2RhZGRyLnM2X2FkZHIzMltpXSA9CisJCQkJCSgocGt0Z2VuX3JhbmRvbSgpIHwKKwkJCQkJICBwa3RfZGV2LT5taW5faW42X2RhZGRyLnM2X2FkZHIzMltpXSkgJgorCQkJCQkgcGt0X2Rldi0+bWF4X2luNl9kYWRkci5zNl9hZGRyMzJbaV0pOworCQkJfQorIAkJfQorCX0KKworICAgICAgICBpZiAocGt0X2Rldi0+bWluX3BrdF9zaXplIDwgcGt0X2Rldi0+bWF4X3BrdF9zaXplKSB7CisgICAgICAgICAgICAgICAgX191MzIgdDsKKyAgICAgICAgICAgICAgICBpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX1RYU0laRV9STkQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAoKHBrdGdlbl9yYW5kb20oKSAlIChwa3RfZGV2LT5tYXhfcGt0X3NpemUgLSBwa3RfZGV2LT5taW5fcGt0X3NpemUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBrdF9kZXYtPm1pbl9wa3Rfc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworCQkJdCA9IHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZSArIDE7CisJCQlpZiAodCA+IHBrdF9kZXYtPm1heF9wa3Rfc2l6ZSkgCisJCQkJdCA9IHBrdF9kZXYtPm1pbl9wa3Rfc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX3BrdF9zaXplID0gdDsKKyAgICAgICAgfQorCisJcGt0X2Rldi0+Zmxvd3NbZmxvd10uY291bnQrKzsKK30KKworCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmZpbGxfcGFja2V0X2lwdjQoc3RydWN0IG5ldF9kZXZpY2UgKm9kZXYsIAorCQkJCSAgIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCV9fdTggKmV0aDsKKwlzdHJ1Y3QgdWRwaGRyICp1ZHBoOworCWludCBkYXRhbGVuLCBpcGxlbjsKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKyAgICAgICAgc3RydWN0IHBrdGdlbl9oZHIgKnBnaCA9IE5VTEw7CisgICAgICAgIAorCXNrYiA9IGFsbG9jX3NrYihwa3RfZGV2LT5jdXJfcGt0X3NpemUgKyA2NCArIDE2LCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikgeworCQlzcHJpbnRmKHBrdF9kZXYtPnJlc3VsdCwgIk5vIG1lbW9yeSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlza2JfcmVzZXJ2ZShza2IsIDE2KTsKKworCS8qICBSZXNlcnZlIGZvciBldGhlcm5ldCBhbmQgSVAgaGVhZGVyICAqLworCWV0aCA9IChfX3U4ICopIHNrYl9wdXNoKHNrYiwgMTQpOworCWlwaCA9IChzdHJ1Y3QgaXBoZHIgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCXVkcGggPSAoc3RydWN0IHVkcGhkciAqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkcikpOworCisgICAgICAgIC8qIFVwZGF0ZSBhbnkgb2YgdGhlIHZhbHVlcywgdXNlZCB3aGVuIHdlJ3JlIGluY3JlbWVudGluZyB2YXJpb3VzCisgICAgICAgICAqIGZpZWxkcy4KKyAgICAgICAgICovCisgICAgICAgIG1vZF9jdXJfaGVhZGVycyhwa3RfZGV2KTsKKworCW1lbWNweShldGgsIHBrdF9kZXYtPmhoLCAxMik7CisJKih1MTYqKSZldGhbMTJdID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk7CisKKwlkYXRhbGVuID0gcGt0X2Rldi0+Y3VyX3BrdF9zaXplIC0gMTQgLSAyMCAtIDg7IC8qIEV0aCArIElQaCArIFVEUGggKi8KKwlpZiAoZGF0YWxlbiA8IHNpemVvZihzdHJ1Y3QgcGt0Z2VuX2hkcikpIAorCQlkYXRhbGVuID0gc2l6ZW9mKHN0cnVjdCBwa3RnZW5faGRyKTsKKyAgICAgICAgCisJdWRwaC0+c291cmNlID0gaHRvbnMocGt0X2Rldi0+Y3VyX3VkcF9zcmMpOworCXVkcGgtPmRlc3QgPSBodG9ucyhwa3RfZGV2LT5jdXJfdWRwX2RzdCk7CisJdWRwaC0+bGVuID0gaHRvbnMoZGF0YWxlbiArIDgpOyAvKiBEQVRBICsgdWRwaGRyICovCisJdWRwaC0+Y2hlY2sgPSAwOyAgLyogTm8gY2hlY2tzdW0gKi8KKworCWlwaC0+aWhsID0gNTsKKwlpcGgtPnZlcnNpb24gPSA0OworCWlwaC0+dHRsID0gMzI7CisJaXBoLT50b3MgPSAwOworCWlwaC0+cHJvdG9jb2wgPSBJUFBST1RPX1VEUDsgLyogVURQICovCisJaXBoLT5zYWRkciA9IHBrdF9kZXYtPmN1cl9zYWRkcjsKKwlpcGgtPmRhZGRyID0gcGt0X2Rldi0+Y3VyX2RhZGRyOworCWlwaC0+ZnJhZ19vZmYgPSAwOworCWlwbGVuID0gMjAgKyA4ICsgZGF0YWxlbjsKKwlpcGgtPnRvdF9sZW4gPSBodG9ucyhpcGxlbik7CisJaXBoLT5jaGVjayA9IDA7CisJaXBoLT5jaGVjayA9IGlwX2Zhc3RfY3N1bSgodm9pZCAqKSBpcGgsIGlwaC0+aWhsKTsKKwlza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk7CisJc2tiLT5tYWMucmF3ID0gKCh1OCAqKWlwaCkgLSAxNDsKKwlza2ItPmRldiA9IG9kZXY7CisJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOworCisJaWYgKHBrdF9kZXYtPm5mcmFncyA8PSAwKSAKKyAgICAgICAgICAgICAgICBwZ2ggPSAoc3RydWN0IHBrdGdlbl9oZHIgKilza2JfcHV0KHNrYiwgZGF0YWxlbik7CisJZWxzZSB7CisJCWludCBmcmFncyA9IHBrdF9kZXYtPm5mcmFnczsKKwkJaW50IGk7CisKKyAgICAgICAgICAgICAgICBwZ2ggPSAoc3RydWN0IHBrdGdlbl9oZHIqKSgoKGNoYXIqKSh1ZHBoKSkgKyA4KTsKKyAgICAgICAgICAgICAgICAKKwkJaWYgKGZyYWdzID4gTUFYX1NLQl9GUkFHUykKKwkJCWZyYWdzID0gTUFYX1NLQl9GUkFHUzsKKwkJaWYgKGRhdGFsZW4gPiBmcmFncypQQUdFX1NJWkUpIHsKKwkJCXNrYl9wdXQoc2tiLCBkYXRhbGVuLWZyYWdzKlBBR0VfU0laRSk7CisJCQlkYXRhbGVuID0gZnJhZ3MqUEFHRV9TSVpFOworCQl9CisKKwkJaSA9IDA7CisJCXdoaWxlIChkYXRhbGVuID4gMCkgeworCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBhbGxvY19wYWdlcyhHRlBfS0VSTkVMLCAwKTsKKwkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZSA9IHBhZ2U7CisJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2Vfb2Zmc2V0ID0gMDsKKwkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZSA9CisJCQkJKGRhdGFsZW4gPCBQQUdFX1NJWkUgPyBkYXRhbGVuIDogUEFHRV9TSVpFKTsKKwkJCWRhdGFsZW4gLT0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOworCQkJc2tiLT5sZW4gKz0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOworCQkJc2tiLT5kYXRhX2xlbiArPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CisJCQlpKys7CisJCQlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID0gaTsKKwkJfQorCisJCXdoaWxlIChpIDwgZnJhZ3MpIHsKKwkJCWludCByZW07CisKKwkJCWlmIChpID09IDApCisJCQkJYnJlYWs7CisKKwkJCXJlbSA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaSAtIDFdLnNpemUgLyAyOworCQkJaWYgKHJlbSA9PSAwKQorCQkJCWJyZWFrOworCisJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2kgLSAxXS5zaXplIC09IHJlbTsKKworCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXSA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaSAtIDFdOworCQkJZ2V0X3BhZ2Uoc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5wYWdlKTsKKwkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZSA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaSAtIDFdLnBhZ2U7CisJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2Vfb2Zmc2V0ICs9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaSAtIDFdLnNpemU7CisJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemUgPSByZW07CisJCQlpKys7CisJCQlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID0gaTsKKwkJfQorCX0KKworICAgICAgICAvKiBTdGFtcCB0aGUgdGltZSwgYW5kIHNlcXVlbmNlIG51bWJlciwgY29udmVydCB0aGVtIHRvIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworCisgICAgICAgIGlmIChwZ2gpIHsKKyAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgdGltZXN0YW1wOworCSAgICAgIAorCSAgICAgIHBnaC0+cGdoX21hZ2ljID0gaHRvbmwoUEtUR0VOX01BR0lDKTsKKwkgICAgICBwZ2gtPnNlcV9udW0gICA9IGh0b25sKHBrdF9kZXYtPnNlcV9udW0pOworCSAgICAgIAorCSAgICAgIGRvX2dldHRpbWVvZmRheSgmdGltZXN0YW1wKTsKKwkgICAgICBwZ2gtPnR2X3NlYyAgICA9IGh0b25sKHRpbWVzdGFtcC50dl9zZWMpOworCSAgICAgIHBnaC0+dHZfdXNlYyAgID0gaHRvbmwodGltZXN0YW1wLnR2X3VzZWMpOworICAgICAgICB9CisgICAgICAgIHBrdF9kZXYtPnNlcV9udW0rKzsKKyAgICAgICAgCisJcmV0dXJuIHNrYjsKK30KKworLyoKKyAqIHNjYW5faXA2LCBmbXRfaXAgdGFrZW4gZnJvbSBkaWV0bGliYy0wLjIxIAorICogQXV0aG9yIEZlbGl4IHZvbiBMZWl0bmVyIDxmZWxpeC1kaWV0bGliY0BmZWZlLmRlPgorICoKKyAqIFNsaWdodGx5IG1vZGlmaWVkIGZvciBrZXJuZWwuIAorICogU2hvdWxkIGJlIGNhbmRpZGF0ZSBmb3IgbmV0L2lwdjQvdXRpbHMuYworICogLS1ybworICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2Nhbl9pcDYoY29uc3QgY2hhciAqcyxjaGFyIGlwWzE2XSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgbGVuPTA7CisJdW5zaWduZWQgbG9uZyB1OworCWNoYXIgc3VmZml4WzE2XTsKKwl1bnNpZ25lZCBpbnQgcHJlZml4bGVuPTA7CisJdW5zaWduZWQgaW50IHN1ZmZpeGxlbj0wOworCV9fdTMyIHRtcDsKKworCWZvciAoaT0wOyBpPDE2OyBpKyspIGlwW2ldPTA7CisKKwlmb3IgKDs7KSB7CisJCWlmICgqcyA9PSAnOicpIHsKKwkJCWxlbisrOworCQkJaWYgKHNbMV0gPT0gJzonKSB7ICAgICAgICAvKiBGb3VuZCAiOjoiLCBza2lwIHRvIHBhcnQgMiAqLworCQkJCXMrPTI7CisJCQkJbGVuKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzKys7CisJCX0KKwkJeworCQkJY2hhciAqdG1wOworCQkJdT1zaW1wbGVfc3RydG91bChzLCZ0bXAsMTYpOworCQkJaT10bXAtczsKKwkJfQorCisJCWlmICghaSkgcmV0dXJuIDA7CisJCWlmIChwcmVmaXhsZW49PTEyICYmIHNbaV09PScuJykgeworCisJCQkvKiB0aGUgbGFzdCA0IGJ5dGVzIG1heSBiZSB3cml0dGVuIGFzIElQdjQgYWRkcmVzcyAqLworCisJCQl0bXAgPSBpbl9hdG9uKHMpOworCQkJbWVtY3B5KChzdHJ1Y3QgaW5fYWRkciopKGlwKzEyKSwgJnRtcCwgc2l6ZW9mKHRtcCkpOworCQkJcmV0dXJuIGkrbGVuOworCQl9CisJCWlwW3ByZWZpeGxlbisrXSA9ICh1ID4+IDgpOworCQlpcFtwcmVmaXhsZW4rK10gPSAodSAmIDI1NSk7CisJCXMgKz0gaTsgbGVuICs9IGk7CisJCWlmIChwcmVmaXhsZW49PTE2KQorCQkJcmV0dXJuIGxlbjsKKwl9CisKKy8qIHBhcnQgMiwgYWZ0ZXIgIjo6IiAqLworCWZvciAoOzspIHsKKwkJaWYgKCpzID09ICc6JykgeworCQkJaWYgKHN1ZmZpeGxlbj09MCkKKwkJCQlicmVhazsKKwkJCXMrKzsKKwkJCWxlbisrOworCQl9IGVsc2UgaWYgKHN1ZmZpeGxlbiE9MCkKKwkJCWJyZWFrOworCQl7CisJCQljaGFyICp0bXA7CisJCQl1PXNpbXBsZV9zdHJ0b2wocywmdG1wLDE2KTsKKwkJCWk9dG1wLXM7CisJCX0KKwkJaWYgKCFpKSB7CisJCQlpZiAoKnMpIGxlbi0tOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHN1ZmZpeGxlbitwcmVmaXhsZW48PTEyICYmIHNbaV09PScuJykgeworCQkJdG1wID0gaW5fYXRvbihzKTsKKwkJCW1lbWNweSgoc3RydWN0IGluX2FkZHIqKShzdWZmaXgrc3VmZml4bGVuKSwgJnRtcCwgc2l6ZW9mKHRtcCkpOworCQkJc3VmZml4bGVuKz00OworCQkJbGVuKz1zdHJsZW4ocyk7CisJCQlicmVhazsKKwkJfQorCQlzdWZmaXhbc3VmZml4bGVuKytdID0gKHUgPj4gOCk7CisJCXN1ZmZpeFtzdWZmaXhsZW4rK10gPSAodSAmIDI1NSk7CisJCXMgKz0gaTsgbGVuICs9IGk7CisJCWlmIChwcmVmaXhsZW4rc3VmZml4bGVuPT0xNikKKwkJCWJyZWFrOworCX0KKwlmb3IgKGk9MDsgaTxzdWZmaXhsZW47IGkrKykKKwkJaXBbMTYtc3VmZml4bGVuK2ldID0gc3VmZml4W2ldOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBjaGFyIHRvaGV4KGNoYXIgaGV4ZGlnaXQpIHsKKwlyZXR1cm4gaGV4ZGlnaXQ+OT9oZXhkaWdpdCsnYSctMTA6aGV4ZGlnaXQrJzAnOworfQorCitzdGF0aWMgaW50IGZtdF94bG9uZyhjaGFyKiBzLHVuc2lnbmVkIGludCBpKSB7CisJY2hhciogYmFrPXM7CisJKnM9dG9oZXgoKGk+PjEyKSYweGYpOyBpZiAocyE9YmFrIHx8ICpzIT0nMCcpICsrczsKKwkqcz10b2hleCgoaT4+OCkmMHhmKTsgaWYgKHMhPWJhayB8fCAqcyE9JzAnKSArK3M7CisJKnM9dG9oZXgoKGk+PjQpJjB4Zik7IGlmIChzIT1iYWsgfHwgKnMhPScwJykgKytzOworCSpzPXRvaGV4KGkmMHhmKTsKKwlyZXR1cm4gcy1iYWsrMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBmbXRfaXA2KGNoYXIgKnMsY29uc3QgY2hhciBpcFsxNl0pIHsKKwl1bnNpZ25lZCBpbnQgbGVuOworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCB0ZW1wOworCXVuc2lnbmVkIGludCBjb21wcmVzc2luZzsKKwlpbnQgajsKKworCWxlbiA9IDA7IGNvbXByZXNzaW5nID0gMDsKKwlmb3IgKGo9MDsgajwxNjsgais9MikgeworCisjaWZkZWYgVjRNQVBQRURQUkVGSVgKKwkJaWYgKGo9PTEyICYmICFtZW1jbXAoaXAsVjRtYXBwZWRwcmVmaXgsMTIpKSB7CisJCQlpbmV0X250b2FfcigqKHN0cnVjdCBpbl9hZGRyKikoaXArMTIpLHMpOworCQkJdGVtcD1zdHJsZW4ocyk7CisJCQlyZXR1cm4gbGVuK3RlbXA7CisJCX0KKyNlbmRpZgorCQl0ZW1wID0gKCh1bnNpZ25lZCBsb25nKSAodW5zaWduZWQgY2hhcikgaXBbal0gPDwgOCkgKworCQkJKHVuc2lnbmVkIGxvbmcpICh1bnNpZ25lZCBjaGFyKSBpcFtqKzFdOworCQlpZiAodGVtcCA9PSAwKSB7CisJCQlpZiAoIWNvbXByZXNzaW5nKSB7CisJCQkJY29tcHJlc3Npbmc9MTsKKwkJCQlpZiAoaj09MCkgeworCQkJCQkqcysrPSc6JzsgKytsZW47CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGNvbXByZXNzaW5nKSB7CisJCQkJY29tcHJlc3Npbmc9MDsKKwkJCQkqcysrPSc6JzsgKytsZW47CisJCQl9CisJCQlpID0gZm10X3hsb25nKHMsdGVtcCk7IGxlbiArPSBpOyBzICs9IGk7CisJCQlpZiAoajwxNCkgeworCQkJCSpzKysgPSAnOic7CisJCQkJKytsZW47CisJCQl9CisJCX0KKwl9CisJaWYgKGNvbXByZXNzaW5nKSB7CisJCSpzKys9JzonOyArK2xlbjsKKwl9CisJKnM9MDsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmZpbGxfcGFja2V0X2lwdjYoc3RydWN0IG5ldF9kZXZpY2UgKm9kZXYsIAorCQkJCSAgIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCV9fdTggKmV0aDsKKwlzdHJ1Y3QgdWRwaGRyICp1ZHBoOworCWludCBkYXRhbGVuOworCXN0cnVjdCBpcHY2aGRyICppcGg7CisgICAgICAgIHN0cnVjdCBwa3RnZW5faGRyICpwZ2ggPSBOVUxMOworICAgICAgICAKKwlza2IgPSBhbGxvY19za2IocGt0X2Rldi0+Y3VyX3BrdF9zaXplICsgNjQgKyAxNiwgR0ZQX0FUT01JQyk7CisJaWYgKCFza2IpIHsKKwkJc3ByaW50Zihwa3RfZGV2LT5yZXN1bHQsICJObyBtZW1vcnkiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2tiX3Jlc2VydmUoc2tiLCAxNik7CisKKwkvKiAgUmVzZXJ2ZSBmb3IgZXRoZXJuZXQgYW5kIElQIGhlYWRlciAgKi8KKwlldGggPSAoX191OCAqKSBza2JfcHVzaChza2IsIDE0KTsKKwlpcGggPSAoc3RydWN0IGlwdjZoZHIgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisJdWRwaCA9IChzdHJ1Y3QgdWRwaGRyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7CisKKworICAgICAgICAvKiBVcGRhdGUgYW55IG9mIHRoZSB2YWx1ZXMsIHVzZWQgd2hlbiB3ZSdyZSBpbmNyZW1lbnRpbmcgdmFyaW91cworICAgICAgICAgKiBmaWVsZHMuCisgICAgICAgICAqLworCW1vZF9jdXJfaGVhZGVycyhwa3RfZGV2KTsKKworCQorCW1lbWNweShldGgsIHBrdF9kZXYtPmhoLCAxMik7CisJKih1MTYqKSZldGhbMTJdID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFY2KTsKKwkKKyAgICAgICAgCisJZGF0YWxlbiA9IHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZS0xNC0gCisJCXNpemVvZihzdHJ1Y3QgaXB2Nmhkciktc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOyAvKiBFdGggKyBJUGggKyBVRFBoICovCisKKwlpZiAoZGF0YWxlbiA8IHNpemVvZihzdHJ1Y3QgcGt0Z2VuX2hkcikpIHsgCisJCWRhdGFsZW4gPSBzaXplb2Yoc3RydWN0IHBrdGdlbl9oZHIpOworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAicGt0Z2VuOiBpbmNyZWFzZWQgZGF0YWxlbiB0byAlZFxuIiwgZGF0YWxlbik7CisJfQorCisJdWRwaC0+c291cmNlID0gaHRvbnMocGt0X2Rldi0+Y3VyX3VkcF9zcmMpOworCXVkcGgtPmRlc3QgPSBodG9ucyhwa3RfZGV2LT5jdXJfdWRwX2RzdCk7CisJdWRwaC0+bGVuID0gaHRvbnMoZGF0YWxlbiArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7IAorCXVkcGgtPmNoZWNrID0gMDsgIC8qIE5vIGNoZWNrc3VtICovCisKKwkgKih1MzIqKWlwaCA9IF9fY29uc3RhbnRfaHRvbmwoMHg2MDAwMDAwMCk7IC8qIFZlcnNpb24gKyBmbG93ICovCisKKwlpcGgtPmhvcF9saW1pdCA9IDMyOworCisJaXBoLT5wYXlsb2FkX2xlbiA9IGh0b25zKHNpemVvZihzdHJ1Y3QgdWRwaGRyKSArIGRhdGFsZW4pOworCWlwaC0+bmV4dGhkciA9IElQUFJPVE9fVURQOworCisJaXB2Nl9hZGRyX2NvcHkoJmlwaC0+ZGFkZHIsICZwa3RfZGV2LT5jdXJfaW42X2RhZGRyKTsKKwlpcHY2X2FkZHJfY29weSgmaXBoLT5zYWRkciwgJnBrdF9kZXYtPmN1cl9pbjZfc2FkZHIpOworCisJc2tiLT5tYWMucmF3ID0gKCh1OCAqKWlwaCkgLSAxNDsKKwlza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFY2KTsKKwlza2ItPmRldiA9IG9kZXY7CisJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOworCisJaWYgKHBrdF9kZXYtPm5mcmFncyA8PSAwKSAKKyAgICAgICAgICAgICAgICBwZ2ggPSAoc3RydWN0IHBrdGdlbl9oZHIgKilza2JfcHV0KHNrYiwgZGF0YWxlbik7CisJZWxzZSB7CisJCWludCBmcmFncyA9IHBrdF9kZXYtPm5mcmFnczsKKwkJaW50IGk7CisKKyAgICAgICAgICAgICAgICBwZ2ggPSAoc3RydWN0IHBrdGdlbl9oZHIqKSgoKGNoYXIqKSh1ZHBoKSkgKyA4KTsKKyAgICAgICAgICAgICAgICAKKwkJaWYgKGZyYWdzID4gTUFYX1NLQl9GUkFHUykKKwkJCWZyYWdzID0gTUFYX1NLQl9GUkFHUzsKKwkJaWYgKGRhdGFsZW4gPiBmcmFncypQQUdFX1NJWkUpIHsKKwkJCXNrYl9wdXQoc2tiLCBkYXRhbGVuLWZyYWdzKlBBR0VfU0laRSk7CisJCQlkYXRhbGVuID0gZnJhZ3MqUEFHRV9TSVpFOworCQl9CisKKwkJaSA9IDA7CisJCXdoaWxlIChkYXRhbGVuID4gMCkgeworCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBhbGxvY19wYWdlcyhHRlBfS0VSTkVMLCAwKTsKKwkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZSA9IHBhZ2U7CisJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2Vfb2Zmc2V0ID0gMDsKKwkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZSA9CisJCQkJKGRhdGFsZW4gPCBQQUdFX1NJWkUgPyBkYXRhbGVuIDogUEFHRV9TSVpFKTsKKwkJCWRhdGFsZW4gLT0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOworCQkJc2tiLT5sZW4gKz0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOworCQkJc2tiLT5kYXRhX2xlbiArPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CisJCQlpKys7CisJCQlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID0gaTsKKwkJfQorCisJCXdoaWxlIChpIDwgZnJhZ3MpIHsKKwkJCWludCByZW07CisKKwkJCWlmIChpID09IDApCisJCQkJYnJlYWs7CisKKwkJCXJlbSA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaSAtIDFdLnNpemUgLyAyOworCQkJaWYgKHJlbSA9PSAwKQorCQkJCWJyZWFrOworCisJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2kgLSAxXS5zaXplIC09IHJlbTsKKworCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXSA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaSAtIDFdOworCQkJZ2V0X3BhZ2Uoc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5wYWdlKTsKKwkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZSA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaSAtIDFdLnBhZ2U7CisJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2Vfb2Zmc2V0ICs9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaSAtIDFdLnNpemU7CisJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemUgPSByZW07CisJCQlpKys7CisJCQlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID0gaTsKKwkJfQorCX0KKworICAgICAgICAvKiBTdGFtcCB0aGUgdGltZSwgYW5kIHNlcXVlbmNlIG51bWJlciwgY29udmVydCB0aGVtIHRvIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworCS8qIHNob3VsZCB3ZSB1cGRhdGUgY2xvbmVkIHBhY2tldHMgdG9vID8gKi8KKyAgICAgICAgaWYgKHBnaCkgeworICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0aW1lc3RhbXA7CisJICAgICAgCisJICAgICAgcGdoLT5wZ2hfbWFnaWMgPSBodG9ubChQS1RHRU5fTUFHSUMpOworCSAgICAgIHBnaC0+c2VxX251bSAgID0gaHRvbmwocGt0X2Rldi0+c2VxX251bSk7CisJICAgICAgCisJICAgICAgZG9fZ2V0dGltZW9mZGF5KCZ0aW1lc3RhbXApOworCSAgICAgIHBnaC0+dHZfc2VjICAgID0gaHRvbmwodGltZXN0YW1wLnR2X3NlYyk7CisJICAgICAgcGdoLT50dl91c2VjICAgPSBodG9ubCh0aW1lc3RhbXAudHZfdXNlYyk7CisgICAgICAgIH0KKyAgICAgICAgcGt0X2Rldi0+c2VxX251bSsrOworICAgICAgICAKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpmaWxsX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqb2RldiwgCisJCQkJICAgc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpCit7CisJaWYocGt0X2Rldi0+ZmxhZ3MgJiBGX0lQVjYpIAorCQlyZXR1cm4gZmlsbF9wYWNrZXRfaXB2NihvZGV2LCBwa3RfZGV2KTsKKwllbHNlCisJCXJldHVybiBmaWxsX3BhY2tldF9pcHY0KG9kZXYsIHBrdF9kZXYpOworfQorCitzdGF0aWMgdm9pZCBwa3RnZW5fY2xlYXJfY291bnRlcnMoc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpIAoreworICAgICAgICBwa3RfZGV2LT5zZXFfbnVtID0gMTsKKyAgICAgICAgcGt0X2Rldi0+aWRsZV9hY2MgPSAwOworCXBrdF9kZXYtPnNvZmFyID0gMDsKKyAgICAgICAgcGt0X2Rldi0+dHhfYnl0ZXMgPSAwOworICAgICAgICBwa3RfZGV2LT5lcnJvcnMgPSAwOworfQorCisvKiBTZXQgdXAgc3RydWN0dXJlIGZvciBzZW5kaW5nIHBrdHMsIGNsZWFyIGNvdW50ZXJzICovCisKK3N0YXRpYyB2b2lkIHBrdGdlbl9ydW4oc3RydWN0IHBrdGdlbl90aHJlYWQgKnQpCit7CisgICAgICAgIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2ID0gTlVMTDsKKwlpbnQgc3RhcnRlZCA9IDA7CisKKwlQR19ERUJVRyhwcmludGsoInBrdGdlbjogZW50ZXJpbmcgcGt0Z2VuX3J1bi4gJXBcbiIsIHQpKTsKKworCWlmX2xvY2sodCk7CisgICAgICAgIGZvciAocGt0X2RldiA9IHQtPmlmX2xpc3Q7IHBrdF9kZXY7IHBrdF9kZXYgPSBwa3RfZGV2LT5uZXh0ICkgeworCisJCS8qCisJCSAqIHNldHVwIG9kZXYgYW5kIGNyZWF0ZSBpbml0aWFsIHBhY2tldC4KKwkJICovCisJCXBrdGdlbl9zZXR1cF9pbmplY3QocGt0X2Rldik7CisKKwkJaWYocGt0X2Rldi0+b2RldikgeyAKKwkJCXBrdGdlbl9jbGVhcl9jb3VudGVycyhwa3RfZGV2KTsKKwkJCXBrdF9kZXYtPnJ1bm5pbmcgPSAxOyAvKiBDcmFua2UgeWVzZWxmISAqLworCQkJcGt0X2Rldi0+c2tiID0gTlVMTDsKKwkJCXBrdF9kZXYtPnN0YXJ0ZWRfYXQgPSBnZXRDdXJVcygpOworCQkJcGt0X2Rldi0+bmV4dF90eF91cyA9IGdldEN1clVzKCk7IC8qIFRyYW5zbWl0IGltbWVkaWF0ZWx5ICovCisJCQlwa3RfZGV2LT5uZXh0X3R4X25zID0gMDsKKwkJCQorCQkJc3RyY3B5KHBrdF9kZXYtPnJlc3VsdCwgIlN0YXJ0aW5nIik7CisJCQlzdGFydGVkKys7CisJCX0KKwkJZWxzZSAKKwkJCXN0cmNweShwa3RfZGV2LT5yZXN1bHQsICJFcnJvciBzdGFydGluZyIpOworCX0KKwlpZl91bmxvY2sodCk7CisJaWYoc3RhcnRlZCkgdC0+Y29udHJvbCAmPSB+KFRfU1RPUCk7Cit9CisKK3N0YXRpYyB2b2lkIHBrdGdlbl9zdG9wX2FsbF90aHJlYWRzX2lmcyh2b2lkKQoreworICAgICAgICBzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCA9IHBrdGdlbl90aHJlYWRzOworCisJUEdfREVCVUcocHJpbnRrKCJwa3RnZW46IGVudGVyaW5nIHBrdGdlbl9zdG9wX2FsbF90aHJlYWRzLlxuIikpOworCisJdGhyZWFkX2xvY2soKTsKKwl3aGlsZSh0KSB7CisJCXBrdGdlbl9zdG9wKHQpOworCQl0ID0gdC0+bmV4dDsKKwl9CisgICAgICAgdGhyZWFkX3VubG9jaygpOworfQorCitzdGF0aWMgaW50IHRocmVhZF9pc19ydW5uaW5nKHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0ICkKK3sKKyAgICAgICAgc3RydWN0IHBrdGdlbl9kZXYgKm5leHQ7CisgICAgICAgIGludCByZXMgPSAwOworCisgICAgICAgIGZvcihuZXh0PXQtPmlmX2xpc3Q7IG5leHQ7IG5leHQ9bmV4dC0+bmV4dCkgeyAKKwkJaWYobmV4dC0+cnVubmluZykgeworCQkJcmVzID0gMTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBwa3RnZW5fd2FpdF90aHJlYWRfcnVuKHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0ICkKK3sKKyAgICAgICAgaWZfbG9jayh0KTsKKworICAgICAgICB3aGlsZSh0aHJlYWRfaXNfcnVubmluZyh0KSkgeworCisgICAgICAgICAgICAgICAgaWZfdW5sb2NrKHQpOworCisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMCk7IAorCisgICAgICAgICAgICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gc2lnbmFsOworICAgICAgICAgICAgICAgIGlmX2xvY2sodCk7CisgICAgICAgIH0KKyAgICAgICAgaWZfdW5sb2NrKHQpOworICAgICAgICByZXR1cm4gMTsKKyBzaWduYWw6CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBrdGdlbl93YWl0X2FsbF90aHJlYWRzX3J1bih2b2lkKQoreworCXN0cnVjdCBwa3RnZW5fdGhyZWFkICp0ID0gcGt0Z2VuX3RocmVhZHM7CisJaW50IHNpZyA9IDE7CisJCisJd2hpbGUgKHQpIHsKKwkJc2lnID0gcGt0Z2VuX3dhaXRfdGhyZWFkX3J1bih0KTsKKwkJaWYoIHNpZyA9PSAwICkgYnJlYWs7CisJCXRocmVhZF9sb2NrKCk7CisJCXQ9dC0+bmV4dDsKKwkJdGhyZWFkX3VubG9jaygpOworCX0KKwlpZihzaWcgPT0gMCkgeworCQl0aHJlYWRfbG9jaygpOworCQl3aGlsZSAodCkgeworCQkJdC0+Y29udHJvbCB8PSAoVF9TVE9QKTsKKwkJCXQ9dC0+bmV4dDsKKwkJfQorCQl0aHJlYWRfdW5sb2NrKCk7CisJfQorCXJldHVybiBzaWc7Cit9CisKK3N0YXRpYyB2b2lkIHBrdGdlbl9ydW5fYWxsX3RocmVhZHModm9pZCkKK3sKKyAgICAgICAgc3RydWN0IHBrdGdlbl90aHJlYWQgKnQgPSBwa3RnZW5fdGhyZWFkczsKKworCVBHX0RFQlVHKHByaW50aygicGt0Z2VuOiBlbnRlcmluZyBwa3RnZW5fcnVuX2FsbF90aHJlYWRzLlxuIikpOworCisJdGhyZWFkX2xvY2soKTsKKworCXdoaWxlKHQpIHsKKwkJdC0+Y29udHJvbCB8PSAoVF9SVU4pOworCQl0ID0gdC0+bmV4dDsKKwl9CisJdGhyZWFkX3VubG9jaygpOworCisJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJc2NoZWR1bGVfdGltZW91dChIWi84KTsgIC8qIFByb3BhZ2F0ZSB0aHJlYWQtPmNvbnRyb2wgICovCisJCQkKKwlwa3RnZW5fd2FpdF9hbGxfdGhyZWFkc19ydW4oKTsKK30KKworCitzdGF0aWMgdm9pZCBzaG93X3Jlc3VsdHMoc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYsIGludCBucl9mcmFncykKK3sKKyAgICAgICBfX3U2NCB0b3RhbF91cywgYnBzLCBtYnBzLCBwcHMsIGlkbGU7CisgICAgICAgY2hhciAqcCA9IHBrdF9kZXYtPnJlc3VsdDsKKworICAgICAgIHRvdGFsX3VzID0gcGt0X2Rldi0+c3RvcHBlZF9hdCAtIHBrdF9kZXYtPnN0YXJ0ZWRfYXQ7CisKKyAgICAgICBpZGxlID0gcGt0X2Rldi0+aWRsZV9hY2M7CisKKyAgICAgICBwICs9IHNwcmludGYocCwgIk9LOiAlbGx1KGMlbGx1K2QlbGx1KSB1c2VjLCAlbGx1ICglZGJ5dGUsJWRmcmFncylcbiIsCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHRvdGFsX3VzLCAKKwkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKHRvdGFsX3VzIC0gaWRsZSksIAorCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgaWRsZSwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0X2Rldi0+c29mYXIsIAorCQkgICAgcGt0X2Rldi0+Y3VyX3BrdF9zaXplLCBucl9mcmFncyk7CisKKyAgICAgICBwcHMgPSBwa3RfZGV2LT5zb2ZhciAqIFVTRUNfUEVSX1NFQzsKKworICAgICAgIHdoaWxlICgodG90YWxfdXMgPj4gMzIpICE9IDApIHsKKyAgICAgICAgICAgICAgIHBwcyA+Pj0gMTsKKyAgICAgICAgICAgICAgIHRvdGFsX3VzID4+PSAxOworICAgICAgIH0KKworICAgICAgIGRvX2RpdihwcHMsIHRvdGFsX3VzKTsKKyAgICAgICAKKyAgICAgICBicHMgPSBwcHMgKiA4ICogcGt0X2Rldi0+Y3VyX3BrdF9zaXplOworCisgICAgICAgbWJwcyA9IGJwczsKKyAgICAgICBkb19kaXYobWJwcywgMTAwMDAwMCk7CisgICAgICAgcCArPSBzcHJpbnRmKHAsICIgICVsbHVwcHMgJWxsdU1iL3NlYyAoJWxsdWJwcykgZXJyb3JzOiAlbGx1IiwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcHBzLCAKKwkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIG1icHMsIAorCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYnBzLCAKKwkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBrdF9kZXYtPmVycm9ycyk7Cit9CisgCisKKy8qIFNldCBzdG9wcGVkLWF0IHRpbWVyLCByZW1vdmUgZnJvbSBydW5uaW5nIGxpc3QsIGRvIGNvdW50ZXJzICYgc3RhdGlzdGljcyAqLworCitzdGF0aWMgaW50IHBrdGdlbl9zdG9wX2RldmljZShzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikgCit7CisJCisgICAgICAgIGlmICghcGt0X2Rldi0+cnVubmluZykgeworICAgICAgICAgICAgICAgIHByaW50aygicGt0Z2VuOiBpbnRlcmZhY2U6ICVzIGlzIGFscmVhZHkgc3RvcHBlZFxuIiwgcGt0X2Rldi0+aWZuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIHBrdF9kZXYtPnN0b3BwZWRfYXQgPSBnZXRDdXJVcygpOworICAgICAgICBwa3RfZGV2LT5ydW5uaW5nID0gMDsKKworCXNob3dfcmVzdWx0cyhwa3RfZGV2LCBza2Jfc2hpbmZvKHBrdF9kZXYtPnNrYiktPm5yX2ZyYWdzKTsKKworCWlmIChwa3RfZGV2LT5za2IpIAorCQlrZnJlZV9za2IocGt0X2Rldi0+c2tiKTsKKworCXBrdF9kZXYtPnNrYiA9IE5VTEw7CisJCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBrdGdlbl9kZXYgKm5leHRfdG9fcnVuKHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0ICkKK3sKKwlzdHJ1Y3QgcGt0Z2VuX2RldiAqbmV4dCwgKmJlc3QgPSBOVUxMOworICAgICAgICAKKwlpZl9sb2NrKHQpOworCisJZm9yKG5leHQ9dC0+aWZfbGlzdDsgbmV4dCA7IG5leHQ9bmV4dC0+bmV4dCkgeworCQlpZighbmV4dC0+cnVubmluZykgY29udGludWU7CisJCWlmKGJlc3QgPT0gTlVMTCkgYmVzdD1uZXh0OworCQllbHNlIGlmICggbmV4dC0+bmV4dF90eF91cyA8IGJlc3QtPm5leHRfdHhfdXMpIAorCQkJYmVzdCA9ICBuZXh0OworCX0KKwlpZl91bmxvY2sodCk7CisgICAgICAgIHJldHVybiBiZXN0OworfQorCitzdGF0aWMgdm9pZCBwa3RnZW5fc3RvcChzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCkgeworICAgICAgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqbmV4dCA9IE5VTEw7CisKKwlQR19ERUJVRyhwcmludGsoInBrdGdlbjogZW50ZXJpbmcgcGt0Z2VuX3N0b3AuXG4iKSk7CisKKyAgICAgICAgaWZfbG9jayh0KTsKKworICAgICAgICBmb3IobmV4dD10LT5pZl9saXN0OyBuZXh0OyBuZXh0PW5leHQtPm5leHQpCisgICAgICAgICAgICAgICAgcGt0Z2VuX3N0b3BfZGV2aWNlKG5leHQpOworCisgICAgICAgIGlmX3VubG9jayh0KTsKK30KKworc3RhdGljIHZvaWQgcGt0Z2VuX3JlbV9hbGxfaWZzKHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0KSAKK3sKKyAgICAgICAgc3RydWN0IHBrdGdlbl9kZXYgKmN1ciwgKm5leHQgPSBOVUxMOworICAgICAgICAKKyAgICAgICAgLyogUmVtb3ZlIGFsbCBkZXZpY2VzLCBmcmVlIG1lbSAqLworIAorICAgICAgICBpZl9sb2NrKHQpOworCisgICAgICAgIGZvcihjdXI9dC0+aWZfbGlzdDsgY3VyOyBjdXI9bmV4dCkgeyAKKwkJbmV4dCA9IGN1ci0+bmV4dDsKKwkJcGt0Z2VuX3JlbW92ZV9kZXZpY2UodCwgY3VyKTsKKwl9CisKKyAgICAgICAgaWZfdW5sb2NrKHQpOworfQorCitzdGF0aWMgdm9pZCBwa3RnZW5fcmVtX3RocmVhZChzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCkgCit7CisgICAgICAgIC8qIFJlbW92ZSBmcm9tIHRoZSB0aHJlYWQgbGlzdCAqLworCisJc3RydWN0IHBrdGdlbl90aHJlYWQgKnRtcCA9IHBrdGdlbl90aHJlYWRzOworCisgICAgICAgIGlmIChzdHJsZW4odC0+Zm5hbWUpKQorICAgICAgICAgICAgICAgIHJlbW92ZV9wcm9jX2VudHJ5KHQtPmZuYW1lLCBOVUxMKTsKKworICAgICAgIHRocmVhZF9sb2NrKCk7CisKKwlpZiAodG1wID09IHQpCisJCXBrdGdlbl90aHJlYWRzID0gdG1wLT5uZXh0OworCWVsc2UgeworCQl3aGlsZSAodG1wKSB7CisJCQlpZiAodG1wLT5uZXh0ID09IHQpIHsKKwkJCQl0bXAtPm5leHQgPSB0LT5uZXh0OworCQkJCXQtPm5leHQgPSBOVUxMOworCQkJCWJyZWFrOworCQkJfQorCQkJdG1wID0gdG1wLT5uZXh0OworCQl9CisJfQorICAgICAgICB0aHJlYWRfdW5sb2NrKCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcGt0Z2VuX3htaXQoc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm9kZXYgPSBOVUxMOworCV9fdTY0IGlkbGVfc3RhcnQgPSAwOworCWludCByZXQ7CisKKwlvZGV2ID0gcGt0X2Rldi0+b2RldjsKKwkKKwlpZiAocGt0X2Rldi0+ZGVsYXlfdXMgfHwgcGt0X2Rldi0+ZGVsYXlfbnMpIHsKKwkJdTY0IG5vdzsKKworCQlub3cgPSBnZXRDdXJVcygpOworCQlpZiAobm93IDwgcGt0X2Rldi0+bmV4dF90eF91cykKKwkJCXNwaW4ocGt0X2RldiwgcGt0X2Rldi0+bmV4dF90eF91cyk7CisKKwkJLyogVGhpcyBpcyBtYXggREVMQVksIHRoaXMgaGFzIHNwZWNpYWwgbWVhbmluZyBvZgorCQkgKiAibmV2ZXIgdHJhbnNtaXQiCisJCSAqLworCQlpZiAocGt0X2Rldi0+ZGVsYXlfdXMgPT0gMHg3RkZGRkZGRikgeworCQkJcGt0X2Rldi0+bmV4dF90eF91cyA9IGdldEN1clVzKCkgKyBwa3RfZGV2LT5kZWxheV91czsKKwkJCXBrdF9kZXYtPm5leHRfdHhfbnMgPSBwa3RfZGV2LT5kZWxheV9uczsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCQorCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKG9kZXYpIHx8IG5lZWRfcmVzY2hlZCgpKSB7CisJCWlkbGVfc3RhcnQgPSBnZXRDdXJVcygpOworCQkKKwkJaWYgKCFuZXRpZl9ydW5uaW5nKG9kZXYpKSB7CisJCQlwa3RnZW5fc3RvcF9kZXZpY2UocGt0X2Rldik7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAobmVlZF9yZXNjaGVkKCkpIAorCQkJc2NoZWR1bGUoKTsKKwkJCisJCXBrdF9kZXYtPmlkbGVfYWNjICs9IGdldEN1clVzKCkgLSBpZGxlX3N0YXJ0OworCQkKKwkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQob2RldikpIHsKKwkJCXBrdF9kZXYtPm5leHRfdHhfdXMgPSBnZXRDdXJVcygpOyAvKiBUT0RPICovCisJCQlwa3RfZGV2LT5uZXh0X3R4X25zID0gMDsKKwkJCWdvdG8gb3V0OyAvKiBUcnkgdGhlIG5leHQgaW50ZXJmYWNlICovCisJCX0KKwl9CisJCisJaWYgKHBrdF9kZXYtPmxhc3Rfb2sgfHwgIXBrdF9kZXYtPnNrYikgeworCQlpZiAoKCsrcGt0X2Rldi0+Y2xvbmVfY291bnQgPj0gcGt0X2Rldi0+Y2xvbmVfc2tiICkgfHwgKCFwa3RfZGV2LT5za2IpKSB7CisJCQkvKiBidWlsZCBhIG5ldyBwa3QgKi8KKwkJCWlmIChwa3RfZGV2LT5za2IpIAorCQkJCWtmcmVlX3NrYihwa3RfZGV2LT5za2IpOworCQkJCisJCQlwa3RfZGV2LT5za2IgPSBmaWxsX3BhY2tldChvZGV2LCBwa3RfZGV2KTsKKwkJCWlmIChwa3RfZGV2LT5za2IgPT0gTlVMTCkgeworCQkJCXByaW50aygicGt0Z2VuOiBFUlJPUjogY291bGRuJ3QgYWxsb2NhdGUgc2tiIGluIGZpbGxfcGFja2V0LlxuIik7CisJCQkJc2NoZWR1bGUoKTsKKwkJCQlwa3RfZGV2LT5jbG9uZV9jb3VudC0tOyAvKiBiYWNrIG91dCBpbmNyZW1lbnQsIE9PTSAqLworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJcGt0X2Rldi0+YWxsb2NhdGVkX3NrYnMrKzsKKwkJCXBrdF9kZXYtPmNsb25lX2NvdW50ID0gMDsgLyogcmVzZXQgY291bnRlciAqLworCQl9CisJfQorCQorCXNwaW5fbG9ja19iaCgmb2Rldi0+eG1pdF9sb2NrKTsKKwlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQob2RldikpIHsKKworCQlhdG9taWNfaW5jKCYocGt0X2Rldi0+c2tiLT51c2VycykpOworcmV0cnlfbm93OgorCQlyZXQgPSBvZGV2LT5oYXJkX3N0YXJ0X3htaXQocGt0X2Rldi0+c2tiLCBvZGV2KTsKKwkJaWYgKGxpa2VseShyZXQgPT0gTkVUREVWX1RYX09LKSkgeworCQkJcGt0X2Rldi0+bGFzdF9vayA9IDE7ICAgIAorCQkJcGt0X2Rldi0+c29mYXIrKzsKKwkJCXBrdF9kZXYtPnNlcV9udW0rKzsKKwkJCXBrdF9kZXYtPnR4X2J5dGVzICs9IHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZTsKKwkJCQorCQl9IGVsc2UgaWYgKHJldCA9PSBORVRERVZfVFhfTE9DS0VEIAorCQkJICAgJiYgKG9kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9MTFRYKSkgeworCQkJY3B1X3JlbGF4KCk7CisJCQlnb3RvIHJldHJ5X25vdzsKKwkJfSBlbHNlIHsgIC8qIFJldHJ5IGl0IG5leHQgdGltZSAqLworCQkJCisJCQlhdG9taWNfZGVjKCYocGt0X2Rldi0+c2tiLT51c2VycykpOworCQkJCisJCQlpZiAoZGVidWcgJiYgbmV0X3JhdGVsaW1pdCgpKQorCQkJCXByaW50ayhLRVJOX0lORk8gInBrdGdlbjogSGFyZCB4bWl0IGVycm9yXG4iKTsKKwkJCQorCQkJcGt0X2Rldi0+ZXJyb3JzKys7CisJCQlwa3RfZGV2LT5sYXN0X29rID0gMDsKKwkJfQorCisJCXBrdF9kZXYtPm5leHRfdHhfdXMgPSBnZXRDdXJVcygpOworCQlwa3RfZGV2LT5uZXh0X3R4X25zID0gMDsKKworCQlwa3RfZGV2LT5uZXh0X3R4X3VzICs9IHBrdF9kZXYtPmRlbGF5X3VzOworCQlwa3RfZGV2LT5uZXh0X3R4X25zICs9IHBrdF9kZXYtPmRlbGF5X25zOworCisJCWlmIChwa3RfZGV2LT5uZXh0X3R4X25zID4gMTAwMCkgeworCQkJcGt0X2Rldi0+bmV4dF90eF91cysrOworCQkJcGt0X2Rldi0+bmV4dF90eF9ucyAtPSAxMDAwOworCQl9CisJfSAKKworCWVsc2UgeyAgLyogUmV0cnkgaXQgbmV4dCB0aW1lICovCisgICAgICAgICAgICAgICAgcGt0X2Rldi0+bGFzdF9vayA9IDA7CisgICAgICAgICAgICAgICAgcGt0X2Rldi0+bmV4dF90eF91cyA9IGdldEN1clVzKCk7IC8qIFRPRE8gKi8KKwkJcGt0X2Rldi0+bmV4dF90eF9ucyA9IDA7CisgICAgICAgIH0KKworCXNwaW5fdW5sb2NrX2JoKCZvZGV2LT54bWl0X2xvY2spOworCQorCS8qIElmIHBrdF9kZXYtPmNvdW50IGlzIHplcm8sIHRoZW4gcnVuIGZvcmV2ZXIgKi8KKwlpZiAoKHBrdF9kZXYtPmNvdW50ICE9IDApICYmIChwa3RfZGV2LT5zb2ZhciA+PSBwa3RfZGV2LT5jb3VudCkpIHsKKwkJaWYgKGF0b21pY19yZWFkKCYocGt0X2Rldi0+c2tiLT51c2VycykpICE9IDEpIHsKKwkJCWlkbGVfc3RhcnQgPSBnZXRDdXJVcygpOworCQkJd2hpbGUgKGF0b21pY19yZWFkKCYocGt0X2Rldi0+c2tiLT51c2VycykpICE9IDEpIHsKKwkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXNjaGVkdWxlKCk7CisJCQl9CisJCQlwa3RfZGV2LT5pZGxlX2FjYyArPSBnZXRDdXJVcygpIC0gaWRsZV9zdGFydDsKKwkJfQorICAgICAgICAgICAgICAgIAorCQkvKiBEb25lIHdpdGggdGhpcyAqLworCQlwa3RnZW5fc3RvcF9kZXZpY2UocGt0X2Rldik7CisJfSAKKyBvdXQ6OworIH0KKworLyogCisgKiBNYWluIGxvb3Agb2YgdGhlIHRocmVhZCBnb2VzIGhlcmUKKyAqLworCitzdGF0aWMgdm9pZCBwa3RnZW5fdGhyZWFkX3dvcmtlcihzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCkgCit7CisJREVGSU5FX1dBSVQod2FpdCk7CisgICAgICAgIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2ID0gTlVMTDsKKwlpbnQgY3B1ID0gdC0+Y3B1OworCXNpZ3NldF90IHRtcHNpZzsKKwl1MzIgbWF4X2JlZm9yZV9zb2Z0aXJxOworICAgICAgICB1MzIgdHhfc2luY2Vfc29mdGlycSA9IDA7CisKKwlkYWVtb25pemUoInBrdGdlbi8lZCIsIGNwdSk7CisKKyAgICAgICAgLyogQmxvY2sgYWxsIHNpZ25hbHMgZXhjZXB0IFNJR0tJTEwsIFNJR1NUT1AgYW5kIFNJR1RFUk0gKi8KKworICAgICAgICBzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKyAgICAgICAgdG1wc2lnID0gY3VycmVudC0+YmxvY2tlZDsKKyAgICAgICAgc2lnaW5pdHNldGludigmY3VycmVudC0+YmxvY2tlZCwgCisgICAgICAgICAgICAgICAgICAgICAgc2lnbWFzayhTSUdLSUxMKSB8IAorICAgICAgICAgICAgICAgICAgICAgIHNpZ21hc2soU0lHU1RPUCl8IAorICAgICAgICAgICAgICAgICAgICAgIHNpZ21hc2soU0lHVEVSTSkpOworCisgICAgICAgIHJlY2FsY19zaWdwZW5kaW5nKCk7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisKKwkvKiBNaWdyYXRlIHRvIHRoZSByaWdodCBDUFUgKi8KKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2tfb2ZfY3B1KGNwdSkpOworICAgICAgICBpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IGNwdSkKKyAgICAgICAgICAgICAgICBCVUcoKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnQtPnF1ZXVlKTsKKworCXQtPmNvbnRyb2wgJj0gfihUX1RFUk1JTkFURSk7CisJdC0+Y29udHJvbCAmPSB+KFRfUlVOKTsKKwl0LT5jb250cm9sICY9IH4oVF9TVE9QKTsKKwl0LT5jb250cm9sICY9IH4oVF9SRU1ERVYpOworCisgICAgICAgIHQtPnBpZCA9IGN1cnJlbnQtPnBpZDsgICAgICAgIAorCisgICAgICAgIFBHX0RFQlVHKHByaW50aygicGt0Z2VuOiBzdGFydGluZyBwa3RnZW4vJWQ6ICBwaWQ9JWRcbiIsIGNwdSwgY3VycmVudC0+cGlkKSk7CisKKwltYXhfYmVmb3JlX3NvZnRpcnEgPSB0LT5tYXhfYmVmb3JlX3NvZnRpcnE7CisgICAgICAgIAorICAgICAgICBfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisgICAgICAgIG1iKCk7CisKKyAgICAgICAgd2hpbGUgKDEpIHsKKwkJCisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCQkvKgorCQkgKiBHZXQgbmV4dCBkZXYgdG8geG1pdCAtLSBpZiBhbnkuCisJCSAqLworCisgICAgICAgICAgICAgICAgcGt0X2RldiA9IG5leHRfdG9fcnVuKHQpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChwa3RfZGV2KSB7CisKKwkJCXBrdGdlbl94bWl0KHBrdF9kZXYpOworCisJCQkvKgorCQkJICogV2UgbGlrZSB0byBzdGF5IFJVTk5JTkcgYnV0IG11c3QgYWxzbyBnaXZlCisJCQkgKiBvdGhlcnMgZmFpciBzaGFyZS4KKwkJCSAqLworCisJCQl0eF9zaW5jZV9zb2Z0aXJxICs9IHBrdF9kZXYtPmxhc3Rfb2s7CisKKwkJCWlmICh0eF9zaW5jZV9zb2Z0aXJxID4gbWF4X2JlZm9yZV9zb2Z0aXJxKSB7CisJCQkJaWYgKGxvY2FsX3NvZnRpcnFfcGVuZGluZygpKQorCQkJCQlkb19zb2Z0aXJxKCk7CisJCQkJdHhfc2luY2Vfc29mdGlycSA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwcmVwYXJlX3RvX3dhaXQoJih0LT5xdWV1ZSksICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dChIWi8xMCk7CisJCQlmaW5pc2hfd2FpdCgmKHQtPnF1ZXVlKSwgJndhaXQpOworCQl9CisKKyAgICAgICAgICAgICAgICAvKiAKKwkJICogQmFjayBmcm9tIHNsZWVwLCBlaXRoZXIgZHVlIHRvIHRoZSB0aW1lb3V0IG9yIHNpZ25hbC4KKwkJICogV2UgY2hlY2sgaWYgd2UgaGF2ZSBhbnkgInBvc3RlZCIgd29yayBmb3IgdXMuCisJCSAqLworCisgICAgICAgICAgICAgICAgaWYgKHQtPmNvbnRyb2wgJiBUX1RFUk1JTkFURSB8fCBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgCisgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSByZWNlaXZlZCBhIHJlcXVlc3QgdG8gdGVybWluYXRlIG91cnNlbGYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkKKworCQlpZih0LT5jb250cm9sICYgVF9TVE9QKSB7CisJCQlwa3RnZW5fc3RvcCh0KTsKKwkJCXQtPmNvbnRyb2wgJj0gfihUX1NUT1ApOworCQl9CisKKwkJaWYodC0+Y29udHJvbCAmIFRfUlVOKSB7CisJCQlwa3RnZW5fcnVuKHQpOworCQkJdC0+Y29udHJvbCAmPSB+KFRfUlVOKTsKKwkJfQorCisJCWlmKHQtPmNvbnRyb2wgJiBUX1JFTURFVikgeworCQkJcGt0Z2VuX3JlbV9hbGxfaWZzKHQpOworCQkJdC0+Y29udHJvbCAmPSB+KFRfUkVNREVWKTsKKwkJfQorCisJCWlmIChuZWVkX3Jlc2NoZWQoKSkgCisJCQlzY2hlZHVsZSgpOworICAgICAgICB9IAorCisgICAgICAgIFBHX0RFQlVHKHByaW50aygicGt0Z2VuOiAlcyBzdG9wcGluZyBhbGwgZGV2aWNlXG4iLCB0LT5uYW1lKSk7CisgICAgICAgIHBrdGdlbl9zdG9wKHQpOworCisgICAgICAgIFBHX0RFQlVHKHByaW50aygicGt0Z2VuOiAlcyByZW1vdmluZyBhbGwgZGV2aWNlXG4iLCB0LT5uYW1lKSk7CisgICAgICAgIHBrdGdlbl9yZW1fYWxsX2lmcyh0KTsKKworICAgICAgICBQR19ERUJVRyhwcmludGsoInBrdGdlbjogJXMgcmVtb3ZpbmcgdGhyZWFkLlxuIiwgdC0+bmFtZSkpOworICAgICAgICBwa3RnZW5fcmVtX3RocmVhZCh0KTsKK30KKworc3RhdGljIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RnZW5fZmluZF9kZXYoc3RydWN0IHBrdGdlbl90aHJlYWQgKnQsIGNvbnN0IGNoYXIqIGlmbmFtZSkgCit7CisgICAgICAgIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2ID0gTlVMTDsKKyAgICAgICAgaWZfbG9jayh0KTsKKworICAgICAgICBmb3IocGt0X2Rldj10LT5pZl9saXN0OyBwa3RfZGV2OyBwa3RfZGV2ID0gcGt0X2Rldi0+bmV4dCApIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHBrdF9kZXYtPmlmbmFtZSwgaWZuYW1lKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZl91bmxvY2sodCk7CisJUEdfREVCVUcocHJpbnRrKCJwa3RnZW46IGZpbmRfZGV2KCVzKSByZXR1cm5pbmcgJXBcbiIsIGlmbmFtZSxwa3RfZGV2KSk7CisgICAgICAgIHJldHVybiBwa3RfZGV2OworfQorCisvKiAKKyAqIEFkZHMgYSBkZXYgYXQgZnJvbnQgb2YgaWZfbGlzdC4gCisgKi8KKworc3RhdGljIGludCBhZGRfZGV2X3RvX3RocmVhZChzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCwgc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpIAoreworCWludCBydiA9IDA7CisJCisgICAgICAgIGlmX2xvY2sodCk7CisKKyAgICAgICAgaWYgKHBrdF9kZXYtPnBnX3RocmVhZCkgeworICAgICAgICAgICAgICAgIHByaW50aygicGt0Z2VuOiBFUlJPUjogIGFscmVhZHkgYXNzaWduZWQgdG8gYSB0aHJlYWQuXG4iKTsKKyAgICAgICAgICAgICAgICBydiA9IC1FQlVTWTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCXBrdF9kZXYtPm5leHQgPXQtPmlmX2xpc3Q7IHQtPmlmX2xpc3Q9cGt0X2RldjsKKyAgICAgICAgcGt0X2Rldi0+cGdfdGhyZWFkID0gdDsKKwlwa3RfZGV2LT5ydW5uaW5nID0gMDsKKworIG91dDoKKyAgICAgICAgaWZfdW5sb2NrKHQpOyAgICAgICAgCisgICAgICAgIHJldHVybiBydjsKK30KKworLyogQ2FsbGVkIHVuZGVyIHRocmVhZCBsb2NrICovCisKK3N0YXRpYyBpbnQgcGt0Z2VuX2FkZF9kZXZpY2Uoc3RydWN0IHBrdGdlbl90aHJlYWQgKnQsIGNvbnN0IGNoYXIqIGlmbmFtZSkgCit7CisgICAgICAgIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2OworCQorCS8qIFdlIGRvbid0IGFsbG93IGEgZGV2aWNlIHRvIGJlIG9uIHNldmVyYWwgdGhyZWFkcyAqLworCisJaWYoIChwa3RfZGV2ID0gX19wa3RnZW5fTk5fdGhyZWFkcyhpZm5hbWUsIEZJTkQpKSA9PSBOVUxMKSB7CisJCQkJCQkgICAKKwkJcGt0X2RldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwa3RnZW5fZGV2KSwgR0ZQX0tFUk5FTCk7CisgICAgICAgICAgICAgICAgaWYgKCFwa3RfZGV2KSAKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworCisgICAgICAgICAgICAgICAgbWVtc2V0KHBrdF9kZXYsIDAsIHNpemVvZihzdHJ1Y3QgcGt0Z2VuX2RldikpOworCisJCXBrdF9kZXYtPmZsb3dzID0gdm1hbGxvYyhNQVhfQ0ZMT1dTKnNpemVvZihzdHJ1Y3QgZmxvd19zdGF0ZSkpOworCQlpZiAocGt0X2Rldi0+Zmxvd3MgPT0gTlVMTCkgeworCQkJa2ZyZWUocGt0X2Rldik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQltZW1zZXQocGt0X2Rldi0+Zmxvd3MsIDAsIE1BWF9DRkxPV1Mqc2l6ZW9mKHN0cnVjdCBmbG93X3N0YXRlKSk7CisKKwkJcGt0X2Rldi0+bWluX3BrdF9zaXplID0gRVRIX1pMRU47CisgICAgICAgICAgICAgICAgcGt0X2Rldi0+bWF4X3BrdF9zaXplID0gRVRIX1pMRU47CisgICAgICAgICAgICAgICAgcGt0X2Rldi0+bmZyYWdzID0gMDsKKyAgICAgICAgICAgICAgICBwa3RfZGV2LT5jbG9uZV9za2IgPSBwZ19jbG9uZV9za2JfZDsKKyAgICAgICAgICAgICAgICBwa3RfZGV2LT5kZWxheV91cyA9IHBnX2RlbGF5X2QgLyAxMDAwOworICAgICAgICAgICAgICAgIHBrdF9kZXYtPmRlbGF5X25zID0gcGdfZGVsYXlfZCAlIDEwMDA7CisgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y291bnQgPSBwZ19jb3VudF9kOworICAgICAgICAgICAgICAgIHBrdF9kZXYtPnNvZmFyID0gMDsKKyAgICAgICAgICAgICAgICBwa3RfZGV2LT51ZHBfc3JjX21pbiA9IDk7IC8qIHNpbmsgcG9ydCAqLworICAgICAgICAgICAgICAgIHBrdF9kZXYtPnVkcF9zcmNfbWF4ID0gOTsKKyAgICAgICAgICAgICAgICBwa3RfZGV2LT51ZHBfZHN0X21pbiA9IDk7CisgICAgICAgICAgICAgICAgcGt0X2Rldi0+dWRwX2RzdF9tYXggPSA5OworCisgICAgICAgICAgICAgICAgc3RybmNweShwa3RfZGV2LT5pZm5hbWUsIGlmbmFtZSwgMzEpOworICAgICAgICAgICAgICAgIHNwcmludGYocGt0X2Rldi0+Zm5hbWUsICJuZXQvJXMvJXMiLCBQR19QUk9DX0RJUiwgaWZuYW1lKTsKKworICAgICAgICAgICAgICAgIGlmICghIHBrdGdlbl9zZXR1cF9kZXYocGt0X2RldikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygicGt0Z2VuOiBFUlJPUjogcGt0Z2VuX3NldHVwX2RldiBmYWlsZWQuXG4iKTsKKwkJCWlmIChwa3RfZGV2LT5mbG93cykKKwkJCQl2ZnJlZShwa3RfZGV2LT5mbG93cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShwa3RfZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBrdF9kZXYtPnByb2NfZW50ID0gY3JlYXRlX3Byb2NfZW50cnkocGt0X2Rldi0+Zm5hbWUsIDA2MDAsIE5VTEwpOworICAgICAgICAgICAgICAgIGlmICghcGt0X2Rldi0+cHJvY19lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygicGt0Z2VuOiBjYW5ub3QgY3JlYXRlICVzIHByb2NmcyBlbnRyeS5cbiIsIHBrdF9kZXYtPmZuYW1lKTsKKwkJCWlmIChwa3RfZGV2LT5mbG93cykKKwkJCQl2ZnJlZShwa3RfZGV2LT5mbG93cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShwa3RfZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwa3RfZGV2LT5wcm9jX2VudC0+cmVhZF9wcm9jID0gcHJvY19pZl9yZWFkOworICAgICAgICAgICAgICAgIHBrdF9kZXYtPnByb2NfZW50LT53cml0ZV9wcm9jID0gcHJvY19pZl93cml0ZTsKKyAgICAgICAgICAgICAgICBwa3RfZGV2LT5wcm9jX2VudC0+ZGF0YSA9ICh2b2lkKikocGt0X2Rldik7CisJCXBrdF9kZXYtPnByb2NfZW50LT5vd25lciA9IFRISVNfTU9EVUxFOworCisgICAgICAgICAgICAgICAgcmV0dXJuIGFkZF9kZXZfdG9fdGhyZWFkKHQsIHBrdF9kZXYpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50aygicGt0Z2VuOiBFUlJPUjogaW50ZXJmYWNlIGFscmVhZHkgdXNlZC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgICAgIH0KK30KKworc3RhdGljIHN0cnVjdCBwa3RnZW5fdGhyZWFkICpwa3RnZW5fZmluZF90aHJlYWQoY29uc3QgY2hhciogbmFtZSkgCit7CisgICAgICAgIHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0ID0gTlVMTDsKKworICAgICAgIHRocmVhZF9sb2NrKCk7CisKKyAgICAgICAgdCA9IHBrdGdlbl90aHJlYWRzOworICAgICAgICB3aGlsZSAodCkgeworICAgICAgICAgICAgICAgIGlmIChzdHJjbXAodC0+bmFtZSwgbmFtZSkgPT0gMCkgCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIHQgPSB0LT5uZXh0OworICAgICAgICB9CisgICAgICAgIHRocmVhZF91bmxvY2soKTsKKyAgICAgICAgcmV0dXJuIHQ7Cit9CisKK3N0YXRpYyBpbnQgcGt0Z2VuX2NyZWF0ZV90aHJlYWQoY29uc3QgY2hhciogbmFtZSwgaW50IGNwdSkgCit7CisgICAgICAgIHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0ID0gTlVMTDsKKworICAgICAgICBpZiAoc3RybGVuKG5hbWUpID4gMzEpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoInBrdGdlbjogRVJST1I6ICBUaHJlYWQgbmFtZSBjYW5ub3QgYmUgbW9yZSB0aGFuIDMxIGNoYXJhY3RlcnMuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHBrdGdlbl9maW5kX3RocmVhZChuYW1lKSkgeworICAgICAgICAgICAgICAgIHByaW50aygicGt0Z2VuOiBFUlJPUjogdGhyZWFkOiAlcyBhbHJlYWR5IGV4aXN0c1xuIiwgbmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICB0ID0gKHN0cnVjdCBwa3RnZW5fdGhyZWFkKikoa21hbGxvYyhzaXplb2Yoc3RydWN0IHBrdGdlbl90aHJlYWQpLCBHRlBfS0VSTkVMKSk7CisgICAgICAgIGlmICghdCkgeworICAgICAgICAgICAgICAgIHByaW50aygicGt0Z2VuOiBFUlJPUjogb3V0IG9mIG1lbW9yeSwgY2FuJ3QgY3JlYXRlIG5ldyB0aHJlYWQuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldCh0LCAwLCBzaXplb2Yoc3RydWN0IHBrdGdlbl90aHJlYWQpKTsKKyAgICAgICAgc3RyY3B5KHQtPm5hbWUsIG5hbWUpOworICAgICAgICBzcGluX2xvY2tfaW5pdCgmdC0+aWZfbG9jayk7CisJdC0+Y3B1ID0gY3B1OworICAgICAgICAKKyAgICAgICAgc3ByaW50Zih0LT5mbmFtZSwgIm5ldC8lcy8lcyIsIFBHX1BST0NfRElSLCB0LT5uYW1lKTsKKyAgICAgICAgdC0+cHJvY19lbnQgPSBjcmVhdGVfcHJvY19lbnRyeSh0LT5mbmFtZSwgMDYwMCwgTlVMTCk7CisgICAgICAgIGlmICghdC0+cHJvY19lbnQpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoInBrdGdlbjogY2Fubm90IGNyZWF0ZSAlcyBwcm9jZnMgZW50cnkuXG4iLCB0LT5mbmFtZSk7CisgICAgICAgICAgICAgICAga2ZyZWUodCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgdC0+cHJvY19lbnQtPnJlYWRfcHJvYyA9IHByb2NfdGhyZWFkX3JlYWQ7CisgICAgICAgIHQtPnByb2NfZW50LT53cml0ZV9wcm9jID0gcHJvY190aHJlYWRfd3JpdGU7CisgICAgICAgIHQtPnByb2NfZW50LT5kYXRhID0gKHZvaWQqKSh0KTsKKyAgICAgICAgdC0+cHJvY19lbnQtPm93bmVyID0gVEhJU19NT0RVTEU7CisKKyAgICAgICAgdC0+bmV4dCA9IHBrdGdlbl90aHJlYWRzOworICAgICAgICBwa3RnZW5fdGhyZWFkcyA9IHQ7CisKKwlpZiAoa2VybmVsX3RocmVhZCgodm9pZCAqKSBwa3RnZW5fdGhyZWFkX3dvcmtlciwgKHZvaWQgKikgdCwgCisJCQkgIENMT05FX0ZTIHwgQ0xPTkVfRklMRVMgfCBDTE9ORV9TSUdIQU5EKSA8IDApCisJCXByaW50aygicGt0Z2VuOiBrZXJuZWxfdGhyZWFkKCkgZmFpbGVkIGZvciBjcHUgJWRcbiIsIHQtPmNwdSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogCisgKiBSZW1vdmVzIGEgZGV2aWNlIGZyb20gdGhlIHRocmVhZCBpZl9saXN0LiAKKyAqLworc3RhdGljIHZvaWQgX3JlbV9kZXZfZnJvbV9pZl9saXN0KHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0LCBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikgCit7CisJc3RydWN0IHBrdGdlbl9kZXYgKmksICpwcmV2ID0gTlVMTDsKKworCWkgPSB0LT5pZl9saXN0OworCisJd2hpbGUoaSkgeworCQlpZihpID09IHBrdF9kZXYpIHsKKwkJCWlmKHByZXYpIHByZXYtPm5leHQgPSBpLT5uZXh0OworCQkJZWxzZSB0LT5pZl9saXN0ID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCXByZXYgPSBpOworCQlpPWktPm5leHQ7CisJfQorfQorCitzdGF0aWMgaW50IHBrdGdlbl9yZW1vdmVfZGV2aWNlKHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0LCBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikgCit7CisKKwlQR19ERUJVRyhwcmludGsoInBrdGdlbjogcmVtb3ZlX2RldmljZSBwa3RfZGV2PSVwXG4iLCBwa3RfZGV2KSk7CisKKyAgICAgICAgaWYgKHBrdF9kZXYtPnJ1bm5pbmcpIHsgCisgICAgICAgICAgICAgICAgcHJpbnRrKCJwa3RnZW46V0FSTklORzogdHJ5aW5nIHRvIHJlbW92ZSBhIHJ1bm5pbmcgaW50ZXJmYWNlLCBzdG9wcGluZyBpdCBub3cuXG4iKTsKKyAgICAgICAgICAgICAgICBwa3RnZW5fc3RvcF9kZXZpY2UocGt0X2Rldik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qIERpcy1hc3NvY2lhdGUgZnJvbSB0aGUgaW50ZXJmYWNlICovCisKKwlpZiAocGt0X2Rldi0+b2RldikgeworCQlkZXZfcHV0KHBrdF9kZXYtPm9kZXYpOworICAgICAgICAgICAgICAgIHBrdF9kZXYtPm9kZXYgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIAorCS8qIEFuZCB1cGRhdGUgdGhlIHRocmVhZCBpZl9saXN0ICovCisKKwlfcmVtX2Rldl9mcm9tX2lmX2xpc3QodCwgcGt0X2Rldik7CisKKyAgICAgICAgLyogQ2xlYW4gdXAgcHJvYyBmaWxlIHN5c3RlbSAqLworCisgICAgICAgIGlmIChzdHJsZW4ocGt0X2Rldi0+Zm5hbWUpKSAKKyAgICAgICAgICAgICAgICByZW1vdmVfcHJvY19lbnRyeShwa3RfZGV2LT5mbmFtZSwgTlVMTCk7CisKKwlpZiAocGt0X2Rldi0+Zmxvd3MpCisJCXZmcmVlKHBrdF9kZXYtPmZsb3dzKTsKKwlrZnJlZShwa3RfZGV2KTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBnX2luaXQodm9pZCkgCit7CisJaW50IGNwdTsKKwlwcmludGsodmVyc2lvbik7CisKKyAgICAgICAgbW9kdWxlX2ZuYW1lWzBdID0gMDsKKworCWNyZWF0ZV9wcm9jX2RpcigpOworCisgICAgICAgIHNwcmludGYobW9kdWxlX2ZuYW1lLCAibmV0LyVzL3BnY3RybCIsIFBHX1BST0NfRElSKTsKKyAgICAgICAgbW9kdWxlX3Byb2NfZW50ID0gY3JlYXRlX3Byb2NfZW50cnkobW9kdWxlX2ZuYW1lLCAwNjAwLCBOVUxMKTsKKyAgICAgICAgaWYgKCFtb2R1bGVfcHJvY19lbnQpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoInBrdGdlbjogRVJST1I6IGNhbm5vdCBjcmVhdGUgJXMgcHJvY2ZzIGVudHJ5LlxuIiwgbW9kdWxlX2ZuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIG1vZHVsZV9wcm9jX2VudC0+cHJvY19mb3BzID0gICZwa3RnZW5fZm9wczsKKyAgICAgICAgbW9kdWxlX3Byb2NfZW50LT5kYXRhID0gTlVMTDsKKworCS8qIFJlZ2lzdGVyIHVzIHRvIHJlY2VpdmUgbmV0ZGV2aWNlIGV2ZW50cyAqLworCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmcGt0Z2VuX25vdGlmaWVyX2Jsb2NrKTsKKyAgICAgICAgCisJZm9yIChjcHUgPSAwOyBjcHUgPCBOUl9DUFVTIDsgY3B1KyspIHsKKwkJY2hhciBidWZbMzBdOworCisJCWlmICghY3B1X29ubGluZShjcHUpKQorCQkJY29udGludWU7CisKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGJ1ZiwgImtwa3RnZW5kXyVpIiwgY3B1KTsKKyAgICAgICAgICAgICAgICBwa3RnZW5fY3JlYXRlX3RocmVhZChidWYsIGNwdSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7ICAgICAgICAKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBnX2NsZWFudXAodm9pZCkKK3sKKwl3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZxdWV1ZSk7CisKKyAgICAgICAgLyogU3RvcCBhbGwgaW50ZXJmYWNlcyAmIHRocmVhZHMgKi8gICAgICAgIAorCisgICAgICAgIHdoaWxlIChwa3RnZW5fdGhyZWFkcykgeworICAgICAgICAgICAgICAgIHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0ID0gcGt0Z2VuX3RocmVhZHM7CisgICAgICAgICAgICAgICAgcGt0Z2VuX3RocmVhZHMtPmNvbnRyb2wgfD0gKFRfVEVSTUlOQVRFKTsKKworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChxdWV1ZSwgKHQgIT0gcGt0Z2VuX3RocmVhZHMpLCBIWik7CisgICAgICAgIH0KKworICAgICAgICAvKiBVbi1yZWdpc3RlciB1cyBmcm9tIHJlY2VpdmluZyBuZXRkZXZpY2UgZXZlbnRzICovCisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJnBrdGdlbl9ub3RpZmllcl9ibG9jayk7CisKKyAgICAgICAgLyogQ2xlYW4gdXAgcHJvYyBmaWxlIHN5c3RlbSAqLworCisgICAgICAgIHJlbW92ZV9wcm9jX2VudHJ5KG1vZHVsZV9mbmFtZSwgTlVMTCk7CisgICAgICAgIAorCXJlbW92ZV9wcm9jX2RpcigpOworfQorCisKK21vZHVsZV9pbml0KHBnX2luaXQpOworbW9kdWxlX2V4aXQocGdfY2xlYW51cCk7CisKK01PRFVMRV9BVVRIT1IoIlJvYmVydCBPbHNzb24gPHJvYmVydC5vbHNzb25AaXRzLnV1LnNlIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBhY2tldCBHZW5lcmF0b3IgdG9vbCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX3BhcmFtKHBnX2NvdW50X2QsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ocGdfZGVsYXlfZCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShwZ19jbG9uZV9za2JfZCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3J0bmV0bGluay5jIGIvbmV0L2NvcmUvcnRuZXRsaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5YWQ5MAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9jb3JlL3J0bmV0bGluay5jCkBAIC0wLDAgKzEsNzExIEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCVJvdXRpbmcgbmV0bGluayBzb2NrZXQgaW50ZXJmYWNlOiBwcm90b2NvbCBpbmRlcGVuZGVudCBwYXJ0LgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglGaXhlczoKKyAqCVZpdGFseSBFLiBMYXZyb3YJCVJUQV9PSyBhcml0aG1ldGljcyB3YXMgd3JvbmcuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPG5ldC91ZHAuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KKworREVDTEFSRV9NVVRFWChydG5sX3NlbSk7CisKK3ZvaWQgcnRubF9sb2NrKHZvaWQpCit7CisJcnRubF9zaGxvY2soKTsKK30KKworaW50IHJ0bmxfbG9ja19pbnRlcnJ1cHRpYmxlKHZvaWQpCit7CisJcmV0dXJuIGRvd25faW50ZXJydXB0aWJsZSgmcnRubF9zZW0pOworfQorIAordm9pZCBydG5sX3VubG9jayh2b2lkKQoreworCXJ0bmxfc2h1bmxvY2soKTsKKworCW5ldGRldl9ydW5fdG9kbygpOworfQorCitpbnQgcnRhdHRyX3BhcnNlKHN0cnVjdCBydGF0dHIgKnRiW10sIGludCBtYXhhdHRyLCBzdHJ1Y3QgcnRhdHRyICpydGEsIGludCBsZW4pCit7CisJbWVtc2V0KHRiLCAwLCBzaXplb2Yoc3RydWN0IHJ0YXR0ciopKm1heGF0dHIpOworCisJd2hpbGUgKFJUQV9PSyhydGEsIGxlbikpIHsKKwkJdW5zaWduZWQgZmxhdm9yID0gcnRhLT5ydGFfdHlwZTsKKwkJaWYgKGZsYXZvciAmJiBmbGF2b3IgPD0gbWF4YXR0cikKKwkJCXRiW2ZsYXZvci0xXSA9IHJ0YTsKKwkJcnRhID0gUlRBX05FWFQocnRhLCBsZW4pOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHNvY2sgKnJ0bmw7CisKK3N0cnVjdCBydG5ldGxpbmtfbGluayAqIHJ0bmV0bGlua19saW5rc1tOUFJPVE9dOworCitzdGF0aWMgY29uc3QgaW50IHJ0bV9taW5bKFJUTV9NQVgrMS1SVE1fQkFTRSkvNF0gPQoreworCU5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IGlmaW5mb21zZykpLAorCU5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IGlmYWRkcm1zZykpLAorCU5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IHJ0bXNnKSksCisJTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgbmRtc2cpKSwKKwlOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBydG1zZykpLAorCU5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IHRjbXNnKSksCisJTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgdGNtc2cpKSwKKwlOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCB0Y21zZykpLAorCU5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IHRjYW1zZykpCit9OworCitzdGF0aWMgY29uc3QgaW50IHJ0YV9tYXhbKFJUTV9NQVgrMS1SVE1fQkFTRSkvNF0gPQoreworCUlGTEFfTUFYLAorCUlGQV9NQVgsCisJUlRBX01BWCwKKwlOREFfTUFYLAorCVJUQV9NQVgsCisJVENBX01BWCwKKwlUQ0FfTUFYLAorCVRDQV9NQVgsCisJVENBQV9NQVgKK307CisKK3ZvaWQgX19ydGFfZmlsbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgYXR0cnR5cGUsIGludCBhdHRybGVuLCBjb25zdCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBydGF0dHIgKnJ0YTsKKwlpbnQgc2l6ZSA9IFJUQV9MRU5HVEgoYXR0cmxlbik7CisKKwlydGEgPSAoc3RydWN0IHJ0YXR0ciopc2tiX3B1dChza2IsIFJUQV9BTElHTihzaXplKSk7CisJcnRhLT5ydGFfdHlwZSA9IGF0dHJ0eXBlOworCXJ0YS0+cnRhX2xlbiA9IHNpemU7CisJbWVtY3B5KFJUQV9EQVRBKHJ0YSksIGRhdGEsIGF0dHJsZW4pOworfQorCitzaXplX3QgcnRhdHRyX3N0cmxjcHkoY2hhciAqZGVzdCwgY29uc3Qgc3RydWN0IHJ0YXR0ciAqcnRhLCBzaXplX3Qgc2l6ZSkKK3sKKwlzaXplX3QgcmV0ID0gUlRBX1BBWUxPQUQocnRhKTsKKwljaGFyICpzcmMgPSBSVEFfREFUQShydGEpOworCisJaWYgKHJldCA+IDAgJiYgc3JjW3JldCAtIDFdID09ICdcMCcpCisJCXJldC0tOworCWlmIChzaXplID4gMCkgeworCQlzaXplX3QgbGVuID0gKHJldCA+PSBzaXplKSA/IHNpemUgLSAxIDogcmV0OworCQltZW1zZXQoZGVzdCwgMCwgc2l6ZSk7CisJCW1lbWNweShkZXN0LCBzcmMsIGxlbik7CisJfQorCXJldHVybiByZXQ7Cit9CisKK2ludCBydG5ldGxpbmtfc2VuZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgcGlkLCB1bnNpZ25lZCBncm91cCwgaW50IGVjaG8pCit7CisJaW50IGVyciA9IDA7CisKKwlORVRMSU5LX0NCKHNrYikuZHN0X2dyb3VwcyA9IGdyb3VwOworCWlmIChlY2hvKQorCQlhdG9taWNfaW5jKCZza2ItPnVzZXJzKTsKKwluZXRsaW5rX2Jyb2FkY2FzdChydG5sLCBza2IsIHBpZCwgZ3JvdXAsIEdGUF9LRVJORUwpOworCWlmIChlY2hvKQorCQllcnIgPSBuZXRsaW5rX3VuaWNhc3QocnRubCwgc2tiLCBwaWQsIE1TR19ET05UV0FJVCk7CisJcmV0dXJuIGVycjsKK30KKworaW50IHJ0bmV0bGlua19wdXRfbWV0cmljcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgKm1ldHJpY3MpCit7CisJc3RydWN0IHJ0YXR0ciAqbXggPSAoc3RydWN0IHJ0YXR0ciopc2tiLT50YWlsOworCWludCBpOworCisJUlRBX1BVVChza2IsIFJUQV9NRVRSSUNTLCAwLCBOVUxMKTsKKwlmb3IgKGk9MDsgaTxSVEFYX01BWDsgaSsrKSB7CisJCWlmIChtZXRyaWNzW2ldKQorCQkJUlRBX1BVVChza2IsIGkrMSwgc2l6ZW9mKHUzMiksIG1ldHJpY3MraSk7CisJfQorCW14LT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4KilteDsKKwlpZiAobXgtPnJ0YV9sZW4gPT0gUlRBX0xFTkdUSCgwKSkKKwkJc2tiX3RyaW0oc2tiLCAodTgqKW14IC0gc2tiLT5kYXRhKTsKKwlyZXR1cm4gMDsKKworcnRhdHRyX2ZhaWx1cmU6CisJc2tiX3RyaW0oc2tiLCAodTgqKW14IC0gc2tiLT5kYXRhKTsKKwlyZXR1cm4gLTE7Cit9CisKKworc3RhdGljIGludCBydG5ldGxpbmtfZmlsbF9pZmluZm8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgaW50IHR5cGUsIHUzMiBwaWQsIHUzMiBzZXEsIHUzMiBjaGFuZ2UpCit7CisJc3RydWN0IGlmaW5mb21zZyAqcjsKKwlzdHJ1Y3Qgbmxtc2doZHIgICpubGg7CisJdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisKKwlubGggPSBOTE1TR19QVVQoc2tiLCBwaWQsIHNlcSwgdHlwZSwgc2l6ZW9mKCpyKSk7CisJaWYgKHBpZCkgbmxoLT5ubG1zZ19mbGFncyB8PSBOTE1fRl9NVUxUSTsKKwlyID0gTkxNU0dfREFUQShubGgpOworCXItPmlmaV9mYW1pbHkgPSBBRl9VTlNQRUM7CisJci0+aWZpX3R5cGUgPSBkZXYtPnR5cGU7CisJci0+aWZpX2luZGV4ID0gZGV2LT5pZmluZGV4OworCXItPmlmaV9mbGFncyA9IGRldl9nZXRfZmxhZ3MoZGV2KTsKKwlyLT5pZmlfY2hhbmdlID0gY2hhbmdlOworCisJUlRBX1BVVChza2IsIElGTEFfSUZOQU1FLCBzdHJsZW4oZGV2LT5uYW1lKSsxLCBkZXYtPm5hbWUpOworCisJaWYgKDEpIHsKKwkJdTMyIHR4cWxlbiA9IGRldi0+dHhfcXVldWVfbGVuOworCQlSVEFfUFVUKHNrYiwgSUZMQV9UWFFMRU4sIHNpemVvZih0eHFsZW4pLCAmdHhxbGVuKTsKKwl9CisKKwlpZiAoMSkgeworCQl1MzIgd2VpZ2h0ID0gZGV2LT53ZWlnaHQ7CisJCVJUQV9QVVQoc2tiLCBJRkxBX1dFSUdIVCwgc2l6ZW9mKHdlaWdodCksICZ3ZWlnaHQpOworCX0KKworCWlmICgxKSB7CisJCXN0cnVjdCBydG5sX2xpbmtfaWZtYXAgbWFwID0geworCQkJLm1lbV9zdGFydCAgID0gZGV2LT5tZW1fc3RhcnQsCisJCQkubWVtX2VuZCAgICAgPSBkZXYtPm1lbV9lbmQsCisJCQkuYmFzZV9hZGRyICAgPSBkZXYtPmJhc2VfYWRkciwKKwkJCS5pcnEgICAgICAgICA9IGRldi0+aXJxLAorCQkJLmRtYSAgICAgICAgID0gZGV2LT5kbWEsCisJCQkucG9ydCAgICAgICAgPSBkZXYtPmlmX3BvcnQsCisJCX07CisJCVJUQV9QVVQoc2tiLCBJRkxBX01BUCwgc2l6ZW9mKG1hcCksICZtYXApOworCX0KKworCWlmIChkZXYtPmFkZHJfbGVuKSB7CisJCVJUQV9QVVQoc2tiLCBJRkxBX0FERFJFU1MsIGRldi0+YWRkcl9sZW4sIGRldi0+ZGV2X2FkZHIpOworCQlSVEFfUFVUKHNrYiwgSUZMQV9CUk9BRENBU1QsIGRldi0+YWRkcl9sZW4sIGRldi0+YnJvYWRjYXN0KTsKKwl9CisKKwlpZiAoMSkgeworCQl1MzIgbXR1ID0gZGV2LT5tdHU7CisJCVJUQV9QVVQoc2tiLCBJRkxBX01UVSwgc2l6ZW9mKG10dSksICZtdHUpOworCX0KKworCWlmIChkZXYtPmlmaW5kZXggIT0gZGV2LT5pZmxpbmspIHsKKwkJdTMyIGlmbGluayA9IGRldi0+aWZsaW5rOworCQlSVEFfUFVUKHNrYiwgSUZMQV9MSU5LLCBzaXplb2YoaWZsaW5rKSwgJmlmbGluayk7CisJfQorCisJaWYgKGRldi0+cWRpc2Nfc2xlZXBpbmcpCisJCVJUQV9QVVQoc2tiLCBJRkxBX1FESVNDLAorCQkJc3RybGVuKGRldi0+cWRpc2Nfc2xlZXBpbmctPm9wcy0+aWQpICsgMSwKKwkJCWRldi0+cWRpc2Nfc2xlZXBpbmctPm9wcy0+aWQpOworCQorCWlmIChkZXYtPm1hc3RlcikgeworCQl1MzIgbWFzdGVyID0gZGV2LT5tYXN0ZXItPmlmaW5kZXg7CisJCVJUQV9QVVQoc2tiLCBJRkxBX01BU1RFUiwgc2l6ZW9mKG1hc3RlciksICZtYXN0ZXIpOworCX0KKworCWlmIChkZXYtPmdldF9zdGF0cykgeworCQl1bnNpZ25lZCBsb25nICpzdGF0cyA9ICh1bnNpZ25lZCBsb25nKilkZXYtPmdldF9zdGF0cyhkZXYpOworCQlpZiAoc3RhdHMpIHsKKwkJCXN0cnVjdCBydGF0dHIgICphOworCQkJX191MzIJICAgICAgICpzOworCQkJaW50CQlpOworCQkJaW50CQluID0gc2l6ZW9mKHN0cnVjdCBydG5sX2xpbmtfc3RhdHMpLzQ7CisKKwkJCWEgPSBfX1JUQV9QVVQoc2tiLCBJRkxBX1NUQVRTLCBuKjQpOworCQkJcyA9IFJUQV9EQVRBKGEpOworCQkJZm9yIChpPTA7IGk8bjsgaSsrKQorCQkJCXNbaV0gPSBzdGF0c1tpXTsKKwkJfQorCX0KKwlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJcmV0dXJuIHNrYi0+bGVuOworCitubG1zZ19mYWlsdXJlOgorcnRhdHRyX2ZhaWx1cmU6CisJc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgcnRuZXRsaW5rX2R1bXBfaWZpbmZvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlpbnQgaWR4OworCWludCBzX2lkeCA9IGNiLT5hcmdzWzBdOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOworCWZvciAoZGV2PWRldl9iYXNlLCBpZHg9MDsgZGV2OyBkZXYgPSBkZXYtPm5leHQsIGlkeCsrKSB7CisJCWlmIChpZHggPCBzX2lkeCkKKwkJCWNvbnRpbnVlOworCQlpZiAocnRuZXRsaW5rX2ZpbGxfaWZpbmZvKHNrYiwgZGV2LCBSVE1fTkVXTElOSywgTkVUTElOS19DQihjYi0+c2tiKS5waWQsIGNiLT5ubGgtPm5sbXNnX3NlcSwgMCkgPD0gMCkKKwkJCWJyZWFrOworCX0KKwlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7CisJY2ItPmFyZ3NbMF0gPSBpZHg7CisKKwlyZXR1cm4gc2tiLT5sZW47Cit9CisKK3N0YXRpYyBpbnQgZG9fc2V0bGluayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBpZmluZm9tc2cgICppZm0gPSBOTE1TR19EQVRBKG5saCk7CisJc3RydWN0IHJ0YXR0ciAgICAqKmlkYSA9IGFyZzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBlcnIsIHNlbmRfYWRkcl9ub3RpZnkgPSAwOworCisJaWYgKGlmbS0+aWZpX2luZGV4ID49IDApCisJCWRldiA9IGRldl9nZXRfYnlfaW5kZXgoaWZtLT5pZmlfaW5kZXgpOworCWVsc2UgaWYgKGlkYVtJRkxBX0lGTkFNRSAtIDFdKSB7CisJCWNoYXIgaWZuYW1lW0lGTkFNU0laXTsKKworCQlpZiAocnRhdHRyX3N0cmxjcHkoaWZuYW1lLCBpZGFbSUZMQV9JRk5BTUUgLSAxXSwKKwkJICAgICAgICAgICAgICAgICAgIElGTkFNU0laKSA+PSBJRk5BTVNJWikKKwkJCXJldHVybiAtRUlOVkFMOworCQlkZXYgPSBkZXZfZ2V0X2J5X25hbWUoaWZuYW1lKTsKKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwllcnIgPSAtRUlOVkFMOworCisJaWYgKGlmbS0+aWZpX2ZsYWdzKQorCQlkZXZfY2hhbmdlX2ZsYWdzKGRldiwgaWZtLT5pZmlfZmxhZ3MpOworCisJaWYgKGlkYVtJRkxBX01BUCAtIDFdKSB7CisJCXN0cnVjdCBydG5sX2xpbmtfaWZtYXAgKnVfbWFwOworCQlzdHJ1Y3QgaWZtYXAga19tYXA7CisKKwkJaWYgKCFkZXYtPnNldF9jb25maWcpIHsKKwkJCWVyciA9IC1FT1BOT1RTVVBQOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpIHsKKwkJCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIG91dDsKKwkJfQorCQkKKwkJaWYgKGlkYVtJRkxBX01BUCAtIDFdLT5ydGFfbGVuICE9IFJUQV9MRU5HVEgoc2l6ZW9mKCp1X21hcCkpKQorCQkJZ290byBvdXQ7CisKKwkJdV9tYXAgPSBSVEFfREFUQShpZGFbSUZMQV9NQVAgLSAxXSk7CisKKwkJa19tYXAubWVtX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpIHVfbWFwLT5tZW1fc3RhcnQ7CisJCWtfbWFwLm1lbV9lbmQgPSAodW5zaWduZWQgbG9uZykgdV9tYXAtPm1lbV9lbmQ7CisJCWtfbWFwLmJhc2VfYWRkciA9ICh1bnNpZ25lZCBzaG9ydCkgdV9tYXAtPmJhc2VfYWRkcjsKKwkJa19tYXAuaXJxID0gKHVuc2lnbmVkIGNoYXIpIHVfbWFwLT5pcnE7CisJCWtfbWFwLmRtYSA9ICh1bnNpZ25lZCBjaGFyKSB1X21hcC0+ZG1hOworCQlrX21hcC5wb3J0ID0gKHVuc2lnbmVkIGNoYXIpIHVfbWFwLT5wb3J0OworCisJCWVyciA9IGRldi0+c2V0X2NvbmZpZyhkZXYsICZrX21hcCk7CisKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKworCWlmIChpZGFbSUZMQV9BRERSRVNTIC0gMV0pIHsKKwkJaWYgKCFkZXYtPnNldF9tYWNfYWRkcmVzcykgeworCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpIHsKKwkJCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoaWRhW0lGTEFfQUREUkVTUyAtIDFdLT5ydGFfbGVuICE9IFJUQV9MRU5HVEgoZGV2LT5hZGRyX2xlbikpCisJCQlnb3RvIG91dDsKKworCQllcnIgPSBkZXYtPnNldF9tYWNfYWRkcmVzcyhkZXYsIFJUQV9EQVRBKGlkYVtJRkxBX0FERFJFU1MgLSAxXSkpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJCXNlbmRfYWRkcl9ub3RpZnkgPSAxOworCX0KKworCWlmIChpZGFbSUZMQV9CUk9BRENBU1QgLSAxXSkgeworCQlpZiAoaWRhW0lGTEFfQlJPQURDQVNUIC0gMV0tPnJ0YV9sZW4gIT0gUlRBX0xFTkdUSChkZXYtPmFkZHJfbGVuKSkKKwkJCWdvdG8gb3V0OworCQltZW1jcHkoZGV2LT5icm9hZGNhc3QsIFJUQV9EQVRBKGlkYVtJRkxBX0JST0FEQ0FTVCAtIDFdKSwKKwkJICAgICAgIGRldi0+YWRkcl9sZW4pOworCQlzZW5kX2FkZHJfbm90aWZ5ID0gMTsKKwl9CisKKwlpZiAoaWRhW0lGTEFfTVRVIC0gMV0pIHsKKwkJaWYgKGlkYVtJRkxBX01UVSAtIDFdLT5ydGFfbGVuICE9IFJUQV9MRU5HVEgoc2l6ZW9mKHUzMikpKQorCQkJZ290byBvdXQ7CisJCWVyciA9IGRldl9zZXRfbXR1KGRldiwgKigodTMyICopIFJUQV9EQVRBKGlkYVtJRkxBX01UVSAtIDFdKSkpOworCisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKworCX0KKworCWlmIChpZGFbSUZMQV9UWFFMRU4gLSAxXSkgeworCQlpZiAoaWRhW0lGTEFfVFhRTEVOIC0gMV0tPnJ0YV9sZW4gIT0gUlRBX0xFTkdUSChzaXplb2YodTMyKSkpCisJCQlnb3RvIG91dDsKKworCQlkZXYtPnR4X3F1ZXVlX2xlbiA9ICooKHUzMiAqKSBSVEFfREFUQShpZGFbSUZMQV9UWFFMRU4gLSAxXSkpOworCX0KKworCWlmIChpZGFbSUZMQV9XRUlHSFQgLSAxXSkgeworCQlpZiAoaWRhW0lGTEFfV0VJR0hUIC0gMV0tPnJ0YV9sZW4gIT0gUlRBX0xFTkdUSChzaXplb2YodTMyKSkpCisJCQlnb3RvIG91dDsKKworCQlkZXYtPndlaWdodCA9ICooKHUzMiAqKSBSVEFfREFUQShpZGFbSUZMQV9XRUlHSFQgLSAxXSkpOworCX0KKworCWlmIChpZm0tPmlmaV9pbmRleCA+PSAwICYmIGlkYVtJRkxBX0lGTkFNRSAtIDFdKSB7CisJCWNoYXIgaWZuYW1lW0lGTkFNU0laXTsKKworCQlpZiAocnRhdHRyX3N0cmxjcHkoaWZuYW1lLCBpZGFbSUZMQV9JRk5BTUUgLSAxXSwKKwkJICAgICAgICAgICAgICAgICAgIElGTkFNU0laKSA+PSBJRk5BTVNJWikKKwkJCWdvdG8gb3V0OworCQllcnIgPSBkZXZfY2hhbmdlX25hbWUoZGV2LCBpZm5hbWUpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJfQorCisJZXJyID0gMDsKKworb3V0OgorCWlmIChzZW5kX2FkZHJfbm90aWZ5KQorCQljYWxsX25ldGRldmljZV9ub3RpZmllcnMoTkVUREVWX0NIQU5HRUFERFIsIGRldik7CisKKwlkZXZfcHV0KGRldik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBydG5ldGxpbmtfZHVtcF9hbGwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCWludCBpZHg7CisJaW50IHNfaWR4ID0gY2ItPmZhbWlseTsKKworCWlmIChzX2lkeCA9PSAwKQorCQlzX2lkeCA9IDE7CisJZm9yIChpZHg9MTsgaWR4PE5QUk9UTzsgaWR4KyspIHsKKwkJaW50IHR5cGUgPSBjYi0+bmxoLT5ubG1zZ190eXBlLVJUTV9CQVNFOworCQlpZiAoaWR4IDwgc19pZHggfHwgaWR4ID09IFBGX1BBQ0tFVCkKKwkJCWNvbnRpbnVlOworCQlpZiAocnRuZXRsaW5rX2xpbmtzW2lkeF0gPT0gTlVMTCB8fAorCQkgICAgcnRuZXRsaW5rX2xpbmtzW2lkeF1bdHlwZV0uZHVtcGl0ID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJaWYgKGlkeCA+IHNfaWR4KQorCQkJbWVtc2V0KCZjYi0+YXJnc1swXSwgMCwgc2l6ZW9mKGNiLT5hcmdzKSk7CisJCWlmIChydG5ldGxpbmtfbGlua3NbaWR4XVt0eXBlXS5kdW1waXQoc2tiLCBjYikpCisJCQlicmVhazsKKwl9CisJY2ItPmZhbWlseSA9IGlkeDsKKworCXJldHVybiBza2ItPmxlbjsKK30KKwordm9pZCBydG1zZ19pZmluZm8oaW50IHR5cGUsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYW5nZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBzaXplID0gTkxNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpICsKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0bmxfbGlua19pZm1hcCkgKworCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRubF9saW5rX3N0YXRzKSArIDEyOCk7CisKKwlza2IgPSBhbGxvY19za2Ioc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFza2IpCisJCXJldHVybjsKKworCWlmIChydG5ldGxpbmtfZmlsbF9pZmluZm8oc2tiLCBkZXYsIHR5cGUsIDAsIDAsIGNoYW5nZSkgPCAwKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorCU5FVExJTktfQ0Ioc2tiKS5kc3RfZ3JvdXBzID0gUlRNR1JQX0xJTks7CisJbmV0bGlua19icm9hZGNhc3QocnRubCwgc2tiLCAwLCBSVE1HUlBfTElOSywgR0ZQX0tFUk5FTCk7Cit9CisKK3N0YXRpYyBpbnQgcnRuZXRsaW5rX2RvbmUoc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXJldHVybiAwOworfQorCisvKiBQcm90ZWN0ZWQgYnkgUlROTCBzZW1wYWhvcmUuICAqLworc3RhdGljIHN0cnVjdCBydGF0dHIgKipydGFfYnVmOworc3RhdGljIGludCBydGF0dHJfbWF4OworCisvKiBQcm9jZXNzIG9uZSBydG5ldGxpbmsgbWVzc2FnZS4gKi8KKworc3RhdGljIF9faW5saW5lX18gaW50CitydG5ldGxpbmtfcmN2X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgaW50ICplcnJwKQoreworCXN0cnVjdCBydG5ldGxpbmtfbGluayAqbGluazsKKwlzdHJ1Y3QgcnRuZXRsaW5rX2xpbmsgKmxpbmtfdGFiOworCWludCBzel9pZHgsIGtpbmQ7CisJaW50IG1pbl9sZW47CisJaW50IGZhbWlseTsKKwlpbnQgdHlwZTsKKwlpbnQgZXJyOworCisJLyogT25seSByZXF1ZXN0cyBhcmUgaGFuZGxlZCBieSBrZXJuZWwgbm93ICovCisJaWYgKCEobmxoLT5ubG1zZ19mbGFncyZOTE1fRl9SRVFVRVNUKSkKKwkJcmV0dXJuIDA7CisKKwl0eXBlID0gbmxoLT5ubG1zZ190eXBlOworCisJLyogQSBjb250cm9sIG1lc3NhZ2U6IGlnbm9yZSB0aGVtICovCisJaWYgKHR5cGUgPCBSVE1fQkFTRSkKKwkJcmV0dXJuIDA7CisKKwkvKiBVbmtub3duIG1lc3NhZ2U6IHJlcGx5IHdpdGggRUlOVkFMICovCisJaWYgKHR5cGUgPiBSVE1fTUFYKQorCQlnb3RvIGVycl9pbnZhbDsKKworCXR5cGUgLT0gUlRNX0JBU0U7CisKKwkvKiBBbGwgdGhlIG1lc3NhZ2VzIG11c3QgaGF2ZSBhdCBsZWFzdCAxIGJ5dGUgbGVuZ3RoICovCisJaWYgKG5saC0+bmxtc2dfbGVuIDwgTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgcnRnZW5tc2cpKSkKKwkJcmV0dXJuIDA7CisKKwlmYW1pbHkgPSAoKHN0cnVjdCBydGdlbm1zZyopTkxNU0dfREFUQShubGgpKS0+cnRnZW5fZmFtaWx5OworCWlmIChmYW1pbHkgPj0gTlBST1RPKSB7CisJCSplcnJwID0gLUVBRk5PU1VQUE9SVDsKKwkJcmV0dXJuIC0xOworCX0KKworCWxpbmtfdGFiID0gcnRuZXRsaW5rX2xpbmtzW2ZhbWlseV07CisJaWYgKGxpbmtfdGFiID09IE5VTEwpCisJCWxpbmtfdGFiID0gcnRuZXRsaW5rX2xpbmtzW1BGX1VOU1BFQ107CisJbGluayA9ICZsaW5rX3RhYlt0eXBlXTsKKworCXN6X2lkeCA9IHR5cGU+PjI7CisJa2luZCA9IHR5cGUmMzsKKworCWlmIChraW5kICE9IDIgJiYgc2VjdXJpdHlfbmV0bGlua19yZWN2KHNrYikpIHsKKwkJKmVycnAgPSAtRVBFUk07CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoa2luZCA9PSAyICYmIG5saC0+bmxtc2dfZmxhZ3MmTkxNX0ZfRFVNUCkgeworCQl1MzIgcmxlbjsKKworCQlpZiAobGluay0+ZHVtcGl0ID09IE5VTEwpCisJCQlsaW5rID0gJihydG5ldGxpbmtfbGlua3NbUEZfVU5TUEVDXVt0eXBlXSk7CisKKwkJaWYgKGxpbmstPmR1bXBpdCA9PSBOVUxMKQorCQkJZ290byBlcnJfaW52YWw7CisKKwkJaWYgKCgqZXJycCA9IG5ldGxpbmtfZHVtcF9zdGFydChydG5sLCBza2IsIG5saCwKKwkJCQkJCWxpbmstPmR1bXBpdCwKKwkJCQkJCXJ0bmV0bGlua19kb25lKSkgIT0gMCkgeworCQkJcmV0dXJuIC0xOworCQl9CisJCXJsZW4gPSBOTE1TR19BTElHTihubGgtPm5sbXNnX2xlbik7CisJCWlmIChybGVuID4gc2tiLT5sZW4pCisJCQlybGVuID0gc2tiLT5sZW47CisJCXNrYl9wdWxsKHNrYiwgcmxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1zZXQocnRhX2J1ZiwgMCwgKHJ0YXR0cl9tYXggKiBzaXplb2Yoc3RydWN0IHJ0YXR0ciAqKSkpOworCisJbWluX2xlbiA9IHJ0bV9taW5bc3pfaWR4XTsKKwlpZiAobmxoLT5ubG1zZ19sZW4gPCBtaW5fbGVuKQorCQlnb3RvIGVycl9pbnZhbDsKKworCWlmIChubGgtPm5sbXNnX2xlbiA+IG1pbl9sZW4pIHsKKwkJaW50IGF0dHJsZW4gPSBubGgtPm5sbXNnX2xlbiAtIE5MTVNHX0FMSUdOKG1pbl9sZW4pOworCQlzdHJ1Y3QgcnRhdHRyICphdHRyID0gKHZvaWQqKW5saCArIE5MTVNHX0FMSUdOKG1pbl9sZW4pOworCisJCXdoaWxlIChSVEFfT0soYXR0ciwgYXR0cmxlbikpIHsKKwkJCXVuc2lnbmVkIGZsYXZvciA9IGF0dHItPnJ0YV90eXBlOworCQkJaWYgKGZsYXZvcikgeworCQkJCWlmIChmbGF2b3IgPiBydGFfbWF4W3N6X2lkeF0pCisJCQkJCWdvdG8gZXJyX2ludmFsOworCQkJCXJ0YV9idWZbZmxhdm9yLTFdID0gYXR0cjsKKwkJCX0KKwkJCWF0dHIgPSBSVEFfTkVYVChhdHRyLCBhdHRybGVuKTsKKwkJfQorCX0KKworCWlmIChsaW5rLT5kb2l0ID09IE5VTEwpCisJCWxpbmsgPSAmKHJ0bmV0bGlua19saW5rc1tQRl9VTlNQRUNdW3R5cGVdKTsKKwlpZiAobGluay0+ZG9pdCA9PSBOVUxMKQorCQlnb3RvIGVycl9pbnZhbDsKKwllcnIgPSBsaW5rLT5kb2l0KHNrYiwgbmxoLCAodm9pZCAqKSZydGFfYnVmWzBdKTsKKworCSplcnJwID0gZXJyOworCXJldHVybiBlcnI7CisKK2Vycl9pbnZhbDoKKwkqZXJycCA9IC1FSU5WQUw7CisJcmV0dXJuIC0xOworfQorCisvKiAKKyAqIFByb2Nlc3Mgb25lIHBhY2tldCBvZiBtZXNzYWdlcy4KKyAqIE1hbGZvcm1lZCBza2JzIHdpdGggd3JvbmcgbGVuZ3RocyBvZiBtZXNzYWdlcyBhcmUgZGlzY2FyZGVkIHNpbGVudGx5LgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHJ0bmV0bGlua19yY3Zfc2tiKHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qgbmxtc2doZHIgKiBubGg7CisKKwl3aGlsZSAoc2tiLT5sZW4gPj0gTkxNU0dfU1BBQ0UoMCkpIHsKKwkJdTMyIHJsZW47CisKKwkJbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKXNrYi0+ZGF0YTsKKwkJaWYgKG5saC0+bmxtc2dfbGVuIDwgc2l6ZW9mKCpubGgpIHx8IHNrYi0+bGVuIDwgbmxoLT5ubG1zZ19sZW4pCisJCQlyZXR1cm4gMDsKKwkJcmxlbiA9IE5MTVNHX0FMSUdOKG5saC0+bmxtc2dfbGVuKTsKKwkJaWYgKHJsZW4gPiBza2ItPmxlbikKKwkJCXJsZW4gPSBza2ItPmxlbjsKKwkJaWYgKHJ0bmV0bGlua19yY3ZfbXNnKHNrYiwgbmxoLCAmZXJyKSkgeworCQkJLyogTm90IGVycm9yLCBidXQgd2UgbXVzdCBpbnRlcnJ1cHQgcHJvY2Vzc2luZyBoZXJlOgorCQkJICogICBOb3RlLCB0aGF0IGluIHRoaXMgY2FzZSB3ZSBkbyBub3QgcHVsbCBtZXNzYWdlCisJCQkgKiAgIGZyb20gc2tiLCBpdCB3aWxsIGJlIHByb2Nlc3NlZCBsYXRlci4KKwkJCSAqLworCQkJaWYgKGVyciA9PSAwKQorCQkJCXJldHVybiAtMTsKKwkJCW5ldGxpbmtfYWNrKHNrYiwgbmxoLCBlcnIpOworCQl9IGVsc2UgaWYgKG5saC0+bmxtc2dfZmxhZ3MmTkxNX0ZfQUNLKQorCQkJbmV0bGlua19hY2soc2tiLCBubGgsIDApOworCQlza2JfcHVsbChza2IsIHJsZW4pOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogIHJ0bmV0bGluayBpbnB1dCBxdWV1ZSBwcm9jZXNzaW5nIHJvdXRpbmU6CisgKgktIHRyeSB0byBhY3F1aXJlIHNoYXJlZCBsb2NrLiBJZiBpdCBpcyBmYWlsZWQsIGRlZmVyIHByb2Nlc3NpbmcuCisgKgktIGZlZWQgc2ticyB0byBydG5ldGxpbmtfcmN2X3NrYiwgdW50aWwgaXQgcmVmdXNlIGEgbWVzc2FnZSwKKyAqCSAgdGhhdCB3aWxsIG9jY3VyLCB3aGVuIGEgZHVtcCBzdGFydGVkIGFuZC9vciBhY3F1aXNpdGlvbiBvZgorICoJICBleGNsdXNpdmUgbG9jayBmYWlsZWQuCisgKi8KKworc3RhdGljIHZvaWQgcnRuZXRsaW5rX3JjdihzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4pCit7CisJZG8geworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCWlmIChydG5sX3NobG9ja19ub3dhaXQoKSkKKwkJCXJldHVybjsKKworCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpICE9IE5VTEwpIHsKKwkJCWlmIChydG5ldGxpbmtfcmN2X3NrYihza2IpKSB7CisJCQkJaWYgKHNrYi0+bGVuKQorCQkJCQlza2JfcXVldWVfaGVhZCgmc2stPnNrX3JlY2VpdmVfcXVldWUsCisJCQkJCQkgICAgICAgc2tiKTsKKwkJCQllbHNlCisJCQkJCWtmcmVlX3NrYihza2IpOworCQkJCWJyZWFrOworCQkJfQorCQkJa2ZyZWVfc2tiKHNrYik7CisJCX0KKworCQl1cCgmcnRubF9zZW0pOworCisJCW5ldGRldl9ydW5fdG9kbygpOworCX0gd2hpbGUgKHJ0bmwgJiYgcnRubC0+c2tfcmVjZWl2ZV9xdWV1ZS5xbGVuKTsKK30KKworc3RhdGljIHN0cnVjdCBydG5ldGxpbmtfbGluayBsaW5rX3J0bmV0bGlua190YWJsZVtSVE1fTUFYLVJUTV9CQVNFKzFdID0KK3sKKwlbUlRNX0dFVExJTksgIC0gUlRNX0JBU0VdID0geyAuZHVtcGl0ID0gcnRuZXRsaW5rX2R1bXBfaWZpbmZvIH0sCisJW1JUTV9TRVRMSU5LICAtIFJUTV9CQVNFXSA9IHsgLmRvaXQgICA9IGRvX3NldGxpbmsJICAgICAgfSwKKwlbUlRNX0dFVEFERFIgIC0gUlRNX0JBU0VdID0geyAuZHVtcGl0ID0gcnRuZXRsaW5rX2R1bXBfYWxsICAgIH0sCisJW1JUTV9HRVRST1VURSAtIFJUTV9CQVNFXSA9IHsgLmR1bXBpdCA9IHJ0bmV0bGlua19kdW1wX2FsbCAgICB9LAorCVtSVE1fTkVXTkVJR0ggLSBSVE1fQkFTRV0gPSB7IC5kb2l0ICAgPSBuZWlnaF9hZGQJICAgICAgfSwKKwlbUlRNX0RFTE5FSUdIIC0gUlRNX0JBU0VdID0geyAuZG9pdCAgID0gbmVpZ2hfZGVsZXRlCSAgICAgIH0sCisJW1JUTV9HRVRORUlHSCAtIFJUTV9CQVNFXSA9IHsgLmR1bXBpdCA9IG5laWdoX2R1bXBfaW5mbwkgICAgICB9Cit9OworCitzdGF0aWMgaW50IHJ0bmV0bGlua19ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHRyOworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgorCQlydG1zZ19pZmluZm8oUlRNX0RFTExJTkssIGRldiwgfjBVKTsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfUkVHSVNURVI6CisJCXJ0bXNnX2lmaW5mbyhSVE1fTkVXTElOSywgZGV2LCB+MFUpOworCQlicmVhazsKKwljYXNlIE5FVERFVl9VUDoKKwljYXNlIE5FVERFVl9ET1dOOgorCQlydG1zZ19pZmluZm8oUlRNX05FV0xJTkssIGRldiwgSUZGX1VQfElGRl9SVU5OSU5HKTsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfQ0hBTkdFOgorCWNhc2UgTkVUREVWX0dPSU5HX0RPV046CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJ0bXNnX2lmaW5mbyhSVE1fTkVXTElOSywgZGV2LCAwKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBydG5ldGxpbmtfZGV2X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsCT0gcnRuZXRsaW5rX2V2ZW50LAorfTsKKwordm9pZCBfX2luaXQgcnRuZXRsaW5rX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCXJ0YXR0cl9tYXggPSAwOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJ0YV9tYXgpOyBpKyspCisJCWlmIChydGFfbWF4W2ldID4gcnRhdHRyX21heCkKKwkJCXJ0YXR0cl9tYXggPSBydGFfbWF4W2ldOworCXJ0YV9idWYgPSBrbWFsbG9jKHJ0YXR0cl9tYXggKiBzaXplb2Yoc3RydWN0IHJ0YXR0ciAqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFydGFfYnVmKQorCQlwYW5pYygicnRuZXRsaW5rX2luaXQ6IGNhbm5vdCBhbGxvY2F0ZSBydGFfYnVmXG4iKTsKKworCXJ0bmwgPSBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoTkVUTElOS19ST1VURSwgcnRuZXRsaW5rX3Jjdik7CisJaWYgKHJ0bmwgPT0gTlVMTCkKKwkJcGFuaWMoInJ0bmV0bGlua19pbml0OiBjYW5ub3QgaW5pdGlhbGl6ZSBydG5ldGxpbmtcbiIpOworCW5ldGxpbmtfc2V0X25vbnJvb3QoTkVUTElOS19ST1VURSwgTkxfTk9OUk9PVF9SRUNWKTsKKwlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJnJ0bmV0bGlua19kZXZfbm90aWZpZXIpOworCXJ0bmV0bGlua19saW5rc1tQRl9VTlNQRUNdID0gbGlua19ydG5ldGxpbmtfdGFibGU7CisJcnRuZXRsaW5rX2xpbmtzW1BGX1BBQ0tFVF0gPSBsaW5rX3J0bmV0bGlua190YWJsZTsKK30KKworRVhQT1JUX1NZTUJPTChfX3J0YV9maWxsKTsKK0VYUE9SVF9TWU1CT0wocnRhdHRyX3N0cmxjcHkpOworRVhQT1JUX1NZTUJPTChydGF0dHJfcGFyc2UpOworRVhQT1JUX1NZTUJPTChydG5ldGxpbmtfbGlua3MpOworRVhQT1JUX1NZTUJPTChydG5ldGxpbmtfcHV0X21ldHJpY3MpOworRVhQT1JUX1NZTUJPTChydG5sKTsKK0VYUE9SVF9TWU1CT0wocnRubF9sb2NrKTsKK0VYUE9SVF9TWU1CT0wocnRubF9sb2NrX2ludGVycnVwdGlibGUpOworRVhQT1JUX1NZTUJPTChydG5sX3NlbSk7CitFWFBPUlRfU1lNQk9MKHJ0bmxfdW5sb2NrKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NjbS5jIGIvbmV0L2NvcmUvc2NtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJlYmYzMAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9jb3JlL3NjbS5jCkBAIC0wLDAgKzEsMjkxIEBACisvKiBzY20uYyAtIFNvY2tldCBsZXZlbCBjb250cm9sIG1lc3NhZ2VzIHByb2Nlc3NpbmcuCisgKgorICogQXV0aG9yOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKiAgICAgICAgICAgICAgQWxpZ25tZW50IGFuZCB2YWx1ZSBjaGVja2luZyBtb2RzIGJ5IENyYWlnIE1ldHoKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvY29tcGF0Lmg+CisjaW5jbHVkZSA8bmV0L3NjbS5oPgorCisKKy8qCisgKglPbmx5IGFsbG93IGEgdXNlciB0byBzZW5kIGNyZWRlbnRpYWxzLCB0aGF0IHRoZXkgY291bGQgc2V0IHdpdGggCisgKglzZXR1KGcpaWQuCisgKi8KKworc3RhdGljIF9faW5saW5lX18gaW50IHNjbV9jaGVja19jcmVkcyhzdHJ1Y3QgdWNyZWQgKmNyZWRzKQoreworCWlmICgoY3JlZHMtPnBpZCA9PSBjdXJyZW50LT50Z2lkIHx8IGNhcGFibGUoQ0FQX1NZU19BRE1JTikpICYmCisJICAgICgoY3JlZHMtPnVpZCA9PSBjdXJyZW50LT51aWQgfHwgY3JlZHMtPnVpZCA9PSBjdXJyZW50LT5ldWlkIHx8CisJICAgICAgY3JlZHMtPnVpZCA9PSBjdXJyZW50LT5zdWlkKSB8fCBjYXBhYmxlKENBUF9TRVRVSUQpKSAmJgorCSAgICAoKGNyZWRzLT5naWQgPT0gY3VycmVudC0+Z2lkIHx8IGNyZWRzLT5naWQgPT0gY3VycmVudC0+ZWdpZCB8fAorCSAgICAgIGNyZWRzLT5naWQgPT0gY3VycmVudC0+c2dpZCkgfHwgY2FwYWJsZShDQVBfU0VUR0lEKSkpIHsKKwkgICAgICAgcmV0dXJuIDA7CisJfQorCXJldHVybiAtRVBFUk07Cit9CisKK3N0YXRpYyBpbnQgc2NtX2ZwX2NvcHkoc3RydWN0IGNtc2doZHIgKmNtc2csIHN0cnVjdCBzY21fZnBfbGlzdCAqKmZwbHApCit7CisJaW50ICpmZHAgPSAoaW50KilDTVNHX0RBVEEoY21zZyk7CisJc3RydWN0IHNjbV9mcF9saXN0ICpmcGwgPSAqZnBscDsKKwlzdHJ1Y3QgZmlsZSAqKmZwcDsKKwlpbnQgaSwgbnVtOworCisJbnVtID0gKGNtc2ctPmNtc2dfbGVuIC0gQ01TR19BTElHTihzaXplb2Yoc3RydWN0IGNtc2doZHIpKSkvc2l6ZW9mKGludCk7CisKKwlpZiAobnVtIDw9IDApCisJCXJldHVybiAwOworCisJaWYgKG51bSA+IFNDTV9NQVhfRkQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFmcGwpCisJeworCQlmcGwgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NtX2ZwX2xpc3QpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFmcGwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJKmZwbHAgPSBmcGw7CisJCWZwbC0+Y291bnQgPSAwOworCX0KKwlmcHAgPSAmZnBsLT5mcFtmcGwtPmNvdW50XTsKKworCWlmIChmcGwtPmNvdW50ICsgbnVtID4gU0NNX01BWF9GRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJCisJLyoKKwkgKglWZXJpZnkgdGhlIGRlc2NyaXB0b3JzIGFuZCBpbmNyZW1lbnQgdGhlIHVzYWdlIGNvdW50LgorCSAqLworCSAKKwlmb3IgKGk9MDsgaTwgbnVtOyBpKyspCisJeworCQlpbnQgZmQgPSBmZHBbaV07CisJCXN0cnVjdCBmaWxlICpmaWxlOworCisJCWlmIChmZCA8IDAgfHwgIShmaWxlID0gZmdldChmZCkpKQorCQkJcmV0dXJuIC1FQkFERjsKKwkJKmZwcCsrID0gZmlsZTsKKwkJZnBsLT5jb3VudCsrOworCX0KKwlyZXR1cm4gbnVtOworfQorCit2b2lkIF9fc2NtX2Rlc3Ryb3koc3RydWN0IHNjbV9jb29raWUgKnNjbSkKK3sKKwlzdHJ1Y3Qgc2NtX2ZwX2xpc3QgKmZwbCA9IHNjbS0+ZnA7CisJaW50IGk7CisKKwlpZiAoZnBsKSB7CisJCXNjbS0+ZnAgPSBOVUxMOworCQlmb3IgKGk9ZnBsLT5jb3VudC0xOyBpPj0wOyBpLS0pCisJCQlmcHV0KGZwbC0+ZnBbaV0pOworCQlrZnJlZShmcGwpOworCX0KK30KKworaW50IF9fc2NtX3NlbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqcCkKK3sKKwlzdHJ1Y3QgY21zZ2hkciAqY21zZzsKKwlpbnQgZXJyOworCisJZm9yIChjbXNnID0gQ01TR19GSVJTVEhEUihtc2cpOyBjbXNnOyBjbXNnID0gQ01TR19OWFRIRFIobXNnLCBjbXNnKSkKKwl7CisJCWVyciA9IC1FSU5WQUw7CisKKwkJLyogVmVyaWZ5IHRoYXQgY21zZ19sZW4gaXMgYXQgbGVhc3Qgc2l6ZW9mKHN0cnVjdCBjbXNnaGRyKSAqLworCQkvKiBUaGUgZmlyc3QgY2hlY2sgd2FzIG9taXR0ZWQgaW4gPD0gMi4yLjUuIFRoZSByZWFzb25pbmcgd2FzCisJCSAgIHRoYXQgcGFyc2VyIGNoZWNrcyBjbXNnX2xlbiBpbiBhbnkgY2FzZSwgc28gdGhhdAorCQkgICBhZGRpdGlvbmFsIGNoZWNrIHdvdWxkIGJlIHdvcmsgZHVwbGljYXRpb24uCisJCSAgIEJ1dCBpZiBjbXNnX2xldmVsIGlzIG5vdCBTT0xfU09DS0VULCB3ZSBkbyBub3QgY2hlY2sgCisJCSAgIGZvciB0b28gc2hvcnQgYW5jaWxsYXJ5IGRhdGEgb2JqZWN0IGF0IGFsbCEgT29wcy4KKwkJICAgT0ssIGxldCdzIGFkZCBpdC4uLgorCQkgKi8KKwkJaWYgKCFDTVNHX09LKG1zZywgY21zZykpCisJCQlnb3RvIGVycm9yOworCisJCWlmIChjbXNnLT5jbXNnX2xldmVsICE9IFNPTF9TT0NLRVQpCisJCQljb250aW51ZTsKKworCQlzd2l0Y2ggKGNtc2ctPmNtc2dfdHlwZSkKKwkJeworCQljYXNlIFNDTV9SSUdIVFM6CisJCQllcnI9c2NtX2ZwX2NvcHkoY21zZywgJnAtPmZwKTsKKwkJCWlmIChlcnI8MCkKKwkJCQlnb3RvIGVycm9yOworCQkJYnJlYWs7CisJCWNhc2UgU0NNX0NSRURFTlRJQUxTOgorCQkJaWYgKGNtc2ctPmNtc2dfbGVuICE9IENNU0dfTEVOKHNpemVvZihzdHJ1Y3QgdWNyZWQpKSkKKwkJCQlnb3RvIGVycm9yOworCQkJbWVtY3B5KCZwLT5jcmVkcywgQ01TR19EQVRBKGNtc2cpLCBzaXplb2Yoc3RydWN0IHVjcmVkKSk7CisJCQllcnIgPSBzY21fY2hlY2tfY3JlZHMoJnAtPmNyZWRzKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBlcnJvcjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCWlmIChwLT5mcCAmJiAhcC0+ZnAtPmNvdW50KQorCXsKKwkJa2ZyZWUocC0+ZnApOworCQlwLT5mcCA9IE5VTEw7CisJfQorCXJldHVybiAwOworCQorZXJyb3I6CisJc2NtX2Rlc3Ryb3kocCk7CisJcmV0dXJuIGVycjsKK30KKworaW50IHB1dF9jbXNnKHN0cnVjdCBtc2doZHIgKiBtc2csIGludCBsZXZlbCwgaW50IHR5cGUsIGludCBsZW4sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNtc2doZHIgX191c2VyICpjbSA9IChzdHJ1Y3QgY21zZ2hkciBfX3VzZXIgKiltc2ctPm1zZ19jb250cm9sOworCXN0cnVjdCBjbXNnaGRyIGNtaGRyOworCWludCBjbWxlbiA9IENNU0dfTEVOKGxlbik7CisJaW50IGVycjsKKworCWlmIChNU0dfQ01TR19DT01QQVQgJiBtc2ctPm1zZ19mbGFncykKKwkJcmV0dXJuIHB1dF9jbXNnX2NvbXBhdChtc2csIGxldmVsLCB0eXBlLCBsZW4sIGRhdGEpOworCisJaWYgKGNtPT1OVUxMIHx8IG1zZy0+bXNnX2NvbnRyb2xsZW4gPCBzaXplb2YoKmNtKSkgeworCQltc2ctPm1zZ19mbGFncyB8PSBNU0dfQ1RSVU5DOworCQlyZXR1cm4gMDsgLyogWFhYOiByZXR1cm4gZXJyb3I/IGNoZWNrIHNwZWMuICovCisJfQorCWlmIChtc2ctPm1zZ19jb250cm9sbGVuIDwgY21sZW4pIHsKKwkJbXNnLT5tc2dfZmxhZ3MgfD0gTVNHX0NUUlVOQzsKKwkJY21sZW4gPSBtc2ctPm1zZ19jb250cm9sbGVuOworCX0KKwljbWhkci5jbXNnX2xldmVsID0gbGV2ZWw7CisJY21oZHIuY21zZ190eXBlID0gdHlwZTsKKwljbWhkci5jbXNnX2xlbiA9IGNtbGVuOworCisJZXJyID0gLUVGQVVMVDsKKwlpZiAoY29weV90b191c2VyKGNtLCAmY21oZHIsIHNpemVvZiBjbWhkcikpCisJCWdvdG8gb3V0OyAKKwlpZiAoY29weV90b191c2VyKENNU0dfREFUQShjbSksIGRhdGEsIGNtbGVuIC0gc2l6ZW9mKHN0cnVjdCBjbXNnaGRyKSkpCisJCWdvdG8gb3V0OworCWNtbGVuID0gQ01TR19TUEFDRShsZW4pOworCW1zZy0+bXNnX2NvbnRyb2wgKz0gY21sZW47CisJbXNnLT5tc2dfY29udHJvbGxlbiAtPSBjbWxlbjsKKwllcnIgPSAwOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgc2NtX2RldGFjaF9mZHMoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKQoreworCXN0cnVjdCBjbXNnaGRyIF9fdXNlciAqY20gPSAoc3RydWN0IGNtc2doZHIgX191c2VyKiltc2ctPm1zZ19jb250cm9sOworCisJaW50IGZkbWF4ID0gMDsKKwlpbnQgZmRudW0gPSBzY20tPmZwLT5jb3VudDsKKwlzdHJ1Y3QgZmlsZSAqKmZwID0gc2NtLT5mcC0+ZnA7CisJaW50IF9fdXNlciAqY21mcHRyOworCWludCBlcnIgPSAwLCBpOworCisJaWYgKE1TR19DTVNHX0NPTVBBVCAmIG1zZy0+bXNnX2ZsYWdzKSB7CisJCXNjbV9kZXRhY2hfZmRzX2NvbXBhdChtc2csIHNjbSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAobXNnLT5tc2dfY29udHJvbGxlbiA+IHNpemVvZihzdHJ1Y3QgY21zZ2hkcikpCisJCWZkbWF4ID0gKChtc2ctPm1zZ19jb250cm9sbGVuIC0gc2l6ZW9mKHN0cnVjdCBjbXNnaGRyKSkKKwkJCSAvIHNpemVvZihpbnQpKTsKKworCWlmIChmZG51bSA8IGZkbWF4KQorCQlmZG1heCA9IGZkbnVtOworCisJZm9yIChpPTAsIGNtZnB0cj0oaW50IF9fdXNlciAqKUNNU0dfREFUQShjbSk7IGk8ZmRtYXg7IGkrKywgY21mcHRyKyspCisJeworCQlpbnQgbmV3X2ZkOworCQllcnIgPSBzZWN1cml0eV9maWxlX3JlY2VpdmUoZnBbaV0pOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJCWVyciA9IGdldF91bnVzZWRfZmQoKTsKKwkJaWYgKGVyciA8IDApCisJCQlicmVhazsKKwkJbmV3X2ZkID0gZXJyOworCQllcnIgPSBwdXRfdXNlcihuZXdfZmQsIGNtZnB0cik7CisJCWlmIChlcnIpIHsKKwkJCXB1dF91bnVzZWRfZmQobmV3X2ZkKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIEJ1bXAgdGhlIHVzYWdlIGNvdW50IGFuZCBpbnN0YWxsIHRoZSBmaWxlLiAqLworCQlnZXRfZmlsZShmcFtpXSk7CisJCWZkX2luc3RhbGwobmV3X2ZkLCBmcFtpXSk7CisJfQorCisJaWYgKGkgPiAwKQorCXsKKwkJaW50IGNtbGVuID0gQ01TR19MRU4oaSpzaXplb2YoaW50KSk7CisJCWlmICghZXJyKQorCQkJZXJyID0gcHV0X3VzZXIoU09MX1NPQ0tFVCwgJmNtLT5jbXNnX2xldmVsKTsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSBwdXRfdXNlcihTQ01fUklHSFRTLCAmY20tPmNtc2dfdHlwZSk7CisJCWlmICghZXJyKQorCQkJZXJyID0gcHV0X3VzZXIoY21sZW4sICZjbS0+Y21zZ19sZW4pOworCQlpZiAoIWVycikgeworCQkJY21sZW4gPSBDTVNHX1NQQUNFKGkqc2l6ZW9mKGludCkpOworCQkJbXNnLT5tc2dfY29udHJvbCArPSBjbWxlbjsKKwkJCW1zZy0+bXNnX2NvbnRyb2xsZW4gLT0gY21sZW47CisJCX0KKwl9CisJaWYgKGkgPCBmZG51bSB8fCAoZmRudW0gJiYgZmRtYXggPD0gMCkpCisJCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19DVFJVTkM7CisKKwkvKgorCSAqIEFsbCBvZiB0aGUgZmlsZXMgdGhhdCBmaXQgaW4gdGhlIG1lc3NhZ2UgaGF2ZSBoYWQgdGhlaXIKKwkgKiB1c2FnZSBjb3VudHMgaW5jcmVtZW50ZWQsIHNvIHdlIGp1c3QgZnJlZSB0aGUgbGlzdC4KKwkgKi8KKwlfX3NjbV9kZXN0cm95KHNjbSk7Cit9CisKK3N0cnVjdCBzY21fZnBfbGlzdCAqc2NtX2ZwX2R1cChzdHJ1Y3Qgc2NtX2ZwX2xpc3QgKmZwbCkKK3sKKwlzdHJ1Y3Qgc2NtX2ZwX2xpc3QgKm5ld19mcGw7CisJaW50IGk7CisKKwlpZiAoIWZwbCkKKwkJcmV0dXJuIE5VTEw7CisKKwluZXdfZnBsID0ga21hbGxvYyhzaXplb2YoKmZwbCksIEdGUF9LRVJORUwpOworCWlmIChuZXdfZnBsKSB7CisJCWZvciAoaT1mcGwtPmNvdW50LTE7IGk+PTA7IGktLSkKKwkJCWdldF9maWxlKGZwbC0+ZnBbaV0pOworCQltZW1jcHkobmV3X2ZwbCwgZnBsLCBzaXplb2YoKmZwbCkpOworCX0KKwlyZXR1cm4gbmV3X2ZwbDsKK30KKworRVhQT1JUX1NZTUJPTChfX3NjbV9kZXN0cm95KTsKK0VYUE9SVF9TWU1CT0woX19zY21fc2VuZCk7CitFWFBPUlRfU1lNQk9MKHB1dF9jbXNnKTsKK0VYUE9SVF9TWU1CT0woc2NtX2RldGFjaF9mZHMpOworRVhQT1JUX1NZTUJPTChzY21fZnBfZHVwKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NrYnVmZi5jIGIvbmV0L2NvcmUvc2tidWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwMmNhOQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9jb3JlL3NrYnVmZi5jCkBAIC0wLDAgKzEsMTQ2MCBAQAorLyoKKyAqCVJvdXRpbmVzIGhhdmluZyB0byBkbyB3aXRoIHRoZSAnc3RydWN0IHNrX2J1ZmYnIG1lbW9yeSBoYW5kbGVycy4KKyAqCisgKglBdXRob3JzOglBbGFuIENveCA8aWlpdGFjQHB5ci5zd2FuLmFjLnVrPgorICoJCQlGbG9yaWFuIExhIFJvY2hlIDxyenNmbEByei51bmktc2IuZGU+CisgKgorICoJVmVyc2lvbjoJJElkOiBza2J1ZmYuYyx2IDEuOTAgMjAwMS8xMS8wNyAwNTo1NjoxOSBkYXZlbSBFeHAgJAorICoKKyAqCUZpeGVzOgorICoJCUFsYW4gQ294CToJRml4ZWQgdGhlIHdvcnN0IG9mIHRoZSBsb2FkCisgKgkJCQkJYmFsYW5jZXIgYnVncy4KKyAqCQlEYXZlIFBsYXR0CToJSW50ZXJydXB0IHN0YWNraW5nIGZpeC4KKyAqCVJpY2hhcmQgS29vaWptYW4JOglUaW1lc3RhbXAgZml4ZXMuCisgKgkJQWxhbiBDb3gJOglDaGFuZ2VkIGJ1ZmZlciBmb3JtYXQuCisgKgkJQWxhbiBDb3gJOglkZXN0cnVjdG9yIGhvb2sgZm9yIEFGX1VOSVggZXRjLgorICoJCUxpbnVzIFRvcnZhbGRzCToJQmV0dGVyIHNrYl9jbG9uZS4KKyAqCQlBbGFuIENveAk6CUFkZGVkIHNrYl9jb3B5LgorICoJCUFsYW4gQ294CToJQWRkZWQgYWxsIHRoZSBjaGFuZ2VkIHJvdXRpbmVzIExpbnVzCisgKgkJCQkJb25seSBwdXQgaW4gdGhlIGhlYWRlcnMKKyAqCQlSYXkgVmFuVGFzc2xlCToJRml4ZWQgLS1za2ItPmxvY2sgaW4gZnJlZQorICoJCUFsYW4gQ294CToJc2tiX2NvcHkgY29weSBhcnAgZmllbGQKKyAqCQlBbmRpIEtsZWVuCToJc2xhYmlmaWVkIGl0LgorICoJCVJvYmVydCBPbHNzb24JOglSZW1vdmVkIHNrYl9oZWFkX3Bvb2wKKyAqCisgKglOT1RFOgorICoJCVRoZSBfX3NrYl8gcm91dGluZXMgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMKKyAqCWRpc2FibGVkLCBvciB5b3UgYmV0dGVyIGJlICpyZWFsKiBzdXJlIHRoYXQgdGhlIG9wZXJhdGlvbiBpcyBhdG9taWMKKyAqCXdpdGggcmVzcGVjdCB0byB3aGF0ZXZlciBsaXN0IGlzIGJlaW5nIGZyb2JiZWQgKGUuZy4gdmlhIGxvY2tfc29jaygpCisgKglvciB2aWEgZGlzYWJsaW5nIGJvdHRvbSBoYWxmIGhhbmRsZXJzLCBldGMpLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworLyoKKyAqCVRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIHdpbGwgbm90IGNvbXBpbGUgY29ycmVjdGx5IHdpdGggZ2NjIDIuNC54CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKKyNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisKKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvZHN0Lmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxuZXQveGZybS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKnNrYnVmZl9oZWFkX2NhY2hlOworCisvKgorICoJS2VlcCBvdXQtb2YtbGluZSB0byBwcmV2ZW50IGtlcm5lbCBibG9hdC4KKyAqCV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcyBpcyBub3QgdXNlZCBiZWNhdXNlIGl0IGlzIG5vdCBhbHdheXMKKyAqCXJlbGlhYmxlLgorICovCisKKy8qKgorICoJc2tiX292ZXJfcGFuaWMJLSAJcHJpdmF0ZSBmdW5jdGlvbgorICoJQHNrYjogYnVmZmVyCisgKglAc3o6IHNpemUKKyAqCUBoZXJlOiBhZGRyZXNzCisgKgorICoJT3V0IG9mIGxpbmUgc3VwcG9ydCBjb2RlIGZvciBza2JfcHV0KCkuIE5vdCB1c2VyIGNhbGxhYmxlLgorICovCit2b2lkIHNrYl9vdmVyX3BhbmljKHN0cnVjdCBza19idWZmICpza2IsIGludCBzeiwgdm9pZCAqaGVyZSkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJza3B1dDpvdmVyOiAlcDolZCBwdXQ6JWQgZGV2OiVzIiwKKwkJaGVyZSwgc2tiLT5sZW4sIHN6LCBza2ItPmRldiA/IHNrYi0+ZGV2LT5uYW1lIDogIjxOVUxMPiIpOworCUJVRygpOworfQorCisvKioKKyAqCXNrYl91bmRlcl9wYW5pYwktIAlwcml2YXRlIGZ1bmN0aW9uCisgKglAc2tiOiBidWZmZXIKKyAqCUBzejogc2l6ZQorICoJQGhlcmU6IGFkZHJlc3MKKyAqCisgKglPdXQgb2YgbGluZSBzdXBwb3J0IGNvZGUgZm9yIHNrYl9wdXNoKCkuIE5vdCB1c2VyIGNhbGxhYmxlLgorICovCisKK3ZvaWQgc2tiX3VuZGVyX3BhbmljKHN0cnVjdCBza19idWZmICpza2IsIGludCBzeiwgdm9pZCAqaGVyZSkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJza3B1dDp1bmRlcjogJXA6JWQgcHV0OiVkIGRldjolcyIsCisgICAgICAgICAgICAgICBoZXJlLCBza2ItPmxlbiwgc3osIHNrYi0+ZGV2ID8gc2tiLT5kZXYtPm5hbWUgOiAiPE5VTEw+Iik7CisJQlVHKCk7Cit9CisKKy8qIAlBbGxvY2F0ZSBhIG5ldyBza2J1ZmYuIFdlIGRvIHRoaXMgb3Vyc2VsdmVzIHNvIHdlIGNhbiBmaWxsIGluIGEgZmV3CisgKgkncHJpdmF0ZScgZmllbGRzIGFuZCBhbHNvIGRvIG1lbW9yeSBzdGF0aXN0aWNzIHRvIGZpbmQgYWxsIHRoZQorICoJW0JFRVBdIGxlYWtzLgorICoKKyAqLworCisvKioKKyAqCWFsbG9jX3NrYgktCWFsbG9jYXRlIGEgbmV0d29yayBidWZmZXIKKyAqCUBzaXplOiBzaXplIHRvIGFsbG9jYXRlCisgKglAZ2ZwX21hc2s6IGFsbG9jYXRpb24gbWFzaworICoKKyAqCUFsbG9jYXRlIGEgbmV3ICZza19idWZmLiBUaGUgcmV0dXJuZWQgYnVmZmVyIGhhcyBubyBoZWFkcm9vbSBhbmQgYQorICoJdGFpbCByb29tIG9mIHNpemUgYnl0ZXMuIFRoZSBvYmplY3QgaGFzIGEgcmVmZXJlbmNlIGNvdW50IG9mIG9uZS4KKyAqCVRoZSByZXR1cm4gaXMgdGhlIGJ1ZmZlci4gT24gYSBmYWlsdXJlIHRoZSByZXR1cm4gaXMgJU5VTEwuCisgKgorICoJQnVmZmVycyBtYXkgb25seSBiZSBhbGxvY2F0ZWQgZnJvbSBpbnRlcnJ1cHRzIHVzaW5nIGEgQGdmcF9tYXNrIG9mCisgKgklR0ZQX0FUT01JQy4KKyAqLworc3RydWN0IHNrX2J1ZmYgKmFsbG9jX3NrYih1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IGdmcF9tYXNrKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdTggKmRhdGE7CisKKwkvKiBHZXQgdGhlIEhFQUQgKi8KKwlza2IgPSBrbWVtX2NhY2hlX2FsbG9jKHNrYnVmZl9oZWFkX2NhY2hlLAorCQkJICAgICAgIGdmcF9tYXNrICYgfl9fR0ZQX0RNQSk7CisJaWYgKCFza2IpCisJCWdvdG8gb3V0OworCisJLyogR2V0IHRoZSBEQVRBLiBTaXplIG11c3QgbWF0Y2ggc2tiX2FkZF9tdHUoKS4gKi8KKwlzaXplID0gU0tCX0RBVEFfQUxJR04oc2l6ZSk7CisJZGF0YSA9IGttYWxsb2Moc2l6ZSArIHNpemVvZihzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvKSwgZ2ZwX21hc2spOworCWlmICghZGF0YSkKKwkJZ290byBub2RhdGE7CisKKwltZW1zZXQoc2tiLCAwLCBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgdHJ1ZXNpemUpKTsKKwlza2ItPnRydWVzaXplID0gc2l6ZSArIHNpemVvZihzdHJ1Y3Qgc2tfYnVmZik7CisJYXRvbWljX3NldCgmc2tiLT51c2VycywgMSk7CisJc2tiLT5oZWFkID0gZGF0YTsKKwlza2ItPmRhdGEgPSBkYXRhOworCXNrYi0+dGFpbCA9IGRhdGE7CisJc2tiLT5lbmQgID0gZGF0YSArIHNpemU7CisKKwlhdG9taWNfc2V0KCYoc2tiX3NoaW5mbyhza2IpLT5kYXRhcmVmKSwgMSk7CisJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyAgPSAwOworCXNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemUgPSAwOworCXNrYl9zaGluZm8oc2tiKS0+dHNvX3NlZ3MgPSAwOworCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0ID0gTlVMTDsKK291dDoKKwlyZXR1cm4gc2tiOworbm9kYXRhOgorCWttZW1fY2FjaGVfZnJlZShza2J1ZmZfaGVhZF9jYWNoZSwgc2tiKTsKKwlza2IgPSBOVUxMOworCWdvdG8gb3V0OworfQorCisvKioKKyAqCWFsbG9jX3NrYl9mcm9tX2NhY2hlCS0JYWxsb2NhdGUgYSBuZXR3b3JrIGJ1ZmZlcgorICoJQGNwOiBrbWVtX2NhY2hlIGZyb20gd2hpY2ggdG8gYWxsb2NhdGUgdGhlIGRhdGEgYXJlYQorICogICAgICAgICAgIChvYmplY3Qgc2l6ZSBtdXN0IGJlIGJpZyBlbm91Z2ggZm9yIEBzaXplIGJ5dGVzICsgc2tiIG92ZXJoZWFkcykKKyAqCUBzaXplOiBzaXplIHRvIGFsbG9jYXRlCisgKglAZ2ZwX21hc2s6IGFsbG9jYXRpb24gbWFzaworICoKKyAqCUFsbG9jYXRlIGEgbmV3ICZza19idWZmLiBUaGUgcmV0dXJuZWQgYnVmZmVyIGhhcyBubyBoZWFkcm9vbSBhbmQKKyAqCXRhaWwgcm9vbSBvZiBzaXplIGJ5dGVzLiBUaGUgb2JqZWN0IGhhcyBhIHJlZmVyZW5jZSBjb3VudCBvZiBvbmUuCisgKglUaGUgcmV0dXJuIGlzIHRoZSBidWZmZXIuIE9uIGEgZmFpbHVyZSB0aGUgcmV0dXJuIGlzICVOVUxMLgorICoKKyAqCUJ1ZmZlcnMgbWF5IG9ubHkgYmUgYWxsb2NhdGVkIGZyb20gaW50ZXJydXB0cyB1c2luZyBhIEBnZnBfbWFzayBvZgorICoJJUdGUF9BVE9NSUMuCisgKi8KK3N0cnVjdCBza19idWZmICphbGxvY19za2JfZnJvbV9jYWNoZShrbWVtX2NhY2hlX3QgKmNwLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHNpemUsIGludCBnZnBfbWFzaykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXU4ICpkYXRhOworCisJLyogR2V0IHRoZSBIRUFEICovCisJc2tiID0ga21lbV9jYWNoZV9hbGxvYyhza2J1ZmZfaGVhZF9jYWNoZSwKKwkJCSAgICAgICBnZnBfbWFzayAmIH5fX0dGUF9ETUEpOworCWlmICghc2tiKQorCQlnb3RvIG91dDsKKworCS8qIEdldCB0aGUgREFUQS4gKi8KKwlzaXplID0gU0tCX0RBVEFfQUxJR04oc2l6ZSk7CisJZGF0YSA9IGttZW1fY2FjaGVfYWxsb2MoY3AsIGdmcF9tYXNrKTsKKwlpZiAoIWRhdGEpCisJCWdvdG8gbm9kYXRhOworCisJbWVtc2V0KHNrYiwgMCwgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIHRydWVzaXplKSk7CisJc2tiLT50cnVlc2l6ZSA9IHNpemUgKyBzaXplb2Yoc3RydWN0IHNrX2J1ZmYpOworCWF0b21pY19zZXQoJnNrYi0+dXNlcnMsIDEpOworCXNrYi0+aGVhZCA9IGRhdGE7CisJc2tiLT5kYXRhID0gZGF0YTsKKwlza2ItPnRhaWwgPSBkYXRhOworCXNrYi0+ZW5kICA9IGRhdGEgKyBzaXplOworCisJYXRvbWljX3NldCgmKHNrYl9zaGluZm8oc2tiKS0+ZGF0YXJlZiksIDEpOworCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgID0gMDsKKwlza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplID0gMDsKKwlza2Jfc2hpbmZvKHNrYiktPnRzb19zZWdzID0gMDsKKwlza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCA9IE5VTEw7CitvdXQ6CisJcmV0dXJuIHNrYjsKK25vZGF0YToKKwlrbWVtX2NhY2hlX2ZyZWUoc2tidWZmX2hlYWRfY2FjaGUsIHNrYik7CisJc2tiID0gTlVMTDsKKwlnb3RvIG91dDsKK30KKworCitzdGF0aWMgdm9pZCBza2JfZHJvcF9mcmFnbGlzdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmICpsaXN0ID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3Q7CisKKwlza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCA9IE5VTEw7CisKKwlkbyB7CisJCXN0cnVjdCBza19idWZmICp0aGlzID0gbGlzdDsKKwkJbGlzdCA9IGxpc3QtPm5leHQ7CisJCWtmcmVlX3NrYih0aGlzKTsKKwl9IHdoaWxlIChsaXN0KTsKK30KKworc3RhdGljIHZvaWQgc2tiX2Nsb25lX2ZyYWdsaXN0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKmxpc3Q7CisKKwlmb3IgKGxpc3QgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsgbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQpCisJCXNrYl9nZXQobGlzdCk7Cit9CisKK3ZvaWQgc2tiX3JlbGVhc2VfZGF0YShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmICghc2tiLT5jbG9uZWQgfHwKKwkgICAgIWF0b21pY19zdWJfcmV0dXJuKHNrYi0+bm9oZHIgPyAoMSA8PCBTS0JfREFUQVJFRl9TSElGVCkgKyAxIDogMSwKKwkJCSAgICAgICAmc2tiX3NoaW5mbyhza2IpLT5kYXRhcmVmKSkgeworCQlpZiAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncykgeworCQkJaW50IGk7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKQorCQkJCXB1dF9wYWdlKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZSk7CisJCX0KKworCQlpZiAoc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QpCisJCQlza2JfZHJvcF9mcmFnbGlzdChza2IpOworCisJCWtmcmVlKHNrYi0+aGVhZCk7CisJfQorfQorCisvKgorICoJRnJlZSBhbiBza2J1ZmYgYnkgbWVtb3J5IHdpdGhvdXQgY2xlYW5pbmcgdGhlIHN0YXRlLgorICovCit2b2lkIGtmcmVlX3NrYm1lbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNrYl9yZWxlYXNlX2RhdGEoc2tiKTsKKwlrbWVtX2NhY2hlX2ZyZWUoc2tidWZmX2hlYWRfY2FjaGUsIHNrYik7Cit9CisKKy8qKgorICoJX19rZnJlZV9za2IgLSBwcml2YXRlIGZ1bmN0aW9uCisgKglAc2tiOiBidWZmZXIKKyAqCisgKglGcmVlIGFuIHNrX2J1ZmYuIFJlbGVhc2UgYW55dGhpbmcgYXR0YWNoZWQgdG8gdGhlIGJ1ZmZlci4KKyAqCUNsZWFuIHRoZSBzdGF0ZS4gVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb24uIFVzZXJzIHNob3VsZAorICoJYWx3YXlzIGNhbGwga2ZyZWVfc2tiCisgKi8KKwordm9pZCBfX2tmcmVlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmIChza2ItPmxpc3QpIHsKKwkgCXByaW50ayhLRVJOX1dBUk5JTkcgIldhcm5pbmc6IGtmcmVlX3NrYiBwYXNzZWQgYW4gc2tiIHN0aWxsICIKKwkJICAgICAgICJvbiBhIGxpc3QgKGZyb20gJXApLlxuIiwgTkVUX0NBTExFUihza2IpKTsKKwkJQlVHKCk7CisJfQorCisJZHN0X3JlbGVhc2Uoc2tiLT5kc3QpOworI2lmZGVmIENPTkZJR19YRlJNCisJc2VjcGF0aF9wdXQoc2tiLT5zcCk7CisjZW5kaWYKKwlpZihza2ItPmRlc3RydWN0b3IpIHsKKwkJaWYgKGluX2lycSgpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2FybmluZzoga2ZyZWVfc2tiIG9uICIKKwkJCQkJICAgICJoYXJkIElSUSAlcFxuIiwgTkVUX0NBTExFUihza2IpKTsKKwkJc2tiLT5kZXN0cnVjdG9yKHNrYik7CisJfQorI2lmZGVmIENPTkZJR19ORVRGSUxURVIKKwluZl9jb25udHJhY2tfcHV0KHNrYi0+bmZjdCk7CisjaWZkZWYgQ09ORklHX0JSSURHRV9ORVRGSUxURVIKKwluZl9icmlkZ2VfcHV0KHNrYi0+bmZfYnJpZGdlKTsKKyNlbmRpZgorI2VuZGlmCisvKiBYWFg6IElTIHRoaXMgc3RpbGwgbmVjZXNzYXJ5PyAtIEpIUyAqLworI2lmZGVmIENPTkZJR19ORVRfU0NIRUQKKwlza2ItPnRjX2luZGV4ID0gMDsKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKKwlza2ItPnRjX3ZlcmQgPSAwOworCXNrYi0+dGNfY2xhc3NpZCA9IDA7CisjZW5kaWYKKyNlbmRpZgorCisJa2ZyZWVfc2tibWVtKHNrYik7Cit9CisKKy8qKgorICoJc2tiX2Nsb25lCS0JZHVwbGljYXRlIGFuIHNrX2J1ZmYKKyAqCUBza2I6IGJ1ZmZlciB0byBjbG9uZQorICoJQGdmcF9tYXNrOiBhbGxvY2F0aW9uIHByaW9yaXR5CisgKgorICoJRHVwbGljYXRlIGFuICZza19idWZmLiBUaGUgbmV3IG9uZSBpcyBub3Qgb3duZWQgYnkgYSBzb2NrZXQuIEJvdGgKKyAqCWNvcGllcyBzaGFyZSB0aGUgc2FtZSBwYWNrZXQgZGF0YSBidXQgbm90IHN0cnVjdHVyZS4gVGhlIG5ldworICoJYnVmZmVyIGhhcyBhIHJlZmVyZW5jZSBjb3VudCBvZiAxLiBJZiB0aGUgYWxsb2NhdGlvbiBmYWlscyB0aGUKKyAqCWZ1bmN0aW9uIHJldHVybnMgJU5VTEwgb3RoZXJ3aXNlIHRoZSBuZXcgYnVmZmVyIGlzIHJldHVybmVkLgorICoKKyAqCUlmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0IGdmcF9tYXNrKCkgbXVzdCBiZQorICoJJUdGUF9BVE9NSUMuCisgKi8KKworc3RydWN0IHNrX2J1ZmYgKnNrYl9jbG9uZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZ2ZwX21hc2spCit7CisJc3RydWN0IHNrX2J1ZmYgKm4gPSBrbWVtX2NhY2hlX2FsbG9jKHNrYnVmZl9oZWFkX2NhY2hlLCBnZnBfbWFzayk7CisKKwlpZiAoIW4pIAorCQlyZXR1cm4gTlVMTDsKKworI2RlZmluZSBDKHgpIG4tPnggPSBza2ItPngKKworCW4tPm5leHQgPSBuLT5wcmV2ID0gTlVMTDsKKwluLT5saXN0ID0gTlVMTDsKKwluLT5zayA9IE5VTEw7CisJQyhzdGFtcCk7CisJQyhkZXYpOworCUMocmVhbF9kZXYpOworCUMoaCk7CisJQyhuaCk7CisJQyhtYWMpOworCUMoZHN0KTsKKwlkc3RfY2xvbmUoc2tiLT5kc3QpOworCUMoc3ApOworI2lmZGVmIENPTkZJR19JTkVUCisJc2VjcGF0aF9nZXQoc2tiLT5zcCk7CisjZW5kaWYKKwltZW1jcHkobi0+Y2IsIHNrYi0+Y2IsIHNpemVvZihza2ItPmNiKSk7CisJQyhsZW4pOworCUMoZGF0YV9sZW4pOworCUMoY3N1bSk7CisJQyhsb2NhbF9kZik7CisJbi0+Y2xvbmVkID0gMTsKKwluLT5ub2hkciA9IDA7CisJQyhwa3RfdHlwZSk7CisJQyhpcF9zdW1tZWQpOworCUMocHJpb3JpdHkpOworCUMocHJvdG9jb2wpOworCUMoc2VjdXJpdHkpOworCW4tPmRlc3RydWN0b3IgPSBOVUxMOworI2lmZGVmIENPTkZJR19ORVRGSUxURVIKKwlDKG5mbWFyayk7CisJQyhuZmNhY2hlKTsKKwlDKG5mY3QpOworCW5mX2Nvbm50cmFja19nZXQoc2tiLT5uZmN0KTsKKwlDKG5mY3RpbmZvKTsKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCisJQyhuZl9kZWJ1Zyk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQlJJREdFX05FVEZJTFRFUgorCUMobmZfYnJpZGdlKTsKKwluZl9icmlkZ2VfZ2V0KHNrYi0+bmZfYnJpZGdlKTsKKyNlbmRpZgorI2VuZGlmIC8qQ09ORklHX05FVEZJTFRFUiovCisjaWYgZGVmaW5lZChDT05GSUdfSElQUEkpCisJQyhwcml2YXRlKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ORVRfU0NIRUQKKwlDKHRjX2luZGV4KTsKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKKwluLT50Y192ZXJkID0gU0VUX1RDX1ZFUkQoc2tiLT50Y192ZXJkLDApOworCW4tPnRjX3ZlcmQgPSBDTFJfVENfT0syTVVOR0Uoc2tiLT50Y192ZXJkKTsKKwluLT50Y192ZXJkID0gQ0xSX1RDX01VTkdFRChza2ItPnRjX3ZlcmQpOworCUMoaW5wdXRfZGV2KTsKKwlDKHRjX2NsYXNzaWQpOworI2VuZGlmCisKKyNlbmRpZgorCUModHJ1ZXNpemUpOworCWF0b21pY19zZXQoJm4tPnVzZXJzLCAxKTsKKwlDKGhlYWQpOworCUMoZGF0YSk7CisJQyh0YWlsKTsKKwlDKGVuZCk7CisKKwlhdG9taWNfaW5jKCYoc2tiX3NoaW5mbyhza2IpLT5kYXRhcmVmKSk7CisJc2tiLT5jbG9uZWQgPSAxOworCisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlfc2tiX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqbmV3LCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqb2xkKQoreworCS8qCisJICoJU2hpZnQgYmV0d2VlbiB0aGUgdHdvIGRhdGEgYXJlYXMgaW4gYnl0ZXMKKwkgKi8KKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IG5ldy0+ZGF0YSAtIG9sZC0+ZGF0YTsKKworCW5ldy0+bGlzdAk9IE5VTEw7CisJbmV3LT5zawkJPSBOVUxMOworCW5ldy0+ZGV2CT0gb2xkLT5kZXY7CisJbmV3LT5yZWFsX2Rldgk9IG9sZC0+cmVhbF9kZXY7CisJbmV3LT5wcmlvcml0eQk9IG9sZC0+cHJpb3JpdHk7CisJbmV3LT5wcm90b2NvbAk9IG9sZC0+cHJvdG9jb2w7CisJbmV3LT5kc3QJPSBkc3RfY2xvbmUob2xkLT5kc3QpOworI2lmZGVmIENPTkZJR19JTkVUCisJbmV3LT5zcAkJPSBzZWNwYXRoX2dldChvbGQtPnNwKTsKKyNlbmRpZgorCW5ldy0+aC5yYXcJPSBvbGQtPmgucmF3ICsgb2Zmc2V0OworCW5ldy0+bmgucmF3CT0gb2xkLT5uaC5yYXcgKyBvZmZzZXQ7CisJbmV3LT5tYWMucmF3CT0gb2xkLT5tYWMucmF3ICsgb2Zmc2V0OworCW1lbWNweShuZXctPmNiLCBvbGQtPmNiLCBzaXplb2Yob2xkLT5jYikpOworCW5ldy0+bG9jYWxfZGYJPSBvbGQtPmxvY2FsX2RmOworCW5ldy0+cGt0X3R5cGUJPSBvbGQtPnBrdF90eXBlOworCW5ldy0+c3RhbXAJPSBvbGQtPnN0YW1wOworCW5ldy0+ZGVzdHJ1Y3RvciA9IE5VTEw7CisJbmV3LT5zZWN1cml0eQk9IG9sZC0+c2VjdXJpdHk7CisjaWZkZWYgQ09ORklHX05FVEZJTFRFUgorCW5ldy0+bmZtYXJrCT0gb2xkLT5uZm1hcms7CisJbmV3LT5uZmNhY2hlCT0gb2xkLT5uZmNhY2hlOworCW5ldy0+bmZjdAk9IG9sZC0+bmZjdDsKKwluZl9jb25udHJhY2tfZ2V0KG9sZC0+bmZjdCk7CisJbmV3LT5uZmN0aW5mbwk9IG9sZC0+bmZjdGluZm87CisjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRworCW5ldy0+bmZfZGVidWcJPSBvbGQtPm5mX2RlYnVnOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0JSSURHRV9ORVRGSUxURVIKKwluZXctPm5mX2JyaWRnZQk9IG9sZC0+bmZfYnJpZGdlOworCW5mX2JyaWRnZV9nZXQob2xkLT5uZl9icmlkZ2UpOworI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTkVUX1NDSEVECisjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCisJbmV3LT50Y192ZXJkID0gb2xkLT50Y192ZXJkOworI2VuZGlmCisJbmV3LT50Y19pbmRleAk9IG9sZC0+dGNfaW5kZXg7CisjZW5kaWYKKwlhdG9taWNfc2V0KCZuZXctPnVzZXJzLCAxKTsKKwlza2Jfc2hpbmZvKG5ldyktPnRzb19zaXplID0gc2tiX3NoaW5mbyhvbGQpLT50c29fc2l6ZTsKKwlza2Jfc2hpbmZvKG5ldyktPnRzb19zZWdzID0gc2tiX3NoaW5mbyhvbGQpLT50c29fc2VnczsKK30KKworLyoqCisgKglza2JfY29weQktCWNyZWF0ZSBwcml2YXRlIGNvcHkgb2YgYW4gc2tfYnVmZgorICoJQHNrYjogYnVmZmVyIHRvIGNvcHkKKyAqCUBnZnBfbWFzazogYWxsb2NhdGlvbiBwcmlvcml0eQorICoKKyAqCU1ha2UgYSBjb3B5IG9mIGJvdGggYW4gJnNrX2J1ZmYgYW5kIGl0cyBkYXRhLiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUKKyAqCWNhbGxlciB3aXNoZXMgdG8gbW9kaWZ5IHRoZSBkYXRhIGFuZCBuZWVkcyBhIHByaXZhdGUgY29weSBvZiB0aGUKKyAqCWRhdGEgdG8gYWx0ZXIuIFJldHVybnMgJU5VTEwgb24gZmFpbHVyZSBvciB0aGUgcG9pbnRlciB0byB0aGUgYnVmZmVyCisgKglvbiBzdWNjZXNzLiBUaGUgcmV0dXJuZWQgYnVmZmVyIGhhcyBhIHJlZmVyZW5jZSBjb3VudCBvZiAxLgorICoKKyAqCUFzIGJ5LXByb2R1Y3QgdGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBub24tbGluZWFyICZza19idWZmIHRvIGxpbmVhcgorICoJb25lLCBzbyB0aGF0ICZza19idWZmIGJlY29tZXMgY29tcGxldGVseSBwcml2YXRlIGFuZCBjYWxsZXIgaXMgYWxsb3dlZAorICoJdG8gbW9kaWZ5IGFsbCB0aGUgZGF0YSBvZiByZXR1cm5lZCBidWZmZXIuIFRoaXMgbWVhbnMgdGhhdCB0aGlzCisgKglmdW5jdGlvbiBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZSBpbiBjaXJjdW1zdGFuY2VzIHdoZW4gb25seQorICoJaGVhZGVyIGlzIGdvaW5nIHRvIGJlIG1vZGlmaWVkLiBVc2UgcHNrYl9jb3B5KCkgaW5zdGVhZC4KKyAqLworCitzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2NvcHkoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGdmcF9tYXNrKQoreworCWludCBoZWFkZXJsZW4gPSBza2ItPmRhdGEgLSBza2ItPmhlYWQ7CisJLyoKKwkgKglBbGxvY2F0ZSB0aGUgY29weSBidWZmZXIKKwkgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqbiA9IGFsbG9jX3NrYihza2ItPmVuZCAtIHNrYi0+aGVhZCArIHNrYi0+ZGF0YV9sZW4sCisJCQkJICAgICAgZ2ZwX21hc2spOworCWlmICghbikKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBTZXQgdGhlIGRhdGEgcG9pbnRlciAqLworCXNrYl9yZXNlcnZlKG4sIGhlYWRlcmxlbik7CisJLyogU2V0IHRoZSB0YWlsIHBvaW50ZXIgYW5kIGxlbmd0aCAqLworCXNrYl9wdXQobiwgc2tiLT5sZW4pOworCW4tPmNzdW0JICAgICA9IHNrYi0+Y3N1bTsKKwluLT5pcF9zdW1tZWQgPSBza2ItPmlwX3N1bW1lZDsKKworCWlmIChza2JfY29weV9iaXRzKHNrYiwgLWhlYWRlcmxlbiwgbi0+aGVhZCwgaGVhZGVybGVuICsgc2tiLT5sZW4pKQorCQlCVUcoKTsKKworCWNvcHlfc2tiX2hlYWRlcihuLCBza2IpOworCXJldHVybiBuOworfQorCisKKy8qKgorICoJcHNrYl9jb3B5CS0JY3JlYXRlIGNvcHkgb2YgYW4gc2tfYnVmZiB3aXRoIHByaXZhdGUgaGVhZC4KKyAqCUBza2I6IGJ1ZmZlciB0byBjb3B5CisgKglAZ2ZwX21hc2s6IGFsbG9jYXRpb24gcHJpb3JpdHkKKyAqCisgKglNYWtlIGEgY29weSBvZiBib3RoIGFuICZza19idWZmIGFuZCBwYXJ0IG9mIGl0cyBkYXRhLCBsb2NhdGVkCisgKglpbiBoZWFkZXIuIEZyYWdtZW50ZWQgZGF0YSByZW1haW4gc2hhcmVkLiBUaGlzIGlzIHVzZWQgd2hlbgorICoJdGhlIGNhbGxlciB3aXNoZXMgdG8gbW9kaWZ5IG9ubHkgaGVhZGVyIG9mICZza19idWZmIGFuZCBuZWVkcworICoJcHJpdmF0ZSBjb3B5IG9mIHRoZSBoZWFkZXIgdG8gYWx0ZXIuIFJldHVybnMgJU5VTEwgb24gZmFpbHVyZQorICoJb3IgdGhlIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvbiBzdWNjZXNzLgorICoJVGhlIHJldHVybmVkIGJ1ZmZlciBoYXMgYSByZWZlcmVuY2UgY291bnQgb2YgMS4KKyAqLworCitzdHJ1Y3Qgc2tfYnVmZiAqcHNrYl9jb3B5KHN0cnVjdCBza19idWZmICpza2IsIGludCBnZnBfbWFzaykKK3sKKwkvKgorCSAqCUFsbG9jYXRlIHRoZSBjb3B5IGJ1ZmZlcgorCSAqLworCXN0cnVjdCBza19idWZmICpuID0gYWxsb2Nfc2tiKHNrYi0+ZW5kIC0gc2tiLT5oZWFkLCBnZnBfbWFzayk7CisKKwlpZiAoIW4pCisJCWdvdG8gb3V0OworCisJLyogU2V0IHRoZSBkYXRhIHBvaW50ZXIgKi8KKwlza2JfcmVzZXJ2ZShuLCBza2ItPmRhdGEgLSBza2ItPmhlYWQpOworCS8qIFNldCB0aGUgdGFpbCBwb2ludGVyIGFuZCBsZW5ndGggKi8KKwlza2JfcHV0KG4sIHNrYl9oZWFkbGVuKHNrYikpOworCS8qIENvcHkgdGhlIGJ5dGVzICovCisJbWVtY3B5KG4tPmRhdGEsIHNrYi0+ZGF0YSwgbi0+bGVuKTsKKwluLT5jc3VtCSAgICAgPSBza2ItPmNzdW07CisJbi0+aXBfc3VtbWVkID0gc2tiLT5pcF9zdW1tZWQ7CisKKwluLT5kYXRhX2xlbiAgPSBza2ItPmRhdGFfbGVuOworCW4tPmxlbgkgICAgID0gc2tiLT5sZW47CisKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncykgeworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKSB7CisJCQlza2Jfc2hpbmZvKG4pLT5mcmFnc1tpXSA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisJCQlnZXRfcGFnZShza2Jfc2hpbmZvKG4pLT5mcmFnc1tpXS5wYWdlKTsKKwkJfQorCQlza2Jfc2hpbmZvKG4pLT5ucl9mcmFncyA9IGk7CisJfQorCisJaWYgKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0KSB7CisJCXNrYl9zaGluZm8obiktPmZyYWdfbGlzdCA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0OworCQlza2JfY2xvbmVfZnJhZ2xpc3Qobik7CisJfQorCisJY29weV9za2JfaGVhZGVyKG4sIHNrYik7CitvdXQ6CisJcmV0dXJuIG47Cit9CisKKy8qKgorICoJcHNrYl9leHBhbmRfaGVhZCAtIHJlYWxsb2NhdGUgaGVhZGVyIG9mICZza19idWZmCisgKglAc2tiOiBidWZmZXIgdG8gcmVhbGxvY2F0ZQorICoJQG5oZWFkOiByb29tIHRvIGFkZCBhdCBoZWFkCisgKglAbnRhaWw6IHJvb20gdG8gYWRkIGF0IHRhaWwKKyAqCUBnZnBfbWFzazogYWxsb2NhdGlvbiBwcmlvcml0eQorICoKKyAqCUV4cGFuZHMgKG9yIGNyZWF0ZXMgaWRlbnRpY2FsIGNvcHksIGlmICZuaGVhZCBhbmQgJm50YWlsIGFyZSB6ZXJvKQorICoJaGVhZGVyIG9mIHNrYi4gJnNrX2J1ZmYgaXRzZWxmIGlzIG5vdCBjaGFuZ2VkLiAmc2tfYnVmZiBNVVNUIGhhdmUKKyAqCXJlZmVyZW5jZSBjb3VudCBvZiAxLiBSZXR1cm5zIHplcm8gaW4gdGhlIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciwKKyAqCWlmIGV4cGFuc2lvbiBmYWlsZWQuIEluIHRoZSBsYXN0IGNhc2UsICZza19idWZmIGlzIG5vdCBjaGFuZ2VkLgorICoKKyAqCUFsbCB0aGUgcG9pbnRlcnMgcG9pbnRpbmcgaW50byBza2IgaGVhZGVyIG1heSBjaGFuZ2UgYW5kIG11c3QgYmUKKyAqCXJlbG9hZGVkIGFmdGVyIGNhbGwgdG8gdGhpcyBmdW5jdGlvbi4KKyAqLworCitpbnQgcHNrYl9leHBhbmRfaGVhZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbmhlYWQsIGludCBudGFpbCwgaW50IGdmcF9tYXNrKQoreworCWludCBpOworCXU4ICpkYXRhOworCWludCBzaXplID0gbmhlYWQgKyAoc2tiLT5lbmQgLSBza2ItPmhlYWQpICsgbnRhaWw7CisJbG9uZyBvZmY7CisKKwlpZiAoc2tiX3NoYXJlZChza2IpKQorCQlCVUcoKTsKKworCXNpemUgPSBTS0JfREFUQV9BTElHTihzaXplKTsKKworCWRhdGEgPSBrbWFsbG9jKHNpemUgKyBzaXplb2Yoc3RydWN0IHNrYl9zaGFyZWRfaW5mbyksIGdmcF9tYXNrKTsKKwlpZiAoIWRhdGEpCisJCWdvdG8gbm9kYXRhOworCisJLyogQ29weSBvbmx5IHJlYWwgZGF0YS4uLiBhbmQsIGFsYXMsIGhlYWRlci4gVGhpcyBzaG91bGQgYmUKKwkgKiBvcHRpbWl6ZWQgZm9yIHRoZSBjYXNlcyB3aGVuIGhlYWRlciBpcyB2b2lkLiAqLworCW1lbWNweShkYXRhICsgbmhlYWQsIHNrYi0+aGVhZCwgc2tiLT50YWlsIC0gc2tiLT5oZWFkKTsKKwltZW1jcHkoZGF0YSArIHNpemUsIHNrYi0+ZW5kLCBzaXplb2Yoc3RydWN0IHNrYl9zaGFyZWRfaW5mbykpOworCisJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykKKwkJZ2V0X3BhZ2Uoc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5wYWdlKTsKKworCWlmIChza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCkKKwkJc2tiX2Nsb25lX2ZyYWdsaXN0KHNrYik7CisKKwlza2JfcmVsZWFzZV9kYXRhKHNrYik7CisKKwlvZmYgPSAoZGF0YSArIG5oZWFkKSAtIHNrYi0+aGVhZDsKKworCXNrYi0+aGVhZCAgICAgPSBkYXRhOworCXNrYi0+ZW5kICAgICAgPSBkYXRhICsgc2l6ZTsKKwlza2ItPmRhdGEgICAgKz0gb2ZmOworCXNrYi0+dGFpbCAgICArPSBvZmY7CisJc2tiLT5tYWMucmF3ICs9IG9mZjsKKwlza2ItPmgucmF3ICAgKz0gb2ZmOworCXNrYi0+bmgucmF3ICArPSBvZmY7CisJc2tiLT5jbG9uZWQgICA9IDA7CisJc2tiLT5ub2hkciAgICA9IDA7CisJYXRvbWljX3NldCgmc2tiX3NoaW5mbyhza2IpLT5kYXRhcmVmLCAxKTsKKwlyZXR1cm4gMDsKKworbm9kYXRhOgorCXJldHVybiAtRU5PTUVNOworfQorCisvKiBNYWtlIHByaXZhdGUgY29weSBvZiBza2Igd2l0aCB3cml0YWJsZSBoZWFkIGFuZCBzb21lIGhlYWRyb29tICovCisKK3N0cnVjdCBza19idWZmICpza2JfcmVhbGxvY19oZWFkcm9vbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgaGVhZHJvb20pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjI7CisJaW50IGRlbHRhID0gaGVhZHJvb20gLSBza2JfaGVhZHJvb20oc2tiKTsKKworCWlmIChkZWx0YSA8PSAwKQorCQlza2IyID0gcHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CisJZWxzZSB7CisJCXNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHNrYjIgJiYgcHNrYl9leHBhbmRfaGVhZChza2IyLCBTS0JfREFUQV9BTElHTihkZWx0YSksIDAsCisJCQkJCSAgICAgR0ZQX0FUT01JQykpIHsKKwkJCWtmcmVlX3NrYihza2IyKTsKKwkJCXNrYjIgPSBOVUxMOworCQl9CisJfQorCXJldHVybiBza2IyOworfQorCisKKy8qKgorICoJc2tiX2NvcHlfZXhwYW5kCS0JY29weSBhbmQgZXhwYW5kIHNrX2J1ZmYKKyAqCUBza2I6IGJ1ZmZlciB0byBjb3B5CisgKglAbmV3aGVhZHJvb206IG5ldyBmcmVlIGJ5dGVzIGF0IGhlYWQKKyAqCUBuZXd0YWlscm9vbTogbmV3IGZyZWUgYnl0ZXMgYXQgdGFpbAorICoJQGdmcF9tYXNrOiBhbGxvY2F0aW9uIHByaW9yaXR5CisgKgorICoJTWFrZSBhIGNvcHkgb2YgYm90aCBhbiAmc2tfYnVmZiBhbmQgaXRzIGRhdGEgYW5kIHdoaWxlIGRvaW5nIHNvCisgKglhbGxvY2F0ZSBhZGRpdGlvbmFsIHNwYWNlLgorICoKKyAqCVRoaXMgaXMgdXNlZCB3aGVuIHRoZSBjYWxsZXIgd2lzaGVzIHRvIG1vZGlmeSB0aGUgZGF0YSBhbmQgbmVlZHMgYQorICoJcHJpdmF0ZSBjb3B5IG9mIHRoZSBkYXRhIHRvIGFsdGVyIGFzIHdlbGwgYXMgbW9yZSBzcGFjZSBmb3IgbmV3IGZpZWxkcy4KKyAqCVJldHVybnMgJU5VTEwgb24gZmFpbHVyZSBvciB0aGUgcG9pbnRlciB0byB0aGUgYnVmZmVyCisgKglvbiBzdWNjZXNzLiBUaGUgcmV0dXJuZWQgYnVmZmVyIGhhcyBhIHJlZmVyZW5jZSBjb3VudCBvZiAxLgorICoKKyAqCVlvdSBtdXN0IHBhc3MgJUdGUF9BVE9NSUMgYXMgdGhlIGFsbG9jYXRpb24gcHJpb3JpdHkgaWYgdGhpcyBmdW5jdGlvbgorICoJaXMgY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0LgorICoKKyAqCUJVRyBBTEVSVDogaXBfc3VtbWVkIGlzIG5vdCBjb3BpZWQuIFdoeSBkb2VzIHRoaXMgd29yaz8gSXMgaXQgdXNlZAorICoJb25seSBieSBuZXRmaWx0ZXIgaW4gdGhlIGNhc2VzIHdoZW4gY2hlY2tzdW0gaXMgcmVjYWxjdWxhdGVkPyAtLUFOSworICovCitzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2NvcHlfZXhwYW5kKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkJaW50IG5ld2hlYWRyb29tLCBpbnQgbmV3dGFpbHJvb20sIGludCBnZnBfbWFzaykKK3sKKwkvKgorCSAqCUFsbG9jYXRlIHRoZSBjb3B5IGJ1ZmZlcgorCSAqLworCXN0cnVjdCBza19idWZmICpuID0gYWxsb2Nfc2tiKG5ld2hlYWRyb29tICsgc2tiLT5sZW4gKyBuZXd0YWlscm9vbSwKKwkJCQkgICAgICBnZnBfbWFzayk7CisJaW50IGhlYWRfY29weV9sZW4sIGhlYWRfY29weV9vZmY7CisKKwlpZiAoIW4pCisJCXJldHVybiBOVUxMOworCisJc2tiX3Jlc2VydmUobiwgbmV3aGVhZHJvb20pOworCisJLyogU2V0IHRoZSB0YWlsIHBvaW50ZXIgYW5kIGxlbmd0aCAqLworCXNrYl9wdXQobiwgc2tiLT5sZW4pOworCisJaGVhZF9jb3B5X2xlbiA9IHNrYl9oZWFkcm9vbShza2IpOworCWhlYWRfY29weV9vZmYgPSAwOworCWlmIChuZXdoZWFkcm9vbSA8PSBoZWFkX2NvcHlfbGVuKQorCQloZWFkX2NvcHlfbGVuID0gbmV3aGVhZHJvb207CisJZWxzZQorCQloZWFkX2NvcHlfb2ZmID0gbmV3aGVhZHJvb20gLSBoZWFkX2NvcHlfbGVuOworCisJLyogQ29weSB0aGUgbGluZWFyIGhlYWRlciBhbmQgZGF0YS4gKi8KKwlpZiAoc2tiX2NvcHlfYml0cyhza2IsIC1oZWFkX2NvcHlfbGVuLCBuLT5oZWFkICsgaGVhZF9jb3B5X29mZiwKKwkJCSAgc2tiLT5sZW4gKyBoZWFkX2NvcHlfbGVuKSkKKwkJQlVHKCk7CisKKwljb3B5X3NrYl9oZWFkZXIobiwgc2tiKTsKKworCXJldHVybiBuOworfQorCisvKioKKyAqCXNrYl9wYWQJCQktCXplcm8gcGFkIHRoZSB0YWlsIG9mIGFuIHNrYgorICoJQHNrYjogYnVmZmVyIHRvIHBhZAorICoJQHBhZDogc3BhY2UgdG8gcGFkCisgKgorICoJRW5zdXJlIHRoYXQgYSBidWZmZXIgaXMgZm9sbG93ZWQgYnkgYSBwYWRkaW5nIGFyZWEgdGhhdCBpcyB6ZXJvCisgKglmaWxsZWQuIFVzZWQgYnkgbmV0d29yayBkcml2ZXJzIHdoaWNoIG1heSBETUEgb3IgdHJhbnNmZXIgZGF0YQorICoJYmV5b25kIHRoZSBidWZmZXIgZW5kIG9udG8gdGhlIHdpcmUuCisgKgorICoJTWF5IHJldHVybiBOVUxMIGluIG91dCBvZiBtZW1vcnkgY2FzZXMuCisgKi8KKyAKK3N0cnVjdCBza19idWZmICpza2JfcGFkKHN0cnVjdCBza19idWZmICpza2IsIGludCBwYWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKm5za2I7CisJCisJLyogSWYgdGhlIHNrYnVmZiBpcyBub24gbGluZWFyIHRhaWxyb29tIGlzIGFsd2F5cyB6ZXJvLi4gKi8KKwlpZiAoc2tiX3RhaWxyb29tKHNrYikgPj0gcGFkKSB7CisJCW1lbXNldChza2ItPmRhdGErc2tiLT5sZW4sIDAsIHBhZCk7CisJCXJldHVybiBza2I7CisJfQorCQorCW5za2IgPSBza2JfY29weV9leHBhbmQoc2tiLCBza2JfaGVhZHJvb20oc2tiKSwgc2tiX3RhaWxyb29tKHNrYikgKyBwYWQsIEdGUF9BVE9NSUMpOworCWtmcmVlX3NrYihza2IpOworCWlmIChuc2tiKQorCQltZW1zZXQobnNrYi0+ZGF0YStuc2tiLT5sZW4sIDAsIHBhZCk7CisJcmV0dXJuIG5za2I7Cit9CQorIAorLyogVHJpbXMgc2tiIHRvIGxlbmd0aCBsZW4uIEl0IGNhbiBjaGFuZ2Ugc2tiIHBvaW50ZXJzLCBpZiAicmVhbGxvYyIgaXMgMS4KKyAqIElmIHJlYWxsb2M9PTAgYW5kIHRyaW1taW5nIGlzIGltcG9zc2libGUgd2l0aG91dCBjaGFuZ2Ugb2YgZGF0YSwKKyAqIGl0IGlzIEJVRygpLgorICovCisKK2ludCBfX19wc2tiX3RyaW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbiwgaW50IHJlYWxsb2MpCit7CisJaW50IG9mZnNldCA9IHNrYl9oZWFkbGVuKHNrYik7CisJaW50IG5mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmZyYWdzOyBpKyspIHsKKwkJaW50IGVuZCA9IG9mZnNldCArIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZTsKKwkJaWYgKGVuZCA+IGxlbikgeworCQkJaWYgKHNrYl9jbG9uZWQoc2tiKSkgeworCQkJCWlmICghcmVhbGxvYykKKwkJCQkJQlVHKCk7CisJCQkJaWYgKHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCAwLCBHRlBfQVRPTUlDKSkKKwkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlpZiAobGVuIDw9IG9mZnNldCkgeworCQkJCXB1dF9wYWdlKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZSk7CisJCQkJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncy0tOworCQkJfSBlbHNlIHsKKwkJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemUgPSBsZW4gLSBvZmZzZXQ7CisJCQl9CisJCX0KKwkJb2Zmc2V0ID0gZW5kOworCX0KKworCWlmIChvZmZzZXQgPCBsZW4pIHsKKwkJc2tiLT5kYXRhX2xlbiAtPSBza2ItPmxlbiAtIGxlbjsKKwkJc2tiLT5sZW4gICAgICAgPSBsZW47CisJfSBlbHNlIHsKKwkJaWYgKGxlbiA8PSBza2JfaGVhZGxlbihza2IpKSB7CisJCQlza2ItPmxlbiAgICAgID0gbGVuOworCQkJc2tiLT5kYXRhX2xlbiA9IDA7CisJCQlza2ItPnRhaWwgICAgID0gc2tiLT5kYXRhICsgbGVuOworCQkJaWYgKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0ICYmICFza2JfY2xvbmVkKHNrYikpCisJCQkJc2tiX2Ryb3BfZnJhZ2xpc3Qoc2tiKTsKKwkJfSBlbHNlIHsKKwkJCXNrYi0+ZGF0YV9sZW4gLT0gc2tiLT5sZW4gLSBsZW47CisJCQlza2ItPmxlbiAgICAgICA9IGxlbjsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqCV9fcHNrYl9wdWxsX3RhaWwgLSBhZHZhbmNlIHRhaWwgb2Ygc2tiIGhlYWRlcgorICoJQHNrYjogYnVmZmVyIHRvIHJlYWxsb2NhdGUKKyAqCUBkZWx0YTogbnVtYmVyIG9mIGJ5dGVzIHRvIGFkdmFuY2UgdGFpbAorICoKKyAqCVRoZSBmdW5jdGlvbiBtYWtlcyBhIHNlbnNlIG9ubHkgb24gYSBmcmFnbWVudGVkICZza19idWZmLAorICoJaXQgZXhwYW5kcyBoZWFkZXIgbW92aW5nIGl0cyB0YWlsIGZvcndhcmQgYW5kIGNvcHlpbmcgbmVjZXNzYXJ5CisgKglkYXRhIGZyb20gZnJhZ21lbnRlZCBwYXJ0LgorICoKKyAqCSZza19idWZmIE1VU1QgaGF2ZSByZWZlcmVuY2UgY291bnQgb2YgMS4KKyAqCisgKglSZXR1cm5zICVOVUxMIChhbmQgJnNrX2J1ZmYgZG9lcyBub3QgY2hhbmdlKSBpZiBwdWxsIGZhaWxlZAorICoJb3IgdmFsdWUgb2YgbmV3IHRhaWwgb2Ygc2tiIGluIHRoZSBjYXNlIG9mIHN1Y2Nlc3MuCisgKgorICoJQWxsIHRoZSBwb2ludGVycyBwb2ludGluZyBpbnRvIHNrYiBoZWFkZXIgbWF5IGNoYW5nZSBhbmQgbXVzdCBiZQorICoJcmVsb2FkZWQgYWZ0ZXIgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLgorICovCisKKy8qIE1vdmVzIHRhaWwgb2Ygc2tiIGhlYWQgZm9yd2FyZCwgY29weWluZyBkYXRhIGZyb20gZnJhZ21lbnRlZCBwYXJ0LAorICogd2hlbiBpdCBpcyBuZWNlc3NhcnkuCisgKiAxLiBJdCBtYXkgZmFpbCBkdWUgdG8gbWFsbG9jIGZhaWx1cmUuCisgKiAyLiBJdCBtYXkgY2hhbmdlIHNrYiBwb2ludGVycy4KKyAqCisgKiBJdCBpcyBwcmV0dHkgY29tcGxpY2F0ZWQuIEx1Y2tpbHksIGl0IGlzIGNhbGxlZCBvbmx5IGluIGV4Y2VwdGlvbmFsIGNhc2VzLgorICovCit1bnNpZ25lZCBjaGFyICpfX3Bza2JfcHVsbF90YWlsKHN0cnVjdCBza19idWZmICpza2IsIGludCBkZWx0YSkKK3sKKwkvKiBJZiBza2IgaGFzIG5vdCBlbm91Z2ggZnJlZSBzcGFjZSBhdCB0YWlsLCBnZXQgbmV3IG9uZQorCSAqIHBsdXMgMTI4IGJ5dGVzIGZvciBmdXR1cmUgZXhwYW5zaW9ucy4gSWYgd2UgaGF2ZSBlbm91Z2gKKwkgKiByb29tIGF0IHRhaWwsIHJlYWxsb2NhdGUgd2l0aG91dCBleHBhbnNpb24gb25seSBpZiBza2IgaXMgY2xvbmVkLgorCSAqLworCWludCBpLCBrLCBlYXQgPSAoc2tiLT50YWlsICsgZGVsdGEpIC0gc2tiLT5lbmQ7CisKKwlpZiAoZWF0ID4gMCB8fCBza2JfY2xvbmVkKHNrYikpIHsKKwkJaWYgKHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCBlYXQgPiAwID8gZWF0ICsgMTI4IDogMCwKKwkJCQkgICAgIEdGUF9BVE9NSUMpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCBza2JfaGVhZGxlbihza2IpLCBza2ItPnRhaWwsIGRlbHRhKSkKKwkJQlVHKCk7CisKKwkvKiBPcHRpbWl6YXRpb246IG5vIGZyYWdtZW50cywgbm8gcmVhc29ucyB0byBwcmVlc3RpbWF0ZQorCSAqIHNpemUgb2YgcHVsbGVkIHBhZ2VzLiBTdXBlcmIuCisJICovCisJaWYgKCFza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCkKKwkJZ290byBwdWxsX3BhZ2VzOworCisJLyogRXN0aW1hdGUgc2l6ZSBvZiBwdWxsZWQgcGFnZXMuICovCisJZWF0ID0gZGVsdGE7CisJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykgeworCQlpZiAoc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplID49IGVhdCkKKwkJCWdvdG8gcHVsbF9wYWdlczsKKwkJZWF0IC09IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZTsKKwl9CisKKwkvKiBJZiB3ZSBuZWVkIHVwZGF0ZSBmcmFnIGxpc3QsIHdlIGFyZSBpbiB0cm91Ymxlcy4KKwkgKiBDZXJ0YWlubHksIGl0IHBvc3NpYmxlIHRvIGFkZCBhbiBvZmZzZXQgdG8gc2tiIGRhdGEsCisJICogYnV0IHRha2luZyBpbnRvIGFjY291bnQgdGhhdCBwdWxsaW5nIGlzIGV4cGVjdGVkIHRvCisJICogYmUgdmVyeSByYXJlIG9wZXJhdGlvbiwgaXQgaXMgd29ydGggdG8gZmlnaHQgYWdhaW5zdAorCSAqIGZ1cnRoZXIgYmxvYXRpbmcgc2tiIGhlYWQgYW5kIGNydWNpZnkgb3Vyc2VsdmVzIGhlcmUgaW5zdGVhZC4KKwkgKiBQdXJlIG1hc29oaXNtLCBpbmRlZWQuIDgpOCkKKwkgKi8KKwlpZiAoZWF0KSB7CisJCXN0cnVjdCBza19idWZmICpsaXN0ID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3Q7CisJCXN0cnVjdCBza19idWZmICpjbG9uZSA9IE5VTEw7CisJCXN0cnVjdCBza19idWZmICppbnNwID0gTlVMTDsKKworCQlkbyB7CisJCQlpZiAoIWxpc3QpCisJCQkJQlVHKCk7CisKKwkJCWlmIChsaXN0LT5sZW4gPD0gZWF0KSB7CisJCQkJLyogRWF0ZW4gYXMgd2hvbGUuICovCisJCQkJZWF0IC09IGxpc3QtPmxlbjsKKwkJCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJCQlpbnNwID0gbGlzdDsKKwkJCX0gZWxzZSB7CisJCQkJLyogRWF0ZW4gcGFydGlhbGx5LiAqLworCisJCQkJaWYgKHNrYl9zaGFyZWQobGlzdCkpIHsKKwkJCQkJLyogU3Vja3MhIFdlIG5lZWQgdG8gZm9yayBsaXN0LiA6LSggKi8KKwkJCQkJY2xvbmUgPSBza2JfY2xvbmUobGlzdCwgR0ZQX0FUT01JQyk7CisJCQkJCWlmICghY2xvbmUpCisJCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQkJaW5zcCA9IGxpc3QtPm5leHQ7CisJCQkJCWxpc3QgPSBjbG9uZTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBUaGlzIG1heSBiZSBwdWxsZWQgd2l0aG91dAorCQkJCQkgKiBwcm9ibGVtcy4gKi8KKwkJCQkJaW5zcCA9IGxpc3Q7CisJCQkJfQorCQkJCWlmICghcHNrYl9wdWxsKGxpc3QsIGVhdCkpIHsKKwkJCQkJaWYgKGNsb25lKQorCQkJCQkJa2ZyZWVfc2tiKGNsb25lKTsKKwkJCQkJcmV0dXJuIE5VTEw7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9IHdoaWxlIChlYXQpOworCisJCS8qIEZyZWUgcHVsbGVkIG91dCBmcmFnbWVudHMuICovCisJCXdoaWxlICgobGlzdCA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0KSAhPSBpbnNwKSB7CisJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCA9IGxpc3QtPm5leHQ7CisJCQlrZnJlZV9za2IobGlzdCk7CisJCX0KKwkJLyogQW5kIGluc2VydCBuZXcgY2xvbmUgYXQgaGVhZC4gKi8KKwkJaWYgKGNsb25lKSB7CisJCQljbG9uZS0+bmV4dCA9IGxpc3Q7CisJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCA9IGNsb25lOworCQl9CisJfQorCS8qIFN1Y2Nlc3MhIE5vdyB3ZSBtYXkgY29tbWl0IGNoYW5nZXMgdG8gc2tiIGRhdGEuICovCisKK3B1bGxfcGFnZXM6CisJZWF0ID0gZGVsdGE7CisJayA9IDA7CisJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykgeworCQlpZiAoc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplIDw9IGVhdCkgeworCQkJcHV0X3BhZ2Uoc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5wYWdlKTsKKwkJCWVhdCAtPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CisJCX0gZWxzZSB7CisJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2tdID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKKwkJCWlmIChlYXQpIHsKKwkJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2tdLnBhZ2Vfb2Zmc2V0ICs9IGVhdDsKKwkJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2tdLnNpemUgLT0gZWF0OworCQkJCWVhdCA9IDA7CisJCQl9CisJCQlrKys7CisJCX0KKwl9CisJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA9IGs7CisKKwlza2ItPnRhaWwgICAgICs9IGRlbHRhOworCXNrYi0+ZGF0YV9sZW4gLT0gZGVsdGE7CisKKwlyZXR1cm4gc2tiLT50YWlsOworfQorCisvKiBDb3B5IHNvbWUgZGF0YSBiaXRzIGZyb20gc2tiIHRvIGtlcm5lbCBidWZmZXIuICovCisKK2ludCBza2JfY29weV9iaXRzKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGludCBvZmZzZXQsIHZvaWQgKnRvLCBpbnQgbGVuKQoreworCWludCBpLCBjb3B5OworCWludCBzdGFydCA9IHNrYl9oZWFkbGVuKHNrYik7CisKKwlpZiAob2Zmc2V0ID4gKGludClza2ItPmxlbiAtIGxlbikKKwkJZ290byBmYXVsdDsKKworCS8qIENvcHkgaGVhZGVyLiAqLworCWlmICgoY29weSA9IHN0YXJ0IC0gb2Zmc2V0KSA+IDApIHsKKwkJaWYgKGNvcHkgPiBsZW4pCisJCQljb3B5ID0gbGVuOworCQltZW1jcHkodG8sIHNrYi0+ZGF0YSArIG9mZnNldCwgY29weSk7CisJCWlmICgobGVuIC09IGNvcHkpID09IDApCisJCQlyZXR1cm4gMDsKKwkJb2Zmc2V0ICs9IGNvcHk7CisJCXRvICAgICArPSBjb3B5OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBpKyspIHsKKwkJaW50IGVuZDsKKworCQlCVUdfVFJBUChzdGFydCA8PSBvZmZzZXQgKyBsZW4pOworCisJCWVuZCA9IHN0YXJ0ICsgc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOworCQlpZiAoKGNvcHkgPSBlbmQgLSBvZmZzZXQpID4gMCkgeworCQkJdTggKnZhZGRyOworCisJCQlpZiAoY29weSA+IGxlbikKKwkJCQljb3B5ID0gbGVuOworCisJCQl2YWRkciA9IGttYXBfc2tiX2ZyYWcoJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0pOworCQkJbWVtY3B5KHRvLAorCQkJICAgICAgIHZhZGRyICsgc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5wYWdlX29mZnNldCsKKwkJCSAgICAgICBvZmZzZXQgLSBzdGFydCwgY29weSk7CisJCQlrdW5tYXBfc2tiX2ZyYWcodmFkZHIpOworCisJCQlpZiAoKGxlbiAtPSBjb3B5KSA9PSAwKQorCQkJCXJldHVybiAwOworCQkJb2Zmc2V0ICs9IGNvcHk7CisJCQl0byAgICAgKz0gY29weTsKKwkJfQorCQlzdGFydCA9IGVuZDsKKwl9CisKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKmxpc3QgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKKworCQlmb3IgKDsgbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJCWludCBlbmQ7CisKKwkJCUJVR19UUkFQKHN0YXJ0IDw9IG9mZnNldCArIGxlbik7CisKKwkJCWVuZCA9IHN0YXJ0ICsgbGlzdC0+bGVuOworCQkJaWYgKChjb3B5ID0gZW5kIC0gb2Zmc2V0KSA+IDApIHsKKwkJCQlpZiAoY29weSA+IGxlbikKKwkJCQkJY29weSA9IGxlbjsKKwkJCQlpZiAoc2tiX2NvcHlfYml0cyhsaXN0LCBvZmZzZXQgLSBzdGFydCwKKwkJCQkJCSAgdG8sIGNvcHkpKQorCQkJCQlnb3RvIGZhdWx0OworCQkJCWlmICgobGVuIC09IGNvcHkpID09IDApCisJCQkJCXJldHVybiAwOworCQkJCW9mZnNldCArPSBjb3B5OworCQkJCXRvICAgICArPSBjb3B5OworCQkJfQorCQkJc3RhcnQgPSBlbmQ7CisJCX0KKwl9CisJaWYgKCFsZW4pCisJCXJldHVybiAwOworCitmYXVsdDoKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworLyogQ2hlY2tzdW0gc2tiIGRhdGEuICovCisKK3Vuc2lnbmVkIGludCBza2JfY2hlY2tzdW0oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCwKKwkJCSAgaW50IGxlbiwgdW5zaWduZWQgaW50IGNzdW0pCit7CisJaW50IHN0YXJ0ID0gc2tiX2hlYWRsZW4oc2tiKTsKKwlpbnQgaSwgY29weSA9IHN0YXJ0IC0gb2Zmc2V0OworCWludCBwb3MgPSAwOworCisJLyogQ2hlY2tzdW0gaGVhZGVyLiAqLworCWlmIChjb3B5ID4gMCkgeworCQlpZiAoY29weSA+IGxlbikKKwkJCWNvcHkgPSBsZW47CisJCWNzdW0gPSBjc3VtX3BhcnRpYWwoc2tiLT5kYXRhICsgb2Zmc2V0LCBjb3B5LCBjc3VtKTsKKwkJaWYgKChsZW4gLT0gY29weSkgPT0gMCkKKwkJCXJldHVybiBjc3VtOworCQlvZmZzZXQgKz0gY29weTsKKwkJcG9zCT0gY29weTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKSB7CisJCWludCBlbmQ7CisKKwkJQlVHX1RSQVAoc3RhcnQgPD0gb2Zmc2V0ICsgbGVuKTsKKworCQllbmQgPSBzdGFydCArIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZTsKKwkJaWYgKChjb3B5ID0gZW5kIC0gb2Zmc2V0KSA+IDApIHsKKwkJCXVuc2lnbmVkIGludCBjc3VtMjsKKwkJCXU4ICp2YWRkcjsKKwkJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKKworCQkJaWYgKGNvcHkgPiBsZW4pCisJCQkJY29weSA9IGxlbjsKKwkJCXZhZGRyID0ga21hcF9za2JfZnJhZyhmcmFnKTsKKwkJCWNzdW0yID0gY3N1bV9wYXJ0aWFsKHZhZGRyICsgZnJhZy0+cGFnZV9vZmZzZXQgKworCQkJCQkgICAgIG9mZnNldCAtIHN0YXJ0LCBjb3B5LCAwKTsKKwkJCWt1bm1hcF9za2JfZnJhZyh2YWRkcik7CisJCQljc3VtID0gY3N1bV9ibG9ja19hZGQoY3N1bSwgY3N1bTIsIHBvcyk7CisJCQlpZiAoIShsZW4gLT0gY29weSkpCisJCQkJcmV0dXJuIGNzdW07CisJCQlvZmZzZXQgKz0gY29weTsKKwkJCXBvcyAgICArPSBjb3B5OworCQl9CisJCXN0YXJ0ID0gZW5kOworCX0KKworCWlmIChza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqbGlzdCA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0OworCisJCWZvciAoOyBsaXN0OyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQkJaW50IGVuZDsKKworCQkJQlVHX1RSQVAoc3RhcnQgPD0gb2Zmc2V0ICsgbGVuKTsKKworCQkJZW5kID0gc3RhcnQgKyBsaXN0LT5sZW47CisJCQlpZiAoKGNvcHkgPSBlbmQgLSBvZmZzZXQpID4gMCkgeworCQkJCXVuc2lnbmVkIGludCBjc3VtMjsKKwkJCQlpZiAoY29weSA+IGxlbikKKwkJCQkJY29weSA9IGxlbjsKKwkJCQljc3VtMiA9IHNrYl9jaGVja3N1bShsaXN0LCBvZmZzZXQgLSBzdGFydCwKKwkJCQkJCSAgICAgY29weSwgMCk7CisJCQkJY3N1bSA9IGNzdW1fYmxvY2tfYWRkKGNzdW0sIGNzdW0yLCBwb3MpOworCQkJCWlmICgobGVuIC09IGNvcHkpID09IDApCisJCQkJCXJldHVybiBjc3VtOworCQkJCW9mZnNldCArPSBjb3B5OworCQkJCXBvcyAgICArPSBjb3B5OworCQkJfQorCQkJc3RhcnQgPSBlbmQ7CisJCX0KKwl9CisJaWYgKGxlbikKKwkJQlVHKCk7CisKKwlyZXR1cm4gY3N1bTsKK30KKworLyogQm90aCBvZiBhYm92ZSBpbiBvbmUgYm90dGxlLiAqLworCit1bnNpZ25lZCBpbnQgc2tiX2NvcHlfYW5kX2NzdW1fYml0cyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0LAorCQkJCSAgICB1OCAqdG8sIGludCBsZW4sIHVuc2lnbmVkIGludCBjc3VtKQoreworCWludCBzdGFydCA9IHNrYl9oZWFkbGVuKHNrYik7CisJaW50IGksIGNvcHkgPSBzdGFydCAtIG9mZnNldDsKKwlpbnQgcG9zID0gMDsKKworCS8qIENvcHkgaGVhZGVyLiAqLworCWlmIChjb3B5ID4gMCkgeworCQlpZiAoY29weSA+IGxlbikKKwkJCWNvcHkgPSBsZW47CisJCWNzdW0gPSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKHNrYi0+ZGF0YSArIG9mZnNldCwgdG8sCisJCQkJCQkgY29weSwgY3N1bSk7CisJCWlmICgobGVuIC09IGNvcHkpID09IDApCisJCQlyZXR1cm4gY3N1bTsKKwkJb2Zmc2V0ICs9IGNvcHk7CisJCXRvICAgICArPSBjb3B5OworCQlwb3MJPSBjb3B5OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBpKyspIHsKKwkJaW50IGVuZDsKKworCQlCVUdfVFJBUChzdGFydCA8PSBvZmZzZXQgKyBsZW4pOworCisJCWVuZCA9IHN0YXJ0ICsgc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOworCQlpZiAoKGNvcHkgPSBlbmQgLSBvZmZzZXQpID4gMCkgeworCQkJdW5zaWduZWQgaW50IGNzdW0yOworCQkJdTggKnZhZGRyOworCQkJc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCisJCQlpZiAoY29weSA+IGxlbikKKwkJCQljb3B5ID0gbGVuOworCQkJdmFkZHIgPSBrbWFwX3NrYl9mcmFnKGZyYWcpOworCQkJY3N1bTIgPSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKHZhZGRyICsKKwkJCQkJCQkgIGZyYWctPnBhZ2Vfb2Zmc2V0ICsKKwkJCQkJCQkgIG9mZnNldCAtIHN0YXJ0LCB0bywKKwkJCQkJCQkgIGNvcHksIDApOworCQkJa3VubWFwX3NrYl9mcmFnKHZhZGRyKTsKKwkJCWNzdW0gPSBjc3VtX2Jsb2NrX2FkZChjc3VtLCBjc3VtMiwgcG9zKTsKKwkJCWlmICghKGxlbiAtPSBjb3B5KSkKKwkJCQlyZXR1cm4gY3N1bTsKKwkJCW9mZnNldCArPSBjb3B5OworCQkJdG8gICAgICs9IGNvcHk7CisJCQlwb3MgICAgKz0gY29weTsKKwkJfQorCQlzdGFydCA9IGVuZDsKKwl9CisKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKmxpc3QgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKKworCQlmb3IgKDsgbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJCXVuc2lnbmVkIGludCBjc3VtMjsKKwkJCWludCBlbmQ7CisKKwkJCUJVR19UUkFQKHN0YXJ0IDw9IG9mZnNldCArIGxlbik7CisKKwkJCWVuZCA9IHN0YXJ0ICsgbGlzdC0+bGVuOworCQkJaWYgKChjb3B5ID0gZW5kIC0gb2Zmc2V0KSA+IDApIHsKKwkJCQlpZiAoY29weSA+IGxlbikKKwkJCQkJY29weSA9IGxlbjsKKwkJCQljc3VtMiA9IHNrYl9jb3B5X2FuZF9jc3VtX2JpdHMobGlzdCwKKwkJCQkJCQkgICAgICAgb2Zmc2V0IC0gc3RhcnQsCisJCQkJCQkJICAgICAgIHRvLCBjb3B5LCAwKTsKKwkJCQljc3VtID0gY3N1bV9ibG9ja19hZGQoY3N1bSwgY3N1bTIsIHBvcyk7CisJCQkJaWYgKChsZW4gLT0gY29weSkgPT0gMCkKKwkJCQkJcmV0dXJuIGNzdW07CisJCQkJb2Zmc2V0ICs9IGNvcHk7CisJCQkJdG8gICAgICs9IGNvcHk7CisJCQkJcG9zICAgICs9IGNvcHk7CisJCQl9CisJCQlzdGFydCA9IGVuZDsKKwkJfQorCX0KKwlpZiAobGVuKQorCQlCVUcoKTsKKwlyZXR1cm4gY3N1bTsKK30KKwordm9pZCBza2JfY29weV9hbmRfY3N1bV9kZXYoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKnRvKQoreworCXVuc2lnbmVkIGludCBjc3VtOworCWxvbmcgY3NzdGFydDsKKworCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykKKwkJY3NzdGFydCA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGE7CisJZWxzZQorCQljc3N0YXJ0ID0gc2tiX2hlYWRsZW4oc2tiKTsKKworCWlmIChjc3N0YXJ0ID4gc2tiX2hlYWRsZW4oc2tiKSkKKwkJQlVHKCk7CisKKwltZW1jcHkodG8sIHNrYi0+ZGF0YSwgY3NzdGFydCk7CisKKwljc3VtID0gMDsKKwlpZiAoY3NzdGFydCAhPSBza2ItPmxlbikKKwkJY3N1bSA9IHNrYl9jb3B5X2FuZF9jc3VtX2JpdHMoc2tiLCBjc3N0YXJ0LCB0byArIGNzc3RhcnQsCisJCQkJCSAgICAgIHNrYi0+bGVuIC0gY3NzdGFydCwgMCk7CisKKwlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpIHsKKwkJbG9uZyBjc3N0dWZmID0gY3NzdGFydCArIHNrYi0+Y3N1bTsKKworCQkqKCh1bnNpZ25lZCBzaG9ydCAqKSh0byArIGNzc3R1ZmYpKSA9IGNzdW1fZm9sZChjc3VtKTsKKwl9Cit9CisKKy8qKgorICoJc2tiX2RlcXVldWUgLSByZW1vdmUgZnJvbSB0aGUgaGVhZCBvZiB0aGUgcXVldWUKKyAqCUBsaXN0OiBsaXN0IHRvIGRlcXVldWUgZnJvbQorICoKKyAqCVJlbW92ZSB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gVGhlIGxpc3QgbG9jayBpcyB0YWtlbiBzbyB0aGUgZnVuY3Rpb24KKyAqCW1heSBiZSB1c2VkIHNhZmVseSB3aXRoIG90aGVyIGxvY2tpbmcgbGlzdCBmdW5jdGlvbnMuIFRoZSBoZWFkIGl0ZW0gaXMKKyAqCXJldHVybmVkIG9yICVOVUxMIGlmIHRoZSBsaXN0IGlzIGVtcHR5LgorICovCisKK3N0cnVjdCBza19idWZmICpza2JfZGVxdWV1ZShzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNrX2J1ZmYgKnJlc3VsdDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsaXN0LT5sb2NrLCBmbGFncyk7CisJcmVzdWx0ID0gX19za2JfZGVxdWV1ZShsaXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKglza2JfZGVxdWV1ZV90YWlsIC0gcmVtb3ZlIGZyb20gdGhlIHRhaWwgb2YgdGhlIHF1ZXVlCisgKglAbGlzdDogbGlzdCB0byBkZXF1ZXVlIGZyb20KKyAqCisgKglSZW1vdmUgdGhlIHRhaWwgb2YgdGhlIGxpc3QuIFRoZSBsaXN0IGxvY2sgaXMgdGFrZW4gc28gdGhlIGZ1bmN0aW9uCisgKgltYXkgYmUgdXNlZCBzYWZlbHkgd2l0aCBvdGhlciBsb2NraW5nIGxpc3QgZnVuY3Rpb25zLiBUaGUgdGFpbCBpdGVtIGlzCisgKglyZXR1cm5lZCBvciAlTlVMTCBpZiB0aGUgbGlzdCBpcyBlbXB0eS4KKyAqLworc3RydWN0IHNrX2J1ZmYgKnNrYl9kZXF1ZXVlX3RhaWwoc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBza19idWZmICpyZXN1bHQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGlzdC0+bG9jaywgZmxhZ3MpOworCXJlc3VsdCA9IF9fc2tiX2RlcXVldWVfdGFpbChsaXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKglza2JfcXVldWVfcHVyZ2UgLSBlbXB0eSBhIGxpc3QKKyAqCUBsaXN0OiBsaXN0IHRvIGVtcHR5CisgKgorICoJRGVsZXRlIGFsbCBidWZmZXJzIG9uIGFuICZza19idWZmIGxpc3QuIEVhY2ggYnVmZmVyIGlzIHJlbW92ZWQgZnJvbQorICoJdGhlIGxpc3QgYW5kIG9uZSByZWZlcmVuY2UgZHJvcHBlZC4gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgbGlzdAorICoJbG9jayBhbmQgaXMgYXRvbWljIHdpdGggcmVzcGVjdCB0byBvdGhlciBsaXN0IGxvY2tpbmcgZnVuY3Rpb25zLgorICovCit2b2lkIHNrYl9xdWV1ZV9wdXJnZShzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZShsaXN0KSkgIT0gTlVMTCkKKwkJa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qKgorICoJc2tiX3F1ZXVlX2hlYWQgLSBxdWV1ZSBhIGJ1ZmZlciBhdCB0aGUgbGlzdCBoZWFkCisgKglAbGlzdDogbGlzdCB0byB1c2UKKyAqCUBuZXdzazogYnVmZmVyIHRvIHF1ZXVlCisgKgorICoJUXVldWUgYSBidWZmZXIgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaXN0LiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZQorICoJbGlzdCBsb2NrIGFuZCBjYW4gYmUgdXNlZCBzYWZlbHkgd2l0aCBvdGhlciBsb2NraW5nICZza19idWZmIGZ1bmN0aW9ucworICoJc2FmZWx5LgorICoKKyAqCUEgYnVmZmVyIGNhbm5vdCBiZSBwbGFjZWQgb24gdHdvIGxpc3RzIGF0IHRoZSBzYW1lIHRpbWUuCisgKi8KK3ZvaWQgc2tiX3F1ZXVlX2hlYWQoc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCwgc3RydWN0IHNrX2J1ZmYgKm5ld3NrKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGlzdC0+bG9jaywgZmxhZ3MpOworCV9fc2tiX3F1ZXVlX2hlYWQobGlzdCwgbmV3c2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpc3QtPmxvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKglza2JfcXVldWVfdGFpbCAtIHF1ZXVlIGEgYnVmZmVyIGF0IHRoZSBsaXN0IHRhaWwKKyAqCUBsaXN0OiBsaXN0IHRvIHVzZQorICoJQG5ld3NrOiBidWZmZXIgdG8gcXVldWUKKyAqCisgKglRdWV1ZSBhIGJ1ZmZlciBhdCB0aGUgdGFpbCBvZiB0aGUgbGlzdC4gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUKKyAqCWxpc3QgbG9jayBhbmQgY2FuIGJlIHVzZWQgc2FmZWx5IHdpdGggb3RoZXIgbG9ja2luZyAmc2tfYnVmZiBmdW5jdGlvbnMKKyAqCXNhZmVseS4KKyAqCisgKglBIGJ1ZmZlciBjYW5ub3QgYmUgcGxhY2VkIG9uIHR3byBsaXN0cyBhdCB0aGUgc2FtZSB0aW1lLgorICovCit2b2lkIHNrYl9xdWV1ZV90YWlsKHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QsIHN0cnVjdCBza19idWZmICpuZXdzaykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3QtPmxvY2ssIGZsYWdzKTsKKwlfX3NrYl9xdWV1ZV90YWlsKGxpc3QsIG5ld3NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0LT5sb2NrLCBmbGFncyk7Cit9CisvKioKKyAqCXNrYl91bmxpbmsJLQlyZW1vdmUgYSBidWZmZXIgZnJvbSBhIGxpc3QKKyAqCUBza2I6IGJ1ZmZlciB0byByZW1vdmUKKyAqCisgKglQbGFjZSBhIHBhY2tldCBhZnRlciBhIGdpdmVuIHBhY2tldCBpbiBhIGxpc3QuIFRoZSBsaXN0IGxvY2tzIGFyZSB0YWtlbgorICoJYW5kIHRoaXMgZnVuY3Rpb24gaXMgYXRvbWljIHdpdGggcmVzcGVjdCB0byBvdGhlciBsaXN0IGxvY2tlZCBjYWxscworICoKKyAqCVdvcmtzIGV2ZW4gd2l0aG91dCBrbm93aW5nIHRoZSBsaXN0IGl0IGlzIHNpdHRpbmcgb24sIHdoaWNoIGNhbiBiZQorICoJaGFuZHkgYXQgdGltZXMuIEl0IGFsc28gbWVhbnMgdGhhdCBUSEUgTElTVCBNVVNUIEVYSVNUIHdoZW4geW91CisgKgl1bmxpbmsuIFRodXMgYSBsaXN0IG11c3QgaGF2ZSBpdHMgY29udGVudHMgdW5saW5rZWQgYmVmb3JlIGl0IGlzCisgKglkZXN0cm95ZWQuCisgKi8KK3ZvaWQgc2tiX3VubGluayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QgPSBza2ItPmxpc3Q7CisKKwlpZiAobGlzdCkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZsaXN0LT5sb2NrLCBmbGFncyk7CisJCWlmIChza2ItPmxpc3QgPT0gbGlzdCkKKwkJCV9fc2tiX3VubGluayhza2IsIHNrYi0+bGlzdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpc3QtPmxvY2ssIGZsYWdzKTsKKwl9Cit9CisKKworLyoqCisgKglza2JfYXBwZW5kCS0JYXBwZW5kIGEgYnVmZmVyCisgKglAb2xkOiBidWZmZXIgdG8gaW5zZXJ0IGFmdGVyCisgKglAbmV3c2s6IGJ1ZmZlciB0byBpbnNlcnQKKyAqCisgKglQbGFjZSBhIHBhY2tldCBhZnRlciBhIGdpdmVuIHBhY2tldCBpbiBhIGxpc3QuIFRoZSBsaXN0IGxvY2tzIGFyZSB0YWtlbgorICoJYW5kIHRoaXMgZnVuY3Rpb24gaXMgYXRvbWljIHdpdGggcmVzcGVjdCB0byBvdGhlciBsaXN0IGxvY2tlZCBjYWxscy4KKyAqCUEgYnVmZmVyIGNhbm5vdCBiZSBwbGFjZWQgb24gdHdvIGxpc3RzIGF0IHRoZSBzYW1lIHRpbWUuCisgKi8KKwordm9pZCBza2JfYXBwZW5kKHN0cnVjdCBza19idWZmICpvbGQsIHN0cnVjdCBza19idWZmICpuZXdzaykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9sZC0+bGlzdC0+bG9jaywgZmxhZ3MpOworCV9fc2tiX2FwcGVuZChvbGQsIG5ld3NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvbGQtPmxpc3QtPmxvY2ssIGZsYWdzKTsKK30KKworCisvKioKKyAqCXNrYl9pbnNlcnQJLQlpbnNlcnQgYSBidWZmZXIKKyAqCUBvbGQ6IGJ1ZmZlciB0byBpbnNlcnQgYmVmb3JlCisgKglAbmV3c2s6IGJ1ZmZlciB0byBpbnNlcnQKKyAqCisgKglQbGFjZSBhIHBhY2tldCBiZWZvcmUgYSBnaXZlbiBwYWNrZXQgaW4gYSBsaXN0LiBUaGUgbGlzdCBsb2NrcyBhcmUgdGFrZW4KKyAqCWFuZCB0aGlzIGZ1bmN0aW9uIGlzIGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gb3RoZXIgbGlzdCBsb2NrZWQgY2FsbHMKKyAqCUEgYnVmZmVyIGNhbm5vdCBiZSBwbGFjZWQgb24gdHdvIGxpc3RzIGF0IHRoZSBzYW1lIHRpbWUuCisgKi8KKwordm9pZCBza2JfaW5zZXJ0KHN0cnVjdCBza19idWZmICpvbGQsIHN0cnVjdCBza19idWZmICpuZXdzaykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9sZC0+bGlzdC0+bG9jaywgZmxhZ3MpOworCV9fc2tiX2luc2VydChuZXdzaywgb2xkLT5wcmV2LCBvbGQsIG9sZC0+bGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2xkLT5saXN0LT5sb2NrLCBmbGFncyk7Cit9CisKKyNpZiAwCisvKgorICogCVR1bmUgdGhlIG1lbW9yeSBhbGxvY2F0b3IgZm9yIGEgbmV3IE1UVSBzaXplLgorICovCit2b2lkIHNrYl9hZGRfbXR1KGludCBtdHUpCit7CisJLyogTXVzdCBtYXRjaCBhbGxvY2F0aW9uIGluIGFsbG9jX3NrYiAqLworCW10dSA9IFNLQl9EQVRBX0FMSUdOKG10dSkgKyBzaXplb2Yoc3RydWN0IHNrYl9zaGFyZWRfaW5mbyk7CisKKwlrbWVtX2FkZF9jYWNoZV9zaXplKG10dSk7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIHNrYl9zcGxpdF9pbnNpZGVfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgIHN0cnVjdCBza19idWZmKiBza2IxLAorCQkJCQkgICBjb25zdCB1MzIgbGVuLCBjb25zdCBpbnQgcG9zKQoreworCWludCBpOworCisJbWVtY3B5KHNrYl9wdXQoc2tiMSwgcG9zIC0gbGVuKSwgc2tiLT5kYXRhICsgbGVuLCBwb3MgLSBsZW4pOworCisJLyogQW5kIG1vdmUgZGF0YSBhcHBlbmRpeCBhcyBpcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKQorCQlza2Jfc2hpbmZvKHNrYjEpLT5mcmFnc1tpXSA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisKKwlza2Jfc2hpbmZvKHNrYjEpLT5ucl9mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyAgPSAwOworCXNrYjEtPmRhdGFfbGVuCQkgICA9IHNrYi0+ZGF0YV9sZW47CisJc2tiMS0+bGVuCQkgICArPSBza2IxLT5kYXRhX2xlbjsKKwlza2ItPmRhdGFfbGVuCQkgICA9IDA7CisJc2tiLT5sZW4JCSAgID0gbGVuOworCXNrYi0+dGFpbAkJICAgPSBza2ItPmRhdGEgKyBsZW47Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBza2Jfc3BsaXRfbm9faGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmKiBza2IxLAorCQkJCSAgICAgICBjb25zdCB1MzIgbGVuLCBpbnQgcG9zKQoreworCWludCBpLCBrID0gMDsKKwljb25zdCBpbnQgbmZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKworCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPSAwOworCXNrYjEtPmxlbgkJICA9IHNrYjEtPmRhdGFfbGVuID0gc2tiLT5sZW4gLSBsZW47CisJc2tiLT5sZW4JCSAgPSBsZW47CisJc2tiLT5kYXRhX2xlbgkJICA9IGxlbiAtIHBvczsKKworCWZvciAoaSA9IDA7IGkgPCBuZnJhZ3M7IGkrKykgeworCQlpbnQgc2l6ZSA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZTsKKworCQlpZiAocG9zICsgc2l6ZSA+IGxlbikgeworCQkJc2tiX3NoaW5mbyhza2IxKS0+ZnJhZ3Nba10gPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCisJCQlpZiAocG9zIDwgbGVuKSB7CisJCQkJLyogU3BsaXQgZnJhZy4KKwkJCQkgKiBXZSBoYXZlIHR3byB2YXJpYW50cyBpbiB0aGlzIGNhc2U6CisJCQkJICogMS4gTW92ZSBhbGwgdGhlIGZyYWcgdG8gdGhlIHNlY29uZAorCQkJCSAqICAgIHBhcnQsIGlmIGl0IGlzIHBvc3NpYmxlLiBGLmUuCisJCQkJICogICAgdGhpcyBhcHByb2FjaCBpcyBtYW5kYXRvcnkgZm9yIFRVWCwKKwkJCQkgKiAgICB3aGVyZSBzcGxpdHRpbmcgaXMgZXhwZW5zaXZlLgorCQkJCSAqIDIuIFNwbGl0IGlzIGFjY3VyYXRlbHkuIFdlIG1ha2UgdGhpcy4KKwkJCQkgKi8KKwkJCQlnZXRfcGFnZShza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2UpOworCQkJCXNrYl9zaGluZm8oc2tiMSktPmZyYWdzWzBdLnBhZ2Vfb2Zmc2V0ICs9IGxlbiAtIHBvczsKKwkJCQlza2Jfc2hpbmZvKHNrYjEpLT5mcmFnc1swXS5zaXplIC09IGxlbiAtIHBvczsKKwkJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemUJPSBsZW4gLSBwb3M7CisJCQkJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncysrOworCQkJfQorCQkJaysrOworCQl9IGVsc2UKKwkJCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MrKzsKKwkJcG9zICs9IHNpemU7CisJfQorCXNrYl9zaGluZm8oc2tiMSktPm5yX2ZyYWdzID0gazsKK30KKworLyoqCisgKiBza2Jfc3BsaXQgLSBTcGxpdCBmcmFnbWVudGVkIHNrYiB0byB0d28gcGFydHMgYXQgbGVuZ3RoIGxlbi4KKyAqIEBza2I6IHRoZSBidWZmZXIgdG8gc3BsaXQKKyAqIEBza2IxOiB0aGUgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIHNlY29uZCBwYXJ0CisgKiBAbGVuOiBuZXcgbGVuZ3RoIGZvciBza2IKKyAqLwordm9pZCBza2Jfc3BsaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNrX2J1ZmYgKnNrYjEsIGNvbnN0IHUzMiBsZW4pCit7CisJaW50IHBvcyA9IHNrYl9oZWFkbGVuKHNrYik7CisKKwlpZiAobGVuIDwgcG9zKQkvKiBTcGxpdCBsaW5lIGlzIGluc2lkZSBoZWFkZXIuICovCisJCXNrYl9zcGxpdF9pbnNpZGVfaGVhZGVyKHNrYiwgc2tiMSwgbGVuLCBwb3MpOworCWVsc2UJCS8qIFNlY29uZCBjaHVuayBoYXMgbm8gaGVhZGVyLCBub3RoaW5nIHRvIGNvcHkuICovCisJCXNrYl9zcGxpdF9ub19oZWFkZXIoc2tiLCBza2IxLCBsZW4sIHBvcyk7Cit9CisKK3ZvaWQgX19pbml0IHNrYl9pbml0KHZvaWQpCit7CisJc2tidWZmX2hlYWRfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgic2tidWZmX2hlYWRfY2FjaGUiLAorCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHNrX2J1ZmYpLAorCQkJCQkgICAgICAwLAorCQkJCQkgICAgICBTTEFCX0hXQ0FDSEVfQUxJR04sCisJCQkJCSAgICAgIE5VTEwsIE5VTEwpOworCWlmICghc2tidWZmX2hlYWRfY2FjaGUpCisJCXBhbmljKCJjYW5ub3QgY3JlYXRlIHNrYnVmZiBjYWNoZSIpOworfQorCitFWFBPUlRfU1lNQk9MKF9fX3Bza2JfdHJpbSk7CitFWFBPUlRfU1lNQk9MKF9fa2ZyZWVfc2tiKTsKK0VYUE9SVF9TWU1CT0woX19wc2tiX3B1bGxfdGFpbCk7CitFWFBPUlRfU1lNQk9MKGFsbG9jX3NrYik7CitFWFBPUlRfU1lNQk9MKHBza2JfY29weSk7CitFWFBPUlRfU1lNQk9MKHBza2JfZXhwYW5kX2hlYWQpOworRVhQT1JUX1NZTUJPTChza2JfY2hlY2tzdW0pOworRVhQT1JUX1NZTUJPTChza2JfY2xvbmUpOworRVhQT1JUX1NZTUJPTChza2JfY2xvbmVfZnJhZ2xpc3QpOworRVhQT1JUX1NZTUJPTChza2JfY29weSk7CitFWFBPUlRfU1lNQk9MKHNrYl9jb3B5X2FuZF9jc3VtX2JpdHMpOworRVhQT1JUX1NZTUJPTChza2JfY29weV9hbmRfY3N1bV9kZXYpOworRVhQT1JUX1NZTUJPTChza2JfY29weV9iaXRzKTsKK0VYUE9SVF9TWU1CT0woc2tiX2NvcHlfZXhwYW5kKTsKK0VYUE9SVF9TWU1CT0woc2tiX292ZXJfcGFuaWMpOworRVhQT1JUX1NZTUJPTChza2JfcGFkKTsKK0VYUE9SVF9TWU1CT0woc2tiX3JlYWxsb2NfaGVhZHJvb20pOworRVhQT1JUX1NZTUJPTChza2JfdW5kZXJfcGFuaWMpOworRVhQT1JUX1NZTUJPTChza2JfZGVxdWV1ZSk7CitFWFBPUlRfU1lNQk9MKHNrYl9kZXF1ZXVlX3RhaWwpOworRVhQT1JUX1NZTUJPTChza2JfaW5zZXJ0KTsKK0VYUE9SVF9TWU1CT0woc2tiX3F1ZXVlX3B1cmdlKTsKK0VYUE9SVF9TWU1CT0woc2tiX3F1ZXVlX2hlYWQpOworRVhQT1JUX1NZTUJPTChza2JfcXVldWVfdGFpbCk7CitFWFBPUlRfU1lNQk9MKHNrYl91bmxpbmspOworRVhQT1JUX1NZTUJPTChza2JfYXBwZW5kKTsKK0VYUE9SVF9TWU1CT0woc2tiX3NwbGl0KTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NvY2suYyBiL25ldC9jb3JlL3NvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjlhYjRhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2NvcmUvc29jay5jCkBAIC0wLDAgKzEsMTU2NSBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlHZW5lcmljIHNvY2tldCBzdXBwb3J0IHJvdXRpbmVzLiBNZW1vcnkgYWxsb2NhdG9ycywgc29ja2V0IGxvY2svcmVsZWFzZQorICoJCWhhbmRsZXIgZm9yIHByb3RvY29scyB0byB1c2UgYW5kIGdlbmVyaWMgb3B0aW9uIGhhbmRsZXIuCisgKgorICoKKyAqIFZlcnNpb246CSRJZDogc29jay5jLHYgMS4xMTcgMjAwMi8wMi8wMSAyMjowMTowMyBkYXZlbSBFeHAgJAorICoKKyAqIEF1dGhvcnM6CVJvc3MgQmlybywgPGJpcjdAbGVsYW5kLlN0YW5mb3JkLkVkdT4KKyAqCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCQlGbG9yaWFuIExhIFJvY2hlLCA8ZmxsYUBzdHVkLnVuaS1zYi5kZT4KKyAqCQlBbGFuIENveCwgPEEuQ294QHN3YW5zZWEuYWMudWs+CisgKgorICogRml4ZXM6CisgKgkJQWxhbiBDb3gJOiAJTnVtZXJvdXMgdmVyaWZ5X2FyZWEoKSBwcm9ibGVtcworICoJCUFsYW4gQ294CToJQ29ubmVjdGluZyBvbiBhIGNvbm5lY3Rpbmcgc29ja2V0CisgKgkJCQkJbm93IHJldHVybnMgYW4gZXJyb3IgZm9yIHRjcC4KKyAqCQlBbGFuIENveAk6CXNvY2stPnByb3RvY29sIGlzIHNldCBjb3JyZWN0bHkuCisgKgkJCQkJYW5kIGlzIG5vdCBzb21ldGltZXMgbGVmdCBhcyAwLgorICoJCUFsYW4gQ294CToJY29ubmVjdCBoYW5kbGVzIGljbXAgZXJyb3JzIG9uIGEKKyAqCQkJCQljb25uZWN0IHByb3Blcmx5LiBVbmZvcnR1bmF0ZWx5IHRoZXJlCisgKgkJCQkJaXMgYSByZXN0YXJ0IHN5c2NhbGwgbmFzdHkgdGhlcmUuIEkKKyAqCQkJCQljYW4ndCBtYXRjaCBCU0Qgd2l0aG91dCBoYWNraW5nIHRoZSBDCisgKgkJCQkJbGlicmFyeS4gSWRlYXMgdXJnZW50bHkgc291Z2h0IQorICoJCUFsYW4gQ294CToJRGlzYWxsb3cgYmluZCgpIHRvIGFkZHJlc3NlcyB0aGF0IGFyZQorICoJCQkJCW5vdCBvdXJzIC0gZXNwZWNpYWxseSBicm9hZGNhc3Qgb25lcyEhCisgKgkJQWxhbiBDb3gJOglTb2NrZXQgMTAyNCBfSVNfIG9rIGZvciB1c2Vycy4gKGZlbmNlcG9zdCkKKyAqCQlBbGFuIENveAk6CXNvY2tfd2ZyZWUvc29ja19yZnJlZSBkb24ndCBkZXN0cm95IHNvY2tldHMsCisgKgkJCQkJaW5zdGVhZCB0aGV5IGxlYXZlIHRoYXQgZm9yIHRoZSBERVNUUk9ZIHRpbWVyLgorICoJCUFsYW4gQ294CToJQ2xlYW4gdXAgZXJyb3IgZmxhZyBpbiBhY2NlcHQKKyAqCQlBbGFuIENveAk6CVRDUCBhY2sgaGFuZGxpbmcgaXMgYnVnZ3ksIHRoZSBERVNUUk9ZIHRpbWVyCisgKgkJCQkJd2FzIGJ1Z2d5LiBQdXQgYSByZW1vdmVfc29jaygpIGluIHRoZSBoYW5kbGVyCisgKgkJCQkJZm9yIG1lbW9yeSB3aGVuIHdlIGhpdCAwLiBBbHNvIGFsdGVyZWQgdGhlIHRpbWVyCisgKgkJCQkJY29kZS4gVGhlIEFDSyBzdHVmZiBjYW4gd2FpdCBhbmQgbmVlZHMgbWFqb3IgCisgKgkJCQkJVENQIGxheWVyIHN1cmdlcnkuCisgKgkJQWxhbiBDb3gJOglGaXhlZCBUQ1AgYWNrIGJ1ZywgcmVtb3ZlZCByZW1vdmUgc29jaworICoJCQkJCWFuZCBmaXhlZCB0aW1lci9pbmV0X2JoIHJhY2UuCisgKgkJQWxhbiBDb3gJOglBZGRlZCB6YXBwZWQgZmxhZyBmb3IgVENQCisgKgkJQWxhbiBDb3gJOglNb3ZlIGtmcmVlX3NrYiBpbnRvIHNrYnVmZi5jIGFuZCB0aWRpZWQgdXAgc3VycGx1cyBjb2RlCisgKgkJQWxhbiBDb3gJOglmb3IgbmV3IHNrX2J1ZmYgYWxsb2NhdGlvbnMgd21hbGxvYy9ybWFsbG9jIG5vdyBjYWxsIGFsbG9jX3NrYgorICoJCUFsYW4gQ294CToJa2ZyZWVfcyBjYWxscyBub3cgYXJlIGtmcmVlX3NrYm1lbSBzbyB3ZSBjYW4gdHJhY2sgc2tiIHJlc291cmNlcworICoJCUFsYW4gQ294CToJU3VwcG9ydHMgc29ja2V0IG9wdGlvbiBicm9hZGNhc3Qgbm93IGFzIGRvZXMgdWRwLiBQYWNrZXQgYW5kIHJhdyBuZWVkIGZpeGluZy4KKyAqCQlBbGFuIENveAk6CUFkZGVkIFJDVkJVRixTTkRCVUYgc2l6ZSBzZXR0aW5nLiBJdCBzdWRkZW5seSBvY2N1cnJlZCB0byBtZSBob3cgZWFzeSBpdCB3YXMgc28uLi4KKyAqCQlSaWNrIFNsYWRrZXkJOglSZWxheGVkIFVEUCBydWxlcyBmb3IgbWF0Y2hpbmcgcGFja2V0cy4KKyAqCQlDLkUuSGF3a2lucwk6CUlGRl9QUk9NSVNDL1NJT0NHSFdBRERSIHN1cHBvcnQKKyAqCVBhdWxpbmUgTWlkZGVsaW5rCToJaWRlbnRkIHN1cHBvcnQKKyAqCQlBbGFuIENveAk6CUZpeGVkIGNvbm5lY3QoKSB0YWtpbmcgc2lnbmFscyBJIHRoaW5rLgorICoJCUFsYW4gQ294CToJU09fTElOR0VSIHN1cHBvcnRlZAorICoJCUFsYW4gQ294CToJRXJyb3IgcmVwb3J0aW5nIGZpeGVzCisgKgkJQW5vbnltb3VzCToJaW5ldF9jcmVhdGUgdGlkaWVkIHVwIChzay0+cmV1c2Ugc2V0dGluZykKKyAqCQlBbGFuIENveAk6CWluZXQgc29ja2V0cyBkb24ndCBzZXQgc2stPnR5cGUhCisgKgkJQWxhbiBDb3gJOglTcGxpdCBzb2NrZXQgb3B0aW9uIGNvZGUKKyAqCQlBbGFuIENveAk6CUNhbGxiYWNrcworICoJCUFsYW4gQ294CToJTmFnbGUgZmxhZyBmb3IgQ2hhcmxlcyAmIEpvaGFubmVzIHN0dWZmCisgKgkJQWxleAkJOglSZW1vdmVkIHJlc3RyaWN0aW9uIG9uIGluZXQgZmlvY3RsCisgKgkJQWxhbiBDb3gJOglTcGxpdHRpbmcgSU5FVCBmcm9tIE5FVCBjb3JlCisgKgkJQWxhbiBDb3gJOglGaXhlZCBib2d1cyBTT19UWVBFIGhhbmRsaW5nIGluIGdldHNvY2tvcHQoKQorICoJCUFkYW0gQ2FsZHdlbGwJOglNaXNzaW5nIHJldHVybiBpbiBTT19ET05UUk9VVEUvU09fREVCVUcgY29kZQorICoJCUFsYW4gQ294CToJU3BsaXQgSVAgZnJvbSBnZW5lcmljIGNvZGUKKyAqCQlBbGFuIENveAk6CU5ldyBrZnJlZV9za2JtZW0oKQorICoJCUFsYW4gQ294CToJTWFrZSBTT19ERUJVRyBzdXBlcnVzZXIgb25seS4KKyAqCQlBbGFuIENveAk6CUFsbG93IGFueW9uZSB0byBjbGVhciBTT19ERUJVRworICoJCQkJCShjb21wYXRpYmlsaXR5IGZpeCkKKyAqCQlBbGFuIENveAk6CUFkZGVkIG9wdGltaXN0aWMgbWVtb3J5IGdyYWJiaW5nIGZvciBBRl9VTklYIHRocm91Z2hwdXQuCisgKgkJQWxhbiBDb3gJOglBbGxvY2F0b3IgZm9yIGEgc29ja2V0IGlzIHNldHRhYmxlLgorICoJCUFsYW4gQ294CToJU09fRVJST1IgaW5jbHVkZXMgc29mdCBlcnJvcnMuCisgKgkJQWxhbiBDb3gJOglBbGxvdyBOVUxMIGFyZ3VtZW50cyBvbiBzb21lIFNPXyBvcHRzCisgKgkJQWxhbiBDb3gJOiAJR2VuZXJpYyBzb2NrZXQgYWxsb2NhdGlvbiB0byBtYWtlIGhvb2tzCisgKgkJCQkJZWFzaWVyIChzdWdnZXN0ZWQgYnkgQ3JhaWcgTWV0eikuCisgKgkJTWljaGFlbCBQYWxsCToJU09fRVJST1IgcmV0dXJucyBwb3NpdGl2ZSBlcnJubyBhZ2FpbgorICogICAgICAgICAgICAgIFN0ZXZlIFdoaXRlaG91c2U6ICAgICAgIEFkZGVkIGRlZmF1bHQgZGVzdHJ1Y3RvciB0byBmcmVlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgcHJpdmF0ZSBkYXRhLgorICogICAgICAgICAgICAgIFN0ZXZlIFdoaXRlaG91c2U6ICAgICAgIEFkZGVkIHZhcmlvdXMgb3RoZXIgZGVmYXVsdCByb3V0aW5lcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbiB0byBzZXZlcmFsIHNvY2tldCBmYW1pbGllcy4KKyAqICAgICAgICAgICAgICBDaHJpcyBFdmFucyAgICAgOiAgICAgICBDYWxsIHN1c2VyKCkgY2hlY2sgbGFzdCBvbiBGX1NFVE9XTgorICoJCUpheSBTY2h1bGlzdAk6CUFkZGVkIFNPX0FUVEFDSF9GSUxURVIgYW5kIFNPX0RFVEFDSF9GSUxURVIuCisgKgkJQW5kaSBLbGVlbgk6CUFkZCBzb2NrX2ttYWxsb2MoKS9zb2NrX2tmcmVlX3MoKQorICoJCUFuZGkgS2xlZW4JOglGaXggd3JpdGVfc3BhY2UgY2FsbGJhY2sKKyAqCQlDaHJpcyBFdmFucwk6CVNlY3VyaXR5IGZpeGVzIC0gc2lnbmVkbmVzcyBhZ2FpbgorICoJCUFybmFsZG8gQy4gTWVsbyA6ICAgICAgIGNsZWFudXBzLCB1c2Ugc2tiX3F1ZXVlX3B1cmdlCisgKgorICogVG8gRml4OgorICoKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3hmcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9pcHNlYy5oPgorCisjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CisKKyNpZmRlZiBDT05GSUdfSU5FVAorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNlbmRpZgorCisvKiBUYWtlIGludG8gY29uc2lkZXJhdGlvbiB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0IHNrX2J1ZmYgb3ZlcmhlYWQgaW4gdGhlCisgKiBkZXRlcm1pbmF0aW9uIG9mIHRoZXNlIHZhbHVlcywgc2luY2UgdGhhdCBpcyBub24tY29uc3RhbnQgYWNyb3NzCisgKiBwbGF0Zm9ybXMuICBUaGlzIG1ha2VzIHNvY2tldCBxdWV1ZWluZyBiZWhhdmlvciBhbmQgcGVyZm9ybWFuY2UKKyAqIG5vdCBkZXBlbmQgdXBvbiBzdWNoIGRpZmZlcmVuY2VzLgorICovCisjZGVmaW5lIF9TS19NRU1fUEFDS0VUUwkJMjU2CisjZGVmaW5lIF9TS19NRU1fT1ZFUkhFQUQJKHNpemVvZihzdHJ1Y3Qgc2tfYnVmZikgKyAyNTYpCisjZGVmaW5lIFNLX1dNRU1fTUFYCQkoX1NLX01FTV9PVkVSSEVBRCAqIF9TS19NRU1fUEFDS0VUUykKKyNkZWZpbmUgU0tfUk1FTV9NQVgJCShfU0tfTUVNX09WRVJIRUFEICogX1NLX01FTV9QQUNLRVRTKQorCisvKiBSdW4gdGltZSBhZGp1c3RhYmxlIHBhcmFtZXRlcnMuICovCitfX3UzMiBzeXNjdGxfd21lbV9tYXggPSBTS19XTUVNX01BWDsKK19fdTMyIHN5c2N0bF9ybWVtX21heCA9IFNLX1JNRU1fTUFYOworX191MzIgc3lzY3RsX3dtZW1fZGVmYXVsdCA9IFNLX1dNRU1fTUFYOworX191MzIgc3lzY3RsX3JtZW1fZGVmYXVsdCA9IFNLX1JNRU1fTUFYOworCisvKiBNYXhpbWFsIHNwYWNlIGVhdGVuIGJ5IGlvdmVjIG9yIGFuY2lsbGlhcnkgZGF0YSBwbHVzIHNvbWUgc3BhY2UgKi8KK2ludCBzeXNjdGxfb3B0bWVtX21heCA9IHNpemVvZih1bnNpZ25lZCBsb25nKSooMipVSU9fTUFYSU9WICsgNTEyKTsKKworc3RhdGljIGludCBzb2NrX3NldF90aW1lb3V0KGxvbmcgKnRpbWVvX3AsIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCit7CisJc3RydWN0IHRpbWV2YWwgdHY7CisKKwlpZiAob3B0bGVuIDwgc2l6ZW9mKHR2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZ0diwgb3B0dmFsLCBzaXplb2YodHYpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkqdGltZW9fcCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOworCWlmICh0di50dl9zZWMgPT0gMCAmJiB0di50dl91c2VjID09IDApCisJCXJldHVybiAwOworCWlmICh0di50dl9zZWMgPCAoTUFYX1NDSEVEVUxFX1RJTUVPVVQvSFogLSAxKSkKKwkJKnRpbWVvX3AgPSB0di50dl9zZWMqSFogKyAodHYudHZfdXNlYysoMTAwMDAwMC9IWi0xKSkvKDEwMDAwMDAvSFopOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzb2NrX3dhcm5fb2Jzb2xldGVfYnNkaXNtKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RhdGljIGludCB3YXJuZWQ7CisJc3RhdGljIGNoYXIgd2FybmNvbW1bVEFTS19DT01NX0xFTl07CisJaWYgKHN0cmNtcCh3YXJuY29tbSwgY3VycmVudC0+Y29tbSkgJiYgd2FybmVkIDwgNSkgeyAKKwkJc3RyY3B5KHdhcm5jb21tLCAgY3VycmVudC0+Y29tbSk7IAorCQlwcmludGsoS0VSTl9XQVJOSU5HICJwcm9jZXNzIGAlcycgaXMgdXNpbmcgb2Jzb2xldGUgIgorCQkgICAgICAgIiVzIFNPX0JTRENPTVBBVFxuIiwgd2FybmNvbW0sIG5hbWUpOworCQl3YXJuZWQrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNvY2tfZGlzYWJsZV90aW1lc3RhbXAoc3RydWN0IHNvY2sgKnNrKQorewkKKwlpZiAoc29ja19mbGFnKHNrLCBTT0NLX1RJTUVTVEFNUCkpIHsgCisJCXNvY2tfcmVzZXRfZmxhZyhzaywgU09DS19USU1FU1RBTVApOworCQluZXRfZGlzYWJsZV90aW1lc3RhbXAoKTsKKwl9Cit9CisKKworLyoKKyAqCVRoaXMgaXMgbWVhbnQgZm9yIGFsbCBwcm90b2NvbHMgdG8gdXNlIGFuZCBjb3ZlcnMgZ29pbmdzIG9uCisgKglhdCB0aGUgc29ja2V0IGxldmVsLiBFdmVyeXRoaW5nIGhlcmUgaXMgZ2VuZXJpYy4KKyAqLworCitpbnQgc29ja19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCSAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQoreworCXN0cnVjdCBzb2NrICpzaz1zb2NrLT5zazsKKwlzdHJ1Y3Qgc2tfZmlsdGVyICpmaWx0ZXI7CisJaW50IHZhbDsKKwlpbnQgdmFsYm9vbDsKKwlzdHJ1Y3QgbGluZ2VyIGxpbmc7CisJaW50IHJldCA9IDA7CisJCisJLyoKKwkgKglPcHRpb25zIHdpdGhvdXQgYXJndW1lbnRzCisJICovCisKKyNpZmRlZiBTT19ET05UTElOR0VSCQkvKiBDb21wYXRpYmlsaXR5IGl0ZW0uLi4gKi8KKwlzd2l0Y2ggKG9wdG5hbWUpIHsKKwkJY2FzZSBTT19ET05UTElOR0VSOgorCQkJc29ja19yZXNldF9mbGFnKHNrLCBTT0NLX0xJTkdFUik7CisJCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYJCisJCQorICAJaWYob3B0bGVuPHNpemVvZihpbnQpKQorICAJCXJldHVybigtRUlOVkFMKTsKKyAgCQorCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopb3B0dmFsKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCisgIAl2YWxib29sID0gdmFsPzE6MDsKKworCWxvY2tfc29jayhzayk7CisKKyAgCXN3aXRjaChvcHRuYW1lKSAKKyAgCXsKKwkJY2FzZSBTT19ERUJVRzoJCisJCQlpZih2YWwgJiYgIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQl7CisJCQkJcmV0ID0gLUVBQ0NFUzsKKwkJCX0KKwkJCWVsc2UgaWYgKHZhbGJvb2wpCisJCQkJc29ja19zZXRfZmxhZyhzaywgU09DS19EQkcpOworCQkJZWxzZQorCQkJCXNvY2tfcmVzZXRfZmxhZyhzaywgU09DS19EQkcpOworCQkJYnJlYWs7CisJCWNhc2UgU09fUkVVU0VBRERSOgorCQkJc2stPnNrX3JldXNlID0gdmFsYm9vbDsKKwkJCWJyZWFrOworCQljYXNlIFNPX1RZUEU6CisJCWNhc2UgU09fRVJST1I6CisJCQlyZXQgPSAtRU5PUFJPVE9PUFQ7CisJCSAgCWJyZWFrOworCQljYXNlIFNPX0RPTlRST1VURToKKwkJCWlmICh2YWxib29sKQorCQkJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfTE9DQUxST1VURSk7CisJCQllbHNlCisJCQkJc29ja19yZXNldF9mbGFnKHNrLCBTT0NLX0xPQ0FMUk9VVEUpOworCQkJYnJlYWs7CisJCWNhc2UgU09fQlJPQURDQVNUOgorCQkJc29ja192YWxib29sX2ZsYWcoc2ssIFNPQ0tfQlJPQURDQVNULCB2YWxib29sKTsKKwkJCWJyZWFrOworCQljYXNlIFNPX1NOREJVRjoKKwkJCS8qIERvbid0IGVycm9yIG9uIHRoaXMgQlNEIGRvZXNuJ3QgYW5kIGlmIHlvdSB0aGluaworCQkJICAgYWJvdXQgaXQgdGhpcyBpcyByaWdodC4gT3RoZXJ3aXNlIGFwcHMgaGF2ZSB0bworCQkJICAgcGxheSAnZ3Vlc3MgdGhlIGJpZ2dlc3Qgc2l6ZScgZ2FtZXMuIFJDVkJVRi9TTkRCVUYKKwkJCSAgIGFyZSB0cmVhdGVkIGluIEJTRCBhcyBoaW50cyAqLworCQkJICAgCisJCQlpZiAodmFsID4gc3lzY3RsX3dtZW1fbWF4KQorCQkJCXZhbCA9IHN5c2N0bF93bWVtX21heDsKKworCQkJc2stPnNrX3VzZXJsb2NrcyB8PSBTT0NLX1NOREJVRl9MT0NLOworCQkJaWYgKCh2YWwgKiAyKSA8IFNPQ0tfTUlOX1NOREJVRikKKwkJCQlzay0+c2tfc25kYnVmID0gU09DS19NSU5fU05EQlVGOworCQkJZWxzZQorCQkJCXNrLT5za19zbmRidWYgPSB2YWwgKiAyOworCisJCQkvKgorCQkJICoJV2FrZSB1cCBzZW5kaW5nIHRhc2tzIGlmIHdlCisJCQkgKgl1cHBlZCB0aGUgdmFsdWUuCisJCQkgKi8KKwkJCXNrLT5za193cml0ZV9zcGFjZShzayk7CisJCQlicmVhazsKKworCQljYXNlIFNPX1JDVkJVRjoKKwkJCS8qIERvbid0IGVycm9yIG9uIHRoaXMgQlNEIGRvZXNuJ3QgYW5kIGlmIHlvdSB0aGluaworCQkJICAgYWJvdXQgaXQgdGhpcyBpcyByaWdodC4gT3RoZXJ3aXNlIGFwcHMgaGF2ZSB0bworCQkJICAgcGxheSAnZ3Vlc3MgdGhlIGJpZ2dlc3Qgc2l6ZScgZ2FtZXMuIFJDVkJVRi9TTkRCVUYKKwkJCSAgIGFyZSB0cmVhdGVkIGluIEJTRCBhcyBoaW50cyAqLworCQkJICAKKwkJCWlmICh2YWwgPiBzeXNjdGxfcm1lbV9tYXgpCisJCQkJdmFsID0gc3lzY3RsX3JtZW1fbWF4OworCisJCQlzay0+c2tfdXNlcmxvY2tzIHw9IFNPQ0tfUkNWQlVGX0xPQ0s7CisJCQkvKiBGSVhNRTogaXMgdGhpcyBsb3dlciBib3VuZCB0aGUgcmlnaHQgb25lPyAqLworCQkJaWYgKCh2YWwgKiAyKSA8IFNPQ0tfTUlOX1JDVkJVRikKKwkJCQlzay0+c2tfcmN2YnVmID0gU09DS19NSU5fUkNWQlVGOworCQkJZWxzZQorCQkJCXNrLT5za19yY3ZidWYgPSB2YWwgKiAyOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT19LRUVQQUxJVkU6CisjaWZkZWYgQ09ORklHX0lORVQKKwkJCWlmIChzay0+c2tfcHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApCisJCQkJdGNwX3NldF9rZWVwYWxpdmUoc2ssIHZhbGJvb2wpOworI2VuZGlmCisJCQlzb2NrX3ZhbGJvb2xfZmxhZyhzaywgU09DS19LRUVQT1BFTiwgdmFsYm9vbCk7CisJCQlicmVhazsKKworCSAJY2FzZSBTT19PT0JJTkxJTkU6CisJCQlzb2NrX3ZhbGJvb2xfZmxhZyhzaywgU09DS19VUkdJTkxJTkUsIHZhbGJvb2wpOworCQkJYnJlYWs7CisKKwkgCWNhc2UgU09fTk9fQ0hFQ0s6CisJCQlzay0+c2tfbm9fY2hlY2sgPSB2YWxib29sOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT19QUklPUklUWToKKwkJCWlmICgodmFsID49IDAgJiYgdmFsIDw9IDYpIHx8IGNhcGFibGUoQ0FQX05FVF9BRE1JTikpIAorCQkJCXNrLT5za19wcmlvcml0eSA9IHZhbDsKKwkJCWVsc2UKKwkJCQlyZXQgPSAtRVBFUk07CisJCQlicmVhazsKKworCQljYXNlIFNPX0xJTkdFUjoKKwkJCWlmKG9wdGxlbjxzaXplb2YobGluZykpIHsKKwkJCQlyZXQgPSAtRUlOVkFMOwkvKiAxMDAzLjFnICovCisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJmxpbmcsb3B0dmFsLHNpemVvZihsaW5nKSkpIHsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFsaW5nLmxfb25vZmYpCisJCQkJc29ja19yZXNldF9mbGFnKHNrLCBTT0NLX0xJTkdFUik7CisJCQllbHNlIHsKKyNpZiAoQklUU19QRVJfTE9ORyA9PSAzMikKKwkJCQlpZiAobGluZy5sX2xpbmdlciA+PSBNQVhfU0NIRURVTEVfVElNRU9VVC9IWikKKwkJCQkJc2stPnNrX2xpbmdlcnRpbWUgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwkJCQllbHNlCisjZW5kaWYKKwkJCQkJc2stPnNrX2xpbmdlcnRpbWUgPSBsaW5nLmxfbGluZ2VyICogSFo7CisJCQkJc29ja19zZXRfZmxhZyhzaywgU09DS19MSU5HRVIpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTT19CU0RDT01QQVQ6CisJCQlzb2NrX3dhcm5fb2Jzb2xldGVfYnNkaXNtKCJzZXRzb2Nrb3B0Iik7CisJCQlicmVhazsKKworCQljYXNlIFNPX1BBU1NDUkVEOgorCQkJaWYgKHZhbGJvb2wpCisJCQkJc2V0X2JpdChTT0NLX1BBU1NDUkVELCAmc29jay0+ZmxhZ3MpOworCQkJZWxzZQorCQkJCWNsZWFyX2JpdChTT0NLX1BBU1NDUkVELCAmc29jay0+ZmxhZ3MpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT19USU1FU1RBTVA6CisJCQlpZiAodmFsYm9vbCkgIHsKKwkJCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX1JDVlRTVEFNUCk7CisJCQkJc29ja19lbmFibGVfdGltZXN0YW1wKHNrKTsKKwkJCX0gZWxzZQorCQkJCXNvY2tfcmVzZXRfZmxhZyhzaywgU09DS19SQ1ZUU1RBTVApOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT19SQ1ZMT1dBVDoKKwkJCWlmICh2YWwgPCAwKQorCQkJCXZhbCA9IElOVF9NQVg7CisJCQlzay0+c2tfcmN2bG93YXQgPSB2YWwgPyA6IDE7CisJCQlicmVhazsKKworCQljYXNlIFNPX1JDVlRJTUVPOgorCQkJcmV0ID0gc29ja19zZXRfdGltZW91dCgmc2stPnNrX3JjdnRpbWVvLCBvcHR2YWwsIG9wdGxlbik7CisJCQlicmVhazsKKworCQljYXNlIFNPX1NORFRJTUVPOgorCQkJcmV0ID0gc29ja19zZXRfdGltZW91dCgmc2stPnNrX3NuZHRpbWVvLCBvcHR2YWwsIG9wdGxlbik7CisJCQlicmVhazsKKworI2lmZGVmIENPTkZJR19ORVRERVZJQ0VTCisJCWNhc2UgU09fQklORFRPREVWSUNFOgorCQl7CisJCQljaGFyIGRldm5hbWVbSUZOQU1TSVpdOyAKKworCQkJLyogU29ycnkuLi4gKi8gCisJCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9SQVcpKSB7CisJCQkJcmV0ID0gLUVQRVJNOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBCaW5kIHRoaXMgc29ja2V0IHRvIGEgcGFydGljdWxhciBkZXZpY2UgbGlrZSAiZXRoMCIsCisJCQkgKiBhcyBzcGVjaWZpZWQgaW4gdGhlIHBhc3NlZCBpbnRlcmZhY2UgbmFtZS4gSWYgdGhlCisJCQkgKiBuYW1lIGlzICIiIG9yIHRoZSBvcHRpb24gbGVuZ3RoIGlzIHplcm8gdGhlIHNvY2tldCAKKwkJCSAqIGlzIG5vdCBib3VuZC4gCisJCQkgKi8gCisKKwkJCWlmICghdmFsYm9vbCkgeworCQkJCXNrLT5za19ib3VuZF9kZXZfaWYgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlpZiAob3B0bGVuID4gSUZOQU1TSVopIAorCQkJCQlvcHRsZW4gPSBJRk5BTVNJWjsgCisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRldm5hbWUsIG9wdHZhbCwgb3B0bGVuKSkgeworCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvKiBSZW1vdmUgYW55IGNhY2hlZCByb3V0ZSBmb3IgdGhpcyBzb2NrZXQuICovCisJCQkJc2tfZHN0X3Jlc2V0KHNrKTsKKworCQkJCWlmIChkZXZuYW1lWzBdID09ICdcMCcpIHsKKwkJCQkJc2stPnNrX2JvdW5kX2Rldl9pZiA9IDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9nZXRfYnlfbmFtZShkZXZuYW1lKTsKKwkJCQkJaWYgKCFkZXYpIHsKKwkJCQkJCXJldCA9IC1FTk9ERVY7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlzay0+c2tfYm91bmRfZGV2X2lmID0gZGV2LT5pZmluZGV4OworCQkJCQlkZXZfcHV0KGRldik7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCisKKwkJY2FzZSBTT19BVFRBQ0hfRklMVEVSOgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWlmIChvcHRsZW4gPT0gc2l6ZW9mKHN0cnVjdCBzb2NrX2Zwcm9nKSkgeworCQkJCXN0cnVjdCBzb2NrX2Zwcm9nIGZwcm9nOworCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIoJmZwcm9nLCBvcHR2YWwsIHNpemVvZihmcHJvZykpKQorCQkJCQlicmVhazsKKworCQkJCXJldCA9IHNrX2F0dGFjaF9maWx0ZXIoJmZwcm9nLCBzayk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNPX0RFVEFDSF9GSUxURVI6CisJCQlzcGluX2xvY2tfYmgoJnNrLT5za19sb2NrLnNsb2NrKTsKKwkJCWZpbHRlciA9IHNrLT5za19maWx0ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyKSB7CisJCQkJc2stPnNrX2ZpbHRlciA9IE5VTEw7CisJCQkJc3Bpbl91bmxvY2tfYmgoJnNrLT5za19sb2NrLnNsb2NrKTsKKwkJCQlza19maWx0ZXJfcmVsZWFzZShzaywgZmlsdGVyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2JoKCZzay0+c2tfbG9jay5zbG9jayk7CisJCQlyZXQgPSAtRU5PTkVUOworCQkJYnJlYWs7CisKKwkJLyogV2UgaW1wbGVtZW50IHRoZSBTT19TTkRMT1dBVCBldGMgdG8KKwkJICAgbm90IGJlIHNldHRhYmxlICgxMDAzLjFnIDUuMykgKi8KKwkJZGVmYXVsdDoKKwkJICAJcmV0ID0gLUVOT1BST1RPT1BUOworCQkJYnJlYWs7CisgIAl9CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gcmV0OworfQorCisKK2ludCBzb2NrX2dldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwkKKwl1bmlvbgorCXsKKyAgCQlpbnQgdmFsOworICAJCXN0cnVjdCBsaW5nZXIgbGluZzsKKwkJc3RydWN0IHRpbWV2YWwgdG07CisJfSB2OworCQorCXVuc2lnbmVkIGludCBsdiA9IHNpemVvZihpbnQpOworCWludCBsZW47CisgIAkKKyAgCWlmKGdldF91c2VyKGxlbixvcHRsZW4pKQorICAJCXJldHVybiAtRUZBVUxUOworCWlmKGxlbiA8IDApCisJCXJldHVybiAtRUlOVkFMOworCQkKKyAgCXN3aXRjaChvcHRuYW1lKSAKKyAgCXsKKwkJY2FzZSBTT19ERUJVRzoJCQorCQkJdi52YWwgPSBzb2NrX2ZsYWcoc2ssIFNPQ0tfREJHKTsKKwkJCWJyZWFrOworCQkKKwkJY2FzZSBTT19ET05UUk9VVEU6CisJCQl2LnZhbCA9IHNvY2tfZmxhZyhzaywgU09DS19MT0NBTFJPVVRFKTsKKwkJCWJyZWFrOworCQkKKwkJY2FzZSBTT19CUk9BRENBU1Q6CisJCQl2LnZhbCA9ICEhc29ja19mbGFnKHNrLCBTT0NLX0JST0FEQ0FTVCk7CisJCQlicmVhazsKKworCQljYXNlIFNPX1NOREJVRjoKKwkJCXYudmFsID0gc2stPnNrX3NuZGJ1ZjsKKwkJCWJyZWFrOworCQkKKwkJY2FzZSBTT19SQ1ZCVUY6CisJCQl2LnZhbCA9IHNrLT5za19yY3ZidWY7CisJCQlicmVhazsKKworCQljYXNlIFNPX1JFVVNFQUREUjoKKwkJCXYudmFsID0gc2stPnNrX3JldXNlOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT19LRUVQQUxJVkU6CisJCQl2LnZhbCA9ICEhc29ja19mbGFnKHNrLCBTT0NLX0tFRVBPUEVOKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU09fVFlQRToKKwkJCXYudmFsID0gc2stPnNrX3R5cGU7CQkgIAkJCisJCQlicmVhazsKKworCQljYXNlIFNPX0VSUk9SOgorCQkJdi52YWwgPSAtc29ja19lcnJvcihzayk7CisJCQlpZih2LnZhbD09MCkKKwkJCQl2LnZhbCA9IHhjaGcoJnNrLT5za19lcnJfc29mdCwgMCk7CisJCQlicmVhazsKKworCQljYXNlIFNPX09PQklOTElORToKKwkJCXYudmFsID0gISFzb2NrX2ZsYWcoc2ssIFNPQ0tfVVJHSU5MSU5FKTsKKwkJCWJyZWFrOworCQorCQljYXNlIFNPX05PX0NIRUNLOgorCQkJdi52YWwgPSBzay0+c2tfbm9fY2hlY2s7CisJCQlicmVhazsKKworCQljYXNlIFNPX1BSSU9SSVRZOgorCQkJdi52YWwgPSBzay0+c2tfcHJpb3JpdHk7CisJCQlicmVhazsKKwkJCisJCWNhc2UgU09fTElOR0VSOgkKKwkJCWx2CQk9IHNpemVvZih2LmxpbmcpOworCQkJdi5saW5nLmxfb25vZmYJPSAhIXNvY2tfZmxhZyhzaywgU09DS19MSU5HRVIpOworIAkJCXYubGluZy5sX2xpbmdlcgk9IHNrLT5za19saW5nZXJ0aW1lIC8gSFo7CisJCQlicmVhazsKKwkJCQkJCisJCWNhc2UgU09fQlNEQ09NUEFUOgorCQkJc29ja193YXJuX29ic29sZXRlX2JzZGlzbSgiZ2V0c29ja29wdCIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT19USU1FU1RBTVA6CisJCQl2LnZhbCA9IHNvY2tfZmxhZyhzaywgU09DS19SQ1ZUU1RBTVApOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT19SQ1ZUSU1FTzoKKwkJCWx2PXNpemVvZihzdHJ1Y3QgdGltZXZhbCk7CisJCQlpZiAoc2stPnNrX3JjdnRpbWVvID09IE1BWF9TQ0hFRFVMRV9USU1FT1VUKSB7CisJCQkJdi50bS50dl9zZWMgPSAwOworCQkJCXYudG0udHZfdXNlYyA9IDA7CisJCQl9IGVsc2UgeworCQkJCXYudG0udHZfc2VjID0gc2stPnNrX3JjdnRpbWVvIC8gSFo7CisJCQkJdi50bS50dl91c2VjID0gKChzay0+c2tfcmN2dGltZW8gJSBIWikgKiAxMDAwMDAwKSAvIEhaOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTT19TTkRUSU1FTzoKKwkJCWx2PXNpemVvZihzdHJ1Y3QgdGltZXZhbCk7CisJCQlpZiAoc2stPnNrX3NuZHRpbWVvID09IE1BWF9TQ0hFRFVMRV9USU1FT1VUKSB7CisJCQkJdi50bS50dl9zZWMgPSAwOworCQkJCXYudG0udHZfdXNlYyA9IDA7CisJCQl9IGVsc2UgeworCQkJCXYudG0udHZfc2VjID0gc2stPnNrX3NuZHRpbWVvIC8gSFo7CisJCQkJdi50bS50dl91c2VjID0gKChzay0+c2tfc25kdGltZW8gJSBIWikgKiAxMDAwMDAwKSAvIEhaOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTT19SQ1ZMT1dBVDoKKwkJCXYudmFsID0gc2stPnNrX3Jjdmxvd2F0OworCQkJYnJlYWs7CisKKwkJY2FzZSBTT19TTkRMT1dBVDoKKwkJCXYudmFsPTE7CisJCQlicmVhazsgCisKKwkJY2FzZSBTT19QQVNTQ1JFRDoKKwkJCXYudmFsID0gdGVzdF9iaXQoU09DS19QQVNTQ1JFRCwgJnNvY2stPmZsYWdzKSA/IDEgOiAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT19QRUVSQ1JFRDoKKwkJCWlmIChsZW4gPiBzaXplb2Yoc2stPnNrX3BlZXJjcmVkKSkKKwkJCQlsZW4gPSBzaXplb2Yoc2stPnNrX3BlZXJjcmVkKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAmc2stPnNrX3BlZXJjcmVkLCBsZW4pKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJZ290byBsZW5vdXQ7CisKKwkJY2FzZSBTT19QRUVSTkFNRToKKwkJeworCQkJY2hhciBhZGRyZXNzWzEyOF07CisKKwkJCWlmIChzb2NrLT5vcHMtPmdldG5hbWUoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKWFkZHJlc3MsICZsdiwgMikpCisJCQkJcmV0dXJuIC1FTk9UQ09OTjsKKwkJCWlmIChsdiA8IGxlbikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCBhZGRyZXNzLCBsZW4pKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJZ290byBsZW5vdXQ7CisJCX0KKworCQkvKiBEdWJpb3VzIEJTRCB0aGluZy4uLiBQcm9iYWJseSBub2JvZHkgZXZlbiB1c2VzIGl0LCBidXQKKwkJICogdGhlIFVOSVggc3RhbmRhcmQgd2FudHMgaXQgZm9yIHdoYXRldmVyIHJlYXNvbi4uLiAtRGF2ZU0KKwkJICovCisJCWNhc2UgU09fQUNDRVBUQ09OTjoKKwkJCXYudmFsID0gc2stPnNrX3N0YXRlID09IFRDUF9MSVNURU47CisJCQlicmVhazsKKworCQljYXNlIFNPX1BFRVJTRUM6CisJCQlyZXR1cm4gc2VjdXJpdHlfc29ja2V0X2dldHBlZXJzZWMoc29jaywgb3B0dmFsLCBvcHRsZW4sIGxlbik7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybigtRU5PUFJPVE9PUFQpOworCX0KKwlpZiAobGVuID4gbHYpCisJCWxlbiA9IGx2OworCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAmdiwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CitsZW5vdXQ6CisgIAlpZiAocHV0X3VzZXIobGVuLCBvcHRsZW4pKQorICAJCXJldHVybiAtRUZBVUxUOworICAJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJc2tfYWxsb2MgLSBBbGwgc29ja2V0IG9iamVjdHMgYXJlIGFsbG9jYXRlZCBoZXJlCisgKglAZmFtaWx5IC0gcHJvdG9jb2wgZmFtaWx5CisgKglAcHJpb3JpdHkgLSBmb3IgYWxsb2NhdGlvbiAoJUdGUF9LRVJORUwsICVHRlBfQVRPTUlDLCBldGMpCisgKglAcHJvdCAtIHN0cnVjdCBwcm90byBhc3NvY2lhdGVkIHdpdGggdGhpcyBuZXcgc29jayBpbnN0YW5jZQorICoJQHplcm9faXQgLSBpZiB3ZSBzaG91bGQgemVybyB0aGUgbmV3bHkgYWxsb2NhdGVkIHNvY2sKKyAqLworc3RydWN0IHNvY2sgKnNrX2FsbG9jKGludCBmYW1pbHksIGludCBwcmlvcml0eSwgc3RydWN0IHByb3RvICpwcm90LCBpbnQgemVyb19pdCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBOVUxMOworCWttZW1fY2FjaGVfdCAqc2xhYiA9IHByb3QtPnNsYWI7CisKKwlpZiAoc2xhYiAhPSBOVUxMKQorCQlzayA9IGttZW1fY2FjaGVfYWxsb2Moc2xhYiwgcHJpb3JpdHkpOworCWVsc2UKKwkJc2sgPSBrbWFsbG9jKHByb3QtPm9ial9zaXplLCBwcmlvcml0eSk7CisKKwlpZiAoc2spIHsKKwkJaWYgKHplcm9faXQpIHsKKwkJCW1lbXNldChzaywgMCwgcHJvdC0+b2JqX3NpemUpOworCQkJc2stPnNrX2ZhbWlseSA9IGZhbWlseTsKKwkJCXNrLT5za19wcm90ID0gcHJvdDsKKwkJCXNvY2tfbG9ja19pbml0KHNrKTsKKwkJfQorCQkKKwkJaWYgKHNlY3VyaXR5X3NrX2FsbG9jKHNrLCBmYW1pbHksIHByaW9yaXR5KSkgeworCQkJa21lbV9jYWNoZV9mcmVlKHNsYWIsIHNrKTsKKwkJCXNrID0gTlVMTDsKKwkJfSBlbHNlCisJCQlfX21vZHVsZV9nZXQocHJvdC0+b3duZXIpOworCX0KKwlyZXR1cm4gc2s7Cit9CisKK3ZvaWQgc2tfZnJlZShzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHNrX2ZpbHRlciAqZmlsdGVyOworCXN0cnVjdCBtb2R1bGUgKm93bmVyID0gc2stPnNrX3Byb3QtPm93bmVyOworCisJaWYgKHNrLT5za19kZXN0cnVjdCkKKwkJc2stPnNrX2Rlc3RydWN0KHNrKTsKKworCWZpbHRlciA9IHNrLT5za19maWx0ZXI7CisJaWYgKGZpbHRlcikgeworCQlza19maWx0ZXJfcmVsZWFzZShzaywgZmlsdGVyKTsKKwkJc2stPnNrX2ZpbHRlciA9IE5VTEw7CisJfQorCisJc29ja19kaXNhYmxlX3RpbWVzdGFtcChzayk7CisKKwlpZiAoYXRvbWljX3JlYWQoJnNrLT5za19vbWVtX2FsbG9jKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBvcHRtZW0gbGVha2FnZSAoJWQgYnl0ZXMpIGRldGVjdGVkLlxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgYXRvbWljX3JlYWQoJnNrLT5za19vbWVtX2FsbG9jKSk7CisKKwlzZWN1cml0eV9za19mcmVlKHNrKTsKKwlpZiAoc2stPnNrX3Byb3QtPnNsYWIgIT0gTlVMTCkKKwkJa21lbV9jYWNoZV9mcmVlKHNrLT5za19wcm90LT5zbGFiLCBzayk7CisJZWxzZQorCQlrZnJlZShzayk7CisJbW9kdWxlX3B1dChvd25lcik7Cit9CisKK3ZvaWQgX19pbml0IHNrX2luaXQodm9pZCkKK3sKKwlpZiAobnVtX3BoeXNwYWdlcyA8PSA0MDk2KSB7CisJCXN5c2N0bF93bWVtX21heCA9IDMyNzY3OworCQlzeXNjdGxfcm1lbV9tYXggPSAzMjc2NzsKKwkJc3lzY3RsX3dtZW1fZGVmYXVsdCA9IDMyNzY3OworCQlzeXNjdGxfcm1lbV9kZWZhdWx0ID0gMzI3Njc7CisJfSBlbHNlIGlmIChudW1fcGh5c3BhZ2VzID49IDEzMTA3MikgeworCQlzeXNjdGxfd21lbV9tYXggPSAxMzEwNzE7CisJCXN5c2N0bF9ybWVtX21heCA9IDEzMTA3MTsKKwl9Cit9CisKKy8qCisgKglTaW1wbGUgcmVzb3VyY2UgbWFuYWdlcnMgZm9yIHNvY2tldHMuCisgKi8KKworCisvKiAKKyAqIFdyaXRlIGJ1ZmZlciBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2FsbGVkIGZyb20ga2ZyZWVfc2tiLiAKKyAqLwordm9pZCBzb2NrX3dmcmVlKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc2tiLT5zazsKKworCS8qIEluIGNhc2UgaXQgbWlnaHQgYmUgd2FpdGluZyBmb3IgbW9yZSBtZW1vcnkuICovCisJYXRvbWljX3N1Yihza2ItPnRydWVzaXplLCAmc2stPnNrX3dtZW1fYWxsb2MpOworCWlmICghc29ja19mbGFnKHNrLCBTT0NLX1VTRV9XUklURV9RVUVVRSkpCisJCXNrLT5za193cml0ZV9zcGFjZShzayk7CisJc29ja19wdXQoc2spOworfQorCisvKiAKKyAqIFJlYWQgYnVmZmVyIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjYWxsZWQgZnJvbSBrZnJlZV9za2IuIAorICovCit2b2lkIHNvY2tfcmZyZWUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBza2ItPnNrOworCisJYXRvbWljX3N1Yihza2ItPnRydWVzaXplLCAmc2stPnNrX3JtZW1fYWxsb2MpOworfQorCisKK2ludCBzb2NrX2lfdWlkKHN0cnVjdCBzb2NrICpzaykKK3sKKwlpbnQgdWlkOworCisJcmVhZF9sb2NrKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CisJdWlkID0gc2stPnNrX3NvY2tldCA/IFNPQ0tfSU5PREUoc2stPnNrX3NvY2tldCktPmlfdWlkIDogMDsKKwlyZWFkX3VubG9jaygmc2stPnNrX2NhbGxiYWNrX2xvY2spOworCXJldHVybiB1aWQ7Cit9CisKK3Vuc2lnbmVkIGxvbmcgc29ja19pX2lubyhzdHJ1Y3Qgc29jayAqc2spCit7CisJdW5zaWduZWQgbG9uZyBpbm87CisKKwlyZWFkX2xvY2soJnNrLT5za19jYWxsYmFja19sb2NrKTsKKwlpbm8gPSBzay0+c2tfc29ja2V0ID8gU09DS19JTk9ERShzay0+c2tfc29ja2V0KS0+aV9pbm8gOiAwOworCXJlYWRfdW5sb2NrKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CisJcmV0dXJuIGlubzsKK30KKworLyoKKyAqIEFsbG9jYXRlIGEgc2tiIGZyb20gdGhlIHNvY2tldCdzIHNlbmQgYnVmZmVyLgorICovCitzdHJ1Y3Qgc2tfYnVmZiAqc29ja193bWFsbG9jKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgZm9yY2UsIGludCBwcmlvcml0eSkKK3sKKwlpZiAoZm9yY2UgfHwgYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKSA8IHNrLT5za19zbmRidWYpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKiBza2IgPSBhbGxvY19za2Ioc2l6ZSwgcHJpb3JpdHkpOworCQlpZiAoc2tiKSB7CisJCQlza2Jfc2V0X293bmVyX3coc2tiLCBzayk7CisJCQlyZXR1cm4gc2tiOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogQWxsb2NhdGUgYSBza2IgZnJvbSB0aGUgc29ja2V0J3MgcmVjZWl2ZSBidWZmZXIuCisgKi8gCitzdHJ1Y3Qgc2tfYnVmZiAqc29ja19ybWFsbG9jKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgZm9yY2UsIGludCBwcmlvcml0eSkKK3sKKwlpZiAoZm9yY2UgfHwgYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSA8IHNrLT5za19yY3ZidWYpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFsbG9jX3NrYihzaXplLCBwcmlvcml0eSk7CisJCWlmIChza2IpIHsKKwkJCXNrYl9zZXRfb3duZXJfcihza2IsIHNrKTsKKwkJCXJldHVybiBza2I7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIAorICogQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgZnJvbSB0aGUgc29ja2V0J3Mgb3B0aW9uIG1lbW9yeSBidWZmZXIuCisgKi8gCit2b2lkICpzb2NrX2ttYWxsb2Moc3RydWN0IHNvY2sgKnNrLCBpbnQgc2l6ZSwgaW50IHByaW9yaXR5KQoreworCWlmICgodW5zaWduZWQpc2l6ZSA8PSBzeXNjdGxfb3B0bWVtX21heCAmJgorCSAgICBhdG9taWNfcmVhZCgmc2stPnNrX29tZW1fYWxsb2MpICsgc2l6ZSA8IHN5c2N0bF9vcHRtZW1fbWF4KSB7CisJCXZvaWQgKm1lbTsKKwkJLyogRmlyc3QgZG8gdGhlIGFkZCwgdG8gYXZvaWQgdGhlIHJhY2UgaWYga21hbGxvYworIAkJICogbWlnaHQgc2xlZXAuCisJCSAqLworCQlhdG9taWNfYWRkKHNpemUsICZzay0+c2tfb21lbV9hbGxvYyk7CisJCW1lbSA9IGttYWxsb2Moc2l6ZSwgcHJpb3JpdHkpOworCQlpZiAobWVtKQorCQkJcmV0dXJuIG1lbTsKKwkJYXRvbWljX3N1YihzaXplLCAmc2stPnNrX29tZW1fYWxsb2MpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEZyZWUgYW4gb3B0aW9uIG1lbW9yeSBibG9jay4KKyAqLwordm9pZCBzb2NrX2tmcmVlX3Moc3RydWN0IHNvY2sgKnNrLCB2b2lkICptZW0sIGludCBzaXplKQoreworCWtmcmVlKG1lbSk7CisJYXRvbWljX3N1YihzaXplLCAmc2stPnNrX29tZW1fYWxsb2MpOworfQorCisvKiBJdCBpcyBhbG1vc3Qgd2FpdF9mb3JfdGNwX21lbW9yeSBtaW51cyByZWxlYXNlX3NvY2svbG9ja19zb2NrLgorICAgSSB0aGluaywgdGhlc2UgbG9ja3Mgc2hvdWxkIGJlIHJlbW92ZWQgZm9yIGRhdGFncmFtIHNvY2tldHMuCisgKi8KK3N0YXRpYyBsb25nIHNvY2tfd2FpdF9mb3Jfd21lbShzdHJ1Y3Qgc29jayAqIHNrLCBsb25nIHRpbWVvKQoreworCURFRklORV9XQUlUKHdhaXQpOworCisJY2xlYXJfYml0KFNPQ0tfQVNZTkNfTk9TUEFDRSwgJnNrLT5za19zb2NrZXQtPmZsYWdzKTsKKwlmb3IgKDs7KSB7CisJCWlmICghdGltZW8pCisJCQlicmVhazsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisJCXNldF9iaXQoU09DS19OT1NQQUNFLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOworCQlwcmVwYXJlX3RvX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYykgPCBzay0+c2tfc25kYnVmKQorCQkJYnJlYWs7CisJCWlmIChzay0+c2tfc2h1dGRvd24gJiBTRU5EX1NIVVRET1dOKQorCQkJYnJlYWs7CisJCWlmIChzay0+c2tfZXJyKQorCQkJYnJlYWs7CisJCXRpbWVvID0gc2NoZWR1bGVfdGltZW91dCh0aW1lbyk7CisJfQorCWZpbmlzaF93YWl0KHNrLT5za19zbGVlcCwgJndhaXQpOworCXJldHVybiB0aW1lbzsKK30KKworCisvKgorICoJR2VuZXJpYyBzZW5kL3JlY2VpdmUgYnVmZmVyIGhhbmRsZXJzCisgKi8KKworc3RhdGljIHN0cnVjdCBza19idWZmICpzb2NrX2FsbG9jX3NlbmRfcHNrYihzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIGhlYWRlcl9sZW4sCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIGRhdGFfbGVuLAorCQkJCQkgICAgaW50IG5vYmxvY2ssIGludCAqZXJyY29kZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGludCBnZnBfbWFzazsKKwlsb25nIHRpbWVvOworCWludCBlcnI7CisKKwlnZnBfbWFzayA9IHNrLT5za19hbGxvY2F0aW9uOworCWlmIChnZnBfbWFzayAmIF9fR0ZQX1dBSVQpCisJCWdmcF9tYXNrIHw9IF9fR0ZQX1JFUEVBVDsKKworCXRpbWVvID0gc29ja19zbmR0aW1lbyhzaywgbm9ibG9jayk7CisJd2hpbGUgKDEpIHsKKwkJZXJyID0gc29ja19lcnJvcihzayk7CisJCWlmIChlcnIgIT0gMCkKKwkJCWdvdG8gZmFpbHVyZTsKKworCQllcnIgPSAtRVBJUEU7CisJCWlmIChzay0+c2tfc2h1dGRvd24gJiBTRU5EX1NIVVRET1dOKQorCQkJZ290byBmYWlsdXJlOworCisJCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpIDwgc2stPnNrX3NuZGJ1ZikgeworCQkJc2tiID0gYWxsb2Nfc2tiKGhlYWRlcl9sZW4sIHNrLT5za19hbGxvY2F0aW9uKTsKKwkJCWlmIChza2IpIHsKKwkJCQlpbnQgbnBhZ2VzOworCQkJCWludCBpOworCisJCQkJLyogTm8gcGFnZXMsIHdlJ3JlIGRvbmUuLi4gKi8KKwkJCQlpZiAoIWRhdGFfbGVuKQorCQkJCQlicmVhazsKKworCQkJCW5wYWdlcyA9IChkYXRhX2xlbiArIChQQUdFX1NJWkUgLSAxKSkgPj4gUEFHRV9TSElGVDsKKwkJCQlza2ItPnRydWVzaXplICs9IGRhdGFfbGVuOworCQkJCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPSBucGFnZXM7CisJCQkJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrKSB7CisJCQkJCXN0cnVjdCBwYWdlICpwYWdlOworCQkJCQlza2JfZnJhZ190ICpmcmFnOworCisJCQkJCXBhZ2UgPSBhbGxvY19wYWdlcyhzay0+c2tfYWxsb2NhdGlvbiwgMCk7CisJCQkJCWlmICghcGFnZSkgeworCQkJCQkJZXJyID0gLUVOT0JVRlM7CisJCQkJCQlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID0gaTsKKwkJCQkJCWtmcmVlX3NrYihza2IpOworCQkJCQkJZ290byBmYWlsdXJlOworCQkJCQl9CisKKwkJCQkJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCQkJCQlmcmFnLT5wYWdlID0gcGFnZTsKKwkJCQkJZnJhZy0+cGFnZV9vZmZzZXQgPSAwOworCQkJCQlmcmFnLT5zaXplID0gKGRhdGFfbGVuID49IFBBR0VfU0laRSA/CisJCQkJCQkgICAgICBQQUdFX1NJWkUgOgorCQkJCQkJICAgICAgZGF0YV9sZW4pOworCQkJCQlkYXRhX2xlbiAtPSBQQUdFX1NJWkU7CisJCQkJfQorCisJCQkJLyogRnVsbCBzdWNjZXNzLi4uICovCisJCQkJYnJlYWs7CisJCQl9CisJCQllcnIgPSAtRU5PQlVGUzsKKwkJCWdvdG8gZmFpbHVyZTsKKwkJfQorCQlzZXRfYml0KFNPQ0tfQVNZTkNfTk9TUEFDRSwgJnNrLT5za19zb2NrZXQtPmZsYWdzKTsKKwkJc2V0X2JpdChTT0NLX05PU1BBQ0UsICZzay0+c2tfc29ja2V0LT5mbGFncyk7CisJCWVyciA9IC1FQUdBSU47CisJCWlmICghdGltZW8pCisJCQlnb3RvIGZhaWx1cmU7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWdvdG8gaW50ZXJydXB0ZWQ7CisJCXRpbWVvID0gc29ja193YWl0X2Zvcl93bWVtKHNrLCB0aW1lbyk7CisJfQorCisJc2tiX3NldF9vd25lcl93KHNrYiwgc2spOworCXJldHVybiBza2I7CisKK2ludGVycnVwdGVkOgorCWVyciA9IHNvY2tfaW50cl9lcnJubyh0aW1lbyk7CitmYWlsdXJlOgorCSplcnJjb2RlID0gZXJyOworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3Qgc2tfYnVmZiAqc29ja19hbGxvY19zZW5kX3NrYihzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGxvbmcgc2l6ZSwgCisJCQkJICAgIGludCBub2Jsb2NrLCBpbnQgKmVycmNvZGUpCit7CisJcmV0dXJuIHNvY2tfYWxsb2Nfc2VuZF9wc2tiKHNrLCBzaXplLCAwLCBub2Jsb2NrLCBlcnJjb2RlKTsKK30KKworc3RhdGljIHZvaWQgX19sb2NrX3NvY2soc3RydWN0IHNvY2sgKnNrKQoreworCURFRklORV9XQUlUKHdhaXQpOworCisJZm9yKDs7KSB7CisJCXByZXBhcmVfdG9fd2FpdF9leGNsdXNpdmUoJnNrLT5za19sb2NrLndxLCAmd2FpdCwKKwkJCQkJVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19iaCgmc2stPnNrX2xvY2suc2xvY2spOworCQlzY2hlZHVsZSgpOworCQlzcGluX2xvY2tfYmgoJnNrLT5za19sb2NrLnNsb2NrKTsKKwkJaWYoIXNvY2tfb3duZWRfYnlfdXNlcihzaykpCisJCQlicmVhazsKKwl9CisJZmluaXNoX3dhaXQoJnNrLT5za19sb2NrLndxLCAmd2FpdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fcmVsZWFzZV9zb2NrKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2stPnNrX2JhY2tsb2cuaGVhZDsKKworCWRvIHsKKwkJc2stPnNrX2JhY2tsb2cuaGVhZCA9IHNrLT5za19iYWNrbG9nLnRhaWwgPSBOVUxMOworCQliaF91bmxvY2tfc29jayhzayk7CisKKwkJZG8geworCQkJc3RydWN0IHNrX2J1ZmYgKm5leHQgPSBza2ItPm5leHQ7CisKKwkJCXNrYi0+bmV4dCA9IE5VTEw7CisJCQlzay0+c2tfYmFja2xvZ19yY3Yoc2ssIHNrYik7CisKKwkJCS8qCisJCQkgKiBXZSBhcmUgaW4gcHJvY2VzcyBjb250ZXh0IGhlcmUgd2l0aCBzb2Z0aXJxcworCQkJICogZGlzYWJsZWQsIHVzZSBjb25kX3Jlc2NoZWRfc29mdGlycSgpIHRvIHByZWVtcHQuCisJCQkgKiBUaGlzIGlzIHNhZmUgdG8gZG8gYmVjYXVzZSB3ZSd2ZSB0YWtlbiB0aGUgYmFja2xvZworCQkJICogcXVldWUgcHJpdmF0ZToKKwkJCSAqLworCQkJY29uZF9yZXNjaGVkX3NvZnRpcnEoKTsKKworCQkJc2tiID0gbmV4dDsKKwkJfSB3aGlsZSAoc2tiICE9IE5VTEwpOworCisJCWJoX2xvY2tfc29jayhzayk7CisJfSB3aGlsZSgoc2tiID0gc2stPnNrX2JhY2tsb2cuaGVhZCkgIT0gTlVMTCk7Cit9CisKKy8qKgorICogc2tfd2FpdF9kYXRhIC0gd2FpdCBmb3IgZGF0YSB0byBhcnJpdmUgYXQgc2tfcmVjZWl2ZV9xdWV1ZQorICogc2sgLSBzb2NrIHRvIHdhaXQgb24KKyAqIHRpbWVvIC0gZm9yIGhvdyBsb25nCisgKgorICogTm93IHNvY2tldCBzdGF0ZSBpbmNsdWRpbmcgc2stPnNrX2VyciBpcyBjaGFuZ2VkIG9ubHkgdW5kZXIgbG9jaywKKyAqIGhlbmNlIHdlIG1heSBvbWl0IGNoZWNrcyBhZnRlciBqb2luaW5nIHdhaXQgcXVldWUuCisgKiBXZSBjaGVjayByZWNlaXZlIHF1ZXVlIGJlZm9yZSBzY2hlZHVsZSgpIG9ubHkgYXMgb3B0aW1pemF0aW9uOworICogaXQgaXMgdmVyeSBsaWtlbHkgdGhhdCByZWxlYXNlX3NvY2soKSBhZGRlZCBuZXcgZGF0YS4KKyAqLworaW50IHNrX3dhaXRfZGF0YShzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgKnRpbWVvKQoreworCWludCByYzsKKwlERUZJTkVfV0FJVCh3YWl0KTsKKworCXByZXBhcmVfdG9fd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCXNldF9iaXQoU09DS19BU1lOQ19XQUlUREFUQSwgJnNrLT5za19zb2NrZXQtPmZsYWdzKTsKKwlyYyA9IHNrX3dhaXRfZXZlbnQoc2ssIHRpbWVvLCAhc2tiX3F1ZXVlX2VtcHR5KCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpOworCWNsZWFyX2JpdChTT0NLX0FTWU5DX1dBSVREQVRBLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOworCWZpbmlzaF93YWl0KHNrLT5za19zbGVlcCwgJndhaXQpOworCXJldHVybiByYzsKK30KKworRVhQT1JUX1NZTUJPTChza193YWl0X2RhdGEpOworCisvKgorICogU2V0IG9mIGRlZmF1bHQgcm91dGluZXMgZm9yIGluaXRpYWxpc2luZyBzdHJ1Y3QgcHJvdG9fb3BzIHdoZW4KKyAqIHRoZSBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IGEgcGFydGljdWxhciBmdW5jdGlvbi4gSW4gY2VydGFpbgorICogY2FzZXMgd2hlcmUgaXQgbWFrZXMgbm8gc2Vuc2UgZm9yIGEgcHJvdG9jb2wgdG8gaGF2ZSBhICJkbyBub3RoaW5nIgorICogZnVuY3Rpb24sIHNvbWUgZGVmYXVsdCBwcm9jZXNzaW5nIGlzIHByb3ZpZGVkLgorICovCisKK2ludCBzb2NrX25vX2JpbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICpzYWRkciwgaW50IGxlbikKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK2ludCBzb2NrX25vX2Nvbm5lY3Qoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICpzYWRkciwgCisJCSAgICBpbnQgbGVuLCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitpbnQgc29ja19ub19zb2NrZXRwYWlyKHN0cnVjdCBzb2NrZXQgKnNvY2sxLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrMikKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK2ludCBzb2NrX25vX2FjY2VwdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2V0ICpuZXdzb2NrLCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitpbnQgc29ja19ub19nZXRuYW1lKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqc2FkZHIsIAorCQkgICAgaW50ICpsZW4sIGludCBwZWVyKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKwordW5zaWduZWQgaW50IHNvY2tfbm9fcG9sbChzdHJ1Y3QgZmlsZSAqIGZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIHBvbGxfdGFibGUgKnB0KQoreworCXJldHVybiAwOworfQorCitpbnQgc29ja19ub19pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK2ludCBzb2NrX25vX2xpc3RlbihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgYmFja2xvZykKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK2ludCBzb2NrX25vX3NodXRkb3duKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBob3cpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitpbnQgc29ja19ub19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCSAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworaW50IHNvY2tfbm9fZ2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworaW50IHNvY2tfbm9fc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm0sCisJCSAgICBzaXplX3QgbGVuKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworaW50IHNvY2tfbm9fcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm0sCisJCSAgICBzaXplX3QgbGVuLCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitpbnQgc29ja19ub19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwkvKiBNaXJyb3IgbWlzc2luZyBtbWFwIG1ldGhvZCBlcnJvciBjb2RlICovCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3NzaXplX3Qgc29ja19ub19zZW5kcGFnZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9mZnNldCwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlzc2l6ZV90IHJlczsKKwlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsubXNnX2ZsYWdzID0gZmxhZ3N9OworCXN0cnVjdCBrdmVjIGlvdjsKKwljaGFyICprYWRkciA9IGttYXAocGFnZSk7CisJaW92Lmlvdl9iYXNlID0ga2FkZHIgKyBvZmZzZXQ7CisJaW92Lmlvdl9sZW4gPSBzaXplOworCXJlcyA9IGtlcm5lbF9zZW5kbXNnKHNvY2ssICZtc2csICZpb3YsIDEsIHNpemUpOworCWt1bm1hcChwYWdlKTsKKwlyZXR1cm4gcmVzOworfQorCisvKgorICoJRGVmYXVsdCBTb2NrZXQgQ2FsbGJhY2tzCisgKi8KKworc3RhdGljIHZvaWQgc29ja19kZWZfd2FrZXVwKHN0cnVjdCBzb2NrICpzaykKK3sKKwlyZWFkX2xvY2soJnNrLT5za19jYWxsYmFja19sb2NrKTsKKwlpZiAoc2stPnNrX3NsZWVwICYmIHdhaXRxdWV1ZV9hY3RpdmUoc2stPnNrX3NsZWVwKSkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbChzay0+c2tfc2xlZXApOworCXJlYWRfdW5sb2NrKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHNvY2tfZGVmX2Vycm9yX3JlcG9ydChzdHJ1Y3Qgc29jayAqc2spCit7CisJcmVhZF9sb2NrKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CisJaWYgKHNrLT5za19zbGVlcCAmJiB3YWl0cXVldWVfYWN0aXZlKHNrLT5za19zbGVlcCkpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZShzay0+c2tfc2xlZXApOworCXNrX3dha2VfYXN5bmMoc2ssMCxQT0xMX0VSUik7IAorCXJlYWRfdW5sb2NrKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHNvY2tfZGVmX3JlYWRhYmxlKHN0cnVjdCBzb2NrICpzaywgaW50IGxlbikKK3sKKwlyZWFkX2xvY2soJnNrLT5za19jYWxsYmFja19sb2NrKTsKKwlpZiAoc2stPnNrX3NsZWVwICYmIHdhaXRxdWV1ZV9hY3RpdmUoc2stPnNrX3NsZWVwKSkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHNrLT5za19zbGVlcCk7CisJc2tfd2FrZV9hc3luYyhzaywxLFBPTExfSU4pOworCXJlYWRfdW5sb2NrKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHNvY2tfZGVmX3dyaXRlX3NwYWNlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlyZWFkX2xvY2soJnNrLT5za19jYWxsYmFja19sb2NrKTsKKworCS8qIERvIG5vdCB3YWtlIHVwIGEgd3JpdGVyIHVudGlsIGhlIGNhbiBtYWtlICJzaWduaWZpY2FudCIKKwkgKiBwcm9ncmVzcy4gIC0tRGF2ZU0KKwkgKi8KKwlpZigoYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKSA8PCAxKSA8PSBzay0+c2tfc25kYnVmKSB7CisJCWlmIChzay0+c2tfc2xlZXAgJiYgd2FpdHF1ZXVlX2FjdGl2ZShzay0+c2tfc2xlZXApKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHNrLT5za19zbGVlcCk7CisKKwkJLyogU2hvdWxkIGFncmVlIHdpdGggcG9sbCwgb3RoZXJ3aXNlIHNvbWUgcHJvZ3JhbXMgYnJlYWsgKi8KKwkJaWYgKHNvY2tfd3JpdGVhYmxlKHNrKSkKKwkJCXNrX3dha2VfYXN5bmMoc2ssIDIsIFBPTExfT1VUKTsKKwl9CisKKwlyZWFkX3VubG9jaygmc2stPnNrX2NhbGxiYWNrX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBzb2NrX2RlZl9kZXN0cnVjdChzdHJ1Y3Qgc29jayAqc2spCit7CisJaWYgKHNrLT5za19wcm90aW5mbykKKwkJa2ZyZWUoc2stPnNrX3Byb3RpbmZvKTsKK30KKwordm9pZCBza19zZW5kX3NpZ3VyZyhzdHJ1Y3Qgc29jayAqc2spCit7CisJaWYgKHNrLT5za19zb2NrZXQgJiYgc2stPnNrX3NvY2tldC0+ZmlsZSkKKwkJaWYgKHNlbmRfc2lndXJnKCZzay0+c2tfc29ja2V0LT5maWxlLT5mX293bmVyKSkKKwkJCXNrX3dha2VfYXN5bmMoc2ssIDMsIFBPTExfUFJJKTsKK30KKwordm9pZCBza19yZXNldF90aW1lcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0aW1lcl9saXN0KiB0aW1lciwKKwkJICAgIHVuc2lnbmVkIGxvbmcgZXhwaXJlcykKK3sKKwlpZiAoIW1vZF90aW1lcih0aW1lciwgZXhwaXJlcykpCisJCXNvY2tfaG9sZChzayk7Cit9CisKK0VYUE9SVF9TWU1CT0woc2tfcmVzZXRfdGltZXIpOworCit2b2lkIHNrX3N0b3BfdGltZXIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGltZXJfbGlzdCogdGltZXIpCit7CisJaWYgKHRpbWVyX3BlbmRpbmcodGltZXIpICYmIGRlbF90aW1lcih0aW1lcikpCisJCV9fc29ja19wdXQoc2spOworfQorCitFWFBPUlRfU1lNQk9MKHNrX3N0b3BfdGltZXIpOworCit2b2lkIHNvY2tfaW5pdF9kYXRhKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrICpzaykKK3sKKwlza2JfcXVldWVfaGVhZF9pbml0KCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2stPnNrX3dyaXRlX3F1ZXVlKTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZzay0+c2tfZXJyb3JfcXVldWUpOworCisJc2stPnNrX3NlbmRfaGVhZAk9CU5VTEw7CisKKwlpbml0X3RpbWVyKCZzay0+c2tfdGltZXIpOworCQorCXNrLT5za19hbGxvY2F0aW9uCT0JR0ZQX0tFUk5FTDsKKwlzay0+c2tfcmN2YnVmCQk9CXN5c2N0bF9ybWVtX2RlZmF1bHQ7CisJc2stPnNrX3NuZGJ1ZgkJPQlzeXNjdGxfd21lbV9kZWZhdWx0OworCXNrLT5za19zdGF0ZQkJPQlUQ1BfQ0xPU0U7CisJc2stPnNrX3NvY2tldAkJPQlzb2NrOworCisJc29ja19zZXRfZmxhZyhzaywgU09DS19aQVBQRUQpOworCisJaWYoc29jaykKKwl7CisJCXNrLT5za190eXBlCT0Jc29jay0+dHlwZTsKKwkJc2stPnNrX3NsZWVwCT0JJnNvY2stPndhaXQ7CisJCXNvY2stPnNrCT0Jc2s7CisJfSBlbHNlCisJCXNrLT5za19zbGVlcAk9CU5VTEw7CisKKwlyd2xvY2tfaW5pdCgmc2stPnNrX2RzdF9sb2NrKTsKKwlyd2xvY2tfaW5pdCgmc2stPnNrX2NhbGxiYWNrX2xvY2spOworCisJc2stPnNrX3N0YXRlX2NoYW5nZQk9CXNvY2tfZGVmX3dha2V1cDsKKwlzay0+c2tfZGF0YV9yZWFkeQk9CXNvY2tfZGVmX3JlYWRhYmxlOworCXNrLT5za193cml0ZV9zcGFjZQk9CXNvY2tfZGVmX3dyaXRlX3NwYWNlOworCXNrLT5za19lcnJvcl9yZXBvcnQJPQlzb2NrX2RlZl9lcnJvcl9yZXBvcnQ7CisJc2stPnNrX2Rlc3RydWN0CQk9CXNvY2tfZGVmX2Rlc3RydWN0OworCisJc2stPnNrX3NuZG1zZ19wYWdlCT0JTlVMTDsKKwlzay0+c2tfc25kbXNnX29mZgk9CTA7CisKKwlzay0+c2tfcGVlcmNyZWQucGlkIAk9CTA7CisJc2stPnNrX3BlZXJjcmVkLnVpZAk9CS0xOworCXNrLT5za19wZWVyY3JlZC5naWQJPQktMTsKKwlzay0+c2tfd3JpdGVfcGVuZGluZwk9CTA7CisJc2stPnNrX3Jjdmxvd2F0CQk9CTE7CisJc2stPnNrX3JjdnRpbWVvCQk9CU1BWF9TQ0hFRFVMRV9USU1FT1VUOworCXNrLT5za19zbmR0aW1lbwkJPQlNQVhfU0NIRURVTEVfVElNRU9VVDsKKworCXNrLT5za19zdGFtcC50dl9zZWMgICAgID0gLTFMOworCXNrLT5za19zdGFtcC50dl91c2VjICAgID0gLTFMOworCisJYXRvbWljX3NldCgmc2stPnNrX3JlZmNudCwgMSk7Cit9CisKK3ZvaWQgZmFzdGNhbGwgbG9ja19zb2NrKHN0cnVjdCBzb2NrICpzaykKK3sKKwltaWdodF9zbGVlcCgpOworCXNwaW5fbG9ja19iaCgmKHNrLT5za19sb2NrLnNsb2NrKSk7CisJaWYgKHNrLT5za19sb2NrLm93bmVyKQorCQlfX2xvY2tfc29jayhzayk7CisJc2stPnNrX2xvY2sub3duZXIgPSAodm9pZCAqKTE7CisJc3Bpbl91bmxvY2tfYmgoJihzay0+c2tfbG9jay5zbG9jaykpOworfQorCitFWFBPUlRfU1lNQk9MKGxvY2tfc29jayk7CisKK3ZvaWQgZmFzdGNhbGwgcmVsZWFzZV9zb2NrKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzcGluX2xvY2tfYmgoJihzay0+c2tfbG9jay5zbG9jaykpOworCWlmIChzay0+c2tfYmFja2xvZy50YWlsKQorCQlfX3JlbGVhc2Vfc29jayhzayk7CisJc2stPnNrX2xvY2sub3duZXIgPSBOVUxMOworICAgICAgICBpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmKHNrLT5za19sb2NrLndxKSkpCisJCXdha2VfdXAoJihzay0+c2tfbG9jay53cSkpOworCXNwaW5fdW5sb2NrX2JoKCYoc2stPnNrX2xvY2suc2xvY2spKTsKK30KK0VYUE9SVF9TWU1CT0wocmVsZWFzZV9zb2NrKTsKKworaW50IHNvY2tfZ2V0X3RpbWVzdGFtcChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0aW1ldmFsIF9fdXNlciAqdXNlcnN0YW1wKQoreyAKKwlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19USU1FU1RBTVApKQorCQlzb2NrX2VuYWJsZV90aW1lc3RhbXAoc2spOworCWlmIChzay0+c2tfc3RhbXAudHZfc2VjID09IC0xKSAKKwkJcmV0dXJuIC1FTk9FTlQ7CisJaWYgKHNrLT5za19zdGFtcC50dl9zZWMgPT0gMCkKKwkJZG9fZ2V0dGltZW9mZGF5KCZzay0+c2tfc3RhbXApOworCXJldHVybiBjb3B5X3RvX3VzZXIodXNlcnN0YW1wLCAmc2stPnNrX3N0YW1wLCBzaXplb2Yoc3RydWN0IHRpbWV2YWwpKSA/CisJCS1FRkFVTFQgOiAwOyAKK30gCitFWFBPUlRfU1lNQk9MKHNvY2tfZ2V0X3RpbWVzdGFtcCk7CisKK3ZvaWQgc29ja19lbmFibGVfdGltZXN0YW1wKHN0cnVjdCBzb2NrICpzaykKK3sJCisJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfVElNRVNUQU1QKSkgeyAKKwkJc29ja19zZXRfZmxhZyhzaywgU09DS19USU1FU1RBTVApOworCQluZXRfZW5hYmxlX3RpbWVzdGFtcCgpOworCX0KK30KK0VYUE9SVF9TWU1CT0woc29ja19lbmFibGVfdGltZXN0YW1wKTsgCisKKy8qCisgKglHZXQgYSBzb2NrZXQgb3B0aW9uIG9uIGFuIHNvY2tldC4KKyAqCisgKglGSVg6IFBPU0lYIDEwMDMuMWcgaXMgdmVyeSBhbWJpZ3VvdXMgaGVyZS4gSXQgc3RhdGVzIHRoYXQKKyAqCWFzeW5jaHJvbm91cyBlcnJvcnMgc2hvdWxkIGJlIHJlcG9ydGVkIGJ5IGdldHNvY2tvcHQuIFdlIGFzc3VtZQorICoJdGhpcyBtZWFucyBpZiB5b3Ugc3BlY2lmeSBTT19FUlJPUiAob3RoZXJ3aXNlIHdoYXRzIHRoZSBwb2ludCBvZiBpdCkuCisgKi8KK2ludCBzb2NrX2NvbW1vbl9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCQkgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisKKwlyZXR1cm4gc2stPnNrX3Byb3QtPmdldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7Cit9CisKK0VYUE9SVF9TWU1CT0woc29ja19jb21tb25fZ2V0c29ja29wdCk7CisKK2ludCBzb2NrX2NvbW1vbl9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCXN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlpbnQgYWRkcl9sZW4gPSAwOworCWludCBlcnI7CisKKwllcnIgPSBzay0+c2tfcHJvdC0+cmVjdm1zZyhpb2NiLCBzaywgbXNnLCBzaXplLCBmbGFncyAmIE1TR19ET05UV0FJVCwKKwkJCQkgICBmbGFncyAmIH5NU0dfRE9OVFdBSVQsICZhZGRyX2xlbik7CisJaWYgKGVyciA+PSAwKQorCQltc2ctPm1zZ19uYW1lbGVuID0gYWRkcl9sZW47CisJcmV0dXJuIGVycjsKK30KKworRVhQT1JUX1NZTUJPTChzb2NrX2NvbW1vbl9yZWN2bXNnKTsKKworLyoKKyAqCVNldCBzb2NrZXQgb3B0aW9ucyBvbiBhbiBpbmV0IHNvY2tldC4KKyAqLworaW50IHNvY2tfY29tbW9uX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJCSAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisKKwlyZXR1cm4gc2stPnNrX3Byb3QtPnNldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7Cit9CisKK0VYUE9SVF9TWU1CT0woc29ja19jb21tb25fc2V0c29ja29wdCk7CisKK3ZvaWQgc2tfY29tbW9uX3JlbGVhc2Uoc3RydWN0IHNvY2sgKnNrKQoreworCWlmIChzay0+c2tfcHJvdC0+ZGVzdHJveSkKKwkJc2stPnNrX3Byb3QtPmRlc3Ryb3koc2spOworCisJLyoKKwkgKiBPYnNlcnZhdGlvbjogd2hlbiBzb2NrX2NvbW1vbl9yZWxlYXNlIGlzIGNhbGxlZCwgcHJvY2Vzc2VzIGhhdmUKKwkgKiBubyBhY2Nlc3MgdG8gc29ja2V0LiBCdXQgbmV0IHN0aWxsIGhhcy4KKwkgKiBTdGVwIG9uZSwgZGV0YWNoIGl0IGZyb20gbmV0d29ya2luZzoKKwkgKgorCSAqIEEuIFJlbW92ZSBmcm9tIGhhc2ggdGFibGVzLgorCSAqLworCisJc2stPnNrX3Byb3QtPnVuaGFzaChzayk7CisKKwkvKgorCSAqIEluIHRoaXMgcG9pbnQgc29ja2V0IGNhbm5vdCByZWNlaXZlIG5ldyBwYWNrZXRzLCBidXQgaXQgaXMgcG9zc2libGUKKwkgKiB0aGF0IHNvbWUgcGFja2V0cyBhcmUgaW4gZmxpZ2h0IGJlY2F1c2Ugc29tZSBDUFUgcnVucyByZWNlaXZlciBhbmQKKwkgKiBkaWQgaGFzaCB0YWJsZSBsb29rdXAgYmVmb3JlIHdlIHVuaGFzaGVkIHNvY2tldC4gVGhleSB3aWxsIGFjaGlldmUKKwkgKiByZWNlaXZlIHF1ZXVlIGFuZCB3aWxsIGJlIHB1cmdlZCBieSBzb2NrZXQgZGVzdHJ1Y3Rvci4KKwkgKgorCSAqIEFsc28gd2Ugc3RpbGwgaGF2ZSBwYWNrZXRzIHBlbmRpbmcgb24gcmVjZWl2ZSBxdWV1ZSBhbmQgcHJvYmFibHksCisJICogb3VyIG93biBwYWNrZXRzIHdhaXRpbmcgaW4gZGV2aWNlIHF1ZXVlcy4gc29ja19kZXN0cm95IHdpbGwgZHJhaW4KKwkgKiByZWNlaXZlIHF1ZXVlLCBidXQgdHJhbnNtaXR0ZWQgcGFja2V0cyB3aWxsIGRlbGF5IHNvY2tldCBkZXN0cnVjdGlvbgorCSAqIHVudGlsIHRoZSBsYXN0IHJlZmVyZW5jZSB3aWxsIGJlIHJlbGVhc2VkLgorCSAqLworCisJc29ja19vcnBoYW4oc2spOworCisJeGZybV9za19mcmVlX3BvbGljeShzayk7CisKKyNpZmRlZiBJTkVUX1JFRkNOVF9ERUJVRworCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3JlZmNudCkgIT0gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkRlc3RydWN0aW9uIG9mIHRoZSBzb2NrZXQgJXAgZGVsYXllZCwgYz0lZFxuIiwKKwkJICAgICAgIHNrLCBhdG9taWNfcmVhZCgmc2stPnNrX3JlZmNudCkpOworI2VuZGlmCisJc29ja19wdXQoc2spOworfQorCitFWFBPUlRfU1lNQk9MKHNrX2NvbW1vbl9yZWxlYXNlKTsKKworc3RhdGljIERFRklORV9SV0xPQ0socHJvdG9fbGlzdF9sb2NrKTsKK3N0YXRpYyBMSVNUX0hFQUQocHJvdG9fbGlzdCk7CisKK2ludCBwcm90b19yZWdpc3RlcihzdHJ1Y3QgcHJvdG8gKnByb3QsIGludCBhbGxvY19zbGFiKQoreworCWludCByYyA9IC1FTk9CVUZTOworCisJd3JpdGVfbG9jaygmcHJvdG9fbGlzdF9sb2NrKTsKKworCWlmIChhbGxvY19zbGFiKSB7CisJCXByb3QtPnNsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZShwcm90LT5uYW1lLCBwcm90LT5vYmpfc2l6ZSwgMCwKKwkJCQkJICAgICAgIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCwgTlVMTCk7CisKKwkJaWYgKHByb3QtPnNsYWIgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6IENhbid0IGNyZWF0ZSBzb2NrIFNMQUIgY2FjaGUhXG4iLAorCQkJICAgICAgIHByb3QtPm5hbWUpOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisJfQorCisJbGlzdF9hZGQoJnByb3QtPm5vZGUsICZwcm90b19saXN0KTsKKwlyYyA9IDA7CitvdXRfdW5sb2NrOgorCXdyaXRlX3VubG9jaygmcHJvdG9fbGlzdF9sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKK0VYUE9SVF9TWU1CT0wocHJvdG9fcmVnaXN0ZXIpOworCit2b2lkIHByb3RvX3VucmVnaXN0ZXIoc3RydWN0IHByb3RvICpwcm90KQoreworCXdyaXRlX2xvY2soJnByb3RvX2xpc3RfbG9jayk7CisKKwlpZiAocHJvdC0+c2xhYiAhPSBOVUxMKSB7CisJCWttZW1fY2FjaGVfZGVzdHJveShwcm90LT5zbGFiKTsKKwkJcHJvdC0+c2xhYiA9IE5VTEw7CisJfQorCisJbGlzdF9kZWwoJnByb3QtPm5vZGUpOworCXdyaXRlX3VubG9jaygmcHJvdG9fbGlzdF9sb2NrKTsKK30KKworRVhQT1JUX1NZTUJPTChwcm90b191bnJlZ2lzdGVyKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwcm90byAqX19wcm90b19oZWFkKHZvaWQpCit7CisJcmV0dXJuIGxpc3RfZW50cnkocHJvdG9fbGlzdC5uZXh0LCBzdHJ1Y3QgcHJvdG8sIG5vZGUpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwcm90byAqcHJvdG9faGVhZCh2b2lkKQoreworCXJldHVybiBsaXN0X2VtcHR5KCZwcm90b19saXN0KSA/IE5VTEwgOiBfX3Byb3RvX2hlYWQoKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcHJvdG8gKnByb3RvX25leHQoc3RydWN0IHByb3RvICpwcm90bykKK3sKKwlyZXR1cm4gcHJvdG8tPm5vZGUubmV4dCA9PSAmcHJvdG9fbGlzdCA/IE5VTEwgOgorCQlsaXN0X2VudHJ5KHByb3RvLT5ub2RlLm5leHQsIHN0cnVjdCBwcm90bywgbm9kZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHByb3RvICpwcm90b19nZXRfaWR4KGxvZmZfdCBwb3MpCit7CisJc3RydWN0IHByb3RvICpwcm90bzsKKwlsb2ZmX3QgaSA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHByb3RvLCAmcHJvdG9fbGlzdCwgbm9kZSkKKwkJaWYgKGkrKyA9PSBwb3MpCisJCQlnb3RvIG91dDsKKworCXByb3RvID0gTlVMTDsKK291dDoKKwlyZXR1cm4gcHJvdG87Cit9CisKK3N0YXRpYyB2b2lkICpwcm90b19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXJlYWRfbG9jaygmcHJvdG9fbGlzdF9sb2NrKTsKKwlyZXR1cm4gKnBvcyA/IHByb3RvX2dldF9pZHgoKnBvcyAtIDEpIDogU0VRX1NUQVJUX1RPS0VOOworfQorCitzdGF0aWMgdm9pZCAqcHJvdG9fc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCSsrKnBvczsKKwlyZXR1cm4gdiA9PSBTRVFfU1RBUlRfVE9LRU4gPyBwcm90b19oZWFkKCkgOiBwcm90b19uZXh0KHYpOworfQorCitzdGF0aWMgdm9pZCBwcm90b19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlyZWFkX3VubG9jaygmcHJvdG9fbGlzdF9sb2NrKTsKK30KKworc3RhdGljIGNoYXIgcHJvdG9fbWV0aG9kX2ltcGxlbWVudGVkKGNvbnN0IHZvaWQgKm1ldGhvZCkKK3sKKwlyZXR1cm4gbWV0aG9kID09IE5VTEwgPyAnbicgOiAneSc7Cit9CisKK3N0YXRpYyB2b2lkIHByb3RvX3NlcV9wcmludGYoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBwcm90byAqcHJvdG8pCit7CisJc2VxX3ByaW50ZihzZXEsICIlLTlzICU0dSAlNmQgICU2ZCAgICUtM3MgJTZ1ICAgJS0zcyAgJS0xMHMgIgorCQkJIiUyYyAlMmMgJTJjICUyYyAlMmMgJTJjICUyYyAlMmMgJTJjICUyYyAlMmMgJTJjICUyYyAlMmMgJTJjICUyYyAlMmMgJTJjICUyY1xuIiwKKwkJICAgcHJvdG8tPm5hbWUsCisJCSAgIHByb3RvLT5vYmpfc2l6ZSwKKwkJICAgcHJvdG8tPnNvY2tldHNfYWxsb2NhdGVkICE9IE5VTEwgPyBhdG9taWNfcmVhZChwcm90by0+c29ja2V0c19hbGxvY2F0ZWQpIDogLTEsCisJCSAgIHByb3RvLT5tZW1vcnlfYWxsb2NhdGVkICE9IE5VTEwgPyBhdG9taWNfcmVhZChwcm90by0+bWVtb3J5X2FsbG9jYXRlZCkgOiAtMSwKKwkJICAgcHJvdG8tPm1lbW9yeV9wcmVzc3VyZSAhPSBOVUxMID8gKnByb3RvLT5tZW1vcnlfcHJlc3N1cmUgPyAieWVzIiA6ICJubyIgOiAiTkkiLAorCQkgICBwcm90by0+bWF4X2hlYWRlciwKKwkJICAgcHJvdG8tPnNsYWIgPT0gTlVMTCA/ICJubyIgOiAieWVzIiwKKwkJICAgbW9kdWxlX25hbWUocHJvdG8tPm93bmVyKSwKKwkJICAgcHJvdG9fbWV0aG9kX2ltcGxlbWVudGVkKHByb3RvLT5jbG9zZSksCisJCSAgIHByb3RvX21ldGhvZF9pbXBsZW1lbnRlZChwcm90by0+Y29ubmVjdCksCisJCSAgIHByb3RvX21ldGhvZF9pbXBsZW1lbnRlZChwcm90by0+ZGlzY29ubmVjdCksCisJCSAgIHByb3RvX21ldGhvZF9pbXBsZW1lbnRlZChwcm90by0+YWNjZXB0KSwKKwkJICAgcHJvdG9fbWV0aG9kX2ltcGxlbWVudGVkKHByb3RvLT5pb2N0bCksCisJCSAgIHByb3RvX21ldGhvZF9pbXBsZW1lbnRlZChwcm90by0+aW5pdCksCisJCSAgIHByb3RvX21ldGhvZF9pbXBsZW1lbnRlZChwcm90by0+ZGVzdHJveSksCisJCSAgIHByb3RvX21ldGhvZF9pbXBsZW1lbnRlZChwcm90by0+c2h1dGRvd24pLAorCQkgICBwcm90b19tZXRob2RfaW1wbGVtZW50ZWQocHJvdG8tPnNldHNvY2tvcHQpLAorCQkgICBwcm90b19tZXRob2RfaW1wbGVtZW50ZWQocHJvdG8tPmdldHNvY2tvcHQpLAorCQkgICBwcm90b19tZXRob2RfaW1wbGVtZW50ZWQocHJvdG8tPnNlbmRtc2cpLAorCQkgICBwcm90b19tZXRob2RfaW1wbGVtZW50ZWQocHJvdG8tPnJlY3Ztc2cpLAorCQkgICBwcm90b19tZXRob2RfaW1wbGVtZW50ZWQocHJvdG8tPnNlbmRwYWdlKSwKKwkJICAgcHJvdG9fbWV0aG9kX2ltcGxlbWVudGVkKHByb3RvLT5iaW5kKSwKKwkJICAgcHJvdG9fbWV0aG9kX2ltcGxlbWVudGVkKHByb3RvLT5iYWNrbG9nX3JjdiksCisJCSAgIHByb3RvX21ldGhvZF9pbXBsZW1lbnRlZChwcm90by0+aGFzaCksCisJCSAgIHByb3RvX21ldGhvZF9pbXBsZW1lbnRlZChwcm90by0+dW5oYXNoKSwKKwkJICAgcHJvdG9fbWV0aG9kX2ltcGxlbWVudGVkKHByb3RvLT5nZXRfcG9ydCksCisJCSAgIHByb3RvX21ldGhvZF9pbXBsZW1lbnRlZChwcm90by0+ZW50ZXJfbWVtb3J5X3ByZXNzdXJlKSk7Cit9CisKK3N0YXRpYyBpbnQgcHJvdG9fc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlzZXFfcHJpbnRmKHNlcSwgIiUtOXMgJS00cyAlLThzICUtNnMgJS01cyAlLTdzICUtNHMgJS0xMHMgJXMiLAorCQkJICAgInByb3RvY29sIiwKKwkJCSAgICJzaXplIiwKKwkJCSAgICJzb2NrZXRzIiwKKwkJCSAgICJtZW1vcnkiLAorCQkJICAgInByZXNzIiwKKwkJCSAgICJtYXhoZHIiLAorCQkJICAgInNsYWIiLAorCQkJICAgIm1vZHVsZSIsCisJCQkgICAiY2wgY28gZGkgYWMgaW8gaW4gZGUgc2ggc3MgZ3Mgc2UgcmUgc3AgYmkgYnIgaGEgdWggZ3AgZW1cbiIpOworCWVsc2UKKwkJcHJvdG9fc2VxX3ByaW50ZihzZXEsIHYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHByb3RvX3NlcV9vcHMgPSB7CisJLnN0YXJ0ICA9IHByb3RvX3NlcV9zdGFydCwKKwkubmV4dCAgID0gcHJvdG9fc2VxX25leHQsCisJLnN0b3AgICA9IHByb3RvX3NlcV9zdG9wLAorCS5zaG93ICAgPSBwcm90b19zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgcHJvdG9fc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZwcm90b19zZXFfb3BzKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvdG9fc2VxX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHByb3RvX3NlcV9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwcm90b19pbml0KHZvaWQpCit7CisJLyogcmVnaXN0ZXIgL3Byb2MvbmV0L3Byb3RvY29scyAqLworCXJldHVybiBwcm9jX25ldF9mb3BzX2NyZWF0ZSgicHJvdG9jb2xzIiwgU19JUlVHTywgJnByb3RvX3NlcV9mb3BzKSA9PSBOVUxMID8gLUVOT0JVRlMgOiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwocHJvdG9faW5pdCk7CisKKyNlbmRpZiAvKiBQUk9DX0ZTICovCisKK0VYUE9SVF9TWU1CT0woc2tfYWxsb2MpOworRVhQT1JUX1NZTUJPTChza19mcmVlKTsKK0VYUE9SVF9TWU1CT0woc2tfc2VuZF9zaWd1cmcpOworRVhQT1JUX1NZTUJPTChzb2NrX2FsbG9jX3NlbmRfc2tiKTsKK0VYUE9SVF9TWU1CT0woc29ja19pbml0X2RhdGEpOworRVhQT1JUX1NZTUJPTChzb2NrX2tmcmVlX3MpOworRVhQT1JUX1NZTUJPTChzb2NrX2ttYWxsb2MpOworRVhQT1JUX1NZTUJPTChzb2NrX25vX2FjY2VwdCk7CitFWFBPUlRfU1lNQk9MKHNvY2tfbm9fYmluZCk7CitFWFBPUlRfU1lNQk9MKHNvY2tfbm9fY29ubmVjdCk7CitFWFBPUlRfU1lNQk9MKHNvY2tfbm9fZ2V0bmFtZSk7CitFWFBPUlRfU1lNQk9MKHNvY2tfbm9fZ2V0c29ja29wdCk7CitFWFBPUlRfU1lNQk9MKHNvY2tfbm9faW9jdGwpOworRVhQT1JUX1NZTUJPTChzb2NrX25vX2xpc3Rlbik7CitFWFBPUlRfU1lNQk9MKHNvY2tfbm9fbW1hcCk7CitFWFBPUlRfU1lNQk9MKHNvY2tfbm9fcG9sbCk7CitFWFBPUlRfU1lNQk9MKHNvY2tfbm9fcmVjdm1zZyk7CitFWFBPUlRfU1lNQk9MKHNvY2tfbm9fc2VuZG1zZyk7CitFWFBPUlRfU1lNQk9MKHNvY2tfbm9fc2VuZHBhZ2UpOworRVhQT1JUX1NZTUJPTChzb2NrX25vX3NldHNvY2tvcHQpOworRVhQT1JUX1NZTUJPTChzb2NrX25vX3NodXRkb3duKTsKK0VYUE9SVF9TWU1CT0woc29ja19ub19zb2NrZXRwYWlyKTsKK0VYUE9SVF9TWU1CT0woc29ja19yZnJlZSk7CitFWFBPUlRfU1lNQk9MKHNvY2tfc2V0c29ja29wdCk7CitFWFBPUlRfU1lNQk9MKHNvY2tfd2ZyZWUpOworRVhQT1JUX1NZTUJPTChzb2NrX3dtYWxsb2MpOworRVhQT1JUX1NZTUJPTChzb2NrX2lfdWlkKTsKK0VYUE9SVF9TWU1CT0woc29ja19pX2lubyk7CisjaWZkZWYgQ09ORklHX1NZU0NUTAorRVhQT1JUX1NZTUJPTChzeXNjdGxfb3B0bWVtX21heCk7CitFWFBPUlRfU1lNQk9MKHN5c2N0bF9ybWVtX21heCk7CitFWFBPUlRfU1lNQk9MKHN5c2N0bF93bWVtX21heCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3N0cmVhbS5jIGIvbmV0L2NvcmUvc3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUyN2E1NwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9jb3JlL3N0cmVhbS5jCkBAIC0wLDAgKzEsMjg3IEBACisvKgorICogICAgIFNVQ1MgTkVUMzoKKyAqCisgKiAgICAgR2VuZXJpYyBzdHJlYW0gaGFuZGxpbmcgcm91dGluZXMuIFRoZXNlIGFyZSBnZW5lcmljIGZvciBtb3N0CisgKiAgICAgcHJvdG9jb2xzLiBFdmVuIElQLiBUb25pZ2h0IDgtKS4KKyAqICAgICBUaGlzIGlzIHVzZWQgYmVjYXVzZSBUQ1AsIExMQyAob3RoZXJzIHRvbykgbGF5ZXIgYWxsIGhhdmUgbW9zdGx5CisgKiAgICAgaWRlbnRpY2FsIHNlbmRtc2coKSBhbmQgcmVjdm1zZygpIGNvZGUuCisgKiAgICAgU28gd2UgKHdpbGwpIHNoYXJlIGl0IGhlcmUuCisgKgorICogICAgIEF1dGhvcnM6ICAgICAgICBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAqICAgICAgICAgICAgICAgICAgICAgKGZyb20gb2xkIHRjcC5jIGNvZGUpCisgKiAgICAgICAgICAgICAgICAgICAgIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+IChCb3Jyb3dlZCBjb21tZW50cyA4LSkpCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisvKioKKyAqIHNrX3N0cmVhbV93cml0ZV9zcGFjZSAtIHN0cmVhbSBzb2NrZXQgd3JpdGVfc3BhY2UgY2FsbGJhY2suCisgKiBzayAtIHNvY2tldAorICoKKyAqIEZJWE1FOiB3cml0ZSBwcm9wZXIgZGVzY3JpcHRpb24KKyAqLwordm9pZCBza19zdHJlYW1fd3JpdGVfc3BhY2Uoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBzay0+c2tfc29ja2V0OworCisJaWYgKHNrX3N0cmVhbV93c3BhY2Uoc2spID49IHNrX3N0cmVhbV9taW5fd3NwYWNlKHNrKSAmJiBzb2NrKSB7CisJCWNsZWFyX2JpdChTT0NLX05PU1BBQ0UsICZzb2NrLT5mbGFncyk7CisKKwkJaWYgKHNrLT5za19zbGVlcCAmJiB3YWl0cXVldWVfYWN0aXZlKHNrLT5za19zbGVlcCkpCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoc2stPnNrX3NsZWVwKTsKKwkJaWYgKHNvY2stPmZhc3luY19saXN0ICYmICEoc2stPnNrX3NodXRkb3duICYgU0VORF9TSFVURE9XTikpCisJCQlzb2NrX3dha2VfYXN5bmMoc29jaywgMiwgUE9MTF9PVVQpOworCX0KK30KKworRVhQT1JUX1NZTUJPTChza19zdHJlYW1fd3JpdGVfc3BhY2UpOworCisvKioKKyAqIHNrX3N0cmVhbV93YWl0X2Nvbm5lY3QgLSBXYWl0IGZvciBhIHNvY2tldCB0byBnZXQgaW50byB0aGUgY29ubmVjdGVkIHN0YXRlCisgKiBAc2sgLSBzb2NrIHRvIHdhaXQgb24KKyAqIEB0aW1lb19wIC0gZm9yIGhvdyBsb25nIHRvIHdhaXQKKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBzb2NrZXQgbG9ja2VkLgorICovCitpbnQgc2tfc3RyZWFtX3dhaXRfY29ubmVjdChzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgKnRpbWVvX3ApCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCURFRklORV9XQUlUKHdhaXQpOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKHNrLT5za19lcnIpCisJCQlyZXR1cm4gc29ja19lcnJvcihzayk7CisJCWlmICgoMSA8PCBzay0+c2tfc3RhdGUpICYgfihUQ1BGX1NZTl9TRU5UIHwgVENQRl9TWU5fUkVDVikpCisJCQlyZXR1cm4gLUVQSVBFOworCQlpZiAoISp0aW1lb19wKQorCQkJcmV0dXJuIC1FQUdBSU47CisJCWlmIChzaWduYWxfcGVuZGluZyh0c2spKQorCQkJcmV0dXJuIHNvY2tfaW50cl9lcnJubygqdGltZW9fcCk7CisKKwkJcHJlcGFyZV90b193YWl0KHNrLT5za19zbGVlcCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNrLT5za193cml0ZV9wZW5kaW5nKys7CisJCWlmIChza193YWl0X2V2ZW50KHNrLCB0aW1lb19wLAorCQkJCSAgISgoMSA8PCBzay0+c2tfc3RhdGUpICYgCisJCQkJICAgIH4oVENQRl9FU1RBQkxJU0hFRCB8IFRDUEZfQ0xPU0VfV0FJVCkpKSkKKwkJCWJyZWFrOworCQlmaW5pc2hfd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwkJc2stPnNrX3dyaXRlX3BlbmRpbmctLTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woc2tfc3RyZWFtX3dhaXRfY29ubmVjdCk7CisKKy8qKgorICogc2tfc3RyZWFtX2Nsb3NpbmcgLSBSZXR1cm4gMSBpZiB3ZSBzdGlsbCBoYXZlIHRoaW5ncyB0byBzZW5kIGluIG91ciBidWZmZXJzLgorICogQHNrIC0gc29ja2V0IHRvIHZlcmlmeQorICovCitzdGF0aWMgaW5saW5lIGludCBza19zdHJlYW1fY2xvc2luZyhzdHJ1Y3Qgc29jayAqc2spCit7CisJcmV0dXJuICgxIDw8IHNrLT5za19zdGF0ZSkgJgorCSAgICAgICAoVENQRl9GSU5fV0FJVDEgfCBUQ1BGX0NMT1NJTkcgfCBUQ1BGX0xBU1RfQUNLKTsKK30KKwordm9pZCBza19zdHJlYW1fd2FpdF9jbG9zZShzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgdGltZW91dCkKK3sKKwlpZiAodGltZW91dCkgeworCQlERUZJTkVfV0FJVCh3YWl0KTsKKworCQlkbyB7CisJCQlwcmVwYXJlX3RvX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCwKKwkJCQkJVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCWlmIChza193YWl0X2V2ZW50KHNrLCAmdGltZW91dCwgIXNrX3N0cmVhbV9jbG9zaW5nKHNrKSkpCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSAmJiB0aW1lb3V0KTsKKworCQlmaW5pc2hfd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwl9Cit9CisKK0VYUE9SVF9TWU1CT0woc2tfc3RyZWFtX3dhaXRfY2xvc2UpOworCisvKioKKyAqIHNrX3N0cmVhbV93YWl0X21lbW9yeSAtIFdhaXQgZm9yIG1vcmUgbWVtb3J5IGZvciBhIHNvY2tldAorICogQHNrIC0gc29ja2V0IHRvIHdhaXQgZm9yIG1lbW9yeQorICogQHRpbWVvX3AgLSBmb3IgaG93IGxvbmcKKyAqLworaW50IHNrX3N0cmVhbV93YWl0X21lbW9yeShzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgKnRpbWVvX3ApCit7CisJaW50IGVyciA9IDA7CisJbG9uZyB2bV93YWl0ID0gMDsKKwlsb25nIGN1cnJlbnRfdGltZW8gPSAqdGltZW9fcDsKKwlERUZJTkVfV0FJVCh3YWl0KTsKKworCWlmIChza19zdHJlYW1fbWVtb3J5X2ZyZWUoc2spKQorCQljdXJyZW50X3RpbWVvID0gdm1fd2FpdCA9IChuZXRfcmFuZG9tKCkgJSAoSFogLyA1KSkgKyAyOworCisJd2hpbGUgKDEpIHsKKwkJc2V0X2JpdChTT0NLX0FTWU5DX05PU1BBQ0UsICZzay0+c2tfc29ja2V0LT5mbGFncyk7CisKKwkJcHJlcGFyZV90b193YWl0KHNrLT5za19zbGVlcCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJaWYgKHNrLT5za19lcnIgfHwgKHNrLT5za19zaHV0ZG93biAmIFNFTkRfU0hVVERPV04pKQorCQkJZ290byBkb19lcnJvcjsKKwkJaWYgKCEqdGltZW9fcCkKKwkJCWdvdG8gZG9fbm9uYmxvY2s7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWdvdG8gZG9faW50ZXJydXB0ZWQ7CisJCWNsZWFyX2JpdChTT0NLX0FTWU5DX05PU1BBQ0UsICZzay0+c2tfc29ja2V0LT5mbGFncyk7CisJCWlmIChza19zdHJlYW1fbWVtb3J5X2ZyZWUoc2spICYmICF2bV93YWl0KQorCQkJYnJlYWs7CisKKwkJc2V0X2JpdChTT0NLX05PU1BBQ0UsICZzay0+c2tfc29ja2V0LT5mbGFncyk7CisJCXNrLT5za193cml0ZV9wZW5kaW5nKys7CisJCXNrX3dhaXRfZXZlbnQoc2ssICZjdXJyZW50X3RpbWVvLCBza19zdHJlYW1fbWVtb3J5X2ZyZWUoc2spICYmCisJCQkJCQkgIHZtX3dhaXQpOworCQlzay0+c2tfd3JpdGVfcGVuZGluZy0tOworCisJCWlmICh2bV93YWl0KSB7CisJCQl2bV93YWl0IC09IGN1cnJlbnRfdGltZW87CisJCQljdXJyZW50X3RpbWVvID0gKnRpbWVvX3A7CisJCQlpZiAoY3VycmVudF90aW1lbyAhPSBNQVhfU0NIRURVTEVfVElNRU9VVCAmJgorCQkJICAgIChjdXJyZW50X3RpbWVvIC09IHZtX3dhaXQpIDwgMCkKKwkJCQljdXJyZW50X3RpbWVvID0gMDsKKwkJCXZtX3dhaXQgPSAwOworCQl9CisJCSp0aW1lb19wID0gY3VycmVudF90aW1lbzsKKwl9CitvdXQ6CisJZmluaXNoX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJcmV0dXJuIGVycjsKKworZG9fZXJyb3I6CisJZXJyID0gLUVQSVBFOworCWdvdG8gb3V0OworZG9fbm9uYmxvY2s6CisJZXJyID0gLUVBR0FJTjsKKwlnb3RvIG91dDsKK2RvX2ludGVycnVwdGVkOgorCWVyciA9IHNvY2tfaW50cl9lcnJubygqdGltZW9fcCk7CisJZ290byBvdXQ7Cit9CisKK0VYUE9SVF9TWU1CT0woc2tfc3RyZWFtX3dhaXRfbWVtb3J5KTsKKwordm9pZCBza19zdHJlYW1fcmZyZWUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBza2ItPnNrOworCisJYXRvbWljX3N1Yihza2ItPnRydWVzaXplLCAmc2stPnNrX3JtZW1fYWxsb2MpOworCXNrLT5za19mb3J3YXJkX2FsbG9jICs9IHNrYi0+dHJ1ZXNpemU7Cit9CisKK0VYUE9SVF9TWU1CT0woc2tfc3RyZWFtX3JmcmVlKTsKKworaW50IHNrX3N0cmVhbV9lcnJvcihzdHJ1Y3Qgc29jayAqc2ssIGludCBmbGFncywgaW50IGVycikKK3sKKwlpZiAoZXJyID09IC1FUElQRSkKKwkJZXJyID0gc29ja19lcnJvcihzaykgPyA6IC1FUElQRTsKKwlpZiAoZXJyID09IC1FUElQRSAmJiAhKGZsYWdzICYgTVNHX05PU0lHTkFMKSkKKwkJc2VuZF9zaWcoU0lHUElQRSwgY3VycmVudCwgMCk7CisJcmV0dXJuIGVycjsKK30KKworRVhQT1JUX1NZTUJPTChza19zdHJlYW1fZXJyb3IpOworCit2b2lkIF9fc2tfc3RyZWFtX21lbV9yZWNsYWltKHN0cnVjdCBzb2NrICpzaykKK3sKKwlpZiAoc2stPnNrX2ZvcndhcmRfYWxsb2MgPj0gU0tfU1RSRUFNX01FTV9RVUFOVFVNKSB7CisJCWF0b21pY19zdWIoc2stPnNrX2ZvcndhcmRfYWxsb2MgLyBTS19TVFJFQU1fTUVNX1FVQU5UVU0sCisJCQkgICBzay0+c2tfcHJvdC0+bWVtb3J5X2FsbG9jYXRlZCk7CisJCXNrLT5za19mb3J3YXJkX2FsbG9jICY9IFNLX1NUUkVBTV9NRU1fUVVBTlRVTSAtIDE7CisJCWlmICgqc2stPnNrX3Byb3QtPm1lbW9yeV9wcmVzc3VyZSAmJgorCQkgICAgKGF0b21pY19yZWFkKHNrLT5za19wcm90LT5tZW1vcnlfYWxsb2NhdGVkKSA8CisJCSAgICAgc2stPnNrX3Byb3QtPnN5c2N0bF9tZW1bMF0pKQorCQkJKnNrLT5za19wcm90LT5tZW1vcnlfcHJlc3N1cmUgPSAwOworCX0KK30KKworRVhQT1JUX1NZTUJPTChfX3NrX3N0cmVhbV9tZW1fcmVjbGFpbSk7CisKK2ludCBza19zdHJlYW1fbWVtX3NjaGVkdWxlKHN0cnVjdCBzb2NrICpzaywgaW50IHNpemUsIGludCBraW5kKQoreworCWludCBhbXQgPSBza19zdHJlYW1fcGFnZXMoc2l6ZSk7CisKKwlzay0+c2tfZm9yd2FyZF9hbGxvYyArPSBhbXQgKiBTS19TVFJFQU1fTUVNX1FVQU5UVU07CisJYXRvbWljX2FkZChhbXQsIHNrLT5za19wcm90LT5tZW1vcnlfYWxsb2NhdGVkKTsKKworCS8qIFVuZGVyIGxpbWl0LiAqLworCWlmIChhdG9taWNfcmVhZChzay0+c2tfcHJvdC0+bWVtb3J5X2FsbG9jYXRlZCkgPCBzay0+c2tfcHJvdC0+c3lzY3RsX21lbVswXSkgeworCQlpZiAoKnNrLT5za19wcm90LT5tZW1vcnlfcHJlc3N1cmUpCisJCQkqc2stPnNrX3Byb3QtPm1lbW9yeV9wcmVzc3VyZSA9IDA7CisJCXJldHVybiAxOworCX0KKworCS8qIE92ZXIgaGFyZCBsaW1pdC4gKi8KKwlpZiAoYXRvbWljX3JlYWQoc2stPnNrX3Byb3QtPm1lbW9yeV9hbGxvY2F0ZWQpID4gc2stPnNrX3Byb3QtPnN5c2N0bF9tZW1bMl0pIHsKKwkJc2stPnNrX3Byb3QtPmVudGVyX21lbW9yeV9wcmVzc3VyZSgpOworCQlnb3RvIHN1cHByZXNzX2FsbG9jYXRpb247CisJfQorCisJLyogVW5kZXIgcHJlc3N1cmUuICovCisJaWYgKGF0b21pY19yZWFkKHNrLT5za19wcm90LT5tZW1vcnlfYWxsb2NhdGVkKSA+IHNrLT5za19wcm90LT5zeXNjdGxfbWVtWzFdKQorCQlzay0+c2tfcHJvdC0+ZW50ZXJfbWVtb3J5X3ByZXNzdXJlKCk7CisKKwlpZiAoa2luZCkgeworCQlpZiAoYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSA8IHNrLT5za19wcm90LT5zeXNjdGxfcm1lbVswXSkKKwkJCXJldHVybiAxOworCX0gZWxzZSBpZiAoc2stPnNrX3dtZW1fcXVldWVkIDwgc2stPnNrX3Byb3QtPnN5c2N0bF93bWVtWzBdKQorCQlyZXR1cm4gMTsKKworCWlmICghKnNrLT5za19wcm90LT5tZW1vcnlfcHJlc3N1cmUgfHwKKwkgICAgc2stPnNrX3Byb3QtPnN5c2N0bF9tZW1bMl0gPiBhdG9taWNfcmVhZChzay0+c2tfcHJvdC0+c29ja2V0c19hbGxvY2F0ZWQpICoKKwkJCQlza19zdHJlYW1fcGFnZXMoc2stPnNrX3dtZW1fcXVldWVkICsKKwkJCQkJCWF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgKworCQkJCQkJc2stPnNrX2ZvcndhcmRfYWxsb2MpKQorCQlyZXR1cm4gMTsKKworc3VwcHJlc3NfYWxsb2NhdGlvbjoKKworCWlmICgha2luZCkgeworCQlza19zdHJlYW1fbW9kZXJhdGVfc25kYnVmKHNrKTsKKworCQkvKiBGYWlsIG9ubHkgaWYgc29ja2V0IGlzIF91bmRlcl8gaXRzIHNuZGJ1Zi4KKwkJICogSW4gdGhpcyBjYXNlIHdlIGNhbm5vdCBibG9jaywgc28gdGhhdCB3ZSBoYXZlIHRvIGZhaWwuCisJCSAqLworCQlpZiAoc2stPnNrX3dtZW1fcXVldWVkICsgc2l6ZSA+PSBzay0+c2tfc25kYnVmKQorCQkJcmV0dXJuIDE7CisJfQorCisJLyogQWxhcy4gVW5kbyBjaGFuZ2VzLiAqLworCXNrLT5za19mb3J3YXJkX2FsbG9jIC09IGFtdCAqIFNLX1NUUkVBTV9NRU1fUVVBTlRVTTsKKwlhdG9taWNfc3ViKGFtdCwgc2stPnNrX3Byb3QtPm1lbW9yeV9hbGxvY2F0ZWQpOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHNrX3N0cmVhbV9tZW1fc2NoZWR1bGUpOworCit2b2lkIHNrX3N0cmVhbV9raWxsX3F1ZXVlcyhzdHJ1Y3Qgc29jayAqc2spCit7CisJLyogRmlyc3QgdGhlIHJlYWQgYnVmZmVyLiAqLworCV9fc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisKKwkvKiBOZXh0LCB0aGUgZXJyb3IgcXVldWUuICovCisJX19za2JfcXVldWVfcHVyZ2UoJnNrLT5za19lcnJvcl9xdWV1ZSk7CisKKwkvKiBOZXh0LCB0aGUgd3JpdGUgcXVldWUuICovCisJQlVHX1RSQVAoc2tiX3F1ZXVlX2VtcHR5KCZzay0+c2tfd3JpdGVfcXVldWUpKTsKKworCS8qIEFjY291bnQgZm9yIHJldHVybmVkIG1lbW9yeS4gKi8KKwlza19zdHJlYW1fbWVtX3JlY2xhaW0oc2spOworCisJQlVHX1RSQVAoIXNrLT5za193bWVtX3F1ZXVlZCk7CisJQlVHX1RSQVAoIXNrLT5za19mb3J3YXJkX2FsbG9jKTsKKworCS8qIEl0IGlzIF9pbXBvc3NpYmxlXyBmb3IgdGhlIGJhY2tsb2cgdG8gY29udGFpbiBhbnl0aGluZworCSAqIHdoZW4gd2UgZ2V0IGhlcmUuICBBbGwgdXNlciByZWZlcmVuY2VzIHRvIHRoaXMgc29ja2V0CisJICogaGF2ZSBnb25lIGF3YXksIG9ubHkgdGhlIG5ldCBsYXllciBrbm93cyBjYW4gdG91Y2ggaXQuCisJICovCit9CisKK0VYUE9SVF9TWU1CT0woc2tfc3RyZWFtX2tpbGxfcXVldWVzKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jIGIvbmV0L2NvcmUvc3lzY3RsX25ldF9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiZTY0NgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jCkBAIC0wLDAgKzEsMTgyIEBACisvKiAtKi0gbGludXgtYyAtKi0KKyAqIHN5c2N0bF9uZXRfY29yZS5jOiBzeXNjdGwgaW50ZXJmYWNlIHRvIG5ldCBjb3JlIHN1YnN5c3RlbS4KKyAqCisgKiBCZWd1biBBcHJpbCAxLCAxOTk2LCBNaWtlIFNoYXZlci4KKyAqIEFkZGVkIC9wcm9jL3N5cy9uZXQvY29yZSBkaXJlY3RvcnkgZW50cnkgKGVtcHR5ID0pICkuIFtNU10KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2lmZGVmIENPTkZJR19TWVNDVEwKKworZXh0ZXJuIGludCBuZXRkZXZfbWF4X2JhY2tsb2c7CitleHRlcm4gaW50IHdlaWdodF9wOworZXh0ZXJuIGludCBub19jb25nX3RocmVzaDsKK2V4dGVybiBpbnQgbm9fY29uZzsKK2V4dGVybiBpbnQgbG9fY29uZzsKK2V4dGVybiBpbnQgbW9kX2Nvbmc7CitleHRlcm4gaW50IG5ldGRldl9mYXN0cm91dGU7CitleHRlcm4gaW50IG5ldF9tc2dfY29zdDsKK2V4dGVybiBpbnQgbmV0X21zZ19idXJzdDsKKworZXh0ZXJuIF9fdTMyIHN5c2N0bF93bWVtX21heDsKK2V4dGVybiBfX3UzMiBzeXNjdGxfcm1lbV9tYXg7CitleHRlcm4gX191MzIgc3lzY3RsX3dtZW1fZGVmYXVsdDsKK2V4dGVybiBfX3UzMiBzeXNjdGxfcm1lbV9kZWZhdWx0OworCitleHRlcm4gaW50IHN5c2N0bF9jb3JlX2Rlc3Ryb3lfZGVsYXk7CitleHRlcm4gaW50IHN5c2N0bF9vcHRtZW1fbWF4OworZXh0ZXJuIGludCBzeXNjdGxfc29tYXhjb25uOworCisjaWZkZWYgQ09ORklHX05FVF9ESVZFUlQKK2V4dGVybiBjaGFyIHN5c2N0bF9kaXZlcnRfdmVyc2lvbltdOworI2VuZGlmIC8qIENPTkZJR19ORVRfRElWRVJUICovCisKKy8qCisgKiBUaGlzIHN0cmR1cCgpIGlzIHVzZWQgZm9yIGNyZWF0aW5nIGNvcGllcyBvZiBuZXR3b3JrIAorICogZGV2aWNlIG5hbWVzIHRvIGJlIGhhbmRlZCBvdmVyIHRvIHN5c2N0bC4KKyAqLworIAorY2hhciAqbmV0X3N5c2N0bF9zdHJkdXAoY29uc3QgY2hhciAqcykKK3sKKwljaGFyICpydiA9IGttYWxsb2Moc3RybGVuKHMpKzEsIEdGUF9LRVJORUwpOworCWlmIChydikKKwkJc3RyY3B5KHJ2LCBzKTsKKwlyZXR1cm4gcnY7Cit9CisKK2N0bF90YWJsZSBjb3JlX3RhYmxlW10gPSB7CisjaWZkZWYgQ09ORklHX05FVAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0NPUkVfV01FTV9NQVgsCisJCS5wcm9jbmFtZQk9ICJ3bWVtX21heCIsCisJCS5kYXRhCQk9ICZzeXNjdGxfd21lbV9tYXgsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfQ09SRV9STUVNX01BWCwKKwkJLnByb2NuYW1lCT0gInJtZW1fbWF4IiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9ybWVtX21heCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9DT1JFX1dNRU1fREVGQVVMVCwKKwkJLnByb2NuYW1lCT0gIndtZW1fZGVmYXVsdCIsCisJCS5kYXRhCQk9ICZzeXNjdGxfd21lbV9kZWZhdWx0LAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0NPUkVfUk1FTV9ERUZBVUxULAorCQkucHJvY25hbWUJPSAicm1lbV9kZWZhdWx0IiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9ybWVtX2RlZmF1bHQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfQ09SRV9ERVZfV0VJR0hULAorCQkucHJvY25hbWUJPSAiZGV2X3dlaWdodCIsCisJCS5kYXRhCQk9ICZ3ZWlnaHRfcCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9DT1JFX01BWF9CQUNLTE9HLAorCQkucHJvY25hbWUJPSAibmV0ZGV2X21heF9iYWNrbG9nIiwKKwkJLmRhdGEJCT0gJm5ldGRldl9tYXhfYmFja2xvZywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9DT1JFX05PX0NPTkdfVEhSRVNILAorCQkucHJvY25hbWUJPSAibm9fY29uZ190aHJlc2giLAorCQkuZGF0YQkJPSAmbm9fY29uZ190aHJlc2gsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfQ09SRV9OT19DT05HLAorCQkucHJvY25hbWUJPSAibm9fY29uZyIsCisJCS5kYXRhCQk9ICZub19jb25nLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0NPUkVfTE9fQ09ORywKKwkJLnByb2NuYW1lCT0gImxvX2NvbmciLAorCQkuZGF0YQkJPSAmbG9fY29uZywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9DT1JFX01PRF9DT05HLAorCQkucHJvY25hbWUJPSAibW9kX2NvbmciLAorCQkuZGF0YQkJPSAmbW9kX2NvbmcsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfQ09SRV9NU0dfQ09TVCwKKwkJLnByb2NuYW1lCT0gIm1lc3NhZ2VfY29zdCIsCisJCS5kYXRhCQk9ICZuZXRfbXNnX2Nvc3QsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9DT1JFX01TR19CVVJTVCwKKwkJLnByb2NuYW1lCT0gIm1lc3NhZ2VfYnVyc3QiLAorCQkuZGF0YQkJPSAmbmV0X21zZ19idXJzdCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfQ09SRV9PUFRNRU1fTUFYLAorCQkucHJvY25hbWUJPSAib3B0bWVtX21heCIsCisJCS5kYXRhCQk9ICZzeXNjdGxfb3B0bWVtX21heCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKyNpZmRlZiBDT05GSUdfTkVUX0RJVkVSVAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0NPUkVfRElWRVJUX1ZFUlNJT04sCisJCS5wcm9jbmFtZQk9ICJkaXZlcnRfdmVyc2lvbiIsCisJCS5kYXRhCQk9ICh2b2lkICopc3lzY3RsX2RpdmVydF92ZXJzaW9uLAorCQkubWF4bGVuCQk9IDMyLAorCQkubW9kZQkJPSAwNDQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9zdHJpbmcKKwl9LAorI2VuZGlmIC8qIENPTkZJR19ORVRfRElWRVJUICovCisjZW5kaWYgLyogQ09ORklHX05FVCAqLworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0NPUkVfU09NQVhDT05OLAorCQkucHJvY25hbWUJPSAic29tYXhjb25uIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9zb21heGNvbm4sCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK0VYUE9SVF9TWU1CT0wobmV0X3N5c2N0bF9zdHJkdXApOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3V0aWxzLmMgYi9uZXQvY29yZS91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMWE4NjUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvY29yZS91dGlscy5jCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICoJR2VuZXJpYyBhZGRyZXNzIHJlc3VsdGlvbiBlbnRpdHkKKyAqCisgKglBdXRob3JzOgorICoJbmV0X3JhbmRvbSBBbGFuIENveAorICoJbmV0X3JhdGVsaW1pdCBBbmR5IEtsZWVuCisgKgorICoJQ3JlYXRlZCBieSBBbGV4ZXkgS3V6bmV0c292IDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisKKy8qCisgIFRoaXMgaXMgYSBtYXhpbWFsbHkgZXF1aWRpc3RyaWJ1dGVkIGNvbWJpbmVkIFRhdXN3b3J0aGUgZ2VuZXJhdG9yCisgIGJhc2VkIG9uIGNvZGUgZnJvbSBHTlUgU2NpZW50aWZpYyBMaWJyYXJ5IDEuNSAoMzAgSnVuIDIwMDQpCisKKyAgIHhfbiA9IChzMV9uIF4gczJfbiBeIHMzX24pIAorCisgICBzMV97bisxfSA9ICgoKHMxX24gJiA0Mjk0OTY3Mjk0KSA8PDEyKSBeICgoKHMxX24gPDwxMykgXiBzMV9uKSA+PjE5KSkKKyAgIHMyX3tuKzF9ID0gKCgoczJfbiAmIDQyOTQ5NjcyODgpIDw8IDQpIF4gKCgoczJfbiA8PCAyKSBeIHMyX24pID4+MjUpKQorICAgczNfe24rMX0gPSAoKChzM19uICYgNDI5NDk2NzI4MCkgPDwxNykgXiAoKChzM19uIDw8IDMpIF4gczNfbikgPj4xMSkpCisKKyAgIFRoZSBwZXJpb2Qgb2YgdGhpcyBnZW5lcmF0b3IgaXMgYWJvdXQgMl44OC4KKworICAgRnJvbTogUC4gTCdFY3V5ZXIsICJNYXhpbWFsbHkgRXF1aWRpc3RyaWJ1dGVkIENvbWJpbmVkIFRhdXN3b3J0aGUKKyAgIEdlbmVyYXRvcnMiLCBNYXRoZW1hdGljcyBvZiBDb21wdXRhdGlvbiwgNjUsIDIxMyAoMTk5NiksIDIwMy0tMjEzLgorCisgICBUaGlzIGlzIGF2YWlsYWJsZSBvbiB0aGUgbmV0IGZyb20gTCdFY3V5ZXIncyBob21lIHBhZ2UsCisKKyAgIGh0dHA6Ly93d3cuaXJvLnVtb250cmVhbC5jYS9+bGVjdXllci9teWZ0cC9wYXBlcnMvdGF1c21lLnBzCisgICBmdHA6Ly9mdHAuaXJvLnVtb250cmVhbC5jYS9wdWIvc2ltdWxhdGlvbi9sZWN1eWVyL3BhcGVycy90YXVzbWUucHMgCisKKyAgIFRoZXJlIGlzIGFuIGVycmF0dW0gaW4gdGhlIHBhcGVyICJUYWJsZXMgb2YgTWF4aW1hbGx5CisgICBFcXVpZGlzdHJpYnV0ZWQgQ29tYmluZWQgTEZTUiBHZW5lcmF0b3JzIiwgTWF0aGVtYXRpY3Mgb2YKKyAgIENvbXB1dGF0aW9uLCA2OCwgMjI1ICgxOTk5KSwgMjYxLS0yNjk6CisgICBodHRwOi8vd3d3Lmlyby51bW9udHJlYWwuY2EvfmxlY3V5ZXIvbXlmdHAvcGFwZXJzL3RhdXNtZTIucHMKKworICAgICAgICAuLi4gdGhlIGtfaiBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2Ygel9qIG11c3QgYmUgbm9uLQorICAgICAgICB6ZXJvLCBmb3IgZWFjaCBqLiAoTm90ZTogdGhpcyByZXN0cmljdGlvbiBhbHNvIGFwcGxpZXMgdG8gdGhlIAorICAgICAgICBjb21wdXRlciBjb2RlIGdpdmVuIGluIFs0XSwgYnV0IHdhcyBtaXN0YWtlbmx5IG5vdCBtZW50aW9uZWQgaW4KKyAgICAgICAgdGhhdCBwYXBlci4pCisgICAKKyAgIFRoaXMgYWZmZWN0cyB0aGUgc2VlZGluZyBwcm9jZWR1cmUgYnkgaW1wb3NpbmcgdGhlIHJlcXVpcmVtZW50CisgICBzMSA+IDEsIHMyID4gNywgczMgPiAxNS4KKworKi8KK3N0cnVjdCBucm5kX3N0YXRlIHsKKwl1MzIgczEsIHMyLCBzMzsKK307CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbnJuZF9zdGF0ZSwgbmV0X3JhbmRfc3RhdGUpOworCitzdGF0aWMgdTMyIF9fbmV0X3JhbmRvbShzdHJ1Y3QgbnJuZF9zdGF0ZSAqc3RhdGUpCit7CisjZGVmaW5lIFRBVVNXT1JUSEUocyxhLGIsYyxkKSAoKHMmYyk8PGQpIF4gKCgocyA8PGEpIF4gcyk+PmIpCisKKwlzdGF0ZS0+czEgPSBUQVVTV09SVEhFKHN0YXRlLT5zMSwgMTMsIDE5LCA0Mjk0OTY3Mjk0VUwsIDEyKTsKKwlzdGF0ZS0+czIgPSBUQVVTV09SVEhFKHN0YXRlLT5zMiwgMiwgMjUsIDQyOTQ5NjcyODhVTCwgNCk7CisJc3RhdGUtPnMzID0gVEFVU1dPUlRIRShzdGF0ZS0+czMsIDMsIDExLCA0Mjk0OTY3MjgwVUwsIDE3KTsKKworCXJldHVybiAoc3RhdGUtPnMxIF4gc3RhdGUtPnMyIF4gc3RhdGUtPnMzKTsKK30KKworc3RhdGljIHZvaWQgX19uZXRfc3JhbmRvbShzdHJ1Y3QgbnJuZF9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGxvbmcgcykKK3sKKwlpZiAocyA9PSAwKQorCQlzID0gMTsgICAgICAvKiBkZWZhdWx0IHNlZWQgaXMgMSAqLworCisjZGVmaW5lIExDRyhuKSAoNjkwNjkgKiBuKQorCXN0YXRlLT5zMSA9IExDRyhzKTsKKwlzdGF0ZS0+czIgPSBMQ0coc3RhdGUtPnMxKTsKKwlzdGF0ZS0+czMgPSBMQ0coc3RhdGUtPnMyKTsKKworCS8qICJ3YXJtIGl0IHVwIiAqLworCV9fbmV0X3JhbmRvbShzdGF0ZSk7CisJX19uZXRfcmFuZG9tKHN0YXRlKTsKKwlfX25ldF9yYW5kb20oc3RhdGUpOworCV9fbmV0X3JhbmRvbShzdGF0ZSk7CisJX19uZXRfcmFuZG9tKHN0YXRlKTsKKwlfX25ldF9yYW5kb20oc3RhdGUpOworfQorCisKK3Vuc2lnbmVkIGxvbmcgbmV0X3JhbmRvbSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcjsKKwlzdHJ1Y3QgbnJuZF9zdGF0ZSAqc3RhdGUgPSAmZ2V0X2NwdV92YXIobmV0X3JhbmRfc3RhdGUpOworCXIgPSBfX25ldF9yYW5kb20oc3RhdGUpOworCXB1dF9jcHVfdmFyKHN0YXRlKTsKKwlyZXR1cm4gcjsKK30KKworCit2b2lkIG5ldF9zcmFuZG9tKHVuc2lnbmVkIGxvbmcgZW50cm9weSkKK3sKKwlzdHJ1Y3QgbnJuZF9zdGF0ZSAqc3RhdGUgPSAmZ2V0X2NwdV92YXIobmV0X3JhbmRfc3RhdGUpOworCV9fbmV0X3NyYW5kb20oc3RhdGUsIHN0YXRlLT5zMV5lbnRyb3B5KTsKKwlwdXRfY3B1X3ZhcihzdGF0ZSk7Cit9CisKK3ZvaWQgX19pbml0IG5ldF9yYW5kb21faW5pdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlzdHJ1Y3QgbnJuZF9zdGF0ZSAqc3RhdGUgPSAmcGVyX2NwdShuZXRfcmFuZF9zdGF0ZSxpKTsKKwkJX19uZXRfc3JhbmRvbShzdGF0ZSwgaStqaWZmaWVzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbmV0X3JhbmRvbV9yZXNlZWQodm9pZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHNlZWRbTlJfQ1BVU107CisKKwlnZXRfcmFuZG9tX2J5dGVzKHNlZWQsIHNpemVvZihzZWVkKSk7CisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlzdHJ1Y3QgbnJuZF9zdGF0ZSAqc3RhdGUgPSAmcGVyX2NwdShuZXRfcmFuZF9zdGF0ZSxpKTsKKwkJX19uZXRfc3JhbmRvbShzdGF0ZSwgc2VlZFtpXSk7CisJfQorCXJldHVybiAwOworfQorbGF0ZV9pbml0Y2FsbChuZXRfcmFuZG9tX3Jlc2VlZCk7CisKK2ludCBuZXRfbXNnX2Nvc3QgPSA1KkhaOworaW50IG5ldF9tc2dfYnVyc3QgPSAxMDsKKworLyogCisgKiBBbGwgbmV0IHdhcm5pbmcgcHJpbnRrKClzIHNob3VsZCBiZSBndWFyZGVkIGJ5IHRoaXMgZnVuY3Rpb24uCisgKi8gCitpbnQgbmV0X3JhdGVsaW1pdCh2b2lkKQoreworCXJldHVybiBfX3ByaW50a19yYXRlbGltaXQobmV0X21zZ19jb3N0LCBuZXRfbXNnX2J1cnN0KTsKK30KKworRVhQT1JUX1NZTUJPTChuZXRfcmFuZG9tKTsKK0VYUE9SVF9TWU1CT0wobmV0X3JhdGVsaW1pdCk7CitFWFBPUlRfU1lNQk9MKG5ldF9zcmFuZG9tKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3dpcmVsZXNzLmMgYi9uZXQvY29yZS93aXJlbGVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MGNjNWQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvY29yZS93aXJlbGVzcy5jCkBAIC0wLDAgKzEsMTQ1OSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpbXBsZW1lbnQgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbnMgQVBJcy4KKyAqCisgKiBBdXRob3JzIDoJSmVhbiBUb3VycmlsaGVzIC0gSFBMIC0gPGp0QGhwbC5ocC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNCBKZWFuIFRvdXJyaWxoZXMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogKEFzIGFsbCBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwsIHRoaXMgZmlsZSBpcyBHUEwpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIERPQ1VNRU5UQVRJT04gKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQVBJIGRlZmluaXRpb24gOgorICogLS0tLS0tLS0tLS0tLS0KKyAqIFNlZSA8bGludXgvd2lyZWxlc3MuaD4gZm9yIGRldGFpbHMgb2YgdGhlIEFQSXMgYW5kIHRoZSByZXN0LgorICoKKyAqIEhpc3RvcnkgOgorICogLS0tLS0tLQorICoKKyAqIHYxIC0gNS4xMi4wMSAtIEplYW4gSUkKKyAqCW8gQ3JlYXRlZCB0aGlzIGZpbGUuCisgKgorICogdjIgLSAxMy4xMi4wMSAtIEplYW4gSUkKKyAqCW8gTW92ZSAvcHJvYy9uZXQvd2lyZWxlc3Mgc3R1ZmYgZnJvbSBuZXQvY29yZS9kZXYuYyB0byBoZXJlCisgKglvIE1ha2UgV2lyZWxlc3MgRXh0ZW5zaW9uIElPQ1RMcyBnbyB0aHJvdWdoIGhlcmUKKyAqCW8gQWRkZWQgaXdfaGFuZGxlciBoYW5kbGluZyA7LSkKKyAqCW8gQWRkZWQgc3RhbmRhcmQgaW9jdGwgZGVzY3JpcHRpb24KKyAqCW8gSW5pdGlhbCBkdW1iIGNvbW1pdCBzdHJhdGVneSBiYXNlZCBvbiBvcmlub2NvLmMKKyAqCisgKiB2MyAtIDE5LjEyLjAxIC0gSmVhbiBJSQorICoJbyBNYWtlIHN1cmUgd2UgZG9uJ3QgZ28gb3V0IG9mIHN0YW5kYXJkX2lvY3RsW10gaW4gaW9jdGxfc3RhbmRhcmRfY2FsbAorICoJbyBBZGQgZXZlbnQgZGlzcGF0Y2hlciBmdW5jdGlvbgorICoJbyBBZGQgZXZlbnQgZGVzY3JpcHRpb24KKyAqCW8gUHJvcGFnYXRlIGV2ZW50cyBhcyBydG5ldGxpbmsgSUZMQV9XSVJFTEVTUyBvcHRpb24KKyAqCW8gR2VuZXJhdGUgZXZlbnQgb24gc2VsZWN0ZWQgU0VUIHJlcXVlc3RzCisgKgorICogdjQgLSAxOC4wNC4wMiAtIEplYW4gSUkKKyAqCW8gRml4IHN0dXBpZCBvZmYgYnkgb25lIGluIGl3X2lvY3RsX2Rlc2NyaXB0aW9uIDogSVdfRVNTSURfTUFYX1NJWkUgKyAxCisgKgorICogdjUgLSAyMS4wNi4wMiAtIEplYW4gSUkKKyAqCW8gQWRkIElXX1BSSVZfVFlQRV9BRERSIGluIHByaXZfdHlwZV9zaXplICgrY2xlYW51cCkKKyAqCW8gUmVzaHVmZmxlIElXX0hFQURFUl9UWVBFX1hYWCB0byBtYXAgSVdfUFJJVl9UWVBFX1hYWCBjaGFuZ2VzCisgKglvIEFkZCBJV0VWQ1VTVE9NIGZvciBkcml2ZXIgc3BlY2lmaWMgZXZlbnQvc2Nhbm5pbmcgdG9rZW4KKyAqCW8gVHVybiBvbiBXRV9TVFJJQ1RfV1JJVEUgYnkgZGVmYXVsdCArIGtlcm5lbCB3YXJuaW5nCisgKglvIEZpeCBXRV9TVFJJQ1RfV1JJVEUgaW4gaW9jdGxfZXhwb3J0X3ByaXZhdGUoKSAoMzIgPT4gaXdfbnVtKQorICoJbyBGaXggb2ZmLWJ5LW9uZSBpbiB0ZXN0IChleHRyYV9zaXplIDw9IElGTkFNU0laKQorICoKKyAqIHY2IC0gOS4wMS4wMyAtIEplYW4gSUkKKyAqCW8gQWRkIGNvbW1vbiBzcHkgc3VwcG9ydCA6IGl3X2hhbmRsZXJfc2V0X3NweSgpLCB3aXJlbGVzc19zcHlfdXBkYXRlKCkKKyAqCW8gQWRkIGVuaGFuY2VkIHNweSBzdXBwb3J0IDogaXdfaGFuZGxlcl9zZXRfdGhyc3B5KCkgYW5kIGV2ZW50LgorICoJbyBBZGQgV0lSRUxFU1NfRVhUIHZlcnNpb24gZGlzcGxheSBpbiAvcHJvYy9uZXQvd2lyZWxlc3MKKyAqCisgKiB2NiAtIDE4LjA2LjA0IC0gSmVhbiBJSQorICoJbyBDaGFuZ2UgZ2V0X3NweWRhdGEoKSBtZXRob2QgZm9yIGFkZGVkIHNhZmV0eQorICoJbyBSZW1vdmUgc3B5ICNpZmRlZiwgdGhleSBhcmUgYWx3YXlzIG9uIC0+IGNsZWFuZXIgY29kZQorICoJbyBBbGxvdyBhbnkgc2l6ZSBHRVQgcmVxdWVzdCBpZiB1c2VyIHNwZWNpZmllcyBsZW5ndGggPiBtYXgKKyAqCQlhbmQgaWYgcmVxdWVzdCBoYXMgSVdfREVTQ1JfRkxBR19OT01BWCBmbGFnIG9yIGlzIFNJT0NHSVdQUklWCisgKglvIFN0YXJ0IG1pZ3JhdGluZyBnZXRfd2lyZWxlc3Nfc3RhdHMgdG8gc3RydWN0IGl3X2hhbmRsZXJfZGVmCisgKglvIEFkZCB3bWIoKSBpbiBpd19oYW5kbGVyX3NldF9zcHkoKSBmb3Igbm9uLWNvaGVyZW50IGFyY2hzL2NwdXMKKyAqIEJhc2VkIG9uIHBhdGNoIGZyb20gUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz4gOgorICoJbyBGaXgga2VybmVsIGRhdGEgbGVhayB0byB1c2VyIHNwYWNlIGluIHByaXZhdGUgaGFuZGxlciBoYW5kbGluZworICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTkNMVURFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgkJLyogTm90IG5lZWRlZCA/Pz8gKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgkJLyogb2ZmX3QgKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4JCS8qIHN0cnVjdCBpZnJlcSwgZGV2X2dldF9ieV9uYW1lKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CQkvKiBydG5ldGxpbmsgc3R1ZmYgKi8KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4JCQkvKiBmb3IgX19pbml0ICovCisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CQkvKiBBUlBIUkRfRVRIRVIgKi8KKworI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CQkvKiBQcmV0dHkgb2J2aW91cyAqLworI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CQkvKiBOZXcgZHJpdmVyIEFQSSAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4JCS8qIGNvcHlfdG9fdXNlcigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTlNUQU5UUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEZWJ1Z2dpbmcgc3R1ZmYgKi8KKyN1bmRlZiBXRV9JT0NUTF9ERUJVRwkJLyogRGVidWcgSU9DVEwgQVBJICovCisjdW5kZWYgV0VfRVZFTlRfREVCVUcJCS8qIERlYnVnIEV2ZW50IGRpc3BhdGNoZXIgKi8KKyN1bmRlZiBXRV9TUFlfREVCVUcJCS8qIERlYnVnIGVuaGFuY2VkIHNweSBzdXBwb3J0ICovCisKKy8qIE9wdGlvbnMgKi8KKyNkZWZpbmUgV0VfRVZFTlRfTkVUTElOSwkvKiBQcm9wYWdhdGUgZXZlbnRzIHVzaW5nIHJ0bmV0bGluayAqLworI2RlZmluZSBXRV9TRVRfRVZFTlQJCS8qIEdlbmVyYXRlIGFuIGV2ZW50IG9uIHNvbWUgc2V0IGNvbW1hbmRzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIEdMT0JBTCBWQVJJQUJMRVMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBZb3Ugc2hvdWxkIG5vdCB1c2UgZ2xvYmFsIHZhcmlhYmxlcywgYmVjYXVzZSBvZiByZS1lbnRyYW5jeS4KKyAqIE9uIG91ciBjYXNlLCBpdCdzIG9ubHkgY29uc3QsIHNvIGl0J3MgT0suLi4KKyAqLworLyoKKyAqIE1ldGEtZGF0YSBhYm91dCBhbGwgdGhlIHN0YW5kYXJkIFdpcmVsZXNzIEV4dGVuc2lvbiByZXF1ZXN0IHdlCisgKiBrbm93IGFib3V0LgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X2lvY3RsX2Rlc2NyaXB0aW9uIHN0YW5kYXJkX2lvY3RsW10gPSB7CisJW1NJT0NTSVdDT01NSVQJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX05VTEwsCisJfSwKKwlbU0lPQ0dJV05BTUUJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX0NIQVIsCisJCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0RVTVAsCisJfSwKKwlbU0lPQ1NJV05XSUQJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAorCQkuZmxhZ3MJCT0gSVdfREVTQ1JfRkxBR19FVkVOVCwKKwl9LAorCVtTSU9DR0lXTldJRAktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCisJCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0RVTVAsCisJfSwKKwlbU0lPQ1NJV0ZSRVEJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX0ZSRVEsCisJCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0VWRU5ULAorCX0sCisJW1NJT0NHSVdGUkVRCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9GUkVRLAorCQkuZmxhZ3MJCT0gSVdfREVTQ1JfRkxBR19EVU1QLAorCX0sCisJW1NJT0NTSVdNT0RFCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9VSU5ULAorCQkuZmxhZ3MJCT0gSVdfREVTQ1JfRkxBR19FVkVOVCwKKwl9LAorCVtTSU9DR0lXTU9ERQktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfVUlOVCwKKwkJLmZsYWdzCQk9IElXX0RFU0NSX0ZMQUdfRFVNUCwKKwl9LAorCVtTSU9DU0lXU0VOUwktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCisJfSwKKwlbU0lPQ0dJV1NFTlMJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAorCX0sCisJW1NJT0NTSVdSQU5HRQktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfTlVMTCwKKwl9LAorCVtTSU9DR0lXUkFOR0UJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAorCQkudG9rZW5fc2l6ZQk9IDEsCisJCS5tYXhfdG9rZW5zCT0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSksCisJCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0RVTVAsCisJfSwKKwlbU0lPQ1NJV1BSSVYJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX05VTEwsCisJfSwKKwlbU0lPQ0dJV1BSSVYJLSBTSU9DSVdGSVJTVF0gPSB7IC8qIChoYW5kbGVkIGRpcmVjdGx5IGJ5IHVzKSAqLworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9OVUxMLAorCX0sCisJW1NJT0NTSVdTVEFUUwktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfTlVMTCwKKwl9LAorCVtTSU9DR0lXU1RBVFMJLSBTSU9DSVdGSVJTVF0gPSB7IC8qIChoYW5kbGVkIGRpcmVjdGx5IGJ5IHVzKSAqLworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9OVUxMLAorCQkuZmxhZ3MJCT0gSVdfREVTQ1JfRkxBR19EVU1QLAorCX0sCisJW1NJT0NTSVdTUFkJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAorCQkudG9rZW5fc2l6ZQk9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpLAorCQkubWF4X3Rva2Vucwk9IElXX01BWF9TUFksCisJfSwKKwlbU0lPQ0dJV1NQWQktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgKworCQkJCSAgc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSwKKwkJLm1heF90b2tlbnMJPSBJV19NQVhfU1BZLAorCX0sCisJW1NJT0NTSVdUSFJTUFkJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAorCQkudG9rZW5fc2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXdfdGhyc3B5KSwKKwkJLm1pbl90b2tlbnMJPSAxLAorCQkubWF4X3Rva2Vucwk9IDEsCisJfSwKKwlbU0lPQ0dJV1RIUlNQWQktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gc2l6ZW9mKHN0cnVjdCBpd190aHJzcHkpLAorCQkubWluX3Rva2Vucwk9IDEsCisJCS5tYXhfdG9rZW5zCT0gMSwKKwl9LAorCVtTSU9DU0lXQVAJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX0FERFIsCisJfSwKKwlbU0lPQ0dJV0FQCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9BRERSLAorCQkuZmxhZ3MJCT0gSVdfREVTQ1JfRkxBR19EVU1QLAorCX0sCisJW1NJT0NHSVdBUExJU1QJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAorCQkudG9rZW5fc2l6ZQk9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpICsKKwkJCQkgIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSksCisJCS5tYXhfdG9rZW5zCT0gSVdfTUFYX0FQLAorCQkuZmxhZ3MJCT0gSVdfREVTQ1JfRkxBR19OT01BWCwKKwl9LAorCVtTSU9DU0lXU0NBTgktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCisJfSwKKwlbU0lPQ0dJV1NDQU4JLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAorCQkudG9rZW5fc2l6ZQk9IDEsCisJCS5tYXhfdG9rZW5zCT0gSVdfU0NBTl9NQVhfREFUQSwKKwkJLmZsYWdzCQk9IElXX0RFU0NSX0ZMQUdfTk9NQVgsCisJfSwKKwlbU0lPQ1NJV0VTU0lECS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKKwkJLnRva2VuX3NpemUJPSAxLAorCQkubWF4X3Rva2Vucwk9IElXX0VTU0lEX01BWF9TSVpFICsgMSwKKwkJLmZsYWdzCQk9IElXX0RFU0NSX0ZMQUdfRVZFTlQsCisJfSwKKwlbU0lPQ0dJV0VTU0lECS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKKwkJLnRva2VuX3NpemUJPSAxLAorCQkubWF4X3Rva2Vucwk9IElXX0VTU0lEX01BWF9TSVpFICsgMSwKKwkJLmZsYWdzCQk9IElXX0RFU0NSX0ZMQUdfRFVNUCwKKwl9LAorCVtTSU9DU0lXTklDS04JLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAorCQkudG9rZW5fc2l6ZQk9IDEsCisJCS5tYXhfdG9rZW5zCT0gSVdfRVNTSURfTUFYX1NJWkUgKyAxLAorCX0sCisJW1NJT0NHSVdOSUNLTgktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gMSwKKwkJLm1heF90b2tlbnMJPSBJV19FU1NJRF9NQVhfU0laRSArIDEsCisJfSwKKwlbU0lPQ1NJV1JBVEUJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAorCX0sCisJW1NJT0NHSVdSQVRFCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKKwl9LAorCVtTSU9DU0lXUlRTCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKKwl9LAorCVtTSU9DR0lXUlRTCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKKwl9LAorCVtTSU9DU0lXRlJBRwktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCisJfSwKKwlbU0lPQ0dJV0ZSQUcJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAorCX0sCisJW1NJT0NTSVdUWFBPVwktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCisJfSwKKwlbU0lPQ0dJV1RYUE9XCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKKwl9LAorCVtTSU9DU0lXUkVUUlkJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAorCX0sCisJW1NJT0NHSVdSRVRSWQktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCisJfSwKKwlbU0lPQ1NJV0VOQ09ERQktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gMSwKKwkJLm1heF90b2tlbnMJPSBJV19FTkNPRElOR19UT0tFTl9NQVgsCisJCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0VWRU5UIHwgSVdfREVTQ1JfRkxBR19SRVNUUklDVCwKKwl9LAorCVtTSU9DR0lXRU5DT0RFCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKKwkJLnRva2VuX3NpemUJPSAxLAorCQkubWF4X3Rva2Vucwk9IElXX0VOQ09ESU5HX1RPS0VOX01BWCwKKwkJLmZsYWdzCQk9IElXX0RFU0NSX0ZMQUdfRFVNUCB8IElXX0RFU0NSX0ZMQUdfUkVTVFJJQ1QsCisJfSwKKwlbU0lPQ1NJV1BPV0VSCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKKwl9LAorCVtTSU9DR0lXUE9XRVIJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAorCX0sCit9Oworc3RhdGljIGNvbnN0IGludCBzdGFuZGFyZF9pb2N0bF9udW0gPSAoc2l6ZW9mKHN0YW5kYXJkX2lvY3RsKSAvCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdfaW9jdGxfZGVzY3JpcHRpb24pKTsKKworLyoKKyAqIE1ldGEtZGF0YSBhYm91dCBhbGwgdGhlIGFkZGl0aW9uYWwgc3RhbmRhcmQgV2lyZWxlc3MgRXh0ZW5zaW9uIGV2ZW50cworICogd2Uga25vdyBhYm91dC4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19pb2N0bF9kZXNjcmlwdGlvbiBzdGFuZGFyZF9ldmVudFtdID0geworCVtJV0VWVFhEUk9QCS0gSVdFVkZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfQUREUiwKKwl9LAorCVtJV0VWUVVBTAktIElXRVZGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1FVQUwsCisJfSwKKwlbSVdFVkNVU1RPTQktIElXRVZGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAorCQkudG9rZW5fc2l6ZQk9IDEsCisJCS5tYXhfdG9rZW5zCT0gSVdfQ1VTVE9NX01BWCwKKwl9LAorCVtJV0VWUkVHSVNURVJFRAktIElXRVZGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX0FERFIsCisJfSwKKwlbSVdFVkVYUElSRUQJLSBJV0VWRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9BRERSLCAKKwl9LAorfTsKK3N0YXRpYyBjb25zdCBpbnQgc3RhbmRhcmRfZXZlbnRfbnVtID0gKHNpemVvZihzdGFuZGFyZF9ldmVudCkgLworCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGl3X2lvY3RsX2Rlc2NyaXB0aW9uKSk7CisKKy8qIFNpemUgKGluIGJ5dGVzKSBvZiB0aGUgdmFyaW91cyBwcml2YXRlIGRhdGEgdHlwZXMgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGl3X3ByaXZfdHlwZV9zaXplW10gPSB7CisJMCwJCQkJLyogSVdfUFJJVl9UWVBFX05PTkUgKi8KKwkxLAkJCQkvKiBJV19QUklWX1RZUEVfQllURSAqLworCTEsCQkJCS8qIElXX1BSSVZfVFlQRV9DSEFSICovCisJMCwJCQkJLyogTm90IGRlZmluZWQgKi8KKwlzaXplb2YoX191MzIpLAkJCS8qIElXX1BSSVZfVFlQRV9JTlQgKi8KKwlzaXplb2Yoc3RydWN0IGl3X2ZyZXEpLAkJLyogSVdfUFJJVl9UWVBFX0ZMT0FUICovCisJc2l6ZW9mKHN0cnVjdCBzb2NrYWRkciksCS8qIElXX1BSSVZfVFlQRV9BRERSICovCisJMCwJCQkJLyogTm90IGRlZmluZWQgKi8KK307CisKKy8qIFNpemUgKGluIGJ5dGVzKSBvZiB2YXJpb3VzIGV2ZW50cyAqLworc3RhdGljIGNvbnN0IGludCBldmVudF90eXBlX3NpemVbXSA9IHsKKwlJV19FVl9MQ1BfTEVOLAkJCS8qIElXX0hFQURFUl9UWVBFX05VTEwgKi8KKwkwLAorCUlXX0VWX0NIQVJfTEVOLAkJCS8qIElXX0hFQURFUl9UWVBFX0NIQVIgKi8KKwkwLAorCUlXX0VWX1VJTlRfTEVOLAkJCS8qIElXX0hFQURFUl9UWVBFX1VJTlQgKi8KKwlJV19FVl9GUkVRX0xFTiwJCQkvKiBJV19IRUFERVJfVFlQRV9GUkVRICovCisJSVdfRVZfQUREUl9MRU4sCQkJLyogSVdfSEVBREVSX1RZUEVfQUREUiAqLworCTAsCisJSVdfRVZfUE9JTlRfTEVOLAkJLyogV2l0aG91dCB2YXJpYWJsZSBwYXlsb2FkICovCisJSVdfRVZfUEFSQU1fTEVOLAkJLyogSVdfSEVBREVSX1RZUEVfUEFSQU0gKi8KKwlJV19FVl9RVUFMX0xFTiwJCQkvKiBJV19IRUFERVJfVFlQRV9RVUFMICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqIENPTU1PTiBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogU3R1ZmYgdGhhdCBtYXkgYmUgdXNlZCBpbiB2YXJpb3VzIHBsYWNlIG9yIGRvZXNuJ3QgZml0IGluIG9uZQorICogb2YgdGhlIHNlY3Rpb24gYmVsb3cuCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFJldHVybiB0aGUgZHJpdmVyIGhhbmRsZXIgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgV2lyZWxlc3MgRXh0ZW5zaW9uLgorICogQ2FsbGVkIGZyb20gdmFyaW91cyBwbGFjZSwgc28gbWFrZSBzdXJlIGl0IHJlbWFpbnMgZWZmaWNpZW50LgorICovCitzdGF0aWMgaW5saW5lIGl3X2hhbmRsZXIgZ2V0X2hhbmRsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBjbWQpCit7CisJLyogRG9uJ3QgIm9wdGltaXNlIiB0aGUgZm9sbG93aW5nIHZhcmlhYmxlLCBpdCB3aWxsIGNyYXNoICovCisJdW5zaWduZWQgaW50CWluZGV4OwkJLyogKk1VU1QqIGJlIHVuc2lnbmVkICovCisKKwkvKiBDaGVjayBpZiB3ZSBoYXZlIHNvbWUgd2lyZWxlc3MgaGFuZGxlcnMgZGVmaW5lZCAqLworCWlmKGRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBUcnkgYXMgYSBzdGFuZGFyZCBjb21tYW5kICovCisJaW5kZXggPSBjbWQgLSBTSU9DSVdGSVJTVDsKKwlpZihpbmRleCA8IGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPm51bV9zdGFuZGFyZCkKKwkJcmV0dXJuIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPnN0YW5kYXJkW2luZGV4XTsKKworCS8qIFRyeSBhcyBhIHByaXZhdGUgY29tbWFuZCAqLworCWluZGV4ID0gY21kIC0gU0lPQ0lXRklSU1RQUklWOworCWlmKGluZGV4IDwgZGV2LT53aXJlbGVzc19oYW5kbGVycy0+bnVtX3ByaXZhdGUpCisJCXJldHVybiBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5wcml2YXRlW2luZGV4XTsKKworCS8qIE5vdCBmb3VuZCAqLworCXJldHVybiBOVUxMOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogR2V0IHN0YXRpc3RpY3Mgb3V0IG9mIHRoZSBkcml2ZXIKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogTmV3IGxvY2F0aW9uICovCisJaWYoKGRldi0+d2lyZWxlc3NfaGFuZGxlcnMgIT0gTlVMTCkgJiYKKwkgICAoZGV2LT53aXJlbGVzc19oYW5kbGVycy0+Z2V0X3dpcmVsZXNzX3N0YXRzICE9IE5VTEwpKQorCQlyZXR1cm4gZGV2LT53aXJlbGVzc19oYW5kbGVycy0+Z2V0X3dpcmVsZXNzX3N0YXRzKGRldik7CisKKwkvKiBPbGQgbG9jYXRpb24sIHdpbGwgYmUgcGhhc2VkIG91dCBpbiBuZXh0IFdFICovCisJcmV0dXJuIChkZXYtPmdldF93aXJlbGVzc19zdGF0cyA/CisJCWRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzKGRldikgOgorCQkoc3RydWN0IGl3X3N0YXRpc3RpY3MgKikgTlVMTCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBDYWxsIHRoZSBjb21taXQgaGFuZGxlciBpbiB0aGUgZHJpdmVyCisgKiAoaWYgZXhpc3QgYW5kIGlmIGNvbmRpdGlvbnMgYXJlIHJpZ2h0KQorICoKKyAqIE5vdGUgOiBvdXIgY3VycmVudCBjb21taXQgc3RyYXRlZ3kgaXMgY3VycmVudGx5IHByZXR0eSBkdW1iLAorICogYnV0IHdlIHdpbGwgYmUgYWJsZSB0byBpbXByb3ZlIG9uIHRoYXQuLi4KKyAqIFRoZSBnb2FsIGlzIHRvIHRyeSB0byBhZ3JlYWdhdGUgYXMgbWFueSBjaGFuZ2VzIGFzIHBvc3NpYmxlCisgKiBiZWZvcmUgZG9pbmcgdGhlIGNvbW1pdC4gRHJpdmVycyB0aGF0IHdpbGwgZGVmaW5lIGEgY29tbWl0IGhhbmRsZXIKKyAqIGFyZSB1c3VhbGx5IHRob3NlIHRoYXQgbmVlZCBhIHJlc2V0IGFmdGVyIGNoYW5naW5nIHBhcmFtZXRlcnMsIHNvCisgKiB3ZSB3YW50IHRvIG1pbmltaXNlIHRoZSBudW1iZXIgb2YgcmVzZXQuCisgKiBBIGNvb2wgaWRlYSBpcyB0byB1c2UgYSB0aW1lciA6IGF0IGVhY2ggInNldCIgY29tbWFuZCwgd2UgcmUtc2V0IHRoZQorICogdGltZXIsIHdoZW4gdGhlIHRpbWVyIGV2ZW50dWFsbHkgZmlyZXMsIHdlIGNhbGwgdGhlIGRyaXZlci4KKyAqIEhvcGVmdWxseSwgbW9yZSBvbiB0aGF0IGxhdGVyLgorICoKKyAqIEFsc28sIEknbSB3YWl0aW5nIHRvIHNlZSBob3cgbWFueSBwZW9wbGUgd2lsbCBjb21wbGFpbiBhYm91dCB0aGUKKyAqIG5ldGlmX3J1bm5pbmcoZGV2KSB0ZXN0LiBJJ20gb3BlbiBvbiB0aGF0IG9uZS4uLgorICogSG9wZWZ1bGx5LCB0aGUgZHJpdmVyIHdpbGwgcmVtZW1iZXIgdG8gZG8gYSBjb21taXQgaW4gIm9wZW4oKSIgOy0pCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNhbGxfY29tbWl0X2hhbmRsZXIoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisJaWYoKG5ldGlmX3J1bm5pbmcoZGV2KSkgJiYKKwkgICAoZGV2LT53aXJlbGVzc19oYW5kbGVycy0+c3RhbmRhcmRbMF0gIT0gTlVMTCkpIHsKKwkJLyogQ2FsbCB0aGUgY29tbWl0IGhhbmRsZXIgb24gdGhlIGRyaXZlciAqLworCQlyZXR1cm4gZGV2LT53aXJlbGVzc19oYW5kbGVycy0+c3RhbmRhcmRbMF0oZGV2LCBOVUxMLAorCQkJCQkJCSAgIE5VTEwsIE5VTEwpOworCX0gZWxzZQorCQlyZXR1cm4gMDsJCS8qIENvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAqLworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogQ2FsY3VsYXRlIHNpemUgb2YgcHJpdmF0ZSBhcmd1bWVudHMKKyAqLworc3RhdGljIGlubGluZSBpbnQgZ2V0X3ByaXZfc2l6ZShfX3UxNglhcmdzKQoreworCWludAludW0gPSBhcmdzICYgSVdfUFJJVl9TSVpFX01BU0s7CisJaW50CXR5cGUgPSAoYXJncyAmIElXX1BSSVZfVFlQRV9NQVNLKSA+PiAxMjsKKworCXJldHVybiBudW0gKiBpd19wcml2X3R5cGVfc2l6ZVt0eXBlXTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFJlLWNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiBwcml2YXRlIGFyZ3VtZW50cworICovCitzdGF0aWMgaW5saW5lIGludCBhZGp1c3RfcHJpdl9zaXplKF9fdTE2CQlhcmdzLAorCQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKgl3cnF1KQoreworCWludAludW0gPSB3cnF1LT5kYXRhLmxlbmd0aDsKKwlpbnQJbWF4ID0gYXJncyAmIElXX1BSSVZfU0laRV9NQVNLOworCWludAl0eXBlID0gKGFyZ3MgJiBJV19QUklWX1RZUEVfTUFTSykgPj4gMTI7CisKKwkvKiBNYWtlIHN1cmUgdGhlIGRyaXZlciBkb2Vzbid0IGdvb2YgdXAgKi8KKwlpZiAobWF4IDwgbnVtKQorCQludW0gPSBtYXg7CisKKwlyZXR1cm4gbnVtICogaXdfcHJpdl90eXBlX3NpemVbdHlwZV07Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqIC9wcm9jL25ldC93aXJlbGVzcyBTVVBQT1JUICoqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFRoZSAvcHJvYy9uZXQvd2lyZWxlc3MgZmlsZSBpcyBhIGh1bWFuIHJlYWRhYmxlIHVzZXItc3BhY2UgaW50ZXJmYWNlCisgKiBleHBvcnRpbmcgdmFyaW91cyB3aXJlbGVzcyBzcGVjaWZpYyBzdGF0aXN0aWNzIGZyb20gdGhlIHdpcmVsZXNzIGRldmljZXMuCisgKiBUaGlzIGlzIHRoZSBtb3N0IHBvcHVsYXIgcGFydCBvZiB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9ucyA7LSkKKyAqCisgKiBUaGlzIGludGVyZmFjZSBpcyBhIHB1cmUgY2xvbmUgb2YgL3Byb2MvbmV0L2RldiAoaW4gbmV0L2NvcmUvZGV2LmMpLgorICogVGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgaXMgYmFzaWNhbGx5IHRoZSBjb250ZW50IG9mICJzdHJ1Y3QgaXdfc3RhdGlzdGljcyIuCisgKi8KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBQcmludCBvbmUgZW50cnkgKGxpbmUpIG9mIC9wcm9jL25ldC93aXJlbGVzcworICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHdpcmVsZXNzX3NlcV9wcmludGZfc3RhdHMoc3RydWN0IHNlcV9maWxlICpzZXEsCisJCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBHZXQgc3RhdHMgZnJvbSB0aGUgZHJpdmVyICovCisJc3RydWN0IGl3X3N0YXRpc3RpY3MgKnN0YXRzID0gZ2V0X3dpcmVsZXNzX3N0YXRzKGRldik7CisKKwlpZiAoc3RhdHMpIHsKKwkJc2VxX3ByaW50ZihzZXEsICIlNnM6ICUwNHggICUzZCVjICAlM2QlYyAgJTNkJWMgICU2ZCAlNmQgJTZkICIKKwkJCQkiJTZkICU2ZCAgICU2ZFxuIiwKKwkJCSAgIGRldi0+bmFtZSwgc3RhdHMtPnN0YXR1cywgc3RhdHMtPnF1YWwucXVhbCwKKwkJCSAgIHN0YXRzLT5xdWFsLnVwZGF0ZWQgJiBJV19RVUFMX1FVQUxfVVBEQVRFRAorCQkJICAgPyAnLicgOiAnICcsCisJCQkgICAoKF9fdTgpIHN0YXRzLT5xdWFsLmxldmVsKSwKKwkJCSAgIHN0YXRzLT5xdWFsLnVwZGF0ZWQgJiBJV19RVUFMX0xFVkVMX1VQREFURUQKKwkJCSAgID8gJy4nIDogJyAnLAorCQkJICAgKChfX3U4KSBzdGF0cy0+cXVhbC5ub2lzZSksCisJCQkgICBzdGF0cy0+cXVhbC51cGRhdGVkICYgSVdfUVVBTF9OT0lTRV9VUERBVEVECisJCQkgICA/ICcuJyA6ICcgJywKKwkJCSAgIHN0YXRzLT5kaXNjYXJkLm53aWQsIHN0YXRzLT5kaXNjYXJkLmNvZGUsCisJCQkgICBzdGF0cy0+ZGlzY2FyZC5mcmFnbWVudCwgc3RhdHMtPmRpc2NhcmQucmV0cmllcywKKwkJCSAgIHN0YXRzLT5kaXNjYXJkLm1pc2MsIHN0YXRzLT5taXNzLmJlYWNvbik7CisJCXN0YXRzLT5xdWFsLnVwZGF0ZWQgPSAwOworCX0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFByaW50IGluZm8gZm9yIC9wcm9jL25ldC93aXJlbGVzcyAocHJpbnQgYWxsIGVudHJpZXMpCisgKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3Nfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlzZXFfcHJpbnRmKHNlcSwgIkludGVyLXwgc3RhLXwgICBRdWFsaXR5ICAgICAgICB8ICAgRGlzY2FyZGVkICIKKwkJCQkicGFja2V0cyAgICAgICAgICAgICAgIHwgTWlzc2VkIHwgV0VcbiIKKwkJCQkiIGZhY2UgfCB0dXMgfCBsaW5rIGxldmVsIG5vaXNlIHwgIG53aWQgICIKKwkJCQkiY3J5cHQgICBmcmFnICByZXRyeSAgIG1pc2MgfCBiZWFjb24gfCAlZFxuIiwKKwkJCSAgIFdJUkVMRVNTX0VYVCk7CisJZWxzZQorCQl3aXJlbGVzc19zZXFfcHJpbnRmX3N0YXRzKHNlcSwgdik7CisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiB2b2lkICpkZXZfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcyk7CitleHRlcm4gdm9pZCAqZGV2X3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcyk7CitleHRlcm4gdm9pZCBkZXZfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpOworCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHdpcmVsZXNzX3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gZGV2X3NlcV9zdGFydCwKKwkubmV4dCAgPSBkZXZfc2VxX25leHQsCisJLnN0b3AgID0gZGV2X3NlcV9zdG9wLAorCS5zaG93ICA9IHdpcmVsZXNzX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCB3aXJlbGVzc19zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJndpcmVsZXNzX3NlcV9vcHMpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3aXJlbGVzc19zZXFfZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgPSB3aXJlbGVzc19zZXFfb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworCitpbnQgX19pbml0IHdpcmVsZXNzX3Byb2NfaW5pdCh2b2lkKQoreworCWlmICghcHJvY19uZXRfZm9wc19jcmVhdGUoIndpcmVsZXNzIiwgU19JUlVHTywgJndpcmVsZXNzX3NlcV9mb3BzKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgkvKiBDT05GSUdfUFJPQ19GUyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogSU9DVEwgU1VQUE9SVCAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGUgb3JpZ2luYWwgdXNlciBzcGFjZSBBUEkgdG8gY29uZmlndXJlIGFsbCB0aG9zZSBXaXJlbGVzcyBFeHRlbnNpb25zCisgKiBpcyB0aHJvdWdoIElPQ1RMcy4KKyAqIEluIHRoZXJlLCB3ZSBjaGVjayBpZiB3ZSBuZWVkIHRvIGNhbGwgdGhlIG5ldyBkcml2ZXIgQVBJIChpd19oYW5kbGVyKQorICogb3IganVzdCBjYWxsIHRoZSBkcml2ZXIgaW9jdGwgaGFuZGxlci4KKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICoJQWxsb3cgcHJvZ3JhbWF0aWMgYWNjZXNzIHRvIC9wcm9jL25ldC93aXJlbGVzcyBldmVuIGlmIC9wcm9jCisgKglkb2Vzbid0IGV4aXN0Li4uIEFsc28gbW9yZSBlZmZpY2llbnQuLi4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZGV2X2l3c3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIpCit7CisJLyogR2V0IHN0YXRzIGZyb20gdGhlIGRyaXZlciAqLworCXN0cnVjdCBpd19zdGF0aXN0aWNzICpzdGF0czsKKworCXN0YXRzID0gZ2V0X3dpcmVsZXNzX3N0YXRzKGRldik7CisJaWYgKHN0YXRzICE9IChzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqKSBOVUxMKSB7CisJCXN0cnVjdCBpd3JlcSAqCXdycSA9IChzdHJ1Y3QgaXdyZXEgKilpZnI7CisKKwkJLyogQ29weSBzdGF0aXN0aWNzIHRvIHRoZSB1c2VyIGJ1ZmZlciAqLworCQlpZihjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgc3RhdHMsCisJCQkJc2l6ZW9mKHN0cnVjdCBpd19zdGF0aXN0aWNzKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNsZWFyIHRoZSB1cGRhdGUgZmxhZyAqLworCQlpZih3cnEtPnUuZGF0YS5mbGFncyAhPSAwKQorCQkJc3RhdHMtPnF1YWwudXBkYXRlZCA9IDA7CisJCXJldHVybiAwOworCX0gZWxzZQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBFeHBvcnQgdGhlIGRyaXZlciBwcml2YXRlIGhhbmRsZXIgZGVmaW5pdGlvbgorICogVGhleSB3aWxsIGJlIHBpY2tlZCB1cCBieSB0b29scyBsaWtlIGl3cHJpdi4uLgorICovCitzdGF0aWMgaW5saW5lIGludCBpb2N0bF9leHBvcnRfcHJpdmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKKwkJCQkgICAgICAgc3RydWN0IGlmcmVxICoJCWlmcikKK3sKKwlzdHJ1Y3QgaXdyZXEgKgkJCQlpd3IgPSAoc3RydWN0IGl3cmVxICopIGlmcjsKKworCS8qIENoZWNrIGlmIHRoZSBkcml2ZXIgaGFzIHNvbWV0aGluZyB0byBleHBvcnQgKi8KKwlpZigoZGV2LT53aXJlbGVzc19oYW5kbGVycy0+bnVtX3ByaXZhdGVfYXJncyA9PSAwKSB8fAorCSAgIChkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5wcml2YXRlX2FyZ3MgPT0gTlVMTCkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCS8qIENoZWNrIE5VTEwgcG9pbnRlciAqLworCWlmKGl3ci0+dS5kYXRhLnBvaW50ZXIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBDaGVjayBpZiB0aGVyZSBpcyBlbm91Z2ggYnVmZmVyIHVwIHRoZXJlICovCisJaWYoaXdyLT51LmRhdGEubGVuZ3RoIDwgZGV2LT53aXJlbGVzc19oYW5kbGVycy0+bnVtX3ByaXZhdGVfYXJncykgeworCQkvKiBVc2VyIHNwYWNlIGNhbid0IGtub3cgaW4gYWR2YW5jZSBob3cgbGFyZ2UgdGhlIGJ1ZmZlcgorCQkgKiBuZWVkcyB0byBiZS4gR2l2ZSBpdCBhIGhpbnQsIHNvIHRoYXQgd2UgY2FuIHN1cHBvcnQKKwkJICogYW55IHNpemUgYnVmZmVyIHdlIHdhbnQgc29tZXdoYXQgZWZmaWNpZW50bHkuLi4gKi8KKwkJaXdyLT51LmRhdGEubGVuZ3RoID0gZGV2LT53aXJlbGVzc19oYW5kbGVycy0+bnVtX3ByaXZhdGVfYXJnczsKKwkJcmV0dXJuIC1FMkJJRzsKKwl9CisKKwkvKiBTZXQgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgaW9jdGxzLiAqLworCWl3ci0+dS5kYXRhLmxlbmd0aCA9IGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPm51bV9wcml2YXRlX2FyZ3M7CisKKwkvKiBDb3B5IHN0cnVjdHVyZSB0byB0aGUgdXNlciBidWZmZXIuICovCisJaWYgKGNvcHlfdG9fdXNlcihpd3ItPnUuZGF0YS5wb2ludGVyLAorCQkJIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPnByaXZhdGVfYXJncywKKwkJCSBzaXplb2Yoc3RydWN0IGl3X3ByaXZfYXJncykgKiBpd3ItPnUuZGF0YS5sZW5ndGgpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogV3JhcHBlciB0byBjYWxsIGEgc3RhbmRhcmQgV2lyZWxlc3MgRXh0ZW5zaW9uIGhhbmRsZXIuCisgKiBXZSBkbyB2YXJpb3VzIGNoZWNrcyBhbmQgYWxzbyB0YWtlIGNhcmUgb2YgbW92aW5nIGRhdGEgYmV0d2VlbgorICogdXNlciBzcGFjZSBhbmQga2VybmVsIHNwYWNlLgorICovCitzdGF0aWMgaW5saW5lIGludCBpb2N0bF9zdGFuZGFyZF9jYWxsKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAorCQkJCSAgICAgIHN0cnVjdCBpZnJlcSAqCQlpZnIsCisJCQkJICAgICAgdW5zaWduZWQgaW50CQljbWQsCisJCQkJICAgICAgaXdfaGFuZGxlcgkJaGFuZGxlcikKK3sKKwlzdHJ1Y3QgaXdyZXEgKgkJCQlpd3IgPSAoc3RydWN0IGl3cmVxICopIGlmcjsKKwljb25zdCBzdHJ1Y3QgaXdfaW9jdGxfZGVzY3JpcHRpb24gKglkZXNjcjsKKwlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvCQkJaW5mbzsKKwlpbnQJCQkJCXJldCA9IC1FSU5WQUw7CisKKwkvKiBHZXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBJT0NUTCAqLworCWlmKChjbWQgLSBTSU9DSVdGSVJTVCkgPj0gc3RhbmRhcmRfaW9jdGxfbnVtKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJZGVzY3IgPSAmKHN0YW5kYXJkX2lvY3RsW2NtZCAtIFNJT0NJV0ZJUlNUXSk7CisKKyNpZmRlZiBXRV9JT0NUTF9ERUJVRworCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UpIDogRm91bmQgc3RhbmRhcmQgaGFuZGxlciBmb3IgMHglMDRYXG4iLAorCSAgICAgICBpZnItPmlmcl9uYW1lLCBjbWQpOworCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UpIDogSGVhZGVyIHR5cGUgOiAlZCwgVG9rZW4gdHlwZSA6ICVkLCBzaXplIDogJWQsIHRva2VuIDogJWRcbiIsIGRldi0+bmFtZSwgZGVzY3ItPmhlYWRlcl90eXBlLCBkZXNjci0+dG9rZW5fdHlwZSwgZGVzY3ItPnRva2VuX3NpemUsIGRlc2NyLT5tYXhfdG9rZW5zKTsKKyNlbmRpZgkvKiBXRV9JT0NUTF9ERUJVRyAqLworCisJLyogUHJlcGFyZSB0aGUgY2FsbCAqLworCWluZm8uY21kID0gY21kOworCWluZm8uZmxhZ3MgPSAwOworCisJLyogQ2hlY2sgaWYgd2UgaGF2ZSBhIHBvaW50ZXIgdG8gdXNlciBzcGFjZSBkYXRhIG9yIG5vdCAqLworCWlmKGRlc2NyLT5oZWFkZXJfdHlwZSAhPSBJV19IRUFERVJfVFlQRV9QT0lOVCkgeworCisJCS8qIE5vIGV4dHJhIGFyZ3VtZW50cy4gVHJpdmlhbCB0byBoYW5kbGUgKi8KKwkJcmV0ID0gaGFuZGxlcihkZXYsICZpbmZvLCAmKGl3ci0+dSksIE5VTEwpOworCisjaWZkZWYgV0VfU0VUX0VWRU5UCisJCS8qIEdlbmVyYXRlIGFuIGV2ZW50IHRvIG5vdGlmeSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZSAqLworCQlpZigoZGVzY3ItPmZsYWdzICYgSVdfREVTQ1JfRkxBR19FVkVOVCkgJiYKKwkJICAgKChyZXQgPT0gMCkgfHwgKHJldCA9PSAtRUlXQ09NTUlUKSkpCisJCQl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgY21kLCAmKGl3ci0+dSksIE5VTEwpOworI2VuZGlmCS8qIFdFX1NFVF9FVkVOVCAqLworCX0gZWxzZSB7CisJCWNoYXIgKglleHRyYTsKKwkJaW50CWV4dHJhX3NpemU7CisJCWludAl1c2VyX2xlbmd0aCA9IDA7CisJCWludAllcnI7CisKKwkJLyogQ2FsY3VsYXRlIHNwYWNlIG5lZWRlZCBieSBhcmd1bWVudHMuIEFsd2F5cyBhbGxvY2F0ZQorCQkgKiBmb3IgbWF4IHNwYWNlLiBFYXNpZXIsIGFuZCB3b24ndCBsYXN0IGxvbmcuLi4gKi8KKwkJZXh0cmFfc2l6ZSA9IGRlc2NyLT5tYXhfdG9rZW5zICogZGVzY3ItPnRva2VuX3NpemU7CisKKwkJLyogQ2hlY2sgd2hhdCB1c2VyIHNwYWNlIGlzIGdpdmluZyB1cyAqLworCQlpZihJV19JU19TRVQoY21kKSkgeworCQkJLyogQ2hlY2sgTlVMTCBwb2ludGVyICovCisJCQlpZigoaXdyLT51LmRhdGEucG9pbnRlciA9PSBOVUxMKSAmJgorCQkJICAgKGl3ci0+dS5kYXRhLmxlbmd0aCAhPSAwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCS8qIENoZWNrIGlmIG51bWJlciBvZiB0b2tlbiBmaXRzIHdpdGhpbiBib3VuZHMgKi8KKwkJCWlmKGl3ci0+dS5kYXRhLmxlbmd0aCA+IGRlc2NyLT5tYXhfdG9rZW5zKQorCQkJCXJldHVybiAtRTJCSUc7CisJCQlpZihpd3ItPnUuZGF0YS5sZW5ndGggPCBkZXNjci0+bWluX3Rva2VucykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfSBlbHNlIHsKKwkJCS8qIENoZWNrIE5VTEwgcG9pbnRlciAqLworCQkJaWYoaXdyLT51LmRhdGEucG9pbnRlciA9PSBOVUxMKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJLyogU2F2ZSB1c2VyIHNwYWNlIGJ1ZmZlciBzaXplIGZvciBjaGVja2luZyAqLworCQkJdXNlcl9sZW5ndGggPSBpd3ItPnUuZGF0YS5sZW5ndGg7CisKKwkJCS8qIERvbid0IGNoZWNrIGlmIHVzZXJfbGVuZ3RoID4gbWF4IHRvIGFsbG93IGZvcndhcmQKKwkJCSAqIGNvbXBhdGliaWxpdHkuIFRoZSB0ZXN0IHVzZXJfbGVuZ3RoIDwgbWluIGlzCisJCQkgKiBpbXBsaWVkIGJ5IHRoZSB0ZXN0IGF0IHRoZSBlbmQuICovCisKKwkJCS8qIFN1cHBvcnQgZm9yIHZlcnkgbGFyZ2UgcmVxdWVzdHMgKi8KKwkJCWlmKChkZXNjci0+ZmxhZ3MgJiBJV19ERVNDUl9GTEFHX05PTUFYKSAmJgorCQkJICAgKHVzZXJfbGVuZ3RoID4gZGVzY3ItPm1heF90b2tlbnMpKSB7CisJCQkJLyogQWxsb3cgdXNlcnNwYWNlIHRvIEdFVCBtb3JlIHRoYW4gbWF4IHNvCisJCQkJICogd2UgY2FuIHN1cHBvcnQgYW55IHNpemUgR0VUIHJlcXVlc3RzLgorCQkJCSAqIFRoZXJlIGlzIHN0aWxsIGEgbGltaXQgOiAtRU5PTUVNLiAqLworCQkJCWV4dHJhX3NpemUgPSB1c2VyX2xlbmd0aCAqIGRlc2NyLT50b2tlbl9zaXplOworCQkJCS8qIE5vdGUgOiB1c2VyX2xlbmd0aCBpcyBvcmlnaW5hbGx5IGEgX191MTYsCisJCQkJICogYW5kIHRva2VuX3NpemUgaXMgY29udHJvbGxlZCBieSB1cywKKwkJCQkgKiBzbyBleHRyYV9zaXplIHdvbid0IGdldCBuZWdhdGl2ZSBhbmQKKwkJCQkgKiB3b24ndCBvdmVyZmxvdy4uLiAqLworCQkJfQorCQl9CisKKyNpZmRlZiBXRV9JT0NUTF9ERUJVRworCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFKSA6IE1hbGxvYyAlZCBieXRlc1xuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXh0cmFfc2l6ZSk7CisjZW5kaWYJLyogV0VfSU9DVExfREVCVUcgKi8KKworCQkvKiBDcmVhdGUgdGhlIGtlcm5lbCBidWZmZXIgKi8KKwkJZXh0cmEgPSBrbWFsbG9jKGV4dHJhX3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoZXh0cmEgPT0gTlVMTCkgeworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQkvKiBJZiBpdCBpcyBhIFNFVCwgZ2V0IGFsbCB0aGUgZXh0cmEgZGF0YSBpbiBoZXJlICovCisJCWlmKElXX0lTX1NFVChjbWQpICYmIChpd3ItPnUuZGF0YS5sZW5ndGggIT0gMCkpIHsKKwkJCWVyciA9IGNvcHlfZnJvbV91c2VyKGV4dHJhLCBpd3ItPnUuZGF0YS5wb2ludGVyLAorCQkJCQkgICAgIGl3ci0+dS5kYXRhLmxlbmd0aCAqCisJCQkJCSAgICAgZGVzY3ItPnRva2VuX3NpemUpOworCQkJaWYgKGVycikgeworCQkJCWtmcmVlKGV4dHJhKTsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKyNpZmRlZiBXRV9JT0NUTF9ERUJVRworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRSkgOiBHb3QgJWQgYnl0ZXNcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLAorCQkJICAgICAgIGl3ci0+dS5kYXRhLmxlbmd0aCAqIGRlc2NyLT50b2tlbl9zaXplKTsKKyNlbmRpZgkvKiBXRV9JT0NUTF9ERUJVRyAqLworCQl9CisKKwkJLyogQ2FsbCB0aGUgaGFuZGxlciAqLworCQlyZXQgPSBoYW5kbGVyKGRldiwgJmluZm8sICYoaXdyLT51KSwgZXh0cmEpOworCisJCS8qIElmIHdlIGhhdmUgc29tZXRoaW5nIHRvIHJldHVybiB0byB0aGUgdXNlciAqLworCQlpZiAoIXJldCAmJiBJV19JU19HRVQoY21kKSkgeworCQkJLyogQ2hlY2sgaWYgdGhlcmUgaXMgZW5vdWdoIGJ1ZmZlciB1cCB0aGVyZSAqLworCQkJaWYodXNlcl9sZW5ndGggPCBpd3ItPnUuZGF0YS5sZW5ndGgpIHsKKwkJCQlrZnJlZShleHRyYSk7CisJCQkJcmV0dXJuIC1FMkJJRzsKKwkJCX0KKworCQkJZXJyID0gY29weV90b191c2VyKGl3ci0+dS5kYXRhLnBvaW50ZXIsIGV4dHJhLAorCQkJCQkgICBpd3ItPnUuZGF0YS5sZW5ndGggKgorCQkJCQkgICBkZXNjci0+dG9rZW5fc2l6ZSk7CisJCQlpZiAoZXJyKQorCQkJCXJldCA9ICAtRUZBVUxUOwkJCQkgICAKKyNpZmRlZiBXRV9JT0NUTF9ERUJVRworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRSkgOiBXcm90ZSAlZCBieXRlc1xuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsCisJCQkgICAgICAgaXdyLT51LmRhdGEubGVuZ3RoICogZGVzY3ItPnRva2VuX3NpemUpOworI2VuZGlmCS8qIFdFX0lPQ1RMX0RFQlVHICovCisJCX0KKworI2lmZGVmIFdFX1NFVF9FVkVOVAorCQkvKiBHZW5lcmF0ZSBhbiBldmVudCB0byBub3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2UgKi8KKwkJaWYoKGRlc2NyLT5mbGFncyAmIElXX0RFU0NSX0ZMQUdfRVZFTlQpICYmCisJCSAgICgocmV0ID09IDApIHx8IChyZXQgPT0gLUVJV0NPTU1JVCkpKSB7CisJCQlpZihkZXNjci0+ZmxhZ3MgJiBJV19ERVNDUl9GTEFHX1JFU1RSSUNUKQorCQkJCS8qIElmIHRoZSBldmVudCBpcyByZXN0cmljdGVkLCBkb24ndAorCQkJCSAqIGV4cG9ydCB0aGUgcGF5bG9hZCAqLworCQkJCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBjbWQsICYoaXdyLT51KSwgTlVMTCk7CisJCQllbHNlCisJCQkJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIGNtZCwgJihpd3ItPnUpLAorCQkJCQkJICAgIGV4dHJhKTsKKwkJfQorI2VuZGlmCS8qIFdFX1NFVF9FVkVOVCAqLworCisJCS8qIENsZWFudXAgLSBJIHRvbGQgeW91IGl0IHdhc24ndCB0aGF0IGxvbmcgOy0pICovCisJCWtmcmVlKGV4dHJhKTsKKwl9CisKKwkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyIGlmIG5lZWRlZCBhbmQgZGVmaW5lZCAqLworCWlmKHJldCA9PSAtRUlXQ09NTUlUKQorCQlyZXQgPSBjYWxsX2NvbW1pdF9oYW5kbGVyKGRldik7CisKKwkvKiBIZXJlLCB3ZSB3aWxsIGdlbmVyYXRlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWVkZWQgKi8KKworCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBXcmFwcGVyIHRvIGNhbGwgYSBwcml2YXRlIFdpcmVsZXNzIEV4dGVuc2lvbiBoYW5kbGVyLgorICogV2UgZG8gdmFyaW91cyBjaGVja3MgYW5kIGFsc28gdGFrZSBjYXJlIG9mIG1vdmluZyBkYXRhIGJldHdlZW4KKyAqIHVzZXIgc3BhY2UgYW5kIGtlcm5lbCBzcGFjZS4KKyAqIEl0J3Mgbm90IGFzIG5pY2UgYW5kIHNsaW1saW5lIGFzIHRoZSBzdGFuZGFyZCB3cmFwcGVyLiBUaGUgY2F1c2UKKyAqIGlzIHN0cnVjdCBpd19wcml2X2FyZ3MsIHdoaWNoIHdhcyBub3QgcmVhbGx5IGRlc2lnbmVkIGZvciB0aGUKKyAqIGpvYiB3ZSBhcmUgZ29pbmcgaGVyZS4KKyAqCisgKiBJTVBPUlRBTlQgOiBUaGlzIGZ1bmN0aW9uIHByZXZlbnQgdG8gc2V0IGFuZCBnZXQgZGF0YSBvbiB0aGUgc2FtZQorICogSU9DVEwgYW5kIGVuZm9yY2UgdGhlIFNFVC9HRVQgY29udmVudGlvbi4gTm90IGRvaW5nIGl0IHdvdWxkIGJlCisgKiBmYXIgdG9vIGhhaXJ5Li4uCisgKiBJZiB5b3UgbmVlZCB0byBzZXQgYW5kIGdldCBkYXRhIGF0IHRoZSBzYW1lIHRpbWUsIHBsZWFzZSBkb24ndCB1c2UKKyAqIGEgaXdfaGFuZGxlciBidXQgcHJvY2VzcyBpdCBpbiB5b3VyIGlvY3RsIGhhbmRsZXIgKGkuZS4gdXNlIHRoZQorICogb2xkIGRyaXZlciBBUEkpLgorICovCitzdGF0aWMgaW5saW5lIGludCBpb2N0bF9wcml2YXRlX2NhbGwoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCisJCQkJICAgICBzdHJ1Y3QgaWZyZXEgKgkJaWZyLAorCQkJCSAgICAgdW5zaWduZWQgaW50CQljbWQsCisJCQkJICAgICBpd19oYW5kbGVyCQloYW5kbGVyKQoreworCXN0cnVjdCBpd3JlcSAqCQkJaXdyID0gKHN0cnVjdCBpd3JlcSAqKSBpZnI7CisJY29uc3Qgc3RydWN0IGl3X3ByaXZfYXJncyAqCWRlc2NyID0gTlVMTDsKKwlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvCQlpbmZvOworCWludAkJCQlleHRyYV9zaXplID0gMDsKKwlpbnQJCQkJaTsKKwlpbnQJCQkJcmV0ID0gLUVJTlZBTDsKKworCS8qIEdldCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIElPQ1RMICovCisJZm9yKGkgPSAwOyBpIDwgZGV2LT53aXJlbGVzc19oYW5kbGVycy0+bnVtX3ByaXZhdGVfYXJnczsgaSsrKQorCQlpZihjbWQgPT0gZGV2LT53aXJlbGVzc19oYW5kbGVycy0+cHJpdmF0ZV9hcmdzW2ldLmNtZCkgeworCQkJZGVzY3IgPSAmKGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPnByaXZhdGVfYXJnc1tpXSk7CisJCQlicmVhazsKKwkJfQorCisjaWZkZWYgV0VfSU9DVExfREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFKSA6IEZvdW5kIHByaXZhdGUgaGFuZGxlciBmb3IgMHglMDRYXG4iLAorCSAgICAgICBpZnItPmlmcl9uYW1lLCBjbWQpOworCWlmKGRlc2NyKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UpIDogTmFtZSAlcywgc2V0ICVYLCBnZXQgJVhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGRlc2NyLT5uYW1lLAorCQkgICAgICAgZGVzY3ItPnNldF9hcmdzLCBkZXNjci0+Z2V0X2FyZ3MpOworCX0KKyNlbmRpZgkvKiBXRV9JT0NUTF9ERUJVRyAqLworCisJLyogQ29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgc2V0L2dldCBhcmd1bWVudHMgKi8KKwlpZihkZXNjciAhPSBOVUxMKSB7CisJCWlmKElXX0lTX1NFVChjbWQpKSB7CisJCQlpbnQJb2Zmc2V0ID0gMDsJLyogRm9yIHN1Yi1pb2N0bHMgKi8KKwkJCS8qIENoZWNrIGZvciBzdWItaW9jdGwgaGFuZGxlciAqLworCQkJaWYoZGVzY3ItPm5hbWVbMF0gPT0gJ1wwJykKKwkJCQkvKiBSZXNlcnZlIG9uZSBpbnQgZm9yIHN1Yi1pb2N0bCBpbmRleCAqLworCQkJCW9mZnNldCA9IHNpemVvZihfX3UzMik7CisKKwkJCS8qIFNpemUgb2Ygc2V0IGFyZ3VtZW50cyAqLworCQkJZXh0cmFfc2l6ZSA9IGdldF9wcml2X3NpemUoZGVzY3ItPnNldF9hcmdzKTsKKworCQkJLyogRG9lcyBpdCBmaXRzIGluIGl3ciA/ICovCisJCQlpZigoZGVzY3ItPnNldF9hcmdzICYgSVdfUFJJVl9TSVpFX0ZJWEVEKSAmJgorCQkJICAgKChleHRyYV9zaXplICsgb2Zmc2V0KSA8PSBJRk5BTVNJWikpCisJCQkJZXh0cmFfc2l6ZSA9IDA7CisJCX0gZWxzZSB7CisJCQkvKiBTaXplIG9mIGdldCBhcmd1bWVudHMgKi8KKwkJCWV4dHJhX3NpemUgPSBnZXRfcHJpdl9zaXplKGRlc2NyLT5nZXRfYXJncyk7CisKKwkJCS8qIERvZXMgaXQgZml0cyBpbiBpd3IgPyAqLworCQkJaWYoKGRlc2NyLT5nZXRfYXJncyAmIElXX1BSSVZfU0laRV9GSVhFRCkgJiYKKwkJCSAgIChleHRyYV9zaXplIDw9IElGTkFNU0laKSkKKwkJCQlleHRyYV9zaXplID0gMDsKKwkJfQorCX0KKworCS8qIFByZXBhcmUgdGhlIGNhbGwgKi8KKwlpbmZvLmNtZCA9IGNtZDsKKwlpbmZvLmZsYWdzID0gMDsKKworCS8qIENoZWNrIGlmIHdlIGhhdmUgYSBwb2ludGVyIHRvIHVzZXIgc3BhY2UgZGF0YSBvciBub3QuICovCisJaWYoZXh0cmFfc2l6ZSA9PSAwKSB7CisJCS8qIE5vIGV4dHJhIGFyZ3VtZW50cy4gVHJpdmlhbCB0byBoYW5kbGUgKi8KKwkJcmV0ID0gaGFuZGxlcihkZXYsICZpbmZvLCAmKGl3ci0+dSksIChjaGFyICopICYoaXdyLT51KSk7CisJfSBlbHNlIHsKKwkJY2hhciAqCWV4dHJhOworCQlpbnQJZXJyOworCisJCS8qIENoZWNrIHdoYXQgdXNlciBzcGFjZSBpcyBnaXZpbmcgdXMgKi8KKwkJaWYoSVdfSVNfU0VUKGNtZCkpIHsKKwkJCS8qIENoZWNrIE5VTEwgcG9pbnRlciAqLworCQkJaWYoKGl3ci0+dS5kYXRhLnBvaW50ZXIgPT0gTlVMTCkgJiYKKwkJCSAgIChpd3ItPnUuZGF0YS5sZW5ndGggIT0gMCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCS8qIERvZXMgaXQgZml0cyB3aXRoaW4gYm91bmRzID8gKi8KKwkJCWlmKGl3ci0+dS5kYXRhLmxlbmd0aCA+IChkZXNjci0+c2V0X2FyZ3MgJgorCQkJCQkJIElXX1BSSVZfU0laRV9NQVNLKSkKKwkJCQlyZXR1cm4gLUUyQklHOworCQl9IGVsc2UgeworCQkJLyogQ2hlY2sgTlVMTCBwb2ludGVyICovCisJCQlpZihpd3ItPnUuZGF0YS5wb2ludGVyID09IE5VTEwpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworI2lmZGVmIFdFX0lPQ1RMX0RFQlVHCisJCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UpIDogTWFsbG9jICVkIGJ5dGVzXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBleHRyYV9zaXplKTsKKyNlbmRpZgkvKiBXRV9JT0NUTF9ERUJVRyAqLworCisJCS8qIEFsd2F5cyBhbGxvY2F0ZSBmb3IgbWF4IHNwYWNlLiBFYXNpZXIsIGFuZCB3b24ndCBsYXN0CisJCSAqIGxvbmcuLi4gKi8KKwkJZXh0cmEgPSBrbWFsbG9jKGV4dHJhX3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoZXh0cmEgPT0gTlVMTCkgeworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQkvKiBJZiBpdCBpcyBhIFNFVCwgZ2V0IGFsbCB0aGUgZXh0cmEgZGF0YSBpbiBoZXJlICovCisJCWlmKElXX0lTX1NFVChjbWQpICYmIChpd3ItPnUuZGF0YS5sZW5ndGggIT0gMCkpIHsKKwkJCWVyciA9IGNvcHlfZnJvbV91c2VyKGV4dHJhLCBpd3ItPnUuZGF0YS5wb2ludGVyLAorCQkJCQkgICAgIGV4dHJhX3NpemUpOworCQkJaWYgKGVycikgeworCQkJCWtmcmVlKGV4dHJhKTsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKyNpZmRlZiBXRV9JT0NUTF9ERUJVRworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRSkgOiBHb3QgJWQgZWxlbVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGl3ci0+dS5kYXRhLmxlbmd0aCk7CisjZW5kaWYJLyogV0VfSU9DVExfREVCVUcgKi8KKwkJfQorCisJCS8qIENhbGwgdGhlIGhhbmRsZXIgKi8KKwkJcmV0ID0gaGFuZGxlcihkZXYsICZpbmZvLCAmKGl3ci0+dSksIGV4dHJhKTsKKworCQkvKiBJZiB3ZSBoYXZlIHNvbWV0aGluZyB0byByZXR1cm4gdG8gdGhlIHVzZXIgKi8KKwkJaWYgKCFyZXQgJiYgSVdfSVNfR0VUKGNtZCkpIHsKKworCQkJLyogQWRqdXN0IGZvciB0aGUgYWN0dWFsIGxlbmd0aCBpZiBpdCdzIHZhcmlhYmxlLAorCQkJICogYXZvaWQgbGVha2luZyBrZXJuZWwgYml0cyBvdXRzaWRlLiAqLworCQkJaWYgKCEoZGVzY3ItPmdldF9hcmdzICYgSVdfUFJJVl9TSVpFX0ZJWEVEKSkgeworCQkJCWV4dHJhX3NpemUgPSBhZGp1c3RfcHJpdl9zaXplKGRlc2NyLT5nZXRfYXJncywKKwkJCQkJCQkgICAgICAmKGl3ci0+dSkpOworCQkJfQorCisJCQllcnIgPSBjb3B5X3RvX3VzZXIoaXdyLT51LmRhdGEucG9pbnRlciwgZXh0cmEsCisJCQkJCSAgIGV4dHJhX3NpemUpOworCQkJaWYgKGVycikKKwkJCQlyZXQgPSAgLUVGQVVMVDsJCQkJICAgCisjaWZkZWYgV0VfSU9DVExfREVCVUcKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UpIDogV3JvdGUgJWQgZWxlbVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGl3ci0+dS5kYXRhLmxlbmd0aCk7CisjZW5kaWYJLyogV0VfSU9DVExfREVCVUcgKi8KKwkJfQorCisJCS8qIENsZWFudXAgLSBJIHRvbGQgeW91IGl0IHdhc24ndCB0aGF0IGxvbmcgOy0pICovCisJCWtmcmVlKGV4dHJhKTsKKwl9CisKKworCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgaWYgbmVlZGVkIGFuZCBkZWZpbmVkICovCisJaWYocmV0ID09IC1FSVdDT01NSVQpCisJCXJldCA9IGNhbGxfY29tbWl0X2hhbmRsZXIoZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBNYWluIElPQ1RsIGRpc3BhdGNoZXIuIENhbGxlZCBmcm9tIHRoZSBtYWluIG5ldHdvcmtpbmcgY29kZQorICogKGRldl9pb2N0bCgpIGluIG5ldC9jb3JlL2Rldi5jKS4KKyAqIENoZWNrIHRoZSB0eXBlIG9mIElPQ1RMIGFuZCBjYWxsIHRoZSBhcHByb3ByaWF0ZSB3cmFwcGVyLi4uCisgKi8KK2ludCB3aXJlbGVzc19wcm9jZXNzX2lvY3RsKHN0cnVjdCBpZnJlcSAqaWZyLCB1bnNpZ25lZCBpbnQgY21kKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaXdfaGFuZGxlcgloYW5kbGVyOworCisJLyogUGVybWlzc2lvbnMgYXJlIGFscmVhZHkgY2hlY2tlZCBpbiBkZXZfaW9jdGwoKSBiZWZvcmUgY2FsbGluZyB1cy4KKwkgKiBUaGUgY29weV90by9mcm9tX3VzZXIoKSBvZiBpZnIgaXMgYWxzbyBkZWFsdCB3aXRoIGluIHRoZXJlICovCisKKwkvKiBNYWtlIHN1cmUgdGhlIGRldmljZSBleGlzdCAqLworCWlmICgoZGV2ID0gX19kZXZfZ2V0X2J5X25hbWUoaWZyLT5pZnJfbmFtZSkpID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJLyogQSBidW5jaCBvZiBzcGVjaWFsIGNhc2VzLCB0aGVuIHRoZSBnZW5lcmljIGNhc2UuLi4KKwkgKiBOb3RlIHRoYXQgJ2NtZCcgaXMgYWxyZWFkeSBmaWx0ZXJlZCBpbiBkZXZfaW9jdGwoKSB3aXRoCisJICogKGNtZCA+PSBTSU9DSVdGSVJTVCAmJiBjbWQgPD0gU0lPQ0lXTEFTVCkgKi8KKwlzd2l0Y2goY21kKSAKKwl7CisJCWNhc2UgU0lPQ0dJV1NUQVRTOgorCQkJLyogR2V0IFdpcmVsZXNzIFN0YXRzICovCisJCQlyZXR1cm4gZGV2X2l3c3RhdHMoZGV2LCBpZnIpOworCisJCWNhc2UgU0lPQ0dJV1BSSVY6CisJCQkvKiBDaGVjayBpZiB3ZSBoYXZlIHNvbWUgd2lyZWxlc3MgaGFuZGxlcnMgZGVmaW5lZCAqLworCQkJaWYoZGV2LT53aXJlbGVzc19oYW5kbGVycyAhPSBOVUxMKSB7CisJCQkJLyogV2UgZXhwb3J0IHRvIHVzZXIgc3BhY2UgdGhlIGRlZmluaXRpb24gb2YKKwkJCQkgKiB0aGUgcHJpdmF0ZSBoYW5kbGVyIG91cnNlbHZlcyAqLworCQkJCXJldHVybiBpb2N0bF9leHBvcnRfcHJpdmF0ZShkZXYsIGlmcik7CisJCQl9CisJCQkvLyAjIyBGYWxsLXRocm91Z2ggZm9yIG9sZCBBUEkgIyMKKwkJZGVmYXVsdDoKKwkJCS8qIEdlbmVyaWMgSU9DVEwgKi8KKwkJCS8qIEJhc2ljIGNoZWNrICovCisJCQlpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQkvKiBOZXcgZHJpdmVyIEFQSSA6IHRyeSB0byBmaW5kIHRoZSBoYW5kbGVyICovCisJCQloYW5kbGVyID0gZ2V0X2hhbmRsZXIoZGV2LCBjbWQpOworCQkJaWYoaGFuZGxlciAhPSBOVUxMKSB7CisJCQkJLyogU3RhbmRhcmQgYW5kIHByaXZhdGUgYXJlIG5vdCB0aGUgc2FtZSAqLworCQkJCWlmKGNtZCA8IFNJT0NJV0ZJUlNUUFJJVikKKwkJCQkJcmV0dXJuIGlvY3RsX3N0YW5kYXJkX2NhbGwoZGV2LAorCQkJCQkJCQkgICBpZnIsCisJCQkJCQkJCSAgIGNtZCwKKwkJCQkJCQkJICAgaGFuZGxlcik7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gaW9jdGxfcHJpdmF0ZV9jYWxsKGRldiwKKwkJCQkJCQkJICBpZnIsCisJCQkJCQkJCSAgY21kLAorCQkJCQkJCQkgIGhhbmRsZXIpOworCQkJfQorCQkJLyogT2xkIGRyaXZlciBBUEkgOiBjYWxsIGRyaXZlciBpb2N0bCBoYW5kbGVyICovCisJCQlpZiAoZGV2LT5kb19pb2N0bCkgeworCQkJCXJldHVybiBkZXYtPmRvX2lvY3RsKGRldiwgaWZyLCBjbWQpOworCQkJfQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwkvKiBOb3QgcmVhY2hlZCAqLworCXJldHVybiAtRUlOVkFMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBFVkVOVCBQUk9DRVNTSU5HICoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogUHJvY2VzcyBldmVudHMgZ2VuZXJhdGVkIGJ5IHRoZSB3aXJlbGVzcyBsYXllciBvciB0aGUgZHJpdmVyLgorICogTW9zdCBvZnRlbiwgdGhlIGV2ZW50IHdpbGwgYmUgcHJvcGFnYXRlZCB0aHJvdWdoIHJ0bmV0bGluaworICovCisKKyNpZmRlZiBXRV9FVkVOVF9ORVRMSU5LCisvKiAicnRubCIgaXMgZGVmaW5lZCBpbiBuZXQvY29yZS9ydG5ldGxpbmsuYywgYnV0IHdlIG5lZWQgaXQgaGVyZS4KKyAqIEl0IGlzIGRlY2xhcmVkIGluIDxsaW51eC9ydG5ldGxpbmsuaD4gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIEZpbGwgYSBydG5ldGxpbmsgbWVzc2FnZSB3aXRoIG91ciBldmVudCBkYXRhLgorICogTm90ZSB0aGF0IHdlIHByb3BhZ2Ugb25seSB0aGUgc3BlY2lmaWVkIGV2ZW50IGFuZCBkb24ndCBkdW1wIHRoZQorICogY3VycmVudCB3aXJlbGVzcyBjb25maWcuIER1bXBpbmcgdGhlIHdpcmVsZXNzIGNvbmZpZyBpcyBmYXIgdG9vCisgKiBleHBlbnNpdmUgKGZvciBlYWNoIHBhcmFtZXRlciwgdGhlIGRyaXZlciBuZWVkIHRvIHF1ZXJ5IHRoZSBoYXJkd2FyZSkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJ0bmV0bGlua19maWxsX2l3aW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqCXNrYiwKKwkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCisJCQkJCWludAkJCXR5cGUsCisJCQkJCWNoYXIgKgkJCWV2ZW50LAorCQkJCQlpbnQJCQlldmVudF9sZW4pCit7CisJc3RydWN0IGlmaW5mb21zZyAqcjsKKwlzdHJ1Y3Qgbmxtc2doZHIgICpubGg7CisJdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisKKwlubGggPSBOTE1TR19QVVQoc2tiLCAwLCAwLCB0eXBlLCBzaXplb2YoKnIpKTsKKwlyID0gTkxNU0dfREFUQShubGgpOworCXItPmlmaV9mYW1pbHkgPSBBRl9VTlNQRUM7CisJci0+aWZpX3R5cGUgPSBkZXYtPnR5cGU7CisJci0+aWZpX2luZGV4ID0gZGV2LT5pZmluZGV4OworCXItPmlmaV9mbGFncyA9IGRldi0+ZmxhZ3M7CisJci0+aWZpX2NoYW5nZSA9IDA7CS8qIFdpcmVsZXNzIGNoYW5nZXMgZG9uJ3QgYWZmZWN0IHRob3NlIGZsYWdzICovCisKKwkvKiBBZGQgdGhlIHdpcmVsZXNzIGV2ZW50cyBpbiB0aGUgbmV0bGluayBwYWNrZXQgKi8KKwlSVEFfUFVUKHNrYiwgSUZMQV9XSVJFTEVTUywKKwkJZXZlbnRfbGVuLCBldmVudCk7CisKKwlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJcmV0dXJuIHNrYi0+bGVuOworCitubG1zZ19mYWlsdXJlOgorcnRhdHRyX2ZhaWx1cmU6CisJc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBDcmVhdGUgYW5kIGJyb2FkY2FzdCBhbmQgc2VuZCBpdCBvbiB0aGUgc3RhbmRhcmQgcnRuZXRsaW5rIHNvY2tldAorICogVGhpcyBpcyBhIHB1cmUgY2xvbmUgcnRtc2dfaWZpbmZvKCkgaW4gbmV0L2NvcmUvcnRuZXRsaW5rLmMKKyAqIEFuZHJ6ZWogS3J6eXN6dG9mb3dpY3ogbWFuZGF0ZWQgdGhhdCBJIHVzZWQgYSBJRkxBX1hYWCBmaWVsZAorICogd2l0aGluIGEgUlRNX05FV0xJTksgZXZlbnQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBydG1zZ19pd2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCisJCQkJY2hhciAqCQkJZXZlbnQsCisJCQkJaW50CQkJZXZlbnRfbGVuKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHNpemUgPSBOTE1TR19HT09EU0laRTsKKworCXNrYiA9IGFsbG9jX3NrYihzaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuOworCisJaWYgKHJ0bmV0bGlua19maWxsX2l3aW5mbyhza2IsIGRldiwgUlRNX05FV0xJTkssCisJCQkJICBldmVudCwgZXZlbnRfbGVuKSA8IDApIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisJTkVUTElOS19DQihza2IpLmRzdF9ncm91cHMgPSBSVE1HUlBfTElOSzsKKwluZXRsaW5rX2Jyb2FkY2FzdChydG5sLCBza2IsIDAsIFJUTUdSUF9MSU5LLCBHRlBfQVRPTUlDKTsKK30KKyNlbmRpZgkvKiBXRV9FVkVOVF9ORVRMSU5LICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBNYWluIGV2ZW50IGRpc3BhdGNoZXIuIENhbGxlZCBmcm9tIG90aGVyIHBhcnRzIGFuZCBkcml2ZXJzLgorICogU2VuZCB0aGUgZXZlbnQgb24gdGhlIGFwcHJvcHJpYXRlIGNoYW5uZWxzLgorICogTWF5IGJlIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0LgorICovCit2b2lkIHdpcmVsZXNzX3NlbmRfZXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCisJCQkgdW5zaWduZWQgaW50CQljbWQsCisJCQkgdW5pb24gaXdyZXFfZGF0YSAqCXdycXUsCisJCQkgY2hhciAqCQkJZXh0cmEpCit7CisJY29uc3Qgc3RydWN0IGl3X2lvY3RsX2Rlc2NyaXB0aW9uICoJZGVzY3IgPSBOVUxMOworCWludCBleHRyYV9sZW4gPSAwOworCXN0cnVjdCBpd19ldmVudCAgKmV2ZW50OwkJLyogTWFsbG9jYXRlZCB3aG9sZSBldmVudCAqLworCWludCBldmVudF9sZW47CQkJCS8qIEl0cyBzaXplICovCisJaW50IGhkcl9sZW47CQkJCS8qIFNpemUgb2YgdGhlIGV2ZW50IGhlYWRlciAqLworCS8qIERvbid0ICJvcHRpbWlzZSIgdGhlIGZvbGxvd2luZyB2YXJpYWJsZSwgaXQgd2lsbCBjcmFzaCAqLworCXVuc2lnbmVkCWNtZF9pbmRleDsJCS8qICpNVVNUKiBiZSB1bnNpZ25lZCAqLworCisJLyogR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgSU9DVEwgKi8KKwlpZihjbWQgPD0gU0lPQ0lXTEFTVCkgeworCQljbWRfaW5kZXggPSBjbWQgLSBTSU9DSVdGSVJTVDsKKwkJaWYoY21kX2luZGV4IDwgc3RhbmRhcmRfaW9jdGxfbnVtKQorCQkJZGVzY3IgPSAmKHN0YW5kYXJkX2lvY3RsW2NtZF9pbmRleF0pOworCX0gZWxzZSB7CisJCWNtZF9pbmRleCA9IGNtZCAtIElXRVZGSVJTVDsKKwkJaWYoY21kX2luZGV4IDwgc3RhbmRhcmRfZXZlbnRfbnVtKQorCQkJZGVzY3IgPSAmKHN0YW5kYXJkX2V2ZW50W2NtZF9pbmRleF0pOworCX0KKwkvKiBEb24ndCBhY2NlcHQgdW5rbm93biBldmVudHMgKi8KKwlpZihkZXNjciA9PSBOVUxMKSB7CisJCS8qIE5vdGUgOiB3ZSBkb24ndCByZXR1cm4gYW4gZXJyb3IgdG8gdGhlIGRyaXZlciwgYmVjYXVzZQorCQkgKiB0aGUgZHJpdmVyIHdvdWxkIG5vdCBrbm93IHdoYXQgdG8gZG8gYWJvdXQgaXQuIEl0IGNhbid0CisJCSAqIHJldHVybiBhbiBlcnJvciB0byB0aGUgdXNlciwgYmVjYXVzZSB0aGUgZXZlbnQgaXMgbm90CisJCSAqIGluaXRpYXRlZCBieSBhIHVzZXIgcmVxdWVzdC4KKwkJICogVGhlIGJlc3QgdGhlIGRyaXZlciBjb3VsZCBkbyBpcyB0byBsb2cgYW4gZXJyb3IgbWVzc2FnZS4KKwkJICogV2Ugd2lsbCBkbyBpdCBvdXJzZWx2ZXMgaW5zdGVhZC4uLgorCQkgKi8KKwkgIAlwcmludGsoS0VSTl9FUlIgIiVzIChXRSkgOiBJbnZhbGlkL1Vua25vd24gV2lyZWxlc3MgRXZlbnQgKDB4JTA0WClcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGNtZCk7CisJCXJldHVybjsKKwl9CisjaWZkZWYgV0VfRVZFTlRfREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFKSA6IEdvdCBldmVudCAweCUwNFhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgY21kKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFKSA6IEhlYWRlciB0eXBlIDogJWQsIFRva2VuIHR5cGUgOiAlZCwgc2l6ZSA6ICVkLCB0b2tlbiA6ICVkXG4iLCBkZXYtPm5hbWUsIGRlc2NyLT5oZWFkZXJfdHlwZSwgZGVzY3ItPnRva2VuX3R5cGUsIGRlc2NyLT50b2tlbl9zaXplLCBkZXNjci0+bWF4X3Rva2Vucyk7CisjZW5kaWYJLyogV0VfRVZFTlRfREVCVUcgKi8KKworCS8qIENoZWNrIGV4dHJhIHBhcmFtZXRlcnMgYW5kIHNldCBleHRyYV9sZW4gKi8KKwlpZihkZXNjci0+aGVhZGVyX3R5cGUgPT0gSVdfSEVBREVSX1RZUEVfUE9JTlQpIHsKKwkJLyogQ2hlY2sgaWYgbnVtYmVyIG9mIHRva2VuIGZpdHMgd2l0aGluIGJvdW5kcyAqLworCQlpZih3cnF1LT5kYXRhLmxlbmd0aCA+IGRlc2NyLT5tYXhfdG9rZW5zKSB7CisJCSAgCXByaW50ayhLRVJOX0VSUiAiJXMgKFdFKSA6IFdpcmVsZXNzIEV2ZW50IHRvbyBiaWcgKCVkKVxuIiwgZGV2LT5uYW1lLCB3cnF1LT5kYXRhLmxlbmd0aCk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYod3JxdS0+ZGF0YS5sZW5ndGggPCBkZXNjci0+bWluX3Rva2VucykgeworCQkgIAlwcmludGsoS0VSTl9FUlIgIiVzIChXRSkgOiBXaXJlbGVzcyBFdmVudCB0b28gc21hbGwgKCVkKVxuIiwgZGV2LT5uYW1lLCB3cnF1LT5kYXRhLmxlbmd0aCk7CisJCQlyZXR1cm47CisJCX0KKwkJLyogQ2FsY3VsYXRlIGV4dHJhX2xlbiAtIGV4dHJhIGlzIE5VTEwgZm9yIHJlc3RyaWN0ZWQgZXZlbnRzICovCisJCWlmKGV4dHJhICE9IE5VTEwpCisJCQlleHRyYV9sZW4gPSB3cnF1LT5kYXRhLmxlbmd0aCAqIGRlc2NyLT50b2tlbl9zaXplOworI2lmZGVmIFdFX0VWRU5UX0RFQlVHCisJCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UpIDogRXZlbnQgMHglMDRYLCB0b2tlbnMgJWQsIGV4dHJhX2xlbiAlZFxuIiwgZGV2LT5uYW1lLCBjbWQsIHdycXUtPmRhdGEubGVuZ3RoLCBleHRyYV9sZW4pOworI2VuZGlmCS8qIFdFX0VWRU5UX0RFQlVHICovCisJfQorCisJLyogVG90YWwgbGVuZ3RoIG9mIHRoZSBldmVudCAqLworCWhkcl9sZW4gPSBldmVudF90eXBlX3NpemVbZGVzY3ItPmhlYWRlcl90eXBlXTsKKwlldmVudF9sZW4gPSBoZHJfbGVuICsgZXh0cmFfbGVuOworCisjaWZkZWYgV0VfRVZFTlRfREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFKSA6IEV2ZW50IDB4JTA0WCwgaGRyX2xlbiAlZCwgZXZlbnRfbGVuICVkXG4iLCBkZXYtPm5hbWUsIGNtZCwgaGRyX2xlbiwgZXZlbnRfbGVuKTsKKyNlbmRpZgkvKiBXRV9FVkVOVF9ERUJVRyAqLworCisJLyogQ3JlYXRlIHRlbXBvcmFyeSBidWZmZXIgdG8gaG9sZCB0aGUgZXZlbnQgKi8KKwlldmVudCA9IGttYWxsb2MoZXZlbnRfbGVuLCBHRlBfQVRPTUlDKTsKKwlpZihldmVudCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBGaWxsIGV2ZW50ICovCisJZXZlbnQtPmxlbiA9IGV2ZW50X2xlbjsKKwlldmVudC0+Y21kID0gY21kOworCW1lbWNweSgmZXZlbnQtPnUsIHdycXUsIGhkcl9sZW4gLSBJV19FVl9MQ1BfTEVOKTsKKwlpZihleHRyYSAhPSBOVUxMKQorCQltZW1jcHkoKChjaGFyICopIGV2ZW50KSArIGhkcl9sZW4sIGV4dHJhLCBleHRyYV9sZW4pOworCisjaWZkZWYgV0VfRVZFTlRfTkVUTElOSworCS8qIHJ0bmV0bGluayBldmVudCBjaGFubmVsICovCisJcnRtc2dfaXdpbmZvKGRldiwgKGNoYXIgKikgZXZlbnQsIGV2ZW50X2xlbik7CisjZW5kaWYJLyogV0VfRVZFTlRfTkVUTElOSyAqLworCisJLyogQ2xlYW51cCAqLworCWtmcmVlKGV2ZW50KTsKKworCXJldHVybjsJCS8qIEFsd2F5cyBzdWNjZXNzLCBJIGd1ZXNzIDstKSAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKiBFTkhBTkNFRCBJV1NQWSBTVVBQT1JUICoqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogSW4gdGhlIG9sZCBkYXlzLCB0aGUgZHJpdmVyIHdhcyBoYW5kbGluZyBzcHkgc3VwcG9ydCBhbGwgYnkgaXRzZWxmLgorICogTm93LCB0aGUgZHJpdmVyIGNhbiBkZWxlZ2F0ZSB0aGlzIHRhc2sgdG8gV2lyZWxlc3MgRXh0ZW5zaW9ucy4KKyAqIEl0IG5lZWRzIHRvIHVzZSB0aG9zZSBzdGFuZGFyZCBzcHkgaXdfaGFuZGxlciBpbiBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYsCisgKiBwdXNoIGRhdGEgdG8gdXMgdmlhIHdpcmVsZXNzX3NweV91cGRhdGUoKSBhbmQgaW5jbHVkZSBzdHJ1Y3QgaXdfc3B5X2RhdGEKKyAqIGluIGl0cyBwcml2YXRlIHBhcnQgKGFuZCBhZHZlcnRpc2UgaXQgaW4gaXdfaGFuZGxlcl9kZWYtPnNweV9vZmZzZXQpLgorICogT25lIG9mIHRoZSBtYWluIGFkdmFudGFnZSBvZiBjZW50cmFsaXNpbmcgc3B5IHN1cHBvcnQgaGVyZSBpcyB0aGF0CisgKiBpdCBiZWNvbWVzIG11Y2ggZWFzaWVyIHRvIGltcHJvdmUgYW5kIGV4dGVuZCBpdCB3aXRob3V0IGhhdmluZyB0byB0b3VjaAorICogdGhlIGRyaXZlcnMuIE9uZSBleGFtcGxlIGlzIHRoZSBhZGRpdGlvbiBvZiB0aGUgU3B5LVRocmVzaG9sZCBldmVudHMuCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgc3B5IGRhdGEgaW4gdGhlIGRyaXZlci4KKyAqIEJlY2F1c2UgdGhpcyBpcyBjYWxsZWQgb24gdGhlIFJ4IHBhdGggdmlhIHdpcmVsZXNzX3NweV91cGRhdGUoKSwKKyAqIHdlIHdhbnQgaXQgdG8gYmUgZWZmaWNpZW50Li4uCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGl3X3NweV9kYXRhICogZ2V0X3NweWRhdGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBUaGlzIGlzIHRoZSBuZXcgd2F5ICovCisJaWYoZGV2LT53aXJlbGVzc19kYXRhKQorCQlyZXR1cm4oZGV2LT53aXJlbGVzc19kYXRhLT5zcHlfZGF0YSk7CisKKwkvKiBUaGlzIGlzIHRoZSBvbGQgd2F5LiBEb2Vzbid0IHdvcmsgZm9yIG11bHRpLWhlYWRlZCBkcml2ZXJzLgorCSAqIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCB2ZXJzaW9uIG9mIFdFLiAqLworCXJldHVybiAoZGV2LT5wcml2ICsgZGV2LT53aXJlbGVzc19oYW5kbGVycy0+c3B5X29mZnNldCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTdGFuZGFyZCBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IFNweSBMaXN0CisgKi8KK2ludCBpd19oYW5kbGVyX3NldF9zcHkoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCisJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICoJaW5mbywKKwkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKgl3cnF1LAorCQkgICAgICAgY2hhciAqCQkJZXh0cmEpCit7CisJc3RydWN0IGl3X3NweV9kYXRhICoJc3B5ZGF0YSA9IGdldF9zcHlkYXRhKGRldik7CisJc3RydWN0IHNvY2thZGRyICoJYWRkcmVzcyA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgZXh0cmE7CisKKwlpZighZGV2LT53aXJlbGVzc19kYXRhKQorCQkvKiBIZWxwIHVzZXIga25vdyB0aGF0IGRyaXZlciBuZWVkcyB1cGRhdGluZyAqLworCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFKSA6IERyaXZlciB1c2luZyBvbGQvYnVnZ3kgc3B5IHN1cHBvcnQsIHBsZWFzZSBmaXggZHJpdmVyICFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCS8qIE1ha2Ugc3VyZSBkcml2ZXIgaXMgbm90IGJ1Z2d5IG9yIHVzaW5nIHRoZSBvbGQgQVBJICovCisJaWYoIXNweWRhdGEpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCS8qIERpc2FibGUgc3B5IGNvbGxlY3Rpb24gd2hpbGUgd2UgY29weSB0aGUgYWRkcmVzc2VzLgorCSAqIFdoaWxlIHdlIGNvcHkgYWRkcmVzc2VzLCBhbnkgY2FsbCB0byB3aXJlbGVzc19zcHlfdXBkYXRlKCkKKwkgKiB3aWxsIE5PUC4gVGhpcyBpcyBPSywgYXMgYW55d2F5IHRoZSBhZGRyZXNzZXMgYXJlIGNoYW5naW5nLiAqLworCXNweWRhdGEtPnNweV9udW1iZXIgPSAwOworCisJLyogV2Ugd2FudCB0byBvcGVyYXRlIHdpdGhvdXQgbG9ja2luZywgYmVjYXVzZSB3aXJlbGVzc19zcHlfdXBkYXRlKCkKKwkgKiBtb3N0IGxpa2VseSB3aWxsIGhhcHBlbiBpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIsIGFuZCB0aGVyZWZvcmUKKwkgKiBoYXZlIGl0cyBvd24gbG9ja2luZyBjb25zdHJhaW50cyBhbmQgbmVlZHMgcGVyZm9ybWFuY2UuCisJICogVGhlIHJ0bmxfbG9jaygpIG1ha2Ugc3VyZSB3ZSBkb24ndCByYWNlIHdpdGggdGhlIG90aGVyIGl3X2hhbmRsZXJzLgorCSAqIFRoaXMgbWFrZSBzdXJlIHdpcmVsZXNzX3NweV91cGRhdGUoKSAic2VlIiB0aGF0IHRoZSBzcHkgbGlzdAorCSAqIGlzIHRlbXBvcmFyaWx5IGRpc2FibGVkLiAqLworCXdtYigpOworCisJLyogQXJlIHRoZXJlIGFyZSBhZGRyZXNzZXMgdG8gY29weT8gKi8KKwlpZih3cnF1LT5kYXRhLmxlbmd0aCA+IDApIHsKKwkJaW50IGk7CisKKwkJLyogQ29weSBhZGRyZXNzZXMgKi8KKwkJZm9yKGkgPSAwOyBpIDwgd3JxdS0+ZGF0YS5sZW5ndGg7IGkrKykKKwkJCW1lbWNweShzcHlkYXRhLT5zcHlfYWRkcmVzc1tpXSwgYWRkcmVzc1tpXS5zYV9kYXRhLAorCQkJICAgICAgIEVUSF9BTEVOKTsKKwkJLyogUmVzZXQgc3RhdHMgKi8KKwkJbWVtc2V0KHNweWRhdGEtPnNweV9zdGF0LCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSAqIElXX01BWF9TUFkpOworCisjaWZkZWYgV0VfU1BZX0RFQlVHCisJCXByaW50ayhLRVJOX0RFQlVHICJpd19oYW5kbGVyX3NldF9zcHkoKSA6ICBvZmZzZXQgJWxkLCBzcHlkYXRhICVwLCBudW0gJWRcbiIsIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPnNweV9vZmZzZXQsIHNweWRhdGEsIHdycXUtPmRhdGEubGVuZ3RoKTsKKwkJZm9yIChpID0gMDsgaSA8IHdycXUtPmRhdGEubGVuZ3RoOyBpKyspCisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJICAgICAgICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCBcbiIsCisJCQkgICAgICAgc3B5ZGF0YS0+c3B5X2FkZHJlc3NbaV1bMF0sCisJCQkgICAgICAgc3B5ZGF0YS0+c3B5X2FkZHJlc3NbaV1bMV0sCisJCQkgICAgICAgc3B5ZGF0YS0+c3B5X2FkZHJlc3NbaV1bMl0sCisJCQkgICAgICAgc3B5ZGF0YS0+c3B5X2FkZHJlc3NbaV1bM10sCisJCQkgICAgICAgc3B5ZGF0YS0+c3B5X2FkZHJlc3NbaV1bNF0sCisJCQkgICAgICAgc3B5ZGF0YS0+c3B5X2FkZHJlc3NbaV1bNV0pOworI2VuZGlmCS8qIFdFX1NQWV9ERUJVRyAqLworCX0KKworCS8qIE1ha2Ugc3VyZSBhYm92ZSBpcyB1cGRhdGVkIGJlZm9yZSByZS1lbmFibGluZyAqLworCXdtYigpOworCisJLyogRW5hYmxlIGFkZHJlc3NlcyAqLworCXNweWRhdGEtPnNweV9udW1iZXIgPSB3cnF1LT5kYXRhLmxlbmd0aDsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU3RhbmRhcmQgV2lyZWxlc3MgSGFuZGxlciA6IGdldCBTcHkgTGlzdAorICovCitpbnQgaXdfaGFuZGxlcl9nZXRfc3B5KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAorCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqCWluZm8sCisJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICoJd3JxdSwKKwkJICAgICAgIGNoYXIgKgkJCWV4dHJhKQoreworCXN0cnVjdCBpd19zcHlfZGF0YSAqCXNweWRhdGEgPSBnZXRfc3B5ZGF0YShkZXYpOworCXN0cnVjdCBzb2NrYWRkciAqCWFkZHJlc3MgPSAoc3RydWN0IHNvY2thZGRyICopIGV4dHJhOworCWludAkJCWk7CisKKwkvKiBNYWtlIHN1cmUgZHJpdmVyIGlzIG5vdCBidWdneSBvciB1c2luZyB0aGUgb2xkIEFQSSAqLworCWlmKCFzcHlkYXRhKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHNweWRhdGEtPnNweV9udW1iZXI7CisKKwkvKiBDb3B5IGFkZHJlc3Nlcy4gKi8KKwlmb3IoaSA9IDA7IGkgPCBzcHlkYXRhLT5zcHlfbnVtYmVyOyBpKyspIAl7CisJCW1lbWNweShhZGRyZXNzW2ldLnNhX2RhdGEsIHNweWRhdGEtPnNweV9hZGRyZXNzW2ldLCBFVEhfQUxFTik7CisJCWFkZHJlc3NbaV0uc2FfZmFtaWx5ID0gQUZfVU5JWDsKKwl9CisJLyogQ29weSBzdGF0cyB0byB0aGUgdXNlciBidWZmZXIgKGp1c3QgYWZ0ZXIpLiAqLworCWlmKHNweWRhdGEtPnNweV9udW1iZXIgPiAwKQorCQltZW1jcHkoZXh0cmEgICsgKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpICpzcHlkYXRhLT5zcHlfbnVtYmVyKSwKKwkJICAgICAgIHNweWRhdGEtPnNweV9zdGF0LAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSAqIHNweWRhdGEtPnNweV9udW1iZXIpOworCS8qIFJlc2V0IHVwZGF0ZWQgZmxhZ3MuICovCisJZm9yKGkgPSAwOyBpIDwgc3B5ZGF0YS0+c3B5X251bWJlcjsgaSsrKQorCQlzcHlkYXRhLT5zcHlfc3RhdFtpXS51cGRhdGVkID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFN0YW5kYXJkIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgc3B5IHRocmVzaG9sZAorICovCitpbnQgaXdfaGFuZGxlcl9zZXRfdGhyc3B5KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICoJd3JxdSwKKwkJCSAgY2hhciAqCQlleHRyYSkKK3sKKwlzdHJ1Y3QgaXdfc3B5X2RhdGEgKglzcHlkYXRhID0gZ2V0X3NweWRhdGEoZGV2KTsKKwlzdHJ1Y3QgaXdfdGhyc3B5ICoJdGhyZXNob2xkID0gKHN0cnVjdCBpd190aHJzcHkgKikgZXh0cmE7CisKKwkvKiBNYWtlIHN1cmUgZHJpdmVyIGlzIG5vdCBidWdneSBvciB1c2luZyB0aGUgb2xkIEFQSSAqLworCWlmKCFzcHlkYXRhKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkvKiBKdXN0IGRvIGl0ICovCisJbWVtY3B5KCYoc3B5ZGF0YS0+c3B5X3Rocl9sb3cpLCAmKHRocmVzaG9sZC0+bG93KSwKKwkgICAgICAgMiAqIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkpOworCisJLyogQ2xlYXIgZmxhZyAqLworCW1lbXNldChzcHlkYXRhLT5zcHlfdGhyX3VuZGVyLCAnXDAnLCBzaXplb2Yoc3B5ZGF0YS0+c3B5X3Rocl91bmRlcikpOworCisjaWZkZWYgV0VfU1BZX0RFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgIml3X2hhbmRsZXJfc2V0X3RocnNweSgpIDogIGxvdyAlZCA7IGhpZ2ggJWRcbiIsIHNweWRhdGEtPnNweV90aHJfbG93LmxldmVsLCBzcHlkYXRhLT5zcHlfdGhyX2hpZ2gubGV2ZWwpOworI2VuZGlmCS8qIFdFX1NQWV9ERUJVRyAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTdGFuZGFyZCBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IHNweSB0aHJlc2hvbGQKKyAqLworaW50IGl3X2hhbmRsZXJfZ2V0X3RocnNweShzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqCXdycXUsCisJCQkgIGNoYXIgKgkJZXh0cmEpCit7CisJc3RydWN0IGl3X3NweV9kYXRhICoJc3B5ZGF0YSA9IGdldF9zcHlkYXRhKGRldik7CisJc3RydWN0IGl3X3RocnNweSAqCXRocmVzaG9sZCA9IChzdHJ1Y3QgaXdfdGhyc3B5ICopIGV4dHJhOworCisJLyogTWFrZSBzdXJlIGRyaXZlciBpcyBub3QgYnVnZ3kgb3IgdXNpbmcgdGhlIG9sZCBBUEkgKi8KKwlpZighc3B5ZGF0YSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJLyogSnVzdCBkbyBpdCAqLworCW1lbWNweSgmKHRocmVzaG9sZC0+bG93KSwgJihzcHlkYXRhLT5zcHlfdGhyX2xvdyksCisJICAgICAgIDIgKiBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpKTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUHJlcGFyZSBhbmQgc2VuZCBhIFNweSBUaHJlc2hvbGQgZXZlbnQKKyAqLworc3RhdGljIHZvaWQgaXdfc2VuZF90aHJzcHlfZXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCisJCQkJIHN0cnVjdCBpd19zcHlfZGF0YSAqCXNweWRhdGEsCisJCQkJIHVuc2lnbmVkIGNoYXIgKglhZGRyZXNzLAorCQkJCSBzdHJ1Y3QgaXdfcXVhbGl0eSAqCXdzdGF0cykKK3sKKwl1bmlvbiBpd3JlcV9kYXRhCXdycXU7CisJc3RydWN0IGl3X3RocnNweQl0aHJlc2hvbGQ7CisKKwkvKiBJbml0ICovCisJd3JxdS5kYXRhLmxlbmd0aCA9IDE7CisJd3JxdS5kYXRhLmZsYWdzID0gMDsKKwkvKiBDb3B5IGFkZHJlc3MgKi8KKwltZW1jcHkodGhyZXNob2xkLmFkZHIuc2FfZGF0YSwgYWRkcmVzcywgRVRIX0FMRU4pOworCXRocmVzaG9sZC5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkvKiBDb3B5IHN0YXRzICovCisJbWVtY3B5KCYodGhyZXNob2xkLnF1YWwpLCB3c3RhdHMsIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkpOworCS8qIENvcHkgYWxzbyB0aHJlc2hvbGRzICovCisJbWVtY3B5KCYodGhyZXNob2xkLmxvdyksICYoc3B5ZGF0YS0+c3B5X3Rocl9sb3cpLAorCSAgICAgICAyICogc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSk7CisKKyNpZmRlZiBXRV9TUFlfREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAiaXdfc2VuZF90aHJzcHlfZXZlbnQoKSA6IGFkZHJlc3MgJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlgsIGxldmVsICVkLCB1cCA9ICVkXG4iLAorCSAgICAgICB0aHJlc2hvbGQuYWRkci5zYV9kYXRhWzBdLAorCSAgICAgICB0aHJlc2hvbGQuYWRkci5zYV9kYXRhWzFdLAorCSAgICAgICB0aHJlc2hvbGQuYWRkci5zYV9kYXRhWzJdLAorCSAgICAgICB0aHJlc2hvbGQuYWRkci5zYV9kYXRhWzNdLAorCSAgICAgICB0aHJlc2hvbGQuYWRkci5zYV9kYXRhWzRdLAorCSAgICAgICB0aHJlc2hvbGQuYWRkci5zYV9kYXRhWzVdLCB0aHJlc2hvbGQucXVhbC5sZXZlbCk7CisjZW5kaWYJLyogV0VfU1BZX0RFQlVHICovCisKKwkvKiBTZW5kIGV2ZW50IHRvIHVzZXIgc3BhY2UgKi8KKwl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgU0lPQ0dJV1RIUlNQWSwgJndycXUsIChjaGFyICopICZ0aHJlc2hvbGQpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogQ2FsbCBmb3IgdGhlIGRyaXZlciB0byB1cGRhdGUgdGhlIHNweSBkYXRhLgorICogRm9yIG5vdywgdGhlIHNweSBkYXRhIGlzIGEgc2ltcGxlIGFycmF5LiBBcyB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgaXMKKyAqIHNtYWxsLCB0aGlzIGlzIGdvb2QgZW5vdWdoLiBJZiB3ZSB3YW50ZWQgdG8gc3VwcG9ydCBsYXJnZXIgbnVtYmVyIG9mCisgKiBzcHkgYWRkcmVzc2VzLCB3ZSBzaG91bGQgdXNlIHNvbWV0aGluZyBtb3JlIGVmZmljaWVudC4uLgorICovCit2b2lkIHdpcmVsZXNzX3NweV91cGRhdGUoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCisJCQkgdW5zaWduZWQgY2hhciAqCWFkZHJlc3MsCisJCQkgc3RydWN0IGl3X3F1YWxpdHkgKgl3c3RhdHMpCit7CisJc3RydWN0IGl3X3NweV9kYXRhICoJc3B5ZGF0YSA9IGdldF9zcHlkYXRhKGRldik7CisJaW50CQkJaTsKKwlpbnQJCQltYXRjaCA9IC0xOworCisJLyogTWFrZSBzdXJlIGRyaXZlciBpcyBub3QgYnVnZ3kgb3IgdXNpbmcgdGhlIG9sZCBBUEkgKi8KKwlpZighc3B5ZGF0YSkKKwkJcmV0dXJuOworCisjaWZkZWYgV0VfU1BZX0RFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgIndpcmVsZXNzX3NweV91cGRhdGUoKSA6ICBvZmZzZXQgJWxkLCBzcHlkYXRhICVwLCBhZGRyZXNzICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLCBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5zcHlfb2Zmc2V0LCBzcHlkYXRhLCBhZGRyZXNzWzBdLCBhZGRyZXNzWzFdLCBhZGRyZXNzWzJdLCBhZGRyZXNzWzNdLCBhZGRyZXNzWzRdLCBhZGRyZXNzWzVdKTsKKyNlbmRpZgkvKiBXRV9TUFlfREVCVUcgKi8KKworCS8qIFVwZGF0ZSBhbGwgcmVjb3JkcyB0aGF0IG1hdGNoICovCisJZm9yKGkgPSAwOyBpIDwgc3B5ZGF0YS0+c3B5X251bWJlcjsgaSsrKQorCQlpZighbWVtY21wKGFkZHJlc3MsIHNweWRhdGEtPnNweV9hZGRyZXNzW2ldLCBFVEhfQUxFTikpIHsKKwkJCW1lbWNweSgmKHNweWRhdGEtPnNweV9zdGF0W2ldKSwgd3N0YXRzLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkpOworCQkJbWF0Y2ggPSBpOworCQl9CisKKwkvKiBHZW5lcmF0ZSBhbiBldmVudCBpZiB3ZSBjcm9zcyB0aGUgc3B5IHRocmVzaG9sZC4KKwkgKiBUbyBhdm9pZCBldmVudCBzdG9ybXMsIHdlIGhhdmUgYSBzaW1wbGUgaHlzdGVyZXNpcyA6IHdlIGdlbmVyYXRlCisJICogZXZlbnQgb25seSB3aGVuIHdlIGdvIHVuZGVyIHRoZSBsb3cgdGhyZXNob2xkIG9yIGFib3ZlIHRoZQorCSAqIGhpZ2ggdGhyZXNob2xkLiAqLworCWlmKG1hdGNoID49IDApIHsKKwkJaWYoc3B5ZGF0YS0+c3B5X3Rocl91bmRlclttYXRjaF0pIHsKKwkJCWlmKHdzdGF0cy0+bGV2ZWwgPiBzcHlkYXRhLT5zcHlfdGhyX2hpZ2gubGV2ZWwpIHsKKwkJCQlzcHlkYXRhLT5zcHlfdGhyX3VuZGVyW21hdGNoXSA9IDA7CisJCQkJaXdfc2VuZF90aHJzcHlfZXZlbnQoZGV2LCBzcHlkYXRhLAorCQkJCQkJICAgICBhZGRyZXNzLCB3c3RhdHMpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYod3N0YXRzLT5sZXZlbCA8IHNweWRhdGEtPnNweV90aHJfbG93LmxldmVsKSB7CisJCQkJc3B5ZGF0YS0+c3B5X3Rocl91bmRlclttYXRjaF0gPSAxOworCQkJCWl3X3NlbmRfdGhyc3B5X2V2ZW50KGRldiwgc3B5ZGF0YSwKKwkJCQkJCSAgICAgYWRkcmVzcywgd3N0YXRzKTsKKwkJCX0KKwkJfQorCX0KK30KKworRVhQT1JUX1NZTUJPTChpd19oYW5kbGVyX2dldF9zcHkpOworRVhQT1JUX1NZTUJPTChpd19oYW5kbGVyX2dldF90aHJzcHkpOworRVhQT1JUX1NZTUJPTChpd19oYW5kbGVyX3NldF9zcHkpOworRVhQT1JUX1NZTUJPTChpd19oYW5kbGVyX3NldF90aHJzcHkpOworRVhQT1JUX1NZTUJPTCh3aXJlbGVzc19zZW5kX2V2ZW50KTsKK0VYUE9SVF9TWU1CT0wod2lyZWxlc3Nfc3B5X3VwZGF0ZSk7CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L0tjb25maWcgYi9uZXQvZGVjbmV0L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEwMWRhNQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9kZWNuZXQvS2NvbmZpZwpAQCAtMCwwICsxLDI3IEBACisjCisjIERFQ25ldCBjb25maWd1cmF0aW9uCisjCitjb25maWcgREVDTkVUX1JPVVRFUgorCWJvb2wgIkRFQ25ldDogcm91dGVyIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBERUNORVQgJiYgRVhQRVJJTUVOVEFMCisJLS0taGVscC0tLQorCSAgQWRkIHN1cHBvcnQgZm9yIHR1cm5pbmcgeW91ciBERUNuZXQgRW5kbm9kZSBpbnRvIGEgbGV2ZWwgMSBvciAyCisJICByb3V0ZXIuICBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCwgYnV0IGZ1bmN0aW9uYWwgb3B0aW9uLiAgSWYgeW91CisJICBkbyBzYXkgWSBoZXJlLCB0aGVuIG1ha2Ugc3VyZSB0aGF0IHlvdSBhbHNvIHNheSBZIHRvICJLZXJuZWwvVXNlcgorCSAgbmV0d29yayBsaW5rIGRyaXZlciIsICJSb3V0aW5nIG1lc3NhZ2VzIiBhbmQgIk5ldHdvcmsgcGFja2V0CisJICBmaWx0ZXJpbmciLiAgVGhlIGZpcnN0IHR3byBhcmUgcmVxdWlyZWQgdG8gYWxsb3cgY29uZmlndXJhdGlvbiB2aWEKKwkgIHJ0bmV0bGluayAoeW91IHdpbGwgbmVlZCBBbGV4ZXkgS3V6bmV0c292J3MgaXByb3V0ZTIgcGFja2FnZQorCSAgZnJvbSA8ZnRwOi8vZnRwLnR1eC5vcmcvcHViL25ldC9pcC1yb3V0aW5nLz4pLiBUaGUgIk5ldHdvcmsgcGFja2V0CisJICBmaWx0ZXJpbmciIG9wdGlvbiB3aWxsIGJlIHJlcXVpcmVkIGZvciB0aGUgZm9ydGhjb21pbmcgcm91dGluZyBkYWVtb24KKwkgIHRvIHdvcmsuCisKKwkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGVjbmV0LnR4dD4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK2NvbmZpZyBERUNORVRfUk9VVEVfRldNQVJLCisJYm9vbCAiREVDbmV0OiB1c2UgRldNQVJLIHZhbHVlIGFzIHJvdXRpbmcga2V5IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gREVDTkVUX1JPVVRFUiAmJiBORVRGSUxURVIKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgYmUgYWJsZSB0byBzcGVjaWZ5IGRpZmZlcmVudCByb3V0ZXMgZm9yCisJICBwYWNrZXRzIHdpdGggZGlmZmVyZW50IEZXTUFSSyAoImZpcmV3YWxsaW5nIG1hcmsiKSB2YWx1ZXMKKwkgIChzZWUgaXBjaGFpbnMoOCksICItbSIgYXJndW1lbnQpLgorCmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L01ha2VmaWxlIGIvbmV0L2RlY25ldC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDQwMDNhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2RlY25ldC9NYWtlZmlsZQpAQCAtMCwwICsxLDEwIEBACisKK29iai0kKENPTkZJR19ERUNORVQpICs9IGRlY25ldC5vCisKK2RlY25ldC15IDo9IGFmX2RlY25ldC5vIGRuX25zcF9pbi5vIGRuX25zcF9vdXQubyBcCisJICAgIGRuX3JvdXRlLm8gZG5fZGV2Lm8gZG5fbmVpZ2gubyBkbl90aW1lci5vCitkZWNuZXQtJChDT05GSUdfREVDTkVUX1JPVVRFUikgKz0gZG5fZmliLm8gZG5fcnVsZXMubyBkbl90YWJsZS5vCitkZWNuZXQteSArPSBzeXNjdGxfbmV0X2RlY25ldC5vCisKK29iai0kKENPTkZJR19ORVRGSUxURVIpICs9IG5ldGZpbHRlci8KKwpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9SRUFETUUgYi9uZXQvZGVjbmV0L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGU3ZWM4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2RlY25ldC9SRUFETUUKQEAgLTAsMCArMSw4IEBACisgICAgICAgICAgICAgICAgICAgICAgIExpbnV4IERFQ25ldCBQcm9qZWN0CisgICAgICAgICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBrZXJuZWwgc3Vic3lzdGVtIGlzIGF2YWlsYWJsZSBpbiB0aGUKK0RvY3VtZW50YXRpb24vbmV0d29ya2luZyBzdWJkaXJlY3Rvcnkgb2YgdGhpcyBkaXN0cmlidXRpb24gYW5kIGFsc28KK29uIGxpbmUgYXQgaHR0cDovL3d3dy5jaHlnd3luLmNvbS9ERUNuZXQvCisKK1N0ZXZlIFdoaXRlaG91c2UgPFN0ZXZlV0BBQ00ub3JnPgpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9UT0RPIGIvbmV0L2RlY25ldC9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYjVhYzYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvZGVjbmV0L1RPRE8KQEAgLTAsMCArMSw0MSBAQAorU3RldmUncyBxdWljayBsaXN0IG9mIHRoaW5ncyB0aGF0IG5lZWQgZmluaXNoaW5nIG9mZjoKK1t0aGV5IGFyZSBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyIGFuZCByYW5nZSBmcm9tIHRoZSB0cml2aWFsIHRvIHRoZSBsb25nIHdpbmRlZF0KKworIG8gUHJvcGVyIHRpbWVvdXRzIG9uIGVhY2ggbmVpZ2hib3VyIChpbiByb3V0aW5nIG1vZGUpIHJhdGhlciB0aGFuCisgICBqdXN0IHRoZSA2MCBzZWNvbmQgT24tRXRoZXJuZXQgY2FjaGUgdmFsdWUuCisKKyBvIFN1cHBvcnQgZm9yIFguMjUgbGlua2xheWVyCisKKyBvIFN1cHBvcnQgZm9yIEREQ01QIGxpbmsgbGF5ZXIKKworIG8gVGhlIEREQ01QIGRldmljZSBpdHNlbGYKKworIG8gUFBQIHN1cHBvcnQgKHJmYzE3NjIpCisKKyBvIExvdHMgb2YgdGVzdGluZyB3aXRoIHJlYWwgYXBwbGljYXRpb25zCisKKyBvIFZlcmlmeSBlcnJvcnMgZXRjLiBhZ2FpbnN0IFBPU0lYIDEwMDMuMWcgKGRyYWZ0KQorCisgbyBVc2luZyBzZW5kL3JlY3Ztc2coKSB0byBnZXQgYXQgY29ubmVjdC9kaXNjb25uZWN0IGRhdGEgKFBPU0lYIDEwMDMuMWcpIAorICAgW21heWJlIHRoaXMgc2hvdWxkIGJlIGRvbmUgYXQgc29ja2V0IGxldmVsLi4uIHRoZSBjb250cm9sIGRhdGEgaW4gdGhlCisgICAgc2VuZC9yZWN2bXNnKCkgY2FsbHMgc2hvdWxkIHNpbXBseSBiZSBhIHZlY3RvciBvZiBzZXQvZ2V0c29ja29wdCgpCisgICAgY2FsbHNdCisKKyBvIGNoZWNrIE1TR19DVFJVTkMgaXMgc2V0IHdoZXJlIGl0IHNob3VsZCBiZS4KKworIG8gRmluZCBhbGwgdGhlIGNvbW1vbmFsaXR5IGJldHdlZW4gREVDbmV0IGFuZCBJUHY0IHJvdXRpbmcgY29kZSBhbmQgZXh0cmFjdCAKKyAgIGl0IGludG8gYSBzbWFsbCBsaWJyYXJ5IG9mIHJvdXRpbmVzLiBbcHJvYmFibHkgYSBwcm9qZWN0IGZvciAyLjcueHhdCisKKyBvIEFkZCBwZXJmZWN0IHNvY2tldCBoYXNoaW5nIC0gYW4gaWRlYSBzdWdnZXN0ZWQgYnkgUGF1bCBLb25pbmcuIEN1cnJlbnRseQorICAgd2UgaGF2ZSBhIGhhbGYtd2F5IGhvdXNlIHNjaGVtZSB3aGljaCBzZWVtcyB0byB3b3JrIHJlYXNvbmFibHkgd2VsbCwgYnV0CisgICB0aGUgZnVsbCBzY2hlbWUgaXMgc3RpbGwgd29ydGggaW1wbGVtZW50aW5nLCBpdHMgbm90IG5vdCB0b3Agb2YgbXkgbGlzdAorICAgcmlnaHQgbm93LgorCisgbyBBZGQgc2Vzc2lvbiBjb250cm9sIG1lc3NhZ2UgZmxvdyBjb250cm9sCisKKyBvIEFkZCBOU1AgbWVzc2FnZSBmbG93IGNvbnRyb2wKKworIG8gREVDbmV0IHNlbmRwYWdlcygpIGZ1bmN0aW9uCisKKyBvIEFJTyBmb3IgREVDbmV0CisKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvYWZfZGVjbmV0LmMgYi9uZXQvZGVjbmV0L2FmX2RlY25ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YmIzY2QKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvZGVjbmV0L2FmX2RlY25ldC5jCkBAIC0wLDAgKzEsMjQwNSBAQAorCisvKgorICogREVDbmV0ICAgICAgIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBERUNuZXQgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICogICAgICAgICAgICAgIG9wZXJhdGluZyBzeXN0ZW0uICBERUNuZXQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKiAgICAgICAgICAgICAgaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICogICAgICAgICAgICAgIERFQ25ldCBTb2NrZXQgTGF5ZXIgSW50ZXJmYWNlCisgKgorICogQXV0aG9yczogICAgIEVkdWFyZG8gTWFyY2VsbyBTZXJyYXQgPGVtc2VycmF0QGdlb2NpdGllcy5jb20+CisgKiAgICAgICAgICAgICAgUGF0cmljayBDYXVsZmllbGQgPHBhdHJpY2tAcGFuZGguZGVtb24uY28udWs+CisgKgorICogQ2hhbmdlczoKKyAqICAgICAgICBTdGV2ZSBXaGl0ZWhvdXNlOiBDb3BpZWQgZnJvbSBFZHVhcmRvIFNlcnJhdCBhbmQgUGF0cmljayBDYXVsZmllbGQncworICogICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gb2YgdGhlIGNvZGUuIE9yaWdpbmFsIGNvcHlyaWdodCBwcmVzZXJ2ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBiZWxvdy4KKyAqICAgICAgICBTdGV2ZSBXaGl0ZWhvdXNlOiBTb21lIGJ1ZyBmaXhlcywgY2xlYW5pbmcgdXAgc29tZSBjb2RlIHRvIG1ha2UgaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmxlIHdpdGggbXkgcm91dGluZyBsYXllci4KKyAqICAgICAgICBTdGV2ZSBXaGl0ZWhvdXNlOiBNZXJnaW5nIGNoYW5nZXMgZnJvbSBFZHVhcmRvIFNlcnJhdCBhbmQgUGF0cmljaworICogICAgICAgICAgICAgICAgICAgICAgICAgIENhdWxmaWVsZC4KKyAqICAgICAgICBTdGV2ZSBXaGl0ZWhvdXNlOiBGdXJ0aGVyIGJ1ZyBmaXhlcywgY2hlY2tpbmcgbW9kdWxlIGNvZGUgc3RpbGwgd29ya3MKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG5ldyByb3V0aW5nIGxheWVyLgorICogICAgICAgIFN0ZXZlIFdoaXRlaG91c2U6IEFkZGl0aW9uYWwgc2V0L2dldF9zb2Nrb3B0KCkgY2FsbHMuCisgKiAgICAgICAgU3RldmUgV2hpdGVob3VzZTogRml4ZWQgVElPQ0lOUSBpb2N0bCB0byBiZSBzYW1lIGFzIEVkdWFyZG8ncyBuZXcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLgorICogICAgICAgIFN0ZXZlIFdoaXRlaG91c2U6IHJlY3Ztc2coKSBjaGFuZ2VkIHRvIHRyeSBhbmQgYmVoYXZlIGluIGEgUE9TSVggbGlrZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHdheS4gRGlkbid0IG1hbmFnZSBpdCBlbnRpcmVseSwgYnV0IGl0cyBiZXR0ZXIuCisgKiAgICAgICAgU3RldmUgV2hpdGVob3VzZTogZGl0dG8gZm9yIHNlbmRtc2coKS4KKyAqICAgICAgICBTdGV2ZSBXaGl0ZWhvdXNlOiBBIHNlbGVjdGlvbiBvZiBidWcgZml4ZXMgdG8gdmFyaW91cyB0aGluZ3MuCisgKiAgICAgICAgU3RldmUgV2hpdGVob3VzZTogQWRkZWQgVElPQ09VVFEgaW9jdGwuCisgKiAgICAgICAgU3RldmUgV2hpdGVob3VzZTogRml4ZXMgdG8gdXNlcm5hbWUyc29ja2FkZHIgJiBzb2NrYWRkcjJ1c2VybmFtZS4KKyAqICAgICAgICBTdGV2ZSBXaGl0ZWhvdXNlOiBGaXhlcyB0byBjb25uZWN0KCkgZXJyb3IgcmV0dXJucy4KKyAqICAgICAgIFBhdHJpY2sgQ2F1bGZpZWxkOiBGaXhlcyB0byBkZWxheWVkIGFjY2VwdGFuY2UgbG9naWMuCisgKiAgICAgICAgIERhdmlkIFMuIE1pbGxlcjogTmV3IHNvY2tldCBsb2NraW5nCisgKiAgICAgICAgU3RldmUgV2hpdGVob3VzZTogU29ja2V0IGxpc3QgaGFzaGluZy9sb2NraW5nCisgKiAgICAgICAgIEFybmFsZG8gQy4gTWVsbzogdXNlIGNhcGFibGUsIG5vdCBzdXNlcgorICogICAgICAgIFN0ZXZlIFdoaXRlaG91c2U6IFJlbW92ZWQgdW51c2VkIGNvZGUuIEZpeCB0byB1c2Ugc2stPmFsbG9jYXRpb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHJlcXVpcmVkLgorICogICAgICAgUGF0cmljayBDYXVsZmllbGQ6IC9wcm9jL25ldC9kZWNuZXQgbm93IGhhcyBvYmplY3QgbmFtZS9udW1iZXIKKyAqICAgICAgICBTdGV2ZSBXaGl0ZWhvdXNlOiBGaXhlZCBsb2NhbCBwb3J0IGFsbG9jYXRpb24sIGhhc2hlZCBzayBsaXN0CisgKiAgICAgICAgICBNYXR0aGV3IFdpbGNveDogRml4ZXMgZm9yIGRuX2lvY3RsKCkKKyAqICAgICAgICBTdGV2ZSBXaGl0ZWhvdXNlOiBOZXcgY29ubmVjdC9hY2NlcHQgbG9naWMgdG8gYWxsb3cgdGltZW91dHMgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGFyZSBmb3Igc2VuZHBhZ2UgZXRjLgorICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIChjKSAxOTk1LTE5OTggRS5NLiBTZXJyYXQJCWVtc2VycmF0QGdlb2NpdGllcy5jb20KKyAgICAKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK0hJU1RPUlk6CisKK1ZlcnNpb24gICAgICAgICAgIEtlcm5lbCAgICAgRGF0ZSAgICAgICBBdXRob3IvQ29tbWVudHMKKy0tLS0tLS0gICAgICAgICAgIC0tLS0tLSAgICAgLS0tLSAgICAgICAtLS0tLS0tLS0tLS0tLS0KK1ZlcnNpb24gMC4wLjEgICAgIDIuMC4zMCAgICAwMS1kaWMtOTcJRWR1YXJkbyBNYXJjZWxvIFNlcnJhdAorCQkJCQkoZW1zZXJyYXRAZ2VvY2l0aWVzLmNvbSkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpcnN0IERldmVsb3BtZW50IG9mIERFQ25ldCBTb2NrZXQgTGEtCisJCQkJCXllciBmb3IgTGludXguIE9ubHkgc3VwcG9ydHMgb3V0Z29pbmcKKwkJCQkJY29ubmVjdGlvbnMuCisKK1ZlcnNpb24gMC4wLjIJICAyLjEuMTA1ICAgMjAtanVuLTk4ICAgUGF0cmljayBKLiBDYXVsZmllbGQKKwkJCQkJKHBhdHJpY2tAcGFuZGguZGVtb24uY28udWspCisKKwkJCQkJUG9ydCB0byBuZXcga2VybmVsIGRldmVsb3BtZW50IHZlcnNpb24uCisKK1ZlcnNpb24gMC4wLjMgICAgIDIuMS4xMDYgICAyNS1qdW4tOTggICBFZHVhcmRvIE1hcmNlbG8gU2VycmF0CisJCQkJCShlbXNlcnJhdEBnZW9jaXRpZXMuY29tKQorCQkJCQlfCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB3ZSBjYW4gc3RhcnQgZGV2ZWxvcGluZyBzZXJ2ZXIgYXBwcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIExpbnV4LgorCQkJCQktCisJCQkJCU1vZHVsZSBTdXBwb3J0CitWZXJzaW9uIDAuMC40ICAgICAyLjEuMTA5ICAgMjEtanVsLTk4ICAgRWR1YXJkbyBNYXJjZWxvIFNlcnJhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVtc2VycmF0QGdlb2NpdGllcy5jb20pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgWDExUjYuNC4gTm93IHdlIGNhbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2UgREVDbmV0IHRyYW5zcG9ydCBmb3IgWCBvbiBMaW51eCEhIQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorVmVyc2lvbiAwLjAuNSAgICAyLjEuMTEwICAgMDEtYXVnLTk4ICAgRWR1YXJkbyBNYXJjZWxvIFNlcnJhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVtc2VycmF0QGdlb2NpdGllcy5jb20pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVkIGJ1Z3Mgb24gZmxvdyBjb250cm9sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVkIGJ1Z3Mgb24gaW5jb21pbmcgYWNjZXNzZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KK1ZlcnNpb24gMC4wLjYgICAgMi4xLjExMCAgIDA3LWF1Zy05OCAgIEVkdWFyZG8gTWFyY2VsbyBTZXJyYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRuX3JlY3Ztc2cgZml4ZXMKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdHJpY2sgSi4gQ2F1bGZpZWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbl9iaW5kIGZpeGVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3JvdXRlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvZmxvdy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bmV0L25laWdoYm91ci5oPgorI2luY2x1ZGUgPG5ldC9kc3QuaD4KKyNpbmNsdWRlIDxuZXQvZG4uaD4KKyNpbmNsdWRlIDxuZXQvZG5fbnNwLmg+CisjaW5jbHVkZSA8bmV0L2RuX2Rldi5oPgorI2luY2x1ZGUgPG5ldC9kbl9yb3V0ZS5oPgorI2luY2x1ZGUgPG5ldC9kbl9maWIuaD4KKyNpbmNsdWRlIDxuZXQvZG5fbmVpZ2guaD4KKworc3RydWN0IGRuX3NvY2sgeworCXN0cnVjdCBzb2NrIHNrOworCXN0cnVjdCBkbl9zY3Agc2NwOworfTsKKworc3RhdGljIHZvaWQgZG5fa2VlcGFsaXZlKHN0cnVjdCBzb2NrICpzayk7CisKKyNkZWZpbmUgRE5fU0tfSEFTSF9TSElGVCA4CisjZGVmaW5lIEROX1NLX0hBU0hfU0laRSAoMSA8PCBETl9TS19IQVNIX1NISUZUKQorI2RlZmluZSBETl9TS19IQVNIX01BU0sgKEROX1NLX0hBU0hfU0laRSAtIDEpCisKKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgZG5fcHJvdG9fb3BzOworc3RhdGljIERFRklORV9SV0xPQ0soZG5faGFzaF9sb2NrKTsKK3N0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCBkbl9za19oYXNoW0ROX1NLX0hBU0hfU0laRV07CitzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgZG5fd2lsZF9zazsKKworc3RhdGljIGludCBfX2RuX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbiwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgX19kbl9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbiwgaW50IGZsYWdzKTsKKworc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkICpkbl9maW5kX2xpc3Qoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKKworCWlmIChzY3AtPmFkZHIuc2RuX2ZsYWdzICYgU0RGX1dJTEQpCisJCXJldHVybiBobGlzdF9lbXB0eSgmZG5fd2lsZF9zaykgPyAmZG5fd2lsZF9zayA6IE5VTEw7CisKKwlyZXR1cm4gJmRuX3NrX2hhc2hbc2NwLT5hZGRybG9jICYgRE5fU0tfSEFTSF9NQVNLXTsKK30KKworLyogCisgKiBWYWxpZCBwb3J0cyBhcmUgdGhvc2UgZ3JlYXRlciB0aGFuIHplcm8gYW5kIG5vdCBhbHJlYWR5IGluIHVzZS4KKyAqLworc3RhdGljIGludCBjaGVja19wb3J0KHVuc2lnbmVkIHNob3J0IHBvcnQpCit7CisJc3RydWN0IHNvY2sgKnNrOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJaWYgKHBvcnQgPT0gMCkKKwkJcmV0dXJuIC0xOworCisJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZkbl9za19oYXNoW3BvcnQgJiBETl9TS19IQVNIX01BU0tdKSB7CisJCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKKwkJaWYgKHNjcC0+YWRkcmxvYyA9PSBwb3J0KQorCQkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHBvcnRfYWxsb2Moc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwb3J0ID0gMHgyMDAwOworCXVuc2lnbmVkIHNob3J0IGlfcG9ydCA9IHBvcnQ7CisKKwl3aGlsZShjaGVja19wb3J0KCsrcG9ydCkgIT0gMCkgeworCQlpZiAocG9ydCA9PSBpX3BvcnQpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlzY3AtPmFkZHJsb2MgPSBwb3J0OworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBTaW5jZSB0aGlzIGlzIG9ubHkgZXZlciBjYWxsZWQgZnJvbSB1c2VyCisgKiBsZXZlbCwgd2UgZG9uJ3QgbmVlZCBhIHdyaXRlX2xvY2soKSB2ZXJzaW9uCisgKiBvZiB0aGlzLgorICovCitzdGF0aWMgaW50IGRuX2hhc2hfc29jayhzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGRuX3NjcCAqc2NwID0gRE5fU0soc2spOworCXN0cnVjdCBobGlzdF9oZWFkICpsaXN0OworCWludCBydiA9IC1FVVNFUlM7CisKKwlCVUdfT04oc2tfaGFzaGVkKHNrKSk7CisKKwl3cml0ZV9sb2NrX2JoKCZkbl9oYXNoX2xvY2spOworCQorCWlmICghc2NwLT5hZGRybG9jICYmICFwb3J0X2FsbG9jKHNrKSkKKwkJZ290byBvdXQ7CisKKwlydiA9IC1FQUREUklOVVNFOworCWlmICgobGlzdCA9IGRuX2ZpbmRfbGlzdChzaykpID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJc2tfYWRkX25vZGUoc2ssIGxpc3QpOworCXJ2ID0gMDsKK291dDoKKwl3cml0ZV91bmxvY2tfYmgoJmRuX2hhc2hfbG9jayk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgdm9pZCBkbl91bmhhc2hfc29jayhzdHJ1Y3Qgc29jayAqc2spCit7CisJd3JpdGVfbG9jaygmZG5faGFzaF9sb2NrKTsKKwlza19kZWxfbm9kZV9pbml0KHNrKTsKKwl3cml0ZV91bmxvY2soJmRuX2hhc2hfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGRuX3VuaGFzaF9zb2NrX2JoKHN0cnVjdCBzb2NrICpzaykKK3sKKwl3cml0ZV9sb2NrX2JoKCZkbl9oYXNoX2xvY2spOworCXNrX2RlbF9ub2RlX2luaXQoc2spOworCXdyaXRlX3VubG9ja19iaCgmZG5faGFzaF9sb2NrKTsKK30KKworc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkICpsaXN0ZW5faGFzaChzdHJ1Y3Qgc29ja2FkZHJfZG4gKmFkZHIpCit7CisJaW50IGk7CisJdW5zaWduZWQgaGFzaCA9IGFkZHItPnNkbl9vYmpudW07CisKKwlpZiAoaGFzaCA9PSAwKSB7CisJCWhhc2ggPSBhZGRyLT5zZG5fb2JqbmFtZWw7CisJCWZvcihpID0gMDsgaSA8IGRuX250b2hzKGFkZHItPnNkbl9vYmpuYW1lbCk7IGkrKykgeworCQkJaGFzaCBePSBhZGRyLT5zZG5fb2JqbmFtZVtpXTsKKwkJCWhhc2ggXj0gKGhhc2ggPDwgMyk7CisJCX0KKwl9CisKKwlyZXR1cm4gJmRuX3NrX2hhc2hbaGFzaCAmIEROX1NLX0hBU0hfTUFTS107Cit9CisKKy8qCisgKiBDYWxsZWQgdG8gdHJhbnNmb3JtIGEgc29ja2V0IGZyb20gYm91bmQgKGkuZS4gd2l0aCBhIGxvY2FsIGFkZHJlc3MpCisgKiBpbnRvIGEgbGlzdGVuaW5nIHNvY2tldCAoZG9lc24ndCBuZWVkIGEgbG9jYWwgcG9ydCBudW1iZXIpIGFuZCByZWhhc2hlcworICogYmFzZWQgdXBvbiB0aGUgb2JqZWN0IG5hbWUvbnVtYmVyLgorICovCitzdGF0aWMgdm9pZCBkbl9yZWhhc2hfc29jayhzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGhsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IGRuX3NjcCAqc2NwID0gRE5fU0soc2spOworCisJaWYgKHNjcC0+YWRkci5zZG5fZmxhZ3MgJiBTREZfV0lMRCkKKwkJcmV0dXJuOworCisJd3JpdGVfbG9ja19iaCgmZG5faGFzaF9sb2NrKTsKKwlza19kZWxfbm9kZV9pbml0KHNrKTsKKwlETl9TSyhzayktPmFkZHJsb2MgPSAwOworCWxpc3QgPSBsaXN0ZW5faGFzaCgmRE5fU0soc2spLT5hZGRyKTsKKwlza19hZGRfbm9kZShzaywgbGlzdCk7CisJd3JpdGVfdW5sb2NrX2JoKCZkbl9oYXNoX2xvY2spOworfQorCitpbnQgZG5fc29ja2FkZHIydXNlcm5hbWUoc3RydWN0IHNvY2thZGRyX2RuICpzZG4sIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgY2hhciB0eXBlKQoreworCWludCBsZW4gPSAyOworCisJKmJ1ZisrID0gdHlwZTsKKworCXN3aXRjaCh0eXBlKSB7CisJCWNhc2UgMDoKKwkJCSpidWYrKyA9IHNkbi0+c2RuX29iam51bTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQkqYnVmKysgPSAwOworCQkJKmJ1ZisrID0gZG5fbnRvaHMoc2RuLT5zZG5fb2JqbmFtZWwpOworCQkJbWVtY3B5KGJ1Ziwgc2RuLT5zZG5fb2JqbmFtZSwgZG5fbnRvaHMoc2RuLT5zZG5fb2JqbmFtZWwpKTsKKwkJCWxlbiA9IDMgKyBkbl9udG9ocyhzZG4tPnNkbl9vYmpuYW1lbCk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJbWVtc2V0KGJ1ZiwgMCwgNSk7CisJCQlidWYgKz0gNTsKKwkJCSpidWYrKyA9IGRuX250b2hzKHNkbi0+c2RuX29iam5hbWVsKTsKKwkJCW1lbWNweShidWYsIHNkbi0+c2RuX29iam5hbWUsIGRuX250b2hzKHNkbi0+c2RuX29iam5hbWVsKSk7CisJCQlsZW4gPSA3ICsgZG5fbnRvaHMoc2RuLT5zZG5fb2JqbmFtZWwpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworLyoKKyAqIE9uIHJlY2VwdGlvbiBvZiB1c2VybmFtZXMsIHdlIGhhbmRsZSB0eXBlcyAxIGFuZCAwIGZvciBkZXN0aW5hdGlvbgorICogYWRkcmVzc2VzIG9ubHkuIFR5cGVzIDIgYW5kIDQgYXJlIHVzZWQgZm9yIHNvdXJjZSBhZGRyZXNzZXMsIGJ1dCB0aGUKKyAqIFVJQywgR0lDIGFyZSBpZ25vcmVkIGFuZCB0aGV5IGFyZSBib3RoIHRyZWF0ZWQgdGhlIHNhbWUgd2F5LiBUeXBlIDMKKyAqIGlzIG5ldmVyIHVzZWQgYXMgSSd2ZSBubyBpZGVhIHdoYXQgaXRzIHB1cnBvc2UgbWlnaHQgYmUgb3Igd2hhdCBpdHMKKyAqIGZvcm1hdCBpcy4KKyAqLworaW50IGRuX3VzZXJuYW1lMnNvY2thZGRyKHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4sIHN0cnVjdCBzb2NrYWRkcl9kbiAqc2RuLCB1bnNpZ25lZCBjaGFyICpmbXQpCit7CisJdW5zaWduZWQgY2hhciB0eXBlOworCWludCBzaXplID0gbGVuOworCWludCBuYW1lbCA9IDEyOworCisJc2RuLT5zZG5fb2JqbnVtID0gMDsKKwlzZG4tPnNkbl9vYmpuYW1lbCA9IGRuX2h0b25zKDApOworCW1lbXNldChzZG4tPnNkbl9vYmpuYW1lLCAwLCBETl9NQVhPQkpMKTsKKworCWlmIChsZW4gPCAyKQorCQlyZXR1cm4gLTE7CisKKwlsZW4gLT0gMjsKKwkqZm10ID0gKmRhdGErKzsKKwl0eXBlID0gKmRhdGErKzsKKworCXN3aXRjaCgqZm10KSB7CisJCWNhc2UgMDoKKwkJCXNkbi0+c2RuX29iam51bSA9IHR5cGU7CisJCQlyZXR1cm4gMjsKKwkJY2FzZSAxOgorCQkJbmFtZWwgPSAxNjsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlsZW4gIC09IDQ7CisJCQlkYXRhICs9IDQ7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJbGVuICAtPSA4OworCQkJZGF0YSArPSA4OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLTE7CisJfQorCisJbGVuIC09IDE7CisKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIC0xOworCisJc2RuLT5zZG5fb2JqbmFtZWwgPSBkbl9odG9ucygqZGF0YSsrKTsKKwlsZW4gLT0gZG5fbnRvaHMoc2RuLT5zZG5fb2JqbmFtZWwpOworCisJaWYgKChsZW4gPCAwKSB8fCAoZG5fbnRvaHMoc2RuLT5zZG5fb2JqbmFtZWwpID4gbmFtZWwpKQorCQlyZXR1cm4gLTE7CisKKwltZW1jcHkoc2RuLT5zZG5fb2JqbmFtZSwgZGF0YSwgZG5fbnRvaHMoc2RuLT5zZG5fb2JqbmFtZWwpKTsKKworCXJldHVybiBzaXplIC0gbGVuOworfQorCitzdHJ1Y3Qgc29jayAqZG5fc2tsaXN0X2ZpbmRfbGlzdGVuZXIoc3RydWN0IHNvY2thZGRyX2RuICphZGRyKQoreworCXN0cnVjdCBobGlzdF9oZWFkICpsaXN0ID0gbGlzdGVuX2hhc2goYWRkcik7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJc3RydWN0IHNvY2sgKnNrOworCisJcmVhZF9sb2NrKCZkbl9oYXNoX2xvY2spOworCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCBsaXN0KSB7CisJCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKKwkJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfTElTVEVOKQorCQkJY29udGludWU7CisJCWlmIChzY3AtPmFkZHIuc2RuX29iam51bSkgeworCQkJaWYgKHNjcC0+YWRkci5zZG5fb2JqbnVtICE9IGFkZHItPnNkbl9vYmpudW0pCisJCQkJY29udGludWU7CisJCX0gZWxzZSB7CisJCQlpZiAoYWRkci0+c2RuX29iam51bSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChzY3AtPmFkZHIuc2RuX29iam5hbWVsICE9IGFkZHItPnNkbl9vYmpuYW1lbCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChtZW1jbXAoc2NwLT5hZGRyLnNkbl9vYmpuYW1lLCBhZGRyLT5zZG5fb2JqbmFtZSwgZG5fbnRvaHMoYWRkci0+c2RuX29iam5hbWVsKSkgIT0gMCkKKwkJCQljb250aW51ZTsKKwkJfQorCQlzb2NrX2hvbGQoc2spOworCQlyZWFkX3VubG9jaygmZG5faGFzaF9sb2NrKTsKKwkJcmV0dXJuIHNrOworCX0KKworCXNrID0gc2tfaGVhZCgmZG5fd2lsZF9zayk7CisJaWYgKHNrKSB7CisJICAgICAgIAlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9MSVNURU4pCisJCQlzb2NrX2hvbGQoc2spOworCQllbHNlCisJCQlzayA9IE5VTEw7CisJfQorCisJcmVhZF91bmxvY2soJmRuX2hhc2hfbG9jayk7CisJcmV0dXJuIHNrOworfQorCitzdHJ1Y3Qgc29jayAqZG5fZmluZF9ieV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZG5fc2tiX2NiICpjYiA9IEROX1NLQl9DQihza2IpOworCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgZG5fc2NwICpzY3A7CisKKwlyZWFkX2xvY2soJmRuX2hhc2hfbG9jayk7CisJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZkbl9za19oYXNoW2NiLT5kc3RfcG9ydCAmIEROX1NLX0hBU0hfTUFTS10pIHsKKwkJc2NwID0gRE5fU0soc2spOworCQlpZiAoY2ItPnNyYyAhPSBkbl9zYWRkcjJkbigmc2NwLT5wZWVyKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoY2ItPmRzdF9wb3J0ICE9IHNjcC0+YWRkcmxvYykKKwkJCWNvbnRpbnVlOworCQlpZiAoc2NwLT5hZGRycmVtICYmIChjYi0+c3JjX3BvcnQgIT0gc2NwLT5hZGRycmVtKSkKKwkJCWNvbnRpbnVlOworCQlzb2NrX2hvbGQoc2spOworCQlnb3RvIGZvdW5kOworCX0KKwlzayA9IE5VTEw7Citmb3VuZDoKKwlyZWFkX3VubG9jaygmZG5faGFzaF9sb2NrKTsKKwlyZXR1cm4gc2s7Cit9CisKKworCitzdGF0aWMgdm9pZCBkbl9kZXN0cnVjdChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGRuX3NjcCAqc2NwID0gRE5fU0soc2spOworCisJc2tiX3F1ZXVlX3B1cmdlKCZzY3AtPmRhdGFfeG1pdF9xdWV1ZSk7CisJc2tiX3F1ZXVlX3B1cmdlKCZzY3AtPm90aGVyX3htaXRfcXVldWUpOworCXNrYl9xdWV1ZV9wdXJnZSgmc2NwLT5vdGhlcl9yZWNlaXZlX3F1ZXVlKTsKKworCWRzdF9yZWxlYXNlKHhjaGcoJnNrLT5za19kc3RfY2FjaGUsIE5VTEwpKTsKK30KKworc3RhdGljIHN0cnVjdCBwcm90byBkbl9wcm90byA9IHsKKwkubmFtZQkgID0gIkRFQ05FVCIsCisJLm93bmVyCSAgPSBUSElTX01PRFVMRSwKKwkub2JqX3NpemUgPSBzaXplb2Yoc3RydWN0IGRuX3NvY2spLAorfTsKKworc3RhdGljIHN0cnVjdCBzb2NrICpkbl9hbGxvY19zb2NrKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBnZnApCit7CisJc3RydWN0IGRuX3NjcCAqc2NwOworCXN0cnVjdCBzb2NrICpzayA9IHNrX2FsbG9jKFBGX0RFQ25ldCwgZ2ZwLCAmZG5fcHJvdG8sIDEpOworCisJaWYgICghc2spCisJCWdvdG8gb3V0OworCisJaWYgKHNvY2spCisJCXNvY2stPm9wcyA9ICZkbl9wcm90b19vcHM7CisJc29ja19pbml0X2RhdGEoc29jaywgc2spOworCisJc2stPnNrX2JhY2tsb2dfcmN2ID0gZG5fbnNwX2JhY2tsb2dfcmN2OworCXNrLT5za19kZXN0cnVjdCAgICA9IGRuX2Rlc3RydWN0OworCXNrLT5za19ub19jaGVjayAgICA9IDE7CisJc2stPnNrX2ZhbWlseSAgICAgID0gUEZfREVDbmV0OworCXNrLT5za19wcm90b2NvbCAgICA9IDA7CisJc2stPnNrX2FsbG9jYXRpb24gID0gZ2ZwOworCisJLyogSW5pdGlhbGl6YXRpb24gb2YgREVDbmV0IFNlc3Npb24gQ29udHJvbCBQb3J0CQkqLworCXNjcCA9IEROX1NLKHNrKTsKKwlzY3AtPnN0YXRlCT0gRE5fTzsJCS8qIE9wZW4JCQkqLworCXNjcC0+bnVtZGF0CT0gMTsJCS8qIE5leHQgZGF0YSBzZWcgdG8gdHgJKi8KKwlzY3AtPm51bW90aAk9IDE7CQkvKiBOZXh0IG90aCBkYXRhIHRvIHR4ICAqLworCXNjcC0+YWNreG10X2RhdCA9IDA7CQkvKiBMYXN0IGRhdGEgc2VnIGFjaydlZCAqLworCXNjcC0+YWNreG10X290aCA9IDA7CQkvKiBMYXN0IG90aCBkYXRhIGFjaydlZCAqLworCXNjcC0+YWNrcmN2X2RhdCA9IDA7CQkvKiBIaWdoZXN0IGRhdGEgYWNrIHJlY3YqLworCXNjcC0+YWNrcmN2X290aCA9IDA7CQkvKiBMYXN0IG90aCBkYXRhIGFjayByZWMqLworICAgICAgICBzY3AtPmZsb3dyZW1fc3cgPSBETl9TRU5EOworCXNjcC0+Zmxvd2xvY19zdyA9IEROX1NFTkQ7CisJc2NwLT5mbG93cmVtX2RhdCA9IDA7CisJc2NwLT5mbG93cmVtX290aCA9IDE7CisJc2NwLT5mbG93bG9jX2RhdCA9IDA7CisJc2NwLT5mbG93bG9jX290aCA9IDE7CisJc2NwLT5zZXJ2aWNlc19yZW0gPSAwOworCXNjcC0+c2VydmljZXNfbG9jID0gMSB8IE5TUF9GQ19OT05FOworCXNjcC0+aW5mb19yZW0gPSAwOworCXNjcC0+aW5mb19sb2MgPSAweDAzOyAvKiBOU1AgdmVyc2lvbiA0LjEgKi8KKwlzY3AtPnNlZ3NpemVfcmVtID0gMjMwIC0gRE5fTUFYX05TUF9EQVRBX0hFQURFUjsgLyogRGVmYXVsdDogVXBkYXRlZCBieSByZW1vdGUgc2Vnc2l6ZSAqLworCXNjcC0+bm9uYWdsZSA9IDA7CisJc2NwLT5tdWx0aV9pcmVxID0gMTsKKwlzY3AtPmFjY2VwdF9tb2RlID0gQUNDX0lNTUVEOworCXNjcC0+YWRkci5zZG5fZmFtaWx5ICAgID0gQUZfREVDbmV0OworCXNjcC0+cGVlci5zZG5fZmFtaWx5ICAgID0gQUZfREVDbmV0OworCXNjcC0+YWNjZXNzZGF0YS5hY2NfYWNjbCA9IDU7CisJbWVtY3B5KHNjcC0+YWNjZXNzZGF0YS5hY2NfYWNjLCAiTElOVVgiLCA1KTsKKworCXNjcC0+bWF4X3dpbmRvdyAgID0gTlNQX01BWF9XSU5ET1c7CisJc2NwLT5zbmRfd2luZG93ICAgPSBOU1BfTUlOX1dJTkRPVzsKKwlzY3AtPm5zcF9zcnR0ICAgICA9IE5TUF9JTklUSUFMX1NSVFQ7CisJc2NwLT5uc3BfcnR0dmFyICAgPSBOU1BfSU5JVElBTF9SVFRWQVI7CisJc2NwLT5uc3Bfcnh0c2hpZnQgPSAwOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2NwLT5kYXRhX3htaXRfcXVldWUpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnNjcC0+b3RoZXJfeG1pdF9xdWV1ZSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2NwLT5vdGhlcl9yZWNlaXZlX3F1ZXVlKTsKKworCXNjcC0+cGVyc2lzdCA9IDA7CisJc2NwLT5wZXJzaXN0X2Z4biA9IE5VTEw7CisJc2NwLT5rZWVwYWxpdmUgPSAxMCAqIEhaOworCXNjcC0+a2VlcGFsaXZlX2Z4biA9IGRuX2tlZXBhbGl2ZTsKKworCWluaXRfdGltZXIoJnNjcC0+ZGVsYWNrX3RpbWVyKTsKKwlzY3AtPmRlbGFja19wZW5kaW5nID0gMDsKKwlzY3AtPmRlbGFja19meG4gPSBkbl9uc3BfZGVsYXllZF9hY2s7CisKKwlkbl9zdGFydF9zbG93X3RpbWVyKHNrKTsKK291dDoKKwlyZXR1cm4gc2s7Cit9CisKKy8qCisgKiBLZWVwYWxpdmUgdGltZXIuCisgKiBGSVhNRTogU2hvdWxkIHJlc3BvbmQgdG8gU09fS0VFUEFMSVZFIGV0Yy4KKyAqLworc3RhdGljIHZvaWQgZG5fa2VlcGFsaXZlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgZG5fc2NwICpzY3AgPSBETl9TSyhzayk7CisKKwkvKgorCSAqIEJ5IGNoZWNraW5nIHRoZSBvdGhlcl9kYXRhIHRyYW5zbWl0IHF1ZXVlIGlzIGVtcHR5CisJICogd2UgYXJlIGRvdWJsZSBjaGVja2luZyB0aGF0IHdlIGFyZSBub3Qgc2VuZGluZyB0b28KKwkgKiBtYW55IG9mIHRoZXNlIGtlZXBhbGl2ZSBmcmFtZXMuCisJICovCisJaWYgKHNrYl9xdWV1ZV9sZW4oJnNjcC0+b3RoZXJfeG1pdF9xdWV1ZSkgPT0gMCkKKwkJZG5fbnNwX3NlbmRfbGluayhzaywgRE5fTk9DSEFOR0UsIDApOworfQorCisKKy8qCisgKiBUaW1lciBmb3Igc2h1dGRvd24vZGVzdHJveWVkIHNvY2tldHMuCisgKiBXaGVuIHNvY2tldCBpcyBkZWFkICYgbm8gcGFja2V0cyBoYXZlIGJlZW4gc2VudCBmb3IgYQorICogY2VydGFpbiBhbW91bnQgb2YgdGltZSwgdGhleSBhcmUgcmVtb3ZlZCBieSB0aGlzCisgKiByb3V0aW5lLiBBbHNvIHRha2VzIGNhcmUgb2Ygc2VuZGluZyBvdXQgREkgJiBEQworICogZnJhbWVzIGF0IGNvcnJlY3QgdGltZXMuCisgKi8KK2ludCBkbl9kZXN0cm95X3RpbWVyKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgZG5fc2NwICpzY3AgPSBETl9TSyhzayk7CisKKwlzY3AtPnBlcnNpc3QgPSBkbl9uc3BfcGVyc2lzdChzayk7CisKKwlzd2l0Y2goc2NwLT5zdGF0ZSkgeworCQljYXNlIEROX0RJOgorCQkJZG5fbnNwX3NlbmRfZGlzYyhzaywgTlNQX0RJU0NJTklULCAwLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChzY3AtPm5zcF9yeHRzaGlmdCA+PSBkZWNuZXRfZGlfY291bnQpCisJCQkJc2NwLT5zdGF0ZSA9IEROX0NOOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBETl9EUjoKKwkJCWRuX25zcF9zZW5kX2Rpc2Moc2ssIE5TUF9ESVNDSU5JVCwgMCwgR0ZQX0FUT01JQyk7CisJCQlpZiAoc2NwLT5uc3Bfcnh0c2hpZnQgPj0gZGVjbmV0X2RyX2NvdW50KQorCQkJCXNjcC0+c3RhdGUgPSBETl9EUkM7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIEROX0ROOgorCQkJaWYgKHNjcC0+bnNwX3J4dHNoaWZ0IDwgZGVjbmV0X2RuX2NvdW50KSB7CisJCQkJLyogcHJpbnRrKEtFUk5fREVCVUcgImRuX2Rlc3Ryb3lfdGltZXI6IEROXG4iKTsgKi8KKwkJCQlkbl9uc3Bfc2VuZF9kaXNjKHNrLCBOU1BfRElTQ0NPTkYsIE5TUF9SRUFTT05fREMsIEdGUF9BVE9NSUMpOworCQkJCXJldHVybiAwOworCQkJfQorCX0KKworCXNjcC0+cGVyc2lzdCA9IChIWiAqIGRlY25ldF90aW1lX3dhaXQpOworCisJaWYgKHNrLT5za19zb2NrZXQpCisJCXJldHVybiAwOworCisJaWYgKChqaWZmaWVzIC0gc2NwLT5zdGFtcCkgPj0gKEhaICogZGVjbmV0X3RpbWVfd2FpdCkpIHsKKwkJZG5fdW5oYXNoX3NvY2soc2spOworCQlzb2NrX3B1dChzayk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkbl9kZXN0cm95X3NvY2soc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKKworCXNjcC0+bnNwX3J4dHNoaWZ0ID0gMDsgLyogcmVzZXQgYmFjayBvZmYgKi8KKworCWlmIChzay0+c2tfc29ja2V0KSB7CisJCWlmIChzay0+c2tfc29ja2V0LT5zdGF0ZSAhPSBTU19VTkNPTk5FQ1RFRCkKKwkJCXNrLT5za19zb2NrZXQtPnN0YXRlID0gU1NfRElTQ09OTkVDVElORzsKKwl9CisKKwlzay0+c2tfc3RhdGUgPSBUQ1BfQ0xPU0U7CisKKwlzd2l0Y2goc2NwLT5zdGF0ZSkgeworCQljYXNlIEROX0ROOgorCQkJZG5fbnNwX3NlbmRfZGlzYyhzaywgTlNQX0RJU0NDT05GLCBOU1BfUkVBU09OX0RDLAorCQkJCQkgc2stPnNrX2FsbG9jYXRpb24pOworCQkJc2NwLT5wZXJzaXN0X2Z4biA9IGRuX2Rlc3Ryb3lfdGltZXI7CisJCQlzY3AtPnBlcnNpc3QgPSBkbl9uc3BfcGVyc2lzdChzayk7CisJCQlicmVhazsKKwkJY2FzZSBETl9DUjoKKwkJCXNjcC0+c3RhdGUgPSBETl9EUjsKKwkJCWdvdG8gZGlzY19yZWplY3Q7CisJCWNhc2UgRE5fUlVOOgorCQkJc2NwLT5zdGF0ZSA9IEROX0RJOworCQljYXNlIEROX0RJOgorCQljYXNlIEROX0RSOgorZGlzY19yZWplY3Q6CisJCQlkbl9uc3Bfc2VuZF9kaXNjKHNrLCBOU1BfRElTQ0lOSVQsIDAsIHNrLT5za19hbGxvY2F0aW9uKTsKKwkJY2FzZSBETl9OQzoKKwkJY2FzZSBETl9OUjoKKwkJY2FzZSBETl9SSjoKKwkJY2FzZSBETl9ESUM6CisJCWNhc2UgRE5fQ046CisJCWNhc2UgRE5fRFJDOgorCQljYXNlIEROX0NJOgorCQljYXNlIEROX0NEOgorCQkJc2NwLT5wZXJzaXN0X2Z4biA9IGRuX2Rlc3Ryb3lfdGltZXI7CisJCQlzY3AtPnBlcnNpc3QgPSBkbl9uc3BfcGVyc2lzdChzayk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0RFQlVHICJERUNuZXQ6IGRuX2Rlc3Ryb3lfc29jayBwYXNzZWQgc29ja2V0IGluIGludmFsaWQgc3RhdGVcbiIpOworCQljYXNlIEROX086CisJCQlkbl9zdG9wX3Nsb3dfdGltZXIoc2spOworCisJCQlkbl91bmhhc2hfc29ja19iaChzayk7CisJCQlzb2NrX3B1dChzayk7CisKKwkJCWJyZWFrOworCX0KK30KKworY2hhciAqZG5fYWRkcjJhc2MoZG5fYWRkcmVzcyBhZGRyLCBjaGFyICpidWYpCit7CisJdW5zaWduZWQgc2hvcnQgbm9kZSwgYXJlYTsKKworCW5vZGUgPSBhZGRyICYgMHgwM2ZmOworCWFyZWEgPSBhZGRyID4+IDEwOworCXNwcmludGYoYnVmLCAiJWhkLiVoZCIsIGFyZWEsIG5vZGUpOworCisJcmV0dXJuIGJ1ZjsKK30KKworCisKK3N0YXRpYyBpbnQgZG5fY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlzd2l0Y2goc29jay0+dHlwZSkgeworCQljYXNlIFNPQ0tfU0VRUEFDS0VUOgorCQkJaWYgKHByb3RvY29sICE9IEROUFJPVE9fTlNQKQorCQkJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOworCQkJYnJlYWs7CisJCWNhc2UgU09DS19TVFJFQU06CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRVNPQ0tUTk9TVVBQT1JUOworCX0KKworCisJaWYgKChzayA9IGRuX2FsbG9jX3NvY2soc29jaywgR0ZQX0tFUk5FTCkpID09IE5VTEwpIAorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwlzay0+c2tfcHJvdG9jb2wgPSBwcm90b2NvbDsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK2RuX3JlbGVhc2Uoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKworCWlmIChzaykgeworCQlzb2NrX29ycGhhbihzayk7CisJCXNvY2tfaG9sZChzayk7CisJCWxvY2tfc29jayhzayk7CisJCWRuX2Rlc3Ryb3lfc29jayhzayk7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCXNvY2tfcHV0KHNrKTsKKwl9CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG5fYmluZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLCBpbnQgYWRkcl9sZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGRuX3NjcCAqc2NwID0gRE5fU0soc2spOworCXN0cnVjdCBzb2NrYWRkcl9kbiAqc2FkZHIgPSAoc3RydWN0IHNvY2thZGRyX2RuICopdWFkZHI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgcnY7CisKKwlpZiAoYWRkcl9sZW4gIT0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9kbikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHNhZGRyLT5zZG5fZmFtaWx5ICE9IEFGX0RFQ25ldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZG5fbnRvaHMoc2FkZHItPnNkbl9ub2RlYWRkcmwpICYmIChkbl9udG9ocyhzYWRkci0+c2RuX25vZGVhZGRybCkgIT0gMikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGRuX250b2hzKHNhZGRyLT5zZG5fb2JqbmFtZWwpID4gRE5fTUFYT0JKTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc2FkZHItPnNkbl9mbGFncyAmIH5TREZfV0lMRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKyNpZiAxCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQklORF9TRVJWSUNFKSAmJiAoc2FkZHItPnNkbl9vYmpudW0gfHwKKwkgICAgKHNhZGRyLT5zZG5fZmxhZ3MgJiBTREZfV0lMRCkpKQorCQlyZXR1cm4gLUVBQ0NFUzsKKyNlbHNlCisJLyoKKwkgKiBNYXliZSBwdXQgdGhlIGRlZmF1bHQgYWN0aW9ucyBpbiB0aGUgZGVmYXVsdCBzZWN1cml0eSBvcHMgZm9yCisJICogZG5fcHJvdF9zb2NrID8gV291bGQgYmUgbmljZSBpZiB0aGUgY2FwYWJsZSBjYWxsIHdvdWxkIGdvIHRoZXJlCisJICogdG9vLgorCSAqLworCWlmIChzZWN1cml0eV9kbl9wcm90X3NvY2soc2FkZHIpICYmCisJICAgICFjYXBhYmxlKENBUF9ORVRfQklORF9TRVJWSUNFKSB8fCAKKwkgICAgc2FkZHItPnNkbl9vYmpudW0gfHwgKHNhZGRyLT5zZG5fZmxhZ3MgJiBTREZfV0lMRCkpCisJCXJldHVybiAtRUFDQ0VTOworI2VuZGlmCisKKworCWlmICghKHNhZGRyLT5zZG5fZmxhZ3MgJiBTREZfV0lMRCkpIHsKKwkJaWYgKGRuX250b2hzKHNhZGRyLT5zZG5fbm9kZWFkZHJsKSkgeworCQkJcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKwkJCWZvcihkZXYgPSBkZXZfYmFzZTsgZGV2OyBkZXYgPSBkZXYtPm5leHQpIHsKKwkJCQlpZiAoIWRldi0+ZG5fcHRyKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoZG5fZGV2X2lzbG9jYWwoZGV2LCBkbl9zYWRkcjJkbihzYWRkcikpKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCXJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKwkJCWlmIChkZXYgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisJCX0KKwl9CisKKwlydiA9IC1FSU5WQUw7CisJbG9ja19zb2NrKHNrKTsKKwlpZiAoc29ja19mbGFnKHNrLCBTT0NLX1pBUFBFRCkpIHsKKwkJbWVtY3B5KCZzY3AtPmFkZHIsIHNhZGRyLCBhZGRyX2xlbik7CisJCXNvY2tfcmVzZXRfZmxhZyhzaywgU09DS19aQVBQRUQpOworCisJCXJ2ID0gZG5faGFzaF9zb2NrKHNrKTsKKwkJaWYgKHJ2KQorCQkJc29ja19zZXRfZmxhZyhzaywgU09DS19aQVBQRUQpOworCX0KKwlyZWxlYXNlX3NvY2soc2spOworCisgICAgICAgIHJldHVybiBydjsKK30KKworCitzdGF0aWMgaW50IGRuX2F1dG9fYmluZChzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKKwlpbnQgcnY7CisKKwlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKworCXNjcC0+YWRkci5zZG5fZmxhZ3MgID0gMDsKKwlzY3AtPmFkZHIuc2RuX29iam51bSA9IDA7CisKKwkvKgorCSAqIFRoaXMgc3R1ZmYgaXMgdG8ga2VlcCBjb21wYXRpYmlsaXR5IHdpdGggRWR1YXJkbydzCisJICogcGF0Y2guIEkgaG9wZSBJIGNhbiBkaXNwZW5zZSB3aXRoIGl0IHNob3J0bHkuLi4KKwkgKi8KKwlpZiAoKHNjcC0+YWNjZXNzZGF0YS5hY2NfYWNjbCAhPSAwKSAmJgorCQkoc2NwLT5hY2Nlc3NkYXRhLmFjY19hY2NsIDw9IDEyKSkgeworCQorCQlzY3AtPmFkZHIuc2RuX29iam5hbWVsID0gZG5faHRvbnMoc2NwLT5hY2Nlc3NkYXRhLmFjY19hY2NsKTsKKwkJbWVtY3B5KHNjcC0+YWRkci5zZG5fb2JqbmFtZSwgc2NwLT5hY2Nlc3NkYXRhLmFjY19hY2MsIGRuX250b2hzKHNjcC0+YWRkci5zZG5fb2JqbmFtZWwpKTsKKworCQlzY3AtPmFjY2Vzc2RhdGEuYWNjX2FjY2wgPSAwOworCQltZW1zZXQoc2NwLT5hY2Nlc3NkYXRhLmFjY19hY2MsIDAsIDQwKTsKKwl9CisJLyogRW5kIG9mIGNvbXBhdGliaWxpdHkgc3R1ZmYgKi8KKworCXNjcC0+YWRkci5zZG5fYWRkLmFfbGVuID0gZG5faHRvbnMoMik7CisJcnYgPSBkbl9kZXZfYmluZF9kZWZhdWx0KChkbl9hZGRyZXNzICopc2NwLT5hZGRyLnNkbl9hZGQuYV9hZGRyKTsKKwlpZiAocnYgPT0gMCkgeworCQlydiA9IGRuX2hhc2hfc29jayhzayk7CisJCWlmIChydikKKwkJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKwl9CisKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQgZG5fY29uZmlybV9hY2NlcHQoc3RydWN0IHNvY2sgKnNrLCBsb25nICp0aW1lbywgaW50IGFsbG9jYXRpb24pCit7CisJc3RydWN0IGRuX3NjcCAqc2NwID0gRE5fU0soc2spOworCURFRklORV9XQUlUKHdhaXQpOworCWludCBlcnI7CisKKwlpZiAoc2NwLT5zdGF0ZSAhPSBETl9DUikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzY3AtPnN0YXRlID0gRE5fQ0M7CisJc2NwLT5zZWdzaXplX2xvYyA9IGRzdF9tZXRyaWMoX19za19kc3RfZ2V0KHNrKSwgUlRBWF9BRFZNU1MpOworCWRuX3NlbmRfY29ubl9jb25mKHNrLCBhbGxvY2F0aW9uKTsKKworCXByZXBhcmVfdG9fd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCWZvcig7OykgeworCQlyZWxlYXNlX3NvY2soc2spOworCQlpZiAoc2NwLT5zdGF0ZSA9PSBETl9DQykKKwkJCSp0aW1lbyA9IHNjaGVkdWxlX3RpbWVvdXQoKnRpbWVvKTsKKwkJbG9ja19zb2NrKHNrKTsKKwkJZXJyID0gMDsKKwkJaWYgKHNjcC0+c3RhdGUgPT0gRE5fUlVOKQorCQkJYnJlYWs7CisJCWVyciA9IHNvY2tfZXJyb3Ioc2spOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJCWVyciA9IHNvY2tfaW50cl9lcnJubygqdGltZW8pOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJZXJyID0gLUVBR0FJTjsKKwkJaWYgKCEqdGltZW8pCisJCQlicmVhazsKKwkJcHJlcGFyZV90b193YWl0KHNrLT5za19zbGVlcCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJfQorCWZpbmlzaF93YWl0KHNrLT5za19zbGVlcCwgJndhaXQpOworCWlmIChlcnIgPT0gMCkgeworCQlzay0+c2tfc29ja2V0LT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKwl9IGVsc2UgaWYgKHNjcC0+c3RhdGUgIT0gRE5fQ0MpIHsKKwkJc2stPnNrX3NvY2tldC0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkbl93YWl0X3J1bihzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgKnRpbWVvKQoreworCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKKwlERUZJTkVfV0FJVCh3YWl0KTsKKwlpbnQgZXJyID0gMDsKKworCWlmIChzY3AtPnN0YXRlID09IEROX1JVTikKKwkJZ290byBvdXQ7CisKKwlpZiAoISp0aW1lbykKKwkJcmV0dXJuIC1FQUxSRUFEWTsKKworCXByZXBhcmVfdG9fd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCWZvcig7OykgeworCQlyZWxlYXNlX3NvY2soc2spOworCQlpZiAoc2NwLT5zdGF0ZSA9PSBETl9DSSB8fCBzY3AtPnN0YXRlID09IEROX0NDKQorCQkJKnRpbWVvID0gc2NoZWR1bGVfdGltZW91dCgqdGltZW8pOworCQlsb2NrX3NvY2soc2spOworCQllcnIgPSAwOworCQlpZiAoc2NwLT5zdGF0ZSA9PSBETl9SVU4pCisJCQlicmVhazsKKwkJZXJyID0gc29ja19lcnJvcihzayk7CisJCWlmIChlcnIpCisJCQlicmVhazsKKwkJZXJyID0gc29ja19pbnRyX2Vycm5vKCp0aW1lbyk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCQllcnIgPSAtRVRJTUVET1VUOworCQlpZiAoISp0aW1lbykKKwkJCWJyZWFrOworCQlwcmVwYXJlX3RvX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwl9CisJZmluaXNoX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCk7CitvdXQ6CisJaWYgKGVyciA9PSAwKSB7CisJCXNrLT5za19zb2NrZXQtPnN0YXRlID0gU1NfQ09OTkVDVEVEOworCX0gZWxzZSBpZiAoc2NwLT5zdGF0ZSAhPSBETl9DSSAmJiBzY3AtPnN0YXRlICE9IEROX0NDKSB7CisJCXNrLT5za19zb2NrZXQtPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kbl9jb25uZWN0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2thZGRyX2RuICphZGRyLCBpbnQgYWRkcmxlbiwgbG9uZyAqdGltZW8sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gc2stPnNrX3NvY2tldDsKKwlzdHJ1Y3QgZG5fc2NwICpzY3AgPSBETl9TSyhzayk7CisJaW50IGVyciA9IC1FSVNDT05OOworCXN0cnVjdCBmbG93aSBmbDsKKworCWlmIChzb2NrLT5zdGF0ZSA9PSBTU19DT05ORUNURUQpCisJCWdvdG8gb3V0OworCisJaWYgKHNvY2stPnN0YXRlID09IFNTX0NPTk5FQ1RJTkcpIHsKKwkJZXJyID0gMDsKKwkJaWYgKHNjcC0+c3RhdGUgPT0gRE5fUlVOKSB7CisJCQlzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWVyciA9IC1FQ09OTlJFRlVTRUQ7CisJCWlmIChzY3AtPnN0YXRlICE9IEROX0NJICYmIHNjcC0+c3RhdGUgIT0gRE5fQ0MpIHsKKwkJCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQlyZXR1cm4gZG5fd2FpdF9ydW4oc2ssIHRpbWVvKTsKKwl9CisKKwllcnIgPSAtRUlOVkFMOworCWlmIChzY3AtPnN0YXRlICE9IEROX08pCisJCWdvdG8gb3V0OworCisJaWYgKGFkZHIgPT0gTlVMTCB8fCBhZGRybGVuICE9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfZG4pKQorCQlnb3RvIG91dDsKKwlpZiAoYWRkci0+c2RuX2ZhbWlseSAhPSBBRl9ERUNuZXQpCisJCWdvdG8gb3V0OworCWlmIChhZGRyLT5zZG5fZmxhZ3MgJiBTREZfV0lMRCkKKwkJZ290byBvdXQ7CisKKwlpZiAoc29ja19mbGFnKHNrLCBTT0NLX1pBUFBFRCkpIHsKKwkJZXJyID0gZG5fYXV0b19iaW5kKHNrLT5za19zb2NrZXQpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJfQorCisJbWVtY3B5KCZzY3AtPnBlZXIsIGFkZHIsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfZG4pKTsKKworCWVyciA9IC1FSE9TVFVOUkVBQ0g7CisJbWVtc2V0KCZmbCwgMCwgc2l6ZW9mKGZsKSk7CisJZmwub2lmID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKKwlmbC5mbGRfZHN0ID0gZG5fc2FkZHIyZG4oJnNjcC0+cGVlcik7CisJZmwuZmxkX3NyYyA9IGRuX3NhZGRyMmRuKCZzY3AtPmFkZHIpOworCWRuX3NrX3BvcnRzX2NvcHkoJmZsLCBzY3ApOworCWZsLnByb3RvID0gRE5QUk9UT19OU1A7CisJaWYgKGRuX3JvdXRlX291dHB1dF9zb2NrKCZzay0+c2tfZHN0X2NhY2hlLCAmZmwsIHNrLCBmbGFncykgPCAwKQorCQlnb3RvIG91dDsKKwlzay0+c2tfcm91dGVfY2FwcyA9IHNrLT5za19kc3RfY2FjaGUtPmRldi0+ZmVhdHVyZXM7CisJc29jay0+c3RhdGUgPSBTU19DT05ORUNUSU5HOworCXNjcC0+c3RhdGUgPSBETl9DSTsKKwlzY3AtPnNlZ3NpemVfbG9jID0gZHN0X21ldHJpYyhzay0+c2tfZHN0X2NhY2hlLCBSVEFYX0FEVk1TUyk7CisKKwlkbl9uc3Bfc2VuZF9jb25uaW5pdChzaywgTlNQX0NJKTsKKwllcnIgPSAtRUlOUFJPR1JFU1M7CisJaWYgKCp0aW1lbykgeworCQllcnIgPSBkbl93YWl0X3J1bihzaywgdGltZW8pOworCX0KK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGRuX2Nvbm5lY3Qoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwgaW50IGFkZHJsZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfZG4gKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2RuICopdWFkZHI7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJaW50IGVycjsKKwlsb25nIHRpbWVvID0gc29ja19zbmR0aW1lbyhzaywgZmxhZ3MgJiBPX05PTkJMT0NLKTsKKworCWxvY2tfc29jayhzayk7CisJZXJyID0gX19kbl9jb25uZWN0KHNrLCBhZGRyLCBhZGRybGVuLCAmdGltZW8sIDApOworCXJlbGVhc2Vfc29jayhzayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lIGludCBkbl9jaGVja19zdGF0ZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrYWRkcl9kbiAqYWRkciwgaW50IGFkZHJsZW4sIGxvbmcgKnRpbWVvLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGRuX3NjcCAqc2NwID0gRE5fU0soc2spOworCisJc3dpdGNoKHNjcC0+c3RhdGUpIHsKKwkJY2FzZSBETl9SVU46CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBETl9DUjoKKwkJCXJldHVybiBkbl9jb25maXJtX2FjY2VwdChzaywgdGltZW8sIHNrLT5za19hbGxvY2F0aW9uKTsKKwkJY2FzZSBETl9DSToKKwkJY2FzZSBETl9DQzoKKwkJCXJldHVybiBkbl93YWl0X3J1bihzaywgdGltZW8pOworCQljYXNlIEROX086CisJCQlyZXR1cm4gX19kbl9jb25uZWN0KHNrLCBhZGRyLCBhZGRybGVuLCB0aW1lbywgZmxhZ3MpOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCisKK3N0YXRpYyB2b2lkIGRuX2FjY2Vzc19jb3B5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBhY2Nlc3NkYXRhX2RuICphY2MpCit7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnB0ciA9IHNrYi0+ZGF0YTsKKworICAgICAgICBhY2MtPmFjY191c2VybCA9ICpwdHIrKzsKKyAgICAgICAgbWVtY3B5KCZhY2MtPmFjY191c2VyLCBwdHIsIGFjYy0+YWNjX3VzZXJsKTsKKyAgICAgICAgcHRyICs9IGFjYy0+YWNjX3VzZXJsOworCisgICAgICAgIGFjYy0+YWNjX3Bhc3NsID0gKnB0cisrOworICAgICAgICBtZW1jcHkoJmFjYy0+YWNjX3Bhc3MsIHB0ciwgYWNjLT5hY2NfcGFzc2wpOworICAgICAgICBwdHIgKz0gYWNjLT5hY2NfcGFzc2w7CisKKyAgICAgICAgYWNjLT5hY2NfYWNjbCA9ICpwdHIrKzsKKyAgICAgICAgbWVtY3B5KCZhY2MtPmFjY19hY2MsIHB0ciwgYWNjLT5hY2NfYWNjbCk7CisKKyAgICAgICAgc2tiX3B1bGwoc2tiLCBhY2MtPmFjY19hY2NsICsgYWNjLT5hY2NfcGFzc2wgKyBhY2MtPmFjY191c2VybCArIDMpOworCit9CisKK3N0YXRpYyB2b2lkIGRuX3VzZXJfY29weShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgb3B0ZGF0YV9kbiAqb3B0KQoreworICAgICAgICB1bnNpZ25lZCBjaGFyICpwdHIgPSBza2ItPmRhdGE7CisgICAgICAgIAorICAgICAgICBvcHQtPm9wdF9vcHRsICAgPSAqcHRyKys7CisgICAgICAgIG9wdC0+b3B0X3N0YXR1cyA9IDA7CisgICAgICAgIG1lbWNweShvcHQtPm9wdF9kYXRhLCBwdHIsIG9wdC0+b3B0X29wdGwpOworICAgICAgICBza2JfcHVsbChza2IsIG9wdC0+b3B0X29wdGwgKyAxKTsKKworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmRuX3dhaXRfZm9yX2Nvbm5lY3Qoc3RydWN0IHNvY2sgKnNrLCBsb25nICp0aW1lbykKK3sKKwlERUZJTkVfV0FJVCh3YWl0KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlpbnQgZXJyID0gMDsKKworCXByZXBhcmVfdG9fd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCWZvcig7OykgeworCQlyZWxlYXNlX3NvY2soc2spOworCQlza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCSp0aW1lbyA9IHNjaGVkdWxlX3RpbWVvdXQoKnRpbWVvKTsKKwkJCXNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJCX0KKwkJbG9ja19zb2NrKHNrKTsKKwkJaWYgKHNrYiAhPSBOVUxMKQorCQkJYnJlYWs7CisJCWVyciA9IC1FSU5WQUw7CisJCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0xJU1RFTikKKwkJCWJyZWFrOworCQllcnIgPSBzb2NrX2ludHJfZXJybm8oKnRpbWVvKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisJCWVyciA9IC1FQUdBSU47CisJCWlmICghKnRpbWVvKQorCQkJYnJlYWs7CisJCXByZXBhcmVfdG9fd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCX0KKwlmaW5pc2hfd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0KTsKKworCXJldHVybiBza2IgPT0gTlVMTCA/IEVSUl9QVFIoZXJyKSA6IHNrYjsKK30KKworc3RhdGljIGludCBkbl9hY2NlcHQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2tldCAqbmV3c29jaywgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrLCAqbmV3c2s7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJc3RydWN0IGRuX3NrYl9jYiAqY2I7CisJdW5zaWduZWQgY2hhciBtZW51dmVyOworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGNoYXIgdHlwZTsKKwlsb25nIHRpbWVvID0gc29ja19yY3Z0aW1lbyhzaywgZmxhZ3MgJiBPX05PTkJMT0NLKTsKKworCWxvY2tfc29jayhzayk7CisKKyAgICAgICAgaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfTElTVEVOIHx8IEROX1NLKHNrKS0+c3RhdGUgIT0gRE5fTykgeworCQlyZWxlYXNlX3NvY2soc2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCWlmIChza2IgPT0gTlVMTCkgeworCQlza2IgPSBkbl93YWl0X2Zvcl9jb25uZWN0KHNrLCAmdGltZW8pOworCQlpZiAoSVNfRVJSKHNrYikpIHsKKwkJCXJlbGVhc2Vfc29jayhzayk7CisJCQlyZXR1cm4gUFRSX0VSUihza2IpOworCQl9CisJfQorCisJY2IgPSBETl9TS0JfQ0Ioc2tiKTsKKwlzay0+c2tfYWNrX2JhY2tsb2ctLTsKKwluZXdzayA9IGRuX2FsbG9jX3NvY2sobmV3c29jaywgc2stPnNrX2FsbG9jYXRpb24pOworCWlmIChuZXdzayA9PSBOVUxMKSB7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLUVOT0JVRlM7CisJfQorCXJlbGVhc2Vfc29jayhzayk7CisKKwlkc3RfcmVsZWFzZSh4Y2hnKCZuZXdzay0+c2tfZHN0X2NhY2hlLCBza2ItPmRzdCkpOworCXNrYi0+ZHN0ID0gTlVMTDsKKworICAgICAgICBETl9TSyhuZXdzayktPnN0YXRlICAgICAgICA9IEROX0NSOworCUROX1NLKG5ld3NrKS0+YWRkcnJlbSAgICAgID0gY2ItPnNyY19wb3J0OworCUROX1NLKG5ld3NrKS0+c2VydmljZXNfcmVtID0gY2ItPnNlcnZpY2VzOworCUROX1NLKG5ld3NrKS0+aW5mb19yZW0gICAgID0gY2ItPmluZm87CisJRE5fU0sobmV3c2spLT5zZWdzaXplX3JlbSAgPSBjYi0+c2Vnc2l6ZTsKKwlETl9TSyhuZXdzayktPmFjY2VwdF9tb2RlICA9IEROX1NLKHNrKS0+YWNjZXB0X21vZGU7CisJCisJaWYgKEROX1NLKG5ld3NrKS0+c2Vnc2l6ZV9yZW0gPCAyMzApCisJCUROX1NLKG5ld3NrKS0+c2Vnc2l6ZV9yZW0gPSAyMzA7CisKKwlpZiAoKEROX1NLKG5ld3NrKS0+c2VydmljZXNfcmVtICYgTlNQX0ZDX01BU0spID09IE5TUF9GQ19OT05FKQorCQlETl9TSyhuZXdzayktPm1heF93aW5kb3cgPSBkZWNuZXRfbm9fZmNfbWF4X2N3bmQ7CisKKwluZXdzay0+c2tfc3RhdGUgID0gVENQX0xJU1RFTjsKKwltZW1jcHkoJihETl9TSyhuZXdzayktPmFkZHIpLCAmKEROX1NLKHNrKS0+YWRkciksIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfZG4pKTsKKworCS8qCisJICogSWYgd2UgYXJlIGxpc3RlbmluZyBvbiBhIHdpbGQgc29ja2V0LCB3ZSBkb24ndCB3YW50CisJICogdGhlIG5ld2x5IGNyZWF0ZWQgc29ja2V0IG9uIHRoZSB3cm9uZyBoYXNoIHF1ZXVlLgorCSAqLworCUROX1NLKG5ld3NrKS0+YWRkci5zZG5fZmxhZ3MgJj0gflNERl9XSUxEOworCisJc2tiX3B1bGwoc2tiLCBkbl91c2VybmFtZTJzb2NrYWRkcihza2ItPmRhdGEsIHNrYi0+bGVuLCAmKEROX1NLKG5ld3NrKS0+YWRkciksICZ0eXBlKSk7CisJc2tiX3B1bGwoc2tiLCBkbl91c2VybmFtZTJzb2NrYWRkcihza2ItPmRhdGEsIHNrYi0+bGVuLCAmKEROX1NLKG5ld3NrKS0+cGVlciksICZ0eXBlKSk7CisJKihkbl9hZGRyZXNzICopKEROX1NLKG5ld3NrKS0+cGVlci5zZG5fYWRkLmFfYWRkcikgPSBjYi0+c3JjOworCSooZG5fYWRkcmVzcyAqKShETl9TSyhuZXdzayktPmFkZHIuc2RuX2FkZC5hX2FkZHIpID0gY2ItPmRzdDsKKworCW1lbnV2ZXIgPSAqc2tiLT5kYXRhOworCXNrYl9wdWxsKHNrYiwgMSk7CisKKwlpZiAobWVudXZlciAmIEROX01FTlVWRVJfQUNDKQorCQlkbl9hY2Nlc3NfY29weShza2IsICYoRE5fU0sobmV3c2spLT5hY2Nlc3NkYXRhKSk7CisKKwlpZiAobWVudXZlciAmIEROX01FTlVWRVJfVVNSKQorCQlkbl91c2VyX2NvcHkoc2tiLCAmKEROX1NLKG5ld3NrKS0+Y29ubmRhdGFfaW4pKTsKKworCWlmIChtZW51dmVyICYgRE5fTUVOVVZFUl9QUlgpCisJCUROX1NLKG5ld3NrKS0+cGVlci5zZG5fZmxhZ3MgfD0gU0RGX1BST1hZOworCisJaWYgKG1lbnV2ZXIgJiBETl9NRU5VVkVSX1VJQykKKwkJRE5fU0sobmV3c2spLT5wZWVyLnNkbl9mbGFncyB8PSBTREZfVUlDUFJPWFk7CisKKwlrZnJlZV9za2Ioc2tiKTsKKworCW1lbWNweSgmKEROX1NLKG5ld3NrKS0+Y29ubmRhdGFfb3V0KSwgJihETl9TSyhzayktPmNvbm5kYXRhX291dCksCisJCXNpemVvZihzdHJ1Y3Qgb3B0ZGF0YV9kbikpOworCW1lbWNweSgmKEROX1NLKG5ld3NrKS0+ZGlzY2RhdGFfb3V0KSwgJihETl9TSyhzayktPmRpc2NkYXRhX291dCksCisJCXNpemVvZihzdHJ1Y3Qgb3B0ZGF0YV9kbikpOworCisJbG9ja19zb2NrKG5ld3NrKTsKKwllcnIgPSBkbl9oYXNoX3NvY2sobmV3c2spOworCWlmIChlcnIgPT0gMCkgeworCQlzb2NrX3Jlc2V0X2ZsYWcobmV3c2ssIFNPQ0tfWkFQUEVEKTsKKwkJZG5fc2VuZF9jb25uX2FjayhuZXdzayk7CisKKwkJLyoKKwkgCSAqIEhlcmUgd2UgdXNlIHNrLT5za19hbGxvY2F0aW9uIHNpbmNlIGFsdGhvdWdoIHRoZSBjb25uIGNvbmYgaXMKKwkgCSAqIGZvciB0aGUgbmV3c2ssIHRoZSBjb250ZXh0IGlzIHRoZSBvbGQgc29ja2V0LgorCSAJICovCisJCWlmIChETl9TSyhuZXdzayktPmFjY2VwdF9tb2RlID09IEFDQ19JTU1FRCkKKwkJCWVyciA9IGRuX2NvbmZpcm1fYWNjZXB0KG5ld3NrLCAmdGltZW8sCisJCQkJCQlzay0+c2tfYWxsb2NhdGlvbik7CisJfQorCXJlbGVhc2Vfc29jayhuZXdzayk7CisgICAgICAgIHJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCBkbl9nZXRuYW1lKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsaW50ICp1YWRkcl9sZW4saW50IHBlZXIpCit7CisJc3RydWN0IHNvY2thZGRyX2RuICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHJfZG4gKil1YWRkcjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgZG5fc2NwICpzY3AgPSBETl9TSyhzayk7CisKKwkqdWFkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9kbik7CisKKwlsb2NrX3NvY2soc2spOworCisJaWYgKHBlZXIpIHsKKwkJaWYgKChzb2NrLT5zdGF0ZSAhPSBTU19DT05ORUNURUQgJiYgCisJCSAgICAgc29jay0+c3RhdGUgIT0gU1NfQ09OTkVDVElORykgJiYgCisJCSAgICBzY3AtPmFjY2VwdF9tb2RlID09IEFDQ19JTU1FRCkKKwkJCXJldHVybiAtRU5PVENPTk47CisKKwkJbWVtY3B5KHNhLCAmc2NwLT5wZWVyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2RuKSk7CisJfSBlbHNlIHsKKwkJbWVtY3B5KHNhLCAmc2NwLT5hZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2RuKSk7CisJfQorCisJcmVsZWFzZV9zb2NrKHNrKTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50IGRuX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIHBvbGxfdGFibGUgICp3YWl0KQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKKwlpbnQgbWFzayA9IGRhdGFncmFtX3BvbGwoZmlsZSwgc29jaywgd2FpdCk7CisKKwlpZiAoc2tiX3F1ZXVlX2xlbigmc2NwLT5vdGhlcl9yZWNlaXZlX3F1ZXVlKSkKKwkJbWFzayB8PSBQT0xMUkRCQU5EOworCisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgZG5faW9jdGwoc3RydWN0IHNvY2tldCAqc29jaywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGRuX3NjcCAqc2NwID0gRE5fU0soc2spOworCWludCBlcnIgPSAtRU9QTk9UU1VQUDsKKwlsb25nIGFtb3VudCA9IDA7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgdmFsOworCisJc3dpdGNoKGNtZCkKKwl7CisJY2FzZSBTSU9DR0lGQUREUjoKKwljYXNlIFNJT0NTSUZBRERSOgorCQlyZXR1cm4gZG5fZGV2X2lvY3RsKGNtZCwgKHZvaWQgX191c2VyICopYXJnKTsKKworCWNhc2UgU0lPQ0FUTUFSSzoKKwkJbG9ja19zb2NrKHNrKTsKKwkJdmFsID0gKHNrYl9xdWV1ZV9sZW4oJnNjcC0+b3RoZXJfcmVjZWl2ZV9xdWV1ZSkgIT0gMCk7CisJCWlmIChzY3AtPnN0YXRlICE9IEROX1JVTikKKwkJCXZhbCA9IC1FTk9UQ09OTjsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJcmV0dXJuIHZhbDsKKworCWNhc2UgVElPQ09VVFE6CisJCWFtb3VudCA9IHNrLT5za19zbmRidWYgLSBhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpOworCQlpZiAoYW1vdW50IDwgMCkKKwkJCWFtb3VudCA9IDA7CisJCWVyciA9IHB1dF91c2VyKGFtb3VudCwgKGludCBfX3VzZXIgKilhcmcpOworCQlicmVhazsKKworCWNhc2UgVElPQ0lOUToKKwkJbG9ja19zb2NrKHNrKTsKKwkJaWYgKChza2IgPSBza2JfcGVlaygmc2NwLT5vdGhlcl9yZWNlaXZlX3F1ZXVlKSkgIT0gTlVMTCkgeworCQkJYW1vdW50ID0gc2tiLT5sZW47CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2stPnNrX3JlY2VpdmVfcXVldWUubmV4dDsKKwkJCWZvcig7OykgeworCQkJCWlmIChza2IgPT0KKwkJCQkgICAgKHN0cnVjdCBza19idWZmICopJnNrLT5za19yZWNlaXZlX3F1ZXVlKQorCQkJCQlicmVhazsKKwkJCQlhbW91bnQgKz0gc2tiLT5sZW47CisJCQkJc2tiID0gc2tiLT5uZXh0OworCQkJfQorCQl9CisJCXJlbGVhc2Vfc29jayhzayk7CisJCWVyciA9IHB1dF91c2VyKGFtb3VudCwgKGludCBfX3VzZXIgKilhcmcpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVyciA9IGRldl9pb2N0bChjbWQsICh2b2lkIF9fdXNlciAqKWFyZyk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZG5fbGlzdGVuKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBiYWNrbG9nKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnIgPSAtRUlOVkFMOworCisJbG9ja19zb2NrKHNrKTsKKworCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoKEROX1NLKHNrKS0+c3RhdGUgIT0gRE5fTykgfHwgKHNrLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOKSkKKwkJZ290byBvdXQ7CisKKwlzay0+c2tfbWF4X2Fja19iYWNrbG9nID0gYmFja2xvZzsKKwlzay0+c2tfYWNrX2JhY2tsb2cgICAgID0gMDsKKwlzay0+c2tfc3RhdGUgICAgICAgICAgID0gVENQX0xJU1RFTjsKKwllcnIgICAgICAgICAgICAgICAgID0gMDsKKwlkbl9yZWhhc2hfc29jayhzayk7CisKK291dDoKKwlyZWxlYXNlX3NvY2soc2spOworCisgICAgICAgIHJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCBkbl9zaHV0ZG93bihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgaG93KQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKKwlpbnQgZXJyID0gLUVOT1RDT05OOworCisJbG9ja19zb2NrKHNrKTsKKworCWlmIChzb2NrLT5zdGF0ZSA9PSBTU19VTkNPTk5FQ1RFRCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAwOworCWlmIChzb2NrLT5zdGF0ZSA9PSBTU19ESVNDT05ORUNUSU5HKQorCQlnb3RvIG91dDsKKworCWVyciA9IC1FSU5WQUw7CisJaWYgKHNjcC0+c3RhdGUgPT0gRE5fTykKKwkJZ290byBvdXQ7CisKKwlpZiAoaG93ICE9IFNIVVRET1dOX01BU0spCisJCWdvdG8gb3V0OworCisJc2stPnNrX3NodXRkb3duID0gaG93OworCWRuX2Rlc3Ryb3lfc29jayhzayk7CisJZXJyID0gMDsKKworb3V0OgorCXJlbGVhc2Vfc29jayhzayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGRuX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlpbnQgZXJyOworCisJbG9ja19zb2NrKHNrKTsKKwllcnIgPSBfX2RuX3NldHNvY2tvcHQoc29jaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuLCAwKTsKKwlyZWxlYXNlX3NvY2soc2spOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RuX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuLCBpbnQgZmxhZ3MpIAoreworCXN0cnVjdAlzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKKwlsb25nIHRpbWVvOworCXVuaW9uIHsKKwkJc3RydWN0IG9wdGRhdGFfZG4gb3B0OworCQlzdHJ1Y3QgYWNjZXNzZGF0YV9kbiBhY2M7CisJCWludCBtb2RlOworCQl1bnNpZ25lZCBsb25nIHdpbjsKKwkJaW50IHZhbDsKKwkJdW5zaWduZWQgY2hhciBzZXJ2aWNlczsKKwkJdW5zaWduZWQgY2hhciBpbmZvOworCX0gdTsKKwlpbnQgZXJyOworCisJaWYgKG9wdGxlbiAmJiAhb3B0dmFsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChvcHRsZW4gPiBzaXplb2YodSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ1LCBvcHR2YWwsIG9wdGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJc3dpdGNoKG9wdG5hbWUpIHsKKwkJY2FzZSBEU09fQ09OREFUQToKKwkJCWlmIChzb2NrLT5zdGF0ZSA9PSBTU19DT05ORUNURUQpIAorCQkJCXJldHVybiAtRUlTQ09OTjsKKwkJCWlmICgoc2NwLT5zdGF0ZSAhPSBETl9PKSAmJiAoc2NwLT5zdGF0ZSAhPSBETl9DUikpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWlmIChvcHRsZW4gIT0gc2l6ZW9mKHN0cnVjdCBvcHRkYXRhX2RuKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJaWYgKHUub3B0Lm9wdF9vcHRsID4gMTYpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCW1lbWNweSgmc2NwLT5jb25uZGF0YV9vdXQsICZ1Lm9wdCwgb3B0bGVuKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRFNPX0RJU0RBVEE6CisJICAgCSAgICAgICAgaWYgKHNvY2stPnN0YXRlICE9IFNTX0NPTk5FQ1RFRCAmJiBzY3AtPmFjY2VwdF9tb2RlID09IEFDQ19JTU1FRCkKKwkJCQlyZXR1cm4gLUVOT1RDT05OOworCisJCQlpZiAob3B0bGVuICE9IHNpemVvZihzdHJ1Y3Qgb3B0ZGF0YV9kbikpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWlmICh1Lm9wdC5vcHRfb3B0bCA+IDE2KQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQltZW1jcHkoJnNjcC0+ZGlzY2RhdGFfb3V0LCAmdS5vcHQsIG9wdGxlbik7CisJCQlicmVhazsKKworCQljYXNlIERTT19DT05BQ0NFU1M6CisJCQlpZiAoc29jay0+c3RhdGUgPT0gU1NfQ09OTkVDVEVEKSAKKwkJCQlyZXR1cm4gLUVJU0NPTk47CisJCQlpZiAoc2NwLT5zdGF0ZSAhPSBETl9PKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlpZiAob3B0bGVuICE9IHNpemVvZihzdHJ1Y3QgYWNjZXNzZGF0YV9kbikpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWlmICgodS5hY2MuYWNjX2FjY2wgPiBETl9NQVhBQ0NMKSB8fAorCQkJCQkodS5hY2MuYWNjX3Bhc3NsID4gRE5fTUFYQUNDTCkgfHwKKwkJCQkJKHUuYWNjLmFjY191c2VybCA+IEROX01BWEFDQ0wpKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQltZW1jcHkoJnNjcC0+YWNjZXNzZGF0YSwgJnUuYWNjLCBvcHRsZW4pOworCQkJYnJlYWs7CisKKwkJY2FzZSBEU09fQUNDRVBUTU9ERToKKwkJCWlmIChzb2NrLT5zdGF0ZSA9PSBTU19DT05ORUNURUQpCisJCQkJcmV0dXJuIC1FSVNDT05OOworCQkJaWYgKHNjcC0+c3RhdGUgIT0gRE5fTykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJaWYgKG9wdGxlbiAhPSBzaXplb2YoaW50KSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJaWYgKCh1Lm1vZGUgIT0gQUNDX0lNTUVEKSAmJiAodS5tb2RlICE9IEFDQ19ERUZFUikpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXNjcC0+YWNjZXB0X21vZGUgPSAodW5zaWduZWQgY2hhcil1Lm1vZGU7CisJCQlicmVhazsKKworCQljYXNlIERTT19DT05BQ0NFUFQ6CisKKwkJCWlmIChzY3AtPnN0YXRlICE9IEROX0NSKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJdGltZW8gPSBzb2NrX3JjdnRpbWVvKHNrLCAwKTsKKwkJCWVyciA9IGRuX2NvbmZpcm1fYWNjZXB0KHNrLCAmdGltZW8sIHNrLT5za19hbGxvY2F0aW9uKTsKKwkJCXJldHVybiBlcnI7CisKKwkJY2FzZSBEU09fQ09OUkVKRUNUOgorCisJCQlpZiAoc2NwLT5zdGF0ZSAhPSBETl9DUikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJc2NwLT5zdGF0ZSA9IEROX0RSOworCQkJc2stPnNrX3NodXRkb3duID0gU0hVVERPV05fTUFTSzsKKwkJCWRuX25zcF9zZW5kX2Rpc2Moc2ssIDB4MzgsIDAsIHNrLT5za19hbGxvY2F0aW9uKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisjaWZkZWYgQ09ORklHX05FVEZJTFRFUgorCQlyZXR1cm4gbmZfc2V0c29ja29wdChzaywgUEZfREVDbmV0LCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CisjZW5kaWYKKwkJY2FzZSBEU09fTElOS0lORk86CisJCWNhc2UgRFNPX1NUUkVBTToKKwkJY2FzZSBEU09fU0VRUEFDS0VUOgorCQkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKworCQljYXNlIERTT19NQVhXSU5ET1c6CisJCQlpZiAob3B0bGVuICE9IHNpemVvZih1bnNpZ25lZCBsb25nKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmICh1LndpbiA+IE5TUF9NQVhfV0lORE9XKQorCQkJCXUud2luID0gTlNQX01BWF9XSU5ET1c7CisJCQlpZiAodS53aW4gPT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXNjcC0+bWF4X3dpbmRvdyA9IHUud2luOworCQkJaWYgKHNjcC0+c25kX3dpbmRvdyA+IHUud2luKQorCQkJCXNjcC0+c25kX3dpbmRvdyA9IHUud2luOworCQkJYnJlYWs7CisKKwkJY2FzZSBEU09fTk9ERUxBWToKKwkJCWlmIChvcHRsZW4gIT0gc2l6ZW9mKGludCkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoc2NwLT5ub25hZ2xlID09IDIpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlzY3AtPm5vbmFnbGUgPSAodS52YWwgPT0gMCkgPyAwIDogMTsKKwkJCS8qIGlmIChzY3AtPm5vbmFnbGUgPT0gMSkgeyBQdXNoIHBlbmRpbmcgZnJhbWVzIH0gKi8KKwkJCWJyZWFrOworCisJCWNhc2UgRFNPX0NPUks6CisJCQlpZiAob3B0bGVuICE9IHNpemVvZihpbnQpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKHNjcC0+bm9uYWdsZSA9PSAxKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJc2NwLT5ub25hZ2xlID0gKHUudmFsID09IDApID8gMCA6IDI7CisJCQkvKiBpZiAoc2NwLT5ub25hZ2xlID09IDApIHsgUHVzaCBwZW5kaW5nIGZyYW1lcyB9ICovCisJCQlicmVhazsKKworCQljYXNlIERTT19TRVJWSUNFUzoKKwkJCWlmIChvcHRsZW4gIT0gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKCh1LnNlcnZpY2VzICYgfk5TUF9GQ19NQVNLKSAhPSAweDAxKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKCh1LnNlcnZpY2VzICYgTlNQX0ZDX01BU0spID09IE5TUF9GQ19NQVNLKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJc2NwLT5zZXJ2aWNlc19sb2MgPSB1LnNlcnZpY2VzOworCQkJYnJlYWs7CisKKwkJY2FzZSBEU09fSU5GTzoKKwkJCWlmIChvcHRsZW4gIT0gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKHUuaW5mbyAmIDB4ZmMpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlzY3AtPmluZm9fbG9jID0gdS5pbmZvOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG5fZ2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJaW50IGVycjsKKworCWxvY2tfc29jayhzayk7CisJZXJyID0gX19kbl9nZXRzb2Nrb3B0KHNvY2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbiwgMCk7CisJcmVsZWFzZV9zb2NrKHNrKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kbl9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCxpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCxpbnQgX191c2VyICpvcHRsZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3QJc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgZG5fc2NwICpzY3AgPSBETl9TSyhzayk7CisJc3RydWN0IGxpbmtpbmZvX2RuIGxpbms7CisJdW5zaWduZWQgaW50IHJfbGVuOworCXZvaWQgKnJfZGF0YSA9IE5VTEw7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWlmKGdldF91c2VyKHJfbGVuICwgb3B0bGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCQorCXN3aXRjaChvcHRuYW1lKSB7CisJCWNhc2UgRFNPX0NPTkRBVEE6CisJCQlpZiAocl9sZW4gPiBzaXplb2Yoc3RydWN0IG9wdGRhdGFfZG4pKQorCQkJCXJfbGVuID0gc2l6ZW9mKHN0cnVjdCBvcHRkYXRhX2RuKTsKKwkJCXJfZGF0YSA9ICZzY3AtPmNvbm5kYXRhX2luOworCQkJYnJlYWs7CisKKwkJY2FzZSBEU09fRElTREFUQToKKwkJCWlmIChyX2xlbiA+IHNpemVvZihzdHJ1Y3Qgb3B0ZGF0YV9kbikpCisJCQkJcl9sZW4gPSBzaXplb2Yoc3RydWN0IG9wdGRhdGFfZG4pOworCQkJcl9kYXRhID0gJnNjcC0+ZGlzY2RhdGFfaW47CisJCQlicmVhazsKKworCQljYXNlIERTT19DT05BQ0NFU1M6CisJCQlpZiAocl9sZW4gPiBzaXplb2Yoc3RydWN0IGFjY2Vzc2RhdGFfZG4pKQorCQkJCXJfbGVuID0gc2l6ZW9mKHN0cnVjdCBhY2Nlc3NkYXRhX2RuKTsKKwkJCXJfZGF0YSA9ICZzY3AtPmFjY2Vzc2RhdGE7CisJCQlicmVhazsKKworCQljYXNlIERTT19BQ0NFUFRNT0RFOgorCQkJaWYgKHJfbGVuID4gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKQorCQkJCXJfbGVuID0gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOworCQkJcl9kYXRhID0gJnNjcC0+YWNjZXB0X21vZGU7CisJCQlicmVhazsKKworCQljYXNlIERTT19MSU5LSU5GTzoKKwkJCWlmIChyX2xlbiA+IHNpemVvZihzdHJ1Y3QgbGlua2luZm9fZG4pKQorCQkJCXJfbGVuID0gc2l6ZW9mKHN0cnVjdCBsaW5raW5mb19kbik7CisKKwkJCXN3aXRjaChzb2NrLT5zdGF0ZSkgeworCQkJCWNhc2UgU1NfQ09OTkVDVElORzoKKwkJCQkJbGluay5pZG5fbGlua3N0YXRlID0gTExfQ09OTkVDVElORzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTU19ESVNDT05ORUNUSU5HOgorCQkJCQlsaW5rLmlkbl9saW5rc3RhdGUgPSBMTF9ESVNDT05ORUNUSU5HOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNTX0NPTk5FQ1RFRDoKKwkJCQkJbGluay5pZG5fbGlua3N0YXRlID0gTExfUlVOTklORzsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJbGluay5pZG5fbGlua3N0YXRlID0gTExfSU5BQ1RJVkU7CisJCQl9CisKKwkJCWxpbmsuaWRuX3NlZ3NpemUgPSBzY3AtPnNlZ3NpemVfcmVtOworCQkJcl9kYXRhID0gJmxpbms7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorI2lmZGVmIENPTkZJR19ORVRGSUxURVIKKwkJeworCQkJaW50IHZhbCwgbGVuOworCQkJCisJCQlpZihnZXRfdXNlcihsZW4sIG9wdGxlbikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkKKwkJCXZhbCA9IG5mX2dldHNvY2tvcHQoc2ssIFBGX0RFQ25ldCwgb3B0bmFtZSwgCisJCQkJCQkJb3B0dmFsLCAmbGVuKTsKKwkJCWlmICh2YWwgPj0gMCkKKwkJCQl2YWwgPSBwdXRfdXNlcihsZW4sIG9wdGxlbik7CisJCQlyZXR1cm4gdmFsOworCQl9CisjZW5kaWYKKwkJY2FzZSBEU09fU1RSRUFNOgorCQljYXNlIERTT19TRVFQQUNLRVQ6CisJCWNhc2UgRFNPX0NPTkFDQ0VQVDoKKwkJY2FzZSBEU09fQ09OUkVKRUNUOgorICAgICAgICAJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisKKwkJY2FzZSBEU09fTUFYV0lORE9XOgorCQkJaWYgKHJfbGVuID4gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCQkJCXJfbGVuID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCQkJcl9kYXRhID0gJnNjcC0+bWF4X3dpbmRvdzsKKwkJCWJyZWFrOworCisJCWNhc2UgRFNPX05PREVMQVk6CisJCQlpZiAocl9sZW4gPiBzaXplb2YoaW50KSkKKwkJCQlyX2xlbiA9IHNpemVvZihpbnQpOworCQkJdmFsID0gKHNjcC0+bm9uYWdsZSA9PSAxKTsKKwkJCXJfZGF0YSA9ICZ2YWw7CisJCQlicmVhazsKKworCQljYXNlIERTT19DT1JLOgorCQkJaWYgKHJfbGVuID4gc2l6ZW9mKGludCkpCisJCQkJcl9sZW4gPSBzaXplb2YoaW50KTsKKwkJCXZhbCA9IChzY3AtPm5vbmFnbGUgPT0gMik7CisJCQlyX2RhdGEgPSAmdmFsOworCQkJYnJlYWs7CisKKwkJY2FzZSBEU09fU0VSVklDRVM6CisJCQlpZiAocl9sZW4gPiBzaXplb2YodW5zaWduZWQgY2hhcikpCisJCQkJcl9sZW4gPSBzaXplb2YodW5zaWduZWQgY2hhcik7CisJCQlyX2RhdGEgPSAmc2NwLT5zZXJ2aWNlc19yZW07CisJCQlicmVhazsKKworCQljYXNlIERTT19JTkZPOgorCQkJaWYgKHJfbGVuID4gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKQorCQkJCXJfbGVuID0gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOworCQkJcl9kYXRhID0gJnNjcC0+aW5mb19yZW07CisJCQlicmVhazsKKwl9CisKKwlpZiAocl9kYXRhKSB7CisJCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCByX2RhdGEsIHJfbGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAocHV0X3VzZXIocl9sZW4sIG9wdGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGRuX2RhdGFfcmVhZHkoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpxLCBpbnQgZmxhZ3MsIGludCB0YXJnZXQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHEtPm5leHQ7CisJaW50IGxlbiA9IDA7CisKKwlpZiAoZmxhZ3MgJiBNU0dfT09CKQorCQlyZXR1cm4gc2tiX3F1ZXVlX2xlbihxKSA/IDEgOiAwOworCisJd2hpbGUoc2tiICE9IChzdHJ1Y3Qgc2tfYnVmZiAqKXEpIHsKKwkJc3RydWN0IGRuX3NrYl9jYiAqY2IgPSBETl9TS0JfQ0Ioc2tiKTsKKwkJbGVuICs9IHNrYi0+bGVuOworCisJCWlmIChjYi0+bnNwX2ZsYWdzICYgMHg0MCkgeworCQkJLyogU09DS19TRVFQQUNLRVQgcmVhZHMgdG8gRU9NICovCisJCQlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19TRVFQQUNLRVQpCisJCQkJcmV0dXJuIDE7CisJCQkvKiBzbyBkb2VzIFNPQ0tfU1RSRUFNIHVubGVzcyBXQUlUQUxMIGlzIHNwZWNpZmllZCAqLworCQkJaWYgKCEoZmxhZ3MgJiBNU0dfV0FJVEFMTCkpCisJCQkJcmV0dXJuIDE7CisJCX0KKworCQkvKiBtaW5pbXVtIGRhdGEgbGVuZ3RoIGZvciByZWFkIGV4Y2VlZGVkICovCisJCWlmIChsZW4gPj0gdGFyZ2V0KQorCQkJcmV0dXJuIDE7CisKKwkJc2tiID0gc2tiLT5uZXh0OworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZG5fcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpxdWV1ZSA9ICZzay0+c2tfcmVjZWl2ZV9xdWV1ZTsKKwlzaXplX3QgdGFyZ2V0ID0gc2l6ZSA+IDEgPyAxIDogMDsKKwlzaXplX3QgY29waWVkID0gMDsKKwlpbnQgcnYgPSAwOworCXN0cnVjdCBza19idWZmICpza2IsICpuc2tiOworCXN0cnVjdCBkbl9za2JfY2IgKmNiID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyIGVvciA9IDA7CisJbG9uZyB0aW1lbyA9IHNvY2tfcmN2dGltZW8oc2ssIGZsYWdzICYgTVNHX0RPTlRXQUlUKTsKKworCWxvY2tfc29jayhzayk7CisKKwlpZiAoc29ja19mbGFnKHNrLCBTT0NLX1pBUFBFRCkpIHsKKwkJcnYgPSAtRUFERFJOT1RBVkFJTDsKKwkJZ290byBvdXQ7CisJfQorCisJcnYgPSBkbl9jaGVja19zdGF0ZShzaywgTlVMTCwgMCwgJnRpbWVvLCBmbGFncyk7CisJaWYgKHJ2KQorCQlnb3RvIG91dDsKKworCWlmIChzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pIHsKKwkJaWYgKCEoZmxhZ3MgJiBNU0dfTk9TSUdOQUwpKQorCQkJc2VuZF9zaWcoU0lHUElQRSwgY3VycmVudCwgMCk7CisJCXJ2ID0gLUVQSVBFOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZmxhZ3MgJiB+KE1TR19QRUVLfE1TR19PT0J8TVNHX1dBSVRBTEx8TVNHX0RPTlRXQUlUfE1TR19OT1NJR05BTCkpIHsKKwkJcnYgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGZsYWdzICYgTVNHX09PQikKKwkJcXVldWUgPSAmc2NwLT5vdGhlcl9yZWNlaXZlX3F1ZXVlOworCisJaWYgKGZsYWdzICYgTVNHX1dBSVRBTEwpCisJCXRhcmdldCA9IHNpemU7CisKKworCS8qCisJICogU2VlIGlmIHRoZXJlIGlzIGRhdGEgcmVhZHkgdG8gcmVhZCwgc2xlZXAgaWYgdGhlcmUgaXNuJ3QKKwkgKi8KKwlmb3IoOzspIHsKKwkJaWYgKHNrLT5za19lcnIpCisJCQlnb3RvIG91dDsKKworCQlpZiAoc2tiX3F1ZXVlX2xlbigmc2NwLT5vdGhlcl9yZWNlaXZlX3F1ZXVlKSkgeworCQkJaWYgKCEoZmxhZ3MgJiBNU0dfT09CKSkgeworCQkJCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19PT0I7CisJCQkJaWYgKCFzY3AtPm90aGVyX3JlcG9ydCkgeworCQkJCQlzY3AtPm90aGVyX3JlcG9ydCA9IDE7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJaWYgKHNjcC0+c3RhdGUgIT0gRE5fUlVOKQorCQkJZ290byBvdXQ7CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlydiA9IHNvY2tfaW50cl9lcnJubyh0aW1lbyk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChkbl9kYXRhX3JlYWR5KHNrLCBxdWV1ZSwgZmxhZ3MsIHRhcmdldCkpCisJCQlicmVhazsKKworCQlpZiAoZmxhZ3MgJiBNU0dfRE9OVFdBSVQpIHsKKwkJCXJ2ID0gLUVXT1VMREJMT0NLOworCQkJZ290byBvdXQ7CisJCX0KKworCQlzZXRfYml0KFNPQ0tfQVNZTkNfV0FJVERBVEEsICZzb2NrLT5mbGFncyk7CisJCVNPQ0tfU0xFRVBfUFJFKHNrKQorCisJCWlmICghZG5fZGF0YV9yZWFkeShzaywgcXVldWUsIGZsYWdzLCB0YXJnZXQpKQorCQkJc2NoZWR1bGUoKTsKKworCQlTT0NLX1NMRUVQX1BPU1Qoc2spCisJCWNsZWFyX2JpdChTT0NLX0FTWU5DX1dBSVREQVRBLCAmc29jay0+ZmxhZ3MpOworCX0KKworCWZvcihza2IgPSBxdWV1ZS0+bmV4dDsgc2tiICE9IChzdHJ1Y3Qgc2tfYnVmZiAqKXF1ZXVlOyBza2IgPSBuc2tiKSB7CisJCXVuc2lnbmVkIGludCBjaHVuayA9IHNrYi0+bGVuOworCQljYiA9IEROX1NLQl9DQihza2IpOworCisJCWlmICgoY2h1bmsgKyBjb3BpZWQpID4gc2l6ZSkKKwkJCWNodW5rID0gc2l6ZSAtIGNvcGllZDsKKworCQlpZiAobWVtY3B5X3RvaW92ZWMobXNnLT5tc2dfaW92LCBza2ItPmRhdGEsIGNodW5rKSkgeworCQkJcnYgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJY29waWVkICs9IGNodW5rOworCisJCWlmICghKGZsYWdzICYgTVNHX1BFRUspKQorCQkJc2tiX3B1bGwoc2tiLCBjaHVuayk7CisKKwkJZW9yID0gY2ItPm5zcF9mbGFncyAmIDB4NDA7CisJCW5za2IgPSBza2ItPm5leHQ7CisKKwkJaWYgKHNrYi0+bGVuID09IDApIHsKKwkJCXNrYl91bmxpbmsoc2tiKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJLyogCisJCQkgKiBOLkIuIERvbid0IHJlZmVyIHRvIHNrYiBvciBjYiBhZnRlciB0aGlzIHBvaW50CisJCQkgKiBpbiBsb29wLgorCQkJICovCisJCQlpZiAoKHNjcC0+Zmxvd2xvY19zdyA9PSBETl9ET05UU0VORCkgJiYgIWRuX2Nvbmdlc3RlZChzaykpIHsKKwkJCQlzY3AtPmZsb3dsb2Nfc3cgPSBETl9TRU5EOworCQkJCWRuX25zcF9zZW5kX2xpbmsoc2ssIEROX1NFTkQsIDApOworCQkJfQorCQl9CisKKwkJaWYgKGVvcikgeyAKKwkJCWlmIChzay0+c2tfdHlwZSA9PSBTT0NLX1NFUVBBQ0tFVCkKKwkJCQlicmVhazsKKwkJCWlmICghKGZsYWdzICYgTVNHX1dBSVRBTEwpKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGZsYWdzICYgTVNHX09PQikKKwkJCWJyZWFrOworCisJCWlmIChjb3BpZWQgPj0gdGFyZ2V0KQorCQkJYnJlYWs7CisJfQorCisJcnYgPSBjb3BpZWQ7CisKKworCWlmIChlb3IgJiYgKHNrLT5za190eXBlID09IFNPQ0tfU0VRUEFDS0VUKSkKKwkJbXNnLT5tc2dfZmxhZ3MgfD0gTVNHX0VPUjsKKworb3V0OgorCWlmIChydiA9PSAwKQorCQlydiA9IChmbGFncyAmIE1TR19QRUVLKSA/IC1zay0+c2tfZXJyIDogc29ja19lcnJvcihzayk7CisKKwlpZiAoKHJ2ID49IDApICYmIG1zZy0+bXNnX25hbWUpIHsKKwkJbWVtY3B5KG1zZy0+bXNnX25hbWUsICZzY3AtPnBlZXIsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfZG4pKTsKKwkJbXNnLT5tc2dfbmFtZWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfZG4pOworCX0KKworCXJlbGVhc2Vfc29jayhzayk7CisKKwlyZXR1cm4gcnY7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgZG5fcXVldWVfdG9vX2xvbmcoc3RydWN0IGRuX3NjcCAqc2NwLCBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpxdWV1ZSwgaW50IGZsYWdzKQoreworCXVuc2lnbmVkIGNoYXIgZmN0eXBlID0gc2NwLT5zZXJ2aWNlc19yZW0gJiBOU1BfRkNfTUFTSzsKKwlpZiAoc2tiX3F1ZXVlX2xlbihxdWV1ZSkgPj0gc2NwLT5zbmRfd2luZG93KQorCQlyZXR1cm4gMTsKKwlpZiAoZmN0eXBlICE9IE5TUF9GQ19OT05FKSB7CisJCWlmIChmbGFncyAmIE1TR19PT0IpIHsKKwkJCWlmIChzY3AtPmZsb3dyZW1fb3RoID09IDApCisJCQkJcmV0dXJuIDE7CisJCX0gZWxzZSB7CisJCQlpZiAoc2NwLT5mbG93cmVtX2RhdCA9PSAwKQorCQkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKgorICogVGhlIERFQ25ldCBzcGVjIHJlcXVpcmVzIHRoZSB0aGUgInJvdXRpbmcgbGF5ZXIiIGFjY2VwdHMgcGFja2V0cyB3aGljaAorICogYXJlIGF0IGxlYXN0IDIzMCBieXRlcyBpbiBzaXplLiBUaGlzIGV4Y2x1ZGVzIGFueSBoZWFkZXJzIHdoaWNoIHRoZSBOU1AKKyAqIGxheWVyIG1pZ2h0IGFkZCwgc28gd2UgYWx3YXlzIGFzc3VtZSB0aGF0IHdlJ2xsIGJlIHVzaW5nIHRoZSBtYXhpbWFsCisgKiBsZW5ndGggaGVhZGVyIG9uIGRhdGEgcGFja2V0cy4gVGhlIHZhcmlhdGlvbiBpbiBsZW5ndGggaXMgZHVlIHRvIHRoZQorICogaW5jbHVzaW9uIChvciBub3QpIG9mIHRoZSB0d28gMTYgYml0IGFja25vd2xlZGdlbWVudCBmaWVsZHMgc28gaXQgZG9lc24ndAorICogbWFrZSBtdWNoIHByYWN0aWNhbCBkaWZmZXJlbmNlLgorICovCit1bnNpZ25lZCBkbl9tc3NfZnJvbV9wbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtdHUpCit7CisJdW5zaWduZWQgbXNzID0gMjMwIC0gRE5fTUFYX05TUF9EQVRBX0hFQURFUjsKKwlpZiAoZGV2KSB7CisJCXN0cnVjdCBkbl9kZXYgKmRuX2RiID0gZGV2LT5kbl9wdHI7CisJCW10dSAtPSBMTF9SRVNFUlZFRF9TUEFDRShkZXYpOworCQlpZiAoZG5fZGItPnVzZV9sb25nKQorCQkJbXR1IC09IDIxOworCQllbHNlCisJCQltdHUgLT0gNjsKKwkJbXR1IC09IEROX01BWF9OU1BfREFUQV9IRUFERVI7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogMjEgPSBsb25nIGhlYWRlciwgMTYgPSBndWVzcyBhdCBNQUMgaGVhZGVyIGxlbmd0aAorCQkgKi8KKwkJbXR1IC09ICgyMSArIEROX01BWF9OU1BfREFUQV9IRUFERVIgKyAxNik7CisJfQorCWlmIChtdHUgPiBtc3MpCisJCW1zcyA9IG10dTsKKwlyZXR1cm4gbXNzOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBkbl9jdXJyZW50X21zcyhzdHJ1Y3Qgc29jayAqc2ssIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBfX3NrX2RzdF9nZXQoc2spOworCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKKwlpbnQgbXNzX25vdyA9IG1pbl90KGludCwgc2NwLT5zZWdzaXplX2xvYywgc2NwLT5zZWdzaXplX3JlbSk7CisKKwkvKiBPdGhlciBkYXRhIG1lc3NhZ2VzIGFyZSBsaW1pdGVkIHRvIDE2IGJ5dGVzIHBlciBwYWNrZXQgKi8KKwlpZiAoZmxhZ3MgJiBNU0dfT09CKQorCQlyZXR1cm4gMTY7CisKKwkvKiBUaGlzIHdvcmtzIG91dCB0aGUgbWF4aW11bSBzaXplIG9mIHNlZ21lbnQgd2UgY2FuIHNlbmQgb3V0ICovCisJaWYgKGRzdCkgeworCQl1MzIgbXR1ID0gZHN0X210dShkc3QpOworCQltc3Nfbm93ID0gbWluX3QoaW50LCBkbl9tc3NfZnJvbV9wbXR1KGRzdC0+ZGV2LCBtdHUpLCBtc3Nfbm93KTsKKwl9CisKKwlyZXR1cm4gbXNzX25vdzsKK30KKworc3RhdGljIGludCBkbl9lcnJvcihzdHJ1Y3Qgc29jayAqc2ssIGludCBmbGFncywgaW50IGVycikKK3sKKwlpZiAoZXJyID09IC1FUElQRSkKKwkJZXJyID0gc29ja19lcnJvcihzaykgPyA6IC1FUElQRTsKKwlpZiAoZXJyID09IC1FUElQRSAmJiAhKGZsYWdzICYgTVNHX05PU0lHTkFMKSkKKwkJc2VuZF9zaWcoU0lHUElQRSwgY3VycmVudCwgMCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkbl9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKKwlzaXplX3QgbXNzOworCXN0cnVjdCBza19idWZmX2hlYWQgKnF1ZXVlID0gJnNjcC0+ZGF0YV94bWl0X3F1ZXVlOworCWludCBmbGFncyA9IG1zZy0+bXNnX2ZsYWdzOworCWludCBlcnIgPSAwOworCXNpemVfdCBzZW50ID0gMDsKKwlpbnQgYWRkcl9sZW4gPSBtc2ctPm1zZ19uYW1lbGVuOworCXN0cnVjdCBzb2NrYWRkcl9kbiAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfZG4gKiltc2ctPm1zZ19uYW1lOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXN0cnVjdCBkbl9za2JfY2IgKmNiOworCXNpemVfdCBsZW47CisJdW5zaWduZWQgY2hhciBmY3R5cGU7CisJbG9uZyB0aW1lbyA9IHNvY2tfc25kdGltZW8oc2ssIGZsYWdzICYgTVNHX0RPTlRXQUlUKTsKKworCWlmIChmbGFncyAmIH4oTVNHX1RSWUhBUkR8TVNHX09PQnxNU0dfRE9OVFdBSVR8TVNHX0VPUnxNU0dfTk9TSUdOQUx8TVNHX01PUkV8TVNHX0NNU0dfQ09NUEFUKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKGFkZHJfbGVuICYmIChhZGRyX2xlbiAhPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2RuKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBUaGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gc3RyZWFtIHNvY2tldHMgYW5kIHNlcXVlbmNlZCBwYWNrZXQKKwkgKiBzb2NrZXRzIGlzIHRoYXQgdGhlIHN0cmVhbSBzb2NrZXRzIGFsd2F5cyBiZWhhdmUgYXMgaWYgTVNHX0VPUgorCSAqIGhhcyBiZWVuIHNldC4KKwkgKi8KKwlpZiAoc29jay0+dHlwZSA9PSBTT0NLX1NUUkVBTSkgeworCQlpZiAoZmxhZ3MgJiBNU0dfRU9SKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWZsYWdzIHw9IE1TR19FT1I7CisJfQorCisJbG9ja19zb2NrKHNrKTsKKworCWVyciA9IGRuX2NoZWNrX3N0YXRlKHNrLCBhZGRyLCBhZGRyX2xlbiwgJnRpbWVvLCBmbGFncyk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZXJyOworCisJaWYgKHNrLT5za19zaHV0ZG93biAmIFNFTkRfU0hVVERPV04pIHsKKwkJZXJyID0gLUVQSVBFOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJaWYgKChmbGFncyAmIE1TR19UUllIQVJEKSAmJiBzay0+c2tfZHN0X2NhY2hlKQorCQlkc3RfbmVnYXRpdmVfYWR2aWNlKCZzay0+c2tfZHN0X2NhY2hlKTsKKworCW1zcyA9IHNjcC0+c2Vnc2l6ZV9yZW07CisJZmN0eXBlID0gc2NwLT5zZXJ2aWNlc19yZW0gJiBOU1BfRkNfTUFTSzsKKworCW1zcyA9IGRuX2N1cnJlbnRfbXNzKHNrLCBmbGFncyk7CisKKwlpZiAoZmxhZ3MgJiBNU0dfT09CKSB7CisJCXF1ZXVlID0gJnNjcC0+b3RoZXJfeG1pdF9xdWV1ZTsKKwkJaWYgKHNpemUgPiBtc3MpIHsKKwkJCWVyciA9IC1FTVNHU0laRTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJc2NwLT5wZXJzaXN0X2Z4biA9IGRuX25zcF94bWl0X3RpbWVvdXQ7CisKKwl3aGlsZShzZW50IDwgc2l6ZSkgeworCQllcnIgPSBzb2NrX2Vycm9yKHNrKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJZXJyID0gc29ja19pbnRyX2Vycm5vKHRpbWVvKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyoKKwkJICogQ2FsY3VsYXRlIHNpemUgdGhhdCB3ZSB3aXNoIHRvIHNlbmQuCisJCSAqLworCQlsZW4gPSBzaXplIC0gc2VudDsKKworCQlpZiAobGVuID4gbXNzKQorCQkJbGVuID0gbXNzOworCisJCS8qCisJCSAqIFdhaXQgZm9yIHF1ZXVlIHNpemUgdG8gZ28gZG93biBiZWxvdyB0aGUgd2luZG93CisJCSAqIHNpemUuCisJCSAqLworCQlpZiAoZG5fcXVldWVfdG9vX2xvbmcoc2NwLCBxdWV1ZSwgZmxhZ3MpKSB7CisJCQlpZiAoZmxhZ3MgJiBNU0dfRE9OVFdBSVQpIHsKKwkJCQllcnIgPSAtRVdPVUxEQkxPQ0s7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCVNPQ0tfU0xFRVBfUFJFKHNrKQorCisJCQlpZiAoZG5fcXVldWVfdG9vX2xvbmcoc2NwLCBxdWV1ZSwgZmxhZ3MpKQorCQkJCXNjaGVkdWxlKCk7CisKKwkJCVNPQ0tfU0xFRVBfUE9TVChzaykKKworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBHZXQgYSBzdWl0YWJseSBzaXplZCBza2IuCisJCSAqLworCQlza2IgPSBkbl9hbGxvY19zZW5kX3NrYihzaywgJmxlbiwgZmxhZ3MgJiBNU0dfRE9OVFdBSVQsIHRpbWVvLCAmZXJyKTsKKworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisKKwkJaWYgKCFza2IpCisJCQljb250aW51ZTsKKworCQljYiA9IEROX1NLQl9DQihza2IpOworCisJCXNrYl9yZXNlcnZlKHNrYiwgRE5fTUFYX05TUF9EQVRBX0hFQURFUik7CisKKwkJaWYgKG1lbWNweV9mcm9taW92ZWMoc2tiX3B1dChza2IsIGxlbiksIG1zZy0+bXNnX2lvdiwgbGVuKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGZsYWdzICYgTVNHX09PQikgeworCQkJY2ItPm5zcF9mbGFncyA9IDB4MzA7CisJCQlpZiAoZmN0eXBlICE9IE5TUF9GQ19OT05FKQorCQkJCXNjcC0+Zmxvd3JlbV9vdGgtLTsKKwkJfSBlbHNlIHsKKwkJCWNiLT5uc3BfZmxhZ3MgPSAweDAwOworCQkJaWYgKHNjcC0+c2VnX3RvdGFsID09IDApCisJCQkJY2ItPm5zcF9mbGFncyB8PSAweDIwOworCisJCQlzY3AtPnNlZ190b3RhbCArPSBsZW47CisJCQorCQkJaWYgKCgoc2VudCArIGxlbikgPT0gc2l6ZSkgJiYgKGZsYWdzICYgTVNHX0VPUikpIHsKKwkJCQljYi0+bnNwX2ZsYWdzIHw9IDB4NDA7CisJCQkJc2NwLT5zZWdfdG90YWwgPSAwOworCQkJCWlmIChmY3R5cGUgPT0gTlNQX0ZDX1NDTUMpCisJCQkJCXNjcC0+Zmxvd3JlbV9kYXQtLTsKKwkJCX0KKwkJCWlmIChmY3R5cGUgPT0gTlNQX0ZDX1NSQykKKwkJCQlzY3AtPmZsb3dyZW1fZGF0LS07CisJCX0KKworCQlzZW50ICs9IGxlbjsKKwkJZG5fbnNwX3F1ZXVlX3htaXQoc2ssIHNrYiwgc2stPnNrX2FsbG9jYXRpb24sIGZsYWdzICYgTVNHX09PQik7CisJCXNrYiA9IE5VTEw7CisKKwkJc2NwLT5wZXJzaXN0ID0gZG5fbnNwX3BlcnNpc3Qoc2spOworCisJfQorb3V0OgorCisJaWYgKHNrYikKKwkJa2ZyZWVfc2tiKHNrYik7CisKKwlyZWxlYXNlX3NvY2soc2spOworCisJcmV0dXJuIHNlbnQgPyBzZW50IDogZXJyOworCitvdXRfZXJyOgorCWVyciA9IGRuX2Vycm9yKHNrLCBmbGFncywgZXJyKTsKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZG5fZGV2aWNlX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBldmVudCwKKwkJCXZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopcHRyOworCisJc3dpdGNoKGV2ZW50KSB7CisJCWNhc2UgTkVUREVWX1VQOgorCQkJZG5fZGV2X3VwKGRldik7CisJCQlicmVhazsKKwkJY2FzZSBORVRERVZfRE9XTjoKKwkJCWRuX2Rldl9kb3duKGRldik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBkbl9kZXZfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBkbl9kZXZpY2VfZXZlbnQsCit9OworCitleHRlcm4gaW50IGRuX3JvdXRlX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgcGFja2V0X3R5cGUgKik7CisKK3N0YXRpYyBzdHJ1Y3QgcGFja2V0X3R5cGUgZG5fZGl4X3BhY2tldF90eXBlID0geworCS50eXBlID0JCV9fY29uc3RhbnRfaHRvbnMoRVRIX1BfRE5BX1JUKSwKKwkuZGV2ID0JCU5VTEwsCQkvKiBBbGwgZGV2aWNlcyAqLworCS5mdW5jID0JCWRuX3JvdXRlX3JjdiwKK307CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RydWN0IGRuX2l0ZXJfc3RhdGUgeworCWludCBidWNrZXQ7Cit9OworCitzdGF0aWMgc3RydWN0IHNvY2sgKmRuX3NvY2tldF9nZXRfZmlyc3Qoc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc3RydWN0IGRuX2l0ZXJfc3RhdGUgKnN0YXRlID0gc2VxLT5wcml2YXRlOworCXN0cnVjdCBzb2NrICpuID0gTlVMTDsKKworCWZvcihzdGF0ZS0+YnVja2V0ID0gMDsKKwkgICAgc3RhdGUtPmJ1Y2tldCA8IEROX1NLX0hBU0hfU0laRTsKKwkgICAgKytzdGF0ZS0+YnVja2V0KSB7CisJCW4gPSBza19oZWFkKCZkbl9za19oYXNoW3N0YXRlLT5idWNrZXRdKTsKKwkJaWYgKG4pCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHN0cnVjdCBzb2NrICpkbl9zb2NrZXRfZ2V0X25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsCisJCQkJICAgICAgIHN0cnVjdCBzb2NrICpuKQoreworCXN0cnVjdCBkbl9pdGVyX3N0YXRlICpzdGF0ZSA9IHNlcS0+cHJpdmF0ZTsKKworCW4gPSBza19uZXh0KG4pOwordHJ5X2FnYWluOgorCWlmIChuKQorCQlnb3RvIG91dDsKKwlpZiAoKytzdGF0ZS0+YnVja2V0ID49IEROX1NLX0hBU0hfU0laRSkKKwkJZ290byBvdXQ7CisJbiA9IHNrX2hlYWQoJmRuX3NrX2hhc2hbc3RhdGUtPmJ1Y2tldF0pOworCWdvdG8gdHJ5X2FnYWluOworb3V0OgorCXJldHVybiBuOworfQorCitzdGF0aWMgc3RydWN0IHNvY2sgKnNvY2tldF9nZXRfaWR4KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBkbl9zb2NrZXRfZ2V0X2ZpcnN0KHNlcSk7CisKKwlpZiAoc2spIHsKKwkJd2hpbGUoKnBvcyAmJiAoc2sgPSBkbl9zb2NrZXRfZ2V0X25leHQoc2VxLCBzaykpKQorCQkJLS0qcG9zOworCX0KKwlyZXR1cm4gKnBvcyA/IE5VTEwgOiBzazsKK30KKworc3RhdGljIHZvaWQgKmRuX3NvY2tldF9nZXRfaWR4KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgcG9zKQoreworCXZvaWQgKnJjOworCXJlYWRfbG9ja19iaCgmZG5faGFzaF9sb2NrKTsKKwlyYyA9IHNvY2tldF9nZXRfaWR4KHNlcSwgJnBvcyk7CisJaWYgKCFyYykgeworCQlyZWFkX3VubG9ja19iaCgmZG5faGFzaF9sb2NrKTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCAqZG5fc29ja2V0X3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJcmV0dXJuICpwb3MgPyBkbl9zb2NrZXRfZ2V0X2lkeChzZXEsICpwb3MgLSAxKSA6IFNFUV9TVEFSVF9UT0tFTjsKK30KKworc3RhdGljIHZvaWQgKmRuX3NvY2tldF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJdm9pZCAqcmM7CisKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJcmMgPSBkbl9zb2NrZXRfZ2V0X2lkeChzZXEsIDApOworCQlnb3RvIG91dDsKKwl9CisKKwlyYyA9IGRuX3NvY2tldF9nZXRfbmV4dChzZXEsIHYpOworCWlmIChyYykKKwkJZ290byBvdXQ7CisJcmVhZF91bmxvY2tfYmgoJmRuX2hhc2hfbG9jayk7CitvdXQ6CisJKysqcG9zOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgZG5fc29ja2V0X3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWlmICh2ICYmIHYgIT0gU0VRX1NUQVJUX1RPS0VOKQorCQlyZWFkX3VubG9ja19iaCgmZG5faGFzaF9sb2NrKTsKK30KKworI2RlZmluZSBJU19OT1RfUFJJTlRBQkxFKHgpICgoeCkgPCAzMiB8fCAoeCkgPiAxMjYpCisKK3N0YXRpYyB2b2lkIGRuX3ByaW50YWJsZV9vYmplY3Qoc3RydWN0IHNvY2thZGRyX2RuICpkbiwgdW5zaWduZWQgY2hhciAqYnVmKQoreworCWludCBpOworICAgIAorCXN3aXRjaCAoZG5fbnRvaHMoZG4tPnNkbl9vYmpuYW1lbCkpIHsKKwkJY2FzZSAwOgorCQkJc3ByaW50ZihidWYsICIlZCIsIGRuLT5zZG5fb2JqbnVtKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZm9yIChpID0gMDsgaSA8IGRuX250b2hzKGRuLT5zZG5fb2JqbmFtZWwpOyBpKyspIHsKKwkJCQlidWZbaV0gPSBkbi0+c2RuX29iam5hbWVbaV07CisJCQkJaWYgKElTX05PVF9QUklOVEFCTEUoYnVmW2ldKSkKKwkJCQkJYnVmW2ldID0gJy4nOworCQkJfQorCQkJYnVmW2ldID0gMDsKKyAgICAJfQorfQorCitzdGF0aWMgY2hhciAqZG5fc3RhdGUyYXNjKHVuc2lnbmVkIGNoYXIgc3RhdGUpCit7CisJc3dpdGNoKHN0YXRlKSB7CisJCWNhc2UgRE5fTzoKKwkJCXJldHVybiAiT1BFTiI7CisJCWNhc2UgRE5fQ1I6CisJCQlyZXR1cm4gIiAgQ1IiOworCQljYXNlIEROX0RSOgorCQkJcmV0dXJuICIgIERSIjsKKwkJY2FzZSBETl9EUkM6CisJCQlyZXR1cm4gIiBEUkMiOworCQljYXNlIEROX0NDOgorCQkJcmV0dXJuICIgIENDIjsKKwkJY2FzZSBETl9DSToKKwkJCXJldHVybiAiICBDSSI7CisJCWNhc2UgRE5fTlI6CisJCQlyZXR1cm4gIiAgTlIiOworCQljYXNlIEROX05DOgorCQkJcmV0dXJuICIgIE5DIjsKKwkJY2FzZSBETl9DRDoKKwkJCXJldHVybiAiICBDRCI7CisJCWNhc2UgRE5fUko6CisJCQlyZXR1cm4gIiAgUkoiOworCQljYXNlIEROX1JVTjoKKwkJCXJldHVybiAiIFJVTiI7CisJCWNhc2UgRE5fREk6CisJCQlyZXR1cm4gIiAgREkiOworCQljYXNlIEROX0RJQzoKKwkJCXJldHVybiAiIERJQyI7CisJCWNhc2UgRE5fRE46CisJCQlyZXR1cm4gIiAgRE4iOworCQljYXNlIEROX0NMOgorCQkJcmV0dXJuICIgIENMIjsKKwkJY2FzZSBETl9DTjoKKwkJCXJldHVybiAiICBDTiI7CisJfQorCisJcmV0dXJuICI/Pz8/IjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRuX3NvY2tldF9mb3JtYXRfZW50cnkoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgZG5fc2NwICpzY3AgPSBETl9TSyhzayk7CisJY2hhciBidWYxW0ROX0FTQ0JVRl9MRU5dOworCWNoYXIgYnVmMltETl9BU0NCVUZfTEVOXTsKKwljaGFyIGxvY2FsX29iamVjdFtETl9NQVhPQkpMKzNdOworCWNoYXIgcmVtb3RlX29iamVjdFtETl9NQVhPQkpMKzNdOworCisJZG5fcHJpbnRhYmxlX29iamVjdCgmc2NwLT5hZGRyLCBsb2NhbF9vYmplY3QpOworCWRuX3ByaW50YWJsZV9vYmplY3QoJnNjcC0+cGVlciwgcmVtb3RlX29iamVjdCk7CisKKwlzZXFfcHJpbnRmKHNlcSwKKwkJICAgIiU2cy8lMDRYICUwNGQ6JTA0ZCAlMDRkOiUwNGQgJTAxZCAlLTE2cyAiCisJCSAgICIlNnMvJTA0WCAlMDRkOiUwNGQgJTA0ZDolMDRkICUwMWQgJS0xNnMgJTRzICVzXG4iLAorCQkgICBkbl9hZGRyMmFzYyhkbl9udG9ocyhkbl9zYWRkcjJkbigmc2NwLT5hZGRyKSksIGJ1ZjEpLAorCQkgICBzY3AtPmFkZHJsb2MsCisJCSAgIHNjcC0+bnVtZGF0LAorCQkgICBzY3AtPm51bW90aCwKKwkJICAgc2NwLT5hY2t4bXRfZGF0LAorCQkgICBzY3AtPmFja3htdF9vdGgsCisJCSAgIHNjcC0+Zmxvd2xvY19zdywKKwkJICAgbG9jYWxfb2JqZWN0LAorCQkgICBkbl9hZGRyMmFzYyhkbl9udG9ocyhkbl9zYWRkcjJkbigmc2NwLT5wZWVyKSksIGJ1ZjIpLAorCQkgICBzY3AtPmFkZHJyZW0sCisJCSAgIHNjcC0+bnVtZGF0X3JjdiwKKwkJICAgc2NwLT5udW1vdGhfcmN2LAorCQkgICBzY3AtPmFja3Jjdl9kYXQsCisJCSAgIHNjcC0+YWNrcmN2X290aCwKKwkJICAgc2NwLT5mbG93cmVtX3N3LAorCQkgICByZW1vdGVfb2JqZWN0LAorCQkgICBkbl9zdGF0ZTJhc2Moc2NwLT5zdGF0ZSksCisJCSAgICgoc2NwLT5hY2NlcHRfbW9kZSA9PSBBQ0NfSU1NRUQpID8gIklNTUVEIiA6ICJERUZFUiIpKTsKK30KKworc3RhdGljIGludCBkbl9zb2NrZXRfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CisJCXNlcV9wdXRzKHNlcSwgIkxvY2FsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW90ZVxuIik7CisJfSBlbHNlIHsKKwkJZG5fc29ja2V0X2Zvcm1hdF9lbnRyeShzZXEsIHYpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBkbl9zb2NrZXRfc2VxX29wcyA9IHsKKwkuc3RhcnQJPSBkbl9zb2NrZXRfc2VxX3N0YXJ0LAorCS5uZXh0CT0gZG5fc29ja2V0X3NlcV9uZXh0LAorCS5zdG9wCT0gZG5fc29ja2V0X3NlcV9zdG9wLAorCS5zaG93CT0gZG5fc29ja2V0X3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBkbl9zb2NrZXRfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNlcV9maWxlICpzZXE7CisJaW50IHJjID0gLUVOT01FTTsKKwlzdHJ1Y3QgZG5faXRlcl9zdGF0ZSAqcyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXMpCisJCWdvdG8gb3V0OworCisJcmMgPSBzZXFfb3BlbihmaWxlLCAmZG5fc29ja2V0X3NlcV9vcHMpOworCWlmIChyYykKKwkJZ290byBvdXRfa2ZyZWU7CisKKwlzZXEJCT0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNlcS0+cHJpdmF0ZQk9IHM7CisJbWVtc2V0KHMsIDAsIHNpemVvZigqcykpOworb3V0OgorCXJldHVybiByYzsKK291dF9rZnJlZToKKwlrZnJlZShzKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZG5fc29ja2V0X3NlcV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBkbl9zb2NrZXRfc2VxX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZV9wcml2YXRlLAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG5ldF9wcm90b19mYW1pbHkJZG5fZmFtaWx5X29wcyA9IHsKKwkuZmFtaWx5ID0JQUZfREVDbmV0LAorCS5jcmVhdGUgPQlkbl9jcmVhdGUsCisJLm93bmVyCT0JVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBkbl9wcm90b19vcHMgPSB7CisJLmZhbWlseSA9CUFGX0RFQ25ldCwKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkucmVsZWFzZSA9CWRuX3JlbGVhc2UsCisJLmJpbmQgPQkJZG5fYmluZCwKKwkuY29ubmVjdCA9CWRuX2Nvbm5lY3QsCisJLnNvY2tldHBhaXIgPQlzb2NrX25vX3NvY2tldHBhaXIsCisJLmFjY2VwdCA9CWRuX2FjY2VwdCwKKwkuZ2V0bmFtZSA9CWRuX2dldG5hbWUsCisJLnBvbGwgPQkJZG5fcG9sbCwKKwkuaW9jdGwgPQlkbl9pb2N0bCwKKwkubGlzdGVuID0JZG5fbGlzdGVuLAorCS5zaHV0ZG93biA9CWRuX3NodXRkb3duLAorCS5zZXRzb2Nrb3B0ID0JZG5fc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdCA9CWRuX2dldHNvY2tvcHQsCisJLnNlbmRtc2cgPQlkbl9zZW5kbXNnLAorCS5yZWN2bXNnID0JZG5fcmVjdm1zZywKKwkubW1hcCA9CQlzb2NrX25vX21tYXAsCisJLnNlbmRwYWdlID0Jc29ja19ub19zZW5kcGFnZSwKK307CisKK3ZvaWQgZG5fcmVnaXN0ZXJfc3lzY3RsKHZvaWQpOwordm9pZCBkbl91bnJlZ2lzdGVyX3N5c2N0bCh2b2lkKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJUaGUgTGludXggREVDbmV0IE5ldHdvcmsgUHJvdG9jb2wiKTsKK01PRFVMRV9BVVRIT1IoIkxpbnV4IERFQ25ldCBQcm9qZWN0IFRlYW0iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19ORVRQUk9UTyhQRl9ERUNuZXQpOworCitzdGF0aWMgY2hhciBiYW5uZXJbXSBfX2luaXRkYXRhID0gS0VSTl9JTkZPICJORVQ0OiBERUNuZXQgZm9yIExpbnV4OiBWLjIuNS42OHMgKEMpIDE5OTUtMjAwMyBMaW51eCBERUNuZXQgUHJvamVjdCBUZWFtXG4iOworCitzdGF0aWMgaW50IF9faW5pdCBkZWNuZXRfaW5pdCh2b2lkKQoreworCWludCByYzsKKworICAgICAgICBwcmludGsoYmFubmVyKTsKKworCXJjID0gcHJvdG9fcmVnaXN0ZXIoJmRuX3Byb3RvLCAxKTsKKwlpZiAocmMgIT0gMCkKKwkJZ290byBvdXQ7CisKKwlkbl9uZWlnaF9pbml0KCk7CisJZG5fZGV2X2luaXQoKTsKKwlkbl9yb3V0ZV9pbml0KCk7CisJZG5fZmliX2luaXQoKTsKKworCXNvY2tfcmVnaXN0ZXIoJmRuX2ZhbWlseV9vcHMpOworCWRldl9hZGRfcGFjaygmZG5fZGl4X3BhY2tldF90eXBlKTsKKwlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmRuX2Rldl9ub3RpZmllcik7CisKKwlwcm9jX25ldF9mb3BzX2NyZWF0ZSgiZGVjbmV0IiwgU19JUlVHTywgJmRuX3NvY2tldF9zZXFfZm9wcyk7CisJZG5fcmVnaXN0ZXJfc3lzY3RsKCk7CitvdXQ6CisJcmV0dXJuIHJjOworCit9Cittb2R1bGVfaW5pdChkZWNuZXRfaW5pdCk7CisKKy8qCisgKiBQcmV2ZW50IERFQ25ldCBtb2R1bGUgdW5sb2FkaW5nIHVudGlsIGl0cyBmaXhlZCBwcm9wZXJseS4KKyAqIFJlcXVpcmVzIGFuIGF1ZGl0IG9mIHRoZSBjb2RlIHRvIGNoZWNrIGZvciBtZW1vcnkgbGVha3MgYW5kCisgKiBpbml0aWFsaXNhdGlvbiBwcm9ibGVtcyBldGMuCisgKi8KKyNpZiAwCitzdGF0aWMgdm9pZCBfX2V4aXQgZGVjbmV0X2V4aXQodm9pZCkKK3sKKwlzb2NrX3VucmVnaXN0ZXIoQUZfREVDbmV0KTsKKwlkZXZfcmVtb3ZlX3BhY2soJmRuX2RpeF9wYWNrZXRfdHlwZSk7CisKKwlkbl91bnJlZ2lzdGVyX3N5c2N0bCgpOworCisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmRuX2Rldl9ub3RpZmllcik7CisKKwlkbl9yb3V0ZV9jbGVhbnVwKCk7CisJZG5fZGV2X2NsZWFudXAoKTsKKwlkbl9uZWlnaF9jbGVhbnVwKCk7CisJZG5fZmliX2NsZWFudXAoKTsKKworCXByb2NfbmV0X3JlbW92ZSgiZGVjbmV0Iik7CisKKwlwcm90b191bnJlZ2lzdGVyKCZkbl9wcm90byk7Cit9Cittb2R1bGVfZXhpdChkZWNuZXRfZXhpdCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvZG5fZGV2LmMgYi9uZXQvZGVjbmV0L2RuX2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYTAzNDYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvZGVjbmV0L2RuX2Rldi5jCkBAIC0wLDAgKzEsMTQ4MSBAQAorLyoKKyAqIERFQ25ldCAgICAgICBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgREVDbmV0IHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqICAgICAgICAgICAgICBvcGVyYXRpbmcgc3lzdGVtLiAgREVDbmV0IGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICogICAgICAgICAgICAgIGludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqICAgICAgICAgICAgICBERUNuZXQgRGV2aWNlIExheWVyCisgKgorICogQXV0aG9yczogICAgIFN0ZXZlIFdoaXRlaG91c2UgPFN0ZXZlV0BBQ00ub3JnPgorICogICAgICAgICAgICAgIEVkdWFyZG8gTWFyY2VsbyBTZXJyYXQgPGVtc2VycmF0QGdlb2NpdGllcy5jb20+CisgKgorICogQ2hhbmdlczoKKyAqICAgICAgICAgIFN0ZXZlIFdoaXRlaG91c2UgOiBEZXZpY2VzIG5vdyBzZWUgaW5jb21pbmcgZnJhbWVzIHNvIHRoZXkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gbWFyayBvbiB3aG8gaXQgY2FtZSBmcm9tLgorICogICAgICAgICAgU3RldmUgV2hpdGVob3VzZSA6IEZpeGVkIGJ1ZyBpbiBjcmVhdGluZyBuZWlnaGJvdXJzLiBFYWNoIG5laWdoYm91cgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBub3cgaGF2ZSBhIGRldmljZSBzcGVjaWZpYyBzZXR1cCBmdW5jLgorICogICAgICAgICAgU3RldmUgV2hpdGVob3VzZSA6IEFkZGVkIC9wcm9jL3N5cy9uZXQvZGVjbmV0L2NvbmYvPGRldj4vCisgKiAgICAgICAgICBTdGV2ZSBXaGl0ZWhvdXNlIDogRml4ZWQgYnVnIHdoaWNoIHNvbWV0aW1lcyBraWxsZWQgdGltZXIKKyAqICAgICAgICAgIFN0ZXZlIFdoaXRlaG91c2UgOiBNdWx0aXBsZSBpZmFkZHIgc3VwcG9ydAorICogICAgICAgICAgU3RldmUgV2hpdGVob3VzZSA6IFNJT0NHSUZDT05GIGlzIG5vdyBhIGNvbXBpbGUgdGltZSBvcHRpb24KKyAqICAgICAgICAgIFN0ZXZlIFdoaXRlaG91c2UgOiAvcHJvYy9zeXMvbmV0L2RlY25ldC9jb25mLzxzeXM+L2ZvcndhcmRpbmcKKyAqICAgICAgICAgIFN0ZXZlIFdoaXRlaG91c2UgOiBSZW1vdmVkIHRpbWVyMSAtIGl0J3MgYSB1c2VyIHNwYWNlIGlzc3VlIG5vdworICogICAgICAgICBQYXRyaWNrIENhdWxmaWVsZCA6IEZpeGVkIHJvdXRlciBoZWxsbyBtZXNzYWdlIGZvcm1hdAorICogICAgICAgICAgU3RldmUgV2hpdGVob3VzZSA6IEdvdCByaWQgb2YgY29uc3RhbnQgc2l6ZXMgZm9yIGJsa3NpemUgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy4gQWxsIG10dSBiYXNlZCBub3cuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPG5ldC9uZWlnaGJvdXIuaD4KKyNpbmNsdWRlIDxuZXQvZHN0Lmg+CisjaW5jbHVkZSA8bmV0L2Zsb3cuaD4KKyNpbmNsdWRlIDxuZXQvZG4uaD4KKyNpbmNsdWRlIDxuZXQvZG5fZGV2Lmg+CisjaW5jbHVkZSA8bmV0L2RuX3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L2RuX25laWdoLmg+CisjaW5jbHVkZSA8bmV0L2RuX2ZpYi5oPgorCisjZGVmaW5lIEROX0lGUkVRX1NJWkUgKHNpemVvZihzdHJ1Y3QgaWZyZXEpIC0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgKyBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2RuKSkKKworc3RhdGljIGNoYXIgZG5fcnRfYWxsX2VuZF9tY2FzdFtFVEhfQUxFTl0gPSB7MHhBQiwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDB9Oworc3RhdGljIGNoYXIgZG5fcnRfYWxsX3J0X21jYXN0W0VUSF9BTEVOXSAgPSB7MHhBQiwweDAwLDB4MDAsMHgwMywweDAwLDB4MDB9Oworc3RhdGljIGNoYXIgZG5faGlvcmRbRVRIX0FMRU5dICAgICAgICAgICAgPSB7MHhBQSwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDB9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgZG5fZWNvX3ZlcnNpb25bM10gICAgPSB7MHgwMiwweDAwLDB4MDB9OworCitleHRlcm4gc3RydWN0IG5laWdoX3RhYmxlIGRuX25laWdoX3RhYmxlOworCisvKgorICogZGVjbmV0X2FkZHJlc3MgaXMga2VwdCBpbiBuZXR3b3JrIG9yZGVyLgorICovCitkbl9hZGRyZXNzIGRlY25ldF9hZGRyZXNzID0gMDsKKworc3RhdGljIERFRklORV9SV0xPQ0soZG5kZXZfbG9jayk7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRlY25ldF9kZWZhdWx0X2RldmljZTsKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKmRuYWRkcl9jaGFpbjsKKworc3RhdGljIHN0cnVjdCBkbl9kZXYgKmRuX2Rldl9jcmVhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICplcnIpOworc3RhdGljIHZvaWQgZG5fZGV2X2RlbGV0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJ0bXNnX2lmYShpbnQgZXZlbnQsIHN0cnVjdCBkbl9pZmFkZHIgKmlmYSk7CisKK3N0YXRpYyBpbnQgZG5fZXRoX3VwKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHZvaWQgZG5fZXRoX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgdm9pZCBkbl9zZW5kX2JyZF9oZWxsbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZG5faWZhZGRyICppZmEpOworc3RhdGljIHZvaWQgZG5fc2VuZF9wdHBfaGVsbG8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGRuX2lmYWRkciAqaWZhKTsKKworc3RhdGljIHN0cnVjdCBkbl9kZXZfcGFybXMgZG5fZGV2X2xpc3RbXSA9ICB7Cit7CisJLnR5cGUgPQkJQVJQSFJEX0VUSEVSLCAvKiBFdGhlcm5ldCAqLworCS5tb2RlID0JCUROX0RFVl9CQ0FTVCwKKwkuc3RhdGUgPQlETl9ERVZfU19SVSwKKwkudDIgPQkJMSwKKwkudDMgPQkJMTAsCisJLm5hbWUgPQkJImV0aGVybmV0IiwKKwkuY3RsX25hbWUgPQlORVRfREVDTkVUX0NPTkZfRVRIRVIsCisJLnVwID0JCWRuX2V0aF91cCwKKwkuZG93biA9IAlkbl9ldGhfZG93biwKKwkudGltZXIzID0JZG5fc2VuZF9icmRfaGVsbG8sCit9LAoreworCS50eXBlID0JCUFSUEhSRF9JUEdSRSwgLyogREVDbmV0IHR1bm5lbGVkIG92ZXIgR1JFIGluIElQICovCisJLm1vZGUgPQkJRE5fREVWX0JDQVNULAorCS5zdGF0ZSA9CUROX0RFVl9TX1JVLAorCS50MiA9CQkxLAorCS50MyA9CQkxMCwKKwkubmFtZSA9CQkiaXBncmUiLAorCS5jdGxfbmFtZSA9CU5FVF9ERUNORVRfQ09ORl9HUkUsCisJLnRpbWVyMyA9CWRuX3NlbmRfYnJkX2hlbGxvLAorfSwKKyNpZiAwCit7CisJLnR5cGUgPQkJQVJQSFJEX1gyNSwgLyogQm9nIHN0YW5kYXJkIFguMjUgKi8KKwkubW9kZSA9CQlETl9ERVZfVUNBU1QsCisJLnN0YXRlID0JRE5fREVWX1NfRFMsCisJLnQyID0JCTEsCisJLnQzID0JCTEyMCwKKwkubmFtZSA9CQkieDI1IiwKKwkuY3RsX25hbWUgPQlORVRfREVDTkVUX0NPTkZfWDI1LAorCS50aW1lcjMgPQlkbl9zZW5kX3B0cF9oZWxsbywKK30sCisjZW5kaWYKKyNpZiAwCit7CisJLnR5cGUgPQkJQVJQSFJEX1BQUCwgLyogREVDbmV0IG92ZXIgUFBQICovCisJLm1vZGUgPQkJRE5fREVWX0JDQVNULAorCS5zdGF0ZSA9CUROX0RFVl9TX1JVLAorCS50MiA9CQkxLAorCS50MyA9CQkxMCwKKwkubmFtZSA9CQkicHBwIiwKKwkuY3RsX25hbWUgPQlORVRfREVDTkVUX0NPTkZfUFBQLAorCS50aW1lcjMgPQlkbl9zZW5kX2JyZF9oZWxsbywKK30sCisjZW5kaWYKK3sKKwkudHlwZSA9CQlBUlBIUkRfRERDTVAsIC8qIERFQ25ldCBvdmVyIEREQ01QICovCisJLm1vZGUgPQkJRE5fREVWX1VDQVNULAorCS5zdGF0ZSA9CUROX0RFVl9TX0RTLAorCS50MiA9CQkxLAorCS50MyA9CQkxMjAsCisJLm5hbWUgPQkJImRkY21wIiwKKwkuY3RsX25hbWUgPQlORVRfREVDTkVUX0NPTkZfRERDTVAsCisJLnRpbWVyMyA9CWRuX3NlbmRfcHRwX2hlbGxvLAorfSwKK3sKKwkudHlwZSA9CQlBUlBIUkRfTE9PUEJBQ0ssIC8qIExvb3BiYWNrIGludGVyZmFjZSAtIGFsd2F5cyBsYXN0ICovCisJLm1vZGUgPQkJRE5fREVWX0JDQVNULAorCS5zdGF0ZSA9CUROX0RFVl9TX1JVLAorCS50MiA9CQkxLAorCS50MyA9CQkxMCwKKwkubmFtZSA9CQkibG9vcGJhY2siLAorCS5jdGxfbmFtZSA9CU5FVF9ERUNORVRfQ09ORl9MT09QQkFDSywKKwkudGltZXIzID0JZG5fc2VuZF9icmRfaGVsbG8sCit9Cit9OworCisjZGVmaW5lIEROX0RFVl9MSVNUX1NJWkUgKHNpemVvZihkbl9kZXZfbGlzdCkvc2l6ZW9mKHN0cnVjdCBkbl9kZXZfcGFybXMpKQorCisjZGVmaW5lIEROX0RFVl9QQVJNU19PRkZTRVQoeCkgKChpbnQpICgoY2hhciAqKSAmKChzdHJ1Y3QgZG5fZGV2X3Bhcm1zICopMCktPngpKQorCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCitzdGF0aWMgaW50IG1pbl90MltdID0geyAxIH07CitzdGF0aWMgaW50IG1heF90MltdID0geyA2MCB9OyAvKiBObyBtYXggc3BlY2lmaWVkLCBidXQgdGhpcyBzZWVtcyBzZW5zaWJsZSAqLworc3RhdGljIGludCBtaW5fdDNbXSA9IHsgMSB9Oworc3RhdGljIGludCBtYXhfdDNbXSA9IHsgODE5MSB9OyAvKiBNdXN0IGZpdCBpbiAxNiBiaXRzIHdoZW4gbXVsdGlwbGllZCBieSBCQ1QzTVVMVCBvciBUM01VTFQgKi8KKworc3RhdGljIGludCBtaW5fcHJpb3JpdHlbMV07CitzdGF0aWMgaW50IG1heF9wcmlvcml0eVtdID0geyAxMjcgfTsgLyogRnJvbSBERUNuZXQgc3BlYyAqLworCitzdGF0aWMgaW50IGRuX2ZvcndhcmRpbmdfcHJvYyhjdGxfdGFibGUgKiwgaW50LCBzdHJ1Y3QgZmlsZSAqLAorCQkJdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKK3N0YXRpYyBpbnQgZG5fZm9yd2FyZGluZ19zeXNjdGwoY3RsX3RhYmxlICp0YWJsZSwgaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sCisJCQl2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAorCQkJdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbiwKKwkJCXZvaWQgKipjb250ZXh0KTsKKworc3RhdGljIHN0cnVjdCBkbl9kZXZfc3lzY3RsX3RhYmxlIHsKKwlzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqc3lzY3RsX2hlYWRlcjsKKwljdGxfdGFibGUgZG5fZGV2X3ZhcnNbNV07CisJY3RsX3RhYmxlIGRuX2Rldl9kZXZbMl07CisJY3RsX3RhYmxlIGRuX2Rldl9jb25mX2RpclsyXTsKKwljdGxfdGFibGUgZG5fZGV2X3Byb3RvX2RpclsyXTsKKwljdGxfdGFibGUgZG5fZGV2X3Jvb3RfZGlyWzJdOworfSBkbl9kZXZfc3lzY3RsID0geworCU5VTEwsCisJeworCXsKKwkJLmN0bF9uYW1lID0gTkVUX0RFQ05FVF9DT05GX0RFVl9GT1JXQVJESU5HLAorCQkucHJvY25hbWUgPSAiZm9yd2FyZGluZyIsCisJCS5kYXRhID0gKHZvaWQgKilETl9ERVZfUEFSTVNfT0ZGU0VUKGZvcndhcmRpbmcpLAorCQkubWF4bGVuID0gc2l6ZW9mKGludCksCisJCS5tb2RlID0gMDY0NCwKKwkJLnByb2NfaGFuZGxlciA9IGRuX2ZvcndhcmRpbmdfcHJvYywKKwkJLnN0cmF0ZWd5ID0gZG5fZm9yd2FyZGluZ19zeXNjdGwsCisJfSwKKwl7CisJCS5jdGxfbmFtZSA9IE5FVF9ERUNORVRfQ09ORl9ERVZfUFJJT1JJVFksCisJCS5wcm9jbmFtZSA9ICJwcmlvcml0eSIsCisJCS5kYXRhID0gKHZvaWQgKilETl9ERVZfUEFSTVNfT0ZGU0VUKHByaW9yaXR5KSwKKwkJLm1heGxlbiA9IHNpemVvZihpbnQpLAorCQkubW9kZSA9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIgPSBwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5ID0gc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMSA9ICZtaW5fcHJpb3JpdHksCisJCS5leHRyYTIgPSAmbWF4X3ByaW9yaXR5CisJfSwKKwl7CisJCS5jdGxfbmFtZSA9IE5FVF9ERUNORVRfQ09ORl9ERVZfVDIsCisJCS5wcm9jbmFtZSA9ICJ0MiIsCisJCS5kYXRhID0gKHZvaWQgKilETl9ERVZfUEFSTVNfT0ZGU0VUKHQyKSwKKwkJLm1heGxlbiA9IHNpemVvZihpbnQpLAorCQkubW9kZSA9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIgPSBwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5ID0gc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMSA9ICZtaW5fdDIsCisJCS5leHRyYTIgPSAmbWF4X3QyCisJfSwKKwl7CisJCS5jdGxfbmFtZSA9IE5FVF9ERUNORVRfQ09ORl9ERVZfVDMsCisJCS5wcm9jbmFtZSA9ICJ0MyIsCisJCS5kYXRhID0gKHZvaWQgKilETl9ERVZfUEFSTVNfT0ZGU0VUKHQzKSwKKwkJLm1heGxlbiA9IHNpemVvZihpbnQpLAorCQkubW9kZSA9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIgPSBwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5ID0gc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMSA9ICZtaW5fdDMsCisJCS5leHRyYTIgPSAmbWF4X3QzCisJfSwKKwl7MH0KKwl9LAorCXt7CisJCS5jdGxfbmFtZSA9IDAsIAorCQkucHJvY25hbWUgPSAiIiwgCisJCS5tb2RlID0gMDU1NSwgCisJCS5jaGlsZCA9IGRuX2Rldl9zeXNjdGwuZG5fZGV2X3ZhcnMKKwl9LCB7MH19LAorCXt7CisJCS5jdGxfbmFtZSA9IE5FVF9ERUNORVRfQ09ORiwKKwkJLnByb2NuYW1lID0gImNvbmYiLCAKKwkJLm1vZGUgPSAwNTU1LCAKKwkJLmNoaWxkID0gZG5fZGV2X3N5c2N0bC5kbl9kZXZfZGV2CisJfSwgezB9fSwKKwl7eworCQkuY3RsX25hbWUgPSBORVRfREVDTkVULCAKKwkJLnByb2NuYW1lID0gImRlY25ldCIsIAorCQkubW9kZSA9IDA1NTUsIAorCQkuY2hpbGQgPSBkbl9kZXZfc3lzY3RsLmRuX2Rldl9jb25mX2RpcgorCX0sIHswfX0sCisJe3sKKwkJLmN0bF9uYW1lID0gQ1RMX05FVCwgCisJCS5wcm9jbmFtZSA9ICJuZXQiLCAKKwkJLm1vZGUgPSAwNTU1LCAKKwkJLmNoaWxkID0gZG5fZGV2X3N5c2N0bC5kbl9kZXZfcHJvdG9fZGlyCisJfSwgezB9fQorfTsKKworc3RhdGljIHZvaWQgZG5fZGV2X3N5c2N0bF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZG5fZGV2X3Bhcm1zICpwYXJtcykKK3sKKwlzdHJ1Y3QgZG5fZGV2X3N5c2N0bF90YWJsZSAqdDsKKwlpbnQgaTsKKworCXQgPSBrbWFsbG9jKHNpemVvZigqdCksIEdGUF9LRVJORUwpOworCWlmICh0ID09IE5VTEwpCisJCXJldHVybjsKKworCW1lbWNweSh0LCAmZG5fZGV2X3N5c2N0bCwgc2l6ZW9mKCp0KSk7CisKKwlmb3IoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHQtPmRuX2Rldl92YXJzKSAtIDE7IGkrKykgeworCQlsb25nIG9mZnNldCA9IChsb25nKXQtPmRuX2Rldl92YXJzW2ldLmRhdGE7CisJCXQtPmRuX2Rldl92YXJzW2ldLmRhdGEgPSAoKGNoYXIgKilwYXJtcykgKyBvZmZzZXQ7CisJCXQtPmRuX2Rldl92YXJzW2ldLmRlID0gTlVMTDsKKwl9CisKKwlpZiAoZGV2KSB7CisJCXQtPmRuX2Rldl9kZXZbMF0ucHJvY25hbWUgPSBkZXYtPm5hbWU7CisJCXQtPmRuX2Rldl9kZXZbMF0uY3RsX25hbWUgPSBkZXYtPmlmaW5kZXg7CisJfSBlbHNlIHsKKwkJdC0+ZG5fZGV2X2RldlswXS5wcm9jbmFtZSA9IHBhcm1zLT5uYW1lOworCQl0LT5kbl9kZXZfZGV2WzBdLmN0bF9uYW1lID0gcGFybXMtPmN0bF9uYW1lOworCX0KKworCXQtPmRuX2Rldl9kZXZbMF0uY2hpbGQgPSB0LT5kbl9kZXZfdmFyczsKKwl0LT5kbl9kZXZfZGV2WzBdLmRlID0gTlVMTDsKKwl0LT5kbl9kZXZfY29uZl9kaXJbMF0uY2hpbGQgPSB0LT5kbl9kZXZfZGV2OworCXQtPmRuX2Rldl9jb25mX2RpclswXS5kZSA9IE5VTEw7CisJdC0+ZG5fZGV2X3Byb3RvX2RpclswXS5jaGlsZCA9IHQtPmRuX2Rldl9jb25mX2RpcjsKKwl0LT5kbl9kZXZfcHJvdG9fZGlyWzBdLmRlID0gTlVMTDsKKwl0LT5kbl9kZXZfcm9vdF9kaXJbMF0uY2hpbGQgPSB0LT5kbl9kZXZfcHJvdG9fZGlyOworCXQtPmRuX2Rldl9yb290X2RpclswXS5kZSA9IE5VTEw7CisJdC0+ZG5fZGV2X3ZhcnNbMF0uZXh0cmExID0gKHZvaWQgKilkZXY7CisKKwl0LT5zeXNjdGxfaGVhZGVyID0gcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHQtPmRuX2Rldl9yb290X2RpciwgMCk7CisJaWYgKHQtPnN5c2N0bF9oZWFkZXIgPT0gTlVMTCkKKwkJa2ZyZWUodCk7CisJZWxzZQorCQlwYXJtcy0+c3lzY3RsID0gdDsKK30KKworc3RhdGljIHZvaWQgZG5fZGV2X3N5c2N0bF91bnJlZ2lzdGVyKHN0cnVjdCBkbl9kZXZfcGFybXMgKnBhcm1zKQoreworCWlmIChwYXJtcy0+c3lzY3RsKSB7CisJCXN0cnVjdCBkbl9kZXZfc3lzY3RsX3RhYmxlICp0ID0gcGFybXMtPnN5c2N0bDsKKwkJcGFybXMtPnN5c2N0bCA9IE5VTEw7CisJCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHQtPnN5c2N0bF9oZWFkZXIpOworCQlrZnJlZSh0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZG5fZm9yd2FyZGluZ19wcm9jKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgCisJCQkJc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCXZvaWQgX191c2VyICpidWZmZXIsCisJCQkJc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisjaWZkZWYgQ09ORklHX0RFQ05FVF9ST1VURVIKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdGFibGUtPmV4dHJhMTsKKwlzdHJ1Y3QgZG5fZGV2ICpkbl9kYjsKKwlpbnQgZXJyOworCWludCB0bXAsIG9sZDsKKworCWlmICh0YWJsZS0+ZXh0cmExID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJZG5fZGIgPSBkZXYtPmRuX3B0cjsKKwlvbGQgPSBkbl9kYi0+cGFybXMuZm9yd2FyZGluZzsKKworCWVyciA9IHByb2NfZG9pbnR2ZWModGFibGUsIHdyaXRlLCBmaWxlcCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKworCWlmICgoZXJyID49IDApICYmIHdyaXRlKSB7CisJCWlmIChkbl9kYi0+cGFybXMuZm9yd2FyZGluZyA8IDApCisJCQlkbl9kYi0+cGFybXMuZm9yd2FyZGluZyA9IDA7CisJCWlmIChkbl9kYi0+cGFybXMuZm9yd2FyZGluZyA+IDIpCisJCQlkbl9kYi0+cGFybXMuZm9yd2FyZGluZyA9IDI7CisJCS8qCisJCSAqIFdoYXQgYW4gdWdseSBoYWNrIHRoaXMgaXMuLi4gaXRzIHdvcmtzLCBqdXN0LiBJdAorCQkgKiB3b3VsZCBiZSBuaWNlIGlmIHN5c2N0bC9wcm9jIHdlcmUganVzdCB0aGF0IGxpdHRsZQorCQkgKiBiaXQgbW9yZSBmbGV4aWJsZSBzbyBJIGRvbid0IGhhdmUgdG8gd3JpdGUgYSBzcGVjaWFsCisJCSAqIHJvdXRpbmUsIG9yIHN1ZmZlciBoYWNrcyBsaWtlIHRoaXMgLSBTSlcKKwkJICovCisJCXRtcCA9IGRuX2RiLT5wYXJtcy5mb3J3YXJkaW5nOworCQlkbl9kYi0+cGFybXMuZm9yd2FyZGluZyA9IG9sZDsKKwkJaWYgKGRuX2RiLT5wYXJtcy5kb3duKQorCQkJZG5fZGItPnBhcm1zLmRvd24oZGV2KTsKKwkJZG5fZGItPnBhcm1zLmZvcndhcmRpbmcgPSB0bXA7CisJCWlmIChkbl9kYi0+cGFybXMudXApCisJCQlkbl9kYi0+cGFybXMudXAoZGV2KTsKKwl9CisKKwlyZXR1cm4gZXJyOworI2Vsc2UKKwlyZXR1cm4gLUVJTlZBTDsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IGRuX2ZvcndhcmRpbmdfc3lzY3RsKGN0bF90YWJsZSAqdGFibGUsIGludCBfX3VzZXIgKm5hbWUsIGludCBubGVuLAorCQkJdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKKwkJCXZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4sCisJCQl2b2lkICoqY29udGV4dCkKK3sKKyNpZmRlZiBDT05GSUdfREVDTkVUX1JPVVRFUgorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB0YWJsZS0+ZXh0cmExOworCXN0cnVjdCBkbl9kZXYgKmRuX2RiOworCWludCB2YWx1ZTsKKworCWlmICh0YWJsZS0+ZXh0cmExID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJZG5fZGIgPSBkZXYtPmRuX3B0cjsKKworCWlmIChuZXd2YWwgJiYgbmV3bGVuKSB7CisJCWlmIChuZXdsZW4gIT0gc2l6ZW9mKGludCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoZ2V0X3VzZXIodmFsdWUsIChpbnQgX191c2VyICopbmV3dmFsKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsdWUgPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICh2YWx1ZSA+IDIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoZG5fZGItPnBhcm1zLmRvd24pCisJCQlkbl9kYi0+cGFybXMuZG93bihkZXYpOworCQlkbl9kYi0+cGFybXMuZm9yd2FyZGluZyA9IHZhbHVlOworCQlpZiAoZG5fZGItPnBhcm1zLnVwKQorCQkJZG5fZGItPnBhcm1zLnVwKGRldik7CisJfQorCisJcmV0dXJuIDA7CisjZWxzZQorCXJldHVybiAtRUlOVkFMOworI2VuZGlmCit9CisKKyNlbHNlIC8qIENPTkZJR19TWVNDVEwgKi8KK3N0YXRpYyB2b2lkIGRuX2Rldl9zeXNjdGxfdW5yZWdpc3RlcihzdHJ1Y3QgZG5fZGV2X3Bhcm1zICpwYXJtcykKK3sKK30KK3N0YXRpYyB2b2lkIGRuX2Rldl9zeXNjdGxfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGRuX2Rldl9wYXJtcyAqcGFybXMpCit7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCisKK3N0YXRpYyBpbmxpbmUgX191MTYgbXR1MmJsa3NpemUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1MzIgYmxrc2l6ZSA9IGRldi0+bXR1OworCWlmIChibGtzaXplID4gMHhmZmZmKQorCQlibGtzaXplID0gMHhmZmZmOworCisJaWYgKGRldi0+dHlwZSA9PSBBUlBIUkRfRVRIRVIgfHwKKwkgICAgZGV2LT50eXBlID09IEFSUEhSRF9QUFAgfHwKKwkgICAgZGV2LT50eXBlID09IEFSUEhSRF9JUEdSRSB8fAorCSAgICBkZXYtPnR5cGUgPT0gQVJQSFJEX0xPT1BCQUNLKQorCQlibGtzaXplIC09IDI7CisKKwlyZXR1cm4gKF9fdTE2KWJsa3NpemU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG5faWZhZGRyICpkbl9kZXZfYWxsb2NfaWZhKHZvaWQpCit7CisJc3RydWN0IGRuX2lmYWRkciAqaWZhOworCisJaWZhID0ga21hbGxvYyhzaXplb2YoKmlmYSksIEdGUF9LRVJORUwpOworCisJaWYgKGlmYSkgeworCQltZW1zZXQoaWZhLCAwLCBzaXplb2YoKmlmYSkpOworCX0KKworCXJldHVybiBpZmE7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgZG5fZGV2X2ZyZWVfaWZhKHN0cnVjdCBkbl9pZmFkZHIgKmlmYSkKK3sKKwlrZnJlZShpZmEpOworfQorCitzdGF0aWMgdm9pZCBkbl9kZXZfZGVsX2lmYShzdHJ1Y3QgZG5fZGV2ICpkbl9kYiwgc3RydWN0IGRuX2lmYWRkciAqKmlmYXAsIGludCBkZXN0cm95KQoreworCXN0cnVjdCBkbl9pZmFkZHIgKmlmYTEgPSAqaWZhcDsKKwl1bnNpZ25lZCBjaGFyIG1hY19hZGRyWzZdOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkbl9kYi0+ZGV2OworCisJQVNTRVJUX1JUTkwoKTsKKworCSppZmFwID0gaWZhMS0+aWZhX25leHQ7CisKKwlpZiAoZG5fZGItPmRldi0+dHlwZSA9PSBBUlBIUkRfRVRIRVIpIHsKKwkJaWYgKGlmYTEtPmlmYV9sb2NhbCAhPSBkbl9odG9ucyhkbl9ldGgyZG4oZGV2LT5kZXZfYWRkcikpKSB7CisJCQlkbl9kbjJldGgobWFjX2FkZHIsIGlmYTEtPmlmYV9sb2NhbCk7CisJCQlkZXZfbWNfZGVsZXRlKGRldiwgbWFjX2FkZHIsIEVUSF9BTEVOLCAwKTsKKwkJfQorCX0KKworCXJ0bXNnX2lmYShSVE1fREVMQUREUiwgaWZhMSk7CisJbm90aWZpZXJfY2FsbF9jaGFpbigmZG5hZGRyX2NoYWluLCBORVRERVZfRE9XTiwgaWZhMSk7CisJaWYgKGRlc3Ryb3kpIHsKKwkJZG5fZGV2X2ZyZWVfaWZhKGlmYTEpOworCisJCWlmIChkbl9kYi0+aWZhX2xpc3QgPT0gTlVMTCkKKwkJCWRuX2Rldl9kZWxldGUoZG5fZGItPmRldik7CisJfQorfQorCitzdGF0aWMgaW50IGRuX2Rldl9pbnNlcnRfaWZhKHN0cnVjdCBkbl9kZXYgKmRuX2RiLCBzdHJ1Y3QgZG5faWZhZGRyICppZmEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRuX2RiLT5kZXY7CisJc3RydWN0IGRuX2lmYWRkciAqaWZhMTsKKwl1bnNpZ25lZCBjaGFyIG1hY19hZGRyWzZdOworCisJQVNTRVJUX1JUTkwoKTsKKworCS8qIENoZWNrIGZvciBkdXBsaWNhdGVzICovCQorCWZvcihpZmExID0gZG5fZGItPmlmYV9saXN0OyBpZmExOyBpZmExID0gaWZhMS0+aWZhX25leHQpIHsKKwkJaWYgKGlmYTEtPmlmYV9sb2NhbCA9PSBpZmEtPmlmYV9sb2NhbCkKKwkJCXJldHVybiAtRUVYSVNUOworCX0KKworCWlmIChkZXYtPnR5cGUgPT0gQVJQSFJEX0VUSEVSKSB7CisJCWlmIChpZmEtPmlmYV9sb2NhbCAhPSBkbl9odG9ucyhkbl9ldGgyZG4oZGV2LT5kZXZfYWRkcikpKSB7CisJCQlkbl9kbjJldGgobWFjX2FkZHIsIGlmYS0+aWZhX2xvY2FsKTsKKwkJCWRldl9tY19hZGQoZGV2LCBtYWNfYWRkciwgRVRIX0FMRU4sIDApOworCQkJZGV2X21jX3VwbG9hZChkZXYpOworCQl9CisJfQorCisJaWZhLT5pZmFfbmV4dCA9IGRuX2RiLT5pZmFfbGlzdDsKKwlkbl9kYi0+aWZhX2xpc3QgPSBpZmE7CisKKwlydG1zZ19pZmEoUlRNX05FV0FERFIsIGlmYSk7CisJbm90aWZpZXJfY2FsbF9jaGFpbigmZG5hZGRyX2NoYWluLCBORVRERVZfVVAsIGlmYSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkbl9kZXZfc2V0X2lmYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZG5faWZhZGRyICppZmEpCit7CisJc3RydWN0IGRuX2RldiAqZG5fZGIgPSBkZXYtPmRuX3B0cjsKKwlpbnQgcnY7CisKKwlpZiAoZG5fZGIgPT0gTlVMTCkgeworCQlpbnQgZXJyOworCQlkbl9kYiA9IGRuX2Rldl9jcmVhdGUoZGV2LCAmZXJyKTsKKwkJaWYgKGRuX2RiID09IE5VTEwpCisJCQlyZXR1cm4gZXJyOworCX0KKworCWlmYS0+aWZhX2RldiA9IGRuX2RiOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spCisJCWlmYS0+aWZhX3Njb3BlID0gUlRfU0NPUEVfSE9TVDsKKworCXJ2ID0gZG5fZGV2X2luc2VydF9pZmEoZG5fZGIsIGlmYSk7CisJaWYgKHJ2KQorCQlkbl9kZXZfZnJlZV9pZmEoaWZhKTsKKwlyZXR1cm4gcnY7Cit9CisKKworaW50IGRuX2Rldl9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCWNoYXIgYnVmZmVyW0ROX0lGUkVRX1NJWkVdOworCXN0cnVjdCBpZnJlcSAqaWZyID0gKHN0cnVjdCBpZnJlcSAqKWJ1ZmZlcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfZG4gKnNkbiA9IChzdHJ1Y3Qgc29ja2FkZHJfZG4gKikmaWZyLT5pZnJfYWRkcjsKKwlzdHJ1Y3QgZG5fZGV2ICpkbl9kYjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBkbl9pZmFkZHIgKmlmYSA9IE5VTEwsICoqaWZhcCA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoaWZyLCBhcmcsIEROX0lGUkVRX1NJWkUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZnItPmlmcl9uYW1lW0lGTkFNU0laLTFdID0gMDsKKworI2lmZGVmIENPTkZJR19LTU9ECisJZGV2X2xvYWQoaWZyLT5pZnJfbmFtZSk7CisjZW5kaWYKKworCXN3aXRjaChjbWQpIHsKKwkJY2FzZSBTSU9DR0lGQUREUjoKKwkJCWJyZWFrOworCQljYXNlIFNJT0NTSUZBRERSOgorCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJCXJldHVybiAtRUFDQ0VTOworCQkJaWYgKHNkbi0+c2RuX2ZhbWlseSAhPSBBRl9ERUNuZXQpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJ0bmxfbG9jaygpOworCisJaWYgKChkZXYgPSBfX2Rldl9nZXRfYnlfbmFtZShpZnItPmlmcl9uYW1lKSkgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKChkbl9kYiA9IGRldi0+ZG5fcHRyKSAhPSBOVUxMKSB7CisJCWZvciAoaWZhcCA9ICZkbl9kYi0+aWZhX2xpc3Q7IChpZmE9KmlmYXApICE9IE5VTEw7IGlmYXAgPSAmaWZhLT5pZmFfbmV4dCkKKwkJCWlmIChzdHJjbXAoaWZyLT5pZnJfbmFtZSwgaWZhLT5pZmFfbGFiZWwpID09IDApCisJCQkJYnJlYWs7CisJfQorCisJaWYgKGlmYSA9PSBOVUxMICYmIGNtZCAhPSBTSU9DU0lGQUREUikgeworCQlyZXQgPSAtRUFERFJOT1RBVkFJTDsKKwkJZ290byBkb25lOworCX0KKworCXN3aXRjaChjbWQpIHsKKwkJY2FzZSBTSU9DR0lGQUREUjoKKwkJCSooKGRuX2FkZHJlc3MgKilzZG4tPnNkbl9ub2RlYWRkcikgPSBpZmEtPmlmYV9sb2NhbDsKKwkJCWdvdG8gcmFyb2s7CisKKwkJY2FzZSBTSU9DU0lGQUREUjoKKwkJCWlmICghaWZhKSB7CisJCQkJaWYgKChpZmEgPSBkbl9kZXZfYWxsb2NfaWZhKCkpID09IE5VTEwpIHsKKwkJCQkJcmV0ID0gLUVOT0JVRlM7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQltZW1jcHkoaWZhLT5pZmFfbGFiZWwsIGRldi0+bmFtZSwgSUZOQU1TSVopOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoaWZhLT5pZmFfbG9jYWwgPT0gZG5fc2FkZHIyZG4oc2RuKSkKKwkJCQkJYnJlYWs7CisJCQkJZG5fZGV2X2RlbF9pZmEoZG5fZGIsIGlmYXAsIDApOworCQkJfQorCisJCQlpZmEtPmlmYV9sb2NhbCA9IGlmYS0+aWZhX2FkZHJlc3MgPSBkbl9zYWRkcjJkbihzZG4pOworCisJCQlyZXQgPSBkbl9kZXZfc2V0X2lmYShkZXYsIGlmYSk7CisJfQorZG9uZToKKwlydG5sX3VubG9jaygpOworCisJcmV0dXJuIHJldDsKK3Jhcm9rOgorCWlmIChjb3B5X3RvX3VzZXIoYXJnLCBpZnIsIEROX0lGUkVRX1NJWkUpKQorCQlyZXQgPSAtRUZBVUxUOworCWdvdG8gZG9uZTsKK30KKworc3RydWN0IG5ldF9kZXZpY2UgKmRuX2Rldl9nZXRfZGVmYXVsdCh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJcmVhZF9sb2NrKCZkbmRldl9sb2NrKTsKKwlkZXYgPSBkZWNuZXRfZGVmYXVsdF9kZXZpY2U7CisJaWYgKGRldikgeworCQlpZiAoZGV2LT5kbl9wdHIpCisJCQlkZXZfaG9sZChkZXYpOworCQllbHNlCisJCQlkZXYgPSBOVUxMOworCX0KKwlyZWFkX3VubG9jaygmZG5kZXZfbG9jayk7CisJcmV0dXJuIGRldjsKK30KKworaW50IGRuX2Rldl9zZXRfZGVmYXVsdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZm9yY2UpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm9sZCA9IE5VTEw7CisJaW50IHJ2ID0gLUVCVVNZOworCWlmICghZGV2LT5kbl9wdHIpCisJCXJldHVybiAtRU5PREVWOworCXdyaXRlX2xvY2soJmRuZGV2X2xvY2spOworCWlmIChmb3JjZSB8fCBkZWNuZXRfZGVmYXVsdF9kZXZpY2UgPT0gTlVMTCkgeworCQlvbGQgPSBkZWNuZXRfZGVmYXVsdF9kZXZpY2U7CisJCWRlY25ldF9kZWZhdWx0X2RldmljZSA9IGRldjsKKwkJcnYgPSAwOworCX0KKwl3cml0ZV91bmxvY2soJmRuZGV2X2xvY2spOworCWlmIChvbGQpCisJCWRldl9wdXQoZGV2KTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyB2b2lkIGRuX2Rldl9jaGVja19kZWZhdWx0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd3JpdGVfbG9jaygmZG5kZXZfbG9jayk7CisJaWYgKGRldiA9PSBkZWNuZXRfZGVmYXVsdF9kZXZpY2UpIHsKKwkJZGVjbmV0X2RlZmF1bHRfZGV2aWNlID0gTlVMTDsKKwl9IGVsc2UgeworCQlkZXYgPSBOVUxMOworCX0KKwl3cml0ZV91bmxvY2soJmRuZGV2X2xvY2spOworCWlmIChkZXYpCisJCWRldl9wdXQoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBkbl9kZXYgKmRuX2Rldl9ieV9pbmRleChpbnQgaWZpbmRleCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBkbl9kZXYgKmRuX2RldiA9IE5VTEw7CisJZGV2ID0gZGV2X2dldF9ieV9pbmRleChpZmluZGV4KTsKKwlpZiAoZGV2KSB7CisJCWRuX2RldiA9IGRldi0+ZG5fcHRyOworCQlkZXZfcHV0KGRldik7CisJfQorCisJcmV0dXJuIGRuX2RldjsKK30KKworc3RhdGljIGludCBkbl9kZXZfcnRtX2RlbGFkZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcnRhdHRyICoqcnRhID0gYXJnOworCXN0cnVjdCBkbl9kZXYgKmRuX2RiOworCXN0cnVjdCBpZmFkZHJtc2cgKmlmbSA9IE5MTVNHX0RBVEEobmxoKTsKKwlzdHJ1Y3QgZG5faWZhZGRyICppZmEsICoqaWZhcDsKKworCWlmICgoZG5fZGIgPSBkbl9kZXZfYnlfaW5kZXgoaWZtLT5pZmFfaW5kZXgpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisKKwlmb3IoaWZhcCA9ICZkbl9kYi0+aWZhX2xpc3Q7IChpZmE9KmlmYXApICE9IE5VTEw7IGlmYXAgPSAmaWZhLT5pZmFfbmV4dCkgeworCQl2b2lkICp0bXAgPSBydGFbSUZBX0xPQ0FMLTFdOworCQlpZiAoKHRtcCAmJiBtZW1jbXAoUlRBX0RBVEEodG1wKSwgJmlmYS0+aWZhX2xvY2FsLCAyKSkgfHwKKwkJICAgIChydGFbSUZBX0xBQkVMLTFdICYmIHJ0YXR0cl9zdHJjbXAocnRhW0lGQV9MQUJFTC0xXSwgaWZhLT5pZmFfbGFiZWwpKSkKKwkJCWNvbnRpbnVlOworCisJCWRuX2Rldl9kZWxfaWZhKGRuX2RiLCBpZmFwLCAxKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworfQorCitzdGF0aWMgaW50IGRuX2Rldl9ydG1fbmV3YWRkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBydGF0dHIgKipydGEgPSBhcmc7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZG5fZGV2ICpkbl9kYjsKKwlzdHJ1Y3QgaWZhZGRybXNnICppZm0gPSBOTE1TR19EQVRBKG5saCk7CisJc3RydWN0IGRuX2lmYWRkciAqaWZhOworCWludCBydjsKKworCWlmIChydGFbSUZBX0xPQ0FMLTFdID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChkZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgoaWZtLT5pZmFfaW5kZXgpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICgoZG5fZGIgPSBkZXYtPmRuX3B0cikgPT0gTlVMTCkgeworCQlpbnQgZXJyOworCQlkbl9kYiA9IGRuX2Rldl9jcmVhdGUoZGV2LCAmZXJyKTsKKwkJaWYgKCFkbl9kYikKKwkJCXJldHVybiBlcnI7CisJfQorCQorCWlmICgoaWZhID0gZG5fZGV2X2FsbG9jX2lmYSgpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwlpZiAoIXJ0YVtJRkFfQUREUkVTUyAtIDFdKQorCQlydGFbSUZBX0FERFJFU1MgLSAxXSA9IHJ0YVtJRkFfTE9DQUwgLSAxXTsKKwltZW1jcHkoJmlmYS0+aWZhX2xvY2FsLCBSVEFfREFUQShydGFbSUZBX0xPQ0FMLTFdKSwgMik7CisJbWVtY3B5KCZpZmEtPmlmYV9hZGRyZXNzLCBSVEFfREFUQShydGFbSUZBX0FERFJFU1MtMV0pLCAyKTsKKwlpZmEtPmlmYV9mbGFncyA9IGlmbS0+aWZhX2ZsYWdzOworCWlmYS0+aWZhX3Njb3BlID0gaWZtLT5pZmFfc2NvcGU7CisJaWZhLT5pZmFfZGV2ID0gZG5fZGI7CisJaWYgKHJ0YVtJRkFfTEFCRUwtMV0pCisJCXJ0YXR0cl9zdHJsY3B5KGlmYS0+aWZhX2xhYmVsLCBydGFbSUZBX0xBQkVMLTFdLCBJRk5BTVNJWik7CisJZWxzZQorCQltZW1jcHkoaWZhLT5pZmFfbGFiZWwsIGRldi0+bmFtZSwgSUZOQU1TSVopOworCisJcnYgPSBkbl9kZXZfaW5zZXJ0X2lmYShkbl9kYiwgaWZhKTsKKwlpZiAocnYpCisJCWRuX2Rldl9mcmVlX2lmYShpZmEpOworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCBkbl9kZXZfZmlsbF9pZmFkZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGRuX2lmYWRkciAqaWZhLAorCQkJCXUzMiBwaWQsIHUzMiBzZXEsIGludCBldmVudCkKK3sKKwlzdHJ1Y3QgaWZhZGRybXNnICppZm07CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKworCW5saCA9IE5MTVNHX1BVVChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCppZm0pKTsKKwlpZm0gPSBOTE1TR19EQVRBKG5saCk7CisKKwlpZm0tPmlmYV9mYW1pbHkgPSBBRl9ERUNuZXQ7CisJaWZtLT5pZmFfcHJlZml4bGVuID0gMTY7CisJaWZtLT5pZmFfZmxhZ3MgPSBpZmEtPmlmYV9mbGFncyB8IElGQV9GX1BFUk1BTkVOVDsKKwlpZm0tPmlmYV9zY29wZSA9IGlmYS0+aWZhX3Njb3BlOworCWlmbS0+aWZhX2luZGV4ID0gaWZhLT5pZmFfZGV2LT5kZXYtPmlmaW5kZXg7CisJaWYgKGlmYS0+aWZhX2FkZHJlc3MpCisJCVJUQV9QVVQoc2tiLCBJRkFfQUREUkVTUywgMiwgJmlmYS0+aWZhX2FkZHJlc3MpOworCWlmIChpZmEtPmlmYV9sb2NhbCkKKwkJUlRBX1BVVChza2IsIElGQV9MT0NBTCwgMiwgJmlmYS0+aWZhX2xvY2FsKTsKKwlpZiAoaWZhLT5pZmFfbGFiZWxbMF0pCisJCVJUQV9QVVQoc2tiLCBJRkFfTEFCRUwsIElGTkFNU0laLCAmaWZhLT5pZmFfbGFiZWwpOworCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlyZXR1cm4gc2tiLT5sZW47CisKK25sbXNnX2ZhaWx1cmU6CitydGF0dHJfZmFpbHVyZToKKyAgICAgICAgc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKyAgICAgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBydG1zZ19pZmEoaW50IGV2ZW50LCBzdHJ1Y3QgZG5faWZhZGRyICppZmEpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgc2l6ZSA9IE5MTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3QgaWZhZGRybXNnKSsxMjgpOworCisJc2tiID0gYWxsb2Nfc2tiKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghc2tiKSB7CisJCW5ldGxpbmtfc2V0X2VycihydG5sLCAwLCBSVE1HUlBfREVDbmV0X0lGQUREUiwgRU5PQlVGUyk7CisJCXJldHVybjsKKwl9CisJaWYgKGRuX2Rldl9maWxsX2lmYWRkcihza2IsIGlmYSwgMCwgMCwgZXZlbnQpIDwgMCkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJbmV0bGlua19zZXRfZXJyKHJ0bmwsIDAsIFJUTUdSUF9ERUNuZXRfSUZBRERSLCBFSU5WQUwpOworCQlyZXR1cm47CisJfQorCU5FVExJTktfQ0Ioc2tiKS5kc3RfZ3JvdXBzID0gUlRNR1JQX0RFQ25ldF9JRkFERFI7CisJbmV0bGlua19icm9hZGNhc3QocnRubCwgc2tiLCAwLCBSVE1HUlBfREVDbmV0X0lGQUREUiwgR0ZQX0tFUk5FTCk7Cit9CisKK3N0YXRpYyBpbnQgZG5fZGV2X2R1bXBfaWZhZGRyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlpbnQgaWR4LCBkbl9pZHg7CisJaW50IHNfaWR4LCBzX2RuX2lkeDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBkbl9kZXYgKmRuX2RiOworCXN0cnVjdCBkbl9pZmFkZHIgKmlmYTsKKworCXNfaWR4ID0gY2ItPmFyZ3NbMF07CisJc19kbl9pZHggPSBkbl9pZHggPSBjYi0+YXJnc1sxXTsKKwlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOworCWZvcihkZXYgPSBkZXZfYmFzZSwgaWR4ID0gMDsgZGV2OyBkZXYgPSBkZXYtPm5leHQsIGlkeCsrKSB7CisJCWlmIChpZHggPCBzX2lkeCkKKwkJCWNvbnRpbnVlOworCQlpZiAoaWR4ID4gc19pZHgpCisJCQlzX2RuX2lkeCA9IDA7CisJCWlmICgoZG5fZGIgPSBkZXYtPmRuX3B0cikgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCWZvcihpZmEgPSBkbl9kYi0+aWZhX2xpc3QsIGRuX2lkeCA9IDA7IGlmYTsgaWZhID0gaWZhLT5pZmFfbmV4dCwgZG5faWR4KyspIHsKKwkJCWlmIChkbl9pZHggPCBzX2RuX2lkeCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGRuX2Rldl9maWxsX2lmYWRkcihza2IsIGlmYSwKKwkJCQkJICAgICAgIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLAorCQkJCQkgICAgICAgY2ItPm5saC0+bmxtc2dfc2VxLAorCQkJCQkgICAgICAgUlRNX05FV0FERFIpIDw9IDApCisJCQkJZ290byBkb25lOworCQl9CisJfQorZG9uZToKKwlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7CisJY2ItPmFyZ3NbMF0gPSBpZHg7CisJY2ItPmFyZ3NbMV0gPSBkbl9pZHg7CisKKwlyZXR1cm4gc2tiLT5sZW47Cit9CisKK3N0YXRpYyBpbnQgZG5fZGV2X2dldF9maXJzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBkbl9hZGRyZXNzICphZGRyKQoreworCXN0cnVjdCBkbl9kZXYgKmRuX2RiID0gKHN0cnVjdCBkbl9kZXYgKilkZXYtPmRuX3B0cjsKKwlzdHJ1Y3QgZG5faWZhZGRyICppZmE7CisJaW50IHJ2ID0gLUVOT0RFVjsKKwlpZiAoZG5fZGIgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJaWZhID0gZG5fZGItPmlmYV9saXN0OworCWlmIChpZmEgIT0gTlVMTCkgeworCQkqYWRkciA9IGlmYS0+aWZhX2xvY2FsOworCQlydiA9IDA7CisJfQorb3V0OgorCXJldHVybiBydjsKK30KKworLyogCisgKiBGaW5kIGEgZGVmYXVsdCBhZGRyZXNzIHRvIGJpbmQgdG8uCisgKgorICogVGhpcyBpcyBvbmUgb2YgdGhvc2UgYXJlYXMgd2hlcmUgdGhlIGluaXRpYWwgVk1TIGNvbmNlcHRzIGRvbid0IHJlYWxseQorICogbWFwIG9udG8gdGhlIExpbnV4IGNvbmNlcHRzLCBhbmQgc2luY2Ugd2UgaW50cm9kdWNlZCBtdWx0aXBsZSBhZGRyZXNzZXMKKyAqIHBlciBpbnRlcmZhY2Ugd2UgaGF2ZSB0byBjb3BlIHdpdGggc2xpZ2h0bHkgb2RkIHdheXMgb2YgZmluZGluZyBvdXQgd2hhdAorICogIm91ciBhZGRyZXNzIiByZWFsbHkgaXMuIE1vc3RseSBpdCdzIG5vdCBhIHByb2JsZW07IGZvciB0aGlzIHdlIGp1c3QgZ3Vlc3MKKyAqIGEgc2Vuc2libGUgZGVmYXVsdC4gRXZlbnR1YWxseSB0aGUgcm91dGluZyBjb2RlIHdpbGwgdGFrZSBjYXJlIG9mIGFsbCB0aGUKKyAqIG5hc3RpZXMgZm9yIHVzIEkgaG9wZS4KKyAqLworaW50IGRuX2Rldl9iaW5kX2RlZmF1bHQoZG5fYWRkcmVzcyAqYWRkcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBydjsKKwlkZXYgPSBkbl9kZXZfZ2V0X2RlZmF1bHQoKTsKK2xhc3RfY2hhbmNlOgorCWlmIChkZXYpIHsKKwkJcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKwkJcnYgPSBkbl9kZXZfZ2V0X2ZpcnN0KGRldiwgYWRkcik7CisJCXJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKwkJZGV2X3B1dChkZXYpOworCQlpZiAocnYgPT0gMCB8fCBkZXYgPT0gJmxvb3BiYWNrX2RldikKKwkJCXJldHVybiBydjsKKwl9CisJZGV2ID0gJmxvb3BiYWNrX2RldjsKKwlkZXZfaG9sZChkZXYpOworCWdvdG8gbGFzdF9jaGFuY2U7Cit9CisKK3N0YXRpYyB2b2lkIGRuX3NlbmRfZW5kbm9kZV9oZWxsbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZG5faWZhZGRyICppZmEpCit7CisgICAgICAgIHN0cnVjdCBlbmRub2RlX2hlbGxvX21lc3NhZ2UgKm1zZzsKKyAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGludCAqcGt0bGVuOworCXN0cnVjdCBkbl9kZXYgKmRuX2RiID0gKHN0cnVjdCBkbl9kZXYgKilkZXYtPmRuX3B0cjsKKworICAgICAgICBpZiAoKHNrYiA9IGRuX2FsbG9jX3NrYihOVUxMLCBzaXplb2YoKm1zZyksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQlyZXR1cm47CisKKyAgICAgICAgc2tiLT5kZXYgPSBkZXY7CisKKyAgICAgICAgbXNnID0gKHN0cnVjdCBlbmRub2RlX2hlbGxvX21lc3NhZ2UgKilza2JfcHV0KHNrYixzaXplb2YoKm1zZykpOworCisgICAgICAgIG1zZy0+bXNnZmxnICA9IDB4MEQ7CisgICAgICAgIG1lbWNweShtc2ctPnRpdmVyLCBkbl9lY29fdmVyc2lvbiwgMyk7CisJZG5fZG4yZXRoKG1zZy0+aWQsIGlmYS0+aWZhX2xvY2FsKTsKKyAgICAgICAgbXNnLT5paW5mbyAgID0gRE5fUlRfSU5GT19FTkROOworICAgICAgICBtc2ctPmJsa3NpemUgPSBkbl9odG9ucyhtdHUyYmxrc2l6ZShkZXYpKTsKKyAgICAgICAgbXNnLT5hcmVhICAgID0gMHgwMDsKKyAgICAgICAgbWVtc2V0KG1zZy0+c2VlZCwgMCwgOCk7CisgICAgICAgIG1lbWNweShtc2ctPm5laWdoYm9yLCBkbl9oaW9yZCwgRVRIX0FMRU4pOworCisJaWYgKGRuX2RiLT5yb3V0ZXIpIHsKKwkJc3RydWN0IGRuX25laWdoICpkbiA9IChzdHJ1Y3QgZG5fbmVpZ2ggKilkbl9kYi0+cm91dGVyOworCQlkbl9kbjJldGgobXNnLT5uZWlnaGJvciwgZG4tPmFkZHIpOworCX0KKworICAgICAgICBtc2ctPnRpbWVyICAgPSBkbl9odG9ucygodW5zaWduZWQgc2hvcnQpZG5fZGItPnBhcm1zLnQzKTsKKyAgICAgICAgbXNnLT5tcGQgICAgID0gMHgwMDsKKyAgICAgICAgbXNnLT5kYXRhbGVuID0gMHgwMjsKKyAgICAgICAgbWVtc2V0KG1zZy0+ZGF0YSwgMHhBQSwgMik7CisgICAgICAgIAorICAgICAgICBwa3RsZW4gPSAodW5zaWduZWQgc2hvcnQgKilza2JfcHVzaChza2IsMik7CisgICAgICAgICpwa3RsZW4gPSBkbl9odG9ucyhza2ItPmxlbiAtIDIpOworCisJc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisKKwlkbl9ydF9maW5pc2hfb3V0cHV0KHNrYiwgZG5fcnRfYWxsX3J0X21jYXN0LCBtc2ctPmlkKTsKK30KKworCisjZGVmaW5lIERSREVMQVkgKDUgKiBIWikKKworc3RhdGljIGludCBkbl9hbV9pX2Ffcm91dGVyKHN0cnVjdCBkbl9uZWlnaCAqZG4sIHN0cnVjdCBkbl9kZXYgKmRuX2RiLCBzdHJ1Y3QgZG5faWZhZGRyICppZmEpCit7CisJLyogRmlyc3QgY2hlY2sgdGltZSBzaW5jZSBkZXZpY2Ugd2VudCB1cCAqLworCWlmICgoamlmZmllcyAtIGRuX2RiLT51cHRpbWUpIDwgRFJERUxBWSkKKwkJcmV0dXJuIDA7CisKKwkvKiBJZiB0aGVyZSBpcyBubyByb3V0ZXIsIHRoZW4geWVzLi4uICovCisJaWYgKCFkbl9kYi0+cm91dGVyKQorCQlyZXR1cm4gMTsKKworCS8qIG90aGVyd2lzZSBvbmx5IGlmIHdlIGhhdmUgYSBoaWdoZXIgcHJpb3JpdHkgb3IuLiAqLworCWlmIChkbi0+cHJpb3JpdHkgPCBkbl9kYi0+cGFybXMucHJpb3JpdHkpCisJCXJldHVybiAxOworCisJLyogaWYgd2UgaGF2ZSBlcXVhbCBwcmlvcml0eSBhbmQgYSBoaWdoZXIgbm9kZSBudW1iZXIgKi8KKwlpZiAoZG4tPnByaW9yaXR5ICE9IGRuX2RiLT5wYXJtcy5wcmlvcml0eSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZG5fbnRvaHMoZG4tPmFkZHIpIDwgZG5fbnRvaHMoaWZhLT5pZmFfbG9jYWwpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkbl9zZW5kX3JvdXRlcl9oZWxsbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZG5faWZhZGRyICppZmEpCit7CisJaW50IG47CisJc3RydWN0IGRuX2RldiAqZG5fZGIgPSBkZXYtPmRuX3B0cjsKKwlzdHJ1Y3QgZG5fbmVpZ2ggKmRuID0gKHN0cnVjdCBkbl9uZWlnaCAqKWRuX2RiLT5yb3V0ZXI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzaXplX3Qgc2l6ZTsKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisJdW5zaWduZWQgY2hhciAqaTEsICppMjsKKwl1bnNpZ25lZCBzaG9ydCAqcGt0bGVuOworCWNoYXIgKnNyYzsKKworCWlmIChtdHUyYmxrc2l6ZShkZXYpIDwgKDI2ICsgNykpCisJCXJldHVybjsKKworCW4gPSBtdHUyYmxrc2l6ZShkZXYpIC0gMjY7CisJbiAvPSA3OworCisJaWYgKG4gPiAzMikKKwkJbiA9IDMyOworCisJc2l6ZSA9IDIgKyAyNiArIDcgKiBuOworCisJaWYgKChza2IgPSBkbl9hbGxvY19za2IoTlVMTCwgc2l6ZSwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJCXJldHVybjsKKworCXNrYi0+ZGV2ID0gZGV2OworCXB0ciA9IHNrYl9wdXQoc2tiLCBzaXplKTsKKworCSpwdHIrKyA9IEROX1JUX1BLVF9DTlRMIHwgRE5fUlRfUEtUX0VSVEg7CisJKnB0cisrID0gMjsgLyogRUNPICovCisJKnB0cisrID0gMDsKKwkqcHRyKysgPSAwOworCWRuX2RuMmV0aChwdHIsIGlmYS0+aWZhX2xvY2FsKTsKKwlzcmMgPSBwdHI7CisJcHRyICs9IEVUSF9BTEVOOworCSpwdHIrKyA9IGRuX2RiLT5wYXJtcy5mb3J3YXJkaW5nID09IDEgPyAKKwkJCUROX1JUX0lORk9fTDFSVCA6IEROX1JUX0lORk9fTDJSVDsKKwkqKCh1bnNpZ25lZCBzaG9ydCAqKXB0cikgPSBkbl9odG9ucyhtdHUyYmxrc2l6ZShkZXYpKTsKKwlwdHIgKz0gMjsKKwkqcHRyKysgPSBkbl9kYi0+cGFybXMucHJpb3JpdHk7IC8qIFByaW9yaXR5ICovIAorCSpwdHIrKyA9IDA7IC8qIEFyZWE6IFJlc2VydmVkICovCisJKigodW5zaWduZWQgc2hvcnQgKilwdHIpID0gZG5faHRvbnMoKHVuc2lnbmVkIHNob3J0KWRuX2RiLT5wYXJtcy50Myk7CisJcHRyICs9IDI7CisJKnB0cisrID0gMDsgLyogTVBEOiBSZXNlcnZlZCAqLworCWkxID0gcHRyKys7CisJbWVtc2V0KHB0ciwgMCwgNyk7IC8qIE5hbWU6IFJlc2VydmVkICovCisJcHRyICs9IDc7CisJaTIgPSBwdHIrKzsKKworCW4gPSBkbl9uZWlnaF9lbGlzdChkZXYsIHB0ciwgbik7CisKKwkqaTIgPSA3ICogbjsKKwkqaTEgPSA4ICsgKmkyOworCisJc2tiX3RyaW0oc2tiLCAoMjcgKyAqaTIpKTsKKworCXBrdGxlbiA9ICh1bnNpZ25lZCBzaG9ydCAqKXNrYl9wdXNoKHNrYiwgMik7CisJKnBrdGxlbiA9IGRuX2h0b25zKHNrYi0+bGVuIC0gMik7CisKKwlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKworCWlmIChkbl9hbV9pX2Ffcm91dGVyKGRuLCBkbl9kYiwgaWZhKSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CisJCWlmIChza2IyKSB7CisJCQlkbl9ydF9maW5pc2hfb3V0cHV0KHNrYjIsIGRuX3J0X2FsbF9lbmRfbWNhc3QsIHNyYyk7CisJCX0KKwl9CisKKwlkbl9ydF9maW5pc2hfb3V0cHV0KHNrYiwgZG5fcnRfYWxsX3J0X21jYXN0LCBzcmMpOworfQorCitzdGF0aWMgdm9pZCBkbl9zZW5kX2JyZF9oZWxsbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZG5faWZhZGRyICppZmEpCit7CisJc3RydWN0IGRuX2RldiAqZG5fZGIgPSAoc3RydWN0IGRuX2RldiAqKWRldi0+ZG5fcHRyOworCisJaWYgKGRuX2RiLT5wYXJtcy5mb3J3YXJkaW5nID09IDApCisJCWRuX3NlbmRfZW5kbm9kZV9oZWxsbyhkZXYsIGlmYSk7CisJZWxzZQorCQlkbl9zZW5kX3JvdXRlcl9oZWxsbyhkZXYsIGlmYSk7Cit9CisKK3N0YXRpYyB2b2lkIGRuX3NlbmRfcHRwX2hlbGxvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBkbl9pZmFkZHIgKmlmYSkKK3sKKwlpbnQgdGRsZW4gPSAxNjsKKwlpbnQgc2l6ZSA9IGRldi0+aGFyZF9oZWFkZXJfbGVuICsgMiArIDQgKyB0ZGxlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZG5fYWxsb2Nfc2tiKE5VTEwsIHNpemUsIEdGUF9BVE9NSUMpOworCWludCBpOworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKwljaGFyIHNyY1tFVEhfQUxFTl07CisKKwlpZiAoc2tiID09IE5VTEwpCisJCXJldHVybiA7CisKKwlza2ItPmRldiA9IGRldjsKKwlza2JfcHVzaChza2IsIGRldi0+aGFyZF9oZWFkZXJfbGVuKTsKKwlwdHIgPSBza2JfcHV0KHNrYiwgMiArIDQgKyB0ZGxlbik7CisKKwkqcHRyKysgPSBETl9SVF9QS1RfSEVMTzsKKwkqKChkbl9hZGRyZXNzICopcHRyKSA9IGlmYS0+aWZhX2xvY2FsOworCXB0ciArPSAyOworCSpwdHIrKyA9IHRkbGVuOworCisJZm9yKGkgPSAwOyBpIDwgdGRsZW47IGkrKykKKwkJKnB0cisrID0gMDI1MjsKKworCWRuX2RuMmV0aChzcmMsIGlmYS0+aWZhX2xvY2FsKTsKKwlkbl9ydF9maW5pc2hfb3V0cHV0KHNrYiwgZG5fcnRfYWxsX3J0X21jYXN0LCBzcmMpOworfQorCitzdGF0aWMgaW50IGRuX2V0aF91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkbl9kZXYgKmRuX2RiID0gZGV2LT5kbl9wdHI7CisKKwlpZiAoZG5fZGItPnBhcm1zLmZvcndhcmRpbmcgPT0gMCkKKwkJZGV2X21jX2FkZChkZXYsIGRuX3J0X2FsbF9lbmRfbWNhc3QsIEVUSF9BTEVOLCAwKTsKKwllbHNlCisJCWRldl9tY19hZGQoZGV2LCBkbl9ydF9hbGxfcnRfbWNhc3QsIEVUSF9BTEVOLCAwKTsKKworCWRldl9tY191cGxvYWQoZGV2KTsKKworCWRuX2RiLT51c2VfbG9uZyA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZG5fZXRoX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZG5fZGV2ICpkbl9kYiA9IGRldi0+ZG5fcHRyOworCisJaWYgKGRuX2RiLT5wYXJtcy5mb3J3YXJkaW5nID09IDApCisJCWRldl9tY19kZWxldGUoZGV2LCBkbl9ydF9hbGxfZW5kX21jYXN0LCBFVEhfQUxFTiwgMCk7CisJZWxzZQorCQlkZXZfbWNfZGVsZXRlKGRldiwgZG5fcnRfYWxsX3J0X21jYXN0LCBFVEhfQUxFTiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRuX2Rldl9zZXRfdGltZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyB2b2lkIGRuX2Rldl90aW1lcl9mdW5jKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilhcmc7CisJc3RydWN0IGRuX2RldiAqZG5fZGIgPSBkZXYtPmRuX3B0cjsKKwlzdHJ1Y3QgZG5faWZhZGRyICppZmE7CisKKwlpZiAoZG5fZGItPnQzIDw9IGRuX2RiLT5wYXJtcy50MikgeworCQlpZiAoZG5fZGItPnBhcm1zLnRpbWVyMykgeworCQkJZm9yKGlmYSA9IGRuX2RiLT5pZmFfbGlzdDsgaWZhOyBpZmEgPSBpZmEtPmlmYV9uZXh0KSB7CisJCQkJaWYgKCEoaWZhLT5pZmFfZmxhZ3MgJiBJRkFfRl9TRUNPTkRBUlkpKQorCQkJCQlkbl9kYi0+cGFybXMudGltZXIzKGRldiwgaWZhKTsKKwkJCX0KKwkJfQorCQlkbl9kYi0+dDMgPSBkbl9kYi0+cGFybXMudDM7CisJfSBlbHNlIHsKKwkJZG5fZGItPnQzIC09IGRuX2RiLT5wYXJtcy50MjsKKwl9CisKKwlkbl9kZXZfc2V0X3RpbWVyKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGRuX2Rldl9zZXRfdGltZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZG5fZGV2ICpkbl9kYiA9IGRldi0+ZG5fcHRyOworCisJaWYgKGRuX2RiLT5wYXJtcy50MiA+IGRuX2RiLT5wYXJtcy50MykKKwkJZG5fZGItPnBhcm1zLnQyID0gZG5fZGItPnBhcm1zLnQzOworCisJZG5fZGItPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJZG5fZGItPnRpbWVyLmZ1bmN0aW9uID0gZG5fZGV2X3RpbWVyX2Z1bmM7CisJZG5fZGItPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKGRuX2RiLT5wYXJtcy50MiAqIEhaKTsKKworCWFkZF90aW1lcigmZG5fZGItPnRpbWVyKTsKK30KKworc3RydWN0IGRuX2RldiAqZG5fZGV2X2NyZWF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmVycikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZG5fZGV2X3Bhcm1zICpwID0gZG5fZGV2X2xpc3Q7CisJc3RydWN0IGRuX2RldiAqZG5fZGI7CisKKwlmb3IoaSA9IDA7IGkgPCBETl9ERVZfTElTVF9TSVpFOyBpKyssIHArKykgeworCQlpZiAocC0+dHlwZSA9PSBkZXYtPnR5cGUpCisJCQlicmVhazsKKwl9CisKKwkqZXJyID0gLUVOT0RFVjsKKwlpZiAoaSA9PSBETl9ERVZfTElTVF9TSVpFKQorCQlyZXR1cm4gTlVMTDsKKworCSplcnIgPSAtRU5PQlVGUzsKKwlpZiAoKGRuX2RiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRuX2RldiksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldChkbl9kYiwgMCwgc2l6ZW9mKHN0cnVjdCBkbl9kZXYpKTsKKwltZW1jcHkoJmRuX2RiLT5wYXJtcywgcCwgc2l6ZW9mKHN0cnVjdCBkbl9kZXZfcGFybXMpKTsKKwlzbXBfd21iKCk7CisJZGV2LT5kbl9wdHIgPSBkbl9kYjsKKwlkbl9kYi0+ZGV2ID0gZGV2OworCWluaXRfdGltZXIoJmRuX2RiLT50aW1lcik7CisKKwlkbl9kYi0+dXB0aW1lID0gamlmZmllczsKKwlpZiAoZG5fZGItPnBhcm1zLnVwKSB7CisJCWlmIChkbl9kYi0+cGFybXMudXAoZGV2KSA8IDApIHsKKwkJCWRldi0+ZG5fcHRyID0gTlVMTDsKKwkJCWtmcmVlKGRuX2RiKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJZG5fZGItPm5laWdoX3Bhcm1zID0gbmVpZ2hfcGFybXNfYWxsb2MoZGV2LCAmZG5fbmVpZ2hfdGFibGUpOworCisJZG5fZGV2X3N5c2N0bF9yZWdpc3RlcihkZXYsICZkbl9kYi0+cGFybXMpOworCisJZG5fZGV2X3NldF90aW1lcihkZXYpOworCisJKmVyciA9IDA7CisJcmV0dXJuIGRuX2RiOworfQorCisKKy8qCisgKiBUaGlzIHByb2Nlc3NlcyBhIGRldmljZSB1cCBldmVudC4gV2Ugb25seSBzdGFydCB1cAorICogdGhlIGxvb3BiYWNrIGRldmljZSAmIGV0aGVybmV0IGRldmljZXMgd2l0aCBjb3JyZWN0CisgKiBNQUMgYWRkcmVzZXMgYXV0b21hdGljYWxseS4gT3RoZXJzIG11c3QgYmUgc3RhcnRlZAorICogc3BlY2lmaWNhbGx5LgorICoKKyAqIEZJWE1FOiBIb3cgc2hvdWxkIHdlIGNvbmZpZ3VyZSB0aGUgbG9vcGJhY2sgYWRkcmVzcyA/IElmIHdlIGNvdWxkIGRpc3BlbnNlCisgKiB3aXRoIHVzaW5nIGRlY25ldF9hZGRyZXNzIGhlcmUgYW5kIGZvciBhdXRvYmluZCwgaXQgd2lsbCBiZSBvbmUgbGVzcyB0aGluZworICogZm9yIHVzZXJzIHRvIHdvcnJ5IGFib3V0IHNldHRpbmcgdXAuCisgKi8KKwordm9pZCBkbl9kZXZfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZG5faWZhZGRyICppZmE7CisJZG5fYWRkcmVzcyBhZGRyID0gZGVjbmV0X2FkZHJlc3M7CisJaW50IG1heWJlX2RlZmF1bHQgPSAwOworCXN0cnVjdCBkbl9kZXYgKmRuX2RiID0gKHN0cnVjdCBkbl9kZXYgKilkZXYtPmRuX3B0cjsKKworCWlmICgoZGV2LT50eXBlICE9IEFSUEhSRF9FVEhFUikgJiYgKGRldi0+dHlwZSAhPSBBUlBIUkRfTE9PUEJBQ0spKQorCQlyZXR1cm47CisKKwkvKgorCSAqIE5lZWQgdG8gZW5zdXJlIHRoYXQgbG9vcGJhY2sgZGV2aWNlIGhhcyBhIGRuX2RiIGF0dGFjaGVkIHRvIGl0CisJICogdG8gYWxsb3cgY3JlYXRpb24gb2YgbmVpZ2hib3VycyBhZ2FpbnN0IGl0LCBldmVuIHRob3VnaCBpdCBtaWdodAorCSAqIG5vdCBoYXZlIGEgbG9jYWwgYWRkcmVzcyBvZiBpdHMgb3duLiBNaWdodCBhcyB3ZWxsIGRvIHRoZSBzYW1lIGZvcgorCSAqIGFsbCBhdXRvY29uZmlndXJlZCBpbnRlcmZhY2VzLgorCSAqLworCWlmIChkbl9kYiA9PSBOVUxMKSB7CisJCWludCBlcnI7CisJCWRuX2RiID0gZG5fZGV2X2NyZWF0ZShkZXYsICZlcnIpOworCQlpZiAoZG5fZGIgPT0gTlVMTCkKKwkJCXJldHVybjsKKwl9CisKKwlpZiAoZGV2LT50eXBlID09IEFSUEhSRF9FVEhFUikgeworCQlpZiAobWVtY21wKGRldi0+ZGV2X2FkZHIsIGRuX2hpb3JkLCA0KSAhPSAwKQorCQkJcmV0dXJuOworCQlhZGRyID0gZG5faHRvbnMoZG5fZXRoMmRuKGRldi0+ZGV2X2FkZHIpKTsKKwkJbWF5YmVfZGVmYXVsdCA9IDE7CisJfQorCisJaWYgKGFkZHIgPT0gMCkKKwkJcmV0dXJuOworCisJaWYgKChpZmEgPSBkbl9kZXZfYWxsb2NfaWZhKCkpID09IE5VTEwpCisJCXJldHVybjsKKworCWlmYS0+aWZhX2xvY2FsID0gaWZhLT5pZmFfYWRkcmVzcyA9IGFkZHI7CisJaWZhLT5pZmFfZmxhZ3MgPSAwOworCWlmYS0+aWZhX3Njb3BlID0gUlRfU0NPUEVfVU5JVkVSU0U7CisJc3RyY3B5KGlmYS0+aWZhX2xhYmVsLCBkZXYtPm5hbWUpOworCisJZG5fZGV2X3NldF9pZmEoZGV2LCBpZmEpOworCisJLyoKKwkgKiBBdXRvbWFnaWNhbGx5IHNldCB0aGUgZGVmYXVsdCBkZXZpY2UgdG8gdGhlIGZpcnN0IGF1dG9tYXRpY2FsbHkKKwkgKiBjb25maWd1cmVkIGV0aGVybmV0IGNhcmQgaW4gdGhlIHN5c3RlbS4KKwkgKi8KKwlpZiAobWF5YmVfZGVmYXVsdCkgeworCQlkZXZfaG9sZChkZXYpOworCQlpZiAoZG5fZGV2X3NldF9kZWZhdWx0KGRldiwgMCkpCisJCQlkZXZfcHV0KGRldik7CisJfQorfQorCitzdGF0aWMgdm9pZCBkbl9kZXZfZGVsZXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRuX2RldiAqZG5fZGIgPSBkZXYtPmRuX3B0cjsKKworCWlmIChkbl9kYiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlkZWxfdGltZXJfc3luYygmZG5fZGItPnRpbWVyKTsKKwlkbl9kZXZfc3lzY3RsX3VucmVnaXN0ZXIoJmRuX2RiLT5wYXJtcyk7CisJZG5fZGV2X2NoZWNrX2RlZmF1bHQoZGV2KTsKKwluZWlnaF9pZmRvd24oJmRuX25laWdoX3RhYmxlLCBkZXYpOworCisJaWYgKGRuX2RiLT5wYXJtcy5kb3duKQorCQlkbl9kYi0+cGFybXMuZG93bihkZXYpOworCisJZGV2LT5kbl9wdHIgPSBOVUxMOworCisJbmVpZ2hfcGFybXNfcmVsZWFzZSgmZG5fbmVpZ2hfdGFibGUsIGRuX2RiLT5uZWlnaF9wYXJtcyk7CisJbmVpZ2hfaWZkb3duKCZkbl9uZWlnaF90YWJsZSwgZGV2KTsKKworCWlmIChkbl9kYi0+cm91dGVyKQorCQluZWlnaF9yZWxlYXNlKGRuX2RiLT5yb3V0ZXIpOworCWlmIChkbl9kYi0+cGVlcikKKwkJbmVpZ2hfcmVsZWFzZShkbl9kYi0+cGVlcik7CisKKwlrZnJlZShkbl9kYik7Cit9CisKK3ZvaWQgZG5fZGV2X2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZG5fZGV2ICpkbl9kYiA9IGRldi0+ZG5fcHRyOworCXN0cnVjdCBkbl9pZmFkZHIgKmlmYTsKKworCWlmIChkbl9kYiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwl3aGlsZSgoaWZhID0gZG5fZGItPmlmYV9saXN0KSAhPSBOVUxMKSB7CisJCWRuX2Rldl9kZWxfaWZhKGRuX2RiLCAmZG5fZGItPmlmYV9saXN0LCAwKTsKKwkJZG5fZGV2X2ZyZWVfaWZhKGlmYSk7CisJfQorCisJZG5fZGV2X2RlbGV0ZShkZXYpOworfQorCit2b2lkIGRuX2Rldl9pbml0X3BrdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybjsKK30KKwordm9pZCBkbl9kZXZfdmVyaV9wa3Qoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm47Cit9CisKK3ZvaWQgZG5fZGV2X2hlbGxvKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuOworfQorCit2b2lkIGRuX2Rldl9kZXZpY2VzX29mZih2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwlydG5sX2xvY2soKTsKKwlmb3IoZGV2ID0gZGV2X2Jhc2U7IGRldjsgZGV2ID0gZGV2LT5uZXh0KQorCQlkbl9kZXZfZG93bihkZXYpOworCXJ0bmxfdW5sb2NrKCk7CisKK30KKwordm9pZCBkbl9kZXZfZGV2aWNlc19vbih2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwlydG5sX2xvY2soKTsKKwlmb3IoZGV2ID0gZGV2X2Jhc2U7IGRldjsgZGV2ID0gZGV2LT5uZXh0KSB7CisJCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKQorCQkJZG5fZGV2X3VwKGRldik7CisJfQorCXJ0bmxfdW5sb2NrKCk7Cit9CisKK2ludCByZWdpc3Rlcl9kbmFkZHJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJmRuYWRkcl9jaGFpbiwgbmIpOworfQorCitpbnQgdW5yZWdpc3Rlcl9kbmFkZHJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmZG5hZGRyX2NoYWluLCBuYik7Cit9CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0X2RldmljZSAqZG5fZGV2X2dldF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRvIHsKKwkJZGV2ID0gZGV2LT5uZXh0OworCX0gd2hpbGUoZGV2ICYmICFkZXYtPmRuX3B0cik7CisKKwlyZXR1cm4gZGV2OworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRuX2Rldl9nZXRfaWR4KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwlkZXYgPSBkZXZfYmFzZTsKKwlpZiAoZGV2ICYmICFkZXYtPmRuX3B0cikKKwkJZGV2ID0gZG5fZGV2X2dldF9uZXh0KHNlcSwgZGV2KTsKKwlpZiAocG9zKSB7CisJCXdoaWxlKGRldiAmJiAoZGV2ID0gZG5fZGV2X2dldF9uZXh0KHNlcSwgZGV2KSkpCisJCQktLXBvczsKKwl9CisJcmV0dXJuIGRldjsKK30KKworc3RhdGljIHZvaWQgKmRuX2Rldl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCWlmICgqcG9zKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJCXJlYWRfbG9jaygmZGV2X2Jhc2VfbG9jayk7CisJCWRldiA9IGRuX2Rldl9nZXRfaWR4KHNlcSwgKnBvcyAtIDEpOworCQlpZiAoZGV2ID09IE5VTEwpCisJCQlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7CisJCXJldHVybiBkZXY7CisJfQorCXJldHVybiBTRVFfU1RBUlRfVE9LRU47Cit9CisKK3N0YXRpYyB2b2lkICpkbl9kZXZfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB2OworCWxvZmZfdCBvbmUgPSAxOworCisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CisJCWRldiA9IGRuX2Rldl9zZXFfc3RhcnQoc2VxLCAmb25lKTsKKwl9IGVsc2UgeworCQlkZXYgPSBkbl9kZXZfZ2V0X25leHQoc2VxLCBkZXYpOworCQlpZiAoZGV2ID09IE5VTEwpCisJCQlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7CisJfQorCSsrKnBvczsKKwlyZXR1cm4gZGV2OworfQorCitzdGF0aWMgdm9pZCBkbl9kZXZfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJaWYgKHYgJiYgdiAhPSBTRVFfU1RBUlRfVE9LRU4pCisJCXJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsKK30KKworc3RhdGljIGNoYXIgKmRuX3R5cGUyYXNjKGNoYXIgdHlwZSkKK3sKKwlzd2l0Y2godHlwZSkgeworCQljYXNlIEROX0RFVl9CQ0FTVDoKKwkJCXJldHVybiAiQiI7CisJCWNhc2UgRE5fREVWX1VDQVNUOgorCQkJcmV0dXJuICJVIjsKKwkJY2FzZSBETl9ERVZfTVBPSU5UOgorCQkJcmV0dXJuICJNIjsKKwl9CisKKwlyZXR1cm4gIj8iOworfQorCitzdGF0aWMgaW50IGRuX2Rldl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisgICAgICAgIAlzZXFfcHV0cyhzZXEsICJOYW1lICAgICBGbGFncyBUMSAgIFRpbWVyMSBUMyAgIFRpbWVyMyBCbGtTaXplIFByaSBTdGF0ZSBEZXZUeXBlICAgIFJvdXRlciBQZWVyXG4iKTsKKwllbHNlIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHY7CisJCWNoYXIgcGVlcl9idWZbRE5fQVNDQlVGX0xFTl07CisJCWNoYXIgcm91dGVyX2J1ZltETl9BU0NCVUZfTEVOXTsKKwkJc3RydWN0IGRuX2RldiAqZG5fZGIgPSBkZXYtPmRuX3B0cjsKKworICAgICAgICAgICAgICAgIHNlcV9wcmludGYoc2VxLCAiJS04cyAlMXMgICAgICUwNHUgJTA0dSAgICUwNGx1ICUwNGx1IgorCQkJCSIgICAlMDRodSAgICAlMDNkICUwMnggICAgJS0xMHMgJS03cyAlLTdzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJZGV2LT5uYW1lID8gZGV2LT5uYW1lIDogIj8/PyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlkbl90eXBlMmFzYyhkbl9kYi0+cGFybXMubW9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkwLCAwLAorCQkJCWRuX2RiLT50MywgZG5fZGItPnBhcm1zLnQzLAorCQkJCW10dTJibGtzaXplKGRldiksCisJCQkJZG5fZGItPnBhcm1zLnByaW9yaXR5LAorCQkJCWRuX2RiLT5wYXJtcy5zdGF0ZSwgZG5fZGItPnBhcm1zLm5hbWUsCisJCQkJZG5fZGItPnJvdXRlciA/IGRuX2FkZHIyYXNjKGRuX250b2hzKCooZG5fYWRkcmVzcyAqKWRuX2RiLT5yb3V0ZXItPnByaW1hcnlfa2V5KSwgcm91dGVyX2J1ZikgOiAiIiwKKwkJCQlkbl9kYi0+cGVlciA/IGRuX2FkZHIyYXNjKGRuX250b2hzKCooZG5fYWRkcmVzcyAqKWRuX2RiLT5wZWVyLT5wcmltYXJ5X2tleSksIHBlZXJfYnVmKSA6ICIiKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZG5fZGV2X3NlcV9vcHMgPSB7CisJLnN0YXJ0CT0gZG5fZGV2X3NlcV9zdGFydCwKKwkubmV4dAk9IGRuX2Rldl9zZXFfbmV4dCwKKwkuc3RvcAk9IGRuX2Rldl9zZXFfc3RvcCwKKwkuc2hvdwk9IGRuX2Rldl9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgZG5fZGV2X3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmZG5fZGV2X3NlcV9vcHMpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkbl9kZXZfc2VxX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5vcGVuCSA9IGRuX2Rldl9zZXFfb3BlbiwKKwkucmVhZAkgPSBzZXFfcmVhZCwKKwkubGxzZWVrCSA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKK3N0YXRpYyBzdHJ1Y3QgcnRuZXRsaW5rX2xpbmsgZG5ldF9ydG5ldGxpbmtfdGFibGVbUlRNX01BWC1SVE1fQkFTRSsxXSA9IAoreworCSBbNF0gPSB7IC5kb2l0ICAgPSBkbl9kZXZfcnRtX25ld2FkZHIsCX0sCisJIFs1XSA9IHsgLmRvaXQgICA9IGRuX2Rldl9ydG1fZGVsYWRkciwJfSwKKwkgWzZdID0geyAuZHVtcGl0ID0gZG5fZGV2X2R1bXBfaWZhZGRyLAl9LAorCisjaWZkZWYgQ09ORklHX0RFQ05FVF9ST1VURVIKKwkgWzhdID0geyAuZG9pdCAgID0gZG5fZmliX3J0bV9uZXdyb3V0ZSwJfSwKKwkgWzldID0geyAuZG9pdCAgID0gZG5fZmliX3J0bV9kZWxyb3V0ZSwJfSwKKwlbMTBdID0geyAuZG9pdCAgID0gZG5fY2FjaGVfZ2V0cm91dGUsIC5kdW1waXQgPSBkbl9maWJfZHVtcCwgfSwKKwlbMTZdID0geyAuZG9pdCAgID0gZG5fZmliX3J0bV9uZXdydWxlLCB9LAorCVsxN10gPSB7IC5kb2l0ICAgPSBkbl9maWJfcnRtX2RlbHJ1bGUsIH0sCisJWzE4XSA9IHsgLmR1bXBpdCA9IGRuX2ZpYl9kdW1wX3J1bGVzLCAgfSwKKyNlbHNlCisJWzEwXSA9IHsgLmRvaXQgICA9IGRuX2NhY2hlX2dldHJvdXRlLCAuZHVtcGl0ID0gZG5fY2FjaGVfZHVtcCwgfSwKKyNlbmRpZgorCit9OworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgYWRkclsyXTsKK21vZHVsZV9wYXJhbV9hcnJheShhZGRyLCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhhZGRyLCAiVGhlIERFQ25ldCBhZGRyZXNzIG9mIHRoaXMgbWFjaGluZTogYXJlYSxub2RlIik7CisKK3ZvaWQgX19pbml0IGRuX2Rldl9pbml0KHZvaWQpCit7CisgICAgICAgIGlmIChhZGRyWzBdID4gNjMgfHwgYWRkclswXSA8IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkRFQ25ldDogQXJlYSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNjMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoYWRkclsxXSA+IDEwMjMgfHwgYWRkclsxXSA8IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkRFQ25ldDogTm9kZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAyMyIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGRlY25ldF9hZGRyZXNzID0gZG5faHRvbnMoKGFkZHJbMF0gPDwgMTApIHwgYWRkclsxXSk7CisKKwlkbl9kZXZfZGV2aWNlc19vbigpOworCisJcnRuZXRsaW5rX2xpbmtzW1BGX0RFQ25ldF0gPSBkbmV0X3J0bmV0bGlua190YWJsZTsKKworCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJkZWNuZXRfZGV2IiwgU19JUlVHTywgJmRuX2Rldl9zZXFfZm9wcyk7CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJeworCQlpbnQgaTsKKwkJZm9yKGkgPSAwOyBpIDwgRE5fREVWX0xJU1RfU0laRTsgaSsrKQorCQkJZG5fZGV2X3N5c2N0bF9yZWdpc3RlcihOVUxMLCAmZG5fZGV2X2xpc3RbaV0pOworCX0KKyNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCit9CisKK3ZvaWQgX19leGl0IGRuX2Rldl9jbGVhbnVwKHZvaWQpCit7CisJcnRuZXRsaW5rX2xpbmtzW1BGX0RFQ25ldF0gPSBOVUxMOworCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCXsKKwkJaW50IGk7CisJCWZvcihpID0gMDsgaSA8IEROX0RFVl9MSVNUX1NJWkU7IGkrKykKKwkJCWRuX2Rldl9zeXNjdGxfdW5yZWdpc3RlcigmZG5fZGV2X2xpc3RbaV0pOworCX0KKyNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCisKKwlwcm9jX25ldF9yZW1vdmUoImRlY25ldF9kZXYiKTsKKworCWRuX2Rldl9kZXZpY2VzX29mZigpOworfQpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl9maWIuYyBiL25ldC9kZWNuZXQvZG5fZmliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzNGIyNQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9kZWNuZXQvZG5fZmliLmMKQEAgLTAsMCArMSw4MDIgQEAKKy8qCisgKiBERUNuZXQgICAgICAgQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIERFQ25ldCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKiAgICAgICAgICAgICAgb3BlcmF0aW5nIHN5c3RlbS4gIERFQ25ldCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqICAgICAgICAgICAgICBpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKiAgICAgICAgICAgICAgREVDbmV0IFJvdXRpbmcgRm9yd2FyZGluZyBJbmZvcm1hdGlvbiBCYXNlIChHbHVlL0luZm8gTGlzdCkKKyAqCisgKiBBdXRob3I6ICAgICAgU3RldmUgV2hpdGVob3VzZSA8U3RldmVXQEFDTS5vcmc+CisgKgorICoKKyAqIENoYW5nZXM6CisgKiAgICAgICAgICAgICAgQWxleGV5IEt1em5ldHNvdiA6IFNNUCBsb2NraW5nIGNoYW5nZXMKKyAqICAgICAgICAgICAgICBTdGV2ZSBXaGl0ZWhvdXNlIDogUmV3cm90ZSBpdC4uLiBXZWxsIHRvIGJlIG1vcmUgY29ycmVjdCwgSQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWQgbW9zdCBvZiBpdCBmcm9tIHRoZSBpcHY0IGZpYiBjb2RlLgorICogICAgICAgICAgICAgIFN0ZXZlIFdoaXRlaG91c2UgOiBVcGRhdGVkIGl0IGluIHN0eWxlIGFuZCBmaXhlZCBhIGZldyBidWdzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHdlcmUgZml4ZWQgaW4gdGhlIGlwdjQgY29kZSBzaW5jZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGNvZGUgd2FzIGNvcGllZCBmcm9tIGl0LgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bmV0L25laWdoYm91ci5oPgorI2luY2x1ZGUgPG5ldC9kc3QuaD4KKyNpbmNsdWRlIDxuZXQvZmxvdy5oPgorI2luY2x1ZGUgPG5ldC9kbi5oPgorI2luY2x1ZGUgPG5ldC9kbl9yb3V0ZS5oPgorI2luY2x1ZGUgPG5ldC9kbl9maWIuaD4KKyNpbmNsdWRlIDxuZXQvZG5fbmVpZ2guaD4KKyNpbmNsdWRlIDxuZXQvZG5fZGV2Lmg+CisKKyNkZWZpbmUgUlRfTUlOX1RBQkxFIDEKKworI2RlZmluZSBmb3JfZmliX2luZm8oKSB7IHN0cnVjdCBkbl9maWJfaW5mbyAqZmk7XAorCWZvcihmaSA9IGRuX2ZpYl9pbmZvX2xpc3Q7IGZpOyBmaSA9IGZpLT5maWJfbmV4dCkKKyNkZWZpbmUgZW5kZm9yX2ZpYl9pbmZvKCkgfQorCisjZGVmaW5lIGZvcl9uZXh0aG9wcyhmaSkgeyBpbnQgbmhzZWw7IGNvbnN0IHN0cnVjdCBkbl9maWJfbmggKm5oO1wKKwlmb3IobmhzZWwgPSAwLCBuaCA9IChmaSktPmZpYl9uaDsgbmhzZWwgPCAoZmkpLT5maWJfbmhzOyBuaCsrLCBuaHNlbCsrKQorCisjZGVmaW5lIGNoYW5nZV9uZXh0aG9wcyhmaSkgeyBpbnQgbmhzZWw7IHN0cnVjdCBkbl9maWJfbmggKm5oO1wKKwlmb3IobmhzZWwgPSAwLCBuaCA9IChzdHJ1Y3QgZG5fZmliX25oICopKChmaSktPmZpYl9uaCk7IG5oc2VsIDwgKGZpKS0+ZmliX25oczsgbmgrKywgbmhzZWwrKykKKworI2RlZmluZSBlbmRmb3JfbmV4dGhvcHMoZmkpIH0KKworZXh0ZXJuIGludCBkbl9jYWNoZV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYik7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZG5fZmliX211bHRpcGF0aF9sb2NrKTsKK3N0YXRpYyBzdHJ1Y3QgZG5fZmliX2luZm8gKmRuX2ZpYl9pbmZvX2xpc3Q7CitzdGF0aWMgREVGSU5FX1JXTE9DSyhkbl9maWJfaW5mb19sb2NrKTsKKworc3RhdGljIHN0cnVjdAoreworCWludCBlcnJvcjsKKwl1OCBzY29wZTsKK30gZG5fZmliX3Byb3BzW1JUQV9NQVgrMV0gPSB7CisJW1JUTl9VTlNQRUNdID0gICAgICB7IC5lcnJvciA9IDAsICAgICAgIC5zY29wZSA9IFJUX1NDT1BFX05PV0hFUkUgfSwKKwlbUlROX1VOSUNBU1RdID0gICAgIHsgLmVycm9yID0gMCwgICAgICAgLnNjb3BlID0gUlRfU0NPUEVfVU5JVkVSU0UgfSwKKwlbUlROX0xPQ0FMXSA9ICAgICAgIHsgLmVycm9yID0gMCwgICAgICAgLnNjb3BlID0gUlRfU0NPUEVfSE9TVCB9LAorCVtSVE5fQlJPQURDQVNUXSA9ICAgeyAuZXJyb3IgPSAtRUlOVkFMLCAuc2NvcGUgPSBSVF9TQ09QRV9OT1dIRVJFIH0sCisJW1JUTl9BTllDQVNUXSA9ICAgICB7IC5lcnJvciA9IC1FSU5WQUwsIC5zY29wZSA9IFJUX1NDT1BFX05PV0hFUkUgfSwKKwlbUlROX01VTFRJQ0FTVF0gPSAgIHsgLmVycm9yID0gLUVJTlZBTCwgLnNjb3BlID0gUlRfU0NPUEVfTk9XSEVSRSB9LAorCVtSVE5fQkxBQ0tIT0xFXSA9ICAgeyAuZXJyb3IgPSAtRUlOVkFMLCAuc2NvcGUgPSBSVF9TQ09QRV9VTklWRVJTRSB9LAorCVtSVE5fVU5SRUFDSEFCTEVdID0geyAuZXJyb3IgPSAtRUhPU1RVTlJFQUNILCAuc2NvcGUgPSBSVF9TQ09QRV9VTklWRVJTRSB9LAorCVtSVE5fUFJPSElCSVRdID0gICAgeyAuZXJyb3IgPSAtRUFDQ0VTLCAuc2NvcGUgPSBSVF9TQ09QRV9VTklWRVJTRSB9LAorCVtSVE5fVEhST1ddID0gICAgICAgeyAuZXJyb3IgPSAtRUFHQUlOLCAuc2NvcGUgPSBSVF9TQ09QRV9VTklWRVJTRSB9LAorCVtSVE5fTkFUXSA9ICAgICAgICAgeyAuZXJyb3IgPSAwLCAgICAgICAuc2NvcGUgPSBSVF9TQ09QRV9OT1dIRVJFIH0sCisJW1JUTl9YUkVTT0xWRV0gPSAgICB7IC5lcnJvciA9IC1FSU5WQUwsIC5zY29wZSA9IFJUX1NDT1BFX05PV0hFUkUgfSwKK307CisKK3ZvaWQgZG5fZmliX2ZyZWVfaW5mbyhzdHJ1Y3QgZG5fZmliX2luZm8gKmZpKQoreworCWlmIChmaS0+ZmliX2RlYWQgPT0gMCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiREVDbmV0OiBCVUchIEF0dGVtcHQgdG8gZnJlZSBhbGl2ZSBkbl9maWJfaW5mb1xuIik7CisJCXJldHVybjsKKwl9CisKKwljaGFuZ2VfbmV4dGhvcHMoZmkpIHsKKwkJaWYgKG5oLT5uaF9kZXYpCisJCQlkZXZfcHV0KG5oLT5uaF9kZXYpOworCQluaC0+bmhfZGV2ID0gTlVMTDsKKwl9IGVuZGZvcl9uZXh0aG9wcyhmaSk7CisJa2ZyZWUoZmkpOworfQorCit2b2lkIGRuX2ZpYl9yZWxlYXNlX2luZm8oc3RydWN0IGRuX2ZpYl9pbmZvICpmaSkKK3sKKwl3cml0ZV9sb2NrKCZkbl9maWJfaW5mb19sb2NrKTsKKwlpZiAoZmkgJiYgLS1maS0+ZmliX3RyZWVyZWYgPT0gMCkgeworCQlpZiAoZmktPmZpYl9uZXh0KQorCQkJZmktPmZpYl9uZXh0LT5maWJfcHJldiA9IGZpLT5maWJfcHJldjsKKwkJaWYgKGZpLT5maWJfcHJldikKKwkJCWZpLT5maWJfcHJldi0+ZmliX25leHQgPSBmaS0+ZmliX25leHQ7CisJCWlmIChmaSA9PSBkbl9maWJfaW5mb19saXN0KQorCQkJZG5fZmliX2luZm9fbGlzdCA9IGZpLT5maWJfbmV4dDsKKwkJZmktPmZpYl9kZWFkID0gMTsKKwkJZG5fZmliX2luZm9fcHV0KGZpKTsKKwl9CisJd3JpdGVfdW5sb2NrKCZkbl9maWJfaW5mb19sb2NrKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG5fZmliX25oX2NvbXAoY29uc3Qgc3RydWN0IGRuX2ZpYl9pbmZvICpmaSwgY29uc3Qgc3RydWN0IGRuX2ZpYl9pbmZvICpvZmkpCit7CisJY29uc3Qgc3RydWN0IGRuX2ZpYl9uaCAqb25oID0gb2ZpLT5maWJfbmg7CisKKwlmb3JfbmV4dGhvcHMoZmkpIHsKKwkJaWYgKG5oLT5uaF9vaWYgIT0gb25oLT5uaF9vaWYgfHwKKwkJCW5oLT5uaF9ndyAhPSBvbmgtPm5oX2d3IHx8CisJCQluaC0+bmhfc2NvcGUgIT0gb25oLT5uaF9zY29wZSB8fAorCQkJbmgtPm5oX3dlaWdodCAhPSBvbmgtPm5oX3dlaWdodCB8fAorCQkJKChuaC0+bmhfZmxhZ3Neb25oLT5uaF9mbGFncykmflJUTkhfRl9ERUFEKSkKKwkJCQlyZXR1cm4gLTE7CisJCW9uaCsrOworCX0gZW5kZm9yX25leHRob3BzKGZpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZG5fZmliX2luZm8gKmRuX2ZpYl9maW5kX2luZm8oY29uc3Qgc3RydWN0IGRuX2ZpYl9pbmZvICpuZmkpCit7CisJZm9yX2ZpYl9pbmZvKCkgeworCQlpZiAoZmktPmZpYl9uaHMgIT0gbmZpLT5maWJfbmhzKQorCQkJY29udGludWU7CisJCWlmIChuZmktPmZpYl9wcm90b2NvbCA9PSBmaS0+ZmliX3Byb3RvY29sICYmCisJCQluZmktPmZpYl9wcmVmc3JjID09IGZpLT5maWJfcHJlZnNyYyAmJgorCQkJbmZpLT5maWJfcHJpb3JpdHkgPT0gZmktPmZpYl9wcmlvcml0eSAmJgorCQkJbWVtY21wKG5maS0+ZmliX21ldHJpY3MsIGZpLT5maWJfbWV0cmljcywgc2l6ZW9mKGZpLT5maWJfbWV0cmljcykpID09IDAgJiYKKwkJCSgobmZpLT5maWJfZmxhZ3NeZmktPmZpYl9mbGFncykmflJUTkhfRl9ERUFEKSA9PSAwICYmCisJCQkobmZpLT5maWJfbmhzID09IDAgfHwgZG5fZmliX25oX2NvbXAoZmksIG5maSkgPT0gMCkpCisJCQkJcmV0dXJuIGZpOworCX0gZW5kZm9yX2ZpYl9pbmZvKCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3UxNiBkbl9maWJfZ2V0X2F0dHIxNihzdHJ1Y3QgcnRhdHRyICphdHRyLCBpbnQgYXR0cmxlbiwgaW50IHR5cGUpCit7CisJd2hpbGUoUlRBX09LKGF0dHIsYXR0cmxlbikpIHsKKwkJaWYgKGF0dHItPnJ0YV90eXBlID09IHR5cGUpCisJCQlyZXR1cm4gKih1MTYqKVJUQV9EQVRBKGF0dHIpOworCQlhdHRyID0gUlRBX05FWFQoYXR0ciwgYXR0cmxlbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG5fZmliX2NvdW50X25ocyhzdHJ1Y3QgcnRhdHRyICpydGEpCit7CisJaW50IG5ocyA9IDA7CisJc3RydWN0IHJ0bmV4dGhvcCAqbmhwID0gUlRBX0RBVEEocnRhKTsKKwlpbnQgbmhsZW4gPSBSVEFfUEFZTE9BRChydGEpOworCisJd2hpbGUobmhsZW4gPj0gKGludClzaXplb2Yoc3RydWN0IHJ0bmV4dGhvcCkpIHsKKwkJaWYgKChuaGxlbiAtPSBuaHAtPnJ0bmhfbGVuKSA8IDApCisJCQlyZXR1cm4gMDsKKwkJbmhzKys7CisJCW5ocCA9IFJUTkhfTkVYVChuaHApOworCX0KKworCXJldHVybiBuaHM7Cit9CisKK3N0YXRpYyBpbnQgZG5fZmliX2dldF9uaHMoc3RydWN0IGRuX2ZpYl9pbmZvICpmaSwgY29uc3Qgc3RydWN0IHJ0YXR0ciAqcnRhLCBjb25zdCBzdHJ1Y3QgcnRtc2cgKnIpCit7CisJc3RydWN0IHJ0bmV4dGhvcCAqbmhwID0gUlRBX0RBVEEocnRhKTsKKwlpbnQgbmhsZW4gPSBSVEFfUEFZTE9BRChydGEpOworCisJY2hhbmdlX25leHRob3BzKGZpKSB7CisJCWludCBhdHRybGVuID0gbmhsZW4gLSBzaXplb2Yoc3RydWN0IHJ0bmV4dGhvcCk7CisJCWlmIChhdHRybGVuIDwgMCB8fCAobmhsZW4gLT0gbmhwLT5ydG5oX2xlbikgPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbmgtPm5oX2ZsYWdzICA9IChyLT5ydG1fZmxhZ3MmfjB4RkYpIHwgbmhwLT5ydG5oX2ZsYWdzOworCQluaC0+bmhfb2lmICAgID0gbmhwLT5ydG5oX2lmaW5kZXg7CisJCW5oLT5uaF93ZWlnaHQgPSBuaHAtPnJ0bmhfaG9wcyArIDE7CisKKwkJaWYgKGF0dHJsZW4pIHsKKwkJCW5oLT5uaF9ndyA9IGRuX2ZpYl9nZXRfYXR0cjE2KFJUTkhfREFUQShuaHApLCBhdHRybGVuLCBSVEFfR0FURVdBWSk7CisJCX0KKwkJbmhwID0gUlROSF9ORVhUKG5ocCk7CisJfSBlbmRmb3JfbmV4dGhvcHMoZmkpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBkbl9maWJfY2hlY2tfbmgoY29uc3Qgc3RydWN0IHJ0bXNnICpyLCBzdHJ1Y3QgZG5fZmliX2luZm8gKmZpLCBzdHJ1Y3QgZG5fZmliX25oICpuaCkKK3sKKwlpbnQgZXJyOworCisJaWYgKG5oLT5uaF9ndykgeworCQlzdHJ1Y3QgZmxvd2kgZmw7CisJCXN0cnVjdCBkbl9maWJfcmVzIHJlczsKKworCQltZW1zZXQoJmZsLCAwLCBzaXplb2YoZmwpKTsKKworCQlpZiAobmgtPm5oX2ZsYWdzJlJUTkhfRl9PTkxJTkspIHsKKwkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwkJCWlmIChyLT5ydG1fc2NvcGUgPj0gUlRfU0NPUEVfTElOSykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChkbmV0X2FkZHJfdHlwZShuaC0+bmhfZ3cpICE9IFJUTl9VTklDQVNUKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKChkZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgobmgtPm5oX29pZikpID09IE5VTEwpCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQlpZiAoIShkZXYtPmZsYWdzJklGRl9VUCkpCisJCQkJcmV0dXJuIC1FTkVURE9XTjsKKwkJCW5oLT5uaF9kZXYgPSBkZXY7CisJCQlkZXZfaG9sZChkZXYpOworCQkJbmgtPm5oX3Njb3BlID0gUlRfU0NPUEVfTElOSzsKKwkJCXJldHVybiAwOworCQl9CisKKwkJbWVtc2V0KCZmbCwgMCwgc2l6ZW9mKGZsKSk7CisJCWZsLmZsZF9kc3QgPSBuaC0+bmhfZ3c7CisJCWZsLm9pZiA9IG5oLT5uaF9vaWY7CisJCWZsLmZsZF9zY29wZSA9IHItPnJ0bV9zY29wZSArIDE7CisKKwkJaWYgKGZsLmZsZF9zY29wZSA8IFJUX1NDT1BFX0xJTkspCisJCQlmbC5mbGRfc2NvcGUgPSBSVF9TQ09QRV9MSU5LOworCisJCWlmICgoZXJyID0gZG5fZmliX2xvb2t1cCgmZmwsICZyZXMpKSAhPSAwKQorCQkJcmV0dXJuIGVycjsKKworCQllcnIgPSAtRUlOVkFMOworCQlpZiAocmVzLnR5cGUgIT0gUlROX1VOSUNBU1QgJiYgcmVzLnR5cGUgIT0gUlROX0xPQ0FMKQorCQkJZ290byBvdXQ7CisJCW5oLT5uaF9zY29wZSA9IHJlcy5zY29wZTsKKwkJbmgtPm5oX29pZiA9IEROX0ZJQl9SRVNfT0lGKHJlcyk7CisJCW5oLT5uaF9kZXYgPSBETl9GSUJfUkVTX0RFVihyZXMpOworCQlpZiAobmgtPm5oX2RldiA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJCWRldl9ob2xkKG5oLT5uaF9kZXYpOworCQllcnIgPSAtRU5FVERPV047CisJCWlmICghKG5oLT5uaF9kZXYtPmZsYWdzICYgSUZGX1VQKSkKKwkJCWdvdG8gb3V0OworCQllcnIgPSAwOworb3V0OgorCQlkbl9maWJfcmVzX3B1dCgmcmVzKTsKKwkJcmV0dXJuIGVycjsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJCWlmIChuaC0+bmhfZmxhZ3MmKFJUTkhfRl9QRVJWQVNJVkV8UlROSF9GX09OTElOSykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlkZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgobmgtPm5oX29pZik7CisJCWlmIChkZXYgPT0gTlVMTCB8fCBkZXYtPmRuX3B0ciA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWlmICghKGRldi0+ZmxhZ3MmSUZGX1VQKSkKKwkJCXJldHVybiAtRU5FVERPV047CisJCW5oLT5uaF9kZXYgPSBkZXY7CisJCWRldl9ob2xkKG5oLT5uaF9kZXYpOworCQluaC0+bmhfc2NvcGUgPSBSVF9TQ09QRV9IT1NUOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0cnVjdCBkbl9maWJfaW5mbyAqZG5fZmliX2NyZWF0ZV9pbmZvKGNvbnN0IHN0cnVjdCBydG1zZyAqciwgc3RydWN0IGRuX2tlcm5fcnRhICpydGEsIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoLCBpbnQgKmVycnApCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZG5fZmliX2luZm8gKmZpID0gTlVMTDsKKwlzdHJ1Y3QgZG5fZmliX2luZm8gKm9maTsKKwlpbnQgbmhzID0gMTsKKworCWlmIChkbl9maWJfcHJvcHNbci0+cnRtX3R5cGVdLnNjb3BlID4gci0+cnRtX3Njb3BlKQorCQlnb3RvIGVycl9pbnZhbDsKKworCWlmIChydGEtPnJ0YV9tcCkgeworCQluaHMgPSBkbl9maWJfY291bnRfbmhzKHJ0YS0+cnRhX21wKTsKKwkJaWYgKG5ocyA9PSAwKQorCQkJZ290byBlcnJfaW52YWw7CisJfQorCisJZmkgPSBrbWFsbG9jKHNpemVvZigqZmkpK25ocypzaXplb2Yoc3RydWN0IGRuX2ZpYl9uaCksIEdGUF9LRVJORUwpOworCWVyciA9IC1FTk9CVUZTOworCWlmIChmaSA9PSBOVUxMKQorCQlnb3RvIGZhaWx1cmU7CisJbWVtc2V0KGZpLCAwLCBzaXplb2YoKmZpKStuaHMqc2l6ZW9mKHN0cnVjdCBkbl9maWJfbmgpKTsKKworCWZpLT5maWJfcHJvdG9jb2wgPSByLT5ydG1fcHJvdG9jb2w7CisJZmktPmZpYl9uaHMgPSBuaHM7CisJZmktPmZpYl9mbGFncyA9IHItPnJ0bV9mbGFnczsKKwlpZiAocnRhLT5ydGFfcHJpb3JpdHkpCisJCWZpLT5maWJfcHJpb3JpdHkgPSAqcnRhLT5ydGFfcHJpb3JpdHk7CisJaWYgKHJ0YS0+cnRhX214KSB7CisJCWludCBhdHRybGVuID0gUlRBX1BBWUxPQUQocnRhLT5ydGFfbXgpOworCQlzdHJ1Y3QgcnRhdHRyICphdHRyID0gUlRBX0RBVEEocnRhLT5ydGFfbXgpOworCisJCXdoaWxlKFJUQV9PSyhhdHRyLCBhdHRybGVuKSkgeworCQkJdW5zaWduZWQgZmxhdm91ciA9IGF0dHItPnJ0YV90eXBlOworCQkJaWYgKGZsYXZvdXIpIHsKKwkJCQlpZiAoZmxhdm91ciA+IFJUQVhfTUFYKQorCQkJCQlnb3RvIGVycl9pbnZhbDsKKwkJCQlmaS0+ZmliX21ldHJpY3NbZmxhdm91ci0xXSA9ICoodW5zaWduZWQqKVJUQV9EQVRBKGF0dHIpOworCQkJfQorCQkJYXR0ciA9IFJUQV9ORVhUKGF0dHIsIGF0dHJsZW4pOworCQl9CisJfQorCWlmIChydGEtPnJ0YV9wcmVmc3JjKQorCQltZW1jcHkoJmZpLT5maWJfcHJlZnNyYywgcnRhLT5ydGFfcHJlZnNyYywgMik7CisKKwlpZiAocnRhLT5ydGFfbXApIHsKKwkJaWYgKChlcnIgPSBkbl9maWJfZ2V0X25ocyhmaSwgcnRhLT5ydGFfbXAsIHIpKSAhPSAwKQorCQkJZ290byBmYWlsdXJlOworCQlpZiAocnRhLT5ydGFfb2lmICYmIGZpLT5maWJfbmgtPm5oX29pZiAhPSAqcnRhLT5ydGFfb2lmKQorCQkJZ290byBlcnJfaW52YWw7CisJCWlmIChydGEtPnJ0YV9ndyAmJiBtZW1jbXAoJmZpLT5maWJfbmgtPm5oX2d3LCBydGEtPnJ0YV9ndywgMikpCisJCQlnb3RvIGVycl9pbnZhbDsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZG5fZmliX25oICpuaCA9IGZpLT5maWJfbmg7CisJCWlmIChydGEtPnJ0YV9vaWYpCisJCQluaC0+bmhfb2lmID0gKnJ0YS0+cnRhX29pZjsKKwkJaWYgKHJ0YS0+cnRhX2d3KQorCQkJbWVtY3B5KCZuaC0+bmhfZ3csIHJ0YS0+cnRhX2d3LCAyKTsKKwkJbmgtPm5oX2ZsYWdzID0gci0+cnRtX2ZsYWdzOworCQluaC0+bmhfd2VpZ2h0ID0gMTsKKwl9CisKKwlpZiAoci0+cnRtX3R5cGUgPT0gUlROX05BVCkgeworCQlpZiAocnRhLT5ydGFfZ3cgPT0gTlVMTCB8fCBuaHMgIT0gMSB8fCBydGEtPnJ0YV9vaWYpCisJCQlnb3RvIGVycl9pbnZhbDsKKwkJbWVtY3B5KCZmaS0+ZmliX25oLT5uaF9ndywgcnRhLT5ydGFfZ3csIDIpOworCQlnb3RvIGxpbmtfaXQ7CisJfQorCisJaWYgKGRuX2ZpYl9wcm9wc1tyLT5ydG1fdHlwZV0uZXJyb3IpIHsKKwkJaWYgKHJ0YS0+cnRhX2d3IHx8IHJ0YS0+cnRhX29pZiB8fCBydGEtPnJ0YV9tcCkKKwkJCWdvdG8gZXJyX2ludmFsOworCQlnb3RvIGxpbmtfaXQ7CisJfQorCisJaWYgKHItPnJ0bV9zY29wZSA+IFJUX1NDT1BFX0hPU1QpCisJCWdvdG8gZXJyX2ludmFsOworCisJaWYgKHItPnJ0bV9zY29wZSA9PSBSVF9TQ09QRV9IT1NUKSB7CisJCXN0cnVjdCBkbl9maWJfbmggKm5oID0gZmktPmZpYl9uaDsKKworCQkvKiBMb2NhbCBhZGRyZXNzIGlzIGFkZGVkICovCisJCWlmIChuaHMgIT0gMSB8fCBuaC0+bmhfZ3cpCisJCQlnb3RvIGVycl9pbnZhbDsKKwkJbmgtPm5oX3Njb3BlID0gUlRfU0NPUEVfTk9XSEVSRTsKKwkJbmgtPm5oX2RldiA9IGRldl9nZXRfYnlfaW5kZXgoZmktPmZpYl9uaC0+bmhfb2lmKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJaWYgKG5oLT5uaF9kZXYgPT0gTlVMTCkKKwkJCWdvdG8gZmFpbHVyZTsKKwl9IGVsc2UgeworCQljaGFuZ2VfbmV4dGhvcHMoZmkpIHsKKwkJCWlmICgoZXJyID0gZG5fZmliX2NoZWNrX25oKHIsIGZpLCBuaCkpICE9IDApCisJCQkJZ290byBmYWlsdXJlOworCQl9IGVuZGZvcl9uZXh0aG9wcyhmaSkKKwl9CisKKwlpZiAoZmktPmZpYl9wcmVmc3JjKSB7CisJCWlmIChyLT5ydG1fdHlwZSAhPSBSVE5fTE9DQUwgfHwgcnRhLT5ydGFfZHN0ID09IE5VTEwgfHwKKwkJICAgIG1lbWNtcCgmZmktPmZpYl9wcmVmc3JjLCBydGEtPnJ0YV9kc3QsIDIpKQorCQkJaWYgKGRuZXRfYWRkcl90eXBlKGZpLT5maWJfcHJlZnNyYykgIT0gUlROX0xPQ0FMKQorCQkJCWdvdG8gZXJyX2ludmFsOworCX0KKworbGlua19pdDoKKwlpZiAoKG9maSA9IGRuX2ZpYl9maW5kX2luZm8oZmkpKSAhPSBOVUxMKSB7CisJCWZpLT5maWJfZGVhZCA9IDE7CisJCWRuX2ZpYl9mcmVlX2luZm8oZmkpOworCQlvZmktPmZpYl90cmVlcmVmKys7CisJCXJldHVybiBvZmk7CisJfQorCisJZmktPmZpYl90cmVlcmVmKys7CisJYXRvbWljX2luYygmZmktPmZpYl9jbG50cmVmKTsKKwl3cml0ZV9sb2NrKCZkbl9maWJfaW5mb19sb2NrKTsKKwlmaS0+ZmliX25leHQgPSBkbl9maWJfaW5mb19saXN0OworCWZpLT5maWJfcHJldiA9IE5VTEw7CisJaWYgKGRuX2ZpYl9pbmZvX2xpc3QpCisJCWRuX2ZpYl9pbmZvX2xpc3QtPmZpYl9wcmV2ID0gZmk7CisJZG5fZmliX2luZm9fbGlzdCA9IGZpOworCXdyaXRlX3VubG9jaygmZG5fZmliX2luZm9fbG9jayk7CisJcmV0dXJuIGZpOworCitlcnJfaW52YWw6CisJZXJyID0gLUVJTlZBTDsKKworZmFpbHVyZToKKwkqZXJycCA9IGVycjsKKwlpZiAoZmkpIHsKKwkJZmktPmZpYl9kZWFkID0gMTsKKwkJZG5fZmliX2ZyZWVfaW5mbyhmaSk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBkbl9maWJfc2VtYW50aWNfbWF0Y2goaW50IHR5cGUsIHN0cnVjdCBkbl9maWJfaW5mbyAqZmksIGNvbnN0IHN0cnVjdCBmbG93aSAqZmwsIHN0cnVjdCBkbl9maWJfcmVzICpyZXMpCit7CisJaW50IGVyciA9IGRuX2ZpYl9wcm9wc1t0eXBlXS5lcnJvcjsKKworCWlmIChlcnIgPT0gMCkgeworCQlpZiAoZmktPmZpYl9mbGFncyAmIFJUTkhfRl9ERUFEKQorCQkJcmV0dXJuIDE7CisKKwkJcmVzLT5maSA9IGZpOworCisJCXN3aXRjaCh0eXBlKSB7CisJCQljYXNlIFJUTl9OQVQ6CisJCQkJRE5fRklCX1JFU19SRVNFVCgqcmVzKTsKKwkJCQlhdG9taWNfaW5jKCZmaS0+ZmliX2NsbnRyZWYpOworCQkJCXJldHVybiAwOworCQkJY2FzZSBSVE5fVU5JQ0FTVDoKKwkJCWNhc2UgUlROX0xPQ0FMOgorCQkJCWZvcl9uZXh0aG9wcyhmaSkgeworCQkJCQlpZiAobmgtPm5oX2ZsYWdzICYgUlROSF9GX0RFQUQpCisJCQkJCQljb250aW51ZTsKKwkJCQkJaWYgKCFmbC0+b2lmIHx8IGZsLT5vaWYgPT0gbmgtPm5oX29pZikKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAobmhzZWwgPCBmaS0+ZmliX25ocykgeworCQkJCQlyZXMtPm5oX3NlbCA9IG5oc2VsOworCQkJCQlhdG9taWNfaW5jKCZmaS0+ZmliX2NsbnRyZWYpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJZW5kZm9yX25leHRob3BzKGZpKTsKKwkJCQlyZXMtPmZpID0gTlVMTDsKKwkJCQlyZXR1cm4gMTsKKwkJCWRlZmF1bHQ6CisJCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQkJIHByaW50aygiREVDbmV0OiBpbXBvc3NpYmxlIHJvdXRpbmcgZXZlbnQgOiBkbl9maWJfc2VtYW50aWNfbWF0Y2ggdHlwZT0lZFxuIiwgdHlwZSk7CisJCQkJcmVzLT5maSA9IE5VTEw7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJcmV0dXJuIGVycjsKK30KKwordm9pZCBkbl9maWJfc2VsZWN0X211bHRpcGF0aChjb25zdCBzdHJ1Y3QgZmxvd2kgKmZsLCBzdHJ1Y3QgZG5fZmliX3JlcyAqcmVzKQoreworCXN0cnVjdCBkbl9maWJfaW5mbyAqZmkgPSByZXMtPmZpOworCWludCB3OworCisJc3Bpbl9sb2NrX2JoKCZkbl9maWJfbXVsdGlwYXRoX2xvY2spOworCWlmIChmaS0+ZmliX3Bvd2VyIDw9IDApIHsKKwkJaW50IHBvd2VyID0gMDsKKwkJY2hhbmdlX25leHRob3BzKGZpKSB7CisJCQlpZiAoIShuaC0+bmhfZmxhZ3MmUlROSF9GX0RFQUQpKSB7CisJCQkJcG93ZXIgKz0gbmgtPm5oX3dlaWdodDsKKwkJCQluaC0+bmhfcG93ZXIgPSBuaC0+bmhfd2VpZ2h0OworCQkJfQorCQl9IGVuZGZvcl9uZXh0aG9wcyhmaSk7CisJCWZpLT5maWJfcG93ZXIgPSBwb3dlcjsKKwkJaWYgKHBvd2VyIDwgMCkgeworCQkJc3Bpbl91bmxvY2tfYmgoJmRuX2ZpYl9tdWx0aXBhdGhfbG9jayk7CisJCQlyZXMtPm5oX3NlbCA9IDA7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwl3ID0gamlmZmllcyAlIGZpLT5maWJfcG93ZXI7CisKKwljaGFuZ2VfbmV4dGhvcHMoZmkpIHsKKwkJaWYgKCEobmgtPm5oX2ZsYWdzJlJUTkhfRl9ERUFEKSAmJiBuaC0+bmhfcG93ZXIpIHsKKwkJCWlmICgodyAtPSBuaC0+bmhfcG93ZXIpIDw9IDApIHsKKwkJCQluaC0+bmhfcG93ZXItLTsKKwkJCQlmaS0+ZmliX3Bvd2VyLS07CisJCQkJcmVzLT5uaF9zZWwgPSBuaHNlbDsKKwkJCQlzcGluX3VubG9ja19iaCgmZG5fZmliX211bHRpcGF0aF9sb2NrKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9IGVuZGZvcl9uZXh0aG9wcyhmaSk7CisJcmVzLT5uaF9zZWwgPSAwOworCXNwaW5fdW5sb2NrX2JoKCZkbl9maWJfbXVsdGlwYXRoX2xvY2spOworfQorCisKK3N0YXRpYyBpbnQgZG5fZmliX2NoZWNrX2F0dHIoc3RydWN0IHJ0bXNnICpyLCBzdHJ1Y3QgcnRhdHRyICoqcnRhKQoreworCWludCBpOworCisJZm9yKGkgPSAxOyBpIDw9IFJUQV9NQVg7IGkrKykgeworCQlzdHJ1Y3QgcnRhdHRyICphdHRyID0gcnRhW2ktMV07CisJCWlmIChhdHRyKSB7CisJCQlpZiAoUlRBX1BBWUxPQUQoYXR0cikgPCA0ICYmIFJUQV9QQVlMT0FEKGF0dHIpICE9IDIpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoaSAhPSBSVEFfTVVMVElQQVRIICYmIGkgIT0gUlRBX01FVFJJQ1MpCisJCQkJcnRhW2ktMV0gPSAoc3RydWN0IHJ0YXR0ciAqKVJUQV9EQVRBKGF0dHIpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBkbl9maWJfcnRtX2RlbHJvdXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpCit7CisJc3RydWN0IGRuX2ZpYl90YWJsZSAqdGI7CisJc3RydWN0IHJ0YXR0ciAqKnJ0YSA9IGFyZzsKKwlzdHJ1Y3QgcnRtc2cgKnIgPSBOTE1TR19EQVRBKG5saCk7CisKKwlpZiAoZG5fZmliX2NoZWNrX2F0dHIociwgcnRhKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0YiA9IGRuX2ZpYl9nZXRfdGFibGUoci0+cnRtX3RhYmxlLCAwKTsKKwlpZiAodGIpCisJCXJldHVybiB0Yi0+ZGVsZXRlKHRiLCByLCAoc3RydWN0IGRuX2tlcm5fcnRhICopcnRhLCBubGgsICZORVRMSU5LX0NCKHNrYikpOworCisJcmV0dXJuIC1FU1JDSDsKK30KKworaW50IGRuX2ZpYl9ydG1fbmV3cm91dGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZG5fZmliX3RhYmxlICp0YjsKKwlzdHJ1Y3QgcnRhdHRyICoqcnRhID0gYXJnOworCXN0cnVjdCBydG1zZyAqciA9IE5MTVNHX0RBVEEobmxoKTsKKworCWlmIChkbl9maWJfY2hlY2tfYXR0cihyLCBydGEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRiID0gZG5fZmliX2dldF90YWJsZShyLT5ydG1fdGFibGUsIDEpOworCWlmICh0YikgCisJCXJldHVybiB0Yi0+aW5zZXJ0KHRiLCByLCAoc3RydWN0IGRuX2tlcm5fcnRhICopcnRhLCBubGgsICZORVRMSU5LX0NCKHNrYikpOworCisJcmV0dXJuIC1FTk9CVUZTOworfQorCisKK2ludCBkbl9maWJfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJaW50IHQ7CisJaW50IHNfdDsKKwlzdHJ1Y3QgZG5fZmliX3RhYmxlICp0YjsKKworCWlmIChOTE1TR19QQVlMT0FEKGNiLT5ubGgsIDApID49IHNpemVvZihzdHJ1Y3QgcnRtc2cpICYmCisJCSgoc3RydWN0IHJ0bXNnICopTkxNU0dfREFUQShjYi0+bmxoKSktPnJ0bV9mbGFncyZSVE1fRl9DTE9ORUQpCisJCQlyZXR1cm4gZG5fY2FjaGVfZHVtcChza2IsIGNiKTsKKworCXNfdCA9IGNiLT5hcmdzWzBdOworCWlmIChzX3QgPT0gMCkKKwkJc190ID0gY2ItPmFyZ3NbMF0gPSBSVF9NSU5fVEFCTEU7CisKKwlmb3IodCA9IHNfdDsgdCA8PSBSVF9UQUJMRV9NQVg7IHQrKykgeworCQlpZiAodCA8IHNfdCkKKwkJCWNvbnRpbnVlOworCQlpZiAodCA+IHNfdCkKKwkJCW1lbXNldCgmY2ItPmFyZ3NbMV0sIDAsIHNpemVvZihjYi0+YXJncyktc2l6ZW9mKGludCkpOworCQl0YiA9IGRuX2ZpYl9nZXRfdGFibGUodCwgMCk7CisJCWlmICh0YiA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWlmICh0Yi0+ZHVtcCh0Yiwgc2tiLCBjYikgPCAwKQorCQkJYnJlYWs7CisJfQorCisJY2ItPmFyZ3NbMF0gPSB0OworCisJcmV0dXJuIHNrYi0+bGVuOworfQorCitzdGF0aWMgdm9pZCBmaWJfbWFnaWMoaW50IGNtZCwgaW50IHR5cGUsIF9fdTE2IGRzdCwgaW50IGRzdF9sZW4sIHN0cnVjdCBkbl9pZmFkZHIgKmlmYSkKK3sKKwlzdHJ1Y3QgZG5fZmliX3RhYmxlICp0YjsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIgbmxoOworCQlzdHJ1Y3QgcnRtc2cgcnRtOworCX0gcmVxOworCXN0cnVjdCBkbl9rZXJuX3J0YSBydGE7CisKKwltZW1zZXQoJnJlcS5ydG0sIDAsIHNpemVvZihyZXEucnRtKSk7CisJbWVtc2V0KCZydGEsIDAsIHNpemVvZihydGEpKTsKKworCWlmICh0eXBlID09IFJUTl9VTklDQVNUKQorCQl0YiA9IGRuX2ZpYl9nZXRfdGFibGUoUlRfTUlOX1RBQkxFLCAxKTsKKwllbHNlCisJCXRiID0gZG5fZmliX2dldF90YWJsZShSVF9UQUJMRV9MT0NBTCwgMSk7CisKKwlpZiAodGIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJcmVxLm5saC5ubG1zZ19sZW4gPSBzaXplb2YocmVxKTsKKwlyZXEubmxoLm5sbXNnX3R5cGUgPSBjbWQ7CisJcmVxLm5saC5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1R8TkxNX0ZfQ1JFQVRFfE5MTV9GX0FQUEVORDsKKwlyZXEubmxoLm5sbXNnX3BpZCA9IDA7CisJcmVxLm5saC5ubG1zZ19zZXEgPSAwOworCisJcmVxLnJ0bS5ydG1fZHN0X2xlbiA9IGRzdF9sZW47CisJcmVxLnJ0bS5ydG1fdGFibGUgPSB0Yi0+bjsKKwlyZXEucnRtLnJ0bV9wcm90b2NvbCA9IFJUUFJPVF9LRVJORUw7CisJcmVxLnJ0bS5ydG1fc2NvcGUgPSAodHlwZSAhPSBSVE5fTE9DQUwgPyBSVF9TQ09QRV9MSU5LIDogUlRfU0NPUEVfSE9TVCk7CisJcmVxLnJ0bS5ydG1fdHlwZSA9IHR5cGU7CisKKwlydGEucnRhX2RzdCA9ICZkc3Q7CisJcnRhLnJ0YV9wcmVmc3JjID0gJmlmYS0+aWZhX2xvY2FsOworCXJ0YS5ydGFfb2lmID0gJmlmYS0+aWZhX2Rldi0+ZGV2LT5pZmluZGV4OworCisJaWYgKGNtZCA9PSBSVE1fTkVXUk9VVEUpCisJCXRiLT5pbnNlcnQodGIsICZyZXEucnRtLCAmcnRhLCAmcmVxLm5saCwgTlVMTCk7CisJZWxzZQorCQl0Yi0+ZGVsZXRlKHRiLCAmcmVxLnJ0bSwgJnJ0YSwgJnJlcS5ubGgsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBkbl9maWJfYWRkX2lmYWRkcihzdHJ1Y3QgZG5faWZhZGRyICppZmEpCit7CisKKwlmaWJfbWFnaWMoUlRNX05FV1JPVVRFLCBSVE5fTE9DQUwsIGlmYS0+aWZhX2xvY2FsLCAxNiwgaWZhKTsKKworI2lmIDAKKwlpZiAoIShkZXYtPmZsYWdzJklGRl9VUCkpCisJCXJldHVybjsKKwkvKiBJbiB0aGUgZnV0dXJlLCB3ZSB3aWxsIHdhbnQgdG8gYWRkIGRlZmF1bHQgcm91dGVzIGhlcmUgKi8KKworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGRuX2ZpYl9kZWxfaWZhZGRyKHN0cnVjdCBkbl9pZmFkZHIgKmlmYSkKK3sKKwlpbnQgZm91bmRfaXQgPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGRuX2RldiAqZG5fZGI7CisJc3RydWN0IGRuX2lmYWRkciAqaWZhMjsKKworCUFTU0VSVF9SVE5MKCk7CisKKwkvKiBTY2FuIGRldmljZSBsaXN0ICovCisJcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKwlmb3IoZGV2ID0gZGV2X2Jhc2U7IGRldjsgZGV2ID0gZGV2LT5uZXh0KSB7CisJCWRuX2RiID0gZGV2LT5kbl9wdHI7CisJCWlmIChkbl9kYiA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWZvcihpZmEyID0gZG5fZGItPmlmYV9saXN0OyBpZmEyOyBpZmEyID0gaWZhMi0+aWZhX25leHQpIHsKKwkJCWlmIChpZmEyLT5pZmFfbG9jYWwgPT0gaWZhLT5pZmFfbG9jYWwpIHsKKwkJCQlmb3VuZF9pdCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOworCisJaWYgKGZvdW5kX2l0ID09IDApIHsKKwkJZmliX21hZ2ljKFJUTV9ERUxST1VURSwgUlROX0xPQ0FMLCBpZmEtPmlmYV9sb2NhbCwgMTYsIGlmYSk7CisKKwkJaWYgKGRuZXRfYWRkcl90eXBlKGlmYS0+aWZhX2xvY2FsKSAhPSBSVE5fTE9DQUwpIHsKKwkJCWlmIChkbl9maWJfc3luY19kb3duKGlmYS0+aWZhX2xvY2FsLCBOVUxMLCAwKSkKKwkJCQlkbl9maWJfZmx1c2goKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZG5fZmliX2Rpc2FibGVfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZm9yY2UpCit7CisJaWYgKGRuX2ZpYl9zeW5jX2Rvd24oMCwgZGV2LCBmb3JjZSkpCisJCWRuX2ZpYl9mbHVzaCgpOworCWRuX3J0X2NhY2hlX2ZsdXNoKDApOworCW5laWdoX2lmZG93bigmZG5fbmVpZ2hfdGFibGUsIGRldik7Cit9CisKK3N0YXRpYyBpbnQgZG5fZmliX2RuYWRkcl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgZG5faWZhZGRyICppZmEgPSAoc3RydWN0IGRuX2lmYWRkciAqKXB0cjsKKworCXN3aXRjaChldmVudCkgeworCQljYXNlIE5FVERFVl9VUDoKKwkJCWRuX2ZpYl9hZGRfaWZhZGRyKGlmYSk7CisJCQlkbl9maWJfc3luY191cChpZmEtPmlmYV9kZXYtPmRldik7CisJCQlkbl9ydF9jYWNoZV9mbHVzaCgtMSk7CisJCQlicmVhazsKKwkJY2FzZSBORVRERVZfRE9XTjoKKwkJCWRuX2ZpYl9kZWxfaWZhZGRyKGlmYSk7CisJCQlpZiAoaWZhLT5pZmFfZGV2ICYmIGlmYS0+aWZhX2Rldi0+aWZhX2xpc3QgPT0gTlVMTCkgeworCQkJCWRuX2ZpYl9kaXNhYmxlX2FkZHIoaWZhLT5pZmFfZGV2LT5kZXYsIDEpOworCQkJfSBlbHNlIHsKKwkJCQlkbl9ydF9jYWNoZV9mbHVzaCgtMSk7CisJCQl9CisJCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitpbnQgZG5fZmliX3N5bmNfZG93bihkbl9hZGRyZXNzIGxvY2FsLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZm9yY2UpCit7CisgICAgICAgIGludCByZXQgPSAwOworICAgICAgICBpbnQgc2NvcGUgPSBSVF9TQ09QRV9OT1dIRVJFOworCisgICAgICAgIGlmIChmb3JjZSkKKyAgICAgICAgICAgICAgICBzY29wZSA9IC0xOworCisgICAgICAgIGZvcl9maWJfaW5mbygpIHsKKyAgICAgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAgICAgKiBUaGlzIG1ha2VzIG5vIHNlbnNlIGZvciBERUNuZXQuLi4uIHdlIHdpbGwgYWxtb3N0CisgICAgICAgICAgICAgICAgICogY2VydGFpbmx5IGhhdmUgbW9yZSB0aGFuIG9uZSBsb2NhbCBhZGRyZXNzIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgICogb3ZlciBhbGwgb3VyIGludGVyZmFjZXMuIEl0IG5lZWRzIHRoaW5raW5nIGFib3V0CisgICAgICAgICAgICAgICAgICogc29tZSBtb3JlLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChsb2NhbCAmJiBmaS0+ZmliX3ByZWZzcmMgPT0gbG9jYWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpLT5maWJfZmxhZ3MgfD0gUlROSF9GX0RFQUQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRldiAmJiBmaS0+ZmliX25ocykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlYWQgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VfbmV4dGhvcHMoZmkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5oLT5uaF9mbGFncyZSVE5IX0ZfREVBRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWFkKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5oLT5uaF9kZXYgPT0gZGV2ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaC0+bmhfc2NvcGUgIT0gc2NvcGUpIHsKKwkJCQkJc3Bpbl9sb2NrX2JoKCZkbl9maWJfbXVsdGlwYXRoX2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5oLT5uaF9mbGFncyB8PSBSVE5IX0ZfREVBRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaS0+ZmliX3Bvd2VyIC09IG5oLT5uaF9wb3dlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaC0+bmhfcG93ZXIgPSAwOworCQkJCQlzcGluX3VubG9ja19iaCgmZG5fZmliX211bHRpcGF0aF9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWFkKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZW5kZm9yX25leHRob3BzKGZpKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYWQgPT0gZmktPmZpYl9uaHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmktPmZpYl9mbGFncyB8PSBSVE5IX0ZfREVBRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVuZGZvcl9maWJfaW5mbygpOworICAgICAgICByZXR1cm4gcmV0OworfQorCisKK2ludCBkbl9maWJfc3luY191cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBpbnQgcmV0ID0gMDsKKworICAgICAgICBpZiAoIShkZXYtPmZsYWdzJklGRl9VUCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgZm9yX2ZpYl9pbmZvKCkgeworICAgICAgICAgICAgICAgIGludCBhbGl2ZSA9IDA7CisKKyAgICAgICAgICAgICAgICBjaGFuZ2VfbmV4dGhvcHMoZmkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG5oLT5uaF9mbGFncyZSVE5IX0ZfREVBRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpdmUrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmgtPm5oX2RldiA9PSBOVUxMIHx8ICEobmgtPm5oX2Rldi0+ZmxhZ3MmSUZGX1VQKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmgtPm5oX2RldiAhPSBkZXYgfHwgZGV2LT5kbl9wdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICBhbGl2ZSsrOworCQkJc3Bpbl9sb2NrX2JoKCZkbl9maWJfbXVsdGlwYXRoX2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgbmgtPm5oX3Bvd2VyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5oLT5uaF9mbGFncyAmPSB+UlROSF9GX0RFQUQ7CisJCQlzcGluX3VubG9ja19iaCgmZG5fZmliX211bHRpcGF0aF9sb2NrKTsKKyAgICAgICAgICAgICAgICB9IGVuZGZvcl9uZXh0aG9wcyhmaSk7CisKKyAgICAgICAgICAgICAgICBpZiAoYWxpdmUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaS0+ZmliX2ZsYWdzICY9IH5SVE5IX0ZfREVBRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbmRmb3JfZmliX2luZm8oKTsKKyAgICAgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBkbl9maWJfZmx1c2godm9pZCkKK3sKKyAgICAgICAgaW50IGZsdXNoZWQgPSAwOworICAgICAgICBzdHJ1Y3QgZG5fZmliX3RhYmxlICp0YjsKKyAgICAgICAgaW50IGlkOworCisgICAgICAgIGZvcihpZCA9IFJUX1RBQkxFX01BWDsgaWQgPiAwOyBpZC0tKSB7CisgICAgICAgICAgICAgICAgaWYgKCh0YiA9IGRuX2ZpYl9nZXRfdGFibGUoaWQsIDApKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgZmx1c2hlZCArPSB0Yi0+Zmx1c2godGIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZsdXNoZWQpCisgICAgICAgICAgICAgICAgZG5fcnRfY2FjaGVfZmx1c2goLTEpOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGRuX2ZpYl9kbmFkZHJfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBkbl9maWJfZG5hZGRyX2V2ZW50LAorfTsKKwordm9pZCBfX2V4aXQgZG5fZmliX2NsZWFudXAodm9pZCkKK3sKKwlkbl9maWJfdGFibGVfY2xlYW51cCgpOworCWRuX2ZpYl9ydWxlc19jbGVhbnVwKCk7CisKKwl1bnJlZ2lzdGVyX2RuYWRkcl9ub3RpZmllcigmZG5fZmliX2RuYWRkcl9ub3RpZmllcik7Cit9CisKKwordm9pZCBfX2luaXQgZG5fZmliX2luaXQodm9pZCkKK3sKKworCWRuX2ZpYl90YWJsZV9pbml0KCk7CisJZG5fZmliX3J1bGVzX2luaXQoKTsKKworCXJlZ2lzdGVyX2RuYWRkcl9ub3RpZmllcigmZG5fZmliX2RuYWRkcl9ub3RpZmllcik7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl9uZWlnaC5jIGIvbmV0L2RlY25ldC9kbl9uZWlnaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZGZlOTYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvZGVjbmV0L2RuX25laWdoLmMKQEAgLTAsMCArMSw2MjcgQEAKKy8qCisgKiBERUNuZXQgICAgICAgQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIERFQ25ldCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKiAgICAgICAgICAgICAgb3BlcmF0aW5nIHN5c3RlbS4gIERFQ25ldCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqICAgICAgICAgICAgICBpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKiAgICAgICAgICAgICAgREVDbmV0IE5laWdoYm91ciBGdW5jdGlvbnMgKEFkamFjZW5jeSBEYXRhYmFzZSBhbmQgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT24tRXRoZXJuZXQgQ2FjaGUpCisgKgorICogQXV0aG9yOiAgICAgIFN0ZXZlIFdoaXRlaG91c2UgPFN0ZXZlV0BBQ00ub3JnPgorICoKKyAqCisgKiBDaGFuZ2VzOgorICogICAgIFN0ZXZlIFdoaXRlaG91c2UgICAgIDogRml4ZWQgcm91dGVyIGxpc3Rpbmcgcm91dGluZQorICogICAgIFN0ZXZlIFdoaXRlaG91c2UgICAgIDogQWRkZWQgZXJyb3JfcmVwb3J0IGZ1bmN0aW9ucworICogICAgIFN0ZXZlIFdoaXRlaG91c2UgICAgIDogQWRkZWQgZGVmYXVsdCByb3V0ZXIgZGV0ZWN0aW9uCisgKiAgICAgU3RldmUgV2hpdGVob3VzZSAgICAgOiBIb3AgY291bnRzIGluIG91dGdvaW5nIG1lc3NhZ2VzCisgKiAgICAgU3RldmUgV2hpdGVob3VzZSAgICAgOiBGaXhlZCBzcmMvZHN0IGluIG91dGdvaW5nIG1lc3NhZ2VzIHNvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3J3YXJkaW5nIG5vdyBzdGFuZHMgYSBnb29kIGNoYW5jZSBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZy4KKyAqICAgICBTdGV2ZSBXaGl0ZWhvdXNlICAgICA6IEZpeGVkIG5laWdoYm91ciBzdGF0ZXMgKGZvciBub3cgYW55d2F5KS4KKyAqICAgICBTdGV2ZSBXaGl0ZWhvdXNlICAgICA6IE1hZGUgZXJyb3JfcmVwb3J0IGZ1bmN0aW9ucyBkdW1taWVzLiBUaGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgdGhlIHJpZ2h0IHBsYWNlIHRvIHJldHVybiBza2JzLgorICogICAgIFN0ZXZlIFdoaXRlaG91c2UgICAgIDogQ29udmVydCB0byBzZXFfZmlsZQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9kZWNuZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxuZXQvbmVpZ2hib3VyLmg+CisjaW5jbHVkZSA8bmV0L2RzdC5oPgorI2luY2x1ZGUgPG5ldC9mbG93Lmg+CisjaW5jbHVkZSA8bmV0L2RuLmg+CisjaW5jbHVkZSA8bmV0L2RuX2Rldi5oPgorI2luY2x1ZGUgPG5ldC9kbl9uZWlnaC5oPgorI2luY2x1ZGUgPG5ldC9kbl9yb3V0ZS5oPgorCitzdGF0aWMgdTMyIGRuX25laWdoX2hhc2goY29uc3Qgdm9pZCAqcGtleSwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGRuX25laWdoX2NvbnN0cnVjdChzdHJ1Y3QgbmVpZ2hib3VyICopOworc3RhdGljIHZvaWQgZG5fbG9uZ19lcnJvcl9yZXBvcnQoc3RydWN0IG5laWdoYm91ciAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKK3N0YXRpYyB2b2lkIGRuX3Nob3J0X2Vycm9yX3JlcG9ydChzdHJ1Y3QgbmVpZ2hib3VyICosIHN0cnVjdCBza19idWZmICopOworc3RhdGljIGludCBkbl9sb25nX291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqKTsKK3N0YXRpYyBpbnQgZG5fc2hvcnRfb3V0cHV0KHN0cnVjdCBza19idWZmICopOworc3RhdGljIGludCBkbl9waGFzZTNfb3V0cHV0KHN0cnVjdCBza19idWZmICopOworCisKKy8qCisgKiBGb3IgdGFsa2luZyB0byBicm9hZGNhc3QgZGV2aWNlczogRXRoZXJuZXQgJiBQUFAKKyAqLworc3RhdGljIHN0cnVjdCBuZWlnaF9vcHMgZG5fbG9uZ19vcHMgPSB7CisJLmZhbWlseSA9CQlBRl9ERUNuZXQsCisJLmVycm9yX3JlcG9ydCA9CQlkbl9sb25nX2Vycm9yX3JlcG9ydCwKKwkub3V0cHV0ID0JCWRuX2xvbmdfb3V0cHV0LAorCS5jb25uZWN0ZWRfb3V0cHV0ID0JZG5fbG9uZ19vdXRwdXQsCisJLmhoX291dHB1dCA9CQlkZXZfcXVldWVfeG1pdCwKKwkucXVldWVfeG1pdCA9CQlkZXZfcXVldWVfeG1pdCwKK307CisKKy8qCisgKiBGb3IgdGFsa2luZyB0byBwb2ludG9wb2ludCBhbmQgbXVsdGlkcm9wIGRldmljZXM6IEREQ01QIGFuZCBYLjI1CisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmVpZ2hfb3BzIGRuX3Nob3J0X29wcyA9IHsKKwkuZmFtaWx5ID0JCUFGX0RFQ25ldCwKKwkuZXJyb3JfcmVwb3J0ID0JCWRuX3Nob3J0X2Vycm9yX3JlcG9ydCwKKwkub3V0cHV0ID0JCWRuX3Nob3J0X291dHB1dCwKKwkuY29ubmVjdGVkX291dHB1dCA9CWRuX3Nob3J0X291dHB1dCwKKwkuaGhfb3V0cHV0ID0JCWRldl9xdWV1ZV94bWl0LAorCS5xdWV1ZV94bWl0ID0JCWRldl9xdWV1ZV94bWl0LAorfTsKKworLyoKKyAqIEZvciB0YWxraW5nIHRvIERFQ25ldCBwaGFzZSBJSUkgbm9kZXMKKyAqLworc3RhdGljIHN0cnVjdCBuZWlnaF9vcHMgZG5fcGhhc2UzX29wcyA9IHsKKwkuZmFtaWx5ID0JCUFGX0RFQ25ldCwKKwkuZXJyb3JfcmVwb3J0ID0JCWRuX3Nob3J0X2Vycm9yX3JlcG9ydCwgLyogQ2FuIHVzZSBzaG9ydCB2ZXJzaW9uIGhlcmUgKi8KKwkub3V0cHV0ID0JCWRuX3BoYXNlM19vdXRwdXQsCisJLmNvbm5lY3RlZF9vdXRwdXQgPQlkbl9waGFzZTNfb3V0cHV0LAorCS5oaF9vdXRwdXQgPQkJZGV2X3F1ZXVlX3htaXQsCisJLnF1ZXVlX3htaXQgPQkJZGV2X3F1ZXVlX3htaXQKK307CisKK3N0cnVjdCBuZWlnaF90YWJsZSBkbl9uZWlnaF90YWJsZSA9IHsKKwkuZmFtaWx5ID0JCQlQRl9ERUNuZXQsCisJLmVudHJ5X3NpemUgPQkJCXNpemVvZihzdHJ1Y3QgZG5fbmVpZ2gpLAorCS5rZXlfbGVuID0JCQlzaXplb2YoZG5fYWRkcmVzcyksCisJLmhhc2ggPQkJCQlkbl9uZWlnaF9oYXNoLAorCS5jb25zdHJ1Y3RvciA9CQkJZG5fbmVpZ2hfY29uc3RydWN0LAorCS5pZCA9CQkJCSJkbl9uZWlnaF9jYWNoZSIsCisJLnBhcm1zID17CisJCS50YmwgPQkJCSZkbl9uZWlnaF90YWJsZSwKKwkJLmVudHJpZXMgPQkJMCwKKwkJLmJhc2VfcmVhY2hhYmxlX3RpbWUgPQkzMCAqIEhaLAorCQkucmV0cmFuc190aW1lID0JMSAqIEhaLAorCQkuZ2Nfc3RhbGV0aW1lID0JNjAgKiBIWiwKKwkJLnJlYWNoYWJsZV90aW1lID0JCTMwICogSFosCisJCS5kZWxheV9wcm9iZV90aW1lID0JNSAqIEhaLAorCQkucXVldWVfbGVuID0JCTMsCisJCS51Y2FzdF9wcm9iZXMgPQkwLAorCQkuYXBwX3Byb2JlcyA9CQkwLAorCQkubWNhc3RfcHJvYmVzID0JMCwKKwkJLmFueWNhc3RfZGVsYXkgPQkwLAorCQkucHJveHlfZGVsYXkgPQkJMCwKKwkJLnByb3h5X3FsZW4gPQkJMCwKKwkJLmxvY2t0aW1lID0JCTEgKiBIWiwKKwl9LAorCS5nY19pbnRlcnZhbCA9CQkJMzAgKiBIWiwKKwkuZ2NfdGhyZXNoMSA9CQkJMTI4LAorCS5nY190aHJlc2gyID0JCQk1MTIsCisJLmdjX3RocmVzaDMgPQkJCTEwMjQsCit9OworCitzdGF0aWMgdTMyIGRuX25laWdoX2hhc2goY29uc3Qgdm9pZCAqcGtleSwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gamhhc2hfMndvcmRzKCooZG5fYWRkcmVzcyAqKXBrZXksIDAsIGRuX25laWdoX3RhYmxlLmhhc2hfcm5kKTsKK30KKworc3RhdGljIGludCBkbl9uZWlnaF9jb25zdHJ1Y3Qoc3RydWN0IG5laWdoYm91ciAqbmVpZ2gpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5laWdoLT5kZXY7CisJc3RydWN0IGRuX25laWdoICpkbiA9IChzdHJ1Y3QgZG5fbmVpZ2ggKiluZWlnaDsKKwlzdHJ1Y3QgZG5fZGV2ICpkbl9kYjsKKwlzdHJ1Y3QgbmVpZ2hfcGFybXMgKnBhcm1zOworCisJcmN1X3JlYWRfbG9jaygpOworCWRuX2RiID0gcmN1X2RlcmVmZXJlbmNlKGRldi0+ZG5fcHRyKTsKKwlpZiAoZG5fZGIgPT0gTlVMTCkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGFybXMgPSBkbl9kYi0+bmVpZ2hfcGFybXM7CisJaWYgKCFwYXJtcykgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJX19uZWlnaF9wYXJtc19wdXQobmVpZ2gtPnBhcm1zKTsKKwluZWlnaC0+cGFybXMgPSBuZWlnaF9wYXJtc19jbG9uZShwYXJtcyk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlpZiAoZG5fZGItPnVzZV9sb25nKQorCQluZWlnaC0+b3BzID0gJmRuX2xvbmdfb3BzOworCWVsc2UKKwkJbmVpZ2gtPm9wcyA9ICZkbl9zaG9ydF9vcHM7CisKKwlpZiAoZG4tPmZsYWdzICYgRE5fTkRGTEFHX1AzKQorCQluZWlnaC0+b3BzID0gJmRuX3BoYXNlM19vcHM7CisKKwluZWlnaC0+bnVkX3N0YXRlID0gTlVEX05PQVJQOworCW5laWdoLT5vdXRwdXQgPSBuZWlnaC0+b3BzLT5jb25uZWN0ZWRfb3V0cHV0OworCisJaWYgKChkZXYtPnR5cGUgPT0gQVJQSFJEX0lQR1JFKSB8fCAoZGV2LT5mbGFncyAmIElGRl9QT0lOVE9QT0lOVCkpCisJCW1lbWNweShuZWlnaC0+aGEsIGRldi0+YnJvYWRjYXN0LCBkZXYtPmFkZHJfbGVuKTsKKwllbHNlIGlmICgoZGV2LT50eXBlID09IEFSUEhSRF9FVEhFUikgfHwgKGRldi0+dHlwZSA9PSBBUlBIUkRfTE9PUEJBQ0spKQorCQlkbl9kbjJldGgobmVpZ2gtPmhhLCBkbi0+YWRkcik7CisJZWxzZSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiVHJ5aW5nIHRvIGNyZWF0ZSBuZWlnaCBmb3IgaHcgJWRcbiIsICBkZXYtPnR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIE1ha2UgYW4gZXN0aW1hdGUgb2YgdGhlIHJlbW90ZSBibG9jayBzaXplIGJ5IGFzc3VtaW5nIHRoYXQgaXRzCisJICogdHdvIGxlc3MgdGhlbiB0aGUgZGV2aWNlIG10dSwgd2hpY2ggaXQgdHJ1ZSBmb3IgZXRoZXJuZXQgKGFuZAorCSAqIG90aGVyIHRoaW5ncyB3aGljaCBzdXBwb3J0IGxvbmcgZm9ybWF0IGhlYWRlcnMpIHNpbmNlIHRoZXJlIGlzCisJICogYW4gZXh0cmEgbGVuZ3RoIGZpZWxkIChvZiAxNiBiaXRzKSB3aGljaCBpc24ndCBwYXJ0IG9mIHRoZQorCSAqIGV0aGVybmV0IGhlYWRlcnMgYW5kIHdoaWNoIHRoZSBERUNuZXQgc3BlY3Mgd29uJ3QgYWRtaXQgaXMgcGFydAorCSAqIG9mIHRoZSBERUNuZXQgcm91dGluZyBoZWFkZXJzIGVpdGhlci4KKwkgKgorCSAqIElmIHdlIG92ZXIgZXN0aW1hdGUgaGVyZSBpdHMgbm8gYmlnIGRlYWwsIHRoZSBOU1AgbmVnb3RpYXRpb25zCisJICogd2lsbCBwcmV2ZW50IHVzIGZyb20gc2VuZGluZyBwYWNrZXRzIHdoaWNoIGFyZSB0b28gbGFyZ2UgZm9yIHRoZQorCSAqIHJlbW90ZSBub2RlIHRvIGhhbmRsZS4gSW4gYW55IGNhc2UgdGhpcyBmaWd1cmUgaXMgbm9ybWFsbHkgdXBkYXRlZAorCSAqIGJ5IGEgaGVsbG8gbWVzc2FnZSBpbiBtb3N0IGNhc2VzLgorCSAqLworCWRuLT5ibGtzaXplID0gZGV2LT5tdHUgLSAyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRuX2xvbmdfZXJyb3JfcmVwb3J0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXByaW50ayhLRVJOX0RFQlVHICJkbl9sb25nX2Vycm9yX3JlcG9ydDogY2FsbGVkXG4iKTsKKwlrZnJlZV9za2Ioc2tiKTsKK30KKworCitzdGF0aWMgdm9pZCBkbl9zaG9ydF9lcnJvcl9yZXBvcnQoc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgImRuX3Nob3J0X2Vycm9yX3JlcG9ydDogY2FsbGVkXG4iKTsKKwlrZnJlZV9za2Ioc2tiKTsKK30KKworc3RhdGljIGludCBkbl9uZWlnaF9vdXRwdXRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiLT5kc3Q7CisJc3RydWN0IGRuX3JvdXRlICpydCA9IChzdHJ1Y3QgZG5fcm91dGUgKilkc3Q7CisJc3RydWN0IG5laWdoYm91ciAqbmVpZ2ggPSBkc3QtPm5laWdoYm91cjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmVpZ2gtPmRldjsKKwljaGFyIG1hY19hZGRyW0VUSF9BTEVOXTsKKworCWRuX2RuMmV0aChtYWNfYWRkciwgcnQtPnJ0X2xvY2FsX3NyYyk7CisJaWYgKCFkZXYtPmhhcmRfaGVhZGVyIHx8IGRldi0+aGFyZF9oZWFkZXIoc2tiLCBkZXYsIG50b2hzKHNrYi0+cHJvdG9jb2wpLCBuZWlnaC0+aGEsIG1hY19hZGRyLCBza2ItPmxlbikgPj0gMCkKKwkJcmV0dXJuIG5laWdoLT5vcHMtPnF1ZXVlX3htaXQoc2tiKTsKKworCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCXByaW50ayhLRVJOX0RFQlVHICJkbl9uZWlnaF9vdXRwdXRfcGFja2V0OiBvb3BzLCBjYW4ndCBzZW5kIHBhY2tldFxuIik7CisKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBkbl9sb25nX291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYi0+ZHN0OworCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoID0gZHN0LT5uZWlnaGJvdXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5laWdoLT5kZXY7CisJaW50IGhlYWRyb29tID0gZGV2LT5oYXJkX2hlYWRlcl9sZW4gKyBzaXplb2Yoc3RydWN0IGRuX2xvbmdfcGFja2V0KSArIDM7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwlzdHJ1Y3QgZG5fbG9uZ19wYWNrZXQgKmxwOworCXN0cnVjdCBkbl9za2JfY2IgKmNiID0gRE5fU0tCX0NCKHNrYik7CisKKworCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IGhlYWRyb29tKSB7CisJCXN0cnVjdCBza19idWZmICpza2IyID0gc2tiX3JlYWxsb2NfaGVhZHJvb20oc2tiLCBoZWFkcm9vbSk7CisJCWlmIChza2IyID09IE5VTEwpIHsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJcHJpbnRrKEtFUk5fQ1JJVCAiZG5fbG9uZ19vdXRwdXQ6IG5vIG1lbW9yeVxuIik7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCQlrZnJlZV9za2Ioc2tiKTsKKwkJc2tiID0gc2tiMjsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX0lORk8gImRuX2xvbmdfb3V0cHV0OiBJbmNyZWFzaW5nIGhlYWRyb29tXG4iKTsKKwl9CisKKwlkYXRhID0gc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGRuX2xvbmdfcGFja2V0KSArIDMpOworCWxwID0gKHN0cnVjdCBkbl9sb25nX3BhY2tldCAqKShkYXRhKzMpOworCisJKigodW5zaWduZWQgc2hvcnQgKilkYXRhKSA9IGRuX2h0b25zKHNrYi0+bGVuIC0gMik7CisJKihkYXRhICsgMikgPSAxIHwgRE5fUlRfRl9QRjsgLyogUGFkZGluZyAqLworCisJbHAtPm1zZ2ZsZyAgID0gRE5fUlRfUEtUX0xPTkd8KGNiLT5ydF9mbGFncyYoRE5fUlRfRl9JRXxETl9SVF9GX1JRUnxETl9SVF9GX1JUUykpOworCWxwLT5kX2FyZWEgICA9IGxwLT5kX3N1YmFyZWEgPSAwOworCWRuX2RuMmV0aChscC0+ZF9pZCwgZG5fbnRvaHMoY2ItPmRzdCkpOworCWxwLT5zX2FyZWEgICA9IGxwLT5zX3N1YmFyZWEgPSAwOworCWRuX2RuMmV0aChscC0+c19pZCwgZG5fbnRvaHMoY2ItPnNyYykpOworCWxwLT5ubDIgICAgICA9IDA7CisJbHAtPnZpc2l0X2N0ID0gY2ItPmhvcHMgJiAweDNmOworCWxwLT5zX2NsYXNzICA9IDA7CisJbHAtPnB0ICAgICAgID0gMDsKKworCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCisJcmV0dXJuIE5GX0hPT0soUEZfREVDbmV0LCBORl9ETl9QT1NUX1JPVVRJTkcsIHNrYiwgTlVMTCwgbmVpZ2gtPmRldiwgZG5fbmVpZ2hfb3V0cHV0X3BhY2tldCk7Cit9CisKK3N0YXRpYyBpbnQgZG5fc2hvcnRfb3V0cHV0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiLT5kc3Q7CisJc3RydWN0IG5laWdoYm91ciAqbmVpZ2ggPSBkc3QtPm5laWdoYm91cjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmVpZ2gtPmRldjsKKwlpbnQgaGVhZHJvb20gPSBkZXYtPmhhcmRfaGVhZGVyX2xlbiArIHNpemVvZihzdHJ1Y3QgZG5fc2hvcnRfcGFja2V0KSArIDI7CisJc3RydWN0IGRuX3Nob3J0X3BhY2tldCAqc3A7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwlzdHJ1Y3QgZG5fc2tiX2NiICpjYiA9IEROX1NLQl9DQihza2IpOworCisKKyAgICAgICAgaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgaGVhZHJvb20pIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IHNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwgaGVhZHJvb20pOworICAgICAgICAgICAgICAgIGlmIChza2IyID09IE5VTEwpIHsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAJcHJpbnRrKEtFUk5fQ1JJVCAiZG5fc2hvcnRfb3V0cHV0OiBubyBtZW1vcnlcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAga2ZyZWVfc2tiKHNrYik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0JVRlM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGtmcmVlX3NrYihza2IpOworICAgICAgICAgICAgICAgIHNrYiA9IHNrYjI7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisgICAgICAgICAgICAgICAgCXByaW50ayhLRVJOX0lORk8gImRuX3Nob3J0X291dHB1dDogSW5jcmVhc2luZyBoZWFkcm9vbVxuIik7CisgICAgICAgIH0KKworCWRhdGEgPSBza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgZG5fc2hvcnRfcGFja2V0KSArIDIpOworCSooKHVuc2lnbmVkIHNob3J0ICopZGF0YSkgPSBkbl9odG9ucyhza2ItPmxlbiAtIDIpOworCXNwID0gKHN0cnVjdCBkbl9zaG9ydF9wYWNrZXQgKikoZGF0YSsyKTsKKworCXNwLT5tc2dmbGcgICAgID0gRE5fUlRfUEtUX1NIT1JUfChjYi0+cnRfZmxhZ3MmKEROX1JUX0ZfUlFSfEROX1JUX0ZfUlRTKSk7CisJc3AtPmRzdG5vZGUgICAgPSBjYi0+ZHN0OworCXNwLT5zcmNub2RlICAgID0gY2ItPnNyYzsKKwlzcC0+Zm9yd2FyZCAgICA9IGNiLT5ob3BzICYgMHgzZjsKKworCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCisJcmV0dXJuIE5GX0hPT0soUEZfREVDbmV0LCBORl9ETl9QT1NUX1JPVVRJTkcsIHNrYiwgTlVMTCwgbmVpZ2gtPmRldiwgZG5fbmVpZ2hfb3V0cHV0X3BhY2tldCk7Cit9CisKKy8qCisgKiBQaGFzZSAzIG91dHB1dCBpcyB0aGUgc2FtZSBpcyBzaG9ydCBvdXRwdXQsIGV4ZWNwdCB0aGF0CisgKiBpdCBjbGVhcnMgdGhlIGFyZWEgYml0cyBiZWZvcmUgdHJhbnNtaXNzaW9uLgorICovCitzdGF0aWMgaW50IGRuX3BoYXNlM19vdXRwdXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2ItPmRzdDsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCA9IGRzdC0+bmVpZ2hib3VyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZWlnaC0+ZGV2OworCWludCBoZWFkcm9vbSA9IGRldi0+aGFyZF9oZWFkZXJfbGVuICsgc2l6ZW9mKHN0cnVjdCBkbl9zaG9ydF9wYWNrZXQpICsgMjsKKwlzdHJ1Y3QgZG5fc2hvcnRfcGFja2V0ICpzcDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCXN0cnVjdCBkbl9za2JfY2IgKmNiID0gRE5fU0tCX0NCKHNrYik7CisKKwlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCBoZWFkcm9vbSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IHNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwgaGVhZHJvb20pOworCQlpZiAoc2tiMiA9PSBOVUxMKSB7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCXByaW50ayhLRVJOX0NSSVQgImRuX3BoYXNlM19vdXRwdXQ6IG5vIG1lbW9yeVxuIik7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCQlrZnJlZV9za2Ioc2tiKTsKKwkJc2tiID0gc2tiMjsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX0lORk8gImRuX3BoYXNlM19vdXRwdXQ6IEluY3JlYXNpbmcgaGVhZHJvb21cbiIpOworCX0KKworCWRhdGEgPSBza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgZG5fc2hvcnRfcGFja2V0KSArIDIpOworCSooKHVuc2lnbmVkIHNob3J0ICopZGF0YSkgPSBkbl9odG9ucyhza2ItPmxlbiAtIDIpOworCXNwID0gKHN0cnVjdCBkbl9zaG9ydF9wYWNrZXQgKikoZGF0YSArIDIpOworCisJc3AtPm1zZ2ZsZyAgID0gRE5fUlRfUEtUX1NIT1JUfChjYi0+cnRfZmxhZ3MmKEROX1JUX0ZfUlFSfEROX1JUX0ZfUlRTKSk7CisJc3AtPmRzdG5vZGUgID0gY2ItPmRzdCAmIGRuX2h0b25zKDB4MDNmZik7CisJc3AtPnNyY25vZGUgID0gY2ItPnNyYyAmIGRuX2h0b25zKDB4MDNmZik7CisJc3AtPmZvcndhcmQgID0gY2ItPmhvcHMgJiAweDNmOworCisJc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisKKwlyZXR1cm4gTkZfSE9PSyhQRl9ERUNuZXQsIE5GX0ROX1BPU1RfUk9VVElORywgc2tiLCBOVUxMLCBuZWlnaC0+ZGV2LCBkbl9uZWlnaF9vdXRwdXRfcGFja2V0KTsKK30KKworLyoKKyAqIFVuZm9ydHVuYXRlbHksIHRoZSBuZWlnaGJvdXIgY29kZSB1c2VzIHRoZSBkZXZpY2UgaW4gaXRzIGhhc2gKKyAqIGZ1bmN0aW9uLCBzbyB3ZSBkb24ndCBnZXQgYW55IGFkdmFudGFnZSBmcm9tIGl0LiBUaGlzIGZ1bmN0aW9uCisgKiBiYXNpY2FsbHkgZG9lcyBhIG5laWdoX2xvb2t1cCgpLCBidXQgd2l0aG91dCBjb21wYXJpbmcgdGhlIGRldmljZQorICogZmllbGQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHRoZSBPbi1FdGhlcm5ldCBjYWNoZQorICovCisKKy8qCisgKiBQb2ludG9wb2ludCBsaW5rIHJlY2VpdmVzIGEgaGVsbG8gbWVzc2FnZQorICovCit2b2lkIGRuX25laWdoX3BvaW50b3BvaW50X2hlbGxvKHN0cnVjdCBza19idWZmICpza2IpCit7CisJa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qCisgKiBFdGhlcm5ldCByb3V0ZXIgaGVsbG8gbWVzc2FnZSByZWNlaXZlZAorICovCitpbnQgZG5fbmVpZ2hfcm91dGVyX2hlbGxvKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHJ0bm9kZV9oZWxsb19tZXNzYWdlICptc2cgPSAoc3RydWN0IHJ0bm9kZV9oZWxsb19tZXNzYWdlICopc2tiLT5kYXRhOworCisJc3RydWN0IG5laWdoYm91ciAqbmVpZ2g7CisJc3RydWN0IGRuX25laWdoICpkbjsKKwlzdHJ1Y3QgZG5fZGV2ICpkbl9kYjsKKwlkbl9hZGRyZXNzIHNyYzsKKworCXNyYyA9IGRuX2h0b25zKGRuX2V0aDJkbihtc2ctPmlkKSk7CisKKwluZWlnaCA9IF9fbmVpZ2hfbG9va3VwKCZkbl9uZWlnaF90YWJsZSwgJnNyYywgc2tiLT5kZXYsIDEpOworCisJZG4gPSAoc3RydWN0IGRuX25laWdoICopbmVpZ2g7CisKKwlpZiAobmVpZ2gpIHsKKwkJd3JpdGVfbG9jaygmbmVpZ2gtPmxvY2spOworCisJCW5laWdoLT51c2VkID0gamlmZmllczsKKwkJZG5fZGIgPSAoc3RydWN0IGRuX2RldiAqKW5laWdoLT5kZXYtPmRuX3B0cjsKKworCQlpZiAoIShuZWlnaC0+bnVkX3N0YXRlICYgTlVEX1BFUk1BTkVOVCkpIHsKKwkJCW5laWdoLT51cGRhdGVkID0gamlmZmllczsKKworCQkJaWYgKG5laWdoLT5kZXYtPnR5cGUgPT0gQVJQSFJEX0VUSEVSKQorCQkJCW1lbWNweShuZWlnaC0+aGEsICZldGhfaGRyKHNrYiktPmhfc291cmNlLCBFVEhfQUxFTik7CisKKwkJCWRuLT5ibGtzaXplICA9IGRuX250b2hzKG1zZy0+Ymxrc2l6ZSk7CisJCQlkbi0+cHJpb3JpdHkgPSBtc2ctPnByaW9yaXR5OworCisJCQlkbi0+ZmxhZ3MgJj0gfkROX05ERkxBR19QMzsKKworCQkJc3dpdGNoKG1zZy0+aWluZm8gJiBETl9SVF9JTkZPX1RZUEUpIHsKKwkJCQljYXNlIEROX1JUX0lORk9fTDFSVDoKKwkJCQkJZG4tPmZsYWdzICY9fkROX05ERkxBR19SMjsKKwkJCQkJZG4tPmZsYWdzIHw9IEROX05ERkxBR19SMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBETl9SVF9JTkZPX0wyUlQ6CisJCQkJCWRuLT5mbGFncyB8PSBETl9OREZMQUdfUjI7CisJCQl9CisJCX0KKworCQlpZiAoIWRuX2RiLT5yb3V0ZXIpIHsKKwkJCWRuX2RiLT5yb3V0ZXIgPSBuZWlnaF9jbG9uZShuZWlnaCk7CisJCX0gZWxzZSB7CisJCQlpZiAobXNnLT5wcmlvcml0eSA+ICgoc3RydWN0IGRuX25laWdoICopZG5fZGItPnJvdXRlciktPnByaW9yaXR5KQorCQkJCW5laWdoX3JlbGVhc2UoeGNoZygmZG5fZGItPnJvdXRlciwgbmVpZ2hfY2xvbmUobmVpZ2gpKSk7CisJCX0KKwkJd3JpdGVfdW5sb2NrKCZuZWlnaC0+bG9jayk7CisJCW5laWdoX3JlbGVhc2UobmVpZ2gpOworCX0KKworCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCisvKgorICogRW5kbm9kZSBoZWxsbyBtZXNzYWdlIHJlY2VpdmVkCisgKi8KK2ludCBkbl9uZWlnaF9lbmRub2RlX2hlbGxvKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGVuZG5vZGVfaGVsbG9fbWVzc2FnZSAqbXNnID0gKHN0cnVjdCBlbmRub2RlX2hlbGxvX21lc3NhZ2UgKilza2ItPmRhdGE7CisJc3RydWN0IG5laWdoYm91ciAqbmVpZ2g7CisJc3RydWN0IGRuX25laWdoICpkbjsKKwlkbl9hZGRyZXNzIHNyYzsKKworCXNyYyA9IGRuX2h0b25zKGRuX2V0aDJkbihtc2ctPmlkKSk7CisKKwluZWlnaCA9IF9fbmVpZ2hfbG9va3VwKCZkbl9uZWlnaF90YWJsZSwgJnNyYywgc2tiLT5kZXYsIDEpOworCisJZG4gPSAoc3RydWN0IGRuX25laWdoICopbmVpZ2g7CisKKwlpZiAobmVpZ2gpIHsKKwkJd3JpdGVfbG9jaygmbmVpZ2gtPmxvY2spOworCisJCW5laWdoLT51c2VkID0gamlmZmllczsKKworCQlpZiAoIShuZWlnaC0+bnVkX3N0YXRlICYgTlVEX1BFUk1BTkVOVCkpIHsKKwkJCW5laWdoLT51cGRhdGVkID0gamlmZmllczsKKworCQkJaWYgKG5laWdoLT5kZXYtPnR5cGUgPT0gQVJQSFJEX0VUSEVSKQorCQkJCW1lbWNweShuZWlnaC0+aGEsICZldGhfaGRyKHNrYiktPmhfc291cmNlLCBFVEhfQUxFTik7CisJCQlkbi0+ZmxhZ3MgICAmPSB+KEROX05ERkxBR19SMSB8IEROX05ERkxBR19SMik7CisJCQlkbi0+Ymxrc2l6ZSAgPSBkbl9udG9ocyhtc2ctPmJsa3NpemUpOworCQkJZG4tPnByaW9yaXR5ID0gMDsKKwkJfQorCisJCXdyaXRlX3VubG9jaygmbmVpZ2gtPmxvY2spOworCQluZWlnaF9yZWxlYXNlKG5laWdoKTsKKwl9CisKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNoYXIgKmRuX2ZpbmRfc2xvdChjaGFyICpiYXNlLCBpbnQgbWF4LCBpbnQgcHJpb3JpdHkpCit7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciAqbWluID0gTlVMTDsKKworCWJhc2UgKz0gNjsgLyogc2tpcCBmaXJzdCBpZCAqLworCisJZm9yKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKwkJaWYgKCFtaW4gfHwgKCpiYXNlIDwgKm1pbikpCisJCQltaW4gPSBiYXNlOworCQliYXNlICs9IDc7IC8qIGZpbmQgbmV4dCBwcmlvcml0eSAqLworCX0KKworCWlmICghbWluKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiAoKm1pbiA8IHByaW9yaXR5KSA/IChtaW4gLSA2KSA6IE5VTEw7Cit9CisKK3N0cnVjdCBlbGlzdF9jYl9zdGF0ZSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisJdW5zaWduZWQgY2hhciAqcnM7CisJaW50IHQsIG47Cit9OworCitzdGF0aWMgdm9pZCBuZWlnaF9lbGlzdF9jYihzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgdm9pZCAqX2luZm8pCit7CisJc3RydWN0IGVsaXN0X2NiX3N0YXRlICpzID0gX2luZm87CisJc3RydWN0IGRuX2RldiAqZG5fZGI7CisJc3RydWN0IGRuX25laWdoICpkbjsKKworCWlmIChuZWlnaC0+ZGV2ICE9IHMtPmRldikKKwkJcmV0dXJuOworCisJZG4gPSAoc3RydWN0IGRuX25laWdoICopIG5laWdoOworCWlmICghKGRuLT5mbGFncyAmIChETl9OREZMQUdfUjF8RE5fTkRGTEFHX1IyKSkpCisJCXJldHVybjsKKworCWRuX2RiID0gKHN0cnVjdCBkbl9kZXYgKikgcy0+ZGV2LT5kbl9wdHI7CisJaWYgKGRuX2RiLT5wYXJtcy5mb3J3YXJkaW5nID09IDEgJiYgKGRuLT5mbGFncyAmIEROX05ERkxBR19SMikpCisJCXJldHVybjsKKworCWlmIChzLT50ID09IHMtPm4pCisJCXMtPnJzID0gZG5fZmluZF9zbG90KHMtPnB0ciwgcy0+biwgZG4tPnByaW9yaXR5KTsKKwllbHNlCisJCXMtPnQrKzsKKwlpZiAocy0+cnMgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZG5fZG4yZXRoKHMtPnJzLCBkbi0+YWRkcik7CisJcy0+cnMgKz0gNjsKKwkqKHMtPnJzKSA9IG5laWdoLT5udWRfc3RhdGUgJiBOVURfQ09OTkVDVEVEID8gMHg4MCA6IDB4MDsKKwkqKHMtPnJzKSB8PSBkbi0+cHJpb3JpdHk7CisJcy0+cnMrKzsKK30KKworaW50IGRuX25laWdoX2VsaXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKnB0ciwgaW50IG4pCit7CisJc3RydWN0IGVsaXN0X2NiX3N0YXRlIHN0YXRlOworCisJc3RhdGUuZGV2ID0gZGV2OworCXN0YXRlLnQgPSAwOworCXN0YXRlLm4gPSBuOworCXN0YXRlLnB0ciA9IHB0cjsKKwlzdGF0ZS5ycyA9IHB0cjsKKworCW5laWdoX2Zvcl9lYWNoKCZkbl9uZWlnaF90YWJsZSwgbmVpZ2hfZWxpc3RfY2IsICZzdGF0ZSk7CisKKwlyZXR1cm4gc3RhdGUudDsKK30KKworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworc3RhdGljIGlubGluZSB2b2lkIGRuX25laWdoX2Zvcm1hdF9lbnRyeShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwKKwkJCQkJIHN0cnVjdCBuZWlnaGJvdXIgKm4pCit7CisJc3RydWN0IGRuX25laWdoICpkbiA9IChzdHJ1Y3QgZG5fbmVpZ2ggKikgbjsKKwljaGFyIGJ1ZltETl9BU0NCVUZfTEVOXTsKKworCXJlYWRfbG9jaygmbi0+bG9jayk7CisJc2VxX3ByaW50ZihzZXEsICIlLTdzICVzJXMlcyAgICUwMnggICAgJTAyZCAgJTA3bGQgJS04c1xuIiwKKwkJICAgZG5fYWRkcjJhc2MoZG5fbnRvaHMoZG4tPmFkZHIpLCBidWYpLAorCQkgICAoZG4tPmZsYWdzJkROX05ERkxBR19SMSkgPyAiMSIgOiAiLSIsCisJCSAgIChkbi0+ZmxhZ3MmRE5fTkRGTEFHX1IyKSA/ICIyIiA6ICItIiwKKwkJICAgKGRuLT5mbGFncyZETl9OREZMQUdfUDMpID8gIjMiIDogIi0iLAorCQkgICBkbi0+bi5udWRfc3RhdGUsCisJCSAgIGF0b21pY19yZWFkKCZkbi0+bi5yZWZjbnQpLAorCQkgICBkbi0+Ymxrc2l6ZSwKKwkJICAgKGRuLT5uLmRldikgPyBkbi0+bi5kZXYtPm5hbWUgOiAiPyIpOworCXJlYWRfdW5sb2NrKCZuLT5sb2NrKTsKK30KKworc3RhdGljIGludCBkbl9uZWlnaF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJc2VxX3B1dHMoc2VxLCAiQWRkciAgICBGbGFncyBTdGF0ZSBVc2UgQmxrc2l6ZSBEZXZcbiIpOworCX0gZWxzZSB7CisJCWRuX25laWdoX2Zvcm1hdF9lbnRyeShzZXEsIHYpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCAqZG5fbmVpZ2hfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlyZXR1cm4gbmVpZ2hfc2VxX3N0YXJ0KHNlcSwgcG9zLCAmZG5fbmVpZ2hfdGFibGUsCisJCQkgICAgICAgTkVJR0hfU0VRX05FSUdIX09OTFkpOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGRuX25laWdoX3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gZG5fbmVpZ2hfc2VxX3N0YXJ0LAorCS5uZXh0ICA9IG5laWdoX3NlcV9uZXh0LAorCS5zdG9wICA9IG5laWdoX3NlcV9zdG9wLAorCS5zaG93ICA9IGRuX25laWdoX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBkbl9uZWlnaF9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKKwlpbnQgcmMgPSAtRU5PTUVNOworCXN0cnVjdCBuZWlnaF9zZXFfc3RhdGUgKnMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOworCisJaWYgKCFzKQorCQlnb3RvIG91dDsKKworCW1lbXNldChzLCAwLCBzaXplb2YoKnMpKTsKKwlyYyA9IHNlcV9vcGVuKGZpbGUsICZkbl9uZWlnaF9zZXFfb3BzKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0X2tmcmVlOworCisJc2VxICAgICAgICAgID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNlcS0+cHJpdmF0ZSA9IHM7CisJbWVtc2V0KHMsIDAsIHNpemVvZigqcykpOworb3V0OgorCXJldHVybiByYzsKK291dF9rZnJlZToKKwlrZnJlZShzKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZG5fbmVpZ2hfc2VxX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IGRuX25laWdoX3NlcV9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2VfcHJpdmF0ZSwKK307CisKKyNlbmRpZgorCit2b2lkIF9faW5pdCBkbl9uZWlnaF9pbml0KHZvaWQpCit7CisJbmVpZ2hfdGFibGVfaW5pdCgmZG5fbmVpZ2hfdGFibGUpOworCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJkZWNuZXRfbmVpZ2giLCBTX0lSVUdPLCAmZG5fbmVpZ2hfc2VxX2ZvcHMpOworfQorCit2b2lkIF9fZXhpdCBkbl9uZWlnaF9jbGVhbnVwKHZvaWQpCit7CisJcHJvY19uZXRfcmVtb3ZlKCJkZWNuZXRfbmVpZ2giKTsKKwluZWlnaF90YWJsZV9jbGVhcigmZG5fbmVpZ2hfdGFibGUpOworfQpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl9uc3BfaW4uYyBiL25ldC9kZWNuZXQvZG5fbnNwX2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAyZGJkZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9kZWNuZXQvZG5fbnNwX2luLmMKQEAgLTAsMCArMSw5MzQgQEAKKy8qCisgKiBERUNuZXQgICAgICAgQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIERFQ25ldCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKiAgICAgICAgICAgICAgb3BlcmF0aW5nIHN5c3RlbS4gIERFQ25ldCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqICAgICAgICAgICAgICBpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKiAgICAgICAgICAgICAgREVDbmV0IE5ldHdvcmsgU2VydmljZXMgUHJvdG9jb2wgKElucHV0KQorICoKKyAqIEF1dGhvcjogICAgICBFZHVhcmRvIE1hcmNlbG8gU2VycmF0IDxlbXNlcnJhdEBnZW9jaXRpZXMuY29tPgorICoKKyAqIENoYW5nZXM6CisgKgorICogICAgU3RldmUgV2hpdGVob3VzZTogIFNwbGl0IGludG8gZG5fbnNwX2luLmMgYW5kIGRuX25zcF9vdXQuYyBmcm9tCisgKiAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWwgZG5fbnNwLmMuCisgKiAgICBTdGV2ZSBXaGl0ZWhvdXNlOiAgVXBkYXRlZCB0byB3b3JrIHdpdGggbXkgbmV3IHJvdXRpbmcgYXJjaGl0ZWN0dXJlLgorICogICAgU3RldmUgV2hpdGVob3VzZTogIEFkZCBjaGFuZ2VzIGZyb20gRWR1YXJkbyBTZXJyYXQncyBwYXRjaGVzLgorICogICAgU3RldmUgV2hpdGVob3VzZTogIFB1dCBhbGwgYWNrIGhhbmRsaW5nIGNvZGUgaW4gYSBjb21tb24gcm91dGluZS4KKyAqICAgIFN0ZXZlIFdoaXRlaG91c2U6ICBQdXQgb3RoZXIgY29tbW9uIGJpdHMgaW50byBkbl9uc3BfcngoKQorICogICAgU3RldmUgV2hpdGVob3VzZTogIE1vcmUgY2hlY2tzIG9uIHNrYi0+bGVuIHRvIGNhdGNoIGJvZ3VzIHBhY2tldHMKKyAqICAgICAgICAgICAgICAgICAgICAgICBGaXhlZCB2YXJpb3VzIHJhY2UgY29uZGl0aW9ucyBhbmQgcG9zc2libGUgbmFzdGllcy4KKyAqICAgIFN0ZXZlIFdoaXRlaG91c2U6ICBOb3cgaGFuZGxlcyByZXR1cm5lZCBjb25uaW5pdCBmcmFtZXMuCisgKiAgICAgRGF2aWQgUy4gTWlsbGVyOiAgTmV3IHNvY2tldCBsb2NraW5nCisgKiAgICBTdGV2ZSBXaGl0ZWhvdXNlOiAgRml4ZWQgbG9ja3VwIHdoZW4gc29ja2V0IGZpbHRlcmluZyB3YXMgZW5hYmxlZC4KKyAqICAgICAgICAgUGF1bCBLb25pbmc6ICBGaXggdG8gcHVzaCBDQyBzb2NrZXRzIGludG8gUlVOIHdoZW4gYWNrcyBhcmUKKyAqICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZC4KKyAqICAgIFN0ZXZlIFdoaXRlaG91c2U6CisgKiAgIFBhdHJpY2sgQ2F1bGZpZWxkOiAgQ2hlY2tpbmcgY29ubmluaXRzIGZvciBjb3JyZWN0bmVzcyAmIHNlbmRpbmcgb2YgZXJyb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZXMuCisgKiAgICBTdGV2ZSBXaGl0ZWhvdXNlOiAgQWRkZWQgYmFja2xvZyBjb25nZXN0aW9uIGxldmVsIHJldHVybiBjb2Rlcy4KKyAqICAgUGF0cmljayBDYXVsZmllbGQ6CisgKiAgICBTdGV2ZSBXaGl0ZWhvdXNlOiAgQWRkZWQgZmxvdyBjb250cm9sIHN1cHBvcnQgKG91dGJvdW5kKQorICogICAgU3RldmUgV2hpdGVob3VzZTogIFByZXBhcmUgZm9yIG5vbmxpbmVhciBza2JzCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIChjKSAxOTk1LTE5OTggRS5NLiBTZXJyYXQJCWVtc2VycmF0QGdlb2NpdGllcy5jb20KKyAgICAKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvcm91dGUuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4gICAgICAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2RlY25ldC5oPgorI2luY2x1ZGUgPG5ldC9uZWlnaGJvdXIuaD4KKyNpbmNsdWRlIDxuZXQvZHN0Lmg+CisjaW5jbHVkZSA8bmV0L2RuLmg+CisjaW5jbHVkZSA8bmV0L2RuX25zcC5oPgorI2luY2x1ZGUgPG5ldC9kbl9kZXYuaD4KKyNpbmNsdWRlIDxuZXQvZG5fcm91dGUuaD4KKworZXh0ZXJuIGludCBkZWNuZXRfbG9nX21hcnRpYW5zOworCitzdGF0aWMgdm9pZCBkbl9sb2dfbWFydGlhbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBjaGFyICptc2cpCit7CisJaWYgKGRlY25ldF9sb2dfbWFydGlhbnMgJiYgbmV0X3JhdGVsaW1pdCgpKSB7CisJCWNoYXIgKmRldm5hbWUgPSBza2ItPmRldiA/IHNrYi0+ZGV2LT5uYW1lIDogIj8/PyI7CisJCXN0cnVjdCBkbl9za2JfY2IgKmNiID0gRE5fU0tCX0NCKHNrYik7CisJCXByaW50ayhLRVJOX0lORk8gIkRFQ25ldDogTWFydGlhbiBwYWNrZXQgKCVzKSBkZXY9JXMgc3JjPTB4JTA0aHggZHN0PTB4JTA0aHggc3JjcG9ydD0weCUwNGh4IGRzdHBvcnQ9MHglMDRoeFxuIiwgbXNnLCBkZXZuYW1lLCBjYi0+c3JjLCBjYi0+ZHN0LCBjYi0+c3JjX3BvcnQsIGNiLT5kc3RfcG9ydCk7CisJfQorfQorCisvKgorICogRm9yIHRoaXMgZnVuY3Rpb24gd2UndmUgZmxpcHBlZCB0aGUgY3Jvc3Mtc3ViY2hhbm5lbCBiaXQKKyAqIGlmIHRoZSBtZXNzYWdlIGlzIGFuIG90aGVyZGF0YSBvciBsaW5rc2VydmljZSBtZXNzYWdlLiBUaHVzCisgKiB3ZSBjYW4gdXNlIGl0IHRvIHdvcmsgb3V0IHdoYXQgdG8gdXBkYXRlLgorICovCitzdGF0aWMgdm9pZCBkbl9hY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBzaG9ydCBhY2spCit7CisJc3RydWN0IGRuX3NjcCAqc2NwID0gRE5fU0soc2spOworCXVuc2lnbmVkIHNob3J0IHR5cGUgPSAoKGFjayA+PiAxMikgJiAweDAwMDMpOworCWludCB3YWtldXAgPSAwOworCisJc3dpdGNoKHR5cGUpIHsKKwkJY2FzZSAwOiAvKiBBQ0sgLSBEYXRhICovCisJCQlpZiAoZG5fYWZ0ZXIoYWNrLCBzY3AtPmFja3Jjdl9kYXQpKSB7CisJCQkJc2NwLT5hY2tyY3ZfZGF0ID0gYWNrICYgMHgwZmZmOworCQkJCXdha2V1cCB8PSBkbl9uc3BfY2hlY2tfeG1pdF9xdWV1ZShzaywgc2tiLCAmc2NwLT5kYXRhX3htaXRfcXVldWUsIGFjayk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAxOiAvKiBOQUsgLSBEYXRhICovCisJCQlicmVhazsKKwkJY2FzZSAyOiAvKiBBQ0sgLSBPdGhlckRhdGEgKi8KKwkJCWlmIChkbl9hZnRlcihhY2ssIHNjcC0+YWNrcmN2X290aCkpIHsKKwkJCQlzY3AtPmFja3Jjdl9vdGggPSBhY2sgJiAweDBmZmY7CisJCQkJd2FrZXVwIHw9IGRuX25zcF9jaGVja194bWl0X3F1ZXVlKHNrLCBza2IsICZzY3AtPm90aGVyX3htaXRfcXVldWUsIGFjayk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAzOiAvKiBOQUsgLSBPdGhlckRhdGEgKi8KKwkJCWJyZWFrOworCX0KKworCWlmICh3YWtldXAgJiYgIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkKKwkJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgdW5pdmVyc2FsIGFjayBwcm9jZXNzb3IuCisgKi8KK3N0YXRpYyBpbnQgZG5fcHJvY2Vzc19hY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb3RoKQoreworCXVuc2lnbmVkIHNob3J0ICpwdHIgPSAodW5zaWduZWQgc2hvcnQgKilza2ItPmRhdGE7CisJaW50IGxlbiA9IDA7CisJdW5zaWduZWQgc2hvcnQgYWNrOworCisJaWYgKHNrYi0+bGVuIDwgMikKKwkJcmV0dXJuIGxlbjsKKworCWlmICgoYWNrID0gZG5fbnRvaHMoKnB0cikpICYgMHg4MDAwKSB7CisJCXNrYl9wdWxsKHNrYiwgMik7CisJCXB0cisrOworCQlsZW4gKz0gMjsKKwkJaWYgKChhY2sgJiAweDQwMDApID09IDApIHsKKwkJCWlmIChvdGgpIAorCQkJCWFjayBePSAweDIwMDA7CisJCQlkbl9hY2soc2ssIHNrYiwgYWNrKTsKKwkJfQorCX0KKworCWlmIChza2ItPmxlbiA8IDIpCisJCXJldHVybiBsZW47CisKKwlpZiAoKGFjayA9IGRuX250b2hzKCpwdHIpKSAmIDB4ODAwMCkgeworCQlza2JfcHVsbChza2IsIDIpOworCQlsZW4gKz0gMjsKKwkJaWYgKChhY2sgJiAweDQwMDApID09IDApIHsKKwkJCWlmIChvdGgpIAorCQkJCWFjayBePSAweDIwMDA7CisJCQlkbl9hY2soc2ssIHNrYiwgYWNrKTsKKwkJfQorCX0KKworCXJldHVybiBsZW47Cit9CisKKworLyoqCisgKiBkbl9jaGVja19pZGYgLSBDaGVjayBhbiBpbWFnZSBkYXRhIGZpZWxkIGZvcm1hdCBpcyBjb3JyZWN0LgorICogQHBwdHI6IFBvaW50ZXIgdG8gcG9pbnRlciB0byBpbWFnZSBkYXRhCisgKiBAbGVuOiBQb2ludGVyIHRvIGxlbmd0aCBvZiBpbWFnZSBkYXRhCisgKiBAbWF4OiBUaGUgbWF4aW11bSBhbGxvd2VkIGxlbmd0aCBvZiB0aGUgZGF0YSBpbiB0aGUgaW1hZ2UgZGF0YSBmaWVsZAorICogQGZvbGxvd19vbjogQ2hlY2sgdGhhdCB0aGlzIG1hbnkgYnl0ZXMgZXhpc3QgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGltYWdlIGRhdGEKKyAqCisgKiBSZXR1cm5zOiAwIGlmIG9rLCAtMSBvbiBlcnJvcgorICovCitzdGF0aWMgaW5saW5lIGludCBkbl9jaGVja19pZGYodW5zaWduZWQgY2hhciAqKnBwdHIsIGludCAqbGVuLCB1bnNpZ25lZCBjaGFyIG1heCwgdW5zaWduZWQgY2hhciBmb2xsb3dfb24pCit7CisJdW5zaWduZWQgY2hhciAqcHRyID0gKnBwdHI7CisJdW5zaWduZWQgY2hhciBmbGVuID0gKnB0cisrOworCisJKCpsZW4pLS07CisJaWYgKGZsZW4gPiBtYXgpCisJCXJldHVybiAtMTsKKwlpZiAoKGZsZW4gKyBmb2xsb3dfb24pID4gKmxlbikKKwkJcmV0dXJuIC0xOworCisJKmxlbiAtPSBmbGVuOworCSpwcHRyID0gcHRyICsgZmxlbjsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRhYmxlIG9mIHJlYXNvbiBjb2RlcyB0byBwYXNzIGJhY2sgdG8gbm9kZSB3aGljaCBzZW50IHVzIGEgYmFkbHkKKyAqIGZvcm1lZCBtZXNzYWdlLCBwbHVzIHRleHQgbWVzc2FnZXMgZm9yIHRoZSBsb2cuIEEgemVybyBlbnRyeSBpbgorICogdGhlIHJlYXNvbiBmaWVsZCBtZWFucyAiZG9uJ3QgcmVwbHkiIG90aGVyd2lzZSBhIGRpc2MgaW5pdCBpcyBzZW50IHdpdGgKKyAqIHRoZSBzcGVjaWZpZWQgcmVhc29uIGNvZGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IHJlYXNvbjsKKwljb25zdCBjaGFyICp0ZXh0OworfSBjaV9lcnJfdGFibGVbXSA9IHsKKyB7IDAsICAgICAgICAgICAgICJDSTogVHJ1bmNhdGVkIG1lc3NhZ2UiIH0sCisgeyBOU1BfUkVBU09OX0lELCAiQ0k6IERlc3RpbmF0aW9uIHVzZXJuYW1lIGVycm9yIiB9LAorIHsgTlNQX1JFQVNPTl9JRCwgIkNJOiBEZXN0aW5hdGlvbiB1c2VybmFtZSB0eXBlIiB9LAorIHsgTlNQX1JFQVNPTl9VUywgIkNJOiBTb3VyY2UgdXNlcm5hbWUgZXJyb3IiIH0sCisgeyAwLCAgICAgICAgICAgICAiQ0k6IFRydW5jYXRlZCBhdCBtZW51dmVyIiB9LAorIHsgMCwgICAgICAgICAgICAgIkNJOiBUcnVuY2F0ZWQgYmVmb3JlIGFjY2VzcyBvciB1c2VyIGRhdGEiIH0sCisgeyBOU1BfUkVBU09OX0lPLCAiQ0k6IEFjY2VzcyBkYXRhIGZvcm1hdCBlcnJvciIgfSwKKyB7IE5TUF9SRUFTT05fSU8sICJDSTogVXNlciBkYXRhIGZvcm1hdCBlcnJvciIgfQorfTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gdXNlcyBhIHNsaWdodGx5IGRpZmZlcmVudCBsb29rdXAgbWV0aG9kCisgKiB0byBmaW5kIGl0cyBzb2NrZXRzLCBzaW5jZSBpdCBzZWFyY2hlcyBvbiBvYmplY3QgbmFtZS9udW1iZXIKKyAqIHJhdGhlciB0aGFuIHBvcnQgbnVtYmVycy4gVmFyaW91cyB0ZXN0cyBhcmUgZG9uZSB0byBlbnN1cmUgdGhhdAorICogdGhlIGluY29taW5nIGRhdGEgaXMgaW4gdGhlIGNvcnJlY3QgZm9ybWF0IGJlZm9yZSBpdCBpcyBxdWV1ZWQgdG8KKyAqIGEgc29ja2V0LgorICovCitzdGF0aWMgc3RydWN0IHNvY2sgKmRuX2ZpbmRfbGlzdGVuZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgc2hvcnQgKnJlYXNvbikKK3sKKwlzdHJ1Y3QgZG5fc2tiX2NiICpjYiA9IEROX1NLQl9DQihza2IpOworCXN0cnVjdCBuc3BfY29ubl9pbml0X21zZyAqbXNnID0gKHN0cnVjdCBuc3BfY29ubl9pbml0X21zZyAqKXNrYi0+ZGF0YTsKKwlzdHJ1Y3Qgc29ja2FkZHJfZG4gZHN0YWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfZG4gc3JjYWRkcjsKKwl1bnNpZ25lZCBjaGFyIHR5cGUgPSAwOworCWludCBkc3RsZW47CisJaW50IHNyY2xlbjsKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisJaW50IGxlbjsKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBjaGFyIG1lbnV2ZXI7CisKKwltZW1zZXQoJmRzdGFkZHIsIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfZG4pKTsKKwltZW1zZXQoJnNyY2FkZHIsIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfZG4pKTsKKworCS8qCisJICogMS4gRGVjb2RlICYgcmVtb3ZlIG1lc3NhZ2UgaGVhZGVyCisJICovCisJY2ItPnNyY19wb3J0ID0gbXNnLT5zcmNhZGRyOworCWNiLT5kc3RfcG9ydCA9IG1zZy0+ZHN0YWRkcjsKKwljYi0+c2VydmljZXMgPSBtc2ctPnNlcnZpY2VzOworCWNiLT5pbmZvICAgICA9IG1zZy0+aW5mbzsKKwljYi0+c2Vnc2l6ZSAgPSBkbl9udG9ocyhtc2ctPnNlZ3NpemUpOworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKCptc2cpKSkKKwkJZ290byBlcnJfb3V0OworCisJc2tiX3B1bGwoc2tiLCBzaXplb2YoKm1zZykpOworCisJbGVuID0gc2tiLT5sZW47CisJcHRyID0gc2tiLT5kYXRhOworCisJLyoKKwkgKiAyLiBDaGVjayBkZXN0aW5hdGlvbiBlbmQgdXNlcm5hbWUgZm9ybWF0CisJICovCisJZHN0bGVuID0gZG5fdXNlcm5hbWUyc29ja2FkZHIocHRyLCBsZW4sICZkc3RhZGRyLCAmdHlwZSk7CisJZXJyKys7CisJaWYgKGRzdGxlbiA8IDApCisJCWdvdG8gZXJyX291dDsKKworCWVycisrOworCWlmICh0eXBlID4gMSkKKwkJZ290byBlcnJfb3V0OworCisJbGVuIC09IGRzdGxlbjsKKwlwdHIgKz0gZHN0bGVuOworCisJLyoKKwkgKiAzLiBDaGVjayBzb3VyY2UgZW5kIHVzZXJuYW1lIGZvcm1hdAorCSAqLworCXNyY2xlbiA9IGRuX3VzZXJuYW1lMnNvY2thZGRyKHB0ciwgbGVuLCAmc3JjYWRkciwgJnR5cGUpOworCWVycisrOworCWlmIChzcmNsZW4gPCAwKQorCQlnb3RvIGVycl9vdXQ7CisKKwlsZW4gLT0gc3JjbGVuOworCXB0ciArPSBzcmNsZW47CisJZXJyKys7CisJaWYgKGxlbiA8IDEpCisJCWdvdG8gZXJyX291dDsKKworCW1lbnV2ZXIgPSAqcHRyOworCXB0cisrOworCWxlbi0tOworCisJLyoKKwkgKiA0LiBDaGVjayB0aGF0IG9wdGlvbmFsIGRhdGEgYWN0dWFsbHkgZXhpc3RzIGlmIG1lbnV2ZXIgc2F5cyBpdCBkb2VzCisJICovCisJZXJyKys7CisJaWYgKChtZW51dmVyICYgKEROX01FTlVWRVJfQUNDIHwgRE5fTUVOVVZFUl9VU1IpKSAmJiAobGVuIDwgMSkpCisJCWdvdG8gZXJyX291dDsKKworCS8qCisJICogNS4gQ2hlY2sgb3B0aW9uYWwgYWNjZXNzIGRhdGEgZm9ybWF0CisJICovCisJZXJyKys7CisJaWYgKG1lbnV2ZXIgJiBETl9NRU5VVkVSX0FDQykgeworCQlpZiAoZG5fY2hlY2tfaWRmKCZwdHIsICZsZW4sIDM5LCAxKSkKKwkJCWdvdG8gZXJyX291dDsKKwkJaWYgKGRuX2NoZWNrX2lkZigmcHRyLCAmbGVuLCAzOSwgMSkpCisJCQlnb3RvIGVycl9vdXQ7CisJCWlmIChkbl9jaGVja19pZGYoJnB0ciwgJmxlbiwgMzksIChtZW51dmVyICYgRE5fTUVOVVZFUl9VU1IpID8gMSA6IDApKQorCQkJZ290byBlcnJfb3V0OworCX0KKworCS8qCisJICogNi4gQ2hlY2sgb3B0aW9uYWwgdXNlciBkYXRhIGZvcm1hdAorCSAqLworCWVycisrOworCWlmIChtZW51dmVyICYgRE5fTUVOVVZFUl9VU1IpIHsKKwkJaWYgKGRuX2NoZWNrX2lkZigmcHRyLCAmbGVuLCAxNiwgMCkpCisJCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyoKKwkgKiA3LiBMb29rIHVwIHNvY2tldCBiYXNlZCBvbiBkZXN0aW5hdGlvbiBlbmQgdXNlcm5hbWUKKwkgKi8KKwlyZXR1cm4gZG5fc2tsaXN0X2ZpbmRfbGlzdGVuZXIoJmRzdGFkZHIpOworZXJyX291dDoKKwlkbl9sb2dfbWFydGlhbihza2IsIGNpX2Vycl90YWJsZVtlcnJdLnRleHQpOworCSpyZWFzb24gPSBjaV9lcnJfdGFibGVbZXJyXS5yZWFzb247CisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIHZvaWQgZG5fbnNwX2Nvbm5faW5pdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKHNrX2FjY2VwdHFfaXNfZnVsbChzaykpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisKKwlzay0+c2tfYWNrX2JhY2tsb2crKzsKKwlza2JfcXVldWVfdGFpbCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7Cit9CisKK3N0YXRpYyB2b2lkIGRuX25zcF9jb25uX2NvbmYoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBkbl9za2JfY2IgKmNiID0gRE5fU0tCX0NCKHNrYik7CisJc3RydWN0IGRuX3NjcCAqc2NwID0gRE5fU0soc2spOworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKworCWlmIChza2ItPmxlbiA8IDQpCisJCWdvdG8gb3V0OworCisJcHRyID0gc2tiLT5kYXRhOworCWNiLT5zZXJ2aWNlcyA9ICpwdHIrKzsKKwljYi0+aW5mbyA9ICpwdHIrKzsKKwljYi0+c2Vnc2l6ZSA9IGRuX250b2hzKCooX191MTYgKilwdHIpOworCisJaWYgKChzY3AtPnN0YXRlID09IEROX0NJKSB8fCAoc2NwLT5zdGF0ZSA9PSBETl9DRCkpIHsKKwkJc2NwLT5wZXJzaXN0ID0gMDsKKyAgICAgICAgICAgICAgICBzY3AtPmFkZHJyZW0gPSBjYi0+c3JjX3BvcnQ7CisgICAgICAgICAgICAgICAgc2stPnNrX3N0YXRlID0gVENQX0VTVEFCTElTSEVEOworICAgICAgICAgICAgICAgIHNjcC0+c3RhdGUgPSBETl9SVU47CisJCXNjcC0+c2VydmljZXNfcmVtID0gY2ItPnNlcnZpY2VzOworCQlzY3AtPmluZm9fcmVtID0gY2ItPmluZm87CisJCXNjcC0+c2Vnc2l6ZV9yZW0gPSBjYi0+c2Vnc2l6ZTsKKworCQlpZiAoKHNjcC0+c2VydmljZXNfcmVtICYgTlNQX0ZDX01BU0spID09IE5TUF9GQ19OT05FKQorCQkJc2NwLT5tYXhfd2luZG93ID0gZGVjbmV0X25vX2ZjX21heF9jd25kOworCisJCWlmIChza2ItPmxlbiA+IDApIHsKKwkJCXVuc2lnbmVkIGNoYXIgZGxlbiA9ICpza2ItPmRhdGE7CisJCQlpZiAoKGRsZW4gPD0gMTYpICYmIChkbGVuIDw9IHNrYi0+bGVuKSkgeworCQkJCXNjcC0+Y29ubmRhdGFfaW4ub3B0X29wdGwgPSBkbGVuOworCQkJCW1lbWNweShzY3AtPmNvbm5kYXRhX2luLm9wdF9kYXRhLCBza2ItPmRhdGEgKyAxLCBkbGVuKTsKKwkJCX0KKwkJfQorICAgICAgICAgICAgICAgIGRuX25zcF9zZW5kX2xpbmsoc2ssIEROX05PQ0hBTkdFLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAoIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkKKyAgICAgICAgICAgICAgICAJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisgICAgICAgIH0KKworb3V0OgorICAgICAgICBrZnJlZV9za2Ioc2tiKTsKK30KKworc3RhdGljIHZvaWQgZG5fbnNwX2Nvbm5fYWNrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZG5fc2NwICpzY3AgPSBETl9TSyhzayk7CisKKwlpZiAoc2NwLT5zdGF0ZSA9PSBETl9DSSkgeworCQlzY3AtPnN0YXRlID0gRE5fQ0Q7CisJCXNjcC0+cGVyc2lzdCA9IDA7CisJfQorCisJa2ZyZWVfc2tiKHNrYik7Cit9CisKK3N0YXRpYyB2b2lkIGRuX25zcF9kaXNjX2luaXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKKwlzdHJ1Y3QgZG5fc2tiX2NiICpjYiA9IEROX1NLQl9DQihza2IpOworCXVuc2lnbmVkIHNob3J0IHJlYXNvbjsKKworCWlmIChza2ItPmxlbiA8IDIpCisJCWdvdG8gb3V0OworCisJcmVhc29uID0gZG5fbnRvaHMoKihfX3UxNiAqKXNrYi0+ZGF0YSk7CisJc2tiX3B1bGwoc2tiLCAyKTsKKworCXNjcC0+ZGlzY2RhdGFfaW4ub3B0X3N0YXR1cyA9IHJlYXNvbjsKKwlzY3AtPmRpc2NkYXRhX2luLm9wdF9vcHRsICAgPSAwOworCW1lbXNldChzY3AtPmRpc2NkYXRhX2luLm9wdF9kYXRhLCAwLCAxNik7CisKKwlpZiAoc2tiLT5sZW4gPiAwKSB7CisJCXVuc2lnbmVkIGNoYXIgZGxlbiA9ICpza2ItPmRhdGE7CisJCWlmICgoZGxlbiA8PSAxNikgJiYgKGRsZW4gPD0gc2tiLT5sZW4pKSB7CisJCQlzY3AtPmRpc2NkYXRhX2luLm9wdF9vcHRsID0gZGxlbjsKKwkJCW1lbWNweShzY3AtPmRpc2NkYXRhX2luLm9wdF9kYXRhLCBza2ItPmRhdGEgKyAxLCBkbGVuKTsKKwkJfQorCX0KKworCXNjcC0+YWRkcnJlbSA9IGNiLT5zcmNfcG9ydDsKKwlzay0+c2tfc3RhdGUgPSBUQ1BfQ0xPU0U7CisKKwlzd2l0Y2goc2NwLT5zdGF0ZSkgeworCQljYXNlIEROX0NJOgorCQljYXNlIEROX0NEOgorCQkJc2NwLT5zdGF0ZSA9IEROX1JKOworCQkJc2stPnNrX2VyciA9IEVDT05OUkVGVVNFRDsKKwkJCWJyZWFrOworCQljYXNlIEROX1JVTjoKKwkJCXNrLT5za19zaHV0ZG93biB8PSBTSFVURE9XTl9NQVNLOworCQkJc2NwLT5zdGF0ZSA9IEROX0ROOworCQkJYnJlYWs7CisJCWNhc2UgRE5fREk6CisJCQlzY3AtPnN0YXRlID0gRE5fRElDOworCQkJYnJlYWs7CisJfQorCisJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpIHsKKwkJaWYgKHNrLT5za19zb2NrZXQtPnN0YXRlICE9IFNTX1VOQ09OTkVDVEVEKQorCQkJc2stPnNrX3NvY2tldC0+c3RhdGUgPSBTU19ESVNDT05ORUNUSU5HOworCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKKwl9CisKKwkvKiAKKwkgKiBJdCBhcHBlYXJzIHRoYXQgaXRzIHBvc3NpYmxlIGZvciByZW1vdGUgbWFjaGluZXMgdG8gc2VuZCBkaXNjCisJICogaW5pdCBtZXNzYWdlcyB3aXRoIG5vIHBvcnQgaWRlbnRpZmllciBpZiB3ZSBhcmUgaW4gdGhlIENJIGFuZAorCSAqIHBvc3NpYmx5IGFsc28gdGhlIENEIHN0YXRlLiBPYnZpb3VzbHkgd2Ugc2hvdWxkbid0IHJlcGx5IHdpdGgKKwkgKiBhIG1lc3NhZ2UgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBlbmQgcG9pbnQgaXMuCisJICovCisJaWYgKHNjcC0+YWRkcnJlbSkgeworCQlkbl9uc3Bfc2VuZF9kaXNjKHNrLCBOU1BfRElTQ0NPTkYsIE5TUF9SRUFTT05fREMsIEdGUF9BVE9NSUMpOworCX0KKwlzY3AtPnBlcnNpc3RfZnhuID0gZG5fZGVzdHJveV90aW1lcjsKKwlzY3AtPnBlcnNpc3QgPSBkbl9uc3BfcGVyc2lzdChzayk7CisKK291dDoKKwlrZnJlZV9za2Ioc2tiKTsKK30KKworLyoKKyAqIGRpc2NfY29uZiBtZXNzYWdlcyBhcmUgYWxzbyBjYWxsZWQgbm9fcmVzb3VyY2VzIG9yIG5vX2xpbmsKKyAqIG1lc3NhZ2VzIGRlcGVuZGluZyB1cG9uIHRoZSAicmVhc29uIiBmaWVsZC4KKyAqLworc3RhdGljIHZvaWQgZG5fbnNwX2Rpc2NfY29uZihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGRuX3NjcCAqc2NwID0gRE5fU0soc2spOworCXVuc2lnbmVkIHNob3J0IHJlYXNvbjsKKworCWlmIChza2ItPmxlbiAhPSAyKQorCQlnb3RvIG91dDsKKworCXJlYXNvbiA9IGRuX250b2hzKCooX191MTYgKilza2ItPmRhdGEpOworCisJc2stPnNrX3N0YXRlID0gVENQX0NMT1NFOworCisJc3dpdGNoKHNjcC0+c3RhdGUpIHsKKwkJY2FzZSBETl9DSToKKwkJCXNjcC0+c3RhdGUgPSBETl9OUjsKKwkJCWJyZWFrOworCQljYXNlIEROX0RSOgorCQkJaWYgKHJlYXNvbiA9PSBOU1BfUkVBU09OX0RDKQorCQkJCXNjcC0+c3RhdGUgPSBETl9EUkM7CisJCQlpZiAocmVhc29uID09IE5TUF9SRUFTT05fTkwpCisJCQkJc2NwLT5zdGF0ZSA9IEROX0NOOworCQkJYnJlYWs7CisJCWNhc2UgRE5fREk6CisJCQlzY3AtPnN0YXRlID0gRE5fRElDOworCQkJYnJlYWs7CisJCWNhc2UgRE5fUlVOOgorCQkJc2stPnNrX3NodXRkb3duIHw9IFNIVVRET1dOX01BU0s7CisJCWNhc2UgRE5fQ0M6CisJCQlzY3AtPnN0YXRlID0gRE5fQ047CisJfQorCisJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpIHsKKwkJaWYgKHNrLT5za19zb2NrZXQtPnN0YXRlICE9IFNTX1VOQ09OTkVDVEVEKQorCQkJc2stPnNrX3NvY2tldC0+c3RhdGUgPSBTU19ESVNDT05ORUNUSU5HOworCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKKwl9CisKKwlzY3AtPnBlcnNpc3RfZnhuID0gZG5fZGVzdHJveV90aW1lcjsKKwlzY3AtPnBlcnNpc3QgPSBkbl9uc3BfcGVyc2lzdChzayk7CisKK291dDoKKwlrZnJlZV9za2Ioc2tiKTsKK30KKworc3RhdGljIHZvaWQgZG5fbnNwX2xpbmtzZXJ2aWNlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZG5fc2NwICpzY3AgPSBETl9TSyhzayk7CisJdW5zaWduZWQgc2hvcnQgc2VnbnVtOworCXVuc2lnbmVkIGNoYXIgbHNmbGFnczsKKwlzaWduZWQgY2hhciBmY3ZhbDsKKwlpbnQgd2FrZV91cCA9IDA7CisJY2hhciAqcHRyID0gc2tiLT5kYXRhOworCXVuc2lnbmVkIGNoYXIgZmN0eXBlID0gc2NwLT5zZXJ2aWNlc19yZW0gJiBOU1BfRkNfTUFTSzsKKworCWlmIChza2ItPmxlbiAhPSA0KQorCQlnb3RvIG91dDsKKworCXNlZ251bSA9IGRuX250b2hzKCooX191MTYgKilwdHIpOworCXB0ciArPSAyOworCWxzZmxhZ3MgPSAqKHVuc2lnbmVkIGNoYXIgKilwdHIrKzsKKwlmY3ZhbCA9ICpwdHI7CisKKwkvKgorCSAqIEhlcmUgd2UgaWdub3JlIGVycm9ub3VzIHBhY2tldHMgd2hpY2ggc2hvdWxkIHJlYWxseQorCSAqIHNob3VsZCBjYXVzZSBhIGNvbm5lY3Rpb24gYWJvcnQuIEl0IGlzIG5vdCBjcml0aWNhbCAKKwkgKiBmb3Igbm93IHRob3VnaC4KKwkgKi8KKwlpZiAobHNmbGFncyAmIDB4ZjgpCisJCWdvdG8gb3V0OworCisJaWYgKHNlcV9uZXh0KHNjcC0+bnVtb3RoX3Jjdiwgc2VnbnVtKSkgeworCQlzZXFfYWRkKCZzY3AtPm51bW90aF9yY3YsIDEpOworCQlzd2l0Y2gobHNmbGFncyAmIDB4MDQpIHsgLyogRkNWQUwgSU5UICovCisJCWNhc2UgMHgwMDogLyogTm9ybWFsIFJlcXVlc3QgKi8KKwkJCXN3aXRjaChsc2ZsYWdzICYgMHgwMykgeyAvKiBGQ1ZBTCBNT0QgKi8KKyAgICAgICAJICAgICAgICAgCWNhc2UgMHgwMDogLyogUmVxdWVzdCBjb3VudCAqLworCQkJCWlmIChmY3ZhbCA8IDApIHsKKwkJCQkJdW5zaWduZWQgY2hhciBwX2ZjdmFsID0gLWZjdmFsOworCQkJCQlpZiAoKHNjcC0+Zmxvd3JlbV9kYXQgPiBwX2ZjdmFsKSAmJgorCQkJCQkgICAgKGZjdHlwZSA9PSBOU1BfRkNfU0NNQykpIHsKKwkJCQkJCXNjcC0+Zmxvd3JlbV9kYXQgLT0gcF9mY3ZhbDsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoZmN2YWwgPiAwKSB7CisJCQkJCXNjcC0+Zmxvd3JlbV9kYXQgKz0gZmN2YWw7CisJCQkJCXdha2VfdXAgPSAxOworCQkJCX0KKyAgICAgICAgICAgICAgIAkgICAgICAgCSAJYnJlYWs7CisJCQljYXNlIDB4MDE6IC8qIFN0b3Agb3V0Z29pbmcgZGF0YSAqLworCQkJCXNjcC0+Zmxvd3JlbV9zdyA9IEROX0RPTlRTRU5EOworCQkJCWJyZWFrOworCQkJY2FzZSAweDAyOiAvKiBPayB0byBzdGFydCBhZ2FpbiAqLworCQkJCXNjcC0+Zmxvd3JlbV9zdyA9IEROX1NFTkQ7CisJCQkJZG5fbnNwX291dHB1dChzayk7CisJCQkJd2FrZV91cCA9IDE7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAweDA0OiAvKiBJbnRlcnJ1cHQgUmVxdWVzdCAqLworCQkJaWYgKGZjdmFsID4gMCkgeworCQkJCXNjcC0+Zmxvd3JlbV9vdGggKz0gZmN2YWw7CisJCQkJd2FrZV91cCA9IDE7CisJCQl9CisJCQlicmVhazsKKyAgICAgICAgICAgICAgICB9CisJCWlmICh3YWtlX3VwICYmICFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCisJCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKKyAgICAgICAgfQorCisJZG5fbnNwX3NlbmRfb3RoX2Fjayhzayk7CisKK291dDoKKwlrZnJlZV9za2Ioc2tiKTsKK30KKworLyoKKyAqIENvcHkgb2Ygc29ja19xdWV1ZV9yY3Zfc2tiIChmcm9tIHNvY2suaCkgd2l0aG91dAorICogYmhfbG9ja19zb2NrKCkgKGl0cyBhbHJlYWR5IGhlbGQgd2hlbiB0aGlzIGlzIGNhbGxlZCkgd2hpY2gKKyAqIGFsc28gYWxsb3dzIGRhdGEgYW5kIG90aGVyIGRhdGEgdG8gYmUgcXVldWVkIHRvIGEgc29ja2V0LgorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgZG5fcXVldWVfc2tiKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHNpZywgc3RydWN0IHNrX2J1ZmZfaGVhZCAqcXVldWUpCit7CisJaW50IGVycjsKKwkKKyAgICAgICAgLyogQ2FzdCBza2ItPnJjdmJ1ZiB0byB1bnNpZ25lZC4uLiBJdCdzIHBvaW50bGVzcywgYnV0IHJlZHVjZXMKKyAgICAgICAgICAgbnVtYmVyIG9mIHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIHdpdGggLVcgLS1BTksKKyAgICAgICAgICovCisgICAgICAgIGlmIChhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpICsgc2tiLT50cnVlc2l6ZSA+PQorCSAgICAodW5zaWduZWQpc2stPnNrX3JjdmJ1ZikgeworICAgICAgICAJZXJyID0gLUVOT01FTTsKKyAgICAgICAgCWdvdG8gb3V0OworICAgICAgICB9CisKKwllcnIgPSBza19maWx0ZXIoc2ssIHNrYiwgMCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKyAgICAgICAgc2tiX3NldF9vd25lcl9yKHNrYiwgc2spOworICAgICAgICBza2JfcXVldWVfdGFpbChxdWV1ZSwgc2tiKTsKKworCS8qIFRoaXMgY29kZSBvbmx5IHJ1bnMgZnJvbSBCSCBvciBCSCBwcm90ZWN0ZWQgY29udGV4dC4KKwkgKiBUaGVyZWZvcmUgdGhlIHBsYWluIHJlYWRfbG9jayBpcyBvayBoZXJlLiAtRGF2ZU0KKwkgKi8KKwlyZWFkX2xvY2soJnNrLT5za19jYWxsYmFja19sb2NrKTsKKyAgICAgICAgaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpIHsKKwkJc3RydWN0IHNvY2tldCAqc29jayA9IHNrLT5za19zb2NrZXQ7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZShzay0+c2tfc2xlZXApOworCQlpZiAoc29jayAmJiBzb2NrLT5mYXN5bmNfbGlzdCAmJgorCQkgICAgIXRlc3RfYml0KFNPQ0tfQVNZTkNfV0FJVERBVEEsICZzb2NrLT5mbGFncykpCisJCQlfX2tpbGxfZmFzeW5jKHNvY2stPmZhc3luY19saXN0LCBzaWcsIAorCQkJCSAgICAoc2lnID09IFNJR1VSRykgPyBQT0xMX1BSSSA6IFBPTExfSU4pOworCX0KKwlyZWFkX3VubG9jaygmc2stPnNrX2NhbGxiYWNrX2xvY2spOworb3V0OgorICAgICAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBkbl9uc3Bfb3RoZXJkYXRhKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZG5fc2NwICpzY3AgPSBETl9TSyhzayk7CisJdW5zaWduZWQgc2hvcnQgc2VnbnVtOworCXN0cnVjdCBkbl9za2JfY2IgKmNiID0gRE5fU0tCX0NCKHNrYik7CisJaW50IHF1ZXVlZCA9IDA7CisKKwlpZiAoc2tiLT5sZW4gPCAyKQorCQlnb3RvIG91dDsKKworCWNiLT5zZWdudW0gPSBzZWdudW0gPSBkbl9udG9ocygqKF9fdTE2ICopc2tiLT5kYXRhKTsKKwlza2JfcHVsbChza2IsIDIpOworCisJaWYgKHNlcV9uZXh0KHNjcC0+bnVtb3RoX3Jjdiwgc2VnbnVtKSkgeworCisJCWlmIChkbl9xdWV1ZV9za2Ioc2ssIHNrYiwgU0lHVVJHLCAmc2NwLT5vdGhlcl9yZWNlaXZlX3F1ZXVlKSA9PSAwKSB7CisJCQlzZXFfYWRkKCZzY3AtPm51bW90aF9yY3YsIDEpOworCQkJc2NwLT5vdGhlcl9yZXBvcnQgPSAwOworCQkJcXVldWVkID0gMTsKKwkJfQorCX0KKworCWRuX25zcF9zZW5kX290aF9hY2soc2spOworb3V0OgorCWlmICghcXVldWVkKQorCQlrZnJlZV9za2Ioc2tiKTsKK30KKworc3RhdGljIHZvaWQgZG5fbnNwX2RhdGEoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBxdWV1ZWQgPSAwOworCXVuc2lnbmVkIHNob3J0IHNlZ251bTsKKwlzdHJ1Y3QgZG5fc2tiX2NiICpjYiA9IEROX1NLQl9DQihza2IpOworCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKKworCWlmIChza2ItPmxlbiA8IDIpCisJCWdvdG8gb3V0OworCisJY2ItPnNlZ251bSA9IHNlZ251bSA9IGRuX250b2hzKCooX191MTYgKilza2ItPmRhdGEpOworCXNrYl9wdWxsKHNrYiwgMik7CisKKwlpZiAoc2VxX25leHQoc2NwLT5udW1kYXRfcmN2LCBzZWdudW0pKSB7CisgICAgICAgICAgICAgICAgaWYgKGRuX3F1ZXVlX3NrYihzaywgc2tiLCBTSUdJTywgJnNrLT5za19yZWNlaXZlX3F1ZXVlKSA9PSAwKSB7CisJCQlzZXFfYWRkKCZzY3AtPm51bWRhdF9yY3YsIDEpOworICAgICAgICAgICAgICAgIAlxdWV1ZWQgPSAxOworICAgICAgICAgICAgICAgIH0KKworCQlpZiAoKHNjcC0+Zmxvd2xvY19zdyA9PSBETl9TRU5EKSAmJiBkbl9jb25nZXN0ZWQoc2spKSB7CisJCQlzY3AtPmZsb3dsb2Nfc3cgPSBETl9ET05UU0VORDsKKwkJCWRuX25zcF9zZW5kX2xpbmsoc2ssIEROX0RPTlRTRU5ELCAwKTsKKwkJfQorICAgICAgICB9CisKKwlkbl9uc3Bfc2VuZF9kYXRhX2Fjayhzayk7CitvdXQ6CisJaWYgKCFxdWV1ZWQpCisJCWtmcmVlX3NrYihza2IpOworfQorCisvKgorICogSWYgb25lIG9mIG91ciBjb25uaW5pdCBtZXNzYWdlcyBpcyByZXR1cm5lZCwgdGhpcyBmdW5jdGlvbgorICogZGVhbHMgd2l0aCBpdC4gSXQgcHV0cyB0aGUgc29ja2V0IGludG8gdGhlIE5PX0NPTU1VTklDQVRJT04KKyAqIHN0YXRlLgorICovCitzdGF0aWMgdm9pZCBkbl9yZXR1cm5lZF9jb25uX2luaXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKKworCWlmIChzY3AtPnN0YXRlID09IEROX0NJKSB7CisJCXNjcC0+c3RhdGUgPSBETl9OQzsKKwkJc2stPnNrX3N0YXRlID0gVENQX0NMT1NFOworCQlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkKKwkJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCX0KKworCWtmcmVlX3NrYihza2IpOworfQorCitzdGF0aWMgaW50IGRuX25zcF9ub19zb2NrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgc2hvcnQgcmVhc29uKQoreworCXN0cnVjdCBkbl9za2JfY2IgKmNiID0gRE5fU0tCX0NCKHNrYik7CisJaW50IHJldCA9IE5FVF9SWF9EUk9QOworCisJLyogTXVzdCBub3QgcmVwbHkgdG8gcmV0dXJuZWQgcGFja2V0cyAqLworCWlmIChjYi0+cnRfZmxhZ3MgJiBETl9SVF9GX1JUUykKKwkJZ290byBvdXQ7CisKKwlpZiAoKHJlYXNvbiAhPSBOU1BfUkVBU09OX09LKSAmJiAoKGNiLT5uc3BfZmxhZ3MgJiAweDBjKSA9PSAweDA4KSkgeworCQlzd2l0Y2goY2ItPm5zcF9mbGFncyAmIDB4NzApIHsKKwkJCWNhc2UgMHgxMDoKKwkJCWNhc2UgMHg2MDogLyogKFJldHJhbnNtaXR0ZWQpIENvbm5lY3QgSW5pdCAqLworCQkJCWRuX25zcF9yZXR1cm5fZGlzYyhza2IsIE5TUF9ESVNDSU5JVCwgcmVhc29uKTsKKwkJCQlyZXQgPSBORVRfUlhfU1VDQ0VTUzsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgyMDogLyogQ29ubmVjdCBDb25maXJtICovCisJCQkJZG5fbnNwX3JldHVybl9kaXNjKHNrYiwgTlNQX0RJU0NDT05GLCByZWFzb24pOworCQkJCXJldCA9IE5FVF9SWF9TVUNDRVNTOworCQkJCWJyZWFrOworCQl9CisJfQorCitvdXQ6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkbl9uc3BfcnhfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGRuX3NrYl9jYiAqY2IgPSBETl9TS0JfQ0Ioc2tiKTsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopc2tiLT5kYXRhOworCXVuc2lnbmVkIHNob3J0IHJlYXNvbiA9IE5TUF9SRUFTT05fTkw7CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCAyKSkKKwkJZ290byBmcmVlX291dDsKKworCXNrYi0+aC5yYXcgICAgPSBza2ItPmRhdGE7CisJY2ItPm5zcF9mbGFncyA9ICpwdHIrKzsKKworCWlmIChkZWNuZXRfZGVidWdfbGV2ZWwgJiAyKQorCQlwcmludGsoS0VSTl9ERUJVRyAiZG5fbnNwX3J4OiBNZXNzYWdlIHR5cGUgMHglMDJ4XG4iLCAoaW50KWNiLT5uc3BfZmxhZ3MpOworCisJaWYgKGNiLT5uc3BfZmxhZ3MgJiAweDgzKSAKKwkJZ290byBmcmVlX291dDsKKworCS8qCisJICogRmlsdGVyIG91dCBjb25uaW5pdHMgYW5kIHVzZWxlc3MgcGFja2V0IHR5cGVzCisJICovCisJaWYgKChjYi0+bnNwX2ZsYWdzICYgMHgwYykgPT0gMHgwOCkgeworCQlzd2l0Y2goY2ItPm5zcF9mbGFncyAmIDB4NzApIHsKKwkJCWNhc2UgMHgwMDogLyogTk9QICovCisJCQljYXNlIDB4NzA6IC8qIFJlc2VydmVkICovCisJCQljYXNlIDB4NTA6IC8qIFJlc2VydmVkLCBQaGFzZSBJSSBub2RlIGluaXQgKi8KKwkJCQlnb3RvIGZyZWVfb3V0OworCQkJY2FzZSAweDEwOgorCQkJY2FzZSAweDYwOgorCQkJCWlmICh1bmxpa2VseShjYi0+cnRfZmxhZ3MgJiBETl9SVF9GX1JUUykpCisJCQkJCWdvdG8gZnJlZV9vdXQ7CisJCQkJc2sgPSBkbl9maW5kX2xpc3RlbmVyKHNrYiwgJnJlYXNvbik7CisJCQkJZ290byBnb3RfaXQ7CisJCX0KKwl9CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCAzKSkKKwkJZ290byBmcmVlX291dDsKKworCS8qCisJICogR3JhYiB0aGUgZGVzdGluYXRpb24gYWRkcmVzcy4KKwkgKi8KKwljYi0+ZHN0X3BvcnQgPSAqKHVuc2lnbmVkIHNob3J0ICopcHRyOworCWNiLT5zcmNfcG9ydCA9IDA7CisJcHRyICs9IDI7CisKKwkvKgorCSAqIElmIG5vdCBhIGNvbm5hY2ssIGdyYWIgdGhlIHNvdXJjZSBhZGRyZXNzIHRvby4KKwkgKi8KKwlpZiAocHNrYl9tYXlfcHVsbChza2IsIDUpKSB7CisJCWNiLT5zcmNfcG9ydCA9ICoodW5zaWduZWQgc2hvcnQgKilwdHI7CisJCXB0ciArPSAyOworCQlza2JfcHVsbChza2IsIDUpOworCX0KKworCS8qCisJICogUmV0dXJuZWQgcGFja2V0cy4uLgorCSAqIFN3YXAgc3JjICYgZHN0IGFuZCBsb29rIHVwIGluIHRoZSBub3JtYWwgd2F5LgorCSAqLworCWlmICh1bmxpa2VseShjYi0+cnRfZmxhZ3MgJiBETl9SVF9GX1JUUykpIHsKKwkJdW5zaWduZWQgc2hvcnQgdG1wID0gY2ItPmRzdF9wb3J0OworCQljYi0+ZHN0X3BvcnQgPSBjYi0+c3JjX3BvcnQ7CisJCWNiLT5zcmNfcG9ydCA9IHRtcDsKKwkJdG1wID0gY2ItPmRzdDsKKwkJY2ItPmRzdCA9IGNiLT5zcmM7CisJCWNiLT5zcmMgPSB0bXA7CisJfQorCisJLyoKKwkgKiBGaW5kIHRoZSBzb2NrZXQgdG8gd2hpY2ggdGhpcyBza2IgaXMgZGVzdGluZWQuCisJICovCisJc2sgPSBkbl9maW5kX2J5X3NrYihza2IpOworZ290X2l0OgorCWlmIChzayAhPSBOVUxMKSB7CisJCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKKwkJaW50IHJldDsKKworCQkvKiBSZXNldCBiYWNrb2ZmICovCisJCXNjcC0+bnNwX3J4dHNoaWZ0ID0gMDsKKworCQkvKgorCQkgKiBXZSBsaW5lYXJpemUgZXZlcnl0aGluZyBleGNlcHQgZGF0YSBzZWdtZW50cyBoZXJlLgorCQkgKi8KKwkJaWYgKGNiLT5uc3BfZmxhZ3MgJiB+MHg2MCkgeworCQkJaWYgKHVubGlrZWx5KHNrYl9pc19ub25saW5lYXIoc2tiKSkgJiYKKwkJCSAgICBza2JfbGluZWFyaXplKHNrYiwgR0ZQX0FUT01JQykgIT0gMCkKKwkJCQlnb3RvIGZyZWVfb3V0OworCQl9CisKKwkJYmhfbG9ja19zb2NrKHNrKTsKKwkJcmV0ID0gTkVUX1JYX1NVQ0NFU1M7CisJCWlmIChkZWNuZXRfZGVidWdfbGV2ZWwgJiA4KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIk5TUDogMHglMDJ4IDB4JTAyeCAweCUwNHggMHglMDR4ICVkXG4iLAorCQkJCShpbnQpY2ItPnJ0X2ZsYWdzLCAoaW50KWNiLT5uc3BfZmxhZ3MsIAorCQkJCShpbnQpY2ItPnNyY19wb3J0LCAoaW50KWNiLT5kc3RfcG9ydCwgCisJCQkJISFzb2NrX293bmVkX2J5X3VzZXIoc2spKTsKKwkJaWYgKCFzb2NrX293bmVkX2J5X3VzZXIoc2spKQorCQkJcmV0ID0gZG5fbnNwX2JhY2tsb2dfcmN2KHNrLCBza2IpOworCQllbHNlCisJCQlza19hZGRfYmFja2xvZyhzaywgc2tiKTsKKwkJYmhfdW5sb2NrX3NvY2soc2spOworCQlzb2NrX3B1dChzayk7CisKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gZG5fbnNwX25vX3NvY2tldChza2IsIHJlYXNvbik7CisKK2ZyZWVfb3V0OgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiBORVRfUlhfRFJPUDsKK30KKworaW50IGRuX25zcF9yeChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBORl9IT09LKFBGX0RFQ25ldCwgTkZfRE5fTE9DQUxfSU4sIHNrYiwgc2tiLT5kZXYsIE5VTEwsIGRuX25zcF9yeF9wYWNrZXQpOworfQorCisvKgorICogVGhpcyBpcyB0aGUgbWFpbiByZWNlaXZlIHJvdXRpbmUgZm9yIHNvY2tldHMuIEl0IGlzIGNhbGxlZAorICogZnJvbSB0aGUgYWJvdmUgd2hlbiB0aGUgc29ja2V0IGlzIG5vdCBidXN5LCBhbmQgYWxzbyBmcm9tCisgKiBzb2NrX3JlbGVhc2UoKSB3aGVuIHRoZXJlIGlzIGEgYmFja2xvZyBxdWV1ZWQgdXAuCisgKi8KK2ludCBkbl9uc3BfYmFja2xvZ19yY3Yoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKKwlzdHJ1Y3QgZG5fc2tiX2NiICpjYiA9IEROX1NLQl9DQihza2IpOworCisJaWYgKGNiLT5ydF9mbGFncyAmIEROX1JUX0ZfUlRTKSB7CisJCWlmIChjYi0+bnNwX2ZsYWdzID09IDB4MTggfHwgY2ItPm5zcF9mbGFncyA9PSAweDY4KQorCQkJZG5fcmV0dXJuZWRfY29ubl9pbml0KHNrLCBza2IpOworCQllbHNlCisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOworCX0KKworCS8qCisJICogQ29udHJvbCBwYWNrZXQuCisJICovCisJaWYgKChjYi0+bnNwX2ZsYWdzICYgMHgwYykgPT0gMHgwOCkgeworCQlzd2l0Y2goY2ItPm5zcF9mbGFncyAmIDB4NzApIHsKKwkJCWNhc2UgMHgxMDoKKwkJCWNhc2UgMHg2MDoKKwkJCQlkbl9uc3BfY29ubl9pbml0KHNrLCBza2IpOworCQkJCWJyZWFrOworCQkJY2FzZSAweDIwOgorCQkJCWRuX25zcF9jb25uX2NvbmYoc2ssIHNrYik7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MzA6CisJCQkJZG5fbnNwX2Rpc2NfaW5pdChzaywgc2tiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHg0MDogICAgICAKKwkJCQlkbl9uc3BfZGlzY19jb25mKHNrLCBza2IpOworCQkJCWJyZWFrOworCQl9CisKKwl9IGVsc2UgaWYgKGNiLT5uc3BfZmxhZ3MgPT0gMHgyNCkgeworCQkvKgorCQkgKiBTcGVjaWFsIGZvciBjb25uYWNrcywgJ2NvcyB0aGV5IGRvbid0IGhhdmUKKwkJICogYWNrIGRhdGEgb3IgYWNrIG90aGVyZGF0YSBpbmZvLgorCQkgKi8KKwkJZG5fbnNwX2Nvbm5fYWNrKHNrLCBza2IpOworCX0gZWxzZSB7CisJCWludCBvdGhlciA9IDE7CisKKwkJLyogYm90aCBkYXRhIGFuZCBhY2sgZnJhbWVzIGNhbiBraWNrIGEgQ0Mgc29ja2V0IGludG8gUlVOICovCisJCWlmICgoc2NwLT5zdGF0ZSA9PSBETl9DQykgJiYgIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkgeworCQkJc2NwLT5zdGF0ZSA9IEROX1JVTjsKKwkJCXNrLT5za19zdGF0ZSA9IFRDUF9FU1RBQkxJU0hFRDsKKwkJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCQl9CisKKwkJaWYgKChjYi0+bnNwX2ZsYWdzICYgMHgxYykgPT0gMCkKKwkJCW90aGVyID0gMDsKKwkJaWYgKGNiLT5uc3BfZmxhZ3MgPT0gMHgwNCkKKwkJCW90aGVyID0gMDsKKworCQkvKgorCQkgKiBSZWFkIG91dCBhY2sgZGF0YSBoZXJlLCB0aGlzIGFwcGxpZXMgZXF1YWxseQorCQkgKiB0byBkYXRhLCBvdGhlciBkYXRhLCBsaW5rIHNlcml2Y2UgYW5kIGJvdGgKKwkJICogYWNrIGRhdGEgYW5kIGFjayBvdGhlcmRhdGEuCisJCSAqLworCQlkbl9wcm9jZXNzX2Fjayhzaywgc2tiLCBvdGhlcik7CisKKwkJLyoKKwkJICogSWYgd2UndmUgc29tZSBzb3J0IG9mIGRhdGEgaGVyZSB0aGVuIGNhbGwgYQorCQkgKiBzdWl0YWJsZSByb3V0aW5lIGZvciBkZWFsaW5nIHdpdGggaXQsIG90aGVyd2lzZQorCQkgKiB0aGUgcGFja2V0IGlzIGFuIGFjayBhbmQgY2FuIGJlIGRpc2NhcmRlZC4KKwkJICovCisJCWlmICgoY2ItPm5zcF9mbGFncyAmIDB4MGMpID09IDApIHsKKworCQkJaWYgKHNjcC0+c3RhdGUgIT0gRE5fUlVOKQorCQkJCWdvdG8gZnJlZV9vdXQ7CisKKwkJCXN3aXRjaChjYi0+bnNwX2ZsYWdzKSB7CisJCQkJY2FzZSAweDEwOiAvKiBMUyAqLworCQkJCQlkbl9uc3BfbGlua3NlcnZpY2Uoc2ssIHNrYik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMHgzMDogLyogT0QgKi8KKwkJCQkJZG5fbnNwX290aGVyZGF0YShzaywgc2tiKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJZG5fbnNwX2RhdGEoc2ssIHNrYik7CisJCQl9CisKKwkJfSBlbHNlIHsgLyogQWNrLCBjaHVjayBpdCBvdXQgaGVyZSAqLworZnJlZV9vdXQ6CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJfQorCX0KKworCXJldHVybiBORVRfUlhfU1VDQ0VTUzsKK30KKwpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl9uc3Bfb3V0LmMgYi9uZXQvZGVjbmV0L2RuX25zcF9vdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmFiYmYzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2RlY25ldC9kbl9uc3Bfb3V0LmMKQEAgLTAsMCArMSw3ODIgQEAKKworLyoKKyAqIERFQ25ldCAgICAgICBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgREVDbmV0IHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqICAgICAgICAgICAgICBvcGVyYXRpbmcgc3lzdGVtLiAgREVDbmV0IGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICogICAgICAgICAgICAgIGludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqICAgICAgICAgICAgICBERUNuZXQgTmV0d29yayBTZXJ2aWNlcyBQcm90b2NvbCAoT3V0cHV0KQorICoKKyAqIEF1dGhvcjogICAgICBFZHVhcmRvIE1hcmNlbG8gU2VycmF0IDxlbXNlcnJhdEBnZW9jaXRpZXMuY29tPgorICoKKyAqIENoYW5nZXM6CisgKgorICogICAgU3RldmUgV2hpdGVob3VzZTogIFNwbGl0IGludG8gZG5fbnNwX2luLmMgYW5kIGRuX25zcF9vdXQuYyBmcm9tCisgKiAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWwgZG5fbnNwLmMuCisgKiAgICBTdGV2ZSBXaGl0ZWhvdXNlOiAgVXBkYXRlZCB0byB3b3JrIHdpdGggbXkgbmV3IHJvdXRpbmcgYXJjaGl0ZWN0dXJlLgorICogICAgU3RldmUgV2hpdGVob3VzZTogIEFkZGVkIGNoYW5nZXMgZnJvbSBFZHVhcmRvIFNlcnJhdCdzIHBhdGNoZXMuCisgKiAgICBTdGV2ZSBXaGl0ZWhvdXNlOiAgTm93IGNvbm5pbml0cyBoYXZlIHRoZSAicmV0dXJuIiBiaXQgc2V0LgorICogICAgU3RldmUgV2hpdGVob3VzZTogIEZpeGVzIHRvIGNoZWNrIGFsbG9jJ2Qgc2ticyBhcmUgbm9uIE5VTEwhCisgKiAgICAgICAgICAgICAgICAgICAgICAgTW92ZWQgb3V0cHV0IHN0YXRlIG1hY2hpbmUgaW50byBvbmUgZnVuY3Rpb24KKyAqICAgIFN0ZXZlIFdoaXRlaG91c2U6ICBOZXcgb3V0cHV0IHN0YXRlIG1hY2hpbmUKKyAqICAgICAgICAgUGF1bCBLb25pbmc6ICBDb25uZWN0IENvbmZpcm0gbWVzc2FnZSBmaXguCisgKiAgICAgIEVkdWFyZG8gU2VycmF0OiAgRml4IHRvIHN0b3AgZG5fbnNwX2RvX2Rpc2MoKSBzZW5kaW5nIG1hbGZvcm1lZCBwYWNrZXRzLgorICogICAgU3RldmUgV2hpdGVob3VzZTogIGRuX25zcF9vdXRwdXQoKSBhbmQgZnJpZW5kcyBuZWVkZWQgYSBzcHJpbmcgY2xlYW4KKyAqICAgIFN0ZXZlIFdoaXRlaG91c2U6ICBNb3ZlZCBkbl9uc3Bfc2VuZCgpIGluIGhlcmUgZnJvbSByb3V0ZS5oCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIChjKSAxOTk1LTE5OTggRS5NLiBTZXJyYXQJCWVtc2VycmF0QGdlb2NpdGllcy5jb20KKyAgICAKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvcm91dGUuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPiAgICAgIAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9wYWNrZXQuaD4KKyNpbmNsdWRlIDxuZXQvbmVpZ2hib3VyLmg+CisjaW5jbHVkZSA8bmV0L2RzdC5oPgorI2luY2x1ZGUgPG5ldC9mbG93Lmg+CisjaW5jbHVkZSA8bmV0L2RuLmg+CisjaW5jbHVkZSA8bmV0L2RuX25zcC5oPgorI2luY2x1ZGUgPG5ldC9kbl9kZXYuaD4KKyNpbmNsdWRlIDxuZXQvZG5fcm91dGUuaD4KKworCitzdGF0aWMgaW50IG5zcF9iYWNrb2ZmW05TUF9NQVhSWFRTSElGVCArIDFdID0geyAxLCAyLCA0LCA4LCAxNiwgMzIsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0IH07CisKK3N0YXRpYyB2b2lkIGRuX25zcF9zZW5kKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc2tiLT5zazsKKwlzdHJ1Y3QgZG5fc2NwICpzY3AgPSBETl9TSyhzayk7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0OworCXN0cnVjdCBmbG93aSBmbDsKKworCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJc2NwLT5zdGFtcCA9IGppZmZpZXM7CisKKwlkc3QgPSBza19kc3RfY2hlY2soc2ssIDApOworCWlmIChkc3QpIHsKK3RyeV9hZ2FpbjoKKwkJc2tiLT5kc3QgPSBkc3Q7CisJCWRzdF9vdXRwdXQoc2tiKTsKKwkJcmV0dXJuOworCX0KKworCW1lbXNldCgmZmwsIDAsIHNpemVvZihmbCkpOworCWZsLm9pZiA9IHNrLT5za19ib3VuZF9kZXZfaWY7CisJZmwuZmxkX3NyYyA9IGRuX3NhZGRyMmRuKCZzY3AtPmFkZHIpOworCWZsLmZsZF9kc3QgPSBkbl9zYWRkcjJkbigmc2NwLT5wZWVyKTsKKwlkbl9za19wb3J0c19jb3B5KCZmbCwgc2NwKTsKKwlmbC5wcm90byA9IEROUFJPVE9fTlNQOworCWlmIChkbl9yb3V0ZV9vdXRwdXRfc29jaygmc2stPnNrX2RzdF9jYWNoZSwgJmZsLCBzaywgMCkgPT0gMCkgeworCQlkc3QgPSBza19kc3RfZ2V0KHNrKTsKKwkJc2stPnNrX3JvdXRlX2NhcHMgPSBkc3QtPmRldi0+ZmVhdHVyZXM7CisJCWdvdG8gdHJ5X2FnYWluOworCX0KKworCXNrLT5za19lcnIgPSBFSE9TVFVOUkVBQ0g7CisJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCisJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworfQorCisKKy8qCisgKiBJZiBzayA9PSBOVUxMLCB0aGVuIHdlIGFzc3VtZSB0aGF0IHdlIGFyZSBzdXBwb3NlZCB0byBiZSBtYWtpbmcKKyAqIGEgcm91dGluZyBsYXllciBza2IuIElmIHNrICE9IE5VTEwsIHRoZW4gd2UgYXJlIHN1cHBvc2VkIHRvIGJlCisgKiBjcmVhdGluZyBhbiBza2IgZm9yIHRoZSBOU1AgbGF5ZXIuCisgKgorICogVGhlIGV2ZW50dWFsIGFpbSBpcyBmb3IgZWFjaCBzb2NrZXQgdG8gaGF2ZSBhIGNhY2hlZCBoZWFkZXIgc2l6ZQorICogZm9yIGl0cyBvdXRnb2luZyBwYWNrZXRzLCBhbmQgdG8gc2V0IGhkciBmcm9tIHRoaXMgd2hlbiBzayAhPSBOVUxMLgorICovCitzdHJ1Y3Qgc2tfYnVmZiAqZG5fYWxsb2Nfc2tiKHN0cnVjdCBzb2NrICpzaywgaW50IHNpemUsIGludCBwcmkpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgaGRyID0gNjQ7CisKKwlpZiAoKHNrYiA9IGFsbG9jX3NrYihzaXplICsgaGRyLCBwcmkpKSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0ROQV9SVCk7CisJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVVRHT0lORzsKKworCWlmIChzaykKKwkJc2tiX3NldF9vd25lcl93KHNrYiwgc2spOworCisJc2tiX3Jlc2VydmUoc2tiLCBoZHIpOworCisJcmV0dXJuIHNrYjsKK30KKworLyoKKyAqIFdyYXBwZXIgZm9yIHRoZSBhYm92ZSwgZm9yIGFsbG9jcyBvZiBkYXRhIHNrYnMuIFdlIHRyeSBhbmQgZ2V0IHRoZQorICogd2hvbGUgc2l6ZSB0aGF0cyBiZWVuIGFza2VkIGZvciAocGx1cyAxMSBieXRlcyBvZiBoZWFkZXIpLiBJZiB0aGlzCisgKiBmYWlscywgdGhlbiB3ZSB0cnkgZm9yIGFueSBzaXplIG92ZXIgMTYgYnl0ZXMgZm9yIFNPQ0tfU1RSRUFNUy4KKyAqLworc3RydWN0IHNrX2J1ZmYgKmRuX2FsbG9jX3NlbmRfc2tiKHN0cnVjdCBzb2NrICpzaywgc2l6ZV90ICpzaXplLCBpbnQgbm9ibG9jaywgbG9uZyB0aW1lbywgaW50ICplcnIpCit7CisJaW50IHNwYWNlOworCWludCBsZW47CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisKKwkqZXJyID0gMDsKKworCXdoaWxlKHNrYiA9PSBOVUxMKSB7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJKmVyciA9IHNvY2tfaW50cl9lcnJubyh0aW1lbyk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzay0+c2tfc2h1dGRvd24gJiBTRU5EX1NIVVRET1dOKSB7CisJCQkqZXJyID0gRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc2stPnNrX2VycikKKwkJCWJyZWFrOworCisJCWxlbiA9ICpzaXplICsgMTE7CisJCXNwYWNlID0gc2stPnNrX3NuZGJ1ZiAtIGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYyk7CisKKwkJaWYgKHNwYWNlIDwgbGVuKSB7CisJCQlpZiAoKHNrLT5za19zb2NrZXQtPnR5cGUgPT0gU09DS19TVFJFQU0pICYmCisJCQkgICAgKHNwYWNlID49ICgxNiArIDExKSkpCisJCQkJbGVuID0gc3BhY2U7CisJCX0KKworCQlpZiAoc3BhY2UgPCBsZW4pIHsKKwkJCXNldF9iaXQoU09DS19BU1lOQ19OT1NQQUNFLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOworCQkJaWYgKG5vYmxvY2spIHsKKwkJCQkqZXJyID0gRVdPVUxEQkxPQ0s7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNsZWFyX2JpdChTT0NLX0FTWU5DX1dBSVREQVRBLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOworCQkJU09DS19TTEVFUF9QUkUoc2spCisKKwkJCWlmICgoc2stPnNrX3NuZGJ1ZiAtIGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYykpIDwKKwkJCSAgICBsZW4pCisJCQkJc2NoZWR1bGUoKTsKKworCQkJU09DS19TTEVFUF9QT1NUKHNrKQorCQkJY29udGludWU7CisJCX0KKworCQlpZiAoKHNrYiA9IGRuX2FsbG9jX3NrYihzaywgbGVuLCBzay0+c2tfYWxsb2NhdGlvbikpID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQkqc2l6ZSA9IGxlbiAtIDExOworCX0KKworCXJldHVybiBza2I7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgcGVyc2lzdCB0aW1lciBiYXNlZCB1cG9uIHRoZSBzbW9vdGhlZCByb3VuZAorICogdHJpcCB0aW1lIGFuZCB0aGUgdmFyaWFuY2UuIEJhY2tvZmYgYWNjb3JkaW5nIHRvIHRoZQorICogbnNwX2JhY2tvZmZbXSBhcnJheS4KKyAqLwordW5zaWduZWQgbG9uZyBkbl9uc3BfcGVyc2lzdChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGRuX3NjcCAqc2NwID0gRE5fU0soc2spOworCisJdW5zaWduZWQgbG9uZyB0ID0gKChzY3AtPm5zcF9zcnR0ID4+IDIpICsgc2NwLT5uc3BfcnR0dmFyKSA+PiAxOworCisJdCAqPSBuc3BfYmFja29mZltzY3AtPm5zcF9yeHRzaGlmdF07CisKKwlpZiAodCA8IEhaKSB0ID0gSFo7CisJaWYgKHQgPiAoNjAwKkhaKSkgdCA9ICg2MDAqSFopOworCisJaWYgKHNjcC0+bnNwX3J4dHNoaWZ0IDwgTlNQX01BWFJYVFNISUZUKQorCQlzY3AtPm5zcF9yeHRzaGlmdCsrOworCisJLyogcHJpbnRrKEtFUk5fREVCVUcgInJ4dHNoaWZ0ICVsdSwgdD0lbHVcbiIsIHNjcC0+bnNwX3J4dHNoaWZ0LCB0KTsgKi8KKworCXJldHVybiB0OworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgZWFjaCB0aW1lIHdlIGdldCBhbiBlc3RpbWF0ZSBmb3IgdGhlIHJ0dAorICogb24gdGhlIGxpbmsuCisgKi8KK3N0YXRpYyB2b2lkIGRuX25zcF9ydHQoc3RydWN0IHNvY2sgKnNrLCBsb25nIHJ0dCkKK3sKKwlzdHJ1Y3QgZG5fc2NwICpzY3AgPSBETl9TSyhzayk7CisJbG9uZyBzcnR0ID0gKGxvbmcpc2NwLT5uc3Bfc3J0dDsKKwlsb25nIHJ0dHZhciA9IChsb25nKXNjcC0+bnNwX3J0dHZhcjsKKwlsb25nIGRlbHRhOworCisJLyoKKwkgKiBJZiB0aGUgamlmZmllcyBjbG9jayBmbGlwcyBvdmVyIGluIHRoZSBtaWRkbGUgb2YgdGltZXN0YW1wCisJICogZ2F0aGVyaW5nIHRoaXMgdmFsdWUgbWlnaHQgdHVybiBvdXQgbmVnYXRpdmUsIHNvIHdlIG1ha2Ugc3VyZQorCSAqIHRoYXQgaXMgaXQgYWx3YXlzIHBvc2l0aXZlIGhlcmUuCisJICovCisJaWYgKHJ0dCA8IDApIAorCQlydHQgPSAtcnR0OworCS8qCisJICogQWRkIG5ldyBydHQgdG8gc21vb3RoZWQgYXZlcmFnZQorCSAqLworCWRlbHRhID0gKChydHQgPDwgMykgLSBzcnR0KTsKKwlzcnR0ICs9IChkZWx0YSA+PiAzKTsKKwlpZiAoc3J0dCA+PSAxKSAKKwkJc2NwLT5uc3Bfc3J0dCA9ICh1bnNpZ25lZCBsb25nKXNydHQ7CisJZWxzZQorCQlzY3AtPm5zcF9zcnR0ID0gMTsKKworCS8qCisJICogQWRkIG5ldyBydHQgdmFyaWVuY2UgdG8gc21vb3RoZWQgdmFyaWVuY2UKKwkgKi8KKwlkZWx0YSA+Pj0gMTsKKwlydHR2YXIgKz0gKCgoKGRlbHRhPjApPyhkZWx0YSk6KC1kZWx0YSkpIC0gcnR0dmFyKSA+PiAyKTsKKwlpZiAocnR0dmFyID49IDEpIAorCQlzY3AtPm5zcF9ydHR2YXIgPSAodW5zaWduZWQgbG9uZylydHR2YXI7CisJZWxzZQorCQlzY3AtPm5zcF9ydHR2YXIgPSAxOworCisJLyogcHJpbnRrKEtFUk5fREVCVUcgInNydHQ9JWx1IHJ0dHZhcj0lbHVcbiIsIHNjcC0+bnNwX3NydHQsIHNjcC0+bnNwX3J0dHZhcik7ICovCit9CisKKy8qKgorICogZG5fbnNwX2Nsb25lX2FuZF9zZW5kIC0gU2VuZCBhIGRhdGEgcGFja2V0IGJ5IGNsb25pbmcgaXQKKyAqIEBza2I6IFRoZSBwYWNrZXQgdG8gY2xvbmUgYW5kIHRyYW5zbWl0CisgKiBAZ2ZwOiBtZW1vcnkgYWxsb2NhdGlvbiBmbGFnCisgKgorICogQ2xvbmUgYSBxdWV1ZWQgZGF0YSBvciBvdGhlciBkYXRhIHBhY2tldCBhbmQgdHJhbnNtaXQgaXQuCisgKgorICogUmV0dXJuczogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgcGFja2V0IGhhcyBiZWVuIHNlbnQgcHJldmlvdXNseQorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGRuX25zcF9jbG9uZV9hbmRfc2VuZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZ2ZwKQoreworCXN0cnVjdCBkbl9za2JfY2IgKmNiID0gRE5fU0tCX0NCKHNrYik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjI7CisJaW50IHJldCA9IDA7CisKKwlpZiAoKHNrYjIgPSBza2JfY2xvbmUoc2tiLCBnZnApKSAhPSBOVUxMKSB7CisJCXJldCA9IGNiLT54bWl0X2NvdW50OworCQljYi0+eG1pdF9jb3VudCsrOworCQljYi0+c3RhbXAgPSBqaWZmaWVzOworCQlza2IyLT5zayA9IHNrYi0+c2s7CisJCWRuX25zcF9zZW5kKHNrYjIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogZG5fbnNwX291dHB1dCAtIFRyeSBhbmQgc2VuZCBzb21ldGhpbmcgZnJvbSBzb2NrZXQgcXVldWVzCisgKiBAc2s6IFRoZSBzb2NrZXQgd2hvc2UgcXVldWVzIGFyZSB0byBiZSBpbnZlc3RpZ2F0ZWQKKyAqIEBnZnA6IFRoZSBtZW1vcnkgYWxsb2NhdGlvbiBmbGFncworICoKKyAqIFRyeSBhbmQgc2VuZCB0aGUgcGFja2V0IG9uIHRoZSBlbmQgb2YgdGhlIGRhdGEgYW5kIG90aGVyIGRhdGEgcXVldWVzLgorICogT3RoZXIgZGF0YSBnZXRzIHByaW9yaXR5IG92ZXIgZGF0YSwgYW5kIGlmIHdlIHJldHJhbnNtaXQgYSBwYWNrZXQgd2UKKyAqIHJlZHVjZSB0aGUgd2luZG93IGJ5IGRpdmlkaW5nIGl0IGluIHR3by4KKyAqCisgKi8KK3ZvaWQgZG5fbnNwX291dHB1dChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGRuX3NjcCAqc2NwID0gRE5fU0soc2spOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgcmVkdWNlX3dpbiA9IDA7CisKKwkvKgorCSAqIEZpcnN0IHdlIGNoZWNrIGZvciBvdGhlcmRhdGEvbGlua3NlcnZpY2UgbWVzc2FnZXMKKwkgKi8KKwlpZiAoKHNrYiA9IHNrYl9wZWVrKCZzY3AtPm90aGVyX3htaXRfcXVldWUpKSAhPSBOVUxMKQorCQlyZWR1Y2Vfd2luID0gZG5fbnNwX2Nsb25lX2FuZF9zZW5kKHNrYiwgR0ZQX0FUT01JQyk7CisKKwkvKgorCSAqIElmIHdlIG1heSBub3Qgc2VuZCBhbnkgZGF0YSwgd2UgZG9uJ3QuCisJICogSWYgd2UgYXJlIHN0aWxsIHRyeWluZyB0byBnZXQgc29tZSBvdGhlciBkYXRhIGRvd24gdGhlCisJICogY2hhbm5lbCwgd2UgZG9uJ3QgdHJ5IGFuZCBzZW5kIGFueSBkYXRhLgorCSAqLworCWlmIChyZWR1Y2Vfd2luIHx8IChzY3AtPmZsb3dyZW1fc3cgIT0gRE5fU0VORCkpCisJCWdvdG8gcmVjYWxjX3dpbmRvdzsKKworCWlmICgoc2tiID0gc2tiX3BlZWsoJnNjcC0+ZGF0YV94bWl0X3F1ZXVlKSkgIT0gTlVMTCkKKwkJcmVkdWNlX3dpbiA9IGRuX25zcF9jbG9uZV9hbmRfc2VuZChza2IsIEdGUF9BVE9NSUMpOworCisJLyoKKwkgKiBJZiB3ZSd2ZSBzZW50IGFueSBmcmFtZSBtb3JlIHRoYW4gb25jZSwgd2UgY3V0IHRoZQorCSAqIHNlbmQgd2luZG93IHNpemUgaW4gaGFsZi4gVGhlcmUgaXMgYWx3YXlzIGEgbWluaW11bQorCSAqIHdpbmRvdyBzaXplIG9mIG9uZSBhdmFpbGFibGUuCisJICovCityZWNhbGNfd2luZG93OgorCWlmIChyZWR1Y2Vfd2luKSB7CisJCXNjcC0+c25kX3dpbmRvdyA+Pj0gMTsKKwkJaWYgKHNjcC0+c25kX3dpbmRvdyA8IE5TUF9NSU5fV0lORE9XKQorCQkJc2NwLT5zbmRfd2luZG93ID0gTlNQX01JTl9XSU5ET1c7CisJfQorfQorCitpbnQgZG5fbnNwX3htaXRfdGltZW91dChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGRuX3NjcCAqc2NwID0gRE5fU0soc2spOworCisJZG5fbnNwX291dHB1dChzayk7CisKKwlpZiAoc2tiX3F1ZXVlX2xlbigmc2NwLT5kYXRhX3htaXRfcXVldWUpIHx8IHNrYl9xdWV1ZV9sZW4oJnNjcC0+b3RoZXJfeG1pdF9xdWV1ZSkpCisJCXNjcC0+cGVyc2lzdCA9IGRuX25zcF9wZXJzaXN0KHNrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgKmRuX21rX2NvbW1vbl9oZWFkZXIoc3RydWN0IGRuX3NjcCAqc2NwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBjaGFyIG1zZ2ZsYWcsIGludCBsZW4pCit7CisJdW5zaWduZWQgY2hhciAqcHRyID0gc2tiX3B1c2goc2tiLCBsZW4pOworCisJQlVHX09OKGxlbiA8IDUpOworCisJKnB0cisrID0gbXNnZmxhZzsKKwkqKCh1bnNpZ25lZCBzaG9ydCAqKXB0cikgPSBzY3AtPmFkZHJyZW07CisJcHRyICs9IDI7CisJKigodW5zaWduZWQgc2hvcnQgKilwdHIpID0gc2NwLT5hZGRybG9jOworCXB0ciArPSAyOworCXJldHVybiBwdHI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCAqZG5fbWtfYWNrX2hlYWRlcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGNoYXIgbXNnZmxhZywgaW50IGhsZW4sIGludCBvdGhlcikKK3sKKwlzdHJ1Y3QgZG5fc2NwICpzY3AgPSBETl9TSyhzayk7CisJdW5zaWduZWQgc2hvcnQgYWNrbnVtID0gc2NwLT5udW1kYXRfcmN2ICYgMHgwRkZGOworCXVuc2lnbmVkIHNob3J0IGFja2NycyA9IHNjcC0+bnVtb3RoX3JjdiAmIDB4MEZGRjsKKwl1bnNpZ25lZCBzaG9ydCAqcHRyOworCisJQlVHX09OKGhsZW4gPCA5KTsKKworCXNjcC0+YWNreG10X2RhdCA9IGFja251bTsKKwlzY3AtPmFja3htdF9vdGggPSBhY2tjcnM7CisJYWNrbnVtIHw9IDB4ODAwMDsKKwlhY2tjcnMgfD0gMHg4MDAwOworCisJLyogSWYgdGhpcyBpcyBhbiAib3RoZXIgZGF0YS9hY2siIG1lc3NhZ2UsIHN3YXAgYWNrbnVtIGFuZCBhY2tjcnMgKi8KKwlpZiAob3RoZXIpIHsKKwkJdW5zaWduZWQgc2hvcnQgdG1wID0gYWNrbnVtOworCQlhY2tudW0gPSBhY2tjcnM7CisJCWFja2NycyA9IHRtcDsKKwl9CisKKwkvKiBTZXQgImNyb3NzIHN1YmNoYW5uZWwiIGJpdCBpbiBhY2tjcnMgKi8KKwlhY2tjcnMgfD0gMHgyMDAwOworCisJcHRyID0gKHVuc2lnbmVkIHNob3J0ICopZG5fbWtfY29tbW9uX2hlYWRlcihzY3AsIHNrYiwgbXNnZmxhZywgaGxlbik7CisKKwkqcHRyKysgPSBkbl9odG9ucyhhY2tudW0pOworCSpwdHIrKyA9IGRuX2h0b25zKGFja2Nycyk7CisKKwlyZXR1cm4gcHRyOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgKmRuX25zcF9ta19kYXRhX2hlYWRlcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIGludCBvdGgpCit7CisJc3RydWN0IGRuX3NjcCAqc2NwID0gRE5fU0soc2spOworCXN0cnVjdCBkbl9za2JfY2IgKmNiID0gRE5fU0tCX0NCKHNrYik7CisJdW5zaWduZWQgc2hvcnQgKnB0ciA9IGRuX21rX2Fja19oZWFkZXIoc2ssIHNrYiwgY2ItPm5zcF9mbGFncywgMTEsIG90aCk7CisKKwlpZiAodW5saWtlbHkob3RoKSkgeworCQljYi0+c2VnbnVtID0gc2NwLT5udW1vdGg7CisJCXNlcV9hZGQoJnNjcC0+bnVtb3RoLCAxKTsKKwl9IGVsc2UgeworCQljYi0+c2VnbnVtID0gc2NwLT5udW1kYXQ7CisJCXNlcV9hZGQoJnNjcC0+bnVtZGF0LCAxKTsKKwl9CisJKihwdHIrKykgPSBkbl9odG9ucyhjYi0+c2VnbnVtKTsKKworCXJldHVybiBwdHI7Cit9CisKK3ZvaWQgZG5fbnNwX3F1ZXVlX3htaXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZ2ZwLCBpbnQgb3RoKQoreworCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKKwlzdHJ1Y3QgZG5fc2tiX2NiICpjYiA9IEROX1NLQl9DQihza2IpOworCXVuc2lnbmVkIGxvbmcgdCA9ICgoc2NwLT5uc3Bfc3J0dCA+PiAyKSArIHNjcC0+bnNwX3J0dHZhcikgPj4gMTsKKworCWNiLT54bWl0X2NvdW50ID0gMDsKKwlkbl9uc3BfbWtfZGF0YV9oZWFkZXIoc2ssIHNrYiwgb3RoKTsKKworCS8qCisJICogU2xvdyBzdGFydDogSWYgd2UgaGF2ZSBiZWVuIGlkbGUgZm9yIG1vcmUgdGhhbgorCSAqIG9uZSBSVFQsIHRoZW4gcmVzZXQgd2luZG93IHRvIG1pbiBzaXplLgorCSAqLworCWlmICgoamlmZmllcyAtIHNjcC0+c3RhbXApID4gdCkKKwkJc2NwLT5zbmRfd2luZG93ID0gTlNQX01JTl9XSU5ET1c7CisKKwlpZiAob3RoKQorCQlza2JfcXVldWVfdGFpbCgmc2NwLT5vdGhlcl94bWl0X3F1ZXVlLCBza2IpOworCWVsc2UKKwkJc2tiX3F1ZXVlX3RhaWwoJnNjcC0+ZGF0YV94bWl0X3F1ZXVlLCBza2IpOworCisJaWYgKHNjcC0+Zmxvd3JlbV9zdyAhPSBETl9TRU5EKQorCQlyZXR1cm47CisKKwlkbl9uc3BfY2xvbmVfYW5kX3NlbmQoc2tiLCBnZnApOworfQorCisKK2ludCBkbl9uc3BfY2hlY2tfeG1pdF9xdWV1ZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBza19idWZmX2hlYWQgKnEsIHVuc2lnbmVkIHNob3J0IGFja251bSkKK3sKKwlzdHJ1Y3QgZG5fc2tiX2NiICpjYiA9IEROX1NLQl9DQihza2IpOworCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiwgKmxpc3QsICphY2sgPSBOVUxMOworCWludCB3YWtldXAgPSAwOworCWludCB0cnlfcmV0cmFucyA9IDA7CisJdW5zaWduZWQgbG9uZyByZWZ0aW1lID0gY2ItPnN0YW1wOworCXVuc2lnbmVkIGxvbmcgcGt0dGltZTsKKwl1bnNpZ25lZCBzaG9ydCB4bWl0X2NvdW50OworCXVuc2lnbmVkIHNob3J0IHNlZ251bTsKKworCXNrYjIgPSBxLT5uZXh0OworCWxpc3QgPSAoc3RydWN0IHNrX2J1ZmYgKilxOworCXdoaWxlKGxpc3QgIT0gc2tiMikgeworCQlzdHJ1Y3QgZG5fc2tiX2NiICpjYjIgPSBETl9TS0JfQ0Ioc2tiMik7CisKKwkJaWYgKGRuX2JlZm9yZV9vcl9lcXVhbChjYjItPnNlZ251bSwgYWNrbnVtKSkKKwkJCWFjayA9IHNrYjI7CisKKwkJLyogcHJpbnRrKEtFUk5fREVCVUcgImFjazogJXMgJTA0eCAlMDR4XG4iLCBhY2sgPyAiQUNLIiA6ICJTS0lQIiwgKGludCljYjItPnNlZ251bSwgKGludClhY2tudW0pOyAqLworCisJCXNrYjIgPSBza2IyLT5uZXh0OworCisJCWlmIChhY2sgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCS8qIHByaW50ayhLRVJOX0RFQlVHICJjaGVja194bWl0X3F1ZXVlOiAlMDR4LCAlZFxuIiwgYWNrbnVtLCBjYjItPnhtaXRfY291bnQpOyAqLworCisJCS8qIERvZXMgX2xhc3RfIHBhY2tldCBhY2tlZCBoYXZlIHhtaXRfY291bnQgPiAxICovCisJCXRyeV9yZXRyYW5zID0gMDsKKwkJLyogUmVtZW1iZXIgdG8gd2FrZSB1cCB0aGUgc2VuZGluZyBwcm9jZXNzICovCisJCXdha2V1cCA9IDE7CisJCS8qIEtlZXAgdmFyaW91cyBzdGF0aXN0aWNzICovCisJCXBrdHRpbWUgPSBjYjItPnN0YW1wOworCQl4bWl0X2NvdW50ID0gY2IyLT54bWl0X2NvdW50OworCQlzZWdudW0gPSBjYjItPnNlZ251bTsKKwkJLyogUmVtb3ZlIGFuZCBkcm9wIGFjaydlZCBwYWNrZXQgKi8KKwkJc2tiX3VubGluayhhY2spOworCQlrZnJlZV9za2IoYWNrKTsKKwkJYWNrID0gTlVMTDsKKworCQkvKgorCQkgKiBXZSBkb24ndCBleHBlY3QgdG8gc2VlIGFja25vd2xlZGdlbWVudHMgZm9yIHBhY2tldHMgd2UKKwkJICogaGF2ZW4ndCBzZW50IHlldC4KKwkJICovCisJCVdBUk5fT04oeG1pdF9jb3VudCA9PSAwKTsKKworCQkvKgorCQkgKiBJZiB0aGUgcGFja2V0IGhhcyBvbmx5IGJlZW4gc2VudCBvbmNlLCB3ZSBjYW4gdXNlIGl0CisJCSAqIHRvIGNhbGN1bGF0ZSB0aGUgUlRUIGFuZCBhbHNvIG9wZW4gdGhlIHdpbmRvdyBhIGxpdHRsZQorCQkgKiBmdXJ0aGVyLgorCQkgKi8KKwkJaWYgKHhtaXRfY291bnQgPT0gMSkgeworCQkJaWYgKGRuX2VxdWFsKHNlZ251bSwgYWNrbnVtKSkgCisJCQkJZG5fbnNwX3J0dChzaywgKGxvbmcpKHBrdHRpbWUgLSByZWZ0aW1lKSk7CisKKwkJCWlmIChzY3AtPnNuZF93aW5kb3cgPCBzY3AtPm1heF93aW5kb3cpCisJCQkJc2NwLT5zbmRfd2luZG93Kys7CisJCX0KKworCQkvKgorCQkgKiBQYWNrZXQgaGFzIGJlZW4gc2VudCBtb3JlIHRoYW4gb25jZS4gSWYgdGhpcyBpcyB0aGUgbGFzdAorCQkgKiBwYWNrZXQgdG8gYmUgYWNrbm93bGVkZ2VkIHRoZW4gd2Ugd2FudCB0byBzZW5kIHRoZSBuZXh0CisJCSAqIHBhY2tldCBpbiB0aGUgc2VuZCBxdWV1ZSBhZ2FpbiAoYXNzdW1lcyB0aGUgcmVtb3RlIGhvc3QgZG9lcworCQkgKiBnby1iYWNrLU4gZXJyb3IgY29udHJvbCkuCisJCSAqLworCQlpZiAoeG1pdF9jb3VudCA+IDEpCisJCQl0cnlfcmV0cmFucyA9IDE7CisJfQorCisJaWYgKHRyeV9yZXRyYW5zKQorCQlkbl9uc3Bfb3V0cHV0KHNrKTsKKworCXJldHVybiB3YWtldXA7Cit9CisKK3ZvaWQgZG5fbnNwX3NlbmRfZGF0YV9hY2soc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCisJaWYgKChza2IgPSBkbl9hbGxvY19za2Ioc2ssIDksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlza2JfcmVzZXJ2ZShza2IsIDkpOworCWRuX21rX2Fja19oZWFkZXIoc2ssIHNrYiwgMHgwNCwgOSwgMCk7CisJZG5fbnNwX3NlbmQoc2tiKTsKK30KKwordm9pZCBkbl9uc3Bfc2VuZF9vdGhfYWNrKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKworCWlmICgoc2tiID0gZG5fYWxsb2Nfc2tiKHNrLCA5LCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc2tiX3Jlc2VydmUoc2tiLCA5KTsKKwlkbl9ta19hY2tfaGVhZGVyKHNrLCBza2IsIDB4MTQsIDksIDEpOworCWRuX25zcF9zZW5kKHNrYik7Cit9CisKKwordm9pZCBkbl9zZW5kX2Nvbm5fYWNrIChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGRuX3NjcCAqc2NwID0gRE5fU0soc2spOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworICAgICAgICBzdHJ1Y3QgbnNwX2Nvbm5fYWNrX21zZyAqbXNnOworCisJaWYgKChza2IgPSBkbl9hbGxvY19za2Ioc2ssIDMsIHNrLT5za19hbGxvY2F0aW9uKSkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisgICAgICAgIG1zZyA9IChzdHJ1Y3QgbnNwX2Nvbm5fYWNrX21zZyAqKXNrYl9wdXQoc2tiLCAzKTsKKyAgICAgICAgbXNnLT5tc2dmbGcgPSAweDI0OyAgICAgICAgICAgICAgICAgICAKKwltc2ctPmRzdGFkZHIgPSBzY3AtPmFkZHJyZW07CisKKwlkbl9uc3Bfc2VuZChza2IpOwkKK30KKwordm9pZCBkbl9uc3BfZGVsYXllZF9hY2soc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKKworCWlmIChzY3AtPmFja3htdF9vdGggIT0gc2NwLT5udW1vdGhfcmN2KQorCQlkbl9uc3Bfc2VuZF9vdGhfYWNrKHNrKTsKKworCWlmIChzY3AtPmFja3htdF9kYXQgIT0gc2NwLT5udW1kYXRfcmN2KQorCQlkbl9uc3Bfc2VuZF9kYXRhX2Fjayhzayk7Cit9CisKK3N0YXRpYyBpbnQgZG5fbnNwX3JldHJhbnNfY29ubl9jb25mKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgZG5fc2NwICpzY3AgPSBETl9TSyhzayk7CisKKwlpZiAoc2NwLT5zdGF0ZSA9PSBETl9DQykKKwkJZG5fc2VuZF9jb25uX2NvbmYoc2ssIEdGUF9BVE9NSUMpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZG5fc2VuZF9jb25uX2NvbmYoc3RydWN0IHNvY2sgKnNrLCBpbnQgZ2ZwKQoreworCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKyAgICAgICAgc3RydWN0IG5zcF9jb25uX2luaXRfbXNnICptc2c7CisJdW5zaWduZWQgY2hhciBsZW4gPSBzY3AtPmNvbm5kYXRhX291dC5vcHRfb3B0bDsKKworCWlmICgoc2tiID0gZG5fYWxsb2Nfc2tiKHNrLCA1MCArIHNjcC0+Y29ubmRhdGFfb3V0Lm9wdF9vcHRsLCBnZnApKSA9PSBOVUxMKQorCQlyZXR1cm47CisKKyAgICAgICAgbXNnID0gKHN0cnVjdCBuc3BfY29ubl9pbml0X21zZyAqKXNrYl9wdXQoc2tiLCBzaXplb2YoKm1zZykpOworICAgICAgICBtc2ctPm1zZ2ZsZyA9IDB4Mjg7ICAgICAgICAgICAgICAgICAgIAorCW1zZy0+ZHN0YWRkciA9IHNjcC0+YWRkcnJlbTsKKyAgICAgICAgbXNnLT5zcmNhZGRyID0gc2NwLT5hZGRybG9jOworICAgICAgICBtc2ctPnNlcnZpY2VzID0gc2NwLT5zZXJ2aWNlc19sb2M7CisgICAgICAgIG1zZy0+aW5mbyA9IHNjcC0+aW5mb19sb2M7CisgICAgICAgIG1zZy0+c2Vnc2l6ZSA9IGRuX2h0b25zKHNjcC0+c2Vnc2l6ZV9sb2MpOworCisJKnNrYl9wdXQoc2tiLDEpID0gbGVuOworCisJaWYgKGxlbiA+IDApIAorCQltZW1jcHkoc2tiX3B1dChza2IsIGxlbiksIHNjcC0+Y29ubmRhdGFfb3V0Lm9wdF9kYXRhLCBsZW4pOworCQorCisJZG5fbnNwX3NlbmQoc2tiKTsKKworCXNjcC0+cGVyc2lzdCA9IGRuX25zcF9wZXJzaXN0KHNrKTsKKwlzY3AtPnBlcnNpc3RfZnhuID0gZG5fbnNwX3JldHJhbnNfY29ubl9jb25mOworfQorCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgZG5fbnNwX2RvX2Rpc2Moc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBjaGFyIG1zZ2ZsZywgCisJCQl1bnNpZ25lZCBzaG9ydCByZWFzb24sIGludCBnZnAsIHN0cnVjdCBkc3RfZW50cnkgKmRzdCwKKwkJCWludCBkZGwsIHVuc2lnbmVkIGNoYXIgKmRkLCBfX3UxNiByZW0sIF9fdTE2IGxvYykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlpbnQgc2l6ZSA9IDcgKyBkZGwgKyAoKG1zZ2ZsZyA9PSBOU1BfRElTQ0lOSVQpID8gMSA6IDApOworCXVuc2lnbmVkIGNoYXIgKm1zZzsKKworCWlmICgoZHN0ID09IE5VTEwpIHx8IChyZW0gPT0gMCkpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICJERUNuZXQ6IGRuX25zcF9kb19kaXNjOiBCVUchIFBsZWFzZSByZXBvcnQgdGhpcyB0byBTdGV2ZVdAQUNNLm9yZyByZW09JXUgZHN0PSVwXG4iLCAodW5zaWduZWQpcmVtLCBkc3QpOworCQlyZXR1cm47CisJfQorCisJaWYgKChza2IgPSBkbl9hbGxvY19za2Ioc2ssIHNpemUsIGdmcCkpID09IE5VTEwpCisJCXJldHVybjsKKworCW1zZyA9IHNrYl9wdXQoc2tiLCBzaXplKTsKKwkqbXNnKysgPSBtc2dmbGc7CisJKihfX3UxNiAqKW1zZyA9IHJlbTsKKwltc2cgKz0gMjsKKwkqKF9fdTE2ICopbXNnID0gbG9jOworCW1zZyArPSAyOworCSooX191MTYgKiltc2cgPSBkbl9odG9ucyhyZWFzb24pOworCW1zZyArPSAyOworCWlmIChtc2dmbGcgPT0gTlNQX0RJU0NJTklUKQorCQkqbXNnKysgPSBkZGw7CisKKwlpZiAoZGRsKSB7CisJCW1lbWNweShtc2csIGRkLCBkZGwpOworCX0KKworCS8qCisJICogVGhpcyBkb2Vzbid0IGdvIHZpYSB0aGUgZG5fbnNwX3NlbmQoKSBmdW5jdGlvbiBzaW5jZSB3ZSBuZWVkCisJICogdG8gYmUgYWJsZSB0byBzZW5kIGRpc2MgcGFja2V0cyBvdXQgd2hpY2ggaGF2ZSBubyBzb2NrZXQKKwkgKiBhc3NvY2lhdGlvbnMuCisJICovCisJc2tiLT5kc3QgPSBkc3RfY2xvbmUoZHN0KTsKKwlkc3Rfb3V0cHV0KHNrYik7Cit9CisKKwordm9pZCBkbl9uc3Bfc2VuZF9kaXNjKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgY2hhciBtc2dmbGcsIAorCQkJdW5zaWduZWQgc2hvcnQgcmVhc29uLCBpbnQgZ2ZwKQoreworCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKKwlpbnQgZGRsID0gMDsKKworCWlmIChtc2dmbGcgPT0gTlNQX0RJU0NJTklUKQorCQlkZGwgPSBzY3AtPmRpc2NkYXRhX291dC5vcHRfb3B0bDsKKworCWlmIChyZWFzb24gPT0gMCkKKwkJcmVhc29uID0gc2NwLT5kaXNjZGF0YV9vdXQub3B0X3N0YXR1czsKKworCWRuX25zcF9kb19kaXNjKHNrLCBtc2dmbGcsIHJlYXNvbiwgZ2ZwLCBzay0+c2tfZHN0X2NhY2hlLCBkZGwsIAorCQlzY3AtPmRpc2NkYXRhX291dC5vcHRfZGF0YSwgc2NwLT5hZGRycmVtLCBzY3AtPmFkZHJsb2MpOworfQorCisKK3ZvaWQgZG5fbnNwX3JldHVybl9kaXNjKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGNoYXIgbXNnZmxnLCAKKwkJCXVuc2lnbmVkIHNob3J0IHJlYXNvbikKK3sKKwlzdHJ1Y3QgZG5fc2tiX2NiICpjYiA9IEROX1NLQl9DQihza2IpOworCWludCBkZGwgPSAwOworCWludCBnZnAgPSBHRlBfQVRPTUlDOworCisJZG5fbnNwX2RvX2Rpc2MoTlVMTCwgbXNnZmxnLCByZWFzb24sIGdmcCwgc2tiLT5kc3QsIGRkbCwgCisJCQlOVUxMLCBjYi0+c3JjX3BvcnQsIGNiLT5kc3RfcG9ydCk7Cit9CisKKwordm9pZCBkbl9uc3Bfc2VuZF9saW5rKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgY2hhciBsc2ZsYWdzLCBjaGFyIGZjdmFsKQoreworCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKwlpbnQgZ2ZwID0gR0ZQX0FUT01JQzsKKworCWlmICgoc2tiID0gZG5fYWxsb2Nfc2tiKHNrLCBETl9NQVhfTlNQX0RBVEFfSEVBREVSICsgMiwgZ2ZwKSkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc2tiX3Jlc2VydmUoc2tiLCBETl9NQVhfTlNQX0RBVEFfSEVBREVSKTsKKwlwdHIgPSBza2JfcHV0KHNrYiwgMik7CisJRE5fU0tCX0NCKHNrYiktPm5zcF9mbGFncyA9IDB4MTA7CisJKnB0cisrID0gbHNmbGFnczsKKwkqcHRyID0gZmN2YWw7CisKKwlkbl9uc3BfcXVldWVfeG1pdChzaywgc2tiLCBnZnAsIDEpOworCisJc2NwLT5wZXJzaXN0ID0gZG5fbnNwX3BlcnNpc3Qoc2spOworCXNjcC0+cGVyc2lzdF9meG4gPSBkbl9uc3BfeG1pdF90aW1lb3V0OworfQorCitzdGF0aWMgaW50IGRuX25zcF9yZXRyYW5zX2Nvbm5pbml0KHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgZG5fc2NwICpzY3AgPSBETl9TSyhzayk7CisKKwlpZiAoc2NwLT5zdGF0ZSA9PSBETl9DSSkKKwkJZG5fbnNwX3NlbmRfY29ubmluaXQoc2ssIE5TUF9SQ0kpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZG5fbnNwX3NlbmRfY29ubmluaXQoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBjaGFyIG1zZ2ZsZykKK3sKKwlzdHJ1Y3QgZG5fc2NwICpzY3AgPSBETl9TSyhzayk7CisJc3RydWN0IG5zcF9jb25uX2luaXRfbXNnICptc2c7CisJdW5zaWduZWQgY2hhciBhdXg7CisJdW5zaWduZWQgY2hhciBtZW51dmVyOworCXN0cnVjdCBkbl9za2JfY2IgKmNiOworCXVuc2lnbmVkIGNoYXIgdHlwZSA9IDE7CisJaW50IGFsbG9jYXRpb24gPSAobXNnZmxnID09IE5TUF9DSSkgPyBzay0+c2tfYWxsb2NhdGlvbiA6IEdGUF9BVE9NSUM7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRuX2FsbG9jX3NrYihzaywgMjAwLCBhbGxvY2F0aW9uKTsKKworCWlmICghc2tiKQorCQlyZXR1cm47CisKKwljYiAgPSBETl9TS0JfQ0Ioc2tiKTsKKwltc2cgPSAoc3RydWN0IG5zcF9jb25uX2luaXRfbXNnICopc2tiX3B1dChza2Isc2l6ZW9mKCptc2cpKTsKKworCW1zZy0+bXNnZmxnCT0gbXNnZmxnOworCW1zZy0+ZHN0YWRkcgk9IDB4MDAwMDsJCS8qIFJlbW90ZSBOb2RlIHdpbGwgYXNzaWduIGl0Ki8KKworCW1zZy0+c3JjYWRkcgk9IHNjcC0+YWRkcmxvYzsKKwltc2ctPnNlcnZpY2VzCT0gc2NwLT5zZXJ2aWNlc19sb2M7CS8qIFJlcXVlc3RlZCBmbG93IGNvbnRyb2wgICAgKi8KKwltc2ctPmluZm8JPSBzY3AtPmluZm9fbG9jOwkvKiBWZXJzaW9uIE51bWJlciAgICAgICAgICAgICovCQorCW1zZy0+c2Vnc2l6ZQk9IGRuX2h0b25zKHNjcC0+c2Vnc2l6ZV9sb2MpOwkvKiBNYXggc2VnbWVudCBzaXplICAqLwkKKworCWlmIChzY3AtPnBlZXIuc2RuX29iam51bSkKKwkJdHlwZSA9IDA7CisKKwlza2JfcHV0KHNrYiwgZG5fc29ja2FkZHIydXNlcm5hbWUoJnNjcC0+cGVlciwgc2tiLT50YWlsLCB0eXBlKSk7CisJc2tiX3B1dChza2IsIGRuX3NvY2thZGRyMnVzZXJuYW1lKCZzY3AtPmFkZHIsIHNrYi0+dGFpbCwgMikpOworCisJbWVudXZlciA9IEROX01FTlVWRVJfQUNDIHwgRE5fTUVOVVZFUl9VU1I7CisJaWYgKHNjcC0+cGVlci5zZG5fZmxhZ3MgJiBTREZfUFJPWFkpCisJCW1lbnV2ZXIgfD0gRE5fTUVOVVZFUl9QUlg7CisJaWYgKHNjcC0+cGVlci5zZG5fZmxhZ3MgJiBTREZfVUlDUFJPWFkpCisJCW1lbnV2ZXIgfD0gRE5fTUVOVVZFUl9VSUM7CisKKwkqc2tiX3B1dChza2IsIDEpID0gbWVudXZlcjsJLyogTWVudSBWZXJzaW9uCQkqLworCQorCWF1eCA9IHNjcC0+YWNjZXNzZGF0YS5hY2NfdXNlcmw7CisJKnNrYl9wdXQoc2tiLCAxKSA9IGF1eDsKKwlpZiAoYXV4ID4gMCkKKwltZW1jcHkoc2tiX3B1dChza2IsIGF1eCksIHNjcC0+YWNjZXNzZGF0YS5hY2NfdXNlciwgYXV4KTsKKworCWF1eCA9IHNjcC0+YWNjZXNzZGF0YS5hY2NfcGFzc2w7CisJKnNrYl9wdXQoc2tiLCAxKSA9IGF1eDsKKwlpZiAoYXV4ID4gMCkKKwltZW1jcHkoc2tiX3B1dChza2IsIGF1eCksIHNjcC0+YWNjZXNzZGF0YS5hY2NfcGFzcywgYXV4KTsKKworCWF1eCA9IHNjcC0+YWNjZXNzZGF0YS5hY2NfYWNjbDsKKwkqc2tiX3B1dChza2IsIDEpID0gYXV4OworCWlmIChhdXggPiAwKQorCW1lbWNweShza2JfcHV0KHNrYiwgYXV4KSwgc2NwLT5hY2Nlc3NkYXRhLmFjY19hY2MsIGF1eCk7CisKKwlhdXggPSBzY3AtPmNvbm5kYXRhX291dC5vcHRfb3B0bDsKKwkqc2tiX3B1dChza2IsIDEpID0gYXV4OworCWlmIChhdXggPiAwKQorCW1lbWNweShza2JfcHV0KHNrYixhdXgpLCBzY3AtPmNvbm5kYXRhX291dC5vcHRfZGF0YSwgYXV4KTsKKworCXNjcC0+cGVyc2lzdCA9IGRuX25zcF9wZXJzaXN0KHNrKTsKKwlzY3AtPnBlcnNpc3RfZnhuID0gZG5fbnNwX3JldHJhbnNfY29ubmluaXQ7CisKKwljYi0+cnRfZmxhZ3MgPSBETl9SVF9GX1JRUjsKKworCWRuX25zcF9zZW5kKHNrYik7CQorfQorCmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX3JvdXRlLmMgYi9uZXQvZGVjbmV0L2RuX3JvdXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3YjVjMwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9kZWNuZXQvZG5fcm91dGUuYwpAQCAtMCwwICsxLDE4NDAgQEAKKy8qCisgKiBERUNuZXQgICAgICAgQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIERFQ25ldCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKiAgICAgICAgICAgICAgb3BlcmF0aW5nIHN5c3RlbS4gIERFQ25ldCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqICAgICAgICAgICAgICBpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKiAgICAgICAgICAgICAgREVDbmV0IFJvdXRpbmcgRnVuY3Rpb25zIChFbmRub2RlIGFuZCBSb3V0ZXIpCisgKgorICogQXV0aG9yczogICAgIFN0ZXZlIFdoaXRlaG91c2UgPFN0ZXZlV0BBQ00ub3JnPgorICogICAgICAgICAgICAgIEVkdWFyZG8gTWFyY2VsbyBTZXJyYXQgPGVtc2VycmF0QGdlb2NpdGllcy5jb20+CisgKgorICogQ2hhbmdlczoKKyAqICAgICAgICAgICAgICBTdGV2ZSBXaGl0ZWhvdXNlIDogRml4ZXMgdG8gYWxsb3cgImludHJhLWV0aGVybmV0IiBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJldHVybi10by1zZW5kZXIiIGJpdHMgb24gb3V0Z29pbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0cy4KKyAqCQlTdGV2ZSBXaGl0ZWhvdXNlIDogVGltZW91dHMgZm9yIGNhY2hlZCByb3V0ZXMuCisgKiAgICAgICAgICAgICAgU3RldmUgV2hpdGVob3VzZSA6IFVzZSBkc3QgY2FjaGUgZm9yIGlucHV0IHJvdXRlcyB0b28uCisgKiAgICAgICAgICAgICAgU3RldmUgV2hpdGVob3VzZSA6IEZpeGVkIGVycm9yIHZhbHVlcyBpbiBkbl9zZW5kX3NrYi4KKyAqICAgICAgICAgICAgICBTdGV2ZSBXaGl0ZWhvdXNlIDogUmV3b3JrIHJvdXRpbmcgZnVuY3Rpb25zIHRvIGJldHRlciBmaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDbmV0IHJvdXRpbmcgZGVzaWduCisgKiAgICAgICAgICAgICAgQWxleGV5IEt1em5ldHNvdiA6IE5ldyBTTVAgbG9ja2luZworICogICAgICAgICAgICAgIFN0ZXZlIFdoaXRlaG91c2UgOiBNb3JlIFNNUCBsb2NraW5nIGNoYW5nZXMgJiBkbl9jYWNoZV9kdW1wKCkKKyAqICAgICAgICAgICAgICBTdGV2ZSBXaGl0ZWhvdXNlIDogUHJlcm91dGluZyBORiBob29rLCBub3cgcmVhbGx5IGlzIHByZXJvdXRpbmcuCisgKgkJCQkgICBGaXhlZCBwb3NzaWJsZSBza2IgbGVhayBpbiBydG5ldGxpbmsgZnVuY3MuCisgKiAgICAgICAgICAgICAgU3RldmUgV2hpdGVob3VzZSA6IERhdmUgTWlsbGVyJ3MgZHluYW1pYyBoYXNoIHRhYmxlIHNpemluZyBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxleGV5IEt1em5ldHNvdidzIGZpbmVyIGdyYWluZWQgbG9ja2luZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGlwdjQvcm91dGUuYy4KKyAqICAgICAgICAgICAgICBTdGV2ZSBXaGl0ZWhvdXNlIDogUm91dGluZyBpcyBub3cgc3RhcnRpbmcgdG8gbG9vayBsaWtlIGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc2libGUgc2V0IG9mIGNvZGUgbm93LCBtYWlubHkgZHVlIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15IGNvcHlpbmcgdGhlIElQdjQgcm91dGluZyBjb2RlLiBUaGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9va3MgaGVyZSBhcmUgbW9kaWZpZWQgYW5kIHdpbGwgY29udGludWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZXZvbHZlIGZvciBhIHdoaWxlLgorICogICAgICAgICAgICAgIFN0ZXZlIFdoaXRlaG91c2UgOiBSZWFsIFNNUCBhdCBsYXN0IDotKSBBbHNvIG5ldyBuZXRmaWx0ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R1ZmYuIExvb2sgb3V0IHJhdyBzb2NrZXRzIHlvdXIgZGF5cworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgbnVtYmVyZWQhCisgKiAgICAgICAgICAgICAgU3RldmUgV2hpdGVob3VzZSA6IEFkZGVkIHJldHVybi10by1zZW5kZXIgZnVuY3Rpb25zLiBBZGRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrbG9nIGNvbmdlc3Rpb24gbGV2ZWwgcmV0dXJuIGNvZGVzLgorICoJCVN0ZXZlIFdoaXRlaG91c2UgOiBGaXhlZCBidWcgd2hlcmUgcm91dGVzIHdlcmUgc2V0IHVwIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gcmVmIGNvdW50IG9uIG5ldCBkZXZpY2VzLgorICogICAgICAgICAgICAgIFN0ZXZlIFdoaXRlaG91c2UgOiBSQ1UgZm9yIHRoZSByb3V0ZSBjYWNoZQorICogICAgICAgICAgICAgIFN0ZXZlIFdoaXRlaG91c2UgOiBQcmVwYXJhdGlvbnMgZm9yIHRoZSBmbG93IGNhY2hlCisgKiAgICAgICAgICAgICAgU3RldmUgV2hpdGVob3VzZSA6IFByZXBhcmUgZm9yIG5vbmxpbmVhciBza2JzCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIChjKSAxOTk1LTE5OTggRS5NLiBTZXJyYXQJCWVtc2VycmF0QGdlb2NpdGllcy5jb20KKyAgICAKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luX3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfZGVjbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lcy5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPG5ldC9uZWlnaGJvdXIuaD4KKyNpbmNsdWRlIDxuZXQvZHN0Lmg+CisjaW5jbHVkZSA8bmV0L2Zsb3cuaD4KKyNpbmNsdWRlIDxuZXQvZG4uaD4KKyNpbmNsdWRlIDxuZXQvZG5fZGV2Lmg+CisjaW5jbHVkZSA8bmV0L2RuX25zcC5oPgorI2luY2x1ZGUgPG5ldC9kbl9yb3V0ZS5oPgorI2luY2x1ZGUgPG5ldC9kbl9uZWlnaC5oPgorI2luY2x1ZGUgPG5ldC9kbl9maWIuaD4KKworc3RydWN0IGRuX3J0X2hhc2hfYnVja2V0Cit7CisJc3RydWN0IGRuX3JvdXRlICpjaGFpbjsKKwlzcGlubG9ja190IGxvY2s7Cit9IF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKDgpKSk7CisKK2V4dGVybiBzdHJ1Y3QgbmVpZ2hfdGFibGUgZG5fbmVpZ2hfdGFibGU7CisKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZG5faGlvcmRfYWRkcls2XSA9IHsweEFBLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMH07CisKK3N0YXRpYyBjb25zdCBpbnQgZG5fcnRfbWluX2RlbGF5ID0gMiAqIEhaOworc3RhdGljIGNvbnN0IGludCBkbl9ydF9tYXhfZGVsYXkgPSAxMCAqIEhaOworc3RhdGljIGNvbnN0IGludCBkbl9ydF9tdHVfZXhwaXJlcyA9IDEwICogNjAgKiBIWjsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZG5fcnRfZGVhZGxpbmU7CisKK3N0YXRpYyBpbnQgZG5fZHN0X2djKHZvaWQpOworc3RhdGljIHN0cnVjdCBkc3RfZW50cnkgKmRuX2RzdF9jaGVjayhzdHJ1Y3QgZHN0X2VudHJ5ICosIF9fdTMyKTsKK3N0YXRpYyBzdHJ1Y3QgZHN0X2VudHJ5ICpkbl9kc3RfbmVnYXRpdmVfYWR2aWNlKHN0cnVjdCBkc3RfZW50cnkgKik7CitzdGF0aWMgdm9pZCBkbl9kc3RfbGlua19mYWlsdXJlKHN0cnVjdCBza19idWZmICopOworc3RhdGljIHZvaWQgZG5fZHN0X3VwZGF0ZV9wbXR1KHN0cnVjdCBkc3RfZW50cnkgKmRzdCwgdTMyIG10dSk7CitzdGF0aWMgaW50IGRuX3JvdXRlX2lucHV0KHN0cnVjdCBza19idWZmICopOworc3RhdGljIHZvaWQgZG5fcnVuX2ZsdXNoKHVuc2lnbmVkIGxvbmcgZHVtbXkpOworCitzdGF0aWMgc3RydWN0IGRuX3J0X2hhc2hfYnVja2V0ICpkbl9ydF9oYXNoX3RhYmxlOworc3RhdGljIHVuc2lnbmVkIGRuX3J0X2hhc2hfbWFzazsKKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGRuX3JvdXRlX3RpbWVyOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGRuX3J0X2ZsdXNoX3RpbWVyID0KKwkJVElNRVJfSU5JVElBTElaRVIoZG5fcnVuX2ZsdXNoLCAwLCAwKTsKK2ludCBkZWNuZXRfZHN0X2djX2ludGVydmFsID0gMjsKKworc3RhdGljIHN0cnVjdCBkc3Rfb3BzIGRuX2RzdF9vcHMgPSB7CisJLmZhbWlseSA9CQlQRl9ERUNuZXQsCisJLnByb3RvY29sID0JCV9fY29uc3RhbnRfaHRvbnMoRVRIX1BfRE5BX1JUKSwKKwkuZ2NfdGhyZXNoID0JCTEyOCwKKwkuZ2MgPQkJCWRuX2RzdF9nYywKKwkuY2hlY2sgPQkJZG5fZHN0X2NoZWNrLAorCS5uZWdhdGl2ZV9hZHZpY2UgPQlkbl9kc3RfbmVnYXRpdmVfYWR2aWNlLAorCS5saW5rX2ZhaWx1cmUgPQkJZG5fZHN0X2xpbmtfZmFpbHVyZSwKKwkudXBkYXRlX3BtdHUgPQkJZG5fZHN0X3VwZGF0ZV9wbXR1LAorCS5lbnRyeV9zaXplID0JCXNpemVvZihzdHJ1Y3QgZG5fcm91dGUpLAorCS5lbnRyaWVzID0JCUFUT01JQ19JTklUKDApLAorfTsKKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgZG5faGFzaCh1bnNpZ25lZCBzaG9ydCBzcmMsIHVuc2lnbmVkIHNob3J0IGRzdCkKK3sKKwl1bnNpZ25lZCBzaG9ydCB0bXAgPSBzcmMgXiBkc3Q7CisJdG1wIF49ICh0bXAgPj4gMyk7CisJdG1wIF49ICh0bXAgPj4gNSk7CisJdG1wIF49ICh0bXAgPj4gMTApOworCXJldHVybiBkbl9ydF9oYXNoX21hc2sgJiAodW5zaWduZWQpdG1wOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZG5ydF9mcmVlKHN0cnVjdCBkbl9yb3V0ZSAqcnQpCit7CisJY2FsbF9yY3VfYmgoJnJ0LT51LmRzdC5yY3VfaGVhZCwgZHN0X3JjdV9mcmVlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRucnRfZHJvcChzdHJ1Y3QgZG5fcm91dGUgKnJ0KQoreworCWlmIChydCkKKwkJZHN0X3JlbGVhc2UoJnJ0LT51LmRzdCk7CisJY2FsbF9yY3VfYmgoJnJ0LT51LmRzdC5yY3VfaGVhZCwgZHN0X3JjdV9mcmVlKTsKK30KKworc3RhdGljIHZvaWQgZG5fZHN0X2NoZWNrX2V4cGlyZSh1bnNpZ25lZCBsb25nIGR1bW15KQoreworCWludCBpOworCXN0cnVjdCBkbl9yb3V0ZSAqcnQsICoqcnRwOworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKwl1bnNpZ25lZCBsb25nIGV4cGlyZSA9IDEyMCAqIEhaOworCisJZm9yKGkgPSAwOyBpIDw9IGRuX3J0X2hhc2hfbWFzazsgaSsrKSB7CisJCXJ0cCA9ICZkbl9ydF9oYXNoX3RhYmxlW2ldLmNoYWluOworCisJCXNwaW5fbG9jaygmZG5fcnRfaGFzaF90YWJsZVtpXS5sb2NrKTsKKwkJd2hpbGUoKHJ0PSpydHApICE9IE5VTEwpIHsKKwkJCWlmIChhdG9taWNfcmVhZCgmcnQtPnUuZHN0Ll9fcmVmY250KSB8fAorCQkJCQkobm93IC0gcnQtPnUuZHN0Lmxhc3R1c2UpIDwgZXhwaXJlKSB7CisJCQkJcnRwID0gJnJ0LT51LnJ0X25leHQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQkqcnRwID0gcnQtPnUucnRfbmV4dDsKKwkJCXJ0LT51LnJ0X25leHQgPSBOVUxMOworCQkJZG5ydF9mcmVlKHJ0KTsKKwkJfQorCQlzcGluX3VubG9jaygmZG5fcnRfaGFzaF90YWJsZVtpXS5sb2NrKTsKKworCQlpZiAoKGppZmZpZXMgLSBub3cpID4gMCkKKwkJCWJyZWFrOworCX0KKworCW1vZF90aW1lcigmZG5fcm91dGVfdGltZXIsIG5vdyArIGRlY25ldF9kc3RfZ2NfaW50ZXJ2YWwgKiBIWik7Cit9CisKK3N0YXRpYyBpbnQgZG5fZHN0X2djKHZvaWQpCit7CisJc3RydWN0IGRuX3JvdXRlICpydCwgKipydHA7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOworCXVuc2lnbmVkIGxvbmcgZXhwaXJlID0gMTAgKiBIWjsKKworCWZvcihpID0gMDsgaSA8PSBkbl9ydF9oYXNoX21hc2s7IGkrKykgeworCisJCXNwaW5fbG9ja19iaCgmZG5fcnRfaGFzaF90YWJsZVtpXS5sb2NrKTsKKwkJcnRwID0gJmRuX3J0X2hhc2hfdGFibGVbaV0uY2hhaW47CisKKwkJd2hpbGUoKHJ0PSpydHApICE9IE5VTEwpIHsKKwkJCWlmIChhdG9taWNfcmVhZCgmcnQtPnUuZHN0Ll9fcmVmY250KSB8fAorCQkJCQkobm93IC0gcnQtPnUuZHN0Lmxhc3R1c2UpIDwgZXhwaXJlKSB7CisJCQkJcnRwID0gJnJ0LT51LnJ0X25leHQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQkqcnRwID0gcnQtPnUucnRfbmV4dDsKKwkJCXJ0LT51LnJ0X25leHQgPSBOVUxMOworCQkJZG5ydF9kcm9wKHJ0KTsKKwkJCWJyZWFrOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZkbl9ydF9oYXNoX3RhYmxlW2ldLmxvY2spOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogVGhlIGRlY25ldCBzdGFuZGFyZHMgZG9uJ3QgaW1wb3NlIGEgcGFydGljdWxhciBtaW5pbXVtIG10dSwgd2hhdCB0aGV5CisgKiBkbyBpbnNpc3Qgb24gaXMgdGhhdCB0aGUgcm91dGluZyBsYXllciBhY2NlcHRzIGEgZGF0YWdyYW0gb2YgYXQgbGVhc3QKKyAqIDIzMCBieXRlcyBsb25nLiBIZXJlIHdlIGhhdmUgdG8gc3VidHJhY3QgdGhlIHJvdXRpbmcgaGVhZGVyIGxlbmd0aCBmcm9tCisgKiAyMzAgdG8gZ2V0IHRoZSBtaW5pbXVtIGFjY2VwdGFibGUgbXR1LiBJZiB0aGVyZSBpcyBubyBuZWlnaGJvdXIsIHRoZW4gd2UKKyAqIGFzc3VtZSB0aGUgd29yc3QgYW5kIHVzZSBhIGxvbmcgaGVhZGVyIHNpemUuCisgKgorICogV2UgdXBkYXRlIGJvdGggdGhlIG10dSBhbmQgdGhlIGFkdmVydGlzZWQgbXNzIChpLmUuIHRoZSBzZWdtZW50IHNpemUgd2UKKyAqIGFkdmVydGlzZSB0byB0aGUgb3RoZXIgZW5kKS4KKyAqLworc3RhdGljIHZvaWQgZG5fZHN0X3VwZGF0ZV9wbXR1KHN0cnVjdCBkc3RfZW50cnkgKmRzdCwgdTMyIG10dSkKK3sKKwl1MzIgbWluX210dSA9IDIzMDsKKwlzdHJ1Y3QgZG5fZGV2ICpkbiA9IGRzdC0+bmVpZ2hib3VyID8KKwkJCSAgICAoc3RydWN0IGRuX2RldiAqKWRzdC0+bmVpZ2hib3VyLT5kZXYtPmRuX3B0ciA6IE5VTEw7CisKKwlpZiAoZG4gJiYgZG4tPnVzZV9sb25nID09IDApCisJCW1pbl9tdHUgLT0gNjsKKwllbHNlCisJCW1pbl9tdHUgLT0gMjE7CisKKwlpZiAoZHN0LT5tZXRyaWNzW1JUQVhfTVRVLTFdID4gbXR1ICYmIG10dSA+PSBtaW5fbXR1KSB7CisJCWlmICghKGRzdF9tZXRyaWNfbG9ja2VkKGRzdCwgUlRBWF9NVFUpKSkgeworCQkJZHN0LT5tZXRyaWNzW1JUQVhfTVRVLTFdID0gbXR1OworCQkJZHN0X3NldF9leHBpcmVzKGRzdCwgZG5fcnRfbXR1X2V4cGlyZXMpOworCQl9CisJCWlmICghKGRzdF9tZXRyaWNfbG9ja2VkKGRzdCwgUlRBWF9BRFZNU1MpKSkgeworCQkJdTMyIG1zcyA9IG10dSAtIEROX01BWF9OU1BfREFUQV9IRUFERVI7CisJCQlpZiAoZHN0LT5tZXRyaWNzW1JUQVhfQURWTVNTLTFdID4gbXNzKQorCQkJCWRzdC0+bWV0cmljc1tSVEFYX0FEVk1TUy0xXSA9IG1zczsKKwkJfQorCX0KK30KKworLyogCisgKiBXaGVuIGEgcm91dGUgaGFzIGJlZW4gbWFya2VkIG9ic29sZXRlLiAoZS5nLiByb3V0aW5nIGNhY2hlIGZsdXNoKQorICovCitzdGF0aWMgc3RydWN0IGRzdF9lbnRyeSAqZG5fZHN0X2NoZWNrKHN0cnVjdCBkc3RfZW50cnkgKmRzdCwgX191MzIgY29va2llKQoreworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGRzdF9lbnRyeSAqZG5fZHN0X25lZ2F0aXZlX2FkdmljZShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCit7CisJZHN0X3JlbGVhc2UoZHN0KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZG5fZHN0X2xpbmtfZmFpbHVyZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSBpbnQgY29tcGFyZV9rZXlzKHN0cnVjdCBmbG93aSAqZmwxLCBzdHJ1Y3QgZmxvd2kgKmZsMikKK3sKKwlyZXR1cm4gbWVtY21wKCZmbDEtPm5sX3UuZG5fdSwgJmZsMi0+bmxfdS5kbl91LCBzaXplb2YoZmwxLT5ubF91LmRuX3UpKSA9PSAwICYmCisJCWZsMS0+b2lmID09IGZsMi0+b2lmICYmCisJCWZsMS0+aWlmID09IGZsMi0+aWlmOworfQorCitzdGF0aWMgaW50IGRuX2luc2VydF9yb3V0ZShzdHJ1Y3QgZG5fcm91dGUgKnJ0LCB1bnNpZ25lZCBoYXNoLCBzdHJ1Y3QgZG5fcm91dGUgKipycCkKK3sKKwlzdHJ1Y3QgZG5fcm91dGUgKnJ0aCwgKipydGhwOworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKworCXJ0aHAgPSAmZG5fcnRfaGFzaF90YWJsZVtoYXNoXS5jaGFpbjsKKworCXNwaW5fbG9ja19iaCgmZG5fcnRfaGFzaF90YWJsZVtoYXNoXS5sb2NrKTsKKwl3aGlsZSgocnRoID0gKnJ0aHApICE9IE5VTEwpIHsKKwkJaWYgKGNvbXBhcmVfa2V5cygmcnRoLT5mbCwgJnJ0LT5mbCkpIHsKKwkJCS8qIFB1dCBpdCBmaXJzdCAqLworCQkJKnJ0aHAgPSBydGgtPnUucnRfbmV4dDsKKwkJCXJjdV9hc3NpZ25fcG9pbnRlcihydGgtPnUucnRfbmV4dCwKKwkJCQkJICAgZG5fcnRfaGFzaF90YWJsZVtoYXNoXS5jaGFpbik7CisJCQlyY3VfYXNzaWduX3BvaW50ZXIoZG5fcnRfaGFzaF90YWJsZVtoYXNoXS5jaGFpbiwgcnRoKTsKKworCQkJcnRoLT51LmRzdC5fX3VzZSsrOworCQkJZHN0X2hvbGQoJnJ0aC0+dS5kc3QpOworCQkJcnRoLT51LmRzdC5sYXN0dXNlID0gbm93OworCQkJc3Bpbl91bmxvY2tfYmgoJmRuX3J0X2hhc2hfdGFibGVbaGFzaF0ubG9jayk7CisKKwkJCWRucnRfZHJvcChydCk7CisJCQkqcnAgPSBydGg7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlydGhwID0gJnJ0aC0+dS5ydF9uZXh0OworCX0KKworCXJjdV9hc3NpZ25fcG9pbnRlcihydC0+dS5ydF9uZXh0LCBkbl9ydF9oYXNoX3RhYmxlW2hhc2hdLmNoYWluKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoZG5fcnRfaGFzaF90YWJsZVtoYXNoXS5jaGFpbiwgcnQpOworCQorCWRzdF9ob2xkKCZydC0+dS5kc3QpOworCXJ0LT51LmRzdC5fX3VzZSsrOworCXJ0LT51LmRzdC5sYXN0dXNlID0gbm93OworCXNwaW5fdW5sb2NrX2JoKCZkbl9ydF9oYXNoX3RhYmxlW2hhc2hdLmxvY2spOworCSpycCA9IHJ0OworCXJldHVybiAwOworfQorCit2b2lkIGRuX3J1bl9mbHVzaCh1bnNpZ25lZCBsb25nIGR1bW15KQoreworCWludCBpOworCXN0cnVjdCBkbl9yb3V0ZSAqcnQsICpuZXh0OworCisJZm9yKGkgPSAwOyBpIDwgZG5fcnRfaGFzaF9tYXNrOyBpKyspIHsKKwkJc3Bpbl9sb2NrX2JoKCZkbl9ydF9oYXNoX3RhYmxlW2ldLmxvY2spOworCisJCWlmICgocnQgPSB4Y2hnKCZkbl9ydF9oYXNoX3RhYmxlW2ldLmNoYWluLCBOVUxMKSkgPT0gTlVMTCkKKwkJCWdvdG8gbm90aGluZ190b19kZWNsYXJlOworCisJCWZvcig7IHJ0OyBydD1uZXh0KSB7CisJCQluZXh0ID0gcnQtPnUucnRfbmV4dDsKKwkJCXJ0LT51LnJ0X25leHQgPSBOVUxMOworCQkJZHN0X2ZyZWUoKHN0cnVjdCBkc3RfZW50cnkgKilydCk7CisJCX0KKworbm90aGluZ190b19kZWNsYXJlOgorCQlzcGluX3VubG9ja19iaCgmZG5fcnRfaGFzaF90YWJsZVtpXS5sb2NrKTsKKwl9Cit9CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZG5fcnRfZmx1c2hfbG9jayk7CisKK3ZvaWQgZG5fcnRfY2FjaGVfZmx1c2goaW50IGRlbGF5KQoreworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKwlpbnQgdXNlcl9tb2RlID0gIWluX2ludGVycnVwdCgpOworCisJaWYgKGRlbGF5IDwgMCkKKwkJZGVsYXkgPSBkbl9ydF9taW5fZGVsYXk7CisKKwlzcGluX2xvY2tfYmgoJmRuX3J0X2ZsdXNoX2xvY2spOworCisJaWYgKGRlbF90aW1lcigmZG5fcnRfZmx1c2hfdGltZXIpICYmIGRlbGF5ID4gMCAmJiBkbl9ydF9kZWFkbGluZSkgeworCQlsb25nIHRtbyA9IChsb25nKShkbl9ydF9kZWFkbGluZSAtIG5vdyk7CisKKwkJaWYgKHVzZXJfbW9kZSAmJiB0bW8gPCBkbl9ydF9tYXhfZGVsYXkgLSBkbl9ydF9taW5fZGVsYXkpCisJCQl0bW8gPSAwOworCisJCWlmIChkZWxheSA+IHRtbykKKwkJCWRlbGF5ID0gdG1vOworCX0KKworCWlmIChkZWxheSA8PSAwKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZkbl9ydF9mbHVzaF9sb2NrKTsKKwkJZG5fcnVuX2ZsdXNoKDApOworCQlyZXR1cm47CisJfQorCisJaWYgKGRuX3J0X2RlYWRsaW5lID09IDApCisJCWRuX3J0X2RlYWRsaW5lID0gbm93ICsgZG5fcnRfbWF4X2RlbGF5OworCisJZG5fcnRfZmx1c2hfdGltZXIuZXhwaXJlcyA9IG5vdyArIGRlbGF5OworCWFkZF90aW1lcigmZG5fcnRfZmx1c2hfdGltZXIpOworCXNwaW5fdW5sb2NrX2JoKCZkbl9ydF9mbHVzaF9sb2NrKTsKK30KKworLyoqCisgKiBkbl9yZXR1cm5fc2hvcnQgLSBSZXR1cm4gYSBzaG9ydCBwYWNrZXQgdG8gaXRzIHNlbmRlcgorICogQHNrYjogVGhlIHBhY2tldCB0byByZXR1cm4KKyAqCisgKi8KK3N0YXRpYyBpbnQgZG5fcmV0dXJuX3Nob3J0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGRuX3NrYl9jYiAqY2I7CisJdW5zaWduZWQgY2hhciAqcHRyOworCWRuX2FkZHJlc3MgKnNyYzsKKwlkbl9hZGRyZXNzICpkc3Q7CisJZG5fYWRkcmVzcyB0bXA7CisKKwkvKiBBZGQgYmFjayBoZWFkZXJzICovCisJc2tiX3B1c2goc2tiLCBza2ItPmRhdGEgLSBza2ItPm5oLnJhdyk7CisKKwlpZiAoKHNrYiA9IHNrYl91bnNoYXJlKHNrYiwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJCXJldHVybiBORVRfUlhfRFJPUDsKKworCWNiID0gRE5fU0tCX0NCKHNrYik7CisJLyogU2tpcCBwYWNrZXQgbGVuZ3RoIGFuZCBwb2ludCB0byBmbGFncyAqLworCXB0ciA9IHNrYi0+ZGF0YSArIDI7CisJKnB0cisrID0gKGNiLT5ydF9mbGFncyAmIH5ETl9SVF9GX1JRUikgfCBETl9SVF9GX1JUUzsKKworCWRzdCA9IChkbl9hZGRyZXNzICopcHRyOworCXB0ciArPSAyOworCXNyYyA9IChkbl9hZGRyZXNzICopcHRyOworCXB0ciArPSAyOworCSpwdHIgPSAwOyAvKiBaZXJvIGhvcCBjb3VudCAqLworCisJLyogU3dhcCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uICovCisJdG1wICA9ICpzcmM7CisJKnNyYyA9ICpkc3Q7CisJKmRzdCA9IHRtcDsKKworCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfT1VUR09JTkc7CisJZG5fcnRfZmluaXNoX291dHB1dChza2IsIE5VTEwsIE5VTEwpOworCXJldHVybiBORVRfUlhfU1VDQ0VTUzsKK30KKworLyoqCisgKiBkbl9yZXR1cm5fbG9uZyAtIFJldHVybiBhIGxvbmcgcGFja2V0IHRvIGl0cyBzZW5kZXIKKyAqIEBza2I6IFRoZSBsb25nIGZvcm1hdCBwYWNrZXQgdG8gcmV0dXJuCisgKgorICovCitzdGF0aWMgaW50IGRuX3JldHVybl9sb25nKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGRuX3NrYl9jYiAqY2I7CisJdW5zaWduZWQgY2hhciAqcHRyOworCXVuc2lnbmVkIGNoYXIgKnNyY19hZGRyLCAqZHN0X2FkZHI7CisJdW5zaWduZWQgY2hhciB0bXBbRVRIX0FMRU5dOworCisJLyogQWRkIGJhY2sgYWxsIGhlYWRlcnMgKi8KKwlza2JfcHVzaChza2IsIHNrYi0+ZGF0YSAtIHNrYi0+bmgucmF3KTsKKworCWlmICgoc2tiID0gc2tiX3Vuc2hhcmUoc2tiLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwkJcmV0dXJuIE5FVF9SWF9EUk9QOworCisJY2IgPSBETl9TS0JfQ0Ioc2tiKTsKKwkvKiBJZ25vcmUgcGFja2V0IGxlbmd0aCBhbmQgcG9pbnQgdG8gZmxhZ3MgKi8KKwlwdHIgPSBza2ItPmRhdGEgKyAyOworCisJLyogU2tpcCBwYWRkaW5nICovCisJaWYgKCpwdHIgJiBETl9SVF9GX1BGKSB7CisJCWNoYXIgcGFkbGVuID0gKCpwdHIgJiB+RE5fUlRfRl9QRik7CisJCXB0ciArPSBwYWRsZW47CisJfQorCisJKnB0cisrID0gKGNiLT5ydF9mbGFncyAmIH5ETl9SVF9GX1JRUikgfCBETl9SVF9GX1JUUzsKKwlwdHIgKz0gMjsKKwlkc3RfYWRkciA9IHB0cjsKKwlwdHIgKz0gODsKKwlzcmNfYWRkciA9IHB0cjsKKwlwdHIgKz0gNjsKKwkqcHRyID0gMDsgLyogWmVybyBob3AgY291bnQgKi8KKworCS8qIFN3YXAgc291cmNlIGFuZCBkZXN0aW5hdGlvbiAqLworCW1lbWNweSh0bXAsIHNyY19hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KHNyY19hZGRyLCBkc3RfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShkc3RfYWRkciwgdG1wLCBFVEhfQUxFTik7CisKKwlza2ItPnBrdF90eXBlID0gUEFDS0VUX09VVEdPSU5HOworCWRuX3J0X2ZpbmlzaF9vdXRwdXQoc2tiLCBkc3RfYWRkciwgc3JjX2FkZHIpOworCXJldHVybiBORVRfUlhfU1VDQ0VTUzsKK30KKworLyoqCisgKiBkbl9yb3V0ZV9yeF9wYWNrZXQgLSBUcnkgYW5kIGZpbmQgYSByb3V0ZSBmb3IgYW4gaW5jb21pbmcgcGFja2V0CisgKiBAc2tiOiBUaGUgcGFja2V0IHRvIGZpbmQgYSByb3V0ZSBmb3IKKyAqCisgKiBSZXR1cm5zOiByZXN1bHQgb2YgaW5wdXQgZnVuY3Rpb24gaWYgcm91dGUgaXMgZm91bmQsIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgZG5fcm91dGVfcnhfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGRuX3NrYl9jYiAqY2IgPSBETl9TS0JfQ0Ioc2tiKTsKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBkbl9yb3V0ZV9pbnB1dChza2IpKSA9PSAwKQorCQlyZXR1cm4gZHN0X2lucHV0KHNrYik7CisKKwlpZiAoZGVjbmV0X2RlYnVnX2xldmVsICYgNCkgeworCQljaGFyICpkZXZuYW1lID0gc2tiLT5kZXYgPyBza2ItPmRldi0+bmFtZSA6ICI/Pz8iOworCQlzdHJ1Y3QgZG5fc2tiX2NiICpjYiA9IEROX1NLQl9DQihza2IpOworCQlwcmludGsoS0VSTl9ERUJVRworCQkJIkRFQ25ldDogZG5fcm91dGVfcnhfcGFja2V0OiBydF9mbGFncz0weCUwMnggZGV2PSVzIGxlbj0lZCBzcmM9MHglMDRoeCBkc3Q9MHglMDRoeCBlcnI9JWQgdHlwZT0lZFxuIiwKKwkJCShpbnQpY2ItPnJ0X2ZsYWdzLCBkZXZuYW1lLCBza2ItPmxlbiwgY2ItPnNyYywgY2ItPmRzdCwgCisJCQllcnIsIHNrYi0+cGt0X3R5cGUpOworCX0KKworCWlmICgoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfSE9TVCkgJiYgKGNiLT5ydF9mbGFncyAmIEROX1JUX0ZfUlFSKSkgeworCQlzd2l0Y2goY2ItPnJ0X2ZsYWdzICYgRE5fUlRfUEtUX01TSykgeworCQkJY2FzZSBETl9SVF9QS1RfU0hPUlQ6CisJCQkJcmV0dXJuIGRuX3JldHVybl9zaG9ydChza2IpOworCQkJY2FzZSBETl9SVF9QS1RfTE9ORzoKKwkJCQlyZXR1cm4gZG5fcmV0dXJuX2xvbmcoc2tiKTsKKwkJfQorCX0KKworCWtmcmVlX3NrYihza2IpOworCXJldHVybiBORVRfUlhfRFJPUDsKK30KKworc3RhdGljIGludCBkbl9yb3V0ZV9yeF9sb25nKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGRuX3NrYl9jYiAqY2IgPSBETl9TS0JfQ0Ioc2tiKTsKKwl1bnNpZ25lZCBjaGFyICpwdHIgPSBza2ItPmRhdGE7CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCAyMSkpIC8qIDIwIGZvciBsb25nIGhlYWRlciwgMSBmb3Igc2hvcnRlc3QgbnNwICovCisJCWdvdG8gZHJvcF9pdDsKKworCXNrYl9wdWxsKHNrYiwgMjApOworCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisKKyAgICAgICAgLyogRGVzdGluYXRpb24gaW5mbyAqLworICAgICAgICBwdHIgKz0gMjsKKwljYi0+ZHN0ID0gZG5faHRvbnMoZG5fZXRoMmRuKHB0cikpOworICAgICAgICBpZiAobWVtY21wKHB0ciwgZG5faGlvcmRfYWRkciwgNCkgIT0gMCkKKyAgICAgICAgICAgICAgICBnb3RvIGRyb3BfaXQ7CisgICAgICAgIHB0ciArPSA2OworCisKKyAgICAgICAgLyogU291cmNlIGluZm8gKi8KKyAgICAgICAgcHRyICs9IDI7CisJY2ItPnNyYyA9IGRuX2h0b25zKGRuX2V0aDJkbihwdHIpKTsKKyAgICAgICAgaWYgKG1lbWNtcChwdHIsIGRuX2hpb3JkX2FkZHIsIDQpICE9IDApCisgICAgICAgICAgICAgICAgZ290byBkcm9wX2l0OworICAgICAgICBwdHIgKz0gNjsKKyAgICAgICAgLyogT3RoZXIganVuayAqLworICAgICAgICBwdHIrKzsKKyAgICAgICAgY2ItPmhvcHMgPSAqcHRyKys7IC8qIFZpc2l0IENvdW50ICovCisKKwlyZXR1cm4gTkZfSE9PSyhQRl9ERUNuZXQsIE5GX0ROX1BSRV9ST1VUSU5HLCBza2IsIHNrYi0+ZGV2LCBOVUxMLCBkbl9yb3V0ZV9yeF9wYWNrZXQpOworCitkcm9wX2l0OgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiBORVRfUlhfRFJPUDsKK30KKworCisKK3N0YXRpYyBpbnQgZG5fcm91dGVfcnhfc2hvcnQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZG5fc2tiX2NiICpjYiA9IEROX1NLQl9DQihza2IpOworCXVuc2lnbmVkIGNoYXIgKnB0ciA9IHNrYi0+ZGF0YTsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIDYpKSAvKiA1IGZvciBzaG9ydCBoZWFkZXIgKyAxIGZvciBzaG9ydGVzdCBuc3AgKi8KKwkJZ290byBkcm9wX2l0OworCisJc2tiX3B1bGwoc2tiLCA1KTsKKwlza2ItPmgucmF3ID0gc2tiLT5kYXRhOworCisJY2ItPmRzdCA9ICooZG5fYWRkcmVzcyAqKXB0cjsKKyAgICAgICAgcHRyICs9IDI7CisgICAgICAgIGNiLT5zcmMgPSAqKGRuX2FkZHJlc3MgKilwdHI7CisgICAgICAgIHB0ciArPSAyOworICAgICAgICBjYi0+aG9wcyA9ICpwdHIgJiAweDNmOworCisJcmV0dXJuIE5GX0hPT0soUEZfREVDbmV0LCBORl9ETl9QUkVfUk9VVElORywgc2tiLCBza2ItPmRldiwgTlVMTCwgZG5fcm91dGVfcnhfcGFja2V0KTsKKworZHJvcF9pdDoKKyAgICAgICAga2ZyZWVfc2tiKHNrYik7CisgICAgICAgIHJldHVybiBORVRfUlhfRFJPUDsKK30KKworc3RhdGljIGludCBkbl9yb3V0ZV9kaXNjYXJkKHN0cnVjdCBza19idWZmICpza2IpCit7CisJLyoKKwkgKiBJIGtub3cgd2UgZHJvcCB0aGUgcGFja2V0IGhlcmUsIGJ1dCB0aGF0cyBjb25zaWRlcmVkIHN1Y2Nlc3MgaW4KKwkgKiB0aGlzIGNhc2UKKwkgKi8KKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gTkVUX1JYX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgZG5fcm91dGVfcHRwX2hlbGxvKHN0cnVjdCBza19idWZmICpza2IpCit7CisJZG5fZGV2X2hlbGxvKHNrYik7CisJZG5fbmVpZ2hfcG9pbnRvcG9pbnRfaGVsbG8oc2tiKTsKKwlyZXR1cm4gTkVUX1JYX1NVQ0NFU1M7Cit9CisKK2ludCBkbl9yb3V0ZV9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHBhY2tldF90eXBlICpwdCkKK3sKKwlzdHJ1Y3QgZG5fc2tiX2NiICpjYjsKKwl1bnNpZ25lZCBjaGFyIGZsYWdzID0gMDsKKwlfX3UxNiBsZW4gPSBkbl9udG9ocygqKF9fdTE2ICopc2tiLT5kYXRhKTsKKwlzdHJ1Y3QgZG5fZGV2ICpkbiA9IChzdHJ1Y3QgZG5fZGV2ICopZGV2LT5kbl9wdHI7CisJdW5zaWduZWQgY2hhciBwYWRsZW4gPSAwOworCisJaWYgKGRuID09IE5VTEwpCisJCWdvdG8gZHVtcF9pdDsKKworCWlmICgoc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgMykpCisJCWdvdG8gZHVtcF9pdDsKKworCXNrYl9wdWxsKHNrYiwgMik7CisKKwlpZiAobGVuID4gc2tiLT5sZW4pCisJCWdvdG8gZHVtcF9pdDsKKworCXNrYl90cmltKHNrYiwgbGVuKTsKKworCWZsYWdzID0gKnNrYi0+ZGF0YTsKKworCWNiID0gRE5fU0tCX0NCKHNrYik7CisJY2ItPnN0YW1wID0gamlmZmllczsKKwljYi0+aWlmID0gZGV2LT5pZmluZGV4OworCisJLyoKKwkgKiBJZiB3ZSBoYXZlIHBhZGRpbmcsIHJlbW92ZSBpdC4KKwkgKi8KKwlpZiAoZmxhZ3MgJiBETl9SVF9GX1BGKSB7CisJCXBhZGxlbiA9IGZsYWdzICYgfkROX1JUX0ZfUEY7CisJCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHBhZGxlbiArIDEpKQorCQkJZ290byBkdW1wX2l0OworCQlza2JfcHVsbChza2IsIHBhZGxlbik7CisJCWZsYWdzID0gKnNrYi0+ZGF0YTsKKwl9CisKKwlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKworCS8qCisJICogV2VlZCBvdXQgZnV0dXJlIHZlcnNpb24gREVDbmV0CisJICovCisJaWYgKGZsYWdzICYgRE5fUlRfRl9WRVIpCisJCWdvdG8gZHVtcF9pdDsKKworCWNiLT5ydF9mbGFncyA9IGZsYWdzOworCisJaWYgKGRlY25ldF9kZWJ1Z19sZXZlbCAmIDEpCisJCXByaW50ayhLRVJOX0RFQlVHIAorCQkJImRuX3JvdXRlX3JjdjogZ290IDB4JTAyeCBmcm9tICVzIFslZCAlZCAlZF1cbiIsCisJCQkoaW50KWZsYWdzLCAoZGV2KSA/IGRldi0+bmFtZSA6ICI/Pz8iLCBsZW4sIHNrYi0+bGVuLCAKKwkJCXBhZGxlbik7CisKKyAgICAgICAgaWYgKGZsYWdzICYgRE5fUlRfUEtUX0NOVEwpIHsKKwkJaWYgKHVubGlrZWx5KHNrYl9pc19ub25saW5lYXIoc2tiKSkgJiYKKwkJICAgIHNrYl9saW5lYXJpemUoc2tiLCBHRlBfQVRPTUlDKSAhPSAwKQorCQkJZ290byBkdW1wX2l0OworCisgICAgICAgICAgICAgICAgc3dpdGNoKGZsYWdzICYgRE5fUlRfQ05UTF9NU0spIHsKKyAgICAgICAgCSAgICAgICAgY2FzZSBETl9SVF9QS1RfSU5JVDoKKwkJCQlkbl9kZXZfaW5pdF9wa3Qoc2tiKTsKKwkJCQlicmVhazsKKyAgICAgICAgICAgICAgICAJY2FzZSBETl9SVF9QS1RfVkVSSToKKwkJCQlkbl9kZXZfdmVyaV9wa3Qoc2tiKTsKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChkbi0+cGFybXMuc3RhdGUgIT0gRE5fREVWX1NfUlUpCisJCQlnb3RvIGR1bXBfaXQ7CisKKwkJc3dpdGNoKGZsYWdzICYgRE5fUlRfQ05UTF9NU0spIHsKKyAgICAgICAgICAgICAgICAJY2FzZSBETl9SVF9QS1RfSEVMTzoKKwkJCQlyZXR1cm4gTkZfSE9PSyhQRl9ERUNuZXQsIE5GX0ROX0hFTExPLCBza2IsIHNrYi0+ZGV2LCBOVUxMLCBkbl9yb3V0ZV9wdHBfaGVsbG8pOworCisgICAgICAgICAgICAgICAgCWNhc2UgRE5fUlRfUEtUX0wxUlQ6CisgICAgICAgICAgICAgICAgCWNhc2UgRE5fUlRfUEtUX0wyUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBORl9IT09LKFBGX0RFQ25ldCwgTkZfRE5fUk9VVEUsIHNrYiwgc2tiLT5kZXYsIE5VTEwsIGRuX3JvdXRlX2Rpc2NhcmQpOworICAgICAgICAgICAgICAgIAljYXNlIEROX1JUX1BLVF9FUlRIOgorCQkJCXJldHVybiBORl9IT09LKFBGX0RFQ25ldCwgTkZfRE5fSEVMTE8sIHNrYiwgc2tiLT5kZXYsIE5VTEwsIGRuX25laWdoX3JvdXRlcl9oZWxsbyk7CisKKyAgICAgICAgICAgICAgICAJY2FzZSBETl9SVF9QS1RfRUVESDoKKwkJCQlyZXR1cm4gTkZfSE9PSyhQRl9ERUNuZXQsIE5GX0ROX0hFTExPLCBza2IsIHNrYi0+ZGV2LCBOVUxMLCBkbl9uZWlnaF9lbmRub2RlX2hlbGxvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisJCWlmIChkbi0+cGFybXMuc3RhdGUgIT0gRE5fREVWX1NfUlUpCisJCQlnb3RvIGR1bXBfaXQ7CisKKwkJc2tiX3B1bGwoc2tiLCAxKTsgLyogUHVsbCBmbGFncyAqLworCisgICAgICAgICAgICAgICAgc3dpdGNoKGZsYWdzICYgRE5fUlRfUEtUX01TSykgeworICAgICAgICAgICAgICAgIAljYXNlIEROX1JUX1BLVF9MT05HOgorICAgICAgICAgICAgICAgICAgICAgICAgCXJldHVybiBkbl9yb3V0ZV9yeF9sb25nKHNrYik7CisgICAgICAgICAgICAgICAgCWNhc2UgRE5fUlRfUEtUX1NIT1JUOgorICAgICAgICAgICAgICAgICAgICAgICAgCXJldHVybiBkbl9yb3V0ZV9yeF9zaG9ydChza2IpOworCQl9CisgICAgICAgIH0KKworZHVtcF9pdDoKKwlrZnJlZV9za2Ioc2tiKTsKK291dDoKKwlyZXR1cm4gTkVUX1JYX0RST1A7Cit9CisKK3N0YXRpYyBpbnQgZG5fb3V0cHV0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiLT5kc3Q7CisJc3RydWN0IGRuX3JvdXRlICpydCA9IChzdHJ1Y3QgZG5fcm91dGUgKilkc3Q7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRzdC0+ZGV2OworCXN0cnVjdCBkbl9za2JfY2IgKmNiID0gRE5fU0tCX0NCKHNrYik7CisJc3RydWN0IG5laWdoYm91ciAqbmVpZ2g7CisKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworCWlmICgobmVpZ2ggPSBkc3QtPm5laWdoYm91cikgPT0gTlVMTCkKKwkJZ290byBlcnJvcjsKKworCXNrYi0+ZGV2ID0gZGV2OworCisJY2ItPnNyYyA9IHJ0LT5ydF9zYWRkcjsKKwljYi0+ZHN0ID0gcnQtPnJ0X2RhZGRyOworCisJLyoKKwkgKiBBbHdheXMgc2V0IHRoZSBJbnRyYS1FdGhlcm5ldCBiaXQgb24gYWxsIG91dGdvaW5nIHBhY2tldHMKKwkgKiBvcmlnaW5hdGVkIG9uIHRoaXMgbm9kZS4gT25seSB2YWxpZCBmbGFnIGZyb20gdXBwZXIgbGF5ZXJzCisJICogaXMgcmV0dXJuLXRvLXNlbmRlci1yZXF1ZXN0ZWQuIFNldCBob3AgY291bnQgdG8gMCB0b28uCisJICovCisJY2ItPnJ0X2ZsYWdzICY9IH5ETl9SVF9GX1JRUjsKKwljYi0+cnRfZmxhZ3MgfD0gRE5fUlRfRl9JRTsKKwljYi0+aG9wcyA9IDA7CisKKwlyZXR1cm4gTkZfSE9PSyhQRl9ERUNuZXQsIE5GX0ROX0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBkZXYsIG5laWdoLT5vdXRwdXQpOworCitlcnJvcjoKKwlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiZG5fb3V0cHV0OiBUaGlzIHNob3VsZCBub3QgaGFwcGVuXG4iKTsKKworCWtmcmVlX3NrYihza2IpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkbl9mb3J3YXJkKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGRuX3NrYl9jYiAqY2IgPSBETl9TS0JfQ0Ioc2tiKTsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2ItPmRzdDsKKwlzdHJ1Y3QgZG5fZGV2ICpkbl9kYiA9IGRzdC0+ZGV2LT5kbl9wdHI7CisJc3RydWN0IGRuX3JvdXRlICpydDsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCA9IGRzdC0+bmVpZ2hib3VyOworCWludCBoZWFkZXJfbGVuOworI2lmZGVmIENPTkZJR19ORVRGSUxURVIKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CisjZW5kaWYKKworCWlmIChza2ItPnBrdF90eXBlICE9IFBBQ0tFVF9IT1NUKQorCQlnb3RvIGRyb3A7CisKKwkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGVub3VnaCBzcGFjZSBmb3IgaGVhZGVycyAqLworCXJ0ID0gKHN0cnVjdCBkbl9yb3V0ZSAqKXNrYi0+ZHN0OworCWhlYWRlcl9sZW4gPSBkbl9kYi0+dXNlX2xvbmcgPyAyMSA6IDY7CisJaWYgKHNrYl9jb3coc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShydC0+dS5kc3QuZGV2KStoZWFkZXJfbGVuKSkKKwkJZ290byBkcm9wOworCisJLyoKKwkgKiBIb3AgY291bnQgZXhjZWVkZWQuCisJICovCisJaWYgKCsrY2ItPmhvcHMgPiAzMCkKKwkJZ290byBkcm9wOworCisJc2tiLT5kZXYgPSBydC0+dS5kc3QuZGV2OworCisJLyoKKwkgKiBJZiBwYWNrZXQgZ29lcyBvdXQgc2FtZSBpbnRlcmZhY2UgaXQgY2FtZSBpbiBvbiwgdGhlbiBzZXQKKwkgKiB0aGUgSW50cmEtRXRoZXJuZXQgYml0LiBUaGlzIGhhcyBubyBlZmZlY3QgZm9yIHNob3J0CisJICogcGFja2V0cywgc28gd2UgZG9uJ3QgbmVlZCB0byB0ZXN0IGZvciB0aGVtIGhlcmUuCisJICovCisJY2ItPnJ0X2ZsYWdzICY9IH5ETl9SVF9GX0lFOworCWlmIChydC0+cnRfZmxhZ3MgJiBSVENGX0RPUkVESVJFQ1QpCisJCWNiLT5ydF9mbGFncyB8PSBETl9SVF9GX0lFOworCisJcmV0dXJuIE5GX0hPT0soUEZfREVDbmV0LCBORl9ETl9GT1JXQVJELCBza2IsIGRldiwgc2tiLT5kZXYsIG5laWdoLT5vdXRwdXQpOworCitkcm9wOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiBORVRfUlhfRFJPUDsKK30KKworLyoKKyAqIERyb3AgcGFja2V0LiBUaGlzIGlzIHVzZWQgZm9yIGVuZG5vZGVzIGFuZCBmb3IKKyAqIHdoZW4gd2Ugc2hvdWxkIG5vdCBiZSBmb3J3YXJkaW5nIHBhY2tldHMgZnJvbQorICogdGhpcyBkZXN0LgorICovCitzdGF0aWMgaW50IGRuX2JsYWNraG9sZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWtmcmVlX3NrYihza2IpOworCXJldHVybiBORVRfUlhfRFJPUDsKK30KKworLyoKKyAqIFVzZWQgdG8gY2F0Y2ggYnVncy4gVGhpcyBzaG91bGQgbmV2ZXIgbm9ybWFsbHkgZ2V0CisgKiBjYWxsZWQuCisgKi8KK3N0YXRpYyBpbnQgZG5fcnRfYnVnKHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQlzdHJ1Y3QgZG5fc2tiX2NiICpjYiA9IEROX1NLQl9DQihza2IpOworCisJCXByaW50ayhLRVJOX0RFQlVHICJkbl9ydF9idWc6IHNrYiBmcm9tOiUwNHggdG86JTA0eFxuIiwKKwkJCQljYi0+c3JjLCBjYi0+ZHN0KTsKKwl9CisKKwlrZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiBORVRfUlhfQkFEOworfQorCitzdGF0aWMgaW50IGRuX3J0X3NldF9uZXh0X2hvcChzdHJ1Y3QgZG5fcm91dGUgKnJ0LCBzdHJ1Y3QgZG5fZmliX3JlcyAqcmVzKQoreworCXN0cnVjdCBkbl9maWJfaW5mbyAqZmkgPSByZXMtPmZpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBydC0+dS5kc3QuZGV2OworCXN0cnVjdCBuZWlnaGJvdXIgKm47CisJdW5zaWduZWQgbXNzOworCisJaWYgKGZpKSB7CisJCWlmIChETl9GSUJfUkVTX0dXKCpyZXMpICYmCisJCSAgICBETl9GSUJfUkVTX05IKCpyZXMpLm5oX3Njb3BlID09IFJUX1NDT1BFX0xJTkspCisJCQlydC0+cnRfZ2F0ZXdheSA9IEROX0ZJQl9SRVNfR1coKnJlcyk7CisJCW1lbWNweShydC0+dS5kc3QubWV0cmljcywgZmktPmZpYl9tZXRyaWNzLAorCQkgICAgICAgc2l6ZW9mKHJ0LT51LmRzdC5tZXRyaWNzKSk7CisJfQorCXJ0LT5ydF90eXBlID0gcmVzLT50eXBlOworCisJaWYgKGRldiAhPSBOVUxMICYmIHJ0LT51LmRzdC5uZWlnaGJvdXIgPT0gTlVMTCkgeworCQluID0gX19uZWlnaF9sb29rdXBfZXJybm8oJmRuX25laWdoX3RhYmxlLCAmcnQtPnJ0X2dhdGV3YXksIGRldik7CisJCWlmIChJU19FUlIobikpCisJCQlyZXR1cm4gUFRSX0VSUihuKTsKKwkJcnQtPnUuZHN0Lm5laWdoYm91ciA9IG47CisJfQorCisJaWYgKHJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfTVRVLTFdID09IDAgfHwgCisgICAgICAgICAgICBydC0+dS5kc3QubWV0cmljc1tSVEFYX01UVS0xXSA+IHJ0LT51LmRzdC5kZXYtPm10dSkKKwkJcnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9NVFUtMV0gPSBydC0+dS5kc3QuZGV2LT5tdHU7CisJbXNzID0gZG5fbXNzX2Zyb21fcG10dShkZXYsIGRzdF9tdHUoJnJ0LT51LmRzdCkpOworCWlmIChydC0+dS5kc3QubWV0cmljc1tSVEFYX0FEVk1TUy0xXSA9PSAwIHx8CisJICAgIHJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfQURWTVNTLTFdID4gbXNzKQorCQlydC0+dS5kc3QubWV0cmljc1tSVEFYX0FEVk1TUy0xXSA9IG1zczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG5fbWF0Y2hfYWRkcihfX3UxNiBhZGRyMSwgX191MTYgYWRkcjIpCit7CisJX191MTYgdG1wID0gZG5fbnRvaHMoYWRkcjEpIF4gZG5fbnRvaHMoYWRkcjIpOworCWludCBtYXRjaCA9IDE2OworCXdoaWxlKHRtcCkgeworCQl0bXAgPj49IDE7CisJCW1hdGNoLS07CisJfQorCXJldHVybiBtYXRjaDsKK30KKworc3RhdGljIF9fdTE2IGRuZXRfc2VsZWN0X3NvdXJjZShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3UxNiBkYWRkciwgaW50IHNjb3BlKQoreworCV9fdTE2IHNhZGRyID0gMDsKKwlzdHJ1Y3QgZG5fZGV2ICpkbl9kYiA9IGRldi0+ZG5fcHRyOworCXN0cnVjdCBkbl9pZmFkZHIgKmlmYTsKKwlpbnQgYmVzdF9tYXRjaCA9IDA7CisJaW50IHJldDsKKworCXJlYWRfbG9jaygmZGV2X2Jhc2VfbG9jayk7CisJZm9yKGlmYSA9IGRuX2RiLT5pZmFfbGlzdDsgaWZhOyBpZmEgPSBpZmEtPmlmYV9uZXh0KSB7CisJCWlmIChpZmEtPmlmYV9zY29wZSA+IHNjb3BlKQorCQkJY29udGludWU7CisJCWlmICghZGFkZHIpIHsKKwkJCXNhZGRyID0gaWZhLT5pZmFfbG9jYWw7CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSBkbl9tYXRjaF9hZGRyKGRhZGRyLCBpZmEtPmlmYV9sb2NhbCk7CisJCWlmIChyZXQgPiBiZXN0X21hdGNoKQorCQkJc2FkZHIgPSBpZmEtPmlmYV9sb2NhbDsKKwkJaWYgKGJlc3RfbWF0Y2ggPT0gMCkKKwkJCXNhZGRyID0gaWZhLT5pZmFfbG9jYWw7CisJfQorCXJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKworCXJldHVybiBzYWRkcjsKK30KKworc3RhdGljIGlubGluZSBfX3UxNiBfX2RuX2ZpYl9yZXNfcHJlZnNyYyhzdHJ1Y3QgZG5fZmliX3JlcyAqcmVzKQoreworCXJldHVybiBkbmV0X3NlbGVjdF9zb3VyY2UoRE5fRklCX1JFU19ERVYoKnJlcyksIEROX0ZJQl9SRVNfR1coKnJlcyksIHJlcy0+c2NvcGUpOworfQorCitzdGF0aWMgaW5saW5lIF9fdTE2IGRuX2ZpYl9ydWxlc19tYXBfZGVzdGluYXRpb24oX191MTYgZGFkZHIsIHN0cnVjdCBkbl9maWJfcmVzICpyZXMpCit7CisJX191MTYgbWFzayA9IGRuZXRfbWFrZV9tYXNrKHJlcy0+cHJlZml4bGVuKTsKKwlyZXR1cm4gKGRhZGRyJn5tYXNrKXxyZXMtPmZpLT5maWJfbmgtPm5oX2d3OworfQorCitzdGF0aWMgaW50IGRuX3JvdXRlX291dHB1dF9zbG93KHN0cnVjdCBkc3RfZW50cnkgKipwcHJ0LCBjb25zdCBzdHJ1Y3QgZmxvd2kgKm9sZGZscCwgaW50IHRyeV9oYXJkKQoreworCXN0cnVjdCBmbG93aSBmbCA9IHsgLm5sX3UgPSB7IC5kbl91ID0gCisJCQkJICAgICAgeyAuZGFkZHIgPSBvbGRmbHAtPmZsZF9kc3QsCisJCQkJCS5zYWRkciA9IG9sZGZscC0+ZmxkX3NyYywKKwkJCQkJLnNjb3BlID0gUlRfU0NPUEVfVU5JVkVSU0UsCisjaWZkZWYgQ09ORklHX0RFQ05FVF9ST1VURV9GV01BUksKKwkJCQkJLmZ3bWFyayA9IG9sZGZscC0+ZmxkX2Z3bWFyaworI2VuZGlmCisJCQkJICAgICB9IH0sCisJCQkgICAgLmlpZiA9IGxvb3BiYWNrX2Rldi5pZmluZGV4LAorCQkJICAgIC5vaWYgPSBvbGRmbHAtPm9pZiB9OworCXN0cnVjdCBkbl9yb3V0ZSAqcnQgPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXZfb3V0ID0gTlVMTDsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCA9IE5VTEw7CisJdW5zaWduZWQgaGFzaDsKKwl1bnNpZ25lZCBmbGFncyA9IDA7CisJc3RydWN0IGRuX2ZpYl9yZXMgcmVzID0geyAuZmkgPSBOVUxMLCAudHlwZSA9IFJUTl9VTklDQVNUIH07CisJaW50IGVycjsKKwlpbnQgZnJlZV9yZXMgPSAwOworCV9fdTE2IGdhdGV3YXkgPSAwOworCisJaWYgKGRlY25ldF9kZWJ1Z19sZXZlbCAmIDE2KQorCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgImRuX3JvdXRlX291dHB1dF9zbG93OiBkc3Q9JTA0eCBzcmM9JTA0eCBtYXJrPSVkIgorCQkgICAgICAgIiBpaWY9JWQgb2lmPSVkXG4iLCBvbGRmbHAtPmZsZF9kc3QsIG9sZGZscC0+ZmxkX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgb2xkZmxwLT5mbGRfZndtYXJrLCBsb29wYmFja19kZXYuaWZpbmRleCwgb2xkZmxwLT5vaWYpOworCisJLyogSWYgd2UgaGF2ZSBhbiBvdXRwdXQgaW50ZXJmYWNlLCB2ZXJpZnkgaXRzIGEgREVDbmV0IGRldmljZSAqLworCWlmIChvbGRmbHAtPm9pZikgeworCQlkZXZfb3V0ID0gZGV2X2dldF9ieV9pbmRleChvbGRmbHAtPm9pZik7CisJCWVyciA9IC1FTk9ERVY7CisJCWlmIChkZXZfb3V0ICYmIGRldl9vdXQtPmRuX3B0ciA9PSBOVUxMKSB7CisJCQlkZXZfcHV0KGRldl9vdXQpOworCQkJZGV2X291dCA9IE5VTEw7CisJCX0KKwkJaWYgKGRldl9vdXQgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCX0KKworCS8qIElmIHdlIGhhdmUgYSBzb3VyY2UgYWRkcmVzcywgdmVyaWZ5IHRoYXQgaXRzIGEgbG9jYWwgYWRkcmVzcyAqLworCWlmIChvbGRmbHAtPmZsZF9zcmMpIHsKKwkJZXJyID0gLUVBRERSTk9UQVZBSUw7CisKKwkJaWYgKGRldl9vdXQpIHsKKwkJCWlmIChkbl9kZXZfaXNsb2NhbChkZXZfb3V0LCBvbGRmbHAtPmZsZF9zcmMpKQorCQkJCWdvdG8gc291cmNlX29rOworCQkJZGV2X3B1dChkZXZfb3V0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJlYWRfbG9jaygmZGV2X2Jhc2VfbG9jayk7CisJCWZvcihkZXZfb3V0ID0gZGV2X2Jhc2U7IGRldl9vdXQ7IGRldl9vdXQgPSBkZXZfb3V0LT5uZXh0KSB7CisJCQlpZiAoIWRldl9vdXQtPmRuX3B0cikKKwkJCQljb250aW51ZTsKKwkJCWlmIChkbl9kZXZfaXNsb2NhbChkZXZfb3V0LCBvbGRmbHAtPmZsZF9zcmMpKQorCQkJCWJyZWFrOworCQl9CisJCXJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKwkJaWYgKGRldl9vdXQgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCQlkZXZfaG9sZChkZXZfb3V0KTsKK3NvdXJjZV9vazoKKwkJOworCX0KKworCS8qIE5vIGRlc3RpbmF0aW9uPyBBc3N1bWUgaXRzIGxvY2FsICovCisJaWYgKCFmbC5mbGRfZHN0KSB7CisJCWZsLmZsZF9kc3QgPSBmbC5mbGRfc3JjOworCisJCWVyciA9IC1FQUREUk5PVEFWQUlMOworCQlpZiAoZGV2X291dCkKKwkJCWRldl9wdXQoZGV2X291dCk7CisJCWRldl9vdXQgPSAmbG9vcGJhY2tfZGV2OworCQlkZXZfaG9sZChkZXZfb3V0KTsKKwkJaWYgKCFmbC5mbGRfZHN0KSB7CisJCQlmbC5mbGRfZHN0ID0KKwkJCWZsLmZsZF9zcmMgPSBkbmV0X3NlbGVjdF9zb3VyY2UoZGV2X291dCwgMCwKKwkJCQkJCSAgICAgICBSVF9TQ09QRV9IT1NUKTsKKwkJCWlmICghZmwuZmxkX2RzdCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCQlmbC5vaWYgPSBsb29wYmFja19kZXYuaWZpbmRleDsKKwkJcmVzLnR5cGUgPSBSVE5fTE9DQUw7CisJCWdvdG8gbWFrZV9yb3V0ZTsKKwl9CisKKwlpZiAoZGVjbmV0X2RlYnVnX2xldmVsICYgMTYpCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiZG5fcm91dGVfb3V0cHV0X3Nsb3c6IGluaXRpYWwgY2hlY2tzIGNvbXBsZXRlLiIKKwkJICAgICAgICIgZHN0PSVvNHggc3JjPSUwNHggb2lmPSVkIHRyeV9oYXJkPSVkXG4iLCBmbC5mbGRfZHN0LAorCQkgICAgICAgZmwuZmxkX3NyYywgZmwub2lmLCB0cnlfaGFyZCk7CisKKwkvKgorCSAqIE4uQi4gSWYgdGhlIGtlcm5lbCBpcyBjb21waWxlZCB3aXRob3V0IHJvdXRlciBzdXBwb3J0IHRoZW4KKwkgKiBkbl9maWJfbG9va3VwKCkgd2lsbCBldmFsdWF0ZSB0byBub24temVybyBzbyB0aGlzIGlmICgpIGJsb2NrCisJICogd2lsbCBhbHdheXMgYmUgZXhlY3V0ZWQuCisJICovCisJZXJyID0gLUVTUkNIOworCWlmICh0cnlfaGFyZCB8fCAoZXJyID0gZG5fZmliX2xvb2t1cCgmZmwsICZyZXMpKSAhPSAwKSB7CisJCXN0cnVjdCBkbl9kZXYgKmRuX2RiOworCQlpZiAoZXJyICE9IC1FU1JDSCkKKwkJCWdvdG8gb3V0OworCQkvKgorCSAJICogSGVyZSB0aGUgZmFsbGJhY2sgaXMgYmFzaWNhbGx5IHRoZSBzdGFuZGFyZCBhbGdvcml0aG0gZm9yIAorCQkgKiByb3V0aW5nIGluIGVuZG5vZGVzIHdoaWNoIGlzIGRlc2NyaWJlZCBpbiB0aGUgREVDbmV0IHJvdXRpbmcKKwkJICogZG9jcworCQkgKgorCQkgKiBJZiB3ZSBhcmUgbm90IHRyeWluZyBoYXJkLCBsb29rIGluIG5laWdoYm91ciBjYWNoZS4KKwkJICogVGhlIHJlc3VsdCBpcyB0ZXN0ZWQgdG8gZW5zdXJlIHRoYXQgaWYgYSBzcGVjaWZpYyBvdXRwdXQKKwkJICogZGV2aWNlL3NvdXJjZSBhZGRyZXNzIHdhcyByZXF1ZXN0ZWQsIHRoZW4gd2UgaG9ub3VyIHRoYXQgCisJCSAqIGhlcmUKKwkJICovCisJCWlmICghdHJ5X2hhcmQpIHsKKwkJCW5laWdoID0gbmVpZ2hfbG9va3VwX25vZGV2KCZkbl9uZWlnaF90YWJsZSwgJmZsLmZsZF9kc3QpOworCQkJaWYgKG5laWdoKSB7CisJCQkJaWYgKChvbGRmbHAtPm9pZiAmJiAKKwkJCQkgICAgKG5laWdoLT5kZXYtPmlmaW5kZXggIT0gb2xkZmxwLT5vaWYpKSB8fAorCQkJCSAgICAob2xkZmxwLT5mbGRfc3JjICYmCisJCQkJICAgICghZG5fZGV2X2lzbG9jYWwobmVpZ2gtPmRldiwKKwkJCQkJCSAgICAgIG9sZGZscC0+ZmxkX3NyYykpKSkgeworCQkJCQluZWlnaF9yZWxlYXNlKG5laWdoKTsKKwkJCQkJbmVpZ2ggPSBOVUxMOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChkZXZfb3V0KQorCQkJCQkJZGV2X3B1dChkZXZfb3V0KTsKKwkJCQkJaWYgKGRuX2Rldl9pc2xvY2FsKG5laWdoLT5kZXYsIGZsLmZsZF9kc3QpKSB7CisJCQkJCQlkZXZfb3V0ID0gJmxvb3BiYWNrX2RldjsKKwkJCQkJCXJlcy50eXBlID0gUlROX0xPQ0FMOworCQkJCQl9IGVsc2UgeworCQkJCQkJZGV2X291dCA9IG5laWdoLT5kZXY7CisJCQkJCX0KKwkJCQkJZGV2X2hvbGQoZGV2X291dCk7CisJCQkJCWdvdG8gc2VsZWN0X3NvdXJjZTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBOb3QgdGhlcmU/IFBlcmhhcHMgaXRzIGEgbG9jYWwgYWRkcmVzcyAqLworCQlpZiAoZGV2X291dCA9PSBOVUxMKQorCQkJZGV2X291dCA9IGRuX2Rldl9nZXRfZGVmYXVsdCgpOworCQllcnIgPSAtRU5PREVWOworCQlpZiAoZGV2X291dCA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJCWRuX2RiID0gZGV2X291dC0+ZG5fcHRyOworCQkvKiBQb3NzaWJsZSBpbXByb3ZlbWVudCAtIGNoZWNrIGFsbCBkZXZpY2VzIGZvciBsb2NhbCBhZGRyICovCisJCWlmIChkbl9kZXZfaXNsb2NhbChkZXZfb3V0LCBmbC5mbGRfZHN0KSkgeworCQkJZGV2X3B1dChkZXZfb3V0KTsKKwkJCWRldl9vdXQgPSAmbG9vcGJhY2tfZGV2OworCQkJZGV2X2hvbGQoZGV2X291dCk7CisJCQlyZXMudHlwZSA9IFJUTl9MT0NBTDsKKwkJCWdvdG8gc2VsZWN0X3NvdXJjZTsKKwkJfQorCQkvKiBOb3QgbG9jYWwgZWl0aGVyLi4uLiB0cnkgc2VuZGluZyBpdCB0byB0aGUgZGVmYXVsdCByb3V0ZXIgKi8KKwkJbmVpZ2ggPSBuZWlnaF9jbG9uZShkbl9kYi0+cm91dGVyKTsKKwkJQlVHX09OKG5laWdoICYmIG5laWdoLT5kZXYgIT0gZGV2X291dCk7CisKKwkJLyogT2sgdGhlbiwgd2UgYXNzdW1lIGl0cyBkaXJlY3RseSBjb25uZWN0ZWQgYW5kIG1vdmUgb24gKi8KK3NlbGVjdF9zb3VyY2U6CisJCWlmIChuZWlnaCkKKwkJCWdhdGV3YXkgPSAoKHN0cnVjdCBkbl9uZWlnaCAqKW5laWdoKS0+YWRkcjsKKwkJaWYgKGdhdGV3YXkgPT0gMCkKKwkJCWdhdGV3YXkgPSBmbC5mbGRfZHN0OworCQlpZiAoZmwuZmxkX3NyYyA9PSAwKSB7CisJCQlmbC5mbGRfc3JjID0gZG5ldF9zZWxlY3Rfc291cmNlKGRldl9vdXQsIGdhdGV3YXksCisJCQkJCQkJIHJlcy50eXBlID09IFJUTl9MT0NBTCA/CisJCQkJCQkJIFJUX1NDT1BFX0hPU1QgOiAKKwkJCQkJCQkgUlRfU0NPUEVfTElOSyk7CisJCQlpZiAoZmwuZmxkX3NyYyA9PSAwICYmIHJlcy50eXBlICE9IFJUTl9MT0NBTCkKKwkJCQlnb3RvIGVfYWRkcjsKKwkJfQorCQlmbC5vaWYgPSBkZXZfb3V0LT5pZmluZGV4OworCQlnb3RvIG1ha2Vfcm91dGU7CisJfQorCWZyZWVfcmVzID0gMTsKKworCWlmIChyZXMudHlwZSA9PSBSVE5fTkFUKQorCQlnb3RvIGVfaW52YWw7CisKKwlpZiAocmVzLnR5cGUgPT0gUlROX0xPQ0FMKSB7CisJCWlmICghZmwuZmxkX3NyYykKKwkJCWZsLmZsZF9zcmMgPSBmbC5mbGRfZHN0OworCQlpZiAoZGV2X291dCkKKwkJCWRldl9wdXQoZGV2X291dCk7CisJCWRldl9vdXQgPSAmbG9vcGJhY2tfZGV2OworCQlkZXZfaG9sZChkZXZfb3V0KTsKKwkJZmwub2lmID0gZGV2X291dC0+aWZpbmRleDsKKwkJaWYgKHJlcy5maSkKKwkJCWRuX2ZpYl9pbmZvX3B1dChyZXMuZmkpOworCQlyZXMuZmkgPSBOVUxMOworCQlnb3RvIG1ha2Vfcm91dGU7CisJfQorCisJaWYgKHJlcy5maS0+ZmliX25ocyA+IDEgJiYgZmwub2lmID09IDApCisJCWRuX2ZpYl9zZWxlY3RfbXVsdGlwYXRoKCZmbCwgJnJlcyk7CisKKwkvKiAKKwkgKiBXZSBjb3VsZCBhZGQgc29tZSBsb2dpYyB0byBkZWFsIHdpdGggZGVmYXVsdCByb3V0ZXMgaGVyZSBhbmQKKwkgKiBnZXQgcmlkIG9mIHNvbWUgb2YgdGhlIHNwZWNpYWwgY2FzaW5nIGFib3ZlLgorCSAqLworCisJaWYgKCFmbC5mbGRfc3JjKQorCQlmbC5mbGRfc3JjID0gRE5fRklCX1JFU19QUkVGU1JDKHJlcyk7CisJCisJaWYgKGRldl9vdXQpCisJCWRldl9wdXQoZGV2X291dCk7CisJZGV2X291dCA9IEROX0ZJQl9SRVNfREVWKHJlcyk7CisJZGV2X2hvbGQoZGV2X291dCk7CisJZmwub2lmID0gZGV2X291dC0+aWZpbmRleDsKKwlnYXRld2F5ID0gRE5fRklCX1JFU19HVyhyZXMpOworCittYWtlX3JvdXRlOgorCWlmIChkZXZfb3V0LT5mbGFncyAmIElGRl9MT09QQkFDSykKKwkJZmxhZ3MgfD0gUlRDRl9MT0NBTDsKKworCXJ0ID0gZHN0X2FsbG9jKCZkbl9kc3Rfb3BzKTsKKwlpZiAocnQgPT0gTlVMTCkKKwkJZ290byBlX25vYnVmczsKKworCWF0b21pY19zZXQoJnJ0LT51LmRzdC5fX3JlZmNudCwgMSk7CisJcnQtPnUuZHN0LmZsYWdzICAgPSBEU1RfSE9TVDsKKworCXJ0LT5mbC5mbGRfc3JjICAgID0gb2xkZmxwLT5mbGRfc3JjOworCXJ0LT5mbC5mbGRfZHN0ICAgID0gb2xkZmxwLT5mbGRfZHN0OworCXJ0LT5mbC5vaWYgICAgICAgID0gb2xkZmxwLT5vaWY7CisJcnQtPmZsLmlpZiAgICAgICAgPSAwOworI2lmZGVmIENPTkZJR19ERUNORVRfUk9VVEVfRldNQVJLCisJcnQtPmZsLmZsZF9md21hcmsgPSBvbGRmbHAtPmZsZF9md21hcms7CisjZW5kaWYKKworCXJ0LT5ydF9zYWRkciAgICAgID0gZmwuZmxkX3NyYzsKKwlydC0+cnRfZGFkZHIgICAgICA9IGZsLmZsZF9kc3Q7CisJcnQtPnJ0X2dhdGV3YXkgICAgPSBnYXRld2F5ID8gZ2F0ZXdheSA6IGZsLmZsZF9kc3Q7CisJcnQtPnJ0X2xvY2FsX3NyYyAgPSBmbC5mbGRfc3JjOworCisJcnQtPnJ0X2RzdF9tYXAgICAgPSBmbC5mbGRfZHN0OworCXJ0LT5ydF9zcmNfbWFwICAgID0gZmwuZmxkX3NyYzsKKworCXJ0LT51LmRzdC5kZXYgPSBkZXZfb3V0OworCWRldl9ob2xkKGRldl9vdXQpOworCXJ0LT51LmRzdC5uZWlnaGJvdXIgPSBuZWlnaDsKKwluZWlnaCA9IE5VTEw7CisKKwlydC0+dS5kc3QubGFzdHVzZSA9IGppZmZpZXM7CisJcnQtPnUuZHN0Lm91dHB1dCAgPSBkbl9vdXRwdXQ7CisJcnQtPnUuZHN0LmlucHV0ICAgPSBkbl9ydF9idWc7CisJcnQtPnJ0X2ZsYWdzICAgICAgPSBmbGFnczsKKwlpZiAoZmxhZ3MgJiBSVENGX0xPQ0FMKQorCQlydC0+dS5kc3QuaW5wdXQgPSBkbl9uc3Bfcng7CisKKwllcnIgPSBkbl9ydF9zZXRfbmV4dF9ob3AocnQsICZyZXMpOworCWlmIChlcnIpCisJCWdvdG8gZV9uZWlnaGJvdXI7CisKKwloYXNoID0gZG5faGFzaChydC0+ZmwuZmxkX3NyYywgcnQtPmZsLmZsZF9kc3QpOworCWRuX2luc2VydF9yb3V0ZShydCwgaGFzaCwgKHN0cnVjdCBkbl9yb3V0ZSAqKilwcHJ0KTsKKworZG9uZToKKwlpZiAobmVpZ2gpCisJCW5laWdoX3JlbGVhc2UobmVpZ2gpOworCWlmIChmcmVlX3JlcykKKwkJZG5fZmliX3Jlc19wdXQoJnJlcyk7CisJaWYgKGRldl9vdXQpCisJCWRldl9wdXQoZGV2X291dCk7CitvdXQ6CisJcmV0dXJuIGVycjsKKworZV9hZGRyOgorICAgICAgICBlcnIgPSAtRUFERFJOT1RBVkFJTDsKKyAgICAgICAgZ290byBkb25lOworZV9pbnZhbDoKKwllcnIgPSAtRUlOVkFMOworCWdvdG8gZG9uZTsKK2Vfbm9idWZzOgorCWVyciA9IC1FTk9CVUZTOworCWdvdG8gZG9uZTsKK2VfbmVpZ2hib3VyOgorCWRzdF9mcmVlKCZydC0+dS5kc3QpOworCWdvdG8gZV9ub2J1ZnM7Cit9CisKKworLyoKKyAqIE4uQi4gVGhlIGZsYWdzIG1heSBiZSBtb3ZlZCBpbnRvIHRoZSBmbG93aSBhdCBzb21lIGZ1dHVyZSBzdGFnZS4KKyAqLworc3RhdGljIGludCBfX2RuX3JvdXRlX291dHB1dF9rZXkoc3RydWN0IGRzdF9lbnRyeSAqKnBwcnQsIGNvbnN0IHN0cnVjdCBmbG93aSAqZmxwLCBpbnQgZmxhZ3MpCit7CisJdW5zaWduZWQgaGFzaCA9IGRuX2hhc2goZmxwLT5mbGRfc3JjLCBmbHAtPmZsZF9kc3QpOworCXN0cnVjdCBkbl9yb3V0ZSAqcnQgPSBOVUxMOworCisJaWYgKCEoZmxhZ3MgJiBNU0dfVFJZSEFSRCkpIHsKKwkJcmN1X3JlYWRfbG9ja19iaCgpOworCQlmb3IocnQgPSByY3VfZGVyZWZlcmVuY2UoZG5fcnRfaGFzaF90YWJsZVtoYXNoXS5jaGFpbik7IHJ0OworCQkJcnQgPSByY3VfZGVyZWZlcmVuY2UocnQtPnUucnRfbmV4dCkpIHsKKwkJCWlmICgoZmxwLT5mbGRfZHN0ID09IHJ0LT5mbC5mbGRfZHN0KSAmJgorCQkJICAgIChmbHAtPmZsZF9zcmMgPT0gcnQtPmZsLmZsZF9zcmMpICYmCisjaWZkZWYgQ09ORklHX0RFQ05FVF9ST1VURV9GV01BUksKKwkJCSAgICAoZmxwLT5mbGRfZndtYXJrID09IHJ0LT5mbC5mbGRfZndtYXJrKSAmJgorI2VuZGlmCisJCQkgICAgKHJ0LT5mbC5paWYgPT0gMCkgJiYKKwkJCSAgICAocnQtPmZsLm9pZiA9PSBmbHAtPm9pZikpIHsKKwkJCQlydC0+dS5kc3QubGFzdHVzZSA9IGppZmZpZXM7CisJCQkJZHN0X2hvbGQoJnJ0LT51LmRzdCk7CisJCQkJcnQtPnUuZHN0Ll9fdXNlKys7CisJCQkJcmN1X3JlYWRfdW5sb2NrX2JoKCk7CisJCQkJKnBwcnQgPSAmcnQtPnUuZHN0OworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCXJjdV9yZWFkX3VubG9ja19iaCgpOworCX0KKworCXJldHVybiBkbl9yb3V0ZV9vdXRwdXRfc2xvdyhwcHJ0LCBmbHAsIGZsYWdzKTsKK30KKworc3RhdGljIGludCBkbl9yb3V0ZV9vdXRwdXRfa2V5KHN0cnVjdCBkc3RfZW50cnkgKipwcHJ0LCBzdHJ1Y3QgZmxvd2kgKmZscCwgaW50IGZsYWdzKQoreworCWludCBlcnI7CisKKwllcnIgPSBfX2RuX3JvdXRlX291dHB1dF9rZXkocHBydCwgZmxwLCBmbGFncyk7CisJaWYgKGVyciA9PSAwICYmIGZscC0+cHJvdG8pIHsKKwkJZXJyID0geGZybV9sb29rdXAocHBydCwgZmxwLCBOVUxMLCAwKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworaW50IGRuX3JvdXRlX291dHB1dF9zb2NrKHN0cnVjdCBkc3RfZW50cnkgKipwcHJ0LCBzdHJ1Y3QgZmxvd2kgKmZsLCBzdHJ1Y3Qgc29jayAqc2ssIGludCBmbGFncykKK3sKKwlpbnQgZXJyOworCisJZXJyID0gX19kbl9yb3V0ZV9vdXRwdXRfa2V5KHBwcnQsIGZsLCBmbGFncyAmIE1TR19UUllIQVJEKTsKKwlpZiAoZXJyID09IDAgJiYgZmwtPnByb3RvKSB7CisJCWVyciA9IHhmcm1fbG9va3VwKHBwcnQsIGZsLCBzaywgIShmbGFncyAmIE1TR19ET05UV0FJVCkpOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGRuX3JvdXRlX2lucHV0X3Nsb3coc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZG5fcm91dGUgKnJ0ID0gTlVMTDsKKwlzdHJ1Y3QgZG5fc2tiX2NiICpjYiA9IEROX1NLQl9DQihza2IpOworCXN0cnVjdCBuZXRfZGV2aWNlICppbl9kZXYgPSBza2ItPmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqb3V0X2RldiA9IE5VTEw7CisJc3RydWN0IGRuX2RldiAqZG5fZGI7CisJc3RydWN0IG5laWdoYm91ciAqbmVpZ2ggPSBOVUxMOworCXVuc2lnbmVkIGhhc2g7CisJaW50IGZsYWdzID0gMDsKKwlfX3UxNiBnYXRld2F5ID0gMDsKKwlfX3UxNiBsb2NhbF9zcmMgPSAwOworCXN0cnVjdCBmbG93aSBmbCA9IHsgLm5sX3UgPSB7IC5kbl91ID0gCisJCQkJICAgICB7IC5kYWRkciA9IGNiLT5kc3QsCisJCQkJICAgICAgIC5zYWRkciA9IGNiLT5zcmMsCisJCQkJICAgICAgIC5zY29wZSA9IFJUX1NDT1BFX1VOSVZFUlNFLAorI2lmZGVmIENPTkZJR19ERUNORVRfUk9VVEVfRldNQVJLCisJCQkJICAgICAgIC5md21hcmsgPSBza2ItPm5mbWFyaworI2VuZGlmCisJCQkJICAgIH0gfSwKKwkJCSAgICAuaWlmID0gc2tiLT5kZXYtPmlmaW5kZXggfTsKKwlzdHJ1Y3QgZG5fZmliX3JlcyByZXMgPSB7IC5maSA9IE5VTEwsIC50eXBlID0gUlROX1VOUkVBQ0hBQkxFIH07CisJaW50IGVyciA9IC1FSU5WQUw7CisJaW50IGZyZWVfcmVzID0gMDsKKworCWRldl9ob2xkKGluX2Rldik7CisKKwlpZiAoKGRuX2RiID0gaW5fZGV2LT5kbl9wdHIpID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJLyogWmVybyBzb3VyY2UgYWRkcmVzc2VzIGFyZSBub3QgYWxsb3dlZCAqLworCWlmIChmbC5mbGRfc3JjID09IDApCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBJbiB0aGlzIGNhc2Ugd2UndmUganVzdCByZWNlaXZlZCBhIHBhY2tldCBmcm9tIGEgc291cmNlCisJICogb3V0c2lkZSBvdXJzZWx2ZXMgcHJldGVuZGluZyB0byBjb21lIGZyb20gdXMuIFdlIGRvbid0CisJICogYWxsb3cgaXQgYW55IGZ1cnRoZXIgdG8gcHJldmVudCByb3V0aW5nIGxvb3BzLCBzcG9vZmluZyBhbmQKKwkgKiBvdGhlciBuYXN0aWVzLiBMb29wYmFjayBwYWNrZXRzIGFscmVhZHkgaGF2ZSB0aGUgZHN0IGF0dGFjaGVkCisJICogc28gdGhpcyBvbmx5IGFmZmVjdHMgcGFja2V0cyB3aGljaCBoYXZlIG9yaWdpbmF0ZWQgZWxzZXdoZXJlLgorCSAqLworCWVyciAgPSAtRU5PVFVOSVE7CisJaWYgKGRuX2Rldl9pc2xvY2FsKGluX2RldiwgY2ItPnNyYykpCisJCWdvdG8gb3V0OworCisJZXJyID0gZG5fZmliX2xvb2t1cCgmZmwsICZyZXMpOworCWlmIChlcnIpIHsKKwkJaWYgKGVyciAhPSAtRVNSQ0gpCisJCQlnb3RvIG91dDsKKwkJLyoKKwkJICogSXMgdGhlIGRlc3RpbmF0aW9uIHVzID8KKwkJICovCisJCWlmICghZG5fZGV2X2lzbG9jYWwoaW5fZGV2LCBjYi0+ZHN0KSkKKwkJCWdvdG8gZV9pbnZhbDsKKworCQlyZXMudHlwZSA9IFJUTl9MT0NBTDsKKwkJZmxhZ3MgfD0gUlRDRl9ESVJFQ1RTUkM7CisJfSBlbHNlIHsKKwkJX191MTYgc3JjX21hcCA9IGZsLmZsZF9zcmM7CisJCWZyZWVfcmVzID0gMTsKKworCQlvdXRfZGV2ID0gRE5fRklCX1JFU19ERVYocmVzKTsKKwkJaWYgKG91dF9kZXYgPT0gTlVMTCkgeworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQlwcmludGsoS0VSTl9DUklUICJCdWcgaW4gZG5fcm91dGVfaW5wdXRfc2xvdygpICIKKwkJCQkJCSAiTm8gb3V0cHV0IGRldmljZVxuIik7CisJCQlnb3RvIGVfaW52YWw7CisJCX0KKwkJZGV2X2hvbGQob3V0X2Rldik7CisKKwkJaWYgKHJlcy5yKQorCQkJc3JjX21hcCA9IGRuX2ZpYl9ydWxlc19wb2xpY3koZmwuZmxkX3NyYywgJnJlcywgJmZsYWdzKTsKKworCQlnYXRld2F5ID0gRE5fRklCX1JFU19HVyhyZXMpOworCQlpZiAocmVzLnR5cGUgPT0gUlROX05BVCkgeworCQkJZmwuZmxkX2RzdCA9IGRuX2ZpYl9ydWxlc19tYXBfZGVzdGluYXRpb24oZmwuZmxkX2RzdCwgJnJlcyk7CisJCQlkbl9maWJfcmVzX3B1dCgmcmVzKTsKKwkJCWZyZWVfcmVzID0gMDsKKwkJCWlmIChkbl9maWJfbG9va3VwKCZmbCwgJnJlcykpCisJCQkJZ290byBlX2ludmFsOworCQkJZnJlZV9yZXMgPSAxOworCQkJaWYgKHJlcy50eXBlICE9IFJUTl9VTklDQVNUKQorCQkJCWdvdG8gZV9pbnZhbDsKKwkJCWZsYWdzIHw9IFJUQ0ZfRE5BVDsKKwkJCWdhdGV3YXkgPSBmbC5mbGRfZHN0OworCQl9CisJCWZsLmZsZF9zcmMgPSBzcmNfbWFwOworCX0KKworCXN3aXRjaChyZXMudHlwZSkgeworCWNhc2UgUlROX1VOSUNBU1Q6CisJCS8qCisJCSAqIEZvcndhcmRpbmcgY2hlY2sgaGVyZSwgd2Ugb25seSBjaGVjayBmb3IgZm9yd2FyZGluZworCQkgKiBiZWluZyB0dXJuZWQgb2ZmLCBpZiB5b3Ugd2FudCB0byBvbmx5IGZvcndhcmQgaW50cmEKKwkJICogYXJlYSwgaXRzIHVwIHRvIHlvdSB0byBzZXQgdGhlIHJvdXRpbmcgdGFibGVzIHVwCisJCSAqIGNvcnJlY3RseS4KKwkJICovCisJCWlmIChkbl9kYi0+cGFybXMuZm9yd2FyZGluZyA9PSAwKQorCQkJZ290byBlX2ludmFsOworCisJCWlmIChyZXMuZmktPmZpYl9uaHMgPiAxICYmIGZsLm9pZiA9PSAwKQorCQkJZG5fZmliX3NlbGVjdF9tdWx0aXBhdGgoJmZsLCAmcmVzKTsKKworCQkvKiAKKwkJICogQ2hlY2sgZm9yIG91dF9kZXYgPT0gaW5fZGV2LiBXZSB1c2UgdGhlIFJUQ0ZfRE9SRURJUkVDVAorCQkgKiBmbGFnIGFzIGEgaGludCB0byBzZXQgdGhlIGludHJhLWV0aGVybmV0IGJpdCB3aGVuCisJCSAqIGZvcndhcmRpbmcuIElmIHdlJ3ZlIGdvdCBOQVQgaW4gb3BlcmF0aW9uLCB3ZSBkb24ndCBkbworCQkgKiB0aGlzIG9wdGltaXNhdGlvbi4KKwkJICovCisJCWlmIChvdXRfZGV2ID09IGluX2RldiAmJiAhKGZsYWdzICYgUlRDRl9OQVQpKQorCQkJZmxhZ3MgfD0gUlRDRl9ET1JFRElSRUNUOworCisJCWxvY2FsX3NyYyA9IEROX0ZJQl9SRVNfUFJFRlNSQyhyZXMpOworCisJY2FzZSBSVE5fQkxBQ0tIT0xFOgorCWNhc2UgUlROX1VOUkVBQ0hBQkxFOgorCQlicmVhazsKKwljYXNlIFJUTl9MT0NBTDoKKwkJZmxhZ3MgfD0gUlRDRl9MT0NBTDsKKwkJZmwuZmxkX3NyYyA9IGNiLT5kc3Q7CisJCWZsLmZsZF9kc3QgPSBjYi0+c3JjOworCisJCS8qIFJvdXRpbmcgdGFibGVzIGdhdmUgdXMgYSBnYXRld2F5ICovCisJCWlmIChnYXRld2F5KQorCQkJZ290byBtYWtlX3JvdXRlOworCisJCS8qIFBhY2tldCB3YXMgaW50cmEtZXRoZXJuZXQsIHNvIHdlIGtub3cgaXRzIG9uLWxpbmsgKi8KKwkJaWYgKGNiLT5ydF9mbGFncyB8IEROX1JUX0ZfSUUpIHsKKwkJCWdhdGV3YXkgPSBjYi0+c3JjOworCQkJZmxhZ3MgfD0gUlRDRl9ESVJFQ1RTUkM7CisJCQlnb3RvIG1ha2Vfcm91dGU7CisJCX0KKworCQkvKiBVc2UgdGhlIGRlZmF1bHQgcm91dGVyIGlmIHRoZXJlIGlzIG9uZSAqLworCQluZWlnaCA9IG5laWdoX2Nsb25lKGRuX2RiLT5yb3V0ZXIpOworCQlpZiAobmVpZ2gpIHsKKwkJCWdhdGV3YXkgPSAoKHN0cnVjdCBkbl9uZWlnaCAqKW5laWdoKS0+YWRkcjsKKwkJCWdvdG8gbWFrZV9yb3V0ZTsKKwkJfQorCisJCS8qIENsb3NlIGV5ZXMgYW5kIHByYXkgKi8KKwkJZ2F0ZXdheSA9IGNiLT5zcmM7CisJCWZsYWdzIHw9IFJUQ0ZfRElSRUNUU1JDOworCQlnb3RvIG1ha2Vfcm91dGU7CisJZGVmYXVsdDoKKwkJZ290byBlX2ludmFsOworCX0KKworbWFrZV9yb3V0ZToKKwlydCA9IGRzdF9hbGxvYygmZG5fZHN0X29wcyk7CisJaWYgKHJ0ID09IE5VTEwpCisJCWdvdG8gZV9ub2J1ZnM7CisKKwlydC0+cnRfc2FkZHIgICAgICA9IGZsLmZsZF9zcmM7CisJcnQtPnJ0X2RhZGRyICAgICAgPSBmbC5mbGRfZHN0OworCXJ0LT5ydF9nYXRld2F5ICAgID0gZmwuZmxkX2RzdDsKKwlpZiAoZ2F0ZXdheSkKKwkJcnQtPnJ0X2dhdGV3YXkgPSBnYXRld2F5OworCXJ0LT5ydF9sb2NhbF9zcmMgID0gbG9jYWxfc3JjID8gbG9jYWxfc3JjIDogcnQtPnJ0X3NhZGRyOworCisJcnQtPnJ0X2RzdF9tYXAgICAgPSBmbC5mbGRfZHN0OworCXJ0LT5ydF9zcmNfbWFwICAgID0gZmwuZmxkX3NyYzsKKworCXJ0LT5mbC5mbGRfc3JjICAgID0gY2ItPnNyYzsKKwlydC0+ZmwuZmxkX2RzdCAgICA9IGNiLT5kc3Q7CisJcnQtPmZsLm9pZiAgICAgICAgPSAwOworCXJ0LT5mbC5paWYgICAgICAgID0gaW5fZGV2LT5pZmluZGV4OworCXJ0LT5mbC5mbGRfZndtYXJrID0gZmwuZmxkX2Z3bWFyazsKKworCXJ0LT51LmRzdC5mbGFncyA9IERTVF9IT1NUOworCXJ0LT51LmRzdC5uZWlnaGJvdXIgPSBuZWlnaDsKKwlydC0+dS5kc3QuZGV2ID0gb3V0X2RldjsKKwlydC0+dS5kc3QubGFzdHVzZSA9IGppZmZpZXM7CisJcnQtPnUuZHN0Lm91dHB1dCA9IGRuX3J0X2J1ZzsKKwlzd2l0Y2gocmVzLnR5cGUpIHsKKwkJY2FzZSBSVE5fVU5JQ0FTVDoKKwkJCXJ0LT51LmRzdC5pbnB1dCA9IGRuX2ZvcndhcmQ7CisJCQlicmVhazsKKwkJY2FzZSBSVE5fTE9DQUw6CisJCQlydC0+dS5kc3Qub3V0cHV0ID0gZG5fb3V0cHV0OworCQkJcnQtPnUuZHN0LmlucHV0ID0gZG5fbnNwX3J4OworCQkJcnQtPnUuZHN0LmRldiA9IGluX2RldjsKKwkJCWZsYWdzIHw9IFJUQ0ZfTE9DQUw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJY2FzZSBSVE5fVU5SRUFDSEFCTEU6CisJCWNhc2UgUlROX0JMQUNLSE9MRToKKwkJCXJ0LT51LmRzdC5pbnB1dCA9IGRuX2JsYWNraG9sZTsKKwl9CisJcnQtPnJ0X2ZsYWdzID0gZmxhZ3M7CisJaWYgKHJ0LT51LmRzdC5kZXYpCisJCWRldl9ob2xkKHJ0LT51LmRzdC5kZXYpOworCisJZXJyID0gZG5fcnRfc2V0X25leHRfaG9wKHJ0LCAmcmVzKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVfbmVpZ2hib3VyOworCisJaGFzaCA9IGRuX2hhc2gocnQtPmZsLmZsZF9zcmMsIHJ0LT5mbC5mbGRfZHN0KTsKKwlkbl9pbnNlcnRfcm91dGUocnQsIGhhc2gsIChzdHJ1Y3QgZG5fcm91dGUgKiopJnNrYi0+ZHN0KTsKKworZG9uZToKKwlpZiAobmVpZ2gpCisJCW5laWdoX3JlbGVhc2UobmVpZ2gpOworCWlmIChmcmVlX3JlcykKKwkJZG5fZmliX3Jlc19wdXQoJnJlcyk7CisJZGV2X3B1dChpbl9kZXYpOworCWlmIChvdXRfZGV2KQorCQlkZXZfcHV0KG91dF9kZXYpOworb3V0OgorCXJldHVybiBlcnI7CisKK2VfaW52YWw6CisJZXJyID0gLUVJTlZBTDsKKwlnb3RvIGRvbmU7CisKK2Vfbm9idWZzOgorCWVyciA9IC1FTk9CVUZTOworCWdvdG8gZG9uZTsKKworZV9uZWlnaGJvdXI6CisJZHN0X2ZyZWUoJnJ0LT51LmRzdCk7CisJZ290byBkb25lOworfQorCitpbnQgZG5fcm91dGVfaW5wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZG5fcm91dGUgKnJ0OworCXN0cnVjdCBkbl9za2JfY2IgKmNiID0gRE5fU0tCX0NCKHNrYik7CisJdW5zaWduZWQgaGFzaCA9IGRuX2hhc2goY2ItPnNyYywgY2ItPmRzdCk7CisKKwlpZiAoc2tiLT5kc3QpCisJCXJldHVybiAwOworCisJcmN1X3JlYWRfbG9jaygpOworCWZvcihydCA9IHJjdV9kZXJlZmVyZW5jZShkbl9ydF9oYXNoX3RhYmxlW2hhc2hdLmNoYWluKTsgcnQgIT0gTlVMTDsKKwkgICAgcnQgPSByY3VfZGVyZWZlcmVuY2UocnQtPnUucnRfbmV4dCkpIHsKKwkJaWYgKChydC0+ZmwuZmxkX3NyYyA9PSBjYi0+c3JjKSAmJgorCSAJICAgIChydC0+ZmwuZmxkX2RzdCA9PSBjYi0+ZHN0KSAmJgorCQkgICAgKHJ0LT5mbC5vaWYgPT0gMCkgJiYKKyNpZmRlZiBDT05GSUdfREVDTkVUX1JPVVRFX0ZXTUFSSworCQkgICAgKHJ0LT5mbC5mbGRfZndtYXJrID09IHNrYi0+bmZtYXJrKSAmJgorI2VuZGlmCisJCSAgICAocnQtPmZsLmlpZiA9PSBjYi0+aWlmKSkgeworCQkJcnQtPnUuZHN0Lmxhc3R1c2UgPSBqaWZmaWVzOworCQkJZHN0X2hvbGQoJnJ0LT51LmRzdCk7CisJCQlydC0+dS5kc3QuX191c2UrKzsKKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJc2tiLT5kc3QgPSAoc3RydWN0IGRzdF9lbnRyeSAqKXJ0OworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4gZG5fcm91dGVfaW5wdXRfc2xvdyhza2IpOworfQorCitzdGF0aWMgaW50IGRuX3J0X2ZpbGxfaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgcGlkLCB1MzIgc2VxLCBpbnQgZXZlbnQsIGludCBub3dhaXQpCit7CisJc3RydWN0IGRuX3JvdXRlICpydCA9IChzdHJ1Y3QgZG5fcm91dGUgKilza2ItPmRzdDsKKwlzdHJ1Y3QgcnRtc2cgKnI7CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3QgcnRhX2NhY2hlaW5mbyBjaTsKKworCW5saCA9IE5MTVNHX1BVVChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCpyKSk7CisJciA9IE5MTVNHX0RBVEEobmxoKTsKKwlubGgtPm5sbXNnX2ZsYWdzID0gKG5vd2FpdCAmJiBwaWQpID8gTkxNX0ZfTVVMVEkgOiAwOworCXItPnJ0bV9mYW1pbHkgPSBBRl9ERUNuZXQ7CisJci0+cnRtX2RzdF9sZW4gPSAxNjsKKwlyLT5ydG1fc3JjX2xlbiA9IDA7CisJci0+cnRtX3RvcyA9IDA7CisJci0+cnRtX3RhYmxlID0gUlRfVEFCTEVfTUFJTjsKKwlyLT5ydG1fdHlwZSA9IHJ0LT5ydF90eXBlOworCXItPnJ0bV9mbGFncyA9IChydC0+cnRfZmxhZ3MgJiB+MHhGRkZGKSB8IFJUTV9GX0NMT05FRDsKKwlyLT5ydG1fc2NvcGUgPSBSVF9TQ09QRV9VTklWRVJTRTsKKwlyLT5ydG1fcHJvdG9jb2wgPSBSVFBST1RfVU5TUEVDOworCWlmIChydC0+cnRfZmxhZ3MgJiBSVENGX05PVElGWSkKKwkJci0+cnRtX2ZsYWdzIHw9IFJUTV9GX05PVElGWTsKKwlSVEFfUFVUKHNrYiwgUlRBX0RTVCwgMiwgJnJ0LT5ydF9kYWRkcik7CisJaWYgKHJ0LT5mbC5mbGRfc3JjKSB7CisJCXItPnJ0bV9zcmNfbGVuID0gMTY7CisJCVJUQV9QVVQoc2tiLCBSVEFfU1JDLCAyLCAmcnQtPmZsLmZsZF9zcmMpOworCX0KKwlpZiAocnQtPnUuZHN0LmRldikKKwkJUlRBX1BVVChza2IsIFJUQV9PSUYsIHNpemVvZihpbnQpLCAmcnQtPnUuZHN0LmRldi0+aWZpbmRleCk7CisJLyoKKwkgKiBOb3RlIHRvIHNlbGYgLSBjaGFuZ2UgdGhpcyBpZiBpbnB1dCByb3V0ZXMgcmV2ZXJzZSBkaXJlY3Rpb24gd2hlbgorCSAqIHRoZXkgZGVhbCBvbmx5IHdpdGggaW5wdXRzIGFuZCBub3Qgd2l0aCByZXBsaWVzIGxpa2UgdGhleSBkbworCSAqIGN1cnJlbnRseS4KKwkgKi8KKwlSVEFfUFVUKHNrYiwgUlRBX1BSRUZTUkMsIDIsICZydC0+cnRfbG9jYWxfc3JjKTsKKwlpZiAocnQtPnJ0X2RhZGRyICE9IHJ0LT5ydF9nYXRld2F5KQorCQlSVEFfUFVUKHNrYiwgUlRBX0dBVEVXQVksIDIsICZydC0+cnRfZ2F0ZXdheSk7CisJaWYgKHJ0bmV0bGlua19wdXRfbWV0cmljcyhza2IsIHJ0LT51LmRzdC5tZXRyaWNzKSA8IDApCisJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CisJY2kucnRhX2xhc3R1c2UgPSBqaWZmaWVzX3RvX2Nsb2NrX3QoamlmZmllcyAtIHJ0LT51LmRzdC5sYXN0dXNlKTsKKwljaS5ydGFfdXNlZCAgICAgPSBydC0+dS5kc3QuX191c2U7CisJY2kucnRhX2NsbnRyZWYgID0gYXRvbWljX3JlYWQoJnJ0LT51LmRzdC5fX3JlZmNudCk7CisJaWYgKHJ0LT51LmRzdC5leHBpcmVzKQorCQljaS5ydGFfZXhwaXJlcyA9IGppZmZpZXNfdG9fY2xvY2tfdChydC0+dS5kc3QuZXhwaXJlcyAtIGppZmZpZXMpOworCWVsc2UKKwkJY2kucnRhX2V4cGlyZXMgPSAwOworCWNpLnJ0YV9lcnJvciAgICA9IHJ0LT51LmRzdC5lcnJvcjsKKwljaS5ydGFfaWQgICAgICAgPSBjaS5ydGFfdHMgPSBjaS5ydGFfdHNhZ2UgPSAwOworCVJUQV9QVVQoc2tiLCBSVEFfQ0FDSEVJTkZPLCBzaXplb2YoY2kpLCAmY2kpOworCWlmIChydC0+ZmwuaWlmKQorCQlSVEFfUFVUKHNrYiwgUlRBX0lJRiwgc2l6ZW9mKGludCksICZydC0+ZmwuaWlmKTsKKworCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlyZXR1cm4gc2tiLT5sZW47CisKK25sbXNnX2ZhaWx1cmU6CitydGF0dHJfZmFpbHVyZToKKyAgICAgICAgc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKyAgICAgICAgcmV0dXJuIC0xOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgYnkgYm90aCBlbmRub2RlcyBhbmQgcm91dGVycyBub3cuCisgKi8KK2ludCBkbl9jYWNoZV9nZXRyb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBydGF0dHIgKipydGEgPSBhcmc7CisJc3RydWN0IHJ0bXNnICpydG0gPSBOTE1TR19EQVRBKG5saCk7CisJc3RydWN0IGRuX3JvdXRlICpydCA9IE5VTEw7CisJc3RydWN0IGRuX3NrYl9jYiAqY2I7CisJaW50IGVycjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBmbG93aSBmbDsKKworCW1lbXNldCgmZmwsIDAsIHNpemVvZihmbCkpOworCWZsLnByb3RvID0gRE5QUk9UT19OU1A7CisKKwlza2IgPSBhbGxvY19za2IoTkxNU0dfR09PRFNJWkUsIEdGUF9LRVJORUwpOworCWlmIChza2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9CVUZTOworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwljYiA9IEROX1NLQl9DQihza2IpOworCisJaWYgKHJ0YVtSVEFfU1JDLTFdKQorCQltZW1jcHkoJmZsLmZsZF9zcmMsIFJUQV9EQVRBKHJ0YVtSVEFfU1JDLTFdKSwgMik7CisJaWYgKHJ0YVtSVEFfRFNULTFdKQorCQltZW1jcHkoJmZsLmZsZF9kc3QsIFJUQV9EQVRBKHJ0YVtSVEFfRFNULTFdKSwgMik7CisJaWYgKHJ0YVtSVEFfSUlGLTFdKQorCQltZW1jcHkoJmZsLmlpZiwgUlRBX0RBVEEocnRhW1JUQV9JSUYtMV0pLCBzaXplb2YoaW50KSk7CisKKwlpZiAoZmwuaWlmKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJCWlmICgoZGV2ID0gZGV2X2dldF9ieV9pbmRleChmbC5paWYpKSA9PSBOVUxMKSB7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCWlmICghZGV2LT5kbl9wdHIpIHsKKwkJCWRldl9wdXQoZGV2KTsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfRE5BX1JUKTsKKwkJc2tiLT5kZXYgPSBkZXY7CisJCWNiLT5zcmMgPSBmbC5mbGRfc3JjOworCQljYi0+ZHN0ID0gZmwuZmxkX2RzdDsKKwkJbG9jYWxfYmhfZGlzYWJsZSgpOworCQllcnIgPSBkbl9yb3V0ZV9pbnB1dChza2IpOworCQlsb2NhbF9iaF9lbmFibGUoKTsKKwkJbWVtc2V0KGNiLCAwLCBzaXplb2Yoc3RydWN0IGRuX3NrYl9jYikpOworCQlydCA9IChzdHJ1Y3QgZG5fcm91dGUgKilza2ItPmRzdDsKKwkJaWYgKCFlcnIgJiYgLXJ0LT51LmRzdC5lcnJvcikKKwkJCWVyciA9IHJ0LT51LmRzdC5lcnJvcjsKKwl9IGVsc2UgeworCQlpbnQgb2lmID0gMDsKKwkJaWYgKHJ0YVtSVEFfT0lGIC0gMV0pCisJCQltZW1jcHkoJm9pZiwgUlRBX0RBVEEocnRhW1JUQV9PSUYgLSAxXSksIHNpemVvZihpbnQpKTsKKwkJZmwub2lmID0gb2lmOworCQllcnIgPSBkbl9yb3V0ZV9vdXRwdXRfa2V5KChzdHJ1Y3QgZHN0X2VudHJ5ICoqKSZydCwgJmZsLCAwKTsKKwl9CisKKwlpZiAoc2tiLT5kZXYpCisJCWRldl9wdXQoc2tiLT5kZXYpOworCXNrYi0+ZGV2ID0gTlVMTDsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlOworCXNrYi0+ZHN0ID0gJnJ0LT51LmRzdDsKKwlpZiAocnRtLT5ydG1fZmxhZ3MgJiBSVE1fRl9OT1RJRlkpCisJCXJ0LT5ydF9mbGFncyB8PSBSVENGX05PVElGWTsKKworCU5FVExJTktfQ0Ioc2tiKS5kc3RfcGlkID0gTkVUTElOS19DQihpbl9za2IpLnBpZDsKKworCWVyciA9IGRuX3J0X2ZpbGxfaW5mbyhza2IsIE5FVExJTktfQ0IoaW5fc2tiKS5waWQsIG5saC0+bmxtc2dfc2VxLCBSVE1fTkVXUk9VVEUsIDApOworCisJaWYgKGVyciA9PSAwKQorCQlnb3RvIG91dF9mcmVlOworCWlmIChlcnIgPCAwKSB7CisJCWVyciA9IC1FTVNHU0laRTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwllcnIgPSBuZXRsaW5rX3VuaWNhc3QocnRubCwgc2tiLCBORVRMSU5LX0NCKGluX3NrYikucGlkLCBNU0dfRE9OVFdBSVQpOworCisJcmV0dXJuIGVycjsKKworb3V0X2ZyZWU6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIEZvciByb3V0ZXJzLCB0aGlzIGlzIGNhbGxlZCBmcm9tIGRuX2ZpYl9kdW1wLCBidXQgZm9yIGVuZG5vZGVzIGl0cworICogY2FsbGVkIGRpcmVjdGx5IGZyb20gdGhlIHJ0bmV0bGluayBkaXNwYXRjaCB0YWJsZS4KKyAqLworaW50IGRuX2NhY2hlX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXN0cnVjdCBkbl9yb3V0ZSAqcnQ7CisJaW50IGgsIHNfaDsKKwlpbnQgaWR4LCBzX2lkeDsKKworCWlmIChOTE1TR19QQVlMT0FEKGNiLT5ubGgsIDApIDwgc2l6ZW9mKHN0cnVjdCBydG1zZykpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghKCgoc3RydWN0IHJ0bXNnICopTkxNU0dfREFUQShjYi0+bmxoKSktPnJ0bV9mbGFncyZSVE1fRl9DTE9ORUQpKQorCQlyZXR1cm4gMDsKKworCXNfaCA9IGNiLT5hcmdzWzBdOworCXNfaWR4ID0gaWR4ID0gY2ItPmFyZ3NbMV07CisJZm9yKGggPSAwOyBoIDw9IGRuX3J0X2hhc2hfbWFzazsgaCsrKSB7CisJCWlmIChoIDwgc19oKQorCQkJY29udGludWU7CisJCWlmIChoID4gc19oKQorCQkJc19pZHggPSAwOworCQlyY3VfcmVhZF9sb2NrX2JoKCk7CisJCWZvcihydCA9IHJjdV9kZXJlZmVyZW5jZShkbl9ydF9oYXNoX3RhYmxlW2hdLmNoYWluKSwgaWR4ID0gMDsKKwkJCXJ0OworCQkJcnQgPSByY3VfZGVyZWZlcmVuY2UocnQtPnUucnRfbmV4dCksIGlkeCsrKSB7CisJCQlpZiAoaWR4IDwgc19pZHgpCisJCQkJY29udGludWU7CisJCQlza2ItPmRzdCA9IGRzdF9jbG9uZSgmcnQtPnUuZHN0KTsKKwkJCWlmIChkbl9ydF9maWxsX2luZm8oc2tiLCBORVRMSU5LX0NCKGNiLT5za2IpLnBpZCwKKwkJCQkJY2ItPm5saC0+bmxtc2dfc2VxLCBSVE1fTkVXUk9VVEUsIDEpIDw9IDApIHsKKwkJCQlkc3RfcmVsZWFzZSh4Y2hnKCZza2ItPmRzdCwgTlVMTCkpOworCQkJCXJjdV9yZWFkX3VubG9ja19iaCgpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCWRzdF9yZWxlYXNlKHhjaGcoJnNrYi0+ZHN0LCBOVUxMKSk7CisJCX0KKwkJcmN1X3JlYWRfdW5sb2NrX2JoKCk7CisJfQorCitkb25lOgorCWNiLT5hcmdzWzBdID0gaDsKKwljYi0+YXJnc1sxXSA9IGlkeDsKKwlyZXR1cm4gc2tiLT5sZW47Cit9CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RydWN0IGRuX3J0X2NhY2hlX2l0ZXJfc3RhdGUgeworCWludCBidWNrZXQ7Cit9OworCitzdGF0aWMgc3RydWN0IGRuX3JvdXRlICpkbl9ydF9jYWNoZV9nZXRfZmlyc3Qoc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc3RydWN0IGRuX3JvdXRlICpydCA9IE5VTEw7CisJc3RydWN0IGRuX3J0X2NhY2hlX2l0ZXJfc3RhdGUgKnMgPSBzZXEtPnByaXZhdGU7CisKKwlmb3Iocy0+YnVja2V0ID0gZG5fcnRfaGFzaF9tYXNrOyBzLT5idWNrZXQgPj0gMDsgLS1zLT5idWNrZXQpIHsKKwkJcmN1X3JlYWRfbG9ja19iaCgpOworCQlydCA9IGRuX3J0X2hhc2hfdGFibGVbcy0+YnVja2V0XS5jaGFpbjsKKwkJaWYgKHJ0KQorCQkJYnJlYWs7CisJCXJjdV9yZWFkX3VubG9ja19iaCgpOworCX0KKwlyZXR1cm4gcnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG5fcm91dGUgKmRuX3J0X2NhY2hlX2dldF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgZG5fcm91dGUgKnJ0KQoreworCXN0cnVjdCBkbl9ydF9jYWNoZV9pdGVyX3N0YXRlICpzID0gcmN1X2RlcmVmZXJlbmNlKHNlcS0+cHJpdmF0ZSk7CisKKwlydCA9IHJ0LT51LnJ0X25leHQ7CisJd2hpbGUoIXJ0KSB7CisJCXJjdV9yZWFkX3VubG9ja19iaCgpOworCQlpZiAoLS1zLT5idWNrZXQgPCAwKQorCQkJYnJlYWs7CisJCXJjdV9yZWFkX2xvY2tfYmgoKTsKKwkJcnQgPSBkbl9ydF9oYXNoX3RhYmxlW3MtPmJ1Y2tldF0uY2hhaW47CisJfQorCXJldHVybiBydDsKK30KKworc3RhdGljIHZvaWQgKmRuX3J0X2NhY2hlX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGRuX3JvdXRlICpydCA9IGRuX3J0X2NhY2hlX2dldF9maXJzdChzZXEpOworCisJaWYgKHJ0KSB7CisJCXdoaWxlKCpwb3MgJiYgKHJ0ID0gZG5fcnRfY2FjaGVfZ2V0X25leHQoc2VxLCBydCkpKQorCQkJLS0qcG9zOworCX0KKwlyZXR1cm4gKnBvcyA/IE5VTEwgOiBydDsKK30KKworc3RhdGljIHZvaWQgKmRuX3J0X2NhY2hlX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgZG5fcm91dGUgKnJ0ID0gZG5fcnRfY2FjaGVfZ2V0X25leHQoc2VxLCB2KTsKKwkrKypwb3M7CisJcmV0dXJuIHJ0OworfQorCitzdGF0aWMgdm9pZCBkbl9ydF9jYWNoZV9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpZiAodikKKwkJcmN1X3JlYWRfdW5sb2NrX2JoKCk7Cit9CisKK3N0YXRpYyBpbnQgZG5fcnRfY2FjaGVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IGRuX3JvdXRlICpydCA9IHY7CisJY2hhciBidWYxW0ROX0FTQ0JVRl9MRU5dLCBidWYyW0ROX0FTQ0JVRl9MRU5dOworCisJc2VxX3ByaW50ZihzZXEsICIlLThzICUtN3MgJS03cyAlMDRkICUwNGQgJTA0ZFxuIiwKKwkJCXJ0LT51LmRzdC5kZXYgPyBydC0+dS5kc3QuZGV2LT5uYW1lIDogIioiLAorCQkJZG5fYWRkcjJhc2MoZG5fbnRvaHMocnQtPnJ0X2RhZGRyKSwgYnVmMSksCisJCQlkbl9hZGRyMmFzYyhkbl9udG9ocyhydC0+cnRfc2FkZHIpLCBidWYyKSwKKwkJCWF0b21pY19yZWFkKCZydC0+dS5kc3QuX19yZWZjbnQpLAorCQkJcnQtPnUuZHN0Ll9fdXNlLAorCQkJKGludCkgZHN0X21ldHJpYygmcnQtPnUuZHN0LCBSVEFYX1JUVCkpOworCXJldHVybiAwOworfSAKKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBkbl9ydF9jYWNoZV9zZXFfb3BzID0geworCS5zdGFydAk9IGRuX3J0X2NhY2hlX3NlcV9zdGFydCwKKwkubmV4dAk9IGRuX3J0X2NhY2hlX3NlcV9uZXh0LAorCS5zdG9wCT0gZG5fcnRfY2FjaGVfc2VxX3N0b3AsCisJLnNob3cJPSBkbl9ydF9jYWNoZV9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgZG5fcnRfY2FjaGVfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNlcV9maWxlICpzZXE7CisJaW50IHJjID0gLUVOT01FTTsKKwlzdHJ1Y3QgZG5fcnRfY2FjaGVfaXRlcl9zdGF0ZSAqcyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXMpCisJCWdvdG8gb3V0OworCXJjID0gc2VxX29wZW4oZmlsZSwgJmRuX3J0X2NhY2hlX3NlcV9vcHMpOworCWlmIChyYykKKwkJZ290byBvdXRfa2ZyZWU7CisJc2VxCQk9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzZXEtPnByaXZhdGUJPSBzOworCW1lbXNldChzLCAwLCBzaXplb2YoKnMpKTsKK291dDoKKwlyZXR1cm4gcmM7CitvdXRfa2ZyZWU6CisJa2ZyZWUocyk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRuX3J0X2NhY2hlX3NlcV9mb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkub3BlbgkgPSBkbl9ydF9jYWNoZV9zZXFfb3BlbiwKKwkucmVhZAkgPSBzZXFfcmVhZCwKKwkubGxzZWVrCSA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlX3ByaXZhdGUsCit9OworCisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKwordm9pZCBfX2luaXQgZG5fcm91dGVfaW5pdCh2b2lkKQoreworCWludCBpLCBnb2FsLCBvcmRlcjsKKworCWRuX2RzdF9vcHMua21lbV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiZG5fZHN0X2NhY2hlIiwKKwkJCQkJCSAgIHNpemVvZihzdHJ1Y3QgZG5fcm91dGUpLAorCQkJCQkJICAgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOLAorCQkJCQkJICAgTlVMTCwgTlVMTCk7CisKKwlpZiAoIWRuX2RzdF9vcHMua21lbV9jYWNoZXApCisJCXBhbmljKCJERUNuZXQ6IEZhaWxlZCB0byBhbGxvY2F0ZSBkbl9kc3RfY2FjaGVcbiIpOworCisJaW5pdF90aW1lcigmZG5fcm91dGVfdGltZXIpOworCWRuX3JvdXRlX3RpbWVyLmZ1bmN0aW9uID0gZG5fZHN0X2NoZWNrX2V4cGlyZTsKKwlkbl9yb3V0ZV90aW1lci5leHBpcmVzID0gamlmZmllcyArIGRlY25ldF9kc3RfZ2NfaW50ZXJ2YWwgKiBIWjsKKwlhZGRfdGltZXIoJmRuX3JvdXRlX3RpbWVyKTsKKworCWdvYWwgPSBudW1fcGh5c3BhZ2VzID4+ICgyNiAtIFBBR0VfU0hJRlQpOworCisJZm9yKG9yZGVyID0gMDsgKDFVTCA8PCBvcmRlcikgPCBnb2FsOyBvcmRlcisrKQorCQkvKiBOT1RISU5HICovOworCisgICAgICAgIC8qCisgICAgICAgICAqIE9ubHkgd2FudCAxMDI0IGVudHJpZXMgbWF4LCBzaW5jZSB0aGUgdGFibGUgaXMgdmVyeSwgdmVyeSB1bmxpa2VseQorICAgICAgICAgKiB0byBiZSBsYXJnZXIgdGhhbiB0aGF0LgorICAgICAgICAgKi8KKyAgICAgICAgd2hpbGUob3JkZXIgJiYgKCgoKDFVTCA8PCBvcmRlcikgKiBQQUdFX1NJWkUpIC8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgZG5fcnRfaGFzaF9idWNrZXQpKSA+PSAyMDQ4KSkKKyAgICAgICAgICAgICAgICBvcmRlci0tOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBkbl9ydF9oYXNoX21hc2sgPSAoMVVMIDw8IG9yZGVyKSAqIFBBR0VfU0laRSAvCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGRuX3J0X2hhc2hfYnVja2V0KTsKKyAgICAgICAgICAgICAgICB3aGlsZShkbl9ydF9oYXNoX21hc2sgJiAoZG5fcnRfaGFzaF9tYXNrIC0gMSkpCisgICAgICAgICAgICAgICAgICAgICAgICBkbl9ydF9oYXNoX21hc2stLTsKKyAgICAgICAgICAgICAgICBkbl9ydF9oYXNoX3RhYmxlID0gKHN0cnVjdCBkbl9ydF9oYXNoX2J1Y2tldCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgX19nZXRfZnJlZV9wYWdlcyhHRlBfQVRPTUlDLCBvcmRlcik7CisgICAgICAgIH0gd2hpbGUgKGRuX3J0X2hhc2hfdGFibGUgPT0gTlVMTCAmJiAtLW9yZGVyID4gMCk7CisKKwlpZiAoIWRuX3J0X2hhc2hfdGFibGUpCisgICAgICAgICAgICAgICAgcGFuaWMoIkZhaWxlZCB0byBhbGxvY2F0ZSBERUNuZXQgcm91dGUgY2FjaGUgaGFzaCB0YWJsZVxuIik7CisKKwlwcmludGsoS0VSTl9JTkZPIAorCQkiREVDbmV0OiBSb3V0aW5nIGNhY2hlIGhhc2ggdGFibGUgb2YgJXUgYnVja2V0cywgJWxkS2J5dGVzXG4iLCAKKwkJZG5fcnRfaGFzaF9tYXNrLCAKKwkJKGxvbmcpKGRuX3J0X2hhc2hfbWFzaypzaXplb2Yoc3RydWN0IGRuX3J0X2hhc2hfYnVja2V0KSkvMTAyNCk7CisKKwlkbl9ydF9oYXNoX21hc2stLTsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDw9IGRuX3J0X2hhc2hfbWFzazsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2luaXQoJmRuX3J0X2hhc2hfdGFibGVbaV0ubG9jayk7CisgICAgICAgICAgICAgICAgZG5fcnRfaGFzaF90YWJsZVtpXS5jaGFpbiA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBkbl9kc3Rfb3BzLmdjX3RocmVzaCA9IChkbl9ydF9oYXNoX21hc2sgKyAxKTsKKworCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJkZWNuZXRfY2FjaGUiLCBTX0lSVUdPLCAmZG5fcnRfY2FjaGVfc2VxX2ZvcHMpOworfQorCit2b2lkIF9fZXhpdCBkbl9yb3V0ZV9jbGVhbnVwKHZvaWQpCit7CisJZGVsX3RpbWVyKCZkbl9yb3V0ZV90aW1lcik7CisJZG5fcnVuX2ZsdXNoKDApOworCisJcHJvY19uZXRfcmVtb3ZlKCJkZWNuZXRfY2FjaGUiKTsKK30KKwpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl9ydWxlcy5jIGIvbmV0L2RlY25ldC9kbl9ydWxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NzU4N2QKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvZGVjbmV0L2RuX3J1bGVzLmMKQEAgLTAsMCArMSw0MTYgQEAKKworLyoKKyAqIERFQ25ldCAgICAgICBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgREVDbmV0IHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqICAgICAgICAgICAgICBvcGVyYXRpbmcgc3lzdGVtLiAgREVDbmV0IGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICogICAgICAgICAgICAgIGludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqICAgICAgICAgICAgICBERUNuZXQgUm91dGluZyBGb3J3YXJkaW5nIEluZm9ybWF0aW9uIEJhc2UgKFJ1bGVzKQorICoKKyAqIEF1dGhvcjogICAgICBTdGV2ZSBXaGl0ZWhvdXNlIDxTdGV2ZVdAQUNNLm9yZz4KKyAqICAgICAgICAgICAgICBNb3N0bHkgY29waWVkIGZyb20gQWxleGV5IEt1em5ldHNvdidzIGlwdjQvZmliX3J1bGVzLmMKKyAqCisgKgorICogQ2hhbmdlczoKKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luX3JvdXRlLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bmV0L25laWdoYm91ci5oPgorI2luY2x1ZGUgPG5ldC9kc3QuaD4KKyNpbmNsdWRlIDxuZXQvZmxvdy5oPgorI2luY2x1ZGUgPG5ldC9kbi5oPgorI2luY2x1ZGUgPG5ldC9kbl9maWIuaD4KKyNpbmNsdWRlIDxuZXQvZG5fbmVpZ2guaD4KKyNpbmNsdWRlIDxuZXQvZG5fZGV2Lmg+CisKK3N0cnVjdCBkbl9maWJfcnVsZQoreworCXN0cnVjdCBkbl9maWJfcnVsZQkqcl9uZXh0OworCWF0b21pY190CQlyX2NsbnRyZWY7CisJdTMyCQkJcl9wcmVmZXJlbmNlOworCXVuc2lnbmVkIGNoYXIJCXJfdGFibGU7CisJdW5zaWduZWQgY2hhcgkJcl9hY3Rpb247CisJdW5zaWduZWQgY2hhcgkJcl9kc3RfbGVuOworCXVuc2lnbmVkIGNoYXIJCXJfc3JjX2xlbjsKKwlkbl9hZGRyZXNzCQlyX3NyYzsKKwlkbl9hZGRyZXNzCQlyX3NyY21hc2s7CisJZG5fYWRkcmVzcwkJcl9kc3Q7CisJZG5fYWRkcmVzcwkJcl9kc3RtYXNrOworCWRuX2FkZHJlc3MJCXJfc3JjbWFwOworCXU4CQkJcl9mbGFnczsKKyNpZmRlZiBDT05GSUdfREVDTkVUX1JPVVRFX0ZXTUFSSworCXUzMgkJCXJfZndtYXJrOworI2VuZGlmCisJaW50CQkJcl9pZmluZGV4OworCWNoYXIJCQlyX2lmbmFtZVtJRk5BTVNJWl07CisJaW50CQkJcl9kZWFkOworfTsKKworc3RhdGljIHN0cnVjdCBkbl9maWJfcnVsZSBkZWZhdWx0X3J1bGUgPSB7CisJLnJfY2xudHJlZiA9CQlBVE9NSUNfSU5JVCgyKSwKKwkucl9wcmVmZXJlbmNlID0JCTB4N2ZmZiwKKwkucl90YWJsZSA9CQlSVF9UQUJMRV9NQUlOLAorCS5yX2FjdGlvbiA9CQlSVE5fVU5JQ0FTVAorfTsKKworc3RhdGljIHN0cnVjdCBkbl9maWJfcnVsZSAqZG5fZmliX3J1bGVzID0gJmRlZmF1bHRfcnVsZTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKGRuX2ZpYl9ydWxlc19sb2NrKTsKKworCitpbnQgZG5fZmliX3J0bV9kZWxydWxlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpCit7CisJc3RydWN0IHJ0YXR0ciAqKnJ0YSA9IGFyZzsKKwlzdHJ1Y3QgcnRtc2cgKnJ0bSA9IE5MTVNHX0RBVEEobmxoKTsKKwlzdHJ1Y3QgZG5fZmliX3J1bGUgKnIsICoqcnA7CisJaW50IGVyciA9IC1FU1JDSDsKKworCWZvcihycD0mZG5fZmliX3J1bGVzOyAocj0qcnApICE9IE5VTEw7IHJwID0gJnItPnJfbmV4dCkgeworCQlpZiAoKCFydGFbUlRBX1NSQy0xXSB8fCBtZW1jbXAoUlRBX0RBVEEocnRhW1JUQV9TUkMtMV0pLCAmci0+cl9zcmMsIDIpID09IDApICYmCisJCQlydG0tPnJ0bV9zcmNfbGVuID09IHItPnJfc3JjX2xlbiAmJgorCQkJcnRtLT5ydG1fZHN0X2xlbiA9PSByLT5yX2RzdF9sZW4gJiYKKwkJCSghcnRhW1JUQV9EU1QtMV0gfHwgbWVtY21wKFJUQV9EQVRBKHJ0YVtSVEFfRFNULTFdKSwgJnItPnJfZHN0LCAyKSA9PSAwKSAmJgorI2lmZGVmIENPTkZJR19ERUNORVRfUk9VVEVfRldNQVJLCisJCQkoIXJ0YVtSVEFfUFJPVE9JTkZPLTFdIHx8IG1lbWNtcChSVEFfREFUQShydGFbUlRBX1BST1RPSU5GTy0xXSksICZyLT5yX2Z3bWFyaywgNCkgPT0gMCkgJiYKKyNlbmRpZgorCQkJKCFydG0tPnJ0bV90eXBlIHx8IHJ0bS0+cnRtX3R5cGUgPT0gci0+cl9hY3Rpb24pICYmCisJCQkoIXJ0YVtSVEFfUFJJT1JJVFktMV0gfHwgbWVtY21wKFJUQV9EQVRBKHJ0YVtSVEFfUFJJT1JJVFktMV0pLCAmci0+cl9wcmVmZXJlbmNlLCA0KSA9PSAwKSAmJgorCQkJKCFydGFbUlRBX0lJRi0xXSB8fCBydGF0dHJfc3RyY21wKHJ0YVtSVEFfSUlGLTFdLCByLT5yX2lmbmFtZSkgPT0gMCkgJiYKKwkJCSghcnRtLT5ydG1fdGFibGUgfHwgKHIgJiYgcnRtLT5ydG1fdGFibGUgPT0gci0+cl90YWJsZSkpKSB7CisKKwkJCWVyciA9IC1FUEVSTTsKKwkJCWlmIChyID09ICZkZWZhdWx0X3J1bGUpCisJCQkJYnJlYWs7CisKKwkJCXdyaXRlX2xvY2tfYmgoJmRuX2ZpYl9ydWxlc19sb2NrKTsKKwkJCSpycCA9IHItPnJfbmV4dDsKKwkJCXItPnJfZGVhZCA9IDE7CisJCQl3cml0ZV91bmxvY2tfYmgoJmRuX2ZpYl9ydWxlc19sb2NrKTsKKwkJCWRuX2ZpYl9ydWxlX3B1dChyKTsKKwkJCWVyciA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgZG5fZmliX3J1bGVfcHV0KHN0cnVjdCBkbl9maWJfcnVsZSAqcikKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmci0+cl9jbG50cmVmKSkgeworCQlpZiAoci0+cl9kZWFkKQorCQkJa2ZyZWUocik7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0RFQlVHICJBdHRlbXB0IHRvIGZyZWUgYWxpdmUgZG5fZmliX3J1bGVcbiIpOworCX0KK30KKworCitpbnQgZG5fZmliX3J0bV9uZXdydWxlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpCit7CisJc3RydWN0IHJ0YXR0ciAqKnJ0YSA9IGFyZzsKKwlzdHJ1Y3QgcnRtc2cgKnJ0bSA9IE5MTVNHX0RBVEEobmxoKTsKKwlzdHJ1Y3QgZG5fZmliX3J1bGUgKnIsICpuZXdfciwgKipycDsKKwl1bnNpZ25lZCBjaGFyIHRhYmxlX2lkOworCisJaWYgKHJ0bS0+cnRtX3NyY19sZW4gPiAxNiB8fCBydG0tPnJ0bV9kc3RfbGVuID4gMTYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHJ0YVtSVEFfSUlGLTFdICYmIFJUQV9QQVlMT0FEKHJ0YVtSVEFfSUlGLTFdKSA+IElGTkFNU0laKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChydG0tPnJ0bV90eXBlID09IFJUTl9OQVQpCisJCXJldHVybiAtRUlOVkFMOworCisJdGFibGVfaWQgPSBydG0tPnJ0bV90YWJsZTsKKwlpZiAodGFibGVfaWQgPT0gUlRfVEFCTEVfVU5TUEVDKSB7CisJCXN0cnVjdCBkbl9maWJfdGFibGUgKnRiOworCQlpZiAocnRtLT5ydG1fdHlwZSA9PSBSVE5fVU5JQ0FTVCkgeworCQkJaWYgKCh0YiA9IGRuX2ZpYl9lbXB0eV90YWJsZSgpKSA9PSBOVUxMKQorCQkJCXJldHVybiAtRU5PQlVGUzsKKwkJCXRhYmxlX2lkID0gdGItPm47CisJCX0KKwl9CisKKwluZXdfciA9IGttYWxsb2Moc2l6ZW9mKCpuZXdfciksIEdGUF9LRVJORUwpOworCWlmICghbmV3X3IpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChuZXdfciwgMCwgc2l6ZW9mKCpuZXdfcikpOworCWlmIChydGFbUlRBX1NSQy0xXSkKKwkJbWVtY3B5KCZuZXdfci0+cl9zcmMsIFJUQV9EQVRBKHJ0YVtSVEFfU1JDLTFdKSwgMik7CisJaWYgKHJ0YVtSVEFfRFNULTFdKQorCQltZW1jcHkoJm5ld19yLT5yX2RzdCwgUlRBX0RBVEEocnRhW1JUQV9EU1QtMV0pLCAyKTsKKwlpZiAocnRhW1JUQV9HQVRFV0FZLTFdKQorCQltZW1jcHkoJm5ld19yLT5yX3NyY21hcCwgUlRBX0RBVEEocnRhW1JUQV9HQVRFV0FZLTFdKSwgMik7CisJbmV3X3ItPnJfc3JjX2xlbiA9IHJ0bS0+cnRtX3NyY19sZW47CisJbmV3X3ItPnJfZHN0X2xlbiA9IHJ0bS0+cnRtX2RzdF9sZW47CisJbmV3X3ItPnJfc3JjbWFzayA9IGRuZXRfbWFrZV9tYXNrKHJ0bS0+cnRtX3NyY19sZW4pOworCW5ld19yLT5yX2RzdG1hc2sgPSBkbmV0X21ha2VfbWFzayhydG0tPnJ0bV9kc3RfbGVuKTsKKyNpZmRlZiBDT05GSUdfREVDTkVUX1JPVVRFX0ZXTUFSSworCWlmIChydGFbUlRBX1BST1RPSU5GTy0xXSkKKwkJbWVtY3B5KCZuZXdfci0+cl9md21hcmssIFJUQV9EQVRBKHJ0YVtSVEFfUFJPVE9JTkZPLTFdKSwgNCk7CisjZW5kaWYKKwluZXdfci0+cl9hY3Rpb24gPSBydG0tPnJ0bV90eXBlOworCW5ld19yLT5yX2ZsYWdzID0gcnRtLT5ydG1fZmxhZ3M7CisJaWYgKHJ0YVtSVEFfUFJJT1JJVFktMV0pCisJCW1lbWNweSgmbmV3X3ItPnJfcHJlZmVyZW5jZSwgUlRBX0RBVEEocnRhW1JUQV9QUklPUklUWS0xXSksIDQpOworCW5ld19yLT5yX3RhYmxlID0gdGFibGVfaWQ7CisJaWYgKHJ0YVtSVEFfSUlGLTFdKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJCXJ0YXR0cl9zdHJsY3B5KG5ld19yLT5yX2lmbmFtZSwgcnRhW1JUQV9JSUYtMV0sIElGTkFNU0laKTsKKwkJbmV3X3ItPnJfaWZpbmRleCA9IC0xOworCQlkZXYgPSBkZXZfZ2V0X2J5X25hbWUobmV3X3ItPnJfaWZuYW1lKTsKKwkJaWYgKGRldikgeworCQkJbmV3X3ItPnJfaWZpbmRleCA9IGRldi0+aWZpbmRleDsKKwkJCWRldl9wdXQoZGV2KTsKKwkJfQorCX0KKworCXJwID0gJmRuX2ZpYl9ydWxlczsKKwlpZiAoIW5ld19yLT5yX3ByZWZlcmVuY2UpIHsKKwkJciA9IGRuX2ZpYl9ydWxlczsKKwkJaWYgKHIgJiYgKHIgPSByLT5yX25leHQpICE9IE5VTEwpIHsKKwkJCXJwID0gJmRuX2ZpYl9ydWxlcy0+cl9uZXh0OworCQkJaWYgKHItPnJfcHJlZmVyZW5jZSkKKwkJCQluZXdfci0+cl9wcmVmZXJlbmNlID0gci0+cl9wcmVmZXJlbmNlIC0gMTsKKwkJfQorCX0KKworCXdoaWxlKChyPSpycCkgIT0gTlVMTCkgeworCQlpZiAoci0+cl9wcmVmZXJlbmNlID4gbmV3X3ItPnJfcHJlZmVyZW5jZSkKKwkJCWJyZWFrOworCQlycCA9ICZyLT5yX25leHQ7CisJfQorCisJbmV3X3ItPnJfbmV4dCA9IHI7CisJYXRvbWljX2luYygmbmV3X3ItPnJfY2xudHJlZik7CisJd3JpdGVfbG9ja19iaCgmZG5fZmliX3J1bGVzX2xvY2spOworCSpycCA9IG5ld19yOworCXdyaXRlX3VubG9ja19iaCgmZG5fZmliX3J1bGVzX2xvY2spOworCXJldHVybiAwOworfQorCisKK2ludCBkbl9maWJfbG9va3VwKGNvbnN0IHN0cnVjdCBmbG93aSAqZmxwLCBzdHJ1Y3QgZG5fZmliX3JlcyAqcmVzKQoreworCXN0cnVjdCBkbl9maWJfcnVsZSAqciwgKnBvbGljeTsKKwlzdHJ1Y3QgZG5fZmliX3RhYmxlICp0YjsKKwlkbl9hZGRyZXNzIHNhZGRyID0gZmxwLT5mbGRfc3JjOworCWRuX2FkZHJlc3MgZGFkZHIgPSBmbHAtPmZsZF9kc3Q7CisJaW50IGVycjsKKworCXJlYWRfbG9jaygmZG5fZmliX3J1bGVzX2xvY2spOworCWZvcihyID0gZG5fZmliX3J1bGVzOyByOyByID0gci0+cl9uZXh0KSB7CisJCWlmICgoKHNhZGRyXnItPnJfc3JjKSAmIHItPnJfc3JjbWFzaykgfHwKKwkJICAgICgoZGFkZHJeci0+cl9kc3QpICYgci0+cl9kc3RtYXNrKSB8fAorI2lmZGVmIENPTkZJR19ERUNORVRfUk9VVEVfRldNQVJLCisJCSAgICAoci0+cl9md21hcmsgJiYgci0+cl9md21hcmsgIT0gZmxwLT5mbGRfZndtYXJrKSB8fAorI2VuZGlmCisJCSAgICAoci0+cl9pZmluZGV4ICYmIHItPnJfaWZpbmRleCAhPSBmbHAtPmlpZikpCisJCQljb250aW51ZTsKKworCQlzd2l0Y2goci0+cl9hY3Rpb24pIHsKKwkJCWNhc2UgUlROX1VOSUNBU1Q6CisJCQljYXNlIFJUTl9OQVQ6CisJCQkJcG9saWN5ID0gcjsKKwkJCQlicmVhazsKKwkJCWNhc2UgUlROX1VOUkVBQ0hBQkxFOgorCQkJCXJlYWRfdW5sb2NrKCZkbl9maWJfcnVsZXNfbG9jayk7CisJCQkJcmV0dXJuIC1FTkVUVU5SRUFDSDsKKwkJCWRlZmF1bHQ6CisJCQljYXNlIFJUTl9CTEFDS0hPTEU6CisJCQkJcmVhZF91bmxvY2soJmRuX2ZpYl9ydWxlc19sb2NrKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWNhc2UgUlROX1BST0hJQklUOgorCQkJCXJlYWRfdW5sb2NrKCZkbl9maWJfcnVsZXNfbG9jayk7CisJCQkJcmV0dXJuIC1FQUNDRVM7CisJCX0KKworCQlpZiAoKHRiID0gZG5fZmliX2dldF90YWJsZShyLT5yX3RhYmxlLCAwKSkgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQllcnIgPSB0Yi0+bG9va3VwKHRiLCBmbHAsIHJlcyk7CisJCWlmIChlcnIgPT0gMCkgeworCQkJcmVzLT5yID0gcG9saWN5OworCQkJaWYgKHBvbGljeSkKKwkJCQlhdG9taWNfaW5jKCZwb2xpY3ktPnJfY2xudHJlZik7CisJCQlyZWFkX3VubG9jaygmZG5fZmliX3J1bGVzX2xvY2spOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGVyciA8IDAgJiYgZXJyICE9IC1FQUdBSU4pIHsKKwkJCXJlYWRfdW5sb2NrKCZkbl9maWJfcnVsZXNfbG9jayk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJcmVhZF91bmxvY2soJmRuX2ZpYl9ydWxlc19sb2NrKTsKKwlyZXR1cm4gLUVTUkNIOworfQorCit1bnNpZ25lZCBkbmV0X2FkZHJfdHlwZShfX3UxNiBhZGRyKQoreworCXN0cnVjdCBmbG93aSBmbCA9IHsgLm5sX3UgPSB7IC5kbl91ID0geyAuZGFkZHIgPSBhZGRyIH0gfSB9OworCXN0cnVjdCBkbl9maWJfcmVzIHJlczsKKwl1bnNpZ25lZCByZXQgPSBSVE5fVU5JQ0FTVDsKKwlzdHJ1Y3QgZG5fZmliX3RhYmxlICp0YiA9IGRuX2ZpYl90YWJsZXNbUlRfVEFCTEVfTE9DQUxdOworCisJcmVzLnIgPSBOVUxMOworCisJaWYgKHRiKSB7CisJCWlmICghdGItPmxvb2t1cCh0YiwgJmZsLCAmcmVzKSkgeworCQkJcmV0ID0gcmVzLnR5cGU7CisJCQlkbl9maWJfcmVzX3B1dCgmcmVzKTsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitfX3UxNiBkbl9maWJfcnVsZXNfcG9saWN5KF9fdTE2IHNhZGRyLCBzdHJ1Y3QgZG5fZmliX3JlcyAqcmVzLCB1bnNpZ25lZCAqZmxhZ3MpCit7CisJc3RydWN0IGRuX2ZpYl9ydWxlICpyID0gcmVzLT5yOworCisJaWYgKHItPnJfYWN0aW9uID09IFJUTl9OQVQpIHsKKwkJaW50IGFkZHJ0eXBlID0gZG5ldF9hZGRyX3R5cGUoci0+cl9zcmNtYXApOworCisJCWlmIChhZGRydHlwZSA9PSBSVE5fTkFUKSB7CisJCQlzYWRkciA9IChzYWRkciZ+ci0+cl9zcmNtYXNrKXxyLT5yX3NyY21hcDsKKwkJCSpmbGFncyB8PSBSVENGX1NOQVQ7CisJCX0gZWxzZSBpZiAoYWRkcnR5cGUgPT0gUlROX0xPQ0FMIHx8IHItPnJfc3JjbWFwID09IDApIHsKKwkJCXNhZGRyID0gci0+cl9zcmNtYXA7CisJCQkqZmxhZ3MgfD0gUlRDRl9NQVNROworCQl9CisJfQorCXJldHVybiBzYWRkcjsKK30KKworc3RhdGljIHZvaWQgZG5fZmliX3J1bGVzX2RldGFjaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkbl9maWJfcnVsZSAqcjsKKworCWZvcihyID0gZG5fZmliX3J1bGVzOyByOyByID0gci0+cl9uZXh0KSB7CisJCWlmIChyLT5yX2lmaW5kZXggPT0gZGV2LT5pZmluZGV4KSB7CisJCQl3cml0ZV9sb2NrX2JoKCZkbl9maWJfcnVsZXNfbG9jayk7CisJCQlyLT5yX2lmaW5kZXggPSAtMTsKKwkJCXdyaXRlX3VubG9ja19iaCgmZG5fZmliX3J1bGVzX2xvY2spOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBkbl9maWJfcnVsZXNfYXR0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRuX2ZpYl9ydWxlICpyOworCisJZm9yKHIgPSBkbl9maWJfcnVsZXM7IHI7IHIgPSByLT5yX25leHQpIHsKKwkJaWYgKHItPnJfaWZpbmRleCA9PSAtMSAmJiBzdHJjbXAoZGV2LT5uYW1lLCByLT5yX2lmbmFtZSkgPT0gMCkgeworCQkJd3JpdGVfbG9ja19iaCgmZG5fZmliX3J1bGVzX2xvY2spOworCQkJci0+cl9pZmluZGV4ID0gZGV2LT5pZmluZGV4OworCQkJd3JpdGVfdW5sb2NrX2JoKCZkbl9maWJfcnVsZXNfbG9jayk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgZG5fZmliX3J1bGVzX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwdHI7CisKKwlzd2l0Y2goZXZlbnQpIHsKKwkJY2FzZSBORVRERVZfVU5SRUdJU1RFUjoKKwkJCWRuX2ZpYl9ydWxlc19kZXRhY2goZGV2KTsKKwkJCWRuX2ZpYl9zeW5jX2Rvd24oMCwgZGV2LCAxKTsKKwkJY2FzZSBORVRERVZfUkVHSVNURVI6CisJCQlkbl9maWJfcnVsZXNfYXR0YWNoKGRldik7CisJCQlkbl9maWJfc3luY191cChkZXYpOworCX0KKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGRuX2ZpYl9ydWxlc19ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9CWRuX2ZpYl9ydWxlc19ldmVudCwKK307CisKK3N0YXRpYyBpbnQgZG5fZmliX2ZpbGxfcnVsZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZG5fZmliX3J1bGUgKnIsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlzdHJ1Y3QgcnRtc2cgKnJ0bTsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCisKKwlubGggPSBOTE1TR19QVVQoc2tiLCBORVRMSU5LX0NSRURTKGNiLT5za2IpLT5waWQsIGNiLT5ubGgtPm5sbXNnX3NlcSwgUlRNX05FV1JVTEUsIHNpemVvZigqcnRtKSk7CisJcnRtID0gTkxNU0dfREFUQShubGgpOworCXJ0bS0+cnRtX2ZhbWlseSA9IEFGX0RFQ25ldDsKKwlydG0tPnJ0bV9kc3RfbGVuID0gci0+cl9kc3RfbGVuOworCXJ0bS0+cnRtX3NyY19sZW4gPSByLT5yX3NyY19sZW47CisJcnRtLT5ydG1fdG9zID0gMDsKKyNpZmRlZiBDT05GSUdfREVDTkVUX1JPVVRFX0ZXTUFSSworCWlmIChyLT5yX2Z3bWFyaykKKwkJUlRBX1BVVChza2IsIFJUQV9QUk9UT0lORk8sIDQsICZyLT5yX2Z3bWFyayk7CisjZW5kaWYKKwlydG0tPnJ0bV90YWJsZSA9IHItPnJfdGFibGU7CisJcnRtLT5ydG1fcHJvdG9jb2wgPSAwOworCXJ0bS0+cnRtX3Njb3BlID0gMDsKKwlydG0tPnJ0bV90eXBlID0gci0+cl9hY3Rpb247CisJcnRtLT5ydG1fZmxhZ3MgPSByLT5yX2ZsYWdzOworCisJaWYgKHItPnJfZHN0X2xlbikKKwkJUlRBX1BVVChza2IsIFJUQV9EU1QsIDIsICZyLT5yX2RzdCk7CisJaWYgKHItPnJfc3JjX2xlbikKKwkJUlRBX1BVVChza2IsIFJUQV9TUkMsIDIsICZyLT5yX3NyYyk7CisJaWYgKHItPnJfaWZuYW1lWzBdKQorCQlSVEFfUFVUKHNrYiwgUlRBX0lJRiwgSUZOQU1TSVosICZyLT5yX2lmbmFtZSk7CisJaWYgKHItPnJfcHJlZmVyZW5jZSkKKwkJUlRBX1BVVChza2IsIFJUQV9QUklPUklUWSwgNCwgJnItPnJfcHJlZmVyZW5jZSk7CisJaWYgKHItPnJfc3JjbWFwKQorCQlSVEFfUFVUKHNrYiwgUlRBX0dBVEVXQVksIDIsICZyLT5yX3NyY21hcCk7CisJbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCXJldHVybiBza2ItPmxlbjsKKworbmxtc2dfZmFpbHVyZToKK3J0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorCitpbnQgZG5fZmliX2R1bXBfcnVsZXMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCWludCBpZHg7CisJaW50IHNfaWR4ID0gY2ItPmFyZ3NbMF07CisJc3RydWN0IGRuX2ZpYl9ydWxlICpyOworCisJcmVhZF9sb2NrKCZkbl9maWJfcnVsZXNfbG9jayk7CisJZm9yKHIgPSBkbl9maWJfcnVsZXMsIGlkeCA9IDA7IHI7IHIgPSByLT5yX25leHQsIGlkeCsrKSB7CisJCWlmIChpZHggPCBzX2lkeCkKKwkJCWNvbnRpbnVlOworCQlpZiAoZG5fZmliX2ZpbGxfcnVsZShza2IsIHIsIGNiKSA8IDApCisJCQlicmVhazsKKwl9CisJcmVhZF91bmxvY2soJmRuX2ZpYl9ydWxlc19sb2NrKTsKKwljYi0+YXJnc1swXSA9IGlkeDsKKworCXJldHVybiBza2ItPmxlbjsKK30KKwordm9pZCBfX2luaXQgZG5fZmliX3J1bGVzX2luaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmRuX2ZpYl9ydWxlc19ub3RpZmllcik7Cit9CisKK3ZvaWQgX19leGl0IGRuX2ZpYl9ydWxlc19jbGVhbnVwKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmRuX2ZpYl9ydWxlc19ub3RpZmllcik7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl90YWJsZS5jIGIvbmV0L2RlY25ldC9kbl90YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZDU2MDMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvZGVjbmV0L2RuX3RhYmxlLmMKQEAgLTAsMCArMSw4MjUgQEAKKy8qCisgKiBERUNuZXQgICAgICAgQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIERFQ25ldCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKiAgICAgICAgICAgICAgb3BlcmF0aW5nIHN5c3RlbS4gIERFQ25ldCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqICAgICAgICAgICAgICBpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKiAgICAgICAgICAgICAgREVDbmV0IFJvdXRpbmcgRm9yd2FyZGluZyBJbmZvcm1hdGlvbiBCYXNlIChSb3V0aW5nIFRhYmxlcykKKyAqCisgKiBBdXRob3I6ICAgICAgU3RldmUgV2hpdGVob3VzZSA8U3RldmVXQEFDTS5vcmc+CisgKiAgICAgICAgICAgICAgTW9zdGx5IGNvcGllZCBmcm9tIHRoZSBJUHY0IHJvdXRpbmcgY29kZQorICoKKyAqCisgKiBDaGFuZ2VzOgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvcm91dGUuaD4gLyogUlRGX3h4eCAqLworI2luY2x1ZGUgPG5ldC9uZWlnaGJvdXIuaD4KKyNpbmNsdWRlIDxuZXQvZHN0Lmg+CisjaW5jbHVkZSA8bmV0L2Zsb3cuaD4KKyNpbmNsdWRlIDxuZXQvZG4uaD4KKyNpbmNsdWRlIDxuZXQvZG5fcm91dGUuaD4KKyNpbmNsdWRlIDxuZXQvZG5fZmliLmg+CisjaW5jbHVkZSA8bmV0L2RuX25laWdoLmg+CisjaW5jbHVkZSA8bmV0L2RuX2Rldi5oPgorCitzdHJ1Y3QgZG5fem9uZQoreworCXN0cnVjdCBkbl96b25lCQkqZHpfbmV4dDsKKwlzdHJ1Y3QgZG5fZmliX25vZGUgCSoqZHpfaGFzaDsKKwlpbnQJCQlkel9uZW50OworCWludAkJCWR6X2Rpdmlzb3I7CisJdTMyCQkJZHpfaGFzaG1hc2s7CisjZGVmaW5lIERaX0hBU0hNQVNLKGR6KQkoKGR6KS0+ZHpfaGFzaG1hc2spCisJaW50CQkJZHpfb3JkZXI7CisJdTE2CQkJZHpfbWFzazsKKyNkZWZpbmUgRFpfTUFTSyhkeikJKChkeiktPmR6X21hc2spCit9OworCitzdHJ1Y3QgZG5faGFzaAoreworCXN0cnVjdCBkbl96b25lCSpkaF96b25lc1sxN107CisJc3RydWN0IGRuX3pvbmUJKmRoX3pvbmVfbGlzdDsKK307CisKKyNkZWZpbmUgZHpfa2V5XzAoa2V5KQkJKChrZXkpLmRhdHVtID0gMCkKKyNkZWZpbmUgZHpfcHJlZml4KGtleSxkeikJKChrZXkpLmRhdHVtKQorCisjZGVmaW5lIGZvcl9uZXh0aG9wcyhmaSkgeyBpbnQgbmhzZWw7IGNvbnN0IHN0cnVjdCBkbl9maWJfbmggKm5oO1wKKyAgICAgICAgZm9yKG5oc2VsID0gMCwgbmggPSAoZmkpLT5maWJfbmg7IG5oc2VsIDwgKGZpKS0+ZmliX25oczsgbmgrKywgbmhzZWwrKykKKworI2RlZmluZSBlbmRmb3JfbmV4dGhvcHMoZmkpIH0KKworI2RlZmluZSBETl9NQVhfRElWSVNPUiAxMDI0CisjZGVmaW5lIEROX1NfWk9NQklFIDEKKyNkZWZpbmUgRE5fU19BQ0NFU1NFRCAyCisKKyNkZWZpbmUgRE5fRklCX1NDQU4oZiwgZnApIFwKK2ZvciggOyAoKGYpID0gKihmcCkpICE9IE5VTEw7IChmcCkgPSAmKGYpLT5mbl9uZXh0KQorCisjZGVmaW5lIEROX0ZJQl9TQ0FOX0tFWShmLCBmcCwga2V5KSBcCitmb3IoIDsgKChmKSA9ICooZnApKSAhPSBOVUxMICYmIGRuX2tleV9lcSgoZiktPmZuX2tleSwgKGtleSkpOyAoZnApID0gJihmKS0+Zm5fbmV4dCkKKworI2RlZmluZSBSVF9UQUJMRV9NSU4gMQorCitzdGF0aWMgREVGSU5FX1JXTE9DSyhkbl9maWJfdGFibGVzX2xvY2spOworc3RydWN0IGRuX2ZpYl90YWJsZSAqZG5fZmliX3RhYmxlc1tSVF9UQUJMRV9NQVggKyAxXTsKKworc3RhdGljIGttZW1fY2FjaGVfdCAqZG5faGFzaF9rbWVtOworc3RhdGljIGludCBkbl9maWJfaGFzaF96b21iaWVzOworCitzdGF0aWMgaW5saW5lIGRuX2ZpYl9pZHhfdCBkbl9oYXNoKGRuX2ZpYl9rZXlfdCBrZXksIHN0cnVjdCBkbl96b25lICpkeikKK3sKKwl1MTYgaCA9IG50b2hzKGtleS5kYXR1bSk+PigxNiAtIGR6LT5kel9vcmRlcik7CisJaCBePSAoaCA+PiAxMCk7CisJaCBePSAoaCA+PiA2KTsKKwloICY9IERaX0hBU0hNQVNLKGR6KTsKKwlyZXR1cm4gKihkbl9maWJfaWR4X3QgKikmaDsKK30KKworc3RhdGljIGlubGluZSBkbl9maWJfa2V5X3QgZHpfa2V5KHUxNiBkc3QsIHN0cnVjdCBkbl96b25lICpkeikKK3sKKwlkbl9maWJfa2V5X3QgazsKKwlrLmRhdHVtID0gZHN0ICYgRFpfTUFTSyhkeik7CisJcmV0dXJuIGs7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRuX2ZpYl9ub2RlICoqZG5fY2hhaW5fcChkbl9maWJfa2V5X3Qga2V5LCBzdHJ1Y3QgZG5fem9uZSAqZHopCit7CisJcmV0dXJuICZkei0+ZHpfaGFzaFtkbl9oYXNoKGtleSwgZHopLmRhdHVtXTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZG5fZmliX25vZGUgKmR6X2NoYWluKGRuX2ZpYl9rZXlfdCBrZXksIHN0cnVjdCBkbl96b25lICpkeikKK3sKKwlyZXR1cm4gZHotPmR6X2hhc2hbZG5faGFzaChrZXksIGR6KS5kYXR1bV07Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRuX2tleV9lcShkbl9maWJfa2V5X3QgYSwgZG5fZmliX2tleV90IGIpCit7CisJcmV0dXJuIGEuZGF0dW0gPT0gYi5kYXR1bTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG5fa2V5X2xlcShkbl9maWJfa2V5X3QgYSwgZG5fZmliX2tleV90IGIpCit7CisJcmV0dXJuIGEuZGF0dW0gPD0gYi5kYXR1bTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRuX3JlYnVpbGRfem9uZShzdHJ1Y3QgZG5fem9uZSAqZHosCisJCQkJICAgc3RydWN0IGRuX2ZpYl9ub2RlICoqb2xkX2h0LAorCQkJCSAgIGludCBvbGRfZGl2aXNvcikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZG5fZmliX25vZGUgKmYsICoqZnAsICpuZXh0OworCisJZm9yKGkgPSAwOyBpIDwgb2xkX2Rpdmlzb3I7IGkrKykgeworCQlmb3IoZiA9IG9sZF9odFtpXTsgZjsgZiA9IGYtPmZuX25leHQpIHsKKwkJCW5leHQgPSBmLT5mbl9uZXh0OworCQkJZm9yKGZwID0gZG5fY2hhaW5fcChmLT5mbl9rZXksIGR6KTsKKwkJCQkqZnAgJiYgZG5fa2V5X2xlcSgoKmZwKS0+Zm5fa2V5LCBmLT5mbl9rZXkpOworCQkJCWZwID0gJigqZnApLT5mbl9uZXh0KQorCQkJCS8qIE5PVEhJTkcgKi87CisJCQlmLT5mbl9uZXh0ID0gKmZwOworCQkJKmZwID0gZjsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZG5fcmVoYXNoX3pvbmUoc3RydWN0IGRuX3pvbmUgKmR6KQoreworCXN0cnVjdCBkbl9maWJfbm9kZSAqKmh0LCAqKm9sZF9odDsKKwlpbnQgb2xkX2Rpdmlzb3IsIG5ld19kaXZpc29yOworCXUzMiBuZXdfaGFzaG1hc2s7CisKKwlvbGRfZGl2aXNvciA9IGR6LT5kel9kaXZpc29yOworCisJc3dpdGNoKG9sZF9kaXZpc29yKSB7CisJCWNhc2UgMTY6CisJCQluZXdfZGl2aXNvciA9IDI1NjsKKwkJCW5ld19oYXNobWFzayA9IDB4RkY7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0RFQlVHICJERUNuZXQ6IGRuX3JlaGFzaF96b25lOiBCVUchICVkXG4iLCBvbGRfZGl2aXNvcik7CisJCWNhc2UgMjU2OgorCQkJbmV3X2Rpdmlzb3IgPSAxMDI0OworCQkJbmV3X2hhc2htYXNrID0gMHgzRkY7CisJCQlicmVhazsKKwl9CisKKwlodCA9IGttYWxsb2MobmV3X2Rpdmlzb3Iqc2l6ZW9mKHN0cnVjdCBkbl9maWJfbm9kZSopLCBHRlBfS0VSTkVMKTsKKworCWlmIChodCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwltZW1zZXQoaHQsIDAsIG5ld19kaXZpc29yKnNpemVvZihzdHJ1Y3QgZG5fZmliX25vZGUgKikpOworCXdyaXRlX2xvY2tfYmgoJmRuX2ZpYl90YWJsZXNfbG9jayk7CisJb2xkX2h0ID0gZHotPmR6X2hhc2g7CisJZHotPmR6X2hhc2ggPSBodDsKKwlkei0+ZHpfaGFzaG1hc2sgPSBuZXdfaGFzaG1hc2s7CisJZHotPmR6X2Rpdmlzb3IgPSBuZXdfZGl2aXNvcjsKKwlkbl9yZWJ1aWxkX3pvbmUoZHosIG9sZF9odCwgb2xkX2Rpdmlzb3IpOworCXdyaXRlX3VubG9ja19iaCgmZG5fZmliX3RhYmxlc19sb2NrKTsKKwlrZnJlZShvbGRfaHQpOworfQorCitzdGF0aWMgdm9pZCBkbl9mcmVlX25vZGUoc3RydWN0IGRuX2ZpYl9ub2RlICpmKQoreworCWRuX2ZpYl9yZWxlYXNlX2luZm8oRE5fRklCX0lORk8oZikpOworCWttZW1fY2FjaGVfZnJlZShkbl9oYXNoX2ttZW0sIGYpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZG5fem9uZSAqZG5fbmV3X3pvbmUoc3RydWN0IGRuX2hhc2ggKnRhYmxlLCBpbnQgeikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZG5fem9uZSAqZHogPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZG5fem9uZSksIEdGUF9LRVJORUwpOworCWlmICghZHopCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KGR6LCAwLCBzaXplb2Yoc3RydWN0IGRuX3pvbmUpKTsKKwlpZiAoeikgeworCQlkei0+ZHpfZGl2aXNvciA9IDE2OworCQlkei0+ZHpfaGFzaG1hc2sgPSAweDBGOworCX0gZWxzZSB7CisJCWR6LT5kel9kaXZpc29yID0gMTsKKwkJZHotPmR6X2hhc2htYXNrID0gMDsKKwl9CisKKwlkei0+ZHpfaGFzaCA9IGttYWxsb2MoZHotPmR6X2Rpdmlzb3Iqc2l6ZW9mKHN0cnVjdCBkbl9maWJfbm9kZSAqKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWR6LT5kel9oYXNoKSB7CisJCWtmcmVlKGR6KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KGR6LT5kel9oYXNoLCAwLCBkei0+ZHpfZGl2aXNvcipzaXplb2Yoc3RydWN0IGRuX2ZpYl9ub2RlKikpOworCWR6LT5kel9vcmRlciA9IHo7CisJZHotPmR6X21hc2sgPSBkbmV0X21ha2VfbWFzayh6KTsKKworCWZvcihpID0geiArIDE7IGkgPD0gMTY7IGkrKykKKwkJaWYgKHRhYmxlLT5kaF96b25lc1tpXSkKKwkJCWJyZWFrOworCisJd3JpdGVfbG9ja19iaCgmZG5fZmliX3RhYmxlc19sb2NrKTsKKwlpZiAoaT4xNikgeworCQlkei0+ZHpfbmV4dCA9IHRhYmxlLT5kaF96b25lX2xpc3Q7CisJCXRhYmxlLT5kaF96b25lX2xpc3QgPSBkejsKKwl9IGVsc2UgeworCQlkei0+ZHpfbmV4dCA9IHRhYmxlLT5kaF96b25lc1tpXS0+ZHpfbmV4dDsKKwkJdGFibGUtPmRoX3pvbmVzW2ldLT5kel9uZXh0ID0gZHo7CisJfQorCXRhYmxlLT5kaF96b25lc1t6XSA9IGR6OworCXdyaXRlX3VubG9ja19iaCgmZG5fZmliX3RhYmxlc19sb2NrKTsKKwlyZXR1cm4gZHo7Cit9CisKKworc3RhdGljIGludCBkbl9maWJfbmhfbWF0Y2goc3RydWN0IHJ0bXNnICpyLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IGRuX2tlcm5fcnRhICpydGEsIHN0cnVjdCBkbl9maWJfaW5mbyAqZmkpCit7CisJc3RydWN0IHJ0bmV4dGhvcCAqbmhwOworCWludCBuaGxlbjsKKworCWlmIChydGEtPnJ0YV9wcmlvcml0eSAmJiAqcnRhLT5ydGFfcHJpb3JpdHkgIT0gZmktPmZpYl9wcmlvcml0eSkKKwkJcmV0dXJuIDE7CisKKwlpZiAocnRhLT5ydGFfb2lmIHx8IHJ0YS0+cnRhX2d3KSB7CisJCWlmICgoIXJ0YS0+cnRhX29pZiB8fCAqcnRhLT5ydGFfb2lmID09IGZpLT5maWJfbmgtPm5oX29pZikgJiYKKwkJICAgICghcnRhLT5ydGFfZ3cgIHx8IG1lbWNtcChydGEtPnJ0YV9ndywgJmZpLT5maWJfbmgtPm5oX2d3LCAyKSA9PSAwKSkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAocnRhLT5ydGFfbXAgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwluaHAgPSBSVEFfREFUQShydGEtPnJ0YV9tcCk7CisJbmhsZW4gPSBSVEFfUEFZTE9BRChydGEtPnJ0YV9tcCk7CisKKwlmb3JfbmV4dGhvcHMoZmkpIHsKKwkJaW50IGF0dHJsZW4gPSBuaGxlbiAtIHNpemVvZihzdHJ1Y3QgcnRuZXh0aG9wKTsKKwkJZG5fYWRkcmVzcyBndzsKKworCQlpZiAoYXR0cmxlbiA8IDAgfHwgKG5obGVuIC09IG5ocC0+cnRuaF9sZW4pIDwgMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAobmhwLT5ydG5oX2lmaW5kZXggJiYgbmhwLT5ydG5oX2lmaW5kZXggIT0gbmgtPm5oX29pZikKKwkJCXJldHVybiAxOworCQlpZiAoYXR0cmxlbikgeworCQkJZ3cgPSBkbl9maWJfZ2V0X2F0dHIxNihSVE5IX0RBVEEobmhwKSwgYXR0cmxlbiwgUlRBX0dBVEVXQVkpOworCisJCQlpZiAoZ3cgJiYgZ3cgIT0gbmgtPm5oX2d3KQorCQkJCXJldHVybiAxOworCQl9CisJCW5ocCA9IFJUTkhfTkVYVChuaHApOworCX0gZW5kZm9yX25leHRob3BzKGZpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRuX2ZpYl9kdW1wX2luZm8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIHBpZCwgdTMyIHNlcSwgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgdTggdGJfaWQsIHU4IHR5cGUsIHU4IHNjb3BlLCB2b2lkICpkc3QsIGludCBkc3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRuX2ZpYl9pbmZvICpmaSkKK3sKKyAgICAgICAgc3RydWN0IHJ0bXNnICpydG07CisgICAgICAgIHN0cnVjdCBubG1zZ2hkciAqbmxoOworICAgICAgICB1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCisgICAgICAgIG5saCA9IE5MTVNHX1BVVChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCpydG0pKTsKKyAgICAgICAgcnRtID0gTkxNU0dfREFUQShubGgpOworICAgICAgICBydG0tPnJ0bV9mYW1pbHkgPSBBRl9ERUNuZXQ7CisgICAgICAgIHJ0bS0+cnRtX2RzdF9sZW4gPSBkc3RfbGVuOworICAgICAgICBydG0tPnJ0bV9zcmNfbGVuID0gMDsKKyAgICAgICAgcnRtLT5ydG1fdG9zID0gMDsKKyAgICAgICAgcnRtLT5ydG1fdGFibGUgPSB0Yl9pZDsKKyAgICAgICAgcnRtLT5ydG1fZmxhZ3MgPSBmaS0+ZmliX2ZsYWdzOworICAgICAgICBydG0tPnJ0bV9zY29wZSA9IHNjb3BlOworCXJ0bS0+cnRtX3R5cGUgID0gdHlwZTsKKyAgICAgICAgaWYgKHJ0bS0+cnRtX2RzdF9sZW4pCisgICAgICAgICAgICAgICAgUlRBX1BVVChza2IsIFJUQV9EU1QsIDIsIGRzdCk7CisgICAgICAgIHJ0bS0+cnRtX3Byb3RvY29sID0gZmktPmZpYl9wcm90b2NvbDsKKyAgICAgICAgaWYgKGZpLT5maWJfcHJpb3JpdHkpCisgICAgICAgICAgICAgICAgUlRBX1BVVChza2IsIFJUQV9QUklPUklUWSwgNCwgJmZpLT5maWJfcHJpb3JpdHkpOworCWlmIChydG5ldGxpbmtfcHV0X21ldHJpY3Moc2tiLCBmaS0+ZmliX21ldHJpY3MpIDwgMCkKKwkJZ290byBydGF0dHJfZmFpbHVyZTsKKyAgICAgICAgaWYgKGZpLT5maWJfbmhzID09IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmktPmZpYl9uaC0+bmhfZ3cpCisgICAgICAgICAgICAgICAgICAgICAgICBSVEFfUFVUKHNrYiwgUlRBX0dBVEVXQVksIDIsICZmaS0+ZmliX25oLT5uaF9ndyk7CisgICAgICAgICAgICAgICAgaWYgKGZpLT5maWJfbmgtPm5oX29pZikKKyAgICAgICAgICAgICAgICAgICAgICAgIFJUQV9QVVQoc2tiLCBSVEFfT0lGLCBzaXplb2YoaW50KSwgJmZpLT5maWJfbmgtPm5oX29pZik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpLT5maWJfbmhzID4gMSkgeworICAgICAgICAgICAgICAgIHN0cnVjdCBydG5leHRob3AgKm5ocDsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgcnRhdHRyICptcF9oZWFkOworICAgICAgICAgICAgICAgIGlmIChza2JfdGFpbHJvb20oc2tiKSA8PSBSVEFfU1BBQ0UoMCkpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJ0YXR0cl9mYWlsdXJlOworICAgICAgICAgICAgICAgIG1wX2hlYWQgPSAoc3RydWN0IHJ0YXR0ciAqKXNrYl9wdXQoc2tiLCBSVEFfU1BBQ0UoMCkpOworCisgICAgICAgICAgICAgICAgZm9yX25leHRob3BzKGZpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2tiX3RhaWxyb29tKHNrYikgPCBSVEFfQUxJR04oUlRBX0FMSUdOKHNpemVvZigqbmhwKSkgKyA0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBydGF0dHJfZmFpbHVyZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ocCA9IChzdHJ1Y3QgcnRuZXh0aG9wICopc2tiX3B1dChza2IsIFJUQV9BTElHTihzaXplb2YoKm5ocCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ocC0+cnRuaF9mbGFncyA9IG5oLT5uaF9mbGFncyAmIDB4RkY7CisgICAgICAgICAgICAgICAgICAgICAgICBuaHAtPnJ0bmhfaG9wcyA9IG5oLT5uaF93ZWlnaHQgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbmhwLT5ydG5oX2lmaW5kZXggPSBuaC0+bmhfb2lmOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5oLT5uaF9ndykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRBX1BVVChza2IsIFJUQV9HQVRFV0FZLCAyLCAmbmgtPm5oX2d3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ocC0+cnRuaF9sZW4gPSBza2ItPnRhaWwgLSAodW5zaWduZWQgY2hhciAqKW5ocDsKKyAgICAgICAgICAgICAgICB9IGVuZGZvcl9uZXh0aG9wcyhmaSk7CisgICAgICAgICAgICAgICAgbXBfaGVhZC0+cnRhX3R5cGUgPSBSVEFfTVVMVElQQVRIOworICAgICAgICAgICAgICAgIG1wX2hlYWQtPnJ0YV9sZW4gPSBza2ItPnRhaWwgLSAodTgqKW1wX2hlYWQ7CisgICAgICAgIH0KKworICAgICAgICBubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisgICAgICAgIHJldHVybiBza2ItPmxlbjsKKworCitubG1zZ19mYWlsdXJlOgorcnRhdHRyX2ZhaWx1cmU6CisgICAgICAgIHNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisgICAgICAgIHJldHVybiAtMTsKK30KKworCitzdGF0aWMgdm9pZCBkbl9ydG1zZ19maWIoaW50IGV2ZW50LCBzdHJ1Y3QgZG5fZmliX25vZGUgKmYsIGludCB6LCBpbnQgdGJfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5ldGxpbmtfc2tiX3Bhcm1zICpyZXEpCit7CisgICAgICAgIHN0cnVjdCBza19idWZmICpza2I7CisgICAgICAgIHUzMiBwaWQgPSByZXEgPyByZXEtPnBpZCA6IDA7CisgICAgICAgIGludCBzaXplID0gTkxNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBydG1zZykgKyAyNTYpOworCisgICAgICAgIHNrYiA9IGFsbG9jX3NrYihzaXplLCBHRlBfS0VSTkVMKTsKKyAgICAgICAgaWYgKCFza2IpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChkbl9maWJfZHVtcF9pbmZvKHNrYiwgcGlkLCBubGgtPm5sbXNnX3NlcSwgZXZlbnQsIHRiX2lkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+Zm5fdHlwZSwgZi0+Zm5fc2NvcGUsICZmLT5mbl9rZXksIHosIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETl9GSUJfSU5GTyhmKSkgPCAwKSB7CisgICAgICAgICAgICAgICAga2ZyZWVfc2tiKHNrYik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE5FVExJTktfQ0Ioc2tiKS5kc3RfZ3JvdXBzID0gUlRNR1JQX0RFQ25ldF9ST1VURTsKKyAgICAgICAgaWYgKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9FQ0hPKQorICAgICAgICAgICAgICAgIGF0b21pY19pbmMoJnNrYi0+dXNlcnMpOworICAgICAgICBuZXRsaW5rX2Jyb2FkY2FzdChydG5sLCBza2IsIHBpZCwgUlRNR1JQX0RFQ25ldF9ST1VURSwgR0ZQX0tFUk5FTCk7CisgICAgICAgIGlmIChubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfRUNITykKKyAgICAgICAgICAgICAgICBuZXRsaW5rX3VuaWNhc3QocnRubCwgc2tiLCBwaWQsIE1TR19ET05UV0FJVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBkbl9oYXNoX2R1bXBfYnVja2V0KHN0cnVjdCBza19idWZmICpza2IsIAorCQkJCXN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJCQlzdHJ1Y3QgZG5fZmliX3RhYmxlICp0YiwKKwkJCQlzdHJ1Y3QgZG5fem9uZSAqZHosCisJCQkJc3RydWN0IGRuX2ZpYl9ub2RlICpmKQoreworCWludCBpLCBzX2k7CisKKwlzX2kgPSBjYi0+YXJnc1szXTsKKwlmb3IoaSA9IDA7IGY7IGkrKywgZiA9IGYtPmZuX25leHQpIHsKKwkJaWYgKGkgPCBzX2kpCisJCQljb250aW51ZTsKKwkJaWYgKGYtPmZuX3N0YXRlICYgRE5fU19aT01CSUUpCisJCQljb250aW51ZTsKKwkJaWYgKGRuX2ZpYl9kdW1wX2luZm8oc2tiLCBORVRMSU5LX0NCKGNiLT5za2IpLnBpZCwgCisJCQkJY2ItPm5saC0+bmxtc2dfc2VxLAorCQkJCVJUTV9ORVdST1VURSwKKwkJCQl0Yi0+biwgCisJCQkJKGYtPmZuX3N0YXRlICYgRE5fU19aT01CSUUpID8gMCA6IGYtPmZuX3R5cGUsCisJCQkJZi0+Zm5fc2NvcGUsICZmLT5mbl9rZXksIGR6LT5kel9vcmRlciwgCisJCQkJZi0+Zm5faW5mbykgPCAwKSB7CisJCQljYi0+YXJnc1szXSA9IGk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJY2ItPmFyZ3NbM10gPSBpOworCXJldHVybiBza2ItPmxlbjsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IGRuX2hhc2hfZHVtcF96b25lKHN0cnVjdCBza19idWZmICpza2IsIAorCQkJCXN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJCQlzdHJ1Y3QgZG5fZmliX3RhYmxlICp0YiwKKwkJCQlzdHJ1Y3QgZG5fem9uZSAqZHopCit7CisJaW50IGgsIHNfaDsKKworCXNfaCA9IGNiLT5hcmdzWzJdOworCWZvcihoID0gMDsgaCA8IGR6LT5kel9kaXZpc29yOyBoKyspIHsKKwkJaWYgKGggPCBzX2gpCisJCQljb250aW51ZTsKKwkJaWYgKGggPiBzX2gpCisJCQltZW1zZXQoJmNiLT5hcmdzWzNdLCAwLCBzaXplb2YoY2ItPmFyZ3MpIC0gMypzaXplb2YoY2ItPmFyZ3NbMF0pKTsKKwkJaWYgKGR6LT5kel9oYXNoID09IE5VTEwgfHwgZHotPmR6X2hhc2hbaF0gPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlpZiAoZG5faGFzaF9kdW1wX2J1Y2tldChza2IsIGNiLCB0YiwgZHosIGR6LT5kel9oYXNoW2hdKSA8IDApIHsKKwkJCWNiLT5hcmdzWzJdID0gaDsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwljYi0+YXJnc1syXSA9IGg7CisJcmV0dXJuIHNrYi0+bGVuOworfQorCitzdGF0aWMgaW50IGRuX2ZpYl90YWJsZV9kdW1wKHN0cnVjdCBkbl9maWJfdGFibGUgKnRiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworICAgICAgICBpbnQgbSwgc19tOworCXN0cnVjdCBkbl96b25lICpkejsKKwlzdHJ1Y3QgZG5faGFzaCAqdGFibGUgPSAoc3RydWN0IGRuX2hhc2ggKil0Yi0+ZGF0YTsKKworCXNfbSA9IGNiLT5hcmdzWzFdOworCXJlYWRfbG9jaygmZG5fZmliX3RhYmxlc19sb2NrKTsKKwlmb3IoZHogPSB0YWJsZS0+ZGhfem9uZV9saXN0LCBtID0gMDsgZHo7IGR6ID0gZHotPmR6X25leHQsIG0rKykgeworCQlpZiAobSA8IHNfbSkKKwkJCWNvbnRpbnVlOworCQlpZiAobSA+IHNfbSkKKwkJCW1lbXNldCgmY2ItPmFyZ3NbMl0sIDAsIHNpemVvZihjYi0+YXJncykgLSAyKnNpemVvZihjYi0+YXJnc1swXSkpOworCisJCWlmIChkbl9oYXNoX2R1bXBfem9uZShza2IsIGNiLCB0YiwgZHopIDwgMCkgeworCQkJY2ItPmFyZ3NbMV0gPSBtOworCQkJcmVhZF91bmxvY2soJmRuX2ZpYl90YWJsZXNfbG9jayk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJcmVhZF91bmxvY2soJmRuX2ZpYl90YWJsZXNfbG9jayk7CisJY2ItPmFyZ3NbMV0gPSBtOworCisgICAgICAgIHJldHVybiBza2ItPmxlbjsKK30KKworc3RhdGljIGludCBkbl9maWJfdGFibGVfaW5zZXJ0KHN0cnVjdCBkbl9maWJfdGFibGUgKnRiLCBzdHJ1Y3QgcnRtc2cgKnIsIHN0cnVjdCBkbl9rZXJuX3J0YSAqcnRhLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHN0cnVjdCBuZXRsaW5rX3NrYl9wYXJtcyAqcmVxKQoreworCXN0cnVjdCBkbl9oYXNoICp0YWJsZSA9IChzdHJ1Y3QgZG5faGFzaCAqKXRiLT5kYXRhOworCXN0cnVjdCBkbl9maWJfbm9kZSAqbmV3X2YsICpmLCAqKmZwLCAqKmRlbF9mcDsKKwlzdHJ1Y3QgZG5fem9uZSAqZHo7CisJc3RydWN0IGRuX2ZpYl9pbmZvICpmaTsKKyAgICAgICAgaW50IHogPSByLT5ydG1fZHN0X2xlbjsKKwlpbnQgdHlwZSA9IHItPnJ0bV90eXBlOworCWRuX2ZpYl9rZXlfdCBrZXk7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgaWYgKHogPiAxNikKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworCWR6ID0gdGFibGUtPmRoX3pvbmVzW3pdOworCWlmICghZHogJiYgIShkeiA9IGRuX25ld196b25lKHRhYmxlLCB6KSkpCisJCXJldHVybiAtRU5PQlVGUzsKKworCWR6X2tleV8wKGtleSk7CisJaWYgKHJ0YS0+cnRhX2RzdCkgeworCQlkbl9hZGRyZXNzIGRzdDsKKwkJbWVtY3B5KCZkc3QsIHJ0YS0+cnRhX2RzdCwgMik7CisJCWlmIChkc3QgJiB+RFpfTUFTSyhkeikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJa2V5ID0gZHpfa2V5KGRzdCwgZHopOworCX0KKworICAgICAgICBpZiAoKGZpID0gZG5fZmliX2NyZWF0ZV9pbmZvKHIsIHJ0YSwgbiwgJmVycikpID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKworCWlmIChkei0+ZHpfbmVudCA+IChkei0+ZHpfZGl2aXNvciA8PCAyKSAmJgorCQkJZHotPmR6X2Rpdmlzb3IgPiBETl9NQVhfRElWSVNPUiAmJgorCQkJKHo9PTE2IHx8ICgxPDx6KSA+IGR6LT5kel9kaXZpc29yKSkKKwkJZG5fcmVoYXNoX3pvbmUoZHopOworCisJZnAgPSBkbl9jaGFpbl9wKGtleSwgZHopOworCisJRE5fRklCX1NDQU4oZiwgZnApIHsKKwkJaWYgKGRuX2tleV9sZXEoa2V5LCBmLT5mbl9rZXkpKQorCQkJYnJlYWs7CisJfQorCisJZGVsX2ZwID0gTlVMTDsKKworCWlmIChmICYmIChmLT5mbl9zdGF0ZSAmIEROX1NfWk9NQklFKSAmJgorCQkJZG5fa2V5X2VxKGYtPmZuX2tleSwga2V5KSkgeworCQlkZWxfZnAgPSBmcDsKKwkJZnAgPSAmZi0+Zm5fbmV4dDsKKwkJZiA9ICpmcDsKKwkJZ290byBjcmVhdGU7CisJfQorCisJRE5fRklCX1NDQU5fS0VZKGYsIGZwLCBrZXkpIHsKKwkJaWYgKGZpLT5maWJfcHJpb3JpdHkgPD0gRE5fRklCX0lORk8oZiktPmZpYl9wcmlvcml0eSkKKwkJCWJyZWFrOworCX0KKworCWlmIChmICYmIGRuX2tleV9lcShmLT5mbl9rZXksIGtleSkgJiYKKwkJCWZpLT5maWJfcHJpb3JpdHkgPT0gRE5fRklCX0lORk8oZiktPmZpYl9wcmlvcml0eSkgeworCQlzdHJ1Y3QgZG5fZmliX25vZGUgKippbnNfZnA7CisKKwkJZXJyID0gLUVFWElTVDsKKwkJaWYgKG4tPm5sbXNnX2ZsYWdzICYgTkxNX0ZfRVhDTCkKKwkJCWdvdG8gb3V0OworCisJCWlmIChuLT5ubG1zZ19mbGFncyAmIE5MTV9GX1JFUExBQ0UpIHsKKwkJCWRlbF9mcCA9IGZwOworCQkJZnAgPSAmZi0+Zm5fbmV4dDsKKwkJCWYgPSAqZnA7CisJCQlnb3RvIHJlcGxhY2U7CisJCX0KKworCQlpbnNfZnAgPSBmcDsKKwkJZXJyID0gLUVFWElTVDsKKworCQlETl9GSUJfU0NBTl9LRVkoZiwgZnAsIGtleSkgeworCQkJaWYgKGZpLT5maWJfcHJpb3JpdHkgIT0gRE5fRklCX0lORk8oZiktPmZpYl9wcmlvcml0eSkKKwkJCQlicmVhazsKKwkJCWlmIChmLT5mbl90eXBlID09IHR5cGUgJiYgZi0+Zm5fc2NvcGUgPT0gci0+cnRtX3Njb3BlCisJCQkJCSYmIEROX0ZJQl9JTkZPKGYpID09IGZpKQorCQkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKCEobi0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9BUFBFTkQpKSB7CisJCQlmcCA9IGluc19mcDsKKwkJCWYgPSAqZnA7CisJCX0KKwl9CisKK2NyZWF0ZToKKwllcnIgPSAtRU5PRU5UOworCWlmICghKG4tPm5sbXNnX2ZsYWdzICYgTkxNX0ZfQ1JFQVRFKSkKKwkJZ290byBvdXQ7CisKK3JlcGxhY2U6CisJZXJyID0gLUVOT0JVRlM7CisJbmV3X2YgPSBrbWVtX2NhY2hlX2FsbG9jKGRuX2hhc2hfa21lbSwgU0xBQl9LRVJORUwpOworCWlmIChuZXdfZiA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCW1lbXNldChuZXdfZiwgMCwgc2l6ZW9mKHN0cnVjdCBkbl9maWJfbm9kZSkpOworCisJbmV3X2YtPmZuX2tleSA9IGtleTsKKwluZXdfZi0+Zm5fdHlwZSA9IHR5cGU7CisJbmV3X2YtPmZuX3Njb3BlID0gci0+cnRtX3Njb3BlOworCUROX0ZJQl9JTkZPKG5ld19mKSA9IGZpOworCisJbmV3X2YtPmZuX25leHQgPSBmOworCXdyaXRlX2xvY2tfYmgoJmRuX2ZpYl90YWJsZXNfbG9jayk7CisJKmZwID0gbmV3X2Y7CisJd3JpdGVfdW5sb2NrX2JoKCZkbl9maWJfdGFibGVzX2xvY2spOworCWR6LT5kel9uZW50Kys7CisKKwlpZiAoZGVsX2ZwKSB7CisJCWYgPSAqZGVsX2ZwOworCQl3cml0ZV9sb2NrX2JoKCZkbl9maWJfdGFibGVzX2xvY2spOworCQkqZGVsX2ZwID0gZi0+Zm5fbmV4dDsKKwkJd3JpdGVfdW5sb2NrX2JoKCZkbl9maWJfdGFibGVzX2xvY2spOworCisJCWlmICghKGYtPmZuX3N0YXRlICYgRE5fU19aT01CSUUpKQorCQkJZG5fcnRtc2dfZmliKFJUTV9ERUxST1VURSwgZiwgeiwgdGItPm4sIG4sIHJlcSk7CisJCWlmIChmLT5mbl9zdGF0ZSAmIEROX1NfQUNDRVNTRUQpCisJCQlkbl9ydF9jYWNoZV9mbHVzaCgtMSk7CisJCWRuX2ZyZWVfbm9kZShmKTsKKwkJZHotPmR6X25lbnQtLTsKKwl9IGVsc2UgeworCQlkbl9ydF9jYWNoZV9mbHVzaCgtMSk7CisJfQorCisgICAgICAgIGRuX3J0bXNnX2ZpYihSVE1fTkVXUk9VVEUsIG5ld19mLCB6LCB0Yi0+biwgbiwgcmVxKTsKKworICAgICAgICByZXR1cm4gMDsKK291dDoKKwlkbl9maWJfcmVsZWFzZV9pbmZvKGZpKTsKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgZG5fZmliX3RhYmxlX2RlbGV0ZShzdHJ1Y3QgZG5fZmliX3RhYmxlICp0Yiwgc3RydWN0IHJ0bXNnICpyLCBzdHJ1Y3QgZG5fa2Vybl9ydGEgKnJ0YSwgc3RydWN0IG5sbXNnaGRyICpuLCBzdHJ1Y3QgbmV0bGlua19za2JfcGFybXMgKnJlcSkKK3sKKwlzdHJ1Y3QgZG5faGFzaCAqdGFibGUgPSAoc3RydWN0IGRuX2hhc2gqKXRiLT5kYXRhOworCXN0cnVjdCBkbl9maWJfbm9kZSAqKmZwLCAqKmRlbF9mcCwgKmY7CisgICAgICAgIGludCB6ID0gci0+cnRtX2RzdF9sZW47CisJc3RydWN0IGRuX3pvbmUgKmR6OworCWRuX2ZpYl9rZXlfdCBrZXk7CisJaW50IG1hdGNoZWQ7CisKKworICAgICAgICBpZiAoeiA+IDE2KQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisJaWYgKChkeiA9IHRhYmxlLT5kaF96b25lc1t6XSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FU1JDSDsKKworCWR6X2tleV8wKGtleSk7CisJaWYgKHJ0YS0+cnRhX2RzdCkgeworCQlkbl9hZGRyZXNzIGRzdDsKKwkJbWVtY3B5KCZkc3QsIHJ0YS0+cnRhX2RzdCwgMik7CisJCWlmIChkc3QgJiB+RFpfTUFTSyhkeikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJa2V5ID0gZHpfa2V5KGRzdCwgZHopOworCX0KKworCWZwID0gZG5fY2hhaW5fcChrZXksIGR6KTsKKworCUROX0ZJQl9TQ0FOKGYsIGZwKSB7CisJCWlmIChkbl9rZXlfZXEoZi0+Zm5fa2V5LCBrZXkpKQorCQkJYnJlYWs7CisJCWlmIChkbl9rZXlfbGVxKGtleSwgZi0+Zm5fa2V5KSkKKwkJCXJldHVybiAtRVNSQ0g7CisJfQorCisJbWF0Y2hlZCA9IDA7CisJZGVsX2ZwID0gTlVMTDsKKwlETl9GSUJfU0NBTl9LRVkoZiwgZnAsIGtleSkgeworCQlzdHJ1Y3QgZG5fZmliX2luZm8gKmZpID0gRE5fRklCX0lORk8oZik7CisKKwkJaWYgKGYtPmZuX3N0YXRlICYgRE5fU19aT01CSUUpCisJCQlyZXR1cm4gLUVTUkNIOworCisJCW1hdGNoZWQrKzsKKworCQlpZiAoZGVsX2ZwID09IE5VTEwgJiYKKwkJCQkoIXItPnJ0bV90eXBlIHx8IGYtPmZuX3R5cGUgPT0gci0+cnRtX3R5cGUpICYmCisJCQkJKHItPnJ0bV9zY29wZSA9PSBSVF9TQ09QRV9OT1dIRVJFIHx8IGYtPmZuX3Njb3BlID09IHItPnJ0bV9zY29wZSkgJiYKKwkJCQkoIXItPnJ0bV9wcm90b2NvbCB8fCAKKwkJCQkJZmktPmZpYl9wcm90b2NvbCA9PSByLT5ydG1fcHJvdG9jb2wpICYmCisJCQkJZG5fZmliX25oX21hdGNoKHIsIG4sIHJ0YSwgZmkpID09IDApCisJCQlkZWxfZnAgPSBmcDsKKwl9CisKKwlpZiAoZGVsX2ZwKSB7CisJCWYgPSAqZGVsX2ZwOworICAgICAgICAJZG5fcnRtc2dfZmliKFJUTV9ERUxST1VURSwgZiwgeiwgdGItPm4sIG4sIHJlcSk7CisKKwkJaWYgKG1hdGNoZWQgIT0gMSkgeworCQkJd3JpdGVfbG9ja19iaCgmZG5fZmliX3RhYmxlc19sb2NrKTsKKwkJCSpkZWxfZnAgPSBmLT5mbl9uZXh0OworCQkJd3JpdGVfdW5sb2NrX2JoKCZkbl9maWJfdGFibGVzX2xvY2spOworCisJCQlpZiAoZi0+Zm5fc3RhdGUgJiBETl9TX0FDQ0VTU0VEKQorCQkJCWRuX3J0X2NhY2hlX2ZsdXNoKC0xKTsKKwkJCWRuX2ZyZWVfbm9kZShmKTsKKwkJCWR6LT5kel9uZW50LS07CisJCX0gZWxzZSB7CisJCQlmLT5mbl9zdGF0ZSB8PSBETl9TX1pPTUJJRTsKKwkJCWlmIChmLT5mbl9zdGF0ZSAmIEROX1NfQUNDRVNTRUQpIHsKKwkJCQlmLT5mbl9zdGF0ZSAmPSB+RE5fU19BQ0NFU1NFRDsKKwkJCQlkbl9ydF9jYWNoZV9mbHVzaCgtMSk7CisJCQl9CisJCQlpZiAoKytkbl9maWJfaGFzaF96b21iaWVzID4gMTI4KQorCQkJCWRuX2ZpYl9mbHVzaCgpOworCQl9CisKKwkJcmV0dXJuIDA7CisJfQorCisgICAgICAgIHJldHVybiAtRVNSQ0g7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRuX2ZsdXNoX2xpc3Qoc3RydWN0IGRuX2ZpYl9ub2RlICoqZnAsIGludCB6LCBzdHJ1Y3QgZG5faGFzaCAqdGFibGUpCit7CisJaW50IGZvdW5kID0gMDsKKwlzdHJ1Y3QgZG5fZmliX25vZGUgKmY7CisKKwl3aGlsZSgoZiA9ICpmcCkgIT0gTlVMTCkgeworCQlzdHJ1Y3QgZG5fZmliX2luZm8gKmZpID0gRE5fRklCX0lORk8oZik7CisKKwkJaWYgKGZpICYmICgoZi0+Zm5fc3RhdGUgJiBETl9TX1pPTUJJRSkgfHwgKGZpLT5maWJfZmxhZ3MgJiBSVE5IX0ZfREVBRCkpKSB7CisJCQl3cml0ZV9sb2NrX2JoKCZkbl9maWJfdGFibGVzX2xvY2spOworCQkJKmZwID0gZi0+Zm5fbmV4dDsKKwkJCXdyaXRlX3VubG9ja19iaCgmZG5fZmliX3RhYmxlc19sb2NrKTsKKworCQkJZG5fZnJlZV9ub2RlKGYpOworCQkJZm91bmQrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZwID0gJmYtPmZuX25leHQ7CisJfQorCisJcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgaW50IGRuX2ZpYl90YWJsZV9mbHVzaChzdHJ1Y3QgZG5fZmliX3RhYmxlICp0YikKK3sKKwlzdHJ1Y3QgZG5faGFzaCAqdGFibGUgPSAoc3RydWN0IGRuX2hhc2ggKil0Yi0+ZGF0YTsKKwlzdHJ1Y3QgZG5fem9uZSAqZHo7CisJaW50IGZvdW5kID0gMDsKKworCWRuX2ZpYl9oYXNoX3pvbWJpZXMgPSAwOworCWZvcihkeiA9IHRhYmxlLT5kaF96b25lX2xpc3Q7IGR6OyBkeiA9IGR6LT5kel9uZXh0KSB7CisJCWludCBpOworCQlpbnQgdG1wID0gMDsKKwkJZm9yKGkgPSBkei0+ZHpfZGl2aXNvci0xOyBpID49IDA7IGktLSkKKwkJCXRtcCArPSBkbl9mbHVzaF9saXN0KCZkei0+ZHpfaGFzaFtpXSwgZHotPmR6X29yZGVyLCB0YWJsZSk7CisJCWR6LT5kel9uZW50IC09IHRtcDsKKwkJZm91bmQgKz0gdG1wOworCX0KKworCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIGludCBkbl9maWJfdGFibGVfbG9va3VwKHN0cnVjdCBkbl9maWJfdGFibGUgKnRiLCBjb25zdCBzdHJ1Y3QgZmxvd2kgKmZscCwgc3RydWN0IGRuX2ZpYl9yZXMgKnJlcykKK3sKKyAgICAgICAgaW50IGVycjsKKwlzdHJ1Y3QgZG5fem9uZSAqZHo7CisJc3RydWN0IGRuX2hhc2ggKnQgPSAoc3RydWN0IGRuX2hhc2ggKil0Yi0+ZGF0YTsKKworCXJlYWRfbG9jaygmZG5fZmliX3RhYmxlc19sb2NrKTsKKwlmb3IoZHogPSB0LT5kaF96b25lX2xpc3Q7IGR6OyBkeiA9IGR6LT5kel9uZXh0KSB7CisJCXN0cnVjdCBkbl9maWJfbm9kZSAqZjsKKwkJZG5fZmliX2tleV90IGsgPSBkel9rZXkoZmxwLT5mbGRfZHN0LCBkeik7CisKKwkJZm9yKGYgPSBkel9jaGFpbihrLCBkeik7IGY7IGYgPSBmLT5mbl9uZXh0KSB7CisJCQlpZiAoIWRuX2tleV9lcShrLCBmLT5mbl9rZXkpKSB7CisJCQkJaWYgKGRuX2tleV9sZXEoaywgZi0+Zm5fa2V5KSkKKwkJCQkJYnJlYWs7CisJCQkJZWxzZQorCQkJCQljb250aW51ZTsKKwkJCX0KKworCQkJZi0+Zm5fc3RhdGUgfD0gRE5fU19BQ0NFU1NFRDsKKworCQkJaWYgKGYtPmZuX3N0YXRlJkROX1NfWk9NQklFKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoZi0+Zm5fc2NvcGUgPCBmbHAtPmZsZF9zY29wZSkKKwkJCQljb250aW51ZTsKKworCQkJZXJyID0gZG5fZmliX3NlbWFudGljX21hdGNoKGYtPmZuX3R5cGUsIEROX0ZJQl9JTkZPKGYpLCBmbHAsIHJlcyk7CisKKwkJCWlmIChlcnIgPT0gMCkgeworCQkJCXJlcy0+dHlwZSA9IGYtPmZuX3R5cGU7CisJCQkJcmVzLT5zY29wZSA9IGYtPmZuX3Njb3BlOyAKKwkJCQlyZXMtPnByZWZpeGxlbiA9IGR6LT5kel9vcmRlcjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWlmIChlcnIgPCAwKQorCQkJCWdvdG8gb3V0OworCQl9CisJfQorCWVyciA9IDE7CitvdXQ6CisJcmVhZF91bmxvY2soJmRuX2ZpYl90YWJsZXNfbG9jayk7CisgICAgICAgIHJldHVybiBlcnI7Cit9CisKKworc3RydWN0IGRuX2ZpYl90YWJsZSAqZG5fZmliX2dldF90YWJsZShpbnQgbiwgaW50IGNyZWF0ZSkKK3sKKyAgICAgICAgc3RydWN0IGRuX2ZpYl90YWJsZSAqdDsKKworICAgICAgICBpZiAobiA8IFJUX1RBQkxFX01JTikKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICBpZiAobiA+IFJUX1RBQkxFX01BWCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICBpZiAoZG5fZmliX3RhYmxlc1tuXSkgCisgICAgICAgICAgICAgICAgcmV0dXJuIGRuX2ZpYl90YWJsZXNbbl07CisKKyAgICAgICAgaWYgKCFjcmVhdGUpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgaWYgKGluX2ludGVycnVwdCgpICYmIG5ldF9yYXRlbGltaXQoKSkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJERUNuZXQ6IEJVRyEgQXR0ZW1wdCB0byBjcmVhdGUgcm91dGluZyB0YWJsZSBmcm9tIGludGVycnVwdFxuIik7IAorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICgodCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkbl9maWJfdGFibGUpICsgc2l6ZW9mKHN0cnVjdCBkbl9oYXNoKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgbWVtc2V0KHQsIDAsIHNpemVvZihzdHJ1Y3QgZG5fZmliX3RhYmxlKSk7CisKKyAgICAgICAgdC0+biA9IG47CisgICAgICAgIHQtPmluc2VydCA9IGRuX2ZpYl90YWJsZV9pbnNlcnQ7CisgICAgICAgIHQtPmRlbGV0ZSA9IGRuX2ZpYl90YWJsZV9kZWxldGU7CisgICAgICAgIHQtPmxvb2t1cCA9IGRuX2ZpYl90YWJsZV9sb29rdXA7CisgICAgICAgIHQtPmZsdXNoICA9IGRuX2ZpYl90YWJsZV9mbHVzaDsKKyAgICAgICAgdC0+ZHVtcCA9IGRuX2ZpYl90YWJsZV9kdW1wOworCW1lbXNldCh0LT5kYXRhLCAwLCBzaXplb2Yoc3RydWN0IGRuX2hhc2gpKTsKKyAgICAgICAgZG5fZmliX3RhYmxlc1tuXSA9IHQ7CisKKyAgICAgICAgcmV0dXJuIHQ7Cit9CisKK3N0YXRpYyB2b2lkIGRuX2ZpYl9kZWxfdHJlZShpbnQgbikKK3sKKyAgICAgICAgc3RydWN0IGRuX2ZpYl90YWJsZSAqdDsKKworICAgICAgICB3cml0ZV9sb2NrKCZkbl9maWJfdGFibGVzX2xvY2spOworICAgICAgICB0ID0gZG5fZmliX3RhYmxlc1tuXTsKKyAgICAgICAgZG5fZmliX3RhYmxlc1tuXSA9IE5VTEw7CisgICAgICAgIHdyaXRlX3VubG9jaygmZG5fZmliX3RhYmxlc19sb2NrKTsKKworICAgICAgICBpZiAodCkgeworICAgICAgICAgICAgICAgIGtmcmVlKHQpOworICAgICAgICB9Cit9CisKK3N0cnVjdCBkbl9maWJfdGFibGUgKmRuX2ZpYl9lbXB0eV90YWJsZSh2b2lkKQoreworICAgICAgICBpbnQgaWQ7CisKKyAgICAgICAgZm9yKGlkID0gUlRfVEFCTEVfTUlOOyBpZCA8PSBSVF9UQUJMRV9NQVg7IGlkKyspCisgICAgICAgICAgICAgICAgaWYgKGRuX2ZpYl90YWJsZXNbaWRdID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG5fZmliX2dldF90YWJsZShpZCwgMSk7CisgICAgICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIF9faW5pdCBkbl9maWJfdGFibGVfaW5pdCh2b2lkKQoreworCWRuX2hhc2hfa21lbSA9IGttZW1fY2FjaGVfY3JlYXRlKCJkbl9maWJfaW5mb19jYWNoZSIsCisJCQkJCXNpemVvZihzdHJ1Y3QgZG5fZmliX2luZm8pLAorCQkJCQkwLCBTTEFCX0hXQ0FDSEVfQUxJR04sCisJCQkJCU5VTEwsIE5VTEwpOworfQorCit2b2lkIF9fZXhpdCBkbl9maWJfdGFibGVfY2xlYW51cCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gUlRfVEFCTEVfTUlOOyBpIDw9IFJUX1RBQkxFX01BWDsgKytpKQorCQlkbl9maWJfZGVsX3RyZWUoaSk7CisKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX3RpbWVyLmMgYi9uZXQvZGVjbmV0L2RuX3RpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk4MjU3MQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9kZWNuZXQvZG5fdGltZXIuYwpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIERFQ25ldCAgICAgICBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgREVDbmV0IHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqICAgICAgICAgICAgICBvcGVyYXRpbmcgc3lzdGVtLiAgREVDbmV0IGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICogICAgICAgICAgICAgIGludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqICAgICAgICAgICAgICBERUNuZXQgU29ja2V0IFRpbWVyIEZ1bmN0aW9ucworICoKKyAqIEF1dGhvcjogICAgICBTdGV2ZSBXaGl0ZWhvdXNlIDxTdGV2ZVdAQUNNLm9yZz4KKyAqCisgKgorICogQ2hhbmdlczoKKyAqICAgICAgIFN0ZXZlIFdoaXRlaG91c2UgICAgICA6IE1hZGUga2VlcGFsaXZlIHRpbWVyIHBhcnQgb2YgdGhlIHNhbWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVyIGlkZWEuCisgKiAgICAgICBTdGV2ZSBXaGl0ZWhvdXNlICAgICAgOiBBZGRlZCBjaGVja3MgZm9yIHNrLT5zb2NrX3JlYWRlcnMKKyAqICAgICAgIERhdmlkIFMuIE1pbGxlciAgICAgICA6IE5ldyBzb2NrZXQgbG9ja2luZworICogICAgICAgU3RldmUgV2hpdGVob3VzZSAgICAgIDogVGltZXIgZ3JhYnMgc29ja2V0IHJlZi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxuZXQvZmxvdy5oPgorI2luY2x1ZGUgPG5ldC9kbi5oPgorCisvKgorICogU2xvdyB0aW1lciBpcyBmb3IgZXZlcnl0aGluZyBlbHNlIChuICogNTAwbVMpCisgKi8KKworI2RlZmluZSBTTE9XX0lOVEVSVkFMIChIWi8yKQorCitzdGF0aWMgdm9pZCBkbl9zbG93X3RpbWVyKHVuc2lnbmVkIGxvbmcgYXJnKTsKKwordm9pZCBkbl9zdGFydF9zbG93X3RpbWVyKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzay0+c2tfdGltZXIuZXhwaXJlcwk9IGppZmZpZXMgKyBTTE9XX0lOVEVSVkFMOworCXNrLT5za190aW1lci5mdW5jdGlvbgk9IGRuX3Nsb3dfdGltZXI7CisJc2stPnNrX3RpbWVyLmRhdGEJPSAodW5zaWduZWQgbG9uZylzazsKKworCWFkZF90aW1lcigmc2stPnNrX3RpbWVyKTsKK30KKwordm9pZCBkbl9zdG9wX3Nsb3dfdGltZXIoc3RydWN0IHNvY2sgKnNrKQoreworCWRlbF90aW1lcigmc2stPnNrX3RpbWVyKTsKK30KKworc3RhdGljIHZvaWQgZG5fc2xvd190aW1lcih1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSAoc3RydWN0IHNvY2sgKilhcmc7CisJc3RydWN0IGRuX3NjcCAqc2NwID0gRE5fU0soc2spOworCisJc29ja19ob2xkKHNrKTsKKwliaF9sb2NrX3NvY2soc2spOworCisJaWYgKHNvY2tfb3duZWRfYnlfdXNlcihzaykpIHsKKwkJc2stPnNrX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFogLyAxMDsKKwkJYWRkX3RpbWVyKCZzay0+c2tfdGltZXIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFRoZSBwZXJzaXN0IHRpbWVyIGlzIHRoZSBzdGFuZGFyZCBzbG93IHRpbWVyIHVzZWQgZm9yIHJldHJhbnNtaXRzCisJICogaW4gYm90aCBjb25uZWN0aW9uIGVzdGFibGlzaG1lbnQgYW5kIGRpc2Nvbm5lY3Rpb24gYXMgd2VsbCBhcworCSAqIGluIHRoZSBSVU4gc3RhdGUuIFRoZSBkaWZmZXJlbnQgc3RhdGVzIGFyZSBjYXRlcmVkIGZvciBieSBjaGFuZ2luZworCSAqIHRoZSBmdW5jdGlvbiBwb2ludGVyIGluIHRoZSBzb2NrZXQuIFNldHRpbmcgdGhlIHRpbWVyIHRvIGEgdmFsdWUKKwkgKiBvZiB6ZXJvIHR1cm5zIGl0IG9mZi4gV2UgYWxsb3cgdGhlIHBlcnNpc3RfZnhuIHRvIHR1cm4gdGhlCisJICogdGltZXIgb2ZmIGluIGEgcGVybWFudCB3YXkgYnkgcmV0dXJuaW5nIG5vbi16ZXJvLCBzbyB0aGF0CisJICogdGltZXIgYmFzZWQgcm91dGluZXMgbWF5IHJlbW92ZSBzb2NrZXRzLiBUaGlzIGlzIHdoeSB3ZSBoYXZlIGEKKwkgKiBzb2NrX2hvbGQoKS9zb2NrX3B1dCgpIGFyb3VuZCB0aGUgdGltZXIgdG8gcHJldmVudCB0aGUgc29ja2V0CisJICogZ29pbmcgYXdheSBpbiB0aGUgbWlkZGxlLgorCSAqLworCWlmIChzY3AtPnBlcnNpc3QgJiYgc2NwLT5wZXJzaXN0X2Z4bikgeworCQlpZiAoc2NwLT5wZXJzaXN0IDw9IFNMT1dfSU5URVJWQUwpIHsKKwkJCXNjcC0+cGVyc2lzdCA9IDA7CisKKwkJCWlmIChzY3AtPnBlcnNpc3RfZnhuKHNrKSkKKwkJCQlnb3RvIG91dDsKKwkJfSBlbHNlIHsKKwkJCXNjcC0+cGVyc2lzdCAtPSBTTE9XX0lOVEVSVkFMOworCQl9CisJfQorCisJLyoKKwkgKiBDaGVjayBmb3Iga2VlcGFsaXZlIHRpbWVvdXQuIEFmdGVyIHRoZSBvdGhlciB0aW1lciAnY29zIGlmCisJICogdGhlIHByZXZpb3VzIHRpbWVyIGNhdXNlZCBhIHJldHJhbnNtaXQsIHdlIGRvbid0IG5lZWQgdG8KKwkgKiBkbyB0aGlzLiBzY3AtPnN0YW1wIGlzIHRoZSBsYXN0IHRpbWUgdGhhdCB3ZSBzZW50IGEgcGFja2V0LgorCSAqIFRoZSBrZWVwYWxpdmUgZnVuY3Rpb24gc2VuZHMgYSBsaW5rIHNlcnZpY2UgcGFja2V0IHRvIHRoZQorCSAqIG90aGVyIGVuZC4gSWYgaXQgcmVtYWlucyB1bmFja25vd2xlZGdlZCwgdGhlIHN0YW5kYXJkCisJICogc29ja2V0IHRpbWVycyB3aWxsIGV2ZW50dWFsbHkgc2h1dCB0aGUgc29ja2V0IGRvd24uIEVhY2gKKwkgKiB0aW1lIHdlIGRvIHRoaXMsIHNjcC0+c3RhbXAgd2lsbCBiZSB1cGRhdGVkLCB0aHVzCisJICogd2Ugd29uJ3QgdHJ5IGFuZCBzZW5kIGFub3RoZXIgdW50aWwgc2NwLT5rZWVwYWxpdmUgaGFzIHBhc3NlZAorCSAqIHNpbmNlIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgdHJhbnNtaXNzaW9uLgorCSAqLworCWlmIChzY3AtPmtlZXBhbGl2ZSAmJiBzY3AtPmtlZXBhbGl2ZV9meG4gJiYgKHNjcC0+c3RhdGUgPT0gRE5fUlVOKSkgeworCQlpZiAoKGppZmZpZXMgLSBzY3AtPnN0YW1wKSA+PSBzY3AtPmtlZXBhbGl2ZSkKKwkJCXNjcC0+a2VlcGFsaXZlX2Z4bihzayk7CisJfQorCisJc2stPnNrX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgU0xPV19JTlRFUlZBTDsKKworCWFkZF90aW1lcigmc2stPnNrX3RpbWVyKTsKK291dDoKKwliaF91bmxvY2tfc29jayhzayk7CisJc29ja19wdXQoc2spOworfQpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9uZXRmaWx0ZXIvS2NvbmZpZyBiL25ldC9kZWNuZXQvbmV0ZmlsdGVyL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNkYjNmOQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9kZWNuZXQvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTAsMCArMSwxNSBAQAorIworIyBERUNuZXQgbmV0ZmlsdGVyIGNvbmZpZ3VyYXRpb24KKyMKKworbWVudSAiREVDbmV0OiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbiIKKwlkZXBlbmRzIG9uIERFQ05FVCAmJiBORVRGSUxURVIgJiYgRVhQRVJJTUVOVEFMCisKK2NvbmZpZyBERUNORVRfTkZfR1JBQlVMQVRPUgorCXRyaXN0YXRlICJSb3V0aW5nIG1lc3NhZ2UgZ3JhYnVsYXRvciAoZm9yIHVzZXJsYW5kIHJvdXRpbmcgZGFlbW9uKSIKKwloZWxwCisJICBFbmFibGUgdGhpcyBtb2R1bGUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSB1c2VybGFuZCBERUNuZXQgcm91dGluZworCSAgZGFlbW9uLiBZb3Ugd2lsbCBhbHNvIG5lZWQgdG8gZW5hYmxlIHJvdXRpbmcgc3VwcG9ydCBmb3IgREVDbmV0CisJICB1bmxlc3MgeW91IGp1c3Qgd2FudCB0byBtb25pdG9yIHJvdXRpbmcgbWVzc2FnZXMgZnJvbSBvdGhlciBub2Rlcy4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUgYi9uZXQvZGVjbmV0L25ldGZpbHRlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTVjMWFlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2RlY25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUKQEAgLTAsMCArMSw2IEBACisjCisjIE1ha2VmaWxlIGZvciBERUNuZXQgbmV0ZmlsdGVyIG1vZHVsZXMKKyMKKworb2JqLSQoQ09ORklHX0RFQ05FVF9ORl9HUkFCVUxBVE9SKSArPSBkbl9ydG1zZy5vCisKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvbmV0ZmlsdGVyL2RuX3J0bXNnLmMgYi9uZXQvZGVjbmV0L25ldGZpbHRlci9kbl9ydG1zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NmE2MjUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvZGVjbmV0L25ldGZpbHRlci9kbl9ydG1zZy5jCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogREVDbmV0ICAgICAgIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBERUNuZXQgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICogICAgICAgICAgICAgIG9wZXJhdGluZyBzeXN0ZW0uICBERUNuZXQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKiAgICAgICAgICAgICAgaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICogICAgICAgICAgICAgIERFQ25ldCBSb3V0aW5nIE1lc3NhZ2UgR3JhYnVsYXRvcgorICoKKyAqICAgICAgICAgICAgICAoQykgMjAwMCBDaHlHd3luIExpbWl0ZWQgIC0gIGh0dHA6Ly93d3cuY2h5Z3d5bi5jb20vCisgKiAgICAgICAgICAgICAgVGhpcyBjb2RlIG1heSBiZSBjb3BpZWQgdW5kZXIgdGhlIEdQTCB2LjIgb3IgYXQgeW91ciBvcHRpb24KKyAqICAgICAgICAgICAgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3I6ICAgICAgU3RldmVuIFdoaXRlaG91c2UgPHN0ZXZlQGNoeWd3eW4uY29tPgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2Zsb3cuaD4KKyNpbmNsdWRlIDxuZXQvZG4uaD4KKyNpbmNsdWRlIDxuZXQvZG5fcm91dGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9kZWNuZXQuaD4KKworc3RhdGljIHN0cnVjdCBzb2NrICpkbnJtZyA9IE5VTEw7CisKKworc3RhdGljIHN0cnVjdCBza19idWZmICpkbnJtZ19idWlsZF9tZXNzYWdlKHN0cnVjdCBza19idWZmICpydF9za2IsIGludCAqZXJycCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlzaXplX3Qgc2l6ZTsKKwl1bnNpZ25lZCBjaGFyICpvbGRfdGFpbDsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisJc3RydWN0IG5mX2RuX3J0bXNnICpydG07CisKKwlzaXplID0gTkxNU0dfU1BBQ0UocnRfc2tiLT5sZW4pOworCXNpemUgKz0gTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBuZl9kbl9ydG1zZykpOworCXNrYiA9IGFsbG9jX3NrYihzaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJZ290byBubG1zZ19mYWlsdXJlOworCW9sZF90YWlsID0gc2tiLT50YWlsOworCW5saCA9IE5MTVNHX1BVVChza2IsIDAsIDAsIDAsIHNpemUgLSBzaXplb2YoKm5saCkpOworCXJ0bSA9IChzdHJ1Y3QgbmZfZG5fcnRtc2cgKilOTE1TR19EQVRBKG5saCk7CisJcnRtLT5uZmRuX2lmaW5kZXggPSBydF9za2ItPmRldi0+aWZpbmRleDsKKwlwdHIgPSBORkROX1JUTVNHKHJ0bSk7CisJbWVtY3B5KHB0ciwgcnRfc2tiLT5kYXRhLCBydF9za2ItPmxlbik7CisJbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBvbGRfdGFpbDsKKwlyZXR1cm4gc2tiOworCitubG1zZ19mYWlsdXJlOgorCWlmIChza2IpCisJCWtmcmVlX3NrYihza2IpOworCSplcnJwID0gLUVOT01FTTsKKwlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQlwcmludGsoS0VSTl9FUlIgImRuX3J0bXNnOiBlcnJvciBjcmVhdGluZyBuZXRsaW5rIG1lc3NhZ2VcbiIpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBkbnJtZ19zZW5kX3BlZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgZ3JvdXAgPSAwOworCXVuc2lnbmVkIGNoYXIgZmxhZ3MgPSAqc2tiLT5kYXRhOworCisJc3dpdGNoKGZsYWdzICYgRE5fUlRfQ05UTF9NU0spIHsKKwkJY2FzZSBETl9SVF9QS1RfTDFSVDoKKwkJCWdyb3VwID0gRE5STUdfTDFfR1JPVVA7CisJCQlicmVhazsKKwkJY2FzZSBETl9SVF9QS1RfTDJSVDoKKwkJCWdyb3VwID0gRE5STUdfTDJfR1JPVVA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybjsKKwl9CisKKwlza2IyID0gZG5ybWdfYnVpbGRfbWVzc2FnZShza2IsICZzdGF0dXMpOworCWlmIChza2IyID09IE5VTEwpCisJCXJldHVybjsKKwlORVRMSU5LX0NCKHNrYjIpLmRzdF9ncm91cHMgPSBncm91cDsKKwluZXRsaW5rX2Jyb2FkY2FzdChkbnJtZywgc2tiMiwgMCwgZ3JvdXAsIEdGUF9BVE9NSUMpOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZG5ybWdfaG9vayh1bnNpZ25lZCBpbnQgaG9vaywKKwkJCXN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQlpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlkbnJtZ19zZW5kX3BlZXIoKnBza2IpOworCXJldHVybiBORl9BQ0NFUFQ7Cit9CisKKworI2RlZmluZSBSQ1ZfU0tCX0ZBSUwoZXJyKSBkbyB7IG5ldGxpbmtfYWNrKHNrYiwgbmxoLCAoZXJyKSk7IHJldHVybjsgfSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSB2b2lkIGRucm1nX3JlY2VpdmVfdXNlcl9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKilza2ItPmRhdGE7CisKKwlpZiAobmxoLT5ubG1zZ19sZW4gPCBzaXplb2YoKm5saCkgfHwgc2tiLT5sZW4gPCBubGgtPm5sbXNnX2xlbikKKwkJcmV0dXJuOworCisJaWYgKCFjYXBfcmFpc2VkKE5FVExJTktfQ0Ioc2tiKS5lZmZfY2FwLCBDQVBfTkVUX0FETUlOKSkKKwkJUkNWX1NLQl9GQUlMKC1FUEVSTSk7CisKKwkvKiBFdmVudHVhbGx5IHdlIG1pZ2h0IHNlbmQgcm91dGluZyBtZXNzYWdlcyB0b28gKi8KKworCVJDVl9TS0JfRkFJTCgtRUlOVkFMKTsKK30KKworc3RhdGljIHZvaWQgZG5ybWdfcmVjZWl2ZV91c2VyX3NrKHN0cnVjdCBzb2NrICpzaywgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJd2hpbGUoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpICE9IE5VTEwpIHsKKwkJZG5ybWdfcmVjZWl2ZV91c2VyX3NrYihza2IpOworCQlrZnJlZV9za2Ioc2tiKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZfaG9va19vcHMgZG5ybWdfb3BzID0geworCS5ob29rCQk9IGRucm1nX2hvb2ssCisJLnBmCQk9IFBGX0RFQ25ldCwKKwkuaG9va251bQk9IE5GX0ROX1JPVVRFLAorCS5wcmlvcml0eQk9IE5GX0ROX1BSSV9ETlJUTVNHLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWludCBydiA9IDA7CisKKwlkbnJtZyA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShORVRMSU5LX0ROUlRNU0csIGRucm1nX3JlY2VpdmVfdXNlcl9zayk7CisJaWYgKGRucm1nID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkbl9ydG1zZzogQ2Fubm90IGNyZWF0ZSBuZXRsaW5rIHNvY2tldCIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlydiA9IG5mX3JlZ2lzdGVyX2hvb2soJmRucm1nX29wcyk7CisJaWYgKHJ2KSB7CisJCXNvY2tfcmVsZWFzZShkbnJtZy0+c2tfc29ja2V0KTsKKwl9CisKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJbmZfdW5yZWdpc3Rlcl9ob29rKCZkbnJtZ19vcHMpOworCXNvY2tfcmVsZWFzZShkbnJtZy0+c2tfc29ja2V0KTsKK30KKworCitNT0RVTEVfREVTQ1JJUFRJT04oIkRFQ25ldCBSb3V0aW5nIE1lc3NhZ2UgR3JhYnVsYXRvciIpOworTU9EVUxFX0FVVEhPUigiU3RldmVuIFdoaXRlaG91c2UgPHN0ZXZlQGNoeWd3eW4uY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOworCmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L3N5c2N0bF9uZXRfZGVjbmV0LmMgYi9uZXQvZGVjbmV0L3N5c2N0bF9uZXRfZGVjbmV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJiY2E0OQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9kZWNuZXQvc3lzY3RsX25ldF9kZWNuZXQuYwpAQCAtMCwwICsxLDQ4MCBAQAorLyoKKyAqIERFQ25ldCAgICAgICBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgREVDbmV0IHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqICAgICAgICAgICAgICBvcGVyYXRpbmcgc3lzdGVtLiAgREVDbmV0IGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICogICAgICAgICAgICAgIGludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqICAgICAgICAgICAgICBERUNuZXQgc3lzY3RsIHN1cHBvcnQgZnVuY3Rpb25zCisgKgorICogQXV0aG9yOiAgICAgIFN0ZXZlIFdoaXRlaG91c2UgPFN0ZXZlV0BBQ00ub3JnPgorICoKKyAqCisgKiBDaGFuZ2VzOgorICogU3RldmUgV2hpdGVob3VzZSAtIEM5OSBjaGFuZ2VzIGFuZCBkZWZhdWx0IGRldmljZSBoYW5kbGluZworICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxuZXQvbmVpZ2hib3VyLmg+CisjaW5jbHVkZSA8bmV0L2RzdC5oPgorI2luY2x1ZGUgPG5ldC9mbG93Lmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bmV0L2RuLmg+CisjaW5jbHVkZSA8bmV0L2RuX2Rldi5oPgorI2luY2x1ZGUgPG5ldC9kbl9yb3V0ZS5oPgorCisKK2ludCBkZWNuZXRfZGVidWdfbGV2ZWw7CitpbnQgZGVjbmV0X3RpbWVfd2FpdCA9IDMwOworaW50IGRlY25ldF9kbl9jb3VudCA9IDE7CitpbnQgZGVjbmV0X2RpX2NvdW50ID0gMzsKK2ludCBkZWNuZXRfZHJfY291bnQgPSAzOworaW50IGRlY25ldF9sb2dfbWFydGlhbnMgPSAxOworaW50IGRlY25ldF9ub19mY19tYXhfY3duZCA9IE5TUF9NSU5fV0lORE9XOworCisjaWZkZWYgQ09ORklHX1NZU0NUTAorZXh0ZXJuIGludCBkZWNuZXRfZHN0X2djX2ludGVydmFsOworc3RhdGljIGludCBtaW5fZGVjbmV0X3RpbWVfd2FpdFtdID0geyA1IH07CitzdGF0aWMgaW50IG1heF9kZWNuZXRfdGltZV93YWl0W10gPSB7IDYwMCB9Oworc3RhdGljIGludCBtaW5fc3RhdGVfY291bnRbXSA9IHsgMSB9Oworc3RhdGljIGludCBtYXhfc3RhdGVfY291bnRbXSA9IHsgTlNQX01BWFJYVFNISUZUIH07CitzdGF0aWMgaW50IG1pbl9kZWNuZXRfZHN0X2djX2ludGVydmFsW10gPSB7IDEgfTsKK3N0YXRpYyBpbnQgbWF4X2RlY25ldF9kc3RfZ2NfaW50ZXJ2YWxbXSA9IHsgNjAgfTsKK3N0YXRpYyBpbnQgbWluX2RlY25ldF9ub19mY19tYXhfY3duZFtdID0geyBOU1BfTUlOX1dJTkRPVyB9Oworc3RhdGljIGludCBtYXhfZGVjbmV0X25vX2ZjX21heF9jd25kW10gPSB7IE5TUF9NQVhfV0lORE9XIH07CitzdGF0aWMgY2hhciBub2RlX25hbWVbN10gPSAiPz8/IjsKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpkbl90YWJsZV9oZWFkZXIgPSBOVUxMOworCisvKgorICogY3R5cGUuaCA6LSkKKyAqLworI2RlZmluZSBJU05VTSh4KSAoKCh4KSA+PSAnMCcpICYmICgoeCkgPD0gJzknKSkKKyNkZWZpbmUgSVNMT1dFUih4KSAoKCh4KSA+PSAnYScpICYmICgoeCkgPD0gJ3onKSkKKyNkZWZpbmUgSVNVUFBFUih4KSAoKCh4KSA+PSAnQScpICYmICgoeCkgPD0gJ1onKSkKKyNkZWZpbmUgSVNBTFBIQSh4KSAoSVNMT1dFUih4KSB8fCBJU1VQUEVSKHgpKQorI2RlZmluZSBJTlZBTElEX0VORF9DSEFSKHgpIChJU05VTSh4KSB8fCBJU0FMUEhBKHgpKQorCitzdGF0aWMgdm9pZCBzdHJpcF9pdChjaGFyICpzdHIpCit7CisJZm9yKDs7KSB7CisJCXN3aXRjaCgqc3RyKSB7CisJCQljYXNlICcgJzoKKwkJCWNhc2UgJ1xuJzoKKwkJCWNhc2UgJ1xyJzoKKwkJCWNhc2UgJzonOgorCQkJCSpzdHIgPSAwOworCQkJY2FzZSAwOgorCQkJCXJldHVybjsKKwkJfQorCQlzdHIrKzsKKwl9Cit9CisKKy8qCisgKiBTaW1wbGUgcm91dGluZSB0byBwYXJzZSBhbiBhc2NpaSBERUNuZXQgYWRkcmVzcworICogaW50byBhIG5ldHdvcmsgb3JkZXIgYWRkcmVzcy4KKyAqLworc3RhdGljIGludCBwYXJzZV9hZGRyKGRuX2FkZHJlc3MgKmFkZHIsIGNoYXIgKnN0cikKK3sKKwlkbl9hZGRyZXNzIGFyZWEsIG5vZGU7CisKKwl3aGlsZSgqc3RyICYmICFJU05VTSgqc3RyKSkgc3RyKys7CisKKwlpZiAoKnN0ciA9PSAwKQorCQlyZXR1cm4gLTE7CisKKwlhcmVhID0gKCpzdHIrKyAtICcwJyk7CisJaWYgKElTTlVNKCpzdHIpKSB7CisJCWFyZWEgKj0gMTA7CisJCWFyZWEgKz0gKCpzdHIrKyAtICcwJyk7CisJfQorCisJaWYgKCpzdHIrKyAhPSAnLicpCisJCXJldHVybiAtMTsKKworCWlmICghSVNOVU0oKnN0cikpCisJCXJldHVybiAtMTsKKworCW5vZGUgPSAqc3RyKysgLSAnMCc7CisJaWYgKElTTlVNKCpzdHIpKSB7CisJCW5vZGUgKj0gMTA7CisJCW5vZGUgKz0gKCpzdHIrKyAtICcwJyk7CisJfQorCWlmIChJU05VTSgqc3RyKSkgeworCQlub2RlICo9IDEwOworCQlub2RlICs9ICgqc3RyKysgLSAnMCcpOworCX0KKwlpZiAoSVNOVU0oKnN0cikpIHsKKwkJbm9kZSAqPSAxMDsKKwkJbm9kZSArPSAoKnN0cisrIC0gJzAnKTsKKwl9CisKKwlpZiAoKG5vZGUgPiAxMDIzKSB8fCAoYXJlYSA+IDYzKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKElOVkFMSURfRU5EX0NIQVIoKnN0cikpCisJCXJldHVybiAtMTsKKworCSphZGRyID0gZG5faHRvbnMoKGFyZWEgPDwgMTApIHwgbm9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGRuX25vZGVfYWRkcmVzc19zdHJhdGVneShjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKKwkJCQl2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAorCQkJCXZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4sCisJCQkJdm9pZCAqKmNvbnRleHQpCit7CisJc2l6ZV90IGxlbjsKKwlkbl9hZGRyZXNzIGFkZHI7CisKKwlpZiAob2xkdmFsICYmIG9sZGxlbnApIHsKKwkJaWYgKGdldF91c2VyKGxlbiwgb2xkbGVucCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGxlbikgeworCQkJaWYgKGxlbiAhPSBzaXplb2YodW5zaWduZWQgc2hvcnQpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKHB1dF91c2VyKGRlY25ldF9hZGRyZXNzLCAodW5zaWduZWQgc2hvcnQgX191c2VyICopb2xkdmFsKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKwlpZiAobmV3dmFsICYmIG5ld2xlbikgeworCQlpZiAobmV3bGVuICE9IHNpemVvZih1bnNpZ25lZCBzaG9ydCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGdldF91c2VyKGFkZHIsICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKiluZXd2YWwpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJZG5fZGV2X2RldmljZXNfb2ZmKCk7CisKKwkJZGVjbmV0X2FkZHJlc3MgPSBhZGRyOworCisJCWRuX2Rldl9kZXZpY2VzX29uKCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRuX25vZGVfYWRkcmVzc19oYW5kbGVyKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgCisJCQkJc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwKKwkJCQlzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyIGFkZHJbRE5fQVNDQlVGX0xFTl07CisJc2l6ZV90IGxlbjsKKwlkbl9hZGRyZXNzIGRuYWRkcjsKKworCWlmICghKmxlbnAgfHwgKCpwcG9zICYmICF3cml0ZSkpIHsKKwkJKmxlbnAgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAod3JpdGUpIHsKKwkJaW50IGxlbiA9ICgqbGVucCA8IEROX0FTQ0JVRl9MRU4pID8gKmxlbnAgOiAoRE5fQVNDQlVGX0xFTi0xKTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoYWRkciwgYnVmZmVyLCBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJYWRkcltsZW5dID0gMDsKKwkJc3RyaXBfaXQoYWRkcik7CisKKwkJaWYgKHBhcnNlX2FkZHIoJmRuYWRkciwgYWRkcikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlkbl9kZXZfZGV2aWNlc19vZmYoKTsKKworCQlkZWNuZXRfYWRkcmVzcyA9IGRuYWRkcjsKKworCQlkbl9kZXZfZGV2aWNlc19vbigpOworCisJCSpwcG9zICs9IGxlbjsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlkbl9hZGRyMmFzYyhkbl9udG9ocyhkZWNuZXRfYWRkcmVzcyksIGFkZHIpOworCWxlbiA9IHN0cmxlbihhZGRyKTsKKwlhZGRyW2xlbisrXSA9ICdcbic7CisKKwlpZiAobGVuID4gKmxlbnApIGxlbiA9ICpsZW5wOworCisJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGFkZHIsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJKmxlbnAgPSBsZW47CisJKnBwb3MgKz0gbGVuOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBkbl9kZWZfZGV2X3N0cmF0ZWd5KGN0bF90YWJsZSAqdGFibGUsIGludCBfX3VzZXIgKm5hbWUsIGludCBubGVuLAorCQkJCXZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCisJCQkJdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbiwKKwkJCQl2b2lkICoqY29udGV4dCkKK3sKKwlzaXplX3QgbGVuOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJY2hhciBkZXZuYW1lWzE3XTsKKwlzaXplX3QgbmFtZWw7CisJaW50IHJ2ID0gMDsKKworCWRldm5hbWVbMF0gPSAwOworCisJaWYgKG9sZHZhbCAmJiBvbGRsZW5wKSB7CisJCWlmIChnZXRfdXNlcihsZW4sIG9sZGxlbnApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChsZW4pIHsKKwkJCWRldiA9IGRuX2Rldl9nZXRfZGVmYXVsdCgpOworCQkJaWYgKGRldikgeworCQkJCXN0cmNweShkZXZuYW1lLCBkZXYtPm5hbWUpOworCQkJCWRldl9wdXQoZGV2KTsKKwkJCX0KKworCQkJbmFtZWwgPSBzdHJsZW4oZGV2bmFtZSkgKyAxOworCQkJaWYgKGxlbiA+IG5hbWVsKSBsZW4gPSBuYW1lbDsJCisKKwkJCWlmIChjb3B5X3RvX3VzZXIob2xkdmFsLCBkZXZuYW1lLCBsZW4pKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAocHV0X3VzZXIobGVuLCBvbGRsZW5wKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKworCWlmIChuZXd2YWwgJiYgbmV3bGVuKSB7CisJCWlmIChuZXdsZW4gPiAxNikKKwkJCXJldHVybiAtRTJCSUc7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGRldm5hbWUsIG5ld3ZhbCwgbmV3bGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWRldm5hbWVbbmV3bGVuXSA9IDA7CisKKwkJZGV2ID0gZGV2X2dldF9ieV9uYW1lKGRldm5hbWUpOworCQlpZiAoZGV2ID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT0RFVjsKKworCQlydiA9IC1FTk9ERVY7CisJCWlmIChkZXYtPmRuX3B0ciAhPSBOVUxMKSB7CisJCQlydiA9IGRuX2Rldl9zZXRfZGVmYXVsdChkZXYsIDEpOworCQkJaWYgKHJ2KQorCQkJCWRldl9wdXQoZGV2KTsKKwkJfQorCX0KKworCXJldHVybiBydjsKK30KKworCitzdGF0aWMgaW50IGRuX2RlZl9kZXZfaGFuZGxlcihjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIAorCQkJCXN0cnVjdCBmaWxlICogZmlscCwKKwkJCQl2b2lkIF9fdXNlciAqYnVmZmVyLAorCQkJCXNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQoreworCXNpemVfdCBsZW47CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwljaGFyIGRldm5hbWVbMTddOworCisJaWYgKCEqbGVucCB8fCAoKnBwb3MgJiYgIXdyaXRlKSkgeworCQkqbGVucCA9IDA7CisJCXJldHVybiAwOworCX0KKworCWlmICh3cml0ZSkgeworCQlpZiAoKmxlbnAgPiAxNikKKwkJCXJldHVybiAtRTJCSUc7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGRldm5hbWUsIGJ1ZmZlciwgKmxlbnApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJZGV2bmFtZVsqbGVucF0gPSAwOworCQlzdHJpcF9pdChkZXZuYW1lKTsKKworCQlkZXYgPSBkZXZfZ2V0X2J5X25hbWUoZGV2bmFtZSk7CisJCWlmIChkZXYgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PREVWOworCisJCWlmIChkZXYtPmRuX3B0ciA9PSBOVUxMKSB7CisJCQlkZXZfcHV0KGRldik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCisJCWlmIChkbl9kZXZfc2V0X2RlZmF1bHQoZGV2LCAxKSkgeworCQkJZGV2X3B1dChkZXYpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJKnBwb3MgKz0gKmxlbnA7CisKKwkJcmV0dXJuIDA7CisJfQorCisJZGV2ID0gZG5fZGV2X2dldF9kZWZhdWx0KCk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCSpsZW5wID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJc3RyY3B5KGRldm5hbWUsIGRldi0+bmFtZSk7CisJZGV2X3B1dChkZXYpOworCWxlbiA9IHN0cmxlbihkZXZuYW1lKTsKKwlkZXZuYW1lW2xlbisrXSA9ICdcbic7CisKKwlpZiAobGVuID4gKmxlbnApIGxlbiA9ICpsZW5wOworCisJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGRldm5hbWUsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJKmxlbnAgPSBsZW47CisJKnBwb3MgKz0gbGVuOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjdGxfdGFibGUgZG5fdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZSA9IE5FVF9ERUNORVRfTk9ERV9BRERSRVNTLCAKKwkJLnByb2NuYW1lID0gIm5vZGVfYWRkcmVzcyIsIAorCQkubWF4bGVuID0gNywgCisJCS5tb2RlID0gMDY0NCwgCisJCS5wcm9jX2hhbmRsZXIgPSBkbl9ub2RlX2FkZHJlc3NfaGFuZGxlciwKKwkJLnN0cmF0ZWd5ID0gZG5fbm9kZV9hZGRyZXNzX3N0cmF0ZWd5LAorCX0sCisJeworCQkuY3RsX25hbWUgPSBORVRfREVDTkVUX05PREVfTkFNRSwKKwkJLnByb2NuYW1lID0gIm5vZGVfbmFtZSIsCisJCS5kYXRhID0gbm9kZV9uYW1lLCAKKwkJLm1heGxlbiA9IDcsCisJCS5tb2RlID0gMDY0NCwKKwkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2Rvc3RyaW5nLAorCQkuc3RyYXRlZ3kgPSAmc3lzY3RsX3N0cmluZywKKwl9LAorCXsKKwkJLmN0bF9uYW1lID0gTkVUX0RFQ05FVF9ERUZBVUxUX0RFVklDRSwKKwkJLnByb2NuYW1lID0gImRlZmF1bHRfZGV2aWNlIiwgCisJCS5tYXhsZW4gPSAxNiwgCisJCS5tb2RlID0gMDY0NCwKKwkJLnByb2NfaGFuZGxlciA9IGRuX2RlZl9kZXZfaGFuZGxlciwKKwkJLnN0cmF0ZWd5ID0gZG5fZGVmX2Rldl9zdHJhdGVneSwKKwl9LAorCXsKKwkJLmN0bF9uYW1lID0gTkVUX0RFQ05FVF9USU1FX1dBSVQsCisJCS5wcm9jbmFtZSA9ICJ0aW1lX3dhaXQiLAorCQkuZGF0YSA9ICZkZWNuZXRfdGltZV93YWl0LAorCQkubWF4bGVuID0gc2l6ZW9mKGludCksCisJCS5tb2RlID0gMDY0NCwKKwkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5ID0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEgPSAmbWluX2RlY25ldF90aW1lX3dhaXQsCisJCS5leHRyYTIgPSAmbWF4X2RlY25ldF90aW1lX3dhaXQKKwl9LAorCXsKKwkJLmN0bF9uYW1lID0gTkVUX0RFQ05FVF9ETl9DT1VOVCwKKwkJLnByb2NuYW1lID0gImRuX2NvdW50IiwKKwkJLmRhdGEgPSAmZGVjbmV0X2RuX2NvdW50LAorCQkubWF4bGVuID0gc2l6ZW9mKGludCksCisJCS5tb2RlID0gMDY0NCwKKwkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5ID0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEgPSAmbWluX3N0YXRlX2NvdW50LAorCQkuZXh0cmEyID0gJm1heF9zdGF0ZV9jb3VudAorCX0sCisJeworCQkuY3RsX25hbWUgPSBORVRfREVDTkVUX0RJX0NPVU5ULAorCQkucHJvY25hbWUgPSAiZGlfY291bnQiLAorCQkuZGF0YSA9ICZkZWNuZXRfZGlfY291bnQsCisJCS5tYXhsZW4gPSBzaXplb2YoaW50KSwKKwkJLm1vZGUgPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyID0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kgPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMSA9ICZtaW5fc3RhdGVfY291bnQsCisJCS5leHRyYTIgPSAmbWF4X3N0YXRlX2NvdW50CisJfSwKKwl7CisJCS5jdGxfbmFtZSA9IE5FVF9ERUNORVRfRFJfQ09VTlQsCisJCS5wcm9jbmFtZSA9ICJkcl9jb3VudCIsCisJCS5kYXRhID0gJmRlY25ldF9kcl9jb3VudCwKKwkJLm1heGxlbiA9IHNpemVvZihpbnQpLAorCQkubW9kZSA9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneSA9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExID0gJm1pbl9zdGF0ZV9jb3VudCwKKwkJLmV4dHJhMiA9ICZtYXhfc3RhdGVfY291bnQKKwl9LAorCXsKKwkJLmN0bF9uYW1lID0gTkVUX0RFQ05FVF9EU1RfR0NfSU5URVJWQUwsCisJCS5wcm9jbmFtZSA9ICJkc3RfZ2NfaW50ZXJ2YWwiLAorCQkuZGF0YSA9ICZkZWNuZXRfZHN0X2djX2ludGVydmFsLAorCQkubWF4bGVuID0gc2l6ZW9mKGludCksCisJCS5tb2RlID0gMDY0NCwKKwkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5ID0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEgPSAmbWluX2RlY25ldF9kc3RfZ2NfaW50ZXJ2YWwsCisJCS5leHRyYTIgPSAmbWF4X2RlY25ldF9kc3RfZ2NfaW50ZXJ2YWwKKwl9LAorCXsKKwkJLmN0bF9uYW1lID0gTkVUX0RFQ05FVF9OT19GQ19NQVhfQ1dORCwKKwkJLnByb2NuYW1lID0gIm5vX2ZjX21heF9jd25kIiwKKwkJLmRhdGEgPSAmZGVjbmV0X25vX2ZjX21heF9jd25kLAorCQkubWF4bGVuID0gc2l6ZW9mKGludCksCisJCS5tb2RlID0gMDY0NCwKKwkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5ID0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEgPSAmbWluX2RlY25ldF9ub19mY19tYXhfY3duZCwKKwkJLmV4dHJhMiA9ICZtYXhfZGVjbmV0X25vX2ZjX21heF9jd25kCisJfSwKKwl7CisJCS5jdGxfbmFtZSA9IE5FVF9ERUNORVRfREVCVUdfTEVWRUwsCisJCS5wcm9jbmFtZSA9ICJkZWJ1ZyIsCisJCS5kYXRhID0gJmRlY25ldF9kZWJ1Z19sZXZlbCwKKwkJLm1heGxlbiA9IHNpemVvZihpbnQpLAorCQkubW9kZSA9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb2ludHZlYywKKwkJLnN0cmF0ZWd5ID0gJnN5c2N0bF9pbnR2ZWMsCisJfSwKKwl7MH0KK307CisKK3N0YXRpYyBjdGxfdGFibGUgZG5fZGlyX3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUgPSBORVRfREVDTkVULCAKKwkJLnByb2NuYW1lID0gImRlY25ldCIsIAorCQkubW9kZSA9IDA1NTUsIAorCQkuY2hpbGQgPSBkbl90YWJsZX0sCisJezB9Cit9OworCitzdGF0aWMgY3RsX3RhYmxlIGRuX3Jvb3RfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZSA9IENUTF9ORVQsIAorCQkucHJvY25hbWUgPSAibmV0IiwgCisJCS5tb2RlID0gMDU1NSwgCisJCS5jaGlsZCA9IGRuX2Rpcl90YWJsZQorCX0sCisJezB9Cit9OworCit2b2lkIGRuX3JlZ2lzdGVyX3N5c2N0bCh2b2lkKQoreworCWRuX3RhYmxlX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZShkbl9yb290X3RhYmxlLCAxKTsKK30KKwordm9pZCBkbl91bnJlZ2lzdGVyX3N5c2N0bCh2b2lkKQoreworCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGRuX3RhYmxlX2hlYWRlcik7Cit9CisKKyNlbHNlICAvKiBDT05GSUdfU1lTQ1RMICovCit2b2lkIGRuX3VucmVnaXN0ZXJfc3lzY3RsKHZvaWQpCit7Cit9Cit2b2lkIGRuX3JlZ2lzdGVyX3N5c2N0bCh2b2lkKQoreworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9lY29uZXQvTWFrZWZpbGUgYi9uZXQvZWNvbmV0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZjBhNzcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvZWNvbmV0L01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgRWNvbmV0IHN1cHBvcnQgY29kZS4KKyMKKworb2JqLSQoQ09ORklHX0VDT05FVCkgKz0gZWNvbmV0Lm8KKworZWNvbmV0LW9ianMgOj0gYWZfZWNvbmV0Lm8KZGlmZiAtLWdpdCBhL25ldC9lY29uZXQvYWZfZWNvbmV0LmMgYi9uZXQvZWNvbmV0L2FmX2Vjb25ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNjkxZTEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvZWNvbmV0L2FmX2Vjb25ldC5jCkBAIC0wLDAgKzEsMTEyOSBAQAorLyoKKyAqCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBY29ybiBFY29uZXQgYW5kIEFVTiBwcm90b2NvbHMuCisgKglQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvaW5ldF9jb21tb24uaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2VjLmg+CisjaW5jbHVkZSA8bmV0L3VkcC5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBlY29uZXRfb3BzOworc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkIGVjb25ldF9za2xpc3Q7CitzdGF0aWMgREVGSU5FX1JXTE9DSyhlY29uZXRfbG9jayk7CisKKy8qIFNpbmNlIHRoZXJlIGFyZSBvbmx5IDI1NiBwb3NzaWJsZSBuZXR3b3JrIG51bWJlcnMgKG9yIGZld2VyLCBkZXBlbmRzCisgICBob3cgeW91IGNvdW50KSBpdCBtYWtlcyBzZW5zZSB0byB1c2UgYSBzaW1wbGUgbG9va3VwIHRhYmxlLiAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpuZXQyZGV2X21hcFsyNTZdOworCisjZGVmaW5lIEVDX1BPUlRfSVAJMHhkMgorCisjaWZkZWYgQ09ORklHX0VDT05FVF9BVU5VRFAKK3N0YXRpYyBzcGlubG9ja190IGF1bl9xdWV1ZV9sb2NrOworc3RhdGljIHN0cnVjdCBzb2NrZXQgKnVkcHNvY2s7CisjZGVmaW5lIEFVTl9QT1JUCTB4ODAwMAorCisKK3N0cnVjdCBhdW5oZHIKK3sKKwl1bnNpZ25lZCBjaGFyIGNvZGU7CQkvKiBBVU4gbWFnaWMgcHJvdG9jb2wgYnl0ZSAqLworCXVuc2lnbmVkIGNoYXIgcG9ydDsKKwl1bnNpZ25lZCBjaGFyIGNiOworCXVuc2lnbmVkIGNoYXIgcGFkOworCXVuc2lnbmVkIGxvbmcgaGFuZGxlOworfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYXVuX3NlcTsKKworLyogUXVldWUgb2YgcGFja2V0cyB3YWl0aW5nIHRvIGJlIHRyYW5zbWl0dGVkLiAqLworc3RhdGljIHN0cnVjdCBza19idWZmX2hlYWQgYXVuX3F1ZXVlOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGFiX2NsZWFudXBfdGltZXI7CisKKyNlbmRpZgkJLyogQ09ORklHX0VDT05FVF9BVU5VRFAgKi8KKworLyogUGVyLXBhY2tldCBpbmZvcm1hdGlvbiAqLworc3RydWN0IGVjX2NiCit7CisJc3RydWN0IHNvY2thZGRyX2VjIHNlYzsKKwl1bnNpZ25lZCBsb25nIGNvb2tpZTsJCS8qIFN1cHBsaWVkIGJ5IHVzZXIuICovCisjaWZkZWYgQ09ORklHX0VDT05FVF9BVU5VRFAKKwlpbnQgZG9uZTsKKwl1bnNpZ25lZCBsb25nIHNlcTsJCS8qIFNlcXVlbmNpbmcgKi8KKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CQkvKiBUaW1lb3V0ICovCisJdW5zaWduZWQgbG9uZyBzdGFydDsJCS8qIGppZmZpZXMgKi8KKyNlbmRpZgorI2lmZGVmIENPTkZJR19FQ09ORVRfTkFUSVZFCisJdm9pZCAoKnNlbnQpKHN0cnVjdCBza19idWZmICosIGludCByZXN1bHQpOworI2VuZGlmCit9OworCitzdGF0aWMgdm9pZCBlY29uZXRfcmVtb3ZlX3NvY2tldChzdHJ1Y3QgaGxpc3RfaGVhZCAqbGlzdCwgc3RydWN0IHNvY2sgKnNrKQoreworCXdyaXRlX2xvY2tfYmgoJmVjb25ldF9sb2NrKTsKKwlza19kZWxfbm9kZV9pbml0KHNrKTsKKwl3cml0ZV91bmxvY2tfYmgoJmVjb25ldF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgZWNvbmV0X2luc2VydF9zb2NrZXQoc3RydWN0IGhsaXN0X2hlYWQgKmxpc3QsIHN0cnVjdCBzb2NrICpzaykKK3sKKwl3cml0ZV9sb2NrX2JoKCZlY29uZXRfbG9jayk7CisJc2tfYWRkX25vZGUoc2ssIGxpc3QpOworCXdyaXRlX3VubG9ja19iaCgmZWNvbmV0X2xvY2spOworfQorCisvKgorICoJUHVsbCBhIHBhY2tldCBmcm9tIG91ciByZWNlaXZlIHF1ZXVlIGFuZCBoYW5kIGl0IHRvIHRoZSB1c2VyLgorICoJSWYgbmVjZXNzYXJ5IHdlIGJsb2NrLgorICovCisKK3N0YXRpYyBpbnQgZWNvbmV0X3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXNpemVfdCBjb3BpZWQ7CisJaW50IGVycjsKKworCW1zZy0+bXNnX25hbWVsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2VjKTsKKworCS8qCisJICoJQ2FsbCB0aGUgZ2VuZXJpYyBkYXRhZ3JhbSByZWNlaXZlci4gVGhpcyBoYW5kbGVzIGFsbCBzb3J0cworCSAqCW9mIGhvcnJpYmxlIHJhY2VzIGFuZCByZS1lbnRyYW5jeSBzbyB3ZSBjYW4gZm9yZ2V0IGFib3V0IGl0CisJICoJaW4gdGhlIHByb3RvY29sIGxheWVycy4KKwkgKgorCSAqCU5vdyBpdCB3aWxsIHJldHVybiBFTkVURE9XTiwgaWYgZGV2aWNlIGhhdmUganVzdCBnb25lIGRvd24sCisJICoJYnV0IHRoZW4gaXQgd2lsbCBibG9jay4KKwkgKi8KKworCXNrYj1za2JfcmVjdl9kYXRhZ3JhbShzayxmbGFncyxmbGFncyZNU0dfRE9OVFdBSVQsJmVycik7CisKKwkvKgorCSAqCUFuIGVycm9yIG9jY3VycmVkIHNvIHJldHVybiBpdC4gQmVjYXVzZSBza2JfcmVjdl9kYXRhZ3JhbSgpIAorCSAqCWhhbmRsZXMgdGhlIGJsb2NraW5nIHdlIGRvbid0IHNlZSBhbmQgd29ycnkgYWJvdXQgYmxvY2tpbmcKKwkgKglyZXRyaWVzLgorCSAqLworCisJaWYoc2tiPT1OVUxMKQorCQlnb3RvIG91dDsKKworCS8qCisJICoJWW91IGxvc2UgYW55IGRhdGEgYmV5b25kIHRoZSBidWZmZXIgeW91IGdhdmUuIElmIGl0IHdvcnJpZXMgYQorCSAqCXVzZXIgcHJvZ3JhbSB0aGV5IGNhbiBhc2sgdGhlIGRldmljZSBmb3IgaXRzIE1UVSBhbnl3YXkuCisJICovCisKKwljb3BpZWQgPSBza2ItPmxlbjsKKwlpZiAoY29waWVkID4gbGVuKQorCXsKKwkJY29waWVkPWxlbjsKKwkJbXNnLT5tc2dfZmxhZ3N8PU1TR19UUlVOQzsKKwl9CisKKwkvKiBXZSBjYW4ndCB1c2Ugc2tiX2NvcHlfZGF0YWdyYW0gaGVyZSAqLworCWVyciA9IG1lbWNweV90b2lvdmVjKG1zZy0+bXNnX2lvdiwgc2tiLT5kYXRhLCBjb3BpZWQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZyZWU7CisJc2stPnNrX3N0YW1wID0gc2tiLT5zdGFtcDsKKworCWlmIChtc2ctPm1zZ19uYW1lKQorCQltZW1jcHkobXNnLT5tc2dfbmFtZSwgc2tiLT5jYiwgbXNnLT5tc2dfbmFtZWxlbik7CisKKwkvKgorCSAqCUZyZWUgb3IgcmV0dXJuIHRoZSBidWZmZXIgYXMgYXBwcm9wcmlhdGUuIEFnYWluIHRoaXMKKwkgKgloaWRlcyBhbGwgdGhlIHJhY2VzIGFuZCByZS1lbnRyYW5jeSBpc3N1ZXMgZnJvbSB1cy4KKwkgKi8KKwllcnIgPSBjb3BpZWQ7CisKK291dF9mcmVlOgorCXNrYl9mcmVlX2RhdGFncmFtKHNrLCBza2IpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKglCaW5kIGFuIEVjb25ldCBzb2NrZXQuCisgKi8KKworc3RhdGljIGludCBlY29uZXRfYmluZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLCBpbnQgYWRkcl9sZW4pCit7CisJc3RydWN0IHNvY2thZGRyX2VjICpzZWMgPSAoc3RydWN0IHNvY2thZGRyX2VjICopdWFkZHI7CisJc3RydWN0IHNvY2sgKnNrPXNvY2stPnNrOworCXN0cnVjdCBlY29uZXRfc29jayAqZW8gPSBlY19zayhzayk7CisJCisJLyoKKwkgKglDaGVjayBsZWdhbGl0eQorCSAqLworCSAKKwlpZiAoYWRkcl9sZW4gPCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2VjKSB8fAorCSAgICBzZWMtPnNlY19mYW1pbHkgIT0gQUZfRUNPTkVUKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkKKwllby0+Y2IJICAgID0gc2VjLT5jYjsKKwllby0+cG9ydCAgICA9IHNlYy0+cG9ydDsKKwllby0+c3RhdGlvbiA9IHNlYy0+YWRkci5zdGF0aW9uOworCWVvLT5uZXQJICAgID0gc2VjLT5hZGRyLm5ldDsKKworCXJldHVybiAwOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfRUNPTkVUX0FVTlVEUCkgfHwgZGVmaW5lZChDT05GSUdfRUNPTkVUX05BVElWRSkKKy8qCisgKglRdWV1ZSBhIHRyYW5zbWl0IHJlc3VsdCBmb3IgdGhlIHVzZXIgdG8gYmUgdG9sZCBhYm91dC4KKyAqLworCitzdGF0aWMgdm9pZCB0eF9yZXN1bHQoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBsb25nIGNvb2tpZSwgaW50IHJlc3VsdCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYWxsb2Nfc2tiKDAsIEdGUF9BVE9NSUMpOworCXN0cnVjdCBlY19jYiAqZWI7CisJc3RydWN0IHNvY2thZGRyX2VjICpzZWM7CisKKwlpZiAoc2tiID09IE5VTEwpCisJeworCQlwcmludGsoS0VSTl9ERUJVRyAiZWM6IG1lbW9yeSBzcXVlZXplLCB0cmFuc21pdCByZXN1bHQgZHJvcHBlZC5cbiIpOworCQlyZXR1cm47CisJfQorCisJZWIgPSAoc3RydWN0IGVjX2NiICopJnNrYi0+Y2I7CisJc2VjID0gKHN0cnVjdCBzb2NrYWRkcl9lYyAqKSZlYi0+c2VjOworCW1lbXNldChzZWMsIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfZWMpKTsKKwlzZWMtPmNvb2tpZSA9IGNvb2tpZTsKKwlzZWMtPnR5cGUgPSBFQ1RZUEVfVFJBTlNNSVRfU1RBVFVTIHwgcmVzdWx0OworCXNlYy0+c2VjX2ZhbWlseSA9IEFGX0VDT05FVDsKKworCWlmIChzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYikgPCAwKQorCQlrZnJlZV9za2Ioc2tiKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0VDT05FVF9OQVRJVkUKKy8qCisgKglDYWxsZWQgYnkgdGhlIEVjb25ldCBoYXJkd2FyZSBkcml2ZXIgd2hlbiBhIHBhY2tldCB0cmFuc21pdAorICoJaGFzIGNvbXBsZXRlZC4gIFRlbGwgdGhlIHVzZXIuCisgKi8KKworc3RhdGljIHZvaWQgZWNfdHhfZG9uZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmVzdWx0KQoreworCXN0cnVjdCBlY19jYiAqZWIgPSAoc3RydWN0IGVjX2NiICopJnNrYi0+Y2I7CisJdHhfcmVzdWx0KHNrYi0+c2ssIGViLT5jb29raWUsIHJlc3VsdCk7Cit9CisjZW5kaWYKKworLyoKKyAqCVNlbmQgYSBwYWNrZXQuICBXZSBoYXZlIHRvIHdvcmsgb3V0IHdoaWNoIGRldmljZSBpdCdzIGdvaW5nIG91dCBvbgorICoJYW5kIGhlbmNlIHdoZXRoZXIgdG8gdXNlIHJlYWwgRWNvbmV0IG9yIHRoZSBVRFAgZW11bGF0aW9uLgorICovCisKK3N0YXRpYyBpbnQgZWNvbmV0X3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHNvY2thZGRyX2VjICpzYWRkcj0oc3RydWN0IHNvY2thZGRyX2VjICopbXNnLT5tc2dfbmFtZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBlY19hZGRyIGFkZHI7CisJaW50IGVycjsKKwl1bnNpZ25lZCBjaGFyIHBvcnQsIGNiOworI2lmIGRlZmluZWQoQ09ORklHX0VDT05FVF9BVU5VRFApIHx8IGRlZmluZWQoQ09ORklHX0VDT05FVF9OQVRJVkUpCisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgZWNfY2IgKmViOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0VDT05FVF9BVU5VRFAKKwlzdHJ1Y3QgbXNnaGRyIHVkcG1zZzsKKwlzdHJ1Y3QgaW92ZWMgaW92W21zZy0+bXNnX2lvdmxlbisxXTsKKwlzdHJ1Y3QgYXVuaGRyIGFoOworCXN0cnVjdCBzb2NrYWRkcl9pbiB1ZHBkZXN0OworCV9fa2VybmVsX3NpemVfdCBzaXplOworCWludCBpOworCW1tX3NlZ21lbnRfdCBvbGRmczsKKyNlbmRpZgorCQkKKwkvKgorCSAqCUNoZWNrIHRoZSBmbGFncy4gCisJICovCisKKwlpZiAobXNnLT5tc2dfZmxhZ3MgJiB+KE1TR19ET05UV0FJVHxNU0dfQ01TR19DT01QQVQpKSAKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqCUdldCBhbmQgdmVyaWZ5IHRoZSBhZGRyZXNzLiAKKwkgKi8KKwkgCisJaWYgKHNhZGRyID09IE5VTEwpIHsKKwkJc3RydWN0IGVjb25ldF9zb2NrICplbyA9IGVjX3NrKHNrKTsKKworCQlhZGRyLnN0YXRpb24gPSBlby0+c3RhdGlvbjsKKwkJYWRkci5uZXQgICAgID0gZW8tPm5ldDsKKwkJcG9ydAkgICAgID0gZW8tPnBvcnQ7CisJCWNiCSAgICAgPSBlby0+Y2I7CisJfSBlbHNlIHsKKwkJaWYgKG1zZy0+bXNnX25hbWVsZW4gPCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2VjKSkgCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYWRkci5zdGF0aW9uID0gc2FkZHItPmFkZHIuc3RhdGlvbjsKKwkJYWRkci5uZXQgPSBzYWRkci0+YWRkci5uZXQ7CisJCXBvcnQgPSBzYWRkci0+cG9ydDsKKwkJY2IgPSBzYWRkci0+Y2I7CisJfQorCisJLyogTG9vayBmb3IgYSBkZXZpY2Ugd2l0aCB0aGUgcmlnaHQgbmV0d29yayBudW1iZXIuICovCisJZGV2ID0gbmV0MmRldl9tYXBbYWRkci5uZXRdOworCisJLyogSWYgbm90IGRpcmVjdGx5IHJlYWNoYWJsZSwgdXNlIHNvbWUgZGVmYXVsdCAqLworCWlmIChkZXYgPT0gTlVMTCkKKwl7CisJCWRldiA9IG5ldDJkZXZfbWFwWzBdOworCQkvKiBObyBpbnRlcmZhY2VzIGF0IGFsbD8gKi8KKwkJaWYgKGRldiA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAobGVuICsgMTUgPiBkZXYtPm10dSkKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCWlmIChkZXYtPnR5cGUgPT0gQVJQSFJEX0VDT05FVCkKKwl7CisJCS8qIFJlYWwgaGFyZHdhcmUgRWNvbmV0LiAgV2UncmUgbm90IHdvcnRoeSBldGMuICovCisjaWZkZWYgQ09ORklHX0VDT05FVF9OQVRJVkUKKwkJdW5zaWduZWQgc2hvcnQgcHJvdG8gPSAwOworCisJCWRldl9ob2xkKGRldik7CisJCQorCQlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCBsZW4rTExfUkVTRVJWRURfU1BBQ0UoZGV2KSwgCisJCQkJCSAgbXNnLT5tc2dfZmxhZ3MgJiBNU0dfRE9OVFdBSVQsICZlcnIpOworCQlpZiAoc2tiPT1OVUxMKQorCQkJZ290byBvdXRfdW5sb2NrOworCQkKKwkJc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKKwkJc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisJCQorCQllYiA9IChzdHJ1Y3QgZWNfY2IgKikmc2tiLT5jYjsKKwkJCisJCS8qIEJVRzogc2FkZHIgbWF5IGJlIE5VTEwgKi8KKwkJZWItPmNvb2tpZSA9IHNhZGRyLT5jb29raWU7CisJCWViLT5zZWMgPSAqc2FkZHI7CisJCWViLT5zZW50ID0gZWNfdHhfZG9uZTsKKworCQlpZiAoZGV2LT5oYXJkX2hlYWRlcikgeworCQkJaW50IHJlczsKKwkJCXN0cnVjdCBlY19mcmFtZWhkciAqZmg7CisJCQllcnIgPSAtRUlOVkFMOworCQkJcmVzID0gZGV2LT5oYXJkX2hlYWRlcihza2IsIGRldiwgbnRvaHMocHJvdG8pLCAKKwkJCQkJICAgICAgICZhZGRyLCBOVUxMLCBsZW4pOworCQkJLyogUG9rZSBpbiBvdXIgY29udHJvbCBieXRlIGFuZAorCQkJICAgcG9ydCBudW1iZXIuICBIYWNrLCBoYWNrLiAgKi8KKwkJCWZoID0gKHN0cnVjdCBlY19mcmFtZWhkciAqKShza2ItPmRhdGEpOworCQkJZmgtPmNiID0gY2I7CisJCQlmaC0+cG9ydCA9IHBvcnQ7CisJCQlpZiAoc29jay0+dHlwZSAhPSBTT0NLX0RHUkFNKSB7CisJCQkJc2tiLT50YWlsID0gc2tiLT5kYXRhOworCQkJCXNrYi0+bGVuID0gMDsKKwkJCX0gZWxzZSBpZiAocmVzIDwgMCkKKwkJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCQorCQkvKiBDb3B5IHRoZSBkYXRhLiBSZXR1cm5zIC1FRkFVTFQgb24gZXJyb3IgKi8KKwkJZXJyID0gbWVtY3B5X2Zyb21pb3ZlYyhza2JfcHV0KHNrYixsZW4pLCBtc2ctPm1zZ19pb3YsIGxlbik7CisJCXNrYi0+cHJvdG9jb2wgPSBwcm90bzsKKwkJc2tiLT5kZXYgPSBkZXY7CisJCXNrYi0+cHJpb3JpdHkgPSBzay0+c2tfcHJpb3JpdHk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9mcmVlOworCQkKKwkJZXJyID0gLUVORVRET1dOOworCQlpZiAoIShkZXYtPmZsYWdzICYgSUZGX1VQKSkKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCQorCQkvKgorCQkgKglOb3cgc2VuZCBpdAorCQkgKi8KKwkJCisJCWRldl9xdWV1ZV94bWl0KHNrYik7CisJCWRldl9wdXQoZGV2KTsKKwkJcmV0dXJuKGxlbik7CisKKwlvdXRfZnJlZToKKwkJa2ZyZWVfc2tiKHNrYik7CisJb3V0X3VubG9jazoKKwkJaWYgKGRldikKKwkJCWRldl9wdXQoZGV2KTsKKyNlbHNlCisJCWVyciA9IC1FUFJPVE9UWVBFOworI2VuZGlmCisJCXJldHVybiBlcnI7CisJfQorCisjaWZkZWYgQ09ORklHX0VDT05FVF9BVU5VRFAKKwkvKiBBVU4gdmlydHVhbCBFY29uZXQuICovCisKKwlpZiAodWRwc29jayA9PSBOVUxMKQorCQlyZXR1cm4gLUVORVRET1dOOwkJLyogTm8gc29ja2V0IC0gY2FuJ3Qgc2VuZCAqLworCQorCS8qIE1ha2UgdXAgYSBVRFAgZGF0YWdyYW0gYW5kIGhhbmQgaXQgb2ZmIHRvIHNvbWUgaGlnaGVyIGludGVsbGVjdC4gKi8KKworCW1lbXNldCgmdWRwZGVzdCwgMCwgc2l6ZW9mKHVkcGRlc3QpKTsKKwl1ZHBkZXN0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXVkcGRlc3Quc2luX3BvcnQgPSBodG9ucyhBVU5fUE9SVCk7CisKKwkvKiBBdCB0aGUgbW9tZW50IHdlIHVzZSB0aGUgc3R1cGlkIEFjb3JuIHNjaGVtZSBvZiBFY29uZXQgYWRkcmVzcworCSAgIHkueCBtYXBzIHRvIElQIGEuYi5jLnguICBUaGlzIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIHNvbWV0aGluZworCSAgIG1vcmUgZmxleGlibGUgYW5kIG1vcmUgYXdhcmUgb2Ygc3VibmV0IG1hc2tzLiAgKi8KKwl7CisJCXN0cnVjdCBpbl9kZXZpY2UgKmlkZXY7CisJCXVuc2lnbmVkIGxvbmcgbmV0d29yayA9IDA7CisKKwkJcmN1X3JlYWRfbG9jaygpOworCQlpZGV2ID0gX19pbl9kZXZfZ2V0KGRldik7CisJCWlmIChpZGV2KSB7CisJCQlpZiAoaWRldi0+aWZhX2xpc3QpCisJCQkJbmV0d29yayA9IG50b2hsKGlkZXYtPmlmYV9saXN0LT5pZmFfYWRkcmVzcykgJiAKKwkJCQkJMHhmZmZmZmYwMDsJCS8qICEhISAqLworCQl9CisJCXJjdV9yZWFkX3VubG9jaygpOworCQl1ZHBkZXN0LnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKG5ldHdvcmsgfCBhZGRyLnN0YXRpb24pOworCX0KKworCWFoLnBvcnQgPSBwb3J0OworCWFoLmNiID0gY2IgJiAweDdmOworCWFoLmNvZGUgPSAyOwkJLyogbWFnaWMgKi8KKwlhaC5wYWQgPSAwOworCisJLyogdGFjayBvdXIgaGVhZGVyIG9uIHRoZSBmcm9udCBvZiB0aGUgaW92ZWMgKi8KKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdW5oZHIpOworCS8qCisJICogWFhYOiB0aGF0IGlzIGIwcmtlbi4gIFdlIGNhbid0IG1peCB1c2VybGFuZCBhbmQga2VybmVsIHBvaW50ZXJzCisJICogaW4gaW92ZWMsIHNpbmNlIG9uIGEgbG90IG9mIHBsYXRmb3JtcyBjb3B5X2Zyb21fdXNlcigpIHdpbGwKKwkgKiAqbm90KiB3b3JrIHdpdGggdGhlIGtlcm5lbCBhbmQgdXNlcmxhbmQgb25lcyBhdCB0aGUgc2FtZSB0aW1lLAorCSAqIHJlZ2FyZGxlc3Mgb2Ygd2hhdCB3ZSBkbyB3aXRoIHNldF9mcygpLiAgQW5kIHdlIGFyZSB0YWxraW5nIGFib3V0CisJICogZWNvbmV0LW92ZXItZXRoZXJuZXQgaGVyZSwgc28gIml0J3Mgb25seSBBUk0gYW55d2F5IiBkb2Vzbid0CisJICogYXBwbHkuICBBbnkgc3VnZ2VzdGlvbnMgb24gZml4aW5nIHRoYXQgY29kZT8JCS0tIEFWCisJICovCisJaW92WzBdLmlvdl9iYXNlID0gKHZvaWQgKikmYWg7CisJaW92WzBdLmlvdl9sZW4gPSBzaXplOworCWZvciAoaSA9IDA7IGkgPCBtc2ctPm1zZ19pb3ZsZW47IGkrKykgeworCQl2b2lkIF9fdXNlciAqYmFzZSA9IG1zZy0+bXNnX2lvdltpXS5pb3ZfYmFzZTsKKwkJc2l6ZV90IGxlbiA9IG1zZy0+bXNnX2lvdltpXS5pb3ZfbGVuOworCQkvKiBDaGVjayBpdCBub3cgc2luY2Ugd2Ugc3dpdGNoIHRvIEtFUk5FTF9EUyBsYXRlci4gKi8KKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJhc2UsIGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaW92W2krMV0uaW92X2Jhc2UgPSBiYXNlOworCQlpb3ZbaSsxXS5pb3ZfbGVuID0gbGVuOworCQlzaXplICs9IGxlbjsKKwl9CisKKwkvKiBHZXQgYSBza2J1ZmYgKG5vIGRhdGEsIGp1c3QgaG9sZHMgb3VyIGNiIGluZm9ybWF0aW9uKSAqLworCWlmICgoc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywgMCwgCisJCQkgICAgIG1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlULCAmZXJyKSkgPT0gTlVMTCkKKwkJcmV0dXJuIGVycjsKKworCWViID0gKHN0cnVjdCBlY19jYiAqKSZza2ItPmNiOworCisJZWItPmNvb2tpZSA9IHNhZGRyLT5jb29raWU7CisJZWItPnRpbWVvdXQgPSAoNSpIWik7CisJZWItPnN0YXJ0ID0gamlmZmllczsKKwlhaC5oYW5kbGUgPSBhdW5fc2VxOworCWViLT5zZXEgPSAoYXVuX3NlcSsrKTsKKwllYi0+c2VjID0gKnNhZGRyOworCisJc2tiX3F1ZXVlX3RhaWwoJmF1bl9xdWV1ZSwgc2tiKTsKKworCXVkcG1zZy5tc2dfbmFtZSA9ICh2b2lkICopJnVkcGRlc3Q7CisJdWRwbXNnLm1zZ19uYW1lbGVuID0gc2l6ZW9mKHVkcGRlc3QpOworCXVkcG1zZy5tc2dfaW92ID0gJmlvdlswXTsKKwl1ZHBtc2cubXNnX2lvdmxlbiA9IG1zZy0+bXNnX2lvdmxlbiArIDE7CisJdWRwbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwl1ZHBtc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCXVkcG1zZy5tc2dfZmxhZ3M9MDsKKworCW9sZGZzID0gZ2V0X2ZzKCk7IHNldF9mcyhLRVJORUxfRFMpOwkvKiBNb3JlIHByaXZzIDotKSAqLworCWVyciA9IHNvY2tfc2VuZG1zZyh1ZHBzb2NrLCAmdWRwbXNnLCBzaXplKTsKKwlzZXRfZnMob2xkZnMpOworI2Vsc2UKKwllcnIgPSAtRVBST1RPVFlQRTsKKyNlbmRpZgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKglMb29rIHVwIHRoZSBhZGRyZXNzIG9mIGEgc29ja2V0LgorICovCisKK3N0YXRpYyBpbnQgZWNvbmV0X2dldG5hbWUoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwKKwkJCSAgaW50ICp1YWRkcl9sZW4sIGludCBwZWVyKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBlY29uZXRfc29jayAqZW8gPSBlY19zayhzayk7CisJc3RydWN0IHNvY2thZGRyX2VjICpzZWMgPSAoc3RydWN0IHNvY2thZGRyX2VjICopdWFkZHI7CisKKwlpZiAocGVlcikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJc2VjLT5zZWNfZmFtaWx5CSAgPSBBRl9FQ09ORVQ7CisJc2VjLT5wb3J0CSAgPSBlby0+cG9ydDsKKwlzZWMtPmFkZHIuc3RhdGlvbiA9IGVvLT5zdGF0aW9uOworCXNlYy0+YWRkci5uZXQJICA9IGVvLT5uZXQ7CisKKwkqdWFkZHJfbGVuID0gc2l6ZW9mKCpzZWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlY29uZXRfZGVzdHJveV90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHNvY2sgKnNrPShzdHJ1Y3Qgc29jayAqKWRhdGE7CisKKwlpZiAoIWF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYykgJiYKKwkgICAgIWF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykpIHsKKwkJc2tfZnJlZShzayk7CisJCXJldHVybjsKKwl9CisKKwlzay0+c2tfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAxMCAqIEhaOworCWFkZF90aW1lcigmc2stPnNrX3RpbWVyKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiZWNvbmV0IHNvY2tldCBkZXN0cm95IGRlbGF5ZWRcbiIpOworfQorCisvKgorICoJQ2xvc2UgYW4gZWNvbmV0IHNvY2tldC4KKyAqLworCitzdGF0aWMgaW50IGVjb25ldF9yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisKKwlpZiAoIXNrKQorCQlyZXR1cm4gMDsKKworCWVjb25ldF9yZW1vdmVfc29ja2V0KCZlY29uZXRfc2tsaXN0LCBzayk7CisKKwkvKgorCSAqCU5vdyB0aGUgc29ja2V0IGlzIGRlYWQuIE5vIG1vcmUgaW5wdXQgd2lsbCBhcHBlYXIuCisJICovCisKKwlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsJLyogSXQgaXMgdXNlbGVzcy4gSnVzdCBmb3Igc2FuaXR5LiAqLworCisJc29jay0+c2sgPSBOVUxMOworCXNrLT5za19zb2NrZXQgPSBOVUxMOworCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfREVBRCk7CisKKwkvKiBQdXJnZSBxdWV1ZXMgKi8KKworCXNrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCisJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgfHwKKwkgICAgYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKSkgeworCQlzay0+c2tfdGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZylzazsKKwkJc2stPnNrX3RpbWVyLmV4cGlyZXMgID0gamlmZmllcyArIEhaOworCQlzay0+c2tfdGltZXIuZnVuY3Rpb24gPSBlY29uZXRfZGVzdHJveV90aW1lcjsKKwkJYWRkX3RpbWVyKCZzay0+c2tfdGltZXIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlza19mcmVlKHNrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwcm90byBlY29uZXRfcHJvdG8gPSB7CisJLm5hbWUJICA9ICJFQ09ORVQiLAorCS5vd25lcgkgID0gVEhJU19NT0RVTEUsCisJLm9ial9zaXplID0gc2l6ZW9mKHN0cnVjdCBlY29uZXRfc29jayksCit9OworCisvKgorICoJQ3JlYXRlIGFuIEVjb25ldCBzb2NrZXQKKyAqLworCitzdGF0aWMgaW50IGVjb25ldF9jcmVhdGUoc3RydWN0IHNvY2tldCAqc29jaywgaW50IHByb3RvY29sKQoreworCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3QgZWNvbmV0X3NvY2sgKmVvOworCWludCBlcnI7CisKKwkvKiBFY29uZXQgb25seSBwcm92aWRlcyBkYXRhZ3JhbSBzZXJ2aWNlcy4gKi8KKwlpZiAoc29jay0+dHlwZSAhPSBTT0NLX0RHUkFNKQorCQlyZXR1cm4gLUVTT0NLVE5PU1VQUE9SVDsKKworCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CisKKwllcnIgPSAtRU5PQlVGUzsKKwlzayA9IHNrX2FsbG9jKFBGX0VDT05FVCwgR0ZQX0tFUk5FTCwgJmVjb25ldF9wcm90bywgMSk7CisJaWYgKHNrID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJc2stPnNrX3JldXNlID0gMTsKKwlzb2NrLT5vcHMgPSAmZWNvbmV0X29wczsKKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisKKwllbyA9IGVjX3NrKHNrKTsKKwlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKwlzay0+c2tfZmFtaWx5ID0gUEZfRUNPTkVUOworCWVvLT5udW0gPSBwcm90b2NvbDsKKworCWVjb25ldF9pbnNlcnRfc29ja2V0KCZlY29uZXRfc2tsaXN0LCBzayk7CisJcmV0dXJuKDApOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKglIYW5kbGUgRWNvbmV0IHNwZWNpZmljIGlvY3RscworICovCisKK3N0YXRpYyBpbnQgZWNfZGV2X2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlzdHJ1Y3QgZWNfZGV2aWNlICplZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHNvY2thZGRyX2VjICpzZWM7CisKKwkvKgorCSAqCUZldGNoIHRoZSBjYWxsZXIncyBpbmZvIGJsb2NrIGludG8ga2VybmVsIHNwYWNlCisJICovCisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmlmciwgYXJnLCBzaXplb2Yoc3RydWN0IGlmcmVxKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKChkZXYgPSBkZXZfZ2V0X2J5X25hbWUoaWZyLmlmcl9uYW1lKSkgPT0gTlVMTCkgCisJCXJldHVybiAtRU5PREVWOworCisJc2VjID0gKHN0cnVjdCBzb2NrYWRkcl9lYyAqKSZpZnIuaWZyX2FkZHI7CisKKwlzd2l0Y2ggKGNtZCkKKwl7CisJY2FzZSBTSU9DU0lGQUREUjoKKwkJZWRldiA9IGRldi0+ZWNfcHRyOworCQlpZiAoZWRldiA9PSBOVUxMKQorCQl7CisJCQkvKiBNYWdpYyB1cCBhIG5ldyBvbmUuICovCisJCQllZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGVjX2RldmljZSksIEdGUF9LRVJORUwpOworCQkJaWYgKGVkZXYgPT0gTlVMTCkgeworCQkJCXByaW50aygiYWZfZWM6IG1lbW9yeSBzcXVlZXplLlxuIik7CisJCQkJZGV2X3B1dChkZXYpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJbWVtc2V0KGVkZXYsIDAsIHNpemVvZihzdHJ1Y3QgZWNfZGV2aWNlKSk7CisJCQlkZXYtPmVjX3B0ciA9IGVkZXY7CisJCX0KKwkJZWxzZQorCQkJbmV0MmRldl9tYXBbZWRldi0+bmV0XSA9IE5VTEw7CisJCWVkZXYtPnN0YXRpb24gPSBzZWMtPmFkZHIuc3RhdGlvbjsKKwkJZWRldi0+bmV0ID0gc2VjLT5hZGRyLm5ldDsKKwkJbmV0MmRldl9tYXBbc2VjLT5hZGRyLm5ldF0gPSBkZXY7CisJCWlmICghbmV0MmRldl9tYXBbMF0pCisJCQluZXQyZGV2X21hcFswXSA9IGRldjsKKwkJZGV2X3B1dChkZXYpOworCQlyZXR1cm4gMDsKKworCWNhc2UgU0lPQ0dJRkFERFI6CisJCWVkZXYgPSBkZXYtPmVjX3B0cjsKKwkJaWYgKGVkZXYgPT0gTlVMTCkKKwkJeworCQkJZGV2X3B1dChkZXYpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJbWVtc2V0KHNlYywgMCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9lYykpOworCQlzZWMtPmFkZHIuc3RhdGlvbiA9IGVkZXYtPnN0YXRpb247CisJCXNlYy0+YWRkci5uZXQgPSBlZGV2LT5uZXQ7CisJCXNlYy0+c2VjX2ZhbWlseSA9IEFGX0VDT05FVDsKKwkJZGV2X3B1dChkZXYpOworCQlpZiAoY29weV90b191c2VyKGFyZywgJmlmciwgc2l6ZW9mKHN0cnVjdCBpZnJlcSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKworCWRldl9wdXQoZGV2KTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyAqCUhhbmRsZSBnZW5lcmljIGlvY3RscworICovCisKK3N0YXRpYyBpbnQgZWNvbmV0X2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisJc3dpdGNoKGNtZCkgeworCQljYXNlIFNJT0NHU1RBTVA6CisJCQlyZXR1cm4gc29ja19nZXRfdGltZXN0YW1wKHNrLCBhcmdwKTsKKworCQljYXNlIFNJT0NTSUZBRERSOgorCQljYXNlIFNJT0NHSUZBRERSOgorCQkJcmV0dXJuIGVjX2Rldl9pb2N0bChzb2NrLCBjbWQsIGFyZ3ApOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBkZXZfaW9jdGwoY21kLCBhcmdwKTsKKwl9CisJLypOT1RSRUFDSEVEKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5IGVjb25ldF9mYW1pbHlfb3BzID0geworCS5mYW1pbHkgPQlQRl9FQ09ORVQsCisJLmNyZWF0ZSA9CWVjb25ldF9jcmVhdGUsCisJLm93bmVyCT0JVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBTT0NLT1BTX1dSQVBQRUQoZWNvbmV0X29wcykgPSB7CisJLmZhbWlseSA9CVBGX0VDT05FVCwKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkucmVsZWFzZSA9CWVjb25ldF9yZWxlYXNlLAorCS5iaW5kID0JCWVjb25ldF9iaW5kLAorCS5jb25uZWN0ID0Jc29ja19ub19jb25uZWN0LAorCS5zb2NrZXRwYWlyID0Jc29ja19ub19zb2NrZXRwYWlyLAorCS5hY2NlcHQgPQlzb2NrX25vX2FjY2VwdCwKKwkuZ2V0bmFtZSA9CWVjb25ldF9nZXRuYW1lLCAKKwkucG9sbCA9CQlkYXRhZ3JhbV9wb2xsLAorCS5pb2N0bCA9CWVjb25ldF9pb2N0bCwKKwkubGlzdGVuID0Jc29ja19ub19saXN0ZW4sCisJLnNodXRkb3duID0Jc29ja19ub19zaHV0ZG93biwKKwkuc2V0c29ja29wdCA9CXNvY2tfbm9fc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdCA9CXNvY2tfbm9fZ2V0c29ja29wdCwKKwkuc2VuZG1zZyA9CWVjb25ldF9zZW5kbXNnLAorCS5yZWN2bXNnID0JZWNvbmV0X3JlY3Ztc2csCisJLm1tYXAgPQkJc29ja19ub19tbWFwLAorCS5zZW5kcGFnZSA9CXNvY2tfbm9fc2VuZHBhZ2UsCit9OworCisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KK1NPQ0tPUFNfV1JBUChlY29uZXQsIFBGX0VDT05FVCk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19FQ09ORVRfQVVOVURQKSB8fCBkZWZpbmVkKENPTkZJR19FQ09ORVRfTkFUSVZFKQorLyoKKyAqCUZpbmQgdGhlIGxpc3RlbmluZyBzb2NrZXQsIGlmIGFueSwgZm9yIHRoZSBnaXZlbiBkYXRhLgorICovCisKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqZWNfbGlzdGVuaW5nX3NvY2tldCh1bnNpZ25lZCBjaGFyIHBvcnQsIHVuc2lnbmVkIGNoYXIKKwkJCQkgc3RhdGlvbiwgdW5zaWduZWQgY2hhciBuZXQpCit7CisJc3RydWN0IHNvY2sgKnNrOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZlY29uZXRfc2tsaXN0KSB7CisJCXN0cnVjdCBlY29uZXRfc29jayAqb3B0ID0gZWNfc2soc2spOworCQlpZiAoKG9wdC0+cG9ydCA9PSBwb3J0IHx8IG9wdC0+cG9ydCA9PSAwKSAmJiAKKwkJICAgIChvcHQtPnN0YXRpb24gPT0gc3RhdGlvbiB8fCBvcHQtPnN0YXRpb24gPT0gMCkgJiYKKwkJICAgIChvcHQtPm5ldCA9PSBuZXQgfHwgb3B0LT5uZXQgPT0gMCkpCisJCQlnb3RvIGZvdW5kOworCX0KKwlzayA9IE5VTEw7Citmb3VuZDoKKwlyZXR1cm4gc2s7Cit9CisKKy8qCisgKglRdWV1ZSBhIHJlY2VpdmVkIHBhY2tldCBmb3IgYSBzb2NrZXQuCisgKi8KKworc3RhdGljIGludCBlY19xdWV1ZV9wYWNrZXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgdW5zaWduZWQgY2hhciBzdG4sIHVuc2lnbmVkIGNoYXIgbmV0LAorCQkJICAgdW5zaWduZWQgY2hhciBjYiwgdW5zaWduZWQgY2hhciBwb3J0KQoreworCXN0cnVjdCBlY19jYiAqZWIgPSAoc3RydWN0IGVjX2NiICopJnNrYi0+Y2I7CisJc3RydWN0IHNvY2thZGRyX2VjICpzZWMgPSAoc3RydWN0IHNvY2thZGRyX2VjICopJmViLT5zZWM7CisKKwltZW1zZXQoc2VjLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2VjKSk7CisJc2VjLT5zZWNfZmFtaWx5ID0gQUZfRUNPTkVUOworCXNlYy0+dHlwZSA9IEVDVFlQRV9QQUNLRVRfUkVDRUlWRUQ7CisJc2VjLT5wb3J0ID0gcG9ydDsKKwlzZWMtPmNiID0gY2I7CisJc2VjLT5hZGRyLm5ldCA9IG5ldDsKKwlzZWMtPmFkZHIuc3RhdGlvbiA9IHN0bjsKKworCXJldHVybiBzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYik7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19FQ09ORVRfQVVOVURQCisvKgorICoJU2VuZCBhbiBBVU4gcHJvdG9jb2wgcmVzcG9uc2UuIAorICovCisKK3N0YXRpYyB2b2lkIGF1bl9zZW5kX3Jlc3BvbnNlKF9fdTMyIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2VxLCBpbnQgY29kZSwgaW50IGNiKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW4gPSB7CisJCS5zaW5fZmFtaWx5ID0gQUZfSU5FVCwKKwkJLnNpbl9wb3J0ID0gaHRvbnMoQVVOX1BPUlQpLAorCQkuc2luX2FkZHIgPSB7LnNfYWRkciA9IGFkZHJ9CisJfTsKKwlzdHJ1Y3QgYXVuaGRyIGFoID0gey5jb2RlID0gY29kZSwgLmNiID0gY2IsIC5oYW5kbGUgPSBzZXF9OworCXN0cnVjdCBrdmVjIGlvdiA9IHsuaW92X2Jhc2UgPSAodm9pZCAqKSZhaCwgLmlvdl9sZW4gPSBzaXplb2YoYWgpfTsKKwlzdHJ1Y3QgbXNnaGRyIHVkcG1zZzsKKwkKKwl1ZHBtc2cubXNnX25hbWUgPSAodm9pZCAqKSZzaW47CisJdWRwbXNnLm1zZ19uYW1lbGVuID0gc2l6ZW9mKHNpbik7CisJdWRwbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwl1ZHBtc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCXVkcG1zZy5tc2dfZmxhZ3M9MDsKKworCWtlcm5lbF9zZW5kbXNnKHVkcHNvY2ssICZ1ZHBtc2csICZpb3YsIDEsIHNpemVvZihhaCkpOworfQorCisKKy8qCisgKglIYW5kbGUgaW5jb21pbmcgQVVOIHBhY2tldHMuICBXb3JrIG91dCBpZiBhbnlib2R5IHdhbnRzIHRoZW0sCisgKglhbmQgc2VuZCBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBhY2tub3dsZWRnZW1lbnRzIGFzIGFwcHJvcHJpYXRlLgorICovCisKK3N0YXRpYyB2b2lkIGF1bl9pbmNvbWluZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYXVuaGRyICphaCwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwID0gc2tiLT5uaC5pcGg7CisJdW5zaWduZWQgY2hhciBzdG4gPSBudG9obChpcC0+c2FkZHIpICYgMHhmZjsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IHNrX2J1ZmYgKm5ld3NrYjsKKwlzdHJ1Y3QgZWNfZGV2aWNlICplZGV2ID0gc2tiLT5kZXYtPmVjX3B0cjsKKworCWlmICghIGVkZXYpCisJCWdvdG8gYmFkOworCisJaWYgKChzayA9IGVjX2xpc3RlbmluZ19zb2NrZXQoYWgtPnBvcnQsIHN0biwgZWRldi0+bmV0KSkgPT0gTlVMTCkKKwkJZ290byBiYWQ7CQkvKiBOb2JvZHkgd2FudHMgaXQgKi8KKworCW5ld3NrYiA9IGFsbG9jX3NrYigobGVuIC0gc2l6ZW9mKHN0cnVjdCBhdW5oZHIpICsgMTUpICYgfjE1LCAKKwkJCSAgIEdGUF9BVE9NSUMpOworCWlmIChuZXdza2IgPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX0RFQlVHICJBVU46IG1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iKTsKKwkJLyogU2VuZCBuYWNrIGFuZCBob3BlIHNlbmRlciB0cmllcyBhZ2FpbiAqLworCQlnb3RvIGJhZDsKKwl9CisKKwltZW1jcHkoc2tiX3B1dChuZXdza2IsIGxlbiAtIHNpemVvZihzdHJ1Y3QgYXVuaGRyKSksICh2b2lkICopKGFoKzEpLCAKKwkgICAgICAgbGVuIC0gc2l6ZW9mKHN0cnVjdCBhdW5oZHIpKTsKKworCWlmIChlY19xdWV1ZV9wYWNrZXQoc2ssIG5ld3NrYiwgc3RuLCBlZGV2LT5uZXQsIGFoLT5jYiwgYWgtPnBvcnQpKQorCXsKKwkJLyogU29ja2V0IGlzIGJhbmtydXB0LiAqLworCQlrZnJlZV9za2IobmV3c2tiKTsKKwkJZ290byBiYWQ7CisJfQorCisJYXVuX3NlbmRfcmVzcG9uc2UoaXAtPnNhZGRyLCBhaC0+aGFuZGxlLCAzLCAwKTsKKwlyZXR1cm47CisKK2JhZDoKKwlhdW5fc2VuZF9yZXNwb25zZShpcC0+c2FkZHIsIGFoLT5oYW5kbGUsIDQsIDApOworfQorCisvKgorICoJSGFuZGxlIGluY29taW5nIEFVTiB0cmFuc21pdCBhY2tub3dsZWRnZW1lbnRzLiAgSWYgdGhlIHNlcXVlbmNlCisgKiAgICAgIG51bWJlciBtYXRjaGVzIHNvbWV0aGluZyBpbiBvdXIgYmFja2xvZyB0aGVuIGtpbGwgaXQgYW5kIHRlbGwKKyAqCXRoZSB1c2VyLiAgSWYgdGhlIHJlbW90ZSB0b29rIHRvbyBsb25nIHRvIHJlcGx5IHRoZW4gd2UgbWF5IGhhdmUKKyAqCWRyb3BwZWQgdGhlIHBhY2tldCBhbHJlYWR5LgorICovCisKK3N0YXRpYyB2b2lkIGF1bl90eF9hY2sodW5zaWduZWQgbG9uZyBzZXEsIGludCByZXN1bHQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBlY19jYiAqZWI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXVuX3F1ZXVlX2xvY2ssIGZsYWdzKTsKKwlza2IgPSBza2JfcGVlaygmYXVuX3F1ZXVlKTsKKwl3aGlsZSAoc2tiICYmIHNrYiAhPSAoc3RydWN0IHNrX2J1ZmYgKikmYXVuX3F1ZXVlKQorCXsKKwkJc3RydWN0IHNrX2J1ZmYgKm5ld3NrYiA9IHNrYi0+bmV4dDsKKwkJZWIgPSAoc3RydWN0IGVjX2NiICopJnNrYi0+Y2I7CisJCWlmIChlYi0+c2VxID09IHNlcSkKKwkJCWdvdG8gZm91bmRpdDsKKworCQlza2IgPSBuZXdza2I7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1bl9xdWV1ZV9sb2NrLCBmbGFncyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIkFVTjogdW5rbm93biBzZXF1ZW5jZSAlbGRcbiIsIHNlcSk7CisJcmV0dXJuOworCitmb3VuZGl0OgorCXR4X3Jlc3VsdChza2ItPnNrLCBlYi0+Y29va2llLCByZXN1bHQpOworCXNrYl91bmxpbmsoc2tiKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdW5fcXVldWVfbG9jaywgZmxhZ3MpOworCWtmcmVlX3NrYihza2IpOworfQorCisvKgorICoJRGVhbCB3aXRoIHJlY2VpdmVkIEFVTiBmcmFtZXMgLSBzb3J0IG91dCB3aGF0IHR5cGUgb2YgdGhpbmcgaXQgaXMKKyAqCWFuZCBoYW5kIGl0IHRvIHRoZSByaWdodCBmdW5jdGlvbi4KKyAqLworCitzdGF0aWMgdm9pZCBhdW5fZGF0YV9hdmFpbGFibGUoc3RydWN0IHNvY2sgKnNrLCBpbnQgc2xlbikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwlzdHJ1Y3QgYXVuaGRyICphaDsKKwlzdHJ1Y3QgaXBoZHIgKmlwOworCXNpemVfdCBsZW47CisKKwl3aGlsZSAoKHNrYiA9IHNrYl9yZWN2X2RhdGFncmFtKHNrLCAwLCAxLCAmZXJyKSkgPT0gTlVMTCkgeworCQlpZiAoZXJyID09IC1FQUdBSU4pIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiQVVOOiBubyBkYXRhIGF2YWlsYWJsZT8hIik7CisJCQlyZXR1cm47CisJCX0KKwkJcHJpbnRrKEtFUk5fREVCVUcgIkFVTjogcmVjdmZyb20oKSBlcnJvciAlZFxuIiwgLWVycik7CisJfQorCisJZGF0YSA9IHNrYi0+aC5yYXcgKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisJYWggPSAoc3RydWN0IGF1bmhkciAqKWRhdGE7CisJbGVuID0gc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisJaXAgPSBza2ItPm5oLmlwaDsKKworCXN3aXRjaCAoYWgtPmNvZGUpCisJeworCWNhc2UgMjoKKwkJYXVuX2luY29taW5nKHNrYiwgYWgsIGxlbik7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJYXVuX3R4X2FjayhhaC0+aGFuZGxlLCBFQ1RZUEVfVFJBTlNNSVRfT0spOworCQlicmVhazsKKwljYXNlIDQ6CisJCWF1bl90eF9hY2soYWgtPmhhbmRsZSwgRUNUWVBFX1RSQU5TTUlUX05PVF9MSVNURU5JTkcpOworCQlicmVhazsKKyNpZiAwCisJCS8qIFRoaXMgaXNuJ3QgcXVpdGUgcmlnaHQgeWV0LiAqLworCWNhc2UgNToKKwkJYXVuX3NlbmRfcmVzcG9uc2UoaXAtPnNhZGRyLCBhaC0+aGFuZGxlLCA2LCBhaC0+Y2IpOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0RFQlVHICJ1bmtub3duIEFVTiBwYWNrZXQgKHR5cGUgJWQpXG4iLCBkYXRhWzBdKTsKKwl9CisKKwlza2JfZnJlZV9kYXRhZ3JhbShzaywgc2tiKTsKK30KKworLyoKKyAqCUNhbGxlZCBieSB0aGUgdGltZXIgdG8gbWFuYWdlIHRoZSBBVU4gdHJhbnNtaXQgcXVldWUuICBJZiBhIHBhY2tldAorICoJd2FzIHNlbnQgdG8gYSBkZWFkIG9yIG5vbmV4aXN0ZW50IGhvc3QgdGhlbiB3ZSB3aWxsIG5ldmVyIGdldCBhbgorICoJYWNrbm93bGVkZ2VtZW50IGJhY2suICBBZnRlciBhIGZldyBzZWNvbmRzIHdlIG5lZWQgdG8gc3BvdCB0aGlzIGFuZAorICoJZHJvcCB0aGUgcGFja2V0LgorICovCisKK3N0YXRpYyB2b2lkIGFiX2NsZWFudXAodW5zaWduZWQgbG9uZyBoKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhdW5fcXVldWVfbG9jaywgZmxhZ3MpOworCXNrYiA9IHNrYl9wZWVrKCZhdW5fcXVldWUpOworCXdoaWxlIChza2IgJiYgc2tiICE9IChzdHJ1Y3Qgc2tfYnVmZiAqKSZhdW5fcXVldWUpCisJeworCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3c2tiID0gc2tiLT5uZXh0OworCQlzdHJ1Y3QgZWNfY2IgKmViID0gKHN0cnVjdCBlY19jYiAqKSZza2ItPmNiOworCQlpZiAoKGppZmZpZXMgLSBlYi0+c3RhcnQpID4gZWItPnRpbWVvdXQpCisJCXsKKwkJCXR4X3Jlc3VsdChza2ItPnNrLCBlYi0+Y29va2llLCAKKwkJCQkgIEVDVFlQRV9UUkFOU01JVF9OT1RfUFJFU0VOVCk7CisJCQlza2JfdW5saW5rKHNrYik7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJfQorCQlza2IgPSBuZXdza2I7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1bl9xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwltb2RfdGltZXIoJmFiX2NsZWFudXBfdGltZXIsIGppZmZpZXMgKyAoSFoqMikpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhdW5fdWRwX2luaXRpYWxpc2Uodm9pZCkKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmF1bl9xdWV1ZSk7CisJc3Bpbl9sb2NrX2luaXQoJmF1bl9xdWV1ZV9sb2NrKTsKKwlpbml0X3RpbWVyKCZhYl9jbGVhbnVwX3RpbWVyKTsKKwlhYl9jbGVhbnVwX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaKjIpOworCWFiX2NsZWFudXBfdGltZXIuZnVuY3Rpb24gPSBhYl9jbGVhbnVwOworCWFkZF90aW1lcigmYWJfY2xlYW51cF90aW1lcik7CisKKwltZW1zZXQoJnNpbiwgMCwgc2l6ZW9mKHNpbikpOworCXNpbi5zaW5fcG9ydCA9IGh0b25zKEFVTl9QT1JUKTsKKworCS8qIFdlIGNhbiBjb3VudCBvdXJzZWx2ZXMgbHVja3kgQWNvcm4gbWFjaGluZXMgYXJlIHRvbyBkaW0gdG8KKwkgICBzcGVhayBJUHY2LiA6LSkgKi8KKwlpZiAoKGVycm9yID0gc29ja19jcmVhdGVfa2VybihQRl9JTkVULCBTT0NLX0RHUkFNLCAwLCAmdWRwc29jaykpIDwgMCkKKwl7CisJCXByaW50aygiQVVOOiBzb2NrZXQgZXJyb3IgJWRcbiIsIC1lcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisJCisJdWRwc29jay0+c2stPnNrX3JldXNlID0gMTsKKwl1ZHBzb2NrLT5zay0+c2tfYWxsb2NhdGlvbiA9IEdGUF9BVE9NSUM7IC8qIHdlJ3JlIGdvaW5nIHRvIGNhbGwgaXQKKwkJCQkJCSAgICBmcm9tIGludGVycnVwdHMgKi8KKwkKKwllcnJvciA9IHVkcHNvY2stPm9wcy0+YmluZCh1ZHBzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJnNpbiwKKwkJCQlzaXplb2Yoc2luKSk7CisJaWYgKGVycm9yIDwgMCkKKwl7CisJCXByaW50aygiQVVOOiBiaW5kIGVycm9yICVkXG4iLCAtZXJyb3IpOworCQlnb3RvIHJlbGVhc2U7CisJfQorCisJdWRwc29jay0+c2stPnNrX2RhdGFfcmVhZHkgPSBhdW5fZGF0YV9hdmFpbGFibGU7CisKKwlyZXR1cm4gMDsKKworcmVsZWFzZToKKwlzb2NrX3JlbGVhc2UodWRwc29jayk7CisJdWRwc29jayA9IE5VTEw7CisJcmV0dXJuIGVycm9yOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRUNPTkVUX05BVElWRQorCisvKgorICoJUmVjZWl2ZSBhbiBFY29uZXQgZnJhbWUgZnJvbSBhIGRldmljZS4KKyAqLworCitzdGF0aWMgaW50IGVjb25ldF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHBhY2tldF90eXBlICpwdCkKK3sKKwlzdHJ1Y3QgZWNfZnJhbWVoZHIgKmhkcjsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IGVjX2RldmljZSAqZWRldiA9IGRldi0+ZWNfcHRyOworCisJaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09USEVSSE9TVCkKKwkJZ290byBkcm9wOworCisJaWYgKCFlZGV2KQorCQlnb3RvIGRyb3A7CisKKwlpZiAoKHNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQlyZXR1cm4gTkVUX1JYX0RST1A7CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGVjX2ZyYW1laGRyKSkpCisJCWdvdG8gZHJvcDsKKworCWhkciA9IChzdHJ1Y3QgZWNfZnJhbWVoZHIgKikgc2tiLT5kYXRhOworCisJLyogRmlyc3QgY2hlY2sgZm9yIGVuY2Fwc3VsYXRlZCBJUCAqLworCWlmIChoZHItPnBvcnQgPT0gRUNfUE9SVF9JUCkgeworCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOworCQlza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgZWNfZnJhbWVoZHIpKTsKKwkJbmV0aWZfcngoc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc2sgPSBlY19saXN0ZW5pbmdfc29ja2V0KGhkci0+cG9ydCwgaGRyLT5zcmNfc3RuLCBoZHItPnNyY19uZXQpOworCWlmICghc2spCisJCWdvdG8gZHJvcDsKKworCWlmIChlY19xdWV1ZV9wYWNrZXQoc2ssIHNrYiwgZWRldi0+bmV0LCBoZHItPnNyY19zdG4sIGhkci0+Y2IsCisJCQkgICAgaGRyLT5wb3J0KSkKKwkJZ290byBkcm9wOworCisJcmV0dXJuIDA7CisKK2Ryb3A6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIE5FVF9SWF9EUk9QOworfQorCitzdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIGVjb25ldF9wYWNrZXRfdHlwZSA9IHsKKwkudHlwZSA9CQlfX2NvbnN0YW50X2h0b25zKEVUSF9QX0VDT05FVCksCisJLmZ1bmMgPQkJZWNvbmV0X3JjdiwKK307CisKK3N0YXRpYyB2b2lkIGVjb25ldF9od19pbml0aWFsaXNlKHZvaWQpCit7CisJZGV2X2FkZF9wYWNrKCZlY29uZXRfcGFja2V0X3R5cGUpOworfQorCisjZW5kaWYKKworc3RhdGljIGludCBlY29uZXRfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIG1zZywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKwlzdHJ1Y3QgZWNfZGV2aWNlICplZGV2OworCisJc3dpdGNoIChtc2cpIHsKKwljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgorCQkvKiBBIGRldmljZSBoYXMgZ29uZSBkb3duIC0ga2lsbCBhbnkgZGF0YSB3ZSBob2xkIGZvciBpdC4gKi8KKwkJZWRldiA9IGRldi0+ZWNfcHRyOworCQlpZiAoZWRldikKKwkJeworCQkJaWYgKG5ldDJkZXZfbWFwWzBdID09IGRldikKKwkJCQluZXQyZGV2X21hcFswXSA9IE5VTEw7CisJCQluZXQyZGV2X21hcFtlZGV2LT5uZXRdID0gTlVMTDsKKwkJCWtmcmVlKGVkZXYpOworCQkJZGV2LT5lY19wdHIgPSBOVUxMOworCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBlY29uZXRfbmV0ZGV2X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID1lY29uZXRfbm90aWZpZXIsCit9OworCitzdGF0aWMgdm9pZCBfX2V4aXQgZWNvbmV0X3Byb3RvX2V4aXQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfRUNPTkVUX0FVTlVEUAorCWRlbF90aW1lcigmYWJfY2xlYW51cF90aW1lcik7CisJaWYgKHVkcHNvY2spCisJCXNvY2tfcmVsZWFzZSh1ZHBzb2NrKTsKKyNlbmRpZgorCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZlY29uZXRfbmV0ZGV2X25vdGlmaWVyKTsKKwlzb2NrX3VucmVnaXN0ZXIoZWNvbmV0X2ZhbWlseV9vcHMuZmFtaWx5KTsKKwlwcm90b191bnJlZ2lzdGVyKCZlY29uZXRfcHJvdG8pOworfQorCitzdGF0aWMgaW50IF9faW5pdCBlY29uZXRfcHJvdG9faW5pdCh2b2lkKQoreworCWludCBlcnIgPSBwcm90b19yZWdpc3RlcigmZWNvbmV0X3Byb3RvLCAwKTsKKworCWlmIChlcnIgIT0gMCkKKwkJZ290byBvdXQ7CisJc29ja19yZWdpc3RlcigmZWNvbmV0X2ZhbWlseV9vcHMpOworI2lmZGVmIENPTkZJR19FQ09ORVRfQVVOVURQCisJc3Bpbl9sb2NrX2luaXQoJmF1bl9xdWV1ZV9sb2NrKTsKKwlhdW5fdWRwX2luaXRpYWxpc2UoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FQ09ORVRfTkFUSVZFCisJZWNvbmV0X2h3X2luaXRpYWxpc2UoKTsKKyNlbmRpZgorCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmZWNvbmV0X25ldGRldl9ub3RpZmllcik7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworbW9kdWxlX2luaXQoZWNvbmV0X3Byb3RvX2luaXQpOworbW9kdWxlX2V4aXQoZWNvbmV0X3Byb3RvX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTkVUUFJPVE8oUEZfRUNPTkVUKTsKZGlmZiAtLWdpdCBhL25ldC9ldGhlcm5ldC9NYWtlZmlsZSBiL25ldC9ldGhlcm5ldC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWI3NGE5Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2V0aGVybmV0L01ha2VmaWxlCkBAIC0wLDAgKzEsOCBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IEV0aGVybmV0IGxheWVyLgorIworCitvYmoteQkJCQkJKz0gZXRoLm8KK29iai0kKENPTkZJR19TWVNDVEwpCQkJKz0gc3lzY3RsX25ldF9ldGhlci5vCitvYmotJChzdWJzdCBtLHksJChDT05GSUdfSVBYKSkJCSs9IHBlMi5vCitvYmotJChzdWJzdCBtLHksJChDT05GSUdfQVRBTEspKQkrPSBwZTIubwpkaWZmIC0tZ2l0IGEvbmV0L2V0aGVybmV0L2V0aC5jIGIvbmV0L2V0aGVybmV0L2V0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YzQyMzQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvZXRoZXJuZXQvZXRoLmMKQEAgLTAsMCArMSwzMDggQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJRXRoZXJuZXQtdHlwZSBkZXZpY2UgaGFuZGxpbmcuCisgKgorICogVmVyc2lvbjoJQCgjKWV0aC5jCTEuMC43CTA1LzI1LzkzCisgKgorICogQXV0aG9yczoJUm9zcyBCaXJvLCA8YmlyN0BsZWxhbmQuU3RhbmZvcmQuRWR1PgorICoJCUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoJCU1hcmsgRXZhbnMsIDxldmFuc21wQHVodXJhLmFzdG9uLmFjLnVrPgorICoJCUZsb3JpYW4gIExhIFJvY2hlLCA8cnpzZmxAcnoudW5pLXNiLmRlPgorICoJCUFsYW4gQ294LCA8Z3c0cHRzQGd3NHB0cy5hbXByLm9yZz4KKyAqIAorICogRml4ZXM6CisgKgkJTXIgTGludXgJOiBBcnAgcHJvYmxlbXMKKyAqCQlBbGFuIENveAk6IEdlbmVyaWMgcXVldWUgdGlkeXVwICh2ZXJ5IHRpbnkgaGVyZSkKKyAqCQlBbGFuIENveAk6IGV0aF9oZWFkZXIgbnRvaHMgc2hvdWxkIGJlIGh0b25zCisgKgkJQWxhbiBDb3gJOiBldGhfcmVidWlsZF9oZWFkZXIgbWlzc2luZyBhbiBodG9ucyBhbmQKKyAqCQkJCSAgbWlub3Igb3RoZXIgdGhpbmdzLgorICoJCVRlZ2dlCQk6IEFycCBidWcgZml4ZXMuIAorICoJCUZsb3JpYW4JCTogUmVtb3ZlZCBtYW55IHVubmVjZXNzYXJ5IGZ1bmN0aW9ucywgY29kZSBjbGVhbnVwCisgKgkJCQkgIGFuZCBjaGFuZ2VzIGZvciBuZXcgYXJwIGFuZCBza2J1ZmYuCisgKgkJQWxhbiBDb3gJOiBSZWRpZCBoZWFkZXIgYnVpbGRpbmcgdG8gcmVmbGVjdCBuZXcgZm9ybWF0LgorICoJCUFsYW4gQ294CTogQVJQIG9ubHkgd2hlbiBjb21waWxlZCB3aXRoIENPTkZJR19JTkVUCisgKgkJR3JlZyBQYWdlCTogODAyLjIgYW5kIFNOQVAgc3R1ZmYuCisgKgkJQWxhbiBDb3gJOiBNQUMgbGF5ZXIgcG9pbnRlcnMvbmV3IGZvcm1hdC4KKyAqCQlQYXVsIEdvcnRtYWtlcgk6IGV0aF9jb3B5X2FuZF9zdW0gc2hvdWxkbid0IGNzdW0gcGFkZGluZy4KKyAqCQlBbGFuIENveAk6IFByb3RlY3QgYWdhaW5zdCBmb3J3YXJkaW5nIGV4cGxvc2lvbnMgd2l0aAorICoJCQkJICBvbGRlciBuZXR3b3JrIGRyaXZlcnMgYW5kIElGRl9BTExNVUxUSS4KKyAqCUNocmlzdGVyIFdlaW5pZ2VsCTogQmV0dGVyIHJlYnVpbGQgaGVhZGVyIG1lc3NhZ2UuCisgKiAgICAgICAgICAgICBBbmRyZXcgTW9ydG9uICAgIDogMjZGZWIwMToga2lsbCBldGhlcl9zZXR1cCgpIC0gdXNlIG5ldGRldl9ib290X3NldHVwKCkuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bmV0L2RzdC5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CisKK2V4dGVybiBpbnQgX19pbml0IG5ldGRldl9ib290X3NldHVwKGNoYXIgKnN0cik7CisKK19fc2V0dXAoImV0aGVyPSIsIG5ldGRldl9ib290X3NldHVwKTsKKworLyoKKyAqCSBDcmVhdGUgdGhlIEV0aGVybmV0IE1BQyBoZWFkZXIgZm9yIGFuIGFyYml0cmFyeSBwcm90b2NvbCBsYXllciAKKyAqCisgKglzYWRkcj1OVUxMCW1lYW5zIHVzZSBkZXZpY2Ugc291cmNlIGFkZHJlc3MKKyAqCWRhZGRyPU5VTEwJbWVhbnMgbGVhdmUgZGVzdGluYXRpb24gYWRkcmVzcyAoZWcgdW5yZXNvbHZlZCBhcnApCisgKi8KKworaW50IGV0aF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdHlwZSwKKwkgICB2b2lkICpkYWRkciwgdm9pZCAqc2FkZHIsIHVuc2lnbmVkIGxlbikKK3sKKwlzdHJ1Y3QgZXRoaGRyICpldGggPSAoc3RydWN0IGV0aGhkciAqKXNrYl9wdXNoKHNrYixFVEhfSExFTik7CisKKwkvKiAKKwkgKglTZXQgdGhlIHByb3RvY29sIHR5cGUuIEZvciBhIHBhY2tldCBvZiB0eXBlIEVUSF9QXzgwMl8zIHdlIHB1dCB0aGUgbGVuZ3RoCisJICoJaW4gaGVyZSBpbnN0ZWFkLiBJdCBpcyB1cCB0byB0aGUgODAyLjIgbGF5ZXIgdG8gY2FycnkgcHJvdG9jb2wgaW5mb3JtYXRpb24uCisJICovCisJCisJaWYodHlwZSE9RVRIX1BfODAyXzMpIAorCQlldGgtPmhfcHJvdG8gPSBodG9ucyh0eXBlKTsKKwllbHNlCisJCWV0aC0+aF9wcm90byA9IGh0b25zKGxlbik7CisKKwkvKgorCSAqCVNldCB0aGUgc291cmNlIGhhcmR3YXJlIGFkZHJlc3MuIAorCSAqLworCSAKKwlpZihzYWRkcikKKwkJbWVtY3B5KGV0aC0+aF9zb3VyY2Usc2FkZHIsZGV2LT5hZGRyX2xlbik7CisJZWxzZQorCQltZW1jcHkoZXRoLT5oX3NvdXJjZSxkZXYtPmRldl9hZGRyLGRldi0+YWRkcl9sZW4pOworCisJLyoKKwkgKglBbnl3YXksIHRoZSBsb29wYmFjay1kZXZpY2Ugc2hvdWxkIG5ldmVyIHVzZSB0aGlzIGZ1bmN0aW9uLi4uIAorCSAqLworCisJaWYgKGRldi0+ZmxhZ3MgJiAoSUZGX0xPT1BCQUNLfElGRl9OT0FSUCkpIAorCXsKKwkJbWVtc2V0KGV0aC0+aF9kZXN0LCAwLCBkZXYtPmFkZHJfbGVuKTsKKwkJcmV0dXJuIEVUSF9ITEVOOworCX0KKwkKKwlpZihkYWRkcikKKwl7CisJCW1lbWNweShldGgtPmhfZGVzdCxkYWRkcixkZXYtPmFkZHJfbGVuKTsKKwkJcmV0dXJuIEVUSF9ITEVOOworCX0KKwkKKwlyZXR1cm4gLUVUSF9ITEVOOworfQorCisKKy8qCisgKglSZWJ1aWxkIHRoZSBFdGhlcm5ldCBNQUMgaGVhZGVyLiBUaGlzIGlzIGNhbGxlZCBhZnRlciBhbiBBUlAKKyAqCShvciBpbiBmdXR1cmUgb3RoZXIgYWRkcmVzcyByZXNvbHV0aW9uKSBoYXMgY29tcGxldGVkIG9uIHRoaXMKKyAqCXNrX2J1ZmYuIFdlIG5vdyBsZXQgQVJQIGZpbGwgaW4gdGhlIG90aGVyIGZpZWxkcy4KKyAqCisgKglUaGlzIHJvdXRpbmUgQ0FOTk9UIHVzZSBjYWNoZWQgZHN0LT5uZWlnaCEKKyAqCVJlYWxseSwgaXQgaXMgdXNlZCBvbmx5IHdoZW4gZHN0LT5uZWlnaCBpcyB3cm9uZy4KKyAqLworCitpbnQgZXRoX3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGV0aGhkciAqZXRoID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OworCisJc3dpdGNoIChldGgtPmhfcHJvdG8pCisJeworI2lmZGVmIENPTkZJR19JTkVUCisJY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKToKKyAJCXJldHVybiBhcnBfZmluZChldGgtPmhfZGVzdCwgc2tiKTsKKyNlbmRpZgkKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIiVzOiB1bmFibGUgdG8gcmVzb2x2ZSB0eXBlICVYIGFkZHJlc3Nlcy5cbiIsIAorCQkgICAgICAgZGV2LT5uYW1lLCAoaW50KWV0aC0+aF9wcm90byk7CisJCQorCQltZW1jcHkoZXRoLT5oX3NvdXJjZSwgZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbik7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qCisgKglEZXRlcm1pbmUgdGhlIHBhY2tldCdzIHByb3RvY29sIElELiBUaGUgcnVsZSBoZXJlIGlzIHRoYXQgd2UgCisgKglhc3N1bWUgODAyLjMgaWYgdGhlIHR5cGUgZmllbGQgaXMgc2hvcnQgZW5vdWdoIHRvIGJlIGEgbGVuZ3RoLgorICoJVGhpcyBpcyBub3JtYWwgcHJhY3RpY2UgYW5kIHdvcmtzIGZvciBhbnkgJ25vdyBpbiB1c2UnIHByb3RvY29sLgorICovCisgCit1bnNpZ25lZCBzaG9ydCBldGhfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBldGhoZHIgKmV0aDsKKwl1bnNpZ25lZCBjaGFyICpyYXdwOworCQorCXNrYi0+bWFjLnJhdz1za2ItPmRhdGE7CisJc2tiX3B1bGwoc2tiLEVUSF9ITEVOKTsKKwlldGggPSBldGhfaGRyKHNrYik7CisJc2tiLT5pbnB1dF9kZXYgPSBkZXY7CisJCisJaWYoKmV0aC0+aF9kZXN0JjEpCisJeworCQlpZihtZW1jbXAoZXRoLT5oX2Rlc3QsZGV2LT5icm9hZGNhc3QsIEVUSF9BTEVOKT09MCkKKwkJCXNrYi0+cGt0X3R5cGU9UEFDS0VUX0JST0FEQ0FTVDsKKwkJZWxzZQorCQkJc2tiLT5wa3RfdHlwZT1QQUNLRVRfTVVMVElDQVNUOworCX0KKwkKKwkvKgorCSAqCVRoaXMgQUxMTVVMVEkgY2hlY2sgc2hvdWxkIGJlIHJlZHVuZGFudCBieSAxLjQKKwkgKglzbyBkb24ndCBmb3JnZXQgdG8gcmVtb3ZlIGl0LgorCSAqCisJICoJU2VlbXMsIHlvdSBmb3Jnb3QgdG8gcmVtb3ZlIGl0LiBBbGwgc2lsbHkgZGV2aWNlcworCSAqCXNlZW1zIHRvIHNldCBJRkZfUFJPTUlTQy4KKwkgKi8KKwkgCisJZWxzZSBpZigxIC8qZGV2LT5mbGFncyZJRkZfUFJPTUlTQyovKQorCXsKKwkJaWYobWVtY21wKGV0aC0+aF9kZXN0LGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSkKKwkJCXNrYi0+cGt0X3R5cGU9UEFDS0VUX09USEVSSE9TVDsKKwl9CisJCisJaWYgKG50b2hzKGV0aC0+aF9wcm90bykgPj0gMTUzNikKKwkJcmV0dXJuIGV0aC0+aF9wcm90bzsKKwkJCisJcmF3cCA9IHNrYi0+ZGF0YTsKKwkKKwkvKgorCSAqCVRoaXMgaXMgYSBtYWdpYyBoYWNrIHRvIHNwb3QgSVBYIHBhY2tldHMuIE9sZGVyIE5vdmVsbCBicmVha3MKKwkgKgl0aGUgcHJvdG9jb2wgZGVzaWduIGFuZCBydW5zIElQWCBvdmVyIDgwMi4zIHdpdGhvdXQgYW4gODAyLjIgTExDCisJICoJbGF5ZXIuIFdlIGxvb2sgZm9yIEZGRkYgd2hpY2ggaXNuJ3QgYSB1c2VkIDgwMi4yIFNTQVAvRFNBUC4gVGhpcworCSAqCXdvbid0IHdvcmsgZm9yIGZhdWx0IHRvbGVyYW50IG5ldHdhcmUgYnV0IGRvZXMgZm9yIHRoZSByZXN0LgorCSAqLworCWlmICgqKHVuc2lnbmVkIHNob3J0ICopcmF3cCA9PSAweEZGRkYpCisJCXJldHVybiBodG9ucyhFVEhfUF84MDJfMyk7CisJCQorCS8qCisJICoJUmVhbCA4MDIuMiBMTEMKKwkgKi8KKwlyZXR1cm4gaHRvbnMoRVRIX1BfODAyXzIpOworfQorCitzdGF0aWMgaW50IGV0aF9oZWFkZXJfcGFyc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgY2hhciAqaGFkZHIpCit7CisJc3RydWN0IGV0aGhkciAqZXRoID0gZXRoX2hkcihza2IpOworCW1lbWNweShoYWRkciwgZXRoLT5oX3NvdXJjZSwgRVRIX0FMRU4pOworCXJldHVybiBFVEhfQUxFTjsKK30KKworaW50IGV0aF9oZWFkZXJfY2FjaGUoc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsIHN0cnVjdCBoaF9jYWNoZSAqaGgpCit7CisJdW5zaWduZWQgc2hvcnQgdHlwZSA9IGhoLT5oaF90eXBlOworCXN0cnVjdCBldGhoZHIgKmV0aDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmVpZ2gtPmRldjsKKworCWV0aCA9IChzdHJ1Y3QgZXRoaGRyKikKKwkJKCgodTgqKWhoLT5oaF9kYXRhKSArIChISF9EQVRBX09GRihzaXplb2YoKmV0aCkpKSk7CisKKwlpZiAodHlwZSA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMl8zKSkKKwkJcmV0dXJuIC0xOworCisJZXRoLT5oX3Byb3RvID0gdHlwZTsKKwltZW1jcHkoZXRoLT5oX3NvdXJjZSwgZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbik7CisJbWVtY3B5KGV0aC0+aF9kZXN0LCBuZWlnaC0+aGEsIGRldi0+YWRkcl9sZW4pOworCWhoLT5oaF9sZW4gPSBFVEhfSExFTjsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENhbGxlZCBieSBBZGRyZXNzIFJlc29sdXRpb24gbW9kdWxlIHRvIG5vdGlmeSBjaGFuZ2VzIGluIGFkZHJlc3MuCisgKi8KKwordm9pZCBldGhfaGVhZGVyX2NhY2hlX3VwZGF0ZShzdHJ1Y3QgaGhfY2FjaGUgKmhoLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyICogaGFkZHIpCit7CisJbWVtY3B5KCgodTgqKWhoLT5oaF9kYXRhKSArIEhIX0RBVEFfT0ZGKHNpemVvZihzdHJ1Y3QgZXRoaGRyKSksCisJICAgICAgIGhhZGRyLCBkZXYtPmFkZHJfbGVuKTsKK30KKworRVhQT1JUX1NZTUJPTChldGhfdHlwZV90cmFucyk7CisKK3N0YXRpYyBpbnQgZXRoX21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApCit7CisJc3RydWN0IHNvY2thZGRyICphZGRyPXA7CisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FQlVTWTsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSxkZXYtPmFkZHJfbGVuKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBldGhfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlpZiAoKG5ld19tdHUgPCA2OCkgfHwgKG5ld19tdHUgPiAxNTAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGV2LT5tdHUgPSBuZXdfbXR1OworCXJldHVybiAwOworfQorCisvKgorICogRmlsbCBpbiB0aGUgZmllbGRzIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlIHdpdGggZXRoZXJuZXQtZ2VuZXJpYyB2YWx1ZXMuCisgKi8KK3ZvaWQgZXRoZXJfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkZXYtPmNoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHU7CisJZGV2LT5oYXJkX2hlYWRlcgk9IGV0aF9oZWFkZXI7CisJZGV2LT5yZWJ1aWxkX2hlYWRlciAJPSBldGhfcmVidWlsZF9oZWFkZXI7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyOworCWRldi0+aGFyZF9oZWFkZXJfY2FjaGUJPSBldGhfaGVhZGVyX2NhY2hlOworCWRldi0+aGVhZGVyX2NhY2hlX3VwZGF0ZT0gZXRoX2hlYWRlcl9jYWNoZV91cGRhdGU7CisJZGV2LT5oYXJkX2hlYWRlcl9wYXJzZQk9IGV0aF9oZWFkZXJfcGFyc2U7CisKKwlkZXYtPnR5cGUJCT0gQVJQSFJEX0VUSEVSOworCWRldi0+aGFyZF9oZWFkZXJfbGVuIAk9IEVUSF9ITEVOOworCWRldi0+bXR1CQk9IDE1MDA7IC8qIGV0aF9tdHUgKi8KKwlkZXYtPmFkZHJfbGVuCQk9IEVUSF9BTEVOOworCWRldi0+dHhfcXVldWVfbGVuCT0gMTAwMDsJLyogRXRoZXJuZXQgd2FudHMgZ29vZCBxdWV1ZXMgKi8JCisJZGV2LT5mbGFncwkJPSBJRkZfQlJPQURDQVNUfElGRl9NVUxUSUNBU1Q7CisJCisJbWVtc2V0KGRldi0+YnJvYWRjYXN0LDB4RkYsIEVUSF9BTEVOKTsKKworfQorRVhQT1JUX1NZTUJPTChldGhlcl9zZXR1cCk7CisKKy8qKgorICogYWxsb2NfZXRoZXJkZXYgLSBBbGxvY2F0ZXMgYW5kIHNldHMgdXAgYW4gZXRoZXJuZXQgZGV2aWNlCisgKiBAc2l6ZW9mX3ByaXY6IFNpemUgb2YgYWRkaXRpb25hbCBkcml2ZXItcHJpdmF0ZSBzdHJ1Y3R1cmUgdG8gYmUgYWxsb2NhdGVkCisgKglmb3IgdGhpcyBldGhlcm5ldCBkZXZpY2UKKyAqCisgKiBGaWxsIGluIHRoZSBmaWVsZHMgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUgd2l0aCBldGhlcm5ldC1nZW5lcmljCisgKiB2YWx1ZXMuIEJhc2ljYWxseSBkb2VzIGV2ZXJ5dGhpbmcgZXhjZXB0IHJlZ2lzdGVyaW5nIHRoZSBkZXZpY2UuCisgKgorICogQ29uc3RydWN0cyBhIG5ldyBuZXQgZGV2aWNlLCBjb21wbGV0ZSB3aXRoIGEgcHJpdmF0ZSBkYXRhIGFyZWEgb2YKKyAqIHNpemUgQHNpemVvZl9wcml2LiAgQSAzMi1ieXRlIChub3QgYml0KSBhbGlnbm1lbnQgaXMgZW5mb3JjZWQgZm9yCisgKiB0aGlzIHByaXZhdGUgZGF0YSBhcmVhLgorICovCisKK3N0cnVjdCBuZXRfZGV2aWNlICphbGxvY19ldGhlcmRldihpbnQgc2l6ZW9mX3ByaXYpCit7CisJcmV0dXJuIGFsbG9jX25ldGRldihzaXplb2ZfcHJpdiwgImV0aCVkIiwgZXRoZXJfc2V0dXApOworfQorRVhQT1JUX1NZTUJPTChhbGxvY19ldGhlcmRldik7CmRpZmYgLS1naXQgYS9uZXQvZXRoZXJuZXQvcGUyLmMgYi9uZXQvZXRoZXJuZXQvcGUyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhNDk0YgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9ldGhlcm5ldC9wZTIuYwpAQCAtMCwwICsxLDQwIEBACisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSA8bmV0L2RhdGFsaW5rLmg+CisKK3N0YXRpYyBpbnQgcEVJSV9yZXF1ZXN0KHN0cnVjdCBkYXRhbGlua19wcm90byAqZGwsCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBjaGFyICpkZXN0X25vZGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OworCisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQWCk7CisJaWYgKGRldi0+aGFyZF9oZWFkZXIpCisJCWRldi0+aGFyZF9oZWFkZXIoc2tiLCBkZXYsIEVUSF9QX0lQWCwKKwkJCQkgZGVzdF9ub2RlLCBOVUxMLCBza2ItPmxlbik7CisJcmV0dXJuIGRldl9xdWV1ZV94bWl0KHNrYik7Cit9CisKK3N0cnVjdCBkYXRhbGlua19wcm90byAqbWFrZV9FSUlfY2xpZW50KHZvaWQpCit7CisJc3RydWN0IGRhdGFsaW5rX3Byb3RvICpwcm90byA9IGttYWxsb2Moc2l6ZW9mKCpwcm90byksIEdGUF9BVE9NSUMpOworCisJaWYgKHByb3RvKSB7CisJCXByb3RvLT5oZWFkZXJfbGVuZ3RoID0gMDsKKwkJcHJvdG8tPnJlcXVlc3QgPSBwRUlJX3JlcXVlc3Q7CisJfQorCisJcmV0dXJuIHByb3RvOworfQorCit2b2lkIGRlc3Ryb3lfRUlJX2NsaWVudChzdHJ1Y3QgZGF0YWxpbmtfcHJvdG8gKmRsKQoreworCWlmIChkbCkKKwkJa2ZyZWUoZGwpOworfQorCitFWFBPUlRfU1lNQk9MKGRlc3Ryb3lfRUlJX2NsaWVudCk7CitFWFBPUlRfU1lNQk9MKG1ha2VfRUlJX2NsaWVudCk7CmRpZmYgLS1naXQgYS9uZXQvZXRoZXJuZXQvc3lzY3RsX25ldF9ldGhlci5jIGIvbmV0L2V0aGVybmV0L3N5c2N0bF9uZXRfZXRoZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODFhNmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2V0aGVybmV0L3N5c2N0bF9uZXRfZXRoZXIuYwpAQCAtMCwwICsxLDEzIEBACisvKiAtKi0gbGludXgtYyAtKi0KKyAqIHN5c2N0bF9uZXRfZXRoZXIuYzogc3lzY3RsIGludGVyZmFjZSB0byBuZXQgRXRoZXJuZXQgc3Vic3lzdGVtLgorICoKKyAqIEJlZ3VuIEFwcmlsIDEsIDE5OTYsIE1pa2UgU2hhdmVyLgorICogQWRkZWQgL3Byb2Mvc3lzL25ldC9ldGhlciBkaXJlY3RvcnkgZW50cnkgKGVtcHR5ID0pICkuIFtNU10KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKworY3RsX3RhYmxlIGV0aGVyX3RhYmxlW10gPSB7CisJezB9Cit9OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvS2NvbmZpZyBiL25ldC9pcHY0L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQzZThiMQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L0tjb25maWcKQEAgLTAsMCArMSw0MTEgQEAKKyMKKyMgSVAgY29uZmlndXJhdGlvbgorIworY29uZmlnIElQX01VTFRJQ0FTVAorCWJvb2wgIklQOiBtdWx0aWNhc3RpbmciCisJZGVwZW5kcyBvbiBJTkVUCisJaGVscAorCSAgVGhpcyBpcyBjb2RlIGZvciBhZGRyZXNzaW5nIHNldmVyYWwgbmV0d29ya2VkIGNvbXB1dGVycyBhdCBvbmNlLAorCSAgZW5sYXJnaW5nIHlvdXIga2VybmVsIGJ5IGFib3V0IDIgS0IuIFlvdSBuZWVkIG11bHRpY2FzdGluZyBpZiB5b3UKKwkgIGludGVuZCB0byBwYXJ0aWNpcGF0ZSBpbiB0aGUgTUJPTkUsIGEgaGlnaCBiYW5kd2lkdGggbmV0d29yayBvbiB0b3AKKwkgIG9mIHRoZSBJbnRlcm5ldCB3aGljaCBjYXJyaWVzIGF1ZGlvIGFuZCB2aWRlbyBicm9hZGNhc3RzLiBNb3JlCisJICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgTUJPTkUgaXMgb24gdGhlIFdXVyBhdAorCSAgPGh0dHA6Ly93d3ctaXRnLmxibC5nb3YvbWJvbmUvPi4gSW5mb3JtYXRpb24gYWJvdXQgdGhlIG11bHRpY2FzdAorCSAgY2FwYWJpbGl0aWVzIG9mIHRoZSB2YXJpb3VzIG5ldHdvcmsgY2FyZHMgaXMgY29udGFpbmVkIGluCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbXVsdGljYXN0LnR4dD4uIEZvciBtb3N0IHBlb3BsZSwgaXQncworCSAgc2FmZSB0byBzYXkgTi4KKworY29uZmlnIElQX0FEVkFOQ0VEX1JPVVRFUgorCWJvb2wgIklQOiBhZHZhbmNlZCByb3V0ZXIiCisJZGVwZW5kcyBvbiBJTkVUCisJLS0taGVscC0tLQorCSAgSWYgeW91IGludGVuZCB0byBydW4geW91ciBMaW51eCBib3ggbW9zdGx5IGFzIGEgcm91dGVyLCBpLmUuIGFzIGEKKwkgIGNvbXB1dGVyIHRoYXQgZm9yd2FyZHMgYW5kIHJlZGlzdHJpYnV0ZXMgbmV0d29yayBwYWNrZXRzLCBzYXkgWTsgeW91CisJICB3aWxsIHRoZW4gYmUgcHJlc2VudGVkIHdpdGggc2V2ZXJhbCBvcHRpb25zIHRoYXQgYWxsb3cgbW9yZSBwcmVjaXNlCisJICBjb250cm9sIGFib3V0IHRoZSByb3V0aW5nIHByb2Nlc3MuCisKKwkgIFRoZSBhbnN3ZXIgdG8gdGhpcyBxdWVzdGlvbiB3b24ndCBkaXJlY3RseSBhZmZlY3QgdGhlIGtlcm5lbDoKKwkgIGFuc3dlcmluZyBOIHdpbGwganVzdCBjYXVzZSB0aGUgY29uZmlndXJhdG9yIHRvIHNraXAgYWxsIHRoZQorCSAgcXVlc3Rpb25zIGFib3V0IGFkdmFuY2VkIHJvdXRpbmcuCisKKwkgIE5vdGUgdGhhdCB5b3VyIGJveCBjYW4gb25seSBhY3QgYXMgYSByb3V0ZXIgaWYgeW91IGVuYWJsZSBJUAorCSAgZm9yd2FyZGluZyBpbiB5b3VyIGtlcm5lbDsgeW91IGNhbiBkbyB0aGF0IGJ5IHNheWluZyBZIHRvICIvcHJvYworCSAgZmlsZSBzeXN0ZW0gc3VwcG9ydCIgYW5kICJTeXNjdGwgc3VwcG9ydCIgYmVsb3cgYW5kIGV4ZWN1dGluZyB0aGUKKwkgIGxpbmUKKworCSAgZWNobyAiMSIgPiAvcHJvYy9zeXMvbmV0L2lwdjQvaXBfZm9yd2FyZAorCisJICBhdCBib290IHRpbWUgYWZ0ZXIgdGhlIC9wcm9jIGZpbGUgc3lzdGVtIGhhcyBiZWVuIG1vdW50ZWQuCisKKwkgIElmIHlvdSB0dXJuIG9uIElQIGZvcndhcmRpbmcsIHlvdSB3aWxsIGFsc28gZ2V0IHRoZSBycF9maWx0ZXIsIHdoaWNoCisJICBhdXRvbWF0aWNhbGx5IHJlamVjdHMgaW5jb21pbmcgcGFja2V0cyBpZiB0aGUgcm91dGluZyB0YWJsZSBlbnRyeQorCSAgZm9yIHRoZWlyIHNvdXJjZSBhZGRyZXNzIGRvZXNuJ3QgbWF0Y2ggdGhlIG5ldHdvcmsgaW50ZXJmYWNlIHRoZXkncmUKKwkgIGFycml2aW5nIG9uLiBUaGlzIGhhcyBzZWN1cml0eSBhZHZhbnRhZ2VzIGJlY2F1c2UgaXQgcHJldmVudHMgdGhlCisJICBzby1jYWxsZWQgSVAgc3Bvb2ZpbmcsIGhvd2V2ZXIgaXQgY2FuIHBvc2UgcHJvYmxlbXMgaWYgeW91IHVzZQorCSAgYXN5bW1ldHJpYyByb3V0aW5nIChwYWNrZXRzIGZyb20geW91IHRvIGEgaG9zdCB0YWtlIGEgZGlmZmVyZW50IHBhdGgKKwkgIHRoYW4gcGFja2V0cyBmcm9tIHRoYXQgaG9zdCB0byB5b3UpIG9yIGlmIHlvdSBvcGVyYXRlIGEgbm9uLXJvdXRpbmcKKwkgIGhvc3Qgd2hpY2ggaGFzIHNldmVyYWwgSVAgYWRkcmVzc2VzIG9uIGRpZmZlcmVudCBpbnRlcmZhY2VzLiBUbyB0dXJuCisJICBycF9maWx0ZXIgb2ZmIHVzZToKKworCSAgZWNobyAwID4gL3Byb2Mvc3lzL25ldC9pcHY0L2NvbmYvPGRldmljZT4vcnBfZmlsdGVyCisJICBvcgorCSAgZWNobyAwID4gL3Byb2Mvc3lzL25ldC9pcHY0L2NvbmYvYWxsL3JwX2ZpbHRlcgorCisJICBJZiB1bnN1cmUsIHNheSBOIGhlcmUuCisKK2NvbmZpZyBJUF9NVUxUSVBMRV9UQUJMRVMKKwlib29sICJJUDogcG9saWN5IHJvdXRpbmciCisJZGVwZW5kcyBvbiBJUF9BRFZBTkNFRF9ST1VURVIKKwktLS1oZWxwLS0tCisJICBOb3JtYWxseSwgYSByb3V0ZXIgZGVjaWRlcyB3aGF0IHRvIGRvIHdpdGggYSByZWNlaXZlZCBwYWNrZXQgYmFzZWQKKwkgIHNvbGVseSBvbiB0aGUgcGFja2V0J3MgZmluYWwgZGVzdGluYXRpb24gYWRkcmVzcy4gSWYgeW91IHNheSBZIGhlcmUsCisJICB0aGUgTGludXggcm91dGVyIHdpbGwgYWxzbyBiZSBhYmxlIHRvIHRha2UgdGhlIHBhY2tldCdzIHNvdXJjZQorCSAgYWRkcmVzcyBpbnRvIGFjY291bnQuIEZ1cnRoZXJtb3JlLCB0aGUgVE9TIChUeXBlLU9mLVNlcnZpY2UpIGZpZWxkCisJICBvZiB0aGUgcGFja2V0IGNhbiBiZSB1c2VkIGZvciByb3V0aW5nIGRlY2lzaW9ucyBhcyB3ZWxsLgorCisJICBJZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gdGhpcywgcGxlYXNlIHNlZSB0aGUgcHJlbGltaW5hcnkKKwkgIGRvY3VtZW50YXRpb24gYXQgPGh0dHA6Ly93d3cuY29tcGVuZGl1bS5jb20uYXIvcG9saWN5LXJvdXRpbmcudHh0PgorCSAgYW5kIDxmdHA6Ly9wb3N0LnRlcGtvbS5ydS9wdWIvdm9sMi9MaW51eC9kb2NzL2FkdmFuY2VkLXJvdXRpbmcudGV4Pi4KKwkgIFlvdSB3aWxsIG5lZWQgc3VwcG9ydGluZyBzb2Z0d2FyZSBmcm9tCisJICA8ZnRwOi8vZnRwLnR1eC5vcmcvcHViL25ldC9pcC1yb3V0aW5nLz4uCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBJUF9ST1VURV9GV01BUksKKwlib29sICJJUDogdXNlIG5ldGZpbHRlciBNQVJLIHZhbHVlIGFzIHJvdXRpbmcga2V5IgorCWRlcGVuZHMgb24gSVBfTVVMVElQTEVfVEFCTEVTICYmIE5FVEZJTFRFUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHNwZWNpZnkgZGlmZmVyZW50IHJvdXRlcyBmb3IKKwkgIHBhY2tldHMgd2l0aCBkaWZmZXJlbnQgbWFyayB2YWx1ZXMgKHNlZSBpcHRhYmxlcyg4KSwgTUFSSyB0YXJnZXQpLgorCitjb25maWcgSVBfUk9VVEVfTVVMVElQQVRICisJYm9vbCAiSVA6IGVxdWFsIGNvc3QgbXVsdGlwYXRoIgorCWRlcGVuZHMgb24gSVBfQURWQU5DRURfUk9VVEVSCisJaGVscAorCSAgTm9ybWFsbHksIHRoZSByb3V0aW5nIHRhYmxlcyBzcGVjaWZ5IGEgc2luZ2xlIGFjdGlvbiB0byBiZSB0YWtlbiBpbgorCSAgYSBkZXRlcm1pbmlzdGljIG1hbm5lciBmb3IgYSBnaXZlbiBwYWNrZXQuIElmIHlvdSBzYXkgWSBoZXJlCisJICBob3dldmVyLCBpdCBiZWNvbWVzIHBvc3NpYmxlIHRvIGF0dGFjaCBzZXZlcmFsIGFjdGlvbnMgdG8gYSBwYWNrZXQKKwkgIHBhdHRlcm4sIGluIGVmZmVjdCBzcGVjaWZ5aW5nIHNldmVyYWwgYWx0ZXJuYXRpdmUgcGF0aHMgdG8gdHJhdmVsCisJICBmb3IgdGhvc2UgcGFja2V0cy4gVGhlIHJvdXRlciBjb25zaWRlcnMgYWxsIHRoZXNlIHBhdGhzIHRvIGJlIG9mCisJICBlcXVhbCAiY29zdCIgYW5kIGNob29zZXMgb25lIG9mIHRoZW0gaW4gYSBub24tZGV0ZXJtaW5pc3RpYyBmYXNoaW9uCisJICBpZiBhIG1hdGNoaW5nIHBhY2tldCBhcnJpdmVzLgorCitjb25maWcgSVBfUk9VVEVfTVVMVElQQVRIX0NBQ0hFRAorCWJvb2wgIklQOiBlcXVhbCBjb3N0IG11bHRpcGF0aCB3aXRoIGNhY2hpbmcgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uOiBJUF9ST1VURV9NVUxUSVBBVEgKKwloZWxwCisJICBOb3JtYWxseSwgZXF1YWwgY29zdCBtdWx0aXBhdGggcm91dGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZQorCSAgcm91dGluZyBjYWNoZS4gSWYgeW91IHNheSBZIGhlcmUsIGFsdGVybmF0aXZlIHJvdXRlcyBhcmUgY2FjaGVkCisJICBhbmQgb24gY2FjaGUgbG9va3VwIGEgcm91dGUgaXMgY2hvc2VuIGluIGEgY29uZmlndXJhYmxlIGZhc2hpb24uCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBJUF9ST1VURV9NVUxUSVBBVEhfUlIKKwl0cmlzdGF0ZSAiTVVMVElQQVRIOiByb3VuZCByb2JpbiBhbGdvcml0aG0iCisJZGVwZW5kcyBvbiBJUF9ST1VURV9NVUxUSVBBVEhfQ0FDSEVECisJaGVscAorCSAgTXVsaXRwYXRoIHJvdXRlcyBhcmUgY2hvc2VuIGFjY29yZGluZyB0byBSb3VuZCBSb2JpbgorCitjb25maWcgSVBfUk9VVEVfTVVMVElQQVRIX1JBTkRPTQorCXRyaXN0YXRlICJNVUxUSVBBVEg6IHJhbmRvbSBhbGdvcml0aG0iCisJZGVwZW5kcyBvbiBJUF9ST1VURV9NVUxUSVBBVEhfQ0FDSEVECisJaGVscAorCSAgTXVsdGlwYXRoIHJvdXRlcyBhcmUgY2hvc2VuIGluIGEgcmFuZG9tIGZhc2hpb24uIEFjdHVhbGx5LAorCSAgdGhlcmUgaXMgbm8gd2VpZ2h0IGZvciBhIHJvdXRlLiBUaGUgYWR2YW50YWdlIG9mIHRoaXMgcG9saWN5CisJICBpcyB0aGF0IGl0IGlzIGltcGxlbWVudGVkIHN0YXRlbGVzcyBhbmQgdGhlcmVmb3JlIGludHJvZHVjZXMgb25seQorCSAgYSB2ZXJ5IHNtYWxsIGRlbGF5LgorCitjb25maWcgSVBfUk9VVEVfTVVMVElQQVRIX1dSQU5ET00KKwl0cmlzdGF0ZSAiTVVMVElQQVRIOiB3ZWlnaHRlZCByYW5kb20gYWxnb3JpdGhtIgorCWRlcGVuZHMgb24gSVBfUk9VVEVfTVVMVElQQVRIX0NBQ0hFRAorCWhlbHAKKwkgIE11bHRpcGF0aCByb3V0ZXMgYXJlIGNob3NlbiBpbiBhIHdlaWdodGVkIHJhbmRvbSBmYXNoaW9uLiAKKwkgIFRoZSBwZXIgcm91dGUgd2VpZ2h0cyBhcmUgdGhlIHdlaWdodHMgdmlzaWJsZSB2aWEgaXAgcm91dGUgMi4gQXMgdGhlCisJICBjb3JyZXNwb25kaW5nIHN0YXRlIG1hbmFnZW1lbnQgaW50cm9kdWNlcyBzb21lIG92ZXJoZWFkIHJvdXRpbmcgZGVsYXkKKwkgIGlzIGluY3JlYXNlZC4KKworY29uZmlnIElQX1JPVVRFX01VTFRJUEFUSF9EUlIKKwl0cmlzdGF0ZSAiTVVMVElQQVRIOiBpbnRlcmZhY2Ugcm91bmQgcm9iaW4gYWxnb3JpdGhtIgorCWRlcGVuZHMgb24gSVBfUk9VVEVfTVVMVElQQVRIX0NBQ0hFRAorCWhlbHAKKwkgIENvbm5lY3Rpb25zIGFyZSBkaXN0cmlidXRlZCBpbiBhIHJvdW5kIHJvYmluIGZhc2hpb24gb3ZlciB0aGUKKwkgIGF2YWlsYWJsZSBpbnRlcmZhY2VzLiBUaGlzIHBvbGljeSBtYWtlcyBzZW5zZSBpZiB0aGUgY29ubmVjdGlvbnMgCisJICBzaG91bGQgYmUgcHJpbWFyaWx5IGRpc3RyaWJ1dGVkIG9uIGludGVyZmFjZXMgYW5kIG5vdCBvbiByb3V0ZXMuIAorCitjb25maWcgSVBfUk9VVEVfVkVSQk9TRQorCWJvb2wgIklQOiB2ZXJib3NlIHJvdXRlIG1vbml0b3JpbmciCisJZGVwZW5kcyBvbiBJUF9BRFZBTkNFRF9ST1VURVIKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgd2hpY2ggaXMgcmVjb21tZW5kZWQsIHRoZW4gdGhlIGtlcm5lbCB3aWxsIHByaW50CisJICB2ZXJib3NlIG1lc3NhZ2VzIHJlZ2FyZGluZyB0aGUgcm91dGluZywgZm9yIGV4YW1wbGUgd2FybmluZ3MgYWJvdXQKKwkgIHJlY2VpdmVkIHBhY2tldHMgd2hpY2ggbG9vayBzdHJhbmdlIGFuZCBjb3VsZCBiZSBldmlkZW5jZSBvZiBhbgorCSAgYXR0YWNrIG9yIGEgbWlzY29uZmlndXJlZCBzeXN0ZW0gc29tZXdoZXJlLiBUaGUgaW5mb3JtYXRpb24gaXMKKwkgIGhhbmRsZWQgYnkgdGhlIGtsb2dkIGRhZW1vbiB3aGljaCBpcyByZXNwb25zaWJsZSBmb3Iga2VybmVsIG1lc3NhZ2VzCisJICAoIm1hbiBrbG9nZCIpLgorCitjb25maWcgSVBfUE5QCisJYm9vbCAiSVA6IGtlcm5lbCBsZXZlbCBhdXRvY29uZmlndXJhdGlvbiIKKwlkZXBlbmRzIG9uIElORVQKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgYXV0b21hdGljIGNvbmZpZ3VyYXRpb24gb2YgSVAgYWRkcmVzc2VzIG9mIGRldmljZXMgYW5kCisJICBvZiB0aGUgcm91dGluZyB0YWJsZSBkdXJpbmcga2VybmVsIGJvb3QsIGJhc2VkIG9uIGVpdGhlciBpbmZvcm1hdGlvbgorCSAgc3VwcGxpZWQgb24gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUgb3IgYnkgQk9PVFAgb3IgUkFSUCBwcm90b2NvbHMuCisJICBZb3UgbmVlZCB0byBzYXkgWSBvbmx5IGZvciBkaXNrbGVzcyBtYWNoaW5lcyByZXF1aXJpbmcgbmV0d29yaworCSAgYWNjZXNzIHRvIGJvb3QgKGluIHdoaWNoIGNhc2UgeW91IHdhbnQgdG8gc2F5IFkgdG8gIlJvb3QgZmlsZSBzeXN0ZW0KKwkgIG9uIE5GUyIgYXMgd2VsbCksIGJlY2F1c2UgYWxsIG90aGVyIG1hY2hpbmVzIGNvbmZpZ3VyZSB0aGUgbmV0d29yaworCSAgaW4gdGhlaXIgc3RhcnR1cCBzY3JpcHRzLgorCitjb25maWcgSVBfUE5QX0RIQ1AKKwlib29sICJJUDogREhDUCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVBfUE5QCisJLS0taGVscC0tLQorCSAgSWYgeW91IHdhbnQgeW91ciBMaW51eCBib3ggdG8gbW91bnQgaXRzIHdob2xlIHJvb3QgZmlsZSBzeXN0ZW0gKHRoZQorCSAgb25lIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeSAvKSBmcm9tIHNvbWUgb3RoZXIgY29tcHV0ZXIgb3ZlciB0aGUKKwkgIG5ldCB2aWEgTkZTIGFuZCB5b3Ugd2FudCB0aGUgSVAgYWRkcmVzcyBvZiB5b3VyIGNvbXB1dGVyIHRvIGJlCisJICBkaXNjb3ZlcmVkIGF1dG9tYXRpY2FsbHkgYXQgYm9vdCB0aW1lIHVzaW5nIHRoZSBESENQIHByb3RvY29sIChhCisJICBzcGVjaWFsIHByb3RvY29sIGRlc2lnbmVkIGZvciBkb2luZyB0aGlzIGpvYiksIHNheSBZIGhlcmUuIEluIGNhc2UKKwkgIHRoZSBib290IFJPTSBvZiB5b3VyIG5ldHdvcmsgY2FyZCB3YXMgZGVzaWduZWQgZm9yIGJvb3RpbmcgTGludXggYW5kCisJICBkb2VzIERIQ1AgaXRzZWxmLCBwcm92aWRpbmcgYWxsIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBvbiB0aGUga2VybmVsCisJICBjb21tYW5kIGxpbmUsIHlvdSBjYW4gc2F5IE4gaGVyZS4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4gTm90ZSB0aGF0IGlmIHlvdSB3YW50IHRvIHVzZSBESENQLCBhIERIQ1Agc2VydmVyCisJICBtdXN0IGJlIG9wZXJhdGluZyBvbiB5b3VyIG5ldHdvcmsuICBSZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25mc3Jvb3QudHh0PiBmb3IgZGV0YWlscy4KKworY29uZmlnIElQX1BOUF9CT09UUAorCWJvb2wgIklQOiBCT09UUCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVBfUE5QCisJLS0taGVscC0tLQorCSAgSWYgeW91IHdhbnQgeW91ciBMaW51eCBib3ggdG8gbW91bnQgaXRzIHdob2xlIHJvb3QgZmlsZSBzeXN0ZW0gKHRoZQorCSAgb25lIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeSAvKSBmcm9tIHNvbWUgb3RoZXIgY29tcHV0ZXIgb3ZlciB0aGUKKwkgIG5ldCB2aWEgTkZTIGFuZCB5b3Ugd2FudCB0aGUgSVAgYWRkcmVzcyBvZiB5b3VyIGNvbXB1dGVyIHRvIGJlCisJICBkaXNjb3ZlcmVkIGF1dG9tYXRpY2FsbHkgYXQgYm9vdCB0aW1lIHVzaW5nIHRoZSBCT09UUCBwcm90b2NvbCAoYQorCSAgc3BlY2lhbCBwcm90b2NvbCBkZXNpZ25lZCBmb3IgZG9pbmcgdGhpcyBqb2IpLCBzYXkgWSBoZXJlLiBJbiBjYXNlCisJICB0aGUgYm9vdCBST00gb2YgeW91ciBuZXR3b3JrIGNhcmQgd2FzIGRlc2lnbmVkIGZvciBib290aW5nIExpbnV4IGFuZAorCSAgZG9lcyBCT09UUCBpdHNlbGYsIHByb3ZpZGluZyBhbGwgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIG9uIHRoZSBrZXJuZWwKKwkgIGNvbW1hbmQgbGluZSwgeW91IGNhbiBzYXkgTiBoZXJlLiBJZiB1bnN1cmUsIHNheSBZLiBOb3RlIHRoYXQgaWYgeW91CisJICB3YW50IHRvIHVzZSBCT09UUCwgYSBCT09UUCBzZXJ2ZXIgbXVzdCBiZSBvcGVyYXRpbmcgb24geW91ciBuZXR3b3JrLgorCSAgUmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL25mc3Jvb3QudHh0PiBmb3IgZGV0YWlscy4KKworY29uZmlnIElQX1BOUF9SQVJQCisJYm9vbCAiSVA6IFJBUlAgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElQX1BOUAorCWhlbHAKKwkgIElmIHlvdSB3YW50IHlvdXIgTGludXggYm94IHRvIG1vdW50IGl0cyB3aG9sZSByb290IGZpbGUgc3lzdGVtICh0aGUKKwkgIG9uZSBjb250YWluaW5nIHRoZSBkaXJlY3RvcnkgLykgZnJvbSBzb21lIG90aGVyIGNvbXB1dGVyIG92ZXIgdGhlCisJICBuZXQgdmlhIE5GUyBhbmQgeW91IHdhbnQgdGhlIElQIGFkZHJlc3Mgb2YgeW91ciBjb21wdXRlciB0byBiZQorCSAgZGlzY292ZXJlZCBhdXRvbWF0aWNhbGx5IGF0IGJvb3QgdGltZSB1c2luZyB0aGUgUkFSUCBwcm90b2NvbCAoYW4KKwkgIG9sZGVyIHByb3RvY29sIHdoaWNoIGlzIGJlaW5nIG9ic29sZXRlZCBieSBCT09UUCBhbmQgREhDUCksIHNheSBZCisJICBoZXJlLiBOb3RlIHRoYXQgaWYgeW91IHdhbnQgdG8gdXNlIFJBUlAsIGEgUkFSUCBzZXJ2ZXIgbXVzdCBiZQorCSAgb3BlcmF0aW5nIG9uIHlvdXIgbmV0d29yay4gUmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL25mc3Jvb3QudHh0PiBmb3IKKwkgIGRldGFpbHMuCisKKyMgbm90IHlldCByZWFkeS4uCisjICAgYm9vbCAnICAgIElQOiBBUlAgc3VwcG9ydCcgQ09ORklHX0lQX1BOUF9BUlAJCQorY29uZmlnIE5FVF9JUElQCisJdHJpc3RhdGUgIklQOiB0dW5uZWxpbmciCisJZGVwZW5kcyBvbiBJTkVUCisJc2VsZWN0IElORVRfVFVOTkVMCisJLS0taGVscC0tLQorCSAgVHVubmVsaW5nIG1lYW5zIGVuY2Fwc3VsYXRpbmcgZGF0YSBvZiBvbmUgcHJvdG9jb2wgdHlwZSB3aXRoaW4KKwkgIGFub3RoZXIgcHJvdG9jb2wgYW5kIHNlbmRpbmcgaXQgb3ZlciBhIGNoYW5uZWwgdGhhdCB1bmRlcnN0YW5kcyB0aGUKKwkgIGVuY2Fwc3VsYXRpbmcgcHJvdG9jb2wuIFRoaXMgcGFydGljdWxhciB0dW5uZWxpbmcgZHJpdmVyIGltcGxlbWVudHMKKwkgIGVuY2Fwc3VsYXRpb24gb2YgSVAgd2l0aGluIElQLCB3aGljaCBzb3VuZHMga2luZCBvZiBwb2ludGxlc3MsIGJ1dAorCSAgY2FuIGJlIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBtYWtlIHlvdXIgKG9yIHNvbWUgb3RoZXIpIG1hY2hpbmUKKwkgIGFwcGVhciBvbiBhIGRpZmZlcmVudCBuZXR3b3JrIHRoYW4gaXQgcGh5c2ljYWxseSBpcywgb3IgdG8gdXNlCisJICBtb2JpbGUtSVAgZmFjaWxpdGllcyAoYWxsb3dpbmcgbGFwdG9wcyB0byBzZWFtbGVzc2x5IG1vdmUgYmV0d2VlbgorCSAgbmV0d29ya3Mgd2l0aG91dCBjaGFuZ2luZyB0aGVpciBJUCBhZGRyZXNzZXMpLgorCisJICBTYXlpbmcgWSB0byB0aGlzIG9wdGlvbiB3aWxsIHByb2R1Y2UgdHdvIG1vZHVsZXMgKCA9IGNvZGUgd2hpY2ggY2FuCisJICBiZSBpbnNlcnRlZCBpbiBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBydW5uaW5nIGtlcm5lbCB3aGVuZXZlciB5b3UKKwkgIHdhbnQpLiBNb3N0IHBlb3BsZSB3b24ndCBuZWVkIHRoaXMgYW5kIGNhbiBzYXkgTi4KKworY29uZmlnIE5FVF9JUEdSRQorCXRyaXN0YXRlICJJUDogR1JFIHR1bm5lbHMgb3ZlciBJUCIKKwlkZXBlbmRzIG9uIElORVQKKwlzZWxlY3QgWEZSTQorCWhlbHAKKwkgIFR1bm5lbGluZyBtZWFucyBlbmNhcHN1bGF0aW5nIGRhdGEgb2Ygb25lIHByb3RvY29sIHR5cGUgd2l0aGluCisJICBhbm90aGVyIHByb3RvY29sIGFuZCBzZW5kaW5nIGl0IG92ZXIgYSBjaGFubmVsIHRoYXQgdW5kZXJzdGFuZHMgdGhlCisJICBlbmNhcHN1bGF0aW5nIHByb3RvY29sLiBUaGlzIHBhcnRpY3VsYXIgdHVubmVsaW5nIGRyaXZlciBpbXBsZW1lbnRzCisJICBHUkUgKEdlbmVyaWMgUm91dGluZyBFbmNhcHN1bGF0aW9uKSBhbmQgYXQgdGhpcyB0aW1lIGFsbG93cworCSAgZW5jYXBzdWxhdGluZyBvZiBJUHY0IG9yIElQdjYgb3ZlciBleGlzdGluZyBJUHY0IGluZnJhc3RydWN0dXJlLgorCSAgVGhpcyBkcml2ZXIgaXMgdXNlZnVsIGlmIHRoZSBvdGhlciBlbmRwb2ludCBpcyBhIENpc2NvIHJvdXRlcjogQ2lzY28KKwkgIGxpa2VzIEdSRSBtdWNoIGJldHRlciB0aGFuIHRoZSBvdGhlciBMaW51eCB0dW5uZWxpbmcgZHJpdmVyICgiSVAKKwkgIHR1bm5lbGluZyIgYWJvdmUpLiBJbiBhZGRpdGlvbiwgR1JFIGFsbG93cyBtdWx0aWNhc3QgcmVkaXN0cmlidXRpb24KKwkgIHRocm91Z2ggdGhlIHR1bm5lbC4KKworY29uZmlnIE5FVF9JUEdSRV9CUk9BRENBU1QKKwlib29sICJJUDogYnJvYWRjYXN0IEdSRSBvdmVyIElQIgorCWRlcGVuZHMgb24gSVBfTVVMVElDQVNUICYmIE5FVF9JUEdSRQorCWhlbHAKKwkgIE9uZSBhcHBsaWNhdGlvbiBvZiBHUkUvSVAgaXMgdG8gY29uc3RydWN0IGEgYnJvYWRjYXN0IFdBTiAoV2lkZSBBcmVhCisJICBOZXR3b3JrKSwgd2hpY2ggbG9va3MgbGlrZSBhIG5vcm1hbCBFdGhlcm5ldCBMQU4gKExvY2FsIEFyZWEKKwkgIE5ldHdvcmspLCBidXQgY2FuIGJlIGRpc3RyaWJ1dGVkIGFsbCBvdmVyIHRoZSBJbnRlcm5ldC4gSWYgeW91IHdhbnQKKwkgIHRvIGRvIHRoYXQsIHNheSBZIGhlcmUgYW5kIHRvICJJUCBtdWx0aWNhc3Qgcm91dGluZyIgYmVsb3cuCisKK2NvbmZpZyBJUF9NUk9VVEUKKwlib29sICJJUDogbXVsdGljYXN0IHJvdXRpbmciCisJZGVwZW5kcyBvbiBJUF9NVUxUSUNBU1QKKwloZWxwCisJICBUaGlzIGlzIHVzZWQgaWYgeW91IHdhbnQgeW91ciBtYWNoaW5lIHRvIGFjdCBhcyBhIHJvdXRlciBmb3IgSVAKKwkgIHBhY2tldHMgdGhhdCBoYXZlIHNldmVyYWwgZGVzdGluYXRpb24gYWRkcmVzc2VzLiBJdCBpcyBuZWVkZWQgb24gdGhlCisJICBNQk9ORSwgYSBoaWdoIGJhbmR3aWR0aCBuZXR3b3JrIG9uIHRvcCBvZiB0aGUgSW50ZXJuZXQgd2hpY2ggY2FycmllcworCSAgYXVkaW8gYW5kIHZpZGVvIGJyb2FkY2FzdHMuIEluIG9yZGVyIHRvIGRvIHRoYXQsIHlvdSB3b3VsZCBtb3N0CisJICBsaWtlbHkgcnVuIHRoZSBwcm9ncmFtIG1yb3V0ZWQuIEluZm9ybWF0aW9uIGFib3V0IHRoZSBtdWx0aWNhc3QKKwkgIGNhcGFiaWxpdGllcyBvZiB0aGUgdmFyaW91cyBuZXR3b3JrIGNhcmRzIGlzIGNvbnRhaW5lZCBpbgorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL211bHRpY2FzdC50eHQ+LiBJZiB5b3UgaGF2ZW4ndCBoZWFyZAorCSAgYWJvdXQgaXQsIHlvdSBkb24ndCBuZWVkIGl0LgorCitjb25maWcgSVBfUElNU01fVjEKKwlib29sICJJUDogUElNLVNNIHZlcnNpb24gMSBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVBfTVJPVVRFCisJaGVscAorCSAgS2VybmVsIHNpZGUgc3VwcG9ydCBmb3IgU3BhcnNlIE1vZGUgUElNIChQcm90b2NvbCBJbmRlcGVuZGVudAorCSAgTXVsdGljYXN0KSB2ZXJzaW9uIDEuIFRoaXMgbXVsdGljYXN0IHJvdXRpbmcgcHJvdG9jb2wgaXMgdXNlZCB3aWRlbHkKKwkgIGJlY2F1c2UgQ2lzY28gc3VwcG9ydHMgaXQuIFlvdSBuZWVkIHNwZWNpYWwgc29mdHdhcmUgdG8gdXNlIGl0CisJICAocGltZC12MSkuIFBsZWFzZSBzZWUgPGh0dHA6Ly9uZXR3ZWIudXNjLmVkdS9waW0vPiBmb3IgbW9yZQorCSAgaW5mb3JtYXRpb24gYWJvdXQgUElNLgorCisJICBTYXkgWSBpZiB5b3Ugd2FudCB0byB1c2UgUElNLVNNIHYxLiBOb3RlIHRoYXQgeW91IGNhbiBzYXkgTiBoZXJlIGlmCisJICB5b3UganVzdCB3YW50IHRvIHVzZSBEZW5zZSBNb2RlIFBJTS4KKworY29uZmlnIElQX1BJTVNNX1YyCisJYm9vbCAiSVA6IFBJTS1TTSB2ZXJzaW9uIDIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElQX01ST1VURQorCWhlbHAKKwkgIEtlcm5lbCBzaWRlIHN1cHBvcnQgZm9yIFNwYXJzZSBNb2RlIFBJTSB2ZXJzaW9uIDIuIEluIG9yZGVyIHRvIHVzZQorCSAgdGhpcywgeW91IG5lZWQgYW4gZXhwZXJpbWVudGFsIHJvdXRpbmcgZGFlbW9uIHN1cHBvcnRpbmcgaXQgKHBpbWQgb3IKKwkgIGdhdGVkLTUpLiBUaGlzIHJvdXRpbmcgcHJvdG9jb2wgaXMgbm90IHVzZWQgd2lkZWx5LCBzbyBzYXkgTiB1bmxlc3MKKwkgIHlvdSB3YW50IHRvIHBsYXkgd2l0aCBpdC4KKworY29uZmlnIEFSUEQKKwlib29sICJJUDogQVJQIGRhZW1vbiBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gSU5FVCAmJiBFWFBFUklNRU5UQUwKKwktLS1oZWxwLS0tCisJICBOb3JtYWxseSwgdGhlIGtlcm5lbCBtYWludGFpbnMgYW4gaW50ZXJuYWwgY2FjaGUgd2hpY2ggbWFwcyBJUAorCSAgYWRkcmVzc2VzIHRvIGhhcmR3YXJlIGFkZHJlc3NlcyBvbiB0aGUgbG9jYWwgbmV0d29yaywgc28gdGhhdAorCSAgRXRoZXJuZXQvVG9rZW4gUmluZy8gZXRjLiBmcmFtZXMgYXJlIHNlbnQgdG8gdGhlIHByb3BlciBhZGRyZXNzIG9uCisJICB0aGUgcGh5c2ljYWwgbmV0d29ya2luZyBsYXllci4gRm9yIHNtYWxsIG5ldHdvcmtzIGhhdmluZyBhIGZldworCSAgaHVuZHJlZCBkaXJlY3RseSBjb25uZWN0ZWQgaG9zdHMgb3IgbGVzcywga2VlcGluZyB0aGlzIGFkZHJlc3MKKwkgIHJlc29sdXRpb24gKEFSUCkgY2FjaGUgaW5zaWRlIHRoZSBrZXJuZWwgd29ya3Mgd2VsbC4gSG93ZXZlciwKKwkgIG1haW50YWluaW5nIGFuIGludGVybmFsIEFSUCBjYWNoZSBkb2VzIG5vdCB3b3JrIHdlbGwgZm9yIHZlcnkgbGFyZ2UKKwkgIHN3aXRjaGVkIG5ldHdvcmtzLCBhbmQgd2lsbCB1c2UgYSBsb3Qgb2Yga2VybmVsIG1lbW9yeSBpZiBUQ1AvSVAKKwkgIGNvbm5lY3Rpb25zIGFyZSBtYWRlIHRvIG1hbnkgbWFjaGluZXMgb24gdGhlIG5ldHdvcmsuCisKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGUga2VybmVsJ3MgaW50ZXJuYWwgQVJQIGNhY2hlIHdpbGwgbmV2ZXIgZ3JvdworCSAgdG8gbW9yZSB0aGFuIDI1NiBlbnRyaWVzICh0aGUgb2xkZXN0IGVudHJpZXMgYXJlIGV4cGlyZWQgaW4gYSBMSUZPCisJICBtYW5uZXIpIGFuZCBjb21tdW5pY2F0aW9uIHdpbGwgYmUgYXR0ZW1wdGVkIHdpdGggdGhlIHVzZXIgc3BhY2UgQVJQCisJICBkYWVtb24gYXJwZC4gQXJwZCB0aGVuIGFuc3dlcnMgdGhlIGFkZHJlc3MgcmVzb2x1dGlvbiByZXF1ZXN0IGVpdGhlcgorCSAgZnJvbSBpdHMgb3duIGNhY2hlIG9yIGJ5IGFza2luZyB0aGUgbmV0LgorCisJICBUaGlzIGNvZGUgaXMgZXhwZXJpbWVudGFsIGFuZCBhbHNvIG9ic29sZXRlLiBJZiB5b3Ugd2FudCB0byB1c2UgaXQsCisJICB5b3UgbmVlZCB0byBmaW5kIGEgdmVyc2lvbiBvZiB0aGUgZGFlbW9uIGFycGQgb24gdGhlIG5ldCBzb21ld2hlcmUsCisJICBhbmQgeW91IHNob3VsZCBhbHNvIHNheSBZIHRvICJLZXJuZWwvVXNlciBuZXR3b3JrIGxpbmsgZHJpdmVyIiwKKwkgIGJlbG93LiBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgU1lOX0NPT0tJRVMKKwlib29sICJJUDogVENQIHN5bmNvb2tpZSBzdXBwb3J0IChkaXNhYmxlZCBwZXIgZGVmYXVsdCkiCisJZGVwZW5kcyBvbiBJTkVUCisJLS0taGVscC0tLQorCSAgTm9ybWFsIFRDUC9JUCBuZXR3b3JraW5nIGlzIG9wZW4gdG8gYW4gYXR0YWNrIGtub3duIGFzICJTWU4KKwkgIGZsb29kaW5nIi4gVGhpcyBkZW5pYWwtb2Ytc2VydmljZSBhdHRhY2sgcHJldmVudHMgbGVnaXRpbWF0ZSByZW1vdGUKKwkgIHVzZXJzIGZyb20gYmVpbmcgYWJsZSB0byBjb25uZWN0IHRvIHlvdXIgY29tcHV0ZXIgZHVyaW5nIGFuIG9uZ29pbmcKKwkgIGF0dGFjayBhbmQgcmVxdWlyZXMgdmVyeSBsaXR0bGUgd29yayBmcm9tIHRoZSBhdHRhY2tlciwgd2hvIGNhbgorCSAgb3BlcmF0ZSBmcm9tIGFueXdoZXJlIG9uIHRoZSBJbnRlcm5ldC4KKworCSAgU1lOIGNvb2tpZXMgcHJvdmlkZSBwcm90ZWN0aW9uIGFnYWluc3QgdGhpcyB0eXBlIG9mIGF0dGFjay4gSWYgeW91CisJICBzYXkgWSBoZXJlLCB0aGUgVENQL0lQIHN0YWNrIHdpbGwgdXNlIGEgY3J5cHRvZ3JhcGhpYyBjaGFsbGVuZ2UKKwkgIHByb3RvY29sIGtub3duIGFzICJTWU4gY29va2llcyIgdG8gZW5hYmxlIGxlZ2l0aW1hdGUgdXNlcnMgdG8KKwkgIGNvbnRpbnVlIHRvIGNvbm5lY3QsIGV2ZW4gd2hlbiB5b3VyIG1hY2hpbmUgaXMgdW5kZXIgYXR0YWNrLiBUaGVyZQorCSAgaXMgbm8gbmVlZCBmb3IgdGhlIGxlZ2l0aW1hdGUgdXNlcnMgdG8gY2hhbmdlIHRoZWlyIFRDUC9JUCBzb2Z0d2FyZTsKKwkgIFNZTiBjb29raWVzIHdvcmsgdHJhbnNwYXJlbnRseSB0byB0aGVtLiBGb3IgdGVjaG5pY2FsIGluZm9ybWF0aW9uCisJICBhYm91dCBTWU4gY29va2llcywgY2hlY2sgb3V0IDxodHRwOi8vY3IueXAudG8vc3luY29va2llcy5odG1sPi4KKworCSAgSWYgeW91IGFyZSBTWU4gZmxvb2RlZCwgdGhlIHNvdXJjZSBhZGRyZXNzIHJlcG9ydGVkIGJ5IHRoZSBrZXJuZWwgaXMKKwkgIGxpa2VseSB0byBoYXZlIGJlZW4gZm9yZ2VkIGJ5IHRoZSBhdHRhY2tlcjsgaXQgaXMgb25seSByZXBvcnRlZCBhcworCSAgYW4gYWlkIGluIHRyYWNpbmcgdGhlIHBhY2tldHMgdG8gdGhlaXIgYWN0dWFsIHNvdXJjZSBhbmQgc2hvdWxkIG5vdAorCSAgYmUgdGFrZW4gYXMgYWJzb2x1dGUgdHJ1dGguCisKKwkgIFNZTiBjb29raWVzIG1heSBwcmV2ZW50IGNvcnJlY3QgZXJyb3IgcmVwb3J0aW5nIG9uIGNsaWVudHMgd2hlbiB0aGUKKwkgIHNlcnZlciBpcyByZWFsbHkgb3ZlcmxvYWRlZC4gSWYgdGhpcyBoYXBwZW5zIGZyZXF1ZW50bHkgYmV0dGVyIHR1cm4KKwkgIHRoZW0gb2ZmLgorCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgbm90ZSB0aGF0IFNZTiBjb29raWVzIGFyZW4ndCBlbmFibGVkIGJ5IGRlZmF1bHQ7CisJICB5b3UgY2FuIGVuYWJsZSB0aGVtIGJ5IHNheWluZyBZIHRvICIvcHJvYyBmaWxlIHN5c3RlbSBzdXBwb3J0IiBhbmQKKwkgICJTeXNjdGwgc3VwcG9ydCIgYmVsb3cgYW5kIGV4ZWN1dGluZyB0aGUgY29tbWFuZAorCisJICBlY2hvIDEgPi9wcm9jL3N5cy9uZXQvaXB2NC90Y3Bfc3luY29va2llcworCisJICBhdCBib290IHRpbWUgYWZ0ZXIgdGhlIC9wcm9jIGZpbGUgc3lzdGVtIGhhcyBiZWVuIG1vdW50ZWQuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBJTkVUX0FICisJdHJpc3RhdGUgIklQOiBBSCB0cmFuc2Zvcm1hdGlvbiIKKwlkZXBlbmRzIG9uIElORVQKKwlzZWxlY3QgWEZSTQorCXNlbGVjdCBDUllQVE8KKwlzZWxlY3QgQ1JZUFRPX0hNQUMKKwlzZWxlY3QgQ1JZUFRPX01ENQorCXNlbGVjdCBDUllQVE9fU0hBMQorCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIElQc2VjIEFILgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgSU5FVF9FU1AKKwl0cmlzdGF0ZSAiSVA6IEVTUCB0cmFuc2Zvcm1hdGlvbiIKKwlkZXBlbmRzIG9uIElORVQKKwlzZWxlY3QgWEZSTQorCXNlbGVjdCBDUllQVE8KKwlzZWxlY3QgQ1JZUFRPX0hNQUMKKwlzZWxlY3QgQ1JZUFRPX01ENQorCXNlbGVjdCBDUllQVE9fU0hBMQorCXNlbGVjdCBDUllQVE9fREVTCisJLS0taGVscC0tLQorCSAgU3VwcG9ydCBmb3IgSVBzZWMgRVNQLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgSU5FVF9JUENPTVAKKwl0cmlzdGF0ZSAiSVA6IElQQ29tcCB0cmFuc2Zvcm1hdGlvbiIKKwlkZXBlbmRzIG9uIElORVQKKwlzZWxlY3QgWEZSTQorCXNlbGVjdCBJTkVUX1RVTk5FTAorCXNlbGVjdCBDUllQVE8KKwlzZWxlY3QgQ1JZUFRPX0RFRkxBVEUKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0IGZvciBJUCBQYXlsb2FkIENvbXByZXNzaW9uIFByb3RvY29sIChJUENvbXApIChSRkMzMTczKSwKKwkgIHR5cGljYWxseSBuZWVkZWQgZm9yIElQc2VjLgorCSAgCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgSU5FVF9UVU5ORUwKKwl0cmlzdGF0ZSAiSVA6IHR1bm5lbCB0cmFuc2Zvcm1hdGlvbiIKKwlkZXBlbmRzIG9uIElORVQKKwlzZWxlY3QgWEZSTQorCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIGdlbmVyaWMgSVAgdHVubmVsIHRyYW5zZm9ybWF0aW9uLCB3aGljaCBpcyByZXF1aXJlZCBieQorCSAgdGhlIElQIHR1bm5lbGluZyBtb2R1bGUgYXMgd2VsbCBhcyB0dW5uZWwgbW9kZSBJUENvbXAuCisJICAKKwkgIElmIHVuc3VyZSwgc2F5IFkuCisKK2NvbmZpZyBJUF9UQ1BESUFHCisJdHJpc3RhdGUgIklQOiBUQ1Agc29ja2V0IG1vbml0b3JpbmcgaW50ZXJmYWNlIgorCWRlcGVuZHMgb24gSU5FVAorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIFRDUCBzb2NrZXQgbW9uaXRvcmluZyBpbnRlcmZhY2UgdXNlZCBieSBuYXRpdmUgTGludXgKKwkgIHRvb2xzIHN1Y2ggYXMgc3MuIHNzIGlzIGluY2x1ZGVkIGluIGlwcm91dGUyLCBjdXJyZW50bHkgZG93bmxvYWRhYmxlCisJICBhdCA8aHR0cDovL2RldmVsb3Blci5vc2RsLm9yZy9kZXYvaXByb3V0ZTI+LiBJZiB5b3Ugd2FudCBJUHY2IHN1cHBvcnQKKwkgIGFuZCBoYXZlIHNlbGVjdGVkIElQdjYgYXMgYSBtb2R1bGUsIHlvdSBuZWVkIHRvIGJ1aWxkIHRoaXMgYXMgYQorCSAgbW9kdWxlIHRvby4KKwkgIAorCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIElQX1RDUERJQUdfSVBWNgorCWRlZl9ib29sIChJUF9UQ1BESUFHPXkgJiYgSVBWNj15KSB8fCAoSVBfVENQRElBRz1tICYmIElQVjYpCisKK3NvdXJjZSAibmV0L2lwdjQvaXB2cy9LY29uZmlnIgorCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9NYWtlZmlsZSBiL25ldC9pcHY0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMzc5NjIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9NYWtlZmlsZQpAQCAtMCwwICsxLDMzIEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggVENQL0lQIChJTkVUKSBsYXllci4KKyMKKworb2JqLXkgICAgIDo9IHV0aWxzLm8gcm91dGUubyBpbmV0cGVlci5vIHByb3RvY29sLm8gXAorCSAgICAgaXBfaW5wdXQubyBpcF9mcmFnbWVudC5vIGlwX2ZvcndhcmQubyBpcF9vcHRpb25zLm8gXAorCSAgICAgaXBfb3V0cHV0Lm8gaXBfc29ja2dsdWUubyBcCisJICAgICB0Y3AubyB0Y3BfaW5wdXQubyB0Y3Bfb3V0cHV0Lm8gdGNwX3RpbWVyLm8gdGNwX2lwdjQubyB0Y3BfbWluaXNvY2tzLm8gXAorCSAgICAgZGF0YWdyYW0ubyByYXcubyB1ZHAubyBhcnAubyBpY21wLm8gZGV2aW5ldC5vIGFmX2luZXQubyBpZ21wLm8gXAorCSAgICAgc3lzY3RsX25ldF9pcHY0Lm8gZmliX2Zyb250ZW5kLm8gZmliX3NlbWFudGljcy5vIGZpYl9oYXNoLm8KKworb2JqLSQoQ09ORklHX1BST0NfRlMpICs9IHByb2Mubworb2JqLSQoQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUykgKz0gZmliX3J1bGVzLm8KK29iai0kKENPTkZJR19JUF9NUk9VVEUpICs9IGlwbXIubworb2JqLSQoQ09ORklHX05FVF9JUElQKSArPSBpcGlwLm8KK29iai0kKENPTkZJR19ORVRfSVBHUkUpICs9IGlwX2dyZS5vCitvYmotJChDT05GSUdfU1lOX0NPT0tJRVMpICs9IHN5bmNvb2tpZXMubworb2JqLSQoQ09ORklHX0lORVRfQUgpICs9IGFoNC5vCitvYmotJChDT05GSUdfSU5FVF9FU1ApICs9IGVzcDQubworb2JqLSQoQ09ORklHX0lORVRfSVBDT01QKSArPSBpcGNvbXAubworb2JqLSQoQ09ORklHX0lORVRfVFVOTkVMKSArPSB4ZnJtNF90dW5uZWwubyAKK29iai0kKENPTkZJR19JUF9QTlApICs9IGlwY29uZmlnLm8KK29iai0kKENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEhfUlIpICs9IG11bHRpcGF0aF9yci5vCitvYmotJChDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIX1JBTkRPTSkgKz0gbXVsdGlwYXRoX3JhbmRvbS5vCitvYmotJChDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIX1dSQU5ET00pICs9IG11bHRpcGF0aF93cmFuZG9tLm8KK29iai0kKENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEhfRFJSKSArPSBtdWx0aXBhdGhfZHJyLm8KK29iai0kKENPTkZJR19ORVRGSUxURVIpCSs9IG5ldGZpbHRlci8KK29iai0kKENPTkZJR19JUF9WUykgKz0gaXB2cy8KK29iai0kKENPTkZJR19JUF9UQ1BESUFHKSArPSB0Y3BfZGlhZy5vIAorb2JqLSQoQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSF9DQUNIRUQpICs9IG11bHRpcGF0aC5vCisKK29iai0kKENPTkZJR19YRlJNKSArPSB4ZnJtNF9wb2xpY3kubyB4ZnJtNF9zdGF0ZS5vIHhmcm00X2lucHV0Lm8gXAorCQkgICAgICB4ZnJtNF9vdXRwdXQubwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvYWZfaW5ldC5jIGIvbmV0L2lwdjQvYWZfaW5ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNGRhYjYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9hZl9pbmV0LmMKQEAgLTAsMCArMSwxMTg4IEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCVBGX0lORVQgcHJvdG9jb2wgZmFtaWx5IHNvY2tldCBoYW5kbGVyLgorICoKKyAqIFZlcnNpb246CSRJZDogYWZfaW5ldC5jLHYgMS4xMzcgMjAwMi8wMi8wMSAyMjowMTowMyBkYXZlbSBFeHAgJAorICoKKyAqIEF1dGhvcnM6CVJvc3MgQmlybywgPGJpcjdAbGVsYW5kLlN0YW5mb3JkLkVkdT4KKyAqCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCQlGbG9yaWFuIExhIFJvY2hlLCA8ZmxsYUBzdHVkLnVuaS1zYi5kZT4KKyAqCQlBbGFuIENveCwgPEEuQ294QHN3YW5zZWEuYWMudWs+CisgKgorICogQ2hhbmdlcyAoc2VlIGFsc28gc29jay5jKQorICoKKyAqCQlwaWdneSwKKyAqCQlLYXJsIEtudXRzb24JOglTb2NrZXQgcHJvdG9jb2wgdGFibGUKKyAqCQlBLk4uS3V6bmV0c292CToJU29ja2V0IGRlYXRoIGVycm9yIGluIGFjY2VwdCgpLgorICoJCUpvaG4gUmljaGFyZHNvbiA6CUZpeCBub24gYmxvY2tpbmcgZXJyb3IgaW4gY29ubmVjdCgpCisgKgkJCQkJc28gc29ja2V0cyB0aGF0IGZhaWwgdG8gY29ubmVjdAorICoJCQkJCWRvbid0IHJldHVybiAtRUlOUFJPR1JFU1MuCisgKgkJQWxhbiBDb3gJOglBc3luY2hyb25vdXMgSS9PIHN1cHBvcnQKKyAqCQlBbGFuIENveAk6CUtlZXAgY29ycmVjdCBzb2NrZXQgcG9pbnRlciBvbiBzb2NrCisgKgkJCQkJc3RydWN0dXJlcworICoJCQkJCXdoZW4gYWNjZXB0KCkgZWQKKyAqCQlBbGFuIENveAk6CVNlbWFudGljcyBvZiBTT19MSU5HRVIgYXJlbid0IHN0YXRlCisgKgkJCQkJbW92ZWQgdG8gY2xvc2Ugd2hlbiB5b3UgbG9vayBjYXJlZnVsbHkuCisgKgkJCQkJV2l0aCB0aGlzIGZpeGVkIGFuZCB0aGUgYWNjZXB0IGJ1ZyBmaXhlZAorICoJCQkJCXNvbWUgUlBDIHN0dWZmIHNlZW1zIGhhcHBpZXIuCisgKgkJTmlpYmUgWXV0YWthCToJNC40QlNEIHN0eWxlIHdyaXRlIGFzeW5jIEkvTworICoJCUFsYW4gQ294LAorICoJCVRvbnkgR2FsZSAJOglGaXhlZCByZXVzZSBzZW1hbnRpY3MuCisgKgkJQWxhbiBDb3gJOgliaW5kKCkgc2hvdWxkbid0IGFib3J0IGV4aXN0aW5nIGJ1dCBkZWFkCisgKgkJCQkJc29ja2V0cy4gU3RvcHMgRlRQIG5ldGluOi4uIEkgaG9wZS4KKyAqCQlBbGFuIENveAk6CWJpbmQoKSB3b3JrcyBjb3JyZWN0bHkgZm9yIFJBVyBzb2NrZXRzLgorICoJCQkJCU5vdGUgdGhhdCBGcmVlQlNEIGF0IGxlYXN0IHdhcyBicm9rZW4KKyAqCQkJCQlpbiB0aGlzIHJlc3BlY3Qgc28gYmUgY2FyZWZ1bCB3aXRoCisgKgkJCQkJY29tcGF0aWJpbGl0eSB0ZXN0cy4uLgorICoJCUFsYW4gQ294CToJcm91dGluZyBjYWNoZSBzdXBwb3J0CisgKgkJQWxhbiBDb3gJOgltZW16ZXJvIHRoZSBzb2NrZXQgc3RydWN0dXJlIGZvcgorICoJCQkJCWNvbXBhY3RuZXNzLgorICoJCU1hdHQgRGF5CToJbm9uYmxvY2sgY29ubmVjdCBlcnJvciBoYW5kbGVyCisgKgkJQWxhbiBDb3gJOglBbGxvdyBsYXJnZSBudW1iZXJzIG9mIHBlbmRpbmcgc29ja2V0cworICoJCQkJCShlZyBmb3IgYmlnIHdlYiBzaXRlcyksIGJ1dCBvbmx5IGlmCisgKgkJCQkJc3BlY2lmaWNhbGx5IGFwcGxpY2F0aW9uIHJlcXVlc3RlZC4KKyAqCQlBbGFuIENveAk6CU5ldyBidWZmZXJpbmcgdGhyb3VnaG91dCBJUC4gVXNlZAorICoJCQkJCWR1bWJseS4KKyAqCQlBbGFuIENveAk6CU5ldyBidWZmZXJpbmcgbm93IHVzZWQgc21hcnRseS4KKyAqCQlBbGFuIENveAk6CUJTRCByYXRoZXIgdGhhbiBjb21tb24gc2Vuc2UKKyAqCQkJCQlpbnRlcnByZXRhdGlvbiBvZiBsaXN0ZW4uCisgKgkJR2VybWFubyBDYXJvbm5pCToJQXNzb3J0ZWQgc21hbGwgcmFjZXMuCisgKgkJQWxhbiBDb3gJOglzZW5kbXNnL3JlY3Ztc2cgYmFzaWMgc3VwcG9ydC4KKyAqCQlBbGFuIENveAk6CU9ubHkgc2VuZG1zZy9yZWN2bXNnIG5vdyBzdXBwb3J0ZWQuCisgKgkJQWxhbiBDb3gJOglMb2NrZWQgZG93biBiaW5kIChzZWUgc2VjdXJpdHkgbGlzdCkuCisgKgkJQWxhbiBDb3gJOglMb29zZW5lZCBiaW5kIGEgbGl0dGxlLgorICoJCU1pa2UgTWNMYWdhbgk6CUFERC9ERUwgRExDSSBJb2N0bHMKKyAqCVdpbGx5IEtvbnluZW5iZXJnCToJVHJhbnNwYXJlbnQgcHJveHlpbmcgc3VwcG9ydC4KKyAqCQlEYXZpZCBTLiBNaWxsZXIJOglOZXcgc29ja2V0IGxvb2t1cCBhcmNoaXRlY3R1cmUuCisgKgkJCQkJU29tZSBvdGhlciByYW5kb20gc3BlZWR1cHMuCisgKgkJQ3lydXMgRHVyZ2luCToJQ2xlYW5lZCB1cCBmaWxlIGZvciBrbW9kIGhhY2tzLgorICoJCUFuZGkgS2xlZW4JOglGaXggaW5ldF9zdHJlYW1fY29ubmVjdCBUQ1AgcmFjZS4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZ21wLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPG5ldC9pcF9maWIuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisjaW5jbHVkZSA8bmV0L3VkcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3Jhdy5oPgorI2luY2x1ZGUgPG5ldC9pY21wLmg+CisjaW5jbHVkZSA8bmV0L2lwaXAuaD4KKyNpbmNsdWRlIDxuZXQvaW5ldF9jb21tb24uaD4KKyNpbmNsdWRlIDxuZXQveGZybS5oPgorI2lmZGVmIENPTkZJR19JUF9NUk9VVEUKKyNpbmNsdWRlIDxsaW51eC9tcm91dGUuaD4KKyNlbmRpZgorCitERUZJTkVfU05NUF9TVEFUKHN0cnVjdCBsaW51eF9taWIsIG5ldF9zdGF0aXN0aWNzKTsKKworI2lmZGVmIElORVRfUkVGQ05UX0RFQlVHCithdG9taWNfdCBpbmV0X3NvY2tfbnI7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgaXBfbWNfZHJvcF9zb2NrZXQoc3RydWN0IHNvY2sgKnNrKTsKKworLyogVGhlIGluZXRzdyB0YWJsZSBjb250YWlucyBldmVyeXRoaW5nIHRoYXQgaW5ldF9jcmVhdGUgbmVlZHMgdG8KKyAqIGJ1aWxkIGEgbmV3IHNvY2tldC4KKyAqLworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgaW5ldHN3W1NPQ0tfTUFYXTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaW5ldHN3X2xvY2spOworCisvKiBOZXcgZGVzdHJ1Y3Rpb24gcm91dGluZSAqLworCit2b2lkIGluZXRfc29ja19kZXN0cnVjdChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCisJX19za2JfcXVldWVfcHVyZ2UoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwlfX3NrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX2Vycm9yX3F1ZXVlKTsKKworCWlmIChzay0+c2tfdHlwZSA9PSBTT0NLX1NUUkVBTSAmJiBzay0+c2tfc3RhdGUgIT0gVENQX0NMT1NFKSB7CisJCXByaW50aygiQXR0ZW1wdCB0byByZWxlYXNlIFRDUCBzb2NrZXQgaW4gc3RhdGUgJWQgJXBcbiIsCisJCSAgICAgICBzay0+c2tfc3RhdGUsIHNrKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkgeworCQlwcmludGsoIkF0dGVtcHQgdG8gcmVsZWFzZSBhbGl2ZSBpbmV0IHNvY2tldCAlcFxuIiwgc2spOworCQlyZXR1cm47CisJfQorCisJQlVHX1RSQVAoIWF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykpOworCUJVR19UUkFQKCFhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpKTsKKwlCVUdfVFJBUCghc2stPnNrX3dtZW1fcXVldWVkKTsKKwlCVUdfVFJBUCghc2stPnNrX2ZvcndhcmRfYWxsb2MpOworCisJaWYgKGluZXQtPm9wdCkKKwkJa2ZyZWUoaW5ldC0+b3B0KTsKKwlkc3RfcmVsZWFzZShzay0+c2tfZHN0X2NhY2hlKTsKKyNpZmRlZiBJTkVUX1JFRkNOVF9ERUJVRworCWF0b21pY19kZWMoJmluZXRfc29ja19ucik7CisJcHJpbnRrKEtFUk5fREVCVUcgIklORVQgc29ja2V0ICVwIHJlbGVhc2VkLCAlZCBhcmUgc3RpbGwgYWxpdmVcbiIsCisJICAgICAgIHNrLCBhdG9taWNfcmVhZCgmaW5ldF9zb2NrX25yKSk7CisjZW5kaWYKK30KKworLyoKKyAqCVRoZSByb3V0aW5lcyBiZXlvbmQgdGhpcyBwb2ludCBoYW5kbGUgdGhlIGJlaGF2aW91ciBvZiBhbiBBRl9JTkVUCisgKglzb2NrZXQgb2JqZWN0LiBNb3N0bHkgaXQgcHVudHMgdG8gdGhlIHN1YnByb3RvY29scyBvZiBJUCB0byBkbworICoJdGhlIHdvcmsuCisgKi8KKworLyoKKyAqCUF1dG9tYXRpY2FsbHkgYmluZCBhbiB1bmJvdW5kIHNvY2tldC4KKyAqLworCitzdGF0aWMgaW50IGluZXRfYXV0b2JpbmQoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQ7CisJLyogV2UgbWF5IG5lZWQgdG8gYmluZCB0aGUgc29ja2V0LiAqLworCWxvY2tfc29jayhzayk7CisJaW5ldCA9IGluZXRfc2soc2spOworCWlmICghaW5ldC0+bnVtKSB7CisJCWlmIChzay0+c2tfcHJvdC0+Z2V0X3BvcnQoc2ssIDApKSB7CisJCQlyZWxlYXNlX3NvY2soc2spOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwkJaW5ldC0+c3BvcnQgPSBodG9ucyhpbmV0LT5udW0pOworCX0KKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiAwOworfQorCisvKgorICoJTW92ZSBhIHNvY2tldCBpbnRvIGxpc3RlbmluZyBzdGF0ZS4KKyAqLworaW50IGluZXRfbGlzdGVuKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBiYWNrbG9nKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXVuc2lnbmVkIGNoYXIgb2xkX3N0YXRlOworCWludCBlcnI7CisKKwlsb2NrX3NvY2soc2spOworCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoc29jay0+c3RhdGUgIT0gU1NfVU5DT05ORUNURUQgfHwgc29jay0+dHlwZSAhPSBTT0NLX1NUUkVBTSkKKwkJZ290byBvdXQ7CisKKwlvbGRfc3RhdGUgPSBzay0+c2tfc3RhdGU7CisJaWYgKCEoKDEgPDwgb2xkX3N0YXRlKSAmIChUQ1BGX0NMT1NFIHwgVENQRl9MSVNURU4pKSkKKwkJZ290byBvdXQ7CisKKwkvKiBSZWFsbHksIGlmIHRoZSBzb2NrZXQgaXMgYWxyZWFkeSBpbiBsaXN0ZW4gc3RhdGUKKwkgKiB3ZSBjYW4gb25seSBhbGxvdyB0aGUgYmFja2xvZyB0byBiZSBhZGp1c3RlZC4KKwkgKi8KKwlpZiAob2xkX3N0YXRlICE9IFRDUF9MSVNURU4pIHsKKwkJZXJyID0gdGNwX2xpc3Rlbl9zdGFydChzayk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwl9CisJc2stPnNrX21heF9hY2tfYmFja2xvZyA9IGJhY2tsb2c7CisJZXJyID0gMDsKKworb3V0OgorCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqCUNyZWF0ZSBhbiBpbmV0IHNvY2tldC4KKyAqLworCitzdGF0aWMgaW50IGluZXRfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgaW5ldF9wcm90b3N3ICphbnN3ZXI7CisJc3RydWN0IGluZXRfc29jayAqaW5ldDsKKwlzdHJ1Y3QgcHJvdG8gKmFuc3dlcl9wcm90OworCXVuc2lnbmVkIGNoYXIgYW5zd2VyX2ZsYWdzOworCWNoYXIgYW5zd2VyX25vX2NoZWNrOworCWludCBlcnI7CisKKwlzb2NrLT5zdGF0ZSA9IFNTX1VOQ09OTkVDVEVEOworCisJLyogTG9vayBmb3IgdGhlIHJlcXVlc3RlZCB0eXBlL3Byb3RvY29sIHBhaXIuICovCisJYW5zd2VyID0gTlVMTDsKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9yY3UocCwgJmluZXRzd1tzb2NrLT50eXBlXSkgeworCQlhbnN3ZXIgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBpbmV0X3Byb3Rvc3csIGxpc3QpOworCisJCS8qIENoZWNrIHRoZSBub24td2lsZCBtYXRjaC4gKi8KKwkJaWYgKHByb3RvY29sID09IGFuc3dlci0+cHJvdG9jb2wpIHsKKwkJCWlmIChwcm90b2NvbCAhPSBJUFBST1RPX0lQKQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJLyogQ2hlY2sgZm9yIHRoZSB0d28gd2lsZCBjYXNlcy4gKi8KKwkJCWlmIChJUFBST1RPX0lQID09IHByb3RvY29sKSB7CisJCQkJcHJvdG9jb2wgPSBhbnN3ZXItPnByb3RvY29sOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKElQUFJPVE9fSVAgPT0gYW5zd2VyLT5wcm90b2NvbCkKKwkJCQlicmVhazsKKwkJfQorCQlhbnN3ZXIgPSBOVUxMOworCX0KKworCWVyciA9IC1FU09DS1ROT1NVUFBPUlQ7CisJaWYgKCFhbnN3ZXIpCisJCWdvdG8gb3V0X3JjdV91bmxvY2s7CisJZXJyID0gLUVQRVJNOworCWlmIChhbnN3ZXItPmNhcGFiaWxpdHkgPiAwICYmICFjYXBhYmxlKGFuc3dlci0+Y2FwYWJpbGl0eSkpCisJCWdvdG8gb3V0X3JjdV91bmxvY2s7CisJZXJyID0gLUVQUk9UT05PU1VQUE9SVDsKKwlpZiAoIXByb3RvY29sKQorCQlnb3RvIG91dF9yY3VfdW5sb2NrOworCisJc29jay0+b3BzID0gYW5zd2VyLT5vcHM7CisJYW5zd2VyX3Byb3QgPSBhbnN3ZXItPnByb3Q7CisJYW5zd2VyX25vX2NoZWNrID0gYW5zd2VyLT5ub19jaGVjazsKKwlhbnN3ZXJfZmxhZ3MgPSBhbnN3ZXItPmZsYWdzOworCXJjdV9yZWFkX3VubG9jaygpOworCisJQlVHX1RSQVAoYW5zd2VyX3Byb3QtPnNsYWIgIT0gTlVMTCk7CisKKwllcnIgPSAtRU5PQlVGUzsKKwlzayA9IHNrX2FsbG9jKFBGX0lORVQsIEdGUF9LRVJORUwsIGFuc3dlcl9wcm90LCAxKTsKKwlpZiAoc2sgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAwOworCXNrLT5za19ub19jaGVjayA9IGFuc3dlcl9ub19jaGVjazsKKwlpZiAoSU5FVF9QUk9UT1NXX1JFVVNFICYgYW5zd2VyX2ZsYWdzKQorCQlzay0+c2tfcmV1c2UgPSAxOworCisJaW5ldCA9IGluZXRfc2soc2spOworCisJaWYgKFNPQ0tfUkFXID09IHNvY2stPnR5cGUpIHsKKwkJaW5ldC0+bnVtID0gcHJvdG9jb2w7CisJCWlmIChJUFBST1RPX1JBVyA9PSBwcm90b2NvbCkKKwkJCWluZXQtPmhkcmluY2wgPSAxOworCX0KKworCWlmIChpcHY0X2NvbmZpZy5ub19wbXR1X2Rpc2MpCisJCWluZXQtPnBtdHVkaXNjID0gSVBfUE1UVURJU0NfRE9OVDsKKwllbHNlCisJCWluZXQtPnBtdHVkaXNjID0gSVBfUE1UVURJU0NfV0FOVDsKKworCWluZXQtPmlkID0gMDsKKworCXNvY2tfaW5pdF9kYXRhKHNvY2ssIHNrKTsKKworCXNrLT5za19kZXN0cnVjdAkgICA9IGluZXRfc29ja19kZXN0cnVjdDsKKwlzay0+c2tfZmFtaWx5CSAgID0gUEZfSU5FVDsKKwlzay0+c2tfcHJvdG9jb2wJICAgPSBwcm90b2NvbDsKKwlzay0+c2tfYmFja2xvZ19yY3YgPSBzay0+c2tfcHJvdC0+YmFja2xvZ19yY3Y7CisKKwlpbmV0LT51Y190dGwJPSAtMTsKKwlpbmV0LT5tY19sb29wCT0gMTsKKwlpbmV0LT5tY190dGwJPSAxOworCWluZXQtPm1jX2luZGV4CT0gMDsKKwlpbmV0LT5tY19saXN0CT0gTlVMTDsKKworI2lmZGVmIElORVRfUkVGQ05UX0RFQlVHCisJYXRvbWljX2luYygmaW5ldF9zb2NrX25yKTsKKyNlbmRpZgorCisJaWYgKGluZXQtPm51bSkgeworCQkvKiBJdCBhc3N1bWVzIHRoYXQgYW55IHByb3RvY29sIHdoaWNoIGFsbG93cworCQkgKiB0aGUgdXNlciB0byBhc3NpZ24gYSBudW1iZXIgYXQgc29ja2V0CisJCSAqIGNyZWF0aW9uIHRpbWUgYXV0b21hdGljYWxseQorCQkgKiBzaGFyZXMuCisJCSAqLworCQlpbmV0LT5zcG9ydCA9IGh0b25zKGluZXQtPm51bSk7CisJCS8qIEFkZCB0byBwcm90b2NvbCBoYXNoIGNoYWlucy4gKi8KKwkJc2stPnNrX3Byb3QtPmhhc2goc2spOworCX0KKworCWlmIChzay0+c2tfcHJvdC0+aW5pdCkgeworCQllcnIgPSBzay0+c2tfcHJvdC0+aW5pdChzayk7CisJCWlmIChlcnIpCisJCQlza19jb21tb25fcmVsZWFzZShzayk7CisJfQorb3V0OgorCXJldHVybiBlcnI7CitvdXRfcmN1X3VubG9jazoKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlnb3RvIG91dDsKK30KKworCisvKgorICoJVGhlIHBlZXIgc29ja2V0IHNob3VsZCBhbHdheXMgYmUgTlVMTCAob3IgZWxzZSkuIFdoZW4gd2UgY2FsbCB0aGlzCisgKglmdW5jdGlvbiB3ZSBhcmUgZGVzdHJveWluZyB0aGUgb2JqZWN0IGFuZCBmcm9tIHRoZW4gb24gbm9ib2R5CisgKglzaG91bGQgcmVmZXIgdG8gaXQuCisgKi8KK2ludCBpbmV0X3JlbGVhc2Uoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKworCWlmIChzaykgeworCQlsb25nIHRpbWVvdXQ7CisKKwkJLyogQXBwbGljYXRpb25zIGZvcmdldCB0byBsZWF2ZSBncm91cHMgYmVmb3JlIGV4aXRpbmcgKi8KKwkJaXBfbWNfZHJvcF9zb2NrZXQoc2spOworCisJCS8qIElmIGxpbmdlciBpcyBzZXQsIHdlIGRvbid0IHJldHVybiB1bnRpbCB0aGUgY2xvc2UKKwkJICogaXMgY29tcGxldGUuICBPdGhlcndpc2Ugd2UgcmV0dXJuIGltbWVkaWF0ZWx5LiBUaGUKKwkJICogYWN0dWFsbHkgY2xvc2luZyBpcyBkb25lIHRoZSBzYW1lIGVpdGhlciB3YXkuCisJCSAqCisJCSAqIElmIHRoZSBjbG9zZSBpcyBkdWUgdG8gdGhlIHByb2Nlc3MgZXhpdGluZywgd2UgbmV2ZXIKKwkJICogbGluZ2VyLi4KKwkJICovCisJCXRpbWVvdXQgPSAwOworCQlpZiAoc29ja19mbGFnKHNrLCBTT0NLX0xJTkdFUikgJiYKKwkJICAgICEoY3VycmVudC0+ZmxhZ3MgJiBQRl9FWElUSU5HKSkKKwkJCXRpbWVvdXQgPSBzay0+c2tfbGluZ2VydGltZTsKKwkJc29jay0+c2sgPSBOVUxMOworCQlzay0+c2tfcHJvdC0+Y2xvc2Uoc2ssIHRpbWVvdXQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogSXQgaXMgb2ZmIGJ5IGRlZmF1bHQsIHNlZSBiZWxvdy4gKi8KK2ludCBzeXNjdGxfaXBfbm9ubG9jYWxfYmluZDsKKworaW50IGluZXRfYmluZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLCBpbnQgYWRkcl9sZW4pCit7CisJc3RydWN0IHNvY2thZGRyX2luICphZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXVhZGRyOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwl1bnNpZ25lZCBzaG9ydCBzbnVtOworCWludCBjaGtfYWRkcl9yZXQ7CisJaW50IGVycjsKKworCS8qIElmIHRoZSBzb2NrZXQgaGFzIGl0cyBvd24gYmluZCBmdW5jdGlvbiB0aGVuIHVzZSBpdC4gKFJBVykgKi8KKwlpZiAoc2stPnNrX3Byb3QtPmJpbmQpIHsKKwkJZXJyID0gc2stPnNrX3Byb3QtPmJpbmQoc2ssIHVhZGRyLCBhZGRyX2xlbik7CisJCWdvdG8gb3V0OworCX0KKwllcnIgPSAtRUlOVkFMOworCWlmIChhZGRyX2xlbiA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKQorCQlnb3RvIG91dDsKKworCWNoa19hZGRyX3JldCA9IGluZXRfYWRkcl90eXBlKGFkZHItPnNpbl9hZGRyLnNfYWRkcik7CisKKwkvKiBOb3Qgc3BlY2lmaWVkIGJ5IGFueSBzdGFuZGFyZCBwZXItc2UsIGhvd2V2ZXIgaXQgYnJlYWtzIHRvbworCSAqIG1hbnkgYXBwbGljYXRpb25zIHdoZW4gcmVtb3ZlZC4gIEl0IGlzIHVuZm9ydHVuYXRlIHNpbmNlCisJICogYWxsb3dpbmcgYXBwbGljYXRpb25zIHRvIG1ha2UgYSBub24tbG9jYWwgYmluZCBzb2x2ZXMKKwkgKiBzZXZlcmFsIHByb2JsZW1zIHdpdGggc3lzdGVtcyB1c2luZyBkeW5hbWljIGFkZHJlc3NpbmcuCisJICogKGllLiB5b3VyIHNlcnZlcnMgc3RpbGwgc3RhcnQgdXAgZXZlbiBpZiB5b3VyIElTRE4gbGluaworCSAqICBpcyB0ZW1wb3JhcmlseSBkb3duKQorCSAqLworCWVyciA9IC1FQUREUk5PVEFWQUlMOworCWlmICghc3lzY3RsX2lwX25vbmxvY2FsX2JpbmQgJiYKKwkgICAgIWluZXQtPmZyZWViaW5kICYmCisJICAgIGFkZHItPnNpbl9hZGRyLnNfYWRkciAhPSBJTkFERFJfQU5ZICYmCisJICAgIGNoa19hZGRyX3JldCAhPSBSVE5fTE9DQUwgJiYKKwkgICAgY2hrX2FkZHJfcmV0ICE9IFJUTl9NVUxUSUNBU1QgJiYKKwkgICAgY2hrX2FkZHJfcmV0ICE9IFJUTl9CUk9BRENBU1QpCisJCWdvdG8gb3V0OworCisJc251bSA9IG50b2hzKGFkZHItPnNpbl9wb3J0KTsKKwllcnIgPSAtRUFDQ0VTOworCWlmIChzbnVtICYmIHNudW0gPCBQUk9UX1NPQ0sgJiYgIWNhcGFibGUoQ0FQX05FVF9CSU5EX1NFUlZJQ0UpKQorCQlnb3RvIG91dDsKKworCS8qICAgICAgV2Uga2VlcCBhIHBhaXIgb2YgYWRkcmVzc2VzLiByY3Zfc2FkZHIgaXMgdGhlIG9uZQorCSAqICAgICAgdXNlZCBieSBoYXNoIGxvb2t1cHMsIGFuZCBzYWRkciBpcyB1c2VkIGZvciB0cmFuc21pdC4KKwkgKgorCSAqICAgICAgSW4gdGhlIEJTRCBBUEkgdGhlc2UgYXJlIHRoZSBzYW1lIGV4Y2VwdCB3aGVyZSBpdAorCSAqICAgICAgd291bGQgYmUgaWxsZWdhbCB0byB1c2UgdGhlbSAobXVsdGljYXN0L2Jyb2FkY2FzdCkgaW4KKwkgKiAgICAgIHdoaWNoIGNhc2UgdGhlIHNlbmRpbmcgZGV2aWNlIGFkZHJlc3MgaXMgdXNlZC4KKwkgKi8KKwlsb2NrX3NvY2soc2spOworCisJLyogQ2hlY2sgdGhlc2UgZXJyb3JzIChhY3RpdmUgc29ja2V0LCBkb3VibGUgYmluZCkuICovCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9DTE9TRSB8fCBpbmV0LT5udW0pCisJCWdvdG8gb3V0X3JlbGVhc2Vfc29jazsKKworCWluZXQtPnJjdl9zYWRkciA9IGluZXQtPnNhZGRyID0gYWRkci0+c2luX2FkZHIuc19hZGRyOworCWlmIChjaGtfYWRkcl9yZXQgPT0gUlROX01VTFRJQ0FTVCB8fCBjaGtfYWRkcl9yZXQgPT0gUlROX0JST0FEQ0FTVCkKKwkJaW5ldC0+c2FkZHIgPSAwOyAgLyogVXNlIGRldmljZSAqLworCisJLyogTWFrZSBzdXJlIHdlIGFyZSBhbGxvd2VkIHRvIGJpbmQgaGVyZS4gKi8KKwlpZiAoc2stPnNrX3Byb3QtPmdldF9wb3J0KHNrLCBzbnVtKSkgeworCQlpbmV0LT5zYWRkciA9IGluZXQtPnJjdl9zYWRkciA9IDA7CisJCWVyciA9IC1FQUREUklOVVNFOworCQlnb3RvIG91dF9yZWxlYXNlX3NvY2s7CisJfQorCisJaWYgKGluZXQtPnJjdl9zYWRkcikKKwkJc2stPnNrX3VzZXJsb2NrcyB8PSBTT0NLX0JJTkRBRERSX0xPQ0s7CisJaWYgKHNudW0pCisJCXNrLT5za191c2VybG9ja3MgfD0gU09DS19CSU5EUE9SVF9MT0NLOworCWluZXQtPnNwb3J0ID0gaHRvbnMoaW5ldC0+bnVtKTsKKwlpbmV0LT5kYWRkciA9IDA7CisJaW5ldC0+ZHBvcnQgPSAwOworCXNrX2RzdF9yZXNldChzayk7CisJZXJyID0gMDsKK291dF9yZWxlYXNlX3NvY2s6CisJcmVsZWFzZV9zb2NrKHNrKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitpbnQgaW5ldF9kZ3JhbV9jb25uZWN0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqIHVhZGRyLAorCQkgICAgICAgaW50IGFkZHJfbGVuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisKKwlpZiAodWFkZHItPnNhX2ZhbWlseSA9PSBBRl9VTlNQRUMpCisJCXJldHVybiBzay0+c2tfcHJvdC0+ZGlzY29ubmVjdChzaywgZmxhZ3MpOworCisJaWYgKCFpbmV0X3NrKHNrKS0+bnVtICYmIGluZXRfYXV0b2JpbmQoc2spKQorCQlyZXR1cm4gLUVBR0FJTjsKKwlyZXR1cm4gc2stPnNrX3Byb3QtPmNvbm5lY3Qoc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKil1YWRkciwgYWRkcl9sZW4pOworfQorCitzdGF0aWMgbG9uZyBpbmV0X3dhaXRfZm9yX2Nvbm5lY3Qoc3RydWN0IHNvY2sgKnNrLCBsb25nIHRpbWVvKQoreworCURFRklORV9XQUlUKHdhaXQpOworCisJcHJlcGFyZV90b193YWl0KHNrLT5za19zbGVlcCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkvKiBCYXNpYyBhc3N1bXB0aW9uOiBpZiBzb21lb25lIHNldHMgc2stPnNrX2VyciwgaGUgX211c3RfCisJICogY2hhbmdlIHN0YXRlIG9mIHRoZSBzb2NrZXQgZnJvbSBUQ1BfU1lOXyouCisJICogQ29ubmVjdCgpIGRvZXMgbm90IGFsbG93IHRvIGdldCBlcnJvciBub3RpZmljYXRpb25zCisJICogd2l0aG91dCBjbG9zaW5nIHRoZSBzb2NrZXQuCisJICovCisJd2hpbGUgKCgxIDw8IHNrLT5za19zdGF0ZSkgJiAoVENQRl9TWU5fU0VOVCB8IFRDUEZfU1lOX1JFQ1YpKSB7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCXRpbWVvID0gc2NoZWR1bGVfdGltZW91dCh0aW1lbyk7CisJCWxvY2tfc29jayhzayk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSB8fCAhdGltZW8pCisJCQlicmVhazsKKwkJcHJlcGFyZV90b193YWl0KHNrLT5za19zbGVlcCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJfQorCWZpbmlzaF93YWl0KHNrLT5za19zbGVlcCwgJndhaXQpOworCXJldHVybiB0aW1lbzsKK30KKworLyoKKyAqCUNvbm5lY3QgdG8gYSByZW1vdGUgaG9zdC4gVGhlcmUgaXMgcmVncmV0dGFibHkgc3RpbGwgYSBsaXR0bGUKKyAqCVRDUCAnbWFnaWMnIGluIGhlcmUuCisgKi8KK2ludCBpbmV0X3N0cmVhbV9jb25uZWN0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsCisJCQlpbnQgYWRkcl9sZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlpbnQgZXJyOworCWxvbmcgdGltZW87CisKKwlsb2NrX3NvY2soc2spOworCisJaWYgKHVhZGRyLT5zYV9mYW1pbHkgPT0gQUZfVU5TUEVDKSB7CisJCWVyciA9IHNrLT5za19wcm90LT5kaXNjb25uZWN0KHNrLCBmbGFncyk7CisJCXNvY2stPnN0YXRlID0gZXJyID8gU1NfRElTQ09OTkVDVElORyA6IFNTX1VOQ09OTkVDVEVEOworCQlnb3RvIG91dDsKKwl9CisKKwlzd2l0Y2ggKHNvY2stPnN0YXRlKSB7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJY2FzZSBTU19DT05ORUNURUQ6CisJCWVyciA9IC1FSVNDT05OOworCQlnb3RvIG91dDsKKwljYXNlIFNTX0NPTk5FQ1RJTkc6CisJCWVyciA9IC1FQUxSRUFEWTsKKwkJLyogRmFsbCBvdXQgb2Ygc3dpdGNoIHdpdGggZXJyLCBzZXQgZm9yIHRoaXMgc3RhdGUgKi8KKwkJYnJlYWs7CisJY2FzZSBTU19VTkNPTk5FQ1RFRDoKKwkJZXJyID0gLUVJU0NPTk47CisJCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0NMT1NFKQorCQkJZ290byBvdXQ7CisKKwkJZXJyID0gc2stPnNrX3Byb3QtPmNvbm5lY3Qoc2ssIHVhZGRyLCBhZGRyX2xlbik7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXQ7CisKKyAgCQlzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RJTkc7CisKKwkJLyogSnVzdCBlbnRlcmVkIFNTX0NPTk5FQ1RJTkcgc3RhdGU7IHRoZSBvbmx5CisJCSAqIGRpZmZlcmVuY2UgaXMgdGhhdCByZXR1cm4gdmFsdWUgaW4gbm9uLWJsb2NraW5nCisJCSAqIGNhc2UgaXMgRUlOUFJPR1JFU1MsIHJhdGhlciB0aGFuIEVBTFJFQURZLgorCQkgKi8KKwkJZXJyID0gLUVJTlBST0dSRVNTOworCQlicmVhazsKKwl9CisKKwl0aW1lbyA9IHNvY2tfc25kdGltZW8oc2ssIGZsYWdzICYgT19OT05CTE9DSyk7CisKKwlpZiAoKDEgPDwgc2stPnNrX3N0YXRlKSAmIChUQ1BGX1NZTl9TRU5UIHwgVENQRl9TWU5fUkVDVikpIHsKKwkJLyogRXJyb3IgY29kZSBpcyBzZXQgYWJvdmUgKi8KKwkJaWYgKCF0aW1lbyB8fCAhaW5ldF93YWl0X2Zvcl9jb25uZWN0KHNrLCB0aW1lbykpCisJCQlnb3RvIG91dDsKKworCQllcnIgPSBzb2NrX2ludHJfZXJybm8odGltZW8pOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlnb3RvIG91dDsKKwl9CisKKwkvKiBDb25uZWN0aW9uIHdhcyBjbG9zZWQgYnkgUlNULCB0aW1lb3V0LCBJQ01QIGVycm9yCisJICogb3IgYW5vdGhlciBwcm9jZXNzIGRpc2Nvbm5lY3RlZCB1cy4KKwkgKi8KKwlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9DTE9TRSkKKwkJZ290byBzb2NrX2Vycm9yOworCisJLyogc2stPnNrX2VyciBtYXkgYmUgbm90IHplcm8gbm93LCBpZiBSRUNWRVJSIHdhcyBvcmRlcmVkIGJ5IHVzZXIKKwkgKiBhbmQgZXJyb3Igd2FzIHJlY2VpdmVkIGFmdGVyIHNvY2tldCBlbnRlcmVkIGVzdGFibGlzaGVkIHN0YXRlLgorCSAqIEhlbmNlLCBpdCBpcyBoYW5kbGVkIG5vcm1hbGx5IGFmdGVyIGNvbm5lY3QoKSByZXR1cm4gc3VjY2Vzc2Z1bGx5LgorCSAqLworCisJc29jay0+c3RhdGUgPSBTU19DT05ORUNURUQ7CisJZXJyID0gMDsKK291dDoKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7CisKK3NvY2tfZXJyb3I6CisJZXJyID0gc29ja19lcnJvcihzaykgPyA6IC1FQ09OTkFCT1JURUQ7CisJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKKwlpZiAoc2stPnNrX3Byb3QtPmRpc2Nvbm5lY3Qoc2ssIGZsYWdzKSkKKwkJc29jay0+c3RhdGUgPSBTU19ESVNDT05ORUNUSU5HOworCWdvdG8gb3V0OworfQorCisvKgorICoJQWNjZXB0IGEgcGVuZGluZyBjb25uZWN0aW9uLiBUaGUgVENQIGxheWVyIG5vdyBnaXZlcyBCU0Qgc2VtYW50aWNzLgorICovCisKK2ludCBpbmV0X2FjY2VwdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2V0ICpuZXdzb2NrLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2sgKnNrMSA9IHNvY2stPnNrOworCWludCBlcnIgPSAtRUlOVkFMOworCXN0cnVjdCBzb2NrICpzazIgPSBzazEtPnNrX3Byb3QtPmFjY2VwdChzazEsIGZsYWdzLCAmZXJyKTsKKworCWlmICghc2syKQorCQlnb3RvIGRvX2VycjsKKworCWxvY2tfc29jayhzazIpOworCisJQlVHX1RSQVAoKDEgPDwgc2syLT5za19zdGF0ZSkgJgorCQkgKFRDUEZfRVNUQUJMSVNIRUQgfCBUQ1BGX0NMT1NFX1dBSVQgfCBUQ1BGX0NMT1NFKSk7CisKKwlzb2NrX2dyYWZ0KHNrMiwgbmV3c29jayk7CisKKwluZXdzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKwllcnIgPSAwOworCXJlbGVhc2Vfc29jayhzazIpOworZG9fZXJyOgorCXJldHVybiBlcnI7Cit9CisKKworLyoKKyAqCVRoaXMgZG9lcyBib3RoIHBlZXJuYW1lIGFuZCBzb2NrbmFtZS4KKyAqLworaW50IGluZXRfZ2V0bmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLAorCQkJaW50ICp1YWRkcl9sZW4sIGludCBwZWVyKQoreworCXN0cnVjdCBzb2NrICpzawkJPSBzb2NrLT5zazsKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0CT0gaW5ldF9zayhzayk7CisJc3RydWN0IHNvY2thZGRyX2luICpzaW4JPSAoc3RydWN0IHNvY2thZGRyX2luICopdWFkZHI7CisKKwlzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWlmIChwZWVyKSB7CisJCWlmICghaW5ldC0+ZHBvcnQgfHwKKwkJICAgICgoKDEgPDwgc2stPnNrX3N0YXRlKSAmIChUQ1BGX0NMT1NFIHwgVENQRl9TWU5fU0VOVCkpICYmCisJCSAgICAgcGVlciA9PSAxKSkKKwkJCXJldHVybiAtRU5PVENPTk47CisJCXNpbi0+c2luX3BvcnQgPSBpbmV0LT5kcG9ydDsKKwkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSBpbmV0LT5kYWRkcjsKKwl9IGVsc2UgeworCQlfX3UzMiBhZGRyID0gaW5ldC0+cmN2X3NhZGRyOworCQlpZiAoIWFkZHIpCisJCQlhZGRyID0gaW5ldC0+c2FkZHI7CisJCXNpbi0+c2luX3BvcnQgPSBpbmV0LT5zcG9ydDsKKwkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSBhZGRyOworCX0KKwltZW1zZXQoc2luLT5zaW5femVybywgMCwgc2l6ZW9mKHNpbi0+c2luX3plcm8pKTsKKwkqdWFkZHJfbGVuID0gc2l6ZW9mKCpzaW4pOworCXJldHVybiAwOworfQorCitpbnQgaW5ldF9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAorCQkgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisKKwkvKiBXZSBtYXkgbmVlZCB0byBiaW5kIHRoZSBzb2NrZXQuICovCisJaWYgKCFpbmV0X3NrKHNrKS0+bnVtICYmIGluZXRfYXV0b2JpbmQoc2spKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXJldHVybiBzay0+c2tfcHJvdC0+c2VuZG1zZyhpb2NiLCBzaywgbXNnLCBzaXplKTsKK30KKworCitzdGF0aWMgc3NpemVfdCBpbmV0X3NlbmRwYWdlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCisJLyogV2UgbWF5IG5lZWQgdG8gYmluZCB0aGUgc29ja2V0LiAqLworCWlmICghaW5ldF9zayhzayktPm51bSAmJiBpbmV0X2F1dG9iaW5kKHNrKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlpZiAoc2stPnNrX3Byb3QtPnNlbmRwYWdlKQorCQlyZXR1cm4gc2stPnNrX3Byb3QtPnNlbmRwYWdlKHNrLCBwYWdlLCBvZmZzZXQsIHNpemUsIGZsYWdzKTsKKwlyZXR1cm4gc29ja19ub19zZW5kcGFnZShzb2NrLCBwYWdlLCBvZmZzZXQsIHNpemUsIGZsYWdzKTsKK30KKworCitpbnQgaW5ldF9zaHV0ZG93bihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgaG93KQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnIgPSAwOworCisJLyogVGhpcyBzaG91bGQgcmVhbGx5IGNoZWNrIHRvIG1ha2Ugc3VyZQorCSAqIHRoZSBzb2NrZXQgaXMgYSBUQ1Agc29ja2V0LiAoV0hZIEFDLi4uKQorCSAqLworCWhvdysrOyAvKiBtYXBzIDAtPjEgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YgbWFraW5nIGJpdCAxIHJjdnMgYW5kCisJCSAgICAgICAxLT4yIGJpdCAyIHNuZHMuCisJCSAgICAgICAyLT4zICovCisJaWYgKChob3cgJiB+U0hVVERPV05fTUFTSykgfHwgIWhvdykJLyogTUFYSU5ULT4wICovCisJCXJldHVybiAtRUlOVkFMOworCisJbG9ja19zb2NrKHNrKTsKKwlpZiAoc29jay0+c3RhdGUgPT0gU1NfQ09OTkVDVElORykgeworCQlpZiAoKDEgPDwgc2stPnNrX3N0YXRlKSAmCisJCSAgICAoVENQRl9TWU5fU0VOVCB8IFRDUEZfU1lOX1JFQ1YgfCBUQ1BGX0NMT1NFKSkKKwkJCXNvY2stPnN0YXRlID0gU1NfRElTQ09OTkVDVElORzsKKwkJZWxzZQorCQkJc29jay0+c3RhdGUgPSBTU19DT05ORUNURUQ7CisJfQorCisJc3dpdGNoIChzay0+c2tfc3RhdGUpIHsKKwljYXNlIFRDUF9DTE9TRToKKwkJZXJyID0gLUVOT1RDT05OOworCQkvKiBIYWNrIHRvIHdha2UgdXAgb3RoZXIgbGlzdGVuZXJzLCB3aG8gY2FuIHBvbGwgZm9yCisJCSAgIFBPTExIVVAsIGV2ZW4gb24gZWcuIHVuY29ubmVjdGVkIFVEUCBzb2NrZXRzIC0tIFJSICovCisJZGVmYXVsdDoKKwkJc2stPnNrX3NodXRkb3duIHw9IGhvdzsKKwkJaWYgKHNrLT5za19wcm90LT5zaHV0ZG93bikKKwkJCXNrLT5za19wcm90LT5zaHV0ZG93bihzaywgaG93KTsKKwkJYnJlYWs7CisKKwkvKiBSZW1haW5pbmcgdHdvIGJyYW5jaGVzIGFyZSB0ZW1wb3Jhcnkgc29sdXRpb24gZm9yIG1pc3NpbmcKKwkgKiBjbG9zZSgpIGluIG11bHRpdGhyZWFkZWQgZW52aXJvbm1lbnQuIEl0IGlzIF9ub3RfIGEgZ29vZCBpZGVhLAorCSAqIGJ1dCB3ZSBoYXZlIG5vIGNob2ljZSB1bnRpbCBjbG9zZSgpIGlzIHJlcGFpcmVkIGF0IFZGUyBsZXZlbC4KKwkgKi8KKwljYXNlIFRDUF9MSVNURU46CisJCWlmICghKGhvdyAmIFJDVl9TSFVURE9XTikpCisJCQlicmVhazsKKwkJLyogRmFsbCB0aHJvdWdoICovCisJY2FzZSBUQ1BfU1lOX1NFTlQ6CisJCWVyciA9IHNrLT5za19wcm90LT5kaXNjb25uZWN0KHNrLCBPX05PTkJMT0NLKTsKKwkJc29jay0+c3RhdGUgPSBlcnIgPyBTU19ESVNDT05ORUNUSU5HIDogU1NfVU5DT05ORUNURUQ7CisJCWJyZWFrOworCX0KKworCS8qIFdha2UgdXAgYW55b25lIHNsZWVwaW5nIGluIHBvbGwuICovCisJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJaW9jdGwoKSBjYWxscyB5b3UgY2FuIGlzc3VlIG9uIGFuIElORVQgc29ja2V0LiBNb3N0IG9mIHRoZXNlIGFyZQorICoJZGV2aWNlIGNvbmZpZ3VyYXRpb24gYW5kIHN0dWZmIGFuZCB2ZXJ5IHJhcmVseSB1c2VkLiBTb21lIGlvY3RscworICoJcGFzcyBvbiB0byB0aGUgc29ja2V0IGl0c2VsZi4KKyAqCisgKglOT1RFOiBJIGxpa2UgdGhlIGlkZWEgb2YgYSBtb2R1bGUgZm9yIHRoZSBjb25maWcgc3R1ZmYuIGllIGlmY29uZmlnCisgKglsb2FkcyB0aGUgZGV2Y29uZmlndXJlIG1vZHVsZSBkb2VzIGl0cyBjb25maWd1cmluZyBhbmQgdW5sb2FkcyBpdC4KKyAqCVRoZXJlJ3MgYSBnb29kIDIwSyBvZiBjb25maWcgY29kZSBoYW5naW5nIGFyb3VuZCB0aGUga2VybmVsLgorICovCisKK2ludCBpbmV0X2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnIgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBTSU9DR1NUQU1QOgorCQkJZXJyID0gc29ja19nZXRfdGltZXN0YW1wKHNrLCAoc3RydWN0IHRpbWV2YWwgX191c2VyICopYXJnKTsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NBRERSVDoKKwkJY2FzZSBTSU9DREVMUlQ6CisJCWNhc2UgU0lPQ1JUTVNHOgorCQkJZXJyID0gaXBfcnRfaW9jdGwoY21kLCAodm9pZCBfX3VzZXIgKilhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgU0lPQ0RBUlA6CisJCWNhc2UgU0lPQ0dBUlA6CisJCWNhc2UgU0lPQ1NBUlA6CisJCQllcnIgPSBhcnBfaW9jdGwoY21kLCAodm9pZCBfX3VzZXIgKilhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgU0lPQ0dJRkFERFI6CisJCWNhc2UgU0lPQ1NJRkFERFI6CisJCWNhc2UgU0lPQ0dJRkJSREFERFI6CisJCWNhc2UgU0lPQ1NJRkJSREFERFI6CisJCWNhc2UgU0lPQ0dJRk5FVE1BU0s6CisJCWNhc2UgU0lPQ1NJRk5FVE1BU0s6CisJCWNhc2UgU0lPQ0dJRkRTVEFERFI6CisJCWNhc2UgU0lPQ1NJRkRTVEFERFI6CisJCWNhc2UgU0lPQ1NJRlBGTEFHUzoKKwkJY2FzZSBTSU9DR0lGUEZMQUdTOgorCQljYXNlIFNJT0NTSUZGTEFHUzoKKwkJCWVyciA9IGRldmluZXRfaW9jdGwoY21kLCAodm9pZCBfX3VzZXIgKilhcmcpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAoIXNrLT5za19wcm90LT5pb2N0bCB8fAorCQkJICAgIChlcnIgPSBzay0+c2tfcHJvdC0+aW9jdGwoc2ssIGNtZCwgYXJnKSkgPT0KKwkJCSAgICAJCQkJCS1FTk9JT0NUTENNRCkKKwkJCQllcnIgPSBkZXZfaW9jdGwoY21kLCAodm9pZCBfX3VzZXIgKilhcmcpOworCQkJYnJlYWs7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCBwcm90b19vcHMgaW5ldF9zdHJlYW1fb3BzID0geworCS5mYW1pbHkgPQlQRl9JTkVULAorCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5yZWxlYXNlID0JaW5ldF9yZWxlYXNlLAorCS5iaW5kID0JCWluZXRfYmluZCwKKwkuY29ubmVjdCA9CWluZXRfc3RyZWFtX2Nvbm5lY3QsCisJLnNvY2tldHBhaXIgPQlzb2NrX25vX3NvY2tldHBhaXIsCisJLmFjY2VwdCA9CWluZXRfYWNjZXB0LAorCS5nZXRuYW1lID0JaW5ldF9nZXRuYW1lLAorCS5wb2xsID0JCXRjcF9wb2xsLAorCS5pb2N0bCA9CWluZXRfaW9jdGwsCisJLmxpc3RlbiA9CWluZXRfbGlzdGVuLAorCS5zaHV0ZG93biA9CWluZXRfc2h1dGRvd24sCisJLnNldHNvY2tvcHQgPQlzb2NrX2NvbW1vbl9zZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0ID0Jc29ja19jb21tb25fZ2V0c29ja29wdCwKKwkuc2VuZG1zZyA9CWluZXRfc2VuZG1zZywKKwkucmVjdm1zZyA9CXNvY2tfY29tbW9uX3JlY3Ztc2csCisJLm1tYXAgPQkJc29ja19ub19tbWFwLAorCS5zZW5kcGFnZSA9CXRjcF9zZW5kcGFnZQorfTsKKworc3RydWN0IHByb3RvX29wcyBpbmV0X2RncmFtX29wcyA9IHsKKwkuZmFtaWx5ID0JUEZfSU5FVCwKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkucmVsZWFzZSA9CWluZXRfcmVsZWFzZSwKKwkuYmluZCA9CQlpbmV0X2JpbmQsCisJLmNvbm5lY3QgPQlpbmV0X2RncmFtX2Nvbm5lY3QsCisJLnNvY2tldHBhaXIgPQlzb2NrX25vX3NvY2tldHBhaXIsCisJLmFjY2VwdCA9CXNvY2tfbm9fYWNjZXB0LAorCS5nZXRuYW1lID0JaW5ldF9nZXRuYW1lLAorCS5wb2xsID0JCXVkcF9wb2xsLAorCS5pb2N0bCA9CWluZXRfaW9jdGwsCisJLmxpc3RlbiA9CXNvY2tfbm9fbGlzdGVuLAorCS5zaHV0ZG93biA9CWluZXRfc2h1dGRvd24sCisJLnNldHNvY2tvcHQgPQlzb2NrX2NvbW1vbl9zZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0ID0Jc29ja19jb21tb25fZ2V0c29ja29wdCwKKwkuc2VuZG1zZyA9CWluZXRfc2VuZG1zZywKKwkucmVjdm1zZyA9CXNvY2tfY29tbW9uX3JlY3Ztc2csCisJLm1tYXAgPQkJc29ja19ub19tbWFwLAorCS5zZW5kcGFnZSA9CWluZXRfc2VuZHBhZ2UsCit9OworCisvKgorICogRm9yIFNPQ0tfUkFXIHNvY2tldHM7IHNob3VsZCBiZSB0aGUgc2FtZSBhcyBpbmV0X2RncmFtX29wcyBidXQgd2l0aG91dAorICogdWRwX3BvbGwKKyAqLworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgaW5ldF9zb2NrcmF3X29wcyA9IHsKKwkuZmFtaWx5ID0JUEZfSU5FVCwKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkucmVsZWFzZSA9CWluZXRfcmVsZWFzZSwKKwkuYmluZCA9CQlpbmV0X2JpbmQsCisJLmNvbm5lY3QgPQlpbmV0X2RncmFtX2Nvbm5lY3QsCisJLnNvY2tldHBhaXIgPQlzb2NrX25vX3NvY2tldHBhaXIsCisJLmFjY2VwdCA9CXNvY2tfbm9fYWNjZXB0LAorCS5nZXRuYW1lID0JaW5ldF9nZXRuYW1lLAorCS5wb2xsID0JCWRhdGFncmFtX3BvbGwsCisJLmlvY3RsID0JaW5ldF9pb2N0bCwKKwkubGlzdGVuID0Jc29ja19ub19saXN0ZW4sCisJLnNodXRkb3duID0JaW5ldF9zaHV0ZG93biwKKwkuc2V0c29ja29wdCA9CXNvY2tfY29tbW9uX3NldHNvY2tvcHQsCisJLmdldHNvY2tvcHQgPQlzb2NrX2NvbW1vbl9nZXRzb2Nrb3B0LAorCS5zZW5kbXNnID0JaW5ldF9zZW5kbXNnLAorCS5yZWN2bXNnID0Jc29ja19jb21tb25fcmVjdm1zZywKKwkubW1hcCA9CQlzb2NrX25vX21tYXAsCisJLnNlbmRwYWdlID0JaW5ldF9zZW5kcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSBpbmV0X2ZhbWlseV9vcHMgPSB7CisJLmZhbWlseSA9IFBGX0lORVQsCisJLmNyZWF0ZSA9IGluZXRfY3JlYXRlLAorCS5vd25lcgk9IFRISVNfTU9EVUxFLAorfTsKKworCitleHRlcm4gdm9pZCB0Y3BfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHRjcF92NF9pbml0KHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5ICopOworCisvKiBVcG9uIHN0YXJ0dXAgd2UgaW5zZXJ0IGFsbCB0aGUgZWxlbWVudHMgaW4gaW5ldHN3X2FycmF5W10gaW50bworICogdGhlIGxpbmtlZCBsaXN0IGluZXRzdy4KKyAqLworc3RhdGljIHN0cnVjdCBpbmV0X3Byb3Rvc3cgaW5ldHN3X2FycmF5W10gPQoreworICAgICAgICB7CisgICAgICAgICAgICAgICAgLnR5cGUgPSAgICAgICBTT0NLX1NUUkVBTSwKKyAgICAgICAgICAgICAgICAucHJvdG9jb2wgPSAgIElQUFJPVE9fVENQLAorICAgICAgICAgICAgICAgIC5wcm90ID0gICAgICAgJnRjcF9wcm90LAorICAgICAgICAgICAgICAgIC5vcHMgPSAgICAgICAgJmluZXRfc3RyZWFtX29wcywKKyAgICAgICAgICAgICAgICAuY2FwYWJpbGl0eSA9IC0xLAorICAgICAgICAgICAgICAgIC5ub19jaGVjayA9ICAgMCwKKyAgICAgICAgICAgICAgICAuZmxhZ3MgPSAgICAgIElORVRfUFJPVE9TV19QRVJNQU5FTlQsCisgICAgICAgIH0sCisKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC50eXBlID0gICAgICAgU09DS19ER1JBTSwKKyAgICAgICAgICAgICAgICAucHJvdG9jb2wgPSAgIElQUFJPVE9fVURQLAorICAgICAgICAgICAgICAgIC5wcm90ID0gICAgICAgJnVkcF9wcm90LAorICAgICAgICAgICAgICAgIC5vcHMgPSAgICAgICAgJmluZXRfZGdyYW1fb3BzLAorICAgICAgICAgICAgICAgIC5jYXBhYmlsaXR5ID0gLTEsCisgICAgICAgICAgICAgICAgLm5vX2NoZWNrID0gICBVRFBfQ1NVTV9ERUZBVUxULAorICAgICAgICAgICAgICAgIC5mbGFncyA9ICAgICAgSU5FVF9QUk9UT1NXX1BFUk1BTkVOVCwKKyAgICAgICB9LAorICAgICAgICAKKworICAgICAgIHsKKyAgICAgICAgICAgICAgIC50eXBlID0gICAgICAgU09DS19SQVcsCisgICAgICAgICAgICAgICAucHJvdG9jb2wgPSAgIElQUFJPVE9fSVAsCS8qIHdpbGQgY2FyZCAqLworICAgICAgICAgICAgICAgLnByb3QgPSAgICAgICAmcmF3X3Byb3QsCisgICAgICAgICAgICAgICAub3BzID0gICAgICAgICZpbmV0X3NvY2tyYXdfb3BzLAorICAgICAgICAgICAgICAgLmNhcGFiaWxpdHkgPSBDQVBfTkVUX1JBVywKKyAgICAgICAgICAgICAgIC5ub19jaGVjayA9ICAgVURQX0NTVU1fREVGQVVMVCwKKyAgICAgICAgICAgICAgIC5mbGFncyA9ICAgICAgSU5FVF9QUk9UT1NXX1JFVVNFLAorICAgICAgIH0KK307CisKKyNkZWZpbmUgSU5FVFNXX0FSUkFZX0xFTiAoc2l6ZW9mKGluZXRzd19hcnJheSkgLyBzaXplb2Yoc3RydWN0IGluZXRfcHJvdG9zdykpCisKK3ZvaWQgaW5ldF9yZWdpc3Rlcl9wcm90b3N3KHN0cnVjdCBpbmV0X3Byb3Rvc3cgKnApCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGg7CisJc3RydWN0IGluZXRfcHJvdG9zdyAqYW5zd2VyOworCWludCBwcm90b2NvbCA9IHAtPnByb3RvY29sOworCXN0cnVjdCBsaXN0X2hlYWQgKmxhc3RfcGVybTsKKworCXNwaW5fbG9ja19iaCgmaW5ldHN3X2xvY2spOworCisJaWYgKHAtPnR5cGUgPj0gU09DS19NQVgpCisJCWdvdG8gb3V0X2lsbGVnYWw7CisKKwkvKiBJZiB3ZSBhcmUgdHJ5aW5nIHRvIG92ZXJyaWRlIGEgcGVybWFuZW50IHByb3RvY29sLCBiYWlsLiAqLworCWFuc3dlciA9IE5VTEw7CisJbGFzdF9wZXJtID0gJmluZXRzd1twLT50eXBlXTsKKwlsaXN0X2Zvcl9lYWNoKGxoLCAmaW5ldHN3W3AtPnR5cGVdKSB7CisJCWFuc3dlciA9IGxpc3RfZW50cnkobGgsIHN0cnVjdCBpbmV0X3Byb3Rvc3csIGxpc3QpOworCisJCS8qIENoZWNrIG9ubHkgdGhlIG5vbi13aWxkIG1hdGNoLiAqLworCQlpZiAoSU5FVF9QUk9UT1NXX1BFUk1BTkVOVCAmIGFuc3dlci0+ZmxhZ3MpIHsKKwkJCWlmIChwcm90b2NvbCA9PSBhbnN3ZXItPnByb3RvY29sKQorCQkJCWJyZWFrOworCQkJbGFzdF9wZXJtID0gbGg7CisJCX0KKworCQlhbnN3ZXIgPSBOVUxMOworCX0KKwlpZiAoYW5zd2VyKQorCQlnb3RvIG91dF9wZXJtYW5lbnQ7CisKKwkvKiBBZGQgdGhlIG5ldyBlbnRyeSBhZnRlciB0aGUgbGFzdCBwZXJtYW5lbnQgZW50cnkgaWYgYW55LCBzbyB0aGF0CisJICogdGhlIG5ldyBlbnRyeSBkb2VzIG5vdCBvdmVycmlkZSBhIHBlcm1hbmVudCBlbnRyeSB3aGVuIG1hdGNoZWQgd2l0aAorCSAqIGEgd2lsZC1jYXJkIHByb3RvY29sLiBCdXQgaXQgaXMgYWxsb3dlZCB0byBvdmVycmlkZSBhbnkgZXhpc3RpbmcKKwkgKiBub24tcGVybWFuZW50IGVudHJ5LiAgVGhpcyBtZWFucyB0aGF0IHdoZW4gd2UgcmVtb3ZlIHRoaXMgZW50cnksIHRoZSAKKwkgKiBzeXN0ZW0gYXV0b21hdGljYWxseSByZXR1cm5zIHRvIHRoZSBvbGQgYmVoYXZpb3IuCisJICovCisJbGlzdF9hZGRfcmN1KCZwLT5saXN0LCBsYXN0X3Blcm0pOworb3V0OgorCXNwaW5fdW5sb2NrX2JoKCZpbmV0c3dfbG9jayk7CisKKwlzeW5jaHJvbml6ZV9uZXQoKTsKKworCXJldHVybjsKKworb3V0X3Blcm1hbmVudDoKKwlwcmludGsoS0VSTl9FUlIgIkF0dGVtcHQgdG8gb3ZlcnJpZGUgcGVybWFuZW50IHByb3RvY29sICVkLlxuIiwKKwkgICAgICAgcHJvdG9jb2wpOworCWdvdG8gb3V0OworCitvdXRfaWxsZWdhbDoKKwlwcmludGsoS0VSTl9FUlIKKwkgICAgICAgIklnbm9yaW5nIGF0dGVtcHQgdG8gcmVnaXN0ZXIgaW52YWxpZCBzb2NrZXQgdHlwZSAlZC5cbiIsCisJICAgICAgIHAtPnR5cGUpOworCWdvdG8gb3V0OworfQorCit2b2lkIGluZXRfdW5yZWdpc3Rlcl9wcm90b3N3KHN0cnVjdCBpbmV0X3Byb3Rvc3cgKnApCit7CisJaWYgKElORVRfUFJPVE9TV19QRVJNQU5FTlQgJiBwLT5mbGFncykgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJBdHRlbXB0IHRvIHVucmVnaXN0ZXIgcGVybWFuZW50IHByb3RvY29sICVkLlxuIiwKKwkJICAgICAgIHAtPnByb3RvY29sKTsKKwl9IGVsc2UgeworCQlzcGluX2xvY2tfYmgoJmluZXRzd19sb2NrKTsKKwkJbGlzdF9kZWxfcmN1KCZwLT5saXN0KTsKKwkJc3Bpbl91bmxvY2tfYmgoJmluZXRzd19sb2NrKTsKKworCQlzeW5jaHJvbml6ZV9uZXQoKTsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfSVBfTVVMVElDQVNUCitzdGF0aWMgc3RydWN0IG5ldF9wcm90b2NvbCBpZ21wX3Byb3RvY29sID0geworCS5oYW5kbGVyID0JaWdtcF9yY3YsCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvY29sIHRjcF9wcm90b2NvbCA9IHsKKwkuaGFuZGxlciA9CXRjcF92NF9yY3YsCisJLmVycl9oYW5kbGVyID0JdGNwX3Y0X2VyciwKKwkubm9fcG9saWN5ID0JMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvY29sIHVkcF9wcm90b2NvbCA9IHsKKwkuaGFuZGxlciA9CXVkcF9yY3YsCisJLmVycl9oYW5kbGVyID0JdWRwX2VyciwKKwkubm9fcG9saWN5ID0JMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvY29sIGljbXBfcHJvdG9jb2wgPSB7CisJLmhhbmRsZXIgPQlpY21wX3JjdiwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfaXB2NF9taWJzKHZvaWQpCit7CisJbmV0X3N0YXRpc3RpY3NbMF0gPSBhbGxvY19wZXJjcHUoc3RydWN0IGxpbnV4X21pYik7CisJbmV0X3N0YXRpc3RpY3NbMV0gPSBhbGxvY19wZXJjcHUoc3RydWN0IGxpbnV4X21pYik7CisJaXBfc3RhdGlzdGljc1swXSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgaXBzdGF0c19taWIpOworCWlwX3N0YXRpc3RpY3NbMV0gPSBhbGxvY19wZXJjcHUoc3RydWN0IGlwc3RhdHNfbWliKTsKKwlpY21wX3N0YXRpc3RpY3NbMF0gPSBhbGxvY19wZXJjcHUoc3RydWN0IGljbXBfbWliKTsKKwlpY21wX3N0YXRpc3RpY3NbMV0gPSBhbGxvY19wZXJjcHUoc3RydWN0IGljbXBfbWliKTsKKwl0Y3Bfc3RhdGlzdGljc1swXSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgdGNwX21pYik7CisJdGNwX3N0YXRpc3RpY3NbMV0gPSBhbGxvY19wZXJjcHUoc3RydWN0IHRjcF9taWIpOworCXVkcF9zdGF0aXN0aWNzWzBdID0gYWxsb2NfcGVyY3B1KHN0cnVjdCB1ZHBfbWliKTsKKwl1ZHBfc3RhdGlzdGljc1sxXSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgdWRwX21pYik7CisJaWYgKCEKKwkgICAgKG5ldF9zdGF0aXN0aWNzWzBdICYmIG5ldF9zdGF0aXN0aWNzWzFdICYmIGlwX3N0YXRpc3RpY3NbMF0KKwkgICAgICYmIGlwX3N0YXRpc3RpY3NbMV0gJiYgdGNwX3N0YXRpc3RpY3NbMF0gJiYgdGNwX3N0YXRpc3RpY3NbMV0KKwkgICAgICYmIHVkcF9zdGF0aXN0aWNzWzBdICYmIHVkcF9zdGF0aXN0aWNzWzFdKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkodm9pZCkgdGNwX21pYl9pbml0KCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHY0X3Byb2NfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGlwZnJhZ19pbml0KHZvaWQpOworCitzdGF0aWMgaW50IF9faW5pdCBpbmV0X2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqZHVtbXlfc2tiOworCXN0cnVjdCBpbmV0X3Byb3Rvc3cgKnE7CisJc3RydWN0IGxpc3RfaGVhZCAqcjsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJaWYgKHNpemVvZihzdHJ1Y3QgaW5ldF9za2JfcGFybSkgPiBzaXplb2YoZHVtbXlfc2tiLT5jYikpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6IHBhbmljXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dDsKKwl9CisKKwlyYyA9IHByb3RvX3JlZ2lzdGVyKCZ0Y3BfcHJvdCwgMSk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKworCXJjID0gcHJvdG9fcmVnaXN0ZXIoJnVkcF9wcm90LCAxKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0X3VucmVnaXN0ZXJfdGNwX3Byb3RvOworCisJcmMgPSBwcm90b19yZWdpc3RlcigmcmF3X3Byb3QsIDEpOworCWlmIChyYykKKwkJZ290byBvdXRfdW5yZWdpc3Rlcl91ZHBfcHJvdG87CisKKwkvKgorCSAqCVRlbGwgU09DS0VUIHRoYXQgd2UgYXJlIGFsaXZlLi4uIAorCSAqLworCisgIAkodm9pZClzb2NrX3JlZ2lzdGVyKCZpbmV0X2ZhbWlseV9vcHMpOworCisJLyoKKwkgKglBZGQgYWxsIHRoZSBiYXNlIHByb3RvY29scy4KKwkgKi8KKworCWlmIChpbmV0X2FkZF9wcm90b2NvbCgmaWNtcF9wcm90b2NvbCwgSVBQUk9UT19JQ01QKSA8IDApCisJCXByaW50ayhLRVJOX0NSSVQgImluZXRfaW5pdDogQ2Fubm90IGFkZCBJQ01QIHByb3RvY29sXG4iKTsKKwlpZiAoaW5ldF9hZGRfcHJvdG9jb2woJnVkcF9wcm90b2NvbCwgSVBQUk9UT19VRFApIDwgMCkKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiaW5ldF9pbml0OiBDYW5ub3QgYWRkIFVEUCBwcm90b2NvbFxuIik7CisJaWYgKGluZXRfYWRkX3Byb3RvY29sKCZ0Y3BfcHJvdG9jb2wsIElQUFJPVE9fVENQKSA8IDApCisJCXByaW50ayhLRVJOX0NSSVQgImluZXRfaW5pdDogQ2Fubm90IGFkZCBUQ1AgcHJvdG9jb2xcbiIpOworI2lmZGVmIENPTkZJR19JUF9NVUxUSUNBU1QKKwlpZiAoaW5ldF9hZGRfcHJvdG9jb2woJmlnbXBfcHJvdG9jb2wsIElQUFJPVE9fSUdNUCkgPCAwKQorCQlwcmludGsoS0VSTl9DUklUICJpbmV0X2luaXQ6IENhbm5vdCBhZGQgSUdNUCBwcm90b2NvbFxuIik7CisjZW5kaWYKKworCS8qIFJlZ2lzdGVyIHRoZSBzb2NrZXQtc2lkZSBpbmZvcm1hdGlvbiBmb3IgaW5ldF9jcmVhdGUuICovCisJZm9yIChyID0gJmluZXRzd1swXTsgciA8ICZpbmV0c3dbU09DS19NQVhdOyArK3IpCisJCUlOSVRfTElTVF9IRUFEKHIpOworCisJZm9yIChxID0gaW5ldHN3X2FycmF5OyBxIDwgJmluZXRzd19hcnJheVtJTkVUU1dfQVJSQVlfTEVOXTsgKytxKQorCQlpbmV0X3JlZ2lzdGVyX3Byb3Rvc3cocSk7CisKKwkvKgorCSAqCVNldCB0aGUgQVJQIG1vZHVsZSB1cAorCSAqLworCisJYXJwX2luaXQoKTsKKworICAJLyoKKyAgCSAqCVNldCB0aGUgSVAgbW9kdWxlIHVwCisgIAkgKi8KKworCWlwX2luaXQoKTsKKworCXRjcF92NF9pbml0KCZpbmV0X2ZhbWlseV9vcHMpOworCisJLyogU2V0dXAgVENQIHNsYWIgY2FjaGUgZm9yIG9wZW4gcmVxdWVzdHMuICovCisJdGNwX2luaXQoKTsKKworCisJLyoKKwkgKglTZXQgdGhlIElDTVAgbGF5ZXIgdXAKKwkgKi8KKworCWljbXBfaW5pdCgmaW5ldF9mYW1pbHlfb3BzKTsKKworCS8qCisJICoJSW5pdGlhbGlzZSB0aGUgbXVsdGljYXN0IHJvdXRlcgorCSAqLworI2lmIGRlZmluZWQoQ09ORklHX0lQX01ST1VURSkKKwlpcF9tcl9pbml0KCk7CisjZW5kaWYKKwkvKgorCSAqCUluaXRpYWxpc2UgcGVyLWNwdSBpcHY0IG1pYnMKKwkgKi8gCisKKwlpZihpbml0X2lwdjRfbWlicygpKQorCQlwcmludGsoS0VSTl9DUklUICJpbmV0X2luaXQ6IENhbm5vdCBpbml0IGlwdjQgbWlic1xuIik7IDsKKwkKKwlpcHY0X3Byb2NfaW5pdCgpOworCisJaXBmcmFnX2luaXQoKTsKKworCXJjID0gMDsKK291dDoKKwlyZXR1cm4gcmM7CitvdXRfdW5yZWdpc3Rlcl90Y3BfcHJvdG86CisJcHJvdG9fdW5yZWdpc3RlcigmdGNwX3Byb3QpOworb3V0X3VucmVnaXN0ZXJfdWRwX3Byb3RvOgorCXByb3RvX3VucmVnaXN0ZXIoJnVkcF9wcm90KTsKKwlnb3RvIG91dDsKK30KKworbW9kdWxlX2luaXQoaW5ldF9pbml0KTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworZXh0ZXJuIGludCAgZmliX3Byb2NfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGZpYl9wcm9jX2V4aXQodm9pZCk7CitleHRlcm4gaW50ICBpcF9taXNjX3Byb2NfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgIHJhd19wcm9jX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCByYXdfcHJvY19leGl0KHZvaWQpOworZXh0ZXJuIGludCAgdGNwNF9wcm9jX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCB0Y3A0X3Byb2NfZXhpdCh2b2lkKTsKK2V4dGVybiBpbnQgIHVkcDRfcHJvY19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgdWRwNF9wcm9jX2V4aXQodm9pZCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGlwdjRfcHJvY19pbml0KHZvaWQpCit7CisJaW50IHJjID0gMDsKKworCWlmIChyYXdfcHJvY19pbml0KCkpCisJCWdvdG8gb3V0X3JhdzsKKwlpZiAodGNwNF9wcm9jX2luaXQoKSkKKwkJZ290byBvdXRfdGNwOworCWlmICh1ZHA0X3Byb2NfaW5pdCgpKQorCQlnb3RvIG91dF91ZHA7CisJaWYgKGZpYl9wcm9jX2luaXQoKSkKKwkJZ290byBvdXRfZmliOworCWlmIChpcF9taXNjX3Byb2NfaW5pdCgpKQorCQlnb3RvIG91dF9taXNjOworb3V0OgorCXJldHVybiByYzsKK291dF9taXNjOgorCWZpYl9wcm9jX2V4aXQoKTsKK291dF9maWI6CisJdWRwNF9wcm9jX2V4aXQoKTsKK291dF91ZHA6CisJdGNwNF9wcm9jX2V4aXQoKTsKK291dF90Y3A6CisJcmF3X3Byb2NfZXhpdCgpOworb3V0X3JhdzoKKwlyYyA9IC1FTk9NRU07CisJZ290byBvdXQ7Cit9CisKKyNlbHNlIC8qIENPTkZJR19QUk9DX0ZTICovCitzdGF0aWMgaW50IF9faW5pdCBpcHY0X3Byb2NfaW5pdCh2b2lkKQoreworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKK01PRFVMRV9BTElBU19ORVRQUk9UTyhQRl9JTkVUKTsKKworRVhQT1JUX1NZTUJPTChpbmV0X2FjY2VwdCk7CitFWFBPUlRfU1lNQk9MKGluZXRfYmluZCk7CitFWFBPUlRfU1lNQk9MKGluZXRfZGdyYW1fY29ubmVjdCk7CitFWFBPUlRfU1lNQk9MKGluZXRfZGdyYW1fb3BzKTsKK0VYUE9SVF9TWU1CT0woaW5ldF9nZXRuYW1lKTsKK0VYUE9SVF9TWU1CT0woaW5ldF9pb2N0bCk7CitFWFBPUlRfU1lNQk9MKGluZXRfbGlzdGVuKTsKK0VYUE9SVF9TWU1CT0woaW5ldF9yZWdpc3Rlcl9wcm90b3N3KTsKK0VYUE9SVF9TWU1CT0woaW5ldF9yZWxlYXNlKTsKK0VYUE9SVF9TWU1CT0woaW5ldF9zZW5kbXNnKTsKK0VYUE9SVF9TWU1CT0woaW5ldF9zaHV0ZG93bik7CitFWFBPUlRfU1lNQk9MKGluZXRfc29ja19kZXN0cnVjdCk7CitFWFBPUlRfU1lNQk9MKGluZXRfc3RyZWFtX2Nvbm5lY3QpOworRVhQT1JUX1NZTUJPTChpbmV0X3N0cmVhbV9vcHMpOworRVhQT1JUX1NZTUJPTChpbmV0X3VucmVnaXN0ZXJfcHJvdG9zdyk7CitFWFBPUlRfU1lNQk9MKG5ldF9zdGF0aXN0aWNzKTsKKworI2lmZGVmIElORVRfUkVGQ05UX0RFQlVHCitFWFBPUlRfU1lNQk9MKGluZXRfc29ja19ucik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2FoNC5jIGIvbmV0L2lwdjQvYWg0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5OGYyMgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L2FoNC5jCkBAIC0wLDAgKzEsMzM1IEBACisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L3hmcm0uaD4KKyNpbmNsdWRlIDxuZXQvYWguaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC9wZmtleXYyLmg+CisjaW5jbHVkZSA8bmV0L2ljbXAuaD4KKyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKworCisvKiBDbGVhciBtdXRhYmxlIG9wdGlvbnMgYW5kIGZpbmQgZmluYWwgZGVzdGluYXRpb24gdG8gc3Vic3RpdHV0ZQorICogaW50byBJUCBoZWFkZXIgZm9yIGljdiBjYWxjdWxhdGlvbi4gT3B0aW9ucyBhcmUgYWxyZWFkeSBjaGVja2VkCisgKiBmb3IgdmFsaWRpdHksIHNvIHBhcmFub2lhIGlzIG5vdCByZXF1aXJlZC4gKi8KKworc3RhdGljIGludCBpcF9jbGVhcl9tdXRhYmxlX29wdGlvbnMoc3RydWN0IGlwaGRyICppcGgsIHUzMiAqZGFkZHIpCit7CisJdW5zaWduZWQgY2hhciAqIG9wdHB0ciA9ICh1bnNpZ25lZCBjaGFyKikoaXBoKzEpOworCWludCAgbCA9IGlwaC0+aWhsKjQgLSBzaXplb2Yoc3RydWN0IGlwaGRyKTsKKwlpbnQgIG9wdGxlbjsKKworCXdoaWxlIChsID4gMCkgeworCQlzd2l0Y2ggKCpvcHRwdHIpIHsKKwkJY2FzZSBJUE9QVF9FTkQ6CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBJUE9QVF9OT09QOgorCQkJbC0tOworCQkJb3B0cHRyKys7CisJCQljb250aW51ZTsKKwkJfQorCQlvcHRsZW4gPSBvcHRwdHJbMV07CisJCWlmIChvcHRsZW48MiB8fCBvcHRsZW4+bCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzd2l0Y2ggKCpvcHRwdHIpIHsKKwkJY2FzZSBJUE9QVF9TRUM6CisJCWNhc2UgMHg4NToJLyogU29tZSAiRXh0ZW5kZWQgU2VjdXJpdHkiIGNyYXAuICovCisJCWNhc2UgMHg4NjoJLyogQW5vdGhlciAiQ29tbWVyY2lhbCBTZWN1cml0eSIgY3JhcC4gKi8KKwkJY2FzZSBJUE9QVF9SQToKKwkJY2FzZSAweDgwfDIxOgkvKiBSRkMxNzcwICovCisJCQlicmVhazsKKwkJY2FzZSBJUE9QVF9MU1JSOgorCQljYXNlIElQT1BUX1NTUlI6CisJCQlpZiAob3B0bGVuIDwgNikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCW1lbWNweShkYWRkciwgb3B0cHRyK29wdGxlbi00LCA0KTsKKwkJCS8qIEZhbGwgdGhyb3VnaCAqLworCQlkZWZhdWx0OgorCQkJbWVtc2V0KG9wdHB0cisyLCAwLCBvcHRsZW4tMik7CisJCX0KKwkJbCAtPSBvcHRsZW47CisJCW9wdHB0ciArPSBvcHRsZW47CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFoX291dHB1dChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBpcGhkciAqaXBoLCAqdG9wX2lwaDsKKwlzdHJ1Y3QgaXBfYXV0aF9oZHIgKmFoOworCXN0cnVjdCBhaF9kYXRhICphaHA7CisJdW5pb24geworCQlzdHJ1Y3QgaXBoZHIJaXBoOworCQljaGFyIAkJYnVmWzYwXTsKKwl9IHRtcF9pcGg7CisKKwl0b3BfaXBoID0gc2tiLT5uaC5pcGg7CisJaXBoID0gJnRtcF9pcGguaXBoOworCisJaXBoLT50b3MgPSB0b3BfaXBoLT50b3M7CisJaXBoLT50dGwgPSB0b3BfaXBoLT50dGw7CisJaXBoLT5mcmFnX29mZiA9IHRvcF9pcGgtPmZyYWdfb2ZmOworCisJaWYgKHRvcF9pcGgtPmlobCAhPSA1KSB7CisJCWlwaC0+ZGFkZHIgPSB0b3BfaXBoLT5kYWRkcjsKKwkJbWVtY3B5KGlwaCsxLCB0b3BfaXBoKzEsIHRvcF9pcGgtPmlobCo0IC0gc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCQllcnIgPSBpcF9jbGVhcl9tdXRhYmxlX29wdGlvbnModG9wX2lwaCwgJnRvcF9pcGgtPmRhZGRyKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJYWggPSAoc3RydWN0IGlwX2F1dGhfaGRyICopKChjaGFyICopdG9wX2lwaCt0b3BfaXBoLT5paGwqNCk7CisJYWgtPm5leHRoZHIgPSB0b3BfaXBoLT5wcm90b2NvbDsKKworCXRvcF9pcGgtPnRvcyA9IDA7CisJdG9wX2lwaC0+dG90X2xlbiA9IGh0b25zKHNrYi0+bGVuKTsKKwl0b3BfaXBoLT5mcmFnX29mZiA9IDA7CisJdG9wX2lwaC0+dHRsID0gMDsKKwl0b3BfaXBoLT5wcm90b2NvbCA9IElQUFJPVE9fQUg7CisJdG9wX2lwaC0+Y2hlY2sgPSAwOworCisJYWhwID0geC0+ZGF0YTsKKwlhaC0+aGRybGVuICA9IChYRlJNX0FMSUdOOChzaXplb2Yoc3RydWN0IGlwX2F1dGhfaGRyKSArIAorCQkJCSAgIGFocC0+aWN2X3RydW5jX2xlbikgPj4gMikgLSAyOworCisJYWgtPnJlc2VydmVkID0gMDsKKwlhaC0+c3BpID0geC0+aWQuc3BpOworCWFoLT5zZXFfbm8gPSBodG9ubCgrK3gtPnJlcGxheS5vc2VxKTsKKwlhaHAtPmljdihhaHAsIHNrYiwgYWgtPmF1dGhfZGF0YSk7CisKKwl0b3BfaXBoLT50b3MgPSBpcGgtPnRvczsKKwl0b3BfaXBoLT50dGwgPSBpcGgtPnR0bDsKKwl0b3BfaXBoLT5mcmFnX29mZiA9IGlwaC0+ZnJhZ19vZmY7CisJaWYgKHRvcF9pcGgtPmlobCAhPSA1KSB7CisJCXRvcF9pcGgtPmRhZGRyID0gaXBoLT5kYWRkcjsKKwkJbWVtY3B5KHRvcF9pcGgrMSwgaXBoKzEsIHRvcF9pcGgtPmlobCo0IC0gc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCX0KKworCWlwX3NlbmRfY2hlY2sodG9wX2lwaCk7CisKKwllcnIgPSAwOworCitlcnJvcjoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGFoX2lucHV0KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBzdHJ1Y3QgeGZybV9kZWNhcF9zdGF0ZSAqZGVjYXAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGFoX2hsZW47CisJc3RydWN0IGlwaGRyICppcGg7CisJc3RydWN0IGlwX2F1dGhfaGRyICphaDsKKwlzdHJ1Y3QgYWhfZGF0YSAqYWhwOworCWNoYXIgd29ya19idWZbNjBdOworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcF9hdXRoX2hkcikpKQorCQlnb3RvIG91dDsKKworCWFoID0gKHN0cnVjdCBpcF9hdXRoX2hkciopc2tiLT5kYXRhOworCWFocCA9IHgtPmRhdGE7CisJYWhfaGxlbiA9IChhaC0+aGRybGVuICsgMikgPDwgMjsKKwkKKwlpZiAoYWhfaGxlbiAhPSBYRlJNX0FMSUdOOChzaXplb2Yoc3RydWN0IGlwX2F1dGhfaGRyKSArIGFocC0+aWN2X2Z1bGxfbGVuKSAmJgorCSAgICBhaF9obGVuICE9IFhGUk1fQUxJR044KHNpemVvZihzdHJ1Y3QgaXBfYXV0aF9oZHIpICsgYWhwLT5pY3ZfdHJ1bmNfbGVuKSkgCisJCWdvdG8gb3V0OworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgYWhfaGxlbikpCisJCWdvdG8gb3V0OworCisJLyogV2UgYXJlIGdvaW5nIHRvIF9yZW1vdmVfIEFIIGhlYWRlciB0byBrZWVwIHNvY2tldHMgaGFwcHksCisJICogc28uLi4gTGF0ZXIgdGhpcyBjYW4gY2hhbmdlLiAqLworCWlmIChza2JfY2xvbmVkKHNrYikgJiYKKwkgICAgcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpKQorCQlnb3RvIG91dDsKKworCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKworCWFoID0gKHN0cnVjdCBpcF9hdXRoX2hkciopc2tiLT5kYXRhOworCWlwaCA9IHNrYi0+bmguaXBoOworCisJbWVtY3B5KHdvcmtfYnVmLCBpcGgsIGlwaC0+aWhsKjQpOworCisJaXBoLT50dGwgPSAwOworCWlwaC0+dG9zID0gMDsKKwlpcGgtPmZyYWdfb2ZmID0gMDsKKwlpcGgtPmNoZWNrID0gMDsKKwlpZiAoaXBoLT5paGwgIT0gNSkgeworCQl1MzIgZHVtbXk7CisJCWlmIChpcF9jbGVhcl9tdXRhYmxlX29wdGlvbnMoaXBoLCAmZHVtbXkpKQorCQkJZ290byBvdXQ7CisJfQorICAgICAgICB7CisJCXU4IGF1dGhfZGF0YVtNQVhfQUhfQVVUSF9MRU5dOworCQkKKwkJbWVtY3B5KGF1dGhfZGF0YSwgYWgtPmF1dGhfZGF0YSwgYWhwLT5pY3ZfdHJ1bmNfbGVuKTsKKwkJc2tiX3B1c2goc2tiLCBza2ItPmRhdGEgLSBza2ItPm5oLnJhdyk7CisJCWFocC0+aWN2KGFocCwgc2tiLCBhaC0+YXV0aF9kYXRhKTsKKwkJaWYgKG1lbWNtcChhaC0+YXV0aF9kYXRhLCBhdXRoX2RhdGEsIGFocC0+aWN2X3RydW5jX2xlbikpIHsKKwkJCXgtPnN0YXRzLmludGVncml0eV9mYWlsZWQrKzsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCSgoc3RydWN0IGlwaGRyKil3b3JrX2J1ZiktPnByb3RvY29sID0gYWgtPm5leHRoZHI7CisJc2tiLT5uaC5yYXcgPSBza2JfcHVsbChza2IsIGFoX2hsZW4pOworCW1lbWNweShza2ItPm5oLnJhdywgd29ya19idWYsIGlwaC0+aWhsKjQpOworCXNrYi0+bmguaXBoLT50b3RfbGVuID0gaHRvbnMoc2tiLT5sZW4pOworCXNrYl9wdWxsKHNrYiwgc2tiLT5uaC5pcGgtPmlobCo0KTsKKwlza2ItPmgucmF3ID0gc2tiLT5kYXRhOworCisJcmV0dXJuIDA7CisKK291dDoKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgYWg0X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgaW5mbykKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IChzdHJ1Y3QgaXBoZHIqKXNrYi0+ZGF0YTsKKwlzdHJ1Y3QgaXBfYXV0aF9oZHIgKmFoID0gKHN0cnVjdCBpcF9hdXRoX2hkciopKHNrYi0+ZGF0YSsoaXBoLT5paGw8PDIpKTsKKwlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDsKKworCWlmIChza2ItPmguaWNtcGgtPnR5cGUgIT0gSUNNUF9ERVNUX1VOUkVBQ0ggfHwKKwkgICAgc2tiLT5oLmljbXBoLT5jb2RlICE9IElDTVBfRlJBR19ORUVERUQpCisJCXJldHVybjsKKworCXggPSB4ZnJtX3N0YXRlX2xvb2t1cCgoeGZybV9hZGRyZXNzX3QgKikmaXBoLT5kYWRkciwgYWgtPnNwaSwgSVBQUk9UT19BSCwgQUZfSU5FVCk7CisJaWYgKCF4KQorCQlyZXR1cm47CisJcHJpbnRrKEtFUk5fREVCVUcgInBtdHUgZGlzY292ZXJ5IG9uIFNBIEFILyUwOHgvJTA4eFxuIiwKKwkgICAgICAgbnRvaGwoYWgtPnNwaSksIG50b2hsKGlwaC0+ZGFkZHIpKTsKKwl4ZnJtX3N0YXRlX3B1dCh4KTsKK30KKworc3RhdGljIGludCBhaF9pbml0X3N0YXRlKHN0cnVjdCB4ZnJtX3N0YXRlICp4LCB2b2lkICphcmdzKQoreworCXN0cnVjdCBhaF9kYXRhICphaHAgPSBOVUxMOworCXN0cnVjdCB4ZnJtX2FsZ29fZGVzYyAqYWFsZ19kZXNjOworCisJaWYgKCF4LT5hYWxnKQorCQlnb3RvIGVycm9yOworCisJLyogbnVsbCBhdXRoIGNhbiB1c2UgYSB6ZXJvIGxlbmd0aCBrZXkgKi8KKwlpZiAoeC0+YWFsZy0+YWxnX2tleV9sZW4gPiA1MTIpCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoeC0+ZW5jYXApCisJCWdvdG8gZXJyb3I7CisKKwlhaHAgPSBrbWFsbG9jKHNpemVvZigqYWhwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFocCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChhaHAsIDAsIHNpemVvZigqYWhwKSk7CisKKwlhaHAtPmtleSA9IHgtPmFhbGctPmFsZ19rZXk7CisJYWhwLT5rZXlfbGVuID0gKHgtPmFhbGctPmFsZ19rZXlfbGVuKzcpLzg7CisJYWhwLT50Zm0gPSBjcnlwdG9fYWxsb2NfdGZtKHgtPmFhbGctPmFsZ19uYW1lLCAwKTsKKwlpZiAoIWFocC0+dGZtKQorCQlnb3RvIGVycm9yOworCWFocC0+aWN2ID0gYWhfaG1hY19kaWdlc3Q7CisJCisJLyoKKwkgKiBMb29rdXAgdGhlIGFsZ29yaXRobSBkZXNjcmlwdGlvbiBtYWludGFpbmVkIGJ5IHhmcm1fYWxnbywKKwkgKiB2ZXJpZnkgY3J5cHRvIHRyYW5zZm9ybSBwcm9wZXJ0aWVzLCBhbmQgc3RvcmUgaW5mb3JtYXRpb24KKwkgKiB3ZSBuZWVkIGZvciBBSCBwcm9jZXNzaW5nLiAgVGhpcyBsb29rdXAgY2Fubm90IGZhaWwgaGVyZQorCSAqIGFmdGVyIGEgc3VjY2Vzc2Z1bCBjcnlwdG9fYWxsb2NfdGZtKCkuCisJICovCisJYWFsZ19kZXNjID0geGZybV9hYWxnX2dldF9ieW5hbWUoeC0+YWFsZy0+YWxnX25hbWUsIDApOworCUJVR19PTighYWFsZ19kZXNjKTsKKworCWlmIChhYWxnX2Rlc2MtPnVpbmZvLmF1dGguaWN2X2Z1bGxiaXRzLzggIT0KKwkgICAgY3J5cHRvX3RmbV9hbGdfZGlnZXN0c2l6ZShhaHAtPnRmbSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQUg6ICVzIGRpZ2VzdHNpemUgJXUgIT0gJWh1XG4iLAorCQkgICAgICAgeC0+YWFsZy0+YWxnX25hbWUsIGNyeXB0b190Zm1fYWxnX2RpZ2VzdHNpemUoYWhwLT50Zm0pLAorCQkgICAgICAgYWFsZ19kZXNjLT51aW5mby5hdXRoLmljdl9mdWxsYml0cy84KTsKKwkJZ290byBlcnJvcjsKKwl9CisJCisJYWhwLT5pY3ZfZnVsbF9sZW4gPSBhYWxnX2Rlc2MtPnVpbmZvLmF1dGguaWN2X2Z1bGxiaXRzLzg7CisJYWhwLT5pY3ZfdHJ1bmNfbGVuID0gYWFsZ19kZXNjLT51aW5mby5hdXRoLmljdl90cnVuY2JpdHMvODsKKwkKKwlCVUdfT04oYWhwLT5pY3ZfdHJ1bmNfbGVuID4gTUFYX0FIX0FVVEhfTEVOKTsKKwkKKwlhaHAtPndvcmtfaWN2ID0ga21hbGxvYyhhaHAtPmljdl9mdWxsX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhaHAtPndvcmtfaWN2KQorCQlnb3RvIGVycm9yOworCQorCXgtPnByb3BzLmhlYWRlcl9sZW4gPSBYRlJNX0FMSUdOOChzaXplb2Yoc3RydWN0IGlwX2F1dGhfaGRyKSArIGFocC0+aWN2X3RydW5jX2xlbik7CisJaWYgKHgtPnByb3BzLm1vZGUpCisJCXgtPnByb3BzLmhlYWRlcl9sZW4gKz0gc2l6ZW9mKHN0cnVjdCBpcGhkcik7CisJeC0+ZGF0YSA9IGFocDsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlpZiAoYWhwKSB7CisJCWlmIChhaHAtPndvcmtfaWN2KQorCQkJa2ZyZWUoYWhwLT53b3JrX2ljdik7CisJCWlmIChhaHAtPnRmbSkKKwkJCWNyeXB0b19mcmVlX3RmbShhaHAtPnRmbSk7CisJCWtmcmVlKGFocCk7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgdm9pZCBhaF9kZXN0cm95KHN0cnVjdCB4ZnJtX3N0YXRlICp4KQoreworCXN0cnVjdCBhaF9kYXRhICphaHAgPSB4LT5kYXRhOworCisJaWYgKCFhaHApCisJCXJldHVybjsKKworCWlmIChhaHAtPndvcmtfaWN2KSB7CisJCWtmcmVlKGFocC0+d29ya19pY3YpOworCQlhaHAtPndvcmtfaWN2ID0gTlVMTDsKKwl9CisJaWYgKGFocC0+dGZtKSB7CisJCWNyeXB0b19mcmVlX3RmbShhaHAtPnRmbSk7CisJCWFocC0+dGZtID0gTlVMTDsKKwl9CisJa2ZyZWUoYWhwKTsKK30KKworCitzdGF0aWMgc3RydWN0IHhmcm1fdHlwZSBhaF90eXBlID0KK3sKKwkuZGVzY3JpcHRpb24JPSAiQUg0IiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnByb3RvCSAgICAgCT0gSVBQUk9UT19BSCwKKwkuaW5pdF9zdGF0ZQk9IGFoX2luaXRfc3RhdGUsCisJLmRlc3RydWN0b3IJPSBhaF9kZXN0cm95LAorCS5pbnB1dAkJPSBhaF9pbnB1dCwKKwkub3V0cHV0CQk9IGFoX291dHB1dAorfTsKKworc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9jb2wgYWg0X3Byb3RvY29sID0geworCS5oYW5kbGVyCT0JeGZybTRfcmN2LAorCS5lcnJfaGFuZGxlcgk9CWFoNF9lcnIsCisJLm5vX3BvbGljeQk9CTEsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhaDRfaW5pdCh2b2lkKQoreworCWlmICh4ZnJtX3JlZ2lzdGVyX3R5cGUoJmFoX3R5cGUsIEFGX0lORVQpIDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJpcCBhaCBpbml0OiBjYW4ndCBhZGQgeGZybSB0eXBlXG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCWlmIChpbmV0X2FkZF9wcm90b2NvbCgmYWg0X3Byb3RvY29sLCBJUFBST1RPX0FIKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaXAgYWggaW5pdDogY2FuJ3QgYWRkIHByb3RvY29sXG4iKTsKKwkJeGZybV91bnJlZ2lzdGVyX3R5cGUoJmFoX3R5cGUsIEFGX0lORVQpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhaDRfZmluaSh2b2lkKQoreworCWlmIChpbmV0X2RlbF9wcm90b2NvbCgmYWg0X3Byb3RvY29sLCBJUFBST1RPX0FIKSA8IDApCisJCXByaW50ayhLRVJOX0lORk8gImlwIGFoIGNsb3NlOiBjYW4ndCByZW1vdmUgcHJvdG9jb2xcbiIpOworCWlmICh4ZnJtX3VucmVnaXN0ZXJfdHlwZSgmYWhfdHlwZSwgQUZfSU5FVCkgPCAwKQorCQlwcmludGsoS0VSTl9JTkZPICJpcCBhaCBjbG9zZTogY2FuJ3QgcmVtb3ZlIHhmcm0gdHlwZVxuIik7Cit9CisKK21vZHVsZV9pbml0KGFoNF9pbml0KTsKK21vZHVsZV9leGl0KGFoNF9maW5pKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2FycC5jIGIvbmV0L2lwdjQvYXJwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY0MmZkNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L2FycC5jCkBAIC0wLDAgKzEsMTQyNSBAQAorLyogbGludXgvbmV0L2luZXQvYXJwLmMKKyAqCisgKiBWZXJzaW9uOgkkSWQ6IGFycC5jLHYgMS45OSAyMDAxLzA4LzMwIDIyOjU1OjQyIGRhdmVtIEV4cCAkCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0IGJ5IEZsb3JpYW4gIExhIFJvY2hlCisgKgorICogVGhpcyBtb2R1bGUgaW1wbGVtZW50cyB0aGUgQWRkcmVzcyBSZXNvbHV0aW9uIFByb3RvY29sIEFSUCAoUkZDIDgyNiksCisgKiB3aGljaCBpcyB1c2VkIHRvIGNvbnZlcnQgSVAgYWRkcmVzc2VzIChvciBpbiB0aGUgZnV0dXJlIG1heWJlIG90aGVyCisgKiBoaWdoLWxldmVsIGFkZHJlc3NlcykgaW50byBhIGxvdy1sZXZlbCBoYXJkd2FyZSBhZGRyZXNzIChsaWtlIGFuIEV0aGVybmV0CisgKiBhZGRyZXNzKS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZpeGVzOgorICoJCUFsYW4gQ294CToJUmVtb3ZlZCB0aGUgRXRoZXJuZXQgYXNzdW1wdGlvbnMgaW4gCisgKgkJCQkJRmxvcmlhbidzIGNvZGUKKyAqCQlBbGFuIENveAk6CUZpeGVkIHNvbWUgc21hbGwgZXJyb3JzIGluIHRoZSBBUlAgCisgKgkJCQkJbG9naWMKKyAqCQlBbGFuIENveAk6CUFsbG93ID40SyBpbiAvcHJvYworICoJCUFsYW4gQ294CToJTWFrZSBBUlAgYWRkIGl0cyBvd24gcHJvdG9jb2wgZW50cnkKKyAqCQlSb3NzIE1hcnRpbiAgICAgOiAgICAgICBSZXdyb3RlIGFycF9yY3YoKSBhbmQgYXJwX2dldF9pbmZvKCkKKyAqCQlTdGVwaGVuIEhlbnNvbgk6CUFkZCBBWDI1IHN1cHBvcnQgdG8gYXJwX2dldF9pbmZvKCkKKyAqCQlBbGFuIENveAk6CURyb3AgZGF0YSB3aGVuIGEgZGV2aWNlIGlzIGRvd25lZC4KKyAqCQlBbGFuIENveAk6CVVzZSBpbml0X3RpbWVyKCkuCisgKgkJQWxhbiBDb3gJOglEb3VibGUgbG9jayBmaXhlcy4KKyAqCQlNYXJ0aW4gU2VpbmUJOglNb3ZlIHRoZSBhcnBoZHIgc3RydWN0dXJlCisgKgkJCQkJdG8gaWZfYXJwLmggZm9yIGNvbXBhdGliaWxpdHkuCisgKgkJCQkJd2l0aCBCU0QgYmFzZWQgcHJvZ3JhbXMuCisgKgkJQW5kcmV3IFRyaWRnZWxsIDogICAgICAgQWRkZWQgQVJQIG5ldG1hc2sgY29kZSBhbmQKKyAqCQkJCQlyZS1hcnJhbmdlZCBwcm94eSBoYW5kbGluZy4KKyAqCQlBbGFuIENveAk6CUNoYW5nZWQgdG8gdXNlIG5vdGlmaWVycy4KKyAqCQlOaWliZSBZdXRha2EJOglSZXBseSBmb3IgdGhpcyBkZXZpY2Ugb3IgcHJveGllcyBvbmx5LgorICoJCUFsYW4gQ294CToJRG9uJ3QgcHJveHkgYWNyb3NzIGhhcmR3YXJlIHR5cGVzIQorICoJCUpvbmF0aGFuIE5heWxvciA6CUFkZGVkIHN1cHBvcnQgZm9yIE5FVC9ST00uCisgKgkJTWlrZSBTaGF2ZXIgICAgIDogICAgICAgUkZDMTEyMiBjaGVja3MuCisgKgkJSm9uYXRoYW4gTmF5bG9yIDoJT25seSBsb29rdXAgdGhlIGhhcmR3YXJlIGFkZHJlc3MgZm9yCisgKgkJCQkJdGhlIGNvcnJlY3QgaGFyZHdhcmUgdHlwZS4KKyAqCQlHZXJtYW5vIENhcm9ubmkJOglBc3NvcnRlZCBzdWJ0bGUgcmFjZXMuCisgKgkJQ3JhaWcgU2NobGVudGVyIDoJRG9uJ3QgbW9kaWZ5IHBlcm1hbmVudCBlbnRyeSAKKyAqCQkJCQlkdXJpbmcgYXJwX3Jjdi4KKyAqCQlSdXNzIE5lbHNvbgk6CVRpZGllZCB1cCBhIGZldyBiaXRzLgorICoJCUFsZXhleSBLdXpuZXRzb3Y6CU1ham9yIGNoYW5nZXMgdG8gY2FjaGluZyBhbmQgYmVoYXZpb3VyLAorICoJCQkJCWVnIGludGVsbGlnZW50IGFycCBwcm9iaW5nIGFuZCAKKyAqCQkJCQlnZW5lcmF0aW9uCisgKgkJCQkJb2YgaG9zdCBkb3duIGV2ZW50cy4KKyAqCQlBbGFuIENveAk6CU1pc3NpbmcgdW5sb2NrIGluIGRldmljZSBldmVudHMuCisgKgkJRWNrZXMJCToJQVJQIGlvY3RsIGNvbnRyb2wgZXJyb3JzLgorICoJCUFsZXhleSBLdXpuZXRzb3Y6CUFycCBmcmVlIGZpeC4KKyAqCQlNYW51ZWwgUm9kcmlndWV6OglHcmF0dWl0b3VzIEFSUC4KKyAqICAgICAgICAgICAgICBKb25hdGhhbiBMYXllcyAgOiAgICAgICBBZGRlZCBhcnBkIHN1cHBvcnQgdGhyb3VnaCBrZXJuZWxkIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgcXVldWUgKDk2MDMxNCkKKyAqCQlNaWtlIFNoYXZlcgk6CS9wcm9jL3N5cy9uZXQvaXB2NC9hcnBfKiBzdXBwb3J0CisgKgkJTWlrZSBNY0xhZ2FuICAgIDoJUm91dGluZyBieSBzb3VyY2UKKyAqCQlTdHVhcnQgQ2hlc2hpcmUJOglNZXRyaWNvbSBhbmQgZ3JhdCBhcnAgZml4ZXMKKyAqCQkJCQkqKiogRk9SIDIuMSBjbGVhbiB0aGlzIHVwICoqKgorICoJCUxhd3JlbmNlIFYuIFN0ZWZhbmk6ICgwOC8xMi85NikgQWRkZWQgRkRESSBzdXBwb3J0LgorICoJCUFsYW4gQ294IAk6CVRvb2sgdGhlIEFQMTAwMCBuYXN0eSBGRERJIGhhY2sgYW5kCisgKgkJCQkJZm9sZGVkIGludG8gdGhlIG1haW5zdHJlYW0gRkRESSBjb2RlLgorICoJCQkJCUFjayBzcGl0LCBMaW51cyBob3cgZGlkIHlvdSBhbGxvdyB0aGF0CisgKgkJCQkJb25lIGluLi4uCisgKgkJSmVzIFNvcmVuc2VuCToJTWFrZSBGRERJIHdvcmsgYWdhaW4gaW4gMi4xLnggYW5kCisgKgkJCQkJY2xlYW4gdXAgdGhlIEFQRkRESSAmIGdlbi4gRkRESSBiaXRzLgorICoJCUFsZXhleSBLdXpuZXRzb3Y6CW5ldyBhcnAgc3RhdGUgbWFjaGluZTsKKyAqCQkJCQlub3cgaXQgaXMgaW4gbmV0L2NvcmUvbmVpZ2hib3VyLmMuCisgKgkJS3J6eXN6dG9mIEhhbGFzYToJQWRkZWQgRnJhbWUgUmVsYXkgQVJQIHN1cHBvcnQuCisgKgkJQXJuYWxkbyBDLiBNZWxvIDoJY29udmVydCAvcHJvYy9uZXQvYXJwIHRvIHNlcV9maWxlCisgKgkJU2htdWxpayBIZW46CQlTcGxpdCBhcnBfc2VuZCB0byBhcnBfY3JlYXRlIGFuZAorICoJCQkJCWFycF94bWl0IHNvIGludGVybWVkaWF0ZSBkcml2ZXJzIGxpa2UKKyAqCQkJCQlib25kaW5nIGNhbiBjaGFuZ2UgdGhlIHNrYiBiZWZvcmUKKyAqCQkJCQlzZW5kaW5nIChlLmcuIGluc2VydCA4MDIxcSB0YWcpLgorICoJCUhhcmFsZCBXZWx0ZQk6CWNvbnZlcnQgdG8gbWFrZSB1c2Ugb2YgamVua2lucyBoYXNoCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmRkaWRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L3RyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CisjaWZkZWYgQ09ORklHX1NZU0NUTAorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaWNtcC5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKyNpZiBkZWZpbmVkKENPTkZJR19BWDI1KSB8fCBkZWZpbmVkKENPTkZJR19BWDI1X01PRFVMRSkKKyNpbmNsdWRlIDxuZXQvYXgyNS5oPgorI2lmIGRlZmluZWQoQ09ORklHX05FVFJPTSkgfHwgZGVmaW5lZChDT05GSUdfTkVUUk9NX01PRFVMRSkKKyNpbmNsdWRlIDxuZXQvbmV0cm9tLmg+CisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FUTV9DTElQKSB8fCBkZWZpbmVkKENPTkZJR19BVE1fQ0xJUF9NT0RVTEUpCisjaW5jbHVkZSA8bmV0L2F0bWNsaXAuaD4KK3N0cnVjdCBuZWlnaF90YWJsZSAqY2xpcF90YmxfaG9vazsKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYXJwLmg+CisKKy8qCisgKglJbnRlcmZhY2UgdG8gZ2VuZXJpYyBuZWlnaGJvdXIgY2FjaGUuCisgKi8KK3N0YXRpYyB1MzIgYXJwX2hhc2goY29uc3Qgdm9pZCAqcGtleSwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGFycF9jb25zdHJ1Y3RvcihzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCk7CitzdGF0aWMgdm9pZCBhcnBfc29saWNpdChzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBhcnBfZXJyb3JfcmVwb3J0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIHBhcnBfcmVkbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworc3RhdGljIHN0cnVjdCBuZWlnaF9vcHMgYXJwX2dlbmVyaWNfb3BzID0geworCS5mYW1pbHkgPQkJQUZfSU5FVCwKKwkuc29saWNpdCA9CQlhcnBfc29saWNpdCwKKwkuZXJyb3JfcmVwb3J0ID0JCWFycF9lcnJvcl9yZXBvcnQsCisJLm91dHB1dCA9CQluZWlnaF9yZXNvbHZlX291dHB1dCwKKwkuY29ubmVjdGVkX291dHB1dCA9CW5laWdoX2Nvbm5lY3RlZF9vdXRwdXQsCisJLmhoX291dHB1dCA9CQlkZXZfcXVldWVfeG1pdCwKKwkucXVldWVfeG1pdCA9CQlkZXZfcXVldWVfeG1pdCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmVpZ2hfb3BzIGFycF9oaF9vcHMgPSB7CisJLmZhbWlseSA9CQlBRl9JTkVULAorCS5zb2xpY2l0ID0JCWFycF9zb2xpY2l0LAorCS5lcnJvcl9yZXBvcnQgPQkJYXJwX2Vycm9yX3JlcG9ydCwKKwkub3V0cHV0ID0JCW5laWdoX3Jlc29sdmVfb3V0cHV0LAorCS5jb25uZWN0ZWRfb3V0cHV0ID0JbmVpZ2hfcmVzb2x2ZV9vdXRwdXQsCisJLmhoX291dHB1dCA9CQlkZXZfcXVldWVfeG1pdCwKKwkucXVldWVfeG1pdCA9CQlkZXZfcXVldWVfeG1pdCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmVpZ2hfb3BzIGFycF9kaXJlY3Rfb3BzID0geworCS5mYW1pbHkgPQkJQUZfSU5FVCwKKwkub3V0cHV0ID0JCWRldl9xdWV1ZV94bWl0LAorCS5jb25uZWN0ZWRfb3V0cHV0ID0JZGV2X3F1ZXVlX3htaXQsCisJLmhoX291dHB1dCA9CQlkZXZfcXVldWVfeG1pdCwKKwkucXVldWVfeG1pdCA9CQlkZXZfcXVldWVfeG1pdCwKK307CisKK3N0cnVjdCBuZWlnaF9vcHMgYXJwX2Jyb2tlbl9vcHMgPSB7CisJLmZhbWlseSA9CQlBRl9JTkVULAorCS5zb2xpY2l0ID0JCWFycF9zb2xpY2l0LAorCS5lcnJvcl9yZXBvcnQgPQkJYXJwX2Vycm9yX3JlcG9ydCwKKwkub3V0cHV0ID0JCW5laWdoX2NvbXBhdF9vdXRwdXQsCisJLmNvbm5lY3RlZF9vdXRwdXQgPQluZWlnaF9jb21wYXRfb3V0cHV0LAorCS5oaF9vdXRwdXQgPQkJZGV2X3F1ZXVlX3htaXQsCisJLnF1ZXVlX3htaXQgPQkJZGV2X3F1ZXVlX3htaXQsCit9OworCitzdHJ1Y3QgbmVpZ2hfdGFibGUgYXJwX3RibCA9IHsKKwkuZmFtaWx5ID0JQUZfSU5FVCwKKwkuZW50cnlfc2l6ZSA9CXNpemVvZihzdHJ1Y3QgbmVpZ2hib3VyKSArIDQsCisJLmtleV9sZW4gPQk0LAorCS5oYXNoID0JCWFycF9oYXNoLAorCS5jb25zdHJ1Y3RvciA9CWFycF9jb25zdHJ1Y3RvciwKKwkucHJveHlfcmVkbyA9CXBhcnBfcmVkbywKKwkuaWQgPQkJImFycF9jYWNoZSIsCisJLnBhcm1zID0geworCQkudGJsID0JCQkmYXJwX3RibCwKKwkJLmJhc2VfcmVhY2hhYmxlX3RpbWUgPQkzMCAqIEhaLAorCQkucmV0cmFuc190aW1lID0JMSAqIEhaLAorCQkuZ2Nfc3RhbGV0aW1lID0JNjAgKiBIWiwKKwkJLnJlYWNoYWJsZV90aW1lID0JCTMwICogSFosCisJCS5kZWxheV9wcm9iZV90aW1lID0JNSAqIEhaLAorCQkucXVldWVfbGVuID0JCTMsCisJCS51Y2FzdF9wcm9iZXMgPQkzLAorCQkubWNhc3RfcHJvYmVzID0JMywKKwkJLmFueWNhc3RfZGVsYXkgPQkxICogSFosCisJCS5wcm94eV9kZWxheSA9CQkoOCAqIEhaKSAvIDEwLAorCQkucHJveHlfcWxlbiA9CQk2NCwKKwkJLmxvY2t0aW1lID0JCTEgKiBIWiwKKwl9LAorCS5nY19pbnRlcnZhbCA9CTMwICogSFosCisJLmdjX3RocmVzaDEgPQkxMjgsCisJLmdjX3RocmVzaDIgPQk1MTIsCisJLmdjX3RocmVzaDMgPQkxMDI0LAorfTsKKworaW50IGFycF9tY19tYXAodTMyIGFkZHIsIHU4ICpoYWRkciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGRpcikKK3sKKwlzd2l0Y2ggKGRldi0+dHlwZSkgeworCWNhc2UgQVJQSFJEX0VUSEVSOgorCWNhc2UgQVJQSFJEX0ZEREk6CisJY2FzZSBBUlBIUkRfSUVFRTgwMjoKKwkJaXBfZXRoX21jX21hcChhZGRyLCBoYWRkcik7CisJCXJldHVybiAwOyAKKwljYXNlIEFSUEhSRF9JRUVFODAyX1RSOgorCQlpcF90cl9tY19tYXAoYWRkciwgaGFkZHIpOworCQlyZXR1cm4gMDsKKwljYXNlIEFSUEhSRF9JTkZJTklCQU5EOgorCQlpcF9pYl9tY19tYXAoYWRkciwgaGFkZHIpOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlpZiAoZGlyKSB7CisJCQltZW1jcHkoaGFkZHIsIGRldi0+YnJvYWRjYXN0LCBkZXYtPmFkZHJfbGVuKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCisKK3N0YXRpYyB1MzIgYXJwX2hhc2goY29uc3Qgdm9pZCAqcGtleSwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gamhhc2hfMndvcmRzKCoodTMyICopcGtleSwgZGV2LT5pZmluZGV4LCBhcnBfdGJsLmhhc2hfcm5kKTsKK30KKworc3RhdGljIGludCBhcnBfY29uc3RydWN0b3Ioc3RydWN0IG5laWdoYm91ciAqbmVpZ2gpCit7CisJdTMyIGFkZHIgPSAqKHUzMiopbmVpZ2gtPnByaW1hcnlfa2V5OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZWlnaC0+ZGV2OworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKwlzdHJ1Y3QgbmVpZ2hfcGFybXMgKnBhcm1zOworCisJbmVpZ2gtPnR5cGUgPSBpbmV0X2FkZHJfdHlwZShhZGRyKTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlpbl9kZXYgPSByY3VfZGVyZWZlcmVuY2UoX19pbl9kZXZfZ2V0KGRldikpOworCWlmIChpbl9kZXYgPT0gTlVMTCkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGFybXMgPSBpbl9kZXYtPmFycF9wYXJtczsKKwlfX25laWdoX3Bhcm1zX3B1dChuZWlnaC0+cGFybXMpOworCW5laWdoLT5wYXJtcyA9IG5laWdoX3Bhcm1zX2Nsb25lKHBhcm1zKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWlmIChkZXYtPmhhcmRfaGVhZGVyID09IE5VTEwpIHsKKwkJbmVpZ2gtPm51ZF9zdGF0ZSA9IE5VRF9OT0FSUDsKKwkJbmVpZ2gtPm9wcyA9ICZhcnBfZGlyZWN0X29wczsKKwkJbmVpZ2gtPm91dHB1dCA9IG5laWdoLT5vcHMtPnF1ZXVlX3htaXQ7CisJfSBlbHNlIHsKKwkJLyogR29vZCBkZXZpY2VzIChjaGVja2VkIGJ5IHJlYWRpbmcgdGV4dHMsIGJ1dCBvbmx5IEV0aGVybmV0IGlzCisJCSAgIHRlc3RlZCkKKworCQkgICBBUlBIUkRfRVRIRVI6IChldGhlcm5ldCwgYXBmZGRpKQorCQkgICBBUlBIUkRfRkRESTogKGZkZGkpCisJCSAgIEFSUEhSRF9JRUVFODAyOiAodHIpCisJCSAgIEFSUEhSRF9NRVRSSUNPTTogKHN0cmlwKQorCQkgICBBUlBIUkRfQVJDTkVUOgorCQkgICBldGMuIGV0Yy4gZXRjLgorCisJCSAgIEFSUEhSRF9JUEREUCB3aWxsIGFsc28gd29yaywgaWYgYXV0aG9yIHJlcGFpcnMgaXQuCisJCSAgIEkgZGlkIG5vdCBpdCwgYmVjYXVzZSB0aGlzIGRyaXZlciBkb2VzIG5vdCB3b3JrIGV2ZW4KKwkJICAgaW4gb2xkIHBhcmFkaWdtLgorCQkgKi8KKworI2lmIDEKKwkJLyogU28uLi4gdGhlc2UgImFtYXRldXIiIGRldmljZXMgYXJlIGhvcGVsZXNzLgorCQkgICBUaGUgb25seSB0aGluZywgdGhhdCBJIGNhbiBzYXkgbm93OgorCQkgICBJdCBpcyB2ZXJ5IHNhZCB0aGF0IHdlIG5lZWQgdG8ga2VlcCB1Z2x5IG9ic29sZXRlCisJCSAgIGNvZGUgdG8gbWFrZSB0aGVtIGhhcHB5LgorCisJCSAgIFRoZXkgc2hvdWxkIGJlIG1vdmVkIHRvIG1vcmUgcmVhc29uYWJsZSBzdGF0ZSwgbm93CisJCSAgIHRoZXkgdXNlIHJlYnVpbGRfaGVhZGVyIElOU1RFQUQgT0YgaGFyZF9zdGFydF94bWl0ISEhCisJCSAgIEJlc2lkZXMgdGhhdCwgdGhleSBhcmUgc29ydCBvZiBvdXQgb2YgZGF0ZQorCQkgICAoYSBsb3Qgb2YgcmVkdW5kYW50IGNsb25lcy9jb3BpZXMsIHVzZWxlc3MgaW4gMi4xKSwKKwkJICAgSSB3b25kZXIgd2h5IHBlb3BsZSBiZWxpZXZlIHRoYXQgdGhleSB3b3JrLgorCQkgKi8KKwkJc3dpdGNoIChkZXYtPnR5cGUpIHsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQljYXNlIEFSUEhSRF9ST1NFOgkKKyNpZiBkZWZpbmVkKENPTkZJR19BWDI1KSB8fCBkZWZpbmVkKENPTkZJR19BWDI1X01PRFVMRSkKKwkJY2FzZSBBUlBIUkRfQVgyNToKKyNpZiBkZWZpbmVkKENPTkZJR19ORVRST00pIHx8IGRlZmluZWQoQ09ORklHX05FVFJPTV9NT0RVTEUpCisJCWNhc2UgQVJQSFJEX05FVFJPTToKKyNlbmRpZgorCQkJbmVpZ2gtPm9wcyA9ICZhcnBfYnJva2VuX29wczsKKwkJCW5laWdoLT5vdXRwdXQgPSBuZWlnaC0+b3BzLT5vdXRwdXQ7CisJCQlyZXR1cm4gMDsKKyNlbmRpZgorCQk7fQorI2VuZGlmCisJCWlmIChuZWlnaC0+dHlwZSA9PSBSVE5fTVVMVElDQVNUKSB7CisJCQluZWlnaC0+bnVkX3N0YXRlID0gTlVEX05PQVJQOworCQkJYXJwX21jX21hcChhZGRyLCBuZWlnaC0+aGEsIGRldiwgMSk7CisJCX0gZWxzZSBpZiAoZGV2LT5mbGFncyYoSUZGX05PQVJQfElGRl9MT09QQkFDSykpIHsKKwkJCW5laWdoLT5udWRfc3RhdGUgPSBOVURfTk9BUlA7CisJCQltZW1jcHkobmVpZ2gtPmhhLCBkZXYtPmRldl9hZGRyLCBkZXYtPmFkZHJfbGVuKTsKKwkJfSBlbHNlIGlmIChuZWlnaC0+dHlwZSA9PSBSVE5fQlJPQURDQVNUIHx8IGRldi0+ZmxhZ3MmSUZGX1BPSU5UT1BPSU5UKSB7CisJCQluZWlnaC0+bnVkX3N0YXRlID0gTlVEX05PQVJQOworCQkJbWVtY3B5KG5laWdoLT5oYSwgZGV2LT5icm9hZGNhc3QsIGRldi0+YWRkcl9sZW4pOworCQl9CisJCWlmIChkZXYtPmhhcmRfaGVhZGVyX2NhY2hlKQorCQkJbmVpZ2gtPm9wcyA9ICZhcnBfaGhfb3BzOworCQllbHNlCisJCQluZWlnaC0+b3BzID0gJmFycF9nZW5lcmljX29wczsKKwkJaWYgKG5laWdoLT5udWRfc3RhdGUmTlVEX1ZBTElEKQorCQkJbmVpZ2gtPm91dHB1dCA9IG5laWdoLT5vcHMtPmNvbm5lY3RlZF9vdXRwdXQ7CisJCWVsc2UKKwkJCW5laWdoLT5vdXRwdXQgPSBuZWlnaC0+b3BzLT5vdXRwdXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhcnBfZXJyb3JfcmVwb3J0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWRzdF9saW5rX2ZhaWx1cmUoc2tiKTsKKwlrZnJlZV9za2Ioc2tiKTsKK30KKworc3RhdGljIHZvaWQgYXJwX3NvbGljaXQoc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTMyIHNhZGRyID0gMDsKKwl1OCAgKmRzdF9oYSA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5laWdoLT5kZXY7CisJdTMyIHRhcmdldCA9ICoodTMyKiluZWlnaC0+cHJpbWFyeV9rZXk7CisJaW50IHByb2JlcyA9IGF0b21pY19yZWFkKCZuZWlnaC0+cHJvYmVzKTsKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBpbl9kZXZfZ2V0KGRldik7CisKKwlpZiAoIWluX2RldikKKwkJcmV0dXJuOworCisJc3dpdGNoIChJTl9ERVZfQVJQX0FOTk9VTkNFKGluX2RldikpIHsKKwlkZWZhdWx0OgorCWNhc2UgMDoJCS8qIEJ5IGRlZmF1bHQgYW5ub3VuY2UgYW55IGxvY2FsIElQICovCisJCWlmIChza2IgJiYgaW5ldF9hZGRyX3R5cGUoc2tiLT5uaC5pcGgtPnNhZGRyKSA9PSBSVE5fTE9DQUwpCisJCQlzYWRkciA9IHNrYi0+bmguaXBoLT5zYWRkcjsKKwkJYnJlYWs7CisJY2FzZSAxOgkJLyogUmVzdHJpY3QgYW5ub3VuY2VtZW50cyBvZiBzYWRkciBpbiBzYW1lIHN1Ym5ldCAqLworCQlpZiAoIXNrYikKKwkJCWJyZWFrOworCQlzYWRkciA9IHNrYi0+bmguaXBoLT5zYWRkcjsKKwkJaWYgKGluZXRfYWRkcl90eXBlKHNhZGRyKSA9PSBSVE5fTE9DQUwpIHsKKwkJCS8qIHNhZGRyIHNob3VsZCBiZSBrbm93biB0byB0YXJnZXQgKi8KKwkJCWlmIChpbmV0X2FkZHJfb25saW5rKGluX2RldiwgdGFyZ2V0LCBzYWRkcikpCisJCQkJYnJlYWs7CisJCX0KKwkJc2FkZHIgPSAwOworCQlicmVhazsKKwljYXNlIDI6CQkvKiBBdm9pZCBzZWNvbmRhcnkgSVBzLCBnZXQgYSBwcmltYXJ5L3ByZWZlcnJlZCBvbmUgKi8KKwkJYnJlYWs7CisJfQorCisJaWYgKGluX2RldikKKwkJaW5fZGV2X3B1dChpbl9kZXYpOworCWlmICghc2FkZHIpCisJCXNhZGRyID0gaW5ldF9zZWxlY3RfYWRkcihkZXYsIHRhcmdldCwgUlRfU0NPUEVfTElOSyk7CisKKwlpZiAoKHByb2JlcyAtPSBuZWlnaC0+cGFybXMtPnVjYXN0X3Byb2JlcykgPCAwKSB7CisJCWlmICghKG5laWdoLT5udWRfc3RhdGUmTlVEX1ZBTElEKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICJ0cnlpbmcgdG8gdWNhc3QgcHJvYmUgaW4gTlVEX0lOVkFMSURcbiIpOworCQlkc3RfaGEgPSBuZWlnaC0+aGE7CisJCXJlYWRfbG9ja19iaCgmbmVpZ2gtPmxvY2spOworCX0gZWxzZSBpZiAoKHByb2JlcyAtPSBuZWlnaC0+cGFybXMtPmFwcF9wcm9iZXMpIDwgMCkgeworI2lmZGVmIENPTkZJR19BUlBECisJCW5laWdoX2FwcF9ucyhuZWlnaCk7CisjZW5kaWYKKwkJcmV0dXJuOworCX0KKworCWFycF9zZW5kKEFSUE9QX1JFUVVFU1QsIEVUSF9QX0FSUCwgdGFyZ2V0LCBkZXYsIHNhZGRyLAorCQkgZHN0X2hhLCBkZXYtPmRldl9hZGRyLCBOVUxMKTsKKwlpZiAoZHN0X2hhKQorCQlyZWFkX3VubG9ja19iaCgmbmVpZ2gtPmxvY2spOworfQorCitzdGF0aWMgaW50IGFycF9pZ25vcmUoc3RydWN0IGluX2RldmljZSAqaW5fZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICB1MzIgc2lwLCB1MzIgdGlwKQoreworCWludCBzY29wZTsKKworCXN3aXRjaCAoSU5fREVWX0FSUF9JR05PUkUoaW5fZGV2KSkgeworCWNhc2UgMDoJLyogUmVwbHksIHRoZSB0aXAgaXMgYWxyZWFkeSB2YWxpZGF0ZWQgKi8KKwkJcmV0dXJuIDA7CisJY2FzZSAxOgkvKiBSZXBseSBvbmx5IGlmIHRpcCBpcyBjb25maWd1cmVkIG9uIHRoZSBpbmNvbWluZyBpbnRlcmZhY2UgKi8KKwkJc2lwID0gMDsKKwkJc2NvcGUgPSBSVF9TQ09QRV9IT1NUOworCQlicmVhazsKKwljYXNlIDI6CS8qCisJCSAqIFJlcGx5IG9ubHkgaWYgdGlwIGlzIGNvbmZpZ3VyZWQgb24gdGhlIGluY29taW5nIGludGVyZmFjZQorCQkgKiBhbmQgaXMgaW4gc2FtZSBzdWJuZXQgYXMgc2lwCisJCSAqLworCQlzY29wZSA9IFJUX1NDT1BFX0hPU1Q7CisJCWJyZWFrOworCWNhc2UgMzoJLyogRG8gbm90IHJlcGx5IGZvciBzY29wZSBob3N0IGFkZHJlc3NlcyAqLworCQlzaXAgPSAwOworCQlzY29wZSA9IFJUX1NDT1BFX0xJTks7CisJCWRldiA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgNDoJLyogUmVzZXJ2ZWQgKi8KKwljYXNlIDU6CisJY2FzZSA2OgorCWNhc2UgNzoKKwkJcmV0dXJuIDA7CisJY2FzZSA4OgkvKiBEbyBub3QgcmVwbHkgKi8KKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAhaW5ldF9jb25maXJtX2FkZHIoZGV2LCBzaXAsIHRpcCwgc2NvcGUpOworfQorCitzdGF0aWMgaW50IGFycF9maWx0ZXIoX191MzIgc2lwLCBfX3UzMiB0aXAsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZsb3dpIGZsID0geyAubmxfdSA9IHsgLmlwNF91ID0geyAuZGFkZHIgPSBzaXAsCisJCQkJCQkgLnNhZGRyID0gdGlwIH0gfSB9OworCXN0cnVjdCBydGFibGUgKnJ0OworCWludCBmbGFnID0gMDsgCisJLyp1bnNpZ25lZCBsb25nIG5vdzsgKi8KKworCWlmIChpcF9yb3V0ZV9vdXRwdXRfa2V5KCZydCwgJmZsKSA8IDApIAorCQlyZXR1cm4gMTsKKwlpZiAocnQtPnUuZHN0LmRldiAhPSBkZXYpIHsgCisJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX0FSUEZJTFRFUik7CisJCWZsYWcgPSAxOworCX0gCisJaXBfcnRfcHV0KHJ0KTsgCisJcmV0dXJuIGZsYWc7IAorfSAKKworLyogT0JTT0xFVEUgRlVOQ1RJT05TICovCisKKy8qCisgKglGaW5kIGFuIGFycCBtYXBwaW5nIGluIHRoZSBjYWNoZS4gSWYgbm90IGZvdW5kLCBwb3N0IGEgcmVxdWVzdC4KKyAqCisgKglJdCBpcyB2ZXJ5IFVHTFkgcm91dGluZTogaXQgRE9FUyBOT1QgdXNlIHNrYi0+ZHN0LT5uZWlnaGJvdXIsCisgKglldmVuIGlmIGl0IGV4aXN0cy4gSXQgaXMgc3VwcG9zZWQgdGhhdCBza2ItPmRldiB3YXMgbWFuZ2xlZAorICoJYnkgYSB2aXJ0dWFsIGRldmljZSAoZXFsLCBzaGFwZXIpLiBOb2JvZHkgYnV0IGJyb2tlbiBkZXZpY2VzCisgKglpcyBhbGxvd2VkIHRvIHVzZSB0aGlzIGZ1bmN0aW9uLCBpdCBpcyBzY2hlZHVsZWQgdG8gYmUgcmVtb3ZlZC4gLS1BTksKKyAqLworCitzdGF0aWMgaW50IGFycF9zZXRfcHJlZGVmaW5lZChpbnQgYWRkcl9oaW50LCB1bnNpZ25lZCBjaGFyICogaGFkZHIsIHUzMiBwYWRkciwgc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJc3dpdGNoIChhZGRyX2hpbnQpIHsKKwljYXNlIFJUTl9MT0NBTDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkFSUDogYXJwIGNhbGxlZCBmb3Igb3duIElQIGFkZHJlc3NcbiIpOworCQltZW1jcHkoaGFkZHIsIGRldi0+ZGV2X2FkZHIsIGRldi0+YWRkcl9sZW4pOworCQlyZXR1cm4gMTsKKwljYXNlIFJUTl9NVUxUSUNBU1Q6CisJCWFycF9tY19tYXAocGFkZHIsIGhhZGRyLCBkZXYsIDEpOworCQlyZXR1cm4gMTsKKwljYXNlIFJUTl9CUk9BRENBU1Q6CisJCW1lbWNweShoYWRkciwgZGV2LT5icm9hZGNhc3QsIGRldi0+YWRkcl9sZW4pOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworaW50IGFycF9maW5kKHVuc2lnbmVkIGNoYXIgKmhhZGRyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKKwl1MzIgcGFkZHI7CisJc3RydWN0IG5laWdoYm91ciAqbjsKKworCWlmICghc2tiLT5kc3QpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImFycF9maW5kIGlzIGNhbGxlZCB3aXRoIGRzdD09TlVMTFxuIik7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMTsKKwl9CisKKwlwYWRkciA9ICgoc3RydWN0IHJ0YWJsZSopc2tiLT5kc3QpLT5ydF9nYXRld2F5OworCisJaWYgKGFycF9zZXRfcHJlZGVmaW5lZChpbmV0X2FkZHJfdHlwZShwYWRkciksIGhhZGRyLCBwYWRkciwgZGV2KSkKKwkJcmV0dXJuIDA7CisKKwluID0gX19uZWlnaF9sb29rdXAoJmFycF90YmwsICZwYWRkciwgZGV2LCAxKTsKKworCWlmIChuKSB7CisJCW4tPnVzZWQgPSBqaWZmaWVzOworCQlpZiAobi0+bnVkX3N0YXRlJk5VRF9WQUxJRCB8fCBuZWlnaF9ldmVudF9zZW5kKG4sIHNrYikgPT0gMCkgeworCQkJcmVhZF9sb2NrX2JoKCZuLT5sb2NrKTsKKyAJCQltZW1jcHkoaGFkZHIsIG4tPmhhLCBkZXYtPmFkZHJfbGVuKTsKKwkJCXJlYWRfdW5sb2NrX2JoKCZuLT5sb2NrKTsKKwkJCW5laWdoX3JlbGVhc2Uobik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQluZWlnaF9yZWxlYXNlKG4pOworCX0gZWxzZQorCQlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMTsKK30KKworLyogRU5EIE9GIE9CU09MRVRFIEZVTkNUSU9OUyAqLworCitpbnQgYXJwX2JpbmRfbmVpZ2hib3VyKHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHN0LT5kZXY7CisJc3RydWN0IG5laWdoYm91ciAqbiA9IGRzdC0+bmVpZ2hib3VyOworCisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAobiA9PSBOVUxMKSB7CisJCXUzMiBuZXh0aG9wID0gKChzdHJ1Y3QgcnRhYmxlKilkc3QpLT5ydF9nYXRld2F5OworCQlpZiAoZGV2LT5mbGFncyYoSUZGX0xPT1BCQUNLfElGRl9QT0lOVE9QT0lOVCkpCisJCQluZXh0aG9wID0gMDsKKwkJbiA9IF9fbmVpZ2hfbG9va3VwX2Vycm5vKAorI2lmIGRlZmluZWQoQ09ORklHX0FUTV9DTElQKSB8fCBkZWZpbmVkKENPTkZJR19BVE1fQ0xJUF9NT0RVTEUpCisJCSAgICBkZXYtPnR5cGUgPT0gQVJQSFJEX0FUTSA/IGNsaXBfdGJsX2hvb2sgOgorI2VuZGlmCisJCSAgICAmYXJwX3RibCwgJm5leHRob3AsIGRldik7CisJCWlmIChJU19FUlIobikpCisJCQlyZXR1cm4gUFRSX0VSUihuKTsKKwkJZHN0LT5uZWlnaGJvdXIgPSBuOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENoZWNrIGlmIHdlIGNhbiB1c2UgcHJveHkgQVJQIGZvciB0aGlzIHBhdGgKKyAqLworCitzdGF0aWMgaW5saW5lIGludCBhcnBfZndkX3Byb3h5KHN0cnVjdCBpbl9kZXZpY2UgKmluX2Rldiwgc3RydWN0IHJ0YWJsZSAqcnQpCit7CisJc3RydWN0IGluX2RldmljZSAqb3V0X2RldjsKKwlpbnQgaW1pLCBvbWkgPSAtMTsKKworCWlmICghSU5fREVWX1BST1hZX0FSUChpbl9kZXYpKQorCQlyZXR1cm4gMDsKKworCWlmICgoaW1pID0gSU5fREVWX01FRElVTV9JRChpbl9kZXYpKSA9PSAwKQorCQlyZXR1cm4gMTsKKwlpZiAoaW1pID09IC0xKQorCQlyZXR1cm4gMDsKKworCS8qIHBsYWNlIHRvIGNoZWNrIGZvciBwcm94eV9hcnAgZm9yIHJvdXRlcyAqLworCisJaWYgKChvdXRfZGV2ID0gaW5fZGV2X2dldChydC0+dS5kc3QuZGV2KSkgIT0gTlVMTCkgeworCQlvbWkgPSBJTl9ERVZfTUVESVVNX0lEKG91dF9kZXYpOworCQlpbl9kZXZfcHV0KG91dF9kZXYpOworCX0KKwlyZXR1cm4gKG9taSAhPSBpbWkgJiYgb21pICE9IC0xKTsKK30KKworLyoKKyAqCUludGVyZmFjZSB0byBsaW5rIGxheWVyOiBzZW5kIHJvdXRpbmUgYW5kIHJlY2VpdmUgaGFuZGxlci4KKyAqLworCisvKgorICoJQ3JlYXRlIGFuIGFycCBwYWNrZXQuIElmIChkZXN0X2h3ID09IE5VTEwpLCB3ZSBjcmVhdGUgYSBicm9hZGNhc3QKKyAqCW1lc3NhZ2UuCisgKi8KK3N0cnVjdCBza19idWZmICphcnBfY3JlYXRlKGludCB0eXBlLCBpbnQgcHR5cGUsIHUzMiBkZXN0X2lwLAorCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHNyY19pcCwKKwkJCSAgIHVuc2lnbmVkIGNoYXIgKmRlc3RfaHcsIHVuc2lnbmVkIGNoYXIgKnNyY19odywKKwkJCSAgIHVuc2lnbmVkIGNoYXIgKnRhcmdldF9odykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBhcnBoZHIgKmFycDsKKwl1bnNpZ25lZCBjaGFyICphcnBfcHRyOworCisJLyoKKwkgKglBbGxvY2F0ZSBhIGJ1ZmZlcgorCSAqLworCQorCXNrYiA9IGFsbG9jX3NrYihzaXplb2Yoc3RydWN0IGFycGhkcikrIDIqKGRldi0+YWRkcl9sZW4rNCkKKwkJCQkrIExMX1JFU0VSVkVEX1NQQUNFKGRldiksIEdGUF9BVE9NSUMpOworCWlmIChza2IgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlza2JfcmVzZXJ2ZShza2IsIExMX1JFU0VSVkVEX1NQQUNFKGRldikpOworCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCWFycCA9IChzdHJ1Y3QgYXJwaGRyICopIHNrYl9wdXQoc2tiLHNpemVvZihzdHJ1Y3QgYXJwaGRyKSArIDIqKGRldi0+YWRkcl9sZW4rNCkpOworCXNrYi0+ZGV2ID0gZGV2OworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9BUlApOworCWlmIChzcmNfaHcgPT0gTlVMTCkKKwkJc3JjX2h3ID0gZGV2LT5kZXZfYWRkcjsKKwlpZiAoZGVzdF9odyA9PSBOVUxMKQorCQlkZXN0X2h3ID0gZGV2LT5icm9hZGNhc3Q7CisKKwkvKgorCSAqCUZpbGwgdGhlIGRldmljZSBoZWFkZXIgZm9yIHRoZSBBUlAgZnJhbWUKKwkgKi8KKwlpZiAoZGV2LT5oYXJkX2hlYWRlciAmJgorCSAgICBkZXYtPmhhcmRfaGVhZGVyKHNrYixkZXYscHR5cGUsZGVzdF9odyxzcmNfaHcsc2tiLT5sZW4pIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIEZpbGwgb3V0IHRoZSBhcnAgcHJvdG9jb2wgcGFydC4KKwkgKgorCSAqIFRoZSBhcnAgaGFyZHdhcmUgdHlwZSBzaG91bGQgbWF0Y2ggdGhlIGRldmljZSB0eXBlLCBleGNlcHQgZm9yIEZEREksCisJICogd2hpY2ggKGFjY29yZGluZyB0byBSRkMgMTM5MCkgc2hvdWxkIGFsd2F5cyBlcXVhbCAxIChFdGhlcm5ldCkuCisJICovCisJLyoKKwkgKglFeGNlcHRpb25zIGV2ZXJ5d2hlcmUuIEFYLjI1IHVzZXMgdGhlIEFYLjI1IFBJRCB2YWx1ZSBub3QgdGhlCisJICoJRElYIGNvZGUgZm9yIHRoZSBwcm90b2NvbC4gTWFrZSB0aGVzZSBkZXZpY2Ugc3RydWN0dXJlIGZpZWxkcy4KKwkgKi8KKwlzd2l0Y2ggKGRldi0+dHlwZSkgeworCWRlZmF1bHQ6CisJCWFycC0+YXJfaHJkID0gaHRvbnMoZGV2LT50eXBlKTsKKwkJYXJwLT5hcl9wcm8gPSBodG9ucyhFVEhfUF9JUCk7CisJCWJyZWFrOworCisjaWYgZGVmaW5lZChDT05GSUdfQVgyNSkgfHwgZGVmaW5lZChDT05GSUdfQVgyNV9NT0RVTEUpCisJY2FzZSBBUlBIUkRfQVgyNToKKwkJYXJwLT5hcl9ocmQgPSBodG9ucyhBUlBIUkRfQVgyNSk7CisJCWFycC0+YXJfcHJvID0gaHRvbnMoQVgyNV9QX0lQKTsKKwkJYnJlYWs7CisKKyNpZiBkZWZpbmVkKENPTkZJR19ORVRST00pIHx8IGRlZmluZWQoQ09ORklHX05FVFJPTV9NT0RVTEUpCisJY2FzZSBBUlBIUkRfTkVUUk9NOgorCQlhcnAtPmFyX2hyZCA9IGh0b25zKEFSUEhSRF9ORVRST00pOworCQlhcnAtPmFyX3BybyA9IGh0b25zKEFYMjVfUF9JUCk7CisJCWJyZWFrOworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19GRERJCisJY2FzZSBBUlBIUkRfRkRESToKKwkJYXJwLT5hcl9ocmQgPSBodG9ucyhBUlBIUkRfRVRIRVIpOworCQlhcnAtPmFyX3BybyA9IGh0b25zKEVUSF9QX0lQKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVFIKKwljYXNlIEFSUEhSRF9JRUVFODAyX1RSOgorCQlhcnAtPmFyX2hyZCA9IGh0b25zKEFSUEhSRF9JRUVFODAyKTsKKwkJYXJwLT5hcl9wcm8gPSBodG9ucyhFVEhfUF9JUCk7CisJCWJyZWFrOworI2VuZGlmCisJfQorCisJYXJwLT5hcl9obG4gPSBkZXYtPmFkZHJfbGVuOworCWFycC0+YXJfcGxuID0gNDsKKwlhcnAtPmFyX29wID0gaHRvbnModHlwZSk7CisKKwlhcnBfcHRyPSh1bnNpZ25lZCBjaGFyICopKGFycCsxKTsKKworCW1lbWNweShhcnBfcHRyLCBzcmNfaHcsIGRldi0+YWRkcl9sZW4pOworCWFycF9wdHIrPWRldi0+YWRkcl9sZW47CisJbWVtY3B5KGFycF9wdHIsICZzcmNfaXAsNCk7CisJYXJwX3B0cis9NDsKKwlpZiAodGFyZ2V0X2h3ICE9IE5VTEwpCisJCW1lbWNweShhcnBfcHRyLCB0YXJnZXRfaHcsIGRldi0+YWRkcl9sZW4pOworCWVsc2UKKwkJbWVtc2V0KGFycF9wdHIsIDAsIGRldi0+YWRkcl9sZW4pOworCWFycF9wdHIrPWRldi0+YWRkcl9sZW47CisJbWVtY3B5KGFycF9wdHIsICZkZXN0X2lwLCA0KTsKKworCXJldHVybiBza2I7CisKK291dDoKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqCVNlbmQgYW4gYXJwIHBhY2tldC4KKyAqLwordm9pZCBhcnBfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCS8qIFNlbmQgaXQgb2ZmLCBtYXliZSBmaWx0ZXIgaXQgdXNpbmcgZmlyZXdhbGxpbmcgZmlyc3QuICAqLworCU5GX0hPT0soTkZfQVJQLCBORl9BUlBfT1VULCBza2IsIE5VTEwsIHNrYi0+ZGV2LCBkZXZfcXVldWVfeG1pdCk7Cit9CisKKy8qCisgKglDcmVhdGUgYW5kIHNlbmQgYW4gYXJwIHBhY2tldC4KKyAqLwordm9pZCBhcnBfc2VuZChpbnQgdHlwZSwgaW50IHB0eXBlLCB1MzIgZGVzdF9pcCwgCisJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHNyY19pcCwgCisJICAgICAgdW5zaWduZWQgY2hhciAqZGVzdF9odywgdW5zaWduZWQgY2hhciAqc3JjX2h3LAorCSAgICAgIHVuc2lnbmVkIGNoYXIgKnRhcmdldF9odykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJLyoKKwkgKglObyBhcnAgb24gdGhpcyBpbnRlcmZhY2UuCisJICovCisJCisJaWYgKGRldi0+ZmxhZ3MmSUZGX05PQVJQKQorCQlyZXR1cm47CisKKwlza2IgPSBhcnBfY3JlYXRlKHR5cGUsIHB0eXBlLCBkZXN0X2lwLCBkZXYsIHNyY19pcCwKKwkJCSBkZXN0X2h3LCBzcmNfaHcsIHRhcmdldF9odyk7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCXJldHVybjsKKwl9CisKKwlhcnBfeG1pdChza2IpOworfQorCitzdGF0aWMgdm9pZCBwYXJwX3JlZG8oc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwluZl9yZXNldChza2IpOworCWFycF9yY3Yoc2tiLCBza2ItPmRldiwgTlVMTCk7Cit9CisKKy8qCisgKglQcm9jZXNzIGFuIGFycCByZXF1ZXN0LgorICovCisKK3N0YXRpYyBpbnQgYXJwX3Byb2Nlc3Moc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gaW5fZGV2X2dldChkZXYpOworCXN0cnVjdCBhcnBoZHIgKmFycDsKKwl1bnNpZ25lZCBjaGFyICphcnBfcHRyOworCXN0cnVjdCBydGFibGUgKnJ0OworCXVuc2lnbmVkIGNoYXIgKnNoYSwgKnRoYTsKKwl1MzIgc2lwLCB0aXA7CisJdTE2IGRldl90eXBlID0gZGV2LT50eXBlOworCWludCBhZGRyX3R5cGU7CisJc3RydWN0IG5laWdoYm91ciAqbjsKKworCS8qIGFycF9yY3YgYmVsb3cgdmVyaWZpZXMgdGhlIEFSUCBoZWFkZXIgYW5kIHZlcmlmaWVzIHRoZSBkZXZpY2UKKwkgKiBpcyBBUlAnYWJsZS4KKwkgKi8KKworCWlmIChpbl9kZXYgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlhcnAgPSBza2ItPm5oLmFycGg7CisKKwlzd2l0Y2ggKGRldl90eXBlKSB7CisJZGVmYXVsdDoJCisJCWlmIChhcnAtPmFyX3BybyAhPSBodG9ucyhFVEhfUF9JUCkgfHwKKwkJICAgIGh0b25zKGRldl90eXBlKSAhPSBhcnAtPmFyX2hyZCkKKwkJCWdvdG8gb3V0OworCQlicmVhazsKKyNpZmRlZiBDT05GSUdfTkVUX0VUSEVSTkVUCisJY2FzZSBBUlBIUkRfRVRIRVI6CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVFIKKwljYXNlIEFSUEhSRF9JRUVFODAyX1RSOgorI2VuZGlmCisjaWZkZWYgQ09ORklHX0ZEREkKKwljYXNlIEFSUEhSRF9GRERJOgorI2VuZGlmCisjaWZkZWYgQ09ORklHX05FVF9GQworCWNhc2UgQVJQSFJEX0lFRUU4MDI6CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19ORVRfRVRIRVJORVQpIHx8IGRlZmluZWQoQ09ORklHX1RSKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfRkRESSkJIHx8IGRlZmluZWQoQ09ORklHX05FVF9GQykKKwkJLyoKKwkJICogRVRIRVJORVQsIFRva2VuIFJpbmcgYW5kIEZpYnJlIENoYW5uZWwgKHdoaWNoIGFyZSBJRUVFIDgwMgorCQkgKiBkZXZpY2VzLCBhY2NvcmRpbmcgdG8gUkZDIDI2MjUpIGRldmljZXMgd2lsbCBhY2NlcHQgQVJQCisJCSAqIGhhcmR3YXJlIHR5cGVzIG9mIGVpdGhlciAxIChFdGhlcm5ldCkgb3IgNiAoSUVFRSA4MDIuMikuCisJCSAqIFRoaXMgaXMgdGhlIGNhc2UgYWxzbyBvZiBGRERJLCB3aGVyZSB0aGUgUkZDIDEzOTAgc2F5cyB0aGF0CisJCSAqIEZEREkgZGV2aWNlcyBzaG91bGQgYWNjZXB0IEFSUCBoYXJkd2FyZSBvZiAoMSkgRXRoZXJuZXQsCisJCSAqIGhvd2V2ZXIsIHRvIGJlIG1vcmUgcm9idXN0LCB3ZSdsbCBhY2NlcHQgYm90aCAxIChFdGhlcm5ldCkKKwkJICogb3IgNiAoSUVFRSA4MDIuMikKKwkJICovCisJCWlmICgoYXJwLT5hcl9ocmQgIT0gaHRvbnMoQVJQSFJEX0VUSEVSKSAmJgorCQkgICAgIGFycC0+YXJfaHJkICE9IGh0b25zKEFSUEhSRF9JRUVFODAyKSkgfHwKKwkJICAgIGFycC0+YXJfcHJvICE9IGh0b25zKEVUSF9QX0lQKSkKKwkJCWdvdG8gb3V0OworCQlicmVhazsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FYMjUpIHx8IGRlZmluZWQoQ09ORklHX0FYMjVfTU9EVUxFKQorCWNhc2UgQVJQSFJEX0FYMjU6CisJCWlmIChhcnAtPmFyX3BybyAhPSBodG9ucyhBWDI1X1BfSVApIHx8CisJCSAgICBhcnAtPmFyX2hyZCAhPSBodG9ucyhBUlBIUkRfQVgyNSkpCisJCQlnb3RvIG91dDsKKwkJYnJlYWs7CisjaWYgZGVmaW5lZChDT05GSUdfTkVUUk9NKSB8fCBkZWZpbmVkKENPTkZJR19ORVRST01fTU9EVUxFKQorCWNhc2UgQVJQSFJEX05FVFJPTToKKwkJaWYgKGFycC0+YXJfcHJvICE9IGh0b25zKEFYMjVfUF9JUCkgfHwKKwkJICAgIGFycC0+YXJfaHJkICE9IGh0b25zKEFSUEhSRF9ORVRST00pKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOworI2VuZGlmCisjZW5kaWYKKwl9CisKKwkvKiBVbmRlcnN0YW5kIG9ubHkgdGhlc2UgbWVzc2FnZSB0eXBlcyAqLworCisJaWYgKGFycC0+YXJfb3AgIT0gaHRvbnMoQVJQT1BfUkVQTFkpICYmCisJICAgIGFycC0+YXJfb3AgIT0gaHRvbnMoQVJQT1BfUkVRVUVTVCkpCisJCWdvdG8gb3V0OworCisvKgorICoJRXh0cmFjdCBmaWVsZHMKKyAqLworCWFycF9wdHI9ICh1bnNpZ25lZCBjaGFyICopKGFycCsxKTsKKwlzaGEJPSBhcnBfcHRyOworCWFycF9wdHIgKz0gZGV2LT5hZGRyX2xlbjsKKwltZW1jcHkoJnNpcCwgYXJwX3B0ciwgNCk7CisJYXJwX3B0ciArPSA0OworCXRoYQk9IGFycF9wdHI7CisJYXJwX3B0ciArPSBkZXYtPmFkZHJfbGVuOworCW1lbWNweSgmdGlwLCBhcnBfcHRyLCA0KTsKKy8qIAorICoJQ2hlY2sgZm9yIGJhZCByZXF1ZXN0cyBmb3IgMTI3LngueC54IGFuZCByZXF1ZXN0cyBmb3IgbXVsdGljYXN0CisgKglhZGRyZXNzZXMuICBJZiB0aGlzIGlzIG9uZSBzdWNoLCBkZWxldGUgaXQuCisgKi8KKwlpZiAoTE9PUEJBQ0sodGlwKSB8fCBNVUxUSUNBU1QodGlwKSkKKwkJZ290byBvdXQ7CisKKy8qCisgKiAgICAgU3BlY2lhbCBjYXNlOiBXZSBtdXN0IHNldCBGcmFtZSBSZWxheSBzb3VyY2UgUS45MjIgYWRkcmVzcworICovCisJaWYgKGRldl90eXBlID09IEFSUEhSRF9ETENJKQorCQlzaGEgPSBkZXYtPmJyb2FkY2FzdDsKKworLyoKKyAqICBQcm9jZXNzIGVudHJ5LiAgVGhlIGlkZWEgaGVyZSBpcyB3ZSB3YW50IHRvIHNlbmQgYSByZXBseSBpZiBpdCBpcyBhCisgKiAgcmVxdWVzdCBmb3IgdXMgb3IgaWYgaXQgaXMgYSByZXF1ZXN0IGZvciBzb21lb25lIGVsc2UgdGhhdCB3ZSBob2xkCisgKiAgYSBwcm94eSBmb3IuICBXZSB3YW50IHRvIGFkZCBhbiBlbnRyeSB0byBvdXIgY2FjaGUgaWYgaXQgaXMgYSByZXBseQorICogIHRvIHVzIG9yIGlmIGl0IGlzIGEgcmVxdWVzdCBmb3Igb3VyIGFkZHJlc3MuICAKKyAqICAoVGhlIGFzc3VtcHRpb24gZm9yIHRoaXMgbGFzdCBpcyB0aGF0IGlmIHNvbWVvbmUgaXMgcmVxdWVzdGluZyBvdXIgCisgKiAgYWRkcmVzcywgdGhleSBhcmUgcHJvYmFibHkgaW50ZW5kaW5nIHRvIHRhbGsgdG8gdXMsIHNvIGl0IHNhdmVzIHRpbWUgCisgKiAgaWYgd2UgY2FjaGUgdGhlaXIgYWRkcmVzcy4gIFRoZWlyIGFkZHJlc3MgaXMgYWxzbyBwcm9iYWJseSBub3QgaW4gCisgKiAgb3VyIGNhY2hlLCBzaW5jZSBvdXJzIGlzIG5vdCBpbiB0aGVpciBjYWNoZS4pCisgKiAKKyAqICBQdXR0aW5nIHRoaXMgYW5vdGhlciB3YXksIHdlIG9ubHkgY2FyZSBhYm91dCByZXBsaWVzIGlmIHRoZXkgYXJlIHRvCisgKiAgdXMsIGluIHdoaWNoIGNhc2Ugd2UgYWRkIHRoZW0gdG8gdGhlIGNhY2hlLiAgRm9yIHJlcXVlc3RzLCB3ZSBjYXJlCisgKiAgYWJvdXQgdGhvc2UgZm9yIHVzIGFuZCB0aG9zZSBmb3Igb3VyIHByb3hpZXMuICBXZSByZXBseSB0byBib3RoLAorICogIGFuZCBpbiB0aGUgY2FzZSBvZiByZXF1ZXN0cyBmb3IgdXMgd2UgYWRkIHRoZSByZXF1ZXN0ZXIgdG8gdGhlIGFycCAKKyAqICBjYWNoZS4KKyAqLworCisJLyogU3BlY2lhbCBjYXNlOiBJUHY0IGR1cGxpY2F0ZSBhZGRyZXNzIGRldGVjdGlvbiBwYWNrZXQgKFJGQzIxMzEpICovCisJaWYgKHNpcCA9PSAwKSB7CisJCWlmIChhcnAtPmFyX29wID09IGh0b25zKEFSUE9QX1JFUVVFU1QpICYmCisJCSAgICBpbmV0X2FkZHJfdHlwZSh0aXApID09IFJUTl9MT0NBTCAmJgorCQkgICAgIWFycF9pZ25vcmUoaW5fZGV2LGRldixzaXAsdGlwKSkKKwkJCWFycF9zZW5kKEFSUE9QX1JFUExZLEVUSF9QX0FSUCx0aXAsZGV2LHRpcCxzaGEsZGV2LT5kZXZfYWRkcixkZXYtPmRldl9hZGRyKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGFycC0+YXJfb3AgPT0gaHRvbnMoQVJQT1BfUkVRVUVTVCkgJiYKKwkgICAgaXBfcm91dGVfaW5wdXQoc2tiLCB0aXAsIHNpcCwgMCwgZGV2KSA9PSAwKSB7CisKKwkJcnQgPSAoc3RydWN0IHJ0YWJsZSopc2tiLT5kc3Q7CisJCWFkZHJfdHlwZSA9IHJ0LT5ydF90eXBlOworCisJCWlmIChhZGRyX3R5cGUgPT0gUlROX0xPQ0FMKSB7CisJCQluID0gbmVpZ2hfZXZlbnRfbnMoJmFycF90YmwsIHNoYSwgJnNpcCwgZGV2KTsKKwkJCWlmIChuKSB7CisJCQkJaW50IGRvbnRfc2VuZCA9IDA7CisKKwkJCQlpZiAoIWRvbnRfc2VuZCkKKwkJCQkJZG9udF9zZW5kIHw9IGFycF9pZ25vcmUoaW5fZGV2LGRldixzaXAsdGlwKTsKKwkJCQlpZiAoIWRvbnRfc2VuZCAmJiBJTl9ERVZfQVJQRklMVEVSKGluX2RldikpCisJCQkJCWRvbnRfc2VuZCB8PSBhcnBfZmlsdGVyKHNpcCx0aXAsZGV2KTsgCisJCQkJaWYgKCFkb250X3NlbmQpCisJCQkJCWFycF9zZW5kKEFSUE9QX1JFUExZLEVUSF9QX0FSUCxzaXAsZGV2LHRpcCxzaGEsZGV2LT5kZXZfYWRkcixzaGEpOworCisJCQkJbmVpZ2hfcmVsZWFzZShuKTsKKwkJCX0KKwkJCWdvdG8gb3V0OworCQl9IGVsc2UgaWYgKElOX0RFVl9GT1JXQVJEKGluX2RldikpIHsKKwkJCWlmICgocnQtPnJ0X2ZsYWdzJlJUQ0ZfRE5BVCkgfHwKKwkJCSAgICAoYWRkcl90eXBlID09IFJUTl9VTklDQVNUICAmJiBydC0+dS5kc3QuZGV2ICE9IGRldiAmJgorCQkJICAgICAoYXJwX2Z3ZF9wcm94eShpbl9kZXYsIHJ0KSB8fCBwbmVpZ2hfbG9va3VwKCZhcnBfdGJsLCAmdGlwLCBkZXYsIDApKSkpIHsKKwkJCQluID0gbmVpZ2hfZXZlbnRfbnMoJmFycF90YmwsIHNoYSwgJnNpcCwgZGV2KTsKKwkJCQlpZiAobikKKwkJCQkJbmVpZ2hfcmVsZWFzZShuKTsKKworCQkJCWlmIChza2ItPnN0YW1wLnR2X3NlYyA9PSBMT0NBTExZX0VOUVVFVUVEIHx8IAorCQkJCSAgICBza2ItPnBrdF90eXBlID09IFBBQ0tFVF9IT1NUIHx8CisJCQkJICAgIGluX2Rldi0+YXJwX3Bhcm1zLT5wcm94eV9kZWxheSA9PSAwKSB7CisJCQkJCWFycF9zZW5kKEFSUE9QX1JFUExZLEVUSF9QX0FSUCxzaXAsZGV2LHRpcCxzaGEsZGV2LT5kZXZfYWRkcixzaGEpOworCQkJCX0gZWxzZSB7CisJCQkJCXBuZWlnaF9lbnF1ZXVlKCZhcnBfdGJsLCBpbl9kZXYtPmFycF9wYXJtcywgc2tiKTsKKwkJCQkJaW5fZGV2X3B1dChpbl9kZXYpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwl9CisKKwkvKiBVcGRhdGUgb3VyIEFSUCB0YWJsZXMgKi8KKworCW4gPSBfX25laWdoX2xvb2t1cCgmYXJwX3RibCwgJnNpcCwgZGV2LCAwKTsKKworI2lmZGVmIENPTkZJR19JUF9BQ0NFUFRfVU5TT0xJQ0lURURfQVJQCisJLyogVW5zb2xpY2l0ZWQgQVJQIGlzIG5vdCBhY2NlcHRlZCBieSBkZWZhdWx0LgorCSAgIEl0IGlzIHBvc3NpYmxlLCB0aGF0IHRoaXMgb3B0aW9uIHNob3VsZCBiZSBlbmFibGVkIGZvciBzb21lCisJICAgZGV2aWNlcyAoc3RyaXAgaXMgY2FuZGlkYXRlKQorCSAqLworCWlmIChuID09IE5VTEwgJiYKKwkgICAgYXJwLT5hcl9vcCA9PSBodG9ucyhBUlBPUF9SRVBMWSkgJiYKKwkgICAgaW5ldF9hZGRyX3R5cGUoc2lwKSA9PSBSVE5fVU5JQ0FTVCkKKwkJbiA9IF9fbmVpZ2hfbG9va3VwKCZhcnBfdGJsLCAmc2lwLCBkZXYsIC0xKTsKKyNlbmRpZgorCisJaWYgKG4pIHsKKwkJaW50IHN0YXRlID0gTlVEX1JFQUNIQUJMRTsKKwkJaW50IG92ZXJyaWRlOworCisJCS8qIElmIHNldmVyYWwgZGlmZmVyZW50IEFSUCByZXBsaWVzIGZvbGxvd3MgYmFjay10by1iYWNrLAorCQkgICB1c2UgdGhlIEZJUlNUIG9uZS4gSXQgaXMgcG9zc2libGUsIGlmIHNldmVyYWwgcHJveHkKKwkJICAgYWdlbnRzIGFyZSBhY3RpdmUuIFRha2luZyB0aGUgZmlyc3QgcmVwbHkgcHJldmVudHMKKwkJICAgYXJwIHRyYXNoaW5nIGFuZCBjaG9vc2VzIHRoZSBmYXN0ZXN0IHJvdXRlci4KKwkJICovCisJCW92ZXJyaWRlID0gdGltZV9hZnRlcihqaWZmaWVzLCBuLT51cGRhdGVkICsgbi0+cGFybXMtPmxvY2t0aW1lKTsKKworCQkvKiBCcm9hZGNhc3QgcmVwbGllcyBhbmQgcmVxdWVzdCBwYWNrZXRzCisJCSAgIGRvIG5vdCBhc3NlcnQgbmVpZ2hib3VyIHJlYWNoYWJpbGl0eS4KKwkJICovCisJCWlmIChhcnAtPmFyX29wICE9IGh0b25zKEFSUE9QX1JFUExZKSB8fAorCQkgICAgc2tiLT5wa3RfdHlwZSAhPSBQQUNLRVRfSE9TVCkKKwkJCXN0YXRlID0gTlVEX1NUQUxFOworCQluZWlnaF91cGRhdGUobiwgc2hhLCBzdGF0ZSwgb3ZlcnJpZGUgPyBORUlHSF9VUERBVEVfRl9PVkVSUklERSA6IDApOworCQluZWlnaF9yZWxlYXNlKG4pOworCX0KKworb3V0OgorCWlmIChpbl9kZXYpCisJCWluX2Rldl9wdXQoaW5fZGV2KTsKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJUmVjZWl2ZSBhbiBhcnAgcmVxdWVzdCBmcm9tIHRoZSBkZXZpY2UgbGF5ZXIuCisgKi8KKworaW50IGFycF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHBhY2tldF90eXBlICpwdCkKK3sKKwlzdHJ1Y3QgYXJwaGRyICphcnA7CisKKwkvKiBBUlAgaGVhZGVyLCBwbHVzIDIgZGV2aWNlIGFkZHJlc3NlcywgcGx1cyAyIElQIGFkZHJlc3Nlcy4gICovCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgKHNpemVvZihzdHJ1Y3QgYXJwaGRyKSArCisJCQkJICgyICogZGV2LT5hZGRyX2xlbikgKworCQkJCSAoMiAqIHNpemVvZih1MzIpKSkpKQorCQlnb3RvIGZyZWVza2I7CisKKwlhcnAgPSBza2ItPm5oLmFycGg7CisJaWYgKGFycC0+YXJfaGxuICE9IGRldi0+YWRkcl9sZW4gfHwKKwkgICAgZGV2LT5mbGFncyAmIElGRl9OT0FSUCB8fAorCSAgICBza2ItPnBrdF90eXBlID09IFBBQ0tFVF9PVEhFUkhPU1QgfHwKKwkgICAgc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfTE9PUEJBQ0sgfHwKKwkgICAgYXJwLT5hcl9wbG4gIT0gNCkKKwkJZ290byBmcmVlc2tiOworCisJaWYgKChza2IgPSBza2Jfc2hhcmVfY2hlY2soc2tiLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwkJZ290byBvdXRfb2ZfbWVtOworCisJcmV0dXJuIE5GX0hPT0soTkZfQVJQLCBORl9BUlBfSU4sIHNrYiwgZGV2LCBOVUxMLCBhcnBfcHJvY2Vzcyk7CisKK2ZyZWVza2I6CisJa2ZyZWVfc2tiKHNrYik7CitvdXRfb2ZfbWVtOgorCXJldHVybiAwOworfQorCisvKgorICoJVXNlciBsZXZlbCBpbnRlcmZhY2UgKGlvY3RsKQorICovCisKKy8qCisgKglTZXQgKGNyZWF0ZSkgYW4gQVJQIGNhY2hlIGVudHJ5LgorICovCisKK3N0YXRpYyBpbnQgYXJwX3JlcV9zZXQoc3RydWN0IGFycHJlcSAqciwgc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJdTMyIGlwID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJnItPmFycF9wYSktPnNpbl9hZGRyLnNfYWRkcjsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaDsKKwlpbnQgZXJyOworCisJaWYgKHItPmFycF9mbGFncyZBVEZfUFVCTCkgeworCQl1MzIgbWFzayA9ICgoc3RydWN0IHNvY2thZGRyX2luICopICZyLT5hcnBfbmV0bWFzayktPnNpbl9hZGRyLnNfYWRkcjsKKwkJaWYgKG1hc2sgJiYgbWFzayAhPSAweEZGRkZGRkZGKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghZGV2ICYmIChyLT5hcnBfZmxhZ3MgJiBBVEZfQ09NKSkgeworCQkJZGV2ID0gZGV2X2dldGJ5aHdhZGRyKHItPmFycF9oYS5zYV9mYW1pbHksIHItPmFycF9oYS5zYV9kYXRhKTsKKwkJCWlmICghZGV2KQorCQkJCXJldHVybiAtRU5PREVWOworCQl9CisJCWlmIChtYXNrKSB7CisJCQlpZiAocG5laWdoX2xvb2t1cCgmYXJwX3RibCwgJmlwLCBkZXYsIDEpID09IE5VTEwpCisJCQkJcmV0dXJuIC1FTk9CVUZTOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGRldiA9PSBOVUxMKSB7CisJCQlpcHY0X2RldmNvbmYucHJveHlfYXJwID0gMTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChfX2luX2Rldl9nZXQoZGV2KSkgeworCQkJX19pbl9kZXZfZ2V0KGRldiktPmNuZi5wcm94eV9hcnAgPSAxOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlpZiAoci0+YXJwX2ZsYWdzICYgQVRGX1BFUk0pCisJCXItPmFycF9mbGFncyB8PSBBVEZfQ09NOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlzdHJ1Y3QgZmxvd2kgZmwgPSB7IC5ubF91ID0geyAuaXA0X3UgPSB7IC5kYWRkciA9IGlwLAorCQkJCQkJCSAudG9zID0gUlRPX09OTElOSyB9IH0gfTsKKwkJc3RydWN0IHJ0YWJsZSAqIHJ0OworCQlpZiAoKGVyciA9IGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpKSAhPSAwKQorCQkJcmV0dXJuIGVycjsKKwkJZGV2ID0gcnQtPnUuZHN0LmRldjsKKwkJaXBfcnRfcHV0KHJ0KTsKKwkJaWYgKCFkZXYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc3dpdGNoIChkZXYtPnR5cGUpIHsKKyNpZmRlZiBDT05GSUdfRkRESQorCWNhc2UgQVJQSFJEX0ZEREk6CisJCS8qCisJCSAqIEFjY29yZGluZyB0byBSRkMgMTM5MCwgRkRESSBkZXZpY2VzIHNob3VsZCBhY2NlcHQgQVJQCisJCSAqIGhhcmR3YXJlIHR5cGVzIG9mIDEgKEV0aGVybmV0KS4gIEhvd2V2ZXIsIHRvIGJlIG1vcmUKKwkJICogcm9idXN0LCB3ZSdsbCBhY2NlcHQgaGFyZHdhcmUgdHlwZXMgb2YgZWl0aGVyIDEgKEV0aGVybmV0KQorCQkgKiBvciA2IChJRUVFIDgwMi4yKS4KKwkJICovCisJCWlmIChyLT5hcnBfaGEuc2FfZmFtaWx5ICE9IEFSUEhSRF9GRERJICYmCisJCSAgICByLT5hcnBfaGEuc2FfZmFtaWx5ICE9IEFSUEhSRF9FVEhFUiAmJgorCQkgICAgci0+YXJwX2hhLnNhX2ZhbWlseSAhPSBBUlBIUkRfSUVFRTgwMikKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCWlmIChyLT5hcnBfaGEuc2FfZmFtaWx5ICE9IGRldi0+dHlwZSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwluZWlnaCA9IF9fbmVpZ2hfbG9va3VwX2Vycm5vKCZhcnBfdGJsLCAmaXAsIGRldik7CisJZXJyID0gUFRSX0VSUihuZWlnaCk7CisJaWYgKCFJU19FUlIobmVpZ2gpKSB7CisJCXVuc2lnbmVkIHN0YXRlID0gTlVEX1NUQUxFOworCQlpZiAoci0+YXJwX2ZsYWdzICYgQVRGX1BFUk0pCisJCQlzdGF0ZSA9IE5VRF9QRVJNQU5FTlQ7CisJCWVyciA9IG5laWdoX3VwZGF0ZShuZWlnaCwgKHItPmFycF9mbGFncyZBVEZfQ09NKSA/CisJCQkJICAgci0+YXJwX2hhLnNhX2RhdGEgOiBOVUxMLCBzdGF0ZSwgCisJCQkJICAgTkVJR0hfVVBEQVRFX0ZfT1ZFUlJJREV8CisJCQkJICAgTkVJR0hfVVBEQVRFX0ZfQURNSU4pOworCQluZWlnaF9yZWxlYXNlKG5laWdoKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHVuc2lnbmVkIGFycF9zdGF0ZV90b19mbGFncyhzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCkKK3sKKwl1bnNpZ25lZCBmbGFncyA9IDA7CisJaWYgKG5laWdoLT5udWRfc3RhdGUmTlVEX1BFUk1BTkVOVCkKKwkJZmxhZ3MgPSBBVEZfUEVSTXxBVEZfQ09NOworCWVsc2UgaWYgKG5laWdoLT5udWRfc3RhdGUmTlVEX1ZBTElEKQorCQlmbGFncyA9IEFURl9DT007CisJcmV0dXJuIGZsYWdzOworfQorCisvKgorICoJR2V0IGFuIEFSUCBjYWNoZSBlbnRyeS4KKyAqLworCitzdGF0aWMgaW50IGFycF9yZXFfZ2V0KHN0cnVjdCBhcnByZXEgKnIsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTMyIGlwID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJnItPmFycF9wYSktPnNpbl9hZGRyLnNfYWRkcjsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaDsKKwlpbnQgZXJyID0gLUVOWElPOworCisJbmVpZ2ggPSBuZWlnaF9sb29rdXAoJmFycF90YmwsICZpcCwgZGV2KTsKKwlpZiAobmVpZ2gpIHsKKwkJcmVhZF9sb2NrX2JoKCZuZWlnaC0+bG9jayk7CisJCW1lbWNweShyLT5hcnBfaGEuc2FfZGF0YSwgbmVpZ2gtPmhhLCBkZXYtPmFkZHJfbGVuKTsKKwkJci0+YXJwX2ZsYWdzID0gYXJwX3N0YXRlX3RvX2ZsYWdzKG5laWdoKTsKKwkJcmVhZF91bmxvY2tfYmgoJm5laWdoLT5sb2NrKTsKKwkJci0+YXJwX2hhLnNhX2ZhbWlseSA9IGRldi0+dHlwZTsKKwkJc3RybGNweShyLT5hcnBfZGV2LCBkZXYtPm5hbWUsIHNpemVvZihyLT5hcnBfZGV2KSk7CisJCW5laWdoX3JlbGVhc2UobmVpZ2gpOworCQllcnIgPSAwOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGFycF9yZXFfZGVsZXRlKHN0cnVjdCBhcnByZXEgKnIsIHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCWludCBlcnI7CisJdTMyIGlwID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmci0+YXJwX3BhKS0+c2luX2FkZHIuc19hZGRyOworCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoOworCisJaWYgKHItPmFycF9mbGFncyAmIEFURl9QVUJMKSB7CisJCXUzMiBtYXNrID0KKwkJICAgICAgICgoc3RydWN0IHNvY2thZGRyX2luICopJnItPmFycF9uZXRtYXNrKS0+c2luX2FkZHIuc19hZGRyOworCQlpZiAobWFzayA9PSAweEZGRkZGRkZGKQorCQkJcmV0dXJuIHBuZWlnaF9kZWxldGUoJmFycF90YmwsICZpcCwgZGV2KTsKKwkJaWYgKG1hc2sgPT0gMCkgeworCQkJaWYgKGRldiA9PSBOVUxMKSB7CisJCQkJaXB2NF9kZXZjb25mLnByb3h5X2FycCA9IDA7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAoX19pbl9kZXZfZ2V0KGRldikpIHsKKwkJCQlfX2luX2Rldl9nZXQoZGV2KS0+Y25mLnByb3h5X2FycCA9IDA7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChkZXYgPT0gTlVMTCkgeworCQlzdHJ1Y3QgZmxvd2kgZmwgPSB7IC5ubF91ID0geyAuaXA0X3UgPSB7IC5kYWRkciA9IGlwLAorCQkJCQkJCSAudG9zID0gUlRPX09OTElOSyB9IH0gfTsKKwkJc3RydWN0IHJ0YWJsZSAqIHJ0OworCQlpZiAoKGVyciA9IGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpKSAhPSAwKQorCQkJcmV0dXJuIGVycjsKKwkJZGV2ID0gcnQtPnUuZHN0LmRldjsKKwkJaXBfcnRfcHV0KHJ0KTsKKwkJaWYgKCFkZXYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZXJyID0gLUVOWElPOworCW5laWdoID0gbmVpZ2hfbG9va3VwKCZhcnBfdGJsLCAmaXAsIGRldik7CisJaWYgKG5laWdoKSB7CisJCWlmIChuZWlnaC0+bnVkX3N0YXRlJn5OVURfTk9BUlApCisJCQllcnIgPSBuZWlnaF91cGRhdGUobmVpZ2gsIE5VTEwsIE5VRF9GQUlMRUQsIAorCQkJCQkgICBORUlHSF9VUERBVEVfRl9PVkVSUklERXwKKwkJCQkJICAgTkVJR0hfVVBEQVRFX0ZfQURNSU4pOworCQluZWlnaF9yZWxlYXNlKG5laWdoKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqCUhhbmRsZSBhbiBBUlAgbGF5ZXIgSS9PIGNvbnRyb2wgcmVxdWVzdC4KKyAqLworCitpbnQgYXJwX2lvY3RsKHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgYXJwcmVxIHI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFNJT0NEQVJQOgorCQljYXNlIFNJT0NTQVJQOgorCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJCXJldHVybiAtRVBFUk07CisJCWNhc2UgU0lPQ0dBUlA6CisJCQllcnIgPSBjb3B5X2Zyb21fdXNlcigmciwgYXJnLCBzaXplb2Yoc3RydWN0IGFycHJlcSkpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHIuYXJwX3BhLnNhX2ZhbWlseSAhPSBBRl9JTkVUKQorCQlyZXR1cm4gLUVQRk5PU1VQUE9SVDsKKworCWlmICghKHIuYXJwX2ZsYWdzICYgQVRGX1BVQkwpICYmCisJICAgIChyLmFycF9mbGFncyAmIChBVEZfTkVUTUFTS3xBVEZfRE9OVFBVQikpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIShyLmFycF9mbGFncyAmIEFURl9ORVRNQVNLKSkKKwkJKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmci5hcnBfbmV0bWFzayktPnNpbl9hZGRyLnNfYWRkciA9CisJCQkJCQkJICAgaHRvbmwoMHhGRkZGRkZGRlVMKTsKKwlydG5sX2xvY2soKTsKKwlpZiAoci5hcnBfZGV2WzBdKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWlmICgoZGV2ID0gX19kZXZfZ2V0X2J5X25hbWUoci5hcnBfZGV2KSkgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCisJCS8qIE1tbW0uLi4gSXQgaXMgd3JvbmcuLi4gQVJQSFJEX05FVFJPTT09MCAqLworCQlpZiAoIXIuYXJwX2hhLnNhX2ZhbWlseSkKKwkJCXIuYXJwX2hhLnNhX2ZhbWlseSA9IGRldi0+dHlwZTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJaWYgKChyLmFycF9mbGFncyAmIEFURl9DT00pICYmIHIuYXJwX2hhLnNhX2ZhbWlseSAhPSBkZXYtPnR5cGUpCisJCQlnb3RvIG91dDsKKwl9IGVsc2UgaWYgKGNtZCA9PSBTSU9DR0FSUCkgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBTSU9DREFSUDoKKwkgICAgICAgIGVyciA9IGFycF9yZXFfZGVsZXRlKCZyLCBkZXYpOworCQlicmVhazsKKwljYXNlIFNJT0NTQVJQOgorCQllcnIgPSBhcnBfcmVxX3NldCgmciwgZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DR0FSUDoKKwkJZXJyID0gYXJwX3JlcV9nZXQoJnIsIGRldik7CisJCWlmICghZXJyICYmIGNvcHlfdG9fdXNlcihhcmcsICZyLCBzaXplb2YocikpKQorCQkJZXJyID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJfQorb3V0OgorCXJ0bmxfdW5sb2NrKCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBhcnBfbmV0ZGV2X2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwdHI7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBORVRERVZfQ0hBTkdFQUREUjoKKwkJbmVpZ2hfY2hhbmdlYWRkcigmYXJwX3RibCwgZGV2KTsKKwkJcnRfY2FjaGVfZmx1c2goMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBhcnBfbmV0ZGV2X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gYXJwX25ldGRldl9ldmVudCwKK307CisKKy8qIE5vdGUsIHRoYXQgaXQgaXMgbm90IG9uIG5vdGlmaWVyIGNoYWluLgorICAgSXQgaXMgbmVjZXNzYXJ5LCB0aGF0IHRoaXMgcm91dGluZSB3YXMgY2FsbGVkIGFmdGVyIHJvdXRlIGNhY2hlIHdpbGwgYmUKKyAgIGZsdXNoZWQuCisgKi8KK3ZvaWQgYXJwX2lmZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW5laWdoX2lmZG93bigmYXJwX3RibCwgZGV2KTsKK30KKworCisvKgorICoJQ2FsbGVkIG9uY2Ugb24gc3RhcnR1cC4KKyAqLworCitzdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIGFycF9wYWNrZXRfdHlwZSA9IHsKKwkudHlwZSA9CV9fY29uc3RhbnRfaHRvbnMoRVRIX1BfQVJQKSwKKwkuZnVuYyA9CWFycF9yY3YsCit9OworCitzdGF0aWMgaW50IGFycF9wcm9jX2luaXQodm9pZCk7CisKK3ZvaWQgX19pbml0IGFycF9pbml0KHZvaWQpCit7CisJbmVpZ2hfdGFibGVfaW5pdCgmYXJwX3RibCk7CisKKwlkZXZfYWRkX3BhY2soJmFycF9wYWNrZXRfdHlwZSk7CisJYXJwX3Byb2NfaW5pdCgpOworI2lmZGVmIENPTkZJR19TWVNDVEwKKwluZWlnaF9zeXNjdGxfcmVnaXN0ZXIoTlVMTCwgJmFycF90YmwucGFybXMsIE5FVF9JUFY0LAorCQkJICAgICAgTkVUX0lQVjRfTkVJR0gsICJpcHY0IiwgTlVMTCwgTlVMTCk7CisjZW5kaWYKKwlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmFycF9uZXRkZXZfbm90aWZpZXIpOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKyNpZiBkZWZpbmVkKENPTkZJR19BWDI1KSB8fCBkZWZpbmVkKENPTkZJR19BWDI1X01PRFVMRSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICoJYXgyNSAtPiBBU0NJSSBjb252ZXJzaW9uCisgKi8KK3N0YXRpYyBjaGFyICpheDJhc2MyKGF4MjVfYWRkcmVzcyAqYSwgY2hhciAqYnVmKQoreworCWNoYXIgYywgKnM7CisJaW50IG47CisKKwlmb3IgKG4gPSAwLCBzID0gYnVmOyBuIDwgNjsgbisrKSB7CisJCWMgPSAoYS0+YXgyNV9jYWxsW25dID4+IDEpICYgMHg3RjsKKworCQlpZiAoYyAhPSAnICcpICpzKysgPSBjOworCX0KKwkKKwkqcysrID0gJy0nOworCisJaWYgKChuID0gKChhLT5heDI1X2NhbGxbNl0gPj4gMSkgJiAweDBGKSkgPiA5KSB7CisJCSpzKysgPSAnMSc7CisJCW4gLT0gMTA7CisJfQorCQorCSpzKysgPSBuICsgJzAnOworCSpzKysgPSAnXDAnOworCisJaWYgKCpidWYgPT0gJ1wwJyB8fCAqYnVmID09ICctJykKKwkgICByZXR1cm4gIioiOworCisJcmV0dXJuIGJ1ZjsKKworfQorI2VuZGlmIC8qIENPTkZJR19BWDI1ICovCisKKyNkZWZpbmUgSEJVRkZFUkxFTiAzMAorCitzdGF0aWMgdm9pZCBhcnBfZm9ybWF0X25laWdoX2VudHJ5KHN0cnVjdCBzZXFfZmlsZSAqc2VxLAorCQkJCSAgIHN0cnVjdCBuZWlnaGJvdXIgKm4pCit7CisJY2hhciBoYnVmZmVyW0hCVUZGRVJMRU5dOworCWNvbnN0IGNoYXIgaGV4YnVmW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CisJaW50IGssIGo7CisJY2hhciB0YnVmWzE2XTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbi0+ZGV2OworCWludCBoYXR5cGUgPSBkZXYtPnR5cGU7CisKKwlyZWFkX2xvY2soJm4tPmxvY2spOworCS8qIENvbnZlcnQgaGFyZHdhcmUgYWRkcmVzcyB0byBYWDpYWDpYWDpYWCAuLi4gZm9ybS4gKi8KKyNpZiBkZWZpbmVkKENPTkZJR19BWDI1KSB8fCBkZWZpbmVkKENPTkZJR19BWDI1X01PRFVMRSkKKwlpZiAoaGF0eXBlID09IEFSUEhSRF9BWDI1IHx8IGhhdHlwZSA9PSBBUlBIUkRfTkVUUk9NKQorCQlheDJhc2MyKChheDI1X2FkZHJlc3MgKiluLT5oYSwgaGJ1ZmZlcik7CisJZWxzZSB7CisjZW5kaWYKKwlmb3IgKGsgPSAwLCBqID0gMDsgayA8IEhCVUZGRVJMRU4gLSAzICYmIGogPCBkZXYtPmFkZHJfbGVuOyBqKyspIHsKKwkJaGJ1ZmZlcltrKytdID0gaGV4YnVmWyhuLT5oYVtqXSA+PiA0KSAmIDE1XTsKKwkJaGJ1ZmZlcltrKytdID0gaGV4YnVmW24tPmhhW2pdICYgMTVdOworCQloYnVmZmVyW2srK10gPSAnOic7CisJfQorCWhidWZmZXJbLS1rXSA9IDA7CisjaWYgZGVmaW5lZChDT05GSUdfQVgyNSkgfHwgZGVmaW5lZChDT05GSUdfQVgyNV9NT0RVTEUpCisJfQorI2VuZGlmCisJc3ByaW50Zih0YnVmLCAiJXUuJXUuJXUuJXUiLCBOSVBRVUFEKCoodTMyKiluLT5wcmltYXJ5X2tleSkpOworCXNlcV9wcmludGYoc2VxLCAiJS0xNnMgMHglLTEweDB4JS0xMHglcyAgICAgKiAgICAgICAgJXNcbiIsCisJCSAgIHRidWYsIGhhdHlwZSwgYXJwX3N0YXRlX3RvX2ZsYWdzKG4pLCBoYnVmZmVyLCBkZXYtPm5hbWUpOworCXJlYWRfdW5sb2NrKCZuLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgYXJwX2Zvcm1hdF9wbmVpZ2hfZW50cnkoc3RydWN0IHNlcV9maWxlICpzZXEsCisJCQkJICAgIHN0cnVjdCBwbmVpZ2hfZW50cnkgKm4pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG4tPmRldjsKKwlpbnQgaGF0eXBlID0gZGV2ID8gZGV2LT50eXBlIDogMDsKKwljaGFyIHRidWZbMTZdOworCisJc3ByaW50Zih0YnVmLCAiJXUuJXUuJXUuJXUiLCBOSVBRVUFEKCoodTMyKiluLT5rZXkpKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiUtMTZzIDB4JS0xMHgweCUtMTB4JXMgICAgICogICAgICAgICVzXG4iLAorCQkgICB0YnVmLCBoYXR5cGUsIEFURl9QVUJMIHwgQVRGX1BFUk0sICIwMDowMDowMDowMDowMDowMCIsCisJCSAgIGRldiA/IGRldi0+bmFtZSA6ICIqIik7Cit9CisKK3N0YXRpYyBpbnQgYXJwX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlzZXFfcHV0cyhzZXEsICJJUCBhZGRyZXNzICAgICAgIEhXIHR5cGUgICAgIEZsYWdzICAgICAgICIKKwkJCSAgICAgICJIVyBhZGRyZXNzICAgICAgICAgICAgTWFzayAgICAgRGV2aWNlXG4iKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbmVpZ2hfc2VxX3N0YXRlICpzdGF0ZSA9IHNlcS0+cHJpdmF0ZTsKKworCQlpZiAoc3RhdGUtPmZsYWdzICYgTkVJR0hfU0VRX0lTX1BORUlHSCkKKwkJCWFycF9mb3JtYXRfcG5laWdoX2VudHJ5KHNlcSwgdik7CisJCWVsc2UKKwkJCWFycF9mb3JtYXRfbmVpZ2hfZW50cnkoc2VxLCB2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgKmFycF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCS8qIERvbid0IHdhbnQgdG8gY29uZnVzZSAiYXJwIC1hIiB3LyBtYWdpYyBlbnRyaWVzLAorCSAqIHNvIHdlIHRlbGwgdGhlIGdlbmVyaWMgaXRlcmF0b3IgdG8gc2tpcCBOVURfTk9BUlAuCisJICovCisJcmV0dXJuIG5laWdoX3NlcV9zdGFydChzZXEsIHBvcywgJmFycF90YmwsIE5FSUdIX1NFUV9TS0lQX05PQVJQKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgYXJwX3NlcV9vcHMgPSB7CisJLnN0YXJ0ICA9IGFycF9zZXFfc3RhcnQsCisJLm5leHQgICA9IG5laWdoX3NlcV9uZXh0LAorCS5zdG9wICAgPSBuZWlnaF9zZXFfc3RvcCwKKwkuc2hvdyAgID0gYXJwX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBhcnBfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNlcV9maWxlICpzZXE7CisJaW50IHJjID0gLUVOT01FTTsKKwlzdHJ1Y3QgbmVpZ2hfc2VxX3N0YXRlICpzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKyAgICAgICAKKwlpZiAoIXMpCisJCWdvdG8gb3V0OworCisJbWVtc2V0KHMsIDAsIHNpemVvZigqcykpOworCXJjID0gc2VxX29wZW4oZmlsZSwgJmFycF9zZXFfb3BzKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0X2tmcmVlOworCisJc2VxCSAgICAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc2VxLT5wcml2YXRlID0gczsKK291dDoKKwlyZXR1cm4gcmM7CitvdXRfa2ZyZWU6CisJa2ZyZWUocyk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFycF9zZXFfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgICAgICAgID0gYXJwX3NlcV9vcGVuLAorCS5yZWFkICAgICAgICAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgICAgICAgICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlX3ByaXZhdGUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhcnBfcHJvY19pbml0KHZvaWQpCit7CisJaWYgKCFwcm9jX25ldF9mb3BzX2NyZWF0ZSgiYXJwIiwgU19JUlVHTywgJmFycF9zZXFfZm9wcykpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCisjZWxzZSAvKiBDT05GSUdfUFJPQ19GUyAqLworCitzdGF0aWMgaW50IF9faW5pdCBhcnBfcHJvY19pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCitFWFBPUlRfU1lNQk9MKGFycF9icm9rZW5fb3BzKTsKK0VYUE9SVF9TWU1CT0woYXJwX2ZpbmQpOworRVhQT1JUX1NZTUJPTChhcnBfcmN2KTsKK0VYUE9SVF9TWU1CT0woYXJwX2NyZWF0ZSk7CitFWFBPUlRfU1lNQk9MKGFycF94bWl0KTsKK0VYUE9SVF9TWU1CT0woYXJwX3NlbmQpOworRVhQT1JUX1NZTUJPTChhcnBfdGJsKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0FUTV9DTElQKSB8fCBkZWZpbmVkKENPTkZJR19BVE1fQ0xJUF9NT0RVTEUpCitFWFBPUlRfU1lNQk9MKGNsaXBfdGJsX2hvb2spOworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9kYXRhZ3JhbS5jIGIvbmV0L2lwdjQvZGF0YWdyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWRiNTYxCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvZGF0YWdyYW0uYwpAQCAtMCwwICsxLDczIEBACisvKgorICoJY29tbW9uIFVEUC9SQVcgY29kZQorICoJTGludXggSU5FVCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIEF1dGhvcnM6CisgKiAJSGlkZWFraSBZT1NISUZVSkkgPHlvc2hmdWppQGxpbnV4LWlwdjYub3JnPgorICoKKyAqIAlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIAlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIAkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvcm91dGUuaD4KKworaW50IGlwNF9kYXRhZ3JhbV9jb25uZWN0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwgaW50IGFkZHJfbGVuKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnVzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopIHVhZGRyOworCXN0cnVjdCBydGFibGUgKnJ0OworCXUzMiBzYWRkcjsKKwlpbnQgb2lmOworCWludCBlcnI7CisKKwkKKwlpZiAoYWRkcl9sZW4gPCBzaXplb2YoKnVzaW4pKSAKKwkgIAlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh1c2luLT5zaW5fZmFtaWx5ICE9IEFGX0lORVQpIAorCSAgCXJldHVybiAtRUFGTk9TVVBQT1JUOworCisJc2tfZHN0X3Jlc2V0KHNrKTsKKworCW9pZiA9IHNrLT5za19ib3VuZF9kZXZfaWY7CisJc2FkZHIgPSBpbmV0LT5zYWRkcjsKKwlpZiAoTVVMVElDQVNUKHVzaW4tPnNpbl9hZGRyLnNfYWRkcikpIHsKKwkJaWYgKCFvaWYpCisJCQlvaWYgPSBpbmV0LT5tY19pbmRleDsKKwkJaWYgKCFzYWRkcikKKwkJCXNhZGRyID0gaW5ldC0+bWNfYWRkcjsKKwl9CisJZXJyID0gaXBfcm91dGVfY29ubmVjdCgmcnQsIHVzaW4tPnNpbl9hZGRyLnNfYWRkciwgc2FkZHIsCisJCQkgICAgICAgUlRfQ09OTl9GTEFHUyhzayksIG9pZiwKKwkJCSAgICAgICBzay0+c2tfcHJvdG9jb2wsCisJCQkgICAgICAgaW5ldC0+c3BvcnQsIHVzaW4tPnNpbl9wb3J0LCBzayk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlpZiAoKHJ0LT5ydF9mbGFncyAmIFJUQ0ZfQlJPQURDQVNUKSAmJiAhc29ja19mbGFnKHNrLCBTT0NLX0JST0FEQ0FTVCkpIHsKKwkJaXBfcnRfcHV0KHJ0KTsKKwkJcmV0dXJuIC1FQUNDRVM7CisJfQorICAJaWYgKCFpbmV0LT5zYWRkcikKKwkgIAlpbmV0LT5zYWRkciA9IHJ0LT5ydF9zcmM7CS8qIFVwZGF0ZSBzb3VyY2UgYWRkcmVzcyAqLworCWlmICghaW5ldC0+cmN2X3NhZGRyKQorCQlpbmV0LT5yY3Zfc2FkZHIgPSBydC0+cnRfc3JjOworCWluZXQtPmRhZGRyID0gcnQtPnJ0X2RzdDsKKwlpbmV0LT5kcG9ydCA9IHVzaW4tPnNpbl9wb3J0OworCXNrLT5za19zdGF0ZSA9IFRDUF9FU1RBQkxJU0hFRDsKKwlpbmV0LT5pZCA9IGppZmZpZXM7CisKKwlza19kc3Rfc2V0KHNrLCAmcnQtPnUuZHN0KTsKKwlyZXR1cm4oMCk7Cit9CisKK0VYUE9SVF9TWU1CT0woaXA0X2RhdGFncmFtX2Nvbm5lY3QpOworCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9kZXZpbmV0LmMgYi9uZXQvaXB2NC9kZXZpbmV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhN2VmMAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L2RldmluZXQuYwpAQCAtMCwwICsxLDE1MDggQEAKKy8qCisgKglORVQzCUlQIGRldmljZSBzdXBwb3J0IHJvdXRpbmVzLgorICoKKyAqCVZlcnNpb246ICRJZDogZGV2aW5ldC5jLHYgMS40NCAyMDAxLzEwLzMxIDIxOjU1OjU0IGRhdmVtIEV4cCAkCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJRGVyaXZlZCBmcm9tIHRoZSBJUCBwYXJ0cyBvZiBkZXYuYyAxLjAuMTkKKyAqIAkJQXV0aG9yczoJUm9zcyBCaXJvLCA8YmlyN0BsZWxhbmQuU3RhbmZvcmQuRWR1PgorICoJCQkJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgkJCQlNYXJrIEV2YW5zLCA8ZXZhbnNtcEB1aHVyYS5hc3Rvbi5hYy51az4KKyAqCisgKglBZGRpdGlvbmFsIEF1dGhvcnM6CisgKgkJQWxhbiBDb3gsIDxndzRwdHNAZ3c0cHRzLmFtcHIub3JnPgorICoJCUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKglDaGFuZ2VzOgorICoJCUFsZXhleSBLdXpuZXRzb3Y6CXBhXyogZmllbGRzIGFyZSByZXBsYWNlZCB3aXRoIGlmYWRkcgorICoJCQkJCWxpc3RzLgorICoJCUN5cnVzIER1cmdpbjoJCXVwZGF0ZWQgZm9yIGttb2QKKyAqCQlNYXR0aGlhcyBBbmRyZWU6CWluIGRldmluZXRfaW9jdGwsIGNvbXBhcmUgbGFiZWwgYW5kCisgKgkJCQkJYWRkcmVzcyAoNC40QlNEIGFsaWFzIHN0eWxlIHN1cHBvcnQpLAorICoJCQkJCWZhbGwgYmFjayB0byBjb21wYXJpbmcganVzdCB0aGUgbGFiZWwKKyAqCQkJCQlpZiBubyBtYXRjaCBmb3VuZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lnbXAuaD4KKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisKKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvcm91dGUuaD4KKyNpbmNsdWRlIDxuZXQvaXBfZmliLmg+CisKK3N0cnVjdCBpcHY0X2RldmNvbmYgaXB2NF9kZXZjb25mID0geworCS5hY2NlcHRfcmVkaXJlY3RzID0gMSwKKwkuc2VuZF9yZWRpcmVjdHMgPSAgMSwKKwkuc2VjdXJlX3JlZGlyZWN0cyA9IDEsCisJLnNoYXJlZF9tZWRpYSA9CSAgMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXB2NF9kZXZjb25mIGlwdjRfZGV2Y29uZl9kZmx0ID0geworCS5hY2NlcHRfcmVkaXJlY3RzID0gIDEsCisJLnNlbmRfcmVkaXJlY3RzID0gICAgMSwKKwkuc2VjdXJlX3JlZGlyZWN0cyA9ICAxLAorCS5zaGFyZWRfbWVkaWEgPQkgICAgIDEsCisJLmFjY2VwdF9zb3VyY2Vfcm91dGUgPSAxLAorfTsKKworc3RhdGljIHZvaWQgcnRtc2dfaWZhKGludCBldmVudCwgc3RydWN0IGluX2lmYWRkciAqKTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayAqaW5ldGFkZHJfY2hhaW47CitzdGF0aWMgdm9pZCBpbmV0X2RlbF9pZmEoc3RydWN0IGluX2RldmljZSAqaW5fZGV2LCBzdHJ1Y3QgaW5faWZhZGRyICoqaWZhcCwKKwkJCSBpbnQgZGVzdHJveSk7CisjaWZkZWYgQ09ORklHX1NZU0NUTAorc3RhdGljIHZvaWQgZGV2aW5ldF9zeXNjdGxfcmVnaXN0ZXIoc3RydWN0IGluX2RldmljZSAqaW5fZGV2LAorCQkJCSAgICBzdHJ1Y3QgaXB2NF9kZXZjb25mICpwKTsKK3N0YXRpYyB2b2lkIGRldmluZXRfc3lzY3RsX3VucmVnaXN0ZXIoc3RydWN0IGlwdjRfZGV2Y29uZiAqcCk7CisjZW5kaWYKKworLyogTG9ja3MgYWxsIHRoZSBpbmV0IGRldmljZXMuICovCisKK3N0YXRpYyBzdHJ1Y3QgaW5faWZhZGRyICppbmV0X2FsbG9jX2lmYSh2b2lkKQoreworCXN0cnVjdCBpbl9pZmFkZHIgKmlmYSA9IGttYWxsb2Moc2l6ZW9mKCppZmEpLCBHRlBfS0VSTkVMKTsKKworCWlmIChpZmEpIHsKKwkJbWVtc2V0KGlmYSwgMCwgc2l6ZW9mKCppZmEpKTsKKwkJSU5JVF9SQ1VfSEVBRCgmaWZhLT5yY3VfaGVhZCk7CisJfQorCisJcmV0dXJuIGlmYTsKK30KKworc3RhdGljIHZvaWQgaW5ldF9yY3VfZnJlZV9pZmEoc3RydWN0IHJjdV9oZWFkICpoZWFkKQoreworCXN0cnVjdCBpbl9pZmFkZHIgKmlmYSA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgaW5faWZhZGRyLCByY3VfaGVhZCk7CisJaWYgKGlmYS0+aWZhX2RldikKKwkJaW5fZGV2X3B1dChpZmEtPmlmYV9kZXYpOworCWtmcmVlKGlmYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbmV0X2ZyZWVfaWZhKHN0cnVjdCBpbl9pZmFkZHIgKmlmYSkKK3sKKwljYWxsX3JjdSgmaWZhLT5yY3VfaGVhZCwgaW5ldF9yY3VfZnJlZV9pZmEpOworfQorCit2b2lkIGluX2Rldl9maW5pc2hfZGVzdHJveShzdHJ1Y3QgaW5fZGV2aWNlICppZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZGV2LT5kZXY7CisKKwlCVUdfVFJBUCghaWRldi0+aWZhX2xpc3QpOworCUJVR19UUkFQKCFpZGV2LT5tY19saXN0KTsKKyNpZmRlZiBORVRfUkVGQ05UX0RFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgImluX2Rldl9maW5pc2hfZGVzdHJveTogJXA9JXNcbiIsCisJICAgICAgIGlkZXYsIGRldiA/IGRldi0+bmFtZSA6ICJOSUwiKTsKKyNlbmRpZgorCWRldl9wdXQoZGV2KTsKKwlpZiAoIWlkZXYtPmRlYWQpCisJCXByaW50aygiRnJlZWluZyBhbGl2ZSBpbl9kZXZpY2UgJXBcbiIsIGlkZXYpOworCWVsc2UgeworCQlrZnJlZShpZGV2KTsKKwl9Cit9CisKK3N0cnVjdCBpbl9kZXZpY2UgKmluZXRkZXZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKworCUFTU0VSVF9SVE5MKCk7CisKKwlpbl9kZXYgPSBrbWFsbG9jKHNpemVvZigqaW5fZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbl9kZXYpCisJCWdvdG8gb3V0OworCW1lbXNldChpbl9kZXYsIDAsIHNpemVvZigqaW5fZGV2KSk7CisJSU5JVF9SQ1VfSEVBRCgmaW5fZGV2LT5yY3VfaGVhZCk7CisJbWVtY3B5KCZpbl9kZXYtPmNuZiwgJmlwdjRfZGV2Y29uZl9kZmx0LCBzaXplb2YoaW5fZGV2LT5jbmYpKTsKKwlpbl9kZXYtPmNuZi5zeXNjdGwgPSBOVUxMOworCWluX2Rldi0+ZGV2ID0gZGV2OworCWlmICgoaW5fZGV2LT5hcnBfcGFybXMgPSBuZWlnaF9wYXJtc19hbGxvYyhkZXYsICZhcnBfdGJsKSkgPT0gTlVMTCkKKwkJZ290byBvdXRfa2ZyZWU7CisJLyogUmVmZXJlbmNlIGluX2Rldi0+ZGV2ICovCisJZGV2X2hvbGQoZGV2KTsKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJbmVpZ2hfc3lzY3RsX3JlZ2lzdGVyKGRldiwgaW5fZGV2LT5hcnBfcGFybXMsIE5FVF9JUFY0LAorCQkJICAgICAgTkVUX0lQVjRfTkVJR0gsICJpcHY0IiwgTlVMTCwgTlVMTCk7CisjZW5kaWYKKworCS8qIEFjY291bnQgZm9yIHJlZmVyZW5jZSBkZXYtPmlwX3B0ciAqLworCWluX2Rldl9ob2xkKGluX2Rldik7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGRldi0+aXBfcHRyLCBpbl9kZXYpOworCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCWRldmluZXRfc3lzY3RsX3JlZ2lzdGVyKGluX2RldiwgJmluX2Rldi0+Y25mKTsKKyNlbmRpZgorCWlwX21jX2luaXRfZGV2KGluX2Rldik7CisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApCisJCWlwX21jX3VwKGluX2Rldik7CitvdXQ6CisJcmV0dXJuIGluX2RldjsKK291dF9rZnJlZToKKwlrZnJlZShpbl9kZXYpOworCWluX2RldiA9IE5VTEw7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyB2b2lkIGluX2Rldl9yY3VfcHV0KHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgaW5fZGV2aWNlICppZGV2ID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBpbl9kZXZpY2UsIHJjdV9oZWFkKTsKKwlpbl9kZXZfcHV0KGlkZXYpOworfQorCitzdGF0aWMgdm9pZCBpbmV0ZGV2X2Rlc3Ryb3koc3RydWN0IGluX2RldmljZSAqaW5fZGV2KQoreworCXN0cnVjdCBpbl9pZmFkZHIgKmlmYTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJQVNTRVJUX1JUTkwoKTsKKworCWRldiA9IGluX2Rldi0+ZGV2OworCWlmIChkZXYgPT0gJmxvb3BiYWNrX2RldikKKwkJcmV0dXJuOworCisJaW5fZGV2LT5kZWFkID0gMTsKKworCWlwX21jX2Rlc3Ryb3lfZGV2KGluX2Rldik7CisKKwl3aGlsZSAoKGlmYSA9IGluX2Rldi0+aWZhX2xpc3QpICE9IE5VTEwpIHsKKwkJaW5ldF9kZWxfaWZhKGluX2RldiwgJmluX2Rldi0+aWZhX2xpc3QsIDApOworCQlpbmV0X2ZyZWVfaWZhKGlmYSk7CisJfQorCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCWRldmluZXRfc3lzY3RsX3VucmVnaXN0ZXIoJmluX2Rldi0+Y25mKTsKKyNlbmRpZgorCisJZGV2LT5pcF9wdHIgPSBOVUxMOworCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCW5laWdoX3N5c2N0bF91bnJlZ2lzdGVyKGluX2Rldi0+YXJwX3Bhcm1zKTsKKyNlbmRpZgorCW5laWdoX3Bhcm1zX3JlbGVhc2UoJmFycF90YmwsIGluX2Rldi0+YXJwX3Bhcm1zKTsKKwlhcnBfaWZkb3duKGRldik7CisKKwljYWxsX3JjdSgmaW5fZGV2LT5yY3VfaGVhZCwgaW5fZGV2X3JjdV9wdXQpOworfQorCitpbnQgaW5ldF9hZGRyX29ubGluayhzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYsIHUzMiBhLCB1MzIgYikKK3sKKwlyY3VfcmVhZF9sb2NrKCk7CisJZm9yX3ByaW1hcnlfaWZhKGluX2RldikgeworCQlpZiAoaW5ldF9pZmFfbWF0Y2goYSwgaWZhKSkgeworCQkJaWYgKCFiIHx8IGluZXRfaWZhX21hdGNoKGIsIGlmYSkpIHsKKwkJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0gZW5kZm9yX2lmYShpbl9kZXYpOworCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbmV0X2RlbF9pZmEoc3RydWN0IGluX2RldmljZSAqaW5fZGV2LCBzdHJ1Y3QgaW5faWZhZGRyICoqaWZhcCwKKwkJCSBpbnQgZGVzdHJveSkKK3sKKwlzdHJ1Y3QgaW5faWZhZGRyICppZmExID0gKmlmYXA7CisKKwlBU1NFUlRfUlROTCgpOworCisJLyogMS4gRGVsZXRpbmcgcHJpbWFyeSBpZmFkZHIgZm9yY2VzIGRlbGV0aW9uIGFsbCBzZWNvbmRhcmllcyAqLworCisJaWYgKCEoaWZhMS0+aWZhX2ZsYWdzICYgSUZBX0ZfU0VDT05EQVJZKSkgeworCQlzdHJ1Y3QgaW5faWZhZGRyICppZmE7CisJCXN0cnVjdCBpbl9pZmFkZHIgKippZmFwMSA9ICZpZmExLT5pZmFfbmV4dDsKKworCQl3aGlsZSAoKGlmYSA9ICppZmFwMSkgIT0gTlVMTCkgeworCQkJaWYgKCEoaWZhLT5pZmFfZmxhZ3MgJiBJRkFfRl9TRUNPTkRBUlkpIHx8CisJCQkgICAgaWZhMS0+aWZhX21hc2sgIT0gaWZhLT5pZmFfbWFzayB8fAorCQkJICAgICFpbmV0X2lmYV9tYXRjaChpZmExLT5pZmFfYWRkcmVzcywgaWZhKSkgeworCQkJCWlmYXAxID0gJmlmYS0+aWZhX25leHQ7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCSppZmFwMSA9IGlmYS0+aWZhX25leHQ7CisKKwkJCXJ0bXNnX2lmYShSVE1fREVMQUREUiwgaWZhKTsKKwkJCW5vdGlmaWVyX2NhbGxfY2hhaW4oJmluZXRhZGRyX2NoYWluLCBORVRERVZfRE9XTiwgaWZhKTsKKwkJCWluZXRfZnJlZV9pZmEoaWZhKTsKKwkJfQorCX0KKworCS8qIDIuIFVubGluayBpdCAqLworCisJKmlmYXAgPSBpZmExLT5pZmFfbmV4dDsKKworCS8qIDMuIEFubm91bmNlIGFkZHJlc3MgZGVsZXRpb24gKi8KKworCS8qIFNlbmQgbWVzc2FnZSBmaXJzdCwgdGhlbiBjYWxsIG5vdGlmaWVyLgorCSAgIEF0IGZpcnN0IHNpZ2h0LCBGSUIgdXBkYXRlIHRyaWdnZXJlZCBieSBub3RpZmllcgorCSAgIHdpbGwgcmVmZXIgdG8gYWxyZWFkeSBkZWxldGVkIGlmYWRkciwgdGhhdCBjb3VsZCBjb25mdXNlCisJICAgbmV0bGluayBsaXN0ZW5lcnMuIEl0IGlzIG5vdCB0cnVlOiBsb29rLCBnYXRlZCBzZWVzCisJICAgdGhhdCByb3V0ZSBkZWxldGVkIGFuZCBpZiBpdCBzdGlsbCB0aGlua3MgdGhhdCBpZmFkZHIKKwkgICBpcyB2YWxpZCwgaXQgd2lsbCB0cnkgdG8gcmVzdG9yZSBkZWxldGVkIHJvdXRlcy4uLiBHcnIuCisJICAgU28gdGhhdCwgdGhpcyBvcmRlciBpcyBjb3JyZWN0LgorCSAqLworCXJ0bXNnX2lmYShSVE1fREVMQUREUiwgaWZhMSk7CisJbm90aWZpZXJfY2FsbF9jaGFpbigmaW5ldGFkZHJfY2hhaW4sIE5FVERFVl9ET1dOLCBpZmExKTsKKwlpZiAoZGVzdHJveSkgeworCQlpbmV0X2ZyZWVfaWZhKGlmYTEpOworCisJCWlmICghaW5fZGV2LT5pZmFfbGlzdCkKKwkJCWluZXRkZXZfZGVzdHJveShpbl9kZXYpOworCX0KK30KKworc3RhdGljIGludCBpbmV0X2luc2VydF9pZmEoc3RydWN0IGluX2lmYWRkciAqaWZhKQoreworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiA9IGlmYS0+aWZhX2RldjsKKwlzdHJ1Y3QgaW5faWZhZGRyICppZmExLCAqKmlmYXAsICoqbGFzdF9wcmltYXJ5OworCisJQVNTRVJUX1JUTkwoKTsKKworCWlmICghaWZhLT5pZmFfbG9jYWwpIHsKKwkJaW5ldF9mcmVlX2lmYShpZmEpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZmEtPmlmYV9mbGFncyAmPSB+SUZBX0ZfU0VDT05EQVJZOworCWxhc3RfcHJpbWFyeSA9ICZpbl9kZXYtPmlmYV9saXN0OworCisJZm9yIChpZmFwID0gJmluX2Rldi0+aWZhX2xpc3Q7IChpZmExID0gKmlmYXApICE9IE5VTEw7CisJICAgICBpZmFwID0gJmlmYTEtPmlmYV9uZXh0KSB7CisJCWlmICghKGlmYTEtPmlmYV9mbGFncyAmIElGQV9GX1NFQ09OREFSWSkgJiYKKwkJICAgIGlmYS0+aWZhX3Njb3BlIDw9IGlmYTEtPmlmYV9zY29wZSkKKwkJCWxhc3RfcHJpbWFyeSA9ICZpZmExLT5pZmFfbmV4dDsKKwkJaWYgKGlmYTEtPmlmYV9tYXNrID09IGlmYS0+aWZhX21hc2sgJiYKKwkJICAgIGluZXRfaWZhX21hdGNoKGlmYTEtPmlmYV9hZGRyZXNzLCBpZmEpKSB7CisJCQlpZiAoaWZhMS0+aWZhX2xvY2FsID09IGlmYS0+aWZhX2xvY2FsKSB7CisJCQkJaW5ldF9mcmVlX2lmYShpZmEpOworCQkJCXJldHVybiAtRUVYSVNUOworCQkJfQorCQkJaWYgKGlmYTEtPmlmYV9zY29wZSAhPSBpZmEtPmlmYV9zY29wZSkgeworCQkJCWluZXRfZnJlZV9pZmEoaWZhKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmYS0+aWZhX2ZsYWdzIHw9IElGQV9GX1NFQ09OREFSWTsKKwkJfQorCX0KKworCWlmICghKGlmYS0+aWZhX2ZsYWdzICYgSUZBX0ZfU0VDT05EQVJZKSkgeworCQluZXRfc3JhbmRvbShpZmEtPmlmYV9sb2NhbCk7CisJCWlmYXAgPSBsYXN0X3ByaW1hcnk7CisJfQorCisJaWZhLT5pZmFfbmV4dCA9ICppZmFwOworCSppZmFwID0gaWZhOworCisJLyogU2VuZCBtZXNzYWdlIGZpcnN0LCB0aGVuIGNhbGwgbm90aWZpZXIuCisJICAgTm90aWZpZXIgd2lsbCB0cmlnZ2VyIEZJQiB1cGRhdGUsIHNvIHRoYXQKKwkgICBsaXN0ZW5lcnMgb2YgbmV0bGluayB3aWxsIGtub3cgYWJvdXQgbmV3IGlmYWRkciAqLworCXJ0bXNnX2lmYShSVE1fTkVXQUREUiwgaWZhKTsKKwlub3RpZmllcl9jYWxsX2NoYWluKCZpbmV0YWRkcl9jaGFpbiwgTkVUREVWX1VQLCBpZmEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5ldF9zZXRfaWZhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpbl9pZmFkZHIgKmlmYSkKK3sKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBfX2luX2Rldl9nZXQoZGV2KTsKKworCUFTU0VSVF9SVE5MKCk7CisKKwlpZiAoIWluX2RldikgeworCQlpbl9kZXYgPSBpbmV0ZGV2X2luaXQoZGV2KTsKKwkJaWYgKCFpbl9kZXYpIHsKKwkJCWluZXRfZnJlZV9pZmEoaWZhKTsKKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCX0KKwlpZiAoaWZhLT5pZmFfZGV2ICE9IGluX2RldikgeworCQlCVUdfVFJBUCghaWZhLT5pZmFfZGV2KTsKKwkJaW5fZGV2X2hvbGQoaW5fZGV2KTsKKwkJaWZhLT5pZmFfZGV2ID0gaW5fZGV2OworCX0KKwlpZiAoTE9PUEJBQ0soaWZhLT5pZmFfbG9jYWwpKQorCQlpZmEtPmlmYV9zY29wZSA9IFJUX1NDT1BFX0hPU1Q7CisJcmV0dXJuIGluZXRfaW5zZXJ0X2lmYShpZmEpOworfQorCitzdHJ1Y3QgaW5fZGV2aWNlICppbmV0ZGV2X2J5X2luZGV4KGludCBpZmluZGV4KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gTlVMTDsKKwlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOworCWRldiA9IF9fZGV2X2dldF9ieV9pbmRleChpZmluZGV4KTsKKwlpZiAoZGV2KQorCQlpbl9kZXYgPSBpbl9kZXZfZ2V0KGRldik7CisJcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOworCXJldHVybiBpbl9kZXY7Cit9CisKKy8qIENhbGxlZCBvbmx5IGZyb20gUlROTCBzZW1hcGhvcmVkIGNvbnRleHQuIE5vIGxvY2tzLiAqLworCitzdHJ1Y3QgaW5faWZhZGRyICppbmV0X2lmYV9ieXByZWZpeChzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYsIHUzMiBwcmVmaXgsCisJCQkJICAgIHUzMiBtYXNrKQoreworCUFTU0VSVF9SVE5MKCk7CisKKwlmb3JfcHJpbWFyeV9pZmEoaW5fZGV2KSB7CisJCWlmIChpZmEtPmlmYV9tYXNrID09IG1hc2sgJiYgaW5ldF9pZmFfbWF0Y2gocHJlZml4LCBpZmEpKQorCQkJcmV0dXJuIGlmYTsKKwl9IGVuZGZvcl9pZmEoaW5fZGV2KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBpbmV0X3J0bV9kZWxhZGRyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpCit7CisJc3RydWN0IHJ0YXR0ciAqKnJ0YSA9IGFyZzsKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisJc3RydWN0IGlmYWRkcm1zZyAqaWZtID0gTkxNU0dfREFUQShubGgpOworCXN0cnVjdCBpbl9pZmFkZHIgKmlmYSwgKippZmFwOworCisJQVNTRVJUX1JUTkwoKTsKKworCWlmICgoaW5fZGV2ID0gaW5ldGRldl9ieV9pbmRleChpZm0tPmlmYV9pbmRleCkpID09IE5VTEwpCisJCWdvdG8gb3V0OworCV9faW5fZGV2X3B1dChpbl9kZXYpOworCisJZm9yIChpZmFwID0gJmluX2Rldi0+aWZhX2xpc3Q7IChpZmEgPSAqaWZhcCkgIT0gTlVMTDsKKwkgICAgIGlmYXAgPSAmaWZhLT5pZmFfbmV4dCkgeworCQlpZiAoKHJ0YVtJRkFfTE9DQUwgLSAxXSAmJgorCQkgICAgIG1lbWNtcChSVEFfREFUQShydGFbSUZBX0xPQ0FMIC0gMV0pLAorCQkJICAgICZpZmEtPmlmYV9sb2NhbCwgNCkpIHx8CisJCSAgICAocnRhW0lGQV9MQUJFTCAtIDFdICYmCisJCSAgICAgcnRhdHRyX3N0cmNtcChydGFbSUZBX0xBQkVMIC0gMV0sIGlmYS0+aWZhX2xhYmVsKSkgfHwKKwkJICAgIChydGFbSUZBX0FERFJFU1MgLSAxXSAmJgorCQkgICAgIChpZm0tPmlmYV9wcmVmaXhsZW4gIT0gaWZhLT5pZmFfcHJlZml4bGVuIHx8CisJCSAgICAgICFpbmV0X2lmYV9tYXRjaCgqKHUzMiopUlRBX0RBVEEocnRhW0lGQV9BRERSRVNTIC0gMV0pLAorCQkJICAgICAgCSAgICAgIGlmYSkpKSkKKwkJCWNvbnRpbnVlOworCQlpbmV0X2RlbF9pZmEoaW5fZGV2LCBpZmFwLCAxKTsKKwkJcmV0dXJuIDA7CisJfQorb3V0OgorCXJldHVybiAtRUFERFJOT1RBVkFJTDsKK30KKworc3RhdGljIGludCBpbmV0X3J0bV9uZXdhZGRyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpCit7CisJc3RydWN0IHJ0YXR0ciAqKnJ0YSA9IGFyZzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKwlzdHJ1Y3QgaWZhZGRybXNnICppZm0gPSBOTE1TR19EQVRBKG5saCk7CisJc3RydWN0IGluX2lmYWRkciAqaWZhOworCWludCByYyA9IC1FSU5WQUw7CisKKwlBU1NFUlRfUlROTCgpOworCisJaWYgKGlmbS0+aWZhX3ByZWZpeGxlbiA+IDMyIHx8ICFydGFbSUZBX0xPQ0FMIC0gMV0pCisJCWdvdG8gb3V0OworCisJcmMgPSAtRU5PREVWOworCWlmICgoZGV2ID0gX19kZXZfZ2V0X2J5X2luZGV4KGlmbS0+aWZhX2luZGV4KSkgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlyYyA9IC1FTk9CVUZTOworCWlmICgoaW5fZGV2ID0gX19pbl9kZXZfZ2V0KGRldikpID09IE5VTEwpIHsKKwkJaW5fZGV2ID0gaW5ldGRldl9pbml0KGRldik7CisJCWlmICghaW5fZGV2KQorCQkJZ290byBvdXQ7CisJfQorCisJaWYgKChpZmEgPSBpbmV0X2FsbG9jX2lmYSgpKSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWlmICghcnRhW0lGQV9BRERSRVNTIC0gMV0pCisJCXJ0YVtJRkFfQUREUkVTUyAtIDFdID0gcnRhW0lGQV9MT0NBTCAtIDFdOworCW1lbWNweSgmaWZhLT5pZmFfbG9jYWwsIFJUQV9EQVRBKHJ0YVtJRkFfTE9DQUwgLSAxXSksIDQpOworCW1lbWNweSgmaWZhLT5pZmFfYWRkcmVzcywgUlRBX0RBVEEocnRhW0lGQV9BRERSRVNTIC0gMV0pLCA0KTsKKwlpZmEtPmlmYV9wcmVmaXhsZW4gPSBpZm0tPmlmYV9wcmVmaXhsZW47CisJaWZhLT5pZmFfbWFzayA9IGluZXRfbWFrZV9tYXNrKGlmbS0+aWZhX3ByZWZpeGxlbik7CisJaWYgKHJ0YVtJRkFfQlJPQURDQVNUIC0gMV0pCisJCW1lbWNweSgmaWZhLT5pZmFfYnJvYWRjYXN0LAorCQkgICAgICAgUlRBX0RBVEEocnRhW0lGQV9CUk9BRENBU1QgLSAxXSksIDQpOworCWlmIChydGFbSUZBX0FOWUNBU1QgLSAxXSkKKwkJbWVtY3B5KCZpZmEtPmlmYV9hbnljYXN0LCBSVEFfREFUQShydGFbSUZBX0FOWUNBU1QgLSAxXSksIDQpOworCWlmYS0+aWZhX2ZsYWdzID0gaWZtLT5pZmFfZmxhZ3M7CisJaWZhLT5pZmFfc2NvcGUgPSBpZm0tPmlmYV9zY29wZTsKKwlpbl9kZXZfaG9sZChpbl9kZXYpOworCWlmYS0+aWZhX2RldiAgID0gaW5fZGV2OworCWlmIChydGFbSUZBX0xBQkVMIC0gMV0pCisJCXJ0YXR0cl9zdHJsY3B5KGlmYS0+aWZhX2xhYmVsLCBydGFbSUZBX0xBQkVMIC0gMV0sIElGTkFNU0laKTsKKwllbHNlCisJCW1lbWNweShpZmEtPmlmYV9sYWJlbCwgZGV2LT5uYW1lLCBJRk5BTVNJWik7CisKKwlyYyA9IGluZXRfaW5zZXJ0X2lmYShpZmEpOworb3V0OgorCXJldHVybiByYzsKK30KKworLyoKKyAqCURldGVybWluZSBhIGRlZmF1bHQgbmV0d29yayBtYXNrLCBiYXNlZCBvbiB0aGUgSVAgYWRkcmVzcy4KKyAqLworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgaW5ldF9hYmNfbGVuKHUzMiBhZGRyKQoreworCWludCByYyA9IC0xOwkvKiBTb21ldGhpbmcgZWxzZSwgcHJvYmFibHkgYSBtdWx0aWNhc3QuICovCisKKyAgCWlmIChaRVJPTkVUKGFkZHIpKQorICAJCXJjID0gMDsKKwllbHNlIHsKKwkJYWRkciA9IG50b2hsKGFkZHIpOworCisJCWlmIChJTl9DTEFTU0EoYWRkcikpCisJCQlyYyA9IDg7CisJCWVsc2UgaWYgKElOX0NMQVNTQihhZGRyKSkKKwkJCXJjID0gMTY7CisJCWVsc2UgaWYgKElOX0NMQVNTQyhhZGRyKSkKKwkJCXJjID0gMjQ7CisJfQorCisgIAlyZXR1cm4gcmM7Cit9CisKKworaW50IGRldmluZXRfaW9jdGwodW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW5fb3JpZzsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmaWZyLmlmcl9hZGRyOworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKwlzdHJ1Y3QgaW5faWZhZGRyICoqaWZhcCA9IE5VTEw7CisJc3RydWN0IGluX2lmYWRkciAqaWZhID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWNoYXIgKmNvbG9uOworCWludCByZXQgPSAtRUZBVUxUOworCWludCB0cnlhZGRybWF0Y2ggPSAwOworCisJLyoKKwkgKglGZXRjaCB0aGUgY2FsbGVyJ3MgaW5mbyBibG9jayBpbnRvIGtlcm5lbCBzcGFjZQorCSAqLworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZpZnIsIGFyZywgc2l6ZW9mKHN0cnVjdCBpZnJlcSkpKQorCQlnb3RvIG91dDsKKwlpZnIuaWZyX25hbWVbSUZOQU1TSVogLSAxXSA9IDA7CisKKwkvKiBzYXZlIG9yaWdpbmFsIGFkZHJlc3MgZm9yIGNvbXBhcmlzb24gKi8KKwltZW1jcHkoJnNpbl9vcmlnLCBzaW4sIHNpemVvZigqc2luKSk7CisKKwljb2xvbiA9IHN0cmNocihpZnIuaWZyX25hbWUsICc6Jyk7CisJaWYgKGNvbG9uKQorCQkqY29sb24gPSAwOworCisjaWZkZWYgQ09ORklHX0tNT0QKKwlkZXZfbG9hZChpZnIuaWZyX25hbWUpOworI2VuZGlmCisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBTSU9DR0lGQUREUjoJLyogR2V0IGludGVyZmFjZSBhZGRyZXNzICovCisJY2FzZSBTSU9DR0lGQlJEQUREUjoJLyogR2V0IHRoZSBicm9hZGNhc3QgYWRkcmVzcyAqLworCWNhc2UgU0lPQ0dJRkRTVEFERFI6CS8qIEdldCB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyAqLworCWNhc2UgU0lPQ0dJRk5FVE1BU0s6CS8qIEdldCB0aGUgbmV0bWFzayBmb3IgdGhlIGludGVyZmFjZSAqLworCQkvKiBOb3RlIHRoYXQgdGhlc2UgaW9jdGxzIHdpbGwgbm90IHNsZWVwLAorCQkgICBzbyB0aGF0IHdlIGRvIG5vdCBpbXBvc2UgYSBsb2NrLgorCQkgICBPbmUgZGF5IHdlIHdpbGwgYmUgZm9yY2VkIHRvIHB1dCBzaGxvY2sgaGVyZSAoSSBtZWFuIFNNUCkKKwkJICovCisJCXRyeWFkZHJtYXRjaCA9IChzaW5fb3JpZy5zaW5fZmFtaWx5ID09IEFGX0lORVQpOworCQltZW1zZXQoc2luLCAwLCBzaXplb2YoKnNpbikpOworCQlzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQlicmVhazsKKworCWNhc2UgU0lPQ1NJRkZMQUdTOgorCQlyZXQgPSAtRUFDQ0VTOworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlnb3RvIG91dDsKKwkJYnJlYWs7CisJY2FzZSBTSU9DU0lGQUREUjoJLyogU2V0IGludGVyZmFjZSBhZGRyZXNzIChhbmQgZmFtaWx5KSAqLworCWNhc2UgU0lPQ1NJRkJSREFERFI6CS8qIFNldCB0aGUgYnJvYWRjYXN0IGFkZHJlc3MgKi8KKwljYXNlIFNJT0NTSUZEU1RBRERSOgkvKiBTZXQgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwljYXNlIFNJT0NTSUZORVRNQVNLOiAJLyogU2V0IHRoZSBuZXRtYXNrIGZvciB0aGUgaW50ZXJmYWNlICovCisJCXJldCA9IC1FQUNDRVM7CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCWdvdG8gb3V0OworCQlyZXQgPSAtRUlOVkFMOworCQlpZiAoc2luLT5zaW5fZmFtaWx5ICE9IEFGX0lORVQpCisJCQlnb3RvIG91dDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJcnRubF9sb2NrKCk7CisKKwlyZXQgPSAtRU5PREVWOworCWlmICgoZGV2ID0gX19kZXZfZ2V0X2J5X25hbWUoaWZyLmlmcl9uYW1lKSkgPT0gTlVMTCkKKwkJZ290byBkb25lOworCisJaWYgKGNvbG9uKQorCQkqY29sb24gPSAnOic7CisKKwlpZiAoKGluX2RldiA9IF9faW5fZGV2X2dldChkZXYpKSAhPSBOVUxMKSB7CisJCWlmICh0cnlhZGRybWF0Y2gpIHsKKwkJCS8qIE1hdHRoaWFzIEFuZHJlZSAqLworCQkJLyogY29tcGFyZSBsYWJlbCBhbmQgYWRkcmVzcyAoNC40QlNEIHN0eWxlKSAqLworCQkJLyogbm90ZTogd2Ugb25seSBkbyB0aGlzIGZvciBhIGxpbWl0ZWQgc2V0IG9mIGlvY3RscworCQkJICAgYW5kIG9ubHkgaWYgdGhlIG9yaWdpbmFsIGFkZHJlc3MgZmFtaWx5IHdhcyBBRl9JTkVULgorCQkJICAgVGhpcyBpcyBjaGVja2VkIGFib3ZlLiAqLworCQkJZm9yIChpZmFwID0gJmluX2Rldi0+aWZhX2xpc3Q7IChpZmEgPSAqaWZhcCkgIT0gTlVMTDsKKwkJCSAgICAgaWZhcCA9ICZpZmEtPmlmYV9uZXh0KSB7CisJCQkJaWYgKCFzdHJjbXAoaWZyLmlmcl9uYW1lLCBpZmEtPmlmYV9sYWJlbCkgJiYKKwkJCQkgICAgc2luX29yaWcuc2luX2FkZHIuc19hZGRyID09CisJCQkJCQkJaWZhLT5pZmFfYWRkcmVzcykgeworCQkJCQlicmVhazsgLyogZm91bmQgKi8KKwkJCQl9CisJCQl9CisJCX0KKwkJLyogd2UgZGlkbid0IGdldCBhIG1hdGNoLCBtYXliZSB0aGUgYXBwbGljYXRpb24gaXMKKwkJICAgNC4zQlNELXN0eWxlIGFuZCBwYXNzZWQgaW4ganVuayBzbyB3ZSBmYWxsIGJhY2sgdG8KKwkJICAgY29tcGFyaW5nIGp1c3QgdGhlIGxhYmVsICovCisJCWlmICghaWZhKSB7CisJCQlmb3IgKGlmYXAgPSAmaW5fZGV2LT5pZmFfbGlzdDsgKGlmYSA9ICppZmFwKSAhPSBOVUxMOworCQkJICAgICBpZmFwID0gJmlmYS0+aWZhX25leHQpCisJCQkJaWYgKCFzdHJjbXAoaWZyLmlmcl9uYW1lLCBpZmEtPmlmYV9sYWJlbCkpCisJCQkJCWJyZWFrOworCQl9CisJfQorCisJcmV0ID0gLUVBRERSTk9UQVZBSUw7CisJaWYgKCFpZmEgJiYgY21kICE9IFNJT0NTSUZBRERSICYmIGNtZCAhPSBTSU9DU0lGRkxBR1MpCisJCWdvdG8gZG9uZTsKKworCXN3aXRjaChjbWQpIHsKKwljYXNlIFNJT0NHSUZBRERSOgkvKiBHZXQgaW50ZXJmYWNlIGFkZHJlc3MgKi8KKwkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSBpZmEtPmlmYV9sb2NhbDsKKwkJZ290byByYXJvazsKKworCWNhc2UgU0lPQ0dJRkJSREFERFI6CS8qIEdldCB0aGUgYnJvYWRjYXN0IGFkZHJlc3MgKi8KKwkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSBpZmEtPmlmYV9icm9hZGNhc3Q7CisJCWdvdG8gcmFyb2s7CisKKwljYXNlIFNJT0NHSUZEU1RBRERSOgkvKiBHZXQgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSBpZmEtPmlmYV9hZGRyZXNzOworCQlnb3RvIHJhcm9rOworCisJY2FzZSBTSU9DR0lGTkVUTUFTSzoJLyogR2V0IHRoZSBuZXRtYXNrIGZvciB0aGUgaW50ZXJmYWNlICovCisJCXNpbi0+c2luX2FkZHIuc19hZGRyID0gaWZhLT5pZmFfbWFzazsKKwkJZ290byByYXJvazsKKworCWNhc2UgU0lPQ1NJRkZMQUdTOgorCQlpZiAoY29sb24pIHsKKwkJCXJldCA9IC1FQUREUk5PVEFWQUlMOworCQkJaWYgKCFpZmEpCisJCQkJYnJlYWs7CisJCQlyZXQgPSAwOworCQkJaWYgKCEoaWZyLmlmcl9mbGFncyAmIElGRl9VUCkpCisJCQkJaW5ldF9kZWxfaWZhKGluX2RldiwgaWZhcCwgMSk7CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSBkZXZfY2hhbmdlX2ZsYWdzKGRldiwgaWZyLmlmcl9mbGFncyk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0lGQUREUjoJLyogU2V0IGludGVyZmFjZSBhZGRyZXNzIChhbmQgZmFtaWx5KSAqLworCQlyZXQgPSAtRUlOVkFMOworCQlpZiAoaW5ldF9hYmNfbGVuKHNpbi0+c2luX2FkZHIuc19hZGRyKSA8IDApCisJCQlicmVhazsKKworCQlpZiAoIWlmYSkgeworCQkJcmV0ID0gLUVOT0JVRlM7CisJCQlpZiAoKGlmYSA9IGluZXRfYWxsb2NfaWZhKCkpID09IE5VTEwpCisJCQkJYnJlYWs7CisJCQlpZiAoY29sb24pCisJCQkJbWVtY3B5KGlmYS0+aWZhX2xhYmVsLCBpZnIuaWZyX25hbWUsIElGTkFNU0laKTsKKwkJCWVsc2UKKwkJCQltZW1jcHkoaWZhLT5pZmFfbGFiZWwsIGRldi0+bmFtZSwgSUZOQU1TSVopOworCQl9IGVsc2UgeworCQkJcmV0ID0gMDsKKwkJCWlmIChpZmEtPmlmYV9sb2NhbCA9PSBzaW4tPnNpbl9hZGRyLnNfYWRkcikKKwkJCQlicmVhazsKKwkJCWluZXRfZGVsX2lmYShpbl9kZXYsIGlmYXAsIDApOworCQkJaWZhLT5pZmFfYnJvYWRjYXN0ID0gMDsKKwkJCWlmYS0+aWZhX2FueWNhc3QgPSAwOworCQl9CisKKwkJaWZhLT5pZmFfYWRkcmVzcyA9IGlmYS0+aWZhX2xvY2FsID0gc2luLT5zaW5fYWRkci5zX2FkZHI7CisKKwkJaWYgKCEoZGV2LT5mbGFncyAmIElGRl9QT0lOVE9QT0lOVCkpIHsKKwkJCWlmYS0+aWZhX3ByZWZpeGxlbiA9IGluZXRfYWJjX2xlbihpZmEtPmlmYV9hZGRyZXNzKTsKKwkJCWlmYS0+aWZhX21hc2sgPSBpbmV0X21ha2VfbWFzayhpZmEtPmlmYV9wcmVmaXhsZW4pOworCQkJaWYgKChkZXYtPmZsYWdzICYgSUZGX0JST0FEQ0FTVCkgJiYKKwkJCSAgICBpZmEtPmlmYV9wcmVmaXhsZW4gPCAzMSkKKwkJCQlpZmEtPmlmYV9icm9hZGNhc3QgPSBpZmEtPmlmYV9hZGRyZXNzIHwKKwkJCQkJCSAgICAgfmlmYS0+aWZhX21hc2s7CisJCX0gZWxzZSB7CisJCQlpZmEtPmlmYV9wcmVmaXhsZW4gPSAzMjsKKwkJCWlmYS0+aWZhX21hc2sgPSBpbmV0X21ha2VfbWFzaygzMik7CisJCX0KKwkJcmV0ID0gaW5ldF9zZXRfaWZhKGRldiwgaWZhKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTSUZCUkRBRERSOgkvKiBTZXQgdGhlIGJyb2FkY2FzdCBhZGRyZXNzICovCisJCXJldCA9IDA7CisJCWlmIChpZmEtPmlmYV9icm9hZGNhc3QgIT0gc2luLT5zaW5fYWRkci5zX2FkZHIpIHsKKwkJCWluZXRfZGVsX2lmYShpbl9kZXYsIGlmYXAsIDApOworCQkJaWZhLT5pZmFfYnJvYWRjYXN0ID0gc2luLT5zaW5fYWRkci5zX2FkZHI7CisJCQlpbmV0X2luc2VydF9pZmEoaWZhKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0lPQ1NJRkRTVEFERFI6CS8qIFNldCB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyAqLworCQlyZXQgPSAwOworCQlpZiAoaWZhLT5pZmFfYWRkcmVzcyA9PSBzaW4tPnNpbl9hZGRyLnNfYWRkcikKKwkJCWJyZWFrOworCQlyZXQgPSAtRUlOVkFMOworCQlpZiAoaW5ldF9hYmNfbGVuKHNpbi0+c2luX2FkZHIuc19hZGRyKSA8IDApCisJCQlicmVhazsKKwkJcmV0ID0gMDsKKwkJaW5ldF9kZWxfaWZhKGluX2RldiwgaWZhcCwgMCk7CisJCWlmYS0+aWZhX2FkZHJlc3MgPSBzaW4tPnNpbl9hZGRyLnNfYWRkcjsKKwkJaW5ldF9pbnNlcnRfaWZhKGlmYSk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0lGTkVUTUFTSzogCS8qIFNldCB0aGUgbmV0bWFzayBmb3IgdGhlIGludGVyZmFjZSAqLworCisJCS8qCisJCSAqCVRoZSBtYXNrIHdlIHNldCBtdXN0IGJlIGxlZ2FsLgorCQkgKi8KKwkJcmV0ID0gLUVJTlZBTDsKKwkJaWYgKGJhZF9tYXNrKHNpbi0+c2luX2FkZHIuc19hZGRyLCAwKSkKKwkJCWJyZWFrOworCQlyZXQgPSAwOworCQlpZiAoaWZhLT5pZmFfbWFzayAhPSBzaW4tPnNpbl9hZGRyLnNfYWRkcikgeworCQkJaW5ldF9kZWxfaWZhKGluX2RldiwgaWZhcCwgMCk7CisJCQlpZmEtPmlmYV9tYXNrID0gc2luLT5zaW5fYWRkci5zX2FkZHI7CisJCQlpZmEtPmlmYV9wcmVmaXhsZW4gPSBpbmV0X21hc2tfbGVuKGlmYS0+aWZhX21hc2spOworCisJCQkvKiBTZWUgaWYgY3VycmVudCBicm9hZGNhc3QgYWRkcmVzcyBtYXRjaGVzCisJCQkgKiB3aXRoIGN1cnJlbnQgbmV0bWFzaywgdGhlbiByZWNhbGN1bGF0ZQorCQkJICogdGhlIGJyb2FkY2FzdCBhZGRyZXNzLiBPdGhlcndpc2UgaXQncyBhCisJCQkgKiBmdW5ueSBhZGRyZXNzLCBzbyBkb24ndCB0b3VjaCBpdCBzaW5jZQorCQkJICogdGhlIHVzZXIgc2VlbXMgdG8ga25vdyB3aGF0IChzKWhlJ3MgZG9pbmcuLi4KKwkJCSAqLworCQkJaWYgKChkZXYtPmZsYWdzICYgSUZGX0JST0FEQ0FTVCkgJiYKKwkJCSAgICAoaWZhLT5pZmFfcHJlZml4bGVuIDwgMzEpICYmCisJCQkgICAgKGlmYS0+aWZhX2Jyb2FkY2FzdCA9PQorCQkJICAgICAoaWZhLT5pZmFfbG9jYWx8fmlmYS0+aWZhX21hc2spKSkgeworCQkJCWlmYS0+aWZhX2Jyb2FkY2FzdCA9IChpZmEtPmlmYV9sb2NhbCB8CisJCQkJCQkgICAgICB+c2luLT5zaW5fYWRkci5zX2FkZHIpOworCQkJfQorCQkJaW5ldF9pbnNlcnRfaWZhKGlmYSk7CisJCX0KKwkJYnJlYWs7CisJfQorZG9uZToKKwlydG5sX3VubG9jaygpOworb3V0OgorCXJldHVybiByZXQ7CityYXJvazoKKwlydG5sX3VubG9jaygpOworCXJldCA9IGNvcHlfdG9fdXNlcihhcmcsICZpZnIsIHNpemVvZihzdHJ1Y3QgaWZyZXEpKSA/IC1FRkFVTFQgOiAwOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50IGluZXRfZ2lmY29uZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiA9IF9faW5fZGV2X2dldChkZXYpOworCXN0cnVjdCBpbl9pZmFkZHIgKmlmYTsKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCBkb25lID0gMDsKKworCWlmICghaW5fZGV2IHx8IChpZmEgPSBpbl9kZXYtPmlmYV9saXN0KSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWZvciAoOyBpZmE7IGlmYSA9IGlmYS0+aWZhX25leHQpIHsKKwkJaWYgKCFidWYpIHsKKwkJCWRvbmUgKz0gc2l6ZW9mKGlmcik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobGVuIDwgKGludCkgc2l6ZW9mKGlmcikpCisJCQlicmVhazsKKwkJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihzdHJ1Y3QgaWZyZXEpKTsKKwkJaWYgKGlmYS0+aWZhX2xhYmVsKQorCQkJc3RyY3B5KGlmci5pZnJfbmFtZSwgaWZhLT5pZmFfbGFiZWwpOworCQllbHNlCisJCQlzdHJjcHkoaWZyLmlmcl9uYW1lLCBkZXYtPm5hbWUpOworCisJCSgqKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZpZnIuaWZyX2FkZHIpLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQkoKihzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmaWZyLmlmcl9hZGRyKS5zaW5fYWRkci5zX2FkZHIgPQorCQkJCQkJCQlpZmEtPmlmYV9sb2NhbDsKKworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgJmlmciwgc2l6ZW9mKHN0cnVjdCBpZnJlcSkpKSB7CisJCQlkb25lID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWJ1ZiAgKz0gc2l6ZW9mKHN0cnVjdCBpZnJlcSk7CisJCWxlbiAgLT0gc2l6ZW9mKHN0cnVjdCBpZnJlcSk7CisJCWRvbmUgKz0gc2l6ZW9mKHN0cnVjdCBpZnJlcSk7CisJfQorb3V0OgorCXJldHVybiBkb25lOworfQorCit1MzIgaW5ldF9zZWxlY3RfYWRkcihjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZHN0LCBpbnQgc2NvcGUpCit7CisJdTMyIGFkZHIgPSAwOworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlpbl9kZXYgPSBfX2luX2Rldl9nZXQoZGV2KTsKKwlpZiAoIWluX2RldikKKwkJZ290byBub19pbl9kZXY7CisKKwlmb3JfcHJpbWFyeV9pZmEoaW5fZGV2KSB7CisJCWlmIChpZmEtPmlmYV9zY29wZSA+IHNjb3BlKQorCQkJY29udGludWU7CisJCWlmICghZHN0IHx8IGluZXRfaWZhX21hdGNoKGRzdCwgaWZhKSkgeworCQkJYWRkciA9IGlmYS0+aWZhX2xvY2FsOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFhZGRyKQorCQkJYWRkciA9IGlmYS0+aWZhX2xvY2FsOworCX0gZW5kZm9yX2lmYShpbl9kZXYpOworbm9faW5fZGV2OgorCXJjdV9yZWFkX3VubG9jaygpOworCisJaWYgKGFkZHIpCisJCWdvdG8gb3V0OworCisJLyogTm90IGxvb3BiYWNrIGFkZHJlc3NlcyBvbiBsb29wYmFjayBzaG91bGQgYmUgcHJlZmVycmVkCisJICAgaW4gdGhpcyBjYXNlLiBJdCBpcyBpbXBvcnRuYXQgdGhhdCBsbyBpcyB0aGUgZmlyc3QgaW50ZXJmYWNlCisJICAgaW4gZGV2X2Jhc2UgbGlzdC4KKwkgKi8KKwlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOworCXJjdV9yZWFkX2xvY2soKTsKKwlmb3IgKGRldiA9IGRldl9iYXNlOyBkZXY7IGRldiA9IGRldi0+bmV4dCkgeworCQlpZiAoKGluX2RldiA9IF9faW5fZGV2X2dldChkZXYpKSA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJZm9yX3ByaW1hcnlfaWZhKGluX2RldikgeworCQkJaWYgKGlmYS0+aWZhX3Njb3BlICE9IFJUX1NDT1BFX0xJTksgJiYKKwkJCSAgICBpZmEtPmlmYV9zY29wZSA8PSBzY29wZSkgeworCQkJCWFkZHIgPSBpZmEtPmlmYV9sb2NhbDsKKwkJCQlnb3RvIG91dF91bmxvY2tfYm90aDsKKwkJCX0KKwkJfSBlbmRmb3JfaWZhKGluX2Rldik7CisJfQorb3V0X3VubG9ja19ib3RoOgorCXJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKK291dDoKKwlyZXR1cm4gYWRkcjsKK30KKworc3RhdGljIHUzMiBjb25maXJtX2FkZHJfaW5kZXYoc3RydWN0IGluX2RldmljZSAqaW5fZGV2LCB1MzIgZHN0LAorCQkJICAgICAgdTMyIGxvY2FsLCBpbnQgc2NvcGUpCit7CisJaW50IHNhbWUgPSAwOworCXUzMiBhZGRyID0gMDsKKworCWZvcl9pZmEoaW5fZGV2KSB7CisJCWlmICghYWRkciAmJgorCQkgICAgKGxvY2FsID09IGlmYS0+aWZhX2xvY2FsIHx8ICFsb2NhbCkgJiYKKwkJICAgIGlmYS0+aWZhX3Njb3BlIDw9IHNjb3BlKSB7CisJCQlhZGRyID0gaWZhLT5pZmFfbG9jYWw7CisJCQlpZiAoc2FtZSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoIXNhbWUpIHsKKwkJCXNhbWUgPSAoIWxvY2FsIHx8IGluZXRfaWZhX21hdGNoKGxvY2FsLCBpZmEpKSAmJgorCQkJCSghZHN0IHx8IGluZXRfaWZhX21hdGNoKGRzdCwgaWZhKSk7CisJCQlpZiAoc2FtZSAmJiBhZGRyKSB7CisJCQkJaWYgKGxvY2FsIHx8ICFkc3QpCisJCQkJCWJyZWFrOworCQkJCS8qIElzIHRoZSBzZWxlY3RlZCBhZGRyIGludG8gZHN0IHN1Ym5ldD8gKi8KKwkJCQlpZiAoaW5ldF9pZmFfbWF0Y2goYWRkciwgaWZhKSkKKwkJCQkJYnJlYWs7CisJCQkJLyogTm8sIHRoZW4gY2FuIHdlIHVzZSBuZXcgbG9jYWwgc3JjPyAqLworCQkJCWlmIChpZmEtPmlmYV9zY29wZSA8PSBzY29wZSkgeworCQkJCQlhZGRyID0gaWZhLT5pZmFfbG9jYWw7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKiBzZWFyY2ggZm9yIGxhcmdlIGRzdCBzdWJuZXQgZm9yIGFkZHIgKi8KKwkJCQlzYW1lID0gMDsKKwkJCX0KKwkJfQorCX0gZW5kZm9yX2lmYShpbl9kZXYpOworCisJcmV0dXJuIHNhbWU/IGFkZHIgOiAwOworfQorCisvKgorICogQ29uZmlybSB0aGF0IGxvY2FsIElQIGFkZHJlc3MgZXhpc3RzIHVzaW5nIHdpbGRjYXJkczoKKyAqIC0gZGV2OiBvbmx5IG9uIHRoaXMgaW50ZXJmYWNlLCAwPWFueSBpbnRlcmZhY2UKKyAqIC0gZHN0OiBvbmx5IGluIHRoZSBzYW1lIHN1Ym5ldCBhcyBkc3QsIDA9YW55IGRzdAorICogLSBsb2NhbDogYWRkcmVzcywgMD1hdXRvc2VsZWN0IHRoZSBsb2NhbCBhZGRyZXNzCisgKiAtIHNjb3BlOiBtYXhpbXVtIGFsbG93ZWQgc2NvcGUgdmFsdWUgZm9yIHRoZSBsb2NhbCBhZGRyZXNzCisgKi8KK3UzMiBpbmV0X2NvbmZpcm1fYWRkcihjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZHN0LCB1MzIgbG9jYWwsIGludCBzY29wZSkKK3sKKwl1MzIgYWRkciA9IDA7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCisJaWYgKGRldikgeworCQlyY3VfcmVhZF9sb2NrKCk7CisJCWlmICgoaW5fZGV2ID0gX19pbl9kZXZfZ2V0KGRldikpKQorCQkJYWRkciA9IGNvbmZpcm1fYWRkcl9pbmRldihpbl9kZXYsIGRzdCwgbG9jYWwsIHNjb3BlKTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkJcmV0dXJuIGFkZHI7CisJfQorCisJcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKwlyY3VfcmVhZF9sb2NrKCk7CisJZm9yIChkZXYgPSBkZXZfYmFzZTsgZGV2OyBkZXYgPSBkZXYtPm5leHQpIHsKKwkJaWYgKChpbl9kZXYgPSBfX2luX2Rldl9nZXQoZGV2KSkpIHsKKwkJCWFkZHIgPSBjb25maXJtX2FkZHJfaW5kZXYoaW5fZGV2LCBkc3QsIGxvY2FsLCBzY29wZSk7CisJCQlpZiAoYWRkcikKKwkJCQlicmVhazsKKwkJfQorCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7CisKKwlyZXR1cm4gYWRkcjsKK30KKworLyoKKyAqCURldmljZSBub3RpZmllcgorICovCisKK2ludCByZWdpc3Rlcl9pbmV0YWRkcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCXJldHVybiBub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmaW5ldGFkZHJfY2hhaW4sIG5iKTsKK30KKworaW50IHVucmVnaXN0ZXJfaW5ldGFkZHJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmaW5ldGFkZHJfY2hhaW4sIG5iKTsKK30KKworLyogUmVuYW1lIGlmYV9sYWJlbHMgZm9yIGEgZGV2aWNlIG5hbWUgY2hhbmdlLiBNYWtlIHNvbWUgZWZmb3J0IHRvIHByZXNlcnZlIGV4aXN0aW5nCisgKiBhbGlhcyBudW1iZXJpbmcgYW5kIHRvIGNyZWF0ZSB1bmlxdWUgbGFiZWxzIGlmIHBvc3NpYmxlLgorKi8KK3N0YXRpYyB2b2lkIGluZXRkZXZfY2hhbmdlbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYpCit7IAorCXN0cnVjdCBpbl9pZmFkZHIgKmlmYTsKKwlpbnQgbmFtZWQgPSAwOworCisJZm9yIChpZmEgPSBpbl9kZXYtPmlmYV9saXN0OyBpZmE7IGlmYSA9IGlmYS0+aWZhX25leHQpIHsgCisJCWNoYXIgb2xkW0lGTkFNU0laXSwgKmRvdDsgCisKKwkJbWVtY3B5KG9sZCwgaWZhLT5pZmFfbGFiZWwsIElGTkFNU0laKTsKKwkJbWVtY3B5KGlmYS0+aWZhX2xhYmVsLCBkZXYtPm5hbWUsIElGTkFNU0laKTsgCisJCWlmIChuYW1lZCsrID09IDApCisJCQljb250aW51ZTsKKwkJZG90ID0gc3RyY2hyKGlmYS0+aWZhX2xhYmVsLCAnOicpOworCQlpZiAoZG90ID09IE5VTEwpIHsgCisJCQlzcHJpbnRmKG9sZCwgIjolZCIsIG5hbWVkKTsgCisJCQlkb3QgPSBvbGQ7CisJCX0KKwkJaWYgKHN0cmxlbihkb3QpICsgc3RybGVuKGRldi0+bmFtZSkgPCBJRk5BTVNJWikgeyAKKwkJCXN0cmNhdChpZmEtPmlmYV9sYWJlbCwgZG90KTsgCisJCX0gZWxzZSB7IAorCQkJc3RyY3B5KGlmYS0+aWZhX2xhYmVsICsgKElGTkFNU0laIC0gc3RybGVuKGRvdCkgLSAxKSwgZG90KTsgCisJCX0gCisJfQkKK30gCisKKy8qIENhbGxlZCBvbmx5IHVuZGVyIFJUTkwgc2VtYXBob3JlICovCisKK3N0YXRpYyBpbnQgaW5ldGRldl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsCisJCQkgdm9pZCAqcHRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwdHI7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gX19pbl9kZXZfZ2V0KGRldik7CisKKwlBU1NFUlRfUlROTCgpOworCisJaWYgKCFpbl9kZXYpIHsKKwkJaWYgKGV2ZW50ID09IE5FVERFVl9SRUdJU1RFUiAmJiBkZXYgPT0gJmxvb3BiYWNrX2RldikgeworCQkJaW5fZGV2ID0gaW5ldGRldl9pbml0KGRldik7CisJCQlpZiAoIWluX2RldikKKwkJCQlwYW5pYygiZGV2aW5ldDogRmFpbGVkIHRvIGNyZWF0ZSBsb29wYmFja1xuIik7CisJCQlpbl9kZXYtPmNuZi5ub194ZnJtID0gMTsKKwkJCWluX2Rldi0+Y25mLm5vX3BvbGljeSA9IDE7CisJCX0KKwkJZ290byBvdXQ7CisJfQorCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX1JFR0lTVEVSOgorCQlwcmludGsoS0VSTl9ERUJVRyAiaW5ldGRldl9ldmVudDogYnVnXG4iKTsKKwkJZGV2LT5pcF9wdHIgPSBOVUxMOworCQlicmVhazsKKwljYXNlIE5FVERFVl9VUDoKKwkJaWYgKGRldi0+bXR1IDwgNjgpCisJCQlicmVhazsKKwkJaWYgKGRldiA9PSAmbG9vcGJhY2tfZGV2KSB7CisJCQlzdHJ1Y3QgaW5faWZhZGRyICppZmE7CisJCQlpZiAoKGlmYSA9IGluZXRfYWxsb2NfaWZhKCkpICE9IE5VTEwpIHsKKwkJCQlpZmEtPmlmYV9sb2NhbCA9CisJCQkJICBpZmEtPmlmYV9hZGRyZXNzID0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKTsKKwkJCQlpZmEtPmlmYV9wcmVmaXhsZW4gPSA4OworCQkJCWlmYS0+aWZhX21hc2sgPSBpbmV0X21ha2VfbWFzayg4KTsKKwkJCQlpbl9kZXZfaG9sZChpbl9kZXYpOworCQkJCWlmYS0+aWZhX2RldiA9IGluX2RldjsKKwkJCQlpZmEtPmlmYV9zY29wZSA9IFJUX1NDT1BFX0hPU1Q7CisJCQkJbWVtY3B5KGlmYS0+aWZhX2xhYmVsLCBkZXYtPm5hbWUsIElGTkFNU0laKTsKKwkJCQlpbmV0X2luc2VydF9pZmEoaWZhKTsKKwkJCX0KKwkJfQorCQlpcF9tY191cChpbl9kZXYpOworCQlicmVhazsKKwljYXNlIE5FVERFVl9ET1dOOgorCQlpcF9tY19kb3duKGluX2Rldik7CisJCWJyZWFrOworCWNhc2UgTkVUREVWX0NIQU5HRU1UVToKKwkJaWYgKGRldi0+bXR1ID49IDY4KQorCQkJYnJlYWs7CisJCS8qIE1UVSBmYWxsZWQgdW5kZXIgNjgsIGRpc2FibGUgSVAgKi8KKwljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgorCQlpbmV0ZGV2X2Rlc3Ryb3koaW5fZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfQ0hBTkdFTkFNRToKKwkJLyogRG8gbm90IG5vdGlmeSBhYm91dCBsYWJlbCBjaGFuZ2UsIHRoaXMgZXZlbnQgaXMKKwkJICogbm90IGludGVyZXN0aW5nIHRvIGFwcGxpY2F0aW9ucyB1c2luZyBuZXRsaW5rLgorCQkgKi8KKwkJaW5ldGRldl9jaGFuZ2VuYW1lKGRldiwgaW5fZGV2KTsKKworI2lmZGVmIENPTkZJR19TWVNDVEwKKwkJZGV2aW5ldF9zeXNjdGxfdW5yZWdpc3RlcigmaW5fZGV2LT5jbmYpOworCQluZWlnaF9zeXNjdGxfdW5yZWdpc3Rlcihpbl9kZXYtPmFycF9wYXJtcyk7CisJCW5laWdoX3N5c2N0bF9yZWdpc3RlcihkZXYsIGluX2Rldi0+YXJwX3Bhcm1zLCBORVRfSVBWNCwKKwkJCQkgICAgICBORVRfSVBWNF9ORUlHSCwgImlwdjQiLCBOVUxMLCBOVUxMKTsKKwkJZGV2aW5ldF9zeXNjdGxfcmVnaXN0ZXIoaW5fZGV2LCAmaW5fZGV2LT5jbmYpOworI2VuZGlmCisJCWJyZWFrOworCX0KK291dDoKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaXBfbmV0ZGV2X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID1pbmV0ZGV2X2V2ZW50LAorfTsKKworc3RhdGljIGludCBpbmV0X2ZpbGxfaWZhZGRyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpbl9pZmFkZHIgKmlmYSwKKwkJCSAgICB1MzIgcGlkLCB1MzIgc2VxLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IGlmYWRkcm1zZyAqaWZtOworCXN0cnVjdCBubG1zZ2hkciAgKm5saDsKKwl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYi0+dGFpbDsKKworCW5saCA9IE5MTVNHX1BVVChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCppZm0pKTsKKwlpZiAocGlkKSBubGgtPm5sbXNnX2ZsYWdzIHw9IE5MTV9GX01VTFRJOworCWlmbSA9IE5MTVNHX0RBVEEobmxoKTsKKwlpZm0tPmlmYV9mYW1pbHkgPSBBRl9JTkVUOworCWlmbS0+aWZhX3ByZWZpeGxlbiA9IGlmYS0+aWZhX3ByZWZpeGxlbjsKKwlpZm0tPmlmYV9mbGFncyA9IGlmYS0+aWZhX2ZsYWdzfElGQV9GX1BFUk1BTkVOVDsKKwlpZm0tPmlmYV9zY29wZSA9IGlmYS0+aWZhX3Njb3BlOworCWlmbS0+aWZhX2luZGV4ID0gaWZhLT5pZmFfZGV2LT5kZXYtPmlmaW5kZXg7CisJaWYgKGlmYS0+aWZhX2FkZHJlc3MpCisJCVJUQV9QVVQoc2tiLCBJRkFfQUREUkVTUywgNCwgJmlmYS0+aWZhX2FkZHJlc3MpOworCWlmIChpZmEtPmlmYV9sb2NhbCkKKwkJUlRBX1BVVChza2IsIElGQV9MT0NBTCwgNCwgJmlmYS0+aWZhX2xvY2FsKTsKKwlpZiAoaWZhLT5pZmFfYnJvYWRjYXN0KQorCQlSVEFfUFVUKHNrYiwgSUZBX0JST0FEQ0FTVCwgNCwgJmlmYS0+aWZhX2Jyb2FkY2FzdCk7CisJaWYgKGlmYS0+aWZhX2FueWNhc3QpCisJCVJUQV9QVVQoc2tiLCBJRkFfQU5ZQ0FTVCwgNCwgJmlmYS0+aWZhX2FueWNhc3QpOworCWlmIChpZmEtPmlmYV9sYWJlbFswXSkKKwkJUlRBX1BVVChza2IsIElGQV9MQUJFTCwgSUZOQU1TSVosICZpZmEtPmlmYV9sYWJlbCk7CisJbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCXJldHVybiBza2ItPmxlbjsKKworbmxtc2dfZmFpbHVyZToKK3J0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGluZXRfZHVtcF9pZmFkZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCWludCBpZHgsIGlwX2lkeDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKwlzdHJ1Y3QgaW5faWZhZGRyICppZmE7CisJaW50IHNfaXBfaWR4LCBzX2lkeCA9IGNiLT5hcmdzWzBdOworCisJc19pcF9pZHggPSBpcF9pZHggPSBjYi0+YXJnc1sxXTsKKwlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOworCWZvciAoZGV2ID0gZGV2X2Jhc2UsIGlkeCA9IDA7IGRldjsgZGV2ID0gZGV2LT5uZXh0LCBpZHgrKykgeworCQlpZiAoaWR4IDwgc19pZHgpCisJCQljb250aW51ZTsKKwkJaWYgKGlkeCA+IHNfaWR4KQorCQkJc19pcF9pZHggPSAwOworCQlyY3VfcmVhZF9sb2NrKCk7CisJCWlmICgoaW5fZGV2ID0gX19pbl9kZXZfZ2V0KGRldikpID09IE5VTEwpIHsKKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJY29udGludWU7CisJCX0KKworCQlmb3IgKGlmYSA9IGluX2Rldi0+aWZhX2xpc3QsIGlwX2lkeCA9IDA7IGlmYTsKKwkJICAgICBpZmEgPSBpZmEtPmlmYV9uZXh0LCBpcF9pZHgrKykgeworCQkJaWYgKGlwX2lkeCA8IHNfaXBfaWR4KQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGluZXRfZmlsbF9pZmFkZHIoc2tiLCBpZmEsIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLAorCQkJCQkgICAgIGNiLT5ubGgtPm5sbXNnX3NlcSwKKwkJCQkJICAgICBSVE1fTkVXQUREUikgPD0gMCkgeworCQkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJfQorCQlyY3VfcmVhZF91bmxvY2soKTsKKwl9CisKK2RvbmU6CisJcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOworCWNiLT5hcmdzWzBdID0gaWR4OworCWNiLT5hcmdzWzFdID0gaXBfaWR4OworCisJcmV0dXJuIHNrYi0+bGVuOworfQorCitzdGF0aWMgdm9pZCBydG1zZ19pZmEoaW50IGV2ZW50LCBzdHJ1Y3QgaW5faWZhZGRyKiBpZmEpCit7CisJaW50IHNpemUgPSBOTE1TR19TUEFDRShzaXplb2Yoc3RydWN0IGlmYWRkcm1zZykgKyAxMjgpOworCXN0cnVjdCBza19idWZmICpza2IgPSBhbGxvY19za2Ioc2l6ZSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXNrYikKKwkJbmV0bGlua19zZXRfZXJyKHJ0bmwsIDAsIFJUTUdSUF9JUFY0X0lGQUREUiwgRU5PQlVGUyk7CisJZWxzZSBpZiAoaW5ldF9maWxsX2lmYWRkcihza2IsIGlmYSwgMCwgMCwgZXZlbnQpIDwgMCkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJbmV0bGlua19zZXRfZXJyKHJ0bmwsIDAsIFJUTUdSUF9JUFY0X0lGQUREUiwgRUlOVkFMKTsKKwl9IGVsc2UgeworCQlORVRMSU5LX0NCKHNrYikuZHN0X2dyb3VwcyA9IFJUTUdSUF9JUFY0X0lGQUREUjsKKwkJbmV0bGlua19icm9hZGNhc3QocnRubCwgc2tiLCAwLCBSVE1HUlBfSVBWNF9JRkFERFIsIEdGUF9LRVJORUwpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBydG5ldGxpbmtfbGluayBpbmV0X3J0bmV0bGlua190YWJsZVtSVE1fTUFYIC0gUlRNX0JBU0UgKyAxXSA9IHsKKwkgWzRdID0geyAuZG9pdAkgPSBpbmV0X3J0bV9uZXdhZGRyLCAgfSwKKwkgWzVdID0geyAuZG9pdAkgPSBpbmV0X3J0bV9kZWxhZGRyLCAgfSwKKwkgWzZdID0geyAuZHVtcGl0ID0gaW5ldF9kdW1wX2lmYWRkciwgIH0sCisJIFs4XSA9IHsgLmRvaXQJID0gaW5ldF9ydG1fbmV3cm91dGUsIH0sCisJIFs5XSA9IHsgLmRvaXQJID0gaW5ldF9ydG1fZGVscm91dGUsIH0sCisJWzEwXSA9IHsgLmRvaXQJID0gaW5ldF9ydG1fZ2V0cm91dGUsIC5kdW1waXQgPSBpbmV0X2R1bXBfZmliLCB9LAorI2lmZGVmIENPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVMKKwlbMTZdID0geyAuZG9pdAkgPSBpbmV0X3J0bV9uZXdydWxlLCB9LAorCVsxN10gPSB7IC5kb2l0CSA9IGluZXRfcnRtX2RlbHJ1bGUsIH0sCisJWzE4XSA9IHsgLmR1bXBpdCA9IGluZXRfZHVtcF9ydWxlcywgIH0sCisjZW5kaWYKK307CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisKK3ZvaWQgaW5ldF9mb3J3YXJkX2NoYW5nZSh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IG9uID0gaXB2NF9kZXZjb25mLmZvcndhcmRpbmc7CisKKwlpcHY0X2RldmNvbmYuYWNjZXB0X3JlZGlyZWN0cyA9ICFvbjsKKwlpcHY0X2RldmNvbmZfZGZsdC5mb3J3YXJkaW5nID0gb247CisKKwlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOworCWZvciAoZGV2ID0gZGV2X2Jhc2U7IGRldjsgZGV2ID0gZGV2LT5uZXh0KSB7CisJCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlpbl9kZXYgPSBfX2luX2Rldl9nZXQoZGV2KTsKKwkJaWYgKGluX2RldikKKwkJCWluX2Rldi0+Y25mLmZvcndhcmRpbmcgPSBvbjsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJfQorCXJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKworCXJ0X2NhY2hlX2ZsdXNoKDApOworfQorCitzdGF0aWMgaW50IGRldmluZXRfc3lzY3RsX2ZvcndhcmQoY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwKKwkJCQkgIHN0cnVjdCBmaWxlKiBmaWxwLCB2b2lkIF9fdXNlciAqYnVmZmVyLAorCQkJCSAgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJaW50ICp2YWxwID0gY3RsLT5kYXRhOworCWludCB2YWwgPSAqdmFscDsKKwlpbnQgcmV0ID0gcHJvY19kb2ludHZlYyhjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCisJaWYgKHdyaXRlICYmICp2YWxwICE9IHZhbCkgeworCQlpZiAodmFscCA9PSAmaXB2NF9kZXZjb25mLmZvcndhcmRpbmcpCisJCQlpbmV0X2ZvcndhcmRfY2hhbmdlKCk7CisJCWVsc2UgaWYgKHZhbHAgIT0gJmlwdjRfZGV2Y29uZl9kZmx0LmZvcndhcmRpbmcpCisJCQlydF9jYWNoZV9mbHVzaCgwKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaXB2NF9kb2ludF9hbmRfZmx1c2goY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwKKwkJCSBzdHJ1Y3QgZmlsZSogZmlscCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwKKwkJCSBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgKnZhbHAgPSBjdGwtPmRhdGE7CisJaW50IHZhbCA9ICp2YWxwOworCWludCByZXQgPSBwcm9jX2RvaW50dmVjKGN0bCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisKKwlpZiAod3JpdGUgJiYgKnZhbHAgIT0gdmFsKQorCQlydF9jYWNoZV9mbHVzaCgwKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBpcHY0X2RvaW50X2FuZF9mbHVzaF9zdHJhdGVneShjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKKwkJCQkgIHZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCisJCQkJICB2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuLCAKKwkJCQkgIHZvaWQgKipjb250ZXh0KQoreworCWludCAqdmFscCA9IHRhYmxlLT5kYXRhOworCWludCBuZXc7CisKKwlpZiAoIW5ld3ZhbCB8fCAhbmV3bGVuKQorCQlyZXR1cm4gMDsKKworCWlmIChuZXdsZW4gIT0gc2l6ZW9mKGludCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGdldF91c2VyKG5ldywgKGludCBfX3VzZXIgKiluZXd2YWwpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChuZXcgPT0gKnZhbHApCisJCXJldHVybiAwOworCisJaWYgKG9sZHZhbCAmJiBvbGRsZW5wKSB7CisJCXNpemVfdCBsZW47CisKKwkJaWYgKGdldF91c2VyKGxlbiwgb2xkbGVucCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAobGVuKSB7CisJCQlpZiAobGVuID4gdGFibGUtPm1heGxlbikKKwkJCQlsZW4gPSB0YWJsZS0+bWF4bGVuOworCQkJaWYgKGNvcHlfdG9fdXNlcihvbGR2YWwsIHZhbHAsIGxlbikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAocHV0X3VzZXIobGVuLCBvbGRsZW5wKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKworCSp2YWxwID0gbmV3OworCXJ0X2NhY2hlX2ZsdXNoKDApOworCXJldHVybiAxOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZGV2aW5ldF9zeXNjdGxfdGFibGUgeworCXN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpzeXNjdGxfaGVhZGVyOworCWN0bF90YWJsZQkJZGV2aW5ldF92YXJzW19fTkVUX0lQVjRfQ09ORl9NQVhdOworCWN0bF90YWJsZQkJZGV2aW5ldF9kZXZbMl07CisJY3RsX3RhYmxlCQlkZXZpbmV0X2NvbmZfZGlyWzJdOworCWN0bF90YWJsZQkJZGV2aW5ldF9wcm90b19kaXJbMl07CisJY3RsX3RhYmxlCQlkZXZpbmV0X3Jvb3RfZGlyWzJdOworfSBkZXZpbmV0X3N5c2N0bCA9IHsKKwkuZGV2aW5ldF92YXJzID0geworCQl7CisJCQkuY3RsX25hbWUJPSBORVRfSVBWNF9DT05GX0ZPUldBUkRJTkcsCisJCQkucHJvY25hbWUJPSAiZm9yd2FyZGluZyIsCisJCQkuZGF0YQkJPSAmaXB2NF9kZXZjb25mLmZvcndhcmRpbmcsCisJCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkJLm1vZGUJCT0gMDY0NCwKKwkJCS5wcm9jX2hhbmRsZXIJPSAmZGV2aW5ldF9zeXNjdGxfZm9yd2FyZCwKKwkJfSwKKwkJeworCQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfQ09ORl9NQ19GT1JXQVJESU5HLAorCQkJLnByb2NuYW1lCT0gIm1jX2ZvcndhcmRpbmciLAorCQkJLmRhdGEJCT0gJmlwdjRfZGV2Y29uZi5tY19mb3J3YXJkaW5nLAorCQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJCS5tb2RlCQk9IDA0NDQsCisJCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJCX0sCisJCXsKKwkJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X0NPTkZfQUNDRVBUX1JFRElSRUNUUywKKwkJCS5wcm9jbmFtZQk9ICJhY2NlcHRfcmVkaXJlY3RzIiwKKwkJCS5kYXRhCQk9ICZpcHY0X2RldmNvbmYuYWNjZXB0X3JlZGlyZWN0cywKKwkJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCQkubW9kZQkJPSAwNjQ0LAorCQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCQl9LAorCQl7CisJCQkuY3RsX25hbWUJPSBORVRfSVBWNF9DT05GX1NFQ1VSRV9SRURJUkVDVFMsCisJCQkucHJvY25hbWUJPSAic2VjdXJlX3JlZGlyZWN0cyIsCisJCQkuZGF0YQkJPSAmaXB2NF9kZXZjb25mLnNlY3VyZV9yZWRpcmVjdHMsCisJCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkJLm1vZGUJCT0gMDY0NCwKKwkJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwkJfSwKKwkJeworCQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfQ09ORl9TSEFSRURfTUVESUEsCisJCQkucHJvY25hbWUJPSAic2hhcmVkX21lZGlhIiwKKwkJCS5kYXRhCQk9ICZpcHY0X2RldmNvbmYuc2hhcmVkX21lZGlhLAorCQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJCS5tb2RlCQk9IDA2NDQsCisJCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJCX0sCisJCXsKKwkJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X0NPTkZfUlBfRklMVEVSLAorCQkJLnByb2NuYW1lCT0gInJwX2ZpbHRlciIsCisJCQkuZGF0YQkJPSAmaXB2NF9kZXZjb25mLnJwX2ZpbHRlciwKKwkJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCQkubW9kZQkJPSAwNjQ0LAorCQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCQl9LAorCQl7CisJCQkuY3RsX25hbWUJPSBORVRfSVBWNF9DT05GX1NFTkRfUkVESVJFQ1RTLAorCQkJLnByb2NuYW1lCT0gInNlbmRfcmVkaXJlY3RzIiwKKwkJCS5kYXRhCQk9ICZpcHY0X2RldmNvbmYuc2VuZF9yZWRpcmVjdHMsCisJCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkJLm1vZGUJCT0gMDY0NCwKKwkJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwkJfSwKKwkJeworCQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfQ09ORl9BQ0NFUFRfU09VUkNFX1JPVVRFLAorCQkJLnByb2NuYW1lCT0gImFjY2VwdF9zb3VyY2Vfcm91dGUiLAorCQkJLmRhdGEJCT0gJmlwdjRfZGV2Y29uZi5hY2NlcHRfc291cmNlX3JvdXRlLAorCQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJCS5tb2RlCQk9IDA2NDQsCisJCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJCX0sCisJCXsKKwkJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X0NPTkZfUFJPWFlfQVJQLAorCQkJLnByb2NuYW1lCT0gInByb3h5X2FycCIsCisJCQkuZGF0YQkJPSAmaXB2NF9kZXZjb25mLnByb3h5X2FycCwKKwkJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCQkubW9kZQkJPSAwNjQ0LAorCQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCQl9LAorCQl7CisJCQkuY3RsX25hbWUJPSBORVRfSVBWNF9DT05GX01FRElVTV9JRCwKKwkJCS5wcm9jbmFtZQk9ICJtZWRpdW1faWQiLAorCQkJLmRhdGEJCT0gJmlwdjRfZGV2Y29uZi5tZWRpdW1faWQsCisJCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkJLm1vZGUJCT0gMDY0NCwKKwkJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwkJfSwKKwkJeworCQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfQ09ORl9CT09UUF9SRUxBWSwKKwkJCS5wcm9jbmFtZQk9ICJib290cF9yZWxheSIsCisJCQkuZGF0YQkJPSAmaXB2NF9kZXZjb25mLmJvb3RwX3JlbGF5LAorCQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJCS5tb2RlCQk9IDA2NDQsCisJCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJCX0sCisJCXsKKwkJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X0NPTkZfTE9HX01BUlRJQU5TLAorCQkJLnByb2NuYW1lCT0gImxvZ19tYXJ0aWFucyIsCisJCQkuZGF0YQkJPSAmaXB2NF9kZXZjb25mLmxvZ19tYXJ0aWFucywKKwkJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCQkubW9kZQkJPSAwNjQ0LAorCQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCQl9LAorCQl7CisJCQkuY3RsX25hbWUJPSBORVRfSVBWNF9DT05GX1RBRywKKwkJCS5wcm9jbmFtZQk9ICJ0YWciLAorCQkJLmRhdGEJCT0gJmlwdjRfZGV2Y29uZi50YWcsCisJCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkJLm1vZGUJCT0gMDY0NCwKKwkJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwkJfSwKKwkJeworCQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfQ09ORl9BUlBGSUxURVIsCisJCQkucHJvY25hbWUJPSAiYXJwX2ZpbHRlciIsCisJCQkuZGF0YQkJPSAmaXB2NF9kZXZjb25mLmFycF9maWx0ZXIsCisJCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkJLm1vZGUJCT0gMDY0NCwKKwkJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwkJfSwKKwkJeworCQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfQ09ORl9BUlBfQU5OT1VOQ0UsCisJCQkucHJvY25hbWUJPSAiYXJwX2Fubm91bmNlIiwKKwkJCS5kYXRhCQk9ICZpcHY0X2RldmNvbmYuYXJwX2Fubm91bmNlLAorCQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJCS5tb2RlCQk9IDA2NDQsCisJCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJCX0sCisJCXsKKwkJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X0NPTkZfQVJQX0lHTk9SRSwKKwkJCS5wcm9jbmFtZQk9ICJhcnBfaWdub3JlIiwKKwkJCS5kYXRhCQk9ICZpcHY0X2RldmNvbmYuYXJwX2lnbm9yZSwKKwkJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCQkubW9kZQkJPSAwNjQ0LAorCQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCQl9LAorCQl7CisJCQkuY3RsX25hbWUJPSBORVRfSVBWNF9DT05GX05PWEZSTSwKKwkJCS5wcm9jbmFtZQk9ICJkaXNhYmxlX3hmcm0iLAorCQkJLmRhdGEJCT0gJmlwdjRfZGV2Y29uZi5ub194ZnJtLAorCQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJCS5tb2RlCQk9IDA2NDQsCisJCQkucHJvY19oYW5kbGVyCT0gJmlwdjRfZG9pbnRfYW5kX2ZsdXNoLAorCQkJLnN0cmF0ZWd5CT0gJmlwdjRfZG9pbnRfYW5kX2ZsdXNoX3N0cmF0ZWd5LAorCQl9LAorCQl7CisJCQkuY3RsX25hbWUJPSBORVRfSVBWNF9DT05GX05PUE9MSUNZLAorCQkJLnByb2NuYW1lCT0gImRpc2FibGVfcG9saWN5IiwKKwkJCS5kYXRhCQk9ICZpcHY0X2RldmNvbmYubm9fcG9saWN5LAorCQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJCS5tb2RlCQk9IDA2NDQsCisJCQkucHJvY19oYW5kbGVyCT0gJmlwdjRfZG9pbnRfYW5kX2ZsdXNoLAorCQkJLnN0cmF0ZWd5CT0gJmlwdjRfZG9pbnRfYW5kX2ZsdXNoX3N0cmF0ZWd5LAorCQl9LAorCQl7CisJCQkuY3RsX25hbWUJPSBORVRfSVBWNF9DT05GX0ZPUkNFX0lHTVBfVkVSU0lPTiwKKwkJCS5wcm9jbmFtZQk9ICJmb3JjZV9pZ21wX3ZlcnNpb24iLAorCQkJLmRhdGEJCT0gJmlwdjRfZGV2Y29uZi5mb3JjZV9pZ21wX3ZlcnNpb24sCisJCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkJLm1vZGUJCT0gMDY0NCwKKwkJCS5wcm9jX2hhbmRsZXIJPSAmaXB2NF9kb2ludF9hbmRfZmx1c2gsCisJCQkuc3RyYXRlZ3kJPSAmaXB2NF9kb2ludF9hbmRfZmx1c2hfc3RyYXRlZ3ksCisJCX0sCisJfSwKKwkuZGV2aW5ldF9kZXYgPSB7CisJCXsKKwkJCS5jdGxfbmFtZQk9IE5FVF9QUk9UT19DT05GX0FMTCwKKwkJCS5wcm9jbmFtZQk9ICJhbGwiLAorCQkJLm1vZGUJCT0gMDU1NSwKKwkJCS5jaGlsZAkJPSBkZXZpbmV0X3N5c2N0bC5kZXZpbmV0X3ZhcnMsCisJCX0sCisJfSwKKwkuZGV2aW5ldF9jb25mX2RpciA9IHsKKwkgICAgICAgIHsKKwkJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X0NPTkYsCisJCQkucHJvY25hbWUJPSAiY29uZiIsCisJCQkubW9kZQkJPSAwNTU1LAorCQkJLmNoaWxkCQk9IGRldmluZXRfc3lzY3RsLmRldmluZXRfZGV2LAorCQl9LAorCX0sCisJLmRldmluZXRfcHJvdG9fZGlyID0geworCQl7CisJCQkuY3RsX25hbWUJPSBORVRfSVBWNCwKKwkJCS5wcm9jbmFtZQk9ICJpcHY0IiwKKwkJCS5tb2RlCQk9IDA1NTUsCisJCQkuY2hpbGQgCQk9IGRldmluZXRfc3lzY3RsLmRldmluZXRfY29uZl9kaXIsCisJCX0sCisJfSwKKwkuZGV2aW5ldF9yb290X2RpciA9IHsKKwkJeworCQkJLmN0bF9uYW1lCT0gQ1RMX05FVCwKKwkJCS5wcm9jbmFtZSAJPSAibmV0IiwKKwkJCS5tb2RlCQk9IDA1NTUsCisJCQkuY2hpbGQJCT0gZGV2aW5ldF9zeXNjdGwuZGV2aW5ldF9wcm90b19kaXIsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyB2b2lkIGRldmluZXRfc3lzY3RsX3JlZ2lzdGVyKHN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiwKKwkJCQkgICAgc3RydWN0IGlwdjRfZGV2Y29uZiAqcCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaW5fZGV2ID8gaW5fZGV2LT5kZXYgOiBOVUxMOworCXN0cnVjdCBkZXZpbmV0X3N5c2N0bF90YWJsZSAqdCA9IGttYWxsb2Moc2l6ZW9mKCp0KSwgR0ZQX0tFUk5FTCk7CisJY2hhciAqZGV2X25hbWUgPSBOVUxMOworCisJaWYgKCF0KQorCQlyZXR1cm47CisJbWVtY3B5KHQsICZkZXZpbmV0X3N5c2N0bCwgc2l6ZW9mKCp0KSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodC0+ZGV2aW5ldF92YXJzKSAtIDE7IGkrKykgeworCQl0LT5kZXZpbmV0X3ZhcnNbaV0uZGF0YSArPSAoY2hhciAqKXAgLSAoY2hhciAqKSZpcHY0X2RldmNvbmY7CisJCXQtPmRldmluZXRfdmFyc1tpXS5kZSA9IE5VTEw7CisJfQorCisJaWYgKGRldikgeworCQlkZXZfbmFtZSA9IGRldi0+bmFtZTsgCisJCXQtPmRldmluZXRfZGV2WzBdLmN0bF9uYW1lID0gZGV2LT5pZmluZGV4OworCX0gZWxzZSB7CisJCWRldl9uYW1lID0gImRlZmF1bHQiOworCQl0LT5kZXZpbmV0X2RldlswXS5jdGxfbmFtZSA9IE5FVF9QUk9UT19DT05GX0RFRkFVTFQ7CisJfQorCisJLyogCisJICogTWFrZSBhIGNvcHkgb2YgZGV2X25hbWUsIGJlY2F1c2UgJy5wcm9jbmFtZScgaXMgcmVnYXJkZWQgYXMgY29uc3QgCisJICogYnkgc3lzY3RsIGFuZCB3ZSB3b3VsZG4ndCB3YW50IGFueW9uZSB0byBjaGFuZ2UgaXQgdW5kZXIgb3VyIGZlZXQKKwkgKiAoc2VlIFNJT0NTSUZOQU1FKS4KKwkgKi8JCisJZGV2X25hbWUgPSBuZXRfc3lzY3RsX3N0cmR1cChkZXZfbmFtZSk7CisJaWYgKCFkZXZfbmFtZSkKKwkgICAgZ290byBmcmVlOworCisJdC0+ZGV2aW5ldF9kZXZbMF0ucHJvY25hbWUgICAgPSBkZXZfbmFtZTsKKwl0LT5kZXZpbmV0X2RldlswXS5jaGlsZAkgICAgICA9IHQtPmRldmluZXRfdmFyczsKKwl0LT5kZXZpbmV0X2RldlswXS5kZQkgICAgICA9IE5VTEw7CisJdC0+ZGV2aW5ldF9jb25mX2RpclswXS5jaGlsZCAgPSB0LT5kZXZpbmV0X2RldjsKKwl0LT5kZXZpbmV0X2NvbmZfZGlyWzBdLmRlICAgICA9IE5VTEw7CisJdC0+ZGV2aW5ldF9wcm90b19kaXJbMF0uY2hpbGQgPSB0LT5kZXZpbmV0X2NvbmZfZGlyOworCXQtPmRldmluZXRfcHJvdG9fZGlyWzBdLmRlICAgID0gTlVMTDsKKwl0LT5kZXZpbmV0X3Jvb3RfZGlyWzBdLmNoaWxkICA9IHQtPmRldmluZXRfcHJvdG9fZGlyOworCXQtPmRldmluZXRfcm9vdF9kaXJbMF0uZGUgICAgID0gTlVMTDsKKworCXQtPnN5c2N0bF9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUodC0+ZGV2aW5ldF9yb290X2RpciwgMCk7CisJaWYgKCF0LT5zeXNjdGxfaGVhZGVyKQorCSAgICBnb3RvIGZyZWVfcHJvY25hbWU7CisKKwlwLT5zeXNjdGwgPSB0OworCXJldHVybjsKKworCS8qIGVycm9yIHBhdGggKi8KKyBmcmVlX3Byb2NuYW1lOgorCWtmcmVlKGRldl9uYW1lKTsKKyBmcmVlOgorCWtmcmVlKHQpOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgZGV2aW5ldF9zeXNjdGxfdW5yZWdpc3RlcihzdHJ1Y3QgaXB2NF9kZXZjb25mICpwKQoreworCWlmIChwLT5zeXNjdGwpIHsKKwkJc3RydWN0IGRldmluZXRfc3lzY3RsX3RhYmxlICp0ID0gcC0+c3lzY3RsOworCQlwLT5zeXNjdGwgPSBOVUxMOworCQl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZSh0LT5zeXNjdGxfaGVhZGVyKTsKKwkJa2ZyZWUodC0+ZGV2aW5ldF9kZXZbMF0ucHJvY25hbWUpOworCQlrZnJlZSh0KTsKKwl9Cit9CisjZW5kaWYKKwordm9pZCBfX2luaXQgZGV2aW5ldF9pbml0KHZvaWQpCit7CisJcmVnaXN0ZXJfZ2lmY29uZihQRl9JTkVULCBpbmV0X2dpZmNvbmYpOworCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmaXBfbmV0ZGV2X25vdGlmaWVyKTsKKwlydG5ldGxpbmtfbGlua3NbUEZfSU5FVF0gPSBpbmV0X3J0bmV0bGlua190YWJsZTsKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJZGV2aW5ldF9zeXNjdGwuc3lzY3RsX2hlYWRlciA9CisJCXJlZ2lzdGVyX3N5c2N0bF90YWJsZShkZXZpbmV0X3N5c2N0bC5kZXZpbmV0X3Jvb3RfZGlyLCAwKTsKKwlkZXZpbmV0X3N5c2N0bF9yZWdpc3RlcihOVUxMLCAmaXB2NF9kZXZjb25mX2RmbHQpOworI2VuZGlmCit9CisKK0VYUE9SVF9TWU1CT0woZGV2aW5ldF9pb2N0bCk7CitFWFBPUlRfU1lNQk9MKGluX2Rldl9maW5pc2hfZGVzdHJveSk7CitFWFBPUlRfU1lNQk9MKGluZXRfc2VsZWN0X2FkZHIpOworRVhQT1JUX1NZTUJPTChpbmV0ZGV2X2J5X2luZGV4KTsKK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfaW5ldGFkZHJfbm90aWZpZXIpOworRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX2luZXRhZGRyX25vdGlmaWVyKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2VzcDQuYyBiL25ldC9pcHY0L2VzcDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTNhODgzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvZXNwNC5jCkBAIC0wLDAgKzEsNTEwIEBACisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L3hmcm0uaD4KKyNpbmNsdWRlIDxuZXQvZXNwLmg+CisjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvcGZrZXl2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPG5ldC9pY21wLmg+CisjaW5jbHVkZSA8bmV0L3VkcC5oPgorCisvKiBkZWNhcHN1bGF0aW9uIGRhdGEgZm9yIHVzZSB3aGVuIHBvc3QtcHJvY2Vzc2luZyAqLworc3RydWN0IGVzcF9kZWNhcF9kYXRhIHsKKwl4ZnJtX2FkZHJlc3NfdAlzYWRkcjsKKwlfX3UxNgkJc3BvcnQ7CisJX191OAkJcHJvdG87Cit9OworCitzdGF0aWMgaW50IGVzcF9vdXRwdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgaXBoZHIgKnRvcF9pcGg7CisJc3RydWN0IGlwX2VzcF9oZHIgKmVzcGg7CisJc3RydWN0IGNyeXB0b190Zm0gKnRmbTsKKwlzdHJ1Y3QgZXNwX2RhdGEgKmVzcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHJhaWxlcjsKKwlpbnQgYmxrc2l6ZTsKKwlpbnQgY2xlbjsKKwlpbnQgYWxlbjsKKwlpbnQgbmZyYWdzOworCisJLyogU3RyaXAgSVArRVNQIGhlYWRlci4gKi8KKwlfX3NrYl9wdWxsKHNrYiwgc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSk7CisJLyogTm93IHNrYiBpcyBwdXJlIHBheWxvYWQgdG8gZW5jcnlwdCAqLworCisJZXJyID0gLUVOT01FTTsKKworCS8qIFJvdW5kIHRvIGJsb2NrIHNpemUgKi8KKwljbGVuID0gc2tiLT5sZW47CisKKwllc3AgPSB4LT5kYXRhOworCWFsZW4gPSBlc3AtPmF1dGguaWN2X3RydW5jX2xlbjsKKwl0Zm0gPSBlc3AtPmNvbmYudGZtOworCWJsa3NpemUgPSAoY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSkgKyAzKSAmIH4zOworCWNsZW4gPSAoY2xlbiArIDIgKyBibGtzaXplLTEpJn4oYmxrc2l6ZS0xKTsKKwlpZiAoZXNwLT5jb25mLnBhZGxlbikKKwkJY2xlbiA9IChjbGVuICsgZXNwLT5jb25mLnBhZGxlbi0xKSZ+KGVzcC0+Y29uZi5wYWRsZW4tMSk7CisKKwlpZiAoKG5mcmFncyA9IHNrYl9jb3dfZGF0YShza2IsIGNsZW4tc2tiLT5sZW4rYWxlbiwgJnRyYWlsZXIpKSA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBGaWxsIHBhZGRpbmcuLi4gKi8KKwlkbyB7CisJCWludCBpOworCQlmb3IgKGk9MDsgaTxjbGVuLXNrYi0+bGVuIC0gMjsgaSsrKQorCQkJKih1OCopKHRyYWlsZXItPnRhaWwgKyBpKSA9IGkrMTsKKwl9IHdoaWxlICgwKTsKKwkqKHU4KikodHJhaWxlci0+dGFpbCArIGNsZW4tc2tiLT5sZW4gLSAyKSA9IChjbGVuIC0gc2tiLT5sZW4pLTI7CisJcHNrYl9wdXQoc2tiLCB0cmFpbGVyLCBjbGVuIC0gc2tiLT5sZW4pOworCisJX19za2JfcHVzaChza2IsIHNrYi0+ZGF0YSAtIHNrYi0+bmgucmF3KTsKKwl0b3BfaXBoID0gc2tiLT5uaC5pcGg7CisJZXNwaCA9IChzdHJ1Y3QgaXBfZXNwX2hkciAqKShza2ItPm5oLnJhdyArIHRvcF9pcGgtPmlobCo0KTsKKwl0b3BfaXBoLT50b3RfbGVuID0gaHRvbnMoc2tiLT5sZW4gKyBhbGVuKTsKKwkqKHU4KikodHJhaWxlci0+dGFpbCAtIDEpID0gdG9wX2lwaC0+cHJvdG9jb2w7CisKKwkvKiB0aGlzIGlzIG5vbi1OVUxMIG9ubHkgd2l0aCBVRFAgRW5jYXBzdWxhdGlvbiAqLworCWlmICh4LT5lbmNhcCkgeworCQlzdHJ1Y3QgeGZybV9lbmNhcF90bXBsICplbmNhcCA9IHgtPmVuY2FwOworCQlzdHJ1Y3QgdWRwaGRyICp1aDsKKwkJdTMyICp1ZHBkYXRhMzI7CisKKwkJdWggPSAoc3RydWN0IHVkcGhkciAqKWVzcGg7CisJCXVoLT5zb3VyY2UgPSBlbmNhcC0+ZW5jYXBfc3BvcnQ7CisJCXVoLT5kZXN0ID0gZW5jYXAtPmVuY2FwX2Rwb3J0OworCQl1aC0+bGVuID0gaHRvbnMoc2tiLT5sZW4gKyBhbGVuIC0gdG9wX2lwaC0+aWhsKjQpOworCQl1aC0+Y2hlY2sgPSAwOworCisJCXN3aXRjaCAoZW5jYXAtPmVuY2FwX3R5cGUpIHsKKwkJZGVmYXVsdDoKKwkJY2FzZSBVRFBfRU5DQVBfRVNQSU5VRFA6CisJCQllc3BoID0gKHN0cnVjdCBpcF9lc3BfaGRyICopKHVoICsgMSk7CisJCQlicmVhazsKKwkJY2FzZSBVRFBfRU5DQVBfRVNQSU5VRFBfTk9OX0lLRToKKwkJCXVkcGRhdGEzMiA9ICh1MzIgKikodWggKyAxKTsKKwkJCXVkcGRhdGEzMlswXSA9IHVkcGRhdGEzMlsxXSA9IDA7CisJCQllc3BoID0gKHN0cnVjdCBpcF9lc3BfaGRyICopKHVkcGRhdGEzMiArIDIpOworCQkJYnJlYWs7CisJCX0KKworCQl0b3BfaXBoLT5wcm90b2NvbCA9IElQUFJPVE9fVURQOworCX0gZWxzZQorCQl0b3BfaXBoLT5wcm90b2NvbCA9IElQUFJPVE9fRVNQOworCisJZXNwaC0+c3BpID0geC0+aWQuc3BpOworCWVzcGgtPnNlcV9ubyA9IGh0b25sKCsreC0+cmVwbGF5Lm9zZXEpOworCisJaWYgKGVzcC0+Y29uZi5pdmxlbikKKwkJY3J5cHRvX2NpcGhlcl9zZXRfaXYodGZtLCBlc3AtPmNvbmYuaXZlYywgY3J5cHRvX3RmbV9hbGdfaXZzaXplKHRmbSkpOworCisJZG8geworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gJmVzcC0+c2didWZbMF07CisKKwkJaWYgKHVubGlrZWx5KG5mcmFncyA+IEVTUF9OVU1fRkFTVF9TRykpIHsKKwkJCXNnID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSpuZnJhZ3MsIEdGUF9BVE9NSUMpOworCQkJaWYgKCFzZykKKwkJCQlnb3RvIGVycm9yOworCQl9CisJCXNrYl90b19zZ3ZlYyhza2IsIHNnLCBlc3BoLT5lbmNfZGF0YStlc3AtPmNvbmYuaXZsZW4tc2tiLT5kYXRhLCBjbGVuKTsKKwkJY3J5cHRvX2NpcGhlcl9lbmNyeXB0KHRmbSwgc2csIHNnLCBjbGVuKTsKKwkJaWYgKHVubGlrZWx5KHNnICE9ICZlc3AtPnNnYnVmWzBdKSkKKwkJCWtmcmVlKHNnKTsKKwl9IHdoaWxlICgwKTsKKworCWlmIChlc3AtPmNvbmYuaXZsZW4pIHsKKwkJbWVtY3B5KGVzcGgtPmVuY19kYXRhLCBlc3AtPmNvbmYuaXZlYywgY3J5cHRvX3RmbV9hbGdfaXZzaXplKHRmbSkpOworCQljcnlwdG9fY2lwaGVyX2dldF9pdih0Zm0sIGVzcC0+Y29uZi5pdmVjLCBjcnlwdG9fdGZtX2FsZ19pdnNpemUodGZtKSk7CisJfQorCisJaWYgKGVzcC0+YXV0aC5pY3ZfZnVsbF9sZW4pIHsKKwkJZXNwLT5hdXRoLmljdihlc3AsIHNrYiwgKHU4Killc3BoLXNrYi0+ZGF0YSwKKwkJICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGlwX2VzcF9oZHIpICsgZXNwLT5jb25mLml2bGVuK2NsZW4sIHRyYWlsZXItPnRhaWwpOworCQlwc2tiX3B1dChza2IsIHRyYWlsZXIsIGFsZW4pOworCX0KKworCWlwX3NlbmRfY2hlY2sodG9wX2lwaCk7CisKKwllcnIgPSAwOworCitlcnJvcjoKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogTm90ZTogZGV0ZWN0aW5nIHRydW5jYXRlZCB2cy4gbm9uLXRydW5jYXRlZCBhdXRoZW50aWNhdGlvbiBkYXRhIGlzIHZlcnkKKyAqIGV4cGVuc2l2ZSwgc28gd2Ugb25seSBzdXBwb3J0IHRydW5jYXRlZCBkYXRhLCB3aGljaCBpcyB0aGUgcmVjb21tZW5kZWQKKyAqIGFuZCBjb21tb24gY2FzZS4KKyAqLworc3RhdGljIGludCBlc3BfaW5wdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCB4ZnJtX2RlY2FwX3N0YXRlICpkZWNhcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwlzdHJ1Y3QgaXBfZXNwX2hkciAqZXNwaDsKKwlzdHJ1Y3QgZXNwX2RhdGEgKmVzcCA9IHgtPmRhdGE7CisJc3RydWN0IHNrX2J1ZmYgKnRyYWlsZXI7CisJaW50IGJsa3NpemUgPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUoZXNwLT5jb25mLnRmbSk7CisJaW50IGFsZW4gPSBlc3AtPmF1dGguaWN2X3RydW5jX2xlbjsKKwlpbnQgZWxlbiA9IHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCBpcF9lc3BfaGRyKSAtIGVzcC0+Y29uZi5pdmxlbiAtIGFsZW47CisJaW50IG5mcmFnczsKKwlpbnQgZW5jYXBfbGVuID0gMDsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaXBfZXNwX2hkcikpKQorCQlnb3RvIG91dDsKKworCWlmIChlbGVuIDw9IDAgfHwgKGVsZW4gJiAoYmxrc2l6ZS0xKSkpCisJCWdvdG8gb3V0OworCisJLyogSWYgaW50ZWdyaXR5IGNoZWNrIGlzIHJlcXVpcmVkLCBkbyB0aGlzLiAqLworCWlmIChlc3AtPmF1dGguaWN2X2Z1bGxfbGVuKSB7CisJCXU4IHN1bVtlc3AtPmF1dGguaWN2X2Z1bGxfbGVuXTsKKwkJdTggc3VtMVthbGVuXTsKKwkJCisJCWVzcC0+YXV0aC5pY3YoZXNwLCBza2IsIDAsIHNrYi0+bGVuLWFsZW4sIHN1bSk7CisKKwkJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCBza2ItPmxlbi1hbGVuLCBzdW0xLCBhbGVuKSkKKwkJCUJVRygpOworCisJCWlmICh1bmxpa2VseShtZW1jbXAoc3VtLCBzdW0xLCBhbGVuKSkpIHsKKwkJCXgtPnN0YXRzLmludGVncml0eV9mYWlsZWQrKzsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKChuZnJhZ3MgPSBza2JfY293X2RhdGEoc2tiLCAwLCAmdHJhaWxlcikpIDwgMCkKKwkJZ290byBvdXQ7CisKKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisKKwllc3BoID0gKHN0cnVjdCBpcF9lc3BfaGRyKilza2ItPmRhdGE7CisJaXBoID0gc2tiLT5uaC5pcGg7CisKKwkvKiBHZXQgaXZlYy4gVGhpcyBjYW4gYmUgd3JvbmcsIGNoZWNrIGFnYWluc3QgYW5vdGhlciBpbXBscy4gKi8KKwlpZiAoZXNwLT5jb25mLml2bGVuKQorCQljcnlwdG9fY2lwaGVyX3NldF9pdihlc3AtPmNvbmYudGZtLCBlc3BoLT5lbmNfZGF0YSwgY3J5cHRvX3RmbV9hbGdfaXZzaXplKGVzcC0+Y29uZi50Zm0pKTsKKworICAgICAgICB7CisJCXU4IG5leHRoZHJbMl07CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSAmZXNwLT5zZ2J1ZlswXTsKKwkJdTggd29ya2J1Zls2MF07CisJCWludCBwYWRsZW47CisKKwkJaWYgKHVubGlrZWx5KG5mcmFncyA+IEVTUF9OVU1fRkFTVF9TRykpIHsKKwkJCXNnID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSpuZnJhZ3MsIEdGUF9BVE9NSUMpOworCQkJaWYgKCFzZykKKwkJCQlnb3RvIG91dDsKKwkJfQorCQlza2JfdG9fc2d2ZWMoc2tiLCBzZywgc2l6ZW9mKHN0cnVjdCBpcF9lc3BfaGRyKSArIGVzcC0+Y29uZi5pdmxlbiwgZWxlbik7CisJCWNyeXB0b19jaXBoZXJfZGVjcnlwdChlc3AtPmNvbmYudGZtLCBzZywgc2csIGVsZW4pOworCQlpZiAodW5saWtlbHkoc2cgIT0gJmVzcC0+c2didWZbMF0pKQorCQkJa2ZyZWUoc2cpOworCisJCWlmIChza2JfY29weV9iaXRzKHNrYiwgc2tiLT5sZW4tYWxlbi0yLCBuZXh0aGRyLCAyKSkKKwkJCUJVRygpOworCisJCXBhZGxlbiA9IG5leHRoZHJbMF07CisJCWlmIChwYWRsZW4rMiA+PSBlbGVuKQorCQkJZ290byBvdXQ7CisKKwkJLyogLi4uIGNoZWNrIHBhZGRpbmcgYml0cyBoZXJlLiBTaWxseS4gOi0pICovIAorCisJCWlmICh4LT5lbmNhcCAmJiBkZWNhcCAmJiBkZWNhcC0+ZGVjYXBfdHlwZSkgeworCQkJc3RydWN0IGVzcF9kZWNhcF9kYXRhICplbmNhcF9kYXRhOworCQkJc3RydWN0IHVkcGhkciAqdWggPSAoc3RydWN0IHVkcGhkciAqKSAoaXBoKzEpOworCisJCQllbmNhcF9kYXRhID0gKHN0cnVjdCBlc3BfZGVjYXBfZGF0YSAqKSAoZGVjYXAtPmRlY2FwX2RhdGEpOworCQkJZW5jYXBfZGF0YS0+cHJvdG8gPSAwOworCisJCQlzd2l0Y2ggKGRlY2FwLT5kZWNhcF90eXBlKSB7CisJCQljYXNlIFVEUF9FTkNBUF9FU1BJTlVEUDoKKwkJCWNhc2UgVURQX0VOQ0FQX0VTUElOVURQX05PTl9JS0U6CisJCQkJZW5jYXBfZGF0YS0+cHJvdG8gPSBBRl9JTkVUOworCQkJCWVuY2FwX2RhdGEtPnNhZGRyLmE0ID0gaXBoLT5zYWRkcjsKKwkJCQllbmNhcF9kYXRhLT5zcG9ydCA9IHVoLT5zb3VyY2U7CisJCQkJZW5jYXBfbGVuID0gKHZvaWQqKWVzcGggLSAodm9pZCopdWg7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKworCQlpcGgtPnByb3RvY29sID0gbmV4dGhkclsxXTsKKwkJcHNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSBhbGVuIC0gcGFkbGVuIC0gMik7CisJCW1lbWNweSh3b3JrYnVmLCBza2ItPm5oLnJhdywgaXBoLT5paGwqNCk7CisJCXNrYi0+aC5yYXcgPSBza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaXBfZXNwX2hkcikgKyBlc3AtPmNvbmYuaXZsZW4pOworCQlza2ItPm5oLnJhdyArPSBlbmNhcF9sZW4gKyBzaXplb2Yoc3RydWN0IGlwX2VzcF9oZHIpICsgZXNwLT5jb25mLml2bGVuOworCQltZW1jcHkoc2tiLT5uaC5yYXcsIHdvcmtidWYsIGlwaC0+aWhsKjQpOworCQlza2ItPm5oLmlwaC0+dG90X2xlbiA9IGh0b25zKHNrYi0+bGVuKTsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0OgorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGVzcF9wb3N0X2lucHV0KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBzdHJ1Y3QgeGZybV9kZWNhcF9zdGF0ZSAqZGVjYXAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisgIAorCWlmICh4LT5lbmNhcCkgeworCQlzdHJ1Y3QgeGZybV9lbmNhcF90bXBsICplbmNhcDsKKwkJc3RydWN0IGVzcF9kZWNhcF9kYXRhICpkZWNhcF9kYXRhOworCisJCWVuY2FwID0geC0+ZW5jYXA7CisJCWRlY2FwX2RhdGEgPSAoc3RydWN0IGVzcF9kZWNhcF9kYXRhICopKGRlY2FwLT5kZWNhcF9kYXRhKTsKKworCQkvKiBmaXJzdCwgbWFrZSBzdXJlIHRoYXQgdGhlIGRlY2FwIHR5cGUgPT0gdGhlIGVuY2FwIHR5cGUgKi8KKwkJaWYgKGVuY2FwLT5lbmNhcF90eXBlICE9IGRlY2FwLT5kZWNhcF90eXBlKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJc3dpdGNoIChlbmNhcC0+ZW5jYXBfdHlwZSkgeworCQlkZWZhdWx0OgorCQljYXNlIFVEUF9FTkNBUF9FU1BJTlVEUDoKKwkJY2FzZSBVRFBfRU5DQVBfRVNQSU5VRFBfTk9OX0lLRToKKwkJCS8qCisJCQkgKiAxKSBpZiB0aGUgTkFULVQgcGVlcidzIElQIG9yIHBvcnQgY2hhbmdlZCB0aGVuCisJCQkgKiAgICBhZHZlcnRpemUgdGhlIGNoYW5nZSB0byB0aGUga2V5aW5nIGRhZW1vbi4KKwkJCSAqICAgIFRoaXMgaXMgYW4gaW5ib3VuZCBTQSwgc28ganVzdCBjb21wYXJlCisJCQkgKiAgICBTUkMgcG9ydHMuCisJCQkgKi8KKwkJCWlmIChkZWNhcF9kYXRhLT5wcm90byA9PSBBRl9JTkVUICYmCisJCQkgICAgKGRlY2FwX2RhdGEtPnNhZGRyLmE0ICE9IHgtPnByb3BzLnNhZGRyLmE0IHx8CisJCQkgICAgIGRlY2FwX2RhdGEtPnNwb3J0ICE9IGVuY2FwLT5lbmNhcF9zcG9ydCkpIHsKKwkJCQl4ZnJtX2FkZHJlc3NfdCBpcGFkZHI7CisKKwkJCQlpcGFkZHIuYTQgPSBkZWNhcF9kYXRhLT5zYWRkci5hNDsKKwkJCQlrbV9uZXdfbWFwcGluZyh4LCAmaXBhZGRyLCBkZWNhcF9kYXRhLT5zcG9ydCk7CisJCQkJCQorCQkJCS8qIFhYWDogcGVyaGFwcyBhZGQgYW4gZXh0cmEKKwkJCQkgKiBwb2xpY3kgY2hlY2sgaGVyZSwgdG8gc2VlCisJCQkJICogaWYgd2Ugc2hvdWxkIGFsbG93IG9yCisJCQkJICogcmVqZWN0IGEgcGFja2V0IGZyb20gYQorCQkJCSAqIGRpZmZlcmVudCBzb3VyY2UKKwkJCQkgKiBhZGRyZXNzL3BvcnQuCisJCQkJICovCisJCQl9CisJCQorCQkJLyoKKwkJCSAqIDIpIGlnbm9yZSBVRFAvVENQIGNoZWNrc3VtcyBpbiBjYXNlCisJCQkgKiAgICBvZiBOQVQtVCBpbiBUcmFuc3BvcnQgTW9kZSwgb3IKKwkJCSAqICAgIHBlcmZvcm0gb3RoZXIgcG9zdC1wcm9jZXNzaW5nIGZpeGVzCisJCQkgKiAgICBhcyBwZXIgKiBkcmFmdC1pZXRmLWlwc2VjLXVkcC1lbmNhcHMtMDYsCisJCQkgKiAgICBzZWN0aW9uIDMuMS4yCisJCQkgKi8KKwkJCWlmICgheC0+cHJvcHMubW9kZSkKKwkJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiBlc3A0X2dldF9tYXhfc2l6ZShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgaW50IG10dSkKK3sKKwlzdHJ1Y3QgZXNwX2RhdGEgKmVzcCA9IHgtPmRhdGE7CisJdTMyIGJsa3NpemUgPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUoZXNwLT5jb25mLnRmbSk7CisKKwlpZiAoeC0+cHJvcHMubW9kZSkgeworCQltdHUgPSAobXR1ICsgMiArIGJsa3NpemUtMSkmfihibGtzaXplLTEpOworCX0gZWxzZSB7CisJCS8qIFRoZSB3b3JzdCBjYXNlLiAqLworCQltdHUgKz0gMiArIGJsa3NpemU7CisJfQorCWlmIChlc3AtPmNvbmYucGFkbGVuKQorCQltdHUgPSAobXR1ICsgZXNwLT5jb25mLnBhZGxlbi0xKSZ+KGVzcC0+Y29uZi5wYWRsZW4tMSk7CisKKwlyZXR1cm4gbXR1ICsgeC0+cHJvcHMuaGVhZGVyX2xlbiArIGVzcC0+YXV0aC5pY3ZfdHJ1bmNfbGVuOworfQorCitzdGF0aWMgdm9pZCBlc3A0X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgaW5mbykKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IChzdHJ1Y3QgaXBoZHIqKXNrYi0+ZGF0YTsKKwlzdHJ1Y3QgaXBfZXNwX2hkciAqZXNwaCA9IChzdHJ1Y3QgaXBfZXNwX2hkciopKHNrYi0+ZGF0YSsoaXBoLT5paGw8PDIpKTsKKwlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDsKKworCWlmIChza2ItPmguaWNtcGgtPnR5cGUgIT0gSUNNUF9ERVNUX1VOUkVBQ0ggfHwKKwkgICAgc2tiLT5oLmljbXBoLT5jb2RlICE9IElDTVBfRlJBR19ORUVERUQpCisJCXJldHVybjsKKworCXggPSB4ZnJtX3N0YXRlX2xvb2t1cCgoeGZybV9hZGRyZXNzX3QgKikmaXBoLT5kYWRkciwgZXNwaC0+c3BpLCBJUFBST1RPX0VTUCwgQUZfSU5FVCk7CisJaWYgKCF4KQorCQlyZXR1cm47CisJTkVUREVCVUcocHJpbnRrKEtFUk5fREVCVUcgInBtdHUgZGlzY292ZXJ5IG9uIFNBIEVTUC8lMDh4LyUwOHhcbiIsCisJCQludG9obChlc3BoLT5zcGkpLCBudG9obChpcGgtPmRhZGRyKSkpOworCXhmcm1fc3RhdGVfcHV0KHgpOworfQorCitzdGF0aWMgdm9pZCBlc3BfZGVzdHJveShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCkKK3sKKwlzdHJ1Y3QgZXNwX2RhdGEgKmVzcCA9IHgtPmRhdGE7CisKKwlpZiAoIWVzcCkKKwkJcmV0dXJuOworCisJaWYgKGVzcC0+Y29uZi50Zm0pIHsKKwkJY3J5cHRvX2ZyZWVfdGZtKGVzcC0+Y29uZi50Zm0pOworCQllc3AtPmNvbmYudGZtID0gTlVMTDsKKwl9CisJaWYgKGVzcC0+Y29uZi5pdmVjKSB7CisJCWtmcmVlKGVzcC0+Y29uZi5pdmVjKTsKKwkJZXNwLT5jb25mLml2ZWMgPSBOVUxMOworCX0KKwlpZiAoZXNwLT5hdXRoLnRmbSkgeworCQljcnlwdG9fZnJlZV90Zm0oZXNwLT5hdXRoLnRmbSk7CisJCWVzcC0+YXV0aC50Zm0gPSBOVUxMOworCX0KKwlpZiAoZXNwLT5hdXRoLndvcmtfaWN2KSB7CisJCWtmcmVlKGVzcC0+YXV0aC53b3JrX2ljdik7CisJCWVzcC0+YXV0aC53b3JrX2ljdiA9IE5VTEw7CisJfQorCWtmcmVlKGVzcCk7Cit9CisKK3N0YXRpYyBpbnQgZXNwX2luaXRfc3RhdGUoc3RydWN0IHhmcm1fc3RhdGUgKngsIHZvaWQgKmFyZ3MpCit7CisJc3RydWN0IGVzcF9kYXRhICplc3AgPSBOVUxMOworCisJLyogbnVsbCBhdXRoIGFuZCBlbmNyeXB0aW9uIGNhbiBoYXZlIHplcm8gbGVuZ3RoIGtleXMgKi8KKwlpZiAoeC0+YWFsZykgeworCQlpZiAoeC0+YWFsZy0+YWxnX2tleV9sZW4gPiA1MTIpCisJCQlnb3RvIGVycm9yOworCX0KKwlpZiAoeC0+ZWFsZyA9PSBOVUxMKQorCQlnb3RvIGVycm9yOworCisJZXNwID0ga21hbGxvYyhzaXplb2YoKmVzcCksIEdGUF9LRVJORUwpOworCWlmIChlc3AgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoZXNwLCAwLCBzaXplb2YoKmVzcCkpOworCisJaWYgKHgtPmFhbGcpIHsKKwkJc3RydWN0IHhmcm1fYWxnb19kZXNjICphYWxnX2Rlc2M7CisKKwkJZXNwLT5hdXRoLmtleSA9IHgtPmFhbGctPmFsZ19rZXk7CisJCWVzcC0+YXV0aC5rZXlfbGVuID0gKHgtPmFhbGctPmFsZ19rZXlfbGVuKzcpLzg7CisJCWVzcC0+YXV0aC50Zm0gPSBjcnlwdG9fYWxsb2NfdGZtKHgtPmFhbGctPmFsZ19uYW1lLCAwKTsKKwkJaWYgKGVzcC0+YXV0aC50Zm0gPT0gTlVMTCkKKwkJCWdvdG8gZXJyb3I7CisJCWVzcC0+YXV0aC5pY3YgPSBlc3BfaG1hY19kaWdlc3Q7CisKKwkJYWFsZ19kZXNjID0geGZybV9hYWxnX2dldF9ieW5hbWUoeC0+YWFsZy0+YWxnX25hbWUsIDApOworCQlCVUdfT04oIWFhbGdfZGVzYyk7CisKKwkJaWYgKGFhbGdfZGVzYy0+dWluZm8uYXV0aC5pY3ZfZnVsbGJpdHMvOCAhPQorCQkgICAgY3J5cHRvX3RmbV9hbGdfZGlnZXN0c2l6ZShlc3AtPmF1dGgudGZtKSkgeworCQkJTkVUREVCVUcocHJpbnRrKEtFUk5fSU5GTyAiRVNQOiAlcyBkaWdlc3RzaXplICV1ICE9ICVodVxuIiwKKwkJCSAgICAgICB4LT5hYWxnLT5hbGdfbmFtZSwKKwkJCSAgICAgICBjcnlwdG9fdGZtX2FsZ19kaWdlc3RzaXplKGVzcC0+YXV0aC50Zm0pLAorCQkJICAgICAgIGFhbGdfZGVzYy0+dWluZm8uYXV0aC5pY3ZfZnVsbGJpdHMvOCkpOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWVzcC0+YXV0aC5pY3ZfZnVsbF9sZW4gPSBhYWxnX2Rlc2MtPnVpbmZvLmF1dGguaWN2X2Z1bGxiaXRzLzg7CisJCWVzcC0+YXV0aC5pY3ZfdHJ1bmNfbGVuID0gYWFsZ19kZXNjLT51aW5mby5hdXRoLmljdl90cnVuY2JpdHMvODsKKworCQllc3AtPmF1dGgud29ya19pY3YgPSBrbWFsbG9jKGVzcC0+YXV0aC5pY3ZfZnVsbF9sZW4sIEdGUF9LRVJORUwpOworCQlpZiAoIWVzcC0+YXV0aC53b3JrX2ljdikKKwkJCWdvdG8gZXJyb3I7CisJfQorCWVzcC0+Y29uZi5rZXkgPSB4LT5lYWxnLT5hbGdfa2V5OworCWVzcC0+Y29uZi5rZXlfbGVuID0gKHgtPmVhbGctPmFsZ19rZXlfbGVuKzcpLzg7CisJaWYgKHgtPnByb3BzLmVhbGdvID09IFNBREJfRUFMR19OVUxMKQorCQllc3AtPmNvbmYudGZtID0gY3J5cHRvX2FsbG9jX3RmbSh4LT5lYWxnLT5hbGdfbmFtZSwgQ1JZUFRPX1RGTV9NT0RFX0VDQik7CisJZWxzZQorCQllc3AtPmNvbmYudGZtID0gY3J5cHRvX2FsbG9jX3RmbSh4LT5lYWxnLT5hbGdfbmFtZSwgQ1JZUFRPX1RGTV9NT0RFX0NCQyk7CisJaWYgKGVzcC0+Y29uZi50Zm0gPT0gTlVMTCkKKwkJZ290byBlcnJvcjsKKwllc3AtPmNvbmYuaXZsZW4gPSBjcnlwdG9fdGZtX2FsZ19pdnNpemUoZXNwLT5jb25mLnRmbSk7CisJZXNwLT5jb25mLnBhZGxlbiA9IDA7CisJaWYgKGVzcC0+Y29uZi5pdmxlbikgeworCQllc3AtPmNvbmYuaXZlYyA9IGttYWxsb2MoZXNwLT5jb25mLml2bGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHVubGlrZWx5KGVzcC0+Y29uZi5pdmVjID09IE5VTEwpKQorCQkJZ290byBlcnJvcjsKKwkJZ2V0X3JhbmRvbV9ieXRlcyhlc3AtPmNvbmYuaXZlYywgZXNwLT5jb25mLml2bGVuKTsKKwl9CisJaWYgKGNyeXB0b19jaXBoZXJfc2V0a2V5KGVzcC0+Y29uZi50Zm0sIGVzcC0+Y29uZi5rZXksIGVzcC0+Y29uZi5rZXlfbGVuKSkKKwkJZ290byBlcnJvcjsKKwl4LT5wcm9wcy5oZWFkZXJfbGVuID0gc2l6ZW9mKHN0cnVjdCBpcF9lc3BfaGRyKSArIGVzcC0+Y29uZi5pdmxlbjsKKwlpZiAoeC0+cHJvcHMubW9kZSkKKwkJeC0+cHJvcHMuaGVhZGVyX2xlbiArPSBzaXplb2Yoc3RydWN0IGlwaGRyKTsKKwlpZiAoeC0+ZW5jYXApIHsKKwkJc3RydWN0IHhmcm1fZW5jYXBfdG1wbCAqZW5jYXAgPSB4LT5lbmNhcDsKKworCQlzd2l0Y2ggKGVuY2FwLT5lbmNhcF90eXBlKSB7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGVycm9yOworCQljYXNlIFVEUF9FTkNBUF9FU1BJTlVEUDoKKwkJCXgtPnByb3BzLmhlYWRlcl9sZW4gKz0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCQkJYnJlYWs7CisJCWNhc2UgVURQX0VOQ0FQX0VTUElOVURQX05PTl9JS0U6CisJCQl4LT5wcm9wcy5oZWFkZXJfbGVuICs9IHNpemVvZihzdHJ1Y3QgdWRwaGRyKSArIDIgKiBzaXplb2YodTMyKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXgtPmRhdGEgPSBlc3A7CisJeC0+cHJvcHMudHJhaWxlcl9sZW4gPSBlc3A0X2dldF9tYXhfc2l6ZSh4LCAwKSAtIHgtPnByb3BzLmhlYWRlcl9sZW47CisJcmV0dXJuIDA7CisKK2Vycm9yOgorCXgtPmRhdGEgPSBlc3A7CisJZXNwX2Rlc3Ryb3koeCk7CisJeC0+ZGF0YSA9IE5VTEw7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeGZybV90eXBlIGVzcF90eXBlID0KK3sKKwkuZGVzY3JpcHRpb24JPSAiRVNQNCIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5wcm90bwkgICAgIAk9IElQUFJPVE9fRVNQLAorCS5pbml0X3N0YXRlCT0gZXNwX2luaXRfc3RhdGUsCisJLmRlc3RydWN0b3IJPSBlc3BfZGVzdHJveSwKKwkuZ2V0X21heF9zaXplCT0gZXNwNF9nZXRfbWF4X3NpemUsCisJLmlucHV0CQk9IGVzcF9pbnB1dCwKKwkucG9zdF9pbnB1dAk9IGVzcF9wb3N0X2lucHV0LAorCS5vdXRwdXQJCT0gZXNwX291dHB1dAorfTsKKworc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9jb2wgZXNwNF9wcm90b2NvbCA9IHsKKwkuaGFuZGxlcgk9CXhmcm00X3JjdiwKKwkuZXJyX2hhbmRsZXIJPQllc3A0X2VyciwKKwkubm9fcG9saWN5CT0JMSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGVzcDRfaW5pdCh2b2lkKQoreworCXN0cnVjdCB4ZnJtX2RlY2FwX3N0YXRlIGRlY2FwOworCisJaWYgKHNpemVvZihzdHJ1Y3QgZXNwX2RlY2FwX2RhdGEpICA8CisJICAgIHNpemVvZihkZWNhcC5kZWNhcF9kYXRhKSkgeworCQlleHRlcm4gdm9pZCBkZWNhcF9kYXRhX3Rvb19zbWFsbCh2b2lkKTsKKworCQlkZWNhcF9kYXRhX3Rvb19zbWFsbCgpOworCX0KKworCWlmICh4ZnJtX3JlZ2lzdGVyX3R5cGUoJmVzcF90eXBlLCBBRl9JTkVUKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaXAgZXNwIGluaXQ6IGNhbid0IGFkZCB4ZnJtIHR5cGVcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJaWYgKGluZXRfYWRkX3Byb3RvY29sKCZlc3A0X3Byb3RvY29sLCBJUFBST1RPX0VTUCkgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gImlwIGVzcCBpbml0OiBjYW4ndCBhZGQgcHJvdG9jb2xcbiIpOworCQl4ZnJtX3VucmVnaXN0ZXJfdHlwZSgmZXNwX3R5cGUsIEFGX0lORVQpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlc3A0X2Zpbmkodm9pZCkKK3sKKwlpZiAoaW5ldF9kZWxfcHJvdG9jb2woJmVzcDRfcHJvdG9jb2wsIElQUFJPVE9fRVNQKSA8IDApCisJCXByaW50ayhLRVJOX0lORk8gImlwIGVzcCBjbG9zZTogY2FuJ3QgcmVtb3ZlIHByb3RvY29sXG4iKTsKKwlpZiAoeGZybV91bnJlZ2lzdGVyX3R5cGUoJmVzcF90eXBlLCBBRl9JTkVUKSA8IDApCisJCXByaW50ayhLRVJOX0lORk8gImlwIGVzcCBjbG9zZTogY2FuJ3QgcmVtb3ZlIHhmcm0gdHlwZVxuIik7Cit9CisKK21vZHVsZV9pbml0KGVzcDRfaW5pdCk7Cittb2R1bGVfZXhpdChlc3A0X2ZpbmkpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZmliX2Zyb250ZW5kLmMgYi9uZXQvaXB2NC9maWJfZnJvbnRlbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjNlN2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvZmliX2Zyb250ZW5kLmMKQEAgLTAsMCArMSw2MTEgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJSVB2NCBGb3J3YXJkaW5nIEluZm9ybWF0aW9uIEJhc2U6IEZJQiBmcm9udGVuZC4KKyAqCisgKiBWZXJzaW9uOgkkSWQ6IGZpYl9mcm9udGVuZC5jLHYgMS4yNiAyMDAxLzEwLzMxIDIxOjU1OjU0IGRhdmVtIEV4cCAkCisgKgorICogQXV0aG9yczoJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2ljbXAuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisjaW5jbHVkZSA8bmV0L2lwX2ZpYi5oPgorCisjZGVmaW5lIEZGcHJpbnQoYS4uLikgcHJpbnRrKEtFUk5fREVCVUcgYSkKKworI2lmbmRlZiBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTCisKKyNkZWZpbmUgUlRfVEFCTEVfTUlOIFJUX1RBQkxFX01BSU4KKworc3RydWN0IGZpYl90YWJsZSAqaXBfZmliX2xvY2FsX3RhYmxlOworc3RydWN0IGZpYl90YWJsZSAqaXBfZmliX21haW5fdGFibGU7CisKKyNlbHNlCisKKyNkZWZpbmUgUlRfVEFCTEVfTUlOIDEKKworc3RydWN0IGZpYl90YWJsZSAqZmliX3RhYmxlc1tSVF9UQUJMRV9NQVgrMV07CisKK3N0cnVjdCBmaWJfdGFibGUgKl9fZmliX25ld190YWJsZShpbnQgaWQpCit7CisJc3RydWN0IGZpYl90YWJsZSAqdGI7CisKKwl0YiA9IGZpYl9oYXNoX2luaXQoaWQpOworCWlmICghdGIpCisJCXJldHVybiBOVUxMOworCWZpYl90YWJsZXNbaWRdID0gdGI7CisJcmV0dXJuIHRiOworfQorCisKKyNlbmRpZiAvKiBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTICovCisKKworc3RhdGljIHZvaWQgZmliX2ZsdXNoKHZvaWQpCit7CisJaW50IGZsdXNoZWQgPSAwOworI2lmZGVmIENPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVMKKwlzdHJ1Y3QgZmliX3RhYmxlICp0YjsKKwlpbnQgaWQ7CisKKwlmb3IgKGlkID0gUlRfVEFCTEVfTUFYOyBpZD4wOyBpZC0tKSB7CisJCWlmICgodGIgPSBmaWJfZ2V0X3RhYmxlKGlkKSk9PU5VTEwpCisJCQljb250aW51ZTsKKwkJZmx1c2hlZCArPSB0Yi0+dGJfZmx1c2godGIpOworCX0KKyNlbHNlIC8qIENPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVMgKi8KKwlmbHVzaGVkICs9IGlwX2ZpYl9tYWluX3RhYmxlLT50Yl9mbHVzaChpcF9maWJfbWFpbl90YWJsZSk7CisJZmx1c2hlZCArPSBpcF9maWJfbG9jYWxfdGFibGUtPnRiX2ZsdXNoKGlwX2ZpYl9sb2NhbF90YWJsZSk7CisjZW5kaWYgLyogQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUyAqLworCisJaWYgKGZsdXNoZWQpCisJCXJ0X2NhY2hlX2ZsdXNoKC0xKTsKK30KKworLyoKKyAqCUZpbmQgdGhlIGZpcnN0IGRldmljZSB3aXRoIGEgZ2l2ZW4gc291cmNlIGFkZHJlc3MuCisgKi8KKworc3RydWN0IG5ldF9kZXZpY2UgKiBpcF9kZXZfZmluZCh1MzIgYWRkcikKK3sKKwlzdHJ1Y3QgZmxvd2kgZmwgPSB7IC5ubF91ID0geyAuaXA0X3UgPSB7IC5kYWRkciA9IGFkZHIgfSB9IH07CisJc3RydWN0IGZpYl9yZXN1bHQgcmVzOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCisjaWZkZWYgQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUworCXJlcy5yID0gTlVMTDsKKyNlbmRpZgorCisJaWYgKCFpcF9maWJfbG9jYWxfdGFibGUgfHwKKwkgICAgaXBfZmliX2xvY2FsX3RhYmxlLT50Yl9sb29rdXAoaXBfZmliX2xvY2FsX3RhYmxlLCAmZmwsICZyZXMpKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAocmVzLnR5cGUgIT0gUlROX0xPQ0FMKQorCQlnb3RvIG91dDsKKwlkZXYgPSBGSUJfUkVTX0RFVihyZXMpOworCisJaWYgKGRldikKKwkJZGV2X2hvbGQoZGV2KTsKK291dDoKKwlmaWJfcmVzX3B1dCgmcmVzKTsKKwlyZXR1cm4gZGV2OworfQorCit1bnNpZ25lZCBpbmV0X2FkZHJfdHlwZSh1MzIgYWRkcikKK3sKKwlzdHJ1Y3QgZmxvd2kJCWZsID0geyAubmxfdSA9IHsgLmlwNF91ID0geyAuZGFkZHIgPSBhZGRyIH0gfSB9OworCXN0cnVjdCBmaWJfcmVzdWx0CXJlczsKKwl1bnNpZ25lZCByZXQgPSBSVE5fQlJPQURDQVNUOworCisJaWYgKFpFUk9ORVQoYWRkcikgfHwgQkFEQ0xBU1MoYWRkcikpCisJCXJldHVybiBSVE5fQlJPQURDQVNUOworCWlmIChNVUxUSUNBU1QoYWRkcikpCisJCXJldHVybiBSVE5fTVVMVElDQVNUOworCisjaWZkZWYgQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUworCXJlcy5yID0gTlVMTDsKKyNlbmRpZgorCQorCWlmIChpcF9maWJfbG9jYWxfdGFibGUpIHsKKwkJcmV0ID0gUlROX1VOSUNBU1Q7CisJCWlmICghaXBfZmliX2xvY2FsX3RhYmxlLT50Yl9sb29rdXAoaXBfZmliX2xvY2FsX3RhYmxlLAorCQkJCQkJICAgJmZsLCAmcmVzKSkgeworCQkJcmV0ID0gcmVzLnR5cGU7CisJCQlmaWJfcmVzX3B1dCgmcmVzKTsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBHaXZlbiAocGFja2V0IHNvdXJjZSwgaW5wdXQgaW50ZXJmYWNlKSBhbmQgb3B0aW9uYWwgKGRzdCwgb2lmLCB0b3MpOgorICAgLSAobWFpbikgY2hlY2ssIHRoYXQgc291cmNlIGlzIHZhbGlkIGkuZS4gbm90IGJyb2FkY2FzdCBvciBvdXIgbG9jYWwKKyAgICAgYWRkcmVzcy4KKyAgIC0gZmlndXJlIG91dCB3aGF0ICJsb2dpY2FsIiBpbnRlcmZhY2UgdGhpcyBwYWNrZXQgYXJyaXZlZAorICAgICBhbmQgY2FsY3VsYXRlICJzcGVjaWZpYyBkZXN0aW5hdGlvbiIgYWRkcmVzcy4KKyAgIC0gY2hlY2ssIHRoYXQgcGFja2V0IGFycml2ZWQgZnJvbSBleHBlY3RlZCBwaHlzaWNhbCBpbnRlcmZhY2UuCisgKi8KKworaW50IGZpYl92YWxpZGF0ZV9zb3VyY2UodTMyIHNyYywgdTMyIGRzdCwgdTggdG9zLCBpbnQgb2lmLAorCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyICpzcGVjX2RzdCwgdTMyICppdGFnKQoreworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKwlzdHJ1Y3QgZmxvd2kgZmwgPSB7IC5ubF91ID0geyAuaXA0X3UgPQorCQkJCSAgICAgIHsgLmRhZGRyID0gc3JjLAorCQkJCQkuc2FkZHIgPSBkc3QsCisJCQkJCS50b3MgPSB0b3MgfSB9LAorCQkJICAgIC5paWYgPSBvaWYgfTsKKwlzdHJ1Y3QgZmliX3Jlc3VsdCByZXM7CisJaW50IG5vX2FkZHIsIHJwZjsKKwlpbnQgcmV0OworCisJbm9fYWRkciA9IHJwZiA9IDA7CisJcmN1X3JlYWRfbG9jaygpOworCWluX2RldiA9IF9faW5fZGV2X2dldChkZXYpOworCWlmIChpbl9kZXYpIHsKKwkJbm9fYWRkciA9IGluX2Rldi0+aWZhX2xpc3QgPT0gTlVMTDsKKwkJcnBmID0gSU5fREVWX1JQRklMVEVSKGluX2Rldik7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJaWYgKGluX2RldiA9PSBOVUxMKQorCQlnb3RvIGVfaW52YWw7CisKKwlpZiAoZmliX2xvb2t1cCgmZmwsICZyZXMpKQorCQlnb3RvIGxhc3RfcmVzb3J0OworCWlmIChyZXMudHlwZSAhPSBSVE5fVU5JQ0FTVCkKKwkJZ290byBlX2ludmFsX3JlczsKKwkqc3BlY19kc3QgPSBGSUJfUkVTX1BSRUZTUkMocmVzKTsKKwlmaWJfY29tYmluZV9pdGFnKGl0YWcsICZyZXMpOworI2lmZGVmIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEgKKwlpZiAoRklCX1JFU19ERVYocmVzKSA9PSBkZXYgfHwgcmVzLmZpLT5maWJfbmhzID4gMSkKKyNlbHNlCisJaWYgKEZJQl9SRVNfREVWKHJlcykgPT0gZGV2KQorI2VuZGlmCisJeworCQlyZXQgPSBGSUJfUkVTX05IKHJlcykubmhfc2NvcGUgPj0gUlRfU0NPUEVfSE9TVDsKKwkJZmliX3Jlc19wdXQoJnJlcyk7CisJCXJldHVybiByZXQ7CisJfQorCWZpYl9yZXNfcHV0KCZyZXMpOworCWlmIChub19hZGRyKQorCQlnb3RvIGxhc3RfcmVzb3J0OworCWlmIChycGYpCisJCWdvdG8gZV9pbnZhbDsKKwlmbC5vaWYgPSBkZXYtPmlmaW5kZXg7CisKKwlyZXQgPSAwOworCWlmIChmaWJfbG9va3VwKCZmbCwgJnJlcykgPT0gMCkgeworCQlpZiAocmVzLnR5cGUgPT0gUlROX1VOSUNBU1QpIHsKKwkJCSpzcGVjX2RzdCA9IEZJQl9SRVNfUFJFRlNSQyhyZXMpOworCQkJcmV0ID0gRklCX1JFU19OSChyZXMpLm5oX3Njb3BlID49IFJUX1NDT1BFX0hPU1Q7CisJCX0KKwkJZmliX3Jlc19wdXQoJnJlcyk7CisJfQorCXJldHVybiByZXQ7CisKK2xhc3RfcmVzb3J0OgorCWlmIChycGYpCisJCWdvdG8gZV9pbnZhbDsKKwkqc3BlY19kc3QgPSBpbmV0X3NlbGVjdF9hZGRyKGRldiwgMCwgUlRfU0NPUEVfVU5JVkVSU0UpOworCSppdGFnID0gMDsKKwlyZXR1cm4gMDsKKworZV9pbnZhbF9yZXM6CisJZmliX3Jlc19wdXQoJnJlcyk7CitlX2ludmFsOgorCXJldHVybiAtRUlOVkFMOworfQorCisjaWZuZGVmIENPTkZJR19JUF9OT1NJT0NSVAorCisvKgorICoJSGFuZGxlIElQIHJvdXRpbmcgaW9jdGwgY2FsbHMuIFRoZXNlIGFyZSB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIHJvdXRpbmcgdGFibGVzCisgKi8KKyAKK2ludCBpcF9ydF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCWludCBlcnI7CisJc3RydWN0IGtlcm5fcnRhIHJ0YTsKKwlzdHJ1Y3QgcnRlbnRyeSAgcjsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIgbmxoOworCQlzdHJ1Y3QgcnRtc2cJcnRtOworCX0gcmVxOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NBRERSVDoJCS8qIEFkZCBhIHJvdXRlICovCisJY2FzZSBTSU9DREVMUlQ6CQkvKiBEZWxldGUgYSByb3V0ZSAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnIsIGFyZywgc2l6ZW9mKHN0cnVjdCBydGVudHJ5KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcnRubF9sb2NrKCk7CisJCWVyciA9IGZpYl9jb252ZXJ0X3J0ZW50cnkoY21kLCAmcmVxLm5saCwgJnJlcS5ydG0sICZydGEsICZyKTsKKwkJaWYgKGVyciA9PSAwKSB7CisJCQlpZiAoY21kID09IFNJT0NERUxSVCkgeworCQkJCXN0cnVjdCBmaWJfdGFibGUgKnRiID0gZmliX2dldF90YWJsZShyZXEucnRtLnJ0bV90YWJsZSk7CisJCQkJZXJyID0gLUVTUkNIOworCQkJCWlmICh0YikKKwkJCQkJZXJyID0gdGItPnRiX2RlbGV0ZSh0YiwgJnJlcS5ydG0sICZydGEsICZyZXEubmxoLCBOVUxMKTsKKwkJCX0gZWxzZSB7CisJCQkJc3RydWN0IGZpYl90YWJsZSAqdGIgPSBmaWJfbmV3X3RhYmxlKHJlcS5ydG0ucnRtX3RhYmxlKTsKKwkJCQllcnIgPSAtRU5PQlVGUzsKKwkJCQlpZiAodGIpCisJCQkJCWVyciA9IHRiLT50Yl9pbnNlcnQodGIsICZyZXEucnRtLCAmcnRhLCAmcmVxLm5saCwgTlVMTCk7CisJCQl9CisJCQlpZiAocnRhLnJ0YV9teCkKKwkJCQlrZnJlZShydGEucnRhX214KTsKKwkJfQorCQlydG5sX3VubG9jaygpOworCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworI2Vsc2UKKworaW50IGlwX3J0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworI2VuZGlmCisKK3N0YXRpYyBpbnQgaW5ldF9jaGVja19hdHRyKHN0cnVjdCBydG1zZyAqciwgc3RydWN0IHJ0YXR0ciAqKnJ0YSkKK3sKKwlpbnQgaTsKKworCWZvciAoaT0xOyBpPD1SVEFfTUFYOyBpKyspIHsKKwkJc3RydWN0IHJ0YXR0ciAqYXR0ciA9IHJ0YVtpLTFdOworCQlpZiAoYXR0cikgeworCQkJaWYgKFJUQV9QQVlMT0FEKGF0dHIpIDwgNCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChpICE9IFJUQV9NVUxUSVBBVEggJiYgaSAhPSBSVEFfTUVUUklDUykKKwkJCQlydGFbaS0xXSA9IChzdHJ1Y3QgcnRhdHRyKilSVEFfREFUQShhdHRyKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGluZXRfcnRtX2RlbHJvdXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciogbmxoLCB2b2lkICphcmcpCit7CisJc3RydWN0IGZpYl90YWJsZSAqIHRiOworCXN0cnVjdCBydGF0dHIgKipydGEgPSBhcmc7CisJc3RydWN0IHJ0bXNnICpyID0gTkxNU0dfREFUQShubGgpOworCisJaWYgKGluZXRfY2hlY2tfYXR0cihyLCBydGEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRiID0gZmliX2dldF90YWJsZShyLT5ydG1fdGFibGUpOworCWlmICh0YikKKwkJcmV0dXJuIHRiLT50Yl9kZWxldGUodGIsIHIsIChzdHJ1Y3Qga2Vybl9ydGEqKXJ0YSwgbmxoLCAmTkVUTElOS19DQihza2IpKTsKKwlyZXR1cm4gLUVTUkNIOworfQorCitpbnQgaW5ldF9ydG1fbmV3cm91dGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyKiBubGgsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZmliX3RhYmxlICogdGI7CisJc3RydWN0IHJ0YXR0ciAqKnJ0YSA9IGFyZzsKKwlzdHJ1Y3QgcnRtc2cgKnIgPSBOTE1TR19EQVRBKG5saCk7CisKKwlpZiAoaW5ldF9jaGVja19hdHRyKHIsIHJ0YSkpCisJCXJldHVybiAtRUlOVkFMOworCisJdGIgPSBmaWJfbmV3X3RhYmxlKHItPnJ0bV90YWJsZSk7CisJaWYgKHRiKQorCQlyZXR1cm4gdGItPnRiX2luc2VydCh0YiwgciwgKHN0cnVjdCBrZXJuX3J0YSopcnRhLCBubGgsICZORVRMSU5LX0NCKHNrYikpOworCXJldHVybiAtRU5PQlVGUzsKK30KKworaW50IGluZXRfZHVtcF9maWIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCWludCB0OworCWludCBzX3Q7CisJc3RydWN0IGZpYl90YWJsZSAqdGI7CisKKwlpZiAoTkxNU0dfUEFZTE9BRChjYi0+bmxoLCAwKSA+PSBzaXplb2Yoc3RydWN0IHJ0bXNnKSAmJgorCSAgICAoKHN0cnVjdCBydG1zZyopTkxNU0dfREFUQShjYi0+bmxoKSktPnJ0bV9mbGFncyZSVE1fRl9DTE9ORUQpCisJCXJldHVybiBpcF9ydF9kdW1wKHNrYiwgY2IpOworCisJc190ID0gY2ItPmFyZ3NbMF07CisJaWYgKHNfdCA9PSAwKQorCQlzX3QgPSBjYi0+YXJnc1swXSA9IFJUX1RBQkxFX01JTjsKKworCWZvciAodD1zX3Q7IHQ8PVJUX1RBQkxFX01BWDsgdCsrKSB7CisJCWlmICh0IDwgc190KSBjb250aW51ZTsKKwkJaWYgKHQgPiBzX3QpCisJCQltZW1zZXQoJmNiLT5hcmdzWzFdLCAwLCBzaXplb2YoY2ItPmFyZ3MpLXNpemVvZihjYi0+YXJnc1swXSkpOworCQlpZiAoKHRiID0gZmliX2dldF90YWJsZSh0KSk9PU5VTEwpCisJCQljb250aW51ZTsKKwkJaWYgKHRiLT50Yl9kdW1wKHRiLCBza2IsIGNiKSA8IDApIAorCQkJYnJlYWs7CisJfQorCisJY2ItPmFyZ3NbMF0gPSB0OworCisJcmV0dXJuIHNrYi0+bGVuOworfQorCisvKiBQcmVwYXJlIGFuZCBmZWVkIGludHJhLWtlcm5lbCByb3V0aW5nIHJlcXVlc3QuCisgICBSZWFsbHksIGl0IHNob3VsZCBiZSBuZXRsaW5rIG1lc3NhZ2UsIGJ1dCA6LSggbmV0bGluaworICAgY2FuIGJlIG5vdCBjb25maWd1cmVkLCBzbyB0aGF0IHdlIGZlZWQgaXQgZGlyZWN0bHkKKyAgIHRvIGZpYiBlbmdpbmUuIEl0IGlzIGxlZ2FsLCBiZWNhdXNlIGFsbCBldmVudHMgb2NjdXIKKyAgIG9ubHkgd2hlbiBuZXRsaW5rIGlzIGFscmVhZHkgbG9ja2VkLgorICovCisKK3N0YXRpYyB2b2lkIGZpYl9tYWdpYyhpbnQgY21kLCBpbnQgdHlwZSwgdTMyIGRzdCwgaW50IGRzdF9sZW4sIHN0cnVjdCBpbl9pZmFkZHIgKmlmYSkKK3sKKwlzdHJ1Y3QgZmliX3RhYmxlICogdGI7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyCW5saDsKKwkJc3RydWN0IHJ0bXNnCXJ0bTsKKwl9IHJlcTsKKwlzdHJ1Y3Qga2Vybl9ydGEgcnRhOworCisJbWVtc2V0KCZyZXEucnRtLCAwLCBzaXplb2YocmVxLnJ0bSkpOworCW1lbXNldCgmcnRhLCAwLCBzaXplb2YocnRhKSk7CisKKwlpZiAodHlwZSA9PSBSVE5fVU5JQ0FTVCkKKwkJdGIgPSBmaWJfbmV3X3RhYmxlKFJUX1RBQkxFX01BSU4pOworCWVsc2UKKwkJdGIgPSBmaWJfbmV3X3RhYmxlKFJUX1RBQkxFX0xPQ0FMKTsKKworCWlmICh0YiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlyZXEubmxoLm5sbXNnX2xlbiA9IHNpemVvZihyZXEpOworCXJlcS5ubGgubmxtc2dfdHlwZSA9IGNtZDsKKwlyZXEubmxoLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVHxOTE1fRl9DUkVBVEV8TkxNX0ZfQVBQRU5EOworCXJlcS5ubGgubmxtc2dfcGlkID0gMDsKKwlyZXEubmxoLm5sbXNnX3NlcSA9IDA7CisKKwlyZXEucnRtLnJ0bV9kc3RfbGVuID0gZHN0X2xlbjsKKwlyZXEucnRtLnJ0bV90YWJsZSA9IHRiLT50Yl9pZDsKKwlyZXEucnRtLnJ0bV9wcm90b2NvbCA9IFJUUFJPVF9LRVJORUw7CisJcmVxLnJ0bS5ydG1fc2NvcGUgPSAodHlwZSAhPSBSVE5fTE9DQUwgPyBSVF9TQ09QRV9MSU5LIDogUlRfU0NPUEVfSE9TVCk7CisJcmVxLnJ0bS5ydG1fdHlwZSA9IHR5cGU7CisKKwlydGEucnRhX2RzdCA9ICZkc3Q7CisJcnRhLnJ0YV9wcmVmc3JjID0gJmlmYS0+aWZhX2xvY2FsOworCXJ0YS5ydGFfb2lmID0gJmlmYS0+aWZhX2Rldi0+ZGV2LT5pZmluZGV4OworCisJaWYgKGNtZCA9PSBSVE1fTkVXUk9VVEUpCisJCXRiLT50Yl9pbnNlcnQodGIsICZyZXEucnRtLCAmcnRhLCAmcmVxLm5saCwgTlVMTCk7CisJZWxzZQorCQl0Yi0+dGJfZGVsZXRlKHRiLCAmcmVxLnJ0bSwgJnJ0YSwgJnJlcS5ubGgsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBmaWJfYWRkX2lmYWRkcihzdHJ1Y3QgaW5faWZhZGRyICppZmEpCit7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gaWZhLT5pZmFfZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpbl9kZXYtPmRldjsKKwlzdHJ1Y3QgaW5faWZhZGRyICpwcmltID0gaWZhOworCXUzMiBtYXNrID0gaWZhLT5pZmFfbWFzazsKKwl1MzIgYWRkciA9IGlmYS0+aWZhX2xvY2FsOworCXUzMiBwcmVmaXggPSBpZmEtPmlmYV9hZGRyZXNzJm1hc2s7CisKKwlpZiAoaWZhLT5pZmFfZmxhZ3MmSUZBX0ZfU0VDT05EQVJZKSB7CisJCXByaW0gPSBpbmV0X2lmYV9ieXByZWZpeChpbl9kZXYsIHByZWZpeCwgbWFzayk7CisJCWlmIChwcmltID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJmaWJfYWRkX2lmYWRkcjogYnVnOiBwcmltID09IE5VTExcbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJZmliX21hZ2ljKFJUTV9ORVdST1VURSwgUlROX0xPQ0FMLCBhZGRyLCAzMiwgcHJpbSk7CisKKwlpZiAoIShkZXYtPmZsYWdzJklGRl9VUCkpCisJCXJldHVybjsKKworCS8qIEFkZCBicm9hZGNhc3QgYWRkcmVzcywgaWYgaXQgaXMgZXhwbGljaXRseSBhc3NpZ25lZC4gKi8KKwlpZiAoaWZhLT5pZmFfYnJvYWRjYXN0ICYmIGlmYS0+aWZhX2Jyb2FkY2FzdCAhPSAweEZGRkZGRkZGKQorCQlmaWJfbWFnaWMoUlRNX05FV1JPVVRFLCBSVE5fQlJPQURDQVNULCBpZmEtPmlmYV9icm9hZGNhc3QsIDMyLCBwcmltKTsKKworCWlmICghWkVST05FVChwcmVmaXgpICYmICEoaWZhLT5pZmFfZmxhZ3MmSUZBX0ZfU0VDT05EQVJZKSAmJgorCSAgICAocHJlZml4ICE9IGFkZHIgfHwgaWZhLT5pZmFfcHJlZml4bGVuIDwgMzIpKSB7CisJCWZpYl9tYWdpYyhSVE1fTkVXUk9VVEUsIGRldi0+ZmxhZ3MmSUZGX0xPT1BCQUNLID8gUlROX0xPQ0FMIDoKKwkJCSAgUlROX1VOSUNBU1QsIHByZWZpeCwgaWZhLT5pZmFfcHJlZml4bGVuLCBwcmltKTsKKworCQkvKiBBZGQgbmV0d29yayBzcGVjaWZpYyBicm9hZGNhc3RzLCB3aGVuIGl0IHRha2VzIGEgc2Vuc2UgKi8KKwkJaWYgKGlmYS0+aWZhX3ByZWZpeGxlbiA8IDMxKSB7CisJCQlmaWJfbWFnaWMoUlRNX05FV1JPVVRFLCBSVE5fQlJPQURDQVNULCBwcmVmaXgsIDMyLCBwcmltKTsKKwkJCWZpYl9tYWdpYyhSVE1fTkVXUk9VVEUsIFJUTl9CUk9BRENBU1QsIHByZWZpeHx+bWFzaywgMzIsIHByaW0pOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBmaWJfZGVsX2lmYWRkcihzdHJ1Y3QgaW5faWZhZGRyICppZmEpCit7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gaWZhLT5pZmFfZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpbl9kZXYtPmRldjsKKwlzdHJ1Y3QgaW5faWZhZGRyICppZmExOworCXN0cnVjdCBpbl9pZmFkZHIgKnByaW0gPSBpZmE7CisJdTMyIGJyZCA9IGlmYS0+aWZhX2FkZHJlc3N8fmlmYS0+aWZhX21hc2s7CisJdTMyIGFueSA9IGlmYS0+aWZhX2FkZHJlc3MmaWZhLT5pZmFfbWFzazsKKyNkZWZpbmUgTE9DQUxfT0sJMQorI2RlZmluZSBCUkRfT0sJCTIKKyNkZWZpbmUgQlJEMF9PSwkJNAorI2RlZmluZSBCUkQxX09LCQk4CisJdW5zaWduZWQgb2sgPSAwOworCisJaWYgKCEoaWZhLT5pZmFfZmxhZ3MmSUZBX0ZfU0VDT05EQVJZKSkKKwkJZmliX21hZ2ljKFJUTV9ERUxST1VURSwgZGV2LT5mbGFncyZJRkZfTE9PUEJBQ0sgPyBSVE5fTE9DQUwgOgorCQkJICBSVE5fVU5JQ0FTVCwgYW55LCBpZmEtPmlmYV9wcmVmaXhsZW4sIHByaW0pOworCWVsc2UgeworCQlwcmltID0gaW5ldF9pZmFfYnlwcmVmaXgoaW5fZGV2LCBhbnksIGlmYS0+aWZhX21hc2spOworCQlpZiAocHJpbSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiZmliX2RlbF9pZmFkZHI6IGJ1ZzogcHJpbSA9PSBOVUxMXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qIERlbGV0aW9uIGlzIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBhZGQuCisJICAgV2Ugc2hvdWxkIHRha2UgY2FyZSBvZiBub3QgdG8gZGVsZXRlIHRvbyBtdWNoIDotKQorCisJICAgU2NhbiBhZGRyZXNzIGxpc3QgdG8gYmUgc3VyZSB0aGF0IGFkZHJlc3NlcyBhcmUgcmVhbGx5IGdvbmUuCisJICovCisKKwlmb3IgKGlmYTEgPSBpbl9kZXYtPmlmYV9saXN0OyBpZmExOyBpZmExID0gaWZhMS0+aWZhX25leHQpIHsKKwkJaWYgKGlmYS0+aWZhX2xvY2FsID09IGlmYTEtPmlmYV9sb2NhbCkKKwkJCW9rIHw9IExPQ0FMX09LOworCQlpZiAoaWZhLT5pZmFfYnJvYWRjYXN0ID09IGlmYTEtPmlmYV9icm9hZGNhc3QpCisJCQlvayB8PSBCUkRfT0s7CisJCWlmIChicmQgPT0gaWZhMS0+aWZhX2Jyb2FkY2FzdCkKKwkJCW9rIHw9IEJSRDFfT0s7CisJCWlmIChhbnkgPT0gaWZhMS0+aWZhX2Jyb2FkY2FzdCkKKwkJCW9rIHw9IEJSRDBfT0s7CisJfQorCisJaWYgKCEob2smQlJEX09LKSkKKwkJZmliX21hZ2ljKFJUTV9ERUxST1VURSwgUlROX0JST0FEQ0FTVCwgaWZhLT5pZmFfYnJvYWRjYXN0LCAzMiwgcHJpbSk7CisJaWYgKCEob2smQlJEMV9PSykpCisJCWZpYl9tYWdpYyhSVE1fREVMUk9VVEUsIFJUTl9CUk9BRENBU1QsIGJyZCwgMzIsIHByaW0pOworCWlmICghKG9rJkJSRDBfT0spKQorCQlmaWJfbWFnaWMoUlRNX0RFTFJPVVRFLCBSVE5fQlJPQURDQVNULCBhbnksIDMyLCBwcmltKTsKKwlpZiAoIShvayZMT0NBTF9PSykpIHsKKwkJZmliX21hZ2ljKFJUTV9ERUxST1VURSwgUlROX0xPQ0FMLCBpZmEtPmlmYV9sb2NhbCwgMzIsIHByaW0pOworCisJCS8qIENoZWNrLCB0aGF0IHRoaXMgbG9jYWwgYWRkcmVzcyBmaW5hbGx5IGRpc2FwcGVhcmVkLiAqLworCQlpZiAoaW5ldF9hZGRyX3R5cGUoaWZhLT5pZmFfbG9jYWwpICE9IFJUTl9MT0NBTCkgeworCQkJLyogQW5kIHRoZSBsYXN0LCBidXQgbm90IHRoZSBsZWFzdCB0aGluZy4KKwkJCSAgIFdlIG11c3QgZmx1c2ggc3RyYXkgRklCIGVudHJpZXMuCisKKwkJCSAgIEZpcnN0IG9mIGFsbCwgd2Ugc2NhbiBmaWJfaW5mbyBsaXN0IHNlYXJjaGluZworCQkJICAgZm9yIHN0cmF5IG5leHRob3AgZW50cmllcywgdGhlbiBpZ25pdGUgZmliX2ZsdXNoLgorCQkJKi8KKwkJCWlmIChmaWJfc3luY19kb3duKGlmYS0+aWZhX2xvY2FsLCBOVUxMLCAwKSkKKwkJCQlmaWJfZmx1c2goKTsKKwkJfQorCX0KKyN1bmRlZiBMT0NBTF9PSworI3VuZGVmIEJSRF9PSworI3VuZGVmIEJSRDBfT0sKKyN1bmRlZiBCUkQxX09LCit9CisKK3N0YXRpYyB2b2lkIGZpYl9kaXNhYmxlX2lwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBmb3JjZSkKK3sKKwlpZiAoZmliX3N5bmNfZG93bigwLCBkZXYsIGZvcmNlKSkKKwkJZmliX2ZsdXNoKCk7CisJcnRfY2FjaGVfZmx1c2goMCk7CisJYXJwX2lmZG93bihkZXYpOworfQorCitzdGF0aWMgaW50IGZpYl9pbmV0YWRkcl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgaW5faWZhZGRyICppZmEgPSAoc3RydWN0IGluX2lmYWRkciopcHRyOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX1VQOgorCQlmaWJfYWRkX2lmYWRkcihpZmEpOworI2lmZGVmIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEgKKwkJZmliX3N5bmNfdXAoaWZhLT5pZmFfZGV2LT5kZXYpOworI2VuZGlmCisJCXJ0X2NhY2hlX2ZsdXNoKC0xKTsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfRE9XTjoKKwkJZmliX2RlbF9pZmFkZHIoaWZhKTsKKwkJaWYgKGlmYS0+aWZhX2RldiAmJiBpZmEtPmlmYV9kZXYtPmlmYV9saXN0ID09IE5VTEwpIHsKKwkJCS8qIExhc3QgYWRkcmVzcyB3YXMgZGVsZXRlZCBmcm9tIHRoaXMgaW50ZXJmYWNlLgorCQkJICAgRGlzYWJsZSBJUC4KKwkJCSAqLworCQkJZmliX2Rpc2FibGVfaXAoaWZhLT5pZmFfZGV2LT5kZXYsIDEpOworCQl9IGVsc2UgeworCQkJcnRfY2FjaGVfZmx1c2goLTEpOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBpbnQgZmliX25ldGRldl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHRyOworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiA9IF9faW5fZGV2X2dldChkZXYpOworCisJaWYgKGV2ZW50ID09IE5FVERFVl9VTlJFR0lTVEVSKSB7CisJCWZpYl9kaXNhYmxlX2lwKGRldiwgMik7CisJCXJldHVybiBOT1RJRllfRE9ORTsKKwl9CisKKwlpZiAoIWluX2RldikKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX1VQOgorCQlmb3JfaWZhKGluX2RldikgeworCQkJZmliX2FkZF9pZmFkZHIoaWZhKTsKKwkJfSBlbmRmb3JfaWZhKGluX2Rldik7CisjaWZkZWYgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSAorCQlmaWJfc3luY191cChkZXYpOworI2VuZGlmCisJCXJ0X2NhY2hlX2ZsdXNoKC0xKTsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfRE9XTjoKKwkJZmliX2Rpc2FibGVfaXAoZGV2LCAwKTsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfQ0hBTkdFTVRVOgorCWNhc2UgTkVUREVWX0NIQU5HRToKKwkJcnRfY2FjaGVfZmx1c2goMCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZmliX2luZXRhZGRyX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID1maWJfaW5ldGFkZHJfZXZlbnQsCit9OworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGZpYl9uZXRkZXZfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPWZpYl9uZXRkZXZfZXZlbnQsCit9OworCit2b2lkIF9faW5pdCBpcF9maWJfaW5pdCh2b2lkKQoreworI2lmbmRlZiBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTCisJaXBfZmliX2xvY2FsX3RhYmxlID0gZmliX2hhc2hfaW5pdChSVF9UQUJMRV9MT0NBTCk7CisJaXBfZmliX21haW5fdGFibGUgID0gZmliX2hhc2hfaW5pdChSVF9UQUJMRV9NQUlOKTsKKyNlbHNlCisJZmliX3J1bGVzX2luaXQoKTsKKyNlbmRpZgorCisJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZmaWJfbmV0ZGV2X25vdGlmaWVyKTsKKwlyZWdpc3Rlcl9pbmV0YWRkcl9ub3RpZmllcigmZmliX2luZXRhZGRyX25vdGlmaWVyKTsKK30KKworRVhQT1JUX1NZTUJPTChpbmV0X2FkZHJfdHlwZSk7CitFWFBPUlRfU1lNQk9MKGlwX2Rldl9maW5kKTsKK0VYUE9SVF9TWU1CT0woaXBfcnRfaW9jdGwpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZmliX2hhc2guYyBiL25ldC9pcHY0L2ZpYl9oYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwNmRjYwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L2ZpYl9oYXNoLmMKQEAgLTAsMCArMSwxMDg2IEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCUlQdjQgRklCOiBsb29rdXAgZW5naW5lIGFuZCBtYWludGVuYW5jZSByb3V0aW5lcy4KKyAqCisgKiBWZXJzaW9uOgkkSWQ6IGZpYl9oYXNoLmMsdiAxLjEzIDIwMDEvMTAvMzEgMjE6NTU6NTQgZGF2ZW0gRXhwICQKKyAqCisgKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2lwX2ZpYi5oPgorCisjaW5jbHVkZSAiZmliX2xvb2t1cC5oIgorCitzdGF0aWMga21lbV9jYWNoZV90ICpmbl9oYXNoX2ttZW07CitzdGF0aWMga21lbV9jYWNoZV90ICpmbl9hbGlhc19rbWVtOworCitzdHJ1Y3QgZmliX25vZGUgeworCXN0cnVjdCBobGlzdF9ub2RlCWZuX2hhc2g7CisJc3RydWN0IGxpc3RfaGVhZAlmbl9hbGlhczsKKwl1MzIJCQlmbl9rZXk7Cit9OworCitzdHJ1Y3QgZm5fem9uZSB7CisJc3RydWN0IGZuX3pvbmUJCSpmel9uZXh0OwkvKiBOZXh0IG5vdCBlbXB0eSB6b25lCSovCisJc3RydWN0IGhsaXN0X2hlYWQJKmZ6X2hhc2g7CS8qIEhhc2ggdGFibGUgcG9pbnRlcgkqLworCWludAkJCWZ6X25lbnQ7CS8qIE51bWJlciBvZiBlbnRyaWVzCSovCisKKwlpbnQJCQlmel9kaXZpc29yOwkvKiBIYXNoIGRpdmlzb3IJCSovCisJdTMyCQkJZnpfaGFzaG1hc2s7CS8qIChmel9kaXZpc29yIC0gMSkJKi8KKyNkZWZpbmUgRlpfSEFTSE1BU0soZnopCQkoKGZ6KS0+ZnpfaGFzaG1hc2spCisKKwlpbnQJCQlmel9vcmRlcjsJLyogWm9uZSBvcmRlcgkJKi8KKwl1MzIJCQlmel9tYXNrOworI2RlZmluZSBGWl9NQVNLKGZ6KQkJKChmeiktPmZ6X21hc2spCit9OworCisvKiBOT1RFLiBPbiBmYXN0IGNvbXB1dGVycyBldmFsdWF0aW9uIG9mIGZ6X2hhc2htYXNrIGFuZCBmel9tYXNrCisgKiBjYW4gYmUgY2hlYXBlciB0aGFuIG1lbW9yeSBsb29rdXAsIHNvIHRoYXQgRlpfKiBtYWNyb3MgYXJlIHVzZWQuCisgKi8KKworc3RydWN0IGZuX2hhc2ggeworCXN0cnVjdCBmbl96b25lCSpmbl96b25lc1szM107CisJc3RydWN0IGZuX3pvbmUJKmZuX3pvbmVfbGlzdDsKK307CisKK3N0YXRpYyBpbmxpbmUgdTMyIGZuX2hhc2godTMyIGtleSwgc3RydWN0IGZuX3pvbmUgKmZ6KQoreworCXUzMiBoID0gbnRvaGwoa2V5KT4+KDMyIC0gZnotPmZ6X29yZGVyKTsKKwloIF49IChoPj4yMCk7CisJaCBePSAoaD4+MTApOworCWggXj0gKGg+PjUpOworCWggJj0gRlpfSEFTSE1BU0soZnopOworCXJldHVybiBoOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBmel9rZXkodTMyIGRzdCwgc3RydWN0IGZuX3pvbmUgKmZ6KQoreworCXJldHVybiBkc3QgJiBGWl9NQVNLKGZ6KTsKK30KKworc3RhdGljIERFRklORV9SV0xPQ0soZmliX2hhc2hfbG9jayk7CitzdGF0aWMgdW5zaWduZWQgaW50IGZpYl9oYXNoX2dlbmlkOworCisjZGVmaW5lIEZaX01BWF9ESVZJU09SICgoUEFHRV9TSVpFPDxNQVhfT1JERVIpIC8gc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKSkKKworc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkICpmel9oYXNoX2FsbG9jKGludCBkaXZpc29yKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IGRpdmlzb3IgKiBzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpOworCisJaWYgKHNpemUgPD0gUEFHRV9TSVpFKSB7CisJCXJldHVybiBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCX0gZWxzZSB7CisJCXJldHVybiAoc3RydWN0IGhsaXN0X2hlYWQgKikKKwkJCV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgZ2V0X29yZGVyKHNpemUpKTsKKwl9Cit9CisKKy8qIFRoZSBmaWIgaGFzaCBsb2NrIG11c3QgYmUgaGVsZCB3aGVuIHRoaXMgaXMgY2FsbGVkLiAqLworc3RhdGljIGlubGluZSB2b2lkIGZuX3JlYnVpbGRfem9uZShzdHJ1Y3QgZm5fem9uZSAqZnosCisJCQkJICAgc3RydWN0IGhsaXN0X2hlYWQgKm9sZF9odCwKKwkJCQkgICBpbnQgb2xkX2Rpdmlzb3IpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgb2xkX2Rpdmlzb3I7IGkrKykgeworCQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKm47CisJCXN0cnVjdCBmaWJfbm9kZSAqZjsKKworCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGYsIG5vZGUsIG4sICZvbGRfaHRbaV0sIGZuX2hhc2gpIHsKKwkJCXN0cnVjdCBobGlzdF9oZWFkICpuZXdfaGVhZDsKKworCQkJaGxpc3RfZGVsKCZmLT5mbl9oYXNoKTsKKworCQkJbmV3X2hlYWQgPSAmZnotPmZ6X2hhc2hbZm5faGFzaChmLT5mbl9rZXksIGZ6KV07CisJCQlobGlzdF9hZGRfaGVhZCgmZi0+Zm5faGFzaCwgbmV3X2hlYWQpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBmel9oYXNoX2ZyZWUoc3RydWN0IGhsaXN0X2hlYWQgKmhhc2gsIGludCBkaXZpc29yKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IGRpdmlzb3IgKiBzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpOworCisJaWYgKHNpemUgPD0gUEFHRV9TSVpFKQorCQlrZnJlZShoYXNoKTsKKwllbHNlCisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpaGFzaCwgZ2V0X29yZGVyKHNpemUpKTsKK30KKworc3RhdGljIHZvaWQgZm5fcmVoYXNoX3pvbmUoc3RydWN0IGZuX3pvbmUgKmZ6KQoreworCXN0cnVjdCBobGlzdF9oZWFkICpodCwgKm9sZF9odDsKKwlpbnQgb2xkX2Rpdmlzb3IsIG5ld19kaXZpc29yOworCXUzMiBuZXdfaGFzaG1hc2s7CisJCQorCW9sZF9kaXZpc29yID0gZnotPmZ6X2Rpdmlzb3I7CisKKwlzd2l0Y2ggKG9sZF9kaXZpc29yKSB7CisJY2FzZSAxNjoKKwkJbmV3X2Rpdmlzb3IgPSAyNTY7CisJCWJyZWFrOworCWNhc2UgMjU2OgorCQluZXdfZGl2aXNvciA9IDEwMjQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmICgob2xkX2Rpdmlzb3IgPDwgMSkgPiBGWl9NQVhfRElWSVNPUikgeworCQkJcHJpbnRrKEtFUk5fQ1JJVCAicm91dGUuYzogYmFkIGRpdmlzb3IgJWQhXG4iLCBvbGRfZGl2aXNvcik7CisJCQlyZXR1cm47CisJCX0KKwkJbmV3X2Rpdmlzb3IgPSAob2xkX2Rpdmlzb3IgPDwgMSk7CisJCWJyZWFrOworCX0KKworCW5ld19oYXNobWFzayA9IChuZXdfZGl2aXNvciAtIDEpOworCisjaWYgUlRfQ0FDSEVfREVCVUcgPj0gMgorCXByaW50aygiZm5fcmVoYXNoX3pvbmU6IGhhc2ggZm9yIHpvbmUgJWQgZ3Jvd3MgZnJvbSAlZFxuIiwgZnotPmZ6X29yZGVyLCBvbGRfZGl2aXNvcik7CisjZW5kaWYKKworCWh0ID0gZnpfaGFzaF9hbGxvYyhuZXdfZGl2aXNvcik7CisKKwlpZiAoaHQpCXsKKwkJbWVtc2V0KGh0LCAwLCBuZXdfZGl2aXNvciAqIHNpemVvZihzdHJ1Y3QgaGxpc3RfaGVhZCkpOworCisJCXdyaXRlX2xvY2tfYmgoJmZpYl9oYXNoX2xvY2spOworCQlvbGRfaHQgPSBmei0+ZnpfaGFzaDsKKwkJZnotPmZ6X2hhc2ggPSBodDsKKwkJZnotPmZ6X2hhc2htYXNrID0gbmV3X2hhc2htYXNrOworCQlmei0+ZnpfZGl2aXNvciA9IG5ld19kaXZpc29yOworCQlmbl9yZWJ1aWxkX3pvbmUoZnosIG9sZF9odCwgb2xkX2Rpdmlzb3IpOworCQlmaWJfaGFzaF9nZW5pZCsrOworCQl3cml0ZV91bmxvY2tfYmgoJmZpYl9oYXNoX2xvY2spOworCisJCWZ6X2hhc2hfZnJlZShvbGRfaHQsIG9sZF9kaXZpc29yKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmbl9mcmVlX25vZGUoc3RydWN0IGZpYl9ub2RlICogZikKK3sKKwlrbWVtX2NhY2hlX2ZyZWUoZm5faGFzaF9rbWVtLCBmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZuX2ZyZWVfYWxpYXMoc3RydWN0IGZpYl9hbGlhcyAqZmEpCit7CisJZmliX3JlbGVhc2VfaW5mbyhmYS0+ZmFfaW5mbyk7CisJa21lbV9jYWNoZV9mcmVlKGZuX2FsaWFzX2ttZW0sIGZhKTsKK30KKworc3RhdGljIHN0cnVjdCBmbl96b25lICoKK2ZuX25ld196b25lKHN0cnVjdCBmbl9oYXNoICp0YWJsZSwgaW50IHopCit7CisJaW50IGk7CisJc3RydWN0IGZuX3pvbmUgKmZ6ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZuX3pvbmUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZ6KQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldChmeiwgMCwgc2l6ZW9mKHN0cnVjdCBmbl96b25lKSk7CisJaWYgKHopIHsKKwkJZnotPmZ6X2Rpdmlzb3IgPSAxNjsKKwl9IGVsc2UgeworCQlmei0+ZnpfZGl2aXNvciA9IDE7CisJfQorCWZ6LT5mel9oYXNobWFzayA9IChmei0+ZnpfZGl2aXNvciAtIDEpOworCWZ6LT5mel9oYXNoID0gZnpfaGFzaF9hbGxvYyhmei0+ZnpfZGl2aXNvcik7CisJaWYgKCFmei0+ZnpfaGFzaCkgeworCQlrZnJlZShmeik7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQoZnotPmZ6X2hhc2gsIDAsIGZ6LT5mel9kaXZpc29yICogc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkICopKTsKKwlmei0+Znpfb3JkZXIgPSB6OworCWZ6LT5mel9tYXNrID0gaW5ldF9tYWtlX21hc2soeik7CisKKwkvKiBGaW5kIHRoZSBmaXJzdCBub3QgZW1wdHkgem9uZSB3aXRoIG1vcmUgc3BlY2lmaWMgbWFzayAqLworCWZvciAoaT16KzE7IGk8PTMyOyBpKyspCisJCWlmICh0YWJsZS0+Zm5fem9uZXNbaV0pCisJCQlicmVhazsKKwl3cml0ZV9sb2NrX2JoKCZmaWJfaGFzaF9sb2NrKTsKKwlpZiAoaT4zMikgeworCQkvKiBObyBtb3JlIHNwZWNpZmljIG1hc2tzLCB3ZSBhcmUgdGhlIGZpcnN0LiAqLworCQlmei0+ZnpfbmV4dCA9IHRhYmxlLT5mbl96b25lX2xpc3Q7CisJCXRhYmxlLT5mbl96b25lX2xpc3QgPSBmejsKKwl9IGVsc2UgeworCQlmei0+ZnpfbmV4dCA9IHRhYmxlLT5mbl96b25lc1tpXS0+ZnpfbmV4dDsKKwkJdGFibGUtPmZuX3pvbmVzW2ldLT5mel9uZXh0ID0gZno7CisJfQorCXRhYmxlLT5mbl96b25lc1t6XSA9IGZ6OworCWZpYl9oYXNoX2dlbmlkKys7CisJd3JpdGVfdW5sb2NrX2JoKCZmaWJfaGFzaF9sb2NrKTsKKwlyZXR1cm4gZno7Cit9CisKK3N0YXRpYyBpbnQKK2ZuX2hhc2hfbG9va3VwKHN0cnVjdCBmaWJfdGFibGUgKnRiLCBjb25zdCBzdHJ1Y3QgZmxvd2kgKmZscCwgc3RydWN0IGZpYl9yZXN1bHQgKnJlcykKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBmbl96b25lICpmejsKKwlzdHJ1Y3QgZm5faGFzaCAqdCA9IChzdHJ1Y3QgZm5faGFzaCopdGItPnRiX2RhdGE7CisKKwlyZWFkX2xvY2soJmZpYl9oYXNoX2xvY2spOworCWZvciAoZnogPSB0LT5mbl96b25lX2xpc3Q7IGZ6OyBmeiA9IGZ6LT5mel9uZXh0KSB7CisJCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwkJc3RydWN0IGZpYl9ub2RlICpmOworCQl1MzIgayA9IGZ6X2tleShmbHAtPmZsNF9kc3QsIGZ6KTsKKworCQloZWFkID0gJmZ6LT5mel9oYXNoW2ZuX2hhc2goaywgZnopXTsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnkoZiwgbm9kZSwgaGVhZCwgZm5faGFzaCkgeworCQkJaWYgKGYtPmZuX2tleSAhPSBrKQorCQkJCWNvbnRpbnVlOworCisJCQllcnIgPSBmaWJfc2VtYW50aWNfbWF0Y2goJmYtPmZuX2FsaWFzLAorCQkJCQkJIGZscCwgcmVzLAorCQkJCQkJIGYtPmZuX2tleSwgZnotPmZ6X21hc2ssCisJCQkJCQkgZnotPmZ6X29yZGVyKTsKKwkJCWlmIChlcnIgPD0gMCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCX0KKwllcnIgPSAxOworb3V0OgorCXJlYWRfdW5sb2NrKCZmaWJfaGFzaF9sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGZuX2hhc2hfbGFzdF9kZmx0PS0xOworCitzdGF0aWMgdm9pZAorZm5faGFzaF9zZWxlY3RfZGVmYXVsdChzdHJ1Y3QgZmliX3RhYmxlICp0YiwgY29uc3Qgc3RydWN0IGZsb3dpICpmbHAsIHN0cnVjdCBmaWJfcmVzdWx0ICpyZXMpCit7CisJaW50IG9yZGVyLCBsYXN0X2lkeDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgZmliX25vZGUgKmY7CisJc3RydWN0IGZpYl9pbmZvICpmaSA9IE5VTEw7CisJc3RydWN0IGZpYl9pbmZvICpsYXN0X3Jlc29ydDsKKwlzdHJ1Y3QgZm5faGFzaCAqdCA9IChzdHJ1Y3QgZm5faGFzaCopdGItPnRiX2RhdGE7CisJc3RydWN0IGZuX3pvbmUgKmZ6ID0gdC0+Zm5fem9uZXNbMF07CisKKwlpZiAoZnogPT0gTlVMTCkKKwkJcmV0dXJuOworCisJbGFzdF9pZHggPSAtMTsKKwlsYXN0X3Jlc29ydCA9IE5VTEw7CisJb3JkZXIgPSAtMTsKKworCXJlYWRfbG9jaygmZmliX2hhc2hfbG9jayk7CisJaGxpc3RfZm9yX2VhY2hfZW50cnkoZiwgbm9kZSwgJmZ6LT5mel9oYXNoWzBdLCBmbl9oYXNoKSB7CisJCXN0cnVjdCBmaWJfYWxpYXMgKmZhOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmEsICZmLT5mbl9hbGlhcywgZmFfbGlzdCkgeworCQkJc3RydWN0IGZpYl9pbmZvICpuZXh0X2ZpID0gZmEtPmZhX2luZm87CisKKwkJCWlmIChmYS0+ZmFfc2NvcGUgIT0gcmVzLT5zY29wZSB8fAorCQkJICAgIGZhLT5mYV90eXBlICE9IFJUTl9VTklDQVNUKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAobmV4dF9maS0+ZmliX3ByaW9yaXR5ID4gcmVzLT5maS0+ZmliX3ByaW9yaXR5KQorCQkJCWJyZWFrOworCQkJaWYgKCFuZXh0X2ZpLT5maWJfbmhbMF0ubmhfZ3cgfHwKKwkJCSAgICBuZXh0X2ZpLT5maWJfbmhbMF0ubmhfc2NvcGUgIT0gUlRfU0NPUEVfTElOSykKKwkJCQljb250aW51ZTsKKwkJCWZhLT5mYV9zdGF0ZSB8PSBGQV9TX0FDQ0VTU0VEOworCisJCQlpZiAoZmkgPT0gTlVMTCkgeworCQkJCWlmIChuZXh0X2ZpICE9IHJlcy0+ZmkpCisJCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmICghZmliX2RldGVjdF9kZWF0aChmaSwgb3JkZXIsICZsYXN0X3Jlc29ydCwKKwkJCQkJCSAgICAgJmxhc3RfaWR4LCAmZm5faGFzaF9sYXN0X2RmbHQpKSB7CisJCQkJaWYgKHJlcy0+ZmkpCisJCQkJCWZpYl9pbmZvX3B1dChyZXMtPmZpKTsKKwkJCQlyZXMtPmZpID0gZmk7CisJCQkJYXRvbWljX2luYygmZmktPmZpYl9jbG50cmVmKTsKKwkJCQlmbl9oYXNoX2xhc3RfZGZsdCA9IG9yZGVyOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJZmkgPSBuZXh0X2ZpOworCQkJb3JkZXIrKzsKKwkJfQorCX0KKworCWlmIChvcmRlciA8PSAwIHx8IGZpID09IE5VTEwpIHsKKwkJZm5faGFzaF9sYXN0X2RmbHQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFmaWJfZGV0ZWN0X2RlYXRoKGZpLCBvcmRlciwgJmxhc3RfcmVzb3J0LCAmbGFzdF9pZHgsICZmbl9oYXNoX2xhc3RfZGZsdCkpIHsKKwkJaWYgKHJlcy0+ZmkpCisJCQlmaWJfaW5mb19wdXQocmVzLT5maSk7CisJCXJlcy0+ZmkgPSBmaTsKKwkJYXRvbWljX2luYygmZmktPmZpYl9jbG50cmVmKTsKKwkJZm5faGFzaF9sYXN0X2RmbHQgPSBvcmRlcjsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGxhc3RfaWR4ID49IDApIHsKKwkJaWYgKHJlcy0+ZmkpCisJCQlmaWJfaW5mb19wdXQocmVzLT5maSk7CisJCXJlcy0+ZmkgPSBsYXN0X3Jlc29ydDsKKwkJaWYgKGxhc3RfcmVzb3J0KQorCQkJYXRvbWljX2luYygmbGFzdF9yZXNvcnQtPmZpYl9jbG50cmVmKTsKKwl9CisJZm5faGFzaF9sYXN0X2RmbHQgPSBsYXN0X2lkeDsKK291dDoKKwlyZWFkX3VubG9jaygmZmliX2hhc2hfbG9jayk7Cit9CisKKy8qIEluc2VydCBub2RlIEYgdG8gRlouICovCitzdGF0aWMgaW5saW5lIHZvaWQgZmliX2luc2VydF9ub2RlKHN0cnVjdCBmbl96b25lICpmeiwgc3RydWN0IGZpYl9ub2RlICpmKQoreworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkID0gJmZ6LT5mel9oYXNoW2ZuX2hhc2goZi0+Zm5fa2V5LCBmeildOworCisJaGxpc3RfYWRkX2hlYWQoJmYtPmZuX2hhc2gsIGhlYWQpOworfQorCisvKiBSZXR1cm4gdGhlIG5vZGUgaW4gRlogbWF0Y2hpbmcgS0VZLiAqLworc3RhdGljIHN0cnVjdCBmaWJfbm9kZSAqZmliX2ZpbmRfbm9kZShzdHJ1Y3QgZm5fem9uZSAqZnosIHUzMiBrZXkpCit7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSAmZnotPmZ6X2hhc2hbZm5faGFzaChrZXksIGZ6KV07CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJc3RydWN0IGZpYl9ub2RlICpmOworCisJaGxpc3RfZm9yX2VhY2hfZW50cnkoZiwgbm9kZSwgaGVhZCwgZm5faGFzaCkgeworCQlpZiAoZi0+Zm5fa2V5ID09IGtleSkKKwkJCXJldHVybiBmOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50Citmbl9oYXNoX2luc2VydChzdHJ1Y3QgZmliX3RhYmxlICp0Yiwgc3RydWN0IHJ0bXNnICpyLCBzdHJ1Y3Qga2Vybl9ydGEgKnJ0YSwKKwkgICAgICAgc3RydWN0IG5sbXNnaGRyICpuLCBzdHJ1Y3QgbmV0bGlua19za2JfcGFybXMgKnJlcSkKK3sKKwlzdHJ1Y3QgZm5faGFzaCAqdGFibGUgPSAoc3RydWN0IGZuX2hhc2ggKikgdGItPnRiX2RhdGE7CisJc3RydWN0IGZpYl9ub2RlICpuZXdfZiwgKmY7CisJc3RydWN0IGZpYl9hbGlhcyAqZmEsICpuZXdfZmE7CisJc3RydWN0IGZuX3pvbmUgKmZ6OworCXN0cnVjdCBmaWJfaW5mbyAqZmk7CisJaW50IHogPSByLT5ydG1fZHN0X2xlbjsKKwlpbnQgdHlwZSA9IHItPnJ0bV90eXBlOworCXU4IHRvcyA9IHItPnJ0bV90b3M7CisJdTMyIGtleTsKKwlpbnQgZXJyOworCisJaWYgKHogPiAzMikKKwkJcmV0dXJuIC1FSU5WQUw7CisJZnogPSB0YWJsZS0+Zm5fem9uZXNbel07CisJaWYgKCFmeiAmJiAhKGZ6ID0gZm5fbmV3X3pvbmUodGFibGUsIHopKSkKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJa2V5ID0gMDsKKwlpZiAocnRhLT5ydGFfZHN0KSB7CisJCXUzMiBkc3Q7CisJCW1lbWNweSgmZHN0LCBydGEtPnJ0YV9kc3QsIDQpOworCQlpZiAoZHN0ICYgfkZaX01BU0soZnopKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWtleSA9IGZ6X2tleShkc3QsIGZ6KTsKKwl9CisKKwlpZiAgKChmaSA9IGZpYl9jcmVhdGVfaW5mbyhyLCBydGEsIG4sICZlcnIpKSA9PSBOVUxMKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGZ6LT5mel9uZW50ID4gKGZ6LT5mel9kaXZpc29yPDwxKSAmJgorCSAgICBmei0+ZnpfZGl2aXNvciA8IEZaX01BWF9ESVZJU09SICYmCisJICAgICh6PT0zMiB8fCAoMTw8eikgPiBmei0+ZnpfZGl2aXNvcikpCisJCWZuX3JlaGFzaF96b25lKGZ6KTsKKworCWYgPSBmaWJfZmluZF9ub2RlKGZ6LCBrZXkpOworCisJaWYgKCFmKQorCQlmYSA9IE5VTEw7CisJZWxzZQorCQlmYSA9IGZpYl9maW5kX2FsaWFzKCZmLT5mbl9hbGlhcywgdG9zLCBmaS0+ZmliX3ByaW9yaXR5KTsKKworCS8qIE5vdyBmYSwgaWYgbm9uLU5VTEwsIHBvaW50cyB0byB0aGUgZmlyc3QgZmliIGFsaWFzCisJICogd2l0aCB0aGUgc2FtZSBrZXlzIFtwcmVmaXgsdG9zLHByaW9yaXR5XSwgaWYgc3VjaCBrZXkgYWxyZWFkeQorCSAqIGV4aXN0cyBvciB0byB0aGUgbm9kZSBiZWZvcmUgd2hpY2ggd2Ugd2lsbCBpbnNlcnQgbmV3IG9uZS4KKwkgKgorCSAqIElmIGZhIGlzIE5VTEwsIHdlIHdpbGwgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBvbmUgYW5kCisJICogaW5zZXJ0IHRvIHRoZSBoZWFkIG9mIGYuCisJICoKKwkgKiBJZiBmIGlzIE5VTEwsIG5vIGZpYiBub2RlIG1hdGNoZWQgdGhlIGRlc3RpbmF0aW9uIGtleQorCSAqIGFuZCB3ZSBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IG9uZSBvZiB0aG9zZSBhcyB3ZWxsLgorCSAqLworCisJaWYgKGZhICYmIGZhLT5mYV90b3MgPT0gdG9zICYmCisJICAgIGZhLT5mYV9pbmZvLT5maWJfcHJpb3JpdHkgPT0gZmktPmZpYl9wcmlvcml0eSkgeworCQlzdHJ1Y3QgZmliX2FsaWFzICpmYV9vcmlnOworCisJCWVyciA9IC1FRVhJU1Q7CisJCWlmIChuLT5ubG1zZ19mbGFncyAmIE5MTV9GX0VYQ0wpCisJCQlnb3RvIG91dDsKKworCQlpZiAobi0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9SRVBMQUNFKSB7CisJCQlzdHJ1Y3QgZmliX2luZm8gKmZpX2Ryb3A7CisJCQl1OCBzdGF0ZTsKKworCQkJd3JpdGVfbG9ja19iaCgmZmliX2hhc2hfbG9jayk7CisJCQlmaV9kcm9wID0gZmEtPmZhX2luZm87CisJCQlmYS0+ZmFfaW5mbyA9IGZpOworCQkJZmEtPmZhX3R5cGUgPSB0eXBlOworCQkJZmEtPmZhX3Njb3BlID0gci0+cnRtX3Njb3BlOworCQkJc3RhdGUgPSBmYS0+ZmFfc3RhdGU7CisJCQlmYS0+ZmFfc3RhdGUgJj0gfkZBX1NfQUNDRVNTRUQ7CisJCQlmaWJfaGFzaF9nZW5pZCsrOworCQkJd3JpdGVfdW5sb2NrX2JoKCZmaWJfaGFzaF9sb2NrKTsKKworCQkJZmliX3JlbGVhc2VfaW5mbyhmaV9kcm9wKTsKKwkJCWlmIChzdGF0ZSAmIEZBX1NfQUNDRVNTRUQpCisJCQkJcnRfY2FjaGVfZmx1c2goLTEpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBFcnJvciBpZiB3ZSBmaW5kIGEgcGVyZmVjdCBtYXRjaCB3aGljaAorCQkgKiB1c2VzIHRoZSBzYW1lIHNjb3BlLCB0eXBlLCBhbmQgbmV4dGhvcAorCQkgKiBpbmZvcm1hdGlvbi4KKwkJICovCisJCWZhX29yaWcgPSBmYTsKKwkJZmEgPSBsaXN0X2VudHJ5KGZhLT5mYV9saXN0LnByZXYsIHN0cnVjdCBmaWJfYWxpYXMsIGZhX2xpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKGZhLCAmZi0+Zm5fYWxpYXMsIGZhX2xpc3QpIHsKKwkJCWlmIChmYS0+ZmFfdG9zICE9IHRvcykKKwkJCQlicmVhazsKKwkJCWlmIChmYS0+ZmFfaW5mby0+ZmliX3ByaW9yaXR5ICE9IGZpLT5maWJfcHJpb3JpdHkpCisJCQkJYnJlYWs7CisJCQlpZiAoZmEtPmZhX3R5cGUgPT0gdHlwZSAmJgorCQkJICAgIGZhLT5mYV9zY29wZSA9PSByLT5ydG1fc2NvcGUgJiYKKwkJCSAgICBmYS0+ZmFfaW5mbyA9PSBmaSkKKwkJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoIShuLT5ubG1zZ19mbGFncyAmIE5MTV9GX0FQUEVORCkpCisJCQlmYSA9IGZhX29yaWc7CisJfQorCisJZXJyID0gLUVOT0VOVDsKKwlpZiAoIShuLT5ubG1zZ19mbGFncyZOTE1fRl9DUkVBVEUpKQorCQlnb3RvIG91dDsKKworCWVyciA9IC1FTk9CVUZTOworCW5ld19mYSA9IGttZW1fY2FjaGVfYWxsb2MoZm5fYWxpYXNfa21lbSwgU0xBQl9LRVJORUwpOworCWlmIChuZXdfZmEgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwluZXdfZiA9IE5VTEw7CisJaWYgKCFmKSB7CisJCW5ld19mID0ga21lbV9jYWNoZV9hbGxvYyhmbl9oYXNoX2ttZW0sIFNMQUJfS0VSTkVMKTsKKwkJaWYgKG5ld19mID09IE5VTEwpCisJCQlnb3RvIG91dF9mcmVlX25ld19mYTsKKworCQlJTklUX0hMSVNUX05PREUoJm5ld19mLT5mbl9oYXNoKTsKKwkJSU5JVF9MSVNUX0hFQUQoJm5ld19mLT5mbl9hbGlhcyk7CisJCW5ld19mLT5mbl9rZXkgPSBrZXk7CisJCWYgPSBuZXdfZjsKKwl9CisKKwluZXdfZmEtPmZhX2luZm8gPSBmaTsKKwluZXdfZmEtPmZhX3RvcyA9IHRvczsKKwluZXdfZmEtPmZhX3R5cGUgPSB0eXBlOworCW5ld19mYS0+ZmFfc2NvcGUgPSByLT5ydG1fc2NvcGU7CisJbmV3X2ZhLT5mYV9zdGF0ZSA9IDA7CisKKwkvKgorCSAqIEluc2VydCBuZXcgZW50cnkgdG8gdGhlIGxpc3QuCisJICovCisKKwl3cml0ZV9sb2NrX2JoKCZmaWJfaGFzaF9sb2NrKTsKKwlpZiAobmV3X2YpCisJCWZpYl9pbnNlcnRfbm9kZShmeiwgbmV3X2YpOworCWxpc3RfYWRkX3RhaWwoJm5ld19mYS0+ZmFfbGlzdCwKKwkJIChmYSA/ICZmYS0+ZmFfbGlzdCA6ICZmLT5mbl9hbGlhcykpOworCWZpYl9oYXNoX2dlbmlkKys7CisJd3JpdGVfdW5sb2NrX2JoKCZmaWJfaGFzaF9sb2NrKTsKKworCWlmIChuZXdfZikKKwkJZnotPmZ6X25lbnQrKzsKKwlydF9jYWNoZV9mbHVzaCgtMSk7CisKKwlydG1zZ19maWIoUlRNX05FV1JPVVRFLCBrZXksIG5ld19mYSwgeiwgdGItPnRiX2lkLCBuLCByZXEpOworCXJldHVybiAwOworCitvdXRfZnJlZV9uZXdfZmE6CisJa21lbV9jYWNoZV9mcmVlKGZuX2FsaWFzX2ttZW0sIG5ld19mYSk7CitvdXQ6CisJZmliX3JlbGVhc2VfaW5mbyhmaSk7CisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50Citmbl9oYXNoX2RlbGV0ZShzdHJ1Y3QgZmliX3RhYmxlICp0Yiwgc3RydWN0IHJ0bXNnICpyLCBzdHJ1Y3Qga2Vybl9ydGEgKnJ0YSwKKwkgICAgICAgc3RydWN0IG5sbXNnaGRyICpuLCBzdHJ1Y3QgbmV0bGlua19za2JfcGFybXMgKnJlcSkKK3sKKwlzdHJ1Y3QgZm5faGFzaCAqdGFibGUgPSAoc3RydWN0IGZuX2hhc2gqKXRiLT50Yl9kYXRhOworCXN0cnVjdCBmaWJfbm9kZSAqZjsKKwlzdHJ1Y3QgZmliX2FsaWFzICpmYSwgKmZhX3RvX2RlbGV0ZTsKKwlpbnQgeiA9IHItPnJ0bV9kc3RfbGVuOworCXN0cnVjdCBmbl96b25lICpmejsKKwl1MzIga2V5OworCXU4IHRvcyA9IHItPnJ0bV90b3M7CisKKwlpZiAoeiA+IDMyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoKGZ6ICA9IHRhYmxlLT5mbl96b25lc1t6XSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FU1JDSDsKKworCWtleSA9IDA7CisJaWYgKHJ0YS0+cnRhX2RzdCkgeworCQl1MzIgZHN0OworCQltZW1jcHkoJmRzdCwgcnRhLT5ydGFfZHN0LCA0KTsKKwkJaWYgKGRzdCAmIH5GWl9NQVNLKGZ6KSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlrZXkgPSBmel9rZXkoZHN0LCBmeik7CisJfQorCisJZiA9IGZpYl9maW5kX25vZGUoZnosIGtleSk7CisKKwlpZiAoIWYpCisJCWZhID0gTlVMTDsKKwllbHNlCisJCWZhID0gZmliX2ZpbmRfYWxpYXMoJmYtPmZuX2FsaWFzLCB0b3MsIDApOworCWlmICghZmEpCisJCXJldHVybiAtRVNSQ0g7CisKKwlmYV90b19kZWxldGUgPSBOVUxMOworCWZhID0gbGlzdF9lbnRyeShmYS0+ZmFfbGlzdC5wcmV2LCBzdHJ1Y3QgZmliX2FsaWFzLCBmYV9saXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKGZhLCAmZi0+Zm5fYWxpYXMsIGZhX2xpc3QpIHsKKwkJc3RydWN0IGZpYl9pbmZvICpmaSA9IGZhLT5mYV9pbmZvOworCisJCWlmIChmYS0+ZmFfdG9zICE9IHRvcykKKwkJCWJyZWFrOworCisJCWlmICgoIXItPnJ0bV90eXBlIHx8CisJCSAgICAgZmEtPmZhX3R5cGUgPT0gci0+cnRtX3R5cGUpICYmCisJCSAgICAoci0+cnRtX3Njb3BlID09IFJUX1NDT1BFX05PV0hFUkUgfHwKKwkJICAgICBmYS0+ZmFfc2NvcGUgPT0gci0+cnRtX3Njb3BlKSAmJgorCQkgICAgKCFyLT5ydG1fcHJvdG9jb2wgfHwKKwkJICAgICBmaS0+ZmliX3Byb3RvY29sID09IHItPnJ0bV9wcm90b2NvbCkgJiYKKwkJICAgIGZpYl9uaF9tYXRjaChyLCBuLCBydGEsIGZpKSA9PSAwKSB7CisJCQlmYV90b19kZWxldGUgPSBmYTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGZhX3RvX2RlbGV0ZSkgeworCQlpbnQga2lsbF9mbjsKKworCQlmYSA9IGZhX3RvX2RlbGV0ZTsKKwkJcnRtc2dfZmliKFJUTV9ERUxST1VURSwga2V5LCBmYSwgeiwgdGItPnRiX2lkLCBuLCByZXEpOworCisJCWtpbGxfZm4gPSAwOworCQl3cml0ZV9sb2NrX2JoKCZmaWJfaGFzaF9sb2NrKTsKKwkJbGlzdF9kZWwoJmZhLT5mYV9saXN0KTsKKwkJaWYgKGxpc3RfZW1wdHkoJmYtPmZuX2FsaWFzKSkgeworCQkJaGxpc3RfZGVsKCZmLT5mbl9oYXNoKTsKKwkJCWtpbGxfZm4gPSAxOworCQl9CisJCWZpYl9oYXNoX2dlbmlkKys7CisJCXdyaXRlX3VubG9ja19iaCgmZmliX2hhc2hfbG9jayk7CisKKwkJaWYgKGZhLT5mYV9zdGF0ZSAmIEZBX1NfQUNDRVNTRUQpCisJCQlydF9jYWNoZV9mbHVzaCgtMSk7CisJCWZuX2ZyZWVfYWxpYXMoZmEpOworCQlpZiAoa2lsbF9mbikgeworCQkJZm5fZnJlZV9ub2RlKGYpOworCQkJZnotPmZ6X25lbnQtLTsKKwkJfQorCisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVTUkNIOworfQorCitzdGF0aWMgaW50IGZuX2ZsdXNoX2xpc3Qoc3RydWN0IGZuX3pvbmUgKmZ6LCBpbnQgaWR4KQoreworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkID0gJmZ6LT5mel9oYXNoW2lkeF07CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsICpuOworCXN0cnVjdCBmaWJfbm9kZSAqZjsKKwlpbnQgZm91bmQgPSAwOworCisJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmLCBub2RlLCBuLCBoZWFkLCBmbl9oYXNoKSB7CisJCXN0cnVjdCBmaWJfYWxpYXMgKmZhLCAqZmFfbm9kZTsKKwkJaW50IGtpbGxfZjsKKworCQlraWxsX2YgPSAwOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmEsIGZhX25vZGUsICZmLT5mbl9hbGlhcywgZmFfbGlzdCkgeworCQkJc3RydWN0IGZpYl9pbmZvICpmaSA9IGZhLT5mYV9pbmZvOworCisJCQlpZiAoZmkgJiYgKGZpLT5maWJfZmxhZ3MmUlROSF9GX0RFQUQpKSB7CisJCQkJd3JpdGVfbG9ja19iaCgmZmliX2hhc2hfbG9jayk7CisJCQkJbGlzdF9kZWwoJmZhLT5mYV9saXN0KTsKKwkJCQlpZiAobGlzdF9lbXB0eSgmZi0+Zm5fYWxpYXMpKSB7CisJCQkJCWhsaXN0X2RlbCgmZi0+Zm5faGFzaCk7CisJCQkJCWtpbGxfZiA9IDE7CisJCQkJfQorCQkJCWZpYl9oYXNoX2dlbmlkKys7CisJCQkJd3JpdGVfdW5sb2NrX2JoKCZmaWJfaGFzaF9sb2NrKTsKKworCQkJCWZuX2ZyZWVfYWxpYXMoZmEpOworCQkJCWZvdW5kKys7CisJCQl9CisJCX0KKwkJaWYgKGtpbGxfZikgeworCQkJZm5fZnJlZV9ub2RlKGYpOworCQkJZnotPmZ6X25lbnQtLTsKKwkJfQorCX0KKwlyZXR1cm4gZm91bmQ7Cit9CisKK3N0YXRpYyBpbnQgZm5faGFzaF9mbHVzaChzdHJ1Y3QgZmliX3RhYmxlICp0YikKK3sKKwlzdHJ1Y3QgZm5faGFzaCAqdGFibGUgPSAoc3RydWN0IGZuX2hhc2ggKikgdGItPnRiX2RhdGE7CisJc3RydWN0IGZuX3pvbmUgKmZ6OworCWludCBmb3VuZCA9IDA7CisKKwlmb3IgKGZ6ID0gdGFibGUtPmZuX3pvbmVfbGlzdDsgZno7IGZ6ID0gZnotPmZ6X25leHQpIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gZnotPmZ6X2Rpdmlzb3IgLSAxOyBpID49IDA7IGktLSkKKwkJCWZvdW5kICs9IGZuX2ZsdXNoX2xpc3QoZnosIGkpOworCX0KKwlyZXR1cm4gZm91bmQ7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQKK2ZuX2hhc2hfZHVtcF9idWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAorCQkgICAgIHN0cnVjdCBmaWJfdGFibGUgKnRiLAorCQkgICAgIHN0cnVjdCBmbl96b25lICpmeiwKKwkJICAgICBzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgZmliX25vZGUgKmY7CisJaW50IGksIHNfaTsKKworCXNfaSA9IGNiLT5hcmdzWzNdOworCWkgPSAwOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGYsIG5vZGUsIGhlYWQsIGZuX2hhc2gpIHsKKwkJc3RydWN0IGZpYl9hbGlhcyAqZmE7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShmYSwgJmYtPmZuX2FsaWFzLCBmYV9saXN0KSB7CisJCQlpZiAoaSA8IHNfaSkKKwkJCQlnb3RvIG5leHQ7CisKKwkJCWlmIChmaWJfZHVtcF9pbmZvKHNrYiwgTkVUTElOS19DQihjYi0+c2tiKS5waWQsCisJCQkJCSAgY2ItPm5saC0+bmxtc2dfc2VxLAorCQkJCQkgIFJUTV9ORVdST1VURSwKKwkJCQkJICB0Yi0+dGJfaWQsCisJCQkJCSAgZmEtPmZhX3R5cGUsCisJCQkJCSAgZmEtPmZhX3Njb3BlLAorCQkJCQkgICZmLT5mbl9rZXksCisJCQkJCSAgZnotPmZ6X29yZGVyLAorCQkJCQkgIGZhLT5mYV90b3MsCisJCQkJCSAgZmEtPmZhX2luZm8pIDwgMCkgeworCQkJCWNiLT5hcmdzWzNdID0gaTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCW5leHQ6CisJCQlpKys7CisJCX0KKwl9CisJY2ItPmFyZ3NbM10gPSBpOworCXJldHVybiBza2ItPmxlbjsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2ZuX2hhc2hfZHVtcF96b25lKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJICAgc3RydWN0IGZpYl90YWJsZSAqdGIsCisJCSAgIHN0cnVjdCBmbl96b25lICpmeikKK3sKKwlpbnQgaCwgc19oOworCisJc19oID0gY2ItPmFyZ3NbMl07CisJZm9yIChoPTA7IGggPCBmei0+ZnpfZGl2aXNvcjsgaCsrKSB7CisJCWlmIChoIDwgc19oKSBjb250aW51ZTsKKwkJaWYgKGggPiBzX2gpCisJCQltZW1zZXQoJmNiLT5hcmdzWzNdLCAwLAorCQkJICAgICAgIHNpemVvZihjYi0+YXJncykgLSAzKnNpemVvZihjYi0+YXJnc1swXSkpOworCQlpZiAoZnotPmZ6X2hhc2ggPT0gTlVMTCB8fAorCQkgICAgaGxpc3RfZW1wdHkoJmZ6LT5mel9oYXNoW2hdKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZm5faGFzaF9kdW1wX2J1Y2tldChza2IsIGNiLCB0YiwgZnosICZmei0+ZnpfaGFzaFtoXSk8MCkgeworCQkJY2ItPmFyZ3NbMl0gPSBoOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCWNiLT5hcmdzWzJdID0gaDsKKwlyZXR1cm4gc2tiLT5sZW47Cit9CisKK3N0YXRpYyBpbnQgZm5faGFzaF9kdW1wKHN0cnVjdCBmaWJfdGFibGUgKnRiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJaW50IG0sIHNfbTsKKwlzdHJ1Y3QgZm5fem9uZSAqZno7CisJc3RydWN0IGZuX2hhc2ggKnRhYmxlID0gKHN0cnVjdCBmbl9oYXNoKil0Yi0+dGJfZGF0YTsKKworCXNfbSA9IGNiLT5hcmdzWzFdOworCXJlYWRfbG9jaygmZmliX2hhc2hfbG9jayk7CisJZm9yIChmeiA9IHRhYmxlLT5mbl96b25lX2xpc3QsIG09MDsgZno7IGZ6ID0gZnotPmZ6X25leHQsIG0rKykgeworCQlpZiAobSA8IHNfbSkgY29udGludWU7CisJCWlmIChtID4gc19tKQorCQkJbWVtc2V0KCZjYi0+YXJnc1syXSwgMCwKKwkJCSAgICAgICBzaXplb2YoY2ItPmFyZ3MpIC0gMipzaXplb2YoY2ItPmFyZ3NbMF0pKTsKKwkJaWYgKGZuX2hhc2hfZHVtcF96b25lKHNrYiwgY2IsIHRiLCBmeikgPCAwKSB7CisJCQljYi0+YXJnc1sxXSA9IG07CisJCQlyZWFkX3VubG9jaygmZmliX2hhc2hfbG9jayk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJcmVhZF91bmxvY2soJmZpYl9oYXNoX2xvY2spOworCWNiLT5hcmdzWzFdID0gbTsKKwlyZXR1cm4gc2tiLT5sZW47Cit9CisKKyNpZmRlZiBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTCitzdHJ1Y3QgZmliX3RhYmxlICogZmliX2hhc2hfaW5pdChpbnQgaWQpCisjZWxzZQorc3RydWN0IGZpYl90YWJsZSAqIF9faW5pdCBmaWJfaGFzaF9pbml0KGludCBpZCkKKyNlbmRpZgoreworCXN0cnVjdCBmaWJfdGFibGUgKnRiOworCisJaWYgKGZuX2hhc2hfa21lbSA9PSBOVUxMKQorCQlmbl9oYXNoX2ttZW0gPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaXBfZmliX2hhc2giLAorCQkJCQkJIHNpemVvZihzdHJ1Y3QgZmliX25vZGUpLAorCQkJCQkJIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwKKwkJCQkJCSBOVUxMLCBOVUxMKTsKKworCWlmIChmbl9hbGlhc19rbWVtID09IE5VTEwpCisJCWZuX2FsaWFzX2ttZW0gPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaXBfZmliX2FsaWFzIiwKKwkJCQkJCSAgc2l6ZW9mKHN0cnVjdCBmaWJfYWxpYXMpLAorCQkJCQkJICAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sCisJCQkJCQkgIE5VTEwsIE5VTEwpOworCisJdGIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZmliX3RhYmxlKSArIHNpemVvZihzdHJ1Y3QgZm5faGFzaCksCisJCSAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKHRiID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJdGItPnRiX2lkID0gaWQ7CisJdGItPnRiX2xvb2t1cCA9IGZuX2hhc2hfbG9va3VwOworCXRiLT50Yl9pbnNlcnQgPSBmbl9oYXNoX2luc2VydDsKKwl0Yi0+dGJfZGVsZXRlID0gZm5faGFzaF9kZWxldGU7CisJdGItPnRiX2ZsdXNoID0gZm5faGFzaF9mbHVzaDsKKwl0Yi0+dGJfc2VsZWN0X2RlZmF1bHQgPSBmbl9oYXNoX3NlbGVjdF9kZWZhdWx0OworCXRiLT50Yl9kdW1wID0gZm5faGFzaF9kdW1wOworCW1lbXNldCh0Yi0+dGJfZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBmbl9oYXNoKSk7CisJcmV0dXJuIHRiOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCitzdHJ1Y3QgZmliX2l0ZXJfc3RhdGUgeworCXN0cnVjdCBmbl96b25lCSp6b25lOworCWludAkJYnVja2V0OworCXN0cnVjdCBobGlzdF9oZWFkICpoYXNoX2hlYWQ7CisJc3RydWN0IGZpYl9ub2RlICpmbjsKKwlzdHJ1Y3QgZmliX2FsaWFzICpmYTsKKwlsb2ZmX3QgcG9zOworCXVuc2lnbmVkIGludCBnZW5pZDsKKwlpbnQgdmFsaWQ7Cit9OworCitzdGF0aWMgc3RydWN0IGZpYl9hbGlhcyAqZmliX2dldF9maXJzdChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwlzdHJ1Y3QgZmliX2l0ZXJfc3RhdGUgKml0ZXIgPSBzZXEtPnByaXZhdGU7CisJc3RydWN0IGZuX2hhc2ggKnRhYmxlID0gKHN0cnVjdCBmbl9oYXNoICopIGlwX2ZpYl9tYWluX3RhYmxlLT50Yl9kYXRhOworCisJaXRlci0+YnVja2V0ICAgID0gMDsKKwlpdGVyLT5oYXNoX2hlYWQgPSBOVUxMOworCWl0ZXItPmZuICAgICAgICA9IE5VTEw7CisJaXRlci0+ZmEgICAgICAgID0gTlVMTDsKKwlpdGVyLT5wb3MJPSAwOworCWl0ZXItPmdlbmlkCT0gZmliX2hhc2hfZ2VuaWQ7CisJaXRlci0+dmFsaWQJPSAxOworCisJZm9yIChpdGVyLT56b25lID0gdGFibGUtPmZuX3pvbmVfbGlzdDsgaXRlci0+em9uZTsKKwkgICAgIGl0ZXItPnpvbmUgPSBpdGVyLT56b25lLT5mel9uZXh0KSB7CisJCWludCBtYXhzbG90OworCisJCWlmICghaXRlci0+em9uZS0+ZnpfbmVudCkKKwkJCWNvbnRpbnVlOworCisJCWl0ZXItPmhhc2hfaGVhZCA9IGl0ZXItPnpvbmUtPmZ6X2hhc2g7CisJCW1heHNsb3QgPSBpdGVyLT56b25lLT5mel9kaXZpc29yOworCisJCWZvciAoaXRlci0+YnVja2V0ID0gMDsgaXRlci0+YnVja2V0IDwgbWF4c2xvdDsKKwkJICAgICArK2l0ZXItPmJ1Y2tldCwgKytpdGVyLT5oYXNoX2hlYWQpIHsKKwkJCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCQkJc3RydWN0IGZpYl9ub2RlICpmbjsKKworCQkJaGxpc3RfZm9yX2VhY2hfZW50cnkoZm4sbm9kZSxpdGVyLT5oYXNoX2hlYWQsZm5faGFzaCkgeworCQkJCXN0cnVjdCBmaWJfYWxpYXMgKmZhOworCisJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShmYSwmZm4tPmZuX2FsaWFzLGZhX2xpc3QpIHsKKwkJCQkJaXRlci0+Zm4gPSBmbjsKKwkJCQkJaXRlci0+ZmEgPSBmYTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCQl9CisJfQorb3V0OgorCXJldHVybiBpdGVyLT5mYTsKK30KKworc3RhdGljIHN0cnVjdCBmaWJfYWxpYXMgKmZpYl9nZXRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwlzdHJ1Y3QgZmliX2l0ZXJfc3RhdGUgKml0ZXIgPSBzZXEtPnByaXZhdGU7CisJc3RydWN0IGZpYl9ub2RlICpmbjsKKwlzdHJ1Y3QgZmliX2FsaWFzICpmYTsKKworCS8qIEFkdmFuY2UgRkEsIGlmIGFueS4gKi8KKwlmbiA9IGl0ZXItPmZuOworCWZhID0gaXRlci0+ZmE7CisJaWYgKGZhKSB7CisJCUJVR19PTighZm4pOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKGZhLCAmZm4tPmZuX2FsaWFzLCBmYV9saXN0KSB7CisJCQlpdGVyLT5mYSA9IGZhOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlmYSA9IGl0ZXItPmZhID0gTlVMTDsKKworCS8qIEFkdmFuY2UgRk4uICovCisJaWYgKGZuKSB7CisJCXN0cnVjdCBobGlzdF9ub2RlICpub2RlID0gJmZuLT5mbl9oYXNoOworCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZShmbiwgbm9kZSwgZm5faGFzaCkgeworCQkJaXRlci0+Zm4gPSBmbjsKKworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShmYSwgJmZuLT5mbl9hbGlhcywgZmFfbGlzdCkgeworCQkJCWl0ZXItPmZhID0gZmE7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwl9CisKKwlmbiA9IGl0ZXItPmZuID0gTlVMTDsKKworCS8qIEFkdmFuY2UgaGFzaCBjaGFpbi4gKi8KKwlpZiAoIWl0ZXItPnpvbmUpCisJCWdvdG8gb3V0OworCisJZm9yICg7OykgeworCQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwkJaW50IG1heHNsb3Q7CisKKwkJbWF4c2xvdCA9IGl0ZXItPnpvbmUtPmZ6X2Rpdmlzb3I7CisKKwkJd2hpbGUgKCsraXRlci0+YnVja2V0IDwgbWF4c2xvdCkgeworCQkJaXRlci0+aGFzaF9oZWFkKys7CisKKwkJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGZuLCBub2RlLCBpdGVyLT5oYXNoX2hlYWQsIGZuX2hhc2gpIHsKKwkJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZhLCAmZm4tPmZuX2FsaWFzLCBmYV9saXN0KSB7CisJCQkJCWl0ZXItPmZuID0gZm47CisJCQkJCWl0ZXItPmZhID0gZmE7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCX0KKwkJfQorCisJCWl0ZXItPnpvbmUgPSBpdGVyLT56b25lLT5mel9uZXh0OworCisJCWlmICghaXRlci0+em9uZSkKKwkJCWdvdG8gb3V0OworCQkKKwkJaXRlci0+YnVja2V0ID0gMDsKKwkJaXRlci0+aGFzaF9oZWFkID0gaXRlci0+em9uZS0+ZnpfaGFzaDsKKworCQlobGlzdF9mb3JfZWFjaF9lbnRyeShmbiwgbm9kZSwgaXRlci0+aGFzaF9oZWFkLCBmbl9oYXNoKSB7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZhLCAmZm4tPmZuX2FsaWFzLCBmYV9saXN0KSB7CisJCQkJaXRlci0+Zm4gPSBmbjsKKwkJCQlpdGVyLT5mYSA9IGZhOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJfQorb3V0OgorCWl0ZXItPnBvcysrOworCXJldHVybiBmYTsKK30KKworc3RhdGljIHN0cnVjdCBmaWJfYWxpYXMgKmZpYl9nZXRfaWR4KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBmaWJfaXRlcl9zdGF0ZSAqaXRlciA9IHNlcS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZmliX2FsaWFzICpmYTsKKwkKKwlpZiAoaXRlci0+dmFsaWQgJiYgcG9zID49IGl0ZXItPnBvcyAmJiBpdGVyLT5nZW5pZCA9PSBmaWJfaGFzaF9nZW5pZCkgeworCQlmYSAgID0gaXRlci0+ZmE7CisJCXBvcyAtPSBpdGVyLT5wb3M7CisJfSBlbHNlCisJCWZhID0gZmliX2dldF9maXJzdChzZXEpOworCisJaWYgKGZhKQorCQl3aGlsZSAocG9zICYmIChmYSA9IGZpYl9nZXRfbmV4dChzZXEpKSkKKwkJCS0tcG9zOworCXJldHVybiBwb3MgPyBOVUxMIDogZmE7Cit9CisKK3N0YXRpYyB2b2lkICpmaWJfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwl2b2lkICp2ID0gTlVMTDsKKworCXJlYWRfbG9jaygmZmliX2hhc2hfbG9jayk7CisJaWYgKGlwX2ZpYl9tYWluX3RhYmxlKQorCQl2ID0gKnBvcyA/IGZpYl9nZXRfaWR4KHNlcSwgKnBvcyAtIDEpIDogU0VRX1NUQVJUX1RPS0VOOworCXJldHVybiB2OworfQorCitzdGF0aWMgdm9pZCAqZmliX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwkrKypwb3M7CisJcmV0dXJuIHYgPT0gU0VRX1NUQVJUX1RPS0VOID8gZmliX2dldF9maXJzdChzZXEpIDogZmliX2dldF9uZXh0KHNlcSk7Cit9CisKK3N0YXRpYyB2b2lkIGZpYl9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlyZWFkX3VubG9jaygmZmliX2hhc2hfbG9jayk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBmaWJfZmxhZ190cmFucyhpbnQgdHlwZSwgdTMyIG1hc2ssIHN0cnVjdCBmaWJfaW5mbyAqZmkpCit7CisJc3RhdGljIHVuc2lnbmVkIHR5cGUyZmxhZ3NbUlROX01BWCArIDFdID0geworCQlbN10gPSBSVEZfUkVKRUNULCBbOF0gPSBSVEZfUkVKRUNULAorCX07CisJdW5zaWduZWQgZmxhZ3MgPSB0eXBlMmZsYWdzW3R5cGVdOworCisJaWYgKGZpICYmIGZpLT5maWJfbmgtPm5oX2d3KQorCQlmbGFncyB8PSBSVEZfR0FURVdBWTsKKwlpZiAobWFzayA9PSAweEZGRkZGRkZGKQorCQlmbGFncyB8PSBSVEZfSE9TVDsKKwlmbGFncyB8PSBSVEZfVVA7CisJcmV0dXJuIGZsYWdzOworfQorCisvKiAKKyAqCVRoaXMgb3V0cHV0cyAvcHJvYy9uZXQvcm91dGUuCisgKgorICoJSXQgYWx3YXlzIHdvcmtzIGluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbW9kZS4KKyAqCVRoZSBmb3JtYXQgb2YgdGhlIGZpbGUgaXMgbm90IHN1cHBvc2VkIHRvIGJlIGNoYW5nZWQuCisgKi8KK3N0YXRpYyBpbnQgZmliX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBmaWJfaXRlcl9zdGF0ZSAqaXRlcjsKKwljaGFyIGJmWzEyOF07CisJdTMyIHByZWZpeCwgbWFzazsKKwl1bnNpZ25lZCBmbGFnczsKKwlzdHJ1Y3QgZmliX25vZGUgKmY7CisJc3RydWN0IGZpYl9hbGlhcyAqZmE7CisJc3RydWN0IGZpYl9pbmZvICpmaTsKKworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlzZXFfcHJpbnRmKHNlcSwgIiUtMTI3c1xuIiwgIklmYWNlXHREZXN0aW5hdGlvblx0R2F0ZXdheSAiCisJCQkgICAiXHRGbGFnc1x0UmVmQ250XHRVc2VcdE1ldHJpY1x0TWFza1x0XHRNVFUiCisJCQkgICAiXHRXaW5kb3dcdElSVFQiKTsKKwkJZ290byBvdXQ7CisJfQorCisJaXRlcgk9IHNlcS0+cHJpdmF0ZTsKKwlmCT0gaXRlci0+Zm47CisJZmEJPSBpdGVyLT5mYTsKKwlmaQk9IGZhLT5mYV9pbmZvOworCXByZWZpeAk9IGYtPmZuX2tleTsKKwltYXNrCT0gRlpfTUFTSyhpdGVyLT56b25lKTsKKwlmbGFncwk9IGZpYl9mbGFnX3RyYW5zKGZhLT5mYV90eXBlLCBtYXNrLCBmaSk7CisJaWYgKGZpKQorCQlzbnByaW50ZihiZiwgc2l6ZW9mKGJmKSwKKwkJCSAiJXNcdCUwOFhcdCUwOFhcdCUwNFhcdCVkXHQldVx0JWRcdCUwOFhcdCVkXHQldVx0JXUiLAorCQkJIGZpLT5maWJfZGV2ID8gZmktPmZpYl9kZXYtPm5hbWUgOiAiKiIsIHByZWZpeCwKKwkJCSBmaS0+ZmliX25oLT5uaF9ndywgZmxhZ3MsIDAsIDAsIGZpLT5maWJfcHJpb3JpdHksCisJCQkgbWFzaywgKGZpLT5maWJfYWR2bXNzID8gZmktPmZpYl9hZHZtc3MgKyA0MCA6IDApLAorCQkJIGZpLT5maWJfd2luZG93LAorCQkJIGZpLT5maWJfcnR0ID4+IDMpOworCWVsc2UKKwkJc25wcmludGYoYmYsIHNpemVvZihiZiksCisJCQkgIipcdCUwOFhcdCUwOFhcdCUwNFhcdCVkXHQldVx0JWRcdCUwOFhcdCVkXHQldVx0JXUiLAorCQkJIHByZWZpeCwgMCwgZmxhZ3MsIDAsIDAsIDAsIG1hc2ssIDAsIDAsIDApOworCXNlcV9wcmludGYoc2VxLCAiJS0xMjdzXG4iLCBiZik7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZmliX3NlcV9vcHMgPSB7CisJLnN0YXJ0ICA9IGZpYl9zZXFfc3RhcnQsCisJLm5leHQgICA9IGZpYl9zZXFfbmV4dCwKKwkuc3RvcCAgID0gZmliX3NlcV9zdG9wLAorCS5zaG93ICAgPSBmaWJfc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IGZpYl9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKKwlpbnQgcmMgPSAtRU5PTUVNOworCXN0cnVjdCBmaWJfaXRlcl9zdGF0ZSAqcyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7CisgICAgICAgCisJaWYgKCFzKQorCQlnb3RvIG91dDsKKworCXJjID0gc2VxX29wZW4oZmlsZSwgJmZpYl9zZXFfb3BzKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0X2tmcmVlOworCisJc2VxCSAgICAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc2VxLT5wcml2YXRlID0gczsKKwltZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7CitvdXQ6CisJcmV0dXJuIHJjOworb3V0X2tmcmVlOgorCWtmcmVlKHMpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmaWJfc2VxX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgICAgICAgICA9IGZpYl9zZXFfb3BlbiwKKwkucmVhZCAgICAgICAgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICAgICAgICAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZV9wcml2YXRlLAorfTsKKworaW50IF9faW5pdCBmaWJfcHJvY19pbml0KHZvaWQpCit7CisJaWYgKCFwcm9jX25ldF9mb3BzX2NyZWF0ZSgicm91dGUiLCBTX0lSVUdPLCAmZmliX3NlcV9mb3BzKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19pbml0IGZpYl9wcm9jX2V4aXQodm9pZCkKK3sKKwlwcm9jX25ldF9yZW1vdmUoInJvdXRlIik7Cit9CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2ZpYl9sb29rdXAuaCBiL25ldC9pcHY0L2ZpYl9sb29rdXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzQ0ODVmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvZmliX2xvb2t1cC5oCkBAIC0wLDAgKzEsNDMgQEAKKyNpZm5kZWYgX0ZJQl9MT09LVVBfSAorI2RlZmluZSBfRklCX0xPT0tVUF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxuZXQvaXBfZmliLmg+CisKK3N0cnVjdCBmaWJfYWxpYXMgeworCXN0cnVjdCBsaXN0X2hlYWQJZmFfbGlzdDsKKwlzdHJ1Y3QgZmliX2luZm8JCSpmYV9pbmZvOworCXU4CQkJZmFfdG9zOworCXU4CQkJZmFfdHlwZTsKKwl1OAkJCWZhX3Njb3BlOworCXU4CQkJZmFfc3RhdGU7Cit9OworCisjZGVmaW5lIEZBX1NfQUNDRVNTRUQJMHgwMQorCisvKiBFeHBvcnRlZCBieSBmaWJfc2VtYW50aWNzLmMgKi8KK2V4dGVybiBpbnQgZmliX3NlbWFudGljX21hdGNoKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgZmxvd2kgKmZscCwKKwkJCSAgICAgIHN0cnVjdCBmaWJfcmVzdWx0ICpyZXMsIF9fdTMyIHpvbmUsIF9fdTMyIG1hc2ssCisJCQkJaW50IHByZWZpeGxlbik7CitleHRlcm4gdm9pZCBmaWJfcmVsZWFzZV9pbmZvKHN0cnVjdCBmaWJfaW5mbyAqKTsKK2V4dGVybiBzdHJ1Y3QgZmliX2luZm8gKmZpYl9jcmVhdGVfaW5mbyhjb25zdCBzdHJ1Y3QgcnRtc2cgKnIsCisJCQkJCXN0cnVjdCBrZXJuX3J0YSAqcnRhLAorCQkJCQljb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKiwKKwkJCQkJaW50ICplcnIpOworZXh0ZXJuIGludCBmaWJfbmhfbWF0Y2goc3RydWN0IHJ0bXNnICpyLCBzdHJ1Y3Qgbmxtc2doZHIgKiwKKwkJCXN0cnVjdCBrZXJuX3J0YSAqcnRhLCBzdHJ1Y3QgZmliX2luZm8gKmZpKTsKK2V4dGVybiBpbnQgZmliX2R1bXBfaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgcGlkLCB1MzIgc2VxLCBpbnQgZXZlbnQsCisJCQkgdTggdGJfaWQsIHU4IHR5cGUsIHU4IHNjb3BlLCB2b2lkICpkc3QsCisJCQkgaW50IGRzdF9sZW4sIHU4IHRvcywgc3RydWN0IGZpYl9pbmZvICpmaSk7CitleHRlcm4gdm9pZCBydG1zZ19maWIoaW50IGV2ZW50LCB1MzIga2V5LCBzdHJ1Y3QgZmliX2FsaWFzICpmYSwKKwkJICAgICAgaW50IHosIGludCB0Yl9pZCwKKwkJICAgICAgc3RydWN0IG5sbXNnaGRyICpuLCBzdHJ1Y3QgbmV0bGlua19za2JfcGFybXMgKnJlcSk7CitleHRlcm4gc3RydWN0IGZpYl9hbGlhcyAqZmliX2ZpbmRfYWxpYXMoc3RydWN0IGxpc3RfaGVhZCAqZmFoLAorCQkJCQl1OCB0b3MsIHUzMiBwcmlvKTsKK2V4dGVybiBpbnQgZmliX2RldGVjdF9kZWF0aChzdHJ1Y3QgZmliX2luZm8gKmZpLCBpbnQgb3JkZXIsCisJCQkgICAgc3RydWN0IGZpYl9pbmZvICoqbGFzdF9yZXNvcnQsCisJCQkgICAgaW50ICpsYXN0X2lkeCwgaW50ICpkZmx0KTsKKworI2VuZGlmIC8qIF9GSUJfTE9PS1VQX0ggKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2ZpYl9ydWxlcy5jIGIvbmV0L2lwdjQvZmliX3J1bGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlkMGFhZAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L2ZpYl9ydWxlcy5jCkBAIC0wLDAgKzEsNDM3IEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCUlQdjQgRm9yd2FyZGluZyBJbmZvcm1hdGlvbiBCYXNlOiBwb2xpY3kgcnVsZXMuCisgKgorICogVmVyc2lvbjoJJElkOiBmaWJfcnVsZXMuYyx2IDEuMTcgMjAwMS8xMC8zMSAyMTo1NTo1NCBkYXZlbSBFeHAgJAorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGaXhlczoKKyAqIAkJUmFuaSBBc3NhZgk6CWxvY2FsX3J1bGUgY2Fubm90IGJlIGRlbGV0ZWQKKyAqCQlNYXJjIEJvdWNoZXIJOglyb3V0aW5nIGJ5IGZ3bWFyaworICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9pcF9maWIuaD4KKworI2RlZmluZSBGUnByaW50ayhhLi4uKQorCitzdHJ1Y3QgZmliX3J1bGUKK3sKKwlzdHJ1Y3QgZmliX3J1bGUgKnJfbmV4dDsKKwlhdG9taWNfdAlyX2NsbnRyZWY7CisJdTMyCQlyX3ByZWZlcmVuY2U7CisJdW5zaWduZWQgY2hhcglyX3RhYmxlOworCXVuc2lnbmVkIGNoYXIJcl9hY3Rpb247CisJdW5zaWduZWQgY2hhcglyX2RzdF9sZW47CisJdW5zaWduZWQgY2hhcglyX3NyY19sZW47CisJdTMyCQlyX3NyYzsKKwl1MzIJCXJfc3JjbWFzazsKKwl1MzIJCXJfZHN0OworCXUzMgkJcl9kc3RtYXNrOworCXUzMgkJcl9zcmNtYXA7CisJdTgJCXJfZmxhZ3M7CisJdTgJCXJfdG9zOworI2lmZGVmIENPTkZJR19JUF9ST1VURV9GV01BUksKKwl1MzIJCXJfZndtYXJrOworI2VuZGlmCisJaW50CQlyX2lmaW5kZXg7CisjaWZkZWYgQ09ORklHX05FVF9DTFNfUk9VVEUKKwlfX3UzMgkJcl90Y2xhc3NpZDsKKyNlbmRpZgorCWNoYXIJCXJfaWZuYW1lW0lGTkFNU0laXTsKKwlpbnQJCXJfZGVhZDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmliX3J1bGUgZGVmYXVsdF9ydWxlID0geworCS5yX2NsbnRyZWYgPQlBVE9NSUNfSU5JVCgyKSwKKwkucl9wcmVmZXJlbmNlID0JMHg3RkZGLAorCS5yX3RhYmxlID0JUlRfVEFCTEVfREVGQVVMVCwKKwkucl9hY3Rpb24gPQlSVE5fVU5JQ0FTVCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmliX3J1bGUgbWFpbl9ydWxlID0geworCS5yX25leHQgPQkmZGVmYXVsdF9ydWxlLAorCS5yX2NsbnRyZWYgPQlBVE9NSUNfSU5JVCgyKSwKKwkucl9wcmVmZXJlbmNlID0JMHg3RkZFLAorCS5yX3RhYmxlID0JUlRfVEFCTEVfTUFJTiwKKwkucl9hY3Rpb24gPQlSVE5fVU5JQ0FTVCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmliX3J1bGUgbG9jYWxfcnVsZSA9IHsKKwkucl9uZXh0ID0JJm1haW5fcnVsZSwKKwkucl9jbG50cmVmID0JQVRPTUlDX0lOSVQoMiksCisJLnJfdGFibGUgPQlSVF9UQUJMRV9MT0NBTCwKKwkucl9hY3Rpb24gPQlSVE5fVU5JQ0FTVCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmliX3J1bGUgKmZpYl9ydWxlcyA9ICZsb2NhbF9ydWxlOworc3RhdGljIERFRklORV9SV0xPQ0soZmliX3J1bGVzX2xvY2spOworCitpbnQgaW5ldF9ydG1fZGVscnVsZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIqIG5saCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBydGF0dHIgKipydGEgPSBhcmc7CisJc3RydWN0IHJ0bXNnICpydG0gPSBOTE1TR19EQVRBKG5saCk7CisJc3RydWN0IGZpYl9ydWxlICpyLCAqKnJwOworCWludCBlcnIgPSAtRVNSQ0g7CisKKwlmb3IgKHJwPSZmaWJfcnVsZXM7IChyPSpycCkgIT0gTlVMTDsgcnA9JnItPnJfbmV4dCkgeworCQlpZiAoKCFydGFbUlRBX1NSQy0xXSB8fCBtZW1jbXAoUlRBX0RBVEEocnRhW1JUQV9TUkMtMV0pLCAmci0+cl9zcmMsIDQpID09IDApICYmCisJCSAgICBydG0tPnJ0bV9zcmNfbGVuID09IHItPnJfc3JjX2xlbiAmJgorCQkgICAgcnRtLT5ydG1fZHN0X2xlbiA9PSByLT5yX2RzdF9sZW4gJiYKKwkJICAgICghcnRhW1JUQV9EU1QtMV0gfHwgbWVtY21wKFJUQV9EQVRBKHJ0YVtSVEFfRFNULTFdKSwgJnItPnJfZHN0LCA0KSA9PSAwKSAmJgorCQkgICAgcnRtLT5ydG1fdG9zID09IHItPnJfdG9zICYmCisjaWZkZWYgQ09ORklHX0lQX1JPVVRFX0ZXTUFSSworCQkgICAgKCFydGFbUlRBX1BST1RPSU5GTy0xXSB8fCBtZW1jbXAoUlRBX0RBVEEocnRhW1JUQV9QUk9UT0lORk8tMV0pLCAmci0+cl9md21hcmssIDQpID09IDApICYmCisjZW5kaWYKKwkJICAgICghcnRtLT5ydG1fdHlwZSB8fCBydG0tPnJ0bV90eXBlID09IHItPnJfYWN0aW9uKSAmJgorCQkgICAgKCFydGFbUlRBX1BSSU9SSVRZLTFdIHx8IG1lbWNtcChSVEFfREFUQShydGFbUlRBX1BSSU9SSVRZLTFdKSwgJnItPnJfcHJlZmVyZW5jZSwgNCkgPT0gMCkgJiYKKwkJICAgICghcnRhW1JUQV9JSUYtMV0gfHwgcnRhdHRyX3N0cmNtcChydGFbUlRBX0lJRi0xXSwgci0+cl9pZm5hbWUpID09IDApICYmCisJCSAgICAoIXJ0bS0+cnRtX3RhYmxlIHx8IChyICYmIHJ0bS0+cnRtX3RhYmxlID09IHItPnJfdGFibGUpKSkgeworCQkJZXJyID0gLUVQRVJNOworCQkJaWYgKHIgPT0gJmxvY2FsX3J1bGUpCisJCQkJYnJlYWs7CisKKwkJCXdyaXRlX2xvY2tfYmgoJmZpYl9ydWxlc19sb2NrKTsKKwkJCSpycCA9IHItPnJfbmV4dDsKKwkJCXItPnJfZGVhZCA9IDE7CisJCQl3cml0ZV91bmxvY2tfYmgoJmZpYl9ydWxlc19sb2NrKTsKKwkJCWZpYl9ydWxlX3B1dChyKTsKKwkJCWVyciA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gZXJyOworfQorCisvKiBBbGxvY2F0ZSBuZXcgdW5pcXVlIHRhYmxlIGlkICovCisKK3N0YXRpYyBzdHJ1Y3QgZmliX3RhYmxlICpmaWJfZW1wdHlfdGFibGUodm9pZCkKK3sKKwlpbnQgaWQ7CisKKwlmb3IgKGlkID0gMTsgaWQgPD0gUlRfVEFCTEVfTUFYOyBpZCsrKQorCQlpZiAoZmliX3RhYmxlc1tpZF0gPT0gTlVMTCkKKwkJCXJldHVybiBfX2ZpYl9uZXdfdGFibGUoaWQpOworCXJldHVybiBOVUxMOworfQorCit2b2lkIGZpYl9ydWxlX3B1dChzdHJ1Y3QgZmliX3J1bGUgKnIpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnItPnJfY2xudHJlZikpIHsKKwkJaWYgKHItPnJfZGVhZCkKKwkJCWtmcmVlKHIpOworCQllbHNlCisJCQlwcmludGsoIkZyZWVpbmcgYWxpdmUgcnVsZSAlcFxuIiwgcik7CisJfQorfQorCitpbnQgaW5ldF9ydG1fbmV3cnVsZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIqIG5saCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBydGF0dHIgKipydGEgPSBhcmc7CisJc3RydWN0IHJ0bXNnICpydG0gPSBOTE1TR19EQVRBKG5saCk7CisJc3RydWN0IGZpYl9ydWxlICpyLCAqbmV3X3IsICoqcnA7CisJdW5zaWduZWQgY2hhciB0YWJsZV9pZDsKKworCWlmIChydG0tPnJ0bV9zcmNfbGVuID4gMzIgfHwgcnRtLT5ydG1fZHN0X2xlbiA+IDMyIHx8CisJICAgIChydG0tPnJ0bV90b3MgJiB+SVBUT1NfVE9TX01BU0spKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChydGFbUlRBX0lJRi0xXSAmJiBSVEFfUEFZTE9BRChydGFbUlRBX0lJRi0xXSkgPiBJRk5BTVNJWikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0YWJsZV9pZCA9IHJ0bS0+cnRtX3RhYmxlOworCWlmICh0YWJsZV9pZCA9PSBSVF9UQUJMRV9VTlNQRUMpIHsKKwkJc3RydWN0IGZpYl90YWJsZSAqdGFibGU7CisJCWlmIChydG0tPnJ0bV90eXBlID09IFJUTl9VTklDQVNUKSB7CisJCQlpZiAoKHRhYmxlID0gZmliX2VtcHR5X3RhYmxlKCkpID09IE5VTEwpCisJCQkJcmV0dXJuIC1FTk9CVUZTOworCQkJdGFibGVfaWQgPSB0YWJsZS0+dGJfaWQ7CisJCX0KKwl9CisKKwluZXdfciA9IGttYWxsb2Moc2l6ZW9mKCpuZXdfciksIEdGUF9LRVJORUwpOworCWlmICghbmV3X3IpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChuZXdfciwgMCwgc2l6ZW9mKCpuZXdfcikpOworCWlmIChydGFbUlRBX1NSQy0xXSkKKwkJbWVtY3B5KCZuZXdfci0+cl9zcmMsIFJUQV9EQVRBKHJ0YVtSVEFfU1JDLTFdKSwgNCk7CisJaWYgKHJ0YVtSVEFfRFNULTFdKQorCQltZW1jcHkoJm5ld19yLT5yX2RzdCwgUlRBX0RBVEEocnRhW1JUQV9EU1QtMV0pLCA0KTsKKwlpZiAocnRhW1JUQV9HQVRFV0FZLTFdKQorCQltZW1jcHkoJm5ld19yLT5yX3NyY21hcCwgUlRBX0RBVEEocnRhW1JUQV9HQVRFV0FZLTFdKSwgNCk7CisJbmV3X3ItPnJfc3JjX2xlbiA9IHJ0bS0+cnRtX3NyY19sZW47CisJbmV3X3ItPnJfZHN0X2xlbiA9IHJ0bS0+cnRtX2RzdF9sZW47CisJbmV3X3ItPnJfc3JjbWFzayA9IGluZXRfbWFrZV9tYXNrKHJ0bS0+cnRtX3NyY19sZW4pOworCW5ld19yLT5yX2RzdG1hc2sgPSBpbmV0X21ha2VfbWFzayhydG0tPnJ0bV9kc3RfbGVuKTsKKwluZXdfci0+cl90b3MgPSBydG0tPnJ0bV90b3M7CisjaWZkZWYgQ09ORklHX0lQX1JPVVRFX0ZXTUFSSworCWlmIChydGFbUlRBX1BST1RPSU5GTy0xXSkKKwkJbWVtY3B5KCZuZXdfci0+cl9md21hcmssIFJUQV9EQVRBKHJ0YVtSVEFfUFJPVE9JTkZPLTFdKSwgNCk7CisjZW5kaWYKKwluZXdfci0+cl9hY3Rpb24gPSBydG0tPnJ0bV90eXBlOworCW5ld19yLT5yX2ZsYWdzID0gcnRtLT5ydG1fZmxhZ3M7CisJaWYgKHJ0YVtSVEFfUFJJT1JJVFktMV0pCisJCW1lbWNweSgmbmV3X3ItPnJfcHJlZmVyZW5jZSwgUlRBX0RBVEEocnRhW1JUQV9QUklPUklUWS0xXSksIDQpOworCW5ld19yLT5yX3RhYmxlID0gdGFibGVfaWQ7CisJaWYgKHJ0YVtSVEFfSUlGLTFdKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJCXJ0YXR0cl9zdHJsY3B5KG5ld19yLT5yX2lmbmFtZSwgcnRhW1JUQV9JSUYtMV0sIElGTkFNU0laKTsKKwkJbmV3X3ItPnJfaWZpbmRleCA9IC0xOworCQlkZXYgPSBfX2Rldl9nZXRfYnlfbmFtZShuZXdfci0+cl9pZm5hbWUpOworCQlpZiAoZGV2KQorCQkJbmV3X3ItPnJfaWZpbmRleCA9IGRldi0+aWZpbmRleDsKKwl9CisjaWZkZWYgQ09ORklHX05FVF9DTFNfUk9VVEUKKwlpZiAocnRhW1JUQV9GTE9XLTFdKQorCQltZW1jcHkoJm5ld19yLT5yX3RjbGFzc2lkLCBSVEFfREFUQShydGFbUlRBX0ZMT1ctMV0pLCA0KTsKKyNlbmRpZgorCisJcnAgPSAmZmliX3J1bGVzOworCWlmICghbmV3X3ItPnJfcHJlZmVyZW5jZSkgeworCQlyID0gZmliX3J1bGVzOworCQlpZiAociAmJiAociA9IHItPnJfbmV4dCkgIT0gTlVMTCkgeworCQkJcnAgPSAmZmliX3J1bGVzLT5yX25leHQ7CisJCQlpZiAoci0+cl9wcmVmZXJlbmNlKQorCQkJCW5ld19yLT5yX3ByZWZlcmVuY2UgPSByLT5yX3ByZWZlcmVuY2UgLSAxOworCQl9CisJfQorCisJd2hpbGUgKCAociA9ICpycCkgIT0gTlVMTCApIHsKKwkJaWYgKHItPnJfcHJlZmVyZW5jZSA+IG5ld19yLT5yX3ByZWZlcmVuY2UpCisJCQlicmVhazsKKwkJcnAgPSAmci0+cl9uZXh0OworCX0KKworCW5ld19yLT5yX25leHQgPSByOworCWF0b21pY19pbmMoJm5ld19yLT5yX2NsbnRyZWYpOworCXdyaXRlX2xvY2tfYmgoJmZpYl9ydWxlc19sb2NrKTsKKwkqcnAgPSBuZXdfcjsKKwl3cml0ZV91bmxvY2tfYmgoJmZpYl9ydWxlc19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19ORVRfQ0xTX1JPVVRFCit1MzIgZmliX3J1bGVzX3RjbGFzcyhzdHJ1Y3QgZmliX3Jlc3VsdCAqcmVzKQoreworCWlmIChyZXMtPnIpCisJCXJldHVybiByZXMtPnItPnJfdGNsYXNzaWQ7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCitzdGF0aWMgdm9pZCBmaWJfcnVsZXNfZGV0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZpYl9ydWxlICpyOworCisJZm9yIChyPWZpYl9ydWxlczsgcjsgcj1yLT5yX25leHQpIHsKKwkJaWYgKHItPnJfaWZpbmRleCA9PSBkZXYtPmlmaW5kZXgpIHsKKwkJCXdyaXRlX2xvY2tfYmgoJmZpYl9ydWxlc19sb2NrKTsKKwkJCXItPnJfaWZpbmRleCA9IC0xOworCQkJd3JpdGVfdW5sb2NrX2JoKCZmaWJfcnVsZXNfbG9jayk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZpYl9ydWxlc19hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmliX3J1bGUgKnI7CisKKwlmb3IgKHI9ZmliX3J1bGVzOyByOyByPXItPnJfbmV4dCkgeworCQlpZiAoci0+cl9pZmluZGV4ID09IC0xICYmIHN0cmNtcChkZXYtPm5hbWUsIHItPnJfaWZuYW1lKSA9PSAwKSB7CisJCQl3cml0ZV9sb2NrX2JoKCZmaWJfcnVsZXNfbG9jayk7CisJCQlyLT5yX2lmaW5kZXggPSBkZXYtPmlmaW5kZXg7CisJCQl3cml0ZV91bmxvY2tfYmgoJmZpYl9ydWxlc19sb2NrKTsKKwkJfQorCX0KK30KKworaW50IGZpYl9sb29rdXAoY29uc3Qgc3RydWN0IGZsb3dpICpmbHAsIHN0cnVjdCBmaWJfcmVzdWx0ICpyZXMpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZmliX3J1bGUgKnIsICpwb2xpY3k7CisJc3RydWN0IGZpYl90YWJsZSAqdGI7CisKKwl1MzIgZGFkZHIgPSBmbHAtPmZsNF9kc3Q7CisJdTMyIHNhZGRyID0gZmxwLT5mbDRfc3JjOworCitGUnByaW50aygiTG9va3VwOiAldS4ldS4ldS4ldSA8LSAldS4ldS4ldS4ldSAiLAorCU5JUFFVQUQoZmxwLT5mbDRfZHN0KSwgTklQUVVBRChmbHAtPmZsNF9zcmMpKTsKKwlyZWFkX2xvY2soJmZpYl9ydWxlc19sb2NrKTsKKwlmb3IgKHIgPSBmaWJfcnVsZXM7IHI7IHI9ci0+cl9uZXh0KSB7CisJCWlmICgoKHNhZGRyXnItPnJfc3JjKSAmIHItPnJfc3JjbWFzaykgfHwKKwkJICAgICgoZGFkZHJeci0+cl9kc3QpICYgci0+cl9kc3RtYXNrKSB8fAorCQkgICAgKHItPnJfdG9zICYmIHItPnJfdG9zICE9IGZscC0+Zmw0X3RvcykgfHwKKyNpZmRlZiBDT05GSUdfSVBfUk9VVEVfRldNQVJLCisJCSAgICAoci0+cl9md21hcmsgJiYgci0+cl9md21hcmsgIT0gZmxwLT5mbDRfZndtYXJrKSB8fAorI2VuZGlmCisJCSAgICAoci0+cl9pZmluZGV4ICYmIHItPnJfaWZpbmRleCAhPSBmbHAtPmlpZikpCisJCQljb250aW51ZTsKKworRlJwcmludGsoInRiICVkIHIgJWQgIiwgci0+cl90YWJsZSwgci0+cl9hY3Rpb24pOworCQlzd2l0Y2ggKHItPnJfYWN0aW9uKSB7CisJCWNhc2UgUlROX1VOSUNBU1Q6CisJCQlwb2xpY3kgPSByOworCQkJYnJlYWs7CisJCWNhc2UgUlROX1VOUkVBQ0hBQkxFOgorCQkJcmVhZF91bmxvY2soJmZpYl9ydWxlc19sb2NrKTsKKwkJCXJldHVybiAtRU5FVFVOUkVBQ0g7CisJCWRlZmF1bHQ6CisJCWNhc2UgUlROX0JMQUNLSE9MRToKKwkJCXJlYWRfdW5sb2NrKCZmaWJfcnVsZXNfbG9jayk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY2FzZSBSVE5fUFJPSElCSVQ6CisJCQlyZWFkX3VubG9jaygmZmliX3J1bGVzX2xvY2spOworCQkJcmV0dXJuIC1FQUNDRVM7CisJCX0KKworCQlpZiAoKHRiID0gZmliX2dldF90YWJsZShyLT5yX3RhYmxlKSkgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQllcnIgPSB0Yi0+dGJfbG9va3VwKHRiLCBmbHAsIHJlcyk7CisJCWlmIChlcnIgPT0gMCkgeworCQkJcmVzLT5yID0gcG9saWN5OworCQkJaWYgKHBvbGljeSkKKwkJCQlhdG9taWNfaW5jKCZwb2xpY3ktPnJfY2xudHJlZik7CisJCQlyZWFkX3VubG9jaygmZmliX3J1bGVzX2xvY2spOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGVyciA8IDAgJiYgZXJyICE9IC1FQUdBSU4pIHsKKwkJCXJlYWRfdW5sb2NrKCZmaWJfcnVsZXNfbG9jayk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorRlJwcmludGsoIkZBSUxVUkVcbiIpOworCXJlYWRfdW5sb2NrKCZmaWJfcnVsZXNfbG9jayk7CisJcmV0dXJuIC1FTkVUVU5SRUFDSDsKK30KKwordm9pZCBmaWJfc2VsZWN0X2RlZmF1bHQoY29uc3Qgc3RydWN0IGZsb3dpICpmbHAsIHN0cnVjdCBmaWJfcmVzdWx0ICpyZXMpCit7CisJaWYgKHJlcy0+ciAmJiByZXMtPnItPnJfYWN0aW9uID09IFJUTl9VTklDQVNUICYmCisJICAgIEZJQl9SRVNfR1coKnJlcykgJiYgRklCX1JFU19OSCgqcmVzKS5uaF9zY29wZSA9PSBSVF9TQ09QRV9MSU5LKSB7CisJCXN0cnVjdCBmaWJfdGFibGUgKnRiOworCQlpZiAoKHRiID0gZmliX2dldF90YWJsZShyZXMtPnItPnJfdGFibGUpKSAhPSBOVUxMKQorCQkJdGItPnRiX3NlbGVjdF9kZWZhdWx0KHRiLCBmbHAsIHJlcyk7CisJfQorfQorCitzdGF0aWMgaW50IGZpYl9ydWxlc19ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHRyOworCisJaWYgKGV2ZW50ID09IE5FVERFVl9VTlJFR0lTVEVSKQorCQlmaWJfcnVsZXNfZGV0YWNoKGRldik7CisJZWxzZSBpZiAoZXZlbnQgPT0gTkVUREVWX1JFR0lTVEVSKQorCQlmaWJfcnVsZXNfYXR0YWNoKGRldik7CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZmliX3J1bGVzX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID1maWJfcnVsZXNfZXZlbnQsCit9OworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgaW5ldF9maWxsX3J1bGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgIHN0cnVjdCBmaWJfcnVsZSAqciwKKwkJCQkgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlzdHJ1Y3QgcnRtc2cgKnJ0bTsKKwlzdHJ1Y3Qgbmxtc2doZHIgICpubGg7CisJdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisKKwlubGggPSBOTE1TR19QVVQoc2tiLCBORVRMSU5LX0NSRURTKGNiLT5za2IpLT5waWQsIGNiLT5ubGgtPm5sbXNnX3NlcSwgUlRNX05FV1JVTEUsIHNpemVvZigqcnRtKSk7CisJcnRtID0gTkxNU0dfREFUQShubGgpOworCXJ0bS0+cnRtX2ZhbWlseSA9IEFGX0lORVQ7CisJcnRtLT5ydG1fZHN0X2xlbiA9IHItPnJfZHN0X2xlbjsKKwlydG0tPnJ0bV9zcmNfbGVuID0gci0+cl9zcmNfbGVuOworCXJ0bS0+cnRtX3RvcyA9IHItPnJfdG9zOworI2lmZGVmIENPTkZJR19JUF9ST1VURV9GV01BUksKKwlpZiAoci0+cl9md21hcmspCisJCVJUQV9QVVQoc2tiLCBSVEFfUFJPVE9JTkZPLCA0LCAmci0+cl9md21hcmspOworI2VuZGlmCisJcnRtLT5ydG1fdGFibGUgPSByLT5yX3RhYmxlOworCXJ0bS0+cnRtX3Byb3RvY29sID0gMDsKKwlydG0tPnJ0bV9zY29wZSA9IDA7CisJcnRtLT5ydG1fdHlwZSA9IHItPnJfYWN0aW9uOworCXJ0bS0+cnRtX2ZsYWdzID0gci0+cl9mbGFnczsKKworCWlmIChyLT5yX2RzdF9sZW4pCisJCVJUQV9QVVQoc2tiLCBSVEFfRFNULCA0LCAmci0+cl9kc3QpOworCWlmIChyLT5yX3NyY19sZW4pCisJCVJUQV9QVVQoc2tiLCBSVEFfU1JDLCA0LCAmci0+cl9zcmMpOworCWlmIChyLT5yX2lmbmFtZVswXSkKKwkJUlRBX1BVVChza2IsIFJUQV9JSUYsIElGTkFNU0laLCAmci0+cl9pZm5hbWUpOworCWlmIChyLT5yX3ByZWZlcmVuY2UpCisJCVJUQV9QVVQoc2tiLCBSVEFfUFJJT1JJVFksIDQsICZyLT5yX3ByZWZlcmVuY2UpOworCWlmIChyLT5yX3NyY21hcCkKKwkJUlRBX1BVVChza2IsIFJUQV9HQVRFV0FZLCA0LCAmci0+cl9zcmNtYXApOworI2lmZGVmIENPTkZJR19ORVRfQ0xTX1JPVVRFCisJaWYgKHItPnJfdGNsYXNzaWQpCisJCVJUQV9QVVQoc2tiLCBSVEFfRkxPVywgNCwgJnItPnJfdGNsYXNzaWQpOworI2VuZGlmCisJbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCXJldHVybiBza2ItPmxlbjsKKworbmxtc2dfZmFpbHVyZToKK3J0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorCitpbnQgaW5ldF9kdW1wX3J1bGVzKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlpbnQgaWR4OworCWludCBzX2lkeCA9IGNiLT5hcmdzWzBdOworCXN0cnVjdCBmaWJfcnVsZSAqcjsKKworCXJlYWRfbG9jaygmZmliX3J1bGVzX2xvY2spOworCWZvciAocj1maWJfcnVsZXMsIGlkeD0wOyByOyByID0gci0+cl9uZXh0LCBpZHgrKykgeworCQlpZiAoaWR4IDwgc19pZHgpCisJCQljb250aW51ZTsKKwkJaWYgKGluZXRfZmlsbF9ydWxlKHNrYiwgciwgY2IpIDwgMCkKKwkJCWJyZWFrOworCX0KKwlyZWFkX3VubG9jaygmZmliX3J1bGVzX2xvY2spOworCWNiLT5hcmdzWzBdID0gaWR4OworCisJcmV0dXJuIHNrYi0+bGVuOworfQorCit2b2lkIF9faW5pdCBmaWJfcnVsZXNfaW5pdCh2b2lkKQoreworCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmZmliX3J1bGVzX25vdGlmaWVyKTsKK30KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2ZpYl9zZW1hbnRpY3MuYyBiL25ldC9pcHY0L2ZpYl9zZW1hbnRpY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjkzNjJkCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvZmliX3NlbWFudGljcy5jCkBAIC0wLDAgKzEsMTMzMiBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlJUHY0IEZvcndhcmRpbmcgSW5mb3JtYXRpb24gQmFzZTogc2VtYW50aWNzLgorICoKKyAqIFZlcnNpb246CSRJZDogZmliX3NlbWFudGljcy5jLHYgMS4xOSAyMDAyLzAxLzEyIDA3OjU0OjU2IGRhdmVtIEV4cCAkCisgKgorICogQXV0aG9yczoJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2lwX2ZpYi5oPgorI2luY2x1ZGUgPG5ldC9pcF9tcF9hbGcuaD4KKworI2luY2x1ZGUgImZpYl9sb29rdXAuaCIKKworI2RlZmluZSBGU3ByaW50ayhhLi4uKQorCitzdGF0aWMgREVGSU5FX1JXTE9DSyhmaWJfaW5mb19sb2NrKTsKK3N0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCAqZmliX2luZm9faGFzaDsKK3N0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCAqZmliX2luZm9fbGFkZHJoYXNoOworc3RhdGljIHVuc2lnbmVkIGludCBmaWJfaGFzaF9zaXplOworc3RhdGljIHVuc2lnbmVkIGludCBmaWJfaW5mb19jbnQ7CisKKyNkZWZpbmUgREVWSU5ERVhfSEFTSEJJVFMgOAorI2RlZmluZSBERVZJTkRFWF9IQVNIU0laRSAoMVUgPDwgREVWSU5ERVhfSEFTSEJJVFMpCitzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgZmliX2luZm9fZGV2aGFzaFtERVZJTkRFWF9IQVNIU0laRV07CisKKyNpZmRlZiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRICisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZmliX211bHRpcGF0aF9sb2NrKTsKKworI2RlZmluZSBmb3JfbmV4dGhvcHMoZmkpIHsgaW50IG5oc2VsOyBjb25zdCBzdHJ1Y3QgZmliX25oICogbmg7IFwKK2ZvciAobmhzZWw9MCwgbmggPSAoZmkpLT5maWJfbmg7IG5oc2VsIDwgKGZpKS0+ZmliX25oczsgbmgrKywgbmhzZWwrKykKKworI2RlZmluZSBjaGFuZ2VfbmV4dGhvcHMoZmkpIHsgaW50IG5oc2VsOyBzdHJ1Y3QgZmliX25oICogbmg7IFwKK2ZvciAobmhzZWw9MCwgbmggPSAoc3RydWN0IGZpYl9uaCopKChmaSktPmZpYl9uaCk7IG5oc2VsIDwgKGZpKS0+ZmliX25oczsgbmgrKywgbmhzZWwrKykKKworI2Vsc2UgLyogQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSCAqLworCisvKiBIb3BlLCB0aGF0IGdjYyB3aWxsIG9wdGltaXplIGl0IHRvIGdldCByaWQgb2YgZHVtbXkgbG9vcCAqLworCisjZGVmaW5lIGZvcl9uZXh0aG9wcyhmaSkgeyBpbnQgbmhzZWw9MDsgY29uc3Qgc3RydWN0IGZpYl9uaCAqIG5oID0gKGZpKS0+ZmliX25oOyBcCitmb3IgKG5oc2VsPTA7IG5oc2VsIDwgMTsgbmhzZWwrKykKKworI2RlZmluZSBjaGFuZ2VfbmV4dGhvcHMoZmkpIHsgaW50IG5oc2VsPTA7IHN0cnVjdCBmaWJfbmggKiBuaCA9IChzdHJ1Y3QgZmliX25oKikoKGZpKS0+ZmliX25oKTsgXAorZm9yIChuaHNlbD0wOyBuaHNlbCA8IDE7IG5oc2VsKyspCisKKyNlbmRpZiAvKiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIICovCisKKyNkZWZpbmUgZW5kZm9yX25leHRob3BzKGZpKSB9CisKKworc3RhdGljIHN0cnVjdCAKK3sKKwlpbnQJZXJyb3I7CisJdTgJc2NvcGU7Cit9IGZpYl9wcm9wc1tSVEFfTUFYICsgMV0gPSB7CisgICAgICAgIHsKKwkJLmVycm9yCT0gMCwKKwkJLnNjb3BlCT0gUlRfU0NPUEVfTk9XSEVSRSwKKwl9LAkvKiBSVE5fVU5TUEVDICovCisJeworCQkuZXJyb3IJPSAwLAorCQkuc2NvcGUJPSBSVF9TQ09QRV9VTklWRVJTRSwKKwl9LAkvKiBSVE5fVU5JQ0FTVCAqLworCXsKKwkJLmVycm9yCT0gMCwKKwkJLnNjb3BlCT0gUlRfU0NPUEVfSE9TVCwKKwl9LAkvKiBSVE5fTE9DQUwgKi8KKwl7CisJCS5lcnJvcgk9IDAsCisJCS5zY29wZQk9IFJUX1NDT1BFX0xJTkssCisJfSwJLyogUlROX0JST0FEQ0FTVCAqLworCXsKKwkJLmVycm9yCT0gMCwKKwkJLnNjb3BlCT0gUlRfU0NPUEVfTElOSywKKwl9LAkvKiBSVE5fQU5ZQ0FTVCAqLworCXsKKwkJLmVycm9yCT0gMCwKKwkJLnNjb3BlCT0gUlRfU0NPUEVfVU5JVkVSU0UsCisJfSwJLyogUlROX01VTFRJQ0FTVCAqLworCXsKKwkJLmVycm9yCT0gLUVJTlZBTCwKKwkJLnNjb3BlCT0gUlRfU0NPUEVfVU5JVkVSU0UsCisJfSwJLyogUlROX0JMQUNLSE9MRSAqLworCXsKKwkJLmVycm9yCT0gLUVIT1NUVU5SRUFDSCwKKwkJLnNjb3BlCT0gUlRfU0NPUEVfVU5JVkVSU0UsCisJfSwJLyogUlROX1VOUkVBQ0hBQkxFICovCisJeworCQkuZXJyb3IJPSAtRUFDQ0VTLAorCQkuc2NvcGUJPSBSVF9TQ09QRV9VTklWRVJTRSwKKwl9LAkvKiBSVE5fUFJPSElCSVQgKi8KKwl7CisJCS5lcnJvcgk9IC1FQUdBSU4sCisJCS5zY29wZQk9IFJUX1NDT1BFX1VOSVZFUlNFLAorCX0sCS8qIFJUTl9USFJPVyAqLworCXsKKwkJLmVycm9yCT0gLUVJTlZBTCwKKwkJLnNjb3BlCT0gUlRfU0NPUEVfTk9XSEVSRSwKKwl9LAkvKiBSVE5fTkFUICovCisJeworCQkuZXJyb3IJPSAtRUlOVkFMLAorCQkuc2NvcGUJPSBSVF9TQ09QRV9OT1dIRVJFLAorCX0sCS8qIFJUTl9YUkVTT0xWRSAqLworfTsKKworCisvKiBSZWxlYXNlIGEgbmV4dGhvcCBpbmZvIHJlY29yZCAqLworCit2b2lkIGZyZWVfZmliX2luZm8oc3RydWN0IGZpYl9pbmZvICpmaSkKK3sKKwlpZiAoZmktPmZpYl9kZWFkID09IDApIHsKKwkJcHJpbnRrKCJGcmVlaW5nIGFsaXZlIGZpYl9pbmZvICVwXG4iLCBmaSk7CisJCXJldHVybjsKKwl9CisJY2hhbmdlX25leHRob3BzKGZpKSB7CisJCWlmIChuaC0+bmhfZGV2KQorCQkJZGV2X3B1dChuaC0+bmhfZGV2KTsKKwkJbmgtPm5oX2RldiA9IE5VTEw7CisJfSBlbmRmb3JfbmV4dGhvcHMoZmkpOworCWZpYl9pbmZvX2NudC0tOworCWtmcmVlKGZpKTsKK30KKwordm9pZCBmaWJfcmVsZWFzZV9pbmZvKHN0cnVjdCBmaWJfaW5mbyAqZmkpCit7CisJd3JpdGVfbG9jaygmZmliX2luZm9fbG9jayk7CisJaWYgKGZpICYmIC0tZmktPmZpYl90cmVlcmVmID09IDApIHsKKwkJaGxpc3RfZGVsKCZmaS0+ZmliX2hhc2gpOworCQlpZiAoZmktPmZpYl9wcmVmc3JjKQorCQkJaGxpc3RfZGVsKCZmaS0+ZmliX2xoYXNoKTsKKwkJY2hhbmdlX25leHRob3BzKGZpKSB7CisJCQlpZiAoIW5oLT5uaF9kZXYpCisJCQkJY29udGludWU7CisJCQlobGlzdF9kZWwoJm5oLT5uaF9oYXNoKTsKKwkJfSBlbmRmb3JfbmV4dGhvcHMoZmkpCisJCWZpLT5maWJfZGVhZCA9IDE7CisJCWZpYl9pbmZvX3B1dChmaSk7CisJfQorCXdyaXRlX3VubG9jaygmZmliX2luZm9fbG9jayk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBuaF9jb21wKGNvbnN0IHN0cnVjdCBmaWJfaW5mbyAqZmksIGNvbnN0IHN0cnVjdCBmaWJfaW5mbyAqb2ZpKQoreworCWNvbnN0IHN0cnVjdCBmaWJfbmggKm9uaCA9IG9maS0+ZmliX25oOworCisJZm9yX25leHRob3BzKGZpKSB7CisJCWlmIChuaC0+bmhfb2lmICE9IG9uaC0+bmhfb2lmIHx8CisJCSAgICBuaC0+bmhfZ3cgICE9IG9uaC0+bmhfZ3cgfHwKKwkJICAgIG5oLT5uaF9zY29wZSAhPSBvbmgtPm5oX3Njb3BlIHx8CisjaWZkZWYgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSAorCQkgICAgbmgtPm5oX3dlaWdodCAhPSBvbmgtPm5oX3dlaWdodCB8fAorI2VuZGlmCisjaWZkZWYgQ09ORklHX05FVF9DTFNfUk9VVEUKKwkJICAgIG5oLT5uaF90Y2xhc3NpZCAhPSBvbmgtPm5oX3RjbGFzc2lkIHx8CisjZW5kaWYKKwkJICAgICgobmgtPm5oX2ZsYWdzXm9uaC0+bmhfZmxhZ3MpJn5SVE5IX0ZfREVBRCkpCisJCQlyZXR1cm4gLTE7CisJCW9uaCsrOworCX0gZW5kZm9yX25leHRob3BzKGZpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZmliX2luZm9faGFzaGZuKGNvbnN0IHN0cnVjdCBmaWJfaW5mbyAqZmkpCit7CisJdW5zaWduZWQgaW50IG1hc2sgPSAoZmliX2hhc2hfc2l6ZSAtIDEpOworCXVuc2lnbmVkIGludCB2YWwgPSBmaS0+ZmliX25oczsKKworCXZhbCBePSBmaS0+ZmliX3Byb3RvY29sOworCXZhbCBePSBmaS0+ZmliX3ByZWZzcmM7CisJdmFsIF49IGZpLT5maWJfcHJpb3JpdHk7CisKKwlyZXR1cm4gKHZhbCBeICh2YWwgPj4gNykgXiAodmFsID4+IDEyKSkgJiBtYXNrOworfQorCitzdGF0aWMgc3RydWN0IGZpYl9pbmZvICpmaWJfZmluZF9pbmZvKGNvbnN0IHN0cnVjdCBmaWJfaW5mbyAqbmZpKQoreworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXN0cnVjdCBmaWJfaW5mbyAqZmk7CisJdW5zaWduZWQgaW50IGhhc2g7CisKKwloYXNoID0gZmliX2luZm9faGFzaGZuKG5maSk7CisJaGVhZCA9ICZmaWJfaW5mb19oYXNoW2hhc2hdOworCisJaGxpc3RfZm9yX2VhY2hfZW50cnkoZmksIG5vZGUsIGhlYWQsIGZpYl9oYXNoKSB7CisJCWlmIChmaS0+ZmliX25ocyAhPSBuZmktPmZpYl9uaHMpCisJCQljb250aW51ZTsKKwkJaWYgKG5maS0+ZmliX3Byb3RvY29sID09IGZpLT5maWJfcHJvdG9jb2wgJiYKKwkJICAgIG5maS0+ZmliX3ByZWZzcmMgPT0gZmktPmZpYl9wcmVmc3JjICYmCisJCSAgICBuZmktPmZpYl9wcmlvcml0eSA9PSBmaS0+ZmliX3ByaW9yaXR5ICYmCisJCSAgICBtZW1jbXAobmZpLT5maWJfbWV0cmljcywgZmktPmZpYl9tZXRyaWNzLAorCQkJICAgc2l6ZW9mKGZpLT5maWJfbWV0cmljcykpID09IDAgJiYKKwkJICAgICgobmZpLT5maWJfZmxhZ3NeZmktPmZpYl9mbGFncykmflJUTkhfRl9ERUFEKSA9PSAwICYmCisJCSAgICAobmZpLT5maWJfbmhzID09IDAgfHwgbmhfY29tcChmaSwgbmZpKSA9PSAwKSkKKwkJCXJldHVybiBmaTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZmliX2RldmluZGV4X2hhc2hmbih1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGludCBtYXNrID0gREVWSU5ERVhfSEFTSFNJWkUgLSAxOworCisJcmV0dXJuICh2YWwgXgorCQkodmFsID4+IERFVklOREVYX0hBU0hCSVRTKSBeCisJCSh2YWwgPj4gKERFVklOREVYX0hBU0hCSVRTICogMikpKSAmIG1hc2s7Cit9CisKKy8qIENoZWNrLCB0aGF0IHRoZSBnYXRld2F5IGlzIGFscmVhZHkgY29uZmlndXJlZC4KKyAgIFVzZWQgb25seSBieSByZWRpcmVjdCBhY2NlcHQgcm91dGluZS4KKyAqLworCitpbnQgaXBfZmliX2NoZWNrX2RlZmF1bHQodTMyIGd3LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXN0cnVjdCBmaWJfbmggKm5oOworCXVuc2lnbmVkIGludCBoYXNoOworCisJcmVhZF9sb2NrKCZmaWJfaW5mb19sb2NrKTsKKworCWhhc2ggPSBmaWJfZGV2aW5kZXhfaGFzaGZuKGRldi0+aWZpbmRleCk7CisJaGVhZCA9ICZmaWJfaW5mb19kZXZoYXNoW2hhc2hdOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KG5oLCBub2RlLCBoZWFkLCBuaF9oYXNoKSB7CisJCWlmIChuaC0+bmhfZGV2ID09IGRldiAmJgorCQkgICAgbmgtPm5oX2d3ID09IGd3ICYmCisJCSAgICAhKG5oLT5uaF9mbGFncyZSVE5IX0ZfREVBRCkpIHsKKwkJCXJlYWRfdW5sb2NrKCZmaWJfaW5mb19sb2NrKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmVhZF91bmxvY2soJmZpYl9pbmZvX2xvY2spOworCisJcmV0dXJuIC0xOworfQorCit2b2lkIHJ0bXNnX2ZpYihpbnQgZXZlbnQsIHUzMiBrZXksIHN0cnVjdCBmaWJfYWxpYXMgKmZhLAorCSAgICAgICBpbnQgeiwgaW50IHRiX2lkLAorCSAgICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHN0cnVjdCBuZXRsaW5rX3NrYl9wYXJtcyAqcmVxKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdTMyIHBpZCA9IHJlcSA/IHJlcS0+cGlkIDogMDsKKwlpbnQgc2l6ZSA9IE5MTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3QgcnRtc2cpKzI1Nik7CisKKwlza2IgPSBhbGxvY19za2Ioc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFza2IpCisJCXJldHVybjsKKworCWlmIChmaWJfZHVtcF9pbmZvKHNrYiwgcGlkLCBuLT5ubG1zZ19zZXEsIGV2ZW50LCB0Yl9pZCwKKwkJCSAgZmEtPmZhX3R5cGUsIGZhLT5mYV9zY29wZSwgJmtleSwgeiwKKwkJCSAgZmEtPmZhX3RvcywKKwkJCSAgZmEtPmZhX2luZm8pIDwgMCkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKwlORVRMSU5LX0NCKHNrYikuZHN0X2dyb3VwcyA9IFJUTUdSUF9JUFY0X1JPVVRFOworCWlmIChuLT5ubG1zZ19mbGFncyZOTE1fRl9FQ0hPKQorCQlhdG9taWNfaW5jKCZza2ItPnVzZXJzKTsKKwluZXRsaW5rX2Jyb2FkY2FzdChydG5sLCBza2IsIHBpZCwgUlRNR1JQX0lQVjRfUk9VVEUsIEdGUF9LRVJORUwpOworCWlmIChuLT5ubG1zZ19mbGFncyZOTE1fRl9FQ0hPKQorCQluZXRsaW5rX3VuaWNhc3QocnRubCwgc2tiLCBwaWQsIE1TR19ET05UV0FJVCk7Cit9CisKKy8qIFJldHVybiB0aGUgZmlyc3QgZmliIGFsaWFzIG1hdGNoaW5nIFRPUyB3aXRoCisgKiBwcmlvcml0eSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gUFJJTy4KKyAqLworc3RydWN0IGZpYl9hbGlhcyAqZmliX2ZpbmRfYWxpYXMoc3RydWN0IGxpc3RfaGVhZCAqZmFoLCB1OCB0b3MsIHUzMiBwcmlvKQoreworCWlmIChmYWgpIHsKKwkJc3RydWN0IGZpYl9hbGlhcyAqZmE7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmEsIGZhaCwgZmFfbGlzdCkgeworCQkJaWYgKGZhLT5mYV90b3MgPiB0b3MpCisJCQkJY29udGludWU7CisJCQlpZiAoZmEtPmZhX2luZm8tPmZpYl9wcmlvcml0eSA+PSBwcmlvIHx8CisJCQkgICAgZmEtPmZhX3RvcyA8IHRvcykKKwkJCQlyZXR1cm4gZmE7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBmaWJfZGV0ZWN0X2RlYXRoKHN0cnVjdCBmaWJfaW5mbyAqZmksIGludCBvcmRlciwKKwkJICAgICBzdHJ1Y3QgZmliX2luZm8gKipsYXN0X3Jlc29ydCwgaW50ICpsYXN0X2lkeCwgaW50ICpkZmx0KQoreworCXN0cnVjdCBuZWlnaGJvdXIgKm47CisJaW50IHN0YXRlID0gTlVEX05PTkU7CisKKwluID0gbmVpZ2hfbG9va3VwKCZhcnBfdGJsLCAmZmktPmZpYl9uaFswXS5uaF9ndywgZmktPmZpYl9kZXYpOworCWlmIChuKSB7CisJCXN0YXRlID0gbi0+bnVkX3N0YXRlOworCQluZWlnaF9yZWxlYXNlKG4pOworCX0KKwlpZiAoc3RhdGU9PU5VRF9SRUFDSEFCTEUpCisJCXJldHVybiAwOworCWlmICgoc3RhdGUmTlVEX1ZBTElEKSAmJiBvcmRlciAhPSAqZGZsdCkKKwkJcmV0dXJuIDA7CisJaWYgKChzdGF0ZSZOVURfVkFMSUQpIHx8CisJICAgICgqbGFzdF9pZHg8MCAmJiBvcmRlciA+ICpkZmx0KSkgeworCQkqbGFzdF9yZXNvcnQgPSBmaTsKKwkJKmxhc3RfaWR4ID0gb3JkZXI7CisJfQorCXJldHVybiAxOworfQorCisjaWZkZWYgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSAorCitzdGF0aWMgdTMyIGZpYl9nZXRfYXR0cjMyKHN0cnVjdCBydGF0dHIgKmF0dHIsIGludCBhdHRybGVuLCBpbnQgdHlwZSkKK3sKKwl3aGlsZSAoUlRBX09LKGF0dHIsYXR0cmxlbikpIHsKKwkJaWYgKGF0dHItPnJ0YV90eXBlID09IHR5cGUpCisJCQlyZXR1cm4gKih1MzIqKVJUQV9EQVRBKGF0dHIpOworCQlhdHRyID0gUlRBX05FWFQoYXR0ciwgYXR0cmxlbik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitmaWJfY291bnRfbmV4dGhvcHMoc3RydWN0IHJ0YXR0ciAqcnRhKQoreworCWludCBuaHMgPSAwOworCXN0cnVjdCBydG5leHRob3AgKm5ocCA9IFJUQV9EQVRBKHJ0YSk7CisJaW50IG5obGVuID0gUlRBX1BBWUxPQUQocnRhKTsKKworCXdoaWxlIChuaGxlbiA+PSAoaW50KXNpemVvZihzdHJ1Y3QgcnRuZXh0aG9wKSkgeworCQlpZiAoKG5obGVuIC09IG5ocC0+cnRuaF9sZW4pIDwgMCkKKwkJCXJldHVybiAwOworCQluaHMrKzsKKwkJbmhwID0gUlROSF9ORVhUKG5ocCk7CisJfTsKKwlyZXR1cm4gbmhzOworfQorCitzdGF0aWMgaW50CitmaWJfZ2V0X25ocyhzdHJ1Y3QgZmliX2luZm8gKmZpLCBjb25zdCBzdHJ1Y3QgcnRhdHRyICpydGEsIGNvbnN0IHN0cnVjdCBydG1zZyAqcikKK3sKKwlzdHJ1Y3QgcnRuZXh0aG9wICpuaHAgPSBSVEFfREFUQShydGEpOworCWludCBuaGxlbiA9IFJUQV9QQVlMT0FEKHJ0YSk7CisKKwljaGFuZ2VfbmV4dGhvcHMoZmkpIHsKKwkJaW50IGF0dHJsZW4gPSBuaGxlbiAtIHNpemVvZihzdHJ1Y3QgcnRuZXh0aG9wKTsKKwkJaWYgKGF0dHJsZW4gPCAwIHx8IChuaGxlbiAtPSBuaHAtPnJ0bmhfbGVuKSA8IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbmgtPm5oX2ZsYWdzID0gKHItPnJ0bV9mbGFncyZ+MHhGRikgfCBuaHAtPnJ0bmhfZmxhZ3M7CisJCW5oLT5uaF9vaWYgPSBuaHAtPnJ0bmhfaWZpbmRleDsKKwkJbmgtPm5oX3dlaWdodCA9IG5ocC0+cnRuaF9ob3BzICsgMTsKKwkJaWYgKGF0dHJsZW4pIHsKKwkJCW5oLT5uaF9ndyA9IGZpYl9nZXRfYXR0cjMyKFJUTkhfREFUQShuaHApLCBhdHRybGVuLCBSVEFfR0FURVdBWSk7CisjaWZkZWYgQ09ORklHX05FVF9DTFNfUk9VVEUKKwkJCW5oLT5uaF90Y2xhc3NpZCA9IGZpYl9nZXRfYXR0cjMyKFJUTkhfREFUQShuaHApLCBhdHRybGVuLCBSVEFfRkxPVyk7CisjZW5kaWYKKwkJfQorCQluaHAgPSBSVE5IX05FWFQobmhwKTsKKwl9IGVuZGZvcl9uZXh0aG9wcyhmaSk7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCitpbnQgZmliX25oX21hdGNoKHN0cnVjdCBydG1zZyAqciwgc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBrZXJuX3J0YSAqcnRhLAorCQkgc3RydWN0IGZpYl9pbmZvICpmaSkKK3sKKyNpZmRlZiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRICisJc3RydWN0IHJ0bmV4dGhvcCAqbmhwOworCWludCBuaGxlbjsKKyNlbmRpZgorCisJaWYgKHJ0YS0+cnRhX3ByaW9yaXR5ICYmCisJICAgICpydGEtPnJ0YV9wcmlvcml0eSAhPSBmaS0+ZmliX3ByaW9yaXR5KQorCQlyZXR1cm4gMTsKKworCWlmIChydGEtPnJ0YV9vaWYgfHwgcnRhLT5ydGFfZ3cpIHsKKwkJaWYgKCghcnRhLT5ydGFfb2lmIHx8ICpydGEtPnJ0YV9vaWYgPT0gZmktPmZpYl9uaC0+bmhfb2lmKSAmJgorCQkgICAgKCFydGEtPnJ0YV9ndyAgfHwgbWVtY21wKHJ0YS0+cnRhX2d3LCAmZmktPmZpYl9uaC0+bmhfZ3csIDQpID09IDApKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiAxOworCX0KKworI2lmZGVmIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEgKKwlpZiAocnRhLT5ydGFfbXAgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJbmhwID0gUlRBX0RBVEEocnRhLT5ydGFfbXApOworCW5obGVuID0gUlRBX1BBWUxPQUQocnRhLT5ydGFfbXApOworCQorCWZvcl9uZXh0aG9wcyhmaSkgeworCQlpbnQgYXR0cmxlbiA9IG5obGVuIC0gc2l6ZW9mKHN0cnVjdCBydG5leHRob3ApOworCQl1MzIgZ3c7CisKKwkJaWYgKGF0dHJsZW4gPCAwIHx8IChuaGxlbiAtPSBuaHAtPnJ0bmhfbGVuKSA8IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKG5ocC0+cnRuaF9pZmluZGV4ICYmIG5ocC0+cnRuaF9pZmluZGV4ICE9IG5oLT5uaF9vaWYpCisJCQlyZXR1cm4gMTsKKwkJaWYgKGF0dHJsZW4pIHsKKwkJCWd3ID0gZmliX2dldF9hdHRyMzIoUlROSF9EQVRBKG5ocCksIGF0dHJsZW4sIFJUQV9HQVRFV0FZKTsKKwkJCWlmIChndyAmJiBndyAhPSBuaC0+bmhfZ3cpCisJCQkJcmV0dXJuIDE7CisjaWZkZWYgQ09ORklHX05FVF9DTFNfUk9VVEUKKwkJCWd3ID0gZmliX2dldF9hdHRyMzIoUlROSF9EQVRBKG5ocCksIGF0dHJsZW4sIFJUQV9GTE9XKTsKKwkJCWlmIChndyAmJiBndyAhPSBuaC0+bmhfdGNsYXNzaWQpCisJCQkJcmV0dXJuIDE7CisjZW5kaWYKKwkJfQorCQluaHAgPSBSVE5IX05FWFQobmhwKTsKKwl9IGVuZGZvcl9uZXh0aG9wcyhmaSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworCisvKgorICAgUGljdHVyZQorICAgLS0tLS0tLQorCisgICBTZW1hbnRpY3Mgb2YgbmV4dGhvcCBpcyB2ZXJ5IG1lc3N5IGJ5IGhpc3RvcmljYWwgcmVhc29ucy4KKyAgIFdlIGhhdmUgdG8gdGFrZSBpbnRvIGFjY291bnQsIHRoYXQ6CisgICBhKSBnYXRld2F5IGNhbiBiZSBhY3R1YWxseSBsb2NhbCBpbnRlcmZhY2UgYWRkcmVzcywKKyAgICAgIHNvIHRoYXQgZ2F0ZXdheWVkIHJvdXRlIGlzIGRpcmVjdC4KKyAgIGIpIGdhdGV3YXkgbXVzdCBiZSBvbi1saW5rIGFkZHJlc3MsIHBvc3NpYmx5CisgICAgICBkZXNjcmliZWQgbm90IGJ5IGFuIGlmYWRkciwgYnV0IGFsc28gYnkgYSBkaXJlY3Qgcm91dGUuCisgICBjKSBJZiBib3RoIGdhdGV3YXkgYW5kIGludGVyZmFjZSBhcmUgc3BlY2lmaWVkLCB0aGV5IHNob3VsZCBub3QKKyAgICAgIGNvbnRyYWRpY3QuCisgICBkKSBJZiB3ZSB1c2UgdHVubmVsIHJvdXRlcywgZ2F0ZXdheSBjb3VsZCBiZSBub3Qgb24tbGluay4KKworICAgQXR0ZW1wdCB0byByZWNvbmNpbGUgYWxsIG9mIHRoZXNlIChhbGFzLCBzZWxmLWNvbnRyYWRpY3RvcnkpIGNvbmRpdGlvbnMKKyAgIHJlc3VsdHMgaW4gcHJldHR5IHVnbHkgYW5kIGhhaXJ5IGNvZGUgd2l0aCBvYnNjdXJlIGxvZ2ljLgorCisgICBJIGNob3NlIHRvIGdlbmVyYWxpemVkIGl0IGluc3RlYWQsIHNvIHRoYXQgdGhlIHNpemUKKyAgIG9mIGNvZGUgZG9lcyBub3QgaW5jcmVhc2UgcHJhY3RpY2FsbHksIGJ1dCBpdCBiZWNvbWVzCisgICBtdWNoIG1vcmUgZ2VuZXJhbC4KKyAgIEV2ZXJ5IHByZWZpeCBpcyBhc3NpZ25lZCBhICJzY29wZSIgdmFsdWU6ICJob3N0IiBpcyBsb2NhbCBhZGRyZXNzLAorICAgImxpbmsiIGlzIGRpcmVjdCByb3V0ZSwKKyAgIFsgLi4uICJzaXRlIiAuLi4gImludGVyaW9yIiAuLi4gXQorICAgYW5kICJ1bml2ZXJzZSIgaXMgdHJ1ZSBnYXRld2F5IHJvdXRlIHdpdGggZ2xvYmFsIG1lYW5pbmcuCisKKyAgIEV2ZXJ5IHByZWZpeCByZWZlcnMgdG8gYSBzZXQgb2YgIm5leHRob3AicyAoZ3csIG9pZiksCisgICB3aGVyZSBndyBtdXN0IGhhdmUgbmFycm93ZXIgc2NvcGUuIFRoaXMgcmVjdXJzaW9uIHN0b3BzCisgICB3aGVuIGd3IGhhcyBMT0NBTCBzY29wZSBvciBpZiAibmV4dGhvcCIgaXMgZGVjbGFyZWQgT05MSU5LLAorICAgd2hpY2ggbWVhbnMgdGhhdCBndyBpcyBmb3JjZWQgdG8gYmUgb24gbGluay4KKworICAgQ29kZSBpcyBzdGlsbCBoYWlyeSwgYnV0IG5vdyBpdCBpcyBhcHBhcmVudGx5IGxvZ2ljYWxseQorICAgY29uc2lzdGVudCBhbmQgdmVyeSBmbGV4aWJsZS4gRi5lLiBhcyBieS1wcm9kdWN0IGl0IGFsbG93cworICAgdG8gY28tZXhpc3RzIGluIHBlYWNlIGluZGVwZW5kZW50IGV4dGVyaW9yIGFuZCBpbnRlcmlvcgorICAgcm91dGluZyBwcm9jZXNzZXMuCisKKyAgIE5vcm1hbGx5IGl0IGxvb2tzIGFzIGZvbGxvd2luZy4KKworICAge3VuaXZlcnNlIHByZWZpeH0gIC0+IChndywgb2lmKSBbc2NvcGUgbGlua10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCQkJICB8LT4ge2xpbmsgcHJlZml4fSAtPiAoZ3csIG9pZikgW3Njb3BlIGxvY2FsXQorCQkJICAgICAgICAgICAgICAgICAgICAgICAgfAorCQkJCQkJfC0+IHtsb2NhbCBwcmVmaXh9ICh0ZXJtaW5hbCBub2RlKQorICovCisKK3N0YXRpYyBpbnQgZmliX2NoZWNrX25oKGNvbnN0IHN0cnVjdCBydG1zZyAqciwgc3RydWN0IGZpYl9pbmZvICpmaSwgc3RydWN0IGZpYl9uaCAqbmgpCit7CisJaW50IGVycjsKKworCWlmIChuaC0+bmhfZ3cpIHsKKwkJc3RydWN0IGZpYl9yZXN1bHQgcmVzOworCisjaWZkZWYgQ09ORklHX0lQX1JPVVRFX1BFUlZBU0lWRQorCQlpZiAobmgtPm5oX2ZsYWdzJlJUTkhfRl9QRVJWQVNJVkUpCisJCQlyZXR1cm4gMDsKKyNlbmRpZgorCQlpZiAobmgtPm5oX2ZsYWdzJlJUTkhfRl9PTkxJTkspIHsKKwkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwkJCWlmIChyLT5ydG1fc2NvcGUgPj0gUlRfU0NPUEVfTElOSykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChpbmV0X2FkZHJfdHlwZShuaC0+bmhfZ3cpICE9IFJUTl9VTklDQVNUKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKChkZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgobmgtPm5oX29pZikpID09IE5VTEwpCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQlpZiAoIShkZXYtPmZsYWdzJklGRl9VUCkpCisJCQkJcmV0dXJuIC1FTkVURE9XTjsKKwkJCW5oLT5uaF9kZXYgPSBkZXY7CisJCQlkZXZfaG9sZChkZXYpOworCQkJbmgtPm5oX3Njb3BlID0gUlRfU0NPUEVfTElOSzsKKwkJCXJldHVybiAwOworCQl9CisJCXsKKwkJCXN0cnVjdCBmbG93aSBmbCA9IHsgLm5sX3UgPSB7IC5pcDRfdSA9CisJCQkJCQkgICAgICB7IC5kYWRkciA9IG5oLT5uaF9ndywKKwkJCQkJCQkuc2NvcGUgPSByLT5ydG1fc2NvcGUgKyAxIH0gfSwKKwkJCQkJICAgIC5vaWYgPSBuaC0+bmhfb2lmIH07CisKKwkJCS8qIEl0IGlzIG5vdCBuZWNlc3NhcnksIGJ1dCByZXF1aXJlcyBhIGJpdCBvZiB0aGlua2luZyAqLworCQkJaWYgKGZsLmZsNF9zY29wZSA8IFJUX1NDT1BFX0xJTkspCisJCQkJZmwuZmw0X3Njb3BlID0gUlRfU0NPUEVfTElOSzsKKwkJCWlmICgoZXJyID0gZmliX2xvb2t1cCgmZmwsICZyZXMpKSAhPSAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwkJZXJyID0gLUVJTlZBTDsKKwkJaWYgKHJlcy50eXBlICE9IFJUTl9VTklDQVNUICYmIHJlcy50eXBlICE9IFJUTl9MT0NBTCkKKwkJCWdvdG8gb3V0OworCQluaC0+bmhfc2NvcGUgPSByZXMuc2NvcGU7CisJCW5oLT5uaF9vaWYgPSBGSUJfUkVTX09JRihyZXMpOworCQlpZiAoKG5oLT5uaF9kZXYgPSBGSUJfUkVTX0RFVihyZXMpKSA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJCWRldl9ob2xkKG5oLT5uaF9kZXYpOworCQllcnIgPSAtRU5FVERPV047CisJCWlmICghKG5oLT5uaF9kZXYtPmZsYWdzICYgSUZGX1VQKSkKKwkJCWdvdG8gb3V0OworCQllcnIgPSAwOworb3V0OgorCQlmaWJfcmVzX3B1dCgmcmVzKTsKKwkJcmV0dXJuIGVycjsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisKKwkJaWYgKG5oLT5uaF9mbGFncyYoUlROSF9GX1BFUlZBU0lWRXxSVE5IX0ZfT05MSU5LKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWluX2RldiA9IGluZXRkZXZfYnlfaW5kZXgobmgtPm5oX29pZik7CisJCWlmIChpbl9kZXYgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PREVWOworCQlpZiAoIShpbl9kZXYtPmRldi0+ZmxhZ3MmSUZGX1VQKSkgeworCQkJaW5fZGV2X3B1dChpbl9kZXYpOworCQkJcmV0dXJuIC1FTkVURE9XTjsKKwkJfQorCQluaC0+bmhfZGV2ID0gaW5fZGV2LT5kZXY7CisJCWRldl9ob2xkKG5oLT5uaF9kZXYpOworCQluaC0+bmhfc2NvcGUgPSBSVF9TQ09QRV9IT1NUOworCQlpbl9kZXZfcHV0KGluX2Rldik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBmaWJfbGFkZHJfaGFzaGZuKHUzMiB2YWwpCit7CisJdW5zaWduZWQgaW50IG1hc2sgPSAoZmliX2hhc2hfc2l6ZSAtIDEpOworCisJcmV0dXJuICh2YWwgXiAodmFsID4+IDcpIF4gKHZhbCA+PiAxNCkpICYgbWFzazsKK30KKworc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkICpmaWJfaGFzaF9hbGxvYyhpbnQgYnl0ZXMpCit7CisJaWYgKGJ5dGVzIDw9IFBBR0VfU0laRSkKKwkJcmV0dXJuIGttYWxsb2MoYnl0ZXMsIEdGUF9LRVJORUwpOworCWVsc2UKKwkJcmV0dXJuIChzdHJ1Y3QgaGxpc3RfaGVhZCAqKQorCQkJX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBnZXRfb3JkZXIoYnl0ZXMpKTsKK30KKworc3RhdGljIHZvaWQgZmliX2hhc2hfZnJlZShzdHJ1Y3QgaGxpc3RfaGVhZCAqaGFzaCwgaW50IGJ5dGVzKQoreworCWlmICghaGFzaCkKKwkJcmV0dXJuOworCisJaWYgKGJ5dGVzIDw9IFBBR0VfU0laRSkKKwkJa2ZyZWUoaGFzaCk7CisJZWxzZQorCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSBoYXNoLCBnZXRfb3JkZXIoYnl0ZXMpKTsKK30KKworc3RhdGljIHZvaWQgZmliX2hhc2hfbW92ZShzdHJ1Y3QgaGxpc3RfaGVhZCAqbmV3X2luZm9faGFzaCwKKwkJCSAgc3RydWN0IGhsaXN0X2hlYWQgKm5ld19sYWRkcmhhc2gsCisJCQkgIHVuc2lnbmVkIGludCBuZXdfc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgb2xkX3NpemUgPSBmaWJfaGFzaF9zaXplOworCXVuc2lnbmVkIGludCBpOworCisJd3JpdGVfbG9jaygmZmliX2luZm9fbG9jayk7CisJZmliX2hhc2hfc2l6ZSA9IG5ld19zaXplOworCisJZm9yIChpID0gMDsgaSA8IG9sZF9zaXplOyBpKyspIHsKKwkJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSAmZmliX2luZm9faGFzaFtpXTsKKwkJc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsICpuOworCQlzdHJ1Y3QgZmliX2luZm8gKmZpOworCisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmksIG5vZGUsIG4sIGhlYWQsIGZpYl9oYXNoKSB7CisJCQlzdHJ1Y3QgaGxpc3RfaGVhZCAqZGVzdDsKKwkJCXVuc2lnbmVkIGludCBuZXdfaGFzaDsKKworCQkJaGxpc3RfZGVsKCZmaS0+ZmliX2hhc2gpOworCisJCQluZXdfaGFzaCA9IGZpYl9pbmZvX2hhc2hmbihmaSk7CisJCQlkZXN0ID0gJm5ld19pbmZvX2hhc2hbbmV3X2hhc2hdOworCQkJaGxpc3RfYWRkX2hlYWQoJmZpLT5maWJfaGFzaCwgZGVzdCk7CisJCX0KKwl9CisJZmliX2luZm9faGFzaCA9IG5ld19pbmZvX2hhc2g7CisKKwlmb3IgKGkgPSAwOyBpIDwgb2xkX3NpemU7IGkrKykgeworCQlzdHJ1Y3QgaGxpc3RfaGVhZCAqbGhlYWQgPSAmZmliX2luZm9fbGFkZHJoYXNoW2ldOworCQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKm47CisJCXN0cnVjdCBmaWJfaW5mbyAqZmk7CisKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmaSwgbm9kZSwgbiwgbGhlYWQsIGZpYl9saGFzaCkgeworCQkJc3RydWN0IGhsaXN0X2hlYWQgKmxkZXN0OworCQkJdW5zaWduZWQgaW50IG5ld19oYXNoOworCisJCQlobGlzdF9kZWwoJmZpLT5maWJfbGhhc2gpOworCisJCQluZXdfaGFzaCA9IGZpYl9sYWRkcl9oYXNoZm4oZmktPmZpYl9wcmVmc3JjKTsKKwkJCWxkZXN0ID0gJm5ld19sYWRkcmhhc2hbbmV3X2hhc2hdOworCQkJaGxpc3RfYWRkX2hlYWQoJmZpLT5maWJfbGhhc2gsIGxkZXN0KTsKKwkJfQorCX0KKwlmaWJfaW5mb19sYWRkcmhhc2ggPSBuZXdfbGFkZHJoYXNoOworCisJd3JpdGVfdW5sb2NrKCZmaWJfaW5mb19sb2NrKTsKK30KKworc3RydWN0IGZpYl9pbmZvICoKK2ZpYl9jcmVhdGVfaW5mbyhjb25zdCBzdHJ1Y3QgcnRtc2cgKnIsIHN0cnVjdCBrZXJuX3J0YSAqcnRhLAorCQljb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgaW50ICplcnJwKQoreworCWludCBlcnI7CisJc3RydWN0IGZpYl9pbmZvICpmaSA9IE5VTEw7CisJc3RydWN0IGZpYl9pbmZvICpvZmk7CisjaWZkZWYgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSAorCWludCBuaHMgPSAxOworI2Vsc2UKKwljb25zdCBpbnQgbmhzID0gMTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEhfQ0FDSEVECisJdTMyIG1wX2FsZyA9IElQX01QX0FMR19OT05FOworI2VuZGlmCisKKwkvKiBGYXN0IGNoZWNrIHRvIGNhdGNoIHRoZSBtb3N0IHdlaXJkIGNhc2VzICovCisJaWYgKGZpYl9wcm9wc1tyLT5ydG1fdHlwZV0uc2NvcGUgPiByLT5ydG1fc2NvcGUpCisJCWdvdG8gZXJyX2ludmFsOworCisjaWZkZWYgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSAorCWlmIChydGEtPnJ0YV9tcCkgeworCQluaHMgPSBmaWJfY291bnRfbmV4dGhvcHMocnRhLT5ydGFfbXApOworCQlpZiAobmhzID09IDApCisJCQlnb3RvIGVycl9pbnZhbDsKKwl9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIX0NBQ0hFRAorCWlmIChydGEtPnJ0YV9tcF9hbGcpIHsKKwkJbXBfYWxnID0gKnJ0YS0+cnRhX21wX2FsZzsKKworCQlpZiAobXBfYWxnIDwgSVBfTVBfQUxHX05PTkUgfHwKKwkJICAgIG1wX2FsZyA+IElQX01QX0FMR19NQVgpCisJCQlnb3RvIGVycl9pbnZhbDsKKwl9CisjZW5kaWYKKworCWVyciA9IC1FTk9CVUZTOworCWlmIChmaWJfaW5mb19jbnQgPj0gZmliX2hhc2hfc2l6ZSkgeworCQl1bnNpZ25lZCBpbnQgbmV3X3NpemUgPSBmaWJfaGFzaF9zaXplIDw8IDE7CisJCXN0cnVjdCBobGlzdF9oZWFkICpuZXdfaW5mb19oYXNoOworCQlzdHJ1Y3QgaGxpc3RfaGVhZCAqbmV3X2xhZGRyaGFzaDsKKwkJdW5zaWduZWQgaW50IGJ5dGVzOworCisJCWlmICghbmV3X3NpemUpCisJCQluZXdfc2l6ZSA9IDE7CisJCWJ5dGVzID0gbmV3X3NpemUgKiBzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQgKik7CisJCW5ld19pbmZvX2hhc2ggPSBmaWJfaGFzaF9hbGxvYyhieXRlcyk7CisJCW5ld19sYWRkcmhhc2ggPSBmaWJfaGFzaF9hbGxvYyhieXRlcyk7CisJCWlmICghbmV3X2luZm9faGFzaCB8fCAhbmV3X2xhZGRyaGFzaCkgeworCQkJZmliX2hhc2hfZnJlZShuZXdfaW5mb19oYXNoLCBieXRlcyk7CisJCQlmaWJfaGFzaF9mcmVlKG5ld19sYWRkcmhhc2gsIGJ5dGVzKTsKKwkJfSBlbHNlIHsKKwkJCW1lbXNldChuZXdfaW5mb19oYXNoLCAwLCBieXRlcyk7CisJCQltZW1zZXQobmV3X2xhZGRyaGFzaCwgMCwgYnl0ZXMpOworCisJCQlmaWJfaGFzaF9tb3ZlKG5ld19pbmZvX2hhc2gsIG5ld19sYWRkcmhhc2gsIG5ld19zaXplKTsKKwkJfQorCisJCWlmICghZmliX2hhc2hfc2l6ZSkKKwkJCWdvdG8gZmFpbHVyZTsKKwl9CisKKwlmaSA9IGttYWxsb2Moc2l6ZW9mKCpmaSkrbmhzKnNpemVvZihzdHJ1Y3QgZmliX25oKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGZpID09IE5VTEwpCisJCWdvdG8gZmFpbHVyZTsKKwlmaWJfaW5mb19jbnQrKzsKKwltZW1zZXQoZmksIDAsIHNpemVvZigqZmkpK25ocypzaXplb2Yoc3RydWN0IGZpYl9uaCkpOworCisJZmktPmZpYl9wcm90b2NvbCA9IHItPnJ0bV9wcm90b2NvbDsKKworCWZpLT5maWJfbmhzID0gbmhzOworCWNoYW5nZV9uZXh0aG9wcyhmaSkgeworCQluaC0+bmhfcGFyZW50ID0gZmk7CisJfSBlbmRmb3JfbmV4dGhvcHMoZmkpCisKKwlmaS0+ZmliX2ZsYWdzID0gci0+cnRtX2ZsYWdzOworCWlmIChydGEtPnJ0YV9wcmlvcml0eSkKKwkJZmktPmZpYl9wcmlvcml0eSA9ICpydGEtPnJ0YV9wcmlvcml0eTsKKwlpZiAocnRhLT5ydGFfbXgpIHsKKwkJaW50IGF0dHJsZW4gPSBSVEFfUEFZTE9BRChydGEtPnJ0YV9teCk7CisJCXN0cnVjdCBydGF0dHIgKmF0dHIgPSBSVEFfREFUQShydGEtPnJ0YV9teCk7CisKKwkJd2hpbGUgKFJUQV9PSyhhdHRyLCBhdHRybGVuKSkgeworCQkJdW5zaWduZWQgZmxhdm9yID0gYXR0ci0+cnRhX3R5cGU7CisJCQlpZiAoZmxhdm9yKSB7CisJCQkJaWYgKGZsYXZvciA+IFJUQVhfTUFYKQorCQkJCQlnb3RvIGVycl9pbnZhbDsKKwkJCQlmaS0+ZmliX21ldHJpY3NbZmxhdm9yLTFdID0gKih1bnNpZ25lZCopUlRBX0RBVEEoYXR0cik7CisJCQl9CisJCQlhdHRyID0gUlRBX05FWFQoYXR0ciwgYXR0cmxlbik7CisJCX0KKwl9CisJaWYgKHJ0YS0+cnRhX3ByZWZzcmMpCisJCW1lbWNweSgmZmktPmZpYl9wcmVmc3JjLCBydGEtPnJ0YV9wcmVmc3JjLCA0KTsKKworCWlmIChydGEtPnJ0YV9tcCkgeworI2lmZGVmIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEgKKwkJaWYgKChlcnIgPSBmaWJfZ2V0X25ocyhmaSwgcnRhLT5ydGFfbXAsIHIpKSAhPSAwKQorCQkJZ290byBmYWlsdXJlOworCQlpZiAocnRhLT5ydGFfb2lmICYmIGZpLT5maWJfbmgtPm5oX29pZiAhPSAqcnRhLT5ydGFfb2lmKQorCQkJZ290byBlcnJfaW52YWw7CisJCWlmIChydGEtPnJ0YV9ndyAmJiBtZW1jbXAoJmZpLT5maWJfbmgtPm5oX2d3LCBydGEtPnJ0YV9ndywgNCkpCisJCQlnb3RvIGVycl9pbnZhbDsKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19ST1VURQorCQlpZiAocnRhLT5ydGFfZmxvdyAmJiBtZW1jbXAoJmZpLT5maWJfbmgtPm5oX3RjbGFzc2lkLCBydGEtPnJ0YV9mbG93LCA0KSkKKwkJCWdvdG8gZXJyX2ludmFsOworI2VuZGlmCisjZWxzZQorCQlnb3RvIGVycl9pbnZhbDsKKyNlbmRpZgorCX0gZWxzZSB7CisJCXN0cnVjdCBmaWJfbmggKm5oID0gZmktPmZpYl9uaDsKKwkJaWYgKHJ0YS0+cnRhX29pZikKKwkJCW5oLT5uaF9vaWYgPSAqcnRhLT5ydGFfb2lmOworCQlpZiAocnRhLT5ydGFfZ3cpCisJCQltZW1jcHkoJm5oLT5uaF9ndywgcnRhLT5ydGFfZ3csIDQpOworI2lmZGVmIENPTkZJR19ORVRfQ0xTX1JPVVRFCisJCWlmIChydGEtPnJ0YV9mbG93KQorCQkJbWVtY3B5KCZuaC0+bmhfdGNsYXNzaWQsIHJ0YS0+cnRhX2Zsb3csIDQpOworI2VuZGlmCisJCW5oLT5uaF9mbGFncyA9IHItPnJ0bV9mbGFnczsKKyNpZmRlZiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRICisJCW5oLT5uaF93ZWlnaHQgPSAxOworI2VuZGlmCisJfQorCisjaWZkZWYgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSF9DQUNIRUQKKwlmaS0+ZmliX21wX2FsZyA9IG1wX2FsZzsKKyNlbmRpZgorCisJaWYgKGZpYl9wcm9wc1tyLT5ydG1fdHlwZV0uZXJyb3IpIHsKKwkJaWYgKHJ0YS0+cnRhX2d3IHx8IHJ0YS0+cnRhX29pZiB8fCBydGEtPnJ0YV9tcCkKKwkJCWdvdG8gZXJyX2ludmFsOworCQlnb3RvIGxpbmtfaXQ7CisJfQorCisJaWYgKHItPnJ0bV9zY29wZSA+IFJUX1NDT1BFX0hPU1QpCisJCWdvdG8gZXJyX2ludmFsOworCisJaWYgKHItPnJ0bV9zY29wZSA9PSBSVF9TQ09QRV9IT1NUKSB7CisJCXN0cnVjdCBmaWJfbmggKm5oID0gZmktPmZpYl9uaDsKKworCQkvKiBMb2NhbCBhZGRyZXNzIGlzIGFkZGVkLiAqLworCQlpZiAobmhzICE9IDEgfHwgbmgtPm5oX2d3KQorCQkJZ290byBlcnJfaW52YWw7CisJCW5oLT5uaF9zY29wZSA9IFJUX1NDT1BFX05PV0hFUkU7CisJCW5oLT5uaF9kZXYgPSBkZXZfZ2V0X2J5X2luZGV4KGZpLT5maWJfbmgtPm5oX29pZik7CisJCWVyciA9IC1FTk9ERVY7CisJCWlmIChuaC0+bmhfZGV2ID09IE5VTEwpCisJCQlnb3RvIGZhaWx1cmU7CisJfSBlbHNlIHsKKwkJY2hhbmdlX25leHRob3BzKGZpKSB7CisJCQlpZiAoKGVyciA9IGZpYl9jaGVja19uaChyLCBmaSwgbmgpKSAhPSAwKQorCQkJCWdvdG8gZmFpbHVyZTsKKwkJfSBlbmRmb3JfbmV4dGhvcHMoZmkpCisJfQorCisJaWYgKGZpLT5maWJfcHJlZnNyYykgeworCQlpZiAoci0+cnRtX3R5cGUgIT0gUlROX0xPQ0FMIHx8IHJ0YS0+cnRhX2RzdCA9PSBOVUxMIHx8CisJCSAgICBtZW1jbXAoJmZpLT5maWJfcHJlZnNyYywgcnRhLT5ydGFfZHN0LCA0KSkKKwkJCWlmIChpbmV0X2FkZHJfdHlwZShmaS0+ZmliX3ByZWZzcmMpICE9IFJUTl9MT0NBTCkKKwkJCQlnb3RvIGVycl9pbnZhbDsKKwl9CisKK2xpbmtfaXQ6CisJaWYgKChvZmkgPSBmaWJfZmluZF9pbmZvKGZpKSkgIT0gTlVMTCkgeworCQlmaS0+ZmliX2RlYWQgPSAxOworCQlmcmVlX2ZpYl9pbmZvKGZpKTsKKwkJb2ZpLT5maWJfdHJlZXJlZisrOworCQlyZXR1cm4gb2ZpOworCX0KKworCWZpLT5maWJfdHJlZXJlZisrOworCWF0b21pY19pbmMoJmZpLT5maWJfY2xudHJlZik7CisJd3JpdGVfbG9jaygmZmliX2luZm9fbG9jayk7CisJaGxpc3RfYWRkX2hlYWQoJmZpLT5maWJfaGFzaCwKKwkJICAgICAgICZmaWJfaW5mb19oYXNoW2ZpYl9pbmZvX2hhc2hmbihmaSldKTsKKwlpZiAoZmktPmZpYl9wcmVmc3JjKSB7CisJCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCisJCWhlYWQgPSAmZmliX2luZm9fbGFkZHJoYXNoW2ZpYl9sYWRkcl9oYXNoZm4oZmktPmZpYl9wcmVmc3JjKV07CisJCWhsaXN0X2FkZF9oZWFkKCZmaS0+ZmliX2xoYXNoLCBoZWFkKTsKKwl9CisJY2hhbmdlX25leHRob3BzKGZpKSB7CisJCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCQl1bnNpZ25lZCBpbnQgaGFzaDsKKworCQlpZiAoIW5oLT5uaF9kZXYpCisJCQljb250aW51ZTsKKwkJaGFzaCA9IGZpYl9kZXZpbmRleF9oYXNoZm4obmgtPm5oX2Rldi0+aWZpbmRleCk7CisJCWhlYWQgPSAmZmliX2luZm9fZGV2aGFzaFtoYXNoXTsKKwkJaGxpc3RfYWRkX2hlYWQoJm5oLT5uaF9oYXNoLCBoZWFkKTsKKwl9IGVuZGZvcl9uZXh0aG9wcyhmaSkKKwl3cml0ZV91bmxvY2soJmZpYl9pbmZvX2xvY2spOworCXJldHVybiBmaTsKKworZXJyX2ludmFsOgorCWVyciA9IC1FSU5WQUw7CisKK2ZhaWx1cmU6CisgICAgICAgICplcnJwID0gZXJyOworICAgICAgICBpZiAoZmkpIHsKKwkJZmktPmZpYl9kZWFkID0gMTsKKwkJZnJlZV9maWJfaW5mbyhmaSk7CisJfQorCXJldHVybiBOVUxMOworfQorCitpbnQgZmliX3NlbWFudGljX21hdGNoKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIGNvbnN0IHN0cnVjdCBmbG93aSAqZmxwLAorCQkgICAgICAgc3RydWN0IGZpYl9yZXN1bHQgKnJlcywgX191MzIgem9uZSwgX191MzIgbWFzaywgCisJCQlpbnQgcHJlZml4bGVuKQoreworCXN0cnVjdCBmaWJfYWxpYXMgKmZhOworCWludCBuaF9zZWwgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmYSwgaGVhZCwgZmFfbGlzdCkgeworCQlpbnQgZXJyOworCisJCWlmIChmYS0+ZmFfdG9zICYmCisJCSAgICBmYS0+ZmFfdG9zICE9IGZscC0+Zmw0X3RvcykKKwkJCWNvbnRpbnVlOworCisJCWlmIChmYS0+ZmFfc2NvcGUgPCBmbHAtPmZsNF9zY29wZSkKKwkJCWNvbnRpbnVlOworCisJCWZhLT5mYV9zdGF0ZSB8PSBGQV9TX0FDQ0VTU0VEOworCisJCWVyciA9IGZpYl9wcm9wc1tmYS0+ZmFfdHlwZV0uZXJyb3I7CisJCWlmIChlcnIgPT0gMCkgeworCQkJc3RydWN0IGZpYl9pbmZvICpmaSA9IGZhLT5mYV9pbmZvOworCisJCQlpZiAoZmktPmZpYl9mbGFncyAmIFJUTkhfRl9ERUFEKQorCQkJCWNvbnRpbnVlOworCisJCQlzd2l0Y2ggKGZhLT5mYV90eXBlKSB7CisJCQljYXNlIFJUTl9VTklDQVNUOgorCQkJY2FzZSBSVE5fTE9DQUw6CisJCQljYXNlIFJUTl9CUk9BRENBU1Q6CisJCQljYXNlIFJUTl9BTllDQVNUOgorCQkJY2FzZSBSVE5fTVVMVElDQVNUOgorCQkJCWZvcl9uZXh0aG9wcyhmaSkgeworCQkJCQlpZiAobmgtPm5oX2ZsYWdzJlJUTkhfRl9ERUFEKQorCQkJCQkJY29udGludWU7CisJCQkJCWlmICghZmxwLT5vaWYgfHwgZmxwLT5vaWYgPT0gbmgtPm5oX29pZikKKwkJCQkJCWJyZWFrOworCQkJCX0KKyNpZmRlZiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRICisJCQkJaWYgKG5oc2VsIDwgZmktPmZpYl9uaHMpIHsKKwkJCQkJbmhfc2VsID0gbmhzZWw7CisJCQkJCWdvdG8gb3V0X2ZpbGxfcmVzOworCQkJCX0KKyNlbHNlCisJCQkJaWYgKG5oc2VsIDwgMSkgeworCQkJCQlnb3RvIG91dF9maWxsX3JlczsKKwkJCQl9CisjZW5kaWYKKwkJCQllbmRmb3JfbmV4dGhvcHMoZmkpOworCQkJCWNvbnRpbnVlOworCisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhLRVJOX0RFQlVHICJpbXBvc3NpYmxlIDEwMlxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9OworCQl9CisJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAxOworCitvdXRfZmlsbF9yZXM6CisJcmVzLT5wcmVmaXhsZW4gPSBwcmVmaXhsZW47CisJcmVzLT5uaF9zZWwgPSBuaF9zZWw7CisJcmVzLT50eXBlID0gZmEtPmZhX3R5cGU7CisJcmVzLT5zY29wZSA9IGZhLT5mYV9zY29wZTsKKwlyZXMtPmZpID0gZmEtPmZhX2luZm87CisjaWZkZWYgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSF9DQUNIRUQKKwlyZXMtPm5ldG1hc2sgPSBtYXNrOworCXJlcy0+bmV0d29yayA9IHpvbmUgJgorCQkoMHhGRkZGRkZGRiA+PiAoMzIgLSBwcmVmaXhsZW4pKTsKKyNlbmRpZgorCWF0b21pY19pbmMoJnJlcy0+ZmktPmZpYl9jbG50cmVmKTsKKwlyZXR1cm4gMDsKK30KKworLyogRmluZCBhcHByb3ByaWF0ZSBzb3VyY2UgYWRkcmVzcyB0byB0aGlzIGRlc3RpbmF0aW9uICovCisKK3UzMiBfX2ZpYl9yZXNfcHJlZnNyYyhzdHJ1Y3QgZmliX3Jlc3VsdCAqcmVzKQoreworCXJldHVybiBpbmV0X3NlbGVjdF9hZGRyKEZJQl9SRVNfREVWKCpyZXMpLCBGSUJfUkVTX0dXKCpyZXMpLCByZXMtPnNjb3BlKTsKK30KKworaW50CitmaWJfZHVtcF9pbmZvKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBwaWQsIHUzMiBzZXEsIGludCBldmVudCwKKwkgICAgICB1OCB0Yl9pZCwgdTggdHlwZSwgdTggc2NvcGUsIHZvaWQgKmRzdCwgaW50IGRzdF9sZW4sIHU4IHRvcywKKwkgICAgICBzdHJ1Y3QgZmliX2luZm8gKmZpKQoreworCXN0cnVjdCBydG1zZyAqcnRtOworCXN0cnVjdCBubG1zZ2hkciAgKm5saDsKKwl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYi0+dGFpbDsKKworCW5saCA9IE5MTVNHX1BVVChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCpydG0pKTsKKwlydG0gPSBOTE1TR19EQVRBKG5saCk7CisJcnRtLT5ydG1fZmFtaWx5ID0gQUZfSU5FVDsKKwlydG0tPnJ0bV9kc3RfbGVuID0gZHN0X2xlbjsKKwlydG0tPnJ0bV9zcmNfbGVuID0gMDsKKwlydG0tPnJ0bV90b3MgPSB0b3M7CisJcnRtLT5ydG1fdGFibGUgPSB0Yl9pZDsKKwlydG0tPnJ0bV90eXBlID0gdHlwZTsKKwlydG0tPnJ0bV9mbGFncyA9IGZpLT5maWJfZmxhZ3M7CisJcnRtLT5ydG1fc2NvcGUgPSBzY29wZTsKKwlpZiAocnRtLT5ydG1fZHN0X2xlbikKKwkJUlRBX1BVVChza2IsIFJUQV9EU1QsIDQsIGRzdCk7CisJcnRtLT5ydG1fcHJvdG9jb2wgPSBmaS0+ZmliX3Byb3RvY29sOworCWlmIChmaS0+ZmliX3ByaW9yaXR5KQorCQlSVEFfUFVUKHNrYiwgUlRBX1BSSU9SSVRZLCA0LCAmZmktPmZpYl9wcmlvcml0eSk7CisjaWZkZWYgQ09ORklHX05FVF9DTFNfUk9VVEUKKwlpZiAoZmktPmZpYl9uaFswXS5uaF90Y2xhc3NpZCkKKwkJUlRBX1BVVChza2IsIFJUQV9GTE9XLCA0LCAmZmktPmZpYl9uaFswXS5uaF90Y2xhc3NpZCk7CisjZW5kaWYKKwlpZiAocnRuZXRsaW5rX3B1dF9tZXRyaWNzKHNrYiwgZmktPmZpYl9tZXRyaWNzKSA8IDApCisJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CisJaWYgKGZpLT5maWJfcHJlZnNyYykKKwkJUlRBX1BVVChza2IsIFJUQV9QUkVGU1JDLCA0LCAmZmktPmZpYl9wcmVmc3JjKTsKKwlpZiAoZmktPmZpYl9uaHMgPT0gMSkgeworCQlpZiAoZmktPmZpYl9uaC0+bmhfZ3cpCisJCQlSVEFfUFVUKHNrYiwgUlRBX0dBVEVXQVksIDQsICZmaS0+ZmliX25oLT5uaF9ndyk7CisJCWlmIChmaS0+ZmliX25oLT5uaF9vaWYpCisJCQlSVEFfUFVUKHNrYiwgUlRBX09JRiwgc2l6ZW9mKGludCksICZmaS0+ZmliX25oLT5uaF9vaWYpOworCX0KKyNpZmRlZiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRICisJaWYgKGZpLT5maWJfbmhzID4gMSkgeworCQlzdHJ1Y3QgcnRuZXh0aG9wICpuaHA7CisJCXN0cnVjdCBydGF0dHIgKm1wX2hlYWQ7CisJCWlmIChza2JfdGFpbHJvb20oc2tiKSA8PSBSVEFfU1BBQ0UoMCkpCisJCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOworCQltcF9oZWFkID0gKHN0cnVjdCBydGF0dHIqKXNrYl9wdXQoc2tiLCBSVEFfU1BBQ0UoMCkpOworCisJCWZvcl9uZXh0aG9wcyhmaSkgeworCQkJaWYgKHNrYl90YWlscm9vbShza2IpIDwgUlRBX0FMSUdOKFJUQV9BTElHTihzaXplb2YoKm5ocCkpICsgNCkpCisJCQkJZ290byBydGF0dHJfZmFpbHVyZTsKKwkJCW5ocCA9IChzdHJ1Y3QgcnRuZXh0aG9wKilza2JfcHV0KHNrYiwgUlRBX0FMSUdOKHNpemVvZigqbmhwKSkpOworCQkJbmhwLT5ydG5oX2ZsYWdzID0gbmgtPm5oX2ZsYWdzICYgMHhGRjsKKwkJCW5ocC0+cnRuaF9ob3BzID0gbmgtPm5oX3dlaWdodC0xOworCQkJbmhwLT5ydG5oX2lmaW5kZXggPSBuaC0+bmhfb2lmOworCQkJaWYgKG5oLT5uaF9ndykKKwkJCQlSVEFfUFVUKHNrYiwgUlRBX0dBVEVXQVksIDQsICZuaC0+bmhfZ3cpOworCQkJbmhwLT5ydG5oX2xlbiA9IHNrYi0+dGFpbCAtICh1bnNpZ25lZCBjaGFyKiluaHA7CisJCX0gZW5kZm9yX25leHRob3BzKGZpKTsKKwkJbXBfaGVhZC0+cnRhX3R5cGUgPSBSVEFfTVVMVElQQVRIOworCQltcF9oZWFkLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4KiltcF9oZWFkOworCX0KKyNlbmRpZgorCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlyZXR1cm4gc2tiLT5sZW47CisKK25sbXNnX2ZhaWx1cmU6CitydGF0dHJfZmFpbHVyZToKKwlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCXJldHVybiAtMTsKK30KKworI2lmbmRlZiBDT05GSUdfSVBfTk9TSU9DUlQKKworaW50CitmaWJfY29udmVydF9ydGVudHJ5KGludCBjbWQsIHN0cnVjdCBubG1zZ2hkciAqbmwsIHN0cnVjdCBydG1zZyAqcnRtLAorCQkgICAgc3RydWN0IGtlcm5fcnRhICpydGEsIHN0cnVjdCBydGVudHJ5ICpyKQoreworCWludCAgICBwbGVuOworCXUzMiAgICAqcHRyOworCisJbWVtc2V0KHJ0bSwgMCwgc2l6ZW9mKCpydG0pKTsKKwltZW1zZXQocnRhLCAwLCBzaXplb2YoKnJ0YSkpOworCisJaWYgKHItPnJ0X2RzdC5zYV9mYW1pbHkgIT0gQUZfSU5FVCkKKwkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisKKwkvKiBDaGVjayBtYXNrIGZvciB2YWxpZGl0eToKKwkgICBhKSBpdCBtdXN0IGJlIGNvbnRpZ3VvdXMuCisJICAgYikgZGVzdGluYXRpb24gbXVzdCBoYXZlIGFsbCBob3N0IGJpdHMgY2xlYXIuCisJICAgYykgaWYgYXBwbGljYXRpb24gZm9yZ290IHRvIHNldCBjb3JyZWN0IGZhbWlseSAoQUZfSU5FVCksCisJICAgICAgcmVqZWN0IHJlcXVlc3QgdW5sZXNzIGl0IGlzIGFic29sdXRlbHkgY2xlYXIgaS5lLgorCSAgICAgIGJvdGggZmFtaWx5IGFuZCBtYXNrIGFyZSB6ZXJvLgorCSAqLworCXBsZW4gPSAzMjsKKwlwdHIgPSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW4qKSZyLT5ydF9kc3QpLT5zaW5fYWRkci5zX2FkZHI7CisJaWYgKCEoci0+cnRfZmxhZ3MmUlRGX0hPU1QpKSB7CisJCXUzMiBtYXNrID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW4qKSZyLT5ydF9nZW5tYXNrKS0+c2luX2FkZHIuc19hZGRyOworCQlpZiAoci0+cnRfZ2VubWFzay5zYV9mYW1pbHkgIT0gQUZfSU5FVCkgeworCQkJaWYgKG1hc2sgfHwgci0+cnRfZ2VubWFzay5zYV9mYW1pbHkpCisJCQkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisJCX0KKwkJaWYgKGJhZF9tYXNrKG1hc2ssICpwdHIpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXBsZW4gPSBpbmV0X21hc2tfbGVuKG1hc2spOworCX0KKworCW5sLT5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7CisJbmwtPm5sbXNnX3BpZCA9IDA7CisJbmwtPm5sbXNnX3NlcSA9IDA7CisJbmwtPm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2YoKnJ0bSkpOworCWlmIChjbWQgPT0gU0lPQ0RFTFJUKSB7CisJCW5sLT5ubG1zZ190eXBlID0gUlRNX0RFTFJPVVRFOworCQlubC0+bmxtc2dfZmxhZ3MgPSAwOworCX0gZWxzZSB7CisJCW5sLT5ubG1zZ190eXBlID0gUlRNX05FV1JPVVRFOworCQlubC0+bmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUfE5MTV9GX0NSRUFURTsKKwkJcnRtLT5ydG1fcHJvdG9jb2wgPSBSVFBST1RfQk9PVDsKKwl9CisKKwlydG0tPnJ0bV9kc3RfbGVuID0gcGxlbjsKKwlydGEtPnJ0YV9kc3QgPSBwdHI7CisKKwlpZiAoci0+cnRfbWV0cmljKSB7CisJCSoodTMyKikmci0+cnRfcGFkMyA9IHItPnJ0X21ldHJpYyAtIDE7CisJCXJ0YS0+cnRhX3ByaW9yaXR5ID0gKHUzMiopJnItPnJ0X3BhZDM7CisJfQorCWlmIChyLT5ydF9mbGFncyZSVEZfUkVKRUNUKSB7CisJCXJ0bS0+cnRtX3Njb3BlID0gUlRfU0NPUEVfSE9TVDsKKwkJcnRtLT5ydG1fdHlwZSA9IFJUTl9VTlJFQUNIQUJMRTsKKwkJcmV0dXJuIDA7CisJfQorCXJ0bS0+cnRtX3Njb3BlID0gUlRfU0NPUEVfTk9XSEVSRTsKKwlydG0tPnJ0bV90eXBlID0gUlROX1VOSUNBU1Q7CisKKwlpZiAoci0+cnRfZGV2KSB7CisJCWNoYXIgKmNvbG9uOworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCQljaGFyICAgZGV2bmFtZVtJRk5BTVNJWl07CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGRldm5hbWUsIHItPnJ0X2RldiwgSUZOQU1TSVotMSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZGV2bmFtZVtJRk5BTVNJWi0xXSA9IDA7CisJCWNvbG9uID0gc3RyY2hyKGRldm5hbWUsICc6Jyk7CisJCWlmIChjb2xvbikKKwkJCSpjb2xvbiA9IDA7CisJCWRldiA9IF9fZGV2X2dldF9ieV9uYW1lKGRldm5hbWUpOworCQlpZiAoIWRldikKKwkJCXJldHVybiAtRU5PREVWOworCQlydGEtPnJ0YV9vaWYgPSAmZGV2LT5pZmluZGV4OworCQlpZiAoY29sb24pIHsKKwkJCXN0cnVjdCBpbl9pZmFkZHIgKmlmYTsKKwkJCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiA9IF9faW5fZGV2X2dldChkZXYpOworCQkJaWYgKCFpbl9kZXYpCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQkqY29sb24gPSAnOic7CisJCQlmb3IgKGlmYSA9IGluX2Rldi0+aWZhX2xpc3Q7IGlmYTsgaWZhID0gaWZhLT5pZmFfbmV4dCkKKwkJCQlpZiAoc3RyY21wKGlmYS0+aWZhX2xhYmVsLCBkZXZuYW1lKSA9PSAwKQorCQkJCQlicmVhazsKKwkJCWlmIChpZmEgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCXJ0YS0+cnRhX3ByZWZzcmMgPSAmaWZhLT5pZmFfbG9jYWw7CisJCX0KKwl9CisKKwlwdHIgPSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW4qKSZyLT5ydF9nYXRld2F5KS0+c2luX2FkZHIuc19hZGRyOworCWlmIChyLT5ydF9nYXRld2F5LnNhX2ZhbWlseSA9PSBBRl9JTkVUICYmICpwdHIpIHsKKwkJcnRhLT5ydGFfZ3cgPSBwdHI7CisJCWlmIChyLT5ydF9mbGFncyZSVEZfR0FURVdBWSAmJiBpbmV0X2FkZHJfdHlwZSgqcHRyKSA9PSBSVE5fVU5JQ0FTVCkKKwkJCXJ0bS0+cnRtX3Njb3BlID0gUlRfU0NPUEVfVU5JVkVSU0U7CisJfQorCisJaWYgKGNtZCA9PSBTSU9DREVMUlQpCisJCXJldHVybiAwOworCisJaWYgKHItPnJ0X2ZsYWdzJlJURl9HQVRFV0FZICYmIHJ0YS0+cnRhX2d3ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHJ0bS0+cnRtX3Njb3BlID09IFJUX1NDT1BFX05PV0hFUkUpCisJCXJ0bS0+cnRtX3Njb3BlID0gUlRfU0NPUEVfTElOSzsKKworCWlmIChyLT5ydF9mbGFncyYoUlRGX01UVXxSVEZfV0lORE9XfFJURl9JUlRUKSkgeworCQlzdHJ1Y3QgcnRhdHRyICpyZWM7CisJCXN0cnVjdCBydGF0dHIgKm14ID0ga21hbGxvYyhSVEFfTEVOR1RIKDMqUlRBX0xFTkdUSCg0KSksIEdGUF9LRVJORUwpOworCQlpZiAobXggPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlydGEtPnJ0YV9teCA9IG14OworCQlteC0+cnRhX3R5cGUgPSBSVEFfTUVUUklDUzsKKwkJbXgtPnJ0YV9sZW4gID0gUlRBX0xFTkdUSCgwKTsKKwkJaWYgKHItPnJ0X2ZsYWdzJlJURl9NVFUpIHsKKwkJCXJlYyA9ICh2b2lkKikoKGNoYXIqKW14ICsgUlRBX0FMSUdOKG14LT5ydGFfbGVuKSk7CisJCQlyZWMtPnJ0YV90eXBlID0gUlRBWF9BRFZNU1M7CisJCQlyZWMtPnJ0YV9sZW4gPSBSVEFfTEVOR1RIKDQpOworCQkJbXgtPnJ0YV9sZW4gKz0gUlRBX0xFTkdUSCg0KTsKKwkJCSoodTMyKilSVEFfREFUQShyZWMpID0gci0+cnRfbXR1IC0gNDA7CisJCX0KKwkJaWYgKHItPnJ0X2ZsYWdzJlJURl9XSU5ET1cpIHsKKwkJCXJlYyA9ICh2b2lkKikoKGNoYXIqKW14ICsgUlRBX0FMSUdOKG14LT5ydGFfbGVuKSk7CisJCQlyZWMtPnJ0YV90eXBlID0gUlRBWF9XSU5ET1c7CisJCQlyZWMtPnJ0YV9sZW4gPSBSVEFfTEVOR1RIKDQpOworCQkJbXgtPnJ0YV9sZW4gKz0gUlRBX0xFTkdUSCg0KTsKKwkJCSoodTMyKilSVEFfREFUQShyZWMpID0gci0+cnRfd2luZG93OworCQl9CisJCWlmIChyLT5ydF9mbGFncyZSVEZfSVJUVCkgeworCQkJcmVjID0gKHZvaWQqKSgoY2hhciopbXggKyBSVEFfQUxJR04obXgtPnJ0YV9sZW4pKTsKKwkJCXJlYy0+cnRhX3R5cGUgPSBSVEFYX1JUVDsKKwkJCXJlYy0+cnRhX2xlbiA9IFJUQV9MRU5HVEgoNCk7CisJCQlteC0+cnRhX2xlbiArPSBSVEFfTEVOR1RIKDQpOworCQkJKih1MzIqKVJUQV9EQVRBKHJlYykgPSByLT5ydF9pcnR0PDwzOworCQl9CisJfQorCXJldHVybiAwOworfQorCisjZW5kaWYKKworLyoKKyAgIFVwZGF0ZSBGSUIgaWY6CisgICAtIGxvY2FsIGFkZHJlc3MgZGlzYXBwZWFyZWQgLT4gd2UgbXVzdCBkZWxldGUgYWxsIHRoZSBlbnRyaWVzCisgICAgIHJlZmVycmluZyB0byBpdC4KKyAgIC0gZGV2aWNlIHdlbnQgZG93biAtPiB3ZSBtdXN0IHNodXRkb3duIGFsbCBuZXh0aG9wcyBnb2luZyB2aWEgaXQuCisgKi8KKworaW50IGZpYl9zeW5jX2Rvd24odTMyIGxvY2FsLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZm9yY2UpCit7CisJaW50IHJldCA9IDA7CisJaW50IHNjb3BlID0gUlRfU0NPUEVfTk9XSEVSRTsKKwkKKwlpZiAoZm9yY2UpCisJCXNjb3BlID0gLTE7CisKKwlpZiAobG9jYWwgJiYgZmliX2luZm9fbGFkZHJoYXNoKSB7CisJCXVuc2lnbmVkIGludCBoYXNoID0gZmliX2xhZGRyX2hhc2hmbihsb2NhbCk7CisJCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkID0gJmZpYl9pbmZvX2xhZGRyaGFzaFtoYXNoXTsKKwkJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJCXN0cnVjdCBmaWJfaW5mbyAqZmk7CisKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnkoZmksIG5vZGUsIGhlYWQsIGZpYl9saGFzaCkgeworCQkJaWYgKGZpLT5maWJfcHJlZnNyYyA9PSBsb2NhbCkgeworCQkJCWZpLT5maWJfZmxhZ3MgfD0gUlROSF9GX0RFQUQ7CisJCQkJcmV0Kys7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoZGV2KSB7CisJCXN0cnVjdCBmaWJfaW5mbyAqcHJldl9maSA9IE5VTEw7CisJCXVuc2lnbmVkIGludCBoYXNoID0gZmliX2RldmluZGV4X2hhc2hmbihkZXYtPmlmaW5kZXgpOworCQlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCA9ICZmaWJfaW5mb19kZXZoYXNoW2hhc2hdOworCQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwkJc3RydWN0IGZpYl9uaCAqbmg7CisKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnkobmgsIG5vZGUsIGhlYWQsIG5oX2hhc2gpIHsKKwkJCXN0cnVjdCBmaWJfaW5mbyAqZmkgPSBuaC0+bmhfcGFyZW50OworCQkJaW50IGRlYWQ7CisKKwkJCUJVR19PTighZmktPmZpYl9uaHMpOworCQkJaWYgKG5oLT5uaF9kZXYgIT0gZGV2IHx8IGZpID09IHByZXZfZmkpCisJCQkJY29udGludWU7CisJCQlwcmV2X2ZpID0gZmk7CisJCQlkZWFkID0gMDsKKwkJCWNoYW5nZV9uZXh0aG9wcyhmaSkgeworCQkJCWlmIChuaC0+bmhfZmxhZ3MmUlROSF9GX0RFQUQpCisJCQkJCWRlYWQrKzsKKwkJCQllbHNlIGlmIChuaC0+bmhfZGV2ID09IGRldiAmJgorCQkJCQkgbmgtPm5oX3Njb3BlICE9IHNjb3BlKSB7CisJCQkJCW5oLT5uaF9mbGFncyB8PSBSVE5IX0ZfREVBRDsKKyNpZmRlZiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRICisJCQkJCXNwaW5fbG9ja19iaCgmZmliX211bHRpcGF0aF9sb2NrKTsKKwkJCQkJZmktPmZpYl9wb3dlciAtPSBuaC0+bmhfcG93ZXI7CisJCQkJCW5oLT5uaF9wb3dlciA9IDA7CisJCQkJCXNwaW5fdW5sb2NrX2JoKCZmaWJfbXVsdGlwYXRoX2xvY2spOworI2VuZGlmCisJCQkJCWRlYWQrKzsKKwkJCQl9CisjaWZkZWYgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSAorCQkJCWlmIChmb3JjZSA+IDEgJiYgbmgtPm5oX2RldiA9PSBkZXYpIHsKKwkJCQkJZGVhZCA9IGZpLT5maWJfbmhzOworCQkJCQlicmVhazsKKwkJCQl9CisjZW5kaWYKKwkJCX0gZW5kZm9yX25leHRob3BzKGZpKQorCQkJaWYgKGRlYWQgPT0gZmktPmZpYl9uaHMpIHsKKwkJCQlmaS0+ZmliX2ZsYWdzIHw9IFJUTkhfRl9ERUFEOworCQkJCXJldCsrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEgKKworLyoKKyAgIERlYWQgZGV2aWNlIGdvZXMgdXAuIFdlIHdha2UgdXAgZGVhZCBuZXh0aG9wcy4KKyAgIEl0IHRha2VzIHNlbnNlIG9ubHkgb24gbXVsdGlwYXRoIHJvdXRlcy4KKyAqLworCitpbnQgZmliX3N5bmNfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmliX2luZm8gKnByZXZfZmk7CisJdW5zaWduZWQgaW50IGhhc2g7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJc3RydWN0IGZpYl9uaCAqbmg7CisJaW50IHJldDsKKworCWlmICghKGRldi0+ZmxhZ3MmSUZGX1VQKSkKKwkJcmV0dXJuIDA7CisKKwlwcmV2X2ZpID0gTlVMTDsKKwloYXNoID0gZmliX2RldmluZGV4X2hhc2hmbihkZXYtPmlmaW5kZXgpOworCWhlYWQgPSAmZmliX2luZm9fZGV2aGFzaFtoYXNoXTsKKwlyZXQgPSAwOworCisJaGxpc3RfZm9yX2VhY2hfZW50cnkobmgsIG5vZGUsIGhlYWQsIG5oX2hhc2gpIHsKKwkJc3RydWN0IGZpYl9pbmZvICpmaSA9IG5oLT5uaF9wYXJlbnQ7CisJCWludCBhbGl2ZTsKKworCQlCVUdfT04oIWZpLT5maWJfbmhzKTsKKwkJaWYgKG5oLT5uaF9kZXYgIT0gZGV2IHx8IGZpID09IHByZXZfZmkpCisJCQljb250aW51ZTsKKworCQlwcmV2X2ZpID0gZmk7CisJCWFsaXZlID0gMDsKKwkJY2hhbmdlX25leHRob3BzKGZpKSB7CisJCQlpZiAoIShuaC0+bmhfZmxhZ3MmUlROSF9GX0RFQUQpKSB7CisJCQkJYWxpdmUrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChuaC0+bmhfZGV2ID09IE5VTEwgfHwgIShuaC0+bmhfZGV2LT5mbGFncyZJRkZfVVApKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKG5oLT5uaF9kZXYgIT0gZGV2IHx8IF9faW5fZGV2X2dldChkZXYpID09IE5VTEwpCisJCQkJY29udGludWU7CisJCQlhbGl2ZSsrOworCQkJc3Bpbl9sb2NrX2JoKCZmaWJfbXVsdGlwYXRoX2xvY2spOworCQkJbmgtPm5oX3Bvd2VyID0gMDsKKwkJCW5oLT5uaF9mbGFncyAmPSB+UlROSF9GX0RFQUQ7CisJCQlzcGluX3VubG9ja19iaCgmZmliX211bHRpcGF0aF9sb2NrKTsKKwkJfSBlbmRmb3JfbmV4dGhvcHMoZmkpCisKKwkJaWYgKGFsaXZlID4gMCkgeworCQkJZmktPmZpYl9mbGFncyAmPSB+UlROSF9GX0RFQUQ7CisJCQlyZXQrKzsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgICBUaGUgYWxnb3JpdGhtIGlzIHN1Ym9wdGltYWwsIGJ1dCBpdCBwcm92aWRlcyByZWFsbHkKKyAgIGZhaXIgd2VpZ2h0ZWQgcm91dGUgZGlzdHJpYnV0aW9uLgorICovCisKK3ZvaWQgZmliX3NlbGVjdF9tdWx0aXBhdGgoY29uc3Qgc3RydWN0IGZsb3dpICpmbHAsIHN0cnVjdCBmaWJfcmVzdWx0ICpyZXMpCit7CisJc3RydWN0IGZpYl9pbmZvICpmaSA9IHJlcy0+Zmk7CisJaW50IHc7CisKKwlzcGluX2xvY2tfYmgoJmZpYl9tdWx0aXBhdGhfbG9jayk7CisJaWYgKGZpLT5maWJfcG93ZXIgPD0gMCkgeworCQlpbnQgcG93ZXIgPSAwOworCQljaGFuZ2VfbmV4dGhvcHMoZmkpIHsKKwkJCWlmICghKG5oLT5uaF9mbGFncyZSVE5IX0ZfREVBRCkpIHsKKwkJCQlwb3dlciArPSBuaC0+bmhfd2VpZ2h0OworCQkJCW5oLT5uaF9wb3dlciA9IG5oLT5uaF93ZWlnaHQ7CisJCQl9CisJCX0gZW5kZm9yX25leHRob3BzKGZpKTsKKwkJZmktPmZpYl9wb3dlciA9IHBvd2VyOworCQlpZiAocG93ZXIgPD0gMCkgeworCQkJc3Bpbl91bmxvY2tfYmgoJmZpYl9tdWx0aXBhdGhfbG9jayk7CisJCQkvKiBSYWNlIGNvbmRpdGlvbjogcm91dGUgaGFzIGp1c3QgYmVjb21lIGRlYWQuICovCisJCQlyZXMtPm5oX3NlbCA9IDA7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKworCS8qIHcgc2hvdWxkIGJlIHJhbmRvbSBudW1iZXIgWzAuLmZpLT5maWJfcG93ZXItMV0sCisJICAgaXQgaXMgcHJldHR5IGJhZCBhcHByb3hpbWF0aW9uLgorCSAqLworCisJdyA9IGppZmZpZXMgJSBmaS0+ZmliX3Bvd2VyOworCisJY2hhbmdlX25leHRob3BzKGZpKSB7CisJCWlmICghKG5oLT5uaF9mbGFncyZSVE5IX0ZfREVBRCkgJiYgbmgtPm5oX3Bvd2VyKSB7CisJCQlpZiAoKHcgLT0gbmgtPm5oX3Bvd2VyKSA8PSAwKSB7CisJCQkJbmgtPm5oX3Bvd2VyLS07CisJCQkJZmktPmZpYl9wb3dlci0tOworCQkJCXJlcy0+bmhfc2VsID0gbmhzZWw7CisJCQkJc3Bpbl91bmxvY2tfYmgoJmZpYl9tdWx0aXBhdGhfbG9jayk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfSBlbmRmb3JfbmV4dGhvcHMoZmkpOworCisJLyogUmFjZSBjb25kaXRpb246IHJvdXRlIGhhcyBqdXN0IGJlY29tZSBkZWFkLiAqLworCXJlcy0+bmhfc2VsID0gMDsKKwlzcGluX3VubG9ja19iaCgmZmliX211bHRpcGF0aF9sb2NrKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaWNtcC5jIGIvbmV0L2lwdjQvaWNtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YmYwZDMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9pY21wLmMKQEAgLTAsMCArMSwxMTQzIEBACisvKgorICoJTkVUMzoJSW1wbGVtZW50YXRpb24gb2YgdGhlIElDTVAgcHJvdG9jb2wgbGF5ZXIuCisgKgorICoJCUFsYW4gQ294LCA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqCVZlcnNpb246ICRJZDogaWNtcC5jLHYgMS44NSAyMDAyLzAyLzAxIDIyOjAxOjAzIGRhdmVtIEV4cCAkCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglTb21lIG9mIHRoZSBmdW5jdGlvbiBuYW1lcyBhbmQgdGhlIGljbXAgdW5yZWFjaCB0YWJsZSBmb3IgdGhpcworICoJbW9kdWxlIHdlcmUgZGVyaXZlZCBmcm9tIFtpY21wLmMgMS4wLjExIDA2LzAyLzkzXSBieQorICoJUm9zcyBCaXJvLCBGcmVkIE4uIHZhbiBLZW1wZW4sIE1hcmsgRXZhbnMsIEFsYW4gQ294LCBHZXJoYXJkIEtvZXJ0aW5nLgorICoJT3RoZXIgdGhhbiB0aGF0IHRoaXMgbW9kdWxlIGlzIGEgY29tcGxldGUgcmV3cml0ZS4KKyAqCisgKglGaXhlczoKKyAqCUNsZW1lbnMgRnJ1aHdpcnRoCToJaW50cm9kdWNlIGdsb2JhbCBpY21wIHJhdGUgbGltaXRpbmcKKyAqCQkJCQl3aXRoIGljbXAgdHlwZSBtYXNraW5nIGFiaWxpdHkgaW5zdGVhZAorICoJCQkJCW9mIGJyb2tlbiBwZXIgdHlwZSBpY21wIHRpbWVvdXRzLgorICoJCU1pa2UgU2hhdmVyCToJUkZDMTEyMiBjaGVja3MuCisgKgkJQWxhbiBDb3gJOglNdWx0aWNhc3QgcGluZyByZXBseSBhcyBzZWxmLgorICoJCUFsYW4gQ294CToJRml4IGF0b21pY2l0eSBsb2NrdXAgaW4gaXBfYnVpbGRfeG1pdAorICoJCQkJCWNhbGwuCisgKgkJQWxhbiBDb3gJOglBZGRlZCAyMTYsMTI4IGJ5dGUgcGF0aHMgdG8gdGhlIE1UVQorICoJCQkJCWNvZGUuCisgKgkJTWFydGluIE1hcmVzCToJUkZDMTgxMiBjaGVja3MuCisgKgkJTWFydGluIE1hcmVzCToJQ2FuIGJlIGNvbmZpZ3VyZWQgdG8gZm9sbG93IHJlZGlyZWN0cworICoJCQkJCWlmIGFjdGluZyBhcyBhIHJvdXRlciBfd2l0aG91dF8gYQorICoJCQkJCXJvdXRpbmcgcHJvdG9jb2wgKFJGQyAxODEyKS4KKyAqCQlNYXJ0aW4gTWFyZXMJOglFY2hvIHJlcXVlc3RzIG1heSBiZSBjb25maWd1cmVkIHRvCisgKgkJCQkJYmUgaWdub3JlZCAoUkZDIDE4MTIpLgorICoJCU1hcnRpbiBNYXJlcwk6CUxpbWl0YXRpb24gb2YgSUNNUCBlcnJvciBtZXNzYWdlCisgKgkJCQkJdHJhbnNtaXQgcmF0ZSAoUkZDIDE4MTIpLgorICoJCU1hcnRpbiBNYXJlcwk6CVRPUyBhbmQgUHJlY2VkZW5jZSBzZXQgY29ycmVjdGx5CisgKgkJCQkJKFJGQyAxODEyKS4KKyAqCQlNYXJ0aW4gTWFyZXMJOglOb3cgY29weWluZyBhcyBtdWNoIGRhdGEgZnJvbSB0aGUKKyAqCQkJCQlvcmlnaW5hbCBwYWNrZXQgYXMgd2UgY2FuIHdpdGhvdXQKKyAqCQkJCQlleGNlZWRpbmcgNTc2IGJ5dGVzIChSRkMgMTgxMikuCisgKglXaWxseSBLb255bmVuYmVyZwk6CVRyYW5zcGFyZW50IHByb3h5aW5nIHN1cHBvcnQuCisgKgkJS2VpdGggT3dlbnMJOglSRkMxMTkxIGNvcnJlY3Rpb24gZm9yIDQuMkJTRCBiYXNlZAorICoJCQkJCXBhdGggTVRVIGJ1Zy4KKyAqCQlUaG9tYXMgUXVpbm90CToJSUNNUCBEZXN0IFVucmVhY2ggY29kZXMgdXAgdG8gMTUgYXJlCisgKgkJCQkJdmFsaWQgKFJGQyAxODEyKS4KKyAqCQlBbmRpIEtsZWVuCToJQ2hlY2sgYWxsIHBhY2tldCBsZW5ndGhzIHByb3Blcmx5CisgKgkJCQkJYW5kIG1vdmVkIGFsbCBrZnJlZV9za2IoKSB1cCB0bworICoJCQkJCWljbXBfcmN2LgorICoJCUFuZGkgS2xlZW4JOglNb3ZlIHRoZSByYXRlIGxpbWl0IGJvb2trZWVwaW5nCisgKgkJCQkJaW50byB0aGUgZGVzdCBlbnRyeSBhbmQgdXNlIGEgdG9rZW4KKyAqCQkJCQlidWNrZXQgZmlsdGVyICh0aGFua3MgdG8gQU5LKS4gTWFrZQorICoJCQkJCXRoZSByYXRlcyBzeXNjdGwgY29uZmlndXJhYmxlLgorICoJCVl1IFRpYW5saQk6CUZpeGVkIHR3byB1Z2x5IGJ1Z3MgaW4gaWNtcF9zZW5kCisgKgkJCQkJLSBJUCBvcHRpb24gbGVuZ3RoIHdhcyBhY2NvdW50ZWQgd3JvbmdseQorICoJCQkJCS0gSUNNUCBoZWFkZXIgbGVuZ3RoIHdhcyBub3QgYWNjb3VudGVkCisgKgkJCQkJICBhdCBhbGwuCisgKiAgICAgICAgICAgICAgVHJpc3RhbiBHcmVhdmVzIDogICAgICAgQWRkZWQgc3lzY3RsIG9wdGlvbiB0byBpZ25vcmUgYm9ndXMKKyAqICAgICAgICAgICAgICAJCQlicm9hZGNhc3QgcmVzcG9uc2VzIGZyb20gYnJva2VuIHJvdXRlcnMuCisgKgorICogVG8gRml4OgorICoKKyAqCS0gU2hvdWxkIHVzZSBza2JfcHVsbCgpIGluc3RlYWQgb2YgYWxsIHRoZSBtYW51YWwgY2hlY2tpbmcuCisgKgkgIFRoaXMgd291bGQgYWxzbyBncmVhdGx5IHNpbXBseSBzb21lIHVwcGVyIGxheWVyIGVycm9yIGhhbmRsZXJzLiAtLUFLCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bmV0L3NubXAuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvcm91dGUuaD4KKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvaWNtcC5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvdWRwLmg+CisjaW5jbHVkZSA8bmV0L3Jhdy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKworLyoKKyAqCUJ1aWxkIHhtaXQgYXNzZW1ibHkgYmxvY2tzCisgKi8KKworc3RydWN0IGljbXBfYnhtIHsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBvZmZzZXQ7CisJaW50IGRhdGFfbGVuOworCisJc3RydWN0IHsKKwkJc3RydWN0IGljbXBoZHIgaWNtcGg7CisJCV9fdTMyCSAgICAgICB0aW1lc1szXTsKKwl9IGRhdGE7CisJaW50IGhlYWRfbGVuOworCXN0cnVjdCBpcF9vcHRpb25zIHJlcGx5b3B0czsKKwl1bnNpZ25lZCBjaGFyICBvcHRidWZbNDBdOworfTsKKworLyoKKyAqCVN0YXRpc3RpY3MKKyAqLworREVGSU5FX1NOTVBfU1RBVChzdHJ1Y3QgaWNtcF9taWIsIGljbXBfc3RhdGlzdGljcyk7CisKKy8qIEFuIGFycmF5IG9mIGVycm5vIGZvciBlcnJvciBtZXNzYWdlcyBmcm9tIGRlc3QgdW5yZWFjaC4gKi8KKy8qIFJGQyAxMTIyOiAzLjIuMi4xIFN0YXRlcyB0aGF0IE5FVF9VTlJFQUNILCBIT1NUX1VOUkVBQ0ggYW5kIFNSX0ZBSUxFRCBNVVNUIGJlIGNvbnNpZGVyZWQgJ3RyYW5zaWVudCBlcnJzJy4gKi8KKworc3RydWN0IGljbXBfZXJyIGljbXBfZXJyX2NvbnZlcnRbXSA9IHsKKwl7CisJCS5lcnJubyA9IEVORVRVTlJFQUNILAkvKiBJQ01QX05FVF9VTlJFQUNIICovCisJCS5mYXRhbCA9IDAsCisJfSwKKwl7CisJCS5lcnJubyA9IEVIT1NUVU5SRUFDSCwJLyogSUNNUF9IT1NUX1VOUkVBQ0ggKi8KKwkJLmZhdGFsID0gMCwKKwl9LAorCXsKKwkJLmVycm5vID0gRU5PUFJPVE9PUFQJLyogSUNNUF9QUk9UX1VOUkVBQ0ggKi8sCisJCS5mYXRhbCA9IDEsCisJfSwKKwl7CisJCS5lcnJubyA9IEVDT05OUkVGVVNFRCwJLyogSUNNUF9QT1JUX1VOUkVBQ0ggKi8KKwkJLmZhdGFsID0gMSwKKwl9LAorCXsKKwkJLmVycm5vID0gRU1TR1NJWkUsCS8qIElDTVBfRlJBR19ORUVERUQgKi8KKwkJLmZhdGFsID0gMCwKKwl9LAorCXsKKwkJLmVycm5vID0gRU9QTk9UU1VQUCwJLyogSUNNUF9TUl9GQUlMRUQgKi8KKwkJLmZhdGFsID0gMCwKKwl9LAorCXsKKwkJLmVycm5vID0gRU5FVFVOUkVBQ0gsCS8qIElDTVBfTkVUX1VOS05PV04gKi8KKwkJLmZhdGFsID0gMSwKKwl9LAorCXsKKwkJLmVycm5vID0gRUhPU1RET1dOLAkvKiBJQ01QX0hPU1RfVU5LTk9XTiAqLworCQkuZmF0YWwgPSAxLAorCX0sCisJeworCQkuZXJybm8gPSBFTk9ORVQsCS8qIElDTVBfSE9TVF9JU09MQVRFRCAqLworCQkuZmF0YWwgPSAxLAorCX0sCisJeworCQkuZXJybm8gPSBFTkVUVU5SRUFDSCwJLyogSUNNUF9ORVRfQU5PCSovCisJCS5mYXRhbCA9IDEsCisJfSwKKwl7CisJCS5lcnJubyA9IEVIT1NUVU5SRUFDSCwJLyogSUNNUF9IT1NUX0FOTyAqLworCQkuZmF0YWwgPSAxLAorCX0sCisJeworCQkuZXJybm8gPSBFTkVUVU5SRUFDSCwJLyogSUNNUF9ORVRfVU5SX1RPUyAqLworCQkuZmF0YWwgPSAwLAorCX0sCisJeworCQkuZXJybm8gPSBFSE9TVFVOUkVBQ0gsCS8qIElDTVBfSE9TVF9VTlJfVE9TICovCisJCS5mYXRhbCA9IDAsCisJfSwKKwl7CisJCS5lcnJubyA9IEVIT1NUVU5SRUFDSCwJLyogSUNNUF9QS1RfRklMVEVSRUQgKi8KKwkJLmZhdGFsID0gMSwKKwl9LAorCXsKKwkJLmVycm5vID0gRUhPU1RVTlJFQUNILAkvKiBJQ01QX1BSRUNfVklPTEFUSU9OICovCisJCS5mYXRhbCA9IDEsCisJfSwKKwl7CisJCS5lcnJubyA9IEVIT1NUVU5SRUFDSCwJLyogSUNNUF9QUkVDX0NVVE9GRiAqLworCQkuZmF0YWwgPSAxLAorCX0sCit9OworCisvKiBDb250cm9sIHBhcmFtZXRlcnMgZm9yIEVDSE8gcmVwbGllcy4gKi8KK2ludCBzeXNjdGxfaWNtcF9lY2hvX2lnbm9yZV9hbGw7CitpbnQgc3lzY3RsX2ljbXBfZWNob19pZ25vcmVfYnJvYWRjYXN0czsKKworLyogQ29udHJvbCBwYXJhbWV0ZXIgLSBpZ25vcmUgYm9ndXMgYnJvYWRjYXN0IHJlc3BvbnNlcz8gKi8KK2ludCBzeXNjdGxfaWNtcF9pZ25vcmVfYm9ndXNfZXJyb3JfcmVzcG9uc2VzOworCisvKgorICogCUNvbmZpZ3VyYWJsZSBnbG9iYWwgcmF0ZSBsaW1pdC4KKyAqCisgKglyYXRlbGltaXQgZGVmaW5lcyB0b2tlbnMvcGFja2V0IGNvbnN1bWVkIGZvciBkc3QtPnJhdGVfdG9rZW4gYnVja2V0CisgKglyYXRlbWFzayBkZWZpbmVzIHdoaWNoIGljbXAgdHlwZXMgYXJlIHJhdGVsaW1pdGVkIGJ5IHNldHRpbmcKKyAqIAlpdCdzIGJpdCBwb3NpdGlvbi4KKyAqCisgKglkZWZhdWx0OgorICoJZGVzdCB1bnJlYWNoYWJsZSAoMyksIHNvdXJjZSBxdWVuY2ggKDQpLAorICoJdGltZSBleGNlZWRlZCAoMTEpLCBwYXJhbWV0ZXIgcHJvYmxlbSAoMTIpCisgKi8KKworaW50IHN5c2N0bF9pY21wX3JhdGVsaW1pdCA9IDEgKiBIWjsKK2ludCBzeXNjdGxfaWNtcF9yYXRlbWFzayA9IDB4MTgxODsKKworLyoKKyAqCUlDTVAgY29udHJvbCBhcnJheS4gVGhpcyBzcGVjaWZpZXMgd2hhdCB0byBkbyB3aXRoIGVhY2ggSUNNUC4KKyAqLworCitzdHJ1Y3QgaWNtcF9jb250cm9sIHsKKwlpbnQgb3V0cHV0X2VudHJ5OwkvKiBGaWVsZCBmb3IgaW5jcmVtZW50IG9uIG91dHB1dCAqLworCWludCBpbnB1dF9lbnRyeTsJLyogRmllbGQgZm9yIGluY3JlbWVudCBvbiBpbnB1dCAqLworCXZvaWQgKCpoYW5kbGVyKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKwlzaG9ydCAgIGVycm9yOwkJLyogVGhpcyBJQ01QIGlzIGNsYXNzZWQgYXMgYW4gZXJyb3IgbWVzc2FnZSAqLworfTsKKworc3RhdGljIHN0cnVjdCBpY21wX2NvbnRyb2wgaWNtcF9wb2ludGVyc1tOUl9JQ01QX1RZUEVTKzFdOworCisvKgorICoJVGhlIElDTVAgc29ja2V0KHMpLiBUaGlzIGlzIHRoZSBtb3N0IGNvbnZlbmllbnQgd2F5IHRvIGZsb3cgY29udHJvbAorICoJb3VyIElDTVAgb3V0cHV0IGFzIHdlbGwgYXMgbWFpbnRhaW4gYSBjbGVhbiBpbnRlcmZhY2UgdGhyb3VnaG91dAorICoJYWxsIGxheWVycy4gQWxsIFNvY2tldGxlc3MgSVAgc2VuZHMgd2lsbCBzb29uIGJlIGdvbmUuCisgKgorICoJT24gU01QIHdlIGhhdmUgb25lIElDTVAgc29ja2V0IHBlci1jcHUuCisgKi8KK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc29ja2V0ICosIF9faWNtcF9zb2NrZXQpID0gTlVMTDsKKyNkZWZpbmUgaWNtcF9zb2NrZXQJX19nZXRfY3B1X3ZhcihfX2ljbXBfc29ja2V0KQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgaWNtcF94bWl0X2xvY2sodm9pZCkKK3sKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisKKwlpZiAodW5saWtlbHkoIXNwaW5fdHJ5bG9jaygmaWNtcF9zb2NrZXQtPnNrLT5za19sb2NrLnNsb2NrKSkpIHsKKwkJLyogVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBvdXRwdXQgcGF0aCBzaWduYWxzIGEKKwkJICogZHN0X2xpbmtfZmFpbHVyZSgpIGZvciBhbiBvdXRnb2luZyBJQ01QIHBhY2tldC4KKwkJICovCisJCWxvY2FsX2JoX2VuYWJsZSgpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGljbXBfeG1pdF91bmxvY2sodm9pZCkKK3sKKwlzcGluX3VubG9ja19iaCgmaWNtcF9zb2NrZXQtPnNrLT5za19sb2NrLnNsb2NrKTsKK30KKworLyoKKyAqCVNlbmQgYW4gSUNNUCBmcmFtZS4KKyAqLworCisvKgorICoJQ2hlY2sgdHJhbnNtaXQgcmF0ZSBsaW1pdGF0aW9uIGZvciBnaXZlbiBtZXNzYWdlLgorICoJVGhlIHJhdGUgaW5mb3JtYXRpb24gaXMgaGVsZCBpbiB0aGUgZGVzdGluYXRpb24gY2FjaGUgbm93LgorICoJVGhpcyBmdW5jdGlvbiBpcyBnZW5lcmljIGFuZCBjb3VsZCBiZSB1c2VkIGZvciBvdGhlciBwdXJwb3NlcworICoJdG9vLiBJdCB1c2VzIGEgVG9rZW4gYnVja2V0IGZpbHRlciBhcyBzdWdnZXN0ZWQgYnkgQWxleGV5IEt1em5ldHNvdi4KKyAqCisgKglOb3RlIHRoYXQgdGhlIHNhbWUgZHN0X2VudHJ5IGZpZWxkcyBhcmUgbW9kaWZpZWQgYnkgZnVuY3Rpb25zIGluCisgKglyb3V0ZS5jIHRvbywgYnV0IHRoZXNlIHdvcmsgZm9yIHBhY2tldCBkZXN0aW5hdGlvbnMgd2hpbGUgeHJsaW1fYWxsb3cKKyAqCXdvcmtzIGZvciBpY21wIGRlc3RpbmF0aW9ucy4gVGhpcyBtZWFucyB0aGUgcmF0ZSBsaW1pdGluZyBpbmZvcm1hdGlvbgorICoJZm9yIG9uZSAiaXAgb2JqZWN0IiBpcyBzaGFyZWQgLSBhbmQgdGhlc2UgSUNNUHMgYXJlIHR3aWNlIGxpbWl0ZWQ6CisgKglieSBzb3VyY2UgYW5kIGJ5IGRlc3RpbmF0aW9uLgorICoKKyAqCVJGQyAxODEyOiA0LjMuMi44IFNIT1VMRCBiZSBhYmxlIHRvIGxpbWl0IGVycm9yIG1lc3NhZ2UgcmF0ZQorICoJCQkgIFNIT1VMRCBhbGxvdyBzZXR0aW5nIG9mIHJhdGUgbGltaXRzCisgKgorICogCVNoYXJlZCBiZXR3ZWVuIElDTVB2NCBhbmQgSUNNUHY2LgorICovCisjZGVmaW5lIFhSTElNX0JVUlNUX0ZBQ1RPUiA2CitpbnQgeHJsaW1fYWxsb3coc3RydWN0IGRzdF9lbnRyeSAqZHN0LCBpbnQgdGltZW91dCkKK3sKKwl1bnNpZ25lZCBsb25nIG5vdzsKKwlpbnQgcmMgPSAwOworCisJbm93ID0gamlmZmllczsKKwlkc3QtPnJhdGVfdG9rZW5zICs9IG5vdyAtIGRzdC0+cmF0ZV9sYXN0OworCWRzdC0+cmF0ZV9sYXN0ID0gbm93OworCWlmIChkc3QtPnJhdGVfdG9rZW5zID4gWFJMSU1fQlVSU1RfRkFDVE9SICogdGltZW91dCkKKwkJZHN0LT5yYXRlX3Rva2VucyA9IFhSTElNX0JVUlNUX0ZBQ1RPUiAqIHRpbWVvdXQ7CisJaWYgKGRzdC0+cmF0ZV90b2tlbnMgPj0gdGltZW91dCkgeworCQlkc3QtPnJhdGVfdG9rZW5zIC09IHRpbWVvdXQ7CisJCXJjID0gMTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW5saW5lIGludCBpY21wdjRfeHJsaW1fYWxsb3coc3RydWN0IHJ0YWJsZSAqcnQsIGludCB0eXBlLCBpbnQgY29kZSkKK3sKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSAmcnQtPnUuZHN0OworCWludCByYyA9IDE7CisKKwlpZiAodHlwZSA+IE5SX0lDTVBfVFlQRVMpCisJCWdvdG8gb3V0OworCisJLyogRG9uJ3QgbGltaXQgUE1UVSBkaXNjb3ZlcnkuICovCisJaWYgKHR5cGUgPT0gSUNNUF9ERVNUX1VOUkVBQ0ggJiYgY29kZSA9PSBJQ01QX0ZSQUdfTkVFREVEKQorCQlnb3RvIG91dDsKKworCS8qIE5vIHJhdGUgbGltaXQgb24gbG9vcGJhY2sgKi8KKwlpZiAoZHN0LT5kZXYgJiYgKGRzdC0+ZGV2LT5mbGFncyZJRkZfTE9PUEJBQ0spKQorIAkJZ290byBvdXQ7CisKKwkvKiBMaW1pdCBpZiBpY21wIHR5cGUgaXMgZW5hYmxlZCBpbiByYXRlbWFzay4gKi8KKwlpZiAoKDEgPDwgdHlwZSkgJiBzeXNjdGxfaWNtcF9yYXRlbWFzaykKKwkJcmMgPSB4cmxpbV9hbGxvdyhkc3QsIHN5c2N0bF9pY21wX3JhdGVsaW1pdCk7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCisvKgorICoJTWFpbnRhaW4gdGhlIGNvdW50ZXJzIHVzZWQgaW4gdGhlIFNOTVAgc3RhdGlzdGljcyBmb3Igb3V0Z29pbmcgSUNNUAorICovCitzdGF0aWMgdm9pZCBpY21wX291dF9jb3VudChpbnQgdHlwZSkKK3sKKwlpZiAodHlwZSA8PSBOUl9JQ01QX1RZUEVTKSB7CisJCUlDTVBfSU5DX1NUQVRTKGljbXBfcG9pbnRlcnNbdHlwZV0ub3V0cHV0X2VudHJ5KTsKKwkJSUNNUF9JTkNfU1RBVFMoSUNNUF9NSUJfT1VUTVNHUyk7CisJfQorfQorCisvKgorICoJQ2hlY2tzdW0gZWFjaCBmcmFnbWVudCwgYW5kIG9uIHRoZSBmaXJzdCBpbmNsdWRlIHRoZSBoZWFkZXJzIGFuZCBmaW5hbAorICoJY2hlY2tzdW0uCisgKi8KK3N0YXRpYyBpbnQgaWNtcF9nbHVlX2JpdHModm9pZCAqZnJvbSwgY2hhciAqdG8sIGludCBvZmZzZXQsIGludCBsZW4sIGludCBvZGQsCisJCQkgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGljbXBfYnhtICppY21wX3BhcmFtID0gKHN0cnVjdCBpY21wX2J4bSAqKWZyb207CisJdW5zaWduZWQgaW50IGNzdW07CisKKwljc3VtID0gc2tiX2NvcHlfYW5kX2NzdW1fYml0cyhpY21wX3BhcmFtLT5za2IsCisJCQkJICAgICAgaWNtcF9wYXJhbS0+b2Zmc2V0ICsgb2Zmc2V0LAorCQkJCSAgICAgIHRvLCBsZW4sIDApOworCisJc2tiLT5jc3VtID0gY3N1bV9ibG9ja19hZGQoc2tiLT5jc3VtLCBjc3VtLCBvZGQpOworCWlmIChpY21wX3BvaW50ZXJzW2ljbXBfcGFyYW0tPmRhdGEuaWNtcGgudHlwZV0uZXJyb3IpCisJCW5mX2N0X2F0dGFjaChza2IsIGljbXBfcGFyYW0tPnNrYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGljbXBfcHVzaF9yZXBseShzdHJ1Y3QgaWNtcF9ieG0gKmljbXBfcGFyYW0sCisJCQkgICAgc3RydWN0IGlwY21fY29va2llICppcGMsIHN0cnVjdCBydGFibGUgKnJ0KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlpcF9hcHBlbmRfZGF0YShpY21wX3NvY2tldC0+c2ssIGljbXBfZ2x1ZV9iaXRzLCBpY21wX3BhcmFtLAorCQkgICAgICAgaWNtcF9wYXJhbS0+ZGF0YV9sZW4raWNtcF9wYXJhbS0+aGVhZF9sZW4sCisJCSAgICAgICBpY21wX3BhcmFtLT5oZWFkX2xlbiwKKwkJICAgICAgIGlwYywgcnQsIE1TR19ET05UV0FJVCk7CisKKwlpZiAoKHNrYiA9IHNrYl9wZWVrKCZpY21wX3NvY2tldC0+c2stPnNrX3dyaXRlX3F1ZXVlKSkgIT0gTlVMTCkgeworCQlzdHJ1Y3QgaWNtcGhkciAqaWNtcGggPSBza2ItPmguaWNtcGg7CisJCXVuc2lnbmVkIGludCBjc3VtID0gMDsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjE7CisKKwkJc2tiX3F1ZXVlX3dhbGsoJmljbXBfc29ja2V0LT5zay0+c2tfd3JpdGVfcXVldWUsIHNrYjEpIHsKKwkJCWNzdW0gPSBjc3VtX2FkZChjc3VtLCBza2IxLT5jc3VtKTsKKwkJfQorCQljc3VtID0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjaygodm9pZCAqKSZpY21wX3BhcmFtLT5kYXRhLAorCQkJCQkJIChjaGFyICopaWNtcGgsCisJCQkJCQkgaWNtcF9wYXJhbS0+aGVhZF9sZW4sIGNzdW0pOworCQlpY21waC0+Y2hlY2tzdW0gPSBjc3VtX2ZvbGQoY3N1bSk7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJaXBfcHVzaF9wZW5kaW5nX2ZyYW1lcyhpY21wX3NvY2tldC0+c2spOworCX0KK30KKworLyoKKyAqCURyaXZpbmcgbG9naWMgZm9yIGJ1aWxkaW5nIGFuZCBzZW5kaW5nIElDTVAgbWVzc2FnZXMuCisgKi8KKworc3RhdGljIHZvaWQgaWNtcF9yZXBseShzdHJ1Y3QgaWNtcF9ieG0gKmljbXBfcGFyYW0sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNvY2sgKnNrID0gaWNtcF9zb2NrZXQtPnNrOworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlzdHJ1Y3QgaXBjbV9jb29raWUgaXBjOworCXN0cnVjdCBydGFibGUgKnJ0ID0gKHN0cnVjdCBydGFibGUgKilza2ItPmRzdDsKKwl1MzIgZGFkZHI7CisKKwlpZiAoaXBfb3B0aW9uc19lY2hvKCZpY21wX3BhcmFtLT5yZXBseW9wdHMsIHNrYikpCisJCWdvdG8gb3V0OworCisJaWYgKGljbXBfeG1pdF9sb2NrKCkpCisJCXJldHVybjsKKworCWljbXBfcGFyYW0tPmRhdGEuaWNtcGguY2hlY2tzdW0gPSAwOworCWljbXBfb3V0X2NvdW50KGljbXBfcGFyYW0tPmRhdGEuaWNtcGgudHlwZSk7CisKKwlpbmV0LT50b3MgPSBza2ItPm5oLmlwaC0+dG9zOworCWRhZGRyID0gaXBjLmFkZHIgPSBydC0+cnRfc3JjOworCWlwYy5vcHQgPSBOVUxMOworCWlmIChpY21wX3BhcmFtLT5yZXBseW9wdHMub3B0bGVuKSB7CisJCWlwYy5vcHQgPSAmaWNtcF9wYXJhbS0+cmVwbHlvcHRzOworCQlpZiAoaXBjLm9wdC0+c3JyKQorCQkJZGFkZHIgPSBpY21wX3BhcmFtLT5yZXBseW9wdHMuZmFkZHI7CisJfQorCXsKKwkJc3RydWN0IGZsb3dpIGZsID0geyAubmxfdSA9IHsgLmlwNF91ID0KKwkJCQkJICAgICAgeyAuZGFkZHIgPSBkYWRkciwKKwkJCQkJCS5zYWRkciA9IHJ0LT5ydF9zcGVjX2RzdCwKKwkJCQkJCS50b3MgPSBSVF9UT1Moc2tiLT5uaC5pcGgtPnRvcykgfSB9LAorCQkJCSAgICAucHJvdG8gPSBJUFBST1RPX0lDTVAgfTsKKwkJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpKQorCQkJZ290byBvdXRfdW5sb2NrOworCX0KKwlpZiAoaWNtcHY0X3hybGltX2FsbG93KHJ0LCBpY21wX3BhcmFtLT5kYXRhLmljbXBoLnR5cGUsCisJCQkgICAgICAgaWNtcF9wYXJhbS0+ZGF0YS5pY21waC5jb2RlKSkKKwkJaWNtcF9wdXNoX3JlcGx5KGljbXBfcGFyYW0sICZpcGMsIHJ0KTsKKwlpcF9ydF9wdXQocnQpOworb3V0X3VubG9jazoKKwlpY21wX3htaXRfdW5sb2NrKCk7CitvdXQ6OworfQorCisKKy8qCisgKglTZW5kIGFuIElDTVAgbWVzc2FnZSBpbiByZXNwb25zZSB0byBhIHNpdHVhdGlvbgorICoKKyAqCVJGQyAxMTIyOiAzLjIuMglNVVNUIHNlbmQgYXQgbGVhc3QgdGhlIElQIGhlYWRlciBhbmQgOCBieXRlcyBvZiBoZWFkZXIuCisgKgkJICBNQVkgc2VuZCBtb3JlICh3ZSBkbykuCisgKgkJCU1VU1QgTk9UIGNoYW5nZSB0aGlzIGhlYWRlciBpbmZvcm1hdGlvbi4KKyAqCQkJTVVTVCBOT1QgcmVwbHkgdG8gYSBtdWx0aWNhc3QvYnJvYWRjYXN0IElQIGFkZHJlc3MuCisgKgkJCU1VU1QgTk9UIHJlcGx5IHRvIGEgbXVsdGljYXN0L2Jyb2FkY2FzdCBNQUMgYWRkcmVzcy4KKyAqCQkJTVVTVCByZXBseSB0byBvbmx5IHRoZSBmaXJzdCBmcmFnbWVudC4KKyAqLworCit2b2lkIGljbXBfc2VuZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2luLCBpbnQgdHlwZSwgaW50IGNvZGUsIHUzMiBpbmZvKQoreworCXN0cnVjdCBpcGhkciAqaXBoOworCWludCByb29tOworCXN0cnVjdCBpY21wX2J4bSBpY21wX3BhcmFtOworCXN0cnVjdCBydGFibGUgKnJ0ID0gKHN0cnVjdCBydGFibGUgKilza2JfaW4tPmRzdDsKKwlzdHJ1Y3QgaXBjbV9jb29raWUgaXBjOworCXUzMiBzYWRkcjsKKwl1OCAgdG9zOworCisJaWYgKCFydCkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqCUZpbmQgdGhlIG9yaWdpbmFsIGhlYWRlci4gSXQgaXMgZXhwZWN0ZWQgdG8gYmUgdmFsaWQsIG9mIGNvdXJzZS4KKwkgKglDaGVjayB0aGlzLCBpY21wX3NlbmQgaXMgY2FsbGVkIGZyb20gdGhlIG1vc3Qgb2JzY3VyZSBkZXZpY2VzCisJICoJc29tZXRpbWVzLgorCSAqLworCWlwaCA9IHNrYl9pbi0+bmguaXBoOworCisJaWYgKCh1OCAqKWlwaCA8IHNrYl9pbi0+aGVhZCB8fCAodTggKikoaXBoICsgMSkgPiBza2JfaW4tPnRhaWwpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKglObyByZXBsaWVzIHRvIHBoeXNpY2FsIG11bHRpY2FzdC9icm9hZGNhc3QKKwkgKi8KKwlpZiAoc2tiX2luLT5wa3RfdHlwZSAhPSBQQUNLRVRfSE9TVCkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqCU5vdyBjaGVjayBhdCB0aGUgcHJvdG9jb2wgbGV2ZWwKKwkgKi8KKwlpZiAocnQtPnJ0X2ZsYWdzICYgKFJUQ0ZfQlJPQURDQVNUIHwgUlRDRl9NVUxUSUNBU1QpKQorCQlnb3RvIG91dDsKKworCS8qCisJICoJT25seSByZXBseSB0byBmcmFnbWVudCAwLiBXZSBieXRlIHJlLW9yZGVyIHRoZSBjb25zdGFudAorCSAqCW1hc2sgZm9yIGVmZmljaWVuY3kuCisJICovCisJaWYgKGlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9PRkZTRVQpKQorCQlnb3RvIG91dDsKKworCS8qCisJICoJSWYgd2Ugc2VuZCBhbiBJQ01QIGVycm9yIHRvIGFuIElDTVAgZXJyb3IgYSBtZXNzIHdvdWxkIHJlc3VsdC4uCisJICovCisJaWYgKGljbXBfcG9pbnRlcnNbdHlwZV0uZXJyb3IpIHsKKwkJLyoKKwkJICoJV2UgYXJlIGFuIGVycm9yLCBjaGVjayBpZiB3ZSBhcmUgcmVwbHlpbmcgdG8gYW4KKwkJICoJSUNNUCBlcnJvcgorCQkgKi8KKwkJaWYgKGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QKSB7CisJCQl1OCBfaW5uZXJfdHlwZSwgKml0cDsKKworCQkJaXRwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYl9pbiwKKwkJCQkJCSBza2JfaW4tPm5oLnJhdyArCisJCQkJCQkgKGlwaC0+aWhsIDw8IDIpICsKKwkJCQkJCSBvZmZzZXRvZihzdHJ1Y3QgaWNtcGhkciwKKwkJCQkJCQkgIHR5cGUpIC0KKwkJCQkJCSBza2JfaW4tPmRhdGEsCisJCQkJCQkgc2l6ZW9mKF9pbm5lcl90eXBlKSwKKwkJCQkJCSAmX2lubmVyX3R5cGUpOworCQkJaWYgKGl0cCA9PSBOVUxMKQorCQkJCWdvdG8gb3V0OworCisJCQkvKgorCQkJICoJQXNzdW1lIGFueSB1bmtub3duIElDTVAgdHlwZSBpcyBhbiBlcnJvci4gVGhpcworCQkJICoJaXNuJ3Qgc3BlY2lmaWVkIGJ5IHRoZSBSRkMsIGJ1dCB0aGluayBhYm91dCBpdC4uCisJCQkgKi8KKwkJCWlmICgqaXRwID4gTlJfSUNNUF9UWVBFUyB8fAorCQkJICAgIGljbXBfcG9pbnRlcnNbKml0cF0uZXJyb3IpCisJCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoaWNtcF94bWl0X2xvY2soKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKglDb25zdHJ1Y3Qgc291cmNlIGFkZHJlc3MgYW5kIG9wdGlvbnMuCisJICovCisKKwlzYWRkciA9IGlwaC0+ZGFkZHI7CisJaWYgKCEocnQtPnJ0X2ZsYWdzICYgUlRDRl9MT0NBTCkpCisJCXNhZGRyID0gMDsKKworCXRvcyA9IGljbXBfcG9pbnRlcnNbdHlwZV0uZXJyb3IgPyAoKGlwaC0+dG9zICYgSVBUT1NfVE9TX01BU0spIHwKKwkJCQkJICAgSVBUT1NfUFJFQ19JTlRFUk5FVENPTlRST0wpIDoKKwkJCQkJICBpcGgtPnRvczsKKworCWlmIChpcF9vcHRpb25zX2VjaG8oJmljbXBfcGFyYW0ucmVwbHlvcHRzLCBza2JfaW4pKQorCQlnb3RvIGVuZGU7CisKKworCS8qCisJICoJUHJlcGFyZSBkYXRhIGZvciBJQ01QIGhlYWRlci4KKwkgKi8KKworCWljbXBfcGFyYW0uZGF0YS5pY21waC50eXBlCSA9IHR5cGU7CisJaWNtcF9wYXJhbS5kYXRhLmljbXBoLmNvZGUJID0gY29kZTsKKwlpY21wX3BhcmFtLmRhdGEuaWNtcGgudW4uZ2F0ZXdheSA9IGluZm87CisJaWNtcF9wYXJhbS5kYXRhLmljbXBoLmNoZWNrc3VtCSA9IDA7CisJaWNtcF9wYXJhbS5za2IJICA9IHNrYl9pbjsKKwlpY21wX3BhcmFtLm9mZnNldCA9IHNrYl9pbi0+bmgucmF3IC0gc2tiX2luLT5kYXRhOworCWljbXBfb3V0X2NvdW50KGljbXBfcGFyYW0uZGF0YS5pY21waC50eXBlKTsKKwlpbmV0X3NrKGljbXBfc29ja2V0LT5zayktPnRvcyA9IHRvczsKKwlpcGMuYWRkciA9IGlwaC0+c2FkZHI7CisJaXBjLm9wdCA9ICZpY21wX3BhcmFtLnJlcGx5b3B0czsKKworCXsKKwkJc3RydWN0IGZsb3dpIGZsID0geworCQkJLm5sX3UgPSB7CisJCQkJLmlwNF91ID0geworCQkJCQkuZGFkZHIgPSBpY21wX3BhcmFtLnJlcGx5b3B0cy5zcnIgPworCQkJCQkJaWNtcF9wYXJhbS5yZXBseW9wdHMuZmFkZHIgOgorCQkJCQkJaXBoLT5zYWRkciwKKwkJCQkJLnNhZGRyID0gc2FkZHIsCisJCQkJCS50b3MgPSBSVF9UT1ModG9zKQorCQkJCX0KKwkJCX0sCisJCQkucHJvdG8gPSBJUFBST1RPX0lDTVAsCisJCQkudWxpX3UgPSB7CisJCQkJLmljbXB0ID0geworCQkJCQkudHlwZSA9IHR5cGUsCisJCQkJCS5jb2RlID0gY29kZQorCQkJCX0KKwkJCX0KKwkJfTsKKwkJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpKQorCQkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWlmICghaWNtcHY0X3hybGltX2FsbG93KHJ0LCB0eXBlLCBjb2RlKSkKKwkJZ290byBlbmRlOworCisJLyogUkZDIHNheXMgcmV0dXJuIGFzIG11Y2ggYXMgd2UgY2FuIHdpdGhvdXQgZXhjZWVkaW5nIDU3NiBieXRlcy4gKi8KKworCXJvb20gPSBkc3RfbXR1KCZydC0+dS5kc3QpOworCWlmIChyb29tID4gNTc2KQorCQlyb29tID0gNTc2OworCXJvb20gLT0gc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyBpY21wX3BhcmFtLnJlcGx5b3B0cy5vcHRsZW47CisJcm9vbSAtPSBzaXplb2Yoc3RydWN0IGljbXBoZHIpOworCisJaWNtcF9wYXJhbS5kYXRhX2xlbiA9IHNrYl9pbi0+bGVuIC0gaWNtcF9wYXJhbS5vZmZzZXQ7CisJaWYgKGljbXBfcGFyYW0uZGF0YV9sZW4gPiByb29tKQorCQlpY21wX3BhcmFtLmRhdGFfbGVuID0gcm9vbTsKKwlpY21wX3BhcmFtLmhlYWRfbGVuID0gc2l6ZW9mKHN0cnVjdCBpY21waGRyKTsKKworCWljbXBfcHVzaF9yZXBseSgmaWNtcF9wYXJhbSwgJmlwYywgcnQpOworZW5kZToKKwlpcF9ydF9wdXQocnQpOworb3V0X3VubG9jazoKKwlpY21wX3htaXRfdW5sb2NrKCk7CitvdXQ6OworfQorCisKKy8qCisgKglIYW5kbGUgSUNNUF9ERVNUX1VOUkVBQ0gsIElDTVBfVElNRV9FWENFRUQsIGFuZCBJQ01QX1FVRU5DSC4KKyAqLworCitzdGF0aWMgdm9pZCBpY21wX3VucmVhY2goc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwlzdHJ1Y3QgaWNtcGhkciAqaWNtcGg7CisJaW50IGhhc2gsIHByb3RvY29sOworCXN0cnVjdCBuZXRfcHJvdG9jb2wgKmlwcHJvdDsKKwlzdHJ1Y3Qgc29jayAqcmF3X3NrOworCXUzMiBpbmZvID0gMDsKKworCS8qCisJICoJSW5jb21wbGV0ZSBoZWFkZXIgPworCSAqIAlPbmx5IGNoZWNrcyBmb3IgdGhlIElQIGhlYWRlciwgdGhlcmUgc2hvdWxkIGJlIGFuCisJICoJYWRkaXRpb25hbCBjaGVjayBmb3IgbG9uZ2VyIGhlYWRlcnMgaW4gdXBwZXIgbGV2ZWxzLgorCSAqLworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpKQorCQlnb3RvIG91dF9lcnI7CisKKwlpY21waCA9IHNrYi0+aC5pY21waDsKKwlpcGggICA9IChzdHJ1Y3QgaXBoZHIgKilza2ItPmRhdGE7CisKKwlpZiAoaXBoLT5paGwgPCA1KSAvKiBNYW5nbGVkIGhlYWRlciwgZHJvcC4gKi8KKwkJZ290byBvdXRfZXJyOworCisJaWYgKGljbXBoLT50eXBlID09IElDTVBfREVTVF9VTlJFQUNIKSB7CisJCXN3aXRjaCAoaWNtcGgtPmNvZGUgJiAxNSkgeworCQljYXNlIElDTVBfTkVUX1VOUkVBQ0g6CisJCWNhc2UgSUNNUF9IT1NUX1VOUkVBQ0g6CisJCWNhc2UgSUNNUF9QUk9UX1VOUkVBQ0g6CisJCWNhc2UgSUNNUF9QT1JUX1VOUkVBQ0g6CisJCQlicmVhazsKKwkJY2FzZSBJQ01QX0ZSQUdfTkVFREVEOgorCQkJaWYgKGlwdjRfY29uZmlnLm5vX3BtdHVfZGlzYykgeworCQkJCUxJTUlUX05FVERFQlVHKAorCQkJCQlwcmludGsoS0VSTl9JTkZPICJJQ01QOiAldS4ldS4ldS4ldTogIgorCQkJCQkJCSAiZnJhZ21lbnRhdGlvbiBuZWVkZWQgIgorCQkJCQkJCSAiYW5kIERGIHNldC5cbiIsCisJCQkJCSAgICAgICBOSVBRVUFEKGlwaC0+ZGFkZHIpKSk7CisJCQl9IGVsc2UgeworCQkJCWluZm8gPSBpcF9ydF9mcmFnX25lZWRlZChpcGgsCisJCQkJCQkgICAgIG50b2hzKGljbXBoLT51bi5mcmFnLm10dSkpOworCQkJCWlmICghaW5mbykKKwkJCQkJZ290byBvdXQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBJQ01QX1NSX0ZBSUxFRDoKKwkJCUxJTUlUX05FVERFQlVHKAorCQkJCXByaW50ayhLRVJOX0lORk8gIklDTVA6ICV1LiV1LiV1LiV1OiBTb3VyY2UgIgorCQkJCQkJICJSb3V0ZSBGYWlsZWQuXG4iLAorCQkJCSAgICAgICBOSVBRVUFEKGlwaC0+ZGFkZHIpKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWlmIChpY21waC0+Y29kZSA+IE5SX0lDTVBfVU5SRUFDSCkKKwkJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAoaWNtcGgtPnR5cGUgPT0gSUNNUF9QQVJBTUVURVJQUk9CKQorCQlpbmZvID0gbnRvaGwoaWNtcGgtPnVuLmdhdGV3YXkpID4+IDI0OworCisJLyoKKwkgKglUaHJvdyBpdCBhdCBvdXIgbG93ZXIgbGF5ZXJzCisJICoKKwkgKglSRkMgMTEyMjogMy4yLjIgTVVTVCBleHRyYWN0IHRoZSBwcm90b2NvbCBJRCBmcm9tIHRoZSBwYXNzZWQKKwkgKgkJICBoZWFkZXIuCisJICoJUkZDIDExMjI6IDMuMi4yLjEgTVVTVCBwYXNzIElDTVAgdW5yZWFjaCBtZXNzYWdlcyB0byB0aGUKKwkgKgkJICB0cmFuc3BvcnQgbGF5ZXIuCisJICoJUkZDIDExMjI6IDMuMi4yLjIgTVVTVCBwYXNzIElDTVAgdGltZSBleHBpcmVkIG1lc3NhZ2VzIHRvCisJICoJCSAgdHJhbnNwb3J0IGxheWVyLgorCSAqLworCisJLyoKKwkgKglDaGVjayB0aGUgb3RoZXIgZW5kIGlzbnQgdmlvbGF0aW5nIFJGQyAxMTIyLiBTb21lIHJvdXRlcnMgc2VuZAorCSAqCWJvZ3VzIHJlc3BvbnNlcyB0byBicm9hZGNhc3QgZnJhbWVzLiBJZiB5b3Ugc2VlIHRoaXMgbWVzc2FnZQorCSAqCWZpcnN0IGNoZWNrIHlvdXIgbmV0bWFzayBtYXRjaGVzIGF0IGJvdGggZW5kcywgaWYgaXQgZG9lcyB0aGVuCisJICoJZ2V0IHRoZSBvdGhlciB2ZW5kb3IgdG8gZml4IHRoZWlyIGtpdC4KKwkgKi8KKworCWlmICghc3lzY3RsX2ljbXBfaWdub3JlX2JvZ3VzX2Vycm9yX3Jlc3BvbnNlcyAmJgorCSAgICBpbmV0X2FkZHJfdHlwZShpcGgtPmRhZGRyKSA9PSBSVE5fQlJPQURDQVNUKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIldS4ldS4ldS4ldSBzZW50IGFuIGludmFsaWQgSUNNUCAiCisJCQkJCSAgICAidHlwZSAldSwgY29kZSAldSAiCisJCQkJCSAgICAiZXJyb3IgdG8gYSBicm9hZGNhc3Q6ICV1LiV1LiV1LiV1IG9uICVzXG4iLAorCQkJICAgICAgIE5JUFFVQUQoc2tiLT5uaC5pcGgtPnNhZGRyKSwKKwkJCSAgICAgICBpY21waC0+dHlwZSwgaWNtcGgtPmNvZGUsCisJCQkgICAgICAgTklQUVVBRChpcGgtPmRhZGRyKSwKKwkJCSAgICAgICBza2ItPmRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIENoZWNraW4gZnVsbCBJUCBoZWFkZXIgcGx1cyA4IGJ5dGVzIG9mIHByb3RvY29sIHRvCisJICogYXZvaWQgYWRkaXRpb25hbCBjb2RpbmcgYXQgcHJvdG9jb2wgaGFuZGxlcnMuCisJICovCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgaXBoLT5paGwgKiA0ICsgOCkpCisJCWdvdG8gb3V0OworCisJaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYi0+ZGF0YTsKKwlwcm90b2NvbCA9IGlwaC0+cHJvdG9jb2w7CisKKwkvKgorCSAqCURlbGl2ZXIgSUNNUCBtZXNzYWdlIHRvIHJhdyBzb2NrZXRzLiBQcmV0dHkgdXNlbGVzcyBmZWF0dXJlPworCSAqLworCisJLyogTm90ZTogU2VlIHJhdy5jIGFuZCBuZXQvcmF3LmgsIFJBV1Y0X0hUQUJMRV9TSVpFPT1NQVhfSU5FVF9QUk9UT1MgKi8KKwloYXNoID0gcHJvdG9jb2wgJiAoTUFYX0lORVRfUFJPVE9TIC0gMSk7CisJcmVhZF9sb2NrKCZyYXdfdjRfbG9jayk7CisJaWYgKChyYXdfc2sgPSBza19oZWFkKCZyYXdfdjRfaHRhYmxlW2hhc2hdKSkgIT0gTlVMTCkgeworCQl3aGlsZSAoKHJhd19zayA9IF9fcmF3X3Y0X2xvb2t1cChyYXdfc2ssIHByb3RvY29sLCBpcGgtPmRhZGRyLAorCQkJCQkJIGlwaC0+c2FkZHIsCisJCQkJCQkgc2tiLT5kZXYtPmlmaW5kZXgpKSAhPSBOVUxMKSB7CisJCQlyYXdfZXJyKHJhd19zaywgc2tiLCBpbmZvKTsKKwkJCXJhd19zayA9IHNrX25leHQocmF3X3NrKTsKKwkJCWlwaCA9IChzdHJ1Y3QgaXBoZHIgKilza2ItPmRhdGE7CisJCX0KKwl9CisJcmVhZF91bmxvY2soJnJhd192NF9sb2NrKTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlpcHByb3QgPSByY3VfZGVyZWZlcmVuY2UoaW5ldF9wcm90b3NbaGFzaF0pOworCWlmIChpcHByb3QgJiYgaXBwcm90LT5lcnJfaGFuZGxlcikKKwkJaXBwcm90LT5lcnJfaGFuZGxlcihza2IsIGluZm8pOworCXJjdV9yZWFkX3VubG9jaygpOworCitvdXQ6CisJcmV0dXJuOworb3V0X2VycjoKKwlJQ01QX0lOQ19TVEFUU19CSChJQ01QX01JQl9JTkVSUk9SUyk7CisJZ290byBvdXQ7Cit9CisKKworLyoKKyAqCUhhbmRsZSBJQ01QX1JFRElSRUNULgorICovCisKK3N0YXRpYyB2b2lkIGljbXBfcmVkaXJlY3Qoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwl1bnNpZ25lZCBsb25nIGlwOworCisJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpCisJCWdvdG8gb3V0X2VycjsKKworCS8qCisJICoJR2V0IHRoZSBjb3BpZWQgaGVhZGVyIG9mIHRoZSBwYWNrZXQgdGhhdCBjYXVzZWQgdGhlIHJlZGlyZWN0CisJICovCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpKQorCQlnb3RvIG91dDsKKworCWlwaCA9IChzdHJ1Y3QgaXBoZHIgKilza2ItPmRhdGE7CisJaXAgPSBpcGgtPmRhZGRyOworCisJc3dpdGNoIChza2ItPmguaWNtcGgtPmNvZGUgJiA3KSB7CisJY2FzZSBJQ01QX1JFRElSX05FVDoKKwljYXNlIElDTVBfUkVESVJfTkVUVE9TOgorCQkvKgorCQkgKiBBcyBwZXIgUkZDIHJlY29tbWVuZGF0aW9ucyBub3cgaGFuZGxlIGl0IGFzIGEgaG9zdCByZWRpcmVjdC4KKwkJICovCisJY2FzZSBJQ01QX1JFRElSX0hPU1Q6CisJY2FzZSBJQ01QX1JFRElSX0hPU1RUT1M6CisJCWlwX3J0X3JlZGlyZWN0KHNrYi0+bmguaXBoLT5zYWRkciwgaXAsIHNrYi0+aC5pY21waC0+dW4uZ2F0ZXdheSwKKwkJCSAgICAgICBpcGgtPnNhZGRyLCBpcGgtPnRvcywgc2tiLT5kZXYpOworCQlicmVhazsKKyAgCX0KK291dDoKKwlyZXR1cm47CitvdXRfZXJyOgorCUlDTVBfSU5DX1NUQVRTX0JIKElDTVBfTUlCX0lORVJST1JTKTsKKwlnb3RvIG91dDsKK30KKworLyoKKyAqCUhhbmRsZSBJQ01QX0VDSE8gKCJwaW5nIikgcmVxdWVzdHMuCisgKgorICoJUkZDIDExMjI6IDMuMi4yLjYgTVVTVCBoYXZlIGFuIGVjaG8gc2VydmVyIHRoYXQgYW5zd2VycyBJQ01QIGVjaG8KKyAqCQkgIHJlcXVlc3RzLgorICoJUkZDIDExMjI6IDMuMi4yLjYgRGF0YSByZWNlaXZlZCBpbiB0aGUgSUNNUF9FQ0hPIHJlcXVlc3QgTVVTVCBiZQorICoJCSAgaW5jbHVkZWQgaW4gdGhlIHJlcGx5LgorICoJUkZDIDE4MTI6IDQuMy4zLjYgU0hPVUxEIGhhdmUgYSBjb25maWcgb3B0aW9uIGZvciBzaWxlbnRseSBpZ25vcmluZworICoJCSAgZWNobyByZXF1ZXN0cywgTVVTVCBoYXZlIGRlZmF1bHQ9Tk9ULgorICoJU2VlIGFsc28gV1JUIGhhbmRsaW5nIG9mIG9wdGlvbnMgb25jZSB0aGV5IGFyZSBkb25lIGFuZCB3b3JraW5nLgorICovCisKK3N0YXRpYyB2b2lkIGljbXBfZWNobyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmICghc3lzY3RsX2ljbXBfZWNob19pZ25vcmVfYWxsKSB7CisJCXN0cnVjdCBpY21wX2J4bSBpY21wX3BhcmFtOworCisJCWljbXBfcGFyYW0uZGF0YS5pY21waAkgICA9ICpza2ItPmguaWNtcGg7CisJCWljbXBfcGFyYW0uZGF0YS5pY21waC50eXBlID0gSUNNUF9FQ0hPUkVQTFk7CisJCWljbXBfcGFyYW0uc2tiCQkgICA9IHNrYjsKKwkJaWNtcF9wYXJhbS5vZmZzZXQJICAgPSAwOworCQlpY21wX3BhcmFtLmRhdGFfbGVuCSAgID0gc2tiLT5sZW47CisJCWljbXBfcGFyYW0uaGVhZF9sZW4JICAgPSBzaXplb2Yoc3RydWN0IGljbXBoZHIpOworCQlpY21wX3JlcGx5KCZpY21wX3BhcmFtLCBza2IpOworCX0KK30KKworLyoKKyAqCUhhbmRsZSBJQ01QIFRpbWVzdGFtcCByZXF1ZXN0cy4KKyAqCVJGQyAxMTIyOiAzLjIuMi44IE1BWSBpbXBsZW1lbnQgSUNNUCB0aW1lc3RhbXAgcmVxdWVzdHMuCisgKgkJICBTSE9VTEQgYmUgaW4gdGhlIGtlcm5lbCBmb3IgbWluaW11bSByYW5kb20gbGF0ZW5jeS4KKyAqCQkgIE1VU1QgYmUgYWNjdXJhdGUgdG8gYSBmZXcgbWludXRlcy4KKyAqCQkgIE1VU1QgYmUgdXBkYXRlZCBhdCBsZWFzdCBhdCAxNUh6LgorICovCitzdGF0aWMgdm9pZCBpY21wX3RpbWVzdGFtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB0aW1ldmFsIHR2OworCXN0cnVjdCBpY21wX2J4bSBpY21wX3BhcmFtOworCS8qCisJICoJVG9vIHNob3J0LgorCSAqLworCWlmIChza2ItPmxlbiA8IDQpCisJCWdvdG8gb3V0X2VycjsKKworCS8qCisJICoJRmlsbCBpbiB0aGUgY3VycmVudCB0aW1lIGFzIG1zIHNpbmNlIG1pZG5pZ2h0IFVUOgorCSAqLworCWRvX2dldHRpbWVvZmRheSgmdHYpOworCWljbXBfcGFyYW0uZGF0YS50aW1lc1sxXSA9IGh0b25sKCh0di50dl9zZWMgJSA4NjQwMCkgKiAxMDAwICsKKwkJCQkJIHR2LnR2X3VzZWMgLyAxMDAwKTsKKwlpY21wX3BhcmFtLmRhdGEudGltZXNbMl0gPSBpY21wX3BhcmFtLmRhdGEudGltZXNbMV07CisJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCAmaWNtcF9wYXJhbS5kYXRhLnRpbWVzWzBdLCA0KSkKKwkJQlVHKCk7CisJaWNtcF9wYXJhbS5kYXRhLmljbXBoCSAgID0gKnNrYi0+aC5pY21waDsKKwlpY21wX3BhcmFtLmRhdGEuaWNtcGgudHlwZSA9IElDTVBfVElNRVNUQU1QUkVQTFk7CisJaWNtcF9wYXJhbS5kYXRhLmljbXBoLmNvZGUgPSAwOworCWljbXBfcGFyYW0uc2tiCQkgICA9IHNrYjsKKwlpY21wX3BhcmFtLm9mZnNldAkgICA9IDA7CisJaWNtcF9wYXJhbS5kYXRhX2xlbgkgICA9IDA7CisJaWNtcF9wYXJhbS5oZWFkX2xlbgkgICA9IHNpemVvZihzdHJ1Y3QgaWNtcGhkcikgKyAxMjsKKwlpY21wX3JlcGx5KCZpY21wX3BhcmFtLCBza2IpOworb3V0OgorCXJldHVybjsKK291dF9lcnI6CisJSUNNUF9JTkNfU1RBVFNfQkgoSUNNUF9NSUJfSU5FUlJPUlMpOworCWdvdG8gb3V0OworfQorCisKKy8qCisgKglIYW5kbGUgSUNNUF9BRERSRVNTX01BU0sgcmVxdWVzdHMuICAoUkZDOTUwKQorICoKKyAqIFJGQzExMjIgKDMuMi4yLjkpLiAgQSBob3N0IE1VU1Qgb25seSBzZW5kIHJlcGxpZXMgdG8KKyAqIEFERFJFU1NfTUFTSyByZXF1ZXN0cyBpZiBpdCdzIGJlZW4gY29uZmlndXJlZCBhcyBhbiBhZGRyZXNzIG1hc2sKKyAqIGFnZW50LiAgUmVjZWl2aW5nIGEgcmVxdWVzdCBkb2Vzbid0IGNvbnN0aXR1dGUgaW1wbGljaXQgcGVybWlzc2lvbiB0bworICogYWN0IGFzIG9uZS4gT2YgY291cnNlLCBpbXBsZW1lbnRpbmcgdGhpcyBjb3JyZWN0bHkgcmVxdWlyZXMgKFNIT1VMRCkKKyAqIGEgd2F5IHRvIHR1cm4gdGhlIGZ1bmN0aW9uYWxpdHkgb24gYW5kIG9mZi4gIEFub3RoZXIgb25lIGZvciBzeXNjdGwoKSwKKyAqIEkgZ3Vlc3MuIC0tIE1TCisgKgorICogUkZDMTgxMiAoNC4zLjMuOSkuCUEgcm91dGVyIE1VU1QgaW1wbGVtZW50IGl0LgorICoJCQlBIHJvdXRlciBTSE9VTEQgaGF2ZSBzd2l0Y2ggdHVybmluZyBpdCBvbi9vZmYuCisgKgkJICAgICAgCVRoaXMgc3dpdGNoIE1VU1QgYmUgT04gYnkgZGVmYXVsdC4KKyAqCisgKiBHcmF0dWl0b3VzIHJlcGxpZXMsIHplcm8tc291cmNlIHJlcGxpZXMgYXJlIG5vdCBpbXBsZW1lbnRlZCwKKyAqIHRoYXQgY29tcGxpZXMgd2l0aCBSRkMuIERPIE5PVCBpbXBsZW1lbnQgdGhlbSEhISBBbGwgdGhlIGlkZWEKKyAqIG9mIGJyb2FkY2FzdCBhZGRybWFzayByZXBsaWVzIGFzIHNwZWNpZmllZCBpbiBSRkM5NTAgaXMgYnJva2VuLgorICogVGhlIHByb2JsZW0gaXMgdGhhdCBpdCBpcyBub3QgdW5jb21tb24gdG8gaGF2ZSBzZXZlcmFsIHByZWZpeGVzCisgKiBvbiBvbmUgcGh5c2ljYWwgaW50ZXJmYWNlLiBNb3Jlb3ZlciwgYWRkcm1hc2sgYWdlbnQgY2FuIGV2ZW4gYmUKKyAqIG5vdCBhd2FyZSBvZiBleGlzdGluZyBhbm90aGVyIHByZWZpeGVzLgorICogSWYgc291cmNlIGlzIHplcm8sIGFkZHJtYXNrIGFnZW50IGNhbm5vdCBjaG9vc2UgY29ycmVjdCBwcmVmaXguCisgKiBHcmF0dWl0b3VzIG1hc2sgYW5ub3VuY2VtZW50cyBzdWZmZXIgZnJvbSB0aGUgc2FtZSBwcm9ibGVtLgorICogUkZDMTgxMiBleHBsYWlucyBpdCwgYnV0IHN0aWxsIGFsbG93cyB0byB1c2UgQUREUk1BU0ssCisgKiB0aGF0IGlzIHByZXR0eSBzaWxseS4gLS1BTksKKyAqCisgKiBBbGwgdGhlc2UgcnVsZXMgYXJlIHNvIGJpemFycmUsIHRoYXQgSSByZW1vdmVkIGtlcm5lbCBhZGRybWFzaworICogc3VwcG9ydCBhdCBhbGwuIEl0IGlzIHdyb25nLCBpdCBpcyBvYnNvbGV0ZSwgbm9ib2R5IHVzZXMgaXQgaW4KKyAqIGFueSBjYXNlLiAtLUFOSworICoKKyAqIEZ1cnRoZXJtb3JlIHlvdSBjYW4gZG8gaXQgd2l0aCBhIHVzZXJtb2RlIGFkZHJlc3MgYWdlbnQgcHJvZ3JhbQorICogYW55d2F5Li4uCisgKi8KKworc3RhdGljIHZvaWQgaWNtcF9hZGRyZXNzKHN0cnVjdCBza19idWZmICpza2IpCit7CisjaWYgMAorCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCXByaW50ayhLRVJOX0RFQlVHICJhIGd1eSBhc2tzIGZvciBhZGRyZXNzIG1hc2suIFdobyBpcyBpdD9cbiIpOworI2VuZGlmCit9CisKKy8qCisgKiBSRkMxODEyICg0LjMuMy45KS4JQSByb3V0ZXIgU0hPVUxEIGxpc3RlbiBhbGwgcmVwbGllcywgYW5kIGNvbXBsYWluCisgKgkJCWxvdWRseSBpZiBhbiBpbmNvbnNpc3RlbmN5IGlzIGZvdW5kLgorICovCisKK3N0YXRpYyB2b2lkIGljbXBfYWRkcmVzc19yZXBseShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBydGFibGUgKnJ0ID0gKHN0cnVjdCBydGFibGUgKilza2ItPmRzdDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCXN0cnVjdCBpbl9pZmFkZHIgKmlmYTsKKworCWlmIChza2ItPmxlbiA8IDQgfHwgIShydC0+cnRfZmxhZ3MmUlRDRl9ESVJFQ1RTUkMpKQorCQlnb3RvIG91dDsKKworCWluX2RldiA9IGluX2Rldl9nZXQoZGV2KTsKKwlpZiAoIWluX2RldikKKwkJZ290byBvdXQ7CisJcmN1X3JlYWRfbG9jaygpOworCWlmIChpbl9kZXYtPmlmYV9saXN0ICYmCisJICAgIElOX0RFVl9MT0dfTUFSVElBTlMoaW5fZGV2KSAmJgorCSAgICBJTl9ERVZfRk9SV0FSRChpbl9kZXYpKSB7CisJCXUzMiBfbWFzaywgKm1wOworCisJCW1wID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgMCwgc2l6ZW9mKF9tYXNrKSwgJl9tYXNrKTsKKwkJaWYgKG1wID09IE5VTEwpCisJCQlCVUcoKTsKKwkJZm9yIChpZmEgPSBpbl9kZXYtPmlmYV9saXN0OyBpZmE7IGlmYSA9IGlmYS0+aWZhX25leHQpIHsKKwkJCWlmICgqbXAgPT0gaWZhLT5pZmFfbWFzayAmJgorCQkJICAgIGluZXRfaWZhX21hdGNoKHJ0LT5ydF9zcmMsIGlmYSkpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFpZmEgJiYgbmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJXcm9uZyBhZGRyZXNzIG1hc2sgJXUuJXUuJXUuJXUgZnJvbSAiCisJCQkJCSAiJXMvJXUuJXUuJXUuJXVcbiIsCisJCQkgICAgICAgTklQUVVBRCgqbXApLCBkZXYtPm5hbWUsIE5JUFFVQUQocnQtPnJ0X3NyYykpOworCQl9CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCWluX2Rldl9wdXQoaW5fZGV2KTsKK291dDo7Cit9CisKK3N0YXRpYyB2b2lkIGljbXBfZGlzY2FyZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworfQorCisvKgorICoJRGVhbCB3aXRoIGluY29taW5nIElDTVAgcGFja2V0cy4KKyAqLworaW50IGljbXBfcmN2KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGljbXBoZHIgKmljbXBoOworCXN0cnVjdCBydGFibGUgKnJ0ID0gKHN0cnVjdCBydGFibGUgKilza2ItPmRzdDsKKworCUlDTVBfSU5DX1NUQVRTX0JIKElDTVBfTUlCX0lOTVNHUyk7CisKKwlzd2l0Y2ggKHNrYi0+aXBfc3VtbWVkKSB7CisJY2FzZSBDSEVDS1NVTV9IVzoKKwkJaWYgKCEodTE2KWNzdW1fZm9sZChza2ItPmNzdW0pKQorCQkJYnJlYWs7CisJCU5FVERFQlVHKGlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImljbXAgdjQgaHcgY3N1bSBmYWlsdXJlXG4iKSk7CisJY2FzZSBDSEVDS1NVTV9OT05FOgorCQlpZiAoKHUxNiljc3VtX2ZvbGQoc2tiX2NoZWNrc3VtKHNrYiwgMCwgc2tiLT5sZW4sIDApKSkKKwkJCWdvdG8gZXJyb3I7CisJZGVmYXVsdDo7CisJfQorCisJaWYgKCFwc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGljbXBoZHIpKSkKKwkJZ290byBlcnJvcjsKKworCWljbXBoID0gc2tiLT5oLmljbXBoOworCisJLyoKKwkgKgkxOCBpcyB0aGUgaGlnaGVzdCAna25vd24nIElDTVAgdHlwZS4gQW55dGhpbmcgZWxzZSBpcyBhIG15c3RlcnkKKwkgKgorCSAqCVJGQyAxMTIyOiAzLjIuMiAgVW5rbm93biBJQ01QIG1lc3NhZ2VzIHR5cGVzIE1VU1QgYmUgc2lsZW50bHkKKwkgKgkJICBkaXNjYXJkZWQuCisJICovCisJaWYgKGljbXBoLT50eXBlID4gTlJfSUNNUF9UWVBFUykKKwkJZ290byBlcnJvcjsKKworCisJLyoKKwkgKglQYXJzZSB0aGUgSUNNUCBtZXNzYWdlCisJICovCisKKyAJaWYgKHJ0LT5ydF9mbGFncyAmIChSVENGX0JST0FEQ0FTVCB8IFJUQ0ZfTVVMVElDQVNUKSkgeworCQkvKgorCQkgKglSRkMgMTEyMjogMy4yLjIuNiBBbiBJQ01QX0VDSE8gdG8gYnJvYWRjYXN0IE1BWSBiZQorCQkgKgkgIHNpbGVudGx5IGlnbm9yZWQgKHdlIGxldCB1c2VyIGRlY2lkZSB3aXRoIGEgc3lzY3RsKS4KKwkJICoJUkZDIDExMjI6IDMuMi4yLjggQW4gSUNNUF9USU1FU1RBTVAgTUFZIGJlIHNpbGVudGx5CisJCSAqCSAgZGlzY2FyZGVkIGlmIHRvIGJyb2FkY2FzdC9tdWx0aWNhc3QuCisJCSAqLworCQlpZiAoaWNtcGgtPnR5cGUgPT0gSUNNUF9FQ0hPICYmCisJCSAgICBzeXNjdGxfaWNtcF9lY2hvX2lnbm9yZV9icm9hZGNhc3RzKSB7CisJCQlnb3RvIGVycm9yOworCQl9CisJCWlmIChpY21waC0+dHlwZSAhPSBJQ01QX0VDSE8gJiYKKwkJICAgIGljbXBoLT50eXBlICE9IElDTVBfVElNRVNUQU1QICYmCisJCSAgICBpY21waC0+dHlwZSAhPSBJQ01QX0FERFJFU1MgJiYKKwkJICAgIGljbXBoLT50eXBlICE9IElDTVBfQUREUkVTU1JFUExZKSB7CisJCQlnb3RvIGVycm9yOworICAJCX0KKwl9CisKKwlJQ01QX0lOQ19TVEFUU19CSChpY21wX3BvaW50ZXJzW2ljbXBoLT50eXBlXS5pbnB1dF9lbnRyeSk7CisJaWNtcF9wb2ludGVyc1tpY21waC0+dHlwZV0uaGFuZGxlcihza2IpOworCitkcm9wOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworZXJyb3I6CisJSUNNUF9JTkNfU1RBVFNfQkgoSUNNUF9NSUJfSU5FUlJPUlMpOworCWdvdG8gZHJvcDsKK30KKworLyoKKyAqCVRoaXMgdGFibGUgaXMgdGhlIGRlZmluaXRpb24gb2YgaG93IHdlIGhhbmRsZSBJQ01QLgorICovCitzdGF0aWMgc3RydWN0IGljbXBfY29udHJvbCBpY21wX3BvaW50ZXJzW05SX0lDTVBfVFlQRVMgKyAxXSA9IHsKKwlbSUNNUF9FQ0hPUkVQTFldID0geworCQkub3V0cHV0X2VudHJ5ID0gSUNNUF9NSUJfT1VURUNIT1JFUFMsCisJCS5pbnB1dF9lbnRyeSA9IElDTVBfTUlCX0lORUNIT1JFUFMsCisJCS5oYW5kbGVyID0gaWNtcF9kaXNjYXJkLAorCX0sCisJWzFdID0geworCQkub3V0cHV0X2VudHJ5ID0gSUNNUF9NSUJfRFVNTVksCisJCS5pbnB1dF9lbnRyeSA9IElDTVBfTUlCX0lORVJST1JTLAorCQkuaGFuZGxlciA9IGljbXBfZGlzY2FyZCwKKwkJLmVycm9yID0gMSwKKwl9LAorCVsyXSA9IHsKKwkJLm91dHB1dF9lbnRyeSA9IElDTVBfTUlCX0RVTU1ZLAorCQkuaW5wdXRfZW50cnkgPSBJQ01QX01JQl9JTkVSUk9SUywKKwkJLmhhbmRsZXIgPSBpY21wX2Rpc2NhcmQsCisJCS5lcnJvciA9IDEsCisJfSwKKwlbSUNNUF9ERVNUX1VOUkVBQ0hdID0geworCQkub3V0cHV0X2VudHJ5ID0gSUNNUF9NSUJfT1VUREVTVFVOUkVBQ0hTLAorCQkuaW5wdXRfZW50cnkgPSBJQ01QX01JQl9JTkRFU1RVTlJFQUNIUywKKwkJLmhhbmRsZXIgPSBpY21wX3VucmVhY2gsCisJCS5lcnJvciA9IDEsCisJfSwKKwlbSUNNUF9TT1VSQ0VfUVVFTkNIXSA9IHsKKwkJLm91dHB1dF9lbnRyeSA9IElDTVBfTUlCX09VVFNSQ1FVRU5DSFMsCisJCS5pbnB1dF9lbnRyeSA9IElDTVBfTUlCX0lOU1JDUVVFTkNIUywKKwkJLmhhbmRsZXIgPSBpY21wX3VucmVhY2gsCisJCS5lcnJvciA9IDEsCisJfSwKKwlbSUNNUF9SRURJUkVDVF0gPSB7CisJCS5vdXRwdXRfZW50cnkgPSBJQ01QX01JQl9PVVRSRURJUkVDVFMsCisJCS5pbnB1dF9lbnRyeSA9IElDTVBfTUlCX0lOUkVESVJFQ1RTLAorCQkuaGFuZGxlciA9IGljbXBfcmVkaXJlY3QsCisJCS5lcnJvciA9IDEsCisJfSwKKwlbNl0gPSB7CisJCS5vdXRwdXRfZW50cnkgPSBJQ01QX01JQl9EVU1NWSwKKwkJLmlucHV0X2VudHJ5ID0gSUNNUF9NSUJfSU5FUlJPUlMsCisJCS5oYW5kbGVyID0gaWNtcF9kaXNjYXJkLAorCQkuZXJyb3IgPSAxLAorCX0sCisJWzddID0geworCQkub3V0cHV0X2VudHJ5ID0gSUNNUF9NSUJfRFVNTVksCisJCS5pbnB1dF9lbnRyeSA9IElDTVBfTUlCX0lORVJST1JTLAorCQkuaGFuZGxlciA9IGljbXBfZGlzY2FyZCwKKwkJLmVycm9yID0gMSwKKwl9LAorCVtJQ01QX0VDSE9dID0geworCQkub3V0cHV0X2VudHJ5ID0gSUNNUF9NSUJfT1VURUNIT1MsCisJCS5pbnB1dF9lbnRyeSA9IElDTVBfTUlCX0lORUNIT1MsCisJCS5oYW5kbGVyID0gaWNtcF9lY2hvLAorCX0sCisJWzldID0geworCQkub3V0cHV0X2VudHJ5ID0gSUNNUF9NSUJfRFVNTVksCisJCS5pbnB1dF9lbnRyeSA9IElDTVBfTUlCX0lORVJST1JTLAorCQkuaGFuZGxlciA9IGljbXBfZGlzY2FyZCwKKwkJLmVycm9yID0gMSwKKwl9LAorCVsxMF0gPSB7CisJCS5vdXRwdXRfZW50cnkgPSBJQ01QX01JQl9EVU1NWSwKKwkJLmlucHV0X2VudHJ5ID0gSUNNUF9NSUJfSU5FUlJPUlMsCisJCS5oYW5kbGVyID0gaWNtcF9kaXNjYXJkLAorCQkuZXJyb3IgPSAxLAorCX0sCisJW0lDTVBfVElNRV9FWENFRURFRF0gPSB7CisJCS5vdXRwdXRfZW50cnkgPSBJQ01QX01JQl9PVVRUSU1FRVhDRFMsCisJCS5pbnB1dF9lbnRyeSA9IElDTVBfTUlCX0lOVElNRUVYQ0RTLAorCQkuaGFuZGxlciA9IGljbXBfdW5yZWFjaCwKKwkJLmVycm9yID0gMSwKKwl9LAorCVtJQ01QX1BBUkFNRVRFUlBST0JdID0geworCQkub3V0cHV0X2VudHJ5ID0gSUNNUF9NSUJfT1VUUEFSTVBST0JTLAorCQkuaW5wdXRfZW50cnkgPSBJQ01QX01JQl9JTlBBUk1QUk9CUywKKwkJLmhhbmRsZXIgPSBpY21wX3VucmVhY2gsCisJCS5lcnJvciA9IDEsCisJfSwKKwlbSUNNUF9USU1FU1RBTVBdID0geworCQkub3V0cHV0X2VudHJ5ID0gSUNNUF9NSUJfT1VUVElNRVNUQU1QUywKKwkJLmlucHV0X2VudHJ5ID0gSUNNUF9NSUJfSU5USU1FU1RBTVBTLAorCQkuaGFuZGxlciA9IGljbXBfdGltZXN0YW1wLAorCX0sCisJW0lDTVBfVElNRVNUQU1QUkVQTFldID0geworCQkub3V0cHV0X2VudHJ5ID0gSUNNUF9NSUJfT1VUVElNRVNUQU1QUkVQUywKKwkJLmlucHV0X2VudHJ5ID0gSUNNUF9NSUJfSU5USU1FU1RBTVBSRVBTLAorCQkuaGFuZGxlciA9IGljbXBfZGlzY2FyZCwKKwl9LAorCVtJQ01QX0lORk9fUkVRVUVTVF0gPSB7CisJCS5vdXRwdXRfZW50cnkgPSBJQ01QX01JQl9EVU1NWSwKKwkJLmlucHV0X2VudHJ5ID0gSUNNUF9NSUJfRFVNTVksCisJCS5oYW5kbGVyID0gaWNtcF9kaXNjYXJkLAorCX0sCisgCVtJQ01QX0lORk9fUkVQTFldID0geworCQkub3V0cHV0X2VudHJ5ID0gSUNNUF9NSUJfRFVNTVksCisJCS5pbnB1dF9lbnRyeSA9IElDTVBfTUlCX0RVTU1ZLAorCQkuaGFuZGxlciA9IGljbXBfZGlzY2FyZCwKKwl9LAorCVtJQ01QX0FERFJFU1NdID0geworCQkub3V0cHV0X2VudHJ5ID0gSUNNUF9NSUJfT1VUQUREUk1BU0tTLAorCQkuaW5wdXRfZW50cnkgPSBJQ01QX01JQl9JTkFERFJNQVNLUywKKwkJLmhhbmRsZXIgPSBpY21wX2FkZHJlc3MsCisJfSwKKwlbSUNNUF9BRERSRVNTUkVQTFldID0geworCQkub3V0cHV0X2VudHJ5ID0gSUNNUF9NSUJfT1VUQUREUk1BU0tSRVBTLAorCQkuaW5wdXRfZW50cnkgPSBJQ01QX01JQl9JTkFERFJNQVNLUkVQUywKKwkJLmhhbmRsZXIgPSBpY21wX2FkZHJlc3NfcmVwbHksCisJfSwKK307CisKK3ZvaWQgX19pbml0IGljbXBfaW5pdChzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSAqb3BzKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7CisJCWludCBlcnI7CisKKwkJaWYgKCFjcHVfcG9zc2libGUoaSkpCisJCQljb250aW51ZTsKKworCQllcnIgPSBzb2NrX2NyZWF0ZV9rZXJuKFBGX0lORVQsIFNPQ0tfUkFXLCBJUFBST1RPX0lDTVAsCisJCQkJICAgICAgICZwZXJfY3B1KF9faWNtcF9zb2NrZXQsIGkpKTsKKworCQlpZiAoZXJyIDwgMCkKKwkJCXBhbmljKCJGYWlsZWQgdG8gY3JlYXRlIHRoZSBJQ01QIGNvbnRyb2wgc29ja2V0LlxuIik7CisKKwkJcGVyX2NwdShfX2ljbXBfc29ja2V0LCBpKS0+c2stPnNrX2FsbG9jYXRpb24gPSBHRlBfQVRPTUlDOworCisJCS8qIEVub3VnaCBzcGFjZSBmb3IgMiA2NEsgSUNNUCBwYWNrZXRzLCBpbmNsdWRpbmcKKwkJICogc2tfYnVmZiBzdHJ1Y3Qgb3ZlcmhlYWQuCisJCSAqLworCQlwZXJfY3B1KF9faWNtcF9zb2NrZXQsIGkpLT5zay0+c2tfc25kYnVmID0KKwkJCSgyICogKCg2NCAqIDEwMjQpICsgc2l6ZW9mKHN0cnVjdCBza19idWZmKSkpOworCisJCWluZXQgPSBpbmV0X3NrKHBlcl9jcHUoX19pY21wX3NvY2tldCwgaSktPnNrKTsKKwkJaW5ldC0+dWNfdHRsID0gLTE7CisJCWluZXQtPnBtdHVkaXNjID0gSVBfUE1UVURJU0NfRE9OVDsKKworCQkvKiBVbmhhc2ggaXQgc28gdGhhdCBJUCBpbnB1dCBwcm9jZXNzaW5nIGRvZXMgbm90IGV2ZW4KKwkJICogc2VlIGl0LCB3ZSBkbyBub3Qgd2lzaCB0aGlzIHNvY2tldCB0byBzZWUgaW5jb21pbmcKKwkJICogcGFja2V0cy4KKwkJICovCisJCXBlcl9jcHUoX19pY21wX3NvY2tldCwgaSktPnNrLT5za19wcm90LT51bmhhc2gocGVyX2NwdShfX2ljbXBfc29ja2V0LCBpKS0+c2spOworCX0KK30KKworRVhQT1JUX1NZTUJPTChpY21wX2Vycl9jb252ZXJ0KTsKK0VYUE9SVF9TWU1CT0woaWNtcF9zZW5kKTsKK0VYUE9SVF9TWU1CT0woaWNtcF9zdGF0aXN0aWNzKTsKK0VYUE9SVF9TWU1CT0woeHJsaW1fYWxsb3cpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaWdtcC5jIGIvbmV0L2lwdjQvaWdtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMzE4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9pZ21wLmMKQEAgLTAsMCArMSwyNDczIEBACisvKgorICoJTGludXggTkVUMzoJSW50ZXJuZXQgR3JvdXAgTWFuYWdlbWVudCBQcm90b2NvbCAgW0lHTVBdCisgKgorICoJVGhpcyBjb2RlIGltcGxlbWVudHMgdGhlIElHTVAgcHJvdG9jb2wgYXMgZGVmaW5lZCBpbiBSRkMxMTEyLiBUaGVyZSBoYXMKKyAqCWJlZW4gYSBmdXJ0aGVyIHJldmlzaW9uIG9mIHRoaXMgcHJvdG9jb2wgc2luY2Ugd2hpY2ggaXMgbm93IHN1cHBvcnRlZC4KKyAqCisgKglJZiB5b3UgaGF2ZSB0cm91YmxlIHdpdGggdGhpcyBtb2R1bGUgYmUgY2FyZWZ1bCB3aGF0IGdjYyB5b3UgaGF2ZSB1c2VkLAorICoJdGhlIG9sZGVyIHZlcnNpb24gZGlkbid0IGNvbWUgb3V0IHJpZ2h0IHVzaW5nIGdjYyAyLjUuOCwgdGhlIG5ld2VyIG9uZQorICoJc2VlbXMgdG8gZmFsbCBvdXQgd2l0aCBnY2MgMi42LjIuCisgKgorICoJVmVyc2lvbjogJElkOiBpZ21wLmMsdiAxLjQ3IDIwMDIvMDIvMDEgMjI6MDE6MDMgZGF2ZW0gRXhwICQKKyAqCisgKglBdXRob3JzOgorICoJCUFsYW4gQ294IDxBbGFuLkNveEBsaW51eC5vcmc+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglGaXhlczoKKyAqCisgKgkJQWxhbiBDb3gJOglBZGRlZCBsb3RzIG9mIF9faW5saW5lX18gdG8gb3B0aW1pc2UKKyAqCQkJCQl0aGUgbWVtb3J5IHVzYWdlIG9mIGFsbCB0aGUgdGlueSBsaXR0bGUKKyAqCQkJCQlmdW5jdGlvbnMuCisgKgkJQWxhbiBDb3gJOglEdW1wZWQgdGhlIGhlYWRlciBidWlsZGluZyBleHBlcmltZW50LgorICoJCUFsYW4gQ294CToJTWlub3IgdHdlYWtzIHJlYWR5IGZvciBtdWx0aWNhc3Qgcm91dGluZworICoJCQkJCWFuZCBleHRlbmRlZCBJR01QIHByb3RvY29sLgorICoJCUFsYW4gQ294CToJUmVtb3ZlZCBhIGxvYWQgb2YgaW5saW5lIGRpcmVjdGl2ZXMuIEdjYyAyLjUuOAorICoJCQkJCXdyaXRlcyB1dHRlcmx5IGJvZ3VzIGNvZGUgb3RoZXJ3aXNlIChzaWdoKQorICoJCQkJCWZpeGVkIElHTVAgbG9vcGJhY2sgdG8gYmVoYXZlIGluIHRoZSBtYW5uZXIKKyAqCQkJCQlkZXNpcmVkIGJ5IG1yb3V0ZWQsIGZpeGVkIHRoZSBmYWN0IGl0IGhhcyBiZWVuCisgKgkJCQkJYnJva2VuIHNpbmNlIDEuMy42IGFuZCBjbGVhbmVkIHVwIGEgZmV3IG1pbm9yCisgKgkJCQkJcG9pbnRzLgorICoKKyAqCQlDaGloLUplbiBDaGFuZwk6CVRyaWVkIHRvIHJldmlzZSBJR01QIHRvIFZlcnNpb24gMgorICoJCVRzdS1TaGVuZyBUc2FvCQlFLW1haWw6IGNoaWhqZW5jQHNjZi51c2MuZWR1IGFuZCB0c3VzaGVuZ0BzY2YudXNjLmVkdQorICoJCQkJCVRoZSBlbmhhbmNlbWVudHMgYXJlIG1haW5seSBiYXNlZCBvbiBTdGV2ZSBEZWVyaW5nJ3MgCisgKiAJCQkJCWlwbXVsdGktMy41IHNvdXJjZSBjb2RlLgorICoJCUNoaWgtSmVuIENoYW5nCToJQWRkZWQgdGhlIGlnbXBfZ2V0X21yb3V0ZXJfaW5mbyBhbmQKKyAqCQlUc3UtU2hlbmcgVHNhbwkJaWdtcF9zZXRfbXJvdXRlcl9pbmZvIHRvIGtlZXAgdHJhY2sgb2YKKyAqCQkJCQl0aGUgbXJvdXRlZCB2ZXJzaW9uIG9uIHRoYXQgZGV2aWNlLgorICoJCUNoaWgtSmVuIENoYW5nCToJQWRkZWQgdGhlIG1heF9yZXNwX3RpbWUgcGFyYW1ldGVyIHRvCisgKgkJVHN1LVNoZW5nIFRzYW8JCWlnbXBfaGVhcmRfcXVlcnkoKS4gVXNpbmcgdGhpcyBwYXJhbWV0ZXIKKyAqCQkJCQl0byBpZGVudGlmeSB0aGUgbXVsdGljYXN0IHJvdXRlciB2ZXJzaW9uCisgKgkJCQkJYW5kIGRvIHdoYXQgdGhlIElHTVAgdmVyc2lvbiAyIHNwZWNpZmllZC4KKyAqCQlDaGloLUplbiBDaGFuZwk6CUFkZGVkIGEgdGltZXIgdG8gcmV2ZXJ0IHRvIElHTVAgVjIgcm91dGVyCisgKgkJVHN1LVNoZW5nIFRzYW8JCWlmIHRoZSBzcGVjaWZpZWQgdGltZSBleHBpcmVkLgorICoJCUFsYW4gQ294CToJU3RvcCBJR01QIGZyb20gMC4wLjAuMCBiZWluZyBhY2NlcHRlZC4KKyAqCQlBbGFuIENveAk6CVVzZSBHRlBfQVRPTUlDIGluIHRoZSByaWdodCBwbGFjZXMuCisgKgkJQ2hyaXN0aWFuIERhdWR0IDoJaWdtcCB0aW1lciB3YXNuJ3Qgc2V0IGZvciBsb2NhbCBncm91cAorICoJCQkJCW1lbWJlcnNoaXBzIGJ1dCB3YXMgYmVpbmcgZGVsZXRlZCwgCisgKgkJCQkJd2hpY2ggY2F1c2VkIGEgImRlbF90aW1lcigpIGNhbGxlZCAKKyAqCQkJCQlmcm9tICVwIHdpdGggdGltZXIgbm90IGluaXRpYWxpemVkXG4iCisgKgkJCQkJbWVzc2FnZSAoOTYwMTMxKS4KKyAqCQlDaHJpc3RpYW4gRGF1ZHQgOglyZW1vdmVkIGRlbF90aW1lciBmcm9tIAorICoJCQkJCWlnbXBfdGltZXJfZXhwaXJlIGZ1bmN0aW9uICg5NjAyMDUpLgorICogICAgICAgICAgICAgQ2hyaXN0aWFuIERhdWR0IDogICAgICAgaWdtcF9oZWFyZF9yZXBvcnQgbm93IG9ubHkgY2FsbHMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbXBfdGltZXJfZXhwaXJlIGlmIHRtLT5ydW5uaW5nIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlICg5NjAyMTYpLgorICoJCU1hbGNvbG0gQmVhdHRpZSA6CXR0bCBjb21wYXJpc29uIHdyb25nIGluIGlnbXBfcmN2IG1hZGUKKyAqCQkJCQlpZ21wX2hlYXJkX3F1ZXJ5IG5ldmVyIHRyaWdnZXIuIEV4cGlyeQorICoJCQkJCW1pc2NhbGN1bGF0aW9uIGZpeGVkIGluIGlnbXBfaGVhcmRfcXVlcnkKKyAqCQkJCQlhbmQgcmFuZG9tKCkgbWFkZSB0byByZXR1cm4gdW5zaWduZWQgdG8KKyAqCQkJCQlwcmV2ZW50IG5lZ2F0aXZlIGV4cGlyeSB0aW1lcy4KKyAqCQlBbGV4ZXkgS3V6bmV0c292OglXcm9uZyBncm91cCBsZWF2aW5nIGJlaGF2aW91ciwgYmFja3BvcnQKKyAqCQkJCQlmaXggZnJvbSBwZW5kaW5nIDIuMS54IHBhdGNoZXMuCisgKgkJQWxhbiBDb3g6CQlGb3JnZXQgdG8gZW5hYmxlIEZEREkgc3VwcG9ydCBlYXJsaWVyLgorICoJCUFsZXhleSBLdXpuZXRzb3Y6CUZpeGVkIGxlYXZpbmcgZ3JvdXBzIG9uIGRldmljZSBkb3duLgorICoJCUFsZXhleSBLdXpuZXRzb3Y6CUFjY29yZGFuY2UgdG8gaWdtcC12Mi0wNiBkcmFmdC4KKyAqCQlEYXZpZCBMIFN0ZXZlbnM6CUlHTVB2MyBzdXBwb3J0LCB3aXRoIGhlbHAgZnJvbQorICoJCQkJCVZpbmF5IEt1bGthcm5pCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWdtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVzLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2lmZGVmIENPTkZJR19JUF9NUk9VVEUKKyNpbmNsdWRlIDxsaW51eC9tcm91dGUuaD4KKyNlbmRpZgorI2lmZGVmIENPTkZJR19QUk9DX0ZTCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjZW5kaWYKKworI2RlZmluZSBJUF9NQVhfTUVNQkVSU0hJUFMJMjAKKyNkZWZpbmUgSVBfTUFYX01TRgkJMTAKKworI2lmZGVmIENPTkZJR19JUF9NVUxUSUNBU1QKKy8qIFBhcmFtZXRlciBuYW1lcyBhbmQgdmFsdWVzIGFyZSB0YWtlbiBmcm9tIGlnbXAtdjItMDYgZHJhZnQgKi8KKworI2RlZmluZSBJR01QX1YxX1JvdXRlcl9QcmVzZW50X1RpbWVvdXQJCSg0MDAqSFopCisjZGVmaW5lIElHTVBfVjJfUm91dGVyX1ByZXNlbnRfVGltZW91dAkJKDQwMCpIWikKKyNkZWZpbmUgSUdNUF9VbnNvbGljaXRlZF9SZXBvcnRfSW50ZXJ2YWwJKDEwKkhaKQorI2RlZmluZSBJR01QX1F1ZXJ5X1Jlc3BvbnNlX0ludGVydmFsCQkoMTAqSFopCisjZGVmaW5lIElHTVBfVW5zb2xpY2l0ZWRfUmVwb3J0X0NvdW50CQkyCisKKworI2RlZmluZSBJR01QX0luaXRpYWxfUmVwb3J0X0RlbGF5CQkoMSkKKworLyogSUdNUF9Jbml0aWFsX1JlcG9ydF9EZWxheSBpcyBub3QgZnJvbSBJR01QIHNwZWNzIQorICogSUdNUCBzcGVjcyByZXF1aXJlIHRvIHJlcG9ydCBtZW1iZXJzaGlwIGltbWVkaWF0ZWx5IGFmdGVyCisgKiBqb2luaW5nIGEgZ3JvdXAsIGJ1dCB3ZSBkZWxheSB0aGUgZmlyc3QgcmVwb3J0IGJ5IGEKKyAqIHNtYWxsIGludGVydmFsLiBJdCBzZWVtcyBtb3JlIG5hdHVyYWwgYW5kIHN0aWxsIGRvZXMgbm90CisgKiBjb250cmFkaWN0IHRvIHNwZWNzIHByb3ZpZGVkIHRoaXMgZGVsYXkgaXMgc21hbGwgZW5vdWdoLgorICovCisKKyNkZWZpbmUgSUdNUF9WMV9TRUVOKGluX2RldikgKGlwdjRfZGV2Y29uZi5mb3JjZV9pZ21wX3ZlcnNpb24gPT0gMSB8fCBcCisJCShpbl9kZXYpLT5jbmYuZm9yY2VfaWdtcF92ZXJzaW9uID09IDEgfHwgXAorCQkoKGluX2RldiktPm1yX3YxX3NlZW4gJiYgXAorCQl0aW1lX2JlZm9yZShqaWZmaWVzLCAoaW5fZGV2KS0+bXJfdjFfc2VlbikpKQorI2RlZmluZSBJR01QX1YyX1NFRU4oaW5fZGV2KSAoaXB2NF9kZXZjb25mLmZvcmNlX2lnbXBfdmVyc2lvbiA9PSAyIHx8IFwKKwkJKGluX2RldiktPmNuZi5mb3JjZV9pZ21wX3ZlcnNpb24gPT0gMiB8fCBcCisJCSgoaW5fZGV2KS0+bXJfdjJfc2VlbiAmJiBcCisJCXRpbWVfYmVmb3JlKGppZmZpZXMsIChpbl9kZXYpLT5tcl92Ml9zZWVuKSkpCisKK3N0YXRpYyB2b2lkIGlnbXB2M19hZGRfZGVscmVjKHN0cnVjdCBpbl9kZXZpY2UgKmluX2Rldiwgc3RydWN0IGlwX21jX2xpc3QgKmltKTsKK3N0YXRpYyB2b2lkIGlnbXB2M19kZWxfZGVscmVjKHN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiwgX191MzIgbXVsdGlhZGRyKTsKK3N0YXRpYyB2b2lkIGlnbXB2M19jbGVhcl9kZWxyZWMoc3RydWN0IGluX2RldmljZSAqaW5fZGV2KTsKK3N0YXRpYyBpbnQgc2Zfc2V0c3RhdGUoc3RydWN0IGlwX21jX2xpc3QgKnBtYyk7CitzdGF0aWMgdm9pZCBzZl9tYXJrc3RhdGUoc3RydWN0IGlwX21jX2xpc3QgKnBtYyk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIGlwX21jX2NsZWFyX3NyYyhzdHJ1Y3QgaXBfbWNfbGlzdCAqcG1jKTsKK3N0YXRpYyBpbnQgaXBfbWNfYWRkX3NyYyhzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYsIF9fdTMyICpwbWNhLCBpbnQgc2Ztb2RlLAorCQkJIGludCBzZmNvdW50LCBfX3UzMiAqcHNmc3JjLCBpbnQgZGVsdGEpOworCitzdGF0aWMgdm9pZCBpcF9tYV9wdXQoc3RydWN0IGlwX21jX2xpc3QgKmltKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZpbS0+cmVmY250KSkgeworCQlpbl9kZXZfcHV0KGltLT5pbnRlcmZhY2UpOworCQlrZnJlZShpbSk7CisJfQorfQorCisjaWZkZWYgQ09ORklHX0lQX01VTFRJQ0FTVAorCisvKgorICoJVGltZXIgbWFuYWdlbWVudAorICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgaWdtcF9zdG9wX3RpbWVyKHN0cnVjdCBpcF9tY19saXN0ICppbSkKK3sKKwlzcGluX2xvY2tfYmgoJmltLT5sb2NrKTsKKwlpZiAoZGVsX3RpbWVyKCZpbS0+dGltZXIpKQorCQlhdG9taWNfZGVjKCZpbS0+cmVmY250KTsKKwlpbS0+dG1fcnVubmluZz0wOworCWltLT5yZXBvcnRlciA9IDA7CisJaW0tPnVuc29saWNpdF9jb3VudCA9IDA7CisJc3Bpbl91bmxvY2tfYmgoJmltLT5sb2NrKTsKK30KKworLyogSXQgbXVzdCBiZSBjYWxsZWQgd2l0aCBsb2NrZWQgaW0tPmxvY2sgKi8KK3N0YXRpYyB2b2lkIGlnbXBfc3RhcnRfdGltZXIoc3RydWN0IGlwX21jX2xpc3QgKmltLCBpbnQgbWF4X2RlbGF5KQoreworCWludCB0dj1uZXRfcmFuZG9tKCkgJSBtYXhfZGVsYXk7CisKKwlpbS0+dG1fcnVubmluZz0xOworCWlmICghbW9kX3RpbWVyKCZpbS0+dGltZXIsIGppZmZpZXMrdHYrMikpCisJCWF0b21pY19pbmMoJmltLT5yZWZjbnQpOworfQorCitzdGF0aWMgdm9pZCBpZ21wX2dxX3N0YXJ0X3RpbWVyKHN0cnVjdCBpbl9kZXZpY2UgKmluX2RldikKK3sKKwlpbnQgdHYgPSBuZXRfcmFuZG9tKCkgJSBpbl9kZXYtPm1yX21heGRlbGF5OworCisJaW5fZGV2LT5tcl9ncV9ydW5uaW5nID0gMTsKKwlpZiAoIW1vZF90aW1lcigmaW5fZGV2LT5tcl9ncV90aW1lciwgamlmZmllcyt0disyKSkKKwkJaW5fZGV2X2hvbGQoaW5fZGV2KTsKK30KKworc3RhdGljIHZvaWQgaWdtcF9pZmNfc3RhcnRfdGltZXIoc3RydWN0IGluX2RldmljZSAqaW5fZGV2LCBpbnQgZGVsYXkpCit7CisJaW50IHR2ID0gbmV0X3JhbmRvbSgpICUgZGVsYXk7CisKKwlpZiAoIW1vZF90aW1lcigmaW5fZGV2LT5tcl9pZmNfdGltZXIsIGppZmZpZXMrdHYrMikpCisJCWluX2Rldl9ob2xkKGluX2Rldik7Cit9CisKK3N0YXRpYyB2b2lkIGlnbXBfbW9kX3RpbWVyKHN0cnVjdCBpcF9tY19saXN0ICppbSwgaW50IG1heF9kZWxheSkKK3sKKwlzcGluX2xvY2tfYmgoJmltLT5sb2NrKTsKKwlpbS0+dW5zb2xpY2l0X2NvdW50ID0gMDsKKwlpZiAoZGVsX3RpbWVyKCZpbS0+dGltZXIpKSB7CisJCWlmICgobG9uZykoaW0tPnRpbWVyLmV4cGlyZXMtamlmZmllcykgPCBtYXhfZGVsYXkpIHsKKwkJCWFkZF90aW1lcigmaW0tPnRpbWVyKTsKKwkJCWltLT50bV9ydW5uaW5nPTE7CisJCQlzcGluX3VubG9ja19iaCgmaW0tPmxvY2spOworCQkJcmV0dXJuOworCQl9CisJCWF0b21pY19kZWMoJmltLT5yZWZjbnQpOworCX0KKwlpZ21wX3N0YXJ0X3RpbWVyKGltLCBtYXhfZGVsYXkpOworCXNwaW5fdW5sb2NrX2JoKCZpbS0+bG9jayk7Cit9CisKKworLyoKKyAqCVNlbmQgYW4gSUdNUCByZXBvcnQuCisgKi8KKworI2RlZmluZSBJR01QX1NJWkUgKHNpemVvZihzdHJ1Y3QgaWdtcGhkcikrc2l6ZW9mKHN0cnVjdCBpcGhkcikrNCkKKworCitzdGF0aWMgaW50IGlzX2luKHN0cnVjdCBpcF9tY19saXN0ICpwbWMsIHN0cnVjdCBpcF9zZl9saXN0ICpwc2YsIGludCB0eXBlLAorCWludCBnZGVsZXRlZCwgaW50IHNkZWxldGVkKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSUdNUFYzX01PREVfSVNfSU5DTFVERToKKwljYXNlIElHTVBWM19NT0RFX0lTX0VYQ0xVREU6CisJCWlmIChnZGVsZXRlZCB8fCBzZGVsZXRlZCkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gIShwbWMtPmdzcXVlcnkgJiYgIXBzZi0+c2ZfZ3NyZXNwKTsKKwljYXNlIElHTVBWM19DSEFOR0VfVE9fSU5DTFVERToKKwkJaWYgKGdkZWxldGVkIHx8IHNkZWxldGVkKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiBwc2YtPnNmX2NvdW50W01DQVNUX0lOQ0xVREVdICE9IDA7CisJY2FzZSBJR01QVjNfQ0hBTkdFX1RPX0VYQ0xVREU6CisJCWlmIChnZGVsZXRlZCB8fCBzZGVsZXRlZCkKKwkJCXJldHVybiAwOworCQlpZiAocG1jLT5zZmNvdW50W01DQVNUX0VYQ0xVREVdID09IDAgfHwKKwkJICAgIHBzZi0+c2ZfY291bnRbTUNBU1RfSU5DTFVERV0pCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIHBtYy0+c2Zjb3VudFtNQ0FTVF9FWENMVURFXSA9PQorCQkJcHNmLT5zZl9jb3VudFtNQ0FTVF9FWENMVURFXTsKKwljYXNlIElHTVBWM19BTExPV19ORVdfU09VUkNFUzoKKwkJaWYgKGdkZWxldGVkIHx8ICFwc2YtPnNmX2NyY291bnQpCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIChwbWMtPnNmbW9kZSA9PSBNQ0FTVF9JTkNMVURFKSBeIHNkZWxldGVkOworCWNhc2UgSUdNUFYzX0JMT0NLX09MRF9TT1VSQ0VTOgorCQlpZiAocG1jLT5zZm1vZGUgPT0gTUNBU1RfSU5DTFVERSkKKwkJCXJldHVybiBnZGVsZXRlZCB8fCAocHNmLT5zZl9jcmNvdW50ICYmIHNkZWxldGVkKTsKKwkJcmV0dXJuIHBzZi0+c2ZfY3Jjb3VudCAmJiAhZ2RlbGV0ZWQgJiYgIXNkZWxldGVkOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraWdtcF9zY291bnQoc3RydWN0IGlwX21jX2xpc3QgKnBtYywgaW50IHR5cGUsIGludCBnZGVsZXRlZCwgaW50IHNkZWxldGVkKQoreworCXN0cnVjdCBpcF9zZl9saXN0ICpwc2Y7CisJaW50IHNjb3VudCA9IDA7CisKKwlmb3IgKHBzZj1wbWMtPnNvdXJjZXM7IHBzZjsgcHNmPXBzZi0+c2ZfbmV4dCkgeworCQlpZiAoIWlzX2luKHBtYywgcHNmLCB0eXBlLCBnZGVsZXRlZCwgc2RlbGV0ZWQpKQorCQkJY29udGludWU7CisJCXNjb3VudCsrOworCX0KKwlyZXR1cm4gc2NvdW50OworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmlnbXB2M19uZXdwYWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzaXplKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHJ0YWJsZSAqcnQ7CisJc3RydWN0IGlwaGRyICpwaXA7CisJc3RydWN0IGlnbXB2M19yZXBvcnQgKnBpZzsKKworCXNrYiA9IGFsbG9jX3NrYihzaXplICsgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSwgR0ZQX0FUT01JQyk7CisJaWYgKHNrYiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXsKKwkJc3RydWN0IGZsb3dpIGZsID0geyAub2lmID0gZGV2LT5pZmluZGV4LAorCQkJCSAgICAubmxfdSA9IHsgLmlwNF91ID0geworCQkJCSAgICAuZGFkZHIgPSBJR01QVjNfQUxMX01DUiB9IH0sCisJCQkJICAgIC5wcm90byA9IElQUFJPVE9fSUdNUCB9OworCQlpZiAoaXBfcm91dGVfb3V0cHV0X2tleSgmcnQsICZmbCkpIHsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJaWYgKHJ0LT5ydF9zcmMgPT0gMCkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJaXBfcnRfcHV0KHJ0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2tiLT5kc3QgPSAmcnQtPnUuZHN0OworCXNrYi0+ZGV2ID0gZGV2OworCisJc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKKworCXNrYi0+bmguaXBoID0gcGlwID0oc3RydWN0IGlwaGRyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKzQpOworCisJcGlwLT52ZXJzaW9uICA9IDQ7CisJcGlwLT5paGwgICAgICA9IChzaXplb2Yoc3RydWN0IGlwaGRyKSs0KT4+MjsKKwlwaXAtPnRvcyAgICAgID0gMHhjMDsKKwlwaXAtPmZyYWdfb2ZmID0gaHRvbnMoSVBfREYpOworCXBpcC0+dHRsICAgICAgPSAxOworCXBpcC0+ZGFkZHIgICAgPSBydC0+cnRfZHN0OworCXBpcC0+c2FkZHIgICAgPSBydC0+cnRfc3JjOworCXBpcC0+cHJvdG9jb2wgPSBJUFBST1RPX0lHTVA7CisJcGlwLT50b3RfbGVuICA9IDA7CS8qIGZpbGxlZCBpbiBsYXRlciAqLworCWlwX3NlbGVjdF9pZGVudChwaXAsICZydC0+dS5kc3QsIE5VTEwpOworCSgodTgqKSZwaXBbMV0pWzBdID0gSVBPUFRfUkE7CisJKCh1OCopJnBpcFsxXSlbMV0gPSA0OworCSgodTgqKSZwaXBbMV0pWzJdID0gMDsKKwkoKHU4KikmcGlwWzFdKVszXSA9IDA7CisKKwlwaWcgPShzdHJ1Y3QgaWdtcHYzX3JlcG9ydCAqKXNrYl9wdXQoc2tiLCBzaXplb2YoKnBpZykpOworCXNrYi0+aC5pZ21waCA9IChzdHJ1Y3QgaWdtcGhkciAqKXBpZzsKKwlwaWctPnR5cGUgPSBJR01QVjNfSE9TVF9NRU1CRVJTSElQX1JFUE9SVDsKKwlwaWctPnJlc3YxID0gMDsKKwlwaWctPmNzdW0gPSAwOworCXBpZy0+cmVzdjIgPSAwOworCXBpZy0+bmdyZWMgPSAwOworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyBpbnQgaWdtcHYzX3NlbmRwYWNrKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlwaGRyICpwaXAgPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgaWdtcGhkciAqcGlnID0gc2tiLT5oLmlnbXBoOworCWludCBpcGxlbiwgaWdtcGxlbjsKKworCWlwbGVuID0gc2tiLT50YWlsIC0gKHVuc2lnbmVkIGNoYXIgKilza2ItPm5oLmlwaDsKKwlwaXAtPnRvdF9sZW4gPSBodG9ucyhpcGxlbik7CisJaXBfc2VuZF9jaGVjayhwaXApOworCisJaWdtcGxlbiA9IHNrYi0+dGFpbCAtICh1bnNpZ25lZCBjaGFyICopc2tiLT5oLmlnbXBoOworCXBpZy0+Y3N1bSA9IGlwX2NvbXB1dGVfY3N1bSgodm9pZCAqKXNrYi0+aC5pZ21waCwgaWdtcGxlbik7CisKKwlyZXR1cm4gTkZfSE9PSyhQRl9JTkVULCBORl9JUF9MT0NBTF9PVVQsIHNrYiwgTlVMTCwgc2tiLT5kZXYsCisJCSAgICAgICBkc3Rfb3V0cHV0KTsKK30KKworc3RhdGljIGludCBncmVjX3NpemUoc3RydWN0IGlwX21jX2xpc3QgKnBtYywgaW50IHR5cGUsIGludCBnZGVsLCBpbnQgc2RlbCkKK3sKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBpZ21wdjNfZ3JlYykgKyA0KmlnbXBfc2NvdW50KHBtYyx0eXBlLGdkZWwsc2RlbCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqYWRkX2dyaGVhZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfbWNfbGlzdCAqcG1jLAorCWludCB0eXBlLCBzdHJ1Y3QgaWdtcHYzX2dyZWMgKipwcGdyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwbWMtPmludGVyZmFjZS0+ZGV2OworCXN0cnVjdCBpZ21wdjNfcmVwb3J0ICpwaWg7CisJc3RydWN0IGlnbXB2M19ncmVjICpwZ3I7CisKKwlpZiAoIXNrYikKKwkJc2tiID0gaWdtcHYzX25ld3BhY2soZGV2LCBkZXYtPm10dSk7CisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCXBnciA9IChzdHJ1Y3QgaWdtcHYzX2dyZWMgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpZ21wdjNfZ3JlYykpOworCXBnci0+Z3JlY190eXBlID0gdHlwZTsKKwlwZ3ItPmdyZWNfYXV4d29yZHMgPSAwOworCXBnci0+Z3JlY19uc3JjcyA9IDA7CisJcGdyLT5ncmVjX21jYSA9IHBtYy0+bXVsdGlhZGRyOworCXBpaCA9IChzdHJ1Y3QgaWdtcHYzX3JlcG9ydCAqKXNrYi0+aC5pZ21waDsKKwlwaWgtPm5ncmVjID0gaHRvbnMobnRvaHMocGloLT5uZ3JlYykrMSk7CisJKnBwZ3IgPSBwZ3I7CisJcmV0dXJuIHNrYjsKK30KKworI2RlZmluZSBBVkFJTEFCTEUoc2tiKSAoKHNrYikgPyAoKHNrYiktPmRldiA/IChza2IpLT5kZXYtPm10dSAtIChza2IpLT5sZW4gOiBcCisJc2tiX3RhaWxyb29tKHNrYikpIDogMCkKKworc3RhdGljIHN0cnVjdCBza19idWZmICphZGRfZ3JlYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfbWNfbGlzdCAqcG1jLAorCWludCB0eXBlLCBpbnQgZ2RlbGV0ZWQsIGludCBzZGVsZXRlZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG1jLT5pbnRlcmZhY2UtPmRldjsKKwlzdHJ1Y3QgaWdtcHYzX3JlcG9ydCAqcGloOworCXN0cnVjdCBpZ21wdjNfZ3JlYyAqcGdyID0gTlVMTDsKKwlzdHJ1Y3QgaXBfc2ZfbGlzdCAqcHNmLCAqcHNmX25leHQsICpwc2ZfcHJldiwgKipwc2ZfbGlzdDsKKwlpbnQgc2NvdW50LCBmaXJzdCwgaXNxdWVyeSwgdHJ1bmNhdGU7CisKKwlpZiAocG1jLT5tdWx0aWFkZHIgPT0gSUdNUF9BTExfSE9TVFMpCisJCXJldHVybiBza2I7CisKKwlpc3F1ZXJ5ID0gdHlwZSA9PSBJR01QVjNfTU9ERV9JU19JTkNMVURFIHx8CisJCSAgdHlwZSA9PSBJR01QVjNfTU9ERV9JU19FWENMVURFOworCXRydW5jYXRlID0gdHlwZSA9PSBJR01QVjNfTU9ERV9JU19FWENMVURFIHx8CisJCSAgICB0eXBlID09IElHTVBWM19DSEFOR0VfVE9fRVhDTFVERTsKKworCXBzZl9saXN0ID0gc2RlbGV0ZWQgPyAmcG1jLT50b21iIDogJnBtYy0+c291cmNlczsKKworCWlmICghKnBzZl9saXN0KSB7CisJCWlmICh0eXBlID09IElHTVBWM19BTExPV19ORVdfU09VUkNFUyB8fAorCQkgICAgdHlwZSA9PSBJR01QVjNfQkxPQ0tfT0xEX1NPVVJDRVMpCisJCQlyZXR1cm4gc2tiOworCQlpZiAocG1jLT5jcmNvdW50IHx8IGlzcXVlcnkpIHsKKwkJCS8qIG1ha2Ugc3VyZSB3ZSBoYXZlIHJvb20gZm9yIGdyb3VwIGhlYWRlciBhbmQgYXQKKwkJCSAqIGxlYXN0IG9uZSBzb3VyY2UuCisJCQkgKi8KKwkJCWlmIChza2IgJiYgQVZBSUxBQkxFKHNrYikgPCBzaXplb2Yoc3RydWN0IGlnbXB2M19ncmVjKSsKKwkJCSAgICBzaXplb2YoX191MzIpKSB7CisJCQkJaWdtcHYzX3NlbmRwYWNrKHNrYik7CisJCQkJc2tiID0gTlVMTDsgLyogYWRkX2dyaGVhZCB3aWxsIGdldCBhIG5ldyBvbmUgKi8KKwkJCX0KKwkJCXNrYiA9IGFkZF9ncmhlYWQoc2tiLCBwbWMsIHR5cGUsICZwZ3IpOworCQl9CisJCXJldHVybiBza2I7CisJfQorCXBpaCA9IHNrYiA/IChzdHJ1Y3QgaWdtcHYzX3JlcG9ydCAqKXNrYi0+aC5pZ21waCA6IE5VTEw7CisKKwkvKiBFWCBhbmQgVE9fRVggZ2V0IGEgZnJlc2ggcGFja2V0LCBpZiBuZWVkZWQgKi8KKwlpZiAodHJ1bmNhdGUpIHsKKwkJaWYgKHBpaCAmJiBwaWgtPm5ncmVjICYmCisJCSAgICBBVkFJTEFCTEUoc2tiKSA8IGdyZWNfc2l6ZShwbWMsIHR5cGUsIGdkZWxldGVkLCBzZGVsZXRlZCkpIHsKKwkJCWlmIChza2IpCisJCQkJaWdtcHYzX3NlbmRwYWNrKHNrYik7CisJCQlza2IgPSBpZ21wdjNfbmV3cGFjayhkZXYsIGRldi0+bXR1KTsKKwkJfQorCX0KKwlmaXJzdCA9IDE7CisJc2NvdW50ID0gMDsKKwlwc2ZfcHJldiA9IE5VTEw7CisJZm9yIChwc2Y9KnBzZl9saXN0OyBwc2Y7IHBzZj1wc2ZfbmV4dCkgeworCQl1MzIgKnBzcmM7CisKKwkJcHNmX25leHQgPSBwc2YtPnNmX25leHQ7CisKKwkJaWYgKCFpc19pbihwbWMsIHBzZiwgdHlwZSwgZ2RlbGV0ZWQsIHNkZWxldGVkKSkgeworCQkJcHNmX3ByZXYgPSBwc2Y7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIGNsZWFyIG1hcmtzIG9uIHF1ZXJ5IHJlc3BvbnNlcyAqLworCQlpZiAoaXNxdWVyeSkKKwkJCXBzZi0+c2ZfZ3NyZXNwID0gMDsKKworCQlpZiAoQVZBSUxBQkxFKHNrYikgPCBzaXplb2YodTMyKSArCisJCSAgICBmaXJzdCpzaXplb2Yoc3RydWN0IGlnbXB2M19ncmVjKSkgeworCQkJaWYgKHRydW5jYXRlICYmICFmaXJzdCkKKwkJCQlicmVhazsJIC8qIHRydW5jYXRlIHRoZXNlICovCisJCQlpZiAocGdyKQorCQkJCXBnci0+Z3JlY19uc3JjcyA9IGh0b25zKHNjb3VudCk7CisJCQlpZiAoc2tiKQorCQkJCWlnbXB2M19zZW5kcGFjayhza2IpOworCQkJc2tiID0gaWdtcHYzX25ld3BhY2soZGV2LCBkZXYtPm10dSk7CisJCQlmaXJzdCA9IDE7CisJCQlzY291bnQgPSAwOworCQl9CisJCWlmIChmaXJzdCkgeworCQkJc2tiID0gYWRkX2dyaGVhZChza2IsIHBtYywgdHlwZSwgJnBncik7CisJCQlmaXJzdCA9IDA7CisJCX0KKwkJcHNyYyA9ICh1MzIgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHUzMikpOworCQkqcHNyYyA9IHBzZi0+c2ZfaW5hZGRyOworCQlzY291bnQrKzsKKwkJaWYgKCh0eXBlID09IElHTVBWM19BTExPV19ORVdfU09VUkNFUyB8fAorCQkgICAgIHR5cGUgPT0gSUdNUFYzX0JMT0NLX09MRF9TT1VSQ0VTKSAmJiBwc2YtPnNmX2NyY291bnQpIHsKKwkJCXBzZi0+c2ZfY3Jjb3VudC0tOworCQkJaWYgKChzZGVsZXRlZCB8fCBnZGVsZXRlZCkgJiYgcHNmLT5zZl9jcmNvdW50ID09IDApIHsKKwkJCQlpZiAocHNmX3ByZXYpCisJCQkJCXBzZl9wcmV2LT5zZl9uZXh0ID0gcHNmLT5zZl9uZXh0OworCQkJCWVsc2UKKwkJCQkJKnBzZl9saXN0ID0gcHNmLT5zZl9uZXh0OworCQkJCWtmcmVlKHBzZik7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJcHNmX3ByZXYgPSBwc2Y7CisJfQorCWlmIChwZ3IpCisJCXBnci0+Z3JlY19uc3JjcyA9IGh0b25zKHNjb3VudCk7CisKKwlpZiAoaXNxdWVyeSkKKwkJcG1jLT5nc3F1ZXJ5ID0gMDsJLyogY2xlYXIgcXVlcnkgc3RhdGUgb24gcmVwb3J0ICovCisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIGludCBpZ21wdjNfc2VuZF9yZXBvcnQoc3RydWN0IGluX2RldmljZSAqaW5fZGV2LCBzdHJ1Y3QgaXBfbWNfbGlzdCAqcG1jKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCWludCB0eXBlOworCisJaWYgKCFwbWMpIHsKKwkJcmVhZF9sb2NrKCZpbl9kZXYtPm1jX2xpc3RfbG9jayk7CisJCWZvciAocG1jPWluX2Rldi0+bWNfbGlzdDsgcG1jOyBwbWM9cG1jLT5uZXh0KSB7CisJCQlpZiAocG1jLT5tdWx0aWFkZHIgPT0gSUdNUF9BTExfSE9TVFMpCisJCQkJY29udGludWU7CisJCQlzcGluX2xvY2tfYmgoJnBtYy0+bG9jayk7CisJCQlpZiAocG1jLT5zZmNvdW50W01DQVNUX0VYQ0xVREVdKQorCQkJCXR5cGUgPSBJR01QVjNfTU9ERV9JU19FWENMVURFOworCQkJZWxzZQorCQkJCXR5cGUgPSBJR01QVjNfTU9ERV9JU19JTkNMVURFOworCQkJc2tiID0gYWRkX2dyZWMoc2tiLCBwbWMsIHR5cGUsIDAsIDApOworCQkJc3Bpbl91bmxvY2tfYmgoJnBtYy0+bG9jayk7CisJCX0KKwkJcmVhZF91bmxvY2soJmluX2Rldi0+bWNfbGlzdF9sb2NrKTsKKwl9IGVsc2UgeworCQlzcGluX2xvY2tfYmgoJnBtYy0+bG9jayk7CisJCWlmIChwbWMtPnNmY291bnRbTUNBU1RfRVhDTFVERV0pCisJCQl0eXBlID0gSUdNUFYzX01PREVfSVNfRVhDTFVERTsKKwkJZWxzZQorCQkJdHlwZSA9IElHTVBWM19NT0RFX0lTX0lOQ0xVREU7CisJCXNrYiA9IGFkZF9ncmVjKHNrYiwgcG1jLCB0eXBlLCAwLCAwKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnBtYy0+bG9jayk7CisJfQorCWlmICghc2tiKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaWdtcHYzX3NlbmRwYWNrKHNrYik7Cit9CisKKy8qCisgKiByZW1vdmUgemVyby1jb3VudCBzb3VyY2UgcmVjb3JkcyBmcm9tIGEgc291cmNlIGZpbHRlciBsaXN0CisgKi8KK3N0YXRpYyB2b2lkIGlnbXB2M19jbGVhcl96ZXJvcyhzdHJ1Y3QgaXBfc2ZfbGlzdCAqKnBwc2YpCit7CisJc3RydWN0IGlwX3NmX2xpc3QgKnBzZl9wcmV2LCAqcHNmX25leHQsICpwc2Y7CisKKwlwc2ZfcHJldiA9IE5VTEw7CisJZm9yIChwc2Y9KnBwc2Y7IHBzZjsgcHNmID0gcHNmX25leHQpIHsKKwkJcHNmX25leHQgPSBwc2YtPnNmX25leHQ7CisJCWlmIChwc2YtPnNmX2NyY291bnQgPT0gMCkgeworCQkJaWYgKHBzZl9wcmV2KQorCQkJCXBzZl9wcmV2LT5zZl9uZXh0ID0gcHNmLT5zZl9uZXh0OworCQkJZWxzZQorCQkJCSpwcHNmID0gcHNmLT5zZl9uZXh0OworCQkJa2ZyZWUocHNmKTsKKwkJfSBlbHNlCisJCQlwc2ZfcHJldiA9IHBzZjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlnbXB2M19zZW5kX2NyKHN0cnVjdCBpbl9kZXZpY2UgKmluX2RldikKK3sKKwlzdHJ1Y3QgaXBfbWNfbGlzdCAqcG1jLCAqcG1jX3ByZXYsICpwbWNfbmV4dDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlpbnQgdHlwZSwgZHR5cGU7CisKKwlyZWFkX2xvY2soJmluX2Rldi0+bWNfbGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJmluX2Rldi0+bWNfdG9tYl9sb2NrKTsKKworCS8qIGRlbGV0ZWQgTUNBJ3MgKi8KKwlwbWNfcHJldiA9IE5VTEw7CisJZm9yIChwbWM9aW5fZGV2LT5tY190b21iOyBwbWM7IHBtYz1wbWNfbmV4dCkgeworCQlwbWNfbmV4dCA9IHBtYy0+bmV4dDsKKwkJaWYgKHBtYy0+c2Ztb2RlID09IE1DQVNUX0lOQ0xVREUpIHsKKwkJCXR5cGUgPSBJR01QVjNfQkxPQ0tfT0xEX1NPVVJDRVM7CisJCQlkdHlwZSA9IElHTVBWM19CTE9DS19PTERfU09VUkNFUzsKKwkJCXNrYiA9IGFkZF9ncmVjKHNrYiwgcG1jLCB0eXBlLCAxLCAwKTsKKwkJCXNrYiA9IGFkZF9ncmVjKHNrYiwgcG1jLCBkdHlwZSwgMSwgMSk7CisJCX0KKwkJaWYgKHBtYy0+Y3Jjb3VudCkgeworCQkJcG1jLT5jcmNvdW50LS07CisJCQlpZiAocG1jLT5zZm1vZGUgPT0gTUNBU1RfRVhDTFVERSkgeworCQkJCXR5cGUgPSBJR01QVjNfQ0hBTkdFX1RPX0lOQ0xVREU7CisJCQkJc2tiID0gYWRkX2dyZWMoc2tiLCBwbWMsIHR5cGUsIDEsIDApOworCQkJfQorCQkJaWYgKHBtYy0+Y3Jjb3VudCA9PSAwKSB7CisJCQkJaWdtcHYzX2NsZWFyX3plcm9zKCZwbWMtPnRvbWIpOworCQkJCWlnbXB2M19jbGVhcl96ZXJvcygmcG1jLT5zb3VyY2VzKTsKKwkJCX0KKwkJfQorCQlpZiAocG1jLT5jcmNvdW50ID09IDAgJiYgIXBtYy0+dG9tYiAmJiAhcG1jLT5zb3VyY2VzKSB7CisJCQlpZiAocG1jX3ByZXYpCisJCQkJcG1jX3ByZXYtPm5leHQgPSBwbWNfbmV4dDsKKwkJCWVsc2UKKwkJCQlpbl9kZXYtPm1jX3RvbWIgPSBwbWNfbmV4dDsKKwkJCWluX2Rldl9wdXQocG1jLT5pbnRlcmZhY2UpOworCQkJa2ZyZWUocG1jKTsKKwkJfSBlbHNlCisJCQlwbWNfcHJldiA9IHBtYzsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmluX2Rldi0+bWNfdG9tYl9sb2NrKTsKKworCS8qIGNoYW5nZSByZWNzICovCisJZm9yIChwbWM9aW5fZGV2LT5tY19saXN0OyBwbWM7IHBtYz1wbWMtPm5leHQpIHsKKwkJc3Bpbl9sb2NrX2JoKCZwbWMtPmxvY2spOworCQlpZiAocG1jLT5zZmNvdW50W01DQVNUX0VYQ0xVREVdKSB7CisJCQl0eXBlID0gSUdNUFYzX0JMT0NLX09MRF9TT1VSQ0VTOworCQkJZHR5cGUgPSBJR01QVjNfQUxMT1dfTkVXX1NPVVJDRVM7CisJCX0gZWxzZSB7CisJCQl0eXBlID0gSUdNUFYzX0FMTE9XX05FV19TT1VSQ0VTOworCQkJZHR5cGUgPSBJR01QVjNfQkxPQ0tfT0xEX1NPVVJDRVM7CisJCX0KKwkJc2tiID0gYWRkX2dyZWMoc2tiLCBwbWMsIHR5cGUsIDAsIDApOworCQlza2IgPSBhZGRfZ3JlYyhza2IsIHBtYywgZHR5cGUsIDAsIDEpOwkvKiBkZWxldGVkIHNvdXJjZXMgKi8KKworCQkvKiBmaWx0ZXIgbW9kZSBjaGFuZ2VzICovCisJCWlmIChwbWMtPmNyY291bnQpIHsKKwkJCXBtYy0+Y3Jjb3VudC0tOworCQkJaWYgKHBtYy0+c2Ztb2RlID09IE1DQVNUX0VYQ0xVREUpCisJCQkJdHlwZSA9IElHTVBWM19DSEFOR0VfVE9fRVhDTFVERTsKKwkJCWVsc2UKKwkJCQl0eXBlID0gSUdNUFYzX0NIQU5HRV9UT19JTkNMVURFOworCQkJc2tiID0gYWRkX2dyZWMoc2tiLCBwbWMsIHR5cGUsIDAsIDApOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZwbWMtPmxvY2spOworCX0KKwlyZWFkX3VubG9jaygmaW5fZGV2LT5tY19saXN0X2xvY2spOworCisJaWYgKCFza2IpCisJCXJldHVybjsKKwkodm9pZCkgaWdtcHYzX3NlbmRwYWNrKHNrYik7Cit9CisKK3N0YXRpYyBpbnQgaWdtcF9zZW5kX3JlcG9ydChzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYsIHN0cnVjdCBpcF9tY19saXN0ICpwbWMsCisJaW50IHR5cGUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwlzdHJ1Y3QgaWdtcGhkciAqaWg7CisJc3RydWN0IHJ0YWJsZSAqcnQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGluX2Rldi0+ZGV2OworCXUzMglncm91cCA9IHBtYyA/IHBtYy0+bXVsdGlhZGRyIDogMDsKKwl1MzIJZHN0OworCisJaWYgKHR5cGUgPT0gSUdNUFYzX0hPU1RfTUVNQkVSU0hJUF9SRVBPUlQpCisJCXJldHVybiBpZ21wdjNfc2VuZF9yZXBvcnQoaW5fZGV2LCBwbWMpOworCWVsc2UgaWYgKHR5cGUgPT0gSUdNUF9IT1NUX0xFQVZFX01FU1NBR0UpCisJCWRzdCA9IElHTVBfQUxMX1JPVVRFUjsKKwllbHNlCisJCWRzdCA9IGdyb3VwOworCisJeworCQlzdHJ1Y3QgZmxvd2kgZmwgPSB7IC5vaWYgPSBkZXYtPmlmaW5kZXgsCisJCQkJICAgIC5ubF91ID0geyAuaXA0X3UgPSB7IC5kYWRkciA9IGRzdCB9IH0sCisJCQkJICAgIC5wcm90byA9IElQUFJPVE9fSUdNUCB9OworCQlpZiAoaXBfcm91dGVfb3V0cHV0X2tleSgmcnQsICZmbCkpCisJCQlyZXR1cm4gLTE7CisJfQorCWlmIChydC0+cnRfc3JjID09IDApIHsKKwkJaXBfcnRfcHV0KHJ0KTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNrYj1hbGxvY19za2IoSUdNUF9TSVpFK0xMX1JFU0VSVkVEX1NQQUNFKGRldiksIEdGUF9BVE9NSUMpOworCWlmIChza2IgPT0gTlVMTCkgeworCQlpcF9ydF9wdXQocnQpOworCQlyZXR1cm4gLTE7CisJfQorCisJc2tiLT5kc3QgPSAmcnQtPnUuZHN0OworCisJc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKKworCXNrYi0+bmguaXBoID0gaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSs0KTsKKworCWlwaC0+dmVyc2lvbiAgPSA0OworCWlwaC0+aWhsICAgICAgPSAoc2l6ZW9mKHN0cnVjdCBpcGhkcikrNCk+PjI7CisJaXBoLT50b3MgICAgICA9IDB4YzA7CisJaXBoLT5mcmFnX29mZiA9IGh0b25zKElQX0RGKTsKKwlpcGgtPnR0bCAgICAgID0gMTsKKwlpcGgtPmRhZGRyICAgID0gZHN0OworCWlwaC0+c2FkZHIgICAgPSBydC0+cnRfc3JjOworCWlwaC0+cHJvdG9jb2wgPSBJUFBST1RPX0lHTVA7CisJaXBoLT50b3RfbGVuICA9IGh0b25zKElHTVBfU0laRSk7CisJaXBfc2VsZWN0X2lkZW50KGlwaCwgJnJ0LT51LmRzdCwgTlVMTCk7CisJKCh1OCopJmlwaFsxXSlbMF0gPSBJUE9QVF9SQTsKKwkoKHU4KikmaXBoWzFdKVsxXSA9IDQ7CisJKCh1OCopJmlwaFsxXSlbMl0gPSAwOworCSgodTgqKSZpcGhbMV0pWzNdID0gMDsKKwlpcF9zZW5kX2NoZWNrKGlwaCk7CisKKwlpaCA9IChzdHJ1Y3QgaWdtcGhkciAqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGlnbXBoZHIpKTsKKwlpaC0+dHlwZT10eXBlOworCWloLT5jb2RlPTA7CisJaWgtPmNzdW09MDsKKwlpaC0+Z3JvdXA9Z3JvdXA7CisJaWgtPmNzdW09aXBfY29tcHV0ZV9jc3VtKCh2b2lkICopaWgsIHNpemVvZihzdHJ1Y3QgaWdtcGhkcikpOworCisJcmV0dXJuIE5GX0hPT0soUEZfSU5FVCwgTkZfSVBfTE9DQUxfT1VULCBza2IsIE5VTEwsIHJ0LT51LmRzdC5kZXYsCisJCSAgICAgICBkc3Rfb3V0cHV0KTsKK30KKworc3RhdGljIHZvaWQgaWdtcF9ncV90aW1lcl9leHBpcmUodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiA9IChzdHJ1Y3QgaW5fZGV2aWNlICopZGF0YTsKKworCWluX2Rldi0+bXJfZ3FfcnVubmluZyA9IDA7CisJaWdtcHYzX3NlbmRfcmVwb3J0KGluX2RldiwgTlVMTCk7CisJX19pbl9kZXZfcHV0KGluX2Rldik7Cit9CisKK3N0YXRpYyB2b2lkIGlnbXBfaWZjX3RpbWVyX2V4cGlyZSh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gKHN0cnVjdCBpbl9kZXZpY2UgKilkYXRhOworCisJaWdtcHYzX3NlbmRfY3IoaW5fZGV2KTsKKwlpZiAoaW5fZGV2LT5tcl9pZmNfY291bnQpIHsKKwkJaW5fZGV2LT5tcl9pZmNfY291bnQtLTsKKwkJaWdtcF9pZmNfc3RhcnRfdGltZXIoaW5fZGV2LCBJR01QX1Vuc29saWNpdGVkX1JlcG9ydF9JbnRlcnZhbCk7CisJfQorCV9faW5fZGV2X3B1dChpbl9kZXYpOworfQorCitzdGF0aWMgdm9pZCBpZ21wX2lmY19ldmVudChzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYpCit7CisJaWYgKElHTVBfVjFfU0VFTihpbl9kZXYpIHx8IElHTVBfVjJfU0VFTihpbl9kZXYpKQorCQlyZXR1cm47CisJaW5fZGV2LT5tcl9pZmNfY291bnQgPSBpbl9kZXYtPm1yX3FydiA/IGluX2Rldi0+bXJfcXJ2IDogCisJCUlHTVBfVW5zb2xpY2l0ZWRfUmVwb3J0X0NvdW50OworCWlnbXBfaWZjX3N0YXJ0X3RpbWVyKGluX2RldiwgMSk7Cit9CisKKworc3RhdGljIHZvaWQgaWdtcF90aW1lcl9leHBpcmUodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBpcF9tY19saXN0ICppbT0oc3RydWN0IGlwX21jX2xpc3QgKilkYXRhOworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiA9IGltLT5pbnRlcmZhY2U7CisKKwlzcGluX2xvY2soJmltLT5sb2NrKTsKKwlpbS0+dG1fcnVubmluZz0wOworCisJaWYgKGltLT51bnNvbGljaXRfY291bnQpIHsKKwkJaW0tPnVuc29saWNpdF9jb3VudC0tOworCQlpZ21wX3N0YXJ0X3RpbWVyKGltLCBJR01QX1Vuc29saWNpdGVkX1JlcG9ydF9JbnRlcnZhbCk7CisJfQorCWltLT5yZXBvcnRlciA9IDE7CisJc3Bpbl91bmxvY2soJmltLT5sb2NrKTsKKworCWlmIChJR01QX1YxX1NFRU4oaW5fZGV2KSkKKwkJaWdtcF9zZW5kX3JlcG9ydChpbl9kZXYsIGltLCBJR01QX0hPU1RfTUVNQkVSU0hJUF9SRVBPUlQpOworCWVsc2UgaWYgKElHTVBfVjJfU0VFTihpbl9kZXYpKQorCQlpZ21wX3NlbmRfcmVwb3J0KGluX2RldiwgaW0sIElHTVBWMl9IT1NUX01FTUJFUlNISVBfUkVQT1JUKTsKKwllbHNlCisJCWlnbXBfc2VuZF9yZXBvcnQoaW5fZGV2LCBpbSwgSUdNUFYzX0hPU1RfTUVNQkVSU0hJUF9SRVBPUlQpOworCisJaXBfbWFfcHV0KGltKTsKK30KKworc3RhdGljIHZvaWQgaWdtcF9tYXJrc291cmNlcyhzdHJ1Y3QgaXBfbWNfbGlzdCAqcG1jLCBpbnQgbnNyY3MsIF9fdTMyICpzcmNzKQoreworCXN0cnVjdCBpcF9zZl9saXN0ICpwc2Y7CisJaW50IGksIHNjb3VudDsKKworCXNjb3VudCA9IDA7CisJZm9yIChwc2Y9cG1jLT5zb3VyY2VzOyBwc2Y7IHBzZj1wc2YtPnNmX25leHQpIHsKKwkJaWYgKHNjb3VudCA9PSBuc3JjcykKKwkJCWJyZWFrOworCQlmb3IgKGk9MDsgaTxuc3JjczsgaSsrKQorCQkJaWYgKHNyY3NbaV0gPT0gcHNmLT5zZl9pbmFkZHIpIHsKKwkJCQlwc2YtPnNmX2dzcmVzcCA9IDE7CisJCQkJc2NvdW50Kys7CisJCQkJYnJlYWs7CisJCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBpZ21wX2hlYXJkX3JlcG9ydChzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYsIHUzMiBncm91cCkKK3sKKwlzdHJ1Y3QgaXBfbWNfbGlzdCAqaW07CisKKwkvKiBUaW1lcnMgYXJlIG9ubHkgc2V0IGZvciBub24tbG9jYWwgZ3JvdXBzICovCisKKwlpZiAoZ3JvdXAgPT0gSUdNUF9BTExfSE9TVFMpCisJCXJldHVybjsKKworCXJlYWRfbG9jaygmaW5fZGV2LT5tY19saXN0X2xvY2spOworCWZvciAoaW09aW5fZGV2LT5tY19saXN0OyBpbSE9TlVMTDsgaW09aW0tPm5leHQpIHsKKwkJaWYgKGltLT5tdWx0aWFkZHIgPT0gZ3JvdXApIHsKKwkJCWlnbXBfc3RvcF90aW1lcihpbSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZWFkX3VubG9jaygmaW5fZGV2LT5tY19saXN0X2xvY2spOworfQorCitzdGF0aWMgdm9pZCBpZ21wX2hlYXJkX3F1ZXJ5KHN0cnVjdCBpbl9kZXZpY2UgKmluX2Rldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwlpbnQgbGVuKQoreworCXN0cnVjdCBpZ21waGRyIAkJKmloID0gc2tiLT5oLmlnbXBoOworCXN0cnVjdCBpZ21wdjNfcXVlcnkgKmloMyA9IChzdHJ1Y3QgaWdtcHYzX3F1ZXJ5ICopaWg7CisJc3RydWN0IGlwX21jX2xpc3QJKmltOworCXUzMgkJCWdyb3VwID0gaWgtPmdyb3VwOworCWludAkJCW1heF9kZWxheTsKKwlpbnQJCQltYXJrID0gMDsKKworCisJaWYgKGxlbiA9PSA4KSB7CisJCWlmIChpaC0+Y29kZSA9PSAwKSB7CisJCQkvKiBBbGFzLCBvbGQgdjEgcm91dGVyIHByZXNlbnRzIGhlcmUuICovCisJCisJCQltYXhfZGVsYXkgPSBJR01QX1F1ZXJ5X1Jlc3BvbnNlX0ludGVydmFsOworCQkJaW5fZGV2LT5tcl92MV9zZWVuID0gamlmZmllcyArCisJCQkJSUdNUF9WMV9Sb3V0ZXJfUHJlc2VudF9UaW1lb3V0OworCQkJZ3JvdXAgPSAwOworCQl9IGVsc2UgeworCQkJLyogdjIgcm91dGVyIHByZXNlbnQgKi8KKwkJCW1heF9kZWxheSA9IGloLT5jb2RlKihIWi9JR01QX1RJTUVSX1NDQUxFKTsKKwkJCWluX2Rldi0+bXJfdjJfc2VlbiA9IGppZmZpZXMgKworCQkJCUlHTVBfVjJfUm91dGVyX1ByZXNlbnRfVGltZW91dDsKKwkJfQorCQkvKiBjYW5jZWwgdGhlIGludGVyZmFjZSBjaGFuZ2UgdGltZXIgKi8KKwkJaW5fZGV2LT5tcl9pZmNfY291bnQgPSAwOworCQlpZiAoZGVsX3RpbWVyKCZpbl9kZXYtPm1yX2lmY190aW1lcikpCisJCQlfX2luX2Rldl9wdXQoaW5fZGV2KTsKKwkJLyogY2xlYXIgZGVsZXRlZCByZXBvcnQgaXRlbXMgKi8KKwkJaWdtcHYzX2NsZWFyX2RlbHJlYyhpbl9kZXYpOworCX0gZWxzZSBpZiAobGVuIDwgMTIpIHsKKwkJcmV0dXJuOwkvKiBpZ25vcmUgYm9ndXMgcGFja2V0OyBmcmVlZCBieSBjYWxsZXIgKi8KKwl9IGVsc2UgeyAvKiB2MyAqLworCQlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGlnbXB2M19xdWVyeSkpKQorCQkJcmV0dXJuOworCQkKKwkJaWgzID0gKHN0cnVjdCBpZ21wdjNfcXVlcnkgKikgc2tiLT5oLnJhdzsKKwkJaWYgKGloMy0+bnNyY3MpIHsKKwkJCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaWdtcHYzX3F1ZXJ5KSAKKwkJCQkJICAgKyBudG9ocyhpaDMtPm5zcmNzKSpzaXplb2YoX191MzIpKSkKKwkJCQlyZXR1cm47CisJCQlpaDMgPSAoc3RydWN0IGlnbXB2M19xdWVyeSAqKSBza2ItPmgucmF3OworCQl9CisKKwkJbWF4X2RlbGF5ID0gSUdNUFYzX01SQyhpaDMtPmNvZGUpKihIWi9JR01QX1RJTUVSX1NDQUxFKTsKKwkJaWYgKCFtYXhfZGVsYXkpCisJCQltYXhfZGVsYXkgPSAxOwkvKiBjYW4ndCBtb2Qgdy8gMCAqLworCQlpbl9kZXYtPm1yX21heGRlbGF5ID0gbWF4X2RlbGF5OworCQlpZiAoaWgzLT5xcnYpCisJCQlpbl9kZXYtPm1yX3FydiA9IGloMy0+cXJ2OworCQlpZiAoIWdyb3VwKSB7IC8qIGdlbmVyYWwgcXVlcnkgKi8KKwkJCWlmIChpaDMtPm5zcmNzKQorCQkJCXJldHVybjsJLyogbm8gc291cmNlcyBhbGxvd2VkICovCisJCQlpZ21wX2dxX3N0YXJ0X3RpbWVyKGluX2Rldik7CisJCQlyZXR1cm47CisJCX0KKwkJLyogbWFyayBzb3VyY2VzIHRvIGluY2x1ZGUsIGlmIGdyb3VwICYgc291cmNlLXNwZWNpZmljICovCisJCW1hcmsgPSBpaDMtPm5zcmNzICE9IDA7CisJfQorCisJLyoKKwkgKiAtIFN0YXJ0IHRoZSB0aW1lcnMgaW4gYWxsIG9mIG91ciBtZW1iZXJzaGlwIHJlY29yZHMKKwkgKiAgIHRoYXQgdGhlIHF1ZXJ5IGFwcGxpZXMgdG8gZm9yIHRoZSBpbnRlcmZhY2Ugb24KKwkgKiAgIHdoaWNoIHRoZSBxdWVyeSBhcnJpdmVkIGV4Y2wuIHRob3NlIHRoYXQgYmVsb25nCisJICogICB0byBhICJsb2NhbCIgZ3JvdXAgKDIyNC4wLjAuWCkKKwkgKiAtIEZvciB0aW1lcnMgYWxyZWFkeSBydW5uaW5nIGNoZWNrIGlmIHRoZXkgbmVlZCB0bworCSAqICAgYmUgcmVzZXQuCisJICogLSBVc2UgdGhlIGlnbXAtPmlnbXBfY29kZSBmaWVsZCBhcyB0aGUgbWF4aW11bQorCSAqICAgZGVsYXkgcG9zc2libGUKKwkgKi8KKwlyZWFkX2xvY2soJmluX2Rldi0+bWNfbGlzdF9sb2NrKTsKKwlmb3IgKGltPWluX2Rldi0+bWNfbGlzdDsgaW0hPU5VTEw7IGltPWltLT5uZXh0KSB7CisJCWlmIChncm91cCAmJiBncm91cCAhPSBpbS0+bXVsdGlhZGRyKQorCQkJY29udGludWU7CisJCWlmIChpbS0+bXVsdGlhZGRyID09IElHTVBfQUxMX0hPU1RTKQorCQkJY29udGludWU7CisJCXNwaW5fbG9ja19iaCgmaW0tPmxvY2spOworCQlpZiAoaW0tPnRtX3J1bm5pbmcpCisJCQlpbS0+Z3NxdWVyeSA9IGltLT5nc3F1ZXJ5ICYmIG1hcms7CisJCWVsc2UKKwkJCWltLT5nc3F1ZXJ5ID0gbWFyazsKKwkJaWYgKGltLT5nc3F1ZXJ5KQorCQkJaWdtcF9tYXJrc291cmNlcyhpbSwgbnRvaHMoaWgzLT5uc3JjcyksIGloMy0+c3Jjcyk7CisJCXNwaW5fdW5sb2NrX2JoKCZpbS0+bG9jayk7CisJCWlnbXBfbW9kX3RpbWVyKGltLCBtYXhfZGVsYXkpOworCX0KKwlyZWFkX3VubG9jaygmaW5fZGV2LT5tY19saXN0X2xvY2spOworfQorCitpbnQgaWdtcF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKiBUaGlzIGJhc2ljYWxseSBmb2xsb3dzIHRoZSBzcGVjIGxpbmUgYnkgbGluZSAtLSBzZWUgUkZDMTExMiAqLworCXN0cnVjdCBpZ21waGRyICppaDsKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBpbl9kZXZfZ2V0KHNrYi0+ZGV2KTsKKwlpbnQgbGVuID0gc2tiLT5sZW47CisKKwlpZiAoaW5fZGV2PT1OVUxMKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGlnbXBoZHIpKSB8fCAKKwkgICAgKHUxNiljc3VtX2ZvbGQoc2tiX2NoZWNrc3VtKHNrYiwgMCwgbGVuLCAwKSkpIHsKKwkJaW5fZGV2X3B1dChpbl9kZXYpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWggPSBza2ItPmguaWdtcGg7CisJc3dpdGNoIChpaC0+dHlwZSkgeworCWNhc2UgSUdNUF9IT1NUX01FTUJFUlNISVBfUVVFUlk6CisJCWlnbXBfaGVhcmRfcXVlcnkoaW5fZGV2LCBza2IsIGxlbik7CisJCWJyZWFrOworCWNhc2UgSUdNUF9IT1NUX01FTUJFUlNISVBfUkVQT1JUOgorCWNhc2UgSUdNUFYyX0hPU1RfTUVNQkVSU0hJUF9SRVBPUlQ6CisJY2FzZSBJR01QVjNfSE9TVF9NRU1CRVJTSElQX1JFUE9SVDoKKwkJLyogSXMgaXQgb3VyIHJlcG9ydCBsb29wZWQgYmFjaz8gKi8KKwkJaWYgKCgoc3RydWN0IHJ0YWJsZSopc2tiLT5kc3QpLT5mbC5paWYgPT0gMCkKKwkJCWJyZWFrOworCQlpZ21wX2hlYXJkX3JlcG9ydChpbl9kZXYsIGloLT5ncm91cCk7CisJCWJyZWFrOworCWNhc2UgSUdNUF9QSU06CisjaWZkZWYgQ09ORklHX0lQX1BJTVNNX1YxCisJCWluX2Rldl9wdXQoaW5fZGV2KTsKKwkJcmV0dXJuIHBpbV9yY3ZfdjEoc2tiKTsKKyNlbmRpZgorCWNhc2UgSUdNUF9EVk1SUDoKKwljYXNlIElHTVBfVFJBQ0U6CisJY2FzZSBJR01QX0hPU1RfTEVBVkVfTUVTU0FHRToKKwljYXNlIElHTVBfTVRSQUNFOgorCWNhc2UgSUdNUF9NVFJBQ0VfUkVTUDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTkVUREVCVUcocHJpbnRrKEtFUk5fREVCVUcgIk5ldyBJR01QIHR5cGU9JWQsIHdoeSB3ZSBkbyBub3Qga25vdyBhYm91dCBpdD9cbiIsIGloLT50eXBlKSk7CisJfQorCWluX2Rldl9wdXQoaW5fZGV2KTsKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCisKKworLyoKKyAqCUFkZCBhIGZpbHRlciB0byBhIGRldmljZQorICovCisKK3N0YXRpYyB2b2lkIGlwX21jX2ZpbHRlcl9hZGQoc3RydWN0IGluX2RldmljZSAqaW5fZGV2LCB1MzIgYWRkcikKK3sKKwljaGFyIGJ1ZltNQVhfQUREUl9MRU5dOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpbl9kZXYtPmRldjsKKworCS8qIENoZWNraW5nIGZvciBJRkZfTVVMVElDQVNUIGhlcmUgaXMgV1JPTkctV1JPTkctV1JPTkcuCisJICAgV2Ugd2lsbCBnZXQgbXVsdGljYXN0IHRva2VuIGxlYWthZ2UsIHdoZW4gSUZGX01VTFRJQ0FTVAorCSAgIGlzIGNoYW5nZWQuIFRoaXMgY2hlY2sgc2hvdWxkIGJlIGRvbmUgaW4gZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QKKwkgICByb3V0aW5lLiBTb21ldGhpbmcgc29ydCBvZjoKKwkgICBpZiAoZGV2LT5tY19saXN0ICYmIGRldi0+ZmxhZ3MmSUZGX01VTFRJQ0FTVCkgeyBkbyBpdDsgfQorCSAgIC0tQU5LCisJICAgKi8KKwlpZiAoYXJwX21jX21hcChhZGRyLCBidWYsIGRldiwgMCkgPT0gMCkKKwkJZGV2X21jX2FkZChkZXYsYnVmLGRldi0+YWRkcl9sZW4sMCk7Cit9CisKKy8qCisgKglSZW1vdmUgYSBmaWx0ZXIgZnJvbSBhIGRldmljZQorICovCisKK3N0YXRpYyB2b2lkIGlwX21jX2ZpbHRlcl9kZWwoc3RydWN0IGluX2RldmljZSAqaW5fZGV2LCB1MzIgYWRkcikKK3sKKwljaGFyIGJ1ZltNQVhfQUREUl9MRU5dOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpbl9kZXYtPmRldjsKKworCWlmIChhcnBfbWNfbWFwKGFkZHIsIGJ1ZiwgZGV2LCAwKSA9PSAwKQorCQlkZXZfbWNfZGVsZXRlKGRldixidWYsZGV2LT5hZGRyX2xlbiwwKTsKK30KKworI2lmZGVmIENPTkZJR19JUF9NVUxUSUNBU1QKKy8qCisgKiBkZWxldGVkIGlwX21jX2xpc3QgbWFuaXB1bGF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIGlnbXB2M19hZGRfZGVscmVjKHN0cnVjdCBpbl9kZXZpY2UgKmluX2Rldiwgc3RydWN0IGlwX21jX2xpc3QgKmltKQoreworCXN0cnVjdCBpcF9tY19saXN0ICpwbWM7CisKKwkvKiB0aGlzIGlzIGFuICJpcF9tY19saXN0IiBmb3IgY29udmVuaWVuY2U7IG9ubHkgdGhlIGZpZWxkcyBiZWxvdworCSAqIGFyZSBhY3R1YWxseSB1c2VkLiBJbiBwYXJ0aWN1bGFyLCB0aGUgcmVmY250IGFuZCB1c2VycyBhcmUgbm90CisJICogdXNlZCBmb3IgbWFuYWdlbWVudCBvZiB0aGUgZGVsZXRlIGxpc3QuIFVzaW5nIHRoZSBzYW1lIHN0cnVjdHVyZQorCSAqIGZvciBkZWxldGVkIGl0ZW1zIGFsbG93cyBjaGFuZ2UgcmVwb3J0cyB0byB1c2UgY29tbW9uIGNvZGUgd2l0aAorCSAqIG5vbi1kZWxldGVkIG9yIHF1ZXJ5LXJlc3BvbnNlIE1DQSdzLgorCSAqLworCXBtYyA9IChzdHJ1Y3QgaXBfbWNfbGlzdCAqKWttYWxsb2Moc2l6ZW9mKCpwbWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBtYykKKwkJcmV0dXJuOworCW1lbXNldChwbWMsIDAsIHNpemVvZigqcG1jKSk7CisJc3Bpbl9sb2NrX2JoKCZpbS0+bG9jayk7CisJcG1jLT5pbnRlcmZhY2UgPSBpbS0+aW50ZXJmYWNlOworCWluX2Rldl9ob2xkKGluX2Rldik7CisJcG1jLT5tdWx0aWFkZHIgPSBpbS0+bXVsdGlhZGRyOworCXBtYy0+Y3Jjb3VudCA9IGluX2Rldi0+bXJfcXJ2ID8gaW5fZGV2LT5tcl9xcnYgOgorCQlJR01QX1Vuc29saWNpdGVkX1JlcG9ydF9Db3VudDsKKwlwbWMtPnNmbW9kZSA9IGltLT5zZm1vZGU7CisJaWYgKHBtYy0+c2Ztb2RlID09IE1DQVNUX0lOQ0xVREUpIHsKKwkJc3RydWN0IGlwX3NmX2xpc3QgKnBzZjsKKworCQlwbWMtPnRvbWIgPSBpbS0+dG9tYjsKKwkJcG1jLT5zb3VyY2VzID0gaW0tPnNvdXJjZXM7CisJCWltLT50b21iID0gaW0tPnNvdXJjZXMgPSBOVUxMOworCQlmb3IgKHBzZj1wbWMtPnNvdXJjZXM7IHBzZjsgcHNmPXBzZi0+c2ZfbmV4dCkKKwkJCXBzZi0+c2ZfY3Jjb3VudCA9IHBtYy0+Y3Jjb3VudDsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmltLT5sb2NrKTsKKworCXNwaW5fbG9ja19iaCgmaW5fZGV2LT5tY190b21iX2xvY2spOworCXBtYy0+bmV4dCA9IGluX2Rldi0+bWNfdG9tYjsKKwlpbl9kZXYtPm1jX3RvbWIgPSBwbWM7CisJc3Bpbl91bmxvY2tfYmgoJmluX2Rldi0+bWNfdG9tYl9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgaWdtcHYzX2RlbF9kZWxyZWMoc3RydWN0IGluX2RldmljZSAqaW5fZGV2LCBfX3UzMiBtdWx0aWFkZHIpCit7CisJc3RydWN0IGlwX21jX2xpc3QgKnBtYywgKnBtY19wcmV2OworCXN0cnVjdCBpcF9zZl9saXN0ICpwc2YsICpwc2ZfbmV4dDsKKworCXNwaW5fbG9ja19iaCgmaW5fZGV2LT5tY190b21iX2xvY2spOworCXBtY19wcmV2ID0gTlVMTDsKKwlmb3IgKHBtYz1pbl9kZXYtPm1jX3RvbWI7IHBtYzsgcG1jPXBtYy0+bmV4dCkgeworCQlpZiAocG1jLT5tdWx0aWFkZHIgPT0gbXVsdGlhZGRyKQorCQkJYnJlYWs7CisJCXBtY19wcmV2ID0gcG1jOworCX0KKwlpZiAocG1jKSB7CisJCWlmIChwbWNfcHJldikKKwkJCXBtY19wcmV2LT5uZXh0ID0gcG1jLT5uZXh0OworCQllbHNlCisJCQlpbl9kZXYtPm1jX3RvbWIgPSBwbWMtPm5leHQ7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZpbl9kZXYtPm1jX3RvbWJfbG9jayk7CisJaWYgKHBtYykgeworCQlmb3IgKHBzZj1wbWMtPnRvbWI7IHBzZjsgcHNmPXBzZl9uZXh0KSB7CisJCQlwc2ZfbmV4dCA9IHBzZi0+c2ZfbmV4dDsKKwkJCWtmcmVlKHBzZik7CisJCX0KKwkJaW5fZGV2X3B1dChwbWMtPmludGVyZmFjZSk7CisJCWtmcmVlKHBtYyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpZ21wdjNfY2xlYXJfZGVscmVjKHN0cnVjdCBpbl9kZXZpY2UgKmluX2RldikKK3sKKwlzdHJ1Y3QgaXBfbWNfbGlzdCAqcG1jLCAqbmV4dHBtYzsKKworCXNwaW5fbG9ja19iaCgmaW5fZGV2LT5tY190b21iX2xvY2spOworCXBtYyA9IGluX2Rldi0+bWNfdG9tYjsKKwlpbl9kZXYtPm1jX3RvbWIgPSBOVUxMOworCXNwaW5fdW5sb2NrX2JoKCZpbl9kZXYtPm1jX3RvbWJfbG9jayk7CisKKwlmb3IgKDsgcG1jOyBwbWMgPSBuZXh0cG1jKSB7CisJCW5leHRwbWMgPSBwbWMtPm5leHQ7CisJCWlwX21jX2NsZWFyX3NyYyhwbWMpOworCQlpbl9kZXZfcHV0KHBtYy0+aW50ZXJmYWNlKTsKKwkJa2ZyZWUocG1jKTsKKwl9CisJLyogY2xlYXIgZGVhZCBzb3VyY2VzLCB0b28gKi8KKwlyZWFkX2xvY2soJmluX2Rldi0+bWNfbGlzdF9sb2NrKTsKKwlmb3IgKHBtYz1pbl9kZXYtPm1jX2xpc3Q7IHBtYzsgcG1jPXBtYy0+bmV4dCkgeworCQlzdHJ1Y3QgaXBfc2ZfbGlzdCAqcHNmLCAqcHNmX25leHQ7CisKKwkJc3Bpbl9sb2NrX2JoKCZwbWMtPmxvY2spOworCQlwc2YgPSBwbWMtPnRvbWI7CisJCXBtYy0+dG9tYiA9IE5VTEw7CisJCXNwaW5fdW5sb2NrX2JoKCZwbWMtPmxvY2spOworCQlmb3IgKDsgcHNmOyBwc2Y9cHNmX25leHQpIHsKKwkJCXBzZl9uZXh0ID0gcHNmLT5zZl9uZXh0OworCQkJa2ZyZWUocHNmKTsKKwkJfQorCX0KKwlyZWFkX3VubG9jaygmaW5fZGV2LT5tY19saXN0X2xvY2spOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGlnbXBfZ3JvdXBfZHJvcHBlZChzdHJ1Y3QgaXBfbWNfbGlzdCAqaW0pCit7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gaW0tPmludGVyZmFjZTsKKyNpZmRlZiBDT05GSUdfSVBfTVVMVElDQVNUCisJaW50IHJlcG9ydGVyOworI2VuZGlmCisKKwlpZiAoaW0tPmxvYWRlZCkgeworCQlpbS0+bG9hZGVkID0gMDsKKwkJaXBfbWNfZmlsdGVyX2RlbChpbl9kZXYsIGltLT5tdWx0aWFkZHIpOworCX0KKworI2lmZGVmIENPTkZJR19JUF9NVUxUSUNBU1QKKwlpZiAoaW0tPm11bHRpYWRkciA9PSBJR01QX0FMTF9IT1NUUykKKwkJcmV0dXJuOworCisJcmVwb3J0ZXIgPSBpbS0+cmVwb3J0ZXI7CisJaWdtcF9zdG9wX3RpbWVyKGltKTsKKworCWlmICghaW5fZGV2LT5kZWFkKSB7CisJCWlmIChJR01QX1YxX1NFRU4oaW5fZGV2KSkKKwkJCWdvdG8gZG9uZTsKKwkJaWYgKElHTVBfVjJfU0VFTihpbl9kZXYpKSB7CisJCQlpZiAocmVwb3J0ZXIpCisJCQkJaWdtcF9zZW5kX3JlcG9ydChpbl9kZXYsIGltLCBJR01QX0hPU1RfTEVBVkVfTUVTU0FHRSk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJLyogSUdNUHYzICovCisJCWlnbXB2M19hZGRfZGVscmVjKGluX2RldiwgaW0pOworCisJCWlnbXBfaWZjX2V2ZW50KGluX2Rldik7CisJfQorZG9uZToKKyNlbmRpZgorCWlwX21jX2NsZWFyX3NyYyhpbSk7Cit9CisKK3N0YXRpYyB2b2lkIGlnbXBfZ3JvdXBfYWRkZWQoc3RydWN0IGlwX21jX2xpc3QgKmltKQoreworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiA9IGltLT5pbnRlcmZhY2U7CisKKwlpZiAoaW0tPmxvYWRlZCA9PSAwKSB7CisJCWltLT5sb2FkZWQgPSAxOworCQlpcF9tY19maWx0ZXJfYWRkKGluX2RldiwgaW0tPm11bHRpYWRkcik7CisJfQorCisjaWZkZWYgQ09ORklHX0lQX01VTFRJQ0FTVAorCWlmIChpbS0+bXVsdGlhZGRyID09IElHTVBfQUxMX0hPU1RTKQorCQlyZXR1cm47CisKKwlpZiAoaW5fZGV2LT5kZWFkKQorCQlyZXR1cm47CisJaWYgKElHTVBfVjFfU0VFTihpbl9kZXYpIHx8IElHTVBfVjJfU0VFTihpbl9kZXYpKSB7CisJCXNwaW5fbG9ja19iaCgmaW0tPmxvY2spOworCQlpZ21wX3N0YXJ0X3RpbWVyKGltLCBJR01QX0luaXRpYWxfUmVwb3J0X0RlbGF5KTsKKwkJc3Bpbl91bmxvY2tfYmgoJmltLT5sb2NrKTsKKwkJcmV0dXJuOworCX0KKwkvKiBlbHNlLCB2MyAqLworCisJaW0tPmNyY291bnQgPSBpbl9kZXYtPm1yX3FydiA/IGluX2Rldi0+bXJfcXJ2IDoKKwkJSUdNUF9VbnNvbGljaXRlZF9SZXBvcnRfQ291bnQ7CisJaWdtcF9pZmNfZXZlbnQoaW5fZGV2KTsKKyNlbmRpZgorfQorCisKKy8qCisgKglNdWx0aWNhc3QgbGlzdCBtYW5hZ2VycworICovCisKKworLyoKKyAqCUEgc29ja2V0IGhhcyBqb2luZWQgYSBtdWx0aWNhc3QgZ3JvdXAgb24gZGV2aWNlIGRldi4KKyAqLworCit2b2lkIGlwX21jX2luY19ncm91cChzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYsIHUzMiBhZGRyKQoreworCXN0cnVjdCBpcF9tY19saXN0ICppbTsKKworCUFTU0VSVF9SVE5MKCk7CisKKwlmb3IgKGltPWluX2Rldi0+bWNfbGlzdDsgaW07IGltPWltLT5uZXh0KSB7CisJCWlmIChpbS0+bXVsdGlhZGRyID09IGFkZHIpIHsKKwkJCWltLT51c2VycysrOworCQkJaXBfbWNfYWRkX3NyYyhpbl9kZXYsICZhZGRyLCBNQ0FTVF9FWENMVURFLCAwLCBOVUxMLCAwKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaW0gPSAoc3RydWN0IGlwX21jX2xpc3QgKilrbWFsbG9jKHNpemVvZigqaW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWltKQorCQlnb3RvIG91dDsKKworCWltLT51c2Vycz0xOworCWltLT5pbnRlcmZhY2U9aW5fZGV2OworCWluX2Rldl9ob2xkKGluX2Rldik7CisJaW0tPm11bHRpYWRkcj1hZGRyOworCS8qIGluaXRpYWwgbW9kZSBpcyAoRVgsIGVtcHR5KSAqLworCWltLT5zZm1vZGUgPSBNQ0FTVF9FWENMVURFOworCWltLT5zZmNvdW50W01DQVNUX0lOQ0xVREVdID0gMDsKKwlpbS0+c2Zjb3VudFtNQ0FTVF9FWENMVURFXSA9IDE7CisJaW0tPnNvdXJjZXMgPSBOVUxMOworCWltLT50b21iID0gTlVMTDsKKwlpbS0+Y3Jjb3VudCA9IDA7CisJYXRvbWljX3NldCgmaW0tPnJlZmNudCwgMSk7CisJc3Bpbl9sb2NrX2luaXQoJmltLT5sb2NrKTsKKyNpZmRlZiBDT05GSUdfSVBfTVVMVElDQVNUCisJaW0tPnRtX3J1bm5pbmc9MDsKKwlpbml0X3RpbWVyKCZpbS0+dGltZXIpOworCWltLT50aW1lci5kYXRhPSh1bnNpZ25lZCBsb25nKWltOworCWltLT50aW1lci5mdW5jdGlvbj0maWdtcF90aW1lcl9leHBpcmU7CisJaW0tPnVuc29saWNpdF9jb3VudCA9IElHTVBfVW5zb2xpY2l0ZWRfUmVwb3J0X0NvdW50OworCWltLT5yZXBvcnRlciA9IDA7CisJaW0tPmdzcXVlcnkgPSAwOworI2VuZGlmCisJaW0tPmxvYWRlZCA9IDA7CisJd3JpdGVfbG9ja19iaCgmaW5fZGV2LT5tY19saXN0X2xvY2spOworCWltLT5uZXh0PWluX2Rldi0+bWNfbGlzdDsKKwlpbl9kZXYtPm1jX2xpc3Q9aW07CisJd3JpdGVfdW5sb2NrX2JoKCZpbl9kZXYtPm1jX2xpc3RfbG9jayk7CisjaWZkZWYgQ09ORklHX0lQX01VTFRJQ0FTVAorCWlnbXB2M19kZWxfZGVscmVjKGluX2RldiwgaW0tPm11bHRpYWRkcik7CisjZW5kaWYKKwlpZ21wX2dyb3VwX2FkZGVkKGltKTsKKwlpZiAoIWluX2Rldi0+ZGVhZCkKKwkJaXBfcnRfbXVsdGljYXN0X2V2ZW50KGluX2Rldik7CitvdXQ6CisJcmV0dXJuOworfQorCisvKgorICoJQSBzb2NrZXQgaGFzIGxlZnQgYSBtdWx0aWNhc3QgZ3JvdXAgb24gZGV2aWNlIGRldgorICovCisKK3ZvaWQgaXBfbWNfZGVjX2dyb3VwKHN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiwgdTMyIGFkZHIpCit7CisJc3RydWN0IGlwX21jX2xpc3QgKmksICoqaXA7CisJCisJQVNTRVJUX1JUTkwoKTsKKwkKKwlmb3IgKGlwPSZpbl9kZXYtPm1jX2xpc3Q7IChpPSppcCkhPU5VTEw7IGlwPSZpLT5uZXh0KSB7CisJCWlmIChpLT5tdWx0aWFkZHI9PWFkZHIpIHsKKwkJCWlmICgtLWktPnVzZXJzID09IDApIHsKKwkJCQl3cml0ZV9sb2NrX2JoKCZpbl9kZXYtPm1jX2xpc3RfbG9jayk7CisJCQkJKmlwID0gaS0+bmV4dDsKKwkJCQl3cml0ZV91bmxvY2tfYmgoJmluX2Rldi0+bWNfbGlzdF9sb2NrKTsKKwkJCQlpZ21wX2dyb3VwX2Ryb3BwZWQoaSk7CisKKwkJCQlpZiAoIWluX2Rldi0+ZGVhZCkKKwkJCQkJaXBfcnRfbXVsdGljYXN0X2V2ZW50KGluX2Rldik7CisKKwkJCQlpcF9tYV9wdXQoaSk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qIERldmljZSBnb2luZyBkb3duICovCisKK3ZvaWQgaXBfbWNfZG93bihzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYpCit7CisJc3RydWN0IGlwX21jX2xpc3QgKmk7CisKKwlBU1NFUlRfUlROTCgpOworCisJZm9yIChpPWluX2Rldi0+bWNfbGlzdDsgaTsgaT1pLT5uZXh0KQorCQlpZ21wX2dyb3VwX2Ryb3BwZWQoaSk7CisKKyNpZmRlZiBDT05GSUdfSVBfTVVMVElDQVNUCisJaW5fZGV2LT5tcl9pZmNfY291bnQgPSAwOworCWlmIChkZWxfdGltZXIoJmluX2Rldi0+bXJfaWZjX3RpbWVyKSkKKwkJX19pbl9kZXZfcHV0KGluX2Rldik7CisJaW5fZGV2LT5tcl9ncV9ydW5uaW5nID0gMDsKKwlpZiAoZGVsX3RpbWVyKCZpbl9kZXYtPm1yX2dxX3RpbWVyKSkKKwkJX19pbl9kZXZfcHV0KGluX2Rldik7CisJaWdtcHYzX2NsZWFyX2RlbHJlYyhpbl9kZXYpOworI2VuZGlmCisKKwlpcF9tY19kZWNfZ3JvdXAoaW5fZGV2LCBJR01QX0FMTF9IT1NUUyk7Cit9CisKK3ZvaWQgaXBfbWNfaW5pdF9kZXYoc3RydWN0IGluX2RldmljZSAqaW5fZGV2KQoreworCUFTU0VSVF9SVE5MKCk7CisKKwlpbl9kZXYtPm1jX3RvbWIgPSBOVUxMOworI2lmZGVmIENPTkZJR19JUF9NVUxUSUNBU1QKKwlpbl9kZXYtPm1yX2dxX3J1bm5pbmcgPSAwOworCWluaXRfdGltZXIoJmluX2Rldi0+bXJfZ3FfdGltZXIpOworCWluX2Rldi0+bXJfZ3FfdGltZXIuZGF0YT0odW5zaWduZWQgbG9uZykgaW5fZGV2OworCWluX2Rldi0+bXJfZ3FfdGltZXIuZnVuY3Rpb249JmlnbXBfZ3FfdGltZXJfZXhwaXJlOworCWluX2Rldi0+bXJfaWZjX2NvdW50ID0gMDsKKwlpbml0X3RpbWVyKCZpbl9kZXYtPm1yX2lmY190aW1lcik7CisJaW5fZGV2LT5tcl9pZmNfdGltZXIuZGF0YT0odW5zaWduZWQgbG9uZykgaW5fZGV2OworCWluX2Rldi0+bXJfaWZjX3RpbWVyLmZ1bmN0aW9uPSZpZ21wX2lmY190aW1lcl9leHBpcmU7CisJaW5fZGV2LT5tcl9xcnYgPSBJR01QX1Vuc29saWNpdGVkX1JlcG9ydF9Db3VudDsKKyNlbmRpZgorCisJcndsb2NrX2luaXQoJmluX2Rldi0+bWNfbGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmaW5fZGV2LT5tY190b21iX2xvY2spOworfQorCisvKiBEZXZpY2UgZ29pbmcgdXAgKi8KKwordm9pZCBpcF9tY191cChzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYpCit7CisJc3RydWN0IGlwX21jX2xpc3QgKmk7CisKKwlBU1NFUlRfUlROTCgpOworCisJaXBfbWNfaW5jX2dyb3VwKGluX2RldiwgSUdNUF9BTExfSE9TVFMpOworCisJZm9yIChpPWluX2Rldi0+bWNfbGlzdDsgaTsgaT1pLT5uZXh0KQorCQlpZ21wX2dyb3VwX2FkZGVkKGkpOworfQorCisvKgorICoJRGV2aWNlIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZDogY2xlYW4gdXAuCisgKi8KKwordm9pZCBpcF9tY19kZXN0cm95X2RldihzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYpCit7CisJc3RydWN0IGlwX21jX2xpc3QgKmk7CisKKwlBU1NFUlRfUlROTCgpOworCisJLyogRGVhY3RpdmF0ZSB0aW1lcnMgKi8KKwlpcF9tY19kb3duKGluX2Rldik7CisKKwl3cml0ZV9sb2NrX2JoKCZpbl9kZXYtPm1jX2xpc3RfbG9jayk7CisJd2hpbGUgKChpID0gaW5fZGV2LT5tY19saXN0KSAhPSBOVUxMKSB7CisJCWluX2Rldi0+bWNfbGlzdCA9IGktPm5leHQ7CisJCXdyaXRlX3VubG9ja19iaCgmaW5fZGV2LT5tY19saXN0X2xvY2spOworCisJCWlnbXBfZ3JvdXBfZHJvcHBlZChpKTsKKwkJaXBfbWFfcHV0KGkpOworCisJCXdyaXRlX2xvY2tfYmgoJmluX2Rldi0+bWNfbGlzdF9sb2NrKTsKKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZpbl9kZXYtPm1jX2xpc3RfbG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5fZGV2aWNlICogaXBfbWNfZmluZF9kZXYoc3RydWN0IGlwX21yZXFuICppbXIpCit7CisJc3RydWN0IGZsb3dpIGZsID0geyAubmxfdSA9IHsgLmlwNF91ID0KKwkJCQkgICAgICB7IC5kYWRkciA9IGltci0+aW1yX211bHRpYWRkci5zX2FkZHIgfSB9IH07CisJc3RydWN0IHJ0YWJsZSAqcnQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IGluX2RldmljZSAqaWRldiA9IE5VTEw7CisKKwlpZiAoaW1yLT5pbXJfaWZpbmRleCkgeworCQlpZGV2ID0gaW5ldGRldl9ieV9pbmRleChpbXItPmltcl9pZmluZGV4KTsKKwkJaWYgKGlkZXYpCisJCQlfX2luX2Rldl9wdXQoaWRldik7CisJCXJldHVybiBpZGV2OworCX0KKwlpZiAoaW1yLT5pbXJfYWRkcmVzcy5zX2FkZHIpIHsKKwkJZGV2ID0gaXBfZGV2X2ZpbmQoaW1yLT5pbXJfYWRkcmVzcy5zX2FkZHIpOworCQlpZiAoIWRldikKKwkJCXJldHVybiBOVUxMOworCQlfX2Rldl9wdXQoZGV2KTsKKwl9CisKKwlpZiAoIWRldiAmJiAhaXBfcm91dGVfb3V0cHV0X2tleSgmcnQsICZmbCkpIHsKKwkJZGV2ID0gcnQtPnUuZHN0LmRldjsKKwkJaXBfcnRfcHV0KHJ0KTsKKwl9CisJaWYgKGRldikgeworCQlpbXItPmltcl9pZmluZGV4ID0gZGV2LT5pZmluZGV4OworCQlpZGV2ID0gX19pbl9kZXZfZ2V0KGRldik7CisJfQorCXJldHVybiBpZGV2OworfQorCisvKgorICoJSm9pbiBhIHNvY2tldCB0byBhIGdyb3VwCisgKi8KK2ludCBzeXNjdGxfaWdtcF9tYXhfbWVtYmVyc2hpcHMgPSBJUF9NQVhfTUVNQkVSU0hJUFM7CitpbnQgc3lzY3RsX2lnbXBfbWF4X21zZiA9IElQX01BWF9NU0Y7CisKKworc3RhdGljIGludCBpcF9tY19kZWwxX3NyYyhzdHJ1Y3QgaXBfbWNfbGlzdCAqcG1jLCBpbnQgc2Ztb2RlLAorCV9fdTMyICpwc2ZzcmMpCit7CisJc3RydWN0IGlwX3NmX2xpc3QgKnBzZiwgKnBzZl9wcmV2OworCWludCBydiA9IDA7CisKKwlwc2ZfcHJldiA9IE5VTEw7CisJZm9yIChwc2Y9cG1jLT5zb3VyY2VzOyBwc2Y7IHBzZj1wc2YtPnNmX25leHQpIHsKKwkJaWYgKHBzZi0+c2ZfaW5hZGRyID09ICpwc2ZzcmMpCisJCQlicmVhazsKKwkJcHNmX3ByZXYgPSBwc2Y7CisJfQorCWlmICghcHNmIHx8IHBzZi0+c2ZfY291bnRbc2Ztb2RlXSA9PSAwKSB7CisJCS8qIHNvdXJjZSBmaWx0ZXIgbm90IGZvdW5kLCBvciBjb3VudCB3cm9uZyA9PiAgYnVnICovCisJCXJldHVybiAtRVNSQ0g7CisJfQorCXBzZi0+c2ZfY291bnRbc2Ztb2RlXS0tOworCWlmIChwc2YtPnNmX2NvdW50W3NmbW9kZV0gPT0gMCkgeworCQlpcF9ydF9tdWx0aWNhc3RfZXZlbnQocG1jLT5pbnRlcmZhY2UpOworCX0KKwlpZiAoIXBzZi0+c2ZfY291bnRbTUNBU1RfSU5DTFVERV0gJiYgIXBzZi0+c2ZfY291bnRbTUNBU1RfRVhDTFVERV0pIHsKKyNpZmRlZiBDT05GSUdfSVBfTVVMVElDQVNUCisJCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiA9IHBtYy0+aW50ZXJmYWNlOworI2VuZGlmCisKKwkJLyogbm8gbW9yZSBmaWx0ZXJzIGZvciB0aGlzIHNvdXJjZSAqLworCQlpZiAocHNmX3ByZXYpCisJCQlwc2ZfcHJldi0+c2ZfbmV4dCA9IHBzZi0+c2ZfbmV4dDsKKwkJZWxzZQorCQkJcG1jLT5zb3VyY2VzID0gcHNmLT5zZl9uZXh0OworI2lmZGVmIENPTkZJR19JUF9NVUxUSUNBU1QKKwkJaWYgKHBzZi0+c2Zfb2xkaW4gJiYKKwkJICAgICFJR01QX1YxX1NFRU4oaW5fZGV2KSAmJiAhSUdNUF9WMl9TRUVOKGluX2RldikpIHsKKwkJCXBzZi0+c2ZfY3Jjb3VudCA9IGluX2Rldi0+bXJfcXJ2ID8gaW5fZGV2LT5tcl9xcnYgOiAKKwkJCQlJR01QX1Vuc29saWNpdGVkX1JlcG9ydF9Db3VudDsKKwkJCXBzZi0+c2ZfbmV4dCA9IHBtYy0+dG9tYjsKKwkJCXBtYy0+dG9tYiA9IHBzZjsKKwkJCXJ2ID0gMTsKKwkJfSBlbHNlCisjZW5kaWYKKwkJCWtmcmVlKHBzZik7CisJfQorCXJldHVybiBydjsKK30KKworI2lmbmRlZiBDT05GSUdfSVBfTVVMVElDQVNUCisjZGVmaW5lIGlnbXBfaWZjX2V2ZW50KHgpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCitzdGF0aWMgaW50IGlwX21jX2RlbF9zcmMoc3RydWN0IGluX2RldmljZSAqaW5fZGV2LCBfX3UzMiAqcG1jYSwgaW50IHNmbW9kZSwKKwkJCSBpbnQgc2Zjb3VudCwgX191MzIgKnBzZnNyYywgaW50IGRlbHRhKQoreworCXN0cnVjdCBpcF9tY19saXN0ICpwbWM7CisJaW50CWNoYW5nZXJlYyA9IDA7CisJaW50CWksIGVycjsKKworCWlmICghaW5fZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZWFkX2xvY2soJmluX2Rldi0+bWNfbGlzdF9sb2NrKTsKKwlmb3IgKHBtYz1pbl9kZXYtPm1jX2xpc3Q7IHBtYzsgcG1jPXBtYy0+bmV4dCkgeworCQlpZiAoKnBtY2EgPT0gcG1jLT5tdWx0aWFkZHIpCisJCQlicmVhazsKKwl9CisJaWYgKCFwbWMpIHsKKwkJLyogTUNBIG5vdCBmb3VuZD8/IGJ1ZyAqLworCQlyZWFkX3VubG9jaygmaW5fZGV2LT5tY19saXN0X2xvY2spOworCQlyZXR1cm4gLUVTUkNIOworCX0KKwlzcGluX2xvY2tfYmgoJnBtYy0+bG9jayk7CisJcmVhZF91bmxvY2soJmluX2Rldi0+bWNfbGlzdF9sb2NrKTsKKyNpZmRlZiBDT05GSUdfSVBfTVVMVElDQVNUCisJc2ZfbWFya3N0YXRlKHBtYyk7CisjZW5kaWYKKwlpZiAoIWRlbHRhKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWlmICghcG1jLT5zZmNvdW50W3NmbW9kZV0pCisJCQlnb3RvIG91dF91bmxvY2s7CisJCXBtYy0+c2Zjb3VudFtzZm1vZGVdLS07CisJfQorCWVyciA9IDA7CisJZm9yIChpPTA7IGk8c2Zjb3VudDsgaSsrKSB7CisJCWludCBydiA9IGlwX21jX2RlbDFfc3JjKHBtYywgc2Ztb2RlLCAmcHNmc3JjW2ldKTsKKworCQljaGFuZ2VyZWMgfD0gcnYgPiAwOworCQlpZiAoIWVyciAmJiBydiA8IDApCisJCQllcnIgPSBydjsKKwl9CisJaWYgKHBtYy0+c2Ztb2RlID09IE1DQVNUX0VYQ0xVREUgJiYKKwkgICAgcG1jLT5zZmNvdW50W01DQVNUX0VYQ0xVREVdID09IDAgJiYKKwkgICAgcG1jLT5zZmNvdW50W01DQVNUX0lOQ0xVREVdKSB7CisjaWZkZWYgQ09ORklHX0lQX01VTFRJQ0FTVAorCQlzdHJ1Y3QgaXBfc2ZfbGlzdCAqcHNmOworI2VuZGlmCisKKwkJLyogZmlsdGVyIG1vZGUgY2hhbmdlICovCisJCXBtYy0+c2Ztb2RlID0gTUNBU1RfSU5DTFVERTsKKyNpZmRlZiBDT05GSUdfSVBfTVVMVElDQVNUCisJCXBtYy0+Y3Jjb3VudCA9IGluX2Rldi0+bXJfcXJ2ID8gaW5fZGV2LT5tcl9xcnYgOiAKKwkJCUlHTVBfVW5zb2xpY2l0ZWRfUmVwb3J0X0NvdW50OworCQlpbl9kZXYtPm1yX2lmY19jb3VudCA9IHBtYy0+Y3Jjb3VudDsKKwkJZm9yIChwc2Y9cG1jLT5zb3VyY2VzOyBwc2Y7IHBzZiA9IHBzZi0+c2ZfbmV4dCkKKwkJCXBzZi0+c2ZfY3Jjb3VudCA9IDA7CisJCWlnbXBfaWZjX2V2ZW50KHBtYy0+aW50ZXJmYWNlKTsKKwl9IGVsc2UgaWYgKHNmX3NldHN0YXRlKHBtYykgfHwgY2hhbmdlcmVjKSB7CisJCWlnbXBfaWZjX2V2ZW50KHBtYy0+aW50ZXJmYWNlKTsKKyNlbmRpZgorCX0KK291dF91bmxvY2s6CisJc3Bpbl91bmxvY2tfYmgoJnBtYy0+bG9jayk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIEFkZCBtdWx0aWNhc3Qgc2luZ2xlLXNvdXJjZSBmaWx0ZXIgdG8gdGhlIGludGVyZmFjZSBsaXN0CisgKi8KK3N0YXRpYyBpbnQgaXBfbWNfYWRkMV9zcmMoc3RydWN0IGlwX21jX2xpc3QgKnBtYywgaW50IHNmbW9kZSwKKwlfX3UzMiAqcHNmc3JjLCBpbnQgZGVsdGEpCit7CisJc3RydWN0IGlwX3NmX2xpc3QgKnBzZiwgKnBzZl9wcmV2OworCisJcHNmX3ByZXYgPSBOVUxMOworCWZvciAocHNmPXBtYy0+c291cmNlczsgcHNmOyBwc2Y9cHNmLT5zZl9uZXh0KSB7CisJCWlmIChwc2YtPnNmX2luYWRkciA9PSAqcHNmc3JjKQorCQkJYnJlYWs7CisJCXBzZl9wcmV2ID0gcHNmOworCX0KKwlpZiAoIXBzZikgeworCQlwc2YgPSAoc3RydWN0IGlwX3NmX2xpc3QgKilrbWFsbG9jKHNpemVvZigqcHNmKSwgR0ZQX0FUT01JQyk7CisJCWlmICghcHNmKQorCQkJcmV0dXJuIC1FTk9CVUZTOworCQltZW1zZXQocHNmLCAwLCBzaXplb2YoKnBzZikpOworCQlwc2YtPnNmX2luYWRkciA9ICpwc2ZzcmM7CisJCWlmIChwc2ZfcHJldikgeworCQkJcHNmX3ByZXYtPnNmX25leHQgPSBwc2Y7CisJCX0gZWxzZQorCQkJcG1jLT5zb3VyY2VzID0gcHNmOworCX0KKwlwc2YtPnNmX2NvdW50W3NmbW9kZV0rKzsKKwlpZiAocHNmLT5zZl9jb3VudFtzZm1vZGVdID09IDEpIHsKKwkJaXBfcnRfbXVsdGljYXN0X2V2ZW50KHBtYy0+aW50ZXJmYWNlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfSVBfTVVMVElDQVNUCitzdGF0aWMgdm9pZCBzZl9tYXJrc3RhdGUoc3RydWN0IGlwX21jX2xpc3QgKnBtYykKK3sKKwlzdHJ1Y3QgaXBfc2ZfbGlzdCAqcHNmOworCWludCBtY2FfeGNvdW50ID0gcG1jLT5zZmNvdW50W01DQVNUX0VYQ0xVREVdOworCisJZm9yIChwc2Y9cG1jLT5zb3VyY2VzOyBwc2Y7IHBzZj1wc2YtPnNmX25leHQpCisJCWlmIChwbWMtPnNmY291bnRbTUNBU1RfRVhDTFVERV0pIHsKKwkJCXBzZi0+c2Zfb2xkaW4gPSBtY2FfeGNvdW50ID09CisJCQkJcHNmLT5zZl9jb3VudFtNQ0FTVF9FWENMVURFXSAmJgorCQkJCSFwc2YtPnNmX2NvdW50W01DQVNUX0lOQ0xVREVdOworCQl9IGVsc2UKKwkJCXBzZi0+c2Zfb2xkaW4gPSBwc2YtPnNmX2NvdW50W01DQVNUX0lOQ0xVREVdICE9IDA7Cit9CisKK3N0YXRpYyBpbnQgc2Zfc2V0c3RhdGUoc3RydWN0IGlwX21jX2xpc3QgKnBtYykKK3sKKwlzdHJ1Y3QgaXBfc2ZfbGlzdCAqcHNmOworCWludCBtY2FfeGNvdW50ID0gcG1jLT5zZmNvdW50W01DQVNUX0VYQ0xVREVdOworCWludCBxcnYgPSBwbWMtPmludGVyZmFjZS0+bXJfcXJ2OworCWludCBuZXdfaW4sIHJ2OworCisJcnYgPSAwOworCWZvciAocHNmPXBtYy0+c291cmNlczsgcHNmOyBwc2Y9cHNmLT5zZl9uZXh0KSB7CisJCWlmIChwbWMtPnNmY291bnRbTUNBU1RfRVhDTFVERV0pIHsKKwkJCW5ld19pbiA9IG1jYV94Y291bnQgPT0gcHNmLT5zZl9jb3VudFtNQ0FTVF9FWENMVURFXSAmJgorCQkJCSFwc2YtPnNmX2NvdW50W01DQVNUX0lOQ0xVREVdOworCQl9IGVsc2UKKwkJCW5ld19pbiA9IHBzZi0+c2ZfY291bnRbTUNBU1RfSU5DTFVERV0gIT0gMDsKKwkJaWYgKG5ld19pbiAhPSBwc2YtPnNmX29sZGluKSB7CisJCQlwc2YtPnNmX2NyY291bnQgPSBxcnY7CisJCQlydisrOworCQl9CisJfQorCXJldHVybiBydjsKK30KKyNlbmRpZgorCisvKgorICogQWRkIG11bHRpY2FzdCBzb3VyY2UgZmlsdGVyIGxpc3QgdG8gdGhlIGludGVyZmFjZSBsaXN0CisgKi8KK3N0YXRpYyBpbnQgaXBfbWNfYWRkX3NyYyhzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYsIF9fdTMyICpwbWNhLCBpbnQgc2Ztb2RlLAorCQkJIGludCBzZmNvdW50LCBfX3UzMiAqcHNmc3JjLCBpbnQgZGVsdGEpCit7CisJc3RydWN0IGlwX21jX2xpc3QgKnBtYzsKKwlpbnQJaXNleGNsdWRlOworCWludAlpLCBlcnI7CisKKwlpZiAoIWluX2RldikKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmVhZF9sb2NrKCZpbl9kZXYtPm1jX2xpc3RfbG9jayk7CisJZm9yIChwbWM9aW5fZGV2LT5tY19saXN0OyBwbWM7IHBtYz1wbWMtPm5leHQpIHsKKwkJaWYgKCpwbWNhID09IHBtYy0+bXVsdGlhZGRyKQorCQkJYnJlYWs7CisJfQorCWlmICghcG1jKSB7CisJCS8qIE1DQSBub3QgZm91bmQ/PyBidWcgKi8KKwkJcmVhZF91bmxvY2soJmluX2Rldi0+bWNfbGlzdF9sb2NrKTsKKwkJcmV0dXJuIC1FU1JDSDsKKwl9CisJc3Bpbl9sb2NrX2JoKCZwbWMtPmxvY2spOworCXJlYWRfdW5sb2NrKCZpbl9kZXYtPm1jX2xpc3RfbG9jayk7CisKKyNpZmRlZiBDT05GSUdfSVBfTVVMVElDQVNUCisJc2ZfbWFya3N0YXRlKHBtYyk7CisjZW5kaWYKKwlpc2V4Y2x1ZGUgPSBwbWMtPnNmbW9kZSA9PSBNQ0FTVF9FWENMVURFOworCWlmICghZGVsdGEpCisJCXBtYy0+c2Zjb3VudFtzZm1vZGVdKys7CisJZXJyID0gMDsKKwlmb3IgKGk9MDsgaTxzZmNvdW50OyBpKyspIHsKKwkJZXJyID0gaXBfbWNfYWRkMV9zcmMocG1jLCBzZm1vZGUsICZwc2ZzcmNbaV0sIGRlbHRhKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCX0KKwlpZiAoZXJyKSB7CisJCWludCBqOworCisJCXBtYy0+c2Zjb3VudFtzZm1vZGVdLS07CisJCWZvciAoaj0wOyBqPGk7IGorKykKKwkJCSh2b2lkKSBpcF9tY19kZWwxX3NyYyhwbWMsIHNmbW9kZSwgJnBzZnNyY1tpXSk7CisJfSBlbHNlIGlmIChpc2V4Y2x1ZGUgIT0gKHBtYy0+c2Zjb3VudFtNQ0FTVF9FWENMVURFXSAhPSAwKSkgeworI2lmZGVmIENPTkZJR19JUF9NVUxUSUNBU1QKKwkJc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gcG1jLT5pbnRlcmZhY2U7CisJCXN0cnVjdCBpcF9zZl9saXN0ICpwc2Y7CisjZW5kaWYKKworCQkvKiBmaWx0ZXIgbW9kZSBjaGFuZ2UgKi8KKwkJaWYgKHBtYy0+c2Zjb3VudFtNQ0FTVF9FWENMVURFXSkKKwkJCXBtYy0+c2Ztb2RlID0gTUNBU1RfRVhDTFVERTsKKwkJZWxzZSBpZiAocG1jLT5zZmNvdW50W01DQVNUX0lOQ0xVREVdKQorCQkJcG1jLT5zZm1vZGUgPSBNQ0FTVF9JTkNMVURFOworI2lmZGVmIENPTkZJR19JUF9NVUxUSUNBU1QKKwkJLyogZWxzZSBubyBmaWx0ZXJzOyBrZWVwIG9sZCBtb2RlIGZvciByZXBvcnRzICovCisKKwkJcG1jLT5jcmNvdW50ID0gaW5fZGV2LT5tcl9xcnYgPyBpbl9kZXYtPm1yX3FydiA6IAorCQkJSUdNUF9VbnNvbGljaXRlZF9SZXBvcnRfQ291bnQ7CisJCWluX2Rldi0+bXJfaWZjX2NvdW50ID0gcG1jLT5jcmNvdW50OworCQlmb3IgKHBzZj1wbWMtPnNvdXJjZXM7IHBzZjsgcHNmID0gcHNmLT5zZl9uZXh0KQorCQkJcHNmLT5zZl9jcmNvdW50ID0gMDsKKwkJaWdtcF9pZmNfZXZlbnQoaW5fZGV2KTsKKwl9IGVsc2UgaWYgKHNmX3NldHN0YXRlKHBtYykpIHsKKwkJaWdtcF9pZmNfZXZlbnQoaW5fZGV2KTsKKyNlbmRpZgorCX0KKwlzcGluX3VubG9ja19iaCgmcG1jLT5sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBpcF9tY19jbGVhcl9zcmMoc3RydWN0IGlwX21jX2xpc3QgKnBtYykKK3sKKwlzdHJ1Y3QgaXBfc2ZfbGlzdCAqcHNmLCAqbmV4dHBzZjsKKworCWZvciAocHNmPXBtYy0+dG9tYjsgcHNmOyBwc2Y9bmV4dHBzZikgeworCQluZXh0cHNmID0gcHNmLT5zZl9uZXh0OworCQlrZnJlZShwc2YpOworCX0KKwlwbWMtPnRvbWIgPSBOVUxMOworCWZvciAocHNmPXBtYy0+c291cmNlczsgcHNmOyBwc2Y9bmV4dHBzZikgeworCQluZXh0cHNmID0gcHNmLT5zZl9uZXh0OworCQlrZnJlZShwc2YpOworCX0KKwlwbWMtPnNvdXJjZXMgPSBOVUxMOworCXBtYy0+c2Ztb2RlID0gTUNBU1RfRVhDTFVERTsKKwlwbWMtPnNmY291bnRbTUNBU1RfRVhDTFVERV0gPSAwOworCXBtYy0+c2Zjb3VudFtNQ0FTVF9FWENMVURFXSA9IDE7Cit9CisKKworLyoKKyAqIEpvaW4gYSBtdWx0aWNhc3QgZ3JvdXAKKyAqLworaW50IGlwX21jX2pvaW5fZ3JvdXAoc3RydWN0IHNvY2sgKnNrICwgc3RydWN0IGlwX21yZXFuICppbXIpCit7CisJaW50IGVycjsKKwl1MzIgYWRkciA9IGltci0+aW1yX211bHRpYWRkci5zX2FkZHI7CisJc3RydWN0IGlwX21jX3NvY2tsaXN0ICppbWwsICppOworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisJaW50IGNvdW50ID0gMDsKKworCWlmICghTVVMVElDQVNUKGFkZHIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJ0bmxfc2hsb2NrKCk7CisKKwlpbl9kZXYgPSBpcF9tY19maW5kX2RldihpbXIpOworCisJaWYgKCFpbl9kZXYpIHsKKwkJaW1sID0gTlVMTDsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBkb25lOworCX0KKworCWltbCA9IChzdHJ1Y3QgaXBfbWNfc29ja2xpc3QgKilzb2NrX2ttYWxsb2Moc2ssIHNpemVvZigqaW1sKSwgR0ZQX0tFUk5FTCk7CisKKwllcnIgPSAtRUFERFJJTlVTRTsKKwlmb3IgKGkgPSBpbmV0LT5tY19saXN0OyBpOyBpID0gaS0+bmV4dCkgeworCQlpZiAobWVtY21wKCZpLT5tdWx0aSwgaW1yLCBzaXplb2YoKmltcikpID09IDApIHsKKwkJCS8qIE5ldyBzdHlsZSBhZGRpdGlvbnMgYXJlIHJlZmVyZW5jZSBjb3VudGVkICovCisJCQlpZiAoaW1yLT5pbXJfYWRkcmVzcy5zX2FkZHIgPT0gMCkgeworCQkJCWktPmNvdW50Kys7CisJCQkJZXJyID0gMDsKKwkJCX0KKwkJCWdvdG8gZG9uZTsKKwkJfQorCQljb3VudCsrOworCX0KKwllcnIgPSAtRU5PQlVGUzsKKwlpZiAoaW1sID09IE5VTEwgfHwgY291bnQgPj0gc3lzY3RsX2lnbXBfbWF4X21lbWJlcnNoaXBzKQorCQlnb3RvIGRvbmU7CisJbWVtY3B5KCZpbWwtPm11bHRpLCBpbXIsIHNpemVvZigqaW1yKSk7CisJaW1sLT5uZXh0ID0gaW5ldC0+bWNfbGlzdDsKKwlpbWwtPmNvdW50ID0gMTsKKwlpbWwtPnNmbGlzdCA9IE5VTEw7CisJaW1sLT5zZm1vZGUgPSBNQ0FTVF9FWENMVURFOworCWluZXQtPm1jX2xpc3QgPSBpbWw7CisJaXBfbWNfaW5jX2dyb3VwKGluX2RldiwgYWRkcik7CisJaW1sID0gTlVMTDsKKwllcnIgPSAwOworCitkb25lOgorCXJ0bmxfc2h1bmxvY2soKTsKKwlpZiAoaW1sKQorCQlzb2NrX2tmcmVlX3Moc2ssIGltbCwgc2l6ZW9mKCppbWwpKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGlwX21jX2xlYXZlX3NyYyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBpcF9tY19zb2NrbGlzdCAqaW1sLAorCQkJICAgc3RydWN0IGluX2RldmljZSAqaW5fZGV2KQoreworCWludCBlcnI7CisKKwlpZiAoaW1sLT5zZmxpc3QgPT0gMCkgeworCQkvKiBhbnktc291cmNlIGVtcHR5IGV4Y2x1ZGUgY2FzZSAqLworCQlyZXR1cm4gaXBfbWNfZGVsX3NyYyhpbl9kZXYsICZpbWwtPm11bHRpLmltcl9tdWx0aWFkZHIuc19hZGRyLAorCQkJaW1sLT5zZm1vZGUsIDAsIE5VTEwsIDApOworCX0KKwllcnIgPSBpcF9tY19kZWxfc3JjKGluX2RldiwgJmltbC0+bXVsdGkuaW1yX211bHRpYWRkci5zX2FkZHIsCisJCQlpbWwtPnNmbW9kZSwgaW1sLT5zZmxpc3QtPnNsX2NvdW50LAorCQkJaW1sLT5zZmxpc3QtPnNsX2FkZHIsIDApOworCXNvY2tfa2ZyZWVfcyhzaywgaW1sLT5zZmxpc3QsIElQX1NGTFNJWkUoaW1sLT5zZmxpc3QtPnNsX21heCkpOworCWltbC0+c2ZsaXN0ID0gTlVMTDsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJQXNrIGEgc29ja2V0IHRvIGxlYXZlIGEgZ3JvdXAuCisgKi8KKworaW50IGlwX21jX2xlYXZlX2dyb3VwKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGlwX21yZXFuICppbXIpCit7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCXN0cnVjdCBpcF9tY19zb2NrbGlzdCAqaW1sLCAqKmltbHA7CisKKwlydG5sX2xvY2soKTsKKwlmb3IgKGltbHAgPSAmaW5ldC0+bWNfbGlzdDsgKGltbCA9ICppbWxwKSAhPSBOVUxMOyBpbWxwID0gJmltbC0+bmV4dCkgeworCQlpZiAoaW1sLT5tdWx0aS5pbXJfbXVsdGlhZGRyLnNfYWRkcj09aW1yLT5pbXJfbXVsdGlhZGRyLnNfYWRkciAmJgorCQkgICAgaW1sLT5tdWx0aS5pbXJfYWRkcmVzcy5zX2FkZHI9PWltci0+aW1yX2FkZHJlc3Muc19hZGRyICYmCisJCSAgICAoIWltci0+aW1yX2lmaW5kZXggfHwgaW1sLT5tdWx0aS5pbXJfaWZpbmRleD09aW1yLT5pbXJfaWZpbmRleCkpIHsKKwkJCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKworCQkJaW5fZGV2ID0gaW5ldGRldl9ieV9pbmRleChpbWwtPm11bHRpLmltcl9pZmluZGV4KTsKKwkJCWlmIChpbl9kZXYpCisJCQkJKHZvaWQpIGlwX21jX2xlYXZlX3NyYyhzaywgaW1sLCBpbl9kZXYpOworCQkJaWYgKC0taW1sLT5jb3VudCkgeworCQkJCXJ0bmxfdW5sb2NrKCk7CisJCQkJaWYgKGluX2RldikKKwkJCQkJaW5fZGV2X3B1dChpbl9kZXYpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQkqaW1scCA9IGltbC0+bmV4dDsKKworCQkJaWYgKGluX2RldikgeworCQkJCWlwX21jX2RlY19ncm91cChpbl9kZXYsIGltci0+aW1yX211bHRpYWRkci5zX2FkZHIpOworCQkJCWluX2Rldl9wdXQoaW5fZGV2KTsKKwkJCX0KKwkJCXJ0bmxfdW5sb2NrKCk7CisJCQlzb2NrX2tmcmVlX3Moc2ssIGltbCwgc2l6ZW9mKCppbWwpKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJ0bmxfdW5sb2NrKCk7CisJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworfQorCitpbnQgaXBfbWNfc291cmNlKGludCBhZGQsIGludCBvbW9kZSwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QKKwlpcF9tcmVxX3NvdXJjZSAqbXJlcXMsIGludCBpZmluZGV4KQoreworCWludCBlcnI7CisJc3RydWN0IGlwX21yZXFuIGltcjsKKwl1MzIgYWRkciA9IG1yZXFzLT5pbXJfbXVsdGlhZGRyOworCXN0cnVjdCBpcF9tY19zb2NrbGlzdCAqcG1jOworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiA9IE5VTEw7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCXN0cnVjdCBpcF9zZl9zb2NrbGlzdCAqcHNsOworCWludCBpLCBqLCBydjsKKworCWlmICghTVVMVElDQVNUKGFkZHIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJ0bmxfc2hsb2NrKCk7CisKKwlpbXIuaW1yX211bHRpYWRkci5zX2FkZHIgPSBtcmVxcy0+aW1yX211bHRpYWRkcjsKKwlpbXIuaW1yX2FkZHJlc3Muc19hZGRyID0gbXJlcXMtPmltcl9pbnRlcmZhY2U7CisJaW1yLmltcl9pZmluZGV4ID0gaWZpbmRleDsKKwlpbl9kZXYgPSBpcF9tY19maW5kX2RldigmaW1yKTsKKworCWlmICghaW5fZGV2KSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZG9uZTsKKwl9CisJZXJyID0gLUVBRERSTk9UQVZBSUw7CisKKwlmb3IgKHBtYz1pbmV0LT5tY19saXN0OyBwbWM7IHBtYz1wbWMtPm5leHQpIHsKKwkJaWYgKG1lbWNtcCgmcG1jLT5tdWx0aSwgbXJlcXMsIDIqc2l6ZW9mKF9fdTMyKSkgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoIXBtYykJCS8qIG11c3QgaGF2ZSBhIHByaW9yIGpvaW4gKi8KKwkJZ290byBkb25lOworCS8qIGlmIGEgc291cmNlIGZpbHRlciB3YXMgc2V0LCBtdXN0IGJlIHRoZSBzYW1lIG1vZGUgYXMgYmVmb3JlICovCisJaWYgKHBtYy0+c2ZsaXN0KSB7CisJCWlmIChwbWMtPnNmbW9kZSAhPSBvbW9kZSkKKwkJCWdvdG8gZG9uZTsKKwl9IGVsc2UgaWYgKHBtYy0+c2Ztb2RlICE9IG9tb2RlKSB7CisJCS8qIGFsbG93IG1vZGUgc3dpdGNoZXMgZm9yIGVtcHR5LXNldCBmaWx0ZXJzICovCisJCWlwX21jX2FkZF9zcmMoaW5fZGV2LCAmbXJlcXMtPmltcl9tdWx0aWFkZHIsIG9tb2RlLCAwLCBOVUxMLCAwKTsKKwkJaXBfbWNfZGVsX3NyYyhpbl9kZXYsICZtcmVxcy0+aW1yX211bHRpYWRkciwgcG1jLT5zZm1vZGUsIDAsIAorCQkJTlVMTCwgMCk7CisJCXBtYy0+c2Ztb2RlID0gb21vZGU7CisJfQorCisJcHNsID0gcG1jLT5zZmxpc3Q7CisJaWYgKCFhZGQpIHsKKwkJaWYgKCFwc2wpCisJCQlnb3RvIGRvbmU7CisJCXJ2ID0gITA7CisJCWZvciAoaT0wOyBpPHBzbC0+c2xfY291bnQ7IGkrKykgeworCQkJcnYgPSBtZW1jbXAoJnBzbC0+c2xfYWRkcltpXSwgJm1yZXFzLT5pbXJfc291cmNlYWRkciwKKwkJCQlzaXplb2YoX191MzIpKTsKKwkJCWlmIChydiA9PSAwKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChydikJCS8qIHNvdXJjZSBub3QgZm91bmQgKi8KKwkJCWdvdG8gZG9uZTsKKworCQkvKiB1cGRhdGUgdGhlIGludGVyZmFjZSBmaWx0ZXIgKi8KKwkJaXBfbWNfZGVsX3NyYyhpbl9kZXYsICZtcmVxcy0+aW1yX211bHRpYWRkciwgb21vZGUsIDEsIAorCQkJJm1yZXFzLT5pbXJfc291cmNlYWRkciwgMSk7CisKKwkJZm9yIChqPWkrMTsgajxwc2wtPnNsX2NvdW50OyBqKyspCisJCQlwc2wtPnNsX2FkZHJbai0xXSA9IHBzbC0+c2xfYWRkcltqXTsKKwkJcHNsLT5zbF9jb3VudC0tOworCQllcnIgPSAwOworCQlnb3RvIGRvbmU7CisJfQorCS8qIGVsc2UsIGFkZCBhIG5ldyBzb3VyY2UgdG8gdGhlIGZpbHRlciAqLworCisJaWYgKHBzbCAmJiBwc2wtPnNsX2NvdW50ID49IHN5c2N0bF9pZ21wX21heF9tc2YpIHsKKwkJZXJyID0gLUVOT0JVRlM7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKCFwc2wgfHwgcHNsLT5zbF9jb3VudCA9PSBwc2wtPnNsX21heCkgeworCQlzdHJ1Y3QgaXBfc2Zfc29ja2xpc3QgKm5ld3BzbDsKKwkJaW50IGNvdW50ID0gSVBfU0ZCTE9DSzsKKworCQlpZiAocHNsKQorCQkJY291bnQgKz0gcHNsLT5zbF9tYXg7CisJCW5ld3BzbCA9IChzdHJ1Y3QgaXBfc2Zfc29ja2xpc3QgKilzb2NrX2ttYWxsb2Moc2ssCisJCQlJUF9TRkxTSVpFKGNvdW50KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghbmV3cHNsKSB7CisJCQllcnIgPSAtRU5PQlVGUzsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQluZXdwc2wtPnNsX21heCA9IGNvdW50OworCQluZXdwc2wtPnNsX2NvdW50ID0gY291bnQgLSBJUF9TRkJMT0NLOworCQlpZiAocHNsKSB7CisJCQlmb3IgKGk9MDsgaTxwc2wtPnNsX2NvdW50OyBpKyspCisJCQkJbmV3cHNsLT5zbF9hZGRyW2ldID0gcHNsLT5zbF9hZGRyW2ldOworCQkJc29ja19rZnJlZV9zKHNrLCBwc2wsIElQX1NGTFNJWkUocHNsLT5zbF9tYXgpKTsKKwkJfQorCQlwbWMtPnNmbGlzdCA9IHBzbCA9IG5ld3BzbDsKKwl9CisJcnYgPSAxOwkvKiA+IDAgZm9yIGluc2VydCBsb2dpYyBiZWxvdyBpZiBzbF9jb3VudCBpcyAwICovCisJZm9yIChpPTA7IGk8cHNsLT5zbF9jb3VudDsgaSsrKSB7CisJCXJ2ID0gbWVtY21wKCZwc2wtPnNsX2FkZHJbaV0sICZtcmVxcy0+aW1yX3NvdXJjZWFkZHIsCisJCQlzaXplb2YoX191MzIpKTsKKwkJaWYgKHJ2ID09IDApCisJCQlicmVhazsKKwl9CisJaWYgKHJ2ID09IDApCQkvKiBhZGRyZXNzIGFscmVhZHkgdGhlcmUgaXMgYW4gZXJyb3IgKi8KKwkJZ290byBkb25lOworCWZvciAoaj1wc2wtPnNsX2NvdW50LTE7IGo+PWk7IGotLSkKKwkJcHNsLT5zbF9hZGRyW2orMV0gPSBwc2wtPnNsX2FkZHJbal07CisJcHNsLT5zbF9hZGRyW2ldID0gbXJlcXMtPmltcl9zb3VyY2VhZGRyOworCXBzbC0+c2xfY291bnQrKzsKKwllcnIgPSAwOworCS8qIHVwZGF0ZSB0aGUgaW50ZXJmYWNlIGxpc3QgKi8KKwlpcF9tY19hZGRfc3JjKGluX2RldiwgJm1yZXFzLT5pbXJfbXVsdGlhZGRyLCBvbW9kZSwgMSwgCisJCSZtcmVxcy0+aW1yX3NvdXJjZWFkZHIsIDEpOworZG9uZToKKwlydG5sX3NodW5sb2NrKCk7CisJcmV0dXJuIGVycjsKK30KKworaW50IGlwX21jX21zZmlsdGVyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGlwX21zZmlsdGVyICptc2YsIGludCBpZmluZGV4KQoreworCWludCBlcnI7CisJc3RydWN0IGlwX21yZXFuCWltcjsKKwl1MzIgYWRkciA9IG1zZi0+aW1zZl9tdWx0aWFkZHI7CisJc3RydWN0IGlwX21jX3NvY2tsaXN0ICpwbWM7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlzdHJ1Y3QgaXBfc2Zfc29ja2xpc3QgKm5ld3BzbCwgKnBzbDsKKworCWlmICghTVVMVElDQVNUKGFkZHIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAobXNmLT5pbXNmX2Ztb2RlICE9IE1DQVNUX0lOQ0xVREUgJiYKKwkgICAgbXNmLT5pbXNmX2Ztb2RlICE9IE1DQVNUX0VYQ0xVREUpCisJCXJldHVybiAtRUlOVkFMOworCisJcnRubF9zaGxvY2soKTsKKworCWltci5pbXJfbXVsdGlhZGRyLnNfYWRkciA9IG1zZi0+aW1zZl9tdWx0aWFkZHI7CisJaW1yLmltcl9hZGRyZXNzLnNfYWRkciA9IG1zZi0+aW1zZl9pbnRlcmZhY2U7CisJaW1yLmltcl9pZmluZGV4ID0gaWZpbmRleDsKKwlpbl9kZXYgPSBpcF9tY19maW5kX2RldigmaW1yKTsKKworCWlmICghaW5fZGV2KSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZG9uZTsKKwl9CisJZXJyID0gLUVBRERSTk9UQVZBSUw7CisKKwlmb3IgKHBtYz1pbmV0LT5tY19saXN0OyBwbWM7IHBtYz1wbWMtPm5leHQpIHsKKwkJaWYgKHBtYy0+bXVsdGkuaW1yX211bHRpYWRkci5zX2FkZHIgPT0gbXNmLT5pbXNmX211bHRpYWRkciAmJgorCQkgICAgcG1jLT5tdWx0aS5pbXJfaWZpbmRleCA9PSBpbXIuaW1yX2lmaW5kZXgpCisJCQlicmVhazsKKwl9CisJaWYgKCFwbWMpCQkvKiBtdXN0IGhhdmUgYSBwcmlvciBqb2luICovCisJCWdvdG8gZG9uZTsKKwlpZiAobXNmLT5pbXNmX251bXNyYykgeworCQluZXdwc2wgPSAoc3RydWN0IGlwX3NmX3NvY2tsaXN0ICopc29ja19rbWFsbG9jKHNrLAorCQkJCUlQX1NGTFNJWkUobXNmLT5pbXNmX251bXNyYyksIEdGUF9LRVJORUwpOworCQlpZiAoIW5ld3BzbCkgeworCQkJZXJyID0gLUVOT0JVRlM7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJbmV3cHNsLT5zbF9tYXggPSBuZXdwc2wtPnNsX2NvdW50ID0gbXNmLT5pbXNmX251bXNyYzsKKwkJbWVtY3B5KG5ld3BzbC0+c2xfYWRkciwgbXNmLT5pbXNmX3NsaXN0LAorCQkJbXNmLT5pbXNmX251bXNyYyAqIHNpemVvZihtc2YtPmltc2Zfc2xpc3RbMF0pKTsKKwkJZXJyID0gaXBfbWNfYWRkX3NyYyhpbl9kZXYsICZtc2YtPmltc2ZfbXVsdGlhZGRyLAorCQkJbXNmLT5pbXNmX2Ztb2RlLCBuZXdwc2wtPnNsX2NvdW50LCBuZXdwc2wtPnNsX2FkZHIsIDApOworCQlpZiAoZXJyKSB7CisJCQlzb2NrX2tmcmVlX3Moc2ssIG5ld3BzbCwgSVBfU0ZMU0laRShuZXdwc2wtPnNsX21heCkpOworCQkJZ290byBkb25lOworCQl9CisJfSBlbHNlCisJCW5ld3BzbCA9IE5VTEw7CisJcHNsID0gcG1jLT5zZmxpc3Q7CisJaWYgKHBzbCkgeworCQkodm9pZCkgaXBfbWNfZGVsX3NyYyhpbl9kZXYsICZtc2YtPmltc2ZfbXVsdGlhZGRyLCBwbWMtPnNmbW9kZSwKKwkJCXBzbC0+c2xfY291bnQsIHBzbC0+c2xfYWRkciwgMCk7CisJCXNvY2tfa2ZyZWVfcyhzaywgcHNsLCBJUF9TRkxTSVpFKHBzbC0+c2xfbWF4KSk7CisJfSBlbHNlCisJCSh2b2lkKSBpcF9tY19kZWxfc3JjKGluX2RldiwgJm1zZi0+aW1zZl9tdWx0aWFkZHIsIHBtYy0+c2Ztb2RlLAorCQkJMCwgTlVMTCwgMCk7CisJcG1jLT5zZmxpc3QgPSBuZXdwc2w7CisJcG1jLT5zZm1vZGUgPSBtc2YtPmltc2ZfZm1vZGU7Citkb25lOgorCXJ0bmxfc2h1bmxvY2soKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgaXBfbWNfbXNmZ2V0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGlwX21zZmlsdGVyICptc2YsCisJc3RydWN0IGlwX21zZmlsdGVyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCit7CisJaW50IGVyciwgbGVuLCBjb3VudCwgY29weWNvdW50OworCXN0cnVjdCBpcF9tcmVxbglpbXI7CisJdTMyIGFkZHIgPSBtc2YtPmltc2ZfbXVsdGlhZGRyOworCXN0cnVjdCBpcF9tY19zb2NrbGlzdCAqcG1jOworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisJc3RydWN0IGlwX3NmX3NvY2tsaXN0ICpwc2w7CisKKwlpZiAoIU1VTFRJQ0FTVChhZGRyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlydG5sX3NobG9jaygpOworCisJaW1yLmltcl9tdWx0aWFkZHIuc19hZGRyID0gbXNmLT5pbXNmX211bHRpYWRkcjsKKwlpbXIuaW1yX2FkZHJlc3Muc19hZGRyID0gbXNmLT5pbXNmX2ludGVyZmFjZTsKKwlpbXIuaW1yX2lmaW5kZXggPSAwOworCWluX2RldiA9IGlwX21jX2ZpbmRfZGV2KCZpbXIpOworCisJaWYgKCFpbl9kZXYpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBkb25lOworCX0KKwllcnIgPSAtRUFERFJOT1RBVkFJTDsKKworCWZvciAocG1jPWluZXQtPm1jX2xpc3Q7IHBtYzsgcG1jPXBtYy0+bmV4dCkgeworCQlpZiAocG1jLT5tdWx0aS5pbXJfbXVsdGlhZGRyLnNfYWRkciA9PSBtc2YtPmltc2ZfbXVsdGlhZGRyICYmCisJCSAgICBwbWMtPm11bHRpLmltcl9pZmluZGV4ID09IGltci5pbXJfaWZpbmRleCkKKwkJCWJyZWFrOworCX0KKwlpZiAoIXBtYykJCS8qIG11c3QgaGF2ZSBhIHByaW9yIGpvaW4gKi8KKwkJZ290byBkb25lOworCW1zZi0+aW1zZl9mbW9kZSA9IHBtYy0+c2Ztb2RlOworCXBzbCA9IHBtYy0+c2ZsaXN0OworCXJ0bmxfc2h1bmxvY2soKTsKKwlpZiAoIXBzbCkgeworCQlsZW4gPSAwOworCQljb3VudCA9IDA7CisJfSBlbHNlIHsKKwkJY291bnQgPSBwc2wtPnNsX2NvdW50OworCX0KKwljb3B5Y291bnQgPSBjb3VudCA8IG1zZi0+aW1zZl9udW1zcmMgPyBjb3VudCA6IG1zZi0+aW1zZl9udW1zcmM7CisJbGVuID0gY29weWNvdW50ICogc2l6ZW9mKHBzbC0+c2xfYWRkclswXSk7CisJbXNmLT5pbXNmX251bXNyYyA9IGNvdW50OworCWlmIChwdXRfdXNlcihJUF9NU0ZJTFRFUl9TSVpFKGNvcHljb3VudCksIG9wdGxlbikgfHwKKwkgICAgY29weV90b191c2VyKG9wdHZhbCwgbXNmLCBJUF9NU0ZJTFRFUl9TSVpFKDApKSkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJaWYgKGxlbiAmJgorCSAgICBjb3B5X3RvX3VzZXIoJm9wdHZhbC0+aW1zZl9zbGlzdFswXSwgcHNsLT5zbF9hZGRyLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK2RvbmU6CisJcnRubF9zaHVubG9jaygpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBpcF9tY19nc2ZnZXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgZ3JvdXBfZmlsdGVyICpnc2YsCisJc3RydWN0IGdyb3VwX2ZpbHRlciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoreworCWludCBlcnIsIGksIGNvdW50LCBjb3B5Y291bnQ7CisJc3RydWN0IHNvY2thZGRyX2luICpwc2luOworCXUzMiBhZGRyOworCXN0cnVjdCBpcF9tY19zb2NrbGlzdCAqcG1jOworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlzdHJ1Y3QgaXBfc2Zfc29ja2xpc3QgKnBzbDsKKworCXBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJmdzZi0+Z2ZfZ3JvdXA7CisJaWYgKHBzaW4tPnNpbl9mYW1pbHkgIT0gQUZfSU5FVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJYWRkciA9IHBzaW4tPnNpbl9hZGRyLnNfYWRkcjsKKwlpZiAoIU1VTFRJQ0FTVChhZGRyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlydG5sX3NobG9jaygpOworCisJZXJyID0gLUVBRERSTk9UQVZBSUw7CisKKwlmb3IgKHBtYz1pbmV0LT5tY19saXN0OyBwbWM7IHBtYz1wbWMtPm5leHQpIHsKKwkJaWYgKHBtYy0+bXVsdGkuaW1yX211bHRpYWRkci5zX2FkZHIgPT0gYWRkciAmJgorCQkgICAgcG1jLT5tdWx0aS5pbXJfaWZpbmRleCA9PSBnc2YtPmdmX2ludGVyZmFjZSkKKwkJCWJyZWFrOworCX0KKwlpZiAoIXBtYykJCS8qIG11c3QgaGF2ZSBhIHByaW9yIGpvaW4gKi8KKwkJZ290byBkb25lOworCWdzZi0+Z2ZfZm1vZGUgPSBwbWMtPnNmbW9kZTsKKwlwc2wgPSBwbWMtPnNmbGlzdDsKKwlydG5sX3NodW5sb2NrKCk7CisJY291bnQgPSBwc2wgPyBwc2wtPnNsX2NvdW50IDogMDsKKwljb3B5Y291bnQgPSBjb3VudCA8IGdzZi0+Z2ZfbnVtc3JjID8gY291bnQgOiBnc2YtPmdmX251bXNyYzsKKwlnc2YtPmdmX251bXNyYyA9IGNvdW50OworCWlmIChwdXRfdXNlcihHUk9VUF9GSUxURVJfU0laRShjb3B5Y291bnQpLCBvcHRsZW4pIHx8CisJICAgIGNvcHlfdG9fdXNlcihvcHR2YWwsIGdzZiwgR1JPVVBfRklMVEVSX1NJWkUoMCkpKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlmb3IgKGk9MDsgaTxjb3B5Y291bnQ7IGkrKykgeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnBzaW47CisJCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNzOworCisJCXBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJnNzOworCQltZW1zZXQoJnNzLCAwLCBzaXplb2Yoc3MpKTsKKwkJcHNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCXBzaW4tPnNpbl9hZGRyLnNfYWRkciA9IHBzbC0+c2xfYWRkcltpXTsKKwkJaWYgKGNvcHlfdG9fdXNlcigmb3B0dmFsLT5nZl9zbGlzdFtpXSwgJnNzLCBzaXplb2Yoc3MpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gMDsKK2RvbmU6CisJcnRubF9zaHVubG9jaygpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBjaGVjayBpZiBhIG11bHRpY2FzdCBzb3VyY2UgZmlsdGVyIGFsbG93cyBkZWxpdmVyeSBmb3IgYSBnaXZlbiA8c3JjLGRzdCxpbnRmPgorICovCitpbnQgaXBfbWNfc2ZfYWxsb3coc3RydWN0IHNvY2sgKnNrLCB1MzIgbG9jX2FkZHIsIHUzMiBybXRfYWRkciwgaW50IGRpZikKK3sKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisJc3RydWN0IGlwX21jX3NvY2tsaXN0ICpwbWM7CisJc3RydWN0IGlwX3NmX3NvY2tsaXN0ICpwc2w7CisJaW50IGk7CisKKwlpZiAoIU1VTFRJQ0FTVChsb2NfYWRkcikpCisJCXJldHVybiAxOworCisJZm9yIChwbWM9aW5ldC0+bWNfbGlzdDsgcG1jOyBwbWM9cG1jLT5uZXh0KSB7CisJCWlmIChwbWMtPm11bHRpLmltcl9tdWx0aWFkZHIuc19hZGRyID09IGxvY19hZGRyICYmCisJCSAgICBwbWMtPm11bHRpLmltcl9pZmluZGV4ID09IGRpZikKKwkJCWJyZWFrOworCX0KKwlpZiAoIXBtYykKKwkJcmV0dXJuIDE7CisJcHNsID0gcG1jLT5zZmxpc3Q7CisJaWYgKCFwc2wpCisJCXJldHVybiBwbWMtPnNmbW9kZSA9PSBNQ0FTVF9FWENMVURFOworCisJZm9yIChpPTA7IGk8cHNsLT5zbF9jb3VudDsgaSsrKSB7CisJCWlmIChwc2wtPnNsX2FkZHJbaV0gPT0gcm10X2FkZHIpCisJCQlicmVhazsKKwl9CisJaWYgKHBtYy0+c2Ztb2RlID09IE1DQVNUX0lOQ0xVREUgJiYgaSA+PSBwc2wtPnNsX2NvdW50KQorCQlyZXR1cm4gMDsKKwlpZiAocG1jLT5zZm1vZGUgPT0gTUNBU1RfRVhDTFVERSAmJiBpIDwgcHNsLT5zbF9jb3VudCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKglBIHNvY2tldCBpcyBjbG9zaW5nLgorICovCisKK3ZvaWQgaXBfbWNfZHJvcF9zb2NrZXQoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlzdHJ1Y3QgaXBfbWNfc29ja2xpc3QgKmltbDsKKworCWlmIChpbmV0LT5tY19saXN0ID09IE5VTEwpCisJCXJldHVybjsKKworCXJ0bmxfbG9jaygpOworCXdoaWxlICgoaW1sID0gaW5ldC0+bWNfbGlzdCkgIT0gTlVMTCkgeworCQlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisJCWluZXQtPm1jX2xpc3QgPSBpbWwtPm5leHQ7CisKKwkJaWYgKChpbl9kZXYgPSBpbmV0ZGV2X2J5X2luZGV4KGltbC0+bXVsdGkuaW1yX2lmaW5kZXgpKSAhPSBOVUxMKSB7CisJCQkodm9pZCkgaXBfbWNfbGVhdmVfc3JjKHNrLCBpbWwsIGluX2Rldik7CisJCQlpcF9tY19kZWNfZ3JvdXAoaW5fZGV2LCBpbWwtPm11bHRpLmltcl9tdWx0aWFkZHIuc19hZGRyKTsKKwkJCWluX2Rldl9wdXQoaW5fZGV2KTsKKwkJfQorCQlzb2NrX2tmcmVlX3Moc2ssIGltbCwgc2l6ZW9mKCppbWwpKTsKKworCX0KKwlydG5sX3VubG9jaygpOworfQorCitpbnQgaXBfY2hlY2tfbWMoc3RydWN0IGluX2RldmljZSAqaW5fZGV2LCB1MzIgbWNfYWRkciwgdTMyIHNyY19hZGRyLCB1MTYgcHJvdG8pCit7CisJc3RydWN0IGlwX21jX2xpc3QgKmltOworCXN0cnVjdCBpcF9zZl9saXN0ICpwc2Y7CisJaW50IHJ2ID0gMDsKKworCXJlYWRfbG9jaygmaW5fZGV2LT5tY19saXN0X2xvY2spOworCWZvciAoaW09aW5fZGV2LT5tY19saXN0OyBpbTsgaW09aW0tPm5leHQpIHsKKwkJaWYgKGltLT5tdWx0aWFkZHIgPT0gbWNfYWRkcikKKwkJCWJyZWFrOworCX0KKwlpZiAoaW0gJiYgcHJvdG8gPT0gSVBQUk9UT19JR01QKSB7CisJCXJ2ID0gMTsKKwl9IGVsc2UgaWYgKGltKSB7CisJCWlmIChzcmNfYWRkcikgeworCQkJZm9yIChwc2Y9aW0tPnNvdXJjZXM7IHBzZjsgcHNmPXBzZi0+c2ZfbmV4dCkgeworCQkJCWlmIChwc2YtPnNmX2luYWRkciA9PSBzcmNfYWRkcikKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAocHNmKQorCQkJCXJ2ID0gcHNmLT5zZl9jb3VudFtNQ0FTVF9JTkNMVURFXSB8fAorCQkJCQlwc2YtPnNmX2NvdW50W01DQVNUX0VYQ0xVREVdICE9CisJCQkJCWltLT5zZmNvdW50W01DQVNUX0VYQ0xVREVdOworCQkJZWxzZQorCQkJCXJ2ID0gaW0tPnNmY291bnRbTUNBU1RfRVhDTFVERV0gIT0gMDsKKwkJfSBlbHNlCisJCQlydiA9IDE7IC8qIHVuc3BlY2lmaWVkIHNvdXJjZTsgdGVudGF0aXZlbHkgYWxsb3cgKi8KKwl9CisJcmVhZF91bmxvY2soJmluX2Rldi0+bWNfbGlzdF9sb2NrKTsKKwlyZXR1cm4gcnY7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKQorc3RydWN0IGlnbXBfbWNfaXRlcl9zdGF0ZSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7Cit9OworCisjZGVmaW5lCWlnbXBfbWNfc2VxX3ByaXZhdGUoc2VxKQkoKHN0cnVjdCBpZ21wX21jX2l0ZXJfc3RhdGUgKikoc2VxKS0+cHJpdmF0ZSkKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfbWNfbGlzdCAqaWdtcF9tY19nZXRfZmlyc3Qoc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc3RydWN0IGlwX21jX2xpc3QgKmltID0gTlVMTDsKKwlzdHJ1Y3QgaWdtcF9tY19pdGVyX3N0YXRlICpzdGF0ZSA9IGlnbXBfbWNfc2VxX3ByaXZhdGUoc2VxKTsKKworCWZvciAoc3RhdGUtPmRldiA9IGRldl9iYXNlLCBzdGF0ZS0+aW5fZGV2ID0gTlVMTDsKKwkgICAgIHN0YXRlLT5kZXY7IAorCSAgICAgc3RhdGUtPmRldiA9IHN0YXRlLT5kZXYtPm5leHQpIHsKKwkJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCQlpbl9kZXYgPSBpbl9kZXZfZ2V0KHN0YXRlLT5kZXYpOworCQlpZiAoIWluX2RldikKKwkJCWNvbnRpbnVlOworCQlyZWFkX2xvY2soJmluX2Rldi0+bWNfbGlzdF9sb2NrKTsKKwkJaW0gPSBpbl9kZXYtPm1jX2xpc3Q7CisJCWlmIChpbSkgeworCQkJc3RhdGUtPmluX2RldiA9IGluX2RldjsKKwkJCWJyZWFrOworCQl9CisJCXJlYWRfdW5sb2NrKCZpbl9kZXYtPm1jX2xpc3RfbG9jayk7CisJCWluX2Rldl9wdXQoaW5fZGV2KTsKKwl9CisJcmV0dXJuIGltOworfQorCitzdGF0aWMgc3RydWN0IGlwX21jX2xpc3QgKmlnbXBfbWNfZ2V0X25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBpcF9tY19saXN0ICppbSkKK3sKKwlzdHJ1Y3QgaWdtcF9tY19pdGVyX3N0YXRlICpzdGF0ZSA9IGlnbXBfbWNfc2VxX3ByaXZhdGUoc2VxKTsKKwlpbSA9IGltLT5uZXh0OworCXdoaWxlICghaW0pIHsKKwkJaWYgKGxpa2VseShzdGF0ZS0+aW5fZGV2ICE9IE5VTEwpKSB7CisJCQlyZWFkX3VubG9jaygmc3RhdGUtPmluX2Rldi0+bWNfbGlzdF9sb2NrKTsKKwkJCWluX2Rldl9wdXQoc3RhdGUtPmluX2Rldik7CisJCX0KKwkJc3RhdGUtPmRldiA9IHN0YXRlLT5kZXYtPm5leHQ7CisJCWlmICghc3RhdGUtPmRldikgeworCQkJc3RhdGUtPmluX2RldiA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCQlzdGF0ZS0+aW5fZGV2ID0gaW5fZGV2X2dldChzdGF0ZS0+ZGV2KTsKKwkJaWYgKCFzdGF0ZS0+aW5fZGV2KQorCQkJY29udGludWU7CisJCXJlYWRfbG9jaygmc3RhdGUtPmluX2Rldi0+bWNfbGlzdF9sb2NrKTsKKwkJaW0gPSBzdGF0ZS0+aW5fZGV2LT5tY19saXN0OworCX0KKwlyZXR1cm4gaW07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXBfbWNfbGlzdCAqaWdtcF9tY19nZXRfaWR4KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBpcF9tY19saXN0ICppbSA9IGlnbXBfbWNfZ2V0X2ZpcnN0KHNlcSk7CisJaWYgKGltKQorCQl3aGlsZSAocG9zICYmIChpbSA9IGlnbXBfbWNfZ2V0X25leHQoc2VxLCBpbSkpICE9IE5VTEwpCisJCQktLXBvczsKKwlyZXR1cm4gcG9zID8gTlVMTCA6IGltOworfQorCitzdGF0aWMgdm9pZCAqaWdtcF9tY19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXJlYWRfbG9jaygmZGV2X2Jhc2VfbG9jayk7CisJcmV0dXJuICpwb3MgPyBpZ21wX21jX2dldF9pZHgoc2VxLCAqcG9zIC0gMSkgOiBTRVFfU1RBUlRfVE9LRU47Cit9CisKK3N0YXRpYyB2b2lkICppZ21wX21jX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaXBfbWNfbGlzdCAqaW07CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlpbSA9IGlnbXBfbWNfZ2V0X2ZpcnN0KHNlcSk7CisJZWxzZQorCQlpbSA9IGlnbXBfbWNfZ2V0X25leHQoc2VxLCB2KTsKKwkrKypwb3M7CisJcmV0dXJuIGltOworfQorCitzdGF0aWMgdm9pZCBpZ21wX21jX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBpZ21wX21jX2l0ZXJfc3RhdGUgKnN0YXRlID0gaWdtcF9tY19zZXFfcHJpdmF0ZShzZXEpOworCWlmIChsaWtlbHkoc3RhdGUtPmluX2RldiAhPSBOVUxMKSkgeworCQlyZWFkX3VubG9jaygmc3RhdGUtPmluX2Rldi0+bWNfbGlzdF9sb2NrKTsKKwkJaW5fZGV2X3B1dChzdGF0ZS0+aW5fZGV2KTsKKwkJc3RhdGUtPmluX2RldiA9IE5VTEw7CisJfQorCXN0YXRlLT5kZXYgPSBOVUxMOworCXJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsKK30KKworc3RhdGljIGludCBpZ21wX21jX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKKwkJc2VxX3B1dHMoc2VxLCAKKwkJCSAiSWR4XHREZXZpY2UgICAgOiBDb3VudCBRdWVyaWVyXHRHcm91cCAgICBVc2VycyBUaW1lclx0UmVwb3J0ZXJcbiIpOworCWVsc2UgeworCQlzdHJ1Y3QgaXBfbWNfbGlzdCAqaW0gPSAoc3RydWN0IGlwX21jX2xpc3QgKil2OworCQlzdHJ1Y3QgaWdtcF9tY19pdGVyX3N0YXRlICpzdGF0ZSA9IGlnbXBfbWNfc2VxX3ByaXZhdGUoc2VxKTsKKwkJY2hhciAgICpxdWVyaWVyOworI2lmZGVmIENPTkZJR19JUF9NVUxUSUNBU1QKKwkJcXVlcmllciA9IElHTVBfVjFfU0VFTihzdGF0ZS0+aW5fZGV2KSA/ICJWMSIgOgorCQkJICBJR01QX1YyX1NFRU4oc3RhdGUtPmluX2RldikgPyAiVjIiIDoKKwkJCSAgIlYzIjsKKyNlbHNlCisJCXF1ZXJpZXIgPSAiTk9ORSI7CisjZW5kaWYKKworCQlpZiAoc3RhdGUtPmluX2Rldi0+bWNfbGlzdCA9PSBpbSkgeworCQkJc2VxX3ByaW50ZihzZXEsICIlZFx0JS0xMHM6ICU1ZCAlN3NcbiIsCisJCQkJICAgc3RhdGUtPmRldi0+aWZpbmRleCwgc3RhdGUtPmRldi0+bmFtZSwgc3RhdGUtPmRldi0+bWNfY291bnQsIHF1ZXJpZXIpOworCQl9CisKKwkJc2VxX3ByaW50ZihzZXEsCisJCQkgICAiXHRcdFx0XHQlMDhsWCAlNWQgJWQ6JTA4bFhcdFx0JWRcbiIsCisJCQkgICBpbS0+bXVsdGlhZGRyLCBpbS0+dXNlcnMsCisJCQkgICBpbS0+dG1fcnVubmluZywgaW0tPnRtX3J1bm5pbmcgPworCQkJICAgamlmZmllc190b19jbG9ja190KGltLT50aW1lci5leHBpcmVzLWppZmZpZXMpIDogMCwKKwkJCSAgIGltLT5yZXBvcnRlcik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGlnbXBfbWNfc2VxX29wcyA9IHsKKwkuc3RhcnQJPQlpZ21wX21jX3NlcV9zdGFydCwKKwkubmV4dAk9CWlnbXBfbWNfc2VxX25leHQsCisJLnN0b3AJPQlpZ21wX21jX3NlcV9zdG9wLAorCS5zaG93CT0JaWdtcF9tY19zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgaWdtcF9tY19zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKKwlpbnQgcmMgPSAtRU5PTUVNOworCXN0cnVjdCBpZ21wX21jX2l0ZXJfc3RhdGUgKnMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOworCisJaWYgKCFzKQorCQlnb3RvIG91dDsKKwlyYyA9IHNlcV9vcGVuKGZpbGUsICZpZ21wX21jX3NlcV9vcHMpOworCWlmIChyYykKKwkJZ290byBvdXRfa2ZyZWU7CisKKwlzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc2VxLT5wcml2YXRlID0gczsKKwltZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7CitvdXQ6CisJcmV0dXJuIHJjOworb3V0X2tmcmVlOgorCWtmcmVlKHMpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpZ21wX21jX3NlcV9mb3BzID0geworCS5vd25lcgkJPQlUSElTX01PRFVMRSwKKwkub3BlbgkJPQlpZ21wX21jX3NlcV9vcGVuLAorCS5yZWFkCQk9CXNlcV9yZWFkLAorCS5sbHNlZWsJCT0Jc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0Jc2VxX3JlbGVhc2VfcHJpdmF0ZSwKK307CisKK3N0cnVjdCBpZ21wX21jZl9pdGVyX3N0YXRlIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBpbl9kZXZpY2UgKmlkZXY7CisJc3RydWN0IGlwX21jX2xpc3QgKmltOworfTsKKworI2RlZmluZSBpZ21wX21jZl9zZXFfcHJpdmF0ZShzZXEpCSgoc3RydWN0IGlnbXBfbWNmX2l0ZXJfc3RhdGUgKikoc2VxKS0+cHJpdmF0ZSkKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfc2ZfbGlzdCAqaWdtcF9tY2ZfZ2V0X2ZpcnN0KHN0cnVjdCBzZXFfZmlsZSAqc2VxKQoreworCXN0cnVjdCBpcF9zZl9saXN0ICpwc2YgPSBOVUxMOworCXN0cnVjdCBpcF9tY19saXN0ICppbSA9IE5VTEw7CisJc3RydWN0IGlnbXBfbWNmX2l0ZXJfc3RhdGUgKnN0YXRlID0gaWdtcF9tY2Zfc2VxX3ByaXZhdGUoc2VxKTsKKworCWZvciAoc3RhdGUtPmRldiA9IGRldl9iYXNlLCBzdGF0ZS0+aWRldiA9IE5VTEwsIHN0YXRlLT5pbSA9IE5VTEw7CisJICAgICBzdGF0ZS0+ZGV2OyAKKwkgICAgIHN0YXRlLT5kZXYgPSBzdGF0ZS0+ZGV2LT5uZXh0KSB7CisJCXN0cnVjdCBpbl9kZXZpY2UgKmlkZXY7CisJCWlkZXYgPSBpbl9kZXZfZ2V0KHN0YXRlLT5kZXYpOworCQlpZiAodW5saWtlbHkoaWRldiA9PSBOVUxMKSkKKwkJCWNvbnRpbnVlOworCQlyZWFkX2xvY2soJmlkZXYtPm1jX2xpc3RfbG9jayk7CisJCWltID0gaWRldi0+bWNfbGlzdDsKKwkJaWYgKGxpa2VseShpbSAhPSBOVUxMKSkgeworCQkJc3Bpbl9sb2NrX2JoKCZpbS0+bG9jayk7CisJCQlwc2YgPSBpbS0+c291cmNlczsKKwkJCWlmIChsaWtlbHkocHNmICE9IE5VTEwpKSB7CisJCQkJc3RhdGUtPmltID0gaW07CisJCQkJc3RhdGUtPmlkZXYgPSBpZGV2OworCQkJCWJyZWFrOworCQkJfQorCQkJc3Bpbl91bmxvY2tfYmgoJmltLT5sb2NrKTsKKwkJfQorCQlyZWFkX3VubG9jaygmaWRldi0+bWNfbGlzdF9sb2NrKTsKKwkJaW5fZGV2X3B1dChpZGV2KTsKKwl9CisJcmV0dXJuIHBzZjsKK30KKworc3RhdGljIHN0cnVjdCBpcF9zZl9saXN0ICppZ21wX21jZl9nZXRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IGlwX3NmX2xpc3QgKnBzZikKK3sKKwlzdHJ1Y3QgaWdtcF9tY2ZfaXRlcl9zdGF0ZSAqc3RhdGUgPSBpZ21wX21jZl9zZXFfcHJpdmF0ZShzZXEpOworCisJcHNmID0gcHNmLT5zZl9uZXh0OworCXdoaWxlICghcHNmKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZzdGF0ZS0+aW0tPmxvY2spOworCQlzdGF0ZS0+aW0gPSBzdGF0ZS0+aW0tPm5leHQ7CisJCXdoaWxlICghc3RhdGUtPmltKSB7CisJCQlpZiAobGlrZWx5KHN0YXRlLT5pZGV2ICE9IE5VTEwpKSB7CisJCQkJcmVhZF91bmxvY2soJnN0YXRlLT5pZGV2LT5tY19saXN0X2xvY2spOworCQkJCWluX2Rldl9wdXQoc3RhdGUtPmlkZXYpOworCQkJfQorCQkJc3RhdGUtPmRldiA9IHN0YXRlLT5kZXYtPm5leHQ7CisJCQlpZiAoIXN0YXRlLT5kZXYpIHsKKwkJCQlzdGF0ZS0+aWRldiA9IE5VTEw7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlzdGF0ZS0+aWRldiA9IGluX2Rldl9nZXQoc3RhdGUtPmRldik7CisJCQlpZiAoIXN0YXRlLT5pZGV2KQorCQkJCWNvbnRpbnVlOworCQkJcmVhZF9sb2NrKCZzdGF0ZS0+aWRldi0+bWNfbGlzdF9sb2NrKTsKKwkJCXN0YXRlLT5pbSA9IHN0YXRlLT5pZGV2LT5tY19saXN0OworCQl9CisJCWlmICghc3RhdGUtPmltKQorCQkJYnJlYWs7CisJCXNwaW5fbG9ja19iaCgmc3RhdGUtPmltLT5sb2NrKTsKKwkJcHNmID0gc3RhdGUtPmltLT5zb3VyY2VzOworCX0KK291dDoKKwlyZXR1cm4gcHNmOworfQorCitzdGF0aWMgc3RydWN0IGlwX3NmX2xpc3QgKmlnbXBfbWNmX2dldF9pZHgoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCBwb3MpCit7CisJc3RydWN0IGlwX3NmX2xpc3QgKnBzZiA9IGlnbXBfbWNmX2dldF9maXJzdChzZXEpOworCWlmIChwc2YpCisJCXdoaWxlIChwb3MgJiYgKHBzZiA9IGlnbXBfbWNmX2dldF9uZXh0KHNlcSwgcHNmKSkgIT0gTlVMTCkKKwkJCS0tcG9zOworCXJldHVybiBwb3MgPyBOVUxMIDogcHNmOworfQorCitzdGF0aWMgdm9pZCAqaWdtcF9tY2Zfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOworCXJldHVybiAqcG9zID8gaWdtcF9tY2ZfZ2V0X2lkeChzZXEsICpwb3MgLSAxKSA6IFNFUV9TVEFSVF9UT0tFTjsKK30KKworc3RhdGljIHZvaWQgKmlnbXBfbWNmX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaXBfc2ZfbGlzdCAqcHNmOworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKKwkJcHNmID0gaWdtcF9tY2ZfZ2V0X2ZpcnN0KHNlcSk7CisJZWxzZQorCQlwc2YgPSBpZ21wX21jZl9nZXRfbmV4dChzZXEsIHYpOworCSsrKnBvczsKKwlyZXR1cm4gcHNmOworfQorCitzdGF0aWMgdm9pZCBpZ21wX21jZl9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaWdtcF9tY2ZfaXRlcl9zdGF0ZSAqc3RhdGUgPSBpZ21wX21jZl9zZXFfcHJpdmF0ZShzZXEpOworCWlmIChsaWtlbHkoc3RhdGUtPmltICE9IE5VTEwpKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZzdGF0ZS0+aW0tPmxvY2spOworCQlzdGF0ZS0+aW0gPSBOVUxMOworCX0KKwlpZiAobGlrZWx5KHN0YXRlLT5pZGV2ICE9IE5VTEwpKSB7CisJCXJlYWRfdW5sb2NrKCZzdGF0ZS0+aWRldi0+bWNfbGlzdF9sb2NrKTsKKwkJaW5fZGV2X3B1dChzdGF0ZS0+aWRldik7CisJCXN0YXRlLT5pZGV2ID0gTlVMTDsKKwl9CisJc3RhdGUtPmRldiA9IE5VTEw7CisJcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOworfQorCitzdGF0aWMgaW50IGlnbXBfbWNmX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBpcF9zZl9saXN0ICpwc2YgPSAoc3RydWN0IGlwX3NmX2xpc3QgKil2OworCXN0cnVjdCBpZ21wX21jZl9pdGVyX3N0YXRlICpzdGF0ZSA9IGlnbXBfbWNmX3NlcV9wcml2YXRlKHNlcSk7CisKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJc2VxX3ByaW50ZihzZXEsIAorCQkJICAgIiUzcyAlNnMgIgorCQkJICAgIiUxMHMgJTEwcyAlNnMgJTZzXG4iLCAiSWR4IiwKKwkJCSAgICJEZXZpY2UiLCAiTUNBIiwKKwkJCSAgICJTUkMiLCAiSU5DIiwgIkVYQyIpOworCX0gZWxzZSB7CisJCXNlcV9wcmludGYoc2VxLAorCQkJICAgIiUzZCAlNi42cyAweCUwOHggIgorCQkJICAgIjB4JTA4eCAlNmx1ICU2bHVcbiIsIAorCQkJICAgc3RhdGUtPmRldi0+aWZpbmRleCwgc3RhdGUtPmRldi0+bmFtZSwgCisJCQkgICBudG9obChzdGF0ZS0+aW0tPm11bHRpYWRkciksCisJCQkgICBudG9obChwc2YtPnNmX2luYWRkciksCisJCQkgICBwc2YtPnNmX2NvdW50W01DQVNUX0lOQ0xVREVdLAorCQkJICAgcHNmLT5zZl9jb3VudFtNQ0FTVF9FWENMVURFXSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGlnbXBfbWNmX3NlcV9vcHMgPSB7CisJLnN0YXJ0CT0JaWdtcF9tY2Zfc2VxX3N0YXJ0LAorCS5uZXh0CT0JaWdtcF9tY2Zfc2VxX25leHQsCisJLnN0b3AJPQlpZ21wX21jZl9zZXFfc3RvcCwKKwkuc2hvdwk9CWlnbXBfbWNmX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBpZ21wX21jZl9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKKwlpbnQgcmMgPSAtRU5PTUVNOworCXN0cnVjdCBpZ21wX21jZl9pdGVyX3N0YXRlICpzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKworCWlmICghcykKKwkJZ290byBvdXQ7CisJcmMgPSBzZXFfb3BlbihmaWxlLCAmaWdtcF9tY2Zfc2VxX29wcyk7CisJaWYgKHJjKQorCQlnb3RvIG91dF9rZnJlZTsKKworCXNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzZXEtPnByaXZhdGUgPSBzOworCW1lbXNldChzLCAwLCBzaXplb2YoKnMpKTsKK291dDoKKwlyZXR1cm4gcmM7CitvdXRfa2ZyZWU6CisJa2ZyZWUocyk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlnbXBfbWNmX3NlcV9mb3BzID0geworCS5vd25lcgkJPQlUSElTX01PRFVMRSwKKwkub3BlbgkJPQlpZ21wX21jZl9zZXFfb3BlbiwKKwkucmVhZAkJPQlzZXFfcmVhZCwKKwkubGxzZWVrCQk9CXNlcV9sc2VlaywKKwkucmVsZWFzZQk9CXNlcV9yZWxlYXNlX3ByaXZhdGUsCit9OworCitpbnQgX19pbml0IGlnbXBfbWNfcHJvY19pbml0KHZvaWQpCit7CisJcHJvY19uZXRfZm9wc19jcmVhdGUoImlnbXAiLCBTX0lSVUdPLCAmaWdtcF9tY19zZXFfZm9wcyk7CisJcHJvY19uZXRfZm9wc19jcmVhdGUoIm1jZmlsdGVyIiwgU19JUlVHTywgJmlnbXBfbWNmX3NlcV9mb3BzKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitFWFBPUlRfU1lNQk9MKGlwX21jX2RlY19ncm91cCk7CitFWFBPUlRfU1lNQk9MKGlwX21jX2luY19ncm91cCk7CitFWFBPUlRfU1lNQk9MKGlwX21jX2pvaW5fZ3JvdXApOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaW5ldHBlZXIuYyBiL25ldC9pcHY0L2luZXRwZWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU0NzM5NQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L2luZXRwZWVyLmMKQEAgLTAsMCArMSw0NjAgQEAKKy8qCisgKgkJSU5FVFBFRVIgLSBBIHN0b3JhZ2UgZm9yIHBlcm1hbmVudCBpbmZvcm1hdGlvbiBhYm91dCBwZWVycworICoKKyAqICBUaGlzIHNvdXJjZSBpcyBjb3ZlcmVkIGJ5IHRoZSBHTlUgR1BMLCB0aGUgc2FtZSBhcyBhbGwga2VybmVsIHNvdXJjZXMuCisgKgorICogIFZlcnNpb246CSRJZDogaW5ldHBlZXIuYyx2IDEuNyAyMDAxLzA5LzIwIDIxOjIyOjUwIGRhdmVtIEV4cCAkCisgKgorICogIEF1dGhvcnM6CUFuZHJleSBWLiBTYXZvY2hraW4gPHNhd0Btc3UucnU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPG5ldC9pbmV0cGVlci5oPgorCisvKgorICogIFRoZW9yeSBvZiBvcGVyYXRpb25zLgorICogIFdlIGtlZXAgb25lIGVudHJ5IGZvciBlYWNoIHBlZXIgSVAgYWRkcmVzcy4gIFRoZSBub2RlcyBjb250YWlucyBsb25nLWxpdmluZworICogIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwZWVyIHdoaWNoIGRvZXNuJ3QgZGVwZW5kIG9uIHJvdXRlcy4KKyAqICBBdCB0aGlzIG1vbWVudCB0aGlzIGluZm9ybWF0aW9uIGNvbnNpc3RzIG9ubHkgb2YgSUQgZmllbGQgZm9yIHRoZSBuZXh0CisgKiAgb3V0Z29pbmcgSVAgcGFja2V0LiAgVGhpcyBmaWVsZCBpcyBpbmNyZW1lbnRlZCB3aXRoIGVhY2ggcGFja2V0IGFzIGVuY29kZWQKKyAqICBpbiBpbmV0X2dldGlkKCkgZnVuY3Rpb24gKGluY2x1ZGUvbmV0L2luZXRwZWVyLmgpLgorICogIEF0IHRoZSBtb21lbnQgb2Ygd3JpdGluZyB0aGlzIG5vdGVzIGlkZW50aWZpZXIgb2YgSVAgcGFja2V0cyBpcyBnZW5lcmF0ZWQKKyAqICB0byBiZSB1bnByZWRpY3RhYmxlIHVzaW5nIHRoaXMgY29kZSBvbmx5IGZvciBwYWNrZXRzIHN1YmplY3RlZAorICogIChhY3R1YWxseSBvciBwb3RlbnRpYWxseSkgdG8gZGVmcmFnbWVudGF0aW9uLiAgSS5lLiBERiBwYWNrZXRzIGxlc3MgdGhhbgorICogIFBNVFUgaW4gc2l6ZSB1c2VzIGEgY29uc3RhbnQgSUQgYW5kIGRvIG5vdCB1c2UgdGhpcyBjb2RlIChzZWUKKyAqICBpcF9zZWxlY3RfaWRlbnQoKSBpbiBpbmNsdWRlL25ldC9pcC5oKS4KKyAqCisgKiAgUm91dGUgY2FjaGUgZW50cmllcyBob2xkIHJlZmVyZW5jZXMgdG8gb3VyIG5vZGVzLgorICogIE5ldyBjYWNoZSBlbnRyaWVzIGdldCByZWZlcmVuY2VzIHZpYSBsb29rdXAgYnkgZGVzdGluYXRpb24gSVAgYWRkcmVzcyBpbgorICogIHRoZSBhdmwgdHJlZS4gIFRoZSByZWZlcmVuY2UgaXMgZ3JhYmJlZCBvbmx5IHdoZW4gaXQncyBuZWVkZWQgaS5lLiBvbmx5CisgKiAgd2hlbiB3ZSB0cnkgdG8gb3V0cHV0IElQIHBhY2tldCB3aGljaCBuZWVkcyBhbiB1bnByZWRpY3RhYmxlIElEIChzZWUKKyAqICBfX2lwX3NlbGVjdF9pZGVudCgpIGluIG5ldC9pcHY0L3JvdXRlLmMpLgorICogIE5vZGVzIGFyZSByZW1vdmVkIG9ubHkgd2hlbiByZWZlcmVuY2UgY291bnRlciBnb2VzIHRvIDAuCisgKiAgV2hlbiBpdCdzIGhhcHBlbmVkIHRoZSBub2RlIG1heSBiZSByZW1vdmVkIHdoZW4gYSBzdWZmaWNpZW50IGFtb3VudCBvZgorICogIHRpbWUgaGFzIGJlZW4gcGFzc2VkIHNpbmNlIGl0cyBsYXN0IHVzZS4gIFRoZSBsZXNzLXJlY2VudGx5LXVzZWQgZW50cnkgY2FuCisgKiAgYWxzbyBiZSByZW1vdmVkIGlmIHRoZSBwb29sIGlzIG92ZXJsb2FkZWQgaS5lLiBpZiB0aGUgdG90YWwgYW1vdW50IG9mCisgKiAgZW50cmllcyBpcyBncmVhdGVyLW9yLWVxdWFsIHRoYW4gdGhlIHRocmVzaG9sZC4KKyAqCisgKiAgTm9kZSBwb29sIGlzIG9yZ2FuaXNlZCBhcyBhbiBBVkwgdHJlZS4KKyAqICBTdWNoIGFuIGltcGxlbWVudGF0aW9uIGhhcyBiZWVuIGNob3NlbiBub3QganVzdCBmb3IgZnVuLiAgSXQncyBhIHdheSB0bworICogIHByZXZlbnQgZWFzeSBhbmQgZWZmaWNpZW50IERvUyBhdHRhY2tzIGJ5IGNyZWF0aW5nIGhhc2ggY29sbGlzaW9ucy4gIEEgaHVnZQorICogIGFtb3VudCBvZiBsb25nIGxpdmluZyBub2RlcyBpbiBhIHNpbmdsZSBoYXNoIHNsb3Qgd291bGQgc2lnbmlmaWNhbnRseSBkZWxheQorICogIGxvb2t1cHMgcGVyZm9ybWVkIHdpdGggZGlzYWJsZWQgQkhzLgorICoKKyAqICBTZXJpYWxpc2F0aW9uIGlzc3Vlcy4KKyAqICAxLiAgTm9kZXMgbWF5IGFwcGVhciBpbiB0aGUgdHJlZSBvbmx5IHdpdGggdGhlIHBvb2wgd3JpdGUgbG9jayBoZWxkLgorICogIDIuICBOb2RlcyBtYXkgZGlzYXBwZWFyIGZyb20gdGhlIHRyZWUgb25seSB3aXRoIHRoZSBwb29sIHdyaXRlIGxvY2sgaGVsZAorICogICAgICBBTkQgcmVmZXJlbmNlIGNvdW50IGJlaW5nIDAuCisgKiAgMy4gIE5vZGVzIGFwcGVhcnMgYW5kIGRpc2FwcGVhcnMgZnJvbSB1bnVzZWQgbm9kZSBsaXN0IG9ubHkgdW5kZXIKKyAqICAgICAgImluZXRfcGVlcl91bnVzZWRfbG9jayIuCisgKiAgNC4gIEdsb2JhbCB2YXJpYWJsZSBwZWVyX3RvdGFsIGlzIG1vZGlmaWVkIHVuZGVyIHRoZSBwb29sIGxvY2suCisgKiAgNS4gIHN0cnVjdCBpbmV0X3BlZXIgZmllbGRzIG1vZGlmaWNhdGlvbjoKKyAqCQlhdmxfbGVmdCwgYXZsX3JpZ2h0LCBhdmxfcGFyZW50LCBhdmxfaGVpZ2h0OiBwb29sIGxvY2sKKyAqCQl1bnVzZWRfbmV4dCwgdW51c2VkX3ByZXZwOiB1bnVzZWQgbm9kZSBsaXN0IGxvY2sKKyAqCQlyZWZjbnQ6IGF0b21pY2FsbHkgYWdhaW5zdCBtb2RpZmljYXRpb25zIG9uIG90aGVyIENQVTsKKyAqCQkgICB1c3VhbGx5IHVuZGVyIHNvbWUgb3RoZXIgbG9jayB0byBwcmV2ZW50IG5vZGUgZGlzYXBwZWFyaW5nCisgKgkJZHRpbWU6IHVudXNlZCBub2RlIGxpc3QgbG9jaworICoJCXY0ZGFkZHI6IHVuY2hhbmdlYWJsZQorICoJCWlwX2lkX2NvdW50OiBpZGxvY2sKKyAqLworCisvKiBFeHBvcnRlZCBmb3IgaW5ldF9nZXRpZCBpbmxpbmUgZnVuY3Rpb24uICAqLworREVGSU5FX1NQSU5MT0NLKGluZXRfcGVlcl9pZGxvY2spOworCitzdGF0aWMga21lbV9jYWNoZV90ICpwZWVyX2NhY2hlcDsKKworI2RlZmluZSBub2RlX2hlaWdodCh4KSB4LT5hdmxfaGVpZ2h0CitzdGF0aWMgc3RydWN0IGluZXRfcGVlciBwZWVyX2Zha2Vfbm9kZSA9IHsKKwkuYXZsX2xlZnQJPSAmcGVlcl9mYWtlX25vZGUsCisJLmF2bF9yaWdodAk9ICZwZWVyX2Zha2Vfbm9kZSwKKwkuYXZsX2hlaWdodAk9IDAKK307CisjZGVmaW5lIHBlZXJfYXZsX2VtcHR5ICgmcGVlcl9mYWtlX25vZGUpCitzdGF0aWMgc3RydWN0IGluZXRfcGVlciAqcGVlcl9yb290ID0gcGVlcl9hdmxfZW1wdHk7CitzdGF0aWMgREVGSU5FX1JXTE9DSyhwZWVyX3Bvb2xfbG9jayk7CisjZGVmaW5lIFBFRVJfTUFYREVQVEggNDAgLyogc3VmZmljaWVudCBmb3IgYWJvdXQgMl4yNyBub2RlcyAqLworCitzdGF0aWMgdm9sYXRpbGUgaW50IHBlZXJfdG90YWw7CisvKiBFeHBvcnRlZCBmb3Igc3lzY3RsX25ldF9pcHY0LiAgKi8KK2ludCBpbmV0X3BlZXJfdGhyZXNob2xkID0gNjU1MzYgKyAxMjg7CS8qIHN0YXJ0IHRvIHRocm93IGVudHJpZXMgbW9yZQorCQkJCQkgKiBhZ2dyZXNzaXZlbHkgYXQgdGhpcyBzdGFnZSAqLworaW50IGluZXRfcGVlcl9taW50dGwgPSAxMjAgKiBIWjsJLyogVFRMIHVuZGVyIGhpZ2ggbG9hZDogMTIwIHNlYyAqLworaW50IGluZXRfcGVlcl9tYXh0dGwgPSAxMCAqIDYwICogSFo7CS8qIHVzdWFsIHRpbWUgdG8gbGl2ZTogMTAgbWluICovCisKK3N0YXRpYyBzdHJ1Y3QgaW5ldF9wZWVyICppbmV0X3BlZXJfdW51c2VkX2hlYWQ7CisvKiBFeHBvcnRlZCBmb3IgaW5ldF9wdXRwZWVyIGlubGluZSBmdW5jdGlvbi4gICovCitzdHJ1Y3QgaW5ldF9wZWVyICoqaW5ldF9wZWVyX3VudXNlZF90YWlscCA9ICZpbmV0X3BlZXJfdW51c2VkX2hlYWQ7CitERUZJTkVfU1BJTkxPQ0soaW5ldF9wZWVyX3VudXNlZF9sb2NrKTsKKyNkZWZpbmUgUEVFUl9NQVhfQ0xFQU5VUF9XT1JLIDMwCisKK3N0YXRpYyB2b2lkIHBlZXJfY2hlY2tfZXhwaXJlKHVuc2lnbmVkIGxvbmcgZHVtbXkpOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHBlZXJfcGVyaW9kaWNfdGltZXIgPQorCVRJTUVSX0lOSVRJQUxJWkVSKHBlZXJfY2hlY2tfZXhwaXJlLCAwLCAwKTsKKworLyogRXhwb3J0ZWQgZm9yIHN5c2N0bF9uZXRfaXB2NC4gICovCitpbnQgaW5ldF9wZWVyX2djX21pbnRpbWUgPSAxMCAqIEhaLAorICAgIGluZXRfcGVlcl9nY19tYXh0aW1lID0gMTIwICogSFo7CisKKy8qIENhbGxlZCBmcm9tIGlwX291dHB1dC5jOmlwX2luaXQgICovCit2b2lkIF9faW5pdCBpbmV0X2luaXRwZWVycyh2b2lkKQoreworCXN0cnVjdCBzeXNpbmZvIHNpOworCisJLyogVXNlIHRoZSBzdHJhaWdodCBpbnRlcmZhY2UgdG8gaW5mb3JtYXRpb24gYWJvdXQgbWVtb3J5LiAqLworCXNpX21lbWluZm8oJnNpKTsKKwkvKiBUaGUgdmFsdWVzIGJlbG93IHdlcmUgc3VnZ2VzdGVkIGJ5IEFsZXhleSBLdXpuZXRzb3YKKwkgKiA8a3V6bmV0QG1zMi5pbnIuYWMucnU+LiAgSSBkb24ndCBoYXZlIGFueSBvcGluaW9uIGFib3V0IHRoZSB2YWx1ZXMKKwkgKiBteXNlbGYuICAtLVNBVworCSAqLworCWlmIChzaS50b3RhbHJhbSA8PSAoMzI3NjgqMTAyNCkvUEFHRV9TSVpFKQorCQlpbmV0X3BlZXJfdGhyZXNob2xkID4+PSAxOyAvKiBtYXggcG9vbCBzaXplIGFib3V0IDFNQiBvbiBJQTMyICovCisJaWYgKHNpLnRvdGFscmFtIDw9ICgxNjM4NCoxMDI0KS9QQUdFX1NJWkUpCisJCWluZXRfcGVlcl90aHJlc2hvbGQgPj49IDE7IC8qIGFib3V0IDUxMktCICovCisJaWYgKHNpLnRvdGFscmFtIDw9ICg4MTkyKjEwMjQpL1BBR0VfU0laRSkKKwkJaW5ldF9wZWVyX3RocmVzaG9sZCA+Pj0gMjsgLyogYWJvdXQgMTI4S0IgKi8KKworCXBlZXJfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImluZXRfcGVlcl9jYWNoZSIsCisJCQlzaXplb2Yoc3RydWN0IGluZXRfcGVlciksCisJCQkwLCBTTEFCX0hXQ0FDSEVfQUxJR04sCisJCQlOVUxMLCBOVUxMKTsKKworCWlmICghcGVlcl9jYWNoZXApCisJCXBhbmljKCJjYW5ub3QgY3JlYXRlIGluZXRfcGVlcl9jYWNoZSIpOworCisJLyogQWxsIHRoZSB0aW1lcnMsIHN0YXJ0ZWQgYXQgc3lzdGVtIHN0YXJ0dXAgdGVuZAorCSAgIHRvIHN5bmNocm9uaXplLiBQZXJ0dXJiIGl0IGEgYml0LgorCSAqLworCXBlZXJfcGVyaW9kaWNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMKKwkJKyBuZXRfcmFuZG9tKCkgJSBpbmV0X3BlZXJfZ2NfbWF4dGltZQorCQkrIGluZXRfcGVlcl9nY19tYXh0aW1lOworCWFkZF90aW1lcigmcGVlcl9wZXJpb2RpY190aW1lcik7Cit9CisKKy8qIENhbGxlZCB3aXRoIG9yIHdpdGhvdXQgbG9jYWwgQkggYmVpbmcgZGlzYWJsZWQuICovCitzdGF0aWMgdm9pZCB1bmxpbmtfZnJvbV91bnVzZWQoc3RydWN0IGluZXRfcGVlciAqcCkKK3sKKwlzcGluX2xvY2tfYmgoJmluZXRfcGVlcl91bnVzZWRfbG9jayk7CisJaWYgKHAtPnVudXNlZF9wcmV2cCAhPSBOVUxMKSB7CisJCS8qIE9uIHVudXNlZCBsaXN0LiAqLworCQkqcC0+dW51c2VkX3ByZXZwID0gcC0+dW51c2VkX25leHQ7CisJCWlmIChwLT51bnVzZWRfbmV4dCAhPSBOVUxMKQorCQkJcC0+dW51c2VkX25leHQtPnVudXNlZF9wcmV2cCA9IHAtPnVudXNlZF9wcmV2cDsKKwkJZWxzZQorCQkJaW5ldF9wZWVyX3VudXNlZF90YWlscCA9IHAtPnVudXNlZF9wcmV2cDsKKwkJcC0+dW51c2VkX3ByZXZwID0gTlVMTDsgLyogbWFyayBpdCBhcyByZW1vdmVkICovCisJfQorCXNwaW5fdW5sb2NrX2JoKCZpbmV0X3BlZXJfdW51c2VkX2xvY2spOworfQorCisvKiBDYWxsZWQgd2l0aCBsb2NhbCBCSCBkaXNhYmxlZCBhbmQgdGhlIHBvb2wgbG9jayBoZWxkLiAqLworI2RlZmluZSBsb29rdXAoZGFkZHIpIAkJCQkJCVwKKyh7CQkJCQkJCQlcCisJc3RydWN0IGluZXRfcGVlciAqdSwgKip2OwkJCQlcCisJc3RhY2twdHIgPSBzdGFjazsJCQkJCVwKKwkqc3RhY2twdHIrKyA9ICZwZWVyX3Jvb3Q7CQkJCVwKKwlmb3IgKHUgPSBwZWVyX3Jvb3Q7IHUgIT0gcGVlcl9hdmxfZW1wdHk7ICkgewkJXAorCQlpZiAoZGFkZHIgPT0gdS0+djRkYWRkcikJCQlcCisJCQlicmVhazsJCQkJCVwKKwkJaWYgKGRhZGRyIDwgdS0+djRkYWRkcikJCQkJXAorCQkJdiA9ICZ1LT5hdmxfbGVmdDsJCQlcCisJCWVsc2UJCQkJCQlcCisJCQl2ID0gJnUtPmF2bF9yaWdodDsJCQlcCisJCSpzdGFja3B0cisrID0gdjsJCQkJXAorCQl1ID0gKnY7CQkJCQkJXAorCX0JCQkJCQkJXAorCXU7CQkJCQkJCVwKK30pCisKKy8qIENhbGxlZCB3aXRoIGxvY2FsIEJIIGRpc2FibGVkIGFuZCB0aGUgcG9vbCB3cml0ZSBsb2NrIGhlbGQuICovCisjZGVmaW5lIGxvb2t1cF9yaWdodGVtcHR5KHN0YXJ0KQkJCQlcCisoewkJCQkJCQkJXAorCXN0cnVjdCBpbmV0X3BlZXIgKnUsICoqdjsJCQkJXAorCSpzdGFja3B0cisrID0gJnN0YXJ0LT5hdmxfbGVmdDsJCQkJXAorCXYgPSAmc3RhcnQtPmF2bF9sZWZ0OwkJCQkJXAorCWZvciAodSA9ICp2OyB1LT5hdmxfcmlnaHQgIT0gcGVlcl9hdmxfZW1wdHk7ICkgewlcCisJCXYgPSAmdS0+YXZsX3JpZ2h0OwkJCQlcCisJCSpzdGFja3B0cisrID0gdjsJCQkJXAorCQl1ID0gKnY7CQkJCQkJXAorCX0JCQkJCQkJXAorCXU7CQkJCQkJCVwKK30pCisKKy8qIENhbGxlZCB3aXRoIGxvY2FsIEJIIGRpc2FibGVkIGFuZCB0aGUgcG9vbCB3cml0ZSBsb2NrIGhlbGQuCisgKiBWYXJpYWJsZSBuYW1lcyBhcmUgdGhlIHByb29mIG9mIG9wZXJhdGlvbiBjb3JyZWN0bmVzcy4KKyAqIExvb2sgaW50byBtbS9tYXBfYXZsLmMgZm9yIG1vcmUgZGV0YWlsIGRlc2NyaXB0aW9uIG9mIHRoZSBpZGVhcy4gICovCitzdGF0aWMgdm9pZCBwZWVyX2F2bF9yZWJhbGFuY2Uoc3RydWN0IGluZXRfcGVlciAqKnN0YWNrW10sCisJCXN0cnVjdCBpbmV0X3BlZXIgKioqc3RhY2tlbmQpCit7CisJc3RydWN0IGluZXRfcGVlciAqKm5vZGVwLCAqbm9kZSwgKmwsICpyOworCWludCBsaCwgcmg7CisKKwl3aGlsZSAoc3RhY2tlbmQgPiBzdGFjaykgeworCQlub2RlcCA9ICotLXN0YWNrZW5kOworCQlub2RlID0gKm5vZGVwOworCQlsID0gbm9kZS0+YXZsX2xlZnQ7CisJCXIgPSBub2RlLT5hdmxfcmlnaHQ7CisJCWxoID0gbm9kZV9oZWlnaHQobCk7CisJCXJoID0gbm9kZV9oZWlnaHQocik7CisJCWlmIChsaCA+IHJoICsgMSkgeyAvKiBsOiBSSCsyICovCisJCQlzdHJ1Y3QgaW5ldF9wZWVyICpsbCwgKmxyLCAqbHJsLCAqbHJyOworCQkJaW50IGxyaDsKKwkJCWxsID0gbC0+YXZsX2xlZnQ7CisJCQlsciA9IGwtPmF2bF9yaWdodDsKKwkJCWxyaCA9IG5vZGVfaGVpZ2h0KGxyKTsKKwkJCWlmIChscmggPD0gbm9kZV9oZWlnaHQobGwpKSB7CS8qIGxsOiBSSCsxICovCisJCQkJbm9kZS0+YXZsX2xlZnQgPSBscjsJLyogbHI6IFJIIG9yIFJIKzEgKi8KKwkJCQlub2RlLT5hdmxfcmlnaHQgPSByOwkvKiByOiBSSCAqLworCQkJCW5vZGUtPmF2bF9oZWlnaHQgPSBscmggKyAxOyAvKiBSSCsxIG9yIFJIKzIgKi8KKwkJCQlsLT5hdmxfbGVmdCA9IGxsOwkvKiBsbDogUkgrMSAqLworCQkJCWwtPmF2bF9yaWdodCA9IG5vZGU7CS8qIG5vZGU6IFJIKzEgb3IgUkgrMiAqLworCQkJCWwtPmF2bF9oZWlnaHQgPSBub2RlLT5hdmxfaGVpZ2h0ICsgMTsKKwkJCQkqbm9kZXAgPSBsOworCQkJfSBlbHNlIHsgLyogbGw6IFJILCBscjogUkgrMSAqLworCQkJCWxybCA9IGxyLT5hdmxfbGVmdDsJLyogbHJsOiBSSCBvciBSSC0xICovCisJCQkJbHJyID0gbHItPmF2bF9yaWdodDsJLyogbHJyOiBSSCBvciBSSC0xICovCisJCQkJbm9kZS0+YXZsX2xlZnQgPSBscnI7CS8qIGxycjogUkggb3IgUkgtMSAqLworCQkJCW5vZGUtPmF2bF9yaWdodCA9IHI7CS8qIHI6IFJIICovCisJCQkJbm9kZS0+YXZsX2hlaWdodCA9IHJoICsgMTsgLyogbm9kZTogUkgrMSAqLworCQkJCWwtPmF2bF9sZWZ0ID0gbGw7CS8qIGxsOiBSSCAqLworCQkJCWwtPmF2bF9yaWdodCA9IGxybDsJLyogbHJsOiBSSCBvciBSSC0xICovCisJCQkJbC0+YXZsX2hlaWdodCA9IHJoICsgMTsJLyogbDogUkgrMSAqLworCQkJCWxyLT5hdmxfbGVmdCA9IGw7CS8qIGw6IFJIKzEgKi8KKwkJCQlsci0+YXZsX3JpZ2h0ID0gbm9kZTsJLyogbm9kZTogUkgrMSAqLworCQkJCWxyLT5hdmxfaGVpZ2h0ID0gcmggKyAyOworCQkJCSpub2RlcCA9IGxyOworCQkJfQorCQl9IGVsc2UgaWYgKHJoID4gbGggKyAxKSB7IC8qIHI6IExIKzIgKi8KKwkJCXN0cnVjdCBpbmV0X3BlZXIgKnJyLCAqcmwsICpybHIsICpybGw7CisJCQlpbnQgcmxoOworCQkJcnIgPSByLT5hdmxfcmlnaHQ7CisJCQlybCA9IHItPmF2bF9sZWZ0OworCQkJcmxoID0gbm9kZV9oZWlnaHQocmwpOworCQkJaWYgKHJsaCA8PSBub2RlX2hlaWdodChycikpIHsJLyogcnI6IExIKzEgKi8KKwkJCQlub2RlLT5hdmxfcmlnaHQgPSBybDsJLyogcmw6IExIIG9yIExIKzEgKi8KKwkJCQlub2RlLT5hdmxfbGVmdCA9IGw7CS8qIGw6IExIICovCisJCQkJbm9kZS0+YXZsX2hlaWdodCA9IHJsaCArIDE7IC8qIExIKzEgb3IgTEgrMiAqLworCQkJCXItPmF2bF9yaWdodCA9IHJyOwkvKiBycjogTEgrMSAqLworCQkJCXItPmF2bF9sZWZ0ID0gbm9kZTsJLyogbm9kZTogTEgrMSBvciBMSCsyICovCisJCQkJci0+YXZsX2hlaWdodCA9IG5vZGUtPmF2bF9oZWlnaHQgKyAxOworCQkJCSpub2RlcCA9IHI7CisJCQl9IGVsc2UgeyAvKiBycjogUkgsIHJsOiBSSCsxICovCisJCQkJcmxyID0gcmwtPmF2bF9yaWdodDsJLyogcmxyOiBMSCBvciBMSC0xICovCisJCQkJcmxsID0gcmwtPmF2bF9sZWZ0OwkvKiBybGw6IExIIG9yIExILTEgKi8KKwkJCQlub2RlLT5hdmxfcmlnaHQgPSBybGw7CS8qIHJsbDogTEggb3IgTEgtMSAqLworCQkJCW5vZGUtPmF2bF9sZWZ0ID0gbDsJLyogbDogTEggKi8KKwkJCQlub2RlLT5hdmxfaGVpZ2h0ID0gbGggKyAxOyAvKiBub2RlOiBMSCsxICovCisJCQkJci0+YXZsX3JpZ2h0ID0gcnI7CS8qIHJyOiBMSCAqLworCQkJCXItPmF2bF9sZWZ0ID0gcmxyOwkvKiBybHI6IExIIG9yIExILTEgKi8KKwkJCQlyLT5hdmxfaGVpZ2h0ID0gbGggKyAxOwkvKiByOiBMSCsxICovCisJCQkJcmwtPmF2bF9yaWdodCA9IHI7CS8qIHI6IExIKzEgKi8KKwkJCQlybC0+YXZsX2xlZnQgPSBub2RlOwkvKiBub2RlOiBMSCsxICovCisJCQkJcmwtPmF2bF9oZWlnaHQgPSBsaCArIDI7CisJCQkJKm5vZGVwID0gcmw7CisJCQl9CisJCX0gZWxzZSB7CisJCQlub2RlLT5hdmxfaGVpZ2h0ID0gKGxoID4gcmggPyBsaCA6IHJoKSArIDE7CisJCX0KKwl9Cit9CisKKy8qIENhbGxlZCB3aXRoIGxvY2FsIEJIIGRpc2FibGVkIGFuZCB0aGUgcG9vbCB3cml0ZSBsb2NrIGhlbGQuICovCisjZGVmaW5lIGxpbmtfdG9fcG9vbChuKQkJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwluLT5hdmxfaGVpZ2h0ID0gMTsJCQkJCVwKKwluLT5hdmxfbGVmdCA9IHBlZXJfYXZsX2VtcHR5OwkJCQlcCisJbi0+YXZsX3JpZ2h0ID0gcGVlcl9hdmxfZW1wdHk7CQkJCVwKKwkqKi0tc3RhY2twdHIgPSBuOwkJCQkJXAorCXBlZXJfYXZsX3JlYmFsYW5jZShzdGFjaywgc3RhY2twdHIpOwkJCVwKK30gd2hpbGUoMCkKKworLyogTWF5IGJlIGNhbGxlZCB3aXRoIGxvY2FsIEJIIGVuYWJsZWQuICovCitzdGF0aWMgdm9pZCB1bmxpbmtfZnJvbV9wb29sKHN0cnVjdCBpbmV0X3BlZXIgKnApCit7CisJaW50IGRvX2ZyZWU7CisKKwlkb19mcmVlID0gMDsKKworCXdyaXRlX2xvY2tfYmgoJnBlZXJfcG9vbF9sb2NrKTsKKwkvKiBDaGVjayB0aGUgcmVmZXJlbmNlIGNvdW50ZXIuICBJdCB3YXMgYXJ0aWZpY2lhbGx5IGluY3JlbWVudGVkIGJ5IDEKKwkgKiBpbiBjbGVhbnVwKCkgZnVuY3Rpb24gdG8gcHJldmVudCBzdWRkZW4gZGlzYXBwZWFyaW5nLiAgSWYgdGhlCisJICogcmVmZXJlbmNlIGNvdW50IGlzIHN0aWxsIDEgdGhlbiB0aGUgbm9kZSBpcyByZWZlcmVuY2VkIG9ubHkgYXMgYHAnCisJICogaGVyZSBhbmQgZnJvbSB0aGUgcG9vbC4gIFNvIHVuZGVyIHRoZSBleGNsdXNpdmUgcG9vbCBsb2NrIGl0J3Mgc2FmZQorCSAqIHRvIHJlbW92ZSB0aGUgbm9kZSBhbmQgZnJlZSBpdCBsYXRlci4gKi8KKwlpZiAoYXRvbWljX3JlYWQoJnAtPnJlZmNudCkgPT0gMSkgeworCQlzdHJ1Y3QgaW5ldF9wZWVyICoqc3RhY2tbUEVFUl9NQVhERVBUSF07CisJCXN0cnVjdCBpbmV0X3BlZXIgKioqc3RhY2twdHIsICoqKmRlbHA7CisJCWlmIChsb29rdXAocC0+djRkYWRkcikgIT0gcCkKKwkJCUJVRygpOworCQlkZWxwID0gc3RhY2twdHIgLSAxOyAvKiAqZGVscFswXSA9PSBwICovCisJCWlmIChwLT5hdmxfbGVmdCA9PSBwZWVyX2F2bF9lbXB0eSkgeworCQkJKmRlbHBbMF0gPSBwLT5hdmxfcmlnaHQ7CisJCQktLXN0YWNrcHRyOworCQl9IGVsc2UgeworCQkJLyogbG9vayBmb3IgYSBub2RlIHRvIGluc2VydCBpbnN0ZWFkIG9mIHAgKi8KKwkJCXN0cnVjdCBpbmV0X3BlZXIgKnQ7CisJCQl0ID0gbG9va3VwX3JpZ2h0ZW1wdHkocCk7CisJCQlpZiAoKnN0YWNrcHRyWy0xXSAhPSB0KQorCQkJCUJVRygpOworCQkJKiotLXN0YWNrcHRyID0gdC0+YXZsX2xlZnQ7CisJCQkvKiB0IGlzIHJlbW92ZWQsIHQtPnY0ZGFkZHIgPiB4LT52NGRhZGRyIGZvciBhbnkKKwkJCSAqIHggaW4gcC0+YXZsX2xlZnQgc3VidHJlZS4KKwkJCSAqIFB1dCB0IGluIHRoZSBvbGQgcGxhY2Ugb2YgcC4gKi8KKwkJCSpkZWxwWzBdID0gdDsKKwkJCXQtPmF2bF9sZWZ0ID0gcC0+YXZsX2xlZnQ7CisJCQl0LT5hdmxfcmlnaHQgPSBwLT5hdmxfcmlnaHQ7CisJCQl0LT5hdmxfaGVpZ2h0ID0gcC0+YXZsX2hlaWdodDsKKwkJCWlmIChkZWxwWzFdICE9ICZwLT5hdmxfbGVmdCkKKwkJCQlCVUcoKTsKKwkJCWRlbHBbMV0gPSAmdC0+YXZsX2xlZnQ7IC8qIHdhcyAmcC0+YXZsX2xlZnQgKi8KKwkJfQorCQlwZWVyX2F2bF9yZWJhbGFuY2Uoc3RhY2ssIHN0YWNrcHRyKTsKKwkJcGVlcl90b3RhbC0tOworCQlkb19mcmVlID0gMTsKKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZwZWVyX3Bvb2xfbG9jayk7CisKKwlpZiAoZG9fZnJlZSkKKwkJa21lbV9jYWNoZV9mcmVlKHBlZXJfY2FjaGVwLCBwKTsKKwllbHNlCisJCS8qIFRoZSBub2RlIGlzIHVzZWQgYWdhaW4uICBEZWNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50ZXIKKwkJICogYmFjay4gIFRoZSBsb29wICJjbGVhbnVwIC0+IHVubGlua19mcm9tX3VudXNlZAorCQkgKiAgIC0+IHVubGlua19mcm9tX3Bvb2wgLT4gcHV0cGVlciAtPiBsaW5rX3RvX3VudXNlZAorCQkgKiAgIC0+IGNsZWFudXAgKGZvciB0aGUgc2FtZSBub2RlKSIKKwkJICogZG9lc24ndCByZWFsbHkgZXhpc3QgYmVjYXVzZSB0aGUgZW50cnkgd2lsbCBoYXZlIGEKKwkJICogcmVjZW50IGRlbGV0aW9uIHRpbWUgYW5kIHdpbGwgbm90IGJlIGNsZWFuZWQgYWdhaW4gc29vbi4gKi8KKwkJaW5ldF9wdXRwZWVyKHApOworfQorCisvKiBNYXkgYmUgY2FsbGVkIHdpdGggbG9jYWwgQkggZW5hYmxlZC4gKi8KK3N0YXRpYyBpbnQgY2xlYW51cF9vbmNlKHVuc2lnbmVkIGxvbmcgdHRsKQoreworCXN0cnVjdCBpbmV0X3BlZXIgKnA7CisKKwkvKiBSZW1vdmUgdGhlIGZpcnN0IGVudHJ5IGZyb20gdGhlIGxpc3Qgb2YgdW51c2VkIG5vZGVzLiAqLworCXNwaW5fbG9ja19iaCgmaW5ldF9wZWVyX3VudXNlZF9sb2NrKTsKKwlwID0gaW5ldF9wZWVyX3VudXNlZF9oZWFkOworCWlmIChwICE9IE5VTEwpIHsKKwkJaWYgKHRpbWVfYWZ0ZXIocC0+ZHRpbWUgKyB0dGwsIGppZmZpZXMpKSB7CisJCQkvKiBEbyBub3QgcHJ1bmUgZnJlc2ggZW50cmllcy4gKi8KKwkJCXNwaW5fdW5sb2NrX2JoKCZpbmV0X3BlZXJfdW51c2VkX2xvY2spOworCQkJcmV0dXJuIC0xOworCQl9CisJCWluZXRfcGVlcl91bnVzZWRfaGVhZCA9IHAtPnVudXNlZF9uZXh0OworCQlpZiAocC0+dW51c2VkX25leHQgIT0gTlVMTCkKKwkJCXAtPnVudXNlZF9uZXh0LT51bnVzZWRfcHJldnAgPSBwLT51bnVzZWRfcHJldnA7CisJCWVsc2UKKwkJCWluZXRfcGVlcl91bnVzZWRfdGFpbHAgPSBwLT51bnVzZWRfcHJldnA7CisJCXAtPnVudXNlZF9wcmV2cCA9IE5VTEw7IC8qIG1hcmsgYXMgbm90IG9uIHRoZSBsaXN0ICovCisJCS8qIEdyYWIgYW4gZXh0cmEgcmVmZXJlbmNlIHRvIHByZXZlbnQgbm9kZSBkaXNhcHBlYXJpbmcKKwkJICogYmVmb3JlIHVubGlua19mcm9tX3Bvb2woKSBjYWxsLiAqLworCQlhdG9taWNfaW5jKCZwLT5yZWZjbnQpOworCX0KKwlzcGluX3VubG9ja19iaCgmaW5ldF9wZWVyX3VudXNlZF9sb2NrKTsKKworCWlmIChwID09IE5VTEwpCisJCS8qIEl0IG1lYW5zIHRoYXQgdGhlIHRvdGFsIG51bWJlciBvZiBVU0VEIGVudHJpZXMgaGFzCisJCSAqIGdyb3duIG92ZXIgaW5ldF9wZWVyX3RocmVzaG9sZC4gIEl0IHNob3VsZG4ndCByZWFsbHkKKwkJICogaGFwcGVuIGJlY2F1c2Ugb2YgZW50cnkgbGltaXRzIGluIHJvdXRlIGNhY2hlLiAqLworCQlyZXR1cm4gLTE7CisKKwl1bmxpbmtfZnJvbV9wb29sKHApOworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgd2l0aCBvciB3aXRob3V0IGxvY2FsIEJIIGJlaW5nIGRpc2FibGVkLiAqLworc3RydWN0IGluZXRfcGVlciAqaW5ldF9nZXRwZWVyKF9fdTMyIGRhZGRyLCBpbnQgY3JlYXRlKQoreworCXN0cnVjdCBpbmV0X3BlZXIgKnAsICpuOworCXN0cnVjdCBpbmV0X3BlZXIgKipzdGFja1tQRUVSX01BWERFUFRIXSwgKioqc3RhY2twdHI7CisKKwkvKiBMb29rIHVwIGZvciB0aGUgYWRkcmVzcyBxdWlja2x5LiAqLworCXJlYWRfbG9ja19iaCgmcGVlcl9wb29sX2xvY2spOworCXAgPSBsb29rdXAoZGFkZHIpOworCWlmIChwICE9IHBlZXJfYXZsX2VtcHR5KQorCQlhdG9taWNfaW5jKCZwLT5yZWZjbnQpOworCXJlYWRfdW5sb2NrX2JoKCZwZWVyX3Bvb2xfbG9jayk7CisKKwlpZiAocCAhPSBwZWVyX2F2bF9lbXB0eSkgeworCQkvKiBUaGUgZXhpc3Rpbmcgbm9kZSBoYXMgYmVlbiBmb3VuZC4gKi8KKwkJLyogUmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHVudXNlZCBsaXN0IGlmIGl0IHdhcyB0aGVyZS4gKi8KKwkJdW5saW5rX2Zyb21fdW51c2VkKHApOworCQlyZXR1cm4gcDsKKwl9CisKKwlpZiAoIWNyZWF0ZSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBBbGxvY2F0ZSB0aGUgc3BhY2Ugb3V0c2lkZSB0aGUgbG9ja2VkIHJlZ2lvbi4gKi8KKwluID0ga21lbV9jYWNoZV9hbGxvYyhwZWVyX2NhY2hlcCwgR0ZQX0FUT01JQyk7CisJaWYgKG4gPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJbi0+djRkYWRkciA9IGRhZGRyOworCWF0b21pY19zZXQoJm4tPnJlZmNudCwgMSk7CisJbi0+aXBfaWRfY291bnQgPSBzZWN1cmVfaXBfaWQoZGFkZHIpOworCW4tPnRjcF90c19zdGFtcCA9IDA7CisKKwl3cml0ZV9sb2NrX2JoKCZwZWVyX3Bvb2xfbG9jayk7CisJLyogQ2hlY2sgaWYgYW4gZW50cnkgaGFzIHN1ZGRlbmx5IGFwcGVhcmVkLiAqLworCXAgPSBsb29rdXAoZGFkZHIpOworCWlmIChwICE9IHBlZXJfYXZsX2VtcHR5KQorCQlnb3RvIG91dF9mcmVlOworCisJLyogTGluayB0aGUgbm9kZS4gKi8KKwlsaW5rX3RvX3Bvb2wobik7CisJbi0+dW51c2VkX3ByZXZwID0gTlVMTDsgLyogbm90IG9uIHRoZSBsaXN0ICovCisJcGVlcl90b3RhbCsrOworCXdyaXRlX3VubG9ja19iaCgmcGVlcl9wb29sX2xvY2spOworCisJaWYgKHBlZXJfdG90YWwgPj0gaW5ldF9wZWVyX3RocmVzaG9sZCkKKwkJLyogUmVtb3ZlIG9uZSBsZXNzLXJlY2VudGx5LXVzZWQgZW50cnkuICovCisJCWNsZWFudXBfb25jZSgwKTsKKworCXJldHVybiBuOworCitvdXRfZnJlZToKKwkvKiBUaGUgYXBwcm9wcmlhdGUgbm9kZSBpcyBhbHJlYWR5IGluIHRoZSBwb29sLiAqLworCWF0b21pY19pbmMoJnAtPnJlZmNudCk7CisJd3JpdGVfdW5sb2NrX2JoKCZwZWVyX3Bvb2xfbG9jayk7CisJLyogUmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHVudXNlZCBsaXN0IGlmIGl0IHdhcyB0aGVyZS4gKi8KKwl1bmxpbmtfZnJvbV91bnVzZWQocCk7CisJLyogRnJlZSBwcmVhbGxvY2F0ZWQgdGhlIHByZWFsbG9jYXRlZCBub2RlLiAqLworCWttZW1fY2FjaGVfZnJlZShwZWVyX2NhY2hlcCwgbik7CisJcmV0dXJuIHA7Cit9CisKKy8qIENhbGxlZCB3aXRoIGxvY2FsIEJIIGRpc2FibGVkLiAqLworc3RhdGljIHZvaWQgcGVlcl9jaGVja19leHBpcmUodW5zaWduZWQgbG9uZyBkdW1teSkKK3sKKwlpbnQgaTsKKwlpbnQgdHRsOworCisJaWYgKHBlZXJfdG90YWwgPj0gaW5ldF9wZWVyX3RocmVzaG9sZCkKKwkJdHRsID0gaW5ldF9wZWVyX21pbnR0bDsKKwllbHNlCisJCXR0bCA9IGluZXRfcGVlcl9tYXh0dGwKKwkJCQktIChpbmV0X3BlZXJfbWF4dHRsIC0gaW5ldF9wZWVyX21pbnR0bCkgLyBIWiAqCisJCQkJCXBlZXJfdG90YWwgLyBpbmV0X3BlZXJfdGhyZXNob2xkICogSFo7CisJZm9yIChpID0gMDsgaSA8IFBFRVJfTUFYX0NMRUFOVVBfV09SSyAmJiAhY2xlYW51cF9vbmNlKHR0bCk7IGkrKyk7CisKKwkvKiBUcmlnZ2VyIHRoZSB0aW1lciBhZnRlciBpbmV0X3BlZXJfZ2NfbWludGltZSAuLiBpbmV0X3BlZXJfZ2NfbWF4dGltZQorCSAqIGludGVydmFsIGRlcGVuZGluZyBvbiB0aGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgKG1vcmUgZW50cmllcywKKwkgKiBsZXNzIGludGVydmFsKS4gKi8KKwlwZWVyX3BlcmlvZGljX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzCisJCSsgaW5ldF9wZWVyX2djX21heHRpbWUKKwkJLSAoaW5ldF9wZWVyX2djX21heHRpbWUgLSBpbmV0X3BlZXJfZ2NfbWludGltZSkgLyBIWiAqCisJCQlwZWVyX3RvdGFsIC8gaW5ldF9wZWVyX3RocmVzaG9sZCAqIEhaOworCWFkZF90aW1lcigmcGVlcl9wZXJpb2RpY190aW1lcik7Cit9CisKK0VYUE9SVF9TWU1CT0woaW5ldF9wZWVyX2lkbG9jayk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9mb3J3YXJkLmMgYi9uZXQvaXB2NC9pcF9mb3J3YXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcwOTRhYQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L2lwX2ZvcndhcmQuYwpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlUaGUgSVAgZm9yd2FyZGluZyBmdW5jdGlvbmFsaXR5LgorICoJCQorICogVmVyc2lvbjoJJElkOiBpcF9mb3J3YXJkLmMsdiAxLjQ4IDIwMDAvMTIvMTMgMTg6MzE6NDggZGF2ZW0gRXhwICQKKyAqCisgKiBBdXRob3JzOglzZWUgaXAuYworICoKKyAqIEZpeGVzOgorICoJCU1hbnkJCToJU3BsaXQgZnJvbSBpcC5jICwgc2VlIGlwX2lucHV0LmMgZm9yIAorICoJCQkJCWhpc3RvcnkuCisgKgkJRGF2ZSBHcmVnb3JpY2gJOglOVUxMIGlwX3J0X3B1dCBmaXggZm9yIG11bHRpY2FzdCAKKyAqCQkJCQlyb3V0aW5nLgorICoJCUpvcyBWb3MJCToJQWRkIGNhbGxfb3V0X2ZpcmV3YWxsIGJlZm9yZSBzZW5kaW5nLAorICoJCQkJCXVzZSBvdXRwdXQgZGV2aWNlIGZvciBhY2NvdW50aW5nLgorICoJCUpvcyBWb3MJCToJQ2FsbCBmb3J3YXJkIGZpcmV3YWxsIGFmdGVyIHJvdXRpbmcKKyAqCQkJCQkoYWx3YXlzIHVzZSBvdXRwdXQgZGV2aWNlKS4KKyAqCQlNaWtlIE1jTGFnYW4JOglSb3V0aW5nIGJ5IHNvdXJjZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ljbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvdWRwLmg+CisjaW5jbHVkZSA8bmV0L2ljbXAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorI2luY2x1ZGUgPGxpbnV4L3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L3hmcm0uaD4KKworc3RhdGljIGlubGluZSBpbnQgaXBfZm9yd2FyZF9maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXBfb3B0aW9ucyAqIG9wdAk9ICYoSVBDQihza2IpLT5vcHQpOworCisJSVBfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX09VVEZPUldEQVRBR1JBTVMpOworCisJaWYgKHVubGlrZWx5KG9wdC0+b3B0bGVuKSkKKwkJaXBfZm9yd2FyZF9vcHRpb25zKHNrYik7CisKKwlyZXR1cm4gZHN0X291dHB1dChza2IpOworfQorCitpbnQgaXBfZm9yd2FyZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcGhkciAqaXBoOwkvKiBPdXIgaGVhZGVyICovCisJc3RydWN0IHJ0YWJsZSAqcnQ7CS8qIFJvdXRlIHdlIHVzZSAqLworCXN0cnVjdCBpcF9vcHRpb25zICogb3B0CT0gJihJUENCKHNrYiktPm9wdCk7CisKKwlpZiAoIXhmcm00X3BvbGljeV9jaGVjayhOVUxMLCBYRlJNX1BPTElDWV9GV0QsIHNrYikpCisJCWdvdG8gZHJvcDsKKworCWlmIChJUENCKHNrYiktPm9wdC5yb3V0ZXJfYWxlcnQgJiYgaXBfY2FsbF9yYV9jaGFpbihza2IpKQorCQlyZXR1cm4gTkVUX1JYX1NVQ0NFU1M7CisKKwlpZiAoc2tiLT5wa3RfdHlwZSAhPSBQQUNLRVRfSE9TVCkKKwkJZ290byBkcm9wOworCisJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQorCS8qCisJICoJQWNjb3JkaW5nIHRvIHRoZSBSRkMsIHdlIG11c3QgZmlyc3QgZGVjcmVhc2UgdGhlIFRUTCBmaWVsZC4gSWYKKwkgKgl0aGF0IHJlYWNoZXMgemVybywgd2UgbXVzdCByZXBseSBhbiBJQ01QIGNvbnRyb2wgbWVzc2FnZSB0ZWxsaW5nCisJICoJdGhhdCB0aGUgcGFja2V0J3MgbGlmZXRpbWUgZXhwaXJlZC4KKwkgKi8KKworCWlwaCA9IHNrYi0+bmguaXBoOworCisJaWYgKGlwaC0+dHRsIDw9IDEpCisgICAgICAgICAgICAgICAgZ290byB0b29fbWFueV9ob3BzOworCisJaWYgKCF4ZnJtNF9yb3V0ZV9mb3J3YXJkKHNrYikpCisJCWdvdG8gZHJvcDsKKworCWlwaCA9IHNrYi0+bmguaXBoOworCXJ0ID0gKHN0cnVjdCBydGFibGUqKXNrYi0+ZHN0OworCisJaWYgKG9wdC0+aXNfc3RyaWN0cm91dGUgJiYgcnQtPnJ0X2RzdCAhPSBydC0+cnRfZ2F0ZXdheSkKKwkJZ290byBzcl9mYWlsZWQ7CisKKwkvKiBXZSBhcmUgYWJvdXQgdG8gbWFuZ2xlIHBhY2tldC4gQ29weSBpdCEgKi8KKwlpZiAoc2tiX2Nvdyhza2IsIExMX1JFU0VSVkVEX1NQQUNFKHJ0LT51LmRzdC5kZXYpK3J0LT51LmRzdC5oZWFkZXJfbGVuKSkKKwkJZ290byBkcm9wOworCWlwaCA9IHNrYi0+bmguaXBoOworCisJLyogRGVjcmVhc2UgdHRsIGFmdGVyIHNrYiBjb3cgZG9uZSAqLworCWlwX2RlY3JlYXNlX3R0bChpcGgpOworCisJLyoKKwkgKglXZSBub3cgZ2VuZXJhdGUgYW4gSUNNUCBIT1NUIFJFRElSRUNUIGdpdmluZyB0aGUgcm91dGUKKwkgKgl3ZSBjYWxjdWxhdGVkLgorCSAqLworCWlmIChydC0+cnRfZmxhZ3MmUlRDRl9ET1JFRElSRUNUICYmICFvcHQtPnNycikKKwkJaXBfcnRfc2VuZF9yZWRpcmVjdChza2IpOworCisJc2tiLT5wcmlvcml0eSA9IHJ0X3RvczJwcmlvcml0eShpcGgtPnRvcyk7CisKKwlyZXR1cm4gTkZfSE9PSyhQRl9JTkVULCBORl9JUF9GT1JXQVJELCBza2IsIHNrYi0+ZGV2LCBydC0+dS5kc3QuZGV2LAorCQkgICAgICAgaXBfZm9yd2FyZF9maW5pc2gpOworCitzcl9mYWlsZWQ6CisgICAgICAgIC8qCisJICoJU3RyaWN0IHJvdXRpbmcgcGVybWl0cyBubyBnYXRld2F5aW5nCisJICovCisgICAgICAgICBpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCwgSUNNUF9TUl9GQUlMRUQsIDApOworICAgICAgICAgZ290byBkcm9wOworCit0b29fbWFueV9ob3BzOgorICAgICAgICAvKiBUZWxsIHRoZSBzZW5kZXIgaXRzIHBhY2tldCBkaWVkLi4uICovCisgICAgICAgIGljbXBfc2VuZChza2IsIElDTVBfVElNRV9FWENFRURFRCwgSUNNUF9FWENfVFRMLCAwKTsKK2Ryb3A6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIE5FVF9SWF9EUk9QOworfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfZnJhZ21lbnQuYyBiL25ldC9pcHY0L2lwX2ZyYWdtZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y2OGUyNwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L2lwX2ZyYWdtZW50LmMKQEAgLTAsMCArMSw2OTEgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJVGhlIElQIGZyYWdtZW50YXRpb24gZnVuY3Rpb25hbGl0eS4KKyAqCQkKKyAqIFZlcnNpb246CSRJZDogaXBfZnJhZ21lbnQuYyx2IDEuNTkgMjAwMi8wMS8xMiAwNzo1NDo1NiBkYXZlbSBFeHAgJAorICoKKyAqIEF1dGhvcnM6CUZyZWQgTi4gdmFuIEtlbXBlbiA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgkJQWxhbiBDb3ggPEFsYW4uQ294QGxpbnV4Lm9yZz4KKyAqCisgKiBGaXhlczoKKyAqCQlBbGFuIENveAk6CVNwbGl0IGZyb20gaXAuYyAsIHNlZSBpcF9pbnB1dC5jIGZvciBoaXN0b3J5LgorICoJCURhdmlkIFMuIE1pbGxlciA6CUJlZ2luIG1hc3NpdmUgY2xlYW51cC4uLgorICoJCUFuZGkgS2xlZW4JOglBZGQgc3lzY3Rscy4KKyAqCQl4eHh4CQk6CU92ZXJsYXBmcmFnIGJ1Zy4KKyAqCQlVbHRpbWEgICAgICAgICAgOiAgICAgICBpcF9leHBpcmUoKSBrZXJuZWwgcGFuaWMuCisgKgkJQmlsbCBIYXdlcwk6CUZyYWcgYWNjb3VudGluZyBhbmQgZXZpY3RvciBmaXhlcy4KKyAqCQlKb2huIE1jRG9uYWxkCToJMCBsZW5ndGggZnJhZyBidWcuCisgKgkJQWxleGV5IEt1em5ldHNvdjoJU01QIHJhY2VzLCB0aHJlYWRpbmcsIGNsZWFudXAuCisgKgkJUGF0cmljayBNY0hhcmR5IDoJTFJVIHF1ZXVlIG9mIGZyYWcgaGVhZHMgZm9yIGV2aWN0b3IuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaWNtcC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaWNtcC5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorCisvKiBOT1RFLiBMb2dpYyBvZiBJUCBkZWZyYWdtZW50YXRpb24gaXMgcGFyYWxsZWwgdG8gY29ycmVzcG9uZGluZyBJUHY2CisgKiBjb2RlIG5vdy4gSWYgeW91IGNoYW5nZSBzb21ldGhpbmcgaGVyZSwgX1BMRUFTRV8gdXBkYXRlIGlwdjYvcmVhc3NlbWJseS5jCisgKiBhcyB3ZWxsLiBPciBub3RpZnkgbWUsIGF0IGxlYXN0LiAtLUFOSworICovCisKKy8qIEZyYWdtZW50IGNhY2hlIGxpbWl0cy4gV2Ugd2lsbCBjb21taXQgMjU2SyBhdCBvbmUgdGltZS4gU2hvdWxkIHdlCisgKiBjcm9zcyB0aGF0IGxpbWl0IHdlIHdpbGwgcHJ1bmUgZG93biB0byAxOTJLLiBUaGlzIHNob3VsZCBjb3BlIHdpdGgKKyAqIGV2ZW4gdGhlIG1vc3QgZXh0cmVtZSBjYXNlcyB3aXRob3V0IGFsbG93aW5nIGFuIGF0dGFja2VyIHRvIG1lYXN1cmFibHkKKyAqIGhhcm0gbWFjaGluZSBwZXJmb3JtYW5jZS4KKyAqLworaW50IHN5c2N0bF9pcGZyYWdfaGlnaF90aHJlc2ggPSAyNTYqMTAyNDsKK2ludCBzeXNjdGxfaXBmcmFnX2xvd190aHJlc2ggPSAxOTIqMTAyNDsKKworLyogSW1wb3J0YW50IE5PVEUhIEZyYWdtZW50IHF1ZXVlIG11c3QgYmUgZGVzdHJveWVkIGJlZm9yZSBNU0wgZXhwaXJlcy4KKyAqIFJGQzc5MSBpcyB3cm9uZyBwcm9wb3NpbmcgdG8gcHJvbG9uZ2F0ZSB0aW1lciBlYWNoIGZyYWdtZW50IGFycml2YWwgYnkgVFRMLgorICovCitpbnQgc3lzY3RsX2lwZnJhZ190aW1lID0gSVBfRlJBR19USU1FOworCitzdHJ1Y3QgaXBmcmFnX3NrYl9jYgoreworCXN0cnVjdCBpbmV0X3NrYl9wYXJtCWg7CisJaW50CQkJb2Zmc2V0OworfTsKKworI2RlZmluZSBGUkFHX0NCKHNrYikJKChzdHJ1Y3QgaXBmcmFnX3NrYl9jYiopKChza2IpLT5jYikpCisKKy8qIERlc2NyaWJlIGFuIGVudHJ5IGluIHRoZSAiaW5jb21wbGV0ZSBkYXRhZ3JhbXMiIHF1ZXVlLiAqLworc3RydWN0IGlwcSB7CisJc3RydWN0IGlwcQkqbmV4dDsJCS8qIGxpbmtlZCBsaXN0IHBvaW50ZXJzCQkJKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxydV9saXN0OwkvKiBscnUgbGlzdCBtZW1iZXIgCQkJKi8KKwl1MzIJCXVzZXI7CisJdTMyCQlzYWRkcjsKKwl1MzIJCWRhZGRyOworCXUxNgkJaWQ7CisJdTgJCXByb3RvY29sOworCXU4CQlsYXN0X2luOworI2RlZmluZSBDT01QTEVURQkJNAorI2RlZmluZSBGSVJTVF9JTgkJMgorI2RlZmluZSBMQVNUX0lOCQkJMQorCisJc3RydWN0IHNrX2J1ZmYJKmZyYWdtZW50czsJLyogbGlua2VkIGxpc3Qgb2YgcmVjZWl2ZWQgZnJhZ21lbnRzCSovCisJaW50CQlsZW47CQkvKiB0b3RhbCBsZW5ndGggb2Ygb3JpZ2luYWwgZGF0YWdyYW0JKi8KKwlpbnQJCW1lYXQ7CisJc3BpbmxvY2tfdAlsb2NrOworCWF0b21pY190CXJlZmNudDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsJLyogd2hlbiB3aWxsIHRoaXMgcXVldWUgZXhwaXJlPwkJKi8KKwlzdHJ1Y3QgaXBxCSoqcHByZXY7CisJaW50CQlpaWY7CisJc3RydWN0IHRpbWV2YWwJc3RhbXA7Cit9OworCisvKiBIYXNoIHRhYmxlLiAqLworCisjZGVmaW5lIElQUV9IQVNIU1oJNjQKKworLyogUGVyLWJ1Y2tldCBsb2NrIGlzIGVhc3kgdG8gYWRkIG5vdy4gKi8KK3N0YXRpYyBzdHJ1Y3QgaXBxICppcHFfaGFzaFtJUFFfSEFTSFNaXTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKGlwZnJhZ19sb2NrKTsKK3N0YXRpYyB1MzIgaXBmcmFnX2hhc2hfcm5kOworc3RhdGljIExJU1RfSEVBRChpcHFfbHJ1X2xpc3QpOworaW50IGlwX2ZyYWdfbnF1ZXVlcyA9IDA7CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19pcHFfdW5saW5rKHN0cnVjdCBpcHEgKnFwKQoreworCWlmKHFwLT5uZXh0KQorCQlxcC0+bmV4dC0+cHByZXYgPSBxcC0+cHByZXY7CisJKnFwLT5wcHJldiA9IHFwLT5uZXh0OworCWxpc3RfZGVsKCZxcC0+bHJ1X2xpc3QpOworCWlwX2ZyYWdfbnF1ZXVlcy0tOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGlwcV91bmxpbmsoc3RydWN0IGlwcSAqaXBxKQoreworCXdyaXRlX2xvY2soJmlwZnJhZ19sb2NrKTsKKwlfX2lwcV91bmxpbmsoaXBxKTsKKwl3cml0ZV91bmxvY2soJmlwZnJhZ19sb2NrKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBpcHFoYXNoZm4odTE2IGlkLCB1MzIgc2FkZHIsIHUzMiBkYWRkciwgdTggcHJvdCkKK3sKKwlyZXR1cm4gamhhc2hfM3dvcmRzKCh1MzIpaWQgPDwgMTYgfCBwcm90LCBzYWRkciwgZGFkZHIsCisJCQkgICAgaXBmcmFnX2hhc2hfcm5kKSAmIChJUFFfSEFTSFNaIC0gMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBpcGZyYWdfc2VjcmV0X3RpbWVyOworaW50IHN5c2N0bF9pcGZyYWdfc2VjcmV0X2ludGVydmFsID0gMTAgKiA2MCAqIEhaOworCitzdGF0aWMgdm9pZCBpcGZyYWdfc2VjcmV0X3JlYnVpbGQodW5zaWduZWQgbG9uZyBkdW1teSkKK3sKKwl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisJaW50IGk7CisKKwl3cml0ZV9sb2NrKCZpcGZyYWdfbG9jayk7CisJZ2V0X3JhbmRvbV9ieXRlcygmaXBmcmFnX2hhc2hfcm5kLCBzaXplb2YodTMyKSk7CisJZm9yIChpID0gMDsgaSA8IElQUV9IQVNIU1o7IGkrKykgeworCQlzdHJ1Y3QgaXBxICpxOworCisJCXEgPSBpcHFfaGFzaFtpXTsKKwkJd2hpbGUgKHEpIHsKKwkJCXN0cnVjdCBpcHEgKm5leHQgPSBxLT5uZXh0OworCQkJdW5zaWduZWQgaW50IGh2YWwgPSBpcHFoYXNoZm4ocS0+aWQsIHEtPnNhZGRyLAorCQkJCQkJICAgICAgcS0+ZGFkZHIsIHEtPnByb3RvY29sKTsKKworCQkJaWYgKGh2YWwgIT0gaSkgeworCQkJCS8qIFVubGluay4gKi8KKwkJCQlpZiAocS0+bmV4dCkKKwkJCQkJcS0+bmV4dC0+cHByZXYgPSBxLT5wcHJldjsKKwkJCQkqcS0+cHByZXYgPSBxLT5uZXh0OworCisJCQkJLyogUmVsaW5rIHRvIG5ldyBoYXNoIGNoYWluLiAqLworCQkJCWlmICgocS0+bmV4dCA9IGlwcV9oYXNoW2h2YWxdKSAhPSBOVUxMKQorCQkJCQlxLT5uZXh0LT5wcHJldiA9ICZxLT5uZXh0OworCQkJCWlwcV9oYXNoW2h2YWxdID0gcTsKKwkJCQlxLT5wcHJldiA9ICZpcHFfaGFzaFtodmFsXTsKKwkJCX0KKworCQkJcSA9IG5leHQ7CisJCX0KKwl9CisJd3JpdGVfdW5sb2NrKCZpcGZyYWdfbG9jayk7CisKKwltb2RfdGltZXIoJmlwZnJhZ19zZWNyZXRfdGltZXIsIG5vdyArIHN5c2N0bF9pcGZyYWdfc2VjcmV0X2ludGVydmFsKTsKK30KKworYXRvbWljX3QgaXBfZnJhZ19tZW0gPSBBVE9NSUNfSU5JVCgwKTsJLyogTWVtb3J5IHVzZWQgZm9yIGZyYWdtZW50cyAqLworCisvKiBNZW1vcnkgVHJhY2tpbmcgRnVuY3Rpb25zLiAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBmcmFnX2tmcmVlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgKndvcmspCit7CisJaWYgKHdvcmspCisJCSp3b3JrIC09IHNrYi0+dHJ1ZXNpemU7CisJYXRvbWljX3N1Yihza2ItPnRydWVzaXplLCAmaXBfZnJhZ19tZW0pOworCWtmcmVlX3NrYihza2IpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGZyYWdfZnJlZV9xdWV1ZShzdHJ1Y3QgaXBxICpxcCwgaW50ICp3b3JrKQoreworCWlmICh3b3JrKQorCQkqd29yayAtPSBzaXplb2Yoc3RydWN0IGlwcSk7CisJYXRvbWljX3N1YihzaXplb2Yoc3RydWN0IGlwcSksICZpcF9mcmFnX21lbSk7CisJa2ZyZWUocXApOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgaXBxICpmcmFnX2FsbG9jX3F1ZXVlKHZvaWQpCit7CisJc3RydWN0IGlwcSAqcXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXBxKSwgR0ZQX0FUT01JQyk7CisKKwlpZighcXApCisJCXJldHVybiBOVUxMOworCWF0b21pY19hZGQoc2l6ZW9mKHN0cnVjdCBpcHEpLCAmaXBfZnJhZ19tZW0pOworCXJldHVybiBxcDsKK30KKworCisvKiBEZXN0cnVjdGlvbiBwcmltaXRpdmVzLiAqLworCisvKiBDb21wbGV0ZSBkZXN0cnVjdGlvbiBvZiBpcHEuICovCitzdGF0aWMgdm9pZCBpcF9mcmFnX2Rlc3Ryb3koc3RydWN0IGlwcSAqcXAsIGludCAqd29yaykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqZnA7CisKKwlCVUdfVFJBUChxcC0+bGFzdF9pbiZDT01QTEVURSk7CisJQlVHX1RSQVAoZGVsX3RpbWVyKCZxcC0+dGltZXIpID09IDApOworCisJLyogUmVsZWFzZSBhbGwgZnJhZ21lbnQgZGF0YS4gKi8KKwlmcCA9IHFwLT5mcmFnbWVudHM7CisJd2hpbGUgKGZwKSB7CisJCXN0cnVjdCBza19idWZmICp4cCA9IGZwLT5uZXh0OworCisJCWZyYWdfa2ZyZWVfc2tiKGZwLCB3b3JrKTsKKwkJZnAgPSB4cDsKKwl9CisKKwkvKiBGaW5hbGx5LCByZWxlYXNlIHRoZSBxdWV1ZSBkZXNjcmlwdG9yIGl0c2VsZi4gKi8KKwlmcmFnX2ZyZWVfcXVldWUocXAsIHdvcmspOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGlwcV9wdXQoc3RydWN0IGlwcSAqaXBxLCBpbnQgKndvcmspCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmlwcS0+cmVmY250KSkKKwkJaXBfZnJhZ19kZXN0cm95KGlwcSwgd29yayk7Cit9CisKKy8qIEtpbGwgaXBxIGVudHJ5LiBJdCBpcyBub3QgZGVzdHJveWVkIGltbWVkaWF0ZWx5LAorICogYmVjYXVzZSBjYWxsZXIgKGFuZCBzb21lb25lIG1vcmUpIGhvbGRzIHJlZmVyZW5jZSBjb3VudC4KKyAqLworc3RhdGljIHZvaWQgaXBxX2tpbGwoc3RydWN0IGlwcSAqaXBxKQoreworCWlmIChkZWxfdGltZXIoJmlwcS0+dGltZXIpKQorCQlhdG9taWNfZGVjKCZpcHEtPnJlZmNudCk7CisKKwlpZiAoIShpcHEtPmxhc3RfaW4gJiBDT01QTEVURSkpIHsKKwkJaXBxX3VubGluayhpcHEpOworCQlhdG9taWNfZGVjKCZpcHEtPnJlZmNudCk7CisJCWlwcS0+bGFzdF9pbiB8PSBDT01QTEVURTsKKwl9Cit9CisKKy8qIE1lbW9yeSBsaW1pdGluZyBvbiBmcmFnbWVudHMuICBFdmljdG9yIHRyYXNoZXMgdGhlIG9sZGVzdCAKKyAqIGZyYWdtZW50IHF1ZXVlIHVudGlsIHdlIGFyZSBiYWNrIHVuZGVyIHRoZSB0aHJlc2hvbGQuCisgKi8KK3N0YXRpYyB2b2lkIGlwX2V2aWN0b3Iodm9pZCkKK3sKKwlzdHJ1Y3QgaXBxICpxcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJaW50IHdvcms7CisKKwl3b3JrID0gYXRvbWljX3JlYWQoJmlwX2ZyYWdfbWVtKSAtIHN5c2N0bF9pcGZyYWdfbG93X3RocmVzaDsKKwlpZiAod29yayA8PSAwKQorCQlyZXR1cm47CisKKwl3aGlsZSAod29yayA+IDApIHsKKwkJcmVhZF9sb2NrKCZpcGZyYWdfbG9jayk7CisJCWlmIChsaXN0X2VtcHR5KCZpcHFfbHJ1X2xpc3QpKSB7CisJCQlyZWFkX3VubG9jaygmaXBmcmFnX2xvY2spOworCQkJcmV0dXJuOworCQl9CisJCXRtcCA9IGlwcV9scnVfbGlzdC5uZXh0OworCQlxcCA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgaXBxLCBscnVfbGlzdCk7CisJCWF0b21pY19pbmMoJnFwLT5yZWZjbnQpOworCQlyZWFkX3VubG9jaygmaXBmcmFnX2xvY2spOworCisJCXNwaW5fbG9jaygmcXAtPmxvY2spOworCQlpZiAoIShxcC0+bGFzdF9pbiZDT01QTEVURSkpCisJCQlpcHFfa2lsbChxcCk7CisJCXNwaW5fdW5sb2NrKCZxcC0+bG9jayk7CisKKwkJaXBxX3B1dChxcCwgJndvcmspOworCQlJUF9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfUkVBU01GQUlMUyk7CisJfQorfQorCisvKgorICogT29wcywgYSBmcmFnbWVudCBxdWV1ZSB0aW1lZCBvdXQuICBLaWxsIGl0IGFuZCBzZW5kIGFuIElDTVAgcmVwbHkuCisgKi8KK3N0YXRpYyB2b2lkIGlwX2V4cGlyZSh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaXBxICpxcCA9IChzdHJ1Y3QgaXBxICopIGFyZzsKKworCXNwaW5fbG9jaygmcXAtPmxvY2spOworCisJaWYgKHFwLT5sYXN0X2luICYgQ09NUExFVEUpCisJCWdvdG8gb3V0OworCisJaXBxX2tpbGwocXApOworCisJSVBfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX1JFQVNNVElNRU9VVCk7CisJSVBfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX1JFQVNNRkFJTFMpOworCisJaWYgKChxcC0+bGFzdF9pbiZGSVJTVF9JTikgJiYgcXAtPmZyYWdtZW50cyAhPSBOVUxMKSB7CisJCXN0cnVjdCBza19idWZmICpoZWFkID0gcXAtPmZyYWdtZW50czsKKwkJLyogU2VuZCBhbiBJQ01QICJGcmFnbWVudCBSZWFzc2VtYmx5IFRpbWVvdXQiIG1lc3NhZ2UuICovCisJCWlmICgoaGVhZC0+ZGV2ID0gZGV2X2dldF9ieV9pbmRleChxcC0+aWlmKSkgIT0gTlVMTCkgeworCQkJaWNtcF9zZW5kKGhlYWQsIElDTVBfVElNRV9FWENFRURFRCwgSUNNUF9FWENfRlJBR1RJTUUsIDApOworCQkJZGV2X3B1dChoZWFkLT5kZXYpOworCQl9CisJfQorb3V0OgorCXNwaW5fdW5sb2NrKCZxcC0+bG9jayk7CisJaXBxX3B1dChxcCwgTlVMTCk7Cit9CisKKy8qIENyZWF0aW9uIHByaW1pdGl2ZXMuICovCisKK3N0YXRpYyBzdHJ1Y3QgaXBxICppcF9mcmFnX2ludGVybih1bnNpZ25lZCBpbnQgaGFzaCwgc3RydWN0IGlwcSAqcXBfaW4pCit7CisJc3RydWN0IGlwcSAqcXA7CisKKwl3cml0ZV9sb2NrKCZpcGZyYWdfbG9jayk7CisjaWZkZWYgQ09ORklHX1NNUAorCS8qIFdpdGggU01QIHJhY2Ugd2UgaGF2ZSB0byByZWNoZWNrIGhhc2ggdGFibGUsIGJlY2F1c2UKKwkgKiBzdWNoIGVudHJ5IGNvdWxkIGJlIGNyZWF0ZWQgb24gb3RoZXIgY3B1LCB3aGlsZSB3ZQorCSAqIHByb21vdGVkIHJlYWQgbG9jayB0byB3cml0ZSBsb2NrLgorCSAqLworCWZvcihxcCA9IGlwcV9oYXNoW2hhc2hdOyBxcDsgcXAgPSBxcC0+bmV4dCkgeworCQlpZihxcC0+aWQgPT0gcXBfaW4tPmlkCQkmJgorCQkgICBxcC0+c2FkZHIgPT0gcXBfaW4tPnNhZGRyCSYmCisJCSAgIHFwLT5kYWRkciA9PSBxcF9pbi0+ZGFkZHIJJiYKKwkJICAgcXAtPnByb3RvY29sID09IHFwX2luLT5wcm90b2NvbCAmJgorCQkgICBxcC0+dXNlciA9PSBxcF9pbi0+dXNlcikgeworCQkJYXRvbWljX2luYygmcXAtPnJlZmNudCk7CisJCQl3cml0ZV91bmxvY2soJmlwZnJhZ19sb2NrKTsKKwkJCXFwX2luLT5sYXN0X2luIHw9IENPTVBMRVRFOworCQkJaXBxX3B1dChxcF9pbiwgTlVMTCk7CisJCQlyZXR1cm4gcXA7CisJCX0KKwl9CisjZW5kaWYKKwlxcCA9IHFwX2luOworCisJaWYgKCFtb2RfdGltZXIoJnFwLT50aW1lciwgamlmZmllcyArIHN5c2N0bF9pcGZyYWdfdGltZSkpCisJCWF0b21pY19pbmMoJnFwLT5yZWZjbnQpOworCisJYXRvbWljX2luYygmcXAtPnJlZmNudCk7CisJaWYoKHFwLT5uZXh0ID0gaXBxX2hhc2hbaGFzaF0pICE9IE5VTEwpCisJCXFwLT5uZXh0LT5wcHJldiA9ICZxcC0+bmV4dDsKKwlpcHFfaGFzaFtoYXNoXSA9IHFwOworCXFwLT5wcHJldiA9ICZpcHFfaGFzaFtoYXNoXTsKKwlJTklUX0xJU1RfSEVBRCgmcXAtPmxydV9saXN0KTsKKwlsaXN0X2FkZF90YWlsKCZxcC0+bHJ1X2xpc3QsICZpcHFfbHJ1X2xpc3QpOworCWlwX2ZyYWdfbnF1ZXVlcysrOworCXdyaXRlX3VubG9jaygmaXBmcmFnX2xvY2spOworCXJldHVybiBxcDsKK30KKworLyogQWRkIGFuIGVudHJ5IHRvIHRoZSAnaXBxJyBxdWV1ZSBmb3IgYSBuZXdseSByZWNlaXZlZCBJUCBkYXRhZ3JhbS4gKi8KK3N0YXRpYyBzdHJ1Y3QgaXBxICppcF9mcmFnX2NyZWF0ZSh1bnNpZ25lZCBoYXNoLCBzdHJ1Y3QgaXBoZHIgKmlwaCwgdTMyIHVzZXIpCit7CisJc3RydWN0IGlwcSAqcXA7CisKKwlpZiAoKHFwID0gZnJhZ19hbGxvY19xdWV1ZSgpKSA9PSBOVUxMKQorCQlnb3RvIG91dF9ub21lbTsKKworCXFwLT5wcm90b2NvbCA9IGlwaC0+cHJvdG9jb2w7CisJcXAtPmxhc3RfaW4gPSAwOworCXFwLT5pZCA9IGlwaC0+aWQ7CisJcXAtPnNhZGRyID0gaXBoLT5zYWRkcjsKKwlxcC0+ZGFkZHIgPSBpcGgtPmRhZGRyOworCXFwLT51c2VyID0gdXNlcjsKKwlxcC0+bGVuID0gMDsKKwlxcC0+bWVhdCA9IDA7CisJcXAtPmZyYWdtZW50cyA9IE5VTEw7CisJcXAtPmlpZiA9IDA7CisKKwkvKiBJbml0aWFsaXplIGEgdGltZXIgZm9yIHRoaXMgZW50cnkuICovCisJaW5pdF90aW1lcigmcXAtPnRpbWVyKTsKKwlxcC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBxcDsJLyogcG9pbnRlciB0byBxdWV1ZQkqLworCXFwLT50aW1lci5mdW5jdGlvbiA9IGlwX2V4cGlyZTsJCS8qIGV4cGlyZSBmdW5jdGlvbgkqLworCXNwaW5fbG9ja19pbml0KCZxcC0+bG9jayk7CisJYXRvbWljX3NldCgmcXAtPnJlZmNudCwgMSk7CisKKwlyZXR1cm4gaXBfZnJhZ19pbnRlcm4oaGFzaCwgcXApOworCitvdXRfbm9tZW06CisJTkVUREVCVUcoaWYgKG5ldF9yYXRlbGltaXQoKSkgcHJpbnRrKEtFUk5fRVJSICJpcF9mcmFnX2NyZWF0ZTogbm8gbWVtb3J5IGxlZnQgIVxuIikpOworCXJldHVybiBOVUxMOworfQorCisvKiBGaW5kIHRoZSBjb3JyZWN0IGVudHJ5IGluIHRoZSAiaW5jb21wbGV0ZSBkYXRhZ3JhbXMiIHF1ZXVlIGZvcgorICogdGhpcyBJUCBkYXRhZ3JhbSwgYW5kIGNyZWF0ZSBuZXcgb25lLCBpZiBub3RoaW5nIGlzIGZvdW5kLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpcHEgKmlwX2ZpbmQoc3RydWN0IGlwaGRyICppcGgsIHUzMiB1c2VyKQoreworCV9fdTE2IGlkID0gaXBoLT5pZDsKKwlfX3UzMiBzYWRkciA9IGlwaC0+c2FkZHI7CisJX191MzIgZGFkZHIgPSBpcGgtPmRhZGRyOworCV9fdTggcHJvdG9jb2wgPSBpcGgtPnByb3RvY29sOworCXVuc2lnbmVkIGludCBoYXNoID0gaXBxaGFzaGZuKGlkLCBzYWRkciwgZGFkZHIsIHByb3RvY29sKTsKKwlzdHJ1Y3QgaXBxICpxcDsKKworCXJlYWRfbG9jaygmaXBmcmFnX2xvY2spOworCWZvcihxcCA9IGlwcV9oYXNoW2hhc2hdOyBxcDsgcXAgPSBxcC0+bmV4dCkgeworCQlpZihxcC0+aWQgPT0gaWQJCSYmCisJCSAgIHFwLT5zYWRkciA9PSBzYWRkcgkmJgorCQkgICBxcC0+ZGFkZHIgPT0gZGFkZHIJJiYKKwkJICAgcXAtPnByb3RvY29sID09IHByb3RvY29sICYmCisJCSAgIHFwLT51c2VyID09IHVzZXIpIHsKKwkJCWF0b21pY19pbmMoJnFwLT5yZWZjbnQpOworCQkJcmVhZF91bmxvY2soJmlwZnJhZ19sb2NrKTsKKwkJCXJldHVybiBxcDsKKwkJfQorCX0KKwlyZWFkX3VubG9jaygmaXBmcmFnX2xvY2spOworCisJcmV0dXJuIGlwX2ZyYWdfY3JlYXRlKGhhc2gsIGlwaCwgdXNlcik7Cit9CisKKy8qIEFkZCBuZXcgc2VnbWVudCB0byBleGlzdGluZyBxdWV1ZS4gKi8KK3N0YXRpYyB2b2lkIGlwX2ZyYWdfcXVldWUoc3RydWN0IGlwcSAqcXAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKnByZXYsICpuZXh0OworCWludCBmbGFncywgb2Zmc2V0OworCWludCBpaGwsIGVuZDsKKworCWlmIChxcC0+bGFzdF9pbiAmIENPTVBMRVRFKQorCQlnb3RvIGVycjsKKworIAlvZmZzZXQgPSBudG9ocyhza2ItPm5oLmlwaC0+ZnJhZ19vZmYpOworCWZsYWdzID0gb2Zmc2V0ICYgfklQX09GRlNFVDsKKwlvZmZzZXQgJj0gSVBfT0ZGU0VUOworCW9mZnNldCA8PD0gMzsJCS8qIG9mZnNldCBpcyBpbiA4LWJ5dGUgY2h1bmtzICovCisgCWlobCA9IHNrYi0+bmguaXBoLT5paGwgKiA0OworCisJLyogRGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiBvZiB0aGlzIGZyYWdtZW50LiAqLworIAllbmQgPSBvZmZzZXQgKyBza2ItPmxlbiAtIGlobDsKKworCS8qIElzIHRoaXMgdGhlIGZpbmFsIGZyYWdtZW50PyAqLworCWlmICgoZmxhZ3MgJiBJUF9NRikgPT0gMCkgeworCQkvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgc29tZSBiaXRzIGJleW9uZCBlbmQKKwkJICogb3IgaGF2ZSBkaWZmZXJlbnQgZW5kLCB0aGUgc2VnbWVudCBpcyBjb3JycnVwdGVkLgorCQkgKi8KKwkJaWYgKGVuZCA8IHFwLT5sZW4gfHwKKwkJICAgICgocXAtPmxhc3RfaW4gJiBMQVNUX0lOKSAmJiBlbmQgIT0gcXAtPmxlbikpCisJCQlnb3RvIGVycjsKKwkJcXAtPmxhc3RfaW4gfD0gTEFTVF9JTjsKKwkJcXAtPmxlbiA9IGVuZDsKKwl9IGVsc2UgeworCQlpZiAoZW5kJjcpIHsKKwkJCWVuZCAmPSB+NzsKKwkJCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSkKKwkJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCX0KKwkJaWYgKGVuZCA+IHFwLT5sZW4pIHsKKwkJCS8qIFNvbWUgYml0cyBiZXlvbmQgZW5kIC0+IGNvcnJ1cHRpb24uICovCisJCQlpZiAocXAtPmxhc3RfaW4gJiBMQVNUX0lOKQorCQkJCWdvdG8gZXJyOworCQkJcXAtPmxlbiA9IGVuZDsKKwkJfQorCX0KKwlpZiAoZW5kID09IG9mZnNldCkKKwkJZ290byBlcnI7CisKKwlpZiAocHNrYl9wdWxsKHNrYiwgaWhsKSA9PSBOVUxMKQorCQlnb3RvIGVycjsKKwlpZiAocHNrYl90cmltKHNrYiwgZW5kLW9mZnNldCkpCisJCWdvdG8gZXJyOworCisJLyogRmluZCBvdXQgd2hpY2ggZnJhZ21lbnRzIGFyZSBpbiBmcm9udCBhbmQgYXQgdGhlIGJhY2sgb2YgdXMKKwkgKiBpbiB0aGUgY2hhaW4gb2YgZnJhZ21lbnRzIHNvIGZhci4gIFdlIG11c3Qga25vdyB3aGVyZSB0byBwdXQKKwkgKiB0aGlzIGZyYWdtZW50LCByaWdodD8KKwkgKi8KKwlwcmV2ID0gTlVMTDsKKwlmb3IobmV4dCA9IHFwLT5mcmFnbWVudHM7IG5leHQgIT0gTlVMTDsgbmV4dCA9IG5leHQtPm5leHQpIHsKKwkJaWYgKEZSQUdfQ0IobmV4dCktPm9mZnNldCA+PSBvZmZzZXQpCisJCQlicmVhazsJLyogYmluZ28hICovCisJCXByZXYgPSBuZXh0OworCX0KKworCS8qIFdlIGZvdW5kIHdoZXJlIHRvIHB1dCB0aGlzIG9uZS4gIENoZWNrIGZvciBvdmVybGFwIHdpdGgKKwkgKiBwcmVjZWRpbmcgZnJhZ21lbnQsIGFuZCwgaWYgbmVlZGVkLCBhbGlnbiB0aGluZ3Mgc28gdGhhdAorCSAqIGFueSBvdmVybGFwcyBhcmUgZWxpbWluYXRlZC4KKwkgKi8KKwlpZiAocHJldikgeworCQlpbnQgaSA9IChGUkFHX0NCKHByZXYpLT5vZmZzZXQgKyBwcmV2LT5sZW4pIC0gb2Zmc2V0OworCisJCWlmIChpID4gMCkgeworCQkJb2Zmc2V0ICs9IGk7CisJCQlpZiAoZW5kIDw9IG9mZnNldCkKKwkJCQlnb3RvIGVycjsKKwkJCWlmICghcHNrYl9wdWxsKHNrYiwgaSkpCisJCQkJZ290byBlcnI7CisJCQlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpCisJCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQl9CisJfQorCisJd2hpbGUgKG5leHQgJiYgRlJBR19DQihuZXh0KS0+b2Zmc2V0IDwgZW5kKSB7CisJCWludCBpID0gZW5kIC0gRlJBR19DQihuZXh0KS0+b2Zmc2V0OyAvKiBvdmVybGFwIGlzICdpJyBieXRlcyAqLworCisJCWlmIChpIDwgbmV4dC0+bGVuKSB7CisJCQkvKiBFYXQgaGVhZCBvZiB0aGUgbmV4dCBvdmVybGFwcGVkIGZyYWdtZW50CisJCQkgKiBhbmQgbGVhdmUgdGhlIGxvb3AuIFRoZSBuZXh0IG9uZXMgY2Fubm90IG92ZXJsYXAuCisJCQkgKi8KKwkJCWlmICghcHNrYl9wdWxsKG5leHQsIGkpKQorCQkJCWdvdG8gZXJyOworCQkJRlJBR19DQihuZXh0KS0+b2Zmc2V0ICs9IGk7CisJCQlxcC0+bWVhdCAtPSBpOworCQkJaWYgKG5leHQtPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSkKKwkJCQluZXh0LT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqZnJlZV9pdCA9IG5leHQ7CisKKwkJCS8qIE9sZCBmcmFnbW5ldCBpcyBjb21wbGV0ZWx5IG92ZXJyaWRkZW4gd2l0aAorCQkJICogbmV3IG9uZSBkcm9wIGl0LgorCQkJICovCisJCQluZXh0ID0gbmV4dC0+bmV4dDsKKworCQkJaWYgKHByZXYpCisJCQkJcHJldi0+bmV4dCA9IG5leHQ7CisJCQllbHNlCisJCQkJcXAtPmZyYWdtZW50cyA9IG5leHQ7CisKKwkJCXFwLT5tZWF0IC09IGZyZWVfaXQtPmxlbjsKKwkJCWZyYWdfa2ZyZWVfc2tiKGZyZWVfaXQsIE5VTEwpOworCQl9CisJfQorCisJRlJBR19DQihza2IpLT5vZmZzZXQgPSBvZmZzZXQ7CisKKwkvKiBJbnNlcnQgdGhpcyBmcmFnbWVudCBpbiB0aGUgY2hhaW4gb2YgZnJhZ21lbnRzLiAqLworCXNrYi0+bmV4dCA9IG5leHQ7CisJaWYgKHByZXYpCisJCXByZXYtPm5leHQgPSBza2I7CisJZWxzZQorCQlxcC0+ZnJhZ21lbnRzID0gc2tiOworCisgCWlmIChza2ItPmRldikKKyAJCXFwLT5paWYgPSBza2ItPmRldi0+aWZpbmRleDsKKwlza2ItPmRldiA9IE5VTEw7CisJcXAtPnN0YW1wID0gc2tiLT5zdGFtcDsKKwlxcC0+bWVhdCArPSBza2ItPmxlbjsKKwlhdG9taWNfYWRkKHNrYi0+dHJ1ZXNpemUsICZpcF9mcmFnX21lbSk7CisJaWYgKG9mZnNldCA9PSAwKQorCQlxcC0+bGFzdF9pbiB8PSBGSVJTVF9JTjsKKworCXdyaXRlX2xvY2soJmlwZnJhZ19sb2NrKTsKKwlsaXN0X21vdmVfdGFpbCgmcXAtPmxydV9saXN0LCAmaXBxX2xydV9saXN0KTsKKwl3cml0ZV91bmxvY2soJmlwZnJhZ19sb2NrKTsKKworCXJldHVybjsKKworZXJyOgorCWtmcmVlX3NrYihza2IpOworfQorCisKKy8qIEJ1aWxkIGEgbmV3IElQIGRhdGFncmFtIGZyb20gYWxsIGl0cyBmcmFnbWVudHMuICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaXBfZnJhZ19yZWFzbShzdHJ1Y3QgaXBxICpxcCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqZnAsICpoZWFkID0gcXAtPmZyYWdtZW50czsKKwlpbnQgbGVuOworCWludCBpaGxlbjsKKworCWlwcV9raWxsKHFwKTsKKworCUJVR19UUkFQKGhlYWQgIT0gTlVMTCk7CisJQlVHX1RSQVAoRlJBR19DQihoZWFkKS0+b2Zmc2V0ID09IDApOworCisJLyogQWxsb2NhdGUgYSBuZXcgYnVmZmVyIGZvciB0aGUgZGF0YWdyYW0uICovCisJaWhsZW4gPSBoZWFkLT5uaC5pcGgtPmlobCo0OworCWxlbiA9IGlobGVuICsgcXAtPmxlbjsKKworCWlmKGxlbiA+IDY1NTM1KQorCQlnb3RvIG91dF9vdmVyc2l6ZTsKKworCS8qIEhlYWQgb2YgbGlzdCBtdXN0IG5vdCBiZSBjbG9uZWQuICovCisJaWYgKHNrYl9jbG9uZWQoaGVhZCkgJiYgcHNrYl9leHBhbmRfaGVhZChoZWFkLCAwLCAwLCBHRlBfQVRPTUlDKSkKKwkJZ290byBvdXRfbm9tZW07CisKKwkvKiBJZiB0aGUgZmlyc3QgZnJhZ21lbnQgaXMgZnJhZ21lbnRlZCBpdHNlbGYsIHdlIHNwbGl0CisJICogaXQgdG8gdHdvIGNodW5rczogdGhlIGZpcnN0IHdpdGggZGF0YSBhbmQgcGFnZWQgcGFydAorCSAqIGFuZCB0aGUgc2Vjb25kLCBob2xkaW5nIG9ubHkgZnJhZ21lbnRzLiAqLworCWlmIChza2Jfc2hpbmZvKGhlYWQpLT5mcmFnX2xpc3QpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKmNsb25lOworCQlpbnQgaSwgcGxlbiA9IDA7CisKKwkJaWYgKChjbG9uZSA9IGFsbG9jX3NrYigwLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwkJCWdvdG8gb3V0X25vbWVtOworCQljbG9uZS0+bmV4dCA9IGhlYWQtPm5leHQ7CisJCWhlYWQtPm5leHQgPSBjbG9uZTsKKwkJc2tiX3NoaW5mbyhjbG9uZSktPmZyYWdfbGlzdCA9IHNrYl9zaGluZm8oaGVhZCktPmZyYWdfbGlzdDsKKwkJc2tiX3NoaW5mbyhoZWFkKS0+ZnJhZ19saXN0ID0gTlVMTDsKKwkJZm9yIChpPTA7IGk8c2tiX3NoaW5mbyhoZWFkKS0+bnJfZnJhZ3M7IGkrKykKKwkJCXBsZW4gKz0gc2tiX3NoaW5mbyhoZWFkKS0+ZnJhZ3NbaV0uc2l6ZTsKKwkJY2xvbmUtPmxlbiA9IGNsb25lLT5kYXRhX2xlbiA9IGhlYWQtPmRhdGFfbGVuIC0gcGxlbjsKKwkJaGVhZC0+ZGF0YV9sZW4gLT0gY2xvbmUtPmxlbjsKKwkJaGVhZC0+bGVuIC09IGNsb25lLT5sZW47CisJCWNsb25lLT5jc3VtID0gMDsKKwkJY2xvbmUtPmlwX3N1bW1lZCA9IGhlYWQtPmlwX3N1bW1lZDsKKwkJYXRvbWljX2FkZChjbG9uZS0+dHJ1ZXNpemUsICZpcF9mcmFnX21lbSk7CisJfQorCisJc2tiX3NoaW5mbyhoZWFkKS0+ZnJhZ19saXN0ID0gaGVhZC0+bmV4dDsKKwlza2JfcHVzaChoZWFkLCBoZWFkLT5kYXRhIC0gaGVhZC0+bmgucmF3KTsKKwlhdG9taWNfc3ViKGhlYWQtPnRydWVzaXplLCAmaXBfZnJhZ19tZW0pOworCisJZm9yIChmcD1oZWFkLT5uZXh0OyBmcDsgZnAgPSBmcC0+bmV4dCkgeworCQloZWFkLT5kYXRhX2xlbiArPSBmcC0+bGVuOworCQloZWFkLT5sZW4gKz0gZnAtPmxlbjsKKwkJaWYgKGhlYWQtPmlwX3N1bW1lZCAhPSBmcC0+aXBfc3VtbWVkKQorCQkJaGVhZC0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJZWxzZSBpZiAoaGVhZC0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKQorCQkJaGVhZC0+Y3N1bSA9IGNzdW1fYWRkKGhlYWQtPmNzdW0sIGZwLT5jc3VtKTsKKwkJaGVhZC0+dHJ1ZXNpemUgKz0gZnAtPnRydWVzaXplOworCQlhdG9taWNfc3ViKGZwLT50cnVlc2l6ZSwgJmlwX2ZyYWdfbWVtKTsKKwl9CisKKwloZWFkLT5uZXh0ID0gTlVMTDsKKwloZWFkLT5kZXYgPSBkZXY7CisJaGVhZC0+c3RhbXAgPSBxcC0+c3RhbXA7CisKKwlpcGggPSBoZWFkLT5uaC5pcGg7CisJaXBoLT5mcmFnX29mZiA9IDA7CisJaXBoLT50b3RfbGVuID0gaHRvbnMobGVuKTsKKwlJUF9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfUkVBU01PS1MpOworCXFwLT5mcmFnbWVudHMgPSBOVUxMOworCXJldHVybiBoZWFkOworCitvdXRfbm9tZW06CisgCU5FVERFQlVHKGlmIChuZXRfcmF0ZWxpbWl0KCkpCisJICAgICAgICAgcHJpbnRrKEtFUk5fRVJSIAorCQkJIklQOiBxdWV1ZV9nbHVlOiBubyBtZW1vcnkgZm9yIGdsdWluZyBxdWV1ZSAlcFxuIiwKKwkJCXFwKSk7CisJZ290byBvdXRfZmFpbDsKK291dF9vdmVyc2l6ZToKKwlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQlwcmludGsoS0VSTl9JTkZPCisJCQkiT3ZlcnNpemVkIElQIHBhY2tldCBmcm9tICVkLiVkLiVkLiVkLlxuIiwKKwkJCU5JUFFVQUQocXAtPnNhZGRyKSk7CitvdXRfZmFpbDoKKwlJUF9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfUkVBU01GQUlMUyk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFByb2Nlc3MgYW4gaW5jb21pbmcgSVAgZGF0YWdyYW0gZnJhZ21lbnQuICovCitzdHJ1Y3Qgc2tfYnVmZiAqaXBfZGVmcmFnKHN0cnVjdCBza19idWZmICpza2IsIHUzMiB1c2VyKQoreworCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisJc3RydWN0IGlwcSAqcXA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwkKKwlJUF9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfUkVBU01SRVFEUyk7CisKKwkvKiBTdGFydCBieSBjbGVhbmluZyB1cCB0aGUgbWVtb3J5LiAqLworCWlmIChhdG9taWNfcmVhZCgmaXBfZnJhZ19tZW0pID4gc3lzY3RsX2lwZnJhZ19oaWdoX3RocmVzaCkKKwkJaXBfZXZpY3RvcigpOworCisJZGV2ID0gc2tiLT5kZXY7CisKKwkvKiBMb29rdXAgKG9yIGNyZWF0ZSkgcXVldWUgaGVhZGVyICovCisJaWYgKChxcCA9IGlwX2ZpbmQoaXBoLCB1c2VyKSkgIT0gTlVMTCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqcmV0ID0gTlVMTDsKKworCQlzcGluX2xvY2soJnFwLT5sb2NrKTsKKworCQlpcF9mcmFnX3F1ZXVlKHFwLCBza2IpOworCisJCWlmIChxcC0+bGFzdF9pbiA9PSAoRklSU1RfSU58TEFTVF9JTikgJiYKKwkJICAgIHFwLT5tZWF0ID09IHFwLT5sZW4pCisJCQlyZXQgPSBpcF9mcmFnX3JlYXNtKHFwLCBkZXYpOworCisJCXNwaW5fdW5sb2NrKCZxcC0+bG9jayk7CisJCWlwcV9wdXQocXAsIE5VTEwpOworCQlyZXR1cm4gcmV0OworCX0KKworCUlQX0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9SRUFTTUZBSUxTKTsKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBpcGZyYWdfaW5pdCh2b2lkKQoreworCWlwZnJhZ19oYXNoX3JuZCA9ICh1MzIpICgobnVtX3BoeXNwYWdlcyBeIChudW1fcGh5c3BhZ2VzPj43KSkgXgorCQkJCSAoamlmZmllcyBeIChqaWZmaWVzID4+IDYpKSk7CisKKwlpbml0X3RpbWVyKCZpcGZyYWdfc2VjcmV0X3RpbWVyKTsKKwlpcGZyYWdfc2VjcmV0X3RpbWVyLmZ1bmN0aW9uID0gaXBmcmFnX3NlY3JldF9yZWJ1aWxkOworCWlwZnJhZ19zZWNyZXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBzeXNjdGxfaXBmcmFnX3NlY3JldF9pbnRlcnZhbDsKKwlhZGRfdGltZXIoJmlwZnJhZ19zZWNyZXRfdGltZXIpOworfQorCitFWFBPUlRfU1lNQk9MKGlwX2RlZnJhZyk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9ncmUuYyBiL25ldC9pcHY0L2lwX2dyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NDgzNTUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9pcF9ncmUuYwpAQCAtMCwwICsxLDEyOTAgQEAKKy8qCisgKglMaW51eCBORVQzOglHUkUgb3ZlciBJUCBwcm90b2NvbCBkZWNvZGVyLiAKKyAqCisgKglBdXRob3JzOiBBbGV4ZXkgS3V6bmV0c292IChrdXpuZXRAbXMyLmluci5hYy5ydSkKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9tcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lnbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorCisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaWNtcC5oPgorI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgorI2luY2x1ZGUgPG5ldC9pcGlwLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorI2luY2x1ZGUgPG5ldC9kc2ZpZWxkLmg+CisjaW5jbHVkZSA8bmV0L2luZXRfZWNuLmg+CisjaW5jbHVkZSA8bmV0L3hmcm0uaD4KKworI2lmZGVmIENPTkZJR19JUFY2CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvaXA2X2ZpYi5oPgorI2luY2x1ZGUgPG5ldC9pcDZfcm91dGUuaD4KKyNlbmRpZgorCisvKgorICAgUHJvYmxlbXMgJiBzb2x1dGlvbnMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIDEuIFRoZSBtb3N0IGltcG9ydGFudCBpc3N1ZSBpcyBkZXRlY3RpbmcgbG9jYWwgZGVhZCBsb29wcy4KKyAgIFRoZXkgd291bGQgY2F1c2UgY29tcGxldGUgaG9zdCBsb2NrdXAgaW4gdHJhbnNtaXQsIHdoaWNoCisgICB3b3VsZCBiZSAicmVzb2x2ZWQiIGJ5IHN0YWNrIG92ZXJmbG93IG9yLCBpZiBxdWV1ZWluZyBpcyBlbmFibGVkLAorICAgd2l0aCBpbmZpbml0ZSBsb29waW5nIGluIG5ldF9iaC4KKworICAgV2UgY2Fubm90IHRyYWNrIHN1Y2ggZGVhZCBsb29wcyBkdXJpbmcgcm91dGUgaW5zdGFsbGF0aW9uLAorICAgaXQgaXMgaW5mZWFzaWJsZSB0YXNrLiBUaGUgbW9zdCBnZW5lcmFsIHNvbHV0aW9ucyB3b3VsZCBiZQorICAgdG8ga2VlcCBza2ItPmVuY2Fwc3VsYXRpb24gY291bnRlciAoc29ydCBvZiBsb2NhbCB0dGwpLAorICAgYW5kIHNpbGVudGx5IGRyb3AgcGFja2V0IHdoZW4gaXQgZXhwaXJlcy4gSXQgaXMgdGhlIGJlc3QKKyAgIHNvbHV0aW9uLCBidXQgaXQgc3VwcG9zZXMgbWFpbnRhaW5nIG5ldyB2YXJpYWJsZSBpbiBBTEwKKyAgIHNrYiwgZXZlbiBpZiBubyB0dW5uZWxpbmcgaXMgdXNlZC4KKworICAgQ3VycmVudCBzb2x1dGlvbjogdC0+cmVjdXJzaW9uIGxvY2sgYnJlYWtzIGRlYWQgbG9vcHMuIEl0IGxvb2tzIAorICAgbGlrZSBkZXYtPnRidXN5IGZsYWcsIGJ1dCBJIHByZWZlcnJlZCBuZXcgdmFyaWFibGUsIGJlY2F1c2UKKyAgIHRoZSBzZW1hbnRpY3MgaXMgZGlmZmVyZW50LiBPbmUgZGF5LCB3aGVuIGhhcmRfc3RhcnRfeG1pdAorICAgd2lsbCBiZSBtdWx0aXRocmVhZGVkIHdlIHdpbGwgaGF2ZSB0byB1c2Ugc2tiLT5lbmNhcHN1bGF0aW9uLgorCisKKworICAgMi4gTmV0d29ya2luZyBkZWFkIGxvb3BzIHdvdWxkIG5vdCBraWxsIHJvdXRlcnMsIGJ1dCB3b3VsZCByZWFsbHkKKyAgIGtpbGwgbmV0d29yay4gSVAgaG9wIGxpbWl0IHBsYXlzIHJvbGUgb2YgInQtPnJlY3Vyc2lvbiIgaW4gdGhpcyBjYXNlLAorICAgaWYgd2UgY29weSBpdCBmcm9tIHBhY2tldCBiZWluZyBlbmNhcHN1bGF0ZWQgdG8gdXBwZXIgaGVhZGVyLgorICAgSXQgaXMgdmVyeSBnb29kIHNvbHV0aW9uLCBidXQgaXQgaW50cm9kdWNlcyB0d28gcHJvYmxlbXM6CisKKyAgIC0gUm91dGluZyBwcm90b2NvbHMsIHVzaW5nIHBhY2tldHMgd2l0aCB0dGw9MSAoT1NQRiwgUklQMiksCisgICAgIGRvIG5vdCB3b3JrIG92ZXIgdHVubmVscy4KKyAgIC0gdHJhY2Vyb3V0ZSBkb2VzIG5vdCB3b3JrLiBJIHBsYW5uZWQgdG8gcmVsYXkgSUNNUCBmcm9tIHR1bm5lbCwKKyAgICAgc28gdGhhdCB0aGlzIHByb2JsZW0gd291bGQgYmUgc29sdmVkIGFuZCB0cmFjZXJvdXRlIG91dHB1dAorICAgICB3b3VsZCBldmVuIG1vcmUgaW5mb3JtYXRpdmUuIFRoaXMgaWRlYSBhcHBlYXJlZCB0byBiZSB3cm9uZzoKKyAgICAgb25seSBMaW51eCBjb21wbGllcyB0byByZmMxODEyIG5vdyAoeWVzLCBndXlzLCBMaW51eCBpcyB0aGUgb25seQorICAgICB0cnVlIHJvdXRlciBub3cgOi0pKSwgYWxsIHJvdXRlcnMgKGF0IGxlYXN0LCBpbiBuZWlnaGJvdXJob29kIG9mIG1pbmUpCisgICAgIHJldHVybiBvbmx5IDggYnl0ZXMgb2YgcGF5bG9hZC4gSXQgaXMgdGhlIGVuZC4KKworICAgSGVuY2UsIGlmIHdlIHdhbnQgdGhhdCBPU1BGIHdvcmtlZCBvciB0cmFjZXJvdXRlIHNhaWQgc29tZXRoaW5nIHJlYXNvbmFibGUsCisgICB3ZSBzaG91bGQgc2VhcmNoIGZvciBhbm90aGVyIHNvbHV0aW9uLgorCisgICBPbmUgb2YgdGhlbSBpcyB0byBwYXJzZSBwYWNrZXQgdHJ5aW5nIHRvIGRldGVjdCBpbm5lciBlbmNhcHN1bGF0aW9uCisgICBtYWRlIGJ5IG91ciBub2RlLiBJdCBpcyBkaWZmaWN1bHQgb3IgZXZlbiBpbXBvc3NpYmxlLCBlc3BlY2lhbGx5LAorICAgdGFraW5nIGludG8gYWNjb3VudCBmcmFnbWVudGF0aW9uLiBUTyBiZSBzaG9ydCwgdHQgaXMgbm90IHNvbHV0aW9uIGF0IGFsbC4KKworICAgQ3VycmVudCBzb2x1dGlvbjogVGhlIHNvbHV0aW9uIHdhcyBVTkVYUEVDVEVETFkgU0lNUExFLgorICAgV2UgZm9yY2UgREYgZmxhZyBvbiB0dW5uZWxzIHdpdGggcHJlY29uZmlndXJlZCBob3AgbGltaXQsCisgICB0aGF0IGlzIEFMTC4gOi0pIFdlbGwsIGl0IGRvZXMgbm90IHJlbW92ZSB0aGUgcHJvYmxlbSBjb21wbGV0ZWx5LAorICAgYnV0IGV4cG9uZW50aWFsIGdyb3d0aCBvZiBuZXR3b3JrIHRyYWZmaWMgaXMgY2hhbmdlZCB0byBsaW5lYXIKKyAgIChicmFuY2hlcywgdGhhdCBleGNlZWQgcG10dSBhcmUgcHJ1bmVkKSBhbmQgdHVubmVsIG10dQorICAgZmFzdGx5IGRlZ3JhZGVzIHRvIHZhbHVlIDw2OCwgd2hlcmUgbG9vcGluZyBzdG9wcy4KKyAgIFllcywgaXQgaXMgbm90IGdvb2QgaWYgdGhlcmUgZXhpc3RzIGEgcm91dGVyIGluIHRoZSBsb29wLAorICAgd2hpY2ggZG9lcyBub3QgZm9yY2UgREYsIGV2ZW4gd2hlbiBlbmNhcHN1bGF0aW5nIHBhY2tldHMgaGF2ZSBERiBzZXQuCisgICBCdXQgaXQgaXMgbm90IG91ciBwcm9ibGVtISBOb2JvZHkgY291bGQgYWNjdXNlIHVzLCB3ZSBtYWRlCisgICBhbGwgdGhhdCB3ZSBjb3VsZCBtYWtlLiBFdmVuIGlmIGl0IGlzIHlvdXIgZ2F0ZWQgd2hvIGluamVjdGVkCisgICBmYXRhbCByb3V0ZSB0byBuZXR3b3JrLCBldmVuIGlmIGl0IHdlcmUgeW91IHdobyBjb25maWd1cmVkCisgICBmYXRhbCBzdGF0aWMgcm91dGU6IHlvdSBhcmUgaW5ub2NlbnQuIDotKQorCisKKworICAgMy4gUmVhbGx5LCBpcHY0L2lwaXAuYywgaXB2NC9pcF9ncmUuYyBhbmQgaXB2Ni9zaXQuYyBjb250YWluCisgICBwcmFjdGljYWxseSBpZGVudGljYWwgY29kZS4gSXQgd291bGQgYmUgZ29vZCB0byBnbHVlIHRoZW0KKyAgIHRvZ2V0aGVyLCBidXQgaXQgaXMgbm90IHZlcnkgZXZpZGVudCwgaG93IHRvIG1ha2UgdGhlbSBtb2R1bGFyLgorICAgc2l0IGlzIGludGVncmFsIHBhcnQgb2YgSVB2NiwgaXBpcCBhbmQgZ3JlIGFyZSBuYXR1cmFsbHkgbW9kdWxhci4KKyAgIFdlIGNvdWxkIGV4dHJhY3QgY29tbW9uIHBhcnRzIChoYXNoIHRhYmxlLCBpb2N0bCBldGMpCisgICB0byBhIHNlcGFyYXRlIG1vZHVsZSAoaXBfdHVubmVsLmMpLgorCisgICBBbGV4ZXkgS3V6bmV0c292LgorICovCisKK3N0YXRpYyBpbnQgaXBncmVfdHVubmVsX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBpcGdyZV90dW5uZWxfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIEZhbGxiYWNrIHR1bm5lbDogbm8gc291cmNlLCBubyBkZXN0aW5hdGlvbiwgbm8ga2V5LCBubyBvcHRpb25zICovCisKK3N0YXRpYyBpbnQgaXBncmVfZmJfdHVubmVsX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqaXBncmVfZmJfdHVubmVsX2RldjsKKworLyogVHVubmVsIGhhc2ggdGFibGUgKi8KKworLyoKKyAgIDQgaGFzaCB0YWJsZXM6CisKKyAgIDM6IChyZW1vdGUsbG9jYWwpCisgICAyOiAocmVtb3RlLCopCisgICAxOiAoKixsb2NhbCkKKyAgIDA6ICgqLCopCisKKyAgIFdlIHJlcXVpcmUgZXhhY3Qga2V5IG1hdGNoIGkuZS4gaWYgYSBrZXkgaXMgcHJlc2VudCBpbiBwYWNrZXQKKyAgIGl0IHdpbGwgbWF0Y2ggb25seSB0dW5uZWwgd2l0aCB0aGUgc2FtZSBrZXk7IGlmIGl0IGlzIG5vdCBwcmVzZW50LAorICAgaXQgd2lsbCBtYXRjaCBvbmx5IGtleWxlc3MgdHVubmVsLgorCisgICBBbGwga2V5c2xlc3MgcGFja2V0cywgaWYgbm90IG1hdGNoZWQgY29uZmlndXJlZCBrZXlsZXNzIHR1bm5lbHMKKyAgIHdpbGwgbWF0Y2ggZmFsbGJhY2sgdHVubmVsLgorICovCisKKyNkZWZpbmUgSEFTSF9TSVpFICAxNgorI2RlZmluZSBIQVNIKGFkZHIpICgoYWRkcl4oYWRkcj4+NCkpJjB4RikKKworc3RhdGljIHN0cnVjdCBpcF90dW5uZWwgKnR1bm5lbHNbNF1bSEFTSF9TSVpFXTsKKworI2RlZmluZSB0dW5uZWxzX3JfbAkodHVubmVsc1szXSkKKyNkZWZpbmUgdHVubmVsc19yCSh0dW5uZWxzWzJdKQorI2RlZmluZSB0dW5uZWxzX2wJKHR1bm5lbHNbMV0pCisjZGVmaW5lIHR1bm5lbHNfd2MJKHR1bm5lbHNbMF0pCisKK3N0YXRpYyBERUZJTkVfUldMT0NLKGlwZ3JlX2xvY2spOworCisvKiBHaXZlbiBzcmMsIGRzdCBhbmQga2V5LCBmaW5kIGFwcHJvcHJpYXRlIGZvciBpbnB1dCB0dW5uZWwuICovCisKK3N0YXRpYyBzdHJ1Y3QgaXBfdHVubmVsICogaXBncmVfdHVubmVsX2xvb2t1cCh1MzIgcmVtb3RlLCB1MzIgbG9jYWwsIHUzMiBrZXkpCit7CisJdW5zaWduZWQgaDAgPSBIQVNIKHJlbW90ZSk7CisJdW5zaWduZWQgaDEgPSBIQVNIKGtleSk7CisJc3RydWN0IGlwX3R1bm5lbCAqdDsKKworCWZvciAodCA9IHR1bm5lbHNfcl9sW2gwXmgxXTsgdDsgdCA9IHQtPm5leHQpIHsKKwkJaWYgKGxvY2FsID09IHQtPnBhcm1zLmlwaC5zYWRkciAmJiByZW1vdGUgPT0gdC0+cGFybXMuaXBoLmRhZGRyKSB7CisJCQlpZiAodC0+cGFybXMuaV9rZXkgPT0ga2V5ICYmICh0LT5kZXYtPmZsYWdzJklGRl9VUCkpCisJCQkJcmV0dXJuIHQ7CisJCX0KKwl9CisJZm9yICh0ID0gdHVubmVsc19yW2gwXmgxXTsgdDsgdCA9IHQtPm5leHQpIHsKKwkJaWYgKHJlbW90ZSA9PSB0LT5wYXJtcy5pcGguZGFkZHIpIHsKKwkJCWlmICh0LT5wYXJtcy5pX2tleSA9PSBrZXkgJiYgKHQtPmRldi0+ZmxhZ3MmSUZGX1VQKSkKKwkJCQlyZXR1cm4gdDsKKwkJfQorCX0KKwlmb3IgKHQgPSB0dW5uZWxzX2xbaDFdOyB0OyB0ID0gdC0+bmV4dCkgeworCQlpZiAobG9jYWwgPT0gdC0+cGFybXMuaXBoLnNhZGRyIHx8CisJCSAgICAgKGxvY2FsID09IHQtPnBhcm1zLmlwaC5kYWRkciAmJiBNVUxUSUNBU1QobG9jYWwpKSkgeworCQkJaWYgKHQtPnBhcm1zLmlfa2V5ID09IGtleSAmJiAodC0+ZGV2LT5mbGFncyZJRkZfVVApKQorCQkJCXJldHVybiB0OworCQl9CisJfQorCWZvciAodCA9IHR1bm5lbHNfd2NbaDFdOyB0OyB0ID0gdC0+bmV4dCkgeworCQlpZiAodC0+cGFybXMuaV9rZXkgPT0ga2V5ICYmICh0LT5kZXYtPmZsYWdzJklGRl9VUCkpCisJCQlyZXR1cm4gdDsKKwl9CisKKwlpZiAoaXBncmVfZmJfdHVubmVsX2Rldi0+ZmxhZ3MmSUZGX1VQKQorCQlyZXR1cm4gaXBncmVfZmJfdHVubmVsX2Rldi0+cHJpdjsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBpcF90dW5uZWwgKippcGdyZV9idWNrZXQoc3RydWN0IGlwX3R1bm5lbCAqdCkKK3sKKwl1MzIgcmVtb3RlID0gdC0+cGFybXMuaXBoLmRhZGRyOworCXUzMiBsb2NhbCA9IHQtPnBhcm1zLmlwaC5zYWRkcjsKKwl1MzIga2V5ID0gdC0+cGFybXMuaV9rZXk7CisJdW5zaWduZWQgaCA9IEhBU0goa2V5KTsKKwlpbnQgcHJpbyA9IDA7CisKKwlpZiAobG9jYWwpCisJCXByaW8gfD0gMTsKKwlpZiAocmVtb3RlICYmICFNVUxUSUNBU1QocmVtb3RlKSkgeworCQlwcmlvIHw9IDI7CisJCWggXj0gSEFTSChyZW1vdGUpOworCX0KKworCXJldHVybiAmdHVubmVsc1twcmlvXVtoXTsKK30KKworc3RhdGljIHZvaWQgaXBncmVfdHVubmVsX2xpbmsoc3RydWN0IGlwX3R1bm5lbCAqdCkKK3sKKwlzdHJ1Y3QgaXBfdHVubmVsICoqdHAgPSBpcGdyZV9idWNrZXQodCk7CisKKwl0LT5uZXh0ID0gKnRwOworCXdyaXRlX2xvY2tfYmgoJmlwZ3JlX2xvY2spOworCSp0cCA9IHQ7CisJd3JpdGVfdW5sb2NrX2JoKCZpcGdyZV9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgaXBncmVfdHVubmVsX3VubGluayhzdHJ1Y3QgaXBfdHVubmVsICp0KQoreworCXN0cnVjdCBpcF90dW5uZWwgKip0cDsKKworCWZvciAodHAgPSBpcGdyZV9idWNrZXQodCk7ICp0cDsgdHAgPSAmKCp0cCktPm5leHQpIHsKKwkJaWYgKHQgPT0gKnRwKSB7CisJCQl3cml0ZV9sb2NrX2JoKCZpcGdyZV9sb2NrKTsKKwkJCSp0cCA9IHQtPm5leHQ7CisJCQl3cml0ZV91bmxvY2tfYmgoJmlwZ3JlX2xvY2spOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXBfdHVubmVsICogaXBncmVfdHVubmVsX2xvY2F0ZShzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gKnBhcm1zLCBpbnQgY3JlYXRlKQoreworCXUzMiByZW1vdGUgPSBwYXJtcy0+aXBoLmRhZGRyOworCXUzMiBsb2NhbCA9IHBhcm1zLT5pcGguc2FkZHI7CisJdTMyIGtleSA9IHBhcm1zLT5pX2tleTsKKwlzdHJ1Y3QgaXBfdHVubmVsICp0LCAqKnRwLCAqbnQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBoID0gSEFTSChrZXkpOworCWludCBwcmlvID0gMDsKKwljaGFyIG5hbWVbSUZOQU1TSVpdOworCisJaWYgKGxvY2FsKQorCQlwcmlvIHw9IDE7CisJaWYgKHJlbW90ZSAmJiAhTVVMVElDQVNUKHJlbW90ZSkpIHsKKwkJcHJpbyB8PSAyOworCQloIF49IEhBU0gocmVtb3RlKTsKKwl9CisJZm9yICh0cCA9ICZ0dW5uZWxzW3ByaW9dW2hdOyAodCA9ICp0cCkgIT0gTlVMTDsgdHAgPSAmdC0+bmV4dCkgeworCQlpZiAobG9jYWwgPT0gdC0+cGFybXMuaXBoLnNhZGRyICYmIHJlbW90ZSA9PSB0LT5wYXJtcy5pcGguZGFkZHIpIHsKKwkJCWlmIChrZXkgPT0gdC0+cGFybXMuaV9rZXkpCisJCQkJcmV0dXJuIHQ7CisJCX0KKwl9CisJaWYgKCFjcmVhdGUpCisJCXJldHVybiBOVUxMOworCisJaWYgKHBhcm1zLT5uYW1lWzBdKQorCQlzdHJsY3B5KG5hbWUsIHBhcm1zLT5uYW1lLCBJRk5BTVNJWik7CisJZWxzZSB7CisJCWludCBpOworCQlmb3IgKGk9MTsgaTwxMDA7IGkrKykgeworCQkJc3ByaW50ZihuYW1lLCAiZ3JlJWQiLCBpKTsKKwkJCWlmIChfX2Rldl9nZXRfYnlfbmFtZShuYW1lKSA9PSBOVUxMKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChpPT0xMDApCisJCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKCp0KSwgbmFtZSwgaXBncmVfdHVubmVsX3NldHVwKTsKKwlpZiAoIWRldikKKwkgIHJldHVybiBOVUxMOworCisJZGV2LT5pbml0ID0gaXBncmVfdHVubmVsX2luaXQ7CisJbnQgPSBkZXYtPnByaXY7CisJbnQtPnBhcm1zID0gKnBhcm1zOworCisJaWYgKHJlZ2lzdGVyX25ldGRldmljZShkZXYpIDwgMCkgeworCQlmcmVlX25ldGRldihkZXYpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwludCA9IGRldi0+cHJpdjsKKwludC0+cGFybXMgPSAqcGFybXM7CisKKwlkZXZfaG9sZChkZXYpOworCWlwZ3JlX3R1bm5lbF9saW5rKG50KTsKKwkvKiBEbyBub3QgZGVjcmVtZW50IE1PRF9VU0VfQ09VTlQgaGVyZS4gKi8KKwlyZXR1cm4gbnQ7CisKK2ZhaWxlZDoKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgaXBncmVfdHVubmVsX3VuaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlwZ3JlX3R1bm5lbF91bmxpbmsoKHN0cnVjdCBpcF90dW5uZWwqKWRldi0+cHJpdik7CisJZGV2X3B1dChkZXYpOworfQorCisKK3N0YXRpYyB2b2lkIGlwZ3JlX2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgaW5mbykKK3sKKyNpZm5kZWYgSV9XSVNIX1dPUkxEX1dFUkVfUEVSRkVDVAorCisvKiBJdCBpcyBub3QgOi0oIEFsbCB0aGUgcm91dGVycyAoZXhjZXB0IGZvciBMaW51eCkgcmV0dXJuIG9ubHkKKyAgIDggYnl0ZXMgb2YgcGFja2V0IHBheWxvYWQuIEl0IG1lYW5zLCB0aGF0IHByZWNpc2UgcmVsYXlpbmcgb2YKKyAgIElDTVAgaW4gdGhlIHJlYWwgSW50ZXJuZXQgaXMgYWJzb2x1dGVseSBpbmZlYXNpYmxlLgorCisgICBNb3Jlb3ZlciwgQ2lzY28gIndpc2UgbWVuIiBwdXQgR1JFIGtleSB0byB0aGUgdGhpcmQgd29yZAorICAgaW4gR1JFIGhlYWRlci4gSXQgbWFrZXMgaW1wb3NzaWJsZSBtYWludGFpbmluZyBldmVuIHNvZnQgc3RhdGUgZm9yIGtleWVkCisgICBHUkUgdHVubmVscyB3aXRoIGVuYWJsZWQgY2hlY2tzdW0uIFRlbGwgdGhlbSAidGhhbmsgeW91Ii4KKworICAgV2VsbCwgSSB3b25kZXIsIHJmYzE4MTIgd2FzIHdyaXR0ZW4gYnkgQ2lzY28gZW1wbG95ZWUsCisgICB3aGF0IHRoZSBoZWxsIHRoZXNlIGlkaW90cyBicmVhayBzdGFuZHJhZHMgZXN0YWJsaXNoZWQKKyAgIGJ5IHRoZW1zZWxmPz8/CisgKi8KKworCXN0cnVjdCBpcGhkciAqaXBoID0gKHN0cnVjdCBpcGhkciopc2tiLT5kYXRhOworCXUxNgkgICAgICpwID0gKHUxNiopKHNrYi0+ZGF0YSsoaXBoLT5paGw8PDIpKTsKKwlpbnQgZ3JlaGxlbiA9IChpcGgtPmlobDw8MikgKyA0OworCWludCB0eXBlID0gc2tiLT5oLmljbXBoLT50eXBlOworCWludCBjb2RlID0gc2tiLT5oLmljbXBoLT5jb2RlOworCXN0cnVjdCBpcF90dW5uZWwgKnQ7CisJdTE2IGZsYWdzOworCisJZmxhZ3MgPSBwWzBdOworCWlmIChmbGFncyYoR1JFX0NTVU18R1JFX0tFWXxHUkVfU0VRfEdSRV9ST1VUSU5HfEdSRV9WRVJTSU9OKSkgeworCQlpZiAoZmxhZ3MmKEdSRV9WRVJTSU9OfEdSRV9ST1VUSU5HKSkKKwkJCXJldHVybjsKKwkJaWYgKGZsYWdzJkdSRV9LRVkpIHsKKwkJCWdyZWhsZW4gKz0gNDsKKwkJCWlmIChmbGFncyZHUkVfQ1NVTSkKKwkJCQlncmVobGVuICs9IDQ7CisJCX0KKwl9CisKKwkvKiBJZiBvbmx5IDggYnl0ZXMgcmV0dXJuZWQsIGtleWVkIG1lc3NhZ2Ugd2lsbCBiZSBkcm9wcGVkIGhlcmUgKi8KKwlpZiAoc2tiX2hlYWRsZW4oc2tiKSA8IGdyZWhsZW4pCisJCXJldHVybjsKKworCXN3aXRjaCAodHlwZSkgeworCWRlZmF1bHQ6CisJY2FzZSBJQ01QX1BBUkFNRVRFUlBST0I6CisJCXJldHVybjsKKworCWNhc2UgSUNNUF9ERVNUX1VOUkVBQ0g6CisJCXN3aXRjaCAoY29kZSkgeworCQljYXNlIElDTVBfU1JfRkFJTEVEOgorCQljYXNlIElDTVBfUE9SVF9VTlJFQUNIOgorCQkJLyogSW1wb3NzaWJsZSBldmVudC4gKi8KKwkJCXJldHVybjsKKwkJY2FzZSBJQ01QX0ZSQUdfTkVFREVEOgorCQkJLyogU29mdCBzdGF0ZSBmb3IgcG10dSBpcyBtYWludGFpbmVkIGJ5IElQIGNvcmUuICovCisJCQlyZXR1cm47CisJCWRlZmF1bHQ6CisJCQkvKiBBbGwgb3RoZXJzIGFyZSB0cmFuc2xhdGVkIHRvIEhPU1RfVU5SRUFDSC4KKwkJCSAgIHJmYzIwMDMgY29udGFpbnMgImRlZXAgdGhvdWdodHMiIGFib3V0IE5FVF9VTlJFQUNILAorCQkJICAgSSBiZWxpZXZlIHRoZXkgYXJlIGp1c3QgZXRoZXIgcG9sbHV0aW9uLiAtLUFOSworCQkJICovCisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIElDTVBfVElNRV9FWENFRURFRDoKKwkJaWYgKGNvZGUgIT0gSUNNUF9FWENfVFRMKQorCQkJcmV0dXJuOworCQlicmVhazsKKwl9CisKKwlyZWFkX2xvY2soJmlwZ3JlX2xvY2spOworCXQgPSBpcGdyZV90dW5uZWxfbG9va3VwKGlwaC0+ZGFkZHIsIGlwaC0+c2FkZHIsIChmbGFncyZHUkVfS0VZKSA/ICooKCh1MzIqKXApICsgKGdyZWhsZW4+PjIpIC0gMSkgOiAwKTsKKwlpZiAodCA9PSBOVUxMIHx8IHQtPnBhcm1zLmlwaC5kYWRkciA9PSAwIHx8IE1VTFRJQ0FTVCh0LT5wYXJtcy5pcGguZGFkZHIpKQorCQlnb3RvIG91dDsKKworCWlmICh0LT5wYXJtcy5pcGgudHRsID09IDAgJiYgdHlwZSA9PSBJQ01QX1RJTUVfRVhDRUVERUQpCisJCWdvdG8gb3V0OworCisJaWYgKGppZmZpZXMgLSB0LT5lcnJfdGltZSA8IElQVFVOTkVMX0VSUl9USU1FTykKKwkJdC0+ZXJyX2NvdW50Kys7CisJZWxzZQorCQl0LT5lcnJfY291bnQgPSAxOworCXQtPmVycl90aW1lID0gamlmZmllczsKK291dDoKKwlyZWFkX3VubG9jaygmaXBncmVfbG9jayk7CisJcmV0dXJuOworI2Vsc2UKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IChzdHJ1Y3QgaXBoZHIqKWRwOworCXN0cnVjdCBpcGhkciAqZWlwaDsKKwl1MTYJICAgICAqcCA9ICh1MTYqKShkcCsoaXBoLT5paGw8PDIpKTsKKwlpbnQgdHlwZSA9IHNrYi0+aC5pY21waC0+dHlwZTsKKwlpbnQgY29kZSA9IHNrYi0+aC5pY21waC0+Y29kZTsKKwlpbnQgcmVsX3R5cGUgPSAwOworCWludCByZWxfY29kZSA9IDA7CisJaW50IHJlbF9pbmZvID0gMDsKKwl1MTYgZmxhZ3M7CisJaW50IGdyZWhsZW4gPSAoaXBoLT5paGw8PDIpICsgNDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKKwlzdHJ1Y3QgZmxvd2kgZmw7CisJc3RydWN0IHJ0YWJsZSAqcnQ7CisKKwlpZiAocFsxXSAhPSBodG9ucyhFVEhfUF9JUCkpCisJCXJldHVybjsKKworCWZsYWdzID0gcFswXTsKKwlpZiAoZmxhZ3MmKEdSRV9DU1VNfEdSRV9LRVl8R1JFX1NFUXxHUkVfUk9VVElOR3xHUkVfVkVSU0lPTikpIHsKKwkJaWYgKGZsYWdzJihHUkVfVkVSU0lPTnxHUkVfUk9VVElORykpCisJCQlyZXR1cm47CisJCWlmIChmbGFncyZHUkVfQ1NVTSkKKwkJCWdyZWhsZW4gKz0gNDsKKwkJaWYgKGZsYWdzJkdSRV9LRVkpCisJCQlncmVobGVuICs9IDQ7CisJCWlmIChmbGFncyZHUkVfU0VRKQorCQkJZ3JlaGxlbiArPSA0OworCX0KKwlpZiAobGVuIDwgZ3JlaGxlbiArIHNpemVvZihzdHJ1Y3QgaXBoZHIpKQorCQlyZXR1cm47CisJZWlwaCA9IChzdHJ1Y3QgaXBoZHIqKShkcCArIGdyZWhsZW4pOworCisJc3dpdGNoICh0eXBlKSB7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCWNhc2UgSUNNUF9QQVJBTUVURVJQUk9COgorCQlpZiAoc2tiLT5oLmljbXBoLT51bi5nYXRld2F5IDwgKGlwaC0+aWhsPDwyKSkKKwkJCXJldHVybjsKKworCQkvKiBTby4uLiBUaGlzIGd1eSBmb3VuZCBzb21ldGhpbmcgc3RyYW5nZSBJTlNJREUgZW5jYXBzdWxhdGVkCisJCSAgIHBhY2tldC4gV2VsbCwgaGUgaXMgZm9vbCwgYnV0IHdoYXQgY2FuIHdlIGRvID8KKwkJICovCisJCXJlbF90eXBlID0gSUNNUF9QQVJBTUVURVJQUk9COworCQlyZWxfaW5mbyA9IHNrYi0+aC5pY21waC0+dW4uZ2F0ZXdheSAtIGdyZWhsZW47CisJCWJyZWFrOworCisJY2FzZSBJQ01QX0RFU1RfVU5SRUFDSDoKKwkJc3dpdGNoIChjb2RlKSB7CisJCWNhc2UgSUNNUF9TUl9GQUlMRUQ6CisJCWNhc2UgSUNNUF9QT1JUX1VOUkVBQ0g6CisJCQkvKiBJbXBvc3NpYmxlIGV2ZW50LiAqLworCQkJcmV0dXJuOworCQljYXNlIElDTVBfRlJBR19ORUVERUQ6CisJCQkvKiBBbmQgaXQgaXMgdGhlIG9ubHkgcmVhbGx5IG5lY2Vzc2FyeSB0aGluZyA6LSkgKi8KKwkJCXJlbF9pbmZvID0gbnRvaHMoc2tiLT5oLmljbXBoLT51bi5mcmFnLm10dSk7CisJCQlpZiAocmVsX2luZm8gPCBncmVobGVuKzY4KQorCQkJCXJldHVybjsKKwkJCXJlbF9pbmZvIC09IGdyZWhsZW47CisJCQkvKiBCU0QgNC4yIE1PUkUgRE9FUyBOT1QgRVhJU1QgSU4gTkFUVVJFLiAqLworCQkJaWYgKHJlbF9pbmZvID4gbnRvaHMoZWlwaC0+dG90X2xlbikpCisJCQkJcmV0dXJuOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBBbGwgb3RoZXJzIGFyZSB0cmFuc2xhdGVkIHRvIEhPU1RfVU5SRUFDSC4KKwkJCSAgIHJmYzIwMDMgY29udGFpbnMgImRlZXAgdGhvdWdodHMiIGFib3V0IE5FVF9VTlJFQUNILAorCQkJICAgSSBiZWxpZXZlLCBpdCBpcyBqdXN0IGV0aGVyIHBvbGx1dGlvbi4gLS1BTksKKwkJCSAqLworCQkJcmVsX3R5cGUgPSBJQ01QX0RFU1RfVU5SRUFDSDsKKwkJCXJlbF9jb2RlID0gSUNNUF9IT1NUX1VOUkVBQ0g7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIElDTVBfVElNRV9FWENFRURFRDoKKwkJaWYgKGNvZGUgIT0gSUNNUF9FWENfVFRMKQorCQkJcmV0dXJuOworCQlicmVhazsKKwl9CisKKwkvKiBQcmVwYXJlIGZha2Ugc2tiIHRvIGZlZWQgaXQgdG8gaWNtcF9zZW5kICovCisJc2tiMiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCWlmIChza2IyID09IE5VTEwpCisJCXJldHVybjsKKwlkc3RfcmVsZWFzZShza2IyLT5kc3QpOworCXNrYjItPmRzdCA9IE5VTEw7CisJc2tiX3B1bGwoc2tiMiwgc2tiLT5kYXRhIC0gKHU4KillaXBoKTsKKwlza2IyLT5uaC5yYXcgPSBza2IyLT5kYXRhOworCisJLyogVHJ5IHRvIGd1ZXNzIGluY29taW5nIGludGVyZmFjZSAqLworCW1lbXNldCgmZmwsIDAsIHNpemVvZihmbCkpOworCWZsLmZsNF9kc3QgPSBlaXBoLT5zYWRkcjsKKwlmbC5mbDRfdG9zID0gUlRfVE9TKGVpcGgtPnRvcyk7CisJZmwucHJvdG8gPSBJUFBST1RPX0dSRTsKKwlpZiAoaXBfcm91dGVfb3V0cHV0X2tleSgmcnQsICZmbCkpIHsKKwkJa2ZyZWVfc2tiKHNrYjIpOworCQlyZXR1cm47CisJfQorCXNrYjItPmRldiA9IHJ0LT51LmRzdC5kZXY7CisKKwkvKiByb3V0ZSAiaW5jb21pbmciIHBhY2tldCAqLworCWlmIChydC0+cnRfZmxhZ3MmUlRDRl9MT0NBTCkgeworCQlpcF9ydF9wdXQocnQpOworCQlydCA9IE5VTEw7CisJCWZsLmZsNF9kc3QgPSBlaXBoLT5kYWRkcjsKKwkJZmwuZmw0X3NyYyA9IGVpcGgtPnNhZGRyOworCQlmbC5mbDRfdG9zID0gZWlwaC0+dG9zOworCQlpZiAoaXBfcm91dGVfb3V0cHV0X2tleSgmcnQsICZmbCkgfHwKKwkJICAgIHJ0LT51LmRzdC5kZXYtPnR5cGUgIT0gQVJQSFJEX0lQR1JFKSB7CisJCQlpcF9ydF9wdXQocnQpOworCQkJa2ZyZWVfc2tiKHNrYjIpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJaXBfcnRfcHV0KHJ0KTsKKwkJaWYgKGlwX3JvdXRlX2lucHV0KHNrYjIsIGVpcGgtPmRhZGRyLCBlaXBoLT5zYWRkciwgZWlwaC0+dG9zLCBza2IyLT5kZXYpIHx8CisJCSAgICBza2IyLT5kc3QtPmRldi0+dHlwZSAhPSBBUlBIUkRfSVBHUkUpIHsKKwkJCWtmcmVlX3NrYihza2IyKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qIGNoYW5nZSBtdHUgb24gdGhpcyByb3V0ZSAqLworCWlmICh0eXBlID09IElDTVBfREVTVF9VTlJFQUNIICYmIGNvZGUgPT0gSUNNUF9GUkFHX05FRURFRCkgeworCQlpZiAocmVsX2luZm8gPiBkc3RfbXR1KHNrYjItPmRzdCkpIHsKKwkJCWtmcmVlX3NrYihza2IyKTsKKwkJCXJldHVybjsKKwkJfQorCQlza2IyLT5kc3QtPm9wcy0+dXBkYXRlX3BtdHUoc2tiMi0+ZHN0LCByZWxfaW5mbyk7CisJCXJlbF9pbmZvID0gaHRvbmwocmVsX2luZm8pOworCX0gZWxzZSBpZiAodHlwZSA9PSBJQ01QX1RJTUVfRVhDRUVERUQpIHsKKwkJc3RydWN0IGlwX3R1bm5lbCAqdCA9IChzdHJ1Y3QgaXBfdHVubmVsKilza2IyLT5kZXYtPnByaXY7CisJCWlmICh0LT5wYXJtcy5pcGgudHRsKSB7CisJCQlyZWxfdHlwZSA9IElDTVBfREVTVF9VTlJFQUNIOworCQkJcmVsX2NvZGUgPSBJQ01QX0hPU1RfVU5SRUFDSDsKKwkJfQorCX0KKworCWljbXBfc2VuZChza2IyLCByZWxfdHlwZSwgcmVsX2NvZGUsIHJlbF9pbmZvKTsKKwlrZnJlZV9za2Ioc2tiMik7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlwZ3JlX2Vjbl9kZWNhcHN1bGF0ZShzdHJ1Y3QgaXBoZHIgKmlwaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAoSU5FVF9FQ05faXNfY2UoaXBoLT50b3MpKSB7CisJCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkgeworCQkJSVBfRUNOX3NldF9jZShza2ItPm5oLmlwaCk7CisJCX0gZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUFY2KSkgeworCQkJSVA2X0VDTl9zZXRfY2Uoc2tiLT5uaC5pcHY2aCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdTgKK2lwZ3JlX2Vjbl9lbmNhcHN1bGF0ZSh1OCB0b3MsIHN0cnVjdCBpcGhkciAqb2xkX2lwaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1OCBpbm5lciA9IDA7CisJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKQorCQlpbm5lciA9IG9sZF9pcGgtPnRvczsKKwllbHNlIGlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQVjYpKQorCQlpbm5lciA9IGlwdjZfZ2V0X2RzZmllbGQoKHN0cnVjdCBpcHY2aGRyICopb2xkX2lwaCk7CisJcmV0dXJuIElORVRfRUNOX2VuY2Fwc3VsYXRlKHRvcywgaW5uZXIpOworfQorCitzdGF0aWMgaW50IGlwZ3JlX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcGhkciAqaXBoOworCXU4ICAgICAqaDsKKwl1MTYgICAgZmxhZ3M7CisJdTE2ICAgIGNzdW0gPSAwOworCXUzMiAgICBrZXkgPSAwOworCXUzMiAgICBzZXFubyA9IDA7CisJc3RydWN0IGlwX3R1bm5lbCAqdHVubmVsOworCWludCAgICBvZmZzZXQgPSA0OworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgMTYpKQorCQlnb3RvIGRyb3Bfbm9sb2NrOworCisJaXBoID0gc2tiLT5uaC5pcGg7CisJaCA9IHNrYi0+ZGF0YTsKKwlmbGFncyA9ICoodTE2KiloOworCisJaWYgKGZsYWdzJihHUkVfQ1NVTXxHUkVfS0VZfEdSRV9ST1VUSU5HfEdSRV9TRVF8R1JFX1ZFUlNJT04pKSB7CisJCS8qIC0gVmVyc2lvbiBtdXN0IGJlIDAuCisJCSAgIC0gV2UgZG8gbm90IHN1cHBvcnQgcm91dGluZyBoZWFkZXJzLgorCQkgKi8KKwkJaWYgKGZsYWdzJihHUkVfVkVSU0lPTnxHUkVfUk9VVElORykpCisJCQlnb3RvIGRyb3Bfbm9sb2NrOworCisJCWlmIChmbGFncyZHUkVfQ1NVTSkgeworCQkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSB7CisJCQkJY3N1bSA9ICh1MTYpY3N1bV9mb2xkKHNrYi0+Y3N1bSk7CisJCQkJaWYgKGNzdW0pCisJCQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJCX0KKwkJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9OT05FKSB7CisJCQkJc2tiLT5jc3VtID0gc2tiX2NoZWNrc3VtKHNrYiwgMCwgc2tiLT5sZW4sIDApOworCQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fSFc7CisJCQkJY3N1bSA9ICh1MTYpY3N1bV9mb2xkKHNrYi0+Y3N1bSk7CisJCQl9CisJCQlvZmZzZXQgKz0gNDsKKwkJfQorCQlpZiAoZmxhZ3MmR1JFX0tFWSkgeworCQkJa2V5ID0gKih1MzIqKShoICsgb2Zmc2V0KTsKKwkJCW9mZnNldCArPSA0OworCQl9CisJCWlmIChmbGFncyZHUkVfU0VRKSB7CisJCQlzZXFubyA9IG50b2hsKCoodTMyKikoaCArIG9mZnNldCkpOworCQkJb2Zmc2V0ICs9IDQ7CisJCX0KKwl9CisKKwlyZWFkX2xvY2soJmlwZ3JlX2xvY2spOworCWlmICgodHVubmVsID0gaXBncmVfdHVubmVsX2xvb2t1cChpcGgtPnNhZGRyLCBpcGgtPmRhZGRyLCBrZXkpKSAhPSBOVUxMKSB7CisJCXNlY3BhdGhfcmVzZXQoc2tiKTsKKworCQlza2ItPnByb3RvY29sID0gKih1MTYqKShoICsgMik7CisJCS8qIFdDQ1AgdmVyc2lvbiAxIGFuZCAyIHByb3RvY29sIGRlY29kaW5nLgorCQkgKiAtIENoYW5nZSBwcm90b2NvbCB0byBJUAorCQkgKiAtIFdoZW4gZGVhbGluZyB3aXRoIFdDQ1B2MiwgU2tpcCBleHRyYSA0IGJ5dGVzIGluIEdSRSBoZWFkZXIKKwkJICovCisJCWlmIChmbGFncyA9PSAwICYmCisJCSAgICBza2ItPnByb3RvY29sID09IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfV0NDUCkpIHsKKwkJCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKTsKKwkJCWlmICgoKihoICsgb2Zmc2V0KSAmIDB4RjApICE9IDB4NDApIAorCQkJCW9mZnNldCArPSA0OworCQl9CisKKwkJc2tiLT5tYWMucmF3ID0gc2tiLT5uaC5yYXc7CisJCXNrYi0+bmgucmF3ID0gX19wc2tiX3B1bGwoc2tiLCBvZmZzZXQpOworCQlza2JfcG9zdHB1bGxfcmNzdW0oc2tiLCBza2ItPm1hYy5yYXcsIG9mZnNldCk7CisJCW1lbXNldCgmKElQQ0Ioc2tiKS0+b3B0KSwgMCwgc2l6ZW9mKHN0cnVjdCBpcF9vcHRpb25zKSk7CisJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKKyNpZmRlZiBDT05GSUdfTkVUX0lQR1JFX0JST0FEQ0FTVAorCQlpZiAoTVVMVElDQVNUKGlwaC0+ZGFkZHIpKSB7CisJCQkvKiBMb29wZWQgYmFjayBwYWNrZXQsIGRyb3AgaXQhICovCisJCQlpZiAoKChzdHJ1Y3QgcnRhYmxlKilza2ItPmRzdCktPmZsLmlpZiA9PSAwKQorCQkJCWdvdG8gZHJvcDsKKwkJCXR1bm5lbC0+c3RhdC5tdWx0aWNhc3QrKzsKKwkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfQlJPQURDQVNUOworCQl9CisjZW5kaWYKKworCQlpZiAoKChmbGFncyZHUkVfQ1NVTSkgJiYgY3N1bSkgfHwKKwkJICAgICghKGZsYWdzJkdSRV9DU1VNKSAmJiB0dW5uZWwtPnBhcm1zLmlfZmxhZ3MmR1JFX0NTVU0pKSB7CisJCQl0dW5uZWwtPnN0YXQucnhfY3JjX2Vycm9ycysrOworCQkJdHVubmVsLT5zdGF0LnJ4X2Vycm9ycysrOworCQkJZ290byBkcm9wOworCQl9CisJCWlmICh0dW5uZWwtPnBhcm1zLmlfZmxhZ3MmR1JFX1NFUSkgeworCQkJaWYgKCEoZmxhZ3MmR1JFX1NFUSkgfHwKKwkJCSAgICAodHVubmVsLT5pX3NlcW5vICYmIChzMzIpKHNlcW5vIC0gdHVubmVsLT5pX3NlcW5vKSA8IDApKSB7CisJCQkJdHVubmVsLT5zdGF0LnJ4X2ZpZm9fZXJyb3JzKys7CisJCQkJdHVubmVsLT5zdGF0LnJ4X2Vycm9ycysrOworCQkJCWdvdG8gZHJvcDsKKwkJCX0KKwkJCXR1bm5lbC0+aV9zZXFubyA9IHNlcW5vICsgMTsKKwkJfQorCQl0dW5uZWwtPnN0YXQucnhfcGFja2V0cysrOworCQl0dW5uZWwtPnN0YXQucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCXNrYi0+ZGV2ID0gdHVubmVsLT5kZXY7CisJCWRzdF9yZWxlYXNlKHNrYi0+ZHN0KTsKKwkJc2tiLT5kc3QgPSBOVUxMOworCQluZl9yZXNldChza2IpOworCQlpcGdyZV9lY25fZGVjYXBzdWxhdGUoaXBoLCBza2IpOworCQluZXRpZl9yeChza2IpOworCQlyZWFkX3VubG9jaygmaXBncmVfbG9jayk7CisJCXJldHVybigwKTsKKwl9CisJaWNtcF9zZW5kKHNrYiwgSUNNUF9ERVNUX1VOUkVBQ0gsIElDTVBfUFJPVF9VTlJFQUNILCAwKTsKKworZHJvcDoKKwlyZWFkX3VubG9jaygmaXBncmVfbG9jayk7Citkcm9wX25vbG9jazoKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgaXBncmVfdHVubmVsX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXBfdHVubmVsICp0dW5uZWwgPSAoc3RydWN0IGlwX3R1bm5lbCopZGV2LT5wcml2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZ0dW5uZWwtPnN0YXQ7CisJc3RydWN0IGlwaGRyICAqb2xkX2lwaCA9IHNrYi0+bmguaXBoOworCXN0cnVjdCBpcGhkciAgKnRpcGg7CisJdTggICAgIHRvczsKKwl1MTYgICAgZGY7CisJc3RydWN0IHJ0YWJsZSAqcnQ7ICAgICAJCQkvKiBSb3V0ZSB0byB0aGUgb3RoZXIgaG9zdCAqLworCXN0cnVjdCBuZXRfZGV2aWNlICp0ZGV2OwkJCS8qIERldmljZSB0byBvdGhlciBob3N0ICovCisJc3RydWN0IGlwaGRyICAqaXBoOwkJCS8qIE91ciBuZXcgSVAgaGVhZGVyICovCisJaW50ICAgIG1heF9oZWFkcm9vbTsJCQkvKiBUaGUgZXh0cmEgaGVhZGVyIHNwYWNlIG5lZWRlZCAqLworCWludCAgICBncmVfaGxlbjsKKwl1MzIgICAgZHN0OworCWludCAgICBtdHU7CisKKwlpZiAodHVubmVsLT5yZWN1cnNpb24rKykgeworCQl0dW5uZWwtPnN0YXQuY29sbGlzaW9ucysrOworCQlnb3RvIHR4X2Vycm9yOworCX0KKworCWlmIChkZXYtPmhhcmRfaGVhZGVyKSB7CisJCWdyZV9obGVuID0gMDsKKwkJdGlwaCA9IChzdHJ1Y3QgaXBoZHIqKXNrYi0+ZGF0YTsKKwl9IGVsc2UgeworCQlncmVfaGxlbiA9IHR1bm5lbC0+aGxlbjsKKwkJdGlwaCA9ICZ0dW5uZWwtPnBhcm1zLmlwaDsKKwl9CisKKwlpZiAoKGRzdCA9IHRpcGgtPmRhZGRyKSA9PSAwKSB7CisJCS8qIE5CTUEgdHVubmVsICovCisKKwkJaWYgKHNrYi0+ZHN0ID09IE5VTEwpIHsKKwkJCXR1bm5lbC0+c3RhdC50eF9maWZvX2Vycm9ycysrOworCQkJZ290byB0eF9lcnJvcjsKKwkJfQorCisJCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkgeworCQkJcnQgPSAoc3RydWN0IHJ0YWJsZSopc2tiLT5kc3Q7CisJCQlpZiAoKGRzdCA9IHJ0LT5ydF9nYXRld2F5KSA9PSAwKQorCQkJCWdvdG8gdHhfZXJyb3JfaWNtcDsKKwkJfQorI2lmZGVmIENPTkZJR19JUFY2CisJCWVsc2UgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVBWNikpIHsKKwkJCXN0cnVjdCBpbjZfYWRkciAqYWRkcjY7CisJCQlpbnQgYWRkcl90eXBlOworCQkJc3RydWN0IG5laWdoYm91ciAqbmVpZ2ggPSBza2ItPmRzdC0+bmVpZ2hib3VyOworCisJCQlpZiAobmVpZ2ggPT0gTlVMTCkKKwkJCQlnb3RvIHR4X2Vycm9yOworCisJCQlhZGRyNiA9IChzdHJ1Y3QgaW42X2FkZHIqKSZuZWlnaC0+cHJpbWFyeV9rZXk7CisJCQlhZGRyX3R5cGUgPSBpcHY2X2FkZHJfdHlwZShhZGRyNik7CisKKwkJCWlmIChhZGRyX3R5cGUgPT0gSVBWNl9BRERSX0FOWSkgeworCQkJCWFkZHI2ID0gJnNrYi0+bmguaXB2NmgtPmRhZGRyOworCQkJCWFkZHJfdHlwZSA9IGlwdjZfYWRkcl90eXBlKGFkZHI2KTsKKwkJCX0KKworCQkJaWYgKChhZGRyX3R5cGUgJiBJUFY2X0FERFJfQ09NUEFUdjQpID09IDApCisJCQkJZ290byB0eF9lcnJvcl9pY21wOworCisJCQlkc3QgPSBhZGRyNi0+czZfYWRkcjMyWzNdOworCQl9CisjZW5kaWYKKwkJZWxzZQorCQkJZ290byB0eF9lcnJvcjsKKwl9CisKKwl0b3MgPSB0aXBoLT50b3M7CisJaWYgKHRvcyYxKSB7CisJCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkKKwkJCXRvcyA9IG9sZF9pcGgtPnRvczsKKwkJdG9zICY9IH4xOworCX0KKworCXsKKwkJc3RydWN0IGZsb3dpIGZsID0geyAub2lmID0gdHVubmVsLT5wYXJtcy5saW5rLAorCQkJCSAgICAubmxfdSA9IHsgLmlwNF91ID0KKwkJCQkJICAgICAgeyAuZGFkZHIgPSBkc3QsCisJCQkJCQkuc2FkZHIgPSB0aXBoLT5zYWRkciwKKwkJCQkJCS50b3MgPSBSVF9UT1ModG9zKSB9IH0sCisJCQkJICAgIC5wcm90byA9IElQUFJPVE9fR1JFIH07CisJCWlmIChpcF9yb3V0ZV9vdXRwdXRfa2V5KCZydCwgJmZsKSkgeworCQkJdHVubmVsLT5zdGF0LnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQlnb3RvIHR4X2Vycm9yOworCQl9CisJfQorCXRkZXYgPSBydC0+dS5kc3QuZGV2OworCisJaWYgKHRkZXYgPT0gZGV2KSB7CisJCWlwX3J0X3B1dChydCk7CisJCXR1bm5lbC0+c3RhdC5jb2xsaXNpb25zKys7CisJCWdvdG8gdHhfZXJyb3I7CisJfQorCisJZGYgPSB0aXBoLT5mcmFnX29mZjsKKwlpZiAoZGYpCisJCW10dSA9IGRzdF9tdHUoJnJ0LT51LmRzdCkgLSB0dW5uZWwtPmhsZW47CisJZWxzZQorCQltdHUgPSBza2ItPmRzdCA/IGRzdF9tdHUoc2tiLT5kc3QpIDogZGV2LT5tdHU7CisKKwlpZiAoc2tiLT5kc3QpCisJCXNrYi0+ZHN0LT5vcHMtPnVwZGF0ZV9wbXR1KHNrYi0+ZHN0LCBtdHUpOworCisJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKSB7CisJCWRmIHw9IChvbGRfaXBoLT5mcmFnX29mZiZodG9ucyhJUF9ERikpOworCisJCWlmICgob2xkX2lwaC0+ZnJhZ19vZmYmaHRvbnMoSVBfREYpKSAmJgorCQkgICAgbXR1IDwgbnRvaHMob2xkX2lwaC0+dG90X2xlbikpIHsKKwkJCWljbXBfc2VuZChza2IsIElDTVBfREVTVF9VTlJFQUNILCBJQ01QX0ZSQUdfTkVFREVELCBodG9ubChtdHUpKTsKKwkJCWlwX3J0X3B1dChydCk7CisJCQlnb3RvIHR4X2Vycm9yOworCQl9CisJfQorI2lmZGVmIENPTkZJR19JUFY2CisJZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUFY2KSkgeworCQlzdHJ1Y3QgcnQ2X2luZm8gKnJ0NiA9IChzdHJ1Y3QgcnQ2X2luZm8qKXNrYi0+ZHN0OworCisJCWlmIChydDYgJiYgbXR1IDwgZHN0X210dShza2ItPmRzdCkgJiYgbXR1ID49IElQVjZfTUlOX01UVSkgeworCQkJaWYgKCh0dW5uZWwtPnBhcm1zLmlwaC5kYWRkciAmJiAhTVVMVElDQVNUKHR1bm5lbC0+cGFybXMuaXBoLmRhZGRyKSkgfHwKKwkJCSAgICBydDYtPnJ0NmlfZHN0LnBsZW4gPT0gMTI4KSB7CisJCQkJcnQ2LT5ydDZpX2ZsYWdzIHw9IFJURl9NT0RJRklFRDsKKwkJCQlza2ItPmRzdC0+bWV0cmljc1tSVEFYX01UVS0xXSA9IG10dTsKKwkJCX0KKwkJfQorCisJCWlmIChtdHUgPj0gSVBWNl9NSU5fTVRVICYmIG10dSA8IHNrYi0+bGVuIC0gdHVubmVsLT5obGVuICsgZ3JlX2hsZW4pIHsKKwkJCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1BLVF9UT09CSUcsIDAsIG10dSwgZGV2KTsKKwkJCWlwX3J0X3B1dChydCk7CisJCQlnb3RvIHR4X2Vycm9yOworCQl9CisJfQorI2VuZGlmCisKKwlpZiAodHVubmVsLT5lcnJfY291bnQgPiAwKSB7CisJCWlmIChqaWZmaWVzIC0gdHVubmVsLT5lcnJfdGltZSA8IElQVFVOTkVMX0VSUl9USU1FTykgeworCQkJdHVubmVsLT5lcnJfY291bnQtLTsKKworCQkJZHN0X2xpbmtfZmFpbHVyZShza2IpOworCQl9IGVsc2UKKwkJCXR1bm5lbC0+ZXJyX2NvdW50ID0gMDsKKwl9CisKKwltYXhfaGVhZHJvb20gPSBMTF9SRVNFUlZFRF9TUEFDRSh0ZGV2KSArIGdyZV9obGVuOworCisJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgbWF4X2hlYWRyb29tIHx8IHNrYl9jbG9uZWQoc2tiKSB8fCBza2Jfc2hhcmVkKHNrYikpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2IgPSBza2JfcmVhbGxvY19oZWFkcm9vbShza2IsIG1heF9oZWFkcm9vbSk7CisJCWlmICghbmV3X3NrYikgeworCQkJaXBfcnRfcHV0KHJ0KTsKKyAgCQkJc3RhdHMtPnR4X2Ryb3BwZWQrKzsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXR1bm5lbC0+cmVjdXJzaW9uLS07CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoc2tiLT5zaykKKwkJCXNrYl9zZXRfb3duZXJfdyhuZXdfc2tiLCBza2ItPnNrKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlza2IgPSBuZXdfc2tiOworCQlvbGRfaXBoID0gc2tiLT5uaC5pcGg7CisJfQorCisJc2tiLT5oLnJhdyA9IHNrYi0+bmgucmF3OworCXNrYi0+bmgucmF3ID0gc2tiX3B1c2goc2tiLCBncmVfaGxlbik7CisJbWVtc2V0KCYoSVBDQihza2IpLT5vcHQpLCAwLCBzaXplb2YoSVBDQihza2IpLT5vcHQpKTsKKwlkc3RfcmVsZWFzZShza2ItPmRzdCk7CisJc2tiLT5kc3QgPSAmcnQtPnUuZHN0OworCisJLyoKKwkgKglQdXNoIGRvd24gYW5kIGluc3RhbGwgdGhlIElQSVAgaGVhZGVyLgorCSAqLworCisJaXBoIAkJCT0Jc2tiLT5uaC5pcGg7CisJaXBoLT52ZXJzaW9uCQk9CTQ7CisJaXBoLT5paGwJCT0Jc2l6ZW9mKHN0cnVjdCBpcGhkcikgPj4gMjsKKwlpcGgtPmZyYWdfb2ZmCQk9CWRmOworCWlwaC0+cHJvdG9jb2wJCT0JSVBQUk9UT19HUkU7CisJaXBoLT50b3MJCT0JaXBncmVfZWNuX2VuY2Fwc3VsYXRlKHRvcywgb2xkX2lwaCwgc2tiKTsKKwlpcGgtPmRhZGRyCQk9CXJ0LT5ydF9kc3Q7CisJaXBoLT5zYWRkcgkJPQlydC0+cnRfc3JjOworCisJaWYgKChpcGgtPnR0bCA9IHRpcGgtPnR0bCkgPT0gMCkgeworCQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCisJCQlpcGgtPnR0bCA9IG9sZF9pcGgtPnR0bDsKKyNpZmRlZiBDT05GSUdfSVBWNgorCQllbHNlIGlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQVjYpKQorCQkJaXBoLT50dGwgPSAoKHN0cnVjdCBpcHY2aGRyKilvbGRfaXBoKS0+aG9wX2xpbWl0OworI2VuZGlmCisJCWVsc2UKKwkJCWlwaC0+dHRsID0gZHN0X21ldHJpYygmcnQtPnUuZHN0LCBSVEFYX0hPUExJTUlUKTsKKwl9CisKKwkoKHUxNiopKGlwaCsxKSlbMF0gPSB0dW5uZWwtPnBhcm1zLm9fZmxhZ3M7CisJKCh1MTYqKShpcGgrMSkpWzFdID0gc2tiLT5wcm90b2NvbDsKKworCWlmICh0dW5uZWwtPnBhcm1zLm9fZmxhZ3MmKEdSRV9LRVl8R1JFX0NTVU18R1JFX1NFUSkpIHsKKwkJdTMyICpwdHIgPSAodTMyKikoKCh1OCopaXBoKSArIHR1bm5lbC0+aGxlbiAtIDQpOworCisJCWlmICh0dW5uZWwtPnBhcm1zLm9fZmxhZ3MmR1JFX1NFUSkgeworCQkJKyt0dW5uZWwtPm9fc2Vxbm87CisJCQkqcHRyID0gaHRvbmwodHVubmVsLT5vX3NlcW5vKTsKKwkJCXB0ci0tOworCQl9CisJCWlmICh0dW5uZWwtPnBhcm1zLm9fZmxhZ3MmR1JFX0tFWSkgeworCQkJKnB0ciA9IHR1bm5lbC0+cGFybXMub19rZXk7CisJCQlwdHItLTsKKwkJfQorCQlpZiAodHVubmVsLT5wYXJtcy5vX2ZsYWdzJkdSRV9DU1VNKSB7CisJCQkqcHRyID0gMDsKKwkJCSooX191MTYqKXB0ciA9IGlwX2NvbXB1dGVfY3N1bSgodm9pZCopKGlwaCsxKSwgc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CisJCX0KKwl9CisKKwluZl9yZXNldChza2IpOworCisJSVBUVU5ORUxfWE1JVCgpOworCXR1bm5lbC0+cmVjdXJzaW9uLS07CisJcmV0dXJuIDA7CisKK3R4X2Vycm9yX2ljbXA6CisJZHN0X2xpbmtfZmFpbHVyZShza2IpOworCit0eF9lcnJvcjoKKwlzdGF0cy0+dHhfZXJyb3JzKys7CisJZGV2X2tmcmVlX3NrYihza2IpOworCXR1bm5lbC0+cmVjdXJzaW9uLS07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lwZ3JlX3R1bm5lbF9pb2N0bCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGlwX3R1bm5lbF9wYXJtIHA7CisJc3RydWN0IGlwX3R1bm5lbCAqdDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR0VUVFVOTkVMOgorCQl0ID0gTlVMTDsKKwkJaWYgKGRldiA9PSBpcGdyZV9mYl90dW5uZWxfZGV2KSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnAsIGlmci0+aWZyX2lmcnUuaWZydV9kYXRhLCBzaXplb2YocCkpKSB7CisJCQkJZXJyID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXQgPSBpcGdyZV90dW5uZWxfbG9jYXRlKCZwLCAwKTsKKwkJfQorCQlpZiAodCA9PSBOVUxMKQorCQkJdCA9IChzdHJ1Y3QgaXBfdHVubmVsKilkZXYtPnByaXY7CisJCW1lbWNweSgmcCwgJnQtPnBhcm1zLCBzaXplb2YocCkpOworCQlpZiAoY29weV90b191c2VyKGlmci0+aWZyX2lmcnUuaWZydV9kYXRhLCAmcCwgc2l6ZW9mKHApKSkKKwkJCWVyciA9IC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBTSU9DQUREVFVOTkVMOgorCWNhc2UgU0lPQ0NIR1RVTk5FTDoKKwkJZXJyID0gLUVQRVJNOworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlnb3RvIGRvbmU7CisKKwkJZXJyID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLCBpZnItPmlmcl9pZnJ1LmlmcnVfZGF0YSwgc2l6ZW9mKHApKSkKKwkJCWdvdG8gZG9uZTsKKworCQllcnIgPSAtRUlOVkFMOworCQlpZiAocC5pcGgudmVyc2lvbiAhPSA0IHx8IHAuaXBoLnByb3RvY29sICE9IElQUFJPVE9fR1JFIHx8CisJCSAgICBwLmlwaC5paGwgIT0gNSB8fCAocC5pcGguZnJhZ19vZmYmaHRvbnMofklQX0RGKSkgfHwKKwkJICAgICgocC5pX2ZsYWdzfHAub19mbGFncykmKEdSRV9WRVJTSU9OfEdSRV9ST1VUSU5HKSkpCisJCQlnb3RvIGRvbmU7CisJCWlmIChwLmlwaC50dGwpCisJCQlwLmlwaC5mcmFnX29mZiB8PSBodG9ucyhJUF9ERik7CisKKwkJaWYgKCEocC5pX2ZsYWdzJkdSRV9LRVkpKQorCQkJcC5pX2tleSA9IDA7CisJCWlmICghKHAub19mbGFncyZHUkVfS0VZKSkKKwkJCXAub19rZXkgPSAwOworCisJCXQgPSBpcGdyZV90dW5uZWxfbG9jYXRlKCZwLCBjbWQgPT0gU0lPQ0FERFRVTk5FTCk7CisKKwkJaWYgKGRldiAhPSBpcGdyZV9mYl90dW5uZWxfZGV2ICYmIGNtZCA9PSBTSU9DQ0hHVFVOTkVMKSB7CisJCQlpZiAodCAhPSBOVUxMKSB7CisJCQkJaWYgKHQtPmRldiAhPSBkZXYpIHsKKwkJCQkJZXJyID0gLUVFWElTVDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQl1bnNpZ25lZCBuZmxhZ3M9MDsKKworCQkJCXQgPSAoc3RydWN0IGlwX3R1bm5lbCopZGV2LT5wcml2OworCisJCQkJaWYgKE1VTFRJQ0FTVChwLmlwaC5kYWRkcikpCisJCQkJCW5mbGFncyA9IElGRl9CUk9BRENBU1Q7CisJCQkJZWxzZSBpZiAocC5pcGguZGFkZHIpCisJCQkJCW5mbGFncyA9IElGRl9QT0lOVE9QT0lOVDsKKworCQkJCWlmICgoZGV2LT5mbGFnc15uZmxhZ3MpJihJRkZfUE9JTlRPUE9JTlR8SUZGX0JST0FEQ0FTVCkpIHsKKwkJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlwZ3JlX3R1bm5lbF91bmxpbmsodCk7CisJCQkJdC0+cGFybXMuaXBoLnNhZGRyID0gcC5pcGguc2FkZHI7CisJCQkJdC0+cGFybXMuaXBoLmRhZGRyID0gcC5pcGguZGFkZHI7CisJCQkJdC0+cGFybXMuaV9rZXkgPSBwLmlfa2V5OworCQkJCXQtPnBhcm1zLm9fa2V5ID0gcC5vX2tleTsKKwkJCQltZW1jcHkoZGV2LT5kZXZfYWRkciwgJnAuaXBoLnNhZGRyLCA0KTsKKwkJCQltZW1jcHkoZGV2LT5icm9hZGNhc3QsICZwLmlwaC5kYWRkciwgNCk7CisJCQkJaXBncmVfdHVubmVsX2xpbmsodCk7CisJCQkJbmV0ZGV2X3N0YXRlX2NoYW5nZShkZXYpOworCQkJfQorCQl9CisKKwkJaWYgKHQpIHsKKwkJCWVyciA9IDA7CisJCQlpZiAoY21kID09IFNJT0NDSEdUVU5ORUwpIHsKKwkJCQl0LT5wYXJtcy5pcGgudHRsID0gcC5pcGgudHRsOworCQkJCXQtPnBhcm1zLmlwaC50b3MgPSBwLmlwaC50b3M7CisJCQkJdC0+cGFybXMuaXBoLmZyYWdfb2ZmID0gcC5pcGguZnJhZ19vZmY7CisJCQl9CisJCQlpZiAoY29weV90b191c2VyKGlmci0+aWZyX2lmcnUuaWZydV9kYXRhLCAmdC0+cGFybXMsIHNpemVvZihwKSkpCisJCQkJZXJyID0gLUVGQVVMVDsKKwkJfSBlbHNlCisJCQllcnIgPSAoY21kID09IFNJT0NBRERUVU5ORUwgPyAtRU5PQlVGUyA6IC1FTk9FTlQpOworCQlicmVhazsKKworCWNhc2UgU0lPQ0RFTFRVTk5FTDoKKwkJZXJyID0gLUVQRVJNOworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlnb3RvIGRvbmU7CisKKwkJaWYgKGRldiA9PSBpcGdyZV9mYl90dW5uZWxfZGV2KSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLCBpZnItPmlmcl9pZnJ1LmlmcnVfZGF0YSwgc2l6ZW9mKHApKSkKKwkJCQlnb3RvIGRvbmU7CisJCQllcnIgPSAtRU5PRU5UOworCQkJaWYgKCh0ID0gaXBncmVfdHVubmVsX2xvY2F0ZSgmcCwgMCkpID09IE5VTEwpCisJCQkJZ290byBkb25lOworCQkJZXJyID0gLUVQRVJNOworCQkJaWYgKHQgPT0gaXBncmVfZmJfdHVubmVsX2Rldi0+cHJpdikKKwkJCQlnb3RvIGRvbmU7CisJCQlkZXYgPSB0LT5kZXY7CisJCX0KKwkJZXJyID0gdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCX0KKworZG9uZToKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmlwZ3JlX3R1bm5lbF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gJigoKHN0cnVjdCBpcF90dW5uZWwqKWRldi0+cHJpdiktPnN0YXQpOworfQorCitzdGF0aWMgaW50IGlwZ3JlX3R1bm5lbF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBpcF90dW5uZWwgKnR1bm5lbCA9IChzdHJ1Y3QgaXBfdHVubmVsKilkZXYtPnByaXY7CisJaWYgKG5ld19tdHUgPCA2OCB8fCBuZXdfbXR1ID4gMHhGRkY4IC0gdHVubmVsLT5obGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZXYtPm10dSA9IG5ld19tdHU7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUX0lQR1JFX0JST0FEQ0FTVAorLyogTmljZSB0b3kuIFVuZm9ydHVuYXRlbHksIHVzZWxlc3MgaW4gcmVhbCBsaWZlIDotKQorICAgSXQgYWxsb3dzIHRvIGNvbnN0cnVjdCB2aXJ0dWFsIG11bHRpcHJvdG9jb2wgYnJvYWRjYXN0ICJMQU4iCisgICBvdmVyIHRoZSBJbnRlcm5ldCwgcHJvdmlkZWQgbXVsdGljYXN0IHJvdXRpbmcgaXMgdHVuZWQuCisKKworICAgSSBoYXZlIG5vIGlkZWEgd2FzIHRoaXMgYmljeWNsZSBpbnZlbnRlZCBiZWZvcmUgbWUsCisgICBzbyB0aGF0IEkgaGFkIHRvIHNldCBBUlBIUkRfSVBHUkUgdG8gYSByYW5kb20gdmFsdWUuCisgICBJIGhhdmUgYW4gaW1wcmVzc2lvbiwgdGhhdCBDaXNjbyBjb3VsZCBtYWtlIHNvbWV0aGluZyBzaW1pbGFyLAorICAgYnV0IHRoaXMgZmVhdHVyZSBpcyBhcHBhcmVudGx5IG1pc3NpbmcgaW4gSU9TPD0xMS4yKDgpLgorICAgCisgICBJIHNldCB1cCAxMC42Ni42Ni8yNCBhbmQgZmVjMDo2NjY2OjY2NjY6OjAvOTYgYXMgdmlydHVhbCBuZXR3b3JrcworICAgd2l0aCBicm9hZGNhc3QgMjI0LjY2LjY2LjY2LiBJZiB5b3UgaGF2ZSBhY2Nlc3MgdG8gbWJvbmUsIHBsYXkgd2l0aCBtZSA6LSkKKworICAgcGluZyAtdCAyNTUgMjI0LjY2LjY2LjY2CisKKyAgIElmIG5vYm9keSBhbnN3ZXJzLCBtYm9uZSBkb2VzIG5vdCB3b3JrLgorCisgICBpcCB0dW5uZWwgYWRkIFVuaXZlcnNlIG1vZGUgZ3JlIHJlbW90ZSAyMjQuNjYuNjYuNjYgbG9jYWwgPFlvdXJfcmVhbF9hZGRyPiB0dGwgMjU1CisgICBpcCBhZGRyIGFkZCAxMC42Ni42Ni48c29tZXdoYXQ+LzI0IGRldiBVbml2ZXJzZQorICAgaWZjb25maWcgVW5pdmVyc2UgdXAKKyAgIGlmY29uZmlnIFVuaXZlcnNlIGFkZCBmZTgwOjo8WW91cl9yZWFsX2FkZHI+LzEwCisgICBpZmNvbmZpZyBVbml2ZXJzZSBhZGQgZmVjMDo2NjY2OjY2NjY6OjxZb3VyX3JlYWxfYWRkcj4vOTYKKyAgIGZ0cCAxMC42Ni42Ni42NgorICAgLi4uCisgICBmdHAgZmVjMDo2NjY2OjY2NjY6OjE5My4yMzMuNy42NQorICAgLi4uCisKKyAqLworCitzdGF0aWMgaW50IGlwZ3JlX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB0eXBlLAorCQkJdm9pZCAqZGFkZHIsIHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pCit7CisJc3RydWN0IGlwX3R1bm5lbCAqdCA9IChzdHJ1Y3QgaXBfdHVubmVsKilkZXYtPnByaXY7CisJc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyICopc2tiX3B1c2goc2tiLCB0LT5obGVuKTsKKwl1MTYgKnAgPSAodTE2KikoaXBoKzEpOworCisJbWVtY3B5KGlwaCwgJnQtPnBhcm1zLmlwaCwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCXBbMF0JCT0gdC0+cGFybXMub19mbGFnczsKKwlwWzFdCQk9IGh0b25zKHR5cGUpOworCisJLyoKKwkgKglTZXQgdGhlIHNvdXJjZSBoYXJkd2FyZSBhZGRyZXNzLiAKKwkgKi8KKwkgCisJaWYgKHNhZGRyKQorCQltZW1jcHkoJmlwaC0+c2FkZHIsIHNhZGRyLCA0KTsKKworCWlmIChkYWRkcikgeworCQltZW1jcHkoJmlwaC0+ZGFkZHIsIGRhZGRyLCA0KTsKKwkJcmV0dXJuIHQtPmhsZW47CisJfQorCWlmIChpcGgtPmRhZGRyICYmICFNVUxUSUNBU1QoaXBoLT5kYWRkcikpCisJCXJldHVybiB0LT5obGVuOworCQorCXJldHVybiAtdC0+aGxlbjsKK30KKworc3RhdGljIGludCBpcGdyZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlwX3R1bm5lbCAqdCA9IChzdHJ1Y3QgaXBfdHVubmVsKilkZXYtPnByaXY7CisKKwlpZiAoTVVMVElDQVNUKHQtPnBhcm1zLmlwaC5kYWRkcikpIHsKKwkJc3RydWN0IGZsb3dpIGZsID0geyAub2lmID0gdC0+cGFybXMubGluaywKKwkJCQkgICAgLm5sX3UgPSB7IC5pcDRfdSA9CisJCQkJCSAgICAgIHsgLmRhZGRyID0gdC0+cGFybXMuaXBoLmRhZGRyLAorCQkJCQkJLnNhZGRyID0gdC0+cGFybXMuaXBoLnNhZGRyLAorCQkJCQkJLnRvcyA9IFJUX1RPUyh0LT5wYXJtcy5pcGgudG9zKSB9IH0sCisJCQkJICAgIC5wcm90byA9IElQUFJPVE9fR1JFIH07CisJCXN0cnVjdCBydGFibGUgKnJ0OworCQlpZiAoaXBfcm91dGVfb3V0cHV0X2tleSgmcnQsICZmbCkpCisJCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisJCWRldiA9IHJ0LT51LmRzdC5kZXY7CisJCWlwX3J0X3B1dChydCk7CisJCWlmIChfX2luX2Rldl9nZXQoZGV2KSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCQl0LT5tbGluayA9IGRldi0+aWZpbmRleDsKKwkJaXBfbWNfaW5jX2dyb3VwKF9faW5fZGV2X2dldChkZXYpLCB0LT5wYXJtcy5pcGguZGFkZHIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcGdyZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpcF90dW5uZWwgKnQgPSAoc3RydWN0IGlwX3R1bm5lbCopZGV2LT5wcml2OworCWlmIChNVUxUSUNBU1QodC0+cGFybXMuaXBoLmRhZGRyKSAmJiB0LT5tbGluaykgeworCQlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBpbmV0ZGV2X2J5X2luZGV4KHQtPm1saW5rKTsKKwkJaWYgKGluX2RldikgeworCQkJaXBfbWNfZGVjX2dyb3VwKGluX2RldiwgdC0+cGFybXMuaXBoLmRhZGRyKTsKKwkJCWluX2Rldl9wdXQoaW5fZGV2KTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGlwZ3JlX3R1bm5lbF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlkZXYtPnVuaW5pdAkJPSBpcGdyZV90dW5uZWxfdW5pbml0OworCWRldi0+ZGVzdHJ1Y3RvciAJPSBmcmVlX25ldGRldjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IGlwZ3JlX3R1bm5lbF94bWl0OworCWRldi0+Z2V0X3N0YXRzCQk9IGlwZ3JlX3R1bm5lbF9nZXRfc3RhdHM7CisJZGV2LT5kb19pb2N0bAkJPSBpcGdyZV90dW5uZWxfaW9jdGw7CisJZGV2LT5jaGFuZ2VfbXR1CQk9IGlwZ3JlX3R1bm5lbF9jaGFuZ2VfbXR1OworCisJZGV2LT50eXBlCQk9IEFSUEhSRF9JUEdSRTsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiAJPSBMTF9NQVhfSEVBREVSICsgc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyA0OworCWRldi0+bXR1CQk9IDE1MDAgLSBzaXplb2Yoc3RydWN0IGlwaGRyKSAtIDQ7CisJZGV2LT5mbGFncwkJPSBJRkZfTk9BUlA7CisJZGV2LT5pZmxpbmsJCT0gMDsKKwlkZXYtPmFkZHJfbGVuCQk9IDQ7Cit9CisKK3N0YXRpYyBpbnQgaXBncmVfdHVubmVsX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqdGRldiA9IE5VTEw7CisJc3RydWN0IGlwX3R1bm5lbCAqdHVubmVsOworCXN0cnVjdCBpcGhkciAqaXBoOworCWludCBobGVuID0gTExfTUFYX0hFQURFUjsKKwlpbnQgbXR1ID0gMTUwMDsKKwlpbnQgYWRkZW5kID0gc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyA0OworCisJdHVubmVsID0gKHN0cnVjdCBpcF90dW5uZWwqKWRldi0+cHJpdjsKKwlpcGggPSAmdHVubmVsLT5wYXJtcy5pcGg7CisKKwl0dW5uZWwtPmRldiA9IGRldjsKKwlzdHJjcHkodHVubmVsLT5wYXJtcy5uYW1lLCBkZXYtPm5hbWUpOworCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsICZ0dW5uZWwtPnBhcm1zLmlwaC5zYWRkciwgNCk7CisJbWVtY3B5KGRldi0+YnJvYWRjYXN0LCAmdHVubmVsLT5wYXJtcy5pcGguZGFkZHIsIDQpOworCisJLyogR3Vlc3Mgb3V0cHV0IGRldmljZSB0byBjaG9vc2UgcmVhc29uYWJsZSBtdHUgYW5kIGhhcmRfaGVhZGVyX2xlbiAqLworCisJaWYgKGlwaC0+ZGFkZHIpIHsKKwkJc3RydWN0IGZsb3dpIGZsID0geyAub2lmID0gdHVubmVsLT5wYXJtcy5saW5rLAorCQkJCSAgICAubmxfdSA9IHsgLmlwNF91ID0KKwkJCQkJICAgICAgeyAuZGFkZHIgPSBpcGgtPmRhZGRyLAorCQkJCQkJLnNhZGRyID0gaXBoLT5zYWRkciwKKwkJCQkJCS50b3MgPSBSVF9UT1MoaXBoLT50b3MpIH0gfSwKKwkJCQkgICAgLnByb3RvID0gSVBQUk9UT19HUkUgfTsKKwkJc3RydWN0IHJ0YWJsZSAqcnQ7CisJCWlmICghaXBfcm91dGVfb3V0cHV0X2tleSgmcnQsICZmbCkpIHsKKwkJCXRkZXYgPSBydC0+dS5kc3QuZGV2OworCQkJaXBfcnRfcHV0KHJ0KTsKKwkJfQorCisJCWRldi0+ZmxhZ3MgfD0gSUZGX1BPSU5UT1BPSU5UOworCisjaWZkZWYgQ09ORklHX05FVF9JUEdSRV9CUk9BRENBU1QKKwkJaWYgKE1VTFRJQ0FTVChpcGgtPmRhZGRyKSkgeworCQkJaWYgKCFpcGgtPnNhZGRyKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJZGV2LT5mbGFncyA9IElGRl9CUk9BRENBU1Q7CisJCQlkZXYtPmhhcmRfaGVhZGVyID0gaXBncmVfaGVhZGVyOworCQkJZGV2LT5vcGVuID0gaXBncmVfb3BlbjsKKwkJCWRldi0+c3RvcCA9IGlwZ3JlX2Nsb3NlOworCQl9CisjZW5kaWYKKwl9CisKKwlpZiAoIXRkZXYgJiYgdHVubmVsLT5wYXJtcy5saW5rKQorCQl0ZGV2ID0gX19kZXZfZ2V0X2J5X2luZGV4KHR1bm5lbC0+cGFybXMubGluayk7CisKKwlpZiAodGRldikgeworCQlobGVuID0gdGRldi0+aGFyZF9oZWFkZXJfbGVuOworCQltdHUgPSB0ZGV2LT5tdHU7CisJfQorCWRldi0+aWZsaW5rID0gdHVubmVsLT5wYXJtcy5saW5rOworCisJLyogUHJlY2FsY3VsYXRlIEdSRSBvcHRpb25zIGxlbmd0aCAqLworCWlmICh0dW5uZWwtPnBhcm1zLm9fZmxhZ3MmKEdSRV9DU1VNfEdSRV9LRVl8R1JFX1NFUSkpIHsKKwkJaWYgKHR1bm5lbC0+cGFybXMub19mbGFncyZHUkVfQ1NVTSkKKwkJCWFkZGVuZCArPSA0OworCQlpZiAodHVubmVsLT5wYXJtcy5vX2ZsYWdzJkdSRV9LRVkpCisJCQlhZGRlbmQgKz0gNDsKKwkJaWYgKHR1bm5lbC0+cGFybXMub19mbGFncyZHUkVfU0VRKQorCQkJYWRkZW5kICs9IDQ7CisJfQorCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gaGxlbiArIGFkZGVuZDsKKwlkZXYtPm10dSA9IG10dSAtIGFkZGVuZDsKKwl0dW5uZWwtPmhsZW4gPSBhZGRlbmQ7CisJcmV0dXJuIDA7Cit9CisKK2ludCBfX2luaXQgaXBncmVfZmJfdHVubmVsX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXBfdHVubmVsICp0dW5uZWwgPSAoc3RydWN0IGlwX3R1bm5lbCopZGV2LT5wcml2OworCXN0cnVjdCBpcGhkciAqaXBoID0gJnR1bm5lbC0+cGFybXMuaXBoOworCisJdHVubmVsLT5kZXYgPSBkZXY7CisJc3RyY3B5KHR1bm5lbC0+cGFybXMubmFtZSwgZGV2LT5uYW1lKTsKKworCWlwaC0+dmVyc2lvbgkJPSA0OworCWlwaC0+cHJvdG9jb2wJCT0gSVBQUk9UT19HUkU7CisJaXBoLT5paGwJCT0gNTsKKwl0dW5uZWwtPmhsZW4JCT0gc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyA0OworCisJZGV2X2hvbGQoZGV2KTsKKwl0dW5uZWxzX3djWzBdCQk9IHR1bm5lbDsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IG5ldF9wcm90b2NvbCBpcGdyZV9wcm90b2NvbCA9IHsKKwkuaGFuZGxlcgk9CWlwZ3JlX3JjdiwKKwkuZXJyX2hhbmRsZXIJPQlpcGdyZV9lcnIsCit9OworCisKKy8qCisgKglBbmQgbm93IHRoZSBtb2R1bGVzIGNvZGUgYW5kIGtlcm5lbCBpbnRlcmZhY2UuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgaXBncmVfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwlwcmludGsoS0VSTl9JTkZPICJHUkUgb3ZlciBJUHY0IHR1bm5lbGluZyBkcml2ZXJcbiIpOworCisJaWYgKGluZXRfYWRkX3Byb3RvY29sKCZpcGdyZV9wcm90b2NvbCwgSVBQUk9UT19HUkUpIDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJpcGdyZSBpbml0OiBjYW4ndCBhZGQgcHJvdG9jb2xcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlpcGdyZV9mYl90dW5uZWxfZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgaXBfdHVubmVsKSwgImdyZTAiLAorCQkJCQkgICBpcGdyZV90dW5uZWxfc2V0dXApOworCWlmICghaXBncmVfZmJfdHVubmVsX2RldikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycjE7CisJfQorCisJaXBncmVfZmJfdHVubmVsX2Rldi0+aW5pdCA9IGlwZ3JlX2ZiX3R1bm5lbF9pbml0OworCisJaWYgKChlcnIgPSByZWdpc3Rlcl9uZXRkZXYoaXBncmVfZmJfdHVubmVsX2RldikpKQorCQlnb3RvIGVycjI7CitvdXQ6CisJcmV0dXJuIGVycjsKK2VycjI6CisJZnJlZV9uZXRkZXYoaXBncmVfZmJfdHVubmVsX2Rldik7CitlcnIxOgorCWluZXRfZGVsX3Byb3RvY29sKCZpcGdyZV9wcm90b2NvbCwgSVBQUk9UT19HUkUpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgdm9pZCBpcGdyZV9maW5pKHZvaWQpCit7CisJaWYgKGluZXRfZGVsX3Byb3RvY29sKCZpcGdyZV9wcm90b2NvbCwgSVBQUk9UT19HUkUpIDwgMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaXBncmUgY2xvc2U6IGNhbid0IHJlbW92ZSBwcm90b2NvbFxuIik7CisKKwl1bnJlZ2lzdGVyX25ldGRldihpcGdyZV9mYl90dW5uZWxfZGV2KTsKK30KKworbW9kdWxlX2luaXQoaXBncmVfaW5pdCk7Cittb2R1bGVfZXhpdChpcGdyZV9maW5pKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX2lucHV0LmMgYi9uZXQvaXB2NC9pcF9pbnB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZDA4MzMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9pcF9pbnB1dC5jCkBAIC0wLDAgKzEsNDMxIEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCVRoZSBJbnRlcm5ldCBQcm90b2NvbCAoSVApIG1vZHVsZS4KKyAqCisgKiBWZXJzaW9uOgkkSWQ6IGlwX2lucHV0LmMsdiAxLjU1IDIwMDIvMDEvMTIgMDc6Mzk6NDUgZGF2ZW0gRXhwICQKKyAqCisgKiBBdXRob3JzOglSb3NzIEJpcm8sIDxiaXI3QGxlbGFuZC5TdGFuZm9yZC5FZHU+CisgKgkJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgkJRG9uYWxkIEJlY2tlciwgPGJlY2tlckBzdXBlci5vcmc+CisgKgkJQWxhbiBDb3gsIDxBbGFuLkNveEBsaW51eC5vcmc+CisgKgkJUmljaGFyZCBVbmRlcndvb2QKKyAqCQlTdGVmYW4gQmVja2VyLCA8c3RlZmFuYkB5ZWxsby5waW5nLmRlPgorICoJCUpvcmdlIEN3aWssIDxqb3JnZUBsYXNlci5zYXRsaW5rLm5ldD4KKyAqCQlBcm50IEd1bGJyYW5kc2VuLCA8YWd1bGJyYUBudmcudW5pdC5ubz4KKyAqCQkKKyAqCisgKiBGaXhlczoKKyAqCQlBbGFuIENveAk6CUNvbW1lbnRlZCBhIGNvdXBsZSBvZiBtaW5vciBiaXRzIG9mIHN1cnBsdXMgY29kZQorICoJCUFsYW4gQ294CToJVW5kZWZpbmluZyBJUF9GT1JXQVJEIGRvZXNuJ3QgaW5jbHVkZSB0aGUgY29kZQorICoJCQkJCShqdXN0IHN0b3BzIGEgY29tcGlsZXIgd2FybmluZykuCisgKgkJQWxhbiBDb3gJOglGcmFtZXMgd2l0aCA+PU1BWF9ST1VURSByZWNvcmQgcm91dGVzLCBzdHJpY3Qgcm91dGVzIG9yIGxvb3NlIHJvdXRlcworICoJCQkJCWFyZSBqdW5rZWQgcmF0aGVyIHRoYW4gY29ycnVwdGluZyB0aGluZ3MuCisgKgkJQWxhbiBDb3gJOglGcmFtZXMgdG8gYmFkIGJyb2FkY2FzdCBzdWJuZXRzIGFyZSBkdW1wZWQKKyAqCQkJCQlXZSB1c2VkIHRvIHByb2Nlc3MgdGhlbSBub24gYnJvYWRjYXN0IGFuZAorICoJCQkJCWJveSBjb3VsZCB0aGF0IGNhdXNlIGhhdm9jLgorICoJCUFsYW4gQ294CToJaXBfZm9yd2FyZCBzZXRzIHRoZSBmcmVlIGZsYWcgb24gdGhlCisgKgkJCQkJbmV3IGZyYW1lIGl0IHF1ZXVlcy4gU3RpbGwgY3JhcCBiZWNhdXNlCisgKgkJCQkJaXQgY29waWVzIHRoZSBmcmFtZSBidXQgYXQgbGVhc3QgaXQKKyAqCQkJCQlkb2Vzbid0IGVhdCBtZW1vcnkgdG9vLgorICoJCUFsYW4gQ294CToJR2VuZXJpYyBxdWV1ZSBjb2RlIGFuZCBtZW1vcnkgZml4ZXMuCisgKgkJRnJlZCBWYW4gS2VtcGVuIDoJSVAgZnJhZ21lbnQgc3VwcG9ydCAoYm9ycm93ZWQgZnJvbSBORVQyRSkKKyAqCQlHZXJoYXJkIEtvZXJ0aW5nOglGb3J3YXJkIGZyYWdtZW50ZWQgZnJhbWVzIGNvcnJlY3RseS4KKyAqCQlHZXJoYXJkIEtvZXJ0aW5nOiAJRml4ZXMgdG8gbXkgZml4IG9mIHRoZSBhYm92ZSA4LSkuCisgKgkJR2VyaGFyZCBLb2VydGluZzoJSVAgaW50ZXJmYWNlIGFkZHJlc3NpbmcgZml4LgorICoJCUxpbnVzIFRvcnZhbGRzCToJTW9yZSByb2J1c3RuZXNzIGNoZWNrcworICoJCUFsYW4gQ294CToJRXZlbiBtb3JlIGNoZWNrczogU3RpbGwgbm90IGFzIHJvYnVzdCBhcyBpdCBvdWdodCB0byBiZQorICoJCUFsYW4gQ294CToJU2F2ZSBJUCBoZWFkZXIgcG9pbnRlciBmb3IgbGF0ZXIKKyAqCQlBbGFuIENveAk6CWlwIG9wdGlvbiBzZXR0aW5nCisgKgkJQWxhbiBDb3gJOglVc2UgaXBfdG9zL2lwX3R0bCBzZXR0aW5ncworICoJCUFsYW4gQ294CToJRnJhZ21lbnRhdGlvbiBib2dvc2l0eSByZW1vdmVkCisgKgkJCQkJKFRoYW5rcyB0byBNYXJrLkJ1c2hAcHJnLm94LmFjLnVrKQorICoJCURtaXRyeSBHb3JvZGNoYW5pbiA6CVNlbmQgb2YgYSByYXcgcGFja2V0IGNyYXNoIGZpeC4KKyAqCQlBbGFuIENveAk6CVNpbGx5IGlwIGJ1ZyB3aGVuIGFuIG92ZXJsZW5ndGgKKyAqCQkJCQlmcmFnbWVudCB0dXJucyB1cC4gTm93IGZyZWVzIHRoZQorICoJCQkJCXF1ZXVlLgorICoJCUxpbnVzIFRvcnZhbGRzLyA6CU1lbW9yeSBsZWFrYWdlIG9uIGZyYWdtZW50YXRpb24KKyAqCQlBbGFuIENveAk6CWhhbmRsaW5nLgorICoJCUdlcmhhcmQgS29lcnRpbmc6CUZvcndhcmRpbmcgdXNlcyBJUCBwcmlvcml0eSBoaW50cworICoJCVRlZW11IFJhbnRhbmVuCToJRnJhZ21lbnQgcHJvYmxlbXMuCisgKgkJQWxhbiBDb3gJOglHZW5lcmFsIGNsZWFudXAsIGNvbW1lbnRzIGFuZCByZWZvcm1hdAorICoJCUFsYW4gQ294CToJU05NUCBzdGF0aXN0aWNzCisgKgkJQWxhbiBDb3gJOglCU0QgYWRkcmVzcyBydWxlIHNlbWFudGljcy4gQWxzbyBzZWUKKyAqCQkJCQlVRFAgYXMgdGhlcmUgaXMgYSBuYXN0eSBjaGVja3N1bSBpc3N1ZQorICoJCQkJCWlmIHlvdSBkbyB0aGluZ3MgdGhlIHdyb25nIHdheS4KKyAqCQlBbGFuIENveAk6CUFsd2F5cyBkZWZyYWcsIG1vdmVkIElQX0ZPUldBUkQgdG8gdGhlIGNvbmZpZy5pbiBmaWxlCisgKgkJQWxhbiBDb3gJOiAJSVAgb3B0aW9ucyBhZGp1c3Qgc2stPnByaW9yaXR5LgorICoJCVBlZHJvIFJvcXVlCToJRml4IG10dS9sZW5ndGggZXJyb3IgaW4gaXBfZm9yd2FyZC4KKyAqCQlBbGFuIENveAk6CUF2b2lkIGlwX2Noa19hZGRyIHdoZW4gcG9zc2libGUuCisgKglSaWNoYXJkIFVuZGVyd29vZAk6CUlQIG11bHRpY2FzdGluZy4KKyAqCQlBbGFuIENveAk6CUNsZWFuZWQgdXAgbXVsdGljYXN0IGhhbmRsZXJzLgorICoJCUFsYW4gQ294CToJUkFXIHNvY2tldHMgZGVtdWx0aXBsZXggaW4gdGhlIEJTRCBzdHlsZS4KKyAqCQlHdW50aGVyIE1heWVyCToJRml4IHRoZSBTTk1QIHJlcG9ydGluZyB0eXBvCisgKgkJQWxhbiBDb3gJOglBbHdheXMgaW4gZ3JvdXAgMjI0LjAuMC4xCisgKglQYXVsaW5lIE1pZGRlbGluawk6CUZhc3QgaXBfY2hlY2tzdW0gdXBkYXRlIHdoZW4gZm9yd2FyZGluZworICoJCQkJCU1hc3F1ZXJhZGluZyBzdXBwb3J0LgorICoJCUFsYW4gQ294CToJTXVsdGljYXN0IGxvb3BiYWNrIGVycm9yIGZvciAyMjQuMC4wLjEKKyAqCQlBbGFuIENveAk6CUlQX01VTFRJQ0FTVF9MT09QIG9wdGlvbi4KKyAqCQlBbGFuIENveAk6CVVzZSBub3RpZmllcnMuCisgKgkJQmpvcm4gRWt3YWxsCToJUmVtb3ZlZCBpcF9jc3VtIChmcm9tIHNsaGMuYyB0b28pCisgKgkJQmpvcm4gRWt3YWxsCToJTW92ZWQgaXBfZmFzdF9jc3VtIHRvIGlwLmggKGlubGluZSEpCisgKgkJU3RlZmFuIEJlY2tlciAgIDogICAgICAgU2VuZCBvdXQgSUNNUCBIT1NUIFJFRElSRUNUCisgKglBcm50IEd1bGJyYW5kc2VuCToJaXBfYnVpbGRfeG1pdAorICoJCUFsYW4gQ294CToJUGVyIHNvY2tldCByb3V0aW5nIGNhY2hlCisgKgkJQWxhbiBDb3gJOglGaXhlZCByb3V0aW5nIGNhY2hlLCBhZGRlZCBoZWFkZXIgY2FjaGUuCisgKgkJQWxhbiBDb3gJOglMb29wYmFjayBkaWRuJ3Qgd29yayByaWdodCBpbiBvcmlnaW5hbCBpcF9idWlsZF94bWl0IC0gZml4ZWQgaXQuCisgKgkJQWxhbiBDb3gJOglPbmx5IHNlbmQgSUNNUF9SRURJUkVDVCBpZiBzcmMvZGVzdCBhcmUgdGhlIHNhbWUgbmV0LgorICoJCUFsYW4gQ294CToJSW5jb21pbmcgSVAgb3B0aW9uIGhhbmRsaW5nLgorICoJCUFsYW4gQ294CToJU2V0IHNhZGRyIG9uIHJhdyBvdXRwdXQgZnJhbWVzIGFzIHBlciBCU0QuCisgKgkJQWxhbiBDb3gJOglTdG9wcGVkIGJyb2FkY2FzdCBzb3VyY2Ugcm91dGUgZXhwbG9zaW9ucy4KKyAqCQlBbGFuIENveAk6CUNhbiBkaXNhYmxlIHNvdXJjZSByb3V0aW5nCisgKgkJVGFrZXNoaSBTb25lICAgIDoJTWFzcXVlcmFkaW5nIGRpZG4ndCB3b3JrLgorICoJRGF2ZSBCb25uLEFsYW4gQ294CToJRmFzdGVyIElQIGZvcndhcmRpbmcgd2hlbmV2ZXIgcG9zc2libGUuCisgKgkJQWxhbiBDb3gJOglNZW1vcnkgbGVha3MsIHRyYW1wbGVzLCBtaXNjIGRlYnVnZ2luZy4KKyAqCQlBbGFuIENveAk6CUZpeGVkIG11bHRpY2FzdCAoYnkgcG9wdWxhciBkZW1hbmQgOCkpCisgKgkJQWxhbiBDb3gJOglGaXhlZCBmb3J3YXJkaW5nIChieSBldmVuIG1vcmUgcG9wdWxhciBkZW1hbmQgOCkpCisgKgkJQWxhbiBDb3gJOglGaXhlZCBTTk1QIHN0YXRpc3RpY3MgW0kgdGhpbmtdCisgKglHZXJoYXJkIEtvZXJ0aW5nCToJSVAgZnJhZ21lbnRhdGlvbiBmb3J3YXJkaW5nIGZpeAorICoJCUFsYW4gQ294CToJRGV2aWNlIGxvY2sgYWdhaW5zdCBwYWdlIGZhdWx0LgorICoJCUFsYW4gQ294CToJSVBfSERSSU5DTCBmYWNpbGl0eS4KKyAqCVdlcm5lciBBbG1lc2Jlcmdlcgk6CVplcm8gZnJhZ21lbnQgYnVnCisgKgkJQWxhbiBDb3gJOglSQVcgSVAgZnJhbWUgbGVuZ3RoIGJ1ZworICoJCUFsYW4gQ294CToJT3V0Z29pbmcgZmlyZXdhbGwgb24gYnVpbGRfeG1pdAorICoJCUEuTi5LdXpuZXRzb3YJOglJUF9PUFRJT05TIHN1cHBvcnQgdGhyb3VnaG91dCB0aGUga2VybmVsCisgKgkJQWxhbiBDb3gJOglNdWx0aWNhc3Qgcm91dGluZyBob29rcworICoJCUpvcyBWb3MJCToJRG8gYWNjb3VudGluZyAqYmVmb3JlKiBjYWxsX2luX2ZpcmV3YWxsCisgKglXaWxseSBLb255bmVuYmVyZwk6CVRyYW5zcGFyZW50IHByb3h5aW5nIHN1cHBvcnQKKyAqCisgKiAgCisgKgorICogVG8gRml4OgorICoJCUlQIGZyYWdtZW50YXRpb24gd2FudHMgcmV3cml0aW5nIGNsZWFubHkuIFRoZSBSRkM4MTUgYWxnb3JpdGhtIGlzIG11Y2ggbW9yZSBlZmZpY2llbnQKKyAqCQlhbmQgY291bGQgYmUgbWFkZSB2ZXJ5IGVmZmljaWVudCB3aXRoIHRoZSBhZGRpdGlvbiBvZiBzb21lIHZpcnR1YWwgbWVtb3J5IGhhY2tzIHRvIHBlcm1pdAorICoJCXRoZSBhbGxvY2F0aW9uIG9mIGEgYnVmZmVyIHRoYXQgY2FuIHRoZW4gYmUgJ2dyb3duJyBieSB0d2lkZGxpbmcgcGFnZSB0YWJsZXMuCisgKgkJT3V0cHV0IGZyYWdtZW50YXRpb24gd2FudHMgdXBkYXRpbmcgYWxvbmcgd2l0aCB0aGUgYnVmZmVyIG1hbmFnZW1lbnQgdG8gdXNlIGEgc2luZ2xlIAorICoJCWludGVybGVhdmVkIGNvcHkgYWxnb3JpdGhtIHNvIHRoYXQgZnJhZ21lbnRpbmcgaGFzIGEgb25lIGNvcHkgb3ZlcmhlYWQuIEFjdHVhbCBwYWNrZXQKKyAqCQlvdXRwdXQgc2hvdWxkIHByb2JhYmx5IGRvIGl0cyBvd24gZnJhZ21lbnRhdGlvbiBhdCB0aGUgVURQL1JBVyBsYXllci4gVENQIHNob3VsZG4ndCBjYXVzZQorICoJCWZyYWdtZW50YXRpb24gYW55d2F5LgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxuZXQvc25tcC5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorI2luY2x1ZGUgPG5ldC9pY21wLmg+CisjaW5jbHVkZSA8bmV0L3Jhdy5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bmV0L3hmcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9tcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKKy8qCisgKglTTk1QIG1hbmFnZW1lbnQgc3RhdGlzdGljcworICovCisKK0RFRklORV9TTk1QX1NUQVQoc3RydWN0IGlwc3RhdHNfbWliLCBpcF9zdGF0aXN0aWNzKTsKKworLyoKKyAqCVByb2Nlc3MgUm91dGVyIEF0dGVudGlvbiBJUCBvcHRpb24KKyAqLyAKK2ludCBpcF9jYWxsX3JhX2NoYWluKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlwX3JhX2NoYWluICpyYTsKKwl1OCBwcm90b2NvbCA9IHNrYi0+bmguaXBoLT5wcm90b2NvbDsKKwlzdHJ1Y3Qgc29jayAqbGFzdCA9IE5VTEw7CisKKwlyZWFkX2xvY2soJmlwX3JhX2xvY2spOworCWZvciAocmEgPSBpcF9yYV9jaGFpbjsgcmE7IHJhID0gcmEtPm5leHQpIHsKKwkJc3RydWN0IHNvY2sgKnNrID0gcmEtPnNrOworCisJCS8qIElmIHNvY2tldCBpcyBib3VuZCB0byBhbiBpbnRlcmZhY2UsIG9ubHkgcmVwb3J0CisJCSAqIHRoZSBwYWNrZXQgaWYgaXQgY2FtZSAgZnJvbSB0aGF0IGludGVyZmFjZS4KKwkJICovCisJCWlmIChzayAmJiBpbmV0X3NrKHNrKS0+bnVtID09IHByb3RvY29sICYmCisJCSAgICAoIXNrLT5za19ib3VuZF9kZXZfaWYgfHwKKwkJICAgICBzay0+c2tfYm91bmRfZGV2X2lmID09IHNrYi0+ZGV2LT5pZmluZGV4KSkgeworCQkJaWYgKHNrYi0+bmguaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX01GfElQX09GRlNFVCkpIHsKKwkJCQlza2IgPSBpcF9kZWZyYWcoc2tiLCBJUF9ERUZSQUdfQ0FMTF9SQV9DSEFJTik7CisJCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJCXJlYWRfdW5sb2NrKCZpcF9yYV9sb2NrKTsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJfQorCQkJaWYgKGxhc3QpIHsKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCQkJCWlmIChza2IyKQorCQkJCQlyYXdfcmN2KGxhc3QsIHNrYjIpOworCQkJfQorCQkJbGFzdCA9IHNrOworCQl9CisJfQorCisJaWYgKGxhc3QpIHsKKwkJcmF3X3JjdihsYXN0LCBza2IpOworCQlyZWFkX3VubG9jaygmaXBfcmFfbG9jayk7CisJCXJldHVybiAxOworCX0KKwlyZWFkX3VubG9jaygmaXBfcmFfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlwX2xvY2FsX2RlbGl2ZXJfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGlobCA9IHNrYi0+bmguaXBoLT5paGwqNDsKKworI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKKwluZl9kZWJ1Z19pcF9sb2NhbF9kZWxpdmVyKHNrYik7CisjZW5kaWYgLypDT05GSUdfTkVURklMVEVSX0RFQlVHKi8KKworCV9fc2tiX3B1bGwoc2tiLCBpaGwpOworCisJLyogRnJlZSByZWZlcmVuY2UgZWFybHk6IHdlIGRvbid0IG5lZWQgaXQgYW55IG1vcmUsIGFuZCBpdCBtYXkKKyAgICAgICAgICAgaG9sZCBpcF9jb25udHJhY2sgbW9kdWxlIGxvYWRlZCBpbmRlZmluaXRlbHkuICovCisJbmZfcmVzZXQoc2tiKTsKKworICAgICAgICAvKiBQb2ludCBpbnRvIHRoZSBJUCBkYXRhZ3JhbSwganVzdCBwYXN0IHRoZSBoZWFkZXIuICovCisgICAgICAgIHNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJeworCQkvKiBOb3RlOiBTZWUgcmF3LmMgYW5kIG5ldC9yYXcuaCwgUkFXVjRfSFRBQkxFX1NJWkU9PU1BWF9JTkVUX1BST1RPUyAqLworCQlpbnQgcHJvdG9jb2wgPSBza2ItPm5oLmlwaC0+cHJvdG9jb2w7CisJCWludCBoYXNoOworCQlzdHJ1Y3Qgc29jayAqcmF3X3NrOworCQlzdHJ1Y3QgbmV0X3Byb3RvY29sICppcHByb3Q7CisKKwlyZXN1Ym1pdDoKKwkJaGFzaCA9IHByb3RvY29sICYgKE1BWF9JTkVUX1BST1RPUyAtIDEpOworCQlyYXdfc2sgPSBza19oZWFkKCZyYXdfdjRfaHRhYmxlW2hhc2hdKTsKKworCQkvKiBJZiB0aGVyZSBtYXliZSBhIHJhdyBzb2NrZXQgd2UgbXVzdCBjaGVjayAtIGlmIG5vdCB3ZQorCQkgKiBkb24ndCBjYXJlIGxlc3MKKwkJICovCisJCWlmIChyYXdfc2spCisJCQlyYXdfdjRfaW5wdXQoc2tiLCBza2ItPm5oLmlwaCwgaGFzaCk7CisKKwkJaWYgKChpcHByb3QgPSByY3VfZGVyZWZlcmVuY2UoaW5ldF9wcm90b3NbaGFzaF0pKSAhPSBOVUxMKSB7CisJCQlpbnQgcmV0OworCisJCQlpZiAoIWlwcHJvdC0+bm9fcG9saWN5ICYmCisJCQkgICAgIXhmcm00X3BvbGljeV9jaGVjayhOVUxMLCBYRlJNX1BPTElDWV9JTiwgc2tiKSkgeworCQkJCWtmcmVlX3NrYihza2IpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJcmV0ID0gaXBwcm90LT5oYW5kbGVyKHNrYik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXByb3RvY29sID0gLXJldDsKKwkJCQlnb3RvIHJlc3VibWl0OworCQkJfQorCQkJSVBfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOREVMSVZFUlMpOworCQl9IGVsc2UgeworCQkJaWYgKCFyYXdfc2spIHsKKwkJCQlpZiAoeGZybTRfcG9saWN5X2NoZWNrKE5VTEwsIFhGUk1fUE9MSUNZX0lOLCBza2IpKSB7CisJCQkJCUlQX0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTlVOS05PV05QUk9UT1MpOworCQkJCQlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCwKKwkJCQkJCSAgSUNNUF9QUk9UX1VOUkVBQ0gsIDApOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCUlQX0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkRFTElWRVJTKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQl9CisJfQorIG91dDoKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiAwOworfQorCisvKgorICogCURlbGl2ZXIgSVAgUGFja2V0cyB0byB0aGUgaGlnaGVyIHByb3RvY29sIGxheWVycy4KKyAqLyAKK2ludCBpcF9sb2NhbF9kZWxpdmVyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJLyoKKwkgKglSZWFzc2VtYmxlIElQIGZyYWdtZW50cy4KKwkgKi8KKworCWlmIChza2ItPm5oLmlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRnxJUF9PRkZTRVQpKSB7CisJCXNrYiA9IGlwX2RlZnJhZyhza2IsIElQX0RFRlJBR19MT0NBTF9ERUxJVkVSKTsKKwkJaWYgKCFza2IpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gTkZfSE9PSyhQRl9JTkVULCBORl9JUF9MT0NBTF9JTiwgc2tiLCBza2ItPmRldiwgTlVMTCwKKwkJICAgICAgIGlwX2xvY2FsX2RlbGl2ZXJfZmluaXNoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXBfcmN2X2ZpbmlzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCisJLyoKKwkgKglJbml0aWFsaXNlIHRoZSB2aXJ0dWFsIHBhdGggY2FjaGUgZm9yIHRoZSBwYWNrZXQuIEl0IGRlc2NyaWJlcworCSAqCWhvdyB0aGUgcGFja2V0IHRyYXZlbHMgaW5zaWRlIExpbnV4IG5ldHdvcmtpbmcuCisJICovIAorCWlmIChza2ItPmRzdCA9PSBOVUxMKSB7CisJCWlmIChpcF9yb3V0ZV9pbnB1dChza2IsIGlwaC0+ZGFkZHIsIGlwaC0+c2FkZHIsIGlwaC0+dG9zLCBkZXYpKQorCQkJZ290byBkcm9wOyAKKwl9CisKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19ST1VURQorCWlmIChza2ItPmRzdC0+dGNsYXNzaWQpIHsKKwkJc3RydWN0IGlwX3J0X2FjY3QgKnN0ID0gaXBfcnRfYWNjdCArIDI1NipzbXBfcHJvY2Vzc29yX2lkKCk7CisJCXUzMiBpZHggPSBza2ItPmRzdC0+dGNsYXNzaWQ7CisJCXN0W2lkeCYweEZGXS5vX3BhY2tldHMrKzsKKwkJc3RbaWR4JjB4RkZdLm9fYnl0ZXMrPXNrYi0+bGVuOworCQlzdFsoaWR4Pj4xNikmMHhGRl0uaV9wYWNrZXRzKys7CisJCXN0WyhpZHg+PjE2KSYweEZGXS5pX2J5dGVzKz1za2ItPmxlbjsKKwl9CisjZW5kaWYKKworCWlmIChpcGgtPmlobCA+IDUpIHsKKwkJc3RydWN0IGlwX29wdGlvbnMgKm9wdDsKKworCQkvKiBJdCBsb29rcyBhcyBvdmVya2lsbCwgYmVjYXVzZSBub3QgYWxsCisJCSAgIElQIG9wdGlvbnMgcmVxdWlyZSBwYWNrZXQgbWFuZ2xpbmcuCisJCSAgIEJ1dCBpdCBpcyB0aGUgZWFzaWVzdCBmb3Igbm93LCBlc3BlY2lhbGx5IHRha2luZworCQkgICBpbnRvIGFjY291bnQgdGhhdCBjb21iaW5hdGlvbiBvZiBJUCBvcHRpb25zCisJCSAgIGFuZCBydW5uaW5nIHNuaWZmZXIgaXMgZXh0cmVtZWx5IHJhcmUgY29uZGl0aW9uLgorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tQU5LICg5ODA4MTMpCisJCSovCisKKwkJaWYgKHNrYl9jb3coc2tiLCBza2JfaGVhZHJvb20oc2tiKSkpIHsKKwkJCUlQX0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkRJU0NBUkRTKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCQlpcGggPSBza2ItPm5oLmlwaDsKKworCQlpZiAoaXBfb3B0aW9uc19jb21waWxlKE5VTEwsIHNrYikpCisJCQlnb3RvIGluaGRyX2Vycm9yOworCisJCW9wdCA9ICYoSVBDQihza2IpLT5vcHQpOworCQlpZiAob3B0LT5zcnIpIHsKKwkJCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiA9IGluX2Rldl9nZXQoZGV2KTsKKwkJCWlmIChpbl9kZXYpIHsKKwkJCQlpZiAoIUlOX0RFVl9TT1VSQ0VfUk9VVEUoaW5fZGV2KSkgeworCQkJCQlpZiAoSU5fREVWX0xPR19NQVJUSUFOUyhpbl9kZXYpICYmIG5ldF9yYXRlbGltaXQoKSkKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gInNvdXJjZSByb3V0ZSBvcHRpb24gJXUuJXUuJXUuJXUgLT4gJXUuJXUuJXUuJXVcbiIsCisJCQkJCQkgICAgICAgTklQUVVBRChpcGgtPnNhZGRyKSwgTklQUVVBRChpcGgtPmRhZGRyKSk7CisJCQkJCWluX2Rldl9wdXQoaW5fZGV2KTsKKwkJCQkJZ290byBkcm9wOworCQkJCX0KKwkJCQlpbl9kZXZfcHV0KGluX2Rldik7CisJCQl9CisJCQlpZiAoaXBfb3B0aW9uc19yY3Zfc3JyKHNrYikpCisJCQkJZ290byBkcm9wOworCQl9CisJfQorCisJcmV0dXJuIGRzdF9pbnB1dChza2IpOworCitpbmhkcl9lcnJvcjoKKwlJUF9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworZHJvcDoKKyAgICAgICAga2ZyZWVfc2tiKHNrYik7CisgICAgICAgIHJldHVybiBORVRfUlhfRFJPUDsKK30KKworLyoKKyAqIAlNYWluIElQIFJlY2VpdmUgcm91dGluZS4KKyAqLyAKK2ludCBpcF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHBhY2tldF90eXBlICpwdCkKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKworCS8qIFdoZW4gdGhlIGludGVyZmFjZSBpcyBpbiBwcm9taXNjLiBtb2RlLCBkcm9wIGFsbCB0aGUgY3JhcAorCSAqIHRoYXQgaXQgcmVjZWl2ZXMsIGRvIG5vdCB0cnkgdG8gYW5hbHlzZSBpdC4KKwkgKi8KKwlpZiAoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfT1RIRVJIT1NUKQorCQlnb3RvIGRyb3A7CisKKwlJUF9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5SRUNFSVZFUyk7CisKKwlpZiAoKHNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCUlQX0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkRJU0NBUkRTKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpKQorCQlnb3RvIGluaGRyX2Vycm9yOworCisJaXBoID0gc2tiLT5uaC5pcGg7CisKKwkvKgorCSAqCVJGQzExMjI6IDMuMS4yLjIgTVVTVCBzaWxlbnRseSBkaXNjYXJkIGFueSBJUCBmcmFtZSB0aGF0IGZhaWxzIHRoZSBjaGVja3N1bS4KKwkgKgorCSAqCUlzIHRoZSBkYXRhZ3JhbSBhY2NlcHRhYmxlPworCSAqCisJICoJMS4JTGVuZ3RoIGF0IGxlYXN0IHRoZSBzaXplIG9mIGFuIGlwIGhlYWRlcgorCSAqCTIuCVZlcnNpb24gb2YgNAorCSAqCTMuCUNoZWNrc3VtcyBjb3JyZWN0bHkuIFtTcGVlZCBvcHRpbWlzYXRpb24gZm9yIGxhdGVyLCBza2lwIGxvb3BiYWNrIGNoZWNrc3Vtc10KKwkgKgk0LglEb2Vzbid0IGhhdmUgYSBib2d1cyBsZW5ndGgKKwkgKi8KKworCWlmIChpcGgtPmlobCA8IDUgfHwgaXBoLT52ZXJzaW9uICE9IDQpCisJCWdvdG8gaW5oZHJfZXJyb3I7IAorCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgaXBoLT5paGwqNCkpCisJCWdvdG8gaW5oZHJfZXJyb3I7CisKKwlpcGggPSBza2ItPm5oLmlwaDsKKworCWlmIChpcF9mYXN0X2NzdW0oKHU4ICopaXBoLCBpcGgtPmlobCkgIT0gMCkKKwkJZ290byBpbmhkcl9lcnJvcjsgCisKKwl7CisJCV9fdTMyIGxlbiA9IG50b2hzKGlwaC0+dG90X2xlbik7IAorCQlpZiAoc2tiLT5sZW4gPCBsZW4gfHwgbGVuIDwgKGlwaC0+aWhsPDwyKSkKKwkJCWdvdG8gaW5oZHJfZXJyb3I7CisKKwkJLyogT3VyIHRyYW5zcG9ydCBtZWRpdW0gbWF5IGhhdmUgcGFkZGVkIHRoZSBidWZmZXIgb3V0LiBOb3cgd2Uga25vdyBpdAorCQkgKiBpcyBJUCB3ZSBjYW4gdHJpbSB0byB0aGUgdHJ1ZSBsZW5ndGggb2YgdGhlIGZyYW1lLgorCQkgKiBOb3RlIHRoaXMgbm93IG1lYW5zIHNrYi0+bGVuIGhvbGRzIG50b2hzKGlwaC0+dG90X2xlbikuCisJCSAqLworCQlpZiAocHNrYl90cmltX3Jjc3VtKHNrYiwgbGVuKSkgeworCQkJSVBfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lORElTQ0FSRFMpOworCQkJZ290byBkcm9wOworCQl9CisJfQorCisJcmV0dXJuIE5GX0hPT0soUEZfSU5FVCwgTkZfSVBfUFJFX1JPVVRJTkcsIHNrYiwgZGV2LCBOVUxMLAorCQkgICAgICAgaXBfcmN2X2ZpbmlzaCk7CisKK2luaGRyX2Vycm9yOgorCUlQX0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7Citkcm9wOgorICAgICAgICBrZnJlZV9za2Ioc2tiKTsKK291dDoKKyAgICAgICAgcmV0dXJuIE5FVF9SWF9EUk9QOworfQorCitFWFBPUlRfU1lNQk9MKGlwX3Jjdik7CitFWFBPUlRfU1lNQk9MKGlwX3N0YXRpc3RpY3MpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfb3B0aW9ucy5jIGIvbmV0L2lwdjQvaXBfb3B0aW9ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkODlmM2YKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9pcF9vcHRpb25zLmMKQEAgLTAsMCArMSw2MjUgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJVGhlIG9wdGlvbnMgcHJvY2Vzc2luZyBtb2R1bGUgZm9yIGlwLmMKKyAqCisgKiBWZXJzaW9uOgkkSWQ6IGlwX29wdGlvbnMuYyx2IDEuMjEgMjAwMS8wOS8wMSAwMDozMTo1MCBkYXZlbSBFeHAgJAorICoKKyAqIEF1dGhvcnM6CUEuTi5LdXpuZXRzb3YKKyAqCQkKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaWNtcC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L2ljbXAuaD4KKworLyogCisgKiBXcml0ZSBvcHRpb25zIHRvIElQIGhlYWRlciwgcmVjb3JkIGRlc3RpbmF0aW9uIGFkZHJlc3MgdG8KKyAqIHNvdXJjZSByb3V0ZSBvcHRpb24sIGFkZHJlc3Mgb2Ygb3V0Z29pbmcgaW50ZXJmYWNlCisgKiAod2Ugc2hvdWxkIGFscmVhZHkga25vdyBpdCwgc28gdGhhdCB0aGlzICBmdW5jdGlvbiBpcyBhbGxvd2VkIGJlCisgKiBjYWxsZWQgb25seSBhZnRlciByb3V0aW5nIGRlY2lzaW9uKSBhbmQgdGltZXN0YW1wLAorICogaWYgd2Ugb3JpZ2luYXRlIHRoaXMgZGF0YWdyYW0uCisgKgorICogZGFkZHIgaXMgcmVhbCBkZXN0aW5hdGlvbiBhZGRyZXNzLCBuZXh0IGhvcCBpcyByZWNvcmRlZCBpbiBJUCBoZWFkZXIuCisgKiBzYWRkciBpcyBhZGRyZXNzIG9mIG91dGdvaW5nIGludGVyZmFjZS4KKyAqLworCit2b2lkIGlwX29wdGlvbnNfYnVpbGQoc3RydWN0IHNrX2J1ZmYgKiBza2IsIHN0cnVjdCBpcF9vcHRpb25zICogb3B0LAorCQkJICAgIHUzMiBkYWRkciwgc3RydWN0IHJ0YWJsZSAqcnQsIGludCBpc19mcmFnKSAKK3sKKwl1bnNpZ25lZCBjaGFyICogaXBoID0gc2tiLT5uaC5yYXc7CisKKwltZW1jcHkoJihJUENCKHNrYiktPm9wdCksIG9wdCwgc2l6ZW9mKHN0cnVjdCBpcF9vcHRpb25zKSk7CisJbWVtY3B5KGlwaCtzaXplb2Yoc3RydWN0IGlwaGRyKSwgb3B0LT5fX2RhdGEsIG9wdC0+b3B0bGVuKTsKKwlvcHQgPSAmKElQQ0Ioc2tiKS0+b3B0KTsKKwlvcHQtPmlzX2RhdGEgPSAwOworCisJaWYgKG9wdC0+c3JyKQorCQltZW1jcHkoaXBoK29wdC0+c3JyK2lwaFtvcHQtPnNycisxXS00LCAmZGFkZHIsIDQpOworCisJaWYgKCFpc19mcmFnKSB7CisJCWlmIChvcHQtPnJyX25lZWRhZGRyKQorCQkJaXBfcnRfZ2V0X3NvdXJjZShpcGgrb3B0LT5ycitpcGhbb3B0LT5ycisyXS01LCBydCk7CisJCWlmIChvcHQtPnRzX25lZWRhZGRyKQorCQkJaXBfcnRfZ2V0X3NvdXJjZShpcGgrb3B0LT50cytpcGhbb3B0LT50cysyXS05LCBydCk7CisJCWlmIChvcHQtPnRzX25lZWR0aW1lKSB7CisJCQlzdHJ1Y3QgdGltZXZhbCB0djsKKwkJCV9fdTMyIG1pZHRpbWU7CisJCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwkJCW1pZHRpbWUgPSBodG9ubCgodHYudHZfc2VjICUgODY0MDApICogMTAwMCArIHR2LnR2X3VzZWMgLyAxMDAwKTsKKwkJCW1lbWNweShpcGgrb3B0LT50cytpcGhbb3B0LT50cysyXS01LCAmbWlkdGltZSwgNCk7CisJCX0KKwkJcmV0dXJuOworCX0KKwlpZiAob3B0LT5ycikgeworCQltZW1zZXQoaXBoK29wdC0+cnIsIElQT1BUX05PUCwgaXBoW29wdC0+cnIrMV0pOworCQlvcHQtPnJyID0gMDsKKwkJb3B0LT5ycl9uZWVkYWRkciA9IDA7CisJfQorCWlmIChvcHQtPnRzKSB7CisJCW1lbXNldChpcGgrb3B0LT50cywgSVBPUFRfTk9QLCBpcGhbb3B0LT50cysxXSk7CisJCW9wdC0+dHMgPSAwOworCQlvcHQtPnRzX25lZWRhZGRyID0gb3B0LT50c19uZWVkdGltZSA9IDA7CisJfQorfQorCisvKiAKKyAqIFByb3ZpZGVkIChzb3B0LCBza2IpIHBvaW50cyB0byByZWNlaXZlZCBvcHRpb25zLAorICogYnVpbGQgaW4gZG9wdCBjb21waWxlZCBvcHRpb24gc2V0IGFwcHJvcHJpYXRlIGZvciBhbnN3ZXJpbmcuCisgKiBpLmUuIGludmVydCBTUlIgb3B0aW9uLCBjb3B5IGFub3RoZXJzLAorICogYW5kIGdyYWIgcm9vbSBpbiBSUi9UUyBvcHRpb25zLgorICoKKyAqIE5PVEU6IGRvcHQgY2Fubm90IHBvaW50IHRvIHNrYi4KKyAqLworCitpbnQgaXBfb3B0aW9uc19lY2hvKHN0cnVjdCBpcF9vcHRpb25zICogZG9wdCwgc3RydWN0IHNrX2J1ZmYgKiBza2IpIAoreworCXN0cnVjdCBpcF9vcHRpb25zICpzb3B0OworCXVuc2lnbmVkIGNoYXIgKnNwdHIsICpkcHRyOworCWludCBzb2Zmc2V0LCBkb2Zmc2V0OworCWludAlvcHRsZW47CisJdTMyCWRhZGRyOworCisJbWVtc2V0KGRvcHQsIDAsIHNpemVvZihzdHJ1Y3QgaXBfb3B0aW9ucykpOworCisJZG9wdC0+aXNfZGF0YSA9IDE7CisKKwlzb3B0ID0gJihJUENCKHNrYiktPm9wdCk7CisKKwlpZiAoc29wdC0+b3B0bGVuID09IDApIHsKKwkJZG9wdC0+b3B0bGVuID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJc3B0ciA9IHNrYi0+bmgucmF3OworCWRwdHIgPSBkb3B0LT5fX2RhdGE7CisKKwlpZiAoc2tiLT5kc3QpCisJCWRhZGRyID0gKChzdHJ1Y3QgcnRhYmxlKilza2ItPmRzdCktPnJ0X3NwZWNfZHN0OworCWVsc2UKKwkJZGFkZHIgPSBza2ItPm5oLmlwaC0+ZGFkZHI7CisKKwlpZiAoc29wdC0+cnIpIHsKKwkJb3B0bGVuICA9IHNwdHJbc29wdC0+cnIrMV07CisJCXNvZmZzZXQgPSBzcHRyW3NvcHQtPnJyKzJdOworCQlkb3B0LT5yciA9IGRvcHQtPm9wdGxlbiArIHNpemVvZihzdHJ1Y3QgaXBoZHIpOworCQltZW1jcHkoZHB0ciwgc3B0citzb3B0LT5yciwgb3B0bGVuKTsKKwkJaWYgKHNvcHQtPnJyX25lZWRhZGRyICYmIHNvZmZzZXQgPD0gb3B0bGVuKSB7CisJCQlpZiAoc29mZnNldCArIDMgPiBvcHRsZW4pCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlkcHRyWzJdID0gc29mZnNldCArIDQ7CisJCQlkb3B0LT5ycl9uZWVkYWRkciA9IDE7CisJCX0KKwkJZHB0ciArPSBvcHRsZW47CisJCWRvcHQtPm9wdGxlbiArPSBvcHRsZW47CisJfQorCWlmIChzb3B0LT50cykgeworCQlvcHRsZW4gPSBzcHRyW3NvcHQtPnRzKzFdOworCQlzb2Zmc2V0ID0gc3B0cltzb3B0LT50cysyXTsKKwkJZG9wdC0+dHMgPSBkb3B0LT5vcHRsZW4gKyBzaXplb2Yoc3RydWN0IGlwaGRyKTsKKwkJbWVtY3B5KGRwdHIsIHNwdHIrc29wdC0+dHMsIG9wdGxlbik7CisJCWlmIChzb2Zmc2V0IDw9IG9wdGxlbikgeworCQkJaWYgKHNvcHQtPnRzX25lZWRhZGRyKSB7CisJCQkJaWYgKHNvZmZzZXQgKyAzID4gb3B0bGVuKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlkb3B0LT50c19uZWVkYWRkciA9IDE7CisJCQkJc29mZnNldCArPSA0OworCQkJfQorCQkJaWYgKHNvcHQtPnRzX25lZWR0aW1lKSB7CisJCQkJaWYgKHNvZmZzZXQgKyAzID4gb3B0bGVuKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlpZiAoKGRwdHJbM10mMHhGKSAhPSBJUE9QVF9UU19QUkVTUEVDKSB7CisJCQkJCWRvcHQtPnRzX25lZWR0aW1lID0gMTsKKwkJCQkJc29mZnNldCArPSA0OworCQkJCX0gZWxzZSB7CisJCQkJCWRvcHQtPnRzX25lZWR0aW1lID0gMDsKKworCQkJCQlpZiAoc29mZnNldCArIDggPD0gb3B0bGVuKSB7CisJCQkJCQlfX3UzMiBhZGRyOworCisJCQkJCQltZW1jcHkoJmFkZHIsIHNwdHIrc29mZnNldC0xLCA0KTsKKwkJCQkJCWlmIChpbmV0X2FkZHJfdHlwZShhZGRyKSAhPSBSVE5fTE9DQUwpIHsKKwkJCQkJCQlkb3B0LT50c19uZWVkdGltZSA9IDE7CisJCQkJCQkJc29mZnNldCArPSA4OworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZHB0clsyXSA9IHNvZmZzZXQ7CisJCX0KKwkJZHB0ciArPSBvcHRsZW47CisJCWRvcHQtPm9wdGxlbiArPSBvcHRsZW47CisJfQorCWlmIChzb3B0LT5zcnIpIHsKKwkJdW5zaWduZWQgY2hhciAqIHN0YXJ0ID0gc3B0citzb3B0LT5zcnI7CisJCXUzMiBmYWRkcjsKKworCQlvcHRsZW4gID0gc3RhcnRbMV07CisJCXNvZmZzZXQgPSBzdGFydFsyXTsKKwkJZG9mZnNldCA9IDA7CisJCWlmIChzb2Zmc2V0ID4gb3B0bGVuKQorCQkJc29mZnNldCA9IG9wdGxlbiArIDE7CisJCXNvZmZzZXQgLT0gNDsKKwkJaWYgKHNvZmZzZXQgPiAzKSB7CisJCQltZW1jcHkoJmZhZGRyLCAmc3RhcnRbc29mZnNldC0xXSwgNCk7CisJCQlmb3IgKHNvZmZzZXQtPTQsIGRvZmZzZXQ9NDsgc29mZnNldCA+IDM7IHNvZmZzZXQtPTQsIGRvZmZzZXQrPTQpCisJCQkJbWVtY3B5KCZkcHRyW2RvZmZzZXQtMV0sICZzdGFydFtzb2Zmc2V0LTFdLCA0KTsKKwkJCS8qCisJCQkgKiBSRkMxODEyIHJlcXVpcmVzIHRvIGZpeCBpbGxlZ2FsIHNvdXJjZSByb3V0ZXMuCisJCQkgKi8KKwkJCWlmIChtZW1jbXAoJnNrYi0+bmguaXBoLT5zYWRkciwgJnN0YXJ0W3NvZmZzZXQrM10sIDQpID09IDApCisJCQkJZG9mZnNldCAtPSA0OworCQl9CisJCWlmIChkb2Zmc2V0ID4gMykgeworCQkJbWVtY3B5KCZzdGFydFtkb2Zmc2V0LTFdLCAmZGFkZHIsIDQpOworCQkJZG9wdC0+ZmFkZHIgPSBmYWRkcjsKKwkJCWRwdHJbMF0gPSBzdGFydFswXTsKKwkJCWRwdHJbMV0gPSBkb2Zmc2V0KzM7CisJCQlkcHRyWzJdID0gNDsKKwkJCWRwdHIgKz0gZG9mZnNldCszOworCQkJZG9wdC0+c3JyID0gZG9wdC0+b3B0bGVuICsgc2l6ZW9mKHN0cnVjdCBpcGhkcik7CisJCQlkb3B0LT5vcHRsZW4gKz0gZG9mZnNldCszOworCQkJZG9wdC0+aXNfc3RyaWN0cm91dGUgPSBzb3B0LT5pc19zdHJpY3Ryb3V0ZTsKKwkJfQorCX0KKwl3aGlsZSAoZG9wdC0+b3B0bGVuICYgMykgeworCQkqZHB0cisrID0gSVBPUFRfRU5EOworCQlkb3B0LT5vcHRsZW4rKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglPcHRpb25zICJmcmFnbWVudGluZyIsIGp1c3QgZmlsbCBvcHRpb25zIG5vdAorICoJYWxsb3dlZCBpbiBmcmFnbWVudHMgd2l0aCBOT09Qcy4KKyAqCVNpbXBsZSBhbmQgc3R1cGlkIDgpLCBidXQgdGhlIG1vc3QgZWZmaWNpZW50IHdheS4KKyAqLworCit2b2lkIGlwX29wdGlvbnNfZnJhZ21lbnQoc3RydWN0IHNrX2J1ZmYgKiBza2IpIAoreworCXVuc2lnbmVkIGNoYXIgKiBvcHRwdHIgPSBza2ItPm5oLnJhdzsKKwlzdHJ1Y3QgaXBfb3B0aW9ucyAqIG9wdCA9ICYoSVBDQihza2IpLT5vcHQpOworCWludCAgbCA9IG9wdC0+b3B0bGVuOworCWludCAgb3B0bGVuOworCisJd2hpbGUgKGwgPiAwKSB7CisJCXN3aXRjaCAoKm9wdHB0cikgeworCQljYXNlIElQT1BUX0VORDoKKwkJCXJldHVybjsKKwkJY2FzZSBJUE9QVF9OT09QOgorCQkJbC0tOworCQkJb3B0cHRyKys7CisJCQljb250aW51ZTsKKwkJfQorCQlvcHRsZW4gPSBvcHRwdHJbMV07CisJCWlmIChvcHRsZW48MiB8fCBvcHRsZW4+bCkKKwkJICByZXR1cm47CisJCWlmICghSVBPUFRfQ09QSUVEKCpvcHRwdHIpKQorCQkJbWVtc2V0KG9wdHB0ciwgSVBPUFRfTk9PUCwgb3B0bGVuKTsKKwkJbCAtPSBvcHRsZW47CisJCW9wdHB0ciArPSBvcHRsZW47CisJfQorCW9wdC0+dHMgPSAwOworCW9wdC0+cnIgPSAwOworCW9wdC0+cnJfbmVlZGFkZHIgPSAwOworCW9wdC0+dHNfbmVlZGFkZHIgPSAwOworCW9wdC0+dHNfbmVlZHRpbWUgPSAwOworCXJldHVybjsKK30KKworLyoKKyAqIFZlcmlmeSBvcHRpb25zIGFuZCBmaWxsIHBvaW50ZXJzIGluIHN0cnVjdCBvcHRpb25zLgorICogQ2FsbGVyIHNob3VsZCBjbGVhciAqb3B0LCBhbmQgc2V0IG9wdC0+ZGF0YS4KKyAqIElmIG9wdCA9PSBOVUxMLCB0aGVuIHNrYi0+ZGF0YSBzaG91bGQgcG9pbnQgdG8gSVAgaGVhZGVyLgorICovCisKK2ludCBpcF9vcHRpb25zX2NvbXBpbGUoc3RydWN0IGlwX29wdGlvbnMgKiBvcHQsIHN0cnVjdCBza19idWZmICogc2tiKQoreworCWludCBsOworCXVuc2lnbmVkIGNoYXIgKiBpcGg7CisJdW5zaWduZWQgY2hhciAqIG9wdHB0cjsKKwlpbnQgb3B0bGVuOworCXVuc2lnbmVkIGNoYXIgKiBwcF9wdHIgPSBOVUxMOworCXN0cnVjdCBydGFibGUgKnJ0ID0gc2tiID8gKHN0cnVjdCBydGFibGUqKXNrYi0+ZHN0IDogTlVMTDsKKworCWlmICghb3B0KSB7CisJCW9wdCA9ICYoSVBDQihza2IpLT5vcHQpOworCQltZW1zZXQob3B0LCAwLCBzaXplb2Yoc3RydWN0IGlwX29wdGlvbnMpKTsKKwkJaXBoID0gc2tiLT5uaC5yYXc7CisJCW9wdC0+b3B0bGVuID0gKChzdHJ1Y3QgaXBoZHIgKilpcGgpLT5paGwqNCAtIHNpemVvZihzdHJ1Y3QgaXBoZHIpOworCQlvcHRwdHIgPSBpcGggKyBzaXplb2Yoc3RydWN0IGlwaGRyKTsKKwkJb3B0LT5pc19kYXRhID0gMDsKKwl9IGVsc2UgeworCQlvcHRwdHIgPSBvcHQtPmlzX2RhdGEgPyBvcHQtPl9fZGF0YSA6ICh1bnNpZ25lZCBjaGFyKikmKHNrYi0+bmguaXBoWzFdKTsKKwkJaXBoID0gb3B0cHRyIC0gc2l6ZW9mKHN0cnVjdCBpcGhkcik7CisJfQorCisJZm9yIChsID0gb3B0LT5vcHRsZW47IGwgPiAwOyApIHsKKwkJc3dpdGNoICgqb3B0cHRyKSB7CisJCSAgICAgIGNhc2UgSVBPUFRfRU5EOgorCQkJZm9yIChvcHRwdHIrKywgbC0tOyBsPjA7IG9wdHB0cisrLCBsLS0pIHsKKwkJCQlpZiAoKm9wdHB0ciAhPSBJUE9QVF9FTkQpIHsKKwkJCQkJKm9wdHB0ciA9IElQT1BUX0VORDsKKwkJCQkJb3B0LT5pc19jaGFuZ2VkID0gMTsKKwkJCQl9CisJCQl9CisJCQlnb3RvIGVvbDsKKwkJICAgICAgY2FzZSBJUE9QVF9OT09QOgorCQkJbC0tOworCQkJb3B0cHRyKys7CisJCQljb250aW51ZTsKKwkJfQorCQlvcHRsZW4gPSBvcHRwdHJbMV07CisJCWlmIChvcHRsZW48MiB8fCBvcHRsZW4+bCkgeworCQkJcHBfcHRyID0gb3B0cHRyOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlzd2l0Y2ggKCpvcHRwdHIpIHsKKwkJICAgICAgY2FzZSBJUE9QVF9TU1JSOgorCQkgICAgICBjYXNlIElQT1BUX0xTUlI6CisJCQlpZiAob3B0bGVuIDwgMykgeworCQkJCXBwX3B0ciA9IG9wdHB0ciArIDE7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCWlmIChvcHRwdHJbMl0gPCA0KSB7CisJCQkJcHBfcHRyID0gb3B0cHRyICsgMjsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQkJLyogTkI6IGNmIFJGQy0xODEyIDUuMi40LjEgKi8KKwkJCWlmIChvcHQtPnNycikgeworCQkJCXBwX3B0ciA9IG9wdHB0cjsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQkJaWYgKCFza2IpIHsKKwkJCQlpZiAob3B0cHRyWzJdICE9IDQgfHwgb3B0bGVuIDwgNyB8fCAoKG9wdGxlbi0zKSAmIDMpKSB7CisJCQkJCXBwX3B0ciA9IG9wdHB0ciArIDE7CisJCQkJCWdvdG8gZXJyb3I7CisJCQkJfQorCQkJCW1lbWNweSgmb3B0LT5mYWRkciwgJm9wdHB0clszXSwgNCk7CisJCQkJaWYgKG9wdGxlbiA+IDcpCisJCQkJCW1lbW1vdmUoJm9wdHB0clszXSwgJm9wdHB0cls3XSwgb3B0bGVuLTcpOworCQkJfQorCQkJb3B0LT5pc19zdHJpY3Ryb3V0ZSA9IChvcHRwdHJbMF0gPT0gSVBPUFRfU1NSUik7CisJCQlvcHQtPnNyciA9IG9wdHB0ciAtIGlwaDsKKwkJCWJyZWFrOworCQkgICAgICBjYXNlIElQT1BUX1JSOgorCQkJaWYgKG9wdC0+cnIpIHsKKwkJCQlwcF9wdHIgPSBvcHRwdHI7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCWlmIChvcHRsZW4gPCAzKSB7CisJCQkJcHBfcHRyID0gb3B0cHRyICsgMTsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQkJaWYgKG9wdHB0clsyXSA8IDQpIHsKKwkJCQlwcF9wdHIgPSBvcHRwdHIgKyAyOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCQlpZiAob3B0cHRyWzJdIDw9IG9wdGxlbikgeworCQkJCWlmIChvcHRwdHJbMl0rMyA+IG9wdGxlbikgeworCQkJCQlwcF9wdHIgPSBvcHRwdHIgKyAyOworCQkJCQlnb3RvIGVycm9yOworCQkJCX0KKwkJCQlpZiAoc2tiKSB7CisJCQkJCW1lbWNweSgmb3B0cHRyW29wdHB0clsyXS0xXSwgJnJ0LT5ydF9zcGVjX2RzdCwgNCk7CisJCQkJCW9wdC0+aXNfY2hhbmdlZCA9IDE7CisJCQkJfQorCQkJCW9wdHB0clsyXSArPSA0OworCQkJCW9wdC0+cnJfbmVlZGFkZHIgPSAxOworCQkJfQorCQkJb3B0LT5yciA9IG9wdHB0ciAtIGlwaDsKKwkJCWJyZWFrOworCQkgICAgICBjYXNlIElQT1BUX1RJTUVTVEFNUDoKKwkJCWlmIChvcHQtPnRzKSB7CisJCQkJcHBfcHRyID0gb3B0cHRyOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCQlpZiAob3B0bGVuIDwgNCkgeworCQkJCXBwX3B0ciA9IG9wdHB0ciArIDE7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCWlmIChvcHRwdHJbMl0gPCA1KSB7CisJCQkJcHBfcHRyID0gb3B0cHRyICsgMjsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQkJaWYgKG9wdHB0clsyXSA8PSBvcHRsZW4pIHsKKwkJCQlfX3UzMiAqIHRpbWVwdHIgPSBOVUxMOworCQkJCWlmIChvcHRwdHJbMl0rMyA+IG9wdHB0clsxXSkgeworCQkJCQlwcF9wdHIgPSBvcHRwdHIgKyAyOworCQkJCQlnb3RvIGVycm9yOworCQkJCX0KKwkJCQlzd2l0Y2ggKG9wdHB0clszXSYweEYpIHsKKwkJCQkgICAgICBjYXNlIElQT1BUX1RTX1RTT05MWToKKwkJCQkJb3B0LT50cyA9IG9wdHB0ciAtIGlwaDsKKwkJCQkJaWYgKHNrYikgCisJCQkJCQl0aW1lcHRyID0gKF9fdTMyKikmb3B0cHRyW29wdHB0clsyXS0xXTsKKwkJCQkJb3B0LT50c19uZWVkdGltZSA9IDE7CisJCQkJCW9wdHB0clsyXSArPSA0OworCQkJCQlicmVhazsKKwkJCQkgICAgICBjYXNlIElQT1BUX1RTX1RTQU5EQUREUjoKKwkJCQkJaWYgKG9wdHB0clsyXSs3ID4gb3B0cHRyWzFdKSB7CisJCQkJCQlwcF9wdHIgPSBvcHRwdHIgKyAyOworCQkJCQkJZ290byBlcnJvcjsKKwkJCQkJfQorCQkJCQlvcHQtPnRzID0gb3B0cHRyIC0gaXBoOworCQkJCQlpZiAoc2tiKSB7CisJCQkJCQltZW1jcHkoJm9wdHB0cltvcHRwdHJbMl0tMV0sICZydC0+cnRfc3BlY19kc3QsIDQpOworCQkJCQkJdGltZXB0ciA9IChfX3UzMiopJm9wdHB0cltvcHRwdHJbMl0rM107CisJCQkJCX0KKwkJCQkJb3B0LT50c19uZWVkYWRkciA9IDE7CisJCQkJCW9wdC0+dHNfbmVlZHRpbWUgPSAxOworCQkJCQlvcHRwdHJbMl0gKz0gODsKKwkJCQkJYnJlYWs7CisJCQkJICAgICAgY2FzZSBJUE9QVF9UU19QUkVTUEVDOgorCQkJCQlpZiAob3B0cHRyWzJdKzcgPiBvcHRwdHJbMV0pIHsKKwkJCQkJCXBwX3B0ciA9IG9wdHB0ciArIDI7CisJCQkJCQlnb3RvIGVycm9yOworCQkJCQl9CisJCQkJCW9wdC0+dHMgPSBvcHRwdHIgLSBpcGg7CisJCQkJCXsKKwkJCQkJCXUzMiBhZGRyOworCQkJCQkJbWVtY3B5KCZhZGRyLCAmb3B0cHRyW29wdHB0clsyXS0xXSwgNCk7CisJCQkJCQlpZiAoaW5ldF9hZGRyX3R5cGUoYWRkcikgPT0gUlROX1VOSUNBU1QpCisJCQkJCQkJYnJlYWs7CisJCQkJCQlpZiAoc2tiKQorCQkJCQkJCXRpbWVwdHIgPSAoX191MzIqKSZvcHRwdHJbb3B0cHRyWzJdKzNdOworCQkJCQl9CisJCQkJCW9wdC0+dHNfbmVlZHRpbWUgPSAxOworCQkJCQlvcHRwdHJbMl0gKz0gODsKKwkJCQkJYnJlYWs7CisJCQkJICAgICAgZGVmYXVsdDoKKwkJCQkJaWYgKCFza2IgJiYgIWNhcGFibGUoQ0FQX05FVF9SQVcpKSB7CisJCQkJCQlwcF9wdHIgPSBvcHRwdHIgKyAzOworCQkJCQkJZ290byBlcnJvcjsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKHRpbWVwdHIpIHsKKwkJCQkJc3RydWN0IHRpbWV2YWwgdHY7CisJCQkJCV9fdTMyICBtaWR0aW1lOworCQkJCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwkJCQkJbWlkdGltZSA9IGh0b25sKCh0di50dl9zZWMgJSA4NjQwMCkgKiAxMDAwICsgdHYudHZfdXNlYyAvIDEwMDApOworCQkJCQltZW1jcHkodGltZXB0ciwgJm1pZHRpbWUsIHNpemVvZihfX3UzMikpOworCQkJCQlvcHQtPmlzX2NoYW5nZWQgPSAxOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJdW5zaWduZWQgb3ZlcmZsb3cgPSBvcHRwdHJbM10+PjQ7CisJCQkJaWYgKG92ZXJmbG93ID09IDE1KSB7CisJCQkJCXBwX3B0ciA9IG9wdHB0ciArIDM7CisJCQkJCWdvdG8gZXJyb3I7CisJCQkJfQorCQkJCW9wdC0+dHMgPSBvcHRwdHIgLSBpcGg7CisJCQkJaWYgKHNrYikgeworCQkJCQlvcHRwdHJbM10gPSAob3B0cHRyWzNdJjB4Ril8KChvdmVyZmxvdysxKTw8NCk7CisJCQkJCW9wdC0+aXNfY2hhbmdlZCA9IDE7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCSAgICAgIGNhc2UgSVBPUFRfUkE6CisJCQlpZiAob3B0bGVuIDwgNCkgeworCQkJCXBwX3B0ciA9IG9wdHB0ciArIDE7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCWlmIChvcHRwdHJbMl0gPT0gMCAmJiBvcHRwdHJbM10gPT0gMCkKKwkJCQlvcHQtPnJvdXRlcl9hbGVydCA9IG9wdHB0ciAtIGlwaDsKKwkJCWJyZWFrOworCQkgICAgICBjYXNlIElQT1BUX1NFQzoKKwkJICAgICAgY2FzZSBJUE9QVF9TSUQ6CisJCSAgICAgIGRlZmF1bHQ6CisJCQlpZiAoIXNrYiAmJiAhY2FwYWJsZShDQVBfTkVUX1JBVykpIHsKKwkJCQlwcF9wdHIgPSBvcHRwdHI7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWwgLT0gb3B0bGVuOworCQlvcHRwdHIgKz0gb3B0bGVuOworCX0KKworZW9sOgorCWlmICghcHBfcHRyKQorCQlyZXR1cm4gMDsKKworZXJyb3I6CisJaWYgKHNrYikgeworCQlpY21wX3NlbmQoc2tiLCBJQ01QX1BBUkFNRVRFUlBST0IsIDAsIGh0b25sKChwcF9wdHItaXBoKTw8MjQpKTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKworLyoKKyAqCVVuZG8gYWxsIHRoZSBjaGFuZ2VzIGRvbmUgYnkgaXBfb3B0aW9uc19jb21waWxlKCkuCisgKi8KKwordm9pZCBpcF9vcHRpb25zX3VuZG8oc3RydWN0IGlwX29wdGlvbnMgKiBvcHQpCit7CisJaWYgKG9wdC0+c3JyKSB7CisJCXVuc2lnbmVkICBjaGFyICogb3B0cHRyID0gb3B0LT5fX2RhdGErb3B0LT5zcnItc2l6ZW9mKHN0cnVjdCAgaXBoZHIpOworCQltZW1tb3ZlKG9wdHB0cis3LCBvcHRwdHIrMywgb3B0cHRyWzFdLTcpOworCQltZW1jcHkob3B0cHRyKzMsICZvcHQtPmZhZGRyLCA0KTsKKwl9CisJaWYgKG9wdC0+cnJfbmVlZGFkZHIpIHsKKwkJdW5zaWduZWQgIGNoYXIgKiBvcHRwdHIgPSBvcHQtPl9fZGF0YStvcHQtPnJyLXNpemVvZihzdHJ1Y3QgIGlwaGRyKTsKKwkJb3B0cHRyWzJdIC09IDQ7CisJCW1lbXNldCgmb3B0cHRyW29wdHB0clsyXS0xXSwgMCwgNCk7CisJfQorCWlmIChvcHQtPnRzKSB7CisJCXVuc2lnbmVkICBjaGFyICogb3B0cHRyID0gb3B0LT5fX2RhdGErb3B0LT50cy1zaXplb2Yoc3RydWN0ICBpcGhkcik7CisJCWlmIChvcHQtPnRzX25lZWR0aW1lKSB7CisJCQlvcHRwdHJbMl0gLT0gNDsKKwkJCW1lbXNldCgmb3B0cHRyW29wdHB0clsyXS0xXSwgMCwgNCk7CisJCQlpZiAoKG9wdHB0clszXSYweEYpID09IElQT1BUX1RTX1BSRVNQRUMpCisJCQkJb3B0cHRyWzJdIC09IDQ7CisJCX0KKwkJaWYgKG9wdC0+dHNfbmVlZGFkZHIpIHsKKwkJCW9wdHB0clsyXSAtPSA0OworCQkJbWVtc2V0KCZvcHRwdHJbb3B0cHRyWzJdLTFdLCAwLCA0KTsKKwkJfQorCX0KK30KKworaW50IGlwX29wdGlvbnNfZ2V0KHN0cnVjdCBpcF9vcHRpb25zICoqb3B0cCwgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IG9wdGxlbiwgaW50IHVzZXIpCit7CisJc3RydWN0IGlwX29wdGlvbnMgKm9wdDsKKworCW9wdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcF9vcHRpb25zKSsoKG9wdGxlbiszKSZ+MyksIEdGUF9LRVJORUwpOworCWlmICghb3B0KQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQob3B0LCAwLCBzaXplb2Yoc3RydWN0IGlwX29wdGlvbnMpKTsKKwlpZiAob3B0bGVuKSB7CisJCWlmICh1c2VyKSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIob3B0LT5fX2RhdGEsIGRhdGEsIG9wdGxlbikpIHsKKwkJCQlrZnJlZShvcHQpOworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQl9IGVsc2UKKwkJCW1lbWNweShvcHQtPl9fZGF0YSwgZGF0YSwgb3B0bGVuKTsKKwl9CisJd2hpbGUgKG9wdGxlbiAmIDMpCisJCW9wdC0+X19kYXRhW29wdGxlbisrXSA9IElQT1BUX0VORDsKKwlvcHQtPm9wdGxlbiA9IG9wdGxlbjsKKwlvcHQtPmlzX2RhdGEgPSAxOworCW9wdC0+aXNfc2V0Ynl1c2VyID0gMTsKKwlpZiAob3B0bGVuICYmIGlwX29wdGlvbnNfY29tcGlsZShvcHQsIE5VTEwpKSB7CisJCWtmcmVlKG9wdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoKm9wdHApCisJCWtmcmVlKCpvcHRwKTsKKwkqb3B0cCA9IG9wdDsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBpcF9mb3J3YXJkX29wdGlvbnMoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgICBpcF9vcHRpb25zICogb3B0CT0gJihJUENCKHNrYiktPm9wdCk7CisJdW5zaWduZWQgY2hhciAqIG9wdHB0cjsKKwlzdHJ1Y3QgcnRhYmxlICpydCA9IChzdHJ1Y3QgcnRhYmxlKilza2ItPmRzdDsKKwl1bnNpZ25lZCBjaGFyICpyYXcgPSBza2ItPm5oLnJhdzsKKworCWlmIChvcHQtPnJyX25lZWRhZGRyKSB7CisJCW9wdHB0ciA9ICh1bnNpZ25lZCBjaGFyICopcmF3ICsgb3B0LT5ycjsKKwkJaXBfcnRfZ2V0X3NvdXJjZSgmb3B0cHRyW29wdHB0clsyXS01XSwgcnQpOworCQlvcHQtPmlzX2NoYW5nZWQgPSAxOworCX0KKwlpZiAob3B0LT5zcnJfaXNfaGl0KSB7CisJCWludCBzcnJwdHIsIHNycnNwYWNlOworCisJCW9wdHB0ciA9IHJhdyArIG9wdC0+c3JyOworCisJCWZvciAoIHNycnB0cj1vcHRwdHJbMl0sIHNycnNwYWNlID0gb3B0cHRyWzFdOworCQkgICAgIHNycnB0ciA8PSBzcnJzcGFjZTsKKwkJICAgICBzcnJwdHIgKz0gNAorCQkgICAgICkgeworCQkJaWYgKHNycnB0ciArIDMgPiBzcnJzcGFjZSkKKwkJCQlicmVhazsKKwkJCWlmIChtZW1jbXAoJnJ0LT5ydF9kc3QsICZvcHRwdHJbc3JycHRyLTFdLCA0KSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChzcnJwdHIgKyAzIDw9IHNycnNwYWNlKSB7CisJCQlvcHQtPmlzX2NoYW5nZWQgPSAxOworCQkJaXBfcnRfZ2V0X3NvdXJjZSgmb3B0cHRyW3NycnB0ci0xXSwgcnQpOworCQkJc2tiLT5uaC5pcGgtPmRhZGRyID0gcnQtPnJ0X2RzdDsKKwkJCW9wdHB0clsyXSA9IHNycnB0cis0OworCQl9IGVsc2UgaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX0NSSVQgImlwX2ZvcndhcmQoKTogQXJnaCEgRGVzdGluYXRpb24gbG9zdCFcbiIpOworCQlpZiAob3B0LT50c19uZWVkYWRkcikgeworCQkJb3B0cHRyID0gcmF3ICsgb3B0LT50czsKKwkJCWlwX3J0X2dldF9zb3VyY2UoJm9wdHB0cltvcHRwdHJbMl0tOV0sIHJ0KTsKKwkJCW9wdC0+aXNfY2hhbmdlZCA9IDE7CisJCX0KKwl9CisJaWYgKG9wdC0+aXNfY2hhbmdlZCkgeworCQlvcHQtPmlzX2NoYW5nZWQgPSAwOworCQlpcF9zZW5kX2NoZWNrKHNrYi0+bmguaXBoKTsKKwl9Cit9CisKK2ludCBpcF9vcHRpb25zX3Jjdl9zcnIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXBfb3B0aW9ucyAqb3B0ID0gJihJUENCKHNrYiktPm9wdCk7CisJaW50IHNycnNwYWNlLCBzcnJwdHI7CisJdTMyIG5leHRob3A7CisJc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwl1bnNpZ25lZCBjaGFyICogb3B0cHRyID0gc2tiLT5uaC5yYXcgKyBvcHQtPnNycjsKKwlzdHJ1Y3QgcnRhYmxlICpydCA9IChzdHJ1Y3QgcnRhYmxlKilza2ItPmRzdDsKKwlzdHJ1Y3QgcnRhYmxlICpydDI7CisJaW50IGVycjsKKworCWlmICghb3B0LT5zcnIpCisJCXJldHVybiAwOworCisJaWYgKHNrYi0+cGt0X3R5cGUgIT0gUEFDS0VUX0hPU1QpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChydC0+cnRfdHlwZSA9PSBSVE5fVU5JQ0FTVCkgeworCQlpZiAoIW9wdC0+aXNfc3RyaWN0cm91dGUpCisJCQlyZXR1cm4gMDsKKwkJaWNtcF9zZW5kKHNrYiwgSUNNUF9QQVJBTUVURVJQUk9CLCAwLCBodG9ubCgxNjw8MjQpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChydC0+cnRfdHlwZSAhPSBSVE5fTE9DQUwpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChzcnJwdHI9b3B0cHRyWzJdLCBzcnJzcGFjZSA9IG9wdHB0clsxXTsgc3JycHRyIDw9IHNycnNwYWNlOyBzcnJwdHIgKz0gNCkgeworCQlpZiAoc3JycHRyICsgMyA+IHNycnNwYWNlKSB7CisJCQlpY21wX3NlbmQoc2tiLCBJQ01QX1BBUkFNRVRFUlBST0IsIDAsIGh0b25sKChvcHQtPnNycisyKTw8MjQpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCW1lbWNweSgmbmV4dGhvcCwgJm9wdHB0cltzcnJwdHItMV0sIDQpOworCisJCXJ0ID0gKHN0cnVjdCBydGFibGUqKXNrYi0+ZHN0OworCQlza2ItPmRzdCA9IE5VTEw7CisJCWVyciA9IGlwX3JvdXRlX2lucHV0KHNrYiwgbmV4dGhvcCwgaXBoLT5zYWRkciwgaXBoLT50b3MsIHNrYi0+ZGV2KTsKKwkJcnQyID0gKHN0cnVjdCBydGFibGUqKXNrYi0+ZHN0OworCQlpZiAoZXJyIHx8IChydDItPnJ0X3R5cGUgIT0gUlROX1VOSUNBU1QgJiYgcnQyLT5ydF90eXBlICE9IFJUTl9MT0NBTCkpIHsKKwkJCWlwX3J0X3B1dChydDIpOworCQkJc2tiLT5kc3QgPSAmcnQtPnUuZHN0OworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaXBfcnRfcHV0KHJ0KTsKKwkJaWYgKHJ0Mi0+cnRfdHlwZSAhPSBSVE5fTE9DQUwpCisJCQlicmVhazsKKwkJLyogU3VwZXJmYXN0IDgpIGxvb3BiYWNrIGZvcndhcmQgKi8KKwkJbWVtY3B5KCZpcGgtPmRhZGRyLCAmb3B0cHRyW3NycnB0ci0xXSwgNCk7CisJCW9wdC0+aXNfY2hhbmdlZCA9IDE7CisJfQorCWlmIChzcnJwdHIgPD0gc3Jyc3BhY2UpIHsKKwkJb3B0LT5zcnJfaXNfaGl0ID0gMTsKKwkJb3B0LT5pc19jaGFuZ2VkID0gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woaXBfb3B0aW9uc19jb21waWxlKTsKK0VYUE9SVF9TWU1CT0woaXBfb3B0aW9uc191bmRvKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX291dHB1dC5jIGIvbmV0L2lwdjQvaXBfb3V0cHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBhYjdiNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L2lwX291dHB1dC5jCkBAIC0wLDAgKzEsMTM1OSBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlUaGUgSW50ZXJuZXQgUHJvdG9jb2wgKElQKSBvdXRwdXQgbW9kdWxlLgorICoKKyAqIFZlcnNpb246CSRJZDogaXBfb3V0cHV0LmMsdiAxLjEwMCAyMDAyLzAyLzAxIDIyOjAxOjAzIGRhdmVtIEV4cCAkCisgKgorICogQXV0aG9yczoJUm9zcyBCaXJvLCA8YmlyN0BsZWxhbmQuU3RhbmZvcmQuRWR1PgorICoJCUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoJCURvbmFsZCBCZWNrZXIsIDxiZWNrZXJAc3VwZXIub3JnPgorICoJCUFsYW4gQ294LCA8QWxhbi5Db3hAbGludXgub3JnPgorICoJCVJpY2hhcmQgVW5kZXJ3b29kCisgKgkJU3RlZmFuIEJlY2tlciwgPHN0ZWZhbmJAeWVsbG8ucGluZy5kZT4KKyAqCQlKb3JnZSBDd2lrLCA8am9yZ2VAbGFzZXIuc2F0bGluay5uZXQ+CisgKgkJQXJudCBHdWxicmFuZHNlbiwgPGFndWxicmFAbnZnLnVuaXQubm8+CisgKgkJSGlyb2thenUgVGFrYWhhc2hpLCA8dGFrYUB2YWxpbnV4LmNvLmpwPgorICoKKyAqCVNlZSBpcF9pbnB1dC5jIGZvciBvcmlnaW5hbCBsb2cKKyAqCisgKglGaXhlczoKKyAqCQlBbGFuIENveAk6CU1pc3Npbmcgbm9uYmxvY2sgZmVhdHVyZSBpbiBpcF9idWlsZF94bWl0LgorICoJCU1pa2UgS2lsYnVybgk6CWh0b25zKCkgbWlzc2luZyBpbiBpcF9idWlsZF94bWl0LgorICoJCUJyYWRmb3JkIEpvaG5zb246CUZpeCBmYXVsdHkgaGFuZGxpbmcgb2Ygc29tZSBmcmFtZXMgd2hlbiAKKyAqCQkJCQlubyByb3V0ZSBpcyBmb3VuZC4KKyAqCQlBbGV4YW5kZXIgRGVtZW5zaGluOglNaXNzaW5nIHNrL3NrYiBmcmVlIGluIGlwX3F1ZXVlX3htaXQKKyAqCQkJCQkoaW4gY2FzZSBpZiBwYWNrZXQgbm90IGFjY2VwdGVkIGJ5CisgKgkJCQkJb3V0cHV0IGZpcmV3YWxsIHJ1bGVzKQorICoJCU1pa2UgTWNMYWdhbgk6CVJvdXRpbmcgYnkgc291cmNlCisgKgkJQWxleGV5IEt1em5ldHNvdjoJdXNlIG5ldyByb3V0ZSBjYWNoZQorICoJCUFuZGkgS2xlZW46CQlGaXggYnJva2VuIFBNVFUgcmVjb3ZlcnkgYW5kIHJlbW92ZQorICoJCQkJCXNvbWUgcmVkdW5kYW50IHRlc3RzLgorICoJVml0YWx5IEUuIExhdnJvdgk6CVRyYW5zcGFyZW50IHByb3h5IHJldml2ZWQgYWZ0ZXIgeWVhciBjb21hLgorICoJCUFuZGkgS2xlZW4JOiAJUmVwbGFjZSBpcF9yZXBseSB3aXRoIGlwX3NlbmRfcmVwbHkuCisgKgkJQW5kaSBLbGVlbgk6CVNwbGl0IGZhc3QgYW5kIHNsb3cgaXBfYnVpbGRfeG1pdCBwYXRoIAorICoJCQkJCWZvciBkZWNyZWFzZWQgcmVnaXN0ZXIgcHJlc3N1cmUgb24geDg2IAorICoJCQkJCWFuZCBtb3JlIHJlYWRpYmlsaXR5LiAKKyAqCQlNYXJjIEJvdWNoZXIJOglXaGVuIGNhbGxfb3V0X2ZpcmV3YWxsIHJldHVybnMgRldfUVVFVUUsCisgKgkJCQkJc2lsZW50bHkgZHJvcCBza2IgaW5zdGVhZCBvZiBmYWlsaW5nIHdpdGggLUVQRVJNLgorICoJCURldGxldiBXZW5nb3J6CToJQ29weSBwcm90b2NvbCBmb3IgZnJhZ21lbnRzLgorICoJCUhpcm9rYXp1IFRha2FoYXNoaToJSFcgY2hlY2tzdW1taW5nIGZvciBvdXRnb2luZyBVRFAKKyAqCQkJCQlkYXRhZ3JhbXMuCisgKgkJSGlyb2thenUgVGFrYWhhc2hpOglzZW5kZmlsZSgpIG9uIFVEUCB3b3JrcyBub3cuCisgKi8KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9zbm1wLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPG5ldC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKyNpbmNsdWRlIDxuZXQvaWNtcC5oPgorI2luY2x1ZGUgPG5ldC9yYXcuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxuZXQvaW5ldHBlZXIuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pZ21wLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlLmg+CisjaW5jbHVkZSA8bGludXgvbXJvdXRlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorCisvKgorICogICAgICBTaGFsbCB3ZSB0cnkgdG8gZGFtYWdlIG91dHB1dCBwYWNrZXRzIGlmIHJvdXRpbmcgZGV2IGNoYW5nZXM/CisgKi8KKworaW50IHN5c2N0bF9pcF9keW5hZGRyOworaW50IHN5c2N0bF9pcF9kZWZhdWx0X3R0bCA9IElQREVGVFRMOworCisvKiBHZW5lcmF0ZSBhIGNoZWNrc3VtIGZvciBhbiBvdXRnb2luZyBJUCBkYXRhZ3JhbS4gKi8KK19faW5saW5lX18gdm9pZCBpcF9zZW5kX2NoZWNrKHN0cnVjdCBpcGhkciAqaXBoKQoreworCWlwaC0+Y2hlY2sgPSAwOworCWlwaC0+Y2hlY2sgPSBpcF9mYXN0X2NzdW0oKHVuc2lnbmVkIGNoYXIgKilpcGgsIGlwaC0+aWhsKTsKK30KKworLyogZGV2X2xvb3BiYWNrX3htaXQgZm9yIHVzZSB3aXRoIG5ldGZpbHRlci4gKi8KK3N0YXRpYyBpbnQgaXBfZGV2X2xvb3BiYWNrX3htaXQoc3RydWN0IHNrX2J1ZmYgKm5ld3NrYikKK3sKKwluZXdza2ItPm1hYy5yYXcgPSBuZXdza2ItPmRhdGE7CisJX19za2JfcHVsbChuZXdza2IsIG5ld3NrYi0+bmgucmF3IC0gbmV3c2tiLT5kYXRhKTsKKwluZXdza2ItPnBrdF90eXBlID0gUEFDS0VUX0xPT1BCQUNLOworCW5ld3NrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJQlVHX1RSQVAobmV3c2tiLT5kc3QpOworCisjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRworCW5mX2RlYnVnX2lwX2xvb3BiYWNrX3htaXQobmV3c2tiKTsKKyNlbmRpZgorCW5ldGlmX3J4KG5ld3NrYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlwX3NlbGVjdF90dGwoc3RydWN0IGluZXRfc29jayAqaW5ldCwgc3RydWN0IGRzdF9lbnRyeSAqZHN0KQoreworCWludCB0dGwgPSBpbmV0LT51Y190dGw7CisKKwlpZiAodHRsIDwgMCkKKwkJdHRsID0gZHN0X21ldHJpYyhkc3QsIFJUQVhfSE9QTElNSVQpOworCXJldHVybiB0dGw7Cit9CisKKy8qIAorICoJCUFkZCBhbiBpcCBoZWFkZXIgdG8gYSBza2J1ZmYgYW5kIHNlbmQgaXQgb3V0LgorICoKKyAqLworaW50IGlwX2J1aWxkX2FuZF9zZW5kX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkgIHUzMiBzYWRkciwgdTMyIGRhZGRyLCBzdHJ1Y3QgaXBfb3B0aW9ucyAqb3B0KQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlzdHJ1Y3QgcnRhYmxlICpydCA9IChzdHJ1Y3QgcnRhYmxlICopc2tiLT5kc3Q7CisJc3RydWN0IGlwaGRyICppcGg7CisKKwkvKiBCdWlsZCB0aGUgSVAgaGVhZGVyLiAqLworCWlmIChvcHQpCisJCWlwaD0oc3RydWN0IGlwaGRyICopc2tiX3B1c2goc2tiLHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgb3B0LT5vcHRsZW4pOworCWVsc2UKKwkJaXBoPShzdHJ1Y3QgaXBoZHIgKilza2JfcHVzaChza2Isc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCisJaXBoLT52ZXJzaW9uICA9IDQ7CisJaXBoLT5paGwgICAgICA9IDU7CisJaXBoLT50b3MgICAgICA9IGluZXQtPnRvczsKKwlpZiAoaXBfZG9udF9mcmFnbWVudChzaywgJnJ0LT51LmRzdCkpCisJCWlwaC0+ZnJhZ19vZmYgPSBodG9ucyhJUF9ERik7CisJZWxzZQorCQlpcGgtPmZyYWdfb2ZmID0gMDsKKwlpcGgtPnR0bCAgICAgID0gaXBfc2VsZWN0X3R0bChpbmV0LCAmcnQtPnUuZHN0KTsKKwlpcGgtPmRhZGRyICAgID0gcnQtPnJ0X2RzdDsKKwlpcGgtPnNhZGRyICAgID0gcnQtPnJ0X3NyYzsKKwlpcGgtPnByb3RvY29sID0gc2stPnNrX3Byb3RvY29sOworCWlwaC0+dG90X2xlbiAgPSBodG9ucyhza2ItPmxlbik7CisJaXBfc2VsZWN0X2lkZW50KGlwaCwgJnJ0LT51LmRzdCwgc2spOworCXNrYi0+bmguaXBoICAgPSBpcGg7CisKKwlpZiAob3B0ICYmIG9wdC0+b3B0bGVuKSB7CisJCWlwaC0+aWhsICs9IG9wdC0+b3B0bGVuPj4yOworCQlpcF9vcHRpb25zX2J1aWxkKHNrYiwgb3B0LCBkYWRkciwgcnQsIDApOworCX0KKwlpcF9zZW5kX2NoZWNrKGlwaCk7CisKKwlza2ItPnByaW9yaXR5ID0gc2stPnNrX3ByaW9yaXR5OworCisJLyogU2VuZCBpdCBvdXQuICovCisJcmV0dXJuIE5GX0hPT0soUEZfSU5FVCwgTkZfSVBfTE9DQUxfT1VULCBza2IsIE5VTEwsIHJ0LT51LmRzdC5kZXYsCisJCSAgICAgICBkc3Rfb3V0cHV0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXBfZmluaXNoX291dHB1dDIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2ItPmRzdDsKKwlzdHJ1Y3QgaGhfY2FjaGUgKmhoID0gZHN0LT5oaDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHN0LT5kZXY7CisJaW50IGhoX2xlbiA9IExMX1JFU0VSVkVEX1NQQUNFKGRldik7CisKKwkvKiBCZSBwYXJhbm9pZCwgcmF0aGVyIHRoYW4gdG9vIGNsZXZlci4gKi8KKwlpZiAodW5saWtlbHkoc2tiX2hlYWRyb29tKHNrYikgPCBoaF9sZW4gJiYgZGV2LT5oYXJkX2hlYWRlcikpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjI7CisKKwkJc2tiMiA9IHNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSk7CisJCWlmIChza2IyID09IE5VTEwpIHsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJaWYgKHNrYi0+c2spCisJCQlza2Jfc2V0X293bmVyX3coc2tiMiwgc2tiLT5zayk7CisJCWtmcmVlX3NrYihza2IpOworCQlza2IgPSBza2IyOworCX0KKworI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKKwluZl9kZWJ1Z19pcF9maW5pc2hfb3V0cHV0Mihza2IpOworI2VuZGlmIC8qQ09ORklHX05FVEZJTFRFUl9ERUJVRyovCisKKwlpZiAoaGgpIHsKKwkJaW50IGhoX2FsZW47CisKKwkJcmVhZF9sb2NrX2JoKCZoaC0+aGhfbG9jayk7CisJCWhoX2FsZW4gPSBISF9EQVRBX0FMSUdOKGhoLT5oaF9sZW4pOworICAJCW1lbWNweShza2ItPmRhdGEgLSBoaF9hbGVuLCBoaC0+aGhfZGF0YSwgaGhfYWxlbik7CisJCXJlYWRfdW5sb2NrX2JoKCZoaC0+aGhfbG9jayk7CisJICAgICAgICBza2JfcHVzaChza2IsIGhoLT5oaF9sZW4pOworCQlyZXR1cm4gaGgtPmhoX291dHB1dChza2IpOworCX0gZWxzZSBpZiAoZHN0LT5uZWlnaGJvdXIpCisJCXJldHVybiBkc3QtPm5laWdoYm91ci0+b3V0cHV0KHNrYik7CisKKwlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiaXBfZmluaXNoX291dHB1dDI6IE5vIGhlYWRlciBjYWNoZSBhbmQgbm8gbmVpZ2hib3VyIVxuIik7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2ludCBpcF9maW5pc2hfb3V0cHV0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZHN0LT5kZXY7CisKKwlza2ItPmRldiA9IGRldjsKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOworCisJcmV0dXJuIE5GX0hPT0soUEZfSU5FVCwgTkZfSVBfUE9TVF9ST1VUSU5HLCBza2IsIE5VTEwsIGRldiwKKwkJICAgICAgIGlwX2ZpbmlzaF9vdXRwdXQyKTsKK30KKworaW50IGlwX21jX291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNrYi0+c2s7CisJc3RydWN0IHJ0YWJsZSAqcnQgPSAoc3RydWN0IHJ0YWJsZSopc2tiLT5kc3Q7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHJ0LT51LmRzdC5kZXY7CisKKwkvKgorCSAqCUlmIHRoZSBpbmRpY2F0ZWQgaW50ZXJmYWNlIGlzIHVwIGFuZCBydW5uaW5nLCBzZW5kIHRoZSBwYWNrZXQuCisJICovCisJSVBfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsKKworCXNrYi0+ZGV2ID0gZGV2OworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisKKwkvKgorCSAqCU11bHRpY2FzdHMgYXJlIGxvb3BlZCBiYWNrIGZvciBvdGhlciBsb2NhbCB1c2VycworCSAqLworCisJaWYgKHJ0LT5ydF9mbGFncyZSVENGX01VTFRJQ0FTVCkgeworCQlpZiAoKCFzayB8fCBpbmV0X3NrKHNrKS0+bWNfbG9vcCkKKyNpZmRlZiBDT05GSUdfSVBfTVJPVVRFCisJCS8qIFNtYWxsIG9wdGltaXphdGlvbjogZG8gbm90IGxvb3BiYWNrIG5vdCBsb2NhbCBmcmFtZXMsCisJCSAgIHdoaWNoIHJldHVybmVkIGFmdGVyIGZvcndhcmRpbmc7IHRoZXkgd2lsbCBiZSAgZHJvcHBlZAorCQkgICBieSBpcF9tcl9pbnB1dCBpbiBhbnkgY2FzZS4KKwkJICAgTm90ZSwgdGhhdCBsb2NhbCBmcmFtZXMgYXJlIGxvb3BlZCBiYWNrIHRvIGJlIGRlbGl2ZXJlZAorCQkgICB0byBsb2NhbCByZWNpcGllbnRzLgorCisJCSAgIFRoaXMgY2hlY2sgaXMgZHVwbGljYXRlZCBpbiBpcF9tcl9pbnB1dCBhdCB0aGUgbW9tZW50LgorCQkgKi8KKwkJICAgICYmICgocnQtPnJ0X2ZsYWdzJlJUQ0ZfTE9DQUwpIHx8ICEoSVBDQihza2IpLT5mbGFncyZJUFNLQl9GT1JXQVJERUQpKQorI2VuZGlmCisJCSkgeworCQkJc3RydWN0IHNrX2J1ZmYgKm5ld3NrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCQkJaWYgKG5ld3NrYikKKwkJCQlORl9IT09LKFBGX0lORVQsIE5GX0lQX1BPU1RfUk9VVElORywgbmV3c2tiLCBOVUxMLAorCQkJCQluZXdza2ItPmRldiwgCisJCQkJCWlwX2Rldl9sb29wYmFja194bWl0KTsKKwkJfQorCisJCS8qIE11bHRpY2FzdHMgd2l0aCB0dGwgMCBtdXN0IG5vdCBnbyBiZXlvbmQgdGhlIGhvc3QgKi8KKworCQlpZiAoc2tiLT5uaC5pcGgtPnR0bCA9PSAwKSB7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKHJ0LT5ydF9mbGFncyZSVENGX0JST0FEQ0FTVCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3c2tiID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJCWlmIChuZXdza2IpCisJCQlORl9IT09LKFBGX0lORVQsIE5GX0lQX1BPU1RfUk9VVElORywgbmV3c2tiLCBOVUxMLAorCQkJCW5ld3NrYi0+ZGV2LCBpcF9kZXZfbG9vcGJhY2tfeG1pdCk7CisJfQorCisJaWYgKHNrYi0+bGVuID4gZHN0X210dSgmcnQtPnUuZHN0KSkKKwkJcmV0dXJuIGlwX2ZyYWdtZW50KHNrYiwgaXBfZmluaXNoX291dHB1dCk7CisJZWxzZQorCQlyZXR1cm4gaXBfZmluaXNoX291dHB1dChza2IpOworfQorCitpbnQgaXBfb3V0cHV0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJSVBfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsKKworCWlmIChza2ItPmxlbiA+IGRzdF9tdHUoc2tiLT5kc3QpICYmICFza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplKQorCQlyZXR1cm4gaXBfZnJhZ21lbnQoc2tiLCBpcF9maW5pc2hfb3V0cHV0KTsKKwllbHNlCisJCXJldHVybiBpcF9maW5pc2hfb3V0cHV0KHNrYik7Cit9CisKK2ludCBpcF9xdWV1ZV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIGludCBpcGZyYWdvaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBza2ItPnNrOworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlzdHJ1Y3QgaXBfb3B0aW9ucyAqb3B0ID0gaW5ldC0+b3B0OworCXN0cnVjdCBydGFibGUgKnJ0OworCXN0cnVjdCBpcGhkciAqaXBoOworCisJLyogU2tpcCBhbGwgb2YgdGhpcyBpZiB0aGUgcGFja2V0IGlzIGFscmVhZHkgcm91dGVkLAorCSAqIGYuZS4gYnkgc29tZXRoaW5nIGxpa2UgU0NUUC4KKwkgKi8KKwlydCA9IChzdHJ1Y3QgcnRhYmxlICopIHNrYi0+ZHN0OworCWlmIChydCAhPSBOVUxMKQorCQlnb3RvIHBhY2tldF9yb3V0ZWQ7CisKKwkvKiBNYWtlIHN1cmUgd2UgY2FuIHJvdXRlIHRoaXMgcGFja2V0LiAqLworCXJ0ID0gKHN0cnVjdCBydGFibGUgKilfX3NrX2RzdF9jaGVjayhzaywgMCk7CisJaWYgKHJ0ID09IE5VTEwpIHsKKwkJdTMyIGRhZGRyOworCisJCS8qIFVzZSBjb3JyZWN0IGRlc3RpbmF0aW9uIGFkZHJlc3MgaWYgd2UgaGF2ZSBvcHRpb25zLiAqLworCQlkYWRkciA9IGluZXQtPmRhZGRyOworCQlpZihvcHQgJiYgb3B0LT5zcnIpCisJCQlkYWRkciA9IG9wdC0+ZmFkZHI7CisKKwkJeworCQkJc3RydWN0IGZsb3dpIGZsID0geyAub2lmID0gc2stPnNrX2JvdW5kX2Rldl9pZiwKKwkJCQkJICAgIC5ubF91ID0geyAuaXA0X3UgPQorCQkJCQkJICAgICAgeyAuZGFkZHIgPSBkYWRkciwKKwkJCQkJCQkuc2FkZHIgPSBpbmV0LT5zYWRkciwKKwkJCQkJCQkudG9zID0gUlRfQ09OTl9GTEFHUyhzaykgfSB9LAorCQkJCQkgICAgLnByb3RvID0gc2stPnNrX3Byb3RvY29sLAorCQkJCQkgICAgLnVsaV91ID0geyAucG9ydHMgPQorCQkJCQkJICAgICAgIHsgLnNwb3J0ID0gaW5ldC0+c3BvcnQsCisJCQkJCQkJIC5kcG9ydCA9IGluZXQtPmRwb3J0IH0gfSB9OworCisJCQkvKiBJZiB0aGlzIGZhaWxzLCByZXRyYW5zbWl0IG1lY2hhbmlzbSBvZiB0cmFuc3BvcnQgbGF5ZXIgd2lsbAorCQkJICoga2VlcCB0cnlpbmcgdW50aWwgcm91dGUgYXBwZWFycyBvciB0aGUgY29ubmVjdGlvbiB0aW1lcworCQkJICogaXRzZWxmIG91dC4KKwkJCSAqLworCQkJaWYgKGlwX3JvdXRlX291dHB1dF9mbG93KCZydCwgJmZsLCBzaywgMCkpCisJCQkJZ290byBub19yb3V0ZTsKKwkJfQorCQlfX3NrX2RzdF9zZXQoc2ssICZydC0+dS5kc3QpOworCQl0Y3BfdjRfc2V0dXBfY2FwcyhzaywgJnJ0LT51LmRzdCk7CisJfQorCXNrYi0+ZHN0ID0gZHN0X2Nsb25lKCZydC0+dS5kc3QpOworCitwYWNrZXRfcm91dGVkOgorCWlmIChvcHQgJiYgb3B0LT5pc19zdHJpY3Ryb3V0ZSAmJiBydC0+cnRfZHN0ICE9IHJ0LT5ydF9nYXRld2F5KQorCQlnb3RvIG5vX3JvdXRlOworCisJLyogT0ssIHdlIGtub3cgd2hlcmUgdG8gc2VuZCBpdCwgYWxsb2NhdGUgYW5kIGJ1aWxkIElQIGhlYWRlci4gKi8KKwlpcGggPSAoc3RydWN0IGlwaGRyICopIHNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyAob3B0ID8gb3B0LT5vcHRsZW4gOiAwKSk7CisJKigoX191MTYgKilpcGgpCT0gaHRvbnMoKDQgPDwgMTIpIHwgKDUgPDwgOCkgfCAoaW5ldC0+dG9zICYgMHhmZikpOworCWlwaC0+dG90X2xlbiA9IGh0b25zKHNrYi0+bGVuKTsKKwlpZiAoaXBfZG9udF9mcmFnbWVudChzaywgJnJ0LT51LmRzdCkgJiYgIWlwZnJhZ29rKQorCQlpcGgtPmZyYWdfb2ZmID0gaHRvbnMoSVBfREYpOworCWVsc2UKKwkJaXBoLT5mcmFnX29mZiA9IDA7CisJaXBoLT50dGwgICAgICA9IGlwX3NlbGVjdF90dGwoaW5ldCwgJnJ0LT51LmRzdCk7CisJaXBoLT5wcm90b2NvbCA9IHNrLT5za19wcm90b2NvbDsKKwlpcGgtPnNhZGRyICAgID0gcnQtPnJ0X3NyYzsKKwlpcGgtPmRhZGRyICAgID0gcnQtPnJ0X2RzdDsKKwlza2ItPm5oLmlwaCAgID0gaXBoOworCS8qIFRyYW5zcG9ydCBsYXllciBzZXQgc2tiLT5oLmZvbyBpdHNlbGYuICovCisKKwlpZiAob3B0ICYmIG9wdC0+b3B0bGVuKSB7CisJCWlwaC0+aWhsICs9IG9wdC0+b3B0bGVuID4+IDI7CisJCWlwX29wdGlvbnNfYnVpbGQoc2tiLCBvcHQsIGluZXQtPmRhZGRyLCBydCwgMCk7CisJfQorCisJaXBfc2VsZWN0X2lkZW50X21vcmUoaXBoLCAmcnQtPnUuZHN0LCBzaywgc2tiX3NoaW5mbyhza2IpLT50c29fc2Vncyk7CisKKwkvKiBBZGQgYW4gSVAgY2hlY2tzdW0uICovCisJaXBfc2VuZF9jaGVjayhpcGgpOworCisJc2tiLT5wcmlvcml0eSA9IHNrLT5za19wcmlvcml0eTsKKworCXJldHVybiBORl9IT09LKFBGX0lORVQsIE5GX0lQX0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBydC0+dS5kc3QuZGV2LAorCQkgICAgICAgZHN0X291dHB1dCk7CisKK25vX3JvdXRlOgorCUlQX0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVROT1JPVVRFUyk7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIC1FSE9TVFVOUkVBQ0g7Cit9CisKKworc3RhdGljIHZvaWQgaXBfY29weV9tZXRhZGF0YShzdHJ1Y3Qgc2tfYnVmZiAqdG8sIHN0cnVjdCBza19idWZmICpmcm9tKQoreworCXRvLT5wa3RfdHlwZSA9IGZyb20tPnBrdF90eXBlOworCXRvLT5wcmlvcml0eSA9IGZyb20tPnByaW9yaXR5OworCXRvLT5wcm90b2NvbCA9IGZyb20tPnByb3RvY29sOworCXRvLT5zZWN1cml0eSA9IGZyb20tPnNlY3VyaXR5OworCWRzdF9yZWxlYXNlKHRvLT5kc3QpOworCXRvLT5kc3QgPSBkc3RfY2xvbmUoZnJvbS0+ZHN0KTsKKwl0by0+ZGV2ID0gZnJvbS0+ZGV2OworCisJLyogQ29weSB0aGUgZmxhZ3MgdG8gZWFjaCBmcmFnbWVudC4gKi8KKwlJUENCKHRvKS0+ZmxhZ3MgPSBJUENCKGZyb20pLT5mbGFnczsKKworI2lmZGVmIENPTkZJR19ORVRfU0NIRUQKKwl0by0+dGNfaW5kZXggPSBmcm9tLT50Y19pbmRleDsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ORVRGSUxURVIKKwl0by0+bmZtYXJrID0gZnJvbS0+bmZtYXJrOworCXRvLT5uZmNhY2hlID0gZnJvbS0+bmZjYWNoZTsKKwkvKiBDb25uZWN0aW9uIGFzc29jaWF0aW9uIGlzIHNhbWUgYXMgcHJlLWZyYWcgcGFja2V0ICovCisJbmZfY29ubnRyYWNrX3B1dCh0by0+bmZjdCk7CisJdG8tPm5mY3QgPSBmcm9tLT5uZmN0OworCW5mX2Nvbm50cmFja19nZXQodG8tPm5mY3QpOworCXRvLT5uZmN0aW5mbyA9IGZyb20tPm5mY3RpbmZvOworI2lmZGVmIENPTkZJR19CUklER0VfTkVURklMVEVSCisJbmZfYnJpZGdlX3B1dCh0by0+bmZfYnJpZGdlKTsKKwl0by0+bmZfYnJpZGdlID0gZnJvbS0+bmZfYnJpZGdlOworCW5mX2JyaWRnZV9nZXQodG8tPm5mX2JyaWRnZSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCisJdG8tPm5mX2RlYnVnID0gZnJvbS0+bmZfZGVidWc7CisjZW5kaWYKKyNlbmRpZgorfQorCisvKgorICoJVGhpcyBJUCBkYXRhZ3JhbSBpcyB0b28gbGFyZ2UgdG8gYmUgc2VudCBpbiBvbmUgcGllY2UuICBCcmVhayBpdCB1cCBpbnRvCisgKglzbWFsbGVyIHBpZWNlcyAoZWFjaCBvZiBzaXplIGVxdWFsIHRvIElQIGhlYWRlciBwbHVzCisgKglhIGJsb2NrIG9mIHRoZSBkYXRhIG9mIHRoZSBvcmlnaW5hbCBJUCBkYXRhIHBhcnQpIHRoYXQgd2lsbCB5ZXQgZml0IGluIGEKKyAqCXNpbmdsZSBkZXZpY2UgZnJhbWUsIGFuZCBxdWV1ZSBzdWNoIGEgZnJhbWUgZm9yIHNlbmRpbmcuCisgKi8KKworaW50IGlwX2ZyYWdtZW50KHN0cnVjdCBza19idWZmICpza2IsIGludCAoKm91dHB1dCkoc3RydWN0IHNrX2J1ZmYqKSkKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwlpbnQgcmF3ID0gMDsKKwlpbnQgcHRyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjI7CisJdW5zaWduZWQgaW50IG10dSwgaGxlbiwgbGVmdCwgbGVuLCBsbF9yczsKKwlpbnQgb2Zmc2V0OworCWludCBub3RfbGFzdF9mcmFnOworCXN0cnVjdCBydGFibGUgKnJ0ID0gKHN0cnVjdCBydGFibGUqKXNrYi0+ZHN0OworCWludCBlcnIgPSAwOworCisJZGV2ID0gcnQtPnUuZHN0LmRldjsKKworCS8qCisJICoJUG9pbnQgaW50byB0aGUgSVAgZGF0YWdyYW0gaGVhZGVyLgorCSAqLworCisJaXBoID0gc2tiLT5uaC5pcGg7CisKKwlpZiAodW5saWtlbHkoKGlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9ERikpICYmICFza2ItPmxvY2FsX2RmKSkgeworCQlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCwgSUNNUF9GUkFHX05FRURFRCwKKwkJCSAgaHRvbmwoZHN0X210dSgmcnQtPnUuZHN0KSkpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC1FTVNHU0laRTsKKwl9CisKKwkvKgorCSAqCVNldHVwIHN0YXJ0aW5nIHZhbHVlcy4KKwkgKi8KKworCWhsZW4gPSBpcGgtPmlobCAqIDQ7CisJbXR1ID0gZHN0X210dSgmcnQtPnUuZHN0KSAtIGhsZW47CS8qIFNpemUgb2YgZGF0YSBzcGFjZSAqLworCisJLyogV2hlbiBmcmFnX2xpc3QgaXMgZ2l2ZW4sIHVzZSBpdC4gRmlyc3QsIGNoZWNrIGl0cyB2YWxpZGl0eToKKwkgKiBzb21lIHRyYW5zZm9ybWVycyBjb3VsZCBjcmVhdGUgd3JvbmcgZnJhZ19saXN0IG9yIGJyZWFrIGV4aXN0aW5nCisJICogb25lLCBpdCBpcyBub3QgcHJvaGliaXRlZC4gSW4gdGhpcyBjYXNlIGZhbGwgYmFjayB0byBjb3B5aW5nLgorCSAqCisJICogTEFURVI6IHRoaXMgc3RlcCBjYW4gYmUgbWVyZ2VkIHRvIHJlYWwgZ2VuZXJhdGlvbiBvZiBmcmFnbWVudHMsCisJICogd2UgY2FuIHN3aXRjaCB0byBjb3B5IHdoZW4gc2VlIHRoZSBmaXJzdCBiYWQgZnJhZ21lbnQuCisJICovCisJaWYgKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0KSB7CisJCXN0cnVjdCBza19idWZmICpmcmFnOworCQlpbnQgZmlyc3RfbGVuID0gc2tiX3BhZ2VsZW4oc2tiKTsKKworCQlpZiAoZmlyc3RfbGVuIC0gaGxlbiA+IG10dSB8fAorCQkgICAgKChmaXJzdF9sZW4gLSBobGVuKSAmIDcpIHx8CisJCSAgICAoaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX01GfElQX09GRlNFVCkpIHx8CisJCSAgICBza2JfY2xvbmVkKHNrYikpCisJCQlnb3RvIHNsb3dfcGF0aDsKKworCQlmb3IgKGZyYWcgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsgZnJhZzsgZnJhZyA9IGZyYWctPm5leHQpIHsKKwkJCS8qIENvcnJlY3QgZ2VvbWV0cnkuICovCisJCQlpZiAoZnJhZy0+bGVuID4gbXR1IHx8CisJCQkgICAgKChmcmFnLT5sZW4gJiA3KSAmJiBmcmFnLT5uZXh0KSB8fAorCQkJICAgIHNrYl9oZWFkcm9vbShmcmFnKSA8IGhsZW4pCisJCQkgICAgZ290byBzbG93X3BhdGg7CisKKwkJCS8qIFBhcnRpYWxseSBjbG9uZWQgc2tiPyAqLworCQkJaWYgKHNrYl9zaGFyZWQoZnJhZykpCisJCQkJZ290byBzbG93X3BhdGg7CisJCX0KKworCQkvKiBFdmVyeXRoaW5nIGlzIE9LLiBHZW5lcmF0ZSEgKi8KKworCQllcnIgPSAwOworCQlvZmZzZXQgPSAwOworCQlmcmFnID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3Q7CisJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0ID0gTlVMTDsKKwkJc2tiLT5kYXRhX2xlbiA9IGZpcnN0X2xlbiAtIHNrYl9oZWFkbGVuKHNrYik7CisJCXNrYi0+bGVuID0gZmlyc3RfbGVuOworCQlpcGgtPnRvdF9sZW4gPSBodG9ucyhmaXJzdF9sZW4pOworCQlpcGgtPmZyYWdfb2ZmID0gaHRvbnMoSVBfTUYpOworCQlpcF9zZW5kX2NoZWNrKGlwaCk7CisKKwkJZm9yICg7OykgeworCQkJLyogUHJlcGFyZSBoZWFkZXIgb2YgdGhlIG5leHQgZnJhbWUsCisJCQkgKiBiZWZvcmUgcHJldmlvdXMgb25lIHdlbnQgZG93bi4gKi8KKwkJCWlmIChmcmFnKSB7CisJCQkJZnJhZy0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJCQlmcmFnLT5oLnJhdyA9IGZyYWctPmRhdGE7CisJCQkJZnJhZy0+bmgucmF3ID0gX19za2JfcHVzaChmcmFnLCBobGVuKTsKKwkJCQltZW1jcHkoZnJhZy0+bmgucmF3LCBpcGgsIGhsZW4pOworCQkJCWlwaCA9IGZyYWctPm5oLmlwaDsKKwkJCQlpcGgtPnRvdF9sZW4gPSBodG9ucyhmcmFnLT5sZW4pOworCQkJCWlwX2NvcHlfbWV0YWRhdGEoZnJhZywgc2tiKTsKKwkJCQlpZiAob2Zmc2V0ID09IDApCisJCQkJCWlwX29wdGlvbnNfZnJhZ21lbnQoZnJhZyk7CisJCQkJb2Zmc2V0ICs9IHNrYi0+bGVuIC0gaGxlbjsKKwkJCQlpcGgtPmZyYWdfb2ZmID0gaHRvbnMob2Zmc2V0Pj4zKTsKKwkJCQlpZiAoZnJhZy0+bmV4dCAhPSBOVUxMKQorCQkJCQlpcGgtPmZyYWdfb2ZmIHw9IGh0b25zKElQX01GKTsKKwkJCQkvKiBSZWFkeSwgY29tcGxldGUgY2hlY2tzdW0gKi8KKwkJCQlpcF9zZW5kX2NoZWNrKGlwaCk7CisJCQl9CisKKwkJCWVyciA9IG91dHB1dChza2IpOworCisJCQlpZiAoZXJyIHx8ICFmcmFnKQorCQkJCWJyZWFrOworCisJCQlza2IgPSBmcmFnOworCQkJZnJhZyA9IHNrYi0+bmV4dDsKKwkJCXNrYi0+bmV4dCA9IE5VTEw7CisJCX0KKworCQlpZiAoZXJyID09IDApIHsKKwkJCUlQX0lOQ19TVEFUUyhJUFNUQVRTX01JQl9GUkFHT0tTKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJd2hpbGUgKGZyYWcpIHsKKwkJCXNrYiA9IGZyYWctPm5leHQ7CisJCQlrZnJlZV9za2IoZnJhZyk7CisJCQlmcmFnID0gc2tiOworCQl9CisJCUlQX0lOQ19TVEFUUyhJUFNUQVRTX01JQl9GUkFHRkFJTFMpOworCQlyZXR1cm4gZXJyOworCX0KKworc2xvd19wYXRoOgorCWxlZnQgPSBza2ItPmxlbiAtIGhsZW47CQkvKiBTcGFjZSBwZXIgZnJhbWUgKi8KKwlwdHIgPSByYXcgKyBobGVuOwkJLyogV2hlcmUgdG8gc3RhcnQgZnJvbSAqLworCisjaWZkZWYgQ09ORklHX0JSSURHRV9ORVRGSUxURVIKKwkvKiBmb3IgYnJpZGdlZCBJUCB0cmFmZmljIGVuY2Fwc3VsYXRlZCBpbnNpZGUgZi5lLiBhIHZsYW4gaGVhZGVyLAorCSAqIHdlIG5lZWQgdG8gbWFrZSByb29tIGZvciB0aGUgZW5jYXBzdWxhdGluZyBoZWFkZXIgKi8KKwlsbF9ycyA9IExMX1JFU0VSVkVEX1NQQUNFX0VYVFJBKHJ0LT51LmRzdC5kZXYsIG5mX2JyaWRnZV9wYWQoc2tiKSk7CisJbXR1IC09IG5mX2JyaWRnZV9wYWQoc2tiKTsKKyNlbHNlCisJbGxfcnMgPSBMTF9SRVNFUlZFRF9TUEFDRShydC0+dS5kc3QuZGV2KTsKKyNlbmRpZgorCS8qCisJICoJRnJhZ21lbnQgdGhlIGRhdGFncmFtLgorCSAqLworCisJb2Zmc2V0ID0gKG50b2hzKGlwaC0+ZnJhZ19vZmYpICYgSVBfT0ZGU0VUKSA8PCAzOworCW5vdF9sYXN0X2ZyYWcgPSBpcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfTUYpOworCisJLyoKKwkgKglLZWVwIGNvcHlpbmcgZGF0YSB1bnRpbCB3ZSBydW4gb3V0LgorCSAqLworCisJd2hpbGUobGVmdCA+IDApCXsKKwkJbGVuID0gbGVmdDsKKwkJLyogSUY6IGl0IGRvZXNuJ3QgZml0LCB1c2UgJ210dScgLSB0aGUgZGF0YSBzcGFjZSBsZWZ0ICovCisJCWlmIChsZW4gPiBtdHUpCisJCQlsZW4gPSBtdHU7CisJCS8qIElGOiB3ZSBhcmUgbm90IHNlbmRpbmcgdXB0byBhbmQgaW5jbHVkaW5nIHRoZSBwYWNrZXQgZW5kCisJCSAgIHRoZW4gYWxpZ24gdGhlIG5leHQgc3RhcnQgb24gYW4gZWlnaHQgYnl0ZSBib3VuZGFyeSAqLworCQlpZiAobGVuIDwgbGVmdCkJeworCQkJbGVuICY9IH43OworCQl9CisJCS8qCisJCSAqCUFsbG9jYXRlIGJ1ZmZlci4KKwkJICovCisKKwkJaWYgKChza2IyID0gYWxsb2Nfc2tiKGxlbitobGVuK2xsX3JzLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgeworCQkJTkVUREVCVUcocHJpbnRrKEtFUk5fSU5GTyAiSVA6IGZyYWc6IG5vIG1lbW9yeSBmb3IgbmV3IGZyYWdtZW50IVxuIikpOworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCS8qCisJCSAqCVNldCB1cCBkYXRhIG9uIHBhY2tldAorCQkgKi8KKworCQlpcF9jb3B5X21ldGFkYXRhKHNrYjIsIHNrYik7CisJCXNrYl9yZXNlcnZlKHNrYjIsIGxsX3JzKTsKKwkJc2tiX3B1dChza2IyLCBsZW4gKyBobGVuKTsKKwkJc2tiMi0+bmgucmF3ID0gc2tiMi0+ZGF0YTsKKwkJc2tiMi0+aC5yYXcgPSBza2IyLT5kYXRhICsgaGxlbjsKKworCQkvKgorCQkgKglDaGFyZ2UgdGhlIG1lbW9yeSBmb3IgdGhlIGZyYWdtZW50IHRvIGFueSBvd25lcgorCQkgKglpdCBtaWdodCBwb3NzZXNzCisJCSAqLworCisJCWlmIChza2ItPnNrKQorCQkJc2tiX3NldF9vd25lcl93KHNrYjIsIHNrYi0+c2spOworCisJCS8qCisJCSAqCUNvcHkgdGhlIHBhY2tldCBoZWFkZXIgaW50byB0aGUgbmV3IGJ1ZmZlci4KKwkJICovCisKKwkJbWVtY3B5KHNrYjItPm5oLnJhdywgc2tiLT5kYXRhLCBobGVuKTsKKworCQkvKgorCQkgKglDb3B5IGEgYmxvY2sgb2YgdGhlIElQIGRhdGFncmFtLgorCQkgKi8KKwkJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCBwdHIsIHNrYjItPmgucmF3LCBsZW4pKQorCQkJQlVHKCk7CisJCWxlZnQgLT0gbGVuOworCisJCS8qCisJCSAqCUZpbGwgaW4gdGhlIG5ldyBoZWFkZXIgZmllbGRzLgorCQkgKi8KKwkJaXBoID0gc2tiMi0+bmguaXBoOworCQlpcGgtPmZyYWdfb2ZmID0gaHRvbnMoKG9mZnNldCA+PiAzKSk7CisKKwkJLyogQU5LOiBkaXJ0eSwgYnV0IGVmZmVjdGl2ZSB0cmljay4gVXBncmFkZSBvcHRpb25zIG9ubHkgaWYKKwkJICogdGhlIHNlZ21lbnQgdG8gYmUgZnJhZ21lbnRlZCB3YXMgVEhFIEZJUlNUIChvdGhlcndpc2UsCisJCSAqIG9wdGlvbnMgYXJlIGFscmVhZHkgZml4ZWQpIGFuZCBtYWtlIGl0IE9OQ0UKKwkJICogb24gdGhlIGluaXRpYWwgc2tiLCBzbyB0aGF0IGFsbCB0aGUgZm9sbG93aW5nIGZyYWdtZW50cworCQkgKiB3aWxsIGluaGVyaXQgZml4ZWQgb3B0aW9ucy4KKwkJICovCisJCWlmIChvZmZzZXQgPT0gMCkKKwkJCWlwX29wdGlvbnNfZnJhZ21lbnQoc2tiKTsKKworCQkvKgorCQkgKglBZGRlZCBBQyA6IElmIHdlIGFyZSBmcmFnbWVudGluZyBhIGZyYWdtZW50IHRoYXQncyBub3QgdGhlCisJCSAqCQkgICBsYXN0IGZyYWdtZW50IHRoZW4ga2VlcCBNRiBvbiBlYWNoIGJpdAorCQkgKi8KKwkJaWYgKGxlZnQgPiAwIHx8IG5vdF9sYXN0X2ZyYWcpCisJCQlpcGgtPmZyYWdfb2ZmIHw9IGh0b25zKElQX01GKTsKKwkJcHRyICs9IGxlbjsKKwkJb2Zmc2V0ICs9IGxlbjsKKworCQkvKgorCQkgKglQdXQgdGhpcyBmcmFnbWVudCBpbnRvIHRoZSBzZW5kaW5nIHF1ZXVlLgorCQkgKi8KKworCQlJUF9JTkNfU1RBVFMoSVBTVEFUU19NSUJfRlJBR0NSRUFURVMpOworCisJCWlwaC0+dG90X2xlbiA9IGh0b25zKGxlbiArIGhsZW4pOworCisJCWlwX3NlbmRfY2hlY2soaXBoKTsKKworCQllcnIgPSBvdXRwdXQoc2tiMik7CisJCWlmIChlcnIpCisJCQlnb3RvIGZhaWw7CisJfQorCWtmcmVlX3NrYihza2IpOworCUlQX0lOQ19TVEFUUyhJUFNUQVRTX01JQl9GUkFHT0tTKTsKKwlyZXR1cm4gZXJyOworCitmYWlsOgorCWtmcmVlX3NrYihza2IpOyAKKwlJUF9JTkNfU1RBVFMoSVBTVEFUU19NSUJfRlJBR0ZBSUxTKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQKK2lwX2dlbmVyaWNfZ2V0ZnJhZyh2b2lkICpmcm9tLCBjaGFyICp0bywgaW50IG9mZnNldCwgaW50IGxlbiwgaW50IG9kZCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaW92ZWMgKmlvdiA9IGZyb207CisKKwlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpIHsKKwkJaWYgKG1lbWNweV9mcm9taW92ZWNlbmQodG8sIGlvdiwgb2Zmc2V0LCBsZW4pIDwgMCkKKwkJCXJldHVybiAtRUZBVUxUOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGludCBjc3VtID0gMDsKKwkJaWYgKGNzdW1fcGFydGlhbF9jb3B5X2Zyb21pb3ZlY2VuZCh0bywgaW92LCBvZmZzZXQsIGxlbiwgJmNzdW0pIDwgMCkKKwkJCXJldHVybiAtRUZBVUxUOworCQlza2ItPmNzdW0gPSBjc3VtX2Jsb2NrX2FkZChza2ItPmNzdW0sIGNzdW0sIG9kZCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAorY3N1bV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb2Zmc2V0LCBpbnQgY29weSkKK3sKKwljaGFyICprYWRkcjsKKwl1bnNpZ25lZCBpbnQgY3N1bTsKKwlrYWRkciA9IGttYXAocGFnZSk7CisJY3N1bSA9IGNzdW1fcGFydGlhbChrYWRkciArIG9mZnNldCwgY29weSwgMCk7CisJa3VubWFwKHBhZ2UpOworCXJldHVybiBjc3VtOworfQorCisvKgorICoJaXBfYXBwZW5kX2RhdGEoKSBhbmQgaXBfYXBwZW5kX3BhZ2UoKSBjYW4gbWFrZSBvbmUgbGFyZ2UgSVAgZGF0YWdyYW0KKyAqCWZyb20gbWFueSBwaWVjZXMgb2YgZGF0YS4gRWFjaCBwaWVjZXMgd2lsbCBiZSBob2xkZWQgb24gdGhlIHNvY2tldAorICoJdW50aWwgaXBfcHVzaF9wZW5kaW5nX2ZyYW1lcygpIGlzIGNhbGxlZC4gRWFjaCBwaWVjZSBjYW4gYmUgYSBwYWdlCisgKglvciBub24tcGFnZSBkYXRhLgorICoJCisgKglOb3Qgb25seSBVRFAsIG90aGVyIHRyYW5zcG9ydCBwcm90b2NvbHMgLSBlLmcuIHJhdyBzb2NrZXRzIC0gY2FuIHVzZQorICoJdGhpcyBpbnRlcmZhY2UgcG90ZW50aWFsbHkuCisgKgorICoJTEFURVI6IGxlbmd0aCBtdXN0IGJlIGFkanVzdGVkIGJ5IHBhZCBhdCB0YWlsLCB3aGVuIGl0IGlzIHJlcXVpcmVkLgorICovCitpbnQgaXBfYXBwZW5kX2RhdGEoc3RydWN0IHNvY2sgKnNrLAorCQkgICBpbnQgZ2V0ZnJhZyh2b2lkICpmcm9tLCBjaGFyICp0bywgaW50IG9mZnNldCwgaW50IGxlbiwKKwkJCSAgICAgICBpbnQgb2RkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSwKKwkJICAgdm9pZCAqZnJvbSwgaW50IGxlbmd0aCwgaW50IHRyYW5zaGRybGVuLAorCQkgICBzdHJ1Y3QgaXBjbV9jb29raWUgKmlwYywgc3RydWN0IHJ0YWJsZSAqcnQsCisJCSAgIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXN0cnVjdCBpcF9vcHRpb25zICpvcHQgPSBOVUxMOworCWludCBoaF9sZW47CisJaW50IGV4dGhkcmxlbjsKKwlpbnQgbXR1OworCWludCBjb3B5OworCWludCBlcnI7CisJaW50IG9mZnNldCA9IDA7CisJdW5zaWduZWQgaW50IG1heGZyYWdsZW4sIGZyYWdoZWFkZXJsZW47CisJaW50IGNzdW1tb2RlID0gQ0hFQ0tTVU1fTk9ORTsKKworCWlmIChmbGFncyZNU0dfUFJPQkUpCisJCXJldHVybiAwOworCisJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3dyaXRlX3F1ZXVlKSkgeworCQkvKgorCQkgKiBzZXR1cCBmb3IgY29ya2luZy4KKwkJICovCisJCW9wdCA9IGlwYy0+b3B0OworCQlpZiAob3B0KSB7CisJCQlpZiAoaW5ldC0+Y29yay5vcHQgPT0gTlVMTCkgeworCQkJCWluZXQtPmNvcmsub3B0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwX29wdGlvbnMpICsgNDAsIHNrLT5za19hbGxvY2F0aW9uKTsKKwkJCQlpZiAodW5saWtlbHkoaW5ldC0+Y29yay5vcHQgPT0gTlVMTCkpCisJCQkJCXJldHVybiAtRU5PQlVGUzsKKwkJCX0KKwkJCW1lbWNweShpbmV0LT5jb3JrLm9wdCwgb3B0LCBzaXplb2Yoc3RydWN0IGlwX29wdGlvbnMpK29wdC0+b3B0bGVuKTsKKwkJCWluZXQtPmNvcmsuZmxhZ3MgfD0gSVBDT1JLX09QVDsKKwkJCWluZXQtPmNvcmsuYWRkciA9IGlwYy0+YWRkcjsKKwkJfQorCQlkc3RfaG9sZCgmcnQtPnUuZHN0KTsKKwkJaW5ldC0+Y29yay5mcmFnc2l6ZSA9IG10dSA9IGRzdF9tdHUocnQtPnUuZHN0LnBhdGgpOworCQlpbmV0LT5jb3JrLnJ0ID0gcnQ7CisJCWluZXQtPmNvcmsubGVuZ3RoID0gMDsKKwkJc2stPnNrX3NuZG1zZ19wYWdlID0gTlVMTDsKKwkJc2stPnNrX3NuZG1zZ19vZmYgPSAwOworCQlpZiAoKGV4dGhkcmxlbiA9IHJ0LT51LmRzdC5oZWFkZXJfbGVuKSAhPSAwKSB7CisJCQlsZW5ndGggKz0gZXh0aGRybGVuOworCQkJdHJhbnNoZHJsZW4gKz0gZXh0aGRybGVuOworCQl9CisJfSBlbHNlIHsKKwkJcnQgPSBpbmV0LT5jb3JrLnJ0OworCQlpZiAoaW5ldC0+Y29yay5mbGFncyAmIElQQ09SS19PUFQpCisJCQlvcHQgPSBpbmV0LT5jb3JrLm9wdDsKKworCQl0cmFuc2hkcmxlbiA9IDA7CisJCWV4dGhkcmxlbiA9IDA7CisJCW10dSA9IGluZXQtPmNvcmsuZnJhZ3NpemU7CisJfQorCWhoX2xlbiA9IExMX1JFU0VSVkVEX1NQQUNFKHJ0LT51LmRzdC5kZXYpOworCisJZnJhZ2hlYWRlcmxlbiA9IHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgKG9wdCA/IG9wdC0+b3B0bGVuIDogMCk7CisJbWF4ZnJhZ2xlbiA9ICgobXR1IC0gZnJhZ2hlYWRlcmxlbikgJiB+NykgKyBmcmFnaGVhZGVybGVuOworCisJaWYgKGluZXQtPmNvcmsubGVuZ3RoICsgbGVuZ3RoID4gMHhGRkZGIC0gZnJhZ2hlYWRlcmxlbikgeworCQlpcF9sb2NhbF9lcnJvcihzaywgRU1TR1NJWkUsIHJ0LT5ydF9kc3QsIGluZXQtPmRwb3J0LCBtdHUtZXh0aGRybGVuKTsKKwkJcmV0dXJuIC1FTVNHU0laRTsKKwl9CisKKwkvKgorCSAqIHRyYW5zaGRybGVuID4gMCBtZWFucyB0aGF0IHRoaXMgaXMgdGhlIGZpcnN0IGZyYWdtZW50IGFuZCB3ZSB3aXNoCisJICogaXQgd29uJ3QgYmUgZnJhZ21lbnRlZCBpbiB0aGUgZnV0dXJlLgorCSAqLworCWlmICh0cmFuc2hkcmxlbiAmJgorCSAgICBsZW5ndGggKyBmcmFnaGVhZGVybGVuIDw9IG10dSAmJgorCSAgICBydC0+dS5kc3QuZGV2LT5mZWF0dXJlcyYoTkVUSUZfRl9JUF9DU1VNfE5FVElGX0ZfTk9fQ1NVTXxORVRJRl9GX0hXX0NTVU0pICYmCisJICAgICFleHRoZHJsZW4pCisJCWNzdW1tb2RlID0gQ0hFQ0tTVU1fSFc7CisKKwlpbmV0LT5jb3JrLmxlbmd0aCArPSBsZW5ndGg7CisKKwkvKiBTbywgd2hhdCdzIGdvaW5nIG9uIGluIHRoZSBsb29wIGJlbG93PworCSAqCisJICogV2UgdXNlIGNhbGN1bGF0ZWQgZnJhZ21lbnQgbGVuZ3RoIHRvIGdlbmVyYXRlIGNoYWluZWQgc2tiLAorCSAqIGVhY2ggb2Ygc2VnbWVudHMgaXMgSVAgZnJhZ21lbnQgcmVhZHkgZm9yIHNlbmRpbmcgdG8gbmV0d29yayBhZnRlcgorCSAqIGFkZGluZyBhcHByb3ByaWF0ZSBJUCBoZWFkZXIuCisJICovCisKKwlpZiAoKHNrYiA9IHNrYl9wZWVrX3RhaWwoJnNrLT5za193cml0ZV9xdWV1ZSkpID09IE5VTEwpCisJCWdvdG8gYWxsb2NfbmV3X3NrYjsKKworCXdoaWxlIChsZW5ndGggPiAwKSB7CisJCS8qIENoZWNrIGlmIHRoZSByZW1haW5pbmcgZGF0YSBmaXRzIGludG8gY3VycmVudCBwYWNrZXQuICovCisJCWNvcHkgPSBtdHUgLSBza2ItPmxlbjsKKwkJaWYgKGNvcHkgPCBsZW5ndGgpCisJCQljb3B5ID0gbWF4ZnJhZ2xlbiAtIHNrYi0+bGVuOworCQlpZiAoY29weSA8PSAwKSB7CisJCQljaGFyICpkYXRhOworCQkJdW5zaWduZWQgaW50IGRhdGFsZW47CisJCQl1bnNpZ25lZCBpbnQgZnJhZ2xlbjsKKwkJCXVuc2lnbmVkIGludCBmcmFnZ2FwOworCQkJdW5zaWduZWQgaW50IGFsbG9jbGVuOworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYl9wcmV2OworYWxsb2NfbmV3X3NrYjoKKwkJCXNrYl9wcmV2ID0gc2tiOworCQkJaWYgKHNrYl9wcmV2KQorCQkJCWZyYWdnYXAgPSBza2JfcHJldi0+bGVuIC0gbWF4ZnJhZ2xlbjsKKwkJCWVsc2UKKwkJCQlmcmFnZ2FwID0gMDsKKworCQkJLyoKKwkJCSAqIElmIHJlbWFpbmluZyBkYXRhIGV4Y2VlZHMgdGhlIG10dSwKKwkJCSAqIHdlIGtub3cgd2UgbmVlZCBtb3JlIGZyYWdtZW50KHMpLgorCQkJICovCisJCQlkYXRhbGVuID0gbGVuZ3RoICsgZnJhZ2dhcDsKKwkJCWlmIChkYXRhbGVuID4gbXR1IC0gZnJhZ2hlYWRlcmxlbikKKwkJCQlkYXRhbGVuID0gbWF4ZnJhZ2xlbiAtIGZyYWdoZWFkZXJsZW47CisJCQlmcmFnbGVuID0gZGF0YWxlbiArIGZyYWdoZWFkZXJsZW47CisKKwkJCWlmICgoZmxhZ3MgJiBNU0dfTU9SRSkgJiYgCisJCQkgICAgIShydC0+dS5kc3QuZGV2LT5mZWF0dXJlcyZORVRJRl9GX1NHKSkKKwkJCQlhbGxvY2xlbiA9IG10dTsKKwkJCWVsc2UKKwkJCQlhbGxvY2xlbiA9IGRhdGFsZW4gKyBmcmFnaGVhZGVybGVuOworCisJCQkvKiBUaGUgbGFzdCBmcmFnbWVudCBnZXRzIGFkZGl0aW9uYWwgc3BhY2UgYXQgdGFpbC4KKwkJCSAqIE5vdGUsIHdpdGggTVNHX01PUkUgd2Ugb3ZlcmFsbG9jYXRlIG9uIGZyYWdtZW50cywKKwkJCSAqIGJlY2F1c2Ugd2UgaGF2ZSBubyBpZGVhIHdoYXQgZnJhZ21lbnQgd2lsbCBiZQorCQkJICogdGhlIGxhc3QuCisJCQkgKi8KKwkJCWlmIChkYXRhbGVuID09IGxlbmd0aCkKKwkJCQlhbGxvY2xlbiArPSBydC0+dS5kc3QudHJhaWxlcl9sZW47CisKKwkJCWlmICh0cmFuc2hkcmxlbikgeworCQkJCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssIAorCQkJCQkJYWxsb2NsZW4gKyBoaF9sZW4gKyAxNSwKKwkJCQkJCShmbGFncyAmIE1TR19ET05UV0FJVCksICZlcnIpOworCQkJfSBlbHNlIHsKKwkJCQlza2IgPSBOVUxMOworCQkJCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpIDw9CisJCQkJICAgIDIgKiBzay0+c2tfc25kYnVmKQorCQkJCQlza2IgPSBzb2NrX3dtYWxsb2Moc2ssIAorCQkJCQkJCSAgIGFsbG9jbGVuICsgaGhfbGVuICsgMTUsIDEsCisJCQkJCQkJICAgc2stPnNrX2FsbG9jYXRpb24pOworCQkJCWlmICh1bmxpa2VseShza2IgPT0gTlVMTCkpCisJCQkJCWVyciA9IC1FTk9CVUZTOworCQkJfQorCQkJaWYgKHNrYiA9PSBOVUxMKQorCQkJCWdvdG8gZXJyb3I7CisKKwkJCS8qCisJCQkgKglGaWxsIGluIHRoZSBjb250cm9sIHN0cnVjdHVyZXMKKwkJCSAqLworCQkJc2tiLT5pcF9zdW1tZWQgPSBjc3VtbW9kZTsKKwkJCXNrYi0+Y3N1bSA9IDA7CisJCQlza2JfcmVzZXJ2ZShza2IsIGhoX2xlbik7CisKKwkJCS8qCisJCQkgKglGaW5kIHdoZXJlIHRvIHN0YXJ0IHB1dHRpbmcgYnl0ZXMuCisJCQkgKi8KKwkJCWRhdGEgPSBza2JfcHV0KHNrYiwgZnJhZ2xlbik7CisJCQlza2ItPm5oLnJhdyA9IGRhdGEgKyBleHRoZHJsZW47CisJCQlkYXRhICs9IGZyYWdoZWFkZXJsZW47CisJCQlza2ItPmgucmF3ID0gZGF0YSArIGV4dGhkcmxlbjsKKworCQkJaWYgKGZyYWdnYXApIHsKKwkJCQlza2ItPmNzdW0gPSBza2JfY29weV9hbmRfY3N1bV9iaXRzKAorCQkJCQlza2JfcHJldiwgbWF4ZnJhZ2xlbiwKKwkJCQkJZGF0YSArIHRyYW5zaGRybGVuLCBmcmFnZ2FwLCAwKTsKKwkJCQlza2JfcHJldi0+Y3N1bSA9IGNzdW1fc3ViKHNrYl9wcmV2LT5jc3VtLAorCQkJCQkJCSAgc2tiLT5jc3VtKTsKKwkJCQlkYXRhICs9IGZyYWdnYXA7CisJCQkJc2tiX3RyaW0oc2tiX3ByZXYsIG1heGZyYWdsZW4pOworCQkJfQorCisJCQljb3B5ID0gZGF0YWxlbiAtIHRyYW5zaGRybGVuIC0gZnJhZ2dhcDsKKwkJCWlmIChjb3B5ID4gMCAmJiBnZXRmcmFnKGZyb20sIGRhdGEgKyB0cmFuc2hkcmxlbiwgb2Zmc2V0LCBjb3B5LCBmcmFnZ2FwLCBza2IpIDwgMCkgeworCQkJCWVyciA9IC1FRkFVTFQ7CisJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKworCQkJb2Zmc2V0ICs9IGNvcHk7CisJCQlsZW5ndGggLT0gZGF0YWxlbiAtIGZyYWdnYXA7CisJCQl0cmFuc2hkcmxlbiA9IDA7CisJCQlleHRoZHJsZW4gPSAwOworCQkJY3N1bW1vZGUgPSBDSEVDS1NVTV9OT05FOworCisJCQkvKgorCQkJICogUHV0IHRoZSBwYWNrZXQgb24gdGhlIHBlbmRpbmcgcXVldWUuCisJCQkgKi8KKwkJCV9fc2tiX3F1ZXVlX3RhaWwoJnNrLT5za193cml0ZV9xdWV1ZSwgc2tiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGNvcHkgPiBsZW5ndGgpCisJCQljb3B5ID0gbGVuZ3RoOworCisJCWlmICghKHJ0LT51LmRzdC5kZXYtPmZlYXR1cmVzJk5FVElGX0ZfU0cpKSB7CisJCQl1bnNpZ25lZCBpbnQgb2ZmOworCisJCQlvZmYgPSBza2ItPmxlbjsKKwkJCWlmIChnZXRmcmFnKGZyb20sIHNrYl9wdXQoc2tiLCBjb3B5KSwgCisJCQkJCW9mZnNldCwgY29weSwgb2ZmLCBza2IpIDwgMCkgeworCQkJCV9fc2tiX3RyaW0oc2tiLCBvZmYpOworCQkJCWVyciA9IC1FRkFVTFQ7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWludCBpID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwkJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpLTFdOworCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBzay0+c2tfc25kbXNnX3BhZ2U7CisJCQlpbnQgb2ZmID0gc2stPnNrX3NuZG1zZ19vZmY7CisJCQl1bnNpZ25lZCBpbnQgbGVmdDsKKworCQkJaWYgKHBhZ2UgJiYgKGxlZnQgPSBQQUdFX1NJWkUgLSBvZmYpID4gMCkgeworCQkJCWlmIChjb3B5ID49IGxlZnQpCisJCQkJCWNvcHkgPSBsZWZ0OworCQkJCWlmIChwYWdlICE9IGZyYWctPnBhZ2UpIHsKKwkJCQkJaWYgKGkgPT0gTUFYX1NLQl9GUkFHUykgeworCQkJCQkJZXJyID0gLUVNU0dTSVpFOworCQkJCQkJZ290byBlcnJvcjsKKwkJCQkJfQorCQkJCQlnZXRfcGFnZShwYWdlKTsKKwkgCQkJCXNrYl9maWxsX3BhZ2VfZGVzYyhza2IsIGksIHBhZ2UsIHNrLT5za19zbmRtc2dfb2ZmLCAwKTsKKwkJCQkJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoaSA8IE1BWF9TS0JfRlJBR1MpIHsKKwkJCQlpZiAoY29weSA+IFBBR0VfU0laRSkKKwkJCQkJY29weSA9IFBBR0VfU0laRTsKKwkJCQlwYWdlID0gYWxsb2NfcGFnZXMoc2stPnNrX2FsbG9jYXRpb24sIDApOworCQkJCWlmIChwYWdlID09IE5VTEwpICB7CisJCQkJCWVyciA9IC1FTk9NRU07CisJCQkJCWdvdG8gZXJyb3I7CisJCQkJfQorCQkJCXNrLT5za19zbmRtc2dfcGFnZSA9IHBhZ2U7CisJCQkJc2stPnNrX3NuZG1zZ19vZmYgPSAwOworCisJCQkJc2tiX2ZpbGxfcGFnZV9kZXNjKHNrYiwgaSwgcGFnZSwgMCwgMCk7CisJCQkJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCQkJCXNrYi0+dHJ1ZXNpemUgKz0gUEFHRV9TSVpFOworCQkJCWF0b21pY19hZGQoUEFHRV9TSVpFLCAmc2stPnNrX3dtZW1fYWxsb2MpOworCQkJfSBlbHNlIHsKKwkJCQllcnIgPSAtRU1TR1NJWkU7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCWlmIChnZXRmcmFnKGZyb20sIHBhZ2VfYWRkcmVzcyhmcmFnLT5wYWdlKStmcmFnLT5wYWdlX29mZnNldCtmcmFnLT5zaXplLCBvZmZzZXQsIGNvcHksIHNrYi0+bGVuLCBza2IpIDwgMCkgeworCQkJCWVyciA9IC1FRkFVTFQ7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCXNrLT5za19zbmRtc2dfb2ZmICs9IGNvcHk7CisJCQlmcmFnLT5zaXplICs9IGNvcHk7CisJCQlza2ItPmxlbiArPSBjb3B5OworCQkJc2tiLT5kYXRhX2xlbiArPSBjb3B5OworCQl9CisJCW9mZnNldCArPSBjb3B5OworCQlsZW5ndGggLT0gY29weTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJaW5ldC0+Y29yay5sZW5ndGggLT0gbGVuZ3RoOworCUlQX0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CisJcmV0dXJuIGVycjsgCit9CisKK3NzaXplX3QJaXBfYXBwZW5kX3BhZ2Uoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJICAgICAgIGludCBvZmZzZXQsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHJ0YWJsZSAqcnQ7CisJc3RydWN0IGlwX29wdGlvbnMgKm9wdCA9IE5VTEw7CisJaW50IGhoX2xlbjsKKwlpbnQgbXR1OworCWludCBsZW47CisJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgbWF4ZnJhZ2xlbiwgZnJhZ2hlYWRlcmxlbiwgZnJhZ2dhcDsKKworCWlmIChpbmV0LT5oZHJpbmNsKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKGZsYWdzJk1TR19QUk9CRSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZzay0+c2tfd3JpdGVfcXVldWUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJ0ID0gaW5ldC0+Y29yay5ydDsKKwlpZiAoaW5ldC0+Y29yay5mbGFncyAmIElQQ09SS19PUFQpCisJCW9wdCA9IGluZXQtPmNvcmsub3B0OworCisJaWYgKCEocnQtPnUuZHN0LmRldi0+ZmVhdHVyZXMmTkVUSUZfRl9TRykpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWhoX2xlbiA9IExMX1JFU0VSVkVEX1NQQUNFKHJ0LT51LmRzdC5kZXYpOworCW10dSA9IGluZXQtPmNvcmsuZnJhZ3NpemU7CisKKwlmcmFnaGVhZGVybGVuID0gc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyAob3B0ID8gb3B0LT5vcHRsZW4gOiAwKTsKKwltYXhmcmFnbGVuID0gKChtdHUgLSBmcmFnaGVhZGVybGVuKSAmIH43KSArIGZyYWdoZWFkZXJsZW47CisKKwlpZiAoaW5ldC0+Y29yay5sZW5ndGggKyBzaXplID4gMHhGRkZGIC0gZnJhZ2hlYWRlcmxlbikgeworCQlpcF9sb2NhbF9lcnJvcihzaywgRU1TR1NJWkUsIHJ0LT5ydF9kc3QsIGluZXQtPmRwb3J0LCBtdHUpOworCQlyZXR1cm4gLUVNU0dTSVpFOworCX0KKworCWlmICgoc2tiID0gc2tiX3BlZWtfdGFpbCgmc2stPnNrX3dyaXRlX3F1ZXVlKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpbmV0LT5jb3JrLmxlbmd0aCArPSBzaXplOworCisJd2hpbGUgKHNpemUgPiAwKSB7CisJCWludCBpOworCisJCS8qIENoZWNrIGlmIHRoZSByZW1haW5pbmcgZGF0YSBmaXRzIGludG8gY3VycmVudCBwYWNrZXQuICovCisJCWxlbiA9IG10dSAtIHNrYi0+bGVuOworCQlpZiAobGVuIDwgc2l6ZSkKKwkJCWxlbiA9IG1heGZyYWdsZW4gLSBza2ItPmxlbjsKKwkJaWYgKGxlbiA8PSAwKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3ByZXY7CisJCQljaGFyICpkYXRhOworCQkJc3RydWN0IGlwaGRyICppcGg7CisJCQlpbnQgYWxsb2NsZW47CisKKwkJCXNrYl9wcmV2ID0gc2tiOworCQkJaWYgKHNrYl9wcmV2KQorCQkJCWZyYWdnYXAgPSBza2JfcHJldi0+bGVuIC0gbWF4ZnJhZ2xlbjsKKwkJCWVsc2UKKwkJCQlmcmFnZ2FwID0gMDsKKworCQkJYWxsb2NsZW4gPSBmcmFnaGVhZGVybGVuICsgaGhfbGVuICsgZnJhZ2dhcCArIDE1OworCQkJc2tiID0gc29ja193bWFsbG9jKHNrLCBhbGxvY2xlbiwgMSwgc2stPnNrX2FsbG9jYXRpb24pOworCQkJaWYgKHVubGlrZWx5KCFza2IpKSB7CisJCQkJZXJyID0gLUVOT0JVRlM7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKworCQkJLyoKKwkJCSAqCUZpbGwgaW4gdGhlIGNvbnRyb2wgc3RydWN0dXJlcworCQkJICovCisJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCQlza2ItPmNzdW0gPSAwOworCQkJc2tiX3Jlc2VydmUoc2tiLCBoaF9sZW4pOworCisJCQkvKgorCQkJICoJRmluZCB3aGVyZSB0byBzdGFydCBwdXR0aW5nIGJ5dGVzLgorCQkJICovCisJCQlkYXRhID0gc2tiX3B1dChza2IsIGZyYWdoZWFkZXJsZW4gKyBmcmFnZ2FwKTsKKwkJCXNrYi0+bmguaXBoID0gaXBoID0gKHN0cnVjdCBpcGhkciAqKWRhdGE7CisJCQlkYXRhICs9IGZyYWdoZWFkZXJsZW47CisJCQlza2ItPmgucmF3ID0gZGF0YTsKKworCQkJaWYgKGZyYWdnYXApIHsKKwkJCQlza2ItPmNzdW0gPSBza2JfY29weV9hbmRfY3N1bV9iaXRzKAorCQkJCQlza2JfcHJldiwgbWF4ZnJhZ2xlbiwKKwkJCQkJZGF0YSwgZnJhZ2dhcCwgMCk7CisJCQkJc2tiX3ByZXYtPmNzdW0gPSBjc3VtX3N1Yihza2JfcHJldi0+Y3N1bSwKKwkJCQkJCQkgIHNrYi0+Y3N1bSk7CisJCQkJc2tiX3RyaW0oc2tiX3ByZXYsIG1heGZyYWdsZW4pOworCQkJfQorCisJCQkvKgorCQkJICogUHV0IHRoZSBwYWNrZXQgb24gdGhlIHBlbmRpbmcgcXVldWUuCisJCQkgKi8KKwkJCV9fc2tiX3F1ZXVlX3RhaWwoJnNrLT5za193cml0ZV9xdWV1ZSwgc2tiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaSA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJCWlmIChsZW4gPiBzaXplKQorCQkJbGVuID0gc2l6ZTsKKwkJaWYgKHNrYl9jYW5fY29hbGVzY2Uoc2tiLCBpLCBwYWdlLCBvZmZzZXQpKSB7CisJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ktMV0uc2l6ZSArPSBsZW47CisJCX0gZWxzZSBpZiAoaSA8IE1BWF9TS0JfRlJBR1MpIHsKKwkJCWdldF9wYWdlKHBhZ2UpOworCQkJc2tiX2ZpbGxfcGFnZV9kZXNjKHNrYiwgaSwgcGFnZSwgb2Zmc2V0LCBsZW4pOworCQl9IGVsc2UgeworCQkJZXJyID0gLUVNU0dTSVpFOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9OT05FKSB7CisJCQl1bnNpZ25lZCBpbnQgY3N1bTsKKwkJCWNzdW0gPSBjc3VtX3BhZ2UocGFnZSwgb2Zmc2V0LCBsZW4pOworCQkJc2tiLT5jc3VtID0gY3N1bV9ibG9ja19hZGQoc2tiLT5jc3VtLCBjc3VtLCBza2ItPmxlbik7CisJCX0KKworCQlza2ItPmxlbiArPSBsZW47CisJCXNrYi0+ZGF0YV9sZW4gKz0gbGVuOworCQlvZmZzZXQgKz0gbGVuOworCQlzaXplIC09IGxlbjsKKwl9CisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWluZXQtPmNvcmsubGVuZ3RoIC09IHNpemU7CisJSVBfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJQ29tYmluZWQgYWxsIHBlbmRpbmcgSVAgZnJhZ21lbnRzIG9uIHRoZSBzb2NrZXQgYXMgb25lIElQIGRhdGFncmFtCisgKglhbmQgcHVzaCB0aGVtIG91dC4KKyAqLworaW50IGlwX3B1c2hfcGVuZGluZ19mcmFtZXMoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBza19idWZmICpza2IsICp0bXBfc2tiOworCXN0cnVjdCBza19idWZmICoqdGFpbF9za2I7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCXN0cnVjdCBpcF9vcHRpb25zICpvcHQgPSBOVUxMOworCXN0cnVjdCBydGFibGUgKnJ0ID0gaW5ldC0+Y29yay5ydDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwlpbnQgZGYgPSAwOworCV9fdTggdHRsOworCWludCBlcnIgPSAwOworCisJaWYgKChza2IgPSBfX3NrYl9kZXF1ZXVlKCZzay0+c2tfd3JpdGVfcXVldWUpKSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwl0YWlsX3NrYiA9ICYoc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QpOworCisJLyogbW92ZSBza2ItPmRhdGEgdG8gaXAgaGVhZGVyIGZyb20gZXh0IGhlYWRlciAqLworCWlmIChza2ItPmRhdGEgPCBza2ItPm5oLnJhdykKKwkJX19za2JfcHVsbChza2IsIHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhKTsKKwl3aGlsZSAoKHRtcF9za2IgPSBfX3NrYl9kZXF1ZXVlKCZzay0+c2tfd3JpdGVfcXVldWUpKSAhPSBOVUxMKSB7CisJCV9fc2tiX3B1bGwodG1wX3NrYiwgc2tiLT5oLnJhdyAtIHNrYi0+bmgucmF3KTsKKwkJKnRhaWxfc2tiID0gdG1wX3NrYjsKKwkJdGFpbF9za2IgPSAmKHRtcF9za2ItPm5leHQpOworCQlza2ItPmxlbiArPSB0bXBfc2tiLT5sZW47CisJCXNrYi0+ZGF0YV9sZW4gKz0gdG1wX3NrYi0+bGVuOworCQlza2ItPnRydWVzaXplICs9IHRtcF9za2ItPnRydWVzaXplOworCQlfX3NvY2tfcHV0KHRtcF9za2ItPnNrKTsKKwkJdG1wX3NrYi0+ZGVzdHJ1Y3RvciA9IE5VTEw7CisJCXRtcF9za2ItPnNrID0gTlVMTDsKKwl9CisKKwkvKiBVbmxlc3MgdXNlciBkZW1hbmRlZCByZWFsIHBtdHUgZGlzY292ZXJ5IChJUF9QTVRVRElTQ19ETyksIHdlIGFsbG93CisJICogdG8gZnJhZ21lbnQgdGhlIGZyYW1lIGdlbmVyYXRlZCBoZXJlLiBObyBtYXR0ZXIsIHdoYXQgdHJhbnNmb3JtcworCSAqIGhvdyB0cmFuc2Zvcm1zIGNoYW5nZSBzaXplIG9mIHRoZSBwYWNrZXQsIGl0IHdpbGwgY29tZSBvdXQuCisJICovCisJaWYgKGluZXQtPnBtdHVkaXNjICE9IElQX1BNVFVESVNDX0RPKQorCQlza2ItPmxvY2FsX2RmID0gMTsKKworCS8qIERGIGJpdCBpcyBzZXQgd2hlbiB3ZSB3YW50IHRvIHNlZSBERiBvbiBvdXRnb2luZyBmcmFtZXMuCisJICogSWYgbG9jYWxfZGYgaXMgc2V0IHRvbywgd2Ugc3RpbGwgYWxsb3cgdG8gZnJhZ21lbnQgdGhpcyBmcmFtZQorCSAqIGxvY2FsbHkuICovCisJaWYgKGluZXQtPnBtdHVkaXNjID09IElQX1BNVFVESVNDX0RPIHx8CisJICAgIChza2ItPmxlbiA8PSBkc3RfbXR1KCZydC0+dS5kc3QpICYmCisJICAgICBpcF9kb250X2ZyYWdtZW50KHNrLCAmcnQtPnUuZHN0KSkpCisJCWRmID0gaHRvbnMoSVBfREYpOworCisJaWYgKGluZXQtPmNvcmsuZmxhZ3MgJiBJUENPUktfT1BUKQorCQlvcHQgPSBpbmV0LT5jb3JrLm9wdDsKKworCWlmIChydC0+cnRfdHlwZSA9PSBSVE5fTVVMVElDQVNUKQorCQl0dGwgPSBpbmV0LT5tY190dGw7CisJZWxzZQorCQl0dGwgPSBpcF9zZWxlY3RfdHRsKGluZXQsICZydC0+dS5kc3QpOworCisJaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYi0+ZGF0YTsKKwlpcGgtPnZlcnNpb24gPSA0OworCWlwaC0+aWhsID0gNTsKKwlpZiAob3B0KSB7CisJCWlwaC0+aWhsICs9IG9wdC0+b3B0bGVuPj4yOworCQlpcF9vcHRpb25zX2J1aWxkKHNrYiwgb3B0LCBpbmV0LT5jb3JrLmFkZHIsIHJ0LCAwKTsKKwl9CisJaXBoLT50b3MgPSBpbmV0LT50b3M7CisJaXBoLT50b3RfbGVuID0gaHRvbnMoc2tiLT5sZW4pOworCWlwaC0+ZnJhZ19vZmYgPSBkZjsKKwlpZiAoIWRmKSB7CisJCV9faXBfc2VsZWN0X2lkZW50KGlwaCwgJnJ0LT51LmRzdCwgMCk7CisJfSBlbHNlIHsKKwkJaXBoLT5pZCA9IGh0b25zKGluZXQtPmlkKyspOworCX0KKwlpcGgtPnR0bCA9IHR0bDsKKwlpcGgtPnByb3RvY29sID0gc2stPnNrX3Byb3RvY29sOworCWlwaC0+c2FkZHIgPSBydC0+cnRfc3JjOworCWlwaC0+ZGFkZHIgPSBydC0+cnRfZHN0OworCWlwX3NlbmRfY2hlY2soaXBoKTsKKworCXNrYi0+cHJpb3JpdHkgPSBzay0+c2tfcHJpb3JpdHk7CisJc2tiLT5kc3QgPSBkc3RfY2xvbmUoJnJ0LT51LmRzdCk7CisKKwkvKiBOZXRmaWx0ZXIgZ2V0cyB3aG9sZSB0aGUgbm90IGZyYWdtZW50ZWQgc2tiLiAqLworCWVyciA9IE5GX0hPT0soUEZfSU5FVCwgTkZfSVBfTE9DQUxfT1VULCBza2IsIE5VTEwsIAorCQkgICAgICBza2ItPmRzdC0+ZGV2LCBkc3Rfb3V0cHV0KTsKKwlpZiAoZXJyKSB7CisJCWlmIChlcnIgPiAwKQorCQkJZXJyID0gaW5ldC0+cmVjdmVyciA/IG5ldF94bWl0X2Vycm5vKGVycikgOiAwOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJvcjsKKwl9CisKK291dDoKKwlpbmV0LT5jb3JrLmZsYWdzICY9IH5JUENPUktfT1BUOworCWlmIChpbmV0LT5jb3JrLm9wdCkgeworCQlrZnJlZShpbmV0LT5jb3JrLm9wdCk7CisJCWluZXQtPmNvcmsub3B0ID0gTlVMTDsKKwl9CisJaWYgKGluZXQtPmNvcmsucnQpIHsKKwkJaXBfcnRfcHV0KGluZXQtPmNvcmsucnQpOworCQlpbmV0LT5jb3JrLnJ0ID0gTlVMTDsKKwl9CisJcmV0dXJuIGVycjsKKworZXJyb3I6CisJSVBfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKKwlnb3RvIG91dDsKK30KKworLyoKKyAqCVRocm93IGF3YXkgYWxsIHBlbmRpbmcgZGF0YSBvbiB0aGUgc29ja2V0LgorICovCit2b2lkIGlwX2ZsdXNoX3BlbmRpbmdfZnJhbWVzKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZV90YWlsKCZzay0+c2tfd3JpdGVfcXVldWUpKSAhPSBOVUxMKQorCQlrZnJlZV9za2Ioc2tiKTsKKworCWluZXQtPmNvcmsuZmxhZ3MgJj0gfklQQ09SS19PUFQ7CisJaWYgKGluZXQtPmNvcmsub3B0KSB7CisJCWtmcmVlKGluZXQtPmNvcmsub3B0KTsKKwkJaW5ldC0+Y29yay5vcHQgPSBOVUxMOworCX0KKwlpZiAoaW5ldC0+Y29yay5ydCkgeworCQlpcF9ydF9wdXQoaW5ldC0+Y29yay5ydCk7CisJCWluZXQtPmNvcmsucnQgPSBOVUxMOworCX0KK30KKworCisvKgorICoJRmV0Y2ggZGF0YSBmcm9tIGtlcm5lbCBzcGFjZSBhbmQgZmlsbCBpbiBjaGVja3N1bSBpZiBuZWVkZWQuCisgKi8KK3N0YXRpYyBpbnQgaXBfcmVwbHlfZ2x1ZV9iaXRzKHZvaWQgKmRwdHIsIGNoYXIgKnRvLCBpbnQgb2Zmc2V0LCAKKwkJCSAgICAgIGludCBsZW4sIGludCBvZGQsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgaW50IGNzdW07CisKKwljc3VtID0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhkcHRyK29mZnNldCwgdG8sIGxlbiwgMCk7CisJc2tiLT5jc3VtID0gY3N1bV9ibG9ja19hZGQoc2tiLT5jc3VtLCBjc3VtLCBvZGQpOworCXJldHVybiAwOyAgCit9CisKKy8qIAorICoJR2VuZXJpYyBmdW5jdGlvbiB0byBzZW5kIGEgcGFja2V0IGFzIHJlcGx5IHRvIGFub3RoZXIgcGFja2V0LgorICoJVXNlZCB0byBzZW5kIFRDUCByZXNldHMgc28gZmFyLiBJQ01QIHNob3VsZCB1c2UgdGhpcyBmdW5jdGlvbiB0b28uCisgKgorICoJU2hvdWxkIHJ1biBzaW5nbGUgdGhyZWFkZWQgcGVyIHNvY2tldCBiZWNhdXNlIGl0IHVzZXMgdGhlIHNvY2sgCisgKiAgICAgCXN0cnVjdHVyZSB0byBwYXNzIGFyZ3VtZW50cy4KKyAqCisgKglMQVRFUjogc3dpdGNoIGZyb20gaXBfYnVpbGRfeG1pdCB0byBpcF9hcHBlbmRfKgorICovCit2b2lkIGlwX3NlbmRfcmVwbHkoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfcmVwbHlfYXJnICphcmcsCisJCSAgIHVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCXN0cnVjdCB7CisJCXN0cnVjdCBpcF9vcHRpb25zCW9wdDsKKwkJY2hhcgkJCWRhdGFbNDBdOworCX0gcmVwbHlvcHRzOworCXN0cnVjdCBpcGNtX2Nvb2tpZSBpcGM7CisJdTMyIGRhZGRyOworCXN0cnVjdCBydGFibGUgKnJ0ID0gKHN0cnVjdCBydGFibGUqKXNrYi0+ZHN0OworCisJaWYgKGlwX29wdGlvbnNfZWNobygmcmVwbHlvcHRzLm9wdCwgc2tiKSkKKwkJcmV0dXJuOworCisJZGFkZHIgPSBpcGMuYWRkciA9IHJ0LT5ydF9zcmM7CisJaXBjLm9wdCA9IE5VTEw7CisKKwlpZiAocmVwbHlvcHRzLm9wdC5vcHRsZW4pIHsKKwkJaXBjLm9wdCA9ICZyZXBseW9wdHMub3B0OworCisJCWlmIChpcGMub3B0LT5zcnIpCisJCQlkYWRkciA9IHJlcGx5b3B0cy5vcHQuZmFkZHI7CisJfQorCisJeworCQlzdHJ1Y3QgZmxvd2kgZmwgPSB7IC5ubF91ID0geyAuaXA0X3UgPQorCQkJCQkgICAgICB7IC5kYWRkciA9IGRhZGRyLAorCQkJCQkJLnNhZGRyID0gcnQtPnJ0X3NwZWNfZHN0LAorCQkJCQkJLnRvcyA9IFJUX1RPUyhza2ItPm5oLmlwaC0+dG9zKSB9IH0sCisJCQkJICAgIC8qIE5vdCBxdWl0ZSBjbGVhbiwgYnV0IHJpZ2h0LiAqLworCQkJCSAgICAudWxpX3UgPSB7IC5wb3J0cyA9CisJCQkJCSAgICAgICB7IC5zcG9ydCA9IHNrYi0+aC50aC0+ZGVzdCwKKwkJCQkJICAgICAgICAgLmRwb3J0ID0gc2tiLT5oLnRoLT5zb3VyY2UgfSB9LAorCQkJCSAgICAucHJvdG8gPSBzay0+c2tfcHJvdG9jb2wgfTsKKwkJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpKQorCQkJcmV0dXJuOworCX0KKworCS8qIEFuZCBsZXQgSVAgZG8gYWxsIHRoZSBoYXJkIHdvcmsuCisKKwkgICBUaGlzIGNodW5rIGlzIG5vdCByZWVudGVyYWJsZSwgaGVuY2Ugc3BpbmxvY2suCisJICAgTm90ZSB0aGF0IGl0IHVzZXMgdGhlIGZhY3QsIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKKwkgICB3aXRoIGxvY2FsbHkgZGlzYWJsZWQgQkggYW5kIHRoYXQgc2sgY2Fubm90IGJlIGFscmVhZHkgc3BpbmxvY2tlZC4KKwkgKi8KKwliaF9sb2NrX3NvY2soc2spOworCWluZXQtPnRvcyA9IHNrYi0+bmguaXBoLT50b3M7CisJc2stPnNrX3ByaW9yaXR5ID0gc2tiLT5wcmlvcml0eTsKKwlzay0+c2tfcHJvdG9jb2wgPSBza2ItPm5oLmlwaC0+cHJvdG9jb2w7CisJaXBfYXBwZW5kX2RhdGEoc2ssIGlwX3JlcGx5X2dsdWVfYml0cywgYXJnLT5pb3YtPmlvdl9iYXNlLCBsZW4sIDAsCisJCSAgICAgICAmaXBjLCBydCwgTVNHX0RPTlRXQUlUKTsKKwlpZiAoKHNrYiA9IHNrYl9wZWVrKCZzay0+c2tfd3JpdGVfcXVldWUpKSAhPSBOVUxMKSB7CisJCWlmIChhcmctPmNzdW1vZmZzZXQgPj0gMCkKKwkJCSooKHUxNiAqKXNrYi0+aC5yYXcgKyBhcmctPmNzdW1vZmZzZXQpID0gY3N1bV9mb2xkKGNzdW1fYWRkKHNrYi0+Y3N1bSwgYXJnLT5jc3VtKSk7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJaXBfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzayk7CisJfQorCisJYmhfdW5sb2NrX3NvY2soc2spOworCisJaXBfcnRfcHV0KHJ0KTsKK30KKworLyoKKyAqCUlQIHByb3RvY29sIGxheWVyIGluaXRpYWxpc2VyCisgKi8KKworc3RhdGljIHN0cnVjdCBwYWNrZXRfdHlwZSBpcF9wYWNrZXRfdHlwZSA9IHsKKwkudHlwZSA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApLAorCS5mdW5jID0gaXBfcmN2LAorfTsKKworLyoKKyAqCUlQIHJlZ2lzdGVycyB0aGUgcGFja2V0IHR5cGUgYW5kIHRoZW4gY2FsbHMgdGhlIHN1YnByb3RvY29sIGluaXRpYWxpc2VycworICovCisKK3ZvaWQgX19pbml0IGlwX2luaXQodm9pZCkKK3sKKwlkZXZfYWRkX3BhY2soJmlwX3BhY2tldF90eXBlKTsKKworCWlwX3J0X2luaXQoKTsKKwlpbmV0X2luaXRwZWVycygpOworCisjaWYgZGVmaW5lZChDT05GSUdfSVBfTVVMVElDQVNUKSAmJiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKQorCWlnbXBfbWNfcHJvY19pbml0KCk7CisjZW5kaWYKK30KKworRVhQT1JUX1NZTUJPTChpcF9maW5pc2hfb3V0cHV0KTsKK0VYUE9SVF9TWU1CT0woaXBfZnJhZ21lbnQpOworRVhQT1JUX1NZTUJPTChpcF9nZW5lcmljX2dldGZyYWcpOworRVhQT1JUX1NZTUJPTChpcF9xdWV1ZV94bWl0KTsKK0VYUE9SVF9TWU1CT0woaXBfc2VuZF9jaGVjayk7CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCitFWFBPUlRfU1lNQk9MKHN5c2N0bF9pcF9kZWZhdWx0X3R0bCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX3NvY2tnbHVlLmMgYi9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MDEyYjkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jCkBAIC0wLDAgKzEsMTA5MyBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlUaGUgSVAgdG8gQVBJIGdsdWUuCisgKgkJCisgKiBWZXJzaW9uOgkkSWQ6IGlwX3NvY2tnbHVlLmMsdiAxLjYyIDIwMDIvMDIvMDEgMjI6MDE6MDQgZGF2ZW0gRXhwICQKKyAqCisgKiBBdXRob3JzOglzZWUgaXAuYworICoKKyAqIEZpeGVzOgorICoJCU1hbnkJCToJU3BsaXQgZnJvbSBpcC5jICwgc2VlIGlwLmMgZm9yIGhpc3RvcnkuCisgKgkJTWFydGluIE1hcmVzCToJVE9TIHNldHRpbmcgZml4ZWQuCisgKgkJQWxhbiBDb3gJOglGaXhlZCBhIGNvdXBsZSBvZiBvb3BzZXMgaW4gTWFydGluJ3MgCisgKgkJCQkJVE9TIHR3ZWFrcy4KKyAqCQlNaWtlIE1jTGFnYW4JOglSb3V0aW5nIGJ5IHNvdXJjZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ljbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9pY21wLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lnbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21yb3V0ZS5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPG5ldC94ZnJtLmg+CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaW5jbHVkZSA8bmV0L3RyYW5zcF92Ni5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9lcnJxdWV1ZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgSVBfQ01TR19QS1RJTkZPCQkxCisjZGVmaW5lIElQX0NNU0dfVFRMCQkyCisjZGVmaW5lIElQX0NNU0dfVE9TCQk0CisjZGVmaW5lIElQX0NNU0dfUkVDVk9QVFMJOAorI2RlZmluZSBJUF9DTVNHX1JFVE9QVFMJCTE2CisKKy8qCisgKglTT0xfSVAgY29udHJvbCBtZXNzYWdlcy4KKyAqLworCitzdGF0aWMgdm9pZCBpcF9jbXNnX3JlY3ZfcGt0aW5mbyhzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGluX3BrdGluZm8gaW5mbzsKKwlzdHJ1Y3QgcnRhYmxlICpydCA9IChzdHJ1Y3QgcnRhYmxlICopc2tiLT5kc3Q7CisKKwlpbmZvLmlwaV9hZGRyLnNfYWRkciA9IHNrYi0+bmguaXBoLT5kYWRkcjsKKwlpZiAocnQpIHsKKwkJaW5mby5pcGlfaWZpbmRleCA9IHJ0LT5ydF9paWY7CisJCWluZm8uaXBpX3NwZWNfZHN0LnNfYWRkciA9IHJ0LT5ydF9zcGVjX2RzdDsKKwl9IGVsc2UgeworCQlpbmZvLmlwaV9pZmluZGV4ID0gMDsKKwkJaW5mby5pcGlfc3BlY19kc3Quc19hZGRyID0gMDsKKwl9CisKKwlwdXRfY21zZyhtc2csIFNPTF9JUCwgSVBfUEtUSU5GTywgc2l6ZW9mKGluZm8pLCAmaW5mbyk7Cit9CisKK3N0YXRpYyB2b2lkIGlwX2Ntc2dfcmVjdl90dGwoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCB0dGwgPSBza2ItPm5oLmlwaC0+dHRsOworCXB1dF9jbXNnKG1zZywgU09MX0lQLCBJUF9UVEwsIHNpemVvZihpbnQpLCAmdHRsKTsKK30KKworc3RhdGljIHZvaWQgaXBfY21zZ19yZWN2X3RvcyhzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcHV0X2Ntc2cobXNnLCBTT0xfSVAsIElQX1RPUywgMSwgJnNrYi0+bmguaXBoLT50b3MpOworfQorCitzdGF0aWMgdm9pZCBpcF9jbXNnX3JlY3Zfb3B0cyhzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKElQQ0Ioc2tiKS0+b3B0Lm9wdGxlbiA9PSAwKQorCQlyZXR1cm47CisKKwlwdXRfY21zZyhtc2csIFNPTF9JUCwgSVBfUkVDVk9QVFMsIElQQ0Ioc2tiKS0+b3B0Lm9wdGxlbiwgc2tiLT5uaC5pcGgrMSk7Cit9CisKKworc3RhdGljIHZvaWQgaXBfY21zZ19yZWN2X3JldG9wdHMoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXVuc2lnbmVkIGNoYXIgb3B0YnVmW3NpemVvZihzdHJ1Y3QgaXBfb3B0aW9ucykgKyA0MF07CisJc3RydWN0IGlwX29wdGlvbnMgKiBvcHQgPSAoc3RydWN0IGlwX29wdGlvbnMqKW9wdGJ1ZjsKKworCWlmIChJUENCKHNrYiktPm9wdC5vcHRsZW4gPT0gMCkKKwkJcmV0dXJuOworCisJaWYgKGlwX29wdGlvbnNfZWNobyhvcHQsIHNrYikpIHsKKwkJbXNnLT5tc2dfZmxhZ3MgfD0gTVNHX0NUUlVOQzsKKwkJcmV0dXJuOworCX0KKwlpcF9vcHRpb25zX3VuZG8ob3B0KTsKKworCXB1dF9jbXNnKG1zZywgU09MX0lQLCBJUF9SRVRPUFRTLCBvcHQtPm9wdGxlbiwgb3B0LT5fX2RhdGEpOworfQorCisKK3ZvaWQgaXBfY21zZ19yZWN2KHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhza2ItPnNrKTsKKwl1bnNpZ25lZCBmbGFncyA9IGluZXQtPmNtc2dfZmxhZ3M7CisKKwkvKiBPcmRlcmVkIGJ5IHN1cHBvc2VkIHVzYWdlIGZyZXF1ZW5jeSAqLworCWlmIChmbGFncyAmIDEpCisJCWlwX2Ntc2dfcmVjdl9wa3RpbmZvKG1zZywgc2tiKTsKKwlpZiAoKGZsYWdzPj49MSkgPT0gMCkKKwkJcmV0dXJuOworCisJaWYgKGZsYWdzICYgMSkKKwkJaXBfY21zZ19yZWN2X3R0bChtc2csIHNrYik7CisJaWYgKChmbGFncz4+PTEpID09IDApCisJCXJldHVybjsKKworCWlmIChmbGFncyAmIDEpCisJCWlwX2Ntc2dfcmVjdl90b3MobXNnLCBza2IpOworCWlmICgoZmxhZ3M+Pj0xKSA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAoZmxhZ3MgJiAxKQorCQlpcF9jbXNnX3JlY3Zfb3B0cyhtc2csIHNrYik7CisJaWYgKChmbGFncz4+PTEpID09IDApCisJCXJldHVybjsKKworCWlmIChmbGFncyAmIDEpCisJCWlwX2Ntc2dfcmVjdl9yZXRvcHRzKG1zZywgc2tiKTsKK30KKworaW50IGlwX2Ntc2dfc2VuZChzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBpcGNtX2Nvb2tpZSAqaXBjKQoreworCWludCBlcnI7CisJc3RydWN0IGNtc2doZHIgKmNtc2c7CisKKwlmb3IgKGNtc2cgPSBDTVNHX0ZJUlNUSERSKG1zZyk7IGNtc2c7IGNtc2cgPSBDTVNHX05YVEhEUihtc2csIGNtc2cpKSB7CisJCWlmICghQ01TR19PSyhtc2csIGNtc2cpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjbXNnLT5jbXNnX2xldmVsICE9IFNPTF9JUCkKKwkJCWNvbnRpbnVlOworCQlzd2l0Y2ggKGNtc2ctPmNtc2dfdHlwZSkgeworCQljYXNlIElQX1JFVE9QVFM6CisJCQllcnIgPSBjbXNnLT5jbXNnX2xlbiAtIENNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBjbXNnaGRyKSk7CisJCQllcnIgPSBpcF9vcHRpb25zX2dldCgmaXBjLT5vcHQsIENNU0dfREFUQShjbXNnKSwgZXJyIDwgNDAgPyBlcnIgOiA0MCwgMCk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCQlicmVhazsKKwkJY2FzZSBJUF9QS1RJTkZPOgorCQl7CisJCQlzdHJ1Y3QgaW5fcGt0aW5mbyAqaW5mbzsKKwkJCWlmIChjbXNnLT5jbXNnX2xlbiAhPSBDTVNHX0xFTihzaXplb2Yoc3RydWN0IGluX3BrdGluZm8pKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWluZm8gPSAoc3RydWN0IGluX3BrdGluZm8gKilDTVNHX0RBVEEoY21zZyk7CisJCQlpcGMtPm9pZiA9IGluZm8tPmlwaV9pZmluZGV4OworCQkJaXBjLT5hZGRyID0gaW5mby0+aXBpX3NwZWNfZHN0LnNfYWRkcjsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworCisvKiBTcGVjaWFsIGlucHV0IGhhbmRsZXIgZm9yIHBhY2tldHMgY2F1Z2h0IGJ5IHJvdXRlciBhbGVydCBvcHRpb24uCisgICBUaGV5IGFyZSBzZWxlY3RlZCBvbmx5IGJ5IHByb3RvY29sIGZpZWxkLCBhbmQgdGhlbiBwcm9jZXNzZWQgbGlrZWx5CisgICBsb2NhbCBvbmVzOyBidXQgb25seSBpZiBzb21lb25lIHdhbnRzIHRoZW0hIE90aGVyd2lzZSwgcm91dGVyCisgICBub3QgcnVubmluZyByc3ZwZCB3aWxsIGtpbGwgUlNWUC4KKworICAgSXQgaXMgdXNlciBsZXZlbCBwcm9ibGVtLCB3aGF0IGl0IHdpbGwgbWFrZSB3aXRoIHRoZW0uCisgICBJIGhhdmUgbm8gaWRlYSwgaG93IGl0IHdpbGwgbWFzcXVlYXJkZSBvciBOQVQgdGhlbSAoaXQgaXMgam9rZSwgam9rZSA6LSkpLAorICAgYnV0IHJlY2VpdmVyIHNob3VsZCBiZSBlbm91Z2ggY2xldmVyIGYuZS4gdG8gZm9yd2FyZCBtdHJhY2UgcmVxdWVzdHMsCisgICBzZW50IHRvIG11bHRpY2FzdCBncm91cCB0byByZWFjaCBkZXN0aW5hdGlvbiBkZXNpZ25hdGVkIHJvdXRlci4KKyAqLworc3RydWN0IGlwX3JhX2NoYWluICppcF9yYV9jaGFpbjsKK0RFRklORV9SV0xPQ0soaXBfcmFfbG9jayk7CisKK2ludCBpcF9yYV9jb250cm9sKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgY2hhciBvbiwgdm9pZCAoKmRlc3RydWN0b3IpKHN0cnVjdCBzb2NrICopKQoreworCXN0cnVjdCBpcF9yYV9jaGFpbiAqcmEsICpuZXdfcmEsICoqcmFwOworCisJaWYgKHNrLT5za190eXBlICE9IFNPQ0tfUkFXIHx8IGluZXRfc2soc2spLT5udW0gPT0gSVBQUk9UT19SQVcpCisJCXJldHVybiAtRUlOVkFMOworCisJbmV3X3JhID0gb24gPyBrbWFsbG9jKHNpemVvZigqbmV3X3JhKSwgR0ZQX0tFUk5FTCkgOiBOVUxMOworCisJd3JpdGVfbG9ja19iaCgmaXBfcmFfbG9jayk7CisJZm9yIChyYXAgPSAmaXBfcmFfY2hhaW47IChyYT0qcmFwKSAhPSBOVUxMOyByYXAgPSAmcmEtPm5leHQpIHsKKwkJaWYgKHJhLT5zayA9PSBzaykgeworCQkJaWYgKG9uKSB7CisJCQkJd3JpdGVfdW5sb2NrX2JoKCZpcF9yYV9sb2NrKTsKKwkJCQlpZiAobmV3X3JhKQorCQkJCQlrZnJlZShuZXdfcmEpOworCQkJCXJldHVybiAtRUFERFJJTlVTRTsKKwkJCX0KKwkJCSpyYXAgPSByYS0+bmV4dDsKKwkJCXdyaXRlX3VubG9ja19iaCgmaXBfcmFfbG9jayk7CisKKwkJCWlmIChyYS0+ZGVzdHJ1Y3RvcikKKwkJCQlyYS0+ZGVzdHJ1Y3Rvcihzayk7CisJCQlzb2NrX3B1dChzayk7CisJCQlrZnJlZShyYSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAobmV3X3JhID09IE5VTEwpIHsKKwkJd3JpdGVfdW5sb2NrX2JoKCZpcF9yYV9sb2NrKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKwluZXdfcmEtPnNrID0gc2s7CisJbmV3X3JhLT5kZXN0cnVjdG9yID0gZGVzdHJ1Y3RvcjsKKworCW5ld19yYS0+bmV4dCA9IHJhOworCSpyYXAgPSBuZXdfcmE7CisJc29ja19ob2xkKHNrKTsKKwl3cml0ZV91bmxvY2tfYmgoJmlwX3JhX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaXBfaWNtcF9lcnJvcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIGludCBlcnIsIAorCQkgICB1MTYgcG9ydCwgdTMyIGluZm8sIHU4ICpwYXlsb2FkKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlzdHJ1Y3Qgc29ja19leHRlcnJfc2tiICpzZXJyOworCisJaWYgKCFpbmV0LT5yZWN2ZXJyKQorCQlyZXR1cm47CisKKwlza2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuOworCisJc2VyciA9IFNLQl9FWFRfRVJSKHNrYik7ICAKKwlzZXJyLT5lZS5lZV9lcnJubyA9IGVycjsKKwlzZXJyLT5lZS5lZV9vcmlnaW4gPSBTT19FRV9PUklHSU5fSUNNUDsKKwlzZXJyLT5lZS5lZV90eXBlID0gc2tiLT5oLmljbXBoLT50eXBlOyAKKwlzZXJyLT5lZS5lZV9jb2RlID0gc2tiLT5oLmljbXBoLT5jb2RlOworCXNlcnItPmVlLmVlX3BhZCA9IDA7CisJc2Vyci0+ZWUuZWVfaW5mbyA9IGluZm87CisJc2Vyci0+ZWUuZWVfZGF0YSA9IDA7CisJc2Vyci0+YWRkcl9vZmZzZXQgPSAodTgqKSYoKChzdHJ1Y3QgaXBoZHIqKShza2ItPmguaWNtcGgrMSkpLT5kYWRkcikgLSBza2ItPm5oLnJhdzsKKwlzZXJyLT5wb3J0ID0gcG9ydDsKKworCXNrYi0+aC5yYXcgPSBwYXlsb2FkOworCWlmICghc2tiX3B1bGwoc2tiLCBwYXlsb2FkIC0gc2tiLT5kYXRhKSB8fAorCSAgICBzb2NrX3F1ZXVlX2Vycl9za2Ioc2ssIHNrYikpCisJCWtmcmVlX3NrYihza2IpOworfQorCit2b2lkIGlwX2xvY2FsX2Vycm9yKHN0cnVjdCBzb2NrICpzaywgaW50IGVyciwgdTMyIGRhZGRyLCB1MTYgcG9ydCwgdTMyIGluZm8pCit7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCXN0cnVjdCBzb2NrX2V4dGVycl9za2IgKnNlcnI7CisJc3RydWN0IGlwaGRyICppcGg7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWlmICghaW5ldC0+cmVjdmVycikKKwkJcmV0dXJuOworCisJc2tiID0gYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgaXBoZHIpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuOworCisJaXBoID0gKHN0cnVjdCBpcGhkciopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKKwlza2ItPm5oLmlwaCA9IGlwaDsKKwlpcGgtPmRhZGRyID0gZGFkZHI7CisKKwlzZXJyID0gU0tCX0VYVF9FUlIoc2tiKTsgIAorCXNlcnItPmVlLmVlX2Vycm5vID0gZXJyOworCXNlcnItPmVlLmVlX29yaWdpbiA9IFNPX0VFX09SSUdJTl9MT0NBTDsKKwlzZXJyLT5lZS5lZV90eXBlID0gMDsgCisJc2Vyci0+ZWUuZWVfY29kZSA9IDA7CisJc2Vyci0+ZWUuZWVfcGFkID0gMDsKKwlzZXJyLT5lZS5lZV9pbmZvID0gaW5mbzsKKwlzZXJyLT5lZS5lZV9kYXRhID0gMDsKKwlzZXJyLT5hZGRyX29mZnNldCA9ICh1OCopJmlwaC0+ZGFkZHIgLSBza2ItPm5oLnJhdzsKKwlzZXJyLT5wb3J0ID0gcG9ydDsKKworCXNrYi0+aC5yYXcgPSBza2ItPnRhaWw7CisJX19za2JfcHVsbChza2IsIHNrYi0+dGFpbCAtIHNrYi0+ZGF0YSk7CisKKwlpZiAoc29ja19xdWV1ZV9lcnJfc2tiKHNrLCBza2IpKQorCQlrZnJlZV9za2Ioc2tiKTsKK30KKworLyogCisgKglIYW5kbGUgTVNHX0VSUlFVRVVFCisgKi8KK2ludCBpcF9yZWN2X2Vycm9yKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLCBpbnQgbGVuKQoreworCXN0cnVjdCBzb2NrX2V4dGVycl9za2IgKnNlcnI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnNrYjI7CisJc3RydWN0IHNvY2thZGRyX2luICpzaW47CisJc3RydWN0IHsKKwkJc3RydWN0IHNvY2tfZXh0ZW5kZWRfZXJyIGVlOworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4JIG9mZmVuZGVyOworCX0gZXJyaGRyOworCWludCBlcnI7CisJaW50IGNvcGllZDsKKworCWVyciA9IC1FQUdBSU47CisJc2tiID0gc2tiX2RlcXVldWUoJnNrLT5za19lcnJvcl9xdWV1ZSk7CisJaWYgKHNrYiA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWNvcGllZCA9IHNrYi0+bGVuOworCWlmIChjb3BpZWQgPiBsZW4pIHsKKwkJbXNnLT5tc2dfZmxhZ3MgfD0gTVNHX1RSVU5DOworCQljb3BpZWQgPSBsZW47CisJfQorCWVyciA9IHNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgMCwgbXNnLT5tc2dfaW92LCBjb3BpZWQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZyZWVfc2tiOworCisJc29ja19yZWN2X3RpbWVzdGFtcChtc2csIHNrLCBza2IpOworCisJc2VyciA9IFNLQl9FWFRfRVJSKHNrYik7CisKKwlzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopbXNnLT5tc2dfbmFtZTsKKwlpZiAoc2luKSB7CisJCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCXNpbi0+c2luX2FkZHIuc19hZGRyID0gKih1MzIqKShza2ItPm5oLnJhdyArIHNlcnItPmFkZHJfb2Zmc2V0KTsKKwkJc2luLT5zaW5fcG9ydCA9IHNlcnItPnBvcnQ7CisJCW1lbXNldCgmc2luLT5zaW5femVybywgMCwgc2l6ZW9mKHNpbi0+c2luX3plcm8pKTsKKwl9CisKKwltZW1jcHkoJmVycmhkci5lZSwgJnNlcnItPmVlLCBzaXplb2Yoc3RydWN0IHNvY2tfZXh0ZW5kZWRfZXJyKSk7CisJc2luID0gJmVycmhkci5vZmZlbmRlcjsKKwlzaW4tPnNpbl9mYW1pbHkgPSBBRl9VTlNQRUM7CisJaWYgKHNlcnItPmVlLmVlX29yaWdpbiA9PSBTT19FRV9PUklHSU5fSUNNUCkgeworCQlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisKKwkJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSBza2ItPm5oLmlwaC0+c2FkZHI7CisJCXNpbi0+c2luX3BvcnQgPSAwOworCQltZW1zZXQoJnNpbi0+c2luX3plcm8sIDAsIHNpemVvZihzaW4tPnNpbl96ZXJvKSk7CisJCWlmIChpbmV0LT5jbXNnX2ZsYWdzKQorCQkJaXBfY21zZ19yZWN2KG1zZywgc2tiKTsKKwl9CisKKwlwdXRfY21zZyhtc2csIFNPTF9JUCwgSVBfUkVDVkVSUiwgc2l6ZW9mKGVycmhkciksICZlcnJoZHIpOworCisJLyogTm93IHdlIGNvdWxkIHRyeSB0byBkdW1wIG9mZmVuZGVkIHBhY2tldCBvcHRpb25zICovCisKKwltc2ctPm1zZ19mbGFncyB8PSBNU0dfRVJSUVVFVUU7CisJZXJyID0gY29waWVkOworCisJLyogUmVzZXQgYW5kIHJlZ2VuZXJhdGUgc29ja2V0IGVycm9yICovCisJc3Bpbl9sb2NrX2lycSgmc2stPnNrX2Vycm9yX3F1ZXVlLmxvY2spOworCXNrLT5za19lcnIgPSAwOworCWlmICgoc2tiMiA9IHNrYl9wZWVrKCZzay0+c2tfZXJyb3JfcXVldWUpKSAhPSBOVUxMKSB7CisJCXNrLT5za19lcnIgPSBTS0JfRVhUX0VSUihza2IyKS0+ZWUuZWVfZXJybm87CisJCXNwaW5fdW5sb2NrX2lycSgmc2stPnNrX2Vycm9yX3F1ZXVlLmxvY2spOworCQlzay0+c2tfZXJyb3JfcmVwb3J0KHNrKTsKKwl9IGVsc2UKKwkJc3Bpbl91bmxvY2tfaXJxKCZzay0+c2tfZXJyb3JfcXVldWUubG9jayk7CisKK291dF9mcmVlX3NrYjoJCisJa2ZyZWVfc2tiKHNrYik7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworCisvKgorICoJU29ja2V0IG9wdGlvbiBjb2RlIGZvciBJUC4gVGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBsaW5lIGFmdGVyIGFueSBUQ1AsVURQIGV0YyBvcHRpb25zIG9uCisgKglhbiBJUCBzb2NrZXQuCisgKi8KKworaW50IGlwX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlpbnQgdmFsPTAsZXJyOworCisJaWYgKGxldmVsICE9IFNPTF9JUCkKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKworCWlmICgoKDE8PG9wdG5hbWUpICYgKCgxPDxJUF9QS1RJTkZPKSB8ICgxPDxJUF9SRUNWVFRMKSB8IAorCQkJICAgICgxPDxJUF9SRUNWT1BUUykgfCAoMTw8SVBfUkVDVlRPUykgfCAKKwkJCSAgICAoMTw8SVBfUkVUT1BUUykgfCAoMTw8SVBfVE9TKSB8IAorCQkJICAgICgxPDxJUF9UVEwpIHwgKDE8PElQX0hEUklOQ0wpIHwgCisJCQkgICAgKDE8PElQX01UVV9ESVNDT1ZFUikgfCAoMTw8SVBfUkVDVkVSUikgfCAKKwkJCSAgICAoMTw8SVBfUk9VVEVSX0FMRVJUKSB8ICgxPDxJUF9GUkVFQklORCkpKSB8fCAKKwkJCQlvcHRuYW1lID09IElQX01VTFRJQ0FTVF9UVEwgfHwgCisJCQkJb3B0bmFtZSA9PSBJUF9NVUxUSUNBU1RfTE9PUCkgeyAKKwkJaWYgKG9wdGxlbiA+PSBzaXplb2YoaW50KSkgeworCQkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKikgb3B0dmFsKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfSBlbHNlIGlmIChvcHRsZW4gPj0gc2l6ZW9mKGNoYXIpKSB7CisJCQl1bnNpZ25lZCBjaGFyIHVjdmFsOworCisJCQlpZiAoZ2V0X3VzZXIodWN2YWwsICh1bnNpZ25lZCBjaGFyIF9fdXNlciAqKSBvcHR2YWwpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJdmFsID0gKGludCkgdWN2YWw7CisJCX0KKwl9CisKKwkvKiBJZiBvcHRsZW49PTAsIGl0IGlzIGVxdWl2YWxlbnQgdG8gdmFsID09IDAgKi8KKworI2lmZGVmIENPTkZJR19JUF9NUk9VVEUKKwlpZiAob3B0bmFtZSA+PSBNUlRfQkFTRSAmJiBvcHRuYW1lIDw9IChNUlRfQkFTRSArIDEwKSkKKwkJcmV0dXJuIGlwX21yb3V0ZV9zZXRzb2Nrb3B0KHNrLG9wdG5hbWUsb3B0dmFsLG9wdGxlbik7CisjZW5kaWYKKworCWVyciA9IDA7CisJbG9ja19zb2NrKHNrKTsKKworCXN3aXRjaCAob3B0bmFtZSkgeworCQljYXNlIElQX09QVElPTlM6CisJCXsKKwkJCXN0cnVjdCBpcF9vcHRpb25zICogb3B0ID0gTlVMTDsKKwkJCWlmIChvcHRsZW4gPiA0MCB8fCBvcHRsZW4gPCAwKQorCQkJCWdvdG8gZV9pbnZhbDsKKwkJCWVyciA9IGlwX29wdGlvbnNfZ2V0KCZvcHQsIG9wdHZhbCwgb3B0bGVuLCAxKTsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisJCQlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19TVFJFQU0pIHsKKwkJCQlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwkJCQlpZiAoc2stPnNrX2ZhbWlseSA9PSBQRl9JTkVUIHx8CisJCQkJICAgICghKCgxIDw8IHNrLT5za19zdGF0ZSkgJgorCQkJCSAgICAgICAoVENQRl9MSVNURU4gfCBUQ1BGX0NMT1NFKSkgJiYKKwkJCQkgICAgIGluZXQtPmRhZGRyICE9IExPT1BCQUNLNF9JUFY2KSkgeworI2VuZGlmCisJCQkJCWlmIChpbmV0LT5vcHQpCisJCQkJCQl0cC0+ZXh0X2hlYWRlcl9sZW4gLT0gaW5ldC0+b3B0LT5vcHRsZW47CisJCQkJCWlmIChvcHQpCisJCQkJCQl0cC0+ZXh0X2hlYWRlcl9sZW4gKz0gb3B0LT5vcHRsZW47CisJCQkJCXRjcF9zeW5jX21zcyhzaywgdHAtPnBtdHVfY29va2llKTsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwkJCQl9CisjZW5kaWYKKwkJCX0KKwkJCW9wdCA9IHhjaGcoJmluZXQtPm9wdCwgb3B0KTsKKwkJCWlmIChvcHQpCisJCQkJa2ZyZWUob3B0KTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgSVBfUEtUSU5GTzoKKwkJCWlmICh2YWwpCisJCQkJaW5ldC0+Y21zZ19mbGFncyB8PSBJUF9DTVNHX1BLVElORk87CisJCQllbHNlCisJCQkJaW5ldC0+Y21zZ19mbGFncyAmPSB+SVBfQ01TR19QS1RJTkZPOworCQkJYnJlYWs7CisJCWNhc2UgSVBfUkVDVlRUTDoKKwkJCWlmICh2YWwpCisJCQkJaW5ldC0+Y21zZ19mbGFncyB8PSAgSVBfQ01TR19UVEw7CisJCQllbHNlCisJCQkJaW5ldC0+Y21zZ19mbGFncyAmPSB+SVBfQ01TR19UVEw7CisJCQlicmVhazsKKwkJY2FzZSBJUF9SRUNWVE9TOgorCQkJaWYgKHZhbCkKKwkJCQlpbmV0LT5jbXNnX2ZsYWdzIHw9ICBJUF9DTVNHX1RPUzsKKwkJCWVsc2UKKwkJCQlpbmV0LT5jbXNnX2ZsYWdzICY9IH5JUF9DTVNHX1RPUzsKKwkJCWJyZWFrOworCQljYXNlIElQX1JFQ1ZPUFRTOgorCQkJaWYgKHZhbCkKKwkJCQlpbmV0LT5jbXNnX2ZsYWdzIHw9ICBJUF9DTVNHX1JFQ1ZPUFRTOworCQkJZWxzZQorCQkJCWluZXQtPmNtc2dfZmxhZ3MgJj0gfklQX0NNU0dfUkVDVk9QVFM7CisJCQlicmVhazsKKwkJY2FzZSBJUF9SRVRPUFRTOgorCQkJaWYgKHZhbCkKKwkJCQlpbmV0LT5jbXNnX2ZsYWdzIHw9IElQX0NNU0dfUkVUT1BUUzsKKwkJCWVsc2UKKwkJCQlpbmV0LT5jbXNnX2ZsYWdzICY9IH5JUF9DTVNHX1JFVE9QVFM7CisJCQlicmVhazsKKwkJY2FzZSBJUF9UT1M6CS8qIFRoaXMgc2V0cyBib3RoIFRPUyBhbmQgUHJlY2VkZW5jZSAqLworCQkJaWYgKHNrLT5za190eXBlID09IFNPQ0tfU1RSRUFNKSB7CisJCQkJdmFsICY9IH4zOworCQkJCXZhbCB8PSBpbmV0LT50b3MgJiAzOworCQkJfQorCQkJaWYgKElQVE9TX1BSRUModmFsKSA+PSBJUFRPU19QUkVDX0NSSVRJQ19FQ1AgJiYgCisJCQkgICAgIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCQllcnIgPSAtRVBFUk07CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaW5ldC0+dG9zICE9IHZhbCkgeworCQkJCWluZXQtPnRvcyA9IHZhbDsKKwkJCQlzay0+c2tfcHJpb3JpdHkgPSBydF90b3MycHJpb3JpdHkodmFsKTsKKwkJCQlza19kc3RfcmVzZXQoc2spOyAKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIElQX1RUTDoKKwkJCWlmIChvcHRsZW48MSkKKwkJCQlnb3RvIGVfaW52YWw7CisJCQlpZiAodmFsICE9IC0xICYmICh2YWwgPCAxIHx8IHZhbD4yNTUpKQorCQkJCWdvdG8gZV9pbnZhbDsKKwkJCWluZXQtPnVjX3R0bCA9IHZhbDsKKwkJCWJyZWFrOworCQljYXNlIElQX0hEUklOQ0w6CisJCQlpZiAoc2stPnNrX3R5cGUgIT0gU09DS19SQVcpIHsKKwkJCQllcnIgPSAtRU5PUFJPVE9PUFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpbmV0LT5oZHJpbmNsID0gdmFsID8gMSA6IDA7CisJCQlicmVhazsKKwkJY2FzZSBJUF9NVFVfRElTQ09WRVI6CisJCQlpZiAodmFsPDAgfHwgdmFsPjIpCisJCQkJZ290byBlX2ludmFsOworCQkJaW5ldC0+cG10dWRpc2MgPSB2YWw7CisJCQlicmVhazsKKwkJY2FzZSBJUF9SRUNWRVJSOgorCQkJaW5ldC0+cmVjdmVyciA9ICEhdmFsOworCQkJaWYgKCF2YWwpCisJCQkJc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfZXJyb3JfcXVldWUpOworCQkJYnJlYWs7CisJCWNhc2UgSVBfTVVMVElDQVNUX1RUTDoKKwkJCWlmIChzay0+c2tfdHlwZSA9PSBTT0NLX1NUUkVBTSkKKwkJCQlnb3RvIGVfaW52YWw7CisJCQlpZiAob3B0bGVuPDEpCisJCQkJZ290byBlX2ludmFsOworCQkJaWYgKHZhbD09LTEpCisJCQkJdmFsID0gMTsKKwkJCWlmICh2YWwgPCAwIHx8IHZhbCA+IDI1NSkKKwkJCQlnb3RvIGVfaW52YWw7CisJCQlpbmV0LT5tY190dGwgPSB2YWw7CisJICAgICAgICAgICAgICAgIGJyZWFrOworCQljYXNlIElQX01VTFRJQ0FTVF9MT09QOiAKKwkJCWlmIChvcHRsZW48MSkKKwkJCQlnb3RvIGVfaW52YWw7CisJCQlpbmV0LT5tY19sb29wID0gISF2YWw7CisJICAgICAgICAgICAgICAgIGJyZWFrOworCQljYXNlIElQX01VTFRJQ0FTVF9JRjogCisJCXsKKwkJCXN0cnVjdCBpcF9tcmVxbiBtcmVxOworCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisKKwkJCWlmIChzay0+c2tfdHlwZSA9PSBTT0NLX1NUUkVBTSkKKwkJCQlnb3RvIGVfaW52YWw7CisJCQkvKgorCQkJICoJQ2hlY2sgdGhlIGFyZ3VtZW50cyBhcmUgYWxsb3dhYmxlCisJCQkgKi8KKworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWlmIChvcHRsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpcF9tcmVxbikpIHsKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIoJm1yZXEsb3B0dmFsLHNpemVvZihtcmVxKSkpCisJCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQltZW1zZXQoJm1yZXEsIDAsIHNpemVvZihtcmVxKSk7CisJCQkJaWYgKG9wdGxlbiA+PSBzaXplb2Yoc3RydWN0IGluX2FkZHIpICYmCisJCQkJICAgIGNvcHlfZnJvbV91c2VyKCZtcmVxLmltcl9hZGRyZXNzLG9wdHZhbCxzaXplb2Yoc3RydWN0IGluX2FkZHIpKSkKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICghbXJlcS5pbXJfaWZpbmRleCkgeworCQkJCWlmIChtcmVxLmltcl9hZGRyZXNzLnNfYWRkciA9PSBJTkFERFJfQU5ZKSB7CisJCQkJCWluZXQtPm1jX2luZGV4ID0gMDsKKwkJCQkJaW5ldC0+bWNfYWRkciAgPSAwOworCQkJCQllcnIgPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZGV2ID0gaXBfZGV2X2ZpbmQobXJlcS5pbXJfYWRkcmVzcy5zX2FkZHIpOworCQkJCWlmIChkZXYpIHsKKwkJCQkJbXJlcS5pbXJfaWZpbmRleCA9IGRldi0+aWZpbmRleDsKKwkJCQkJZGV2X3B1dChkZXYpOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWRldiA9IF9fZGV2X2dldF9ieV9pbmRleChtcmVxLmltcl9pZmluZGV4KTsKKworCisJCQllcnIgPSAtRUFERFJOT1RBVkFJTDsKKwkJCWlmICghZGV2KQorCQkJCWJyZWFrOworCisJCQllcnIgPSAtRUlOVkFMOworCQkJaWYgKHNrLT5za19ib3VuZF9kZXZfaWYgJiYKKwkJCSAgICBtcmVxLmltcl9pZmluZGV4ICE9IHNrLT5za19ib3VuZF9kZXZfaWYpCisJCQkJYnJlYWs7CisKKwkJCWluZXQtPm1jX2luZGV4ID0gbXJlcS5pbXJfaWZpbmRleDsKKwkJCWluZXQtPm1jX2FkZHIgID0gbXJlcS5pbXJfYWRkcmVzcy5zX2FkZHI7CisJCQllcnIgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIElQX0FERF9NRU1CRVJTSElQOgorCQljYXNlIElQX0RST1BfTUVNQkVSU0hJUDogCisJCXsKKwkJCXN0cnVjdCBpcF9tcmVxbiBtcmVxOworCisJCQlpZiAob3B0bGVuIDwgc2l6ZW9mKHN0cnVjdCBpcF9tcmVxKSkKKwkJCQlnb3RvIGVfaW52YWw7CisJCQllcnIgPSAtRUZBVUxUOworCQkJaWYgKG9wdGxlbiA+PSBzaXplb2Yoc3RydWN0IGlwX21yZXFuKSkgeworCQkJCWlmKGNvcHlfZnJvbV91c2VyKCZtcmVxLG9wdHZhbCxzaXplb2YobXJlcSkpKQorCQkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJbWVtc2V0KCZtcmVxLCAwLCBzaXplb2YobXJlcSkpOworCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmbXJlcSxvcHR2YWwsc2l6ZW9mKHN0cnVjdCBpcF9tcmVxKSkpCisJCQkJCWJyZWFrOyAKKwkJCX0KKworCQkJaWYgKG9wdG5hbWUgPT0gSVBfQUREX01FTUJFUlNISVApCisJCQkJZXJyID0gaXBfbWNfam9pbl9ncm91cChzaywgJm1yZXEpOworCQkJZWxzZQorCQkJCWVyciA9IGlwX21jX2xlYXZlX2dyb3VwKHNrLCAmbXJlcSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIElQX01TRklMVEVSOgorCQl7CisJCQlleHRlcm4gaW50IHN5c2N0bF9vcHRtZW1fbWF4OworCQkJZXh0ZXJuIGludCBzeXNjdGxfaWdtcF9tYXhfbXNmOworCQkJc3RydWN0IGlwX21zZmlsdGVyICptc2Y7CisKKwkJCWlmIChvcHRsZW4gPCBJUF9NU0ZJTFRFUl9TSVpFKDApKQorCQkJCWdvdG8gZV9pbnZhbDsKKwkJCWlmIChvcHRsZW4gPiBzeXNjdGxfb3B0bWVtX21heCkgeworCQkJCWVyciA9IC1FTk9CVUZTOworCQkJCWJyZWFrOworCQkJfQorCQkJbXNmID0gKHN0cnVjdCBpcF9tc2ZpbHRlciAqKWttYWxsb2Mob3B0bGVuLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChtc2YgPT0gMCkgeworCQkJCWVyciA9IC1FTk9CVUZTOworCQkJCWJyZWFrOworCQkJfQorCQkJZXJyID0gLUVGQVVMVDsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihtc2YsIG9wdHZhbCwgb3B0bGVuKSkgeworCQkJCWtmcmVlKG1zZik7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBudW1zcmMgPj0gKDFHLTQpIG92ZXJmbG93IGluIDMyIGJpdHMgKi8KKwkJCWlmIChtc2YtPmltc2ZfbnVtc3JjID49IDB4M2ZmZmZmZmNVIHx8CisJCQkgICAgbXNmLT5pbXNmX251bXNyYyA+IHN5c2N0bF9pZ21wX21heF9tc2YpIHsKKwkJCQlrZnJlZShtc2YpOworCQkJCWVyciA9IC1FTk9CVUZTOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKElQX01TRklMVEVSX1NJWkUobXNmLT5pbXNmX251bXNyYykgPiBvcHRsZW4pIHsKKwkJCQlrZnJlZShtc2YpOworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQllcnIgPSBpcF9tY19tc2ZpbHRlcihzaywgbXNmLCAwKTsKKwkJCWtmcmVlKG1zZik7CisJCQlicmVhazsKKwkJfQorCQljYXNlIElQX0JMT0NLX1NPVVJDRToKKwkJY2FzZSBJUF9VTkJMT0NLX1NPVVJDRToKKwkJY2FzZSBJUF9BRERfU09VUkNFX01FTUJFUlNISVA6CisJCWNhc2UgSVBfRFJPUF9TT1VSQ0VfTUVNQkVSU0hJUDoKKwkJeworCQkJc3RydWN0IGlwX21yZXFfc291cmNlIG1yZXFzOworCQkJaW50IG9tb2RlLCBhZGQ7CisKKwkJCWlmIChvcHRsZW4gIT0gc2l6ZW9mKHN0cnVjdCBpcF9tcmVxX3NvdXJjZSkpCisJCQkJZ290byBlX2ludmFsOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZtcmVxcywgb3B0dmFsLCBzaXplb2YobXJlcXMpKSkgeworCQkJCWVyciA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAob3B0bmFtZSA9PSBJUF9CTE9DS19TT1VSQ0UpIHsKKwkJCQlvbW9kZSA9IE1DQVNUX0VYQ0xVREU7CisJCQkJYWRkID0gMTsKKwkJCX0gZWxzZSBpZiAob3B0bmFtZSA9PSBJUF9VTkJMT0NLX1NPVVJDRSkgeworCQkJCW9tb2RlID0gTUNBU1RfRVhDTFVERTsKKwkJCQlhZGQgPSAwOworCQkJfSBlbHNlIGlmIChvcHRuYW1lID09IElQX0FERF9TT1VSQ0VfTUVNQkVSU0hJUCkgeworCQkJCXN0cnVjdCBpcF9tcmVxbiBtcmVxOworCisJCQkJbXJlcS5pbXJfbXVsdGlhZGRyLnNfYWRkciA9IG1yZXFzLmltcl9tdWx0aWFkZHI7CisJCQkJbXJlcS5pbXJfYWRkcmVzcy5zX2FkZHIgPSBtcmVxcy5pbXJfaW50ZXJmYWNlOworCQkJCW1yZXEuaW1yX2lmaW5kZXggPSAwOworCQkJCWVyciA9IGlwX21jX2pvaW5fZ3JvdXAoc2ssICZtcmVxKTsKKwkJCQlpZiAoZXJyKQorCQkJCQlicmVhazsKKwkJCQlvbW9kZSA9IE1DQVNUX0lOQ0xVREU7CisJCQkJYWRkID0gMTsKKwkJCX0gZWxzZSAvKklQX0RST1BfU09VUkNFX01FTUJFUlNISVAgKi8geworCQkJCW9tb2RlID0gTUNBU1RfSU5DTFVERTsKKwkJCQlhZGQgPSAwOworCQkJfQorCQkJZXJyID0gaXBfbWNfc291cmNlKGFkZCwgb21vZGUsIHNrLCAmbXJlcXMsIDApOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBNQ0FTVF9KT0lOX0dST1VQOgorCQljYXNlIE1DQVNUX0xFQVZFX0dST1VQOiAKKwkJeworCQkJc3RydWN0IGdyb3VwX3JlcSBncmVxOworCQkJc3RydWN0IHNvY2thZGRyX2luICpwc2luOworCQkJc3RydWN0IGlwX21yZXFuIG1yZXE7CisKKwkJCWlmIChvcHRsZW4gPCBzaXplb2Yoc3RydWN0IGdyb3VwX3JlcSkpCisJCQkJZ290byBlX2ludmFsOworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWlmKGNvcHlfZnJvbV91c2VyKCZncmVxLCBvcHR2YWwsIHNpemVvZihncmVxKSkpCisJCQkJYnJlYWs7CisJCQlwc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZncmVxLmdyX2dyb3VwOworCQkJaWYgKHBzaW4tPnNpbl9mYW1pbHkgIT0gQUZfSU5FVCkKKwkJCQlnb3RvIGVfaW52YWw7CisJCQltZW1zZXQoJm1yZXEsIDAsIHNpemVvZihtcmVxKSk7CisJCQltcmVxLmltcl9tdWx0aWFkZHIgPSBwc2luLT5zaW5fYWRkcjsKKwkJCW1yZXEuaW1yX2lmaW5kZXggPSBncmVxLmdyX2ludGVyZmFjZTsKKworCQkJaWYgKG9wdG5hbWUgPT0gTUNBU1RfSk9JTl9HUk9VUCkKKwkJCQllcnIgPSBpcF9tY19qb2luX2dyb3VwKHNrLCAmbXJlcSk7CisJCQllbHNlCisJCQkJZXJyID0gaXBfbWNfbGVhdmVfZ3JvdXAoc2ssICZtcmVxKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgTUNBU1RfSk9JTl9TT1VSQ0VfR1JPVVA6CisJCWNhc2UgTUNBU1RfTEVBVkVfU09VUkNFX0dST1VQOgorCQljYXNlIE1DQVNUX0JMT0NLX1NPVVJDRToKKwkJY2FzZSBNQ0FTVF9VTkJMT0NLX1NPVVJDRToKKwkJeworCQkJc3RydWN0IGdyb3VwX3NvdXJjZV9yZXEgZ3JlcXM7CisJCQlzdHJ1Y3QgaXBfbXJlcV9zb3VyY2UgbXJlcXM7CisJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnBzaW47CisJCQlpbnQgb21vZGUsIGFkZDsKKworCQkJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IGdyb3VwX3NvdXJjZV9yZXEpKQorCQkJCWdvdG8gZV9pbnZhbDsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmZ3JlcXMsIG9wdHZhbCwgc2l6ZW9mKGdyZXFzKSkpIHsKKwkJCQllcnIgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGdyZXFzLmdzcl9ncm91cC5zc19mYW1pbHkgIT0gQUZfSU5FVCB8fAorCQkJICAgIGdyZXFzLmdzcl9zb3VyY2Uuc3NfZmFtaWx5ICE9IEFGX0lORVQpIHsKKwkJCQllcnIgPSAtRUFERFJOT1RBVkFJTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJmdyZXFzLmdzcl9ncm91cDsKKwkJCW1yZXFzLmltcl9tdWx0aWFkZHIgPSBwc2luLT5zaW5fYWRkci5zX2FkZHI7CisJCQlwc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZncmVxcy5nc3Jfc291cmNlOworCQkJbXJlcXMuaW1yX3NvdXJjZWFkZHIgPSBwc2luLT5zaW5fYWRkci5zX2FkZHI7CisJCQltcmVxcy5pbXJfaW50ZXJmYWNlID0gMDsgLyogdXNlIGluZGV4IGZvciBtY19zb3VyY2UgKi8KKworCQkJaWYgKG9wdG5hbWUgPT0gTUNBU1RfQkxPQ0tfU09VUkNFKSB7CisJCQkJb21vZGUgPSBNQ0FTVF9FWENMVURFOworCQkJCWFkZCA9IDE7CisJCQl9IGVsc2UgaWYgKG9wdG5hbWUgPT0gTUNBU1RfVU5CTE9DS19TT1VSQ0UpIHsKKwkJCQlvbW9kZSA9IE1DQVNUX0VYQ0xVREU7CisJCQkJYWRkID0gMDsKKwkJCX0gZWxzZSBpZiAob3B0bmFtZSA9PSBNQ0FTVF9KT0lOX1NPVVJDRV9HUk9VUCkgeworCQkJCXN0cnVjdCBpcF9tcmVxbiBtcmVxOworCisJCQkJcHNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmZ3JlcXMuZ3NyX2dyb3VwOworCQkJCW1yZXEuaW1yX211bHRpYWRkciA9IHBzaW4tPnNpbl9hZGRyOworCQkJCW1yZXEuaW1yX2FkZHJlc3Muc19hZGRyID0gMDsKKwkJCQltcmVxLmltcl9pZmluZGV4ID0gZ3JlcXMuZ3NyX2ludGVyZmFjZTsKKwkJCQllcnIgPSBpcF9tY19qb2luX2dyb3VwKHNrLCAmbXJlcSk7CisJCQkJaWYgKGVycikKKwkJCQkJYnJlYWs7CisJCQkJZ3JlcXMuZ3NyX2ludGVyZmFjZSA9IG1yZXEuaW1yX2lmaW5kZXg7CisJCQkJb21vZGUgPSBNQ0FTVF9JTkNMVURFOworCQkJCWFkZCA9IDE7CisJCQl9IGVsc2UgLyogTUNBU1RfTEVBVkVfU09VUkNFX0dST1VQICovIHsKKwkJCQlvbW9kZSA9IE1DQVNUX0lOQ0xVREU7CisJCQkJYWRkID0gMDsKKwkJCX0KKwkJCWVyciA9IGlwX21jX3NvdXJjZShhZGQsIG9tb2RlLCBzaywgJm1yZXFzLAorCQkJCWdyZXFzLmdzcl9pbnRlcmZhY2UpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBNQ0FTVF9NU0ZJTFRFUjoKKwkJeworCQkJZXh0ZXJuIGludCBzeXNjdGxfb3B0bWVtX21heDsKKwkJCWV4dGVybiBpbnQgc3lzY3RsX2lnbXBfbWF4X21zZjsKKwkJCXN0cnVjdCBzb2NrYWRkcl9pbiAqcHNpbjsKKwkJCXN0cnVjdCBpcF9tc2ZpbHRlciAqbXNmID0gTlVMTDsKKwkJCXN0cnVjdCBncm91cF9maWx0ZXIgKmdzZiA9IE5VTEw7CisJCQlpbnQgbXNpemUsIGksIGlmaW5kZXg7CisKKwkJCWlmIChvcHRsZW4gPCBHUk9VUF9GSUxURVJfU0laRSgwKSkKKwkJCQlnb3RvIGVfaW52YWw7CisJCQlpZiAob3B0bGVuID4gc3lzY3RsX29wdG1lbV9tYXgpIHsKKwkJCQllcnIgPSAtRU5PQlVGUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWdzZiA9IChzdHJ1Y3QgZ3JvdXBfZmlsdGVyICopa21hbGxvYyhvcHRsZW4sR0ZQX0tFUk5FTCk7CisJCQlpZiAoZ3NmID09IDApIHsKKwkJCQllcnIgPSAtRU5PQlVGUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoZ3NmLCBvcHR2YWwsIG9wdGxlbikpIHsKKwkJCQlnb3RvIG1jX21zZl9vdXQ7CisJCQl9CisJCQkvKiBudW1zcmMgPj0gKDRHLTE0MCkvMTI4IG92ZXJmbG93IGluIDMyIGJpdHMgKi8KKwkJCWlmIChnc2YtPmdmX251bXNyYyA+PSAweDFmZmZmZmYgfHwKKwkJCSAgICBnc2YtPmdmX251bXNyYyA+IHN5c2N0bF9pZ21wX21heF9tc2YpIHsKKwkJCQllcnIgPSAtRU5PQlVGUzsKKwkJCQlnb3RvIG1jX21zZl9vdXQ7CisJCQl9CisJCQlpZiAoR1JPVVBfRklMVEVSX1NJWkUoZ3NmLT5nZl9udW1zcmMpID4gb3B0bGVuKSB7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlnb3RvIG1jX21zZl9vdXQ7CisJCQl9CisJCQltc2l6ZSA9IElQX01TRklMVEVSX1NJWkUoZ3NmLT5nZl9udW1zcmMpOworCQkJbXNmID0gKHN0cnVjdCBpcF9tc2ZpbHRlciAqKWttYWxsb2MobXNpemUsR0ZQX0tFUk5FTCk7CisJCQlpZiAobXNmID09IDApIHsKKwkJCQllcnIgPSAtRU5PQlVGUzsKKwkJCQlnb3RvIG1jX21zZl9vdXQ7CisJCQl9CisJCQlpZmluZGV4ID0gZ3NmLT5nZl9pbnRlcmZhY2U7CisJCQlwc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZnc2YtPmdmX2dyb3VwOworCQkJaWYgKHBzaW4tPnNpbl9mYW1pbHkgIT0gQUZfSU5FVCkgeworCQkJCWVyciA9IC1FQUREUk5PVEFWQUlMOworCQkJCWdvdG8gbWNfbXNmX291dDsKKwkJCX0KKwkJCW1zZi0+aW1zZl9tdWx0aWFkZHIgPSBwc2luLT5zaW5fYWRkci5zX2FkZHI7CisJCQltc2YtPmltc2ZfaW50ZXJmYWNlID0gMDsKKwkJCW1zZi0+aW1zZl9mbW9kZSA9IGdzZi0+Z2ZfZm1vZGU7CisJCQltc2YtPmltc2ZfbnVtc3JjID0gZ3NmLT5nZl9udW1zcmM7CisJCQllcnIgPSAtRUFERFJOT1RBVkFJTDsKKwkJCWZvciAoaT0wOyBpPGdzZi0+Z2ZfbnVtc3JjOyArK2kpIHsKKwkJCQlwc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZnc2YtPmdmX3NsaXN0W2ldOworCisJCQkJaWYgKHBzaW4tPnNpbl9mYW1pbHkgIT0gQUZfSU5FVCkKKwkJCQkJZ290byBtY19tc2Zfb3V0OworCQkJCW1zZi0+aW1zZl9zbGlzdFtpXSA9IHBzaW4tPnNpbl9hZGRyLnNfYWRkcjsKKwkJCX0KKwkJCWtmcmVlKGdzZik7CisJCQlnc2YgPSBOVUxMOworCisJCQllcnIgPSBpcF9tY19tc2ZpbHRlcihzaywgbXNmLCBpZmluZGV4KTsKK21jX21zZl9vdXQ6CisJCQlpZiAobXNmKQorCQkJCWtmcmVlKG1zZik7CisJCQlpZiAoZ3NmKQorCQkJCWtmcmVlKGdzZik7CisJCQlicmVhazsKKwkJfQorCQljYXNlIElQX1JPVVRFUl9BTEVSVDoJCisJCQllcnIgPSBpcF9yYV9jb250cm9sKHNrLCB2YWwgPyAxIDogMCwgTlVMTCk7CisJCQlicmVhazsKKworCQljYXNlIElQX0ZSRUVCSU5EOgorCQkJaWYgKG9wdGxlbjwxKQorCQkJCWdvdG8gZV9pbnZhbDsKKwkJCWluZXQtPmZyZWViaW5kID0gISF2YWw7IAorCSAgICAgICAgICAgICAgICBicmVhazsJCQkKKyAKKwkJY2FzZSBJUF9JUFNFQ19QT0xJQ1k6CisJCWNhc2UgSVBfWEZSTV9QT0xJQ1k6CisJCQllcnIgPSB4ZnJtX3VzZXJfcG9saWN5KHNrLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorI2lmZGVmIENPTkZJR19ORVRGSUxURVIKKwkJCWVyciA9IG5mX3NldHNvY2tvcHQoc2ssIFBGX0lORVQsIG9wdG5hbWUsIG9wdHZhbCwgCisJCQkJCSAgICBvcHRsZW4pOworI2Vsc2UKKwkJCWVyciA9IC1FTk9QUk9UT09QVDsKKyNlbmRpZgorCQkJYnJlYWs7CisJfQorCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycjsKKworZV9pbnZhbDoKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiAtRUlOVkFMOworfQorCisvKgorICoJR2V0IHRoZSBvcHRpb25zLiBOb3RlIGZvciBmdXR1cmUgcmVmZXJlbmNlLiBUaGUgR0VUIG9mIElQIG9wdGlvbnMgZ2V0cyB0aGUKKyAqCV9yZWNlaXZlZF8gb25lcy4gVGhlIHNldCBzZXRzIHRoZSBfc2VudF8gb25lcy4KKyAqLworCitpbnQgaXBfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKK3sKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisJaW50IHZhbDsKKwlpbnQgbGVuOworCQorCWlmKGxldmVsIT1TT0xfSVApCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworI2lmZGVmIENPTkZJR19JUF9NUk9VVEUKKwlpZihvcHRuYW1lPj1NUlRfQkFTRSAmJiBvcHRuYW1lIDw9TVJUX0JBU0UrMTApCisJeworCQlyZXR1cm4gaXBfbXJvdXRlX2dldHNvY2tvcHQoc2ssb3B0bmFtZSxvcHR2YWwsb3B0bGVuKTsKKwl9CisjZW5kaWYKKworCWlmKGdldF91c2VyKGxlbixvcHRsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZihsZW4gPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkJCisJbG9ja19zb2NrKHNrKTsKKworCXN3aXRjaChvcHRuYW1lKQl7CisJCWNhc2UgSVBfT1BUSU9OUzoKKwkJCXsKKwkJCQl1bnNpZ25lZCBjaGFyIG9wdGJ1ZltzaXplb2Yoc3RydWN0IGlwX29wdGlvbnMpKzQwXTsKKwkJCQlzdHJ1Y3QgaXBfb3B0aW9ucyAqIG9wdCA9IChzdHJ1Y3QgaXBfb3B0aW9ucyopb3B0YnVmOworCQkJCW9wdC0+b3B0bGVuID0gMDsKKwkJCQlpZiAoaW5ldC0+b3B0KQorCQkJCQltZW1jcHkob3B0YnVmLCBpbmV0LT5vcHQsCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGlwX29wdGlvbnMpKworCQkJCQkgICAgICAgaW5ldC0+b3B0LT5vcHRsZW4pOworCQkJCXJlbGVhc2Vfc29jayhzayk7CisKKwkJCQlpZiAob3B0LT5vcHRsZW4gPT0gMCkgCisJCQkJCXJldHVybiBwdXRfdXNlcigwLCBvcHRsZW4pOworCisJCQkJaXBfb3B0aW9uc191bmRvKG9wdCk7CisKKwkJCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgb3B0LT5vcHRsZW4pOworCQkJCWlmKHB1dF91c2VyKGxlbiwgb3B0bGVuKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYoY29weV90b191c2VyKG9wdHZhbCwgb3B0LT5fX2RhdGEsIGxlbikpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXJldHVybiAwOworCQkJfQorCQljYXNlIElQX1BLVElORk86CisJCQl2YWwgPSAoaW5ldC0+Y21zZ19mbGFncyAmIElQX0NNU0dfUEtUSU5GTykgIT0gMDsKKwkJCWJyZWFrOworCQljYXNlIElQX1JFQ1ZUVEw6CisJCQl2YWwgPSAoaW5ldC0+Y21zZ19mbGFncyAmIElQX0NNU0dfVFRMKSAhPSAwOworCQkJYnJlYWs7CisJCWNhc2UgSVBfUkVDVlRPUzoKKwkJCXZhbCA9IChpbmV0LT5jbXNnX2ZsYWdzICYgSVBfQ01TR19UT1MpICE9IDA7CisJCQlicmVhazsKKwkJY2FzZSBJUF9SRUNWT1BUUzoKKwkJCXZhbCA9IChpbmV0LT5jbXNnX2ZsYWdzICYgSVBfQ01TR19SRUNWT1BUUykgIT0gMDsKKwkJCWJyZWFrOworCQljYXNlIElQX1JFVE9QVFM6CisJCQl2YWwgPSAoaW5ldC0+Y21zZ19mbGFncyAmIElQX0NNU0dfUkVUT1BUUykgIT0gMDsKKwkJCWJyZWFrOworCQljYXNlIElQX1RPUzoKKwkJCXZhbCA9IGluZXQtPnRvczsKKwkJCWJyZWFrOworCQljYXNlIElQX1RUTDoKKwkJCXZhbCA9IChpbmV0LT51Y190dGwgPT0gLTEgPworCQkJICAgICAgIHN5c2N0bF9pcF9kZWZhdWx0X3R0bCA6CisJCQkgICAgICAgaW5ldC0+dWNfdHRsKTsKKwkJCWJyZWFrOworCQljYXNlIElQX0hEUklOQ0w6CisJCQl2YWwgPSBpbmV0LT5oZHJpbmNsOworCQkJYnJlYWs7CisJCWNhc2UgSVBfTVRVX0RJU0NPVkVSOgorCQkJdmFsID0gaW5ldC0+cG10dWRpc2M7CisJCQlicmVhazsKKwkJY2FzZSBJUF9NVFU6CisJCXsKKwkJCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKKwkJCXZhbCA9IDA7CisJCQlkc3QgPSBza19kc3RfZ2V0KHNrKTsKKwkJCWlmIChkc3QpIHsKKwkJCQl2YWwgPSBkc3RfbXR1KGRzdCk7CisJCQkJZHN0X3JlbGVhc2UoZHN0KTsKKwkJCX0KKwkJCWlmICghdmFsKSB7CisJCQkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJCQlyZXR1cm4gLUVOT1RDT05OOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBJUF9SRUNWRVJSOgorCQkJdmFsID0gaW5ldC0+cmVjdmVycjsKKwkJCWJyZWFrOworCQljYXNlIElQX01VTFRJQ0FTVF9UVEw6CisJCQl2YWwgPSBpbmV0LT5tY190dGw7CisJCQlicmVhazsKKwkJY2FzZSBJUF9NVUxUSUNBU1RfTE9PUDoKKwkJCXZhbCA9IGluZXQtPm1jX2xvb3A7CisJCQlicmVhazsKKwkJY2FzZSBJUF9NVUxUSUNBU1RfSUY6CisJCXsKKwkJCXN0cnVjdCBpbl9hZGRyIGFkZHI7CisJCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisJCQlhZGRyLnNfYWRkciA9IGluZXQtPm1jX2FkZHI7CisJCQlyZWxlYXNlX3NvY2soc2spOworCisgIAkJCWlmKHB1dF91c2VyKGxlbiwgb3B0bGVuKSkKKyAgCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYoY29weV90b191c2VyKG9wdHZhbCwgJmFkZHIsIGxlbikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIElQX01TRklMVEVSOgorCQl7CisJCQlzdHJ1Y3QgaXBfbXNmaWx0ZXIgbXNmOworCQkJaW50IGVycjsKKworCQkJaWYgKGxlbiA8IElQX01TRklMVEVSX1NJWkUoMCkpIHsKKwkJCQlyZWxlYXNlX3NvY2soc2spOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZtc2YsIG9wdHZhbCwgSVBfTVNGSUxURVJfU0laRSgwKSkpIHsKKwkJCQlyZWxlYXNlX3NvY2soc2spOworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJZXJyID0gaXBfbWNfbXNmZ2V0KHNrLCAmbXNmLAorCQkJCShzdHJ1Y3QgaXBfbXNmaWx0ZXIgX191c2VyICopb3B0dmFsLCBvcHRsZW4pOworCQkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJY2FzZSBNQ0FTVF9NU0ZJTFRFUjoKKwkJeworCQkJc3RydWN0IGdyb3VwX2ZpbHRlciBnc2Y7CisJCQlpbnQgZXJyOworCisJCQlpZiAobGVuIDwgR1JPVVBfRklMVEVSX1NJWkUoMCkpIHsKKwkJCQlyZWxlYXNlX3NvY2soc2spOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZnc2YsIG9wdHZhbCwgR1JPVVBfRklMVEVSX1NJWkUoMCkpKSB7CisJCQkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCWVyciA9IGlwX21jX2dzZmdldChzaywgJmdzZiwKKwkJCQkoc3RydWN0IGdyb3VwX2ZpbHRlciBfX3VzZXIgKilvcHR2YWwsIG9wdGxlbik7CisJCQlyZWxlYXNlX3NvY2soc2spOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQljYXNlIElQX1BLVE9QVElPTlM6CQkKKwkJeworCQkJc3RydWN0IG1zZ2hkciBtc2c7CisKKwkJCXJlbGVhc2Vfc29jayhzayk7CisKKwkJCWlmIChzay0+c2tfdHlwZSAhPSBTT0NLX1NUUkVBTSkKKwkJCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCisJCQltc2cubXNnX2NvbnRyb2wgPSBvcHR2YWw7CisJCQltc2cubXNnX2NvbnRyb2xsZW4gPSBsZW47CisJCQltc2cubXNnX2ZsYWdzID0gMDsKKworCQkJaWYgKGluZXQtPmNtc2dfZmxhZ3MgJiBJUF9DTVNHX1BLVElORk8pIHsKKwkJCQlzdHJ1Y3QgaW5fcGt0aW5mbyBpbmZvOworCisJCQkJaW5mby5pcGlfYWRkci5zX2FkZHIgPSBpbmV0LT5yY3Zfc2FkZHI7CisJCQkJaW5mby5pcGlfc3BlY19kc3Quc19hZGRyID0gaW5ldC0+cmN2X3NhZGRyOworCQkJCWluZm8uaXBpX2lmaW5kZXggPSBpbmV0LT5tY19pbmRleDsKKwkJCQlwdXRfY21zZygmbXNnLCBTT0xfSVAsIElQX1BLVElORk8sIHNpemVvZihpbmZvKSwgJmluZm8pOworCQkJfQorCQkJaWYgKGluZXQtPmNtc2dfZmxhZ3MgJiBJUF9DTVNHX1RUTCkgeworCQkJCWludCBobGltID0gaW5ldC0+bWNfdHRsOworCQkJCXB1dF9jbXNnKCZtc2csIFNPTF9JUCwgSVBfVFRMLCBzaXplb2YoaGxpbSksICZobGltKTsKKwkJCX0KKwkJCWxlbiAtPSBtc2cubXNnX2NvbnRyb2xsZW47CisJCQlyZXR1cm4gcHV0X3VzZXIobGVuLCBvcHRsZW4pOworCQl9CisJCWNhc2UgSVBfRlJFRUJJTkQ6IAorCQkJdmFsID0gaW5ldC0+ZnJlZWJpbmQ7IAorCQkJYnJlYWs7IAorCQlkZWZhdWx0OgorI2lmZGVmIENPTkZJR19ORVRGSUxURVIKKwkJCXZhbCA9IG5mX2dldHNvY2tvcHQoc2ssIFBGX0lORVQsIG9wdG5hbWUsIG9wdHZhbCwgCisJCQkJCSAgICAmbGVuKTsKKwkJCXJlbGVhc2Vfc29jayhzayk7CisJCQlpZiAodmFsID49IDApCisJCQkJdmFsID0gcHV0X3VzZXIobGVuLCBvcHRsZW4pOworCQkJcmV0dXJuIHZhbDsKKyNlbHNlCisJCQlyZWxlYXNlX3NvY2soc2spOworCQkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKyNlbmRpZgorCX0KKwlyZWxlYXNlX3NvY2soc2spOworCQorCWlmIChsZW4gPCBzaXplb2YoaW50KSAmJiBsZW4gPiAwICYmIHZhbD49MCAmJiB2YWw8MjU1KSB7CisJCXVuc2lnbmVkIGNoYXIgdWN2YWwgPSAodW5zaWduZWQgY2hhcil2YWw7CisJCWxlbiA9IDE7CisJCWlmKHB1dF91c2VyKGxlbiwgb3B0bGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZihjb3B5X3RvX3VzZXIob3B0dmFsLCZ1Y3ZhbCwxKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0gZWxzZSB7CisJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgc2l6ZW9mKGludCksIGxlbik7CisJCWlmKHB1dF91c2VyKGxlbiwgb3B0bGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZihjb3B5X3RvX3VzZXIob3B0dmFsLCZ2YWwsbGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChpcF9jbXNnX3JlY3YpOworCisjaWZkZWYgQ09ORklHX0lQX1NDVFBfTU9EVUxFCitFWFBPUlRfU1lNQk9MKGlwX2dldHNvY2tvcHQpOworRVhQT1JUX1NZTUJPTChpcF9zZXRzb2Nrb3B0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBjb21wLmMgYi9uZXQvaXB2NC9pcGNvbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTIzYzUyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvaXBjb21wLmMKQEAgLTAsMCArMSw1MjQgQEAKKy8qCisgKiBJUCBQYXlsb2FkIENvbXByZXNzaW9uIFByb3RvY29sIChJUENvbXApIC0gUkZDMzE3My4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIAorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVG9kbzoKKyAqICAgLSBUdW5hYmxlIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMuCisgKiAgIC0gQ29tcHJlc3Npb24gc3RhdHMuCisgKiAgIC0gQWRhcHRpdmUgY29tcHJlc3Npb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvcGZrZXl2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L3hmcm0uaD4KKyNpbmNsdWRlIDxuZXQvaWNtcC5oPgorI2luY2x1ZGUgPG5ldC9pcGNvbXAuaD4KKworc3RydWN0IGlwY29tcF90Zm1zIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGNyeXB0b190Zm0gKip0Zm1zOworCWludCB1c2VyczsKK307CisKK3N0YXRpYyBERUNMQVJFX01VVEVYKGlwY29tcF9yZXNvdXJjZV9zZW0pOworc3RhdGljIHZvaWQgKippcGNvbXBfc2NyYXRjaGVzOworc3RhdGljIGludCBpcGNvbXBfc2NyYXRjaF91c2VyczsKK3N0YXRpYyBMSVNUX0hFQUQoaXBjb21wX3RmbXNfbGlzdCk7CisKK3N0YXRpYyBpbnQgaXBjb21wX2RlY29tcHJlc3Moc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGVyciwgcGxlbiwgZGxlbjsKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwlzdHJ1Y3QgaXBjb21wX2RhdGEgKmlwY2QgPSB4LT5kYXRhOworCXU4ICpzdGFydCwgKnNjcmF0Y2g7CisJc3RydWN0IGNyeXB0b190Zm0gKnRmbTsKKwlpbnQgY3B1OworCQorCXBsZW4gPSBza2ItPmxlbjsKKwlkbGVuID0gSVBDT01QX1NDUkFUQ0hfU0laRTsKKwlzdGFydCA9IHNrYi0+ZGF0YTsKKworCWNwdSA9IGdldF9jcHUoKTsKKwlzY3JhdGNoID0gKnBlcl9jcHVfcHRyKGlwY29tcF9zY3JhdGNoZXMsIGNwdSk7CisJdGZtID0gKnBlcl9jcHVfcHRyKGlwY2QtPnRmbXMsIGNwdSk7CisKKwllcnIgPSBjcnlwdG9fY29tcF9kZWNvbXByZXNzKHRmbSwgc3RhcnQsIHBsZW4sIHNjcmF0Y2gsICZkbGVuKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWlmIChkbGVuIDwgKHBsZW4gKyBzaXplb2Yoc3RydWN0IGlwX2NvbXBfaGRyKSkpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIGRsZW4gLSBwbGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwkJCisJc2tiX3B1dChza2IsIGRsZW4gLSBwbGVuKTsKKwltZW1jcHkoc2tiLT5kYXRhLCBzY3JhdGNoLCBkbGVuKTsKKwlpcGggPSBza2ItPm5oLmlwaDsKKwlpcGgtPnRvdF9sZW4gPSBodG9ucyhkbGVuICsgaXBoLT5paGwgKiA0KTsKK291dDoJCisJcHV0X2NwdSgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaXBjb21wX2lucHV0KHN0cnVjdCB4ZnJtX3N0YXRlICp4LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHhmcm1fZGVjYXBfc3RhdGUgKmRlY2FwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXU4IG5leHRoZHI7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGlwaGRyICppcGg7CisJdW5pb24geworCQlzdHJ1Y3QgaXBoZHIJaXBoOworCQljaGFyIAkJYnVmWzYwXTsKKwl9IHRtcF9pcGg7CisKKworCWlmICgoc2tiX2lzX25vbmxpbmVhcihza2IpIHx8IHNrYl9jbG9uZWQoc2tiKSkgJiYKKwkgICAgc2tiX2xpbmVhcml6ZShza2IsIEdGUF9BVE9NSUMpICE9IDApIHsKKwkgICAgCWVyciA9IC1FTk9NRU07CisJICAgIAlnb3RvIG91dDsKKwl9CisKKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisKKwkvKiBSZW1vdmUgaXBjb21wIGhlYWRlciBhbmQgZGVjb21wcmVzcyBvcmlnaW5hbCBwYXlsb2FkICovCQorCWlwaCA9IHNrYi0+bmguaXBoOworCW1lbWNweSgmdG1wX2lwaCwgaXBoLCBpcGgtPmlobCAqIDQpOworCW5leHRoZHIgPSAqKHU4ICopc2tiLT5kYXRhOworCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcF9jb21wX2hkcikpOworCXNrYi0+bmgucmF3ICs9IHNpemVvZihzdHJ1Y3QgaXBfY29tcF9oZHIpOworCW1lbWNweShza2ItPm5oLnJhdywgJnRtcF9pcGgsIHRtcF9pcGguaXBoLmlobCAqIDQpOworCWlwaCA9IHNrYi0+bmguaXBoOworCWlwaC0+dG90X2xlbiA9IGh0b25zKG50b2hzKGlwaC0+dG90X2xlbikgLSBzaXplb2Yoc3RydWN0IGlwX2NvbXBfaGRyKSk7CisJaXBoLT5wcm90b2NvbCA9IG5leHRoZHI7CisJc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwllcnIgPSBpcGNvbXBfZGVjb21wcmVzcyh4LCBza2IpOworCitvdXQ6CQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaXBjb21wX2NvbXByZXNzKHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBlcnIsIHBsZW4sIGRsZW4sIGlobGVuOworCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisJc3RydWN0IGlwY29tcF9kYXRhICppcGNkID0geC0+ZGF0YTsKKwl1OCAqc3RhcnQsICpzY3JhdGNoOworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm07CisJaW50IGNwdTsKKwkKKwlpaGxlbiA9IGlwaC0+aWhsICogNDsKKwlwbGVuID0gc2tiLT5sZW4gLSBpaGxlbjsKKwlkbGVuID0gSVBDT01QX1NDUkFUQ0hfU0laRTsKKwlzdGFydCA9IHNrYi0+ZGF0YSArIGlobGVuOworCisJY3B1ID0gZ2V0X2NwdSgpOworCXNjcmF0Y2ggPSAqcGVyX2NwdV9wdHIoaXBjb21wX3NjcmF0Y2hlcywgY3B1KTsKKwl0Zm0gPSAqcGVyX2NwdV9wdHIoaXBjZC0+dGZtcywgY3B1KTsKKworCWVyciA9IGNyeXB0b19jb21wX2NvbXByZXNzKHRmbSwgc3RhcnQsIHBsZW4sIHNjcmF0Y2gsICZkbGVuKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWlmICgoZGxlbiArIHNpemVvZihzdHJ1Y3QgaXBfY29tcF9oZHIpKSA+PSBwbGVuKSB7CisJCWVyciA9IC1FTVNHU0laRTsKKwkJZ290byBvdXQ7CisJfQorCQorCW1lbWNweShzdGFydCArIHNpemVvZihzdHJ1Y3QgaXBfY29tcF9oZHIpLCBzY3JhdGNoLCBkbGVuKTsKKwlwdXRfY3B1KCk7CisKKwlwc2tiX3RyaW0oc2tiLCBpaGxlbiArIGRsZW4gKyBzaXplb2Yoc3RydWN0IGlwX2NvbXBfaGRyKSk7CisJcmV0dXJuIDA7CisJCitvdXQ6CQorCXB1dF9jcHUoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGlwY29tcF9vdXRwdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwlzdHJ1Y3QgaXBfY29tcF9oZHIgKmlwY2g7CisJc3RydWN0IGlwY29tcF9kYXRhICppcGNkID0geC0+ZGF0YTsKKwlpbnQgaGRyX2xlbiA9IDA7CisKKwlpcGggPSBza2ItPm5oLmlwaDsKKwlpcGgtPnRvdF9sZW4gPSBodG9ucyhza2ItPmxlbik7CisJaGRyX2xlbiA9IGlwaC0+aWhsICogNDsKKwlpZiAoKHNrYi0+bGVuIC0gaGRyX2xlbikgPCBpcGNkLT50aHJlc2hvbGQpIHsKKwkJLyogRG9uJ3QgYm90aGVyIGNvbXByZXNzaW5nICovCisJCWdvdG8gb3V0X29rOworCX0KKworCWlmICgoc2tiX2lzX25vbmxpbmVhcihza2IpIHx8IHNrYl9jbG9uZWQoc2tiKSkgJiYKKwkgICAgc2tiX2xpbmVhcml6ZShza2IsIEdGUF9BVE9NSUMpICE9IDApIHsKKwkJZ290byBvdXRfb2s7CisJfQorCQorCWVyciA9IGlwY29tcF9jb21wcmVzcyh4LCBza2IpOworCWlwaCA9IHNrYi0+bmguaXBoOworCisJaWYgKGVycikgeworCQlnb3RvIG91dF9vazsKKwl9CisKKwkvKiBJbnN0YWxsIGlwY29tcCBoZWFkZXIsIGNvbnZlcnQgaW50byBpcGNvbXAgZGF0YWdyYW0uICovCisJaXBoLT50b3RfbGVuID0gaHRvbnMoc2tiLT5sZW4pOworCWlwY2ggPSAoc3RydWN0IGlwX2NvbXBfaGRyICopKChjaGFyICopaXBoICsgaXBoLT5paGwgKiA0KTsKKwlpcGNoLT5uZXh0aGRyID0gaXBoLT5wcm90b2NvbDsKKwlpcGNoLT5mbGFncyA9IDA7CisJaXBjaC0+Y3BpID0gaHRvbnMoKHUxNiApbnRvaGwoeC0+aWQuc3BpKSk7CisJaXBoLT5wcm90b2NvbCA9IElQUFJPVE9fQ09NUDsKKwlpcF9zZW5kX2NoZWNrKGlwaCk7CisJcmV0dXJuIDA7CisKK291dF9vazoKKwlpZiAoeC0+cHJvcHMubW9kZSkKKwkJaXBfc2VuZF9jaGVjayhpcGgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpcGNvbXA0X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgaW5mbykKK3sKKwl1MzIgc3BpOworCXN0cnVjdCBpcGhkciAqaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYi0+ZGF0YTsKKwlzdHJ1Y3QgaXBfY29tcF9oZHIgKmlwY2ggPSAoc3RydWN0IGlwX2NvbXBfaGRyICopKHNrYi0+ZGF0YSsoaXBoLT5paGw8PDIpKTsKKwlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDsKKworCWlmIChza2ItPmguaWNtcGgtPnR5cGUgIT0gSUNNUF9ERVNUX1VOUkVBQ0ggfHwKKwkgICAgc2tiLT5oLmljbXBoLT5jb2RlICE9IElDTVBfRlJBR19ORUVERUQpCisJCXJldHVybjsKKworCXNwaSA9IG50b2hsKG50b2hzKGlwY2gtPmNwaSkpOworCXggPSB4ZnJtX3N0YXRlX2xvb2t1cCgoeGZybV9hZGRyZXNzX3QgKikmaXBoLT5kYWRkciwKKwkgICAgICAgICAgICAgICAgICAgICAgc3BpLCBJUFBST1RPX0NPTVAsIEFGX0lORVQpOworCWlmICgheCkKKwkJcmV0dXJuOworCU5FVERFQlVHKHByaW50ayhLRVJOX0RFQlVHICJwbXR1IGRpc2NvdmVyeSBvbiBTQSBJUENPTVAvJTA4eC8ldS4ldS4ldS4ldVxuIiwKKwkgICAgICAgc3BpLCBOSVBRVUFEKGlwaC0+ZGFkZHIpKSk7CisJeGZybV9zdGF0ZV9wdXQoeCk7Cit9CisKKy8qIFdlIGFsd2F5cyBob2xkIG9uZSB0dW5uZWwgdXNlciByZWZlcmVuY2UgdG8gaW5kaWNhdGUgYSB0dW5uZWwgKi8gCitzdGF0aWMgc3RydWN0IHhmcm1fc3RhdGUgKmlwY29tcF90dW5uZWxfY3JlYXRlKHN0cnVjdCB4ZnJtX3N0YXRlICp4KQoreworCXN0cnVjdCB4ZnJtX3N0YXRlICp0OworCQorCXQgPSB4ZnJtX3N0YXRlX2FsbG9jKCk7CisJaWYgKHQgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwl0LT5pZC5wcm90byA9IElQUFJPVE9fSVBJUDsKKwl0LT5pZC5zcGkgPSB4LT5wcm9wcy5zYWRkci5hNDsKKwl0LT5pZC5kYWRkci5hNCA9IHgtPmlkLmRhZGRyLmE0OworCW1lbWNweSgmdC0+c2VsLCAmeC0+c2VsLCBzaXplb2YodC0+c2VsKSk7CisJdC0+cHJvcHMuZmFtaWx5ID0gQUZfSU5FVDsKKwl0LT5wcm9wcy5tb2RlID0gMTsKKwl0LT5wcm9wcy5zYWRkci5hNCA9IHgtPnByb3BzLnNhZGRyLmE0OworCXQtPnByb3BzLmZsYWdzID0geC0+cHJvcHMuZmxhZ3M7CisJCisJdC0+dHlwZSA9IHhmcm1fZ2V0X3R5cGUoSVBQUk9UT19JUElQLCB0LT5wcm9wcy5mYW1pbHkpOworCWlmICh0LT50eXBlID09IE5VTEwpCisJCWdvdG8gZXJyb3I7CisJCQorCWlmICh0LT50eXBlLT5pbml0X3N0YXRlKHQsIE5VTEwpKQorCQlnb3RvIGVycm9yOworCisJdC0+a20uc3RhdGUgPSBYRlJNX1NUQVRFX1ZBTElEOworCWF0b21pY19zZXQoJnQtPnR1bm5lbF91c2VycywgMSk7CitvdXQ6CisJcmV0dXJuIHQ7CisKK2Vycm9yOgorCXQtPmttLnN0YXRlID0gWEZSTV9TVEFURV9ERUFEOworCXhmcm1fc3RhdGVfcHV0KHQpOworCXQgPSBOVUxMOworCWdvdG8gb3V0OworfQorCisvKgorICogTXVzdCBiZSBwcm90ZWN0ZWQgYnkgeGZybV9jZmdfc2VtLiAgU3RhdGUgYW5kIHR1bm5lbCB1c2VyIHJlZmVyZW5jZXMgYXJlCisgKiBhbHdheXMgaW5jcmVtZW50ZWQgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBpcGNvbXBfdHVubmVsX2F0dGFjaChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCkKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgeGZybV9zdGF0ZSAqdDsKKworCXQgPSB4ZnJtX3N0YXRlX2xvb2t1cCgoeGZybV9hZGRyZXNzX3QgKikmeC0+aWQuZGFkZHIuYTQsCisJICAgICAgICAgICAgICAgICAgICAgIHgtPnByb3BzLnNhZGRyLmE0LCBJUFBST1RPX0lQSVAsIEFGX0lORVQpOworCWlmICghdCkgeworCQl0ID0gaXBjb21wX3R1bm5lbF9jcmVhdGUoeCk7CisJCWlmICghdCkgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCXhmcm1fc3RhdGVfaW5zZXJ0KHQpOworCQl4ZnJtX3N0YXRlX2hvbGQodCk7CisJfQorCXgtPnR1bm5lbCA9IHQ7CisJYXRvbWljX2luYygmdC0+dHVubmVsX3VzZXJzKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBpcGNvbXBfZnJlZV9zY3JhdGNoZXModm9pZCkKK3sKKwlpbnQgaTsKKwl2b2lkICoqc2NyYXRjaGVzOworCisJaWYgKC0taXBjb21wX3NjcmF0Y2hfdXNlcnMpCisJCXJldHVybjsKKworCXNjcmF0Y2hlcyA9IGlwY29tcF9zY3JhdGNoZXM7CisJaWYgKCFzY3JhdGNoZXMpCisJCXJldHVybjsKKworCWZvcl9lYWNoX2NwdShpKSB7CisJCXZvaWQgKnNjcmF0Y2ggPSAqcGVyX2NwdV9wdHIoc2NyYXRjaGVzLCBpKTsKKwkJaWYgKHNjcmF0Y2gpCisJCQl2ZnJlZShzY3JhdGNoKTsKKwl9CisKKwlmcmVlX3BlcmNwdShzY3JhdGNoZXMpOworfQorCitzdGF0aWMgdm9pZCAqKmlwY29tcF9hbGxvY19zY3JhdGNoZXModm9pZCkKK3sKKwlpbnQgaTsKKwl2b2lkICoqc2NyYXRjaGVzOworCisJaWYgKGlwY29tcF9zY3JhdGNoX3VzZXJzKyspCisJCXJldHVybiBpcGNvbXBfc2NyYXRjaGVzOworCisJc2NyYXRjaGVzID0gYWxsb2NfcGVyY3B1KHZvaWQgKik7CisJaWYgKCFzY3JhdGNoZXMpCisJCXJldHVybiBOVUxMOworCisJaXBjb21wX3NjcmF0Y2hlcyA9IHNjcmF0Y2hlczsKKworCWZvcl9lYWNoX2NwdShpKSB7CisJCXZvaWQgKnNjcmF0Y2ggPSB2bWFsbG9jKElQQ09NUF9TQ1JBVENIX1NJWkUpOworCQlpZiAoIXNjcmF0Y2gpCisJCQlyZXR1cm4gTlVMTDsKKwkJKnBlcl9jcHVfcHRyKHNjcmF0Y2hlcywgaSkgPSBzY3JhdGNoOworCX0KKworCXJldHVybiBzY3JhdGNoZXM7Cit9CisKK3N0YXRpYyB2b2lkIGlwY29tcF9mcmVlX3RmbXMoc3RydWN0IGNyeXB0b190Zm0gKip0Zm1zKQoreworCXN0cnVjdCBpcGNvbXBfdGZtcyAqcG9zOworCWludCBjcHU7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJmlwY29tcF90Zm1zX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHBvcy0+dGZtcyA9PSB0Zm1zKQorCQkJYnJlYWs7CisJfQorCisJQlVHX1RSQVAocG9zKTsKKworCWlmICgtLXBvcy0+dXNlcnMpCisJCXJldHVybjsKKworCWxpc3RfZGVsKCZwb3MtPmxpc3QpOworCWtmcmVlKHBvcyk7CisKKwlpZiAoIXRmbXMpCisJCXJldHVybjsKKworCWZvcl9lYWNoX2NwdShjcHUpIHsKKwkJc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9ICpwZXJfY3B1X3B0cih0Zm1zLCBjcHUpOworCQlpZiAodGZtKQorCQkJY3J5cHRvX2ZyZWVfdGZtKHRmbSk7CisJfQorCWZyZWVfcGVyY3B1KHRmbXMpOworfQorCitzdGF0aWMgc3RydWN0IGNyeXB0b190Zm0gKippcGNvbXBfYWxsb2NfdGZtcyhjb25zdCBjaGFyICphbGdfbmFtZSkKK3sKKwlzdHJ1Y3QgaXBjb21wX3RmbXMgKnBvczsKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqKnRmbXM7CisJaW50IGNwdTsKKworCS8qIFRoaXMgY2FuIGJlIGFueSB2YWxpZCBDUFUgSUQgc28gd2UgZG9uJ3QgbmVlZCBsb2NraW5nLiAqLworCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmaXBjb21wX3RmbXNfbGlzdCwgbGlzdCkgeworCQlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtOworCisJCXRmbXMgPSBwb3MtPnRmbXM7CisJCXRmbSA9ICpwZXJfY3B1X3B0cih0Zm1zLCBjcHUpOworCisJCWlmICghc3RyY21wKGNyeXB0b190Zm1fYWxnX25hbWUodGZtKSwgYWxnX25hbWUpKSB7CisJCQlwb3MtPnVzZXJzKys7CisJCQlyZXR1cm4gdGZtczsKKwkJfQorCX0KKworCXBvcyA9IGttYWxsb2Moc2l6ZW9mKCpwb3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBvcykKKwkJcmV0dXJuIE5VTEw7CisKKwlwb3MtPnVzZXJzID0gMTsKKwlJTklUX0xJU1RfSEVBRCgmcG9zLT5saXN0KTsKKwlsaXN0X2FkZCgmcG9zLT5saXN0LCAmaXBjb21wX3RmbXNfbGlzdCk7CisKKwlwb3MtPnRmbXMgPSB0Zm1zID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBjcnlwdG9fdGZtICopOworCWlmICghdGZtcykKKwkJZ290byBlcnJvcjsKKworCWZvcl9lYWNoX2NwdShjcHUpIHsKKwkJc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IGNyeXB0b19hbGxvY190Zm0oYWxnX25hbWUsIDApOworCQlpZiAoIXRmbSkKKwkJCWdvdG8gZXJyb3I7CisJCSpwZXJfY3B1X3B0cih0Zm1zLCBjcHUpID0gdGZtOworCX0KKworCXJldHVybiB0Zm1zOworCitlcnJvcjoKKwlpcGNvbXBfZnJlZV90Zm1zKHRmbXMpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBpcGNvbXBfZnJlZV9kYXRhKHN0cnVjdCBpcGNvbXBfZGF0YSAqaXBjZCkKK3sKKwlpZiAoaXBjZC0+dGZtcykKKwkJaXBjb21wX2ZyZWVfdGZtcyhpcGNkLT50Zm1zKTsKKwlpcGNvbXBfZnJlZV9zY3JhdGNoZXMoKTsKK30KKworc3RhdGljIHZvaWQgaXBjb21wX2Rlc3Ryb3koc3RydWN0IHhmcm1fc3RhdGUgKngpCit7CisJc3RydWN0IGlwY29tcF9kYXRhICppcGNkID0geC0+ZGF0YTsKKwlpZiAoIWlwY2QpCisJCXJldHVybjsKKwl4ZnJtX3N0YXRlX2RlbGV0ZV90dW5uZWwoeCk7CisJZG93bigmaXBjb21wX3Jlc291cmNlX3NlbSk7CisJaXBjb21wX2ZyZWVfZGF0YShpcGNkKTsKKwl1cCgmaXBjb21wX3Jlc291cmNlX3NlbSk7CisJa2ZyZWUoaXBjZCk7Cit9CisKK3N0YXRpYyBpbnQgaXBjb21wX2luaXRfc3RhdGUoc3RydWN0IHhmcm1fc3RhdGUgKngsIHZvaWQgKmFyZ3MpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgaXBjb21wX2RhdGEgKmlwY2Q7CisJc3RydWN0IHhmcm1fYWxnb19kZXNjICpjYWxnX2Rlc2M7CisKKwllcnIgPSAtRUlOVkFMOworCWlmICgheC0+Y2FsZykKKwkJZ290byBvdXQ7CisKKwlpZiAoeC0+ZW5jYXApCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVOT01FTTsKKwlpcGNkID0ga21hbGxvYyhzaXplb2YoKmlwY2QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlwY2QpCisJCWdvdG8gb3V0OworCisJbWVtc2V0KGlwY2QsIDAsIHNpemVvZigqaXBjZCkpOworCXgtPnByb3BzLmhlYWRlcl9sZW4gPSAwOworCWlmICh4LT5wcm9wcy5tb2RlKQorCQl4LT5wcm9wcy5oZWFkZXJfbGVuICs9IHNpemVvZihzdHJ1Y3QgaXBoZHIpOworCisJZG93bigmaXBjb21wX3Jlc291cmNlX3NlbSk7CisJaWYgKCFpcGNvbXBfYWxsb2Nfc2NyYXRjaGVzKCkpCisJCWdvdG8gZXJyb3I7CisKKwlpcGNkLT50Zm1zID0gaXBjb21wX2FsbG9jX3RmbXMoeC0+Y2FsZy0+YWxnX25hbWUpOworCWlmICghaXBjZC0+dGZtcykKKwkJZ290byBlcnJvcjsKKwl1cCgmaXBjb21wX3Jlc291cmNlX3NlbSk7CisKKwlpZiAoeC0+cHJvcHMubW9kZSkgeworCQllcnIgPSBpcGNvbXBfdHVubmVsX2F0dGFjaCh4KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyb3JfdHVubmVsOworCX0KKworCWNhbGdfZGVzYyA9IHhmcm1fY2FsZ19nZXRfYnluYW1lKHgtPmNhbGctPmFsZ19uYW1lLCAwKTsKKwlCVUdfT04oIWNhbGdfZGVzYyk7CisJaXBjZC0+dGhyZXNob2xkID0gY2FsZ19kZXNjLT51aW5mby5jb21wLnRocmVzaG9sZDsKKwl4LT5kYXRhID0gaXBjZDsKKwllcnIgPSAwOworb3V0OgorCXJldHVybiBlcnI7CisKK2Vycm9yX3R1bm5lbDoKKwlkb3duKCZpcGNvbXBfcmVzb3VyY2Vfc2VtKTsKK2Vycm9yOgorCWlwY29tcF9mcmVlX2RhdGEoaXBjZCk7CisJdXAoJmlwY29tcF9yZXNvdXJjZV9zZW0pOworCWtmcmVlKGlwY2QpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgc3RydWN0IHhmcm1fdHlwZSBpcGNvbXBfdHlwZSA9IHsKKwkuZGVzY3JpcHRpb24JPSAiSVBDT01QNCIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5wcm90bwkgICAgIAk9IElQUFJPVE9fQ09NUCwKKwkuaW5pdF9zdGF0ZQk9IGlwY29tcF9pbml0X3N0YXRlLAorCS5kZXN0cnVjdG9yCT0gaXBjb21wX2Rlc3Ryb3ksCisJLmlucHV0CQk9IGlwY29tcF9pbnB1dCwKKwkub3V0cHV0CQk9IGlwY29tcF9vdXRwdXQKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvY29sIGlwY29tcDRfcHJvdG9jb2wgPSB7CisJLmhhbmRsZXIJPQl4ZnJtNF9yY3YsCisJLmVycl9oYW5kbGVyCT0JaXBjb21wNF9lcnIsCisJLm5vX3BvbGljeQk9CTEsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpcGNvbXA0X2luaXQodm9pZCkKK3sKKwlpZiAoeGZybV9yZWdpc3Rlcl90eXBlKCZpcGNvbXBfdHlwZSwgQUZfSU5FVCkgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gImlwY29tcCBpbml0OiBjYW4ndCBhZGQgeGZybSB0eXBlXG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCWlmIChpbmV0X2FkZF9wcm90b2NvbCgmaXBjb21wNF9wcm90b2NvbCwgSVBQUk9UT19DT01QKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaXBjb21wIGluaXQ6IGNhbid0IGFkZCBwcm90b2NvbFxuIik7CisJCXhmcm1fdW5yZWdpc3Rlcl90eXBlKCZpcGNvbXBfdHlwZSwgQUZfSU5FVCk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGlwY29tcDRfZmluaSh2b2lkKQoreworCWlmIChpbmV0X2RlbF9wcm90b2NvbCgmaXBjb21wNF9wcm90b2NvbCwgSVBQUk9UT19DT01QKSA8IDApCisJCXByaW50ayhLRVJOX0lORk8gImlwIGlwY29tcCBjbG9zZTogY2FuJ3QgcmVtb3ZlIHByb3RvY29sXG4iKTsKKwlpZiAoeGZybV91bnJlZ2lzdGVyX3R5cGUoJmlwY29tcF90eXBlLCBBRl9JTkVUKSA8IDApCisJCXByaW50ayhLRVJOX0lORk8gImlwIGlwY29tcCBjbG9zZTogY2FuJ3QgcmVtb3ZlIHhmcm0gdHlwZVxuIik7Cit9CisKK21vZHVsZV9pbml0KGlwY29tcDRfaW5pdCk7Cittb2R1bGVfZXhpdChpcGNvbXA0X2ZpbmkpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklQIFBheWxvYWQgQ29tcHJlc3Npb24gUHJvdG9jb2wgKElQQ29tcCkgLSBSRkMzMTczIik7CitNT0RVTEVfQVVUSE9SKCJKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4iKTsKKwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBjb25maWcuYyBiL25ldC9pcHY0L2lwY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI1MDkwMwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L2lwY29uZmlnLmMKQEAgLTAsMCArMSwxNTA3IEBACisvKgorICogICRJZDogaXBjb25maWcuYyx2IDEuNDYgMjAwMi8wMi8wMSAyMjowMTowNCBkYXZlbSBFeHAgJAorICoKKyAqICBBdXRvbWF0aWMgQ29uZmlndXJhdGlvbiBvZiBJUCAtLSB1c2UgREhDUCwgQk9PVFAsIFJBUlAsIG9yCisgKiAgdXNlci1zdXBwbGllZCBpbmZvcm1hdGlvbiB0byBjb25maWd1cmUgb3duIElQIGFkZHJlc3MgYW5kIHJvdXRlcy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTggTWFydGluIE1hcmVzIDxtakBhdHJleS5rYXJsaW4ubWZmLmN1bmkuY3o+CisgKgorICogIERlcml2ZWQgZnJvbSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gY29kZSBpbiBmcy9uZnMvbmZzcm9vdC5jLAorICogIG9yaWdpbmFsbHkgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IEdlcm8gS3VobG1hbm4gYW5kIG1lLgorICoKKyAqICBCT09UUCByZXdyaXR0ZW4gdG8gY29uc3RydWN0IGFuZCBhbmFseXNlIHBhY2tldHMgaXRzZWxmIGluc3RlYWQKKyAqICBvZiBtaXN1c2luZyB0aGUgSVAgbGF5ZXIuIG51bV9idWdzX2NhdXNpbmdfd3JvbmdfYXJwX3JlcGxpZXMtLTsKKyAqCQkJCQkgICAgIC0tIE1KLCBEZWNlbWJlciAxOTk4CisgKiAgCisgKiAgRml4ZWQgaXBfYXV0b19jb25maWdfc2V0dXAgY2FsbGluZyBhdCBzdGFydHVwIGluIHRoZSBuZXcgIkxpbmtlciBNYWdpYyIKKyAqICBpbml0aWFsaXphdGlvbiBzY2hlbWUuCisgKgktIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPiwgMDgvMTEvMTk5OQorICoKKyAqICBESENQIHN1cHBvcnQgYWRkZWQuICBUbyB1c2VycyB0aGlzIGxvb2tzIGxpa2UgYSB3aG9sZSBzZXBhcmF0ZQorICogIHByb3RvY29sLCBidXQgd2Uga25vdyBpdCdzIGp1c3QgYSBiYWcgb24gdGhlIHNpZGUgb2YgQk9PVFAuCisgKgkJLS0gQ2hpcCBTYWx6ZW5iZXJnIDxjaGlwQHZhbGludXguY29tPiwgTWF5IDIwMDAKKyAqCisgKiAgUG9ydGVkIERIQ1Agc3VwcG9ydCBmcm9tIDIuMi4xNiB0byAyLjQuMC10ZXN0NAorICogICAgICAgICAgICAgIC0tIEVyaWMgQmllZGVybWFuIDxlYmllZGVybWFuQGxueGkuY29tPiwgMzAgQXVnIDIwMDAKKyAqCisgKiAgTWVyZ2VkIGNoYW5nZXMgZnJvbSAyLjIuMTkgaW50byAyLjQuMworICogICAgICAgICAgICAgIC0tIEVyaWMgQmllZGVybWFuIDxlYmllZGVybWFuQGxueGkuY29tPiwgMjIgQXByaWwgQXVnIDIwMDEKKyAqCisgKiAgTXVsdGlwbGUgTmFtZXNlcnZlcnMgaW4gL3Byb2MvbmV0L3BucAorICogICAgICAgICAgICAgIC0tICBKb3NlZiBTaWVtZXMgPGpzaWVtZXNAd2ViLmRlPiwgQXVnIDIwMDIKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L2lwY29uZmlnLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworLyogRGVmaW5lIHRoaXMgdG8gYWxsb3cgZGVidWdnaW5nIG91dHB1dCAqLworI3VuZGVmIElQQ09ORklHX0RFQlVHCisKKyNpZmRlZiBJUENPTkZJR19ERUJVRworI2RlZmluZSBEQkcoeCkgcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIERCRyh4KSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfSVBfUE5QX0RIQ1ApCisjZGVmaW5lIElQQ09ORklHX0RIQ1AKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0lQX1BOUF9CT09UUCkgfHwgZGVmaW5lZChDT05GSUdfSVBfUE5QX0RIQ1ApCisjZGVmaW5lIElQQ09ORklHX0JPT1RQCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19JUF9QTlBfUkFSUCkKKyNkZWZpbmUgSVBDT05GSUdfUkFSUAorI2VuZGlmCisjaWYgZGVmaW5lZChJUENPTkZJR19CT09UUCkgfHwgZGVmaW5lZChJUENPTkZJR19SQVJQKQorI2RlZmluZSBJUENPTkZJR19EWU5BTUlDCisjZW5kaWYKKworLyogRGVmaW5lIHRoZSBmcmllbmRseSBkZWxheSBiZWZvcmUgYW5kIGFmdGVyIG9wZW5pbmcgbmV0IGRldmljZXMgKi8KKyNkZWZpbmUgQ09ORl9QUkVfT1BFTgkJNTAwCS8qIEJlZm9yZSBvcGVuaW5nOiAxLzIgc2Vjb25kICovCisjZGVmaW5lIENPTkZfUE9TVF9PUEVOCQkxCS8qIEFmdGVyIG9wZW5pbmc6IDEgc2Vjb25kICovCisKKy8qIERlZmluZSB0aGUgdGltZW91dCBmb3Igd2FpdGluZyBmb3IgYSBESENQL0JPT1RQL1JBUlAgcmVwbHkgKi8KKyNkZWZpbmUgQ09ORl9PUEVOX1JFVFJJRVMgCTIJLyogKFJlKW9wZW4gZGV2aWNlcyB0d2ljZSAqLworI2RlZmluZSBDT05GX1NFTkRfUkVUUklFUyAJNgkvKiBTZW5kIHNpeCByZXF1ZXN0cyBwZXIgb3BlbiAqLworI2RlZmluZSBDT05GX0lOVEVSX1RJTUVPVVQJKEhaLzIpCS8qIEludGVyLWRldmljZSB0aW1lb3V0OiAxLzIgc2Vjb25kICovCisjZGVmaW5lIENPTkZfQkFTRV9USU1FT1VUCShIWioyKQkvKiBJbml0aWFsIHRpbWVvdXQ6IDIgc2Vjb25kcyAqLworI2RlZmluZSBDT05GX1RJTUVPVVRfUkFORE9NCShIWikJLyogTWF4aW11bSBhbW91bnQgb2YgcmFuZG9taXphdGlvbiAqLworI2RlZmluZSBDT05GX1RJTUVPVVRfTVVMVAkqNy80CS8qIFJhdGUgb2YgdGltZW91dCBncm93dGggKi8KKyNkZWZpbmUgQ09ORl9USU1FT1VUX01BWAkoSFoqMzApCS8qIE1heGltdW0gYWxsb3dlZCB0aW1lb3V0ICovCisjZGVmaW5lIENPTkZfTkFNRVNFUlZFUlNfTUFYICAgMyAgICAgICAvKiBNYXhpbXVtIG51bWJlciBvZiBuYW1lc2VydmVycyAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAnMycgZnJvbSByZXNvbHYuaCAqLworCisKKy8qCisgKiBQdWJsaWMgSVAgY29uZmlndXJhdGlvbgorICovCisKKy8qIFRoaXMgaXMgdXNlZCBieSBwbGF0Zm9ybXMgd2hpY2ggbWlnaHQgYmUgYWJsZSB0byBzZXQgdGhlIGlwY29uZmlnCisgKiB2YXJpYWJsZXMgdXNpbmcgZmlybXdhcmUgZW52aXJvbm1lbnQgdmFycy4gIElmIHRoaXMgaXMgc2V0LCBpdCB3aWxsCisgKiBpZ25vcmUgc3VjaCBmaXJtd2FyZSB2YXJpYWJsZXMuCisgKi8KK2ludCBpY19zZXRfbWFudWFsbHkgX19pbml0ZGF0YSA9IDA7CQkvKiBJUGNvbmZpZyBwYXJhbWV0ZXJzIHNldCBtYW51YWxseSAqLworCitzdGF0aWMgaW50IGljX2VuYWJsZSBfX2luaXRkYXRhID0gMDsJCS8qIElQIGNvbmZpZyBlbmFibGVkPyAqLworCisvKiBQcm90b2NvbCBjaG9pY2UgKi8KK2ludCBpY19wcm90b19lbmFibGVkIF9faW5pdGRhdGEgPSAwCisjaWZkZWYgSVBDT05GSUdfQk9PVFAKKwkJCXwgSUNfQk9PVFAKKyNlbmRpZgorI2lmZGVmIENPTkZJR19JUF9QTlBfREhDUAorCQkJfCBJQ19VU0VfREhDUAorI2VuZGlmCisjaWZkZWYgSVBDT05GSUdfUkFSUAorCQkJfCBJQ19SQVJQCisjZW5kaWYKKwkJCTsKKworc3RhdGljIGludCBpY19ob3N0X25hbWVfc2V0IF9faW5pdGRhdGEgPSAwOwkvKiBIb3N0IG5hbWUgc2V0IGJ5IHVzPyAqLworCit1MzIgaWNfbXlhZGRyID0gSU5BRERSX05PTkU7CQkvKiBNeSBJUCBhZGRyZXNzICovCitzdGF0aWMgdTMyIGljX25ldG1hc2sgPSBJTkFERFJfTk9ORTsJLyogTmV0bWFzayBmb3IgbG9jYWwgc3VibmV0ICovCit1MzIgaWNfZ2F0ZXdheSA9IElOQUREUl9OT05FOwkvKiBHYXRld2F5IElQIGFkZHJlc3MgKi8KKwordTMyIGljX3NlcnZhZGRyID0gSU5BRERSX05PTkU7CS8qIEJvb3Qgc2VydmVyIElQIGFkZHJlc3MgKi8KKwordTMyIHJvb3Rfc2VydmVyX2FkZHIgPSBJTkFERFJfTk9ORTsJLyogQWRkcmVzcyBvZiBORlMgc2VydmVyICovCit1OCByb290X3NlcnZlcl9wYXRoWzI1Nl0gPSB7IDAsIH07CS8qIFBhdGggdG8gbW91bnQgYXMgcm9vdCAqLworCisvKiBQZXJzaXN0ZW50IGRhdGE6ICovCisKK3N0YXRpYyBpbnQgaWNfcHJvdG9fdXNlZDsJCQkvKiBQcm90b2NvbCB1c2VkLCBpZiBhbnkgKi8KK3N0YXRpYyB1MzIgaWNfbmFtZXNlcnZlcnNbQ09ORl9OQU1FU0VSVkVSU19NQVhdOyAvKiBETlMgU2VydmVyIElQIGFkZHJlc3NlcyAqLworc3RhdGljIHU4IGljX2RvbWFpbls2NF07CQkvKiBETlMgKG5vdCBOSVMpIGRvbWFpbiBuYW1lICovCisKKy8qCisgKiBQcml2YXRlIHN0YXRlLgorICovCisKKy8qIE5hbWUgb2YgdXNlci1zZWxlY3RlZCBib290IGRldmljZSAqLworc3RhdGljIGNoYXIgdXNlcl9kZXZfbmFtZVtJRk5BTVNJWl0gX19pbml0ZGF0YSA9IHsgMCwgfTsKKworLyogUHJvdG9jb2xzIHN1cHBvcnRlZCBieSBhdmFpbGFibGUgaW50ZXJmYWNlcyAqLworc3RhdGljIGludCBpY19wcm90b19oYXZlX2lmIF9faW5pdGRhdGEgPSAwOworCisjaWZkZWYgSVBDT05GSUdfRFlOQU1JQworc3RhdGljIERFRklORV9TUElOTE9DSyhpY19yZWN2X2xvY2spOworc3RhdGljIHZvbGF0aWxlIGludCBpY19nb3RfcmVwbHkgX19pbml0ZGF0YSA9IDA7ICAgIC8qIFByb3RvKHMpIHRoYXQgcmVwbGllZCAqLworI2VuZGlmCisjaWZkZWYgSVBDT05GSUdfREhDUAorc3RhdGljIGludCBpY19kaGNwX21zZ3R5cGUgX19pbml0ZGF0YSA9IDA7CS8qIERIQ1AgbXNnIHR5cGUgcmVjZWl2ZWQgKi8KKyNlbmRpZgorCisKKy8qCisgKglOZXR3b3JrIGRldmljZXMKKyAqLworCitzdHJ1Y3QgaWNfZGV2aWNlIHsKKwlzdHJ1Y3QgaWNfZGV2aWNlICpuZXh0OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdW5zaWduZWQgc2hvcnQgZmxhZ3M7CisJc2hvcnQgYWJsZTsKKwl1MzIgeGlkOworfTsKKworc3RhdGljIHN0cnVjdCBpY19kZXZpY2UgKmljX2ZpcnN0X2RldiBfX2luaXRkYXRhID0gTlVMTDsvKiBMaXN0IG9mIG9wZW4gZGV2aWNlICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmljX2RldiBfX2luaXRkYXRhID0gTlVMTDsJLyogU2VsZWN0ZWQgZGV2aWNlICovCisKK3N0YXRpYyBpbnQgX19pbml0IGljX29wZW5fZGV2cyh2b2lkKQoreworCXN0cnVjdCBpY19kZXZpY2UgKmQsICoqbGFzdDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXVuc2lnbmVkIHNob3J0IG9mbGFnczsKKworCWxhc3QgPSAmaWNfZmlyc3RfZGV2OworCXJ0bmxfc2hsb2NrKCk7CisKKwkvKiBicmluZyBsb29wYmFjayBkZXZpY2UgdXAgZmlyc3QgKi8KKwlpZiAoZGV2X2NoYW5nZV9mbGFncygmbG9vcGJhY2tfZGV2LCBsb29wYmFja19kZXYuZmxhZ3MgfCBJRkZfVVApIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJJUC1Db25maWc6IEZhaWxlZCB0byBvcGVuICVzXG4iLCBsb29wYmFja19kZXYubmFtZSk7CisKKwlmb3IgKGRldiA9IGRldl9iYXNlOyBkZXY7IGRldiA9IGRldi0+bmV4dCkgeworCQlpZiAoZGV2ID09ICZsb29wYmFja19kZXYpCisJCQljb250aW51ZTsKKwkJaWYgKHVzZXJfZGV2X25hbWVbMF0gPyAhc3RyY21wKGRldi0+bmFtZSwgdXNlcl9kZXZfbmFtZSkgOgorCQkgICAgKCEoZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykgJiYKKwkJICAgICAoZGV2LT5mbGFncyAmIChJRkZfUE9JTlRPUE9JTlR8SUZGX0JST0FEQ0FTVCkpICYmCisJCSAgICAgc3RybmNtcChkZXYtPm5hbWUsICJkdW1teSIsIDUpKSkgeworCQkJaW50IGFibGUgPSAwOworCQkJaWYgKGRldi0+bXR1ID49IDM2NCkKKwkJCQlhYmxlIHw9IElDX0JPT1RQOworCQkJZWxzZQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRIQ1AvQk9PVFA6IElnbm9yaW5nIGRldmljZSAlcywgTVRVICVkIHRvbyBzbWFsbCIsIGRldi0+bmFtZSwgZGV2LT5tdHUpOworCQkJaWYgKCEoZGV2LT5mbGFncyAmIElGRl9OT0FSUCkpCisJCQkJYWJsZSB8PSBJQ19SQVJQOworCQkJYWJsZSAmPSBpY19wcm90b19lbmFibGVkOworCQkJaWYgKGljX3Byb3RvX2VuYWJsZWQgJiYgIWFibGUpCisJCQkJY29udGludWU7CisJCQlvZmxhZ3MgPSBkZXYtPmZsYWdzOworCQkJaWYgKGRldl9jaGFuZ2VfZmxhZ3MoZGV2LCBvZmxhZ3MgfCBJRkZfVVApIDwgMCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiSVAtQ29uZmlnOiBGYWlsZWQgdG8gb3BlbiAlc1xuIiwgZGV2LT5uYW1lKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghKGQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWNfZGV2aWNlKSwgR0ZQX0tFUk5FTCkpKSB7CisJCQkJcnRubF9zaHVubG9jaygpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWQtPmRldiA9IGRldjsKKwkJCSpsYXN0ID0gZDsKKwkJCWxhc3QgPSAmZC0+bmV4dDsKKwkJCWQtPmZsYWdzID0gb2ZsYWdzOworCQkJZC0+YWJsZSA9IGFibGU7CisJCQlpZiAoYWJsZSAmIElDX0JPT1RQKQorCQkJCWdldF9yYW5kb21fYnl0ZXMoJmQtPnhpZCwgc2l6ZW9mKHUzMikpOworCQkJZWxzZQorCQkJCWQtPnhpZCA9IDA7CisJCQlpY19wcm90b19oYXZlX2lmIHw9IGFibGU7CisJCQlEQkcoKCJJUC1Db25maWc6ICVzIFVQIChhYmxlPSVkLCB4aWQ9JTA4eClcbiIsCisJCQkJZGV2LT5uYW1lLCBhYmxlLCBkLT54aWQpKTsKKwkJfQorCX0KKwlydG5sX3NodW5sb2NrKCk7CisKKwkqbGFzdCA9IE5VTEw7CisKKwlpZiAoIWljX2ZpcnN0X2RldikgeworCQlpZiAodXNlcl9kZXZfbmFtZVswXSkKKwkJCXByaW50ayhLRVJOX0VSUiAiSVAtQ29uZmlnOiBEZXZpY2UgYCVzJyBub3QgZm91bmQuXG4iLCB1c2VyX2Rldl9uYW1lKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fRVJSICJJUC1Db25maWc6IE5vIG5ldHdvcmsgZGV2aWNlcyBhdmFpbGFibGUuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGljX2Nsb3NlX2RldnModm9pZCkKK3sKKwlzdHJ1Y3QgaWNfZGV2aWNlICpkLCAqbmV4dDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJcnRubF9zaGxvY2soKTsKKwluZXh0ID0gaWNfZmlyc3RfZGV2OworCXdoaWxlICgoZCA9IG5leHQpKSB7CisJCW5leHQgPSBkLT5uZXh0OworCQlkZXYgPSBkLT5kZXY7CisJCWlmIChkZXYgIT0gaWNfZGV2KSB7CisJCQlEQkcoKCJJUC1Db25maWc6IERvd25pbmcgJXNcbiIsIGRldi0+bmFtZSkpOworCQkJZGV2X2NoYW5nZV9mbGFncyhkZXYsIGQtPmZsYWdzKTsKKwkJfQorCQlrZnJlZShkKTsKKwl9CisJcnRubF9zaHVubG9jaygpOworfQorCisvKgorICoJSW50ZXJmYWNlIHRvIHZhcmlvdXMgbmV0d29yayBmdW5jdGlvbnMuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkCitzZXRfc29ja2FkZHIoc3RydWN0IHNvY2thZGRyX2luICpzaW4sIHUzMiBhZGRyLCB1MTYgcG9ydCkKK3sKKwlzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNpbi0+c2luX2FkZHIuc19hZGRyID0gYWRkcjsKKwlzaW4tPnNpbl9wb3J0ID0gcG9ydDsKK30KKworc3RhdGljIGludCBfX2luaXQgaWNfZGV2X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBpZnJlcSAqYXJnKQoreworCWludCByZXM7CisKKwltbV9zZWdtZW50X3Qgb2xkZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoZ2V0X2RzKCkpOworCXJlcyA9IGRldmluZXRfaW9jdGwoY21kLCAoc3RydWN0IGlmcmVxIF9fdXNlciAqKSBhcmcpOworCXNldF9mcyhvbGRmcyk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBfX2luaXQgaWNfcm91dGVfaW9jdGwodW5zaWduZWQgaW50IGNtZCwgc3RydWN0IHJ0ZW50cnkgKmFyZykKK3sKKwlpbnQgcmVzOworCisJbW1fc2VnbWVudF90IG9sZGZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKGdldF9kcygpKTsKKwlyZXMgPSBpcF9ydF9pb2N0bChjbWQsICh2b2lkIF9fdXNlciAqKSBhcmcpOworCXNldF9mcyhvbGRmcyk7CisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqCVNldCB1cCBpbnRlcmZhY2UgYWRkcmVzc2VzIGFuZCByb3V0ZXMuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgaWNfc2V0dXBfaWYodm9pZCkKK3sKKwlzdHJ1Y3QgaWZyZXEgaXI7CisJc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAodm9pZCAqKSAmaXIuaWZyX2lmcnUuaWZydV9hZGRyOworCWludCBlcnI7CisKKwltZW1zZXQoJmlyLCAwLCBzaXplb2YoaXIpKTsKKwlzdHJjcHkoaXIuaWZyX2lmcm4uaWZybl9uYW1lLCBpY19kZXYtPm5hbWUpOworCXNldF9zb2NrYWRkcihzaW4sIGljX215YWRkciwgMCk7CisJaWYgKChlcnIgPSBpY19kZXZfaW9jdGwoU0lPQ1NJRkFERFIsICZpcikpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIklQLUNvbmZpZzogVW5hYmxlIHRvIHNldCBpbnRlcmZhY2UgYWRkcmVzcyAoJWQpLlxuIiwgZXJyKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzZXRfc29ja2FkZHIoc2luLCBpY19uZXRtYXNrLCAwKTsKKwlpZiAoKGVyciA9IGljX2Rldl9pb2N0bChTSU9DU0lGTkVUTUFTSywgJmlyKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSVAtQ29uZmlnOiBVbmFibGUgdG8gc2V0IGludGVyZmFjZSBuZXRtYXNrICglZCkuXG4iLCBlcnIpOworCQlyZXR1cm4gLTE7CisJfQorCXNldF9zb2NrYWRkcihzaW4sIGljX215YWRkciB8IH5pY19uZXRtYXNrLCAwKTsKKwlpZiAoKGVyciA9IGljX2Rldl9pb2N0bChTSU9DU0lGQlJEQUREUiwgJmlyKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSVAtQ29uZmlnOiBVbmFibGUgdG8gc2V0IGludGVyZmFjZSBicm9hZGNhc3QgYWRkcmVzcyAoJWQpLlxuIiwgZXJyKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgaWNfc2V0dXBfcm91dGVzKHZvaWQpCit7CisJLyogTm8gbmVlZCB0byBzZXR1cCBkZXZpY2Ugcm91dGVzLCBvbmx5IHRoZSBkZWZhdWx0IHJvdXRlLi4uICovCisKKwlpZiAoaWNfZ2F0ZXdheSAhPSBJTkFERFJfTk9ORSkgeworCQlzdHJ1Y3QgcnRlbnRyeSBybTsKKwkJaW50IGVycjsKKworCQltZW1zZXQoJnJtLCAwLCBzaXplb2Yocm0pKTsKKwkJaWYgKChpY19nYXRld2F5IF4gaWNfbXlhZGRyKSAmIGljX25ldG1hc2spIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiSVAtQ29uZmlnOiBHYXRld2F5IG5vdCBvbiBkaXJlY3RseSBjb25uZWN0ZWQgbmV0d29yay5cbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXNldF9zb2NrYWRkcigoc3RydWN0IHNvY2thZGRyX2luICopICZybS5ydF9kc3QsIDAsIDApOworCQlzZXRfc29ja2FkZHIoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmcm0ucnRfZ2VubWFzaywgMCwgMCk7CisJCXNldF9zb2NrYWRkcigoc3RydWN0IHNvY2thZGRyX2luICopICZybS5ydF9nYXRld2F5LCBpY19nYXRld2F5LCAwKTsKKwkJcm0ucnRfZmxhZ3MgPSBSVEZfVVAgfCBSVEZfR0FURVdBWTsKKwkJaWYgKChlcnIgPSBpY19yb3V0ZV9pb2N0bChTSU9DQUREUlQsICZybSkpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJJUC1Db25maWc6IENhbm5vdCBhZGQgZGVmYXVsdCByb3V0ZSAoJWQpLlxuIiwgZXJyKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKgorICoJRmlsbCBpbiBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIG1pc3NpbmcgcGFyYW1ldGVycy4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBpY19kZWZhdWx0cyh2b2lkKQoreworCS8qCisJICoJQXQgdGhpcyBwb2ludCB3ZSBoYXZlIG5vIHVzZXJzcGFjZSBydW5uaW5nIHNvIG5lZWQgbm90CisJICoJY2xhaW0gbG9ja3Mgb24gc3lzdGVtX3V0c25hbWUKKwkgKi8KKwkgCisJaWYgKCFpY19ob3N0X25hbWVfc2V0KQorCQlzcHJpbnRmKHN5c3RlbV91dHNuYW1lLm5vZGVuYW1lLCAiJXUuJXUuJXUuJXUiLCBOSVBRVUFEKGljX215YWRkcikpOworCisJaWYgKHJvb3Rfc2VydmVyX2FkZHIgPT0gSU5BRERSX05PTkUpCisJCXJvb3Rfc2VydmVyX2FkZHIgPSBpY19zZXJ2YWRkcjsKKworCWlmIChpY19uZXRtYXNrID09IElOQUREUl9OT05FKSB7CisJCWlmIChJTl9DTEFTU0EobnRvaGwoaWNfbXlhZGRyKSkpCisJCQlpY19uZXRtYXNrID0gaHRvbmwoSU5fQ0xBU1NBX05FVCk7CisJCWVsc2UgaWYgKElOX0NMQVNTQihudG9obChpY19teWFkZHIpKSkKKwkJCWljX25ldG1hc2sgPSBodG9ubChJTl9DTEFTU0JfTkVUKTsKKwkJZWxzZSBpZiAoSU5fQ0xBU1NDKG50b2hsKGljX215YWRkcikpKQorCQkJaWNfbmV0bWFzayA9IGh0b25sKElOX0NMQVNTQ19ORVQpOworCQllbHNlIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiSVAtQ29uZmlnOiBVbmFibGUgdG8gZ3Vlc3MgbmV0bWFzayBmb3IgYWRkcmVzcyAldS4ldS4ldS4ldVxuIiwKKwkJCQlOSVBRVUFEKGljX215YWRkcikpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXByaW50aygiSVAtQ29uZmlnOiBHdWVzc2luZyBuZXRtYXNrICV1LiV1LiV1LiV1XG4iLCBOSVBRVUFEKGljX25ldG1hc2spKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCVJBUlAgc3VwcG9ydC4KKyAqLworCisjaWZkZWYgSVBDT05GSUdfUkFSUAorCitzdGF0aWMgaW50IGljX3JhcnBfcmVjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0KTsKKworc3RhdGljIHN0cnVjdCBwYWNrZXRfdHlwZSByYXJwX3BhY2tldF90eXBlIF9faW5pdGRhdGEgPSB7CisJLnR5cGUgPQlfX2NvbnN0YW50X2h0b25zKEVUSF9QX1JBUlApLAorCS5mdW5jID0JaWNfcmFycF9yZWN2LAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIGljX3JhcnBfaW5pdCh2b2lkKQoreworCWRldl9hZGRfcGFjaygmcmFycF9wYWNrZXRfdHlwZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpY19yYXJwX2NsZWFudXAodm9pZCkKK3sKKwlkZXZfcmVtb3ZlX3BhY2soJnJhcnBfcGFja2V0X3R5cGUpOworfQorCisvKgorICogIFByb2Nlc3MgcmVjZWl2ZWQgUkFSUCBwYWNrZXQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0CitpY19yYXJwX3JlY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHBhY2tldF90eXBlICpwdCkKK3sKKwlzdHJ1Y3QgYXJwaGRyICpyYXJwOworCXVuc2lnbmVkIGNoYXIgKnJhcnBfcHRyOworCXVuc2lnbmVkIGxvbmcgc2lwLCB0aXA7CisJdW5zaWduZWQgY2hhciAqc2hhLCAqdGhhOwkJLyogcyBmb3IgInNvdXJjZSIsIHQgZm9yICJ0YXJnZXQiICovCisJc3RydWN0IGljX2RldmljZSAqZDsKKworCWlmICgoc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJCXJldHVybiBORVRfUlhfRFJPUDsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgYXJwaGRyKSkpCisJCWdvdG8gZHJvcDsKKworCS8qIEJhc2ljIHNhbml0eSBjaGVja3MgY2FuIGJlIGRvbmUgd2l0aG91dCB0aGUgbG9jay4gICovCisJcmFycCA9IChzdHJ1Y3QgYXJwaGRyICopc2tiLT5oLnJhdzsKKworCS8qIElmIHRoaXMgdGVzdCBkb2Vzbid0IHBhc3MsIGl0J3Mgbm90IElQLCBvciB3ZSBzaG91bGQKKwkgKiBpZ25vcmUgaXQgYW55d2F5LgorCSAqLworCWlmIChyYXJwLT5hcl9obG4gIT0gZGV2LT5hZGRyX2xlbiB8fCBkZXYtPnR5cGUgIT0gbnRvaHMocmFycC0+YXJfaHJkKSkKKwkJZ290byBkcm9wOworCisJLyogSWYgaXQncyBub3QgYSBSQVJQIHJlcGx5LCBkZWxldGUgaXQuICovCisJaWYgKHJhcnAtPmFyX29wICE9IGh0b25zKEFSUE9QX1JSRVBMWSkpCisJCWdvdG8gZHJvcDsKKworCS8qIElmIGl0J3Mgbm90IEV0aGVybmV0LCBkZWxldGUgaXQuICovCisJaWYgKHJhcnAtPmFyX3BybyAhPSBodG9ucyhFVEhfUF9JUCkpCisJCWdvdG8gZHJvcDsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsCisJCQkgICBzaXplb2Yoc3RydWN0IGFycGhkcikgKworCQkJICAgKDIgKiBkZXYtPmFkZHJfbGVuKSArCisJCQkgICAoMiAqIDQpKSkKKwkJZ290byBkcm9wOworCisJLyogT0ssIGl0IGlzIGFsbCB0aGVyZSBhbmQgbG9va3MgdmFsaWQsIHByb2Nlc3MuLi4gKi8KKwlyYXJwID0gKHN0cnVjdCBhcnBoZHIgKilza2ItPmgucmF3OworCXJhcnBfcHRyID0gKHVuc2lnbmVkIGNoYXIgKikgKHJhcnAgKyAxKTsKKworCS8qIE9uZSByZXBseSBhdCBhIHRpbWUsIHBsZWFzZS4gKi8KKwlzcGluX2xvY2soJmljX3JlY3ZfbG9jayk7CisKKwkvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgYSByZXBseSwganVzdCBkcm9wIHRoZSBwYWNrZXQgKi8KKwlpZiAoaWNfZ290X3JlcGx5KQorCQlnb3RvIGRyb3BfdW5sb2NrOworCisJLyogRmluZCB0aGUgaWNfZGV2aWNlIHRoYXQgdGhlIHBhY2tldCBhcnJpdmVkIG9uICovCisJZCA9IGljX2ZpcnN0X2RldjsKKwl3aGlsZSAoZCAmJiBkLT5kZXYgIT0gZGV2KQorCQlkID0gZC0+bmV4dDsKKwlpZiAoIWQpCisJCWdvdG8gZHJvcF91bmxvY2s7CS8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKworCS8qIEV4dHJhY3QgdmFyaWFibGUtd2lkdGggZmllbGRzICovCisJc2hhID0gcmFycF9wdHI7CisJcmFycF9wdHIgKz0gZGV2LT5hZGRyX2xlbjsKKwltZW1jcHkoJnNpcCwgcmFycF9wdHIsIDQpOworCXJhcnBfcHRyICs9IDQ7CisJdGhhID0gcmFycF9wdHI7CisJcmFycF9wdHIgKz0gZGV2LT5hZGRyX2xlbjsKKwltZW1jcHkoJnRpcCwgcmFycF9wdHIsIDQpOworCisJLyogRGlzY2FyZCBwYWNrZXRzIHdoaWNoIGFyZSBub3QgbWVhbnQgZm9yIHVzLiAqLworCWlmIChtZW1jbXAodGhhLCBkZXYtPmRldl9hZGRyLCBkZXYtPmFkZHJfbGVuKSkKKwkJZ290byBkcm9wX3VubG9jazsKKworCS8qIERpc2NhcmQgcGFja2V0cyB3aGljaCBhcmUgbm90IGZyb20gc3BlY2lmaWVkIHNlcnZlci4gKi8KKwlpZiAoaWNfc2VydmFkZHIgIT0gSU5BRERSX05PTkUgJiYgaWNfc2VydmFkZHIgIT0gc2lwKQorCQlnb3RvIGRyb3BfdW5sb2NrOworCisJLyogV2UgaGF2ZSBhIHdpbm5lciEgKi8KKwlpY19kZXYgPSBkZXY7CisJaWYgKGljX215YWRkciA9PSBJTkFERFJfTk9ORSkKKwkJaWNfbXlhZGRyID0gdGlwOworCWljX3NlcnZhZGRyID0gc2lwOworCWljX2dvdF9yZXBseSA9IElDX1JBUlA7CisKK2Ryb3BfdW5sb2NrOgorCS8qIFNob3cncyBvdmVyLiAgTm90aGluZyB0byBzZWUgaGVyZS4gICovCisJc3Bpbl91bmxvY2soJmljX3JlY3ZfbG9jayk7CisKK2Ryb3A6CisJLyogVGhyb3cgdGhlIHBhY2tldCBvdXQuICovCisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqICBTZW5kIFJBUlAgcmVxdWVzdCBwYWNrZXQgb3ZlciBhIHNpbmdsZSBpbnRlcmZhY2UuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBpY19yYXJwX3NlbmRfaWYoc3RydWN0IGljX2RldmljZSAqZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZC0+ZGV2OworCWFycF9zZW5kKEFSUE9QX1JSRVFVRVNULCBFVEhfUF9SQVJQLCAwLCBkZXYsIDAsIE5VTEwsCisJCSBkZXYtPmRldl9hZGRyLCBkZXYtPmRldl9hZGRyKTsKK30KKyNlbmRpZgorCisvKgorICoJREhDUC9CT09UUCBzdXBwb3J0LgorICovCisKKyNpZmRlZiBJUENPTkZJR19CT09UUAorCitzdHJ1Y3QgYm9vdHBfcGt0IHsJCS8qIEJPT1RQIHBhY2tldCBmb3JtYXQgKi8KKwlzdHJ1Y3QgaXBoZHIgaXBoOwkvKiBJUCBoZWFkZXIgKi8KKwlzdHJ1Y3QgdWRwaGRyIHVkcGg7CS8qIFVEUCBoZWFkZXIgKi8KKwl1OCBvcDsJCQkvKiAxPXJlcXVlc3QsIDI9cmVwbHkgKi8KKwl1OCBodHlwZTsJCS8qIEhXIGFkZHJlc3MgdHlwZSAqLworCXU4IGhsZW47CQkvKiBIVyBhZGRyZXNzIGxlbmd0aCAqLworCXU4IGhvcHM7CQkvKiBVc2VkIG9ubHkgYnkgZ2F0ZXdheXMgKi8KKwl1MzIgeGlkOwkJLyogVHJhbnNhY3Rpb24gSUQgKi8KKwl1MTYgc2VjczsJCS8qIFNlY29uZHMgc2luY2Ugd2Ugc3RhcnRlZCAqLworCXUxNiBmbGFnczsJCS8qIEp1c3Qgd2hhdCBpdCBzYXlzICovCisJdTMyIGNsaWVudF9pcDsJCS8qIENsaWVudCdzIElQIGFkZHJlc3MgaWYga25vd24gKi8KKwl1MzIgeW91cl9pcDsJCS8qIEFzc2lnbmVkIElQIGFkZHJlc3MgKi8KKwl1MzIgc2VydmVyX2lwOwkJLyogKE5leHQsIGUuZy4gTkZTKSBTZXJ2ZXIncyBJUCBhZGRyZXNzICovCisJdTMyIHJlbGF5X2lwOwkJLyogSVAgYWRkcmVzcyBvZiBCT09UUCByZWxheSAqLworCXU4IGh3X2FkZHJbMTZdOwkJLyogQ2xpZW50J3MgSFcgYWRkcmVzcyAqLworCXU4IHNlcnZfbmFtZVs2NF07CS8qIFNlcnZlciBob3N0IG5hbWUgKi8KKwl1OCBib290X2ZpbGVbMTI4XTsJLyogTmFtZSBvZiBib290IGZpbGUgKi8KKwl1OCBleHRlblszMTJdOwkJLyogREhDUCBvcHRpb25zIC8gQk9PVFAgdmVuZG9yIGV4dGVuc2lvbnMgKi8KK307CisKKy8qIHBhY2tldCBvcHMgKi8KKyNkZWZpbmUgQk9PVFBfUkVRVUVTVAkxCisjZGVmaW5lIEJPT1RQX1JFUExZCTIKKworLyogREhDUCBtZXNzYWdlIHR5cGVzICovCisjZGVmaW5lIERIQ1BESVNDT1ZFUgkxCisjZGVmaW5lIERIQ1BPRkZFUgkyCisjZGVmaW5lIERIQ1BSRVFVRVNUCTMKKyNkZWZpbmUgREhDUERFQ0xJTkUJNAorI2RlZmluZSBESENQQUNLCQk1CisjZGVmaW5lIERIQ1BOQUsJCTYKKyNkZWZpbmUgREhDUFJFTEVBU0UJNworI2RlZmluZSBESENQSU5GT1JNCTgKKworc3RhdGljIGludCBpY19ib290cF9yZWN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBwYWNrZXRfdHlwZSAqcHQpOworCitzdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIGJvb3RwX3BhY2tldF90eXBlIF9faW5pdGRhdGEgPSB7CisJLnR5cGUgPQlfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKSwKKwkuZnVuYyA9CWljX2Jvb3RwX3JlY3YsCit9OworCisKKy8qCisgKiAgSW5pdGlhbGl6ZSBESENQL0JPT1RQIGV4dGVuc2lvbiBmaWVsZHMgaW4gdGhlIHJlcXVlc3QuCisgKi8KKworc3RhdGljIGNvbnN0IHU4IGljX2Jvb3RwX2Nvb2tpZVs0XSA9IHsgOTksIDEzMCwgODMsIDk5IH07CisKKyNpZmRlZiBJUENPTkZJR19ESENQCisKK3N0YXRpYyB2b2lkIF9faW5pdAoraWNfZGhjcF9pbml0X29wdGlvbnModTggKm9wdGlvbnMpCit7CisJdTggbXQgPSAoKGljX3NlcnZhZGRyID09IElOQUREUl9OT05FKQorCQkgPyBESENQRElTQ09WRVIgOiBESENQUkVRVUVTVCk7CisJdTggKmUgPSBvcHRpb25zOworCisjaWZkZWYgSVBDT05GSUdfREVCVUcKKwlwcmludGsoIkRIQ1A6IFNlbmRpbmcgbWVzc2FnZSB0eXBlICVkXG4iLCBtdCk7CisjZW5kaWYKKworCW1lbWNweShlLCBpY19ib290cF9jb29raWUsIDQpOwkvKiBSRkMxMDQ4IE1hZ2ljIENvb2tpZSAqLworCWUgKz0gNDsKKworCSplKysgPSA1MzsJCS8qIERIQ1AgbWVzc2FnZSB0eXBlICovCisJKmUrKyA9IDE7CisJKmUrKyA9IG10OworCisJaWYgKG10ID09IERIQ1BSRVFVRVNUKSB7CisJCSplKysgPSA1NDsJLyogU2VydmVyIElEIChJUCBhZGRyZXNzKSAqLworCQkqZSsrID0gNDsKKwkJbWVtY3B5KGUsICZpY19zZXJ2YWRkciwgNCk7CisJCWUgKz0gNDsKKworCQkqZSsrID0gNTA7CS8qIFJlcXVlc3RlZCBJUCBhZGRyZXNzICovCisJCSplKysgPSA0OworCQltZW1jcHkoZSwgJmljX215YWRkciwgNCk7CisJCWUgKz0gNDsKKwl9CisKKwkvKiBhbHdheXM/ICovCisJeworCQlzdGF0aWMgY29uc3QgdTggaWNfcmVxX3BhcmFtc1tdID0geworCQkJMSwJLyogU3VibmV0IG1hc2sgKi8KKwkJCTMsCS8qIERlZmF1bHQgZ2F0ZXdheSAqLworCQkJNiwJLyogRE5TIHNlcnZlciAqLworCQkJMTIsCS8qIEhvc3QgbmFtZSAqLworCQkJMTUsCS8qIERvbWFpbiBuYW1lICovCisJCQkxNywJLyogQm9vdCBwYXRoICovCisJCQk0MCwJLyogTklTIGRvbWFpbiBuYW1lICovCisJCX07CisKKwkJKmUrKyA9IDU1OwkvKiBQYXJhbWV0ZXIgcmVxdWVzdCBsaXN0ICovCisJCSplKysgPSBzaXplb2YoaWNfcmVxX3BhcmFtcyk7CisJCW1lbWNweShlLCBpY19yZXFfcGFyYW1zLCBzaXplb2YoaWNfcmVxX3BhcmFtcykpOworCQllICs9IHNpemVvZihpY19yZXFfcGFyYW1zKTsKKwl9CisKKwkqZSsrID0gMjU1OwkvKiBFbmQgb2YgdGhlIGxpc3QgKi8KK30KKworI2VuZGlmIC8qIElQQ09ORklHX0RIQ1AgKi8KKworc3RhdGljIHZvaWQgX19pbml0IGljX2Jvb3RwX2luaXRfZXh0KHU4ICplKQoreworCW1lbWNweShlLCBpY19ib290cF9jb29raWUsIDQpOwkvKiBSRkMxMDQ4IE1hZ2ljIENvb2tpZSAqLworCWUgKz0gNDsKKwkqZSsrID0gMTsJCS8qIFN1Ym5ldCBtYXNrIHJlcXVlc3QgKi8KKwkqZSsrID0gNDsKKwllICs9IDQ7CisJKmUrKyA9IDM7CQkvKiBEZWZhdWx0IGdhdGV3YXkgcmVxdWVzdCAqLworCSplKysgPSA0OworCWUgKz0gNDsKKwkqZSsrID0gNTsJCS8qIE5hbWUgc2VydmVyIHJlcXVlc3QgKi8KKwkqZSsrID0gODsKKwllICs9IDg7CisJKmUrKyA9IDEyOwkJLyogSG9zdCBuYW1lIHJlcXVlc3QgKi8KKwkqZSsrID0gMzI7CisJZSArPSAzMjsKKwkqZSsrID0gNDA7CQkvKiBOSVMgRG9tYWluIG5hbWUgcmVxdWVzdCAqLworCSplKysgPSAzMjsKKwllICs9IDMyOworCSplKysgPSAxNzsJCS8qIEJvb3QgcGF0aCAqLworCSplKysgPSA0MDsKKwllICs9IDQwOworCisJKmUrKyA9IDU3OwkJLyogc2V0IGV4dGVuc2lvbiBidWZmZXIgc2l6ZSBmb3IgcmVwbHkgKi8gCisJKmUrKyA9IDI7CisJKmUrKyA9IDE7CQkvKiAxMjgrMjM2KzgrMjArMTQsIHNlZSBkaGNwZCBzb3VyY2VzICovIAorCSplKysgPSAxNTA7CisKKwkqZSsrID0gMjU1OwkJLyogRW5kIG9mIHRoZSBsaXN0ICovCit9CisKKworLyoKKyAqICBJbml0aWFsaXplIHRoZSBESENQL0JPT1RQIG1lY2hhbmlzbS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGljX2Jvb3RwX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBDT05GX05BTUVTRVJWRVJTX01BWDsgaSsrKQorCQlpY19uYW1lc2VydmVyc1tpXSA9IElOQUREUl9OT05FOworCisJZGV2X2FkZF9wYWNrKCZib290cF9wYWNrZXRfdHlwZSk7Cit9CisKKworLyoKKyAqICBESENQL0JPT1RQIGNsZWFudXAuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpY19ib290cF9jbGVhbnVwKHZvaWQpCit7CisJZGV2X3JlbW92ZV9wYWNrKCZib290cF9wYWNrZXRfdHlwZSk7Cit9CisKKworLyoKKyAqICBTZW5kIERIQ1AvQk9PVFAgcmVxdWVzdCB0byBzaW5nbGUgaW50ZXJmYWNlLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgaWNfYm9vdHBfc2VuZF9pZihzdHJ1Y3QgaWNfZGV2aWNlICpkLCB1bnNpZ25lZCBsb25nIGppZmZpZXNfZGlmZikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZC0+ZGV2OworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGJvb3RwX3BrdCAqYjsKKwlpbnQgaGhfbGVuID0gTExfUkVTRVJWRURfU1BBQ0UoZGV2KTsKKwlzdHJ1Y3QgaXBoZHIgKmg7CisKKwkvKiBBbGxvY2F0ZSBwYWNrZXQgKi8KKwlza2IgPSBhbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBib290cF9wa3QpICsgaGhfbGVuICsgMTUsIEdGUF9LRVJORUwpOworCWlmICghc2tiKQorCQlyZXR1cm47CisJc2tiX3Jlc2VydmUoc2tiLCBoaF9sZW4pOworCWIgPSAoc3RydWN0IGJvb3RwX3BrdCAqKSBza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBib290cF9wa3QpKTsKKwltZW1zZXQoYiwgMCwgc2l6ZW9mKHN0cnVjdCBib290cF9wa3QpKTsKKworCS8qIENvbnN0cnVjdCBJUCBoZWFkZXIgKi8KKwlza2ItPm5oLmlwaCA9IGggPSAmYi0+aXBoOworCWgtPnZlcnNpb24gPSA0OworCWgtPmlobCA9IDU7CisJaC0+dG90X2xlbiA9IGh0b25zKHNpemVvZihzdHJ1Y3QgYm9vdHBfcGt0KSk7CisJaC0+ZnJhZ19vZmYgPSBodG9ucyhJUF9ERik7CisJaC0+dHRsID0gNjQ7CisJaC0+cHJvdG9jb2wgPSBJUFBST1RPX1VEUDsKKwloLT5kYWRkciA9IElOQUREUl9CUk9BRENBU1Q7CisJaC0+Y2hlY2sgPSBpcF9mYXN0X2NzdW0oKHVuc2lnbmVkIGNoYXIgKikgaCwgaC0+aWhsKTsKKworCS8qIENvbnN0cnVjdCBVRFAgaGVhZGVyICovCisJYi0+dWRwaC5zb3VyY2UgPSBodG9ucyg2OCk7CisJYi0+dWRwaC5kZXN0ID0gaHRvbnMoNjcpOworCWItPnVkcGgubGVuID0gaHRvbnMoc2l6ZW9mKHN0cnVjdCBib290cF9wa3QpIC0gc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCS8qIFVEUCBjaGVja3N1bSBub3QgY2FsY3VsYXRlZCAtLSBleHBsaWNpdGx5IGFsbG93ZWQgaW4gQk9PVFAgUkZDICovCisKKwkvKiBDb25zdHJ1Y3QgREhDUC9CT09UUCBoZWFkZXIgKi8KKwliLT5vcCA9IEJPT1RQX1JFUVVFU1Q7CisJaWYgKGRldi0+dHlwZSA8IDI1NikgLyogY2hlY2sgZm9yIGZhbHNlIHR5cGVzICovCisJCWItPmh0eXBlID0gZGV2LT50eXBlOworCWVsc2UgaWYgKGRldi0+dHlwZSA9PSBBUlBIUkRfSUVFRTgwMl9UUikgLyogZml4IGZvciB0b2tlbiByaW5nICovCisJCWItPmh0eXBlID0gQVJQSFJEX0lFRUU4MDI7CisJZWxzZSBpZiAoZGV2LT50eXBlID09IEFSUEhSRF9GRERJKQorCQliLT5odHlwZSA9IEFSUEhSRF9FVEhFUjsKKwllbHNlIHsKKwkJcHJpbnRrKCJVbmtub3duIEFSUCB0eXBlIDB4JTA0eCBmb3IgZGV2aWNlICVzXG4iLCBkZXYtPnR5cGUsIGRldi0+bmFtZSk7CisJCWItPmh0eXBlID0gZGV2LT50eXBlOyAvKiBjYW4gY2F1c2UgdW5kZWZpbmVkIGJlaGF2aW9yICovCisJfQorCWItPmhsZW4gPSBkZXYtPmFkZHJfbGVuOworCWItPnlvdXJfaXAgPSBJTkFERFJfTk9ORTsKKwliLT5zZXJ2ZXJfaXAgPSBJTkFERFJfTk9ORTsKKwltZW1jcHkoYi0+aHdfYWRkciwgZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbik7CisJYi0+c2VjcyA9IGh0b25zKGppZmZpZXNfZGlmZiAvIEhaKTsKKwliLT54aWQgPSBkLT54aWQ7CisKKwkvKiBhZGQgREhDUCBvcHRpb25zIG9yIEJPT1RQIGV4dGVuc2lvbnMgKi8KKyNpZmRlZiBJUENPTkZJR19ESENQCisJaWYgKGljX3Byb3RvX2VuYWJsZWQgJiBJQ19VU0VfREhDUCkKKwkJaWNfZGhjcF9pbml0X29wdGlvbnMoYi0+ZXh0ZW4pOworCWVsc2UKKyNlbmRpZgorCQlpY19ib290cF9pbml0X2V4dChiLT5leHRlbik7CisKKwkvKiBDaGFpbiBwYWNrZXQgZG93biB0aGUgbGluZS4uLiAqLworCXNrYi0+ZGV2ID0gZGV2OworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisJaWYgKChkZXYtPmhhcmRfaGVhZGVyICYmCisJICAgICBkZXYtPmhhcmRfaGVhZGVyKHNrYiwgZGV2LCBudG9ocyhza2ItPnByb3RvY29sKSwgZGV2LT5icm9hZGNhc3QsIGRldi0+ZGV2X2FkZHIsIHNrYi0+bGVuKSA8IDApIHx8CisJICAgIGRldl9xdWV1ZV94bWl0KHNrYikgPCAwKQorCQlwcmludGsoIkUiKTsKK30KKworCisvKgorICogIENvcHkgQk9PVFAtc3VwcGxpZWQgc3RyaW5nIGlmIG5vdCBhbHJlYWR5IHNldC4KKyAqLworc3RhdGljIGludCBfX2luaXQgaWNfYm9vdHBfc3RyaW5nKGNoYXIgKmRlc3QsIGNoYXIgKnNyYywgaW50IGxlbiwgaW50IG1heCkKK3sKKwlpZiAoIWxlbikKKwkJcmV0dXJuIDA7CisJaWYgKGxlbiA+IG1heC0xKQorCQlsZW4gPSBtYXgtMTsKKwltZW1jcHkoZGVzdCwgc3JjLCBsZW4pOworCWRlc3RbbGVuXSA9ICdcMCc7CisJcmV0dXJuIDE7Cit9CisKKworLyoKKyAqICBQcm9jZXNzIEJPT1RQIGV4dGVuc2lvbnMuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBpY19kb19ib290cF9leHQodTggKmV4dCkKK3sKKyAgICAgICB1OCBzZXJ2ZXJzOworICAgICAgIGludCBpOworCisjaWZkZWYgSVBDT05GSUdfREVCVUcKKwl1OCAqYzsKKworCXByaW50aygiREhDUC9CT09UUDogR290IGV4dGVuc2lvbiAlZDoiLCpleHQpOworCWZvcihjPWV4dCsyOyBjPGV4dCsyK2V4dFsxXTsgYysrKQorCQlwcmludGsoIiAlMDJ4IiwgKmMpOworCXByaW50aygiXG4iKTsKKyNlbmRpZgorCisJc3dpdGNoICgqZXh0KyspIHsKKwkJY2FzZSAxOgkJLyogU3VibmV0IG1hc2sgKi8KKwkJCWlmIChpY19uZXRtYXNrID09IElOQUREUl9OT05FKQorCQkJCW1lbWNweSgmaWNfbmV0bWFzaywgZXh0KzEsIDQpOworCQkJYnJlYWs7CisJCWNhc2UgMzoJCS8qIERlZmF1bHQgZ2F0ZXdheSAqLworCQkJaWYgKGljX2dhdGV3YXkgPT0gSU5BRERSX05PTkUpCisJCQkJbWVtY3B5KCZpY19nYXRld2F5LCBleHQrMSwgNCk7CisJCQlicmVhazsKKwkJY2FzZSA2OgkJLyogRE5TIHNlcnZlciAqLworCQkJc2VydmVycz0gKmV4dC80OworCQkJaWYgKHNlcnZlcnMgPiBDT05GX05BTUVTRVJWRVJTX01BWCkKKwkJCQlzZXJ2ZXJzID0gQ09ORl9OQU1FU0VSVkVSU19NQVg7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2VydmVyczsgaSsrKSB7CisJCQkJaWYgKGljX25hbWVzZXJ2ZXJzW2ldID09IElOQUREUl9OT05FKQorCQkJCQltZW1jcHkoJmljX25hbWVzZXJ2ZXJzW2ldLCBleHQrMSs0KmksIDQpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMTI6CS8qIEhvc3QgbmFtZSAqLworCQkJaWNfYm9vdHBfc3RyaW5nKHN5c3RlbV91dHNuYW1lLm5vZGVuYW1lLCBleHQrMSwgKmV4dCwgX19ORVdfVVRTX0xFTik7CisJCQlpY19ob3N0X25hbWVfc2V0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIDE1OgkvKiBEb21haW4gbmFtZSAoRE5TKSAqLworCQkJaWNfYm9vdHBfc3RyaW5nKGljX2RvbWFpbiwgZXh0KzEsICpleHQsIHNpemVvZihpY19kb21haW4pKTsKKwkJCWJyZWFrOworCQljYXNlIDE3OgkvKiBSb290IHBhdGggKi8KKwkJCWlmICghcm9vdF9zZXJ2ZXJfcGF0aFswXSkKKwkJCQlpY19ib290cF9zdHJpbmcocm9vdF9zZXJ2ZXJfcGF0aCwgZXh0KzEsICpleHQsIHNpemVvZihyb290X3NlcnZlcl9wYXRoKSk7CisJCQlicmVhazsKKwkJY2FzZSA0MDoJLyogTklTIERvbWFpbiBuYW1lIChfbm90XyBETlMpICovCisJCQlpY19ib290cF9zdHJpbmcoc3lzdGVtX3V0c25hbWUuZG9tYWlubmFtZSwgZXh0KzEsICpleHQsIF9fTkVXX1VUU19MRU4pOworCQkJYnJlYWs7CisJfQorfQorCisKKy8qCisgKiAgUmVjZWl2ZSBCT09UUCByZXBseS4KKyAqLworc3RhdGljIGludCBfX2luaXQgaWNfYm9vdHBfcmVjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0KQoreworCXN0cnVjdCBib290cF9wa3QgKmI7CisJc3RydWN0IGlwaGRyICpoOworCXN0cnVjdCBpY19kZXZpY2UgKmQ7CisJaW50IGxlbiwgZXh0X2xlbjsKKworCS8qIFBlcmZvcm0gdmVyaWZpY2F0aW9ucyBiZWZvcmUgdGFraW5nIHRoZSBsb2NrLiAgKi8KKwlpZiAoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfT1RIRVJIT1NUKQorCQlnb3RvIGRyb3A7CisKKwlpZiAoKHNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQlyZXR1cm4gTkVUX1JYX0RST1A7CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBpcGhkcikgKworCQkJICAgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpKSkKKwkJZ290byBkcm9wOworCisJYiA9IChzdHJ1Y3QgYm9vdHBfcGt0ICopIHNrYi0+bmguaXBoOworCWggPSAmYi0+aXBoOworCisJaWYgKGgtPmlobCAhPSA1IHx8IGgtPnZlcnNpb24gIT0gNCB8fCBoLT5wcm90b2NvbCAhPSBJUFBST1RPX1VEUCkKKwkJZ290byBkcm9wOworCisJLyogRnJhZ21lbnRzIGFyZSBub3Qgc3VwcG9ydGVkICovCisJaWYgKGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfT0ZGU0VUIHwgSVBfTUYpKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9FUlIgIkRIQ1AvQk9PVFA6IElnbm9yaW5nIGZyYWdtZW50ZWQgIgorCQkJICAgICAgICJyZXBseS5cbiIpOworCQlnb3RvIGRyb3A7CisJfQorCisJaWYgKHNrYi0+bGVuIDwgbnRvaHMoaC0+dG90X2xlbikpCisJCWdvdG8gZHJvcDsKKworCWlmIChpcF9mYXN0X2NzdW0oKGNoYXIgKikgaCwgaC0+aWhsKSkKKwkJZ290byBkcm9wOworCisJaWYgKGItPnVkcGguc291cmNlICE9IGh0b25zKDY3KSB8fCBiLT51ZHBoLmRlc3QgIT0gaHRvbnMoNjgpKQorCQlnb3RvIGRyb3A7CisKKwlpZiAobnRvaHMoaC0+dG90X2xlbikgPCBudG9ocyhiLT51ZHBoLmxlbikgKyBzaXplb2Yoc3RydWN0IGlwaGRyKSkKKwkJZ290byBkcm9wOworCisJbGVuID0gbnRvaHMoYi0+dWRwaC5sZW4pIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCWV4dF9sZW4gPSBsZW4gLSAoc2l6ZW9mKCpiKSAtCisJCQkgc2l6ZW9mKHN0cnVjdCBpcGhkcikgLQorCQkJIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSAtCisJCQkgc2l6ZW9mKGItPmV4dGVuKSk7CisJaWYgKGV4dF9sZW4gPCAwKQorCQlnb3RvIGRyb3A7CisKKwkvKiBPayB0aGUgZnJvbnQgbG9va3MgZ29vZCwgbWFrZSBzdXJlIHdlIGNhbiBnZXQgYXQgdGhlIHJlc3QuICAqLworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNrYi0+bGVuKSkKKwkJZ290byBkcm9wOworCisJYiA9IChzdHJ1Y3QgYm9vdHBfcGt0ICopIHNrYi0+bmguaXBoOworCWggPSAmYi0+aXBoOworCisJLyogT25lIHJlcGx5IGF0IGEgdGltZSwgcGxlYXNlLiAqLworCXNwaW5fbG9jaygmaWNfcmVjdl9sb2NrKTsKKworCS8qIElmIHdlIGFscmVhZHkgaGF2ZSBhIHJlcGx5LCBqdXN0IGRyb3AgdGhlIHBhY2tldCAqLworCWlmIChpY19nb3RfcmVwbHkpCisJCWdvdG8gZHJvcF91bmxvY2s7CisKKwkvKiBGaW5kIHRoZSBpY19kZXZpY2UgdGhhdCB0aGUgcGFja2V0IGFycml2ZWQgb24gKi8KKwlkID0gaWNfZmlyc3RfZGV2OworCXdoaWxlIChkICYmIGQtPmRldiAhPSBkZXYpCisJCWQgPSBkLT5uZXh0OworCWlmICghZCkKKwkJZ290byBkcm9wX3VubG9jazsgIC8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKworCS8qIElzIGl0IGEgcmVwbHkgdG8gb3VyIEJPT1RQIHJlcXVlc3Q/ICovCisJaWYgKGItPm9wICE9IEJPT1RQX1JFUExZIHx8CisJICAgIGItPnhpZCAhPSBkLT54aWQpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX0VSUiAiREhDUC9CT09UUDogUmVwbHkgbm90IGZvciB1cywgIgorCQkJICAgICAgICJvcFsleF0geGlkWyV4XVxuIiwKKwkJCSAgICAgICBiLT5vcCwgYi0+eGlkKTsKKwkJZ290byBkcm9wX3VubG9jazsKKwl9CisKKwkvKiBQYXJzZSBleHRlbnNpb25zICovCisJaWYgKGV4dF9sZW4gPj0gNCAmJgorCSAgICAhbWVtY21wKGItPmV4dGVuLCBpY19ib290cF9jb29raWUsIDQpKSB7IC8qIENoZWNrIG1hZ2ljIGNvb2tpZSAqLworICAgICAgICAgICAgICAgIHU4ICplbmQgPSAodTggKikgYiArIG50b2hzKGItPmlwaC50b3RfbGVuKTsKKwkJdTggKmV4dDsKKworI2lmZGVmIElQQ09ORklHX0RIQ1AKKwkJaWYgKGljX3Byb3RvX2VuYWJsZWQgJiBJQ19VU0VfREhDUCkgeworCQkJdTMyIHNlcnZlcl9pZCA9IElOQUREUl9OT05FOworCQkJaW50IG10ID0gMDsKKworCQkJZXh0ID0gJmItPmV4dGVuWzRdOworCQkJd2hpbGUgKGV4dCA8IGVuZCAmJiAqZXh0ICE9IDB4ZmYpIHsKKwkJCQl1OCAqb3B0ID0gZXh0Kys7CisJCQkJaWYgKCpvcHQgPT0gMCkJLyogUGFkZGluZyAqLworCQkJCQljb250aW51ZTsKKwkJCQlleHQgKz0gKmV4dCArIDE7CisJCQkJaWYgKGV4dCA+PSBlbmQpCisJCQkJCWJyZWFrOworCQkJCXN3aXRjaCAoKm9wdCkgeworCQkJCWNhc2UgNTM6CS8qIE1lc3NhZ2UgdHlwZSAqLworCQkJCQlpZiAob3B0WzFdKQorCQkJCQkJbXQgPSBvcHRbMl07CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNTQ6CS8qIFNlcnZlciBJRCAoSVAgYWRkcmVzcykgKi8KKwkJCQkJaWYgKG9wdFsxXSA+PSA0KQorCQkJCQkJbWVtY3B5KCZzZXJ2ZXJfaWQsIG9wdCArIDIsIDQpOworCQkJCQlicmVhazsKKwkJCQl9OworCQkJfQorCisjaWZkZWYgSVBDT05GSUdfREVCVUcKKwkJCXByaW50aygiREhDUDogR290IG1lc3NhZ2UgdHlwZSAlZFxuIiwgbXQpOworI2VuZGlmCisKKwkJCXN3aXRjaCAobXQpIHsKKwkJCWNhc2UgREhDUE9GRkVSOgorCQkJCS8qIFdoaWxlIGluIHRoZSBwcm9jZXNzIG9mIGFjY2VwdGluZyBvbmUgb2ZmZXIsCisJCQkJICogaWdub3JlIGFsbCBvdGhlcnMuCisJCQkJICovCisJCQkJaWYgKGljX215YWRkciAhPSBJTkFERFJfTk9ORSkKKwkJCQkJZ290byBkcm9wX3VubG9jazsKKworCQkJCS8qIExldCdzIGFjY2VwdCB0aGF0IG9mZmVyLiAqLworCQkJCWljX215YWRkciA9IGItPnlvdXJfaXA7CisJCQkJaWNfc2VydmFkZHIgPSBzZXJ2ZXJfaWQ7CisjaWZkZWYgSVBDT05GSUdfREVCVUcKKwkJCQlwcmludGsoIkRIQ1A6IE9mZmVyZWQgYWRkcmVzcyAldS4ldS4ldS4ldSIsCisJCQkJICAgICAgIE5JUFFVQUQoaWNfbXlhZGRyKSk7CisJCQkJcHJpbnRrKCIgYnkgc2VydmVyICV1LiV1LiV1LiV1XG4iLAorCQkJCSAgICAgICBOSVBRVUFEKGljX3NlcnZhZGRyKSk7CisjZW5kaWYKKwkJCQkvKiBUaGUgREhDUCBpbmRpY2F0ZWQgc2VydmVyIGFkZHJlc3MgdGFrZXMKKwkJCQkgKiBwcmVjZWRlbmNlIG92ZXIgdGhlIGJvb3RwIGhlYWRlciBvbmUgaWYKKwkJCQkgKiB0aGV5IGFyZSBkaWZmZXJlbnQuCisJCQkJICovCisJCQkJaWYgKChzZXJ2ZXJfaWQgIT0gSU5BRERSX05PTkUpICYmCisJCQkJICAgIChiLT5zZXJ2ZXJfaXAgIT0gc2VydmVyX2lkKSkKKwkJCQkJYi0+c2VydmVyX2lwID0gaWNfc2VydmFkZHI7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgREhDUEFDSzoKKwkJCQlpZiAobWVtY21wKGRldi0+ZGV2X2FkZHIsIGItPmh3X2FkZHIsIGRldi0+YWRkcl9sZW4pICE9IDApCisJCQkJCWdvdG8gZHJvcF91bmxvY2s7CisKKwkJCQkvKiBZZWFoISAqLworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCS8qIFVycXVlLiAgRm9yZ2V0IGl0Ki8KKwkJCQlpY19teWFkZHIgPSBJTkFERFJfTk9ORTsKKwkJCQlpY19zZXJ2YWRkciA9IElOQUREUl9OT05FOworCQkJCWdvdG8gZHJvcF91bmxvY2s7CisJCQl9OworCisJCQlpY19kaGNwX21zZ3R5cGUgPSBtdDsKKworCQl9CisjZW5kaWYgLyogSVBDT05GSUdfREhDUCAqLworCisJCWV4dCA9ICZiLT5leHRlbls0XTsKKwkJd2hpbGUgKGV4dCA8IGVuZCAmJiAqZXh0ICE9IDB4ZmYpIHsKKwkJCXU4ICpvcHQgPSBleHQrKzsKKwkJCWlmICgqb3B0ID09IDApCS8qIFBhZGRpbmcgKi8KKwkJCQljb250aW51ZTsKKwkJCWV4dCArPSAqZXh0ICsgMTsKKwkJCWlmIChleHQgPCBlbmQpCisJCQkJaWNfZG9fYm9vdHBfZXh0KG9wdCk7CisJCX0KKwl9CisKKwkvKiBXZSBoYXZlIGEgd2lubmVyISAqLworCWljX2RldiA9IGRldjsKKwlpY19teWFkZHIgPSBiLT55b3VyX2lwOworCWljX3NlcnZhZGRyID0gYi0+c2VydmVyX2lwOworCWlmIChpY19nYXRld2F5ID09IElOQUREUl9OT05FICYmIGItPnJlbGF5X2lwKQorCQlpY19nYXRld2F5ID0gYi0+cmVsYXlfaXA7CisJaWYgKGljX25hbWVzZXJ2ZXJzWzBdID09IElOQUREUl9OT05FKQorCQlpY19uYW1lc2VydmVyc1swXSA9IGljX3NlcnZhZGRyOworCWljX2dvdF9yZXBseSA9IElDX0JPT1RQOworCitkcm9wX3VubG9jazoKKwkvKiBTaG93J3Mgb3Zlci4gIE5vdGhpbmcgdG8gc2VlIGhlcmUuICAqLworCXNwaW5fdW5sb2NrKCZpY19yZWN2X2xvY2spOworCitkcm9wOgorCS8qIFRocm93IHRoZSBwYWNrZXQgb3V0LiAqLworCWtmcmVlX3NrYihza2IpOworCisJcmV0dXJuIDA7Cit9CQorCisKKyNlbmRpZgorCisKKy8qCisgKglEeW5hbWljIElQIGNvbmZpZ3VyYXRpb24gLS0gREhDUCwgQk9PVFAsIFJBUlAuCisgKi8KKworI2lmZGVmIElQQ09ORklHX0RZTkFNSUMKKworc3RhdGljIGludCBfX2luaXQgaWNfZHluYW1pYyh2b2lkKQoreworCWludCByZXRyaWVzOworCXN0cnVjdCBpY19kZXZpY2UgKmQ7CisJdW5zaWduZWQgbG9uZyBzdGFydF9qaWZmaWVzLCB0aW1lb3V0LCBqaWZmOworCWludCBkb19ib290cCA9IGljX3Byb3RvX2hhdmVfaWYgJiBJQ19CT09UUDsKKwlpbnQgZG9fcmFycCA9IGljX3Byb3RvX2hhdmVfaWYgJiBJQ19SQVJQOworCisJLyoKKwkgKiBJZiBub25lIG9mIERIQ1AvQk9PVFAvUkFSUCB3YXMgc2VsZWN0ZWQsIHJldHVybiB3aXRoIGFuIGVycm9yLgorCSAqIFRoaXMgcm91dGluZSBnZXRzIG9ubHkgY2FsbGVkIHdoZW4gc29tZSBwaWVjZXMgb2YgaW5mb3JtYXRpb24KKwkgKiBhcmUgbWlzc2luZywgYW5kIHdpdGhvdXQgREhDUC9CT09UUC9SQVJQIHdlIGFyZSB1bmFibGUgdG8gZ2V0IGl0LgorCSAqLworCWlmICghaWNfcHJvdG9fZW5hYmxlZCkgeworCQlwcmludGsoS0VSTl9FUlIgIklQLUNvbmZpZzogSW5jb21wbGV0ZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworI2lmZGVmIElQQ09ORklHX0JPT1RQCisJaWYgKChpY19wcm90b19lbmFibGVkIF4gaWNfcHJvdG9faGF2ZV9pZikgJiBJQ19CT09UUCkKKwkJcHJpbnRrKEtFUk5fRVJSICJESENQL0JPT1RQOiBObyBzdWl0YWJsZSBkZXZpY2UgZm91bmQuXG4iKTsKKyNlbmRpZgorI2lmZGVmIElQQ09ORklHX1JBUlAKKwlpZiAoKGljX3Byb3RvX2VuYWJsZWQgXiBpY19wcm90b19oYXZlX2lmKSAmIElDX1JBUlApCisJCXByaW50ayhLRVJOX0VSUiAiUkFSUDogTm8gc3VpdGFibGUgZGV2aWNlIGZvdW5kLlxuIik7CisjZW5kaWYKKworCWlmICghaWNfcHJvdG9faGF2ZV9pZikKKwkJLyogRXJyb3IgbWVzc2FnZSBhbHJlYWR5IHByaW50ZWQgKi8KKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiBTZXR1cCBwcm90b2NvbHMKKwkgKi8KKyNpZmRlZiBJUENPTkZJR19CT09UUAorCWlmIChkb19ib290cCkKKwkJaWNfYm9vdHBfaW5pdCgpOworI2VuZGlmCisjaWZkZWYgSVBDT05GSUdfUkFSUAorCWlmIChkb19yYXJwKQorCQlpY19yYXJwX2luaXQoKTsKKyNlbmRpZgorCisJLyoKKwkgKiBTZW5kIHJlcXVlc3RzIGFuZCB3YWl0LCB1bnRpbCB3ZSBnZXQgYW4gYW5zd2VyLiBUaGlzIGxvb3AKKwkgKiBzZWVtcyB0byBiZSBhIHRlcnJpYmxlIHdhc3RlIG9mIENQVSB0aW1lLCBidXQgYWN0dWFsbHkgdGhlcmUgaXMKKwkgKiBvbmx5IG9uZSBwcm9jZXNzIHJ1bm5pbmcgYXQgYWxsLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHVzZSBhbnkKKwkgKiBzY2hlZHVsZXIgZnVuY3Rpb25zLgorCSAqIFtBY3R1YWxseSB3ZSBjb3VsZCBub3csIGJ1dCB0aGUgbm90aGluZyBlbHNlIHJ1bm5pbmcgbm90ZSBzdGlsbCAKKwkgKiAgYXBwbGllcy4uIC0gQUNdCisJICovCisJcHJpbnRrKEtFUk5fTk9USUNFICJTZW5kaW5nICVzJXMlcyByZXF1ZXN0cyAuIiwKKwkgICAgICAgZG9fYm9vdHAKKwkJPyAoKGljX3Byb3RvX2VuYWJsZWQgJiBJQ19VU0VfREhDUCkgPyAiREhDUCIgOiAiQk9PVFAiKSA6ICIiLAorCSAgICAgICAoZG9fYm9vdHAgJiYgZG9fcmFycCkgPyAiIGFuZCAiIDogIiIsCisJICAgICAgIGRvX3JhcnAgPyAiUkFSUCIgOiAiIik7CisKKwlzdGFydF9qaWZmaWVzID0gamlmZmllczsKKwlkID0gaWNfZmlyc3RfZGV2OworCXJldHJpZXMgPSBDT05GX1NFTkRfUkVUUklFUzsKKwlnZXRfcmFuZG9tX2J5dGVzKCZ0aW1lb3V0LCBzaXplb2YodGltZW91dCkpOworCXRpbWVvdXQgPSBDT05GX0JBU0VfVElNRU9VVCArICh0aW1lb3V0ICUgKHVuc2lnbmVkKSBDT05GX1RJTUVPVVRfUkFORE9NKTsKKwlmb3IoOzspIHsKKyNpZmRlZiBJUENPTkZJR19CT09UUAorCQlpZiAoZG9fYm9vdHAgJiYgKGQtPmFibGUgJiBJQ19CT09UUCkpCisJCQlpY19ib290cF9zZW5kX2lmKGQsIGppZmZpZXMgLSBzdGFydF9qaWZmaWVzKTsKKyNlbmRpZgorI2lmZGVmIElQQ09ORklHX1JBUlAKKwkJaWYgKGRvX3JhcnAgJiYgKGQtPmFibGUgJiBJQ19SQVJQKSkKKwkJCWljX3JhcnBfc2VuZF9pZihkKTsKKyNlbmRpZgorCisJCWppZmYgPSBqaWZmaWVzICsgKGQtPm5leHQgPyBDT05GX0lOVEVSX1RJTUVPVVQgOiB0aW1lb3V0KTsKKwkJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGppZmYpICYmICFpY19nb3RfcmVwbHkpIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCX0KKyNpZmRlZiBJUENPTkZJR19ESENQCisJCS8qIERIQ1AgaXNuJ3QgZG9uZSB1bnRpbCB3ZSBnZXQgYSBESENQQUNLLiAqLworCQlpZiAoKGljX2dvdF9yZXBseSAmIElDX0JPT1RQKQorCQkgICAgJiYgKGljX3Byb3RvX2VuYWJsZWQgJiBJQ19VU0VfREhDUCkKKwkJICAgICYmIGljX2RoY3BfbXNndHlwZSAhPSBESENQQUNLKQorCQl7CisJCQlpY19nb3RfcmVwbHkgPSAwOworCQkJcHJpbnRrKCIsIik7CisJCQljb250aW51ZTsKKwkJfQorI2VuZGlmIC8qIElQQ09ORklHX0RIQ1AgKi8KKworCQlpZiAoaWNfZ290X3JlcGx5KSB7CisJCQlwcmludGsoIiBPS1xuIik7CisJCQlicmVhazsKKwkJfQorCisJCWlmICgoZCA9IGQtPm5leHQpKQorCQkJY29udGludWU7CisKKwkJaWYgKCEgLS1yZXRyaWVzKSB7CisJCQlwcmludGsoIiB0aW1lZCBvdXQhXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZCA9IGljX2ZpcnN0X2RldjsKKworCQl0aW1lb3V0ID0gdGltZW91dCBDT05GX1RJTUVPVVRfTVVMVDsKKwkJaWYgKHRpbWVvdXQgPiBDT05GX1RJTUVPVVRfTUFYKQorCQkJdGltZW91dCA9IENPTkZfVElNRU9VVF9NQVg7CisKKwkJcHJpbnRrKCIuIik7CisJfQorCisjaWZkZWYgSVBDT05GSUdfQk9PVFAKKwlpZiAoZG9fYm9vdHApCisJCWljX2Jvb3RwX2NsZWFudXAoKTsKKyNlbmRpZgorI2lmZGVmIElQQ09ORklHX1JBUlAKKwlpZiAoZG9fcmFycCkKKwkJaWNfcmFycF9jbGVhbnVwKCk7CisjZW5kaWYKKworCWlmICghaWNfZ290X3JlcGx5KQorCQlyZXR1cm4gLTE7CisKKwlwcmludGsoIklQLUNvbmZpZzogR290ICVzIGFuc3dlciBmcm9tICV1LiV1LiV1LiV1LCAiLAorCQkoKGljX2dvdF9yZXBseSAmIElDX1JBUlApID8gIlJBUlAiIAorCQkgOiAoaWNfcHJvdG9fZW5hYmxlZCAmIElDX1VTRV9ESENQKSA/ICJESENQIiA6ICJCT09UUCIpLAorCQlOSVBRVUFEKGljX3NlcnZhZGRyKSk7CisJcHJpbnRrKCJteSBhZGRyZXNzIGlzICV1LiV1LiV1LiV1XG4iLCBOSVBRVUFEKGljX215YWRkcikpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBJUENPTkZJR19EWU5BTUlDICovCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCitzdGF0aWMgaW50IHBucF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpbnQgaTsKKworCWlmIChpY19wcm90b191c2VkICYgSUNfUFJPVE8pCisJCXNlcV9wcmludGYoc2VxLCAiI1BST1RPOiAlc1xuIiwKKwkJCSAgIChpY19wcm90b191c2VkICYgSUNfUkFSUCkgPyAiUkFSUCIKKwkJCSAgIDogKGljX3Byb3RvX3VzZWQgJiBJQ19VU0VfREhDUCkgPyAiREhDUCIgOiAiQk9PVFAiKTsKKwllbHNlCisJCXNlcV9wdXRzKHNlcSwgIiNNQU5VQUxcbiIpOworCisJaWYgKGljX2RvbWFpblswXSkKKwkJc2VxX3ByaW50ZihzZXEsCisJCQkgICAiZG9tYWluICVzXG4iLCBpY19kb21haW4pOworCWZvciAoaSA9IDA7IGkgPCBDT05GX05BTUVTRVJWRVJTX01BWDsgaSsrKSB7CisJCWlmIChpY19uYW1lc2VydmVyc1tpXSAhPSBJTkFERFJfTk9ORSkKKwkJCXNlcV9wcmludGYoc2VxLAorCQkJCSAgICJuYW1lc2VydmVyICV1LiV1LiV1LiV1XG4iLAorCQkJCSAgIE5JUFFVQUQoaWNfbmFtZXNlcnZlcnNbaV0pKTsKKwl9CisJaWYgKGljX3NlcnZhZGRyICE9IElOQUREUl9OT05FKQorCQlzZXFfcHJpbnRmKHNlcSwKKwkJCSAgICJib290c2VydmVyICV1LiV1LiV1LiV1XG4iLAorCQkJICAgTklQUVVBRChpY19zZXJ2YWRkcikpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBucF9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmluZG9lLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcG5wX3NlcV9zaG93LCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcG5wX3NlcV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBwbnBfc2VxX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworLyoKKyAqICBFeHRyYWN0IElQIGFkZHJlc3MgZnJvbSB0aGUgcGFyYW1ldGVyIHN0cmluZyBpZiBuZWVkZWQuIE5vdGUgdGhhdCB3ZQorICogIG5lZWQgdG8gaGF2ZSByb290X3NlcnZlcl9hZGRyIHNldCBfYmVmb3JlXyBJUENvbmZpZyBnZXRzIGNhbGxlZCBhcyBpdAorICogIGNhbiBvdmVycmlkZSBpdC4KKyAqLwordTMyIF9faW5pdCByb290X25mc19wYXJzZV9hZGRyKGNoYXIgKm5hbWUpCit7CisJdTMyIGFkZHI7CisJaW50IG9jdGV0cyA9IDA7CisJY2hhciAqY3AsICpjcTsKKworCWNwID0gY3EgPSBuYW1lOworCXdoaWxlIChvY3RldHMgPCA0KSB7CisJCXdoaWxlICgqY3AgPj0gJzAnICYmICpjcCA8PSAnOScpCisJCQljcCsrOworCQlpZiAoY3AgPT0gY3EgfHwgY3AgLSBjcSA+IDMpCisJCQlicmVhazsKKwkJaWYgKCpjcCA9PSAnLicgfHwgb2N0ZXRzID09IDMpCisJCQlvY3RldHMrKzsKKwkJaWYgKG9jdGV0cyA8IDQpCisJCQljcCsrOworCQljcSA9IGNwOworCX0KKwlpZiAob2N0ZXRzID09IDQgJiYgKCpjcCA9PSAnOicgfHwgKmNwID09ICdcMCcpKSB7CisJCWlmICgqY3AgPT0gJzonKQorCQkJKmNwKysgPSAnXDAnOworCQlhZGRyID0gaW5fYXRvbihuYW1lKTsKKwkJbWVtbW92ZShuYW1lLCBjcCwgc3RybGVuKGNwKSArIDEpOworCX0gZWxzZQorCQlhZGRyID0gSU5BRERSX05PTkU7CisKKwlyZXR1cm4gYWRkcjsKK30KKworLyoKKyAqCUlQIEF1dG9jb25maWcgZGlzcGF0Y2hlci4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBpcF9hdXRvX2NvbmZpZyh2b2lkKQoreworCXUzMiBhZGRyOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlwcm9jX25ldF9mb3BzX2NyZWF0ZSgicG5wIiwgU19JUlVHTywgJnBucF9zZXFfZm9wcyk7CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworCWlmICghaWNfZW5hYmxlKQorCQlyZXR1cm4gMDsKKworCURCRygoIklQLUNvbmZpZzogRW50ZXJlZC5cbiIpKTsKKyNpZmRlZiBJUENPTkZJR19EWU5BTUlDCisgdHJ5X3RyeV9hZ2FpbjoKKyNlbmRpZgorCS8qIEdpdmUgaGFyZHdhcmUgYSBjaGFuY2UgdG8gc2V0dGxlICovCisJbXNsZWVwKENPTkZfUFJFX09QRU4pOworCisJLyogU2V0dXAgYWxsIG5ldHdvcmsgZGV2aWNlcyAqLworCWlmIChpY19vcGVuX2RldnMoKSA8IDApCisJCXJldHVybiAtMTsKKworCS8qIEdpdmUgZHJpdmVycyBhIGNoYW5jZSB0byBzZXR0bGUgKi8KKwlzc2xlZXAoQ09ORl9QT1NUX09QRU4pOworCisJLyoKKwkgKiBJZiB0aGUgY29uZmlnIGluZm9ybWF0aW9uIGlzIGluc3VmZmljaWVudCAoZS5nLiwgb3VyIElQIGFkZHJlc3Mgb3IKKwkgKiBJUCBhZGRyZXNzIG9mIHRoZSBib290IHNlcnZlciBpcyBtaXNzaW5nIG9yIHdlIGhhdmUgbXVsdGlwbGUgbmV0d29yaworCSAqIGludGVyZmFjZXMgYW5kIG5vIGRlZmF1bHQgd2FzIHNldCksIHVzZSBCT09UUCBvciBSQVJQIHRvIGdldCB0aGUKKwkgKiBtaXNzaW5nIHZhbHVlcy4KKwkgKi8KKwlpZiAoaWNfbXlhZGRyID09IElOQUREUl9OT05FIHx8CisjaWZkZWYgQ09ORklHX1JPT1RfTkZTCisJICAgIChNQUpPUihST09UX0RFVikgPT0gVU5OQU1FRF9NQUpPUgorCSAgICAgJiYgcm9vdF9zZXJ2ZXJfYWRkciA9PSBJTkFERFJfTk9ORQorCSAgICAgJiYgaWNfc2VydmFkZHIgPT0gSU5BRERSX05PTkUpIHx8CisjZW5kaWYKKwkgICAgaWNfZmlyc3RfZGV2LT5uZXh0KSB7CisjaWZkZWYgSVBDT05GSUdfRFlOQU1JQworCQorCQlpbnQgcmV0cmllcyA9IENPTkZfT1BFTl9SRVRSSUVTOworCisJCWlmIChpY19keW5hbWljKCkgPCAwKSB7CisJCQlpY19jbG9zZV9kZXZzKCk7CisKKwkJCS8qCisJCQkgKiBJIGRvbid0IGtub3cgd2h5LCBidXQgc29tZXRpbWVzIHRoZQorCQkJICogZWVwcm8xMDAgZHJpdmVyIChhdCBsZWFzdCkgZ2V0cyB1cHNldCBhbmQKKwkJCSAqIGRvZXNuJ3Qgd29yayB0aGUgZmlyc3QgdGltZSBpdCdzIG9wZW5lZC4KKwkJCSAqIEJ1dCB0aGVuIGlmIHlvdSBjbG9zZSBpdCBhbmQgcmVvcGVuIGl0LCBpdAorCQkJICogd29ya3MganVzdCBmaW5lLiAgU28gd2UgbmVlZCB0byB0cnkgdGhhdCBhdAorCQkJICogbGVhc3Qgb25jZSBiZWZvcmUgZ2l2aW5nIHVwLgorCQkJICoKKwkJCSAqIEFsc28sIGlmIHRoZSByb290IHdpbGwgYmUgTkZTLW1vdW50ZWQsIHdlCisJCQkgKiBoYXZlIG5vd2hlcmUgdG8gZ28gaWYgREhDUCBmYWlscy4gIFNvIHdlCisJCQkgKiBqdXN0IGhhdmUgdG8ga2VlcCB0cnlpbmcgZm9yZXZlci4KKwkJCSAqCisJCQkgKiAJCQkJLS0gQ2hpcAorCQkJICovCisjaWZkZWYgQ09ORklHX1JPT1RfTkZTCisJCQlpZiAoUk9PVF9ERVYgPT0gIFJvb3RfTkZTKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSIAorCQkJCQkiSVAtQ29uZmlnOiBSZXRyeWluZyBmb3JldmVyIChORlMgcm9vdCkuLi5cbiIpOworCQkJCWdvdG8gdHJ5X3RyeV9hZ2FpbjsKKwkJCX0KKyNlbmRpZgorCisJCQlpZiAoLS1yZXRyaWVzKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSIAorCQkJCSAgICAgICAiSVAtQ29uZmlnOiBSZW9wZW5pbmcgbmV0d29yayBkZXZpY2VzLi4uXG4iKTsKKwkJCQlnb3RvIHRyeV90cnlfYWdhaW47CisJCQl9CisKKwkJCS8qIE9oLCB3ZWxsLiAgQXQgbGVhc3Qgd2UgdHJpZWQuICovCisJCQlwcmludGsoS0VSTl9FUlIgIklQLUNvbmZpZzogQXV0by1jb25maWd1cmF0aW9uIG9mIG5ldHdvcmsgZmFpbGVkLlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKyNlbHNlIC8qICFEWU5BTUlDICovCisJCXByaW50ayhLRVJOX0VSUiAiSVAtQ29uZmlnOiBJbmNvbXBsZXRlIG5ldHdvcmsgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi5cbiIpOworCQlpY19jbG9zZV9kZXZzKCk7CisJCXJldHVybiAtMTsKKyNlbmRpZiAvKiBJUENPTkZJR19EWU5BTUlDICovCisJfSBlbHNlIHsKKwkJLyogRGV2aWNlIHNlbGVjdGVkIG1hbnVhbGx5IG9yIG9ubHkgb25lIGRldmljZSAtPiB1c2UgaXQgKi8KKwkJaWNfZGV2ID0gaWNfZmlyc3RfZGV2LT5kZXY7CisJfQorCisJYWRkciA9IHJvb3RfbmZzX3BhcnNlX2FkZHIocm9vdF9zZXJ2ZXJfcGF0aCk7CisJaWYgKHJvb3Rfc2VydmVyX2FkZHIgPT0gSU5BRERSX05PTkUpCisJCXJvb3Rfc2VydmVyX2FkZHIgPSBhZGRyOworCisJLyoKKwkgKiBVc2UgZGVmYXVsdHMgd2hlcmVldmVyIGFwcGxpY2FibGUuCisJICovCisJaWYgKGljX2RlZmF1bHRzKCkgPCAwKQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIENsb3NlIGFsbCBuZXR3b3JrIGRldmljZXMgZXhjZXB0IHRoZSBkZXZpY2Ugd2UndmUKKwkgKiBhdXRvY29uZmlndXJlZCBhbmQgc2V0IHVwIHJvdXRlcy4KKwkgKi8KKwlpY19jbG9zZV9kZXZzKCk7CisJaWYgKGljX3NldHVwX2lmKCkgPCAwIHx8IGljX3NldHVwX3JvdXRlcygpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiBSZWNvcmQgd2hpY2ggcHJvdG9jb2wgd2FzIGFjdHVhbGx5IHVzZWQuCisJICovCisjaWZkZWYgSVBDT05GSUdfRFlOQU1JQworCWljX3Byb3RvX3VzZWQgPSBpY19nb3RfcmVwbHkgfCAoaWNfcHJvdG9fZW5hYmxlZCAmIElDX1VTRV9ESENQKTsKKyNlbmRpZgorCisjaWZuZGVmIElQQ09ORklHX1NJTEVOVAorCS8qCisJICogQ2x1ZSBpbiB0aGUgb3BlcmF0b3IuCisJICovCisJcHJpbnRrKCJJUC1Db25maWc6IENvbXBsZXRlOiIpOworCXByaW50aygiXG4gICAgICBkZXZpY2U9JXMiLCBpY19kZXYtPm5hbWUpOworCXByaW50aygiLCBhZGRyPSV1LiV1LiV1LiV1IiwgTklQUVVBRChpY19teWFkZHIpKTsKKwlwcmludGsoIiwgbWFzaz0ldS4ldS4ldS4ldSIsIE5JUFFVQUQoaWNfbmV0bWFzaykpOworCXByaW50aygiLCBndz0ldS4ldS4ldS4ldSIsIE5JUFFVQUQoaWNfZ2F0ZXdheSkpOworCXByaW50aygiLFxuICAgICBob3N0PSVzLCBkb21haW49JXMsIG5pcy1kb21haW49JXMiLAorCSAgICAgICBzeXN0ZW1fdXRzbmFtZS5ub2RlbmFtZSwgaWNfZG9tYWluLCBzeXN0ZW1fdXRzbmFtZS5kb21haW5uYW1lKTsKKwlwcmludGsoIixcbiAgICAgYm9vdHNlcnZlcj0ldS4ldS4ldS4ldSIsIE5JUFFVQUQoaWNfc2VydmFkZHIpKTsKKwlwcmludGsoIiwgcm9vdHNlcnZlcj0ldS4ldS4ldS4ldSIsIE5JUFFVQUQocm9vdF9zZXJ2ZXJfYWRkcikpOworCXByaW50aygiLCByb290cGF0aD0lcyIsIHJvb3Rfc2VydmVyX3BhdGgpOworCXByaW50aygiXG4iKTsKKyNlbmRpZiAvKiAhU0lMRU5UICovCisKKwlyZXR1cm4gMDsKK30KKworbGF0ZV9pbml0Y2FsbChpcF9hdXRvX2NvbmZpZyk7CisKKworLyoKKyAqICBEZWNvZGUgYW55IElQIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbiB0aGUgImlwPSIgb3IgIm5mc2FkZHJzPSIga2VybmVsCisgKiAgY29tbWFuZCBsaW5lIHBhcmFtZXRlci4gSXQgY29uc2lzdHMgb2Ygb3B0aW9uIGZpZWxkcyBzZXBhcmF0ZWQgYnkgY29sb25zIGluCisgKiAgdGhlIGZvbGxvd2luZyBvcmRlcjoKKyAqCisgKiAgPGNsaWVudC1pcD46PHNlcnZlci1pcD46PGd3LWlwPjo8bmV0bWFzaz46PGhvc3QgbmFtZT46PGRldmljZT46PFBST1RPPgorICoKKyAqICBBbnkgb2YgdGhlIGZpZWxkcyBjYW4gYmUgZW1wdHkgd2hpY2ggbWVhbnMgdG8gdXNlIGEgZGVmYXVsdCB2YWx1ZToKKyAqCTxjbGllbnQtaXA+CS0gYWRkcmVzcyBnaXZlbiBieSBCT09UUCBvciBSQVJQCisgKgk8c2VydmVyLWlwPgktIGFkZHJlc3Mgb2YgaG9zdCByZXR1cm5pbmcgQk9PVFAgb3IgUkFSUCBwYWNrZXQKKyAqCTxndy1pcD4JCS0gbm9uZSwgb3IgdGhlIGFkZHJlc3MgcmV0dXJuZWQgYnkgQk9PVFAKKyAqCTxuZXRtYXNrPgktIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZCBmcm9tIDxjbGllbnQtaXA+LCBvciB0aGUKKyAqCQkJICBvbmUgcmV0dXJuZWQgYnkgQk9PVFAKKyAqCTxob3N0IG5hbWU+CS0gPGNsaWVudC1pcD4gaW4gQVNDSUkgbm90YXRpb24sIG9yIHRoZSBuYW1lIHJldHVybmVkCisgKgkJCSAgYnkgQk9PVFAKKyAqCTxkZXZpY2U+CS0gdXNlIGFsbCBhdmFpbGFibGUgZGV2aWNlcworICoJPFBST1RPPjoKKyAqCSAgIG9mZnxub25lCSAgICAtIGRvbid0IGRvIGF1dG9jb25maWcgYXQgYWxsIChERUZBVUxUKQorICoJICAgb258YW55ICAgICAgICAgICAtIHVzZSBhbnkgY29uZmlndXJlZCBwcm90b2NvbAorICoJICAgZGhjcHxib290cHxyYXJwICAtIHVzZSBvbmx5IHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wKKyAqCSAgIGJvdGggICAgICAgICAgICAgLSB1c2UgYm90aCBCT09UUCBhbmQgUkFSUCAobm90IERIQ1ApCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGljX3Byb3RvX25hbWUoY2hhciAqbmFtZSkKK3sKKwlpZiAoIXN0cmNtcChuYW1lLCAib24iKSB8fCAhc3RyY21wKG5hbWUsICJhbnkiKSkgeworCQlyZXR1cm4gMTsKKwl9CisjaWZkZWYgQ09ORklHX0lQX1BOUF9ESENQCisJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZGhjcCIpKSB7CisJCWljX3Byb3RvX2VuYWJsZWQgJj0gfklDX1JBUlA7CisJCXJldHVybiAxOworCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19JUF9QTlBfQk9PVFAKKwllbHNlIGlmICghc3RyY21wKG5hbWUsICJib290cCIpKSB7CisJCWljX3Byb3RvX2VuYWJsZWQgJj0gfihJQ19SQVJQIHwgSUNfVVNFX0RIQ1ApOworCQlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSVBfUE5QX1JBUlAKKwllbHNlIGlmICghc3RyY21wKG5hbWUsICJyYXJwIikpIHsKKwkJaWNfcHJvdG9fZW5hYmxlZCAmPSB+KElDX0JPT1RQIHwgSUNfVVNFX0RIQ1ApOworCQlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKyNpZmRlZiBJUENPTkZJR19EWU5BTUlDCisJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiYm90aCIpKSB7CisJCWljX3Byb3RvX2VuYWJsZWQgJj0gfklDX1VTRV9ESENQOyAvKiBiYWNrd2FyZCBjb21wYXQgOi0oICovCisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpcF9hdXRvX2NvbmZpZ19zZXR1cChjaGFyICphZGRycykKK3sKKwljaGFyICpjcCwgKmlwLCAqZHA7CisJaW50IG51bSA9IDA7CisKKwlpY19zZXRfbWFudWFsbHkgPSAxOworCisJaWNfZW5hYmxlID0gKCphZGRycyAmJiAKKwkJKHN0cmNtcChhZGRycywgIm9mZiIpICE9IDApICYmIAorCQkoc3RyY21wKGFkZHJzLCAibm9uZSIpICE9IDApKTsKKwlpZiAoIWljX2VuYWJsZSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoaWNfcHJvdG9fbmFtZShhZGRycykpCisJCXJldHVybiAxOworCisJLyogUGFyc2UgdGhlIHdob2xlIHN0cmluZyAqLworCWlwID0gYWRkcnM7CisJd2hpbGUgKGlwICYmICppcCkgeworCQlpZiAoKGNwID0gc3RyY2hyKGlwLCAnOicpKSkKKwkJCSpjcCsrID0gJ1wwJzsKKwkJaWYgKHN0cmxlbihpcCkgPiAwKSB7CisJCQlEQkcoKCJJUC1Db25maWc6IFBhcmFtZXRlciAjJWQ6IGAlcydcbiIsIG51bSwgaXApKTsKKwkJCXN3aXRjaCAobnVtKSB7CisJCQljYXNlIDA6CisJCQkJaWYgKChpY19teWFkZHIgPSBpbl9hdG9uKGlwKSkgPT0gSU5BRERSX0FOWSkKKwkJCQkJaWNfbXlhZGRyID0gSU5BRERSX05PTkU7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJaWYgKChpY19zZXJ2YWRkciA9IGluX2F0b24oaXApKSA9PSBJTkFERFJfQU5ZKQorCQkJCQlpY19zZXJ2YWRkciA9IElOQUREUl9OT05FOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWlmICgoaWNfZ2F0ZXdheSA9IGluX2F0b24oaXApKSA9PSBJTkFERFJfQU5ZKQorCQkJCQlpY19nYXRld2F5ID0gSU5BRERSX05PTkU7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJaWYgKChpY19uZXRtYXNrID0gaW5fYXRvbihpcCkpID09IElOQUREUl9BTlkpCisJCQkJCWljX25ldG1hc2sgPSBJTkFERFJfTk9ORTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQlpZiAoKGRwID0gc3RyY2hyKGlwLCAnLicpKSkgeworCQkJCQkqZHArKyA9ICdcMCc7CisJCQkJCXN0cmxjcHkoc3lzdGVtX3V0c25hbWUuZG9tYWlubmFtZSwgZHAsCisJCQkJCQlzaXplb2Yoc3lzdGVtX3V0c25hbWUuZG9tYWlubmFtZSkpOworCQkJCX0KKwkJCQlzdHJsY3B5KHN5c3RlbV91dHNuYW1lLm5vZGVuYW1lLCBpcCwKKwkJCQkJc2l6ZW9mKHN5c3RlbV91dHNuYW1lLm5vZGVuYW1lKSk7CisJCQkJaWNfaG9zdF9uYW1lX3NldCA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDU6CisJCQkJc3RybGNweSh1c2VyX2Rldl9uYW1lLCBpcCwgc2l6ZW9mKHVzZXJfZGV2X25hbWUpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNjoKKwkJCQlpY19wcm90b19uYW1lKGlwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpcCA9IGNwOworCQludW0rKzsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2luaXQgbmZzYWRkcnNfY29uZmlnX3NldHVwKGNoYXIgKmFkZHJzKQoreworCXJldHVybiBpcF9hdXRvX2NvbmZpZ19zZXR1cChhZGRycyk7Cit9CisKK19fc2V0dXAoImlwPSIsIGlwX2F1dG9fY29uZmlnX3NldHVwKTsKK19fc2V0dXAoIm5mc2FkZHJzPSIsIG5mc2FkZHJzX2NvbmZpZ19zZXR1cCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcGlwLmMgYi9uZXQvaXB2NC9pcGlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhhNzg3MwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L2lwaXAuYwpAQCAtMCwwICsxLDkwNSBAQAorLyoKKyAqCUxpbnV4IE5FVDM6CUlQL0lQIHByb3RvY29sIGRlY29kZXIuIAorICoKKyAqCVZlcnNpb246ICRJZDogaXBpcC5jLHYgMS41MCAyMDAxLzEwLzAyIDAyOjIyOjM2IGRhdmVtIEV4cCAkCisgKgorICoJQXV0aG9yczoKKyAqCQlTYW0gTGFudGluZ2EgKHNsb3VrZW5AY3MudWNkYXZpcy5lZHUpICAwMi8wMS85NQorICoKKyAqCUZpeGVzOgorICoJCUFsYW4gQ294CToJTWVyZ2VkIGFuZCBtYWRlIHVzYWJsZSBub24gbW9kdWxhciAoaXRzIHNvIHRpbnkgaXRzIHNpbGx5IGFzCisgKgkJCQkJYSBtb2R1bGUgdGFraW5nIHVwIDIgcGFnZXMpLgorICoJCUFsYW4gQ294CTogCUZpeGVkIGJ1ZyB3aXRoIDEuMy4xOCBhbmQgSVBJUCBub3Qgd29ya2luZyAobm93IG5lZWRzIHRvIHNldCBza2ItPmguaXBoKQorICoJCQkJCXRvIGtlZXAgaXBfZm9yd2FyZCBoYXBweS4KKyAqCQlBbGFuIENveAk6CU1vcmUgZml4ZXMgZm9yIDEuMy4yMSwgYW5kIGZpcmV3YWxsIGZpeC4gTWF5YmUgdGhpcyB3aWxsIHdvcmsgc29vbiA4KS4KKyAqCQlLYWkgU2NodWx0ZQk6CUZpeGVkICNkZWZpbmVzIGZvciBJUF9GSVJFV0FMTC0+RklSRVdBTEwKKyAqICAgICAgICAgICAgICBEYXZpZCBXb29kaG91c2UgOiAgICAgICBQZXJmb3JtIHNvbWUgYmFzaWMgSUNNUCBoYW5kbGluZy4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUElQIFJvdXRpbmcgd2l0aG91dCBkZWNhcHN1bGF0aW9uLgorICogICAgICAgICAgICAgIENhcmxvcyBQaWNvdG8gICA6ICAgICAgIEdSRSBvdmVyIElQIHN1cHBvcnQKKyAqCQlBbGV4ZXkgS3V6bmV0c292OglSZXdvcmtlZC4gUmVhbGx5LCBub3cgaXQgaXMgdHJ1bmNhdGVkIHZlcnNpb24gb2YgaXB2NC9pcF9ncmUuYy4KKyAqCQkJCQlJIGRvIG5vdCB3YW50IHRvIG1lcmdlIHRoZW0gdG9nZXRoZXIuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworLyogdHVubmVsLmM6IGFuIElQIHR1bm5lbCBkcml2ZXIKKworCVRoZSBwdXJwb3NlIG9mIHRoaXMgZHJpdmVyIGlzIHRvIHByb3ZpZGUgYW4gSVAgdHVubmVsIHRocm91Z2gKKwl3aGljaCB5b3UgY2FuIHR1bm5lbCBuZXR3b3JrIHRyYWZmaWMgdHJhbnNwYXJlbnRseSBhY3Jvc3Mgc3VibmV0cy4KKworCVRoaXMgd2FzIHdyaXR0ZW4gYnkgbG9va2luZyBhdCBOaWNrIEhvbGxvd2F5J3MgZHVtbXkgZHJpdmVyCisJVGhhbmtzIGZvciB0aGUgZ3JlYXQgY29kZSEKKworCQktU2FtIExhbnRpbmdhCShzbG91a2VuQGNzLnVjZGF2aXMuZWR1KSAgMDIvMDEvOTUKKwkJCisJTWlub3IgdHdlYWtzOgorCQlDbGVhbmVkIHVwIHRoZSBjb2RlIGEgbGl0dGxlIGFuZCBhZGRlZCBzb21lIHByZS0xLjMuMCB0d2Vha3MuCisJCWRldi0+aGFyZF9oZWFkZXIvaGFyZF9oZWFkZXJfbGVuIGNoYW5nZWQgdG8gdXNlIG5vIGhlYWRlcnMuCisJCUNvbW1lbnRzL2JyYWNrZXRpbmcgdHdlYWtlZC4KKwkJTWFkZSB0aGUgdHVubmVscyB1c2UgZGV2LT5uYW1lIG5vdCB0dW5uZWw6IHdoZW4gZXJyb3IgcmVwb3J0aW5nLgorCQlBZGRlZCB0eF9kcm9wcGVkIHN0YXQKKwkJCisJCS1BbGFuIENveAkoQWxhbi5Db3hAbGludXgub3JnKSAyMSBNYXJjaCA5NQorCisJUmV3b3JrZWQ6CisJCUNoYW5nZWQgdG8gdHVubmVsIHRvIGRlc3RpbmF0aW9uIGdhdGV3YXkgaW4gYWRkaXRpb24gdG8gdGhlCisJCQl0dW5uZWwncyBwb2ludG9wb2ludCBhZGRyZXNzCisJCUFsbW9zdCBjb21wbGV0ZWx5IHJld3JpdHRlbgorCQlOb3RlOiAgVGhlcmUgaXMgY3VycmVudGx5IG5vIGZpcmV3YWxsIG9yIElDTVAgaGFuZGxpbmcgZG9uZS4KKworCQktU2FtIExhbnRpbmdhCShzbG91a2VuQGNzLnVjZGF2aXMuZWR1KSAwMi8xMy85NgorCQkKKyovCisKKy8qIFRoaW5ncyBJIHdpc2ggSSBoYWQga25vd24gd2hlbiB3cml0aW5nIHRoZSB0dW5uZWwgZHJpdmVyOgorCisJV2hlbiB0aGUgdHVubmVsX3htaXQoKSBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZSBza2IgY29udGFpbnMgdGhlCisJcGFja2V0IHRvIGJlIHNlbnQgKHBsdXMgYSBncmVhdCBkZWFsIG9mIGV4dHJhIGluZm8pLCBhbmQgZGV2CisJY29udGFpbnMgdGhlIHR1bm5lbCBkZXZpY2UgdGhhdCBfd2VfIGFyZS4KKworCVdoZW4gd2UgYXJlIHBhc3NlZCBhIHBhY2tldCwgd2UgYXJlIGV4cGVjdGVkIHRvIGZpbGwgaW4gdGhlCisJc291cmNlIGFkZHJlc3Mgd2l0aCBvdXIgc291cmNlIElQIGFkZHJlc3MuCisKKwlXaGF0IGlzIHRoZSBwcm9wZXIgd2F5IHRvIGFsbG9jYXRlLCBjb3B5IGFuZCBmcmVlIGEgYnVmZmVyPworCUFmdGVyIHlvdSBhbGxvY2F0ZSBpdCwgaXQgaXMgYSAiMCBsZW5ndGgiIGNodW5rIG9mIG1lbW9yeQorCXN0YXJ0aW5nIGF0IHplcm8uICBJZiB5b3Ugd2FudCB0byBhZGQgaGVhZGVycyB0byB0aGUgYnVmZmVyCisJbGF0ZXIsIHlvdSdsbCBoYXZlIHRvIGNhbGwgInNrYl9yZXNlcnZlKHNrYiwgYW1vdW50KSIgd2l0aAorCXRoZSBhbW91bnQgb2YgbWVtb3J5IHlvdSB3YW50IHJlc2VydmVkLiAgVGhlbiwgeW91IGNhbGwKKwkic2tiX3B1dChza2IsIGFtb3VudCkiIHdpdGggdGhlIGFtb3VudCBvZiBzcGFjZSB5b3Ugd2FudCBpbgorCXRoZSBidWZmZXIuICBza2JfcHV0KCkgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHRvcCAoIzApIG9mCisJdGhhdCBidWZmZXIuICBza2ItPmxlbiBpcyBzZXQgdG8gdGhlIGFtb3VudCBvZiBzcGFjZSB5b3UgaGF2ZQorCSJhbGxvY2F0ZWQiIHdpdGggc2tiX3B1dCgpLiAgWW91IGNhbiB0aGVuIHdyaXRlIHVwIHRvIHNrYi0+bGVuCisJYnl0ZXMgdG8gdGhhdCBidWZmZXIuICBJZiB5b3UgbmVlZCBtb3JlLCB5b3UgY2FuIGNhbGwgc2tiX3B1dCgpCisJYWdhaW4gd2l0aCB0aGUgYWRkaXRpb25hbCBhbW91bnQgb2Ygc3BhY2UgeW91IG5lZWQuICBZb3UgY2FuCisJZmluZCBvdXQgaG93IG11Y2ggbW9yZSBzcGFjZSB5b3UgY2FuIGFsbG9jYXRlIGJ5IGNhbGxpbmcgCisJInNrYl90YWlscm9vbShza2IpIi4KKwlOb3csIHRvIGFkZCBoZWFkZXIgc3BhY2UsIGNhbGwgInNrYl9wdXNoKHNrYiwgaGVhZGVyX2xlbikiLgorCVRoaXMgY3JlYXRlcyBzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgYW5kIHJldHVybnMKKwlhIHBvaW50ZXIgdG8gdGhpcyBuZXcgc3BhY2UuICBJZiBsYXRlciB5b3UgbmVlZCB0byBzdHJpcCBhCisJaGVhZGVyIGZyb20gYSBidWZmZXIsIGNhbGwgInNrYl9wdWxsKHNrYiwgaGVhZGVyX2xlbikiLgorCXNrYl9oZWFkcm9vbSgpIHdpbGwgcmV0dXJuIGhvdyBtdWNoIHNwYWNlIGlzIGxlZnQgYXQgdGhlIHRvcAorCW9mIHRoZSBidWZmZXIgKGJlZm9yZSB0aGUgbWFpbiBkYXRhKS4gIFJlbWVtYmVyLCB0aGlzIGhlYWRyb29tCisJc3BhY2UgbXVzdCBiZSByZXNlcnZlZCBiZWZvcmUgdGhlIHNrYl9wdXQoKSBmdW5jdGlvbiBpcyBjYWxsZWQuCisJKi8KKworLyoKKyAgIFRoaXMgdmVyc2lvbiBvZiBuZXQvaXB2NC9pcGlwLmMgaXMgY2xvbmVkIG9mIG5ldC9pcHY0L2lwX2dyZS5jCisKKyAgIEZvciBjb21tZW50cyBsb29rIGF0IG5ldC9pcHY0L2lwX2dyZS5jIC0tQU5LCisgKi8KKworIAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvbXJvdXRlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisKKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9pY21wLmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L2lwaXAuaD4KKyNpbmNsdWRlIDxuZXQvaW5ldF9lY24uaD4KKyNpbmNsdWRlIDxuZXQveGZybS5oPgorCisjZGVmaW5lIEhBU0hfU0laRSAgMTYKKyNkZWZpbmUgSEFTSChhZGRyKSAoKGFkZHJeKGFkZHI+PjQpKSYweEYpCisKK3N0YXRpYyBpbnQgaXBpcF9mYl90dW5uZWxfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaXBpcF90dW5uZWxfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGlwaXBfdHVubmVsX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmlwaXBfZmJfdHVubmVsX2RldjsKKworc3RhdGljIHN0cnVjdCBpcF90dW5uZWwgKnR1bm5lbHNfcl9sW0hBU0hfU0laRV07CitzdGF0aWMgc3RydWN0IGlwX3R1bm5lbCAqdHVubmVsc19yW0hBU0hfU0laRV07CitzdGF0aWMgc3RydWN0IGlwX3R1bm5lbCAqdHVubmVsc19sW0hBU0hfU0laRV07CitzdGF0aWMgc3RydWN0IGlwX3R1bm5lbCAqdHVubmVsc193Y1sxXTsKK3N0YXRpYyBzdHJ1Y3QgaXBfdHVubmVsICoqdHVubmVsc1s0XSA9IHsgdHVubmVsc193YywgdHVubmVsc19sLCB0dW5uZWxzX3IsIHR1bm5lbHNfcl9sIH07CisKK3N0YXRpYyBERUZJTkVfUldMT0NLKGlwaXBfbG9jayk7CisKK3N0YXRpYyBzdHJ1Y3QgaXBfdHVubmVsICogaXBpcF90dW5uZWxfbG9va3VwKHUzMiByZW1vdGUsIHUzMiBsb2NhbCkKK3sKKwl1bnNpZ25lZCBoMCA9IEhBU0gocmVtb3RlKTsKKwl1bnNpZ25lZCBoMSA9IEhBU0gobG9jYWwpOworCXN0cnVjdCBpcF90dW5uZWwgKnQ7CisKKwlmb3IgKHQgPSB0dW5uZWxzX3JfbFtoMF5oMV07IHQ7IHQgPSB0LT5uZXh0KSB7CisJCWlmIChsb2NhbCA9PSB0LT5wYXJtcy5pcGguc2FkZHIgJiYKKwkJICAgIHJlbW90ZSA9PSB0LT5wYXJtcy5pcGguZGFkZHIgJiYgKHQtPmRldi0+ZmxhZ3MmSUZGX1VQKSkKKwkJCXJldHVybiB0OworCX0KKwlmb3IgKHQgPSB0dW5uZWxzX3JbaDBdOyB0OyB0ID0gdC0+bmV4dCkgeworCQlpZiAocmVtb3RlID09IHQtPnBhcm1zLmlwaC5kYWRkciAmJiAodC0+ZGV2LT5mbGFncyZJRkZfVVApKQorCQkJcmV0dXJuIHQ7CisJfQorCWZvciAodCA9IHR1bm5lbHNfbFtoMV07IHQ7IHQgPSB0LT5uZXh0KSB7CisJCWlmIChsb2NhbCA9PSB0LT5wYXJtcy5pcGguc2FkZHIgJiYgKHQtPmRldi0+ZmxhZ3MmSUZGX1VQKSkKKwkJCXJldHVybiB0OworCX0KKwlpZiAoKHQgPSB0dW5uZWxzX3djWzBdKSAhPSBOVUxMICYmICh0LT5kZXYtPmZsYWdzJklGRl9VUCkpCisJCXJldHVybiB0OworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGlwX3R1bm5lbCAqKmlwaXBfYnVja2V0KHN0cnVjdCBpcF90dW5uZWwgKnQpCit7CisJdTMyIHJlbW90ZSA9IHQtPnBhcm1zLmlwaC5kYWRkcjsKKwl1MzIgbG9jYWwgPSB0LT5wYXJtcy5pcGguc2FkZHI7CisJdW5zaWduZWQgaCA9IDA7CisJaW50IHByaW8gPSAwOworCisJaWYgKHJlbW90ZSkgeworCQlwcmlvIHw9IDI7CisJCWggXj0gSEFTSChyZW1vdGUpOworCX0KKwlpZiAobG9jYWwpIHsKKwkJcHJpbyB8PSAxOworCQloIF49IEhBU0gobG9jYWwpOworCX0KKwlyZXR1cm4gJnR1bm5lbHNbcHJpb11baF07Cit9CisKKworc3RhdGljIHZvaWQgaXBpcF90dW5uZWxfdW5saW5rKHN0cnVjdCBpcF90dW5uZWwgKnQpCit7CisJc3RydWN0IGlwX3R1bm5lbCAqKnRwOworCisJZm9yICh0cCA9IGlwaXBfYnVja2V0KHQpOyAqdHA7IHRwID0gJigqdHApLT5uZXh0KSB7CisJCWlmICh0ID09ICp0cCkgeworCQkJd3JpdGVfbG9ja19iaCgmaXBpcF9sb2NrKTsKKwkJCSp0cCA9IHQtPm5leHQ7CisJCQl3cml0ZV91bmxvY2tfYmgoJmlwaXBfbG9jayk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgaXBpcF90dW5uZWxfbGluayhzdHJ1Y3QgaXBfdHVubmVsICp0KQoreworCXN0cnVjdCBpcF90dW5uZWwgKip0cCA9IGlwaXBfYnVja2V0KHQpOworCisJdC0+bmV4dCA9ICp0cDsKKwl3cml0ZV9sb2NrX2JoKCZpcGlwX2xvY2spOworCSp0cCA9IHQ7CisJd3JpdGVfdW5sb2NrX2JoKCZpcGlwX2xvY2spOworfQorCitzdGF0aWMgc3RydWN0IGlwX3R1bm5lbCAqIGlwaXBfdHVubmVsX2xvY2F0ZShzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gKnBhcm1zLCBpbnQgY3JlYXRlKQoreworCXUzMiByZW1vdGUgPSBwYXJtcy0+aXBoLmRhZGRyOworCXUzMiBsb2NhbCA9IHBhcm1zLT5pcGguc2FkZHI7CisJc3RydWN0IGlwX3R1bm5lbCAqdCwgKip0cCwgKm50OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdW5zaWduZWQgaCA9IDA7CisJaW50IHByaW8gPSAwOworCWNoYXIgbmFtZVtJRk5BTVNJWl07CisKKwlpZiAocmVtb3RlKSB7CisJCXByaW8gfD0gMjsKKwkJaCBePSBIQVNIKHJlbW90ZSk7CisJfQorCWlmIChsb2NhbCkgeworCQlwcmlvIHw9IDE7CisJCWggXj0gSEFTSChsb2NhbCk7CisJfQorCWZvciAodHAgPSAmdHVubmVsc1twcmlvXVtoXTsgKHQgPSAqdHApICE9IE5VTEw7IHRwID0gJnQtPm5leHQpIHsKKwkJaWYgKGxvY2FsID09IHQtPnBhcm1zLmlwaC5zYWRkciAmJiByZW1vdGUgPT0gdC0+cGFybXMuaXBoLmRhZGRyKQorCQkJcmV0dXJuIHQ7CisJfQorCWlmICghY3JlYXRlKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChwYXJtcy0+bmFtZVswXSkKKwkJc3RybGNweShuYW1lLCBwYXJtcy0+bmFtZSwgSUZOQU1TSVopOworCWVsc2UgeworCQlpbnQgaTsKKwkJZm9yIChpPTE7IGk8MTAwOyBpKyspIHsKKwkJCXNwcmludGYobmFtZSwgInR1bmwlZCIsIGkpOworCQkJaWYgKF9fZGV2X2dldF9ieV9uYW1lKG5hbWUpID09IE5VTEwpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGk9PTEwMCkKKwkJCWdvdG8gZmFpbGVkOworCX0KKworCWRldiA9IGFsbG9jX25ldGRldihzaXplb2YoKnQpLCBuYW1lLCBpcGlwX3R1bm5lbF9zZXR1cCk7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCW50ID0gZGV2LT5wcml2OworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlkZXYtPmluaXQgPSBpcGlwX3R1bm5lbF9pbml0OworCW50LT5wYXJtcyA9ICpwYXJtczsKKworCWlmIChyZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KSA8IDApIHsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJZGV2X2hvbGQoZGV2KTsKKwlpcGlwX3R1bm5lbF9saW5rKG50KTsKKwkvKiBEbyBub3QgZGVjcmVtZW50IE1PRF9VU0VfQ09VTlQgaGVyZS4gKi8KKwlyZXR1cm4gbnQ7CisKK2ZhaWxlZDoKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgaXBpcF90dW5uZWxfdW5pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKGRldiA9PSBpcGlwX2ZiX3R1bm5lbF9kZXYpIHsKKwkJd3JpdGVfbG9ja19iaCgmaXBpcF9sb2NrKTsKKwkJdHVubmVsc193Y1swXSA9IE5VTEw7CisJCXdyaXRlX3VubG9ja19iaCgmaXBpcF9sb2NrKTsKKwl9IGVsc2UKKwkJaXBpcF90dW5uZWxfdW5saW5rKChzdHJ1Y3QgaXBfdHVubmVsKilkZXYtPnByaXYpOworCWRldl9wdXQoZGV2KTsKK30KKworc3RhdGljIHZvaWQgaXBpcF9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdm9pZCAqX191bnVzZWQpCit7CisjaWZuZGVmIElfV0lTSF9XT1JMRF9XRVJFX1BFUkZFQ1QKKworLyogSXQgaXMgbm90IDotKCBBbGwgdGhlIHJvdXRlcnMgKGV4Y2VwdCBmb3IgTGludXgpIHJldHVybiBvbmx5CisgICA4IGJ5dGVzIG9mIHBhY2tldCBwYXlsb2FkLiBJdCBtZWFucywgdGhhdCBwcmVjaXNlIHJlbGF5aW5nIG9mCisgICBJQ01QIGluIHRoZSByZWFsIEludGVybmV0IGlzIGFic29sdXRlbHkgaW5mZWFzaWJsZS4KKyAqLworCXN0cnVjdCBpcGhkciAqaXBoID0gKHN0cnVjdCBpcGhkciopc2tiLT5kYXRhOworCWludCB0eXBlID0gc2tiLT5oLmljbXBoLT50eXBlOworCWludCBjb2RlID0gc2tiLT5oLmljbXBoLT5jb2RlOworCXN0cnVjdCBpcF90dW5uZWwgKnQ7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwlkZWZhdWx0OgorCWNhc2UgSUNNUF9QQVJBTUVURVJQUk9COgorCQlyZXR1cm47CisKKwljYXNlIElDTVBfREVTVF9VTlJFQUNIOgorCQlzd2l0Y2ggKGNvZGUpIHsKKwkJY2FzZSBJQ01QX1NSX0ZBSUxFRDoKKwkJY2FzZSBJQ01QX1BPUlRfVU5SRUFDSDoKKwkJCS8qIEltcG9zc2libGUgZXZlbnQuICovCisJCQlyZXR1cm47CisJCWNhc2UgSUNNUF9GUkFHX05FRURFRDoKKwkJCS8qIFNvZnQgc3RhdGUgZm9yIHBtdHUgaXMgbWFpbnRhaW5lZCBieSBJUCBjb3JlLiAqLworCQkJcmV0dXJuOworCQlkZWZhdWx0OgorCQkJLyogQWxsIG90aGVycyBhcmUgdHJhbnNsYXRlZCB0byBIT1NUX1VOUkVBQ0guCisJCQkgICByZmMyMDAzIGNvbnRhaW5zICJkZWVwIHRob3VnaHRzIiBhYm91dCBORVRfVU5SRUFDSCwKKwkJCSAgIEkgYmVsaWV2ZSB0aGV5IGFyZSBqdXN0IGV0aGVyIHBvbGx1dGlvbi4gLS1BTksKKwkJCSAqLworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJQ01QX1RJTUVfRVhDRUVERUQ6CisJCWlmIChjb2RlICE9IElDTVBfRVhDX1RUTCkKKwkJCXJldHVybjsKKwkJYnJlYWs7CisJfQorCisJcmVhZF9sb2NrKCZpcGlwX2xvY2spOworCXQgPSBpcGlwX3R1bm5lbF9sb29rdXAoaXBoLT5kYWRkciwgaXBoLT5zYWRkcik7CisJaWYgKHQgPT0gTlVMTCB8fCB0LT5wYXJtcy5pcGguZGFkZHIgPT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKHQtPnBhcm1zLmlwaC50dGwgPT0gMCAmJiB0eXBlID09IElDTVBfVElNRV9FWENFRURFRCkKKwkJZ290byBvdXQ7CisKKwlpZiAoamlmZmllcyAtIHQtPmVycl90aW1lIDwgSVBUVU5ORUxfRVJSX1RJTUVPKQorCQl0LT5lcnJfY291bnQrKzsKKwllbHNlCisJCXQtPmVycl9jb3VudCA9IDE7CisJdC0+ZXJyX3RpbWUgPSBqaWZmaWVzOworb3V0OgorCXJlYWRfdW5sb2NrKCZpcGlwX2xvY2spOworCXJldHVybjsKKyNlbHNlCisJc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyKilkcDsKKwlpbnQgaGxlbiA9IGlwaC0+aWhsPDwyOworCXN0cnVjdCBpcGhkciAqZWlwaDsKKwlpbnQgdHlwZSA9IHNrYi0+aC5pY21waC0+dHlwZTsKKwlpbnQgY29kZSA9IHNrYi0+aC5pY21waC0+Y29kZTsKKwlpbnQgcmVsX3R5cGUgPSAwOworCWludCByZWxfY29kZSA9IDA7CisJaW50IHJlbF9pbmZvID0gMDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKKwlzdHJ1Y3QgZmxvd2kgZmw7CisJc3RydWN0IHJ0YWJsZSAqcnQ7CisKKwlpZiAobGVuIDwgaGxlbiArIHNpemVvZihzdHJ1Y3QgaXBoZHIpKQorCQlyZXR1cm47CisJZWlwaCA9IChzdHJ1Y3QgaXBoZHIqKShkcCArIGhsZW4pOworCisJc3dpdGNoICh0eXBlKSB7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCWNhc2UgSUNNUF9QQVJBTUVURVJQUk9COgorCQlpZiAoc2tiLT5oLmljbXBoLT51bi5nYXRld2F5IDwgaGxlbikKKwkJCXJldHVybjsKKworCQkvKiBTby4uLiBUaGlzIGd1eSBmb3VuZCBzb21ldGhpbmcgc3RyYW5nZSBJTlNJREUgZW5jYXBzdWxhdGVkCisJCSAgIHBhY2tldC4gV2VsbCwgaGUgaXMgZm9vbCwgYnV0IHdoYXQgY2FuIHdlIGRvID8KKwkJICovCisJCXJlbF90eXBlID0gSUNNUF9QQVJBTUVURVJQUk9COworCQlyZWxfaW5mbyA9IHNrYi0+aC5pY21waC0+dW4uZ2F0ZXdheSAtIGhsZW47CisJCWJyZWFrOworCisJY2FzZSBJQ01QX0RFU1RfVU5SRUFDSDoKKwkJc3dpdGNoIChjb2RlKSB7CisJCWNhc2UgSUNNUF9TUl9GQUlMRUQ6CisJCWNhc2UgSUNNUF9QT1JUX1VOUkVBQ0g6CisJCQkvKiBJbXBvc3NpYmxlIGV2ZW50LiAqLworCQkJcmV0dXJuOworCQljYXNlIElDTVBfRlJBR19ORUVERUQ6CisJCQkvKiBBbmQgaXQgaXMgdGhlIG9ubHkgcmVhbGx5IG5lY2Vzc2FyeSB0aGluZyA6LSkgKi8KKwkJCXJlbF9pbmZvID0gbnRvaHMoc2tiLT5oLmljbXBoLT51bi5mcmFnLm10dSk7CisJCQlpZiAocmVsX2luZm8gPCBobGVuKzY4KQorCQkJCXJldHVybjsKKwkJCXJlbF9pbmZvIC09IGhsZW47CisJCQkvKiBCU0QgNC4yIE1PUkUgRE9FUyBOT1QgRVhJU1QgSU4gTkFUVVJFLiAqLworCQkJaWYgKHJlbF9pbmZvID4gbnRvaHMoZWlwaC0+dG90X2xlbikpCisJCQkJcmV0dXJuOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBBbGwgb3RoZXJzIGFyZSB0cmFuc2xhdGVkIHRvIEhPU1RfVU5SRUFDSC4KKwkJCSAgIHJmYzIwMDMgY29udGFpbnMgImRlZXAgdGhvdWdodHMiIGFib3V0IE5FVF9VTlJFQUNILAorCQkJICAgSSBiZWxpZXZlLCBpdCBpcyBqdXN0IGV0aGVyIHBvbGx1dGlvbi4gLS1BTksKKwkJCSAqLworCQkJcmVsX3R5cGUgPSBJQ01QX0RFU1RfVU5SRUFDSDsKKwkJCXJlbF9jb2RlID0gSUNNUF9IT1NUX1VOUkVBQ0g7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIElDTVBfVElNRV9FWENFRURFRDoKKwkJaWYgKGNvZGUgIT0gSUNNUF9FWENfVFRMKQorCQkJcmV0dXJuOworCQlicmVhazsKKwl9CisKKwkvKiBQcmVwYXJlIGZha2Ugc2tiIHRvIGZlZWQgaXQgdG8gaWNtcF9zZW5kICovCisJc2tiMiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCWlmIChza2IyID09IE5VTEwpCisJCXJldHVybjsKKwlkc3RfcmVsZWFzZShza2IyLT5kc3QpOworCXNrYjItPmRzdCA9IE5VTEw7CisJc2tiX3B1bGwoc2tiMiwgc2tiLT5kYXRhIC0gKHU4KillaXBoKTsKKwlza2IyLT5uaC5yYXcgPSBza2IyLT5kYXRhOworCisJLyogVHJ5IHRvIGd1ZXNzIGluY29taW5nIGludGVyZmFjZSAqLworCW1lbXNldCgmZmwsIDAsIHNpemVvZihmbCkpOworCWZsLmZsNF9kYWRkciA9IGVpcGgtPnNhZGRyOworCWZsLmZsNF90b3MgPSBSVF9UT1MoZWlwaC0+dG9zKTsKKwlmbC5wcm90byA9IElQUFJPVE9fSVBJUDsKKwlpZiAoaXBfcm91dGVfb3V0cHV0X2tleSgmcnQsICZrZXkpKSB7CisJCWtmcmVlX3NrYihza2IyKTsKKwkJcmV0dXJuOworCX0KKwlza2IyLT5kZXYgPSBydC0+dS5kc3QuZGV2OworCisJLyogcm91dGUgImluY29taW5nIiBwYWNrZXQgKi8KKwlpZiAocnQtPnJ0X2ZsYWdzJlJUQ0ZfTE9DQUwpIHsKKwkJaXBfcnRfcHV0KHJ0KTsKKwkJcnQgPSBOVUxMOworCQlmbC5mbDRfZGFkZHIgPSBlaXBoLT5kYWRkcjsKKwkJZmwuZmw0X3NyYyA9IGVpcGgtPnNhZGRyOworCQlmbC5mbDRfdG9zID0gZWlwaC0+dG9zOworCQlpZiAoaXBfcm91dGVfb3V0cHV0X2tleSgmcnQsICZmbCkgfHwKKwkJICAgIHJ0LT51LmRzdC5kZXYtPnR5cGUgIT0gQVJQSFJEX1RVTk5FTCkgeworCQkJaXBfcnRfcHV0KHJ0KTsKKwkJCWtmcmVlX3NrYihza2IyKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CisJCWlwX3J0X3B1dChydCk7CisJCWlmIChpcF9yb3V0ZV9pbnB1dChza2IyLCBlaXBoLT5kYWRkciwgZWlwaC0+c2FkZHIsIGVpcGgtPnRvcywgc2tiMi0+ZGV2KSB8fAorCQkgICAgc2tiMi0+ZHN0LT5kZXYtPnR5cGUgIT0gQVJQSFJEX1RVTk5FTCkgeworCQkJa2ZyZWVfc2tiKHNrYjIpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyogY2hhbmdlIG10dSBvbiB0aGlzIHJvdXRlICovCisJaWYgKHR5cGUgPT0gSUNNUF9ERVNUX1VOUkVBQ0ggJiYgY29kZSA9PSBJQ01QX0ZSQUdfTkVFREVEKSB7CisJCWlmIChyZWxfaW5mbyA+IGRzdF9tdHUoc2tiMi0+ZHN0KSkgeworCQkJa2ZyZWVfc2tiKHNrYjIpOworCQkJcmV0dXJuOworCQl9CisJCXNrYjItPmRzdC0+b3BzLT51cGRhdGVfcG10dShza2IyLT5kc3QsIHJlbF9pbmZvKTsKKwkJcmVsX2luZm8gPSBodG9ubChyZWxfaW5mbyk7CisJfSBlbHNlIGlmICh0eXBlID09IElDTVBfVElNRV9FWENFRURFRCkgeworCQlzdHJ1Y3QgaXBfdHVubmVsICp0ID0gKHN0cnVjdCBpcF90dW5uZWwqKXNrYjItPmRldi0+cHJpdjsKKwkJaWYgKHQtPnBhcm1zLmlwaC50dGwpIHsKKwkJCXJlbF90eXBlID0gSUNNUF9ERVNUX1VOUkVBQ0g7CisJCQlyZWxfY29kZSA9IElDTVBfSE9TVF9VTlJFQUNIOworCQl9CisJfQorCisJaWNtcF9zZW5kKHNrYjIsIHJlbF90eXBlLCByZWxfY29kZSwgcmVsX2luZm8pOworCWtmcmVlX3NrYihza2IyKTsKKwlyZXR1cm47CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlwaXBfZWNuX2RlY2Fwc3VsYXRlKHN0cnVjdCBpcGhkciAqb3V0ZXJfaXBoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcGhkciAqaW5uZXJfaXBoID0gc2tiLT5uaC5pcGg7CisKKwlpZiAoSU5FVF9FQ05faXNfY2Uob3V0ZXJfaXBoLT50b3MpKQorCQlJUF9FQ05fc2V0X2NlKGlubmVyX2lwaCk7Cit9CisKK3N0YXRpYyBpbnQgaXBpcF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwlzdHJ1Y3QgaXBfdHVubmVsICp0dW5uZWw7CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSkpCisJCWdvdG8gb3V0OworCisJaXBoID0gc2tiLT5uaC5pcGg7CisKKwlyZWFkX2xvY2soJmlwaXBfbG9jayk7CisJaWYgKCh0dW5uZWwgPSBpcGlwX3R1bm5lbF9sb29rdXAoaXBoLT5zYWRkciwgaXBoLT5kYWRkcikpICE9IE5VTEwpIHsKKwkJaWYgKCF4ZnJtNF9wb2xpY3lfY2hlY2soTlVMTCwgWEZSTV9QT0xJQ1lfSU4sIHNrYikpIHsKKwkJCXJlYWRfdW5sb2NrKCZpcGlwX2xvY2spOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXNlY3BhdGhfcmVzZXQoc2tiKTsKKworCQlza2ItPm1hYy5yYXcgPSBza2ItPm5oLnJhdzsKKwkJc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisJCW1lbXNldCgmKElQQ0Ioc2tiKS0+b3B0KSwgMCwgc2l6ZW9mKHN0cnVjdCBpcF9vcHRpb25zKSk7CisJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKKworCQl0dW5uZWwtPnN0YXQucnhfcGFja2V0cysrOworCQl0dW5uZWwtPnN0YXQucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCXNrYi0+ZGV2ID0gdHVubmVsLT5kZXY7CisJCWRzdF9yZWxlYXNlKHNrYi0+ZHN0KTsKKwkJc2tiLT5kc3QgPSBOVUxMOworCQluZl9yZXNldChza2IpOworCQlpcGlwX2Vjbl9kZWNhcHN1bGF0ZShpcGgsIHNrYik7CisJCW5ldGlmX3J4KHNrYik7CisJCXJlYWRfdW5sb2NrKCZpcGlwX2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisJcmVhZF91bmxvY2soJmlwaXBfbG9jayk7CisKK291dDoKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKglUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgaXQgaXMgYmVpbmcgY2FsbGVkIGZyb20gZGV2X3F1ZXVlX3htaXQoKQorICoJYW5kIHRoYXQgc2tiIGlzIGZpbGxlZCBwcm9wZXJseSBieSB0aGF0IGZ1bmN0aW9uLgorICovCisKK3N0YXRpYyBpbnQgaXBpcF90dW5uZWxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpcF90dW5uZWwgKnR1bm5lbCA9IChzdHJ1Y3QgaXBfdHVubmVsKilkZXYtPnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnR1bm5lbC0+c3RhdDsKKwlzdHJ1Y3QgaXBoZHIgICp0aXBoID0gJnR1bm5lbC0+cGFybXMuaXBoOworCXU4ICAgICB0b3MgPSB0dW5uZWwtPnBhcm1zLmlwaC50b3M7CisJdTE2ICAgIGRmID0gdGlwaC0+ZnJhZ19vZmY7CisJc3RydWN0IHJ0YWJsZSAqcnQ7ICAgICAJCQkvKiBSb3V0ZSB0byB0aGUgb3RoZXIgaG9zdCAqLworCXN0cnVjdCBuZXRfZGV2aWNlICp0ZGV2OwkJCS8qIERldmljZSB0byBvdGhlciBob3N0ICovCisJc3RydWN0IGlwaGRyICAqb2xkX2lwaCA9IHNrYi0+bmguaXBoOworCXN0cnVjdCBpcGhkciAgKmlwaDsJCQkvKiBPdXIgbmV3IElQIGhlYWRlciAqLworCWludCAgICBtYXhfaGVhZHJvb207CQkJLyogVGhlIGV4dHJhIGhlYWRlciBzcGFjZSBuZWVkZWQgKi8KKwl1MzIgICAgZHN0ID0gdGlwaC0+ZGFkZHI7CisJaW50ICAgIG10dTsKKworCWlmICh0dW5uZWwtPnJlY3Vyc2lvbisrKSB7CisJCXR1bm5lbC0+c3RhdC5jb2xsaXNpb25zKys7CisJCWdvdG8gdHhfZXJyb3I7CisJfQorCisJaWYgKHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfSVApKQorCQlnb3RvIHR4X2Vycm9yOworCisJaWYgKHRvcyYxKQorCQl0b3MgPSBvbGRfaXBoLT50b3M7CisKKwlpZiAoIWRzdCkgeworCQkvKiBOQk1BIHR1bm5lbCAqLworCQlpZiAoKHJ0ID0gKHN0cnVjdCBydGFibGUqKXNrYi0+ZHN0KSA9PSBOVUxMKSB7CisJCQl0dW5uZWwtPnN0YXQudHhfZmlmb19lcnJvcnMrKzsKKwkJCWdvdG8gdHhfZXJyb3I7CisJCX0KKwkJaWYgKChkc3QgPSBydC0+cnRfZ2F0ZXdheSkgPT0gMCkKKwkJCWdvdG8gdHhfZXJyb3JfaWNtcDsKKwl9CisKKwl7CisJCXN0cnVjdCBmbG93aSBmbCA9IHsgLm9pZiA9IHR1bm5lbC0+cGFybXMubGluaywKKwkJCQkgICAgLm5sX3UgPSB7IC5pcDRfdSA9CisJCQkJCSAgICAgIHsgLmRhZGRyID0gZHN0LAorCQkJCQkJLnNhZGRyID0gdGlwaC0+c2FkZHIsCisJCQkJCQkudG9zID0gUlRfVE9TKHRvcykgfSB9LAorCQkJCSAgICAucHJvdG8gPSBJUFBST1RPX0lQSVAgfTsKKwkJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpKSB7CisJCQl0dW5uZWwtPnN0YXQudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCWdvdG8gdHhfZXJyb3JfaWNtcDsKKwkJfQorCX0KKwl0ZGV2ID0gcnQtPnUuZHN0LmRldjsKKworCWlmICh0ZGV2ID09IGRldikgeworCQlpcF9ydF9wdXQocnQpOworCQl0dW5uZWwtPnN0YXQuY29sbGlzaW9ucysrOworCQlnb3RvIHR4X2Vycm9yOworCX0KKworCWlmICh0aXBoLT5mcmFnX29mZikKKwkJbXR1ID0gZHN0X210dSgmcnQtPnUuZHN0KSAtIHNpemVvZihzdHJ1Y3QgaXBoZHIpOworCWVsc2UKKwkJbXR1ID0gc2tiLT5kc3QgPyBkc3RfbXR1KHNrYi0+ZHN0KSA6IGRldi0+bXR1OworCisJaWYgKG10dSA8IDY4KSB7CisJCXR1bm5lbC0+c3RhdC5jb2xsaXNpb25zKys7CisJCWlwX3J0X3B1dChydCk7CisJCWdvdG8gdHhfZXJyb3I7CisJfQorCWlmIChza2ItPmRzdCkKKwkJc2tiLT5kc3QtPm9wcy0+dXBkYXRlX3BtdHUoc2tiLT5kc3QsIG10dSk7CisKKwlkZiB8PSAob2xkX2lwaC0+ZnJhZ19vZmYmaHRvbnMoSVBfREYpKTsKKworCWlmICgob2xkX2lwaC0+ZnJhZ19vZmYmaHRvbnMoSVBfREYpKSAmJiBtdHUgPCBudG9ocyhvbGRfaXBoLT50b3RfbGVuKSkgeworCQlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCwgSUNNUF9GUkFHX05FRURFRCwgaHRvbmwobXR1KSk7CisJCWlwX3J0X3B1dChydCk7CisJCWdvdG8gdHhfZXJyb3I7CisJfQorCisJaWYgKHR1bm5lbC0+ZXJyX2NvdW50ID4gMCkgeworCQlpZiAoamlmZmllcyAtIHR1bm5lbC0+ZXJyX3RpbWUgPCBJUFRVTk5FTF9FUlJfVElNRU8pIHsKKwkJCXR1bm5lbC0+ZXJyX2NvdW50LS07CisJCQlkc3RfbGlua19mYWlsdXJlKHNrYik7CisJCX0gZWxzZQorCQkJdHVubmVsLT5lcnJfY291bnQgPSAwOworCX0KKworCS8qCisJICogT2theSwgbm93IHNlZSBpZiB3ZSBjYW4gc3R1ZmYgaXQgaW4gdGhlIGJ1ZmZlciBhcy1pcy4KKwkgKi8KKwltYXhfaGVhZHJvb20gPSAoTExfUkVTRVJWRURfU1BBQ0UodGRldikrc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCisJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgbWF4X2hlYWRyb29tIHx8IHNrYl9jbG9uZWQoc2tiKSB8fCBza2Jfc2hhcmVkKHNrYikpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2IgPSBza2JfcmVhbGxvY19oZWFkcm9vbShza2IsIG1heF9oZWFkcm9vbSk7CisJCWlmICghbmV3X3NrYikgeworCQkJaXBfcnRfcHV0KHJ0KTsKKyAgCQkJc3RhdHMtPnR4X2Ryb3BwZWQrKzsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXR1bm5lbC0+cmVjdXJzaW9uLS07CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoc2tiLT5zaykKKwkJCXNrYl9zZXRfb3duZXJfdyhuZXdfc2tiLCBza2ItPnNrKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlza2IgPSBuZXdfc2tiOworCQlvbGRfaXBoID0gc2tiLT5uaC5pcGg7CisJfQorCisJc2tiLT5oLnJhdyA9IHNrYi0+bmgucmF3OworCXNrYi0+bmgucmF3ID0gc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CisJbWVtc2V0KCYoSVBDQihza2IpLT5vcHQpLCAwLCBzaXplb2YoSVBDQihza2IpLT5vcHQpKTsKKwlkc3RfcmVsZWFzZShza2ItPmRzdCk7CisJc2tiLT5kc3QgPSAmcnQtPnUuZHN0OworCisJLyoKKwkgKglQdXNoIGRvd24gYW5kIGluc3RhbGwgdGhlIElQSVAgaGVhZGVyLgorCSAqLworCisJaXBoIAkJCT0Jc2tiLT5uaC5pcGg7CisJaXBoLT52ZXJzaW9uCQk9CTQ7CisJaXBoLT5paGwJCT0Jc2l6ZW9mKHN0cnVjdCBpcGhkcik+PjI7CisJaXBoLT5mcmFnX29mZgkJPQlkZjsKKwlpcGgtPnByb3RvY29sCQk9CUlQUFJPVE9fSVBJUDsKKwlpcGgtPnRvcwkJPQlJTkVUX0VDTl9lbmNhcHN1bGF0ZSh0b3MsIG9sZF9pcGgtPnRvcyk7CisJaXBoLT5kYWRkcgkJPQlydC0+cnRfZHN0OworCWlwaC0+c2FkZHIJCT0JcnQtPnJ0X3NyYzsKKworCWlmICgoaXBoLT50dGwgPSB0aXBoLT50dGwpID09IDApCisJCWlwaC0+dHRsCT0Jb2xkX2lwaC0+dHRsOworCisJbmZfcmVzZXQoc2tiKTsKKworCUlQVFVOTkVMX1hNSVQoKTsKKwl0dW5uZWwtPnJlY3Vyc2lvbi0tOworCXJldHVybiAwOworCit0eF9lcnJvcl9pY21wOgorCWRzdF9saW5rX2ZhaWx1cmUoc2tiKTsKK3R4X2Vycm9yOgorCXN0YXRzLT50eF9lcnJvcnMrKzsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJdHVubmVsLT5yZWN1cnNpb24tLTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraXBpcF90dW5uZWxfaW9jdGwgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBpcF90dW5uZWxfcGFybSBwOworCXN0cnVjdCBpcF90dW5uZWwgKnQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0dFVFRVTk5FTDoKKwkJdCA9IE5VTEw7CisJCWlmIChkZXYgPT0gaXBpcF9mYl90dW5uZWxfZGV2KSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnAsIGlmci0+aWZyX2lmcnUuaWZydV9kYXRhLCBzaXplb2YocCkpKSB7CisJCQkJZXJyID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXQgPSBpcGlwX3R1bm5lbF9sb2NhdGUoJnAsIDApOworCQl9CisJCWlmICh0ID09IE5VTEwpCisJCQl0ID0gKHN0cnVjdCBpcF90dW5uZWwqKWRldi0+cHJpdjsKKwkJbWVtY3B5KCZwLCAmdC0+cGFybXMsIHNpemVvZihwKSk7CisJCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfaWZydS5pZnJ1X2RhdGEsICZwLCBzaXplb2YocCkpKQorCQkJZXJyID0gLUVGQVVMVDsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NBRERUVU5ORUw6CisJY2FzZSBTSU9DQ0hHVFVOTkVMOgorCQllcnIgPSAtRVBFUk07CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCWdvdG8gZG9uZTsKKworCQllcnIgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnAsIGlmci0+aWZyX2lmcnUuaWZydV9kYXRhLCBzaXplb2YocCkpKQorCQkJZ290byBkb25lOworCisJCWVyciA9IC1FSU5WQUw7CisJCWlmIChwLmlwaC52ZXJzaW9uICE9IDQgfHwgcC5pcGgucHJvdG9jb2wgIT0gSVBQUk9UT19JUElQIHx8CisJCSAgICBwLmlwaC5paGwgIT0gNSB8fCAocC5pcGguZnJhZ19vZmYmaHRvbnMofklQX0RGKSkpCisJCQlnb3RvIGRvbmU7CisJCWlmIChwLmlwaC50dGwpCisJCQlwLmlwaC5mcmFnX29mZiB8PSBodG9ucyhJUF9ERik7CisKKwkJdCA9IGlwaXBfdHVubmVsX2xvY2F0ZSgmcCwgY21kID09IFNJT0NBRERUVU5ORUwpOworCisJCWlmIChkZXYgIT0gaXBpcF9mYl90dW5uZWxfZGV2ICYmIGNtZCA9PSBTSU9DQ0hHVFVOTkVMKSB7CisJCQlpZiAodCAhPSBOVUxMKSB7CisJCQkJaWYgKHQtPmRldiAhPSBkZXYpIHsKKwkJCQkJZXJyID0gLUVFWElTVDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoKChkZXYtPmZsYWdzJklGRl9QT0lOVE9QT0lOVCkgJiYgIXAuaXBoLmRhZGRyKSB8fAorCQkJCSAgICAoIShkZXYtPmZsYWdzJklGRl9QT0lOVE9QT0lOVCkgJiYgcC5pcGguZGFkZHIpKSB7CisJCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQl0ID0gKHN0cnVjdCBpcF90dW5uZWwqKWRldi0+cHJpdjsKKwkJCQlpcGlwX3R1bm5lbF91bmxpbmsodCk7CisJCQkJdC0+cGFybXMuaXBoLnNhZGRyID0gcC5pcGguc2FkZHI7CisJCQkJdC0+cGFybXMuaXBoLmRhZGRyID0gcC5pcGguZGFkZHI7CisJCQkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsICZwLmlwaC5zYWRkciwgNCk7CisJCQkJbWVtY3B5KGRldi0+YnJvYWRjYXN0LCAmcC5pcGguZGFkZHIsIDQpOworCQkJCWlwaXBfdHVubmVsX2xpbmsodCk7CisJCQkJbmV0ZGV2X3N0YXRlX2NoYW5nZShkZXYpOworCQkJfQorCQl9CisKKwkJaWYgKHQpIHsKKwkJCWVyciA9IDA7CisJCQlpZiAoY21kID09IFNJT0NDSEdUVU5ORUwpIHsKKwkJCQl0LT5wYXJtcy5pcGgudHRsID0gcC5pcGgudHRsOworCQkJCXQtPnBhcm1zLmlwaC50b3MgPSBwLmlwaC50b3M7CisJCQkJdC0+cGFybXMuaXBoLmZyYWdfb2ZmID0gcC5pcGguZnJhZ19vZmY7CisJCQl9CisJCQlpZiAoY29weV90b191c2VyKGlmci0+aWZyX2lmcnUuaWZydV9kYXRhLCAmdC0+cGFybXMsIHNpemVvZihwKSkpCisJCQkJZXJyID0gLUVGQVVMVDsKKwkJfSBlbHNlCisJCQllcnIgPSAoY21kID09IFNJT0NBRERUVU5ORUwgPyAtRU5PQlVGUyA6IC1FTk9FTlQpOworCQlicmVhazsKKworCWNhc2UgU0lPQ0RFTFRVTk5FTDoKKwkJZXJyID0gLUVQRVJNOworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlnb3RvIGRvbmU7CisKKwkJaWYgKGRldiA9PSBpcGlwX2ZiX3R1bm5lbF9kZXYpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnAsIGlmci0+aWZyX2lmcnUuaWZydV9kYXRhLCBzaXplb2YocCkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCWVyciA9IC1FTk9FTlQ7CisJCQlpZiAoKHQgPSBpcGlwX3R1bm5lbF9sb2NhdGUoJnAsIDApKSA9PSBOVUxMKQorCQkJCWdvdG8gZG9uZTsKKwkJCWVyciA9IC1FUEVSTTsKKwkJCWlmICh0LT5kZXYgPT0gaXBpcF9mYl90dW5uZWxfZGV2KQorCQkJCWdvdG8gZG9uZTsKKwkJCWRldiA9IHQtPmRldjsKKwkJfQorCQllcnIgPSB1bnJlZ2lzdGVyX25ldGRldmljZShkZXYpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FSU5WQUw7CisJfQorCitkb25lOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXBpcF90dW5uZWxfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuICYoKChzdHJ1Y3QgaXBfdHVubmVsKilkZXYtPnByaXYpLT5zdGF0KTsKK30KKworc3RhdGljIGludCBpcGlwX3R1bm5lbF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCWlmIChuZXdfbXR1IDwgNjggfHwgbmV3X210dSA+IDB4RkZGOCAtIHNpemVvZihzdHJ1Y3QgaXBoZHIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZXYtPm10dSA9IG5ld19tdHU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlwaXBfdHVubmVsX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCWRldi0+dW5pbml0CQk9IGlwaXBfdHVubmVsX3VuaW5pdDsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IGlwaXBfdHVubmVsX3htaXQ7CisJZGV2LT5nZXRfc3RhdHMJCT0gaXBpcF90dW5uZWxfZ2V0X3N0YXRzOworCWRldi0+ZG9faW9jdGwJCT0gaXBpcF90dW5uZWxfaW9jdGw7CisJZGV2LT5jaGFuZ2VfbXR1CQk9IGlwaXBfdHVubmVsX2NoYW5nZV9tdHU7CisJZGV2LT5kZXN0cnVjdG9yCQk9IGZyZWVfbmV0ZGV2OworCisJZGV2LT50eXBlCQk9IEFSUEhSRF9UVU5ORUw7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4gCT0gTExfTUFYX0hFQURFUiArIHNpemVvZihzdHJ1Y3QgaXBoZHIpOworCWRldi0+bXR1CQk9IDE1MDAgLSBzaXplb2Yoc3RydWN0IGlwaGRyKTsKKwlkZXYtPmZsYWdzCQk9IElGRl9OT0FSUDsKKwlkZXYtPmlmbGluawkJPSAwOworCWRldi0+YWRkcl9sZW4JCT0gNDsKK30KKworc3RhdGljIGludCBpcGlwX3R1bm5lbF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKnRkZXYgPSBOVUxMOworCXN0cnVjdCBpcF90dW5uZWwgKnR1bm5lbDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKworCXR1bm5lbCA9IChzdHJ1Y3QgaXBfdHVubmVsKilkZXYtPnByaXY7CisJaXBoID0gJnR1bm5lbC0+cGFybXMuaXBoOworCisJdHVubmVsLT5kZXYgPSBkZXY7CisJc3RyY3B5KHR1bm5lbC0+cGFybXMubmFtZSwgZGV2LT5uYW1lKTsKKworCW1lbWNweShkZXYtPmRldl9hZGRyLCAmdHVubmVsLT5wYXJtcy5pcGguc2FkZHIsIDQpOworCW1lbWNweShkZXYtPmJyb2FkY2FzdCwgJnR1bm5lbC0+cGFybXMuaXBoLmRhZGRyLCA0KTsKKworCWlmIChpcGgtPmRhZGRyKSB7CisJCXN0cnVjdCBmbG93aSBmbCA9IHsgLm9pZiA9IHR1bm5lbC0+cGFybXMubGluaywKKwkJCQkgICAgLm5sX3UgPSB7IC5pcDRfdSA9CisJCQkJCSAgICAgIHsgLmRhZGRyID0gaXBoLT5kYWRkciwKKwkJCQkJCS5zYWRkciA9IGlwaC0+c2FkZHIsCisJCQkJCQkudG9zID0gUlRfVE9TKGlwaC0+dG9zKSB9IH0sCisJCQkJICAgIC5wcm90byA9IElQUFJPVE9fSVBJUCB9OworCQlzdHJ1Y3QgcnRhYmxlICpydDsKKwkJaWYgKCFpcF9yb3V0ZV9vdXRwdXRfa2V5KCZydCwgJmZsKSkgeworCQkJdGRldiA9IHJ0LT51LmRzdC5kZXY7CisJCQlpcF9ydF9wdXQocnQpOworCQl9CisJCWRldi0+ZmxhZ3MgfD0gSUZGX1BPSU5UT1BPSU5UOworCX0KKworCWlmICghdGRldiAmJiB0dW5uZWwtPnBhcm1zLmxpbmspCisJCXRkZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgodHVubmVsLT5wYXJtcy5saW5rKTsKKworCWlmICh0ZGV2KSB7CisJCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gdGRldi0+aGFyZF9oZWFkZXJfbGVuICsgc2l6ZW9mKHN0cnVjdCBpcGhkcik7CisJCWRldi0+bXR1ID0gdGRldi0+bXR1IC0gc2l6ZW9mKHN0cnVjdCBpcGhkcik7CisJfQorCWRldi0+aWZsaW5rID0gdHVubmVsLT5wYXJtcy5saW5rOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGlwaXBfZmJfdHVubmVsX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXBfdHVubmVsICp0dW5uZWwgPSBkZXYtPnByaXY7CisJc3RydWN0IGlwaGRyICppcGggPSAmdHVubmVsLT5wYXJtcy5pcGg7CisKKwl0dW5uZWwtPmRldiA9IGRldjsKKwlzdHJjcHkodHVubmVsLT5wYXJtcy5uYW1lLCBkZXYtPm5hbWUpOworCisJaXBoLT52ZXJzaW9uCQk9IDQ7CisJaXBoLT5wcm90b2NvbAkJPSBJUFBST1RPX0lQSVA7CisJaXBoLT5paGwJCT0gNTsKKworCWRldl9ob2xkKGRldik7CisJdHVubmVsc193Y1swXQkJPSB0dW5uZWw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeGZybV90dW5uZWwgaXBpcF9oYW5kbGVyID0geworCS5oYW5kbGVyCT0JaXBpcF9yY3YsCisJLmVycl9oYW5kbGVyCT0JaXBpcF9lcnIsCit9OworCitzdGF0aWMgY2hhciBiYW5uZXJbXSBfX2luaXRkYXRhID0KKwlLRVJOX0lORk8gIklQdjQgb3ZlciBJUHY0IHR1bm5lbGluZyBkcml2ZXJcbiI7CisKK3N0YXRpYyBpbnQgX19pbml0IGlwaXBfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwlwcmludGsoYmFubmVyKTsKKworCWlmICh4ZnJtNF90dW5uZWxfcmVnaXN0ZXIoJmlwaXBfaGFuZGxlcikgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gImlwaXAgaW5pdDogY2FuJ3QgcmVnaXN0ZXIgdHVubmVsXG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJaXBpcF9mYl90dW5uZWxfZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgaXBfdHVubmVsKSwKKwkJCQkJICAgInR1bmwwIiwKKwkJCQkJICAgaXBpcF90dW5uZWxfc2V0dXApOworCWlmICghaXBpcF9mYl90dW5uZWxfZGV2KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyMTsKKwl9CisKKwlpcGlwX2ZiX3R1bm5lbF9kZXYtPmluaXQgPSBpcGlwX2ZiX3R1bm5lbF9pbml0OworCisJaWYgKChlcnIgPSByZWdpc3Rlcl9uZXRkZXYoaXBpcF9mYl90dW5uZWxfZGV2KSkpCisJCWdvdG8gZXJyMjsKKyBvdXQ6CisJcmV0dXJuIGVycjsKKyBlcnIyOgorCWZyZWVfbmV0ZGV2KGlwaXBfZmJfdHVubmVsX2Rldik7CisgZXJyMToKKwl4ZnJtNF90dW5uZWxfZGVyZWdpc3RlcigmaXBpcF9oYW5kbGVyKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGlwaXBfZmluaSh2b2lkKQoreworCWlmICh4ZnJtNF90dW5uZWxfZGVyZWdpc3RlcigmaXBpcF9oYW5kbGVyKSA8IDApCisJCXByaW50ayhLRVJOX0lORk8gImlwaXAgY2xvc2U6IGNhbid0IGRlcmVnaXN0ZXIgdHVubmVsXG4iKTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGlwaXBfZmJfdHVubmVsX2Rldik7Cit9CisKK21vZHVsZV9pbml0KGlwaXBfaW5pdCk7Cittb2R1bGVfZXhpdChpcGlwX2ZpbmkpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBtci5jIGIvbmV0L2lwdjQvaXBtci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMWMwNDkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9pcG1yLmMKQEAgLTAsMCArMSwxOTAwIEBACisvKgorICoJSVAgbXVsdGljYXN0IHJvdXRpbmcgc3VwcG9ydCBmb3IgbXJvdXRlZCAzLjYvMy44CisgKgorICoJCShjKSAxOTk1IEFsYW4gQ294LCA8YWxhbkByZWRoYXQuY29tPgorICoJICBMaW51eCBDb25zdWx0YW5jeSBhbmQgQ3VzdG9tIERyaXZlciBEZXZlbG9wbWVudAorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVmVyc2lvbjogJElkOiBpcG1yLmMsdiAxLjY1IDIwMDEvMTAvMzEgMjE6NTU6NTQgZGF2ZW0gRXhwICQKKyAqCisgKglGaXhlczoKKyAqCU1pY2hhZWwgQ2hhc3RhaW4JOglJbmNvcnJlY3Qgc2l6ZSBvZiBjb3B5aW5nLgorICoJQWxhbiBDb3gJCToJQWRkZWQgdGhlIGNhY2hlIG1hbmFnZXIgY29kZQorICoJQWxhbiBDb3gJCToJRml4ZWQgdGhlIGNsb25lL2NvcHkgYnVnIGFuZCBkZXZpY2UgcmFjZS4KKyAqCU1pa2UgTWNMYWdhbgkJOglSb3V0aW5nIGJ5IHNvdXJjZQorICoJTWFsY29sbSBCZWF0dGllCQk6CUJ1ZmZlciBoYW5kbGluZyBmaXhlcy4KKyAqCUFsZXhleSBLdXpuZXRzb3YJOglEb3VibGUgYnVmZmVyIGZyZWUgYW5kIG90aGVyIGZpeGVzLgorICoJU1ZSIEFuYW5kCQk6CUZpeGVkIHNldmVyYWwgbXVsdGljYXN0IGJ1Z3MgYW5kIHByb2JsZW1zLgorICoJQWxleGV5IEt1em5ldHNvdgk6CVN0YXR1cywgb3B0aW1pc2F0aW9ucyBhbmQgbW9yZS4KKyAqCUJyYWQgUGFya2VyCQk6CUJldHRlciBiZWhhdmlvdXIgb24gbXJvdXRlZCB1cGNhbGwKKyAqCQkJCQlvdmVyZmxvdy4KKyAqICAgICAgQ2FybG9zIFBpY290byAgICAgICAgICAgOiAgICAgICBQSU12MSBTdXBwb3J0CisgKglQYXZsaW4gSXZhbm92IFJhZG9zbGF2b3Y6CVBJTXYyIFJlZ2lzdGVycyBtdXN0IGNoZWNrc3VtIG9ubHkgUElNIGhlYWRlcgorICoJCQkJCVJlbGF4IHRoaXMgcmVxdXJlbWVudCB0byB3b3JrIHdpdGggb2xkZXIgcGVlcnMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lnbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvaWNtcC5oPgorI2luY2x1ZGUgPG5ldC91ZHAuaD4KKyNpbmNsdWRlIDxuZXQvcmF3Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2luY2x1ZGUgPG5ldC9pcGlwLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19JUF9QSU1TTV9WMSkgfHwgZGVmaW5lZChDT05GSUdfSVBfUElNU01fVjIpCisjZGVmaW5lIENPTkZJR19JUF9QSU1TTQkxCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzb2NrICptcm91dGVfc29ja2V0OworCisKKy8qIEJpZyBsb2NrLCBwcm90ZWN0aW5nIHZpZiB0YWJsZSwgbXJ0IGNhY2hlIGFuZCBtcm91dGUgc29ja2V0IHN0YXRlLgorICAgTm90ZSB0aGF0IHRoZSBjaGFuZ2VzIGFyZSBzZW1hcGhvcmVkIHZpYSBydG5sX2xvY2suCisgKi8KKworc3RhdGljIERFRklORV9SV0xPQ0sobXJ0X2xvY2spOworCisvKgorICoJTXVsdGljYXN0IHJvdXRlciBjb250cm9sIHZhcmlhYmxlcworICovCisKK3N0YXRpYyBzdHJ1Y3QgdmlmX2RldmljZSB2aWZfdGFibGVbTUFYVklGU107CQkvKiBEZXZpY2VzIAkJKi8KK3N0YXRpYyBpbnQgbWF4dmlmOworCisjZGVmaW5lIFZJRl9FWElTVFMoaWR4KSAodmlmX3RhYmxlW2lkeF0uZGV2ICE9IE5VTEwpCisKK3N0YXRpYyBpbnQgbXJvdXRlX2RvX2Fzc2VydDsJCQkJLyogU2V0IGluIFBJTSBhc3NlcnQJKi8KK3N0YXRpYyBpbnQgbXJvdXRlX2RvX3BpbTsKKworc3RhdGljIHN0cnVjdCBtZmNfY2FjaGUgKm1mY19jYWNoZV9hcnJheVtNRkNfTElORVNdOwkvKiBGb3J3YXJkaW5nIGNhY2hlCSovCisKK3N0YXRpYyBzdHJ1Y3QgbWZjX2NhY2hlICptZmNfdW5yZXNfcXVldWU7CQkvKiBRdWV1ZSBvZiB1bnJlc29sdmVkIGVudHJpZXMgKi8KK3N0YXRpYyBhdG9taWNfdCBjYWNoZV9yZXNvbHZlX3F1ZXVlX2xlbjsJCS8qIFNpemUgb2YgdW5yZXNvbHZlZAkqLworCisvKiBTcGVjaWFsIHNwaW5sb2NrIGZvciBxdWV1ZSBvZiB1bnJlc29sdmVkIGVudHJpZXMgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWZjX3VucmVzX2xvY2spOworCisvKiBXZSByZXR1cm4gdG8gb3JpZ2luYWwgQWxhbidzIHNjaGVtZS4gSGFzaCB0YWJsZSBvZiByZXNvbHZlZAorICAgZW50cmllcyBpcyBjaGFuZ2VkIG9ubHkgaW4gcHJvY2VzcyBjb250ZXh0IGFuZCBwcm90ZWN0ZWQKKyAgIHdpdGggd2VhayBsb2NrIG1ydF9sb2NrLiBRdWV1ZSBvZiB1bnJlc29sdmVkIGVudHJpZXMgaXMgcHJvdGVjdGVkCisgICB3aXRoIHN0cm9uZyBzcGlubG9jayBtZmNfdW5yZXNfbG9jay4KKworICAgSW4gdGhpcyBjYXNlIGRhdGEgcGF0aCBpcyBmcmVlIG9mIGV4Y2x1c2l2ZSBsb2NrcyBhdCBhbGwuCisgKi8KKworc3RhdGljIGttZW1fY2FjaGVfdCAqbXJ0X2NhY2hlcDsKKworc3RhdGljIGludCBpcF9tcl9mb3J3YXJkKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBtZmNfY2FjaGUgKmNhY2hlLCBpbnQgbG9jYWwpOworc3RhdGljIGludCBpcG1yX2NhY2hlX3JlcG9ydChzdHJ1Y3Qgc2tfYnVmZiAqcGt0LCB2aWZpX3QgdmlmaSwgaW50IGFzc2VydCk7CitzdGF0aWMgaW50IGlwbXJfZmlsbF9tcm91dGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG1mY19jYWNoZSAqYywgc3RydWN0IHJ0bXNnICpydG0pOworCisjaWZkZWYgQ09ORklHX0lQX1BJTVNNX1YyCitzdGF0aWMgc3RydWN0IG5ldF9wcm90b2NvbCBwaW1fcHJvdG9jb2w7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGlwbXJfZXhwaXJlX3RpbWVyOworCisvKiBTZXJ2aWNlIHJvdXRpbmVzIGNyZWF0aW5nIHZpcnR1YWwgaW50ZXJmYWNlczogRFZNUlAgdHVubmVscyBhbmQgUElNUkVHICovCisKK3N0YXRpYworc3RydWN0IG5ldF9kZXZpY2UgKmlwbXJfbmV3X3R1bm5lbChzdHJ1Y3QgdmlmY3RsICp2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICAqZGV2OworCisJZGV2ID0gX19kZXZfZ2V0X2J5X25hbWUoInR1bmwwIik7CisKKwlpZiAoZGV2KSB7CisJCWludCBlcnI7CisJCXN0cnVjdCBpZnJlcSBpZnI7CisJCW1tX3NlZ21lbnRfdAlvbGRmczsKKwkJc3RydWN0IGlwX3R1bm5lbF9wYXJtIHA7CisJCXN0cnVjdCBpbl9kZXZpY2UgICppbl9kZXY7CisKKwkJbWVtc2V0KCZwLCAwLCBzaXplb2YocCkpOworCQlwLmlwaC5kYWRkciA9IHYtPnZpZmNfcm10X2FkZHIuc19hZGRyOworCQlwLmlwaC5zYWRkciA9IHYtPnZpZmNfbGNsX2FkZHIuc19hZGRyOworCQlwLmlwaC52ZXJzaW9uID0gNDsKKwkJcC5pcGguaWhsID0gNTsKKwkJcC5pcGgucHJvdG9jb2wgPSBJUFBST1RPX0lQSVA7CisJCXNwcmludGYocC5uYW1lLCAiZHZtcnAlZCIsIHYtPnZpZmNfdmlmaSk7CisJCWlmci5pZnJfaWZydS5pZnJ1X2RhdGEgPSAodm9pZCopJnA7CisKKwkJb2xkZnMgPSBnZXRfZnMoKTsgc2V0X2ZzKEtFUk5FTF9EUyk7CisJCWVyciA9IGRldi0+ZG9faW9jdGwoZGV2LCAmaWZyLCBTSU9DQUREVFVOTkVMKTsKKwkJc2V0X2ZzKG9sZGZzKTsKKworCQlkZXYgPSBOVUxMOworCisJCWlmIChlcnIgPT0gMCAmJiAoZGV2ID0gX19kZXZfZ2V0X2J5X25hbWUocC5uYW1lKSkgIT0gTlVMTCkgeworCQkJZGV2LT5mbGFncyB8PSBJRkZfTVVMVElDQVNUOworCisJCQlpbl9kZXYgPSBfX2luX2Rldl9nZXQoZGV2KTsKKwkJCWlmIChpbl9kZXYgPT0gTlVMTCAmJiAoaW5fZGV2ID0gaW5ldGRldl9pbml0KGRldikpID09IE5VTEwpCisJCQkJZ290byBmYWlsdXJlOworCQkJaW5fZGV2LT5jbmYucnBfZmlsdGVyID0gMDsKKworCQkJaWYgKGRldl9vcGVuKGRldikpCisJCQkJZ290byBmYWlsdXJlOworCQl9CisJfQorCXJldHVybiBkZXY7CisKK2ZhaWx1cmU6CisJLyogYWxsb3cgdGhlIHJlZ2lzdGVyIHRvIGJlIGNvbXBsZXRlZCBiZWZvcmUgdW5yZWdpc3RlcmluZy4gKi8KKwlydG5sX3VubG9jaygpOworCXJ0bmxfbG9jaygpOworCisJdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKKwlyZXR1cm4gTlVMTDsKK30KKworI2lmZGVmIENPTkZJR19JUF9QSU1TTQorCitzdGF0aWMgaW50IHJlZ192aWZfbnVtID0gLTE7CisKK3N0YXRpYyBpbnQgcmVnX3ZpZl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmVhZF9sb2NrKCZtcnRfbG9jayk7CisJKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyopZGV2LT5wcml2KS0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyopZGV2LT5wcml2KS0+dHhfcGFja2V0cysrOworCWlwbXJfY2FjaGVfcmVwb3J0KHNrYiwgcmVnX3ZpZl9udW0sIElHTVBNU0dfV0hPTEVQS1QpOworCXJlYWRfdW5sb2NrKCZtcnRfbG9jayk7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcmVnX3ZpZl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKilkZXYtPnByaXY7Cit9CisKK3N0YXRpYyB2b2lkIHJlZ192aWZfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkZXYtPnR5cGUJCT0gQVJQSFJEX1BJTVJFRzsKKwlkZXYtPm10dQkJPSAxNTAwIC0gc2l6ZW9mKHN0cnVjdCBpcGhkcikgLSA4OworCWRldi0+ZmxhZ3MJCT0gSUZGX05PQVJQOworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gcmVnX3ZpZl94bWl0OworCWRldi0+Z2V0X3N0YXRzCQk9IHJlZ192aWZfZ2V0X3N0YXRzOworCWRldi0+ZGVzdHJ1Y3RvcgkJPSBmcmVlX25ldGRldjsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICppcG1yX3JlZ192aWYodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKworCWRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpLCAicGltcmVnIiwKKwkJCSAgIHJlZ192aWZfc2V0dXApOworCisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChyZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KSkgeworCQlmcmVlX25ldGRldihkZXYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJZGV2LT5pZmxpbmsgPSAwOworCisJaWYgKChpbl9kZXYgPSBpbmV0ZGV2X2luaXQoZGV2KSkgPT0gTlVMTCkKKwkJZ290byBmYWlsdXJlOworCisJaW5fZGV2LT5jbmYucnBfZmlsdGVyID0gMDsKKworCWlmIChkZXZfb3BlbihkZXYpKQorCQlnb3RvIGZhaWx1cmU7CisKKwlyZXR1cm4gZGV2OworCitmYWlsdXJlOgorCS8qIGFsbG93IHRoZSByZWdpc3RlciB0byBiZSBjb21wbGV0ZWQgYmVmb3JlIHVucmVnaXN0ZXJpbmcuICovCisJcnRubF91bmxvY2soKTsKKwlydG5sX2xvY2soKTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKGRldik7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworLyoKKyAqCURlbGV0ZSBhIFZJRiBlbnRyeQorICovCisgCitzdGF0aWMgaW50IHZpZl9kZWxldGUoaW50IHZpZmkpCit7CisJc3RydWN0IHZpZl9kZXZpY2UgKnY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisKKwlpZiAodmlmaSA8IDAgfHwgdmlmaSA+PSBtYXh2aWYpCisJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKKworCXYgPSAmdmlmX3RhYmxlW3ZpZmldOworCisJd3JpdGVfbG9ja19iaCgmbXJ0X2xvY2spOworCWRldiA9IHYtPmRldjsKKwl2LT5kZXYgPSBOVUxMOworCisJaWYgKCFkZXYpIHsKKwkJd3JpdGVfdW5sb2NrX2JoKCZtcnRfbG9jayk7CisJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKKwl9CisKKyNpZmRlZiBDT05GSUdfSVBfUElNU00KKwlpZiAodmlmaSA9PSByZWdfdmlmX251bSkKKwkJcmVnX3ZpZl9udW0gPSAtMTsKKyNlbmRpZgorCisJaWYgKHZpZmkrMSA9PSBtYXh2aWYpIHsKKwkJaW50IHRtcDsKKwkJZm9yICh0bXA9dmlmaS0xOyB0bXA+PTA7IHRtcC0tKSB7CisJCQlpZiAoVklGX0VYSVNUUyh0bXApKQorCQkJCWJyZWFrOworCQl9CisJCW1heHZpZiA9IHRtcCsxOworCX0KKworCXdyaXRlX3VubG9ja19iaCgmbXJ0X2xvY2spOworCisJZGV2X3NldF9hbGxtdWx0aShkZXYsIC0xKTsKKworCWlmICgoaW5fZGV2ID0gX19pbl9kZXZfZ2V0KGRldikpICE9IE5VTEwpIHsKKwkJaW5fZGV2LT5jbmYubWNfZm9yd2FyZGluZy0tOworCQlpcF9ydF9tdWx0aWNhc3RfZXZlbnQoaW5fZGV2KTsKKwl9CisKKwlpZiAodi0+ZmxhZ3MmKFZJRkZfVFVOTkVMfFZJRkZfUkVHSVNURVIpKQorCQl1bnJlZ2lzdGVyX25ldGRldmljZShkZXYpOworCisJZGV2X3B1dChkZXYpOworCXJldHVybiAwOworfQorCisvKiBEZXN0cm95IGFuIHVucmVzb2x2ZWQgY2FjaGUgZW50cnksIGtpbGxpbmcgcXVldWVkIHNrYnMKKyAgIGFuZCByZXBvcnRpbmcgZXJyb3IgdG8gbmV0bGluayByZWFkZXJzLgorICovCisKK3N0YXRpYyB2b2lkIGlwbXJfZGVzdHJveV91bnJlcyhzdHJ1Y3QgbWZjX2NhY2hlICpjKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlhdG9taWNfZGVjKCZjYWNoZV9yZXNvbHZlX3F1ZXVlX2xlbik7CisKKwl3aGlsZSgoc2tiPXNrYl9kZXF1ZXVlKCZjLT5tZmNfdW4udW5yZXMudW5yZXNvbHZlZCkpKSB7CisJCWlmIChza2ItPm5oLmlwaC0+dmVyc2lvbiA9PSAwKSB7CisJCQlzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKilza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKKwkJCW5saC0+bmxtc2dfdHlwZSA9IE5MTVNHX0VSUk9SOworCQkJbmxoLT5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBubG1zZ2VycikpOworCQkJc2tiX3RyaW0oc2tiLCBubGgtPm5sbXNnX2xlbik7CisJCQkoKHN0cnVjdCBubG1zZ2VyciopTkxNU0dfREFUQShubGgpKS0+ZXJyb3IgPSAtRVRJTUVET1VUOworCQkJbmV0bGlua191bmljYXN0KHJ0bmwsIHNrYiwgTkVUTElOS19DQihza2IpLmRzdF9waWQsIE1TR19ET05UV0FJVCk7CisJCX0gZWxzZQorCQkJa2ZyZWVfc2tiKHNrYik7CisJfQorCisJa21lbV9jYWNoZV9mcmVlKG1ydF9jYWNoZXAsIGMpOworfQorCisKKy8qIFNpbmdsZSB0aW1lciBwcm9jZXNzIGZvciBhbGwgdGhlIHVucmVzb2x2ZWQgcXVldWUuICovCisKK3N0YXRpYyB2b2lkIGlwbXJfZXhwaXJlX3Byb2Nlc3ModW5zaWduZWQgbG9uZyBkdW1teSkKK3sKKwl1bnNpZ25lZCBsb25nIG5vdzsKKwl1bnNpZ25lZCBsb25nIGV4cGlyZXM7CisJc3RydWN0IG1mY19jYWNoZSAqYywgKipjcDsKKworCWlmICghc3Bpbl90cnlsb2NrKCZtZmNfdW5yZXNfbG9jaykpIHsKKwkJbW9kX3RpbWVyKCZpcG1yX2V4cGlyZV90aW1lciwgamlmZmllcytIWi8xMCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoYXRvbWljX3JlYWQoJmNhY2hlX3Jlc29sdmVfcXVldWVfbGVuKSA9PSAwKQorCQlnb3RvIG91dDsKKworCW5vdyA9IGppZmZpZXM7CisJZXhwaXJlcyA9IDEwKkhaOworCWNwID0gJm1mY191bnJlc19xdWV1ZTsKKworCXdoaWxlICgoYz0qY3ApICE9IE5VTEwpIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoYy0+bWZjX3VuLnVucmVzLmV4cGlyZXMsIG5vdykpIHsKKwkJCXVuc2lnbmVkIGxvbmcgaW50ZXJ2YWwgPSBjLT5tZmNfdW4udW5yZXMuZXhwaXJlcyAtIG5vdzsKKwkJCWlmIChpbnRlcnZhbCA8IGV4cGlyZXMpCisJCQkJZXhwaXJlcyA9IGludGVydmFsOworCQkJY3AgPSAmYy0+bmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJKmNwID0gYy0+bmV4dDsKKworCQlpcG1yX2Rlc3Ryb3lfdW5yZXMoYyk7CisJfQorCisJaWYgKGF0b21pY19yZWFkKCZjYWNoZV9yZXNvbHZlX3F1ZXVlX2xlbikpCisJCW1vZF90aW1lcigmaXBtcl9leHBpcmVfdGltZXIsIGppZmZpZXMgKyBleHBpcmVzKTsKKworb3V0OgorCXNwaW5fdW5sb2NrKCZtZmNfdW5yZXNfbG9jayk7Cit9CisKKy8qIEZpbGwgb2lmcyBsaXN0LiBJdCBpcyBjYWxsZWQgdW5kZXIgd3JpdGUgbG9ja2VkIG1ydF9sb2NrLiAqLworCitzdGF0aWMgdm9pZCBpcG1yX3VwZGF0ZV90aHJlc2hvdWxkcyhzdHJ1Y3QgbWZjX2NhY2hlICpjYWNoZSwgdW5zaWduZWQgY2hhciAqdHRscykKK3sKKwlpbnQgdmlmaTsKKworCWNhY2hlLT5tZmNfdW4ucmVzLm1pbnZpZiA9IE1BWFZJRlM7CisJY2FjaGUtPm1mY191bi5yZXMubWF4dmlmID0gMDsKKwltZW1zZXQoY2FjaGUtPm1mY191bi5yZXMudHRscywgMjU1LCBNQVhWSUZTKTsKKworCWZvciAodmlmaT0wOyB2aWZpPG1heHZpZjsgdmlmaSsrKSB7CisJCWlmIChWSUZfRVhJU1RTKHZpZmkpICYmIHR0bHNbdmlmaV0gJiYgdHRsc1t2aWZpXSA8IDI1NSkgeworCQkJY2FjaGUtPm1mY191bi5yZXMudHRsc1t2aWZpXSA9IHR0bHNbdmlmaV07CisJCQlpZiAoY2FjaGUtPm1mY191bi5yZXMubWludmlmID4gdmlmaSkKKwkJCQljYWNoZS0+bWZjX3VuLnJlcy5taW52aWYgPSB2aWZpOworCQkJaWYgKGNhY2hlLT5tZmNfdW4ucmVzLm1heHZpZiA8PSB2aWZpKQorCQkJCWNhY2hlLT5tZmNfdW4ucmVzLm1heHZpZiA9IHZpZmkgKyAxOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHZpZl9hZGQoc3RydWN0IHZpZmN0bCAqdmlmYywgaW50IG1ydHNvY2spCit7CisJaW50IHZpZmkgPSB2aWZjLT52aWZjX3ZpZmk7CisJc3RydWN0IHZpZl9kZXZpY2UgKnYgPSAmdmlmX3RhYmxlW3ZpZmldOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCisJLyogSXMgdmlmIGJ1c3kgPyAqLworCWlmIChWSUZfRVhJU1RTKHZpZmkpKQorCQlyZXR1cm4gLUVBRERSSU5VU0U7CisKKwlzd2l0Y2ggKHZpZmMtPnZpZmNfZmxhZ3MpIHsKKyNpZmRlZiBDT05GSUdfSVBfUElNU00KKwljYXNlIFZJRkZfUkVHSVNURVI6CisJCS8qCisJCSAqIFNwZWNpYWwgUHVycG9zZSBWSUYgaW4gUElNCisJCSAqIEFsbCB0aGUgcGFja2V0cyB3aWxsIGJlIHNlbnQgdG8gdGhlIGRhZW1vbgorCQkgKi8KKwkJaWYgKHJlZ192aWZfbnVtID49IDApCisJCQlyZXR1cm4gLUVBRERSSU5VU0U7CisJCWRldiA9IGlwbXJfcmVnX3ZpZigpOworCQlpZiAoIWRldikKKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIFZJRkZfVFVOTkVMOgkKKwkJZGV2ID0gaXBtcl9uZXdfdHVubmVsKHZpZmMpOworCQlpZiAoIWRldikKKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQlkZXY9aXBfZGV2X2ZpbmQodmlmYy0+dmlmY19sY2xfYWRkci5zX2FkZHIpOworCQlpZiAoIWRldikKKwkJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKKwkJX19kZXZfcHV0KGRldik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgoaW5fZGV2ID0gX19pbl9kZXZfZ2V0KGRldikpID09IE5VTEwpCisJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKKwlpbl9kZXYtPmNuZi5tY19mb3J3YXJkaW5nKys7CisJZGV2X3NldF9hbGxtdWx0aShkZXYsICsxKTsKKwlpcF9ydF9tdWx0aWNhc3RfZXZlbnQoaW5fZGV2KTsKKworCS8qCisJICoJRmlsbCBpbiB0aGUgVklGIHN0cnVjdHVyZXMKKwkgKi8KKwl2LT5yYXRlX2xpbWl0PXZpZmMtPnZpZmNfcmF0ZV9saW1pdDsKKwl2LT5sb2NhbD12aWZjLT52aWZjX2xjbF9hZGRyLnNfYWRkcjsKKwl2LT5yZW1vdGU9dmlmYy0+dmlmY19ybXRfYWRkci5zX2FkZHI7CisJdi0+ZmxhZ3M9dmlmYy0+dmlmY19mbGFnczsKKwlpZiAoIW1ydHNvY2spCisJCXYtPmZsYWdzIHw9IFZJRkZfU1RBVElDOworCXYtPnRocmVzaG9sZD12aWZjLT52aWZjX3RocmVzaG9sZDsKKwl2LT5ieXRlc19pbiA9IDA7CisJdi0+Ynl0ZXNfb3V0ID0gMDsKKwl2LT5wa3RfaW4gPSAwOworCXYtPnBrdF9vdXQgPSAwOworCXYtPmxpbmsgPSBkZXYtPmlmaW5kZXg7CisJaWYgKHYtPmZsYWdzJihWSUZGX1RVTk5FTHxWSUZGX1JFR0lTVEVSKSkKKwkJdi0+bGluayA9IGRldi0+aWZsaW5rOworCisJLyogQW5kIGZpbmlzaCB1cGRhdGUgd3JpdGluZyBjcml0aWNhbCBkYXRhICovCisJd3JpdGVfbG9ja19iaCgmbXJ0X2xvY2spOworCWRldl9ob2xkKGRldik7CisJdi0+ZGV2PWRldjsKKyNpZmRlZiBDT05GSUdfSVBfUElNU00KKwlpZiAodi0+ZmxhZ3MmVklGRl9SRUdJU1RFUikKKwkJcmVnX3ZpZl9udW0gPSB2aWZpOworI2VuZGlmCisJaWYgKHZpZmkrMSA+IG1heHZpZikKKwkJbWF4dmlmID0gdmlmaSsxOworCXdyaXRlX3VubG9ja19iaCgmbXJ0X2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG1mY19jYWNoZSAqaXBtcl9jYWNoZV9maW5kKF9fdTMyIG9yaWdpbiwgX191MzIgbWNhc3RncnApCit7CisJaW50IGxpbmU9TUZDX0hBU0gobWNhc3RncnAsb3JpZ2luKTsKKwlzdHJ1Y3QgbWZjX2NhY2hlICpjOworCisJZm9yIChjPW1mY19jYWNoZV9hcnJheVtsaW5lXTsgYzsgYyA9IGMtPm5leHQpIHsKKwkJaWYgKGMtPm1mY19vcmlnaW49PW9yaWdpbiAmJiBjLT5tZmNfbWNhc3RncnA9PW1jYXN0Z3JwKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBjOworfQorCisvKgorICoJQWxsb2NhdGUgYSBtdWx0aWNhc3QgY2FjaGUgZW50cnkKKyAqLworc3RhdGljIHN0cnVjdCBtZmNfY2FjaGUgKmlwbXJfY2FjaGVfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgbWZjX2NhY2hlICpjPWttZW1fY2FjaGVfYWxsb2MobXJ0X2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJaWYoYz09TlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KGMsIDAsIHNpemVvZigqYykpOworCWMtPm1mY191bi5yZXMubWludmlmID0gTUFYVklGUzsKKwlyZXR1cm4gYzsKK30KKworc3RhdGljIHN0cnVjdCBtZmNfY2FjaGUgKmlwbXJfY2FjaGVfYWxsb2NfdW5yZXModm9pZCkKK3sKKwlzdHJ1Y3QgbWZjX2NhY2hlICpjPWttZW1fY2FjaGVfYWxsb2MobXJ0X2NhY2hlcCwgR0ZQX0FUT01JQyk7CisJaWYoYz09TlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KGMsIDAsIHNpemVvZigqYykpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmMtPm1mY191bi51bnJlcy51bnJlc29sdmVkKTsKKwljLT5tZmNfdW4udW5yZXMuZXhwaXJlcyA9IGppZmZpZXMgKyAxMCpIWjsKKwlyZXR1cm4gYzsKK30KKworLyoKKyAqCUEgY2FjaGUgZW50cnkgaGFzIGdvbmUgaW50byBhIHJlc29sdmVkIHN0YXRlIGZyb20gcXVldWVkCisgKi8KKyAKK3N0YXRpYyB2b2lkIGlwbXJfY2FjaGVfcmVzb2x2ZShzdHJ1Y3QgbWZjX2NhY2hlICp1Yywgc3RydWN0IG1mY19jYWNoZSAqYykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJLyoKKwkgKglQbGF5IHRoZSBwZW5kaW5nIGVudHJpZXMgdGhyb3VnaCBvdXIgcm91dGVyCisJICovCisKKwl3aGlsZSgoc2tiPV9fc2tiX2RlcXVldWUoJnVjLT5tZmNfdW4udW5yZXMudW5yZXNvbHZlZCkpKSB7CisJCWlmIChza2ItPm5oLmlwaC0+dmVyc2lvbiA9PSAwKSB7CisJCQlpbnQgZXJyOworCQkJc3RydWN0IG5sbXNnaGRyICpubGggPSAoc3RydWN0IG5sbXNnaGRyICopc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CisKKwkJCWlmIChpcG1yX2ZpbGxfbXJvdXRlKHNrYiwgYywgTkxNU0dfREFUQShubGgpKSA+IDApIHsKKwkJCQlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtICh1OCopbmxoOworCQkJfSBlbHNlIHsKKwkJCQlubGgtPm5sbXNnX3R5cGUgPSBOTE1TR19FUlJPUjsKKwkJCQlubGgtPm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IG5sbXNnZXJyKSk7CisJCQkJc2tiX3RyaW0oc2tiLCBubGgtPm5sbXNnX2xlbik7CisJCQkJKChzdHJ1Y3Qgbmxtc2dlcnIqKU5MTVNHX0RBVEEobmxoKSktPmVycm9yID0gLUVNU0dTSVpFOworCQkJfQorCQkJZXJyID0gbmV0bGlua191bmljYXN0KHJ0bmwsIHNrYiwgTkVUTElOS19DQihza2IpLmRzdF9waWQsIE1TR19ET05UV0FJVCk7CisJCX0gZWxzZQorCQkJaXBfbXJfZm9yd2FyZChza2IsIGMsIDApOworCX0KK30KKworLyoKKyAqCUJvdW5jZSBhIGNhY2hlIHF1ZXJ5IHVwIHRvIG1yb3V0ZWQuIFdlIGNvdWxkIHVzZSBuZXRsaW5rIGZvciB0aGlzIGJ1dCBtcm91dGVkCisgKglleHBlY3RzIHRoZSBmb2xsb3dpbmcgYml6YXJyZSBzY2hlbWUuCisgKgorICoJQ2FsbGVkIHVuZGVyIG1ydF9sb2NrLgorICovCisgCitzdGF0aWMgaW50IGlwbXJfY2FjaGVfcmVwb3J0KHN0cnVjdCBza19idWZmICpwa3QsIHZpZmlfdCB2aWZpLCBpbnQgYXNzZXJ0KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGlobCA9IHBrdC0+bmguaXBoLT5paGw8PDI7CisJc3RydWN0IGlnbXBoZHIgKmlnbXA7CisJc3RydWN0IGlnbXBtc2cgKm1zZzsKKwlpbnQgcmV0OworCisjaWZkZWYgQ09ORklHX0lQX1BJTVNNCisJaWYgKGFzc2VydCA9PSBJR01QTVNHX1dIT0xFUEtUKQorCQlza2IgPSBza2JfcmVhbGxvY19oZWFkcm9vbShwa3QsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKKwllbHNlCisjZW5kaWYKKwkJc2tiID0gYWxsb2Nfc2tiKDEyOCwgR0ZQX0FUT01JQyk7CisKKwlpZighc2tiKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKyNpZmRlZiBDT05GSUdfSVBfUElNU00KKwlpZiAoYXNzZXJ0ID09IElHTVBNU0dfV0hPTEVQS1QpIHsKKwkJLyogVWdseSwgYnV0IHdlIGhhdmUgbm8gY2hvaWNlIHdpdGggdGhpcyBpbnRlcmZhY2UuCisJCSAgIER1cGxpY2F0ZSBvbGQgaGVhZGVyLCBmaXggaWhsLCBsZW5ndGggZXRjLgorCQkgICBBbmQgYWxsIHRoaXMgb25seSB0byBtYW5nbGUgbXNnLT5pbV9tc2d0eXBlIGFuZAorCQkgICB0byBzZXQgbXNnLT5pbV9tYnogdG8gIm1ieiIgOi0pCisJCSAqLworCQltc2cgPSAoc3RydWN0IGlnbXBtc2cqKXNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCQlza2ItPm5oLnJhdyA9IHNrYi0+aC5yYXcgPSAodTgqKW1zZzsKKwkJbWVtY3B5KG1zZywgcGt0LT5uaC5yYXcsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKKwkJbXNnLT5pbV9tc2d0eXBlID0gSUdNUE1TR19XSE9MRVBLVDsKKwkJbXNnLT5pbV9tYnogPSAwOworIAkJbXNnLT5pbV92aWYgPSByZWdfdmlmX251bTsKKwkJc2tiLT5uaC5pcGgtPmlobCA9IHNpemVvZihzdHJ1Y3QgaXBoZHIpID4+IDI7CisJCXNrYi0+bmguaXBoLT50b3RfbGVuID0gaHRvbnMobnRvaHMocGt0LT5uaC5pcGgtPnRvdF9sZW4pICsgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCX0gZWxzZSAKKyNlbmRpZgorCXsJCisJCQorCS8qCisJICoJQ29weSB0aGUgSVAgaGVhZGVyCisJICovCisKKwlza2ItPm5oLmlwaCA9IChzdHJ1Y3QgaXBoZHIgKilza2JfcHV0KHNrYiwgaWhsKTsKKwltZW1jcHkoc2tiLT5kYXRhLHBrdC0+ZGF0YSxpaGwpOworCXNrYi0+bmguaXBoLT5wcm90b2NvbCA9IDA7CQkJLyogRmxhZyB0byB0aGUga2VybmVsIHRoaXMgaXMgYSByb3V0ZSBhZGQgKi8KKwltc2cgPSAoc3RydWN0IGlnbXBtc2cqKXNrYi0+bmguaXBoOworCW1zZy0+aW1fdmlmID0gdmlmaTsKKwlza2ItPmRzdCA9IGRzdF9jbG9uZShwa3QtPmRzdCk7CisKKwkvKgorCSAqCUFkZCBvdXIgaGVhZGVyCisJICovCisKKwlpZ21wPShzdHJ1Y3QgaWdtcGhkciAqKXNrYl9wdXQoc2tiLHNpemVvZihzdHJ1Y3QgaWdtcGhkcikpOworCWlnbXAtPnR5cGUJPQorCW1zZy0+aW1fbXNndHlwZSA9IGFzc2VydDsKKwlpZ21wLT5jb2RlIAk9CTA7CisJc2tiLT5uaC5pcGgtPnRvdF9sZW49aHRvbnMoc2tiLT5sZW4pOwkJCS8qIEZpeCB0aGUgbGVuZ3RoICovCisJc2tiLT5oLnJhdyA9IHNrYi0+bmgucmF3OworICAgICAgICB9CisKKwlpZiAobXJvdXRlX3NvY2tldCA9PSBOVUxMKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqCURlbGl2ZXIgdG8gbXJvdXRlZAorCSAqLworCWlmICgocmV0PXNvY2tfcXVldWVfcmN2X3NrYihtcm91dGVfc29ja2V0LHNrYikpPDApIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1yb3V0ZTogcGVuZGluZyBxdWV1ZSBmdWxsLCBkcm9wcGluZyBlbnRyaWVzLlxuIik7CisJCWtmcmVlX3NrYihza2IpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKglRdWV1ZSBhIHBhY2tldCBmb3IgcmVzb2x1dGlvbi4gSXQgZ2V0cyBsb2NrZWQgY2FjaGUgZW50cnkhCisgKi8KKyAKK3N0YXRpYyBpbnQKK2lwbXJfY2FjaGVfdW5yZXNvbHZlZCh2aWZpX3QgdmlmaSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBtZmNfY2FjaGUgKmM7CisKKwlzcGluX2xvY2tfYmgoJm1mY191bnJlc19sb2NrKTsKKwlmb3IgKGM9bWZjX3VucmVzX3F1ZXVlOyBjOyBjPWMtPm5leHQpIHsKKwkJaWYgKGMtPm1mY19tY2FzdGdycCA9PSBza2ItPm5oLmlwaC0+ZGFkZHIgJiYKKwkJICAgIGMtPm1mY19vcmlnaW4gPT0gc2tiLT5uaC5pcGgtPnNhZGRyKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGMgPT0gTlVMTCkgeworCQkvKgorCQkgKglDcmVhdGUgYSBuZXcgZW50cnkgaWYgYWxsb3dhYmxlCisJCSAqLworCisJCWlmIChhdG9taWNfcmVhZCgmY2FjaGVfcmVzb2x2ZV9xdWV1ZV9sZW4pPj0xMCB8fAorCQkgICAgKGM9aXBtcl9jYWNoZV9hbGxvY191bnJlcygpKT09TlVMTCkgeworCQkJc3Bpbl91bmxvY2tfYmgoJm1mY191bnJlc19sb2NrKTsKKworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gLUVOT0JVRlM7CisJCX0KKworCQkvKgorCQkgKglGaWxsIGluIHRoZSBuZXcgY2FjaGUgZW50cnkKKwkJICovCisJCWMtPm1mY19wYXJlbnQ9LTE7CisJCWMtPm1mY19vcmlnaW49c2tiLT5uaC5pcGgtPnNhZGRyOworCQljLT5tZmNfbWNhc3RncnA9c2tiLT5uaC5pcGgtPmRhZGRyOworCisJCS8qCisJCSAqCVJlZmxlY3QgZmlyc3QgcXVlcnkgYXQgbXJvdXRlZC4KKwkJICovCisJCWlmICgoZXJyID0gaXBtcl9jYWNoZV9yZXBvcnQoc2tiLCB2aWZpLCBJR01QTVNHX05PQ0FDSEUpKTwwKSB7CisJCQkvKiBJZiB0aGUgcmVwb3J0IGZhaWxlZCB0aHJvdyB0aGUgY2FjaGUgZW50cnkgCisJCQkgICBvdXQgLSBCcmFkIFBhcmtlcgorCQkJICovCisJCQlzcGluX3VubG9ja19iaCgmbWZjX3VucmVzX2xvY2spOworCisJCQlrbWVtX2NhY2hlX2ZyZWUobXJ0X2NhY2hlcCwgYyk7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQlhdG9taWNfaW5jKCZjYWNoZV9yZXNvbHZlX3F1ZXVlX2xlbik7CisJCWMtPm5leHQgPSBtZmNfdW5yZXNfcXVldWU7CisJCW1mY191bnJlc19xdWV1ZSA9IGM7CisKKwkJbW9kX3RpbWVyKCZpcG1yX2V4cGlyZV90aW1lciwgYy0+bWZjX3VuLnVucmVzLmV4cGlyZXMpOworCX0KKworCS8qCisJICoJU2VlIGlmIHdlIGNhbiBhcHBlbmQgdGhlIHBhY2tldAorCSAqLworCWlmIChjLT5tZmNfdW4udW5yZXMudW5yZXNvbHZlZC5xbGVuPjMpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWVyciA9IC1FTk9CVUZTOworCX0gZWxzZSB7CisJCXNrYl9xdWV1ZV90YWlsKCZjLT5tZmNfdW4udW5yZXMudW5yZXNvbHZlZCxza2IpOworCQllcnIgPSAwOworCX0KKworCXNwaW5fdW5sb2NrX2JoKCZtZmNfdW5yZXNfbG9jayk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqCU1GQyBjYWNoZSBtYW5pcHVsYXRpb24gYnkgdXNlciBzcGFjZSBtcm91dGUgZGFlbW9uCisgKi8KKworc3RhdGljIGludCBpcG1yX21mY19kZWxldGUoc3RydWN0IG1mY2N0bCAqbWZjKQoreworCWludCBsaW5lOworCXN0cnVjdCBtZmNfY2FjaGUgKmMsICoqY3A7CisKKwlsaW5lPU1GQ19IQVNIKG1mYy0+bWZjY19tY2FzdGdycC5zX2FkZHIsIG1mYy0+bWZjY19vcmlnaW4uc19hZGRyKTsKKworCWZvciAoY3A9Jm1mY19jYWNoZV9hcnJheVtsaW5lXTsgKGM9KmNwKSAhPSBOVUxMOyBjcCA9ICZjLT5uZXh0KSB7CisJCWlmIChjLT5tZmNfb3JpZ2luID09IG1mYy0+bWZjY19vcmlnaW4uc19hZGRyICYmCisJCSAgICBjLT5tZmNfbWNhc3RncnAgPT0gbWZjLT5tZmNjX21jYXN0Z3JwLnNfYWRkcikgeworCQkJd3JpdGVfbG9ja19iaCgmbXJ0X2xvY2spOworCQkJKmNwID0gYy0+bmV4dDsKKwkJCXdyaXRlX3VubG9ja19iaCgmbXJ0X2xvY2spOworCisJCQlrbWVtX2NhY2hlX2ZyZWUobXJ0X2NhY2hlcCwgYyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVOT0VOVDsKK30KKworc3RhdGljIGludCBpcG1yX21mY19hZGQoc3RydWN0IG1mY2N0bCAqbWZjLCBpbnQgbXJ0c29jaykKK3sKKwlpbnQgbGluZTsKKwlzdHJ1Y3QgbWZjX2NhY2hlICp1YywgKmMsICoqY3A7CisKKwlsaW5lPU1GQ19IQVNIKG1mYy0+bWZjY19tY2FzdGdycC5zX2FkZHIsIG1mYy0+bWZjY19vcmlnaW4uc19hZGRyKTsKKworCWZvciAoY3A9Jm1mY19jYWNoZV9hcnJheVtsaW5lXTsgKGM9KmNwKSAhPSBOVUxMOyBjcCA9ICZjLT5uZXh0KSB7CisJCWlmIChjLT5tZmNfb3JpZ2luID09IG1mYy0+bWZjY19vcmlnaW4uc19hZGRyICYmCisJCSAgICBjLT5tZmNfbWNhc3RncnAgPT0gbWZjLT5tZmNjX21jYXN0Z3JwLnNfYWRkcikKKwkJCWJyZWFrOworCX0KKworCWlmIChjICE9IE5VTEwpIHsKKwkJd3JpdGVfbG9ja19iaCgmbXJ0X2xvY2spOworCQljLT5tZmNfcGFyZW50ID0gbWZjLT5tZmNjX3BhcmVudDsKKwkJaXBtcl91cGRhdGVfdGhyZXNob3VsZHMoYywgbWZjLT5tZmNjX3R0bHMpOworCQlpZiAoIW1ydHNvY2spCisJCQljLT5tZmNfZmxhZ3MgfD0gTUZDX1NUQVRJQzsKKwkJd3JpdGVfdW5sb2NrX2JoKCZtcnRfbG9jayk7CisJCXJldHVybiAwOworCX0KKworCWlmKCFNVUxUSUNBU1QobWZjLT5tZmNjX21jYXN0Z3JwLnNfYWRkcikpCisJCXJldHVybiAtRUlOVkFMOworCisJYz1pcG1yX2NhY2hlX2FsbG9jKCk7CisJaWYgKGM9PU5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJYy0+bWZjX29yaWdpbj1tZmMtPm1mY2Nfb3JpZ2luLnNfYWRkcjsKKwljLT5tZmNfbWNhc3RncnA9bWZjLT5tZmNjX21jYXN0Z3JwLnNfYWRkcjsKKwljLT5tZmNfcGFyZW50PW1mYy0+bWZjY19wYXJlbnQ7CisJaXBtcl91cGRhdGVfdGhyZXNob3VsZHMoYywgbWZjLT5tZmNjX3R0bHMpOworCWlmICghbXJ0c29jaykKKwkJYy0+bWZjX2ZsYWdzIHw9IE1GQ19TVEFUSUM7CisKKwl3cml0ZV9sb2NrX2JoKCZtcnRfbG9jayk7CisJYy0+bmV4dCA9IG1mY19jYWNoZV9hcnJheVtsaW5lXTsKKwltZmNfY2FjaGVfYXJyYXlbbGluZV0gPSBjOworCXdyaXRlX3VubG9ja19iaCgmbXJ0X2xvY2spOworCisJLyoKKwkgKglDaGVjayB0byBzZWUgaWYgd2UgcmVzb2x2ZWQgYSBxdWV1ZWQgbGlzdC4gSWYgc28gd2UKKwkgKgluZWVkIHRvIHNlbmQgb24gdGhlIGZyYW1lcyBhbmQgdGlkeSB1cC4KKwkgKi8KKwlzcGluX2xvY2tfYmgoJm1mY191bnJlc19sb2NrKTsKKwlmb3IgKGNwID0gJm1mY191bnJlc19xdWV1ZTsgKHVjPSpjcCkgIT0gTlVMTDsKKwkgICAgIGNwID0gJnVjLT5uZXh0KSB7CisJCWlmICh1Yy0+bWZjX29yaWdpbiA9PSBjLT5tZmNfb3JpZ2luICYmCisJCSAgICB1Yy0+bWZjX21jYXN0Z3JwID09IGMtPm1mY19tY2FzdGdycCkgeworCQkJKmNwID0gdWMtPm5leHQ7CisJCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmY2FjaGVfcmVzb2x2ZV9xdWV1ZV9sZW4pKQorCQkJCWRlbF90aW1lcigmaXBtcl9leHBpcmVfdGltZXIpOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJm1mY191bnJlc19sb2NrKTsKKworCWlmICh1YykgeworCQlpcG1yX2NhY2hlX3Jlc29sdmUodWMsIGMpOworCQlrbWVtX2NhY2hlX2ZyZWUobXJ0X2NhY2hlcCwgdWMpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCUNsb3NlIHRoZSBtdWx0aWNhc3Qgc29ja2V0LCBhbmQgY2xlYXIgdGhlIHZpZiB0YWJsZXMgZXRjCisgKi8KKyAKK3N0YXRpYyB2b2lkIG1yb3V0ZV9jbGVhbl90YWJsZXMoc3RydWN0IHNvY2sgKnNrKQoreworCWludCBpOworCQkKKwkvKgorCSAqCVNodXQgZG93biBhbGwgYWN0aXZlIHZpZiBlbnRyaWVzCisJICovCisJZm9yKGk9MDsgaTxtYXh2aWY7IGkrKykgeworCQlpZiAoISh2aWZfdGFibGVbaV0uZmxhZ3MmVklGRl9TVEFUSUMpKQorCQkJdmlmX2RlbGV0ZShpKTsKKwl9CisKKwkvKgorCSAqCVdpcGUgdGhlIGNhY2hlCisJICovCisJZm9yIChpPTA7aTxNRkNfTElORVM7aSsrKSB7CisJCXN0cnVjdCBtZmNfY2FjaGUgKmMsICoqY3A7CisKKwkJY3AgPSAmbWZjX2NhY2hlX2FycmF5W2ldOworCQl3aGlsZSAoKGMgPSAqY3ApICE9IE5VTEwpIHsKKwkJCWlmIChjLT5tZmNfZmxhZ3MmTUZDX1NUQVRJQykgeworCQkJCWNwID0gJmMtPm5leHQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQl3cml0ZV9sb2NrX2JoKCZtcnRfbG9jayk7CisJCQkqY3AgPSBjLT5uZXh0OworCQkJd3JpdGVfdW5sb2NrX2JoKCZtcnRfbG9jayk7CisKKwkJCWttZW1fY2FjaGVfZnJlZShtcnRfY2FjaGVwLCBjKTsKKwkJfQorCX0KKworCWlmIChhdG9taWNfcmVhZCgmY2FjaGVfcmVzb2x2ZV9xdWV1ZV9sZW4pICE9IDApIHsKKwkJc3RydWN0IG1mY19jYWNoZSAqYzsKKworCQlzcGluX2xvY2tfYmgoJm1mY191bnJlc19sb2NrKTsKKwkJd2hpbGUgKG1mY191bnJlc19xdWV1ZSAhPSBOVUxMKSB7CisJCQljID0gbWZjX3VucmVzX3F1ZXVlOworCQkJbWZjX3VucmVzX3F1ZXVlID0gYy0+bmV4dDsKKwkJCXNwaW5fdW5sb2NrX2JoKCZtZmNfdW5yZXNfbG9jayk7CisKKwkJCWlwbXJfZGVzdHJveV91bnJlcyhjKTsKKworCQkJc3Bpbl9sb2NrX2JoKCZtZmNfdW5yZXNfbG9jayk7CisJCX0KKwkJc3Bpbl91bmxvY2tfYmgoJm1mY191bnJlc19sb2NrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1ydHNvY2tfZGVzdHJ1Y3Qoc3RydWN0IHNvY2sgKnNrKQoreworCXJ0bmxfbG9jaygpOworCWlmIChzayA9PSBtcm91dGVfc29ja2V0KSB7CisJCWlwdjRfZGV2Y29uZi5tY19mb3J3YXJkaW5nLS07CisKKwkJd3JpdGVfbG9ja19iaCgmbXJ0X2xvY2spOworCQltcm91dGVfc29ja2V0PU5VTEw7CisJCXdyaXRlX3VubG9ja19iaCgmbXJ0X2xvY2spOworCisJCW1yb3V0ZV9jbGVhbl90YWJsZXMoc2spOworCX0KKwlydG5sX3VubG9jaygpOworfQorCisvKgorICoJU29ja2V0IG9wdGlvbnMgYW5kIHZpcnR1YWwgaW50ZXJmYWNlIG1hbmlwdWxhdGlvbi4gVGhlIHdob2xlCisgKgl2aXJ0dWFsIGludGVyZmFjZSBzeXN0ZW0gaXMgYSBjb21wbGV0ZSBoZWFwLCBidXQgdW5mb3J0dW5hdGVseQorICoJdGhhdCdzIGhvdyBCU0QgbXJvdXRlZCBoYXBwZW5zIHRvIHRoaW5rLiBNYXliZSBvbmUgZGF5IHdpdGggYSBwcm9wZXIKKyAqCU1PU1BGL1BJTSByb3V0ZXIgc2V0IHVwIHdlIGNhbiBjbGVhbiB0aGlzIHVwLgorICovCisgCitpbnQgaXBfbXJvdXRlX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLGludCBvcHRuYW1lLGNoYXIgX191c2VyICpvcHR2YWwsaW50IG9wdGxlbikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCB2aWZjdGwgdmlmOworCXN0cnVjdCBtZmNjdGwgbWZjOworCQorCWlmKG9wdG5hbWUhPU1SVF9JTklUKQorCXsKKwkJaWYoc2shPW1yb3V0ZV9zb2NrZXQgJiYgIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwlzd2l0Y2gob3B0bmFtZSkKKwl7CisJCWNhc2UgTVJUX0lOSVQ6CisJCQlpZiAoc2stPnNrX3R5cGUgIT0gU09DS19SQVcgfHwKKwkJCSAgICBpbmV0X3NrKHNrKS0+bnVtICE9IElQUFJPVE9fSUdNUCkKKwkJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCQlpZihvcHRsZW4hPXNpemVvZihpbnQpKQorCQkJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisKKwkJCXJ0bmxfbG9jaygpOworCQkJaWYgKG1yb3V0ZV9zb2NrZXQpIHsKKwkJCQlydG5sX3VubG9jaygpOworCQkJCXJldHVybiAtRUFERFJJTlVTRTsKKwkJCX0KKworCQkJcmV0ID0gaXBfcmFfY29udHJvbChzaywgMSwgbXJ0c29ja19kZXN0cnVjdCk7CisJCQlpZiAocmV0ID09IDApIHsKKwkJCQl3cml0ZV9sb2NrX2JoKCZtcnRfbG9jayk7CisJCQkJbXJvdXRlX3NvY2tldD1zazsKKwkJCQl3cml0ZV91bmxvY2tfYmgoJm1ydF9sb2NrKTsKKworCQkJCWlwdjRfZGV2Y29uZi5tY19mb3J3YXJkaW5nKys7CisJCQl9CisJCQlydG5sX3VubG9jaygpOworCQkJcmV0dXJuIHJldDsKKwkJY2FzZSBNUlRfRE9ORToKKwkJCWlmIChzayE9bXJvdXRlX3NvY2tldCkKKwkJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJCXJldHVybiBpcF9yYV9jb250cm9sKHNrLCAwLCBOVUxMKTsKKwkJY2FzZSBNUlRfQUREX1ZJRjoKKwkJY2FzZSBNUlRfREVMX1ZJRjoKKwkJCWlmKG9wdGxlbiE9c2l6ZW9mKHZpZikpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnZpZixvcHR2YWwsc2l6ZW9mKHZpZikpKQorCQkJCXJldHVybiAtRUZBVUxUOyAKKwkJCWlmKHZpZi52aWZjX3ZpZmkgPj0gTUFYVklGUykKKwkJCQlyZXR1cm4gLUVORklMRTsKKwkJCXJ0bmxfbG9jaygpOworCQkJaWYgKG9wdG5hbWU9PU1SVF9BRERfVklGKSB7CisJCQkJcmV0ID0gdmlmX2FkZCgmdmlmLCBzaz09bXJvdXRlX3NvY2tldCk7CisJCQl9IGVsc2UgeworCQkJCXJldCA9IHZpZl9kZWxldGUodmlmLnZpZmNfdmlmaSk7CisJCQl9CisJCQlydG5sX3VubG9jaygpOworCQkJcmV0dXJuIHJldDsKKworCQkvKgorCQkgKglNYW5pcHVsYXRlIHRoZSBmb3J3YXJkaW5nIGNhY2hlcy4gVGhlc2UgbGl2ZQorCQkgKglpbiBhIHNvcnQgb2Yga2VybmVsL3VzZXIgc3ltYmlvc2lzLgorCQkgKi8KKwkJY2FzZSBNUlRfQUREX01GQzoKKwkJY2FzZSBNUlRfREVMX01GQzoKKwkJCWlmKG9wdGxlbiE9c2l6ZW9mKG1mYykpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJm1mYyxvcHR2YWwsIHNpemVvZihtZmMpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJ0bmxfbG9jaygpOworCQkJaWYgKG9wdG5hbWU9PU1SVF9ERUxfTUZDKQorCQkJCXJldCA9IGlwbXJfbWZjX2RlbGV0ZSgmbWZjKTsKKwkJCWVsc2UKKwkJCQlyZXQgPSBpcG1yX21mY19hZGQoJm1mYywgc2s9PW1yb3V0ZV9zb2NrZXQpOworCQkJcnRubF91bmxvY2soKTsKKwkJCXJldHVybiByZXQ7CisJCS8qCisJCSAqCUNvbnRyb2wgUElNIGFzc2VydC4KKwkJICovCisJCWNhc2UgTVJUX0FTU0VSVDoKKwkJeworCQkJaW50IHY7CisJCQlpZihnZXRfdXNlcih2LChpbnQgX191c2VyICopb3B0dmFsKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCW1yb3V0ZV9kb19hc3NlcnQ9KHYpPzE6MDsKKwkJCXJldHVybiAwOworCQl9CisjaWZkZWYgQ09ORklHX0lQX1BJTVNNCisJCWNhc2UgTVJUX1BJTToKKwkJeworCQkJaW50IHYsIHJldDsKKwkJCWlmKGdldF91c2VyKHYsKGludCBfX3VzZXIgKilvcHR2YWwpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJdiA9ICh2KT8xOjA7CisJCQlydG5sX2xvY2soKTsKKwkJCXJldCA9IDA7CisJCQlpZiAodiAhPSBtcm91dGVfZG9fcGltKSB7CisJCQkJbXJvdXRlX2RvX3BpbSA9IHY7CisJCQkJbXJvdXRlX2RvX2Fzc2VydCA9IHY7CisjaWZkZWYgQ09ORklHX0lQX1BJTVNNX1YyCisJCQkJaWYgKG1yb3V0ZV9kb19waW0pCisJCQkJCXJldCA9IGluZXRfYWRkX3Byb3RvY29sKCZwaW1fcHJvdG9jb2wsCisJCQkJCQkJCUlQUFJPVE9fUElNKTsKKwkJCQllbHNlCisJCQkJCXJldCA9IGluZXRfZGVsX3Byb3RvY29sKCZwaW1fcHJvdG9jb2wsCisJCQkJCQkJCUlQUFJPVE9fUElNKTsKKwkJCQlpZiAocmV0IDwgMCkKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKyNlbmRpZgorCQkJfQorCQkJcnRubF91bmxvY2soKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKyNlbmRpZgorCQkvKgorCQkgKglTcHVyaW91cyBjb21tYW5kLCBvciBNUlRfVkVSU0lPTiB3aGljaCB5b3UgY2Fubm90CisJCSAqCXNldC4KKwkJICovCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCX0KK30KKworLyoKKyAqCUdldHNvY2sgb3B0IHN1cHBvcnQgZm9yIHRoZSBtdWx0aWNhc3Qgcm91dGluZyBzeXN0ZW0uCisgKi8KKyAKK2ludCBpcF9tcm91dGVfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssaW50IG9wdG5hbWUsY2hhciBfX3VzZXIgKm9wdHZhbCxpbnQgX191c2VyICpvcHRsZW4pCit7CisJaW50IG9scjsKKwlpbnQgdmFsOworCisJaWYob3B0bmFtZSE9TVJUX1ZFUlNJT04gJiYgCisjaWZkZWYgQ09ORklHX0lQX1BJTVNNCisJICAgb3B0bmFtZSE9TVJUX1BJTSAmJgorI2VuZGlmCisJICAgb3B0bmFtZSE9TVJUX0FTU0VSVCkKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKworCWlmIChnZXRfdXNlcihvbHIsIG9wdGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJb2xyID0gbWluX3QodW5zaWduZWQgaW50LCBvbHIsIHNpemVvZihpbnQpKTsKKwlpZiAob2xyIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJCQorCWlmKHB1dF91c2VyKG9scixvcHRsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZihvcHRuYW1lPT1NUlRfVkVSU0lPTikKKwkJdmFsPTB4MDMwNTsKKyNpZmRlZiBDT05GSUdfSVBfUElNU00KKwllbHNlIGlmKG9wdG5hbWU9PU1SVF9QSU0pCisJCXZhbD1tcm91dGVfZG9fcGltOworI2VuZGlmCisJZWxzZQorCQl2YWw9bXJvdXRlX2RvX2Fzc2VydDsKKwlpZihjb3B5X3RvX3VzZXIob3B0dmFsLCZ2YWwsb2xyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglUaGUgSVAgbXVsdGljYXN0IGlvY3RsIHN1cHBvcnQgcm91dGluZXMuCisgKi8KKyAKK2ludCBpcG1yX2lvY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3Qgc2lvY19zZ19yZXEgc3I7CisJc3RydWN0IHNpb2NfdmlmX3JlcSB2cjsKKwlzdHJ1Y3QgdmlmX2RldmljZSAqdmlmOworCXN0cnVjdCBtZmNfY2FjaGUgKmM7CisJCisJc3dpdGNoKGNtZCkKKwl7CisJCWNhc2UgU0lPQ0dFVFZJRkNOVDoKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmdnIsYXJnLHNpemVvZih2cikpKQorCQkJCXJldHVybiAtRUZBVUxUOyAKKwkJCWlmKHZyLnZpZmk+PW1heHZpZikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJlYWRfbG9jaygmbXJ0X2xvY2spOworCQkJdmlmPSZ2aWZfdGFibGVbdnIudmlmaV07CisJCQlpZihWSUZfRVhJU1RTKHZyLnZpZmkpKQl7CisJCQkJdnIuaWNvdW50PXZpZi0+cGt0X2luOworCQkJCXZyLm9jb3VudD12aWYtPnBrdF9vdXQ7CisJCQkJdnIuaWJ5dGVzPXZpZi0+Ynl0ZXNfaW47CisJCQkJdnIub2J5dGVzPXZpZi0+Ynl0ZXNfb3V0OworCQkJCXJlYWRfdW5sb2NrKCZtcnRfbG9jayk7CisKKwkJCQlpZiAoY29weV90b191c2VyKGFyZywmdnIsc2l6ZW9mKHZyKSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXJldHVybiAwOworCQkJfQorCQkJcmVhZF91bmxvY2soJm1ydF9sb2NrKTsKKwkJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKKwkJY2FzZSBTSU9DR0VUU0dDTlQ6CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnNyLGFyZyxzaXplb2Yoc3IpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmVhZF9sb2NrKCZtcnRfbG9jayk7CisJCQljID0gaXBtcl9jYWNoZV9maW5kKHNyLnNyYy5zX2FkZHIsIHNyLmdycC5zX2FkZHIpOworCQkJaWYgKGMpIHsKKwkJCQlzci5wa3RjbnQgPSBjLT5tZmNfdW4ucmVzLnBrdDsKKwkJCQlzci5ieXRlY250ID0gYy0+bWZjX3VuLnJlcy5ieXRlczsKKwkJCQlzci53cm9uZ19pZiA9IGMtPm1mY191bi5yZXMud3JvbmdfaWY7CisJCQkJcmVhZF91bmxvY2soJm1ydF9sb2NrKTsKKworCQkJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCZzcixzaXplb2Yoc3IpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlyZWFkX3VubG9jaygmbXJ0X2xvY2spOworCQkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9Cit9CisKKworc3RhdGljIGludCBpcG1yX2RldmljZV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgdmlmX2RldmljZSAqdjsKKwlpbnQgY3Q7CisJaWYgKGV2ZW50ICE9IE5FVERFVl9VTlJFR0lTVEVSKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisJdj0mdmlmX3RhYmxlWzBdOworCWZvcihjdD0wO2N0PG1heHZpZjtjdCsrLHYrKykgeworCQlpZiAodi0+ZGV2PT1wdHIpCisJCQl2aWZfZGVsZXRlKGN0KTsKKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaXBfbXJfbm90aWZpZXI9eworCS5ub3RpZmllcl9jYWxsID0gaXBtcl9kZXZpY2VfZXZlbnQsCit9OworCisvKgorICogCUVuY2Fwc3VsYXRlIGEgcGFja2V0IGJ5IGF0dGFjaGluZyBhIHZhbGlkIElQSVAgaGVhZGVyIHRvIGl0LgorICoJVGhpcyBhdm9pZHMgdHVubmVsIGRyaXZlcnMgYW5kIG90aGVyIG1lc3MgYW5kIGdpdmVzIHVzIHRoZSBzcGVlZCBzbworICoJaW1wb3J0YW50IGZvciBtdWx0aWNhc3QgdmlkZW8uCisgKi8KKyAKK3N0YXRpYyB2b2lkIGlwX2VuY2FwKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBzYWRkciwgdTMyIGRhZGRyKQoreworCXN0cnVjdCBpcGhkciAqaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYl9wdXNoKHNrYixzaXplb2Yoc3RydWN0IGlwaGRyKSk7CisKKwlpcGgtPnZlcnNpb24JPSAJNDsKKwlpcGgtPnRvcwk9CXNrYi0+bmguaXBoLT50b3M7CisJaXBoLT50dGwJPQlza2ItPm5oLmlwaC0+dHRsOworCWlwaC0+ZnJhZ19vZmYJPQkwOworCWlwaC0+ZGFkZHIJPQlkYWRkcjsKKwlpcGgtPnNhZGRyCT0Jc2FkZHI7CisJaXBoLT5wcm90b2NvbAk9CUlQUFJPVE9fSVBJUDsKKwlpcGgtPmlobAk9CTU7CisJaXBoLT50b3RfbGVuCT0JaHRvbnMoc2tiLT5sZW4pOworCWlwX3NlbGVjdF9pZGVudChpcGgsIHNrYi0+ZHN0LCBOVUxMKTsKKwlpcF9zZW5kX2NoZWNrKGlwaCk7CisKKwlza2ItPmguaXBpcGggPSBza2ItPm5oLmlwaDsKKwlza2ItPm5oLmlwaCA9IGlwaDsKKwltZW1zZXQoJihJUENCKHNrYiktPm9wdCksIDAsIHNpemVvZihJUENCKHNrYiktPm9wdCkpOworCW5mX3Jlc2V0KHNrYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlwbXJfZm9yd2FyZF9maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXBfb3B0aW9ucyAqIG9wdAk9ICYoSVBDQihza2IpLT5vcHQpOworCisJSVBfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX09VVEZPUldEQVRBR1JBTVMpOworCisJaWYgKHVubGlrZWx5KG9wdC0+b3B0bGVuKSkKKwkJaXBfZm9yd2FyZF9vcHRpb25zKHNrYik7CisKKwlyZXR1cm4gZHN0X291dHB1dChza2IpOworfQorCisvKgorICoJUHJvY2Vzc2luZyBoYW5kbGVycyBmb3IgaXBtcl9mb3J3YXJkCisgKi8KKworc3RhdGljIHZvaWQgaXBtcl9xdWV1ZV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBtZmNfY2FjaGUgKmMsIGludCB2aWZpKQoreworCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisJc3RydWN0IHZpZl9kZXZpY2UgKnZpZiA9ICZ2aWZfdGFibGVbdmlmaV07CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcnRhYmxlICpydDsKKwlpbnQgICAgZW5jYXAgPSAwOworCisJaWYgKHZpZi0+ZGV2ID09IE5VTEwpCisJCWdvdG8gb3V0X2ZyZWU7CisKKyNpZmRlZiBDT05GSUdfSVBfUElNU00KKwlpZiAodmlmLT5mbGFncyAmIFZJRkZfUkVHSVNURVIpIHsKKwkJdmlmLT5wa3Rfb3V0Kys7CisJCXZpZi0+Ynl0ZXNfb3V0Kz1za2ItPmxlbjsKKwkJKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyopdmlmLT5kZXYtPnByaXYpLT50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyopdmlmLT5kZXYtPnByaXYpLT50eF9wYWNrZXRzKys7CisJCWlwbXJfY2FjaGVfcmVwb3J0KHNrYiwgdmlmaSwgSUdNUE1TR19XSE9MRVBLVCk7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorI2VuZGlmCisKKwlpZiAodmlmLT5mbGFncyZWSUZGX1RVTk5FTCkgeworCQlzdHJ1Y3QgZmxvd2kgZmwgPSB7IC5vaWYgPSB2aWYtPmxpbmssCisJCQkJICAgIC5ubF91ID0geyAuaXA0X3UgPQorCQkJCQkgICAgICB7IC5kYWRkciA9IHZpZi0+cmVtb3RlLAorCQkJCQkJLnNhZGRyID0gdmlmLT5sb2NhbCwKKwkJCQkJCS50b3MgPSBSVF9UT1MoaXBoLT50b3MpIH0gfSwKKwkJCQkgICAgLnByb3RvID0gSVBQUk9UT19JUElQIH07CisJCWlmIChpcF9yb3V0ZV9vdXRwdXRfa2V5KCZydCwgJmZsKSkKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCWVuY2FwID0gc2l6ZW9mKHN0cnVjdCBpcGhkcik7CisJfSBlbHNlIHsKKwkJc3RydWN0IGZsb3dpIGZsID0geyAub2lmID0gdmlmLT5saW5rLAorCQkJCSAgICAubmxfdSA9IHsgLmlwNF91ID0KKwkJCQkJICAgICAgeyAuZGFkZHIgPSBpcGgtPmRhZGRyLAorCQkJCQkJLnRvcyA9IFJUX1RPUyhpcGgtPnRvcykgfSB9LAorCQkJCSAgICAucHJvdG8gPSBJUFBST1RPX0lQSVAgfTsKKwkJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpKQorCQkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlkZXYgPSBydC0+dS5kc3QuZGV2OworCisJaWYgKHNrYi0+bGVuK2VuY2FwID4gZHN0X210dSgmcnQtPnUuZHN0KSAmJiAobnRvaHMoaXBoLT5mcmFnX29mZikgJiBJUF9ERikpIHsKKwkJLyogRG8gbm90IGZyYWdtZW50IG11bHRpY2FzdHMuIEFsYXMsIElQdjQgZG9lcyBub3QKKwkJICAgYWxsb3cgdG8gc2VuZCBJQ01QLCBzbyB0aGF0IHBhY2tldHMgd2lsbCBkaXNhcHBlYXIKKwkJICAgdG8gYmxhY2tob2xlLgorCQkgKi8KKworCQlJUF9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfRlJBR0ZBSUxTKTsKKwkJaXBfcnRfcHV0KHJ0KTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwllbmNhcCArPSBMTF9SRVNFUlZFRF9TUEFDRShkZXYpICsgcnQtPnUuZHN0LmhlYWRlcl9sZW47CisKKwlpZiAoc2tiX2Nvdyhza2IsIGVuY2FwKSkgeworIAkJaXBfcnRfcHV0KHJ0KTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwl2aWYtPnBrdF9vdXQrKzsKKwl2aWYtPmJ5dGVzX291dCs9c2tiLT5sZW47CisKKwlkc3RfcmVsZWFzZShza2ItPmRzdCk7CisJc2tiLT5kc3QgPSAmcnQtPnUuZHN0OworCWlwaCA9IHNrYi0+bmguaXBoOworCWlwX2RlY3JlYXNlX3R0bChpcGgpOworCisJLyogRklYTUU6IGZvcndhcmQgYW5kIG91dHB1dCBmaXJld2FsbHMgdXNlZCB0byBiZSBjYWxsZWQgaGVyZS4KKwkgKiBXaGF0IGRvIHdlIGRvIHdpdGggbmV0ZmlsdGVyPyAtLSBSUiAqLworCWlmICh2aWYtPmZsYWdzICYgVklGRl9UVU5ORUwpIHsKKwkJaXBfZW5jYXAoc2tiLCB2aWYtPmxvY2FsLCB2aWYtPnJlbW90ZSk7CisJCS8qIEZJWE1FOiBleHRyYSBvdXRwdXQgZmlyZXdhbGwgc3RlcCB1c2VkIHRvIGJlIGhlcmUuIC0tUlIgKi8KKwkJKChzdHJ1Y3QgaXBfdHVubmVsICopdmlmLT5kZXYtPnByaXYpLT5zdGF0LnR4X3BhY2tldHMrKzsKKwkJKChzdHJ1Y3QgaXBfdHVubmVsICopdmlmLT5kZXYtPnByaXYpLT5zdGF0LnR4X2J5dGVzKz1za2ItPmxlbjsKKwl9CisKKwlJUENCKHNrYiktPmZsYWdzIHw9IElQU0tCX0ZPUldBUkRFRDsKKworCS8qCisJICogUkZDMTU4NCB0ZWFjaGVzLCB0aGF0IERWTVJQL1BJTSByb3V0ZXIgbXVzdCBkZWxpdmVyIHBhY2tldHMgbG9jYWxseQorCSAqIG5vdCBvbmx5IGJlZm9yZSBmb3J3YXJkaW5nLCBidXQgYWZ0ZXIgZm9yd2FyZGluZyBvbiBhbGwgb3V0cHV0CisJICogaW50ZXJmYWNlcy4gSXQgaXMgY2xlYXIsIGlmIG1yb3V0ZXIgcnVucyBhIG11bHRpY2FzdGluZworCSAqIHByb2dyYW0sIGl0IHNob3VsZCByZWNlaXZlIHBhY2tldHMgbm90IGRlcGVuZGluZyB0byB3aGF0IGludGVyZmFjZQorCSAqIHByb2dyYW0gaXMgam9pbmVkLgorCSAqIElmIHdlIHdpbGwgbm90IG1ha2UgaXQsIHRoZSBwcm9ncmFtIHdpbGwgaGF2ZSB0byBqb2luIG9uIGFsbAorCSAqIGludGVyZmFjZXMuIE9uIHRoZSBvdGhlciBoYW5kLCBtdWx0aWhvbWluZyBob3N0IChvciByb3V0ZXIsIGJ1dAorCSAqIG5vdCBtcm91dGVyKSBjYW5ub3Qgam9pbiB0byBtb3JlIHRoYW4gb25lIGludGVyZmFjZSAtIGl0IHdpbGwKKwkgKiByZXN1bHQgaW4gcmVjZWl2aW5nIG11bHRpcGxlIHBhY2tldHMuCisJICovCisJTkZfSE9PSyhQRl9JTkVULCBORl9JUF9GT1JXQVJELCBza2IsIHNrYi0+ZGV2LCBkZXYsIAorCQlpcG1yX2ZvcndhcmRfZmluaXNoKTsKKwlyZXR1cm47CisKK291dF9mcmVlOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybjsKK30KKworc3RhdGljIGludCBpcG1yX2ZpbmRfdmlmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGN0OworCWZvciAoY3Q9bWF4dmlmLTE7IGN0Pj0wOyBjdC0tKSB7CisJCWlmICh2aWZfdGFibGVbY3RdLmRldiA9PSBkZXYpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGN0OworfQorCisvKiAibG9jYWwiIG1lYW5zIHRoYXQgd2Ugc2hvdWxkIHByZXNlcnZlIG9uZSBza2IgKGZvciBsb2NhbCBkZWxpdmVyeSkgKi8KKworc3RhdGljIGludCBpcF9tcl9mb3J3YXJkKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBtZmNfY2FjaGUgKmNhY2hlLCBpbnQgbG9jYWwpCit7CisJaW50IHBzZW5kID0gLTE7CisJaW50IHZpZiwgY3Q7CisKKwl2aWYgPSBjYWNoZS0+bWZjX3BhcmVudDsKKwljYWNoZS0+bWZjX3VuLnJlcy5wa3QrKzsKKwljYWNoZS0+bWZjX3VuLnJlcy5ieXRlcyArPSBza2ItPmxlbjsKKworCS8qCisJICogV3JvbmcgaW50ZXJmYWNlOiBkcm9wIHBhY2tldCBhbmQgKG1heWJlKSBzZW5kIFBJTSBhc3NlcnQuCisJICovCisJaWYgKHZpZl90YWJsZVt2aWZdLmRldiAhPSBza2ItPmRldikgeworCQlpbnQgdHJ1ZV92aWZpOworCisJCWlmICgoKHN0cnVjdCBydGFibGUqKXNrYi0+ZHN0KS0+ZmwuaWlmID09IDApIHsKKwkJCS8qIEl0IGlzIG91ciBvd24gcGFja2V0LCBsb29wZWQgYmFjay4KKwkJCSAgIFZlcnkgY29tcGxpY2F0ZWQgc2l0dWF0aW9uLi4uCisKKwkJCSAgIFRoZSBiZXN0IHdvcmthcm91bmQgdW50aWwgcm91dGluZyBkYWVtb25zIHdpbGwgYmUKKwkJCSAgIGZpeGVkIGlzIG5vdCB0byByZWRpc3RyaWJ1dGUgcGFja2V0LCBpZiBpdCB3YXMKKwkJCSAgIHNlbmQgdGhyb3VnaCB3cm9uZyBpbnRlcmZhY2UuIEl0IG1lYW5zLCB0aGF0CisJCQkgICBtdWx0aWNhc3QgYXBwbGljYXRpb25zIFdJTEwgTk9UIHdvcmsgZm9yCisJCQkgICAoUyxHKSwgd2hpY2ggaGF2ZSBkZWZhdWx0IG11bHRpY2FzdCByb3V0ZSBwb2ludGluZworCQkJICAgdG8gd3Jvbmcgb2lmLiBJbiBhbnkgY2FzZSwgaXQgaXMgbm90IGEgZ29vZAorCQkJICAgaWRlYSB0byB1c2UgbXVsdGljYXN0aW5nIGFwcGxpY2F0aW9ucyBvbiByb3V0ZXIuCisJCQkgKi8KKwkJCWdvdG8gZG9udF9mb3J3YXJkOworCQl9CisKKwkJY2FjaGUtPm1mY191bi5yZXMud3JvbmdfaWYrKzsKKwkJdHJ1ZV92aWZpID0gaXBtcl9maW5kX3ZpZihza2ItPmRldik7CisKKwkJaWYgKHRydWVfdmlmaSA+PSAwICYmIG1yb3V0ZV9kb19hc3NlcnQgJiYKKwkJICAgIC8qIHBpbXNtIHVzZXMgYXNzZXJ0cywgd2hlbiBzd2l0Y2hpbmcgZnJvbSBSUFQgdG8gU1BULAorCQkgICAgICAgc28gdGhhdCB3ZSBjYW5ub3QgY2hlY2sgdGhhdCBwYWNrZXQgYXJyaXZlZCBvbiBhbiBvaWYuCisJCSAgICAgICBJdCBpcyBiYWQsIGJ1dCBvdGhlcndpc2Ugd2Ugd291bGQgbmVlZCB0byBtb3ZlIHByZXR0eQorCQkgICAgICAgbGFyZ2UgY2h1bmsgb2YgcGltZCB0byBrZXJuZWwuIE91Z2guLi4gLS1BTksKKwkJICAgICAqLworCQkgICAgKG1yb3V0ZV9kb19waW0gfHwgY2FjaGUtPm1mY191bi5yZXMudHRsc1t0cnVlX3ZpZmldIDwgMjU1KSAmJgorCQkgICAgdGltZV9hZnRlcihqaWZmaWVzLCAKKwkJCSAgICAgICBjYWNoZS0+bWZjX3VuLnJlcy5sYXN0X2Fzc2VydCArIE1GQ19BU1NFUlRfVEhSRVNIKSkgeworCQkJY2FjaGUtPm1mY191bi5yZXMubGFzdF9hc3NlcnQgPSBqaWZmaWVzOworCQkJaXBtcl9jYWNoZV9yZXBvcnQoc2tiLCB0cnVlX3ZpZmksIElHTVBNU0dfV1JPTkdWSUYpOworCQl9CisJCWdvdG8gZG9udF9mb3J3YXJkOworCX0KKworCXZpZl90YWJsZVt2aWZdLnBrdF9pbisrOworCXZpZl90YWJsZVt2aWZdLmJ5dGVzX2luKz1za2ItPmxlbjsKKworCS8qCisJICoJRm9yd2FyZCB0aGUgZnJhbWUKKwkgKi8KKwlmb3IgKGN0ID0gY2FjaGUtPm1mY191bi5yZXMubWF4dmlmLTE7IGN0ID49IGNhY2hlLT5tZmNfdW4ucmVzLm1pbnZpZjsgY3QtLSkgeworCQlpZiAoc2tiLT5uaC5pcGgtPnR0bCA+IGNhY2hlLT5tZmNfdW4ucmVzLnR0bHNbY3RdKSB7CisJCQlpZiAocHNlbmQgIT0gLTEpIHsKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCQkJCWlmIChza2IyKQorCQkJCQlpcG1yX3F1ZXVlX3htaXQoc2tiMiwgY2FjaGUsIHBzZW5kKTsKKwkJCX0KKwkJCXBzZW5kPWN0OworCQl9CisJfQorCWlmIChwc2VuZCAhPSAtMSkgeworCQlpZiAobG9jYWwpIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IyID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJCQlpZiAoc2tiMikKKwkJCQlpcG1yX3F1ZXVlX3htaXQoc2tiMiwgY2FjaGUsIHBzZW5kKTsKKwkJfSBlbHNlIHsKKwkJCWlwbXJfcXVldWVfeG1pdChza2IsIGNhY2hlLCBwc2VuZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworZG9udF9mb3J3YXJkOgorCWlmICghbG9jYWwpCisJCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCisKKy8qCisgKglNdWx0aWNhc3QgcGFja2V0cyBmb3IgZm9yd2FyZGluZyBhcnJpdmUgaGVyZQorICovCisKK2ludCBpcF9tcl9pbnB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBtZmNfY2FjaGUgKmNhY2hlOworCWludCBsb2NhbCA9ICgoc3RydWN0IHJ0YWJsZSopc2tiLT5kc3QpLT5ydF9mbGFncyZSVENGX0xPQ0FMOworCisJLyogUGFja2V0IGlzIGxvb3BlZCBiYWNrIGFmdGVyIGZvcndhcmQsIGl0IHNob3VsZCBub3QgYmUKKwkgICBmb3J3YXJkZWQgc2Vjb25kIHRpbWUsIGJ1dCBzdGlsbCBjYW4gYmUgZGVsaXZlcmVkIGxvY2FsbHkuCisJICovCisJaWYgKElQQ0Ioc2tiKS0+ZmxhZ3MmSVBTS0JfRk9SV0FSREVEKQorCQlnb3RvIGRvbnRfZm9yd2FyZDsKKworCWlmICghbG9jYWwpIHsKKwkJICAgIGlmIChJUENCKHNrYiktPm9wdC5yb3V0ZXJfYWxlcnQpIHsKKwkJCSAgICBpZiAoaXBfY2FsbF9yYV9jaGFpbihza2IpKQorCQkJCSAgICByZXR1cm4gMDsKKwkJICAgIH0gZWxzZSBpZiAoc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fSUdNUCl7CisJCQkgICAgLyogSUdNUHYxIChhbmQgYnJva2VuIElHTVB2MiBpbXBsZW1lbnRhdGlvbnMgc29ydCBvZgorCQkJICAgICAgIENpc2NvIElPUyA8PSAxMS4yKDgpKSBkbyBub3QgcHV0IHJvdXRlciBhbGVydAorCQkJICAgICAgIG9wdGlvbiB0byBJR01QIHBhY2tldHMgZGVzdGluZWQgdG8gcm91dGFibGUKKwkJCSAgICAgICBncm91cHMuIEl0IGlzIHZlcnkgYmFkLCBiZWNhdXNlIGl0IG1lYW5zCisJCQkgICAgICAgdGhhdCB3ZSBjYW4gZm9yd2FyZCBOTyBJR01QIG1lc3NhZ2VzLgorCQkJICAgICAqLworCQkJICAgIHJlYWRfbG9jaygmbXJ0X2xvY2spOworCQkJICAgIGlmIChtcm91dGVfc29ja2V0KSB7CisJCQkJICAgIHJhd19yY3YobXJvdXRlX3NvY2tldCwgc2tiKTsKKwkJCQkgICAgcmVhZF91bmxvY2soJm1ydF9sb2NrKTsKKwkJCQkgICAgcmV0dXJuIDA7CisJCQkgICAgfQorCQkJICAgIHJlYWRfdW5sb2NrKCZtcnRfbG9jayk7CisJCSAgICB9CisJfQorCisJcmVhZF9sb2NrKCZtcnRfbG9jayk7CisJY2FjaGUgPSBpcG1yX2NhY2hlX2ZpbmQoc2tiLT5uaC5pcGgtPnNhZGRyLCBza2ItPm5oLmlwaC0+ZGFkZHIpOworCisJLyoKKwkgKglObyB1c2FibGUgY2FjaGUgZW50cnkKKwkgKi8KKwlpZiAoY2FjaGU9PU5VTEwpIHsKKwkJaW50IHZpZjsKKworCQlpZiAobG9jYWwpIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IyID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJCQlpcF9sb2NhbF9kZWxpdmVyKHNrYik7CisJCQlpZiAoc2tiMiA9PSBOVUxMKSB7CisJCQkJcmVhZF91bmxvY2soJm1ydF9sb2NrKTsKKwkJCQlyZXR1cm4gLUVOT0JVRlM7CisJCQl9CisJCQlza2IgPSBza2IyOworCQl9CisKKwkJdmlmID0gaXBtcl9maW5kX3ZpZihza2ItPmRldik7CisJCWlmICh2aWYgPj0gMCkgeworCQkJaW50IGVyciA9IGlwbXJfY2FjaGVfdW5yZXNvbHZlZCh2aWYsIHNrYik7CisJCQlyZWFkX3VubG9jaygmbXJ0X2xvY2spOworCisJCQlyZXR1cm4gZXJyOworCQl9CisJCXJlYWRfdW5sb2NrKCZtcnRfbG9jayk7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpcF9tcl9mb3J3YXJkKHNrYiwgY2FjaGUsIGxvY2FsKTsKKworCXJlYWRfdW5sb2NrKCZtcnRfbG9jayk7CisKKwlpZiAobG9jYWwpCisJCXJldHVybiBpcF9sb2NhbF9kZWxpdmVyKHNrYik7CisKKwlyZXR1cm4gMDsKKworZG9udF9mb3J3YXJkOgorCWlmIChsb2NhbCkKKwkJcmV0dXJuIGlwX2xvY2FsX2RlbGl2ZXIoc2tiKTsKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19JUF9QSU1TTV9WMQorLyoKKyAqIEhhbmRsZSBJR01QIG1lc3NhZ2VzIG9mIFBJTXYxCisgKi8KKworaW50IHBpbV9yY3ZfdjEoc3RydWN0IHNrX2J1ZmYgKiBza2IpCit7CisJc3RydWN0IGlnbXBoZHIgKnBpbTsKKwlzdHJ1Y3QgaXBoZHIgICAqZW5jYXA7CisJc3RydWN0IG5ldF9kZXZpY2UgICpyZWdfZGV2ID0gTlVMTDsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZigqcGltKSArIHNpemVvZigqZW5jYXApKSkgCisJCWdvdG8gZHJvcDsKKworCXBpbSA9IChzdHJ1Y3QgaWdtcGhkciopc2tiLT5oLnJhdzsKKworICAgICAgICBpZiAoIW1yb3V0ZV9kb19waW0gfHwKKwkgICAgc2tiLT5sZW4gPCBzaXplb2YoKnBpbSkgKyBzaXplb2YoKmVuY2FwKSB8fAorCSAgICBwaW0tPmdyb3VwICE9IFBJTV9WMV9WRVJTSU9OIHx8IHBpbS0+Y29kZSAhPSBQSU1fVjFfUkVHSVNURVIpIAorCQlnb3RvIGRyb3A7CisKKwllbmNhcCA9IChzdHJ1Y3QgaXBoZHIqKShza2ItPmgucmF3ICsgc2l6ZW9mKHN0cnVjdCBpZ21waGRyKSk7CisJLyoKKwkgICBDaGVjayB0aGF0OgorCSAgIGEuIHBhY2tldCBpcyByZWFsbHkgZGVzdGludGVkIHRvIGEgbXVsdGljYXN0IGdyb3VwCisJICAgYi4gcGFja2V0IGlzIG5vdCBhIE5VTEwtUkVHSVNURVIKKwkgICBjLiBwYWNrZXQgaXMgbm90IHRydW5jYXRlZAorCSAqLworCWlmICghTVVMVElDQVNUKGVuY2FwLT5kYWRkcikgfHwKKwkgICAgZW5jYXAtPnRvdF9sZW4gPT0gMCB8fAorCSAgICBudG9ocyhlbmNhcC0+dG90X2xlbikgKyBzaXplb2YoKnBpbSkgPiBza2ItPmxlbikgCisJCWdvdG8gZHJvcDsKKworCXJlYWRfbG9jaygmbXJ0X2xvY2spOworCWlmIChyZWdfdmlmX251bSA+PSAwKQorCQlyZWdfZGV2ID0gdmlmX3RhYmxlW3JlZ192aWZfbnVtXS5kZXY7CisJaWYgKHJlZ19kZXYpCisJCWRldl9ob2xkKHJlZ19kZXYpOworCXJlYWRfdW5sb2NrKCZtcnRfbG9jayk7CisKKwlpZiAocmVnX2RldiA9PSBOVUxMKSAKKwkJZ290byBkcm9wOworCisJc2tiLT5tYWMucmF3ID0gc2tiLT5uaC5yYXc7CisJc2tiX3B1bGwoc2tiLCAodTgqKWVuY2FwIC0gc2tiLT5kYXRhKTsKKwlza2ItPm5oLmlwaCA9IChzdHJ1Y3QgaXBoZHIgKilza2ItPmRhdGE7CisJc2tiLT5kZXYgPSByZWdfZGV2OworCW1lbXNldCgmKElQQ0Ioc2tiKS0+b3B0KSwgMCwgc2l6ZW9mKHN0cnVjdCBpcF9vcHRpb25zKSk7CisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKwlza2ItPmlwX3N1bW1lZCA9IDA7CisJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOworCWRzdF9yZWxlYXNlKHNrYi0+ZHN0KTsKKwlza2ItPmRzdCA9IE5VTEw7CisJKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyopcmVnX2Rldi0+cHJpdiktPnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCSgoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqKXJlZ19kZXYtPnByaXYpLT5yeF9wYWNrZXRzKys7CisJbmZfcmVzZXQoc2tiKTsKKwluZXRpZl9yeChza2IpOworCWRldl9wdXQocmVnX2Rldik7CisJcmV0dXJuIDA7CisgZHJvcDoKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0lQX1BJTVNNX1YyCitzdGF0aWMgaW50IHBpbV9yY3Yoc3RydWN0IHNrX2J1ZmYgKiBza2IpCit7CisJc3RydWN0IHBpbXJlZ2hkciAqcGltOworCXN0cnVjdCBpcGhkciAgICplbmNhcDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAgKnJlZ19kZXYgPSBOVUxMOworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKCpwaW0pICsgc2l6ZW9mKCplbmNhcCkpKSAKKwkJZ290byBkcm9wOworCisJcGltID0gKHN0cnVjdCBwaW1yZWdoZHIqKXNrYi0+aC5yYXc7CisgICAgICAgIGlmIChwaW0tPnR5cGUgIT0gKChQSU1fVkVSU0lPTjw8NCl8KFBJTV9SRUdJU1RFUikpIHx8CisJICAgIChwaW0tPmZsYWdzJlBJTV9OVUxMX1JFR0lTVEVSKSB8fAorCSAgICAoaXBfY29tcHV0ZV9jc3VtKCh2b2lkICopcGltLCBzaXplb2YoKnBpbSkpICE9IDAgJiYgCisJICAgICAodTE2KWNzdW1fZm9sZChza2JfY2hlY2tzdW0oc2tiLCAwLCBza2ItPmxlbiwgMCkpKSkgCisJCWdvdG8gZHJvcDsKKworCS8qIGNoZWNrIGlmIHRoZSBpbm5lciBwYWNrZXQgaXMgZGVzdGluZWQgdG8gbWNhc3QgZ3JvdXAgKi8KKwllbmNhcCA9IChzdHJ1Y3QgaXBoZHIqKShza2ItPmgucmF3ICsgc2l6ZW9mKHN0cnVjdCBwaW1yZWdoZHIpKTsKKwlpZiAoIU1VTFRJQ0FTVChlbmNhcC0+ZGFkZHIpIHx8CisJICAgIGVuY2FwLT50b3RfbGVuID09IDAgfHwKKwkgICAgbnRvaHMoZW5jYXAtPnRvdF9sZW4pICsgc2l6ZW9mKCpwaW0pID4gc2tiLT5sZW4pIAorCQlnb3RvIGRyb3A7CisKKwlyZWFkX2xvY2soJm1ydF9sb2NrKTsKKwlpZiAocmVnX3ZpZl9udW0gPj0gMCkKKwkJcmVnX2RldiA9IHZpZl90YWJsZVtyZWdfdmlmX251bV0uZGV2OworCWlmIChyZWdfZGV2KQorCQlkZXZfaG9sZChyZWdfZGV2KTsKKwlyZWFkX3VubG9jaygmbXJ0X2xvY2spOworCisJaWYgKHJlZ19kZXYgPT0gTlVMTCkgCisJCWdvdG8gZHJvcDsKKworCXNrYi0+bWFjLnJhdyA9IHNrYi0+bmgucmF3OworCXNrYl9wdWxsKHNrYiwgKHU4KillbmNhcCAtIHNrYi0+ZGF0YSk7CisJc2tiLT5uaC5pcGggPSAoc3RydWN0IGlwaGRyICopc2tiLT5kYXRhOworCXNrYi0+ZGV2ID0gcmVnX2RldjsKKwltZW1zZXQoJihJUENCKHNrYiktPm9wdCksIDAsIHNpemVvZihzdHJ1Y3QgaXBfb3B0aW9ucykpOworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisJc2tiLT5pcF9zdW1tZWQgPSAwOworCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKKwlkc3RfcmVsZWFzZShza2ItPmRzdCk7CisJKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyopcmVnX2Rldi0+cHJpdiktPnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCSgoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqKXJlZ19kZXYtPnByaXYpLT5yeF9wYWNrZXRzKys7CisJc2tiLT5kc3QgPSBOVUxMOworCW5mX3Jlc2V0KHNrYik7CisJbmV0aWZfcngoc2tiKTsKKwlkZXZfcHV0KHJlZ19kZXYpOworCXJldHVybiAwOworIGRyb3A6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludAoraXBtcl9maWxsX21yb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbWZjX2NhY2hlICpjLCBzdHJ1Y3QgcnRtc2cgKnJ0bSkKK3sKKwlpbnQgY3Q7CisJc3RydWN0IHJ0bmV4dGhvcCAqbmhwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB2aWZfdGFibGVbYy0+bWZjX3BhcmVudF0uZGV2OworCXU4ICpiID0gc2tiLT50YWlsOworCXN0cnVjdCBydGF0dHIgKm1wX2hlYWQ7CisKKwlpZiAoZGV2KQorCQlSVEFfUFVUKHNrYiwgUlRBX0lJRiwgNCwgJmRldi0+aWZpbmRleCk7CisKKwltcF9oZWFkID0gKHN0cnVjdCBydGF0dHIqKXNrYl9wdXQoc2tiLCBSVEFfTEVOR1RIKDApKTsKKworCWZvciAoY3QgPSBjLT5tZmNfdW4ucmVzLm1pbnZpZjsgY3QgPCBjLT5tZmNfdW4ucmVzLm1heHZpZjsgY3QrKykgeworCQlpZiAoYy0+bWZjX3VuLnJlcy50dGxzW2N0XSA8IDI1NSkgeworCQkJaWYgKHNrYl90YWlscm9vbShza2IpIDwgUlRBX0FMSUdOKFJUQV9BTElHTihzaXplb2YoKm5ocCkpICsgNCkpCisJCQkJZ290byBydGF0dHJfZmFpbHVyZTsKKwkJCW5ocCA9IChzdHJ1Y3QgcnRuZXh0aG9wKilza2JfcHV0KHNrYiwgUlRBX0FMSUdOKHNpemVvZigqbmhwKSkpOworCQkJbmhwLT5ydG5oX2ZsYWdzID0gMDsKKwkJCW5ocC0+cnRuaF9ob3BzID0gYy0+bWZjX3VuLnJlcy50dGxzW2N0XTsKKwkJCW5ocC0+cnRuaF9pZmluZGV4ID0gdmlmX3RhYmxlW2N0XS5kZXYtPmlmaW5kZXg7CisJCQluaHAtPnJ0bmhfbGVuID0gc2l6ZW9mKCpuaHApOworCQl9CisJfQorCW1wX2hlYWQtPnJ0YV90eXBlID0gUlRBX01VTFRJUEFUSDsKKwltcF9oZWFkLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4KiltcF9oZWFkOworCXJ0bS0+cnRtX3R5cGUgPSBSVE5fTVVMVElDQVNUOworCXJldHVybiAxOworCitydGF0dHJfZmFpbHVyZToKKwlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCXJldHVybiAtRU1TR1NJWkU7Cit9CisKK2ludCBpcG1yX2dldF9yb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgcnRtc2cgKnJ0bSwgaW50IG5vd2FpdCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBtZmNfY2FjaGUgKmNhY2hlOworCXN0cnVjdCBydGFibGUgKnJ0ID0gKHN0cnVjdCBydGFibGUqKXNrYi0+ZHN0OworCisJcmVhZF9sb2NrKCZtcnRfbG9jayk7CisJY2FjaGUgPSBpcG1yX2NhY2hlX2ZpbmQocnQtPnJ0X3NyYywgcnQtPnJ0X2RzdCk7CisKKwlpZiAoY2FjaGU9PU5VTEwpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwkJaW50IHZpZjsKKworCQlpZiAobm93YWl0KSB7CisJCQlyZWFkX3VubG9jaygmbXJ0X2xvY2spOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKworCQlkZXYgPSBza2ItPmRldjsKKwkJaWYgKGRldiA9PSBOVUxMIHx8ICh2aWYgPSBpcG1yX2ZpbmRfdmlmKGRldikpIDwgMCkgeworCQkJcmVhZF91bmxvY2soJm1ydF9sb2NrKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCXNrYi0+bmgucmF3ID0gc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CisJCXNrYi0+bmguaXBoLT5paGwgPSBzaXplb2Yoc3RydWN0IGlwaGRyKT4+MjsKKwkJc2tiLT5uaC5pcGgtPnNhZGRyID0gcnQtPnJ0X3NyYzsKKwkJc2tiLT5uaC5pcGgtPmRhZGRyID0gcnQtPnJ0X2RzdDsKKwkJc2tiLT5uaC5pcGgtPnZlcnNpb24gPSAwOworCQllcnIgPSBpcG1yX2NhY2hlX3VucmVzb2x2ZWQodmlmLCBza2IpOworCQlyZWFkX3VubG9jaygmbXJ0X2xvY2spOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICghbm93YWl0ICYmIChydG0tPnJ0bV9mbGFncyZSVE1fRl9OT1RJRlkpKQorCQljYWNoZS0+bWZjX2ZsYWdzIHw9IE1GQ19OT1RJRlk7CisJZXJyID0gaXBtcl9maWxsX21yb3V0ZShza2IsIGNhY2hlLCBydG0pOworCXJlYWRfdW5sb2NrKCZtcnRfbG9jayk7CisJcmV0dXJuIGVycjsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCQorLyoKKyAqCVRoZSAvcHJvYyBpbnRlcmZhY2VzIHRvIG11bHRpY2FzdCByb3V0aW5nIC9wcm9jL2lwX21yX2NhY2hlIC9wcm9jL2lwX21yX3ZpZgorICovCitzdHJ1Y3QgaXBtcl92aWZfaXRlciB7CisJaW50IGN0OworfTsKKworc3RhdGljIHN0cnVjdCB2aWZfZGV2aWNlICppcG1yX3ZpZl9zZXFfaWR4KHN0cnVjdCBpcG1yX3ZpZl9pdGVyICppdGVyLAorCQkJCQkgICBsb2ZmX3QgcG9zKQoreworCWZvciAoaXRlci0+Y3QgPSAwOyBpdGVyLT5jdCA8IG1heHZpZjsgKytpdGVyLT5jdCkgeworCQlpZighVklGX0VYSVNUUyhpdGVyLT5jdCkpCisJCQljb250aW51ZTsKKwkJaWYgKHBvcy0tID09IDApIAorCQkJcmV0dXJuICZ2aWZfdGFibGVbaXRlci0+Y3RdOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKmlwbXJfdmlmX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJcmVhZF9sb2NrKCZtcnRfbG9jayk7CisJcmV0dXJuICpwb3MgPyBpcG1yX3ZpZl9zZXFfaWR4KHNlcS0+cHJpdmF0ZSwgKnBvcyAtIDEpIAorCQk6IFNFUV9TVEFSVF9UT0tFTjsKK30KKworc3RhdGljIHZvaWQgKmlwbXJfdmlmX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaXBtcl92aWZfaXRlciAqaXRlciA9IHNlcS0+cHJpdmF0ZTsKKworCSsrKnBvczsKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXJldHVybiBpcG1yX3ZpZl9zZXFfaWR4KGl0ZXIsIDApOworCQorCXdoaWxlICgrK2l0ZXItPmN0IDwgbWF4dmlmKSB7CisJCWlmKCFWSUZfRVhJU1RTKGl0ZXItPmN0KSkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gJnZpZl90YWJsZVtpdGVyLT5jdF07CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBpcG1yX3ZpZl9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlyZWFkX3VubG9jaygmbXJ0X2xvY2spOworfQorCitzdGF0aWMgaW50IGlwbXJfdmlmX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlzZXFfcHV0cyhzZXEsIAorCQkJICJJbnRlcmZhY2UgICAgICBCeXRlc0luICBQa3RzSW4gIEJ5dGVzT3V0IFBrdHNPdXQgRmxhZ3MgTG9jYWwgICAgUmVtb3RlXG4iKTsKKwl9IGVsc2UgeworCQljb25zdCBzdHJ1Y3QgdmlmX2RldmljZSAqdmlmID0gdjsKKwkJY29uc3QgY2hhciAqbmFtZSA9ICB2aWYtPmRldiA/IHZpZi0+ZGV2LT5uYW1lIDogIm5vbmUiOworCisJCXNlcV9wcmludGYoc2VxLAorCQkJICAgIiUyWmQgJS0xMHMgJThsZCAlN2xkICAlOGxkICU3bGQgJTA1WCAlMDhYICUwOFhcbiIsCisJCQkgICB2aWYgLSB2aWZfdGFibGUsCisJCQkgICBuYW1lLCB2aWYtPmJ5dGVzX2luLCB2aWYtPnBrdF9pbiwgCisJCQkgICB2aWYtPmJ5dGVzX291dCwgdmlmLT5wa3Rfb3V0LAorCQkJICAgdmlmLT5mbGFncywgdmlmLT5sb2NhbCwgdmlmLT5yZW1vdGUpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBpcG1yX3ZpZl9zZXFfb3BzID0geworCS5zdGFydCA9IGlwbXJfdmlmX3NlcV9zdGFydCwKKwkubmV4dCAgPSBpcG1yX3ZpZl9zZXFfbmV4dCwKKwkuc3RvcCAgPSBpcG1yX3ZpZl9zZXFfc3RvcCwKKwkuc2hvdyAgPSBpcG1yX3ZpZl9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgaXBtcl92aWZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKKwlpbnQgcmMgPSAtRU5PTUVNOworCXN0cnVjdCBpcG1yX3ZpZl9pdGVyICpzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKyAgICAgICAKKwlpZiAoIXMpCisJCWdvdG8gb3V0OworCisJcmMgPSBzZXFfb3BlbihmaWxlLCAmaXBtcl92aWZfc2VxX29wcyk7CisJaWYgKHJjKQorCQlnb3RvIG91dF9rZnJlZTsKKworCXMtPmN0ID0gMDsKKwlzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc2VxLT5wcml2YXRlID0gczsKK291dDoKKwlyZXR1cm4gcmM7CitvdXRfa2ZyZWU6CisJa2ZyZWUocyk7CisJZ290byBvdXQ7CisKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXBtcl92aWZfZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgPSBpcG1yX3ZpZl9vcGVuLAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZV9wcml2YXRlLAorfTsKKworc3RydWN0IGlwbXJfbWZjX2l0ZXIgeworCXN0cnVjdCBtZmNfY2FjaGUgKipjYWNoZTsKKwlpbnQgY3Q7Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgbWZjX2NhY2hlICppcG1yX21mY19zZXFfaWR4KHN0cnVjdCBpcG1yX21mY19pdGVyICppdCwgbG9mZl90IHBvcykKK3sKKwlzdHJ1Y3QgbWZjX2NhY2hlICptZmM7CisKKwlpdC0+Y2FjaGUgPSBtZmNfY2FjaGVfYXJyYXk7CisJcmVhZF9sb2NrKCZtcnRfbG9jayk7CisJZm9yIChpdC0+Y3QgPSAwOyBpdC0+Y3QgPCBNRkNfTElORVM7IGl0LT5jdCsrKSAKKwkJZm9yKG1mYyA9IG1mY19jYWNoZV9hcnJheVtpdC0+Y3RdOyBtZmM7IG1mYyA9IG1mYy0+bmV4dCkgCisJCQlpZiAocG9zLS0gPT0gMCkgCisJCQkJcmV0dXJuIG1mYzsKKwlyZWFkX3VubG9jaygmbXJ0X2xvY2spOworCisJaXQtPmNhY2hlID0gJm1mY191bnJlc19xdWV1ZTsKKwlzcGluX2xvY2tfYmgoJm1mY191bnJlc19sb2NrKTsKKwlmb3IobWZjID0gbWZjX3VucmVzX3F1ZXVlOyBtZmM7IG1mYyA9IG1mYy0+bmV4dCkgCisJCWlmIChwb3MtLSA9PSAwKQorCQkJcmV0dXJuIG1mYzsKKwlzcGluX3VubG9ja19iaCgmbWZjX3VucmVzX2xvY2spOworCisJaXQtPmNhY2hlID0gTlVMTDsKKwlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZCAqaXBtcl9tZmNfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaXBtcl9tZmNfaXRlciAqaXQgPSBzZXEtPnByaXZhdGU7CisJaXQtPmNhY2hlID0gTlVMTDsKKwlpdC0+Y3QgPSAwOworCXJldHVybiAqcG9zID8gaXBtcl9tZmNfc2VxX2lkeChzZXEtPnByaXZhdGUsICpwb3MgLSAxKSAKKwkJOiBTRVFfU1RBUlRfVE9LRU47Cit9CisKK3N0YXRpYyB2b2lkICppcG1yX21mY19zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IG1mY19jYWNoZSAqbWZjID0gdjsKKwlzdHJ1Y3QgaXBtcl9tZmNfaXRlciAqaXQgPSBzZXEtPnByaXZhdGU7CisKKwkrKypwb3M7CisKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXJldHVybiBpcG1yX21mY19zZXFfaWR4KHNlcS0+cHJpdmF0ZSwgMCk7CisKKwlpZiAobWZjLT5uZXh0KQorCQlyZXR1cm4gbWZjLT5uZXh0OworCQorCWlmIChpdC0+Y2FjaGUgPT0gJm1mY191bnJlc19xdWV1ZSkgCisJCWdvdG8gZW5kX29mX2xpc3Q7CisKKwlCVUdfT04oaXQtPmNhY2hlICE9IG1mY19jYWNoZV9hcnJheSk7CisKKwl3aGlsZSAoKytpdC0+Y3QgPCBNRkNfTElORVMpIHsKKwkJbWZjID0gbWZjX2NhY2hlX2FycmF5W2l0LT5jdF07CisJCWlmIChtZmMpCisJCQlyZXR1cm4gbWZjOworCX0KKworCS8qIGV4aGF1c3RlZCBjYWNoZV9hcnJheSwgc2hvdyB1bnJlc29sdmVkICovCisJcmVhZF91bmxvY2soJm1ydF9sb2NrKTsKKwlpdC0+Y2FjaGUgPSAmbWZjX3VucmVzX3F1ZXVlOworCWl0LT5jdCA9IDA7CisJCQorCXNwaW5fbG9ja19iaCgmbWZjX3VucmVzX2xvY2spOworCW1mYyA9IG1mY191bnJlc19xdWV1ZTsKKwlpZiAobWZjKSAKKwkJcmV0dXJuIG1mYzsKKworIGVuZF9vZl9saXN0OgorCXNwaW5fdW5sb2NrX2JoKCZtZmNfdW5yZXNfbG9jayk7CisJaXQtPmNhY2hlID0gTlVMTDsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBpcG1yX21mY19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaXBtcl9tZmNfaXRlciAqaXQgPSBzZXEtPnByaXZhdGU7CisKKwlpZiAoaXQtPmNhY2hlID09ICZtZmNfdW5yZXNfcXVldWUpCisJCXNwaW5fdW5sb2NrX2JoKCZtZmNfdW5yZXNfbG9jayk7CisJZWxzZSBpZiAoaXQtPmNhY2hlID09IG1mY19jYWNoZV9hcnJheSkKKwkJcmVhZF91bmxvY2soJm1ydF9sb2NrKTsKK30KKworc3RhdGljIGludCBpcG1yX21mY19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpbnQgbjsKKworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlzZXFfcHV0cyhzZXEsIAorCQkgIkdyb3VwICAgIE9yaWdpbiAgIElpZiAgICAgUGt0cyAgICBCeXRlcyAgICBXcm9uZyBPaWZzXG4iKTsKKwl9IGVsc2UgeworCQljb25zdCBzdHJ1Y3QgbWZjX2NhY2hlICptZmMgPSB2OworCQljb25zdCBzdHJ1Y3QgaXBtcl9tZmNfaXRlciAqaXQgPSBzZXEtPnByaXZhdGU7CisJCQorCQlzZXFfcHJpbnRmKHNlcSwgIiUwOGxYICUwOGxYICUtM2QgJThsZCAlOGxkICU4bGQiLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpIG1mYy0+bWZjX21jYXN0Z3JwLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpIG1mYy0+bWZjX29yaWdpbiwKKwkJCSAgIG1mYy0+bWZjX3BhcmVudCwKKwkJCSAgIG1mYy0+bWZjX3VuLnJlcy5wa3QsCisJCQkgICBtZmMtPm1mY191bi5yZXMuYnl0ZXMsCisJCQkgICBtZmMtPm1mY191bi5yZXMud3JvbmdfaWYpOworCisJCWlmIChpdC0+Y2FjaGUgIT0gJm1mY191bnJlc19xdWV1ZSkgeworCQkJZm9yKG4gPSBtZmMtPm1mY191bi5yZXMubWludmlmOyAKKwkJCSAgICBuIDwgbWZjLT5tZmNfdW4ucmVzLm1heHZpZjsgbisrICkgeworCQkJCWlmKFZJRl9FWElTVFMobikgCisJCQkJICAgJiYgbWZjLT5tZmNfdW4ucmVzLnR0bHNbbl0gPCAyNTUpCisJCQkJc2VxX3ByaW50ZihzZXEsIAorCQkJCQkgICAiICUyZDolLTNkIiwgCisJCQkJCSAgIG4sIG1mYy0+bWZjX3VuLnJlcy50dGxzW25dKTsKKwkJCX0KKwkJfQorCQlzZXFfcHV0YyhzZXEsICdcbicpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBpcG1yX21mY19zZXFfb3BzID0geworCS5zdGFydCA9IGlwbXJfbWZjX3NlcV9zdGFydCwKKwkubmV4dCAgPSBpcG1yX21mY19zZXFfbmV4dCwKKwkuc3RvcCAgPSBpcG1yX21mY19zZXFfc3RvcCwKKwkuc2hvdyAgPSBpcG1yX21mY19zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgaXBtcl9tZmNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKKwlpbnQgcmMgPSAtRU5PTUVNOworCXN0cnVjdCBpcG1yX21mY19pdGVyICpzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKyAgICAgICAKKwlpZiAoIXMpCisJCWdvdG8gb3V0OworCisJcmMgPSBzZXFfb3BlbihmaWxlLCAmaXBtcl9tZmNfc2VxX29wcyk7CisJaWYgKHJjKQorCQlnb3RvIG91dF9rZnJlZTsKKworCXNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzZXEtPnByaXZhdGUgPSBzOworb3V0OgorCXJldHVybiByYzsKK291dF9rZnJlZToKKwlrZnJlZShzKTsKKwlnb3RvIG91dDsKKworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcG1yX21mY19mb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICA9IGlwbXJfbWZjX29wZW4sCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlX3ByaXZhdGUsCit9OworI2VuZGlmCQorCisjaWZkZWYgQ09ORklHX0lQX1BJTVNNX1YyCitzdGF0aWMgc3RydWN0IG5ldF9wcm90b2NvbCBwaW1fcHJvdG9jb2wgPSB7CisJLmhhbmRsZXIJPQlwaW1fcmN2LAorfTsKKyNlbmRpZgorCisKKy8qCisgKglTZXR1cCBmb3IgSVAgbXVsdGljYXN0IHJvdXRpbmcKKyAqLworIAordm9pZCBfX2luaXQgaXBfbXJfaW5pdCh2b2lkKQoreworCW1ydF9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaXBfbXJ0X2NhY2hlIiwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtZmNfY2FjaGUpLAorCQkJCSAgICAgICAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sCisJCQkJICAgICAgIE5VTEwsIE5VTEwpOworCWlmICghbXJ0X2NhY2hlcCkKKwkJcGFuaWMoImNhbm5vdCBhbGxvY2F0ZSBpcF9tcnRfY2FjaGUiKTsKKworCWluaXRfdGltZXIoJmlwbXJfZXhwaXJlX3RpbWVyKTsKKwlpcG1yX2V4cGlyZV90aW1lci5mdW5jdGlvbj1pcG1yX2V4cGlyZV9wcm9jZXNzOworCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmaXBfbXJfbm90aWZpZXIpOworI2lmZGVmIENPTkZJR19QUk9DX0ZTCQorCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJpcF9tcl92aWYiLCAwLCAmaXBtcl92aWZfZm9wcyk7CisJcHJvY19uZXRfZm9wc19jcmVhdGUoImlwX21yX2NhY2hlIiwgMCwgJmlwbXJfbWZjX2ZvcHMpOworI2VuZGlmCQorfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9LY29uZmlnIGIvbmV0L2lwdjQvaXB2cy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYTgyYjQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9pcHZzL0tjb25maWcKQEAgLTAsMCArMSwyNDQgQEAKKyMKKyMgSVAgVmlydHVhbCBTZXJ2ZXIgY29uZmlndXJhdGlvbgorIworbWVudQkiSVA6IFZpcnR1YWwgU2VydmVyIENvbmZpZ3VyYXRpb24iCisJZGVwZW5kcyBvbiBJTkVUICYmIE5FVEZJTFRFUgorCitjb25maWcJSVBfVlMKKwl0cmlzdGF0ZSAiSVAgdmlydHVhbCBzZXJ2ZXIgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIElORVQgJiYgTkVURklMVEVSCisJLS0taGVscC0tLQorCSAgSVAgVmlydHVhbCBTZXJ2ZXIgc3VwcG9ydCB3aWxsIGxldCB5b3UgYnVpbGQgYSBoaWdoLXBlcmZvcm1hbmNlCisJICB2aXJ0dWFsIHNlcnZlciBiYXNlZCBvbiBjbHVzdGVyIG9mIHR3byBvciBtb3JlIHJlYWwgc2VydmVycy4gVGhpcworCSAgb3B0aW9uIG11c3QgYmUgZW5hYmxlZCBmb3IgYXQgbGVhc3Qgb25lIG9mIHRoZSBjbHVzdGVyZWQgY29tcHV0ZXJzCisJICB0aGF0IHdpbGwgdGFrZSBjYXJlIG9mIGludGVyY2VwdGluZyBpbmNvbWluZyBjb25uZWN0aW9ucyB0byBhCisJICBzaW5nbGUgSVAgYWRkcmVzcyBhbmQgc2NoZWR1bGluZyB0aGVtIHRvIHJlYWwgc2VydmVycy4KKworCSAgVGhyZWUgcmVxdWVzdCBkaXNwYXRjaGluZyB0ZWNobmlxdWVzIGFyZSBpbXBsZW1lbnRlZCwgdGhleSBhcmUKKwkgIHZpcnR1YWwgc2VydmVyIHZpYSBOQVQsIHZpcnR1YWwgc2VydmVyIHZpYSB0dW5uZWxpbmcgYW5kIHZpcnR1YWwKKwkgIHNlcnZlciB2aWEgZGlyZWN0IHJvdXRpbmcuIFRoZSBzZXZlcmFsIHNjaGVkdWxpbmcgYWxnb3JpdGhtcyBjYW4KKwkgIGJlIHVzZWQgdG8gY2hvb3NlIHdoaWNoIHNlcnZlciB0aGUgY29ubmVjdGlvbiBpcyBkaXJlY3RlZCB0bywKKwkgIHRodXMgbG9hZCBiYWxhbmNpbmcgY2FuIGJlIGFjaGlldmVkIGFtb25nIHRoZSBzZXJ2ZXJzLiAgRm9yIG1vcmUKKwkgIGluZm9ybWF0aW9uIGFuZCBpdHMgYWRtaW5pc3RyYXRpb24gcHJvZ3JhbSwgcGxlYXNlIHZpc2l0IHRoZQorCSAgZm9sbG93aW5nIFVSTDogPGh0dHA6Ly93d3cubGludXh2aXJ0dWFsc2VydmVyLm9yZy8+LgorCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGluIGtlcm5lbCwgc2F5IFkuIFRvIGNvbXBpbGUgaXQgYXMgYQorCSAgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcJSVBfVlNfREVCVUcKKwlib29sICJJUCB2aXJ0dWFsIHNlcnZlciBkZWJ1Z2dpbmciCisJZGVwZW5kcyBvbiBJUF9WUworCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gZ2V0IGFkZGl0aW9uYWwgbWVzc2FnZXMgdXNlZnVsIGluCisJICBkZWJ1Z2dpbmcgdGhlIElQIHZpcnR1YWwgc2VydmVyIGNvZGUuIFlvdSBjYW4gY2hhbmdlIHRoZSBkZWJ1ZworCSAgbGV2ZWwgaW4gL3Byb2Mvc3lzL25ldC9pcHY0L3ZzL2RlYnVnX2xldmVsCisKK2NvbmZpZwlJUF9WU19UQUJfQklUUworCWludCAiSVBWUyBjb25uZWN0aW9uIHRhYmxlIHNpemUgKHRoZSBOdGggcG93ZXIgb2YgMikiCisJZGVwZW5kcyBvbiBJUF9WUyAKKwlkZWZhdWx0ICIxMiIgCisJLS0taGVscC0tLQorCSAgVGhlIElQVlMgY29ubmVjdGlvbiBoYXNoIHRhYmxlIHVzZXMgdGhlIGNoYWluaW5nIHNjaGVtZSB0byBoYW5kbGUKKwkgIGhhc2ggY29sbGlzaW9ucy4gVXNpbmcgYSBiaWcgSVBWUyBjb25uZWN0aW9uIGhhc2ggdGFibGUgd2lsbCBncmVhdGx5CisJICByZWR1Y2UgY29uZmxpY3RzIHdoZW4gdGhlcmUgYXJlIGh1bmRyZWRzIG9mIHRob3VzYW5kcyBvZiBjb25uZWN0aW9ucworCSAgaW4gdGhlIGhhc2ggdGFibGUuCisKKwkgIE5vdGUgdGhlIHRhYmxlIHNpemUgbXVzdCBiZSBwb3dlciBvZiAyLiBUaGUgdGFibGUgc2l6ZSB3aWxsIGJlIHRoZQorCSAgdmFsdWUgb2YgMiB0byB0aGUgeW91ciBpbnB1dCBudW1iZXIgcG93ZXIuIFRoZSBudW1iZXIgdG8gY2hvb3NlIGlzCisJICBmcm9tIDggdG8gMjAsIHRoZSBkZWZhdWx0IG51bWJlciBpcyAxMiwgd2hpY2ggbWVhbnMgdGhlIHRhYmxlIHNpemUKKwkgIGlzIDQwOTYuIERvbid0IGlucHV0IHRoZSBudW1iZXIgdG9vIHNtYWxsLCBvdGhlcndpc2UgeW91IHdpbGwgbG9zZQorCSAgcGVyZm9ybWFuY2Ugb24gaXQuIFlvdSBjYW4gYWRhcHQgdGhlIHRhYmxlIHNpemUgeW91cnNlbGYsIGFjY29yZGluZworCSAgdG8geW91ciB2aXJ0dWFsIHNlcnZlciBhcHBsaWNhdGlvbi4gSXQgaXMgZ29vZCB0byBzZXQgdGhlIHRhYmxlIHNpemUKKwkgIG5vdCBmYXIgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgY29ubmVjdGlvbnMgcGVyIHNlY29uZCBtdWx0aXBseWluZworCSAgYXZlcmFnZSBsYXN0aW5nIHRpbWUgb2YgY29ubmVjdGlvbiBpbiB0aGUgdGFibGUuICBGb3IgZXhhbXBsZSwgeW91cgorCSAgdmlydHVhbCBzZXJ2ZXIgZ2V0cyAyMDAgY29ubmVjdGlvbnMgcGVyIHNlY29uZCwgdGhlIGNvbm5lY3Rpb24gbGFzdHMKKwkgIGZvciAyMDAgc2Vjb25kcyBpbiBhdmVyYWdlIGluIHRoZSBjb25uZWN0aW9uIHRhYmxlLCB0aGUgdGFibGUgc2l6ZQorCSAgc2hvdWxkIGJlIG5vdCBmYXIgbGVzcyB0aGFuIDIwMHgyMDAsIGl0IGlzIGdvb2QgdG8gc2V0IHRoZSB0YWJsZQorCSAgc2l6ZSAzMjc2OCAoMioqMTUpLgorCisJICBBbm90aGVyIG5vdGUgdGhhdCBlYWNoIGNvbm5lY3Rpb24gb2NjdXBpZXMgMTI4IGJ5dGVzIGVmZmVjdGl2ZWx5IGFuZAorCSAgZWFjaCBoYXNoIGVudHJ5IHVzZXMgOCBieXRlcywgc28geW91IGNhbiBlc3RpbWF0ZSBob3cgbXVjaCBtZW1vcnkgaXMKKwkgIG5lZWRlZCBmb3IgeW91ciBib3guCisKK2NvbW1lbnQgIklQVlMgdHJhbnNwb3J0IHByb3RvY29sIGxvYWQgYmFsYW5jaW5nIHN1cHBvcnQiCisgICAgICAgIGRlcGVuZHMgb24gSVBfVlMKKworY29uZmlnCUlQX1ZTX1BST1RPX1RDUAorCWJvb2wgIlRDUCBsb2FkIGJhbGFuY2luZyBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVBfVlMKKwktLS1oZWxwLS0tCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIGxvYWQgYmFsYW5jaW5nIFRDUCB0cmFuc3BvcnQKKwkgIHByb3RvY29sLiBTYXkgWSBpZiB1bnN1cmUuCisKK2NvbmZpZwlJUF9WU19QUk9UT19VRFAKKwlib29sICJVRFAgbG9hZCBiYWxhbmNpbmcgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElQX1ZTCisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBsb2FkIGJhbGFuY2luZyBVRFAgdHJhbnNwb3J0CisJICBwcm90b2NvbC4gU2F5IFkgaWYgdW5zdXJlLgorCitjb25maWcJSVBfVlNfUFJPVE9fRVNQCisJYm9vbCAiRVNQIGxvYWQgYmFsYW5jaW5nIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJUF9WUworCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgbG9hZCBiYWxhbmNpbmcgRVNQIChFbmNhcHN1bHRpb24KKwkgIFNlY3VyaXR5IFBheWxvYWQpIHRyYW5zcG9ydCBwcm90b2NvbC4gU2F5IFkgaWYgdW5zdXJlLgorCitjb25maWcJSVBfVlNfUFJPVE9fQUgKKwlib29sICJBSCBsb2FkIGJhbGFuY2luZyBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVBfVlMKKwktLS1oZWxwLS0tCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIGxvYWQgYmFsYW5jaW5nIEFIIChBdXRoZW50aWNhdGlvbgorCSAgSGVhZGVyKSB0cmFuc3BvcnQgcHJvdG9jb2wuIFNheSBZIGlmIHVuc3VyZS4KKworY29tbWVudCAiSVBWUyBzY2hlZHVsZXIiCisgICAgICAgIGRlcGVuZHMgb24gSVBfVlMKKworY29uZmlnCUlQX1ZTX1JSCisJdHJpc3RhdGUgInJvdW5kLXJvYmluIHNjaGVkdWxpbmciCisJZGVwZW5kcyBvbiBJUF9WUworCS0tLWhlbHAtLS0KKwkgIFRoZSByb2Jpbi1yb2JpbiBzY2hlZHVsaW5nIGFsZ29yaXRobSBzaW1wbHkgZGlyZWN0cyBuZXR3b3JrCisJICBjb25uZWN0aW9ucyB0byBkaWZmZXJlbnQgcmVhbCBzZXJ2ZXJzIGluIGEgcm91bmQtcm9iaW4gbWFubmVyLgorCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGluIGtlcm5lbCwgc2F5IFkuIFRvIGNvbXBpbGUgaXQgYXMgYQorCSAgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBJZiB1bnN1cmUsIHNheSBOLgorIAorY29uZmlnCUlQX1ZTX1dSUgorICAgICAgICB0cmlzdGF0ZSAid2VpZ2h0ZWQgcm91bmQtcm9iaW4gc2NoZWR1bGluZyIgCisJZGVwZW5kcyBvbiBJUF9WUworCS0tLWhlbHAtLS0KKwkgIFRoZSB3ZWlnaHRlZCByb2Jpbi1yb2JpbiBzY2hlZHVsaW5nIGFsZ29yaXRobSBkaXJlY3RzIG5ldHdvcmsKKwkgIGNvbm5lY3Rpb25zIHRvIGRpZmZlcmVudCByZWFsIHNlcnZlcnMgYmFzZWQgb24gc2VydmVyIHdlaWdodHMKKwkgIGluIGEgcm91bmQtcm9iaW4gbWFubmVyLiBTZXJ2ZXJzIHdpdGggaGlnaGVyIHdlaWdodHMgcmVjZWl2ZQorCSAgbmV3IGNvbm5lY3Rpb25zIGZpcnN0IHRoYW4gdGhvc2Ugd2l0aCBsZXNzIHdlaWdodHMsIGFuZCBzZXJ2ZXJzCisJICB3aXRoIGhpZ2hlciB3ZWlnaHRzIGdldCBtb3JlIGNvbm5lY3Rpb25zIHRoYW4gdGhvc2Ugd2l0aCBsZXNzCisJICB3ZWlnaHRzIGFuZCBzZXJ2ZXJzIHdpdGggZXF1YWwgd2VpZ2h0cyBnZXQgZXF1YWwgY29ubmVjdGlvbnMuCisKKwkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgaW4ga2VybmVsLCBzYXkgWS4gVG8gY29tcGlsZSBpdCBhcyBhCisJICBtb2R1bGUsIGNob29zZSBNIGhlcmUuIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZwlJUF9WU19MQworICAgICAgICB0cmlzdGF0ZSAibGVhc3QtY29ubmVjdGlvbiBzY2hlZHVsaW5nIgorICAgICAgICBkZXBlbmRzIG9uIElQX1ZTCisJLS0taGVscC0tLQorCSAgVGhlIGxlYXN0LWNvbm5lY3Rpb24gc2NoZWR1bGluZyBhbGdvcml0aG0gZGlyZWN0cyBuZXR3b3JrCisJICBjb25uZWN0aW9ucyB0byB0aGUgc2VydmVyIHdpdGggdGhlIGxlYXN0IG51bWJlciBvZiBhY3RpdmUgCisJICBjb25uZWN0aW9ucy4KKworCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBpbiBrZXJuZWwsIHNheSBZLiBUbyBjb21waWxlIGl0IGFzIGEKKwkgIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnCUlQX1ZTX1dMQworICAgICAgICB0cmlzdGF0ZSAid2VpZ2h0ZWQgbGVhc3QtY29ubmVjdGlvbiBzY2hlZHVsaW5nIgorICAgICAgICBkZXBlbmRzIG9uIElQX1ZTCisJLS0taGVscC0tLQorCSAgVGhlIHdlaWdodGVkIGxlYXN0LWNvbm5lY3Rpb24gc2NoZWR1bGluZyBhbGdvcml0aG0gZGlyZWN0cyBuZXR3b3JrCisJICBjb25uZWN0aW9ucyB0byB0aGUgc2VydmVyIHdpdGggdGhlIGxlYXN0IGFjdGl2ZSBjb25uZWN0aW9ucworCSAgbm9ybWFsaXplZCBieSB0aGUgc2VydmVyIHdlaWdodC4KKworCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBpbiBrZXJuZWwsIHNheSBZLiBUbyBjb21waWxlIGl0IGFzIGEKKwkgIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnCUlQX1ZTX0xCTEMKKwl0cmlzdGF0ZSAibG9jYWxpdHktYmFzZWQgbGVhc3QtY29ubmVjdGlvbiBzY2hlZHVsaW5nIgorICAgICAgICBkZXBlbmRzIG9uIElQX1ZTCisJLS0taGVscC0tLQorCSAgVGhlIGxvY2FsaXR5LWJhc2VkIGxlYXN0LWNvbm5lY3Rpb24gc2NoZWR1bGluZyBhbGdvcml0aG0gaXMgZm9yCisJICBkZXN0aW5hdGlvbiBJUCBsb2FkIGJhbGFuY2luZy4gSXQgaXMgdXN1YWxseSB1c2VkIGluIGNhY2hlIGNsdXN0ZXIuCisJICBUaGlzIGFsZ29yaXRobSB1c3VhbGx5IGRpcmVjdHMgcGFja2V0IGRlc3RpbmVkIGZvciBhbiBJUCBhZGRyZXNzIHRvCisJICBpdHMgc2VydmVyIGlmIHRoZSBzZXJ2ZXIgaXMgYWxpdmUgYW5kIHVuZGVyIGxvYWQuIElmIHRoZSBzZXJ2ZXIgaXMKKwkgIG92ZXJsb2FkZWQgKGl0cyBhY3RpdmUgY29ubmVjdGlvbiBudW1iZXJzIGlzIGxhcmdlciB0aGFuIGl0cyB3ZWlnaHQpCisJICBhbmQgdGhlcmUgaXMgYSBzZXJ2ZXIgaW4gaXRzIGhhbGYgbG9hZCwgdGhlbiBhbGxvY2F0ZSB0aGUgd2VpZ2h0ZWQKKwkgIGxlYXN0LWNvbm5lY3Rpb24gc2VydmVyIHRvIHRoaXMgSVAgYWRkcmVzcy4KKworCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBpbiBrZXJuZWwsIHNheSBZLiBUbyBjb21waWxlIGl0IGFzIGEKKwkgIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnICBJUF9WU19MQkxDUgorCXRyaXN0YXRlICJsb2NhbGl0eS1iYXNlZCBsZWFzdC1jb25uZWN0aW9uIHdpdGggcmVwbGljYXRpb24gc2NoZWR1bGluZyIKKyAgICAgICAgZGVwZW5kcyBvbiBJUF9WUworCS0tLWhlbHAtLS0KKwkgIFRoZSBsb2NhbGl0eS1iYXNlZCBsZWFzdC1jb25uZWN0aW9uIHdpdGggcmVwbGljYXRpb24gc2NoZWR1bGluZworCSAgYWxnb3JpdGhtIGlzIGFsc28gZm9yIGRlc3RpbmF0aW9uIElQIGxvYWQgYmFsYW5jaW5nLiBJdCBpcyAKKwkgIHVzdWFsbHkgdXNlZCBpbiBjYWNoZSBjbHVzdGVyLiBJdCBkaWZmZXJzIGZyb20gdGhlIExCTEMgc2NoZWR1bGluZworCSAgYXMgZm9sbG93czogdGhlIGxvYWQgYmFsYW5jZXIgbWFpbnRhaW5zIG1hcHBpbmdzIGZyb20gYSB0YXJnZXQKKwkgIHRvIGEgc2V0IG9mIHNlcnZlciBub2RlcyB0aGF0IGNhbiBzZXJ2ZSB0aGUgdGFyZ2V0LiBSZXF1ZXN0cyBmb3IKKwkgIGEgdGFyZ2V0IGFyZSBhc3NpZ25lZCB0byB0aGUgbGVhc3QtY29ubmVjdGlvbiBub2RlIGluIHRoZSB0YXJnZXQncworCSAgc2VydmVyIHNldC4gSWYgYWxsIHRoZSBub2RlIGluIHRoZSBzZXJ2ZXIgc2V0IGFyZSBvdmVyIGxvYWRlZCwKKwkgIGl0IHBpY2tzIHVwIGEgbGVhc3QtY29ubmVjdGlvbiBub2RlIGluIHRoZSBjbHVzdGVyIGFuZCBhZGRzIGl0CisJICBpbiB0aGUgc2V2ZXIgc2V0IGZvciB0aGUgdGFyZ2V0LiBJZiB0aGUgc2VydmVyIHNldCBoYXMgbm90IGJlZW4KKwkgIG1vZGlmaWVkIGZvciB0aGUgc3BlY2lmaWVkIHRpbWUsIHRoZSBtb3N0IGxvYWRlZCBub2RlIGlzIHJlbW92ZWQKKwkgIGZyb20gdGhlIHNlcnZlciBzZXQsIGluIG9yZGVyIHRvIGF2b2lkIGhpZ2ggZGVncmVlIG9mIHJlcGxpY2F0aW9uLgorCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGluIGtlcm5lbCwgc2F5IFkuIFRvIGNvbXBpbGUgaXQgYXMgYQorCSAgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcJSVBfVlNfREgKKwl0cmlzdGF0ZSAiZGVzdGluYXRpb24gaGFzaGluZyBzY2hlZHVsaW5nIgorICAgICAgICBkZXBlbmRzIG9uIElQX1ZTCisJLS0taGVscC0tLQorCSAgVGhlIGRlc3RpbmF0aW9uIGhhc2hpbmcgc2NoZWR1bGluZyBhbGdvcml0aG0gYXNzaWducyBuZXR3b3JrCisJICBjb25uZWN0aW9ucyB0byB0aGUgc2VydmVycyB0aHJvdWdoIGxvb2tpbmcgdXAgYSBzdGF0aWNhbGx5IGFzc2lnbmVkCisJICBoYXNoIHRhYmxlIGJ5IHRoZWlyIGRlc3RpbmF0aW9uIElQIGFkZHJlc3Nlcy4KKworCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBpbiBrZXJuZWwsIHNheSBZLiBUbyBjb21waWxlIGl0IGFzIGEKKwkgIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnCUlQX1ZTX1NICisJdHJpc3RhdGUgInNvdXJjZSBoYXNoaW5nIHNjaGVkdWxpbmciCisgICAgICAgIGRlcGVuZHMgb24gSVBfVlMKKwktLS1oZWxwLS0tCisJICBUaGUgc291cmNlIGhhc2hpbmcgc2NoZWR1bGluZyBhbGdvcml0aG0gYXNzaWducyBuZXR3b3JrCisJICBjb25uZWN0aW9ucyB0byB0aGUgc2VydmVycyB0aHJvdWdoIGxvb2tpbmcgdXAgYSBzdGF0aWNhbGx5IGFzc2lnbmVkCisJICBoYXNoIHRhYmxlIGJ5IHRoZWlyIHNvdXJjZSBJUCBhZGRyZXNzZXMuCisKKwkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgaW4ga2VybmVsLCBzYXkgWS4gVG8gY29tcGlsZSBpdCBhcyBhCisJICBtb2R1bGUsIGNob29zZSBNIGhlcmUuIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZwlJUF9WU19TRUQKKwl0cmlzdGF0ZSAic2hvcnRlc3QgZXhwZWN0ZWQgZGVsYXkgc2NoZWR1bGluZyIKKyAgICAgICAgZGVwZW5kcyBvbiBJUF9WUworCS0tLWhlbHAtLS0KKwkgIFRoZSBzaG9ydGVzdCBleHBlY3RlZCBkZWxheSBzY2hlZHVsaW5nIGFsZ29yaXRobSBhc3NpZ25zIG5ldHdvcmsKKwkgIGNvbm5lY3Rpb25zIHRvIHRoZSBzZXJ2ZXIgd2l0aCB0aGUgc2hvcnRlc3QgZXhwZWN0ZWQgZGVsYXkuIFRoZSAKKwkgIGV4cGVjdGVkIGRlbGF5IHRoYXQgdGhlIGpvYiB3aWxsIGV4cGVyaWVuY2UgaXMgKENpICsgMSkgLyBVaSBpZiAKKwkgIHNlbnQgdG8gdGhlIGl0aCBzZXJ2ZXIsIGluIHdoaWNoIENpIGlzIHRoZSBudW1iZXIgb2YgY29ubmVjdGlvbnMKKwkgIG9uIHRoZSB0aGUgaXRoIHNlcnZlciBhbmQgVWkgaXMgdGhlIGZpeGVkIHNlcnZpY2UgcmF0ZSAod2VpZ2h0KQorCSAgb2YgdGhlIGl0aCBzZXJ2ZXIuCisKKwkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgaW4ga2VybmVsLCBzYXkgWS4gVG8gY29tcGlsZSBpdCBhcyBhCisJICBtb2R1bGUsIGNob29zZSBNIGhlcmUuIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZwlJUF9WU19OUQorCXRyaXN0YXRlICJuZXZlciBxdWV1ZSBzY2hlZHVsaW5nIgorICAgICAgICBkZXBlbmRzIG9uIElQX1ZTCisJLS0taGVscC0tLQorCSAgVGhlIG5ldmVyIHF1ZXVlIHNjaGVkdWxpbmcgYWxnb3JpdGhtIGFkb3B0cyBhIHR3by1zcGVlZCBtb2RlbC4KKwkgIFdoZW4gdGhlcmUgaXMgYW4gaWRsZSBzZXJ2ZXIgYXZhaWxhYmxlLCB0aGUgam9iIHdpbGwgYmUgc2VudCB0bworCSAgdGhlIGlkbGUgc2VydmVyLCBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIGEgZmFzdCBvbmUuIFdoZW4gdGhlcmUKKwkgIGlzIG5vIGlkbGUgc2VydmVyIGF2YWlsYWJsZSwgdGhlIGpvYiB3aWxsIGJlIHNlbnQgdG8gdGhlIHNlcnZlcgorCSAgdGhhdCBtaW5pbWl6ZSBpdHMgZXhwZWN0ZWQgZGVsYXkgKFRoZSBTaG9ydGVzdCBFeHBlY3RlZCBEZWxheQorCSAgc2NoZWR1bGluZyBhbGdvcml0aG0pLgorCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGluIGtlcm5lbCwgc2F5IFkuIFRvIGNvbXBpbGUgaXQgYXMgYQorCSAgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBJZiB1bnN1cmUsIHNheSBOLgorCitjb21tZW50ICdJUFZTIGFwcGxpY2F0aW9uIGhlbHBlcicKKwlkZXBlbmRzIG9uIElQX1ZTCisKK2NvbmZpZwlJUF9WU19GVFAKKyAgCXRyaXN0YXRlICJGVFAgcHJvdG9jb2wgaGVscGVyIgorICAgICAgICBkZXBlbmRzIG9uIElQX1ZTICYmIElQX1ZTX1BST1RPX1RDUAorCS0tLWhlbHAtLS0KKwkgIEZUUCBpcyBhIHByb3RvY29sIHRoYXQgdHJhbnNmZXJzIElQIGFkZHJlc3MgYW5kL29yIHBvcnQgbnVtYmVyIGluCisJICB0aGUgcGF5bG9hZC4gSW4gdGhlIHZpcnR1YWwgc2VydmVyIHZpYSBOZXR3b3JrIEFkZHJlc3MgVHJhbnNsYXRpb24sCisJICB0aGUgSVAgYWRkcmVzcyBhbmQgcG9ydCBudW1iZXIgb2YgcmVhbCBzZXJ2ZXJzIGNhbm5vdCBiZSBzZW50IHRvCisJICBjbGllbnRzIGluIGZ0cCBjb25uZWN0aW9ucyBkaXJlY3RseSwgc28gRlRQIHByb3RvY29sIGhlbHBlciBpcworCSAgcmVxdWlyZWQgZm9yIHRyYWNraW5nIHRoZSBjb25uZWN0aW9uIGFuZCBtYW5nbGluZyBpdCBiYWNrIHRvIHRoYXQgb2YKKwkgIHZpcnR1YWwgc2VydmljZS4KKworCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBpbiBrZXJuZWwsIHNheSBZLiBUbyBjb21waWxlIGl0IGFzIGEKKwkgIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gSWYgdW5zdXJlLCBzYXkgTi4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9NYWtlZmlsZSBiL25ldC9pcHY0L2lwdnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc4ODQ2MQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L2lwdnMvTWFrZWZpbGUKQEAgLTAsMCArMSwzNCBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIElQVlMgbW9kdWxlcyBvbiB0b3Agb2YgSVB2NC4KKyMKKworIyBJUFZTIHRyYW5zcG9ydCBwcm90b2NvbCBsb2FkIGJhbGFuY2luZyBzdXBwb3J0CitpcF92c19wcm90by1vYmpzLXkgOj0KK2lwX3ZzX3Byb3RvLW9ianMtJChDT05GSUdfSVBfVlNfUFJPVE9fVENQKSArPSBpcF92c19wcm90b190Y3AubworaXBfdnNfcHJvdG8tb2Jqcy0kKENPTkZJR19JUF9WU19QUk9UT19VRFApICs9IGlwX3ZzX3Byb3RvX3VkcC5vCitpcF92c19wcm90by1vYmpzLSQoQ09ORklHX0lQX1ZTX1BST1RPX0VTUCkgKz0gaXBfdnNfcHJvdG9fZXNwLm8KK2lwX3ZzX3Byb3RvLW9ianMtJChDT05GSUdfSVBfVlNfUFJPVE9fQUgpICs9IGlwX3ZzX3Byb3RvX2FoLm8KKworaXBfdnMtb2JqcyA6PQlpcF92c19jb25uLm8gaXBfdnNfY29yZS5vIGlwX3ZzX2N0bC5vIGlwX3ZzX3NjaGVkLm8JICAgXAorCQlpcF92c194bWl0Lm8gaXBfdnNfYXBwLm8gaXBfdnNfc3luYy5vCSAgIAkJICAgXAorCQlpcF92c19lc3QubyBpcF92c19wcm90by5vIGlwX3ZzX3Byb3RvX2ljbXAubwkJICAgXAorCQkkKGlwX3ZzX3Byb3RvLW9ianMteSkKKworCisjIElQVlMgY29yZQorb2JqLSQoQ09ORklHX0lQX1ZTKSArPSBpcF92cy5vCisKKyMgSVBWUyBzY2hlZHVsZXJzCitvYmotJChDT05GSUdfSVBfVlNfUlIpICs9IGlwX3ZzX3JyLm8KK29iai0kKENPTkZJR19JUF9WU19XUlIpICs9IGlwX3ZzX3dyci5vCitvYmotJChDT05GSUdfSVBfVlNfTEMpICs9IGlwX3ZzX2xjLm8KK29iai0kKENPTkZJR19JUF9WU19XTEMpICs9IGlwX3ZzX3dsYy5vCitvYmotJChDT05GSUdfSVBfVlNfTEJMQykgKz0gaXBfdnNfbGJsYy5vCitvYmotJChDT05GSUdfSVBfVlNfTEJMQ1IpICs9IGlwX3ZzX2xibGNyLm8KK29iai0kKENPTkZJR19JUF9WU19ESCkgKz0gaXBfdnNfZGgubworb2JqLSQoQ09ORklHX0lQX1ZTX1NIKSArPSBpcF92c19zaC5vCitvYmotJChDT05GSUdfSVBfVlNfU0VEKSArPSBpcF92c19zZWQubworb2JqLSQoQ09ORklHX0lQX1ZTX05RKSArPSBpcF92c19ucS5vCisKKyMgSVBWUyBhcHBsaWNhdGlvbiBoZWxwZXJzCitvYmotJChDT05GSUdfSVBfVlNfRlRQKSArPSBpcF92c19mdHAubwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19hcHAuYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfYXBwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkyMTJhZAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfYXBwLmMKQEAgLTAsMCArMSw2NTggQEAKKy8qCisgKiBpcF92c19hcHAuYzogQXBwbGljYXRpb24gbW9kdWxlIHN1cHBvcnQgZm9yIElQVlMKKyAqCisgKiBWZXJzaW9uOiAgICAgJElkOiBpcF92c19hcHAuYyx2IDEuMTcgMjAwMy8wMy8yMiAwNjozMToyMSB3ZW5zb25nIEV4cCAkCisgKgorICogQXV0aG9yczogICAgIFdlbnNvbmcgWmhhbmcgPHdlbnNvbmdAbGludXh2aXJ0dWFsc2VydmVyLm9yZz4KKyAqCisgKiAgICAgICAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICAgICAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgICAgICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgICAgICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBNb3N0IGNvZGUgaGVyZSBpcyB0YWtlbiBmcm9tIGlwX21hc3FfYXBwLmMgaW4ga2VybmVsIDIuMi4gVGhlIGRpZmZlcmVuY2UKKyAqIGlzIHRoYXQgaXBfdnNfYXBwIG1vZHVsZSBoYW5kbGVzIHRoZSByZXZlcnNlIGRpcmVjdGlvbiAoaW5jb21pbmcgcmVxdWVzdHMKKyAqIGFuZCBvdXRnb2luZyByZXNwb25zZXMpLgorICoKKyAqCQlJUF9NQVNRX0FQUCBhcHBsaWNhdGlvbiBtYXNxdWVyYWRpbmcgbW9kdWxlCisgKgorICogQXV0aG9yOglKdWFuIEpvc2UgQ2lhcmxhbnRlLCA8ampjaWFybGFAcmFpei51bmN1LmVkdS5hcj4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjaW5jbHVkZSA8bmV0L2lwX3ZzLmg+CisKK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfaXBfdnNfYXBwKTsKK0VYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9pcF92c19hcHApOworRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9pcF92c19hcHBfaW5jKTsKKworLyogaXB2cyBhcHBsaWNhdGlvbiBsaXN0IGhlYWQgKi8KK3N0YXRpYyBMSVNUX0hFQUQoaXBfdnNfYXBwX2xpc3QpOworc3RhdGljIERFQ0xBUkVfTVVURVgoX19pcF92c19hcHBfbXV0ZXgpOworCisKKy8qCisgKglHZXQgYW4gaXBfdnNfYXBwIG9iamVjdAorICovCitzdGF0aWMgaW5saW5lIGludCBpcF92c19hcHBfZ2V0KHN0cnVjdCBpcF92c19hcHAgKmFwcCkKK3sKKwkvKiB0ZXN0IGFuZCBnZXQgdGhlIG1vZHVsZSBhdG9taWNhbGx5ICovCisJaWYgKGFwcC0+bW9kdWxlKQorCQlyZXR1cm4gdHJ5X21vZHVsZV9nZXQoYXBwLT5tb2R1bGUpOworCWVsc2UKKwkJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGlwX3ZzX2FwcF9wdXQoc3RydWN0IGlwX3ZzX2FwcCAqYXBwKQoreworCWlmIChhcHAtPm1vZHVsZSkKKwkJbW9kdWxlX3B1dChhcHAtPm1vZHVsZSk7Cit9CisKKworLyoKKyAqCUFsbG9jYXRlL2luaXRpYWxpemUgYXBwIGluY2FybmF0aW9uIGFuZCByZWdpc3RlciBpdCBpbiBwcm90byBhcHBzLgorICovCitzdGF0aWMgaW50CitpcF92c19hcHBfaW5jX25ldyhzdHJ1Y3QgaXBfdnNfYXBwICphcHAsIF9fdTE2IHByb3RvLCBfX3UxNiBwb3J0KQoreworCXN0cnVjdCBpcF92c19wcm90b2NvbCAqcHA7CisJc3RydWN0IGlwX3ZzX2FwcCAqaW5jOworCWludCByZXQ7CisKKwlpZiAoIShwcCA9IGlwX3ZzX3Byb3RvX2dldChwcm90bykpKQorCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKKworCWlmICghcHAtPnVucmVnaXN0ZXJfYXBwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpbmMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXBfdnNfYXBwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmMpCisJCXJldHVybiAtRU5PTUVNOworCW1lbWNweShpbmMsIGFwcCwgc2l6ZW9mKCppbmMpKTsKKwlJTklUX0xJU1RfSEVBRCgmaW5jLT5wX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZpbmMtPmluY3NfbGlzdCk7CisJaW5jLT5hcHAgPSBhcHA7CisJaW5jLT5wb3J0ID0gaHRvbnMocG9ydCk7CisJYXRvbWljX3NldCgmaW5jLT51c2VjbnQsIDApOworCisJaWYgKGFwcC0+dGltZW91dHMpIHsKKwkJaW5jLT50aW1lb3V0X3RhYmxlID0KKwkJCWlwX3ZzX2NyZWF0ZV90aW1lb3V0X3RhYmxlKGFwcC0+dGltZW91dHMsCisJCQkJCQkgICBhcHAtPnRpbWVvdXRzX3NpemUpOworCQlpZiAoIWluYy0+dGltZW91dF90YWJsZSkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJcmV0ID0gcHAtPnJlZ2lzdGVyX2FwcChpbmMpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJbGlzdF9hZGQoJmluYy0+YV9saXN0LCAmYXBwLT5pbmNzX2xpc3QpOworCUlQX1ZTX0RCRyg5LCAiJXMgYXBwbGljYXRpb24gJXM6JXUgcmVnaXN0ZXJlZFxuIiwKKwkJICBwcC0+bmFtZSwgaW5jLT5uYW1lLCBpbmMtPnBvcnQpOworCisJcmV0dXJuIDA7CisKKyAgb3V0OgorCWlmIChpbmMtPnRpbWVvdXRfdGFibGUpCisJCWtmcmVlKGluYy0+dGltZW91dF90YWJsZSk7CisJa2ZyZWUoaW5jKTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKglSZWxlYXNlIGFwcCBpbmNhcm5hdGlvbgorICovCitzdGF0aWMgdm9pZAoraXBfdnNfYXBwX2luY19yZWxlYXNlKHN0cnVjdCBpcF92c19hcHAgKmluYykKK3sKKwlzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwOworCisJaWYgKCEocHAgPSBpcF92c19wcm90b19nZXQoaW5jLT5wcm90b2NvbCkpKQorCQlyZXR1cm47CisKKwlpZiAocHAtPnVucmVnaXN0ZXJfYXBwKQorCQlwcC0+dW5yZWdpc3Rlcl9hcHAoaW5jKTsKKworCUlQX1ZTX0RCRyg5LCAiJXMgQXBwICVzOiV1IHVucmVnaXN0ZXJlZFxuIiwKKwkJICBwcC0+bmFtZSwgaW5jLT5uYW1lLCBpbmMtPnBvcnQpOworCisJbGlzdF9kZWwoJmluYy0+YV9saXN0KTsKKworCWlmIChpbmMtPnRpbWVvdXRfdGFibGUgIT0gTlVMTCkKKwkJa2ZyZWUoaW5jLT50aW1lb3V0X3RhYmxlKTsKKwlrZnJlZShpbmMpOworfQorCisKKy8qCisgKglHZXQgcmVmZXJlbmNlIHRvIGFwcCBpbmMgKG9ubHkgY2FsbGVkIGZyb20gc29mdGlycSkKKyAqCisgKi8KK2ludCBpcF92c19hcHBfaW5jX2dldChzdHJ1Y3QgaXBfdnNfYXBwICppbmMpCit7CisJaW50IHJlc3VsdDsKKworCWF0b21pY19pbmMoJmluYy0+dXNlY250KTsKKwlpZiAodW5saWtlbHkoKHJlc3VsdCA9IGlwX3ZzX2FwcF9nZXQoaW5jLT5hcHApKSAhPSAxKSkKKwkJYXRvbWljX2RlYygmaW5jLT51c2VjbnQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqCVB1dCB0aGUgYXBwIGluYyAob25seSBjYWxsZWQgZnJvbSB0aW1lciBvciBuZXQgc29mdGlycSkKKyAqLwordm9pZCBpcF92c19hcHBfaW5jX3B1dChzdHJ1Y3QgaXBfdnNfYXBwICppbmMpCit7CisJaXBfdnNfYXBwX3B1dChpbmMtPmFwcCk7CisJYXRvbWljX2RlYygmaW5jLT51c2VjbnQpOworfQorCisKKy8qCisgKglSZWdpc3RlciBhbiBhcHBsaWNhdGlvbiBpbmNhcm5hdGlvbiBpbiBwcm90b2NvbCBhcHBsaWNhdGlvbnMKKyAqLworaW50CityZWdpc3Rlcl9pcF92c19hcHBfaW5jKHN0cnVjdCBpcF92c19hcHAgKmFwcCwgX191MTYgcHJvdG8sIF9fdTE2IHBvcnQpCit7CisJaW50IHJlc3VsdDsKKworCWRvd24oJl9faXBfdnNfYXBwX211dGV4KTsKKworCXJlc3VsdCA9IGlwX3ZzX2FwcF9pbmNfbmV3KGFwcCwgcHJvdG8sIHBvcnQpOworCisJdXAoJl9faXBfdnNfYXBwX211dGV4KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqCWlwX3ZzX2FwcCByZWdpc3RyYXRpb24gcm91dGluZQorICovCitpbnQgcmVnaXN0ZXJfaXBfdnNfYXBwKHN0cnVjdCBpcF92c19hcHAgKmFwcCkKK3sKKwkvKiBpbmNyZWFzZSB0aGUgbW9kdWxlIHVzZSBjb3VudCAqLworCWlwX3ZzX3VzZV9jb3VudF9pbmMoKTsKKworCWRvd24oJl9faXBfdnNfYXBwX211dGV4KTsKKworCWxpc3RfYWRkKCZhcHAtPmFfbGlzdCwgJmlwX3ZzX2FwcF9saXN0KTsKKworCXVwKCZfX2lwX3ZzX2FwcF9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJaXBfdnNfYXBwIHVucmVnaXN0cmF0aW9uIHJvdXRpbmUKKyAqCVdlIGFyZSBzdXJlIHRoZXJlIGFyZSBubyBhcHAgaW5jYXJuYXRpb25zIGF0dGFjaGVkIHRvIHNlcnZpY2VzCisgKi8KK3ZvaWQgdW5yZWdpc3Rlcl9pcF92c19hcHAoc3RydWN0IGlwX3ZzX2FwcCAqYXBwKQoreworCXN0cnVjdCBpcF92c19hcHAgKmluYywgKm54dDsKKworCWRvd24oJl9faXBfdnNfYXBwX211dGV4KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpbmMsIG54dCwgJmFwcC0+aW5jc19saXN0LCBhX2xpc3QpIHsKKwkJaXBfdnNfYXBwX2luY19yZWxlYXNlKGluYyk7CisJfQorCisJbGlzdF9kZWwoJmFwcC0+YV9saXN0KTsKKworCXVwKCZfX2lwX3ZzX2FwcF9tdXRleCk7CisKKwkvKiBkZWNyZWFzZSB0aGUgbW9kdWxlIHVzZSBjb3VudCAqLworCWlwX3ZzX3VzZV9jb3VudF9kZWMoKTsKK30KKworCisjaWYgMDAwMAorLyoKKyAqCUdldCByZWZlcmVuY2UgdG8gYXBwIGJ5IG5hbWUgKGNhbGxlZCBmcm9tIHVzZXIgY29udGV4dCkKKyAqLworc3RydWN0IGlwX3ZzX2FwcCAqaXBfdnNfYXBwX2dldF9ieV9uYW1lKGNoYXIgKmFwcG5hbWUpCit7CisJc3RydWN0IGlwX3ZzX2FwcCAqYXBwLCAqYSA9IE5VTEw7CisKKwlkb3duKCZfX2lwX3ZzX2FwcF9tdXRleCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudCwgJmlwX3ZzX2FwcF9saXN0LCBhX2xpc3QpIHsKKwkJaWYgKHN0cmNtcChhcHAtPm5hbWUsIGFwcG5hbWUpKQorCQkJY29udGludWU7CisKKwkJLyogc29mdGlycSBtYXkgY2FsbCBpcF92c19hcHBfZ2V0IHRvbywgc28gdGhlIGNhbGxlcgorCQkgICBtdXN0IGRpc2FibGUgc29mdGlycSBvbiB0aGUgY3VycmVudCBDUFUgKi8KKwkJaWYgKGlwX3ZzX2FwcF9nZXQoYXBwKSkKKwkJCWEgPSBhcHA7CisJCWJyZWFrOworCX0KKworCXVwKCZfX2lwX3ZzX2FwcF9tdXRleCk7CisKKwlyZXR1cm4gYTsKK30KKyNlbmRpZgorCisKKy8qCisgKglCaW5kIGlwX3ZzX2Nvbm4gdG8gaXRzIGlwX3ZzX2FwcCAoY2FsbGVkIGJ5IGNwIGNvbnN0cnVjdG9yKQorICovCitpbnQgaXBfdnNfYmluZF9hcHAoc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQoreworCXJldHVybiBwcC0+YXBwX2Nvbm5fYmluZChjcCk7Cit9CisKKworLyoKKyAqCVVuYmluZCBjcCBmcm9tIGFwcGxpY2F0aW9uIGluY2FybmF0aW9uIChjYWxsZWQgYnkgY3AgZGVzdHJ1Y3RvcikKKyAqLwordm9pZCBpcF92c191bmJpbmRfYXBwKHN0cnVjdCBpcF92c19jb25uICpjcCkKK3sKKwlzdHJ1Y3QgaXBfdnNfYXBwICppbmMgPSBjcC0+YXBwOworCisJaWYgKCFpbmMpCisJCXJldHVybjsKKworCWlmIChpbmMtPnVuYmluZF9jb25uKQorCQlpbmMtPnVuYmluZF9jb25uKGluYywgY3ApOworCWlmIChpbmMtPmRvbmVfY29ubikKKwkJaW5jLT5kb25lX2Nvbm4oaW5jLCBjcCk7CisJaXBfdnNfYXBwX2luY19wdXQoaW5jKTsKKwljcC0+YXBwID0gTlVMTDsKK30KKworCisvKgorICoJRml4ZXMgdGgtPnNlcSBiYXNlZCBvbiBpcF92c19zZXEgaW5mby4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHZzX2ZpeF9zZXEoY29uc3Qgc3RydWN0IGlwX3ZzX3NlcSAqdnNlcSwgc3RydWN0IHRjcGhkciAqdGgpCit7CisJX191MzIgc2VxID0gbnRvaGwodGgtPnNlcSk7CisKKwkvKgorCSAqCUFkanVzdCBzZXEgd2l0aCBkZWx0YS1vZmZzZXQgZm9yIGFsbCBwYWNrZXRzIGFmdGVyCisJICoJdGhlIG1vc3QgcmVjZW50IHJlc2l6ZWQgcGt0IHNlcSBhbmQgd2l0aCBwcmV2aW91c19kZWx0YSBvZmZzZXQKKwkgKglmb3IgYWxsIHBhY2tldHMJYmVmb3JlIG1vc3QgcmVjZW50IHJlc2l6ZWQgcGt0IHNlcS4KKwkgKi8KKwlpZiAodnNlcS0+ZGVsdGEgfHwgdnNlcS0+cHJldmlvdXNfZGVsdGEpIHsKKwkJaWYoYWZ0ZXIoc2VxLCB2c2VxLT5pbml0X3NlcSkpIHsKKwkJCXRoLT5zZXEgPSBodG9ubChzZXEgKyB2c2VxLT5kZWx0YSk7CisJCQlJUF9WU19EQkcoOSwgInZzX2ZpeF9zZXEoKTogYWRkZWQgZGVsdGEgKCVkKSB0byBzZXFcbiIsCisJCQkJICB2c2VxLT5kZWx0YSk7CisJCX0gZWxzZSB7CisJCQl0aC0+c2VxID0gaHRvbmwoc2VxICsgdnNlcS0+cHJldmlvdXNfZGVsdGEpOworCQkJSVBfVlNfREJHKDksICJ2c19maXhfc2VxKCk6IGFkZGVkIHByZXZpb3VzX2RlbHRhICIKKwkJCQkgICIoJWQpIHRvIHNlcVxuIiwgdnNlcS0+cHJldmlvdXNfZGVsdGEpOworCQl9CisJfQorfQorCisKKy8qCisgKglGaXhlcyB0aC0+YWNrX3NlcSBiYXNlZCBvbiBpcF92c19zZXEgaW5mby4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCit2c19maXhfYWNrX3NlcShjb25zdCBzdHJ1Y3QgaXBfdnNfc2VxICp2c2VxLCBzdHJ1Y3QgdGNwaGRyICp0aCkKK3sKKwlfX3UzMiBhY2tfc2VxID0gbnRvaGwodGgtPmFja19zZXEpOworCisJLyoKKwkgKiBBZGp1c3QgYWNrX3NlcSB3aXRoIGRlbHRhLW9mZnNldCBmb3IKKwkgKiB0aGUgcGFja2V0cyBBRlRFUiBtb3N0IHJlY2VudCByZXNpemVkIHBrdCBoYXMgY2F1c2VkIGEgc2hpZnQKKwkgKiBmb3IgcGFja2V0cyBiZWZvcmUgbW9zdCByZWNlbnQgcmVzaXplZCBwa3QsIHVzZSBwcmV2aW91c19kZWx0YQorCSAqLworCWlmICh2c2VxLT5kZWx0YSB8fCB2c2VxLT5wcmV2aW91c19kZWx0YSkgeworCQkvKiBzaW5jZSBhY2tfc2VxIGlzIHRoZSBudW1iZXIgb2Ygb2N0ZXQgdGhhdCBpcyBleHBlY3RlZAorCQkgICB0byByZWNlaXZlIG5leHQsIHNvIGNvbXBhcmUgaXQgd2l0aCBpbml0X3NlcStkZWx0YSAqLworCQlpZihhZnRlcihhY2tfc2VxLCB2c2VxLT5pbml0X3NlcSt2c2VxLT5kZWx0YSkpIHsKKwkJCXRoLT5hY2tfc2VxID0gaHRvbmwoYWNrX3NlcSAtIHZzZXEtPmRlbHRhKTsKKwkJCUlQX1ZTX0RCRyg5LCAidnNfZml4X2Fja19zZXEoKTogc3VidHJhY3RlZCBkZWx0YSAiCisJCQkJICAiKCVkKSBmcm9tIGFja19zZXFcbiIsIHZzZXEtPmRlbHRhKTsKKworCQl9IGVsc2UgeworCQkJdGgtPmFja19zZXEgPSBodG9ubChhY2tfc2VxIC0gdnNlcS0+cHJldmlvdXNfZGVsdGEpOworCQkJSVBfVlNfREJHKDksICJ2c19maXhfYWNrX3NlcSgpOiBzdWJ0cmFjdGVkICIKKwkJCQkgICJwcmV2aW91c19kZWx0YSAoJWQpIGZyb20gYWNrX3NlcVxuIiwKKwkJCQkgIHZzZXEtPnByZXZpb3VzX2RlbHRhKTsKKwkJfQorCX0KK30KKworCisvKgorICoJVXBkYXRlcyBpcF92c19zZXEgaWYgcGt0IGhhcyBiZWVuIHJlc2l6ZWQKKyAqCUFzc3VtZXMgYWxyZWFkeSBjaGVja2VkIHByb3RvPT1JUFBST1RPX1RDUCBhbmQgZGlmZiE9MC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHZzX3NlcV91cGRhdGUoc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCBzdHJ1Y3QgaXBfdnNfc2VxICp2c2VxLAorCQkJCSB1bnNpZ25lZCBmbGFnLCBfX3UzMiBzZXEsIGludCBkaWZmKQoreworCS8qIHNwaW5sb2NrIGlzIHRvIGtlZXAgdXBkYXRpbmcgY3AtPmZsYWdzIGF0b21pYyAqLworCXNwaW5fbG9jaygmY3AtPmxvY2spOworCWlmICghKGNwLT5mbGFncyAmIGZsYWcpIHx8IGFmdGVyKHNlcSwgdnNlcS0+aW5pdF9zZXEpKSB7CisJCXZzZXEtPnByZXZpb3VzX2RlbHRhID0gdnNlcS0+ZGVsdGE7CisJCXZzZXEtPmRlbHRhICs9IGRpZmY7CisJCXZzZXEtPmluaXRfc2VxID0gc2VxOworCQljcC0+ZmxhZ3MgfD0gZmxhZzsKKwl9CisJc3Bpbl91bmxvY2soJmNwLT5sb2NrKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXBwX3RjcF9wa3Rfb3V0KHN0cnVjdCBpcF92c19jb25uICpjcCwgc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCSAgc3RydWN0IGlwX3ZzX2FwcCAqYXBwKQoreworCWludCBkaWZmOworCXVuc2lnbmVkIGludCB0Y3Bfb2Zmc2V0ID0gKCpwc2tiKS0+bmguaXBoLT5paGwqNDsKKwlzdHJ1Y3QgdGNwaGRyICp0aDsKKwlfX3UzMiBzZXE7CisKKwlpZiAoIWlwX3ZzX21ha2Vfc2tiX3dyaXRhYmxlKHBza2IsIHRjcF9vZmZzZXQgKyBzaXplb2YoKnRoKSkpCisJCXJldHVybiAwOworCisJdGggPSAoc3RydWN0IHRjcGhkciAqKSgoKnBza2IpLT5uaC5yYXcgKyB0Y3Bfb2Zmc2V0KTsKKworCS8qCisJICoJUmVtZW1iZXIgc2VxIG51bWJlciBpbiBjYXNlIHRoaXMgcGt0IGdldHMgcmVzaXplZAorCSAqLworCXNlcSA9IG50b2hsKHRoLT5zZXEpOworCisJLyoKKwkgKglGaXggc2VxIHN0dWZmIGlmIGZsYWdnZWQgYXMgc28uCisJICovCisJaWYgKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9PVVRfU0VRKQorCQl2c19maXhfc2VxKCZjcC0+b3V0X3NlcSwgdGgpOworCWlmIChjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfSU5fU0VRKQorCQl2c19maXhfYWNrX3NlcSgmY3AtPmluX3NlcSwgdGgpOworCisJLyoKKwkgKglDYWxsIHByaXZhdGUgb3V0cHV0IGhvb2sgZnVuY3Rpb24KKwkgKi8KKwlpZiAoYXBwLT5wa3Rfb3V0ID09IE5VTEwpCisJCXJldHVybiAxOworCisJaWYgKCFhcHAtPnBrdF9vdXQoYXBwLCBjcCwgcHNrYiwgJmRpZmYpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICoJVXBkYXRlIGlwX3ZzIHNlcSBzdHVmZiBpZiBsZW4gaGFzIGNoYW5nZWQuCisJICovCisJaWYgKGRpZmYgIT0gMCkKKwkJdnNfc2VxX3VwZGF0ZShjcCwgJmNwLT5vdXRfc2VxLAorCQkJICAgICAgSVBfVlNfQ09OTl9GX09VVF9TRVEsIHNlcSwgZGlmZik7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqCU91dHB1dCBwa3QgaG9vay4gV2lsbCBjYWxsIGJvdW5kIGlwX3ZzX2FwcCBzcGVjaWZpYyBmdW5jdGlvbgorICoJY2FsbGVkIGJ5IGlwdnMgcGFja2V0IGhhbmRsZXIsIGFzc3VtZXMgcHJldmlvdXNseSBjaGVja2VkIGNwIT1OVUxMCisgKglyZXR1cm5zIGZhbHNlIGlmIGl0IGNhbid0IGhhbmRsZSBwYWNrZXQgKG9vbSkKKyAqLworaW50IGlwX3ZzX2FwcF9wa3Rfb3V0KHN0cnVjdCBpcF92c19jb25uICpjcCwgc3RydWN0IHNrX2J1ZmYgKipwc2tiKQoreworCXN0cnVjdCBpcF92c19hcHAgKmFwcDsKKworCS8qCisJICoJY2hlY2sgaWYgYXBwbGljYXRpb24gbW9kdWxlIGlzIGJvdW5kIHRvCisJICoJdGhpcyBpcF92c19jb25uLgorCSAqLworCWlmICgoYXBwID0gY3AtPmFwcCkgPT0gTlVMTCkKKwkJcmV0dXJuIDE7CisKKwkvKiBUQ1AgaXMgY29tcGxpY2F0ZWQgKi8KKwlpZiAoY3AtPnByb3RvY29sID09IElQUFJPVE9fVENQKQorCQlyZXR1cm4gYXBwX3RjcF9wa3Rfb3V0KGNwLCBwc2tiLCBhcHApOworCisJLyoKKwkgKglDYWxsIHByaXZhdGUgb3V0cHV0IGhvb2sgZnVuY3Rpb24KKwkgKi8KKwlpZiAoYXBwLT5wa3Rfb3V0ID09IE5VTEwpCisJCXJldHVybiAxOworCisJcmV0dXJuIGFwcC0+cGt0X291dChhcHAsIGNwLCBwc2tiLCBOVUxMKTsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBhcHBfdGNwX3BrdF9pbihzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsIHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCQkgc3RydWN0IGlwX3ZzX2FwcCAqYXBwKQoreworCWludCBkaWZmOworCXVuc2lnbmVkIGludCB0Y3Bfb2Zmc2V0ID0gKCpwc2tiKS0+bmguaXBoLT5paGwqNDsKKwlzdHJ1Y3QgdGNwaGRyICp0aDsKKwlfX3UzMiBzZXE7CisKKwlpZiAoIWlwX3ZzX21ha2Vfc2tiX3dyaXRhYmxlKHBza2IsIHRjcF9vZmZzZXQgKyBzaXplb2YoKnRoKSkpCisJCXJldHVybiAwOworCisJdGggPSAoc3RydWN0IHRjcGhkciAqKSgoKnBza2IpLT5uaC5yYXcgKyB0Y3Bfb2Zmc2V0KTsKKworCS8qCisJICoJUmVtZW1iZXIgc2VxIG51bWJlciBpbiBjYXNlIHRoaXMgcGt0IGdldHMgcmVzaXplZAorCSAqLworCXNlcSA9IG50b2hsKHRoLT5zZXEpOworCisJLyoKKwkgKglGaXggc2VxIHN0dWZmIGlmIGZsYWdnZWQgYXMgc28uCisJICovCisJaWYgKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9JTl9TRVEpCisJCXZzX2ZpeF9zZXEoJmNwLT5pbl9zZXEsIHRoKTsKKwlpZiAoY3AtPmZsYWdzICYgSVBfVlNfQ09OTl9GX09VVF9TRVEpCisJCXZzX2ZpeF9hY2tfc2VxKCZjcC0+b3V0X3NlcSwgdGgpOworCisJLyoKKwkgKglDYWxsIHByaXZhdGUgaW5wdXQgaG9vayBmdW5jdGlvbgorCSAqLworCWlmIChhcHAtPnBrdF9pbiA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKworCWlmICghYXBwLT5wa3RfaW4oYXBwLCBjcCwgcHNrYiwgJmRpZmYpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICoJVXBkYXRlIGlwX3ZzIHNlcSBzdHVmZiBpZiBsZW4gaGFzIGNoYW5nZWQuCisJICovCisJaWYgKGRpZmYgIT0gMCkKKwkJdnNfc2VxX3VwZGF0ZShjcCwgJmNwLT5pbl9zZXEsCisJCQkgICAgICBJUF9WU19DT05OX0ZfSU5fU0VRLCBzZXEsIGRpZmYpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKglJbnB1dCBwa3QgaG9vay4gV2lsbCBjYWxsIGJvdW5kIGlwX3ZzX2FwcCBzcGVjaWZpYyBmdW5jdGlvbgorICoJY2FsbGVkIGJ5IGlwdnMgcGFja2V0IGhhbmRsZXIsIGFzc3VtZXMgcHJldmlvdXNseSBjaGVja2VkIGNwIT1OVUxMLgorICoJcmV0dXJucyBmYWxzZSBpZiBjYW4ndCBoYW5kbGUgcGFja2V0IChvb20pLgorICovCitpbnQgaXBfdnNfYXBwX3BrdF9pbihzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsIHN0cnVjdCBza19idWZmICoqcHNrYikKK3sKKwlzdHJ1Y3QgaXBfdnNfYXBwICphcHA7CisKKwkvKgorCSAqCWNoZWNrIGlmIGFwcGxpY2F0aW9uIG1vZHVsZSBpcyBib3VuZCB0bworCSAqCXRoaXMgaXBfdnNfY29ubi4KKwkgKi8KKwlpZiAoKGFwcCA9IGNwLT5hcHApID09IE5VTEwpCisJCXJldHVybiAxOworCisJLyogVENQIGlzIGNvbXBsaWNhdGVkICovCisJaWYgKGNwLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkKKwkJcmV0dXJuIGFwcF90Y3BfcGt0X2luKGNwLCBwc2tiLCBhcHApOworCisJLyoKKwkgKglDYWxsIHByaXZhdGUgaW5wdXQgaG9vayBmdW5jdGlvbgorCSAqLworCWlmIChhcHAtPnBrdF9pbiA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKworCXJldHVybiBhcHAtPnBrdF9pbihhcHAsIGNwLCBwc2tiLCBOVUxMKTsKK30KKworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKy8qCisgKgkvcHJvYy9uZXQvaXBfdnNfYXBwIGVudHJ5IGZ1bmN0aW9uCisgKi8KKworc3RhdGljIHN0cnVjdCBpcF92c19hcHAgKmlwX3ZzX2FwcF9pZHgobG9mZl90IHBvcykKK3sKKwlzdHJ1Y3QgaXBfdnNfYXBwICphcHAsICppbmM7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFwcCwgJmlwX3ZzX2FwcF9saXN0LCBhX2xpc3QpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShpbmMsICZhcHAtPmluY3NfbGlzdCwgYV9saXN0KSB7CisJCQlpZiAocG9zLS0gPT0gMCkKKwkJCQlyZXR1cm4gaW5jOworCQl9CisJfQorCXJldHVybiBOVUxMOworCit9CisKK3N0YXRpYyB2b2lkICppcF92c19hcHBfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlkb3duKCZfX2lwX3ZzX2FwcF9tdXRleCk7CisKKwlyZXR1cm4gKnBvcyA/IGlwX3ZzX2FwcF9pZHgoKnBvcyAtIDEpIDogU0VRX1NUQVJUX1RPS0VOOworfQorCitzdGF0aWMgdm9pZCAqaXBfdnNfYXBwX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaXBfdnNfYXBwICppbmMsICphcHA7CisJc3RydWN0IGxpc3RfaGVhZCAqZTsKKworCSsrKnBvczsKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXJldHVybiBpcF92c19hcHBfaWR4KDApOworCisJaW5jID0gdjsKKwlhcHAgPSBpbmMtPmFwcDsKKworCWlmICgoZSA9IGluYy0+YV9saXN0Lm5leHQpICE9ICZhcHAtPmluY3NfbGlzdCkKKwkJcmV0dXJuIGxpc3RfZW50cnkoZSwgc3RydWN0IGlwX3ZzX2FwcCwgYV9saXN0KTsKKworCS8qIGdvIG9uIHRvIG5leHQgYXBwbGljYXRpb24gKi8KKwlmb3IgKGUgPSBhcHAtPmFfbGlzdC5uZXh0OyBlICE9ICZpcF92c19hcHBfbGlzdDsgZSA9IGUtPm5leHQpIHsKKwkJYXBwID0gbGlzdF9lbnRyeShlLCBzdHJ1Y3QgaXBfdnNfYXBwLCBhX2xpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGluYywgJmFwcC0+aW5jc19saXN0LCBhX2xpc3QpIHsKKwkJCXJldHVybiBpbmM7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGlwX3ZzX2FwcF9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwl1cCgmX19pcF92c19hcHBfbXV0ZXgpOworfQorCitzdGF0aWMgaW50IGlwX3ZzX2FwcF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXNlcV9wdXRzKHNlcSwgInByb3QgcG9ydCAgICB1c2VjbnQgbmFtZVxuIik7CisJZWxzZSB7CisJCWNvbnN0IHN0cnVjdCBpcF92c19hcHAgKmluYyA9IHY7CisKKwkJc2VxX3ByaW50ZihzZXEsICIlLTNzICAlLTd1ICUtNmQgJS0xN3NcbiIsCisJCQkgICBpcF92c19wcm90b19uYW1lKGluYy0+cHJvdG9jb2wpLAorCQkJICAgbnRvaHMoaW5jLT5wb3J0KSwKKwkJCSAgIGF0b21pY19yZWFkKCZpbmMtPnVzZWNudCksCisJCQkgICBpbmMtPm5hbWUpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBpcF92c19hcHBfc2VxX29wcyA9IHsKKwkuc3RhcnQgPSBpcF92c19hcHBfc2VxX3N0YXJ0LAorCS5uZXh0ICA9IGlwX3ZzX2FwcF9zZXFfbmV4dCwKKwkuc3RvcCAgPSBpcF92c19hcHBfc2VxX3N0b3AsCisJLnNob3cgID0gaXBfdnNfYXBwX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBpcF92c19hcHBfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmlwX3ZzX2FwcF9zZXFfb3BzKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXBfdnNfYXBwX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5vcGVuCSA9IGlwX3ZzX2FwcF9vcGVuLAorCS5yZWFkCSA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworI2VuZGlmCisKKworLyoKKyAqCVJlcGxhY2UgYSBzZWdtZW50IG9mIGRhdGEgd2l0aCBhIG5ldyBzZWdtZW50CisgKi8KK2ludCBpcF92c19za2JfcmVwbGFjZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcHJpLAorCQkgICAgICBjaGFyICpvX2J1ZiwgaW50IG9fbGVuLCBjaGFyICpuX2J1ZiwgaW50IG5fbGVuKQoreworCXN0cnVjdCBpcGhkciAqaXBoOworCWludCBkaWZmOworCWludCBvX29mZnNldDsKKwlpbnQgb19sZWZ0OworCisJRW50ZXJGdW5jdGlvbig5KTsKKworCWRpZmYgPSBuX2xlbiAtIG9fbGVuOworCW9fb2Zmc2V0ID0gb19idWYgLSAoY2hhciAqKXNrYi0+ZGF0YTsKKwkvKiBUaGUgbGVuZ3RoIG9mIGxlZnQgZGF0YSBhZnRlciBvX2J1ZitvX2xlbiBpbiB0aGUgc2tiIGRhdGEgKi8KKwlvX2xlZnQgPSBza2ItPmxlbiAtIChvX29mZnNldCArIG9fbGVuKTsKKworCWlmIChkaWZmIDw9IDApIHsKKwkJbWVtbW92ZShvX2J1ZiArIG5fbGVuLCBvX2J1ZiArIG9fbGVuLCBvX2xlZnQpOworCQltZW1jcHkob19idWYsIG5fYnVmLCBuX2xlbik7CisJCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gKyBkaWZmKTsKKwl9IGVsc2UgaWYgKGRpZmYgPD0gc2tiX3RhaWxyb29tKHNrYikpIHsKKwkJc2tiX3B1dChza2IsIGRpZmYpOworCQltZW1tb3ZlKG9fYnVmICsgbl9sZW4sIG9fYnVmICsgb19sZW4sIG9fbGVmdCk7CisJCW1lbWNweShvX2J1Ziwgbl9idWYsIG5fbGVuKTsKKwl9IGVsc2UgeworCQlpZiAocHNrYl9leHBhbmRfaGVhZChza2IsIHNrYl9oZWFkcm9vbShza2IpLCBkaWZmLCBwcmkpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXNrYl9wdXQoc2tiLCBkaWZmKTsKKwkJbWVtbW92ZShza2ItPmRhdGEgKyBvX29mZnNldCArIG5fbGVuLAorCQkJc2tiLT5kYXRhICsgb19vZmZzZXQgKyBvX2xlbiwgb19sZWZ0KTsKKwkJbWVtY3B5KHNrYi0+ZGF0YSArIG9fb2Zmc2V0LCBuX2J1Ziwgbl9sZW4pOworCX0KKworCS8qIG11c3QgdXBkYXRlIHRoZSBpcGggdG90YWwgbGVuZ3RoIGhlcmUgKi8KKwlpcGggPSBza2ItPm5oLmlwaDsKKwlpcGgtPnRvdF9sZW4gPSBodG9ucyhza2ItPmxlbik7CisKKwlMZWF2ZUZ1bmN0aW9uKDkpOworCXJldHVybiAwOworfQorCisKK2ludCBpcF92c19hcHBfaW5pdCh2b2lkKQoreworCS8qIHdlIHdpbGwgcmVwbGFjZSBpdCB3aXRoIHByb2NfbmV0X2lwdnNfY3JlYXRlKCkgc29vbiAqLworCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJpcF92c19hcHAiLCAwLCAmaXBfdnNfYXBwX2ZvcHMpOworCXJldHVybiAwOworfQorCisKK3ZvaWQgaXBfdnNfYXBwX2NsZWFudXAodm9pZCkKK3sKKwlwcm9jX25ldF9yZW1vdmUoImlwX3ZzX2FwcCIpOworfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19jb25uLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2Nvbm4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDZmZWI1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c19jb25uLmMKQEAgLTAsMCArMSw5MjAgQEAKKy8qCisgKiBJUFZTICAgICAgICAgQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIElQIHZpcnR1YWwgc2VydmVyIHN1cHBvcnQgZm9yIHRoZQorICogICAgICAgICAgICAgIExJTlVYIG9wZXJhdGluZyBzeXN0ZW0uICBJUFZTIGlzIG5vdyBpbXBsZW1lbnRlZCBhcyBhIG1vZHVsZQorICogICAgICAgICAgICAgIG92ZXIgdGhlIE5ldGZpbHRlciBmcmFtZXdvcmsuIElQVlMgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYQorICogICAgICAgICAgICAgIGhpZ2gtcGVyZm9ybWFuY2UgYW5kIGhpZ2hseSBhdmFpbGFibGUgc2VydmVyIGJhc2VkIG9uIGEKKyAqICAgICAgICAgICAgICBjbHVzdGVyIG9mIHNlcnZlcnMuCisgKgorICogVmVyc2lvbjogICAgICRJZDogaXBfdnNfY29ubi5jLHYgMS4zMSAyMDAzLzA0LzE4IDA5OjAzOjE2IHdlbnNvbmcgRXhwICQKKyAqCisgKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgorICogICAgICAgICAgICAgIFBldGVyIEtlc2UgPHBldGVyLmtlc2VAaWpzLnNpPgorICogICAgICAgICAgICAgIEp1bGlhbiBBbmFzdGFzb3YgPGphQHNzaS5iZz4KKyAqCisgKiAgICAgICAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICAgICAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgICAgICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgICAgICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgSVBWUyBjb2RlIGZvciBrZXJuZWwgMi4yIHdhcyBkb25lIGJ5IFdlbnNvbmcgWmhhbmcgYW5kIFBldGVyIEtlc2UsCisgKiB3aXRoIGNoYW5nZXMvZml4ZXMgZnJvbSBKdWxpYW4gQW5hc3Rhc292LCBMYXJzIE1hcm93c2t5LUJyZWUsIEhvcm1zCisgKiBhbmQgb3RoZXJzLiBNYW55IGNvZGUgaGVyZSBpcyB0YWtlbiBmcm9tIElQIE1BU1EgY29kZSBvZiBrZXJuZWwgMi4yLgorICoKKyAqIENoYW5nZXM6CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgkJLyogZm9yIHByb2NfbmV0XyogKi8KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisKKyNpbmNsdWRlIDxuZXQvaXBfdnMuaD4KKworCisvKgorICogIENvbm5lY3Rpb24gaGFzaCB0YWJsZTogZm9yIGlucHV0IGFuZCBvdXRwdXQgcGFja2V0cyBsb29rdXBzIG9mIElQVlMKKyAqLworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKmlwX3ZzX2Nvbm5fdGFiOworCisvKiAgU0xBQiBjYWNoZSBmb3IgSVBWUyBjb25uZWN0aW9ucyAqLworc3RhdGljIGttZW1fY2FjaGVfdCAqaXBfdnNfY29ubl9jYWNoZXA7CisKKy8qICBjb3VudGVyIGZvciBjdXJyZW50IElQVlMgY29ubmVjdGlvbnMgKi8KK3N0YXRpYyBhdG9taWNfdCBpcF92c19jb25uX2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7CisKKy8qICBjb3VudGVyIGZvciBubyBjbGllbnQgcG9ydCBjb25uZWN0aW9ucyAqLworc3RhdGljIGF0b21pY190IGlwX3ZzX2Nvbm5fbm9fY3BvcnRfY250ID0gQVRPTUlDX0lOSVQoMCk7CisKKy8qIHJhbmRvbSB2YWx1ZSBmb3IgSVBWUyBjb25uZWN0aW9uIGhhc2ggKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXBfdnNfY29ubl9ybmQ7CisKKy8qCisgKiAgRmluZSBsb2NraW5nIGdyYW51bGFyaXR5IGZvciBiaWcgY29ubmVjdGlvbiBoYXNoIHRhYmxlCisgKi8KKyNkZWZpbmUgQ1RfTE9DS0FSUkFZX0JJVFMgIDQKKyNkZWZpbmUgQ1RfTE9DS0FSUkFZX1NJWkUgICgxPDxDVF9MT0NLQVJSQVlfQklUUykKKyNkZWZpbmUgQ1RfTE9DS0FSUkFZX01BU0sgIChDVF9MT0NLQVJSQVlfU0laRS0xKQorCitzdHJ1Y3QgaXBfdnNfYWxpZ25lZF9sb2NrCit7CisJcndsb2NrX3QJbDsKK30gX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oU01QX0NBQ0hFX0JZVEVTKSkpOworCisvKiBsb2NrIGFycmF5IGZvciBjb25uIHRhYmxlICovCitzdGF0aWMgc3RydWN0IGlwX3ZzX2FsaWduZWRfbG9jaworX19pcF92c19jb25udGJsX2xvY2tfYXJyYXlbQ1RfTE9DS0FSUkFZX1NJWkVdIF9fY2FjaGVsaW5lX2FsaWduZWQ7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjdF9yZWFkX2xvY2sodW5zaWduZWQga2V5KQoreworCXJlYWRfbG9jaygmX19pcF92c19jb25udGJsX2xvY2tfYXJyYXlba2V5JkNUX0xPQ0tBUlJBWV9NQVNLXS5sKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGN0X3JlYWRfdW5sb2NrKHVuc2lnbmVkIGtleSkKK3sKKwlyZWFkX3VubG9jaygmX19pcF92c19jb25udGJsX2xvY2tfYXJyYXlba2V5JkNUX0xPQ0tBUlJBWV9NQVNLXS5sKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGN0X3dyaXRlX2xvY2sodW5zaWduZWQga2V5KQoreworCXdyaXRlX2xvY2soJl9faXBfdnNfY29ubnRibF9sb2NrX2FycmF5W2tleSZDVF9MT0NLQVJSQVlfTUFTS10ubCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjdF93cml0ZV91bmxvY2sodW5zaWduZWQga2V5KQoreworCXdyaXRlX3VubG9jaygmX19pcF92c19jb25udGJsX2xvY2tfYXJyYXlba2V5JkNUX0xPQ0tBUlJBWV9NQVNLXS5sKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGN0X3JlYWRfbG9ja19iaCh1bnNpZ25lZCBrZXkpCit7CisJcmVhZF9sb2NrX2JoKCZfX2lwX3ZzX2Nvbm50YmxfbG9ja19hcnJheVtrZXkmQ1RfTE9DS0FSUkFZX01BU0tdLmwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3RfcmVhZF91bmxvY2tfYmgodW5zaWduZWQga2V5KQoreworCXJlYWRfdW5sb2NrX2JoKCZfX2lwX3ZzX2Nvbm50YmxfbG9ja19hcnJheVtrZXkmQ1RfTE9DS0FSUkFZX01BU0tdLmwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3Rfd3JpdGVfbG9ja19iaCh1bnNpZ25lZCBrZXkpCit7CisJd3JpdGVfbG9ja19iaCgmX19pcF92c19jb25udGJsX2xvY2tfYXJyYXlba2V5JkNUX0xPQ0tBUlJBWV9NQVNLXS5sKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGN0X3dyaXRlX3VubG9ja19iaCh1bnNpZ25lZCBrZXkpCit7CisJd3JpdGVfdW5sb2NrX2JoKCZfX2lwX3ZzX2Nvbm50YmxfbG9ja19hcnJheVtrZXkmQ1RfTE9DS0FSUkFZX01BU0tdLmwpOworfQorCisKKy8qCisgKglSZXR1cm5zIGhhc2ggdmFsdWUgZm9yIElQVlMgY29ubmVjdGlvbiBlbnRyeQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGlwX3ZzX2Nvbm5faGFzaGtleSh1bnNpZ25lZCBwcm90bywgX191MzIgYWRkciwgX191MTYgcG9ydCkKK3sKKwlyZXR1cm4gamhhc2hfM3dvcmRzKGFkZHIsIHBvcnQsIHByb3RvLCBpcF92c19jb25uX3JuZCkKKwkJJiBJUF9WU19DT05OX1RBQl9NQVNLOworfQorCisKKy8qCisgKglIYXNoZXMgaXBfdnNfY29ubiBpbiBpcF92c19jb25uX3RhYiBieSBwcm90byxhZGRyLHBvcnQuCisgKglyZXR1cm5zIGJvb2wgc3VjY2Vzcy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgaXBfdnNfY29ubl9oYXNoKHN0cnVjdCBpcF92c19jb25uICpjcCkKK3sKKwl1bnNpZ25lZCBoYXNoOworCWludCByZXQ7CisKKwkvKiBIYXNoIGJ5IHByb3RvY29sLCBjbGllbnQgYWRkcmVzcyBhbmQgcG9ydCAqLworCWhhc2ggPSBpcF92c19jb25uX2hhc2hrZXkoY3AtPnByb3RvY29sLCBjcC0+Y2FkZHIsIGNwLT5jcG9ydCk7CisKKwljdF93cml0ZV9sb2NrKGhhc2gpOworCisJaWYgKCEoY3AtPmZsYWdzICYgSVBfVlNfQ09OTl9GX0hBU0hFRCkpIHsKKwkJbGlzdF9hZGQoJmNwLT5jX2xpc3QsICZpcF92c19jb25uX3RhYltoYXNoXSk7CisJCWNwLT5mbGFncyB8PSBJUF9WU19DT05OX0ZfSEFTSEVEOworCQlhdG9taWNfaW5jKCZjcC0+cmVmY250KTsKKwkJcmV0ID0gMTsKKwl9IGVsc2UgeworCQlJUF9WU19FUlIoImlwX3ZzX2Nvbm5faGFzaCgpOiByZXF1ZXN0IGZvciBhbHJlYWR5IGhhc2hlZCwgIgorCQkJICAiY2FsbGVkIGZyb20gJXBcbiIsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CisJCXJldCA9IDA7CisJfQorCisJY3Rfd3JpdGVfdW5sb2NrKGhhc2gpOworCisJcmV0dXJuIHJldDsKK30KKworCisvKgorICoJVU5oYXNoZXMgaXBfdnNfY29ubiBmcm9tIGlwX3ZzX2Nvbm5fdGFiLgorICoJcmV0dXJucyBib29sIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlwX3ZzX2Nvbm5fdW5oYXNoKHN0cnVjdCBpcF92c19jb25uICpjcCkKK3sKKwl1bnNpZ25lZCBoYXNoOworCWludCByZXQ7CisKKwkvKiB1bmhhc2ggaXQgYW5kIGRlY3JlYXNlIGl0cyByZWZlcmVuY2UgY291bnRlciAqLworCWhhc2ggPSBpcF92c19jb25uX2hhc2hrZXkoY3AtPnByb3RvY29sLCBjcC0+Y2FkZHIsIGNwLT5jcG9ydCk7CisKKwljdF93cml0ZV9sb2NrKGhhc2gpOworCisJaWYgKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9IQVNIRUQpIHsKKwkJbGlzdF9kZWwoJmNwLT5jX2xpc3QpOworCQljcC0+ZmxhZ3MgJj0gfklQX1ZTX0NPTk5fRl9IQVNIRUQ7CisJCWF0b21pY19kZWMoJmNwLT5yZWZjbnQpOworCQlyZXQgPSAxOworCX0gZWxzZQorCQlyZXQgPSAwOworCisJY3Rfd3JpdGVfdW5sb2NrKGhhc2gpOworCisJcmV0dXJuIHJldDsKK30KKworCisvKgorICogIEdldHMgaXBfdnNfY29ubiBhc3NvY2lhdGVkIHdpdGggc3VwcGxpZWQgcGFyYW1ldGVycyBpbiB0aGUgaXBfdnNfY29ubl90YWIuCisgKiAgQ2FsbGVkIGZvciBwa3RzIGNvbWluZyBmcm9tIE9VVHNpZGUtdG8tSU5zaWRlLgorICoJc19hZGRyLCBzX3BvcnQ6IHBrdCBzb3VyY2UgYWRkcmVzcyAoZm9yZWlnbiBob3N0KQorICoJZF9hZGRyLCBkX3BvcnQ6IHBrdCBkZXN0IGFkZHJlc3MgKGxvYWQgYmFsYW5jZXIpCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwX3ZzX2Nvbm4gKl9faXBfdnNfY29ubl9pbl9nZXQKKyhpbnQgcHJvdG9jb2wsIF9fdTMyIHNfYWRkciwgX191MTYgc19wb3J0LCBfX3UzMiBkX2FkZHIsIF9fdTE2IGRfcG9ydCkKK3sKKwl1bnNpZ25lZCBoYXNoOworCXN0cnVjdCBpcF92c19jb25uICpjcDsKKworCWhhc2ggPSBpcF92c19jb25uX2hhc2hrZXkocHJvdG9jb2wsIHNfYWRkciwgc19wb3J0KTsKKworCWN0X3JlYWRfbG9jayhoYXNoKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3AsICZpcF92c19jb25uX3RhYltoYXNoXSwgY19saXN0KSB7CisJCWlmIChzX2FkZHI9PWNwLT5jYWRkciAmJiBzX3BvcnQ9PWNwLT5jcG9ydCAmJgorCQkgICAgZF9wb3J0PT1jcC0+dnBvcnQgJiYgZF9hZGRyPT1jcC0+dmFkZHIgJiYKKwkJICAgIHByb3RvY29sPT1jcC0+cHJvdG9jb2wpIHsKKwkJCS8qIEhJVCAqLworCQkJYXRvbWljX2luYygmY3AtPnJlZmNudCk7CisJCQljdF9yZWFkX3VubG9jayhoYXNoKTsKKwkJCXJldHVybiBjcDsKKwkJfQorCX0KKworCWN0X3JlYWRfdW5sb2NrKGhhc2gpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBpcF92c19jb25uICppcF92c19jb25uX2luX2dldAorKGludCBwcm90b2NvbCwgX191MzIgc19hZGRyLCBfX3UxNiBzX3BvcnQsIF9fdTMyIGRfYWRkciwgX191MTYgZF9wb3J0KQoreworCXN0cnVjdCBpcF92c19jb25uICpjcDsKKworCWNwID0gX19pcF92c19jb25uX2luX2dldChwcm90b2NvbCwgc19hZGRyLCBzX3BvcnQsIGRfYWRkciwgZF9wb3J0KTsKKwlpZiAoIWNwICYmIGF0b21pY19yZWFkKCZpcF92c19jb25uX25vX2Nwb3J0X2NudCkpCisJCWNwID0gX19pcF92c19jb25uX2luX2dldChwcm90b2NvbCwgc19hZGRyLCAwLCBkX2FkZHIsIGRfcG9ydCk7CisKKwlJUF9WU19EQkcoNywgImxvb2t1cC9pbiAlcyAldS4ldS4ldS4ldTolZC0+JXUuJXUuJXUuJXU6JWQgJXNcbiIsCisJCSAgaXBfdnNfcHJvdG9fbmFtZShwcm90b2NvbCksCisJCSAgTklQUVVBRChzX2FkZHIpLCBudG9ocyhzX3BvcnQpLAorCQkgIE5JUFFVQUQoZF9hZGRyKSwgbnRvaHMoZF9wb3J0KSwKKwkJICBjcD8iaGl0Ijoibm90IGhpdCIpOworCisJcmV0dXJuIGNwOworfQorCisKKy8qCisgKiAgR2V0cyBpcF92c19jb25uIGFzc29jaWF0ZWQgd2l0aCBzdXBwbGllZCBwYXJhbWV0ZXJzIGluIHRoZSBpcF92c19jb25uX3RhYi4KKyAqICBDYWxsZWQgZm9yIHBrdHMgY29taW5nIGZyb20gaW5zaWRlLXRvLU9VVHNpZGUuCisgKglzX2FkZHIsIHNfcG9ydDogcGt0IHNvdXJjZSBhZGRyZXNzIChpbnNpZGUgaG9zdCkKKyAqCWRfYWRkciwgZF9wb3J0OiBwa3QgZGVzdCBhZGRyZXNzIChmb3JlaWduIGhvc3QpCisgKi8KK3N0cnVjdCBpcF92c19jb25uICppcF92c19jb25uX291dF9nZXQKKyhpbnQgcHJvdG9jb2wsIF9fdTMyIHNfYWRkciwgX191MTYgc19wb3J0LCBfX3UzMiBkX2FkZHIsIF9fdTE2IGRfcG9ydCkKK3sKKwl1bnNpZ25lZCBoYXNoOworCXN0cnVjdCBpcF92c19jb25uICpjcCwgKnJldD1OVUxMOworCisJLyoKKwkgKglDaGVjayBmb3IgImZ1bGwiIGFkZHJlc3NlZCBlbnRyaWVzCisJICovCisJaGFzaCA9IGlwX3ZzX2Nvbm5faGFzaGtleShwcm90b2NvbCwgZF9hZGRyLCBkX3BvcnQpOworCisJY3RfcmVhZF9sb2NrKGhhc2gpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcCwgJmlwX3ZzX2Nvbm5fdGFiW2hhc2hdLCBjX2xpc3QpIHsKKwkJaWYgKGRfYWRkciA9PSBjcC0+Y2FkZHIgJiYgZF9wb3J0ID09IGNwLT5jcG9ydCAmJgorCQkgICAgc19wb3J0ID09IGNwLT5kcG9ydCAmJiBzX2FkZHIgPT0gY3AtPmRhZGRyICYmCisJCSAgICBwcm90b2NvbCA9PSBjcC0+cHJvdG9jb2wpIHsKKwkJCS8qIEhJVCAqLworCQkJYXRvbWljX2luYygmY3AtPnJlZmNudCk7CisJCQlyZXQgPSBjcDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJY3RfcmVhZF91bmxvY2soaGFzaCk7CisKKwlJUF9WU19EQkcoNywgImxvb2t1cC9vdXQgJXMgJXUuJXUuJXUuJXU6JWQtPiV1LiV1LiV1LiV1OiVkICVzXG4iLAorCQkgIGlwX3ZzX3Byb3RvX25hbWUocHJvdG9jb2wpLAorCQkgIE5JUFFVQUQoc19hZGRyKSwgbnRvaHMoc19wb3J0KSwKKwkJICBOSVBRVUFEKGRfYWRkciksIG50b2hzKGRfcG9ydCksCisJCSAgcmV0PyJoaXQiOiJub3QgaGl0Iik7CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiAgICAgIFB1dCBiYWNrIHRoZSBjb25uIGFuZCByZXN0YXJ0IGl0cyB0aW1lciB3aXRoIGl0cyB0aW1lb3V0CisgKi8KK3ZvaWQgaXBfdnNfY29ubl9wdXQoc3RydWN0IGlwX3ZzX2Nvbm4gKmNwKQoreworCS8qIHJlc2V0IGl0IGV4cGlyZSBpbiBpdHMgdGltZW91dCAqLworCW1vZF90aW1lcigmY3AtPnRpbWVyLCBqaWZmaWVzK2NwLT50aW1lb3V0KTsKKworCV9faXBfdnNfY29ubl9wdXQoY3ApOworfQorCisKKy8qCisgKglGaWxsIGEgbm9fY2xpZW50X3BvcnQgY29ubmVjdGlvbiB3aXRoIGEgY2xpZW50IHBvcnQgbnVtYmVyCisgKi8KK3ZvaWQgaXBfdnNfY29ubl9maWxsX2Nwb3J0KHN0cnVjdCBpcF92c19jb25uICpjcCwgX191MTYgY3BvcnQpCit7CisJaWYgKGlwX3ZzX2Nvbm5fdW5oYXNoKGNwKSkgeworCQlzcGluX2xvY2soJmNwLT5sb2NrKTsKKwkJaWYgKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9OT19DUE9SVCkgeworCQkJYXRvbWljX2RlYygmaXBfdnNfY29ubl9ub19jcG9ydF9jbnQpOworCQkJY3AtPmZsYWdzICY9IH5JUF9WU19DT05OX0ZfTk9fQ1BPUlQ7CisJCQljcC0+Y3BvcnQgPSBjcG9ydDsKKwkJfQorCQlzcGluX3VubG9jaygmY3AtPmxvY2spOworCisJCS8qIGhhc2ggb24gbmV3IGRwb3J0ICovCisJCWlwX3ZzX2Nvbm5faGFzaChjcCk7CisJfQorfQorCisKKy8qCisgKglCaW5kIGEgY29ubmVjdGlvbiBlbnRyeSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHBhY2tldF94bWl0LgorICoJQ2FsbGVkIGJ5IGlwX3ZzX2Nvbm5fbmV3LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXBfdnNfYmluZF94bWl0KHN0cnVjdCBpcF92c19jb25uICpjcCkKK3sKKwlzd2l0Y2ggKElQX1ZTX0ZXRF9NRVRIT0QoY3ApKSB7CisJY2FzZSBJUF9WU19DT05OX0ZfTUFTUToKKwkJY3AtPnBhY2tldF94bWl0ID0gaXBfdnNfbmF0X3htaXQ7CisJCWJyZWFrOworCisJY2FzZSBJUF9WU19DT05OX0ZfVFVOTkVMOgorCQljcC0+cGFja2V0X3htaXQgPSBpcF92c190dW5uZWxfeG1pdDsKKwkJYnJlYWs7CisKKwljYXNlIElQX1ZTX0NPTk5fRl9EUk9VVEU6CisJCWNwLT5wYWNrZXRfeG1pdCA9IGlwX3ZzX2RyX3htaXQ7CisJCWJyZWFrOworCisJY2FzZSBJUF9WU19DT05OX0ZfTE9DQUxOT0RFOgorCQljcC0+cGFja2V0X3htaXQgPSBpcF92c19udWxsX3htaXQ7CisJCWJyZWFrOworCisJY2FzZSBJUF9WU19DT05OX0ZfQllQQVNTOgorCQljcC0+cGFja2V0X3htaXQgPSBpcF92c19ieXBhc3NfeG1pdDsKKwkJYnJlYWs7CisJfQorfQorCisKK3N0YXRpYyBpbmxpbmUgaW50IGlwX3ZzX2Rlc3RfdG90YWxjb25ucyhzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCkKK3sKKwlyZXR1cm4gYXRvbWljX3JlYWQoJmRlc3QtPmFjdGl2ZWNvbm5zKQorCQkrIGF0b21pY19yZWFkKCZkZXN0LT5pbmFjdGNvbm5zKTsKK30KKworLyoKKyAqCUJpbmQgYSBjb25uZWN0aW9uIGVudHJ5IHdpdGggYSB2aXJ0dWFsIHNlcnZpY2UgZGVzdGluYXRpb24KKyAqCUNhbGxlZCBqdXN0IGFmdGVyIGEgbmV3IGNvbm5lY3Rpb24gZW50cnkgaXMgY3JlYXRlZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitpcF92c19iaW5kX2Rlc3Qoc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCBzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCkKK3sKKwkvKiBpZiBkZXN0IGlzIE5VTEwsIHRoZW4gcmV0dXJuIGRpcmVjdGx5ICovCisJaWYgKCFkZXN0KQorCQlyZXR1cm47CisKKwkvKiBJbmNyZWFzZSB0aGUgcmVmY250IGNvdW50ZXIgb2YgdGhlIGRlc3QgKi8KKwlhdG9taWNfaW5jKCZkZXN0LT5yZWZjbnQpOworCisJLyogQmluZCB3aXRoIHRoZSBkZXN0aW5hdGlvbiBhbmQgaXRzIGNvcnJlc3BvbmRpbmcgdHJhbnNtaXR0ZXIgKi8KKwljcC0+ZmxhZ3MgfD0gYXRvbWljX3JlYWQoJmRlc3QtPmNvbm5fZmxhZ3MpOworCWNwLT5kZXN0ID0gZGVzdDsKKworCUlQX1ZTX0RCRyg5LCAiQmluZC1kZXN0ICVzIGM6JXUuJXUuJXUuJXU6JWQgdjoldS4ldS4ldS4ldTolZCAiCisJCSAgImQ6JXUuJXUuJXUuJXU6JWQgZndkOiVjIHM6JXUgZmxnOiVYIGNudDolZCBkZXN0Y250OiVkXG4iLAorCQkgIGlwX3ZzX3Byb3RvX25hbWUoY3AtPnByb3RvY29sKSwKKwkJICBOSVBRVUFEKGNwLT5jYWRkciksIG50b2hzKGNwLT5jcG9ydCksCisJCSAgTklQUVVBRChjcC0+dmFkZHIpLCBudG9ocyhjcC0+dnBvcnQpLAorCQkgIE5JUFFVQUQoY3AtPmRhZGRyKSwgbnRvaHMoY3AtPmRwb3J0KSwKKwkJICBpcF92c19md2RfdGFnKGNwKSwgY3AtPnN0YXRlLAorCQkgIGNwLT5mbGFncywgYXRvbWljX3JlYWQoJmNwLT5yZWZjbnQpLAorCQkgIGF0b21pY19yZWFkKCZkZXN0LT5yZWZjbnQpKTsKKworCS8qIFVwZGF0ZSB0aGUgY29ubmVjdGlvbiBjb3VudGVycyAqLworCWlmIChjcC0+Y3BvcnQgfHwgKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9OT19DUE9SVCkpIHsKKwkJLyogSXQgaXMgYSBub3JtYWwgY29ubmVjdGlvbiwgc28gaW5jcmVhc2UgdGhlIGluYWN0aXZlCisJCSAgIGNvbm5lY3Rpb24gY291bnRlciBiZWNhdXNlIGl0IGlzIGluIFRDUCBTWU5SRUNWCisJCSAgIHN0YXRlIChpbmFjdGl2ZSkgb3Igb3RoZXIgcHJvdG9jb2wgaW5hY2l2ZSBzdGF0ZSAqLworCQlhdG9taWNfaW5jKCZkZXN0LT5pbmFjdGNvbm5zKTsKKwl9IGVsc2UgeworCQkvKiBJdCBpcyBhIHBlcnNpc3RlbnQgY29ubmVjdGlvbi90ZW1wbGF0ZSwgc28gaW5jcmVhc2UKKwkJICAgdGhlIHBlcmlzdGVudCBjb25uZWN0aW9uIGNvdW50ZXIgKi8KKwkJYXRvbWljX2luYygmZGVzdC0+cGVyc2lzdGNvbm5zKTsKKwl9CisKKwlpZiAoZGVzdC0+dV90aHJlc2hvbGQgIT0gMCAmJgorCSAgICBpcF92c19kZXN0X3RvdGFsY29ubnMoZGVzdCkgPj0gZGVzdC0+dV90aHJlc2hvbGQpCisJCWRlc3QtPmZsYWdzIHw9IElQX1ZTX0RFU1RfRl9PVkVSTE9BRDsKK30KKworCisvKgorICoJVW5iaW5kIGEgY29ubmVjdGlvbiBlbnRyeSB3aXRoIGl0cyBWUyBkZXN0aW5hdGlvbgorICoJQ2FsbGVkIGJ5IHRoZSBpcF92c19jb25uX2V4cGlyZSBmdW5jdGlvbi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGlwX3ZzX3VuYmluZF9kZXN0KHN0cnVjdCBpcF92c19jb25uICpjcCkKK3sKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCA9IGNwLT5kZXN0OworCisJaWYgKCFkZXN0KQorCQlyZXR1cm47CisKKwlJUF9WU19EQkcoOSwgIlVuYmluZC1kZXN0ICVzIGM6JXUuJXUuJXUuJXU6JWQgdjoldS4ldS4ldS4ldTolZCAiCisJCSAgImQ6JXUuJXUuJXUuJXU6JWQgZndkOiVjIHM6JXUgZmxnOiVYIGNudDolZCBkZXN0Y250OiVkXG4iLAorCQkgIGlwX3ZzX3Byb3RvX25hbWUoY3AtPnByb3RvY29sKSwKKwkJICBOSVBRVUFEKGNwLT5jYWRkciksIG50b2hzKGNwLT5jcG9ydCksCisJCSAgTklQUVVBRChjcC0+dmFkZHIpLCBudG9ocyhjcC0+dnBvcnQpLAorCQkgIE5JUFFVQUQoY3AtPmRhZGRyKSwgbnRvaHMoY3AtPmRwb3J0KSwKKwkJICBpcF92c19md2RfdGFnKGNwKSwgY3AtPnN0YXRlLAorCQkgIGNwLT5mbGFncywgYXRvbWljX3JlYWQoJmNwLT5yZWZjbnQpLAorCQkgIGF0b21pY19yZWFkKCZkZXN0LT5yZWZjbnQpKTsKKworCS8qIFVwZGF0ZSB0aGUgY29ubmVjdGlvbiBjb3VudGVycyAqLworCWlmIChjcC0+Y3BvcnQgfHwgKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9OT19DUE9SVCkpIHsKKwkJLyogSXQgaXMgYSBub3JtYWwgY29ubmVjdGlvbiwgc28gZGVjcmVhc2UgdGhlIGluYWN0Y29ubnMKKwkJICAgb3IgYWN0aXZlY29ubnMgY291bnRlciAqLworCQlpZiAoY3AtPmZsYWdzICYgSVBfVlNfQ09OTl9GX0lOQUNUSVZFKSB7CisJCQlhdG9taWNfZGVjKCZkZXN0LT5pbmFjdGNvbm5zKTsKKwkJfSBlbHNlIHsKKwkJCWF0b21pY19kZWMoJmRlc3QtPmFjdGl2ZWNvbm5zKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIEl0IGlzIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uL3RlbXBsYXRlLCBzbyBkZWNyZWFzZQorCQkgICB0aGUgcGVyaXN0ZW50IGNvbm5lY3Rpb24gY291bnRlciAqLworCQlhdG9taWNfZGVjKCZkZXN0LT5wZXJzaXN0Y29ubnMpOworCX0KKworCWlmIChkZXN0LT5sX3RocmVzaG9sZCAhPSAwKSB7CisJCWlmIChpcF92c19kZXN0X3RvdGFsY29ubnMoZGVzdCkgPCBkZXN0LT5sX3RocmVzaG9sZCkKKwkJCWRlc3QtPmZsYWdzICY9IH5JUF9WU19ERVNUX0ZfT1ZFUkxPQUQ7CisJfSBlbHNlIGlmIChkZXN0LT51X3RocmVzaG9sZCAhPSAwKSB7CisJCWlmIChpcF92c19kZXN0X3RvdGFsY29ubnMoZGVzdCkgKiA0IDwgZGVzdC0+dV90aHJlc2hvbGQgKiAzKQorCQkJZGVzdC0+ZmxhZ3MgJj0gfklQX1ZTX0RFU1RfRl9PVkVSTE9BRDsKKwl9IGVsc2UgeworCQlpZiAoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfT1ZFUkxPQUQpCisJCQlkZXN0LT5mbGFncyAmPSB+SVBfVlNfREVTVF9GX09WRVJMT0FEOworCX0KKworCS8qCisJICogU2ltcGx5IGRlY3JlYXNlIHRoZSByZWZjbnQgb2YgdGhlIGRlc3QsIGJlY2F1c2UgdGhlCisJICogZGVzdCB3aWxsIGJlIGVpdGhlciBpbiBzZXJ2aWNlJ3MgZGVzdGluYXRpb24gbGlzdAorCSAqIG9yIGluIHRoZSB0cmFzaC4KKwkgKi8KKwlhdG9taWNfZGVjKCZkZXN0LT5yZWZjbnQpOworfQorCisKKy8qCisgKglDaGVja2luZyBpZiB0aGUgZGVzdGluYXRpb24gb2YgYSBjb25uZWN0aW9uIHRlbXBsYXRlIGlzIGF2YWlsYWJsZS4KKyAqCUlmIGF2YWlsYWJsZSwgcmV0dXJuIDEsIG90aGVyd2lzZSBpbnZhbGlkYXRlIHRoaXMgY29ubmVjdGlvbgorICoJdGVtcGxhdGUgYW5kIHJldHVybiAwLgorICovCitpbnQgaXBfdnNfY2hlY2tfdGVtcGxhdGUoc3RydWN0IGlwX3ZzX2Nvbm4gKmN0KQoreworCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0ID0gY3QtPmRlc3Q7CisKKwkvKgorCSAqIENoZWNraW5nIHRoZSBkZXN0IHNlcnZlciBzdGF0dXMuCisJICovCisJaWYgKChkZXN0ID09IE5VTEwpIHx8CisJICAgICEoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfQVZBSUxBQkxFKSB8fCAKKwkgICAgKHN5c2N0bF9pcF92c19leHBpcmVfcXVpZXNjZW50X3RlbXBsYXRlICYmIAorCSAgICAgKGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpID09IDApKSkgeworCQlJUF9WU19EQkcoOSwgImNoZWNrX3RlbXBsYXRlOiBkZXN0IG5vdCBhdmFpbGFibGUgZm9yICIKKwkJCSAgInByb3RvY29sICVzIHM6JXUuJXUuJXUuJXU6JWQgdjoldS4ldS4ldS4ldTolZCAiCisJCQkgICItPiBkOiV1LiV1LiV1LiV1OiVkXG4iLAorCQkJICBpcF92c19wcm90b19uYW1lKGN0LT5wcm90b2NvbCksCisJCQkgIE5JUFFVQUQoY3QtPmNhZGRyKSwgbnRvaHMoY3QtPmNwb3J0KSwKKwkJCSAgTklQUVVBRChjdC0+dmFkZHIpLCBudG9ocyhjdC0+dnBvcnQpLAorCQkJICBOSVBRVUFEKGN0LT5kYWRkciksIG50b2hzKGN0LT5kcG9ydCkpOworCisJCS8qCisJCSAqIEludmFsaWRhdGUgdGhlIGNvbm5lY3Rpb24gdGVtcGxhdGUKKwkJICovCisJCWlmIChjdC0+Y3BvcnQpIHsKKwkJCWlmIChpcF92c19jb25uX3VuaGFzaChjdCkpIHsKKwkJCQljdC0+ZHBvcnQgPSA2NTUzNTsKKwkJCQljdC0+dnBvcnQgPSA2NTUzNTsKKwkJCQljdC0+Y3BvcnQgPSAwOworCQkJCWlwX3ZzX2Nvbm5faGFzaChjdCk7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBTaW1wbHkgZGVjcmVhc2UgdGhlIHJlZmNudCBvZiB0aGUgdGVtcGxhdGUsCisJCSAqIGRvbid0IHJlc3RhcnQgaXRzIHRpbWVyLgorCQkgKi8KKwkJYXRvbWljX2RlYygmY3QtPnJlZmNudCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgaXBfdnNfY29ubl9leHBpcmUodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBpcF92c19jb25uICpjcCA9IChzdHJ1Y3QgaXBfdnNfY29ubiAqKWRhdGE7CisKKwljcC0+dGltZW91dCA9IDYwKkhaOworCisJLyoKKwkgKgloZXksIEknbSB1c2luZyBpdAorCSAqLworCWF0b21pY19pbmMoJmNwLT5yZWZjbnQpOworCisJLyoKKwkgKglkbyBJIGNvbnRyb2wgYW55Ym9keT8KKwkgKi8KKwlpZiAoYXRvbWljX3JlYWQoJmNwLT5uX2NvbnRyb2wpKQorCQlnb3RvIGV4cGlyZV9sYXRlcjsKKworCS8qCisJICoJdW5oYXNoIGl0IGlmIGl0IGlzIGhhc2hlZCBpbiB0aGUgY29ubiB0YWJsZQorCSAqLworCWlmICghaXBfdnNfY29ubl91bmhhc2goY3ApKQorCQlnb3RvIGV4cGlyZV9sYXRlcjsKKworCS8qCisJICoJcmVmY250PT0xIGltcGxpZXMgSSdtIHRoZSBvbmx5IG9uZSByZWZlcnJlcgorCSAqLworCWlmIChsaWtlbHkoYXRvbWljX3JlYWQoJmNwLT5yZWZjbnQpID09IDEpKSB7CisJCS8qIGRlbGV0ZSB0aGUgdGltZXIgaWYgaXQgaXMgYWN0aXZhdGVkIGJ5IG90aGVyIHVzZXJzICovCisJCWlmICh0aW1lcl9wZW5kaW5nKCZjcC0+dGltZXIpKQorCQkJZGVsX3RpbWVyKCZjcC0+dGltZXIpOworCisJCS8qIGRvZXMgYW55Ym9keSBjb250cm9sIG1lPyAqLworCQlpZiAoY3AtPmNvbnRyb2wpCisJCQlpcF92c19jb250cm9sX2RlbChjcCk7CisKKwkJaWYgKHVubGlrZWx5KGNwLT5hcHAgIT0gTlVMTCkpCisJCQlpcF92c191bmJpbmRfYXBwKGNwKTsKKwkJaXBfdnNfdW5iaW5kX2Rlc3QoY3ApOworCQlpZiAoY3AtPmZsYWdzICYgSVBfVlNfQ09OTl9GX05PX0NQT1JUKQorCQkJYXRvbWljX2RlYygmaXBfdnNfY29ubl9ub19jcG9ydF9jbnQpOworCQlhdG9taWNfZGVjKCZpcF92c19jb25uX2NvdW50KTsKKworCQlrbWVtX2NhY2hlX2ZyZWUoaXBfdnNfY29ubl9jYWNoZXAsIGNwKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGhhc2ggaXQgYmFjayB0byB0aGUgdGFibGUgKi8KKwlpcF92c19jb25uX2hhc2goY3ApOworCisgIGV4cGlyZV9sYXRlcjoKKwlJUF9WU19EQkcoNywgImRlbGF5ZWQ6IHJlZmNudC0xPSVkIGNvbm4ubl9jb250cm9sPSVkXG4iLAorCQkgIGF0b21pY19yZWFkKCZjcC0+cmVmY250KS0xLAorCQkgIGF0b21pY19yZWFkKCZjcC0+bl9jb250cm9sKSk7CisKKwlpcF92c19jb25uX3B1dChjcCk7Cit9CisKKwordm9pZCBpcF92c19jb25uX2V4cGlyZV9ub3coc3RydWN0IGlwX3ZzX2Nvbm4gKmNwKQoreworCWlmIChkZWxfdGltZXIoJmNwLT50aW1lcikpCisJCW1vZF90aW1lcigmY3AtPnRpbWVyLCBqaWZmaWVzKTsKKwlfX2lwX3ZzX2Nvbm5fcHV0KGNwKTsKK30KKworCisvKgorICoJQ3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gZW50cnkgYW5kIGhhc2ggaXQgaW50byB0aGUgaXBfdnNfY29ubl90YWIKKyAqLworc3RydWN0IGlwX3ZzX2Nvbm4gKgoraXBfdnNfY29ubl9uZXcoaW50IHByb3RvLCBfX3UzMiBjYWRkciwgX191MTYgY3BvcnQsIF9fdTMyIHZhZGRyLCBfX3UxNiB2cG9ydCwKKwkgICAgICAgX191MzIgZGFkZHIsIF9fdTE2IGRwb3J0LCB1bnNpZ25lZCBmbGFncywKKwkgICAgICAgc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCit7CisJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOworCXN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAgPSBpcF92c19wcm90b19nZXQocHJvdG8pOworCisJY3AgPSBrbWVtX2NhY2hlX2FsbG9jKGlwX3ZzX2Nvbm5fY2FjaGVwLCBHRlBfQVRPTUlDKTsKKwlpZiAoY3AgPT0gTlVMTCkgeworCQlJUF9WU19FUlJfUkwoImlwX3ZzX2Nvbm5fbmV3OiBubyBtZW1vcnkgYXZhaWxhYmxlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChjcCwgMCwgc2l6ZW9mKCpjcCkpOworCUlOSVRfTElTVF9IRUFEKCZjcC0+Y19saXN0KTsKKwlpbml0X3RpbWVyKCZjcC0+dGltZXIpOworCWNwLT50aW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKWNwOworCWNwLT50aW1lci5mdW5jdGlvbiA9IGlwX3ZzX2Nvbm5fZXhwaXJlOworCWNwLT5wcm90b2NvbAkgICA9IHByb3RvOworCWNwLT5jYWRkcgkgICA9IGNhZGRyOworCWNwLT5jcG9ydAkgICA9IGNwb3J0OworCWNwLT52YWRkcgkgICA9IHZhZGRyOworCWNwLT52cG9ydAkgICA9IHZwb3J0OworCWNwLT5kYWRkciAgICAgICAgICA9IGRhZGRyOworCWNwLT5kcG9ydCAgICAgICAgICA9IGRwb3J0OworCWNwLT5mbGFncwkgICA9IGZsYWdzOworCXNwaW5fbG9ja19pbml0KCZjcC0+bG9jayk7CisKKwkvKgorCSAqIFNldCB0aGUgZW50cnkgaXMgcmVmZXJlbmNlZCBieSB0aGUgY3VycmVudCB0aHJlYWQgYmVmb3JlIGhhc2hpbmcKKwkgKiBpdCBpbiB0aGUgdGFibGUsIHNvIHRoYXQgb3RoZXIgdGhyZWFkIHJ1biBpcF92c19yYW5kb21fZHJvcGVudHJ5CisJICogYnV0IGNhbm5vdCBkcm9wIHRoaXMgZW50cnkuCisJICovCisJYXRvbWljX3NldCgmY3AtPnJlZmNudCwgMSk7CisKKwlhdG9taWNfc2V0KCZjcC0+bl9jb250cm9sLCAwKTsKKwlhdG9taWNfc2V0KCZjcC0+aW5fcGt0cywgMCk7CisKKwlhdG9taWNfaW5jKCZpcF92c19jb25uX2NvdW50KTsKKwlpZiAoZmxhZ3MgJiBJUF9WU19DT05OX0ZfTk9fQ1BPUlQpCisJCWF0b21pY19pbmMoJmlwX3ZzX2Nvbm5fbm9fY3BvcnRfY250KTsKKworCS8qIEJpbmQgdGhlIGNvbm5lY3Rpb24gd2l0aCBhIGRlc3RpbmF0aW9uIHNlcnZlciAqLworCWlwX3ZzX2JpbmRfZGVzdChjcCwgZGVzdCk7CisKKwkvKiBTZXQgaXRzIHN0YXRlIGFuZCB0aW1lb3V0ICovCisJY3AtPnN0YXRlID0gMDsKKwljcC0+dGltZW91dCA9IDMqSFo7CisKKwkvKiBCaW5kIGl0cyBwYWNrZXQgdHJhbnNtaXR0ZXIgKi8KKwlpcF92c19iaW5kX3htaXQoY3ApOworCisJaWYgKHVubGlrZWx5KHBwICYmIGF0b21pY19yZWFkKCZwcC0+YXBwY250KSkpCisJCWlwX3ZzX2JpbmRfYXBwKGNwLCBwcCk7CisKKwkvKiBIYXNoIGl0IGluIHRoZSBpcF92c19jb25uX3RhYiBmaW5hbGx5ICovCisJaXBfdnNfY29ubl9oYXNoKGNwKTsKKworCXJldHVybiBjcDsKK30KKworCisvKgorICoJL3Byb2MvbmV0L2lwX3ZzX2Nvbm4gZW50cmllcworICovCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworc3RhdGljIHZvaWQgKmlwX3ZzX2Nvbm5fYXJyYXkoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCBwb3MpCit7CisJaW50IGlkeDsKKwlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7CisJCisJZm9yKGlkeCA9IDA7IGlkeCA8IElQX1ZTX0NPTk5fVEFCX1NJWkU7IGlkeCsrKSB7CisJCWN0X3JlYWRfbG9ja19iaChpZHgpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNwLCAmaXBfdnNfY29ubl90YWJbaWR4XSwgY19saXN0KSB7CisJCQlpZiAocG9zLS0gPT0gMCkgeworCQkJCXNlcS0+cHJpdmF0ZSA9ICZpcF92c19jb25uX3RhYltpZHhdOworCQkJCXJldHVybiBjcDsKKwkJCX0KKwkJfQorCQljdF9yZWFkX3VubG9ja19iaChpZHgpOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCAqaXBfdnNfY29ubl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXNlcS0+cHJpdmF0ZSA9IE5VTEw7CisJcmV0dXJuICpwb3MgPyBpcF92c19jb25uX2FycmF5KHNlcSwgKnBvcyAtIDEpIDpTRVFfU1RBUlRfVE9LRU47Cit9CisKK3N0YXRpYyB2b2lkICppcF92c19jb25uX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaXBfdnNfY29ubiAqY3AgPSB2OworCXN0cnVjdCBsaXN0X2hlYWQgKmUsICpsID0gc2VxLT5wcml2YXRlOworCWludCBpZHg7CisKKwkrKypwb3M7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSAKKwkJcmV0dXJuIGlwX3ZzX2Nvbm5fYXJyYXkoc2VxLCAwKTsKKworCS8qIG1vcmUgb24gc2FtZSBoYXNoIGNoYWluPyAqLworCWlmICgoZSA9IGNwLT5jX2xpc3QubmV4dCkgIT0gbCkKKwkJcmV0dXJuIGxpc3RfZW50cnkoZSwgc3RydWN0IGlwX3ZzX2Nvbm4sIGNfbGlzdCk7CisKKwlpZHggPSBsIC0gaXBfdnNfY29ubl90YWI7CisJY3RfcmVhZF91bmxvY2tfYmgoaWR4KTsKKworCXdoaWxlICgrK2lkeCA8IElQX1ZTX0NPTk5fVEFCX1NJWkUpIHsKKwkJY3RfcmVhZF9sb2NrX2JoKGlkeCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY3AsICZpcF92c19jb25uX3RhYltpZHhdLCBjX2xpc3QpIHsKKwkJCXNlcS0+cHJpdmF0ZSA9ICZpcF92c19jb25uX3RhYltpZHhdOworCQkJcmV0dXJuIGNwOworCQl9CQorCQljdF9yZWFkX3VubG9ja19iaChpZHgpOworCX0KKwlzZXEtPnByaXZhdGUgPSBOVUxMOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBpcF92c19jb25uX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmwgPSBzZXEtPnByaXZhdGU7CisKKwlpZiAobCkKKwkJY3RfcmVhZF91bmxvY2tfYmgobCAtIGlwX3ZzX2Nvbm5fdGFiKTsKK30KKworc3RhdGljIGludCBpcF92c19jb25uX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlzZXFfcHV0cyhzZXEsCisgICAiUHJvIEZyb21JUCAgIEZQcnQgVG9JUCAgICAgVFBydCBEZXN0SVAgICBEUHJ0IFN0YXRlICAgICAgIEV4cGlyZXNcbiIpOworCWVsc2UgeworCQljb25zdCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3AgPSB2OworCisJCXNlcV9wcmludGYoc2VxLAorCQkJIiUtM3MgJTA4WCAlMDRYICUwOFggJTA0WCAlMDhYICUwNFggJS0xMXMgJTdsdVxuIiwKKwkJCQlpcF92c19wcm90b19uYW1lKGNwLT5wcm90b2NvbCksCisJCQkJbnRvaGwoY3AtPmNhZGRyKSwgbnRvaHMoY3AtPmNwb3J0KSwKKwkJCQludG9obChjcC0+dmFkZHIpLCBudG9ocyhjcC0+dnBvcnQpLAorCQkJCW50b2hsKGNwLT5kYWRkciksIG50b2hzKGNwLT5kcG9ydCksCisJCQkJaXBfdnNfc3RhdGVfbmFtZShjcC0+cHJvdG9jb2wsIGNwLT5zdGF0ZSksCisJCQkJKGNwLT50aW1lci5leHBpcmVzLWppZmZpZXMpL0haKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaXBfdnNfY29ubl9zZXFfb3BzID0geworCS5zdGFydCA9IGlwX3ZzX2Nvbm5fc2VxX3N0YXJ0LAorCS5uZXh0ICA9IGlwX3ZzX2Nvbm5fc2VxX25leHQsCisJLnN0b3AgID0gaXBfdnNfY29ubl9zZXFfc3RvcCwKKwkuc2hvdyAgPSBpcF92c19jb25uX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBpcF92c19jb25uX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZpcF92c19jb25uX3NlcV9vcHMpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcF92c19jb25uX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gaXBfdnNfY29ubl9vcGVuLAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisjZW5kaWYKKworCisvKgorICogICAgICBSYW5kb21seSBkcm9wIGNvbm5lY3Rpb24gZW50cmllcyBiZWZvcmUgcnVubmluZyBvdXQgb2YgbWVtb3J5CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHRvZHJvcF9lbnRyeShzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCit7CisJLyoKKwkgKiBUaGUgZHJvcCByYXRlIGFycmF5IG5lZWRzIHR1bmluZyBmb3IgcmVhbCBlbnZpcm9ubWVudHMuCisJICogQ2FsbGVkIGZyb20gdGltZXIgYmggb25seSA9PiBubyBsb2NraW5nCisJICovCisJc3RhdGljIGNoYXIgdG9kcm9wX3JhdGVbOV0gPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOH07CisJc3RhdGljIGNoYXIgdG9kcm9wX2NvdW50ZXJbOV0gPSB7MH07CisJaW50IGk7CisKKwkvKiBpZiB0aGUgY29ubiBlbnRyeSBoYXNuJ3QgbGFzdGVkIGZvciA2MCBzZWNvbmRzLCBkb24ndCBkcm9wIGl0LgorCSAgIFRoaXMgd2lsbCBsZWF2ZSBlbm91Z2ggdGltZSBmb3Igbm9ybWFsIGNvbm5lY3Rpb24gdG8gZ2V0CisJICAgdGhyb3VnaC4gKi8KKwlpZiAodGltZV9iZWZvcmUoY3AtPnRpbWVvdXQgKyBqaWZmaWVzLCBjcC0+dGltZXIuZXhwaXJlcyArIDYwKkhaKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBEb24ndCBkcm9wIHRoZSBlbnRyeSBpZiBpdHMgbnVtYmVyIG9mIGluY29taW5nIHBhY2tldHMgaXMgbm90CisJICAgbG9jYXRlZCBpbiBbMCwgOF0gKi8KKwlpID0gYXRvbWljX3JlYWQoJmNwLT5pbl9wa3RzKTsKKwlpZiAoaSA+IDggfHwgaSA8IDApIHJldHVybiAwOworCisJaWYgKCF0b2Ryb3BfcmF0ZVtpXSkgcmV0dXJuIDA7CisJaWYgKC0tdG9kcm9wX2NvdW50ZXJbaV0gPiAwKSByZXR1cm4gMDsKKworCXRvZHJvcF9jb3VudGVyW2ldID0gdG9kcm9wX3JhdGVbaV07CisJcmV0dXJuIDE7Cit9CisKKwordm9pZCBpcF92c19yYW5kb21fZHJvcGVudHJ5KHZvaWQpCit7CisJaW50IGlkeDsKKwlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7CisJc3RydWN0IGlwX3ZzX2Nvbm4gKmN0OworCisJLyoKKwkgKiBSYW5kb21seSBzY2FuIDEvMzIgb2YgdGhlIHdob2xlIHRhYmxlIGV2ZXJ5IHNlY29uZAorCSAqLworCWZvciAoaWR4ID0gMDsgaWR4IDwgKElQX1ZTX0NPTk5fVEFCX1NJWkU+PjUpOyBpZHgrKykgeworCQl1bnNpZ25lZCBoYXNoID0gbmV0X3JhbmRvbSgpICYgSVBfVlNfQ09OTl9UQUJfTUFTSzsKKworCQkvKgorCQkgKiAgTG9jayBpcyBhY3R1YWxseSBuZWVkZWQgaW4gdGhpcyBsb29wLgorCQkgKi8KKwkJY3Rfd3JpdGVfbG9jayhoYXNoKTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNwLCAmaXBfdnNfY29ubl90YWJbaGFzaF0sIGNfbGlzdCkgeworCQkJaWYgKCFjcC0+Y3BvcnQgJiYgIShjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfTk9fQ1BPUlQpKQorCQkJCS8qIGNvbm5lY3Rpb24gdGVtcGxhdGUgKi8KKwkJCQljb250aW51ZTsKKworCQkJaWYgKGNwLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkgeworCQkJCXN3aXRjaChjcC0+c3RhdGUpIHsKKwkJCQljYXNlIElQX1ZTX1RDUF9TX1NZTl9SRUNWOgorCQkJCWNhc2UgSVBfVlNfVENQX1NfU1lOQUNLOgorCQkJCQlicmVhazsKKworCQkJCWNhc2UgSVBfVlNfVENQX1NfRVNUQUJMSVNIRUQ6CisJCQkJCWlmICh0b2Ryb3BfZW50cnkoY3ApKQorCQkJCQkJYnJlYWs7CisJCQkJCWNvbnRpbnVlOworCisJCQkJZGVmYXVsdDoKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoIXRvZHJvcF9lbnRyeShjcCkpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogRHJvcCB0aGUgZW50cnksIGFuZCBkcm9wIGl0cyBjdCBpZiBub3QgcmVmZXJlbmNlZAorCQkJICovCisJCQlhdG9taWNfaW5jKCZjcC0+cmVmY250KTsKKwkJCWN0X3dyaXRlX3VubG9jayhoYXNoKTsKKworCQkJaWYgKChjdCA9IGNwLT5jb250cm9sKSkKKwkJCQlhdG9taWNfaW5jKCZjdC0+cmVmY250KTsKKwkJCUlQX1ZTX0RCRyg0LCAiZGVsIGNvbm5lY3Rpb25cbiIpOworCQkJaXBfdnNfY29ubl9leHBpcmVfbm93KGNwKTsKKwkJCWlmIChjdCkgeworCQkJCUlQX1ZTX0RCRyg0LCAiZGVsIGNvbm4gdGVtcGxhdGVcbiIpOworCQkJCWlwX3ZzX2Nvbm5fZXhwaXJlX25vdyhjdCk7CisJCQl9CisJCQljdF93cml0ZV9sb2NrKGhhc2gpOworCQl9CisJCWN0X3dyaXRlX3VubG9jayhoYXNoKTsKKwl9Cit9CisKKworLyoKKyAqICAgICAgRmx1c2ggYWxsIHRoZSBjb25uZWN0aW9uIGVudHJpZXMgaW4gdGhlIGlwX3ZzX2Nvbm5fdGFiCisgKi8KK3N0YXRpYyB2b2lkIGlwX3ZzX2Nvbm5fZmx1c2godm9pZCkKK3sKKwlpbnQgaWR4OworCXN0cnVjdCBpcF92c19jb25uICpjcDsKKwlzdHJ1Y3QgaXBfdnNfY29ubiAqY3Q7CisKKyAgZmx1c2hfYWdhaW46CisJZm9yIChpZHg9MDsgaWR4PElQX1ZTX0NPTk5fVEFCX1NJWkU7IGlkeCsrKSB7CisJCS8qCisJCSAqICBMb2NrIGlzIGFjdHVhbGx5IG5lZWRlZCBpbiB0aGlzIGxvb3AuCisJCSAqLworCQljdF93cml0ZV9sb2NrX2JoKGlkeCk7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjcCwgJmlwX3ZzX2Nvbm5fdGFiW2lkeF0sIGNfbGlzdCkgeworCQkJYXRvbWljX2luYygmY3AtPnJlZmNudCk7CisJCQljdF93cml0ZV91bmxvY2soaWR4KTsKKworCQkJaWYgKChjdCA9IGNwLT5jb250cm9sKSkKKwkJCQlhdG9taWNfaW5jKCZjdC0+cmVmY250KTsKKwkJCUlQX1ZTX0RCRyg0LCAiZGVsIGNvbm5lY3Rpb25cbiIpOworCQkJaXBfdnNfY29ubl9leHBpcmVfbm93KGNwKTsKKwkJCWlmIChjdCkgeworCQkJCUlQX1ZTX0RCRyg0LCAiZGVsIGNvbm4gdGVtcGxhdGVcbiIpOworCQkJCWlwX3ZzX2Nvbm5fZXhwaXJlX25vdyhjdCk7CisJCQl9CisJCQljdF93cml0ZV9sb2NrKGlkeCk7CisJCX0KKwkJY3Rfd3JpdGVfdW5sb2NrX2JoKGlkeCk7CisJfQorCisJLyogdGhlIGNvdW50ZXIgbWF5IGJlIG5vdCBOVUxMLCBiZWNhdXNlIG1heWJlIHNvbWUgY29ubiBlbnRyaWVzCisJICAgYXJlIHJ1biBieSBzbG93IHRpbWVyIGhhbmRsZXIgb3IgdW5oYXNoZWQgYnV0IHN0aWxsIHJlZmVycmVkICovCisJaWYgKGF0b21pY19yZWFkKCZpcF92c19jb25uX2NvdW50KSAhPSAwKSB7CisJCXNjaGVkdWxlKCk7CisJCWdvdG8gZmx1c2hfYWdhaW47CisJfQorfQorCisKK2ludCBpcF92c19jb25uX2luaXQodm9pZCkKK3sKKwlpbnQgaWR4OworCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgY29ubmVjdGlvbiBoYXNoIHRhYmxlIGFuZCBpbml0aWFsaXplIGl0cyBsaXN0IGhlYWRzCisJICovCisJaXBfdnNfY29ubl90YWIgPSB2bWFsbG9jKElQX1ZTX0NPTk5fVEFCX1NJWkUqc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpKTsKKwlpZiAoIWlwX3ZzX2Nvbm5fdGFiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEFsbG9jYXRlIGlwX3ZzX2Nvbm4gc2xhYiBjYWNoZSAqLworCWlwX3ZzX2Nvbm5fY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImlwX3ZzX2Nvbm4iLAorCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IGlwX3ZzX2Nvbm4pLCAwLAorCQkJCQkgICAgICBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwsIE5VTEwpOworCWlmICghaXBfdnNfY29ubl9jYWNoZXApIHsKKwkJdmZyZWUoaXBfdnNfY29ubl90YWIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlJUF9WU19JTkZPKCJDb25uZWN0aW9uIGhhc2ggdGFibGUgY29uZmlndXJlZCAiCisJCSAgICIoc2l6ZT0lZCwgbWVtb3J5PSVsZEtieXRlcylcbiIsCisJCSAgIElQX1ZTX0NPTk5fVEFCX1NJWkUsCisJCSAgIChsb25nKShJUF9WU19DT05OX1RBQl9TSVpFKnNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSkvMTAyNCk7CisJSVBfVlNfREJHKDAsICJFYWNoIGNvbm5lY3Rpb24gZW50cnkgbmVlZHMgJVpkIGJ5dGVzIGF0IGxlYXN0XG4iLAorCQkgIHNpemVvZihzdHJ1Y3QgaXBfdnNfY29ubikpOworCisJZm9yIChpZHggPSAwOyBpZHggPCBJUF9WU19DT05OX1RBQl9TSVpFOyBpZHgrKykgeworCQlJTklUX0xJU1RfSEVBRCgmaXBfdnNfY29ubl90YWJbaWR4XSk7CisJfQorCisJZm9yIChpZHggPSAwOyBpZHggPCBDVF9MT0NLQVJSQVlfU0laRTsgaWR4KyspICB7CisJCXJ3bG9ja19pbml0KCZfX2lwX3ZzX2Nvbm50YmxfbG9ja19hcnJheVtpZHhdLmwpOworCX0KKworCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJpcF92c19jb25uIiwgMCwgJmlwX3ZzX2Nvbm5fZm9wcyk7CisKKwkvKiBjYWxjdWxhdGUgdGhlIHJhbmRvbSB2YWx1ZSBmb3IgY29ubmVjdGlvbiBoYXNoICovCisJZ2V0X3JhbmRvbV9ieXRlcygmaXBfdnNfY29ubl9ybmQsIHNpemVvZihpcF92c19jb25uX3JuZCkpOworCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBpcF92c19jb25uX2NsZWFudXAodm9pZCkKK3sKKwkvKiBmbHVzaCBhbGwgdGhlIGNvbm5lY3Rpb24gZW50cmllcyBmaXJzdCAqLworCWlwX3ZzX2Nvbm5fZmx1c2goKTsKKworCS8qIFJlbGVhc2UgdGhlIGVtcHR5IGNhY2hlICovCisJa21lbV9jYWNoZV9kZXN0cm95KGlwX3ZzX2Nvbm5fY2FjaGVwKTsKKwlwcm9jX25ldF9yZW1vdmUoImlwX3ZzX2Nvbm4iKTsKKwl2ZnJlZShpcF92c19jb25uX3RhYik7Cit9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2NvcmUuYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYjI1N2QKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2NvcmUuYwpAQCAtMCwwICsxLDExOTEgQEAKKy8qCisgKiBJUFZTICAgICAgICAgQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIElQIHZpcnR1YWwgc2VydmVyIHN1cHBvcnQgZm9yIHRoZQorICogICAgICAgICAgICAgIExJTlVYIG9wZXJhdGluZyBzeXN0ZW0uICBJUFZTIGlzIG5vdyBpbXBsZW1lbnRlZCBhcyBhIG1vZHVsZQorICogICAgICAgICAgICAgIG92ZXIgdGhlIE5ldGZpbHRlciBmcmFtZXdvcmsuIElQVlMgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYQorICogICAgICAgICAgICAgIGhpZ2gtcGVyZm9ybWFuY2UgYW5kIGhpZ2hseSBhdmFpbGFibGUgc2VydmVyIGJhc2VkIG9uIGEKKyAqICAgICAgICAgICAgICBjbHVzdGVyIG9mIHNlcnZlcnMuCisgKgorICogVmVyc2lvbjogICAgICRJZDogaXBfdnNfY29yZS5jLHYgMS4zNCAyMDAzLzA1LzEwIDAzOjA1OjIzIHdlbnNvbmcgRXhwICQKKyAqCisgKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgorICogICAgICAgICAgICAgIFBldGVyIEtlc2UgPHBldGVyLmtlc2VAaWpzLnNpPgorICogICAgICAgICAgICAgIEp1bGlhbiBBbmFzdGFzb3YgPGphQHNzaS5iZz4KKyAqCisgKiAgICAgICAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICAgICAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgICAgICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgICAgICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgSVBWUyBjb2RlIGZvciBrZXJuZWwgMi4yIHdhcyBkb25lIGJ5IFdlbnNvbmcgWmhhbmcgYW5kIFBldGVyIEtlc2UsCisgKiB3aXRoIGNoYW5nZXMvZml4ZXMgZnJvbSBKdWxpYW4gQW5hc3Rhc292LCBMYXJzIE1hcm93c2t5LUJyZWUsIEhvcm1zCisgKiBhbmQgb3RoZXJzLgorICoKKyAqIENoYW5nZXM6CisgKglQYXVsIGBSdXN0eScgUnVzc2VsbAkJcHJvcGVybHkgaGFuZGxlIG5vbi1saW5lYXIgc2ticworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wLmg+CisKKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisjaW5jbHVkZSA8bmV0L3VkcC5oPgorI2luY2x1ZGUgPG5ldC9pY21wLmg+ICAgICAgICAgICAgICAgICAgIC8qIGZvciBpY21wX3NlbmQgKi8KKyNpbmNsdWRlIDxuZXQvcm91dGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXBfdnMuaD4KKworCitFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX2lwX3ZzX3NjaGVkdWxlcik7CitFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKTsKK0VYUE9SVF9TWU1CT0woaXBfdnNfc2tiX3JlcGxhY2UpOworRVhQT1JUX1NZTUJPTChpcF92c19wcm90b19uYW1lKTsKK0VYUE9SVF9TWU1CT0woaXBfdnNfY29ubl9uZXcpOworRVhQT1JUX1NZTUJPTChpcF92c19jb25uX2luX2dldCk7CitFWFBPUlRfU1lNQk9MKGlwX3ZzX2Nvbm5fb3V0X2dldCk7CisjaWZkZWYgQ09ORklHX0lQX1ZTX1BST1RPX1RDUAorRVhQT1JUX1NZTUJPTChpcF92c190Y3BfY29ubl9saXN0ZW4pOworI2VuZGlmCitFWFBPUlRfU1lNQk9MKGlwX3ZzX2Nvbm5fcHV0KTsKKyNpZmRlZiBDT05GSUdfSVBfVlNfREVCVUcKK0VYUE9SVF9TWU1CT0woaXBfdnNfZ2V0X2RlYnVnX2xldmVsKTsKKyNlbmRpZgorRVhQT1JUX1NZTUJPTChpcF92c19tYWtlX3NrYl93cml0YWJsZSk7CisKKworLyogSUQgdXNlZCBpbiBJQ01QIGxvb2t1cHMgKi8KKyNkZWZpbmUgaWNtcF9pZChpY21waCkgICAgICAgICAgKCgoaWNtcGgpLT51bikuZWNoby5pZCkKKworY29uc3QgY2hhciAqaXBfdnNfcHJvdG9fbmFtZSh1bnNpZ25lZCBwcm90bykKK3sKKwlzdGF0aWMgY2hhciBidWZbMjBdOworCisJc3dpdGNoIChwcm90bykgeworCWNhc2UgSVBQUk9UT19JUDoKKwkJcmV0dXJuICJJUCI7CisJY2FzZSBJUFBST1RPX1VEUDoKKwkJcmV0dXJuICJVRFAiOworCWNhc2UgSVBQUk9UT19UQ1A6CisJCXJldHVybiAiVENQIjsKKwljYXNlIElQUFJPVE9fSUNNUDoKKwkJcmV0dXJuICJJQ01QIjsKKwlkZWZhdWx0OgorCQlzcHJpbnRmKGJ1ZiwgIklQXyVkIiwgcHJvdG8pOworCQlyZXR1cm4gYnVmOworCX0KK30KKwordm9pZCBpcF92c19pbml0X2hhc2hfdGFibGUoc3RydWN0IGxpc3RfaGVhZCAqdGFibGUsIGludCByb3dzKQoreworCXdoaWxlICgtLXJvd3MgPj0gMCkKKwkJSU5JVF9MSVNUX0hFQUQoJnRhYmxlW3Jvd3NdKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpcF92c19pbl9zdGF0cyhzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QgPSBjcC0+ZGVzdDsKKwlpZiAoZGVzdCAmJiAoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfQVZBSUxBQkxFKSkgeworCQlzcGluX2xvY2soJmRlc3QtPnN0YXRzLmxvY2spOworCQlkZXN0LT5zdGF0cy5pbnBrdHMrKzsKKwkJZGVzdC0+c3RhdHMuaW5ieXRlcyArPSBza2ItPmxlbjsKKwkJc3Bpbl91bmxvY2soJmRlc3QtPnN0YXRzLmxvY2spOworCisJCXNwaW5fbG9jaygmZGVzdC0+c3ZjLT5zdGF0cy5sb2NrKTsKKwkJZGVzdC0+c3ZjLT5zdGF0cy5pbnBrdHMrKzsKKwkJZGVzdC0+c3ZjLT5zdGF0cy5pbmJ5dGVzICs9IHNrYi0+bGVuOworCQlzcGluX3VubG9jaygmZGVzdC0+c3ZjLT5zdGF0cy5sb2NrKTsKKworCQlzcGluX2xvY2soJmlwX3ZzX3N0YXRzLmxvY2spOworCQlpcF92c19zdGF0cy5pbnBrdHMrKzsKKwkJaXBfdnNfc3RhdHMuaW5ieXRlcyArPSBza2ItPmxlbjsKKwkJc3Bpbl91bmxvY2soJmlwX3ZzX3N0YXRzLmxvY2spOworCX0KK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQKK2lwX3ZzX291dF9zdGF0cyhzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QgPSBjcC0+ZGVzdDsKKwlpZiAoZGVzdCAmJiAoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfQVZBSUxBQkxFKSkgeworCQlzcGluX2xvY2soJmRlc3QtPnN0YXRzLmxvY2spOworCQlkZXN0LT5zdGF0cy5vdXRwa3RzKys7CisJCWRlc3QtPnN0YXRzLm91dGJ5dGVzICs9IHNrYi0+bGVuOworCQlzcGluX3VubG9jaygmZGVzdC0+c3RhdHMubG9jayk7CisKKwkJc3Bpbl9sb2NrKCZkZXN0LT5zdmMtPnN0YXRzLmxvY2spOworCQlkZXN0LT5zdmMtPnN0YXRzLm91dHBrdHMrKzsKKwkJZGVzdC0+c3ZjLT5zdGF0cy5vdXRieXRlcyArPSBza2ItPmxlbjsKKwkJc3Bpbl91bmxvY2soJmRlc3QtPnN2Yy0+c3RhdHMubG9jayk7CisKKwkJc3Bpbl9sb2NrKCZpcF92c19zdGF0cy5sb2NrKTsKKwkJaXBfdnNfc3RhdHMub3V0cGt0cysrOworCQlpcF92c19zdGF0cy5vdXRieXRlcyArPSBza2ItPmxlbjsKKwkJc3Bpbl91bmxvY2soJmlwX3ZzX3N0YXRzLmxvY2spOworCX0KK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQKK2lwX3ZzX2Nvbm5fc3RhdHMoc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCBzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQoreworCXNwaW5fbG9jaygmY3AtPmRlc3QtPnN0YXRzLmxvY2spOworCWNwLT5kZXN0LT5zdGF0cy5jb25ucysrOworCXNwaW5fdW5sb2NrKCZjcC0+ZGVzdC0+c3RhdHMubG9jayk7CisKKwlzcGluX2xvY2soJnN2Yy0+c3RhdHMubG9jayk7CisJc3ZjLT5zdGF0cy5jb25ucysrOworCXNwaW5fdW5sb2NrKCZzdmMtPnN0YXRzLmxvY2spOworCisJc3Bpbl9sb2NrKCZpcF92c19zdGF0cy5sb2NrKTsKKwlpcF92c19zdGF0cy5jb25ucysrOworCXNwaW5fdW5sb2NrKCZpcF92c19zdGF0cy5sb2NrKTsKK30KKworCitzdGF0aWMgaW5saW5lIGludAoraXBfdnNfc2V0X3N0YXRlKHN0cnVjdCBpcF92c19jb25uICpjcCwgaW50IGRpcmVjdGlvbiwKKwkJY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKK3sKKwlpZiAodW5saWtlbHkoIXBwLT5zdGF0ZV90cmFuc2l0aW9uKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHBwLT5zdGF0ZV90cmFuc2l0aW9uKGNwLCBkaXJlY3Rpb24sIHNrYiwgcHApOworfQorCisKK2ludCBpcF92c19tYWtlX3NrYl93cml0YWJsZShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIGludCB3cml0YWJsZV9sZW4pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpwc2tiOworCisJLyogc2tiIGlzIGFscmVhZHkgdXNlZCwgYmV0dGVyIGNvcHkgc2tiIGFuZCBpdHMgcGF5bG9hZCAqLworCWlmICh1bmxpa2VseShza2Jfc2hhcmVkKHNrYikgfHwgc2tiLT5zaykpCisJCWdvdG8gY29weV9za2I7CisKKwkvKiBza2IgZGF0YSBpcyBhbHJlYWR5IHVzZWQsIGNvcHkgaXQgKi8KKwlpZiAodW5saWtlbHkoc2tiX2Nsb25lZChza2IpKSkKKwkJZ290byBjb3B5X2RhdGE7CisKKwlyZXR1cm4gcHNrYl9tYXlfcHVsbChza2IsIHdyaXRhYmxlX2xlbik7CisKKyAgY29weV9kYXRhOgorCWlmICh1bmxpa2VseSh3cml0YWJsZV9sZW4gPiBza2ItPmxlbikpCisJCXJldHVybiAwOworCXJldHVybiAhcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpOworCisgIGNvcHlfc2tiOgorCWlmICh1bmxpa2VseSh3cml0YWJsZV9sZW4gPiBza2ItPmxlbikpCisJCXJldHVybiAwOworCXNrYiA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CisJaWYgKCFza2IpCisJCXJldHVybiAwOworCUJVR19PTihza2JfaXNfbm9ubGluZWFyKHNrYikpOworCisJLyogUmVzdCBvZiBrZXJuZWwgd2lsbCBnZXQgdmVyeSB1bmhhcHB5IGlmIHdlIHBhc3MgaXQgYQorCSAgIHN1ZGRlbmx5LW9ycGhhbmVkIHNrYnVmZiAqLworCWlmICgoKnBza2IpLT5zaykKKwkJc2tiX3NldF9vd25lcl93KHNrYiwgKCpwc2tiKS0+c2spOworCWtmcmVlX3NrYigqcHNrYik7CisJKnBza2IgPSBza2I7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiAgSVBWUyBwZXJzaXN0ZW50IHNjaGVkdWxpbmcgZnVuY3Rpb24KKyAqICBJdCBjcmVhdGVzIGEgY29ubmVjdGlvbiBlbnRyeSBhY2NvcmRpbmcgdG8gaXRzIHRlbXBsYXRlIGlmIGV4aXN0cywKKyAqICBvciBzZWxlY3RzIGEgc2VydmVyIGFuZCBjcmVhdGVzIGEgY29ubmVjdGlvbiBlbnRyeSBwbHVzIGEgdGVtcGxhdGUuCisgKiAgTG9ja2luZzogd2UgYXJlIHN2YyB1c2VyIChzdmMtPnJlZmNudCksIHNvIHdlIGhvbGQgYWxsIGRlc3RzIHRvbworICogIFByb3RvY29scyBzdXBwb3J0ZWQ6IFRDUCwgVURQCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfY29ubiAqCitpcF92c19zY2hlZF9wZXJzaXN0KHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsCisJCSAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgX191MTYgcG9ydHNbMl0pCit7CisJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwID0gTlVMTDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0OworCXN0cnVjdCBpcF92c19jb25uICpjdDsKKwlfX3UxNiAgZHBvcnQ7CSAvKiBkZXN0aW5hdGlvbiBwb3J0IHRvIGZvcndhcmQgKi8KKwlfX3UzMiAgc25ldDsJIC8qIHNvdXJjZSBuZXR3b3JrIG9mIHRoZSBjbGllbnQsIGFmdGVyIG1hc2tpbmcgKi8KKworCS8qIE1hc2sgc2FkZHIgd2l0aCB0aGUgbmV0bWFzayB0byBhZGp1c3QgdGVtcGxhdGUgZ3JhbnVsYXJpdHkgKi8KKwlzbmV0ID0gaXBoLT5zYWRkciAmIHN2Yy0+bmV0bWFzazsKKworCUlQX1ZTX0RCRyg2LCAicC1zY2hlZHVsZTogc3JjICV1LiV1LiV1LiV1OiV1IGRlc3QgJXUuJXUuJXUuJXU6JXUgIgorCQkgICJtbmV0ICV1LiV1LiV1LiV1XG4iLAorCQkgIE5JUFFVQUQoaXBoLT5zYWRkciksIG50b2hzKHBvcnRzWzBdKSwKKwkJICBOSVBRVUFEKGlwaC0+ZGFkZHIpLCBudG9ocyhwb3J0c1sxXSksCisJCSAgTklQUVVBRChzbmV0KSk7CisKKwkvKgorCSAqIEFzIGZhciBhcyB3ZSBrbm93LCBGVFAgaXMgYSB2ZXJ5IGNvbXBsaWNhdGVkIG5ldHdvcmsgcHJvdG9jb2wsIGFuZAorCSAqIGl0IHVzZXMgY29udHJvbCBjb25uZWN0aW9uIGFuZCBkYXRhIGNvbm5lY3Rpb25zLiBGb3IgYWN0aXZlIEZUUCwKKwkgKiBGVFAgc2VydmVyIGluaXRpYWxpemUgZGF0YSBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQsIGl0cyBzb3VyY2UgcG9ydAorCSAqIGlzIG9mdGVuIDIwLiBGb3IgcGFzc2l2ZSBGVFAsIEZUUCBzZXJ2ZXIgdGVsbHMgdGhlIGNsaWVudHMgdGhlIHBvcnQKKwkgKiB0aGF0IGl0IHBhc3NpdmVseSBsaXN0ZW5zIHRvLCAgYW5kIHRoZSBjbGllbnQgaXNzdWVzIHRoZSBkYXRhCisJICogY29ubmVjdGlvbi4gSW4gdGhlIHR1bm5lbGluZyBvciBkaXJlY3Qgcm91dGluZyBtb2RlLCB0aGUgbG9hZAorCSAqIGJhbGFuY2VyIGlzIG9uIHRoZSBjbGllbnQtdG8tc2VydmVyIGhhbGYgb2YgY29ubmVjdGlvbiwgdGhlIHBvcnQKKwkgKiBudW1iZXIgaXMgdW5rbm93biB0byB0aGUgbG9hZCBiYWxhbmNlci4gU28sIGEgY29ubiB0ZW1wbGF0ZSBsaWtlCisJICogPGNhZGRyLCAwLCB2YWRkciwgMCwgZGFkZHIsIDA+IGlzIGNyZWF0ZWQgZm9yIHBlcnNpc3RlbnQgRlRQCisJICogc2VydmljZSwgYW5kIGEgdGVtcGxhdGUgbGlrZSA8Y2FkZHIsIDAsIHZhZGRyLCB2cG9ydCwgZGFkZHIsIGRwb3J0PgorCSAqIGlzIGNyZWF0ZWQgZm9yIG90aGVyIHBlcnNpc3RlbnQgc2VydmljZXMuCisJICovCisJaWYgKHBvcnRzWzFdID09IHN2Yy0+cG9ydCkgeworCQkvKiBDaGVjayBpZiBhIHRlbXBsYXRlIGFscmVhZHkgZXhpc3RzICovCisJCWlmIChzdmMtPnBvcnQgIT0gRlRQUE9SVCkKKwkJCWN0ID0gaXBfdnNfY29ubl9pbl9nZXQoaXBoLT5wcm90b2NvbCwgc25ldCwgMCwKKwkJCQkJICAgICAgIGlwaC0+ZGFkZHIsIHBvcnRzWzFdKTsKKwkJZWxzZQorCQkJY3QgPSBpcF92c19jb25uX2luX2dldChpcGgtPnByb3RvY29sLCBzbmV0LCAwLAorCQkJCQkgICAgICAgaXBoLT5kYWRkciwgMCk7CisKKwkJaWYgKCFjdCB8fCAhaXBfdnNfY2hlY2tfdGVtcGxhdGUoY3QpKSB7CisJCQkvKgorCQkJICogTm8gdGVtcGxhdGUgZm91bmQgb3IgdGhlIGRlc3Qgb2YgdGhlIGNvbm5lY3Rpb24KKwkJCSAqIHRlbXBsYXRlIGlzIG5vdCBhdmFpbGFibGUuCisJCQkgKi8KKwkJCWRlc3QgPSBzdmMtPnNjaGVkdWxlci0+c2NoZWR1bGUoc3ZjLCBza2IpOworCQkJaWYgKGRlc3QgPT0gTlVMTCkgeworCQkJCUlQX1ZTX0RCRygxLCAicC1zY2hlZHVsZTogbm8gZGVzdCBmb3VuZC5cbiIpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCisJCQkvKgorCQkJICogQ3JlYXRlIGEgdGVtcGxhdGUgbGlrZSA8cHJvdG9jb2wsY2FkZHIsMCwKKwkJCSAqIHZhZGRyLHZwb3J0LGRhZGRyLGRwb3J0PiBmb3Igbm9uLWZ0cCBzZXJ2aWNlLAorCQkJICogYW5kIDxwcm90b2NvbCxjYWRkciwwLHZhZGRyLDAsZGFkZHIsMD4KKwkJCSAqIGZvciBmdHAgc2VydmljZS4KKwkJCSAqLworCQkJaWYgKHN2Yy0+cG9ydCAhPSBGVFBQT1JUKQorCQkJCWN0ID0gaXBfdnNfY29ubl9uZXcoaXBoLT5wcm90b2NvbCwKKwkJCQkJCSAgICBzbmV0LCAwLAorCQkJCQkJICAgIGlwaC0+ZGFkZHIsCisJCQkJCQkgICAgcG9ydHNbMV0sCisJCQkJCQkgICAgZGVzdC0+YWRkciwgZGVzdC0+cG9ydCwKKwkJCQkJCSAgICAwLAorCQkJCQkJICAgIGRlc3QpOworCQkJZWxzZQorCQkJCWN0ID0gaXBfdnNfY29ubl9uZXcoaXBoLT5wcm90b2NvbCwKKwkJCQkJCSAgICBzbmV0LCAwLAorCQkJCQkJICAgIGlwaC0+ZGFkZHIsIDAsCisJCQkJCQkgICAgZGVzdC0+YWRkciwgMCwKKwkJCQkJCSAgICAwLAorCQkJCQkJICAgIGRlc3QpOworCQkJaWYgKGN0ID09IE5VTEwpCisJCQkJcmV0dXJuIE5VTEw7CisKKwkJCWN0LT50aW1lb3V0ID0gc3ZjLT50aW1lb3V0OworCQl9IGVsc2UgeworCQkJLyogc2V0IGRlc3RpbmF0aW9uIHdpdGggdGhlIGZvdW5kIHRlbXBsYXRlICovCisJCQlkZXN0ID0gY3QtPmRlc3Q7CisJCX0KKwkJZHBvcnQgPSBkZXN0LT5wb3J0OworCX0gZWxzZSB7CisJCS8qCisJCSAqIE5vdGU6IHBlcnNpc3RlbnQgZndtYXJrLWJhc2VkIHNlcnZpY2VzIGFuZCBwZXJzaXN0ZW50CisJCSAqIHBvcnQgemVybyBzZXJ2aWNlIGFyZSBoYW5kbGVkIGhlcmUuCisJCSAqIGZ3bWFyayB0ZW1wbGF0ZTogPElQUFJPVE9fSVAsY2FkZHIsMCxmd21hcmssMCxkYWRkciwwPgorCQkgKiBwb3J0IHplcm8gdGVtcGxhdGU6IDxwcm90b2NvbCxjYWRkciwwLHZhZGRyLDAsZGFkZHIsMD4KKwkJICovCisJCWlmIChzdmMtPmZ3bWFyaykKKwkJCWN0ID0gaXBfdnNfY29ubl9pbl9nZXQoSVBQUk9UT19JUCwgc25ldCwgMCwKKwkJCQkJICAgICAgIGh0b25sKHN2Yy0+ZndtYXJrKSwgMCk7CisJCWVsc2UKKwkJCWN0ID0gaXBfdnNfY29ubl9pbl9nZXQoaXBoLT5wcm90b2NvbCwgc25ldCwgMCwKKwkJCQkJICAgICAgIGlwaC0+ZGFkZHIsIDApOworCisJCWlmICghY3QgfHwgIWlwX3ZzX2NoZWNrX3RlbXBsYXRlKGN0KSkgeworCQkJLyoKKwkJCSAqIElmIGl0IGlzIG5vdCBwZXJzaXN0ZW50IHBvcnQgemVybywgcmV0dXJuIE5VTEwsCisJCQkgKiBvdGhlcndpc2UgY3JlYXRlIGEgY29ubmVjdGlvbiB0ZW1wbGF0ZS4KKwkJCSAqLworCQkJaWYgKHN2Yy0+cG9ydCkKKwkJCQlyZXR1cm4gTlVMTDsKKworCQkJZGVzdCA9IHN2Yy0+c2NoZWR1bGVyLT5zY2hlZHVsZShzdmMsIHNrYik7CisJCQlpZiAoZGVzdCA9PSBOVUxMKSB7CisJCQkJSVBfVlNfREJHKDEsICJwLXNjaGVkdWxlOiBubyBkZXN0IGZvdW5kLlxuIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisKKwkJCS8qCisJCQkgKiBDcmVhdGUgYSB0ZW1wbGF0ZSBhY2NvcmRpbmcgdG8gdGhlIHNlcnZpY2UKKwkJCSAqLworCQkJaWYgKHN2Yy0+ZndtYXJrKQorCQkJCWN0ID0gaXBfdnNfY29ubl9uZXcoSVBQUk9UT19JUCwKKwkJCQkJCSAgICBzbmV0LCAwLAorCQkJCQkJICAgIGh0b25sKHN2Yy0+ZndtYXJrKSwgMCwKKwkJCQkJCSAgICBkZXN0LT5hZGRyLCAwLAorCQkJCQkJICAgIDAsCisJCQkJCQkgICAgZGVzdCk7CisJCQllbHNlCisJCQkJY3QgPSBpcF92c19jb25uX25ldyhpcGgtPnByb3RvY29sLAorCQkJCQkJICAgIHNuZXQsIDAsCisJCQkJCQkgICAgaXBoLT5kYWRkciwgMCwKKwkJCQkJCSAgICBkZXN0LT5hZGRyLCAwLAorCQkJCQkJICAgIDAsCisJCQkJCQkgICAgZGVzdCk7CisJCQlpZiAoY3QgPT0gTlVMTCkKKwkJCQlyZXR1cm4gTlVMTDsKKworCQkJY3QtPnRpbWVvdXQgPSBzdmMtPnRpbWVvdXQ7CisJCX0gZWxzZSB7CisJCQkvKiBzZXQgZGVzdGluYXRpb24gd2l0aCB0aGUgZm91bmQgdGVtcGxhdGUgKi8KKwkJCWRlc3QgPSBjdC0+ZGVzdDsKKwkJfQorCQlkcG9ydCA9IHBvcnRzWzFdOworCX0KKworCS8qCisJICogICAgQ3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gYWNjb3JkaW5nIHRvIHRoZSB0ZW1wbGF0ZQorCSAqLworCWNwID0gaXBfdnNfY29ubl9uZXcoaXBoLT5wcm90b2NvbCwKKwkJCSAgICBpcGgtPnNhZGRyLCBwb3J0c1swXSwKKwkJCSAgICBpcGgtPmRhZGRyLCBwb3J0c1sxXSwKKwkJCSAgICBkZXN0LT5hZGRyLCBkcG9ydCwKKwkJCSAgICAwLAorCQkJICAgIGRlc3QpOworCWlmIChjcCA9PSBOVUxMKSB7CisJCWlwX3ZzX2Nvbm5fcHV0KGN0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyoKKwkgKiAgICBBZGQgaXRzIGNvbnRyb2wKKwkgKi8KKwlpcF92c19jb250cm9sX2FkZChjcCwgY3QpOworCWlwX3ZzX2Nvbm5fcHV0KGN0KTsKKworCWlwX3ZzX2Nvbm5fc3RhdHMoY3AsIHN2Yyk7CisJcmV0dXJuIGNwOworfQorCisKKy8qCisgKiAgSVBWUyBtYWluIHNjaGVkdWxpbmcgZnVuY3Rpb24KKyAqICBJdCBzZWxlY3RzIGEgc2VydmVyIGFjY29yZGluZyB0byB0aGUgdmlydHVhbCBzZXJ2aWNlLCBhbmQKKyAqICBjcmVhdGVzIGEgY29ubmVjdGlvbiBlbnRyeS4KKyAqICBQcm90b2NvbHMgc3VwcG9ydGVkOiBUQ1AsIFVEUAorICovCitzdHJ1Y3QgaXBfdnNfY29ubiAqCitpcF92c19zY2hlZHVsZShzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcF92c19jb25uICpjcCA9IE5VTEw7CisJc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKKwlfX3UxNiBfcG9ydHNbMl0sICpwcHRyOworCisJcHB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlwaC0+aWhsKjQsCisJCQkJICBzaXplb2YoX3BvcnRzKSwgX3BvcnRzKTsKKwlpZiAocHB0ciA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCS8qCisJICogICAgUGVyc2lzdGVudCBzZXJ2aWNlCisJICovCisJaWYgKHN2Yy0+ZmxhZ3MgJiBJUF9WU19TVkNfRl9QRVJTSVNURU5UKQorCQlyZXR1cm4gaXBfdnNfc2NoZWRfcGVyc2lzdChzdmMsIHNrYiwgcHB0cik7CisKKwkvKgorCSAqICAgIE5vbi1wZXJzaXN0ZW50IHNlcnZpY2UKKwkgKi8KKwlpZiAoIXN2Yy0+ZndtYXJrICYmIHBwdHJbMV0gIT0gc3ZjLT5wb3J0KSB7CisJCWlmICghc3ZjLT5wb3J0KQorCQkJSVBfVlNfRVJSKCJTY2hlZHVsZTogcG9ydCB6ZXJvIG9ubHkgc3VwcG9ydGVkICIKKwkJCQkgICJpbiBwZXJzaXN0ZW50IHNlcnZpY2VzLCAiCisJCQkJICAiY2hlY2sgeW91ciBpcHZzIGNvbmZpZ3VyYXRpb25cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkZXN0ID0gc3ZjLT5zY2hlZHVsZXItPnNjaGVkdWxlKHN2Yywgc2tiKTsKKwlpZiAoZGVzdCA9PSBOVUxMKSB7CisJCUlQX1ZTX0RCRygxLCAiU2NoZWR1bGU6IG5vIGRlc3QgZm91bmQuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyoKKwkgKiAgICBDcmVhdGUgYSBjb25uZWN0aW9uIGVudHJ5LgorCSAqLworCWNwID0gaXBfdnNfY29ubl9uZXcoaXBoLT5wcm90b2NvbCwKKwkJCSAgICBpcGgtPnNhZGRyLCBwcHRyWzBdLAorCQkJICAgIGlwaC0+ZGFkZHIsIHBwdHJbMV0sCisJCQkgICAgZGVzdC0+YWRkciwgZGVzdC0+cG9ydD9kZXN0LT5wb3J0OnBwdHJbMV0sCisJCQkgICAgMCwKKwkJCSAgICBkZXN0KTsKKwlpZiAoY3AgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlJUF9WU19EQkcoNiwgIlNjaGVkdWxlIGZ3ZDolYyBjOiV1LiV1LiV1LiV1OiV1IHY6JXUuJXUuJXUuJXU6JXUgIgorCQkgICJkOiV1LiV1LiV1LiV1OiV1IGZsZzolWCBjbnQ6JWRcbiIsCisJCSAgaXBfdnNfZndkX3RhZyhjcCksCisJCSAgTklQUVVBRChjcC0+Y2FkZHIpLCBudG9ocyhjcC0+Y3BvcnQpLAorCQkgIE5JUFFVQUQoY3AtPnZhZGRyKSwgbnRvaHMoY3AtPnZwb3J0KSwKKwkJICBOSVBRVUFEKGNwLT5kYWRkciksIG50b2hzKGNwLT5kcG9ydCksCisJCSAgY3AtPmZsYWdzLCBhdG9taWNfcmVhZCgmY3AtPnJlZmNudCkpOworCisJaXBfdnNfY29ubl9zdGF0cyhjcCwgc3ZjKTsKKwlyZXR1cm4gY3A7Cit9CisKKworLyoKKyAqICBQYXNzIG9yIGRyb3AgdGhlIHBhY2tldC4KKyAqICBDYWxsZWQgYnkgaXBfdnNfaW4sIHdoZW4gdGhlIHZpcnR1YWwgc2VydmljZSBpcyBhdmFpbGFibGUgYnV0CisgKiAgbm8gZGVzdGluYXRpb24gaXMgYXZhaWxhYmxlIGZvciBhIG5ldyBjb25uZWN0aW9uLgorICovCitpbnQgaXBfdnNfbGVhdmUoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2Yywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKK3sKKwlfX3UxNiBfcG9ydHNbMl0sICpwcHRyOworCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisKKwlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBoLT5paGwqNCwKKwkJCQkgIHNpemVvZihfcG9ydHMpLCBfcG9ydHMpOworCWlmIChwcHRyID09IE5VTEwpIHsKKwkJaXBfdnNfc2VydmljZV9wdXQoc3ZjKTsKKwkJcmV0dXJuIE5GX0RST1A7CisJfQorCisJLyogaWYgaXQgaXMgZndtYXJrLWJhc2VkIHNlcnZpY2UsIHRoZSBjYWNoZV9ieXBhc3Mgc3lzY3RsIGlzIHVwCisJICAgYW5kIHRoZSBkZXN0aW5hdGlvbiBpcyBSVE5fVU5JQ0FTVCAoYW5kIG5vdCBsb2NhbCksIHRoZW4gY3JlYXRlCisJICAgYSBjYWNoZV9ieXBhc3MgY29ubmVjdGlvbiBlbnRyeSAqLworCWlmIChzeXNjdGxfaXBfdnNfY2FjaGVfYnlwYXNzICYmIHN2Yy0+ZndtYXJrCisJICAgICYmIChpbmV0X2FkZHJfdHlwZShpcGgtPmRhZGRyKSA9PSBSVE5fVU5JQ0FTVCkpIHsKKwkJaW50IHJldCwgY3M7CisJCXN0cnVjdCBpcF92c19jb25uICpjcDsKKworCQlpcF92c19zZXJ2aWNlX3B1dChzdmMpOworCisJCS8qIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIGVudHJ5ICovCisJCUlQX1ZTX0RCRyg2LCAiaXBfdnNfbGVhdmU6IGNyZWF0ZSBhIGNhY2hlX2J5cGFzcyBlbnRyeVxuIik7CisJCWNwID0gaXBfdnNfY29ubl9uZXcoaXBoLT5wcm90b2NvbCwKKwkJCQkgICAgaXBoLT5zYWRkciwgcHB0clswXSwKKwkJCQkgICAgaXBoLT5kYWRkciwgcHB0clsxXSwKKwkJCQkgICAgMCwgMCwKKwkJCQkgICAgSVBfVlNfQ09OTl9GX0JZUEFTUywKKwkJCQkgICAgTlVMTCk7CisJCWlmIChjcCA9PSBOVUxMKQorCQkJcmV0dXJuIE5GX0RST1A7CisKKwkJLyogc3RhdGlzdGljcyAqLworCQlpcF92c19pbl9zdGF0cyhjcCwgc2tiKTsKKworCQkvKiBzZXQgc3RhdGUgKi8KKwkJY3MgPSBpcF92c19zZXRfc3RhdGUoY3AsIElQX1ZTX0RJUl9JTlBVVCwgc2tiLCBwcCk7CisKKwkJLyogdHJhbnNtaXQgdGhlIGZpcnN0IFNZTiBwYWNrZXQgKi8KKwkJcmV0ID0gY3AtPnBhY2tldF94bWl0KHNrYiwgY3AsIHBwKTsKKwkJLyogZG8gbm90IHRvdWNoIHNrYiBhbnltb3JlICovCisKKwkJYXRvbWljX2luYygmY3AtPmluX3BrdHMpOworCQlpcF92c19jb25uX3B1dChjcCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyoKKwkgKiBXaGVuIHRoZSB2aXJ0dWFsIGZ0cCBzZXJ2aWNlIGlzIHByZXNlbnRlZCwgcGFja2V0cyBkZXN0aW5lZAorCSAqIGZvciBvdGhlciBzZXJ2aWNlcyBvbiB0aGUgVklQIG1heSBnZXQgaGVyZSAoZXhjZXB0IHNlcnZpY2VzCisJICogbGlzdGVkIGluIHRoZSBpcHZzIHRhYmxlKSwgcGFzcyB0aGUgcGFja2V0cywgYmVjYXVzZSBpdCBpcworCSAqIG5vdCBpcHZzIGpvYiB0byBkZWNpZGUgdG8gZHJvcCB0aGUgcGFja2V0cy4KKwkgKi8KKwlpZiAoKHN2Yy0+cG9ydCA9PSBGVFBQT1JUKSAmJiAocHB0clsxXSAhPSBGVFBQT1JUKSkgeworCQlpcF92c19zZXJ2aWNlX3B1dChzdmMpOworCQlyZXR1cm4gTkZfQUNDRVBUOworCX0KKworCWlwX3ZzX3NlcnZpY2VfcHV0KHN2Yyk7CisKKwkvKgorCSAqIE5vdGlmeSB0aGUgY2xpZW50IHRoYXQgdGhlIGRlc3RpbmF0aW9uIGlzIHVucmVhY2hhYmxlLCBhbmQKKwkgKiByZWxlYXNlIHRoZSBzb2NrZXQgYnVmZmVyLgorCSAqIFNpbmNlIGl0IGlzIGluIElQIGxheWVyLCB0aGUgVENQIHNvY2tldCBpcyBub3QgYWN0dWFsbHkKKwkgKiBjcmVhdGVkLCB0aGUgVENQIFJTVCBwYWNrZXQgY2Fubm90IGJlIHNlbnQsIGluc3RlYWQgdGhhdAorCSAqIElDTVBfUE9SVF9VTlJFQUNIIGlzIHNlbnQgaGVyZSBubyBtYXR0ZXIgaXQgaXMgVENQL1VEUC4gLS1XWgorCSAqLworCWljbXBfc2VuZChza2IsIElDTVBfREVTVF9VTlJFQUNILCBJQ01QX1BPUlRfVU5SRUFDSCwgMCk7CisJcmV0dXJuIE5GX0RST1A7Cit9CisKKworLyoKKyAqICAgICAgSXQgaXMgaG9va2VkIGJlZm9yZSBORl9JUF9QUklfTkFUX1NSQyBhdCB0aGUgTkZfSVBfUE9TVF9ST1VUSU5HCisgKiAgICAgIGNoYWluLCBhbmQgaXMgdXNlZCBmb3IgVlMvTkFULgorICogICAgICBJdCBkZXRlY3RzIHBhY2tldHMgZm9yIFZTL05BVCBjb25uZWN0aW9ucyBhbmQgc2VuZHMgdGhlIHBhY2tldHMKKyAqICAgICAgaW1tZWRpYXRlbHkuIFRoaXMgY2FuIGF2b2lkIHRoYXQgaXB0YWJsZV9uYXQgbWFuZ2xlcyB0aGUgcGFja2V0cworICogICAgICBmb3IgVlMvTkFULgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGlwX3ZzX3Bvc3Rfcm91dGluZyh1bnNpZ25lZCBpbnQgaG9va251bSwKKwkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQkJICAgICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQoreworCWlmICghKCgqcHNrYiktPm5mY2FjaGUgJiBORkNfSVBWU19QUk9QRVJUWSkpCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwkvKiBUaGUgcGFja2V0IHdhcyBzZW50IGZyb20gSVBWUywgZXhpdCB0aGlzIGNoYWluICovCisJKCpva2ZuKSgqcHNrYik7CisKKwlyZXR1cm4gTkZfU1RPTEVOOworfQorCit1MTYgaXBfdnNfY2hlY2tzdW1fY29tcGxldGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gKHUxNikgY3N1bV9mb2xkKHNrYl9jaGVja3N1bShza2IsIG9mZnNldCwgc2tiLT5sZW4gLSBvZmZzZXQsIDApKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqCitpcF92c19nYXRoZXJfZnJhZ3Moc3RydWN0IHNrX2J1ZmYgKnNrYiwgdV9pbnQzMl90IHVzZXIpCit7CisJc2tiID0gaXBfZGVmcmFnKHNrYiwgdXNlcik7CisJaWYgKHNrYikKKwkJaXBfc2VuZF9jaGVjayhza2ItPm5oLmlwaCk7CisJcmV0dXJuIHNrYjsKK30KKworLyoKKyAqIFBhY2tldCBoYXMgYmVlbiBtYWRlIHN1ZmZpY2llbnRseSB3cml0YWJsZSBpbiBjYWxsZXIKKyAqIC0gaW5vdXQ6IDE9aW4tPm91dCwgMD1vdXQtPmluCisgKi8KK3ZvaWQgaXBfdnNfbmF0X2ljbXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKKwkJICAgIHN0cnVjdCBpcF92c19jb25uICpjcCwgaW50IGlub3V0KQoreworCXN0cnVjdCBpcGhkciAqaXBoCSA9IHNrYi0+bmguaXBoOworCXVuc2lnbmVkIGludCBpY21wX29mZnNldCA9IGlwaC0+aWhsKjQ7CisJc3RydWN0IGljbXBoZHIgKmljbXBoCSA9IChzdHJ1Y3QgaWNtcGhkciAqKShza2ItPm5oLnJhdyArIGljbXBfb2Zmc2V0KTsKKwlzdHJ1Y3QgaXBoZHIgKmNpcGgJID0gKHN0cnVjdCBpcGhkciAqKShpY21waCArIDEpOworCisJaWYgKGlub3V0KSB7CisJCWlwaC0+c2FkZHIgPSBjcC0+dmFkZHI7CisJCWlwX3NlbmRfY2hlY2soaXBoKTsKKwkJY2lwaC0+ZGFkZHIgPSBjcC0+dmFkZHI7CisJCWlwX3NlbmRfY2hlY2soY2lwaCk7CisJfSBlbHNlIHsKKwkJaXBoLT5kYWRkciA9IGNwLT5kYWRkcjsKKwkJaXBfc2VuZF9jaGVjayhpcGgpOworCQljaXBoLT5zYWRkciA9IGNwLT5kYWRkcjsKKwkJaXBfc2VuZF9jaGVjayhjaXBoKTsKKwl9CisKKwkvKiB0aGUgVENQL1VEUCBwb3J0ICovCisJaWYgKElQUFJPVE9fVENQID09IGNpcGgtPnByb3RvY29sIHx8IElQUFJPVE9fVURQID09IGNpcGgtPnByb3RvY29sKSB7CisJCV9fdTE2ICpwb3J0cyA9ICh2b2lkICopY2lwaCArIGNpcGgtPmlobCo0OworCisJCWlmIChpbm91dCkKKwkJCXBvcnRzWzFdID0gY3AtPnZwb3J0OworCQllbHNlCisJCQlwb3J0c1swXSA9IGNwLT5kcG9ydDsKKwl9CisKKwkvKiBBbmQgZmluYWxseSB0aGUgSUNNUCBjaGVja3N1bSAqLworCWljbXBoLT5jaGVja3N1bSA9IDA7CisJaWNtcGgtPmNoZWNrc3VtID0gaXBfdnNfY2hlY2tzdW1fY29tcGxldGUoc2tiLCBpY21wX29mZnNldCk7CisJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKworCWlmIChpbm91dCkKKwkJSVBfVlNfREJHX1BLVCgxMSwgcHAsIHNrYiwgKHZvaWQgKiljaXBoIC0gKHZvaWQgKilpcGgsCisJCQkiRm9yd2FyZGluZyBhbHRlcmVkIG91dGdvaW5nIElDTVAiKTsKKwllbHNlCisJCUlQX1ZTX0RCR19QS1QoMTEsIHBwLCBza2IsICh2b2lkICopY2lwaCAtICh2b2lkICopaXBoLAorCQkJIkZvcndhcmRpbmcgYWx0ZXJlZCBpbmNvbWluZyBJQ01QIik7Cit9CisKKy8qCisgKglIYW5kbGUgSUNNUCBtZXNzYWdlcyBpbiB0aGUgaW5zaWRlLXRvLW91dHNpZGUgZGlyZWN0aW9uIChvdXRnb2luZykuCisgKglGaW5kIGFueSB0aGF0IG1pZ2h0IGJlIHJlbGV2YW50LCBjaGVjayBhZ2FpbnN0IGV4aXN0aW5nIGNvbm5lY3Rpb25zLAorICoJZm9yd2FyZCB0byB0aGUgcmlnaHQgZGVzdGluYXRpb24gaG9zdCBpZiByZWxldmFudC4KKyAqCUN1cnJlbnRseSBoYW5kbGVzIGVycm9yIHR5cGVzIC0gdW5yZWFjaGFibGUsIHF1ZW5jaCwgdHRsIGV4Y2VlZGVkLgorICoJKE9ubHkgdXNlZCBpbiBWUy9OQVQpCisgKi8KK3N0YXRpYyBpbnQgaXBfdnNfb3V0X2ljbXAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBpbnQgKnJlbGF0ZWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpwc2tiOworCXN0cnVjdCBpcGhkciAqaXBoOworCXN0cnVjdCBpY21waGRyCV9pY21waCwgKmljOworCXN0cnVjdCBpcGhkcglfY2lwaCwgKmNpaDsJLyogVGhlIGlwIGhlYWRlciBjb250YWluZWQgd2l0aGluIHRoZSBJQ01QICovCisJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOworCXN0cnVjdCBpcF92c19wcm90b2NvbCAqcHA7CisJdW5zaWduZWQgaW50IG9mZnNldCwgaWhsLCB2ZXJkaWN0OworCisJKnJlbGF0ZWQgPSAxOworCisJLyogcmVhc3NlbWJsZSBJUCBmcmFnbWVudHMgKi8KKwlpZiAoc2tiLT5uaC5pcGgtPmZyYWdfb2ZmICYgX19jb25zdGFudF9odG9ucyhJUF9NRnxJUF9PRkZTRVQpKSB7CisJCXNrYiA9IGlwX3ZzX2dhdGhlcl9mcmFncyhza2IsIElQX0RFRlJBR19WU19PVVQpOworCQlpZiAoIXNrYikKKwkJCXJldHVybiBORl9TVE9MRU47CisJCSpwc2tiID0gc2tiOworCX0KKworCWlwaCA9IHNrYi0+bmguaXBoOworCW9mZnNldCA9IGlobCA9IGlwaC0+aWhsICogNDsKKwlpYyA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgc2l6ZW9mKF9pY21waCksICZfaWNtcGgpOworCWlmIChpYyA9PSBOVUxMKQorCQlyZXR1cm4gTkZfRFJPUDsKKworCUlQX1ZTX0RCRygxMiwgIk91dGdvaW5nIElDTVAgKCVkLCVkKSAldS4ldS4ldS4ldS0+JXUuJXUuJXUuJXVcbiIsCisJCSAgaWMtPnR5cGUsIG50b2hzKGljbXBfaWQoaWMpKSwKKwkJICBOSVBRVUFEKGlwaC0+c2FkZHIpLCBOSVBRVUFEKGlwaC0+ZGFkZHIpKTsKKworCS8qCisJICogV29yayB0aHJvdWdoIHNlZWluZyBpZiB0aGlzIGlzIGZvciB1cy4KKwkgKiBUaGVzZSBjaGVja3MgYXJlIHN1cHBvc2VkIHRvIGJlIGluIGFuIG9yZGVyIHRoYXQgbWVhbnMgZWFzeQorCSAqIHRoaW5ncyBhcmUgY2hlY2tlZCBmaXJzdCB0byBzcGVlZCB1cCBwcm9jZXNzaW5nLi4uLiBob3dldmVyCisJICogdGhpcyBtZWFucyB0aGF0IHNvbWUgcGFja2V0cyB3aWxsIG1hbmFnZSB0byBnZXQgYSBsb25nIHdheQorCSAqIGRvd24gdGhpcyBzdGFjayBhbmQgdGhlbiBiZSByZWplY3RlZCwgYnV0IHRoYXQncyBsaWZlLgorCSAqLworCWlmICgoaWMtPnR5cGUgIT0gSUNNUF9ERVNUX1VOUkVBQ0gpICYmCisJICAgIChpYy0+dHlwZSAhPSBJQ01QX1NPVVJDRV9RVUVOQ0gpICYmCisJICAgIChpYy0+dHlwZSAhPSBJQ01QX1RJTUVfRVhDRUVERUQpKSB7CisJCSpyZWxhdGVkID0gMDsKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKwl9CisKKwkvKiBOb3cgZmluZCB0aGUgY29udGFpbmVkIElQIGhlYWRlciAqLworCW9mZnNldCArPSBzaXplb2YoX2ljbXBoKTsKKwljaWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIHNpemVvZihfY2lwaCksICZfY2lwaCk7CisJaWYgKGNpaCA9PSBOVUxMKQorCQlyZXR1cm4gTkZfQUNDRVBUOyAvKiBUaGUgcGFja2V0IGxvb2tzIHdyb25nLCBpZ25vcmUgKi8KKworCXBwID0gaXBfdnNfcHJvdG9fZ2V0KGNpaC0+cHJvdG9jb2wpOworCWlmICghcHApCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwkvKiBJcyB0aGUgZW1iZWRkZWQgcHJvdG9jb2wgaGVhZGVyIHByZXNlbnQ/ICovCisJaWYgKHVubGlrZWx5KGNpaC0+ZnJhZ19vZmYgJiBfX2NvbnN0YW50X2h0b25zKElQX09GRlNFVCkgJiYKKwkJICAgICBwcC0+ZG9udF9kZWZyYWcpKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJSVBfVlNfREJHX1BLVCgxMSwgcHAsIHNrYiwgb2Zmc2V0LCAiQ2hlY2tpbmcgb3V0Z29pbmcgSUNNUCBmb3IiKTsKKworCW9mZnNldCArPSBjaWgtPmlobCAqIDQ7CisKKwkvKiBUaGUgZW1iZWRkZWQgaGVhZGVycyBjb250YWluIHNvdXJjZSBhbmQgZGVzdCBpbiByZXZlcnNlIG9yZGVyICovCisJY3AgPSBwcC0+Y29ubl9vdXRfZ2V0KHNrYiwgcHAsIGNpaCwgb2Zmc2V0LCAxKTsKKwlpZiAoIWNwKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJdmVyZGljdCA9IE5GX0RST1A7CisKKwlpZiAoSVBfVlNfRldEX01FVEhPRChjcCkgIT0gMCkgeworCQlJUF9WU19FUlIoInNob3VsZG4ndCByZWFjaCBoZXJlLCBiZWNhdXNlIHRoZSBib3ggaXMgb24gdGhlIgorCQkJICAiaGFsZiBjb25uZWN0aW9uIGluIHRoZSB0dW4vZHIgbW9kdWxlLlxuIik7CisJfQorCisJLyogRW5zdXJlIHRoZSBjaGVja3N1bSBpcyBjb3JyZWN0ICovCisJaWYgKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1VOTkVDRVNTQVJZICYmCisJICAgIGlwX3ZzX2NoZWNrc3VtX2NvbXBsZXRlKHNrYiwgaWhsKSkgeworCQkvKiBGYWlsZWQgY2hlY2tzdW0hICovCisJCUlQX1ZTX0RCRygxLCAiRm9yd2FyZCBJQ01QOiBmYWlsZWQgY2hlY2tzdW0gZnJvbSAlZC4lZC4lZC4lZCFcbiIsCisJCQkgIE5JUFFVQUQoaXBoLT5zYWRkcikpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoSVBQUk9UT19UQ1AgPT0gY2loLT5wcm90b2NvbCB8fCBJUFBST1RPX1VEUCA9PSBjaWgtPnByb3RvY29sKQorCQlvZmZzZXQgKz0gMiAqIHNpemVvZihfX3UxNik7CisJaWYgKCFpcF92c19tYWtlX3NrYl93cml0YWJsZShwc2tiLCBvZmZzZXQpKQorCQlnb3RvIG91dDsKKwlza2IgPSAqcHNrYjsKKworCWlwX3ZzX25hdF9pY21wKHNrYiwgcHAsIGNwLCAxKTsKKworCS8qIGRvIHRoZSBzdGF0aXN0aWNzIGFuZCBwdXQgaXQgYmFjayAqLworCWlwX3ZzX291dF9zdGF0cyhjcCwgc2tiKTsKKworCXNrYi0+bmZjYWNoZSB8PSBORkNfSVBWU19QUk9QRVJUWTsKKwl2ZXJkaWN0ID0gTkZfQUNDRVBUOworCisgIG91dDoKKwlfX2lwX3ZzX2Nvbm5fcHV0KGNwKTsKKworCXJldHVybiB2ZXJkaWN0OworfQorCitzdGF0aWMgaW5saW5lIGludCBpc190Y3BfcmVzZXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGg7CisKKwl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYi0+bmguaXBoLT5paGwgKiA0LAorCQkJCXNpemVvZihfdGNwaCksICZfdGNwaCk7CisJaWYgKHRoID09IE5VTEwpCisJCXJldHVybiAwOworCXJldHVybiB0aC0+cnN0OworfQorCisvKgorICoJSXQgaXMgaG9va2VkIGF0IHRoZSBORl9JUF9GT1JXQVJEIGNoYWluLCB1c2VkIG9ubHkgZm9yIFZTL05BVC4KKyAqCUNoZWNrIGlmIG91dGdvaW5nIHBhY2tldCBiZWxvbmdzIHRvIHRoZSBlc3RhYmxpc2hlZCBpcF92c19jb25uLAorICogICAgICByZXdyaXRlIGFkZHJlc3NlcyBvZiB0aGUgcGFja2V0IGFuZCBzZW5kIGl0IG9uIGl0cyB3YXkuLi4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludAoraXBfdnNfb3V0KHVuc2lnbmVkIGludCBob29rbnVtLCBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAgKnNrYiA9ICpwc2tiOworCXN0cnVjdCBpcGhkcgkqaXBoOworCXN0cnVjdCBpcF92c19wcm90b2NvbCAqcHA7CisJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOworCWludCBpaGw7CisKKwlFbnRlckZ1bmN0aW9uKDExKTsKKworCWlmIChza2ItPm5mY2FjaGUgJiBORkNfSVBWU19QUk9QRVJUWSkKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKworCWlwaCA9IHNrYi0+bmguaXBoOworCWlmICh1bmxpa2VseShpcGgtPnByb3RvY29sID09IElQUFJPVE9fSUNNUCkpIHsKKwkJaW50IHJlbGF0ZWQsIHZlcmRpY3QgPSBpcF92c19vdXRfaWNtcChwc2tiLCAmcmVsYXRlZCk7CisKKwkJaWYgKHJlbGF0ZWQpCisJCQlyZXR1cm4gdmVyZGljdDsKKwkJc2tiID0gKnBza2I7CisJCWlwaCA9IHNrYi0+bmguaXBoOworCX0KKworCXBwID0gaXBfdnNfcHJvdG9fZ2V0KGlwaC0+cHJvdG9jb2wpOworCWlmICh1bmxpa2VseSghcHApKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJLyogcmVhc3NlbWJsZSBJUCBmcmFnbWVudHMgKi8KKwlpZiAodW5saWtlbHkoaXBoLT5mcmFnX29mZiAmIF9fY29uc3RhbnRfaHRvbnMoSVBfTUZ8SVBfT0ZGU0VUKSAmJgorCQkgICAgICFwcC0+ZG9udF9kZWZyYWcpKSB7CisJCXNrYiA9IGlwX3ZzX2dhdGhlcl9mcmFncyhza2IsIElQX0RFRlJBR19WU19PVVQpOworCQlpZiAoIXNrYikKKwkJCXJldHVybiBORl9TVE9MRU47CisJCWlwaCA9IHNrYi0+bmguaXBoOworCQkqcHNrYiA9IHNrYjsKKwl9CisKKwlpaGwgPSBpcGgtPmlobCA8PCAyOworCisJLyoKKwkgKiBDaGVjayBpZiB0aGUgcGFja2V0IGJlbG9uZ3MgdG8gYW4gZXhpc3RpbmcgZW50cnkKKwkgKi8KKwljcCA9IHBwLT5jb25uX291dF9nZXQoc2tiLCBwcCwgaXBoLCBpaGwsIDApOworCisJaWYgKHVubGlrZWx5KCFjcCkpIHsKKwkJaWYgKHN5c2N0bF9pcF92c19uYXRfaWNtcF9zZW5kICYmCisJCSAgICAocHAtPnByb3RvY29sID09IElQUFJPVE9fVENQIHx8CisJCSAgICAgcHAtPnByb3RvY29sID09IElQUFJPVE9fVURQKSkgeworCQkJX191MTYgX3BvcnRzWzJdLCAqcHB0cjsKKworCQkJcHB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlobCwKKwkJCQkJCSAgc2l6ZW9mKF9wb3J0cyksIF9wb3J0cyk7CisJCQlpZiAocHB0ciA9PSBOVUxMKQorCQkJCXJldHVybiBORl9BQ0NFUFQ7CS8qIE5vdCBmb3IgbWUgKi8KKwkJCWlmIChpcF92c19sb29rdXBfcmVhbF9zZXJ2aWNlKGlwaC0+cHJvdG9jb2wsCisJCQkJCQkgICAgICBpcGgtPnNhZGRyLCBwcHRyWzBdKSkgeworCQkJCS8qCisJCQkJICogTm90aWZ5IHRoZSByZWFsIHNlcnZlcjogdGhlcmUgaXMgbm8KKwkJCQkgKiBleGlzdGluZyBlbnRyeSBpZiBpdCBpcyBub3QgUlNUCisJCQkJICogcGFja2V0IG9yIG5vdCBUQ1AgcGFja2V0LgorCQkJCSAqLworCQkJCWlmIChpcGgtPnByb3RvY29sICE9IElQUFJPVE9fVENQCisJCQkJICAgIHx8ICFpc190Y3BfcmVzZXQoc2tiKSkgeworCQkJCQlpY21wX3NlbmQoc2tiLElDTVBfREVTVF9VTlJFQUNILAorCQkJCQkJICBJQ01QX1BPUlRfVU5SRUFDSCwgMCk7CisJCQkJCXJldHVybiBORl9EUk9QOworCQkJCX0KKwkJCX0KKwkJfQorCQlJUF9WU19EQkdfUEtUKDEyLCBwcCwgc2tiLCAwLAorCQkJICAgICAgInBhY2tldCBjb250aW51ZXMgdHJhdmVyc2FsIGFzIG5vcm1hbCIpOworCQlyZXR1cm4gTkZfQUNDRVBUOworCX0KKworCUlQX1ZTX0RCR19QS1QoMTEsIHBwLCBza2IsIDAsICJPdXRnb2luZyBwYWNrZXQiKTsKKworCWlmICghaXBfdnNfbWFrZV9za2Jfd3JpdGFibGUocHNrYiwgaWhsKSkKKwkJZ290byBkcm9wOworCisJLyogbWFuZ2xlIHRoZSBwYWNrZXQgKi8KKwlpZiAocHAtPnNuYXRfaGFuZGxlciAmJiAhcHAtPnNuYXRfaGFuZGxlcihwc2tiLCBwcCwgY3ApKQorCQlnb3RvIGRyb3A7CisJc2tiID0gKnBza2I7CisJc2tiLT5uaC5pcGgtPnNhZGRyID0gY3AtPnZhZGRyOworCWlwX3NlbmRfY2hlY2soc2tiLT5uaC5pcGgpOworCisJSVBfVlNfREJHX1BLVCgxMCwgcHAsIHNrYiwgMCwgIkFmdGVyIFNOQVQiKTsKKworCWlwX3ZzX291dF9zdGF0cyhjcCwgc2tiKTsKKwlpcF92c19zZXRfc3RhdGUoY3AsIElQX1ZTX0RJUl9PVVRQVVQsIHNrYiwgcHApOworCWlwX3ZzX2Nvbm5fcHV0KGNwKTsKKworCXNrYi0+bmZjYWNoZSB8PSBORkNfSVBWU19QUk9QRVJUWTsKKworCUxlYXZlRnVuY3Rpb24oMTEpOworCXJldHVybiBORl9BQ0NFUFQ7CisKKyAgZHJvcDoKKwlpcF92c19jb25uX3B1dChjcCk7CisJa2ZyZWVfc2tiKCpwc2tiKTsKKwlyZXR1cm4gTkZfU1RPTEVOOworfQorCisKKy8qCisgKglIYW5kbGUgSUNNUCBtZXNzYWdlcyBpbiB0aGUgb3V0c2lkZS10by1pbnNpZGUgZGlyZWN0aW9uIChpbmNvbWluZykuCisgKglGaW5kIGFueSB0aGF0IG1pZ2h0IGJlIHJlbGV2YW50LCBjaGVjayBhZ2FpbnN0IGV4aXN0aW5nIGNvbm5lY3Rpb25zLAorICoJZm9yd2FyZCB0byB0aGUgcmlnaHQgZGVzdGluYXRpb24gaG9zdCBpZiByZWxldmFudC4KKyAqCUN1cnJlbnRseSBoYW5kbGVzIGVycm9yIHR5cGVzIC0gdW5yZWFjaGFibGUsIHF1ZW5jaCwgdHRsIGV4Y2VlZGVkLgorICovCitzdGF0aWMgaW50IAoraXBfdnNfaW5faWNtcChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIGludCAqcmVsYXRlZCwgdW5zaWduZWQgaW50IGhvb2tudW0pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpwc2tiOworCXN0cnVjdCBpcGhkciAqaXBoOworCXN0cnVjdCBpY21waGRyCV9pY21waCwgKmljOworCXN0cnVjdCBpcGhkcglfY2lwaCwgKmNpaDsJLyogVGhlIGlwIGhlYWRlciBjb250YWluZWQgd2l0aGluIHRoZSBJQ01QICovCisJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOworCXN0cnVjdCBpcF92c19wcm90b2NvbCAqcHA7CisJdW5zaWduZWQgaW50IG9mZnNldCwgaWhsLCB2ZXJkaWN0OworCisJKnJlbGF0ZWQgPSAxOworCisJLyogcmVhc3NlbWJsZSBJUCBmcmFnbWVudHMgKi8KKwlpZiAoc2tiLT5uaC5pcGgtPmZyYWdfb2ZmICYgX19jb25zdGFudF9odG9ucyhJUF9NRnxJUF9PRkZTRVQpKSB7CisJCXNrYiA9IGlwX3ZzX2dhdGhlcl9mcmFncyhza2IsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICBob29rbnVtID09IE5GX0lQX0xPQ0FMX0lOID8KKwkJCQkJIElQX0RFRlJBR19WU19JTiA6IElQX0RFRlJBR19WU19GV0QpOworCQlpZiAoIXNrYikKKwkJCXJldHVybiBORl9TVE9MRU47CisJCSpwc2tiID0gc2tiOworCX0KKworCWlwaCA9IHNrYi0+bmguaXBoOworCW9mZnNldCA9IGlobCA9IGlwaC0+aWhsICogNDsKKwlpYyA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgc2l6ZW9mKF9pY21waCksICZfaWNtcGgpOworCWlmIChpYyA9PSBOVUxMKQorCQlyZXR1cm4gTkZfRFJPUDsKKworCUlQX1ZTX0RCRygxMiwgIkluY29taW5nIElDTVAgKCVkLCVkKSAldS4ldS4ldS4ldS0+JXUuJXUuJXUuJXVcbiIsCisJCSAgaWMtPnR5cGUsIG50b2hzKGljbXBfaWQoaWMpKSwKKwkJICBOSVBRVUFEKGlwaC0+c2FkZHIpLCBOSVBRVUFEKGlwaC0+ZGFkZHIpKTsKKworCS8qCisJICogV29yayB0aHJvdWdoIHNlZWluZyBpZiB0aGlzIGlzIGZvciB1cy4KKwkgKiBUaGVzZSBjaGVja3MgYXJlIHN1cHBvc2VkIHRvIGJlIGluIGFuIG9yZGVyIHRoYXQgbWVhbnMgZWFzeQorCSAqIHRoaW5ncyBhcmUgY2hlY2tlZCBmaXJzdCB0byBzcGVlZCB1cCBwcm9jZXNzaW5nLi4uLiBob3dldmVyCisJICogdGhpcyBtZWFucyB0aGF0IHNvbWUgcGFja2V0cyB3aWxsIG1hbmFnZSB0byBnZXQgYSBsb25nIHdheQorCSAqIGRvd24gdGhpcyBzdGFjayBhbmQgdGhlbiBiZSByZWplY3RlZCwgYnV0IHRoYXQncyBsaWZlLgorCSAqLworCWlmICgoaWMtPnR5cGUgIT0gSUNNUF9ERVNUX1VOUkVBQ0gpICYmCisJICAgIChpYy0+dHlwZSAhPSBJQ01QX1NPVVJDRV9RVUVOQ0gpICYmCisJICAgIChpYy0+dHlwZSAhPSBJQ01QX1RJTUVfRVhDRUVERUQpKSB7CisJCSpyZWxhdGVkID0gMDsKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKwl9CisKKwkvKiBOb3cgZmluZCB0aGUgY29udGFpbmVkIElQIGhlYWRlciAqLworCW9mZnNldCArPSBzaXplb2YoX2ljbXBoKTsKKwljaWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIHNpemVvZihfY2lwaCksICZfY2lwaCk7CisJaWYgKGNpaCA9PSBOVUxMKQorCQlyZXR1cm4gTkZfQUNDRVBUOyAvKiBUaGUgcGFja2V0IGxvb2tzIHdyb25nLCBpZ25vcmUgKi8KKworCXBwID0gaXBfdnNfcHJvdG9fZ2V0KGNpaC0+cHJvdG9jb2wpOworCWlmICghcHApCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwkvKiBJcyB0aGUgZW1iZWRkZWQgcHJvdG9jb2wgaGVhZGVyIHByZXNlbnQ/ICovCisJaWYgKHVubGlrZWx5KGNpaC0+ZnJhZ19vZmYgJiBfX2NvbnN0YW50X2h0b25zKElQX09GRlNFVCkgJiYKKwkJICAgICBwcC0+ZG9udF9kZWZyYWcpKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJSVBfVlNfREJHX1BLVCgxMSwgcHAsIHNrYiwgb2Zmc2V0LCAiQ2hlY2tpbmcgaW5jb21pbmcgSUNNUCBmb3IiKTsKKworCW9mZnNldCArPSBjaWgtPmlobCAqIDQ7CisKKwkvKiBUaGUgZW1iZWRkZWQgaGVhZGVycyBjb250YWluIHNvdXJjZSBhbmQgZGVzdCBpbiByZXZlcnNlIG9yZGVyICovCisJY3AgPSBwcC0+Y29ubl9pbl9nZXQoc2tiLCBwcCwgY2loLCBvZmZzZXQsIDEpOworCWlmICghY3ApCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwl2ZXJkaWN0ID0gTkZfRFJPUDsKKworCS8qIEVuc3VyZSB0aGUgY2hlY2tzdW0gaXMgY29ycmVjdCAqLworCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSAmJgorCSAgICBpcF92c19jaGVja3N1bV9jb21wbGV0ZShza2IsIGlobCkpIHsKKwkJLyogRmFpbGVkIGNoZWNrc3VtISAqLworCQlJUF9WU19EQkcoMSwgIkluY29taW5nIElDTVA6IGZhaWxlZCBjaGVja3N1bSBmcm9tICVkLiVkLiVkLiVkIVxuIiwKKwkJCSAgTklQUVVBRChpcGgtPnNhZGRyKSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIGRvIHRoZSBzdGF0aXN0aWNzIGFuZCBwdXQgaXQgYmFjayAqLworCWlwX3ZzX2luX3N0YXRzKGNwLCBza2IpOworCWlmIChJUFBST1RPX1RDUCA9PSBjaWgtPnByb3RvY29sIHx8IElQUFJPVE9fVURQID09IGNpaC0+cHJvdG9jb2wpCisJCW9mZnNldCArPSAyICogc2l6ZW9mKF9fdTE2KTsKKwl2ZXJkaWN0ID0gaXBfdnNfaWNtcF94bWl0KHNrYiwgY3AsIHBwLCBvZmZzZXQpOworCS8qIGRvIG5vdCB0b3VjaCBza2IgYW55bW9yZSAqLworCisgIG91dDoKKwlfX2lwX3ZzX2Nvbm5fcHV0KGNwKTsKKworCXJldHVybiB2ZXJkaWN0OworfQorCisvKgorICoJQ2hlY2sgaWYgaXQncyBmb3IgdmlydHVhbCBzZXJ2aWNlcywgbG9vayBpdCB1cCwKKyAqCWFuZCBzZW5kIGl0IG9uIGl0cyB3YXkuLi4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludAoraXBfdnNfaW4odW5zaWduZWQgaW50IGhvb2tudW0sIHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiID0gKnBza2I7CisJc3RydWN0IGlwaGRyCSppcGg7CisJc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcDsKKwlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7CisJaW50IHJldCwgcmVzdGFydDsKKwlpbnQgaWhsOworCisJLyoKKwkgKglCaWcgdGFwcG86IG9ubHkgUEFDS0VUX0hPU1QgKG5laXRoZXIgbG9vcGJhY2sgbm9yIG1jYXN0cykKKwkgKgkuLi4gZG9uJ3Qga25vdyB3aHkgMXN0IHRlc3QgRE9FUyBOT1QgaW5jbHVkZSAybmQgKD8pCisJICovCisJaWYgKHVubGlrZWx5KHNrYi0+cGt0X3R5cGUgIT0gUEFDS0VUX0hPU1QKKwkJICAgICB8fCBza2ItPmRldiA9PSAmbG9vcGJhY2tfZGV2IHx8IHNrYi0+c2spKSB7CisJCUlQX1ZTX0RCRygxMiwgInBhY2tldCB0eXBlPSVkIHByb3RvPSVkIGRhZGRyPSVkLiVkLiVkLiVkIGlnbm9yZWRcbiIsCisJCQkgIHNrYi0+cGt0X3R5cGUsCisJCQkgIHNrYi0+bmguaXBoLT5wcm90b2NvbCwKKwkJCSAgTklQUVVBRChza2ItPm5oLmlwaC0+ZGFkZHIpKTsKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKwl9CisKKwlpcGggPSBza2ItPm5oLmlwaDsKKwlpZiAodW5saWtlbHkoaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX0lDTVApKSB7CisJCWludCByZWxhdGVkLCB2ZXJkaWN0ID0gaXBfdnNfaW5faWNtcChwc2tiLCAmcmVsYXRlZCwgaG9va251bSk7CisKKwkJaWYgKHJlbGF0ZWQpCisJCQlyZXR1cm4gdmVyZGljdDsKKwkJc2tiID0gKnBza2I7CisJCWlwaCA9IHNrYi0+bmguaXBoOworCX0KKworCS8qIFByb3RvY29sIHN1cHBvcnRlZD8gKi8KKwlwcCA9IGlwX3ZzX3Byb3RvX2dldChpcGgtPnByb3RvY29sKTsKKwlpZiAodW5saWtlbHkoIXBwKSkKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKworCWlobCA9IGlwaC0+aWhsIDw8IDI7CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBwYWNrZXQgYmVsb25ncyB0byBhbiBleGlzdGluZyBjb25uZWN0aW9uIGVudHJ5CisJICovCisJY3AgPSBwcC0+Y29ubl9pbl9nZXQoc2tiLCBwcCwgaXBoLCBpaGwsIDApOworCisJaWYgKHVubGlrZWx5KCFjcCkpIHsKKwkJaW50IHY7CisKKwkJaWYgKCFwcC0+Y29ubl9zY2hlZHVsZShza2IsIHBwLCAmdiwgJmNwKSkKKwkJCXJldHVybiB2OworCX0KKworCWlmICh1bmxpa2VseSghY3ApKSB7CisJCS8qIHNvcnJ5LCBhbGwgdGhpcyB0cm91YmxlIGZvciBhIG5vLWhpdCA6KSAqLworCQlJUF9WU19EQkdfUEtUKDEyLCBwcCwgc2tiLCAwLAorCQkJICAgICAgInBhY2tldCBjb250aW51ZXMgdHJhdmVyc2FsIGFzIG5vcm1hbCIpOworCQlyZXR1cm4gTkZfQUNDRVBUOworCX0KKworCUlQX1ZTX0RCR19QS1QoMTEsIHBwLCBza2IsIDAsICJJbmNvbWluZyBwYWNrZXQiKTsKKworCS8qIENoZWNrIHRoZSBzZXJ2ZXIgc3RhdHVzICovCisJaWYgKGNwLT5kZXN0ICYmICEoY3AtPmRlc3QtPmZsYWdzICYgSVBfVlNfREVTVF9GX0FWQUlMQUJMRSkpIHsKKwkJLyogdGhlIGRlc3RpbmF0aW9uIHNlcnZlciBpcyBub3QgYXZhaWxhYmxlICovCisKKwkJaWYgKHN5c2N0bF9pcF92c19leHBpcmVfbm9kZXN0X2Nvbm4pIHsKKwkJCS8qIHRyeSB0byBleHBpcmUgdGhlIGNvbm5lY3Rpb24gaW1tZWRpYXRlbHkgKi8KKwkJCWlwX3ZzX2Nvbm5fZXhwaXJlX25vdyhjcCk7CisJCX0gZWxzZSB7CisJCQkvKiBkb24ndCByZXN0YXJ0IGl0cyB0aW1lciwgYW5kIHNpbGVudGx5CisJCQkgICBkcm9wIHRoZSBwYWNrZXQuICovCisJCQlfX2lwX3ZzX2Nvbm5fcHV0KGNwKTsKKwkJfQorCQlyZXR1cm4gTkZfRFJPUDsKKwl9CisKKwlpcF92c19pbl9zdGF0cyhjcCwgc2tiKTsKKwlyZXN0YXJ0ID0gaXBfdnNfc2V0X3N0YXRlKGNwLCBJUF9WU19ESVJfSU5QVVQsIHNrYiwgcHApOworCWlmIChjcC0+cGFja2V0X3htaXQpCisJCXJldCA9IGNwLT5wYWNrZXRfeG1pdChza2IsIGNwLCBwcCk7CisJCS8qIGRvIG5vdCB0b3VjaCBza2IgYW55bW9yZSAqLworCWVsc2UgeworCQlJUF9WU19EQkdfUkwoIndhcm5pbmc6IHBhY2tldF94bWl0IGlzIG51bGwiKTsKKwkJcmV0ID0gTkZfQUNDRVBUOworCX0KKworCS8qIGluY3JlYXNlIGl0cyBwYWNrZXQgY291bnRlciBhbmQgY2hlY2sgaWYgaXQgaXMgbmVlZGVkCisJICAgdG8gYmUgc3luY2hyb25pemVkICovCisJYXRvbWljX2luYygmY3AtPmluX3BrdHMpOworCWlmICgoaXBfdnNfc3luY19zdGF0ZSAmIElQX1ZTX1NUQVRFX01BU1RFUikgJiYKKwkgICAgKGNwLT5wcm90b2NvbCAhPSBJUFBST1RPX1RDUCB8fAorCSAgICAgY3AtPnN0YXRlID09IElQX1ZTX1RDUF9TX0VTVEFCTElTSEVEKSAmJgorCSAgICAoYXRvbWljX3JlYWQoJmNwLT5pbl9wa3RzKSAlIHN5c2N0bF9pcF92c19zeW5jX3RocmVzaG9sZFsxXQorCSAgICAgPT0gc3lzY3RsX2lwX3ZzX3N5bmNfdGhyZXNob2xkWzBdKSkKKwkJaXBfdnNfc3luY19jb25uKGNwKTsKKworCWlwX3ZzX2Nvbm5fcHV0KGNwKTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKglJdCBpcyBob29rZWQgYXQgdGhlIE5GX0lQX0ZPUldBUkQgY2hhaW4sIGluIG9yZGVyIHRvIGNhdGNoIElDTVAKKyAqICAgICAgcmVsYXRlZCBwYWNrZXRzIGRlc3RpbmVkIGZvciAwLjAuMC4wLzAuCisgKiAgICAgIFdoZW4gZndtYXJrLWJhc2VkIHZpcnR1YWwgc2VydmljZSBpcyB1c2VkLCBzdWNoIGFzIHRyYW5zcGFyZW50CisgKiAgICAgIGNhY2hlIGNsdXN0ZXIsIFRDUCBwYWNrZXRzIGNhbiBiZSBtYXJrZWQgYW5kIHJvdXRlZCB0byBpcF92c19pbiwKKyAqICAgICAgYnV0IElDTVAgZGVzdGluZWQgZm9yIDAuMC4wLjAvMCBjYW5ub3Qgbm90IGJlIGVhc2lseSBtYXJrZWQgYW5kCisgKiAgICAgIHNlbnQgdG8gaXBfdnNfaW5faWNtcC4gU28sIGNhdGNoIHRoZW0gYXQgdGhlIE5GX0lQX0ZPUldBUkQgY2hhaW4KKyAqICAgICAgYW5kIHNlbmQgdGhlbSB0byBpcF92c19pbl9pY21wLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50CitpcF92c19mb3J3YXJkX2ljbXAodW5zaWduZWQgaW50IGhvb2tudW0sIHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQkgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlpbnQgcjsKKworCWlmICgoKnBza2IpLT5uaC5pcGgtPnByb3RvY29sICE9IElQUFJPVE9fSUNNUCkKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKworCXJldHVybiBpcF92c19pbl9pY21wKHBza2IsICZyLCBob29rbnVtKTsKK30KKworCisvKiBBZnRlciBwYWNrZXQgZmlsdGVyaW5nLCBmb3J3YXJkIHBhY2tldCB0aHJvdWdoIFZTL0RSLCBWUy9UVU4sCisgICBvciBWUy9OQVQoY2hhbmdlIGRlc3RpbmF0aW9uKSwgc28gdGhhdCBmaWx0ZXJpbmcgcnVsZXMgY2FuIGJlCisgICBhcHBsaWVkIHRvIElQVlMuICovCitzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIGlwX3ZzX2luX29wcyA9IHsKKwkuaG9vawkJPSBpcF92c19pbiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnBmCQk9IFBGX0lORVQsCisJLmhvb2tudW0gICAgICAgID0gTkZfSVBfTE9DQUxfSU4sCisJLnByaW9yaXR5ICAgICAgID0gMTAwLAorfTsKKworLyogQWZ0ZXIgcGFja2V0IGZpbHRlcmluZywgY2hhbmdlIHNvdXJjZSBvbmx5IGZvciBWUy9OQVQgKi8KK3N0YXRpYyBzdHJ1Y3QgbmZfaG9va19vcHMgaXBfdnNfb3V0X29wcyA9IHsKKwkuaG9vawkJPSBpcF92c19vdXQsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5wZgkJPSBQRl9JTkVULAorCS5ob29rbnVtICAgICAgICA9IE5GX0lQX0ZPUldBUkQsCisJLnByaW9yaXR5ICAgICAgID0gMTAwLAorfTsKKworLyogQWZ0ZXIgcGFja2V0IGZpbHRlcmluZyAoYnV0IGJlZm9yZSBpcF92c19vdXRfaWNtcCksIGNhdGNoIGljbXAKKyAgIGRlc3RpbmVkIGZvciAwLjAuMC4wLzAsIHdoaWNoIGlzIGZvciBpbmNvbWluZyBJUFZTIGNvbm5lY3Rpb25zICovCitzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIGlwX3ZzX2ZvcndhcmRfaWNtcF9vcHMgPSB7CisJLmhvb2sJCT0gaXBfdnNfZm9yd2FyZF9pY21wLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucGYJCT0gUEZfSU5FVCwKKwkuaG9va251bSAgICAgICAgPSBORl9JUF9GT1JXQVJELAorCS5wcmlvcml0eSAgICAgICA9IDk5LAorfTsKKworLyogQmVmb3JlIHRoZSBuZXRmaWx0ZXIgY29ubmVjdGlvbiB0cmFja2luZywgZXhpdCBmcm9tIFBPU1RfUk9VVElORyAqLworc3RhdGljIHN0cnVjdCBuZl9ob29rX29wcyBpcF92c19wb3N0X3JvdXRpbmdfb3BzID0geworCS5ob29rCQk9IGlwX3ZzX3Bvc3Rfcm91dGluZywKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnBmCQk9IFBGX0lORVQsCisJLmhvb2tudW0gICAgICAgID0gTkZfSVBfUE9TVF9ST1VUSU5HLAorCS5wcmlvcml0eSAgICAgICA9IE5GX0lQX1BSSV9OQVRfU1JDLTEsCit9OworCisKKy8qCisgKglJbml0aWFsaXplIElQIFZpcnR1YWwgU2VydmVyCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGlwX3ZzX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaXBfdnNfY29udHJvbF9pbml0KCk7CisJaWYgKHJldCA8IDApIHsKKwkJSVBfVlNfRVJSKCJjYW4ndCBzZXR1cCBjb250cm9sLlxuIik7CisJCWdvdG8gY2xlYW51cF9ub3RoaW5nOworCX0KKworCWlwX3ZzX3Byb3RvY29sX2luaXQoKTsKKworCXJldCA9IGlwX3ZzX2FwcF9pbml0KCk7CisJaWYgKHJldCA8IDApIHsKKwkJSVBfVlNfRVJSKCJjYW4ndCBzZXR1cCBhcHBsaWNhdGlvbiBoZWxwZXIuXG4iKTsKKwkJZ290byBjbGVhbnVwX3Byb3RvY29sOworCX0KKworCXJldCA9IGlwX3ZzX2Nvbm5faW5pdCgpOworCWlmIChyZXQgPCAwKSB7CisJCUlQX1ZTX0VSUigiY2FuJ3Qgc2V0dXAgY29ubmVjdGlvbiB0YWJsZS5cbiIpOworCQlnb3RvIGNsZWFudXBfYXBwOworCX0KKworCXJldCA9IG5mX3JlZ2lzdGVyX2hvb2soJmlwX3ZzX2luX29wcyk7CisJaWYgKHJldCA8IDApIHsKKwkJSVBfVlNfRVJSKCJjYW4ndCByZWdpc3RlciBpbiBob29rLlxuIik7CisJCWdvdG8gY2xlYW51cF9jb25uOworCX0KKworCXJldCA9IG5mX3JlZ2lzdGVyX2hvb2soJmlwX3ZzX291dF9vcHMpOworCWlmIChyZXQgPCAwKSB7CisJCUlQX1ZTX0VSUigiY2FuJ3QgcmVnaXN0ZXIgb3V0IGhvb2suXG4iKTsKKwkJZ290byBjbGVhbnVwX2lub3BzOworCX0KKwlyZXQgPSBuZl9yZWdpc3Rlcl9ob29rKCZpcF92c19wb3N0X3JvdXRpbmdfb3BzKTsKKwlpZiAocmV0IDwgMCkgeworCQlJUF9WU19FUlIoImNhbid0IHJlZ2lzdGVyIHBvc3Rfcm91dGluZyBob29rLlxuIik7CisJCWdvdG8gY2xlYW51cF9vdXRvcHM7CisJfQorCXJldCA9IG5mX3JlZ2lzdGVyX2hvb2soJmlwX3ZzX2ZvcndhcmRfaWNtcF9vcHMpOworCWlmIChyZXQgPCAwKSB7CisJCUlQX1ZTX0VSUigiY2FuJ3QgcmVnaXN0ZXIgZm9yd2FyZF9pY21wIGhvb2suXG4iKTsKKwkJZ290byBjbGVhbnVwX3Bvc3Ryb3V0aW5nb3BzOworCX0KKworCUlQX1ZTX0lORk8oImlwdnMgbG9hZGVkLlxuIik7CisJcmV0dXJuIHJldDsKKworICBjbGVhbnVwX3Bvc3Ryb3V0aW5nb3BzOgorCW5mX3VucmVnaXN0ZXJfaG9vaygmaXBfdnNfcG9zdF9yb3V0aW5nX29wcyk7CisgIGNsZWFudXBfb3V0b3BzOgorCW5mX3VucmVnaXN0ZXJfaG9vaygmaXBfdnNfb3V0X29wcyk7CisgIGNsZWFudXBfaW5vcHM6CisJbmZfdW5yZWdpc3Rlcl9ob29rKCZpcF92c19pbl9vcHMpOworICBjbGVhbnVwX2Nvbm46CisJaXBfdnNfY29ubl9jbGVhbnVwKCk7CisgIGNsZWFudXBfYXBwOgorCWlwX3ZzX2FwcF9jbGVhbnVwKCk7CisgIGNsZWFudXBfcHJvdG9jb2w6CisJaXBfdnNfcHJvdG9jb2xfY2xlYW51cCgpOworCWlwX3ZzX2NvbnRyb2xfY2xlYW51cCgpOworICBjbGVhbnVwX25vdGhpbmc6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGlwX3ZzX2NsZWFudXAodm9pZCkKK3sKKwluZl91bnJlZ2lzdGVyX2hvb2soJmlwX3ZzX2ZvcndhcmRfaWNtcF9vcHMpOworCW5mX3VucmVnaXN0ZXJfaG9vaygmaXBfdnNfcG9zdF9yb3V0aW5nX29wcyk7CisJbmZfdW5yZWdpc3Rlcl9ob29rKCZpcF92c19vdXRfb3BzKTsKKwluZl91bnJlZ2lzdGVyX2hvb2soJmlwX3ZzX2luX29wcyk7CisJaXBfdnNfY29ubl9jbGVhbnVwKCk7CisJaXBfdnNfYXBwX2NsZWFudXAoKTsKKwlpcF92c19wcm90b2NvbF9jbGVhbnVwKCk7CisJaXBfdnNfY29udHJvbF9jbGVhbnVwKCk7CisJSVBfVlNfSU5GTygiaXB2cyB1bmxvYWRlZC5cbiIpOworfQorCittb2R1bGVfaW5pdChpcF92c19pbml0KTsKK21vZHVsZV9leGl0KGlwX3ZzX2NsZWFudXApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19jdGwuYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE4ZDk3MAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfY3RsLmMKQEAgLTAsMCArMSwyMzkxIEBACisvKgorICogSVBWUyAgICAgICAgIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJUCB2aXJ0dWFsIHNlcnZlciBzdXBwb3J0IGZvciB0aGUKKyAqICAgICAgICAgICAgICBMSU5VWCBvcGVyYXRpbmcgc3lzdGVtLiAgSVBWUyBpcyBub3cgaW1wbGVtZW50ZWQgYXMgYSBtb2R1bGUKKyAqICAgICAgICAgICAgICBvdmVyIHRoZSBOZXRGaWx0ZXIgZnJhbWV3b3JrLiBJUFZTIGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGEKKyAqICAgICAgICAgICAgICBoaWdoLXBlcmZvcm1hbmNlIGFuZCBoaWdobHkgYXZhaWxhYmxlIHNlcnZlciBiYXNlZCBvbiBhCisgKiAgICAgICAgICAgICAgY2x1c3RlciBvZiBzZXJ2ZXJzLgorICoKKyAqIFZlcnNpb246ICAgICAkSWQ6IGlwX3ZzX2N0bC5jLHYgMS4zNiAyMDAzLzA2LzA4IDA5OjMxOjE5IHdlbnNvbmcgRXhwICQKKyAqCisgKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgorICogICAgICAgICAgICAgIFBldGVyIEtlc2UgPHBldGVyLmtlc2VAaWpzLnNpPgorICogICAgICAgICAgICAgIEp1bGlhbiBBbmFzdGFzb3YgPGphQHNzaS5iZz4KKyAqCisgKiAgICAgICAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICAgICAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgICAgICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgICAgICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDaGFuZ2VzOgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKworI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bmV0L2lwX3ZzLmg+CisKKy8qIHNlbWFwaG9yZSBmb3IgSVBWUyBzb2Nrb3B0cy4gQW5kLCBbZ3NdZXRzb2Nrb3B0IG1heSBzbGVlcC4gKi8KK3N0YXRpYyBERUNMQVJFX01VVEVYKF9faXBfdnNfbXV0ZXgpOworCisvKiBsb2NrIGZvciBzZXJ2aWNlIHRhYmxlICovCitzdGF0aWMgREVGSU5FX1JXTE9DSyhfX2lwX3ZzX3N2Y19sb2NrKTsKKworLyogbG9jayBmb3IgdGFibGUgd2l0aCB0aGUgcmVhbCBzZXJ2aWNlcyAqLworc3RhdGljIERFRklORV9SV0xPQ0soX19pcF92c19yc19sb2NrKTsKKworLyogbG9jayBmb3Igc3RhdGUgYW5kIHRpbWVvdXQgdGFibGVzICovCitzdGF0aWMgREVGSU5FX1JXTE9DSyhfX2lwX3ZzX3NlY3VyZXRjcF9sb2NrKTsKKworLyogbG9jayBmb3IgZHJvcCBlbnRyeSBoYW5kbGluZyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhfX2lwX3ZzX2Ryb3BlbnRyeV9sb2NrKTsKKworLyogbG9jayBmb3IgZHJvcCBwYWNrZXQgaGFuZGxpbmcgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soX19pcF92c19kcm9wcGFja2V0X2xvY2spOworCisvKiAxL3JhdGUgZHJvcCBhbmQgZHJvcC1lbnRyeSB2YXJpYWJsZXMgKi8KK2ludCBpcF92c19kcm9wX3JhdGUgPSAwOworaW50IGlwX3ZzX2Ryb3BfY291bnRlciA9IDA7CitzdGF0aWMgYXRvbWljX3QgaXBfdnNfZHJvcGVudHJ5ID0gQVRPTUlDX0lOSVQoMCk7CisKKy8qIG51bWJlciBvZiB2aXJ0dWFsIHNlcnZpY2VzICovCitzdGF0aWMgaW50IGlwX3ZzX251bV9zZXJ2aWNlcyA9IDA7CisKKy8qIHN5c2N0bCB2YXJpYWJsZXMgKi8KK3N0YXRpYyBpbnQgc3lzY3RsX2lwX3ZzX2Ryb3BfZW50cnkgPSAwOworc3RhdGljIGludCBzeXNjdGxfaXBfdnNfZHJvcF9wYWNrZXQgPSAwOworc3RhdGljIGludCBzeXNjdGxfaXBfdnNfc2VjdXJlX3RjcCA9IDA7CitzdGF0aWMgaW50IHN5c2N0bF9pcF92c19hbWVtdGhyZXNoID0gMTAyNDsKK3N0YXRpYyBpbnQgc3lzY3RsX2lwX3ZzX2FtX2Ryb3ByYXRlID0gMTA7CitpbnQgc3lzY3RsX2lwX3ZzX2NhY2hlX2J5cGFzcyA9IDA7CitpbnQgc3lzY3RsX2lwX3ZzX2V4cGlyZV9ub2Rlc3RfY29ubiA9IDA7CitpbnQgc3lzY3RsX2lwX3ZzX2V4cGlyZV9xdWllc2NlbnRfdGVtcGxhdGUgPSAwOworaW50IHN5c2N0bF9pcF92c19zeW5jX3RocmVzaG9sZFsyXSA9IHsgMywgNTAgfTsKK2ludCBzeXNjdGxfaXBfdnNfbmF0X2ljbXBfc2VuZCA9IDA7CisKKworI2lmZGVmIENPTkZJR19JUF9WU19ERUJVRworc3RhdGljIGludCBzeXNjdGxfaXBfdnNfZGVidWdfbGV2ZWwgPSAwOworCitpbnQgaXBfdnNfZ2V0X2RlYnVnX2xldmVsKHZvaWQpCit7CisJcmV0dXJuIHN5c2N0bF9pcF92c19kZWJ1Z19sZXZlbDsKK30KKyNlbmRpZgorCisvKgorICoJdXBkYXRlX2RlZmVuc2VfbGV2ZWwgaXMgY2FsbGVkIGZyb20ga2V2ZW50ZCBhbmQgZnJvbSBzeXNjdGwuCisgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9kZWZlbnNlX2xldmVsKHZvaWQpCit7CisJc3RydWN0IHN5c2luZm8gaTsKKwlzdGF0aWMgaW50IG9sZF9zZWN1cmVfdGNwID0gMDsKKwlpbnQgYXZhaWxtZW07CisJaW50IG5vbWVtOworCWludCB0b19jaGFuZ2UgPSAtMTsKKworCS8qIHdlIG9ubHkgY291bnQgZnJlZSBhbmQgYnVmZmVyZWQgbWVtb3J5IChpbiBwYWdlcykgKi8KKwlzaV9tZW1pbmZvKCZpKTsKKwlhdmFpbG1lbSA9IGkuZnJlZXJhbSArIGkuYnVmZmVycmFtOworCS8qIGhvd2V2ZXIgaW4gbGludXggMi41IHRoZSBpLmJ1ZmZlcnJhbSBpcyB0b3RhbCBwYWdlIGNhY2hlIHNpemUsCisJICAgd2UgbmVlZCBhZGp1c3QgaXQgKi8KKwkvKiBzaV9zd2FwaW5mbygmaSk7ICovCisJLyogYXZhaWxtZW0gPSBhdmFpbG1lbSAtIChpLnRvdGFsc3dhcCAtIGkuZnJlZXN3YXApOyAqLworCisJbm9tZW0gPSAoYXZhaWxtZW0gPCBzeXNjdGxfaXBfdnNfYW1lbXRocmVzaCk7CisKKwkvKiBkcm9wX2VudHJ5ICovCisJc3Bpbl9sb2NrKCZfX2lwX3ZzX2Ryb3BlbnRyeV9sb2NrKTsKKwlzd2l0Y2ggKHN5c2N0bF9pcF92c19kcm9wX2VudHJ5KSB7CisJY2FzZSAwOgorCQlhdG9taWNfc2V0KCZpcF92c19kcm9wZW50cnksIDApOworCQlicmVhazsKKwljYXNlIDE6CisJCWlmIChub21lbSkgeworCQkJYXRvbWljX3NldCgmaXBfdnNfZHJvcGVudHJ5LCAxKTsKKwkJCXN5c2N0bF9pcF92c19kcm9wX2VudHJ5ID0gMjsKKwkJfSBlbHNlIHsKKwkJCWF0b21pY19zZXQoJmlwX3ZzX2Ryb3BlbnRyeSwgMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpZiAobm9tZW0pIHsKKwkJCWF0b21pY19zZXQoJmlwX3ZzX2Ryb3BlbnRyeSwgMSk7CisJCX0gZWxzZSB7CisJCQlhdG9taWNfc2V0KCZpcF92c19kcm9wZW50cnksIDApOworCQkJc3lzY3RsX2lwX3ZzX2Ryb3BfZW50cnkgPSAxOworCQl9OworCQlicmVhazsKKwljYXNlIDM6CisJCWF0b21pY19zZXQoJmlwX3ZzX2Ryb3BlbnRyeSwgMSk7CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9jaygmX19pcF92c19kcm9wZW50cnlfbG9jayk7CisKKwkvKiBkcm9wX3BhY2tldCAqLworCXNwaW5fbG9jaygmX19pcF92c19kcm9wcGFja2V0X2xvY2spOworCXN3aXRjaCAoc3lzY3RsX2lwX3ZzX2Ryb3BfcGFja2V0KSB7CisJY2FzZSAwOgorCQlpcF92c19kcm9wX3JhdGUgPSAwOworCQlicmVhazsKKwljYXNlIDE6CisJCWlmIChub21lbSkgeworCQkJaXBfdnNfZHJvcF9yYXRlID0gaXBfdnNfZHJvcF9jb3VudGVyCisJCQkJPSBzeXNjdGxfaXBfdnNfYW1lbXRocmVzaCAvCisJCQkJKHN5c2N0bF9pcF92c19hbWVtdGhyZXNoLWF2YWlsbWVtKTsKKwkJCXN5c2N0bF9pcF92c19kcm9wX3BhY2tldCA9IDI7CisJCX0gZWxzZSB7CisJCQlpcF92c19kcm9wX3JhdGUgPSAwOworCQl9CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaWYgKG5vbWVtKSB7CisJCQlpcF92c19kcm9wX3JhdGUgPSBpcF92c19kcm9wX2NvdW50ZXIKKwkJCQk9IHN5c2N0bF9pcF92c19hbWVtdGhyZXNoIC8KKwkJCQkoc3lzY3RsX2lwX3ZzX2FtZW10aHJlc2gtYXZhaWxtZW0pOworCQl9IGVsc2UgeworCQkJaXBfdnNfZHJvcF9yYXRlID0gMDsKKwkJCXN5c2N0bF9pcF92c19kcm9wX3BhY2tldCA9IDE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAzOgorCQlpcF92c19kcm9wX3JhdGUgPSBzeXNjdGxfaXBfdnNfYW1fZHJvcHJhdGU7CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9jaygmX19pcF92c19kcm9wcGFja2V0X2xvY2spOworCisJLyogc2VjdXJlX3RjcCAqLworCXdyaXRlX2xvY2soJl9faXBfdnNfc2VjdXJldGNwX2xvY2spOworCXN3aXRjaCAoc3lzY3RsX2lwX3ZzX3NlY3VyZV90Y3ApIHsKKwljYXNlIDA6CisJCWlmIChvbGRfc2VjdXJlX3RjcCA+PSAyKQorCQkJdG9fY2hhbmdlID0gMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlpZiAobm9tZW0pIHsKKwkJCWlmIChvbGRfc2VjdXJlX3RjcCA8IDIpCisJCQkJdG9fY2hhbmdlID0gMTsKKwkJCXN5c2N0bF9pcF92c19zZWN1cmVfdGNwID0gMjsKKwkJfSBlbHNlIHsKKwkJCWlmIChvbGRfc2VjdXJlX3RjcCA+PSAyKQorCQkJCXRvX2NoYW5nZSA9IDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpZiAobm9tZW0pIHsKKwkJCWlmIChvbGRfc2VjdXJlX3RjcCA8IDIpCisJCQkJdG9fY2hhbmdlID0gMTsKKwkJfSBlbHNlIHsKKwkJCWlmIChvbGRfc2VjdXJlX3RjcCA+PSAyKQorCQkJCXRvX2NoYW5nZSA9IDA7CisJCQlzeXNjdGxfaXBfdnNfc2VjdXJlX3RjcCA9IDE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAzOgorCQlpZiAob2xkX3NlY3VyZV90Y3AgPCAyKQorCQkJdG9fY2hhbmdlID0gMTsKKwkJYnJlYWs7CisJfQorCW9sZF9zZWN1cmVfdGNwID0gc3lzY3RsX2lwX3ZzX3NlY3VyZV90Y3A7CisJaWYgKHRvX2NoYW5nZSA+PSAwKQorCQlpcF92c19wcm90b2NvbF90aW1lb3V0X2NoYW5nZShzeXNjdGxfaXBfdnNfc2VjdXJlX3RjcD4xKTsKKwl3cml0ZV91bmxvY2soJl9faXBfdnNfc2VjdXJldGNwX2xvY2spOworfQorCisKKy8qCisgKglUaW1lciBmb3IgY2hlY2tpbmcgdGhlIGRlZmVuc2UKKyAqLworI2RlZmluZSBERUZFTlNFX1RJTUVSX1BFUklPRAkxKkhaCitzdGF0aWMgdm9pZCBkZWZlbnNlX3dvcmtfaGFuZGxlcih2b2lkICpkYXRhKTsKK3N0YXRpYyBERUNMQVJFX1dPUksoZGVmZW5zZV93b3JrLCBkZWZlbnNlX3dvcmtfaGFuZGxlciwgTlVMTCk7CisKK3N0YXRpYyB2b2lkIGRlZmVuc2Vfd29ya19oYW5kbGVyKHZvaWQgKmRhdGEpCit7CisJdXBkYXRlX2RlZmVuc2VfbGV2ZWwoKTsKKwlpZiAoYXRvbWljX3JlYWQoJmlwX3ZzX2Ryb3BlbnRyeSkpCisJCWlwX3ZzX3JhbmRvbV9kcm9wZW50cnkoKTsKKworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGVmZW5zZV93b3JrLCBERUZFTlNFX1RJTUVSX1BFUklPRCk7Cit9CisKK2ludAoraXBfdnNfdXNlX2NvdW50X2luYyh2b2lkKQoreworCXJldHVybiB0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSk7Cit9CisKK3ZvaWQKK2lwX3ZzX3VzZV9jb3VudF9kZWModm9pZCkKK3sKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKK30KKworCisvKgorICoJSGFzaCB0YWJsZTogZm9yIHZpcnR1YWwgc2VydmljZSBsb29rdXBzCisgKi8KKyNkZWZpbmUgSVBfVlNfU1ZDX1RBQl9CSVRTIDgKKyNkZWZpbmUgSVBfVlNfU1ZDX1RBQl9TSVpFICgxIDw8IElQX1ZTX1NWQ19UQUJfQklUUykKKyNkZWZpbmUgSVBfVlNfU1ZDX1RBQl9NQVNLIChJUF9WU19TVkNfVEFCX1NJWkUgLSAxKQorCisvKiB0aGUgc2VydmljZSB0YWJsZSBoYXNoZWQgYnkgPHByb3RvY29sLCBhZGRyLCBwb3J0PiAqLworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgaXBfdnNfc3ZjX3RhYmxlW0lQX1ZTX1NWQ19UQUJfU0laRV07CisvKiB0aGUgc2VydmljZSB0YWJsZSBoYXNoZWQgYnkgZndtYXJrICovCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBpcF92c19zdmNfZndtX3RhYmxlW0lQX1ZTX1NWQ19UQUJfU0laRV07CisKKy8qCisgKglIYXNoIHRhYmxlOiBmb3IgcmVhbCBzZXJ2aWNlIGxvb2t1cHMKKyAqLworI2RlZmluZSBJUF9WU19SVEFCX0JJVFMgNAorI2RlZmluZSBJUF9WU19SVEFCX1NJWkUgKDEgPDwgSVBfVlNfUlRBQl9CSVRTKQorI2RlZmluZSBJUF9WU19SVEFCX01BU0sgKElQX1ZTX1JUQUJfU0laRSAtIDEpCisKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGlwX3ZzX3J0YWJsZVtJUF9WU19SVEFCX1NJWkVdOworCisvKgorICoJVHJhc2ggZm9yIGRlc3RpbmF0aW9ucworICovCitzdGF0aWMgTElTVF9IRUFEKGlwX3ZzX2Rlc3RfdHJhc2gpOworCisvKgorICoJRlRQICYgTlVMTCB2aXJ0dWFsIHNlcnZpY2UgY291bnRlcnMKKyAqLworc3RhdGljIGF0b21pY190IGlwX3ZzX2Z0cHN2Y19jb3VudGVyID0gQVRPTUlDX0lOSVQoMCk7CitzdGF0aWMgYXRvbWljX3QgaXBfdnNfbnVsbHN2Y19jb3VudGVyID0gQVRPTUlDX0lOSVQoMCk7CisKKworLyoKKyAqCVJldHVybnMgaGFzaCB2YWx1ZSBmb3IgdmlydHVhbCBzZXJ2aWNlCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkCitpcF92c19zdmNfaGFzaGtleSh1bnNpZ25lZCBwcm90bywgX191MzIgYWRkciwgX191MTYgcG9ydCkKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBwb3J0aCA9IG50b2hzKHBvcnQpOworCisJcmV0dXJuIChwcm90b15udG9obChhZGRyKV4ocG9ydGg+PklQX1ZTX1NWQ19UQUJfQklUUylecG9ydGgpCisJCSYgSVBfVlNfU1ZDX1RBQl9NQVNLOworfQorCisvKgorICoJUmV0dXJucyBoYXNoIHZhbHVlIG9mIGZ3bWFyayBmb3IgdmlydHVhbCBzZXJ2aWNlIGxvb2t1cAorICovCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpcF92c19zdmNfZndtX2hhc2hrZXkoX191MzIgZndtYXJrKQoreworCXJldHVybiBmd21hcmsgJiBJUF9WU19TVkNfVEFCX01BU0s7Cit9CisKKy8qCisgKglIYXNoZXMgYSBzZXJ2aWNlIGluIHRoZSBpcF92c19zdmNfdGFibGUgYnkgPHByb3RvLGFkZHIscG9ydD4KKyAqCW9yIGluIHRoZSBpcF92c19zdmNfZndtX3RhYmxlIGJ5IGZ3bWFyay4KKyAqCVNob3VsZCBiZSBjYWxsZWQgd2l0aCBsb2NrZWQgdGFibGVzLgorICovCitzdGF0aWMgaW50IGlwX3ZzX3N2Y19oYXNoKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCit7CisJdW5zaWduZWQgaGFzaDsKKworCWlmIChzdmMtPmZsYWdzICYgSVBfVlNfU1ZDX0ZfSEFTSEVEKSB7CisJCUlQX1ZTX0VSUigiaXBfdnNfc3ZjX2hhc2goKTogcmVxdWVzdCBmb3IgYWxyZWFkeSBoYXNoZWQsICIKKwkJCSAgImNhbGxlZCBmcm9tICVwXG4iLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3ZjLT5md21hcmsgPT0gMCkgeworCQkvKgorCQkgKiAgSGFzaCBpdCBieSA8cHJvdG9jb2wsYWRkcixwb3J0PiBpbiBpcF92c19zdmNfdGFibGUKKwkJICovCisJCWhhc2ggPSBpcF92c19zdmNfaGFzaGtleShzdmMtPnByb3RvY29sLCBzdmMtPmFkZHIsIHN2Yy0+cG9ydCk7CisJCWxpc3RfYWRkKCZzdmMtPnNfbGlzdCwgJmlwX3ZzX3N2Y190YWJsZVtoYXNoXSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogIEhhc2ggaXQgYnkgZndtYXJrIGluIGlwX3ZzX3N2Y19md21fdGFibGUKKwkJICovCisJCWhhc2ggPSBpcF92c19zdmNfZndtX2hhc2hrZXkoc3ZjLT5md21hcmspOworCQlsaXN0X2FkZCgmc3ZjLT5mX2xpc3QsICZpcF92c19zdmNfZndtX3RhYmxlW2hhc2hdKTsKKwl9CisKKwlzdmMtPmZsYWdzIHw9IElQX1ZTX1NWQ19GX0hBU0hFRDsKKwkvKiBpbmNyZWFzZSBpdHMgcmVmY250IGJlY2F1c2UgaXQgaXMgcmVmZXJlbmNlZCBieSB0aGUgc3ZjIHRhYmxlICovCisJYXRvbWljX2luYygmc3ZjLT5yZWZjbnQpOworCXJldHVybiAxOworfQorCisKKy8qCisgKglVbmhhc2hlcyBhIHNlcnZpY2UgZnJvbSBpcF92c19zdmNfdGFibGUvaXBfdnNfc3ZjX2Z3bV90YWJsZS4KKyAqCVNob3VsZCBiZSBjYWxsZWQgd2l0aCBsb2NrZWQgdGFibGVzLgorICovCitzdGF0aWMgaW50IGlwX3ZzX3N2Y191bmhhc2goc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlpZiAoIShzdmMtPmZsYWdzICYgSVBfVlNfU1ZDX0ZfSEFTSEVEKSkgeworCQlJUF9WU19FUlIoImlwX3ZzX3N2Y191bmhhc2goKTogcmVxdWVzdCBmb3IgdW5oYXNoIGZsYWdnZWQsICIKKwkJCSAgImNhbGxlZCBmcm9tICVwXG4iLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3ZjLT5md21hcmsgPT0gMCkgeworCQkvKiBSZW1vdmUgaXQgZnJvbSB0aGUgaXBfdnNfc3ZjX3RhYmxlIHRhYmxlICovCisJCWxpc3RfZGVsKCZzdmMtPnNfbGlzdCk7CisJfSBlbHNlIHsKKwkJLyogUmVtb3ZlIGl0IGZyb20gdGhlIGlwX3ZzX3N2Y19md21fdGFibGUgdGFibGUgKi8KKwkJbGlzdF9kZWwoJnN2Yy0+Zl9saXN0KTsKKwl9CisKKwlzdmMtPmZsYWdzICY9IH5JUF9WU19TVkNfRl9IQVNIRUQ7CisJYXRvbWljX2RlYygmc3ZjLT5yZWZjbnQpOworCXJldHVybiAxOworfQorCisKKy8qCisgKglHZXQgc2VydmljZSBieSB7cHJvdG8sYWRkcixwb3J0fSBpbiB0aGUgc2VydmljZSB0YWJsZS4KKyAqLworc3RhdGljIF9faW5saW5lX18gc3RydWN0IGlwX3ZzX3NlcnZpY2UgKgorX19pcF92c19zZXJ2aWNlX2dldChfX3UxNiBwcm90b2NvbCwgX191MzIgdmFkZHIsIF9fdTE2IHZwb3J0KQoreworCXVuc2lnbmVkIGhhc2g7CisJc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YzsKKworCS8qIENoZWNrIGZvciAiZnVsbCIgYWRkcmVzc2VkIGVudHJpZXMgKi8KKwloYXNoID0gaXBfdnNfc3ZjX2hhc2hrZXkocHJvdG9jb2wsIHZhZGRyLCB2cG9ydCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN2YywgJmlwX3ZzX3N2Y190YWJsZVtoYXNoXSwgc19saXN0KXsKKwkJaWYgKChzdmMtPmFkZHIgPT0gdmFkZHIpCisJCSAgICAmJiAoc3ZjLT5wb3J0ID09IHZwb3J0KQorCQkgICAgJiYgKHN2Yy0+cHJvdG9jb2wgPT0gcHJvdG9jb2wpKSB7CisJCQkvKiBISVQgKi8KKwkJCWF0b21pY19pbmMoJnN2Yy0+dXNlY250KTsKKwkJCXJldHVybiBzdmM7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworCisvKgorICoJR2V0IHNlcnZpY2UgYnkge2Z3bWFya30gaW4gdGhlIHNlcnZpY2UgdGFibGUuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBpcF92c19zZXJ2aWNlICpfX2lwX3ZzX3N2Y19md21fZ2V0KF9fdTMyIGZ3bWFyaykKK3sKKwl1bnNpZ25lZCBoYXNoOworCXN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmM7CisKKwkvKiBDaGVjayBmb3IgZndtYXJrIGFkZHJlc3NlZCBlbnRyaWVzICovCisJaGFzaCA9IGlwX3ZzX3N2Y19md21faGFzaGtleShmd21hcmspOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzdmMsICZpcF92c19zdmNfZndtX3RhYmxlW2hhc2hdLCBmX2xpc3QpIHsKKwkJaWYgKHN2Yy0+ZndtYXJrID09IGZ3bWFyaykgeworCQkJLyogSElUICovCisJCQlhdG9taWNfaW5jKCZzdmMtPnVzZWNudCk7CisJCQlyZXR1cm4gc3ZjOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBpcF92c19zZXJ2aWNlICoKK2lwX3ZzX3NlcnZpY2VfZ2V0KF9fdTMyIGZ3bWFyaywgX191MTYgcHJvdG9jb2wsIF9fdTMyIHZhZGRyLCBfX3UxNiB2cG9ydCkKK3sKKwlzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjOworCisJcmVhZF9sb2NrKCZfX2lwX3ZzX3N2Y19sb2NrKTsKKworCS8qCisJICoJQ2hlY2sgdGhlIHRhYmxlIGhhc2hlZCBieSBmd21hcmsgZmlyc3QKKwkgKi8KKwlpZiAoZndtYXJrICYmIChzdmMgPSBfX2lwX3ZzX3N2Y19md21fZ2V0KGZ3bWFyaykpKQorCQlnb3RvIG91dDsKKworCS8qCisJICoJQ2hlY2sgdGhlIHRhYmxlIGhhc2hlZCBieSA8cHJvdG9jb2wsYWRkcixwb3J0PgorCSAqCWZvciAiZnVsbCIgYWRkcmVzc2VkIGVudHJpZXMKKwkgKi8KKwlzdmMgPSBfX2lwX3ZzX3NlcnZpY2VfZ2V0KHByb3RvY29sLCB2YWRkciwgdnBvcnQpOworCisJaWYgKHN2YyA9PSBOVUxMCisJICAgICYmIHByb3RvY29sID09IElQUFJPVE9fVENQCisJICAgICYmIGF0b21pY19yZWFkKCZpcF92c19mdHBzdmNfY291bnRlcikKKwkgICAgJiYgKHZwb3J0ID09IEZUUERBVEEgfHwgbnRvaHModnBvcnQpID49IFBST1RfU09DSykpIHsKKwkJLyoKKwkJICogQ2hlY2sgaWYgZnRwIHNlcnZpY2UgZW50cnkgZXhpc3RzLCB0aGUgcGFja2V0CisJCSAqIG1pZ2h0IGJlbG9uZyB0byBGVFAgZGF0YSBjb25uZWN0aW9ucy4KKwkJICovCisJCXN2YyA9IF9faXBfdnNfc2VydmljZV9nZXQocHJvdG9jb2wsIHZhZGRyLCBGVFBQT1JUKTsKKwl9CisKKwlpZiAoc3ZjID09IE5VTEwKKwkgICAgJiYgYXRvbWljX3JlYWQoJmlwX3ZzX251bGxzdmNfY291bnRlcikpIHsKKwkJLyoKKwkJICogQ2hlY2sgaWYgdGhlIGNhdGNoLWFsbCBwb3J0IChwb3J0IHplcm8pIGV4aXN0cworCQkgKi8KKwkJc3ZjID0gX19pcF92c19zZXJ2aWNlX2dldChwcm90b2NvbCwgdmFkZHIsIDApOworCX0KKworICBvdXQ6CisJcmVhZF91bmxvY2soJl9faXBfdnNfc3ZjX2xvY2spOworCisJSVBfVlNfREJHKDYsICJsb29rdXAgc2VydmljZTogZndtICV1ICVzICV1LiV1LiV1LiV1OiV1ICVzXG4iLAorCQkgIGZ3bWFyaywgaXBfdnNfcHJvdG9fbmFtZShwcm90b2NvbCksCisJCSAgTklQUVVBRCh2YWRkciksIG50b2hzKHZwb3J0KSwKKwkJICBzdmM/ImhpdCI6Im5vdCBoaXQiKTsKKworCXJldHVybiBzdmM7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkCitfX2lwX3ZzX2JpbmRfc3ZjKHN0cnVjdCBpcF92c19kZXN0ICpkZXN0LCBzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQoreworCWF0b21pY19pbmMoJnN2Yy0+cmVmY250KTsKKwlkZXN0LT5zdmMgPSBzdmM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19pcF92c191bmJpbmRfc3ZjKHN0cnVjdCBpcF92c19kZXN0ICpkZXN0KQoreworCXN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMgPSBkZXN0LT5zdmM7CisKKwlkZXN0LT5zdmMgPSBOVUxMOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZzdmMtPnJlZmNudCkpCisJCWtmcmVlKHN2Yyk7Cit9CisKKworLyoKKyAqCVJldHVybnMgaGFzaCB2YWx1ZSBmb3IgcmVhbCBzZXJ2aWNlCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGlwX3ZzX3JzX2hhc2hrZXkoX191MzIgYWRkciwgX191MTYgcG9ydCkKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBwb3J0aCA9IG50b2hzKHBvcnQpOworCisJcmV0dXJuIChudG9obChhZGRyKV4ocG9ydGg+PklQX1ZTX1JUQUJfQklUUylecG9ydGgpCisJCSYgSVBfVlNfUlRBQl9NQVNLOworfQorCisvKgorICoJSGFzaGVzIGlwX3ZzX2Rlc3QgaW4gaXBfdnNfcnRhYmxlIGJ5IDxwcm90byxhZGRyLHBvcnQ+LgorICoJc2hvdWxkIGJlIGNhbGxlZCB3aXRoIGxvY2tlZCB0YWJsZXMuCisgKi8KK3N0YXRpYyBpbnQgaXBfdnNfcnNfaGFzaChzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCkKK3sKKwl1bnNpZ25lZCBoYXNoOworCisJaWYgKCFsaXN0X2VtcHR5KCZkZXN0LT5kX2xpc3QpKSB7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICoJSGFzaCBieSBwcm90byxhZGRyLHBvcnQsCisJICoJd2hpY2ggYXJlIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSByZWFsIHNlcnZpY2UuCisJICovCisJaGFzaCA9IGlwX3ZzX3JzX2hhc2hrZXkoZGVzdC0+YWRkciwgZGVzdC0+cG9ydCk7CisJbGlzdF9hZGQoJmRlc3QtPmRfbGlzdCwgJmlwX3ZzX3J0YWJsZVtoYXNoXSk7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqCVVOaGFzaGVzIGlwX3ZzX2Rlc3QgZnJvbSBpcF92c19ydGFibGUuCisgKglzaG91bGQgYmUgY2FsbGVkIHdpdGggbG9ja2VkIHRhYmxlcy4KKyAqLworc3RhdGljIGludCBpcF92c19yc191bmhhc2goc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCit7CisJLyoKKwkgKiBSZW1vdmUgaXQgZnJvbSB0aGUgaXBfdnNfcnRhYmxlIHRhYmxlLgorCSAqLworCWlmICghbGlzdF9lbXB0eSgmZGVzdC0+ZF9saXN0KSkgeworCQlsaXN0X2RlbCgmZGVzdC0+ZF9saXN0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJmRlc3QtPmRfbGlzdCk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKglMb29rdXAgcmVhbCBzZXJ2aWNlIGJ5IDxwcm90byxhZGRyLHBvcnQ+IGluIHRoZSByZWFsIHNlcnZpY2UgdGFibGUuCisgKi8KK3N0cnVjdCBpcF92c19kZXN0ICoKK2lwX3ZzX2xvb2t1cF9yZWFsX3NlcnZpY2UoX191MTYgcHJvdG9jb2wsIF9fdTMyIGRhZGRyLCBfX3UxNiBkcG9ydCkKK3sKKwl1bnNpZ25lZCBoYXNoOworCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0OworCisJLyoKKwkgKglDaGVjayBmb3IgImZ1bGwiIGFkZHJlc3NlZCBlbnRyaWVzCisJICoJUmV0dXJuIHRoZSBmaXJzdCBmb3VuZCBlbnRyeQorCSAqLworCWhhc2ggPSBpcF92c19yc19oYXNoa2V5KGRhZGRyLCBkcG9ydCk7CisKKwlyZWFkX2xvY2soJl9faXBfdnNfcnNfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXN0LCAmaXBfdnNfcnRhYmxlW2hhc2hdLCBkX2xpc3QpIHsKKwkJaWYgKChkZXN0LT5hZGRyID09IGRhZGRyKQorCQkgICAgJiYgKGRlc3QtPnBvcnQgPT0gZHBvcnQpCisJCSAgICAmJiAoKGRlc3QtPnByb3RvY29sID09IHByb3RvY29sKSB8fAorCQkJZGVzdC0+dmZ3bWFyaykpIHsKKwkJCS8qIEhJVCAqLworCQkJcmVhZF91bmxvY2soJl9faXBfdnNfcnNfbG9jayk7CisJCQlyZXR1cm4gZGVzdDsKKwkJfQorCX0KKwlyZWFkX3VubG9jaygmX19pcF92c19yc19sb2NrKTsKKworCXJldHVybiBOVUxMOworfQorCisvKgorICoJTG9va3VwIGRlc3RpbmF0aW9uIGJ5IHthZGRyLHBvcnR9IGluIHRoZSBnaXZlbiBzZXJ2aWNlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfZGVzdCAqCitpcF92c19sb29rdXBfZGVzdChzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLCBfX3UzMiBkYWRkciwgX191MTYgZHBvcnQpCit7CisJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3Q7CisKKwkvKgorCSAqIEZpbmQgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgZ2l2ZW4gc2VydmljZQorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzdCwgJnN2Yy0+ZGVzdGluYXRpb25zLCBuX2xpc3QpIHsKKwkJaWYgKChkZXN0LT5hZGRyID09IGRhZGRyKSAmJiAoZGVzdC0+cG9ydCA9PSBkcG9ydCkpIHsKKwkJCS8qIEhJVCAqLworCQkJcmV0dXJuIGRlc3Q7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworCisvKgorICogIExvb2t1cCBkZXN0IGJ5IHtzdmMsYWRkcixwb3J0fSBpbiB0aGUgZGVzdGluYXRpb24gdHJhc2guCisgKiAgVGhlIGRlc3RpbmF0aW9uIHRyYXNoIGlzIHVzZWQgdG8gaG9sZCB0aGUgZGVzdGluYXRpb25zIHRoYXQgYXJlIHJlbW92ZWQKKyAqICBmcm9tIHRoZSBzZXJ2aWNlIHRhYmxlIGJ1dCBhcmUgc3RpbGwgcmVmZXJlbmNlZCBieSBzb21lIGNvbm4gZW50cmllcy4KKyAqICBUaGUgcmVhc29uIHRvIGFkZCB0aGUgZGVzdGluYXRpb24gdHJhc2ggaXMgd2hlbiB0aGUgZGVzdCBpcyB0ZW1wb3JhcnkKKyAqICBkb3duIChlaXRoZXIgYnkgYWRtaW5pc3RyYXRvciBvciBieSBtb25pdG9yIHByb2dyYW0pLCB0aGUgZGVzdCBjYW4gYmUKKyAqICBwaWNrZWQgYmFjayBmcm9tIHRoZSB0cmFzaCwgdGhlIHJlbWFpbmluZyBjb25uZWN0aW9ucyB0byB0aGUgZGVzdCBjYW4KKyAqICBjb250aW51ZSwgYW5kIHRoZSBjb3VudGluZyBpbmZvcm1hdGlvbiBvZiB0aGUgZGVzdCBpcyBhbHNvIHVzZWZ1bCBmb3IKKyAqICBzY2hlZHVsaW5nLgorICovCitzdGF0aWMgc3RydWN0IGlwX3ZzX2Rlc3QgKgoraXBfdnNfdHJhc2hfZ2V0X2Rlc3Qoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YywgX191MzIgZGFkZHIsIF9fdTE2IGRwb3J0KQoreworCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0LCAqbnh0OworCisJLyoKKwkgKiBGaW5kIHRoZSBkZXN0aW5hdGlvbiBpbiB0cmFzaAorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXN0LCBueHQsICZpcF92c19kZXN0X3RyYXNoLCBuX2xpc3QpIHsKKwkJSVBfVlNfREJHKDMsICJEZXN0aW5hdGlvbiAldS8ldS4ldS4ldS4ldToldSBzdGlsbCBpbiB0cmFzaCwgIgorCQkJICAicmVmY250PSVkXG4iLAorCQkJICBkZXN0LT52ZndtYXJrLAorCQkJICBOSVBRVUFEKGRlc3QtPmFkZHIpLCBudG9ocyhkZXN0LT5wb3J0KSwKKwkJCSAgYXRvbWljX3JlYWQoJmRlc3QtPnJlZmNudCkpOworCQlpZiAoZGVzdC0+YWRkciA9PSBkYWRkciAmJgorCQkgICAgZGVzdC0+cG9ydCA9PSBkcG9ydCAmJgorCQkgICAgZGVzdC0+dmZ3bWFyayA9PSBzdmMtPmZ3bWFyayAmJgorCQkgICAgZGVzdC0+cHJvdG9jb2wgPT0gc3ZjLT5wcm90b2NvbCAmJgorCQkgICAgKHN2Yy0+ZndtYXJrIHx8CisJCSAgICAgKGRlc3QtPnZhZGRyID09IHN2Yy0+YWRkciAmJgorCQkgICAgICBkZXN0LT52cG9ydCA9PSBzdmMtPnBvcnQpKSkgeworCQkJLyogSElUICovCisJCQlyZXR1cm4gZGVzdDsKKwkJfQorCisJCS8qCisJCSAqIFRyeSB0byBwdXJnZSB0aGUgZGVzdGluYXRpb24gZnJvbSB0cmFzaCBpZiBub3QgcmVmZXJlbmNlZAorCQkgKi8KKwkJaWYgKGF0b21pY19yZWFkKCZkZXN0LT5yZWZjbnQpID09IDEpIHsKKwkJCUlQX1ZTX0RCRygzLCAiUmVtb3ZpbmcgZGVzdGluYXRpb24gJXUvJXUuJXUuJXUuJXU6JXUgIgorCQkJCSAgImZyb20gdHJhc2hcbiIsCisJCQkJICBkZXN0LT52ZndtYXJrLAorCQkJCSAgTklQUVVBRChkZXN0LT5hZGRyKSwgbnRvaHMoZGVzdC0+cG9ydCkpOworCQkJbGlzdF9kZWwoJmRlc3QtPm5fbGlzdCk7CisJCQlpcF92c19kc3RfcmVzZXQoZGVzdCk7CisJCQlfX2lwX3ZzX3VuYmluZF9zdmMoZGVzdCk7CisJCQlrZnJlZShkZXN0KTsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCisKKy8qCisgKiAgQ2xlYW4gdXAgYWxsIHRoZSBkZXN0aW5hdGlvbnMgaW4gdGhlIHRyYXNoCisgKiAgQ2FsbGVkIGJ5IHRoZSBpcF92c19jb250cm9sX2NsZWFudXAoKQorICoKKyAqICBXaGVuIHRoZSBpcF92c19jb250cm9sX2NsZWFydXAgaXMgYWN0aXZhdGVkIGJ5IGlwdnMgbW9kdWxlIGV4aXQsCisgKiAgdGhlIHNlcnZpY2UgdGFibGVzIG11c3QgaGF2ZSBiZWVuIGZsdXNoZWQgYW5kIGFsbCB0aGUgY29ubmVjdGlvbnMKKyAqICBhcmUgZXhwaXJlZCwgYW5kIHRoZSByZWZjbnQgb2YgZWFjaCBkZXN0aW5hdGlvbiBpbiB0aGUgdHJhc2ggbXVzdAorICogIGJlIDEsIHNvIHdlIHNpbXBseSByZWxlYXNlIHRoZW0gaGVyZS4KKyAqLworc3RhdGljIHZvaWQgaXBfdnNfdHJhc2hfY2xlYW51cCh2b2lkKQoreworCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0LCAqbnh0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlc3QsIG54dCwgJmlwX3ZzX2Rlc3RfdHJhc2gsIG5fbGlzdCkgeworCQlsaXN0X2RlbCgmZGVzdC0+bl9saXN0KTsKKwkJaXBfdnNfZHN0X3Jlc2V0KGRlc3QpOworCQlfX2lwX3ZzX3VuYmluZF9zdmMoZGVzdCk7CisJCWtmcmVlKGRlc3QpOworCX0KK30KKworCitzdGF0aWMgdm9pZAoraXBfdnNfemVyb19zdGF0cyhzdHJ1Y3QgaXBfdnNfc3RhdHMgKnN0YXRzKQoreworCXNwaW5fbG9ja19iaCgmc3RhdHMtPmxvY2spOworCW1lbXNldChzdGF0cywgMCwgKGNoYXIgKikmc3RhdHMtPmxvY2sgLSAoY2hhciAqKXN0YXRzKTsKKwlzcGluX3VubG9ja19iaCgmc3RhdHMtPmxvY2spOworCWlwX3ZzX3plcm9fZXN0aW1hdG9yKHN0YXRzKTsKK30KKworLyoKKyAqCVVwZGF0ZSBhIGRlc3RpbmF0aW9uIGluIHRoZSBnaXZlbiBzZXJ2aWNlCisgKi8KK3N0YXRpYyB2b2lkCitfX2lwX3ZzX3VwZGF0ZV9kZXN0KHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsCisJCSAgICBzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCwgc3RydWN0IGlwX3ZzX2Rlc3RfdXNlciAqdWRlc3QpCit7CisJaW50IGNvbm5fZmxhZ3M7CisKKwkvKiBzZXQgdGhlIHdlaWdodCBhbmQgdGhlIGZsYWdzICovCisJYXRvbWljX3NldCgmZGVzdC0+d2VpZ2h0LCB1ZGVzdC0+d2VpZ2h0KTsKKwljb25uX2ZsYWdzID0gdWRlc3QtPmNvbm5fZmxhZ3MgfCBJUF9WU19DT05OX0ZfSU5BQ1RJVkU7CisKKwkvKiBjaGVjayBpZiBsb2NhbCBub2RlIGFuZCB1cGRhdGUgdGhlIGZsYWdzICovCisJaWYgKGluZXRfYWRkcl90eXBlKHVkZXN0LT5hZGRyKSA9PSBSVE5fTE9DQUwpIHsKKwkJY29ubl9mbGFncyA9IChjb25uX2ZsYWdzICYgfklQX1ZTX0NPTk5fRl9GV0RfTUFTSykKKwkJCXwgSVBfVlNfQ09OTl9GX0xPQ0FMTk9ERTsKKwl9CisKKwkvKiBzZXQgdGhlIElQX1ZTX0NPTk5fRl9OT09VVFBVVCBmbGFnIGlmIG5vdCBtYXNxdWVyYWRpbmcvTkFUICovCisJaWYgKChjb25uX2ZsYWdzICYgSVBfVlNfQ09OTl9GX0ZXRF9NQVNLKSAhPSAwKSB7CisJCWNvbm5fZmxhZ3MgfD0gSVBfVlNfQ09OTl9GX05PT1VUUFVUOworCX0gZWxzZSB7CisJCS8qCisJCSAqICAgIFB1dCB0aGUgcmVhbCBzZXJ2aWNlIGluIGlwX3ZzX3J0YWJsZSBpZiBub3QgcHJlc2VudC4KKwkJICogICAgRm9yIG5vdyBvbmx5IGZvciBOQVQhCisJCSAqLworCQl3cml0ZV9sb2NrX2JoKCZfX2lwX3ZzX3JzX2xvY2spOworCQlpcF92c19yc19oYXNoKGRlc3QpOworCQl3cml0ZV91bmxvY2tfYmgoJl9faXBfdnNfcnNfbG9jayk7CisJfQorCWF0b21pY19zZXQoJmRlc3QtPmNvbm5fZmxhZ3MsIGNvbm5fZmxhZ3MpOworCisJLyogYmluZCB0aGUgc2VydmljZSAqLworCWlmICghZGVzdC0+c3ZjKSB7CisJCV9faXBfdnNfYmluZF9zdmMoZGVzdCwgc3ZjKTsKKwl9IGVsc2UgeworCQlpZiAoZGVzdC0+c3ZjICE9IHN2YykgeworCQkJX19pcF92c191bmJpbmRfc3ZjKGRlc3QpOworCQkJaXBfdnNfemVyb19zdGF0cygmZGVzdC0+c3RhdHMpOworCQkJX19pcF92c19iaW5kX3N2YyhkZXN0LCBzdmMpOworCQl9CisJfQorCisJLyogc2V0IHRoZSBkZXN0IHN0YXR1cyBmbGFncyAqLworCWRlc3QtPmZsYWdzIHw9IElQX1ZTX0RFU1RfRl9BVkFJTEFCTEU7CisKKwlpZiAodWRlc3QtPnVfdGhyZXNob2xkID09IDAgfHwgdWRlc3QtPnVfdGhyZXNob2xkID4gZGVzdC0+dV90aHJlc2hvbGQpCisJCWRlc3QtPmZsYWdzICY9IH5JUF9WU19ERVNUX0ZfT1ZFUkxPQUQ7CisJZGVzdC0+dV90aHJlc2hvbGQgPSB1ZGVzdC0+dV90aHJlc2hvbGQ7CisJZGVzdC0+bF90aHJlc2hvbGQgPSB1ZGVzdC0+bF90aHJlc2hvbGQ7Cit9CisKKworLyoKKyAqCUNyZWF0ZSBhIGRlc3RpbmF0aW9uIGZvciB0aGUgZ2l2ZW4gc2VydmljZQorICovCitzdGF0aWMgaW50CitpcF92c19uZXdfZGVzdChzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLCBzdHJ1Y3QgaXBfdnNfZGVzdF91c2VyICp1ZGVzdCwKKwkgICAgICAgc3RydWN0IGlwX3ZzX2Rlc3QgKipkZXN0X3ApCit7CisJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3Q7CisJdW5zaWduZWQgYXR5cGU7CisKKwlFbnRlckZ1bmN0aW9uKDIpOworCisJYXR5cGUgPSBpbmV0X2FkZHJfdHlwZSh1ZGVzdC0+YWRkcik7CisJaWYgKGF0eXBlICE9IFJUTl9MT0NBTCAmJiBhdHlwZSAhPSBSVE5fVU5JQ0FTVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXN0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwX3ZzX2Rlc3QpLCBHRlBfQVRPTUlDKTsKKwlpZiAoZGVzdCA9PSBOVUxMKSB7CisJCUlQX1ZTX0VSUigiaXBfdnNfbmV3X2Rlc3Q6IGttYWxsb2MgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoZGVzdCwgMCwgc2l6ZW9mKHN0cnVjdCBpcF92c19kZXN0KSk7CisKKwlkZXN0LT5wcm90b2NvbCA9IHN2Yy0+cHJvdG9jb2w7CisJZGVzdC0+dmFkZHIgPSBzdmMtPmFkZHI7CisJZGVzdC0+dnBvcnQgPSBzdmMtPnBvcnQ7CisJZGVzdC0+dmZ3bWFyayA9IHN2Yy0+ZndtYXJrOworCWRlc3QtPmFkZHIgPSB1ZGVzdC0+YWRkcjsKKwlkZXN0LT5wb3J0ID0gdWRlc3QtPnBvcnQ7CisKKwlhdG9taWNfc2V0KCZkZXN0LT5hY3RpdmVjb25ucywgMCk7CisJYXRvbWljX3NldCgmZGVzdC0+aW5hY3Rjb25ucywgMCk7CisJYXRvbWljX3NldCgmZGVzdC0+cGVyc2lzdGNvbm5zLCAwKTsKKwlhdG9taWNfc2V0KCZkZXN0LT5yZWZjbnQsIDApOworCisJSU5JVF9MSVNUX0hFQUQoJmRlc3QtPmRfbGlzdCk7CisJc3Bpbl9sb2NrX2luaXQoJmRlc3QtPmRzdF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZGVzdC0+c3RhdHMubG9jayk7CisJX19pcF92c191cGRhdGVfZGVzdChzdmMsIGRlc3QsIHVkZXN0KTsKKwlpcF92c19uZXdfZXN0aW1hdG9yKCZkZXN0LT5zdGF0cyk7CisKKwkqZGVzdF9wID0gZGVzdDsKKworCUxlYXZlRnVuY3Rpb24oMik7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqCUFkZCBhIGRlc3RpbmF0aW9uIGludG8gYW4gZXhpc3Rpbmcgc2VydmljZQorICovCitzdGF0aWMgaW50CitpcF92c19hZGRfZGVzdChzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLCBzdHJ1Y3QgaXBfdnNfZGVzdF91c2VyICp1ZGVzdCkKK3sKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKKwlfX3UzMiBkYWRkciA9IHVkZXN0LT5hZGRyOworCV9fdTE2IGRwb3J0ID0gdWRlc3QtPnBvcnQ7CisJaW50IHJldDsKKworCUVudGVyRnVuY3Rpb24oMik7CisKKwlpZiAodWRlc3QtPndlaWdodCA8IDApIHsKKwkJSVBfVlNfRVJSKCJpcF92c19hZGRfZGVzdCgpOiBzZXJ2ZXIgd2VpZ2h0IGxlc3MgdGhhbiB6ZXJvXG4iKTsKKwkJcmV0dXJuIC1FUkFOR0U7CisJfQorCisJaWYgKHVkZXN0LT5sX3RocmVzaG9sZCA+IHVkZXN0LT51X3RocmVzaG9sZCkgeworCQlJUF9WU19FUlIoImlwX3ZzX2FkZF9kZXN0KCk6IGxvd2VyIHRocmVzaG9sZCBpcyBoaWdoZXIgdGhhbiAiCisJCQkgICJ1cHBlciB0aHJlc2hvbGRcbiIpOworCQlyZXR1cm4gLUVSQU5HRTsKKwl9CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBkZXN0IGFscmVhZHkgZXhpc3RzIGluIHRoZSBsaXN0CisJICovCisJZGVzdCA9IGlwX3ZzX2xvb2t1cF9kZXN0KHN2YywgZGFkZHIsIGRwb3J0KTsKKwlpZiAoZGVzdCAhPSBOVUxMKSB7CisJCUlQX1ZTX0RCRygxLCAiaXBfdnNfYWRkX2Rlc3QoKTogZGVzdCBhbHJlYWR5IGV4aXN0c1xuIik7CisJCXJldHVybiAtRUVYSVNUOworCX0KKworCS8qCisJICogQ2hlY2sgaWYgdGhlIGRlc3QgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHRyYXNoIGFuZAorCSAqIGlzIGZyb20gdGhlIHNhbWUgc2VydmljZQorCSAqLworCWRlc3QgPSBpcF92c190cmFzaF9nZXRfZGVzdChzdmMsIGRhZGRyLCBkcG9ydCk7CisJaWYgKGRlc3QgIT0gTlVMTCkgeworCQlJUF9WU19EQkcoMywgIkdldCBkZXN0aW5hdGlvbiAldS4ldS4ldS4ldToldSBmcm9tIHRyYXNoLCAiCisJCQkgICJyZWZjbnQ9JWQsIHNlcnZpY2UgJXUvJXUuJXUuJXUuJXU6JXVcbiIsCisJCQkgIE5JUFFVQUQoZGFkZHIpLCBudG9ocyhkcG9ydCksCisJCQkgIGF0b21pY19yZWFkKCZkZXN0LT5yZWZjbnQpLAorCQkJICBkZXN0LT52ZndtYXJrLAorCQkJICBOSVBRVUFEKGRlc3QtPnZhZGRyKSwKKwkJCSAgbnRvaHMoZGVzdC0+dnBvcnQpKTsKKwkJX19pcF92c191cGRhdGVfZGVzdChzdmMsIGRlc3QsIHVkZXN0KTsKKworCQkvKgorCQkgKiBHZXQgdGhlIGRlc3RpbmF0aW9uIGZyb20gdGhlIHRyYXNoCisJCSAqLworCQlsaXN0X2RlbCgmZGVzdC0+bl9saXN0KTsKKworCQlpcF92c19uZXdfZXN0aW1hdG9yKCZkZXN0LT5zdGF0cyk7CisKKwkJd3JpdGVfbG9ja19iaCgmX19pcF92c19zdmNfbG9jayk7CisKKwkJLyoKKwkJICogV2FpdCB1bnRpbCBhbGwgb3RoZXIgc3ZjIHVzZXJzIGdvIGF3YXkuCisJCSAqLworCQlJUF9WU19XQUlUX1dISUxFKGF0b21pY19yZWFkKCZzdmMtPnVzZWNudCkgPiAxKTsKKworCQlsaXN0X2FkZCgmZGVzdC0+bl9saXN0LCAmc3ZjLT5kZXN0aW5hdGlvbnMpOworCQlzdmMtPm51bV9kZXN0cysrOworCisJCS8qIGNhbGwgdGhlIHVwZGF0ZV9zZXJ2aWNlIGZ1bmN0aW9uIG9mIGl0cyBzY2hlZHVsZXIgKi8KKwkJc3ZjLT5zY2hlZHVsZXItPnVwZGF0ZV9zZXJ2aWNlKHN2Yyk7CisKKwkJd3JpdGVfdW5sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgZGVzdCBzdHJ1Y3R1cmUKKwkgKi8KKwlyZXQgPSBpcF92c19uZXdfZGVzdChzdmMsIHVkZXN0LCAmZGVzdCk7CisJaWYgKHJldCkgeworCQlyZXR1cm4gcmV0OworCX0KKworCS8qCisJICogQWRkIHRoZSBkZXN0IGVudHJ5IGludG8gdGhlIGxpc3QKKwkgKi8KKwlhdG9taWNfaW5jKCZkZXN0LT5yZWZjbnQpOworCisJd3JpdGVfbG9ja19iaCgmX19pcF92c19zdmNfbG9jayk7CisKKwkvKgorCSAqIFdhaXQgdW50aWwgYWxsIG90aGVyIHN2YyB1c2VycyBnbyBhd2F5LgorCSAqLworCUlQX1ZTX1dBSVRfV0hJTEUoYXRvbWljX3JlYWQoJnN2Yy0+dXNlY250KSA+IDEpOworCisJbGlzdF9hZGQoJmRlc3QtPm5fbGlzdCwgJnN2Yy0+ZGVzdGluYXRpb25zKTsKKwlzdmMtPm51bV9kZXN0cysrOworCisJLyogY2FsbCB0aGUgdXBkYXRlX3NlcnZpY2UgZnVuY3Rpb24gb2YgaXRzIHNjaGVkdWxlciAqLworCXN2Yy0+c2NoZWR1bGVyLT51cGRhdGVfc2VydmljZShzdmMpOworCisJd3JpdGVfdW5sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKKworCUxlYXZlRnVuY3Rpb24oMik7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJRWRpdCBhIGRlc3RpbmF0aW9uIGluIHRoZSBnaXZlbiBzZXJ2aWNlCisgKi8KK3N0YXRpYyBpbnQKK2lwX3ZzX2VkaXRfZGVzdChzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLCBzdHJ1Y3QgaXBfdnNfZGVzdF91c2VyICp1ZGVzdCkKK3sKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKKwlfX3UzMiBkYWRkciA9IHVkZXN0LT5hZGRyOworCV9fdTE2IGRwb3J0ID0gdWRlc3QtPnBvcnQ7CisKKwlFbnRlckZ1bmN0aW9uKDIpOworCisJaWYgKHVkZXN0LT53ZWlnaHQgPCAwKSB7CisJCUlQX1ZTX0VSUigiaXBfdnNfZWRpdF9kZXN0KCk6IHNlcnZlciB3ZWlnaHQgbGVzcyB0aGFuIHplcm9cbiIpOworCQlyZXR1cm4gLUVSQU5HRTsKKwl9CisKKwlpZiAodWRlc3QtPmxfdGhyZXNob2xkID4gdWRlc3QtPnVfdGhyZXNob2xkKSB7CisJCUlQX1ZTX0VSUigiaXBfdnNfZWRpdF9kZXN0KCk6IGxvd2VyIHRocmVzaG9sZCBpcyBoaWdoZXIgdGhhbiAiCisJCQkgICJ1cHBlciB0aHJlc2hvbGRcbiIpOworCQlyZXR1cm4gLUVSQU5HRTsKKwl9CisKKwkvKgorCSAqICBMb29rdXAgdGhlIGRlc3RpbmF0aW9uIGxpc3QKKwkgKi8KKwlkZXN0ID0gaXBfdnNfbG9va3VwX2Rlc3Qoc3ZjLCBkYWRkciwgZHBvcnQpOworCWlmIChkZXN0ID09IE5VTEwpIHsKKwkJSVBfVlNfREJHKDEsICJpcF92c19lZGl0X2Rlc3QoKTogZGVzdCBkb2Vzbid0IGV4aXN0XG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJX19pcF92c191cGRhdGVfZGVzdChzdmMsIGRlc3QsIHVkZXN0KTsKKworCXdyaXRlX2xvY2tfYmgoJl9faXBfdnNfc3ZjX2xvY2spOworCisJLyogV2FpdCB1bnRpbCBhbGwgb3RoZXIgc3ZjIHVzZXJzIGdvIGF3YXkgKi8KKwl3aGlsZSAoYXRvbWljX3JlYWQoJnN2Yy0+dXNlY250KSA+IDEpIHt9OworCisJLyogY2FsbCB0aGUgdXBkYXRlX3NlcnZpY2UsIGJlY2F1c2Ugc2VydmVyIHdlaWdodCBtYXkgYmUgY2hhbmdlZCAqLworCXN2Yy0+c2NoZWR1bGVyLT51cGRhdGVfc2VydmljZShzdmMpOworCisJd3JpdGVfdW5sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKKworCUxlYXZlRnVuY3Rpb24oMik7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJRGVsZXRlIGEgZGVzdGluYXRpb24gKG11c3QgYmUgYWxyZWFkeSB1bmxpbmtlZCBmcm9tIHRoZSBzZXJ2aWNlKQorICovCitzdGF0aWMgdm9pZCBfX2lwX3ZzX2RlbF9kZXN0KHN0cnVjdCBpcF92c19kZXN0ICpkZXN0KQoreworCWlwX3ZzX2tpbGxfZXN0aW1hdG9yKCZkZXN0LT5zdGF0cyk7CisKKwkvKgorCSAqICBSZW1vdmUgaXQgZnJvbSB0aGUgZC1saW5rZWQgbGlzdCB3aXRoIHRoZSByZWFsIHNlcnZpY2VzLgorCSAqLworCXdyaXRlX2xvY2tfYmgoJl9faXBfdnNfcnNfbG9jayk7CisJaXBfdnNfcnNfdW5oYXNoKGRlc3QpOworCXdyaXRlX3VubG9ja19iaCgmX19pcF92c19yc19sb2NrKTsKKworCS8qCisJICogIERlY3JlYXNlIHRoZSByZWZjbnQgb2YgdGhlIGRlc3QsIGFuZCBmcmVlIHRoZSBkZXN0CisJICogIGlmIG5vYm9keSByZWZlcnMgdG8gaXQgKHJlZmNudD0wKS4gT3RoZXJ3aXNlLCB0aHJvdworCSAqICB0aGUgZGVzdGluYXRpb24gaW50byB0aGUgdHJhc2guCisJICovCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmRlc3QtPnJlZmNudCkpIHsKKwkJaXBfdnNfZHN0X3Jlc2V0KGRlc3QpOworCQkvKiBzaW1wbHkgZGVjcmVhc2Ugc3ZjLT5yZWZjbnQgaGVyZSwgbGV0IHRoZSBjYWxsZXIgY2hlY2sKKwkJICAgYW5kIHJlbGVhc2UgdGhlIHNlcnZpY2UgaWYgbm9ib2R5IHJlZmVycyB0byBpdC4KKwkJICAgT25seSB1c2VyIGNvbnRleHQgY2FuIHJlbGVhc2UgZGVzdGluYXRpb24gYW5kIHNlcnZpY2UsCisJCSAgIGFuZCBvbmx5IG9uZSB1c2VyIGNvbnRleHQgY2FuIHVwZGF0ZSB2aXJ0dWFsIHNlcnZpY2UgYXQgYQorCQkgICB0aW1lLCBzbyB0aGUgb3BlcmF0aW9uIGhlcmUgaXMgT0sgKi8KKwkJYXRvbWljX2RlYygmZGVzdC0+c3ZjLT5yZWZjbnQpOworCQlrZnJlZShkZXN0KTsKKwl9IGVsc2UgeworCQlJUF9WU19EQkcoMywgIk1vdmluZyBkZXN0ICV1LiV1LiV1LiV1OiV1IGludG8gdHJhc2gsIHJlZmNudD0lZFxuIiwKKwkJCSAgTklQUVVBRChkZXN0LT5hZGRyKSwgbnRvaHMoZGVzdC0+cG9ydCksCisJCQkgIGF0b21pY19yZWFkKCZkZXN0LT5yZWZjbnQpKTsKKwkJbGlzdF9hZGQoJmRlc3QtPm5fbGlzdCwgJmlwX3ZzX2Rlc3RfdHJhc2gpOworCQlhdG9taWNfaW5jKCZkZXN0LT5yZWZjbnQpOworCX0KK30KKworCisvKgorICoJVW5saW5rIGEgZGVzdGluYXRpb24gZnJvbSB0aGUgZ2l2ZW4gc2VydmljZQorICovCitzdGF0aWMgdm9pZCBfX2lwX3ZzX3VubGlua19kZXN0KHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsCisJCQkJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QsCisJCQkJaW50IHN2Y3VwZCkKK3sKKwlkZXN0LT5mbGFncyAmPSB+SVBfVlNfREVTVF9GX0FWQUlMQUJMRTsKKworCS8qCisJICogIFJlbW92ZSBpdCBmcm9tIHRoZSBkLWxpbmtlZCBkZXN0aW5hdGlvbiBsaXN0LgorCSAqLworCWxpc3RfZGVsKCZkZXN0LT5uX2xpc3QpOworCXN2Yy0+bnVtX2Rlc3RzLS07CisJaWYgKHN2Y3VwZCkgeworCQkvKgorCQkgKiAgQ2FsbCB0aGUgdXBkYXRlX3NlcnZpY2UgZnVuY3Rpb24gb2YgaXRzIHNjaGVkdWxlcgorCQkgKi8KKwkJc3ZjLT5zY2hlZHVsZXItPnVwZGF0ZV9zZXJ2aWNlKHN2Yyk7CisJfQorfQorCisKKy8qCisgKglEZWxldGUgYSBkZXN0aW5hdGlvbiBzZXJ2ZXIgaW4gdGhlIGdpdmVuIHNlcnZpY2UKKyAqLworc3RhdGljIGludAoraXBfdnNfZGVsX2Rlc3Qoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YyxzdHJ1Y3QgaXBfdnNfZGVzdF91c2VyICp1ZGVzdCkKK3sKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKKwlfX3UzMiBkYWRkciA9IHVkZXN0LT5hZGRyOworCV9fdTE2IGRwb3J0ID0gdWRlc3QtPnBvcnQ7CisKKwlFbnRlckZ1bmN0aW9uKDIpOworCisJZGVzdCA9IGlwX3ZzX2xvb2t1cF9kZXN0KHN2YywgZGFkZHIsIGRwb3J0KTsKKwlpZiAoZGVzdCA9PSBOVUxMKSB7CisJCUlQX1ZTX0RCRygxLCAiaXBfdnNfZGVsX2Rlc3QoKTogZGVzdGluYXRpb24gbm90IGZvdW5kIVxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXdyaXRlX2xvY2tfYmgoJl9faXBfdnNfc3ZjX2xvY2spOworCisJLyoKKwkgKglXYWl0IHVudGlsIGFsbCBvdGhlciBzdmMgdXNlcnMgZ28gYXdheS4KKwkgKi8KKwlJUF9WU19XQUlUX1dISUxFKGF0b21pY19yZWFkKCZzdmMtPnVzZWNudCkgPiAxKTsKKworCS8qCisJICoJVW5saW5rIGRlc3QgZnJvbSB0aGUgc2VydmljZQorCSAqLworCV9faXBfdnNfdW5saW5rX2Rlc3Qoc3ZjLCBkZXN0LCAxKTsKKworCXdyaXRlX3VubG9ja19iaCgmX19pcF92c19zdmNfbG9jayk7CisKKwkvKgorCSAqCURlbGV0ZSB0aGUgZGVzdGluYXRpb24KKwkgKi8KKwlfX2lwX3ZzX2RlbF9kZXN0KGRlc3QpOworCisJTGVhdmVGdW5jdGlvbigyKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKglBZGQgYSBzZXJ2aWNlIGludG8gdGhlIHNlcnZpY2UgaGFzaCB0YWJsZQorICovCitzdGF0aWMgaW50CitpcF92c19hZGRfc2VydmljZShzdHJ1Y3QgaXBfdnNfc2VydmljZV91c2VyICp1LCBzdHJ1Y3QgaXBfdnNfc2VydmljZSAqKnN2Y19wKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBpcF92c19zY2hlZHVsZXIgKnNjaGVkID0gTlVMTDsKKwlzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjID0gTlVMTDsKKworCS8qIGluY3JlYXNlIHRoZSBtb2R1bGUgdXNlIGNvdW50ICovCisJaXBfdnNfdXNlX2NvdW50X2luYygpOworCisJLyogTG9va3VwIHRoZSBzY2hlZHVsZXIgYnkgJ3UtPnNjaGVkX25hbWUnICovCisJc2NoZWQgPSBpcF92c19zY2hlZHVsZXJfZ2V0KHUtPnNjaGVkX25hbWUpOworCWlmIChzY2hlZCA9PSBOVUxMKSB7CisJCUlQX1ZTX0lORk8oIlNjaGVkdWxlciBtb2R1bGUgaXBfdnNfJXMgbm90IGZvdW5kXG4iLAorCQkJICAgdS0+c2NoZWRfbmFtZSk7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0X21vZF9kZWM7CisJfQorCisJc3ZjID0gKHN0cnVjdCBpcF92c19zZXJ2aWNlICopCisJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcF92c19zZXJ2aWNlKSwgR0ZQX0FUT01JQyk7CisJaWYgKHN2YyA9PSBOVUxMKSB7CisJCUlQX1ZTX0RCRygxLCAiaXBfdnNfYWRkX3NlcnZpY2U6IGttYWxsb2MgZmFpbGVkLlxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2VycjsKKwl9CisJbWVtc2V0KHN2YywgMCwgc2l6ZW9mKHN0cnVjdCBpcF92c19zZXJ2aWNlKSk7CisKKwkvKiBJJ20gdGhlIGZpcnN0IHVzZXIgb2YgdGhlIHNlcnZpY2UgKi8KKwlhdG9taWNfc2V0KCZzdmMtPnVzZWNudCwgMSk7CisJYXRvbWljX3NldCgmc3ZjLT5yZWZjbnQsIDApOworCisJc3ZjLT5wcm90b2NvbCA9IHUtPnByb3RvY29sOworCXN2Yy0+YWRkciA9IHUtPmFkZHI7CisJc3ZjLT5wb3J0ID0gdS0+cG9ydDsKKwlzdmMtPmZ3bWFyayA9IHUtPmZ3bWFyazsKKwlzdmMtPmZsYWdzID0gdS0+ZmxhZ3M7CisJc3ZjLT50aW1lb3V0ID0gdS0+dGltZW91dCAqIEhaOworCXN2Yy0+bmV0bWFzayA9IHUtPm5ldG1hc2s7CisKKwlJTklUX0xJU1RfSEVBRCgmc3ZjLT5kZXN0aW5hdGlvbnMpOworCXJ3bG9ja19pbml0KCZzdmMtPnNjaGVkX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZzdmMtPnN0YXRzLmxvY2spOworCisJLyogQmluZCB0aGUgc2NoZWR1bGVyICovCisJcmV0ID0gaXBfdnNfYmluZF9zY2hlZHVsZXIoc3ZjLCBzY2hlZCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZXJyOworCXNjaGVkID0gTlVMTDsKKworCS8qIFVwZGF0ZSB0aGUgdmlydHVhbCBzZXJ2aWNlIGNvdW50ZXJzICovCisJaWYgKHN2Yy0+cG9ydCA9PSBGVFBQT1JUKQorCQlhdG9taWNfaW5jKCZpcF92c19mdHBzdmNfY291bnRlcik7CisJZWxzZSBpZiAoc3ZjLT5wb3J0ID09IDApCisJCWF0b21pY19pbmMoJmlwX3ZzX251bGxzdmNfY291bnRlcik7CisKKwlpcF92c19uZXdfZXN0aW1hdG9yKCZzdmMtPnN0YXRzKTsKKwlpcF92c19udW1fc2VydmljZXMrKzsKKworCS8qIEhhc2ggdGhlIHNlcnZpY2UgaW50byB0aGUgc2VydmljZSB0YWJsZSAqLworCXdyaXRlX2xvY2tfYmgoJl9faXBfdnNfc3ZjX2xvY2spOworCWlwX3ZzX3N2Y19oYXNoKHN2Yyk7CisJd3JpdGVfdW5sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKKworCSpzdmNfcCA9IHN2YzsKKwlyZXR1cm4gMDsKKworICBvdXRfZXJyOgorCWlmIChzdmMgIT0gTlVMTCkgeworCQlpZiAoc3ZjLT5zY2hlZHVsZXIpCisJCQlpcF92c191bmJpbmRfc2NoZWR1bGVyKHN2Yyk7CisJCWlmIChzdmMtPmluYykgeworCQkJbG9jYWxfYmhfZGlzYWJsZSgpOworCQkJaXBfdnNfYXBwX2luY19wdXQoc3ZjLT5pbmMpOworCQkJbG9jYWxfYmhfZW5hYmxlKCk7CisJCX0KKwkJa2ZyZWUoc3ZjKTsKKwl9CisJaXBfdnNfc2NoZWR1bGVyX3B1dChzY2hlZCk7CisKKyAgb3V0X21vZF9kZWM6CisJLyogZGVjcmVhc2UgdGhlIG1vZHVsZSB1c2UgY291bnQgKi8KKwlpcF92c191c2VfY291bnRfZGVjKCk7CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKglFZGl0IGEgc2VydmljZSBhbmQgYmluZCBpdCB3aXRoIGEgbmV3IHNjaGVkdWxlcgorICovCitzdGF0aWMgaW50CitpcF92c19lZGl0X3NlcnZpY2Uoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2Yywgc3RydWN0IGlwX3ZzX3NlcnZpY2VfdXNlciAqdSkKK3sKKwlzdHJ1Y3QgaXBfdnNfc2NoZWR1bGVyICpzY2hlZCwgKm9sZF9zY2hlZDsKKwlpbnQgcmV0ID0gMDsKKworCS8qCisJICogTG9va3VwIHRoZSBzY2hlZHVsZXIsIGJ5ICd1LT5zY2hlZF9uYW1lJworCSAqLworCXNjaGVkID0gaXBfdnNfc2NoZWR1bGVyX2dldCh1LT5zY2hlZF9uYW1lKTsKKwlpZiAoc2NoZWQgPT0gTlVMTCkgeworCQlJUF9WU19JTkZPKCJTY2hlZHVsZXIgbW9kdWxlIGlwX3ZzXyVzIG5vdCBmb3VuZFxuIiwKKwkJCSAgIHUtPnNjaGVkX25hbWUpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJb2xkX3NjaGVkID0gc2NoZWQ7CisKKwl3cml0ZV9sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKKworCS8qCisJICogV2FpdCB1bnRpbCBhbGwgb3RoZXIgc3ZjIHVzZXJzIGdvIGF3YXkuCisJICovCisJSVBfVlNfV0FJVF9XSElMRShhdG9taWNfcmVhZCgmc3ZjLT51c2VjbnQpID4gMSk7CisKKwkvKgorCSAqIFNldCB0aGUgZmxhZ3MgYW5kIHRpbWVvdXQgdmFsdWUKKwkgKi8KKwlzdmMtPmZsYWdzID0gdS0+ZmxhZ3MgfCBJUF9WU19TVkNfRl9IQVNIRUQ7CisJc3ZjLT50aW1lb3V0ID0gdS0+dGltZW91dCAqIEhaOworCXN2Yy0+bmV0bWFzayA9IHUtPm5ldG1hc2s7CisKKwlvbGRfc2NoZWQgPSBzdmMtPnNjaGVkdWxlcjsKKwlpZiAoc2NoZWQgIT0gb2xkX3NjaGVkKSB7CisJCS8qCisJCSAqIFVuYmluZCB0aGUgb2xkIHNjaGVkdWxlcgorCQkgKi8KKwkJaWYgKChyZXQgPSBpcF92c191bmJpbmRfc2NoZWR1bGVyKHN2YykpKSB7CisJCQlvbGRfc2NoZWQgPSBzY2hlZDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyoKKwkJICogQmluZCB0aGUgbmV3IHNjaGVkdWxlcgorCQkgKi8KKwkJaWYgKChyZXQgPSBpcF92c19iaW5kX3NjaGVkdWxlcihzdmMsIHNjaGVkKSkpIHsKKwkJCS8qCisJCQkgKiBJZiBpcF92c19iaW5kX3NjaGVkdWxlciBmYWlscywgcmVzdG9yZSB0aGUgb2xkCisJCQkgKiBzY2hlZHVsZXIuCisJCQkgKiBUaGUgbWFpbiByZWFzb24gb2YgZmFpbHVyZSBpcyBvdXQgb2YgbWVtb3J5LgorCQkJICoKKwkJCSAqIFRoZSBxdWVzdGlvbiBpcyBpZiB0aGUgb2xkIHNjaGVkdWxlciBjYW4gYmUKKwkJCSAqIHJlc3RvcmVkIGFsbCB0aGUgdGltZS4gVE9ETzogaWYgaXQgY2Fubm90IGJlCisJCQkgKiByZXN0b3JlZCBzb21lIHRpbWUsIHdlIG11c3QgZGVsZXRlIHRoZSBzZXJ2aWNlLAorCQkJICogb3RoZXJ3aXNlIHRoZSBzeXN0ZW0gbWF5IGNyYXNoLgorCQkJICovCisJCQlpcF92c19iaW5kX3NjaGVkdWxlcihzdmMsIG9sZF9zY2hlZCk7CisJCQlvbGRfc2NoZWQgPSBzY2hlZDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisgIG91dDoKKwl3cml0ZV91bmxvY2tfYmgoJl9faXBfdnNfc3ZjX2xvY2spOworCisJaWYgKG9sZF9zY2hlZCkKKwkJaXBfdnNfc2NoZWR1bGVyX3B1dChvbGRfc2NoZWQpOworCisJcmV0dXJuIHJldDsKK30KKworCisvKgorICoJRGVsZXRlIGEgc2VydmljZSBmcm9tIHRoZSBzZXJ2aWNlIGxpc3QKKyAqCS0gVGhlIHNlcnZpY2UgbXVzdCBiZSB1bmxpbmtlZCwgdW5sb2NrZWQgYW5kIG5vdCByZWZlcmVuY2VkIQorICoJLSBXZSBhcmUgY2FsbGVkIHVuZGVyIF9iaCBsb2NrCisgKi8KK3N0YXRpYyB2b2lkIF9faXBfdnNfZGVsX3NlcnZpY2Uoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCwgKm54dDsKKwlzdHJ1Y3QgaXBfdnNfc2NoZWR1bGVyICpvbGRfc2NoZWQ7CisKKwlpcF92c19udW1fc2VydmljZXMtLTsKKwlpcF92c19raWxsX2VzdGltYXRvcigmc3ZjLT5zdGF0cyk7CisKKwkvKiBVbmJpbmQgc2NoZWR1bGVyICovCisJb2xkX3NjaGVkID0gc3ZjLT5zY2hlZHVsZXI7CisJaXBfdnNfdW5iaW5kX3NjaGVkdWxlcihzdmMpOworCWlmIChvbGRfc2NoZWQpCisJCWlwX3ZzX3NjaGVkdWxlcl9wdXQob2xkX3NjaGVkKTsKKworCS8qIFVuYmluZCBhcHAgaW5jICovCisJaWYgKHN2Yy0+aW5jKSB7CisJCWlwX3ZzX2FwcF9pbmNfcHV0KHN2Yy0+aW5jKTsKKwkJc3ZjLT5pbmMgPSBOVUxMOworCX0KKworCS8qCisJICogICAgVW5saW5rIHRoZSB3aG9sZSBkZXN0aW5hdGlvbiBsaXN0CisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlc3QsIG54dCwgJnN2Yy0+ZGVzdGluYXRpb25zLCBuX2xpc3QpIHsKKwkJX19pcF92c191bmxpbmtfZGVzdChzdmMsIGRlc3QsIDApOworCQlfX2lwX3ZzX2RlbF9kZXN0KGRlc3QpOworCX0KKworCS8qCisJICogICAgVXBkYXRlIHRoZSB2aXJ0dWFsIHNlcnZpY2UgY291bnRlcnMKKwkgKi8KKwlpZiAoc3ZjLT5wb3J0ID09IEZUUFBPUlQpCisJCWF0b21pY19kZWMoJmlwX3ZzX2Z0cHN2Y19jb3VudGVyKTsKKwllbHNlIGlmIChzdmMtPnBvcnQgPT0gMCkKKwkJYXRvbWljX2RlYygmaXBfdnNfbnVsbHN2Y19jb3VudGVyKTsKKworCS8qCisJICogICAgRnJlZSB0aGUgc2VydmljZSBpZiBub2JvZHkgcmVmZXJzIHRvIGl0CisJICovCisJaWYgKGF0b21pY19yZWFkKCZzdmMtPnJlZmNudCkgPT0gMCkKKwkJa2ZyZWUoc3ZjKTsKKworCS8qIGRlY3JlYXNlIHRoZSBtb2R1bGUgdXNlIGNvdW50ICovCisJaXBfdnNfdXNlX2NvdW50X2RlYygpOworfQorCisvKgorICoJRGVsZXRlIGEgc2VydmljZSBmcm9tIHRoZSBzZXJ2aWNlIGxpc3QKKyAqLworc3RhdGljIGludCBpcF92c19kZWxfc2VydmljZShzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQoreworCWlmIChzdmMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwkvKgorCSAqIFVuaGFzaCBpdCBmcm9tIHRoZSBzZXJ2aWNlIHRhYmxlCisJICovCisJd3JpdGVfbG9ja19iaCgmX19pcF92c19zdmNfbG9jayk7CisKKwlpcF92c19zdmNfdW5oYXNoKHN2Yyk7CisKKwkvKgorCSAqIFdhaXQgdW50aWwgYWxsIHRoZSBzdmMgdXNlcnMgZ28gYXdheS4KKwkgKi8KKwlJUF9WU19XQUlUX1dISUxFKGF0b21pY19yZWFkKCZzdmMtPnVzZWNudCkgPiAxKTsKKworCV9faXBfdnNfZGVsX3NlcnZpY2Uoc3ZjKTsKKworCXdyaXRlX3VubG9ja19iaCgmX19pcF92c19zdmNfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJRmx1c2ggYWxsIHRoZSB2aXJ0dWFsIHNlcnZpY2VzCisgKi8KK3N0YXRpYyBpbnQgaXBfdnNfZmx1c2godm9pZCkKK3sKKwlpbnQgaWR4OworCXN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsICpueHQ7CisKKwkvKgorCSAqIEZsdXNoIHRoZSBzZXJ2aWNlIHRhYmxlIGhhc2hlZCBieSA8cHJvdG9jb2wsYWRkcixwb3J0PgorCSAqLworCWZvcihpZHggPSAwOyBpZHggPCBJUF9WU19TVkNfVEFCX1NJWkU7IGlkeCsrKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzdmMsIG54dCwgJmlwX3ZzX3N2Y190YWJsZVtpZHhdLCBzX2xpc3QpIHsKKwkJCXdyaXRlX2xvY2tfYmgoJl9faXBfdnNfc3ZjX2xvY2spOworCQkJaXBfdnNfc3ZjX3VuaGFzaChzdmMpOworCQkJLyoKKwkJCSAqIFdhaXQgdW50aWwgYWxsIHRoZSBzdmMgdXNlcnMgZ28gYXdheS4KKwkJCSAqLworCQkJSVBfVlNfV0FJVF9XSElMRShhdG9taWNfcmVhZCgmc3ZjLT51c2VjbnQpID4gMCk7CisJCQlfX2lwX3ZzX2RlbF9zZXJ2aWNlKHN2Yyk7CisJCQl3cml0ZV91bmxvY2tfYmgoJl9faXBfdnNfc3ZjX2xvY2spOworCQl9CisJfQorCisJLyoKKwkgKiBGbHVzaCB0aGUgc2VydmljZSB0YWJsZSBoYXNoZWQgYnkgZndtYXJrCisJICovCisJZm9yKGlkeCA9IDA7IGlkeCA8IElQX1ZTX1NWQ19UQUJfU0laRTsgaWR4KyspIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHN2Yywgbnh0LAorCQkJCQkgJmlwX3ZzX3N2Y19md21fdGFibGVbaWR4XSwgZl9saXN0KSB7CisJCQl3cml0ZV9sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKKwkJCWlwX3ZzX3N2Y191bmhhc2goc3ZjKTsKKwkJCS8qCisJCQkgKiBXYWl0IHVudGlsIGFsbCB0aGUgc3ZjIHVzZXJzIGdvIGF3YXkuCisJCQkgKi8KKwkJCUlQX1ZTX1dBSVRfV0hJTEUoYXRvbWljX3JlYWQoJnN2Yy0+dXNlY250KSA+IDApOworCQkJX19pcF92c19kZWxfc2VydmljZShzdmMpOworCQkJd3JpdGVfdW5sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisKKy8qCisgKglaZXJvIGNvdW50ZXJzIGluIGEgc2VydmljZSBvciBhbGwgc2VydmljZXMKKyAqLworc3RhdGljIGludCBpcF92c196ZXJvX3NlcnZpY2Uoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKKworCXdyaXRlX2xvY2tfYmgoJl9faXBfdnNfc3ZjX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzdCwgJnN2Yy0+ZGVzdGluYXRpb25zLCBuX2xpc3QpIHsKKwkJaXBfdnNfemVyb19zdGF0cygmZGVzdC0+c3RhdHMpOworCX0KKwlpcF92c196ZXJvX3N0YXRzKCZzdmMtPnN0YXRzKTsKKwl3cml0ZV91bmxvY2tfYmgoJl9faXBfdnNfc3ZjX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwX3ZzX3plcm9fYWxsKHZvaWQpCit7CisJaW50IGlkeDsKKwlzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjOworCisJZm9yKGlkeCA9IDA7IGlkeCA8IElQX1ZTX1NWQ19UQUJfU0laRTsgaWR4KyspIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShzdmMsICZpcF92c19zdmNfdGFibGVbaWR4XSwgc19saXN0KSB7CisJCQlpcF92c196ZXJvX3NlcnZpY2Uoc3ZjKTsKKwkJfQorCX0KKworCWZvcihpZHggPSAwOyBpZHggPCBJUF9WU19TVkNfVEFCX1NJWkU7IGlkeCsrKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoc3ZjLCAmaXBfdnNfc3ZjX2Z3bV90YWJsZVtpZHhdLCBmX2xpc3QpIHsKKwkJCWlwX3ZzX3plcm9fc2VydmljZShzdmMpOworCQl9CisJfQorCisJaXBfdnNfemVyb19zdGF0cygmaXBfdnNfc3RhdHMpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK3Byb2NfZG9fZGVmZW5zZV9tb2RlKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKiBmaWxwLAorCQkgICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQoreworCWludCAqdmFscCA9IHRhYmxlLT5kYXRhOworCWludCB2YWwgPSAqdmFscDsKKwlpbnQgcmM7CisKKwlyYyA9IHByb2NfZG9pbnR2ZWModGFibGUsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCWlmICh3cml0ZSAmJiAoKnZhbHAgIT0gdmFsKSkgeworCQlpZiAoKCp2YWxwIDwgMCkgfHwgKCp2YWxwID4gMykpIHsKKwkJCS8qIFJlc3RvcmUgdGhlIGNvcnJlY3QgdmFsdWUgKi8KKwkJCSp2YWxwID0gdmFsOworCQl9IGVsc2UgeworCQkJbG9jYWxfYmhfZGlzYWJsZSgpOworCQkJdXBkYXRlX2RlZmVuc2VfbGV2ZWwoKTsKKwkJCWxvY2FsX2JoX2VuYWJsZSgpOworCQl9CisJfQorCXJldHVybiByYzsKK30KKworCitzdGF0aWMgaW50Citwcm9jX2RvX3N5bmNfdGhyZXNob2xkKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgKnZhbHAgPSB0YWJsZS0+ZGF0YTsKKwlpbnQgdmFsWzJdOworCWludCByYzsKKworCS8qIGJhY2t1cCB0aGUgdmFsdWUgZmlyc3QgKi8KKwltZW1jcHkodmFsLCB2YWxwLCBzaXplb2YodmFsKSk7CisKKwlyYyA9IHByb2NfZG9pbnR2ZWModGFibGUsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCWlmICh3cml0ZSAmJiAodmFscFswXSA8IDAgfHwgdmFscFsxXSA8IDAgfHwgdmFscFswXSA+PSB2YWxwWzFdKSkgeworCQkvKiBSZXN0b3JlIHRoZSBjb3JyZWN0IHZhbHVlICovCisJCW1lbWNweSh2YWxwLCB2YWwsIHNpemVvZih2YWwpKTsKKwl9CisJcmV0dXJuIHJjOworfQorCisKKy8qCisgKglJUFZTIHN5c2N0bCB0YWJsZSAodW5kZXIgdGhlIC9wcm9jL3N5cy9uZXQvaXB2NC92cy8pCisgKi8KKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgdnNfdmFyc1tdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfVlNfQU1FTVRIUkVTSCwKKwkJLnByb2NuYW1lCT0gImFtZW10aHJlc2giLAorCQkuZGF0YQkJPSAmc3lzY3RsX2lwX3ZzX2FtZW10aHJlc2gsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorI2lmZGVmIENPTkZJR19JUF9WU19ERUJVRworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfVlNfREVCVUdfTEVWRUwsCisJCS5wcm9jbmFtZQk9ICJkZWJ1Z19sZXZlbCIsCisJCS5kYXRhCQk9ICZzeXNjdGxfaXBfdnNfZGVidWdfbGV2ZWwsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorI2VuZGlmCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9WU19BTURST1BSQVRFLAorCQkucHJvY25hbWUJPSAiYW1fZHJvcHJhdGUiLAorCQkuZGF0YQkJPSAmc3lzY3RsX2lwX3ZzX2FtX2Ryb3ByYXRlLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X1ZTX0RST1BfRU5UUlksCisJCS5wcm9jbmFtZQk9ICJkcm9wX2VudHJ5IiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9pcF92c19kcm9wX2VudHJ5LAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9fZGVmZW5zZV9tb2RlLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9WU19EUk9QX1BBQ0tFVCwKKwkJLnByb2NuYW1lCT0gImRyb3BfcGFja2V0IiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9pcF92c19kcm9wX3BhY2tldCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvX2RlZmVuc2VfbW9kZSwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfVlNfU0VDVVJFX1RDUCwKKwkJLnByb2NuYW1lCT0gInNlY3VyZV90Y3AiLAorCQkuZGF0YQkJPSAmc3lzY3RsX2lwX3ZzX3NlY3VyZV90Y3AsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb19kZWZlbnNlX21vZGUsCisJfSwKKyNpZiAwCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9WU19UT19FUywKKwkJLnByb2NuYW1lCT0gInRpbWVvdXRfZXN0YWJsaXNoZWQiLAorCQkuZGF0YQk9ICZ2c190aW1lb3V0X3RhYmxlX2Rvcy50aW1lb3V0W0lQX1ZTX1NfRVNUQUJMSVNIRURdLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfVlNfVE9fU1MsCisJCS5wcm9jbmFtZQk9ICJ0aW1lb3V0X3N5bnNlbnQiLAorCQkuZGF0YQk9ICZ2c190aW1lb3V0X3RhYmxlX2Rvcy50aW1lb3V0W0lQX1ZTX1NfU1lOX1NFTlRdLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfVlNfVE9fU1IsCisJCS5wcm9jbmFtZQk9ICJ0aW1lb3V0X3N5bnJlY3YiLAorCQkuZGF0YQk9ICZ2c190aW1lb3V0X3RhYmxlX2Rvcy50aW1lb3V0W0lQX1ZTX1NfU1lOX1JFQ1ZdLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfVlNfVE9fRlcsCisJCS5wcm9jbmFtZQk9ICJ0aW1lb3V0X2ZpbndhaXQiLAorCQkuZGF0YQk9ICZ2c190aW1lb3V0X3RhYmxlX2Rvcy50aW1lb3V0W0lQX1ZTX1NfRklOX1dBSVRdLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfVlNfVE9fVFcsCisJCS5wcm9jbmFtZQk9ICJ0aW1lb3V0X3RpbWV3YWl0IiwKKwkJLmRhdGEJPSAmdnNfdGltZW91dF90YWJsZV9kb3MudGltZW91dFtJUF9WU19TX1RJTUVfV0FJVF0sCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9WU19UT19DTCwKKwkJLnByb2NuYW1lCT0gInRpbWVvdXRfY2xvc2UiLAorCQkuZGF0YQk9ICZ2c190aW1lb3V0X3RhYmxlX2Rvcy50aW1lb3V0W0lQX1ZTX1NfQ0xPU0VdLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfVlNfVE9fQ1csCisJCS5wcm9jbmFtZQk9ICJ0aW1lb3V0X2Nsb3Nld2FpdCIsCisJCS5kYXRhCT0gJnZzX3RpbWVvdXRfdGFibGVfZG9zLnRpbWVvdXRbSVBfVlNfU19DTE9TRV9XQUlUXSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X1ZTX1RPX0xBLAorCQkucHJvY25hbWUJPSAidGltZW91dF9sYXN0YWNrIiwKKwkJLmRhdGEJPSAmdnNfdGltZW91dF90YWJsZV9kb3MudGltZW91dFtJUF9WU19TX0xBU1RfQUNLXSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X1ZTX1RPX0xJLAorCQkucHJvY25hbWUJPSAidGltZW91dF9saXN0ZW4iLAorCQkuZGF0YQk9ICZ2c190aW1lb3V0X3RhYmxlX2Rvcy50aW1lb3V0W0lQX1ZTX1NfTElTVEVOXSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X1ZTX1RPX1NBLAorCQkucHJvY25hbWUJPSAidGltZW91dF9zeW5hY2siLAorCQkuZGF0YQk9ICZ2c190aW1lb3V0X3RhYmxlX2Rvcy50aW1lb3V0W0lQX1ZTX1NfU1lOQUNLXSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X1ZTX1RPX1VEUCwKKwkJLnByb2NuYW1lCT0gInRpbWVvdXRfdWRwIiwKKwkJLmRhdGEJPSAmdnNfdGltZW91dF90YWJsZV9kb3MudGltZW91dFtJUF9WU19TX1VEUF0sCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9WU19UT19JQ01QLAorCQkucHJvY25hbWUJPSAidGltZW91dF9pY21wIiwKKwkJLmRhdGEJPSAmdnNfdGltZW91dF90YWJsZV9kb3MudGltZW91dFtJUF9WU19TX0lDTVBdLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorI2VuZGlmCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9WU19DQUNIRV9CWVBBU1MsCisJCS5wcm9jbmFtZQk9ICJjYWNoZV9ieXBhc3MiLAorCQkuZGF0YQkJPSAmc3lzY3RsX2lwX3ZzX2NhY2hlX2J5cGFzcywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9WU19FWFBJUkVfTk9ERVNUX0NPTk4sCisJCS5wcm9jbmFtZQk9ICJleHBpcmVfbm9kZXN0X2Nvbm4iLAorCQkuZGF0YQkJPSAmc3lzY3RsX2lwX3ZzX2V4cGlyZV9ub2Rlc3RfY29ubiwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9WU19FWFBJUkVfUVVJRVNDRU5UX1RFTVBMQVRFLAorCQkucHJvY25hbWUJPSAiZXhwaXJlX3F1aWVzY2VudF90ZW1wbGF0ZSIsCisJCS5kYXRhCQk9ICZzeXNjdGxfaXBfdnNfZXhwaXJlX3F1aWVzY2VudF90ZW1wbGF0ZSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9WU19TWU5DX1RIUkVTSE9MRCwKKwkJLnByb2NuYW1lCT0gInN5bmNfdGhyZXNob2xkIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9pcF92c19zeW5jX3RocmVzaG9sZCwKKwkJLm1heGxlbgkJPSBzaXplb2Yoc3lzY3RsX2lwX3ZzX3N5bmNfdGhyZXNob2xkKSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvX3N5bmNfdGhyZXNob2xkLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9WU19OQVRfSUNNUF9TRU5ELAorCQkucHJvY25hbWUJPSAibmF0X2ljbXBfc2VuZCIsCisJCS5kYXRhCQk9ICZzeXNjdGxfaXBfdnNfbmF0X2ljbXBfc2VuZCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3N0YXRpYyBjdGxfdGFibGUgdnNfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X1ZTLAorCQkucHJvY25hbWUJPSAidnMiLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gdnNfdmFycworCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3N0YXRpYyBjdGxfdGFibGUgaXB2NF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjQsCisJCS5wcm9jbmFtZQk9ICJpcHY0IiwKKwkJLm1vZGUJCT0gMDU1NSwKKwkJLmNoaWxkCQk9IHZzX3RhYmxlLAorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3N0YXRpYyBjdGxfdGFibGUgdnNfcm9vdF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX05FVCwKKwkJLnByb2NuYW1lCT0gIm5ldCIsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSBpcHY0X3RhYmxlLAorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqIHN5c2N0bF9oZWFkZXI7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCitzdHJ1Y3QgaXBfdnNfaXRlciB7CisJc3RydWN0IGxpc3RfaGVhZCAqdGFibGU7CisJaW50IGJ1Y2tldDsKK307CisKKy8qCisgKglXcml0ZSB0aGUgY29udGVudHMgb2YgdGhlIFZTIHJ1bGUgdGFibGUgdG8gYSBQUk9DZnMgZmlsZS4KKyAqCShJdCBpcyBrZXB0IGp1c3QgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpCisgKi8KK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqaXBfdnNfZndkX25hbWUodW5zaWduZWQgZmxhZ3MpCit7CisJc3dpdGNoIChmbGFncyAmIElQX1ZTX0NPTk5fRl9GV0RfTUFTSykgeworCWNhc2UgSVBfVlNfQ09OTl9GX0xPQ0FMTk9ERToKKwkJcmV0dXJuICJMb2NhbCI7CisJY2FzZSBJUF9WU19DT05OX0ZfVFVOTkVMOgorCQlyZXR1cm4gIlR1bm5lbCI7CisJY2FzZSBJUF9WU19DT05OX0ZfRFJPVVRFOgorCQlyZXR1cm4gIlJvdXRlIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIk1hc3EiOworCX0KK30KKworCisvKiBHZXQgdGhlIE50aCBlbnRyeSBpbiB0aGUgdHdvIGxpc3RzICovCitzdGF0aWMgc3RydWN0IGlwX3ZzX3NlcnZpY2UgKmlwX3ZzX2luZm9fYXJyYXkoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCBwb3MpCit7CisJc3RydWN0IGlwX3ZzX2l0ZXIgKml0ZXIgPSBzZXEtPnByaXZhdGU7CisJaW50IGlkeDsKKwlzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjOworCisJLyogbG9vayBpbiBoYXNoIGJ5IHByb3RvY29sICovCisJZm9yIChpZHggPSAwOyBpZHggPCBJUF9WU19TVkNfVEFCX1NJWkU7IGlkeCsrKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoc3ZjLCAmaXBfdnNfc3ZjX3RhYmxlW2lkeF0sIHNfbGlzdCkgeworCQkJaWYgKHBvcy0tID09IDApeworCQkJCWl0ZXItPnRhYmxlID0gaXBfdnNfc3ZjX3RhYmxlOworCQkJCWl0ZXItPmJ1Y2tldCA9IGlkeDsKKwkJCQlyZXR1cm4gc3ZjOworCQkJfQorCQl9CisJfQorCisJLyoga2VlcCBsb29raW5nIGluIGZ3bWFyayAqLworCWZvciAoaWR4ID0gMDsgaWR4IDwgSVBfVlNfU1ZDX1RBQl9TSVpFOyBpZHgrKykgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN2YywgJmlwX3ZzX3N2Y19md21fdGFibGVbaWR4XSwgZl9saXN0KSB7CisJCQlpZiAocG9zLS0gPT0gMCkgeworCQkJCWl0ZXItPnRhYmxlID0gaXBfdnNfc3ZjX2Z3bV90YWJsZTsKKwkJCQlpdGVyLT5idWNrZXQgPSBpZHg7CisJCQkJcmV0dXJuIHN2YzsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCAqaXBfdnNfaW5mb19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCisJcmVhZF9sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKKwlyZXR1cm4gKnBvcyA/IGlwX3ZzX2luZm9fYXJyYXkoc2VxLCAqcG9zIC0gMSkgOiBTRVFfU1RBUlRfVE9LRU47Cit9CisKKworc3RhdGljIHZvaWQgKmlwX3ZzX2luZm9fc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmU7CisJc3RydWN0IGlwX3ZzX2l0ZXIgKml0ZXI7CisJc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YzsKKworCSsrKnBvczsKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXJldHVybiBpcF92c19pbmZvX2FycmF5KHNlcSwwKTsKKworCXN2YyA9IHY7CisJaXRlciA9IHNlcS0+cHJpdmF0ZTsKKworCWlmIChpdGVyLT50YWJsZSA9PSBpcF92c19zdmNfdGFibGUpIHsKKwkJLyogbmV4dCBzZXJ2aWNlIGluIHRhYmxlIGhhc2hlZCBieSBwcm90b2NvbCAqLworCQlpZiAoKGUgPSBzdmMtPnNfbGlzdC5uZXh0KSAhPSAmaXBfdnNfc3ZjX3RhYmxlW2l0ZXItPmJ1Y2tldF0pCisJCQlyZXR1cm4gbGlzdF9lbnRyeShlLCBzdHJ1Y3QgaXBfdnNfc2VydmljZSwgc19saXN0KTsKKworCisJCXdoaWxlICgrK2l0ZXItPmJ1Y2tldCA8IElQX1ZTX1NWQ19UQUJfU0laRSkgeworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShzdmMsJmlwX3ZzX3N2Y190YWJsZVtpdGVyLT5idWNrZXRdLAorCQkJCQkgICAgc19saXN0KSB7CisJCQkJcmV0dXJuIHN2YzsKKwkJCX0KKwkJfQorCisJCWl0ZXItPnRhYmxlID0gaXBfdnNfc3ZjX2Z3bV90YWJsZTsKKwkJaXRlci0+YnVja2V0ID0gLTE7CisJCWdvdG8gc2Nhbl9md21hcms7CisJfQorCisJLyogbmV4dCBzZXJ2aWNlIGluIGhhc2hlZCBieSBmd21hcmsgKi8KKwlpZiAoKGUgPSBzdmMtPmZfbGlzdC5uZXh0KSAhPSAmaXBfdnNfc3ZjX2Z3bV90YWJsZVtpdGVyLT5idWNrZXRdKQorCQlyZXR1cm4gbGlzdF9lbnRyeShlLCBzdHJ1Y3QgaXBfdnNfc2VydmljZSwgZl9saXN0KTsKKworIHNjYW5fZndtYXJrOgorCXdoaWxlICgrK2l0ZXItPmJ1Y2tldCA8IElQX1ZTX1NWQ19UQUJfU0laRSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN2YywgJmlwX3ZzX3N2Y19md21fdGFibGVbaXRlci0+YnVja2V0XSwKKwkJCQkgICAgZl9saXN0KQorCQkJcmV0dXJuIHN2YzsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgaXBfdnNfaW5mb19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlyZWFkX3VubG9ja19iaCgmX19pcF92c19zdmNfbG9jayk7Cit9CisKKworc3RhdGljIGludCBpcF92c19pbmZvX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlzZXFfcHJpbnRmKHNlcSwKKwkJCSJJUCBWaXJ0dWFsIFNlcnZlciB2ZXJzaW9uICVkLiVkLiVkIChzaXplPSVkKVxuIiwKKwkJCU5WRVJTSU9OKElQX1ZTX1ZFUlNJT05fQ09ERSksIElQX1ZTX0NPTk5fVEFCX1NJWkUpOworCQlzZXFfcHV0cyhzZXEsCisJCQkgIlByb3QgTG9jYWxBZGRyZXNzOlBvcnQgU2NoZWR1bGVyIEZsYWdzXG4iKTsKKwkJc2VxX3B1dHMoc2VxLAorCQkJICIgIC0+IFJlbW90ZUFkZHJlc3M6UG9ydCBGb3J3YXJkIFdlaWdodCBBY3RpdmVDb25uIEluQWN0Q29ublxuIik7CisJfSBlbHNlIHsKKwkJY29uc3Qgc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YyA9IHY7CisJCWNvbnN0IHN0cnVjdCBpcF92c19pdGVyICppdGVyID0gc2VxLT5wcml2YXRlOworCQljb25zdCBzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKKworCQlpZiAoaXRlci0+dGFibGUgPT0gaXBfdnNfc3ZjX3RhYmxlKQorCQkJc2VxX3ByaW50ZihzZXEsICIlcyAgJTA4WDolMDRYICVzICIsCisJCQkJICAgaXBfdnNfcHJvdG9fbmFtZShzdmMtPnByb3RvY29sKSwKKwkJCQkgICBudG9obChzdmMtPmFkZHIpLAorCQkJCSAgIG50b2hzKHN2Yy0+cG9ydCksCisJCQkJICAgc3ZjLT5zY2hlZHVsZXItPm5hbWUpOworCQllbHNlCisJCQlzZXFfcHJpbnRmKHNlcSwgIkZXTSAgJTA4WCAlcyAiLAorCQkJCSAgIHN2Yy0+ZndtYXJrLCBzdmMtPnNjaGVkdWxlci0+bmFtZSk7CisKKwkJaWYgKHN2Yy0+ZmxhZ3MgJiBJUF9WU19TVkNfRl9QRVJTSVNURU5UKQorCQkJc2VxX3ByaW50ZihzZXEsICJwZXJzaXN0ZW50ICVkICUwOFhcbiIsCisJCQkJc3ZjLT50aW1lb3V0LAorCQkJCW50b2hsKHN2Yy0+bmV0bWFzaykpOworCQllbHNlCisJCQlzZXFfcHV0YyhzZXEsICdcbicpOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzdCwgJnN2Yy0+ZGVzdGluYXRpb25zLCBuX2xpc3QpIHsKKwkJCXNlcV9wcmludGYoc2VxLAorCQkJCSAgICIgIC0+ICUwOFg6JTA0WCAgICAgICUtN3MgJS02ZCAlLTEwZCAlLTEwZFxuIiwKKwkJCQkgICBudG9obChkZXN0LT5hZGRyKSwgbnRvaHMoZGVzdC0+cG9ydCksCisJCQkJICAgaXBfdnNfZndkX25hbWUoYXRvbWljX3JlYWQoJmRlc3QtPmNvbm5fZmxhZ3MpKSwKKwkJCQkgICBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KSwKKwkJCQkgICBhdG9taWNfcmVhZCgmZGVzdC0+YWN0aXZlY29ubnMpLAorCQkJCSAgIGF0b21pY19yZWFkKCZkZXN0LT5pbmFjdGNvbm5zKSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaXBfdnNfaW5mb19zZXFfb3BzID0geworCS5zdGFydCA9IGlwX3ZzX2luZm9fc2VxX3N0YXJ0LAorCS5uZXh0ICA9IGlwX3ZzX2luZm9fc2VxX25leHQsCisJLnN0b3AgID0gaXBfdnNfaW5mb19zZXFfc3RvcCwKKwkuc2hvdyAgPSBpcF92c19pbmZvX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBpcF92c19pbmZvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNlcV9maWxlICpzZXE7CisJaW50IHJjID0gLUVOT01FTTsKKwlzdHJ1Y3QgaXBfdnNfaXRlciAqcyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXMpCisJCWdvdG8gb3V0OworCisJcmMgPSBzZXFfb3BlbihmaWxlLCAmaXBfdnNfaW5mb19zZXFfb3BzKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0X2tmcmVlOworCisJc2VxCSAgICAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc2VxLT5wcml2YXRlID0gczsKKwltZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7CitvdXQ6CisJcmV0dXJuIHJjOworb3V0X2tmcmVlOgorCWtmcmVlKHMpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcF92c19pbmZvX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gaXBfdnNfaW5mb19vcGVuLAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZV9wcml2YXRlLAorfTsKKworI2VuZGlmCisKK3N0cnVjdCBpcF92c19zdGF0cyBpcF92c19zdGF0czsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgaW50IGlwX3ZzX3N0YXRzX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisKKy8qICAgICAgICAgICAgICAgMDEyMzQ1NjcgMDEyMzQ1NjcgMDEyMzQ1NjcgMDEyMzQ1NjcwMTIzNDU2NyAwMTIzNDU2NzAxMjM0NTY3ICovCisJc2VxX3B1dHMoc2VxLAorCQkgIiAgIFRvdGFsIEluY29taW5nIE91dGdvaW5nICAgICAgICAgSW5jb21pbmcgICAgICAgICBPdXRnb2luZ1xuIik7CisJc2VxX3ByaW50ZihzZXEsCisJCSAgICIgICBDb25ucyAgUGFja2V0cyAgUGFja2V0cyAgICAgICAgICAgIEJ5dGVzICAgICAgICAgICAgQnl0ZXNcbiIpOworCisJc3Bpbl9sb2NrX2JoKCZpcF92c19zdGF0cy5sb2NrKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiU4WCAlOFggJThYICUxNkxYICUxNkxYXG5cbiIsIGlwX3ZzX3N0YXRzLmNvbm5zLAorCQkgICBpcF92c19zdGF0cy5pbnBrdHMsIGlwX3ZzX3N0YXRzLm91dHBrdHMsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGlwX3ZzX3N0YXRzLmluYnl0ZXMsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGlwX3ZzX3N0YXRzLm91dGJ5dGVzKTsKKworLyogICAgICAgICAgICAgICAgIDAxMjM0NTY3IDAxMjM0NTY3IDAxMjM0NTY3IDAxMjM0NTY3MDEyMzQ1NjcgMDEyMzQ1NjcwMTIzNDU2NyAqLworCXNlcV9wdXRzKHNlcSwKKwkJICAgIiBDb25ucy9zICAgUGt0cy9zICAgUGt0cy9zICAgICAgICAgIEJ5dGVzL3MgICAgICAgICAgQnl0ZXMvc1xuIik7CisJc2VxX3ByaW50ZihzZXEsIiU4WCAlOFggJThYICUxNlggJTE2WFxuIiwKKwkJCWlwX3ZzX3N0YXRzLmNwcywKKwkJCWlwX3ZzX3N0YXRzLmlucHBzLAorCQkJaXBfdnNfc3RhdHMub3V0cHBzLAorCQkJaXBfdnNfc3RhdHMuaW5icHMsCisJCQlpcF92c19zdGF0cy5vdXRicHMpOworCXNwaW5fdW5sb2NrX2JoKCZpcF92c19zdGF0cy5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwX3ZzX3N0YXRzX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBpcF92c19zdGF0c19zaG93LCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXBfdnNfc3RhdHNfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IGlwX3ZzX3N0YXRzX3NlcV9vcGVuLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworI2VuZGlmCisKKy8qCisgKglTZXQgdGltZW91dCB2YWx1ZXMgZm9yIHRjcCB0Y3BmaW4gdWRwIGluIHRoZSB0aW1lb3V0X3RhYmxlLgorICovCitzdGF0aWMgaW50IGlwX3ZzX3NldF90aW1lb3V0KHN0cnVjdCBpcF92c190aW1lb3V0X3VzZXIgKnUpCit7CisJSVBfVlNfREJHKDIsICJTZXR0aW5nIHRpbWVvdXQgdGNwOiVkIHRjcGZpbjolZCB1ZHA6JWRcbiIsCisJCSAgdS0+dGNwX3RpbWVvdXQsCisJCSAgdS0+dGNwX2Zpbl90aW1lb3V0LAorCQkgIHUtPnVkcF90aW1lb3V0KTsKKworI2lmZGVmIENPTkZJR19JUF9WU19QUk9UT19UQ1AKKwlpZiAodS0+dGNwX3RpbWVvdXQpIHsKKwkJaXBfdnNfcHJvdG9jb2xfdGNwLnRpbWVvdXRfdGFibGVbSVBfVlNfVENQX1NfRVNUQUJMSVNIRURdCisJCQk9IHUtPnRjcF90aW1lb3V0ICogSFo7CisJfQorCisJaWYgKHUtPnRjcF9maW5fdGltZW91dCkgeworCQlpcF92c19wcm90b2NvbF90Y3AudGltZW91dF90YWJsZVtJUF9WU19UQ1BfU19GSU5fV0FJVF0KKwkJCT0gdS0+dGNwX2Zpbl90aW1lb3V0ICogSFo7CisJfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfSVBfVlNfUFJPVE9fVURQCisJaWYgKHUtPnVkcF90aW1lb3V0KSB7CisJCWlwX3ZzX3Byb3RvY29sX3VkcC50aW1lb3V0X3RhYmxlW0lQX1ZTX1VEUF9TX05PUk1BTF0KKwkJCT0gdS0+dWRwX3RpbWVvdXQgKiBIWjsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworCisjZGVmaW5lIFNFVF9DTURJRChjbWQpCQkoY21kIC0gSVBfVlNfQkFTRV9DVEwpCisjZGVmaW5lIFNFUlZJQ0VfQVJHX0xFTgkJKHNpemVvZihzdHJ1Y3QgaXBfdnNfc2VydmljZV91c2VyKSkKKyNkZWZpbmUgU1ZDREVTVF9BUkdfTEVOCQkoc2l6ZW9mKHN0cnVjdCBpcF92c19zZXJ2aWNlX3VzZXIpICsJXAorCQkJCSBzaXplb2Yoc3RydWN0IGlwX3ZzX2Rlc3RfdXNlcikpCisjZGVmaW5lIFRJTUVPVVRfQVJHX0xFTgkJKHNpemVvZihzdHJ1Y3QgaXBfdnNfdGltZW91dF91c2VyKSkKKyNkZWZpbmUgREFFTU9OX0FSR19MRU4JCShzaXplb2Yoc3RydWN0IGlwX3ZzX2RhZW1vbl91c2VyKSkKKyNkZWZpbmUgTUFYX0FSR19MRU4JCVNWQ0RFU1RfQVJHX0xFTgorCitzdGF0aWMgdW5zaWduZWQgY2hhciBzZXRfYXJnbGVuW1NFVF9DTURJRChJUF9WU19TT19TRVRfTUFYKSsxXSA9IHsKKwlbU0VUX0NNRElEKElQX1ZTX1NPX1NFVF9BREQpXQkJPSBTRVJWSUNFX0FSR19MRU4sCisJW1NFVF9DTURJRChJUF9WU19TT19TRVRfRURJVCldCQk9IFNFUlZJQ0VfQVJHX0xFTiwKKwlbU0VUX0NNRElEKElQX1ZTX1NPX1NFVF9ERUwpXQkJPSBTRVJWSUNFX0FSR19MRU4sCisJW1NFVF9DTURJRChJUF9WU19TT19TRVRfRkxVU0gpXQkJPSAwLAorCVtTRVRfQ01ESUQoSVBfVlNfU09fU0VUX0FERERFU1QpXQk9IFNWQ0RFU1RfQVJHX0xFTiwKKwlbU0VUX0NNRElEKElQX1ZTX1NPX1NFVF9ERUxERVNUKV0JPSBTVkNERVNUX0FSR19MRU4sCisJW1NFVF9DTURJRChJUF9WU19TT19TRVRfRURJVERFU1QpXQk9IFNWQ0RFU1RfQVJHX0xFTiwKKwlbU0VUX0NNRElEKElQX1ZTX1NPX1NFVF9USU1FT1VUKV0JPSBUSU1FT1VUX0FSR19MRU4sCisJW1NFVF9DTURJRChJUF9WU19TT19TRVRfU1RBUlREQUVNT04pXQk9IERBRU1PTl9BUkdfTEVOLAorCVtTRVRfQ01ESUQoSVBfVlNfU09fU0VUX1NUT1BEQUVNT04pXQk9IERBRU1PTl9BUkdfTEVOLAorCVtTRVRfQ01ESUQoSVBfVlNfU09fU0VUX1pFUk8pXQkJPSBTRVJWSUNFX0FSR19MRU4sCit9OworCitzdGF0aWMgaW50Citkb19pcF92c19zZXRfY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgdm9pZCBfX3VzZXIgKnVzZXIsIHVuc2lnbmVkIGludCBsZW4pCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBjaGFyIGFyZ1tNQVhfQVJHX0xFTl07CisJc3RydWN0IGlwX3ZzX3NlcnZpY2VfdXNlciAqdXN2YzsKKwlzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjOworCXN0cnVjdCBpcF92c19kZXN0X3VzZXIgKnVkZXN0OworCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKGxlbiAhPSBzZXRfYXJnbGVuW1NFVF9DTURJRChjbWQpXSkgeworCQlJUF9WU19FUlIoInNldF9jdGw6IGxlbiAldSAhPSAldVxuIiwKKwkJCSAgbGVuLCBzZXRfYXJnbGVuW1NFVF9DTURJRChjbWQpXSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcihhcmcsIHVzZXIsIGxlbikgIT0gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBpbmNyZWFzZSB0aGUgbW9kdWxlIHVzZSBjb3VudCAqLworCWlwX3ZzX3VzZV9jb3VudF9pbmMoKTsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJl9faXBfdnNfbXV0ZXgpKSB7CisJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJZ290byBvdXRfZGVjOworCX0KKworCWlmIChjbWQgPT0gSVBfVlNfU09fU0VUX0ZMVVNIKSB7CisJCS8qIEZsdXNoIHRoZSB2aXJ0dWFsIHNlcnZpY2UgKi8KKwkJcmV0ID0gaXBfdnNfZmx1c2goKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0gZWxzZSBpZiAoY21kID09IElQX1ZTX1NPX1NFVF9USU1FT1VUKSB7CisJCS8qIFNldCB0aW1lb3V0IHZhbHVlcyBmb3IgKHRjcCB0Y3BmaW4gdWRwKSAqLworCQlyZXQgPSBpcF92c19zZXRfdGltZW91dCgoc3RydWN0IGlwX3ZzX3RpbWVvdXRfdXNlciAqKWFyZyk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9IGVsc2UgaWYgKGNtZCA9PSBJUF9WU19TT19TRVRfU1RBUlREQUVNT04pIHsKKwkJc3RydWN0IGlwX3ZzX2RhZW1vbl91c2VyICpkbSA9IChzdHJ1Y3QgaXBfdnNfZGFlbW9uX3VzZXIgKilhcmc7CisJCXJldCA9IHN0YXJ0X3N5bmNfdGhyZWFkKGRtLT5zdGF0ZSwgZG0tPm1jYXN0X2lmbiwgZG0tPnN5bmNpZCk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9IGVsc2UgaWYgKGNtZCA9PSBJUF9WU19TT19TRVRfU1RPUERBRU1PTikgeworCQlzdHJ1Y3QgaXBfdnNfZGFlbW9uX3VzZXIgKmRtID0gKHN0cnVjdCBpcF92c19kYWVtb25fdXNlciAqKWFyZzsKKwkJcmV0ID0gc3RvcF9zeW5jX3RocmVhZChkbS0+c3RhdGUpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJdXN2YyA9IChzdHJ1Y3QgaXBfdnNfc2VydmljZV91c2VyICopYXJnOworCXVkZXN0ID0gKHN0cnVjdCBpcF92c19kZXN0X3VzZXIgKikodXN2YyArIDEpOworCisJaWYgKGNtZCA9PSBJUF9WU19TT19TRVRfWkVSTykgeworCQkvKiBpZiBubyBzZXJ2aWNlIGFkZHJlc3MgaXMgc2V0LCB6ZXJvIGNvdW50ZXJzIGluIGFsbCAqLworCQlpZiAoIXVzdmMtPmZ3bWFyayAmJiAhdXN2Yy0+YWRkciAmJiAhdXN2Yy0+cG9ydCkgeworCQkJcmV0ID0gaXBfdnNfemVyb19hbGwoKTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCX0KKworCS8qIENoZWNrIGZvciB2YWxpZCBwcm90b2NvbDogVENQIG9yIFVEUCwgZXZlbiBmb3IgZndtYXJrIT0wICovCisJaWYgKHVzdmMtPnByb3RvY29sIT1JUFBST1RPX1RDUCAmJiB1c3ZjLT5wcm90b2NvbCE9SVBQUk9UT19VRFApIHsKKwkJSVBfVlNfRVJSKCJzZXRfY3RsOiBpbnZhbGlkIHByb3RvY29sOiAlZCAlZC4lZC4lZC4lZDolZCAlc1xuIiwKKwkJCSAgdXN2Yy0+cHJvdG9jb2wsIE5JUFFVQUQodXN2Yy0+YWRkciksCisJCQkgIG50b2hzKHVzdmMtPnBvcnQpLCB1c3ZjLT5zY2hlZF9uYW1lKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCS8qIExvb2t1cCB0aGUgZXhhY3Qgc2VydmljZSBieSA8cHJvdG9jb2wsIGFkZHIsIHBvcnQ+IG9yIGZ3bWFyayAqLworCWlmICh1c3ZjLT5md21hcmsgPT0gMCkKKwkJc3ZjID0gX19pcF92c19zZXJ2aWNlX2dldCh1c3ZjLT5wcm90b2NvbCwKKwkJCQkJICB1c3ZjLT5hZGRyLCB1c3ZjLT5wb3J0KTsKKwllbHNlCisJCXN2YyA9IF9faXBfdnNfc3ZjX2Z3bV9nZXQodXN2Yy0+ZndtYXJrKTsKKworCWlmIChjbWQgIT0gSVBfVlNfU09fU0VUX0FERAorCSAgICAmJiAoc3ZjID09IE5VTEwgfHwgc3ZjLT5wcm90b2NvbCAhPSB1c3ZjLT5wcm90b2NvbCkpIHsKKwkJcmV0ID0gLUVTUkNIOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIElQX1ZTX1NPX1NFVF9BREQ6CisJCWlmIChzdmMgIT0gTlVMTCkKKwkJCXJldCA9IC1FRVhJU1Q7CisJCWVsc2UKKwkJCXJldCA9IGlwX3ZzX2FkZF9zZXJ2aWNlKHVzdmMsICZzdmMpOworCQlicmVhazsKKwljYXNlIElQX1ZTX1NPX1NFVF9FRElUOgorCQlyZXQgPSBpcF92c19lZGl0X3NlcnZpY2Uoc3ZjLCB1c3ZjKTsKKwkJYnJlYWs7CisJY2FzZSBJUF9WU19TT19TRVRfREVMOgorCQlyZXQgPSBpcF92c19kZWxfc2VydmljZShzdmMpOworCQlpZiAoIXJldCkKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJYnJlYWs7CisJY2FzZSBJUF9WU19TT19TRVRfWkVSTzoKKwkJcmV0ID0gaXBfdnNfemVyb19zZXJ2aWNlKHN2Yyk7CisJCWJyZWFrOworCWNhc2UgSVBfVlNfU09fU0VUX0FERERFU1Q6CisJCXJldCA9IGlwX3ZzX2FkZF9kZXN0KHN2YywgdWRlc3QpOworCQlicmVhazsKKwljYXNlIElQX1ZTX1NPX1NFVF9FRElUREVTVDoKKwkJcmV0ID0gaXBfdnNfZWRpdF9kZXN0KHN2YywgdWRlc3QpOworCQlicmVhazsKKwljYXNlIElQX1ZTX1NPX1NFVF9ERUxERVNUOgorCQlyZXQgPSBpcF92c19kZWxfZGVzdChzdmMsIHVkZXN0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlpZiAoc3ZjKQorCQlpcF92c19zZXJ2aWNlX3B1dChzdmMpOworCisgIG91dF91bmxvY2s6CisJdXAoJl9faXBfdnNfbXV0ZXgpOworICBvdXRfZGVjOgorCS8qIGRlY3JlYXNlIHRoZSBtb2R1bGUgdXNlIGNvdW50ICovCisJaXBfdnNfdXNlX2NvdW50X2RlYygpOworCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgdm9pZAoraXBfdnNfY29weV9zdGF0cyhzdHJ1Y3QgaXBfdnNfc3RhdHNfdXNlciAqZHN0LCBzdHJ1Y3QgaXBfdnNfc3RhdHMgKnNyYykKK3sKKwlzcGluX2xvY2tfYmgoJnNyYy0+bG9jayk7CisJbWVtY3B5KGRzdCwgc3JjLCAoY2hhciopJnNyYy0+bG9jayAtIChjaGFyKilzcmMpOworCXNwaW5fdW5sb2NrX2JoKCZzcmMtPmxvY2spOworfQorCitzdGF0aWMgdm9pZAoraXBfdnNfY29weV9zZXJ2aWNlKHN0cnVjdCBpcF92c19zZXJ2aWNlX2VudHJ5ICpkc3QsIHN0cnVjdCBpcF92c19zZXJ2aWNlICpzcmMpCit7CisJZHN0LT5wcm90b2NvbCA9IHNyYy0+cHJvdG9jb2w7CisJZHN0LT5hZGRyID0gc3JjLT5hZGRyOworCWRzdC0+cG9ydCA9IHNyYy0+cG9ydDsKKwlkc3QtPmZ3bWFyayA9IHNyYy0+ZndtYXJrOworCXN0cmNweShkc3QtPnNjaGVkX25hbWUsIHNyYy0+c2NoZWR1bGVyLT5uYW1lKTsKKwlkc3QtPmZsYWdzID0gc3JjLT5mbGFnczsKKwlkc3QtPnRpbWVvdXQgPSBzcmMtPnRpbWVvdXQgLyBIWjsKKwlkc3QtPm5ldG1hc2sgPSBzcmMtPm5ldG1hc2s7CisJZHN0LT5udW1fZGVzdHMgPSBzcmMtPm51bV9kZXN0czsKKwlpcF92c19jb3B5X3N0YXRzKCZkc3QtPnN0YXRzLCAmc3JjLT5zdGF0cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2lwX3ZzX2dldF9zZXJ2aWNlX2VudHJpZXMoY29uc3Qgc3RydWN0IGlwX3ZzX2dldF9zZXJ2aWNlcyAqZ2V0LAorCQkJICAgIHN0cnVjdCBpcF92c19nZXRfc2VydmljZXMgX191c2VyICp1cHRyKQoreworCWludCBpZHgsIGNvdW50PTA7CisJc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YzsKKwlzdHJ1Y3QgaXBfdnNfc2VydmljZV9lbnRyeSBlbnRyeTsKKwlpbnQgcmV0ID0gMDsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgSVBfVlNfU1ZDX1RBQl9TSVpFOyBpZHgrKykgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN2YywgJmlwX3ZzX3N2Y190YWJsZVtpZHhdLCBzX2xpc3QpIHsKKwkJCWlmIChjb3VudCA+PSBnZXQtPm51bV9zZXJ2aWNlcykKKwkJCQlnb3RvIG91dDsKKwkJCWlwX3ZzX2NvcHlfc2VydmljZSgmZW50cnksIHN2Yyk7CisJCQlpZiAoY29weV90b191c2VyKCZ1cHRyLT5lbnRyeXRhYmxlW2NvdW50XSwKKwkJCQkJICZlbnRyeSwgc2l6ZW9mKGVudHJ5KSkpIHsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJY291bnQrKzsKKwkJfQorCX0KKworCWZvciAoaWR4ID0gMDsgaWR4IDwgSVBfVlNfU1ZDX1RBQl9TSVpFOyBpZHgrKykgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN2YywgJmlwX3ZzX3N2Y19md21fdGFibGVbaWR4XSwgZl9saXN0KSB7CisJCQlpZiAoY291bnQgPj0gZ2V0LT5udW1fc2VydmljZXMpCisJCQkJZ290byBvdXQ7CisJCQlpcF92c19jb3B5X3NlcnZpY2UoJmVudHJ5LCBzdmMpOworCQkJaWYgKGNvcHlfdG9fdXNlcigmdXB0ci0+ZW50cnl0YWJsZVtjb3VudF0sCisJCQkJCSAmZW50cnksIHNpemVvZihlbnRyeSkpKSB7CisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWNvdW50Kys7CisJCX0KKwl9CisgIG91dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludAorX19pcF92c19nZXRfZGVzdF9lbnRyaWVzKGNvbnN0IHN0cnVjdCBpcF92c19nZXRfZGVzdHMgKmdldCwKKwkJCSBzdHJ1Y3QgaXBfdnNfZ2V0X2Rlc3RzIF9fdXNlciAqdXB0cikKK3sKKwlzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjOworCWludCByZXQgPSAwOworCisJaWYgKGdldC0+ZndtYXJrKQorCQlzdmMgPSBfX2lwX3ZzX3N2Y19md21fZ2V0KGdldC0+ZndtYXJrKTsKKwllbHNlCisJCXN2YyA9IF9faXBfdnNfc2VydmljZV9nZXQoZ2V0LT5wcm90b2NvbCwKKwkJCQkJICBnZXQtPmFkZHIsIGdldC0+cG9ydCk7CisJaWYgKHN2YykgeworCQlpbnQgY291bnQgPSAwOworCQlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKKwkJc3RydWN0IGlwX3ZzX2Rlc3RfZW50cnkgZW50cnk7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXN0LCAmc3ZjLT5kZXN0aW5hdGlvbnMsIG5fbGlzdCkgeworCQkJaWYgKGNvdW50ID49IGdldC0+bnVtX2Rlc3RzKQorCQkJCWJyZWFrOworCisJCQllbnRyeS5hZGRyID0gZGVzdC0+YWRkcjsKKwkJCWVudHJ5LnBvcnQgPSBkZXN0LT5wb3J0OworCQkJZW50cnkuY29ubl9mbGFncyA9IGF0b21pY19yZWFkKCZkZXN0LT5jb25uX2ZsYWdzKTsKKwkJCWVudHJ5LndlaWdodCA9IGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpOworCQkJZW50cnkudV90aHJlc2hvbGQgPSBkZXN0LT51X3RocmVzaG9sZDsKKwkJCWVudHJ5LmxfdGhyZXNob2xkID0gZGVzdC0+bF90aHJlc2hvbGQ7CisJCQllbnRyeS5hY3RpdmVjb25ucyA9IGF0b21pY19yZWFkKCZkZXN0LT5hY3RpdmVjb25ucyk7CisJCQllbnRyeS5pbmFjdGNvbm5zID0gYXRvbWljX3JlYWQoJmRlc3QtPmluYWN0Y29ubnMpOworCQkJZW50cnkucGVyc2lzdGNvbm5zID0gYXRvbWljX3JlYWQoJmRlc3QtPnBlcnNpc3Rjb25ucyk7CisJCQlpcF92c19jb3B5X3N0YXRzKCZlbnRyeS5zdGF0cywgJmRlc3QtPnN0YXRzKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoJnVwdHItPmVudHJ5dGFibGVbY291bnRdLAorCQkJCQkgJmVudHJ5LCBzaXplb2YoZW50cnkpKSkgeworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb3VudCsrOworCQl9CisJCWlwX3ZzX3NlcnZpY2VfcHV0KHN2Yyk7CisJfSBlbHNlCisJCXJldCA9IC1FU1JDSDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19faXBfdnNfZ2V0X3RpbWVvdXRzKHN0cnVjdCBpcF92c190aW1lb3V0X3VzZXIgKnUpCit7CisjaWZkZWYgQ09ORklHX0lQX1ZTX1BST1RPX1RDUAorCXUtPnRjcF90aW1lb3V0ID0KKwkJaXBfdnNfcHJvdG9jb2xfdGNwLnRpbWVvdXRfdGFibGVbSVBfVlNfVENQX1NfRVNUQUJMSVNIRURdIC8gSFo7CisJdS0+dGNwX2Zpbl90aW1lb3V0ID0KKwkJaXBfdnNfcHJvdG9jb2xfdGNwLnRpbWVvdXRfdGFibGVbSVBfVlNfVENQX1NfRklOX1dBSVRdIC8gSFo7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSVBfVlNfUFJPVE9fVURQCisJdS0+dWRwX3RpbWVvdXQgPQorCQlpcF92c19wcm90b2NvbF91ZHAudGltZW91dF90YWJsZVtJUF9WU19VRFBfU19OT1JNQUxdIC8gSFo7CisjZW5kaWYKK30KKworCisjZGVmaW5lIEdFVF9DTURJRChjbWQpCQkoY21kIC0gSVBfVlNfQkFTRV9DVEwpCisjZGVmaW5lIEdFVF9JTkZPX0FSR19MRU4JKHNpemVvZihzdHJ1Y3QgaXBfdnNfZ2V0aW5mbykpCisjZGVmaW5lIEdFVF9TRVJWSUNFU19BUkdfTEVOCShzaXplb2Yoc3RydWN0IGlwX3ZzX2dldF9zZXJ2aWNlcykpCisjZGVmaW5lIEdFVF9TRVJWSUNFX0FSR19MRU4JKHNpemVvZihzdHJ1Y3QgaXBfdnNfc2VydmljZV9lbnRyeSkpCisjZGVmaW5lIEdFVF9ERVNUU19BUkdfTEVOCShzaXplb2Yoc3RydWN0IGlwX3ZzX2dldF9kZXN0cykpCisjZGVmaW5lIEdFVF9USU1FT1VUX0FSR19MRU4JKHNpemVvZihzdHJ1Y3QgaXBfdnNfdGltZW91dF91c2VyKSkKKyNkZWZpbmUgR0VUX0RBRU1PTl9BUkdfTEVOCShzaXplb2Yoc3RydWN0IGlwX3ZzX2RhZW1vbl91c2VyKSAqIDIpCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGdldF9hcmdsZW5bR0VUX0NNRElEKElQX1ZTX1NPX0dFVF9NQVgpKzFdID0geworCVtHRVRfQ01ESUQoSVBfVlNfU09fR0VUX1ZFUlNJT04pXQk9IDY0LAorCVtHRVRfQ01ESUQoSVBfVlNfU09fR0VUX0lORk8pXQkJPSBHRVRfSU5GT19BUkdfTEVOLAorCVtHRVRfQ01ESUQoSVBfVlNfU09fR0VUX1NFUlZJQ0VTKV0JPSBHRVRfU0VSVklDRVNfQVJHX0xFTiwKKwlbR0VUX0NNRElEKElQX1ZTX1NPX0dFVF9TRVJWSUNFKV0JPSBHRVRfU0VSVklDRV9BUkdfTEVOLAorCVtHRVRfQ01ESUQoSVBfVlNfU09fR0VUX0RFU1RTKV0JCT0gR0VUX0RFU1RTX0FSR19MRU4sCisJW0dFVF9DTURJRChJUF9WU19TT19HRVRfVElNRU9VVCldCT0gR0VUX1RJTUVPVVRfQVJHX0xFTiwKKwlbR0VUX0NNRElEKElQX1ZTX1NPX0dFVF9EQUVNT04pXQk9IEdFVF9EQUVNT05fQVJHX0xFTiwKK307CisKK3N0YXRpYyBpbnQKK2RvX2lwX3ZzX2dldF9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCB2b2lkIF9fdXNlciAqdXNlciwgaW50ICpsZW4pCit7CisJdW5zaWduZWQgY2hhciBhcmdbMTI4XTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmICgqbGVuIDwgZ2V0X2FyZ2xlbltHRVRfQ01ESUQoY21kKV0pIHsKKwkJSVBfVlNfRVJSKCJnZXRfY3RsOiBsZW4gJXUgPCAldVxuIiwKKwkJCSAgKmxlbiwgZ2V0X2FyZ2xlbltHRVRfQ01ESUQoY21kKV0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYXJnLCB1c2VyLCBnZXRfYXJnbGVuW0dFVF9DTURJRChjbWQpXSkgIT0gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZfX2lwX3ZzX211dGV4KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBJUF9WU19TT19HRVRfVkVSU0lPTjoKKwl7CisJCWNoYXIgYnVmWzY0XTsKKworCQlzcHJpbnRmKGJ1ZiwgIklQIFZpcnR1YWwgU2VydmVyIHZlcnNpb24gJWQuJWQuJWQgKHNpemU9JWQpIiwKKwkJCU5WRVJTSU9OKElQX1ZTX1ZFUlNJT05fQ09ERSksIElQX1ZTX0NPTk5fVEFCX1NJWkUpOworCQlpZiAoY29weV90b191c2VyKHVzZXIsIGJ1Ziwgc3RybGVuKGJ1ZikrMSkgIT0gMCkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJCSpsZW4gPSBzdHJsZW4oYnVmKSsxOworCX0KKwlicmVhazsKKworCWNhc2UgSVBfVlNfU09fR0VUX0lORk86CisJeworCQlzdHJ1Y3QgaXBfdnNfZ2V0aW5mbyBpbmZvOworCQlpbmZvLnZlcnNpb24gPSBJUF9WU19WRVJTSU9OX0NPREU7CisJCWluZm8uc2l6ZSA9IElQX1ZTX0NPTk5fVEFCX1NJWkU7CisJCWluZm8ubnVtX3NlcnZpY2VzID0gaXBfdnNfbnVtX3NlcnZpY2VzOworCQlpZiAoY29weV90b191c2VyKHVzZXIsICZpbmZvLCBzaXplb2YoaW5mbykpICE9IDApCisJCQlyZXQgPSAtRUZBVUxUOworCX0KKwlicmVhazsKKworCWNhc2UgSVBfVlNfU09fR0VUX1NFUlZJQ0VTOgorCXsKKwkJc3RydWN0IGlwX3ZzX2dldF9zZXJ2aWNlcyAqZ2V0OworCQlpbnQgc2l6ZTsKKworCQlnZXQgPSAoc3RydWN0IGlwX3ZzX2dldF9zZXJ2aWNlcyAqKWFyZzsKKwkJc2l6ZSA9IHNpemVvZigqZ2V0KSArCisJCQlzaXplb2Yoc3RydWN0IGlwX3ZzX3NlcnZpY2VfZW50cnkpICogZ2V0LT5udW1fc2VydmljZXM7CisJCWlmICgqbGVuICE9IHNpemUpIHsKKwkJCUlQX1ZTX0VSUigibGVuZ3RoOiAldSAhPSAldVxuIiwgKmxlbiwgc2l6ZSk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmV0ID0gX19pcF92c19nZXRfc2VydmljZV9lbnRyaWVzKGdldCwgdXNlcik7CisJfQorCWJyZWFrOworCisJY2FzZSBJUF9WU19TT19HRVRfU0VSVklDRToKKwl7CisJCXN0cnVjdCBpcF92c19zZXJ2aWNlX2VudHJ5ICplbnRyeTsKKwkJc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YzsKKworCQllbnRyeSA9IChzdHJ1Y3QgaXBfdnNfc2VydmljZV9lbnRyeSAqKWFyZzsKKwkJaWYgKGVudHJ5LT5md21hcmspCisJCQlzdmMgPSBfX2lwX3ZzX3N2Y19md21fZ2V0KGVudHJ5LT5md21hcmspOworCQllbHNlCisJCQlzdmMgPSBfX2lwX3ZzX3NlcnZpY2VfZ2V0KGVudHJ5LT5wcm90b2NvbCwKKwkJCQkJCSAgZW50cnktPmFkZHIsIGVudHJ5LT5wb3J0KTsKKwkJaWYgKHN2YykgeworCQkJaXBfdnNfY29weV9zZXJ2aWNlKGVudHJ5LCBzdmMpOworCQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyLCBlbnRyeSwgc2l6ZW9mKCplbnRyeSkpICE9IDApCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWlwX3ZzX3NlcnZpY2VfcHV0KHN2Yyk7CisJCX0gZWxzZQorCQkJcmV0ID0gLUVTUkNIOworCX0KKwlicmVhazsKKworCWNhc2UgSVBfVlNfU09fR0VUX0RFU1RTOgorCXsKKwkJc3RydWN0IGlwX3ZzX2dldF9kZXN0cyAqZ2V0OworCQlpbnQgc2l6ZTsKKworCQlnZXQgPSAoc3RydWN0IGlwX3ZzX2dldF9kZXN0cyAqKWFyZzsKKwkJc2l6ZSA9IHNpemVvZigqZ2V0KSArCisJCQlzaXplb2Yoc3RydWN0IGlwX3ZzX2Rlc3RfZW50cnkpICogZ2V0LT5udW1fZGVzdHM7CisJCWlmICgqbGVuICE9IHNpemUpIHsKKwkJCUlQX1ZTX0VSUigibGVuZ3RoOiAldSAhPSAldVxuIiwgKmxlbiwgc2l6ZSk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmV0ID0gX19pcF92c19nZXRfZGVzdF9lbnRyaWVzKGdldCwgdXNlcik7CisJfQorCWJyZWFrOworCisJY2FzZSBJUF9WU19TT19HRVRfVElNRU9VVDoKKwl7CisJCXN0cnVjdCBpcF92c190aW1lb3V0X3VzZXIgdDsKKworCQlfX2lwX3ZzX2dldF90aW1lb3V0cygmdCk7CisJCWlmIChjb3B5X3RvX3VzZXIodXNlciwgJnQsIHNpemVvZih0KSkgIT0gMCkKKwkJCXJldCA9IC1FRkFVTFQ7CisJfQorCWJyZWFrOworCisJY2FzZSBJUF9WU19TT19HRVRfREFFTU9OOgorCXsKKwkJc3RydWN0IGlwX3ZzX2RhZW1vbl91c2VyIGRbMl07CisKKwkJbWVtc2V0KCZkLCAwLCBzaXplb2YoZCkpOworCQlpZiAoaXBfdnNfc3luY19zdGF0ZSAmIElQX1ZTX1NUQVRFX01BU1RFUikgeworCQkJZFswXS5zdGF0ZSA9IElQX1ZTX1NUQVRFX01BU1RFUjsKKwkJCXN0cmNweShkWzBdLm1jYXN0X2lmbiwgaXBfdnNfbWFzdGVyX21jYXN0X2lmbik7CisJCQlkWzBdLnN5bmNpZCA9IGlwX3ZzX21hc3Rlcl9zeW5jaWQ7CisJCX0KKwkJaWYgKGlwX3ZzX3N5bmNfc3RhdGUgJiBJUF9WU19TVEFURV9CQUNLVVApIHsKKwkJCWRbMV0uc3RhdGUgPSBJUF9WU19TVEFURV9CQUNLVVA7CisJCQlzdHJjcHkoZFsxXS5tY2FzdF9pZm4sIGlwX3ZzX2JhY2t1cF9tY2FzdF9pZm4pOworCQkJZFsxXS5zeW5jaWQgPSBpcF92c19iYWNrdXBfc3luY2lkOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIodXNlciwgJmQsIHNpemVvZihkKSkgIT0gMCkKKwkJCXJldCA9IC1FRkFVTFQ7CisJfQorCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKyAgb3V0OgorCXVwKCZfX2lwX3ZzX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbmZfc29ja29wdF9vcHMgaXBfdnNfc29ja29wdHMgPSB7CisJLnBmCQk9IFBGX0lORVQsCisJLnNldF9vcHRtaW4JPSBJUF9WU19CQVNFX0NUTCwKKwkuc2V0X29wdG1heAk9IElQX1ZTX1NPX1NFVF9NQVgrMSwKKwkuc2V0CQk9IGRvX2lwX3ZzX3NldF9jdGwsCisJLmdldF9vcHRtaW4JPSBJUF9WU19CQVNFX0NUTCwKKwkuZ2V0X29wdG1heAk9IElQX1ZTX1NPX0dFVF9NQVgrMSwKKwkuZ2V0CQk9IGRvX2lwX3ZzX2dldF9jdGwsCit9OworCisKK2ludCBpcF92c19jb250cm9sX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCWludCBpZHg7CisKKwlFbnRlckZ1bmN0aW9uKDIpOworCisJcmV0ID0gbmZfcmVnaXN0ZXJfc29ja29wdCgmaXBfdnNfc29ja29wdHMpOworCWlmIChyZXQpIHsKKwkJSVBfVlNfRVJSKCJjYW5ub3QgcmVnaXN0ZXIgc29ja29wdC5cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJpcF92cyIsIDAsICZpcF92c19pbmZvX2ZvcHMpOworCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJpcF92c19zdGF0cyIsMCwgJmlwX3ZzX3N0YXRzX2ZvcHMpOworCisJc3lzY3RsX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZSh2c19yb290X3RhYmxlLCAwKTsKKworCS8qIEluaXRpYWxpemUgaXBfdnNfc3ZjX3RhYmxlLCBpcF92c19zdmNfZndtX3RhYmxlLCBpcF92c19ydGFibGUgKi8KKwlmb3IoaWR4ID0gMDsgaWR4IDwgSVBfVlNfU1ZDX1RBQl9TSVpFOyBpZHgrKykgIHsKKwkJSU5JVF9MSVNUX0hFQUQoJmlwX3ZzX3N2Y190YWJsZVtpZHhdKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmlwX3ZzX3N2Y19md21fdGFibGVbaWR4XSk7CisJfQorCWZvcihpZHggPSAwOyBpZHggPCBJUF9WU19SVEFCX1NJWkU7IGlkeCsrKSAgeworCQlJTklUX0xJU1RfSEVBRCgmaXBfdnNfcnRhYmxlW2lkeF0pOworCX0KKworCW1lbXNldCgmaXBfdnNfc3RhdHMsIDAsIHNpemVvZihpcF92c19zdGF0cykpOworCXNwaW5fbG9ja19pbml0KCZpcF92c19zdGF0cy5sb2NrKTsKKwlpcF92c19uZXdfZXN0aW1hdG9yKCZpcF92c19zdGF0cyk7CisKKwkvKiBIb29rIHRoZSBkZWZlbnNlIHRpbWVyICovCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkZWZlbnNlX3dvcmssIERFRkVOU0VfVElNRVJfUEVSSU9EKTsKKworCUxlYXZlRnVuY3Rpb24oMik7CisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBpcF92c19jb250cm9sX2NsZWFudXAodm9pZCkKK3sKKwlFbnRlckZ1bmN0aW9uKDIpOworCWlwX3ZzX3RyYXNoX2NsZWFudXAoKTsKKwljYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrKCZkZWZlbnNlX3dvcmspOworCWlwX3ZzX2tpbGxfZXN0aW1hdG9yKCZpcF92c19zdGF0cyk7CisJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoc3lzY3RsX2hlYWRlcik7CisJcHJvY19uZXRfcmVtb3ZlKCJpcF92c19zdGF0cyIpOworCXByb2NfbmV0X3JlbW92ZSgiaXBfdnMiKTsKKwluZl91bnJlZ2lzdGVyX3NvY2tvcHQoJmlwX3ZzX3NvY2tvcHRzKTsKKwlMZWF2ZUZ1bmN0aW9uKDIpOworfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19kaC5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19kaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYmMzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2RoLmMKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKiBJUFZTOiAgICAgICAgRGVzdGluYXRpb24gSGFzaGluZyBzY2hlZHVsaW5nIG1vZHVsZQorICoKKyAqIFZlcnNpb246ICAgICAkSWQ6IGlwX3ZzX2RoLmMsdiAxLjUgMjAwMi8wOS8xNSAwODoxNDowOCB3ZW5zb25nIEV4cCAkCisgKgorICogQXV0aG9yczogICAgIFdlbnNvbmcgWmhhbmcgPHdlbnNvbmdAZ251Y2hpbmEub3JnPgorICoKKyAqICAgICAgICAgICAgICBJbnNwaXJlZCBieSB0aGUgY29uc2lzdGVudCBoYXNoaW5nIHNjaGVkdWxlciBwYXRjaCBmcm9tCisgKiAgICAgICAgICAgICAgVGhvbWFzIFByb2VsbCA8cHJvZWxsdEBnbXguZGU+CisgKgorICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQ2hhbmdlczoKKyAqCisgKi8KKworLyoKKyAqIFRoZSBkaCBhbGdvcml0aG0gaXMgdG8gc2VsZWN0IHNlcnZlciBieSB0aGUgaGFzaCBrZXkgb2YgZGVzdGluYXRpb24gSVAKKyAqIGFkZHJlc3MuIFRoZSBwc2V1ZG8gY29kZSBpcyBhcyBmb2xsb3dzOgorICoKKyAqICAgICAgIG4gPC0gc2VydmVybm9kZVtkZXN0X2lwXTsKKyAqICAgICAgIGlmIChuIGlzIGRlYWQpIE9SCisgKiAgICAgICAgICAobiBpcyBvdmVybG9hZGVkKSBPUiAobi53ZWlnaHQgPD0gMCkgdGhlbgorICogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICoKKyAqICAgICAgIHJldHVybiBuOworICoKKyAqIE5vdGVzIHRoYXQgc2VydmVybm9kZSBpcyBhIDI1Ni1idWNrZXQgaGFzaCB0YWJsZSB0aGF0IG1hcHMgdGhlIGhhc2gKKyAqIGluZGV4IGRlcml2ZWQgZnJvbSBwYWNrZXQgZGVzdGluYXRpb24gSVAgYWRkcmVzcyB0byB0aGUgY3VycmVudCBzZXJ2ZXIKKyAqIGFycmF5LiBJZiB0aGUgZGggc2NoZWR1bGVyIGlzIHVzZWQgaW4gY2FjaGUgY2x1c3RlciwgaXQgaXMgZ29vZCB0bworICogY29tYmluZSBpdCB3aXRoIGNhY2hlX2J5cGFzcyBmZWF0dXJlLiBXaGVuIHRoZSBzdGF0aWNhbGx5IGFzc2lnbmVkCisgKiBzZXJ2ZXIgaXMgZGVhZCBvciBvdmVybG9hZGVkLCB0aGUgbG9hZCBiYWxhbmNlciBjYW4gYnlwYXNzIHRoZSBjYWNoZQorICogc2VydmVyIGFuZCBzZW5kIHJlcXVlc3RzIHRvIHRoZSBvcmlnaW5hbCBzZXJ2ZXIgZGlyZWN0bHkuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPG5ldC9pcF92cy5oPgorCisKKy8qCisgKiAgICAgIElQVlMgREggYnVja2V0CisgKi8KK3N0cnVjdCBpcF92c19kaF9idWNrZXQgeworCXN0cnVjdCBpcF92c19kZXN0ICAgICAgICpkZXN0OyAgICAgICAgICAvKiByZWFsIHNlcnZlciAoY2FjaGUpICovCit9OworCisvKgorICogICAgIGZvciBJUFZTIERIIGVudHJ5IGhhc2ggdGFibGUKKyAqLworI2lmbmRlZiBDT05GSUdfSVBfVlNfREhfVEFCX0JJVFMKKyNkZWZpbmUgQ09ORklHX0lQX1ZTX0RIX1RBQl9CSVRTICAgICAgICA4CisjZW5kaWYKKyNkZWZpbmUgSVBfVlNfREhfVEFCX0JJVFMgICAgICAgICAgICAgICBDT05GSUdfSVBfVlNfREhfVEFCX0JJVFMKKyNkZWZpbmUgSVBfVlNfREhfVEFCX1NJWkUgICAgICAgICAgICAgICAoMSA8PCBJUF9WU19ESF9UQUJfQklUUykKKyNkZWZpbmUgSVBfVlNfREhfVEFCX01BU0sgICAgICAgICAgICAgICAoSVBfVlNfREhfVEFCX1NJWkUgLSAxKQorCisKKy8qCisgKglSZXR1cm5zIGhhc2ggdmFsdWUgZm9yIElQVlMgREggZW50cnkKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpcF92c19kaF9oYXNoa2V5KF9fdTMyIGFkZHIpCit7CisJcmV0dXJuIChudG9obChhZGRyKSoyNjU0NDM1NzYxVUwpICYgSVBfVlNfREhfVEFCX01BU0s7Cit9CisKKworLyoKKyAqICAgICAgR2V0IGlwX3ZzX2Rlc3QgYXNzb2NpYXRlZCB3aXRoIHN1cHBsaWVkIHBhcmFtZXRlcnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwX3ZzX2Rlc3QgKgoraXBfdnNfZGhfZ2V0KHN0cnVjdCBpcF92c19kaF9idWNrZXQgKnRibCwgX191MzIgYWRkcikKK3sKKwlyZXR1cm4gKHRibFtpcF92c19kaF9oYXNoa2V5KGFkZHIpXSkuZGVzdDsKK30KKworCisvKgorICogICAgICBBc3NpZ24gYWxsIHRoZSBoYXNoIGJ1Y2tldHMgb2YgdGhlIHNwZWNpZmllZCB0YWJsZSB3aXRoIHRoZSBzZXJ2aWNlLgorICovCitzdGF0aWMgaW50CitpcF92c19kaF9hc3NpZ24oc3RydWN0IGlwX3ZzX2RoX2J1Y2tldCAqdGJsLCBzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQoreworCWludCBpOworCXN0cnVjdCBpcF92c19kaF9idWNrZXQgKmI7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKKworCWIgPSB0Ymw7CisJcCA9ICZzdmMtPmRlc3RpbmF0aW9uczsKKwlmb3IgKGk9MDsgaTxJUF9WU19ESF9UQUJfU0laRTsgaSsrKSB7CisJCWlmIChsaXN0X2VtcHR5KHApKSB7CisJCQliLT5kZXN0ID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCWlmIChwID09ICZzdmMtPmRlc3RpbmF0aW9ucykKKwkJCQlwID0gcC0+bmV4dDsKKworCQkJZGVzdCA9IGxpc3RfZW50cnkocCwgc3RydWN0IGlwX3ZzX2Rlc3QsIG5fbGlzdCk7CisJCQlhdG9taWNfaW5jKCZkZXN0LT5yZWZjbnQpOworCQkJYi0+ZGVzdCA9IGRlc3Q7CisKKwkJCXAgPSBwLT5uZXh0OworCQl9CisJCWIrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqICAgICAgRmx1c2ggYWxsIHRoZSBoYXNoIGJ1Y2tldHMgb2YgdGhlIHNwZWNpZmllZCB0YWJsZS4KKyAqLworc3RhdGljIHZvaWQgaXBfdnNfZGhfZmx1c2goc3RydWN0IGlwX3ZzX2RoX2J1Y2tldCAqdGJsKQoreworCWludCBpOworCXN0cnVjdCBpcF92c19kaF9idWNrZXQgKmI7CisKKwliID0gdGJsOworCWZvciAoaT0wOyBpPElQX1ZTX0RIX1RBQl9TSVpFOyBpKyspIHsKKwkJaWYgKGItPmRlc3QpIHsKKwkJCWF0b21pY19kZWMoJmItPmRlc3QtPnJlZmNudCk7CisJCQliLT5kZXN0ID0gTlVMTDsKKwkJfQorCQliKys7CisJfQorfQorCisKK3N0YXRpYyBpbnQgaXBfdnNfZGhfaW5pdF9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlzdHJ1Y3QgaXBfdnNfZGhfYnVja2V0ICp0Ymw7CisKKwkvKiBhbGxvY2F0ZSB0aGUgREggdGFibGUgZm9yIHRoaXMgc2VydmljZSAqLworCXRibCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcF92c19kaF9idWNrZXQpKklQX1ZTX0RIX1RBQl9TSVpFLAorCQkgICAgICBHRlBfQVRPTUlDKTsKKwlpZiAodGJsID09IE5VTEwpIHsKKwkJSVBfVlNfRVJSKCJpcF92c19kaF9pbml0X3N2YygpOiBubyBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJc3ZjLT5zY2hlZF9kYXRhID0gdGJsOworCUlQX1ZTX0RCRyg2LCAiREggaGFzaCB0YWJsZSAobWVtb3J5PSVaZGJ5dGVzKSBhbGxvY2F0ZWQgZm9yICIKKwkJICAiY3VycmVudCBzZXJ2aWNlXG4iLAorCQkgIHNpemVvZihzdHJ1Y3QgaXBfdnNfZGhfYnVja2V0KSpJUF9WU19ESF9UQUJfU0laRSk7CisKKwkvKiBhc3NpZ24gdGhlIGhhc2ggYnVja2V0cyB3aXRoIHRoZSB1cGRhdGVkIHNlcnZpY2UgKi8KKwlpcF92c19kaF9hc3NpZ24odGJsLCBzdmMpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpcF92c19kaF9kb25lX3N2YyhzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQoreworCXN0cnVjdCBpcF92c19kaF9idWNrZXQgKnRibCA9IHN2Yy0+c2NoZWRfZGF0YTsKKworCS8qIGdvdCB0byBjbGVhbiB1cCBoYXNoIGJ1Y2tldHMgaGVyZSAqLworCWlwX3ZzX2RoX2ZsdXNoKHRibCk7CisKKwkvKiByZWxlYXNlIHRoZSB0YWJsZSBpdHNlbGYgKi8KKwlrZnJlZShzdmMtPnNjaGVkX2RhdGEpOworCUlQX1ZTX0RCRyg2LCAiREggaGFzaCB0YWJsZSAobWVtb3J5PSVaZGJ5dGVzKSByZWxlYXNlZFxuIiwKKwkJICBzaXplb2Yoc3RydWN0IGlwX3ZzX2RoX2J1Y2tldCkqSVBfVlNfREhfVEFCX1NJWkUpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpcF92c19kaF91cGRhdGVfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCit7CisJc3RydWN0IGlwX3ZzX2RoX2J1Y2tldCAqdGJsID0gc3ZjLT5zY2hlZF9kYXRhOworCisJLyogZ290IHRvIGNsZWFuIHVwIGhhc2ggYnVja2V0cyBoZXJlICovCisJaXBfdnNfZGhfZmx1c2godGJsKTsKKworCS8qIGFzc2lnbiB0aGUgaGFzaCBidWNrZXRzIHdpdGggdGhlIHVwZGF0ZWQgc2VydmljZSAqLworCWlwX3ZzX2RoX2Fzc2lnbih0YmwsIHN2Yyk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogICAgICBJZiB0aGUgZGVzdCBmbGFncyBpcyBzZXQgd2l0aCBJUF9WU19ERVNUX0ZfT1ZFUkxPQUQsCisgKiAgICAgIGNvbnNpZGVyIHRoYXQgdGhlIHNlcnZlciBpcyBvdmVybG9hZGVkIGhlcmUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX292ZXJsb2FkZWQoc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCit7CisJcmV0dXJuIGRlc3QtPmZsYWdzICYgSVBfVlNfREVTVF9GX09WRVJMT0FEOworfQorCisKKy8qCisgKiAgICAgIERlc3RpbmF0aW9uIGhhc2hpbmcgc2NoZWR1bGluZworICovCitzdGF0aWMgc3RydWN0IGlwX3ZzX2Rlc3QgKgoraXBfdnNfZGhfc2NoZWR1bGUoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKKwlzdHJ1Y3QgaXBfdnNfZGhfYnVja2V0ICp0Ymw7CisJc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKworCUlQX1ZTX0RCRyg2LCAiaXBfdnNfZGhfc2NoZWR1bGUoKTogU2NoZWR1bGluZy4uLlxuIik7CisKKwl0YmwgPSAoc3RydWN0IGlwX3ZzX2RoX2J1Y2tldCAqKXN2Yy0+c2NoZWRfZGF0YTsKKwlkZXN0ID0gaXBfdnNfZGhfZ2V0KHRibCwgaXBoLT5kYWRkcik7CisJaWYgKCFkZXN0CisJICAgIHx8ICEoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfQVZBSUxBQkxFKQorCSAgICB8fCBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KSA8PSAwCisJICAgIHx8IGlzX292ZXJsb2FkZWQoZGVzdCkpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJSVBfVlNfREJHKDYsICJESDogZGVzdGluYXRpb24gSVAgYWRkcmVzcyAldS4ldS4ldS4ldSAiCisJCSAgIi0tPiBzZXJ2ZXIgJXUuJXUuJXUuJXU6JWRcbiIsCisJCSAgTklQUVVBRChpcGgtPmRhZGRyKSwKKwkJICBOSVBRVUFEKGRlc3QtPmFkZHIpLAorCQkgIG50b2hzKGRlc3QtPnBvcnQpKTsKKworCXJldHVybiBkZXN0OworfQorCisKKy8qCisgKiAgICAgIElQVlMgREggU2NoZWR1bGVyIHN0cnVjdHVyZQorICovCitzdGF0aWMgc3RydWN0IGlwX3ZzX3NjaGVkdWxlciBpcF92c19kaF9zY2hlZHVsZXIgPQoreworCS5uYW1lID0JCQkiZGgiLAorCS5yZWZjbnQgPQkJQVRPTUlDX0lOSVQoMCksCisJLm1vZHVsZSA9CQlUSElTX01PRFVMRSwKKwkuaW5pdF9zZXJ2aWNlID0JCWlwX3ZzX2RoX2luaXRfc3ZjLAorCS5kb25lX3NlcnZpY2UgPQkJaXBfdnNfZGhfZG9uZV9zdmMsCisJLnVwZGF0ZV9zZXJ2aWNlID0JaXBfdnNfZGhfdXBkYXRlX3N2YywKKwkuc2NoZWR1bGUgPQkJaXBfdnNfZGhfc2NoZWR1bGUsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGlwX3ZzX2RoX2luaXQodm9pZCkKK3sKKwlJTklUX0xJU1RfSEVBRCgmaXBfdnNfZGhfc2NoZWR1bGVyLm5fbGlzdCk7CisJcmV0dXJuIHJlZ2lzdGVyX2lwX3ZzX3NjaGVkdWxlcigmaXBfdnNfZGhfc2NoZWR1bGVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgaXBfdnNfZGhfY2xlYW51cCh2b2lkKQoreworCXVucmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKCZpcF92c19kaF9zY2hlZHVsZXIpOworfQorCisKK21vZHVsZV9pbml0KGlwX3ZzX2RoX2luaXQpOworbW9kdWxlX2V4aXQoaXBfdnNfZGhfY2xlYW51cCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2VzdC5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19lc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2IzZTJmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c19lc3QuYwpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIGlwX3ZzX2VzdC5jOiBzaW1wbGUgcmF0ZSBlc3RpbWF0b3IgZm9yIElQVlMKKyAqCisgKiBWZXJzaW9uOiAgICAgJElkOiBpcF92c19lc3QuYyx2IDEuNCAyMDAyLzExLzMwIDAxOjUwOjM1IHdlbnNvbmcgRXhwICQKKyAqCisgKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENoYW5nZXM6CisgKgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPG5ldC9pcF92cy5oPgorCisvKgorICBUaGlzIGNvZGUgaXMgdG8gZXN0aW1hdGUgcmF0ZSBpbiBhIHNob3J0ZXIgaW50ZXJ2YWwgKHN1Y2ggYXMgOAorICBzZWNvbmRzKSBmb3IgdmlydHVhbCBzZXJ2aWNlcyBhbmQgcmVhbCBzZXJ2ZXJzLiBGb3IgbWVhc3VyZSByYXRlIGluIGEKKyAgbG9uZyBpbnRlcnZhbCwgaXQgaXMgZWFzeSB0byBpbXBsZW1lbnQgYSB1c2VyIGxldmVsIGRhZW1vbiB3aGljaAorICBwZXJpb2RpY2FsbHkgcmVhZHMgdGhvc2Ugc3RhdGlzdGljYWwgY291bnRlcnMgYW5kIG1lYXN1cmUgcmF0ZS4KKworICBDdXJyZW50bHksIHRoZSBtZWFzdXJlbWVudCBpcyBhY3RpdmF0ZWQgYnkgc2xvdyB0aW1lciBoYW5kbGVyLiBIb3BlCisgIHRoaXMgbWVhc3VyZW1lbnQgd2lsbCBub3QgaW50cm9kdWNlIHRvbyBtdWNoIGxvYWQuCisKKyAgV2UgbWVhc3VyZSByYXRlIGR1cmluZyB0aGUgbGFzdCA4IHNlY29uZHMgZXZlcnkgMiBzZWNvbmRzOgorCisgICAgYXZncmF0ZSA9IGF2Z3JhdGUqKDEtVykgKyByYXRlKlcKKworICAgIHdoZXJlIFcgPSAyXigtMikKKworICBOT1RFUy4KKworICAqIFRoZSBzdG9yZWQgdmFsdWUgZm9yIGF2ZXJhZ2UgYnBzIGlzIHNjYWxlZCBieSAyXjUsIHNvIHRoYXQgbWF4aW1hbAorICAgIHJhdGUgaXMgfjIuMTVHYml0cy9zLCBhdmVyYWdlIHBwcyBhbmQgY3BzIGFyZSBzY2FsZWQgYnkgMl4xMC4KKworICAqIEEgbG90IGNvZGUgaXMgdGFrZW4gZnJvbSBuZXQvc2NoZWQvZXN0aW1hdG9yLmMKKyAqLworCisKK3N0cnVjdCBpcF92c19lc3RpbWF0b3IKK3sKKwlzdHJ1Y3QgaXBfdnNfZXN0aW1hdG9yCSpuZXh0OworCXN0cnVjdCBpcF92c19zdGF0cwkqc3RhdHM7CisKKwl1MzIJCQlsYXN0X2Nvbm5zOworCXUzMgkJCWxhc3RfaW5wa3RzOworCXUzMgkJCWxhc3Rfb3V0cGt0czsKKwl1NjQJCQlsYXN0X2luYnl0ZXM7CisJdTY0CQkJbGFzdF9vdXRieXRlczsKKworCXUzMgkJCWNwczsKKwl1MzIJCQlpbnBwczsKKwl1MzIJCQlvdXRwcHM7CisJdTMyCQkJaW5icHM7CisJdTMyCQkJb3V0YnBzOworfTsKKworCitzdGF0aWMgc3RydWN0IGlwX3ZzX2VzdGltYXRvciAqZXN0X2xpc3QgPSBOVUxMOworc3RhdGljIERFRklORV9SV0xPQ0soZXN0X2xvY2spOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGVzdF90aW1lcjsKKworc3RhdGljIHZvaWQgZXN0aW1hdGlvbl90aW1lcih1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaXBfdnNfZXN0aW1hdG9yICplOworCXN0cnVjdCBpcF92c19zdGF0cyAqczsKKwl1MzIgbl9jb25uczsKKwl1MzIgbl9pbnBrdHMsIG5fb3V0cGt0czsKKwl1NjQgbl9pbmJ5dGVzLCBuX291dGJ5dGVzOworCXUzMiByYXRlOworCisJcmVhZF9sb2NrKCZlc3RfbG9jayk7CisJZm9yIChlID0gZXN0X2xpc3Q7IGU7IGUgPSBlLT5uZXh0KSB7CisJCXMgPSBlLT5zdGF0czsKKworCQlzcGluX2xvY2soJnMtPmxvY2spOworCQluX2Nvbm5zID0gcy0+Y29ubnM7CisJCW5faW5wa3RzID0gcy0+aW5wa3RzOworCQluX291dHBrdHMgPSBzLT5vdXRwa3RzOworCQluX2luYnl0ZXMgPSBzLT5pbmJ5dGVzOworCQluX291dGJ5dGVzID0gcy0+b3V0Ynl0ZXM7CisKKwkJLyogc2NhbGVkIGJ5IDJeMTAsIGJ1dCBkaXZpZGVkIDIgc2Vjb25kcyAqLworCQlyYXRlID0gKG5fY29ubnMgLSBlLT5sYXN0X2Nvbm5zKTw8OTsKKwkJZS0+bGFzdF9jb25ucyA9IG5fY29ubnM7CisJCWUtPmNwcyArPSAoKGxvbmcpcmF0ZSAtIChsb25nKWUtPmNwcyk+PjI7CisJCXMtPmNwcyA9IChlLT5jcHMrMHgxRkYpPj4xMDsKKworCQlyYXRlID0gKG5faW5wa3RzIC0gZS0+bGFzdF9pbnBrdHMpPDw5OworCQllLT5sYXN0X2lucGt0cyA9IG5faW5wa3RzOworCQllLT5pbnBwcyArPSAoKGxvbmcpcmF0ZSAtIChsb25nKWUtPmlucHBzKT4+MjsKKwkJcy0+aW5wcHMgPSAoZS0+aW5wcHMrMHgxRkYpPj4xMDsKKworCQlyYXRlID0gKG5fb3V0cGt0cyAtIGUtPmxhc3Rfb3V0cGt0cyk8PDk7CisJCWUtPmxhc3Rfb3V0cGt0cyA9IG5fb3V0cGt0czsKKwkJZS0+b3V0cHBzICs9ICgobG9uZylyYXRlIC0gKGxvbmcpZS0+b3V0cHBzKT4+MjsKKwkJcy0+b3V0cHBzID0gKGUtPm91dHBwcysweDFGRik+PjEwOworCisJCXJhdGUgPSAobl9pbmJ5dGVzIC0gZS0+bGFzdF9pbmJ5dGVzKTw8NDsKKwkJZS0+bGFzdF9pbmJ5dGVzID0gbl9pbmJ5dGVzOworCQllLT5pbmJwcyArPSAoKGxvbmcpcmF0ZSAtIChsb25nKWUtPmluYnBzKT4+MjsKKwkJcy0+aW5icHMgPSAoZS0+aW5icHMrMHhGKT4+NTsKKworCQlyYXRlID0gKG5fb3V0Ynl0ZXMgLSBlLT5sYXN0X291dGJ5dGVzKTw8NDsKKwkJZS0+bGFzdF9vdXRieXRlcyA9IG5fb3V0Ynl0ZXM7CisJCWUtPm91dGJwcyArPSAoKGxvbmcpcmF0ZSAtIChsb25nKWUtPm91dGJwcyk+PjI7CisJCXMtPm91dGJwcyA9IChlLT5vdXRicHMrMHhGKT4+NTsKKwkJc3Bpbl91bmxvY2soJnMtPmxvY2spOworCX0KKwlyZWFkX3VubG9jaygmZXN0X2xvY2spOworCW1vZF90aW1lcigmZXN0X3RpbWVyLCBqaWZmaWVzICsgMipIWik7Cit9CisKK2ludCBpcF92c19uZXdfZXN0aW1hdG9yKHN0cnVjdCBpcF92c19zdGF0cyAqc3RhdHMpCit7CisJc3RydWN0IGlwX3ZzX2VzdGltYXRvciAqZXN0OworCisJZXN0ID0ga21hbGxvYyhzaXplb2YoKmVzdCksIEdGUF9LRVJORUwpOworCWlmIChlc3QgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoZXN0LCAwLCBzaXplb2YoKmVzdCkpOworCWVzdC0+c3RhdHMgPSBzdGF0czsKKwllc3QtPmxhc3RfY29ubnMgPSBzdGF0cy0+Y29ubnM7CisJZXN0LT5jcHMgPSBzdGF0cy0+Y3BzPDwxMDsKKworCWVzdC0+bGFzdF9pbnBrdHMgPSBzdGF0cy0+aW5wa3RzOworCWVzdC0+aW5wcHMgPSBzdGF0cy0+aW5wcHM8PDEwOworCisJZXN0LT5sYXN0X291dHBrdHMgPSBzdGF0cy0+b3V0cGt0czsKKwllc3QtPm91dHBwcyA9IHN0YXRzLT5vdXRwcHM8PDEwOworCisJZXN0LT5sYXN0X2luYnl0ZXMgPSBzdGF0cy0+aW5ieXRlczsKKwllc3QtPmluYnBzID0gc3RhdHMtPmluYnBzPDw1OworCisJZXN0LT5sYXN0X291dGJ5dGVzID0gc3RhdHMtPm91dGJ5dGVzOworCWVzdC0+b3V0YnBzID0gc3RhdHMtPm91dGJwczw8NTsKKworCXdyaXRlX2xvY2tfYmgoJmVzdF9sb2NrKTsKKwllc3QtPm5leHQgPSBlc3RfbGlzdDsKKwlpZiAoZXN0LT5uZXh0ID09IE5VTEwpIHsKKwkJaW5pdF90aW1lcigmZXN0X3RpbWVyKTsKKwkJZXN0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMipIWjsKKwkJZXN0X3RpbWVyLmZ1bmN0aW9uID0gZXN0aW1hdGlvbl90aW1lcjsKKwkJYWRkX3RpbWVyKCZlc3RfdGltZXIpOworCX0KKwllc3RfbGlzdCA9IGVzdDsKKwl3cml0ZV91bmxvY2tfYmgoJmVzdF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBpcF92c19raWxsX2VzdGltYXRvcihzdHJ1Y3QgaXBfdnNfc3RhdHMgKnN0YXRzKQoreworCXN0cnVjdCBpcF92c19lc3RpbWF0b3IgKmVzdCwgKipwZXN0OworCWludCBraWxsZWQgPSAwOworCisJd3JpdGVfbG9ja19iaCgmZXN0X2xvY2spOworCXBlc3QgPSAmZXN0X2xpc3Q7CisJd2hpbGUgKChlc3Q9KnBlc3QpICE9IE5VTEwpIHsKKwkJaWYgKGVzdC0+c3RhdHMgIT0gc3RhdHMpIHsKKwkJCXBlc3QgPSAmZXN0LT5uZXh0OworCQkJY29udGludWU7CisJCX0KKwkJKnBlc3QgPSBlc3QtPm5leHQ7CisJCWtmcmVlKGVzdCk7CisJCWtpbGxlZCsrOworCX0KKwlpZiAoa2lsbGVkICYmIGVzdF9saXN0ID09IE5VTEwpCisJCWRlbF90aW1lcl9zeW5jKCZlc3RfdGltZXIpOworCXdyaXRlX3VubG9ja19iaCgmZXN0X2xvY2spOworfQorCit2b2lkIGlwX3ZzX3plcm9fZXN0aW1hdG9yKHN0cnVjdCBpcF92c19zdGF0cyAqc3RhdHMpCit7CisJc3RydWN0IGlwX3ZzX2VzdGltYXRvciAqZTsKKworCXdyaXRlX2xvY2tfYmgoJmVzdF9sb2NrKTsKKwlmb3IgKGUgPSBlc3RfbGlzdDsgZTsgZSA9IGUtPm5leHQpIHsKKwkJaWYgKGUtPnN0YXRzICE9IHN0YXRzKQorCQkJY29udGludWU7CisKKwkJLyogc2V0IGNvdW50ZXJzIHplcm8gKi8KKwkJZS0+bGFzdF9jb25ucyA9IDA7CisJCWUtPmxhc3RfaW5wa3RzID0gMDsKKwkJZS0+bGFzdF9vdXRwa3RzID0gMDsKKwkJZS0+bGFzdF9pbmJ5dGVzID0gMDsKKwkJZS0+bGFzdF9vdXRieXRlcyA9IDA7CisJCWUtPmNwcyA9IDA7CisJCWUtPmlucHBzID0gMDsKKwkJZS0+b3V0cHBzID0gMDsKKwkJZS0+aW5icHMgPSAwOworCQllLT5vdXRicHMgPSAwOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJmVzdF9sb2NrKTsKK30KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfZnRwLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2Z0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOWEzM2MKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2Z0cC5jCkBAIC0wLDAgKzEsNDAwIEBACisvKgorICogaXBfdnNfZnRwLmM6IElQVlMgZnRwIGFwcGxpY2F0aW9uIG1vZHVsZQorICoKKyAqIFZlcnNpb246CSRJZDogaXBfdnNfZnRwLmMsdiAxLjEzIDIwMDIvMDkvMTUgMDg6MTQ6MDggd2Vuc29uZyBFeHAgJAorICoKKyAqIEF1dGhvcnM6CVdlbnNvbmcgWmhhbmcgPHdlbnNvbmdAbGludXh2aXJ0dWFsc2VydmVyLm9yZz4KKyAqCisgKiBDaGFuZ2VzOgorICoKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIE1vc3QgY29kZSBoZXJlIGlzIHRha2VuIGZyb20gaXBfbWFzcV9mdHAuYyBpbiBrZXJuZWwgMi4yLiBUaGUgZGlmZmVyZW5jZQorICogaXMgdGhhdCBpcF92c19mdHAgbW9kdWxlIGhhbmRsZXMgdGhlIHJldmVyc2UgZGlyZWN0aW9uIHRvIGlwX21hc3FfZnRwLgorICoKKyAqCQlJUF9NQVNRX0ZUUCBmdHAgbWFzcXVlcmFkaW5nIG1vZHVsZQorICoKKyAqIFZlcnNpb246CUAoIylpcF9tYXNxX2Z0cC5jIDAuMDQgICAwMi8wNS85NgorICoKKyAqIEF1dGhvcjoJV291dGVyIEdhZGV5bmUKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKworI2luY2x1ZGUgPG5ldC9pcF92cy5oPgorCisKKyNkZWZpbmUgU0VSVkVSX1NUUklORyAiMjI3IEVudGVyaW5nIFBhc3NpdmUgTW9kZSAoIgorI2RlZmluZSBDTElFTlRfU1RSSU5HICJQT1JUICIKKworCisvKgorICogTGlzdCBvZiBwb3J0cyAodXAgdG8gSVBfVlNfQVBQX01BWF9QT1JUUykgdG8gYmUgaGFuZGxlZCBieSBoZWxwZXIKKyAqIEZpcnN0IHBvcnQgaXMgc2V0IHRvIHRoZSBkZWZhdWx0IHBvcnQuCisgKi8KK3N0YXRpYyBpbnQgcG9ydHNbSVBfVlNfQVBQX01BWF9QT1JUU10gPSB7MjEsIDB9OworbW9kdWxlX3BhcmFtX2FycmF5KHBvcnRzLCBpbnQsIE5VTEwsIDApOworCisvKgorICoJRGVidWcgbGV2ZWwKKyAqLworI2lmZGVmIENPTkZJR19JUF9WU19ERUJVRworc3RhdGljIGludCBkZWJ1Zz0wOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworI2VuZGlmCisKKworLyoJRHVtbXkgdmFyaWFibGUgKi8KK3N0YXRpYyBpbnQgaXBfdnNfZnRwX3Bhc3Y7CisKKworc3RhdGljIGludAoraXBfdnNfZnRwX2luaXRfY29ubihzdHJ1Y3QgaXBfdnNfYXBwICphcHAsIHN0cnVjdCBpcF92c19jb25uICpjcCkKK3sKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CitpcF92c19mdHBfZG9uZV9jb25uKHN0cnVjdCBpcF92c19hcHAgKmFwcCwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwKQoreworCXJldHVybiAwOworfQorCisKKy8qCisgKiBHZXQgPGFkZHIscG9ydD4gZnJvbSB0aGUgc3RyaW5nICJ4eHgueHh4Lnh4eC54eHgscHBwLHBwcCIsIHN0YXJ0ZWQKKyAqIHdpdGggdGhlICJwYXR0ZXJuIiBhbmQgdGVybWluYXRlZCB3aXRoIHRoZSAidGVybSIgY2hhcmFjdGVyLgorICogPGFkZHIscG9ydD4gaXMgaW4gbmV0d29yayBvcmRlci4KKyAqLworc3RhdGljIGludCBpcF92c19mdHBfZ2V0X2FkZHJwb3J0KGNoYXIgKmRhdGEsIGNoYXIgKmRhdGFfbGltaXQsCisJCQkJICBjb25zdCBjaGFyICpwYXR0ZXJuLCBzaXplX3QgcGxlbiwgY2hhciB0ZXJtLAorCQkJCSAgX191MzIgKmFkZHIsIF9fdTE2ICpwb3J0LAorCQkJCSAgY2hhciAqKnN0YXJ0LCBjaGFyICoqZW5kKQoreworCXVuc2lnbmVkIGNoYXIgcFs2XTsKKwlpbnQgaSA9IDA7CisKKwlpZiAoZGF0YV9saW1pdCAtIGRhdGEgPCBwbGVuKSB7CisJCS8qIGNoZWNrIGlmIHRoZXJlIGlzIHBhcnRpYWwgbWF0Y2ggKi8KKwkJaWYgKHN0cm5pY21wKGRhdGEsIHBhdHRlcm4sIGRhdGFfbGltaXQgLSBkYXRhKSA9PSAwKQorCQkJcmV0dXJuIC0xOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RybmljbXAoZGF0YSwgcGF0dGVybiwgcGxlbikgIT0gMCkgeworCQlyZXR1cm4gMDsKKwl9CisJKnN0YXJ0ID0gZGF0YSArIHBsZW47CisKKwlmb3IgKGRhdGEgPSAqc3RhcnQ7ICpkYXRhICE9IHRlcm07IGRhdGErKykgeworCQlpZiAoZGF0YSA9PSBkYXRhX2xpbWl0KQorCQkJcmV0dXJuIC0xOworCX0KKwkqZW5kID0gZGF0YTsKKworCW1lbXNldChwLCAwLCBzaXplb2YocCkpOworCWZvciAoZGF0YSA9ICpzdGFydDsgZGF0YSAhPSAqZW5kOyBkYXRhKyspIHsKKwkJaWYgKCpkYXRhID49ICcwJyAmJiAqZGF0YSA8PSAnOScpIHsKKwkJCXBbaV0gPSBwW2ldKjEwICsgKmRhdGEgLSAnMCc7CisJCX0gZWxzZSBpZiAoKmRhdGEgPT0gJywnICYmIGkgPCA1KSB7CisJCQlpKys7CisJCX0gZWxzZSB7CisJCQkvKiB1bmV4cGVjdGVkIGNoYXJhY3RlciAqLworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJaWYgKGkgIT0gNSkKKwkJcmV0dXJuIC0xOworCisJKmFkZHIgPSAocFszXTw8MjQpIHwgKHBbMl08PDE2KSB8IChwWzFdPDw4KSB8IHBbMF07CisJKnBvcnQgPSAocFs1XTw8OCkgfCBwWzRdOworCXJldHVybiAxOworfQorCisKKy8qCisgKiBMb29rIGF0IG91dGdvaW5nIGZ0cCBwYWNrZXRzIHRvIGNhdGNoIHRoZSByZXNwb25zZSB0byBhIFBBU1YgY29tbWFuZAorICogZnJvbSB0aGUgc2VydmVyIChpbnNpZGUtdG8tb3V0c2lkZSkuCisgKiBXaGVuIHdlIHNlZSBvbmUsIHdlIGJ1aWxkIGEgY29ubmVjdGlvbiBlbnRyeSB3aXRoIHRoZSBjbGllbnQgYWRkcmVzcywKKyAqIGNsaWVudCBwb3J0IDAgKHVua25vd24gYXQgdGhlIG1vbWVudCksIHRoZSBzZXJ2ZXIgYWRkcmVzcyBhbmQgdGhlCisgKiBzZXJ2ZXIgcG9ydC4gIE1hcmsgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBlbnRyeSBhcyBhIGNvbnRyb2wgY2hhbm5lbAorICogb2YgdGhlIG5ldyBlbnRyeS4gQWxsIHRoaXMgd29yayBpcyBqdXN0IHRvIG1ha2UgdGhlIGRhdGEgY29ubmVjdGlvbgorICogY2FuIGJlIHNjaGVkdWxlZCB0byB0aGUgcmlnaHQgc2VydmVyIGxhdGVyLgorICoKKyAqIFRoZSBvdXRnb2luZyBwYWNrZXQgc2hvdWxkIGJlIHNvbWV0aGluZyBsaWtlCisgKiAgICIyMjcgRW50ZXJpbmcgUGFzc2l2ZSBNb2RlICh4eHgseHh4LHh4eCx4eHgscHBwLHBwcCkiLgorICogeHh4LHh4eCx4eHgseHh4IGlzIHRoZSBzZXJ2ZXIgYWRkcmVzcywgcHBwLHBwcCBpcyB0aGUgc2VydmVyIHBvcnQgbnVtYmVyLgorICovCitzdGF0aWMgaW50IGlwX3ZzX2Z0cF9vdXQoc3RydWN0IGlwX3ZzX2FwcCAqYXBwLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsCisJCQkgc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBpbnQgKmRpZmYpCit7CisJc3RydWN0IGlwaGRyICppcGg7CisJc3RydWN0IHRjcGhkciAqdGg7CisJY2hhciAqZGF0YSwgKmRhdGFfbGltaXQ7CisJY2hhciAqc3RhcnQsICplbmQ7CisJX191MzIgZnJvbTsKKwlfX3UxNiBwb3J0OworCXN0cnVjdCBpcF92c19jb25uICpuX2NwOworCWNoYXIgYnVmWzI0XTsJCS8qIHh4eC54eHgueHh4Lnh4eCxwcHAscHBwXDAwMCAqLworCXVuc2lnbmVkIGJ1Zl9sZW47CisJaW50IHJldDsKKworCSpkaWZmID0gMDsKKworCS8qIE9ubHkgdXNlZnVsIGZvciBlc3RhYmxpc2hlZCBzZXNzaW9ucyAqLworCWlmIChjcC0+c3RhdGUgIT0gSVBfVlNfVENQX1NfRVNUQUJMSVNIRUQpCisJCXJldHVybiAxOworCisJLyogTGluZWFyIHBhY2tldHMgYXJlIG11Y2ggZWFzaWVyIHRvIGRlYWwgd2l0aC4gKi8KKwlpZiAoIWlwX3ZzX21ha2Vfc2tiX3dyaXRhYmxlKHBza2IsICgqcHNrYiktPmxlbikpCisJCXJldHVybiAwOworCisJaWYgKGNwLT5hcHBfZGF0YSA9PSAmaXBfdnNfZnRwX3Bhc3YpIHsKKwkJaXBoID0gKCpwc2tiKS0+bmguaXBoOworCQl0aCA9IChzdHJ1Y3QgdGNwaGRyICopJigoKGNoYXIgKilpcGgpW2lwaC0+aWhsKjRdKTsKKwkJZGF0YSA9IChjaGFyICopdGggKyAodGgtPmRvZmYgPDwgMik7CisJCWRhdGFfbGltaXQgPSAoKnBza2IpLT50YWlsOworCisJCWlmIChpcF92c19mdHBfZ2V0X2FkZHJwb3J0KGRhdGEsIGRhdGFfbGltaXQsCisJCQkJCSAgIFNFUlZFUl9TVFJJTkcsCisJCQkJCSAgIHNpemVvZihTRVJWRVJfU1RSSU5HKS0xLCAnKScsCisJCQkJCSAgICZmcm9tLCAmcG9ydCwKKwkJCQkJICAgJnN0YXJ0LCAmZW5kKSAhPSAxKQorCQkJcmV0dXJuIDE7CisKKwkJSVBfVlNfREJHKDEtZGVidWcsICJQQVNWIHJlc3BvbnNlICgldS4ldS4ldS4ldTolZCkgLT4gIgorCQkJICAiJXUuJXUuJXUuJXU6JWQgZGV0ZWN0ZWRcbiIsCisJCQkgIE5JUFFVQUQoZnJvbSksIG50b2hzKHBvcnQpLCBOSVBRVUFEKGNwLT5jYWRkciksIDApOworCisJCS8qCisJCSAqIE5vdyB1cGRhdGUgb3IgY3JlYXRlIGFuIGNvbm5lY3Rpb24gZW50cnkgZm9yIGl0CisJCSAqLworCQluX2NwID0gaXBfdnNfY29ubl9vdXRfZ2V0KGlwaC0+cHJvdG9jb2wsIGZyb20sIHBvcnQsCisJCQkJCSAgY3AtPmNhZGRyLCAwKTsKKwkJaWYgKCFuX2NwKSB7CisJCQluX2NwID0gaXBfdnNfY29ubl9uZXcoSVBQUk9UT19UQ1AsCisJCQkJCSAgICAgIGNwLT5jYWRkciwgMCwKKwkJCQkJICAgICAgY3AtPnZhZGRyLCBwb3J0LAorCQkJCQkgICAgICBmcm9tLCBwb3J0LAorCQkJCQkgICAgICBJUF9WU19DT05OX0ZfTk9fQ1BPUlQsCisJCQkJCSAgICAgIGNwLT5kZXN0KTsKKwkJCWlmICghbl9jcCkKKwkJCQlyZXR1cm4gMDsKKworCQkJLyogYWRkIGl0cyBjb250cm9sbGVyICovCisJCQlpcF92c19jb250cm9sX2FkZChuX2NwLCBjcCk7CisJCX0KKworCQkvKgorCQkgKiBSZXBsYWNlIHRoZSBvbGQgcGFzc2l2ZSBhZGRyZXNzIHdpdGggdGhlIG5ldyBvbmUKKwkJICovCisJCWZyb20gPSBuX2NwLT52YWRkcjsKKwkJcG9ydCA9IG5fY3AtPnZwb3J0OworCQlzcHJpbnRmKGJ1ZiwiJWQsJWQsJWQsJWQsJWQsJWQiLCBOSVBRVUFEKGZyb20pLAorCQkJcG9ydCYyNTUsIChwb3J0Pj44KSYyNTUpOworCQlidWZfbGVuID0gc3RybGVuKGJ1Zik7CisKKwkJLyoKKwkJICogQ2FsY3VsYXRlIHJlcXVpcmVkIGRlbHRhLW9mZnNldCB0byBrZWVwIFRDUCBoYXBweQorCQkgKi8KKwkJKmRpZmYgPSBidWZfbGVuIC0gKGVuZC1zdGFydCk7CisKKwkJaWYgKCpkaWZmID09IDApIHsKKwkJCS8qIHNpbXBseSByZXBsYWNlIGl0IHdpdGggbmV3IHBhc3NpdmUgYWRkcmVzcyAqLworCQkJbWVtY3B5KHN0YXJ0LCBidWYsIGJ1Zl9sZW4pOworCQkJcmV0ID0gMTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9ICFpcF92c19za2JfcmVwbGFjZSgqcHNrYiwgR0ZQX0FUT01JQywgc3RhcnQsCisJCQkJCSAgZW5kLXN0YXJ0LCBidWYsIGJ1Zl9sZW4pOworCQl9CisKKwkJY3AtPmFwcF9kYXRhID0gTlVMTDsKKwkJaXBfdnNfdGNwX2Nvbm5fbGlzdGVuKG5fY3ApOworCQlpcF92c19jb25uX3B1dChuX2NwKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKworLyoKKyAqIExvb2sgYXQgaW5jb21pbmcgZnRwIHBhY2tldHMgdG8gY2F0Y2ggdGhlIFBBU1YvUE9SVCBjb21tYW5kCisgKiAob3V0c2lkZS10by1pbnNpZGUpLgorICoKKyAqIFRoZSBpbmNvbWluZyBwYWNrZXQgaGF2aW5nIHRoZSBQT1JUIGNvbW1hbmQgc2hvdWxkIGJlIHNvbWV0aGluZyBsaWtlCisgKiAgICAgICJQT1JUIHh4eCx4eHgseHh4LHh4eCxwcHAscHBwXG4iLgorICogeHh4LHh4eCx4eHgseHh4IGlzIHRoZSBjbGllbnQgYWRkcmVzcywgcHBwLHBwcCBpcyB0aGUgY2xpZW50IHBvcnQgbnVtYmVyLgorICogSW4gdGhpcyBjYXNlLCB3ZSBjcmVhdGUgYSBjb25uZWN0aW9uIGVudHJ5IHVzaW5nIHRoZSBjbGllbnQgYWRkcmVzcyBhbmQKKyAqIHBvcnQsIHNvIHRoYXQgdGhlIGFjdGl2ZSBmdHAgZGF0YSBjb25uZWN0aW9uIGZyb20gdGhlIHNlcnZlciBjYW4gcmVhY2gKKyAqIHRoZSBjbGllbnQuCisgKi8KK3N0YXRpYyBpbnQgaXBfdnNfZnRwX2luKHN0cnVjdCBpcF92c19hcHAgKmFwcCwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLAorCQkJc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBpbnQgKmRpZmYpCit7CisJc3RydWN0IGlwaGRyICppcGg7CisJc3RydWN0IHRjcGhkciAqdGg7CisJY2hhciAqZGF0YSwgKmRhdGFfc3RhcnQsICpkYXRhX2xpbWl0OworCWNoYXIgKnN0YXJ0LCAqZW5kOworCV9fdTMyIHRvOworCV9fdTE2IHBvcnQ7CisJc3RydWN0IGlwX3ZzX2Nvbm4gKm5fY3A7CisKKwkvKiBubyBkaWZmIHJlcXVpcmVkIGZvciBpbmNvbWluZyBwYWNrZXRzICovCisJKmRpZmYgPSAwOworCisJLyogT25seSB1c2VmdWwgZm9yIGVzdGFibGlzaGVkIHNlc3Npb25zICovCisJaWYgKGNwLT5zdGF0ZSAhPSBJUF9WU19UQ1BfU19FU1RBQkxJU0hFRCkKKwkJcmV0dXJuIDE7CisKKwkvKiBMaW5lYXIgcGFja2V0cyBhcmUgbXVjaCBlYXNpZXIgdG8gZGVhbCB3aXRoLiAqLworCWlmICghaXBfdnNfbWFrZV9za2Jfd3JpdGFibGUocHNrYiwgKCpwc2tiKS0+bGVuKSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIERldGVjdGluZyB3aGV0aGVyIGl0IGlzIHBhc3NpdmUKKwkgKi8KKwlpcGggPSAoKnBza2IpLT5uaC5pcGg7CisJdGggPSAoc3RydWN0IHRjcGhkciAqKSYoKChjaGFyICopaXBoKVtpcGgtPmlobCo0XSk7CisKKwkvKiBTaW5jZSB0aGVyZSBtYXkgYmUgT1BUSU9OUyBpbiB0aGUgVENQIHBhY2tldCBhbmQgdGhlIEhMRU4gaXMKKwkgICB0aGUgbGVuZ3RoIG9mIHRoZSBoZWFkZXIgaW4gMzItYml0IG11bHRpcGxlcywgaXQgaXMgYWNjdXJhdGUKKwkgICB0byBjYWxjdWxhdGUgZGF0YSBhZGRyZXNzIGJ5IHRoK0hMRU4qNCAqLworCWRhdGEgPSBkYXRhX3N0YXJ0ID0gKGNoYXIgKil0aCArICh0aC0+ZG9mZiA8PCAyKTsKKwlkYXRhX2xpbWl0ID0gKCpwc2tiKS0+dGFpbDsKKworCXdoaWxlIChkYXRhIDw9IGRhdGFfbGltaXQgLSA2KSB7CisJCWlmIChzdHJuaWNtcChkYXRhLCAiUEFTVlxyXG4iLCA2KSA9PSAwKSB7CisJCQkvKiBQYXNzaXZlIG1vZGUgb24gKi8KKwkJCUlQX1ZTX0RCRygxLWRlYnVnLCAiZ290IFBBU1YgYXQgJXpkIG9mICV6ZFxuIiwKKwkJCQkgIGRhdGEgLSBkYXRhX3N0YXJ0LAorCQkJCSAgZGF0YV9saW1pdCAtIGRhdGFfc3RhcnQpOworCQkJY3AtPmFwcF9kYXRhID0gJmlwX3ZzX2Z0cF9wYXN2OworCQkJcmV0dXJuIDE7CisJCX0KKwkJZGF0YSsrOworCX0KKworCS8qCisJICogVG8gc3VwcG9ydCB2aXJ0dWFsIEZUUCBzZXJ2ZXIsIHRoZSBzY2VuZXJpbyBpcyBhcyBmb2xsb3dzOgorCSAqICAgICAgIEZUUCBjbGllbnQgLS0tLT4gTG9hZCBCYWxhbmNlciAtLS0tPiBGVFAgc2VydmVyCisJICogRmlyc3QgZGV0ZWN0IHRoZSBwb3J0IG51bWJlciBpbiB0aGUgYXBwbGljYXRpb24gZGF0YSwKKwkgKiB0aGVuIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIGVudHJ5IGZvciB0aGUgY29taW5nIGRhdGEKKwkgKiBjb25uZWN0aW9uLgorCSAqLworCWlmIChpcF92c19mdHBfZ2V0X2FkZHJwb3J0KGRhdGFfc3RhcnQsIGRhdGFfbGltaXQsCisJCQkJICAgQ0xJRU5UX1NUUklORywgc2l6ZW9mKENMSUVOVF9TVFJJTkcpLTEsCisJCQkJICAgJ1xyJywgJnRvLCAmcG9ydCwKKwkJCQkgICAmc3RhcnQsICZlbmQpICE9IDEpCisJCXJldHVybiAxOworCisJSVBfVlNfREJHKDEtZGVidWcsICJQT1JUICV1LiV1LiV1LiV1OiVkIGRldGVjdGVkXG4iLAorCQkgIE5JUFFVQUQodG8pLCBudG9ocyhwb3J0KSk7CisKKwkvKiBQYXNzaXZlIG1vZGUgb2ZmICovCisJY3AtPmFwcF9kYXRhID0gTlVMTDsKKworCS8qCisJICogTm93IHVwZGF0ZSBvciBjcmVhdGUgYSBjb25uZWN0aW9uIGVudHJ5IGZvciBpdAorCSAqLworCUlQX1ZTX0RCRygxLWRlYnVnLCAicHJvdG9jb2wgJXMgJXUuJXUuJXUuJXU6JWQgJXUuJXUuJXUuJXU6JWRcbiIsCisJCSAgaXBfdnNfcHJvdG9fbmFtZShpcGgtPnByb3RvY29sKSwKKwkJICBOSVBRVUFEKHRvKSwgbnRvaHMocG9ydCksIE5JUFFVQUQoY3AtPnZhZGRyKSwgMCk7CisKKwluX2NwID0gaXBfdnNfY29ubl9pbl9nZXQoaXBoLT5wcm90b2NvbCwKKwkJCQkgdG8sIHBvcnQsCisJCQkJIGNwLT52YWRkciwgaHRvbnMobnRvaHMoY3AtPnZwb3J0KS0xKSk7CisJaWYgKCFuX2NwKSB7CisJCW5fY3AgPSBpcF92c19jb25uX25ldyhJUFBST1RPX1RDUCwKKwkJCQkgICAgICB0bywgcG9ydCwKKwkJCQkgICAgICBjcC0+dmFkZHIsIGh0b25zKG50b2hzKGNwLT52cG9ydCktMSksCisJCQkJICAgICAgY3AtPmRhZGRyLCBodG9ucyhudG9ocyhjcC0+ZHBvcnQpLTEpLAorCQkJCSAgICAgIDAsCisJCQkJICAgICAgY3AtPmRlc3QpOworCQlpZiAoIW5fY3ApCisJCQlyZXR1cm4gMDsKKworCQkvKiBhZGQgaXRzIGNvbnRyb2xsZXIgKi8KKwkJaXBfdnNfY29udHJvbF9hZGQobl9jcCwgY3ApOworCX0KKworCS8qCisJICoJTW92ZSB0dW5uZWwgdG8gbGlzdGVuIHN0YXRlCisJICovCisJaXBfdnNfdGNwX2Nvbm5fbGlzdGVuKG5fY3ApOworCWlwX3ZzX2Nvbm5fcHV0KG5fY3ApOworCisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIHN0cnVjdCBpcF92c19hcHAgaXBfdnNfZnRwID0geworCS5uYW1lID0JCSJmdHAiLAorCS50eXBlID0JCUlQX1ZTX0FQUF9UWVBFX0ZUUCwKKwkucHJvdG9jb2wgPQlJUFBST1RPX1RDUCwKKwkubW9kdWxlID0JVEhJU19NT0RVTEUsCisJLmluY3NfbGlzdCA9CUxJU1RfSEVBRF9JTklUKGlwX3ZzX2Z0cC5pbmNzX2xpc3QpLAorCS5pbml0X2Nvbm4gPQlpcF92c19mdHBfaW5pdF9jb25uLAorCS5kb25lX2Nvbm4gPQlpcF92c19mdHBfZG9uZV9jb25uLAorCS5iaW5kX2Nvbm4gPQlOVUxMLAorCS51bmJpbmRfY29ubiA9CU5VTEwsCisJLnBrdF9vdXQgPQlpcF92c19mdHBfb3V0LAorCS5wa3RfaW4gPQlpcF92c19mdHBfaW4sCit9OworCisKKy8qCisgKglpcF92c19mdHAgaW5pdGlhbGl6YXRpb24KKyAqLworc3RhdGljIGludCBfX2luaXQgaXBfdnNfZnRwX2luaXQodm9pZCkKK3sKKwlpbnQgaSwgcmV0OworCXN0cnVjdCBpcF92c19hcHAgKmFwcCA9ICZpcF92c19mdHA7CisKKwlyZXQgPSByZWdpc3Rlcl9pcF92c19hcHAoYXBwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpPTA7IGk8SVBfVlNfQVBQX01BWF9QT1JUUzsgaSsrKSB7CisJCWlmICghcG9ydHNbaV0pCisJCQljb250aW51ZTsKKwkJcmV0ID0gcmVnaXN0ZXJfaXBfdnNfYXBwX2luYyhhcHAsIGFwcC0+cHJvdG9jb2wsIHBvcnRzW2ldKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCQlJUF9WU19EQkcoMS1kZWJ1ZywgIiVzOiBsb2FkZWQgc3VwcG9ydCBvbiBwb3J0WyVkXSA9ICVkXG4iLAorCQkJICBhcHAtPm5hbWUsIGksIHBvcnRzW2ldKTsKKwl9CisKKwlpZiAocmV0KQorCQl1bnJlZ2lzdGVyX2lwX3ZzX2FwcChhcHApOworCisJcmV0dXJuIHJldDsKK30KKworCisvKgorICoJaXBfdnNfZnRwIGZpbmlzaC4KKyAqLworc3RhdGljIHZvaWQgX19leGl0IGlwX3ZzX2Z0cF9leGl0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9pcF92c19hcHAoJmlwX3ZzX2Z0cCk7Cit9CisKKworbW9kdWxlX2luaXQoaXBfdnNfZnRwX2luaXQpOworbW9kdWxlX2V4aXQoaXBfdnNfZnRwX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19sYmxjLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2xibGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDM1ODM4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c19sYmxjLmMKQEAgLTAsMCArMSw2MjQgQEAKKy8qCisgKiBJUFZTOiAgICAgICAgTG9jYWxpdHktQmFzZWQgTGVhc3QtQ29ubmVjdGlvbiBzY2hlZHVsaW5nIG1vZHVsZQorICoKKyAqIFZlcnNpb246ICAgICAkSWQ6IGlwX3ZzX2xibGMuYyx2IDEuMTAgMjAwMi8wOS8xNSAwODoxNDowOCB3ZW5zb25nIEV4cCAkCisgKgorICogQXV0aG9yczogICAgIFdlbnNvbmcgWmhhbmcgPHdlbnNvbmdAZ251Y2hpbmEub3JnPgorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENoYW5nZXM6CisgKiAgICAgTWFydGluIEhhbWlsdG9uICAgICAgICAgOiAgICBmaXhlZCB0aGUgdGVycmlibGUgbG9ja2luZyBidWdzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxvY2sodGJsLT5sb2NrKSA9PT4gKmxvY2soJnRibC0+bG9jaykKKyAqICAgICBXZW5zb25nIFpoYW5nICAgICAgICAgICA6ICAgIGZpeGVkIHRoZSB1bmluaXRpbGl6ZWQgdGJsLT5sb2NrIGJ1ZworICogICAgIFdlbnNvbmcgWmhhbmcgICAgICAgICAgIDogICAgYWRkZWQgZG9pbmcgZnVsbCBleHBpcmF0aW9uIGNoZWNrIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdCBzdGFsZSBlbnRyaWVzIG9mIDI0KyBob3VycyB3aGVuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gcGFydGlhbCBleHBpcmUgY2hlY2sgaW4gYSBoYWxmIGhvdXIKKyAqICAgICBKdWxpYW4gQW5hc3Rhc292ICAgICAgICA6ICAgIHJlcGxhY2VkIGRlbF90aW1lciBjYWxsIHdpdGggZGVsX3RpbWVyX3N5bmMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcG9zc2libGUgcmFjZSBiZXR3ZWVuIHRpbWVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciBhbmQgZGVsX3RpbWVyIHRocmVhZCBpbiBTTVAKKyAqCisgKi8KKworLyoKKyAqIFRoZSBsYmxjIGFsZ29yaXRobSBpcyBhcyBmb2xsb3dzIChwc2V1ZG8gY29kZSk6CisgKgorICogICAgICAgaWYgY2FjaGVub2RlW2Rlc3RfaXBdIGlzIG51bGwgdGhlbgorICogICAgICAgICAgICAgICBuLCBjYWNoZW5vZGVbZGVzdF9pcF0gPC0ge3dlaWdodGVkIGxlYXN0LWNvbm4gbm9kZX07CisgKiAgICAgICBlbHNlCisgKiAgICAgICAgICAgICAgIG4gPC0gY2FjaGVub2RlW2Rlc3RfaXBdOworICogICAgICAgICAgICAgICBpZiAobiBpcyBkZWFkKSBPUgorICogICAgICAgICAgICAgICAgICAobi5jb25ucz5uLndlaWdodCBBTkQKKyAqICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIGEgbm9kZSBtIHdpdGggbS5jb25uczxtLndlaWdodC8yKSB0aGVuCisgKiAgICAgICAgICAgICAgICAgbiwgY2FjaGVub2RlW2Rlc3RfaXBdIDwtIHt3ZWlnaHRlZCBsZWFzdC1jb25uIG5vZGV9OworICoKKyAqICAgICAgIHJldHVybiBuOworICoKKyAqIFRoYW5rcyBtdXN0IGdvIHRvIFdlbnpodW8gWmhhbmcgZm9yIHRhbGtpbmcgV0NDUCB0byBtZSBhbmQgcHVzaGluZworICogbWUgdG8gd3JpdGUgdGhpcyBtb2R1bGUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisvKiBmb3Igc3lzY3RsICovCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKworI2luY2x1ZGUgPG5ldC9pcF92cy5oPgorCisKKy8qCisgKiAgICBJdCBpcyBmb3IgZ2FyYmFnZSBjb2xsZWN0aW9uIG9mIHN0YWxlIElQVlMgbGJsYyBlbnRyaWVzLAorICogICAgd2hlbiB0aGUgdGFibGUgaXMgZnVsbC4KKyAqLworI2RlZmluZSBDSEVDS19FWFBJUkVfSU5URVJWQUwgICAoNjAqSFopCisjZGVmaW5lIEVOVFJZX1RJTUVPVVQgICAgICAgICAgICg2KjYwKkhaKQorCisvKgorICogICAgSXQgaXMgZm9yIGZ1bGwgZXhwaXJhdGlvbiBjaGVjay4KKyAqICAgIFdoZW4gdGhlcmUgaXMgbm8gcGFydGlhbCBleHBpcmF0aW9uIGNoZWNrIChnYXJiYWdlIGNvbGxlY3Rpb24pCisgKiAgICBpbiBhIGhhbGYgaG91ciwgZG8gYSBmdWxsIGV4cGlyYXRpb24gY2hlY2sgdG8gY29sbGVjdCBzdGFsZQorICogICAgZW50cmllcyB0aGF0IGhhdmVuJ3QgYmVlbiB0b3VjaGVkIGZvciBhIGRheS4KKyAqLworI2RlZmluZSBDT1VOVF9GT1JfRlVMTF9FWFBJUkFUSU9OICAgMzAKK3N0YXRpYyBpbnQgc3lzY3RsX2lwX3ZzX2xibGNfZXhwaXJhdGlvbiA9IDI0KjYwKjYwKkhaOworCisKKy8qCisgKiAgICAgZm9yIElQVlMgbGJsYyBlbnRyeSBoYXNoIHRhYmxlCisgKi8KKyNpZm5kZWYgQ09ORklHX0lQX1ZTX0xCTENfVEFCX0JJVFMKKyNkZWZpbmUgQ09ORklHX0lQX1ZTX0xCTENfVEFCX0JJVFMgICAgICAxMAorI2VuZGlmCisjZGVmaW5lIElQX1ZTX0xCTENfVEFCX0JJVFMgICAgIENPTkZJR19JUF9WU19MQkxDX1RBQl9CSVRTCisjZGVmaW5lIElQX1ZTX0xCTENfVEFCX1NJWkUgICAgICgxIDw8IElQX1ZTX0xCTENfVEFCX0JJVFMpCisjZGVmaW5lIElQX1ZTX0xCTENfVEFCX01BU0sgICAgIChJUF9WU19MQkxDX1RBQl9TSVpFIC0gMSkKKworCisvKgorICogICAgICBJUFZTIGxibGMgZW50cnkgcmVwcmVzZW50cyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIGRlc3RpbmF0aW9uCisgKiAgICAgIElQIGFkZHJlc3MgYW5kIGl0cyBkZXN0aW5hdGlvbiBzZXJ2ZXIKKyAqLworc3RydWN0IGlwX3ZzX2xibGNfZW50cnkgeworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgIGxpc3Q7CisJX191MzIgICAgICAgICAgICAgICAgICAgYWRkcjsgICAgICAgICAgIC8qIGRlc3RpbmF0aW9uIElQIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgaXBfdnNfZGVzdCAgICAgICAqZGVzdDsgICAgICAgICAgLyogcmVhbCBzZXJ2ZXIgKGNhY2hlKSAqLworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIGxhc3R1c2U7ICAgICAgICAvKiBsYXN0IHVzZWQgdGltZSAqLworfTsKKworCisvKgorICogICAgICBJUFZTIGxibGMgaGFzaCB0YWJsZQorICovCitzdHJ1Y3QgaXBfdnNfbGJsY190YWJsZSB7CisJcndsb2NrX3QJICAgICAgICBsb2NrOyAgICAgICAgICAgLyogbG9jayBmb3IgdGhpcyB0YWJsZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgIGJ1Y2tldFtJUF9WU19MQkxDX1RBQl9TSVpFXTsgIC8qIGhhc2ggYnVja2V0ICovCisJYXRvbWljX3QgICAgICAgICAgICAgICAgZW50cmllczsgICAgICAgIC8qIG51bWJlciBvZiBlbnRyaWVzICovCisJaW50ICAgICAgICAgICAgICAgICAgICAgbWF4X3NpemU7ICAgICAgIC8qIG1heGltdW0gc2l6ZSBvZiBlbnRyaWVzICovCisJc3RydWN0IHRpbWVyX2xpc3QgICAgICAgcGVyaW9kaWNfdGltZXI7IC8qIGNvbGxlY3Qgc3RhbGUgZW50cmllcyAqLworCWludCAgICAgICAgICAgICAgICAgICAgIHJvdmVyOyAgICAgICAgICAvKiByb3ZlciBmb3IgZXhwaXJlIGNoZWNrICovCisJaW50ICAgICAgICAgICAgICAgICAgICAgY291bnRlcjsgICAgICAgIC8qIGNvdW50ZXIgZm9yIG5vIGV4cGlyZSAqLworfTsKKworCisvKgorICogICAgICBJUFZTIExCTEMgc3lzY3RsIHRhYmxlCisgKi8KKworc3RhdGljIGN0bF90YWJsZSB2c192YXJzX3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9WU19MQkxDX0VYUElSRSwKKwkJLnByb2NuYW1lCT0gImxibGNfZXhwaXJhdGlvbiIsCisJCS5kYXRhCQk9ICZzeXNjdGxfaXBfdnNfbGJsY19leHBpcmF0aW9uLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LCAKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIGN0bF90YWJsZSB2c190YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfVlMsCisJCS5wcm9jbmFtZQk9ICJ2cyIsCisJCS5tb2RlCQk9IDA1NTUsIAorCQkuY2hpbGQJCT0gdnNfdmFyc190YWJsZQorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3N0YXRpYyBjdGxfdGFibGUgaXB2NF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjQsCisJCS5wcm9jbmFtZQk9ICJpcHY0IiwgCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSB2c190YWJsZQorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3N0YXRpYyBjdGxfdGFibGUgbGJsY19yb290X3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBDVExfTkVULAorCQkucHJvY25hbWUJPSAibmV0IiwgCisJCS5tb2RlCQk9IDA1NTUsIAorCQkuY2hpbGQJCT0gaXB2NF90YWJsZQorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqIHN5c2N0bF9oZWFkZXI7CisKKy8qCisgKiAgICAgIG5ldy9mcmVlIGEgaXBfdnNfbGJsY19lbnRyeSwgd2hpY2ggaXMgYSBtYXBwaW5nIG9mIGEgZGVzdGlvbmF0aW9uCisgKiAgICAgIElQIGFkZHJlc3MgdG8gYSBzZXJ2ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwX3ZzX2xibGNfZW50cnkgKgoraXBfdnNfbGJsY19uZXcoX191MzIgZGFkZHIsIHN0cnVjdCBpcF92c19kZXN0ICpkZXN0KQoreworCXN0cnVjdCBpcF92c19sYmxjX2VudHJ5ICplbjsKKworCWVuID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwX3ZzX2xibGNfZW50cnkpLCBHRlBfQVRPTUlDKTsKKwlpZiAoZW4gPT0gTlVMTCkgeworCQlJUF9WU19FUlIoImlwX3ZzX2xibGNfbmV3KCk6IG5vIG1lbW9yeVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCUlOSVRfTElTVF9IRUFEKCZlbi0+bGlzdCk7CisJZW4tPmFkZHIgPSBkYWRkcjsKKworCWF0b21pY19pbmMoJmRlc3QtPnJlZmNudCk7CisJZW4tPmRlc3QgPSBkZXN0OworCisJcmV0dXJuIGVuOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcF92c19sYmxjX2ZyZWUoc3RydWN0IGlwX3ZzX2xibGNfZW50cnkgKmVuKQoreworCWxpc3RfZGVsKCZlbi0+bGlzdCk7CisJLyoKKwkgKiBXZSBkb24ndCBrZnJlZSBkZXN0IGJlY2F1c2UgaXQgaXMgcmVmZXJlZCBlaXRoZXIgYnkgaXRzIHNlcnZpY2UKKwkgKiBvciB0aGUgdHJhc2ggZGVzdCBsaXN0LgorCSAqLworCWF0b21pY19kZWMoJmVuLT5kZXN0LT5yZWZjbnQpOworCWtmcmVlKGVuKTsKK30KKworCisvKgorICoJUmV0dXJucyBoYXNoIHZhbHVlIGZvciBJUFZTIExCTEMgZW50cnkKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpcF92c19sYmxjX2hhc2hrZXkoX191MzIgYWRkcikKK3sKKwlyZXR1cm4gKG50b2hsKGFkZHIpKjI2NTQ0MzU3NjFVTCkgJiBJUF9WU19MQkxDX1RBQl9NQVNLOworfQorCisKKy8qCisgKglIYXNoIGFuIGVudHJ5IGluIHRoZSBpcF92c19sYmxjX3RhYmxlLgorICoJcmV0dXJucyBib29sIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQKK2lwX3ZzX2xibGNfaGFzaChzdHJ1Y3QgaXBfdnNfbGJsY190YWJsZSAqdGJsLCBzdHJ1Y3QgaXBfdnNfbGJsY19lbnRyeSAqZW4pCit7CisJdW5zaWduZWQgaGFzaDsKKworCWlmICghbGlzdF9lbXB0eSgmZW4tPmxpc3QpKSB7CisJCUlQX1ZTX0VSUigiaXBfdnNfbGJsY19oYXNoKCk6IHJlcXVlc3QgZm9yIGFscmVhZHkgaGFzaGVkLCAiCisJCQkgICJjYWxsZWQgZnJvbSAlcFxuIiwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKglIYXNoIGJ5IGRlc3RpbmF0aW9uIElQIGFkZHJlc3MKKwkgKi8KKwloYXNoID0gaXBfdnNfbGJsY19oYXNoa2V5KGVuLT5hZGRyKTsKKworCXdyaXRlX2xvY2soJnRibC0+bG9jayk7CisJbGlzdF9hZGQoJmVuLT5saXN0LCAmdGJsLT5idWNrZXRbaGFzaF0pOworCWF0b21pY19pbmMoJnRibC0+ZW50cmllcyk7CisJd3JpdGVfdW5sb2NrKCZ0YmwtPmxvY2spOworCisJcmV0dXJuIDE7Cit9CisKKworI2lmIDAwMDAKKy8qCisgKglVbmhhc2ggaXBfdnNfbGJsY19lbnRyeSBmcm9tIGlwX3ZzX2xibGNfdGFibGUuCisgKglyZXR1cm5zIGJvb2wgc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBpcF92c19sYmxjX3VuaGFzaChzdHJ1Y3QgaXBfdnNfbGJsY190YWJsZSAqdGJsLAorCQkJICAgICBzdHJ1Y3QgaXBfdnNfbGJsY19lbnRyeSAqZW4pCit7CisJaWYgKGxpc3RfZW1wdHkoJmVuLT5saXN0KSkgeworCQlJUF9WU19FUlIoImlwX3ZzX2xibGNfdW5oYXNoKCk6IHJlcXVlc3QgZm9yIG5vdCBoYXNoZWQgZW50cnksICIKKwkJCSAgImNhbGxlZCBmcm9tICVwXG4iLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFJlbW92ZSBpdCBmcm9tIHRoZSB0YWJsZQorCSAqLworCXdyaXRlX2xvY2soJnRibC0+bG9jayk7CisJbGlzdF9kZWwoJmVuLT5saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZW4tPmxpc3QpOworCXdyaXRlX3VubG9jaygmdGJsLT5sb2NrKTsKKworCXJldHVybiAxOworfQorI2VuZGlmCisKKworLyoKKyAqICBHZXQgaXBfdnNfbGJsY19lbnRyeSBhc3NvY2lhdGVkIHdpdGggc3VwcGxpZWQgcGFyYW1ldGVycy4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfdnNfbGJsY19lbnRyeSAqCitpcF92c19sYmxjX2dldChzdHJ1Y3QgaXBfdnNfbGJsY190YWJsZSAqdGJsLCBfX3UzMiBhZGRyKQoreworCXVuc2lnbmVkIGhhc2g7CisJc3RydWN0IGlwX3ZzX2xibGNfZW50cnkgKmVuOworCisJaGFzaCA9IGlwX3ZzX2xibGNfaGFzaGtleShhZGRyKTsKKworCXJlYWRfbG9jaygmdGJsLT5sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW4sICZ0YmwtPmJ1Y2tldFtoYXNoXSwgbGlzdCkgeworCQlpZiAoZW4tPmFkZHIgPT0gYWRkcikgeworCQkJLyogSElUICovCisJCQlyZWFkX3VubG9jaygmdGJsLT5sb2NrKTsKKwkJCXJldHVybiBlbjsKKwkJfQorCX0KKworCXJlYWRfdW5sb2NrKCZ0YmwtPmxvY2spOworCisJcmV0dXJuIE5VTEw7Cit9CisKKworLyoKKyAqICAgICAgRmx1c2ggYWxsIHRoZSBlbnRyaWVzIG9mIHRoZSBzcGVjaWZpZWQgdGFibGUuCisgKi8KK3N0YXRpYyB2b2lkIGlwX3ZzX2xibGNfZmx1c2goc3RydWN0IGlwX3ZzX2xibGNfdGFibGUgKnRibCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaXBfdnNfbGJsY19lbnRyeSAqZW4sICpueHQ7CisKKwlmb3IgKGk9MDsgaTxJUF9WU19MQkxDX1RBQl9TSVpFOyBpKyspIHsKKwkJd3JpdGVfbG9jaygmdGJsLT5sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVuLCBueHQsICZ0YmwtPmJ1Y2tldFtpXSwgbGlzdCkgeworCQkJaXBfdnNfbGJsY19mcmVlKGVuKTsKKwkJCWF0b21pY19kZWMoJnRibC0+ZW50cmllcyk7CisJCX0KKwkJd3JpdGVfdW5sb2NrKCZ0YmwtPmxvY2spOworCX0KK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgaXBfdnNfbGJsY19mdWxsX2NoZWNrKHN0cnVjdCBpcF92c19sYmxjX3RhYmxlICp0YmwpCit7CisJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOworCWludCBpLCBqOworCXN0cnVjdCBpcF92c19sYmxjX2VudHJ5ICplbiwgKm54dDsKKworCWZvciAoaT0wLCBqPXRibC0+cm92ZXI7IGk8SVBfVlNfTEJMQ19UQUJfU0laRTsgaSsrKSB7CisJCWogPSAoaiArIDEpICYgSVBfVlNfTEJMQ19UQUJfTUFTSzsKKworCQl3cml0ZV9sb2NrKCZ0YmwtPmxvY2spOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW4sIG54dCwgJnRibC0+YnVja2V0W2pdLCBsaXN0KSB7CisJCQlpZiAodGltZV9iZWZvcmUobm93LCAKKwkJCQkJZW4tPmxhc3R1c2UgKyBzeXNjdGxfaXBfdnNfbGJsY19leHBpcmF0aW9uKSkKKwkJCQljb250aW51ZTsKKworCQkJaXBfdnNfbGJsY19mcmVlKGVuKTsKKwkJCWF0b21pY19kZWMoJnRibC0+ZW50cmllcyk7CisJCX0KKwkJd3JpdGVfdW5sb2NrKCZ0YmwtPmxvY2spOworCX0KKwl0YmwtPnJvdmVyID0gajsKK30KKworCisvKgorICogICAgICBQZXJpb2RpY2FsIHRpbWVyIGhhbmRsZXIgZm9yIElQVlMgbGJsYyB0YWJsZQorICogICAgICBJdCBpcyB1c2VkIHRvIGNvbGxlY3Qgc3RhbGUgZW50cmllcyB3aGVuIHRoZSBudW1iZXIgb2YgZW50cmllcworICogICAgICBleGNlZWRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHRhYmxlLgorICoKKyAqICAgICAgRml4bWU6IHdlIHByb2JhYmx5IG5lZWQgbW9yZSBjb21wbGljYXRlZCBhbGdvcml0aG0gdG8gY29sbGVjdAorICogICAgICAgICAgICAgZW50cmllcyB0aGF0IGhhdmUgbm90IGJlZW4gdXNlZCBmb3IgYSBsb25nIHRpbWUgZXZlbgorICogICAgICAgICAgICAgaWYgdGhlIG51bWJlciBvZiBlbnRyaWVzIGRvZXNuJ3QgZXhjZWVkIHRoZSBtYXhpbXVtIHNpemUKKyAqICAgICAgICAgICAgIG9mIHRoZSB0YWJsZS4KKyAqICAgICAgVGhlIGZ1bGwgZXhwaXJhdGlvbiBjaGVjayBpcyBmb3IgdGhpcyBwdXJwb3NlIG5vdy4KKyAqLworc3RhdGljIHZvaWQgaXBfdnNfbGJsY19jaGVja19leHBpcmUodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBpcF92c19sYmxjX3RhYmxlICp0Ymw7CisJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOworCWludCBnb2FsOworCWludCBpLCBqOworCXN0cnVjdCBpcF92c19sYmxjX2VudHJ5ICplbiwgKm54dDsKKworCXRibCA9IChzdHJ1Y3QgaXBfdnNfbGJsY190YWJsZSAqKWRhdGE7CisKKwlpZiAoKHRibC0+Y291bnRlciAlIENPVU5UX0ZPUl9GVUxMX0VYUElSQVRJT04pID09IDApIHsKKwkJLyogZG8gZnVsbCBleHBpcmF0aW9uIGNoZWNrICovCisJCWlwX3ZzX2xibGNfZnVsbF9jaGVjayh0YmwpOworCQl0YmwtPmNvdW50ZXIgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYXRvbWljX3JlYWQoJnRibC0+ZW50cmllcykgPD0gdGJsLT5tYXhfc2l6ZSkgeworCQl0YmwtPmNvdW50ZXIrKzsKKwkJZ290byBvdXQ7CisJfQorCisJZ29hbCA9IChhdG9taWNfcmVhZCgmdGJsLT5lbnRyaWVzKSAtIHRibC0+bWF4X3NpemUpKjQvMzsKKwlpZiAoZ29hbCA+IHRibC0+bWF4X3NpemUvMikKKwkJZ29hbCA9IHRibC0+bWF4X3NpemUvMjsKKworCWZvciAoaT0wLCBqPXRibC0+cm92ZXI7IGk8SVBfVlNfTEJMQ19UQUJfU0laRTsgaSsrKSB7CisJCWogPSAoaiArIDEpICYgSVBfVlNfTEJMQ19UQUJfTUFTSzsKKworCQl3cml0ZV9sb2NrKCZ0YmwtPmxvY2spOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW4sIG54dCwgJnRibC0+YnVja2V0W2pdLCBsaXN0KSB7CisJCQlpZiAodGltZV9iZWZvcmUobm93LCBlbi0+bGFzdHVzZSArIEVOVFJZX1RJTUVPVVQpKQorCQkJCWNvbnRpbnVlOworCisJCQlpcF92c19sYmxjX2ZyZWUoZW4pOworCQkJYXRvbWljX2RlYygmdGJsLT5lbnRyaWVzKTsKKwkJCWdvYWwtLTsKKwkJfQorCQl3cml0ZV91bmxvY2soJnRibC0+bG9jayk7CisJCWlmIChnb2FsIDw9IDApCisJCQlicmVhazsKKwl9CisJdGJsLT5yb3ZlciA9IGo7CisKKyAgb3V0OgorCW1vZF90aW1lcigmdGJsLT5wZXJpb2RpY190aW1lciwgamlmZmllcytDSEVDS19FWFBJUkVfSU5URVJWQUwpOworfQorCisKK3N0YXRpYyBpbnQgaXBfdnNfbGJsY19pbml0X3N2YyhzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQoreworCWludCBpOworCXN0cnVjdCBpcF92c19sYmxjX3RhYmxlICp0Ymw7CisKKwkvKgorCSAqICAgIEFsbG9jYXRlIHRoZSBpcF92c19sYmxjX3RhYmxlIGZvciB0aGlzIHNlcnZpY2UKKwkgKi8KKwl0YmwgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXBfdnNfbGJsY190YWJsZSksIEdGUF9BVE9NSUMpOworCWlmICh0YmwgPT0gTlVMTCkgeworCQlJUF9WU19FUlIoImlwX3ZzX2xibGNfaW5pdF9zdmMoKTogbm8gbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXN2Yy0+c2NoZWRfZGF0YSA9IHRibDsKKwlJUF9WU19EQkcoNiwgIkxCTEMgaGFzaCB0YWJsZSAobWVtb3J5PSVaZGJ5dGVzKSBhbGxvY2F0ZWQgZm9yICIKKwkJICAiY3VycmVudCBzZXJ2aWNlXG4iLAorCQkgIHNpemVvZihzdHJ1Y3QgaXBfdnNfbGJsY190YWJsZSkpOworCisJLyoKKwkgKiAgICBJbml0aWFsaXplIHRoZSBoYXNoIGJ1Y2tldHMKKwkgKi8KKwlmb3IgKGk9MDsgaTxJUF9WU19MQkxDX1RBQl9TSVpFOyBpKyspIHsKKwkJSU5JVF9MSVNUX0hFQUQoJnRibC0+YnVja2V0W2ldKTsKKwl9CisJcndsb2NrX2luaXQoJnRibC0+bG9jayk7CisJdGJsLT5tYXhfc2l6ZSA9IElQX1ZTX0xCTENfVEFCX1NJWkUqMTY7CisJdGJsLT5yb3ZlciA9IDA7CisJdGJsLT5jb3VudGVyID0gMTsKKworCS8qCisJICogICAgSG9vayBwZXJpb2RpYyB0aW1lciBmb3IgZ2FyYmFnZSBjb2xsZWN0aW9uCisJICovCisJaW5pdF90aW1lcigmdGJsLT5wZXJpb2RpY190aW1lcik7CisJdGJsLT5wZXJpb2RpY190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpdGJsOworCXRibC0+cGVyaW9kaWNfdGltZXIuZnVuY3Rpb24gPSBpcF92c19sYmxjX2NoZWNrX2V4cGlyZTsKKwl0YmwtPnBlcmlvZGljX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzK0NIRUNLX0VYUElSRV9JTlRFUlZBTDsKKwlhZGRfdGltZXIoJnRibC0+cGVyaW9kaWNfdGltZXIpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpcF92c19sYmxjX2RvbmVfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCit7CisJc3RydWN0IGlwX3ZzX2xibGNfdGFibGUgKnRibCA9IHN2Yy0+c2NoZWRfZGF0YTsKKworCS8qIHJlbW92ZSBwZXJpb2RpYyB0aW1lciAqLworCWRlbF90aW1lcl9zeW5jKCZ0YmwtPnBlcmlvZGljX3RpbWVyKTsKKworCS8qIGdvdCB0byBjbGVhbiB1cCB0YWJsZSBlbnRyaWVzIGhlcmUgKi8KKwlpcF92c19sYmxjX2ZsdXNoKHRibCk7CisKKwkvKiByZWxlYXNlIHRoZSB0YWJsZSBpdHNlbGYgKi8KKwlrZnJlZShzdmMtPnNjaGVkX2RhdGEpOworCUlQX1ZTX0RCRyg2LCAiTEJMQyBoYXNoIHRhYmxlIChtZW1vcnk9JVpkYnl0ZXMpIHJlbGVhc2VkXG4iLAorCQkgIHNpemVvZihzdHJ1Y3QgaXBfdnNfbGJsY190YWJsZSkpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpcF92c19sYmxjX3VwZGF0ZV9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpcF92c19kZXN0ICoKK19faXBfdnNfd2xjX3NjaGVkdWxlKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsIHN0cnVjdCBpcGhkciAqaXBoKQoreworCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0LCAqbGVhc3Q7CisJaW50IGxvaCwgZG9oOworCisJLyoKKwkgKiBXZSB0aGluayB0aGUgb3ZlcmhlYWQgb2YgcHJvY2Vzc2luZyBhY3RpdmUgY29ubmVjdGlvbnMgaXMgZmlmdHkKKwkgKiB0aW1lcyBoaWdoZXIgdGhhbiB0aGF0IG9mIGluYWN0aXZlIGNvbm5lY3Rpb25zIGluIGF2ZXJhZ2UuIChUaGlzCisJICogZmlmdHkgdGltZXMgbWlnaHQgbm90IGJlIGFjY3VyYXRlLCB3ZSB3aWxsIGNoYW5nZSBpdCBsYXRlci4pIFdlCisJICogdXNlIHRoZSBmb2xsb3dpbmcgZm9ybXVsYSB0byBlc3RpbWF0ZSB0aGUgb3ZlcmhlYWQ6CisJICogICAgICAgICAgICAgICAgZGVzdC0+YWN0aXZlY29ubnMqNTAgKyBkZXN0LT5pbmFjdGNvbm5zCisJICogYW5kIHRoZSBsb2FkOgorCSAqICAgICAgICAgICAgICAgIChkZXN0IG92ZXJoZWFkKSAvIGRlc3QtPndlaWdodAorCSAqCisJICogUmVtZW1iZXIgLS0gbm8gZmxvYXRzIGluIGtlcm5lbCBtb2RlISEhCisJICogVGhlIGNvbXBhcmlzb24gb2YgaDEqdzIgPiBoMip3MSBpcyBlcXVpdmFsZW50IHRvIHRoYXQgb2YKKwkgKiAgICAgICAgICAgICAgICBoMS93MSA+IGgyL3cyCisJICogaWYgZXZlcnkgd2VpZ2h0IGlzIGxhcmdlciB0aGFuIHplcm8uCisJICoKKwkgKiBUaGUgc2VydmVyIHdpdGggd2VpZ2h0PTAgaXMgcXVpZXNjZWQgYW5kIHdpbGwgbm90IHJlY2VpdmUgYW55CisJICogbmV3IGNvbm5lY3Rpb24uCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXN0LCAmc3ZjLT5kZXN0aW5hdGlvbnMsIG5fbGlzdCkgeworCQlpZiAoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfT1ZFUkxPQUQpCisJCQljb250aW51ZTsKKwkJaWYgKGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpID4gMCkgeworCQkJbGVhc3QgPSBkZXN0OworCQkJbG9oID0gYXRvbWljX3JlYWQoJmxlYXN0LT5hY3RpdmVjb25ucykgKiA1MAorCQkJCSsgYXRvbWljX3JlYWQoJmxlYXN0LT5pbmFjdGNvbm5zKTsKKwkJCWdvdG8gbmV4dHN0YWdlOworCQl9CisJfQorCXJldHVybiBOVUxMOworCisJLyoKKwkgKiAgICBGaW5kIHRoZSBkZXN0aW5hdGlvbiB3aXRoIHRoZSBsZWFzdCBsb2FkLgorCSAqLworICBuZXh0c3RhZ2U6CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZShkZXN0LCAmc3ZjLT5kZXN0aW5hdGlvbnMsIG5fbGlzdCkgeworCQlpZiAoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfT1ZFUkxPQUQpCisJCQljb250aW51ZTsKKworCQlkb2ggPSBhdG9taWNfcmVhZCgmZGVzdC0+YWN0aXZlY29ubnMpICogNTAKKwkJCSsgYXRvbWljX3JlYWQoJmRlc3QtPmluYWN0Y29ubnMpOworCQlpZiAobG9oICogYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkgPgorCQkgICAgZG9oICogYXRvbWljX3JlYWQoJmxlYXN0LT53ZWlnaHQpKSB7CisJCQlsZWFzdCA9IGRlc3Q7CisJCQlsb2ggPSBkb2g7CisJCX0KKwl9CisKKwlJUF9WU19EQkcoNiwgIkxCTEM6IHNlcnZlciAlZC4lZC4lZC4lZDolZCAiCisJCSAgImFjdGl2ZWNvbm5zICVkIHJlZmNudCAlZCB3ZWlnaHQgJWQgb3ZlcmhlYWQgJWRcbiIsCisJCSAgTklQUVVBRChsZWFzdC0+YWRkciksIG50b2hzKGxlYXN0LT5wb3J0KSwKKwkJICBhdG9taWNfcmVhZCgmbGVhc3QtPmFjdGl2ZWNvbm5zKSwKKwkJICBhdG9taWNfcmVhZCgmbGVhc3QtPnJlZmNudCksCisJCSAgYXRvbWljX3JlYWQoJmxlYXN0LT53ZWlnaHQpLCBsb2gpOworCisJcmV0dXJuIGxlYXN0OworfQorCisKKy8qCisgKiAgIElmIHRoaXMgZGVzdGluYXRpb24gc2VydmVyIGlzIG92ZXJsb2FkZWQgYW5kIHRoZXJlIGlzIGEgbGVzcyBsb2FkZWQKKyAqICAgc2VydmVyLCB0aGVuIHJldHVybiB0cnVlLgorICovCitzdGF0aWMgaW5saW5lIGludAoraXNfb3ZlcmxvYWRlZChzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCwgc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlpZiAoYXRvbWljX3JlYWQoJmRlc3QtPmFjdGl2ZWNvbm5zKSA+IGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpKSB7CisJCXN0cnVjdCBpcF92c19kZXN0ICpkOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJnN2Yy0+ZGVzdGluYXRpb25zLCBuX2xpc3QpIHsKKwkJCWlmIChhdG9taWNfcmVhZCgmZC0+YWN0aXZlY29ubnMpKjIKKwkJCSAgICA8IGF0b21pY19yZWFkKCZkLT53ZWlnaHQpKSB7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqICAgIExvY2FsaXR5LUJhc2VkICh3ZWlnaHRlZCkgTGVhc3QtQ29ubmVjdGlvbiBzY2hlZHVsaW5nCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfZGVzdCAqCitpcF92c19sYmxjX3NjaGVkdWxlKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3Q7CisJc3RydWN0IGlwX3ZzX2xibGNfdGFibGUgKnRibDsKKwlzdHJ1Y3QgaXBfdnNfbGJsY19lbnRyeSAqZW47CisJc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKworCUlQX1ZTX0RCRyg2LCAiaXBfdnNfbGJsY19zY2hlZHVsZSgpOiBTY2hlZHVsaW5nLi4uXG4iKTsKKworCXRibCA9IChzdHJ1Y3QgaXBfdnNfbGJsY190YWJsZSAqKXN2Yy0+c2NoZWRfZGF0YTsKKwllbiA9IGlwX3ZzX2xibGNfZ2V0KHRibCwgaXBoLT5kYWRkcik7CisJaWYgKGVuID09IE5VTEwpIHsKKwkJZGVzdCA9IF9faXBfdnNfd2xjX3NjaGVkdWxlKHN2YywgaXBoKTsKKwkJaWYgKGRlc3QgPT0gTlVMTCkgeworCQkJSVBfVlNfREJHKDEsICJubyBkZXN0aW5hdGlvbiBhdmFpbGFibGVcbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJZW4gPSBpcF92c19sYmxjX25ldyhpcGgtPmRhZGRyLCBkZXN0KTsKKwkJaWYgKGVuID09IE5VTEwpIHsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlwX3ZzX2xibGNfaGFzaCh0YmwsIGVuKTsKKwl9IGVsc2UgeworCQlkZXN0ID0gZW4tPmRlc3Q7CisJCWlmICghKGRlc3QtPmZsYWdzICYgSVBfVlNfREVTVF9GX0FWQUlMQUJMRSkKKwkJICAgIHx8IGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpIDw9IDAKKwkJICAgIHx8IGlzX292ZXJsb2FkZWQoZGVzdCwgc3ZjKSkgeworCQkJZGVzdCA9IF9faXBfdnNfd2xjX3NjaGVkdWxlKHN2YywgaXBoKTsKKwkJCWlmIChkZXN0ID09IE5VTEwpIHsKKwkJCQlJUF9WU19EQkcoMSwgIm5vIGRlc3RpbmF0aW9uIGF2YWlsYWJsZVxuIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlhdG9taWNfZGVjKCZlbi0+ZGVzdC0+cmVmY250KTsKKwkJCWF0b21pY19pbmMoJmRlc3QtPnJlZmNudCk7CisJCQllbi0+ZGVzdCA9IGRlc3Q7CisJCX0KKwl9CisJZW4tPmxhc3R1c2UgPSBqaWZmaWVzOworCisJSVBfVlNfREJHKDYsICJMQkxDOiBkZXN0aW5hdGlvbiBJUCBhZGRyZXNzICV1LiV1LiV1LiV1ICIKKwkJICAiLS0+IHNlcnZlciAldS4ldS4ldS4ldTolZFxuIiwKKwkJICBOSVBRVUFEKGVuLT5hZGRyKSwKKwkJICBOSVBRVUFEKGRlc3QtPmFkZHIpLAorCQkgIG50b2hzKGRlc3QtPnBvcnQpKTsKKworCXJldHVybiBkZXN0OworfQorCisKKy8qCisgKiAgICAgIElQVlMgTEJMQyBTY2hlZHVsZXIgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfc2NoZWR1bGVyIGlwX3ZzX2xibGNfc2NoZWR1bGVyID0KK3sKKwkubmFtZSA9CQkJImxibGMiLAorCS5yZWZjbnQgPQkJQVRPTUlDX0lOSVQoMCksCisJLm1vZHVsZSA9CQlUSElTX01PRFVMRSwKKwkuaW5pdF9zZXJ2aWNlID0JCWlwX3ZzX2xibGNfaW5pdF9zdmMsCisJLmRvbmVfc2VydmljZSA9CQlpcF92c19sYmxjX2RvbmVfc3ZjLAorCS51cGRhdGVfc2VydmljZSA9CWlwX3ZzX2xibGNfdXBkYXRlX3N2YywKKwkuc2NoZWR1bGUgPQkJaXBfdnNfbGJsY19zY2hlZHVsZSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgaXBfdnNfbGJsY19pbml0KHZvaWQpCit7CisJSU5JVF9MSVNUX0hFQUQoJmlwX3ZzX2xibGNfc2NoZWR1bGVyLm5fbGlzdCk7CisJc3lzY3RsX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZShsYmxjX3Jvb3RfdGFibGUsIDApOworCXJldHVybiByZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoJmlwX3ZzX2xibGNfc2NoZWR1bGVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgaXBfdnNfbGJsY19jbGVhbnVwKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoc3lzY3RsX2hlYWRlcik7CisJdW5yZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoJmlwX3ZzX2xibGNfc2NoZWR1bGVyKTsKK30KKworCittb2R1bGVfaW5pdChpcF92c19sYmxjX2luaXQpOworbW9kdWxlX2V4aXQoaXBfdnNfbGJsY19jbGVhbnVwKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfbGJsY3IuYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfbGJsY3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmI1ZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c19sYmxjci5jCkBAIC0wLDAgKzEsODg4IEBACisvKgorICogSVBWUzogICAgICAgIExvY2FsaXR5LUJhc2VkIExlYXN0LUNvbm5lY3Rpb24gd2l0aCBSZXBsaWNhdGlvbiBzY2hlZHVsZXIKKyAqCisgKiBWZXJzaW9uOiAgICAgJElkOiBpcF92c19sYmxjci5jLHYgMS4xMSAyMDAyLzA5LzE1IDA4OjE0OjA4IHdlbnNvbmcgRXhwICQKKyAqCisgKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BnbnVjaGluYS5vcmc+CisgKgorICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQ2hhbmdlczoKKyAqICAgICBKdWxpYW4gQW5hc3Rhc292ICAgICAgICA6ICAgIEFkZGVkIHRoZSBtaXNzaW5nIChkZXN0LT53ZWlnaHQ+MCkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiBpbiB0aGUgaXBfdnNfZGVzdF9zZXRfbWF4LgorICoKKyAqLworCisvKgorICogVGhlIGxibGMvciBhbGdvcml0aG0gaXMgYXMgZm9sbG93cyAocHNldWRvIGNvZGUpOgorICoKKyAqICAgICAgIGlmIHNlcnZlclNldFtkZXN0X2lwXSBpcyBudWxsIHRoZW4KKyAqICAgICAgICAgICAgICAgbiwgc2VydmVyU2V0W2Rlc3RfaXBdIDwtIHt3ZWlnaHRlZCBsZWFzdC1jb25uIG5vZGV9OworICogICAgICAgZWxzZQorICogICAgICAgICAgICAgICBuIDwtIHtsZWFzdC1jb25uIChhbGl2ZSkgbm9kZSBpbiBzZXJ2ZXJTZXRbZGVzdF9pcF19OworICogICAgICAgICAgICAgICBpZiAobiBpcyBudWxsKSBPUgorICogICAgICAgICAgICAgICAgICAobi5jb25ucz5uLndlaWdodCBBTkQKKyAqICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIGEgbm9kZSBtIHdpdGggbS5jb25uczxtLndlaWdodC8yKSB0aGVuCisgKiAgICAgICAgICAgICAgICAgICBuIDwtIHt3ZWlnaHRlZCBsZWFzdC1jb25uIG5vZGV9OworICogICAgICAgICAgICAgICAgICAgYWRkIG4gdG8gc2VydmVyU2V0W2Rlc3RfaXBdOworICogICAgICAgICAgICAgICBpZiB8c2VydmVyU2V0W2Rlc3RfaXBdfCA+IDEgQU5ECisgKiAgICAgICAgICAgICAgICAgICBub3cgLSBzZXJ2ZXJTZXRbZGVzdF9pcF0ubGFzdE1vZCA+IFQgdGhlbgorICogICAgICAgICAgICAgICAgICAgbSA8LSB7bW9zdCBjb25uIG5vZGUgaW4gc2VydmVyU2V0W2Rlc3RfaXBdfTsKKyAqICAgICAgICAgICAgICAgICAgIHJlbW92ZSBtIGZyb20gc2VydmVyU2V0W2Rlc3RfaXBdOworICogICAgICAgaWYgc2VydmVyU2V0W2Rlc3RfaXBdIGNoYW5nZWQgdGhlbgorICogICAgICAgICAgICAgICBzZXJ2ZXJTZXRbZGVzdF9pcF0ubGFzdE1vZCA8LSBub3c7CisgKgorICogICAgICAgcmV0dXJuIG47CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworLyogZm9yIHN5c2N0bCAqLworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisvKiBmb3IgcHJvY19uZXRfY3JlYXRlL3Byb2NfbmV0X3JlbW92ZSAqLworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworI2luY2x1ZGUgPG5ldC9pcF92cy5oPgorCisKKy8qCisgKiAgICBJdCBpcyBmb3IgZ2FyYmFnZSBjb2xsZWN0aW9uIG9mIHN0YWxlIElQVlMgbGJsY3IgZW50cmllcywKKyAqICAgIHdoZW4gdGhlIHRhYmxlIGlzIGZ1bGwuCisgKi8KKyNkZWZpbmUgQ0hFQ0tfRVhQSVJFX0lOVEVSVkFMICAgKDYwKkhaKQorI2RlZmluZSBFTlRSWV9USU1FT1VUICAgICAgICAgICAoNio2MCpIWikKKworLyoKKyAqICAgIEl0IGlzIGZvciBmdWxsIGV4cGlyYXRpb24gY2hlY2suCisgKiAgICBXaGVuIHRoZXJlIGlzIG5vIHBhcnRpYWwgZXhwaXJhdGlvbiBjaGVjayAoZ2FyYmFnZSBjb2xsZWN0aW9uKQorICogICAgaW4gYSBoYWxmIGhvdXIsIGRvIGEgZnVsbCBleHBpcmF0aW9uIGNoZWNrIHRvIGNvbGxlY3Qgc3RhbGUKKyAqICAgIGVudHJpZXMgdGhhdCBoYXZlbid0IGJlZW4gdG91Y2hlZCBmb3IgYSBkYXkuCisgKi8KKyNkZWZpbmUgQ09VTlRfRk9SX0ZVTExfRVhQSVJBVElPTiAgIDMwCitzdGF0aWMgaW50IHN5c2N0bF9pcF92c19sYmxjcl9leHBpcmF0aW9uID0gMjQqNjAqNjAqSFo7CisKKworLyoKKyAqICAgICBmb3IgSVBWUyBsYmxjciBlbnRyeSBoYXNoIHRhYmxlCisgKi8KKyNpZm5kZWYgQ09ORklHX0lQX1ZTX0xCTENSX1RBQl9CSVRTCisjZGVmaW5lIENPTkZJR19JUF9WU19MQkxDUl9UQUJfQklUUyAgICAgIDEwCisjZW5kaWYKKyNkZWZpbmUgSVBfVlNfTEJMQ1JfVEFCX0JJVFMgICAgIENPTkZJR19JUF9WU19MQkxDUl9UQUJfQklUUworI2RlZmluZSBJUF9WU19MQkxDUl9UQUJfU0laRSAgICAgKDEgPDwgSVBfVlNfTEJMQ1JfVEFCX0JJVFMpCisjZGVmaW5lIElQX1ZTX0xCTENSX1RBQl9NQVNLICAgICAoSVBfVlNfTEJMQ1JfVEFCX1NJWkUgLSAxKQorCisKKy8qCisgKiAgICAgIElQVlMgZGVzdGluYXRpb24gc2V0IHN0cnVjdHVyZSBhbmQgb3BlcmF0aW9ucworICovCitzdHJ1Y3QgaXBfdnNfZGVzdF9saXN0IHsKKwlzdHJ1Y3QgaXBfdnNfZGVzdF9saXN0ICAqbmV4dDsgICAgICAgICAgLyogbGlzdCBsaW5rICovCisJc3RydWN0IGlwX3ZzX2Rlc3QgICAgICAgKmRlc3Q7ICAgICAgICAgIC8qIGRlc3RpbmF0aW9uIHNlcnZlciAqLworfTsKKworc3RydWN0IGlwX3ZzX2Rlc3Rfc2V0IHsKKwlhdG9taWNfdCAgICAgICAgICAgICAgICBzaXplOyAgICAgICAgICAgLyogc2V0IHNpemUgKi8KKwl1bnNpZ25lZCBsb25nICAgICAgICAgICBsYXN0bW9kOyAgICAgICAgLyogbGFzdCBtb2RpZmllZCB0aW1lICovCisJc3RydWN0IGlwX3ZzX2Rlc3RfbGlzdCAgKmxpc3Q7ICAgICAgICAgIC8qIGRlc3RpbmF0aW9uIGxpc3QgKi8KKwlyd2xvY2tfdAkgICAgICAgIGxvY2s7ICAgICAgICAgICAvKiBsb2NrIGZvciB0aGlzIGxpc3QgKi8KK307CisKKworc3RhdGljIHN0cnVjdCBpcF92c19kZXN0X2xpc3QgKgoraXBfdnNfZGVzdF9zZXRfaW5zZXJ0KHN0cnVjdCBpcF92c19kZXN0X3NldCAqc2V0LCBzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCkKK3sKKwlzdHJ1Y3QgaXBfdnNfZGVzdF9saXN0ICplOworCisJZm9yIChlPXNldC0+bGlzdDsgZSE9TlVMTDsgZT1lLT5uZXh0KSB7CisJCWlmIChlLT5kZXN0ID09IGRlc3QpCisJCQkvKiBhbHJlYWR5IGV4aXN0ZWQgKi8KKwkJCXJldHVybiBOVUxMOworCX0KKworCWUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXBfdnNfZGVzdF9saXN0KSwgR0ZQX0FUT01JQyk7CisJaWYgKGUgPT0gTlVMTCkgeworCQlJUF9WU19FUlIoImlwX3ZzX2Rlc3Rfc2V0X2luc2VydCgpOiBubyBtZW1vcnlcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlhdG9taWNfaW5jKCZkZXN0LT5yZWZjbnQpOworCWUtPmRlc3QgPSBkZXN0OworCisJLyogbGluayBpdCB0byB0aGUgbGlzdCAqLworCXdyaXRlX2xvY2soJnNldC0+bG9jayk7CisJZS0+bmV4dCA9IHNldC0+bGlzdDsKKwlzZXQtPmxpc3QgPSBlOworCWF0b21pY19pbmMoJnNldC0+c2l6ZSk7CisJd3JpdGVfdW5sb2NrKCZzZXQtPmxvY2spOworCisJc2V0LT5sYXN0bW9kID0gamlmZmllczsKKwlyZXR1cm4gZTsKK30KKworc3RhdGljIHZvaWQKK2lwX3ZzX2Rlc3Rfc2V0X2VyYXNlKHN0cnVjdCBpcF92c19kZXN0X3NldCAqc2V0LCBzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCkKK3sKKwlzdHJ1Y3QgaXBfdnNfZGVzdF9saXN0ICplLCAqKmVwOworCisJd3JpdGVfbG9jaygmc2V0LT5sb2NrKTsKKwlmb3IgKGVwPSZzZXQtPmxpc3QsIGU9KmVwOyBlIT1OVUxMOyBlPSplcCkgeworCQlpZiAoZS0+ZGVzdCA9PSBkZXN0KSB7CisJCQkvKiBISVQgKi8KKwkJCSplcCA9IGUtPm5leHQ7CisJCQlhdG9taWNfZGVjKCZzZXQtPnNpemUpOworCQkJc2V0LT5sYXN0bW9kID0gamlmZmllczsKKwkJCWF0b21pY19kZWMoJmUtPmRlc3QtPnJlZmNudCk7CisJCQlrZnJlZShlKTsKKwkJCWJyZWFrOworCQl9CisJCWVwID0gJmUtPm5leHQ7CisJfQorCXdyaXRlX3VubG9jaygmc2V0LT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgaXBfdnNfZGVzdF9zZXRfZXJhc2VhbGwoc3RydWN0IGlwX3ZzX2Rlc3Rfc2V0ICpzZXQpCit7CisJc3RydWN0IGlwX3ZzX2Rlc3RfbGlzdCAqZSwgKiplcDsKKworCXdyaXRlX2xvY2soJnNldC0+bG9jayk7CisJZm9yIChlcD0mc2V0LT5saXN0LCBlPSplcDsgZSE9TlVMTDsgZT0qZXApIHsKKwkJKmVwID0gZS0+bmV4dDsKKwkJLyoKKwkJICogV2UgZG9uJ3Qga2ZyZWUgZGVzdCBiZWNhdXNlIGl0IGlzIHJlZmVyZWQgZWl0aGVyCisJCSAqIGJ5IGl0cyBzZXJ2aWNlIG9yIGJ5IHRoZSB0cmFzaCBkZXN0IGxpc3QuCisJCSAqLworCQlhdG9taWNfZGVjKCZlLT5kZXN0LT5yZWZjbnQpOworCQlrZnJlZShlKTsKKwl9CisJd3JpdGVfdW5sb2NrKCZzZXQtPmxvY2spOworfQorCisvKiBnZXQgd2VpZ2h0ZWQgbGVhc3QtY29ubmVjdGlvbiBub2RlIGluIHRoZSBkZXN0aW5hdGlvbiBzZXQgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwX3ZzX2Rlc3QgKmlwX3ZzX2Rlc3Rfc2V0X21pbihzdHJ1Y3QgaXBfdnNfZGVzdF9zZXQgKnNldCkKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgaXBfdnNfZGVzdF9saXN0ICplOworCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0LCAqbGVhc3Q7CisJaW50IGxvaCwgZG9oOworCisJaWYgKHNldCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXJlYWRfbG9jaygmc2V0LT5sb2NrKTsKKwkvKiBzZWxlY3QgdGhlIGZpcnN0IGRlc3RpbmF0aW9uIHNlcnZlciwgd2hvc2Ugd2VpZ2h0ID4gMCAqLworCWZvciAoZT1zZXQtPmxpc3Q7IGUhPU5VTEw7IGU9ZS0+bmV4dCkgeworCQlsZWFzdCA9IGUtPmRlc3Q7CisJCWlmIChsZWFzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfT1ZFUkxPQUQpCisJCQljb250aW51ZTsKKworCQlpZiAoKGF0b21pY19yZWFkKCZsZWFzdC0+d2VpZ2h0KSA+IDApCisJCSAgICAmJiAobGVhc3QtPmZsYWdzICYgSVBfVlNfREVTVF9GX0FWQUlMQUJMRSkpIHsKKwkJCWxvaCA9IGF0b21pY19yZWFkKCZsZWFzdC0+YWN0aXZlY29ubnMpICogNTAKKwkJCQkrIGF0b21pY19yZWFkKCZsZWFzdC0+aW5hY3Rjb25ucyk7CisJCQlnb3RvIG5leHRzdGFnZTsKKwkJfQorCX0KKwlyZWFkX3VubG9jaygmc2V0LT5sb2NrKTsKKwlyZXR1cm4gTlVMTDsKKworCS8qIGZpbmQgdGhlIGRlc3RpbmF0aW9uIHdpdGggdGhlIHdlaWdodGVkIGxlYXN0IGxvYWQgKi8KKyAgbmV4dHN0YWdlOgorCWZvciAoZT1lLT5uZXh0OyBlIT1OVUxMOyBlPWUtPm5leHQpIHsKKwkJZGVzdCA9IGUtPmRlc3Q7CisJCWlmIChkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9PVkVSTE9BRCkKKwkJCWNvbnRpbnVlOworCisJCWRvaCA9IGF0b21pY19yZWFkKCZkZXN0LT5hY3RpdmVjb25ucykgKiA1MAorCQkJKyBhdG9taWNfcmVhZCgmZGVzdC0+aW5hY3Rjb25ucyk7CisJCWlmICgobG9oICogYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkgPgorCQkgICAgIGRvaCAqIGF0b21pY19yZWFkKCZsZWFzdC0+d2VpZ2h0KSkKKwkJICAgICYmIChkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9BVkFJTEFCTEUpKSB7CisJCQlsZWFzdCA9IGRlc3Q7CisJCQlsb2ggPSBkb2g7CisJCX0KKwl9CisJcmVhZF91bmxvY2soJnNldC0+bG9jayk7CisKKwlJUF9WU19EQkcoNiwgImlwX3ZzX2Rlc3Rfc2V0X21pbjogc2VydmVyICVkLiVkLiVkLiVkOiVkICIKKwkJICAiYWN0aXZlY29ubnMgJWQgcmVmY250ICVkIHdlaWdodCAlZCBvdmVyaGVhZCAlZFxuIiwKKwkJICBOSVBRVUFEKGxlYXN0LT5hZGRyKSwgbnRvaHMobGVhc3QtPnBvcnQpLAorCQkgIGF0b21pY19yZWFkKCZsZWFzdC0+YWN0aXZlY29ubnMpLAorCQkgIGF0b21pY19yZWFkKCZsZWFzdC0+cmVmY250KSwKKwkJICBhdG9taWNfcmVhZCgmbGVhc3QtPndlaWdodCksIGxvaCk7CisJcmV0dXJuIGxlYXN0OworfQorCisKKy8qIGdldCB3ZWlnaHRlZCBtb3N0LWNvbm5lY3Rpb24gbm9kZSBpbiB0aGUgZGVzdGluYXRpb24gc2V0ICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpcF92c19kZXN0ICppcF92c19kZXN0X3NldF9tYXgoc3RydWN0IGlwX3ZzX2Rlc3Rfc2V0ICpzZXQpCit7CisJcmVnaXN0ZXIgc3RydWN0IGlwX3ZzX2Rlc3RfbGlzdCAqZTsKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCwgKm1vc3Q7CisJaW50IG1vaCwgZG9oOworCisJaWYgKHNldCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXJlYWRfbG9jaygmc2V0LT5sb2NrKTsKKwkvKiBzZWxlY3QgdGhlIGZpcnN0IGRlc3RpbmF0aW9uIHNlcnZlciwgd2hvc2Ugd2VpZ2h0ID4gMCAqLworCWZvciAoZT1zZXQtPmxpc3Q7IGUhPU5VTEw7IGU9ZS0+bmV4dCkgeworCQltb3N0ID0gZS0+ZGVzdDsKKwkJaWYgKGF0b21pY19yZWFkKCZtb3N0LT53ZWlnaHQpID4gMCkgeworCQkJbW9oID0gYXRvbWljX3JlYWQoJm1vc3QtPmFjdGl2ZWNvbm5zKSAqIDUwCisJCQkJKyBhdG9taWNfcmVhZCgmbW9zdC0+aW5hY3Rjb25ucyk7CisJCQlnb3RvIG5leHRzdGFnZTsKKwkJfQorCX0KKwlyZWFkX3VubG9jaygmc2V0LT5sb2NrKTsKKwlyZXR1cm4gTlVMTDsKKworCS8qIGZpbmQgdGhlIGRlc3RpbmF0aW9uIHdpdGggdGhlIHdlaWdodGVkIG1vc3QgbG9hZCAqLworICBuZXh0c3RhZ2U6CisJZm9yIChlPWUtPm5leHQ7IGUhPU5VTEw7IGU9ZS0+bmV4dCkgeworCQlkZXN0ID0gZS0+ZGVzdDsKKwkJZG9oID0gYXRvbWljX3JlYWQoJmRlc3QtPmFjdGl2ZWNvbm5zKSAqIDUwCisJCQkrIGF0b21pY19yZWFkKCZkZXN0LT5pbmFjdGNvbm5zKTsKKwkJLyogbW9oL213IDwgZG9oL2R3ID09PiBtb2gqZHcgPCBkb2gqbXcsIHdoZXJlIG13LGR3PjAgKi8KKwkJaWYgKChtb2ggKiBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KSA8CisJCSAgICAgZG9oICogYXRvbWljX3JlYWQoJm1vc3QtPndlaWdodCkpCisJCSAgICAmJiAoYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkgPiAwKSkgeworCQkJbW9zdCA9IGRlc3Q7CisJCQltb2ggPSBkb2g7CisJCX0KKwl9CisJcmVhZF91bmxvY2soJnNldC0+bG9jayk7CisKKwlJUF9WU19EQkcoNiwgImlwX3ZzX2Rlc3Rfc2V0X21heDogc2VydmVyICVkLiVkLiVkLiVkOiVkICIKKwkJICAiYWN0aXZlY29ubnMgJWQgcmVmY250ICVkIHdlaWdodCAlZCBvdmVyaGVhZCAlZFxuIiwKKwkJICBOSVBRVUFEKG1vc3QtPmFkZHIpLCBudG9ocyhtb3N0LT5wb3J0KSwKKwkJICBhdG9taWNfcmVhZCgmbW9zdC0+YWN0aXZlY29ubnMpLAorCQkgIGF0b21pY19yZWFkKCZtb3N0LT5yZWZjbnQpLAorCQkgIGF0b21pY19yZWFkKCZtb3N0LT53ZWlnaHQpLCBtb2gpOworCXJldHVybiBtb3N0OworfQorCisKKy8qCisgKiAgICAgIElQVlMgbGJsY3IgZW50cnkgcmVwcmVzZW50cyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIGRlc3RpbmF0aW9uCisgKiAgICAgIElQIGFkZHJlc3MgYW5kIGl0cyBkZXN0aW5hdGlvbiBzZXJ2ZXIgc2V0CisgKi8KK3N0cnVjdCBpcF92c19sYmxjcl9lbnRyeSB7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgbGlzdDsKKwlfX3UzMiAgICAgICAgICAgICAgICAgICBhZGRyOyAgICAgICAgICAgLyogZGVzdGluYXRpb24gSVAgYWRkcmVzcyAqLworCXN0cnVjdCBpcF92c19kZXN0X3NldCAgIHNldDsgICAgICAgICAgICAvKiBkZXN0aW5hdGlvbiBzZXJ2ZXIgc2V0ICovCisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgbGFzdHVzZTsgICAgICAgIC8qIGxhc3QgdXNlZCB0aW1lICovCit9OworCisKKy8qCisgKiAgICAgIElQVlMgbGJsY3IgaGFzaCB0YWJsZQorICovCitzdHJ1Y3QgaXBfdnNfbGJsY3JfdGFibGUgeworCXJ3bG9ja190CSAgICAgICAgbG9jazsgICAgICAgICAgIC8qIGxvY2sgZm9yIHRoaXMgdGFibGUgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICBidWNrZXRbSVBfVlNfTEJMQ1JfVEFCX1NJWkVdOyAgLyogaGFzaCBidWNrZXQgKi8KKwlhdG9taWNfdCAgICAgICAgICAgICAgICBlbnRyaWVzOyAgICAgICAgLyogbnVtYmVyIG9mIGVudHJpZXMgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICBtYXhfc2l6ZTsgICAgICAgLyogbWF4aW11bSBzaXplIG9mIGVudHJpZXMgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCAgICAgICBwZXJpb2RpY190aW1lcjsgLyogY29sbGVjdCBzdGFsZSBlbnRyaWVzICovCisJaW50ICAgICAgICAgICAgICAgICAgICAgcm92ZXI7ICAgICAgICAgIC8qIHJvdmVyIGZvciBleHBpcmUgY2hlY2sgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICBjb3VudGVyOyAgICAgICAgLyogY291bnRlciBmb3Igbm8gZXhwaXJlICovCit9OworCisKKy8qCisgKiAgICAgIElQVlMgTEJMQ1Igc3lzY3RsIHRhYmxlCisgKi8KKworc3RhdGljIGN0bF90YWJsZSB2c192YXJzX3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9WU19MQkxDUl9FWFBJUkUsCisJCS5wcm9jbmFtZQk9ICJsYmxjcl9leHBpcmF0aW9uIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9pcF92c19sYmxjcl9leHBpcmF0aW9uLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LCAKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIGN0bF90YWJsZSB2c190YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfVlMsCisJCS5wcm9jbmFtZQk9ICJ2cyIsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSB2c192YXJzX3RhYmxlCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIGN0bF90YWJsZSBpcHY0X3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNCwKKwkJLnByb2NuYW1lCT0gImlwdjQiLCAKKwkJLm1vZGUJCT0gMDU1NSwKKwkJLmNoaWxkCQk9IHZzX3RhYmxlCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIGN0bF90YWJsZSBsYmxjcl9yb290X3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBDVExfTkVULAorCQkucHJvY25hbWUJPSAibmV0IiwgCisJCS5tb2RlCQk9IDA1NTUsIAorCQkuY2hpbGQJCT0gaXB2NF90YWJsZQorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqIHN5c2N0bF9oZWFkZXI7CisKKy8qCisgKiAgICAgIG5ldy9mcmVlIGEgaXBfdnNfbGJsY3JfZW50cnksIHdoaWNoIGlzIGEgbWFwcGluZyBvZiBhIGRlc3RpbmF0aW9uCisgKiAgICAgIElQIGFkZHJlc3MgdG8gYSBzZXJ2ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwX3ZzX2xibGNyX2VudHJ5ICppcF92c19sYmxjcl9uZXcoX191MzIgZGFkZHIpCit7CisJc3RydWN0IGlwX3ZzX2xibGNyX2VudHJ5ICplbjsKKworCWVuID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwX3ZzX2xibGNyX2VudHJ5KSwgR0ZQX0FUT01JQyk7CisJaWYgKGVuID09IE5VTEwpIHsKKwkJSVBfVlNfRVJSKCJpcF92c19sYmxjcl9uZXcoKTogbm8gbWVtb3J5XG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJmVuLT5saXN0KTsKKwllbi0+YWRkciA9IGRhZGRyOworCisJLyogaW5pdGlsaXplIGl0cyBkZXN0IHNldCAqLworCWF0b21pY19zZXQoJihlbi0+c2V0LnNpemUpLCAwKTsKKwllbi0+c2V0Lmxpc3QgPSBOVUxMOworCXJ3bG9ja19pbml0KCZlbi0+c2V0LmxvY2spOworCisJcmV0dXJuIGVuOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcF92c19sYmxjcl9mcmVlKHN0cnVjdCBpcF92c19sYmxjcl9lbnRyeSAqZW4pCit7CisJbGlzdF9kZWwoJmVuLT5saXN0KTsKKwlpcF92c19kZXN0X3NldF9lcmFzZWFsbCgmZW4tPnNldCk7CisJa2ZyZWUoZW4pOworfQorCisKKy8qCisgKglSZXR1cm5zIGhhc2ggdmFsdWUgZm9yIElQVlMgTEJMQ1IgZW50cnkKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpcF92c19sYmxjcl9oYXNoa2V5KF9fdTMyIGFkZHIpCit7CisJcmV0dXJuIChudG9obChhZGRyKSoyNjU0NDM1NzYxVUwpICYgSVBfVlNfTEJMQ1JfVEFCX01BU0s7Cit9CisKKworLyoKKyAqCUhhc2ggYW4gZW50cnkgaW4gdGhlIGlwX3ZzX2xibGNyX3RhYmxlLgorICoJcmV0dXJucyBib29sIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQKK2lwX3ZzX2xibGNyX2hhc2goc3RydWN0IGlwX3ZzX2xibGNyX3RhYmxlICp0YmwsIHN0cnVjdCBpcF92c19sYmxjcl9lbnRyeSAqZW4pCit7CisJdW5zaWduZWQgaGFzaDsKKworCWlmICghbGlzdF9lbXB0eSgmZW4tPmxpc3QpKSB7CisJCUlQX1ZTX0VSUigiaXBfdnNfbGJsY3JfaGFzaCgpOiByZXF1ZXN0IGZvciBhbHJlYWR5IGhhc2hlZCwgIgorCQkJICAiY2FsbGVkIGZyb20gJXBcbiIsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICoJSGFzaCBieSBkZXN0aW5hdGlvbiBJUCBhZGRyZXNzCisJICovCisJaGFzaCA9IGlwX3ZzX2xibGNyX2hhc2hrZXkoZW4tPmFkZHIpOworCisJd3JpdGVfbG9jaygmdGJsLT5sb2NrKTsKKwlsaXN0X2FkZCgmZW4tPmxpc3QsICZ0YmwtPmJ1Y2tldFtoYXNoXSk7CisJYXRvbWljX2luYygmdGJsLT5lbnRyaWVzKTsKKwl3cml0ZV91bmxvY2soJnRibC0+bG9jayk7CisKKwlyZXR1cm4gMTsKK30KKworCisjaWYgMDAwMAorLyoKKyAqCVVuaGFzaCBpcF92c19sYmxjcl9lbnRyeSBmcm9tIGlwX3ZzX2xibGNyX3RhYmxlLgorICoJcmV0dXJucyBib29sIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgaXBfdnNfbGJsY3JfdW5oYXNoKHN0cnVjdCBpcF92c19sYmxjcl90YWJsZSAqdGJsLAorCQkJICAgICBzdHJ1Y3QgaXBfdnNfbGJsY3JfZW50cnkgKmVuKQoreworCWlmIChsaXN0X2VtcHR5KCZlbi0+bGlzdCkpIHsKKwkJSVBfVlNfRVJSKCJpcF92c19sYmxjcl91bmhhc2goKTogcmVxdWVzdCBmb3Igbm90IGhhc2hlZCBlbnRyeSwgIgorCQkJICAiY2FsbGVkIGZyb20gJXBcbiIsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogUmVtb3ZlIGl0IGZyb20gdGhlIHRhYmxlCisJICovCisJd3JpdGVfbG9jaygmdGJsLT5sb2NrKTsKKwlsaXN0X2RlbCgmZW4tPmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZlbi0+bGlzdCk7CisJd3JpdGVfdW5sb2NrKCZ0YmwtPmxvY2spOworCisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworCisvKgorICogIEdldCBpcF92c19sYmxjcl9lbnRyeSBhc3NvY2lhdGVkIHdpdGggc3VwcGxpZWQgcGFyYW1ldGVycy4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfdnNfbGJsY3JfZW50cnkgKgoraXBfdnNfbGJsY3JfZ2V0KHN0cnVjdCBpcF92c19sYmxjcl90YWJsZSAqdGJsLCBfX3UzMiBhZGRyKQoreworCXVuc2lnbmVkIGhhc2g7CisJc3RydWN0IGlwX3ZzX2xibGNyX2VudHJ5ICplbjsKKworCWhhc2ggPSBpcF92c19sYmxjcl9oYXNoa2V5KGFkZHIpOworCisJcmVhZF9sb2NrKCZ0YmwtPmxvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbiwgJnRibC0+YnVja2V0W2hhc2hdLCBsaXN0KSB7CisJCWlmIChlbi0+YWRkciA9PSBhZGRyKSB7CisJCQkvKiBISVQgKi8KKwkJCXJlYWRfdW5sb2NrKCZ0YmwtPmxvY2spOworCQkJcmV0dXJuIGVuOworCQl9CisJfQorCisJcmVhZF91bmxvY2soJnRibC0+bG9jayk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworCisvKgorICogICAgICBGbHVzaCBhbGwgdGhlIGVudHJpZXMgb2YgdGhlIHNwZWNpZmllZCB0YWJsZS4KKyAqLworc3RhdGljIHZvaWQgaXBfdnNfbGJsY3JfZmx1c2goc3RydWN0IGlwX3ZzX2xibGNyX3RhYmxlICp0YmwpCit7CisJaW50IGk7CisJc3RydWN0IGlwX3ZzX2xibGNyX2VudHJ5ICplbiwgKm54dDsKKworCWZvciAoaT0wOyBpPElQX1ZTX0xCTENSX1RBQl9TSVpFOyBpKyspIHsKKwkJd3JpdGVfbG9jaygmdGJsLT5sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVuLCBueHQsICZ0YmwtPmJ1Y2tldFtpXSwgbGlzdCkgeworCQkJaXBfdnNfbGJsY3JfZnJlZShlbik7CisJCQlhdG9taWNfZGVjKCZ0YmwtPmVudHJpZXMpOworCQl9CisJCXdyaXRlX3VubG9jaygmdGJsLT5sb2NrKTsKKwl9Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGlwX3ZzX2xibGNyX2Z1bGxfY2hlY2soc3RydWN0IGlwX3ZzX2xibGNyX3RhYmxlICp0YmwpCit7CisJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOworCWludCBpLCBqOworCXN0cnVjdCBpcF92c19sYmxjcl9lbnRyeSAqZW4sICpueHQ7CisKKwlmb3IgKGk9MCwgaj10YmwtPnJvdmVyOyBpPElQX1ZTX0xCTENSX1RBQl9TSVpFOyBpKyspIHsKKwkJaiA9IChqICsgMSkgJiBJUF9WU19MQkxDUl9UQUJfTUFTSzsKKworCQl3cml0ZV9sb2NrKCZ0YmwtPmxvY2spOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW4sIG54dCwgJnRibC0+YnVja2V0W2pdLCBsaXN0KSB7CisJCQlpZiAodGltZV9hZnRlcihlbi0+bGFzdHVzZStzeXNjdGxfaXBfdnNfbGJsY3JfZXhwaXJhdGlvbiwKKwkJCQkgICAgICAgbm93KSkKKwkJCQljb250aW51ZTsKKworCQkJaXBfdnNfbGJsY3JfZnJlZShlbik7CisJCQlhdG9taWNfZGVjKCZ0YmwtPmVudHJpZXMpOworCQl9CisJCXdyaXRlX3VubG9jaygmdGJsLT5sb2NrKTsKKwl9CisJdGJsLT5yb3ZlciA9IGo7Cit9CisKKworLyoKKyAqICAgICAgUGVyaW9kaWNhbCB0aW1lciBoYW5kbGVyIGZvciBJUFZTIGxibGNyIHRhYmxlCisgKiAgICAgIEl0IGlzIHVzZWQgdG8gY29sbGVjdCBzdGFsZSBlbnRyaWVzIHdoZW4gdGhlIG51bWJlciBvZiBlbnRyaWVzCisgKiAgICAgIGV4Y2VlZHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgdGFibGUuCisgKgorICogICAgICBGaXhtZTogd2UgcHJvYmFibHkgbmVlZCBtb3JlIGNvbXBsaWNhdGVkIGFsZ29yaXRobSB0byBjb2xsZWN0CisgKiAgICAgICAgICAgICBlbnRyaWVzIHRoYXQgaGF2ZSBub3QgYmVlbiB1c2VkIGZvciBhIGxvbmcgdGltZSBldmVuCisgKiAgICAgICAgICAgICBpZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgZG9lc24ndCBleGNlZWQgdGhlIG1heGltdW0gc2l6ZQorICogICAgICAgICAgICAgb2YgdGhlIHRhYmxlLgorICogICAgICBUaGUgZnVsbCBleHBpcmF0aW9uIGNoZWNrIGlzIGZvciB0aGlzIHB1cnBvc2Ugbm93LgorICovCitzdGF0aWMgdm9pZCBpcF92c19sYmxjcl9jaGVja19leHBpcmUodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBpcF92c19sYmxjcl90YWJsZSAqdGJsOworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKwlpbnQgZ29hbDsKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgaXBfdnNfbGJsY3JfZW50cnkgKmVuLCAqbnh0OworCisJdGJsID0gKHN0cnVjdCBpcF92c19sYmxjcl90YWJsZSAqKWRhdGE7CisKKwlpZiAoKHRibC0+Y291bnRlciAlIENPVU5UX0ZPUl9GVUxMX0VYUElSQVRJT04pID09IDApIHsKKwkJLyogZG8gZnVsbCBleHBpcmF0aW9uIGNoZWNrICovCisJCWlwX3ZzX2xibGNyX2Z1bGxfY2hlY2sodGJsKTsKKwkJdGJsLT5jb3VudGVyID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGF0b21pY19yZWFkKCZ0YmwtPmVudHJpZXMpIDw9IHRibC0+bWF4X3NpemUpIHsKKwkJdGJsLT5jb3VudGVyKys7CisJCWdvdG8gb3V0OworCX0KKworCWdvYWwgPSAoYXRvbWljX3JlYWQoJnRibC0+ZW50cmllcykgLSB0YmwtPm1heF9zaXplKSo0LzM7CisJaWYgKGdvYWwgPiB0YmwtPm1heF9zaXplLzIpCisJCWdvYWwgPSB0YmwtPm1heF9zaXplLzI7CisKKwlmb3IgKGk9MCwgaj10YmwtPnJvdmVyOyBpPElQX1ZTX0xCTENSX1RBQl9TSVpFOyBpKyspIHsKKwkJaiA9IChqICsgMSkgJiBJUF9WU19MQkxDUl9UQUJfTUFTSzsKKworCQl3cml0ZV9sb2NrKCZ0YmwtPmxvY2spOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW4sIG54dCwgJnRibC0+YnVja2V0W2pdLCBsaXN0KSB7CisJCQlpZiAodGltZV9iZWZvcmUobm93LCBlbi0+bGFzdHVzZStFTlRSWV9USU1FT1VUKSkKKwkJCQljb250aW51ZTsKKworCQkJaXBfdnNfbGJsY3JfZnJlZShlbik7CisJCQlhdG9taWNfZGVjKCZ0YmwtPmVudHJpZXMpOworCQkJZ29hbC0tOworCQl9CisJCXdyaXRlX3VubG9jaygmdGJsLT5sb2NrKTsKKwkJaWYgKGdvYWwgPD0gMCkKKwkJCWJyZWFrOworCX0KKwl0YmwtPnJvdmVyID0gajsKKworICBvdXQ6CisJbW9kX3RpbWVyKCZ0YmwtPnBlcmlvZGljX3RpbWVyLCBqaWZmaWVzK0NIRUNLX0VYUElSRV9JTlRFUlZBTCk7Cit9CisKKworI2lmZGVmIENPTkZJR19JUF9WU19MQkxDUl9ERUJVRworc3RhdGljIHN0cnVjdCBpcF92c19sYmxjcl90YWJsZSAqbGJsY3JfdGFibGVfbGlzdDsKKworLyoKKyAqCS9wcm9jL25ldC9pcF92c19sYmxjciB0byBkaXNwbGF5IHRoZSBtYXBwaW5ncyBvZgorICogICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBJUCBhZGRyZXNzIDw9PT4gaXRzIHNlcnZlclNldAorICovCitzdGF0aWMgaW50CitpcF92c19sYmxjcl9nZXRpbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgpCit7CisJb2ZmX3QgcG9zPTAsIGJlZ2luOworCWludCBsZW49MCwgc2l6ZTsKKwlzdHJ1Y3QgaXBfdnNfbGJsY3JfdGFibGUgKnRibDsKKwl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisJaW50IGk7CisJc3RydWN0IGlwX3ZzX2xibGNyX2VudHJ5ICplbjsKKworCXRibCA9IGxibGNyX3RhYmxlX2xpc3Q7CisKKwlzaXplID0gc3ByaW50ZihidWZmZXIsICJMYXN0VGltZSBEZXN0IElQIGFkZHJlc3MgIFNlcnZlciBzZXRcbiIpOworCXBvcyArPSBzaXplOworCWxlbiArPSBzaXplOworCisJZm9yIChpPTA7IGk8SVBfVlNfTEJMQ1JfVEFCX1NJWkU7IGkrKykgeworCQlyZWFkX2xvY2tfYmgoJnRibC0+bG9jayk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZW4sICZ0YmwtPmJ1Y2tldFtpXSwgbGlzdCkgeworCQkJY2hhciB0YnVmWzE2XTsKKwkJCXN0cnVjdCBpcF92c19kZXN0X2xpc3QgKmQ7CisKKwkJCXNwcmludGYodGJ1ZiwgIiV1LiV1LiV1LiV1IiwgTklQUVVBRChlbi0+YWRkcikpOworCQkJc2l6ZSA9IHNwcmludGYoYnVmZmVyK2xlbiwgIiU4bHUgJS0xNnMgIiwKKwkJCQkgICAgICAgbm93LWVuLT5sYXN0dXNlLCB0YnVmKTsKKworCQkJcmVhZF9sb2NrKCZlbi0+c2V0LmxvY2spOworCQkJZm9yIChkPWVuLT5zZXQubGlzdDsgZCE9TlVMTDsgZD1kLT5uZXh0KSB7CisJCQkJc2l6ZSArPSBzcHJpbnRmKGJ1ZmZlcitsZW4rc2l6ZSwKKwkJCQkJCSIldS4ldS4ldS4ldSAiLAorCQkJCQkJTklQUVVBRChkLT5kZXN0LT5hZGRyKSk7CisJCQl9CisJCQlyZWFkX3VubG9jaygmZW4tPnNldC5sb2NrKTsKKwkJCXNpemUgKz0gc3ByaW50ZihidWZmZXIrbGVuK3NpemUsICJcbiIpOworCQkJbGVuICs9IHNpemU7CisJCQlwb3MgKz0gc2l6ZTsKKwkJCWlmIChwb3MgPD0gb2Zmc2V0KQorCQkJCWxlbj0wOworCQkJaWYgKHBvcyA+PSBvZmZzZXQrbGVuZ3RoKSB7CisJCQkJcmVhZF91bmxvY2tfYmgoJnRibC0+bG9jayk7CisJCQkJZ290byBkb25lOworCQkJfQorCQl9CisJCXJlYWRfdW5sb2NrX2JoKCZ0YmwtPmxvY2spOworCX0KKworICBkb25lOgorCWJlZ2luID0gbGVuIC0gKHBvcyAtIG9mZnNldCk7CisJKnN0YXJ0ID0gYnVmZmVyICsgYmVnaW47CisJbGVuIC09IGJlZ2luOworCWlmKGxlbj5sZW5ndGgpCisJCWxlbiA9IGxlbmd0aDsKKwlyZXR1cm4gbGVuOworfQorI2VuZGlmCisKKworc3RhdGljIGludCBpcF92c19sYmxjcl9pbml0X3N2YyhzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQoreworCWludCBpOworCXN0cnVjdCBpcF92c19sYmxjcl90YWJsZSAqdGJsOworCisJLyoKKwkgKiAgICBBbGxvY2F0ZSB0aGUgaXBfdnNfbGJsY3JfdGFibGUgZm9yIHRoaXMgc2VydmljZQorCSAqLworCXRibCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcF92c19sYmxjcl90YWJsZSksIEdGUF9BVE9NSUMpOworCWlmICh0YmwgPT0gTlVMTCkgeworCQlJUF9WU19FUlIoImlwX3ZzX2xibGNyX2luaXRfc3ZjKCk6IG5vIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzdmMtPnNjaGVkX2RhdGEgPSB0Ymw7CisJSVBfVlNfREJHKDYsICJMQkxDUiBoYXNoIHRhYmxlIChtZW1vcnk9JVpkYnl0ZXMpIGFsbG9jYXRlZCBmb3IgIgorCQkgICJjdXJyZW50IHNlcnZpY2VcbiIsCisJCSAgc2l6ZW9mKHN0cnVjdCBpcF92c19sYmxjcl90YWJsZSkpOworCisJLyoKKwkgKiAgICBJbml0aWFsaXplIHRoZSBoYXNoIGJ1Y2tldHMKKwkgKi8KKwlmb3IgKGk9MDsgaTxJUF9WU19MQkxDUl9UQUJfU0laRTsgaSsrKSB7CisJCUlOSVRfTElTVF9IRUFEKCZ0YmwtPmJ1Y2tldFtpXSk7CisJfQorCXJ3bG9ja19pbml0KCZ0YmwtPmxvY2spOworCXRibC0+bWF4X3NpemUgPSBJUF9WU19MQkxDUl9UQUJfU0laRSoxNjsKKwl0YmwtPnJvdmVyID0gMDsKKwl0YmwtPmNvdW50ZXIgPSAxOworCisJLyoKKwkgKiAgICBIb29rIHBlcmlvZGljIHRpbWVyIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24KKwkgKi8KKwlpbml0X3RpbWVyKCZ0YmwtPnBlcmlvZGljX3RpbWVyKTsKKwl0YmwtPnBlcmlvZGljX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyl0Ymw7CisJdGJsLT5wZXJpb2RpY190aW1lci5mdW5jdGlvbiA9IGlwX3ZzX2xibGNyX2NoZWNrX2V4cGlyZTsKKwl0YmwtPnBlcmlvZGljX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzK0NIRUNLX0VYUElSRV9JTlRFUlZBTDsKKwlhZGRfdGltZXIoJnRibC0+cGVyaW9kaWNfdGltZXIpOworCisjaWZkZWYgQ09ORklHX0lQX1ZTX0xCTENSX0RFQlVHCisJbGJsY3JfdGFibGVfbGlzdCA9IHRibDsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaXBfdnNfbGJsY3JfZG9uZV9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlzdHJ1Y3QgaXBfdnNfbGJsY3JfdGFibGUgKnRibCA9IHN2Yy0+c2NoZWRfZGF0YTsKKworCS8qIHJlbW92ZSBwZXJpb2RpYyB0aW1lciAqLworCWRlbF90aW1lcl9zeW5jKCZ0YmwtPnBlcmlvZGljX3RpbWVyKTsKKworCS8qIGdvdCB0byBjbGVhbiB1cCB0YWJsZSBlbnRyaWVzIGhlcmUgKi8KKwlpcF92c19sYmxjcl9mbHVzaCh0YmwpOworCisJLyogcmVsZWFzZSB0aGUgdGFibGUgaXRzZWxmICovCisJa2ZyZWUoc3ZjLT5zY2hlZF9kYXRhKTsKKwlJUF9WU19EQkcoNiwgIkxCTENSIGhhc2ggdGFibGUgKG1lbW9yeT0lWmRieXRlcykgcmVsZWFzZWRcbiIsCisJCSAgc2l6ZW9mKHN0cnVjdCBpcF92c19sYmxjcl90YWJsZSkpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpcF92c19sYmxjcl91cGRhdGVfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCit7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfdnNfZGVzdCAqCitfX2lwX3ZzX3dsY19zY2hlZHVsZShzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLCBzdHJ1Y3QgaXBoZHIgKmlwaCkKK3sKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCwgKmxlYXN0OworCWludCBsb2gsIGRvaDsKKworCS8qCisJICogV2UgdGhpbmsgdGhlIG92ZXJoZWFkIG9mIHByb2Nlc3NpbmcgYWN0aXZlIGNvbm5lY3Rpb25zIGlzIGZpZnR5CisJICogdGltZXMgaGlnaGVyIHRoYW4gdGhhdCBvZiBpbmFjdGl2ZSBjb25uZWN0aW9ucyBpbiBhdmVyYWdlLiAoVGhpcworCSAqIGZpZnR5IHRpbWVzIG1pZ2h0IG5vdCBiZSBhY2N1cmF0ZSwgd2Ugd2lsbCBjaGFuZ2UgaXQgbGF0ZXIuKSBXZQorCSAqIHVzZSB0aGUgZm9sbG93aW5nIGZvcm11bGEgdG8gZXN0aW1hdGUgdGhlIG92ZXJoZWFkOgorCSAqICAgICAgICAgICAgICAgIGRlc3QtPmFjdGl2ZWNvbm5zKjUwICsgZGVzdC0+aW5hY3Rjb25ucworCSAqIGFuZCB0aGUgbG9hZDoKKwkgKiAgICAgICAgICAgICAgICAoZGVzdCBvdmVyaGVhZCkgLyBkZXN0LT53ZWlnaHQKKwkgKgorCSAqIFJlbWVtYmVyIC0tIG5vIGZsb2F0cyBpbiBrZXJuZWwgbW9kZSEhIQorCSAqIFRoZSBjb21wYXJpc29uIG9mIGgxKncyID4gaDIqdzEgaXMgZXF1aXZhbGVudCB0byB0aGF0IG9mCisJICogICAgICAgICAgICAgICAgaDEvdzEgPiBoMi93MgorCSAqIGlmIGV2ZXJ5IHdlaWdodCBpcyBsYXJnZXIgdGhhbiB6ZXJvLgorCSAqCisJICogVGhlIHNlcnZlciB3aXRoIHdlaWdodD0wIGlzIHF1aWVzY2VkIGFuZCB3aWxsIG5vdCByZWNlaXZlIGFueQorCSAqIG5ldyBjb25uZWN0aW9uLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzdCwgJnN2Yy0+ZGVzdGluYXRpb25zLCBuX2xpc3QpIHsKKwkJaWYgKGRlc3QtPmZsYWdzICYgSVBfVlNfREVTVF9GX09WRVJMT0FEKQorCQkJY29udGludWU7CisKKwkJaWYgKGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpID4gMCkgeworCQkJbGVhc3QgPSBkZXN0OworCQkJbG9oID0gYXRvbWljX3JlYWQoJmxlYXN0LT5hY3RpdmVjb25ucykgKiA1MAorCQkJCSsgYXRvbWljX3JlYWQoJmxlYXN0LT5pbmFjdGNvbm5zKTsKKwkJCWdvdG8gbmV4dHN0YWdlOworCQl9CisJfQorCXJldHVybiBOVUxMOworCisJLyoKKwkgKiAgICBGaW5kIHRoZSBkZXN0aW5hdGlvbiB3aXRoIHRoZSBsZWFzdCBsb2FkLgorCSAqLworICBuZXh0c3RhZ2U6CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZShkZXN0LCAmc3ZjLT5kZXN0aW5hdGlvbnMsIG5fbGlzdCkgeworCQlpZiAoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfT1ZFUkxPQUQpCisJCQljb250aW51ZTsKKworCQlkb2ggPSBhdG9taWNfcmVhZCgmZGVzdC0+YWN0aXZlY29ubnMpICogNTAKKwkJCSsgYXRvbWljX3JlYWQoJmRlc3QtPmluYWN0Y29ubnMpOworCQlpZiAobG9oICogYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkgPgorCQkgICAgZG9oICogYXRvbWljX3JlYWQoJmxlYXN0LT53ZWlnaHQpKSB7CisJCQlsZWFzdCA9IGRlc3Q7CisJCQlsb2ggPSBkb2g7CisJCX0KKwl9CisKKwlJUF9WU19EQkcoNiwgIkxCTENSOiBzZXJ2ZXIgJWQuJWQuJWQuJWQ6JWQgIgorCQkgICJhY3RpdmVjb25ucyAlZCByZWZjbnQgJWQgd2VpZ2h0ICVkIG92ZXJoZWFkICVkXG4iLAorCQkgIE5JUFFVQUQobGVhc3QtPmFkZHIpLCBudG9ocyhsZWFzdC0+cG9ydCksCisJCSAgYXRvbWljX3JlYWQoJmxlYXN0LT5hY3RpdmVjb25ucyksCisJCSAgYXRvbWljX3JlYWQoJmxlYXN0LT5yZWZjbnQpLAorCQkgIGF0b21pY19yZWFkKCZsZWFzdC0+d2VpZ2h0KSwgbG9oKTsKKworCXJldHVybiBsZWFzdDsKK30KKworCisvKgorICogICBJZiB0aGlzIGRlc3RpbmF0aW9uIHNlcnZlciBpcyBvdmVybG9hZGVkIGFuZCB0aGVyZSBpcyBhIGxlc3MgbG9hZGVkCisgKiAgIHNlcnZlciwgdGhlbiByZXR1cm4gdHJ1ZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2lzX292ZXJsb2FkZWQoc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QsIHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCit7CisJaWYgKGF0b21pY19yZWFkKCZkZXN0LT5hY3RpdmVjb25ucykgPiBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KSkgeworCQlzdHJ1Y3QgaXBfdnNfZGVzdCAqZDsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICZzdmMtPmRlc3RpbmF0aW9ucywgbl9saXN0KSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJmQtPmFjdGl2ZWNvbm5zKSoyCisJCQkgICAgPCBhdG9taWNfcmVhZCgmZC0+d2VpZ2h0KSkgeworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCisKKy8qCisgKiAgICBMb2NhbGl0eS1CYXNlZCAod2VpZ2h0ZWQpIExlYXN0LUNvbm5lY3Rpb24gc2NoZWR1bGluZworICovCitzdGF0aWMgc3RydWN0IGlwX3ZzX2Rlc3QgKgoraXBfdnNfbGJsY3Jfc2NoZWR1bGUoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKKwlzdHJ1Y3QgaXBfdnNfbGJsY3JfdGFibGUgKnRibDsKKwlzdHJ1Y3QgaXBfdnNfbGJsY3JfZW50cnkgKmVuOworCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisKKwlJUF9WU19EQkcoNiwgImlwX3ZzX2xibGNyX3NjaGVkdWxlKCk6IFNjaGVkdWxpbmcuLi5cbiIpOworCisJdGJsID0gKHN0cnVjdCBpcF92c19sYmxjcl90YWJsZSAqKXN2Yy0+c2NoZWRfZGF0YTsKKwllbiA9IGlwX3ZzX2xibGNyX2dldCh0YmwsIGlwaC0+ZGFkZHIpOworCWlmIChlbiA9PSBOVUxMKSB7CisJCWRlc3QgPSBfX2lwX3ZzX3dsY19zY2hlZHVsZShzdmMsIGlwaCk7CisJCWlmIChkZXN0ID09IE5VTEwpIHsKKwkJCUlQX1ZTX0RCRygxLCAibm8gZGVzdGluYXRpb24gYXZhaWxhYmxlXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWVuID0gaXBfdnNfbGJsY3JfbmV3KGlwaC0+ZGFkZHIpOworCQlpZiAoZW4gPT0gTlVMTCkgeworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaXBfdnNfZGVzdF9zZXRfaW5zZXJ0KCZlbi0+c2V0LCBkZXN0KTsKKwkJaXBfdnNfbGJsY3JfaGFzaCh0YmwsIGVuKTsKKwl9IGVsc2UgeworCQlkZXN0ID0gaXBfdnNfZGVzdF9zZXRfbWluKCZlbi0+c2V0KTsKKwkJaWYgKCFkZXN0IHx8IGlzX292ZXJsb2FkZWQoZGVzdCwgc3ZjKSkgeworCQkJZGVzdCA9IF9faXBfdnNfd2xjX3NjaGVkdWxlKHN2YywgaXBoKTsKKwkJCWlmIChkZXN0ID09IE5VTEwpIHsKKwkJCQlJUF9WU19EQkcoMSwgIm5vIGRlc3RpbmF0aW9uIGF2YWlsYWJsZVxuIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlpcF92c19kZXN0X3NldF9pbnNlcnQoJmVuLT5zZXQsIGRlc3QpOworCQl9CisJCWlmIChhdG9taWNfcmVhZCgmZW4tPnNldC5zaXplKSA+IDEgJiYKKwkJICAgIGppZmZpZXMtZW4tPnNldC5sYXN0bW9kID4gc3lzY3RsX2lwX3ZzX2xibGNyX2V4cGlyYXRpb24pIHsKKwkJCXN0cnVjdCBpcF92c19kZXN0ICptOworCQkJbSA9IGlwX3ZzX2Rlc3Rfc2V0X21heCgmZW4tPnNldCk7CisJCQlpZiAobSkKKwkJCQlpcF92c19kZXN0X3NldF9lcmFzZSgmZW4tPnNldCwgbSk7CisJCX0KKwl9CisJZW4tPmxhc3R1c2UgPSBqaWZmaWVzOworCisJSVBfVlNfREJHKDYsICJMQkxDUjogZGVzdGluYXRpb24gSVAgYWRkcmVzcyAldS4ldS4ldS4ldSAiCisJCSAgIi0tPiBzZXJ2ZXIgJXUuJXUuJXUuJXU6JWRcbiIsCisJCSAgTklQUVVBRChlbi0+YWRkciksCisJCSAgTklQUVVBRChkZXN0LT5hZGRyKSwKKwkJICBudG9ocyhkZXN0LT5wb3J0KSk7CisKKwlyZXR1cm4gZGVzdDsKK30KKworCisvKgorICogICAgICBJUFZTIExCTENSIFNjaGVkdWxlciBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHN0cnVjdCBpcF92c19zY2hlZHVsZXIgaXBfdnNfbGJsY3Jfc2NoZWR1bGVyID0KK3sKKwkubmFtZSA9CQkJImxibGNyIiwKKwkucmVmY250ID0JCUFUT01JQ19JTklUKDApLAorCS5tb2R1bGUgPQkJVEhJU19NT0RVTEUsCisJLmluaXRfc2VydmljZSA9CQlpcF92c19sYmxjcl9pbml0X3N2YywKKwkuZG9uZV9zZXJ2aWNlID0JCWlwX3ZzX2xibGNyX2RvbmVfc3ZjLAorCS51cGRhdGVfc2VydmljZSA9CWlwX3ZzX2xibGNyX3VwZGF0ZV9zdmMsCisJLnNjaGVkdWxlID0JCWlwX3ZzX2xibGNyX3NjaGVkdWxlLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBpcF92c19sYmxjcl9pbml0KHZvaWQpCit7CisJSU5JVF9MSVNUX0hFQUQoJmlwX3ZzX2xibGNyX3NjaGVkdWxlci5uX2xpc3QpOworCXN5c2N0bF9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUobGJsY3Jfcm9vdF90YWJsZSwgMCk7CisjaWZkZWYgQ09ORklHX0lQX1ZTX0xCTENSX0RFQlVHCisJcHJvY19uZXRfY3JlYXRlKCJpcF92c19sYmxjciIsIDAsIGlwX3ZzX2xibGNyX2dldGluZm8pOworI2VuZGlmCisJcmV0dXJuIHJlZ2lzdGVyX2lwX3ZzX3NjaGVkdWxlcigmaXBfdnNfbGJsY3Jfc2NoZWR1bGVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgaXBfdnNfbGJsY3JfY2xlYW51cCh2b2lkKQoreworI2lmZGVmIENPTkZJR19JUF9WU19MQkxDUl9ERUJVRworCXByb2NfbmV0X3JlbW92ZSgiaXBfdnNfbGJsY3IiKTsKKyNlbmRpZgorCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHN5c2N0bF9oZWFkZXIpOworCXVucmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKCZpcF92c19sYmxjcl9zY2hlZHVsZXIpOworfQorCisKK21vZHVsZV9pbml0KGlwX3ZzX2xibGNyX2luaXQpOworbW9kdWxlX2V4aXQoaXBfdnNfbGJsY3JfY2xlYW51cCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2xjLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2xjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg4ZmVmOQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfbGMuYwpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIElQVlM6ICAgICAgICBMZWFzdC1Db25uZWN0aW9uIFNjaGVkdWxpbmcgbW9kdWxlCisgKgorICogVmVyc2lvbjogICAgICRJZDogaXBfdnNfbGMuYyx2IDEuMTAgMjAwMy8wNC8xOCAwOTowMzoxNiB3ZW5zb25nIEV4cCAkCisgKgorICogQXV0aG9yczogICAgIFdlbnNvbmcgWmhhbmcgPHdlbnNvbmdAbGludXh2aXJ0dWFsc2VydmVyLm9yZz4KKyAqCisgKiAgICAgICAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICAgICAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgICAgICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgICAgICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDaGFuZ2VzOgorICogICAgIFdlbnNvbmcgWmhhbmcgICAgICAgICAgICA6ICAgICBhZGRlZCB0aGUgaXBfdnNfbGNfdXBkYXRlX3N2YworICogICAgIFdlbnNvbmcgWmhhbmcgICAgICAgICAgICA6ICAgICBhZGRlZCBhbnkgZGVzdCB3aXRoIHdlaWdodD0wIGlzIHF1aWVzY2VkCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPG5ldC9pcF92cy5oPgorCisKK3N0YXRpYyBpbnQgaXBfdnNfbGNfaW5pdF9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGlwX3ZzX2xjX2RvbmVfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCit7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpcF92c19sY191cGRhdGVfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCit7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK2lwX3ZzX2xjX2Rlc3Rfb3ZlcmhlYWQoc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCit7CisJLyoKKwkgKiBXZSB0aGluayB0aGUgb3ZlcmhlYWQgb2YgcHJvY2Vzc2luZyBhY3RpdmUgY29ubmVjdGlvbnMgaXMgMjU2CisJICogdGltZXMgaGlnaGVyIHRoYW4gdGhhdCBvZiBpbmFjdGl2ZSBjb25uZWN0aW9ucyBpbiBhdmVyYWdlLiAoVGhpcworCSAqIDI1NiB0aW1lcyBtaWdodCBub3QgYmUgYWNjdXJhdGUsIHdlIHdpbGwgY2hhbmdlIGl0IGxhdGVyKSBXZQorCSAqIHVzZSB0aGUgZm9sbG93aW5nIGZvcm11bGEgdG8gZXN0aW1hdGUgdGhlIG92ZXJoZWFkIG5vdzoKKwkgKgkJICBkZXN0LT5hY3RpdmVjb25ucyoyNTYgKyBkZXN0LT5pbmFjdGNvbm5zCisJICovCisJcmV0dXJuIChhdG9taWNfcmVhZCgmZGVzdC0+YWN0aXZlY29ubnMpIDw8IDgpICsKKwkJYXRvbWljX3JlYWQoJmRlc3QtPmluYWN0Y29ubnMpOworfQorCisKKy8qCisgKglMZWFzdCBDb25uZWN0aW9uIHNjaGVkdWxpbmcKKyAqLworc3RhdGljIHN0cnVjdCBpcF92c19kZXN0ICoKK2lwX3ZzX2xjX3NjaGVkdWxlKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QsICpsZWFzdCA9IE5VTEw7CisJdW5zaWduZWQgaW50IGxvaCA9IDAsIGRvaDsKKworCUlQX1ZTX0RCRyg2LCAiaXBfdnNfbGNfc2NoZWR1bGUoKTogU2NoZWR1bGluZy4uLlxuIik7CisKKwkvKgorCSAqIFNpbXBseSBzZWxlY3QgdGhlIHNlcnZlciB3aXRoIHRoZSBsZWFzdCBudW1iZXIgb2YKKwkgKiAgICAgICAgKGFjdGl2ZWNvbm5zPDw1KSArIGluYWN0Y29ubnMKKwkgKiBFeGNlcHQgd2hvc2Ugd2VpZ2h0IGlzIGVxdWFsIHRvIHplcm8uCisJICogSWYgdGhlIHdlaWdodCBpcyBlcXVhbCB0byB6ZXJvLCBpdCBtZWFucyB0aGF0IHRoZSBzZXJ2ZXIgaXMKKwkgKiBxdWllc2NlZCwgdGhlIGV4aXN0aW5nIGNvbm5lY3Rpb25zIHRvIHRoZSBzZXJ2ZXIgc3RpbGwgZ2V0CisJICogc2VydmVkLCBidXQgbm8gbmV3IGNvbm5lY3Rpb24gaXMgYXNzaWduZWQgdG8gdGhlIHNlcnZlci4KKwkgKi8KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzdCwgJnN2Yy0+ZGVzdGluYXRpb25zLCBuX2xpc3QpIHsKKwkJaWYgKChkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9PVkVSTE9BRCkgfHwKKwkJICAgIGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpID09IDApCisJCQljb250aW51ZTsKKwkJZG9oID0gaXBfdnNfbGNfZGVzdF9vdmVyaGVhZChkZXN0KTsKKwkJaWYgKCFsZWFzdCB8fCBkb2ggPCBsb2gpIHsKKwkJCWxlYXN0ID0gZGVzdDsKKwkJCWxvaCA9IGRvaDsKKwkJfQorCX0KKworCWlmIChsZWFzdCkKKwlJUF9WU19EQkcoNiwgIkxDOiBzZXJ2ZXIgJXUuJXUuJXUuJXU6JXUgYWN0aXZlY29ubnMgJWQgaW5hY3Rjb25ucyAlZFxuIiwKKwkJICBOSVBRVUFEKGxlYXN0LT5hZGRyKSwgbnRvaHMobGVhc3QtPnBvcnQpLAorCQkgIGF0b21pY19yZWFkKCZsZWFzdC0+YWN0aXZlY29ubnMpLAorCQkgIGF0b21pY19yZWFkKCZsZWFzdC0+aW5hY3Rjb25ucykpOworCisJcmV0dXJuIGxlYXN0OworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfc2NoZWR1bGVyIGlwX3ZzX2xjX3NjaGVkdWxlciA9IHsKKwkubmFtZSA9CQkJImxjIiwKKwkucmVmY250ID0JCUFUT01JQ19JTklUKDApLAorCS5tb2R1bGUgPQkJVEhJU19NT0RVTEUsCisJLmluaXRfc2VydmljZSA9CQlpcF92c19sY19pbml0X3N2YywKKwkuZG9uZV9zZXJ2aWNlID0JCWlwX3ZzX2xjX2RvbmVfc3ZjLAorCS51cGRhdGVfc2VydmljZSA9CWlwX3ZzX2xjX3VwZGF0ZV9zdmMsCisJLnNjaGVkdWxlID0JCWlwX3ZzX2xjX3NjaGVkdWxlLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBpcF92c19sY19pbml0KHZvaWQpCit7CisJSU5JVF9MSVNUX0hFQUQoJmlwX3ZzX2xjX3NjaGVkdWxlci5uX2xpc3QpOworCXJldHVybiByZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoJmlwX3ZzX2xjX3NjaGVkdWxlcikgOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXBfdnNfbGNfY2xlYW51cCh2b2lkKQoreworCXVucmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKCZpcF92c19sY19zY2hlZHVsZXIpOworfQorCittb2R1bGVfaW5pdChpcF92c19sY19pbml0KTsKK21vZHVsZV9leGl0KGlwX3ZzX2xjX2NsZWFudXApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19ucS5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19ucS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMmE5ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX25xLmMKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBJUFZTOiAgICAgICAgTmV2ZXIgUXVldWUgc2NoZWR1bGluZyBtb2R1bGUKKyAqCisgKiBWZXJzaW9uOiAgICAgJElkOiBpcF92c19ucS5jLHYgMS4yIDIwMDMvMDYvMDggMDk6MzE6MTkgd2Vuc29uZyBFeHAgJAorICoKKyAqIEF1dGhvcnM6ICAgICBXZW5zb25nIFpoYW5nIDx3ZW5zb25nQGxpbnV4dmlydHVhbHNlcnZlci5vcmc+CisgKgorICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQ2hhbmdlczoKKyAqCisgKi8KKworLyoKKyAqIFRoZSBOUSBhbGdvcml0aG0gYWRvcHRzIGEgdHdvLXNwZWVkIG1vZGVsLiBXaGVuIHRoZXJlIGlzIGFuIGlkbGUgc2VydmVyCisgKiBhdmFpbGFibGUsIHRoZSBqb2Igd2lsbCBiZSBzZW50IHRvIHRoZSBpZGxlIHNlcnZlciwgaW5zdGVhZCBvZiB3YWl0aW5nCisgKiBmb3IgYSBmYXN0IG9uZS4gV2hlbiB0aGVyZSBpcyBubyBpZGxlIHNlcnZlciBhdmFpbGFibGUsIHRoZSBqb2Igd2lsbCBiZQorICogc2VudCB0byB0aGUgc2VydmVyIHRoYXQgbWluaW1pemUgaXRzIGV4cGVjdGVkIGRlbGF5IChUaGUgU2hvcnRlc3QKKyAqIEV4cGVjdGVkIERlbGF5IHNjaGVkdWxpbmcgYWxnb3JpdGhtKS4KKyAqCisgKiBTZWUgdGhlIGZvbGxvd2luZyBwYXBlciBmb3IgbW9yZSBpbmZvcm1hdGlvbjoKKyAqIEEuIFdlaW5yaWIgYW5kIFMuIFNoZW5rZXIsIEdyZWVkIGlzIG5vdCBlbm91Z2g6IEFkYXB0aXZlIGxvYWQgc2hhcmluZworICogaW4gbGFyZ2UgaGV0ZXJvZ2VuZW91cyBzeXN0ZW1zLiBJbiBQcm9jZWVkaW5ncyBJRUVFIElORk9DT00nODgsCisgKiBwYWdlcyA5ODYtOTk0LCAxOTg4LgorICoKKyAqIFRoYW5rcyBtdXN0IGdvIHRvIE1hcmtvIEJ1dXJpIDxtYXJrb0BidXVyaS5uYW1lPiBmb3IgdGFsa2luZyBOUSB0byBtZS4KKyAqCisgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIE5RIGFuZCBTRUQgaXMgdGhhdCBOUSBjYW4gaW1wcm92ZSBvdmVyYWxsCisgKiBzeXN0ZW0gdXRpbGl6YXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPG5ldC9pcF92cy5oPgorCisKK3N0YXRpYyBpbnQKK2lwX3ZzX25xX2luaXRfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCit7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAoraXBfdnNfbnFfZG9uZV9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CitpcF92c19ucV91cGRhdGVfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCit7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK2lwX3ZzX25xX2Rlc3Rfb3ZlcmhlYWQoc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCit7CisJLyoKKwkgKiBXZSBvbmx5IHVzZSB0aGUgYWN0aXZlIGNvbm5lY3Rpb24gbnVtYmVyIGluIHRoZSBjb3N0CisJICogY2FsY3VsYXRpb24gaGVyZS4KKwkgKi8KKwlyZXR1cm4gYXRvbWljX3JlYWQoJmRlc3QtPmFjdGl2ZWNvbm5zKSArIDE7Cit9CisKKworLyoKKyAqCVdlaWdodGVkIExlYXN0IENvbm5lY3Rpb24gc2NoZWR1bGluZworICovCitzdGF0aWMgc3RydWN0IGlwX3ZzX2Rlc3QgKgoraXBfdnNfbnFfc2NoZWR1bGUoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCwgKmxlYXN0ID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgbG9oID0gMCwgZG9oOworCisJSVBfVlNfREJHKDYsICJpcF92c19ucV9zY2hlZHVsZSgpOiBTY2hlZHVsaW5nLi4uXG4iKTsKKworCS8qCisJICogV2UgY2FsY3VsYXRlIHRoZSBsb2FkIG9mIGVhY2ggZGVzdCBzZXJ2ZXIgYXMgZm9sbG93czoKKwkgKgkoc2VydmVyIGV4cGVjdGVkIG92ZXJoZWFkKSAvIGRlc3QtPndlaWdodAorCSAqCisJICogUmVtZW1iZXIgLS0gbm8gZmxvYXRzIGluIGtlcm5lbCBtb2RlISEhCisJICogVGhlIGNvbXBhcmlzb24gb2YgaDEqdzIgPiBoMip3MSBpcyBlcXVpdmFsZW50IHRvIHRoYXQgb2YKKwkgKgkJICBoMS93MSA+IGgyL3cyCisJICogaWYgZXZlcnkgd2VpZ2h0IGlzIGxhcmdlciB0aGFuIHplcm8uCisJICoKKwkgKiBUaGUgc2VydmVyIHdpdGggd2VpZ2h0PTAgaXMgcXVpZXNjZWQgYW5kIHdpbGwgbm90IHJlY2VpdmUgYW55CisJICogbmV3IGNvbm5lY3Rpb25zLgorCSAqLworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXN0LCAmc3ZjLT5kZXN0aW5hdGlvbnMsIG5fbGlzdCkgeworCisJCWlmIChkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9PVkVSTE9BRCB8fAorCQkgICAgIWF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpKQorCQkJY29udGludWU7CisKKwkJZG9oID0gaXBfdnNfbnFfZGVzdF9vdmVyaGVhZChkZXN0KTsKKworCQkvKiByZXR1cm4gdGhlIHNlcnZlciBkaXJlY3RseSBpZiBpdCBpcyBpZGxlICovCisJCWlmIChhdG9taWNfcmVhZCgmZGVzdC0+YWN0aXZlY29ubnMpID09IDApIHsKKwkJCWxlYXN0ID0gZGVzdDsKKwkJCWxvaCA9IGRvaDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKCFsZWFzdCB8fAorCQkgICAgKGxvaCAqIGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpID4KKwkJICAgICBkb2ggKiBhdG9taWNfcmVhZCgmbGVhc3QtPndlaWdodCkpKSB7CisJCQlsZWFzdCA9IGRlc3Q7CisJCQlsb2ggPSBkb2g7CisJCX0KKwl9CisKKwlpZiAoIWxlYXN0KQorCQlyZXR1cm4gTlVMTDsKKworICBvdXQ6CisJSVBfVlNfREJHKDYsICJOUTogc2VydmVyICV1LiV1LiV1LiV1OiV1ICIKKwkJICAiYWN0aXZlY29ubnMgJWQgcmVmY250ICVkIHdlaWdodCAlZCBvdmVyaGVhZCAlZFxuIiwKKwkJICBOSVBRVUFEKGxlYXN0LT5hZGRyKSwgbnRvaHMobGVhc3QtPnBvcnQpLAorCQkgIGF0b21pY19yZWFkKCZsZWFzdC0+YWN0aXZlY29ubnMpLAorCQkgIGF0b21pY19yZWFkKCZsZWFzdC0+cmVmY250KSwKKwkJICBhdG9taWNfcmVhZCgmbGVhc3QtPndlaWdodCksIGxvaCk7CisKKwlyZXR1cm4gbGVhc3Q7Cit9CisKKworc3RhdGljIHN0cnVjdCBpcF92c19zY2hlZHVsZXIgaXBfdnNfbnFfc2NoZWR1bGVyID0KK3sKKwkubmFtZSA9CQkJIm5xIiwKKwkucmVmY250ID0JCUFUT01JQ19JTklUKDApLAorCS5tb2R1bGUgPQkJVEhJU19NT0RVTEUsCisJLmluaXRfc2VydmljZSA9CQlpcF92c19ucV9pbml0X3N2YywKKwkuZG9uZV9zZXJ2aWNlID0JCWlwX3ZzX25xX2RvbmVfc3ZjLAorCS51cGRhdGVfc2VydmljZSA9CWlwX3ZzX25xX3VwZGF0ZV9zdmMsCisJLnNjaGVkdWxlID0JCWlwX3ZzX25xX3NjaGVkdWxlLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBpcF92c19ucV9pbml0KHZvaWQpCit7CisJSU5JVF9MSVNUX0hFQUQoJmlwX3ZzX25xX3NjaGVkdWxlci5uX2xpc3QpOworCXJldHVybiByZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoJmlwX3ZzX25xX3NjaGVkdWxlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpcF92c19ucV9jbGVhbnVwKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoJmlwX3ZzX25xX3NjaGVkdWxlcik7Cit9CisKK21vZHVsZV9pbml0KGlwX3ZzX25xX2luaXQpOworbW9kdWxlX2V4aXQoaXBfdnNfbnFfY2xlYW51cCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUzYzQ2MgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG8uYwpAQCAtMCwwICsxLDI0NCBAQAorLyoKKyAqIGlwX3ZzX3Byb3RvLmM6IHRyYW5zcG9ydCBwcm90b2NvbCBsb2FkIGJhbGFuY2luZyBzdXBwb3J0IGZvciBJUFZTCisgKgorICogVmVyc2lvbjogICAgICRJZDogaXBfdnNfcHJvdG8uYyx2IDEuMiAyMDAzLzA0LzE4IDA5OjAzOjE2IHdlbnNvbmcgRXhwICQKKyAqCisgKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgorICogICAgICAgICAgICAgIEp1bGlhbiBBbmFzdGFzb3YgPGphQHNzaS5iZz4KKyAqCisgKiAgICAgICAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICAgICAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgICAgICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgICAgICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDaGFuZ2VzOgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvdWRwLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisKKyNpbmNsdWRlIDxuZXQvaXBfdnMuaD4KKworCisvKgorICogSVBWUyBwcm90b2NvbHMgY2FuIG9ubHkgYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgd2hlbiB0aGUgaXB2cworICogbW9kdWxlIGlzIGxvYWRlZC91bmxvYWRlZCwgc28gbm8gbG9jayBpcyBuZWVkZWQgaW4gYWNjZXNzaW5nIHRoZQorICogaXB2cyBwcm90b2NvbCB0YWJsZS4KKyAqLworCisjZGVmaW5lIElQX1ZTX1BST1RPX1RBQl9TSVpFCQkzMgkvKiBtdXN0IGJlIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgSVBfVlNfUFJPVE9fSEFTSChwcm90bykJCSgocHJvdG8pICYgKElQX1ZTX1BST1RPX1RBQl9TSVpFLTEpKQorCitzdGF0aWMgc3RydWN0IGlwX3ZzX3Byb3RvY29sICppcF92c19wcm90b190YWJsZVtJUF9WU19QUk9UT19UQUJfU0laRV07CisKKworLyoKKyAqCXJlZ2lzdGVyIGFuIGlwdnMgcHJvdG9jb2wKKyAqLworc3RhdGljIGludCByZWdpc3Rlcl9pcF92c19wcm90b2NvbChzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQoreworCXVuc2lnbmVkIGhhc2ggPSBJUF9WU19QUk9UT19IQVNIKHBwLT5wcm90b2NvbCk7CisKKwlwcC0+bmV4dCA9IGlwX3ZzX3Byb3RvX3RhYmxlW2hhc2hdOworCWlwX3ZzX3Byb3RvX3RhYmxlW2hhc2hdID0gcHA7CisKKwlpZiAocHAtPmluaXQgIT0gTlVMTCkKKwkJcHAtPmluaXQocHApOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqCXVucmVnaXN0ZXIgYW4gaXB2cyBwcm90b2NvbAorICovCitzdGF0aWMgaW50IHVucmVnaXN0ZXJfaXBfdnNfcHJvdG9jb2woc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKK3sKKwlzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKipwcF9wOworCXVuc2lnbmVkIGhhc2ggPSBJUF9WU19QUk9UT19IQVNIKHBwLT5wcm90b2NvbCk7CisKKwlwcF9wID0gJmlwX3ZzX3Byb3RvX3RhYmxlW2hhc2hdOworCWZvciAoOyAqcHBfcDsgcHBfcCA9ICYoKnBwX3ApLT5uZXh0KSB7CisJCWlmICgqcHBfcCA9PSBwcCkgeworCQkJKnBwX3AgPSBwcC0+bmV4dDsKKwkJCWlmIChwcC0+ZXhpdCAhPSBOVUxMKQorCQkJCXBwLT5leGl0KHBwKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIC1FU1JDSDsKK30KKworCisvKgorICoJZ2V0IGlwX3ZzX3Byb3RvY29sIG9iamVjdCBieSBpdHMgcHJvdG8uCisgKi8KK3N0cnVjdCBpcF92c19wcm90b2NvbCAqIGlwX3ZzX3Byb3RvX2dldCh1bnNpZ25lZCBzaG9ydCBwcm90bykKK3sKKwlzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwOworCXVuc2lnbmVkIGhhc2ggPSBJUF9WU19QUk9UT19IQVNIKHByb3RvKTsKKworCWZvciAocHAgPSBpcF92c19wcm90b190YWJsZVtoYXNoXTsgcHA7IHBwID0gcHAtPm5leHQpIHsKKwkJaWYgKHBwLT5wcm90b2NvbCA9PSBwcm90bykKKwkJCXJldHVybiBwcDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworCisvKgorICoJUHJvcGFnYXRlIGV2ZW50IGZvciBzdGF0ZSBjaGFuZ2UgdG8gYWxsIHByb3RvY29scworICovCit2b2lkIGlwX3ZzX3Byb3RvY29sX3RpbWVvdXRfY2hhbmdlKGludCBmbGFncykKK3sKKwlzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IElQX1ZTX1BST1RPX1RBQl9TSVpFOyBpKyspIHsKKwkJZm9yIChwcCA9IGlwX3ZzX3Byb3RvX3RhYmxlW2ldOyBwcDsgcHAgPSBwcC0+bmV4dCkgeworCQkJaWYgKHBwLT50aW1lb3V0X2NoYW5nZSkKKwkJCQlwcC0+dGltZW91dF9jaGFuZ2UocHAsIGZsYWdzKTsKKwkJfQorCX0KK30KKworCitpbnQgKgoraXBfdnNfY3JlYXRlX3RpbWVvdXRfdGFibGUoaW50ICp0YWJsZSwgaW50IHNpemUpCit7CisJaW50ICp0OworCisJdCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKHQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJbWVtY3B5KHQsIHRhYmxlLCBzaXplKTsKKwlyZXR1cm4gdDsKK30KKworCisvKgorICoJU2V0IHRpbWVvdXQgdmFsdWUgZm9yIHN0YXRlIHNwZWNpZmllZCBieSBuYW1lCisgKi8KK2ludAoraXBfdnNfc2V0X3N0YXRlX3RpbWVvdXQoaW50ICp0YWJsZSwgaW50IG51bSwgY2hhciAqKm5hbWVzLCBjaGFyICpuYW1lLCBpbnQgdG8pCit7CisJaW50IGk7CisKKwlpZiAoIXRhYmxlIHx8ICFuYW1lIHx8ICF0bykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJaWYgKHN0cmNtcChuYW1lc1tpXSwgbmFtZSkpCisJCQljb250aW51ZTsKKwkJdGFibGVbaV0gPSB0byAqIEhaOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FTk9FTlQ7Cit9CisKKworY29uc3QgY2hhciAqIGlwX3ZzX3N0YXRlX25hbWUoX191MTYgcHJvdG8sIGludCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwID0gaXBfdnNfcHJvdG9fZ2V0KHByb3RvKTsKKworCWlmIChwcCA9PSBOVUxMIHx8IHBwLT5zdGF0ZV9uYW1lID09IE5VTEwpCisJCXJldHVybiAiRVJSISI7CisJcmV0dXJuIHBwLT5zdGF0ZV9uYW1lKHN0YXRlKTsKK30KKworCit2b2lkCitpcF92c190Y3B1ZHBfZGVidWdfcGFja2V0KHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsCisJCQkgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIGludCBvZmZzZXQsCisJCQkgIGNvbnN0IGNoYXIgKm1zZykKK3sKKwljaGFyIGJ1ZlsxMjhdOworCXN0cnVjdCBpcGhkciBfaXBoLCAqaWg7CisKKwlpaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgc2l6ZW9mKF9pcGgpLCAmX2lwaCk7CisJaWYgKGloID09IE5VTEwpCisJCXNwcmludGYoYnVmLCAiJXMgVFJVTkNBVEVEIiwgcHAtPm5hbWUpOworCWVsc2UgaWYgKGloLT5mcmFnX29mZiAmIF9fY29uc3RhbnRfaHRvbnMoSVBfT0ZGU0VUKSkKKwkJc3ByaW50ZihidWYsICIlcyAldS4ldS4ldS4ldS0+JXUuJXUuJXUuJXUgZnJhZyIsCisJCQlwcC0+bmFtZSwgTklQUVVBRChpaC0+c2FkZHIpLAorCQkJTklQUVVBRChpaC0+ZGFkZHIpKTsKKwllbHNlIHsKKwkJX191MTYgX3BvcnRzWzJdLCAqcHB0cgorOworCQlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0ICsgaWgtPmlobCo0LAorCQkJCQkgIHNpemVvZihfcG9ydHMpLCBfcG9ydHMpOworCQlpZiAocHB0ciA9PSBOVUxMKQorCQkJc3ByaW50ZihidWYsICIlcyBUUlVOQ0FURUQgJXUuJXUuJXUuJXUtPiV1LiV1LiV1LiV1IiwKKwkJCQlwcC0+bmFtZSwKKwkJCQlOSVBRVUFEKGloLT5zYWRkciksCisJCQkJTklQUVVBRChpaC0+ZGFkZHIpKTsKKwkJZWxzZQorCQkJc3ByaW50ZihidWYsICIlcyAldS4ldS4ldS4ldToldS0+JXUuJXUuJXUuJXU6JXUiLAorCQkJCXBwLT5uYW1lLAorCQkJCU5JUFFVQUQoaWgtPnNhZGRyKSwKKwkJCQludG9ocyhwcHRyWzBdKSwKKwkJCQlOSVBRVUFEKGloLT5kYWRkciksCisJCQkJbnRvaHMocHB0clsxXSkpOworCX0KKworCXByaW50ayhLRVJOX0RFQlVHICJJUFZTOiAlczogJXNcbiIsIG1zZywgYnVmKTsKK30KKworCitpbnQgaXBfdnNfcHJvdG9jb2xfaW5pdCh2b2lkKQoreworCWNoYXIgcHJvdG9jb2xzWzY0XTsKKyNkZWZpbmUgUkVHSVNURVJfUFJPVE9DT0wocCkJCQlcCisJZG8gewkJCQkJXAorCQlyZWdpc3Rlcl9pcF92c19wcm90b2NvbChwKTsJXAorCQlzdHJjYXQocHJvdG9jb2xzLCAiLCAiKTsJXAorCQlzdHJjYXQocHJvdG9jb2xzLCAocCktPm5hbWUpOwlcCisJfSB3aGlsZSAoMCkKKworCXByb3RvY29sc1swXSA9ICdcMCc7CisJcHJvdG9jb2xzWzJdID0gJ1wwJzsKKyNpZmRlZiBDT05GSUdfSVBfVlNfUFJPVE9fVENQCisJUkVHSVNURVJfUFJPVE9DT0woJmlwX3ZzX3Byb3RvY29sX3RjcCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSVBfVlNfUFJPVE9fVURQCisJUkVHSVNURVJfUFJPVE9DT0woJmlwX3ZzX3Byb3RvY29sX3VkcCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSVBfVlNfUFJPVE9fSUNNUAorCVJFR0lTVEVSX1BST1RPQ09MKCZpcF92c19wcm90b2NvbF9pY21wKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19JUF9WU19QUk9UT19BSAorCVJFR0lTVEVSX1BST1RPQ09MKCZpcF92c19wcm90b2NvbF9haCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSVBfVlNfUFJPVE9fRVNQCisJUkVHSVNURVJfUFJPVE9DT0woJmlwX3ZzX3Byb3RvY29sX2VzcCk7CisjZW5kaWYKKwlJUF9WU19JTkZPKCJSZWdpc3RlcmVkIHByb3RvY29scyAoJXMpXG4iLCAmcHJvdG9jb2xzWzJdKTsKKworCXJldHVybiAwOworfQorCisKK3ZvaWQgaXBfdnNfcHJvdG9jb2xfY2xlYW51cCh2b2lkKQoreworCXN0cnVjdCBpcF92c19wcm90b2NvbCAqcHA7CisJaW50IGk7CisKKwkvKiB1bnJlZ2lzdGVyIGFsbCB0aGUgaXB2cyBwcm90b2NvbHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgSVBfVlNfUFJPVE9fVEFCX1NJWkU7IGkrKykgeworCQl3aGlsZSAoKHBwID0gaXBfdnNfcHJvdG9fdGFibGVbaV0pICE9IE5VTEwpCisJCQl1bnJlZ2lzdGVyX2lwX3ZzX3Byb3RvY29sKHBwKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX2FoLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX2FoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzZTk0YQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fYWguYwpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIGlwX3ZzX3Byb3RvX2FoLmM6CUFIIElQU2VjIGxvYWQgYmFsYW5jaW5nIHN1cHBvcnQgZm9yIElQVlMKKyAqCisgKiBWZXJzaW9uOiAgICAgJElkOiBpcF92c19wcm90b19haC5jLHYgMS4xIDIwMDMvMDcvMDQgMTU6MDQ6Mzcgd2Vuc29uZyBFeHAgJAorICoKKyAqIEF1dGhvcnM6CUp1bGlhbiBBbmFzdGFzb3YgPGphQHNzaS5iZz4sIEZlYnJ1YXJ5IDIwMDIKKyAqCQlXZW5zb25nIFpoYW5nIDx3ZW5zb25nQGxpbnV4dmlydHVhbHNlcnZlci5vcmc+CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCXZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXBfdnMuaD4KKworCisvKiBUT0RPOgorCitzdHJ1Y3QgaXNha21wX2hkciB7CisJX191OAkJaWNvb2tpZVs4XTsKKwlfX3U4CQlyY29va2llWzhdOworCV9fdTgJCW5wOworCV9fdTgJCXZlcnNpb247CisJX191OAkJeGNoZ3R5cGU7CisJX191OAkJZmxhZ3M7CisJX191MzIJCW1zZ2lkOworCV9fdTMyCQlsZW5ndGg7Cit9OworCisqLworCisjZGVmaW5lIFBPUlRfSVNBS01QCTUwMAorCisKK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfY29ubiAqCithaF9jb25uX2luX2dldChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSAgICAgICBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAorCSAgICAgICBjb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCwKKwkgICAgICAgdW5zaWduZWQgaW50IHByb3RvX29mZiwKKwkgICAgICAgaW50IGludmVyc2UpCit7CisJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOworCisJaWYgKGxpa2VseSghaW52ZXJzZSkpIHsKKwkJY3AgPSBpcF92c19jb25uX2luX2dldChJUFBST1RPX1VEUCwKKwkJCQkgICAgICAgaXBoLT5zYWRkciwKKwkJCQkgICAgICAgX19jb25zdGFudF9odG9ucyhQT1JUX0lTQUtNUCksCisJCQkJICAgICAgIGlwaC0+ZGFkZHIsCisJCQkJICAgICAgIF9fY29uc3RhbnRfaHRvbnMoUE9SVF9JU0FLTVApKTsKKwl9IGVsc2UgeworCQljcCA9IGlwX3ZzX2Nvbm5faW5fZ2V0KElQUFJPVE9fVURQLAorCQkJCSAgICAgICBpcGgtPmRhZGRyLAorCQkJCSAgICAgICBfX2NvbnN0YW50X2h0b25zKFBPUlRfSVNBS01QKSwKKwkJCQkgICAgICAgaXBoLT5zYWRkciwKKwkJCQkgICAgICAgX19jb25zdGFudF9odG9ucyhQT1JUX0lTQUtNUCkpOworCX0KKworCWlmICghY3ApIHsKKwkJLyoKKwkJICogV2UgYXJlIG5vdCBzdXJlIGlmIHRoZSBwYWNrZXQgaXMgZnJvbSBvdXIKKwkJICogc2VydmljZSwgc28gb3VyIGNvbm5fc2NoZWR1bGUgaG9vayBzaG91bGQgcmV0dXJuIE5GX0FDQ0VQVAorCQkgKi8KKwkJSVBfVlNfREJHKDEyLCAiVW5rbm93biBJU0FLTVAgZW50cnkgZm9yIG91dGluIHBhY2tldCAiCisJCQkgICIlcyVzICV1LiV1LiV1LiV1LT4ldS4ldS4ldS4ldVxuIiwKKwkJCSAgaW52ZXJzZSA/ICJJQ01QKyIgOiAiIiwKKwkJCSAgcHAtPm5hbWUsCisJCQkgIE5JUFFVQUQoaXBoLT5zYWRkciksCisJCQkgIE5JUFFVQUQoaXBoLT5kYWRkcikpOworCX0KKworCXJldHVybiBjcDsKK30KKworCitzdGF0aWMgc3RydWN0IGlwX3ZzX2Nvbm4gKgorYWhfY29ubl9vdXRfZ2V0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsCisJCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoLCB1bnNpZ25lZCBpbnQgcHJvdG9fb2ZmLCBpbnQgaW52ZXJzZSkKK3sKKwlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7CisKKwlpZiAobGlrZWx5KCFpbnZlcnNlKSkgeworCQljcCA9IGlwX3ZzX2Nvbm5fb3V0X2dldChJUFBST1RPX1VEUCwKKwkJCQkJaXBoLT5zYWRkciwKKwkJCQkJX19jb25zdGFudF9odG9ucyhQT1JUX0lTQUtNUCksCisJCQkJCWlwaC0+ZGFkZHIsCisJCQkJCV9fY29uc3RhbnRfaHRvbnMoUE9SVF9JU0FLTVApKTsKKwl9IGVsc2UgeworCQljcCA9IGlwX3ZzX2Nvbm5fb3V0X2dldChJUFBST1RPX1VEUCwKKwkJCQkJaXBoLT5kYWRkciwKKwkJCQkJX19jb25zdGFudF9odG9ucyhQT1JUX0lTQUtNUCksCisJCQkJCWlwaC0+c2FkZHIsCisJCQkJCV9fY29uc3RhbnRfaHRvbnMoUE9SVF9JU0FLTVApKTsKKwl9CisKKwlpZiAoIWNwKSB7CisJCUlQX1ZTX0RCRygxMiwgIlVua25vd24gSVNBS01QIGVudHJ5IGZvciBpbm91dCBwYWNrZXQgIgorCQkJICAiJXMlcyAldS4ldS4ldS4ldS0+JXUuJXUuJXUuJXVcbiIsCisJCQkgIGludmVyc2UgPyAiSUNNUCsiIDogIiIsCisJCQkgIHBwLT5uYW1lLAorCQkJICBOSVBRVUFEKGlwaC0+c2FkZHIpLAorCQkJICBOSVBRVUFEKGlwaC0+ZGFkZHIpKTsKKwl9CisKKwlyZXR1cm4gY3A7Cit9CisKKworc3RhdGljIGludAorYWhfY29ubl9zY2hlZHVsZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKKwkJIGludCAqdmVyZGljdCwgc3RydWN0IGlwX3ZzX2Nvbm4gKipjcHApCit7CisJLyoKKwkgKiBBSCBpcyBvbmx5IHJlbGF0ZWQgdHJhZmZpYy4gUGFzcyB0aGUgcGFja2V0IHRvIElQIHN0YWNrLgorCSAqLworCSp2ZXJkaWN0ID0gTkZfQUNDRVBUOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkCithaF9kZWJ1Z19wYWNrZXQoc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJaW50IG9mZnNldCwgY29uc3QgY2hhciAqbXNnKQoreworCWNoYXIgYnVmWzI1Nl07CisJc3RydWN0IGlwaGRyIF9pcGgsICppaDsKKworCWloID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0LCBzaXplb2YoX2lwaCksICZfaXBoKTsKKwlpZiAoaWggPT0gTlVMTCkKKwkJc3ByaW50ZihidWYsICIlcyBUUlVOQ0FURUQiLCBwcC0+bmFtZSk7CisJZWxzZQorCQlzcHJpbnRmKGJ1ZiwgIiVzICV1LiV1LiV1LiV1LT4ldS4ldS4ldS4ldSIsCisJCQlwcC0+bmFtZSwgTklQUVVBRChpaC0+c2FkZHIpLAorCQkJTklQUVVBRChpaC0+ZGFkZHIpKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJJUFZTOiAlczogJXNcbiIsIG1zZywgYnVmKTsKK30KKworCitzdGF0aWMgdm9pZCBhaF9pbml0KHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHApCit7CisJLyogbm90aGluZyB0byBkbyBub3cgKi8KK30KKworCitzdGF0aWMgdm9pZCBhaF9leGl0KHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHApCit7CisJLyogbm90aGluZyB0byBkbyBub3cgKi8KK30KKworCitzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgaXBfdnNfcHJvdG9jb2xfYWggPSB7CisJLm5hbWUgPQkJCSJBSCIsCisJLnByb3RvY29sID0JCUlQUFJPVE9fQUgsCisJLmRvbnRfZGVmcmFnID0JCTEsCisJLmluaXQgPQkJCWFoX2luaXQsCisJLmV4aXQgPQkJCWFoX2V4aXQsCisJLmNvbm5fc2NoZWR1bGUgPQlhaF9jb25uX3NjaGVkdWxlLAorCS5jb25uX2luX2dldCA9CQlhaF9jb25uX2luX2dldCwKKwkuY29ubl9vdXRfZ2V0ID0JCWFoX2Nvbm5fb3V0X2dldCwKKwkuc25hdF9oYW5kbGVyID0JCU5VTEwsCisJLmRuYXRfaGFuZGxlciA9CQlOVUxMLAorCS5jc3VtX2NoZWNrID0JCU5VTEwsCisJLnN0YXRlX3RyYW5zaXRpb24gPQlOVUxMLAorCS5yZWdpc3Rlcl9hcHAgPQkJTlVMTCwKKwkudW5yZWdpc3Rlcl9hcHAgPQlOVUxMLAorCS5hcHBfY29ubl9iaW5kID0JTlVMTCwKKwkuZGVidWdfcGFja2V0ID0JCWFoX2RlYnVnX3BhY2tldCwKKwkudGltZW91dF9jaGFuZ2UgPQlOVUxMLAkJLyogSVNBS01QICovCisJLnNldF9zdGF0ZV90aW1lb3V0ID0JTlVMTCwKK307CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX2VzcC5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90b19lc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzhlNWM3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90b19lc3AuYwpAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqIGlwX3ZzX3Byb3RvX2VzcC5jOglFU1AgSVBTZWMgbG9hZCBiYWxhbmNpbmcgc3VwcG9ydCBmb3IgSVBWUworICoKKyAqIFZlcnNpb246ICAgICAkSWQ6IGlwX3ZzX3Byb3RvX2VzcC5jLHYgMS4xIDIwMDMvMDcvMDQgMTU6MDQ6Mzcgd2Vuc29uZyBFeHAgJAorICoKKyAqIEF1dGhvcnM6CUp1bGlhbiBBbmFzdGFzb3YgPGphQHNzaS5iZz4sIEZlYnJ1YXJ5IDIwMDIKKyAqCQlXZW5zb25nIFpoYW5nIDx3ZW5zb25nQGxpbnV4dmlydHVhbHNlcnZlci5vcmc+CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCXZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXBfdnMuaD4KKworCisvKiBUT0RPOgorCitzdHJ1Y3QgaXNha21wX2hkciB7CisJX191OAkJaWNvb2tpZVs4XTsKKwlfX3U4CQlyY29va2llWzhdOworCV9fdTgJCW5wOworCV9fdTgJCXZlcnNpb247CisJX191OAkJeGNoZ3R5cGU7CisJX191OAkJZmxhZ3M7CisJX191MzIJCW1zZ2lkOworCV9fdTMyCQlsZW5ndGg7Cit9OworCisqLworCisjZGVmaW5lIFBPUlRfSVNBS01QCTUwMAorCisKK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfY29ubiAqCitlc3BfY29ubl9pbl9nZXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKKwkJY29uc3Qgc3RydWN0IGlwaGRyICppcGgsCisJCXVuc2lnbmVkIGludCBwcm90b19vZmYsCisJCWludCBpbnZlcnNlKQoreworCXN0cnVjdCBpcF92c19jb25uICpjcDsKKworCWlmIChsaWtlbHkoIWludmVyc2UpKSB7CisJCWNwID0gaXBfdnNfY29ubl9pbl9nZXQoSVBQUk9UT19VRFAsCisJCQkJICAgICAgIGlwaC0+c2FkZHIsCisJCQkJICAgICAgIF9fY29uc3RhbnRfaHRvbnMoUE9SVF9JU0FLTVApLAorCQkJCSAgICAgICBpcGgtPmRhZGRyLAorCQkJCSAgICAgICBfX2NvbnN0YW50X2h0b25zKFBPUlRfSVNBS01QKSk7CisJfSBlbHNlIHsKKwkJY3AgPSBpcF92c19jb25uX2luX2dldChJUFBST1RPX1VEUCwKKwkJCQkgICAgICAgaXBoLT5kYWRkciwKKwkJCQkgICAgICAgX19jb25zdGFudF9odG9ucyhQT1JUX0lTQUtNUCksCisJCQkJICAgICAgIGlwaC0+c2FkZHIsCisJCQkJICAgICAgIF9fY29uc3RhbnRfaHRvbnMoUE9SVF9JU0FLTVApKTsKKwl9CisKKwlpZiAoIWNwKSB7CisJCS8qCisJCSAqIFdlIGFyZSBub3Qgc3VyZSBpZiB0aGUgcGFja2V0IGlzIGZyb20gb3VyCisJCSAqIHNlcnZpY2UsIHNvIG91ciBjb25uX3NjaGVkdWxlIGhvb2sgc2hvdWxkIHJldHVybiBORl9BQ0NFUFQKKwkJICovCisJCUlQX1ZTX0RCRygxMiwgIlVua25vd24gSVNBS01QIGVudHJ5IGZvciBvdXRpbiBwYWNrZXQgIgorCQkJICAiJXMlcyAldS4ldS4ldS4ldS0+JXUuJXUuJXUuJXVcbiIsCisJCQkgIGludmVyc2UgPyAiSUNNUCsiIDogIiIsCisJCQkgIHBwLT5uYW1lLAorCQkJICBOSVBRVUFEKGlwaC0+c2FkZHIpLAorCQkJICBOSVBRVUFEKGlwaC0+ZGFkZHIpKTsKKwl9CisKKwlyZXR1cm4gY3A7Cit9CisKKworc3RhdGljIHN0cnVjdCBpcF92c19jb25uICoKK2VzcF9jb25uX291dF9nZXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKKwkJIGNvbnN0IHN0cnVjdCBpcGhkciAqaXBoLCB1bnNpZ25lZCBpbnQgcHJvdG9fb2ZmLCBpbnQgaW52ZXJzZSkKK3sKKwlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7CisKKwlpZiAobGlrZWx5KCFpbnZlcnNlKSkgeworCQljcCA9IGlwX3ZzX2Nvbm5fb3V0X2dldChJUFBST1RPX1VEUCwKKwkJCQkJaXBoLT5zYWRkciwKKwkJCQkJX19jb25zdGFudF9odG9ucyhQT1JUX0lTQUtNUCksCisJCQkJCWlwaC0+ZGFkZHIsCisJCQkJCV9fY29uc3RhbnRfaHRvbnMoUE9SVF9JU0FLTVApKTsKKwl9IGVsc2UgeworCQljcCA9IGlwX3ZzX2Nvbm5fb3V0X2dldChJUFBST1RPX1VEUCwKKwkJCQkJaXBoLT5kYWRkciwKKwkJCQkJX19jb25zdGFudF9odG9ucyhQT1JUX0lTQUtNUCksCisJCQkJCWlwaC0+c2FkZHIsCisJCQkJCV9fY29uc3RhbnRfaHRvbnMoUE9SVF9JU0FLTVApKTsKKwl9CisKKwlpZiAoIWNwKSB7CisJCUlQX1ZTX0RCRygxMiwgIlVua25vd24gSVNBS01QIGVudHJ5IGZvciBpbm91dCBwYWNrZXQgIgorCQkJICAiJXMlcyAldS4ldS4ldS4ldS0+JXUuJXUuJXUuJXVcbiIsCisJCQkgIGludmVyc2UgPyAiSUNNUCsiIDogIiIsCisJCQkgIHBwLT5uYW1lLAorCQkJICBOSVBRVUFEKGlwaC0+c2FkZHIpLAorCQkJICBOSVBRVUFEKGlwaC0+ZGFkZHIpKTsKKwl9CisKKwlyZXR1cm4gY3A7Cit9CisKKworc3RhdGljIGludAorZXNwX2Nvbm5fc2NoZWR1bGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKKwkJICBpbnQgKnZlcmRpY3QsIHN0cnVjdCBpcF92c19jb25uICoqY3BwKQoreworCS8qCisJICogRVNQIGlzIG9ubHkgcmVsYXRlZCB0cmFmZmljLiBQYXNzIHRoZSBwYWNrZXQgdG8gSVAgc3RhY2suCisJICovCisJKnZlcmRpY3QgPSBORl9BQ0NFUFQ7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQKK2VzcF9kZWJ1Z19wYWNrZXQoc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJIGludCBvZmZzZXQsIGNvbnN0IGNoYXIgKm1zZykKK3sKKwljaGFyIGJ1ZlsyNTZdOworCXN0cnVjdCBpcGhkciBfaXBoLCAqaWg7CisKKwlpaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgc2l6ZW9mKF9pcGgpLCAmX2lwaCk7CisJaWYgKGloID09IE5VTEwpCisJCXNwcmludGYoYnVmLCAiJXMgVFJVTkNBVEVEIiwgcHAtPm5hbWUpOworCWVsc2UKKwkJc3ByaW50ZihidWYsICIlcyAldS4ldS4ldS4ldS0+JXUuJXUuJXUuJXUiLAorCQkJcHAtPm5hbWUsIE5JUFFVQUQoaWgtPnNhZGRyKSwKKwkJCU5JUFFVQUQoaWgtPmRhZGRyKSk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiSVBWUzogJXM6ICVzXG4iLCBtc2csIGJ1Zik7Cit9CisKKworc3RhdGljIHZvaWQgZXNwX2luaXQoc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKK3sKKwkvKiBub3RoaW5nIHRvIGRvIG5vdyAqLworfQorCisKK3N0YXRpYyB2b2lkIGVzcF9leGl0KHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHApCit7CisJLyogbm90aGluZyB0byBkbyBub3cgKi8KK30KKworCitzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgaXBfdnNfcHJvdG9jb2xfZXNwID0geworCS5uYW1lID0JCQkiRVNQIiwKKwkucHJvdG9jb2wgPQkJSVBQUk9UT19FU1AsCisJLmRvbnRfZGVmcmFnID0JCTEsCisJLmluaXQgPQkJCWVzcF9pbml0LAorCS5leGl0ID0JCQllc3BfZXhpdCwKKwkuY29ubl9zY2hlZHVsZSA9CWVzcF9jb25uX3NjaGVkdWxlLAorCS5jb25uX2luX2dldCA9CQllc3BfY29ubl9pbl9nZXQsCisJLmNvbm5fb3V0X2dldCA9CQllc3BfY29ubl9vdXRfZ2V0LAorCS5zbmF0X2hhbmRsZXIgPQkJTlVMTCwKKwkuZG5hdF9oYW5kbGVyID0JCU5VTEwsCisJLmNzdW1fY2hlY2sgPQkJTlVMTCwKKwkuc3RhdGVfdHJhbnNpdGlvbiA9CU5VTEwsCisJLnJlZ2lzdGVyX2FwcCA9CQlOVUxMLAorCS51bnJlZ2lzdGVyX2FwcCA9CU5VTEwsCisJLmFwcF9jb25uX2JpbmQgPQlOVUxMLAorCS5kZWJ1Z19wYWNrZXQgPQkJZXNwX2RlYnVnX3BhY2tldCwKKwkudGltZW91dF9jaGFuZ2UgPQlOVUxMLAkJLyogSVNBS01QICovCit9OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90b19pY21wLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX2ljbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTFlOTRhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90b19pY21wLmMKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBpcF92c19wcm90b19pY21wLmM6CUlDTVAgbG9hZCBiYWxhbmNpbmcgc3VwcG9ydCBmb3IgSVAgVmlydHVhbCBTZXJ2ZXIKKyAqCisgKiBBdXRob3JzOglKdWxpYW4gQW5hc3Rhc292IDxqYUBzc2kuYmc+LCBNYXJjaCAyMDAyCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCXZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ljbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorCisjaW5jbHVkZSA8bmV0L2lwX3ZzLmg+CisKKworc3RhdGljIGludCBpY21wX3RpbWVvdXRzWzFdID0JCXsgMSo2MCpIWiB9OworCitzdGF0aWMgY2hhciAqIGljbXBfc3RhdGVfbmFtZV90YWJsZVsxXSA9IHsgIklDTVAiIH07CisKK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfY29ubiAqCitpY21wX2Nvbm5faW5fZ2V0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCSBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAorCQkgY29uc3Qgc3RydWN0IGlwaGRyICppcGgsCisJCSB1bnNpZ25lZCBpbnQgcHJvdG9fb2ZmLAorCQkgaW50IGludmVyc2UpCit7CisjaWYgMAorCXN0cnVjdCBpcF92c19jb25uICpjcDsKKworCWlmIChsaWtlbHkoIWludmVyc2UpKSB7CisJCWNwID0gaXBfdnNfY29ubl9pbl9nZXQoaXBoLT5wcm90b2NvbCwKKwkJCWlwaC0+c2FkZHIsIDAsCisJCQlpcGgtPmRhZGRyLCAwKTsKKwl9IGVsc2UgeworCQljcCA9IGlwX3ZzX2Nvbm5faW5fZ2V0KGlwaC0+cHJvdG9jb2wsCisJCQlpcGgtPmRhZGRyLCAwLAorCQkJaXBoLT5zYWRkciwgMCk7CisJfQorCisJcmV0dXJuIGNwOworCisjZWxzZQorCXJldHVybiBOVUxMOworI2VuZGlmCit9CisKK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfY29ubiAqCitpY21wX2Nvbm5fb3V0X2dldChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsCisJCSAgY29uc3Qgc3RydWN0IGlwaGRyICppcGgsCisJCSAgdW5zaWduZWQgaW50IHByb3RvX29mZiwKKwkJICBpbnQgaW52ZXJzZSkKK3sKKyNpZiAwCisJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOworCisJaWYgKGxpa2VseSghaW52ZXJzZSkpIHsKKwkJY3AgPSBpcF92c19jb25uX291dF9nZXQoaXBoLT5wcm90b2NvbCwKKwkJCWlwaC0+c2FkZHIsIDAsCisJCQlpcGgtPmRhZGRyLCAwKTsKKwl9IGVsc2UgeworCQljcCA9IGlwX3ZzX2Nvbm5fb3V0X2dldChJUFBST1RPX1VEUCwKKwkJCWlwaC0+ZGFkZHIsIDAsCisJCQlpcGgtPnNhZGRyLCAwKTsKKwl9CisKKwlyZXR1cm4gY3A7CisjZWxzZQorCXJldHVybiBOVUxMOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQKK2ljbXBfY29ubl9zY2hlZHVsZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAorCQkgICBpbnQgKnZlcmRpY3QsIHN0cnVjdCBpcF92c19jb25uICoqY3BwKQoreworCSp2ZXJkaWN0ID0gTkZfQUNDRVBUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpY21wX2NzdW1fY2hlY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKK3sKKwlpZiAoIShza2ItPm5oLmlwaC0+ZnJhZ19vZmYgJiBfX2NvbnN0YW50X2h0b25zKElQX09GRlNFVCkpKSB7CisJCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSkgeworCQkJaWYgKGlwX3ZzX2NoZWNrc3VtX2NvbXBsZXRlKHNrYiwgc2tiLT5uaC5pcGgtPmlobCAqIDQpKSB7CisJCQkJSVBfVlNfREJHX1JMX1BLVCgwLCBwcCwgc2tiLCAwLCAiRmFpbGVkIGNoZWNrc3VtIGZvciIpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAoraWNtcF9kZWJ1Z19wYWNrZXQoc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKKwkJICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgIGludCBvZmZzZXQsCisJCSAgY29uc3QgY2hhciAqbXNnKQoreworCWNoYXIgYnVmWzI1Nl07CisJc3RydWN0IGlwaGRyIF9pcGgsICppaDsKKworCWloID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0LCBzaXplb2YoX2lwaCksICZfaXBoKTsKKwlpZiAoaWggPT0gTlVMTCkKKwkJc3ByaW50ZihidWYsICIlcyBUUlVOQ0FURUQiLCBwcC0+bmFtZSk7CisJZWxzZSBpZiAoaWgtPmZyYWdfb2ZmICYgX19jb25zdGFudF9odG9ucyhJUF9PRkZTRVQpKQorCQlzcHJpbnRmKGJ1ZiwgIiVzICV1LiV1LiV1LiV1LT4ldS4ldS4ldS4ldSBmcmFnIiwKKwkJCXBwLT5uYW1lLCBOSVBRVUFEKGloLT5zYWRkciksCisJCQlOSVBRVUFEKGloLT5kYWRkcikpOworCWVsc2UgeworCQlzdHJ1Y3QgaWNtcGhkciBfaWNtcGgsICppYzsKKworCQlpYyA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCArIGloLT5paGwqNCwKKwkJCQkJc2l6ZW9mKF9pY21waCksICZfaWNtcGgpOworCQlpZiAoaWMgPT0gTlVMTCkKKwkJCXNwcmludGYoYnVmLCAiJXMgVFJVTkNBVEVEIHRvICV1IGJ5dGVzXG4iLAorCQkJCXBwLT5uYW1lLCBza2ItPmxlbiAtIG9mZnNldCk7CisJCWVsc2UKKwkJCXNwcmludGYoYnVmLCAiJXMgJXUuJXUuJXUuJXUtPiV1LiV1LiV1LiV1IFQ6JWQgQzolZCIsCisJCQkJcHAtPm5hbWUsIE5JUFFVQUQoaWgtPnNhZGRyKSwKKwkJCQlOSVBRVUFEKGloLT5kYWRkciksCisJCQkJaWMtPnR5cGUsIGljLT5jb2RlKTsKKwl9CisJcHJpbnRrKEtFUk5fREVCVUcgIklQVlM6ICVzOiAlc1xuIiwgbXNnLCBidWYpOworfQorCitzdGF0aWMgaW50CitpY21wX3N0YXRlX3RyYW5zaXRpb24oc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCBpbnQgZGlyZWN0aW9uLAorCQkgICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgICBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQoreworCWNwLT50aW1lb3V0ID0gcHAtPnRpbWVvdXRfdGFibGVbSVBfVlNfSUNNUF9TX05PUk1BTF07CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2ljbXBfc2V0X3N0YXRlX3RpbWVvdXQoc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwgY2hhciAqc25hbWUsIGludCB0bykKK3sKKwlpbnQgbnVtOworCWNoYXIgKipuYW1lczsKKworCW51bSA9IElQX1ZTX0lDTVBfU19MQVNUOworCW5hbWVzID0gaWNtcF9zdGF0ZV9uYW1lX3RhYmxlOworCXJldHVybiBpcF92c19zZXRfc3RhdGVfdGltZW91dChwcC0+dGltZW91dF90YWJsZSwgbnVtLCBuYW1lcywgc25hbWUsIHRvKTsKK30KKworCitzdGF0aWMgdm9pZCBpY21wX2luaXQoc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKK3sKKwlwcC0+dGltZW91dF90YWJsZSA9IGljbXBfdGltZW91dHM7Cit9CisKK3N0YXRpYyB2b2lkIGljbXBfZXhpdChzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQoreworfQorCitzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgaXBfdnNfcHJvdG9jb2xfaWNtcCA9IHsKKwkubmFtZSA9CQkJIklDTVAiLAorCS5wcm90b2NvbCA9CQlJUFBST1RPX0lDTVAsCisJLmRvbnRfZGVmcmFnID0JCTAsCisJLmluaXQgPQkJCWljbXBfaW5pdCwKKwkuZXhpdCA9CQkJaWNtcF9leGl0LAorCS5jb25uX3NjaGVkdWxlID0JaWNtcF9jb25uX3NjaGVkdWxlLAorCS5jb25uX2luX2dldCA9CQlpY21wX2Nvbm5faW5fZ2V0LAorCS5jb25uX291dF9nZXQgPQkJaWNtcF9jb25uX291dF9nZXQsCisJLnNuYXRfaGFuZGxlciA9CQlOVUxMLAorCS5kbmF0X2hhbmRsZXIgPQkJTlVMTCwKKwkuY3N1bV9jaGVjayA9CQlpY21wX2NzdW1fY2hlY2ssCisJLnN0YXRlX3RyYW5zaXRpb24gPQlpY21wX3N0YXRlX3RyYW5zaXRpb24sCisJLnJlZ2lzdGVyX2FwcCA9CQlOVUxMLAorCS51bnJlZ2lzdGVyX2FwcCA9CU5VTEwsCisJLmFwcF9jb25uX2JpbmQgPQlOVUxMLAorCS5kZWJ1Z19wYWNrZXQgPQkJaWNtcF9kZWJ1Z19wYWNrZXQsCisJLnRpbWVvdXRfY2hhbmdlID0JTlVMTCwKKwkuc2V0X3N0YXRlX3RpbWVvdXQgPQlpY21wX3NldF9zdGF0ZV90aW1lb3V0LAorfTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fdGNwLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX3RjcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NWRlNjcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX3RjcC5jCkBAIC0wLDAgKzEsNjQwIEBACisvKgorICogaXBfdnNfcHJvdG9fdGNwLmM6CVRDUCBsb2FkIGJhbGFuY2luZyBzdXBwb3J0IGZvciBJUFZTCisgKgorICogVmVyc2lvbjogICAgICRJZDogaXBfdnNfcHJvdG9fdGNwLmMsdiAxLjMgMjAwMi8xMS8zMCAwMTo1MDozNSB3ZW5zb25nIEV4cCAkCisgKgorICogQXV0aG9yczogICAgIFdlbnNvbmcgWmhhbmcgPHdlbnNvbmdAbGludXh2aXJ0dWFsc2VydmVyLm9yZz4KKyAqICAgICAgICAgICAgICBKdWxpYW4gQW5hc3Rhc292IDxqYUBzc2kuYmc+CisgKgorICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQ2hhbmdlczoKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+ICAgICAgICAgICAgICAgICAgLyogZm9yIHRjcGhkciAqLworI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4gICAgICAgICAgICAgICAgICAgIC8qIGZvciBjc3VtX3RjcHVkcF9tYWdpYyAqLworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXBfdnMuaD4KKworCitzdGF0aWMgc3RydWN0IGlwX3ZzX2Nvbm4gKgordGNwX2Nvbm5faW5fZ2V0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsCisJCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoLCB1bnNpZ25lZCBpbnQgcHJvdG9fb2ZmLCBpbnQgaW52ZXJzZSkKK3sKKwlfX3UxNiBfcG9ydHNbMl0sICpwcHRyOworCisJcHB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvX29mZiwgc2l6ZW9mKF9wb3J0cyksIF9wb3J0cyk7CisJaWYgKHBwdHIgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAobGlrZWx5KCFpbnZlcnNlKSkgeworCQlyZXR1cm4gaXBfdnNfY29ubl9pbl9nZXQoaXBoLT5wcm90b2NvbCwKKwkJCQkJIGlwaC0+c2FkZHIsIHBwdHJbMF0sCisJCQkJCSBpcGgtPmRhZGRyLCBwcHRyWzFdKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gaXBfdnNfY29ubl9pbl9nZXQoaXBoLT5wcm90b2NvbCwKKwkJCQkJIGlwaC0+ZGFkZHIsIHBwdHJbMV0sCisJCQkJCSBpcGgtPnNhZGRyLCBwcHRyWzBdKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfY29ubiAqCit0Y3BfY29ubl9vdXRfZ2V0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsCisJCSBjb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCwgdW5zaWduZWQgaW50IHByb3RvX29mZiwgaW50IGludmVyc2UpCit7CisJX191MTYgX3BvcnRzWzJdLCAqcHB0cjsKKworCXBwdHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwcm90b19vZmYsIHNpemVvZihfcG9ydHMpLCBfcG9ydHMpOworCWlmIChwcHRyID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaWYgKGxpa2VseSghaW52ZXJzZSkpIHsKKwkJcmV0dXJuIGlwX3ZzX2Nvbm5fb3V0X2dldChpcGgtPnByb3RvY29sLAorCQkJCQkgIGlwaC0+c2FkZHIsIHBwdHJbMF0sCisJCQkJCSAgaXBoLT5kYWRkciwgcHB0clsxXSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGlwX3ZzX2Nvbm5fb3V0X2dldChpcGgtPnByb3RvY29sLAorCQkJCQkgIGlwaC0+ZGFkZHIsIHBwdHJbMV0sCisJCQkJCSAgaXBoLT5zYWRkciwgcHB0clswXSk7CisJfQorfQorCisKK3N0YXRpYyBpbnQKK3RjcF9jb25uX3NjaGVkdWxlKHN0cnVjdCBza19idWZmICpza2IsCisJCSAgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKKwkJICBpbnQgKnZlcmRpY3QsIHN0cnVjdCBpcF92c19jb25uICoqY3BwKQoreworCXN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmM7CisJc3RydWN0IHRjcGhkciBfdGNwaCwgKnRoOworCisJdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsKjQsCisJCQkJc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKKwlpZiAodGggPT0gTlVMTCkgeworCQkqdmVyZGljdCA9IE5GX0RST1A7CisJCXJldHVybiAwOworCX0KKworCWlmICh0aC0+c3luICYmCisJICAgIChzdmMgPSBpcF92c19zZXJ2aWNlX2dldChza2ItPm5mbWFyaywgc2tiLT5uaC5pcGgtPnByb3RvY29sLAorCQkJCSAgICAgc2tiLT5uaC5pcGgtPmRhZGRyLCB0aC0+ZGVzdCkpKSB7CisJCWlmIChpcF92c190b2Ryb3AoKSkgeworCQkJLyoKKwkJCSAqIEl0IHNlZW1zIHRoYXQgd2UgYXJlIHZlcnkgbG9hZGVkLgorCQkJICogV2UgaGF2ZSB0byBkcm9wIHRoaXMgcGFja2V0IDooCisJCQkgKi8KKwkJCWlwX3ZzX3NlcnZpY2VfcHV0KHN2Yyk7CisJCQkqdmVyZGljdCA9IE5GX0RST1A7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qCisJCSAqIExldCB0aGUgdmlydHVhbCBzZXJ2ZXIgc2VsZWN0IGEgcmVhbCBzZXJ2ZXIgZm9yIHRoZQorCQkgKiBpbmNvbWluZyBjb25uZWN0aW9uLCBhbmQgY3JlYXRlIGEgY29ubmVjdGlvbiBlbnRyeS4KKwkJICovCisJCSpjcHAgPSBpcF92c19zY2hlZHVsZShzdmMsIHNrYik7CisJCWlmICghKmNwcCkgeworCQkJKnZlcmRpY3QgPSBpcF92c19sZWF2ZShzdmMsIHNrYiwgcHApOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaXBfdnNfc2VydmljZV9wdXQoc3ZjKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkCit0Y3BfZmFzdF9jc3VtX3VwZGF0ZShzdHJ1Y3QgdGNwaGRyICp0Y3BoLCB1MzIgb2xkaXAsIHUzMiBuZXdpcCwKKwkJICAgICB1MTYgb2xkcG9ydCwgdTE2IG5ld3BvcnQpCit7CisJdGNwaC0+Y2hlY2sgPQorCQlpcF92c19jaGVja19kaWZmKH5vbGRpcCwgbmV3aXAsCisJCQkJIGlwX3ZzX2NoZWNrX2RpZmYob2xkcG9ydCBeIDB4RkZGRiwKKwkJCQkJCSAgbmV3cG9ydCwgdGNwaC0+Y2hlY2spKTsKK30KKworCitzdGF0aWMgaW50Cit0Y3Bfc25hdF9oYW5kbGVyKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsIHN0cnVjdCBpcF92c19jb25uICpjcCkKK3sKKwlzdHJ1Y3QgdGNwaGRyICp0Y3BoOworCXVuc2lnbmVkIGludCB0Y3Bob2ZmID0gKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0OworCisJLyogY3N1bV9jaGVjayByZXF1aXJlcyB1bnNoYXJlZCBza2IgKi8KKwlpZiAoIWlwX3ZzX21ha2Vfc2tiX3dyaXRhYmxlKHBza2IsIHRjcGhvZmYrc2l6ZW9mKCp0Y3BoKSkpCisJCXJldHVybiAwOworCisJaWYgKHVubGlrZWx5KGNwLT5hcHAgIT0gTlVMTCkpIHsKKwkJLyogU29tZSBjaGVja3MgYmVmb3JlIG1hbmdsaW5nICovCisJCWlmIChwcC0+Y3N1bV9jaGVjayAmJiAhcHAtPmNzdW1fY2hlY2soKnBza2IsIHBwKSkKKwkJCXJldHVybiAwOworCisJCS8qIENhbGwgYXBwbGljYXRpb24gaGVscGVyIGlmIG5lZWRlZCAqLworCQlpZiAoIWlwX3ZzX2FwcF9wa3Rfb3V0KGNwLCBwc2tiKSkKKwkJCXJldHVybiAwOworCX0KKworCXRjcGggPSAodm9pZCAqKSgqcHNrYiktPm5oLmlwaCArIHRjcGhvZmY7CisJdGNwaC0+c291cmNlID0gY3AtPnZwb3J0OworCisJLyogQWRqdXN0IFRDUCBjaGVja3N1bXMgKi8KKwlpZiAoIWNwLT5hcHApIHsKKwkJLyogT25seSBwb3J0IGFuZCBhZGRyIGFyZSBjaGFuZ2VkLCBkbyBmYXN0IGNzdW0gdXBkYXRlICovCisJCXRjcF9mYXN0X2NzdW1fdXBkYXRlKHRjcGgsIGNwLT5kYWRkciwgY3AtPnZhZGRyLAorCQkJCSAgICAgY3AtPmRwb3J0LCBjcC0+dnBvcnQpOworCQlpZiAoKCpwc2tiKS0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKQorCQkJKCpwc2tiKS0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwl9IGVsc2UgeworCQkvKiBmdWxsIGNoZWNrc3VtIGNhbGN1bGF0aW9uICovCisJCXRjcGgtPmNoZWNrID0gMDsKKwkJKCpwc2tiKS0+Y3N1bSA9IHNrYl9jaGVja3N1bSgqcHNrYiwgdGNwaG9mZiwKKwkJCQkJICAgICAoKnBza2IpLT5sZW4gLSB0Y3Bob2ZmLCAwKTsKKwkJdGNwaC0+Y2hlY2sgPSBjc3VtX3RjcHVkcF9tYWdpYyhjcC0+dmFkZHIsIGNwLT5jYWRkciwKKwkJCQkJCSgqcHNrYiktPmxlbiAtIHRjcGhvZmYsCisJCQkJCQljcC0+cHJvdG9jb2wsCisJCQkJCQkoKnBza2IpLT5jc3VtKTsKKwkJSVBfVlNfREJHKDExLCAiTy1wa3Q6ICVzIE8tY3N1bT0lZCAoKyV6ZClcbiIsCisJCQkgIHBwLT5uYW1lLCB0Y3BoLT5jaGVjaywKKwkJCSAgKGNoYXIqKSYodGNwaC0+Y2hlY2spIC0gKGNoYXIqKXRjcGgpOworCX0KKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50Cit0Y3BfZG5hdF9oYW5kbGVyKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsIHN0cnVjdCBpcF92c19jb25uICpjcCkKK3sKKwlzdHJ1Y3QgdGNwaGRyICp0Y3BoOworCXVuc2lnbmVkIGludCB0Y3Bob2ZmID0gKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0OworCisJLyogY3N1bV9jaGVjayByZXF1aXJlcyB1bnNoYXJlZCBza2IgKi8KKwlpZiAoIWlwX3ZzX21ha2Vfc2tiX3dyaXRhYmxlKHBza2IsIHRjcGhvZmYrc2l6ZW9mKCp0Y3BoKSkpCisJCXJldHVybiAwOworCisJaWYgKHVubGlrZWx5KGNwLT5hcHAgIT0gTlVMTCkpIHsKKwkJLyogU29tZSBjaGVja3MgYmVmb3JlIG1hbmdsaW5nICovCisJCWlmIChwcC0+Y3N1bV9jaGVjayAmJiAhcHAtPmNzdW1fY2hlY2soKnBza2IsIHBwKSkKKwkJCXJldHVybiAwOworCisJCS8qCisJCSAqCUF0dGVtcHQgaXBfdnNfYXBwIGNhbGwuCisJCSAqCUl0IHdpbGwgZml4IGlwX3ZzX2Nvbm4gYW5kIGlwaCBhY2tfc2VxIHN0dWZmCisJCSAqLworCQlpZiAoIWlwX3ZzX2FwcF9wa3RfaW4oY3AsIHBza2IpKQorCQkJcmV0dXJuIDA7CisJfQorCisJdGNwaCA9ICh2b2lkICopKCpwc2tiKS0+bmguaXBoICsgdGNwaG9mZjsKKwl0Y3BoLT5kZXN0ID0gY3AtPmRwb3J0OworCisJLyoKKwkgKglBZGp1c3QgVENQIGNoZWNrc3VtcworCSAqLworCWlmICghY3AtPmFwcCkgeworCQkvKiBPbmx5IHBvcnQgYW5kIGFkZHIgYXJlIGNoYW5nZWQsIGRvIGZhc3QgY3N1bSB1cGRhdGUgKi8KKwkJdGNwX2Zhc3RfY3N1bV91cGRhdGUodGNwaCwgY3AtPnZhZGRyLCBjcC0+ZGFkZHIsCisJCQkJICAgICBjcC0+dnBvcnQsIGNwLT5kcG9ydCk7CisJCWlmICgoKnBza2IpLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpCisJCQkoKnBza2IpLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCX0gZWxzZSB7CisJCS8qIGZ1bGwgY2hlY2tzdW0gY2FsY3VsYXRpb24gKi8KKwkJdGNwaC0+Y2hlY2sgPSAwOworCQkoKnBza2IpLT5jc3VtID0gc2tiX2NoZWNrc3VtKCpwc2tiLCB0Y3Bob2ZmLAorCQkJCQkgICAgICgqcHNrYiktPmxlbiAtIHRjcGhvZmYsIDApOworCQl0Y3BoLT5jaGVjayA9IGNzdW1fdGNwdWRwX21hZ2ljKGNwLT5jYWRkciwgY3AtPmRhZGRyLAorCQkJCQkJKCpwc2tiKS0+bGVuIC0gdGNwaG9mZiwKKwkJCQkJCWNwLT5wcm90b2NvbCwKKwkJCQkJCSgqcHNrYiktPmNzdW0pOworCQkoKnBza2IpLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludAordGNwX2NzdW1fY2hlY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKK3sKKwl1bnNpZ25lZCBpbnQgdGNwaG9mZiA9IHNrYi0+bmguaXBoLT5paGwqNDsKKworCXN3aXRjaCAoc2tiLT5pcF9zdW1tZWQpIHsKKwljYXNlIENIRUNLU1VNX05PTkU6CisJCXNrYi0+Y3N1bSA9IHNrYl9jaGVja3N1bShza2IsIHRjcGhvZmYsIHNrYi0+bGVuIC0gdGNwaG9mZiwgMCk7CisJY2FzZSBDSEVDS1NVTV9IVzoKKwkJaWYgKGNzdW1fdGNwdWRwX21hZ2ljKHNrYi0+bmguaXBoLT5zYWRkciwgc2tiLT5uaC5pcGgtPmRhZGRyLAorCQkJCSAgICAgIHNrYi0+bGVuIC0gdGNwaG9mZiwKKwkJCQkgICAgICBza2ItPm5oLmlwaC0+cHJvdG9jb2wsIHNrYi0+Y3N1bSkpIHsKKwkJCUlQX1ZTX0RCR19STF9QS1QoMCwgcHAsIHNrYiwgMCwKKwkJCQkJICJGYWlsZWQgY2hlY2tzdW0gZm9yIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBDSEVDS1NVTV9VTk5FQ0VTU0FSWSAqLworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworCisjZGVmaW5lIFRDUF9ESVJfSU5QVVQJCTAKKyNkZWZpbmUgVENQX0RJUl9PVVRQVVQJCTQKKyNkZWZpbmUgVENQX0RJUl9JTlBVVF9PTkxZCTgKKworc3RhdGljIGludCB0Y3Bfc3RhdGVfb2ZmW0lQX1ZTX0RJUl9MQVNUXSA9IHsKKwlbSVBfVlNfRElSX0lOUFVUXQkJPQlUQ1BfRElSX0lOUFVULAorCVtJUF9WU19ESVJfT1VUUFVUXQkJPQlUQ1BfRElSX09VVFBVVCwKKwlbSVBfVlNfRElSX0lOUFVUX09OTFldCQk9CVRDUF9ESVJfSU5QVVRfT05MWSwKK307CisKKy8qCisgKglUaW1lb3V0IHRhYmxlW3N0YXRlXQorICovCitzdGF0aWMgaW50IHRjcF90aW1lb3V0c1tJUF9WU19UQ1BfU19MQVNUKzFdID0geworCVtJUF9WU19UQ1BfU19OT05FXQkJPQkyKkhaLAorCVtJUF9WU19UQ1BfU19FU1RBQkxJU0hFRF0JPQkxNSo2MCpIWiwKKwlbSVBfVlNfVENQX1NfU1lOX1NFTlRdCQk9CTIqNjAqSFosCisJW0lQX1ZTX1RDUF9TX1NZTl9SRUNWXQkJPQkxKjYwKkhaLAorCVtJUF9WU19UQ1BfU19GSU5fV0FJVF0JCT0JMio2MCpIWiwKKwlbSVBfVlNfVENQX1NfVElNRV9XQUlUXQkJPQkyKjYwKkhaLAorCVtJUF9WU19UQ1BfU19DTE9TRV0JCT0JMTAqSFosCisJW0lQX1ZTX1RDUF9TX0NMT1NFX1dBSVRdCT0JNjAqSFosCisJW0lQX1ZTX1RDUF9TX0xBU1RfQUNLXQkJPQkzMCpIWiwKKwlbSVBfVlNfVENQX1NfTElTVEVOXQkJPQkyKjYwKkhaLAorCVtJUF9WU19UQ1BfU19TWU5BQ0tdCQk9CTEyMCpIWiwKKwlbSVBfVlNfVENQX1NfTEFTVF0JCT0JMipIWiwKK307CisKKworI2lmIDAKKworLyogRklYTUU6IFRoaXMgaXMgZ29pbmcgdG8gZGllICovCisKK3N0YXRpYyBpbnQgdGNwX3RpbWVvdXRzX2Rvc1tJUF9WU19UQ1BfU19MQVNUKzFdID0geworCVtJUF9WU19UQ1BfU19OT05FXQkJPQkyKkhaLAorCVtJUF9WU19UQ1BfU19FU1RBQkxJU0hFRF0JPQk4KjYwKkhaLAorCVtJUF9WU19UQ1BfU19TWU5fU0VOVF0JCT0JNjAqSFosCisJW0lQX1ZTX1RDUF9TX1NZTl9SRUNWXQkJPQkxMCpIWiwKKwlbSVBfVlNfVENQX1NfRklOX1dBSVRdCQk9CTYwKkhaLAorCVtJUF9WU19UQ1BfU19USU1FX1dBSVRdCQk9CTYwKkhaLAorCVtJUF9WU19UQ1BfU19DTE9TRV0JCT0JMTAqSFosCisJW0lQX1ZTX1RDUF9TX0NMT1NFX1dBSVRdCT0JNjAqSFosCisJW0lQX1ZTX1RDUF9TX0xBU1RfQUNLXQkJPQkzMCpIWiwKKwlbSVBfVlNfVENQX1NfTElTVEVOXQkJPQkyKjYwKkhaLAorCVtJUF9WU19UQ1BfU19TWU5BQ0tdCQk9CTEwMCpIWiwKKwlbSVBfVlNfVENQX1NfTEFTVF0JCT0JMipIWiwKK307CisKKyNlbmRpZgorCitzdGF0aWMgY2hhciAqIHRjcF9zdGF0ZV9uYW1lX3RhYmxlW0lQX1ZTX1RDUF9TX0xBU1QrMV0gPSB7CisJW0lQX1ZTX1RDUF9TX05PTkVdCQk9CSJOT05FIiwKKwlbSVBfVlNfVENQX1NfRVNUQUJMSVNIRURdCT0JIkVTVEFCTElTSEVEIiwKKwlbSVBfVlNfVENQX1NfU1lOX1NFTlRdCQk9CSJTWU5fU0VOVCIsCisJW0lQX1ZTX1RDUF9TX1NZTl9SRUNWXQkJPQkiU1lOX1JFQ1YiLAorCVtJUF9WU19UQ1BfU19GSU5fV0FJVF0JCT0JIkZJTl9XQUlUIiwKKwlbSVBfVlNfVENQX1NfVElNRV9XQUlUXQkJPQkiVElNRV9XQUlUIiwKKwlbSVBfVlNfVENQX1NfQ0xPU0VdCQk9CSJDTE9TRSIsCisJW0lQX1ZTX1RDUF9TX0NMT1NFX1dBSVRdCT0JIkNMT1NFX1dBSVQiLAorCVtJUF9WU19UQ1BfU19MQVNUX0FDS10JCT0JIkxBU1RfQUNLIiwKKwlbSVBfVlNfVENQX1NfTElTVEVOXQkJPQkiTElTVEVOIiwKKwlbSVBfVlNfVENQX1NfU1lOQUNLXQkJPQkiU1lOQUNLIiwKKwlbSVBfVlNfVENQX1NfTEFTVF0JCT0JIkJVRyEiLAorfTsKKworI2RlZmluZSBzTk8gSVBfVlNfVENQX1NfTk9ORQorI2RlZmluZSBzRVMgSVBfVlNfVENQX1NfRVNUQUJMSVNIRUQKKyNkZWZpbmUgc1NTIElQX1ZTX1RDUF9TX1NZTl9TRU5UCisjZGVmaW5lIHNTUiBJUF9WU19UQ1BfU19TWU5fUkVDVgorI2RlZmluZSBzRlcgSVBfVlNfVENQX1NfRklOX1dBSVQKKyNkZWZpbmUgc1RXIElQX1ZTX1RDUF9TX1RJTUVfV0FJVAorI2RlZmluZSBzQ0wgSVBfVlNfVENQX1NfQ0xPU0UKKyNkZWZpbmUgc0NXIElQX1ZTX1RDUF9TX0NMT1NFX1dBSVQKKyNkZWZpbmUgc0xBIElQX1ZTX1RDUF9TX0xBU1RfQUNLCisjZGVmaW5lIHNMSSBJUF9WU19UQ1BfU19MSVNURU4KKyNkZWZpbmUgc1NBIElQX1ZTX1RDUF9TX1NZTkFDSworCitzdHJ1Y3QgdGNwX3N0YXRlc190IHsKKwlpbnQgbmV4dF9zdGF0ZVtJUF9WU19UQ1BfU19MQVNUXTsKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogdGNwX3N0YXRlX25hbWUoaW50IHN0YXRlKQoreworCWlmIChzdGF0ZSA+PSBJUF9WU19UQ1BfU19MQVNUKQorCQlyZXR1cm4gIkVSUiEiOworCXJldHVybiB0Y3Bfc3RhdGVfbmFtZV90YWJsZVtzdGF0ZV0gPyB0Y3Bfc3RhdGVfbmFtZV90YWJsZVtzdGF0ZV0gOiAiPyI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGNwX3N0YXRlc190IHRjcF9zdGF0ZXMgW10gPSB7CisvKglJTlBVVCAqLworLyogICAgICAgIHNOTywgc0VTLCBzU1MsIHNTUiwgc0ZXLCBzVFcsIHNDTCwgc0NXLCBzTEEsIHNMSSwgc1NBCSovCisvKnN5biovIHt7c1NSLCBzRVMsIHNFUywgc1NSLCBzU1IsIHNTUiwgc1NSLCBzU1IsIHNTUiwgc1NSLCBzU1IgfX0sCisvKmZpbiovIHt7c0NMLCBzQ1csIHNTUywgc1RXLCBzVFcsIHNUVywgc0NMLCBzQ1csIHNMQSwgc0xJLCBzVFcgfX0sCisvKmFjayovIHt7c0NMLCBzRVMsIHNTUywgc0VTLCBzRlcsIHNUVywgc0NMLCBzQ1csIHNDTCwgc0xJLCBzRVMgfX0sCisvKnJzdCovIHt7c0NMLCBzQ0wsIHNDTCwgc1NSLCBzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNMQSwgc0xJLCBzU1IgfX0sCisKKy8qCU9VVFBVVCAqLworLyogICAgICAgIHNOTywgc0VTLCBzU1MsIHNTUiwgc0ZXLCBzVFcsIHNDTCwgc0NXLCBzTEEsIHNMSSwgc1NBCSovCisvKnN5biovIHt7c1NTLCBzRVMsIHNTUywgc1NSLCBzU1MsIHNTUywgc1NTLCBzU1MsIHNTUywgc0xJLCBzU1IgfX0sCisvKmZpbiovIHt7c1RXLCBzRlcsIHNTUywgc1RXLCBzRlcsIHNUVywgc0NMLCBzVFcsIHNMQSwgc0xJLCBzVFcgfX0sCisvKmFjayovIHt7c0VTLCBzRVMsIHNTUywgc0VTLCBzRlcsIHNUVywgc0NMLCBzQ1csIHNMQSwgc0VTLCBzRVMgfX0sCisvKnJzdCovIHt7c0NMLCBzQ0wsIHNTUywgc0NMLCBzQ0wsIHNUVywgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzQ0wgfX0sCisKKy8qCUlOUFVULU9OTFkgKi8KKy8qICAgICAgICBzTk8sIHNFUywgc1NTLCBzU1IsIHNGVywgc1RXLCBzQ0wsIHNDVywgc0xBLCBzTEksIHNTQQkqLworLypzeW4qLyB7e3NTUiwgc0VTLCBzRVMsIHNTUiwgc1NSLCBzU1IsIHNTUiwgc1NSLCBzU1IsIHNTUiwgc1NSIH19LAorLypmaW4qLyB7e3NDTCwgc0ZXLCBzU1MsIHNUVywgc0ZXLCBzVFcsIHNDTCwgc0NXLCBzTEEsIHNMSSwgc1RXIH19LAorLyphY2sqLyB7e3NDTCwgc0VTLCBzU1MsIHNFUywgc0ZXLCBzVFcsIHNDTCwgc0NXLCBzQ0wsIHNMSSwgc0VTIH19LAorLypyc3QqLyB7e3NDTCwgc0NMLCBzQ0wsIHNTUiwgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzTEEsIHNMSSwgc0NMIH19LAorfTsKKworc3RhdGljIHN0cnVjdCB0Y3Bfc3RhdGVzX3QgdGNwX3N0YXRlc19kb3MgW10gPSB7CisvKglJTlBVVCAqLworLyogICAgICAgIHNOTywgc0VTLCBzU1MsIHNTUiwgc0ZXLCBzVFcsIHNDTCwgc0NXLCBzTEEsIHNMSSwgc1NBCSovCisvKnN5biovIHt7c1NSLCBzRVMsIHNFUywgc1NSLCBzU1IsIHNTUiwgc1NSLCBzU1IsIHNTUiwgc1NSLCBzU0EgfX0sCisvKmZpbiovIHt7c0NMLCBzQ1csIHNTUywgc1RXLCBzVFcsIHNUVywgc0NMLCBzQ1csIHNMQSwgc0xJLCBzU0EgfX0sCisvKmFjayovIHt7c0NMLCBzRVMsIHNTUywgc1NSLCBzRlcsIHNUVywgc0NMLCBzQ1csIHNDTCwgc0xJLCBzU0EgfX0sCisvKnJzdCovIHt7c0NMLCBzQ0wsIHNDTCwgc1NSLCBzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNMQSwgc0xJLCBzQ0wgfX0sCisKKy8qCU9VVFBVVCAqLworLyogICAgICAgIHNOTywgc0VTLCBzU1MsIHNTUiwgc0ZXLCBzVFcsIHNDTCwgc0NXLCBzTEEsIHNMSSwgc1NBCSovCisvKnN5biovIHt7c1NTLCBzRVMsIHNTUywgc1NBLCBzU1MsIHNTUywgc1NTLCBzU1MsIHNTUywgc0xJLCBzU0EgfX0sCisvKmZpbiovIHt7c1RXLCBzRlcsIHNTUywgc1RXLCBzRlcsIHNUVywgc0NMLCBzVFcsIHNMQSwgc0xJLCBzVFcgfX0sCisvKmFjayovIHt7c0VTLCBzRVMsIHNTUywgc0VTLCBzRlcsIHNUVywgc0NMLCBzQ1csIHNMQSwgc0VTLCBzRVMgfX0sCisvKnJzdCovIHt7c0NMLCBzQ0wsIHNTUywgc0NMLCBzQ0wsIHNUVywgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzQ0wgfX0sCisKKy8qCUlOUFVULU9OTFkgKi8KKy8qICAgICAgICBzTk8sIHNFUywgc1NTLCBzU1IsIHNGVywgc1RXLCBzQ0wsIHNDVywgc0xBLCBzTEksIHNTQQkqLworLypzeW4qLyB7e3NTQSwgc0VTLCBzRVMsIHNTUiwgc1NBLCBzU0EsIHNTQSwgc1NBLCBzU0EsIHNTQSwgc1NBIH19LAorLypmaW4qLyB7e3NDTCwgc0ZXLCBzU1MsIHNUVywgc0ZXLCBzVFcsIHNDTCwgc0NXLCBzTEEsIHNMSSwgc1RXIH19LAorLyphY2sqLyB7e3NDTCwgc0VTLCBzU1MsIHNFUywgc0ZXLCBzVFcsIHNDTCwgc0NXLCBzQ0wsIHNMSSwgc0VTIH19LAorLypyc3QqLyB7e3NDTCwgc0NMLCBzQ0wsIHNTUiwgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzTEEsIHNMSSwgc0NMIH19LAorfTsKKworc3RhdGljIHN0cnVjdCB0Y3Bfc3RhdGVzX3QgKnRjcF9zdGF0ZV90YWJsZSA9IHRjcF9zdGF0ZXM7CisKKworc3RhdGljIHZvaWQgdGNwX3RpbWVvdXRfY2hhbmdlKHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsIGludCBmbGFncykKK3sKKwlpbnQgb24gPSAoZmxhZ3MgJiAxKTsJCS8qIHNlY3VyZV90Y3AgKi8KKworCS8qCisJKiogRklYTUU6IGNoYW5nZSBzZWN1cmVfdGNwIHRvIGluZGVwZW5kZW50IHN5c2N0bCB2YXIKKwkqKiBvciBtYWtlIGl0IHBlci1zZXJ2aWNlIG9yIHBlci1hcHAgYmVjYXVzZSBpdCBpcyB2YWxpZAorCSoqIGZvciBtb3N0IGlmIG5vdCBmb3IgYWxsIG9mIHRoZSBhcHBsaWNhdGlvbnMuIFNvbWV0aGluZworCSoqIGxpa2UgImNhcGFiaWxpdGllcyIgKGZsYWdzKSBmb3IgZWFjaCBvYmplY3QuCisJKi8KKwl0Y3Bfc3RhdGVfdGFibGUgPSAob24/IHRjcF9zdGF0ZXNfZG9zIDogdGNwX3N0YXRlcyk7Cit9CisKK3N0YXRpYyBpbnQKK3RjcF9zZXRfc3RhdGVfdGltZW91dChzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLCBjaGFyICpzbmFtZSwgaW50IHRvKQoreworCXJldHVybiBpcF92c19zZXRfc3RhdGVfdGltZW91dChwcC0+dGltZW91dF90YWJsZSwgSVBfVlNfVENQX1NfTEFTVCwKKwkJCQkgICAgICAgdGNwX3N0YXRlX25hbWVfdGFibGUsIHNuYW1lLCB0byk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRjcF9zdGF0ZV9pZHgoc3RydWN0IHRjcGhkciAqdGgpCit7CisJaWYgKHRoLT5yc3QpCisJCXJldHVybiAzOworCWlmICh0aC0+c3luKQorCQlyZXR1cm4gMDsKKwlpZiAodGgtPmZpbikKKwkJcmV0dXJuIDE7CisJaWYgKHRoLT5hY2spCisJCXJldHVybiAyOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitzZXRfdGNwX3N0YXRlKHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsIHN0cnVjdCBpcF92c19jb25uICpjcCwKKwkgICAgICBpbnQgZGlyZWN0aW9uLCBzdHJ1Y3QgdGNwaGRyICp0aCkKK3sKKwlpbnQgc3RhdGVfaWR4OworCWludCBuZXdfc3RhdGUgPSBJUF9WU19UQ1BfU19DTE9TRTsKKwlpbnQgc3RhdGVfb2ZmID0gdGNwX3N0YXRlX29mZltkaXJlY3Rpb25dOworCisJLyoKKwkgKiAgICBVcGRhdGUgc3RhdGUgb2Zmc2V0IHRvIElOUFVUX09OTFkgaWYgbmVjZXNzYXJ5CisJICogICAgb3IgZGVsZXRlIE5PX09VVFBVVCBmbGFnIGlmIG91dHB1dCBwYWNrZXQgZGV0ZWN0ZWQKKwkgKi8KKwlpZiAoY3AtPmZsYWdzICYgSVBfVlNfQ09OTl9GX05PT1VUUFVUKSB7CisJCWlmIChzdGF0ZV9vZmYgPT0gVENQX0RJUl9PVVRQVVQpCisJCQljcC0+ZmxhZ3MgJj0gfklQX1ZTX0NPTk5fRl9OT09VVFBVVDsKKwkJZWxzZQorCQkJc3RhdGVfb2ZmID0gVENQX0RJUl9JTlBVVF9PTkxZOworCX0KKworCWlmICgoc3RhdGVfaWR4ID0gdGNwX3N0YXRlX2lkeCh0aCkpIDwgMCkgeworCQlJUF9WU19EQkcoOCwgInRjcF9zdGF0ZV9pZHg9JWQhISFcbiIsIHN0YXRlX2lkeCk7CisJCWdvdG8gdGNwX3N0YXRlX291dDsKKwl9CisKKwluZXdfc3RhdGUgPSB0Y3Bfc3RhdGVfdGFibGVbc3RhdGVfb2ZmK3N0YXRlX2lkeF0ubmV4dF9zdGF0ZVtjcC0+c3RhdGVdOworCisgIHRjcF9zdGF0ZV9vdXQ6CisJaWYgKG5ld19zdGF0ZSAhPSBjcC0+c3RhdGUpIHsKKwkJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QgPSBjcC0+ZGVzdDsKKworCQlJUF9WU19EQkcoOCwgIiVzICVzIFslYyVjJWMlY10gJXUuJXUuJXUuJXU6JWQtPiIKKwkJCSAgIiV1LiV1LiV1LiV1OiVkIHN0YXRlOiAlcy0+JXMgY250OiVkXG4iLAorCQkJICBwcC0+bmFtZSwKKwkJCSAgKHN0YXRlX29mZj09VENQX0RJUl9PVVRQVVQpPyJvdXRwdXQgIjoiaW5wdXQgIiwKKwkJCSAgdGgtPnN5bj8gJ1MnIDogJy4nLAorCQkJICB0aC0+ZmluPyAnRicgOiAnLicsCisJCQkgIHRoLT5hY2s/ICdBJyA6ICcuJywKKwkJCSAgdGgtPnJzdD8gJ1InIDogJy4nLAorCQkJICBOSVBRVUFEKGNwLT5kYWRkciksIG50b2hzKGNwLT5kcG9ydCksCisJCQkgIE5JUFFVQUQoY3AtPmNhZGRyKSwgbnRvaHMoY3AtPmNwb3J0KSwKKwkJCSAgdGNwX3N0YXRlX25hbWUoY3AtPnN0YXRlKSwKKwkJCSAgdGNwX3N0YXRlX25hbWUobmV3X3N0YXRlKSwKKwkJCSAgYXRvbWljX3JlYWQoJmNwLT5yZWZjbnQpKTsKKwkJaWYgKGRlc3QpIHsKKwkJCWlmICghKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9JTkFDVElWRSkgJiYKKwkJCSAgICAobmV3X3N0YXRlICE9IElQX1ZTX1RDUF9TX0VTVEFCTElTSEVEKSkgeworCQkJCWF0b21pY19kZWMoJmRlc3QtPmFjdGl2ZWNvbm5zKTsKKwkJCQlhdG9taWNfaW5jKCZkZXN0LT5pbmFjdGNvbm5zKTsKKwkJCQljcC0+ZmxhZ3MgfD0gSVBfVlNfQ09OTl9GX0lOQUNUSVZFOworCQkJfSBlbHNlIGlmICgoY3AtPmZsYWdzICYgSVBfVlNfQ09OTl9GX0lOQUNUSVZFKSAmJgorCQkJCSAgIChuZXdfc3RhdGUgPT0gSVBfVlNfVENQX1NfRVNUQUJMSVNIRUQpKSB7CisJCQkJYXRvbWljX2luYygmZGVzdC0+YWN0aXZlY29ubnMpOworCQkJCWF0b21pY19kZWMoJmRlc3QtPmluYWN0Y29ubnMpOworCQkJCWNwLT5mbGFncyAmPSB+SVBfVlNfQ09OTl9GX0lOQUNUSVZFOworCQkJfQorCQl9CisJfQorCisJY3AtPnRpbWVvdXQgPSBwcC0+dGltZW91dF90YWJsZVtjcC0+c3RhdGUgPSBuZXdfc3RhdGVdOworfQorCisKKy8qCisgKglIYW5kbGUgc3RhdGUgdHJhbnNpdGlvbnMKKyAqLworc3RhdGljIGludAordGNwX3N0YXRlX3RyYW5zaXRpb24oc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCBpbnQgZGlyZWN0aW9uLAorCQkgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICAgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKK3sKKwlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGg7CisKKwl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYi0+bmguaXBoLT5paGwqNCwKKwkJCQlzaXplb2YoX3RjcGgpLCAmX3RjcGgpOworCWlmICh0aCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9jaygmY3AtPmxvY2spOworCXNldF90Y3Bfc3RhdGUocHAsIGNwLCBkaXJlY3Rpb24sIHRoKTsKKwlzcGluX3VubG9jaygmY3AtPmxvY2spOworCisJcmV0dXJuIDE7Cit9CisKKworLyoKKyAqCUhhc2ggdGFibGUgZm9yIFRDUCBhcHBsaWNhdGlvbiBpbmNhcm5hdGlvbnMKKyAqLworI2RlZmluZQlUQ1BfQVBQX1RBQl9CSVRTCTQKKyNkZWZpbmUJVENQX0FQUF9UQUJfU0laRQkoMSA8PCBUQ1BfQVBQX1RBQl9CSVRTKQorI2RlZmluZQlUQ1BfQVBQX1RBQl9NQVNLCShUQ1BfQVBQX1RBQl9TSVpFIC0gMSkKKworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgdGNwX2FwcHNbVENQX0FQUF9UQUJfU0laRV07CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHRjcF9hcHBfbG9jayk7CisKK3N0YXRpYyBpbmxpbmUgX191MTYgdGNwX2FwcF9oYXNoa2V5KF9fdTE2IHBvcnQpCit7CisJcmV0dXJuICgocG9ydCA+PiBUQ1BfQVBQX1RBQl9CSVRTKSBeIHBvcnQpICYgVENQX0FQUF9UQUJfTUFTSzsKK30KKworCitzdGF0aWMgaW50IHRjcF9yZWdpc3Rlcl9hcHAoc3RydWN0IGlwX3ZzX2FwcCAqaW5jKQoreworCXN0cnVjdCBpcF92c19hcHAgKmk7CisJX191MTYgaGFzaCwgcG9ydCA9IGluYy0+cG9ydDsKKwlpbnQgcmV0ID0gMDsKKworCWhhc2ggPSB0Y3BfYXBwX2hhc2hrZXkocG9ydCk7CisKKwlzcGluX2xvY2tfYmgoJnRjcF9hcHBfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpLCAmdGNwX2FwcHNbaGFzaF0sIHBfbGlzdCkgeworCQlpZiAoaS0+cG9ydCA9PSBwb3J0KSB7CisJCQlyZXQgPSAtRUVYSVNUOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJbGlzdF9hZGQoJmluYy0+cF9saXN0LCAmdGNwX2FwcHNbaGFzaF0pOworCWF0b21pY19pbmMoJmlwX3ZzX3Byb3RvY29sX3RjcC5hcHBjbnQpOworCisgIG91dDoKKwlzcGluX3VubG9ja19iaCgmdGNwX2FwcF9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkCit0Y3BfdW5yZWdpc3Rlcl9hcHAoc3RydWN0IGlwX3ZzX2FwcCAqaW5jKQoreworCXNwaW5fbG9ja19iaCgmdGNwX2FwcF9sb2NrKTsKKwlhdG9taWNfZGVjKCZpcF92c19wcm90b2NvbF90Y3AuYXBwY250KTsKKwlsaXN0X2RlbCgmaW5jLT5wX2xpc3QpOworCXNwaW5fdW5sb2NrX2JoKCZ0Y3BfYXBwX2xvY2spOworfQorCisKK3N0YXRpYyBpbnQKK3RjcF9hcHBfY29ubl9iaW5kKHN0cnVjdCBpcF92c19jb25uICpjcCkKK3sKKwlpbnQgaGFzaDsKKwlzdHJ1Y3QgaXBfdnNfYXBwICppbmM7CisJaW50IHJlc3VsdCA9IDA7CisKKwkvKiBEZWZhdWx0IGJpbmRpbmc6IGJpbmQgYXBwIG9ubHkgZm9yIE5BVCAqLworCWlmIChJUF9WU19GV0RfTUVUSE9EKGNwKSAhPSBJUF9WU19DT05OX0ZfTUFTUSkKKwkJcmV0dXJuIDA7CisKKwkvKiBMb29rdXAgYXBwbGljYXRpb24gaW5jYXJuYXRpb25zIGFuZCBiaW5kIHRoZSByaWdodCBvbmUgKi8KKwloYXNoID0gdGNwX2FwcF9oYXNoa2V5KGNwLT52cG9ydCk7CisKKwlzcGluX2xvY2soJnRjcF9hcHBfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpbmMsICZ0Y3BfYXBwc1toYXNoXSwgcF9saXN0KSB7CisJCWlmIChpbmMtPnBvcnQgPT0gY3AtPnZwb3J0KSB7CisJCQlpZiAodW5saWtlbHkoIWlwX3ZzX2FwcF9pbmNfZ2V0KGluYykpKQorCQkJCWJyZWFrOworCQkJc3Bpbl91bmxvY2soJnRjcF9hcHBfbG9jayk7CisKKwkJCUlQX1ZTX0RCRyg5LCAiJXM6IEJpbmRpbmcgY29ubiAldS4ldS4ldS4ldToldS0+IgorCQkJCSAgIiV1LiV1LiV1LiV1OiV1IHRvIGFwcCAlcyBvbiBwb3J0ICV1XG4iLAorCQkJCSAgX19GVU5DVElPTl9fLAorCQkJCSAgTklQUVVBRChjcC0+Y2FkZHIpLCBudG9ocyhjcC0+Y3BvcnQpLAorCQkJCSAgTklQUVVBRChjcC0+dmFkZHIpLCBudG9ocyhjcC0+dnBvcnQpLAorCQkJCSAgaW5jLT5uYW1lLCBudG9ocyhpbmMtPnBvcnQpKTsKKwkJCWNwLT5hcHAgPSBpbmM7CisJCQlpZiAoaW5jLT5pbml0X2Nvbm4pCisJCQkJcmVzdWx0ID0gaW5jLT5pbml0X2Nvbm4oaW5jLCBjcCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmdGNwX2FwcF9sb2NrKTsKKworICBvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICoJU2V0IExJU1RFTiB0aW1lb3V0LiAoaXBfdnNfY29ubl9wdXQgd2lsbCBzZXR1cCB0aW1lcikKKyAqLwordm9pZCBpcF92c190Y3BfY29ubl9saXN0ZW4oc3RydWN0IGlwX3ZzX2Nvbm4gKmNwKQoreworCXNwaW5fbG9jaygmY3AtPmxvY2spOworCWNwLT5zdGF0ZSA9IElQX1ZTX1RDUF9TX0xJU1RFTjsKKwljcC0+dGltZW91dCA9IGlwX3ZzX3Byb3RvY29sX3RjcC50aW1lb3V0X3RhYmxlW0lQX1ZTX1RDUF9TX0xJU1RFTl07CisJc3Bpbl91bmxvY2soJmNwLT5sb2NrKTsKK30KKworCitzdGF0aWMgdm9pZCB0Y3BfaW5pdChzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQoreworCUlQX1ZTX0lOSVRfSEFTSF9UQUJMRSh0Y3BfYXBwcyk7CisJcHAtPnRpbWVvdXRfdGFibGUgPSB0Y3BfdGltZW91dHM7Cit9CisKKworc3RhdGljIHZvaWQgdGNwX2V4aXQoc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKK3sKK30KKworCitzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgaXBfdnNfcHJvdG9jb2xfdGNwID0geworCS5uYW1lID0JCQkiVENQIiwKKwkucHJvdG9jb2wgPQkJSVBQUk9UT19UQ1AsCisJLmRvbnRfZGVmcmFnID0JCTAsCisJLmFwcGNudCA9CQlBVE9NSUNfSU5JVCgwKSwKKwkuaW5pdCA9CQkJdGNwX2luaXQsCisJLmV4aXQgPQkJCXRjcF9leGl0LAorCS5yZWdpc3Rlcl9hcHAgPQkJdGNwX3JlZ2lzdGVyX2FwcCwKKwkudW5yZWdpc3Rlcl9hcHAgPQl0Y3BfdW5yZWdpc3Rlcl9hcHAsCisJLmNvbm5fc2NoZWR1bGUgPQl0Y3BfY29ubl9zY2hlZHVsZSwKKwkuY29ubl9pbl9nZXQgPQkJdGNwX2Nvbm5faW5fZ2V0LAorCS5jb25uX291dF9nZXQgPQkJdGNwX2Nvbm5fb3V0X2dldCwKKwkuc25hdF9oYW5kbGVyID0JCXRjcF9zbmF0X2hhbmRsZXIsCisJLmRuYXRfaGFuZGxlciA9CQl0Y3BfZG5hdF9oYW5kbGVyLAorCS5jc3VtX2NoZWNrID0JCXRjcF9jc3VtX2NoZWNrLAorCS5zdGF0ZV9uYW1lID0JCXRjcF9zdGF0ZV9uYW1lLAorCS5zdGF0ZV90cmFuc2l0aW9uID0JdGNwX3N0YXRlX3RyYW5zaXRpb24sCisJLmFwcF9jb25uX2JpbmQgPQl0Y3BfYXBwX2Nvbm5fYmluZCwKKwkuZGVidWdfcGFja2V0ID0JCWlwX3ZzX3RjcHVkcF9kZWJ1Z19wYWNrZXQsCisJLnRpbWVvdXRfY2hhbmdlID0JdGNwX3RpbWVvdXRfY2hhbmdlLAorCS5zZXRfc3RhdGVfdGltZW91dCA9CXRjcF9zZXRfc3RhdGVfdGltZW91dCwKK307CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX3VkcC5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90b191ZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWU1ZjJlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90b191ZHAuYwpAQCAtMCwwICsxLDQyNyBAQAorLyoKKyAqIGlwX3ZzX3Byb3RvX3VkcC5jOglVRFAgbG9hZCBiYWxhbmNpbmcgc3VwcG9ydCBmb3IgSVBWUworICoKKyAqIFZlcnNpb246ICAgICAkSWQ6IGlwX3ZzX3Byb3RvX3VkcC5jLHYgMS4zIDIwMDIvMTEvMzAgMDE6NTA6MzUgd2Vuc29uZyBFeHAgJAorICoKKyAqIEF1dGhvcnM6ICAgICBXZW5zb25nIFpoYW5nIDx3ZW5zb25nQGxpbnV4dmlydHVhbHNlcnZlci5vcmc+CisgKiAgICAgICAgICAgICAgSnVsaWFuIEFuYXN0YXNvdiA8amFAc3NpLmJnPgorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENoYW5nZXM6CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorCisjaW5jbHVkZSA8bmV0L2lwX3ZzLmg+CisKKworc3RhdGljIHN0cnVjdCBpcF92c19jb25uICoKK3VkcF9jb25uX2luX2dldChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAorCQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCwgdW5zaWduZWQgaW50IHByb3RvX29mZiwgaW50IGludmVyc2UpCit7CisJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOworCV9fdTE2IF9wb3J0c1syXSwgKnBwdHI7CisKKwlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9fb2ZmLCBzaXplb2YoX3BvcnRzKSwgX3BvcnRzKTsKKwlpZiAocHB0ciA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChsaWtlbHkoIWludmVyc2UpKSB7CisJCWNwID0gaXBfdnNfY29ubl9pbl9nZXQoaXBoLT5wcm90b2NvbCwKKwkJCQkgICAgICAgaXBoLT5zYWRkciwgcHB0clswXSwKKwkJCQkgICAgICAgaXBoLT5kYWRkciwgcHB0clsxXSk7CisJfSBlbHNlIHsKKwkJY3AgPSBpcF92c19jb25uX2luX2dldChpcGgtPnByb3RvY29sLAorCQkJCSAgICAgICBpcGgtPmRhZGRyLCBwcHRyWzFdLAorCQkJCSAgICAgICBpcGgtPnNhZGRyLCBwcHRyWzBdKTsKKwl9CisKKwlyZXR1cm4gY3A7Cit9CisKKworc3RhdGljIHN0cnVjdCBpcF92c19jb25uICoKK3VkcF9jb25uX291dF9nZXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKKwkJIGNvbnN0IHN0cnVjdCBpcGhkciAqaXBoLCB1bnNpZ25lZCBpbnQgcHJvdG9fb2ZmLCBpbnQgaW52ZXJzZSkKK3sKKwlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7CisJX191MTYgX3BvcnRzWzJdLCAqcHB0cjsKKworCXBwdHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsKjQsCisJCQkJICBzaXplb2YoX3BvcnRzKSwgX3BvcnRzKTsKKwlpZiAocHB0ciA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChsaWtlbHkoIWludmVyc2UpKSB7CisJCWNwID0gaXBfdnNfY29ubl9vdXRfZ2V0KGlwaC0+cHJvdG9jb2wsCisJCQkJCWlwaC0+c2FkZHIsIHBwdHJbMF0sCisJCQkJCWlwaC0+ZGFkZHIsIHBwdHJbMV0pOworCX0gZWxzZSB7CisJCWNwID0gaXBfdnNfY29ubl9vdXRfZ2V0KGlwaC0+cHJvdG9jb2wsCisJCQkJCWlwaC0+ZGFkZHIsIHBwdHJbMV0sCisJCQkJCWlwaC0+c2FkZHIsIHBwdHJbMF0pOworCX0KKworCXJldHVybiBjcDsKK30KKworCitzdGF0aWMgaW50Cit1ZHBfY29ubl9zY2hlZHVsZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAorCQkgIGludCAqdmVyZGljdCwgc3RydWN0IGlwX3ZzX2Nvbm4gKipjcHApCit7CisJc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YzsKKwlzdHJ1Y3QgdWRwaGRyIF91ZHBoLCAqdWg7CisKKwl1aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYi0+bmguaXBoLT5paGwqNCwKKwkJCQlzaXplb2YoX3VkcGgpLCAmX3VkcGgpOworCWlmICh1aCA9PSBOVUxMKSB7CisJCSp2ZXJkaWN0ID0gTkZfRFJPUDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChzdmMgPSBpcF92c19zZXJ2aWNlX2dldChza2ItPm5mbWFyaywgc2tiLT5uaC5pcGgtPnByb3RvY29sLAorCQkJCSAgICAgc2tiLT5uaC5pcGgtPmRhZGRyLCB1aC0+ZGVzdCkpKSB7CisJCWlmIChpcF92c190b2Ryb3AoKSkgeworCQkJLyoKKwkJCSAqIEl0IHNlZW1zIHRoYXQgd2UgYXJlIHZlcnkgbG9hZGVkLgorCQkJICogV2UgaGF2ZSB0byBkcm9wIHRoaXMgcGFja2V0IDooCisJCQkgKi8KKwkJCWlwX3ZzX3NlcnZpY2VfcHV0KHN2Yyk7CisJCQkqdmVyZGljdCA9IE5GX0RST1A7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qCisJCSAqIExldCB0aGUgdmlydHVhbCBzZXJ2ZXIgc2VsZWN0IGEgcmVhbCBzZXJ2ZXIgZm9yIHRoZQorCQkgKiBpbmNvbWluZyBjb25uZWN0aW9uLCBhbmQgY3JlYXRlIGEgY29ubmVjdGlvbiBlbnRyeS4KKwkJICovCisJCSpjcHAgPSBpcF92c19zY2hlZHVsZShzdmMsIHNrYik7CisJCWlmICghKmNwcCkgeworCQkJKnZlcmRpY3QgPSBpcF92c19sZWF2ZShzdmMsIHNrYiwgcHApOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaXBfdnNfc2VydmljZV9wdXQoc3ZjKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkCit1ZHBfZmFzdF9jc3VtX3VwZGF0ZShzdHJ1Y3QgdWRwaGRyICp1aGRyLCB1MzIgb2xkaXAsIHUzMiBuZXdpcCwKKwkJICAgICB1MTYgb2xkcG9ydCwgdTE2IG5ld3BvcnQpCit7CisJdWhkci0+Y2hlY2sgPQorCQlpcF92c19jaGVja19kaWZmKH5vbGRpcCwgbmV3aXAsCisJCQkJIGlwX3ZzX2NoZWNrX2RpZmYob2xkcG9ydCBeIDB4RkZGRiwKKwkJCQkJCSAgbmV3cG9ydCwgdWhkci0+Y2hlY2spKTsKKwlpZiAoIXVoZHItPmNoZWNrKQorCQl1aGRyLT5jaGVjayA9IDB4RkZGRjsKK30KKworc3RhdGljIGludAordWRwX3NuYXRfaGFuZGxlcihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCSBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCit7CisJc3RydWN0IHVkcGhkciAqdWRwaDsKKwl1bnNpZ25lZCBpbnQgdWRwaG9mZiA9ICgqcHNrYiktPm5oLmlwaC0+aWhsICogNDsKKworCS8qIGNzdW1fY2hlY2sgcmVxdWlyZXMgdW5zaGFyZWQgc2tiICovCisJaWYgKCFpcF92c19tYWtlX3NrYl93cml0YWJsZShwc2tiLCB1ZHBob2ZmK3NpemVvZigqdWRwaCkpKQorCQlyZXR1cm4gMDsKKworCWlmICh1bmxpa2VseShjcC0+YXBwICE9IE5VTEwpKSB7CisJCS8qIFNvbWUgY2hlY2tzIGJlZm9yZSBtYW5nbGluZyAqLworCQlpZiAocHAtPmNzdW1fY2hlY2sgJiYgIXBwLT5jc3VtX2NoZWNrKCpwc2tiLCBwcCkpCisJCQlyZXR1cm4gMDsKKworCQkvKgorCQkgKglDYWxsIGFwcGxpY2F0aW9uIGhlbHBlciBpZiBuZWVkZWQKKwkJICovCisJCWlmICghaXBfdnNfYXBwX3BrdF9vdXQoY3AsIHBza2IpKQorCQkJcmV0dXJuIDA7CisJfQorCisJdWRwaCA9ICh2b2lkICopKCpwc2tiKS0+bmguaXBoICsgdWRwaG9mZjsKKwl1ZHBoLT5zb3VyY2UgPSBjcC0+dnBvcnQ7CisKKwkvKgorCSAqCUFkanVzdCBVRFAgY2hlY2tzdW1zCisJICovCisJaWYgKCFjcC0+YXBwICYmICh1ZHBoLT5jaGVjayAhPSAwKSkgeworCQkvKiBPbmx5IHBvcnQgYW5kIGFkZHIgYXJlIGNoYW5nZWQsIGRvIGZhc3QgY3N1bSB1cGRhdGUgKi8KKwkJdWRwX2Zhc3RfY3N1bV91cGRhdGUodWRwaCwgY3AtPmRhZGRyLCBjcC0+dmFkZHIsCisJCQkJICAgICBjcC0+ZHBvcnQsIGNwLT52cG9ydCk7CisJCWlmICgoKnBza2IpLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpCisJCQkoKnBza2IpLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCX0gZWxzZSB7CisJCS8qIGZ1bGwgY2hlY2tzdW0gY2FsY3VsYXRpb24gKi8KKwkJdWRwaC0+Y2hlY2sgPSAwOworCQkoKnBza2IpLT5jc3VtID0gc2tiX2NoZWNrc3VtKCpwc2tiLCB1ZHBob2ZmLAorCQkJCQkgICAgICgqcHNrYiktPmxlbiAtIHVkcGhvZmYsIDApOworCQl1ZHBoLT5jaGVjayA9IGNzdW1fdGNwdWRwX21hZ2ljKGNwLT52YWRkciwgY3AtPmNhZGRyLAorCQkJCQkJKCpwc2tiKS0+bGVuIC0gdWRwaG9mZiwKKwkJCQkJCWNwLT5wcm90b2NvbCwKKwkJCQkJCSgqcHNrYiktPmNzdW0pOworCQlpZiAodWRwaC0+Y2hlY2sgPT0gMCkKKwkJCXVkcGgtPmNoZWNrID0gMHhGRkZGOworCQlJUF9WU19EQkcoMTEsICJPLXBrdDogJXMgTy1jc3VtPSVkICgrJXpkKVxuIiwKKwkJCSAgcHAtPm5hbWUsIHVkcGgtPmNoZWNrLAorCQkJICAoY2hhciopJih1ZHBoLT5jaGVjaykgLSAoY2hhciopdWRwaCk7CisJfQorCXJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQKK3VkcF9kbmF0X2hhbmRsZXIoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwKQoreworCXN0cnVjdCB1ZHBoZHIgKnVkcGg7CisJdW5zaWduZWQgaW50IHVkcGhvZmYgPSAoKnBza2IpLT5uaC5pcGgtPmlobCAqIDQ7CisKKwkvKiBjc3VtX2NoZWNrIHJlcXVpcmVzIHVuc2hhcmVkIHNrYiAqLworCWlmICghaXBfdnNfbWFrZV9za2Jfd3JpdGFibGUocHNrYiwgdWRwaG9mZitzaXplb2YoKnVkcGgpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAodW5saWtlbHkoY3AtPmFwcCAhPSBOVUxMKSkgeworCQkvKiBTb21lIGNoZWNrcyBiZWZvcmUgbWFuZ2xpbmcgKi8KKwkJaWYgKHBwLT5jc3VtX2NoZWNrICYmICFwcC0+Y3N1bV9jaGVjaygqcHNrYiwgcHApKQorCQkJcmV0dXJuIDA7CisKKwkJLyoKKwkJICoJQXR0ZW1wdCBpcF92c19hcHAgY2FsbC4KKwkJICoJSXQgd2lsbCBmaXggaXBfdnNfY29ubgorCQkgKi8KKwkJaWYgKCFpcF92c19hcHBfcGt0X2luKGNwLCBwc2tiKSkKKwkJCXJldHVybiAwOworCX0KKworCXVkcGggPSAodm9pZCAqKSgqcHNrYiktPm5oLmlwaCArIHVkcGhvZmY7CisJdWRwaC0+ZGVzdCA9IGNwLT5kcG9ydDsKKworCS8qCisJICoJQWRqdXN0IFVEUCBjaGVja3N1bXMKKwkgKi8KKwlpZiAoIWNwLT5hcHAgJiYgKHVkcGgtPmNoZWNrICE9IDApKSB7CisJCS8qIE9ubHkgcG9ydCBhbmQgYWRkciBhcmUgY2hhbmdlZCwgZG8gZmFzdCBjc3VtIHVwZGF0ZSAqLworCQl1ZHBfZmFzdF9jc3VtX3VwZGF0ZSh1ZHBoLCBjcC0+dmFkZHIsIGNwLT5kYWRkciwKKwkJCQkgICAgIGNwLT52cG9ydCwgY3AtPmRwb3J0KTsKKwkJaWYgKCgqcHNrYiktPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykKKwkJCSgqcHNrYiktPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJfSBlbHNlIHsKKwkJLyogZnVsbCBjaGVja3N1bSBjYWxjdWxhdGlvbiAqLworCQl1ZHBoLT5jaGVjayA9IDA7CisJCSgqcHNrYiktPmNzdW0gPSBza2JfY2hlY2tzdW0oKnBza2IsIHVkcGhvZmYsCisJCQkJCSAgICAgKCpwc2tiKS0+bGVuIC0gdWRwaG9mZiwgMCk7CisJCXVkcGgtPmNoZWNrID0gY3N1bV90Y3B1ZHBfbWFnaWMoY3AtPmNhZGRyLCBjcC0+ZGFkZHIsCisJCQkJCQkoKnBza2IpLT5sZW4gLSB1ZHBob2ZmLAorCQkJCQkJY3AtPnByb3RvY29sLAorCQkJCQkJKCpwc2tiKS0+Y3N1bSk7CisJCWlmICh1ZHBoLT5jaGVjayA9PSAwKQorCQkJdWRwaC0+Y2hlY2sgPSAweEZGRkY7CisJCSgqcHNrYiktPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCX0KKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50Cit1ZHBfY3N1bV9jaGVjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQoreworCXN0cnVjdCB1ZHBoZHIgX3VkcGgsICp1aDsKKwl1bnNpZ25lZCBpbnQgdWRwaG9mZiA9IHNrYi0+bmguaXBoLT5paGwqNDsKKworCXVoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgdWRwaG9mZiwgc2l6ZW9mKF91ZHBoKSwgJl91ZHBoKTsKKwlpZiAodWggPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlpZiAodWgtPmNoZWNrICE9IDApIHsKKwkJc3dpdGNoIChza2ItPmlwX3N1bW1lZCkgeworCQljYXNlIENIRUNLU1VNX05PTkU6CisJCQlza2ItPmNzdW0gPSBza2JfY2hlY2tzdW0oc2tiLCB1ZHBob2ZmLAorCQkJCQkJIHNrYi0+bGVuIC0gdWRwaG9mZiwgMCk7CisJCWNhc2UgQ0hFQ0tTVU1fSFc6CisJCQlpZiAoY3N1bV90Y3B1ZHBfbWFnaWMoc2tiLT5uaC5pcGgtPnNhZGRyLAorCQkJCQkgICAgICBza2ItPm5oLmlwaC0+ZGFkZHIsCisJCQkJCSAgICAgIHNrYi0+bGVuIC0gdWRwaG9mZiwKKwkJCQkJICAgICAgc2tiLT5uaC5pcGgtPnByb3RvY29sLAorCQkJCQkgICAgICBza2ItPmNzdW0pKSB7CisJCQkJSVBfVlNfREJHX1JMX1BLVCgwLCBwcCwgc2tiLCAwLAorCQkJCQkJICJGYWlsZWQgY2hlY2tzdW0gZm9yIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIENIRUNLU1VNX1VOTkVDRVNTQVJZICovCisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworCisvKgorICoJTm90ZTogdGhlIGNhbGxlciBndWFyYW50ZWVzIHRoYXQgb25seSBvbmUgb2YgcmVnaXN0ZXJfYXBwLAorICoJdW5yZWdpc3Rlcl9hcHAgb3IgYXBwX2Nvbm5fYmluZCBpcyBjYWxsZWQgZWFjaCB0aW1lLgorICovCisKKyNkZWZpbmUJVURQX0FQUF9UQUJfQklUUwk0CisjZGVmaW5lCVVEUF9BUFBfVEFCX1NJWkUJKDEgPDwgVURQX0FQUF9UQUJfQklUUykKKyNkZWZpbmUJVURQX0FQUF9UQUJfTUFTSwkoVURQX0FQUF9UQUJfU0laRSAtIDEpCisKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHVkcF9hcHBzW1VEUF9BUFBfVEFCX1NJWkVdOworc3RhdGljIERFRklORV9TUElOTE9DSyh1ZHBfYXBwX2xvY2spOworCitzdGF0aWMgaW5saW5lIF9fdTE2IHVkcF9hcHBfaGFzaGtleShfX3UxNiBwb3J0KQoreworCXJldHVybiAoKHBvcnQgPj4gVURQX0FQUF9UQUJfQklUUykgXiBwb3J0KSAmIFVEUF9BUFBfVEFCX01BU0s7Cit9CisKKworc3RhdGljIGludCB1ZHBfcmVnaXN0ZXJfYXBwKHN0cnVjdCBpcF92c19hcHAgKmluYykKK3sKKwlzdHJ1Y3QgaXBfdnNfYXBwICppOworCV9fdTE2IGhhc2gsIHBvcnQgPSBpbmMtPnBvcnQ7CisJaW50IHJldCA9IDA7CisKKwloYXNoID0gdWRwX2FwcF9oYXNoa2V5KHBvcnQpOworCisKKwlzcGluX2xvY2tfYmgoJnVkcF9hcHBfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpLCAmdWRwX2FwcHNbaGFzaF0sIHBfbGlzdCkgeworCQlpZiAoaS0+cG9ydCA9PSBwb3J0KSB7CisJCQlyZXQgPSAtRUVYSVNUOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJbGlzdF9hZGQoJmluYy0+cF9saXN0LCAmdWRwX2FwcHNbaGFzaF0pOworCWF0b21pY19pbmMoJmlwX3ZzX3Byb3RvY29sX3VkcC5hcHBjbnQpOworCisgIG91dDoKKwlzcGluX3VubG9ja19iaCgmdWRwX2FwcF9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkCit1ZHBfdW5yZWdpc3Rlcl9hcHAoc3RydWN0IGlwX3ZzX2FwcCAqaW5jKQoreworCXNwaW5fbG9ja19iaCgmdWRwX2FwcF9sb2NrKTsKKwlhdG9taWNfZGVjKCZpcF92c19wcm90b2NvbF91ZHAuYXBwY250KTsKKwlsaXN0X2RlbCgmaW5jLT5wX2xpc3QpOworCXNwaW5fdW5sb2NrX2JoKCZ1ZHBfYXBwX2xvY2spOworfQorCisKK3N0YXRpYyBpbnQgdWRwX2FwcF9jb25uX2JpbmQoc3RydWN0IGlwX3ZzX2Nvbm4gKmNwKQoreworCWludCBoYXNoOworCXN0cnVjdCBpcF92c19hcHAgKmluYzsKKwlpbnQgcmVzdWx0ID0gMDsKKworCS8qIERlZmF1bHQgYmluZGluZzogYmluZCBhcHAgb25seSBmb3IgTkFUICovCisJaWYgKElQX1ZTX0ZXRF9NRVRIT0QoY3ApICE9IElQX1ZTX0NPTk5fRl9NQVNRKQorCQlyZXR1cm4gMDsKKworCS8qIExvb2t1cCBhcHBsaWNhdGlvbiBpbmNhcm5hdGlvbnMgYW5kIGJpbmQgdGhlIHJpZ2h0IG9uZSAqLworCWhhc2ggPSB1ZHBfYXBwX2hhc2hrZXkoY3AtPnZwb3J0KTsKKworCXNwaW5fbG9jaygmdWRwX2FwcF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGluYywgJnVkcF9hcHBzW2hhc2hdLCBwX2xpc3QpIHsKKwkJaWYgKGluYy0+cG9ydCA9PSBjcC0+dnBvcnQpIHsKKwkJCWlmICh1bmxpa2VseSghaXBfdnNfYXBwX2luY19nZXQoaW5jKSkpCisJCQkJYnJlYWs7CisJCQlzcGluX3VubG9jaygmdWRwX2FwcF9sb2NrKTsKKworCQkJSVBfVlNfREJHKDksICIlczogQmluZGluZyBjb25uICV1LiV1LiV1LiV1OiV1LT4iCisJCQkJICAiJXUuJXUuJXUuJXU6JXUgdG8gYXBwICVzIG9uIHBvcnQgJXVcbiIsCisJCQkJICBfX0ZVTkNUSU9OX18sCisJCQkJICBOSVBRVUFEKGNwLT5jYWRkciksIG50b2hzKGNwLT5jcG9ydCksCisJCQkJICBOSVBRVUFEKGNwLT52YWRkciksIG50b2hzKGNwLT52cG9ydCksCisJCQkJICBpbmMtPm5hbWUsIG50b2hzKGluYy0+cG9ydCkpOworCQkJY3AtPmFwcCA9IGluYzsKKwkJCWlmIChpbmMtPmluaXRfY29ubikKKwkJCQlyZXN1bHQgPSBpbmMtPmluaXRfY29ubihpbmMsIGNwKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZ1ZHBfYXBwX2xvY2spOworCisgIG91dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBpbnQgdWRwX3RpbWVvdXRzW0lQX1ZTX1VEUF9TX0xBU1QrMV0gPSB7CisJW0lQX1ZTX1VEUF9TX05PUk1BTF0JCT0JNSo2MCpIWiwKKwlbSVBfVlNfVURQX1NfTEFTVF0JCT0JMipIWiwKK307CisKK3N0YXRpYyBjaGFyICogdWRwX3N0YXRlX25hbWVfdGFibGVbSVBfVlNfVURQX1NfTEFTVCsxXSA9IHsKKwlbSVBfVlNfVURQX1NfTk9STUFMXQkJPQkiVURQIiwKKwlbSVBfVlNfVURQX1NfTEFTVF0JCT0JIkJVRyEiLAorfTsKKworCitzdGF0aWMgaW50Cit1ZHBfc2V0X3N0YXRlX3RpbWVvdXQoc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwgY2hhciAqc25hbWUsIGludCB0bykKK3sKKwlyZXR1cm4gaXBfdnNfc2V0X3N0YXRlX3RpbWVvdXQocHAtPnRpbWVvdXRfdGFibGUsIElQX1ZTX1VEUF9TX0xBU1QsCisJCQkJICAgICAgIHVkcF9zdGF0ZV9uYW1lX3RhYmxlLCBzbmFtZSwgdG8pOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIHVkcF9zdGF0ZV9uYW1lKGludCBzdGF0ZSkKK3sKKwlpZiAoc3RhdGUgPj0gSVBfVlNfVURQX1NfTEFTVCkKKwkJcmV0dXJuICJFUlIhIjsKKwlyZXR1cm4gdWRwX3N0YXRlX25hbWVfdGFibGVbc3RhdGVdID8gdWRwX3N0YXRlX25hbWVfdGFibGVbc3RhdGVdIDogIj8iOworfQorCitzdGF0aWMgaW50Cit1ZHBfc3RhdGVfdHJhbnNpdGlvbihzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsIGludCBkaXJlY3Rpb24sCisJCSAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQoreworCWNwLT50aW1lb3V0ID0gcHAtPnRpbWVvdXRfdGFibGVbSVBfVlNfVURQX1NfTk9STUFMXTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgdWRwX2luaXQoc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKK3sKKwlJUF9WU19JTklUX0hBU0hfVEFCTEUodWRwX2FwcHMpOworCXBwLT50aW1lb3V0X3RhYmxlID0gdWRwX3RpbWVvdXRzOworfQorCitzdGF0aWMgdm9pZCB1ZHBfZXhpdChzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQoreworfQorCisKK3N0cnVjdCBpcF92c19wcm90b2NvbCBpcF92c19wcm90b2NvbF91ZHAgPSB7CisJLm5hbWUgPQkJCSJVRFAiLAorCS5wcm90b2NvbCA9CQlJUFBST1RPX1VEUCwKKwkuZG9udF9kZWZyYWcgPQkJMCwKKwkuaW5pdCA9CQkJdWRwX2luaXQsCisJLmV4aXQgPQkJCXVkcF9leGl0LAorCS5jb25uX3NjaGVkdWxlID0JdWRwX2Nvbm5fc2NoZWR1bGUsCisJLmNvbm5faW5fZ2V0ID0JCXVkcF9jb25uX2luX2dldCwKKwkuY29ubl9vdXRfZ2V0ID0JCXVkcF9jb25uX291dF9nZXQsCisJLnNuYXRfaGFuZGxlciA9CQl1ZHBfc25hdF9oYW5kbGVyLAorCS5kbmF0X2hhbmRsZXIgPQkJdWRwX2RuYXRfaGFuZGxlciwKKwkuY3N1bV9jaGVjayA9CQl1ZHBfY3N1bV9jaGVjaywKKwkuc3RhdGVfdHJhbnNpdGlvbiA9CXVkcF9zdGF0ZV90cmFuc2l0aW9uLAorCS5zdGF0ZV9uYW1lID0JCXVkcF9zdGF0ZV9uYW1lLAorCS5yZWdpc3Rlcl9hcHAgPQkJdWRwX3JlZ2lzdGVyX2FwcCwKKwkudW5yZWdpc3Rlcl9hcHAgPQl1ZHBfdW5yZWdpc3Rlcl9hcHAsCisJLmFwcF9jb25uX2JpbmQgPQl1ZHBfYXBwX2Nvbm5fYmluZCwKKwkuZGVidWdfcGFja2V0ID0JCWlwX3ZzX3RjcHVkcF9kZWJ1Z19wYWNrZXQsCisJLnRpbWVvdXRfY2hhbmdlID0JTlVMTCwKKwkuc2V0X3N0YXRlX3RpbWVvdXQgPQl1ZHBfc2V0X3N0YXRlX3RpbWVvdXQsCit9OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19yci5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19yci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyM2JhYjIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3JyLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBJUFZTOiAgICAgICAgUm91bmQtUm9iaW4gU2NoZWR1bGluZyBtb2R1bGUKKyAqCisgKiBWZXJzaW9uOiAgICAgJElkOiBpcF92c19yci5jLHYgMS45IDIwMDIvMDkvMTUgMDg6MTQ6MDggd2Vuc29uZyBFeHAgJAorICoKKyAqIEF1dGhvcnM6ICAgICBXZW5zb25nIFpoYW5nIDx3ZW5zb25nQGxpbnV4dmlydHVhbHNlcnZlci5vcmc+CisgKiAgICAgICAgICAgICAgUGV0ZXIgS2VzZSA8cGV0ZXIua2VzZUBpanMuc2k+CisgKgorICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRml4ZXMvQ2hhbmdlczoKKyAqICAgICBXZW5zb25nIFpoYW5nICAgICAgICAgICAgOiAgICAgY2hhbmdlZCB0aGUgaXBfdnNfcnJfc2NoZWR1bGUgdG8gcmV0dXJuIGRlc3QKKyAqICAgICBKdWxpYW4gQW5hc3Rhc292ICAgICAgICAgOiAgICAgZml4ZWQgdGhlIE5VTEwgcG9pbnRlciBhY2Nlc3MgYnVnIGluIGRlYnVnZ2luZworICogICAgIFdlbnNvbmcgWmhhbmcgICAgICAgICAgICA6ICAgICBjaGFuZ2VkIHNvbWUgY29tZXN0aWNzIHRoaW5ncyBmb3IgZGVidWdnaW5nCisgKiAgICAgV2Vuc29uZyBaaGFuZyAgICAgICAgICAgIDogICAgIGNoYW5nZWQgZm9yIHRoZSBkLWxpbmtlZCBkZXN0aW5hdGlvbiBsaXN0CisgKiAgICAgV2Vuc29uZyBaaGFuZyAgICAgICAgICAgIDogICAgIGFkZGVkIHRoZSBpcF92c19ycl91cGRhdGVfc3ZjCisgKiAgICAgV2Vuc29uZyBaaGFuZyAgICAgICAgICAgIDogICAgIGFkZGVkIGFueSBkZXN0IHdpdGggd2VpZ2h0PTAgaXMgcXVpZXNjZWQKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaW5jbHVkZSA8bmV0L2lwX3ZzLmg+CisKKworc3RhdGljIGludCBpcF92c19ycl9pbml0X3N2YyhzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQoreworCXN2Yy0+c2NoZWRfZGF0YSA9ICZzdmMtPmRlc3RpbmF0aW9uczsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGlwX3ZzX3JyX2RvbmVfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCit7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpcF92c19ycl91cGRhdGVfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCit7CisJc3ZjLT5zY2hlZF9kYXRhID0gJnN2Yy0+ZGVzdGluYXRpb25zOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBSb3VuZC1Sb2JpbiBTY2hlZHVsaW5nCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfZGVzdCAqCitpcF92c19ycl9zY2hlZHVsZShzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpxOworCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0OworCisJSVBfVlNfREJHKDYsICJpcF92c19ycl9zY2hlZHVsZSgpOiBTY2hlZHVsaW5nLi4uXG4iKTsKKworCXdyaXRlX2xvY2soJnN2Yy0+c2NoZWRfbG9jayk7CisJcCA9IChzdHJ1Y3QgbGlzdF9oZWFkICopc3ZjLT5zY2hlZF9kYXRhOworCXAgPSBwLT5uZXh0OworCXEgPSBwOworCWRvIHsKKwkJLyogc2tpcCBsaXN0IGhlYWQgKi8KKwkJaWYgKHEgPT0gJnN2Yy0+ZGVzdGluYXRpb25zKSB7CisJCQlxID0gcS0+bmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCQorCQlkZXN0ID0gbGlzdF9lbnRyeShxLCBzdHJ1Y3QgaXBfdnNfZGVzdCwgbl9saXN0KTsKKwkJaWYgKCEoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfT1ZFUkxPQUQpICYmCisJCSAgICBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KSA+IDApCisJCQkvKiBISVQgKi8KKwkJCWdvdG8gb3V0OworCQlxID0gcS0+bmV4dDsKKwl9IHdoaWxlIChxICE9IHApOworCXdyaXRlX3VubG9jaygmc3ZjLT5zY2hlZF9sb2NrKTsKKwlyZXR1cm4gTlVMTDsKKworICBvdXQ6CisJc3ZjLT5zY2hlZF9kYXRhID0gcTsKKwl3cml0ZV91bmxvY2soJnN2Yy0+c2NoZWRfbG9jayk7CisJSVBfVlNfREJHKDYsICJSUjogc2VydmVyICV1LiV1LiV1LiV1OiV1ICIKKwkJICAiYWN0aXZlY29ubnMgJWQgcmVmY250ICVkIHdlaWdodCAlZFxuIiwKKwkJICBOSVBRVUFEKGRlc3QtPmFkZHIpLCBudG9ocyhkZXN0LT5wb3J0KSwKKwkJICBhdG9taWNfcmVhZCgmZGVzdC0+YWN0aXZlY29ubnMpLAorCQkgIGF0b21pY19yZWFkKCZkZXN0LT5yZWZjbnQpLCBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KSk7CisKKwlyZXR1cm4gZGVzdDsKK30KKworCitzdGF0aWMgc3RydWN0IGlwX3ZzX3NjaGVkdWxlciBpcF92c19ycl9zY2hlZHVsZXIgPSB7CisJLm5hbWUgPQkJCSJyciIsCQkJLyogbmFtZSAqLworCS5yZWZjbnQgPQkJQVRPTUlDX0lOSVQoMCksCisJLm1vZHVsZSA9CQlUSElTX01PRFVMRSwKKwkuaW5pdF9zZXJ2aWNlID0JCWlwX3ZzX3JyX2luaXRfc3ZjLAorCS5kb25lX3NlcnZpY2UgPQkJaXBfdnNfcnJfZG9uZV9zdmMsCisJLnVwZGF0ZV9zZXJ2aWNlID0JaXBfdnNfcnJfdXBkYXRlX3N2YywKKwkuc2NoZWR1bGUgPQkJaXBfdnNfcnJfc2NoZWR1bGUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpcF92c19ycl9pbml0KHZvaWQpCit7CisJSU5JVF9MSVNUX0hFQUQoJmlwX3ZzX3JyX3NjaGVkdWxlci5uX2xpc3QpOworCXJldHVybiByZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoJmlwX3ZzX3JyX3NjaGVkdWxlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpcF92c19ycl9jbGVhbnVwKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoJmlwX3ZzX3JyX3NjaGVkdWxlcik7Cit9CisKK21vZHVsZV9pbml0KGlwX3ZzX3JyX2luaXQpOworbW9kdWxlX2V4aXQoaXBfdnNfcnJfY2xlYW51cCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3NjaGVkLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3NjaGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY3YzU2YQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfc2NoZWQuYwpAQCAtMCwwICsxLDI1MSBAQAorLyoKKyAqIElQVlMgICAgICAgICBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSVAgdmlydHVhbCBzZXJ2ZXIgc3VwcG9ydCBmb3IgdGhlCisgKiAgICAgICAgICAgICAgTElOVVggb3BlcmF0aW5nIHN5c3RlbS4gIElQVlMgaXMgbm93IGltcGxlbWVudGVkIGFzIGEgbW9kdWxlCisgKiAgICAgICAgICAgICAgb3ZlciB0aGUgTmV0ZmlsdGVyIGZyYW1ld29yay4gSVBWUyBjYW4gYmUgdXNlZCB0byBidWlsZCBhCisgKiAgICAgICAgICAgICAgaGlnaC1wZXJmb3JtYW5jZSBhbmQgaGlnaGx5IGF2YWlsYWJsZSBzZXJ2ZXIgYmFzZWQgb24gYQorICogICAgICAgICAgICAgIGNsdXN0ZXIgb2Ygc2VydmVycy4KKyAqCisgKiBWZXJzaW9uOiAgICAgJElkOiBpcF92c19zY2hlZC5jLHYgMS4xMyAyMDAzLzA1LzEwIDAzOjA1OjIzIHdlbnNvbmcgRXhwICQKKyAqCisgKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgorICogICAgICAgICAgICAgIFBldGVyIEtlc2UgPHBldGVyLmtlc2VAaWpzLnNpPgorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENoYW5nZXM6CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKworI2luY2x1ZGUgPG5ldC9pcF92cy5oPgorCisvKgorICogIElQVlMgc2NoZWR1bGVyIGxpc3QKKyAqLworc3RhdGljIExJU1RfSEVBRChpcF92c19zY2hlZHVsZXJzKTsKKworLyogbG9jayBmb3Igc2VydmljZSB0YWJsZSAqLworc3RhdGljIERFRklORV9SV0xPQ0soX19pcF92c19zY2hlZF9sb2NrKTsKKworCisvKgorICogIEJpbmQgYSBzZXJ2aWNlIHdpdGggYSBzY2hlZHVsZXIKKyAqLworaW50IGlwX3ZzX2JpbmRfc2NoZWR1bGVyKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsCisJCQkgc3RydWN0IGlwX3ZzX3NjaGVkdWxlciAqc2NoZWR1bGVyKQoreworCWludCByZXQ7CisKKwlpZiAoc3ZjID09IE5VTEwpIHsKKwkJSVBfVlNfRVJSKCJpcF92c19iaW5kX3NjaGVkdWxlcigpOiBzdmMgYXJnIE5VTExcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHNjaGVkdWxlciA9PSBOVUxMKSB7CisJCUlQX1ZTX0VSUigiaXBfdnNfYmluZF9zY2hlZHVsZXIoKTogc2NoZWR1bGVyIGFyZyBOVUxMXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3ZjLT5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7CisKKwlpZiAoc2NoZWR1bGVyLT5pbml0X3NlcnZpY2UpIHsKKwkJcmV0ID0gc2NoZWR1bGVyLT5pbml0X3NlcnZpY2Uoc3ZjKTsKKwkJaWYgKHJldCkgeworCQkJSVBfVlNfRVJSKCJpcF92c19iaW5kX3NjaGVkdWxlcigpOiBpbml0IGVycm9yXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogIFVuYmluZCBhIHNlcnZpY2Ugd2l0aCBpdHMgc2NoZWR1bGVyCisgKi8KK2ludCBpcF92c191bmJpbmRfc2NoZWR1bGVyKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCit7CisJc3RydWN0IGlwX3ZzX3NjaGVkdWxlciAqc2NoZWQ7CisKKwlpZiAoc3ZjID09IE5VTEwpIHsKKwkJSVBfVlNfRVJSKCJpcF92c191bmJpbmRfc2NoZWR1bGVyKCk6IHN2YyBhcmcgTlVMTFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNjaGVkID0gc3ZjLT5zY2hlZHVsZXI7CisJaWYgKHNjaGVkID09IE5VTEwpIHsKKwkJSVBfVlNfRVJSKCJpcF92c191bmJpbmRfc2NoZWR1bGVyKCk6IHN2YyBpc24ndCBib3VuZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChzY2hlZC0+ZG9uZV9zZXJ2aWNlKSB7CisJCWlmIChzY2hlZC0+ZG9uZV9zZXJ2aWNlKHN2YykgIT0gMCkgeworCQkJSVBfVlNfRVJSKCJpcF92c191bmJpbmRfc2NoZWR1bGVyKCk6IGRvbmUgZXJyb3JcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlzdmMtPnNjaGVkdWxlciA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqICBHZXQgc2NoZWR1bGVyIGluIHRoZSBzY2hlZHVsZXIgbGlzdCBieSBuYW1lCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfc2NoZWR1bGVyICppcF92c19zY2hlZF9nZXRieW5hbWUoY29uc3QgY2hhciAqc2NoZWRfbmFtZSkKK3sKKwlzdHJ1Y3QgaXBfdnNfc2NoZWR1bGVyICpzY2hlZDsKKworCUlQX1ZTX0RCRygyLCAiaXBfdnNfc2NoZWRfZ2V0YnluYW1lKCk6IHNjaGVkX25hbWUgXCIlc1wiXG4iLAorCQkgIHNjaGVkX25hbWUpOworCisJcmVhZF9sb2NrX2JoKCZfX2lwX3ZzX3NjaGVkX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzY2hlZCwgJmlwX3ZzX3NjaGVkdWxlcnMsIG5fbGlzdCkgeworCQkvKgorCQkgKiBUZXN0IGFuZCBnZXQgdGhlIG1vZHVsZXMgYXRvbWljYWxseQorCQkgKi8KKwkJaWYgKHNjaGVkLT5tb2R1bGUgJiYgIXRyeV9tb2R1bGVfZ2V0KHNjaGVkLT5tb2R1bGUpKSB7CisJCQkvKgorCQkJICogVGhpcyBzY2hlZHVsZXIgaXMganVzdCBkZWxldGVkCisJCQkgKi8KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdHJjbXAoc2NoZWRfbmFtZSwgc2NoZWQtPm5hbWUpPT0wKSB7CisJCQkvKiBISVQgKi8KKwkJCXJlYWRfdW5sb2NrX2JoKCZfX2lwX3ZzX3NjaGVkX2xvY2spOworCQkJcmV0dXJuIHNjaGVkOworCQl9CisJCWlmIChzY2hlZC0+bW9kdWxlKQorCQkJbW9kdWxlX3B1dChzY2hlZC0+bW9kdWxlKTsKKwl9CisKKwlyZWFkX3VubG9ja19iaCgmX19pcF92c19zY2hlZF9sb2NrKTsKKwlyZXR1cm4gTlVMTDsKK30KKworCisvKgorICogIExvb2t1cCBzY2hlZHVsZXIgYW5kIHRyeSB0byBsb2FkIGl0IGlmIGl0IGRvZXNuJ3QgZXhpc3QKKyAqLworc3RydWN0IGlwX3ZzX3NjaGVkdWxlciAqaXBfdnNfc2NoZWR1bGVyX2dldChjb25zdCBjaGFyICpzY2hlZF9uYW1lKQoreworCXN0cnVjdCBpcF92c19zY2hlZHVsZXIgKnNjaGVkOworCisJLyoKKwkgKiAgU2VhcmNoIGZvciB0aGUgc2NoZWR1bGVyIGJ5IHNjaGVkX25hbWUKKwkgKi8KKwlzY2hlZCA9IGlwX3ZzX3NjaGVkX2dldGJ5bmFtZShzY2hlZF9uYW1lKTsKKworCS8qCisJICogIElmIHNjaGVkdWxlciBub3QgZm91bmQsIGxvYWQgdGhlIG1vZHVsZSBhbmQgc2VhcmNoIGFnYWluCisJICovCisJaWYgKHNjaGVkID09IE5VTEwpIHsKKwkJcmVxdWVzdF9tb2R1bGUoImlwX3ZzXyVzIiwgc2NoZWRfbmFtZSk7CisJCXNjaGVkID0gaXBfdnNfc2NoZWRfZ2V0YnluYW1lKHNjaGVkX25hbWUpOworCX0KKworCXJldHVybiBzY2hlZDsKK30KKwordm9pZCBpcF92c19zY2hlZHVsZXJfcHV0KHN0cnVjdCBpcF92c19zY2hlZHVsZXIgKnNjaGVkdWxlcikKK3sKKwlpZiAoc2NoZWR1bGVyLT5tb2R1bGUpCisJCW1vZHVsZV9wdXQoc2NoZWR1bGVyLT5tb2R1bGUpOworfQorCisKKy8qCisgKiAgUmVnaXN0ZXIgYSBzY2hlZHVsZXIgaW4gdGhlIHNjaGVkdWxlciBsaXN0CisgKi8KK2ludCByZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoc3RydWN0IGlwX3ZzX3NjaGVkdWxlciAqc2NoZWR1bGVyKQoreworCXN0cnVjdCBpcF92c19zY2hlZHVsZXIgKnNjaGVkOworCisJaWYgKCFzY2hlZHVsZXIpIHsKKwkJSVBfVlNfRVJSKCJyZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoKTogTlVMTCBhcmdcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXNjaGVkdWxlci0+bmFtZSkgeworCQlJUF9WU19FUlIoInJlZ2lzdGVyX2lwX3ZzX3NjaGVkdWxlcigpOiBOVUxMIHNjaGVkdWxlcl9uYW1lXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogaW5jcmVhc2UgdGhlIG1vZHVsZSB1c2UgY291bnQgKi8KKwlpcF92c191c2VfY291bnRfaW5jKCk7CisKKwkvKgorCSAqICBNYWtlIHN1cmUgdGhhdCB0aGUgc2NoZWR1bGVyIHdpdGggdGhpcyBuYW1lIGRvZXNuJ3QgZXhpc3QKKwkgKiAgaW4gdGhlIHNjaGVkdWxlciBsaXN0LgorCSAqLworCXNjaGVkID0gaXBfdnNfc2NoZWRfZ2V0YnluYW1lKHNjaGVkdWxlci0+bmFtZSk7CisJaWYgKHNjaGVkKSB7CisJCWlwX3ZzX3NjaGVkdWxlcl9wdXQoc2NoZWQpOworCQlpcF92c191c2VfY291bnRfZGVjKCk7CisJCUlQX1ZTX0VSUigicmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKCk6IFslc10gc2NoZWR1bGVyICIKKwkJCSAgImFscmVhZHkgZXhpc3RlZCBpbiB0aGUgc3lzdGVtXG4iLCBzY2hlZHVsZXItPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl3cml0ZV9sb2NrX2JoKCZfX2lwX3ZzX3NjaGVkX2xvY2spOworCisJaWYgKHNjaGVkdWxlci0+bl9saXN0Lm5leHQgIT0gJnNjaGVkdWxlci0+bl9saXN0KSB7CisJCXdyaXRlX3VubG9ja19iaCgmX19pcF92c19zY2hlZF9sb2NrKTsKKwkJaXBfdnNfdXNlX2NvdW50X2RlYygpOworCQlJUF9WU19FUlIoInJlZ2lzdGVyX2lwX3ZzX3NjaGVkdWxlcigpOiBbJXNdIHNjaGVkdWxlciAiCisJCQkgICJhbHJlYWR5IGxpbmtlZFxuIiwgc2NoZWR1bGVyLT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKglBZGQgaXQgaW50byB0aGUgZC1saW5rZWQgc2NoZWR1bGVyIGxpc3QKKwkgKi8KKwlsaXN0X2FkZCgmc2NoZWR1bGVyLT5uX2xpc3QsICZpcF92c19zY2hlZHVsZXJzKTsKKwl3cml0ZV91bmxvY2tfYmgoJl9faXBfdnNfc2NoZWRfbG9jayk7CisKKwlJUF9WU19JTkZPKCJbJXNdIHNjaGVkdWxlciByZWdpc3RlcmVkLlxuIiwgc2NoZWR1bGVyLT5uYW1lKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiAgVW5yZWdpc3RlciBhIHNjaGVkdWxlciBmcm9tIHRoZSBzY2hlZHVsZXIgbGlzdAorICovCitpbnQgdW5yZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoc3RydWN0IGlwX3ZzX3NjaGVkdWxlciAqc2NoZWR1bGVyKQoreworCWlmICghc2NoZWR1bGVyKSB7CisJCUlQX1ZTX0VSUiggInVucmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKCk6IE5VTEwgYXJnXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd3JpdGVfbG9ja19iaCgmX19pcF92c19zY2hlZF9sb2NrKTsKKwlpZiAoc2NoZWR1bGVyLT5uX2xpc3QubmV4dCA9PSAmc2NoZWR1bGVyLT5uX2xpc3QpIHsKKwkJd3JpdGVfdW5sb2NrX2JoKCZfX2lwX3ZzX3NjaGVkX2xvY2spOworCQlJUF9WU19FUlIoInVucmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKCk6IFslc10gc2NoZWR1bGVyICIKKwkJCSAgImlzIG5vdCBpbiB0aGUgbGlzdC4gZmFpbGVkXG4iLCBzY2hlZHVsZXItPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqCVJlbW92ZSBpdCBmcm9tIHRoZSBkLWxpbmtlZCBzY2hlZHVsZXIgbGlzdAorCSAqLworCWxpc3RfZGVsKCZzY2hlZHVsZXItPm5fbGlzdCk7CisJd3JpdGVfdW5sb2NrX2JoKCZfX2lwX3ZzX3NjaGVkX2xvY2spOworCisJLyogZGVjcmVhc2UgdGhlIG1vZHVsZSB1c2UgY291bnQgKi8KKwlpcF92c191c2VfY291bnRfZGVjKCk7CisKKwlJUF9WU19JTkZPKCJbJXNdIHNjaGVkdWxlciB1bnJlZ2lzdGVyZWQuXG4iLCBzY2hlZHVsZXItPm5hbWUpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3NlZC5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19zZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjM2NmY3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c19zZWQuYwpAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIElQVlM6ICAgICAgICBTaG9ydGVzdCBFeHBlY3RlZCBEZWxheSBzY2hlZHVsaW5nIG1vZHVsZQorICoKKyAqIFZlcnNpb246ICAgICAkSWQ6IGlwX3ZzX3NlZC5jLHYgMS4xIDIwMDMvMDUvMTAgMDM6MDY6MDggd2Vuc29uZyBFeHAgJAorICoKKyAqIEF1dGhvcnM6ICAgICBXZW5zb25nIFpoYW5nIDx3ZW5zb25nQGxpbnV4dmlydHVhbHNlcnZlci5vcmc+CisgKgorICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQ2hhbmdlczoKKyAqCisgKi8KKworLyoKKyAqIFRoZSBTRUQgYWxnb3JpdGhtIGF0dGVtcHRzIHRvIG1pbmltaXplIGVhY2ggam9iJ3MgZXhwZWN0ZWQgZGVsYXkgdW50aWwKKyAqIGNvbXBsZXRpb24uIFRoZSBleHBlY3RlZCBkZWxheSB0aGF0IHRoZSBqb2Igd2lsbCBleHBlcmllbmNlIGlzCisgKiAoQ2kgKyAxKSAvIFVpIGlmIHNlbnQgdG8gdGhlIGl0aCBzZXJ2ZXIsIGluIHdoaWNoIENpIGlzIHRoZSBudW1iZXIgb2YKKyAqIGpvYnMgb24gdGhlIHRoZSBpdGggc2VydmVyIGFuZCBVaSBpcyB0aGUgZml4ZWQgc2VydmljZSByYXRlICh3ZWlnaHQpIG9mCisgKiB0aGUgaXRoIHNlcnZlci4gVGhlIFNFRCBhbGdvcml0aG0gYWRvcHRzIGEgZ3JlZWR5IHBvbGljeSB0aGF0IGVhY2ggZG9lcworICogd2hhdCBpcyBpbiBpdHMgb3duIGJlc3QgaW50ZXJlc3QsIGkuZS4gdG8gam9pbiB0aGUgcXVldWUgd2hpY2ggd291bGQKKyAqIG1pbmltaXplIGl0cyBleHBlY3RlZCBkZWxheSBvZiBjb21wbGV0aW9uLgorICoKKyAqIFNlZSB0aGUgZm9sbG93aW5nIHBhcGVyIGZvciBtb3JlIGluZm9ybWF0aW9uOgorICogQS4gV2VpbnJpYiBhbmQgUy4gU2hlbmtlciwgR3JlZWQgaXMgbm90IGVub3VnaDogQWRhcHRpdmUgbG9hZCBzaGFyaW5nCisgKiBpbiBsYXJnZSBoZXRlcm9nZW5lb3VzIHN5c3RlbXMuIEluIFByb2NlZWRpbmdzIElFRUUgSU5GT0NPTSc4OCwKKyAqIHBhZ2VzIDk4Ni05OTQsIDE5ODguCisgKgorICogVGhhbmtzIG11c3QgZ28gdG8gTWFya28gQnV1cmkgPG1hcmtvQGJ1dXJpLm5hbWU+IGZvciB0YWxraW5nIFNFRCB0byBtZS4KKyAqCisgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFNFRCBhbmQgV0xDIGlzIHRoYXQgU0VEIGluY2x1ZGVzIHRoZSBpbmNvbWluZworICogam9iIGluIHRoZSBjb3N0IGZ1bmN0aW9uICh0aGUgaW5jcmVtZW50IG9mIDEpLiBTRUQgbWF5IG91dHBlcmZvcm0KKyAqIFdMQywgd2hpbGUgc2NoZWR1bGluZyBiaWcgam9icyB1bmRlciBsYXJnZXIgaGV0ZXJvZ2VuZW91cyBzeXN0ZW1zCisgKiAodGhlIHNlcnZlciB3ZWlnaHQgdmFyaWVzIGEgbG90KS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaW5jbHVkZSA8bmV0L2lwX3ZzLmg+CisKKworc3RhdGljIGludAoraXBfdnNfc2VkX2luaXRfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCit7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAoraXBfdnNfc2VkX2RvbmVfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCit7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAoraXBfdnNfc2VkX3VwZGF0ZV9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAoraXBfdnNfc2VkX2Rlc3Rfb3ZlcmhlYWQoc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCit7CisJLyoKKwkgKiBXZSBvbmx5IHVzZSB0aGUgYWN0aXZlIGNvbm5lY3Rpb24gbnVtYmVyIGluIHRoZSBjb3N0CisJICogY2FsY3VsYXRpb24gaGVyZS4KKwkgKi8KKwlyZXR1cm4gYXRvbWljX3JlYWQoJmRlc3QtPmFjdGl2ZWNvbm5zKSArIDE7Cit9CisKKworLyoKKyAqCVdlaWdodGVkIExlYXN0IENvbm5lY3Rpb24gc2NoZWR1bGluZworICovCitzdGF0aWMgc3RydWN0IGlwX3ZzX2Rlc3QgKgoraXBfdnNfc2VkX3NjaGVkdWxlKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QsICpsZWFzdDsKKwl1bnNpZ25lZCBpbnQgbG9oLCBkb2g7CisKKwlJUF9WU19EQkcoNiwgImlwX3ZzX3NlZF9zY2hlZHVsZSgpOiBTY2hlZHVsaW5nLi4uXG4iKTsKKworCS8qCisJICogV2UgY2FsY3VsYXRlIHRoZSBsb2FkIG9mIGVhY2ggZGVzdCBzZXJ2ZXIgYXMgZm9sbG93czoKKwkgKgkoc2VydmVyIGV4cGVjdGVkIG92ZXJoZWFkKSAvIGRlc3QtPndlaWdodAorCSAqCisJICogUmVtZW1iZXIgLS0gbm8gZmxvYXRzIGluIGtlcm5lbCBtb2RlISEhCisJICogVGhlIGNvbXBhcmlzb24gb2YgaDEqdzIgPiBoMip3MSBpcyBlcXVpdmFsZW50IHRvIHRoYXQgb2YKKwkgKgkJICBoMS93MSA+IGgyL3cyCisJICogaWYgZXZlcnkgd2VpZ2h0IGlzIGxhcmdlciB0aGFuIHplcm8uCisJICoKKwkgKiBUaGUgc2VydmVyIHdpdGggd2VpZ2h0PTAgaXMgcXVpZXNjZWQgYW5kIHdpbGwgbm90IHJlY2VpdmUgYW55CisJICogbmV3IGNvbm5lY3Rpb25zLgorCSAqLworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXN0LCAmc3ZjLT5kZXN0aW5hdGlvbnMsIG5fbGlzdCkgeworCQlpZiAoIShkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9PVkVSTE9BRCkgJiYKKwkJICAgIGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpID4gMCkgeworCQkJbGVhc3QgPSBkZXN0OworCQkJbG9oID0gaXBfdnNfc2VkX2Rlc3Rfb3ZlcmhlYWQobGVhc3QpOworCQkJZ290byBuZXh0c3RhZ2U7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqICAgIEZpbmQgdGhlIGRlc3RpbmF0aW9uIHdpdGggdGhlIGxlYXN0IGxvYWQuCisJICovCisgIG5leHRzdGFnZToKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKGRlc3QsICZzdmMtPmRlc3RpbmF0aW9ucywgbl9saXN0KSB7CisJCWlmIChkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9PVkVSTE9BRCkKKwkJCWNvbnRpbnVlOworCQlkb2ggPSBpcF92c19zZWRfZGVzdF9vdmVyaGVhZChkZXN0KTsKKwkJaWYgKGxvaCAqIGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpID4KKwkJICAgIGRvaCAqIGF0b21pY19yZWFkKCZsZWFzdC0+d2VpZ2h0KSkgeworCQkJbGVhc3QgPSBkZXN0OworCQkJbG9oID0gZG9oOworCQl9CisJfQorCisJSVBfVlNfREJHKDYsICJTRUQ6IHNlcnZlciAldS4ldS4ldS4ldToldSAiCisJCSAgImFjdGl2ZWNvbm5zICVkIHJlZmNudCAlZCB3ZWlnaHQgJWQgb3ZlcmhlYWQgJWRcbiIsCisJCSAgTklQUVVBRChsZWFzdC0+YWRkciksIG50b2hzKGxlYXN0LT5wb3J0KSwKKwkJICBhdG9taWNfcmVhZCgmbGVhc3QtPmFjdGl2ZWNvbm5zKSwKKwkJICBhdG9taWNfcmVhZCgmbGVhc3QtPnJlZmNudCksCisJCSAgYXRvbWljX3JlYWQoJmxlYXN0LT53ZWlnaHQpLCBsb2gpOworCisJcmV0dXJuIGxlYXN0OworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfc2NoZWR1bGVyIGlwX3ZzX3NlZF9zY2hlZHVsZXIgPQoreworCS5uYW1lID0JCQkic2VkIiwKKwkucmVmY250ID0JCUFUT01JQ19JTklUKDApLAorCS5tb2R1bGUgPQkJVEhJU19NT0RVTEUsCisJLmluaXRfc2VydmljZSA9CQlpcF92c19zZWRfaW5pdF9zdmMsCisJLmRvbmVfc2VydmljZSA9CQlpcF92c19zZWRfZG9uZV9zdmMsCisJLnVwZGF0ZV9zZXJ2aWNlID0JaXBfdnNfc2VkX3VwZGF0ZV9zdmMsCisJLnNjaGVkdWxlID0JCWlwX3ZzX3NlZF9zY2hlZHVsZSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgaXBfdnNfc2VkX2luaXQodm9pZCkKK3sKKwlJTklUX0xJU1RfSEVBRCgmaXBfdnNfc2VkX3NjaGVkdWxlci5uX2xpc3QpOworCXJldHVybiByZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoJmlwX3ZzX3NlZF9zY2hlZHVsZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXBfdnNfc2VkX2NsZWFudXAodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2lwX3ZzX3NjaGVkdWxlcigmaXBfdnNfc2VkX3NjaGVkdWxlcik7Cit9CisKK21vZHVsZV9pbml0KGlwX3ZzX3NlZF9pbml0KTsKK21vZHVsZV9leGl0KGlwX3ZzX3NlZF9jbGVhbnVwKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfc2guYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjdjNTBlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c19zaC5jCkBAIC0wLDAgKzEsMjU1IEBACisvKgorICogSVBWUzogICAgICAgIFNvdXJjZSBIYXNoaW5nIHNjaGVkdWxpbmcgbW9kdWxlCisgKgorICogVmVyc2lvbjogICAgICRJZDogaXBfdnNfc2guYyx2IDEuNSAyMDAyLzA5LzE1IDA4OjE0OjA4IHdlbnNvbmcgRXhwICQKKyAqCisgKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BnbnVjaGluYS5vcmc+CisgKgorICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQ2hhbmdlczoKKyAqCisgKi8KKworLyoKKyAqIFRoZSBzaCBhbGdvcml0aG0gaXMgdG8gc2VsZWN0IHNlcnZlciBieSB0aGUgaGFzaCBrZXkgb2Ygc291cmNlIElQCisgKiBhZGRyZXNzLiBUaGUgcHNldWRvIGNvZGUgaXMgYXMgZm9sbG93czoKKyAqCisgKiAgICAgICBuIDwtIHNlcnZlcm5vZGVbc3JjX2lwXTsKKyAqICAgICAgIGlmIChuIGlzIGRlYWQpIE9SCisgKiAgICAgICAgICAobiBpcyBvdmVybG9hZGVkKSBvciAobi53ZWlnaHQgPD0gMCkgdGhlbgorICogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICoKKyAqICAgICAgIHJldHVybiBuOworICoKKyAqIE5vdGVzIHRoYXQgc2VydmVybm9kZSBpcyBhIDI1Ni1idWNrZXQgaGFzaCB0YWJsZSB0aGF0IG1hcHMgdGhlIGhhc2gKKyAqIGluZGV4IGRlcml2ZWQgZnJvbSBwYWNrZXQgc291cmNlIElQIGFkZHJlc3MgdG8gdGhlIGN1cnJlbnQgc2VydmVyCisgKiBhcnJheS4gSWYgdGhlIHNoIHNjaGVkdWxlciBpcyB1c2VkIGluIGNhY2hlIGNsdXN0ZXIsIGl0IGlzIGdvb2QgdG8KKyAqIGNvbWJpbmUgaXQgd2l0aCBjYWNoZV9ieXBhc3MgZmVhdHVyZS4gV2hlbiB0aGUgc3RhdGljYWxseSBhc3NpZ25lZAorICogc2VydmVyIGlzIGRlYWQgb3Igb3ZlcmxvYWRlZCwgdGhlIGxvYWQgYmFsYW5jZXIgY2FuIGJ5cGFzcyB0aGUgY2FjaGUKKyAqIHNlcnZlciBhbmQgc2VuZCByZXF1ZXN0cyB0byB0aGUgb3JpZ2luYWwgc2VydmVyIGRpcmVjdGx5LgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxuZXQvaXBfdnMuaD4KKworCisvKgorICogICAgICBJUFZTIFNIIGJ1Y2tldAorICovCitzdHJ1Y3QgaXBfdnNfc2hfYnVja2V0IHsKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAgICAgICAqZGVzdDsgICAgICAgICAgLyogcmVhbCBzZXJ2ZXIgKGNhY2hlKSAqLworfTsKKworLyoKKyAqICAgICBmb3IgSVBWUyBTSCBlbnRyeSBoYXNoIHRhYmxlCisgKi8KKyNpZm5kZWYgQ09ORklHX0lQX1ZTX1NIX1RBQl9CSVRTCisjZGVmaW5lIENPTkZJR19JUF9WU19TSF9UQUJfQklUUyAgICAgICAgOAorI2VuZGlmCisjZGVmaW5lIElQX1ZTX1NIX1RBQl9CSVRTICAgICAgICAgICAgICAgQ09ORklHX0lQX1ZTX1NIX1RBQl9CSVRTCisjZGVmaW5lIElQX1ZTX1NIX1RBQl9TSVpFICAgICAgICAgICAgICAgKDEgPDwgSVBfVlNfU0hfVEFCX0JJVFMpCisjZGVmaW5lIElQX1ZTX1NIX1RBQl9NQVNLICAgICAgICAgICAgICAgKElQX1ZTX1NIX1RBQl9TSVpFIC0gMSkKKworCisvKgorICoJUmV0dXJucyBoYXNoIHZhbHVlIGZvciBJUFZTIFNIIGVudHJ5CisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaXBfdnNfc2hfaGFzaGtleShfX3UzMiBhZGRyKQoreworCXJldHVybiAobnRvaGwoYWRkcikqMjY1NDQzNTc2MVVMKSAmIElQX1ZTX1NIX1RBQl9NQVNLOworfQorCisKKy8qCisgKiAgICAgIEdldCBpcF92c19kZXN0IGFzc29jaWF0ZWQgd2l0aCBzdXBwbGllZCBwYXJhbWV0ZXJzLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpcF92c19kZXN0ICoKK2lwX3ZzX3NoX2dldChzdHJ1Y3QgaXBfdnNfc2hfYnVja2V0ICp0YmwsIF9fdTMyIGFkZHIpCit7CisJcmV0dXJuICh0YmxbaXBfdnNfc2hfaGFzaGtleShhZGRyKV0pLmRlc3Q7Cit9CisKKworLyoKKyAqICAgICAgQXNzaWduIGFsbCB0aGUgaGFzaCBidWNrZXRzIG9mIHRoZSBzcGVjaWZpZWQgdGFibGUgd2l0aCB0aGUgc2VydmljZS4KKyAqLworc3RhdGljIGludAoraXBfdnNfc2hfYXNzaWduKHN0cnVjdCBpcF92c19zaF9idWNrZXQgKnRibCwgc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaXBfdnNfc2hfYnVja2V0ICpiOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3Q7CisKKwliID0gdGJsOworCXAgPSAmc3ZjLT5kZXN0aW5hdGlvbnM7CisJZm9yIChpPTA7IGk8SVBfVlNfU0hfVEFCX1NJWkU7IGkrKykgeworCQlpZiAobGlzdF9lbXB0eShwKSkgeworCQkJYi0+ZGVzdCA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlpZiAocCA9PSAmc3ZjLT5kZXN0aW5hdGlvbnMpCisJCQkJcCA9IHAtPm5leHQ7CisKKwkJCWRlc3QgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBpcF92c19kZXN0LCBuX2xpc3QpOworCQkJYXRvbWljX2luYygmZGVzdC0+cmVmY250KTsKKwkJCWItPmRlc3QgPSBkZXN0OworCisJCQlwID0gcC0+bmV4dDsKKwkJfQorCQliKys7CisJfQorCXJldHVybiAwOworfQorCisKKy8qCisgKiAgICAgIEZsdXNoIGFsbCB0aGUgaGFzaCBidWNrZXRzIG9mIHRoZSBzcGVjaWZpZWQgdGFibGUuCisgKi8KK3N0YXRpYyB2b2lkIGlwX3ZzX3NoX2ZsdXNoKHN0cnVjdCBpcF92c19zaF9idWNrZXQgKnRibCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaXBfdnNfc2hfYnVja2V0ICpiOworCisJYiA9IHRibDsKKwlmb3IgKGk9MDsgaTxJUF9WU19TSF9UQUJfU0laRTsgaSsrKSB7CisJCWlmIChiLT5kZXN0KSB7CisJCQlhdG9taWNfZGVjKCZiLT5kZXN0LT5yZWZjbnQpOworCQkJYi0+ZGVzdCA9IE5VTEw7CisJCX0KKwkJYisrOworCX0KK30KKworCitzdGF0aWMgaW50IGlwX3ZzX3NoX2luaXRfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCit7CisJc3RydWN0IGlwX3ZzX3NoX2J1Y2tldCAqdGJsOworCisJLyogYWxsb2NhdGUgdGhlIFNIIHRhYmxlIGZvciB0aGlzIHNlcnZpY2UgKi8KKwl0YmwgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXBfdnNfc2hfYnVja2V0KSpJUF9WU19TSF9UQUJfU0laRSwKKwkJICAgICAgR0ZQX0FUT01JQyk7CisJaWYgKHRibCA9PSBOVUxMKSB7CisJCUlQX1ZTX0VSUigiaXBfdnNfc2hfaW5pdF9zdmMoKTogbm8gbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXN2Yy0+c2NoZWRfZGF0YSA9IHRibDsKKwlJUF9WU19EQkcoNiwgIlNIIGhhc2ggdGFibGUgKG1lbW9yeT0lWmRieXRlcykgYWxsb2NhdGVkIGZvciAiCisJCSAgImN1cnJlbnQgc2VydmljZVxuIiwKKwkJICBzaXplb2Yoc3RydWN0IGlwX3ZzX3NoX2J1Y2tldCkqSVBfVlNfU0hfVEFCX1NJWkUpOworCisJLyogYXNzaWduIHRoZSBoYXNoIGJ1Y2tldHMgd2l0aCB0aGUgdXBkYXRlZCBzZXJ2aWNlICovCisJaXBfdnNfc2hfYXNzaWduKHRibCwgc3ZjKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaXBfdnNfc2hfZG9uZV9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlzdHJ1Y3QgaXBfdnNfc2hfYnVja2V0ICp0YmwgPSBzdmMtPnNjaGVkX2RhdGE7CisKKwkvKiBnb3QgdG8gY2xlYW4gdXAgaGFzaCBidWNrZXRzIGhlcmUgKi8KKwlpcF92c19zaF9mbHVzaCh0YmwpOworCisJLyogcmVsZWFzZSB0aGUgdGFibGUgaXRzZWxmICovCisJa2ZyZWUoc3ZjLT5zY2hlZF9kYXRhKTsKKwlJUF9WU19EQkcoNiwgIlNIIGhhc2ggdGFibGUgKG1lbW9yeT0lWmRieXRlcykgcmVsZWFzZWRcbiIsCisJCSAgc2l6ZW9mKHN0cnVjdCBpcF92c19zaF9idWNrZXQpKklQX1ZTX1NIX1RBQl9TSVpFKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaXBfdnNfc2hfdXBkYXRlX3N2YyhzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQoreworCXN0cnVjdCBpcF92c19zaF9idWNrZXQgKnRibCA9IHN2Yy0+c2NoZWRfZGF0YTsKKworCS8qIGdvdCB0byBjbGVhbiB1cCBoYXNoIGJ1Y2tldHMgaGVyZSAqLworCWlwX3ZzX3NoX2ZsdXNoKHRibCk7CisKKwkvKiBhc3NpZ24gdGhlIGhhc2ggYnVja2V0cyB3aXRoIHRoZSB1cGRhdGVkIHNlcnZpY2UgKi8KKwlpcF92c19zaF9hc3NpZ24odGJsLCBzdmMpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqICAgICAgSWYgdGhlIGRlc3QgZmxhZ3MgaXMgc2V0IHdpdGggSVBfVlNfREVTVF9GX09WRVJMT0FELAorICogICAgICBjb25zaWRlciB0aGF0IHRoZSBzZXJ2ZXIgaXMgb3ZlcmxvYWRlZCBoZXJlLgorICovCitzdGF0aWMgaW5saW5lIGludCBpc19vdmVybG9hZGVkKHN0cnVjdCBpcF92c19kZXN0ICpkZXN0KQoreworCXJldHVybiBkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9PVkVSTE9BRDsKK30KKworCisvKgorICogICAgICBTb3VyY2UgSGFzaGluZyBzY2hlZHVsaW5nCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfZGVzdCAqCitpcF92c19zaF9zY2hlZHVsZShzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0OworCXN0cnVjdCBpcF92c19zaF9idWNrZXQgKnRibDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCisJSVBfVlNfREJHKDYsICJpcF92c19zaF9zY2hlZHVsZSgpOiBTY2hlZHVsaW5nLi4uXG4iKTsKKworCXRibCA9IChzdHJ1Y3QgaXBfdnNfc2hfYnVja2V0ICopc3ZjLT5zY2hlZF9kYXRhOworCWRlc3QgPSBpcF92c19zaF9nZXQodGJsLCBpcGgtPnNhZGRyKTsKKwlpZiAoIWRlc3QKKwkgICAgfHwgIShkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9BVkFJTEFCTEUpCisJICAgIHx8IGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpIDw9IDAKKwkgICAgfHwgaXNfb3ZlcmxvYWRlZChkZXN0KSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlJUF9WU19EQkcoNiwgIlNIOiBzb3VyY2UgSVAgYWRkcmVzcyAldS4ldS4ldS4ldSAiCisJCSAgIi0tPiBzZXJ2ZXIgJXUuJXUuJXUuJXU6JWRcbiIsCisJCSAgTklQUVVBRChpcGgtPnNhZGRyKSwKKwkJICBOSVBRVUFEKGRlc3QtPmFkZHIpLAorCQkgIG50b2hzKGRlc3QtPnBvcnQpKTsKKworCXJldHVybiBkZXN0OworfQorCisKKy8qCisgKiAgICAgIElQVlMgU0ggU2NoZWR1bGVyIHN0cnVjdHVyZQorICovCitzdGF0aWMgc3RydWN0IGlwX3ZzX3NjaGVkdWxlciBpcF92c19zaF9zY2hlZHVsZXIgPQoreworCS5uYW1lID0JCQkic2giLAorCS5yZWZjbnQgPQkJQVRPTUlDX0lOSVQoMCksCisJLm1vZHVsZSA9CQlUSElTX01PRFVMRSwKKwkuaW5pdF9zZXJ2aWNlID0JCWlwX3ZzX3NoX2luaXRfc3ZjLAorCS5kb25lX3NlcnZpY2UgPQkJaXBfdnNfc2hfZG9uZV9zdmMsCisJLnVwZGF0ZV9zZXJ2aWNlID0JaXBfdnNfc2hfdXBkYXRlX3N2YywKKwkuc2NoZWR1bGUgPQkJaXBfdnNfc2hfc2NoZWR1bGUsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGlwX3ZzX3NoX2luaXQodm9pZCkKK3sKKwlJTklUX0xJU1RfSEVBRCgmaXBfdnNfc2hfc2NoZWR1bGVyLm5fbGlzdCk7CisJcmV0dXJuIHJlZ2lzdGVyX2lwX3ZzX3NjaGVkdWxlcigmaXBfdnNfc2hfc2NoZWR1bGVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgaXBfdnNfc2hfY2xlYW51cCh2b2lkKQoreworCXVucmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKCZpcF92c19zaF9zY2hlZHVsZXIpOworfQorCisKK21vZHVsZV9pbml0KGlwX3ZzX3NoX2luaXQpOworbW9kdWxlX2V4aXQoaXBfdnNfc2hfY2xlYW51cCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3N5bmMuYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YzQ3OTUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3N5bmMuYwpAQCAtMCwwICsxLDg5MiBAQAorLyoKKyAqIElQVlMgICAgICAgICBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSVAgdmlydHVhbCBzZXJ2ZXIgc3VwcG9ydCBmb3IgdGhlCisgKiAgICAgICAgICAgICAgTElOVVggb3BlcmF0aW5nIHN5c3RlbS4gIElQVlMgaXMgbm93IGltcGxlbWVudGVkIGFzIGEgbW9kdWxlCisgKiAgICAgICAgICAgICAgb3ZlciB0aGUgTmV0RmlsdGVyIGZyYW1ld29yay4gSVBWUyBjYW4gYmUgdXNlZCB0byBidWlsZCBhCisgKiAgICAgICAgICAgICAgaGlnaC1wZXJmb3JtYW5jZSBhbmQgaGlnaGx5IGF2YWlsYWJsZSBzZXJ2ZXIgYmFzZWQgb24gYQorICogICAgICAgICAgICAgIGNsdXN0ZXIgb2Ygc2VydmVycy4KKyAqCisgKiBWZXJzaW9uOiAgICAgJElkOiBpcF92c19zeW5jLmMsdiAxLjEzIDIwMDMvMDYvMDggMDk6MzE6MTkgd2Vuc29uZyBFeHAgJAorICoKKyAqIEF1dGhvcnM6ICAgICBXZW5zb25nIFpoYW5nIDx3ZW5zb25nQGxpbnV4dmlydHVhbHNlcnZlci5vcmc+CisgKgorICogaXBfdnNfc3luYzogIHN5bmMgY29ubmVjdGlvbiBpbmZvIGZyb20gbWFzdGVyIGxvYWQgYmFsYW5jZXIgdG8gYmFja3VwcworICogICAgICAgICAgICAgIHRocm91Z2ggbXVsdGljYXN0CisgKgorICogQ2hhbmdlczoKKyAqCUFsZXhhbmRyZSBDYXNzZW4JOglBZGRlZCBtYXN0ZXIgJiBiYWNrdXAgc3VwcG9ydCBhdCBhIHRpbWUuCisgKglBbGV4YW5kcmUgQ2Fzc2VuCToJQWRkZWQgU3luY0lEIHN1cHBvcnQgZm9yIGluY29taW5nIHN5bmMKKyAqCQkJCQltZXNzYWdlcyBmaWx0ZXJpbmcuCisgKglKdXN0aW4gT3NzZXZvb3J0CToJRml4IGVuZGlhbiBwcm9ibGVtIG9uIHN5bmMgbWVzc2FnZSBzaXplLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pZ21wLmg+ICAgICAgICAgICAgICAgICAvKiBmb3IgaXBfbWNfam9pbl9ncm91cCAqLworCisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPiAgICAgICAgICAgICAgICAvKiBmb3IgZ2V0X2ZzIGFuZCBzZXRfZnMgKi8KKworI2luY2x1ZGUgPG5ldC9pcF92cy5oPgorCisjZGVmaW5lIElQX1ZTX1NZTkNfR1JPVVAgMHhlMDAwMDA1MSAgICAvKiBtdWx0aWNhc3QgYWRkciAtIDIyNC4wLjAuODEgKi8KKyNkZWZpbmUgSVBfVlNfU1lOQ19QT1JUICA4ODQ4ICAgICAgICAgIC8qIG11bHRpY2FzdCBwb3J0ICovCisKKworLyoKKyAqCUlQVlMgc3luYyBjb25uZWN0aW9uIGVudHJ5CisgKi8KK3N0cnVjdCBpcF92c19zeW5jX2Nvbm4geworCV9fdTgJCQlyZXNlcnZlZDsKKworCS8qIFByb3RvY29sLCBhZGRyZXNzZXMgYW5kIHBvcnQgbnVtYmVycyAqLworCV9fdTgJCQlwcm90b2NvbDsgICAgICAgLyogV2hpY2ggcHJvdG9jb2wgKFRDUC9VRFApICovCisJX191MTYJCQljcG9ydDsKKwlfX3UxNiAgICAgICAgICAgICAgICAgICB2cG9ydDsKKwlfX3UxNiAgICAgICAgICAgICAgICAgICBkcG9ydDsKKwlfX3UzMiAgICAgICAgICAgICAgICAgICBjYWRkcjsgICAgICAgICAgLyogY2xpZW50IGFkZHJlc3MgKi8KKwlfX3UzMiAgICAgICAgICAgICAgICAgICB2YWRkcjsgICAgICAgICAgLyogdmlydHVhbCBhZGRyZXNzICovCisJX191MzIgICAgICAgICAgICAgICAgICAgZGFkZHI7ICAgICAgICAgIC8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKworCS8qIEZsYWdzIGFuZCBzdGF0ZSB0cmFuc2l0aW9uICovCisJX191MTYgICAgICAgICAgICAgICAgICAgZmxhZ3M7ICAgICAgICAgIC8qIHN0YXR1cyBmbGFncyAqLworCV9fdTE2ICAgICAgICAgICAgICAgICAgIHN0YXRlOyAgICAgICAgICAvKiBzdGF0ZSBpbmZvICovCisKKwkvKiBUaGUgc2VxdWVuY2Ugb3B0aW9ucyBzdGFydCBoZXJlICovCit9OworCitzdHJ1Y3QgaXBfdnNfc3luY19jb25uX29wdGlvbnMgeworCXN0cnVjdCBpcF92c19zZXEgICAgICAgIGluX3NlcTsgICAgICAgICAvKiBpbmNvbWluZyBzZXEuIHN0cnVjdCAqLworCXN0cnVjdCBpcF92c19zZXEgICAgICAgIG91dF9zZXE7ICAgICAgICAvKiBvdXRnb2luZyBzZXEuIHN0cnVjdCAqLworfTsKKworI2RlZmluZSBJUF9WU19TWU5DX0NPTk5fVElNRU9VVCAoMyo2MCpIWikKKyNkZWZpbmUgU0lNUExFX0NPTk5fU0laRSAgKHNpemVvZihzdHJ1Y3QgaXBfdnNfc3luY19jb25uKSkKKyNkZWZpbmUgRlVMTF9DT05OX1NJWkUgIFwKKyhzaXplb2Yoc3RydWN0IGlwX3ZzX3N5bmNfY29ubikgKyBzaXplb2Yoc3RydWN0IGlwX3ZzX3N5bmNfY29ubl9vcHRpb25zKSkKKworCisvKgorICBUaGUgbWFzdGVyIG11bGl0Y2FzdHMgbWVzc2FnZXMgdG8gdGhlIGJhY2t1cCBsb2FkIGJhbGFuY2VycyBpbiB0aGUKKyAgZm9sbG93aW5nIGZvcm1hdC4KKworICAgICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICB8ICBDb3VudCBDb25ucyAgfCAgICBTeW5jSUQgICAgIHwgICAgICAgICAgICBTaXplICAgICAgICAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICB8ICAgICAgICAgICAgICAgICAgICBJUFZTIFN5bmMgQ29ubmVjdGlvbiAoMSkgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgSVBWUyBTeW5jIENvbm5lY3Rpb24gKG4pICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisqLworCisjZGVmaW5lIFNZTkNfTUVTR19IRUFERVJfTEVOCTQKKworc3RydWN0IGlwX3ZzX3N5bmNfbWVzZyB7CisJX191OCAgICAgICAgICAgICAgICAgICAgbnJfY29ubnM7CisJX191OCAgICAgICAgICAgICAgICAgICAgc3luY2lkOworCV9fdTE2ICAgICAgICAgICAgICAgICAgIHNpemU7CisKKwkvKiBpcF92c19zeW5jX2Nvbm4gZW50cmllcyBzdGFydCBoZXJlICovCit9OworCisvKiB0aGUgbWF4aW11bSBsZW5ndGggb2Ygc3luYyAoc2VuZGluZy9yZWNlaXZpbmcpIG1lc3NhZ2UgKi8KK3N0YXRpYyBpbnQgc3luY19zZW5kX21lc2dfbWF4bGVuOworc3RhdGljIGludCBzeW5jX3JlY3ZfbWVzZ19tYXhsZW47CisKK3N0cnVjdCBpcF92c19zeW5jX2J1ZmYgeworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgIGxpc3Q7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgZmlyc3R1c2U7CisKKwkvKiBwb2ludGVycyBmb3IgdGhlIG1lc3NhZ2UgZGF0YSAqLworCXN0cnVjdCBpcF92c19zeW5jX21lc2cgICptZXNnOworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgICpoZWFkOworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgICplbmQ7Cit9OworCisKKy8qIHRoZSBzeW5jX2J1ZmYgbGlzdCBoZWFkIGFuZCB0aGUgbG9jayAqLworc3RhdGljIExJU1RfSEVBRChpcF92c19zeW5jX3F1ZXVlKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXBfdnNfc3luY19sb2NrKTsKKworLyogY3VycmVudCBzeW5jX2J1ZmYgZm9yIGFjY2VwdGluZyBuZXcgY29ubiBlbnRyaWVzICovCitzdGF0aWMgc3RydWN0IGlwX3ZzX3N5bmNfYnVmZiAgICpjdXJyX3NiID0gTlVMTDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY3Vycl9zYl9sb2NrKTsKKworLyogaXB2cyBzeW5jIGRhZW1vbiBzdGF0ZSAqLwordm9sYXRpbGUgaW50IGlwX3ZzX3N5bmNfc3RhdGUgPSBJUF9WU19TVEFURV9OT05FOwordm9sYXRpbGUgaW50IGlwX3ZzX21hc3Rlcl9zeW5jaWQgPSAwOwordm9sYXRpbGUgaW50IGlwX3ZzX2JhY2t1cF9zeW5jaWQgPSAwOworCisvKiBtdWx0aWNhc3QgaW50ZXJmYWNlIG5hbWUgKi8KK2NoYXIgaXBfdnNfbWFzdGVyX21jYXN0X2lmbltJUF9WU19JRk5BTUVfTUFYTEVOXTsKK2NoYXIgaXBfdnNfYmFja3VwX21jYXN0X2lmbltJUF9WU19JRk5BTUVfTUFYTEVOXTsKKworLyogbXVsdGljYXN0IGFkZHIgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ja2FkZHJfaW4gbWNhc3RfYWRkcjsKKworCitzdGF0aWMgaW5saW5lIHZvaWQgc2JfcXVldWVfdGFpbChzdHJ1Y3QgaXBfdnNfc3luY19idWZmICpzYikKK3sKKwlzcGluX2xvY2soJmlwX3ZzX3N5bmNfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmc2ItPmxpc3QsICZpcF92c19zeW5jX3F1ZXVlKTsKKwlzcGluX3VubG9jaygmaXBfdnNfc3luY19sb2NrKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfdnNfc3luY19idWZmICogc2JfZGVxdWV1ZSh2b2lkKQoreworCXN0cnVjdCBpcF92c19zeW5jX2J1ZmYgKnNiOworCisJc3Bpbl9sb2NrX2JoKCZpcF92c19zeW5jX2xvY2spOworCWlmIChsaXN0X2VtcHR5KCZpcF92c19zeW5jX3F1ZXVlKSkgeworCQlzYiA9IE5VTEw7CisJfSBlbHNlIHsKKwkJc2IgPSBsaXN0X2VudHJ5KGlwX3ZzX3N5bmNfcXVldWUubmV4dCwKKwkJCQlzdHJ1Y3QgaXBfdnNfc3luY19idWZmLAorCQkJCWxpc3QpOworCQlsaXN0X2RlbCgmc2ItPmxpc3QpOworCX0KKwlzcGluX3VubG9ja19iaCgmaXBfdnNfc3luY19sb2NrKTsKKworCXJldHVybiBzYjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfdnNfc3luY19idWZmICogaXBfdnNfc3luY19idWZmX2NyZWF0ZSh2b2lkKQoreworCXN0cnVjdCBpcF92c19zeW5jX2J1ZmYgKnNiOworCisJaWYgKCEoc2I9a21hbGxvYyhzaXplb2Yoc3RydWN0IGlwX3ZzX3N5bmNfYnVmZiksIEdGUF9BVE9NSUMpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIShzYi0+bWVzZz1rbWFsbG9jKHN5bmNfc2VuZF9tZXNnX21heGxlbiwgR0ZQX0FUT01JQykpKSB7CisJCWtmcmVlKHNiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXNiLT5tZXNnLT5ucl9jb25ucyA9IDA7CisJc2ItPm1lc2ctPnN5bmNpZCA9IGlwX3ZzX21hc3Rlcl9zeW5jaWQ7CisJc2ItPm1lc2ctPnNpemUgPSA0OworCXNiLT5oZWFkID0gKHVuc2lnbmVkIGNoYXIgKilzYi0+bWVzZyArIDQ7CisJc2ItPmVuZCA9ICh1bnNpZ25lZCBjaGFyICopc2ItPm1lc2cgKyBzeW5jX3NlbmRfbWVzZ19tYXhsZW47CisJc2ItPmZpcnN0dXNlID0gamlmZmllczsKKwlyZXR1cm4gc2I7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcF92c19zeW5jX2J1ZmZfcmVsZWFzZShzdHJ1Y3QgaXBfdnNfc3luY19idWZmICpzYikKK3sKKwlrZnJlZShzYi0+bWVzZyk7CisJa2ZyZWUoc2IpOworfQorCisvKgorICoJR2V0IHRoZSBjdXJyZW50IHN5bmMgYnVmZmVyIGlmIGl0IGhhcyBiZWVuIGNyZWF0ZWQgZm9yIG1vcmUKKyAqCXRoYW4gdGhlIHNwZWNpZmllZCB0aW1lIG9yIHRoZSBzcGVjaWZpZWQgdGltZSBpcyB6ZXJvLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpcF92c19zeW5jX2J1ZmYgKgorZ2V0X2N1cnJfc3luY19idWZmKHVuc2lnbmVkIGxvbmcgdGltZSkKK3sKKwlzdHJ1Y3QgaXBfdnNfc3luY19idWZmICpzYjsKKworCXNwaW5fbG9ja19iaCgmY3Vycl9zYl9sb2NrKTsKKwlpZiAoY3Vycl9zYiAmJiAodGltZSA9PSAwIHx8CisJCQl0aW1lX2JlZm9yZShqaWZmaWVzIC0gY3Vycl9zYi0+Zmlyc3R1c2UsIHRpbWUpKSkgeworCQlzYiA9IGN1cnJfc2I7CisJCWN1cnJfc2IgPSBOVUxMOworCX0gZWxzZQorCQlzYiA9IE5VTEw7CisJc3Bpbl91bmxvY2tfYmgoJmN1cnJfc2JfbG9jayk7CisJcmV0dXJuIHNiOworfQorCisKKy8qCisgKiAgICAgIEFkZCBhbiBpcF92c19jb25uIGluZm9ybWF0aW9uIGludG8gdGhlIGN1cnJlbnQgc3luY19idWZmLgorICogICAgICBDYWxsZWQgYnkgaXBfdnNfaW4uCisgKi8KK3ZvaWQgaXBfdnNfc3luY19jb25uKHN0cnVjdCBpcF92c19jb25uICpjcCkKK3sKKwlzdHJ1Y3QgaXBfdnNfc3luY19tZXNnICptOworCXN0cnVjdCBpcF92c19zeW5jX2Nvbm4gKnM7CisJaW50IGxlbjsKKworCXNwaW5fbG9jaygmY3Vycl9zYl9sb2NrKTsKKwlpZiAoIWN1cnJfc2IpIHsKKwkJaWYgKCEoY3Vycl9zYj1pcF92c19zeW5jX2J1ZmZfY3JlYXRlKCkpKSB7CisJCQlzcGluX3VubG9jaygmY3Vycl9zYl9sb2NrKTsKKwkJCUlQX1ZTX0VSUigiaXBfdnNfc3luY19idWZmX2NyZWF0ZSBmYWlsZWQuXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWxlbiA9IChjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfU0VRX01BU0spID8gRlVMTF9DT05OX1NJWkUgOgorCQlTSU1QTEVfQ09OTl9TSVpFOworCW0gPSBjdXJyX3NiLT5tZXNnOworCXMgPSAoc3RydWN0IGlwX3ZzX3N5bmNfY29ubiAqKWN1cnJfc2ItPmhlYWQ7CisKKwkvKiBjb3B5IG1lbWJlcnMgKi8KKwlzLT5wcm90b2NvbCA9IGNwLT5wcm90b2NvbDsKKwlzLT5jcG9ydCA9IGNwLT5jcG9ydDsKKwlzLT52cG9ydCA9IGNwLT52cG9ydDsKKwlzLT5kcG9ydCA9IGNwLT5kcG9ydDsKKwlzLT5jYWRkciA9IGNwLT5jYWRkcjsKKwlzLT52YWRkciA9IGNwLT52YWRkcjsKKwlzLT5kYWRkciA9IGNwLT5kYWRkcjsKKwlzLT5mbGFncyA9IGh0b25zKGNwLT5mbGFncyAmIH5JUF9WU19DT05OX0ZfSEFTSEVEKTsKKwlzLT5zdGF0ZSA9IGh0b25zKGNwLT5zdGF0ZSk7CisJaWYgKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9TRVFfTUFTSykgeworCQlzdHJ1Y3QgaXBfdnNfc3luY19jb25uX29wdGlvbnMgKm9wdCA9CisJCQkoc3RydWN0IGlwX3ZzX3N5bmNfY29ubl9vcHRpb25zICopJnNbMV07CisJCW1lbWNweShvcHQsICZjcC0+aW5fc2VxLCBzaXplb2YoKm9wdCkpOworCX0KKworCW0tPm5yX2Nvbm5zKys7CisJbS0+c2l6ZSArPSBsZW47CisJY3Vycl9zYi0+aGVhZCArPSBsZW47CisKKwkvKiBjaGVjayBpZiB0aGVyZSBpcyBhIHNwYWNlIGZvciBuZXh0IG9uZSAqLworCWlmIChjdXJyX3NiLT5oZWFkK0ZVTExfQ09OTl9TSVpFID4gY3Vycl9zYi0+ZW5kKSB7CisJCXNiX3F1ZXVlX3RhaWwoY3Vycl9zYik7CisJCWN1cnJfc2IgPSBOVUxMOworCX0KKwlzcGluX3VubG9jaygmY3Vycl9zYl9sb2NrKTsKKworCS8qIHN5bmNocm9uaXplIGl0cyBjb250cm9sbGVyIGlmIGl0IGhhcyAqLworCWlmIChjcC0+Y29udHJvbCkKKwkJaXBfdnNfc3luY19jb25uKGNwLT5jb250cm9sKTsKK30KKworCisvKgorICogICAgICBQcm9jZXNzIHJlY2VpdmVkIG11bHRpY2FzdCBtZXNzYWdlIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcKKyAqICAgICAgaXBfdnNfY29ubiBlbnRyaWVzLgorICovCitzdGF0aWMgdm9pZCBpcF92c19wcm9jZXNzX21lc3NhZ2UoY29uc3QgY2hhciAqYnVmZmVyLCBjb25zdCBzaXplX3QgYnVmbGVuKQoreworCXN0cnVjdCBpcF92c19zeW5jX21lc2cgKm0gPSAoc3RydWN0IGlwX3ZzX3N5bmNfbWVzZyAqKWJ1ZmZlcjsKKwlzdHJ1Y3QgaXBfdnNfc3luY19jb25uICpzOworCXN0cnVjdCBpcF92c19zeW5jX2Nvbm5fb3B0aW9ucyAqb3B0OworCXN0cnVjdCBpcF92c19jb25uICpjcDsKKwljaGFyICpwOworCWludCBpOworCisJLyogQ29udmVydCBzaXplIGJhY2sgdG8gaG9zdCBieXRlIG9yZGVyICovCisJbS0+c2l6ZSA9IG50b2hzKG0tPnNpemUpOworCisJaWYgKGJ1ZmxlbiAhPSBtLT5zaXplKSB7CisJCUlQX1ZTX0VSUigiYm9ndXMgbWVzc2FnZVxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBTeW5jSUQgc2FuaXR5IGNoZWNrICovCisJaWYgKGlwX3ZzX2JhY2t1cF9zeW5jaWQgIT0gMCAmJiBtLT5zeW5jaWQgIT0gaXBfdnNfYmFja3VwX3N5bmNpZCkgeworCQlJUF9WU19EQkcoNywgIklnbm9yaW5nIGluY29taW5nIG1zZyB3aXRoIHN5bmNpZCA9ICVkXG4iLAorCQkJICBtLT5zeW5jaWQpOworCQlyZXR1cm47CisJfQorCisJcCA9IChjaGFyICopYnVmZmVyICsgc2l6ZW9mKHN0cnVjdCBpcF92c19zeW5jX21lc2cpOworCWZvciAoaT0wOyBpPG0tPm5yX2Nvbm5zOyBpKyspIHsKKwkJcyA9IChzdHJ1Y3QgaXBfdnNfc3luY19jb25uICopcDsKKwkJY3AgPSBpcF92c19jb25uX2luX2dldChzLT5wcm90b2NvbCwKKwkJCQkgICAgICAgcy0+Y2FkZHIsIHMtPmNwb3J0LAorCQkJCSAgICAgICBzLT52YWRkciwgcy0+dnBvcnQpOworCQlpZiAoIWNwKSB7CisJCQljcCA9IGlwX3ZzX2Nvbm5fbmV3KHMtPnByb3RvY29sLAorCQkJCQkgICAgcy0+Y2FkZHIsIHMtPmNwb3J0LAorCQkJCQkgICAgcy0+dmFkZHIsIHMtPnZwb3J0LAorCQkJCQkgICAgcy0+ZGFkZHIsIHMtPmRwb3J0LAorCQkJCQkgICAgbnRvaHMocy0+ZmxhZ3MpLCBOVUxMKTsKKwkJCWlmICghY3ApIHsKKwkJCQlJUF9WU19FUlIoImlwX3ZzX2Nvbm5fbmV3IGZhaWxlZFxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCQkJY3AtPnN0YXRlID0gbnRvaHMocy0+c3RhdGUpOworCQl9IGVsc2UgaWYgKCFjcC0+ZGVzdCkgeworCQkJLyogaXQgaXMgYW4gZW50cnkgY3JlYXRlZCBieSB0aGUgc3luY2hyb25pemF0aW9uICovCisJCQljcC0+c3RhdGUgPSBudG9ocyhzLT5zdGF0ZSk7CisJCQljcC0+ZmxhZ3MgPSBudG9ocyhzLT5mbGFncykgfCBJUF9WU19DT05OX0ZfSEFTSEVEOworCQl9CS8qIE5vdGUgdGhhdCB3ZSBkb24ndCB0b3VjaCBpdHMgc3RhdGUgYW5kIGZsYWdzCisJCQkgICBpZiBpdCBpcyBhIG5vcm1hbCBlbnRyeS4gKi8KKworCQlpZiAobnRvaHMocy0+ZmxhZ3MpICYgSVBfVlNfQ09OTl9GX1NFUV9NQVNLKSB7CisJCQlvcHQgPSAoc3RydWN0IGlwX3ZzX3N5bmNfY29ubl9vcHRpb25zICopJnNbMV07CisJCQltZW1jcHkoJmNwLT5pbl9zZXEsIG9wdCwgc2l6ZW9mKCpvcHQpKTsKKwkJCXAgKz0gRlVMTF9DT05OX1NJWkU7CisJCX0gZWxzZQorCQkJcCArPSBTSU1QTEVfQ09OTl9TSVpFOworCisJCWF0b21pY19zZXQoJmNwLT5pbl9wa3RzLCBzeXNjdGxfaXBfdnNfc3luY190aHJlc2hvbGRbMF0pOworCQljcC0+dGltZW91dCA9IElQX1ZTX1NZTkNfQ09OTl9USU1FT1VUOworCQlpcF92c19jb25uX3B1dChjcCk7CisKKwkJaWYgKHAgPiBidWZmZXIrYnVmbGVuKSB7CisJCQlJUF9WU19FUlIoImJvZ3VzIG1lc3NhZ2VcbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorfQorCisKKy8qCisgKiAgICAgIFNldHVwIGxvb3BiYWNrIG9mIG91dGdvaW5nIG11bHRpY2FzdHMgb24gYSBzZW5kaW5nIHNvY2tldAorICovCitzdGF0aWMgdm9pZCBzZXRfbWNhc3RfbG9vcChzdHJ1Y3Qgc29jayAqc2ssIHVfY2hhciBsb29wKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKworCS8qIHNldHNvY2tvcHQoc29jaywgU09MX0lQLCBJUF9NVUxUSUNBU1RfTE9PUCwgJmxvb3AsIHNpemVvZihsb29wKSk7ICovCisJbG9ja19zb2NrKHNrKTsKKwlpbmV0LT5tY19sb29wID0gbG9vcCA/IDEgOiAwOworCXJlbGVhc2Vfc29jayhzayk7Cit9CisKKy8qCisgKiAgICAgIFNwZWNpZnkgVFRMIGZvciBvdXRnb2luZyBtdWx0aWNhc3RzIG9uIGEgc2VuZGluZyBzb2NrZXQKKyAqLworc3RhdGljIHZvaWQgc2V0X21jYXN0X3R0bChzdHJ1Y3Qgc29jayAqc2ssIHVfY2hhciB0dGwpCit7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCisJLyogc2V0c29ja29wdChzb2NrLCBTT0xfSVAsIElQX01VTFRJQ0FTVF9UVEwsICZ0dGwsIHNpemVvZih0dGwpKTsgKi8KKwlsb2NrX3NvY2soc2spOworCWluZXQtPm1jX3R0bCA9IHR0bDsKKwlyZWxlYXNlX3NvY2soc2spOworfQorCisvKgorICogICAgICBTcGVjaWZpeSBkZWZhdWx0IGludGVyZmFjZSBmb3Igb3V0Z29pbmcgbXVsdGljYXN0cworICovCitzdGF0aWMgaW50IHNldF9tY2FzdF9pZihzdHJ1Y3Qgc29jayAqc2ssIGNoYXIgKmlmbmFtZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKworCWlmICgoZGV2ID0gX19kZXZfZ2V0X2J5X25hbWUoaWZuYW1lKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoc2stPnNrX2JvdW5kX2Rldl9pZiAmJiBkZXYtPmlmaW5kZXggIT0gc2stPnNrX2JvdW5kX2Rldl9pZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsb2NrX3NvY2soc2spOworCWluZXQtPm1jX2luZGV4ID0gZGV2LT5pZmluZGV4OworCS8qICBpbmV0LT5tY19hZGRyICA9IDA7ICovCisJcmVsZWFzZV9zb2NrKHNrKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKglTZXQgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHN5bmMgbWVzc2FnZSBhY2NvcmRpbmcgdG8gdGhlCisgKglzcGVjaWZpZWQgaW50ZXJmYWNlJ3MgTVRVLgorICovCitzdGF0aWMgaW50IHNldF9zeW5jX21lc2dfbWF4bGVuKGludCBzeW5jX3N0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IG51bTsKKworCWlmIChzeW5jX3N0YXRlID09IElQX1ZTX1NUQVRFX01BU1RFUikgeworCQlpZiAoKGRldiA9IF9fZGV2X2dldF9ieV9uYW1lKGlwX3ZzX21hc3Rlcl9tY2FzdF9pZm4pKSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJbnVtID0gKGRldi0+bXR1IC0gc2l6ZW9mKHN0cnVjdCBpcGhkcikgLQorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpIC0KKwkJICAgICAgIFNZTkNfTUVTR19IRUFERVJfTEVOIC0gMjApIC8gU0lNUExFX0NPTk5fU0laRTsKKwkJc3luY19zZW5kX21lc2dfbWF4bGVuID0KKwkJCVNZTkNfTUVTR19IRUFERVJfTEVOICsgU0lNUExFX0NPTk5fU0laRSAqIG51bTsKKwkJSVBfVlNfREJHKDcsICJzZXR0aW5nIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBzeW5jIHNlbmRpbmcgIgorCQkJICAibWVzc2FnZSAlZC5cbiIsIHN5bmNfc2VuZF9tZXNnX21heGxlbik7CisJfSBlbHNlIGlmIChzeW5jX3N0YXRlID09IElQX1ZTX1NUQVRFX0JBQ0tVUCkgeworCQlpZiAoKGRldiA9IF9fZGV2X2dldF9ieV9uYW1lKGlwX3ZzX2JhY2t1cF9tY2FzdF9pZm4pKSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJc3luY19yZWN2X21lc2dfbWF4bGVuID0gZGV2LT5tdHUgLQorCQkJc2l6ZW9mKHN0cnVjdCBpcGhkcikgLSBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisJCUlQX1ZTX0RCRyg3LCAic2V0dGluZyB0aGUgbWF4aW11bSBsZW5ndGggb2Ygc3luYyByZWNlaXZpbmcgIgorCQkJICAibWVzc2FnZSAlZC5cbiIsIHN5bmNfcmVjdl9tZXNnX21heGxlbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqICAgICAgSm9pbiBhIG11bHRpY2FzdCBncm91cC4KKyAqICAgICAgdGhlIGdyb3VwIGlzIHNwZWNpZmllZCBieSBhIGNsYXNzIEQgbXVsdGljYXN0IGFkZHJlc3MgMjI0LjAuMC4wLzgKKyAqICAgICAgaW4gdGhlIGluX2FkZHIgc3RydWN0dXJlIHBhc3NlZCBpbiBhcyBhIHBhcmFtZXRlci4KKyAqLworc3RhdGljIGludAoram9pbl9tY2FzdF9ncm91cChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBpbl9hZGRyICphZGRyLCBjaGFyICppZm5hbWUpCit7CisJc3RydWN0IGlwX21yZXFuIG1yZXE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgcmV0OworCisJbWVtc2V0KCZtcmVxLCAwLCBzaXplb2YobXJlcSkpOworCW1lbWNweSgmbXJlcS5pbXJfbXVsdGlhZGRyLCBhZGRyLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKworCWlmICgoZGV2ID0gX19kZXZfZ2V0X2J5X25hbWUoaWZuYW1lKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKHNrLT5za19ib3VuZF9kZXZfaWYgJiYgZGV2LT5pZmluZGV4ICE9IHNrLT5za19ib3VuZF9kZXZfaWYpCisJCXJldHVybiAtRUlOVkFMOworCisJbXJlcS5pbXJfaWZpbmRleCA9IGRldi0+aWZpbmRleDsKKworCWxvY2tfc29jayhzayk7CisJcmV0ID0gaXBfbWNfam9pbl9ncm91cChzaywgJm1yZXEpOworCXJlbGVhc2Vfc29jayhzayk7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgYmluZF9tY2FzdGlmX2FkZHIoc3RydWN0IHNvY2tldCAqc29jaywgY2hhciAqaWZuYW1lKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdTMyIGFkZHI7CisJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKworCWlmICgoZGV2ID0gX19kZXZfZ2V0X2J5X25hbWUoaWZuYW1lKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlhZGRyID0gaW5ldF9zZWxlY3RfYWRkcihkZXYsIDAsIFJUX1NDT1BFX1VOSVZFUlNFKTsKKwlpZiAoIWFkZHIpCisJCUlQX1ZTX0VSUigiWW91IHByb2JhYmx5IG5lZWQgdG8gc3BlY2lmeSBJUCBhZGRyZXNzIG9uICIKKwkJCSAgIm11bHRpY2FzdCBpbnRlcmZhY2UuXG4iKTsKKworCUlQX1ZTX0RCRyg3LCAiYmluZGluZyBzb2NrZXQgd2l0aCAoJXMpICV1LiV1LiV1LiV1XG4iLAorCQkgIGlmbmFtZSwgTklQUVVBRChhZGRyKSk7CisKKwkvKiBOb3cgYmluZCB0aGUgc29ja2V0IHdpdGggdGhlIGFkZHJlc3Mgb2YgbXVsdGljYXN0IGludGVyZmFjZSAqLworCXNpbi5zaW5fZmFtaWx5CSAgICAgPSBBRl9JTkVUOworCXNpbi5zaW5fYWRkci5zX2FkZHIgID0gYWRkcjsKKwlzaW4uc2luX3BvcnQgICAgICAgICA9IDA7CisKKwlyZXR1cm4gc29jay0+b3BzLT5iaW5kKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIqKSZzaW4sIHNpemVvZihzaW4pKTsKK30KKworLyoKKyAqICAgICAgU2V0IHVwIHNlbmRpbmcgbXVsdGljYXN0IHNvY2tldCBvdmVyIFVEUAorICovCitzdGF0aWMgc3RydWN0IHNvY2tldCAqIG1ha2Vfc2VuZF9zb2NrKHZvaWQpCit7CisJc3RydWN0IHNvY2tldCAqc29jazsKKworCS8qIEZpcnN0IGNyZWF0ZSBhIHNvY2tldCAqLworCWlmIChzb2NrX2NyZWF0ZV9rZXJuKFBGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQLCAmc29jaykgPCAwKSB7CisJCUlQX1ZTX0VSUigiRXJyb3IgZHVyaW5nIGNyZWF0aW9uIG9mIHNvY2tldDsgdGVybWluYXRpbmdcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoc2V0X21jYXN0X2lmKHNvY2stPnNrLCBpcF92c19tYXN0ZXJfbWNhc3RfaWZuKSA8IDApIHsKKwkJSVBfVlNfRVJSKCJFcnJvciBzZXR0aW5nIG91dGJvdW5kIG1jYXN0IGludGVyZmFjZVxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJc2V0X21jYXN0X2xvb3Aoc29jay0+c2ssIDApOworCXNldF9tY2FzdF90dGwoc29jay0+c2ssIDEpOworCisJaWYgKGJpbmRfbWNhc3RpZl9hZGRyKHNvY2ssIGlwX3ZzX21hc3Rlcl9tY2FzdF9pZm4pIDwgMCkgeworCQlJUF9WU19FUlIoIkVycm9yIGJpbmRpbmcgYWRkcmVzcyBvZiB0aGUgbWNhc3QgaW50ZXJmYWNlXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoc29jay0+b3BzLT5jb25uZWN0KHNvY2ssCisJCQkgICAgICAgKHN0cnVjdCBzb2NrYWRkciopJm1jYXN0X2FkZHIsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkciksIDApIDwgMCkgeworCQlJUF9WU19FUlIoIkVycm9yIGNvbm5lY3RpbmcgdG8gdGhlIG11bHRpY2FzdCBhZGRyXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXR1cm4gc29jazsKKworICBlcnJvcjoKKwlzb2NrX3JlbGVhc2Uoc29jayk7CisJcmV0dXJuIE5VTEw7Cit9CisKKworLyoKKyAqICAgICAgU2V0IHVwIHJlY2VpdmluZyBtdWx0aWNhc3Qgc29ja2V0IG92ZXIgVURQCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ja2V0ICogbWFrZV9yZWNlaXZlX3NvY2sodm9pZCkKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCisJLyogRmlyc3QgY3JlYXRlIGEgc29ja2V0ICovCisJaWYgKHNvY2tfY3JlYXRlX2tlcm4oUEZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFAsICZzb2NrKSA8IDApIHsKKwkJSVBfVlNfRVJSKCJFcnJvciBkdXJpbmcgY3JlYXRpb24gb2Ygc29ja2V0OyB0ZXJtaW5hdGluZ1xuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIGl0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIFJFVVNFQUREUiBvcHRpb24gaW4gdXNlci1zcGFjZSAqLworCXNvY2stPnNrLT5za19yZXVzZSA9IDE7CisKKwlpZiAoc29jay0+b3BzLT5iaW5kKHNvY2ssCisJCQkgICAgKHN0cnVjdCBzb2NrYWRkciopJm1jYXN0X2FkZHIsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpIDwgMCkgeworCQlJUF9WU19FUlIoIkVycm9yIGJpbmRpbmcgdG8gdGhlIG11bHRpY2FzdCBhZGRyXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBqb2luIHRoZSBtdWx0aWNhc3QgZ3JvdXAgKi8KKwlpZiAoam9pbl9tY2FzdF9ncm91cChzb2NrLT5zaywKKwkJCSAgICAgKHN0cnVjdCBpbl9hZGRyKikmbWNhc3RfYWRkci5zaW5fYWRkciwKKwkJCSAgICAgaXBfdnNfYmFja3VwX21jYXN0X2lmbikgPCAwKSB7CisJCUlQX1ZTX0VSUigiRXJyb3Igam9pbmluZyB0byB0aGUgbXVsdGljYXN0IGdyb3VwXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXR1cm4gc29jazsKKworICBlcnJvcjoKKwlzb2NrX3JlbGVhc2Uoc29jayk7CisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIGludAoraXBfdnNfc2VuZF9hc3luYyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBjb25zdCBjaGFyICpidWZmZXIsIGNvbnN0IHNpemVfdCBsZW5ndGgpCit7CisJc3RydWN0IG1zZ2hkcgltc2cgPSB7Lm1zZ19mbGFncyA9IE1TR19ET05UV0FJVHxNU0dfTk9TSUdOQUx9OworCXN0cnVjdCBrdmVjCWlvdjsKKwlpbnQJCWxlbjsKKworCUVudGVyRnVuY3Rpb24oNyk7CisJaW92Lmlvdl9iYXNlICAgICA9ICh2b2lkICopYnVmZmVyOworCWlvdi5pb3ZfbGVuICAgICAgPSBsZW5ndGg7CisKKwlsZW4gPSBrZXJuZWxfc2VuZG1zZyhzb2NrLCAmbXNnLCAmaW92LCAxLCAoc2l6ZV90KShsZW5ndGgpKTsKKworCUxlYXZlRnVuY3Rpb24oNyk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHZvaWQKK2lwX3ZzX3NlbmRfc3luY19tc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IGlwX3ZzX3N5bmNfbWVzZyAqbXNnKQoreworCWludCBtc2l6ZTsKKworCW1zaXplID0gbXNnLT5zaXplOworCisJLyogUHV0IHNpemUgaW4gbmV0d29yayBieXRlIG9yZGVyICovCisJbXNnLT5zaXplID0gaHRvbnMobXNnLT5zaXplKTsKKworCWlmIChpcF92c19zZW5kX2FzeW5jKHNvY2ssIChjaGFyICopbXNnLCBtc2l6ZSkgIT0gbXNpemUpCisJCUlQX1ZTX0VSUigiaXBfdnNfc2VuZF9hc3luYyBlcnJvclxuIik7Cit9CisKK3N0YXRpYyBpbnQKK2lwX3ZzX3JlY2VpdmUoc3RydWN0IHNvY2tldCAqc29jaywgY2hhciAqYnVmZmVyLCBjb25zdCBzaXplX3QgYnVmbGVuKQoreworCXN0cnVjdCBtc2doZHIJCW1zZyA9IHtOVUxMLH07CisJc3RydWN0IGt2ZWMJCWlvdjsKKwlpbnQJCQlsZW47CisKKwlFbnRlckZ1bmN0aW9uKDcpOworCisJLyogUmVjZWl2ZSBhIHBhY2tldCAqLworCWlvdi5pb3ZfYmFzZSAgICAgPSBidWZmZXI7CisJaW92Lmlvdl9sZW4gICAgICA9IChzaXplX3QpYnVmbGVuOworCisJbGVuID0ga2VybmVsX3JlY3Ztc2coc29jaywgJm1zZywgJmlvdiwgMSwgYnVmbGVuLCAwKTsKKworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gLTE7CisKKwlMZWF2ZUZ1bmN0aW9uKDcpOworCXJldHVybiBsZW47Cit9CisKKworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHN5bmNfd2FpdCk7CitzdGF0aWMgcGlkX3Qgc3luY19tYXN0ZXJfcGlkID0gMDsKK3N0YXRpYyBwaWRfdCBzeW5jX2JhY2t1cF9waWQgPSAwOworCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoc3RvcF9zeW5jX3dhaXQpOworc3RhdGljIGludCBzdG9wX21hc3Rlcl9zeW5jID0gMDsKK3N0YXRpYyBpbnQgc3RvcF9iYWNrdXBfc3luYyA9IDA7CisKK3N0YXRpYyB2b2lkIHN5bmNfbWFzdGVyX2xvb3Aodm9pZCkKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCXN0cnVjdCBpcF92c19zeW5jX2J1ZmYgKnNiOworCisJLyogY3JlYXRlIHRoZSBzZW5kaW5nIG11bHRpY2FzdCBzb2NrZXQgKi8KKwlzb2NrID0gbWFrZV9zZW5kX3NvY2soKTsKKwlpZiAoIXNvY2spCisJCXJldHVybjsKKworCUlQX1ZTX0lORk8oInN5bmMgdGhyZWFkIHN0YXJ0ZWQ6IHN0YXRlID0gTUFTVEVSLCBtY2FzdF9pZm4gPSAlcywgIgorCQkgICAic3luY2lkID0gJWRcbiIsCisJCSAgIGlwX3ZzX21hc3Rlcl9tY2FzdF9pZm4sIGlwX3ZzX21hc3Rlcl9zeW5jaWQpOworCisJZm9yICg7OykgeworCQl3aGlsZSAoKHNiPXNiX2RlcXVldWUoKSkpIHsKKwkJCWlwX3ZzX3NlbmRfc3luY19tc2coc29jaywgc2ItPm1lc2cpOworCQkJaXBfdnNfc3luY19idWZmX3JlbGVhc2Uoc2IpOworCQl9CisKKwkJLyogY2hlY2sgaWYgZW50cmllcyBzdGF5IGluIGN1cnJfc2IgZm9yIDIgc2Vjb25kcyAqLworCQlpZiAoKHNiID0gZ2V0X2N1cnJfc3luY19idWZmKDIqSFopKSkgeworCQkJaXBfdnNfc2VuZF9zeW5jX21zZyhzb2NrLCBzYi0+bWVzZyk7CisJCQlpcF92c19zeW5jX2J1ZmZfcmVsZWFzZShzYik7CisJCX0KKworCQlpZiAoc3RvcF9tYXN0ZXJfc3luYykKKwkJCWJyZWFrOworCisJCXNzbGVlcCgxKTsKKwl9CisKKwkvKiBjbGVhbiB1cCB0aGUgc3luY19idWZmIHF1ZXVlICovCisJd2hpbGUgKChzYj1zYl9kZXF1ZXVlKCkpKSB7CisJCWlwX3ZzX3N5bmNfYnVmZl9yZWxlYXNlKHNiKTsKKwl9CisKKwkvKiBjbGVhbiB1cCB0aGUgY3VycmVudCBzeW5jX2J1ZmYgKi8KKwlpZiAoKHNiID0gZ2V0X2N1cnJfc3luY19idWZmKDApKSkgeworCQlpcF92c19zeW5jX2J1ZmZfcmVsZWFzZShzYik7CisJfQorCisJLyogcmVsZWFzZSB0aGUgc2VuZGluZyBtdWx0aWNhc3Qgc29ja2V0ICovCisJc29ja19yZWxlYXNlKHNvY2spOworfQorCisKK3N0YXRpYyB2b2lkIHN5bmNfYmFja3VwX2xvb3Aodm9pZCkKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCWNoYXIgKmJ1ZjsKKwlpbnQgbGVuOworCisJaWYgKCEoYnVmID0ga21hbGxvYyhzeW5jX3JlY3ZfbWVzZ19tYXhsZW4sIEdGUF9BVE9NSUMpKSkgeworCQlJUF9WU19FUlIoInN5bmNfYmFja3VwX2xvb3A6IGttYWxsb2MgZXJyb3JcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogY3JlYXRlIHRoZSByZWNlaXZpbmcgbXVsdGljYXN0IHNvY2tldCAqLworCXNvY2sgPSBtYWtlX3JlY2VpdmVfc29jaygpOworCWlmICghc29jaykKKwkJZ290byBvdXQ7CisKKwlJUF9WU19JTkZPKCJzeW5jIHRocmVhZCBzdGFydGVkOiBzdGF0ZSA9IEJBQ0tVUCwgbWNhc3RfaWZuID0gJXMsICIKKwkJICAgInN5bmNpZCA9ICVkXG4iLAorCQkgICBpcF92c19iYWNrdXBfbWNhc3RfaWZuLCBpcF92c19iYWNrdXBfc3luY2lkKTsKKworCWZvciAoOzspIHsKKwkJLyogZG8geW91IGhhdmUgZGF0YSBub3c/ICovCisJCXdoaWxlICghc2tiX3F1ZXVlX2VtcHR5KCYoc29jay0+c2stPnNrX3JlY2VpdmVfcXVldWUpKSkgeworCQkJaWYgKChsZW4gPQorCQkJICAgICBpcF92c19yZWNlaXZlKHNvY2ssIGJ1ZiwKKwkJCQkJICAgc3luY19yZWN2X21lc2dfbWF4bGVuKSkgPD0gMCkgeworCQkJCUlQX1ZTX0VSUigicmVjZWl2aW5nIG1lc3NhZ2UgZXJyb3JcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZGlzYWJsZSBib3R0b20gaGFsZiwgYmVjYXVzZSBpdCBhY2Nlc3NlZCB0aGUgZGF0YQorCQkJICAgc2hhcmVkIGJ5IHNvZnRpcnEgd2hpbGUgZ2V0dGluZy9jcmVhdGluZyBjb25ucyAqLworCQkJbG9jYWxfYmhfZGlzYWJsZSgpOworCQkJaXBfdnNfcHJvY2Vzc19tZXNzYWdlKGJ1ZiwgbGVuKTsKKwkJCWxvY2FsX2JoX2VuYWJsZSgpOworCQl9CisKKwkJaWYgKHN0b3BfYmFja3VwX3N5bmMpCisJCQlicmVhazsKKworCQlzc2xlZXAoMSk7CisJfQorCisJLyogcmVsZWFzZSB0aGUgc2VuZGluZyBtdWx0aWNhc3Qgc29ja2V0ICovCisJc29ja19yZWxlYXNlKHNvY2spOworCisgIG91dDoKKwlrZnJlZShidWYpOworfQorCisKK3N0YXRpYyB2b2lkIHNldF9zeW5jX3BpZChpbnQgc3luY19zdGF0ZSwgcGlkX3Qgc3luY19waWQpCit7CisJaWYgKHN5bmNfc3RhdGUgPT0gSVBfVlNfU1RBVEVfTUFTVEVSKQorCQlzeW5jX21hc3Rlcl9waWQgPSBzeW5jX3BpZDsKKwllbHNlIGlmIChzeW5jX3N0YXRlID09IElQX1ZTX1NUQVRFX0JBQ0tVUCkKKwkJc3luY19iYWNrdXBfcGlkID0gc3luY19waWQ7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9zdG9wX3N5bmMoaW50IHN5bmNfc3RhdGUsIGludCBzZXQpCit7CisJaWYgKHN5bmNfc3RhdGUgPT0gSVBfVlNfU1RBVEVfTUFTVEVSKQorCQlzdG9wX21hc3Rlcl9zeW5jID0gc2V0OworCWVsc2UgaWYgKHN5bmNfc3RhdGUgPT0gSVBfVlNfU1RBVEVfQkFDS1VQKQorCQlzdG9wX2JhY2t1cF9zeW5jID0gc2V0OworCWVsc2UgeworCQlzdG9wX21hc3Rlcl9zeW5jID0gc2V0OworCQlzdG9wX2JhY2t1cF9zeW5jID0gc2V0OworCX0KK30KKworc3RhdGljIGludCBzeW5jX3RocmVhZCh2b2lkICpzdGFydHVwKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCW1tX3NlZ21lbnRfdCBvbGRtbTsKKwlpbnQgc3RhdGU7CisJY29uc3QgY2hhciAqbmFtZTsKKworCS8qIGluY3JlYXNlIHRoZSBtb2R1bGUgdXNlIGNvdW50ICovCisJaXBfdnNfdXNlX2NvdW50X2luYygpOworCisJaWYgKGlwX3ZzX3N5bmNfc3RhdGUgJiBJUF9WU19TVEFURV9NQVNURVIgJiYgIXN5bmNfbWFzdGVyX3BpZCkgeworCQlzdGF0ZSA9IElQX1ZTX1NUQVRFX01BU1RFUjsKKwkJbmFtZSA9ICJpcHZzX3N5bmNtYXN0ZXIiOworCX0gZWxzZSBpZiAoaXBfdnNfc3luY19zdGF0ZSAmIElQX1ZTX1NUQVRFX0JBQ0tVUCAmJiAhc3luY19iYWNrdXBfcGlkKSB7CisJCXN0YXRlID0gSVBfVlNfU1RBVEVfQkFDS1VQOworCQluYW1lID0gImlwdnNfc3luY2JhY2t1cCI7CisJfSBlbHNlIHsKKwkJSVBfVlNfQlVHKCk7CisJCWlwX3ZzX3VzZV9jb3VudF9kZWMoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGFlbW9uaXplKG5hbWUpOworCisJb2xkbW0gPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKworCS8qIEJsb2NrIGFsbCBzaWduYWxzICovCisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJc2lnaW5pdHNldGludigmY3VycmVudC0+YmxvY2tlZCwgMCk7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCisJLyogc2V0IHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBzeW5jIG1lc3NhZ2UgKi8KKwlzZXRfc3luY19tZXNnX21heGxlbihzdGF0ZSk7CisKKwkvKiBzZXQgdXAgbXVsdGljYXN0IGFkZHJlc3MgKi8KKwltY2FzdF9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCW1jYXN0X2FkZHIuc2luX3BvcnQgPSBodG9ucyhJUF9WU19TWU5DX1BPUlQpOworCW1jYXN0X2FkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSVBfVlNfU1lOQ19HUk9VUCk7CisKKwlhZGRfd2FpdF9xdWV1ZSgmc3luY193YWl0LCAmd2FpdCk7CisKKwlzZXRfc3luY19waWQoc3RhdGUsIGN1cnJlbnQtPnBpZCk7CisJY29tcGxldGUoKHN0cnVjdCBjb21wbGV0aW9uICopc3RhcnR1cCk7CisKKwkvKiBwcm9jZXNzaW5nIG1hc3Rlci9iYWNrdXAgbG9vcCBoZXJlICovCisJaWYgKHN0YXRlID09IElQX1ZTX1NUQVRFX01BU1RFUikKKwkJc3luY19tYXN0ZXJfbG9vcCgpOworCWVsc2UgaWYgKHN0YXRlID09IElQX1ZTX1NUQVRFX0JBQ0tVUCkKKwkJc3luY19iYWNrdXBfbG9vcCgpOworCWVsc2UgSVBfVlNfQlVHKCk7CisKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmc3luY193YWl0LCAmd2FpdCk7CisKKwkvKiB0aHJlYWQgZXhpdHMgKi8KKwlzZXRfc3luY19waWQoc3RhdGUsIDApOworCUlQX1ZTX0lORk8oInN5bmMgdGhyZWFkIHN0b3BwZWQhXG4iKTsKKworCXNldF9mcyhvbGRtbSk7CisKKwkvKiBkZWNyZWFzZSB0aGUgbW9kdWxlIHVzZSBjb3VudCAqLworCWlwX3ZzX3VzZV9jb3VudF9kZWMoKTsKKworCXNldF9zdG9wX3N5bmMoc3RhdGUsIDApOworCXdha2VfdXAoJnN0b3Bfc3luY193YWl0KTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZm9ya19zeW5jX3RocmVhZCh2b2lkICpzdGFydHVwKQoreworCXBpZF90IHBpZDsKKworCS8qIGZvcmsgdGhlIHN5bmMgdGhyZWFkIGhlcmUsIHRoZW4gdGhlIHBhcmVudCBwcm9jZXNzIG9mIHRoZQorCSAgIHN5bmMgdGhyZWFkIGlzIHRoZSBpbml0IHByb2Nlc3MgYWZ0ZXIgdGhpcyB0aHJlYWQgZXhpdHMuICovCisgIHJlcGVhdDoKKwlpZiAoKHBpZCA9IGtlcm5lbF90aHJlYWQoc3luY190aHJlYWQsIHN0YXJ0dXAsIDApKSA8IDApIHsKKwkJSVBfVlNfRVJSKCJjb3VsZCBub3QgY3JlYXRlIHN5bmNfdGhyZWFkIGR1ZSB0byAlZC4uLiAiCisJCQkgICJyZXRyeWluZy5cbiIsIHBpZCk7CisJCXNzbGVlcCgxKTsKKwkJZ290byByZXBlYXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworaW50IHN0YXJ0X3N5bmNfdGhyZWFkKGludCBzdGF0ZSwgY2hhciAqbWNhc3RfaWZuLCBfX3U4IHN5bmNpZCkKK3sKKwlERUNMQVJFX0NPTVBMRVRJT04oc3RhcnR1cCk7CisJcGlkX3QgcGlkOworCisJaWYgKChzdGF0ZSA9PSBJUF9WU19TVEFURV9NQVNURVIgJiYgc3luY19tYXN0ZXJfcGlkKSB8fAorCSAgICAoc3RhdGUgPT0gSVBfVlNfU1RBVEVfQkFDS1VQICYmIHN5bmNfYmFja3VwX3BpZCkpCisJCXJldHVybiAtRUVYSVNUOworCisJSVBfVlNfREJHKDcsICIlczogcGlkICVkXG4iLCBfX0ZVTkNUSU9OX18sIGN1cnJlbnQtPnBpZCk7CisJSVBfVlNfREJHKDcsICJFYWNoIGlwX3ZzX3N5bmNfY29ubiBlbnRyeSBuZWVkICVaZCBieXRlc1xuIiwKKwkJICBzaXplb2Yoc3RydWN0IGlwX3ZzX3N5bmNfY29ubikpOworCisJaXBfdnNfc3luY19zdGF0ZSB8PSBzdGF0ZTsKKwlpZiAoc3RhdGUgPT0gSVBfVlNfU1RBVEVfTUFTVEVSKSB7CisJCXN0cmNweShpcF92c19tYXN0ZXJfbWNhc3RfaWZuLCBtY2FzdF9pZm4pOworCQlpcF92c19tYXN0ZXJfc3luY2lkID0gc3luY2lkOworCX0gZWxzZSB7CisJCXN0cmNweShpcF92c19iYWNrdXBfbWNhc3RfaWZuLCBtY2FzdF9pZm4pOworCQlpcF92c19iYWNrdXBfc3luY2lkID0gc3luY2lkOworCX0KKworICByZXBlYXQ6CisJaWYgKChwaWQgPSBrZXJuZWxfdGhyZWFkKGZvcmtfc3luY190aHJlYWQsICZzdGFydHVwLCAwKSkgPCAwKSB7CisJCUlQX1ZTX0VSUigiY291bGQgbm90IGNyZWF0ZSBmb3JrX3N5bmNfdGhyZWFkIGR1ZSB0byAlZC4uLiAiCisJCQkgICJyZXRyeWluZy5cbiIsIHBpZCk7CisJCXNzbGVlcCgxKTsKKwkJZ290byByZXBlYXQ7CisJfQorCisJd2FpdF9mb3JfY29tcGxldGlvbigmc3RhcnR1cCk7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgc3RvcF9zeW5jX3RocmVhZChpbnQgc3RhdGUpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlpZiAoKHN0YXRlID09IElQX1ZTX1NUQVRFX01BU1RFUiAmJiAhc3luY19tYXN0ZXJfcGlkKSB8fAorCSAgICAoc3RhdGUgPT0gSVBfVlNfU1RBVEVfQkFDS1VQICYmICFzeW5jX2JhY2t1cF9waWQpKQorCQlyZXR1cm4gLUVTUkNIOworCisJSVBfVlNfREJHKDcsICIlczogcGlkICVkXG4iLCBfX0ZVTkNUSU9OX18sIGN1cnJlbnQtPnBpZCk7CisJSVBfVlNfSU5GTygic3RvcHBpbmcgc3luYyB0aHJlYWQgJWQgLi4uXG4iLAorCQkgICAoc3RhdGUgPT0gSVBfVlNfU1RBVEVfTUFTVEVSKSA/IHN5bmNfbWFzdGVyX3BpZCA6IHN5bmNfYmFja3VwX3BpZCk7CisKKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlhZGRfd2FpdF9xdWV1ZSgmc3RvcF9zeW5jX3dhaXQsICZ3YWl0KTsKKwlzZXRfc3RvcF9zeW5jKHN0YXRlLCAxKTsKKwlpcF92c19zeW5jX3N0YXRlIC09IHN0YXRlOworCXdha2VfdXAoJnN5bmNfd2FpdCk7CisJc2NoZWR1bGUoKTsKKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnN0b3Bfc3luY193YWl0LCAmd2FpdCk7CisKKwkvKiBOb3RlOiBubyBuZWVkIHRvIHJlYXAgdGhlIHN5bmMgdGhyZWFkLCBiZWNhdXNlIGl0cyBwYXJlbnQKKwkgICBwcm9jZXNzIGlzIHRoZSBpbml0IHByb2Nlc3MgKi8KKworCWlmICgoc3RhdGUgPT0gSVBfVlNfU1RBVEVfTUFTVEVSICYmIHN0b3BfbWFzdGVyX3N5bmMpIHx8CisJICAgIChzdGF0ZSA9PSBJUF9WU19TVEFURV9CQUNLVVAgJiYgc3RvcF9iYWNrdXBfc3luYykpCisJCUlQX1ZTX0JVRygpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3dsYy5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c193bGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTlkOTEzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c193bGMuYwpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIElQVlM6ICAgICAgICBXZWlnaHRlZCBMZWFzdC1Db25uZWN0aW9uIFNjaGVkdWxpbmcgbW9kdWxlCisgKgorICogVmVyc2lvbjogICAgICRJZDogaXBfdnNfd2xjLmMsdiAxLjEzIDIwMDMvMDQvMTggMDk6MDM6MTYgd2Vuc29uZyBFeHAgJAorICoKKyAqIEF1dGhvcnM6ICAgICBXZW5zb25nIFpoYW5nIDx3ZW5zb25nQGxpbnV4dmlydHVhbHNlcnZlci5vcmc+CisgKiAgICAgICAgICAgICAgUGV0ZXIgS2VzZSA8cGV0ZXIua2VzZUBpanMuc2k+CisgKgorICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQ2hhbmdlczoKKyAqICAgICBXZW5zb25nIFpoYW5nICAgICAgICAgICAgOiAgICAgY2hhbmdlZCB0aGUgaXBfdnNfd2xjX3NjaGVkdWxlIHRvIHJldHVybiBkZXN0CisgKiAgICAgV2Vuc29uZyBaaGFuZyAgICAgICAgICAgIDogICAgIGNoYW5nZWQgdG8gdXNlIHRoZSBpbmFjdGNvbm5zIGluIHNjaGVkdWxpbmcKKyAqICAgICBXZW5zb25nIFpoYW5nICAgICAgICAgICAgOiAgICAgY2hhbmdlZCBzb21lIGNvbWVzdGljcyB0aGluZ3MgZm9yIGRlYnVnZ2luZworICogICAgIFdlbnNvbmcgWmhhbmcgICAgICAgICAgICA6ICAgICBjaGFuZ2VkIGZvciB0aGUgZC1saW5rZWQgZGVzdGluYXRpb24gbGlzdAorICogICAgIFdlbnNvbmcgWmhhbmcgICAgICAgICAgICA6ICAgICBhZGRlZCB0aGUgaXBfdnNfd2xjX3VwZGF0ZV9zdmMKKyAqICAgICBXZW5zb25nIFpoYW5nICAgICAgICAgICAgOiAgICAgYWRkZWQgYW55IGRlc3Qgd2l0aCB3ZWlnaHQ9MCBpcyBxdWllc2NlZAorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxuZXQvaXBfdnMuaD4KKworCitzdGF0aWMgaW50CitpcF92c193bGNfaW5pdF9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CitpcF92c193bGNfZG9uZV9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CitpcF92c193bGNfdXBkYXRlX3N2YyhzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQoreworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CitpcF92c193bGNfZGVzdF9vdmVyaGVhZChzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCkKK3sKKwkvKgorCSAqIFdlIHRoaW5rIHRoZSBvdmVyaGVhZCBvZiBwcm9jZXNzaW5nIGFjdGl2ZSBjb25uZWN0aW9ucyBpcyAyNTYKKwkgKiB0aW1lcyBoaWdoZXIgdGhhbiB0aGF0IG9mIGluYWN0aXZlIGNvbm5lY3Rpb25zIGluIGF2ZXJhZ2UuIChUaGlzCisJICogMjU2IHRpbWVzIG1pZ2h0IG5vdCBiZSBhY2N1cmF0ZSwgd2Ugd2lsbCBjaGFuZ2UgaXQgbGF0ZXIpIFdlCisJICogdXNlIHRoZSBmb2xsb3dpbmcgZm9ybXVsYSB0byBlc3RpbWF0ZSB0aGUgb3ZlcmhlYWQgbm93OgorCSAqCQkgIGRlc3QtPmFjdGl2ZWNvbm5zKjI1NiArIGRlc3QtPmluYWN0Y29ubnMKKwkgKi8KKwlyZXR1cm4gKGF0b21pY19yZWFkKCZkZXN0LT5hY3RpdmVjb25ucykgPDwgOCkgKworCQlhdG9taWNfcmVhZCgmZGVzdC0+aW5hY3Rjb25ucyk7Cit9CisKKworLyoKKyAqCVdlaWdodGVkIExlYXN0IENvbm5lY3Rpb24gc2NoZWR1bGluZworICovCitzdGF0aWMgc3RydWN0IGlwX3ZzX2Rlc3QgKgoraXBfdnNfd2xjX3NjaGVkdWxlKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QsICpsZWFzdDsKKwl1bnNpZ25lZCBpbnQgbG9oLCBkb2g7CisKKwlJUF9WU19EQkcoNiwgImlwX3ZzX3dsY19zY2hlZHVsZSgpOiBTY2hlZHVsaW5nLi4uXG4iKTsKKworCS8qCisJICogV2UgY2FsY3VsYXRlIHRoZSBsb2FkIG9mIGVhY2ggZGVzdCBzZXJ2ZXIgYXMgZm9sbG93czoKKwkgKgkJICAoZGVzdCBvdmVyaGVhZCkgLyBkZXN0LT53ZWlnaHQKKwkgKgorCSAqIFJlbWVtYmVyIC0tIG5vIGZsb2F0cyBpbiBrZXJuZWwgbW9kZSEhIQorCSAqIFRoZSBjb21wYXJpc29uIG9mIGgxKncyID4gaDIqdzEgaXMgZXF1aXZhbGVudCB0byB0aGF0IG9mCisJICoJCSAgaDEvdzEgPiBoMi93MgorCSAqIGlmIGV2ZXJ5IHdlaWdodCBpcyBsYXJnZXIgdGhhbiB6ZXJvLgorCSAqCisJICogVGhlIHNlcnZlciB3aXRoIHdlaWdodD0wIGlzIHF1aWVzY2VkIGFuZCB3aWxsIG5vdCByZWNlaXZlIGFueQorCSAqIG5ldyBjb25uZWN0aW9ucy4KKwkgKi8KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzdCwgJnN2Yy0+ZGVzdGluYXRpb25zLCBuX2xpc3QpIHsKKwkJaWYgKCEoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfT1ZFUkxPQUQpICYmCisJCSAgICBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KSA+IDApIHsKKwkJCWxlYXN0ID0gZGVzdDsKKwkJCWxvaCA9IGlwX3ZzX3dsY19kZXN0X292ZXJoZWFkKGxlYXN0KTsKKwkJCWdvdG8gbmV4dHN0YWdlOworCQl9CisJfQorCXJldHVybiBOVUxMOworCisJLyoKKwkgKiAgICBGaW5kIHRoZSBkZXN0aW5hdGlvbiB3aXRoIHRoZSBsZWFzdCBsb2FkLgorCSAqLworICBuZXh0c3RhZ2U6CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZShkZXN0LCAmc3ZjLT5kZXN0aW5hdGlvbnMsIG5fbGlzdCkgeworCQlpZiAoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfT1ZFUkxPQUQpCisJCQljb250aW51ZTsKKwkJZG9oID0gaXBfdnNfd2xjX2Rlc3Rfb3ZlcmhlYWQoZGVzdCk7CisJCWlmIChsb2ggKiBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KSA+CisJCSAgICBkb2ggKiBhdG9taWNfcmVhZCgmbGVhc3QtPndlaWdodCkpIHsKKwkJCWxlYXN0ID0gZGVzdDsKKwkJCWxvaCA9IGRvaDsKKwkJfQorCX0KKworCUlQX1ZTX0RCRyg2LCAiV0xDOiBzZXJ2ZXIgJXUuJXUuJXUuJXU6JXUgIgorCQkgICJhY3RpdmVjb25ucyAlZCByZWZjbnQgJWQgd2VpZ2h0ICVkIG92ZXJoZWFkICVkXG4iLAorCQkgIE5JUFFVQUQobGVhc3QtPmFkZHIpLCBudG9ocyhsZWFzdC0+cG9ydCksCisJCSAgYXRvbWljX3JlYWQoJmxlYXN0LT5hY3RpdmVjb25ucyksCisJCSAgYXRvbWljX3JlYWQoJmxlYXN0LT5yZWZjbnQpLAorCQkgIGF0b21pY19yZWFkKCZsZWFzdC0+d2VpZ2h0KSwgbG9oKTsKKworCXJldHVybiBsZWFzdDsKK30KKworCitzdGF0aWMgc3RydWN0IGlwX3ZzX3NjaGVkdWxlciBpcF92c193bGNfc2NoZWR1bGVyID0KK3sKKwkubmFtZSA9CQkJIndsYyIsCisJLnJlZmNudCA9CQlBVE9NSUNfSU5JVCgwKSwKKwkubW9kdWxlID0JCVRISVNfTU9EVUxFLAorCS5pbml0X3NlcnZpY2UgPQkJaXBfdnNfd2xjX2luaXRfc3ZjLAorCS5kb25lX3NlcnZpY2UgPQkJaXBfdnNfd2xjX2RvbmVfc3ZjLAorCS51cGRhdGVfc2VydmljZSA9CWlwX3ZzX3dsY191cGRhdGVfc3ZjLAorCS5zY2hlZHVsZSA9CQlpcF92c193bGNfc2NoZWR1bGUsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGlwX3ZzX3dsY19pbml0KHZvaWQpCit7CisJSU5JVF9MSVNUX0hFQUQoJmlwX3ZzX3dsY19zY2hlZHVsZXIubl9saXN0KTsKKwlyZXR1cm4gcmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKCZpcF92c193bGNfc2NoZWR1bGVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGlwX3ZzX3dsY19jbGVhbnVwKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoJmlwX3ZzX3dsY19zY2hlZHVsZXIpOworfQorCittb2R1bGVfaW5pdChpcF92c193bGNfaW5pdCk7Cittb2R1bGVfZXhpdChpcF92c193bGNfY2xlYW51cCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3dyci5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c193cnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDlmYTA0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c193cnIuYwpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIElQVlM6ICAgICAgICBXZWlnaHRlZCBSb3VuZC1Sb2JpbiBTY2hlZHVsaW5nIG1vZHVsZQorICoKKyAqIFZlcnNpb246ICAgICAkSWQ6IGlwX3ZzX3dyci5jLHYgMS4xMiAyMDAyLzA5LzE1IDA4OjE0OjA4IHdlbnNvbmcgRXhwICQKKyAqCisgKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENoYW5nZXM6CisgKiAgICAgV2Vuc29uZyBaaGFuZyAgICAgICAgICAgIDogICAgIGNoYW5nZWQgdGhlIGlwX3ZzX3dycl9zY2hlZHVsZSB0byByZXR1cm4gZGVzdAorICogICAgIFdlbnNvbmcgWmhhbmcgICAgICAgICAgICA6ICAgICBjaGFuZ2VkIHNvbWUgY29tZXN0aWNzIHRoaW5ncyBmb3IgZGVidWdnaW5nCisgKiAgICAgV2Vuc29uZyBaaGFuZyAgICAgICAgICAgIDogICAgIGNoYW5nZWQgZm9yIHRoZSBkLWxpbmtlZCBkZXN0aW5hdGlvbiBsaXN0CisgKiAgICAgV2Vuc29uZyBaaGFuZyAgICAgICAgICAgIDogICAgIGFkZGVkIHRoZSBpcF92c193cnJfdXBkYXRlX3N2YworICogICAgIEp1bGlhbiBBbmFzdGFzb3YgICAgICAgICA6ICAgICBmaXhlZCB0aGUgYnVnIG9mIHJldHVybmluZyBkZXN0aW5hdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHdlaWdodCAwIHdoZW4gYWxsIHdlaWdodHMgYXJlIHplcm8KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaW5jbHVkZSA8bmV0L2lwX3ZzLmg+CisKKy8qCisgKiBjdXJyZW50IGRlc3RpbmF0aW9uIHBvaW50ZXIgZm9yIHdlaWdodGVkIHJvdW5kLXJvYmluIHNjaGVkdWxpbmcKKyAqLworc3RydWN0IGlwX3ZzX3dycl9tYXJrIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpjbDsJLyogY3VycmVudCBsaXN0IGhlYWQgKi8KKwlpbnQgY3c7CQkJLyogY3VycmVudCB3ZWlnaHQgKi8KKwlpbnQgbXc7CQkJLyogbWF4aW11bSB3ZWlnaHQgKi8KKwlpbnQgZGk7CQkJLyogZGVjcmVhc2luZyBpbnRlcnZhbCAqLworfTsKKworCisvKgorICogICAgR2V0IHRoZSBnY2Qgb2Ygc2VydmVyIHdlaWdodHMKKyAqLworc3RhdGljIGludCBnY2QoaW50IGEsIGludCBiKQoreworCWludCBjOworCisJd2hpbGUgKChjID0gYSAlIGIpKSB7CisJCWEgPSBiOworCQliID0gYzsKKwl9CisJcmV0dXJuIGI7Cit9CisKK3N0YXRpYyBpbnQgaXBfdnNfd3JyX2djZF93ZWlnaHQoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKKwlpbnQgd2VpZ2h0OworCWludCBnID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzdCwgJnN2Yy0+ZGVzdGluYXRpb25zLCBuX2xpc3QpIHsKKwkJd2VpZ2h0ID0gYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCk7CisJCWlmICh3ZWlnaHQgPiAwKSB7CisJCQlpZiAoZyA+IDApCisJCQkJZyA9IGdjZCh3ZWlnaHQsIGcpOworCQkJZWxzZQorCQkJCWcgPSB3ZWlnaHQ7CisJCX0KKwl9CisJcmV0dXJuIGcgPyBnIDogMTsKK30KKworCisvKgorICogICAgR2V0IHRoZSBtYXhpbXVtIHdlaWdodCBvZiB0aGUgc2VydmljZSBkZXN0aW5hdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQgaXBfdnNfd3JyX21heF93ZWlnaHQoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKKwlpbnQgd2VpZ2h0ID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzdCwgJnN2Yy0+ZGVzdGluYXRpb25zLCBuX2xpc3QpIHsKKwkJaWYgKGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpID4gd2VpZ2h0KQorCQkJd2VpZ2h0ID0gYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCk7CisJfQorCisJcmV0dXJuIHdlaWdodDsKK30KKworCitzdGF0aWMgaW50IGlwX3ZzX3dycl9pbml0X3N2YyhzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQoreworCXN0cnVjdCBpcF92c193cnJfbWFyayAqbWFyazsKKworCS8qCisJICogICAgQWxsb2NhdGUgdGhlIG1hcmsgdmFyaWFibGUgZm9yIFdSUiBzY2hlZHVsaW5nCisJICovCisJbWFyayA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcF92c193cnJfbWFyayksIEdGUF9BVE9NSUMpOworCWlmIChtYXJrID09IE5VTEwpIHsKKwkJSVBfVlNfRVJSKCJpcF92c193cnJfaW5pdF9zdmMoKTogbm8gbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1hcmstPmNsID0gJnN2Yy0+ZGVzdGluYXRpb25zOworCW1hcmstPmN3ID0gMDsKKwltYXJrLT5tdyA9IGlwX3ZzX3dycl9tYXhfd2VpZ2h0KHN2Yyk7CisJbWFyay0+ZGkgPSBpcF92c193cnJfZ2NkX3dlaWdodChzdmMpOworCXN2Yy0+c2NoZWRfZGF0YSA9IG1hcms7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGlwX3ZzX3dycl9kb25lX3N2YyhzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQoreworCS8qCisJICogICAgUmVsZWFzZSB0aGUgbWFyayB2YXJpYWJsZQorCSAqLworCWtmcmVlKHN2Yy0+c2NoZWRfZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGlwX3ZzX3dycl91cGRhdGVfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCit7CisJc3RydWN0IGlwX3ZzX3dycl9tYXJrICptYXJrID0gc3ZjLT5zY2hlZF9kYXRhOworCisJbWFyay0+Y2wgPSAmc3ZjLT5kZXN0aW5hdGlvbnM7CisJbWFyay0+bXcgPSBpcF92c193cnJfbWF4X3dlaWdodChzdmMpOworCW1hcmstPmRpID0gaXBfdnNfd3JyX2djZF93ZWlnaHQoc3ZjKTsKKwlpZiAobWFyay0+Y3cgPiBtYXJrLT5tdykKKwkJbWFyay0+Y3cgPSAwOworCXJldHVybiAwOworfQorCisKKy8qCisgKiAgICBXZWlnaHRlZCBSb3VuZC1Sb2JpbiBTY2hlZHVsaW5nCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfZGVzdCAqCitpcF92c193cnJfc2NoZWR1bGUoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKKwlzdHJ1Y3QgaXBfdnNfd3JyX21hcmsgKm1hcmsgPSBzdmMtPnNjaGVkX2RhdGE7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworCUlQX1ZTX0RCRyg2LCAiaXBfdnNfd3JyX3NjaGVkdWxlKCk6IFNjaGVkdWxpbmcuLi5cbiIpOworCisJLyoKKwkgKiBUaGlzIGxvb3Agd2lsbCBhbHdheXMgdGVybWluYXRlLCBiZWNhdXNlIG1hcmstPmN3IGluICgwLCBtYXhfd2VpZ2h0XQorCSAqIGFuZCBhdCBsZWFzdCBvbmUgc2VydmVyIGhhcyBpdHMgd2VpZ2h0IGVxdWFsIHRvIG1heF93ZWlnaHQuCisJICovCisJd3JpdGVfbG9jaygmc3ZjLT5zY2hlZF9sb2NrKTsKKwlwID0gbWFyay0+Y2w7CisJd2hpbGUgKDEpIHsKKwkJaWYgKG1hcmstPmNsID09ICZzdmMtPmRlc3RpbmF0aW9ucykgeworCQkJLyogaXQgaXMgYXQgdGhlIGhlYWQgb2YgdGhlIGRlc3RpbmF0aW9uIGxpc3QgKi8KKworCQkJaWYgKG1hcmstPmNsID09IG1hcmstPmNsLT5uZXh0KSB7CisJCQkJLyogbm8gZGVzdCBlbnRyeSAqLworCQkJCWRlc3QgPSBOVUxMOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQltYXJrLT5jbCA9IHN2Yy0+ZGVzdGluYXRpb25zLm5leHQ7CisJCQltYXJrLT5jdyAtPSBtYXJrLT5kaTsKKwkJCWlmIChtYXJrLT5jdyA8PSAwKSB7CisJCQkJbWFyay0+Y3cgPSBtYXJrLT5tdzsKKwkJCQkvKgorCQkJCSAqIFN0aWxsIHplcm8sIHdoaWNoIG1lYW5zIG5vIGF2YWlsYWJsZSBzZXJ2ZXJzLgorCQkJCSAqLworCQkJCWlmIChtYXJrLT5jdyA9PSAwKSB7CisJCQkJCW1hcmstPmNsID0gJnN2Yy0+ZGVzdGluYXRpb25zOworCQkJCQlJUF9WU19JTkZPKCJpcF92c193cnJfc2NoZWR1bGUoKTogIgorCQkJCQkJICAgIm5vIGF2YWlsYWJsZSBzZXJ2ZXJzXG4iKTsKKwkJCQkJZGVzdCA9IE5VTEw7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCX0KKwkJfSBlbHNlCisJCQltYXJrLT5jbCA9IG1hcmstPmNsLT5uZXh0OworCisJCWlmIChtYXJrLT5jbCAhPSAmc3ZjLT5kZXN0aW5hdGlvbnMpIHsKKwkJCS8qIG5vdCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCAqLworCQkJZGVzdCA9IGxpc3RfZW50cnkobWFyay0+Y2wsIHN0cnVjdCBpcF92c19kZXN0LCBuX2xpc3QpOworCQkJaWYgKCEoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfT1ZFUkxPQUQpICYmCisJCQkgICAgYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkgPj0gbWFyay0+Y3cpIHsKKwkJCQkvKiBnb3QgaXQgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChtYXJrLT5jbCA9PSBwICYmIG1hcmstPmN3ID09IG1hcmstPmRpKSB7CisJCQkvKiBiYWNrIHRvIHRoZSBzdGFydCwgYW5kIG5vIGRlc3QgaXMgZm91bmQuCisJCQkgICBJdCBpcyBvbmx5IHBvc3NpYmxlIHdoZW4gYWxsIGRlc3RzIGFyZSBPVkVSTE9BREVEICovCisJCQlkZXN0ID0gTlVMTDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJSVBfVlNfREJHKDYsICJXUlI6IHNlcnZlciAldS4ldS4ldS4ldToldSAiCisJCSAgImFjdGl2ZWNvbm5zICVkIHJlZmNudCAlZCB3ZWlnaHQgJWRcbiIsCisJCSAgTklQUVVBRChkZXN0LT5hZGRyKSwgbnRvaHMoZGVzdC0+cG9ydCksCisJCSAgYXRvbWljX3JlYWQoJmRlc3QtPmFjdGl2ZWNvbm5zKSwKKwkJICBhdG9taWNfcmVhZCgmZGVzdC0+cmVmY250KSwKKwkJICBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KSk7CisKKyAgb3V0OgorCXdyaXRlX3VubG9jaygmc3ZjLT5zY2hlZF9sb2NrKTsKKwlyZXR1cm4gZGVzdDsKK30KKworCitzdGF0aWMgc3RydWN0IGlwX3ZzX3NjaGVkdWxlciBpcF92c193cnJfc2NoZWR1bGVyID0geworCS5uYW1lID0JCQkid3JyIiwKKwkucmVmY250ID0JCUFUT01JQ19JTklUKDApLAorCS5tb2R1bGUgPQkJVEhJU19NT0RVTEUsCisJLmluaXRfc2VydmljZSA9CQlpcF92c193cnJfaW5pdF9zdmMsCisJLmRvbmVfc2VydmljZSA9CQlpcF92c193cnJfZG9uZV9zdmMsCisJLnVwZGF0ZV9zZXJ2aWNlID0JaXBfdnNfd3JyX3VwZGF0ZV9zdmMsCisJLnNjaGVkdWxlID0JCWlwX3ZzX3dycl9zY2hlZHVsZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlwX3ZzX3dycl9pbml0KHZvaWQpCit7CisJSU5JVF9MSVNUX0hFQUQoJmlwX3ZzX3dycl9zY2hlZHVsZXIubl9saXN0KTsKKwlyZXR1cm4gcmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKCZpcF92c193cnJfc2NoZWR1bGVyKSA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpcF92c193cnJfY2xlYW51cCh2b2lkKQoreworCXVucmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKCZpcF92c193cnJfc2NoZWR1bGVyKTsKK30KKworbW9kdWxlX2luaXQoaXBfdnNfd3JyX2luaXQpOworbW9kdWxlX2V4aXQoaXBfdnNfd3JyX2NsZWFudXApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c194bWl0LmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3htaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWE2MTc2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c194bWl0LmMKQEAgLTAsMCArMSw1NjMgQEAKKy8qCisgKiBpcF92c194bWl0LmM6IHZhcmlvdXMgcGFja2V0IHRyYW5zbWl0dGVycyBmb3IgSVBWUworICoKKyAqIFZlcnNpb246ICAgICAkSWQ6IGlwX3ZzX3htaXQuYyx2IDEuMiAyMDAyLzExLzMwIDAxOjUwOjM1IHdlbnNvbmcgRXhwICQKKyAqCisgKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgorICogICAgICAgICAgICAgIEp1bGlhbiBBbmFzdGFzb3YgPGphQHNzaS5iZz4KKyAqCisgKiAgICAgICAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICAgICAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgICAgICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgICAgICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDaGFuZ2VzOgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4gICAgICAgICAgICAgICAgICAvKiBmb3IgdGNwaGRyICovCisjaW5jbHVkZSA8bmV0L3RjcC5oPiAgICAgICAgICAgICAgICAgICAgLyogZm9yIGNzdW1fdGNwdWRwX21hZ2ljICovCisjaW5jbHVkZSA8bmV0L3VkcC5oPgorI2luY2x1ZGUgPG5ldC9pY21wLmg+ICAgICAgICAgICAgICAgICAgIC8qIGZvciBpY21wX3NlbmQgKi8KKyNpbmNsdWRlIDxuZXQvcm91dGUuaD4gICAgICAgICAgICAgICAgICAvKiBmb3IgaXBfcm91dGVfb3V0cHV0ICovCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKworI2luY2x1ZGUgPG5ldC9pcF92cy5oPgorCisKKy8qCisgKiAgICAgIERlc3RpbmF0aW9uIGNhY2hlIHRvIHNwZWVkIHVwIG91dGdvaW5nIHJvdXRlIGxvb2t1cAorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK19faXBfdnNfZHN0X3NldChzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCwgdTMyIHJ0b3MsIHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKK3sKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpvbGRfZHN0OworCisJb2xkX2RzdCA9IGRlc3QtPmRzdF9jYWNoZTsKKwlkZXN0LT5kc3RfY2FjaGUgPSBkc3Q7CisJZGVzdC0+ZHN0X3J0b3MgPSBydG9zOworCWRzdF9yZWxlYXNlKG9sZF9kc3QpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkc3RfZW50cnkgKgorX19pcF92c19kc3RfY2hlY2soc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QsIHUzMiBydG9zLCB1MzIgY29va2llKQoreworCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IGRlc3QtPmRzdF9jYWNoZTsKKworCWlmICghZHN0KQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKGRzdC0+b2Jzb2xldGUgfHwgcnRvcyAhPSBkZXN0LT5kc3RfcnRvcykgJiYKKwkgICAgZHN0LT5vcHMtPmNoZWNrKGRzdCwgY29va2llKSA9PSBOVUxMKSB7CisJCWRlc3QtPmRzdF9jYWNoZSA9IE5VTEw7CisJCWRzdF9yZWxlYXNlKGRzdCk7CisJCXJldHVybiBOVUxMOworCX0KKwlkc3RfaG9sZChkc3QpOworCXJldHVybiBkc3Q7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJ0YWJsZSAqCitfX2lwX3ZzX2dldF9vdXRfcnQoc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCB1MzIgcnRvcykKK3sKKwlzdHJ1Y3QgcnRhYmxlICpydDsJCQkvKiBSb3V0ZSB0byB0aGUgb3RoZXIgaG9zdCAqLworCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0ID0gY3AtPmRlc3Q7CisKKwlpZiAoZGVzdCkgeworCQlzcGluX2xvY2soJmRlc3QtPmRzdF9sb2NrKTsKKwkJaWYgKCEocnQgPSAoc3RydWN0IHJ0YWJsZSAqKQorCQkgICAgICBfX2lwX3ZzX2RzdF9jaGVjayhkZXN0LCBydG9zLCAwKSkpIHsKKwkJCXN0cnVjdCBmbG93aSBmbCA9IHsKKwkJCQkub2lmID0gMCwKKwkJCQkubmxfdSA9IHsKKwkJCQkJLmlwNF91ID0geworCQkJCQkJLmRhZGRyID0gZGVzdC0+YWRkciwKKwkJCQkJCS5zYWRkciA9IDAsCisJCQkJCQkudG9zID0gcnRvcywgfSB9LAorCQkJfTsKKworCQkJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpKSB7CisJCQkJc3Bpbl91bmxvY2soJmRlc3QtPmRzdF9sb2NrKTsKKwkJCQlJUF9WU19EQkdfUkwoImlwX3JvdXRlX291dHB1dCBlcnJvciwgIgorCQkJCQkgICAgICJkZXN0OiAldS4ldS4ldS4ldVxuIiwKKwkJCQkJICAgICBOSVBRVUFEKGRlc3QtPmFkZHIpKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCV9faXBfdnNfZHN0X3NldChkZXN0LCBydG9zLCBkc3RfY2xvbmUoJnJ0LT51LmRzdCkpOworCQkJSVBfVlNfREJHKDEwLCAibmV3IGRzdCAldS4ldS4ldS4ldSwgcmVmY250PSVkLCBydG9zPSVYXG4iLAorCQkJCSAgTklQUVVBRChkZXN0LT5hZGRyKSwKKwkJCQkgIGF0b21pY19yZWFkKCZydC0+dS5kc3QuX19yZWZjbnQpLCBydG9zKTsKKwkJfQorCQlzcGluX3VubG9jaygmZGVzdC0+ZHN0X2xvY2spOworCX0gZWxzZSB7CisJCXN0cnVjdCBmbG93aSBmbCA9IHsKKwkJCS5vaWYgPSAwLAorCQkJLm5sX3UgPSB7CisJCQkJLmlwNF91ID0geworCQkJCQkuZGFkZHIgPSBjcC0+ZGFkZHIsCisJCQkJCS5zYWRkciA9IDAsCisJCQkJCS50b3MgPSBydG9zLCB9IH0sCisJCX07CisKKwkJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpKSB7CisJCQlJUF9WU19EQkdfUkwoImlwX3JvdXRlX291dHB1dCBlcnJvciwgZGVzdDogIgorCQkJCSAgICAgIiV1LiV1LiV1LiV1XG4iLCBOSVBRVUFEKGNwLT5kYWRkcikpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwlyZXR1cm4gcnQ7Cit9CisKKworLyoKKyAqCVJlbGVhc2UgZGVzdC0+ZHN0X2NhY2hlIGJlZm9yZSBhIGRlc3QgaXMgcmVtb3ZlZAorICovCit2b2lkCitpcF92c19kc3RfcmVzZXQoc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCit7CisJc3RydWN0IGRzdF9lbnRyeSAqb2xkX2RzdDsKKworCW9sZF9kc3QgPSBkZXN0LT5kc3RfY2FjaGU7CisJZGVzdC0+ZHN0X2NhY2hlID0gTlVMTDsKKwlkc3RfcmVsZWFzZShvbGRfZHN0KTsKK30KKworI2RlZmluZSBJUF9WU19YTUlUKHNrYiwgcnQpCQkJCVwKK2RvIHsJCQkJCQkJXAorCW5mX3Jlc2V0X2RlYnVnKHNrYik7CQkJCVwKKwkoc2tiKS0+bmZjYWNoZSB8PSBORkNfSVBWU19QUk9QRVJUWTsJCVwKKwkoc2tiKS0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsJCVwKKwlORl9IT09LKFBGX0lORVQsIE5GX0lQX0xPQ0FMX09VVCwgKHNrYiksIE5VTEwsCVwKKwkJKHJ0KS0+dS5kc3QuZGV2LCBkc3Rfb3V0cHV0KTsJCVwKK30gd2hpbGUgKDApCisKKworLyoKKyAqICAgICAgTlVMTCB0cmFuc21pdHRlciAoZG8gbm90aGluZyBleGNlcHQgcmV0dXJuIE5GX0FDQ0VQVCkKKyAqLworaW50CitpcF92c19udWxsX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLAorCQlzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQoreworCS8qIHdlIGRvIG5vdCB0b3VjaCBza2IgYW5kIGRvIG5vdCBuZWVkIHBza2IgcHRyICovCisJcmV0dXJuIE5GX0FDQ0VQVDsKK30KKworCisvKgorICogICAgICBCeXBhc3MgdHJhbnNtaXR0ZXIKKyAqICAgICAgTGV0IHBhY2tldHMgYnlwYXNzIHRoZSBkZXN0aW5hdGlvbiB3aGVuIHRoZSBkZXN0aW5hdGlvbiBpcyBub3QKKyAqICAgICAgYXZhaWxhYmxlLCBpdCBtYXkgYmUgb25seSB1c2VkIGluIHRyYW5zcGFyZW50IGNhY2hlIGNsdXN0ZXIuCisgKi8KK2ludAoraXBfdnNfYnlwYXNzX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLAorCQkgIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHApCit7CisJc3RydWN0IHJ0YWJsZSAqcnQ7CQkJLyogUm91dGUgdG8gdGhlIG90aGVyIGhvc3QgKi8KKwlzdHJ1Y3QgaXBoZHIgICppcGggPSBza2ItPm5oLmlwaDsKKwl1OCAgICAgdG9zID0gaXBoLT50b3M7CisJaW50ICAgIG10dTsKKwlzdHJ1Y3QgZmxvd2kgZmwgPSB7CisJCS5vaWYgPSAwLAorCQkubmxfdSA9IHsKKwkJCS5pcDRfdSA9IHsKKwkJCQkuZGFkZHIgPSBpcGgtPmRhZGRyLAorCQkJCS5zYWRkciA9IDAsCisJCQkJLnRvcyA9IFJUX1RPUyh0b3MpLCB9IH0sCisJfTsKKworCUVudGVyRnVuY3Rpb24oMTApOworCisJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpKSB7CisJCUlQX1ZTX0RCR19STCgiaXBfdnNfYnlwYXNzX3htaXQoKTogaXBfcm91dGVfb3V0cHV0IGVycm9yLCAiCisJCQkgICAgICJkZXN0OiAldS4ldS4ldS4ldVxuIiwgTklQUVVBRChpcGgtPmRhZGRyKSk7CisJCWdvdG8gdHhfZXJyb3JfaWNtcDsKKwl9CisKKwkvKiBNVFUgY2hlY2tpbmcgKi8KKwltdHUgPSBkc3RfbXR1KCZydC0+dS5kc3QpOworCWlmICgoc2tiLT5sZW4gPiBtdHUpICYmIChpcGgtPmZyYWdfb2ZmJl9fY29uc3RhbnRfaHRvbnMoSVBfREYpKSkgeworCQlpcF9ydF9wdXQocnQpOworCQlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCxJQ01QX0ZSQUdfTkVFREVELCBodG9ubChtdHUpKTsKKwkJSVBfVlNfREJHX1JMKCJpcF92c19ieXBhc3NfeG1pdCgpOiBmcmFnIG5lZWRlZFxuIik7CisJCWdvdG8gdHhfZXJyb3I7CisJfQorCisJLyoKKwkgKiBDYWxsIGlwX3NlbmRfY2hlY2sgYmVjYXVzZSB3ZSBhcmUgbm90IHN1cmUgaXQgaXMgY2FsbGVkCisJICogYWZ0ZXIgaXBfZGVmcmFnLiBJcyBjb3B5LW9uLXdyaXRlIG5lZWRlZD8KKwkgKi8KKwlpZiAodW5saWtlbHkoKHNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSkgeworCQlpcF9ydF9wdXQocnQpOworCQlyZXR1cm4gTkZfU1RPTEVOOworCX0KKwlpcF9zZW5kX2NoZWNrKHNrYi0+bmguaXBoKTsKKworCS8qIGRyb3Agb2xkIHJvdXRlICovCisJZHN0X3JlbGVhc2Uoc2tiLT5kc3QpOworCXNrYi0+ZHN0ID0gJnJ0LT51LmRzdDsKKworCS8qIEFub3RoZXIgaGFjazogYXZvaWQgaWNtcF9zZW5kIGluIGlwX2ZyYWdtZW50ICovCisJc2tiLT5sb2NhbF9kZiA9IDE7CisKKwlJUF9WU19YTUlUKHNrYiwgcnQpOworCisJTGVhdmVGdW5jdGlvbigxMCk7CisJcmV0dXJuIE5GX1NUT0xFTjsKKworIHR4X2Vycm9yX2ljbXA6CisJZHN0X2xpbmtfZmFpbHVyZShza2IpOworIHR4X2Vycm9yOgorCWtmcmVlX3NrYihza2IpOworCUxlYXZlRnVuY3Rpb24oMTApOworCXJldHVybiBORl9TVE9MRU47Cit9CisKKworLyoKKyAqICAgICAgTkFUIHRyYW5zbWl0dGVyIChvbmx5IGZvciBvdXRzaWRlLXRvLWluc2lkZSBuYXQgZm9yd2FyZGluZykKKyAqICAgICAgTm90IHVzZWQgZm9yIHJlbGF0ZWQgSUNNUAorICovCitpbnQKK2lwX3ZzX25hdF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19jb25uICpjcCwKKwkgICAgICAgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKK3sKKwlzdHJ1Y3QgcnRhYmxlICpydDsJCS8qIFJvdXRlIHRvIHRoZSBvdGhlciBob3N0ICovCisJaW50IG10dTsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCisJRW50ZXJGdW5jdGlvbigxMCk7CisKKwkvKiBjaGVjayBpZiBpdCBpcyBhIGNvbm5lY3Rpb24gb2Ygbm8tY2xpZW50LXBvcnQgKi8KKwlpZiAodW5saWtlbHkoY3AtPmZsYWdzICYgSVBfVlNfQ09OTl9GX05PX0NQT1JUKSkgeworCQlfX3UxNiBfcHQsICpwOworCQlwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBoLT5paGwqNCwgc2l6ZW9mKF9wdCksICZfcHQpOworCQlpZiAocCA9PSBOVUxMKQorCQkJZ290byB0eF9lcnJvcjsKKwkJaXBfdnNfY29ubl9maWxsX2Nwb3J0KGNwLCAqcCk7CisJCUlQX1ZTX0RCRygxMCwgImZpbGxlZCBjcG9ydD0lZFxuIiwgbnRvaHMoKnApKTsKKwl9CisKKwlpZiAoIShydCA9IF9faXBfdnNfZ2V0X291dF9ydChjcCwgUlRfVE9TKGlwaC0+dG9zKSkpKQorCQlnb3RvIHR4X2Vycm9yX2ljbXA7CisKKwkvKiBNVFUgY2hlY2tpbmcgKi8KKwltdHUgPSBkc3RfbXR1KCZydC0+dS5kc3QpOworCWlmICgoc2tiLT5sZW4gPiBtdHUpICYmIChpcGgtPmZyYWdfb2ZmJl9fY29uc3RhbnRfaHRvbnMoSVBfREYpKSkgeworCQlpcF9ydF9wdXQocnQpOworCQlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCxJQ01QX0ZSQUdfTkVFREVELCBodG9ubChtdHUpKTsKKwkJSVBfVlNfREJHX1JMX1BLVCgwLCBwcCwgc2tiLCAwLCAiaXBfdnNfbmF0X3htaXQoKTogZnJhZyBuZWVkZWQgZm9yIik7CisJCWdvdG8gdHhfZXJyb3I7CisJfQorCisJLyogY29weS1vbi13cml0ZSB0aGUgcGFja2V0IGJlZm9yZSBtYW5nbGluZyBpdCAqLworCWlmICghaXBfdnNfbWFrZV9za2Jfd3JpdGFibGUoJnNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpKQorCQlnb3RvIHR4X2Vycm9yX3B1dDsKKworCWlmIChza2JfY293KHNrYiwgcnQtPnUuZHN0LmRldi0+aGFyZF9oZWFkZXJfbGVuKSkKKwkJZ290byB0eF9lcnJvcl9wdXQ7CisKKwkvKiBkcm9wIG9sZCByb3V0ZSAqLworCWRzdF9yZWxlYXNlKHNrYi0+ZHN0KTsKKwlza2ItPmRzdCA9ICZydC0+dS5kc3Q7CisKKwkvKiBtYW5nbGUgdGhlIHBhY2tldCAqLworCWlmIChwcC0+ZG5hdF9oYW5kbGVyICYmICFwcC0+ZG5hdF9oYW5kbGVyKCZza2IsIHBwLCBjcCkpCisJCWdvdG8gdHhfZXJyb3I7CisJc2tiLT5uaC5pcGgtPmRhZGRyID0gY3AtPmRhZGRyOworCWlwX3NlbmRfY2hlY2soc2tiLT5uaC5pcGgpOworCisJSVBfVlNfREJHX1BLVCgxMCwgcHAsIHNrYiwgMCwgIkFmdGVyIEROQVQiKTsKKworCS8qIEZJWE1FOiB3aGVuIGFwcGxpY2F0aW9uIGhlbHBlciBlbmxhcmdlcyB0aGUgcGFja2V0IGFuZCB0aGUgbGVuZ3RoCisJICAgaXMgbGFyZ2VyIHRoYW4gdGhlIE1UVSBvZiBvdXRnb2luZyBkZXZpY2UsIHRoZXJlIHdpbGwgYmUgc3RpbGwKKwkgICBNVFUgcHJvYmxlbS4gKi8KKworCS8qIEFub3RoZXIgaGFjazogYXZvaWQgaWNtcF9zZW5kIGluIGlwX2ZyYWdtZW50ICovCisJc2tiLT5sb2NhbF9kZiA9IDE7CisKKwlJUF9WU19YTUlUKHNrYiwgcnQpOworCisJTGVhdmVGdW5jdGlvbigxMCk7CisJcmV0dXJuIE5GX1NUT0xFTjsKKworICB0eF9lcnJvcl9pY21wOgorCWRzdF9saW5rX2ZhaWx1cmUoc2tiKTsKKyAgdHhfZXJyb3I6CisJTGVhdmVGdW5jdGlvbigxMCk7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIE5GX1NUT0xFTjsKKyAgdHhfZXJyb3JfcHV0OgorCWlwX3J0X3B1dChydCk7CisJZ290byB0eF9lcnJvcjsKK30KKworCisvKgorICogICBJUCBUdW5uZWxpbmcgdHJhbnNtaXR0ZXIKKyAqCisgKiAgIFRoaXMgZnVuY3Rpb24gZW5jYXBzdWxhdGVzIHRoZSBwYWNrZXQgaW4gYSBuZXcgSVAgcGFja2V0LCBpdHMKKyAqICAgZGVzdGluYXRpb24gd2lsbCBiZSBzZXQgdG8gY3AtPmRhZGRyLiBNb3N0IGNvZGUgb2YgdGhpcyBmdW5jdGlvbgorICogICBpcyB0YWtlbiBmcm9tIGlwaXAuYy4KKyAqCisgKiAgIEl0IGlzIHVzZWQgaW4gVlMvVFVOIGNsdXN0ZXIuIFRoZSBsb2FkIGJhbGFuY2VyIHNlbGVjdHMgYSByZWFsCisgKiAgIHNlcnZlciBmcm9tIGEgY2x1c3RlciBiYXNlZCBvbiBhIHNjaGVkdWxpbmcgYWxnb3JpdGhtLAorICogICBlbmNhcHN1bGF0ZXMgdGhlIHJlcXVlc3QgcGFja2V0IGFuZCBmb3J3YXJkcyBpdCB0byB0aGUgc2VsZWN0ZWQKKyAqICAgc2VydmVyLiBGb3IgZXhhbXBsZSwgYWxsIHJlYWwgc2VydmVycyBhcmUgY29uZmlndXJlZCB3aXRoCisgKiAgICJpZmNvbmZpZyB0dW5sMCA8VmlydHVhbCBJUCBBZGRyZXNzPiB1cCIuIFdoZW4gdGhlIHNlcnZlciByZWNlaXZlcworICogICB0aGUgZW5jYXBzdWxhdGVkIHBhY2tldCwgaXQgd2lsbCBkZWNhcHN1bGF0ZSB0aGUgcGFja2V0LCBwcm9jZXNzZQorICogICB0aGUgcmVxdWVzdCBhbmQgcmV0dXJuIHRoZSByZXNwb25zZSBwYWNrZXRzIGRpcmVjdGx5IHRvIHRoZSBjbGllbnQKKyAqICAgd2l0aG91dCBwYXNzaW5nIHRoZSBsb2FkIGJhbGFuY2VyLiBUaGlzIGNhbiBncmVhdGx5IGluY3JlYXNlIHRoZQorICogICBzY2FsYWJpbGl0eSBvZiB2aXJ0dWFsIHNlcnZlci4KKyAqCisgKiAgIFVzZWQgZm9yIEFOWSBwcm90b2NvbAorICovCitpbnQKK2lwX3ZzX3R1bm5lbF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19jb25uICpjcCwKKwkJICBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQoreworCXN0cnVjdCBydGFibGUgKnJ0OwkJCS8qIFJvdXRlIHRvIHRoZSBvdGhlciBob3N0ICovCisJc3RydWN0IG5ldF9kZXZpY2UgKnRkZXY7CQkvKiBEZXZpY2UgdG8gb3RoZXIgaG9zdCAqLworCXN0cnVjdCBpcGhkciAgKm9sZF9pcGggPSBza2ItPm5oLmlwaDsKKwl1OCAgICAgdG9zID0gb2xkX2lwaC0+dG9zOworCXUxNiAgICBkZiA9IG9sZF9pcGgtPmZyYWdfb2ZmOworCXN0cnVjdCBpcGhkciAgKmlwaDsJCQkvKiBPdXIgbmV3IElQIGhlYWRlciAqLworCWludCAgICBtYXhfaGVhZHJvb207CQkJLyogVGhlIGV4dHJhIGhlYWRlciBzcGFjZSBuZWVkZWQgKi8KKwlpbnQgICAgbXR1OworCisJRW50ZXJGdW5jdGlvbigxMCk7CisKKwlpZiAoc2tiLT5wcm90b2NvbCAhPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKSkgeworCQlJUF9WU19EQkdfUkwoImlwX3ZzX3R1bm5lbF94bWl0KCk6IHByb3RvY29sIGVycm9yLCAiCisJCQkgICAgICJFVEhfUF9JUDogJWQsIHNrYiBwcm90b2NvbDogJWRcbiIsCisJCQkgICAgIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApLCBza2ItPnByb3RvY29sKTsKKwkJZ290byB0eF9lcnJvcjsKKwl9CisKKwlpZiAoIShydCA9IF9faXBfdnNfZ2V0X291dF9ydChjcCwgUlRfVE9TKHRvcykpKSkKKwkJZ290byB0eF9lcnJvcl9pY21wOworCisJdGRldiA9IHJ0LT51LmRzdC5kZXY7CisKKwltdHUgPSBkc3RfbXR1KCZydC0+dS5kc3QpIC0gc2l6ZW9mKHN0cnVjdCBpcGhkcik7CisJaWYgKG10dSA8IDY4KSB7CisJCWlwX3J0X3B1dChydCk7CisJCUlQX1ZTX0RCR19STCgiaXBfdnNfdHVubmVsX3htaXQoKTogbXR1IGxlc3MgdGhhbiA2OFxuIik7CisJCWdvdG8gdHhfZXJyb3I7CisJfQorCWlmIChza2ItPmRzdCkKKwkJc2tiLT5kc3QtPm9wcy0+dXBkYXRlX3BtdHUoc2tiLT5kc3QsIG10dSk7CisKKwlkZiB8PSAob2xkX2lwaC0+ZnJhZ19vZmYmX19jb25zdGFudF9odG9ucyhJUF9ERikpOworCisJaWYgKChvbGRfaXBoLT5mcmFnX29mZiZfX2NvbnN0YW50X2h0b25zKElQX0RGKSkKKwkgICAgJiYgbXR1IDwgbnRvaHMob2xkX2lwaC0+dG90X2xlbikpIHsKKwkJaWNtcF9zZW5kKHNrYiwgSUNNUF9ERVNUX1VOUkVBQ0gsSUNNUF9GUkFHX05FRURFRCwgaHRvbmwobXR1KSk7CisJCWlwX3J0X3B1dChydCk7CisJCUlQX1ZTX0RCR19STCgiaXBfdnNfdHVubmVsX3htaXQoKTogZnJhZyBuZWVkZWRcbiIpOworCQlnb3RvIHR4X2Vycm9yOworCX0KKworCS8qCisJICogT2theSwgbm93IHNlZSBpZiB3ZSBjYW4gc3R1ZmYgaXQgaW4gdGhlIGJ1ZmZlciBhcy1pcy4KKwkgKi8KKwltYXhfaGVhZHJvb20gPSBMTF9SRVNFUlZFRF9TUEFDRSh0ZGV2KSArIHNpemVvZihzdHJ1Y3QgaXBoZHIpOworCisJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgbWF4X2hlYWRyb29tCisJICAgIHx8IHNrYl9jbG9uZWQoc2tiKSB8fCBza2Jfc2hhcmVkKHNrYikpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2IgPQorCQkJc2tiX3JlYWxsb2NfaGVhZHJvb20oc2tiLCBtYXhfaGVhZHJvb20pOworCQlpZiAoIW5ld19za2IpIHsKKwkJCWlwX3J0X3B1dChydCk7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCUlQX1ZTX0VSUl9STCgiaXBfdnNfdHVubmVsX3htaXQoKTogbm8gbWVtb3J5XG4iKTsKKwkJCXJldHVybiBORl9TVE9MRU47CisJCX0KKwkJa2ZyZWVfc2tiKHNrYik7CisJCXNrYiA9IG5ld19za2I7CisJCW9sZF9pcGggPSBza2ItPm5oLmlwaDsKKwl9CisKKwlza2ItPmgucmF3ID0gKHZvaWQgKikgb2xkX2lwaDsKKworCS8qIGZpeCBvbGQgSVAgaGVhZGVyIGNoZWNrc3VtICovCisJaXBfc2VuZF9jaGVjayhvbGRfaXBoKTsKKworCXNrYi0+bmgucmF3ID0gc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CisJbWVtc2V0KCYoSVBDQihza2IpLT5vcHQpLCAwLCBzaXplb2YoSVBDQihza2IpLT5vcHQpKTsKKworCS8qIGRyb3Agb2xkIHJvdXRlICovCisJZHN0X3JlbGVhc2Uoc2tiLT5kc3QpOworCXNrYi0+ZHN0ID0gJnJ0LT51LmRzdDsKKworCS8qCisJICoJUHVzaCBkb3duIGFuZCBpbnN0YWxsIHRoZSBJUElQIGhlYWRlci4KKwkgKi8KKwlpcGgJCQk9CXNrYi0+bmguaXBoOworCWlwaC0+dmVyc2lvbgkJPQk0OworCWlwaC0+aWhsCQk9CXNpemVvZihzdHJ1Y3QgaXBoZHIpPj4yOworCWlwaC0+ZnJhZ19vZmYJCT0JZGY7CisJaXBoLT5wcm90b2NvbAkJPQlJUFBST1RPX0lQSVA7CisJaXBoLT50b3MJCT0JdG9zOworCWlwaC0+ZGFkZHIJCT0JcnQtPnJ0X2RzdDsKKwlpcGgtPnNhZGRyCQk9CXJ0LT5ydF9zcmM7CisJaXBoLT50dGwJCT0Jb2xkX2lwaC0+dHRsOworCWlwaC0+dG90X2xlbgkJPQlodG9ucyhza2ItPmxlbik7CisJaXBfc2VsZWN0X2lkZW50KGlwaCwgJnJ0LT51LmRzdCwgTlVMTCk7CisJaXBfc2VuZF9jaGVjayhpcGgpOworCisJLyogQW5vdGhlciBoYWNrOiBhdm9pZCBpY21wX3NlbmQgaW4gaXBfZnJhZ21lbnQgKi8KKwlza2ItPmxvY2FsX2RmID0gMTsKKworCUlQX1ZTX1hNSVQoc2tiLCBydCk7CisKKwlMZWF2ZUZ1bmN0aW9uKDEwKTsKKworCXJldHVybiBORl9TVE9MRU47CisKKyAgdHhfZXJyb3JfaWNtcDoKKwlkc3RfbGlua19mYWlsdXJlKHNrYik7CisgIHR4X2Vycm9yOgorCWtmcmVlX3NrYihza2IpOworCUxlYXZlRnVuY3Rpb24oMTApOworCXJldHVybiBORl9TVE9MRU47Cit9CisKKworLyoKKyAqICAgICAgRGlyZWN0IFJvdXRpbmcgdHJhbnNtaXR0ZXIKKyAqICAgICAgVXNlZCBmb3IgQU5ZIHByb3RvY29sCisgKi8KK2ludAoraXBfdnNfZHJfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsCisJICAgICAgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKK3sKKwlzdHJ1Y3QgcnRhYmxlICpydDsJCQkvKiBSb3V0ZSB0byB0aGUgb3RoZXIgaG9zdCAqLworCXN0cnVjdCBpcGhkciAgKmlwaCA9IHNrYi0+bmguaXBoOworCWludCAgICBtdHU7CisKKwlFbnRlckZ1bmN0aW9uKDEwKTsKKworCWlmICghKHJ0ID0gX19pcF92c19nZXRfb3V0X3J0KGNwLCBSVF9UT1MoaXBoLT50b3MpKSkpCisJCWdvdG8gdHhfZXJyb3JfaWNtcDsKKworCS8qIE1UVSBjaGVja2luZyAqLworCW10dSA9IGRzdF9tdHUoJnJ0LT51LmRzdCk7CisJaWYgKChpcGgtPmZyYWdfb2ZmJl9fY29uc3RhbnRfaHRvbnMoSVBfREYpKSAmJiBza2ItPmxlbiA+IG10dSkgeworCQlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCxJQ01QX0ZSQUdfTkVFREVELCBodG9ubChtdHUpKTsKKwkJaXBfcnRfcHV0KHJ0KTsKKwkJSVBfVlNfREJHX1JMKCJpcF92c19kcl94bWl0KCk6IGZyYWcgbmVlZGVkXG4iKTsKKwkJZ290byB0eF9lcnJvcjsKKwl9CisKKwkvKgorCSAqIENhbGwgaXBfc2VuZF9jaGVjayBiZWNhdXNlIHdlIGFyZSBub3Qgc3VyZSBpdCBpcyBjYWxsZWQKKwkgKiBhZnRlciBpcF9kZWZyYWcuIElzIGNvcHktb24td3JpdGUgbmVlZGVkPworCSAqLworCWlmICh1bmxpa2VseSgoc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQykpID09IE5VTEwpKSB7CisJCWlwX3J0X3B1dChydCk7CisJCXJldHVybiBORl9TVE9MRU47CisJfQorCWlwX3NlbmRfY2hlY2soc2tiLT5uaC5pcGgpOworCisJLyogZHJvcCBvbGQgcm91dGUgKi8KKwlkc3RfcmVsZWFzZShza2ItPmRzdCk7CisJc2tiLT5kc3QgPSAmcnQtPnUuZHN0OworCisJLyogQW5vdGhlciBoYWNrOiBhdm9pZCBpY21wX3NlbmQgaW4gaXBfZnJhZ21lbnQgKi8KKwlza2ItPmxvY2FsX2RmID0gMTsKKworCUlQX1ZTX1hNSVQoc2tiLCBydCk7CisKKwlMZWF2ZUZ1bmN0aW9uKDEwKTsKKwlyZXR1cm4gTkZfU1RPTEVOOworCisgIHR4X2Vycm9yX2ljbXA6CisJZHN0X2xpbmtfZmFpbHVyZShza2IpOworICB0eF9lcnJvcjoKKwlrZnJlZV9za2Ioc2tiKTsKKwlMZWF2ZUZ1bmN0aW9uKDEwKTsKKwlyZXR1cm4gTkZfU1RPTEVOOworfQorCisKKy8qCisgKglJQ01QIHBhY2tldCB0cmFuc21pdHRlcgorICoJY2FsbGVkIGJ5IHRoZSBpcF92c19pbl9pY21wCisgKi8KK2ludAoraXBfdnNfaWNtcF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19jb25uICpjcCwKKwkJc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgcnRhYmxlCSpydDsJLyogUm91dGUgdG8gdGhlIG90aGVyIGhvc3QgKi8KKwlpbnQgbXR1OworCWludCByYzsKKworCUVudGVyRnVuY3Rpb24oMTApOworCisJLyogVGhlIElDTVAgcGFja2V0IGZvciBWUy9UVU4sIFZTL0RSIGFuZCBMT0NBTE5PREUgd2lsbCBiZQorCSAgIGZvcndhcmRlZCBkaXJlY3RseSBoZXJlLCBiZWNhdXNlIHRoZXJlIGlzIG5vIG5lZWQgdG8KKwkgICB0cmFuc2xhdGUgYWRkcmVzcy9wb3J0IGJhY2sgKi8KKwlpZiAoSVBfVlNfRldEX01FVEhPRChjcCkgIT0gSVBfVlNfQ09OTl9GX01BU1EpIHsKKwkJaWYgKGNwLT5wYWNrZXRfeG1pdCkKKwkJCXJjID0gY3AtPnBhY2tldF94bWl0KHNrYiwgY3AsIHBwKTsKKwkJZWxzZQorCQkJcmMgPSBORl9BQ0NFUFQ7CisJCS8qIGRvIG5vdCB0b3VjaCBza2IgYW55bW9yZSAqLworCQlhdG9taWNfaW5jKCZjcC0+aW5fcGt0cyk7CisJCV9faXBfdnNfY29ubl9wdXQoY3ApOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIG1hbmdsZSBhbmQgc2VuZCB0aGUgcGFja2V0IGhlcmUgKG9ubHkgZm9yIFZTL05BVCkKKwkgKi8KKworCWlmICghKHJ0ID0gX19pcF92c19nZXRfb3V0X3J0KGNwLCBSVF9UT1Moc2tiLT5uaC5pcGgtPnRvcykpKSkKKwkJZ290byB0eF9lcnJvcl9pY21wOworCisJLyogTVRVIGNoZWNraW5nICovCisJbXR1ID0gZHN0X210dSgmcnQtPnUuZHN0KTsKKwlpZiAoKHNrYi0+bGVuID4gbXR1KSAmJiAoc2tiLT5uaC5pcGgtPmZyYWdfb2ZmJl9fY29uc3RhbnRfaHRvbnMoSVBfREYpKSkgeworCQlpcF9ydF9wdXQocnQpOworCQlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCwgSUNNUF9GUkFHX05FRURFRCwgaHRvbmwobXR1KSk7CisJCUlQX1ZTX0RCR19STCgiaXBfdnNfaW5faWNtcCgpOiBmcmFnIG5lZWRlZFxuIik7CisJCWdvdG8gdHhfZXJyb3I7CisJfQorCisJLyogY29weS1vbi13cml0ZSB0aGUgcGFja2V0IGJlZm9yZSBtYW5nbGluZyBpdCAqLworCWlmICghaXBfdnNfbWFrZV9za2Jfd3JpdGFibGUoJnNrYiwgb2Zmc2V0KSkKKwkJZ290byB0eF9lcnJvcl9wdXQ7CisKKwlpZiAoc2tiX2Nvdyhza2IsIHJ0LT51LmRzdC5kZXYtPmhhcmRfaGVhZGVyX2xlbikpCisJCWdvdG8gdHhfZXJyb3JfcHV0OworCisJLyogZHJvcCB0aGUgb2xkIHJvdXRlIHdoZW4gc2tiIGlzIG5vdCBzaGFyZWQgKi8KKwlkc3RfcmVsZWFzZShza2ItPmRzdCk7CisJc2tiLT5kc3QgPSAmcnQtPnUuZHN0OworCisJaXBfdnNfbmF0X2ljbXAoc2tiLCBwcCwgY3AsIDApOworCisJLyogQW5vdGhlciBoYWNrOiBhdm9pZCBpY21wX3NlbmQgaW4gaXBfZnJhZ21lbnQgKi8KKwlza2ItPmxvY2FsX2RmID0gMTsKKworCUlQX1ZTX1hNSVQoc2tiLCBydCk7CisKKwlyYyA9IE5GX1NUT0xFTjsKKwlnb3RvIG91dDsKKworICB0eF9lcnJvcl9pY21wOgorCWRzdF9saW5rX2ZhaWx1cmUoc2tiKTsKKyAgdHhfZXJyb3I6CisJZGV2X2tmcmVlX3NrYihza2IpOworCXJjID0gTkZfU1RPTEVOOworICBvdXQ6CisJTGVhdmVGdW5jdGlvbigxMCk7CisJcmV0dXJuIHJjOworICB0eF9lcnJvcl9wdXQ6CisJaXBfcnRfcHV0KHJ0KTsKKwlnb3RvIHR4X2Vycm9yOworfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbXVsdGlwYXRoLmMgYi9uZXQvaXB2NC9tdWx0aXBhdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTljYTdjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbXVsdGlwYXRoLmMKQEAgLTAsMCArMSw1NSBAQAorLyogbXVsdGlwYXRoLmM6IElQVjQgbXVsdGlwYXRoIGFsZ29yaXRobSBzdXBwb3J0LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBFaW5hciBMdWVjayA8ZWx1ZWNrQGRlLmlibS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBkYXZlbWxvZnQubmV0PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlIDxuZXQvaXBfbXBfYWxnLmg+CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWxnX3RhYmxlX2xvY2spOworc3RydWN0IGlwX21wX2FsZ19vcHMgKmlwX21wX2FsZ190YWJsZVtJUF9NUF9BTEdfTUFYICsgMV07CisKK2ludCBtdWx0aXBhdGhfYWxnX3JlZ2lzdGVyKHN0cnVjdCBpcF9tcF9hbGdfb3BzICpvcHMsIGVudW0gaXBfbXBfYWxnIG4pCit7CisJc3RydWN0IGlwX21wX2FsZ19vcHMgKipzbG90OworCWludCBlcnI7CisKKwlpZiAobiA8IElQX01QX0FMR19OT05FIHx8IG4gPiBJUF9NUF9BTEdfTUFYIHx8CisJICAgICFvcHMtPm1wX2FsZ19zZWxlY3Rfcm91dGUpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrKCZhbGdfdGFibGVfbG9jayk7CisJc2xvdCA9ICZpcF9tcF9hbGdfdGFibGVbbl07CisJaWYgKCpzbG90ICE9IE5VTEwpIHsKKwkJZXJyID0gLUVCVVNZOworCX0gZWxzZSB7CisJCSpzbG90ID0gb3BzOworCQllcnIgPSAwOworCX0KKwlzcGluX3VubG9jaygmYWxnX3RhYmxlX2xvY2spOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0wobXVsdGlwYXRoX2FsZ19yZWdpc3Rlcik7CisKK3ZvaWQgbXVsdGlwYXRoX2FsZ191bnJlZ2lzdGVyKHN0cnVjdCBpcF9tcF9hbGdfb3BzICpvcHMsIGVudW0gaXBfbXBfYWxnIG4pCit7CisJc3RydWN0IGlwX21wX2FsZ19vcHMgKipzbG90OworCisJaWYgKG4gPCBJUF9NUF9BTEdfTk9ORSB8fCBuID4gSVBfTVBfQUxHX01BWCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrKCZhbGdfdGFibGVfbG9jayk7CisJc2xvdCA9ICZpcF9tcF9hbGdfdGFibGVbbl07CisJaWYgKCpzbG90ID09IG9wcykKKwkJKnNsb3QgPSBOVUxMOworCXNwaW5fdW5sb2NrKCZhbGdfdGFibGVfbG9jayk7CisKKwlzeW5jaHJvbml6ZV9uZXQoKTsKK30KK0VYUE9SVF9TWU1CT0wobXVsdGlwYXRoX2FsZ191bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L211bHRpcGF0aF9kcnIuYyBiL25ldC9pcHY0L211bHRpcGF0aF9kcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzQ5Njg2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbXVsdGlwYXRoX2Ryci5jCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICogICAgICAgICAgICAgIERldmljZSByb3VuZCByb2JpbiBwb2xpY3kgZm9yIG11bHRpcGF0aC4KKyAqCisgKgorICogVmVyc2lvbjoJJElkOiBtdWx0aXBhdGhfZHJyLmMsdiAxLjEuMi4xIDIwMDQvMDkvMTYgMDc6NDI6MzQgZWx1ZWNrIEV4cCAkCisgKgorICogQXV0aG9yczoJRWluYXIgTHVlY2sgPGVsdWVja0BkZS5pYm0uY29tPjxsa21sQGVpbmFyLWx1ZWNrLmRlPgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lnbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvaWNtcC5oPgorI2luY2x1ZGUgPG5ldC91ZHAuaD4KKyNpbmNsdWRlIDxuZXQvcmF3Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2luY2x1ZGUgPG5ldC9pcGlwLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bmV0L2lwX21wX2FsZy5oPgorCitzdHJ1Y3QgbXVsdGlwYXRoX2RldmljZSB7CisJaW50CQlpZmk7IC8qIGludGVyZmFjZSBpbmRleCBvZiBkZXZpY2UgKi8KKwlhdG9taWNfdAl1c2Vjb3VudDsKKwlpbnQgCQlhbGxvY2F0ZWQ7Cit9OworCisjZGVmaW5lIE1VTFRJUEFUSF9NQVhfREVWSUNFQ0FORElEQVRFUyAxMAorCitzdGF0aWMgc3RydWN0IG11bHRpcGF0aF9kZXZpY2Ugc3RhdGVbTVVMVElQQVRIX01BWF9ERVZJQ0VDQU5ESURBVEVTXTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3RhdGVfbG9jayk7CitzdGF0aWMgc3RydWN0IHJ0YWJsZSAqbGFzdF9zZWxlY3Rpb24gPSBOVUxMOworCitzdGF0aWMgaW50IGlubGluZSBfX211bHRpcGF0aF9maW5kc2xvdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1VTFRJUEFUSF9NQVhfREVWSUNFQ0FORElEQVRFUzsgaSsrKSB7CisJCWlmIChzdGF0ZVtpXS5hbGxvY2F0ZWQgPT0gMCkKKwkJCXJldHVybiBpOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgaW5saW5lIF9fbXVsdGlwYXRoX2ZpbmRkZXYoaW50IGlmaW5kZXgpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTVVMVElQQVRIX01BWF9ERVZJQ0VDQU5ESURBVEVTOyBpKyspIHsKKwkJaWYgKHN0YXRlW2ldLmFsbG9jYXRlZCAhPSAwICYmCisJCSAgICBzdGF0ZVtpXS5pZmkgPT0gaWZpbmRleCkKKwkJCXJldHVybiBpOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZHJyX2Rldl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCisJCQkgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwdHI7CisJaW50IGRldmlkeDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgorCWNhc2UgTkVUREVWX0RPV046CisJCXNwaW5fbG9ja19iaCgmc3RhdGVfbG9jayk7CisKKwkJZGV2aWR4ID0gX19tdWx0aXBhdGhfZmluZGRldihkZXYtPmlmaW5kZXgpOworCQlpZiAoZGV2aWR4ICE9IC0xKSB7CisJCQlzdGF0ZVtkZXZpZHhdLmFsbG9jYXRlZCA9IDA7CisJCQlzdGF0ZVtkZXZpZHhdLmlmaSA9IDA7CisJCQlhdG9taWNfc2V0KCZzdGF0ZVtkZXZpZHhdLnVzZWNvdW50LCAwKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrX2JoKCZzdGF0ZV9sb2NrKTsKKwkJYnJlYWs7CisJfTsKKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGRycl9kZXZfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwJPSBkcnJfZGV2X2V2ZW50LAorfTsKKworc3RhdGljIHZvaWQgZHJyX3JlbW92ZShzdHJ1Y3QgcnRhYmxlICpydCkKK3sKKwlpZiAobGFzdF9zZWxlY3Rpb24gPT0gcnQpCisJCWxhc3Rfc2VsZWN0aW9uID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZHJyX3NhZmVfaW5jKGF0b21pY190ICp1c2Vjb3VudCkKK3sKKwlpbnQgbjsKKworCWF0b21pY19pbmModXNlY291bnQpOworCisJbiA9IGF0b21pY19yZWFkKHVzZWNvdW50KTsKKwlpZiAobiA8PSAwKSB7CisJCWludCBpOworCisJCXNwaW5fbG9ja19iaCgmc3RhdGVfbG9jayk7CisKKwkJZm9yIChpID0gMDsgaSA8IE1VTFRJUEFUSF9NQVhfREVWSUNFQ0FORElEQVRFUzsgaSsrKQorCQkJYXRvbWljX3NldCgmc3RhdGVbaV0udXNlY291bnQsIDApOworCisJCXNwaW5fdW5sb2NrX2JoKCZzdGF0ZV9sb2NrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRycl9zZWxlY3Rfcm91dGUoY29uc3Qgc3RydWN0IGZsb3dpICpmbHAsCisJCQkgICAgIHN0cnVjdCBydGFibGUgKmZpcnN0LCBzdHJ1Y3QgcnRhYmxlICoqcnApCit7CisJc3RydWN0IHJ0YWJsZSAqbmgsICpyZXN1bHQsICpjdXJfbWluOworCWludCBtaW5fdXNlY291bnQgPSAtMTsgCisJaW50IGRldmlkeCA9IC0xOworCWludCBjdXJfbWluX2RldmlkeCA9IC0xOworCisgICAgICAgCS8qIGlmIG5lY2Vzc2FyeSBhbmQgcG9zc2libGUgdXRpbGl6ZSB0aGUgb2xkIGFsdGVybmF0aXZlICovCisJaWYgKChmbHAtPmZsYWdzICYgRkxPV0lfRkxBR19NVUxUSVBBVEhPTERST1VURSkgIT0gMCAmJgorCSAgICBsYXN0X3NlbGVjdGlvbiAhPSBOVUxMKSB7CisJCXJlc3VsdCA9IGxhc3Rfc2VsZWN0aW9uOworCQkqcnAgPSByZXN1bHQ7CisJCXJldHVybjsKKwl9CisKKwkvKiAxLiBtYWtlIHN1cmUgYWxsIGFsdC4gbmV4dGhvcHMgaGF2ZSB0aGUgc2FtZSBHQyByZWxhdGVkIGRhdGEgKi8KKwkvKiAyLiBkZXRlcm1pbmUgdGhlIG5ldyBjYW5kaWRhdGUgdG8gYmUgcmV0dXJuZWQgKi8KKwlyZXN1bHQgPSBOVUxMOworCWN1cl9taW4gPSBOVUxMOworCWZvciAobmggPSByY3VfZGVyZWZlcmVuY2UoZmlyc3QpOyBuaDsKKwkgICAgIG5oID0gcmN1X2RlcmVmZXJlbmNlKG5oLT51LnJ0X25leHQpKSB7CisJCWlmICgobmgtPnUuZHN0LmZsYWdzICYgRFNUX0JBTEFOQ0VEKSAhPSAwICYmCisJCSAgICBtdWx0aXBhdGhfY29tcGFyZWtleXMoJm5oLT5mbCwgZmxwKSkgeworCQkJaW50IG5oX2lmaWR4ID0gbmgtPnUuZHN0LmRldi0+aWZpbmRleDsKKworCQkJbmgtPnUuZHN0Lmxhc3R1c2UgPSBqaWZmaWVzOworCQkJbmgtPnUuZHN0Ll9fdXNlKys7CisJCQlpZiAocmVzdWx0ICE9IE5VTEwpCisJCQkJY29udGludWU7CisKKwkJCS8qIHNlYXJjaCBmb3IgdGhlIG91dHB1dCBpbnRlcmZhY2UgKi8KKworCQkJLyogdGhpcyBpcyBub3QgU01QIHNhZmUsIG9ubHkgYWRkL3JlbW92ZSBhcmUKKwkJCSAqIFNNUCBzYWZlIGFzIHdyb25nIHVzZWNvdW50IHVwZGF0ZXMgaGF2ZSBubyBiaWcKKwkJCSAqIGltcGFjdAorCQkJICovCisJCQlkZXZpZHggPSBfX211bHRpcGF0aF9maW5kZGV2KG5oX2lmaWR4KTsKKwkJCWlmIChkZXZpZHggPT0gLTEpIHsKKwkJCQkvKiBhZGQgdGhlIGludGVyZmFjZSB0byB0aGUgYXJyYXkgCisJCQkJICogU01QIHNhZmUKKwkJCQkgKi8KKwkJCQlzcGluX2xvY2tfYmgoJnN0YXRlX2xvY2spOworCisJCQkJLyogZHVlIHRvIFNNUDogc2VhcmNoIGFnYWluICovCisJCQkJZGV2aWR4ID0gX19tdWx0aXBhdGhfZmluZGRldihuaF9pZmlkeCk7CisJCQkJaWYgKGRldmlkeCA9PSAtMSkgeworCQkJCQkvKiBhZGQgZW50cnkgZm9yIGRldmljZSAqLworCQkJCQlkZXZpZHggPSBfX211bHRpcGF0aF9maW5kc2xvdCgpOworCQkJCQlpZiAoZGV2aWR4ID09IC0xKSB7CisJCQkJCQkvKiB1bmxpa2VseSBidXQgcG9zc2libGUgKi8KKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisKKwkJCQkJc3RhdGVbZGV2aWR4XS5hbGxvY2F0ZWQgPSAxOworCQkJCQlzdGF0ZVtkZXZpZHhdLmlmaSA9IG5oX2lmaWR4OworCQkJCQlhdG9taWNfc2V0KCZzdGF0ZVtkZXZpZHhdLnVzZWNvdW50LCAwKTsKKwkJCQkJbWluX3VzZWNvdW50ID0gMDsKKwkJCQl9CisKKwkJCQlzcGluX3VubG9ja19iaCgmc3RhdGVfbG9jayk7CisJCQl9CisKKwkJCWlmIChtaW5fdXNlY291bnQgPT0gMCkgeworCQkJCS8qIGlmIHRoZSBkZXZpY2UgaGFzIG5vdCBiZWVuIHVzZWQgaXQgaXMKKwkJCQkgKiB0aGUgcHJpbWFyeSB0YXJnZXQKKwkJCQkgKi8KKwkJCQlkcnJfc2FmZV9pbmMoJnN0YXRlW2RldmlkeF0udXNlY291bnQpOworCQkJCXJlc3VsdCA9IG5oOworCQkJfSBlbHNlIHsKKwkJCQlpbnQgY291bnQgPQorCQkJCQlhdG9taWNfcmVhZCgmc3RhdGVbZGV2aWR4XS51c2Vjb3VudCk7CisKKwkJCQlpZiAobWluX3VzZWNvdW50ID09IC0xIHx8CisJCQkJICAgIGNvdW50IDwgbWluX3VzZWNvdW50KSB7CisJCQkJCWN1cl9taW4gPSBuaDsKKwkJCQkJY3VyX21pbl9kZXZpZHggPSBkZXZpZHg7CisJCQkJCW1pbl91c2Vjb3VudCA9IGNvdW50OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmICghcmVzdWx0KSB7CisJCWlmIChjdXJfbWluKSB7CisJCQlkcnJfc2FmZV9pbmMoJnN0YXRlW2N1cl9taW5fZGV2aWR4XS51c2Vjb3VudCk7CisJCQlyZXN1bHQgPSBjdXJfbWluOworCQl9IGVsc2UgeworCQkJcmVzdWx0ID0gZmlyc3Q7CisJCX0KKwl9CisKKwkqcnAgPSByZXN1bHQ7CisJbGFzdF9zZWxlY3Rpb24gPSByZXN1bHQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXBfbXBfYWxnX29wcyBkcnJfb3BzID0geworCS5tcF9hbGdfc2VsZWN0X3JvdXRlCT0JZHJyX3NlbGVjdF9yb3V0ZSwKKwkubXBfYWxnX3JlbW92ZQkJPQlkcnJfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZHJyX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyID0gcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZkcnJfZGV2X25vdGlmaWVyKTsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBtdWx0aXBhdGhfYWxnX3JlZ2lzdGVyKCZkcnJfb3BzLCBJUF9NUF9BTEdfUlIpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDsKKworCXJldHVybiAwOworCitmYWlsOgorCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZkcnJfZGV2X25vdGlmaWVyKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHJyX2V4aXQodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmZHJyX2Rldl9ub3RpZmllcik7CisJbXVsdGlwYXRoX2FsZ191bnJlZ2lzdGVyKCZkcnJfb3BzLCBJUF9NUF9BTEdfRFJSKTsKK30KKworbW9kdWxlX2luaXQoZHJyX2luaXQpOworbW9kdWxlX2V4aXQoZHJyX2V4aXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbXVsdGlwYXRoX3JhbmRvbS5jIGIvbmV0L2lwdjQvbXVsdGlwYXRoX3JhbmRvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNWExNmUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9tdWx0aXBhdGhfcmFuZG9tLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiAgICAgICAgICAgICAgUmFuZG9tIHBvbGljeSBmb3IgbXVsdGlwYXRoLgorICoKKyAqCisgKiBWZXJzaW9uOgkkSWQ6IG11bHRpcGF0aF9yYW5kb20uYyx2IDEuMS4yLjMgMjAwNC8wOS8yMSAwODo0MjoxMSBlbHVlY2sgRXhwICQKKyAqCisgKiBBdXRob3JzOglFaW5hciBMdWVjayA8ZWx1ZWNrQGRlLmlibS5jb20+PGxrbWxAZWluYXItbHVlY2suZGU+CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWdtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9pY21wLmg+CisjaW5jbHVkZSA8bmV0L3VkcC5oPgorI2luY2x1ZGUgPG5ldC9yYXcuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bmV0L2lwaXAuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxuZXQvaXBfbXBfYWxnLmg+CisKKyNkZWZpbmUgTVVMVElQQVRIX01BWF9DQU5ESURBVEVTIDQwCisKKy8qIGludGVyZmFjZSB0byByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgUkFORE9NX1NFRUQgPSA5MzE4Njc1MjsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcmFuZG9tKHVuc2lnbmVkIGludCB1Ym91bmQpCit7CisJc3RhdGljIHVuc2lnbmVkIGludCBhID0gMTU4ODYzNTY5NSwKKwkJcSA9IDIsCisJCXIgPSAxMTE3Njk1OTAxOworCisJUkFORE9NX1NFRUQgPSBhKihSQU5ET01fU0VFRCAlIHEpIC0gciooUkFORE9NX1NFRUQgLyBxKTsKKworCXJldHVybiBSQU5ET01fU0VFRCAlIHVib3VuZDsKK30KKworCitzdGF0aWMgdm9pZCByYW5kb21fc2VsZWN0X3JvdXRlKGNvbnN0IHN0cnVjdCBmbG93aSAqZmxwLAorCQkJCXN0cnVjdCBydGFibGUgKmZpcnN0LAorCQkJCXN0cnVjdCBydGFibGUgKipycCkKK3sKKwlzdHJ1Y3QgcnRhYmxlICpydDsKKwlzdHJ1Y3QgcnRhYmxlICpkZWNpc2lvbjsKKwl1bnNpZ25lZCBjaGFyIGNhbmRpZGF0ZV9jb3VudCA9IDA7CisKKwkvKiBjb3VudCBhbGwgY2FuZGlkYXRlICovCisJZm9yIChydCA9IHJjdV9kZXJlZmVyZW5jZShmaXJzdCk7IHJ0OworCSAgICAgcnQgPSByY3VfZGVyZWZlcmVuY2UocnQtPnUucnRfbmV4dCkpIHsKKwkJaWYgKChydC0+dS5kc3QuZmxhZ3MgJiBEU1RfQkFMQU5DRUQpICE9IDAgJiYKKwkJICAgIG11bHRpcGF0aF9jb21wYXJla2V5cygmcnQtPmZsLCBmbHApKQorCQkJKytjYW5kaWRhdGVfY291bnQ7CisJfQorCisJLyogY2hvb3NlIGEgcmFuZG9tIGNhbmRpZGF0ZSAqLworCWRlY2lzaW9uID0gZmlyc3Q7CisJaWYgKGNhbmRpZGF0ZV9jb3VudCA+IDEpIHsKKwkJdW5zaWduZWQgY2hhciBpID0gMDsKKwkJdW5zaWduZWQgY2hhciBjYW5kaWRhdGVfbm8gPSAodW5zaWduZWQgY2hhcikKKwkJCXJhbmRvbShjYW5kaWRhdGVfY291bnQpOworCisJCS8qIGZpbmQgY2hvc2VuIGNhbmRpZGF0ZSBhbmQgYWRqdXN0IEdDIGRhdGEgZm9yIGFsbCBjYW5kaWRhdGVzCisJCSAqIHRvIGVuc3VyZSB0aGV5IHN0YXkgaW4gY2FjaGUKKwkJICovCisJCWZvciAocnQgPSBmaXJzdDsgcnQ7IHJ0ID0gcnQtPnUucnRfbmV4dCkgeworCQkJaWYgKChydC0+dS5kc3QuZmxhZ3MgJiBEU1RfQkFMQU5DRUQpICE9IDAgJiYKKwkJCSAgICBtdWx0aXBhdGhfY29tcGFyZWtleXMoJnJ0LT5mbCwgZmxwKSkgeworCQkJCXJ0LT51LmRzdC5sYXN0dXNlID0gamlmZmllczsKKworCQkJCWlmIChpID09IGNhbmRpZGF0ZV9ubykKKwkJCQkJZGVjaXNpb24gPSBydDsKKworCQkJCWlmIChpID49IGNhbmRpZGF0ZV9jb3VudCkKKwkJCQkJYnJlYWs7CisKKwkJCQlpKys7CisJCQl9CisJCX0KKwl9CisKKwlkZWNpc2lvbi0+dS5kc3QuX191c2UrKzsKKwkqcnAgPSBkZWNpc2lvbjsKK30KKworc3RhdGljIHN0cnVjdCBpcF9tcF9hbGdfb3BzIHJhbmRvbV9vcHMgPSB7CisJLm1wX2FsZ19zZWxlY3Rfcm91dGUJPQlyYW5kb21fc2VsZWN0X3JvdXRlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcmFuZG9tX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gbXVsdGlwYXRoX2FsZ19yZWdpc3RlcigmcmFuZG9tX29wcywgSVBfTVBfQUxHX1JBTkRPTSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCByYW5kb21fZXhpdCh2b2lkKQoreworCW11bHRpcGF0aF9hbGdfdW5yZWdpc3RlcigmcmFuZG9tX29wcywgSVBfTVBfQUxHX1JBTkRPTSk7Cit9CisKK21vZHVsZV9pbml0KHJhbmRvbV9pbml0KTsKK21vZHVsZV9leGl0KHJhbmRvbV9leGl0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L211bHRpcGF0aF9yci5jIGIvbmV0L2lwdjQvbXVsdGlwYXRoX3JyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0YTgyNQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L211bHRpcGF0aF9yci5jCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogICAgICAgICAgICAgIFJvdW5kIHJvYmluIHBvbGljeSBmb3IgbXVsdGlwYXRoLgorICoKKyAqCisgKiBWZXJzaW9uOgkkSWQ6IG11bHRpcGF0aF9yci5jLHYgMS4xLjIuMiAyMDA0LzA5LzE2IDA3OjQyOjM0IGVsdWVjayBFeHAgJAorICoKKyAqIEF1dGhvcnM6CUVpbmFyIEx1ZWNrIDxlbHVlY2tAZGUuaWJtLmNvbT48bGttbEBlaW5hci1sdWVjay5kZT4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZ21wLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXJvdXRlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2ljbXAuaD4KKyNpbmNsdWRlIDxuZXQvdWRwLmg+CisjaW5jbHVkZSA8bmV0L3Jhdy5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNpbmNsdWRlIDxuZXQvaXBpcC5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorI2luY2x1ZGUgPG5ldC9pcF9tcF9hbGcuaD4KKworI2RlZmluZSBNVUxUSVBBVEhfTUFYX0NBTkRJREFURVMgNDAKKworc3RhdGljIHN0cnVjdCBydGFibGUqIGxhc3RfdXNlZCA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIHJyX3JlbW92ZShzdHJ1Y3QgcnRhYmxlICpydCkKK3sKKwlpZiAobGFzdF91c2VkID09IHJ0KQorCQlsYXN0X3VzZWQgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBycl9zZWxlY3Rfcm91dGUoY29uc3Qgc3RydWN0IGZsb3dpICpmbHAsCisJCQkgICAgc3RydWN0IHJ0YWJsZSAqZmlyc3QsIHN0cnVjdCBydGFibGUgKipycCkKK3sKKwlzdHJ1Y3QgcnRhYmxlICpuaCwgKnJlc3VsdCwgKm1pbl91c2VfY2FuZCA9IE5VTEw7CisJaW50IG1pbl91c2UgPSAtMTsKKworCS8qIGlmIG5lY2Vzc2FyeSBhbmQgcG9zc2libGUgdXRpbGl6ZSB0aGUgb2xkIGFsdGVybmF0aXZlICovCisJaWYgKChmbHAtPmZsYWdzICYgRkxPV0lfRkxBR19NVUxUSVBBVEhPTERST1VURSkgIT0gMCAmJgorCSAgICBsYXN0X3VzZWQgIT0gTlVMTCkgeworCQlyZXN1bHQgPSBsYXN0X3VzZWQ7CisJCWdvdG8gb3V0OworCX0KKworCS8qIDEuIG1ha2Ugc3VyZSBhbGwgYWx0LiBuZXh0aG9wcyBoYXZlIHRoZSBzYW1lIEdDIHJlbGF0ZWQgZGF0YQorCSAqIDIuIGRldGVybWluZSB0aGUgbmV3IGNhbmRpZGF0ZSB0byBiZSByZXR1cm5lZAorCSAqLworCXJlc3VsdCA9IE5VTEw7CisJZm9yIChuaCA9IHJjdV9kZXJlZmVyZW5jZShmaXJzdCk7IG5oOworIAkgICAgIG5oID0gcmN1X2RlcmVmZXJlbmNlKG5oLT51LnJ0X25leHQpKSB7CisJCWlmICgobmgtPnUuZHN0LmZsYWdzICYgRFNUX0JBTEFOQ0VEKSAhPSAwICYmCisJCSAgICBtdWx0aXBhdGhfY29tcGFyZWtleXMoJm5oLT5mbCwgZmxwKSkgeworCQkJbmgtPnUuZHN0Lmxhc3R1c2UgPSBqaWZmaWVzOworCisJCQlpZiAobWluX3VzZSA9PSAtMSB8fCBuaC0+dS5kc3QuX191c2UgPCBtaW5fdXNlKSB7CisJCQkJbWluX3VzZSA9IG5oLT51LmRzdC5fX3VzZTsKKwkJCQltaW5fdXNlX2NhbmQgPSBuaDsKKwkJCX0KKwkJfQorCX0KKwlyZXN1bHQgPSBtaW5fdXNlX2NhbmQ7CisJaWYgKCFyZXN1bHQpCisJCXJlc3VsdCA9IGZpcnN0OworCitvdXQ6CisJbGFzdF91c2VkID0gcmVzdWx0OworCXJlc3VsdC0+dS5kc3QuX191c2UrKzsKKwkqcnAgPSByZXN1bHQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXBfbXBfYWxnX29wcyBycl9vcHMgPSB7CisJLm1wX2FsZ19zZWxlY3Rfcm91dGUJPQlycl9zZWxlY3Rfcm91dGUsCisJLm1wX2FsZ19yZW1vdmUJCT0JcnJfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcnJfaW5pdCh2b2lkKQoreworCXJldHVybiBtdWx0aXBhdGhfYWxnX3JlZ2lzdGVyKCZycl9vcHMsIElQX01QX0FMR19SUik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBycl9leGl0KHZvaWQpCit7CisJbXVsdGlwYXRoX2FsZ191bnJlZ2lzdGVyKCZycl9vcHMsIElQX01QX0FMR19SUik7Cit9CisKK21vZHVsZV9pbml0KHJyX2luaXQpOworbW9kdWxlX2V4aXQocnJfZXhpdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9tdWx0aXBhdGhfd3JhbmRvbS5jIGIvbmV0L2lwdjQvbXVsdGlwYXRoX3dyYW5kb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGIyM2UxCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbXVsdGlwYXRoX3dyYW5kb20uYwpAQCAtMCwwICsxLDM0NCBAQAorLyoKKyAqICAgICAgICAgICAgICBXZWlnaHRlZCByYW5kb20gcG9saWN5IGZvciBtdWx0aXBhdGguCisgKgorICoKKyAqIFZlcnNpb246CSRJZDogbXVsdGlwYXRoX3dyYW5kb20uYyx2IDEuMS4yLjMgMjAwNC8wOS8yMiAwNzo1MTo0MCBlbHVlY2sgRXhwICQKKyAqCisgKiBBdXRob3JzOglFaW5hciBMdWVjayA8ZWx1ZWNrQGRlLmlibS5jb20+PGxrbWxAZWluYXItbHVlY2suZGU+CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWdtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9pY21wLmg+CisjaW5jbHVkZSA8bmV0L3VkcC5oPgorI2luY2x1ZGUgPG5ldC9yYXcuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bmV0L2lwaXAuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxuZXQvaXBfZmliLmg+CisjaW5jbHVkZSA8bmV0L2lwX21wX2FsZy5oPgorCisjZGVmaW5lIE1VTFRJUEFUSF9TVEFURV9TSVpFIDE1CisKK3N0cnVjdCBtdWx0aXBhdGhfY2FuZGlkYXRlIHsKKwlzdHJ1Y3QgbXVsdGlwYXRoX2NhbmRpZGF0ZQkqbmV4dDsKKwlpbnQJCQkJcG93ZXI7CisJc3RydWN0IHJ0YWJsZQkJCSpydDsKK307CisKK3N0cnVjdCBtdWx0aXBhdGhfZGVzdCB7CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworCisJY29uc3Qgc3RydWN0IGZpYl9uaAkqbmhfaW5mbzsKKwlfX3UzMgkJCW5ldG1hc2s7CisJX191MzIJCQluZXR3b3JrOworCXVuc2lnbmVkIGNoYXIJCXByZWZpeGxlbjsKKworCXN0cnVjdCByY3VfaGVhZAkJcmN1OworfTsKKworc3RydWN0IG11bHRpcGF0aF9idWNrZXQgeworCXN0cnVjdCBsaXN0X2hlYWQJaGVhZDsKKwlzcGlubG9ja190CQlsb2NrOworfTsKKworc3RydWN0IG11bHRpcGF0aF9yb3V0ZSB7CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworCisJaW50CQkJb2lmOworCV9fdTMyCQkJZ3c7CisJc3RydWN0IGxpc3RfaGVhZAlkZXN0czsKKworCXN0cnVjdCByY3VfaGVhZAkJcmN1OworfTsKKworLyogc3RhdGU6IHByaW1hcmlseSB3ZWlnaHQgcGVyIHJvdXRlIGluZm9ybWF0aW9uICovCitzdGF0aWMgc3RydWN0IG11bHRpcGF0aF9idWNrZXQgc3RhdGVbTVVMVElQQVRIX1NUQVRFX1NJWkVdOworCisvKiBpbnRlcmZhY2UgdG8gcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uICovCitzdGF0aWMgdW5zaWduZWQgaW50IFJBTkRPTV9TRUVEID0gOTMxODY3NTI7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHJhbmRvbSh1bnNpZ25lZCBpbnQgdWJvdW5kKQoreworCXN0YXRpYyB1bnNpZ25lZCBpbnQgYSA9IDE1ODg2MzU2OTUsCisJCXEgPSAyLAorCQlyID0gMTExNzY5NTkwMTsKKwlSQU5ET01fU0VFRCA9IGEqKFJBTkRPTV9TRUVEICUgcSkgLSByKihSQU5ET01fU0VFRCAvIHEpOworCXJldHVybiBSQU5ET01fU0VFRCAlIHVib3VuZDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgX19tdWx0aXBhdGhfbG9va3VwX3dlaWdodChjb25zdCBzdHJ1Y3QgZmxvd2kgKmZsLAorCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IHJ0YWJsZSAqcnQpCit7CisJY29uc3QgaW50IHN0YXRlX2lkeCA9IHJ0LT5pZGV2LT5kZXYtPmlmaW5kZXggJSBNVUxUSVBBVEhfU1RBVEVfU0laRTsKKwlzdHJ1Y3QgbXVsdGlwYXRoX3JvdXRlICpyOworCXN0cnVjdCBtdWx0aXBhdGhfcm91dGUgKnRhcmdldF9yb3V0ZSA9IE5VTEw7CisJc3RydWN0IG11bHRpcGF0aF9kZXN0ICpkOworCWludCB3ZWlnaHQgPSAxOworCisJLyogbG9va3VwIHRoZSB3ZWlnaHQgaW5mb3JtYXRpb24gZm9yIGEgY2VydGFpbiByb3V0ZSAqLworCXJjdV9yZWFkX2xvY2soKTsKKworCS8qIGZpbmQgc3RhdGUgZW50cnkgZm9yIGdhdGV3YXkgb3IgYWRkIG9uZSBpZiBuZWNlc3NhcnkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShyLCAmc3RhdGVbc3RhdGVfaWR4XS5oZWFkLCBsaXN0KSB7CisJCWlmIChyLT5ndyA9PSBydC0+cnRfZ2F0ZXdheSAmJgorCQkgICAgci0+b2lmID09IHJ0LT5pZGV2LT5kZXYtPmlmaW5kZXgpIHsKKwkJCXRhcmdldF9yb3V0ZSA9IHI7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghdGFyZ2V0X3JvdXRlKSB7CisJCS8qIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uLi4gYnV0IHdlIGFyZSBwcmVwYXJlZCAqLworCQlwcmludGsoIEtFUk5fQ1JJVCIlczogbWlzc2luZyBzdGF0ZSBmb3IgZ2F0ZXdheTogJXUgYW5kICIgXAorCQkJImRldmljZSAlZFxuIiwgX19GVU5DVElPTl9fLCBydC0+cnRfZ2F0ZXdheSwKKwkJCXJ0LT5pZGV2LT5kZXYtPmlmaW5kZXgpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBmaW5kIHN0YXRlIGVudHJ5IGZvciBkZXN0aW5hdGlvbiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGQsICZ0YXJnZXRfcm91dGUtPmRlc3RzLCBsaXN0KSB7CisJCV9fdTMyIHRhcmdldG5ldHdvcmsgPSBmbC0+Zmw0X2RzdCAmIAorCQkJKDB4RkZGRkZGRkYgPj4gKDMyIC0gZC0+cHJlZml4bGVuKSk7CisKKwkJaWYgKCh0YXJnZXRuZXR3b3JrICYgZC0+bmV0bWFzaykgPT0gZC0+bmV0d29yaykgeworCQkJd2VpZ2h0ID0gZC0+bmhfaW5mby0+bmhfd2VpZ2h0OworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKK291dDoKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gd2VpZ2h0OworfQorCitzdGF0aWMgdm9pZCB3cmFuZG9tX2luaXRfc3RhdGUodm9pZCkgCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTVVMVElQQVRIX1NUQVRFX1NJWkU7ICsraSkgeworCQlJTklUX0xJU1RfSEVBRCgmc3RhdGVbaV0uaGVhZCk7CisJCXNwaW5fbG9ja19pbml0KCZzdGF0ZVtpXS5sb2NrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdyYW5kb21fc2VsZWN0X3JvdXRlKGNvbnN0IHN0cnVjdCBmbG93aSAqZmxwLAorCQkJCSBzdHJ1Y3QgcnRhYmxlICpmaXJzdCwKKwkJCQkgc3RydWN0IHJ0YWJsZSAqKnJwKQoreworCXN0cnVjdCBydGFibGUgKnJ0OworCXN0cnVjdCBydGFibGUgKmRlY2lzaW9uOworCXN0cnVjdCBtdWx0aXBhdGhfY2FuZGlkYXRlICpmaXJzdF9tcGMgPSBOVUxMOworCXN0cnVjdCBtdWx0aXBhdGhfY2FuZGlkYXRlICptcGMsICpsYXN0X21wYyA9IE5VTEw7CisJaW50IHBvd2VyID0gMDsKKwlpbnQgbGFzdF9wb3dlcjsKKwlpbnQgc2VsZWN0b3I7CisJY29uc3Qgc2l6ZV90IHNpemVfbXBjID0gc2l6ZW9mKHN0cnVjdCBtdWx0aXBhdGhfY2FuZGlkYXRlKTsKKworCS8qIGNvbGxlY3QgYWxsIGNhbmRpZGF0ZXMgYW5kIGlkZW50aWZ5IHRoZWlyIHdlaWdodHMgKi8KKwlmb3IgKHJ0ID0gcmN1X2RlcmVmZXJlbmNlKGZpcnN0KTsgcnQ7CisJICAgICBydCA9IHJjdV9kZXJlZmVyZW5jZShydC0+dS5ydF9uZXh0KSkgeworCQlpZiAoKHJ0LT51LmRzdC5mbGFncyAmIERTVF9CQUxBTkNFRCkgIT0gMCAmJgorCQkgICAgbXVsdGlwYXRoX2NvbXBhcmVrZXlzKCZydC0+ZmwsIGZscCkpIHsKKwkJCXN0cnVjdCBtdWx0aXBhdGhfY2FuZGlkYXRlKiBtcGMgPQorCQkJCShzdHJ1Y3QgbXVsdGlwYXRoX2NhbmRpZGF0ZSopCisJCQkJa21hbGxvYyhzaXplX21wYywgR0ZQX0tFUk5FTCk7CisKKwkJCWlmICghbXBjKQorCQkJCXJldHVybjsKKworCQkJcG93ZXIgKz0gX19tdWx0aXBhdGhfbG9va3VwX3dlaWdodChmbHAsIHJ0KSAqIDEwMDAwOworCisJCQltcGMtPnBvd2VyID0gcG93ZXI7CisJCQltcGMtPnJ0ID0gcnQ7CisJCQltcGMtPm5leHQgPSBOVUxMOworCisJCQlpZiAoIWZpcnN0X21wYykKKwkJCQlmaXJzdF9tcGMgPSBtcGM7CisJCQllbHNlCisJCQkJbGFzdF9tcGMtPm5leHQgPSBtcGM7CisKKwkJCWxhc3RfbXBjID0gbXBjOworCQl9CisJfQorCisJLyogY2hvb3NlIGEgd2VpZ2h0ZWQgcmFuZG9tIGNhbmRpZGF0ZSAqLworCWRlY2lzaW9uID0gZmlyc3Q7CisJc2VsZWN0b3IgPSByYW5kb20ocG93ZXIpOworCWxhc3RfcG93ZXIgPSAwOworCisJLyogc2VsZWN0IGNhbmRpZGF0ZSwgYWRqdXN0IEdDIGRhdGEgYW5kIGNsZWFudXAgbG9jYWwgc3RhdGUgKi8KKwlkZWNpc2lvbiA9IGZpcnN0OworCWxhc3RfbXBjID0gTlVMTDsKKwlmb3IgKG1wYyA9IGZpcnN0X21wYzsgbXBjOyBtcGMgPSBtcGMtPm5leHQpIHsKKwkJbXBjLT5ydC0+dS5kc3QubGFzdHVzZSA9IGppZmZpZXM7CisJCWlmIChsYXN0X3Bvd2VyIDw9IHNlbGVjdG9yICYmIHNlbGVjdG9yIDwgbXBjLT5wb3dlcikKKwkJCWRlY2lzaW9uID0gbXBjLT5ydDsKKworCQlsYXN0X3Bvd2VyID0gbXBjLT5wb3dlcjsKKwkJaWYgKGxhc3RfbXBjKQorCQkJa2ZyZWUobGFzdF9tcGMpOworCisJCWxhc3RfbXBjID0gbXBjOworCX0KKworCWlmIChsYXN0X21wYykgeworCQkvKiBjb25jdXJyZW50IF9fbXVsdGlwYXRoX2ZsdXNoIG1heSBsZWFkIHRvICFsYXN0X21wYyAqLworCQlrZnJlZShsYXN0X21wYyk7CisJfQorCisJZGVjaXNpb24tPnUuZHN0Ll9fdXNlKys7CisJKnJwID0gZGVjaXNpb247Cit9CisKK3N0YXRpYyB2b2lkIHdyYW5kb21fc2V0X25oaW5mbyhfX3UzMiBuZXR3b3JrLAorCQkJICAgICAgIF9fdTMyIG5ldG1hc2ssCisJCQkgICAgICAgdW5zaWduZWQgY2hhciBwcmVmaXhsZW4sCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGZpYl9uaCAqbmgpCit7CisJY29uc3QgaW50IHN0YXRlX2lkeCA9IG5oLT5uaF9vaWYgJSBNVUxUSVBBVEhfU1RBVEVfU0laRTsKKwlzdHJ1Y3QgbXVsdGlwYXRoX3JvdXRlICpyLCAqdGFyZ2V0X3JvdXRlID0gTlVMTDsKKwlzdHJ1Y3QgbXVsdGlwYXRoX2Rlc3QgKmQsICp0YXJnZXRfZGVzdCA9IE5VTEw7CisKKwkvKiBzdG9yZSB0aGUgd2VpZ2h0IGluZm9ybWF0aW9uIGZvciBhIGNlcnRhaW4gcm91dGUgKi8KKwlzcGluX2xvY2soJnN0YXRlW3N0YXRlX2lkeF0ubG9jayk7CisKKwkvKiBmaW5kIHN0YXRlIGVudHJ5IGZvciBnYXRld2F5IG9yIGFkZCBvbmUgaWYgbmVjZXNzYXJ5ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UociwgJnN0YXRlW3N0YXRlX2lkeF0uaGVhZCwgbGlzdCkgeworCQlpZiAoci0+Z3cgPT0gbmgtPm5oX2d3ICYmIHItPm9pZiA9PSBuaC0+bmhfb2lmKSB7CisJCQl0YXJnZXRfcm91dGUgPSByOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIXRhcmdldF9yb3V0ZSkgeworCQljb25zdCBzaXplX3Qgc2l6ZV9ydCA9IHNpemVvZihzdHJ1Y3QgbXVsdGlwYXRoX3JvdXRlKTsKKwkJdGFyZ2V0X3JvdXRlID0gKHN0cnVjdCBtdWx0aXBhdGhfcm91dGUgKikKKwkJCWttYWxsb2Moc2l6ZV9ydCwgR0ZQX0tFUk5FTCk7CisKKwkJdGFyZ2V0X3JvdXRlLT5ndyA9IG5oLT5uaF9ndzsKKwkJdGFyZ2V0X3JvdXRlLT5vaWYgPSBuaC0+bmhfb2lmOworCQltZW1zZXQoJnRhcmdldF9yb3V0ZS0+cmN1LCAwLCBzaXplb2Yoc3RydWN0IHJjdV9oZWFkKSk7CisJCUlOSVRfTElTVF9IRUFEKCZ0YXJnZXRfcm91dGUtPmRlc3RzKTsKKworCQlsaXN0X2FkZF9yY3UoJnRhcmdldF9yb3V0ZS0+bGlzdCwgJnN0YXRlW3N0YXRlX2lkeF0uaGVhZCk7CisJfQorCisJLyogZmluZCBzdGF0ZSBlbnRyeSBmb3IgZGVzdGluYXRpb24gb3IgYWRkIG9uZSBpZiBuZWNlc3NhcnkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShkLCAmdGFyZ2V0X3JvdXRlLT5kZXN0cywgbGlzdCkgeworCQlpZiAoZC0+bmhfaW5mbyA9PSBuaCkgeworCQkJdGFyZ2V0X2Rlc3QgPSBkOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIXRhcmdldF9kZXN0KSB7CisJCWNvbnN0IHNpemVfdCBzaXplX2RzdCA9IHNpemVvZihzdHJ1Y3QgbXVsdGlwYXRoX2Rlc3QpOworCQl0YXJnZXRfZGVzdCA9IChzdHJ1Y3QgbXVsdGlwYXRoX2Rlc3QqKQorCQkJa21hbGxvYyhzaXplX2RzdCwgR0ZQX0tFUk5FTCk7CisKKwkJdGFyZ2V0X2Rlc3QtPm5oX2luZm8gPSBuaDsKKwkJdGFyZ2V0X2Rlc3QtPm5ldHdvcmsgPSBuZXR3b3JrOworCQl0YXJnZXRfZGVzdC0+bmV0bWFzayA9IG5ldG1hc2s7CisJCXRhcmdldF9kZXN0LT5wcmVmaXhsZW4gPSBwcmVmaXhsZW47CisJCW1lbXNldCgmdGFyZ2V0X2Rlc3QtPnJjdSwgMCwgc2l6ZW9mKHN0cnVjdCByY3VfaGVhZCkpOworCisJCWxpc3RfYWRkX3JjdSgmdGFyZ2V0X2Rlc3QtPmxpc3QsICZ0YXJnZXRfcm91dGUtPmRlc3RzKTsKKwl9CisJLyogZWxzZTogd2UgYWxyZWFkeSBzdG9yZWQgdGhpcyBpbmZvIGZvciBhbm90aGVyIGRlc3RpbmF0aW9uID0+CisJICogd2UgYXJlIGZpbmlzaGVkCisJICovCisKKwlzcGluX3VubG9jaygmc3RhdGVbc3RhdGVfaWR4XS5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgX19tdWx0aXBhdGhfZnJlZShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IG11bHRpcGF0aF9yb3V0ZSAqcnQgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IG11bHRpcGF0aF9yb3V0ZSwKKwkJCQkJCSAgcmN1KTsKKwlrZnJlZShydCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fbXVsdGlwYXRoX2ZyZWVfZHN0KHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3sKKyAgCXN0cnVjdCBtdWx0aXBhdGhfZGVzdCAqZHN0ID0gY29udGFpbmVyX29mKGhlYWQsCisJCQkJCQkgIHN0cnVjdCBtdWx0aXBhdGhfZGVzdCwKKwkJCQkJCSAgcmN1KTsKKwlrZnJlZShkc3QpOworfQorCitzdGF0aWMgdm9pZCB3cmFuZG9tX2ZsdXNoKHZvaWQpCit7CisJaW50IGk7CisKKwkvKiBkZWZlcmUgZGVsZXRlIHRvIGFsbCBlbnRyaWVzICovCisJZm9yIChpID0gMDsgaSA8IE1VTFRJUEFUSF9TVEFURV9TSVpFOyArK2kpIHsKKwkJc3RydWN0IG11bHRpcGF0aF9yb3V0ZSAqcjsKKworCQlzcGluX2xvY2soJnN0YXRlW2ldLmxvY2spOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShyLCAmc3RhdGVbaV0uaGVhZCwgbGlzdCkgeworCQkJc3RydWN0IG11bHRpcGF0aF9kZXN0ICpkOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZCwgJnItPmRlc3RzLCBsaXN0KSB7CisJCQkJbGlzdF9kZWxfcmN1KCZkLT5saXN0KTsKKwkJCQljYWxsX3JjdSgmZC0+cmN1LAorCQkJCQkgX19tdWx0aXBhdGhfZnJlZV9kc3QpOworCQkJfQorCQkJbGlzdF9kZWxfcmN1KCZyLT5saXN0KTsKKwkJCWNhbGxfcmN1KCZyLT5yY3UsCisJCQkJIF9fbXVsdGlwYXRoX2ZyZWUpOworCQl9CisKKwkJc3Bpbl91bmxvY2soJnN0YXRlW2ldLmxvY2spOworCX0KK30KKworc3RhdGljIHN0cnVjdCBpcF9tcF9hbGdfb3BzIHdyYW5kb21fb3BzID0geworCS5tcF9hbGdfc2VsZWN0X3JvdXRlCT0Jd3JhbmRvbV9zZWxlY3Rfcm91dGUsCisJLm1wX2FsZ19mbHVzaAkJPQl3cmFuZG9tX2ZsdXNoLAorCS5tcF9hbGdfc2V0X25oaW5mbwk9CXdyYW5kb21fc2V0X25oaW5mbywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHdyYW5kb21faW5pdCh2b2lkKQoreworCXdyYW5kb21faW5pdF9zdGF0ZSgpOworCisJcmV0dXJuIG11bHRpcGF0aF9hbGdfcmVnaXN0ZXIoJndyYW5kb21fb3BzLCBJUF9NUF9BTEdfV1JBTkRPTSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3cmFuZG9tX2V4aXQodm9pZCkKK3sKKwltdWx0aXBhdGhfYWxnX3VucmVnaXN0ZXIoJndyYW5kb21fb3BzLCBJUF9NUF9BTEdfV1JBTkRPTSk7Cit9CisKK21vZHVsZV9pbml0KHdyYW5kb21faW5pdCk7Cittb2R1bGVfZXhpdCh3cmFuZG9tX2V4aXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmQ0Y2IxCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTAsMCArMSw2OTYgQEAKKyMKKyMgSVAgbmV0ZmlsdGVyIGNvbmZpZ3VyYXRpb24KKyMKKworbWVudSAiSVA6IE5ldGZpbHRlciBDb25maWd1cmF0aW9uIgorCWRlcGVuZHMgb24gSU5FVCAmJiBORVRGSUxURVIKKworIyBjb25uZWN0aW9uIHRyYWNraW5nLCBoZWxwZXJzIGFuZCBwcm90b2NvbHMKK2NvbmZpZyBJUF9ORl9DT05OVFJBQ0sKKwl0cmlzdGF0ZSAiQ29ubmVjdGlvbiB0cmFja2luZyAocmVxdWlyZWQgZm9yIG1hc3EvTkFUKSIKKwktLS1oZWxwLS0tCisJICBDb25uZWN0aW9uIHRyYWNraW5nIGtlZXBzIGEgcmVjb3JkIG9mIHdoYXQgcGFja2V0cyBoYXZlIHBhc3NlZAorCSAgdGhyb3VnaCB5b3VyIG1hY2hpbmUsIGluIG9yZGVyIHRvIGZpZ3VyZSBvdXQgaG93IHRoZXkgYXJlIHJlbGF0ZWQKKwkgIGludG8gY29ubmVjdGlvbnMuCisKKwkgIFRoaXMgaXMgcmVxdWlyZWQgdG8gZG8gTWFzcXVlcmFkaW5nIG9yIG90aGVyIGtpbmRzIG9mIE5ldHdvcmsKKwkgIEFkZHJlc3MgVHJhbnNsYXRpb24gKGV4Y2VwdCBmb3IgRmFzdCBOQVQpLiAgSXQgY2FuIGFsc28gYmUgdXNlZCB0bworCSAgZW5oYW5jZSBwYWNrZXQgZmlsdGVyaW5nIChzZWUgYENvbm5lY3Rpb24gc3RhdGUgbWF0Y2ggc3VwcG9ydCcKKwkgIGJlbG93KS4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBJUF9ORl9DVF9BQ0NUCisJYm9vbCAiQ29ubmVjdGlvbiB0cmFja2luZyBmbG93IGFjY291bnRpbmciCisJZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sKKwloZWxwCisJICBJZiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGUgY29ubmVjdGlvbiB0cmFja2luZyBjb2RlIHdpbGwKKwkgIGtlZXAgcGVyLWZsb3cgcGFja2V0IGFuZCBieXRlIGNvdW50ZXJzLgorCisJICBUaG9zZSBjb3VudGVycyBjYW4gYmUgdXNlZCBmb3IgZmxvdy1iYXNlZCBhY2NvdW50aW5nIG9yIHRoZQorCSAgYGNvbm5ieXRlcycgbWF0Y2guCisKKwkgIElmIHVuc3VyZSwgc2F5IGBOJy4KKworY29uZmlnIElQX05GX0NPTk5UUkFDS19NQVJLCisJYm9vbCAgJ0Nvbm5lY3Rpb24gbWFyayB0cmFja2luZyBzdXBwb3J0JworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgY29ubmVjdGlvbiBtYXJrcywgdXNlZCBieSB0aGUKKwkgIGBDT05OTUFSSycgdGFyZ2V0IGFuZCBgY29ubm1hcmsnIG1hdGNoLiBTaW1pbGFyIHRvIHRoZSBtYXJrIHZhbHVlCisJICBvZiBwYWNrZXRzLCBidXQgdGhpcyBtYXJrIHZhbHVlIGlzIGtlcHQgaW4gdGhlIGNvbm50cmFjayBzZXNzaW9uCisJICBpbnN0ZWFkIG9mIHRoZSBpbmRpdmlkdWFsIHBhY2tldHMuCisJCitjb25maWcgSVBfTkZfQ1RfUFJPVE9fU0NUUAorCXRyaXN0YXRlICAnU0NUUCBwcm90b2NvbCBjb25uZWN0aW9uIHRyYWNraW5nIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCknCisJZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgV2l0aCB0aGlzIG9wdGlvbiBlbmFibGVkLCB0aGUgY29ubmVjdGlvbiB0cmFja2luZyBjb2RlIHdpbGwKKwkgIGJlIGFibGUgdG8gZG8gc3RhdGUgdHJhY2tpbmcgb24gU0NUUCBjb25uZWN0aW9ucy4KKworCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uICBJZiB1bnN1cmUsIHNheSBgTicuCisKK2NvbmZpZyBJUF9ORl9GVFAKKwl0cmlzdGF0ZSAiRlRQIHByb3RvY29sIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sKKwloZWxwCisJICBUcmFja2luZyBGVFAgY29ubmVjdGlvbnMgaXMgcHJvYmxlbWF0aWM6IHNwZWNpYWwgaGVscGVycyBhcmUKKwkgIHJlcXVpcmVkIGZvciB0cmFja2luZyB0aGVtLCBhbmQgZG9pbmcgbWFzcXVlcmFkaW5nIGFuZCBvdGhlciBmb3JtcworCSAgb2YgTmV0d29yayBBZGRyZXNzIFRyYW5zbGF0aW9uIG9uIHRoZW0uCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgSVBfTkZfSVJDCisJdHJpc3RhdGUgIklSQyBwcm90b2NvbCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLCisJLS0taGVscC0tLQorCSAgVGhlcmUgaXMgYSBjb21tb25seS11c2VkIGV4dGVuc2lvbiB0byBJUkMgY2FsbGVkCisJICBEaXJlY3QgQ2xpZW50LXRvLUNsaWVudCBQcm90b2NvbCAoRENDKS4gIFRoaXMgZW5hYmxlcyB1c2VycyB0byBzZW5kCisJICBmaWxlcyB0byBlYWNoIG90aGVyLCBhbmQgYWxzbyBjaGF0IHRvIGVhY2ggb3RoZXIgd2l0aG91dCB0aGUgbmVlZAorCSAgb2YgYSBzZXJ2ZXIuICBEQ0MgU2VuZGluZyBpcyB1c2VkIGFueXdoZXJlIHlvdSBzZW5kIGZpbGVzIG92ZXIgSVJDLAorCSAgYW5kIERDQyBDaGF0IGlzIG1vc3QgY29tbW9ubHkgdXNlZCBieSBFZ2dkcm9wIGJvdHMuICBJZiB5b3UgYXJlCisJICB1c2luZyBOQVQsIHRoaXMgZXh0ZW5zaW9uIHdpbGwgZW5hYmxlIHlvdSB0byBzZW5kIGZpbGVzIGFuZCBpbml0aWF0ZQorCSAgY2hhdHMuICBOb3RlIHRoYXQgeW91IGRvIE5PVCBuZWVkIHRoaXMgZXh0ZW5zaW9uIHRvIGdldCBmaWxlcyBvcgorCSAgaGF2ZSBvdGhlcnMgaW5pdGlhdGUgY2hhdHMsIG9yIGV2ZXJ5dGhpbmcgZWxzZSBpbiBJUkMuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgSVBfTkZfVEZUUAorCXRyaXN0YXRlICJURlRQIHByb3RvY29sIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sKKwloZWxwCisJICBURlRQIGNvbm5lY3Rpb24gdHJhY2tpbmcgaGVscGVyLCB0aGlzIGlzIHJlcXVpcmVkIGRlcGVuZGluZworCSAgb24gaG93IHJlc3RyaWN0aXZlIHlvdXIgcnVsZXNldCBpcy4KKwkgIElmIHlvdSBhcmUgdXNpbmcgYSB0ZnRwIGNsaWVudCBiZWhpbmQgLWogU05BVCBvciAtaiBNQVNRVUVSQURJTkcKKwkgIHlvdSB3aWxsIG5lZWQgdGhpcy4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IFkuCisKK2NvbmZpZyBJUF9ORl9BTUFOREEKKwl0cmlzdGF0ZSAiQW1hbmRhIGJhY2t1cCBwcm90b2NvbCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLCisJaGVscAorCSAgSWYgeW91IGFyZSBydW5uaW5nIHRoZSBBbWFuZGEgYmFja3VwIHBhY2thZ2UgPGh0dHA6Ly93d3cuYW1hbmRhLm9yZy8+CisJICBvbiB0aGlzIG1hY2hpbmUgb3IgbWFjaGluZXMgdGhhdCB3aWxsIGJlIE1BU1FVRVJBREVEIHRocm91Z2ggdGhpcworCSAgbWFjaGluZSwgdGhlbiB5b3UgbWF5IHdhbnQgdG8gZW5hYmxlIHRoaXMgZmVhdHVyZS4gIFRoaXMgYWxsb3dzIHRoZQorCSAgY29ubmVjdGlvbiB0cmFja2luZyBhbmQgbmF0dGluZyBjb2RlIHRvIGFsbG93IHRoZSBzdWItY2hhbm5lbHMgdGhhdAorCSAgQW1hbmRhIHJlcXVpcmVzIGZvciBjb21tdW5pY2F0aW9uIG9mIHRoZSBiYWNrdXAgZGF0YSwgbWVzc2FnZXMgYW5kCisJICBpbmRleC4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IFkuCisKK2NvbmZpZyBJUF9ORl9RVUVVRQorCXRyaXN0YXRlICJVc2Vyc3BhY2UgcXVldWVpbmcgdmlhIE5FVExJTksiCisJaGVscAorCSAgTmV0ZmlsdGVyIGhhcyB0aGUgYWJpbGl0eSB0byBxdWV1ZSBwYWNrZXRzIHRvIHVzZXIgc3BhY2U6IHRoZQorCSAgbmV0bGluayBkZXZpY2UgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZW0gdXNpbmcgdGhpcyBkcml2ZXIuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgSVBfTkZfSVBUQUJMRVMKKwl0cmlzdGF0ZSAiSVAgdGFibGVzIHN1cHBvcnQgKHJlcXVpcmVkIGZvciBmaWx0ZXJpbmcvbWFzcS9OQVQpIgorCWhlbHAKKwkgIGlwdGFibGVzIGlzIGEgZ2VuZXJhbCwgZXh0ZW5zaWJsZSBwYWNrZXQgaWRlbnRpZmljYXRpb24gZnJhbWV3b3JrLgorCSAgVGhlIHBhY2tldCBmaWx0ZXJpbmcgYW5kIGZ1bGwgTkFUIChtYXNxdWVyYWRpbmcsIHBvcnQgZm9yd2FyZGluZywKKwkgIGV0Yykgc3Vic3lzdGVtcyBub3cgdXNlIHRoaXM6IHNheSBgWScgb3IgYE0nIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlCisJICBlaXRoZXIgb2YgdGhvc2UuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCisjIFRoZSBtYXRjaGVzLgorY29uZmlnIElQX05GX01BVENIX0xJTUlUCisJdHJpc3RhdGUgImxpbWl0IG1hdGNoIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUworCWhlbHAKKwkgIGxpbWl0IG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gY29udHJvbCB0aGUgcmF0ZSBhdCB3aGljaCBhIHJ1bGUgY2FuIGJlCisJICBtYXRjaGVkOiBtYWlubHkgdXNlZnVsIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIExPRyB0YXJnZXQgKCJMT0cKKwkgIHRhcmdldCBzdXBwb3J0IiwgYmVsb3cpIGFuZCB0byBhdm9pZCBzb21lIERlbmlhbCBvZiBTZXJ2aWNlIGF0dGFja3MuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgSVBfTkZfTUFUQ0hfSVBSQU5HRQorCXRyaXN0YXRlICJJUCByYW5nZSBtYXRjaCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBtYWtlcyBwb3NzaWJsZSB0byBtYXRjaCBJUCBhZGRyZXNzZXMgYWdhaW5zdCBJUCBhZGRyZXNzCisJICByYW5nZXMuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgSVBfTkZfTUFUQ0hfTUFDCisJdHJpc3RhdGUgIk1BQyBhZGRyZXNzIG1hdGNoIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUworCWhlbHAKKwkgIE1BQyBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIHBhY2tldHMgYmFzZWQgb24gdGhlIHNvdXJjZQorCSAgRXRoZXJuZXQgYWRkcmVzcyBvZiB0aGUgcGFja2V0LgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIElQX05GX01BVENIX1BLVFRZUEUKKwl0cmlzdGF0ZSAiUGFja2V0IHR5cGUgbWF0Y2ggc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCisJaGVscAorICAgICAgICAgUGFja2V0IHR5cGUgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBhIHBhY2tldCBieQorICAgICAgICAgaXRzICJjbGFzcyIsIGVnLiBCUk9BRENBU1QsIE1VTFRJQ0FTVCwgLi4uCisKKwkgIFR5cGljYWwgdXNhZ2U6CisJICBpcHRhYmxlcyAtQSBJTlBVVCAtbSBwa3R0eXBlIC0tcGt0LXR5cGUgYnJvYWRjYXN0IC1qIExPRworCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIElQX05GX01BVENIX01BUksKKwl0cmlzdGF0ZSAibmV0ZmlsdGVyIE1BUksgbWF0Y2ggc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCisJaGVscAorCSAgTmV0ZmlsdGVyIG1hcmsgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBwYWNrZXRzIGJhc2VkIG9uIHRoZQorCSAgYG5mbWFyaycgdmFsdWUgaW4gdGhlIHBhY2tldC4gIFRoaXMgY2FuIGJlIHNldCBieSB0aGUgTUFSSyB0YXJnZXQKKwkgIChzZWUgYmVsb3cpLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIElQX05GX01BVENIX01VTFRJUE9SVAorCXRyaXN0YXRlICJNdWx0aXBsZSBwb3J0IG1hdGNoIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUworCWhlbHAKKwkgIE11bHRpcG9ydCBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIFRDUCBvciBVRFAgcGFja2V0cyBiYXNlZCBvbgorCSAgYSBzZXJpZXMgb2Ygc291cmNlIG9yIGRlc3RpbmF0aW9uIHBvcnRzOiBub3JtYWxseSBhIHJ1bGUgY2FuIG9ubHkKKwkgIG1hdGNoIGEgc2luZ2xlIHJhbmdlIG9mIHBvcnRzLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIElQX05GX01BVENIX1RPUworCXRyaXN0YXRlICJUT1MgbWF0Y2ggc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCisJaGVscAorCSAgVE9TIG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggcGFja2V0cyBiYXNlZCBvbiB0aGUgVHlwZSBPZgorCSAgU2VydmljZSBmaWVsZHMgb2YgdGhlIElQIHBhY2tldC4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBJUF9ORl9NQVRDSF9SRUNFTlQKKwl0cmlzdGF0ZSAicmVjZW50IG1hdGNoIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUworCWhlbHAKKwkgIFRoaXMgbWF0Y2ggaXMgdXNlZCBmb3IgY3JlYXRpbmcgb25lIG9yIG1hbnkgbGlzdHMgb2YgcmVjZW50bHkKKwkgIHVzZWQgYWRkcmVzc2VzIGFuZCB0aGVuIG1hdGNoaW5nIGFnYWluc3QgdGhhdC90aG9zZSBsaXN0KHMpLgorCisJICBTaG9ydCBvcHRpb25zIGFyZSBhdmFpbGFibGUgYnkgdXNpbmcgJ2lwdGFibGVzIC1tIHJlY2VudCAtaCcKKwkgIE9mZmljaWFsIFdlYnNpdGU6IDxodHRwOi8vc25vd21hbi5uZXQvcHJvamVjdHMvaXB0X3JlY2VudC8+CisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgSVBfTkZfTUFUQ0hfRUNOCisJdHJpc3RhdGUgIkVDTiBtYXRjaCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYEVDTicgbWF0Y2gsIHdoaWNoIGFsbG93cyB5b3UgdG8gbWF0Y2ggYWdhaW5zdAorCSAgdGhlIElQdjQgYW5kIFRDUCBoZWFkZXIgRUNOIGZpZWxkcy4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBJUF9ORl9NQVRDSF9EU0NQCisJdHJpc3RhdGUgIkRTQ1AgbWF0Y2ggc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBEU0NQJyBtYXRjaCwgd2hpY2ggYWxsb3dzIHlvdSB0byBtYXRjaCBhZ2FpbnN0CisJICB0aGUgSVB2NCBoZWFkZXIgRFNDUCBmaWVsZCAoRFNDUCBjb2RlcG9pbnQpLgorCisJICBUaGUgRFNDUCBjb2RlcG9pbnQgY2FuIGhhdmUgYW55IHZhbHVlIGJldHdlZW4gMHgwIGFuZCAweDRmLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIElQX05GX01BVENIX0FIX0VTUAorCXRyaXN0YXRlICJBSC9FU1AgbWF0Y2ggc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCisJaGVscAorCSAgVGhlc2UgdHdvIG1hdGNoIGV4dGVuc2lvbnMgKGBhaCcgYW5kIGBlc3AnKSBhbGxvdyB5b3UgdG8gbWF0Y2ggYQorCSAgcmFuZ2Ugb2YgU1BJcyBpbnNpZGUgQUggb3IgRVNQIGhlYWRlcnMgb2YgSVBTZWMgcGFja2V0cy4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBJUF9ORl9NQVRDSF9MRU5HVEgKKwl0cmlzdGF0ZSAiTEVOR1RIIG1hdGNoIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gbWF0Y2ggdGhlIGxlbmd0aCBvZiBhIHBhY2tldCBhZ2FpbnN0IGEKKwkgIHNwZWNpZmljIHZhbHVlIG9yIHJhbmdlIG9mIHZhbHVlcy4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBJUF9ORl9NQVRDSF9UVEwKKwl0cmlzdGF0ZSAiVFRMIG1hdGNoIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUworCWhlbHAKKwkgIFRoaXMgYWRkcyBDT05GSUdfSVBfTkZfTUFUQ0hfVFRMIG9wdGlvbiwgd2hpY2ggZW5hYmxlZCB0aGUgdXNlcgorCSAgdG8gbWF0Y2ggcGFja2V0cyBieSB0aGVpciBUVEwgdmFsdWUuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgSVBfTkZfTUFUQ0hfVENQTVNTCisJdHJpc3RhdGUgInRjcG1zcyBtYXRjaCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYHRjcG1zcycgbWF0Y2gsIHdoaWNoIGFsbG93cyB5b3UgdG8gZXhhbWluZSB0aGUKKwkgIE1TUyB2YWx1ZSBvZiBUQ1AgU1lOIHBhY2tldHMsIHdoaWNoIGNvbnRyb2wgdGhlIG1heGltdW0gcGFja2V0IHNpemUKKwkgIGZvciB0aGF0IGNvbm5lY3Rpb24uCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgSVBfTkZfTUFUQ0hfSEVMUEVSCisJdHJpc3RhdGUgIkhlbHBlciBtYXRjaCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLICYmIElQX05GX0lQVEFCTEVTCisJaGVscAorCSAgSGVscGVyIG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggcGFja2V0cyBpbiBkeW5hbWljIGNvbm5lY3Rpb25zCisJICB0cmFja2VkIGJ5IGEgY29ubnRyYWNrLWhlbHBlciwgaWUuIGlwX2Nvbm50cmFja19mdHAKKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IFkuCisKK2NvbmZpZyBJUF9ORl9NQVRDSF9TVEFURQorCXRyaXN0YXRlICJDb25uZWN0aW9uIHN0YXRlIG1hdGNoIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sgJiYgSVBfTkZfSVBUQUJMRVMKKwloZWxwCisJICBDb25uZWN0aW9uIHN0YXRlIG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggcGFja2V0cyBiYXNlZCBvbiB0aGVpcgorCSAgcmVsYXRpb25zaGlwIHRvIGEgdHJhY2tlZCBjb25uZWN0aW9uIChpZS4gcHJldmlvdXMgcGFja2V0cykuICBUaGlzCisJICBpcyBhIHBvd2VyZnVsIHRvb2wgZm9yIHBhY2tldCBjbGFzc2lmaWNhdGlvbi4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBJUF9ORl9NQVRDSF9DT05OVFJBQ0sKKwl0cmlzdGF0ZSAiQ29ubmVjdGlvbiB0cmFja2luZyBtYXRjaCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLICYmIElQX05GX0lQVEFCTEVTCisJaGVscAorCSAgVGhpcyBpcyBhIGdlbmVyYWwgY29ubnRyYWNrIG1hdGNoIG1vZHVsZSwgYSBzdXBlcnNldCBvZiB0aGUgc3RhdGUgbWF0Y2guCisKKwkgIEl0IGFsbG93cyBtYXRjaGluZyBvbiBhZGRpdGlvbmFsIGNvbm50cmFjayBpbmZvcm1hdGlvbiwgd2hpY2ggaXMKKwkgIHVzZWZ1bCBpbiBjb21wbGV4IGNvbmZpZ3VyYXRpb25zLCBzdWNoIGFzIE5BVCBnYXRld2F5cyB3aXRoIG11bHRpcGxlCisJICBpbnRlcm5ldCBsaW5rcyBvciB0dW5uZWxzLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIElQX05GX01BVENIX09XTkVSCisJdHJpc3RhdGUgIk93bmVyIG1hdGNoIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUworCWhlbHAKKwkgIFBhY2tldCBvd25lciBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIGxvY2FsbHktZ2VuZXJhdGVkIHBhY2tldHMKKwkgIGJhc2VkIG9uIHdobyBjcmVhdGVkIHRoZW06IHRoZSB1c2VyLCBncm91cCwgcHJvY2VzcyBvciBzZXNzaW9uLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIElQX05GX01BVENIX1BIWVNERVYKKwl0cmlzdGF0ZSAiUGh5c2RldiBtYXRjaCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMgJiYgQlJJREdFX05FVEZJTFRFUgorCWhlbHAKKwkgIFBoeXNkZXYgcGFja2V0IG1hdGNoaW5nIG1hdGNoZXMgYWdhaW5zdCB0aGUgcGh5c2ljYWwgYnJpZGdlIHBvcnRzCisJICB0aGUgSVAgcGFja2V0IGFycml2ZWQgb24gb3Igd2lsbCBsZWF2ZSBieS4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBJUF9ORl9NQVRDSF9BRERSVFlQRQorCXRyaXN0YXRlICAnYWRkcmVzcyB0eXBlIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gbWF0Y2ggd2hhdCByb3V0aW5nIHRoaW5rcyBvZiBhbiBhZGRyZXNzLAorCSAgZWcuIFVOSUNBU1QsIExPQ0FMLCBCUk9BRENBU1QsIC4uLgorCQorCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uICBJZiB1bnN1cmUsIHNheSBgTicuCisKK2NvbmZpZyBJUF9ORl9NQVRDSF9SRUFMTQorCXRyaXN0YXRlICAncmVhbG0gbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCisJc2VsZWN0IE5FVF9DTFNfUk9VVEUKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYHJlYWxtJyBtYXRjaCwgd2hpY2ggYWxsb3dzIHlvdSB0byB1c2UgdGhlIHJlYWxtCisJICBrZXkgZnJvbSB0aGUgcm91dGluZyBzdWJzeXN0ZW0gaW5zaWRlIGlwdGFibGVzLgorCQorCSAgVGhpcyBtYXRjaCBwcmV0dHkgbXVjaCByZXNlbWJsZXMgdGhlIENPTkZJR19ORVRfQ0xTX1JPVVRFNCBvcHRpb24gCisJICBpbiB0YyB3b3JsZC4KKwkKKwkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgSWYgdW5zdXJlLCBzYXkgYE4nLgorCitjb25maWcgSVBfTkZfTUFUQ0hfU0NUUAorCXRyaXN0YXRlICAnU0NUUCBwcm90b2NvbCBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKKwloZWxwCisJICBXaXRoIHRoaXMgb3B0aW9uIGVuYWJsZWQsIHlvdSB3aWxsIGJlIGFibGUgdG8gdXNlIHRoZSBpcHRhYmxlcworCSAgYHNjdHAnIG1hdGNoIGluIG9yZGVyIHRvIG1hdGNoIG9uIFNDVFAgc291cmNlL2Rlc3RpbmF0aW9uIHBvcnRzCisJICBhbmQgU0NUUCBjaHVuayB0eXBlcy4KKworCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uICBJZiB1bnN1cmUsIHNheSBgTicuCisKK2NvbmZpZyBJUF9ORl9NQVRDSF9DT01NRU5UCisJdHJpc3RhdGUgICdjb21tZW50IG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgY29tbWVudCcgZHVtbXktbWF0Y2gsIHdoaWNoIGFsbG93cyB5b3UgdG8gcHV0CisJICBjb21tZW50cyBpbiB5b3VyIGlwdGFibGVzIHJ1bGVzZXQuCisKKwkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgSWYgdW5zdXJlLCBzYXkgYE4nLgorCitjb25maWcgSVBfTkZfTUFUQ0hfQ09OTk1BUksKKwl0cmlzdGF0ZSAgJ0Nvbm5lY3Rpb24gbWFyayBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLX01BUksgJiYgSVBfTkZfSVBUQUJMRVMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYGNvbm5tYXJrJyBtYXRjaCwgd2hpY2ggYWxsb3dzIHlvdSB0byBtYXRjaCB0aGUKKwkgIGNvbm5lY3Rpb24gbWFyayB2YWx1ZSBwcmV2aW91c2x5IHNldCBmb3IgdGhlIHNlc3Npb24gYnkgYENPTk5NQVJLJy4gCisJCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKKwkgIGlwdF9jb25ubWFyay5vLiAgSWYgdW5zdXJlLCBzYXkgYE4nLgorCitjb25maWcgSVBfTkZfTUFUQ0hfSEFTSExJTUlUCisJdHJpc3RhdGUgICdoYXNobGltaXQgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyBhIG5ldyBpcHRhYmxlcyBgaGFzaGxpbWl0JyBtYXRjaC4gIAorCisJICBBcyBvcHBvc2VkIHRvIGBsaW1pdCcsIHRoaXMgbWF0Y2ggZHluYW1pY2FsbHkgY3JhdGVzIGEgaGFzaCB0YWJsZQorCSAgb2YgbGltaXQgYnVja2V0cywgYmFzZWQgb24geW91ciBzZWxlY3Rpb24gb2Ygc291cmNlL2Rlc3RpbmF0aW9uCisJICBpcCBhZGRyZXNzZXMgYW5kL29yIHBvcnRzLgorCisJICBJdCBlbmFibGVzIHlvdSB0byBleHByZXNzIHBvbGljaWVzIGxpa2UgYDEwa3BwcyBmb3IgYW55IGdpdmVuCisJICBkZXN0aW5hdGlvbiBJUCcgb3IgYDUwMHBwcyBmcm9tIGFueSBnaXZlbiBzb3VyY2UgSVAnICB3aXRoIGEgc2luZ2xlCisJICBJUHRhYmxlcyBydWxlLgorCisjIGBmaWx0ZXInLCBnZW5lcmljIGFuZCBzcGVjaWZpYyB0YXJnZXRzCitjb25maWcgSVBfTkZfRklMVEVSCisJdHJpc3RhdGUgIlBhY2tldCBmaWx0ZXJpbmciCisJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUworCWhlbHAKKwkgIFBhY2tldCBmaWx0ZXJpbmcgZGVmaW5lcyBhIHRhYmxlIGBmaWx0ZXInLCB3aGljaCBoYXMgYSBzZXJpZXMgb2YKKwkgIHJ1bGVzIGZvciBzaW1wbGUgcGFja2V0IGZpbHRlcmluZyBhdCBsb2NhbCBpbnB1dCwgZm9yd2FyZGluZyBhbmQKKwkgIGxvY2FsIG91dHB1dC4gIFNlZSB0aGUgbWFuIHBhZ2UgZm9yIGlwdGFibGVzKDgpLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIElQX05GX1RBUkdFVF9SRUpFQ1QKKwl0cmlzdGF0ZSAiUkVKRUNUIHRhcmdldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVBfTkZfRklMVEVSCisJaGVscAorCSAgVGhlIFJFSkVDVCB0YXJnZXQgYWxsb3dzIGEgZmlsdGVyaW5nIHJ1bGUgdG8gc3BlY2lmeSB0aGF0IGFuIElDTVAKKwkgIGVycm9yIHNob3VsZCBiZSBpc3N1ZWQgaW4gcmVzcG9uc2UgdG8gYW4gaW5jb21pbmcgcGFja2V0LCByYXRoZXIKKwkgIHRoYW4gc2lsZW50bHkgYmVpbmcgZHJvcHBlZC4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBJUF9ORl9UQVJHRVRfTE9HCisJdHJpc3RhdGUgIkxPRyB0YXJnZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBMT0cnIHRhcmdldCwgd2hpY2ggYWxsb3dzIHlvdSB0byBjcmVhdGUgcnVsZXMgaW4KKwkgIGFueSBpcHRhYmxlcyB0YWJsZSB3aGljaCByZWNvcmRzIHRoZSBwYWNrZXQgaGVhZGVyIHRvIHRoZSBzeXNsb2cuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgSVBfTkZfVEFSR0VUX1VMT0cKKwl0cmlzdGF0ZSAiVUxPRyB0YXJnZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBVTE9HJyB0YXJnZXQsIHdoaWNoIGFsbG93cyB5b3UgdG8gY3JlYXRlIHJ1bGVzIGluCisJICBhbnkgaXB0YWJsZXMgdGFibGUuIFRoZSBwYWNrZXQgaXMgcGFzc2VkIHRvIGEgdXNlcnNwYWNlIGxvZ2dpbmcKKwkgIGRhZW1vbiB1c2luZyBuZXRsaW5rIG11bHRpY2FzdCBzb2NrZXRzOyB1bmxpa2UgdGhlIExPRyB0YXJnZXQKKwkgIHdoaWNoIGNhbiBvbmx5IGJlIHZpZXdlZCB0aHJvdWdoIHN5c2xvZy4KKworCSAgVGhlIGFwcm9wcmlhdGUgdXNlcnNwYWNlIGxvZ2dpbmcgZGFlbW9uICh1bG9nZCkgbWF5IGJlIG9idGFpbmVkIGZyb20KKwkgIDxodHRwOi8vd3d3LmdudW1vbmtzLm9yZy9wcm9qZWN0cy91bG9nZC8+CisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgSVBfTkZfVEFSR0VUX1RDUE1TUworCXRyaXN0YXRlICJUQ1BNU1MgdGFyZ2V0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUworCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgVENQTVNTJyB0YXJnZXQsIHdoaWNoIGFsbG93cyB5b3UgdG8gYWx0ZXIgdGhlCisJICBNU1MgdmFsdWUgb2YgVENQIFNZTiBwYWNrZXRzLCB0byBjb250cm9sIHRoZSBtYXhpbXVtIHNpemUgZm9yIHRoYXQKKwkgIGNvbm5lY3Rpb24gKHVzdWFsbHkgbGltaXRpbmcgaXQgdG8geW91ciBvdXRnb2luZyBpbnRlcmZhY2UncyBNVFUKKwkgIG1pbnVzIDQwKS4KKworCSAgVGhpcyBpcyB1c2VkIHRvIG92ZXJjb21lIGNyaW1pbmFsbHkgYnJhaW5kZWFkIElTUHMgb3Igc2VydmVycyB3aGljaAorCSAgYmxvY2sgSUNNUCBGcmFnbWVudGF0aW9uIE5lZWRlZCBwYWNrZXRzLiAgVGhlIHN5bXB0b21zIG9mIHRoaXMKKwkgIHByb2JsZW0gYXJlIHRoYXQgZXZlcnl0aGluZyB3b3JrcyBmaW5lIGZyb20geW91ciBMaW51eAorCSAgZmlyZXdhbGwvcm91dGVyLCBidXQgbWFjaGluZXMgYmVoaW5kIGl0IGNhbiBuZXZlciBleGNoYW5nZSBsYXJnZQorCSAgcGFja2V0czoKKwkgIAkxKSBXZWIgYnJvd3NlcnMgY29ubmVjdCwgdGhlbiBoYW5nIHdpdGggbm8gZGF0YSByZWNlaXZlZC4KKwkgIAkyKSBTbWFsbCBtYWlsIHdvcmtzIGZpbmUsIGJ1dCBsYXJnZSBlbWFpbHMgaGFuZy4KKwkgIAkzKSBzc2ggd29ya3MgZmluZSwgYnV0IHNjcCBoYW5ncyBhZnRlciBpbml0aWFsIGhhbmRzaGFraW5nLgorCisJICBXb3JrYXJvdW5kOiBhY3RpdmF0ZSB0aGlzIG9wdGlvbiBhbmQgYWRkIGEgcnVsZSB0byB5b3VyIGZpcmV3YWxsCisJICBjb25maWd1cmF0aW9uIGxpa2U6CisKKwkgIGlwdGFibGVzIC1BIEZPUldBUkQgLXAgdGNwIC0tdGNwLWZsYWdzIFNZTixSU1QgU1lOIFwKKwkgIAkJIC1qIFRDUE1TUyAtLWNsYW1wLW1zcy10by1wbXR1CisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCisjIE5BVCArIHNwZWNpZmljIHRhcmdldHMKK2NvbmZpZyBJUF9ORl9OQVQKKwl0cmlzdGF0ZSAiRnVsbCBOQVQiCisJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyAmJiBJUF9ORl9DT05OVFJBQ0sKKwloZWxwCisJICBUaGUgRnVsbCBOQVQgb3B0aW9uIGFsbG93cyBtYXNxdWVyYWRpbmcsIHBvcnQgZm9yd2FyZGluZyBhbmQgb3RoZXIKKwkgIGZvcm1zIG9mIGZ1bGwgTmV0d29yayBBZGRyZXNzIFBvcnQgVHJhbnNsYXRpb24uICBJdCBpcyBjb250cm9sbGVkIGJ5CisJICB0aGUgYG5hdCcgdGFibGUgaW4gaXB0YWJsZXM6IHNlZSB0aGUgbWFuIHBhZ2UgZm9yIGlwdGFibGVzKDgpLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIElQX05GX05BVF9ORUVERUQKKwlib29sCisJZGVwZW5kcyBvbiBJUF9ORl9OQVQgIT0gbgorCWRlZmF1bHQgeQorCitjb25maWcgSVBfTkZfVEFSR0VUX01BU1FVRVJBREUKKwl0cmlzdGF0ZSAiTUFTUVVFUkFERSB0YXJnZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElQX05GX05BVAorCWhlbHAKKwkgIE1hc3F1ZXJhZGluZyBpcyBhIHNwZWNpYWwgY2FzZSBvZiBOQVQ6IGFsbCBvdXRnb2luZyBjb25uZWN0aW9ucyBhcmUKKwkgIGNoYW5nZWQgdG8gc2VlbSB0byBjb21lIGZyb20gYSBwYXJ0aWN1bGFyIGludGVyZmFjZSdzIGFkZHJlc3MsIGFuZAorCSAgaWYgdGhlIGludGVyZmFjZSBnb2VzIGRvd24sIHRob3NlIGNvbm5lY3Rpb25zIGFyZSBsb3N0LiAgVGhpcyBpcworCSAgb25seSB1c2VmdWwgZm9yIGRpYWx1cCBhY2NvdW50cyB3aXRoIGR5bmFtaWMgSVAgYWRkcmVzcyAoaWUuIHlvdXIgSVAKKwkgIGFkZHJlc3Mgd2lsbCBiZSBkaWZmZXJlbnQgb24gbmV4dCBkaWFsdXApLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIElQX05GX1RBUkdFVF9SRURJUkVDVAorCXRyaXN0YXRlICJSRURJUkVDVCB0YXJnZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElQX05GX05BVAorCWhlbHAKKwkgIFJFRElSRUNUIGlzIGEgc3BlY2lhbCBjYXNlIG9mIE5BVDogYWxsIGluY29taW5nIGNvbm5lY3Rpb25zIGFyZQorCSAgbWFwcGVkIG9udG8gdGhlIGluY29taW5nIGludGVyZmFjZSdzIGFkZHJlc3MsIGNhdXNpbmcgdGhlIHBhY2tldHMgdG8KKwkgIGNvbWUgdG8gdGhlIGxvY2FsIG1hY2hpbmUgaW5zdGVhZCBvZiBwYXNzaW5nIHRocm91Z2guICBUaGlzIGlzCisJICB1c2VmdWwgZm9yIHRyYW5zcGFyZW50IHByb3hpZXMuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgSVBfTkZfVEFSR0VUX05FVE1BUAorCXRyaXN0YXRlICJORVRNQVAgdGFyZ2V0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJUF9ORl9OQVQKKwloZWxwCisJICBORVRNQVAgaXMgYW4gaW1wbGVtZW50YXRpb24gb2Ygc3RhdGljIDE6MSBOQVQgbWFwcGluZyBvZiBuZXR3b3JrCisJICBhZGRyZXNzZXMuIEl0IG1hcHMgdGhlIG5ldHdvcmsgYWRkcmVzcyBwYXJ0LCB3aGlsZSBrZWVwaW5nIHRoZSBob3N0CisJICBhZGRyZXNzIHBhcnQgaW50YWN0LiBJdCBpcyBzaW1pbGFyIHRvIEZhc3QgTkFULCBleGNlcHQgdGhhdAorCSAgTmV0ZmlsdGVyJ3MgY29ubmVjdGlvbiB0cmFja2luZyBkb2Vzbid0IHdvcmsgd2VsbCB3aXRoIEZhc3QgTkFULgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIElQX05GX1RBUkdFVF9TQU1FCisJdHJpc3RhdGUgIlNBTUUgdGFyZ2V0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJUF9ORl9OQVQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYFNBTUUnIHRhcmdldCwgd2hpY2ggd29ya3MgbGlrZSB0aGUgc3RhbmRhcmQgU05BVAorCSAgdGFyZ2V0LCBidXQgYXR0ZW1wdHMgdG8gZ2l2ZSBjbGllbnRzIHRoZSBzYW1lIElQIGZvciBhbGwgY29ubmVjdGlvbnMuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgSVBfTkZfTkFUX1NOTVBfQkFTSUMKKwl0cmlzdGF0ZSAiQmFzaWMgU05NUC1BTEcgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBJUF9ORl9OQVQKKwktLS1oZWxwLS0tCisKKwkgIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgYW4gQXBwbGljYXRpb24gTGF5ZXIgR2F0ZXdheSAoQUxHKSBmb3IKKwkgIFNOTVAgcGF5bG9hZHMuICBJbiBjb25qdW5jdGlvbiB3aXRoIE5BVCwgaXQgYWxsb3dzIGEgbmV0d29yaworCSAgbWFuYWdlbWVudCBzeXN0ZW0gdG8gYWNjZXNzIG11bHRpcGxlIHByaXZhdGUgbmV0d29ya3Mgd2l0aAorCSAgY29uZmxpY3RpbmcgYWRkcmVzc2VzLiAgSXQgd29ya3MgYnkgbW9kaWZ5aW5nIElQIGFkZHJlc3NlcworCSAgaW5zaWRlIFNOTVAgcGF5bG9hZHMgdG8gbWF0Y2ggSVAtbGF5ZXIgTkFUIG1hcHBpbmcuCisKKwkgIFRoaXMgaXMgdGhlICJiYXNpYyIgZm9ybSBvZiBTTk1QLUFMRywgYXMgZGVzY3JpYmVkIGluIFJGQyAyOTYyCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgSVBfTkZfTkFUX0lSQworCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyE9biAmJiBJUF9ORl9DT05OVFJBQ0shPW4gJiYgSVBfTkZfTkFUIT1uCisJZGVmYXVsdCBJUF9ORl9OQVQgaWYgSVBfTkZfSVJDPXkKKwlkZWZhdWx0IG0gaWYgSVBfTkZfSVJDPW0KKworIyBJZiB0aGV5IHdhbnQgRlRQLCBzZXQgdG8gJENPTkZJR19JUF9ORl9OQVQgKG0gb3IgeSksIAorIyBvciAkQ09ORklHX0lQX05GX0ZUUCAobSBvciB5KSwgd2hpY2hldmVyIGlzIHdlYWtlci4gIEFyZ2guCitjb25maWcgSVBfTkZfTkFUX0ZUUAorCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyE9biAmJiBJUF9ORl9DT05OVFJBQ0shPW4gJiYgSVBfTkZfTkFUIT1uCisJZGVmYXVsdCBJUF9ORl9OQVQgaWYgSVBfTkZfRlRQPXkKKwlkZWZhdWx0IG0gaWYgSVBfTkZfRlRQPW0KKworY29uZmlnIElQX05GX05BVF9URlRQCisJdHJpc3RhdGUKKwlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTIT1uICYmIElQX05GX0NPTk5UUkFDSyE9biAmJiBJUF9ORl9OQVQhPW4KKwlkZWZhdWx0IElQX05GX05BVCBpZiBJUF9ORl9URlRQPXkKKwlkZWZhdWx0IG0gaWYgSVBfTkZfVEZUUD1tCisKK2NvbmZpZyBJUF9ORl9OQVRfQU1BTkRBCisJdHJpc3RhdGUKKwlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTIT1uICYmIElQX05GX0NPTk5UUkFDSyE9biAmJiBJUF9ORl9OQVQhPW4KKwlkZWZhdWx0IElQX05GX05BVCBpZiBJUF9ORl9BTUFOREE9eQorCWRlZmF1bHQgbSBpZiBJUF9ORl9BTUFOREE9bQorCisjIG1hbmdsZSArIHNwZWNpZmljIHRhcmdldHMKK2NvbmZpZyBJUF9ORl9NQU5HTEUKKwl0cmlzdGF0ZSAiUGFja2V0IG1hbmdsaW5nIgorCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYG1hbmdsZScgdGFibGUgdG8gaXB0YWJsZXM6IHNlZSB0aGUgbWFuIHBhZ2UgZm9yCisJICBpcHRhYmxlcyg4KS4gIFRoaXMgdGFibGUgaXMgdXNlZCBmb3IgdmFyaW91cyBwYWNrZXQgYWx0ZXJhdGlvbnMKKwkgIHdoaWNoIGNhbiBlZmZlY3QgaG93IHRoZSBwYWNrZXQgaXMgcm91dGVkLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIElQX05GX1RBUkdFVF9UT1MKKwl0cmlzdGF0ZSAiVE9TIHRhcmdldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVBfTkZfTUFOR0xFCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBUT1MnIHRhcmdldCwgd2hpY2ggYWxsb3dzIHlvdSB0byBjcmVhdGUgcnVsZXMgaW4KKwkgIHRoZSBgbWFuZ2xlJyB0YWJsZSB3aGljaCBhbHRlciB0aGUgVHlwZSBPZiBTZXJ2aWNlIGZpZWxkIG9mIGFuIElQCisJICBwYWNrZXQgcHJpb3IgdG8gcm91dGluZy4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBJUF9ORl9UQVJHRVRfRUNOCisJdHJpc3RhdGUgIkVDTiB0YXJnZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElQX05GX01BTkdMRQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgRUNOJyB0YXJnZXQsIHdoaWNoIGNhbiBiZSB1c2VkIGluIHRoZSBpcHRhYmxlcyBtYW5nbGUKKwkgIHRhYmxlLiAgCisKKwkgIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIHJlbW92ZSB0aGUgRUNOIGJpdHMgZnJvbSB0aGUgSVB2NCBoZWFkZXIgb2YKKwkgIGFuIElQIHBhY2tldC4gIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCwgaWYgeW91IG5lZWQgdG8gd29yayBhcm91bmQKKwkgIGV4aXN0aW5nIEVDTiBibGFja2hvbGVzIG9uIHRoZSBpbnRlcm5ldCwgYnV0IGRvbid0IHdhbnQgdG8gZGlzYWJsZQorCSAgRUNOIHN1cHBvcnQgaW4gZ2VuZXJhbC4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBJUF9ORl9UQVJHRVRfRFNDUAorCXRyaXN0YXRlICJEU0NQIHRhcmdldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVBfTkZfTUFOR0xFCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBEU0NQJyBtYXRjaCwgd2hpY2ggYWxsb3dzIHlvdSB0byBtYXRjaCBhZ2FpbnN0CisJICB0aGUgSVB2NCBoZWFkZXIgRFNDUCBmaWVsZCAoRFNDUCBjb2RlcG9pbnQpLgorCisJICBUaGUgRFNDUCBjb2RlcG9pbnQgY2FuIGhhdmUgYW55IHZhbHVlIGJldHdlZW4gMHgwIGFuZCAweDRmLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIElQX05GX1RBUkdFVF9NQVJLCisJdHJpc3RhdGUgIk1BUksgdGFyZ2V0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJUF9ORl9NQU5HTEUKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYE1BUksnIHRhcmdldCwgd2hpY2ggYWxsb3dzIHlvdSB0byBjcmVhdGUgcnVsZXMKKwkgIGluIHRoZSBgbWFuZ2xlJyB0YWJsZSB3aGljaCBhbHRlciB0aGUgbmV0ZmlsdGVyIG1hcmsgKG5mbWFyaykgZmllbGQKKwkgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2V0IHByaW9yIHRvIHJvdXRpbmcuIFRoaXMgY2FuIGNoYW5nZQorCSAgdGhlIHJvdXRpbmcgbWV0aG9kIChzZWUgYFVzZSBuZXRmaWx0ZXIgTUFSSyB2YWx1ZSBhcyByb3V0aW5nCisJICBrZXknKSBhbmQgY2FuIGFsc28gYmUgdXNlZCBieSBvdGhlciBzdWJzeXN0ZW1zIHRvIGNoYW5nZSB0aGVpcgorCSAgYmVoYXZpb3IuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgSVBfTkZfVEFSR0VUX0NMQVNTSUZZCisJdHJpc3RhdGUgIkNMQVNTSUZZIHRhcmdldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVBfTkZfTUFOR0xFCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBDTEFTU0lGWScgdGFyZ2V0LCB3aGljaCBlbmFibGVzIHRoZSB1c2VyIHRvIHNldAorCSAgdGhlIHByaW9yaXR5IG9mIGEgcGFja2V0LiBTb21lIHFkaXNjcyBjYW4gdXNlIHRoaXMgdmFsdWUgZm9yCisJICBjbGFzc2lmaWNhdGlvbiwgYW1vbmcgdGhlc2UgYXJlOgorCisgIAkgIGF0bSwgY2JxLCBkc21hcmssIHBmaWZvX2Zhc3QsIGh0YiwgcHJpbworCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIElQX05GX1RBUkdFVF9DT05OTUFSSworCXRyaXN0YXRlICAnQ09OTk1BUksgdGFyZ2V0IHN1cHBvcnQnCisJZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0tfTUFSSyAmJiBJUF9ORl9NQU5HTEUKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYENPTk5NQVJLJyB0YXJnZXQsIHdoaWNoIGFsbG93cyBvbmUgdG8gbWFuaXB1bGF0ZQorCSAgdGhlIGNvbm5lY3Rpb24gbWFyayB2YWx1ZS4gIFNpbWlsYXIgdG8gdGhlIE1BUksgdGFyZ2V0LCBidXQKKwkgIGFmZmVjdHMgdGhlIGNvbm5lY3Rpb24gbWFyayB2YWx1ZSByYXRoZXIgdGhhbiB0aGUgcGFja2V0IG1hcmsgdmFsdWUuCisJCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKKwkgIGlwdF9DT05OTUFSSy5vLiAgSWYgdW5zdXJlLCBzYXkgYE4nLgorCitjb25maWcgSVBfTkZfVEFSR0VUX0NMVVNURVJJUAorCXRyaXN0YXRlICJDTFVTVEVSSVAgdGFyZ2V0IHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0tfTUFSSyAmJiBJUF9ORl9JUFRBQkxFUyAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGUgQ0xVU1RFUklQIHRhcmdldCBhbGxvd3MgeW91IHRvIGJ1aWxkIGxvYWQtYmFsYW5jaW5nIGNsdXN0ZXJzIG9mCisJICBuZXR3b3JrIHNlcnZlcnMgd2l0aG91dCBoYXZpbmcgYSBkZWRpY2F0ZWQgbG9hZC1iYWxhbmNpbmcKKwkgIHJvdXRlci9zZXJ2ZXIvc3dpdGNoLgorCQorCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKKyMgcmF3ICsgc3BlY2lmaWMgdGFyZ2V0cworY29uZmlnIElQX05GX1JBVworCXRyaXN0YXRlICAncmF3IHRhYmxlIHN1cHBvcnQgKHJlcXVpcmVkIGZvciBOT1RSQUNLL1RSQUNFKScKKwlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyBhIGByYXcnIHRhYmxlIHRvIGlwdGFibGVzLiBUaGlzIHRhYmxlIGlzIHRoZSB2ZXJ5CisJICBmaXJzdCBpbiB0aGUgbmV0ZmlsdGVyIGZyYW1ld29yayBhbmQgaG9va3MgaW4gYXQgdGhlIFBSRVJPVVRJTkcKKwkgIGFuZCBPVVRQVVQgY2hhaW5zLgorCQorCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uICBJZiB1bnN1cmUsIHNheSBgTicuCisKK2NvbmZpZyBJUF9ORl9UQVJHRVRfTk9UUkFDSworCXRyaXN0YXRlICAnTk9UUkFDSyB0YXJnZXQgc3VwcG9ydCcKKwlkZXBlbmRzIG9uIElQX05GX1JBVworCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLCisJaGVscAorCSAgVGhlIE5PVFJBQ0sgdGFyZ2V0IGFsbG93cyBhIHNlbGVjdCBydWxlIHRvIHNwZWNpZnkKKwkgIHdoaWNoIHBhY2tldHMgKm5vdCogdG8gZW50ZXIgdGhlIGNvbm50cmFjay9OQVQKKwkgIHN1YnN5c3RlbSB3aXRoIGFsbCB0aGUgY29uc2VxdWVuY2VzIChubyBJQ01QIGVycm9yIHRyYWNraW5nLAorCSAgbm8gcHJvdG9jb2wgaGVscGVycyBmb3IgdGhlIHNlbGVjdGVkIHBhY2tldHMpLgorCQorCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uICBJZiB1bnN1cmUsIHNheSBgTicuCisKKworIyBBUlAgdGFibGVzCitjb25maWcgSVBfTkZfQVJQVEFCTEVTCisJdHJpc3RhdGUgIkFSUCB0YWJsZXMgc3VwcG9ydCIKKwloZWxwCisJICBhcnB0YWJsZXMgaXMgYSBnZW5lcmFsLCBleHRlbnNpYmxlIHBhY2tldCBpZGVudGlmaWNhdGlvbiBmcmFtZXdvcmsuCisJICBUaGUgQVJQIHBhY2tldCBmaWx0ZXJpbmcgYW5kIG1hbmdsaW5nIChtYW5pcHVsYXRpb24pc3Vic3lzdGVtcworCSAgdXNlIHRoaXM6IHNheSBZIG9yIE0gaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgZWl0aGVyIG9mIHRob3NlLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIElQX05GX0FSUEZJTFRFUgorCXRyaXN0YXRlICJBUlAgcGFja2V0IGZpbHRlcmluZyIKKwlkZXBlbmRzIG9uIElQX05GX0FSUFRBQkxFUworCWhlbHAKKwkgIEFSUCBwYWNrZXQgZmlsdGVyaW5nIGRlZmluZXMgYSB0YWJsZSBgZmlsdGVyJywgd2hpY2ggaGFzIGEgc2VyaWVzIG9mCisJICBydWxlcyBmb3Igc2ltcGxlIEFSUCBwYWNrZXQgZmlsdGVyaW5nIGF0IGxvY2FsIGlucHV0IGFuZAorCSAgbG9jYWwgb3V0cHV0LiAgT24gYSBicmlkZ2UsIHlvdSBjYW4gYWxzbyBzcGVjaWZ5IGZpbHRlcmluZyBydWxlcworCSAgZm9yIGZvcndhcmRlZCBBUlAgcGFja2V0cy4gU2VlIHRoZSBtYW4gcGFnZSBmb3IgYXJwdGFibGVzKDgpLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIElQX05GX0FSUF9NQU5HTEUKKwl0cmlzdGF0ZSAiQVJQIHBheWxvYWQgbWFuZ2xpbmciCisJZGVwZW5kcyBvbiBJUF9ORl9BUlBUQUJMRVMKKwloZWxwCisJICBBbGxvd3MgYWx0ZXJpbmcgdGhlIEFSUCBwYWNrZXQgcGF5bG9hZDogc291cmNlIGFuZCBkZXN0aW5hdGlvbgorCSAgaGFyZHdhcmUgYW5kIG5ldHdvcmsgYWRkcmVzc2VzLgorCitlbmRtZW51CisKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9NYWtlZmlsZSBiL25ldC9pcHY0L25ldGZpbHRlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTc5NmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlCkBAIC0wLDAgKzEsODkgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBuZXRmaWx0ZXIgbW9kdWxlcyBvbiB0b3Agb2YgSVB2NC4KKyMKKworIyBvYmplY3RzIGZvciB0aGUgc3RhbmRhbG9uZSAtIGNvbm5lY3Rpb24gdHJhY2tpbmcgLyBOQVQKK2lwX2Nvbm50cmFjay1vYmpzCTo9IGlwX2Nvbm50cmFja19zdGFuZGFsb25lLm8gaXBfY29ubnRyYWNrX2NvcmUubyBpcF9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5vIGlwX2Nvbm50cmFja19wcm90b190Y3AubyBpcF9jb25udHJhY2tfcHJvdG9fdWRwLm8gaXBfY29ubnRyYWNrX3Byb3RvX2ljbXAubworaXB0YWJsZV9uYXQtb2Jqcwk6PSBpcF9uYXRfc3RhbmRhbG9uZS5vIGlwX25hdF9ydWxlLm8gaXBfbmF0X2NvcmUubyBpcF9uYXRfaGVscGVyLm8gaXBfbmF0X3Byb3RvX3Vua25vd24ubyBpcF9uYXRfcHJvdG9fdGNwLm8gaXBfbmF0X3Byb3RvX3VkcC5vIGlwX25hdF9wcm90b19pY21wLm8KKworIyBjb25uZWN0aW9uIHRyYWNraW5nCitvYmotJChDT05GSUdfSVBfTkZfQ09OTlRSQUNLKSArPSBpcF9jb25udHJhY2subworCisjIFNDVFAgcHJvdG9jb2wgY29ubmVjdGlvbiB0cmFja2luZworb2JqLSQoQ09ORklHX0lQX05GX0NUX1BST1RPX1NDVFApICs9IGlwX2Nvbm50cmFja19wcm90b19zY3RwLm8KKworIyBjb25uZWN0aW9uIHRyYWNraW5nIGhlbHBlcnMKK29iai0kKENPTkZJR19JUF9ORl9BTUFOREEpICs9IGlwX2Nvbm50cmFja19hbWFuZGEubworb2JqLSQoQ09ORklHX0lQX05GX1RGVFApICs9IGlwX2Nvbm50cmFja190ZnRwLm8KK29iai0kKENPTkZJR19JUF9ORl9GVFApICs9IGlwX2Nvbm50cmFja19mdHAubworb2JqLSQoQ09ORklHX0lQX05GX0lSQykgKz0gaXBfY29ubnRyYWNrX2lyYy5vCisKKyMgTkFUIGhlbHBlcnMgCitvYmotJChDT05GSUdfSVBfTkZfTkFUX0FNQU5EQSkgKz0gaXBfbmF0X2FtYW5kYS5vCitvYmotJChDT05GSUdfSVBfTkZfTkFUX1RGVFApICs9IGlwX25hdF90ZnRwLm8KK29iai0kKENPTkZJR19JUF9ORl9OQVRfRlRQKSArPSBpcF9uYXRfZnRwLm8KK29iai0kKENPTkZJR19JUF9ORl9OQVRfSVJDKSArPSBpcF9uYXRfaXJjLm8KKworIyBnZW5lcmljIElQIHRhYmxlcyAKK29iai0kKENPTkZJR19JUF9ORl9JUFRBQkxFUykgKz0gaXBfdGFibGVzLm8KKworIyB0aGUgdGhyZWUgaW5zdGFuY2VzIG9mIGlwX3RhYmxlcworb2JqLSQoQ09ORklHX0lQX05GX0ZJTFRFUikgKz0gaXB0YWJsZV9maWx0ZXIubworb2JqLSQoQ09ORklHX0lQX05GX01BTkdMRSkgKz0gaXB0YWJsZV9tYW5nbGUubworb2JqLSQoQ09ORklHX0lQX05GX05BVCkgKz0gaXB0YWJsZV9uYXQubworb2JqLSQoQ09ORklHX0lQX05GX1JBVykgKz0gaXB0YWJsZV9yYXcubworCisjIG1hdGNoZXMKK29iai0kKENPTkZJR19JUF9ORl9NQVRDSF9IRUxQRVIpICs9IGlwdF9oZWxwZXIubworb2JqLSQoQ09ORklHX0lQX05GX01BVENIX0xJTUlUKSArPSBpcHRfbGltaXQubworb2JqLSQoQ09ORklHX0lQX05GX01BVENIX0hBU0hMSU1JVCkgKz0gaXB0X2hhc2hsaW1pdC5vCitvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfU0NUUCkgKz0gaXB0X3NjdHAubworb2JqLSQoQ09ORklHX0lQX05GX01BVENIX01BUkspICs9IGlwdF9tYXJrLm8KK29iai0kKENPTkZJR19JUF9ORl9NQVRDSF9NQUMpICs9IGlwdF9tYWMubworb2JqLSQoQ09ORklHX0lQX05GX01BVENIX0lQUkFOR0UpICs9IGlwdF9pcHJhbmdlLm8KK29iai0kKENPTkZJR19JUF9ORl9NQVRDSF9QS1RUWVBFKSArPSBpcHRfcGt0dHlwZS5vCitvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfTVVMVElQT1JUKSArPSBpcHRfbXVsdGlwb3J0Lm8KK29iai0kKENPTkZJR19JUF9ORl9NQVRDSF9PV05FUikgKz0gaXB0X293bmVyLm8KK29iai0kKENPTkZJR19JUF9ORl9NQVRDSF9UT1MpICs9IGlwdF90b3Mubworb2JqLSQoQ09ORklHX0lQX05GX01BVENIX1JFQ0VOVCkgKz0gaXB0X3JlY2VudC5vCitvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfRUNOKSArPSBpcHRfZWNuLm8KK29iai0kKENPTkZJR19JUF9ORl9NQVRDSF9EU0NQKSArPSBpcHRfZHNjcC5vCitvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfQUhfRVNQKSArPSBpcHRfYWgubyBpcHRfZXNwLm8KK29iai0kKENPTkZJR19JUF9ORl9NQVRDSF9MRU5HVEgpICs9IGlwdF9sZW5ndGgubworb2JqLSQoQ09ORklHX0lQX05GX01BVENIX1RUTCkgKz0gaXB0X3R0bC5vCitvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfU1RBVEUpICs9IGlwdF9zdGF0ZS5vCitvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfQ09OTk1BUkspICs9IGlwdF9jb25ubWFyay5vCitvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfQ09OTlRSQUNLKSArPSBpcHRfY29ubnRyYWNrLm8KK29iai0kKENPTkZJR19JUF9ORl9NQVRDSF9UQ1BNU1MpICs9IGlwdF90Y3Btc3Mubworb2JqLSQoQ09ORklHX0lQX05GX01BVENIX1JFQUxNKSArPSBpcHRfcmVhbG0ubworb2JqLSQoQ09ORklHX0lQX05GX01BVENIX0FERFJUWVBFKSArPSBpcHRfYWRkcnR5cGUubworb2JqLSQoQ09ORklHX0lQX05GX01BVENIX1BIWVNERVYpICs9IGlwdF9waHlzZGV2Lm8KK29iai0kKENPTkZJR19JUF9ORl9NQVRDSF9DT01NRU5UKSArPSBpcHRfY29tbWVudC5vCisKKyMgdGFyZ2V0cworb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9SRUpFQ1QpICs9IGlwdF9SRUpFQ1Qubworb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9UT1MpICs9IGlwdF9UT1Mubworb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9FQ04pICs9IGlwdF9FQ04ubworb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9EU0NQKSArPSBpcHRfRFNDUC5vCitvYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX01BUkspICs9IGlwdF9NQVJLLm8KK29iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfTUFTUVVFUkFERSkgKz0gaXB0X01BU1FVRVJBREUubworb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9SRURJUkVDVCkgKz0gaXB0X1JFRElSRUNULm8KK29iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfTkVUTUFQKSArPSBpcHRfTkVUTUFQLm8KK29iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfU0FNRSkgKz0gaXB0X1NBTUUubworb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9DTEFTU0lGWSkgKz0gaXB0X0NMQVNTSUZZLm8KK29iai0kKENPTkZJR19JUF9ORl9OQVRfU05NUF9CQVNJQykgKz0gaXBfbmF0X3NubXBfYmFzaWMubworb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9MT0cpICs9IGlwdF9MT0cubworb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9DT05OTUFSSykgKz0gaXB0X0NPTk5NQVJLLm8KK29iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfVUxPRykgKz0gaXB0X1VMT0cubworb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9UQ1BNU1MpICs9IGlwdF9UQ1BNU1Mubworb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9OT1RSQUNLKSArPSBpcHRfTk9UUkFDSy5vCitvYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX0NMVVNURVJJUCkgKz0gaXB0X0NMVVNURVJJUC5vCisKKyMgZ2VuZXJpYyBBUlAgdGFibGVzCitvYmotJChDT05GSUdfSVBfTkZfQVJQVEFCTEVTKSArPSBhcnBfdGFibGVzLm8KK29iai0kKENPTkZJR19JUF9ORl9BUlBfTUFOR0xFKSArPSBhcnB0X21hbmdsZS5vCisKKyMganVzdCBmaWx0ZXJpbmcgaW5zdGFuY2Ugb2YgQVJQIHRhYmxlcyBmb3Igbm93CitvYmotJChDT05GSUdfSVBfTkZfQVJQRklMVEVSKSArPSBhcnB0YWJsZV9maWx0ZXIubworCitvYmotJChDT05GSUdfSVBfTkZfUVVFVUUpICs9IGlwX3F1ZXVlLm8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9hcnBfdGFibGVzLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwX3RhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNzlmNWUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwX3RhYmxlcy5jCkBAIC0wLDAgKzEsMTMzMyBAQAorLyoKKyAqIFBhY2tldCBtYXRjaGluZyBjb2RlIGZvciBBUlAgcGFja2V0cy4KKyAqCisgKiBCYXNlZCBoZWF2aWx5LCBpZiBub3QgYWxtb3N0IGVudGlyZWx5LCB1cG9uIGlwX3RhYmxlcy5jIGZyYW1ld29yay4KKyAqCisgKiBTb21lIEFSUCBzcGVjaWZpYyBiaXRzIGFyZToKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYXJwL2FycF90YWJsZXMuaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUByZWRoYXQuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJhcnB0YWJsZXMgY29yZSIpOworCisvKiNkZWZpbmUgREVCVUdfQVJQX1RBQkxFUyovCisvKiNkZWZpbmUgREVCVUdfQVJQX1RBQkxFU19VU0VSKi8KKworI2lmZGVmIERFQlVHX0FSUF9UQUJMRVMKKyNkZWZpbmUgZHByaW50Zihmb3JtYXQsIGFyZ3MuLi4pICBwcmludGsoZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIGRwcmludGYoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKyNpZmRlZiBERUJVR19BUlBfVEFCTEVTX1VTRVIKKyNkZWZpbmUgZHVwcmludGYoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIGR1cHJpbnRmKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRworI2RlZmluZSBBUlBfTkZfQVNTRVJUKHgpCQkJCQlcCitkbyB7CQkJCQkJCQlcCisJaWYgKCEoeCkpCQkJCQkJXAorCQlwcmludGsoIkFSUF9ORl9BU1NFUlQ6ICVzOiVzOiV1XG4iLAkJXAorCQkgICAgICAgX19GVU5DVElPTl9fLCBfX0ZJTEVfXywgX19MSU5FX18pOwlcCit9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBBUlBfTkZfQVNTRVJUKHgpCisjZW5kaWYKKyNkZWZpbmUgU01QX0FMSUdOKHgpICgoKHgpICsgU01QX0NBQ0hFX0JZVEVTLTEpICYgfihTTVBfQ0FDSEVfQllURVMtMSkpCisKK3N0YXRpYyBERUNMQVJFX01VVEVYKGFycHRfbXV0ZXgpOworCisjZGVmaW5lIEFTU0VSVF9SRUFEX0xPQ0soeCkgQVJQX05GX0FTU0VSVChkb3duX3RyeWxvY2soJmFycHRfbXV0ZXgpICE9IDApCisjZGVmaW5lIEFTU0VSVF9XUklURV9MT0NLKHgpIEFSUF9ORl9BU1NFUlQoZG93bl90cnlsb2NrKCZhcnB0X211dGV4KSAhPSAwKQorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2xvY2toZWxwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvbGlzdGhlbHAuaD4KKworc3RydWN0IGFycHRfdGFibGVfaW5mbyB7CisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgaW50IG51bWJlcjsKKwl1bnNpZ25lZCBpbnQgaW5pdGlhbF9lbnRyaWVzOworCXVuc2lnbmVkIGludCBob29rX2VudHJ5W05GX0FSUF9OVU1IT09LU107CisJdW5zaWduZWQgaW50IHVuZGVyZmxvd1tORl9BUlBfTlVNSE9PS1NdOworCWNoYXIgZW50cmllc1swXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKFNNUF9DQUNIRV9CWVRFUykpKTsKK307CisKK3N0YXRpYyBMSVNUX0hFQUQoYXJwdF90YXJnZXQpOworc3RhdGljIExJU1RfSEVBRChhcnB0X3RhYmxlcyk7CisjZGVmaW5lIEFERF9DT1VOVEVSKGMsYixwKSBkbyB7IChjKS5iY250ICs9IChiKTsgKGMpLnBjbnQgKz0gKHApOyB9IHdoaWxlKDApCisKKyNpZmRlZiBDT05GSUdfU01QCisjZGVmaW5lIFRBQkxFX09GRlNFVCh0LHApIChTTVBfQUxJR04oKHQpLT5zaXplKSoocCkpCisjZWxzZQorI2RlZmluZSBUQUJMRV9PRkZTRVQodCxwKSAwCisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQgYXJwX2RldmFkZHJfY29tcGFyZShjb25zdCBzdHJ1Y3QgYXJwdF9kZXZhZGRyX2luZm8gKmFwLAorCQkJCSAgICAgIGNoYXIgKmhkcl9hZGRyLCBpbnQgbGVuKQoreworCWludCBpLCByZXQ7CisKKwlpZiAobGVuID4gQVJQVF9ERVZfQUREUl9MRU5fTUFYKQorCQlsZW4gPSBBUlBUX0RFVl9BRERSX0xFTl9NQVg7CisKKwlyZXQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJcmV0IHw9IChoZHJfYWRkcltpXSBeIGFwLT5hZGRyW2ldKSAmIGFwLT5tYXNrW2ldOworCisJcmV0dXJuIChyZXQgIT0gMCk7Cit9CisKKy8qIFJldHVybnMgd2hldGhlciBwYWNrZXQgbWF0Y2hlcyBydWxlIG9yIG5vdC4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGFycF9wYWNrZXRfbWF0Y2goY29uc3Qgc3RydWN0IGFycGhkciAqYXJwaGRyLAorCQkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgY29uc3QgY2hhciAqaW5kZXYsCisJCQkJICAgY29uc3QgY2hhciAqb3V0ZGV2LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBhcnB0X2FycCAqYXJwaW5mbykKK3sKKwljaGFyICphcnBwdHIgPSAoY2hhciAqKShhcnBoZHIgKyAxKTsKKwljaGFyICpzcmNfZGV2YWRkciwgKnRndF9kZXZhZGRyOworCXUzMiBzcmNfaXBhZGRyLCB0Z3RfaXBhZGRyOworCWludCBpLCByZXQ7CisKKyNkZWZpbmUgRldJTlYoYm9vbCxpbnZmbGcpICgoYm9vbCkgXiAhIShhcnBpbmZvLT5pbnZmbGFncyAmIGludmZsZykpCisKKwlpZiAoRldJTlYoKGFycGhkci0+YXJfb3AgJiBhcnBpbmZvLT5hcnBvcF9tYXNrKSAhPSBhcnBpbmZvLT5hcnBvcCwKKwkJICBBUlBUX0lOVl9BUlBPUCkpIHsKKwkJZHByaW50ZigiQVJQIG9wZXJhdGlvbiBmaWVsZCBtaXNtYXRjaC5cbiIpOworCQlkcHJpbnRmKCJhcl9vcDogJTA0eCBpbmZvLT5hcnBvcDogJTA0eCBpbmZvLT5hcnBvcF9tYXNrOiAlMDR4XG4iLAorCQkJYXJwaGRyLT5hcl9vcCwgYXJwaW5mby0+YXJwb3AsIGFycGluZm8tPmFycG9wX21hc2spOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoRldJTlYoKGFycGhkci0+YXJfaHJkICYgYXJwaW5mby0+YXJocmRfbWFzaykgIT0gYXJwaW5mby0+YXJocmQsCisJCSAgQVJQVF9JTlZfQVJQSFJEKSkgeworCQlkcHJpbnRmKCJBUlAgaGFyZHdhcmUgYWRkcmVzcyBmb3JtYXQgbWlzbWF0Y2guXG4iKTsKKwkJZHByaW50ZigiYXJfaHJkOiAlMDR4IGluZm8tPmFyaHJkOiAlMDR4IGluZm8tPmFyaHJkX21hc2s6ICUwNHhcbiIsCisJCQlhcnBoZHItPmFyX2hyZCwgYXJwaW5mby0+YXJocmQsIGFycGluZm8tPmFyaHJkX21hc2spOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoRldJTlYoKGFycGhkci0+YXJfcHJvICYgYXJwaW5mby0+YXJwcm9fbWFzaykgIT0gYXJwaW5mby0+YXJwcm8sCisJCSAgQVJQVF9JTlZfQVJQUFJPKSkgeworCQlkcHJpbnRmKCJBUlAgcHJvdG9jb2wgYWRkcmVzcyBmb3JtYXQgbWlzbWF0Y2guXG4iKTsKKwkJZHByaW50ZigiYXJfcHJvOiAlMDR4IGluZm8tPmFycHJvOiAlMDR4IGluZm8tPmFycHJvX21hc2s6ICUwNHhcbiIsCisJCQlhcnBoZHItPmFyX3BybywgYXJwaW5mby0+YXJwcm8sIGFycGluZm8tPmFycHJvX21hc2spOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoRldJTlYoKGFycGhkci0+YXJfaGxuICYgYXJwaW5mby0+YXJobG5fbWFzaykgIT0gYXJwaW5mby0+YXJobG4sCisJCSAgQVJQVF9JTlZfQVJQSExOKSkgeworCQlkcHJpbnRmKCJBUlAgaGFyZHdhcmUgYWRkcmVzcyBsZW5ndGggbWlzbWF0Y2guXG4iKTsKKwkJZHByaW50ZigiYXJfaGxuOiAlMDJ4IGluZm8tPmFyaGxuOiAlMDJ4IGluZm8tPmFyaGxuX21hc2s6ICUwMnhcbiIsCisJCQlhcnBoZHItPmFyX2hsbiwgYXJwaW5mby0+YXJobG4sIGFycGluZm8tPmFyaGxuX21hc2spOworCQlyZXR1cm4gMDsKKwl9CisKKwlzcmNfZGV2YWRkciA9IGFycHB0cjsKKwlhcnBwdHIgKz0gZGV2LT5hZGRyX2xlbjsKKwltZW1jcHkoJnNyY19pcGFkZHIsIGFycHB0ciwgc2l6ZW9mKHUzMikpOworCWFycHB0ciArPSBzaXplb2YodTMyKTsKKwl0Z3RfZGV2YWRkciA9IGFycHB0cjsKKwlhcnBwdHIgKz0gZGV2LT5hZGRyX2xlbjsKKwltZW1jcHkoJnRndF9pcGFkZHIsIGFycHB0ciwgc2l6ZW9mKHUzMikpOworCisJaWYgKEZXSU5WKGFycF9kZXZhZGRyX2NvbXBhcmUoJmFycGluZm8tPnNyY19kZXZhZGRyLCBzcmNfZGV2YWRkciwgZGV2LT5hZGRyX2xlbiksCisJCSAgQVJQVF9JTlZfU1JDREVWQUREUikgfHwKKwkgICAgRldJTlYoYXJwX2RldmFkZHJfY29tcGFyZSgmYXJwaW5mby0+dGd0X2RldmFkZHIsIHRndF9kZXZhZGRyLCBkZXYtPmFkZHJfbGVuKSwKKwkJICBBUlBUX0lOVl9UR1RERVZBRERSKSkgeworCQlkcHJpbnRmKCJTb3VyY2Ugb3IgdGFyZ2V0IGRldmljZSBhZGRyZXNzIG1pc21hdGNoLlxuIik7CisKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKEZXSU5WKChzcmNfaXBhZGRyICYgYXJwaW5mby0+c21zay5zX2FkZHIpICE9IGFycGluZm8tPnNyYy5zX2FkZHIsCisJCSAgQVJQVF9JTlZfU1JDSVApIHx8CisJICAgIEZXSU5WKCgodGd0X2lwYWRkciAmIGFycGluZm8tPnRtc2suc19hZGRyKSAhPSBhcnBpbmZvLT50Z3Quc19hZGRyKSwKKwkJICBBUlBUX0lOVl9UR1RJUCkpIHsKKwkJZHByaW50ZigiU291cmNlIG9yIHRhcmdldCBJUCBhZGRyZXNzIG1pc21hdGNoLlxuIik7CisKKwkJZHByaW50ZigiU1JDOiAldS4ldS4ldS4ldS4gTWFzazogJXUuJXUuJXUuJXUuIFRhcmdldDogJXUuJXUuJXUuJXUuJXNcbiIsCisJCQlOSVBRVUFEKHNyY19pcGFkZHIpLAorCQkJTklQUVVBRChhcnBpbmZvLT5zbXNrLnNfYWRkciksCisJCQlOSVBRVUFEKGFycGluZm8tPnNyYy5zX2FkZHIpLAorCQkJYXJwaW5mby0+aW52ZmxhZ3MgJiBBUlBUX0lOVl9TUkNJUCA/ICIgKElOVikiIDogIiIpOworCQlkcHJpbnRmKCJUR1Q6ICV1LiV1LiV1LiV1IE1hc2s6ICV1LiV1LiV1LiV1IFRhcmdldDogJXUuJXUuJXUuJXUuJXNcbiIsCisJCQlOSVBRVUFEKHRndF9pcGFkZHIpLAorCQkJTklQUVVBRChhcnBpbmZvLT50bXNrLnNfYWRkciksCisJCQlOSVBRVUFEKGFycGluZm8tPnRndC5zX2FkZHIpLAorCQkJYXJwaW5mby0+aW52ZmxhZ3MgJiBBUlBUX0lOVl9UR1RJUCA/ICIgKElOVikiIDogIiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBMb29rIGZvciBpZm5hbWUgbWF0Y2hlcy4gICovCisJZm9yIChpID0gMCwgcmV0ID0gMDsgaSA8IElGTkFNU0laOyBpKyspIHsKKwkJcmV0IHw9IChpbmRldltpXSBeIGFycGluZm8tPmluaWZhY2VbaV0pCisJCQkmIGFycGluZm8tPmluaWZhY2VfbWFza1tpXTsKKwl9CisKKwlpZiAoRldJTlYocmV0ICE9IDAsIEFSUFRfSU5WX1ZJQV9JTikpIHsKKwkJZHByaW50ZigiVklBIGluIG1pc21hdGNoICglcyB2cyAlcykuJXNcbiIsCisJCQlpbmRldiwgYXJwaW5mby0+aW5pZmFjZSwKKwkJCWFycGluZm8tPmludmZsYWdzJkFSUFRfSU5WX1ZJQV9JTiA/IiAoSU5WKSI6IiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGkgPSAwLCByZXQgPSAwOyBpIDwgSUZOQU1TSVovc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBvZGV2OworCQltZW1jcHkoJm9kZXYsIG91dGRldiArIGkqc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLAorCQkgICAgICAgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwkJcmV0IHw9IChvZGV2CisJCQleICgoY29uc3QgdW5zaWduZWQgbG9uZyAqKWFycGluZm8tPm91dGlmYWNlKVtpXSkKKwkJCSYgKChjb25zdCB1bnNpZ25lZCBsb25nICopYXJwaW5mby0+b3V0aWZhY2VfbWFzaylbaV07CisJfQorCisJaWYgKEZXSU5WKHJldCAhPSAwLCBBUlBUX0lOVl9WSUFfT1VUKSkgeworCQlkcHJpbnRmKCJWSUEgb3V0IG1pc21hdGNoICglcyB2cyAlcykuJXNcbiIsCisJCQlvdXRkZXYsIGFycGluZm8tPm91dGlmYWNlLAorCQkJYXJwaW5mby0+aW52ZmxhZ3MmQVJQVF9JTlZfVklBX09VVCA/IiAoSU5WKSI6IiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXJwX2NoZWNrZW50cnkoY29uc3Qgc3RydWN0IGFycHRfYXJwICphcnApCit7CisJaWYgKGFycC0+ZmxhZ3MgJiB+QVJQVF9GX01BU0spIHsKKwkJZHVwcmludGYoIlVua25vd24gZmxhZyBiaXRzIHNldDogJTA4WFxuIiwKKwkJCSBhcnAtPmZsYWdzICYgfkFSUFRfRl9NQVNLKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChhcnAtPmludmZsYWdzICYgfkFSUFRfSU5WX01BU0spIHsKKwkJZHVwcmludGYoIlVua25vd24gaW52ZmxhZyBiaXRzIHNldDogJTA4WFxuIiwKKwkJCSBhcnAtPmludmZsYWdzICYgfkFSUFRfSU5WX01BU0spOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBhcnB0X2Vycm9yKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJCSAgICAgICBjb25zdCB2b2lkICp0YXJnaW5mbywKKwkJCSAgICAgICB2b2lkICp1c2VyaW5mbykKK3sKKwlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQlwcmludGsoImFycF90YWJsZXM6IGVycm9yOiAnJXMnXG4iLCAoY2hhciAqKXRhcmdpbmZvKTsKKworCXJldHVybiBORl9EUk9QOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhcnB0X2VudHJ5ICpnZXRfZW50cnkodm9pZCAqYmFzZSwgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBhcnB0X2VudHJ5ICopKGJhc2UgKyBvZmZzZXQpOworfQorCit1bnNpZ25lZCBpbnQgYXJwdF9kb190YWJsZShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkgICB1bnNpZ25lZCBpbnQgaG9vaywKKwkJCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkJCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQkgICBzdHJ1Y3QgYXJwdF90YWJsZSAqdGFibGUsCisJCQkgICB2b2lkICp1c2VyZGF0YSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBudWxsZGV2bmFtZVtJRk5BTVNJWl07CisJdW5zaWduZWQgaW50IHZlcmRpY3QgPSBORl9EUk9QOworCXN0cnVjdCBhcnBoZHIgKmFycDsKKwlpbnQgaG90ZHJvcCA9IDA7CisJc3RydWN0IGFycHRfZW50cnkgKmUsICpiYWNrOworCWNvbnN0IGNoYXIgKmluZGV2LCAqb3V0ZGV2OworCXZvaWQgKnRhYmxlX2Jhc2U7CisKKwkvKiBBUlAgaGVhZGVyLCBwbHVzIDIgZGV2aWNlIGFkZHJlc3NlcywgcGx1cyAyIElQIGFkZHJlc3Nlcy4gICovCisJaWYgKCFwc2tiX21heV9wdWxsKCgqcHNrYiksIChzaXplb2Yoc3RydWN0IGFycGhkcikgKworCQkJCSAgICAgKDIgKiAoKnBza2IpLT5kZXYtPmFkZHJfbGVuKSArCisJCQkJICAgICAoMiAqIHNpemVvZih1MzIpKSkpKQorCQlyZXR1cm4gTkZfRFJPUDsKKworCWluZGV2ID0gaW4gPyBpbi0+bmFtZSA6IG51bGxkZXZuYW1lOworCW91dGRldiA9IG91dCA/IG91dC0+bmFtZSA6IG51bGxkZXZuYW1lOworCisJcmVhZF9sb2NrX2JoKCZ0YWJsZS0+bG9jayk7CisJdGFibGVfYmFzZSA9ICh2b2lkICopdGFibGUtPnByaXZhdGUtPmVudHJpZXMKKwkJKyBUQUJMRV9PRkZTRVQodGFibGUtPnByaXZhdGUsCisJCQkgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwllID0gZ2V0X2VudHJ5KHRhYmxlX2Jhc2UsIHRhYmxlLT5wcml2YXRlLT5ob29rX2VudHJ5W2hvb2tdKTsKKwliYWNrID0gZ2V0X2VudHJ5KHRhYmxlX2Jhc2UsIHRhYmxlLT5wcml2YXRlLT51bmRlcmZsb3dbaG9va10pOworCisJYXJwID0gKCpwc2tiKS0+bmguYXJwaDsKKwlkbyB7CisJCWlmIChhcnBfcGFja2V0X21hdGNoKGFycCwgKCpwc2tiKS0+ZGV2LCBpbmRldiwgb3V0ZGV2LCAmZS0+YXJwKSkgeworCQkJc3RydWN0IGFycHRfZW50cnlfdGFyZ2V0ICp0OworCQkJaW50IGhkcl9sZW47CisKKwkJCWhkcl9sZW4gPSBzaXplb2YoKmFycCkgKyAoMiAqIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpICsKKwkJCQkoMiAqICgqcHNrYiktPmRldi0+YWRkcl9sZW4pOworCQkJQUREX0NPVU5URVIoZS0+Y291bnRlcnMsIGhkcl9sZW4sIDEpOworCisJCQl0ID0gYXJwdF9nZXRfdGFyZ2V0KGUpOworCisJCQkvKiBTdGFuZGFyZCB0YXJnZXQ/ICovCisJCQlpZiAoIXQtPnUua2VybmVsLnRhcmdldC0+dGFyZ2V0KSB7CisJCQkJaW50IHY7CisKKwkJCQl2ID0gKChzdHJ1Y3QgYXJwdF9zdGFuZGFyZF90YXJnZXQgKil0KS0+dmVyZGljdDsKKwkJCQlpZiAodiA8IDApIHsKKwkJCQkJLyogUG9wIGZyb20gc3RhY2s/ICovCisJCQkJCWlmICh2ICE9IEFSUFRfUkVUVVJOKSB7CisJCQkJCQl2ZXJkaWN0ID0gKHVuc2lnbmVkKSgtdikgLSAxOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJZSA9IGJhY2s7CisJCQkJCWJhY2sgPSBnZXRfZW50cnkodGFibGVfYmFzZSwKKwkJCQkJCQkgYmFjay0+Y29tZWZyb20pOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKHRhYmxlX2Jhc2UgKyB2CisJCQkJICAgICE9ICh2b2lkICopZSArIGUtPm5leHRfb2Zmc2V0KSB7CisJCQkJCS8qIFNhdmUgb2xkIGJhY2sgcHRyIGluIG5leHQgZW50cnkgKi8KKwkJCQkJc3RydWN0IGFycHRfZW50cnkgKm5leHQKKwkJCQkJCT0gKHZvaWQgKillICsgZS0+bmV4dF9vZmZzZXQ7CisJCQkJCW5leHQtPmNvbWVmcm9tID0KKwkJCQkJCSh2b2lkICopYmFjayAtIHRhYmxlX2Jhc2U7CisKKwkJCQkJLyogc2V0IGJhY2sgcG9pbnRlciB0byBuZXh0IGVudHJ5ICovCisJCQkJCWJhY2sgPSBuZXh0OworCQkJCX0KKworCQkJCWUgPSBnZXRfZW50cnkodGFibGVfYmFzZSwgdik7CisJCQl9IGVsc2UgeworCQkJCS8qIFRhcmdldHMgd2hpY2ggcmVlbnRlciBtdXN0IHJldHVybgorCQkJCSAqIGFicy4gdmVyZGljdHMKKwkJCQkgKi8KKwkJCQl2ZXJkaWN0ID0gdC0+dS5rZXJuZWwudGFyZ2V0LT50YXJnZXQocHNrYiwKKwkJCQkJCQkJICAgICBob29rLAorCQkJCQkJCQkgICAgIGluLCBvdXQsCisJCQkJCQkJCSAgICAgdC0+ZGF0YSwKKwkJCQkJCQkJICAgICB1c2VyZGF0YSk7CisKKwkJCQkvKiBUYXJnZXQgbWlnaHQgaGF2ZSBjaGFuZ2VkIHN0dWZmLiAqLworCQkJCWFycCA9ICgqcHNrYiktPm5oLmFycGg7CisKKwkJCQlpZiAodmVyZGljdCA9PSBBUlBUX0NPTlRJTlVFKQorCQkJCQllID0gKHZvaWQgKillICsgZS0+bmV4dF9vZmZzZXQ7CisJCQkJZWxzZQorCQkJCQkvKiBWZXJkaWN0ICovCisJCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJZSA9ICh2b2lkICopZSArIGUtPm5leHRfb2Zmc2V0OworCQl9CisJfSB3aGlsZSAoIWhvdGRyb3ApOworCXJlYWRfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7CisKKwlpZiAoaG90ZHJvcCkKKwkJcmV0dXJuIE5GX0RST1A7CisJZWxzZQorCQlyZXR1cm4gdmVyZGljdDsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpmaW5kX2lubGlzdF9sb2NrX25vbG9hZChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLAorCQkJCQkgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJICAgIGludCAqZXJyb3IsCisJCQkJCSAgICBzdHJ1Y3Qgc2VtYXBob3JlICptdXRleCkKK3sKKwl2b2lkICpyZXQ7CisKKwkqZXJyb3IgPSBkb3duX2ludGVycnVwdGlibGUobXV0ZXgpOworCWlmICgqZXJyb3IgIT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQgPSBsaXN0X25hbWVkX2ZpbmQoaGVhZCwgbmFtZSk7CisJaWYgKCFyZXQpIHsKKwkJKmVycm9yID0gLUVOT0VOVDsKKwkJdXAobXV0ZXgpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisjaWZuZGVmIENPTkZJR19LTU9ECisjZGVmaW5lIGZpbmRfaW5saXN0X2xvY2soaCxuLHAsZSxtKSBmaW5kX2lubGlzdF9sb2NrX25vbG9hZCgoaCksKG4pLChlKSwobSkpCisjZWxzZQorc3RhdGljIHZvaWQgKgorZmluZF9pbmxpc3RfbG9jayhzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLAorCQkgY29uc3QgY2hhciAqbmFtZSwKKwkJIGNvbnN0IGNoYXIgKnByZWZpeCwKKwkJIGludCAqZXJyb3IsCisJCSBzdHJ1Y3Qgc2VtYXBob3JlICptdXRleCkKK3sKKwl2b2lkICpyZXQ7CisKKwlyZXQgPSBmaW5kX2lubGlzdF9sb2NrX25vbG9hZChoZWFkLCBuYW1lLCBlcnJvciwgbXV0ZXgpOworCWlmICghcmV0KSB7CisJCWR1cHJpbnRmKCJmaW5kX2lubGlzdDogbG9hZGluZyBgJXMlcycuXG4iLCBwcmVmaXgsIG5hbWUpOworCQlyZXF1ZXN0X21vZHVsZSgiJXMlcyIsIHByZWZpeCwgbmFtZSk7CisJCXJldCA9IGZpbmRfaW5saXN0X2xvY2tfbm9sb2FkKGhlYWQsIG5hbWUsIGVycm9yLCBtdXRleCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhcnB0X3RhYmxlICphcnB0X2ZpbmRfdGFibGVfbG9jayhjb25zdCBjaGFyICpuYW1lLCBpbnQgKmVycm9yLCBzdHJ1Y3Qgc2VtYXBob3JlICptdXRleCkKK3sKKwlyZXR1cm4gZmluZF9pbmxpc3RfbG9jaygmYXJwdF90YWJsZXMsIG5hbWUsICJhcnB0YWJsZV8iLCBlcnJvciwgbXV0ZXgpOworfQorCitzdGF0aWMgc3RydWN0IGFycHRfdGFyZ2V0ICphcnB0X2ZpbmRfdGFyZ2V0X2xvY2soY29uc3QgY2hhciAqbmFtZSwgaW50ICplcnJvciwgc3RydWN0IHNlbWFwaG9yZSAqbXV0ZXgpCit7CisJcmV0dXJuIGZpbmRfaW5saXN0X2xvY2soJmFycHRfdGFyZ2V0LCBuYW1lLCAiYXJwdF8iLCBlcnJvciwgbXV0ZXgpOworfQorCisvKiBBbGwgemVyb2VzID09IHVuY29uZGl0aW9uYWwgcnVsZS4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IHVuY29uZGl0aW9uYWwoY29uc3Qgc3RydWN0IGFycHRfYXJwICphcnApCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKCphcnApL3NpemVvZihfX3UzMik7IGkrKykKKwkJaWYgKCgoX191MzIgKilhcnApW2ldKQorCQkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworLyogRmlndXJlcyBvdXQgZnJvbSB3aGF0IGhvb2sgZWFjaCBydWxlIGNhbiBiZSBjYWxsZWQ6IHJldHVybnMgMCBpZgorICogdGhlcmUgYXJlIGxvb3BzLiAgUHV0cyBob29rIGJpdG1hc2sgaW4gY29tZWZyb20uCisgKi8KK3N0YXRpYyBpbnQgbWFya19zb3VyY2VfY2hhaW5zKHN0cnVjdCBhcnB0X3RhYmxlX2luZm8gKm5ld2luZm8sIHVuc2lnbmVkIGludCB2YWxpZF9ob29rcykKK3sKKwl1bnNpZ25lZCBpbnQgaG9vazsKKworCS8qIE5vIHJlY3Vyc2lvbjsgdXNlIHBhY2tldCBjb3VudGVyIHRvIHNhdmUgYmFjayBwdHJzIChyZXNldAorCSAqIHRvIDAgYXMgd2UgbGVhdmUpLCBhbmQgY29tZWZyb20gdG8gc2F2ZSBzb3VyY2UgaG9vayBiaXRtYXNrLgorCSAqLworCWZvciAoaG9vayA9IDA7IGhvb2sgPCBORl9BUlBfTlVNSE9PS1M7IGhvb2srKykgeworCQl1bnNpZ25lZCBpbnQgcG9zID0gbmV3aW5mby0+aG9va19lbnRyeVtob29rXTsKKwkJc3RydWN0IGFycHRfZW50cnkgKmUKKwkJCT0gKHN0cnVjdCBhcnB0X2VudHJ5ICopKG5ld2luZm8tPmVudHJpZXMgKyBwb3MpOworCisJCWlmICghKHZhbGlkX2hvb2tzICYgKDEgPDwgaG9vaykpKQorCQkJY29udGludWU7CisKKwkJLyogU2V0IGluaXRpYWwgYmFjayBwb2ludGVyLiAqLworCQllLT5jb3VudGVycy5wY250ID0gcG9zOworCisJCWZvciAoOzspIHsKKwkJCXN0cnVjdCBhcnB0X3N0YW5kYXJkX3RhcmdldCAqdAorCQkJCT0gKHZvaWQgKilhcnB0X2dldF90YXJnZXQoZSk7CisKKwkJCWlmIChlLT5jb21lZnJvbSAmICgxIDw8IE5GX0FSUF9OVU1IT09LUykpIHsKKwkJCQlwcmludGsoImFycHRhYmxlczogbG9vcCBob29rICV1IHBvcyAldSAlMDhYLlxuIiwKKwkJCQkgICAgICAgaG9vaywgcG9zLCBlLT5jb21lZnJvbSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQllLT5jb21lZnJvbQorCQkJCXw9ICgoMSA8PCBob29rKSB8ICgxIDw8IE5GX0FSUF9OVU1IT09LUykpOworCisJCQkvKiBVbmNvbmRpdGlvbmFsIHJldHVybi9FTkQuICovCisJCQlpZiAoZS0+dGFyZ2V0X29mZnNldCA9PSBzaXplb2Yoc3RydWN0IGFycHRfZW50cnkpCisJCQkgICAgJiYgKHN0cmNtcCh0LT50YXJnZXQudS51c2VyLm5hbWUsCisJCQkJICAgICAgIEFSUFRfU1RBTkRBUkRfVEFSR0VUKSA9PSAwKQorCQkJICAgICYmIHQtPnZlcmRpY3QgPCAwCisJCQkgICAgJiYgdW5jb25kaXRpb25hbCgmZS0+YXJwKSkgeworCQkJCXVuc2lnbmVkIGludCBvbGRwb3MsIHNpemU7CisKKwkJCQkvKiBSZXR1cm46IGJhY2t0cmFjayB0aHJvdWdoIHRoZSBsYXN0CisJCQkJICogYmlnIGp1bXAuCisJCQkJICovCisJCQkJZG8geworCQkJCQllLT5jb21lZnJvbSBePSAoMTw8TkZfQVJQX05VTUhPT0tTKTsKKwkJCQkJb2xkcG9zID0gcG9zOworCQkJCQlwb3MgPSBlLT5jb3VudGVycy5wY250OworCQkJCQllLT5jb3VudGVycy5wY250ID0gMDsKKworCQkJCQkvKiBXZSdyZSBhdCB0aGUgc3RhcnQuICovCisJCQkJCWlmIChwb3MgPT0gb2xkcG9zKQorCQkJCQkJZ290byBuZXh0OworCisJCQkJCWUgPSAoc3RydWN0IGFycHRfZW50cnkgKikKKwkJCQkJCShuZXdpbmZvLT5lbnRyaWVzICsgcG9zKTsKKwkJCQl9IHdoaWxlIChvbGRwb3MgPT0gcG9zICsgZS0+bmV4dF9vZmZzZXQpOworCisJCQkJLyogTW92ZSBhbG9uZyBvbmUgKi8KKwkJCQlzaXplID0gZS0+bmV4dF9vZmZzZXQ7CisJCQkJZSA9IChzdHJ1Y3QgYXJwdF9lbnRyeSAqKQorCQkJCQkobmV3aW5mby0+ZW50cmllcyArIHBvcyArIHNpemUpOworCQkJCWUtPmNvdW50ZXJzLnBjbnQgPSBwb3M7CisJCQkJcG9zICs9IHNpemU7CisJCQl9IGVsc2UgeworCQkJCWludCBuZXdwb3MgPSB0LT52ZXJkaWN0OworCisJCQkJaWYgKHN0cmNtcCh0LT50YXJnZXQudS51c2VyLm5hbWUsCisJCQkJCSAgIEFSUFRfU1RBTkRBUkRfVEFSR0VUKSA9PSAwCisJCQkJICAgICYmIG5ld3BvcyA+PSAwKSB7CisJCQkJCS8qIFRoaXMgYSBqdW1wOyBjaGFzZSBpdC4gKi8KKwkJCQkJZHVwcmludGYoIkp1bXAgcnVsZSAldSAtPiAldVxuIiwKKwkJCQkJCSBwb3MsIG5ld3Bvcyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogLi4uIHRoaXMgaXMgYSBmYWxsdGhydSAqLworCQkJCQluZXdwb3MgPSBwb3MgKyBlLT5uZXh0X29mZnNldDsKKwkJCQl9CisJCQkJZSA9IChzdHJ1Y3QgYXJwdF9lbnRyeSAqKQorCQkJCQkobmV3aW5mby0+ZW50cmllcyArIG5ld3Bvcyk7CisJCQkJZS0+Y291bnRlcnMucGNudCA9IHBvczsKKwkJCQlwb3MgPSBuZXdwb3M7CisJCQl9CisJCX0KKwkJbmV4dDoKKwkJZHVwcmludGYoIkZpbmlzaGVkIGNoYWluICV1XG4iLCBob29rKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHN0YW5kYXJkX2NoZWNrKGNvbnN0IHN0cnVjdCBhcnB0X2VudHJ5X3RhcmdldCAqdCwKKwkJCQkgdW5zaWduZWQgaW50IG1heF9vZmZzZXQpCit7CisJc3RydWN0IGFycHRfc3RhbmRhcmRfdGFyZ2V0ICp0YXJnID0gKHZvaWQgKil0OworCisJLyogQ2hlY2sgc3RhbmRhcmQgaW5mby4gKi8KKwlpZiAodC0+dS50YXJnZXRfc2l6ZQorCSAgICAhPSBBUlBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgYXJwdF9zdGFuZGFyZF90YXJnZXQpKSkgeworCQlkdXByaW50ZigiYXJwdF9zdGFuZGFyZF9jaGVjazogdGFyZ2V0IHNpemUgJXUgIT0gJVp1XG4iLAorCQkJIHQtPnUudGFyZ2V0X3NpemUsCisJCQkgQVJQVF9BTElHTihzaXplb2Yoc3RydWN0IGFycHRfc3RhbmRhcmRfdGFyZ2V0KSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodGFyZy0+dmVyZGljdCA+PSAwCisJICAgICYmIHRhcmctPnZlcmRpY3QgPiBtYXhfb2Zmc2V0IC0gc2l6ZW9mKHN0cnVjdCBhcnB0X2VudHJ5KSkgeworCQlkdXByaW50ZigiYXJwdF9zdGFuZGFyZF9jaGVjazogYmFkIHZlcmRpY3QgKCVpKVxuIiwKKwkJCSB0YXJnLT52ZXJkaWN0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHRhcmctPnZlcmRpY3QgPCAtTkZfTUFYX1ZFUkRJQ1QgLSAxKSB7CisJCWR1cHJpbnRmKCJhcnB0X3N0YW5kYXJkX2NoZWNrOiBiYWQgbmVnYXRpdmUgdmVyZGljdCAoJWkpXG4iLAorCQkJIHRhcmctPnZlcmRpY3QpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXJwdF90YXJnZXQgYXJwdF9zdGFuZGFyZF90YXJnZXQ7CisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX2VudHJ5KHN0cnVjdCBhcnB0X2VudHJ5ICplLCBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqaSkKK3sKKwlzdHJ1Y3QgYXJwdF9lbnRyeV90YXJnZXQgKnQ7CisJc3RydWN0IGFycHRfdGFyZ2V0ICp0YXJnZXQ7CisJaW50IHJldDsKKworCWlmICghYXJwX2NoZWNrZW50cnkoJmUtPmFycCkpIHsKKwkJZHVwcmludGYoImFycF90YWJsZXM6IGFycCBjaGVjayBmYWlsZWQgJXAgJXMuXG4iLCBlLCBuYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdCA9IGFycHRfZ2V0X3RhcmdldChlKTsKKwl0YXJnZXQgPSBhcnB0X2ZpbmRfdGFyZ2V0X2xvY2sodC0+dS51c2VyLm5hbWUsICZyZXQsICZhcnB0X211dGV4KTsKKwlpZiAoIXRhcmdldCkgeworCQlkdXByaW50ZigiY2hlY2tfZW50cnk6IGAlcycgbm90IGZvdW5kXG4iLCB0LT51LnVzZXIubmFtZSk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KCh0YXJnZXQtPm1lKSkpIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwl0LT51Lmtlcm5lbC50YXJnZXQgPSB0YXJnZXQ7CisJdXAoJmFycHRfbXV0ZXgpOworCisJaWYgKHQtPnUua2VybmVsLnRhcmdldCA9PSAmYXJwdF9zdGFuZGFyZF90YXJnZXQpIHsKKwkJaWYgKCFzdGFuZGFyZF9jaGVjayh0LCBzaXplKSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIGlmICh0LT51Lmtlcm5lbC50YXJnZXQtPmNoZWNrZW50cnkKKwkJICAgJiYgIXQtPnUua2VybmVsLnRhcmdldC0+Y2hlY2tlbnRyeShuYW1lLCBlLCB0LT5kYXRhLAorCQkJCQkJICAgICAgdC0+dS50YXJnZXRfc2l6ZQorCQkJCQkJICAgICAgLSBzaXplb2YoKnQpLAorCQkJCQkJICAgICAgZS0+Y29tZWZyb20pKSB7CisJCW1vZHVsZV9wdXQodC0+dS5rZXJuZWwudGFyZ2V0LT5tZSk7CisJCWR1cHJpbnRmKCJhcnBfdGFibGVzOiBjaGVjayBmYWlsZWQgZm9yIGAlcycuXG4iLAorCQkJIHQtPnUua2VybmVsLnRhcmdldC0+bmFtZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCSgqaSkrKzsKKwlyZXR1cm4gMDsKKworb3V0X3VubG9jazoKKwl1cCgmYXJwdF9tdXRleCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfZW50cnlfc2l6ZV9hbmRfaG9va3Moc3RydWN0IGFycHRfZW50cnkgKmUsCisJCQkJCSAgICAgc3RydWN0IGFycHRfdGFibGVfaW5mbyAqbmV3aW5mbywKKwkJCQkJICAgICB1bnNpZ25lZCBjaGFyICpiYXNlLAorCQkJCQkgICAgIHVuc2lnbmVkIGNoYXIgKmxpbWl0LAorCQkJCQkgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqaG9va19lbnRyaWVzLAorCQkJCQkgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqdW5kZXJmbG93cywKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgKmkpCit7CisJdW5zaWduZWQgaW50IGg7CisKKwlpZiAoKHVuc2lnbmVkIGxvbmcpZSAlIF9fYWxpZ25vZl9fKHN0cnVjdCBhcnB0X2VudHJ5KSAhPSAwCisJICAgIHx8ICh1bnNpZ25lZCBjaGFyICopZSArIHNpemVvZihzdHJ1Y3QgYXJwdF9lbnRyeSkgPj0gbGltaXQpIHsKKwkJZHVwcmludGYoIkJhZCBvZmZzZXQgJXBcbiIsIGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZS0+bmV4dF9vZmZzZXQKKwkgICAgPCBzaXplb2Yoc3RydWN0IGFycHRfZW50cnkpICsgc2l6ZW9mKHN0cnVjdCBhcnB0X2VudHJ5X3RhcmdldCkpIHsKKwkJZHVwcmludGYoImNoZWNraW5nOiBlbGVtZW50ICVwIHNpemUgJXVcbiIsCisJCQkgZSwgZS0+bmV4dF9vZmZzZXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDaGVjayBob29rcyAmIHVuZGVyZmxvd3MgKi8KKwlmb3IgKGggPSAwOyBoIDwgTkZfQVJQX05VTUhPT0tTOyBoKyspIHsKKwkJaWYgKCh1bnNpZ25lZCBjaGFyICopZSAtIGJhc2UgPT0gaG9va19lbnRyaWVzW2hdKQorCQkJbmV3aW5mby0+aG9va19lbnRyeVtoXSA9IGhvb2tfZW50cmllc1toXTsKKwkJaWYgKCh1bnNpZ25lZCBjaGFyICopZSAtIGJhc2UgPT0gdW5kZXJmbG93c1toXSkKKwkJCW5ld2luZm8tPnVuZGVyZmxvd1toXSA9IHVuZGVyZmxvd3NbaF07CisJfQorCisJLyogRklYTUU6IHVuZGVyZmxvd3MgbXVzdCBiZSB1bmNvbmRpdGlvbmFsLCBzdGFuZGFyZCB2ZXJkaWN0cworICAgICAgICAgICA8IDAgKG5vdCBBUlBUX1JFVFVSTikuIC0tUlIgKi8KKworCS8qIENsZWFyIGNvdW50ZXJzIGFuZCBjb21lZnJvbSAqLworCWUtPmNvdW50ZXJzID0gKChzdHJ1Y3QgYXJwdF9jb3VudGVycykgeyAwLCAwIH0pOworCWUtPmNvbWVmcm9tID0gMDsKKworCSgqaSkrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY2xlYW51cF9lbnRyeShzdHJ1Y3QgYXJwdF9lbnRyeSAqZSwgdW5zaWduZWQgaW50ICppKQoreworCXN0cnVjdCBhcnB0X2VudHJ5X3RhcmdldCAqdDsKKworCWlmIChpICYmICgqaSktLSA9PSAwKQorCQlyZXR1cm4gMTsKKworCXQgPSBhcnB0X2dldF90YXJnZXQoZSk7CisJaWYgKHQtPnUua2VybmVsLnRhcmdldC0+ZGVzdHJveSkKKwkJdC0+dS5rZXJuZWwudGFyZ2V0LT5kZXN0cm95KHQtPmRhdGEsCisJCQkJCSAgICB0LT51LnRhcmdldF9zaXplIC0gc2l6ZW9mKCp0KSk7CisJbW9kdWxlX3B1dCh0LT51Lmtlcm5lbC50YXJnZXQtPm1lKTsKKwlyZXR1cm4gMDsKK30KKworLyogQ2hlY2tzIGFuZCB0cmFuc2xhdGVzIHRoZSB1c2VyLXN1cHBsaWVkIHRhYmxlIHNlZ21lbnQgKGhlbGQgaW4KKyAqIG5ld2luZm8pLgorICovCitzdGF0aWMgaW50IHRyYW5zbGF0ZV90YWJsZShjb25zdCBjaGFyICpuYW1lLAorCQkJICAgdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzLAorCQkJICAgc3RydWN0IGFycHRfdGFibGVfaW5mbyAqbmV3aW5mbywKKwkJCSAgIHVuc2lnbmVkIGludCBzaXplLAorCQkJICAgdW5zaWduZWQgaW50IG51bWJlciwKKwkJCSAgIGNvbnN0IHVuc2lnbmVkIGludCAqaG9va19lbnRyaWVzLAorCQkJICAgY29uc3QgdW5zaWduZWQgaW50ICp1bmRlcmZsb3dzKQoreworCXVuc2lnbmVkIGludCBpOworCWludCByZXQ7CisKKwluZXdpbmZvLT5zaXplID0gc2l6ZTsKKwluZXdpbmZvLT5udW1iZXIgPSBudW1iZXI7CisKKwkvKiBJbml0IGFsbCBob29rcyB0byBpbXBvc3NpYmxlIHZhbHVlLiAqLworCWZvciAoaSA9IDA7IGkgPCBORl9BUlBfTlVNSE9PS1M7IGkrKykgeworCQluZXdpbmZvLT5ob29rX2VudHJ5W2ldID0gMHhGRkZGRkZGRjsKKwkJbmV3aW5mby0+dW5kZXJmbG93W2ldID0gMHhGRkZGRkZGRjsKKwl9CisKKwlkdXByaW50ZigidHJhbnNsYXRlX3RhYmxlOiBzaXplICV1XG4iLCBuZXdpbmZvLT5zaXplKTsKKwlpID0gMDsKKworCS8qIFdhbGsgdGhyb3VnaCBlbnRyaWVzLCBjaGVja2luZyBvZmZzZXRzLiAqLworCXJldCA9IEFSUFRfRU5UUllfSVRFUkFURShuZXdpbmZvLT5lbnRyaWVzLCBuZXdpbmZvLT5zaXplLAorCQkJCSBjaGVja19lbnRyeV9zaXplX2FuZF9ob29rcywKKwkJCQkgbmV3aW5mbywKKwkJCQkgbmV3aW5mby0+ZW50cmllcywKKwkJCQkgbmV3aW5mby0+ZW50cmllcyArIHNpemUsCisJCQkJIGhvb2tfZW50cmllcywgdW5kZXJmbG93cywgJmkpOworCWR1cHJpbnRmKCJ0cmFuc2xhdGVfdGFibGU6IEFSUFRfRU5UUllfSVRFUkFURSBnaXZlcyAlZFxuIiwgcmV0KTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoaSAhPSBudW1iZXIpIHsKKwkJZHVwcmludGYoInRyYW5zbGF0ZV90YWJsZTogJXUgbm90ICV1IGVudHJpZXNcbiIsCisJCQkgaSwgbnVtYmVyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2hlY2sgaG9va3MgYWxsIGFzc2lnbmVkICovCisJZm9yIChpID0gMDsgaSA8IE5GX0FSUF9OVU1IT09LUzsgaSsrKSB7CisJCS8qIE9ubHkgaG9va3Mgd2hpY2ggYXJlIHZhbGlkICovCisJCWlmICghKHZhbGlkX2hvb2tzICYgKDEgPDwgaSkpKQorCQkJY29udGludWU7CisJCWlmIChuZXdpbmZvLT5ob29rX2VudHJ5W2ldID09IDB4RkZGRkZGRkYpIHsKKwkJCWR1cHJpbnRmKCJJbnZhbGlkIGhvb2sgZW50cnkgJXUgJXVcbiIsCisJCQkJIGksIGhvb2tfZW50cmllc1tpXSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAobmV3aW5mby0+dW5kZXJmbG93W2ldID09IDB4RkZGRkZGRkYpIHsKKwkJCWR1cHJpbnRmKCJJbnZhbGlkIHVuZGVyZmxvdyAldSAldVxuIiwKKwkJCQkgaSwgdW5kZXJmbG93c1tpXSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWlmICghbWFya19zb3VyY2VfY2hhaW5zKG5ld2luZm8sIHZhbGlkX2hvb2tzKSkgeworCQlkdXByaW50ZigiTG9vcGluZyBob29rXG4iKTsKKwkJcmV0dXJuIC1FTE9PUDsKKwl9CisKKwkvKiBGaW5hbGx5LCBlYWNoIHNhbml0eSBjaGVjayBtdXN0IHBhc3MgKi8KKwlpID0gMDsKKwlyZXQgPSBBUlBUX0VOVFJZX0lURVJBVEUobmV3aW5mby0+ZW50cmllcywgbmV3aW5mby0+c2l6ZSwKKwkJCQkgY2hlY2tfZW50cnksIG5hbWUsIHNpemUsICZpKTsKKworCWlmIChyZXQgIT0gMCkgeworCQlBUlBUX0VOVFJZX0lURVJBVEUobmV3aW5mby0+ZW50cmllcywgbmV3aW5mby0+c2l6ZSwKKwkJCQkgICBjbGVhbnVwX2VudHJ5LCAmaSk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogQW5kIG9uZSBjb3B5IGZvciBldmVyeSBvdGhlciBDUFUgKi8KKwlmb3IgKGkgPSAxOyBpIDwgbnVtX3Bvc3NpYmxlX2NwdXMoKTsgaSsrKSB7CisJCW1lbWNweShuZXdpbmZvLT5lbnRyaWVzICsgU01QX0FMSUdOKG5ld2luZm8tPnNpemUpKmksCisJCSAgICAgICBuZXdpbmZvLT5lbnRyaWVzLAorCQkgICAgICAgU01QX0FMSUdOKG5ld2luZm8tPnNpemUpKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGFycHRfdGFibGVfaW5mbyAqcmVwbGFjZV90YWJsZShzdHJ1Y3QgYXJwdF90YWJsZSAqdGFibGUsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IG51bV9jb3VudGVycywKKwkJCQkJICAgICBzdHJ1Y3QgYXJwdF90YWJsZV9pbmZvICpuZXdpbmZvLAorCQkJCQkgICAgIGludCAqZXJyb3IpCit7CisJc3RydWN0IGFycHRfdGFibGVfaW5mbyAqb2xkaW5mbzsKKworCS8qIERvIHRoZSBzdWJzdGl0dXRpb24uICovCisJd3JpdGVfbG9ja19iaCgmdGFibGUtPmxvY2spOworCS8qIENoZWNrIGluc2lkZSBsb2NrOiBpcyB0aGUgb2xkIG51bWJlciBjb3JyZWN0PyAqLworCWlmIChudW1fY291bnRlcnMgIT0gdGFibGUtPnByaXZhdGUtPm51bWJlcikgeworCQlkdXByaW50ZigibnVtX2NvdW50ZXJzICE9IHRhYmxlLT5wcml2YXRlLT5udW1iZXIgKCV1LyV1KVxuIiwKKwkJCSBudW1fY291bnRlcnMsIHRhYmxlLT5wcml2YXRlLT5udW1iZXIpOworCQl3cml0ZV91bmxvY2tfYmgoJnRhYmxlLT5sb2NrKTsKKwkJKmVycm9yID0gLUVBR0FJTjsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW9sZGluZm8gPSB0YWJsZS0+cHJpdmF0ZTsKKwl0YWJsZS0+cHJpdmF0ZSA9IG5ld2luZm87CisJbmV3aW5mby0+aW5pdGlhbF9lbnRyaWVzID0gb2xkaW5mby0+aW5pdGlhbF9lbnRyaWVzOworCXdyaXRlX3VubG9ja19iaCgmdGFibGUtPmxvY2spOworCisJcmV0dXJuIG9sZGluZm87Cit9CisKKy8qIEdldHMgY291bnRlcnMuICovCitzdGF0aWMgaW5saW5lIGludCBhZGRfZW50cnlfdG9fY291bnRlcihjb25zdCBzdHJ1Y3QgYXJwdF9lbnRyeSAqZSwKKwkJCQkgICAgICAgc3RydWN0IGFycHRfY291bnRlcnMgdG90YWxbXSwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50ICppKQoreworCUFERF9DT1VOVEVSKHRvdGFsWyppXSwgZS0+Y291bnRlcnMuYmNudCwgZS0+Y291bnRlcnMucGNudCk7CisKKwkoKmkpKys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9jb3VudGVycyhjb25zdCBzdHJ1Y3QgYXJwdF90YWJsZV9pbmZvICp0LAorCQkJIHN0cnVjdCBhcnB0X2NvdW50ZXJzIGNvdW50ZXJzW10pCit7CisJdW5zaWduZWQgaW50IGNwdTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoY3B1ID0gMDsgY3B1IDwgbnVtX3Bvc3NpYmxlX2NwdXMoKTsgY3B1KyspIHsKKwkJaSA9IDA7CisJCUFSUFRfRU5UUllfSVRFUkFURSh0LT5lbnRyaWVzICsgVEFCTEVfT0ZGU0VUKHQsIGNwdSksCisJCQkJICAgdC0+c2l6ZSwKKwkJCQkgICBhZGRfZW50cnlfdG9fY291bnRlciwKKwkJCQkgICBjb3VudGVycywKKwkJCQkgICAmaSk7CisJfQorfQorCitzdGF0aWMgaW50IGNvcHlfZW50cmllc190b191c2VyKHVuc2lnbmVkIGludCB0b3RhbF9zaXplLAorCQkJCXN0cnVjdCBhcnB0X3RhYmxlICp0YWJsZSwKKwkJCQl2b2lkIF9fdXNlciAqdXNlcnB0cikKK3sKKwl1bnNpZ25lZCBpbnQgb2ZmLCBudW0sIGNvdW50ZXJzaXplOworCXN0cnVjdCBhcnB0X2VudHJ5ICplOworCXN0cnVjdCBhcnB0X2NvdW50ZXJzICpjb3VudGVyczsKKwlpbnQgcmV0ID0gMDsKKworCS8qIFdlIG5lZWQgYXRvbWljIHNuYXBzaG90IG9mIGNvdW50ZXJzOiByZXN0IGRvZXNuJ3QgY2hhbmdlCisJICogKG90aGVyIHRoYW4gY29tZWZyb20sIHdoaWNoIHVzZXJzcGFjZSBkb2Vzbid0IGNhcmUKKwkgKiBhYm91dCkuCisJICovCisJY291bnRlcnNpemUgPSBzaXplb2Yoc3RydWN0IGFycHRfY291bnRlcnMpICogdGFibGUtPnByaXZhdGUtPm51bWJlcjsKKwljb3VudGVycyA9IHZtYWxsb2MoY291bnRlcnNpemUpOworCisJaWYgKGNvdW50ZXJzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogRmlyc3QsIHN1bSBjb3VudGVycy4uLiAqLworCW1lbXNldChjb3VudGVycywgMCwgY291bnRlcnNpemUpOworCXdyaXRlX2xvY2tfYmgoJnRhYmxlLT5sb2NrKTsKKwlnZXRfY291bnRlcnModGFibGUtPnByaXZhdGUsIGNvdW50ZXJzKTsKKwl3cml0ZV91bmxvY2tfYmgoJnRhYmxlLT5sb2NrKTsKKworCS8qIC4uLiB0aGVuIGNvcHkgZW50aXJlIHRoaW5nIGZyb20gQ1BVIDAuLi4gKi8KKwlpZiAoY29weV90b191c2VyKHVzZXJwdHIsIHRhYmxlLT5wcml2YXRlLT5lbnRyaWVzLCB0b3RhbF9zaXplKSAhPSAwKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZnJlZV9jb3VudGVyczsKKwl9CisKKwkvKiBGSVhNRTogdXNlIGl0ZXJhdG9yIG1hY3JvcyAtLVJSICovCisJLyogLi4uIHRoZW4gZ28gYmFjayBhbmQgZml4IGNvdW50ZXJzIGFuZCBuYW1lcyAqLworCWZvciAob2ZmID0gMCwgbnVtID0gMDsgb2ZmIDwgdG90YWxfc2l6ZTsgb2ZmICs9IGUtPm5leHRfb2Zmc2V0LCBudW0rKyl7CisJCXN0cnVjdCBhcnB0X2VudHJ5X3RhcmdldCAqdDsKKworCQllID0gKHN0cnVjdCBhcnB0X2VudHJ5ICopKHRhYmxlLT5wcml2YXRlLT5lbnRyaWVzICsgb2ZmKTsKKwkJaWYgKGNvcHlfdG9fdXNlcih1c2VycHRyICsgb2ZmCisJCQkJICsgb2Zmc2V0b2Yoc3RydWN0IGFycHRfZW50cnksIGNvdW50ZXJzKSwKKwkJCQkgJmNvdW50ZXJzW251bV0sCisJCQkJIHNpemVvZihjb3VudGVyc1tudW1dKSkgIT0gMCkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gZnJlZV9jb3VudGVyczsKKwkJfQorCisJCXQgPSBhcnB0X2dldF90YXJnZXQoZSk7CisJCWlmIChjb3B5X3RvX3VzZXIodXNlcnB0ciArIG9mZiArIGUtPnRhcmdldF9vZmZzZXQKKwkJCQkgKyBvZmZzZXRvZihzdHJ1Y3QgYXJwdF9lbnRyeV90YXJnZXQsCisJCQkJCSAgICB1LnVzZXIubmFtZSksCisJCQkJIHQtPnUua2VybmVsLnRhcmdldC0+bmFtZSwKKwkJCQkgc3RybGVuKHQtPnUua2VybmVsLnRhcmdldC0+bmFtZSkrMSkgIT0gMCkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gZnJlZV9jb3VudGVyczsKKwkJfQorCX0KKworIGZyZWVfY291bnRlcnM6CisJdmZyZWUoY291bnRlcnMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2VudHJpZXMoY29uc3Qgc3RydWN0IGFycHRfZ2V0X2VudHJpZXMgKmVudHJpZXMsCisJCSAgICAgICBzdHJ1Y3QgYXJwdF9nZXRfZW50cmllcyBfX3VzZXIgKnVwdHIpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYXJwdF90YWJsZSAqdDsKKworCXQgPSBhcnB0X2ZpbmRfdGFibGVfbG9jayhlbnRyaWVzLT5uYW1lLCAmcmV0LCAmYXJwdF9tdXRleCk7CisJaWYgKHQpIHsKKwkJZHVwcmludGYoInQtPnByaXZhdGUtPm51bWJlciA9ICV1XG4iLAorCQkJIHQtPnByaXZhdGUtPm51bWJlcik7CisJCWlmIChlbnRyaWVzLT5zaXplID09IHQtPnByaXZhdGUtPnNpemUpCisJCQlyZXQgPSBjb3B5X2VudHJpZXNfdG9fdXNlcih0LT5wcml2YXRlLT5zaXplLAorCQkJCQkJICAgdCwgdXB0ci0+ZW50cnl0YWJsZSk7CisJCWVsc2UgeworCQkJZHVwcmludGYoImdldF9lbnRyaWVzOiBJJ3ZlIGdvdCAldSBub3QgJXUhXG4iLAorCQkJCSB0LT5wcml2YXRlLT5zaXplLAorCQkJCSBlbnRyaWVzLT5zaXplKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwkJdXAoJmFycHRfbXV0ZXgpOworCX0gZWxzZQorCQlkdXByaW50ZigiZ2V0X2VudHJpZXM6IENhbid0IGZpbmQgJXMhXG4iLAorCQkJIGVudHJpZXMtPm5hbWUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkb19yZXBsYWNlKHZvaWQgX191c2VyICp1c2VyLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWludCByZXQ7CisJc3RydWN0IGFycHRfcmVwbGFjZSB0bXA7CisJc3RydWN0IGFycHRfdGFibGUgKnQ7CisJc3RydWN0IGFycHRfdGFibGVfaW5mbyAqbmV3aW5mbywgKm9sZGluZm87CisJc3RydWN0IGFycHRfY291bnRlcnMgKmNvdW50ZXJzOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXAsIHVzZXIsIHNpemVvZih0bXApKSAhPSAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIEhhY2s6IENhdXNlcyBpcGNoYWlucyB0byBnaXZlIGNvcnJlY3QgZXJyb3IgbXNnIC0tUlIgKi8KKwlpZiAobGVuICE9IHNpemVvZih0bXApICsgdG1wLnNpemUpCisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisKKwkvKiBQZWRhbnRyeTogcHJldmVudCB0aGVtIGZyb20gaGl0dGluZyBCVUcoKSBpbiB2bWFsbG9jLmMgLS1SUiAqLworCWlmICgoU01QX0FMSUdOKHRtcC5zaXplKSA+PiBQQUdFX1NISUZUKSArIDIgPiBudW1fcGh5c3BhZ2VzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5ld2luZm8gPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgYXJwdF90YWJsZV9pbmZvKQorCQkJICArIFNNUF9BTElHTih0bXAuc2l6ZSkgKiBudW1fcG9zc2libGVfY3B1cygpKTsKKwlpZiAoIW5ld2luZm8pCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGNvcHlfZnJvbV91c2VyKG5ld2luZm8tPmVudHJpZXMsIHVzZXIgKyBzaXplb2YodG1wKSwKKwkJCSAgIHRtcC5zaXplKSAhPSAwKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZnJlZV9uZXdpbmZvOworCX0KKworCWNvdW50ZXJzID0gdm1hbGxvYyh0bXAubnVtX2NvdW50ZXJzICogc2l6ZW9mKHN0cnVjdCBhcnB0X2NvdW50ZXJzKSk7CisJaWYgKCFjb3VudGVycykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZyZWVfbmV3aW5mbzsKKwl9CisJbWVtc2V0KGNvdW50ZXJzLCAwLCB0bXAubnVtX2NvdW50ZXJzICogc2l6ZW9mKHN0cnVjdCBhcnB0X2NvdW50ZXJzKSk7CisKKwlyZXQgPSB0cmFuc2xhdGVfdGFibGUodG1wLm5hbWUsIHRtcC52YWxpZF9ob29rcywKKwkJCSAgICAgIG5ld2luZm8sIHRtcC5zaXplLCB0bXAubnVtX2VudHJpZXMsCisJCQkgICAgICB0bXAuaG9va19lbnRyeSwgdG1wLnVuZGVyZmxvdyk7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIGZyZWVfbmV3aW5mb19jb3VudGVyczsKKworCWR1cHJpbnRmKCJhcnBfdGFibGVzOiBUcmFuc2xhdGVkIHRhYmxlXG4iKTsKKworCXQgPSBhcnB0X2ZpbmRfdGFibGVfbG9jayh0bXAubmFtZSwgJnJldCwgJmFycHRfbXV0ZXgpOworCWlmICghdCkKKwkJZ290byBmcmVlX25ld2luZm9fY291bnRlcnNfdW50cmFuczsKKworCS8qIFlvdSBsaWVkISAqLworCWlmICh0bXAudmFsaWRfaG9va3MgIT0gdC0+dmFsaWRfaG9va3MpIHsKKwkJZHVwcmludGYoIlZhbGlkIGhvb2sgY3JhcDogJTA4WCB2cyAlMDhYXG4iLAorCQkJIHRtcC52YWxpZF9ob29rcywgdC0+dmFsaWRfaG9va3MpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZyZWVfbmV3aW5mb19jb3VudGVyc191bnRyYW5zX3VubG9jazsKKwl9CisKKwkvKiBHZXQgYSByZWZlcmVuY2UgaW4gYWR2YW5jZSwgd2UncmUgbm90IGFsbG93ZWQgZmFpbCBsYXRlciAqLworCWlmICghdHJ5X21vZHVsZV9nZXQodC0+bWUpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBmcmVlX25ld2luZm9fY291bnRlcnNfdW50cmFuc191bmxvY2s7CisJfQorCisJb2xkaW5mbyA9IHJlcGxhY2VfdGFibGUodCwgdG1wLm51bV9jb3VudGVycywgbmV3aW5mbywgJnJldCk7CisJaWYgKCFvbGRpbmZvKQorCQlnb3RvIHB1dF9tb2R1bGU7CisKKwkvKiBVcGRhdGUgbW9kdWxlIHVzYWdlIGNvdW50IGJhc2VkIG9uIG51bWJlciBvZiBydWxlcyAqLworCWR1cHJpbnRmKCJkb19yZXBsYWNlOiBvbGRudW09JXUsIGluaXRudW09JXUsIG5ld251bT0ldVxuIiwKKwkJb2xkaW5mby0+bnVtYmVyLCBvbGRpbmZvLT5pbml0aWFsX2VudHJpZXMsIG5ld2luZm8tPm51bWJlcik7CisJaWYgKChvbGRpbmZvLT5udW1iZXIgPiBvbGRpbmZvLT5pbml0aWFsX2VudHJpZXMpIHx8IAorCSAgICAobmV3aW5mby0+bnVtYmVyIDw9IG9sZGluZm8tPmluaXRpYWxfZW50cmllcykpIAorCQltb2R1bGVfcHV0KHQtPm1lKTsKKwlpZiAoKG9sZGluZm8tPm51bWJlciA+IG9sZGluZm8tPmluaXRpYWxfZW50cmllcykgJiYKKwkgICAgKG5ld2luZm8tPm51bWJlciA8PSBvbGRpbmZvLT5pbml0aWFsX2VudHJpZXMpKQorCQltb2R1bGVfcHV0KHQtPm1lKTsKKworCS8qIEdldCB0aGUgb2xkIGNvdW50ZXJzLiAqLworCWdldF9jb3VudGVycyhvbGRpbmZvLCBjb3VudGVycyk7CisJLyogRGVjcmVhc2UgbW9kdWxlIHVzYWdlIGNvdW50cyBhbmQgZnJlZSByZXNvdXJjZSAqLworCUFSUFRfRU5UUllfSVRFUkFURShvbGRpbmZvLT5lbnRyaWVzLCBvbGRpbmZvLT5zaXplLCBjbGVhbnVwX2VudHJ5LE5VTEwpOworCXZmcmVlKG9sZGluZm8pOworCWlmIChjb3B5X3RvX3VzZXIodG1wLmNvdW50ZXJzLCBjb3VudGVycywKKwkJCSBzaXplb2Yoc3RydWN0IGFycHRfY291bnRlcnMpICogdG1wLm51bV9jb3VudGVycykgIT0gMCkKKwkJcmV0ID0gLUVGQVVMVDsKKwl2ZnJlZShjb3VudGVycyk7CisJdXAoJmFycHRfbXV0ZXgpOworCXJldHVybiByZXQ7CisKKyBwdXRfbW9kdWxlOgorCW1vZHVsZV9wdXQodC0+bWUpOworIGZyZWVfbmV3aW5mb19jb3VudGVyc191bnRyYW5zX3VubG9jazoKKwl1cCgmYXJwdF9tdXRleCk7CisgZnJlZV9uZXdpbmZvX2NvdW50ZXJzX3VudHJhbnM6CisJQVJQVF9FTlRSWV9JVEVSQVRFKG5ld2luZm8tPmVudHJpZXMsIG5ld2luZm8tPnNpemUsIGNsZWFudXBfZW50cnksIE5VTEwpOworIGZyZWVfbmV3aW5mb19jb3VudGVyczoKKwl2ZnJlZShjb3VudGVycyk7CisgZnJlZV9uZXdpbmZvOgorCXZmcmVlKG5ld2luZm8pOworCXJldHVybiByZXQ7Cit9CisKKy8qIFdlJ3JlIGxhenksIGFuZCBhZGQgdG8gdGhlIGZpcnN0IENQVTsgb3ZlcmZsb3cgd29ya3MgaXRzIGZleSBtYWdpYworICogYW5kIGV2ZXJ5dGhpbmcgaXMgT0suCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGFkZF9jb3VudGVyX3RvX2VudHJ5KHN0cnVjdCBhcnB0X2VudHJ5ICplLAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgYXJwdF9jb3VudGVycyBhZGRtZVtdLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmkpCit7CisKKwlBRERfQ09VTlRFUihlLT5jb3VudGVycywgYWRkbWVbKmldLmJjbnQsIGFkZG1lWyppXS5wY250KTsKKworCSgqaSkrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19hZGRfY291bnRlcnModm9pZCBfX3VzZXIgKnVzZXIsIHVuc2lnbmVkIGludCBsZW4pCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGFycHRfY291bnRlcnNfaW5mbyB0bXAsICpwYWRkYzsKKwlzdHJ1Y3QgYXJwdF90YWJsZSAqdDsKKwlpbnQgcmV0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXAsIHVzZXIsIHNpemVvZih0bXApKSAhPSAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChsZW4gIT0gc2l6ZW9mKHRtcCkgKyB0bXAubnVtX2NvdW50ZXJzKnNpemVvZihzdHJ1Y3QgYXJwdF9jb3VudGVycykpCisJCXJldHVybiAtRUlOVkFMOworCisJcGFkZGMgPSB2bWFsbG9jKGxlbik7CisJaWYgKCFwYWRkYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoY29weV9mcm9tX3VzZXIocGFkZGMsIHVzZXIsIGxlbikgIT0gMCkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGZyZWU7CisJfQorCisJdCA9IGFycHRfZmluZF90YWJsZV9sb2NrKHRtcC5uYW1lLCAmcmV0LCAmYXJwdF9tdXRleCk7CisJaWYgKCF0KQorCQlnb3RvIGZyZWU7CisKKwl3cml0ZV9sb2NrX2JoKCZ0LT5sb2NrKTsKKwlpZiAodC0+cHJpdmF0ZS0+bnVtYmVyICE9IHBhZGRjLT5udW1fY291bnRlcnMpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byB1bmxvY2tfdXBfZnJlZTsKKwl9CisKKwlpID0gMDsKKwlBUlBUX0VOVFJZX0lURVJBVEUodC0+cHJpdmF0ZS0+ZW50cmllcywKKwkJCSAgIHQtPnByaXZhdGUtPnNpemUsCisJCQkgICBhZGRfY291bnRlcl90b19lbnRyeSwKKwkJCSAgIHBhZGRjLT5jb3VudGVycywKKwkJCSAgICZpKTsKKyB1bmxvY2tfdXBfZnJlZToKKwl3cml0ZV91bmxvY2tfYmgoJnQtPmxvY2spOworCXVwKCZhcnB0X211dGV4KTsKKyBmcmVlOgorCXZmcmVlKHBhZGRjKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZG9fYXJwdF9zZXRfY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgdm9pZCBfX3VzZXIgKnVzZXIsIHVuc2lnbmVkIGludCBsZW4pCit7CisJaW50IHJldDsKKworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBUlBUX1NPX1NFVF9SRVBMQUNFOgorCQlyZXQgPSBkb19yZXBsYWNlKHVzZXIsIGxlbik7CisJCWJyZWFrOworCisJY2FzZSBBUlBUX1NPX1NFVF9BRERfQ09VTlRFUlM6CisJCXJldCA9IGRvX2FkZF9jb3VudGVycyh1c2VyLCBsZW4pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWR1cHJpbnRmKCJkb19hcnB0X3NldF9jdGw6ICB1bmtub3duIHJlcXVlc3QgJWlcbiIsIGNtZCk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkb19hcnB0X2dldF9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCB2b2lkIF9fdXNlciAqdXNlciwgaW50ICpsZW4pCit7CisJaW50IHJldDsKKworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBBUlBUX1NPX0dFVF9JTkZPOiB7CisJCWNoYXIgbmFtZVtBUlBUX1RBQkxFX01BWE5BTUVMRU5dOworCQlzdHJ1Y3QgYXJwdF90YWJsZSAqdDsKKworCQlpZiAoKmxlbiAhPSBzaXplb2Yoc3RydWN0IGFycHRfZ2V0aW5mbykpIHsKKwkJCWR1cHJpbnRmKCJsZW5ndGggJXUgIT0gJVp1XG4iLCAqbGVuLAorCQkJCSBzaXplb2Yoc3RydWN0IGFycHRfZ2V0aW5mbykpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKG5hbWUsIHVzZXIsIHNpemVvZihuYW1lKSkgIT0gMCkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCW5hbWVbQVJQVF9UQUJMRV9NQVhOQU1FTEVOLTFdID0gJ1wwJzsKKwkJdCA9IGFycHRfZmluZF90YWJsZV9sb2NrKG5hbWUsICZyZXQsICZhcnB0X211dGV4KTsKKwkJaWYgKHQpIHsKKwkJCXN0cnVjdCBhcnB0X2dldGluZm8gaW5mbzsKKworCQkJaW5mby52YWxpZF9ob29rcyA9IHQtPnZhbGlkX2hvb2tzOworCQkJbWVtY3B5KGluZm8uaG9va19lbnRyeSwgdC0+cHJpdmF0ZS0+aG9va19lbnRyeSwKKwkJCSAgICAgICBzaXplb2YoaW5mby5ob29rX2VudHJ5KSk7CisJCQltZW1jcHkoaW5mby51bmRlcmZsb3csIHQtPnByaXZhdGUtPnVuZGVyZmxvdywKKwkJCSAgICAgICBzaXplb2YoaW5mby51bmRlcmZsb3cpKTsKKwkJCWluZm8ubnVtX2VudHJpZXMgPSB0LT5wcml2YXRlLT5udW1iZXI7CisJCQlpbmZvLnNpemUgPSB0LT5wcml2YXRlLT5zaXplOworCQkJc3RyY3B5KGluZm8ubmFtZSwgbmFtZSk7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIodXNlciwgJmluZm8sICpsZW4pICE9IDApCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWVsc2UKKwkJCQlyZXQgPSAwOworCisJCQl1cCgmYXJwdF9tdXRleCk7CisJCX0KKwl9CisJYnJlYWs7CisKKwljYXNlIEFSUFRfU09fR0VUX0VOVFJJRVM6IHsKKwkJc3RydWN0IGFycHRfZ2V0X2VudHJpZXMgZ2V0OworCisJCWlmICgqbGVuIDwgc2l6ZW9mKGdldCkpIHsKKwkJCWR1cHJpbnRmKCJnZXRfZW50cmllczogJXUgPCAlWnVcbiIsICpsZW4sIHNpemVvZihnZXQpKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0gZWxzZSBpZiAoY29weV9mcm9tX3VzZXIoJmdldCwgdXNlciwgc2l6ZW9mKGdldCkpICE9IDApIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCX0gZWxzZSBpZiAoKmxlbiAhPSBzaXplb2Yoc3RydWN0IGFycHRfZ2V0X2VudHJpZXMpICsgZ2V0LnNpemUpIHsKKwkJCWR1cHJpbnRmKCJnZXRfZW50cmllczogJXUgIT0gJVp1XG4iLCAqbGVuLAorCQkJCSBzaXplb2Yoc3RydWN0IGFycHRfZ2V0X2VudHJpZXMpICsgZ2V0LnNpemUpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfSBlbHNlCisJCQlyZXQgPSBnZXRfZW50cmllcygmZ2V0LCB1c2VyKTsKKwkJYnJlYWs7CisJfQorCisJZGVmYXVsdDoKKwkJZHVwcmludGYoImRvX2FycHRfZ2V0X2N0bDogdW5rbm93biByZXF1ZXN0ICVpXG4iLCBjbWQpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIFJlZ2lzdHJhdGlvbiBob29rcyBmb3IgdGFyZ2V0cy4gKi8KK2ludCBhcnB0X3JlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgYXJwdF90YXJnZXQgKnRhcmdldCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZhcnB0X211dGV4KTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoIWxpc3RfbmFtZWRfaW5zZXJ0KCZhcnB0X3RhcmdldCwgdGFyZ2V0KSkgeworCQlkdXByaW50ZigiYXJwdF9yZWdpc3Rlcl90YXJnZXQ6IGAlcycgYWxyZWFkeSBpbiBsaXN0IVxuIiwKKwkJCSB0YXJnZXQtPm5hbWUpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwl1cCgmYXJwdF9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBhcnB0X3VucmVnaXN0ZXJfdGFyZ2V0KHN0cnVjdCBhcnB0X3RhcmdldCAqdGFyZ2V0KQoreworCWRvd24oJmFycHRfbXV0ZXgpOworCUxJU1RfREVMRVRFKCZhcnB0X3RhcmdldCwgdGFyZ2V0KTsKKwl1cCgmYXJwdF9tdXRleCk7Cit9CisKK2ludCBhcnB0X3JlZ2lzdGVyX3RhYmxlKHN0cnVjdCBhcnB0X3RhYmxlICp0YWJsZSwKKwkJCWNvbnN0IHN0cnVjdCBhcnB0X3JlcGxhY2UgKnJlcGwpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYXJwdF90YWJsZV9pbmZvICpuZXdpbmZvOworCXN0YXRpYyBzdHJ1Y3QgYXJwdF90YWJsZV9pbmZvIGJvb3RzdHJhcAorCQk9IHsgMCwgMCwgMCwgeyAwIH0sIHsgMCB9LCB7IH0gfTsKKworCW5ld2luZm8gPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgYXJwdF90YWJsZV9pbmZvKQorCQkJICArIFNNUF9BTElHTihyZXBsLT5zaXplKSAqIG51bV9wb3NzaWJsZV9jcHVzKCkpOworCWlmICghbmV3aW5mbykgeworCQlyZXQgPSAtRU5PTUVNOworCQlyZXR1cm4gcmV0OworCX0KKwltZW1jcHkobmV3aW5mby0+ZW50cmllcywgcmVwbC0+ZW50cmllcywgcmVwbC0+c2l6ZSk7CisKKwlyZXQgPSB0cmFuc2xhdGVfdGFibGUodGFibGUtPm5hbWUsIHRhYmxlLT52YWxpZF9ob29rcywKKwkJCSAgICAgIG5ld2luZm8sIHJlcGwtPnNpemUsCisJCQkgICAgICByZXBsLT5udW1fZW50cmllcywKKwkJCSAgICAgIHJlcGwtPmhvb2tfZW50cnksCisJCQkgICAgICByZXBsLT51bmRlcmZsb3cpOworCWR1cHJpbnRmKCJhcnB0X3JlZ2lzdGVyX3RhYmxlOiB0cmFuc2xhdGUgdGFibGUgZ2l2ZXMgJWRcbiIsIHJldCk7CisJaWYgKHJldCAhPSAwKSB7CisJCXZmcmVlKG5ld2luZm8pOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmYXJwdF9tdXRleCk7CisJaWYgKHJldCAhPSAwKSB7CisJCXZmcmVlKG5ld2luZm8pOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIERvbid0IGF1dG9sb2FkOiB3ZSdkIGVhdCBvdXIgdGFpbC4uLiAqLworCWlmIChsaXN0X25hbWVkX2ZpbmQoJmFycHRfdGFibGVzLCB0YWJsZS0+bmFtZSkpIHsKKwkJcmV0ID0gLUVFWElTVDsKKwkJZ290byBmcmVlX3VubG9jazsKKwl9CisKKwkvKiBTaW1wbGlmaWVzIHJlcGxhY2VfdGFibGUgY29kZS4gKi8KKwl0YWJsZS0+cHJpdmF0ZSA9ICZib290c3RyYXA7CisJaWYgKCFyZXBsYWNlX3RhYmxlKHRhYmxlLCAwLCBuZXdpbmZvLCAmcmV0KSkKKwkJZ290byBmcmVlX3VubG9jazsKKworCWR1cHJpbnRmKCJ0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyID0gJXVcbiIsCisJCSB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyKTsKKwkKKwkvKiBzYXZlIG51bWJlciBvZiBpbml0aWFsIGVudHJpZXMgKi8KKwl0YWJsZS0+cHJpdmF0ZS0+aW5pdGlhbF9lbnRyaWVzID0gdGFibGUtPnByaXZhdGUtPm51bWJlcjsKKworCXJ3bG9ja19pbml0KCZ0YWJsZS0+bG9jayk7CisJbGlzdF9wcmVwZW5kKCZhcnB0X3RhYmxlcywgdGFibGUpOworCisgdW5sb2NrOgorCXVwKCZhcnB0X211dGV4KTsKKwlyZXR1cm4gcmV0OworCisgZnJlZV91bmxvY2s6CisJdmZyZWUobmV3aW5mbyk7CisJZ290byB1bmxvY2s7Cit9CisKK3ZvaWQgYXJwdF91bnJlZ2lzdGVyX3RhYmxlKHN0cnVjdCBhcnB0X3RhYmxlICp0YWJsZSkKK3sKKwlkb3duKCZhcnB0X211dGV4KTsKKwlMSVNUX0RFTEVURSgmYXJwdF90YWJsZXMsIHRhYmxlKTsKKwl1cCgmYXJwdF9tdXRleCk7CisKKwkvKiBEZWNyZWFzZSBtb2R1bGUgdXNhZ2UgY291bnRzIGFuZCBmcmVlIHJlc291cmNlcyAqLworCUFSUFRfRU5UUllfSVRFUkFURSh0YWJsZS0+cHJpdmF0ZS0+ZW50cmllcywgdGFibGUtPnByaXZhdGUtPnNpemUsCisJCQkgICBjbGVhbnVwX2VudHJ5LCBOVUxMKTsKKwl2ZnJlZSh0YWJsZS0+cHJpdmF0ZSk7Cit9CisKKy8qIFRoZSBidWlsdC1pbiB0YXJnZXRzOiBzdGFuZGFyZCAoTlVMTCkgYW5kIGVycm9yLiAqLworc3RhdGljIHN0cnVjdCBhcnB0X3RhcmdldCBhcnB0X3N0YW5kYXJkX3RhcmdldCA9IHsKKwkubmFtZQkJPSBBUlBUX1NUQU5EQVJEX1RBUkdFVCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXJwdF90YXJnZXQgYXJwdF9lcnJvcl90YXJnZXQgPSB7CisJLm5hbWUJCT0gQVJQVF9FUlJPUl9UQVJHRVQsCisJLnRhcmdldAkJPSBhcnB0X2Vycm9yLAorfTsKKworc3RhdGljIHN0cnVjdCBuZl9zb2Nrb3B0X29wcyBhcnB0X3NvY2tvcHRzID0geworCS5wZgkJPSBQRl9JTkVULAorCS5zZXRfb3B0bWluCT0gQVJQVF9CQVNFX0NUTCwKKwkuc2V0X29wdG1heAk9IEFSUFRfU09fU0VUX01BWCsxLAorCS5zZXQJCT0gZG9fYXJwdF9zZXRfY3RsLAorCS5nZXRfb3B0bWluCT0gQVJQVF9CQVNFX0NUTCwKKwkuZ2V0X29wdG1heAk9IEFSUFRfU09fR0VUX01BWCsxLAorCS5nZXQJCT0gZG9fYXJwdF9nZXRfY3RsLAorfTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgaW5saW5lIGludCBwcmludF9uYW1lKGNvbnN0IHN0cnVjdCBhcnB0X3RhYmxlICp0LAorCQkJICAgICBvZmZfdCBzdGFydF9vZmZzZXQsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCwKKwkJCSAgICAgb2ZmX3QgKnBvcywgdW5zaWduZWQgaW50ICpjb3VudCkKK3sKKwlpZiAoKCpjb3VudCkrKyA+PSBzdGFydF9vZmZzZXQpIHsKKwkJdW5zaWduZWQgaW50IG5hbWVsZW47CisKKwkJbmFtZWxlbiA9IHNwcmludGYoYnVmZmVyICsgKnBvcywgIiVzXG4iLCB0LT5uYW1lKTsKKwkJaWYgKCpwb3MgKyBuYW1lbGVuID4gbGVuZ3RoKSB7CisJCQkvKiBTdG9wIGl0ZXJhdGluZyAqLworCQkJcmV0dXJuIDE7CisJCX0KKwkJKnBvcyArPSBuYW1lbGVuOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcnB0X2dldF90YWJsZXMoY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCkKK3sKKwlvZmZfdCBwb3MgPSAwOworCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhcnB0X211dGV4KSAhPSAwKQorCQlyZXR1cm4gMDsKKworCUxJU1RfRklORCgmYXJwdF90YWJsZXMsIHByaW50X25hbWUsIHN0cnVjdCBhcnB0X3RhYmxlICosCisJCSAgb2Zmc2V0LCBidWZmZXIsIGxlbmd0aCwgJnBvcywgJmNvdW50KTsKKworCXVwKCZhcnB0X211dGV4KTsKKworCS8qIGBzdGFydCcgaGFjayAtIHNlZSBmcy9wcm9jL2dlbmVyaWMuYyBsaW5lIH4xMDUgKi8KKwkqc3RhcnQ9KGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpY291bnQtb2Zmc2V0KTsKKwlyZXR1cm4gcG9zOworfQorI2VuZGlmIC8qQ09ORklHX1BST0NfRlMqLworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCS8qIE5vb25lIGVsc2Ugd2lsbCBiZSBkb3duaW5nIHNlbSBub3csIHNvIHdlIHdvbid0IHNsZWVwICovCisJZG93bigmYXJwdF9tdXRleCk7CisJbGlzdF9hcHBlbmQoJmFycHRfdGFyZ2V0LCAmYXJwdF9zdGFuZGFyZF90YXJnZXQpOworCWxpc3RfYXBwZW5kKCZhcnB0X3RhcmdldCwgJmFycHRfZXJyb3JfdGFyZ2V0KTsKKwl1cCgmYXJwdF9tdXRleCk7CisKKwkvKiBSZWdpc3RlciBzZXRzb2Nrb3B0ICovCisJcmV0ID0gbmZfcmVnaXN0ZXJfc29ja29wdCgmYXJwdF9zb2Nrb3B0cyk7CisJaWYgKHJldCA8IDApIHsKKwkJZHVwcmludGYoIlVuYWJsZSB0byByZWdpc3RlciBzb2Nrb3B0cy5cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJeworCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7CisKKwkJcHJvYyA9IHByb2NfbmV0X2NyZWF0ZSgiYXJwX3RhYmxlc19uYW1lcyIsIDAsIGFycHRfZ2V0X3RhYmxlcyk7CisJCWlmICghcHJvYykgeworCQkJbmZfdW5yZWdpc3Rlcl9zb2Nrb3B0KCZhcnB0X3NvY2tvcHRzKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXByb2MtPm93bmVyID0gVEhJU19NT0RVTEU7CisJfQorI2VuZGlmCisKKwlwcmludGsoImFycF90YWJsZXM6IChDKSAyMDAyIERhdmlkIFMuIE1pbGxlclxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJbmZfdW5yZWdpc3Rlcl9zb2Nrb3B0KCZhcnB0X3NvY2tvcHRzKTsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXByb2NfbmV0X3JlbW92ZSgiYXJwX3RhYmxlc19uYW1lcyIpOworI2VuZGlmCit9CisKK0VYUE9SVF9TWU1CT0woYXJwdF9yZWdpc3Rlcl90YWJsZSk7CitFWFBPUlRfU1lNQk9MKGFycHRfdW5yZWdpc3Rlcl90YWJsZSk7CitFWFBPUlRfU1lNQk9MKGFycHRfZG9fdGFibGUpOworRVhQT1JUX1NZTUJPTChhcnB0X3JlZ2lzdGVyX3RhcmdldCk7CitFWFBPUlRfU1lNQk9MKGFycHRfdW5yZWdpc3Rlcl90YXJnZXQpOworCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycHRfbWFuZ2xlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwdF9tYW5nbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTU5MmVjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycHRfbWFuZ2xlLmMKQEAgLTAsMCArMSwxMDQgQEAKKy8qIG1vZHVsZSB0aGF0IGFsbG93cyBtYW5nbGluZyBvZiB0aGUgYXJwIHBheWxvYWQgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYXJwL2FycHRfbWFuZ2xlLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQmFydCBEZSBTY2h1eW1lciA8YmRzY2h1eW1AcGFuZG9yYS5iZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiYXJwdGFibGVzIGFycCBwYXlsb2FkIG1hbmdsZSB0YXJnZXQiKTsKKworc3RhdGljIHVuc2lnbmVkIGludAordGFyZ2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgaW50IGhvb2tudW0sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHZvaWQgKnRhcmdpbmZvLCB2b2lkICp1c2VyaW5mbykKK3sKKwljb25zdCBzdHJ1Y3QgYXJwdF9tYW5nbGUgKm1hbmdsZSA9IHRhcmdpbmZvOworCXN0cnVjdCBhcnBoZHIgKmFycDsKKwl1bnNpZ25lZCBjaGFyICphcnBwdHI7CisJaW50IHBsbiwgaGxuOworCisJaWYgKHNrYl9zaGFyZWQoKnBza2IpIHx8IHNrYl9jbG9uZWQoKnBza2IpKSB7CisJCXN0cnVjdCBza19idWZmICpuc2tiOworCisJCW5za2IgPSBza2JfY29weSgqcHNrYiwgR0ZQX0FUT01JQyk7CisJCWlmICghbnNrYikKKwkJCXJldHVybiBORl9EUk9QOworCQlpZiAoKCpwc2tiKS0+c2spCisJCQlza2Jfc2V0X293bmVyX3cobnNrYiwgKCpwc2tiKS0+c2spOworCQlrZnJlZV9za2IoKnBza2IpOworCQkqcHNrYiA9IG5za2I7CisJfQorCisJYXJwID0gKCpwc2tiKS0+bmguYXJwaDsKKwlhcnBwdHIgPSAoKnBza2IpLT5uaC5yYXcgKyBzaXplb2YoKmFycCk7CisJcGxuID0gYXJwLT5hcl9wbG47CisJaGxuID0gYXJwLT5hcl9obG47CisJLyogV2UgYXNzdW1lIHRoYXQgcGxuIGFuZCBobG4gd2VyZSBjaGVja2VkIGluIHRoZSBtYXRjaCAqLworCWlmIChtYW5nbGUtPmZsYWdzICYgQVJQVF9NQU5HTEVfU0RFVikgeworCQlpZiAoQVJQVF9ERVZfQUREUl9MRU5fTUFYIDwgaGxuIHx8CisJCSAgIChhcnBwdHIgKyBobG4gPiAoKipwc2tiKS50YWlsKSkKKwkJCXJldHVybiBORl9EUk9QOworCQltZW1jcHkoYXJwcHRyLCBtYW5nbGUtPnNyY19kZXZhZGRyLCBobG4pOworCX0KKwlhcnBwdHIgKz0gaGxuOworCWlmIChtYW5nbGUtPmZsYWdzICYgQVJQVF9NQU5HTEVfU0lQKSB7CisJCWlmIChBUlBUX01BTkdMRV9BRERSX0xFTl9NQVggPCBwbG4gfHwKKwkJICAgKGFycHB0ciArIHBsbiA+ICgqKnBza2IpLnRhaWwpKQorCQkJcmV0dXJuIE5GX0RST1A7CisJCW1lbWNweShhcnBwdHIsICZtYW5nbGUtPnVfcy5zcmNfaXAsIHBsbik7CisJfQorCWFycHB0ciArPSBwbG47CisJaWYgKG1hbmdsZS0+ZmxhZ3MgJiBBUlBUX01BTkdMRV9UREVWKSB7CisJCWlmIChBUlBUX0RFVl9BRERSX0xFTl9NQVggPCBobG4gfHwKKwkJICAgKGFycHB0ciArIGhsbiA+ICgqKnBza2IpLnRhaWwpKQorCQkJcmV0dXJuIE5GX0RST1A7CisJCW1lbWNweShhcnBwdHIsIG1hbmdsZS0+dGd0X2RldmFkZHIsIGhsbik7CisJfQorCWFycHB0ciArPSBobG47CisJaWYgKG1hbmdsZS0+ZmxhZ3MgJiBBUlBUX01BTkdMRV9USVApIHsKKwkJaWYgKEFSUFRfTUFOR0xFX0FERFJfTEVOX01BWCA8IHBsbiB8fAorCQkgICAoYXJwcHRyICsgcGxuID4gKCoqcHNrYikudGFpbCkpCisJCQlyZXR1cm4gTkZfRFJPUDsKKwkJbWVtY3B5KGFycHB0ciwgJm1hbmdsZS0+dV90LnRndF9pcCwgcGxuKTsKKwl9CisJcmV0dXJuIG1hbmdsZS0+dGFyZ2V0OworfQorCitzdGF0aWMgaW50CitjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgc3RydWN0IGFycHRfZW50cnkgKmUsIHZvaWQgKnRhcmdpbmZvLAorICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgYXJwdF9tYW5nbGUgKm1hbmdsZSA9IHRhcmdpbmZvOworCisJaWYgKG1hbmdsZS0+ZmxhZ3MgJiB+QVJQVF9NQU5HTEVfTUFTSyB8fAorCSAgICAhKG1hbmdsZS0+ZmxhZ3MgJiBBUlBUX01BTkdMRV9NQVNLKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobWFuZ2xlLT50YXJnZXQgIT0gTkZfRFJPUCAmJiBtYW5nbGUtPnRhcmdldCAhPSBORl9BQ0NFUFQgJiYKKwkgICBtYW5nbGUtPnRhcmdldCAhPSBBUlBUX0NPTlRJTlVFKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBhcnB0X3RhcmdldCBhcnB0X21hbmdsZV9yZWcKKz0geworICAgICAgICAubmFtZQkJPSAibWFuZ2xlIiwKKyAgICAgICAgLnRhcmdldAkJPSB0YXJnZXQsCisgICAgICAgIC5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKKyAgICAgICAgLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWlmIChhcnB0X3JlZ2lzdGVyX3RhcmdldCgmYXJwdF9tYW5nbGVfcmVnKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlhcnB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZhcnB0X21hbmdsZV9yZWcpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycHRhYmxlX2ZpbHRlci5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycHRhYmxlX2ZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNzU5ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwdGFibGVfZmlsdGVyLmMKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBGaWx0ZXJpbmcgQVJQIHRhYmxlcyBtb2R1bGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9hcnAvYXJwX3RhYmxlcy5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQHJlZGhhdC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImFycHRhYmxlcyBmaWx0ZXIgdGFibGUiKTsKKworI2RlZmluZSBGSUxURVJfVkFMSURfSE9PS1MgKCgxIDw8IE5GX0FSUF9JTikgfCAoMSA8PCBORl9BUlBfT1VUKSB8IFwKKwkJCSAgICgxIDw8IE5GX0FSUF9GT1JXQVJEKSkKKworLyogU3RhbmRhcmQgZW50cnkuICovCitzdHJ1Y3QgYXJwdF9zdGFuZGFyZAoreworCXN0cnVjdCBhcnB0X2VudHJ5IGVudHJ5OworCXN0cnVjdCBhcnB0X3N0YW5kYXJkX3RhcmdldCB0YXJnZXQ7Cit9OworCitzdHJ1Y3QgYXJwdF9lcnJvcl90YXJnZXQKK3sKKwlzdHJ1Y3QgYXJwdF9lbnRyeV90YXJnZXQgdGFyZ2V0OworCWNoYXIgZXJyb3JuYW1lW0FSUFRfRlVOQ1RJT05fTUFYTkFNRUxFTl07Cit9OworCitzdHJ1Y3QgYXJwdF9lcnJvcgoreworCXN0cnVjdCBhcnB0X2VudHJ5IGVudHJ5OworCXN0cnVjdCBhcnB0X2Vycm9yX3RhcmdldCB0YXJnZXQ7Cit9OworCitzdGF0aWMgc3RydWN0Cit7CisJc3RydWN0IGFycHRfcmVwbGFjZSByZXBsOworCXN0cnVjdCBhcnB0X3N0YW5kYXJkIGVudHJpZXNbM107CisJc3RydWN0IGFycHRfZXJyb3IgdGVybTsKK30gaW5pdGlhbF90YWJsZSBfX2luaXRkYXRhCis9IHsgeyAiZmlsdGVyIiwgRklMVEVSX1ZBTElEX0hPT0tTLCA0LAorICAgICAgc2l6ZW9mKHN0cnVjdCBhcnB0X3N0YW5kYXJkKSAqIDMgKyBzaXplb2Yoc3RydWN0IGFycHRfZXJyb3IpLAorICAgICAgeyBbTkZfQVJQX0lOXSA9IDAsCisJW05GX0FSUF9PVVRdID0gc2l6ZW9mKHN0cnVjdCBhcnB0X3N0YW5kYXJkKSwKKwlbTkZfQVJQX0ZPUldBUkRdID0gMiAqIHNpemVvZihzdHJ1Y3QgYXJwdF9zdGFuZGFyZCksIH0sCisgICAgICB7IFtORl9BUlBfSU5dID0gMCwKKwlbTkZfQVJQX09VVF0gPSBzaXplb2Yoc3RydWN0IGFycHRfc3RhbmRhcmQpLAorCVtORl9BUlBfRk9SV0FSRF0gPSAyICogc2l6ZW9mKHN0cnVjdCBhcnB0X3N0YW5kYXJkKSwgfSwKKyAgICAgIDAsIE5VTEwsIHsgfSB9LAorICAgIHsKKwkgICAgLyogQVJQX0lOICovCisJICAgIHsKKwkJICAgIHsKKwkJCSAgICB7CisJCQkJICAgIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LAorCQkJCSAgICAwLCAwLAorCQkJCSAgICB7IHsgMCwgfSwgeyAwLCB9IH0sCisJCQkJICAgIHsgeyAwLCB9LCB7IDAsIH0gfSwKKwkJCQkgICAgMCwgMCwKKwkJCQkgICAgMCwgMCwKKwkJCQkgICAgMCwgMCwKKwkJCQkgICAgIiIsICIiLCB7IDAgfSwgeyAwIH0sCisJCQkJICAgIDAsIDAKKwkJCSAgICB9LAorCQkJICAgIHNpemVvZihzdHJ1Y3QgYXJwdF9lbnRyeSksCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBhcnB0X3N0YW5kYXJkKSwKKwkJCSAgICAwLAorCQkJICAgIHsgMCwgMCB9LCB7IH0gfSwKKwkJICAgIHsgeyB7IHsgQVJQVF9BTElHTihzaXplb2Yoc3RydWN0IGFycHRfc3RhbmRhcmRfdGFyZ2V0KSksICIiIH0gfSwgeyB9IH0sCisJCSAgICAgIC1ORl9BQ0NFUFQgLSAxIH0KKwkgICAgfSwKKwkgICAgLyogQVJQX09VVCAqLworCSAgICB7CisJCSAgICB7CisJCQkgICAgeworCQkJCSAgICB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwKKwkJCQkgICAgMCwgMCwKKwkJCQkgICAgeyB7IDAsIH0sIHsgMCwgfSB9LAorCQkJCSAgICB7IHsgMCwgfSwgeyAwLCB9IH0sCisJCQkJICAgIDAsIDAsCisJCQkJICAgIDAsIDAsCisJCQkJICAgIDAsIDAsCisJCQkJICAgICIiLCAiIiwgeyAwIH0sIHsgMCB9LAorCQkJCSAgICAwLCAwCisJCQkgICAgfSwKKwkJCSAgICBzaXplb2Yoc3RydWN0IGFycHRfZW50cnkpLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgYXJwdF9zdGFuZGFyZCksCisJCQkgICAgMCwKKwkJCSAgICB7IDAsIDAgfSwgeyB9IH0sCisJCSAgICB7IHsgeyB7IEFSUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBhcnB0X3N0YW5kYXJkX3RhcmdldCkpLCAiIiB9IH0sIHsgfSB9LAorCQkgICAgICAtTkZfQUNDRVBUIC0gMSB9CisJICAgIH0sCisJICAgIC8qIEFSUF9GT1JXQVJEICovCisJICAgIHsKKwkJICAgIHsKKwkJCSAgICB7CisJCQkJICAgIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LAorCQkJCSAgICAwLCAwLAorCQkJCSAgICB7IHsgMCwgfSwgeyAwLCB9IH0sCisJCQkJICAgIHsgeyAwLCB9LCB7IDAsIH0gfSwKKwkJCQkgICAgMCwgMCwKKwkJCQkgICAgMCwgMCwKKwkJCQkgICAgMCwgMCwKKwkJCQkgICAgIiIsICIiLCB7IDAgfSwgeyAwIH0sCisJCQkJICAgIDAsIDAKKwkJCSAgICB9LAorCQkJICAgIHNpemVvZihzdHJ1Y3QgYXJwdF9lbnRyeSksCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBhcnB0X3N0YW5kYXJkKSwKKwkJCSAgICAwLAorCQkJICAgIHsgMCwgMCB9LCB7IH0gfSwKKwkJICAgIHsgeyB7IHsgQVJQVF9BTElHTihzaXplb2Yoc3RydWN0IGFycHRfc3RhbmRhcmRfdGFyZ2V0KSksICIiIH0gfSwgeyB9IH0sCisJCSAgICAgIC1ORl9BQ0NFUFQgLSAxIH0KKwkgICAgfQorICAgIH0sCisgICAgLyogRVJST1IgKi8KKyAgICB7CisJICAgIHsKKwkJICAgIHsKKwkJCSAgICB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwKKwkJCSAgICAwLCAwLAorCQkJICAgIHsgeyAwLCB9LCB7IDAsIH0gfSwKKwkJCSAgICB7IHsgMCwgfSwgeyAwLCB9IH0sCisJCQkgICAgMCwgMCwKKwkJCSAgICAwLCAwLAorCQkJICAgIDAsIDAsCisJCQkgICAgIiIsICIiLCB7IDAgfSwgeyAwIH0sCisJCQkgICAgMCwgMAorCQkgICAgfSwKKwkJICAgIHNpemVvZihzdHJ1Y3QgYXJwdF9lbnRyeSksCisJCSAgICBzaXplb2Yoc3RydWN0IGFycHRfZXJyb3IpLAorCQkgICAgMCwKKwkJICAgIHsgMCwgMCB9LCB7IH0gfSwKKwkgICAgeyB7IHsgeyBBUlBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgYXJwdF9lcnJvcl90YXJnZXQpKSwgQVJQVF9FUlJPUl9UQVJHRVQgfSB9LAorCQl7IH0gfSwKKwkgICAgICAiRVJST1IiCisJICAgIH0KKyAgICB9Cit9OworCitzdGF0aWMgc3RydWN0IGFycHRfdGFibGUgcGFja2V0X2ZpbHRlciA9IHsKKwkubmFtZQkJPSAiZmlsdGVyIiwKKwkudmFsaWRfaG9va3MJPSBGSUxURVJfVkFMSURfSE9PS1MsCisJLmxvY2sJCT0gUldfTE9DS19VTkxPQ0tFRCwKKwkucHJpdmF0ZQk9IE5VTEwsCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworLyogVGhlIHdvcmsgY29tZXMgaW4gaGVyZSBmcm9tIG5ldGZpbHRlci5jICovCitzdGF0aWMgdW5zaWduZWQgaW50IGFycHRfaG9vayh1bnNpZ25lZCBpbnQgaG9vaywKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQkgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlyZXR1cm4gYXJwdF9kb190YWJsZShwc2tiLCBob29rLCBpbiwgb3V0LCAmcGFja2V0X2ZpbHRlciwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZfaG9va19vcHMgYXJwdF9vcHNbXSA9IHsKKwl7CisJCS5ob29rCQk9IGFycHRfaG9vaywKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkucGYJCT0gTkZfQVJQLAorCQkuaG9va251bQk9IE5GX0FSUF9JTiwKKwl9LAorCXsKKwkJLmhvb2sJCT0gYXJwdF9ob29rLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5wZgkJPSBORl9BUlAsCisJCS5ob29rbnVtCT0gTkZfQVJQX09VVCwKKwl9LAorCXsKKwkJLmhvb2sJCT0gYXJwdF9ob29rLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5wZgkJPSBORl9BUlAsCisJCS5ob29rbnVtCT0gTkZfQVJQX0ZPUldBUkQsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgcmV0LCBpOworCisJLyogUmVnaXN0ZXIgdGFibGUgKi8KKwlyZXQgPSBhcnB0X3JlZ2lzdGVyX3RhYmxlKCZwYWNrZXRfZmlsdGVyLCAmaW5pdGlhbF90YWJsZS5yZXBsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFycHRfb3BzKTsgaSsrKQorCQlpZiAoKHJldCA9IG5mX3JlZ2lzdGVyX2hvb2soJmFycHRfb3BzW2ldKSkgPCAwKQorCQkJZ290byBjbGVhbnVwX2hvb2tzOworCXJldHVybiByZXQ7CisKK2NsZWFudXBfaG9va3M6CisJd2hpbGUgKC0taSA+PSAwKQorCQluZl91bnJlZ2lzdGVyX2hvb2soJmFycHRfb3BzW2ldKTsKKworCWFycHRfdW5yZWdpc3Rlcl90YWJsZSgmcGFja2V0X2ZpbHRlcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFycHRfb3BzKTsgaSsrKQorCQluZl91bnJlZ2lzdGVyX2hvb2soJmFycHRfb3BzW2ldKTsKKworCWFycHRfdW5yZWdpc3Rlcl90YWJsZSgmcGFja2V0X2ZpbHRlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2FtYW5kYS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19hbWFuZGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGJkZGQwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19hbWFuZGEuYwpAQCAtMCwwICsxLDE2NyBAQAorLyogQW1hbmRhIGV4dGVuc2lvbiBmb3IgSVAgY29ubmVjdGlvbiB0cmFja2luZywgVmVyc2lvbiAwLjIKKyAqIChDKSAyMDAyIGJ5IEJyaWFuIEouIE11cnJlbGwgPG5ldGZpbHRlckBpbnRlcmxpbnguYmMuY2E+CisgKiBiYXNlZCBvbiBIVydzIGlwX2Nvbm50cmFja19pcmMuYyBhcyB3ZWxsIGFzIG90aGVyIG1vZHVsZXMKKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJTW9kdWxlIGxvYWQgc3ludGF4OgorICogCWluc21vZCBpcF9jb25udHJhY2tfYW1hbmRhLm8gW21hc3Rlcl90aW1lb3V0PW5dCisgKgkKKyAqCVdoZXJlIG1hc3Rlcl90aW1lb3V0IGlzIHRoZSB0aW1lb3V0IChpbiBzZWNvbmRzKSBvZiB0aGUgbWFzdGVyCisgKgljb25uZWN0aW9uIChwb3J0IDEwMDgwKS4gIFRoaXMgZGVmYXVsdHMgdG8gNSBtaW51dGVzIGJ1dCBpZgorICoJeW91ciBjbGllbnRzIHRha2UgbG9uZ2VyIHRoYW4gNSBtaW51dGVzIHRvIGRvIHRoZWlyIHdvcmsKKyAqCWJlZm9yZSBnZXR0aW5nIGJhY2sgdG8gdGhlIEFtYW5kYSBzZXJ2ZXIsIHlvdSBjYW4gaW5jcmVhc2UKKyAqCXRoaXMgdmFsdWUuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bmV0L3VkcC5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvbG9ja2hlbHAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2FtYW5kYS5oPgorCitzdGF0aWMgdW5zaWduZWQgaW50IG1hc3Rlcl90aW1lb3V0ID0gMzAwOworCitNT0RVTEVfQVVUSE9SKCJCcmlhbiBKLiBNdXJyZWxsIDxuZXRmaWx0ZXJAaW50ZXJsaW54LmJjLmNhPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbWFuZGEgY29ubmVjdGlvbiB0cmFja2luZyBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9wYXJhbShtYXN0ZXJfdGltZW91dCwgaW50LCAwNjAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWFzdGVyX3RpbWVvdXQsICJ0aW1lb3V0IGZvciB0aGUgbWFzdGVyIGNvbm5lY3Rpb24iKTsKKworc3RhdGljIGNoYXIgKmNvbm5zW10gPSB7ICJEQVRBICIsICJNRVNHICIsICJJTkRFWCAiIH07CisKKy8qIFRoaXMgaXMgc2xvdywgYnV0IGl0J3Mgc2ltcGxlLiAtLVJSICovCitzdGF0aWMgY2hhciBhbWFuZGFfYnVmZmVyWzY1NTM2XTsKK3N0YXRpYyBERUNMQVJFX0xPQ0soYW1hbmRhX2J1ZmZlcl9sb2NrKTsKKwordW5zaWduZWQgaW50ICgqaXBfbmF0X2FtYW5kYV9ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkJICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkJICAgdW5zaWduZWQgaW50IG1hdGNob2ZmLAorCQkJCSAgIHVuc2lnbmVkIGludCBtYXRjaGxlbiwKKwkJCQkgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGlwX25hdF9hbWFuZGFfaG9vayk7CisKK3N0YXRpYyBpbnQgaGVscChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisgICAgICAgICAgICAgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQoreworCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHA7CisJY2hhciAqZGF0YSwgKmRhdGFfbGltaXQsICp0bXA7CisJdW5zaWduZWQgaW50IGRhdGFvZmYsIGk7CisJdV9pbnQxNl90IHBvcnQsIGxlbjsKKwlpbnQgcmV0ID0gTkZfQUNDRVBUOworCisJLyogT25seSBsb29rIGF0IHBhY2tldHMgZnJvbSB0aGUgQW1hbmRhIHNlcnZlciAqLworCWlmIChDVElORk8yRElSKGN0aW5mbykgPT0gSVBfQ1RfRElSX09SSUdJTkFMKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJLyogaW5jcmVhc2UgdGhlIFVEUCB0aW1lb3V0IG9mIHRoZSBtYXN0ZXIgY29ubmVjdGlvbiBhcyByZXBsaWVzIGZyb20KKwkgKiBBbWFuZGEgY2xpZW50cyB0byB0aGUgc2VydmVyIGNhbiBiZSBxdWl0ZSBkZWxheWVkICovCisJaXBfY3RfcmVmcmVzaF9hY2N0KGN0LCBjdGluZm8sIE5VTEwsIG1hc3Rlcl90aW1lb3V0ICogSFopOworCisJLyogTm8gZGF0YT8gKi8KKwlkYXRhb2ZmID0gKCpwc2tiKS0+bmguaXBoLT5paGwqNCArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwlpZiAoZGF0YW9mZiA+PSAoKnBza2IpLT5sZW4pIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50aygiYW1hbmRhX2hlbHA6IHNrYmxlbiA9ICV1XG4iLCAoKnBza2IpLT5sZW4pOworCQlyZXR1cm4gTkZfQUNDRVBUOworCX0KKworCUxPQ0tfQkgoJmFtYW5kYV9idWZmZXJfbG9jayk7CisJc2tiX2NvcHlfYml0cygqcHNrYiwgZGF0YW9mZiwgYW1hbmRhX2J1ZmZlciwgKCpwc2tiKS0+bGVuIC0gZGF0YW9mZik7CisJZGF0YSA9IGFtYW5kYV9idWZmZXI7CisJZGF0YV9saW1pdCA9IGFtYW5kYV9idWZmZXIgKyAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmOworCSpkYXRhX2xpbWl0ID0gJ1wwJzsKKworCS8qIFNlYXJjaCBmb3IgdGhlIENPTk5FQ1Qgc3RyaW5nICovCisJZGF0YSA9IHN0cnN0cihkYXRhLCAiQ09OTkVDVCAiKTsKKwlpZiAoIWRhdGEpCisJCWdvdG8gb3V0OworCWRhdGEgKz0gc3RybGVuKCJDT05ORUNUICIpOworCisJLyogT25seSBzZWFyY2ggZmlyc3QgbGluZS4gKi8JCisJaWYgKCh0bXAgPSBzdHJjaHIoZGF0YSwgJ1xuJykpKQorCQkqdG1wID0gJ1wwJzsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvbm5zKTsgaSsrKSB7CisJCWNoYXIgKm1hdGNoID0gc3Ryc3RyKGRhdGEsIGNvbm5zW2ldKTsKKwkJaWYgKCFtYXRjaCkKKwkJCWNvbnRpbnVlOworCQl0bXAgPSBkYXRhID0gbWF0Y2ggKyBzdHJsZW4oY29ubnNbaV0pOworCQlwb3J0ID0gc2ltcGxlX3N0cnRvdWwoZGF0YSwgJmRhdGEsIDEwKTsKKwkJbGVuID0gZGF0YSAtIHRtcDsKKwkJaWYgKHBvcnQgPT0gMCB8fCBsZW4gPiA1KQorCQkJYnJlYWs7CisKKwkJZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYygpOworCQlpZiAoZXhwID09IE5VTEwpIHsKKwkJCXJldCA9IE5GX0RST1A7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWV4cC0+ZXhwZWN0Zm4gPSBOVUxMOworCQlleHAtPm1hc3RlciA9IGN0OworCisJCWV4cC0+dHVwbGUuc3JjLmlwID0gY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5pcDsKKwkJZXhwLT50dXBsZS5zcmMudS50Y3AucG9ydCA9IDA7CisJCWV4cC0+dHVwbGUuZHN0LmlwID0gY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5pcDsKKwkJZXhwLT50dXBsZS5kc3QucHJvdG9udW0gPSBJUFBST1RPX1RDUDsKKwkJZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydCA9IGh0b25zKHBvcnQpOworCisJCWV4cC0+bWFzay5zcmMuaXAgPSAweEZGRkZGRkZGOworCQlleHAtPm1hc2suc3JjLnUudGNwLnBvcnQgPSAwOworCQlleHAtPm1hc2suZHN0LmlwID0gMHhGRkZGRkZGRjsKKwkJZXhwLT5tYXNrLmRzdC5wcm90b251bSA9IDB4RkY7CisJCWV4cC0+bWFzay5kc3QudS50Y3AucG9ydCA9IDB4RkZGRjsKKworCQlpZiAoaXBfbmF0X2FtYW5kYV9ob29rKQorCQkJcmV0ID0gaXBfbmF0X2FtYW5kYV9ob29rKHBza2IsIGN0aW5mbywKKwkJCQkJCSB0bXAgLSBhbWFuZGFfYnVmZmVyLAorCQkJCQkJIGxlbiwgZXhwKTsKKwkJZWxzZSBpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgIT0gMCkgeworCQkJaXBfY29ubnRyYWNrX2V4cGVjdF9mcmVlKGV4cCk7CisJCQlyZXQgPSBORl9EUk9QOworCQl9CisJfQorCitvdXQ6CisJVU5MT0NLX0JIKCZhbWFuZGFfYnVmZmVyX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXBfY29ubnRyYWNrX2hlbHBlciBhbWFuZGFfaGVscGVyID0geworCS5tYXhfZXhwZWN0ZWQgPSBBUlJBWV9TSVpFKGNvbm5zKSwKKwkudGltZW91dCA9IDE4MCwKKwkubWUgPSBUSElTX01PRFVMRSwKKwkuaGVscCA9IGhlbHAsCisJLm5hbWUgPSAiYW1hbmRhIiwKKworCS50dXBsZSA9IHsgLnNyYyA9IHsgLnUgPSB7IF9fY29uc3RhbnRfaHRvbnMoMTAwODApIH0gfSwKKwkJICAgLmRzdCA9IHsgLnByb3RvbnVtID0gSVBQUk9UT19VRFAgfSwKKwl9LAorCS5tYXNrID0geyAuc3JjID0geyAudSA9IHsgMHhGRkZGIH0gfSwKKwkJIC5kc3QgPSB7IC5wcm90b251bSA9IDB4RkYgfSwKKwl9LAorfTsKKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlpcF9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJmFtYW5kYV9oZWxwZXIpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJcmV0dXJuIGlwX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoJmFtYW5kYV9oZWxwZXIpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19jb3JlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGQ5NDI1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19jb3JlLmMKQEAgLTAsMCArMSwxMjQ3IEBACisvKiBDb25uZWN0aW9uIHN0YXRlIHRyYWNraW5nIGZvciBuZXRmaWx0ZXIuICBUaGlzIGlzIHNlcGFyYXRlZCBmcm9tLAorICAgYnV0IHJlcXVpcmVkIGJ5LCB0aGUgTkFUIGxheWVyOyBpdCBjYW4gYWxzbyBiZSB1c2VkIGJ5IGFuIGlwdGFibGVzCisgICBleHRlbnNpb24uICovCisKKy8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwgIAorICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogMjMgQXByIDIwMDE6IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAJLSBuZXcgQVBJIGFuZCBoYW5kbGluZyBvZiBjb25udHJhY2svbmF0IGhlbHBlcnMKKyAqIAktIG5vdyBjYXBhYmxlIG9mIG11bHRpcGxlIGV4cGVjdGF0aW9ucyBmb3Igb25lIG1hc3RlcgorICogMTYgSnVsIDIwMDI6IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAJLSBhZGQgdXNhZ2UvcmVmZXJlbmNlIGNvdW50cyB0byBpcF9jb25udHJhY2tfZXhwZWN0CisgKgktIGV4cG9ydCBpcF9jb25udHJhY2tbX2V4cGVjdF1fe2ZpbmRfZ2V0LHB1dH0gZnVuY3Rpb25zCisgKiAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKworLyogVGhpcyByd2xvY2sgcHJvdGVjdHMgdGhlIG1haW4gaGFzaCB0YWJsZSwgcHJvdG9jb2wvaGVscGVyL2V4cGVjdGVkCisgICByZWdpc3RyYXRpb25zLCBjb25udHJhY2sgdGltZXJzKi8KKyNkZWZpbmUgQVNTRVJUX1JFQURfTE9DSyh4KSBNVVNUX0JFX1JFQURfTE9DS0VEKCZpcF9jb25udHJhY2tfbG9jaykKKyNkZWZpbmUgQVNTRVJUX1dSSVRFX0xPQ0soeCkgTVVTVF9CRV9XUklURV9MT0NLRUQoJmlwX2Nvbm50cmFja19sb2NrKQorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvbGlzdGhlbHAuaD4KKworI2RlZmluZSBJUF9DT05OVFJBQ0tfVkVSU0lPTgkiMi4xIgorCisjaWYgMAorI2RlZmluZSBERUJVR1AgcHJpbnRrCisjZWxzZQorI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKK0RFQ0xBUkVfUldMT0NLKGlwX2Nvbm50cmFja19sb2NrKTsKKworLyogaXBfY29ubnRyYWNrX3N0YW5kYWxvbmUgbmVlZHMgdGhpcyAqLworYXRvbWljX3QgaXBfY29ubnRyYWNrX2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7CisKK3ZvaWQgKCppcF9jb25udHJhY2tfZGVzdHJveWVkKShzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2spID0gTlVMTDsKK0xJU1RfSEVBRChpcF9jb25udHJhY2tfZXhwZWN0X2xpc3QpOworc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCAqaXBfY3RfcHJvdG9zW01BWF9JUF9DVF9QUk9UT107CitzdGF0aWMgTElTVF9IRUFEKGhlbHBlcnMpOwordW5zaWduZWQgaW50IGlwX2Nvbm50cmFja19odGFibGVfc2l6ZSA9IDA7CitpbnQgaXBfY29ubnRyYWNrX21heDsKK3N0cnVjdCBsaXN0X2hlYWQgKmlwX2Nvbm50cmFja19oYXNoOworc3RhdGljIGttZW1fY2FjaGVfdCAqaXBfY29ubnRyYWNrX2NhY2hlcDsKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKmlwX2Nvbm50cmFja19leHBlY3RfY2FjaGVwOworc3RydWN0IGlwX2Nvbm50cmFjayBpcF9jb25udHJhY2tfdW50cmFja2VkOwordW5zaWduZWQgaW50IGlwX2N0X2xvZ19pbnZhbGlkOworc3RhdGljIExJU1RfSEVBRCh1bmNvbmZpcm1lZCk7CitzdGF0aWMgaW50IGlwX2Nvbm50cmFja192bWFsbG9jOworCitERUZJTkVfUEVSX0NQVShzdHJ1Y3QgaXBfY29ubnRyYWNrX3N0YXQsIGlwX2Nvbm50cmFja19zdGF0KTsKKwordm9pZCAKK2lwX2Nvbm50cmFja19wdXQoc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpCit7CisJSVBfTkZfQVNTRVJUKGN0KTsKKwluZl9jb25udHJhY2tfcHV0KCZjdC0+Y3RfZ2VuZXJhbCk7Cit9CisKK3N0YXRpYyBpbnQgaXBfY29ubnRyYWNrX2hhc2hfcm5kX2luaXR0ZWQ7CitzdGF0aWMgdW5zaWduZWQgaW50IGlwX2Nvbm50cmFja19oYXNoX3JuZDsKKworc3RhdGljIHVfaW50MzJfdAoraGFzaF9jb25udHJhY2soY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCit7CisjaWYgMAorCWR1bXBfdHVwbGUodHVwbGUpOworI2VuZGlmCisJcmV0dXJuIChqaGFzaF8zd29yZHModHVwbGUtPnNyYy5pcCwKKwkgICAgICAgICAgICAgICAgICAgICAodHVwbGUtPmRzdC5pcCBeIHR1cGxlLT5kc3QucHJvdG9udW0pLAorCSAgICAgICAgICAgICAgICAgICAgICh0dXBsZS0+c3JjLnUuYWxsIHwgKHR1cGxlLT5kc3QudS5hbGwgPDwgMTYpKSwKKwkgICAgICAgICAgICAgICAgICAgICBpcF9jb25udHJhY2tfaGFzaF9ybmQpICUgaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplKTsKK30KKworaW50CitpcF9jdF9nZXRfdHVwbGUoY29uc3Qgc3RydWN0IGlwaGRyICppcGgsCisJCWNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCXVuc2lnbmVkIGludCBkYXRhb2ZmLAorCQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKKwkJY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG9jb2wpCit7CisJLyogTmV2ZXIgaGFwcGVuICovCisJaWYgKGlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9PRkZTRVQpKSB7CisJCXByaW50aygiaXBfY29ubnRyYWNrX2NvcmU6IEZyYWcgb2YgcHJvdG8gJXUuXG4iLAorCQkgICAgICAgaXBoLT5wcm90b2NvbCk7CisJCXJldHVybiAwOworCX0KKworCXR1cGxlLT5zcmMuaXAgPSBpcGgtPnNhZGRyOworCXR1cGxlLT5kc3QuaXAgPSBpcGgtPmRhZGRyOworCXR1cGxlLT5kc3QucHJvdG9udW0gPSBpcGgtPnByb3RvY29sOworCXR1cGxlLT5kc3QuZGlyID0gSVBfQ1RfRElSX09SSUdJTkFMOworCisJcmV0dXJuIHByb3RvY29sLT5wa3RfdG9fdHVwbGUoc2tiLCBkYXRhb2ZmLCB0dXBsZSk7Cit9CisKK2ludAoraXBfY3RfaW52ZXJ0X3R1cGxlKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKmludmVyc2UsCisJCSAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKm9yaWcsCisJCSAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvY29sKQoreworCWludmVyc2UtPnNyYy5pcCA9IG9yaWctPmRzdC5pcDsKKwlpbnZlcnNlLT5kc3QuaXAgPSBvcmlnLT5zcmMuaXA7CisJaW52ZXJzZS0+ZHN0LnByb3RvbnVtID0gb3JpZy0+ZHN0LnByb3RvbnVtOworCWludmVyc2UtPmRzdC5kaXIgPSAhb3JpZy0+ZHN0LmRpcjsKKworCXJldHVybiBwcm90b2NvbC0+aW52ZXJ0X3R1cGxlKGludmVyc2UsIG9yaWcpOworfQorCisKKy8qIGlwX2Nvbm50cmFja19leHBlY3QgaGVscGVyIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgZGVzdHJveV9leHBlY3Qoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkKK3sKKwlpcF9jb25udHJhY2tfcHV0KGV4cC0+bWFzdGVyKTsKKwlJUF9ORl9BU1NFUlQoIXRpbWVyX3BlbmRpbmcoJmV4cC0+dGltZW91dCkpOworCWttZW1fY2FjaGVfZnJlZShpcF9jb25udHJhY2tfZXhwZWN0X2NhY2hlcCwgZXhwKTsKKwlDT05OVFJBQ0tfU1RBVF9JTkMoZXhwZWN0X2RlbGV0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHVubGlua19leHBlY3Qoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkKK3sKKwlNVVNUX0JFX1dSSVRFX0xPQ0tFRCgmaXBfY29ubnRyYWNrX2xvY2spOworCWxpc3RfZGVsKCZleHAtPmxpc3QpOworCS8qIExvZ2ljYWxseSBpbiBkZXN0cm95X2V4cGVjdCwgYnV0IHdlIGhvbGQgdGhlIGxvY2sgaGVyZS4gKi8KKwlleHAtPm1hc3Rlci0+ZXhwZWN0aW5nLS07Cit9CisKK3N0YXRpYyB2b2lkIGV4cGVjdGF0aW9uX3RpbWVkX291dCh1bnNpZ25lZCBsb25nIHVsX2V4cGVjdCkKK3sKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwID0gKHZvaWQgKil1bF9leHBlY3Q7CisKKwlXUklURV9MT0NLKCZpcF9jb25udHJhY2tfbG9jayk7CisJdW5saW5rX2V4cGVjdChleHApOworCVdSSVRFX1VOTE9DSygmaXBfY29ubnRyYWNrX2xvY2spOworCWRlc3Ryb3lfZXhwZWN0KGV4cCk7Cit9CisKKy8qIElmIGFuIGV4cGVjdGF0aW9uIGZvciB0aGlzIGNvbm5lY3Rpb24gaXMgZm91bmQsIGl0IGdldHMgZGVsZXRlIGZyb20KKyAqIGdsb2JhbCBsaXN0IHRoZW4gcmV0dXJuZWQuICovCitzdGF0aWMgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKgorZmluZF9leHBlY3RhdGlvbihjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKK3sKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqaTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgJmlwX2Nvbm50cmFja19leHBlY3RfbGlzdCwgbGlzdCkgeworCQkvKiBJZiBtYXN0ZXIgaXMgbm90IGluIGhhc2ggdGFibGUgeWV0IChpZS4gcGFja2V0IGhhc24ndCBsZWZ0CisJCSAgIHRoaXMgbWFjaGluZSB5ZXQpLCBob3cgY2FuIG90aGVyIGVuZCBrbm93IGFib3V0IGV4cGVjdGVkPworCQkgICBIZW5jZSB0aGVzZSBhcmUgbm90IHRoZSBkcm9pZHMgeW91IGFyZSBsb29raW5nIGZvciAoaWYKKwkJICAgbWFzdGVyIGN0IG5ldmVyIGdvdCBjb25maXJtZWQsIHdlJ2QgaG9sZCBhIHJlZmVyZW5jZSB0byBpdAorCQkgICBhbmQgd2VpcmQgdGhpbmdzIHdvdWxkIGhhcHBlbiB0byBmdXR1cmUgcGFja2V0cykuICovCisJCWlmIChpcF9jdF90dXBsZV9tYXNrX2NtcCh0dXBsZSwgJmktPnR1cGxlLCAmaS0+bWFzaykKKwkJICAgICYmIGlzX2NvbmZpcm1lZChpLT5tYXN0ZXIpCisJCSAgICAmJiBkZWxfdGltZXIoJmktPnRpbWVvdXQpKSB7CisJCQl1bmxpbmtfZXhwZWN0KGkpOworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIGRlbGV0ZSBhbGwgZXhwZWN0YXRpb25zIGZvciB0aGlzIGNvbm50cmFjayAqLworc3RhdGljIHZvaWQgcmVtb3ZlX2V4cGVjdGF0aW9ucyhzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCkKK3sKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqaSwgKnRtcDsKKworCS8qIE9wdGltaXphdGlvbjogbW9zdCBjb25uZWN0aW9uIG5ldmVyIGV4cGVjdCBhbnkgb3RoZXJzLiAqLworCWlmIChjdC0+ZXhwZWN0aW5nID09IDApCisJCXJldHVybjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpLCB0bXAsICZpcF9jb25udHJhY2tfZXhwZWN0X2xpc3QsIGxpc3QpIHsKKwkJaWYgKGktPm1hc3RlciA9PSBjdCAmJiBkZWxfdGltZXIoJmktPnRpbWVvdXQpKSB7CisJCQl1bmxpbmtfZXhwZWN0KGkpOworCQkJZGVzdHJveV9leHBlY3QoaSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbl9mcm9tX2xpc3RzKHN0cnVjdCBpcF9jb25udHJhY2sgKmN0KQoreworCXVuc2lnbmVkIGludCBobywgaHI7CisJCisJREVCVUdQKCJjbGVhbl9mcm9tX2xpc3RzKCVwKVxuIiwgY3QpOworCU1VU1RfQkVfV1JJVEVfTE9DS0VEKCZpcF9jb25udHJhY2tfbG9jayk7CisKKwlobyA9IGhhc2hfY29ubnRyYWNrKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUpOworCWhyID0gaGFzaF9jb25udHJhY2soJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZSk7CisJTElTVF9ERUxFVEUoJmlwX2Nvbm50cmFja19oYXNoW2hvXSwgJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXSk7CisJTElTVF9ERUxFVEUoJmlwX2Nvbm50cmFja19oYXNoW2hyXSwgJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXSk7CisKKwkvKiBEZXN0cm95IGFsbCBwZW5kaW5nIGV4cGVjdGF0aW9ucyAqLworCXJlbW92ZV9leHBlY3RhdGlvbnMoY3QpOworfQorCitzdGF0aWMgdm9pZAorZGVzdHJveV9jb25udHJhY2soc3RydWN0IG5mX2Nvbm50cmFjayAqbmZjdCkKK3sKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCA9IChzdHJ1Y3QgaXBfY29ubnRyYWNrICopbmZjdDsKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICpwcm90bzsKKworCURFQlVHUCgiZGVzdHJveV9jb25udHJhY2soJXApXG4iLCBjdCk7CisJSVBfTkZfQVNTRVJUKGF0b21pY19yZWFkKCZuZmN0LT51c2UpID09IDApOworCUlQX05GX0FTU0VSVCghdGltZXJfcGVuZGluZygmY3QtPnRpbWVvdXQpKTsKKworCS8qIFRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgYW55IHdlaXJkIGxvY2tpbmcgaXNzdWVzIGhlcmU6CisJICogZGVzdHJveV9jb25udHJhY2soKSBNVVNUIE5PVCBiZSBjYWxsZWQgd2l0aCBhIHdyaXRlIGxvY2sKKwkgKiB0byBpcF9jb25udHJhY2tfbG9jayEhISAtSFcgKi8KKwlwcm90byA9IGlwX2N0X2ZpbmRfcHJvdG8oY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC5wcm90b251bSk7CisJaWYgKHByb3RvICYmIHByb3RvLT5kZXN0cm95KQorCQlwcm90by0+ZGVzdHJveShjdCk7CisKKwlpZiAoaXBfY29ubnRyYWNrX2Rlc3Ryb3llZCkKKwkJaXBfY29ubnRyYWNrX2Rlc3Ryb3llZChjdCk7CisKKwlXUklURV9MT0NLKCZpcF9jb25udHJhY2tfbG9jayk7CisJLyogRXhwZWN0YXRpb25zIHdpbGwgaGF2ZSBiZWVuIHJlbW92ZWQgaW4gY2xlYW5fZnJvbV9saXN0cywKKwkgKiBleGNlcHQgVEZUUCBjYW4gY3JlYXRlIGFuIGV4cGVjdGF0aW9uIG9uIHRoZSBmaXJzdCBwYWNrZXQsCisJICogYmVmb3JlIGNvbm5lY3Rpb24gaXMgaW4gdGhlIGxpc3QsIHNvIHdlIG5lZWQgdG8gY2xlYW4gaGVyZSwKKwkgKiB0b28uICovCisJcmVtb3ZlX2V4cGVjdGF0aW9ucyhjdCk7CisKKwkvKiBXZSBvdmVybG9hZCBmaXJzdCB0dXBsZSB0byBsaW5rIGludG8gdW5jb25maXJtZWQgbGlzdC4gKi8KKwlpZiAoIWlzX2NvbmZpcm1lZChjdCkpIHsKKwkJQlVHX09OKGxpc3RfZW1wdHkoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS5saXN0KSk7CisJCWxpc3RfZGVsKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0ubGlzdCk7CisJfQorCisJQ09OTlRSQUNLX1NUQVRfSU5DKGRlbGV0ZSk7CisJV1JJVEVfVU5MT0NLKCZpcF9jb25udHJhY2tfbG9jayk7CisKKwlpZiAoY3QtPm1hc3RlcikKKwkJaXBfY29ubnRyYWNrX3B1dChjdC0+bWFzdGVyKTsKKworCURFQlVHUCgiZGVzdHJveV9jb25udHJhY2s6IHJldHVybmluZyBjdD0lcCB0byBzbGFiXG4iLCBjdCk7CisJa21lbV9jYWNoZV9mcmVlKGlwX2Nvbm50cmFja19jYWNoZXAsIGN0KTsKKwlhdG9taWNfZGVjKCZpcF9jb25udHJhY2tfY291bnQpOworfQorCitzdGF0aWMgdm9pZCBkZWF0aF9ieV90aW1lb3V0KHVuc2lnbmVkIGxvbmcgdWxfY29ubnRyYWNrKQoreworCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0ID0gKHZvaWQgKil1bF9jb25udHJhY2s7CisKKwlXUklURV9MT0NLKCZpcF9jb25udHJhY2tfbG9jayk7CisJLyogSW5zaWRlIGxvY2sgc28gcHJlZW1wdCBpcyBkaXNhYmxlZCBvbiBtb2R1bGUgcmVtb3ZhbCBwYXRoLgorCSAqIE90aGVyd2lzZSB3ZSBjYW4gZ2V0IHNwdXJpb3VzIHdhcm5pbmdzLiAqLworCUNPTk5UUkFDS19TVEFUX0lOQyhkZWxldGVfbGlzdCk7CisJY2xlYW5fZnJvbV9saXN0cyhjdCk7CisJV1JJVEVfVU5MT0NLKCZpcF9jb25udHJhY2tfbG9jayk7CisJaXBfY29ubnRyYWNrX3B1dChjdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citjb25udHJhY2tfdHVwbGVfY21wKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqaSwKKwkJICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAorCQkgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqaWdub3JlZF9jb25udHJhY2spCit7CisJTVVTVF9CRV9SRUFEX0xPQ0tFRCgmaXBfY29ubnRyYWNrX2xvY2spOworCXJldHVybiB0dXBsZWhhc2hfdG9fY3RyYWNrKGkpICE9IGlnbm9yZWRfY29ubnRyYWNrCisJCSYmIGlwX2N0X3R1cGxlX2VxdWFsKHR1cGxlLCAmaS0+dHVwbGUpOworfQorCitzdGF0aWMgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICoKK19faXBfY29ubnRyYWNrX2ZpbmQoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCisJCSAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICppZ25vcmVkX2Nvbm50cmFjaykKK3sKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7CisJdW5zaWduZWQgaW50IGhhc2ggPSBoYXNoX2Nvbm50cmFjayh0dXBsZSk7CisKKwlNVVNUX0JFX1JFQURfTE9DS0VEKCZpcF9jb25udHJhY2tfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShoLCAmaXBfY29ubnRyYWNrX2hhc2hbaGFzaF0sIGxpc3QpIHsKKwkJaWYgKGNvbm50cmFja190dXBsZV9jbXAoaCwgdHVwbGUsIGlnbm9yZWRfY29ubnRyYWNrKSkgeworCQkJQ09OTlRSQUNLX1NUQVRfSU5DKGZvdW5kKTsKKwkJCXJldHVybiBoOworCQl9CisJCUNPTk5UUkFDS19TVEFUX0lOQyhzZWFyY2hlZCk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIEZpbmQgYSBjb25uZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYSB0dXBsZS4gKi8KK3N0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqCitpcF9jb25udHJhY2tfZmluZF9nZXQoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmlnbm9yZWRfY29ubnRyYWNrKQoreworCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKKworCVJFQURfTE9DSygmaXBfY29ubnRyYWNrX2xvY2spOworCWggPSBfX2lwX2Nvbm50cmFja19maW5kKHR1cGxlLCBpZ25vcmVkX2Nvbm50cmFjayk7CisJaWYgKGgpCisJCWF0b21pY19pbmMoJnR1cGxlaGFzaF90b19jdHJhY2soaCktPmN0X2dlbmVyYWwudXNlKTsKKwlSRUFEX1VOTE9DSygmaXBfY29ubnRyYWNrX2xvY2spOworCisJcmV0dXJuIGg7Cit9CisKKy8qIENvbmZpcm0gYSBjb25uZWN0aW9uIGdpdmVuIHNrYjsgcGxhY2VzIGl0IGluIGhhc2ggdGFibGUgKi8KK2ludAorX19pcF9jb25udHJhY2tfY29uZmlybShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpCit7CisJdW5zaWduZWQgaW50IGhhc2gsIHJlcGxfaGFzaDsKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKKwllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKKworCWN0ID0gaXBfY29ubnRyYWNrX2dldCgqcHNrYiwgJmN0aW5mbyk7CisKKwkvKiBpcHRfUkVKRUNUIHVzZXMgaXBfY29ubnRyYWNrX2F0dGFjaCB0byBhdHRhY2ggcmVsYXRlZAorCSAgIElDTVAvVENQIFJTVCBwYWNrZXRzIGluIG90aGVyIGRpcmVjdGlvbi4gIEFjdHVhbCBwYWNrZXQKKwkgICB3aGljaCBjcmVhdGVkIGNvbm5lY3Rpb24gd2lsbCBiZSBJUF9DVF9ORVcgb3IgZm9yIGFuCisJICAgZXhwZWN0ZWQgY29ubmVjdGlvbiwgSVBfQ1RfUkVMQVRFRC4gKi8KKwlpZiAoQ1RJTkZPMkRJUihjdGluZm8pICE9IElQX0NUX0RJUl9PUklHSU5BTCkKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKworCWhhc2ggPSBoYXNoX2Nvbm50cmFjaygmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlKTsKKwlyZXBsX2hhc2ggPSBoYXNoX2Nvbm50cmFjaygmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlKTsKKworCS8qIFdlJ3JlIG5vdCBpbiBoYXNoIHRhYmxlLCBhbmQgd2UgcmVmdXNlIHRvIHNldCB1cCByZWxhdGVkCisJICAgY29ubmVjdGlvbnMgZm9yIHVuY29uZmlybWVkIGNvbm5zLiAgQnV0IHBhY2tldCBjb3BpZXMgYW5kCisJICAgUkVKRUNUIHdpbGwgZ2l2ZSBzcHVyaW91cyB3YXJuaW5ncyBoZXJlLiAqLworCS8qIElQX05GX0FTU0VSVChhdG9taWNfcmVhZCgmY3QtPmN0X2dlbmVyYWwudXNlKSA9PSAxKTsgKi8KKworCS8qIE5vIGV4dGVybmFsIHJlZmVyZW5jZXMgbWVhbnMgbm9vbmUgZWxzZSBjb3VsZCBoYXZlCisgICAgICAgICAgIGNvbmZpcm1lZCB1cy4gKi8KKwlJUF9ORl9BU1NFUlQoIWlzX2NvbmZpcm1lZChjdCkpOworCURFQlVHUCgiQ29uZmlybWluZyBjb25udHJhY2sgJXBcbiIsIGN0KTsKKworCVdSSVRFX0xPQ0soJmlwX2Nvbm50cmFja19sb2NrKTsKKworCS8qIFNlZSBpZiB0aGVyZSdzIG9uZSBpbiB0aGUgbGlzdCBhbHJlYWR5LCBpbmNsdWRpbmcgcmV2ZXJzZToKKyAgICAgICAgICAgTkFUIGNvdWxkIGhhdmUgZ3JhYmJlZCBpdCB3aXRob3V0IHJlYWxpemluZywgc2luY2Ugd2UncmUKKyAgICAgICAgICAgbm90IGluIHRoZSBoYXNoLiAgSWYgdGhlcmUgaXMsIHdlIGxvc3QgcmFjZS4gKi8KKwlpZiAoIUxJU1RfRklORCgmaXBfY29ubnRyYWNrX2hhc2hbaGFzaF0sCisJCSAgICAgICBjb25udHJhY2tfdHVwbGVfY21wLAorCQkgICAgICAgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICosCisJCSAgICAgICAmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLCBOVUxMKQorCSAgICAmJiAhTElTVF9GSU5EKCZpcF9jb25udHJhY2tfaGFzaFtyZXBsX2hhc2hdLAorCQkJICBjb25udHJhY2tfdHVwbGVfY21wLAorCQkJICBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKiwKKwkJCSAgJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZSwgTlVMTCkpIHsKKwkJLyogUmVtb3ZlIGZyb20gdW5jb25maXJtZWQgbGlzdCAqLworCQlsaXN0X2RlbCgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLmxpc3QpOworCisJCWxpc3RfcHJlcGVuZCgmaXBfY29ubnRyYWNrX2hhc2hbaGFzaF0sCisJCQkgICAgICZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0pOworCQlsaXN0X3ByZXBlbmQoJmlwX2Nvbm50cmFja19oYXNoW3JlcGxfaGFzaF0sCisJCQkgICAgICZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0pOworCQkvKiBUaW1lciByZWxhdGl2ZSB0byBjb25maXJtYXRpb24gdGltZSwgbm90IG9yaWdpbmFsCisJCSAgIHNldHRpbmcgdGltZSwgb3RoZXJ3aXNlIHdlJ2QgZ2V0IHRpbWVyIHdyYXAgaW4KKwkJICAgd2VpcmQgZGVsYXkgY2FzZXMuICovCisJCWN0LT50aW1lb3V0LmV4cGlyZXMgKz0gamlmZmllczsKKwkJYWRkX3RpbWVyKCZjdC0+dGltZW91dCk7CisJCWF0b21pY19pbmMoJmN0LT5jdF9nZW5lcmFsLnVzZSk7CisJCXNldF9iaXQoSVBTX0NPTkZJUk1FRF9CSVQsICZjdC0+c3RhdHVzKTsKKwkJQ09OTlRSQUNLX1NUQVRfSU5DKGluc2VydCk7CisJCVdSSVRFX1VOTE9DSygmaXBfY29ubnRyYWNrX2xvY2spOworCQlyZXR1cm4gTkZfQUNDRVBUOworCX0KKworCUNPTk5UUkFDS19TVEFUX0lOQyhpbnNlcnRfZmFpbGVkKTsKKwlXUklURV9VTkxPQ0soJmlwX2Nvbm50cmFja19sb2NrKTsKKworCXJldHVybiBORl9EUk9QOworfQorCisvKiBSZXR1cm5zIHRydWUgaWYgYSBjb25uZWN0aW9uIGNvcnJlc3BvbmRpbmdzIHRvIHRoZSB0dXBsZSAocmVxdWlyZWQKKyAgIGZvciBOQVQpLiAqLworaW50CitpcF9jb25udHJhY2tfdHVwbGVfdGFrZW4oY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCisJCQkgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqaWdub3JlZF9jb25udHJhY2spCit7CisJc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICpoOworCisJUkVBRF9MT0NLKCZpcF9jb25udHJhY2tfbG9jayk7CisJaCA9IF9faXBfY29ubnRyYWNrX2ZpbmQodHVwbGUsIGlnbm9yZWRfY29ubnRyYWNrKTsKKwlSRUFEX1VOTE9DSygmaXBfY29ubnRyYWNrX2xvY2spOworCisJcmV0dXJuIGggIT0gTlVMTDsKK30KKworLyogVGhlcmUncyBhIHNtYWxsIHJhY2UgaGVyZSB3aGVyZSB3ZSBtYXkgZnJlZSBhIGp1c3QtYXNzdXJlZAorICAgY29ubmVjdGlvbi4gIFRvbyBiYWQ6IHdlJ3JlIGluIHRyb3VibGUgYW55d2F5LiAqLworc3RhdGljIGlubGluZSBpbnQgdW5yZXBsaWVkKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqaSkKK3sKKwlyZXR1cm4gISh0ZXN0X2JpdChJUFNfQVNTVVJFRF9CSVQsICZ0dXBsZWhhc2hfdG9fY3RyYWNrKGkpLT5zdGF0dXMpKTsKK30KKworc3RhdGljIGludCBlYXJseV9kcm9wKHN0cnVjdCBsaXN0X2hlYWQgKmNoYWluKQoreworCS8qIFRyYXZlcnNlIGJhY2t3YXJkczogZ2l2ZXMgdXMgb2xkZXN0LCB3aGljaCBpcyByb3VnaGx5IExSVSAqLworCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCA9IE5VTEw7CisJaW50IGRyb3BwZWQgPSAwOworCisJUkVBRF9MT0NLKCZpcF9jb25udHJhY2tfbG9jayk7CisJaCA9IExJU1RfRklORF9CKGNoYWluLCB1bnJlcGxpZWQsIHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqKTsKKwlpZiAoaCkgeworCQljdCA9IHR1cGxlaGFzaF90b19jdHJhY2soaCk7CisJCWF0b21pY19pbmMoJmN0LT5jdF9nZW5lcmFsLnVzZSk7CisJfQorCVJFQURfVU5MT0NLKCZpcF9jb25udHJhY2tfbG9jayk7CisKKwlpZiAoIWN0KQorCQlyZXR1cm4gZHJvcHBlZDsKKworCWlmIChkZWxfdGltZXIoJmN0LT50aW1lb3V0KSkgeworCQlkZWF0aF9ieV90aW1lb3V0KCh1bnNpZ25lZCBsb25nKWN0KTsKKwkJZHJvcHBlZCA9IDE7CisJCUNPTk5UUkFDS19TVEFUX0lOQyhlYXJseV9kcm9wKTsKKwl9CisJaXBfY29ubnRyYWNrX3B1dChjdCk7CisJcmV0dXJuIGRyb3BwZWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhlbHBlcl9jbXAoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgKmksCisJCQkgICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnJ0dXBsZSkKK3sKKwlyZXR1cm4gaXBfY3RfdHVwbGVfbWFza19jbXAocnR1cGxlLCAmaS0+dHVwbGUsICZpLT5tYXNrKTsKK30KKworc3RhdGljIHN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyICppcF9jdF9maW5kX2hlbHBlcihjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKK3sKKwlyZXR1cm4gTElTVF9GSU5EKCZoZWxwZXJzLCBoZWxwZXJfY21wLAorCQkJIHN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyICosCisJCQkgdHVwbGUpOworfQorCisvKiBBbGxvY2F0ZSBhIG5ldyBjb25udHJhY2s6IHdlIHJldHVybiAtRU5PTUVNIGlmIGNsYXNzaWZpY2F0aW9uCisgICBmYWlsZWQgZHVlIHRvIHN0cmVzcy4gIE90aGVyd2lzZSBpdCByZWFsbHkgaXMgdW5jbGFzc2lmaWFibGUuICovCitzdGF0aWMgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICoKK2luaXRfY29ubnRyYWNrKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAorCSAgICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICpwcm90b2NvbCwKKwkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2s7CisJc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSByZXBsX3R1cGxlOworCXNpemVfdCBoYXNoOworCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHA7CisKKwlpZiAoIWlwX2Nvbm50cmFja19oYXNoX3JuZF9pbml0dGVkKSB7CisJCWdldF9yYW5kb21fYnl0ZXMoJmlwX2Nvbm50cmFja19oYXNoX3JuZCwgNCk7CisJCWlwX2Nvbm50cmFja19oYXNoX3JuZF9pbml0dGVkID0gMTsKKwl9CisKKwloYXNoID0gaGFzaF9jb25udHJhY2sodHVwbGUpOworCisJaWYgKGlwX2Nvbm50cmFja19tYXgKKwkgICAgJiYgYXRvbWljX3JlYWQoJmlwX2Nvbm50cmFja19jb3VudCkgPj0gaXBfY29ubnRyYWNrX21heCkgeworCQkvKiBUcnkgZHJvcHBpbmcgZnJvbSB0aGlzIGhhc2ggY2hhaW4uICovCisJCWlmICghZWFybHlfZHJvcCgmaXBfY29ubnRyYWNrX2hhc2hbaGFzaF0pKSB7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkgICAgICAgImlwX2Nvbm50cmFjazogdGFibGUgZnVsbCwgZHJvcHBpbmciCisJCQkJICAgICAgICIgcGFja2V0LlxuIik7CisJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwkJfQorCX0KKworCWlmICghaXBfY3RfaW52ZXJ0X3R1cGxlKCZyZXBsX3R1cGxlLCB0dXBsZSwgcHJvdG9jb2wpKSB7CisJCURFQlVHUCgiQ2FuJ3QgaW52ZXJ0IHR1cGxlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWNvbm50cmFjayA9IGttZW1fY2FjaGVfYWxsb2MoaXBfY29ubnRyYWNrX2NhY2hlcCwgR0ZQX0FUT01JQyk7CisJaWYgKCFjb25udHJhY2spIHsKKwkJREVCVUdQKCJDYW4ndCBhbGxvY2F0ZSBjb25udHJhY2suXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJbWVtc2V0KGNvbm50cmFjaywgMCwgc2l6ZW9mKCpjb25udHJhY2spKTsKKwlhdG9taWNfc2V0KCZjb25udHJhY2stPmN0X2dlbmVyYWwudXNlLCAxKTsKKwljb25udHJhY2stPmN0X2dlbmVyYWwuZGVzdHJveSA9IGRlc3Ryb3lfY29ubnRyYWNrOworCWNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUgPSAqdHVwbGU7CisJY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZSA9IHJlcGxfdHVwbGU7CisJaWYgKCFwcm90b2NvbC0+bmV3KGNvbm50cmFjaywgc2tiKSkgeworCQlrbWVtX2NhY2hlX2ZyZWUoaXBfY29ubnRyYWNrX2NhY2hlcCwgY29ubnRyYWNrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8qIERvbid0IHNldCB0aW1lciB5ZXQ6IHdhaXQgZm9yIGNvbmZpcm1hdGlvbiAqLworCWluaXRfdGltZXIoJmNvbm50cmFjay0+dGltZW91dCk7CisJY29ubnRyYWNrLT50aW1lb3V0LmRhdGEgPSAodW5zaWduZWQgbG9uZyljb25udHJhY2s7CisJY29ubnRyYWNrLT50aW1lb3V0LmZ1bmN0aW9uID0gZGVhdGhfYnlfdGltZW91dDsKKworCVdSSVRFX0xPQ0soJmlwX2Nvbm50cmFja19sb2NrKTsKKwlleHAgPSBmaW5kX2V4cGVjdGF0aW9uKHR1cGxlKTsKKworCWlmIChleHApIHsKKwkJREVCVUdQKCJjb25udHJhY2s6IGV4cGVjdGF0aW9uIGFycml2ZXMgY3Q9JXAgZXhwPSVwXG4iLAorCQkJY29ubnRyYWNrLCBleHApOworCQkvKiBXZWxjb21lLCBNci4gQm9uZC4gIFdlJ3ZlIGJlZW4gZXhwZWN0aW5nIHlvdS4uLiAqLworCQlfX3NldF9iaXQoSVBTX0VYUEVDVEVEX0JJVCwgJmNvbm50cmFjay0+c3RhdHVzKTsKKwkJY29ubnRyYWNrLT5tYXN0ZXIgPSBleHAtPm1hc3RlcjsKKyNpZiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX01BUksKKwkJY29ubnRyYWNrLT5tYXJrID0gZXhwLT5tYXN0ZXItPm1hcms7CisjZW5kaWYKKwkJbmZfY29ubnRyYWNrX2dldCgmY29ubnRyYWNrLT5tYXN0ZXItPmN0X2dlbmVyYWwpOworCQlDT05OVFJBQ0tfU1RBVF9JTkMoZXhwZWN0X25ldyk7CisJfSBlbHNlIHsKKwkJY29ubnRyYWNrLT5oZWxwZXIgPSBpcF9jdF9maW5kX2hlbHBlcigmcmVwbF90dXBsZSk7CisKKwkJQ09OTlRSQUNLX1NUQVRfSU5DKG5ldyk7CisJfQorCisJLyogT3ZlcmxvYWQgdHVwbGUgbGlua2VkIGxpc3QgdG8gcHV0IHVzIGluIHVuY29uZmlybWVkIGxpc3QuICovCisJbGlzdF9hZGQoJmNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0ubGlzdCwgJnVuY29uZmlybWVkKTsKKworCWF0b21pY19pbmMoJmlwX2Nvbm50cmFja19jb3VudCk7CisJV1JJVEVfVU5MT0NLKCZpcF9jb25udHJhY2tfbG9jayk7CisKKwlpZiAoZXhwKSB7CisJCWlmIChleHAtPmV4cGVjdGZuKQorCQkJZXhwLT5leHBlY3Rmbihjb25udHJhY2ssIGV4cCk7CisJCWRlc3Ryb3lfZXhwZWN0KGV4cCk7CisJfQorCisJcmV0dXJuICZjb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdOworfQorCisvKiBPbiBzdWNjZXNzLCByZXR1cm5zIGNvbm50cmFjayBwdHIsIHNldHMgc2tiLT5uZmN0IGFuZCBjdGluZm8gKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwX2Nvbm50cmFjayAqCityZXNvbHZlX25vcm1hbF9jdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgIHN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvLAorCQkgIGludCAqc2V0X3JlcGx5LAorCQkgIHVuc2lnbmVkIGludCBob29rbnVtLAorCQkgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gKmN0aW5mbykKK3sKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlIHR1cGxlOworCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKKworCUlQX05GX0FTU0VSVCgoc2tiLT5uaC5pcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfT0ZGU0VUKSkgPT0gMCk7CisKKwlpZiAoIWlwX2N0X2dldF90dXBsZShza2ItPm5oLmlwaCwgc2tiLCBza2ItPm5oLmlwaC0+aWhsKjQsIAorCQkJCSZ0dXBsZSxwcm90bykpCisJCXJldHVybiBOVUxMOworCisJLyogbG9vayBmb3IgdHVwbGUgbWF0Y2ggKi8KKwloID0gaXBfY29ubnRyYWNrX2ZpbmRfZ2V0KCZ0dXBsZSwgTlVMTCk7CisJaWYgKCFoKSB7CisJCWggPSBpbml0X2Nvbm50cmFjaygmdHVwbGUsIHByb3RvLCBza2IpOworCQlpZiAoIWgpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKElTX0VSUihoKSkKKwkJCXJldHVybiAodm9pZCAqKWg7CisJfQorCWN0ID0gdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKKworCS8qIEl0IGV4aXN0czsgd2UgaGF2ZSAobm9uLWV4Y2x1c2l2ZSkgcmVmZXJlbmNlLiAqLworCWlmIChESVJFQ1RJT04oaCkgPT0gSVBfQ1RfRElSX1JFUExZKSB7CisJCSpjdGluZm8gPSBJUF9DVF9FU1RBQkxJU0hFRCArIElQX0NUX0lTX1JFUExZOworCQkvKiBQbGVhc2Ugc2V0IHJlcGx5IGJpdCBpZiB0aGlzIHBhY2tldCBPSyAqLworCQkqc2V0X3JlcGx5ID0gMTsKKwl9IGVsc2UgeworCQkvKiBPbmNlIHdlJ3ZlIGhhZCB0d28gd2F5IGNvbW1zLCBhbHdheXMgRVNUQUJMSVNIRUQuICovCisJCWlmICh0ZXN0X2JpdChJUFNfU0VFTl9SRVBMWV9CSVQsICZjdC0+c3RhdHVzKSkgeworCQkJREVCVUdQKCJpcF9jb25udHJhY2tfaW46IG5vcm1hbCBwYWNrZXQgZm9yICVwXG4iLAorCQkJICAgICAgIGN0KTsKKwkJICAgICAgICAqY3RpbmZvID0gSVBfQ1RfRVNUQUJMSVNIRUQ7CisJCX0gZWxzZSBpZiAodGVzdF9iaXQoSVBTX0VYUEVDVEVEX0JJVCwgJmN0LT5zdGF0dXMpKSB7CisJCQlERUJVR1AoImlwX2Nvbm50cmFja19pbjogcmVsYXRlZCBwYWNrZXQgZm9yICVwXG4iLAorCQkJICAgICAgIGN0KTsKKwkJCSpjdGluZm8gPSBJUF9DVF9SRUxBVEVEOworCQl9IGVsc2UgeworCQkJREVCVUdQKCJpcF9jb25udHJhY2tfaW46IG5ldyBwYWNrZXQgZm9yICVwXG4iLAorCQkJICAgICAgIGN0KTsKKwkJCSpjdGluZm8gPSBJUF9DVF9ORVc7CisJCX0KKwkJKnNldF9yZXBseSA9IDA7CisJfQorCXNrYi0+bmZjdCA9ICZjdC0+Y3RfZ2VuZXJhbDsKKwlza2ItPm5mY3RpbmZvID0gKmN0aW5mbzsKKwlyZXR1cm4gY3Q7Cit9CisKKy8qIE5ldGZpbHRlciBob29rIGl0c2VsZi4gKi8KK3Vuc2lnbmVkIGludCBpcF9jb25udHJhY2tfaW4odW5zaWduZWQgaW50IGhvb2tudW0sCisJCQkgICAgIHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQkJICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKKwllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICpwcm90bzsKKwlpbnQgc2V0X3JlcGx5OworCWludCByZXQ7CisKKwkvKiBQcmV2aW91c2x5IHNlZW4gKGxvb3BiYWNrIG9yIHVudHJhY2tlZCk/ICBJZ25vcmUuICovCisJaWYgKCgqcHNrYiktPm5mY3QpIHsKKwkJQ09OTlRSQUNLX1NUQVRfSU5DKGlnbm9yZSk7CisJCXJldHVybiBORl9BQ0NFUFQ7CisJfQorCisJLyogTmV2ZXIgaGFwcGVuICovCisJaWYgKCgqcHNrYiktPm5oLmlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9PRkZTRVQpKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpcF9jb25udHJhY2tfaW46IEZyYWcgb2YgcHJvdG8gJXUgKGhvb2s9JXUpXG4iLAorCQkgICAgICAgKCpwc2tiKS0+bmguaXBoLT5wcm90b2NvbCwgaG9va251bSk7CisJCX0KKwkJcmV0dXJuIE5GX0RST1A7CisJfQorCisJLyogRklYTUU6IERvIHRoaXMgcmlnaHQgcGxlYXNlLiAtLVJSICovCisJKCpwc2tiKS0+bmZjYWNoZSB8PSBORkNfVU5LTk9XTjsKKworLyogRG9lc24ndCBjb3ZlciBsb2NhbGx5LWdlbmVyYXRlZCBicm9hZGNhc3QsIHNvIG5vdCB3b3J0aCBpdC4gKi8KKyNpZiAwCisJLyogSWdub3JlIGJyb2FkY2FzdDogbm8gYGNvbm5lY3Rpb24nLiAqLworCWlmICgoKnBza2IpLT5wa3RfdHlwZSA9PSBQQUNLRVRfQlJPQURDQVNUKSB7CisJCXByaW50aygiQnJvYWRjYXN0IHBhY2tldCFcbiIpOworCQlyZXR1cm4gTkZfQUNDRVBUOworCX0gZWxzZSBpZiAoKCgqcHNrYiktPm5oLmlwaC0+ZGFkZHIgJiBodG9ubCgweDAwMDAwMEZGKSkgCisJCSAgID09IGh0b25sKDB4MDAwMDAwRkYpKSB7CisJCXByaW50aygiU2hvdWxkIGJjYXN0OiAldS4ldS4ldS4ldS0+JXUuJXUuJXUuJXUgKHNrPSVwLCBwdHlwZT0ldSlcbiIsCisJCSAgICAgICBOSVBRVUFEKCgqcHNrYiktPm5oLmlwaC0+c2FkZHIpLAorCQkgICAgICAgTklQUVVBRCgoKnBza2IpLT5uaC5pcGgtPmRhZGRyKSwKKwkJICAgICAgICgqcHNrYiktPnNrLCAoKnBza2IpLT5wa3RfdHlwZSk7CisJfQorI2VuZGlmCisKKwlwcm90byA9IGlwX2N0X2ZpbmRfcHJvdG8oKCpwc2tiKS0+bmguaXBoLT5wcm90b2NvbCk7CisKKwkvKiBJdCBtYXkgYmUgYW4gc3BlY2lhbCBwYWNrZXQsIGVycm9yLCB1bmNsZWFuLi4uCisJICogaW52ZXJzZSBvZiB0aGUgcmV0dXJuIGNvZGUgdGVsbHMgdG8gdGhlIG5ldGZpbHRlcgorCSAqIGNvcmUgd2hhdCB0byBkbyB3aXRoIHRoZSBwYWNrZXQuICovCisJaWYgKHByb3RvLT5lcnJvciAhPSBOVUxMIAorCSAgICAmJiAocmV0ID0gcHJvdG8tPmVycm9yKCpwc2tiLCAmY3RpbmZvLCBob29rbnVtKSkgPD0gMCkgeworCQlDT05OVFJBQ0tfU1RBVF9JTkMoZXJyb3IpOworCQlDT05OVFJBQ0tfU1RBVF9JTkMoaW52YWxpZCk7CisJCXJldHVybiAtcmV0OworCX0KKworCWlmICghKGN0ID0gcmVzb2x2ZV9ub3JtYWxfY3QoKnBza2IsIHByb3RvLCZzZXRfcmVwbHksaG9va251bSwmY3RpbmZvKSkpIHsKKwkJLyogTm90IHZhbGlkIHBhcnQgb2YgYSBjb25uZWN0aW9uICovCisJCUNPTk5UUkFDS19TVEFUX0lOQyhpbnZhbGlkKTsKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKwl9CisKKwlpZiAoSVNfRVJSKGN0KSkgeworCQkvKiBUb28gc3RyZXNzZWQgdG8gZGVhbC4gKi8KKwkJQ09OTlRSQUNLX1NUQVRfSU5DKGRyb3ApOworCQlyZXR1cm4gTkZfRFJPUDsKKwl9CisKKwlJUF9ORl9BU1NFUlQoKCpwc2tiKS0+bmZjdCk7CisKKwlyZXQgPSBwcm90by0+cGFja2V0KGN0LCAqcHNrYiwgY3RpbmZvKTsKKwlpZiAocmV0IDwgMCkgeworCQkvKiBJbnZhbGlkOiBpbnZlcnNlIG9mIHRoZSByZXR1cm4gY29kZSB0ZWxscworCQkgKiB0aGUgbmV0ZmlsdGVyIGNvcmUgd2hhdCB0byBkbyovCisJCW5mX2Nvbm50cmFja19wdXQoKCpwc2tiKS0+bmZjdCk7CisJCSgqcHNrYiktPm5mY3QgPSBOVUxMOworCQlDT05OVFJBQ0tfU1RBVF9JTkMoaW52YWxpZCk7CisJCXJldHVybiAtcmV0OworCX0KKworCWlmIChzZXRfcmVwbHkpCisJCXNldF9iaXQoSVBTX1NFRU5fUkVQTFlfQklULCAmY3QtPnN0YXR1cyk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaW52ZXJ0X3R1cGxlcHIoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqaW52ZXJzZSwKKwkJICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqb3JpZykKK3sKKwlyZXR1cm4gaXBfY3RfaW52ZXJ0X3R1cGxlKGludmVyc2UsIG9yaWcsIAorCQkJCSAgaXBfY3RfZmluZF9wcm90byhvcmlnLT5kc3QucHJvdG9udW0pKTsKK30KKworLyogV291bGQgdHdvIGV4cGVjdGVkIHRoaW5ncyBjbGFzaD8gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGV4cGVjdF9jbGFzaChjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqYSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqYikKK3sKKwkvKiBQYXJ0IGNvdmVyZWQgYnkgaW50ZXJzZWN0aW9uIG9mIG1hc2tzIG11c3QgYmUgdW5lcXVhbCwKKyAgICAgICAgICAgb3RoZXJ3aXNlIHRoZXkgY2xhc2ggKi8KKwlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlIGludGVyc2VjdF9tYXNrCisJCT0geyB7IGEtPm1hc2suc3JjLmlwICYgYi0+bWFzay5zcmMuaXAsCisJCSAgICAgIHsgYS0+bWFzay5zcmMudS5hbGwgJiBiLT5tYXNrLnNyYy51LmFsbCB9IH0sCisJCSAgICB7IGEtPm1hc2suZHN0LmlwICYgYi0+bWFzay5kc3QuaXAsCisJCSAgICAgIHsgYS0+bWFzay5kc3QudS5hbGwgJiBiLT5tYXNrLmRzdC51LmFsbCB9LAorCQkgICAgICBhLT5tYXNrLmRzdC5wcm90b251bSAmIGItPm1hc2suZHN0LnByb3RvbnVtIH0gfTsKKworCXJldHVybiBpcF9jdF90dXBsZV9tYXNrX2NtcCgmYS0+dHVwbGUsICZiLT50dXBsZSwgJmludGVyc2VjdF9tYXNrKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZXhwZWN0X21hdGNoZXMoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmEsCisJCQkJIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpiKQoreworCXJldHVybiBhLT5tYXN0ZXIgPT0gYi0+bWFzdGVyCisJCSYmIGlwX2N0X3R1cGxlX2VxdWFsKCZhLT50dXBsZSwgJmItPnR1cGxlKQorCQkmJiBpcF9jdF90dXBsZV9lcXVhbCgmYS0+bWFzaywgJmItPm1hc2spOworfQorCisvKiBHZW5lcmFsbHkgYSBiYWQgaWRlYSB0byBjYWxsIHRoaXM6IGNvdWxkIGhhdmUgbWF0Y2hlZCBhbHJlYWR5LiAqLwordm9pZCBpcF9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQoreworCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICppOworCisJV1JJVEVfTE9DSygmaXBfY29ubnRyYWNrX2xvY2spOworCS8qIGNob29zZSB0aGUgdGhlIG9sZGVzdCBleHBlY3RhdGlvbiB0byBldmljdCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShpLCAmaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0LCBsaXN0KSB7CisJCWlmIChleHBlY3RfbWF0Y2hlcyhpLCBleHApICYmIGRlbF90aW1lcigmaS0+dGltZW91dCkpIHsKKwkJCXVubGlua19leHBlY3QoaSk7CisJCQlXUklURV9VTkxPQ0soJmlwX2Nvbm50cmFja19sb2NrKTsKKwkJCWRlc3Ryb3lfZXhwZWN0KGkpOworCQkJcmV0dXJuOworCQl9CisJfQorCVdSSVRFX1VOTE9DSygmaXBfY29ubnRyYWNrX2xvY2spOworfQorCitzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyh2b2lkKQoreworCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpuZXc7CisKKwluZXcgPSBrbWVtX2NhY2hlX2FsbG9jKGlwX2Nvbm50cmFja19leHBlY3RfY2FjaGVwLCBHRlBfQVRPTUlDKTsKKwlpZiAoIW5ldykgeworCQlERUJVR1AoImV4cGVjdF9yZWxhdGVkOiBPT00gYWxsb2NhdGluZyBleHBlY3RcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbmV3LT5tYXN0ZXIgPSBOVUxMOworCXJldHVybiBuZXc7Cit9CisKK3ZvaWQgaXBfY29ubnRyYWNrX2V4cGVjdF9mcmVlKHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHBlY3QpCit7CisJa21lbV9jYWNoZV9mcmVlKGlwX2Nvbm50cmFja19leHBlY3RfY2FjaGVwLCBleHBlY3QpOworfQorCitzdGF0aWMgdm9pZCBpcF9jb25udHJhY2tfZXhwZWN0X2luc2VydChzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQoreworCWF0b21pY19pbmMoJmV4cC0+bWFzdGVyLT5jdF9nZW5lcmFsLnVzZSk7CisJZXhwLT5tYXN0ZXItPmV4cGVjdGluZysrOworCWxpc3RfYWRkKCZleHAtPmxpc3QsICZpcF9jb25udHJhY2tfZXhwZWN0X2xpc3QpOworCisJaWYgKGV4cC0+bWFzdGVyLT5oZWxwZXItPnRpbWVvdXQpIHsKKwkJaW5pdF90aW1lcigmZXhwLT50aW1lb3V0KTsKKwkJZXhwLT50aW1lb3V0LmRhdGEgPSAodW5zaWduZWQgbG9uZylleHA7CisJCWV4cC0+dGltZW91dC5mdW5jdGlvbiA9IGV4cGVjdGF0aW9uX3RpbWVkX291dDsKKwkJZXhwLT50aW1lb3V0LmV4cGlyZXMKKwkJCT0gamlmZmllcyArIGV4cC0+bWFzdGVyLT5oZWxwZXItPnRpbWVvdXQgKiBIWjsKKwkJYWRkX3RpbWVyKCZleHAtPnRpbWVvdXQpOworCX0gZWxzZQorCQlleHAtPnRpbWVvdXQuZnVuY3Rpb24gPSBOVUxMOworCisJQ09OTlRSQUNLX1NUQVRfSU5DKGV4cGVjdF9jcmVhdGUpOworfQorCisvKiBSYWNlIHdpdGggZXhwZWN0YXRpb25zIGJlaW5nIHVzZWQgbWVhbnMgd2UgY291bGQgaGF2ZSBub25lIHRvIGZpbmQ7IE9LLiAqLworc3RhdGljIHZvaWQgZXZpY3Rfb2xkZXN0X2V4cGVjdChzdHJ1Y3QgaXBfY29ubnRyYWNrICptYXN0ZXIpCit7CisJc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoaSwgJmlwX2Nvbm50cmFja19leHBlY3RfbGlzdCwgbGlzdCkgeworCQlpZiAoaS0+bWFzdGVyID09IG1hc3RlcikgeworCQkJaWYgKGRlbF90aW1lcigmaS0+dGltZW91dCkpIHsKKwkJCQl1bmxpbmtfZXhwZWN0KGkpOworCQkJCWRlc3Ryb3lfZXhwZWN0KGkpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJlZnJlc2hfdGltZXIoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmkpCit7CisJaWYgKCFkZWxfdGltZXIoJmktPnRpbWVvdXQpKQorCQlyZXR1cm4gMDsKKworCWktPnRpbWVvdXQuZXhwaXJlcyA9IGppZmZpZXMgKyBpLT5tYXN0ZXItPmhlbHBlci0+dGltZW91dCpIWjsKKwlhZGRfdGltZXIoJmktPnRpbWVvdXQpOworCXJldHVybiAxOworfQorCitpbnQgaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHBlY3QpCit7CisJc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmk7CisJaW50IHJldDsKKworCURFQlVHUCgiaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkICVwXG4iLCByZWxhdGVkX3RvKTsKKwlERUJVR1AoInR1cGxlOiAiKTsgRFVNUF9UVVBMRSgmZXhwZWN0LT50dXBsZSk7CisJREVCVUdQKCJtYXNrOiAgIik7IERVTVBfVFVQTEUoJmV4cGVjdC0+bWFzayk7CisKKwlXUklURV9MT0NLKCZpcF9jb25udHJhY2tfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpLCAmaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0LCBsaXN0KSB7CisJCWlmIChleHBlY3RfbWF0Y2hlcyhpLCBleHBlY3QpKSB7CisJCQkvKiBSZWZyZXNoIHRpbWVyOiBpZiBpdCdzIGR5aW5nLCBpZ25vcmUuLiAqLworCQkJaWYgKHJlZnJlc2hfdGltZXIoaSkpIHsKKwkJCQlyZXQgPSAwOworCQkJCS8qIFdlIGRvbid0IG5lZWQgdGhlIG9uZSB0aGV5J3ZlIGdpdmVuIHVzLiAqLworCQkJCWlwX2Nvbm50cmFja19leHBlY3RfZnJlZShleHBlY3QpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9IGVsc2UgaWYgKGV4cGVjdF9jbGFzaChpLCBleHBlY3QpKSB7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qIFdpbGwgYmUgb3ZlciBsaW1pdD8gKi8KKwlpZiAoZXhwZWN0LT5tYXN0ZXItPmhlbHBlci0+bWF4X2V4cGVjdGVkICYmIAorCSAgICBleHBlY3QtPm1hc3Rlci0+ZXhwZWN0aW5nID49IGV4cGVjdC0+bWFzdGVyLT5oZWxwZXItPm1heF9leHBlY3RlZCkKKwkJZXZpY3Rfb2xkZXN0X2V4cGVjdChleHBlY3QtPm1hc3Rlcik7CisKKwlpcF9jb25udHJhY2tfZXhwZWN0X2luc2VydChleHBlY3QpOworCXJldCA9IDA7CitvdXQ6CisJV1JJVEVfVU5MT0NLKCZpcF9jb25udHJhY2tfbG9jayk7CisgCXJldHVybiByZXQ7Cit9CisKKy8qIEFsdGVyIHJlcGx5IHR1cGxlIChtYXliZSBhbHRlciBoZWxwZXIpLiAgVGhpcyBpcyBmb3IgTkFULCBhbmQgaXMKKyAgIGltcGxpY2l0bHkgcmFjeTogc2VlIF9faXBfY29ubnRyYWNrX2NvbmZpcm0gKi8KK3ZvaWQgaXBfY29ubnRyYWNrX2FsdGVyX3JlcGx5KHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaywKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKm5ld3JlcGx5KQoreworCVdSSVRFX0xPQ0soJmlwX2Nvbm50cmFja19sb2NrKTsKKwkvKiBTaG91bGQgYmUgdW5jb25maXJtZWQsIHNvIG5vdCBpbiBoYXNoIHRhYmxlIHlldCAqLworCUlQX05GX0FTU0VSVCghaXNfY29uZmlybWVkKGNvbm50cmFjaykpOworCisJREVCVUdQKCJBbHRlcmluZyByZXBseSB0dXBsZSBvZiAlcCB0byAiLCBjb25udHJhY2spOworCURVTVBfVFVQTEUobmV3cmVwbHkpOworCisJY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZSA9ICpuZXdyZXBseTsKKwlpZiAoIWNvbm50cmFjay0+bWFzdGVyICYmIGNvbm50cmFjay0+ZXhwZWN0aW5nID09IDApCisJCWNvbm50cmFjay0+aGVscGVyID0gaXBfY3RfZmluZF9oZWxwZXIobmV3cmVwbHkpOworCVdSSVRFX1VOTE9DSygmaXBfY29ubnRyYWNrX2xvY2spOworfQorCitpbnQgaXBfY29ubnRyYWNrX2hlbHBlcl9yZWdpc3RlcihzdHJ1Y3QgaXBfY29ubnRyYWNrX2hlbHBlciAqbWUpCit7CisJQlVHX09OKG1lLT50aW1lb3V0ID09IDApOworCVdSSVRFX0xPQ0soJmlwX2Nvbm50cmFja19sb2NrKTsKKwlsaXN0X3ByZXBlbmQoJmhlbHBlcnMsIG1lKTsKKwlXUklURV9VTkxPQ0soJmlwX2Nvbm50cmFja19sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCB1bmhlbHAoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICppLAorCQkJIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyICptZSkKK3sKKwlpZiAodHVwbGVoYXNoX3RvX2N0cmFjayhpKS0+aGVscGVyID09IG1lKQorCQl0dXBsZWhhc2hfdG9fY3RyYWNrKGkpLT5oZWxwZXIgPSBOVUxMOworCXJldHVybiAwOworfQorCit2b2lkIGlwX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3RlcihzdHJ1Y3QgaXBfY29ubnRyYWNrX2hlbHBlciAqbWUpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCwgKnRtcDsKKworCS8qIE5lZWQgd3JpdGUgbG9jayBoZXJlLCB0byBkZWxldGUgaGVscGVyLiAqLworCVdSSVRFX0xPQ0soJmlwX2Nvbm50cmFja19sb2NrKTsKKwlMSVNUX0RFTEVURSgmaGVscGVycywgbWUpOworCisJLyogR2V0IHJpZCBvZiBleHBlY3RhdGlvbnMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZXhwLCB0bXAsICZpcF9jb25udHJhY2tfZXhwZWN0X2xpc3QsIGxpc3QpIHsKKwkJaWYgKGV4cC0+bWFzdGVyLT5oZWxwZXIgPT0gbWUgJiYgZGVsX3RpbWVyKCZleHAtPnRpbWVvdXQpKSB7CisJCQl1bmxpbmtfZXhwZWN0KGV4cCk7CisJCQlkZXN0cm95X2V4cGVjdChleHApOworCQl9CisJfQorCS8qIEdldCByaWQgb2YgZXhwZWN0ZWRzLCBzZXQgaGVscGVycyB0byBOVUxMLiAqLworCUxJU1RfRklORF9XKCZ1bmNvbmZpcm1lZCwgdW5oZWxwLCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2gqLCBtZSk7CisJZm9yIChpID0gMDsgaSA8IGlwX2Nvbm50cmFja19odGFibGVfc2l6ZTsgaSsrKQorCQlMSVNUX0ZJTkRfVygmaXBfY29ubnRyYWNrX2hhc2hbaV0sIHVuaGVscCwKKwkJCSAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKiwgbWUpOworCVdSSVRFX1VOTE9DSygmaXBfY29ubnRyYWNrX2xvY2spOworCisJLyogU29tZW9uZSBjb3VsZCBiZSBzdGlsbCBsb29raW5nIGF0IHRoZSBoZWxwZXIgaW4gYSBiaC4gKi8KKwlzeW5jaHJvbml6ZV9uZXQoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGN0X2FkZF9jb3VudGVycyhzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKKwkJCQkgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCQkgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworI2lmZGVmIENPTkZJR19JUF9ORl9DVF9BQ0NUCisJaWYgKHNrYikgeworCQljdC0+Y291bnRlcnNbQ1RJTkZPMkRJUihjdGluZm8pXS5wYWNrZXRzKys7CisJCWN0LT5jb3VudGVyc1tDVElORk8yRElSKGN0aW5mbyldLmJ5dGVzICs9IAorCQkJCQludG9ocyhza2ItPm5oLmlwaC0+dG90X2xlbik7CisJfQorI2VuZGlmCit9CisKKy8qIFJlZnJlc2ggY29ubnRyYWNrIGZvciB0aGlzIG1hbnkgamlmZmllcyBhbmQgZG8gYWNjb3VudGluZyAoaWYgc2tiICE9IE5VTEwpICovCit2b2lkIGlwX2N0X3JlZnJlc2hfYWNjdChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwgCisJCSAgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQljb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJdW5zaWduZWQgbG9uZyBleHRyYV9qaWZmaWVzKQoreworCUlQX05GX0FTU0VSVChjdC0+dGltZW91dC5kYXRhID09ICh1bnNpZ25lZCBsb25nKWN0KTsKKworCS8qIElmIG5vdCBpbiBoYXNoIHRhYmxlLCB0aW1lciB3aWxsIG5vdCBiZSBhY3RpdmUgeWV0ICovCisJaWYgKCFpc19jb25maXJtZWQoY3QpKSB7CisJCWN0LT50aW1lb3V0LmV4cGlyZXMgPSBleHRyYV9qaWZmaWVzOworCQljdF9hZGRfY291bnRlcnMoY3QsIGN0aW5mbywgc2tiKTsKKwl9IGVsc2UgeworCQlXUklURV9MT0NLKCZpcF9jb25udHJhY2tfbG9jayk7CisJCS8qIE5lZWQgZGVsX3RpbWVyIGZvciByYWNlIGF2b2lkYW5jZSAobWF5IGFscmVhZHkgYmUgZHlpbmcpLiAqLworCQlpZiAoZGVsX3RpbWVyKCZjdC0+dGltZW91dCkpIHsKKwkJCWN0LT50aW1lb3V0LmV4cGlyZXMgPSBqaWZmaWVzICsgZXh0cmFfamlmZmllczsKKwkJCWFkZF90aW1lcigmY3QtPnRpbWVvdXQpOworCQl9CisJCWN0X2FkZF9jb3VudGVycyhjdCwgY3RpbmZvLCBza2IpOworCQlXUklURV9VTkxPQ0soJmlwX2Nvbm50cmFja19sb2NrKTsKKwl9Cit9CisKKy8qIFJldHVybnMgbmV3IHNrX2J1ZmYsIG9yIE5VTEwgKi8KK3N0cnVjdCBza19idWZmICoKK2lwX2N0X2dhdGhlcl9mcmFncyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1X2ludDMyX3QgdXNlcikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBza2ItPnNrOworI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKKwl1bnNpZ25lZCBpbnQgb2xkZGVidWcgPSBza2ItPm5mX2RlYnVnOworI2VuZGlmCisKKwlpZiAoc2spIHsKKwkJc29ja19ob2xkKHNrKTsKKwkJc2tiX29ycGhhbihza2IpOworCX0KKworCWxvY2FsX2JoX2Rpc2FibGUoKTsgCisJc2tiID0gaXBfZGVmcmFnKHNrYiwgdXNlcik7CisJbG9jYWxfYmhfZW5hYmxlKCk7CisKKwlpZiAoIXNrYikgeworCQlpZiAoc2spCisJCQlzb2NrX3B1dChzayk7CisJCXJldHVybiBza2I7CisJfQorCisJaWYgKHNrKSB7CisJCXNrYl9zZXRfb3duZXJfdyhza2IsIHNrKTsKKwkJc29ja19wdXQoc2spOworCX0KKworCWlwX3NlbmRfY2hlY2soc2tiLT5uaC5pcGgpOworCXNrYi0+bmZjYWNoZSB8PSBORkNfQUxURVJFRDsKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCisJLyogUGFja2V0IHBhdGggYXMgaWYgbm90aGluZyBoYWQgaGFwcGVuZWQuICovCisJc2tiLT5uZl9kZWJ1ZyA9IG9sZGRlYnVnOworI2VuZGlmCisJcmV0dXJuIHNrYjsKK30KKworLyogVXNlZCBieSBpcHRfUkVKRUNULiAqLworc3RhdGljIHZvaWQgaXBfY29ubnRyYWNrX2F0dGFjaChzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKKwllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKKworCS8qIFRoaXMgSUNNUCBpcyBpbiByZXZlcnNlIGRpcmVjdGlvbiB0byB0aGUgcGFja2V0IHdoaWNoIGNhdXNlZCBpdCAqLworCWN0ID0gaXBfY29ubnRyYWNrX2dldChza2IsICZjdGluZm8pOworCQorCWlmIChDVElORk8yRElSKGN0aW5mbykgPT0gSVBfQ1RfRElSX09SSUdJTkFMKQorCQljdGluZm8gPSBJUF9DVF9SRUxBVEVEICsgSVBfQ1RfSVNfUkVQTFk7CisJZWxzZQorCQljdGluZm8gPSBJUF9DVF9SRUxBVEVEOworCisJLyogQXR0YWNoIHRvIG5ldyBza2J1ZmYsIGFuZCBpbmNyZW1lbnQgY291bnQgKi8KKwluc2tiLT5uZmN0ID0gJmN0LT5jdF9nZW5lcmFsOworCW5za2ItPm5mY3RpbmZvID0gY3RpbmZvOworCW5mX2Nvbm50cmFja19nZXQobnNrYi0+bmZjdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citkb19pdGVyKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqaSwKKwlpbnQgKCppdGVyKShzdHJ1Y3QgaXBfY29ubnRyYWNrICppLCB2b2lkICpkYXRhKSwKKwl2b2lkICpkYXRhKQoreworCXJldHVybiBpdGVyKHR1cGxlaGFzaF90b19jdHJhY2soaSksIGRhdGEpOworfQorCisvKiBCcmluZyBvdXQgeWEgZGVhZCEgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKgorZ2V0X25leHRfY29ycHNlKGludCAoKml0ZXIpKHN0cnVjdCBpcF9jb25udHJhY2sgKmksIHZvaWQgKmRhdGEpLAorCQl2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgKmJ1Y2tldCkKK3sKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmggPSBOVUxMOworCisJV1JJVEVfTE9DSygmaXBfY29ubnRyYWNrX2xvY2spOworCWZvciAoOyAqYnVja2V0IDwgaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplOyAoKmJ1Y2tldCkrKykgeworCQloID0gTElTVF9GSU5EX1coJmlwX2Nvbm50cmFja19oYXNoWypidWNrZXRdLCBkb19pdGVyLAorCQkJCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqLCBpdGVyLCBkYXRhKTsKKwkJaWYgKGgpCisJCQlicmVhazsKKwl9CisJaWYgKCFoKQorCQloID0gTElTVF9GSU5EX1coJnVuY29uZmlybWVkLCBkb19pdGVyLAorCQkJCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqLCBpdGVyLCBkYXRhKTsKKwlpZiAoaCkKKwkJYXRvbWljX2luYygmdHVwbGVoYXNoX3RvX2N0cmFjayhoKS0+Y3RfZ2VuZXJhbC51c2UpOworCVdSSVRFX1VOTE9DSygmaXBfY29ubnRyYWNrX2xvY2spOworCisJcmV0dXJuIGg7Cit9CisKK3ZvaWQKK2lwX2N0X2l0ZXJhdGVfY2xlYW51cChpbnQgKCppdGVyKShzdHJ1Y3QgaXBfY29ubnRyYWNrICppLCB2b2lkICopLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKKwl1bnNpZ25lZCBpbnQgYnVja2V0ID0gMDsKKworCXdoaWxlICgoaCA9IGdldF9uZXh0X2NvcnBzZShpdGVyLCBkYXRhLCAmYnVja2V0KSkgIT0gTlVMTCkgeworCQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCA9IHR1cGxlaGFzaF90b19jdHJhY2soaCk7CisJCS8qIFRpbWUgdG8gcHVzaCB1cCBkYWlzZXMuLi4gKi8KKwkJaWYgKGRlbF90aW1lcigmY3QtPnRpbWVvdXQpKQorCQkJZGVhdGhfYnlfdGltZW91dCgodW5zaWduZWQgbG9uZyljdCk7CisJCS8qIC4uLiBlbHNlIHRoZSB0aW1lciB3aWxsIGdldCBoaW0gc29vbi4gKi8KKworCQlpcF9jb25udHJhY2tfcHV0KGN0KTsKKwl9Cit9CisKKy8qIEZhc3QgZnVuY3Rpb24gZm9yIHRob3NlIHdobyBkb24ndCB3YW50IHRvIHBhcnNlIC9wcm9jIChhbmQgSSBkb24ndAorICAgYmxhbWUgdGhlbSkuICovCisvKiBSZXZlcnNpbmcgdGhlIHNvY2tldCdzIGRzdC9zcmMgcG9pbnQgb2YgdmlldyBnaXZlcyB1cyB0aGUgcmVwbHkKKyAgIG1hcHBpbmcuICovCitzdGF0aWMgaW50CitnZXRvcmlnZHN0KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdHZhbCwgdm9pZCBfX3VzZXIgKnVzZXIsIGludCAqbGVuKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7CisJc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSB0dXBsZTsKKwkKKwlJUF9DVF9UVVBMRV9VX0JMQU5LKCZ0dXBsZSk7CisJdHVwbGUuc3JjLmlwID0gaW5ldC0+cmN2X3NhZGRyOworCXR1cGxlLnNyYy51LnRjcC5wb3J0ID0gaW5ldC0+c3BvcnQ7CisJdHVwbGUuZHN0LmlwID0gaW5ldC0+ZGFkZHI7CisJdHVwbGUuZHN0LnUudGNwLnBvcnQgPSBpbmV0LT5kcG9ydDsKKwl0dXBsZS5kc3QucHJvdG9udW0gPSBJUFBST1RPX1RDUDsKKworCS8qIFdlIG9ubHkgZG8gVENQIGF0IHRoZSBtb21lbnQ6IGlzIHRoZXJlIGEgYmV0dGVyIHdheT8gKi8KKwlpZiAoc3RyY21wKHNrLT5za19wcm90LT5uYW1lLCAiVENQIikpIHsKKwkJREVCVUdQKCJTT19PUklHSU5BTF9EU1Q6IE5vdCBhIFRDUCBzb2NrZXRcbiIpOworCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCX0KKworCWlmICgodW5zaWduZWQgaW50KSAqbGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpIHsKKwkJREVCVUdQKCJTT19PUklHSU5BTF9EU1Q6IGxlbiAldSBub3QgJXVcbiIsCisJCSAgICAgICAqbGVuLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWggPSBpcF9jb25udHJhY2tfZmluZF9nZXQoJnR1cGxlLCBOVUxMKTsKKwlpZiAoaCkgeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCA9IHR1cGxlaGFzaF90b19jdHJhY2soaCk7CisKKwkJc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQlzaW4uc2luX3BvcnQgPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0KKwkJCS50dXBsZS5kc3QudS50Y3AucG9ydDsKKwkJc2luLnNpbl9hZGRyLnNfYWRkciA9IGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXQorCQkJLnR1cGxlLmRzdC5pcDsKKworCQlERUJVR1AoIlNPX09SSUdJTkFMX0RTVDogJXUuJXUuJXUuJXUgJXVcbiIsCisJCSAgICAgICBOSVBRVUFEKHNpbi5zaW5fYWRkci5zX2FkZHIpLCBudG9ocyhzaW4uc2luX3BvcnQpKTsKKwkJaXBfY29ubnRyYWNrX3B1dChjdCk7CisJCWlmIChjb3B5X3RvX3VzZXIodXNlciwgJnNpbiwgc2l6ZW9mKHNpbikpICE9IDApCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorCURFQlVHUCgiU09fT1JJR0lOQUxfRFNUOiBDYW4ndCBmaW5kICV1LiV1LiV1LiV1LyV1LSV1LiV1LiV1LiV1LyV1LlxuIiwKKwkgICAgICAgTklQUVVBRCh0dXBsZS5zcmMuaXApLCBudG9ocyh0dXBsZS5zcmMudS50Y3AucG9ydCksCisJICAgICAgIE5JUFFVQUQodHVwbGUuZHN0LmlwKSwgbnRvaHModHVwbGUuZHN0LnUudGNwLnBvcnQpKTsKKwlyZXR1cm4gLUVOT0VOVDsKK30KKworc3RhdGljIHN0cnVjdCBuZl9zb2Nrb3B0X29wcyBzb19nZXRvcmlnZHN0ID0geworCS5wZgkJPSBQRl9JTkVULAorCS5nZXRfb3B0bWluCT0gU09fT1JJR0lOQUxfRFNULAorCS5nZXRfb3B0bWF4CT0gU09fT1JJR0lOQUxfRFNUKzEsCisJLmdldAkJPSAmZ2V0b3JpZ2RzdCwKK307CisKK3N0YXRpYyBpbnQga2lsbF9hbGwoc3RydWN0IGlwX2Nvbm50cmFjayAqaSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9jb25udHJhY2tfaGFzaCh2b2lkKQoreworCWlmIChpcF9jb25udHJhY2tfdm1hbGxvYykKKwkJdmZyZWUoaXBfY29ubnRyYWNrX2hhc2gpOworCWVsc2UKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylpcF9jb25udHJhY2tfaGFzaCwgCisJCQkgICBnZXRfb3JkZXIoc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpCisJCQkJICAgICAqIGlwX2Nvbm50cmFja19odGFibGVfc2l6ZSkpOworfQorCisvKiBNaXNoZWFyaW5nIHRoZSB2b2ljZXMgaW4gaGlzIGhlYWQsIG91ciBoZXJvIHdvbmRlcnMgaG93IGhlJ3MKKyAgIHN1cHBvc2VkIHRvIGtpbGwgdGhlIG1hbGwuICovCit2b2lkIGlwX2Nvbm50cmFja19jbGVhbnVwKHZvaWQpCit7CisJaXBfY3RfYXR0YWNoID0gTlVMTDsKKwkvKiBUaGlzIG1ha2VzIHN1cmUgYWxsIGN1cnJlbnQgcGFja2V0cyBoYXZlIHBhc3NlZCB0aHJvdWdoCisgICAgICAgICAgIG5ldGZpbHRlciBmcmFtZXdvcmsuICBSb2xsIG9uLCB0d28tc3RhZ2UgbW9kdWxlCisgICAgICAgICAgIGRlbGV0ZS4uLiAqLworCXN5bmNocm9uaXplX25ldCgpOworIAorIGlfc2VlX2RlYWRfcGVvcGxlOgorCWlwX2N0X2l0ZXJhdGVfY2xlYW51cChraWxsX2FsbCwgTlVMTCk7CisJaWYgKGF0b21pY19yZWFkKCZpcF9jb25udHJhY2tfY291bnQpICE9IDApIHsKKwkJc2NoZWR1bGUoKTsKKwkJZ290byBpX3NlZV9kZWFkX3Blb3BsZTsKKwl9CisKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koaXBfY29ubnRyYWNrX2NhY2hlcCk7CisJa21lbV9jYWNoZV9kZXN0cm95KGlwX2Nvbm50cmFja19leHBlY3RfY2FjaGVwKTsKKwlmcmVlX2Nvbm50cmFja19oYXNoKCk7CisJbmZfdW5yZWdpc3Rlcl9zb2Nrb3B0KCZzb19nZXRvcmlnZHN0KTsKK30KKworc3RhdGljIGludCBoYXNoc2l6ZTsKK21vZHVsZV9wYXJhbShoYXNoc2l6ZSwgaW50LCAwNDAwKTsKKworaW50IF9faW5pdCBpcF9jb25udHJhY2tfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGludCBpOworCWludCByZXQ7CisKKwkvKiBJZGVhIGZyb20gdGNwLmM6IHVzZSAxLzE2Mzg0IG9mIG1lbW9yeS4gIE9uIGkzODY6IDMyTUIKKwkgKiBtYWNoaW5lIGhhcyAyNTYgYnVja2V0cy4gID49IDFHQiBtYWNoaW5lcyBoYXZlIDgxOTIgYnVja2V0cy4gKi8KKyAJaWYgKGhhc2hzaXplKSB7CisgCQlpcF9jb25udHJhY2tfaHRhYmxlX3NpemUgPSBoYXNoc2l6ZTsKKyAJfSBlbHNlIHsKKwkJaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplCisJCQk9ICgoKG51bV9waHlzcGFnZXMgPDwgUEFHRV9TSElGVCkgLyAxNjM4NCkKKwkJCSAgIC8gc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpKTsKKwkJaWYgKG51bV9waHlzcGFnZXMgPiAoMTAyNCAqIDEwMjQgKiAxMDI0IC8gUEFHRV9TSVpFKSkKKwkJCWlwX2Nvbm50cmFja19odGFibGVfc2l6ZSA9IDgxOTI7CisJCWlmIChpcF9jb25udHJhY2tfaHRhYmxlX3NpemUgPCAxNikKKwkJCWlwX2Nvbm50cmFja19odGFibGVfc2l6ZSA9IDE2OworCX0KKwlpcF9jb25udHJhY2tfbWF4ID0gOCAqIGlwX2Nvbm50cmFja19odGFibGVfc2l6ZTsKKworCXByaW50aygiaXBfY29ubnRyYWNrIHZlcnNpb24gJXMgKCV1IGJ1Y2tldHMsICVkIG1heCkiCisJICAgICAgICIgLSAlWmQgYnl0ZXMgcGVyIGNvbm50cmFja1xuIiwgSVBfQ09OTlRSQUNLX1ZFUlNJT04sCisJICAgICAgIGlwX2Nvbm50cmFja19odGFibGVfc2l6ZSwgaXBfY29ubnRyYWNrX21heCwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBpcF9jb25udHJhY2spKTsKKworCXJldCA9IG5mX3JlZ2lzdGVyX3NvY2tvcHQoJnNvX2dldG9yaWdkc3QpOworCWlmIChyZXQgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byByZWdpc3RlciBuZXRmaWx0ZXIgc29ja2V0IG9wdGlvblxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogQUs6IHRoZSBoYXNoIHRhYmxlIGlzIHR3aWNlIGFzIGJpZyB0aGFuIG5lZWRlZCBiZWNhdXNlIGl0CisJICAgdXNlcyBsaXN0X2hlYWQuICBpdCB3b3VsZCBiZSBtdWNoIG5pY2VyIHRvIGNhY2hlcyB0byB1c2UgYQorCSAgIHNpbmdsZSBwb2ludGVyIGxpc3QgaGVhZCBoZXJlLiAqLworCWlwX2Nvbm50cmFja192bWFsbG9jID0gMDsgCisJaXBfY29ubnRyYWNrX2hhc2ggCisJCT0odm9pZCopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCAKKwkJCQkJIGdldF9vcmRlcihzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkKKwkJCQkJCSAgICppcF9jb25udHJhY2tfaHRhYmxlX3NpemUpKTsKKwlpZiAoIWlwX2Nvbm50cmFja19oYXNoKSB7IAorCQlpcF9jb25udHJhY2tfdm1hbGxvYyA9IDE7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImlwX2Nvbm50cmFjazogZmFsbGluZyBiYWNrIHRvIHZtYWxsb2MuXG4iKTsKKwkJaXBfY29ubnRyYWNrX2hhc2ggPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKQorCQkJCQkgICAgKiBpcF9jb25udHJhY2tfaHRhYmxlX3NpemUpOworCX0KKwlpZiAoIWlwX2Nvbm50cmFja19oYXNoKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGNyZWF0ZSBpcF9jb25udHJhY2tfaGFzaFxuIik7CisJCWdvdG8gZXJyX3VucmVnX3NvY2tvcHQ7CisJfQorCisJaXBfY29ubnRyYWNrX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJpcF9jb25udHJhY2siLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGlwX2Nvbm50cmFjayksIDAsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIE5VTEwpOworCWlmICghaXBfY29ubnRyYWNrX2NhY2hlcCkgeworCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBjcmVhdGUgaXBfY29ubnRyYWNrIHNsYWIgY2FjaGVcbiIpOworCQlnb3RvIGVycl9mcmVlX2hhc2g7CisJfQorCisJaXBfY29ubnRyYWNrX2V4cGVjdF9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaXBfY29ubnRyYWNrX2V4cGVjdCIsCisJCQkJCXNpemVvZihzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCksCisJCQkJCTAsIDAsIE5VTEwsIE5VTEwpOworCWlmICghaXBfY29ubnRyYWNrX2V4cGVjdF9jYWNoZXApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gY3JlYXRlIGlwX2V4cGVjdCBzbGFiIGNhY2hlXG4iKTsKKwkJZ290byBlcnJfZnJlZV9jb25udHJhY2tfc2xhYjsKKwl9CisKKwkvKiBEb24ndCBORUVEIGxvY2sgaGVyZSwgYnV0IGdvb2QgZm9ybSBhbnl3YXkuICovCisJV1JJVEVfTE9DSygmaXBfY29ubnRyYWNrX2xvY2spOworCWZvciAoaSA9IDA7IGkgPCBNQVhfSVBfQ1RfUFJPVE87IGkrKykKKwkJaXBfY3RfcHJvdG9zW2ldID0gJmlwX2Nvbm50cmFja19nZW5lcmljX3Byb3RvY29sOworCS8qIFNldyBpbiBidWlsdGluIHByb3RvY29scy4gKi8KKwlpcF9jdF9wcm90b3NbSVBQUk9UT19UQ1BdID0gJmlwX2Nvbm50cmFja19wcm90b2NvbF90Y3A7CisJaXBfY3RfcHJvdG9zW0lQUFJPVE9fVURQXSA9ICZpcF9jb25udHJhY2tfcHJvdG9jb2xfdWRwOworCWlwX2N0X3Byb3Rvc1tJUFBST1RPX0lDTVBdID0gJmlwX2Nvbm50cmFja19wcm90b2NvbF9pY21wOworCVdSSVRFX1VOTE9DSygmaXBfY29ubnRyYWNrX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IGlwX2Nvbm50cmFja19odGFibGVfc2l6ZTsgaSsrKQorCQlJTklUX0xJU1RfSEVBRCgmaXBfY29ubnRyYWNrX2hhc2hbaV0pOworCisJLyogRm9yIHVzZSBieSBpcHRfUkVKRUNUICovCisJaXBfY3RfYXR0YWNoID0gaXBfY29ubnRyYWNrX2F0dGFjaDsKKworCS8qIFNldCB1cCBmYWtlIGNvbm50cmFjazoKKwkgICAgLSB0byBuZXZlciBiZSBkZWxldGVkLCBub3QgaW4gYW55IGhhc2hlcyAqLworCWF0b21pY19zZXQoJmlwX2Nvbm50cmFja191bnRyYWNrZWQuY3RfZ2VuZXJhbC51c2UsIDEpOworCS8qICAtIGFuZCBsb29rIGl0IGxpa2UgYXMgYSBjb25maXJtZWQgY29ubmVjdGlvbiAqLworCXNldF9iaXQoSVBTX0NPTkZJUk1FRF9CSVQsICZpcF9jb25udHJhY2tfdW50cmFja2VkLnN0YXR1cyk7CisKKwlyZXR1cm4gcmV0OworCitlcnJfZnJlZV9jb25udHJhY2tfc2xhYjoKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koaXBfY29ubnRyYWNrX2NhY2hlcCk7CitlcnJfZnJlZV9oYXNoOgorCWZyZWVfY29ubnRyYWNrX2hhc2goKTsKK2Vycl91bnJlZ19zb2Nrb3B0OgorCW5mX3VucmVnaXN0ZXJfc29ja29wdCgmc29fZ2V0b3JpZ2RzdCk7CisKKwlyZXR1cm4gLUVOT01FTTsKK30KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfZnRwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2Z0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYjg4Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2Z0cC5jCkBAIC0wLDAgKzEsNTAxIEBACisvKiBGVFAgZXh0ZW5zaW9uIGZvciBJUCBjb25uZWN0aW9uIHRyYWNraW5nLiAqLworCisvKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsICAKKyAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvbG9ja2hlbHAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2Z0cC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlJ1c3R5IFJ1c3NlbGwgPHJ1c3R5QHJ1c3Rjb3JwLmNvbS5hdT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiZnRwIGNvbm5lY3Rpb24gdHJhY2tpbmcgaGVscGVyIik7CisKKy8qIFRoaXMgaXMgc2xvdywgYnV0IGl0J3Mgc2ltcGxlLiAtLVJSICovCitzdGF0aWMgY2hhciBmdHBfYnVmZmVyWzY1NTM2XTsKKworc3RhdGljIERFQ0xBUkVfTE9DSyhpcF9mdHBfbG9jayk7CisKKyNkZWZpbmUgTUFYX1BPUlRTIDgKK3N0YXRpYyBpbnQgcG9ydHNbTUFYX1BPUlRTXTsKK3N0YXRpYyBpbnQgcG9ydHNfYzsKK21vZHVsZV9wYXJhbV9hcnJheShwb3J0cywgaW50LCAmcG9ydHNfYywgMDQwMCk7CisKK3N0YXRpYyBpbnQgbG9vc2U7Cittb2R1bGVfcGFyYW0obG9vc2UsIGludCwgMDYwMCk7CisKK3Vuc2lnbmVkIGludCAoKmlwX25hdF9mdHBfaG9vaykoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJCWVudW0gaXBfY3RfZnRwX3R5cGUgdHlwZSwKKwkJCQl1bnNpZ25lZCBpbnQgbWF0Y2hvZmYsCisJCQkJdW5zaWduZWQgaW50IG1hdGNobGVuLAorCQkJCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHAsCisJCQkJdTMyICpzZXEpOworRVhQT1JUX1NZTUJPTF9HUEwoaXBfbmF0X2Z0cF9ob29rKTsKKworI2lmIDAKKyNkZWZpbmUgREVCVUdQIHByaW50aworI2Vsc2UKKyNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCitzdGF0aWMgaW50IHRyeV9yZmM5NTkoY29uc3QgY2hhciAqLCBzaXplX3QsIHVfaW50MzJfdCBbXSwgY2hhcik7CitzdGF0aWMgaW50IHRyeV9lcHJ0KGNvbnN0IGNoYXIgKiwgc2l6ZV90LCB1X2ludDMyX3QgW10sIGNoYXIpOworc3RhdGljIGludCB0cnlfZXBzdl9yZXNwb25zZShjb25zdCBjaGFyICosIHNpemVfdCwgdV9pbnQzMl90IFtdLCBjaGFyKTsKKworc3RhdGljIHN0cnVjdCBmdHBfc2VhcmNoIHsKKwllbnVtIGlwX2Nvbm50cmFja19kaXIgZGlyOworCWNvbnN0IGNoYXIgKnBhdHRlcm47CisJc2l6ZV90IHBsZW47CisJY2hhciBza2lwOworCWNoYXIgdGVybTsKKwllbnVtIGlwX2N0X2Z0cF90eXBlIGZ0cHR5cGU7CisJaW50ICgqZ2V0bnVtKShjb25zdCBjaGFyICosIHNpemVfdCwgdV9pbnQzMl90W10sIGNoYXIpOworfSBzZWFyY2hbXSA9IHsKKwl7CisJCUlQX0NUX0RJUl9PUklHSU5BTCwKKwkJIlBPUlQiLAlzaXplb2YoIlBPUlQiKSAtIDEsICcgJywgJ1xyJywKKwkJSVBfQ1RfRlRQX1BPUlQsCisJCXRyeV9yZmM5NTksCisJfSwKKwl7CisJCUlQX0NUX0RJUl9SRVBMWSwKKwkJIjIyNyAiLAlzaXplb2YoIjIyNyAiKSAtIDEsICcoJywgJyknLAorCQlJUF9DVF9GVFBfUEFTViwKKwkJdHJ5X3JmYzk1OSwKKwl9LAorCXsKKwkJSVBfQ1RfRElSX09SSUdJTkFMLAorCQkiRVBSVCIsIHNpemVvZigiRVBSVCIpIC0gMSwgJyAnLCAnXHInLAorCQlJUF9DVF9GVFBfRVBSVCwKKwkJdHJ5X2VwcnQsCisJfSwKKwl7CisJCUlQX0NUX0RJUl9SRVBMWSwKKwkJIjIyOSAiLCBzaXplb2YoIjIyOSAiKSAtIDEsICcoJywgJyknLAorCQlJUF9DVF9GVFBfRVBTViwKKwkJdHJ5X2Vwc3ZfcmVzcG9uc2UsCisJfSwKK307CisKK3N0YXRpYyBpbnQgdHJ5X251bWJlcihjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgZGxlbiwgdV9pbnQzMl90IGFycmF5W10sCisJCSAgICAgIGludCBhcnJheV9zaXplLCBjaGFyIHNlcCwgY2hhciB0ZXJtKQoreworCXVfaW50MzJfdCBpLCBsZW47CisKKwltZW1zZXQoYXJyYXksIDAsIHNpemVvZihhcnJheVswXSkqYXJyYXlfc2l6ZSk7CisKKwkvKiBLZWVwIGRhdGEgcG9pbnRpbmcgYXQgbmV4dCBjaGFyLiAqLworCWZvciAoaSA9IDAsIGxlbiA9IDA7IGxlbiA8IGRsZW4gJiYgaSA8IGFycmF5X3NpemU7IGxlbisrLCBkYXRhKyspIHsKKwkJaWYgKCpkYXRhID49ICcwJyAmJiAqZGF0YSA8PSAnOScpIHsKKwkJCWFycmF5W2ldID0gYXJyYXlbaV0qMTAgKyAqZGF0YSAtICcwJzsKKwkJfQorCQllbHNlIGlmICgqZGF0YSA9PSBzZXApCisJCQlpKys7CisJCWVsc2UgeworCQkJLyogVW5leHBlY3RlZCBjaGFyYWN0ZXI7IHRydWUgaWYgaXQncyB0aGUKKwkJCSAgIHRlcm1pbmF0b3IgYW5kIHdlJ3JlIGZpbmlzaGVkLiAqLworCQkJaWYgKCpkYXRhID09IHRlcm0gJiYgaSA9PSBhcnJheV9zaXplIC0gMSkKKwkJCQlyZXR1cm4gbGVuOworCisJCQlERUJVR1AoIkNoYXIgJXUgKGdvdCAldSBudW1zKSBgJXUnIHVuZXhwZWN0ZWRcbiIsCisJCQkgICAgICAgbGVuLCBpLCAqZGF0YSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlERUJVR1AoIkZhaWxlZCB0byBmaWxsICV1IG51bWJlcnMgc2VwYXJhdGVkIGJ5ICVjXG4iLCBhcnJheV9zaXplLCBzZXApOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybnMgMCwgb3IgbGVuZ3RoIG9mIG51bWJlcnM6IDE5MiwxNjgsMSwxLDUsNiAqLworc3RhdGljIGludCB0cnlfcmZjOTU5KGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBkbGVuLCB1X2ludDMyX3QgYXJyYXlbNl0sCisJCSAgICAgICBjaGFyIHRlcm0pCit7CisJcmV0dXJuIHRyeV9udW1iZXIoZGF0YSwgZGxlbiwgYXJyYXksIDYsICcsJywgdGVybSk7Cit9CisKKy8qIEdyYWIgcG9ydDogbnVtYmVyIHVwIHRvIGRlbGltaXRlciAqLworc3RhdGljIGludCBnZXRfcG9ydChjb25zdCBjaGFyICpkYXRhLCBpbnQgc3RhcnQsIHNpemVfdCBkbGVuLCBjaGFyIGRlbGltLAorCQkgICAgdV9pbnQzMl90IGFycmF5WzJdKQoreworCXVfaW50MTZfdCBwb3J0ID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IHN0YXJ0OyBpIDwgZGxlbjsgaSsrKSB7CisJCS8qIEZpbmlzaGVkPyAqLworCQlpZiAoZGF0YVtpXSA9PSBkZWxpbSkgeworCQkJaWYgKHBvcnQgPT0gMCkKKwkJCQlicmVhazsKKwkJCWFycmF5WzBdID0gcG9ydCA+PiA4OworCQkJYXJyYXlbMV0gPSBwb3J0OworCQkJcmV0dXJuIGkgKyAxOworCQl9CisJCWVsc2UgaWYgKGRhdGFbaV0gPj0gJzAnICYmIGRhdGFbaV0gPD0gJzknKQorCQkJcG9ydCA9IHBvcnQqMTAgKyBkYXRhW2ldIC0gJzAnOworCQllbHNlIC8qIFNvbWUgb3RoZXIgY3JhcCAqLworCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisvKiBSZXR1cm5zIDAsIG9yIGxlbmd0aCBvZiBudW1iZXJzOiB8MXwxMzIuMjM1LjEuMnw2Mjc1fCAqLworc3RhdGljIGludCB0cnlfZXBydChjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgZGxlbiwgdV9pbnQzMl90IGFycmF5WzZdLAorCQkgICAgY2hhciB0ZXJtKQoreworCWNoYXIgZGVsaW07CisJaW50IGxlbmd0aDsKKworCS8qIEZpcnN0IGNoYXJhY3RlciBpcyBkZWxpbWl0ZXIsIHRoZW4gIjEiIGZvciBJUHY0LCB0aGVuCisgICAgICAgICAgIGRlbGltaXRlciBhZ2Fpbi4gKi8KKwlpZiAoZGxlbiA8PSAzKSByZXR1cm4gMDsKKwlkZWxpbSA9IGRhdGFbMF07CisJaWYgKGlzZGlnaXQoZGVsaW0pIHx8IGRlbGltIDwgMzMgfHwgZGVsaW0gPiAxMjYKKwkgICAgfHwgZGF0YVsxXSAhPSAnMScgfHwgZGF0YVsyXSAhPSBkZWxpbSkKKwkJcmV0dXJuIDA7CisKKwlERUJVR1AoIkVQUlQ6IEdvdCB8MXwhXG4iKTsKKwkvKiBOb3cgd2UgaGF2ZSBJUCBhZGRyZXNzLiAqLworCWxlbmd0aCA9IHRyeV9udW1iZXIoZGF0YSArIDMsIGRsZW4gLSAzLCBhcnJheSwgNCwgJy4nLCBkZWxpbSk7CisJaWYgKGxlbmd0aCA9PSAwKQorCQlyZXR1cm4gMDsKKworCURFQlVHUCgiRVBSVDogR290IElQIGFkZHJlc3MhXG4iKTsKKwkvKiBTdGFydCBvZmZzZXQgaW5jbHVkZXMgaW5pdGlhbCAifDF8IiwgYW5kIHRyYWlsaW5nIGRlbGltaXRlciAqLworCXJldHVybiBnZXRfcG9ydChkYXRhLCAzICsgbGVuZ3RoICsgMSwgZGxlbiwgZGVsaW0sIGFycmF5KzQpOworfQorCisvKiBSZXR1cm5zIDAsIG9yIGxlbmd0aCBvZiBudW1iZXJzOiB8fHw2NDQ2fCAqLworc3RhdGljIGludCB0cnlfZXBzdl9yZXNwb25zZShjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgZGxlbiwgdV9pbnQzMl90IGFycmF5WzZdLAorCQkJICAgICBjaGFyIHRlcm0pCit7CisJY2hhciBkZWxpbTsKKworCS8qIFRocmVlIGRlbGltaXRlcnMuICovCisJaWYgKGRsZW4gPD0gMykgcmV0dXJuIDA7CisJZGVsaW0gPSBkYXRhWzBdOworCWlmIChpc2RpZ2l0KGRlbGltKSB8fCBkZWxpbSA8IDMzIHx8IGRlbGltID4gMTI2CisJICAgIHx8IGRhdGFbMV0gIT0gZGVsaW0gfHwgZGF0YVsyXSAhPSBkZWxpbSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZ2V0X3BvcnQoZGF0YSwgMywgZGxlbiwgZGVsaW0sIGFycmF5KzQpOworfQorCisvKiBSZXR1cm4gMSBmb3IgbWF0Y2gsIDAgZm9yIGFjY2VwdCwgLTEgZm9yIHBhcnRpYWwuICovCitzdGF0aWMgaW50IGZpbmRfcGF0dGVybihjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgZGxlbiwKKwkJCWNvbnN0IGNoYXIgKnBhdHRlcm4sIHNpemVfdCBwbGVuLAorCQkJY2hhciBza2lwLCBjaGFyIHRlcm0sCisJCQl1bnNpZ25lZCBpbnQgKm51bW9mZiwKKwkJCXVuc2lnbmVkIGludCAqbnVtbGVuLAorCQkJdV9pbnQzMl90IGFycmF5WzZdLAorCQkJaW50ICgqZ2V0bnVtKShjb25zdCBjaGFyICosIHNpemVfdCwgdV9pbnQzMl90W10sIGNoYXIpKQoreworCXNpemVfdCBpOworCisJREVCVUdQKCJmaW5kX3BhdHRlcm4gYCVzJzogZGxlbiA9ICV1XG4iLCBwYXR0ZXJuLCBkbGVuKTsKKwlpZiAoZGxlbiA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChkbGVuIDw9IHBsZW4pIHsKKwkJLyogU2hvcnQgcGFja2V0OiB0cnkgZm9yIHBhcnRpYWw/ICovCisJCWlmIChzdHJuaWNtcChkYXRhLCBwYXR0ZXJuLCBkbGVuKSA9PSAwKQorCQkJcmV0dXJuIC0xOworCQllbHNlIHJldHVybiAwOworCX0KKworCWlmIChzdHJuaWNtcChkYXRhLCBwYXR0ZXJuLCBwbGVuKSAhPSAwKSB7CisjaWYgMAorCQlzaXplX3QgaTsKKworCQlERUJVR1AoImZ0cDogc3RyaW5nIG1pc21hdGNoXG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IHBsZW47IGkrKykgeworCQkJREVCVUdQKCJmdHA6Y2hhciAldSBgJWMnKCV1KSB2cyBgJWMnKCV1KVxuIiwKKwkJCQlpLCBkYXRhW2ldLCBkYXRhW2ldLAorCQkJCXBhdHRlcm5baV0sIHBhdHRlcm5baV0pOworCQl9CisjZW5kaWYKKwkJcmV0dXJuIDA7CisJfQorCisJREVCVUdQKCJQYXR0ZXJuIG1hdGNoZXMhXG4iKTsKKwkvKiBOb3cgd2UndmUgZm91bmQgdGhlIGNvbnN0YW50IHN0cmluZywgdHJ5IHRvIHNraXAKKwkgICB0byB0aGUgJ3NraXAnIGNoYXJhY3RlciAqLworCWZvciAoaSA9IHBsZW47IGRhdGFbaV0gIT0gc2tpcDsgaSsrKQorCQlpZiAoaSA9PSBkbGVuIC0gMSkgcmV0dXJuIC0xOworCisJLyogU2tpcCBvdmVyIHRoZSBsYXN0IGNoYXJhY3RlciAqLworCWkrKzsKKworCURFQlVHUCgiU2tpcHBlZCB1cCB0byBgJWMnIVxuIiwgc2tpcCk7CisKKwkqbnVtb2ZmID0gaTsKKwkqbnVtbGVuID0gZ2V0bnVtKGRhdGEgKyBpLCBkbGVuIC0gaSwgYXJyYXksIHRlcm0pOworCWlmICghKm51bWxlbikKKwkJcmV0dXJuIC0xOworCisJREVCVUdQKCJNYXRjaCBzdWNjZWVkZWQhXG4iKTsKKwlyZXR1cm4gMTsKK30KKworLyogTG9vayB1cCB0byBzZWUgaWYgd2UncmUganVzdCBhZnRlciBhIFxuLiAqLworc3RhdGljIGludCBmaW5kX25sX3NlcSh1MTYgc2VxLCBjb25zdCBzdHJ1Y3QgaXBfY3RfZnRwX21hc3RlciAqaW5mbywgaW50IGRpcikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5zZXFfYWZ0X25sX251bVtkaXJdOyBpKyspCisJCWlmIChpbmZvLT5zZXFfYWZ0X25sW2Rpcl1baV0gPT0gc2VxKQorCQkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qIFdlIGRvbid0IHVwZGF0ZSBpZiBpdCdzIG9sZGVyIHRoYW4gd2hhdCB3ZSBoYXZlLiAqLworc3RhdGljIHZvaWQgdXBkYXRlX25sX3NlcSh1MTYgbmxfc2VxLCBzdHJ1Y3QgaXBfY3RfZnRwX21hc3RlciAqaW5mbywgaW50IGRpcikKK3sKKwl1bnNpZ25lZCBpbnQgaSwgb2xkZXN0ID0gTlVNX1NFUV9UT19SRU1FTUJFUjsKKworCS8qIExvb2sgZm9yIG9sZGVzdDogaWYgd2UgZmluZCBleGFjdCBtYXRjaCwgd2UncmUgZG9uZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VxX2FmdF9ubF9udW1bZGlyXTsgaSsrKSB7CisJCWlmIChpbmZvLT5zZXFfYWZ0X25sW2Rpcl1baV0gPT0gbmxfc2VxKQorCQkJcmV0dXJuOworCisJCWlmIChvbGRlc3QgPT0gaW5mby0+c2VxX2FmdF9ubF9udW1bZGlyXQorCQkgICAgfHwgYmVmb3JlKGluZm8tPnNlcV9hZnRfbmxbZGlyXVtpXSwgb2xkZXN0KSkKKwkJCW9sZGVzdCA9IGk7CisJfQorCisJaWYgKGluZm8tPnNlcV9hZnRfbmxfbnVtW2Rpcl0gPCBOVU1fU0VRX1RPX1JFTUVNQkVSKQorCQlpbmZvLT5zZXFfYWZ0X25sW2Rpcl1baW5mby0+c2VxX2FmdF9ubF9udW1bZGlyXSsrXSA9IG5sX3NlcTsKKwllbHNlIGlmIChvbGRlc3QgIT0gTlVNX1NFUV9UT19SRU1FTUJFUikKKwkJaW5mby0+c2VxX2FmdF9ubFtkaXJdW29sZGVzdF0gPSBubF9zZXE7Cit9CisKK3N0YXRpYyBpbnQgaGVscChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAorCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YW9mZiwgZGF0YWxlbjsKKwlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGg7CisJY2hhciAqZmJfcHRyOworCWludCByZXQ7CisJdTMyIHNlcSwgYXJyYXlbNl0gPSB7IDAgfTsKKwlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOworCXVuc2lnbmVkIGludCBtYXRjaGxlbiwgbWF0Y2hvZmY7CisJc3RydWN0IGlwX2N0X2Z0cF9tYXN0ZXIgKmN0X2Z0cF9pbmZvID0gJmN0LT5oZWxwLmN0X2Z0cF9pbmZvOworCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHA7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGZvdW5kID0gMCwgZW5kc19pbl9ubDsKKworCS8qIFVudGlsIHRoZXJlJ3MgYmVlbiB0cmFmZmljIGJvdGggd2F5cywgZG9uJ3QgbG9vayBpbiBwYWNrZXRzLiAqLworCWlmIChjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQKKwkgICAgJiYgY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEK0lQX0NUX0lTX1JFUExZKSB7CisJCURFQlVHUCgiZnRwOiBDb25udHJhY2tpbmZvID0gJXVcbiIsIGN0aW5mbyk7CisJCXJldHVybiBORl9BQ0NFUFQ7CisJfQorCisJdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsICgqcHNrYiktPm5oLmlwaC0+aWhsKjQsCisJCQkJc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKKwlpZiAodGggPT0gTlVMTCkKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKworCWRhdGFvZmYgPSAoKnBza2IpLT5uaC5pcGgtPmlobCo0ICsgdGgtPmRvZmYqNDsKKwkvKiBObyBkYXRhPyAqLworCWlmIChkYXRhb2ZmID49ICgqcHNrYiktPmxlbikgeworCQlERUJVR1AoImZ0cDogcHNrYmxlbiA9ICV1XG4iLCAoKnBza2IpLT5sZW4pOworCQlyZXR1cm4gTkZfQUNDRVBUOworCX0KKwlkYXRhbGVuID0gKCpwc2tiKS0+bGVuIC0gZGF0YW9mZjsKKworCUxPQ0tfQkgoJmlwX2Z0cF9sb2NrKTsKKwlmYl9wdHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsIGRhdGFvZmYsCisJCQkJICAgICgqcHNrYiktPmxlbiAtIGRhdGFvZmYsIGZ0cF9idWZmZXIpOworCUJVR19PTihmYl9wdHIgPT0gTlVMTCk7CisKKwllbmRzX2luX25sID0gKGZiX3B0cltkYXRhbGVuIC0gMV0gPT0gJ1xuJyk7CisJc2VxID0gbnRvaGwodGgtPnNlcSkgKyBkYXRhbGVuOworCisJLyogTG9vayB1cCB0byBzZWUgaWYgd2UncmUganVzdCBhZnRlciBhIFxuLiAqLworCWlmICghZmluZF9ubF9zZXEobnRvaGwodGgtPnNlcSksIGN0X2Z0cF9pbmZvLCBkaXIpKSB7CisJCS8qIE5vdyBpZiB0aGlzIGVuZHMgaW4gXG4sIHVwZGF0ZSBmdHAgaW5mby4gKi8KKwkJREVCVUdQKCJpcF9jb25udHJhY2tfZnRwX2hlbHA6IHdyb25nIHNlcSBwb3MgJXMoJXUpIG9yICVzKCV1KVxuIiwKKwkJICAgICAgIGN0X2Z0cF9pbmZvLT5zZXFfYWZ0X25sWzBdW2Rpcl0gCisJCSAgICAgICBvbGRfc2VxX2FmdF9ubF9zZXQgPyAiIjoiKFVOU0VUKSAiLCBvbGRfc2VxX2FmdF9ubCk7CisJCXJldCA9IE5GX0FDQ0VQVDsKKwkJZ290byBvdXRfdXBkYXRlX25sOworCX0KKworCS8qIEluaXRpYWxpemUgSVAgYXJyYXkgdG8gZXhwZWN0ZWQgYWRkcmVzcyAoaXQncyBub3QgbWVudGlvbmVkCisgICAgICAgICAgIGluIEVQU1YgcmVzcG9uc2VzKSAqLworCWFycmF5WzBdID0gKG50b2hsKGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMuaXApID4+IDI0KSAmIDB4RkY7CisJYXJyYXlbMV0gPSAobnRvaGwoY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy5pcCkgPj4gMTYpICYgMHhGRjsKKwlhcnJheVsyXSA9IChudG9obChjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwKSA+PiA4KSAmIDB4RkY7CisJYXJyYXlbM10gPSBudG9obChjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwKSAmIDB4RkY7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzZWFyY2gpOyBpKyspIHsKKwkJaWYgKHNlYXJjaFtpXS5kaXIgIT0gZGlyKSBjb250aW51ZTsKKworCQlmb3VuZCA9IGZpbmRfcGF0dGVybihmYl9wdHIsICgqcHNrYiktPmxlbiAtIGRhdGFvZmYsCisJCQkJICAgICBzZWFyY2hbaV0ucGF0dGVybiwKKwkJCQkgICAgIHNlYXJjaFtpXS5wbGVuLAorCQkJCSAgICAgc2VhcmNoW2ldLnNraXAsCisJCQkJICAgICBzZWFyY2hbaV0udGVybSwKKwkJCQkgICAgICZtYXRjaG9mZiwgJm1hdGNobGVuLAorCQkJCSAgICAgYXJyYXksCisJCQkJICAgICBzZWFyY2hbaV0uZ2V0bnVtKTsKKwkJaWYgKGZvdW5kKSBicmVhazsKKwl9CisJaWYgKGZvdW5kID09IC0xKSB7CisJCS8qIFdlIGRvbid0IHVzdWFsbHkgZHJvcCBwYWNrZXRzLiAgQWZ0ZXIgYWxsLCB0aGlzIGlzCisJCSAgIGNvbm5lY3Rpb24gdHJhY2tpbmcsIG5vdCBwYWNrZXQgZmlsdGVyaW5nLgorCQkgICBIb3dldmVyLCBpdCBpcyBuZWNlc3NhcnkgZm9yIGFjY3VyYXRlIHRyYWNraW5nIGluCisJCSAgIHRoaXMgY2FzZS4gKi8KKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50aygiY29ubnRyYWNrX2Z0cDogcGFydGlhbCAlcyAldSsldVxuIiwKKwkJCSAgICAgICBzZWFyY2hbaV0ucGF0dGVybiwKKwkJCSAgICAgICBudG9obCh0aC0+c2VxKSwgZGF0YWxlbik7CisJCXJldCA9IE5GX0RST1A7CisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAoZm91bmQgPT0gMCkgeyAvKiBObyBtYXRjaCAqLworCQlyZXQgPSBORl9BQ0NFUFQ7CisJCWdvdG8gb3V0X3VwZGF0ZV9ubDsKKwl9CisKKwlERUJVR1AoImNvbm50cmFja19mdHA6IG1hdGNoIGAlcycgKCV1IGJ5dGVzIGF0ICV1KVxuIiwKKwkgICAgICAgZmJfcHRyICsgbWF0Y2hvZmYsIG1hdGNobGVuLCBudG9obCh0aC0+c2VxKSArIG1hdGNob2ZmKTsKKwkJCSAKKwkvKiBBbGxvY2F0ZSBleHBlY3RhdGlvbiB3aGljaCB3aWxsIGJlIGluc2VydGVkICovCisJZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYygpOworCWlmIChleHAgPT0gTlVMTCkgeworCQlyZXQgPSBORl9EUk9QOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBXZSByZWZlciB0byB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24gKCIhZGlyIikgdHVwbGVzIGhlcmUsCisJICogYmVjYXVzZSB3ZSdyZSBleHBlY3Rpbmcgc29tZXRoaW5nIGluIHRoZSBvdGhlciBkaXJlY3Rpb24uCisJICogRG9lc24ndCBtYXR0ZXIgdW5sZXNzIE5BVCBpcyBoYXBwZW5pbmcuICAqLworCWV4cC0+dHVwbGUuZHN0LmlwID0gY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXA7CisKKwlpZiAoaHRvbmwoKGFycmF5WzBdIDw8IDI0KSB8IChhcnJheVsxXSA8PCAxNikgfCAoYXJyYXlbMl0gPDwgOCkgfCBhcnJheVszXSkKKwkgICAgIT0gY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy5pcCkgeworCQkvKiBFbnJpY28gU2Nob2x6J3MgcGFzc2l2ZSBGVFAgdG8gcGFydGlhbGx5IFJOQVQnZCBmdHAKKwkJICAgc2VydmVyOiBpdCByZWFsbHkgd2FudHMgdXMgdG8gY29ubmVjdCB0byBhCisJCSAgIGRpZmZlcmVudCBJUCBhZGRyZXNzLiAgU2ltcGx5IGRvbid0IHJlY29yZCBpdCBmb3IKKwkJICAgTkFULiAqLworCQlERUJVR1AoImNvbm50cmFja19mdHA6IE5PVCBSRUNPUkRJTkc6ICV1LCV1LCV1LCV1ICE9ICV1LiV1LiV1LiV1XG4iLAorCQkgICAgICAgYXJyYXlbMF0sIGFycmF5WzFdLCBhcnJheVsyXSwgYXJyYXlbM10sCisJCSAgICAgICBOSVBRVUFEKGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMuaXApKTsKKworCQkvKiBUaGFua3MgdG8gQ3Jpc3RpYW5vIExpbmNvbG4gTWF0dG9zCisJCSAgIDxsaW5jb2xuQGNlc2FyLm9yZy5icj4gZm9yIHJlcG9ydGluZyB0aGlzIHBvdGVudGlhbAorCQkgICBwcm9ibGVtIChETVogbWFjaGluZXMgb3BlbmluZyBob2xlcyB0byBpbnRlcm5hbAorCQkgICBuZXR3b3Jrcywgb3IgdGhlIHBhY2tldCBmaWx0ZXIgaXRzZWxmKS4gKi8KKwkJaWYgKCFsb29zZSkgeworCQkJcmV0ID0gTkZfQUNDRVBUOworCQkJaXBfY29ubnRyYWNrX2V4cGVjdF9mcmVlKGV4cCk7CisJCQlnb3RvIG91dF91cGRhdGVfbmw7CisJCX0KKwkJZXhwLT50dXBsZS5kc3QuaXAgPSBodG9ubCgoYXJyYXlbMF0gPDwgMjQpIHwgKGFycmF5WzFdIDw8IDE2KQorCQkJCQkgfCAoYXJyYXlbMl0gPDwgOCkgfCBhcnJheVszXSk7CisJfQorCisJZXhwLT50dXBsZS5zcmMuaXAgPSBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy5pcDsKKwlleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0ID0gaHRvbnMoYXJyYXlbNF0gPDwgOCB8IGFycmF5WzVdKTsKKwlleHAtPnR1cGxlLnNyYy51LnRjcC5wb3J0ID0gMDsgLyogRG9uJ3QgY2FyZS4gKi8KKwlleHAtPnR1cGxlLmRzdC5wcm90b251bSA9IElQUFJPVE9fVENQOworCWV4cC0+bWFzayA9ICgoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSkKKwkJeyB7IDB4RkZGRkZGRkYsIHsgMCB9IH0sCisJCSAgeyAweEZGRkZGRkZGLCB7IC50Y3AgPSB7IDB4RkZGRiB9IH0sIDB4RkYgfX0pOworCisJZXhwLT5leHBlY3RmbiA9IE5VTEw7CisJZXhwLT5tYXN0ZXIgPSBjdDsKKworCS8qIE5vdywgTkFUIG1pZ2h0IHdhbnQgdG8gbWFuZ2xlIHRoZSBwYWNrZXQsIGFuZCByZWdpc3RlciB0aGUKKwkgKiAocG9zc2libHkgY2hhbmdlZCkgZXhwZWN0YXRpb24gaXRzZWxmLiAqLworCWlmIChpcF9uYXRfZnRwX2hvb2spCisJCXJldCA9IGlwX25hdF9mdHBfaG9vayhwc2tiLCBjdGluZm8sIHNlYXJjaFtpXS5mdHB0eXBlLAorCQkJCSAgICAgIG1hdGNob2ZmLCBtYXRjaGxlbiwgZXhwLCAmc2VxKTsKKwllbHNlIHsKKwkJLyogQ2FuJ3QgZXhwZWN0IHRoaXM/ICBCZXN0IHRvIGRyb3AgcGFja2V0IG5vdy4gKi8KKwkJaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApICE9IDApIHsKKwkJCWlwX2Nvbm50cmFja19leHBlY3RfZnJlZShleHApOworCQkJcmV0ID0gTkZfRFJPUDsKKwkJfSBlbHNlCisJCQlyZXQgPSBORl9BQ0NFUFQ7CisJfQorCitvdXRfdXBkYXRlX25sOgorCS8qIE5vdyBpZiB0aGlzIGVuZHMgaW4gXG4sIHVwZGF0ZSBmdHAgaW5mby4gIFNlcSBtYXkgaGF2ZSBiZWVuCisJICogYWRqdXN0ZWQgYnkgTkFUIGNvZGUuICovCisJaWYgKGVuZHNfaW5fbmwpCisJCXVwZGF0ZV9ubF9zZXEoc2VxLCBjdF9mdHBfaW5mbyxkaXIpOworIG91dDoKKwlVTkxPQ0tfQkgoJmlwX2Z0cF9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgZnRwW01BWF9QT1JUU107CitzdGF0aWMgY2hhciBmdHBfbmFtZXNbTUFYX1BPUlRTXVsxMF07CisKKy8qIE5vdCBfX2V4aXQ6IGNhbGxlZCBmcm9tIGluaXQoKSAqLworc3RhdGljIHZvaWQgZmluaSh2b2lkKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBwb3J0c19jOyBpKyspIHsKKwkJREVCVUdQKCJpcF9jdF9mdHA6IHVucmVnaXN0ZXJpbmcgaGVscGVyIGZvciBwb3J0ICVkXG4iLAorCQkJCXBvcnRzW2ldKTsKKwkJaXBfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZmdHBbaV0pOworCX0KK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWludCBpLCByZXQ7CisJY2hhciAqdG1wbmFtZTsKKworCWlmIChwb3J0c19jID09IDApCisJCXBvcnRzW3BvcnRzX2MrK10gPSBGVFBfUE9SVDsKKworCWZvciAoaSA9IDA7IGkgPCBwb3J0c19jOyBpKyspIHsKKwkJZnRwW2ldLnR1cGxlLnNyYy51LnRjcC5wb3J0ID0gaHRvbnMocG9ydHNbaV0pOworCQlmdHBbaV0udHVwbGUuZHN0LnByb3RvbnVtID0gSVBQUk9UT19UQ1A7CisJCWZ0cFtpXS5tYXNrLnNyYy51LnRjcC5wb3J0ID0gMHhGRkZGOworCQlmdHBbaV0ubWFzay5kc3QucHJvdG9udW0gPSAweEZGOworCQlmdHBbaV0ubWF4X2V4cGVjdGVkID0gMTsKKwkJZnRwW2ldLnRpbWVvdXQgPSA1ICogNjA7IC8qIDUgbWludXRlcyAqLworCQlmdHBbaV0ubWUgPSBUSElTX01PRFVMRTsKKwkJZnRwW2ldLmhlbHAgPSBoZWxwOworCisJCXRtcG5hbWUgPSAmZnRwX25hbWVzW2ldWzBdOworCQlpZiAocG9ydHNbaV0gPT0gRlRQX1BPUlQpCisJCQlzcHJpbnRmKHRtcG5hbWUsICJmdHAiKTsKKwkJZWxzZQorCQkJc3ByaW50Zih0bXBuYW1lLCAiZnRwLSVkIiwgcG9ydHNbaV0pOworCQlmdHBbaV0ubmFtZSA9IHRtcG5hbWU7CisKKwkJREVCVUdQKCJpcF9jdF9mdHA6IHJlZ2lzdGVyaW5nIGhlbHBlciBmb3IgcG9ydCAlZFxuIiwgCisJCQkJcG9ydHNbaV0pOworCQlyZXQgPSBpcF9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKCZmdHBbaV0pOworCisJCWlmIChyZXQpIHsKKwkJCWZpbmkoKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2lyYy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19pcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2NjNzM0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19pcmMuYwpAQCAtMCwwICsxLDMxMyBAQAorLyogSVJDIGV4dGVuc2lvbiBmb3IgSVAgY29ubmVjdGlvbiB0cmFja2luZywgVmVyc2lvbiAxLjIxCisgKiAoQykgMjAwMC0yMDAyIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBiYXNlZCBvbiBSUidzIGlwX2Nvbm50cmFja19mdHAuYwkKKyAqCisgKiBpcF9jb25udHJhY2tfaXJjLmMsdiAxLjIxIDIwMDIvMDIvMDUgMTQ6NDk6MjYgbGFmb3JnZSBFeHAKKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKioKKyAqCU1vZHVsZSBsb2FkIHN5bnRheDoKKyAqIAlpbnNtb2QgaXBfY29ubnRyYWNrX2lyYy5vIHBvcnRzPXBvcnQxLHBvcnQyLC4uLnBvcnQ8TUFYX1BPUlRTPgorICoJCQkgICAgbWF4X2RjY19jaGFubmVscz1uIGRjY190aW1lb3V0PXNlY3MKKyAqCQorICogCXBsZWFzZSBnaXZlIHRoZSBwb3J0cyBvZiBhbGwgSVJDIHNlcnZlcnMgWW91IHdpc2ggdG8gY29ubmVjdCB0by4KKyAqCUlmIFlvdSBkb24ndCBzcGVjaWZ5IHBvcnRzLCB0aGUgZGVmYXVsdCB3aWxsIGJlIHBvcnQgNjY2Ny4KKyAqCVdpdGggbWF4X2RjY19jaGFubmVscyB5b3UgY2FuIGRlZmluZSB0aGUgbWF4aW11bSBudW1iZXIgb2Ygbm90CisgKgl5ZXQgYW5zd2VyZWQgRENDIGNoYW5uZWxzIHBlciBJUkMgc2Vzc2lvbiAoZGVmYXVsdCA4KS4KKyAqCVdpdGggZGNjX3RpbWVvdXQgeW91IGNhbiBzcGVjaWZ5IGhvdyBsb25nIHRoZSBzeXN0ZW0gd2FpdHMgZm9yIAorICoJYW4gZXhwZWN0ZWQgRENDIGNoYW5uZWwgKGRlZmF1bHQgMzAwIHNlY29uZHMpLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9sb2NraGVscC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaXJjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKworI2RlZmluZSBNQVhfUE9SVFMgOAorc3RhdGljIGludCBwb3J0c1tNQVhfUE9SVFNdOworc3RhdGljIGludCBwb3J0c19jOworc3RhdGljIGludCBtYXhfZGNjX2NoYW5uZWxzID0gODsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGNjX3RpbWVvdXQgPSAzMDA7CisvKiBUaGlzIGlzIHNsb3csIGJ1dCBpdCdzIHNpbXBsZS4gLS1SUiAqLworc3RhdGljIGNoYXIgaXJjX2J1ZmZlcls2NTUzNl07CitzdGF0aWMgREVDTEFSRV9MT0NLKGlyY19idWZmZXJfbG9jayk7CisKK3Vuc2lnbmVkIGludCAoKmlwX25hdF9pcmNfaG9vaykoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJCXVuc2lnbmVkIGludCBtYXRjaG9mZiwKKwkJCQl1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sCisJCQkJc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCk7CitFWFBPUlRfU1lNQk9MX0dQTChpcF9uYXRfaXJjX2hvb2spOworCitNT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVJDIChEQ0MpIGNvbm5lY3Rpb24gdHJhY2tpbmcgaGVscGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfcGFyYW1fYXJyYXkocG9ydHMsIGludCwgJnBvcnRzX2MsIDA0MDApOworTU9EVUxFX1BBUk1fREVTQyhwb3J0cywgInBvcnQgbnVtYmVycyBvZiBJUkMgc2VydmVycyIpOworbW9kdWxlX3BhcmFtKG1heF9kY2NfY2hhbm5lbHMsIGludCwgMDQwMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9kY2NfY2hhbm5lbHMsICJtYXggbnVtYmVyIG9mIGV4cGVjdGVkIERDQyBjaGFubmVscyBwZXIgSVJDIHNlc3Npb24iKTsKK21vZHVsZV9wYXJhbShkY2NfdGltZW91dCwgaW50LCAwNDAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGNjX3RpbWVvdXQsICJ0aW1lb3V0IG9uIGZvciB1bmVzdGFibGlzaGVkIERDQyBjaGFubmVscyIpOworCitzdGF0aWMgY2hhciAqZGNjcHJvdG9zW10gPSB7ICJTRU5EICIsICJDSEFUICIsICJNT1ZFICIsICJUU0VORCAiLCAiU0NIQVQgIiB9OworI2RlZmluZSBNSU5NQVRDSExFTgk1CisKKyNpZiAwCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHICIlczolczoiIGZvcm1hdCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GSUxFX18sIF9fRlVOQ1RJT05fXyAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcGFyc2VfZGNjKGNoYXIgKmRhdGEsIGNoYXIgKmRhdGFfZW5kLCB1X2ludDMyX3QgKmlwLAorCQkgICAgIHVfaW50MTZfdCAqcG9ydCwgY2hhciAqKmFkX2JlZ19wLCBjaGFyICoqYWRfZW5kX3ApCisvKiB0cmllcyB0byBnZXQgdGhlIGlwX2FkZHIgYW5kIHBvcnQgb3V0IG9mIGEgZGNjIGNvbW1hbmQKKyAgIHJldHVybiB2YWx1ZTogLTEgb24gZmFpbHVyZSwgMCBvbiBzdWNjZXNzIAorCWRhdGEJCXBvaW50ZXIgdG8gZmlyc3QgYnl0ZSBvZiBEQ0MgY29tbWFuZCBkYXRhCisJZGF0YV9lbmQJcG9pbnRlciB0byBsYXN0IGJ5dGUgb2YgZGNjIGNvbW1hbmQgZGF0YQorCWlwCQlyZXR1cm5zIHBhcnNlZCBpcCBvZiBkY2MgY29tbWFuZAorCXBvcnQJCXJldHVybnMgcGFyc2VkIHBvcnQgb2YgZGNjIGNvbW1hbmQKKwlhZF9iZWdfcAlyZXR1cm5zIHBvaW50ZXIgdG8gZmlyc3QgYnl0ZSBvZiBhZGRyIGRhdGEKKwlhZF9lbmRfcAlyZXR1cm5zIHBvaW50ZXIgdG8gbGFzdCBieXRlIG9mIGFkZHIgZGF0YSAqLworeworCisJLyogYXQgbGVhc3QgMTI6ICJBQUFBQUFBQSBQXDFcbiIgKi8KKwl3aGlsZSAoKmRhdGErKyAhPSAnICcpCisJCWlmIChkYXRhID4gZGF0YV9lbmQgLSAxMikKKwkJCXJldHVybiAtMTsKKworCSphZF9iZWdfcCA9IGRhdGE7CisJKmlwID0gc2ltcGxlX3N0cnRvdWwoZGF0YSwgJmRhdGEsIDEwKTsKKworCS8qIHNraXAgYmxhbmtzIGJldHdlZW4gaXAgYW5kIHBvcnQgKi8KKwl3aGlsZSAoKmRhdGEgPT0gJyAnKSB7CisJCWlmIChkYXRhID49IGRhdGFfZW5kKSAKKwkJCXJldHVybiAtMTsKKwkJZGF0YSsrOworCX0KKworCSpwb3J0ID0gc2ltcGxlX3N0cnRvdWwoZGF0YSwgJmRhdGEsIDEwKTsKKwkqYWRfZW5kX3AgPSBkYXRhOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGVscChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0LCBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YW9mZjsKKwlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGg7CisJY2hhciAqZGF0YSwgKmRhdGFfbGltaXQsICppYl9wdHI7CisJaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwOworCXUzMiBzZXE7CisJdV9pbnQzMl90IGRjY19pcDsKKwl1X2ludDE2X3QgZGNjX3BvcnQ7CisJaW50IGksIHJldCA9IE5GX0FDQ0VQVDsKKwljaGFyICphZGRyX2JlZ19wLCAqYWRkcl9lbmRfcDsKKworCURFQlVHUCgiZW50ZXJlZFxuIik7CisKKwkvKiBJZiBwYWNrZXQgaXMgY29taW5nIGZyb20gSVJDIHNlcnZlciAqLworCWlmIChkaXIgPT0gSVBfQ1RfRElSX1JFUExZKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJLyogVW50aWwgdGhlcmUncyBiZWVuIHRyYWZmaWMgYm90aCB3YXlzLCBkb24ndCBsb29rIGluIHBhY2tldHMuICovCisJaWYgKGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRAorCSAgICAmJiBjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQgKyBJUF9DVF9JU19SRVBMWSkgeworCQlERUJVR1AoIkNvbm50cmFja2luZm8gPSAldVxuIiwgY3RpbmZvKTsKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKwl9CisKKwkvKiBOb3QgYSBmdWxsIHRjcCBoZWFkZXI/ICovCisJdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsICgqcHNrYiktPm5oLmlwaC0+aWhsKjQsCisJCQkJc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKKwlpZiAodGggPT0gTlVMTCkKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKworCS8qIE5vIGRhdGE/ICovCisJZGF0YW9mZiA9ICgqcHNrYiktPm5oLmlwaC0+aWhsKjQgKyB0aC0+ZG9mZio0OworCWlmIChkYXRhb2ZmID49ICgqcHNrYiktPmxlbikKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKworCUxPQ0tfQkgoJmlyY19idWZmZXJfbG9jayk7CisJaWJfcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLCBkYXRhb2ZmLAorCQkJCSAgICAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmLCBpcmNfYnVmZmVyKTsKKwlCVUdfT04oaWJfcHRyID09IE5VTEwpOworCisJZGF0YSA9IGliX3B0cjsKKwlkYXRhX2xpbWl0ID0gaWJfcHRyICsgKCpwc2tiKS0+bGVuIC0gZGF0YW9mZjsKKworCS8qIHN0cmxlbigiXDFEQ0MgU0VOVCB0IEFBQUFBQUFBIFBcMVxuIik9MjQKKwkgKiA1K01JTk1BVENITEVOK3N0cmxlbigidCBBQUFBQUFBQSBQXDFcbiIpPTE0ICovCisJd2hpbGUgKGRhdGEgPCAoZGF0YV9saW1pdCAtICgxOSArIE1JTk1BVENITEVOKSkpIHsKKwkJaWYgKG1lbWNtcChkYXRhLCAiXDFEQ0MgIiwgNSkpIHsKKwkJCWRhdGErKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZGF0YSArPSA1OworCQkvKiB3ZSBoYXZlIGF0IGxlYXN0ICgxOStNSU5NQVRDSExFTiktNSBieXRlcyB2YWxpZCBkYXRhIGxlZnQgKi8KKworCQlERUJVR1AoIkRDQyBmb3VuZCBpbiBtYXN0ZXIgJXUuJXUuJXUuJXU6JXUgJXUuJXUuJXUuJXU6JXUuLi5cbiIsCisJCQlOSVBRVUFEKGlwaC0+c2FkZHIpLCBudG9ocyh0aC0+c291cmNlKSwKKwkJCU5JUFFVQUQoaXBoLT5kYWRkciksIG50b2hzKHRoLT5kZXN0KSk7CisKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGNjcHJvdG9zKTsgaSsrKSB7CisJCQlpZiAobWVtY21wKGRhdGEsIGRjY3Byb3Rvc1tpXSwgc3RybGVuKGRjY3Byb3Rvc1tpXSkpKSB7CisJCQkJLyogbm8gbWF0Y2ggKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJREVCVUdQKCJEQ0MgJXMgZGV0ZWN0ZWRcbiIsIGRjY3Byb3Rvc1tpXSk7CisJCQlkYXRhICs9IHN0cmxlbihkY2Nwcm90b3NbaV0pOworCQkJLyogd2UgaGF2ZSBhdCBsZWFzdCAKKwkJCSAqICgxOStNSU5NQVRDSExFTiktNS1kY2Nwcm90b3NbaV0ubWF0Y2hsZW4gYnl0ZXMgdmFsaWQKKwkJCSAqIGRhdGEgbGVmdCAoPT0gMTQvMTMgYnl0ZXMpICovCisJCQlpZiAocGFyc2VfZGNjKChjaGFyICopZGF0YSwgZGF0YV9saW1pdCwgJmRjY19pcCwKKwkJCQkgICAgICAgJmRjY19wb3J0LCAmYWRkcl9iZWdfcCwgJmFkZHJfZW5kX3ApKSB7CisJCQkJLyogdW5hYmxlIHRvIHBhcnNlICovCisJCQkJREVCVUdQKCJ1bmFibGUgdG8gcGFyc2UgZGNjIGNvbW1hbmRcbiIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJREVCVUdQKCJEQ0MgYm91bmQgaXAvcG9ydDogJXUuJXUuJXUuJXU6JXVcbiIsCisJCQkJSElQUVVBRChkY2NfaXApLCBkY2NfcG9ydCk7CisKKwkJCS8qIGRjY19pcCBjYW4gYmUgdGhlIGludGVybmFsIE9SIGV4dGVybmFsIChOQVQnZWQpIElQCisJCQkgKiBUaWFnbyBTb3VzYSA8bWlyYWdlQGthb3Rpay5vcmc+ICovCisJCQlpZiAoY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy5pcCAhPSBodG9ubChkY2NfaXApCisJCQkgICAgJiYgY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC5pcCAhPSBodG9ubChkY2NfaXApKSB7CisJCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkJIkZvcmdlZCBEQ0MgY29tbWFuZCBmcm9tICIKKwkJCQkJCSIldS4ldS4ldS4ldTogJXUuJXUuJXUuJXU6JXVcbiIsCisJCQkJTklQUVVBRChjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwKSwKKwkJCQkJCUhJUFFVQUQoZGNjX2lwKSwgZGNjX3BvcnQpOworCisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWV4cCA9IGlwX2Nvbm50cmFja19leHBlY3RfYWxsb2MoKTsKKwkJCWlmIChleHAgPT0gTlVMTCkgeworCQkJCXJldCA9IE5GX0RST1A7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCS8qIHNhdmUgcG9zaXRpb24gb2YgYWRkcmVzcyBpbiBkY2Mgc3RyaW5nLAorCQkJICogbmVjZXNzYXJ5IGZvciBOQVQgKi8KKwkJCURFQlVHUCgidGNwaC0+c2VxID0gJXVcbiIsIHRoLT5zZXEpOworCQkJc2VxID0gbnRvaGwodGgtPnNlcSkgKyAoYWRkcl9iZWdfcCAtIGliX3B0cik7CisKKwkJCS8qIFdlIHJlZmVyIHRvIHRoZSByZXZlcnNlIGRpcmVjdGlvbiAoIiFkaXIiKQorCQkJICogdHVwbGVzIGhlcmUsIGJlY2F1c2Ugd2UncmUgZXhwZWN0aW5nCisJCQkgKiBzb21ldGhpbmcgaW4gdGhlIG90aGVyICogZGlyZWN0aW9uLgorCQkJICogRG9lc24ndCBtYXR0ZXIgdW5sZXNzIE5BVCBpcyBoYXBwZW5pbmcuICAqLworCQkJZXhwLT50dXBsZSA9ICgoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSkKKwkJCQl7IHsgMCwgeyAwIH0gfSwKKwkJCQkgIHsgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXAsCisJCQkJICAgIHsgLnRjcCA9IHsgaHRvbnMoZGNjX3BvcnQpIH0gfSwKKwkJCQkgICAgSVBQUk9UT19UQ1AgfX0pOworCQkJZXhwLT5tYXNrID0gKChzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlKQorCQkJCXsgeyAwLCB7IDAgfSB9LAorCQkJCSAgeyAweEZGRkZGRkZGLCB7IC50Y3AgPSB7IDB4RkZGRiB9IH0sIDB4RkYgfX0pOworCQkJZXhwLT5leHBlY3RmbiA9IE5VTEw7CisJCQlleHAtPm1hc3RlciA9IGN0OworCQkJaWYgKGlwX25hdF9pcmNfaG9vaykKKwkJCQlyZXQgPSBpcF9uYXRfaXJjX2hvb2socHNrYiwgY3RpbmZvLCAKKwkJCQkJCSAgICAgIGFkZHJfYmVnX3AgLSBpYl9wdHIsCisJCQkJCQkgICAgICBhZGRyX2VuZF9wIC0gYWRkcl9iZWdfcCwKKwkJCQkJCSAgICAgIGV4cCk7CisJCQllbHNlIGlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSAhPSAwKSB7CisJCQkJaXBfY29ubnRyYWNrX2V4cGVjdF9mcmVlKGV4cCk7CisJCQkJcmV0ID0gTkZfRFJPUDsKKwkJCX0KKwkJCWdvdG8gb3V0OworCQl9IC8qIGZvciAuLiBOVU1fRENDUFJPVE8gKi8KKwl9IC8qIHdoaWxlIGRhdGEgPCAuLi4gKi8KKworIG91dDoKKwlVTkxPQ0tfQkgoJmlyY19idWZmZXJfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyIGlyY19oZWxwZXJzW01BWF9QT1JUU107CitzdGF0aWMgY2hhciBpcmNfbmFtZXNbTUFYX1BPUlRTXVsxMF07CisKK3N0YXRpYyB2b2lkIGZpbmkodm9pZCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgaSwgcmV0OworCXN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyICpobHByOworCWNoYXIgKnRtcG5hbWU7CisKKwlpZiAobWF4X2RjY19jaGFubmVscyA8IDEpIHsKKwkJcHJpbnRrKCJpcF9jb25udHJhY2tfaXJjOiBtYXhfZGNjX2NoYW5uZWxzIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJaWYgKGRjY190aW1lb3V0IDwgMCkgeworCQlwcmludGsoImlwX2Nvbm50cmFja19pcmM6IGRjY190aW1lb3V0IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJCisJLyogSWYgbm8gcG9ydCBnaXZlbiwgZGVmYXVsdCB0byBzdGFuZGFyZCBpcmMgcG9ydCAqLworCWlmIChwb3J0c19jID09IDApCisJCXBvcnRzW3BvcnRzX2MrK10gPSBJUkNfUE9SVDsKKworCWZvciAoaSA9IDA7IGkgPCBwb3J0c19jOyBpKyspIHsKKwkJaGxwciA9ICZpcmNfaGVscGVyc1tpXTsKKwkJaGxwci0+dHVwbGUuc3JjLnUudGNwLnBvcnQgPSBodG9ucyhwb3J0c1tpXSk7CisJCWhscHItPnR1cGxlLmRzdC5wcm90b251bSA9IElQUFJPVE9fVENQOworCQlobHByLT5tYXNrLnNyYy51LnRjcC5wb3J0ID0gMHhGRkZGOworCQlobHByLT5tYXNrLmRzdC5wcm90b251bSA9IDB4RkY7CisJCWhscHItPm1heF9leHBlY3RlZCA9IG1heF9kY2NfY2hhbm5lbHM7CisJCWhscHItPnRpbWVvdXQgPSBkY2NfdGltZW91dDsKKwkJaGxwci0+bWUgPSBUSElTX01PRFVMRTsKKwkJaGxwci0+aGVscCA9IGhlbHA7CisKKwkJdG1wbmFtZSA9ICZpcmNfbmFtZXNbaV1bMF07CisJCWlmIChwb3J0c1tpXSA9PSBJUkNfUE9SVCkKKwkJCXNwcmludGYodG1wbmFtZSwgImlyYyIpOworCQllbHNlCisJCQlzcHJpbnRmKHRtcG5hbWUsICJpcmMtJWQiLCBpKTsKKwkJaGxwci0+bmFtZSA9IHRtcG5hbWU7CisKKwkJREVCVUdQKCJwb3J0ICMlZDogJWRcbiIsIGksIHBvcnRzW2ldKTsKKworCQlyZXQgPSBpcF9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKGhscHIpOworCisJCWlmIChyZXQpIHsKKwkJCXByaW50aygiaXBfY29ubnRyYWNrX2lyYzogRVJST1IgcmVnaXN0ZXJpbmcgcG9ydCAlZFxuIiwKKwkJCQlwb3J0c1tpXSk7CisJCQlmaW5pKCk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVudGlvbmFsbHkgX05PVF8gZGVmaW5lZCBhcyBfX2V4aXQsIGJlY2F1c2UgCisgKiBpdCBpcyBuZWVkZWQgYnkgdGhlIGluaXQgZnVuY3Rpb24gKi8KK3N0YXRpYyB2b2lkIGZpbmkodm9pZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgcG9ydHNfYzsgaSsrKSB7CisJCURFQlVHUCgidW5yZWdpc3RlcmluZyBwb3J0ICVkXG4iLAorCQkgICAgICAgcG9ydHNbaV0pOworCQlpcF9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJmlyY19oZWxwZXJzW2ldKTsKKwl9Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YzM3MTIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMuYwpAQCAtMCwwICsxLDc1IEBACisvKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCisgKiAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvY29sLmg+CisKK3Vuc2lnbmVkIGxvbmcgaXBfY3RfZ2VuZXJpY190aW1lb3V0ID0gNjAwKkhaOworCitzdGF0aWMgaW50IGdlbmVyaWNfcGt0X3RvX3R1cGxlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkJdW5zaWduZWQgaW50IGRhdGFvZmYsCisJCQkJc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCit7CisJdHVwbGUtPnNyYy51LmFsbCA9IDA7CisJdHVwbGUtPmRzdC51LmFsbCA9IDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBnZW5lcmljX2ludmVydF90dXBsZShzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKKwkJCQljb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICpvcmlnKQoreworCXR1cGxlLT5zcmMudS5hbGwgPSAwOworCXR1cGxlLT5kc3QudS5hbGwgPSAwOworCisJcmV0dXJuIDE7Cit9CisKKy8qIFByaW50IG91dCB0aGUgcGVyLXByb3RvY29sIHBhcnQgb2YgdGhlIHR1cGxlLiAqLworc3RhdGljIGludCBnZW5lcmljX3ByaW50X3R1cGxlKHN0cnVjdCBzZXFfZmlsZSAqcywKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyogUHJpbnQgb3V0IHRoZSBwcml2YXRlIHBhcnQgb2YgdGhlIGNvbm50cmFjay4gKi8KK3N0YXRpYyBpbnQgZ2VuZXJpY19wcmludF9jb25udHJhY2soc3RydWN0IHNlcV9maWxlICpzLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKnN0YXRlKQoreworCXJldHVybiAwOworfQorCisvKiBSZXR1cm5zIHZlcmRpY3QgZm9yIHBhY2tldCwgb3IgLTEgZm9yIGludmFsaWQuICovCitzdGF0aWMgaW50IHBhY2tldChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2ssCisJCSAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKK3sKKwlpcF9jdF9yZWZyZXNoX2FjY3QoY29ubnRyYWNrLCBjdGluZm8sIHNrYiwgaXBfY3RfZ2VuZXJpY190aW1lb3V0KTsKKwlyZXR1cm4gTkZfQUNDRVBUOworfQorCisvKiBDYWxsZWQgd2hlbiBhIG5ldyBjb25uZWN0aW9uIGZvciB0aGlzIHByb3RvY29sIGZvdW5kLiAqLworc3RhdGljIGludCBuZXcoc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAxOworfQorCitzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sIGlwX2Nvbm50cmFja19nZW5lcmljX3Byb3RvY29sID0KK3sKKwkucHJvdG8JCQk9IDAsCisJLm5hbWUJCQk9ICJ1bmtub3duIiwKKwkucGt0X3RvX3R1cGxlCQk9IGdlbmVyaWNfcGt0X3RvX3R1cGxlLAorCS5pbnZlcnRfdHVwbGUJCT0gZ2VuZXJpY19pbnZlcnRfdHVwbGUsCisJLnByaW50X3R1cGxlCQk9IGdlbmVyaWNfcHJpbnRfdHVwbGUsCisJLnByaW50X2Nvbm50cmFjawk9IGdlbmVyaWNfcHJpbnRfY29ubnRyYWNrLAorCS5wYWNrZXQJCQk9IHBhY2tldCwKKwkubmV3CQkJPSBuZXcsCit9OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b19pY21wLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX2ljbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDJjNzRkYgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9faWNtcC5jCkBAIC0wLDAgKzEsMjc5IEBACisvKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCisgKiAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvY29sLmg+CisKK3Vuc2lnbmVkIGxvbmcgaXBfY3RfaWNtcF90aW1lb3V0ID0gMzAqSFo7CisKKyNpZiAwCisjZGVmaW5lIERFQlVHUCBwcmludGsKKyNlbHNlCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworc3RhdGljIGludCBpY21wX3BrdF90b190dXBsZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICB1bnNpZ25lZCBpbnQgZGF0YW9mZiwKKwkJCSAgICAgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCit7CisJc3RydWN0IGljbXBoZHIgX2hkciwgKmhwOworCisJaHAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBkYXRhb2ZmLCBzaXplb2YoX2hkciksICZfaGRyKTsKKwlpZiAoaHAgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwl0dXBsZS0+ZHN0LnUuaWNtcC50eXBlID0gaHAtPnR5cGU7CisJdHVwbGUtPnNyYy51LmljbXAuaWQgPSBocC0+dW4uZWNoby5pZDsKKwl0dXBsZS0+ZHN0LnUuaWNtcC5jb2RlID0gaHAtPmNvZGU7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBpY21wX2ludmVydF90dXBsZShzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqb3JpZykKK3sKKwkvKiBBZGQgMTsgc3BhY2VzIGZpbGxlZCB3aXRoIDAuICovCisJc3RhdGljIHVfaW50OF90IGludm1hcFtdCisJCT0geyBbSUNNUF9FQ0hPXSA9IElDTVBfRUNIT1JFUExZICsgMSwKKwkJICAgIFtJQ01QX0VDSE9SRVBMWV0gPSBJQ01QX0VDSE8gKyAxLAorCQkgICAgW0lDTVBfVElNRVNUQU1QXSA9IElDTVBfVElNRVNUQU1QUkVQTFkgKyAxLAorCQkgICAgW0lDTVBfVElNRVNUQU1QUkVQTFldID0gSUNNUF9USU1FU1RBTVAgKyAxLAorCQkgICAgW0lDTVBfSU5GT19SRVFVRVNUXSA9IElDTVBfSU5GT19SRVBMWSArIDEsCisJCSAgICBbSUNNUF9JTkZPX1JFUExZXSA9IElDTVBfSU5GT19SRVFVRVNUICsgMSwKKwkJICAgIFtJQ01QX0FERFJFU1NdID0gSUNNUF9BRERSRVNTUkVQTFkgKyAxLAorCQkgICAgW0lDTVBfQUREUkVTU1JFUExZXSA9IElDTVBfQUREUkVTUyArIDF9OworCisJaWYgKG9yaWctPmRzdC51LmljbXAudHlwZSA+PSBzaXplb2YoaW52bWFwKQorCSAgICB8fCAhaW52bWFwW29yaWctPmRzdC51LmljbXAudHlwZV0pCisJCXJldHVybiAwOworCisJdHVwbGUtPnNyYy51LmljbXAuaWQgPSBvcmlnLT5zcmMudS5pY21wLmlkOworCXR1cGxlLT5kc3QudS5pY21wLnR5cGUgPSBpbnZtYXBbb3JpZy0+ZHN0LnUuaWNtcC50eXBlXSAtIDE7CisJdHVwbGUtPmRzdC51LmljbXAuY29kZSA9IG9yaWctPmRzdC51LmljbXAuY29kZTsKKwlyZXR1cm4gMTsKK30KKworLyogUHJpbnQgb3V0IHRoZSBwZXItcHJvdG9jb2wgcGFydCBvZiB0aGUgdHVwbGUuICovCitzdGF0aWMgaW50IGljbXBfcHJpbnRfdHVwbGUoc3RydWN0IHNlcV9maWxlICpzLAorCQkJICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQoreworCXJldHVybiBzZXFfcHJpbnRmKHMsICJ0eXBlPSV1IGNvZGU9JXUgaWQ9JXUgIiwKKwkJCSAgdHVwbGUtPmRzdC51LmljbXAudHlwZSwKKwkJCSAgdHVwbGUtPmRzdC51LmljbXAuY29kZSwKKwkJCSAgbnRvaHModHVwbGUtPnNyYy51LmljbXAuaWQpKTsKK30KKworLyogUHJpbnQgb3V0IHRoZSBwcml2YXRlIHBhcnQgb2YgdGhlIGNvbm50cmFjay4gKi8KK3N0YXRpYyBpbnQgaWNtcF9wcmludF9jb25udHJhY2soc3RydWN0IHNlcV9maWxlICpzLAorCQkJCWNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaykKK3sKKwlyZXR1cm4gMDsKK30KKworLyogUmV0dXJucyB2ZXJkaWN0IGZvciBwYWNrZXQsIG9yIC0xIGZvciBpbnZhbGlkLiAqLworc3RhdGljIGludCBpY21wX3BhY2tldChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKK3sKKwkvKiBUcnkgdG8gZGVsZXRlIGNvbm5lY3Rpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgYWxsIHJlcGxpZXM6CisgICAgICAgICAgIHdvbid0IGFjdHVhbGx5IHZhbmlzaCBhcyB3ZSBzdGlsbCBoYXZlIHNrYiwgYW5kIGRlbF90aW1lcgorICAgICAgICAgICBtZWFucyB0aGlzIHdpbGwgb25seSBydW4gb25jZSBldmVuIGlmIGNvdW50IGhpdHMgemVybyB0d2ljZQorICAgICAgICAgICAodGhlb3JldGljYWxseSBwb3NzaWJsZSB3aXRoIFNNUCkgKi8KKwlpZiAoQ1RJTkZPMkRJUihjdGluZm8pID09IElQX0NUX0RJUl9SRVBMWSkgeworCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmY3QtPnByb3RvLmljbXAuY291bnQpCisJCSAgICAmJiBkZWxfdGltZXIoJmN0LT50aW1lb3V0KSkKKwkJCWN0LT50aW1lb3V0LmZ1bmN0aW9uKCh1bnNpZ25lZCBsb25nKWN0KTsKKwl9IGVsc2UgeworCQlhdG9taWNfaW5jKCZjdC0+cHJvdG8uaWNtcC5jb3VudCk7CisJCWlwX2N0X3JlZnJlc2hfYWNjdChjdCwgY3RpbmZvLCBza2IsIGlwX2N0X2ljbXBfdGltZW91dCk7CisJfQorCisJcmV0dXJuIE5GX0FDQ0VQVDsKK30KKworLyogQ2FsbGVkIHdoZW4gYSBuZXcgY29ubmVjdGlvbiBmb3IgdGhpcyBwcm90b2NvbCBmb3VuZC4gKi8KK3N0YXRpYyBpbnQgaWNtcF9uZXcoc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAorCQkgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdGF0aWMgdV9pbnQ4X3QgdmFsaWRfbmV3W10KKwkJPSB7IFtJQ01QX0VDSE9dID0gMSwKKwkJICAgIFtJQ01QX1RJTUVTVEFNUF0gPSAxLAorCQkgICAgW0lDTVBfSU5GT19SRVFVRVNUXSA9IDEsCisJCSAgICBbSUNNUF9BRERSRVNTXSA9IDEgfTsKKworCWlmIChjb25udHJhY2stPnR1cGxlaGFzaFswXS50dXBsZS5kc3QudS5pY21wLnR5cGUgPj0gc2l6ZW9mKHZhbGlkX25ldykKKwkgICAgfHwgIXZhbGlkX25ld1tjb25udHJhY2stPnR1cGxlaGFzaFswXS50dXBsZS5kc3QudS5pY21wLnR5cGVdKSB7CisJCS8qIENhbid0IGNyZWF0ZSBhIG5ldyBJQ01QIGBjb25uJyB3aXRoIHRoaXMuICovCisJCURFQlVHUCgiaWNtcDogY2FuJ3QgY3JlYXRlIG5ldyBjb25uIHdpdGggdHlwZSAldVxuIiwKKwkJICAgICAgIGNvbm50cmFjay0+dHVwbGVoYXNoWzBdLnR1cGxlLmRzdC51LmljbXAudHlwZSk7CisJCURVTVBfVFVQTEUoJmNvbm50cmFjay0+dHVwbGVoYXNoWzBdLnR1cGxlKTsKKwkJcmV0dXJuIDA7CisJfQorCWF0b21pY19zZXQoJmNvbm50cmFjay0+cHJvdG8uaWNtcC5jb3VudCwgMCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2ljbXBfZXJyb3JfbWVzc2FnZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvICpjdGluZm8sCisJCSAgIHVuc2lnbmVkIGludCBob29rbnVtKQoreworCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgaW5uZXJ0dXBsZSwgb3JpZ3R1cGxlOworCXN0cnVjdCB7CisJCXN0cnVjdCBpY21waGRyIGljbXA7CisJCXN0cnVjdCBpcGhkciBpcDsKKwl9IF9pbiwgKmluc2lkZTsKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICppbm5lcnByb3RvOworCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKKwlpbnQgZGF0YW9mZjsKKworCUlQX05GX0FTU0VSVChza2ItPm5mY3QgPT0gTlVMTCk7CisKKwkvKiBOb3QgZW5vdWdoIGhlYWRlcj8gKi8KKwlpbnNpZGUgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsKjQsIHNpemVvZihfaW4pLCAmX2luKTsKKwlpZiAoaW5zaWRlID09IE5VTEwpCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwkvKiBJZ25vcmUgSUNNUCdzIGNvbnRhaW5pbmcgZnJhZ21lbnRzIChzaG91bGRuJ3QgaGFwcGVuKSAqLworCWlmIChpbnNpZGUtPmlwLmZyYWdfb2ZmICYgaHRvbnMoSVBfT0ZGU0VUKSkgeworCQlERUJVR1AoImljbXBfZXJyb3JfdHJhY2s6IGZyYWdtZW50IG9mIHByb3RvICV1XG4iLAorCQkgICAgICAgaW5zaWRlLT5pcC5wcm90b2NvbCk7CisJCXJldHVybiBORl9BQ0NFUFQ7CisJfQorCisJaW5uZXJwcm90byA9IGlwX2N0X2ZpbmRfcHJvdG8oaW5zaWRlLT5pcC5wcm90b2NvbCk7CisJZGF0YW9mZiA9IHNrYi0+bmguaXBoLT5paGwqNCArIHNpemVvZihpbnNpZGUtPmljbXApICsgaW5zaWRlLT5pcC5paGwqNDsKKwkvKiBBcmUgdGhleSB0YWxraW5nIGFib3V0IG9uZSBvZiBvdXIgY29ubmVjdGlvbnM/ICovCisJaWYgKCFpcF9jdF9nZXRfdHVwbGUoJmluc2lkZS0+aXAsIHNrYiwgZGF0YW9mZiwgJm9yaWd0dXBsZSwgaW5uZXJwcm90bykpIHsKKwkJREVCVUdQKCJpY21wX2Vycm9yOiAhIGdldF90dXBsZSBwPSV1IiwgaW5zaWRlLT5pcC5wcm90b2NvbCk7CisJCXJldHVybiBORl9BQ0NFUFQ7CisJfQorCisJLyogT3JkaW5hcmlseSwgd2UnZCBleHBlY3QgdGhlIGludmVydGVkIHR1cGxlcHJvdG8sIGJ1dCBpdCdzCisJICAgYmVlbiBwcmVzZXJ2ZWQgaW5zaWRlIHRoZSBJQ01QLiAqLworCWlmICghaXBfY3RfaW52ZXJ0X3R1cGxlKCZpbm5lcnR1cGxlLCAmb3JpZ3R1cGxlLCBpbm5lcnByb3RvKSkgeworCQlERUJVR1AoImljbXBfZXJyb3JfdHJhY2s6IENhbid0IGludmVydCB0dXBsZVxuIik7CisJCXJldHVybiBORl9BQ0NFUFQ7CisJfQorCisJKmN0aW5mbyA9IElQX0NUX1JFTEFURUQ7CisKKwloID0gaXBfY29ubnRyYWNrX2ZpbmRfZ2V0KCZpbm5lcnR1cGxlLCBOVUxMKTsKKwlpZiAoIWgpIHsKKwkJLyogTG9jYWxseSBnZW5lcmF0ZWQgSUNNUHMgd2lsbCBtYXRjaCBpbnZlcnRlZCBpZiB0aGV5CisJCSAgIGhhdmVuJ3QgYmVlbiBTTkFUJ2VkIHlldCAqLworCQkvKiBGSVhNRTogTkFUIGNvZGUgaGFzIHRvIGhhbmRsZSBoYWxmLWRvbmUgZG91YmxlIE5BVCAtLVJSICovCisJCWlmIChob29rbnVtID09IE5GX0lQX0xPQ0FMX09VVCkKKwkJCWggPSBpcF9jb25udHJhY2tfZmluZF9nZXQoJm9yaWd0dXBsZSwgTlVMTCk7CisKKwkJaWYgKCFoKSB7CisJCQlERUJVR1AoImljbXBfZXJyb3JfdHJhY2s6IG5vIG1hdGNoXG4iKTsKKwkJCXJldHVybiBORl9BQ0NFUFQ7CisJCX0KKwkJLyogUmV2ZXJzZSBkaXJlY3Rpb24gZnJvbSB0aGF0IGZvdW5kICovCisJCWlmIChESVJFQ1RJT04oaCkgIT0gSVBfQ1RfRElSX1JFUExZKQorCQkJKmN0aW5mbyArPSBJUF9DVF9JU19SRVBMWTsKKwl9IGVsc2UgeworCQlpZiAoRElSRUNUSU9OKGgpID09IElQX0NUX0RJUl9SRVBMWSkKKwkJCSpjdGluZm8gKz0gSVBfQ1RfSVNfUkVQTFk7CisJfQorCisJLyogVXBkYXRlIHNrYiB0byByZWZlciB0byB0aGlzIGNvbm5lY3Rpb24gKi8KKwlza2ItPm5mY3QgPSAmdHVwbGVoYXNoX3RvX2N0cmFjayhoKS0+Y3RfZ2VuZXJhbDsKKwlza2ItPm5mY3RpbmZvID0gKmN0aW5mbzsKKwlyZXR1cm4gLU5GX0FDQ0VQVDsKK30KKworLyogU21hbGwgYW5kIG1vZGlmaWVkIHZlcnNpb24gb2YgaWNtcF9yY3YgKi8KK3N0YXRpYyBpbnQKK2ljbXBfZXJyb3Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSBpcF9jb25udHJhY2tfaW5mbyAqY3RpbmZvLAorCSAgIHVuc2lnbmVkIGludCBob29rbnVtKQoreworCXN0cnVjdCBpY21waGRyIF9paCwgKmljbXBoOworCisJLyogTm90IGVub3VnaCBoZWFkZXI/ICovCisJaWNtcGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsKjQsIHNpemVvZihfaWgpLCAmX2loKTsKKwlpZiAoaWNtcGggPT0gTlVMTCkgeworCQlpZiAoTE9HX0lOVkFMSUQoSVBQUk9UT19JQ01QKSkKKwkJCW5mX2xvZ19wYWNrZXQoUEZfSU5FVCwgMCwgc2tiLCBOVUxMLCBOVUxMLAorCQkJCSAgICAgICJpcF9jdF9pY21wOiBzaG9ydCBwYWNrZXQgIik7CisJCXJldHVybiAtTkZfQUNDRVBUOworCX0KKworCS8qIFNlZSBpcF9jb25udHJhY2tfcHJvdG9fdGNwLmMgKi8KKwlpZiAoaG9va251bSAhPSBORl9JUF9QUkVfUk9VVElORykKKwkJZ290byBjaGVja3N1bV9za2lwcGVkOworCisJc3dpdGNoIChza2ItPmlwX3N1bW1lZCkgeworCWNhc2UgQ0hFQ0tTVU1fSFc6CisJCWlmICghKHUxNiljc3VtX2ZvbGQoc2tiLT5jc3VtKSkgCisJCQlicmVhazsKKwkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fSUNNUCkpCisJCQluZl9sb2dfcGFja2V0KFBGX0lORVQsIDAsIHNrYiwgTlVMTCwgTlVMTCwgCisJCQkJICAgICAgImlwX2N0X2ljbXA6IGJhZCBIVyBJQ01QIGNoZWNrc3VtICIpOworCQlyZXR1cm4gLU5GX0FDQ0VQVDsKKwljYXNlIENIRUNLU1VNX05PTkU6CisJCWlmICgodTE2KWNzdW1fZm9sZChza2JfY2hlY2tzdW0oc2tiLCAwLCBza2ItPmxlbiwgMCkpKSB7CisJCQlpZiAoTE9HX0lOVkFMSUQoSVBQUk9UT19JQ01QKSkKKwkJCQluZl9sb2dfcGFja2V0KFBGX0lORVQsIDAsIHNrYiwgTlVMTCwgTlVMTCwgCisJCQkJCSAgICAgICJpcF9jdF9pY21wOiBiYWQgSUNNUCBjaGVja3N1bSAiKTsKKwkJCXJldHVybiAtTkZfQUNDRVBUOworCQl9CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCitjaGVja3N1bV9za2lwcGVkOgorCS8qCisJICoJMTggaXMgdGhlIGhpZ2hlc3QgJ2tub3duJyBJQ01QIHR5cGUuIEFueXRoaW5nIGVsc2UgaXMgYSBteXN0ZXJ5CisJICoKKwkgKglSRkMgMTEyMjogMy4yLjIgIFVua25vd24gSUNNUCBtZXNzYWdlcyB0eXBlcyBNVVNUIGJlIHNpbGVudGx5CisJICoJCSAgZGlzY2FyZGVkLgorCSAqLworCWlmIChpY21waC0+dHlwZSA+IE5SX0lDTVBfVFlQRVMpIHsKKwkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fSUNNUCkpCisJCQluZl9sb2dfcGFja2V0KFBGX0lORVQsIDAsIHNrYiwgTlVMTCwgTlVMTCwKKwkJCQkgICAgICAiaXBfY3RfaWNtcDogaW52YWxpZCBJQ01QIHR5cGUgIik7CisJCXJldHVybiAtTkZfQUNDRVBUOworCX0KKworCS8qIE5lZWQgdG8gdHJhY2sgaWNtcCBlcnJvciBtZXNzYWdlPyAqLworCWlmIChpY21waC0+dHlwZSAhPSBJQ01QX0RFU1RfVU5SRUFDSAorCSAgICAmJiBpY21waC0+dHlwZSAhPSBJQ01QX1NPVVJDRV9RVUVOQ0gKKwkgICAgJiYgaWNtcGgtPnR5cGUgIT0gSUNNUF9USU1FX0VYQ0VFREVECisJICAgICYmIGljbXBoLT50eXBlICE9IElDTVBfUEFSQU1FVEVSUFJPQgorCSAgICAmJiBpY21waC0+dHlwZSAhPSBJQ01QX1JFRElSRUNUKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJcmV0dXJuIGljbXBfZXJyb3JfbWVzc2FnZShza2IsIGN0aW5mbywgaG9va251bSk7Cit9CisKK3N0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgaXBfY29ubnRyYWNrX3Byb3RvY29sX2ljbXAgPQoreworCS5wcm90byAJCQk9IElQUFJPVE9fSUNNUCwKKwkubmFtZSAJCQk9ICJpY21wIiwKKwkucGt0X3RvX3R1cGxlCQk9IGljbXBfcGt0X3RvX3R1cGxlLAorCS5pbnZlcnRfdHVwbGUJCT0gaWNtcF9pbnZlcnRfdHVwbGUsCisJLnByaW50X3R1cGxlCQk9IGljbXBfcHJpbnRfdHVwbGUsCisJLnByaW50X2Nvbm50cmFjawk9IGljbXBfcHJpbnRfY29ubnRyYWNrLAorCS5wYWNrZXQJCQk9IGljbXBfcGFja2V0LAorCS5uZXcJCQk9IGljbXBfbmV3LAorCS5lcnJvcgkJCT0gaWNtcF9lcnJvciwKK307CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX3NjdHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fc2N0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOGMzNGEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX3NjdHAuYwpAQCAtMCwwICsxLDY0OSBAQAorLyoKKyAqIENvbm5lY3Rpb24gdHJhY2tpbmcgcHJvdG9jb2wgaGVscGVyIG1vZHVsZSBmb3IgU0NUUC4KKyAqIAorICogU0NUUCBpcyBkZWZpbmVkIGluIFJGQyAyOTYwLiBSZWZlcmVuY2VzIHRvIHZhcmlvdXMgc2VjdGlvbnMgaW4gdGhpcyBjb2RlIAorICogYXJlIHRvIHRoaXMgUkZDLgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKiBBZGRlZCBzdXBwb3J0IGZvciBwcm9jIG1hbmlwdWxhdGlvbiBvZiB0aW1lb3V0cy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjdHAuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvbG9ja2hlbHAuaD4KKworI2lmIDAKKyNkZWZpbmUgREVCVUdQKGZvcm1hdCwgLi4uKSBwcmludGsoZm9ybWF0LCAjIyBfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworLyogUHJvdGVjdHMgY29ubnRyYWNrLT5wcm90by5zY3RwICovCitzdGF0aWMgREVDTEFSRV9SV0xPQ0soc2N0cF9sb2NrKTsKKworLyogRklYTUU6IEV4YW1pbmUgaXBmaWx0ZXIncyB0aW1lb3V0cyBhbmQgY29ubnRyYWNrIHRyYW5zaXRpb25zIG1vcmUKKyAgIGNsb3NlbHkuICBUaGV5J3JlIG1vcmUgY29tcGxleC4gLS1SUiAKKworICAgQW5kIHNvIGZvciBtZSBmb3IgU0NUUCA6RCAtS2lyYW4gKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKnNjdHBfY29ubnRyYWNrX25hbWVzW10gPSB7CisJIk5PTkUiLAorCSJDTE9TRUQiLAorCSJDT09LSUVfV0FJVCIsCisJIkNPT0tJRV9FQ0hPRUQiLAorCSJFU1RBQkxJU0hFRCIsCisJIlNIVVRET1dOX1NFTlQiLAorCSJTSFVURE9XTl9SRUNEIiwKKwkiU0hVVERPV05fQUNLX1NFTlQiLAorfTsKKworI2RlZmluZSBTRUNTICAqIEhaCisjZGVmaW5lIE1JTlMgICogNjAgU0VDUworI2RlZmluZSBIT1VSUyAqIDYwIE1JTlMKKyNkZWZpbmUgREFZUyAgKiAyNCBIT1VSUworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpcF9jdF9zY3RwX3RpbWVvdXRfY2xvc2VkICAgICAgICAgICAgPSAgMTAgU0VDUzsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlwX2N0X3NjdHBfdGltZW91dF9jb29raWVfd2FpdCAgICAgICA9ICAgMyBTRUNTOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXBfY3Rfc2N0cF90aW1lb3V0X2Nvb2tpZV9lY2hvZWQgICAgID0gICAzIFNFQ1M7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpcF9jdF9zY3RwX3RpbWVvdXRfZXN0YWJsaXNoZWQgICAgICAgPSAgIDUgREFZUzsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlwX2N0X3NjdHBfdGltZW91dF9zaHV0ZG93bl9zZW50ICAgICA9IDMwMCBTRUNTIC8gMTAwMDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlwX2N0X3NjdHBfdGltZW91dF9zaHV0ZG93bl9yZWNkICAgICA9IDMwMCBTRUNTIC8gMTAwMDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlwX2N0X3NjdHBfdGltZW91dF9zaHV0ZG93bl9hY2tfc2VudCA9ICAgMyBTRUNTOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyAqIHNjdHBfdGltZW91dHNbXQorPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNDVFBfQ09OTlRSQUNLX05PTkUgICovCisgICAgJmlwX2N0X3NjdHBfdGltZW91dF9jbG9zZWQsCSAgICAgICAgICAgLyogU0NUUF9DT05OVFJBQ0tfQ0xPU0VEICovCisgICAgJmlwX2N0X3NjdHBfdGltZW91dF9jb29raWVfd2FpdCwgICAgICAgLyogU0NUUF9DT05OVFJBQ0tfQ09PS0lFX1dBSVQgKi8KKyAgICAmaXBfY3Rfc2N0cF90aW1lb3V0X2Nvb2tpZV9lY2hvZWQsICAgICAvKiBTQ1RQX0NPTk5UUkFDS19DT09LSUVfRUNIT0VEICovCisgICAgJmlwX2N0X3NjdHBfdGltZW91dF9lc3RhYmxpc2hlZCwgICAgICAgLyogU0NUUF9DT05OVFJBQ0tfRVNUQUJMSVNIRUQgKi8KKyAgICAmaXBfY3Rfc2N0cF90aW1lb3V0X3NodXRkb3duX3NlbnQsICAgICAvKiBTQ1RQX0NPTk5UUkFDS19TSFVURE9XTl9TRU5UICovCisgICAgJmlwX2N0X3NjdHBfdGltZW91dF9zaHV0ZG93bl9yZWNkLCAgICAgLyogU0NUUF9DT05OVFJBQ0tfU0hVVERPV05fUkVDRCAqLworICAgICZpcF9jdF9zY3RwX3RpbWVvdXRfc2h1dGRvd25fYWNrX3NlbnQgIC8qIFNDVFBfQ09OTlRSQUNLX1NIVVRET1dOX0FDS19TRU5UICovCisgfTsKKworI2RlZmluZSBzTk8gU0NUUF9DT05OVFJBQ0tfTk9ORQorI2RlZmluZQlzQ0wgU0NUUF9DT05OVFJBQ0tfQ0xPU0VECisjZGVmaW5lCXNDVyBTQ1RQX0NPTk5UUkFDS19DT09LSUVfV0FJVAorI2RlZmluZQlzQ0UgU0NUUF9DT05OVFJBQ0tfQ09PS0lFX0VDSE9FRAorI2RlZmluZQlzRVMgU0NUUF9DT05OVFJBQ0tfRVNUQUJMSVNIRUQKKyNkZWZpbmUJc1NTIFNDVFBfQ09OTlRSQUNLX1NIVVRET1dOX1NFTlQKKyNkZWZpbmUJc1NSIFNDVFBfQ09OTlRSQUNLX1NIVVRET1dOX1JFQ0QKKyNkZWZpbmUJc1NBIFNDVFBfQ09OTlRSQUNLX1NIVVRET1dOX0FDS19TRU5UCisjZGVmaW5lCXNJViBTQ1RQX0NPTk5UUkFDS19NQVgKKworLyogCisJVGhlc2UgYXJlIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHN0YXRlczoKKworTk9URTogVGhlc2Ugc3RhdGUgbmFtZXMgYXJlIHRhbnRhbGl6aW5nbHkgc2ltaWxhciB0byB0aGUgc3RhdGVzIG9mIGFuIAorU0NUUCBlbmRwb2ludC4gQnV0IHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgc3RhdGVzIGlzIGEgbGl0dGxlIGRpZmZlcmVudCwKK2NvbnNpZGVyaW5nIHRoYXQgdGhlc2UgYXJlIHRoZSBzdGF0ZXMgb2YgdGhlIGNvbm5lY3Rpb24gYW5kIG5vdCBvZiBhbiBlbmQgCitwb2ludC4gUGxlYXNlIG5vdGUgdGhlIHN1YnRsZXRpZXMuIC1LaXJhbgorCitOT05FICAgICAgICAgICAgICAtIE5vdGhpbmcgc28gZmFyLgorQ09PS0lFIFdBSVQgICAgICAgLSBXZSBoYXZlIHNlZW4gYW4gSU5JVCBjaHVuayBpbiB0aGUgb3JpZ2luYWwgZGlyZWN0aW9uLCBvciBhbHNvIAorICAgICAgICAgICAgICAgICAgICBhbiBJTklUX0FDSyBjaHVuayBpbiB0aGUgcmVwbHkgZGlyZWN0aW9uLgorQ09PS0lFIEVDSE9FRCAgICAgLSBXZSBoYXZlIHNlZW4gYSBDT09LSUVfRUNITyBjaHVuayBpbiB0aGUgb3JpZ2luYWwgZGlyZWN0aW9uLgorRVNUQUJMSVNIRUQgICAgICAgLSBXZSBoYXZlIHNlZW4gYSBDT09LSUVfQUNLIGluIHRoZSByZXBseSBkaXJlY3Rpb24uCitTSFVURE9XTl9TRU5UICAgICAtIFdlIGhhdmUgc2VlbiBhIFNIVVRET1dOIGNodW5rIGluIHRoZSBvcmlnaW5hbCBkaXJlY3Rpb24uCitTSFVURE9XTl9SRUNEICAgICAtIFdlIGhhdmUgc2VlbiBhIFNIVVRET1dOIGNodW5rIGluIHRoZSByZXBseSBkaXJlY3RvaW4uCitTSFVURE9XTl9BQ0tfU0VOVCAtIFdlIGhhdmUgc2VlbiBhIFNIVVRET1dOX0FDSyBjaHVuayBpbiB0aGUgZGlyZWN0aW9uIG9wcG9zaXRlCisgICAgICAgICAgICAgICAgICAgIHRvIHRoYXQgb2YgdGhlIFNIVVRET1dOIGNodW5rLgorQ0xPU0VEICAgICAgICAgICAgLSBXZSBoYXZlIHNlZW4gYSBTSFVURE9XTl9DT01QTEVURSBjaHVuayBpbiB0aGUgZGlyZWN0aW9uIG9mIAorICAgICAgICAgICAgICAgICAgICB0aGUgU0hVVERPV04gY2h1bmsuIENvbm5lY3Rpb24gaXMgY2xvc2VkLgorKi8KKworLyogVE9ETworIC0gSSBoYXZlIGFzc3VtZWQgdGhhdCB0aGUgZmlyc3QgSU5JVCBpcyBpbiB0aGUgb3JpZ2luYWwgZGlyZWN0aW9uLiAKKyBUaGlzIG1lc3NlcyB0aGluZ3Mgd2hlbiBhbiBJTklUIGNvbWVzIGluIHRoZSByZXBseSBkaXJlY3Rpb24gaW4gQ0xPU0VECisgc3RhdGUuCisgLSBDaGVjayB0aGUgZXJyb3IgdHlwZSBpbiB0aGUgcmVwbHkgZGlyIGJlZm9yZSB0cmFuc2l0aW9uaW5nIGZyb20gCitjb29raWUgZWNob2VkIHRvIGNsb3NlZC4KKyAtIFNlYyA1LjIuNCBvZiBSRkMgMjk2MAorIC0gTXVsdGkgSG9taW5nIHN1cHBvcnQuCisqLworCisvKiBTQ1RQIGNvbm50cmFjayBzdGF0ZSB0cmFuc2l0aW9ucyAqLworc3RhdGljIGVudW0gc2N0cF9jb25udHJhY2sgc2N0cF9jb25udHJhY2tzWzJdWzldW1NDVFBfQ09OTlRSQUNLX01BWF0gPSB7CisJeworLyoJT1JJR0lOQUwJKi8KKy8qICAgICAgICAgICAgICAgICAgc05PLCBzQ0wsIHNDVywgc0NFLCBzRVMsIHNTUywgc1NSLCBzU0EgKi8KKy8qIGluaXQgICAgICAgICAqLyB7c0NXLCBzQ1csIHNDVywgc0NFLCBzRVMsIHNTUywgc1NSLCBzU0F9LAorLyogaW5pdF9hY2sgICAgICovIHtzQ0wsIHNDTCwgc0NXLCBzQ0UsIHNFUywgc1NTLCBzU1IsIHNTQX0sCisvKiBhYm9ydCAgICAgICAgKi8ge3NDTCwgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNDTCwgc0NMfSwKKy8qIHNodXRkb3duICAgICAqLyB7c0NMLCBzQ0wsIHNDVywgc0NFLCBzU1MsIHNTUywgc1NSLCBzU0F9LAorLyogc2h1dGRvd25fYWNrICovIHtzU0EsIHNDTCwgc0NXLCBzQ0UsIHNFUywgc1NBLCBzU0EsIHNTQX0sCisvKiBlcnJvciAgICAgICAgKi8ge3NDTCwgc0NMLCBzQ1csIHNDRSwgc0VTLCBzU1MsIHNTUiwgc1NBfSwvKiBDYW50IGhhdmUgU3RhbGUgY29va2llKi8KKy8qIGNvb2tpZV9lY2hvICAqLyB7c0NMLCBzQ0wsIHNDRSwgc0NFLCBzRVMsIHNTUywgc1NSLCBzU0F9LC8qIDUuMi40IC0gQmlnIFRPRE8gKi8KKy8qIGNvb2tpZV9hY2sgICAqLyB7c0NMLCBzQ0wsIHNDVywgc0NFLCBzRVMsIHNTUywgc1NSLCBzU0F9LC8qIENhbnQgY29tZSBpbiBvcmlnIGRpciAqLworLyogc2h1dGRvd25fY29tcCovIHtzQ0wsIHNDTCwgc0NXLCBzQ0UsIHNFUywgc1NTLCBzU1IsIHNDTH0KKwl9LAorCXsKKy8qCVJFUExZCSovCisvKiAgICAgICAgICAgICAgICAgIHNOTywgc0NMLCBzQ1csIHNDRSwgc0VTLCBzU1MsIHNTUiwgc1NBICovCisvKiBpbml0ICAgICAgICAgKi8ge3NJViwgc0NMLCBzQ1csIHNDRSwgc0VTLCBzU1MsIHNTUiwgc1NBfSwvKiBJTklUIGluIHNDTCBCaWcgVE9ETyAqLworLyogaW5pdF9hY2sgICAgICovIHtzSVYsIHNDTCwgc0NXLCBzQ0UsIHNFUywgc1NTLCBzU1IsIHNTQX0sCisvKiBhYm9ydCAgICAgICAgKi8ge3NJViwgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNDTCwgc0NMfSwKKy8qIHNodXRkb3duICAgICAqLyB7c0lWLCBzQ0wsIHNDVywgc0NFLCBzU1IsIHNTUywgc1NSLCBzU0F9LAorLyogc2h1dGRvd25fYWNrICovIHtzSVYsIHNDTCwgc0NXLCBzQ0UsIHNFUywgc1NBLCBzU0EsIHNTQX0sCisvKiBlcnJvciAgICAgICAgKi8ge3NJViwgc0NMLCBzQ1csIHNDTCwgc0VTLCBzU1MsIHNTUiwgc1NBfSwKKy8qIGNvb2tpZV9lY2hvICAqLyB7c0lWLCBzQ0wsIHNDVywgc0NFLCBzRVMsIHNTUywgc1NSLCBzU0F9LC8qIENhbnQgY29tZSBpbiByZXBseSBkaXIgKi8KKy8qIGNvb2tpZV9hY2sgICAqLyB7c0lWLCBzQ0wsIHNDVywgc0VTLCBzRVMsIHNTUywgc1NSLCBzU0F9LAorLyogc2h1dGRvd25fY29tcCovIHtzSVYsIHNDTCwgc0NXLCBzQ0UsIHNFUywgc1NTLCBzU1IsIHNDTH0KKwl9Cit9OworCitzdGF0aWMgaW50IHNjdHBfcGt0X3RvX3R1cGxlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAorCQkJICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKK3sKKwlzY3RwX3NjdHBoZHJfdCBfaGRyLCAqaHA7CisKKwlERUJVR1AoX19GVU5DVElPTl9fKTsKKwlERUJVR1AoIlxuIik7CisKKwkvKiBBY3R1YWxseSBvbmx5IG5lZWQgZmlyc3QgOCBieXRlcy4gKi8KKwlocCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGRhdGFvZmYsIDgsICZfaGRyKTsKKwlpZiAoaHAgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwl0dXBsZS0+c3JjLnUuc2N0cC5wb3J0ID0gaHAtPnNvdXJjZTsKKwl0dXBsZS0+ZHN0LnUuc2N0cC5wb3J0ID0gaHAtPmRlc3Q7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2N0cF9pbnZlcnRfdHVwbGUoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKm9yaWcpCit7CisJREVCVUdQKF9fRlVOQ1RJT05fXyk7CisJREVCVUdQKCJcbiIpOworCisJdHVwbGUtPnNyYy51LnNjdHAucG9ydCA9IG9yaWctPmRzdC51LnNjdHAucG9ydDsKKwl0dXBsZS0+ZHN0LnUuc2N0cC5wb3J0ID0gb3JpZy0+c3JjLnUuc2N0cC5wb3J0OworCXJldHVybiAxOworfQorCisvKiBQcmludCBvdXQgdGhlIHBlci1wcm90b2NvbCBwYXJ0IG9mIHRoZSB0dXBsZS4gKi8KK3N0YXRpYyBpbnQgc2N0cF9wcmludF90dXBsZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCisJCQkgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCit7CisJREVCVUdQKF9fRlVOQ1RJT05fXyk7CisJREVCVUdQKCJcbiIpOworCisJcmV0dXJuIHNlcV9wcmludGYocywgInNwb3J0PSVodSBkcG9ydD0laHUgIiwKKwkJCSAgbnRvaHModHVwbGUtPnNyYy51LnNjdHAucG9ydCksCisJCQkgIG50b2hzKHR1cGxlLT5kc3QudS5zY3RwLnBvcnQpKTsKK30KKworLyogUHJpbnQgb3V0IHRoZSBwcml2YXRlIHBhcnQgb2YgdGhlIGNvbm50cmFjay4gKi8KK3N0YXRpYyBpbnQgc2N0cF9wcmludF9jb25udHJhY2soc3RydWN0IHNlcV9maWxlICpzLAorCQkJCWNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaykKK3sKKwllbnVtIHNjdHBfY29ubnRyYWNrIHN0YXRlOworCisJREVCVUdQKF9fRlVOQ1RJT05fXyk7CisJREVCVUdQKCJcbiIpOworCisJUkVBRF9MT0NLKCZzY3RwX2xvY2spOworCXN0YXRlID0gY29ubnRyYWNrLT5wcm90by5zY3RwLnN0YXRlOworCVJFQURfVU5MT0NLKCZzY3RwX2xvY2spOworCisJcmV0dXJuIHNlcV9wcmludGYocywgIiVzICIsIHNjdHBfY29ubnRyYWNrX25hbWVzW3N0YXRlXSk7Cit9CisKKyNkZWZpbmUgZm9yX2VhY2hfc2N0cF9jaHVuayhza2IsIHNjaCwgX3NjaCwgb2Zmc2V0LCBjb3VudCkJCVwKK2ZvciAob2Zmc2V0ID0gc2tiLT5uaC5pcGgtPmlobCAqIDQgKyBzaXplb2Yoc2N0cF9zY3RwaGRyX3QpLCBjb3VudCA9IDA7CVwKKwlvZmZzZXQgPCBza2ItPmxlbiAmJgkJCQkJCVwKKwkoc2NoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0LCBzaXplb2YoX3NjaCksICZfc2NoKSk7CVwKKwlvZmZzZXQgKz0gKGh0b25zKHNjaC0+bGVuZ3RoKSArIDMpICYgfjMsIGNvdW50KyspCisKKy8qIFNvbWUgdmFsaWRpdHkgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgY2h1bmtzIGFyZSBmaW5lICovCitzdGF0aWMgaW50IGRvX2Jhc2ljX2NoZWNrcyhzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2ssCisJCQkgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgY2hhciAqbWFwKQoreworCXVfaW50MzJfdCBvZmZzZXQsIGNvdW50OworCXNjdHBfY2h1bmtoZHJfdCBfc2NoLCAqc2NoOworCWludCBmbGFnOworCisJREVCVUdQKF9fRlVOQ1RJT05fXyk7CisJREVCVUdQKCJcbiIpOworCisJZmxhZyA9IDA7CisKKwlmb3JfZWFjaF9zY3RwX2NodW5rIChza2IsIHNjaCwgX3NjaCwgb2Zmc2V0LCBjb3VudCkgeworCQlERUJVR1AoIkNodW5rIE51bTogJWQgIFR5cGU6ICVkXG4iLCBjb3VudCwgc2NoLT50eXBlKTsKKworCQlpZiAoc2NoLT50eXBlID09IFNDVFBfQ0lEX0lOSVQgCisJCQl8fCBzY2gtPnR5cGUgPT0gU0NUUF9DSURfSU5JVF9BQ0sKKwkJCXx8IHNjaC0+dHlwZSA9PSBTQ1RQX0NJRF9TSFVURE9XTl9DT01QTEVURSkgeworCQkJZmxhZyA9IDE7CisJCX0KKworCQkvKiBDb29raWUgQWNrL0VjaG8gY2h1bmtzIG5vdCB0aGUgZmlyc3QgT1IgCisJCSAgIEluaXQgLyBJbml0IEFjayAvIFNodXRkb3duIGNvbXBsIGNodW5rcyBub3QgdGhlIG9ubHkgY2h1bmtzICovCisJCWlmICgoc2NoLT50eXBlID09IFNDVFBfQ0lEX0NPT0tJRV9BQ0sgCisJCQl8fCBzY2gtPnR5cGUgPT0gU0NUUF9DSURfQ09PS0lFX0VDSE8KKwkJCXx8IGZsYWcpCisJCSAgICAgJiYgY291bnQgIT0wICkgeworCQkJREVCVUdQKCJCYXNpYyBjaGVja3MgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJaWYgKG1hcCkgeworCQkJc2V0X2JpdChzY2gtPnR5cGUsICh2b2lkICopbWFwKTsKKwkJfQorCX0KKworCURFQlVHUCgiQmFzaWMgY2hlY2tzIHBhc3NlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmV3X3N0YXRlKGVudW0gaXBfY29ubnRyYWNrX2RpciBkaXIsCisJCSAgICAgZW51bSBzY3RwX2Nvbm50cmFjayBjdXJfc3RhdGUsCisJCSAgICAgaW50IGNodW5rX3R5cGUpCit7CisJaW50IGk7CisKKwlERUJVR1AoX19GVU5DVElPTl9fKTsKKwlERUJVR1AoIlxuIik7CisKKwlERUJVR1AoIkNodW5rIHR5cGU6ICVkXG4iLCBjaHVua190eXBlKTsKKworCXN3aXRjaCAoY2h1bmtfdHlwZSkgeworCQljYXNlIFNDVFBfQ0lEX0lOSVQ6IAorCQkJREVCVUdQKCJTQ1RQX0NJRF9JTklUXG4iKTsKKwkJCWkgPSAwOyBicmVhazsKKwkJY2FzZSBTQ1RQX0NJRF9JTklUX0FDSzogCisJCQlERUJVR1AoIlNDVFBfQ0lEX0lOSVRfQUNLXG4iKTsKKwkJCWkgPSAxOyBicmVhazsKKwkJY2FzZSBTQ1RQX0NJRF9BQk9SVDogCisJCQlERUJVR1AoIlNDVFBfQ0lEX0FCT1JUXG4iKTsKKwkJCWkgPSAyOyBicmVhazsKKwkJY2FzZSBTQ1RQX0NJRF9TSFVURE9XTjogCisJCQlERUJVR1AoIlNDVFBfQ0lEX1NIVVRET1dOXG4iKTsKKwkJCWkgPSAzOyBicmVhazsKKwkJY2FzZSBTQ1RQX0NJRF9TSFVURE9XTl9BQ0s6IAorCQkJREVCVUdQKCJTQ1RQX0NJRF9TSFVURE9XTl9BQ0tcbiIpOworCQkJaSA9IDQ7IGJyZWFrOworCQljYXNlIFNDVFBfQ0lEX0VSUk9SOiAKKwkJCURFQlVHUCgiU0NUUF9DSURfRVJST1JcbiIpOworCQkJaSA9IDU7IGJyZWFrOworCQljYXNlIFNDVFBfQ0lEX0NPT0tJRV9FQ0hPOiAKKwkJCURFQlVHUCgiU0NUUF9DSURfQ09PS0lFX0VDSE9cbiIpOworCQkJaSA9IDY7IGJyZWFrOworCQljYXNlIFNDVFBfQ0lEX0NPT0tJRV9BQ0s6IAorCQkJREVCVUdQKCJTQ1RQX0NJRF9DT09LSUVfQUNLXG4iKTsKKwkJCWkgPSA3OyBicmVhazsKKwkJY2FzZSBTQ1RQX0NJRF9TSFVURE9XTl9DT01QTEVURTogCisJCQlERUJVR1AoIlNDVFBfQ0lEX1NIVVRET1dOX0NPTVBMRVRFXG4iKTsKKwkJCWkgPSA4OyBicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIE90aGVyIGNodW5rcyBsaWtlIERBVEEsIFNBQ0ssIEhFQVJUQkVBVCBhbmQKKwkJCWl0cyBBQ0sgZG8gbm90IGNhdXNlIGEgY2hhbmdlIGluIHN0YXRlICovCisJCQlERUJVR1AoIlVua25vd24gY2h1bmsgdHlwZSwgV2lsbCBzdGF5IGluICVzXG4iLCAKKwkJCQkJCXNjdHBfY29ubnRyYWNrX25hbWVzW2N1cl9zdGF0ZV0pOworCQkJcmV0dXJuIGN1cl9zdGF0ZTsKKwl9CisKKwlERUJVR1AoImRpcjogJWQgICBjdXJfc3RhdGU6ICVzICBjaHVua190eXBlOiAlZCAgbmV3X3N0YXRlOiAlc1xuIiwgCisJCQlkaXIsIHNjdHBfY29ubnRyYWNrX25hbWVzW2N1cl9zdGF0ZV0sIGNodW5rX3R5cGUsCisJCQlzY3RwX2Nvbm50cmFja19uYW1lc1tzY3RwX2Nvbm50cmFja3NbZGlyXVtpXVtjdXJfc3RhdGVdXSk7CisKKwlyZXR1cm4gc2N0cF9jb25udHJhY2tzW2Rpcl1baV1bY3VyX3N0YXRlXTsKK30KKworLyogUmV0dXJucyB2ZXJkaWN0IGZvciBwYWNrZXQsIG9yIC0xIGZvciBpbnZhbGlkLiAqLworc3RhdGljIGludCBzY3RwX3BhY2tldChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2ssCisJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCit7CisJZW51bSBzY3RwX2Nvbm50cmFjayBuZXdjb25udHJhY2ssIG9sZHNjdHBzdGF0ZTsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCXNjdHBfc2N0cGhkcl90IF9zY3RwaCwgKnNoOworCXNjdHBfY2h1bmtoZHJfdCBfc2NoLCAqc2NoOworCXVfaW50MzJfdCBvZmZzZXQsIGNvdW50OworCWNoYXIgbWFwWzI1NiAvIHNpemVvZiAoY2hhcildID0gezB9OworCisJREVCVUdQKF9fRlVOQ1RJT05fXyk7CisJREVCVUdQKCJcbiIpOworCisJc2ggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpcGgtPmlobCAqIDQsIHNpemVvZihfc2N0cGgpLCAmX3NjdHBoKTsKKwlpZiAoc2ggPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGRvX2Jhc2ljX2NoZWNrcyhjb25udHJhY2ssIHNrYiwgbWFwKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBDaGVjayB0aGUgdmVyaWZpY2F0aW9uIHRhZyAoU2VjIDguNSkgKi8KKwlpZiAoIXRlc3RfYml0KFNDVFBfQ0lEX0lOSVQsICh2b2lkICopbWFwKQorCQkmJiAhdGVzdF9iaXQoU0NUUF9DSURfU0hVVERPV05fQ09NUExFVEUsICh2b2lkICopbWFwKQorCQkmJiAhdGVzdF9iaXQoU0NUUF9DSURfQ09PS0lFX0VDSE8sICh2b2lkICopbWFwKQorCQkmJiAhdGVzdF9iaXQoU0NUUF9DSURfQUJPUlQsICh2b2lkICopbWFwKQorCQkmJiAhdGVzdF9iaXQoU0NUUF9DSURfU0hVVERPV05fQUNLLCAodm9pZCAqKW1hcCkKKwkJJiYgKHNoLT52dGFnICE9IGNvbm50cmFjay0+cHJvdG8uc2N0cC52dGFnW0NUSU5GTzJESVIoY3RpbmZvKV0pKSB7CisJCURFQlVHUCgiVmVyaWZpY2F0aW9uIHRhZyBjaGVjayBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJb2xkc2N0cHN0YXRlID0gbmV3Y29ubnRyYWNrID0gU0NUUF9DT05OVFJBQ0tfTUFYOworCWZvcl9lYWNoX3NjdHBfY2h1bmsgKHNrYiwgc2NoLCBfc2NoLCBvZmZzZXQsIGNvdW50KSB7CisJCVdSSVRFX0xPQ0soJnNjdHBfbG9jayk7CisKKwkJLyogU3BlY2lhbCBjYXNlcyBvZiBWZXJpZmljYXRpb24gdGFnIGNoZWNrIChTZWMgOC41LjEpICovCisJCWlmIChzY2gtPnR5cGUgPT0gU0NUUF9DSURfSU5JVCkgeworCQkJLyogU2VjIDguNS4xIChBKSAqLworCQkJaWYgKHNoLT52dGFnICE9IDApIHsKKwkJCQlXUklURV9VTkxPQ0soJnNjdHBfbG9jayk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKHNjaC0+dHlwZSA9PSBTQ1RQX0NJRF9BQk9SVCkgeworCQkJLyogU2VjIDguNS4xIChCKSAqLworCQkJaWYgKCEoc2gtPnZ0YWcgPT0gY29ubnRyYWNrLT5wcm90by5zY3RwLnZ0YWdbQ1RJTkZPMkRJUihjdGluZm8pXSkKKwkJCQkmJiAhKHNoLT52dGFnID09IGNvbm50cmFjay0+cHJvdG8uc2N0cC52dGFnCisJCQkJCQkJWzEgLSBDVElORk8yRElSKGN0aW5mbyldKSkgeworCQkJCVdSSVRFX1VOTE9DSygmc2N0cF9sb2NrKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAoc2NoLT50eXBlID09IFNDVFBfQ0lEX1NIVVRET1dOX0NPTVBMRVRFKSB7CisJCQkvKiBTZWMgOC41LjEgKEMpICovCisJCQlpZiAoIShzaC0+dnRhZyA9PSBjb25udHJhY2stPnByb3RvLnNjdHAudnRhZ1tDVElORk8yRElSKGN0aW5mbyldKQorCQkJCSYmICEoc2gtPnZ0YWcgPT0gY29ubnRyYWNrLT5wcm90by5zY3RwLnZ0YWcKKwkJCQkJCQlbMSAtIENUSU5GTzJESVIoY3RpbmZvKV0gCisJCQkJCSYmIChzY2gtPmZsYWdzICYgMSkpKSB7CisJCQkJV1JJVEVfVU5MT0NLKCZzY3RwX2xvY2spOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzY2gtPnR5cGUgPT0gU0NUUF9DSURfQ09PS0lFX0VDSE8pIHsKKwkJCS8qIFNlYyA4LjUuMSAoRCkgKi8KKwkJCWlmICghKHNoLT52dGFnID09IGNvbm50cmFjay0+cHJvdG8uc2N0cC52dGFnW0NUSU5GTzJESVIoY3RpbmZvKV0pKSB7CisJCQkJV1JJVEVfVU5MT0NLKCZzY3RwX2xvY2spOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCisJCW9sZHNjdHBzdGF0ZSA9IGNvbm50cmFjay0+cHJvdG8uc2N0cC5zdGF0ZTsKKwkJbmV3Y29ubnRyYWNrID0gbmV3X3N0YXRlKENUSU5GTzJESVIoY3RpbmZvKSwgb2xkc2N0cHN0YXRlLCBzY2gtPnR5cGUpOworCisJCS8qIEludmFsaWQgKi8KKwkJaWYgKG5ld2Nvbm50cmFjayA9PSBTQ1RQX0NPTk5UUkFDS19NQVgpIHsKKwkJCURFQlVHUCgiaXBfY29ubnRyYWNrX3NjdHA6IEludmFsaWQgZGlyPSVpIGN0eXBlPSV1IGNvbm50cmFjaz0ldVxuIiwKKwkJCSAgICAgICBDVElORk8yRElSKGN0aW5mbyksIHNjaC0+dHlwZSwgb2xkc2N0cHN0YXRlKTsKKwkJCVdSSVRFX1VOTE9DSygmc2N0cF9sb2NrKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCS8qIElmIGl0IGlzIGFuIElOSVQgb3IgYW4gSU5JVCBBQ0sgbm90ZSBkb3duIHRoZSB2dGFnICovCisJCWlmIChzY2gtPnR5cGUgPT0gU0NUUF9DSURfSU5JVCAKKwkJCXx8IHNjaC0+dHlwZSA9PSBTQ1RQX0NJRF9JTklUX0FDSykgeworCQkJc2N0cF9pbml0aGRyX3QgX2luaXRoZHIsICppaDsKKworCQkJaWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQgKyBzaXplb2Yoc2N0cF9jaHVua2hkcl90KSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihfaW5pdGhkciksICZfaW5pdGhkcik7CisJCQlpZiAoaWggPT0gTlVMTCkgeworCQkJCQlXUklURV9VTkxPQ0soJnNjdHBfbG9jayk7CisJCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCURFQlVHUCgiU2V0dGluZyB2dGFnICV4IGZvciBkaXIgJWRcbiIsIAorCQkJCQlpaC0+aW5pdF90YWcsICFDVElORk8yRElSKGN0aW5mbykpOworCQkJY29ubnRyYWNrLT5wcm90by5zY3RwLnZ0YWdbIUNUSU5GTzJESVIoY3RpbmZvKV0gPSBpaC0+aW5pdF90YWc7CisJCX0KKworCQljb25udHJhY2stPnByb3RvLnNjdHAuc3RhdGUgPSBuZXdjb25udHJhY2s7CisJCVdSSVRFX1VOTE9DSygmc2N0cF9sb2NrKTsKKwl9CisKKwlpcF9jdF9yZWZyZXNoX2FjY3QoY29ubnRyYWNrLCBjdGluZm8sIHNrYiwgKnNjdHBfdGltZW91dHNbbmV3Y29ubnRyYWNrXSk7CisKKwlpZiAob2xkc2N0cHN0YXRlID09IFNDVFBfQ09OTlRSQUNLX0NPT0tJRV9FQ0hPRUQKKwkJJiYgQ1RJTkZPMkRJUihjdGluZm8pID09IElQX0NUX0RJUl9SRVBMWQorCQkmJiBuZXdjb25udHJhY2sgPT0gU0NUUF9DT05OVFJBQ0tfRVNUQUJMSVNIRUQpIHsKKwkJREVCVUdQKCJTZXR0aW5nIGFzc3VyZWQgYml0XG4iKTsKKwkJc2V0X2JpdChJUFNfQVNTVVJFRF9CSVQsICZjb25udHJhY2stPnN0YXR1cyk7CisJfQorCisJcmV0dXJuIE5GX0FDQ0VQVDsKK30KKworLyogQ2FsbGVkIHdoZW4gYSBuZXcgY29ubmVjdGlvbiBmb3IgdGhpcyBwcm90b2NvbCBmb3VuZC4gKi8KK3N0YXRpYyBpbnQgc2N0cF9uZXcoc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLCAKKwkJICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJZW51bSBzY3RwX2Nvbm50cmFjayBuZXdjb25udHJhY2s7CisJc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwlzY3RwX3NjdHBoZHJfdCBfc2N0cGgsICpzaDsKKwlzY3RwX2NodW5raGRyX3QgX3NjaCwgKnNjaDsKKwl1X2ludDMyX3Qgb2Zmc2V0LCBjb3VudDsKKwljaGFyIG1hcFsyNTYgLyBzaXplb2YgKGNoYXIpXSA9IHswfTsKKworCURFQlVHUChfX0ZVTkNUSU9OX18pOworCURFQlVHUCgiXG4iKTsKKworCXNoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBoLT5paGwgKiA0LCBzaXplb2YoX3NjdHBoKSwgJl9zY3RwaCk7CisJaWYgKHNoID09IE5VTEwpCisJCXJldHVybiAwOworCisJaWYgKGRvX2Jhc2ljX2NoZWNrcyhjb25udHJhY2ssIHNrYiwgbWFwKSAhPSAwKQorCQlyZXR1cm4gMDsKKworCS8qIElmIGFuIE9PVEIgcGFja2V0IGhhcyBhbnkgb2YgdGhlc2UgY2h1bmtzIGRpc2NhcmQgKFNlYyA4LjQpICovCisJaWYgKCh0ZXN0X2JpdCAoU0NUUF9DSURfQUJPUlQsICh2b2lkICopbWFwKSkKKwkJfHwgKHRlc3RfYml0IChTQ1RQX0NJRF9TSFVURE9XTl9DT01QTEVURSwgKHZvaWQgKiltYXApKQorCQl8fCAodGVzdF9iaXQgKFNDVFBfQ0lEX0NPT0tJRV9BQ0ssICh2b2lkICopbWFwKSkpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJbmV3Y29ubnRyYWNrID0gU0NUUF9DT05OVFJBQ0tfTUFYOworCWZvcl9lYWNoX3NjdHBfY2h1bmsgKHNrYiwgc2NoLCBfc2NoLCBvZmZzZXQsIGNvdW50KSB7CisJCS8qIERvbid0IG5lZWQgbG9jayBoZXJlOiB0aGlzIGNvbm50cmFjayBub3QgaW4gY2lyY3VsYXRpb24geWV0ICovCisJCW5ld2Nvbm50cmFjayA9IG5ld19zdGF0ZSAoSVBfQ1RfRElSX09SSUdJTkFMLCAKKwkJCQkJCVNDVFBfQ09OTlRSQUNLX05PTkUsIHNjaC0+dHlwZSk7CisKKwkJLyogSW52YWxpZDogZGVsZXRlIGNvbm50cmFjayAqLworCQlpZiAobmV3Y29ubnRyYWNrID09IFNDVFBfQ09OTlRSQUNLX01BWCkgeworCQkJREVCVUdQKCJpcF9jb25udHJhY2tfc2N0cDogaW52YWxpZCBuZXcgZGVsZXRpbmcuXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogQ29weSB0aGUgdnRhZyBpbnRvIHRoZSBzdGF0ZSBpbmZvICovCisJCWlmIChzY2gtPnR5cGUgPT0gU0NUUF9DSURfSU5JVCkgeworCQkJaWYgKHNoLT52dGFnID09IDApIHsKKwkJCQlzY3RwX2luaXRoZHJfdCBfaW5pdGhkciwgKmloOworCisJCQkJaWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQgKyBzaXplb2Yoc2N0cF9jaHVua2hkcl90KSwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoX2luaXRoZHIpLCAmX2luaXRoZHIpOworCQkJCWlmIChpaCA9PSBOVUxMKQorCQkJCQlyZXR1cm4gMDsKKworCQkJCURFQlVHUCgiU2V0dGluZyB2dGFnICV4IGZvciBuZXcgY29ublxuIiwgCisJCQkJCWloLT5pbml0X3RhZyk7CisKKwkJCQljb25udHJhY2stPnByb3RvLnNjdHAudnRhZ1tJUF9DVF9ESVJfUkVQTFldID0gCisJCQkJCQkJCWloLT5pbml0X3RhZzsKKwkJCX0gZWxzZSB7CisJCQkJLyogU2VjIDguNS4xIChBKSAqLworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCS8qIElmIGl0IGlzIGEgc2h1dGRvd24gYWNrIE9PVEIgcGFja2V0LCB3ZSBleHBlY3QgYSByZXR1cm4KKwkJICAgc2h1dGRvd24gY29tcGxldGUsIG90aGVyd2lzZSBhbiBBQk9SVCBTZWMgOC40ICg1KSBhbmQgKDgpICovCisJCWVsc2UgeworCQkJREVCVUdQKCJTZXR0aW5nIHZ0YWcgJXggZm9yIG5ldyBjb25uIE9PVEJcbiIsIAorCQkJCXNoLT52dGFnKTsKKwkJCWNvbm50cmFjay0+cHJvdG8uc2N0cC52dGFnW0lQX0NUX0RJUl9SRVBMWV0gPSBzaC0+dnRhZzsKKwkJfQorCisJCWNvbm50cmFjay0+cHJvdG8uc2N0cC5zdGF0ZSA9IG5ld2Nvbm50cmFjazsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgaXBfY29ubnRyYWNrX3Byb3RvY29sX3NjdHAgPSB7IAorCS5wcm90byAJCSA9IElQUFJPVE9fU0NUUCwgCisJLm5hbWUgCQkgPSAic2N0cCIsCisJLnBrdF90b190dXBsZSAJID0gc2N0cF9wa3RfdG9fdHVwbGUsIAorCS5pbnZlcnRfdHVwbGUgCSA9IHNjdHBfaW52ZXJ0X3R1cGxlLCAKKwkucHJpbnRfdHVwbGUgCSA9IHNjdHBfcHJpbnRfdHVwbGUsIAorCS5wcmludF9jb25udHJhY2sgPSBzY3RwX3ByaW50X2Nvbm50cmFjaywKKwkucGFja2V0IAkgPSBzY3RwX3BhY2tldCwgCisJLm5ldyAJCSA9IHNjdHBfbmV3LCAKKwkuZGVzdHJveSAJID0gTlVMTCwgCisJLm1lIAkJID0gVEhJU19NT0RVTEUgCit9OworCisjaWZkZWYgQ09ORklHX1NZU0NUTAorc3RhdGljIGN0bF90YWJsZSBpcF9jdF9zeXNjdGxfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfQ0xPU0VELAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3NjdHBfdGltZW91dF9jbG9zZWQiLAorCQkuZGF0YQkJPSAmaXBfY3Rfc2N0cF90aW1lb3V0X2Nsb3NlZCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfQ09PS0lFX1dBSVQsCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfc2N0cF90aW1lb3V0X2Nvb2tpZV93YWl0IiwKKwkJLmRhdGEJCT0gJmlwX2N0X3NjdHBfdGltZW91dF9jb29raWVfd2FpdCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfQ09PS0lFX0VDSE9FRCwKKwkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19zY3RwX3RpbWVvdXRfY29va2llX2VjaG9lZCIsCisJCS5kYXRhCQk9ICZpcF9jdF9zY3RwX3RpbWVvdXRfY29va2llX2VjaG9lZCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfRVNUQUJMSVNIRUQsCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfc2N0cF90aW1lb3V0X2VzdGFibGlzaGVkIiwKKwkJLmRhdGEJCT0gJmlwX2N0X3NjdHBfdGltZW91dF9lc3RhYmxpc2hlZCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfU0hVVERPV05fU0VOVCwKKwkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19zY3RwX3RpbWVvdXRfc2h1dGRvd25fc2VudCIsCisJCS5kYXRhCQk9ICZpcF9jdF9zY3RwX3RpbWVvdXRfc2h1dGRvd25fc2VudCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfU0hVVERPV05fUkVDRCwKKwkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19zY3RwX3RpbWVvdXRfc2h1dGRvd25fcmVjZCIsCisJCS5kYXRhCQk9ICZpcF9jdF9zY3RwX3RpbWVvdXRfc2h1dGRvd25fcmVjZCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfU0hVVERPV05fQUNLX1NFTlQsCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfc2N0cF90aW1lb3V0X3NodXRkb3duX2Fja19zZW50IiwKKwkJLmRhdGEJCT0gJmlwX2N0X3NjdHBfdGltZW91dF9zaHV0ZG93bl9hY2tfc2VudCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIGN0bF90YWJsZSBpcF9jdF9uZXRmaWx0ZXJfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05FVEZJTFRFUiwKKwkJLnByb2NuYW1lCT0gIm5ldGZpbHRlciIsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSBpcF9jdF9zeXNjdGxfdGFibGUsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIGN0bF90YWJsZSBpcF9jdF9pcHY0X3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNCwKKwkJLnByb2NuYW1lCT0gImlwdjQiLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gaXBfY3RfbmV0ZmlsdGVyX3RhYmxlLAorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3N0YXRpYyBjdGxfdGFibGUgaXBfY3RfbmV0X3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBDVExfTkVULAorCQkucHJvY25hbWUJPSAibmV0IiwKKwkJLm1vZGUJCT0gMDU1NSwgCisJCS5jaGlsZAkJPSBpcF9jdF9pcHY0X3RhYmxlLAorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqaXBfY3Rfc3lzY3RsX2hlYWRlcjsKKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGlwX2Nvbm50cmFja19wcm90b2NvbF9yZWdpc3RlcigmaXBfY29ubnRyYWNrX3Byb3RvY29sX3NjdHApOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKCJpcF9jb25udHJhY2tfcHJvdG9fc2N0cDogcHJvdG9jb2wgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCWlwX2N0X3N5c2N0bF9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUoaXBfY3RfbmV0X3RhYmxlLCAwKTsKKwlpZiAoaXBfY3Rfc3lzY3RsX2hlYWRlciA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCXByaW50aygiaXBfY29ubnRyYWNrX3Byb3RvX3NjdHA6IGNhbid0IHJlZ2lzdGVyIHRvIHN5c2N0bC5cbiIpOworCQlnb3RvIGNsZWFudXA7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gcmV0OworCisjaWZkZWYgQ09ORklHX1NZU0NUTAorIGNsZWFudXA6CisJaXBfY29ubnRyYWNrX3Byb3RvY29sX3VucmVnaXN0ZXIoJmlwX2Nvbm50cmFja19wcm90b2NvbF9zY3RwKTsKKyNlbmRpZgorIG91dDoKKwlERUJVR1AoIlNDVFAgY29ubnRyYWNrIG1vZHVsZSBsb2FkaW5nICVzXG4iLCAKKwkJCQkJcmV0ID8gImZhaWxlZCI6ICJzdWNjZWVkZWQiKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCWlwX2Nvbm50cmFja19wcm90b2NvbF91bnJlZ2lzdGVyKCZpcF9jb25udHJhY2tfcHJvdG9jb2xfc2N0cCk7CisjaWZkZWYgQ09ORklHX1NZU0NUTAorIAl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShpcF9jdF9zeXNjdGxfaGVhZGVyKTsKKyNlbmRpZgorCURFQlVHUCgiU0NUUCBjb25udHJhY2sgbW9kdWxlIHVubG9hZGVkXG4iKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiS2lyYW4gS3VtYXIgSW1taWRpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5ldGZpbHRlciBjb25uZWN0aW9uIHRyYWNraW5nIHByb3RvY29sIGhlbHBlciBmb3IgU0NUUCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b190Y3AuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fdGNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgwMGIxNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fdGNwLmMKQEAgLTAsMCArMSwxMDk4IEBACisvKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCisgKiAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBKb3pzZWYgS2FkbGVjc2lrIDxrYWRsZWNAYmxhY2tob2xlLmtma2kuaHU+OgorICoJLSBSZWFsIHN0YXRlZnVsIGNvbm5lY3Rpb24gdHJhY2tpbmcKKyAqCS0gTW9kaWZpZWQgc3RhdGUgdHJhbnNpdGlvbnMgdGFibGUKKyAqCS0gV2luZG93IHNjYWxpbmcgc3VwcG9ydCBhZGRlZAorICoJLSBTQUNLIHN1cHBvcnQgYWRkZWQKKyAqCisgKiBXaWxseSBUYXJyZWF1OgorICoJLSBTdGF0ZSB0YWJsZSBidWdmaXhlcworICoJLSBNb3JlIHJvYnVzdCBzdGF0ZSBjaGFuZ2VzCisgKgktIFR1bmluZyB0aW1lciBwYXJhbWV0ZXJzCisgKgorICogdmVyc2lvbiAyLjIKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcm90b2NvbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2xvY2toZWxwLmg+CisKKyNpZiAwCisjZGVmaW5lIERFQlVHUCBwcmludGsKKyNkZWZpbmUgREVCVUdQX1ZBUlMKKyNlbHNlCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworLyogUHJvdGVjdHMgY29ubnRyYWNrLT5wcm90by50Y3AgKi8KK3N0YXRpYyBERUNMQVJFX1JXTE9DSyh0Y3BfbG9jayk7CisKKy8qICJCZSBjb25zZXJ2YXRpdmUgaW4gd2hhdCB5b3UgZG8sIAorICAgIGJlIGxpYmVyYWwgaW4gd2hhdCB5b3UgYWNjZXB0IGZyb20gb3RoZXJzLiIgCisgICAgSWYgaXQncyBub24temVybywgd2UgbWFyayBvbmx5IG91dCBvZiB3aW5kb3cgUlNUIHNlZ21lbnRzIGFzIElOVkFMSUQuICovCitpbnQgaXBfY3RfdGNwX2JlX2xpYmVyYWwgPSAwOworCisvKiBXaGVuIGNvbm5lY3Rpb24gaXMgcGlja2VkIHVwIGZyb20gdGhlIG1pZGRsZSwgaG93IG1hbnkgcGFja2V0cyBhcmUgcmVxdWlyZWQKKyAgIHRvIHBhc3MgaW4gZWFjaCBkaXJlY3Rpb24gd2hlbiB3ZSBhc3N1bWUgd2UgYXJlIGluIHN5bmMgLSBpZiBhbnkgc2lkZSB1c2VzCisgICB3aW5kb3cgc2NhbGluZywgd2UgbG9zdCB0aGUgZ2FtZS4gCisgICBJZiBpdCBpcyBzZXQgdG8gemVybywgd2UgZGlzYWJsZSBwaWNraW5nIHVwIGFscmVhZHkgZXN0YWJsaXNoZWQgCisgICBjb25uZWN0aW9ucy4gKi8KK2ludCBpcF9jdF90Y3BfbG9vc2UgPSAzOworCisvKiBNYXggbnVtYmVyIG9mIHRoZSByZXRyYW5zbWl0dGVkIHBhY2tldHMgd2l0aG91dCByZWNlaXZpbmcgYW4gKGFjY2VwdGFibGUpIAorICAgQUNLIGZyb20gdGhlIGRlc3RpbmF0aW9uLiBJZiB0aGlzIG51bWJlciBpcyByZWFjaGVkLCBhIHNob3J0ZXIgdGltZXIgCisgICB3aWxsIGJlIHN0YXJ0ZWQuICovCitpbnQgaXBfY3RfdGNwX21heF9yZXRyYW5zID0gMzsKKworICAvKiBGSVhNRTogRXhhbWluZSBpcGZpbHRlcidzIHRpbWVvdXRzIGFuZCBjb25udHJhY2sgdHJhbnNpdGlvbnMgbW9yZQorICAgICBjbG9zZWx5LiAgVGhleSdyZSBtb3JlIGNvbXBsZXguIC0tUlIgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKnRjcF9jb25udHJhY2tfbmFtZXNbXSA9IHsKKwkiTk9ORSIsCisJIlNZTl9TRU5UIiwKKwkiU1lOX1JFQ1YiLAorCSJFU1RBQkxJU0hFRCIsCisJIkZJTl9XQUlUIiwKKwkiQ0xPU0VfV0FJVCIsCisJIkxBU1RfQUNLIiwKKwkiVElNRV9XQUlUIiwKKwkiQ0xPU0UiLAorCSJMSVNURU4iCit9OworICAKKyNkZWZpbmUgU0VDUyAqIEhaCisjZGVmaW5lIE1JTlMgKiA2MCBTRUNTCisjZGVmaW5lIEhPVVJTICogNjAgTUlOUworI2RlZmluZSBEQVlTICogMjQgSE9VUlMKKwordW5zaWduZWQgbG9uZyBpcF9jdF90Y3BfdGltZW91dF9zeW5fc2VudCA9ICAgICAgMiBNSU5TOwordW5zaWduZWQgbG9uZyBpcF9jdF90Y3BfdGltZW91dF9zeW5fcmVjdiA9ICAgICA2MCBTRUNTOwordW5zaWduZWQgbG9uZyBpcF9jdF90Y3BfdGltZW91dF9lc3RhYmxpc2hlZCA9ICAgNSBEQVlTOwordW5zaWduZWQgbG9uZyBpcF9jdF90Y3BfdGltZW91dF9maW5fd2FpdCA9ICAgICAgMiBNSU5TOwordW5zaWduZWQgbG9uZyBpcF9jdF90Y3BfdGltZW91dF9jbG9zZV93YWl0ID0gICA2MCBTRUNTOwordW5zaWduZWQgbG9uZyBpcF9jdF90Y3BfdGltZW91dF9sYXN0X2FjayA9ICAgICAzMCBTRUNTOwordW5zaWduZWQgbG9uZyBpcF9jdF90Y3BfdGltZW91dF90aW1lX3dhaXQgPSAgICAgMiBNSU5TOwordW5zaWduZWQgbG9uZyBpcF9jdF90Y3BfdGltZW91dF9jbG9zZSA9ICAgICAgICAxMCBTRUNTOworCisvKiBSRkMxMTIyIHNheXMgdGhlIFIyIGxpbWl0IHNob3VsZCBiZSBhdCBsZWFzdCAxMDAgc2Vjb25kcy4KKyAgIExpbnV4IHVzZXMgMTUgcGFja2V0cyBhcyBsaW1pdCwgd2hpY2ggY29ycmVzcG9uZHMgCisgICB0byB+MTMtMzBtaW4gZGVwZW5kaW5nIG9uIFJUTy4gKi8KK3Vuc2lnbmVkIGxvbmcgaXBfY3RfdGNwX3RpbWVvdXRfbWF4X3JldHJhbnMgPSAgICAgNSBNSU5TOworIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgKiB0Y3BfdGltZW91dHNbXQorPSB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICBUQ1BfQ09OTlRSQUNLX05PTkUgKi8KKyAgICAmaXBfY3RfdGNwX3RpbWVvdXRfc3luX3NlbnQsICAgICAgIC8qICAgICAgVENQX0NPTk5UUkFDS19TWU5fU0VOVCwgKi8KKyAgICAmaXBfY3RfdGNwX3RpbWVvdXRfc3luX3JlY3YsICAgICAgIC8qICAgICAgVENQX0NPTk5UUkFDS19TWU5fUkVDViwgKi8KKyAgICAmaXBfY3RfdGNwX3RpbWVvdXRfZXN0YWJsaXNoZWQsICAgIC8qICAgICAgVENQX0NPTk5UUkFDS19FU1RBQkxJU0hFRCwgICAgICAqLworICAgICZpcF9jdF90Y3BfdGltZW91dF9maW5fd2FpdCwgICAgICAgLyogICAgICBUQ1BfQ09OTlRSQUNLX0ZJTl9XQUlULCAqLworICAgICZpcF9jdF90Y3BfdGltZW91dF9jbG9zZV93YWl0LCAgICAgLyogICAgICBUQ1BfQ09OTlRSQUNLX0NMT1NFX1dBSVQsICAgICAgICovCisgICAgJmlwX2N0X3RjcF90aW1lb3V0X2xhc3RfYWNrLCAgICAgICAvKiAgICAgIFRDUF9DT05OVFJBQ0tfTEFTVF9BQ0ssICovCisgICAgJmlwX2N0X3RjcF90aW1lb3V0X3RpbWVfd2FpdCwgICAgICAvKiAgICAgIFRDUF9DT05OVFJBQ0tfVElNRV9XQUlULCAgICAgICAgKi8KKyAgICAmaXBfY3RfdGNwX3RpbWVvdXRfY2xvc2UsICAgICAgICAgIC8qICAgICAgVENQX0NPTk5UUkFDS19DTE9TRSwgICAgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgVENQX0NPTk5UUkFDS19MSVNURU4gKi8KKyB9OworIAorI2RlZmluZSBzTk8gVENQX0NPTk5UUkFDS19OT05FCisjZGVmaW5lIHNTUyBUQ1BfQ09OTlRSQUNLX1NZTl9TRU5UCisjZGVmaW5lIHNTUiBUQ1BfQ09OTlRSQUNLX1NZTl9SRUNWCisjZGVmaW5lIHNFUyBUQ1BfQ09OTlRSQUNLX0VTVEFCTElTSEVECisjZGVmaW5lIHNGVyBUQ1BfQ09OTlRSQUNLX0ZJTl9XQUlUCisjZGVmaW5lIHNDVyBUQ1BfQ09OTlRSQUNLX0NMT1NFX1dBSVQKKyNkZWZpbmUgc0xBIFRDUF9DT05OVFJBQ0tfTEFTVF9BQ0sKKyNkZWZpbmUgc1RXIFRDUF9DT05OVFJBQ0tfVElNRV9XQUlUCisjZGVmaW5lIHNDTCBUQ1BfQ09OTlRSQUNLX0NMT1NFCisjZGVmaW5lIHNMSSBUQ1BfQ09OTlRSQUNLX0xJU1RFTgorI2RlZmluZSBzSVYgVENQX0NPTk5UUkFDS19NQVgKKyNkZWZpbmUgc0lHIFRDUF9DT05OVFJBQ0tfSUdOT1JFCisKKy8qIFdoYXQgVENQIGZsYWdzIGFyZSBzZXQgZnJvbSBSU1QvU1lOL0ZJTi9BQ0suICovCitlbnVtIHRjcF9iaXRfc2V0IHsKKwlUQ1BfU1lOX1NFVCwKKwlUQ1BfU1lOQUNLX1NFVCwKKwlUQ1BfRklOX1NFVCwKKwlUQ1BfQUNLX1NFVCwKKwlUQ1BfUlNUX1NFVCwKKwlUQ1BfTk9ORV9TRVQsCit9OworICAKKy8qCisgKiBUaGUgVENQIHN0YXRlIHRyYW5zaXRpb24gdGFibGUgbmVlZHMgYSBmZXcgd29yZHMuLi4KKyAqCisgKiBXZSBhcmUgdGhlIG1hbiBpbiB0aGUgbWlkZGxlLiBBbGwgdGhlIHBhY2tldHMgZ28gdGhyb3VnaCB1cworICogYnV0IG1pZ2h0IGdldCBsb3N0IGluIHRyYW5zaXQgdG8gdGhlIGRlc3RpbmF0aW9uLgorICogSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBkZXN0aW5hdGlvbnMgY2FuJ3QgcmVjZWl2ZSBzZWdtZW50cyAKKyAqIHdlIGhhdmVuJ3Qgc2Vlbi4KKyAqCisgKiBUaGUgY2hlY2tlZCBzZWdtZW50IGlzIGluIHdpbmRvdywgYnV0IG91ciB3aW5kb3dzIGFyZSAqbm90KgorICogZXF1aXZhbGVudCB3aXRoIHRoZSBvbmVzIG9mIHRoZSBzZW5kZXIvcmVjZWl2ZXIuIFdlIGFsd2F5cworICogdHJ5IHRvIGd1ZXNzIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBzZW5kZXIuCisgKgorICogVGhlIG1lYW5pbmcgb2YgdGhlIHN0YXRlcyBhcmU6CisgKgorICogTk9ORToJaW5pdGlhbCBzdGF0ZQorICogU1lOX1NFTlQ6CVNZTi1vbmx5IHBhY2tldCBzZWVuIAorICogU1lOX1JFQ1Y6CVNZTi1BQ0sgcGFja2V0IHNlZW4KKyAqIEVTVEFCTElTSEVEOglBQ0sgcGFja2V0IHNlZW4KKyAqIEZJTl9XQUlUOglGSU4gcGFja2V0IHNlZW4KKyAqIENMT1NFX1dBSVQ6CUFDSyBzZWVuIChhZnRlciBGSU4pIAorICogTEFTVF9BQ0s6CUZJTiBzZWVuIChhZnRlciBGSU4pCisgKiBUSU1FX1dBSVQ6CWxhc3QgQUNLIHNlZW4KKyAqIENMT1NFOgljbG9zZWQgY29ubmVjdGlvbgorICoKKyAqIExJU1RFTiBzdGF0ZSBpcyBub3QgdXNlZC4KKyAqCisgKiBQYWNrZXRzIG1hcmtlZCBhcyBJR05PUkVEIChzSUcpOgorICoJaWYgdGhleSBtYXkgYmUgZWl0aGVyIGludmFsaWQgb3IgdmFsaWQgCisgKglhbmQgdGhlIHJlY2VpdmVyIG1heSBzZW5kIGJhY2sgYSBjb25uZWN0aW9uIAorICoJY2xvc2luZyBSU1Qgb3IgYSBTWU4vQUNLLgorICoKKyAqIFBhY2tldHMgbWFya2VkIGFzIElOVkFMSUQgKHNJVik6CisgKglpZiB0aGV5IGFyZSBpbnZhbGlkCisgKglvciB3ZSBkbyBub3Qgc3VwcG9ydCB0aGUgcmVxdWVzdCAoc2ltdWx0YW5lb3VzIG9wZW4pCisgKi8KK3N0YXRpYyBlbnVtIHRjcF9jb25udHJhY2sgdGNwX2Nvbm50cmFja3NbMl1bNl1bVENQX0NPTk5UUkFDS19NQVhdID0geworCXsKKy8qIE9SSUdJTkFMICovCisvKiAJICAgICBzTk8sIHNTUywgc1NSLCBzRVMsIHNGVywgc0NXLCBzTEEsIHNUVywgc0NMLCBzTEkJKi8KKy8qc3luKi8JICAgeyBzU1MsIHNTUywgc0lHLCBzSUcsIHNJRywgc0lHLCBzSUcsIHNTUywgc1NTLCBzSVYgfSwKKy8qCisgKglzTk8gLT4gc1NTCUluaXRpYWxpemUgYSBuZXcgY29ubmVjdGlvbgorICoJc1NTIC0+IHNTUwlSZXRyYW5zbWl0dGVkIFNZTgorICoJc1NSIC0+IHNJRwlMYXRlIHJldHJhbnNtaXR0ZWQgU1lOPworICoJc0VTIC0+IHNJRwlFcnJvcjogU1lOcyBpbiB3aW5kb3cgb3V0c2lkZSB0aGUgU1lOX1NFTlQgc3RhdGUKKyAqCQkJYXJlIGVycm9ycy4gUmVjZWl2ZXIgd2lsbCByZXBseSB3aXRoIFJTVCAKKyAqCQkJYW5kIGNsb3NlIHRoZSBjb25uZWN0aW9uLgorICoJCQlPciB3ZSBhcmUgbm90IGluIHN5bmMgYW5kIGhvbGQgYSBkZWFkIGNvbm5lY3Rpb24uCisgKglzRlcgLT4gc0lHCisgKglzQ1cgLT4gc0lHCisgKglzTEEgLT4gc0lHCisgKglzVFcgLT4gc1NTCVJlb3BlbmVkIGNvbm5lY3Rpb24gKFJGQyAxMTIyKS4KKyAqCXNDTCAtPiBzU1MKKyAqLworLyogCSAgICAgc05PLCBzU1MsIHNTUiwgc0VTLCBzRlcsIHNDVywgc0xBLCBzVFcsIHNDTCwgc0xJCSovCisvKnN5bmFjayovIHsgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWIH0sCisvKgorICogQSBTWU4vQUNLIGZyb20gdGhlIGNsaWVudCBpcyBhbHdheXMgaW52YWxpZDoKKyAqCS0gZWl0aGVyIGl0IHRyaWVzIHRvIHNldCB1cCBhIHNpbXVsdGFuZW91cyBvcGVuLCB3aGljaCBpcyAKKyAqCSAgbm90IHN1cHBvcnRlZDsKKyAqCS0gb3IgdGhlIGZpcmV3YWxsIGhhcyBqdXN0IGJlZW4gaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgdHdvIGhvc3RzCisgKgkgIGR1cmluZyB0aGUgc2Vzc2lvbiBzZXQtdXAuIFRoZSBTWU4gd2lsbCBiZSByZXRyYW5zbWl0dGVkIAorICoJICBieSB0aGUgdHJ1ZSBjbGllbnQgKG9yIGl0J2xsIHRpbWUgb3V0KS4KKyAqLworLyogCSAgICAgc05PLCBzU1MsIHNTUiwgc0VTLCBzRlcsIHNDVywgc0xBLCBzVFcsIHNDTCwgc0xJCSovCisvKmZpbiovICAgIHsgc0lWLCBzSVYsIHNGVywgc0ZXLCBzTEEsIHNMQSwgc0xBLCBzVFcsIHNDTCwgc0lWIH0sCisvKgorICoJc05PIC0+IHNJVglUb28gbGF0ZSBhbmQgbm8gcmVhc29uIHRvIGRvIGFueXRoaW5nLi4uCisgKglzU1MgLT4gc0lWCUNsaWVudCBtaWd0aCBub3Qgc2VuZCBGSU4gaW4gdGhpcyBzdGF0ZToKKyAqCQkJd2UgZW5mb3JjZSB3YWl0aW5nIGZvciBhIFNZTi9BQ0sgcmVwbHkgZmlyc3QuCisgKglzU1IgLT4gc0ZXCUNsb3NlIHN0YXJ0ZWQuCisgKglzRVMgLT4gc0ZXCQorICoJc0ZXIC0+IHNMQQlGSU4gc2VlbiBpbiBib3RoIGRpcmVjdGlvbnMsIHdhaXRpbmcgZm9yCisgKgkJCXRoZSBsYXN0IEFDSy4gCisgKgkJCU1pZ3RoIGJlIGEgcmV0cmFuc21pdHRlZCBGSU4gYXMgd2VsbC4uLgorICoJc0NXIC0+IHNMQQorICoJc0xBIC0+IHNMQQlSZXRyYW5zbWl0dGVkIEZJTi4gUmVtYWluIGluIHRoZSBzYW1lIHN0YXRlLgorICoJc1RXIC0+IHNUVworICoJc0NMIC0+IHNDTAorICovCisvKiAJICAgICBzTk8sIHNTUywgc1NSLCBzRVMsIHNGVywgc0NXLCBzTEEsIHNUVywgc0NMLCBzTEkJKi8KKy8qYWNrKi8JICAgeyBzRVMsIHNJViwgc0VTLCBzRVMsIHNDVywgc0NXLCBzVFcsIHNUVywgc0NMLCBzSVYgfSwKKy8qCisgKglzTk8gLT4gc0VTCUFzc3VtZWQuCisgKglzU1MgLT4gc0lWCUFDSyBpcyBpbnZhbGlkOiB3ZSBoYXZlbid0IHNlZW4gYSBTWU4vQUNLIHlldC4KKyAqCXNTUiAtPiBzRVMJRXN0YWJsaXNoZWQgc3RhdGUgaXMgcmVhY2hlZC4KKyAqCXNFUyAtPiBzRVMJOi0pCisgKglzRlcgLT4gc0NXCU5vcm1hbCBjbG9zZSByZXF1ZXN0IGFuc3dlcmVkIGJ5IEFDSy4KKyAqCXNDVyAtPiBzQ1cKKyAqCXNMQSAtPiBzVFcJTGFzdCBBQ0sgZGV0ZWN0ZWQuCisgKglzVFcgLT4gc1RXCVJldHJhbnNtaXR0ZWQgbGFzdCBBQ0suIFJlbWFpbiBpbiB0aGUgc2FtZSBzdGF0ZS4KKyAqCXNDTCAtPiBzQ0wKKyAqLworLyogCSAgICAgc05PLCBzU1MsIHNTUiwgc0VTLCBzRlcsIHNDVywgc0xBLCBzVFcsIHNDTCwgc0xJCSovCisvKnJzdCovICAgIHsgc0lWLCBzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNDTCwgc0lWIH0sCisvKm5vbmUqLyAgIHsgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWIH0KKwl9LAorCXsKKy8qIFJFUExZICovCisvKiAJICAgICBzTk8sIHNTUywgc1NSLCBzRVMsIHNGVywgc0NXLCBzTEEsIHNUVywgc0NMLCBzTEkJKi8KKy8qc3luKi8JICAgeyBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYgfSwKKy8qCisgKglzTk8gLT4gc0lWCU5ldmVyIHJlYWNoZWQuCisgKglzU1MgLT4gc0lWCVNpbXVsdGFuZW91cyBvcGVuLCBub3Qgc3VwcG9ydGVkCisgKglzU1IgLT4gc0lWCVNpbXVsdGFuZW91cyBvcGVuLCBub3Qgc3VwcG9ydGVkLgorICoJc0VTIC0+IHNJVglTZXJ2ZXIgbWF5IG5vdCBpbml0aWF0ZSBhIGNvbm5lY3Rpb24uCisgKglzRlcgLT4gc0lWCisgKglzQ1cgLT4gc0lWCisgKglzTEEgLT4gc0lWCisgKglzVFcgLT4gc0lWCVJlb3BlbmVkIGNvbm5lY3Rpb24sIGJ1dCBzZXJ2ZXIgbWF5IG5vdCBkbyBpdC4KKyAqCXNDTCAtPiBzSVYKKyAqLworLyogCSAgICAgc05PLCBzU1MsIHNTUiwgc0VTLCBzRlcsIHNDVywgc0xBLCBzVFcsIHNDTCwgc0xJCSovCisvKnN5bmFjayovIHsgc0lWLCBzU1IsIHNTUiwgc0lHLCBzSUcsIHNJRywgc0lHLCBzSUcsIHNJRywgc0lWIH0sCisvKgorICoJc1NTIC0+IHNTUglTdGFuZGFyZCBvcGVuLgorICoJc1NSIC0+IHNTUglSZXRyYW5zbWl0dGVkIFNZTi9BQ0suCisgKglzRVMgLT4gc0lHCUxhdGUgcmV0cmFuc21pdHRlZCBTWU4vQUNLPworICoJc0ZXIC0+IHNJRwlNaWdodCBiZSBTWU4vQUNLIGFuc3dlcmluZyBpZ25vcmVkIFNZTgorICoJc0NXIC0+IHNJRworICoJc0xBIC0+IHNJRworICoJc1RXIC0+IHNJRworICoJc0NMIC0+IHNJRworICovCisvKiAJICAgICBzTk8sIHNTUywgc1NSLCBzRVMsIHNGVywgc0NXLCBzTEEsIHNUVywgc0NMLCBzTEkJKi8KKy8qZmluKi8gICAgeyBzSVYsIHNJViwgc0ZXLCBzRlcsIHNMQSwgc0xBLCBzTEEsIHNUVywgc0NMLCBzSVYgfSwKKy8qCisgKglzU1MgLT4gc0lWCVNlcnZlciBtaWdodCBub3Qgc2VuZCBGSU4gaW4gdGhpcyBzdGF0ZS4KKyAqCXNTUiAtPiBzRlcJQ2xvc2Ugc3RhcnRlZC4KKyAqCXNFUyAtPiBzRlcKKyAqCXNGVyAtPiBzTEEJRklOIHNlZW4gaW4gYm90aCBkaXJlY3Rpb25zLgorICoJc0NXIC0+IHNMQQorICoJc0xBIC0+IHNMQQlSZXRyYW5zbWl0dGVkIEZJTi4KKyAqCXNUVyAtPiBzVFcKKyAqCXNDTCAtPiBzQ0wKKyAqLworLyogCSAgICAgc05PLCBzU1MsIHNTUiwgc0VTLCBzRlcsIHNDVywgc0xBLCBzVFcsIHNDTCwgc0xJCSovCisvKmFjayovCSAgIHsgc0lWLCBzSVYsIHNTUiwgc0VTLCBzQ1csIHNDVywgc1RXLCBzVFcsIHNDTCwgc0lWIH0sCisvKgorICoJc1NTIC0+IHNJVglNaWdodCBiZSBhIGhhbGYtb3BlbiBjb25uZWN0aW9uLgorICoJc1NSIC0+IHNTUglNaWdodCBhbnN3ZXIgbGF0ZSByZXNlbnQgU1lOLgorICoJc0VTIC0+IHNFUwk6LSkKKyAqCXNGVyAtPiBzQ1cJTm9ybWFsIGNsb3NlIHJlcXVlc3QgYW5zd2VyZWQgYnkgQUNLLgorICoJc0NXIC0+IHNDVworICoJc0xBIC0+IHNUVwlMYXN0IEFDSyBkZXRlY3RlZC4KKyAqCXNUVyAtPiBzVFcJUmV0cmFuc21pdHRlZCBsYXN0IEFDSy4KKyAqCXNDTCAtPiBzQ0wKKyAqLworLyogCSAgICAgc05PLCBzU1MsIHNTUiwgc0VTLCBzRlcsIHNDVywgc0xBLCBzVFcsIHNDTCwgc0xJCSovCisvKnJzdCovICAgIHsgc0lWLCBzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNDTCwgc0lWIH0sCisvKm5vbmUqLyAgIHsgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWIH0KKyAgCX0KK307CisKK3N0YXRpYyBpbnQgdGNwX3BrdF90b190dXBsZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAorCQkJICAgIHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQoreworCXN0cnVjdCB0Y3BoZHIgX2hkciwgKmhwOworCisJLyogQWN0dWFsbHkgb25seSBuZWVkIGZpcnN0IDggYnl0ZXMuICovCisJaHAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBkYXRhb2ZmLCA4LCAmX2hkcik7CisJaWYgKGhwID09IE5VTEwpCisJCXJldHVybiAwOworCisJdHVwbGUtPnNyYy51LnRjcC5wb3J0ID0gaHAtPnNvdXJjZTsKKwl0dXBsZS0+ZHN0LnUudGNwLnBvcnQgPSBocC0+ZGVzdDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHRjcF9pbnZlcnRfdHVwbGUoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCisJCQkgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqb3JpZykKK3sKKwl0dXBsZS0+c3JjLnUudGNwLnBvcnQgPSBvcmlnLT5kc3QudS50Y3AucG9ydDsKKwl0dXBsZS0+ZHN0LnUudGNwLnBvcnQgPSBvcmlnLT5zcmMudS50Y3AucG9ydDsKKwlyZXR1cm4gMTsKK30KKworLyogUHJpbnQgb3V0IHRoZSBwZXItcHJvdG9jb2wgcGFydCBvZiB0aGUgdHVwbGUuICovCitzdGF0aWMgaW50IHRjcF9wcmludF90dXBsZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCisJCQkgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKK3sKKwlyZXR1cm4gc2VxX3ByaW50ZihzLCAic3BvcnQ9JWh1IGRwb3J0PSVodSAiLAorCQkJICBudG9ocyh0dXBsZS0+c3JjLnUudGNwLnBvcnQpLAorCQkJICBudG9ocyh0dXBsZS0+ZHN0LnUudGNwLnBvcnQpKTsKK30KKworLyogUHJpbnQgb3V0IHRoZSBwcml2YXRlIHBhcnQgb2YgdGhlIGNvbm50cmFjay4gKi8KK3N0YXRpYyBpbnQgdGNwX3ByaW50X2Nvbm50cmFjayhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrKQoreworCWVudW0gdGNwX2Nvbm50cmFjayBzdGF0ZTsKKworCVJFQURfTE9DSygmdGNwX2xvY2spOworCXN0YXRlID0gY29ubnRyYWNrLT5wcm90by50Y3Auc3RhdGU7CisJUkVBRF9VTkxPQ0soJnRjcF9sb2NrKTsKKworCXJldHVybiBzZXFfcHJpbnRmKHMsICIlcyAiLCB0Y3BfY29ubnRyYWNrX25hbWVzW3N0YXRlXSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2Nvbm50cmFja19pbmRleChjb25zdCBzdHJ1Y3QgdGNwaGRyICp0Y3BoKQoreworCWlmICh0Y3BoLT5yc3QpIHJldHVybiBUQ1BfUlNUX1NFVDsKKwllbHNlIGlmICh0Y3BoLT5zeW4pIHJldHVybiAodGNwaC0+YWNrID8gVENQX1NZTkFDS19TRVQgOiBUQ1BfU1lOX1NFVCk7CisJZWxzZSBpZiAodGNwaC0+ZmluKSByZXR1cm4gVENQX0ZJTl9TRVQ7CisJZWxzZSBpZiAodGNwaC0+YWNrKSByZXR1cm4gVENQX0FDS19TRVQ7CisJZWxzZSByZXR1cm4gVENQX05PTkVfU0VUOworfQorCisvKiBUQ1AgY29ubmVjdGlvbiB0cmFja2luZyBiYXNlZCBvbiAnUmVhbCBTdGF0ZWZ1bCBUQ1AgUGFja2V0IEZpbHRlcmluZworICAgaW4gSVAgRmlsdGVyJyBieSBHdWlkbyB2YW4gUm9vaWouCisgICAKKyAgIGh0dHA6Ly93d3cubmx1dWcubmwvZXZlbnRzL3NhbmUyMDAwL3BhcGVycy5odG1sCisgICBodHRwOi8vd3d3LmlhZS5ubC91c2Vycy9ndWlkby9wYXBlcnMvdGNwX2ZpbHRlcmluZy5wcy5negorICAgCisgICBUaGUgYm91bmRhcmllcyBhbmQgdGhlIGNvbmRpdGlvbnMgYXJlIGNoYW5nZWQgYWNjb3JkaW5nIHRvIFJGQzc5MzoKKyAgIHRoZSBwYWNrZXQgbXVzdCBpbnRlcnNlY3QgdGhlIHdpbmRvdyAoaS5lLiBzZWdtZW50cyBtYXkgYmUKKyAgIGFmdGVyIHRoZSByaWdodCBvciBiZWZvcmUgdGhlIGxlZnQgZWRnZSkgYW5kIHRodXMgcmVjZWl2ZXJzIG1heSBBQ0sKKyAgIHNlZ21lbnRzIGFmdGVyIHRoZSByaWdodCBlZGdlIG9mIHRoZSB3aW5kb3cuCisKKyAgIAl0ZF9tYXhlbmQgPSBtYXgoc2FjayArIG1heCh3aW4sMSkpIHNlZW4gaW4gcmVwbHkgcGFja2V0cworCXRkX21heHdpbiA9IG1heChtYXgod2luLCAxKSkgKyAoc2FjayAtIGFjaykgc2VlbiBpbiBzZW50IHBhY2tldHMKKwl0ZF9tYXh3aW4gKz0gc2VxICsgbGVuIC0gc2VuZGVyLnRkX21heGVuZAorCQkJaWYgc2VxICsgbGVuID4gc2VuZGVyLnRkX21heGVuZAorCXRkX2VuZCAgICA9IG1heChzZXEgKyBsZW4pIHNlZW4gaW4gc2VudCBwYWNrZXRzCisgICAKKyAgIEkuICAgVXBwZXIgYm91bmQgZm9yIHZhbGlkIGRhdGE6CXNlcSA8PSBzZW5kZXIudGRfbWF4ZW5kCisgICBJSS4gIExvd2VyIGJvdW5kIGZvciB2YWxpZCBkYXRhOglzZXEgKyBsZW4gPj0gc2VuZGVyLnRkX2VuZCAtIHJlY2VpdmVyLnRkX21heHdpbgorICAgSUlJLglVcHBlciBib3VuZCBmb3IgdmFsaWQgYWNrOiAgICAgIHNhY2sgPD0gcmVjZWl2ZXIudGRfZW5kCisgICBJVi4JTG93ZXIgYm91bmQgZm9yIHZhbGlkIGFjazoJYWNrID49IHJlY2VpdmVyLnRkX2VuZCAtIE1BWEFDS1dJTkRPVworICAgCQorICAgd2hlcmUgc2FjayBpcyB0aGUgaGlnaGVzdCByaWdodCBlZGdlIG9mIHNhY2sgYmxvY2sgZm91bmQgaW4gdGhlIHBhY2tldC4KKyAgIAkKKyAgIFRoZSB1cHBlciBib3VuZCBsaW1pdCBmb3IgYSB2YWxpZCBhY2sgaXMgbm90IGlnbm9yZWQgLSAKKyAgIHdlIGRvZXNuJ3QgaGF2ZSB0byBkZWFsIHdpdGggZnJhZ21lbnRzLiAKKyovCisKK3N0YXRpYyBpbmxpbmUgX191MzIgc2VnbWVudF9zZXFfcGx1c19sZW4oX191MzIgc2VxLAorCQkJCQkgc2l6ZV90IGxlbiwKKwkJCQkJIHN0cnVjdCBpcGhkciAqaXBoLAorCQkJCQkgc3RydWN0IHRjcGhkciAqdGNwaCkKK3sKKwlyZXR1cm4gKHNlcSArIGxlbiAtIChpcGgtPmlobCArIHRjcGgtPmRvZmYpKjQKKwkJKyAodGNwaC0+c3luID8gMSA6IDApICsgKHRjcGgtPmZpbiA/IDEgOiAwKSk7Cit9CisgIAorLyogRml4bWU6IHdoYXQgYWJvdXQgYmlnIHBhY2tldHM/ICovCisjZGVmaW5lIE1BWEFDS1dJTkNPTlNUCQkJNjYwMDAKKyNkZWZpbmUgTUFYQUNLV0lORE9XKHNlbmRlcikJCQkJCQlcCisJKChzZW5kZXIpLT50ZF9tYXh3aW4gPiBNQVhBQ0tXSU5DT05TVCA/IChzZW5kZXIpLT50ZF9tYXh3aW4JXAorCQkJCQkgICAgICA6IE1BWEFDS1dJTkNPTlNUKQorICAKKy8qCisgKiBTaW1wbGlmaWVkIHRjcF9wYXJzZV9vcHRpb25zIHJvdXRpbmUgZnJvbSB0Y3BfaW5wdXQuYworICovCitzdGF0aWMgdm9pZCB0Y3Bfb3B0aW9ucyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJc3RydWN0IGlwaGRyICppcGgsCisJCQlzdHJ1Y3QgdGNwaGRyICp0Y3BoLCAKKwkJCXN0cnVjdCBpcF9jdF90Y3Bfc3RhdGUgKnN0YXRlKQoreworCXVuc2lnbmVkIGNoYXIgYnVmZlsoMTUgKiA0KSAtIHNpemVvZihzdHJ1Y3QgdGNwaGRyKV07CisJdW5zaWduZWQgY2hhciAqcHRyOworCWludCBsZW5ndGggPSAodGNwaC0+ZG9mZio0KSAtIHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKKwkKKwlpZiAoIWxlbmd0aCkKKwkJcmV0dXJuOworCisJcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwKKwkJCQkgKGlwaC0+aWhsICogNCkgKyBzaXplb2Yoc3RydWN0IHRjcGhkciksCisJCQkJIGxlbmd0aCwgYnVmZik7CisJQlVHX09OKHB0ciA9PSBOVUxMKTsKKworCXN0YXRlLT50ZF9zY2FsZSA9IAorCXN0YXRlLT5mbGFncyA9IDA7CisJCisJd2hpbGUgKGxlbmd0aCA+IDApIHsKKwkJaW50IG9wY29kZT0qcHRyKys7CisJCWludCBvcHNpemU7CisJCQorCQlzd2l0Y2ggKG9wY29kZSkgeworCQljYXNlIFRDUE9QVF9FT0w6CisJCQlyZXR1cm47CisJCWNhc2UgVENQT1BUX05PUDoJLyogUmVmOiBSRkMgNzkzIHNlY3Rpb24gMy4xICovCisJCQlsZW5ndGgtLTsKKwkJCWNvbnRpbnVlOworCQlkZWZhdWx0OgorCQkJb3BzaXplPSpwdHIrKzsKKwkJCWlmIChvcHNpemUgPCAyKSAvKiAic2lsbHkgb3B0aW9ucyIgKi8KKwkJCQlyZXR1cm47CisJCQlpZiAob3BzaXplID4gbGVuZ3RoKQorCQkJCWJyZWFrOwkvKiBkb24ndCBwYXJzZSBwYXJ0aWFsIG9wdGlvbnMgKi8KKworCQkJaWYgKG9wY29kZSA9PSBUQ1BPUFRfU0FDS19QRVJNIAorCQkJICAgICYmIG9wc2l6ZSA9PSBUQ1BPTEVOX1NBQ0tfUEVSTSkKKwkJCQlzdGF0ZS0+ZmxhZ3MgfD0gSVBfQ1RfVENQX0ZMQUdfU0FDS19QRVJNOworCQkJZWxzZSBpZiAob3Bjb2RlID09IFRDUE9QVF9XSU5ET1cKKwkJCQkgJiYgb3BzaXplID09IFRDUE9MRU5fV0lORE9XKSB7CisJCQkJc3RhdGUtPnRkX3NjYWxlID0gKih1X2ludDhfdCAqKXB0cjsKKwkJCQkKKwkJCQlpZiAoc3RhdGUtPnRkX3NjYWxlID4gMTQpIHsKKwkJCQkJLyogU2VlIFJGQzEzMjMgKi8KKwkJCQkJc3RhdGUtPnRkX3NjYWxlID0gMTQ7CisJCQkJfQorCQkJCXN0YXRlLT5mbGFncyB8PQorCQkJCQlJUF9DVF9UQ1BfRkxBR19XSU5ET1dfU0NBTEU7CisJCQl9CisJCQlwdHIgKz0gb3BzaXplIC0gMjsKKwkJCWxlbmd0aCAtPSBvcHNpemU7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRjcF9zYWNrKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICAgc3RydWN0IGlwaGRyICppcGgsCisJCSAgICAgc3RydWN0IHRjcGhkciAqdGNwaCwKKwkJICAgICBfX3UzMiAqc2FjaykKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZmZbKDE1ICogNCkgLSBzaXplb2Yoc3RydWN0IHRjcGhkcildOworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKwlpbnQgbGVuZ3RoID0gKHRjcGgtPmRvZmYqNCkgLSBzaXplb2Yoc3RydWN0IHRjcGhkcik7CisJX191MzIgdG1wOworCisJaWYgKCFsZW5ndGgpCisJCXJldHVybjsKKworCXB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsCisJCQkJIChpcGgtPmlobCAqIDQpICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpLAorCQkJCSBsZW5ndGgsIGJ1ZmYpOworCUJVR19PTihwdHIgPT0gTlVMTCk7CisKKwkvKiBGYXN0IHBhdGggZm9yIHRpbWVzdGFtcC1vbmx5IG9wdGlvbiAqLworCWlmIChsZW5ndGggPT0gVENQT0xFTl9UU1RBTVBfQUxJR05FRCo0CisJICAgICYmICooX191MzIgKilwdHIgPT0KKwkgICAgICAgIF9fY29uc3RhbnRfbnRvaGwoKFRDUE9QVF9OT1AgPDwgMjQpIAorCSAgICAgICAgCQkgfCAoVENQT1BUX05PUCA8PCAxNikKKwkgICAgICAgIAkJIHwgKFRDUE9QVF9USU1FU1RBTVAgPDwgOCkKKwkgICAgICAgIAkJIHwgVENQT0xFTl9USU1FU1RBTVApKQorCQlyZXR1cm47CisJCQorCXdoaWxlIChsZW5ndGggPiAwKSB7CisJCWludCBvcGNvZGU9KnB0cisrOworCQlpbnQgb3BzaXplLCBpOworCQkKKwkJc3dpdGNoIChvcGNvZGUpIHsKKwkJY2FzZSBUQ1BPUFRfRU9MOgorCQkJcmV0dXJuOworCQljYXNlIFRDUE9QVF9OT1A6CS8qIFJlZjogUkZDIDc5MyBzZWN0aW9uIDMuMSAqLworCQkJbGVuZ3RoLS07CisJCQljb250aW51ZTsKKwkJZGVmYXVsdDoKKwkJCW9wc2l6ZT0qcHRyKys7CisJCQlpZiAob3BzaXplIDwgMikgLyogInNpbGx5IG9wdGlvbnMiICovCisJCQkJcmV0dXJuOworCQkJaWYgKG9wc2l6ZSA+IGxlbmd0aCkKKwkJCQlicmVhazsJLyogZG9uJ3QgcGFyc2UgcGFydGlhbCBvcHRpb25zICovCisKKwkJCWlmIChvcGNvZGUgPT0gVENQT1BUX1NBQ0sgCisJCQkgICAgJiYgb3BzaXplID49IChUQ1BPTEVOX1NBQ0tfQkFTRSAKKwkJCSAgICAJCSAgKyBUQ1BPTEVOX1NBQ0tfUEVSQkxPQ0spCisJCQkgICAgJiYgISgob3BzaXplIC0gVENQT0xFTl9TQUNLX0JBU0UpIAorCQkJICAgIAkgJSBUQ1BPTEVOX1NBQ0tfUEVSQkxPQ0spKSB7CisJCQkgICAgCWZvciAoaSA9IDA7CisJCQkgICAgCSAgICAgaSA8IChvcHNpemUgLSBUQ1BPTEVOX1NBQ0tfQkFTRSk7CisJCQkgICAgCSAgICAgaSArPSBUQ1BPTEVOX1NBQ0tfUEVSQkxPQ0spIHsKKwkJCQkJdG1wID0gbnRvaGwoKigodV9pbnQzMl90ICopKHB0citpKSsxKSk7CisJCQkJCQorCQkJCQlpZiAoYWZ0ZXIodG1wLCAqc2FjaykpCisJCQkJCQkqc2FjayA9IHRtcDsKKwkJCQl9CisJCQkJcmV0dXJuOworCQkJfQorCQkJcHRyICs9IG9wc2l6ZSAtIDI7CisJCQlsZW5ndGggLT0gb3BzaXplOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHRjcF9pbl93aW5kb3coc3RydWN0IGlwX2N0X3RjcCAqc3RhdGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2RpciBkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlwaGRyICppcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRjcGhkciAqdGNwaCkKK3sKKwlzdHJ1Y3QgaXBfY3RfdGNwX3N0YXRlICpzZW5kZXIgPSAmc3RhdGUtPnNlZW5bZGlyXTsKKwlzdHJ1Y3QgaXBfY3RfdGNwX3N0YXRlICpyZWNlaXZlciA9ICZzdGF0ZS0+c2VlblshZGlyXTsKKwlfX3UzMiBzZXEsIGFjaywgc2FjaywgZW5kLCB3aW4sIHN3aW47CisJaW50IHJlczsKKwkKKwkvKgorCSAqIEdldCB0aGUgcmVxdWlyZWQgZGF0YSBmcm9tIHRoZSBwYWNrZXQuCisJICovCisJc2VxID0gbnRvaGwodGNwaC0+c2VxKTsKKwlhY2sgPSBzYWNrID0gbnRvaGwodGNwaC0+YWNrX3NlcSk7CisJd2luID0gbnRvaHModGNwaC0+d2luZG93KTsKKwllbmQgPSBzZWdtZW50X3NlcV9wbHVzX2xlbihzZXEsIHNrYi0+bGVuLCBpcGgsIHRjcGgpOworCQorCWlmIChyZWNlaXZlci0+ZmxhZ3MgJiBJUF9DVF9UQ1BfRkxBR19TQUNLX1BFUk0pCisJCXRjcF9zYWNrKHNrYiwgaXBoLCB0Y3BoLCAmc2Fjayk7CisJCQorCURFQlVHUCgidGNwX2luX3dpbmRvdzogU1RBUlRcbiIpOworCURFQlVHUCgidGNwX2luX3dpbmRvdzogc3JjPSV1LiV1LiV1LiV1OiVodSBkc3Q9JXUuJXUuJXUuJXU6JWh1ICIKKwkgICAgICAgInNlcT0ldSBhY2s9JXUgc2Fjaz0ldSB3aW49JXUgZW5kPSV1XG4iLAorCQlOSVBRVUFEKGlwaC0+c2FkZHIpLCBudG9ocyh0Y3BoLT5zb3VyY2UpLCAKKwkJTklQUVVBRChpcGgtPmRhZGRyKSwgbnRvaHModGNwaC0+ZGVzdCksCisJCXNlcSwgYWNrLCBzYWNrLCB3aW4sIGVuZCk7CisJREVCVUdQKCJ0Y3BfaW5fd2luZG93OiBzZW5kZXIgZW5kPSV1IG1heGVuZD0ldSBtYXh3aW49JXUgc2NhbGU9JWkgIgorCSAgICAgICAicmVjZWl2ZXIgZW5kPSV1IG1heGVuZD0ldSBtYXh3aW49JXUgc2NhbGU9JWlcbiIsCisJCXNlbmRlci0+dGRfZW5kLCBzZW5kZXItPnRkX21heGVuZCwgc2VuZGVyLT50ZF9tYXh3aW4sCisJCXNlbmRlci0+dGRfc2NhbGUsIAorCQlyZWNlaXZlci0+dGRfZW5kLCByZWNlaXZlci0+dGRfbWF4ZW5kLCByZWNlaXZlci0+dGRfbWF4d2luLCAKKwkJcmVjZWl2ZXItPnRkX3NjYWxlKTsKKwkJCisJaWYgKHNlbmRlci0+dGRfZW5kID09IDApIHsKKwkJLyoKKwkJICogSW5pdGlhbGl6ZSBzZW5kZXIgZGF0YS4KKwkJICovCisJCWlmICh0Y3BoLT5zeW4gJiYgdGNwaC0+YWNrKSB7CisJCQkvKgorCQkJICogT3V0Z29pbmcgU1lOLUFDSyBpbiByZXBseSB0byBhIFNZTi4KKwkJCSAqLworCQkJc2VuZGVyLT50ZF9lbmQgPSAKKwkJCXNlbmRlci0+dGRfbWF4ZW5kID0gZW5kOworCQkJc2VuZGVyLT50ZF9tYXh3aW4gPSAod2luID09IDAgPyAxIDogd2luKTsKKworCQkJdGNwX29wdGlvbnMoc2tiLCBpcGgsIHRjcGgsIHNlbmRlcik7CisJCQkvKiAKKwkJCSAqIFJGQyAxMzIzOgorCQkJICogQm90aCBzaWRlcyBtdXN0IHNlbmQgdGhlIFdpbmRvdyBTY2FsZSBvcHRpb24KKwkJCSAqIHRvIGVuYWJsZSB3aW5kb3cgc2NhbGluZyBpbiBlaXRoZXIgZGlyZWN0aW9uLgorCQkJICovCisJCQlpZiAoIShzZW5kZXItPmZsYWdzICYgSVBfQ1RfVENQX0ZMQUdfV0lORE9XX1NDQUxFCisJCQkgICAgICAmJiByZWNlaXZlci0+ZmxhZ3MgJiBJUF9DVF9UQ1BfRkxBR19XSU5ET1dfU0NBTEUpKQorCQkJCXNlbmRlci0+dGRfc2NhbGUgPSAKKwkJCQlyZWNlaXZlci0+dGRfc2NhbGUgPSAwOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgY29ubmVjdGlvbiwKKwkJCSAqIGl0cyBoaXN0b3J5IGlzIGxvc3QgZm9yIHVzLgorCQkJICogTGV0J3MgdHJ5IHRvIHVzZSB0aGUgZGF0YSBmcm9tIHRoZSBwYWNrZXQuCisJCSAJICovCisJCQlzZW5kZXItPnRkX2VuZCA9IGVuZDsKKwkJCXNlbmRlci0+dGRfbWF4d2luID0gKHdpbiA9PSAwID8gMSA6IHdpbik7CisJCQlzZW5kZXItPnRkX21heGVuZCA9IGVuZCArIHNlbmRlci0+dGRfbWF4d2luOworCQl9CisJfSBlbHNlIGlmICgoKHN0YXRlLT5zdGF0ZSA9PSBUQ1BfQ09OTlRSQUNLX1NZTl9TRU5UCisJCSAgICAgJiYgZGlyID09IElQX0NUX0RJUl9PUklHSU5BTCkKKwkJICAgIHx8IChzdGF0ZS0+c3RhdGUgPT0gVENQX0NPTk5UUkFDS19TWU5fUkVDVgorCQkgICAgICAgICYmIGRpciA9PSBJUF9DVF9ESVJfUkVQTFkpKQorCQkgICAgJiYgYWZ0ZXIoZW5kLCBzZW5kZXItPnRkX2VuZCkpIHsKKwkJLyoKKwkJICogUkZDIDc5MzogImlmIGEgVENQIGlzIHJlaW5pdGlhbGl6ZWQgLi4uIHRoZW4gaXQgbmVlZAorCQkgKiBub3Qgd2FpdCBhdCBhbGw7IGl0IG11c3Qgb25seSBiZSBzdXJlIHRvIHVzZSBzZXF1ZW5jZSAKKwkJICogbnVtYmVycyBsYXJnZXIgdGhhbiB0aG9zZSByZWNlbnRseSB1c2VkLiIKKwkJICovCisJCXNlbmRlci0+dGRfZW5kID0KKwkJc2VuZGVyLT50ZF9tYXhlbmQgPSBlbmQ7CisJCXNlbmRlci0+dGRfbWF4d2luID0gKHdpbiA9PSAwID8gMSA6IHdpbik7CisKKwkJdGNwX29wdGlvbnMoc2tiLCBpcGgsIHRjcGgsIHNlbmRlcik7CisJfQorCQorCWlmICghKHRjcGgtPmFjaykpIHsKKwkJLyoKKwkJICogSWYgdGhlcmUgaXMgbm8gQUNLLCBqdXN0IHByZXRlbmQgaXQgd2FzIHNldCBhbmQgT0suCisJCSAqLworCQlhY2sgPSBzYWNrID0gcmVjZWl2ZXItPnRkX2VuZDsKKwl9IGVsc2UgaWYgKCgodGNwX2ZsYWdfd29yZCh0Y3BoKSAmIChUQ1BfRkxBR19BQ0t8VENQX0ZMQUdfUlNUKSkgPT0gCisJCSAgICAoVENQX0ZMQUdfQUNLfFRDUF9GTEFHX1JTVCkpIAorCQkgICAmJiAoYWNrID09IDApKSB7CisJCS8qCisJCSAqIEJyb2tlbiBUQ1Agc3RhY2tzLCB0aGF0IHNldCBBQ0sgaW4gUlNUIHBhY2tldHMgYXMgd2VsbAorCQkgKiB3aXRoIHplcm8gYWNrIHZhbHVlLgorCQkgKi8KKwkJYWNrID0gc2FjayA9IHJlY2VpdmVyLT50ZF9lbmQ7CisJfQorCisJaWYgKHNlcSA9PSBlbmQKKwkgICAgJiYgKCF0Y3BoLT5yc3QgCisJICAgICAgICB8fCAoc2VxID09IDAgJiYgc3RhdGUtPnN0YXRlID09IFRDUF9DT05OVFJBQ0tfU1lOX1NFTlQpKSkKKwkJLyoKKwkJICogUGFja2V0cyBjb250YWlucyBubyBkYXRhOiB3ZSBhc3N1bWUgaXQgaXMgdmFsaWQKKwkJICogYW5kIGNoZWNrIHRoZSBhY2sgdmFsdWUgb25seS4KKwkJICogSG93ZXZlciBSU1Qgc2VnbWVudHMgYXJlIGFsd2F5cyB2YWxpZGF0ZWQgYnkgdGhlaXIKKwkJICogU0VRIG51bWJlciwgZXhjZXB0IHdoZW4gc2VxID09IDAgKHJlc2V0IHNlbnQgYW5zd2VyaW5nCisJCSAqIFNZTi4KKwkJICovCisJCXNlcSA9IGVuZCA9IHNlbmRlci0+dGRfZW5kOworCQkKKwlERUJVR1AoInRjcF9pbl93aW5kb3c6IHNyYz0ldS4ldS4ldS4ldTolaHUgZHN0PSV1LiV1LiV1LiV1OiVodSAiCisJICAgICAgICJzZXE9JXUgYWNrPSV1IHNhY2sgPSV1IHdpbj0ldSBlbmQ9JXVcbiIsCisJCU5JUFFVQUQoaXBoLT5zYWRkciksIG50b2hzKHRjcGgtPnNvdXJjZSksCisJCU5JUFFVQUQoaXBoLT5kYWRkciksIG50b2hzKHRjcGgtPmRlc3QpLAorCQlzZXEsIGFjaywgc2Fjaywgd2luLCBlbmQpOworCURFQlVHUCgidGNwX2luX3dpbmRvdzogc2VuZGVyIGVuZD0ldSBtYXhlbmQ9JXUgbWF4d2luPSV1IHNjYWxlPSVpICIKKwkgICAgICAgInJlY2VpdmVyIGVuZD0ldSBtYXhlbmQ9JXUgbWF4d2luPSV1IHNjYWxlPSVpXG4iLAorCQlzZW5kZXItPnRkX2VuZCwgc2VuZGVyLT50ZF9tYXhlbmQsIHNlbmRlci0+dGRfbWF4d2luLAorCQlzZW5kZXItPnRkX3NjYWxlLCAKKwkJcmVjZWl2ZXItPnRkX2VuZCwgcmVjZWl2ZXItPnRkX21heGVuZCwgcmVjZWl2ZXItPnRkX21heHdpbiwKKwkJcmVjZWl2ZXItPnRkX3NjYWxlKTsKKwkKKwlERUJVR1AoInRjcF9pbl93aW5kb3c6IEk9JWkgSUk9JWkgSUlJPSVpIElWPSVpXG4iLAorCQliZWZvcmUoc2VxLCBzZW5kZXItPnRkX21heGVuZCArIDEpLAorCSAgICAJYWZ0ZXIoZW5kLCBzZW5kZXItPnRkX2VuZCAtIHJlY2VpdmVyLT50ZF9tYXh3aW4gLSAxKSwKKwkgICAgCWJlZm9yZShzYWNrLCByZWNlaXZlci0+dGRfZW5kICsgMSksCisJICAgIAlhZnRlcihhY2ssIHJlY2VpdmVyLT50ZF9lbmQgLSBNQVhBQ0tXSU5ET1coc2VuZGVyKSkpOworCQorCWlmIChzZW5kZXItPmxvb3NlIHx8IHJlY2VpdmVyLT5sb29zZSB8fAorCSAgICAoYmVmb3JlKHNlcSwgc2VuZGVyLT50ZF9tYXhlbmQgKyAxKSAmJgorCSAgICAgYWZ0ZXIoZW5kLCBzZW5kZXItPnRkX2VuZCAtIHJlY2VpdmVyLT50ZF9tYXh3aW4gLSAxKSAmJgorCSAgICAgYmVmb3JlKHNhY2ssIHJlY2VpdmVyLT50ZF9lbmQgKyAxKSAmJgorCSAgICAgYWZ0ZXIoYWNrLCByZWNlaXZlci0+dGRfZW5kIC0gTUFYQUNLV0lORE9XKHNlbmRlcikpKSkgeworCSAgICAJLyoKKwkJICogVGFrZSBpbnRvIGFjY291bnQgd2luZG93IHNjYWxpbmcgKFJGQyAxMzIzKS4KKwkJICovCisJCWlmICghdGNwaC0+c3luKQorCQkJd2luIDw8PSBzZW5kZXItPnRkX3NjYWxlOworCQkKKwkJLyoKKwkJICogVXBkYXRlIHNlbmRlciBkYXRhLgorCQkgKi8KKwkJc3dpbiA9IHdpbiArIChzYWNrIC0gYWNrKTsKKwkJaWYgKHNlbmRlci0+dGRfbWF4d2luIDwgc3dpbikKKwkJCXNlbmRlci0+dGRfbWF4d2luID0gc3dpbjsKKwkJaWYgKGFmdGVyKGVuZCwgc2VuZGVyLT50ZF9lbmQpKQorCQkJc2VuZGVyLT50ZF9lbmQgPSBlbmQ7CisJCS8qCisJCSAqIFVwZGF0ZSByZWNlaXZlciBkYXRhLgorCQkgKi8KKwkJaWYgKGFmdGVyKGVuZCwgc2VuZGVyLT50ZF9tYXhlbmQpKQorCQkJcmVjZWl2ZXItPnRkX21heHdpbiArPSBlbmQgLSBzZW5kZXItPnRkX21heGVuZDsKKwkJaWYgKGFmdGVyKHNhY2sgKyB3aW4sIHJlY2VpdmVyLT50ZF9tYXhlbmQgLSAxKSkgeworCQkJcmVjZWl2ZXItPnRkX21heGVuZCA9IHNhY2sgKyB3aW47CisJCQlpZiAod2luID09IDApCisJCQkJcmVjZWl2ZXItPnRkX21heGVuZCsrOworCQl9CisKKwkJLyogCisJCSAqIENoZWNrIHJldHJhbnNtaXNzaW9ucy4KKwkJICovCisJCWlmIChpbmRleCA9PSBUQ1BfQUNLX1NFVCkgeworCQkJaWYgKHN0YXRlLT5sYXN0X2RpciA9PSBkaXIKKwkJCSAgICAmJiBzdGF0ZS0+bGFzdF9zZXEgPT0gc2VxCisJCQkgICAgJiYgc3RhdGUtPmxhc3RfYWNrID09IGFjaworCQkJICAgICYmIHN0YXRlLT5sYXN0X2VuZCA9PSBlbmQpCisJCQkJc3RhdGUtPnJldHJhbnMrKzsKKwkJCWVsc2UgeworCQkJCXN0YXRlLT5sYXN0X2RpciA9IGRpcjsKKwkJCQlzdGF0ZS0+bGFzdF9zZXEgPSBzZXE7CisJCQkJc3RhdGUtPmxhc3RfYWNrID0gYWNrOworCQkJCXN0YXRlLT5sYXN0X2VuZCA9IGVuZDsKKwkJCQlzdGF0ZS0+cmV0cmFucyA9IDA7CisJCQl9CisJCX0KKwkJLyoKKwkJICogQ2xvc2UgdGhlIHdpbmRvdyBvZiBkaXNhYmxlZCB3aW5kb3cgdHJhY2tpbmcgOi0pCisJCSAqLworCQlpZiAoc2VuZGVyLT5sb29zZSkKKwkJCXNlbmRlci0+bG9vc2UtLTsKKwkJCisJCXJlcyA9IDE7CisJfSBlbHNlIHsKKwkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fVENQKSkKKwkJCW5mX2xvZ19wYWNrZXQoUEZfSU5FVCwgMCwgc2tiLCBOVUxMLCBOVUxMLAorCQkJImlwX2N0X3RjcDogJXMgIiwKKwkJCWJlZm9yZShzZXEsIHNlbmRlci0+dGRfbWF4ZW5kICsgMSkgPworCQkJYWZ0ZXIoZW5kLCBzZW5kZXItPnRkX2VuZCAtIHJlY2VpdmVyLT50ZF9tYXh3aW4gLSAxKSA/CisJCQliZWZvcmUoc2FjaywgcmVjZWl2ZXItPnRkX2VuZCArIDEpID8KKwkJCWFmdGVyKGFjaywgcmVjZWl2ZXItPnRkX2VuZCAtIE1BWEFDS1dJTkRPVyhzZW5kZXIpKSA/ICJCVUciCisJCQk6ICJBQ0sgaXMgdW5kZXIgdGhlIGxvd2VyIGJvdW5kIChwb3NzaWJsZSBvdmVybHkgZGVsYXllZCBBQ0spIgorCQkJOiAiQUNLIGlzIG92ZXIgdGhlIHVwcGVyIGJvdW5kIChBQ0tlZCBkYXRhIG5vdCBzZWVuIHlldCkiCisJCQk6ICJTRVEgaXMgdW5kZXIgdGhlIGxvd2VyIGJvdW5kIChhbHJlYWR5IEFDS2VkIGRhdGEgcmV0cmFuc21pdHRlZCkiCisJCQk6ICJTRVEgaXMgb3ZlciB0aGUgdXBwZXIgYm91bmQgKG92ZXIgdGhlIHdpbmRvdyBvZiB0aGUgcmVjZWl2ZXIpIik7CisKKwkJcmVzID0gaXBfY3RfdGNwX2JlX2xpYmVyYWw7CisgIAl9CisgIAorCURFQlVHUCgidGNwX2luX3dpbmRvdzogcmVzPSVpIHNlbmRlciBlbmQ9JXUgbWF4ZW5kPSV1IG1heHdpbj0ldSAiCisJICAgICAgICJyZWNlaXZlciBlbmQ9JXUgbWF4ZW5kPSV1IG1heHdpbj0ldVxuIiwKKwkJcmVzLCBzZW5kZXItPnRkX2VuZCwgc2VuZGVyLT50ZF9tYXhlbmQsIHNlbmRlci0+dGRfbWF4d2luLCAKKwkJcmVjZWl2ZXItPnRkX2VuZCwgcmVjZWl2ZXItPnRkX21heGVuZCwgcmVjZWl2ZXItPnRkX21heHdpbik7CisKKwlyZXR1cm4gcmVzOworfQorCisjaWZkZWYgQ09ORklHX0lQX05GX05BVF9ORUVERUQKKy8qIFVwZGF0ZSBzZW5kZXItPnRkX2VuZCBhZnRlciBOQVQgc3VjY2Vzc2Z1bGx5IG1hbmdsZWQgdGhlIHBhY2tldCAqLwordm9pZCBpcF9jb25udHJhY2tfdGNwX3VwZGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2ssIAorCQkJICAgICBlbnVtIGlwX2Nvbm50cmFja19kaXIgZGlyKQoreworCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisJc3RydWN0IHRjcGhkciAqdGNwaCA9ICh2b2lkICopc2tiLT5uaC5pcGggKyBza2ItPm5oLmlwaC0+aWhsKjQ7CisJX191MzIgZW5kOworI2lmZGVmIERFQlVHUF9WQVJTCisJc3RydWN0IGlwX2N0X3RjcF9zdGF0ZSAqc2VuZGVyID0gJmNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bZGlyXTsKKwlzdHJ1Y3QgaXBfY3RfdGNwX3N0YXRlICpyZWNlaXZlciA9ICZjb25udHJhY2stPnByb3RvLnRjcC5zZWVuWyFkaXJdOworI2VuZGlmCisKKwllbmQgPSBzZWdtZW50X3NlcV9wbHVzX2xlbihudG9obCh0Y3BoLT5zZXEpLCBza2ItPmxlbiwgaXBoLCB0Y3BoKTsKKwkKKwlXUklURV9MT0NLKCZ0Y3BfbG9jayk7CisJLyoKKwkgKiBXZSBoYXZlIHRvIHdvcnJ5IGZvciB0aGUgYWNrIGluIHRoZSByZXBseSBwYWNrZXQgb25seS4uLgorCSAqLworCWlmIChhZnRlcihlbmQsIGNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bZGlyXS50ZF9lbmQpKQorCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuW2Rpcl0udGRfZW5kID0gZW5kOworCWNvbm50cmFjay0+cHJvdG8udGNwLmxhc3RfZW5kID0gZW5kOworCVdSSVRFX1VOTE9DSygmdGNwX2xvY2spOworCURFQlVHUCgidGNwX3VwZGF0ZTogc2VuZGVyIGVuZD0ldSBtYXhlbmQ9JXUgbWF4d2luPSV1IHNjYWxlPSVpICIKKwkgICAgICAgInJlY2VpdmVyIGVuZD0ldSBtYXhlbmQ9JXUgbWF4d2luPSV1IHNjYWxlPSVpXG4iLAorCQlzZW5kZXItPnRkX2VuZCwgc2VuZGVyLT50ZF9tYXhlbmQsIHNlbmRlci0+dGRfbWF4d2luLAorCQlzZW5kZXItPnRkX3NjYWxlLCAKKwkJcmVjZWl2ZXItPnRkX2VuZCwgcmVjZWl2ZXItPnRkX21heGVuZCwgcmVjZWl2ZXItPnRkX21heHdpbiwKKwkJcmVjZWl2ZXItPnRkX3NjYWxlKTsKK30KKyAKKyNlbmRpZgorCisjZGVmaW5lCVRIX0ZJTgkweDAxCisjZGVmaW5lCVRIX1NZTgkweDAyCisjZGVmaW5lCVRIX1JTVAkweDA0CisjZGVmaW5lCVRIX1BVU0gJMHgwOAorI2RlZmluZQlUSF9BQ0sJMHgxMAorI2RlZmluZQlUSF9VUkcJMHgyMAorI2RlZmluZQlUSF9FQ0UJMHg0MAorI2RlZmluZQlUSF9DV1IJMHg4MAorCisvKiB0YWJsZSBvZiB2YWxpZCBmbGFnIGNvbWJpbmF0aW9ucyAtIEVDRSBhbmQgQ1dSIGFyZSBhbHdheXMgdmFsaWQgKi8KK3N0YXRpYyB1OCB0Y3BfdmFsaWRfZmxhZ3NbKFRIX0ZJTnxUSF9TWU58VEhfUlNUfFRIX1BVU0h8VEhfQUNLfFRIX1VSRykgKyAxXSA9Cit7CisJW1RIX1NZTl0JCQk9IDEsCisJW1RIX1NZTnxUSF9BQ0tdCQkJPSAxLAorCVtUSF9SU1RdCQkJPSAxLAorCVtUSF9SU1R8VEhfQUNLXQkJCT0gMSwKKwlbVEhfUlNUfFRIX0FDS3xUSF9QVVNIXQkJPSAxLAorCVtUSF9GSU58VEhfQUNLXQkJCT0gMSwKKwlbVEhfQUNLXQkJCT0gMSwKKwlbVEhfQUNLfFRIX1BVU0hdCQk9IDEsCisJW1RIX0FDS3xUSF9VUkddCQkJPSAxLAorCVtUSF9BQ0t8VEhfVVJHfFRIX1BVU0hdCQk9IDEsCisJW1RIX0ZJTnxUSF9BQ0t8VEhfUFVTSF0JCT0gMSwKKwlbVEhfRklOfFRIX0FDS3xUSF9VUkddCQk9IDEsCisJW1RIX0ZJTnxUSF9BQ0t8VEhfVVJHfFRIX1BVU0hdCT0gMSwKK307CisKKy8qIFByb3RlY3QgY29ubnRyYWNrIGFnYWlzdCBicm9rZW4gcGFja2V0cy4gQ29kZSB0YWtlbiBmcm9tIGlwdF91bmNsZWFuLmMuICAqLworc3RhdGljIGludCB0Y3BfZXJyb3Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvICpjdGluZm8sCisJCSAgICAgdW5zaWduZWQgaW50IGhvb2tudW0pCit7CisJc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGg7CisJdW5zaWduZWQgaW50IHRjcGxlbiA9IHNrYi0+bGVuIC0gaXBoLT5paGwgKiA0OworCXVfaW50OF90IHRjcGZsYWdzOworCisJLyogU21hbGxlciB0aGF0IG1pbmltYWwgVENQIGhlYWRlcj8gKi8KKwl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlwaC0+aWhsICogNCwKKwkJCQlzaXplb2YoX3RjcGgpLCAmX3RjcGgpOworCWlmICh0aCA9PSBOVUxMKSB7CisJCWlmIChMT0dfSU5WQUxJRChJUFBST1RPX1RDUCkpCisJCQluZl9sb2dfcGFja2V0KFBGX0lORVQsIDAsIHNrYiwgTlVMTCwgTlVMTCwgCisJCQkJImlwX2N0X3RjcDogc2hvcnQgcGFja2V0ICIpOworCQlyZXR1cm4gLU5GX0FDQ0VQVDsKKyAgCX0KKyAgCisJLyogTm90IHdob2xlIFRDUCBoZWFkZXIgb3IgbWFsZm9ybWVkIHBhY2tldCAqLworCWlmICh0aC0+ZG9mZio0IDwgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpIHx8IHRjcGxlbiA8IHRoLT5kb2ZmKjQpIHsKKwkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fVENQKSkKKwkJCW5mX2xvZ19wYWNrZXQoUEZfSU5FVCwgMCwgc2tiLCBOVUxMLCBOVUxMLCAKKwkJCQkiaXBfY3RfdGNwOiB0cnVuY2F0ZWQvbWFsZm9ybWVkIHBhY2tldCAiKTsKKwkJcmV0dXJuIC1ORl9BQ0NFUFQ7CisJfQorICAKKwkvKiBDaGVja3N1bSBpbnZhbGlkPyBJZ25vcmUuCisJICogV2Ugc2tpcCBjaGVja2luZyBwYWNrZXRzIG9uIHRoZSBvdXRnb2luZyBwYXRoCisJICogYmVjYXVzZSB0aGUgc2VtYW50aWMgb2YgQ0hFQ0tTVU1fSFcgaXMgZGlmZmVyZW50IHRoZXJlIAorCSAqIGFuZCBtb3Jlb3ZlciByb290IG1pZ2h0IHNlbmQgcmF3IHBhY2tldHMuCisJICovCisJLyogRklYTUU6IFNvdXJjZSByb3V0ZSBJUCBvcHRpb24gcGFja2V0cyAtLVJSICovCisJaWYgKGhvb2tudW0gPT0gTkZfSVBfUFJFX1JPVVRJTkcKKwkgICAgJiYgY3N1bV90Y3B1ZHBfbWFnaWMoaXBoLT5zYWRkciwgaXBoLT5kYWRkciwgdGNwbGVuLCBJUFBST1RPX1RDUCwKKwkJCSAgICAgICAgIHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXID8gc2tiLT5jc3VtCisJCQkgICAgICAJIDogc2tiX2NoZWNrc3VtKHNrYiwgaXBoLT5paGwqNCwgdGNwbGVuLCAwKSkpIHsKKwkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fVENQKSkKKwkJCW5mX2xvZ19wYWNrZXQoUEZfSU5FVCwgMCwgc2tiLCBOVUxMLCBOVUxMLCAKKwkJCQkgICJpcF9jdF90Y3A6IGJhZCBUQ1AgY2hlY2tzdW0gIik7CisJCXJldHVybiAtTkZfQUNDRVBUOworCX0KKworCS8qIENoZWNrIFRDUCBmbGFncy4gKi8KKwl0Y3BmbGFncyA9ICgoKHVfaW50OF90ICopdGgpWzEzXSAmIH4oVEhfRUNFfFRIX0NXUikpOworCWlmICghdGNwX3ZhbGlkX2ZsYWdzW3RjcGZsYWdzXSkgeworCQlpZiAoTE9HX0lOVkFMSUQoSVBQUk9UT19UQ1ApKQorCQkJbmZfbG9nX3BhY2tldChQRl9JTkVULCAwLCBza2IsIE5VTEwsIE5VTEwsIAorCQkJCSAgImlwX2N0X3RjcDogaW52YWxpZCBUQ1AgZmxhZyBjb21iaW5hdGlvbiAiKTsKKwkJcmV0dXJuIC1ORl9BQ0NFUFQ7CisJfQorCisJcmV0dXJuIE5GX0FDQ0VQVDsKK30KKworLyogUmV0dXJucyB2ZXJkaWN0IGZvciBwYWNrZXQsIG9yIC0xIGZvciBpbnZhbGlkLiAqLworc3RhdGljIGludCB0Y3BfcGFja2V0KHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaywKKwkJICAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCit7CisJZW51bSB0Y3BfY29ubnRyYWNrIG5ld19zdGF0ZSwgb2xkX3N0YXRlOworCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXI7CisJc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgdGNwaGRyICp0aCwgX3RjcGg7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXVuc2lnbmVkIGludCBpbmRleDsKKwkKKwl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlwaC0+aWhsICogNCwKKwkJCQlzaXplb2YoX3RjcGgpLCAmX3RjcGgpOworCUJVR19PTih0aCA9PSBOVUxMKTsKKwkKKwlXUklURV9MT0NLKCZ0Y3BfbG9jayk7CisJb2xkX3N0YXRlID0gY29ubnRyYWNrLT5wcm90by50Y3Auc3RhdGU7CisJZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOworCWluZGV4ID0gZ2V0X2Nvbm50cmFja19pbmRleCh0aCk7CisJbmV3X3N0YXRlID0gdGNwX2Nvbm50cmFja3NbZGlyXVtpbmRleF1bb2xkX3N0YXRlXTsKKworCXN3aXRjaCAobmV3X3N0YXRlKSB7CisJY2FzZSBUQ1BfQ09OTlRSQUNLX0lHTk9SRToKKwkJLyogRWl0aGVyIFNZTiBpbiBPUklHSU5BTAorCQkgKiBvciBTWU4vQUNLIGluIFJFUExZLiAqLworCQlpZiAoaW5kZXggPT0gVENQX1NZTkFDS19TRVQKKwkJICAgICYmIGNvbm50cmFjay0+cHJvdG8udGNwLmxhc3RfaW5kZXggPT0gVENQX1NZTl9TRVQKKwkJICAgICYmIGNvbm50cmFjay0+cHJvdG8udGNwLmxhc3RfZGlyICE9IGRpcgorCQkgICAgJiYgbnRvaGwodGgtPmFja19zZXEpID09CisJCSAgICAJICAgICBjb25udHJhY2stPnByb3RvLnRjcC5sYXN0X2VuZCkgeworCQkJLyogVGhpcyBTWU4vQUNLIGFja25vd2xlZGdlcyBhIFNZTiB0aGF0IHdlIGVhcmxpZXIgCisJCQkgKiBpZ25vcmVkIGFzIGludmFsaWQuIFRoaXMgbWVhbnMgdGhhdCB0aGUgY2xpZW50IGFuZAorCQkJICogdGhlIHNlcnZlciBhcmUgYm90aCBpbiBzeW5jLCB3aGlsZSB0aGUgZmlyZXdhbGwgaXMKKwkJCSAqIG5vdC4gV2Uga2lsbCB0aGlzIHNlc3Npb24gYW5kIGJsb2NrIHRoZSBTWU4vQUNLIHNvCisJCQkgKiB0aGF0IHRoZSBjbGllbnQgY2Fubm90IGJ1dCByZXRyYW5zbWl0IGl0cyBTWU4gYW5kIAorCQkJICogdGh1cyBpbml0aWF0ZSBhIGNsZWFuIG5ldyBzZXNzaW9uLgorCQkJICovCisJCSAgICAJV1JJVEVfVU5MT0NLKCZ0Y3BfbG9jayk7CisJCQlpZiAoTE9HX0lOVkFMSUQoSVBQUk9UT19UQ1ApKQorCQkJCW5mX2xvZ19wYWNrZXQoUEZfSU5FVCwgMCwgc2tiLCBOVUxMLCBOVUxMLCAKKwkJCQkJICAiaXBfY3RfdGNwOiBraWxsaW5nIG91dCBvZiBzeW5jIHNlc3Npb24gIik7CisJCSAgICAJaWYgKGRlbF90aW1lcigmY29ubnRyYWNrLT50aW1lb3V0KSkKKwkJICAgIAkJY29ubnRyYWNrLT50aW1lb3V0LmZ1bmN0aW9uKCh1bnNpZ25lZCBsb25nKQorCQkgICAgCQkJCQkgICAgY29ubnRyYWNrKTsKKwkJICAgIAlyZXR1cm4gLU5GX0RST1A7CisJCX0KKwkJY29ubnRyYWNrLT5wcm90by50Y3AubGFzdF9pbmRleCA9IGluZGV4OworCQljb25udHJhY2stPnByb3RvLnRjcC5sYXN0X2RpciA9IGRpcjsKKwkJY29ubnRyYWNrLT5wcm90by50Y3AubGFzdF9zZXEgPSBudG9obCh0aC0+c2VxKTsKKwkJY29ubnRyYWNrLT5wcm90by50Y3AubGFzdF9lbmQgPSAKKwkJICAgIHNlZ21lbnRfc2VxX3BsdXNfbGVuKG50b2hsKHRoLT5zZXEpLCBza2ItPmxlbiwgaXBoLCB0aCk7CisJCQorCQlXUklURV9VTkxPQ0soJnRjcF9sb2NrKTsKKwkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fVENQKSkKKwkJCW5mX2xvZ19wYWNrZXQoUEZfSU5FVCwgMCwgc2tiLCBOVUxMLCBOVUxMLCAKKwkJCQkgICJpcF9jdF90Y3A6IGludmFsaWQgcGFja2V0IGlnbm9yZWQgIik7CisJCXJldHVybiBORl9BQ0NFUFQ7CisJY2FzZSBUQ1BfQ09OTlRSQUNLX01BWDoKKwkJLyogSW52YWxpZCBwYWNrZXQgKi8KKwkJREVCVUdQKCJpcF9jdF90Y3A6IEludmFsaWQgZGlyPSVpIGluZGV4PSV1IG9zdGF0ZT0ldVxuIiwKKwkJICAgICAgIGRpciwgZ2V0X2Nvbm50cmFja19pbmRleCh0aCksCisJCSAgICAgICBvbGRfc3RhdGUpOworCQlXUklURV9VTkxPQ0soJnRjcF9sb2NrKTsKKwkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fVENQKSkKKwkJCW5mX2xvZ19wYWNrZXQoUEZfSU5FVCwgMCwgc2tiLCBOVUxMLCBOVUxMLCAKKwkJCQkgICJpcF9jdF90Y3A6IGludmFsaWQgc3RhdGUgIik7CisJCXJldHVybiAtTkZfQUNDRVBUOworCWNhc2UgVENQX0NPTk5UUkFDS19TWU5fU0VOVDoKKwkJaWYgKG9sZF9zdGF0ZSA8IFRDUF9DT05OVFJBQ0tfVElNRV9XQUlUKQorCQkJYnJlYWs7CisJCWlmICgoY29ubnRyYWNrLT5wcm90by50Y3Auc2VlbltkaXJdLmZsYWdzICYKKwkJICAgICAgICAgSVBfQ1RfVENQX0ZMQUdfQ0xPU0VfSU5JVCkKKwkJICAgIHx8IGFmdGVyKG50b2hsKHRoLT5zZXEpLAorCQkgICAgCSAgICAgY29ubnRyYWNrLT5wcm90by50Y3Auc2VlbltkaXJdLnRkX2VuZCkpIHsJCisJCSAgICAJLyogQXR0ZW1wdCB0byByZW9wZW4gYSBjbG9zZWQgY29ubmVjdGlvbi4KKwkJICAgIAkqIERlbGV0ZSB0aGlzIGNvbm5lY3Rpb24gYW5kIGxvb2sgdXAgYWdhaW4uICovCisJCSAgICAJV1JJVEVfVU5MT0NLKCZ0Y3BfbG9jayk7CisJCSAgICAJaWYgKGRlbF90aW1lcigmY29ubnRyYWNrLT50aW1lb3V0KSkKKwkJICAgIAkJY29ubnRyYWNrLT50aW1lb3V0LmZ1bmN0aW9uKCh1bnNpZ25lZCBsb25nKQorCQkgICAgCQkJCQkgICAgY29ubnRyYWNrKTsKKwkJICAgIAlyZXR1cm4gLU5GX1JFUEVBVDsKKwkJfSBlbHNlIHsKKwkJCVdSSVRFX1VOTE9DSygmdGNwX2xvY2spOworCQkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fVENQKSkKKwkJCQluZl9sb2dfcGFja2V0KFBGX0lORVQsIDAsIHNrYiwgTlVMTCwgTlVMTCwKKwkJCQkgICAgICAgICAgICAgICJpcF9jdF90Y3A6IGludmFsaWQgU1lOIik7CisJCQlyZXR1cm4gLU5GX0FDQ0VQVDsKKwkJfQorCWNhc2UgVENQX0NPTk5UUkFDS19DTE9TRToKKwkJaWYgKGluZGV4ID09IFRDUF9SU1RfU0VUCisJCSAgICAmJiB0ZXN0X2JpdChJUFNfU0VFTl9SRVBMWV9CSVQsICZjb25udHJhY2stPnN0YXR1cykKKwkJICAgICYmIGNvbm50cmFjay0+cHJvdG8udGNwLmxhc3RfaW5kZXggPT0gVENQX1NZTl9TRVQKKwkJICAgICYmIG50b2hsKHRoLT5hY2tfc2VxKSA9PSBjb25udHJhY2stPnByb3RvLnRjcC5sYXN0X2VuZCkgeworCQkJLyogUlNUIHNlbnQgdG8gaW52YWxpZCBTWU4gd2UgaGFkIGxldCB0cm91Z2gKKwkJCSAqIFNZTiB3YXMgaW4gd2luZG93IHRoZW4sIHRlYXIgZG93biBjb25uZWN0aW9uLgorCQkJICogV2Ugc2tpcCB3aW5kb3cgY2hlY2tpbmcsIGJlY2F1c2UgcGFja2V0IG1pZ2h0IEFDSworCQkJICogc2VnbWVudHMgd2UgaWdub3JlZCBpbiB0aGUgU1lOLiAqLworCQkJZ290byBpbl93aW5kb3c7CisJCX0KKwkJLyogSnVzdCBmYWxsIHRyb3VnaCAqLworCWRlZmF1bHQ6CisJCS8qIEtlZXAgY29tcGlsZXJzIGhhcHB5LiAqLworCQlicmVhazsKKwl9CisKKwlpZiAoIXRjcF9pbl93aW5kb3coJmNvbm50cmFjay0+cHJvdG8udGNwLCBkaXIsIGluZGV4LCAKKwkJCSAgIHNrYiwgaXBoLCB0aCkpIHsKKwkJV1JJVEVfVU5MT0NLKCZ0Y3BfbG9jayk7CisJCXJldHVybiAtTkZfQUNDRVBUOworCX0KKyAgICBpbl93aW5kb3c6CisJLyogRnJvbSBub3cgb24gd2UgaGF2ZSBnb3QgaW4td2luZG93IHBhY2tldHMgKi8JCisJY29ubnRyYWNrLT5wcm90by50Y3AubGFzdF9pbmRleCA9IGluZGV4OworCisJREVCVUdQKCJ0Y3BfY29ubnRyYWNrczogc3JjPSV1LiV1LiV1LiV1OiVodSBkc3Q9JXUuJXUuJXUuJXU6JWh1ICIKKwkgICAgICAgInN5bj0laSBhY2s9JWkgZmluPSVpIHJzdD0laSBvbGQ9JWkgbmV3PSVpXG4iLAorCQlOSVBRVUFEKGlwaC0+c2FkZHIpLCBudG9ocyh0aC0+c291cmNlKSwKKwkJTklQUVVBRChpcGgtPmRhZGRyKSwgbnRvaHModGgtPmRlc3QpLAorCQkodGgtPnN5biA/IDEgOiAwKSwgKHRoLT5hY2sgPyAxIDogMCksCisJCSh0aC0+ZmluID8gMSA6IDApLCAodGgtPnJzdCA/IDEgOiAwKSwKKwkJb2xkX3N0YXRlLCBuZXdfc3RhdGUpOworCisJY29ubnRyYWNrLT5wcm90by50Y3Auc3RhdGUgPSBuZXdfc3RhdGU7CisJaWYgKG9sZF9zdGF0ZSAhPSBuZXdfc3RhdGUgCisJICAgICYmIChuZXdfc3RhdGUgPT0gVENQX0NPTk5UUkFDS19GSU5fV0FJVAorCSAgICAJfHwgbmV3X3N0YXRlID09IFRDUF9DT05OVFJBQ0tfQ0xPU0UpKQorCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuW2Rpcl0uZmxhZ3MgfD0gSVBfQ1RfVENQX0ZMQUdfQ0xPU0VfSU5JVDsKKwl0aW1lb3V0ID0gY29ubnRyYWNrLT5wcm90by50Y3AucmV0cmFucyA+PSBpcF9jdF90Y3BfbWF4X3JldHJhbnMKKwkJICAmJiAqdGNwX3RpbWVvdXRzW25ld19zdGF0ZV0gPiBpcF9jdF90Y3BfdGltZW91dF9tYXhfcmV0cmFucworCQkgID8gaXBfY3RfdGNwX3RpbWVvdXRfbWF4X3JldHJhbnMgOiAqdGNwX3RpbWVvdXRzW25ld19zdGF0ZV07CisJV1JJVEVfVU5MT0NLKCZ0Y3BfbG9jayk7CisKKwlpZiAoIXRlc3RfYml0KElQU19TRUVOX1JFUExZX0JJVCwgJmNvbm50cmFjay0+c3RhdHVzKSkgeworCQkvKiBJZiBvbmx5IHJlcGx5IGlzIGEgUlNULCB3ZSBjYW4gY29uc2lkZXIgb3Vyc2VsdmVzIG5vdCB0bworCQkgICBoYXZlIGFuIGVzdGFibGlzaGVkIGNvbm5lY3Rpb246IHRoaXMgaXMgYSBmYWlybHkgY29tbW9uCisJCSAgIHByb2JsZW0gY2FzZSwgc28gd2UgY2FuIGRlbGV0ZSB0aGUgY29ubnRyYWNrCisJCSAgIGltbWVkaWF0ZWx5LiAgLS1SUiAqLworCQlpZiAodGgtPnJzdCkgeworCQkJaWYgKGRlbF90aW1lcigmY29ubnRyYWNrLT50aW1lb3V0KSkKKwkJCQljb25udHJhY2stPnRpbWVvdXQuZnVuY3Rpb24oKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkJICAgIGNvbm50cmFjayk7CisJCQlyZXR1cm4gTkZfQUNDRVBUOworCQl9CisJfSBlbHNlIGlmICghdGVzdF9iaXQoSVBTX0FTU1VSRURfQklULCAmY29ubnRyYWNrLT5zdGF0dXMpCisJCSAgICYmIChvbGRfc3RhdGUgPT0gVENQX0NPTk5UUkFDS19TWU5fUkVDVgorCQkgICAgICAgfHwgb2xkX3N0YXRlID09IFRDUF9DT05OVFJBQ0tfRVNUQUJMSVNIRUQpCisJCSAgICYmIG5ld19zdGF0ZSA9PSBUQ1BfQ09OTlRSQUNLX0VTVEFCTElTSEVEKSB7CisJCS8qIFNldCBBU1NVUkVEIGlmIHdlIHNlZSBzZWUgdmFsaWQgYWNrIGluIEVTVEFCTElTSEVEIAorCQkgICBhZnRlciBTWU5fUkVDViBvciBhIHZhbGlkIGFuc3dlciBmb3IgYSBwaWNrZWQgdXAgCisJCSAgIGNvbm5lY3Rpb24uICovCisJCQlzZXRfYml0KElQU19BU1NVUkVEX0JJVCwgJmNvbm50cmFjay0+c3RhdHVzKTsKKwl9CisJaXBfY3RfcmVmcmVzaF9hY2N0KGNvbm50cmFjaywgY3RpbmZvLCBza2IsIHRpbWVvdXQpOworCisJcmV0dXJuIE5GX0FDQ0VQVDsKK30KKyAKKy8qIENhbGxlZCB3aGVuIGEgbmV3IGNvbm5lY3Rpb24gZm9yIHRoaXMgcHJvdG9jb2wgZm91bmQuICovCitzdGF0aWMgaW50IHRjcF9uZXcoc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAorCQkgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWVudW0gdGNwX2Nvbm50cmFjayBuZXdfc3RhdGU7CisJc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgdGNwaGRyICp0aCwgX3RjcGg7CisjaWZkZWYgREVCVUdQX1ZBUlMKKwlzdHJ1Y3QgaXBfY3RfdGNwX3N0YXRlICpzZW5kZXIgPSAmY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXTsKKwlzdHJ1Y3QgaXBfY3RfdGNwX3N0YXRlICpyZWNlaXZlciA9ICZjb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzFdOworI2VuZGlmCisKKwl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlwaC0+aWhsICogNCwKKwkJCQlzaXplb2YoX3RjcGgpLCAmX3RjcGgpOworCUJVR19PTih0aCA9PSBOVUxMKTsKKwkKKwkvKiBEb24ndCBuZWVkIGxvY2sgaGVyZTogdGhpcyBjb25udHJhY2sgbm90IGluIGNpcmN1bGF0aW9uIHlldCAqLworCW5ld19zdGF0ZQorCQk9IHRjcF9jb25udHJhY2tzWzBdW2dldF9jb25udHJhY2tfaW5kZXgodGgpXQorCQlbVENQX0NPTk5UUkFDS19OT05FXTsKKworCS8qIEludmFsaWQ6IGRlbGV0ZSBjb25udHJhY2sgKi8KKwlpZiAobmV3X3N0YXRlID49IFRDUF9DT05OVFJBQ0tfTUFYKSB7CisJCURFQlVHUCgiaXBfY3RfdGNwOiBpbnZhbGlkIG5ldyBkZWxldGluZy5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobmV3X3N0YXRlID09IFRDUF9DT05OVFJBQ0tfU1lOX1NFTlQpIHsKKwkJLyogU1lOIHBhY2tldCAqLworCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzBdLnRkX2VuZCA9CisJCQlzZWdtZW50X3NlcV9wbHVzX2xlbihudG9obCh0aC0+c2VxKSwgc2tiLT5sZW4sCisJCQkJCSAgICAgaXBoLCB0aCk7CisJCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0udGRfbWF4d2luID0gbnRvaHModGgtPndpbmRvdyk7CisJCWlmIChjb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzBdLnRkX21heHdpbiA9PSAwKQorCQkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXS50ZF9tYXh3aW4gPSAxOworCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzBdLnRkX21heGVuZCA9CisJCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzBdLnRkX2VuZDsKKworCQl0Y3Bfb3B0aW9ucyhza2IsIGlwaCwgdGgsICZjb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzBdKTsKKwkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblsxXS5mbGFncyA9IDA7CisJCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0ubG9vc2UgPSAKKwkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblsxXS5sb29zZSA9IDA7CisJfSBlbHNlIGlmIChpcF9jdF90Y3BfbG9vc2UgPT0gMCkgeworCQkvKiBEb24ndCB0cnkgdG8gcGljayB1cCBjb25uZWN0aW9ucy4gKi8KKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogV2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBjb25uZWN0aW9uLAorCQkgKiBpdHMgaGlzdG9yeSBpcyBsb3N0IGZvciB1cy4KKwkJICogTGV0J3MgdHJ5IHRvIHVzZSB0aGUgZGF0YSBmcm9tIHRoZSBwYWNrZXQuCisJCSAqLworCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzBdLnRkX2VuZCA9CisJCQlzZWdtZW50X3NlcV9wbHVzX2xlbihudG9obCh0aC0+c2VxKSwgc2tiLT5sZW4sCisJCQkJCSAgICAgaXBoLCB0aCk7CisJCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0udGRfbWF4d2luID0gbnRvaHModGgtPndpbmRvdyk7CisJCWlmIChjb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzBdLnRkX21heHdpbiA9PSAwKQorCQkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXS50ZF9tYXh3aW4gPSAxOworCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzBdLnRkX21heGVuZCA9CisJCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzBdLnRkX2VuZCArIAorCQkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXS50ZF9tYXh3aW47CisJCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0udGRfc2NhbGUgPSAwOworCisJCS8qIFdlIGFzc3VtZSBTQUNLLiBTaG91bGQgd2UgYXNzdW1lIHdpbmRvdyBzY2FsaW5nIHRvbz8gKi8KKwkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXS5mbGFncyA9CisJCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMV0uZmxhZ3MgPSBJUF9DVF9UQ1BfRkxBR19TQUNLX1BFUk07CisJCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0ubG9vc2UgPSAKKwkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblsxXS5sb29zZSA9IGlwX2N0X3RjcF9sb29zZTsKKwl9CisgICAgCisJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblsxXS50ZF9lbmQgPSAwOworCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMV0udGRfbWF4ZW5kID0gMDsKKwljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzFdLnRkX21heHdpbiA9IDE7CisJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblsxXS50ZF9zY2FsZSA9IDA7ICAgICAgCisKKwkvKiB0Y3BfcGFja2V0IHdpbGwgc2V0IHRoZW0gKi8KKwljb25udHJhY2stPnByb3RvLnRjcC5zdGF0ZSA9IFRDUF9DT05OVFJBQ0tfTk9ORTsKKwljb25udHJhY2stPnByb3RvLnRjcC5sYXN0X2luZGV4ID0gVENQX05PTkVfU0VUOworCSAKKwlERUJVR1AoInRjcF9uZXc6IHNlbmRlciBlbmQ9JXUgbWF4ZW5kPSV1IG1heHdpbj0ldSBzY2FsZT0laSAiCisJICAgICAgICJyZWNlaXZlciBlbmQ9JXUgbWF4ZW5kPSV1IG1heHdpbj0ldSBzY2FsZT0laVxuIiwKKwkJc2VuZGVyLT50ZF9lbmQsIHNlbmRlci0+dGRfbWF4ZW5kLCBzZW5kZXItPnRkX21heHdpbiwKKwkJc2VuZGVyLT50ZF9zY2FsZSwgCisJCXJlY2VpdmVyLT50ZF9lbmQsIHJlY2VpdmVyLT50ZF9tYXhlbmQsIHJlY2VpdmVyLT50ZF9tYXh3aW4sCisJCXJlY2VpdmVyLT50ZF9zY2FsZSk7CisJcmV0dXJuIDE7Cit9CisgIAorc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCBpcF9jb25udHJhY2tfcHJvdG9jb2xfdGNwID0KK3sKKwkucHJvdG8gCQkJPSBJUFBST1RPX1RDUCwKKwkubmFtZSAJCQk9ICJ0Y3AiLAorCS5wa3RfdG9fdHVwbGUgCQk9IHRjcF9wa3RfdG9fdHVwbGUsCisJLmludmVydF90dXBsZSAJCT0gdGNwX2ludmVydF90dXBsZSwKKwkucHJpbnRfdHVwbGUgCQk9IHRjcF9wcmludF90dXBsZSwKKwkucHJpbnRfY29ubnRyYWNrIAk9IHRjcF9wcmludF9jb25udHJhY2ssCisJLnBhY2tldCAJCT0gdGNwX3BhY2tldCwKKwkubmV3IAkJCT0gdGNwX25ldywKKwkuZXJyb3IJCQk9IHRjcF9lcnJvciwKK307CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX3VkcC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b191ZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmMyOGEyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b191ZHAuYwpAQCAtMCwwICsxLDE0NiBAQAorLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAorICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcm90b2NvbC5oPgorCit1bnNpZ25lZCBsb25nIGlwX2N0X3VkcF90aW1lb3V0ID0gMzAqSFo7Cit1bnNpZ25lZCBsb25nIGlwX2N0X3VkcF90aW1lb3V0X3N0cmVhbSA9IDE4MCpIWjsKKworc3RhdGljIGludCB1ZHBfcGt0X3RvX3R1cGxlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAorCQkJICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKK3sKKwlzdHJ1Y3QgdWRwaGRyIF9oZHIsICpocDsKKworCS8qIEFjdHVhbGx5IG9ubHkgbmVlZCBmaXJzdCA4IGJ5dGVzLiAqLworCWhwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgZGF0YW9mZiwgc2l6ZW9mKF9oZHIpLCAmX2hkcik7CisJaWYgKGhwID09IE5VTEwpCisJCXJldHVybiAwOworCisJdHVwbGUtPnNyYy51LnVkcC5wb3J0ID0gaHAtPnNvdXJjZTsKKwl0dXBsZS0+ZHN0LnUudWRwLnBvcnQgPSBocC0+ZGVzdDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHVkcF9pbnZlcnRfdHVwbGUoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCisJCQkgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqb3JpZykKK3sKKwl0dXBsZS0+c3JjLnUudWRwLnBvcnQgPSBvcmlnLT5kc3QudS51ZHAucG9ydDsKKwl0dXBsZS0+ZHN0LnUudWRwLnBvcnQgPSBvcmlnLT5zcmMudS51ZHAucG9ydDsKKwlyZXR1cm4gMTsKK30KKworLyogUHJpbnQgb3V0IHRoZSBwZXItcHJvdG9jb2wgcGFydCBvZiB0aGUgdHVwbGUuICovCitzdGF0aWMgaW50IHVkcF9wcmludF90dXBsZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCisJCQkgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKK3sKKwlyZXR1cm4gc2VxX3ByaW50ZihzLCAic3BvcnQ9JWh1IGRwb3J0PSVodSAiLAorCQkJICBudG9ocyh0dXBsZS0+c3JjLnUudWRwLnBvcnQpLAorCQkJICBudG9ocyh0dXBsZS0+ZHN0LnUudWRwLnBvcnQpKTsKK30KKworLyogUHJpbnQgb3V0IHRoZSBwcml2YXRlIHBhcnQgb2YgdGhlIGNvbm50cmFjay4gKi8KK3N0YXRpYyBpbnQgdWRwX3ByaW50X2Nvbm50cmFjayhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrKQoreworCXJldHVybiAwOworfQorCisvKiBSZXR1cm5zIHZlcmRpY3QgZm9yIHBhY2tldCwgYW5kIG1heSBtb2RpZnkgY29ubnRyYWNrdHlwZSAqLworc3RhdGljIGludCB1ZHBfcGFja2V0KHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaywKKwkJICAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCit7CisJLyogSWYgd2UndmUgc2VlbiB0cmFmZmljIGJvdGggd2F5cywgdGhpcyBpcyBzb21lIGtpbmQgb2YgVURQCisJICAgc3RyZWFtLiAgRXh0ZW5kIHRpbWVvdXQuICovCisJaWYgKHRlc3RfYml0KElQU19TRUVOX1JFUExZX0JJVCwgJmNvbm50cmFjay0+c3RhdHVzKSkgeworCQlpcF9jdF9yZWZyZXNoX2FjY3QoY29ubnRyYWNrLCBjdGluZm8sIHNrYiwgCisJCQkJICAgaXBfY3RfdWRwX3RpbWVvdXRfc3RyZWFtKTsKKwkJLyogQWxzbywgbW9yZSBsaWtlbHkgdG8gYmUgaW1wb3J0YW50LCBhbmQgbm90IGEgcHJvYmUgKi8KKwkJc2V0X2JpdChJUFNfQVNTVVJFRF9CSVQsICZjb25udHJhY2stPnN0YXR1cyk7CisJfSBlbHNlCisJCWlwX2N0X3JlZnJlc2hfYWNjdChjb25udHJhY2ssIGN0aW5mbywgc2tiLCBpcF9jdF91ZHBfdGltZW91dCk7CisKKwlyZXR1cm4gTkZfQUNDRVBUOworfQorCisvKiBDYWxsZWQgd2hlbiBhIG5ldyBjb25uZWN0aW9uIGZvciB0aGlzIHByb3RvY29sIGZvdW5kLiAqLworc3RhdGljIGludCB1ZHBfbmV3KHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB1ZHBfZXJyb3Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSBpcF9jb25udHJhY2tfaW5mbyAqY3RpbmZvLAorCQkgICAgIHVuc2lnbmVkIGludCBob29rbnVtKQoreworCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisJdW5zaWduZWQgaW50IHVkcGxlbiA9IHNrYi0+bGVuIC0gaXBoLT5paGwgKiA0OworCXN0cnVjdCB1ZHBoZHIgX2hkciwgKmhkcjsKKworCS8qIEhlYWRlciBpcyB0b28gc21hbGw/ICovCisJaGRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBoLT5paGwqNCwgc2l6ZW9mKF9oZHIpLCAmX2hkcik7CisJaWYgKGhkciA9PSBOVUxMKSB7CisJCWlmIChMT0dfSU5WQUxJRChJUFBST1RPX1VEUCkpCisJCQluZl9sb2dfcGFja2V0KFBGX0lORVQsIDAsIHNrYiwgTlVMTCwgTlVMTCwgCisJCQkJICAiaXBfY3RfdWRwOiBzaG9ydCBwYWNrZXQgIik7CisJCXJldHVybiAtTkZfQUNDRVBUOworCX0KKwkKKwkvKiBUcnVuY2F0ZWQvbWFsZm9ybWVkIHBhY2tldHMgKi8KKwlpZiAobnRvaHMoaGRyLT5sZW4pID4gdWRwbGVuIHx8IG50b2hzKGhkci0+bGVuKSA8IHNpemVvZigqaGRyKSkgeworCQlpZiAoTE9HX0lOVkFMSUQoSVBQUk9UT19VRFApKQorCQkJbmZfbG9nX3BhY2tldChQRl9JTkVULCAwLCBza2IsIE5VTEwsIE5VTEwsIAorCQkJCSAgImlwX2N0X3VkcDogdHJ1bmNhdGVkL21hbGZvcm1lZCBwYWNrZXQgIik7CisJCXJldHVybiAtTkZfQUNDRVBUOworCX0KKwkKKwkvKiBQYWNrZXQgd2l0aCBubyBjaGVja3N1bSAqLworCWlmICghaGRyLT5jaGVjaykKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKworCS8qIENoZWNrc3VtIGludmFsaWQ/IElnbm9yZS4KKwkgKiBXZSBza2lwIGNoZWNraW5nIHBhY2tldHMgb24gdGhlIG91dGdvaW5nIHBhdGgKKwkgKiBiZWNhdXNlIHRoZSBzZW1hbnRpYyBvZiBDSEVDS1NVTV9IVyBpcyBkaWZmZXJlbnQgdGhlcmUgCisJICogYW5kIG1vcmVvdmVyIHJvb3QgbWlnaHQgc2VuZCByYXcgcGFja2V0cy4KKwkgKiBGSVhNRTogU291cmNlIHJvdXRlIElQIG9wdGlvbiBwYWNrZXRzIC0tUlIgKi8KKwlpZiAoaG9va251bSA9PSBORl9JUF9QUkVfUk9VVElORworCSAgICAmJiBjc3VtX3RjcHVkcF9tYWdpYyhpcGgtPnNhZGRyLCBpcGgtPmRhZGRyLCB1ZHBsZW4sIElQUFJPVE9fVURQLAorCQkJICAgICAgICAgc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcgPyBza2ItPmNzdW0KKwkJCSAgICAgIAkgOiBza2JfY2hlY2tzdW0oc2tiLCBpcGgtPmlobCo0LCB1ZHBsZW4sIDApKSkgeworCQlpZiAoTE9HX0lOVkFMSUQoSVBQUk9UT19VRFApKQorCQkJbmZfbG9nX3BhY2tldChQRl9JTkVULCAwLCBza2IsIE5VTEwsIE5VTEwsIAorCQkJCSAgImlwX2N0X3VkcDogYmFkIFVEUCBjaGVja3N1bSAiKTsKKwkJcmV0dXJuIC1ORl9BQ0NFUFQ7CisJfQorCQorCXJldHVybiBORl9BQ0NFUFQ7Cit9CisKK3N0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgaXBfY29ubnRyYWNrX3Byb3RvY29sX3VkcCA9Cit7CisJLnByb3RvIAkJCT0gSVBQUk9UT19VRFAsCisJLm5hbWUJCQk9ICJ1ZHAiLAorCS5wa3RfdG9fdHVwbGUJCT0gdWRwX3BrdF90b190dXBsZSwKKwkuaW52ZXJ0X3R1cGxlCQk9IHVkcF9pbnZlcnRfdHVwbGUsCisJLnByaW50X3R1cGxlCQk9IHVkcF9wcmludF90dXBsZSwKKwkucHJpbnRfY29ubnRyYWNrCT0gdWRwX3ByaW50X2Nvbm50cmFjaywKKwkucGFja2V0CQkJPSB1ZHBfcGFja2V0LAorCS5uZXcJCQk9IHVkcF9uZXcsCisJLmVycm9yCQkJPSB1ZHBfZXJyb3IsCit9OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3N0YW5kYWxvbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGE3YmRlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMKQEAgLTAsMCArMSw5NjEgQEAKKy8qIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIGZ1bmN0aW9ucyByZXF1aXJlZCBmb3IgdGhlIHN0YW5kYWxvbmUKKyAgIGlwX2Nvbm50cmFjayBtb2R1bGUuCisKKyAgIFRoZXNlIGFyZSBub3QgcmVxdWlyZWQgYnkgdGhlIGNvbXBhdGliaWxpdHkgbGF5ZXIuCisqLworCisvKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCisgKiAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaWZkZWYgQ09ORklHX1NZU0NUTAorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2VuZGlmCisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisKKyNkZWZpbmUgQVNTRVJUX1JFQURfTE9DSyh4KSBNVVNUX0JFX1JFQURfTE9DS0VEKCZpcF9jb25udHJhY2tfbG9jaykKKyNkZWZpbmUgQVNTRVJUX1dSSVRFX0xPQ0soeCkgTVVTVF9CRV9XUklURV9MT0NLRUQoJmlwX2Nvbm50cmFja19sb2NrKQorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvbGlzdGhlbHAuaD4KKworI2lmIDAKKyNkZWZpbmUgREVCVUdQIHByaW50aworI2Vsc2UKKyNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK2V4dGVybiBhdG9taWNfdCBpcF9jb25udHJhY2tfY291bnQ7CitERUNMQVJFX1BFUl9DUFUoc3RydWN0IGlwX2Nvbm50cmFja19zdGF0LCBpcF9jb25udHJhY2tfc3RhdCk7CisKK3N0YXRpYyBpbnQga2lsbF9wcm90byhzdHJ1Y3QgaXBfY29ubnRyYWNrICppLCB2b2lkICpkYXRhKQoreworCXJldHVybiAoaS0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LnByb3RvbnVtID09IAorCQkJKigodV9pbnQ4X3QgKikgZGF0YSkpOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBpbnQKK3ByaW50X3R1cGxlKHN0cnVjdCBzZXFfZmlsZSAqcywgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCisJICAgIHN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvKQoreworCXNlcV9wcmludGYocywgInNyYz0ldS4ldS4ldS4ldSBkc3Q9JXUuJXUuJXUuJXUgIiwKKwkJICAgTklQUVVBRCh0dXBsZS0+c3JjLmlwKSwgTklQUVVBRCh0dXBsZS0+ZHN0LmlwKSk7CisJcmV0dXJuIHByb3RvLT5wcmludF90dXBsZShzLCB0dXBsZSk7Cit9CisKKyNpZmRlZiBDT05GSUdfSVBfTkZfQ1RfQUNDVAorc3RhdGljIHVuc2lnbmVkIGludAorc2VxX3ByaW50X2NvdW50ZXJzKHN0cnVjdCBzZXFfZmlsZSAqcywKKwkJICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja19jb3VudGVyICpjb3VudGVyKQoreworCXJldHVybiBzZXFfcHJpbnRmKHMsICJwYWNrZXRzPSVsbHUgYnl0ZXM9JWxsdSAiLAorCQkJICAodW5zaWduZWQgbG9uZyBsb25nKWNvdW50ZXItPnBhY2tldHMsCisJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpY291bnRlci0+Ynl0ZXMpOworfQorI2Vsc2UKKyNkZWZpbmUgc2VxX3ByaW50X2NvdW50ZXJzKHgsIHkpCTAKKyNlbmRpZgorCitzdHJ1Y3QgY3RfaXRlcl9zdGF0ZSB7CisJdW5zaWduZWQgaW50IGJ1Y2tldDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICpjdF9nZXRfZmlyc3Qoc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc3RydWN0IGN0X2l0ZXJfc3RhdGUgKnN0ID0gc2VxLT5wcml2YXRlOworCisJZm9yIChzdC0+YnVja2V0ID0gMDsKKwkgICAgIHN0LT5idWNrZXQgPCBpcF9jb25udHJhY2tfaHRhYmxlX3NpemU7CisJICAgICBzdC0+YnVja2V0KyspIHsKKwkJaWYgKCFsaXN0X2VtcHR5KCZpcF9jb25udHJhY2tfaGFzaFtzdC0+YnVja2V0XSkpCisJCQlyZXR1cm4gaXBfY29ubnRyYWNrX2hhc2hbc3QtPmJ1Y2tldF0ubmV4dDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICpjdF9nZXRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgY3RfaXRlcl9zdGF0ZSAqc3QgPSBzZXEtPnByaXZhdGU7CisKKwloZWFkID0gaGVhZC0+bmV4dDsKKwl3aGlsZSAoaGVhZCA9PSAmaXBfY29ubnRyYWNrX2hhc2hbc3QtPmJ1Y2tldF0pIHsKKwkJaWYgKCsrc3QtPmJ1Y2tldCA+PSBpcF9jb25udHJhY2tfaHRhYmxlX3NpemUpCisJCQlyZXR1cm4gTlVMTDsKKwkJaGVhZCA9IGlwX2Nvbm50cmFja19oYXNoW3N0LT5idWNrZXRdLm5leHQ7CisJfQorCXJldHVybiBoZWFkOworfQorCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqY3RfZ2V0X2lkeChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90IHBvcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gY3RfZ2V0X2ZpcnN0KHNlcSk7CisKKwlpZiAoaGVhZCkKKwkJd2hpbGUgKHBvcyAmJiAoaGVhZCA9IGN0X2dldF9uZXh0KHNlcSwgaGVhZCkpKQorCQkJcG9zLS07CisJcmV0dXJuIHBvcyA/IE5VTEwgOiBoZWFkOworfQorCitzdGF0aWMgdm9pZCAqY3Rfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlSRUFEX0xPQ0soJmlwX2Nvbm50cmFja19sb2NrKTsKKwlyZXR1cm4gY3RfZ2V0X2lkeChzZXEsICpwb3MpOworfQorCitzdGF0aWMgdm9pZCAqY3Rfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwkoKnBvcykrKzsKKwlyZXR1cm4gY3RfZ2V0X25leHQocywgdik7Cit9CisgIAorc3RhdGljIHZvaWQgY3Rfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQoreworCVJFQURfVU5MT0NLKCZpcF9jb25udHJhY2tfbG9jayk7Cit9CisgCitzdGF0aWMgaW50IGN0X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKK3sKKwljb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmhhc2ggPSB2OworCWNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjayA9IHR1cGxlaGFzaF90b19jdHJhY2soaGFzaCk7CisJc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG87CisKKwlNVVNUX0JFX1JFQURfTE9DS0VEKCZpcF9jb25udHJhY2tfbG9jayk7CisJSVBfTkZfQVNTRVJUKGNvbm50cmFjayk7CisKKwkvKiB3ZSBvbmx5IHdhbnQgdG8gcHJpbnQgRElSX09SSUdJTkFMICovCisJaWYgKERJUkVDVElPTihoYXNoKSkKKwkJcmV0dXJuIDA7CisKKwlwcm90byA9IGlwX2N0X2ZpbmRfcHJvdG8oY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXQorCQkJICAgICAgIC50dXBsZS5kc3QucHJvdG9udW0pOworCUlQX05GX0FTU0VSVChwcm90byk7CisKKwlpZiAoc2VxX3ByaW50ZihzLCAiJS04cyAldSAlbGQgIiwKKwkJICAgICAgcHJvdG8tPm5hbWUsCisJCSAgICAgIGNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LnByb3RvbnVtLAorCQkgICAgICB0aW1lcl9wZW5kaW5nKCZjb25udHJhY2stPnRpbWVvdXQpCisJCSAgICAgID8gKGxvbmcpKGNvbm50cmFjay0+dGltZW91dC5leHBpcmVzIC0gamlmZmllcykvSFoKKwkJICAgICAgOiAwKSAhPSAwKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWlmIChwcm90by0+cHJpbnRfY29ubnRyYWNrKHMsIGNvbm50cmFjaykpCisJCXJldHVybiAtRU5PU1BDOworICAKKwlpZiAocHJpbnRfdHVwbGUocywgJmNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUsCisJCQlwcm90bykpCisJCXJldHVybiAtRU5PU1BDOworCisgCWlmIChzZXFfcHJpbnRfY291bnRlcnMocywgJmNvbm50cmFjay0+Y291bnRlcnNbSVBfQ1RfRElSX09SSUdJTkFMXSkpCisJCXJldHVybiAtRU5PU1BDOworCisJaWYgKCEodGVzdF9iaXQoSVBTX1NFRU5fUkVQTFlfQklULCAmY29ubnRyYWNrLT5zdGF0dXMpKSkKKwkJaWYgKHNlcV9wcmludGYocywgIltVTlJFUExJRURdICIpKQorCQkJcmV0dXJuIC1FTk9TUEM7CisKKwlpZiAocHJpbnRfdHVwbGUocywgJmNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUsCisJCQlwcm90bykpCisJCXJldHVybiAtRU5PU1BDOworCisgCWlmIChzZXFfcHJpbnRfY291bnRlcnMocywgJmNvbm50cmFjay0+Y291bnRlcnNbSVBfQ1RfRElSX1JFUExZXSkpCisJCXJldHVybiAtRU5PU1BDOworCisJaWYgKHRlc3RfYml0KElQU19BU1NVUkVEX0JJVCwgJmNvbm50cmFjay0+c3RhdHVzKSkKKwkJaWYgKHNlcV9wcmludGYocywgIltBU1NVUkVEXSAiKSkKKwkJCXJldHVybiAtRU5PU1BDOworCisjaWYgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX01BUkspCisJaWYgKHNlcV9wcmludGYocywgIm1hcms9JWx1ICIsIGNvbm50cmFjay0+bWFyaykpCisJCXJldHVybiAtRU5PU1BDOworI2VuZGlmCisKKwlpZiAoc2VxX3ByaW50ZihzLCAidXNlPSV1XG4iLCBhdG9taWNfcmVhZCgmY29ubnRyYWNrLT5jdF9nZW5lcmFsLnVzZSkpKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGN0X3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gY3Rfc2VxX3N0YXJ0LAorCS5uZXh0ICA9IGN0X3NlcV9uZXh0LAorCS5zdG9wICA9IGN0X3NlcV9zdG9wLAorCS5zaG93ICA9IGN0X3NlcV9zaG93Cit9OworICAKK3N0YXRpYyBpbnQgY3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKKwlzdHJ1Y3QgY3RfaXRlcl9zdGF0ZSAqc3Q7CisJaW50IHJldDsKKworCXN0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGN0X2l0ZXJfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0ID0gc2VxX29wZW4oZmlsZSwgJmN0X3NlcV9vcHMpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2ZyZWU7CisJc2VxICAgICAgICAgID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNlcS0+cHJpdmF0ZSA9IHN0OworCW1lbXNldChzdCwgMCwgc2l6ZW9mKHN0cnVjdCBjdF9pdGVyX3N0YXRlKSk7CisJcmV0dXJuIHJldDsKK291dF9mcmVlOgorCWtmcmVlKHN0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjdF9maWxlX29wcyA9IHsKKwkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gY3Rfb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2VfcHJpdmF0ZSwKK307CisgIAorLyogZXhwZWN0cyAqLworc3RhdGljIHZvaWQgKmV4cF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICplID0gJmlwX2Nvbm50cmFja19leHBlY3RfbGlzdDsKKwlsb2ZmX3QgaTsKKworCS8qIHN0cmFuZ2Ugc2VxX2ZpbGUgYXBpIGNhbGxzIHN0b3AgZXZlbiBpZiB3ZSBmYWlsLAorCSAqIHRodXMgd2UgbmVlZCB0byBncmFiIGxvY2sgc2luY2Ugc3RvcCB1bmxvY2tzICovCisJUkVBRF9MT0NLKCZpcF9jb25udHJhY2tfbG9jayk7CisKKwlpZiAobGlzdF9lbXB0eShlKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDw9ICpwb3M7IGkrKykgeworCQllID0gZS0+bmV4dDsKKwkJaWYgKGUgPT0gJmlwX2Nvbm50cmFja19leHBlY3RfbGlzdCkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gZTsKK30KKworc3RhdGljIHZvaWQgKmV4cF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworIAlzdHJ1Y3QgbGlzdF9oZWFkICplID0gdjsKKworCWUgPSBlLT5uZXh0OworCisJaWYgKGUgPT0gJmlwX2Nvbm50cmFja19leHBlY3RfbGlzdCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gZTsKK30KKworc3RhdGljIHZvaWQgZXhwX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKK3sKKwlSRUFEX1VOTE9DSygmaXBfY29ubnRyYWNrX2xvY2spOworfQorCitzdGF0aWMgaW50IGV4cF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCit7CisJc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cGVjdCA9IHY7CisKKwlpZiAoZXhwZWN0LT50aW1lb3V0LmZ1bmN0aW9uKQorCQlzZXFfcHJpbnRmKHMsICIlbGQgIiwgdGltZXJfcGVuZGluZygmZXhwZWN0LT50aW1lb3V0KQorCQkJICAgPyAobG9uZykoZXhwZWN0LT50aW1lb3V0LmV4cGlyZXMgLSBqaWZmaWVzKS9IWiA6IDApOworCWVsc2UKKwkJc2VxX3ByaW50ZihzLCAiLSAiKTsKKworCXNlcV9wcmludGYocywgInByb3RvPSV1ICIsIGV4cGVjdC0+dHVwbGUuZHN0LnByb3RvbnVtKTsKKworCXByaW50X3R1cGxlKHMsICZleHBlY3QtPnR1cGxlLAorCQkgICAgaXBfY3RfZmluZF9wcm90byhleHBlY3QtPnR1cGxlLmRzdC5wcm90b251bSkpOworCXJldHVybiBzZXFfcHV0YyhzLCAnXG4nKTsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBleHBfc2VxX29wcyA9IHsKKwkuc3RhcnQgPSBleHBfc2VxX3N0YXJ0LAorCS5uZXh0ID0gZXhwX3NlcV9uZXh0LAorCS5zdG9wID0gZXhwX3NlcV9zdG9wLAorCS5zaG93ID0gZXhwX3NlcV9zaG93Cit9OworCitzdGF0aWMgaW50IGV4cF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmZXhwX3NlcV9vcHMpOworfQorICAKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGV4cF9maWxlX29wcyA9IHsKKwkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gZXhwX29wZW4sCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlCit9OworCitzdGF0aWMgdm9pZCAqY3RfY3B1X3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJaW50IGNwdTsKKworCWlmICgqcG9zID09IDApCisJCXJldHVybiBTRVFfU1RBUlRfVE9LRU47CisKKwlmb3IgKGNwdSA9ICpwb3MtMTsgY3B1IDwgTlJfQ1BVUzsgKytjcHUpIHsKKwkJaWYgKCFjcHVfcG9zc2libGUoY3B1KSkKKwkJCWNvbnRpbnVlOworCQkqcG9zID0gY3B1KzE7CisJCXJldHVybiAmcGVyX2NwdShpcF9jb25udHJhY2tfc3RhdCwgY3B1KTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKmN0X2NwdV9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJaW50IGNwdTsKKworCWZvciAoY3B1ID0gKnBvczsgY3B1IDwgTlJfQ1BVUzsgKytjcHUpIHsKKwkJaWYgKCFjcHVfcG9zc2libGUoY3B1KSkKKwkJCWNvbnRpbnVlOworCQkqcG9zID0gY3B1KzE7CisJCXJldHVybiAmcGVyX2NwdShpcF9jb25udHJhY2tfc3RhdCwgY3B1KTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgY3RfY3B1X3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworfQorCitzdGF0aWMgaW50IGN0X2NwdV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwl1bnNpZ25lZCBpbnQgbnJfY29ubnRyYWNrcyA9IGF0b21pY19yZWFkKCZpcF9jb25udHJhY2tfY291bnQpOworCXN0cnVjdCBpcF9jb25udHJhY2tfc3RhdCAqc3QgPSB2OworCisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CisJCXNlcV9wcmludGYoc2VxLCAiZW50cmllcyAgc2VhcmNoZWQgZm91bmQgbmV3IGludmFsaWQgaWdub3JlIGRlbGV0ZSBkZWxldGVfbGlzdCBpbnNlcnQgaW5zZXJ0X2ZhaWxlZCBkcm9wIGVhcmx5X2Ryb3AgaWNtcF9lcnJvciAgZXhwZWN0X25ldyBleHBlY3RfY3JlYXRlIGV4cGVjdF9kZWxldGVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZXFfcHJpbnRmKHNlcSwgIiUwOHggICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggIgorCQkJIiUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAgJTA4eCAlMDh4ICUwOHggXG4iLAorCQkgICBucl9jb25udHJhY2tzLAorCQkgICBzdC0+c2VhcmNoZWQsCisJCSAgIHN0LT5mb3VuZCwKKwkJICAgc3QtPm5ldywKKwkJICAgc3QtPmludmFsaWQsCisJCSAgIHN0LT5pZ25vcmUsCisJCSAgIHN0LT5kZWxldGUsCisJCSAgIHN0LT5kZWxldGVfbGlzdCwKKwkJICAgc3QtPmluc2VydCwKKwkJICAgc3QtPmluc2VydF9mYWlsZWQsCisJCSAgIHN0LT5kcm9wLAorCQkgICBzdC0+ZWFybHlfZHJvcCwKKwkJICAgc3QtPmVycm9yLAorCisJCSAgIHN0LT5leHBlY3RfbmV3LAorCQkgICBzdC0+ZXhwZWN0X2NyZWF0ZSwKKwkJICAgc3QtPmV4cGVjdF9kZWxldGUKKwkJKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBjdF9jcHVfc2VxX29wcyA9IHsKKwkuc3RhcnQgID0gY3RfY3B1X3NlcV9zdGFydCwKKwkubmV4dCAgID0gY3RfY3B1X3NlcV9uZXh0LAorCS5zdG9wICAgPSBjdF9jcHVfc2VxX3N0b3AsCisJLnNob3cgICA9IGN0X2NwdV9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgY3RfY3B1X3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmY3RfY3B1X3NlcV9vcHMpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjdF9jcHVfc2VxX2ZvcHMgPSB7CisJLm93bmVyICAgPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICA9IGN0X2NwdV9zZXFfb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2VfcHJpdmF0ZSwKK307CisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGludCBpcF9jb25maXJtKHVuc2lnbmVkIGludCBob29rbnVtLAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJCSAgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKKwllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKKworCS8qIFRoaXMgaXMgd2hlcmUgd2UgY2FsbCB0aGUgaGVscGVyOiBhcyB0aGUgcGFja2V0IGdvZXMgb3V0LiAqLworCWN0ID0gaXBfY29ubnRyYWNrX2dldCgqcHNrYiwgJmN0aW5mbyk7CisJaWYgKGN0ICYmIGN0LT5oZWxwZXIpIHsKKwkJdW5zaWduZWQgaW50IHJldDsKKwkJcmV0ID0gY3QtPmhlbHBlci0+aGVscChwc2tiLCBjdCwgY3RpbmZvKTsKKwkJaWYgKHJldCAhPSBORl9BQ0NFUFQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFdlJ3ZlIHNlZW4gaXQgY29taW5nIG91dCB0aGUgb3RoZXIgc2lkZTogY29uZmlybSBpdCAqLworCXJldHVybiBpcF9jb25udHJhY2tfY29uZmlybShwc2tiKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBpcF9jb25udHJhY2tfZGVmcmFnKHVuc2lnbmVkIGludCBob29rbnVtLAorCQkJCSAgICAgICAgc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCSAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCQkJCSAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJCQkgICAgICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQoreworI2lmICFkZWZpbmVkKENPTkZJR19JUF9ORl9OQVQpICYmICFkZWZpbmVkKENPTkZJR19JUF9ORl9OQVRfTU9EVUxFKQorCS8qIFByZXZpb3VzbHkgc2VlbiAobG9vcGJhY2spPyAgSWdub3JlLiAgRG8gdGhpcyBiZWZvcmUKKyAgICAgICAgICAgZnJhZ21lbnQgY2hlY2suICovCisJaWYgKCgqcHNrYiktPm5mY3QpCisJCXJldHVybiBORl9BQ0NFUFQ7CisjZW5kaWYKKworCS8qIEdhdGhlciBmcmFnbWVudHMuICovCisJaWYgKCgqcHNrYiktPm5oLmlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRnxJUF9PRkZTRVQpKSB7CisJCSpwc2tiID0gaXBfY3RfZ2F0aGVyX2ZyYWdzKCpwc2tiLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICBob29rbnVtID09IE5GX0lQX1BSRV9ST1VUSU5HID8gCisJCQkJCSAgIElQX0RFRlJBR19DT05OVFJBQ0tfSU4gOgorCQkJCQkgICBJUF9ERUZSQUdfQ09OTlRSQUNLX09VVCk7CisJCWlmICghKnBza2IpCisJCQlyZXR1cm4gTkZfU1RPTEVOOworCX0KKwlyZXR1cm4gTkZfQUNDRVBUOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGlwX3JlZnJhZyh1bnNpZ25lZCBpbnQgaG9va251bSwKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQkgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlzdHJ1Y3QgcnRhYmxlICpydCA9IChzdHJ1Y3QgcnRhYmxlICopKCpwc2tiKS0+ZHN0OworCisJLyogV2UndmUgc2VlbiBpdCBjb21pbmcgb3V0IHRoZSBvdGhlciBzaWRlOiBjb25maXJtICovCisJaWYgKGlwX2NvbmZpcm0oaG9va251bSwgcHNrYiwgaW4sIG91dCwgb2tmbikgIT0gTkZfQUNDRVBUKQorCQlyZXR1cm4gTkZfRFJPUDsKKworCS8qIExvY2FsIHBhY2tldHMgYXJlIG5ldmVyIHByb2R1Y2VkIHRvbyBsYXJnZSBmb3IgdGhlaXIKKwkgICBpbnRlcmZhY2UuICBXZSBkZWdmcmFnbWVudCB0aGVtIGF0IExPQ0FMX09VVCwgaG93ZXZlciwKKwkgICBzbyB3ZSBoYXZlIHRvIHJlZnJhZ21lbnQgdGhlbSBoZXJlLiAqLworCWlmICgoKnBza2IpLT5sZW4gPiBkc3RfbXR1KCZydC0+dS5kc3QpICYmCisJICAgICFza2Jfc2hpbmZvKCpwc2tiKS0+dHNvX3NpemUpIHsKKwkJLyogTm8gaG9vayBjYW4gYmUgYWZ0ZXIgdXMsIHNvIHRoaXMgc2hvdWxkIGJlIE9LLiAqLworCQlpcF9mcmFnbWVudCgqcHNrYiwgb2tmbik7CisJCXJldHVybiBORl9TVE9MRU47CisJfQorCXJldHVybiBORl9BQ0NFUFQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXBfY29ubnRyYWNrX2xvY2FsKHVuc2lnbmVkIGludCBob29rbnVtLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJCQkgICAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCit7CisJLyogcm9vdCBpcyBwbGF5aW5nIHdpdGggcmF3IHNvY2tldHMuICovCisJaWYgKCgqcHNrYiktPmxlbiA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpCisJICAgIHx8ICgqcHNrYiktPm5oLmlwaC0+aWhsICogNCA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoImlwdF9ob29rOiBoYXBweSBjcmFja2luZy5cbiIpOworCQlyZXR1cm4gTkZfQUNDRVBUOworCX0KKwlyZXR1cm4gaXBfY29ubnRyYWNrX2luKGhvb2tudW0sIHBza2IsIGluLCBvdXQsIG9rZm4pOworfQorCisvKiBDb25uZWN0aW9uIHRyYWNraW5nIG1heSBkcm9wIHBhY2tldHMsIGJ1dCBuZXZlciBhbHRlcnMgdGhlbSwgc28KKyAgIG1ha2UgaXQgdGhlIGZpcnN0IGhvb2suICovCitzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIGlwX2Nvbm50cmFja19kZWZyYWdfb3BzID0geworCS5ob29rCQk9IGlwX2Nvbm50cmFja19kZWZyYWcsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5wZgkJPSBQRl9JTkVULAorCS5ob29rbnVtCT0gTkZfSVBfUFJFX1JPVVRJTkcsCisJLnByaW9yaXR5CT0gTkZfSVBfUFJJX0NPTk5UUkFDS19ERUZSQUcsCit9OworCitzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIGlwX2Nvbm50cmFja19pbl9vcHMgPSB7CisJLmhvb2sJCT0gaXBfY29ubnRyYWNrX2luLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucGYJCT0gUEZfSU5FVCwKKwkuaG9va251bQk9IE5GX0lQX1BSRV9ST1VUSU5HLAorCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9DT05OVFJBQ0ssCit9OworCitzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIGlwX2Nvbm50cmFja19kZWZyYWdfbG9jYWxfb3V0X29wcyA9IHsKKwkuaG9vawkJPSBpcF9jb25udHJhY2tfZGVmcmFnLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucGYJCT0gUEZfSU5FVCwKKwkuaG9va251bQk9IE5GX0lQX0xPQ0FMX09VVCwKKwkucHJpb3JpdHkJPSBORl9JUF9QUklfQ09OTlRSQUNLX0RFRlJBRywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmZfaG9va19vcHMgaXBfY29ubnRyYWNrX2xvY2FsX291dF9vcHMgPSB7CisJLmhvb2sJCT0gaXBfY29ubnRyYWNrX2xvY2FsLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucGYJCT0gUEZfSU5FVCwKKwkuaG9va251bQk9IE5GX0lQX0xPQ0FMX09VVCwKKwkucHJpb3JpdHkJPSBORl9JUF9QUklfQ09OTlRSQUNLLAorfTsKKworLyogUmVmcmFnbWVudGVyOyBsYXN0IGNoYW5jZS4gKi8KK3N0YXRpYyBzdHJ1Y3QgbmZfaG9va19vcHMgaXBfY29ubnRyYWNrX291dF9vcHMgPSB7CisJLmhvb2sJCT0gaXBfcmVmcmFnLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucGYJCT0gUEZfSU5FVCwKKwkuaG9va251bQk9IE5GX0lQX1BPU1RfUk9VVElORywKKwkucHJpb3JpdHkJPSBORl9JUF9QUklfTEFTVCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmZfaG9va19vcHMgaXBfY29ubnRyYWNrX2xvY2FsX2luX29wcyA9IHsKKwkuaG9vawkJPSBpcF9jb25maXJtLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucGYJCT0gUEZfSU5FVCwKKwkuaG9va251bQk9IE5GX0lQX0xPQ0FMX0lOLAorCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9MQVNULTEsCit9OworCisvKiBTeXNjdGwgc3VwcG9ydCAqLworCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCisvKiBGcm9tIGlwX2Nvbm50cmFja19jb3JlLmMgKi8KK2V4dGVybiBpbnQgaXBfY29ubnRyYWNrX21heDsKK2V4dGVybiB1bnNpZ25lZCBpbnQgaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplOworCisvKiBGcm9tIGlwX2Nvbm50cmFja19wcm90b190Y3AuYyAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaXBfY3RfdGNwX3RpbWVvdXRfc3luX3NlbnQ7CitleHRlcm4gdW5zaWduZWQgbG9uZyBpcF9jdF90Y3BfdGltZW91dF9zeW5fcmVjdjsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGlwX2N0X3RjcF90aW1lb3V0X2VzdGFibGlzaGVkOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaXBfY3RfdGNwX3RpbWVvdXRfZmluX3dhaXQ7CitleHRlcm4gdW5zaWduZWQgbG9uZyBpcF9jdF90Y3BfdGltZW91dF9jbG9zZV93YWl0OworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaXBfY3RfdGNwX3RpbWVvdXRfbGFzdF9hY2s7CitleHRlcm4gdW5zaWduZWQgbG9uZyBpcF9jdF90Y3BfdGltZW91dF90aW1lX3dhaXQ7CitleHRlcm4gdW5zaWduZWQgbG9uZyBpcF9jdF90Y3BfdGltZW91dF9jbG9zZTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGlwX2N0X3RjcF90aW1lb3V0X21heF9yZXRyYW5zOworZXh0ZXJuIGludCBpcF9jdF90Y3BfbG9vc2U7CitleHRlcm4gaW50IGlwX2N0X3RjcF9iZV9saWJlcmFsOworZXh0ZXJuIGludCBpcF9jdF90Y3BfbWF4X3JldHJhbnM7CisKKy8qIEZyb20gaXBfY29ubnRyYWNrX3Byb3RvX3VkcC5jICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBpcF9jdF91ZHBfdGltZW91dDsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGlwX2N0X3VkcF90aW1lb3V0X3N0cmVhbTsKKworLyogRnJvbSBpcF9jb25udHJhY2tfcHJvdG9faWNtcC5jICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBpcF9jdF9pY21wX3RpbWVvdXQ7CisKKy8qIEZyb20gaXBfY29ubnRyYWNrX3Byb3RvX2ljbXAuYyAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaXBfY3RfZ2VuZXJpY190aW1lb3V0OworCisvKiBMb2cgaW52YWxpZCBwYWNrZXRzIG9mIGEgZ2l2ZW4gcHJvdG9jb2wgKi8KK3N0YXRpYyBpbnQgbG9nX2ludmFsaWRfcHJvdG9fbWluID0gMDsKK3N0YXRpYyBpbnQgbG9nX2ludmFsaWRfcHJvdG9fbWF4ID0gMjU1OworCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmlwX2N0X3N5c2N0bF9oZWFkZXI7CisKK3N0YXRpYyBjdGxfdGFibGUgaXBfY3Rfc3lzY3RsX3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfTUFYLAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX21heCIsCisJCS5kYXRhCQk9ICZpcF9jb25udHJhY2tfbWF4LAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19DT1VOVCwKKwkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19jb3VudCIsCisJCS5kYXRhCQk9ICZpcF9jb25udHJhY2tfY291bnQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA0NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX0JVQ0tFVFMsCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfYnVja2V0cyIsCisJCS5kYXRhCQk9ICZpcF9jb25udHJhY2tfaHRhYmxlX3NpemUsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA0NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX1NZTl9TRU5ULAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF90aW1lb3V0X3N5bl9zZW50IiwKKwkJLmRhdGEJCT0gJmlwX2N0X3RjcF90aW1lb3V0X3N5bl9zZW50LAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX1NZTl9SRUNWLAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF90aW1lb3V0X3N5bl9yZWN2IiwKKwkJLmRhdGEJCT0gJmlwX2N0X3RjcF90aW1lb3V0X3N5bl9yZWN2LAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0VTVEFCTElTSEVELAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF90aW1lb3V0X2VzdGFibGlzaGVkIiwKKwkJLmRhdGEJCT0gJmlwX2N0X3RjcF90aW1lb3V0X2VzdGFibGlzaGVkLAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0ZJTl9XQUlULAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF90aW1lb3V0X2Zpbl93YWl0IiwKKwkJLmRhdGEJCT0gJmlwX2N0X3RjcF90aW1lb3V0X2Zpbl93YWl0LAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0NMT1NFX1dBSVQsCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfY2xvc2Vfd2FpdCIsCisJCS5kYXRhCQk9ICZpcF9jdF90Y3BfdGltZW91dF9jbG9zZV93YWl0LAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0xBU1RfQUNLLAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF90aW1lb3V0X2xhc3RfYWNrIiwKKwkJLmRhdGEJCT0gJmlwX2N0X3RjcF90aW1lb3V0X2xhc3RfYWNrLAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX1RJTUVfV0FJVCwKKwkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja190Y3BfdGltZW91dF90aW1lX3dhaXQiLAorCQkuZGF0YQkJPSAmaXBfY3RfdGNwX3RpbWVvdXRfdGltZV93YWl0LAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0NMT1NFLAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF90aW1lb3V0X2Nsb3NlIiwKKwkJLmRhdGEJCT0gJmlwX2N0X3RjcF90aW1lb3V0X2Nsb3NlLAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1VEUF9USU1FT1VULAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3VkcF90aW1lb3V0IiwKKwkJLmRhdGEJCT0gJmlwX2N0X3VkcF90aW1lb3V0LAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1VEUF9USU1FT1VUX1NUUkVBTSwKKwkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja191ZHBfdGltZW91dF9zdHJlYW0iLAorCQkuZGF0YQkJPSAmaXBfY3RfdWRwX3RpbWVvdXRfc3RyZWFtLAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX0lDTVBfVElNRU9VVCwKKwkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19pY21wX3RpbWVvdXQiLAorCQkuZGF0YQkJPSAmaXBfY3RfaWNtcF90aW1lb3V0LAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX0dFTkVSSUNfVElNRU9VVCwKKwkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19nZW5lcmljX3RpbWVvdXQiLAorCQkuZGF0YQkJPSAmaXBfY3RfZ2VuZXJpY190aW1lb3V0LAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX0xPR19JTlZBTElELAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX2xvZ19pbnZhbGlkIiwKKwkJLmRhdGEJCT0gJmlwX2N0X2xvZ19pbnZhbGlkLAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmbG9nX2ludmFsaWRfcHJvdG9fbWluLAorCQkuZXh0cmEyCQk9ICZsb2dfaW52YWxpZF9wcm90b19tYXgsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9NQVhfUkVUUkFOUywKKwkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja190Y3BfdGltZW91dF9tYXhfcmV0cmFucyIsCisJCS5kYXRhCQk9ICZpcF9jdF90Y3BfdGltZW91dF9tYXhfcmV0cmFucywKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19UQ1BfTE9PU0UsCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX2xvb3NlIiwKKwkJLmRhdGEJCT0gJmlwX2N0X3RjcF9sb29zZSwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX0JFX0xJQkVSQUwsCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX2JlX2xpYmVyYWwiLAorCQkuZGF0YQkJPSAmaXBfY3RfdGNwX2JlX2xpYmVyYWwsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9NQVhfUkVUUkFOUywKKwkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja190Y3BfbWF4X3JldHJhbnMiLAorCQkuZGF0YQkJPSAmaXBfY3RfdGNwX21heF9yZXRyYW5zLAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworI2RlZmluZSBORVRfSVBfQ09OTlRSQUNLX01BWCAyMDg5CisKK3N0YXRpYyBjdGxfdGFibGUgaXBfY3RfbmV0ZmlsdGVyX3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORVRGSUxURVIsCisJCS5wcm9jbmFtZQk9ICJuZXRmaWx0ZXIiLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gaXBfY3Rfc3lzY3RsX3RhYmxlLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBfQ09OTlRSQUNLX01BWCwKKwkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19tYXgiLAorCQkuZGF0YQkJPSAmaXBfY29ubnRyYWNrX21heCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIGN0bF90YWJsZSBpcF9jdF9pcHY0X3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNCwKKwkJLnByb2NuYW1lCT0gImlwdjQiLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gaXBfY3RfbmV0ZmlsdGVyX3RhYmxlLAorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3N0YXRpYyBjdGxfdGFibGUgaXBfY3RfbmV0X3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBDVExfTkVULAorCQkucHJvY25hbWUJPSAibmV0IiwKKwkJLm1vZGUJCT0gMDU1NSwgCisJCS5jaGlsZAkJPSBpcF9jdF9pcHY0X3RhYmxlLAorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK0VYUE9SVF9TWU1CT0woaXBfY3RfbG9nX2ludmFsaWQpOworI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KKworc3RhdGljIGludCBpbml0X29yX2NsZWFudXAoaW50IGluaXQpCit7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2MsICpwcm9jX2V4cCwgKnByb2Nfc3RhdDsKKyNlbmRpZgorCWludCByZXQgPSAwOworCisJaWYgKCFpbml0KSBnb3RvIGNsZWFudXA7CisKKwlyZXQgPSBpcF9jb25udHJhY2tfaW5pdCgpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGNsZWFudXBfbm90aGluZzsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJcmV0ID0gLUVOT01FTTsKKwlwcm9jID0gcHJvY19uZXRfZm9wc19jcmVhdGUoImlwX2Nvbm50cmFjayIsIDA0NDAsICZjdF9maWxlX29wcyk7CisJaWYgKCFwcm9jKSBnb3RvIGNsZWFudXBfaW5pdDsKKworCXByb2NfZXhwID0gcHJvY19uZXRfZm9wc19jcmVhdGUoImlwX2Nvbm50cmFja19leHBlY3QiLCAwNDQwLAorCQkJCQkmZXhwX2ZpbGVfb3BzKTsKKwlpZiAoIXByb2NfZXhwKSBnb3RvIGNsZWFudXBfcHJvYzsKKworCXByb2Nfc3RhdCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJpcF9jb25udHJhY2siLCBTX0lSVUdPLCBwcm9jX25ldF9zdGF0KTsKKwlpZiAoIXByb2Nfc3RhdCkKKwkJZ290byBjbGVhbnVwX3Byb2NfZXhwOworCisJcHJvY19zdGF0LT5wcm9jX2ZvcHMgPSAmY3RfY3B1X3NlcV9mb3BzOworCXByb2Nfc3RhdC0+b3duZXIgPSBUSElTX01PRFVMRTsKKyNlbmRpZgorCisJcmV0ID0gbmZfcmVnaXN0ZXJfaG9vaygmaXBfY29ubnRyYWNrX2RlZnJhZ19vcHMpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50aygiaXBfY29ubnRyYWNrOiBjYW4ndCByZWdpc3RlciBwcmUtcm91dGluZyBkZWZyYWcgaG9vay5cbiIpOworCQlnb3RvIGNsZWFudXBfcHJvY19zdGF0OworCX0KKwlyZXQgPSBuZl9yZWdpc3Rlcl9ob29rKCZpcF9jb25udHJhY2tfZGVmcmFnX2xvY2FsX291dF9vcHMpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50aygiaXBfY29ubnRyYWNrOiBjYW4ndCByZWdpc3RlciBsb2NhbF9vdXQgZGVmcmFnIGhvb2suXG4iKTsKKwkJZ290byBjbGVhbnVwX2RlZnJhZ29wczsKKwl9CisJcmV0ID0gbmZfcmVnaXN0ZXJfaG9vaygmaXBfY29ubnRyYWNrX2luX29wcyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKCJpcF9jb25udHJhY2s6IGNhbid0IHJlZ2lzdGVyIHByZS1yb3V0aW5nIGhvb2suXG4iKTsKKwkJZ290byBjbGVhbnVwX2RlZnJhZ2xvY2Fsb3BzOworCX0KKwlyZXQgPSBuZl9yZWdpc3Rlcl9ob29rKCZpcF9jb25udHJhY2tfbG9jYWxfb3V0X29wcyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKCJpcF9jb25udHJhY2s6IGNhbid0IHJlZ2lzdGVyIGxvY2FsIG91dCBob29rLlxuIik7CisJCWdvdG8gY2xlYW51cF9pbm9wczsKKwl9CisJcmV0ID0gbmZfcmVnaXN0ZXJfaG9vaygmaXBfY29ubnRyYWNrX291dF9vcHMpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50aygiaXBfY29ubnRyYWNrOiBjYW4ndCByZWdpc3RlciBwb3N0LXJvdXRpbmcgaG9vay5cbiIpOworCQlnb3RvIGNsZWFudXBfaW5hbmRsb2NhbG9wczsKKwl9CisJcmV0ID0gbmZfcmVnaXN0ZXJfaG9vaygmaXBfY29ubnRyYWNrX2xvY2FsX2luX29wcyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKCJpcF9jb25udHJhY2s6IGNhbid0IHJlZ2lzdGVyIGxvY2FsIGluIGhvb2suXG4iKTsKKwkJZ290byBjbGVhbnVwX2lub3V0YW5kbG9jYWxvcHM7CisJfQorI2lmZGVmIENPTkZJR19TWVNDVEwKKwlpcF9jdF9zeXNjdGxfaGVhZGVyID0gcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGlwX2N0X25ldF90YWJsZSwgMCk7CisJaWYgKGlwX2N0X3N5c2N0bF9oZWFkZXIgPT0gTlVMTCkgeworCQlwcmludGsoImlwX2Nvbm50cmFjazogY2FuJ3QgcmVnaXN0ZXIgdG8gc3lzY3RsLlxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gY2xlYW51cF9sb2NhbGlub3BzOworCX0KKyNlbmRpZgorCisJcmV0dXJuIHJldDsKKworIGNsZWFudXA6CisjaWZkZWYgQ09ORklHX1NZU0NUTAorIAl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShpcF9jdF9zeXNjdGxfaGVhZGVyKTsKKyBjbGVhbnVwX2xvY2FsaW5vcHM6CisjZW5kaWYKKwluZl91bnJlZ2lzdGVyX2hvb2soJmlwX2Nvbm50cmFja19sb2NhbF9pbl9vcHMpOworIGNsZWFudXBfaW5vdXRhbmRsb2NhbG9wczoKKwluZl91bnJlZ2lzdGVyX2hvb2soJmlwX2Nvbm50cmFja19vdXRfb3BzKTsKKyBjbGVhbnVwX2luYW5kbG9jYWxvcHM6CisJbmZfdW5yZWdpc3Rlcl9ob29rKCZpcF9jb25udHJhY2tfbG9jYWxfb3V0X29wcyk7CisgY2xlYW51cF9pbm9wczoKKwluZl91bnJlZ2lzdGVyX2hvb2soJmlwX2Nvbm50cmFja19pbl9vcHMpOworIGNsZWFudXBfZGVmcmFnbG9jYWxvcHM6CisJbmZfdW5yZWdpc3Rlcl9ob29rKCZpcF9jb25udHJhY2tfZGVmcmFnX2xvY2FsX291dF9vcHMpOworIGNsZWFudXBfZGVmcmFnb3BzOgorCW5mX3VucmVnaXN0ZXJfaG9vaygmaXBfY29ubnRyYWNrX2RlZnJhZ19vcHMpOworIGNsZWFudXBfcHJvY19zdGF0OgorI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJcmVtb3ZlX3Byb2NfZW50cnkoImlwX2Nvbm50cmFjayIsIHByb2NfbmV0X3N0YXQpOworIGNsZWFudXBfcHJvY19leHA6CisJcHJvY19uZXRfcmVtb3ZlKCJpcF9jb25udHJhY2tfZXhwZWN0Iik7CisgY2xlYW51cF9wcm9jOgorCXByb2NfbmV0X3JlbW92ZSgiaXBfY29ubnRyYWNrIik7CisgY2xlYW51cF9pbml0OgorI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisJaXBfY29ubnRyYWNrX2NsZWFudXAoKTsKKyBjbGVhbnVwX25vdGhpbmc6CisJcmV0dXJuIHJldDsKK30KKworLyogRklYTUU6IEFsbG93IE5VTEwgZnVuY3Rpb25zIGFuZCBzdWIgaW4gcG9pbnRlcnMgdG8gZ2VuZXJpYyBmb3IKKyAgIHRoZW0uIC0tUlIgKi8KK2ludCBpcF9jb25udHJhY2tfcHJvdG9jb2xfcmVnaXN0ZXIoc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG8pCit7CisJaW50IHJldCA9IDA7CisKKwlXUklURV9MT0NLKCZpcF9jb25udHJhY2tfbG9jayk7CisJaWYgKGlwX2N0X3Byb3Rvc1twcm90by0+cHJvdG9dICE9ICZpcF9jb25udHJhY2tfZ2VuZXJpY19wcm90b2NvbCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKwlpcF9jdF9wcm90b3NbcHJvdG8tPnByb3RvXSA9IHByb3RvOworIG91dDoKKwlXUklURV9VTkxPQ0soJmlwX2Nvbm50cmFja19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGlwX2Nvbm50cmFja19wcm90b2NvbF91bnJlZ2lzdGVyKHN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvKQoreworCVdSSVRFX0xPQ0soJmlwX2Nvbm50cmFja19sb2NrKTsKKwlpcF9jdF9wcm90b3NbcHJvdG8tPnByb3RvXSA9ICZpcF9jb25udHJhY2tfZ2VuZXJpY19wcm90b2NvbDsKKwlXUklURV9VTkxPQ0soJmlwX2Nvbm50cmFja19sb2NrKTsKKwkKKwkvKiBTb21lYm9keSBjb3VsZCBiZSBzdGlsbCBsb29raW5nIGF0IHRoZSBwcm90byBpbiBiaC4gKi8KKwlzeW5jaHJvbml6ZV9uZXQoKTsKKworCS8qIFJlbW92ZSBhbGwgY29udHJhY2sgZW50cmllcyBmb3IgdGhpcyBwcm90b2NvbCAqLworCWlwX2N0X2l0ZXJhdGVfY2xlYW51cChraWxsX3Byb3RvLCAmcHJvdG8tPnByb3RvKTsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCXJldHVybiBpbml0X29yX2NsZWFudXAoMSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaW5pdF9vcl9jbGVhbnVwKDApOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOworCisvKiBTb21lIG1vZHVsZXMgbmVlZCB1cywgYnV0IGRvbid0IGRlcGVuZCBkaXJlY3RseSBvbiBhbnkgc3ltYm9sLgorICAgVGhleSBzaG91bGQgY2FsbCB0aGlzLiAqLwordm9pZCBuZWVkX2lwX2Nvbm50cmFjayh2b2lkKQoreworfQorCitFWFBPUlRfU1lNQk9MKGlwX2Nvbm50cmFja19wcm90b2NvbF9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGlwX2Nvbm50cmFja19wcm90b2NvbF91bnJlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woaXBfY3RfZ2V0X3R1cGxlKTsKK0VYUE9SVF9TWU1CT0woaW52ZXJ0X3R1cGxlcHIpOworRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfYWx0ZXJfcmVwbHkpOworRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfZGVzdHJveWVkKTsKK0VYUE9SVF9TWU1CT0wobmVlZF9pcF9jb25udHJhY2spOworRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woaXBfY3RfaXRlcmF0ZV9jbGVhbnVwKTsKK0VYUE9SVF9TWU1CT0woaXBfY3RfcmVmcmVzaF9hY2N0KTsKK0VYUE9SVF9TWU1CT0woaXBfY3RfcHJvdG9zKTsKK0VYUE9SVF9TWU1CT0woaXBfY3RfZmluZF9wcm90byk7CitFWFBPUlRfU1lNQk9MKGlwX2Nvbm50cmFja19leHBlY3RfYWxsb2MpOworRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfZXhwZWN0X2ZyZWUpOworRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQpOworRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZCk7CitFWFBPUlRfU1lNQk9MKGlwX2Nvbm50cmFja190dXBsZV90YWtlbik7CitFWFBPUlRfU1lNQk9MKGlwX2N0X2dhdGhlcl9mcmFncyk7CitFWFBPUlRfU1lNQk9MKGlwX2Nvbm50cmFja19odGFibGVfc2l6ZSk7CitFWFBPUlRfU1lNQk9MKGlwX2Nvbm50cmFja19sb2NrKTsKK0VYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX2hhc2gpOworRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfdW50cmFja2VkKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGlwX2Nvbm50cmFja19maW5kX2dldCk7CitFWFBPUlRfU1lNQk9MX0dQTChpcF9jb25udHJhY2tfcHV0KTsKKyNpZmRlZiBDT05GSUdfSVBfTkZfTkFUX05FRURFRAorRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfdGNwX3VwZGF0ZSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfdGZ0cC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja190ZnRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyZmFjMwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfdGZ0cC5jCkBAIC0wLDAgKzEsMTU5IEBACisvKiAoQykgMjAwMS0yMDAyIE1hZ251cyBCb2RlbiA8bWJAb3phYmEubWluZS5udT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFZlcnNpb246IDAuMC43CisgKgorICogVGh1IDIxIE1hciAyMDAyIEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAJLSBwb3J0IHRvIG5ld25hdCBBUEkKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3RmdHAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorCitNT0RVTEVfQVVUSE9SKCJNYWdudXMgQm9kZW4gPG1iQG96YWJhLm1pbmUubnU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oInRmdHAgY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBNQVhfUE9SVFMgOAorc3RhdGljIGludCBwb3J0c1tNQVhfUE9SVFNdOworc3RhdGljIGludCBwb3J0c19jOworbW9kdWxlX3BhcmFtX2FycmF5KHBvcnRzLCBpbnQsICZwb3J0c19jLCAwNDAwKTsKK01PRFVMRV9QQVJNX0RFU0MocG9ydHMsICJwb3J0IG51bWJlcnMgb2YgdGZ0cCBzZXJ2ZXJzIik7CisKKyNpZiAwCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pIHByaW50aygiJXM6JXM6IiBmb3JtYXQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCit1bnNpZ25lZCBpbnQgKCppcF9uYXRfdGZ0cF9ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkJIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJCSBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGlwX25hdF90ZnRwX2hvb2spOworCitzdGF0aWMgaW50IHRmdHBfaGVscChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCSAgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCisJCSAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCit7CisJc3RydWN0IHRmdHBoZHIgX3RmdHBoLCAqdGZoOworCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHA7CisJdW5zaWduZWQgaW50IHJldCA9IE5GX0FDQ0VQVDsKKworCXRmaCA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwKKwkJCQkgKCpwc2tiKS0+bmguaXBoLT5paGwqNCtzaXplb2Yoc3RydWN0IHVkcGhkciksCisJCQkJIHNpemVvZihfdGZ0cGgpLCAmX3RmdHBoKTsKKwlpZiAodGZoID09IE5VTEwpCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwlzd2l0Y2ggKG50b2hzKHRmaC0+b3Bjb2RlKSkgeworCS8qIFJSUSBhbmQgV1JRIHdvcmtzIHRoZSBzYW1lIHdheSAqLworCWNhc2UgVEZUUF9PUENPREVfUkVBRDoKKwljYXNlIFRGVFBfT1BDT0RFX1dSSVRFOgorCQlERUJVR1AoIiIpOworCQlEVU1QX1RVUExFKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUpOworCQlEVU1QX1RVUExFKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUpOworCisJCWV4cCA9IGlwX2Nvbm50cmFja19leHBlY3RfYWxsb2MoKTsKKwkJaWYgKGV4cCA9PSBOVUxMKQorCQkJcmV0dXJuIE5GX0RST1A7CisKKwkJZXhwLT50dXBsZSA9IGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZTsKKwkJZXhwLT5tYXNrLnNyYy5pcCA9IDB4ZmZmZmZmZmY7CisJCWV4cC0+bWFzay5kc3QuaXAgPSAweGZmZmZmZmZmOworCQlleHAtPm1hc2suZHN0LnUudWRwLnBvcnQgPSAweGZmZmY7CisJCWV4cC0+bWFzay5kc3QucHJvdG9udW0gPSAweGZmOworCQlleHAtPmV4cGVjdGZuID0gTlVMTDsKKwkJZXhwLT5tYXN0ZXIgPSBjdDsKKworCQlERUJVR1AoImV4cGVjdDogIik7CisJCURVTVBfVFVQTEUoJmV4cC0+dHVwbGUpOworCQlEVU1QX1RVUExFKCZleHAtPm1hc2spOworCQlpZiAoaXBfbmF0X3RmdHBfaG9vaykKKwkJCXJldCA9IGlwX25hdF90ZnRwX2hvb2socHNrYiwgY3RpbmZvLCBleHApOworCQllbHNlIGlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSAhPSAwKSB7CisJCQlpcF9jb25udHJhY2tfZXhwZWN0X2ZyZWUoZXhwKTsKKwkJCXJldCA9IE5GX0RST1A7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBURlRQX09QQ09ERV9EQVRBOgorCWNhc2UgVEZUUF9PUENPREVfQUNLOgorCQlERUJVR1AoIkRhdGEvQUNLIG9wY29kZVxuIik7CisJCWJyZWFrOworCWNhc2UgVEZUUF9PUENPREVfRVJST1I6CisJCURFQlVHUCgiRXJyb3Igb3Bjb2RlXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQKCJVbmtub3duIG9wY29kZVxuIik7CisJfQorCXJldHVybiBORl9BQ0NFUFQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXBfY29ubnRyYWNrX2hlbHBlciB0ZnRwW01BWF9QT1JUU107CitzdGF0aWMgY2hhciB0ZnRwX25hbWVzW01BWF9QT1JUU11bMTBdOworCitzdGF0aWMgdm9pZCBmaW5pKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwIDsgaSA8IHBvcnRzX2M7IGkrKykgeworCQlERUJVR1AoInVucmVnaXN0ZXJpbmcgaGVscGVyIGZvciBwb3J0ICVkXG4iLAorCQkJcG9ydHNbaV0pOworCQlpcF9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJnRmdHBbaV0pOworCX0gCit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgaSwgcmV0OworCWNoYXIgKnRtcG5hbWU7CisKKwlpZiAocG9ydHNfYyA9PSAwKQorCQlwb3J0c1twb3J0c19jKytdID0gVEZUUF9QT1JUOworCisJZm9yIChpID0gMDsgaSA8IHBvcnRzX2M7IGkrKykgeworCQkvKiBDcmVhdGUgaGVscGVyIHN0cnVjdHVyZSAqLworCQltZW1zZXQoJnRmdHBbaV0sIDAsIHNpemVvZihzdHJ1Y3QgaXBfY29ubnRyYWNrX2hlbHBlcikpOworCisJCXRmdHBbaV0udHVwbGUuZHN0LnByb3RvbnVtID0gSVBQUk9UT19VRFA7CisJCXRmdHBbaV0udHVwbGUuc3JjLnUudWRwLnBvcnQgPSBodG9ucyhwb3J0c1tpXSk7CisJCXRmdHBbaV0ubWFzay5kc3QucHJvdG9udW0gPSAweEZGOworCQl0ZnRwW2ldLm1hc2suc3JjLnUudWRwLnBvcnQgPSAweEZGRkY7CisJCXRmdHBbaV0ubWF4X2V4cGVjdGVkID0gMTsKKwkJdGZ0cFtpXS50aW1lb3V0ID0gNSAqIDYwOyAvKiA1IG1pbnV0ZXMgKi8KKwkJdGZ0cFtpXS5tZSA9IFRISVNfTU9EVUxFOworCQl0ZnRwW2ldLmhlbHAgPSB0ZnRwX2hlbHA7CisKKwkJdG1wbmFtZSA9ICZ0ZnRwX25hbWVzW2ldWzBdOworCQlpZiAocG9ydHNbaV0gPT0gVEZUUF9QT1JUKQorCQkJc3ByaW50Zih0bXBuYW1lLCAidGZ0cCIpOworCQllbHNlCisJCQlzcHJpbnRmKHRtcG5hbWUsICJ0ZnRwLSVkIiwgaSk7CisJCXRmdHBbaV0ubmFtZSA9IHRtcG5hbWU7CisKKwkJREVCVUdQKCJwb3J0ICMlZDogJWRcbiIsIGksIHBvcnRzW2ldKTsKKworCQlyZXQ9aXBfY29ubnRyYWNrX2hlbHBlcl9yZWdpc3RlcigmdGZ0cFtpXSk7CisJCWlmIChyZXQpIHsKKwkJCXByaW50aygiRVJST1IgcmVnaXN0ZXJpbmcgaGVscGVyIGZvciBwb3J0ICVkXG4iLAorCQkJCXBvcnRzW2ldKTsKKwkJCWZpbmkoKTsKKwkJCXJldHVybihyZXQpOworCQl9CisJfQorCXJldHVybigwKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfYW1hbmRhLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2FtYW5kYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMWY0MTIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2FtYW5kYS5jCkBAIC0wLDAgKzEsODggQEAKKy8qIEFtYW5kYSBleHRlbnNpb24gZm9yIFRDUCBOQVQgYWx0ZXJhdGlvbi4KKyAqIChDKSAyMDAyIGJ5IEJyaWFuIEouIE11cnJlbGwgPG5ldGZpbHRlckBpbnRlcmxpbnguYmMuY2E+CisgKiBiYXNlZCBvbiBhIGNvcHkgb2YgSFcncyBpcF9uYXRfaXJjLmMgYXMgd2VsbCBhcyBvdGhlciBtb2R1bGVzCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCU1vZHVsZSBsb2FkIHN5bnRheDoKKyAqIAlpbnNtb2QgaXBfbmF0X2FtYW5kYS5vCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPG5ldC91ZHAuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X2hlbHBlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfYW1hbmRhLmg+CisKKworTU9EVUxFX0FVVEhPUigiQnJpYW4gSi4gTXVycmVsbCA8bmV0ZmlsdGVyQGludGVybGlueC5iYy5jYT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW1hbmRhIE5BVCBoZWxwZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBoZWxwKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCSBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCSB1bnNpZ25lZCBpbnQgbWF0Y2hvZmYsCisJCQkgdW5zaWduZWQgaW50IG1hdGNobGVuLAorCQkJIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApCit7CisJY2hhciBidWZmZXJbc2l6ZW9mKCI2NTUzNSIpXTsKKwl1X2ludDE2X3QgcG9ydDsKKwl1bnNpZ25lZCBpbnQgcmV0OworCisJLyogQ29ubmVjdGlvbiBjb21lcyBmcm9tIGNsaWVudC4gKi8KKwlleHAtPnNhdmVkX3Byb3RvLnRjcC5wb3J0ID0gZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydDsKKwlleHAtPmRpciA9IElQX0NUX0RJUl9PUklHSU5BTDsKKworCS8qIFdoZW4geW91IHNlZSB0aGUgcGFja2V0LCB3ZSBuZWVkIHRvIE5BVCBpdCB0aGUgc2FtZSBhcyB0aGUKKwkgKiB0aGlzIG9uZSAoaWUuIHNhbWUgSVA6IGl0IHdpbGwgYmUgVENQIGFuZCBtYXN0ZXIgaXMgVURQKS4gKi8KKwlleHAtPmV4cGVjdGZuID0gaXBfbmF0X2ZvbGxvd19tYXN0ZXI7CisKKwkvKiBUcnkgdG8gZ2V0IHNhbWUgcG9ydDogaWYgbm90LCB0cnkgdG8gY2hhbmdlIGl0LiAqLworCWZvciAocG9ydCA9IG50b2hzKGV4cC0+c2F2ZWRfcHJvdG8udGNwLnBvcnQpOyBwb3J0ICE9IDA7IHBvcnQrKykgeworCQlleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0ID0gaHRvbnMocG9ydCk7CisJCWlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKHBvcnQgPT0gMCkgeworCQlpcF9jb25udHJhY2tfZXhwZWN0X2ZyZWUoZXhwKTsKKwkJcmV0dXJuIE5GX0RST1A7CisJfQorCisJc3ByaW50ZihidWZmZXIsICIldSIsIHBvcnQpOworCXJldCA9IGlwX25hdF9tYW5nbGVfdWRwX3BhY2tldChwc2tiLCBleHAtPm1hc3RlciwgY3RpbmZvLAorCQkJCSAgICAgICBtYXRjaG9mZiwgbWF0Y2hsZW4sCisJCQkJICAgICAgIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworCWlmIChyZXQgIT0gTkZfQUNDRVBUKQorCQlpcF9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChleHApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaXBfbmF0X2FtYW5kYV9ob29rID0gTlVMTDsKKwkvKiBNYWtlIHN1cmUgbm9vbmUgY2FsbHMgaXQsIG1lYW53aGlsZS4gKi8KKwlzeW5jaHJvbml6ZV9uZXQoKTsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCUJVR19PTihpcF9uYXRfYW1hbmRhX2hvb2spOworCWlwX25hdF9hbWFuZGFfaG9vayA9IGhlbHA7CisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2NvcmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MmNlYWMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2NvcmUuYwpAQCAtMCwwICsxLDU1NiBAQAorLyogTkFUIGZvciBuZXRmaWx0ZXI7IHNoYXJlZCB3aXRoIGNvbXBhdGliaWxpdHkgbGF5ZXIuICovCisKKy8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKKyAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bmV0L2ljbXAuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+ICAvKiBGb3IgdGNwX3Byb3QgaW4gZ2V0b3JpZ2RzdCAqLworI2luY2x1ZGUgPGxpbnV4L2ljbXAuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgorCisjZGVmaW5lIEFTU0VSVF9SRUFEX0xPQ0soeCkgTVVTVF9CRV9SRUFEX0xPQ0tFRCgmaXBfbmF0X2xvY2spCisjZGVmaW5lIEFTU0VSVF9XUklURV9MT0NLKHgpIE1VU1RfQkVfV1JJVEVfTE9DS0VEKCZpcF9uYXRfbG9jaykKKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfaGVscGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2xpc3RoZWxwLmg+CisKKyNpZiAwCisjZGVmaW5lIERFQlVHUCBwcmludGsKKyNlbHNlCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworREVDTEFSRV9SV0xPQ0soaXBfbmF0X2xvY2spOworCisvKiBDYWxjdWxhdGVkIGF0IGluaXQgYmFzZWQgb24gbWVtb3J5IHNpemUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXBfbmF0X2h0YWJsZV9zaXplOworCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqYnlzb3VyY2U7CitzdHJ1Y3QgaXBfbmF0X3Byb3RvY29sICppcF9uYXRfcHJvdG9zW01BWF9JUF9OQVRfUFJPVE9dOworCisKKy8qIFdlIGtlZXAgYW4gZXh0cmEgaGFzaCBmb3IgZWFjaCBjb25udHJhY2ssIGZvciBmYXN0IHNlYXJjaGluZy4gKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CitoYXNoX2J5X3NyYyhjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKK3sKKwkvKiBPcmlnaW5hbCBzcmMsIHRvIGVuc3VyZSB3ZSBtYXAgaXQgY29uc2lzdGVudGx5IGlmIHBvc3MuICovCisJcmV0dXJuIGpoYXNoXzN3b3Jkcyh0dXBsZS0+c3JjLmlwLCB0dXBsZS0+c3JjLnUuYWxsLAorCQkJICAgIHR1cGxlLT5kc3QucHJvdG9udW0sIDApICUgaXBfbmF0X2h0YWJsZV9zaXplOworfQorCisvKiBOb29uZSB1c2luZyBjb25udHJhY2sgYnkgdGhlIHRpbWUgdGhpcyBjYWxsZWQuICovCitzdGF0aWMgdm9pZCBpcF9uYXRfY2xlYW51cF9jb25udHJhY2soc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubikKK3sKKwlpZiAoIShjb25uLT5zdGF0dXMgJiBJUFNfTkFUX0RPTkVfTUFTSykpCisJCXJldHVybjsKKworCVdSSVRFX0xPQ0soJmlwX25hdF9sb2NrKTsKKwlsaXN0X2RlbCgmY29ubi0+bmF0LmluZm8uYnlzb3VyY2UpOworCVdSSVRFX1VOTE9DSygmaXBfbmF0X2xvY2spOworfQorCisvKiBXZSBkbyBjaGVja3N1bSBtYW5nbGluZywgc28gaWYgdGhleSB3ZXJlIHdyb25nIGJlZm9yZSB0aGV5J3JlIHN0aWxsCisgKiB3cm9uZy4gIEFsc28gd29ya3MgZm9yIGluY29tcGxldGUgcGFja2V0cyAoZWcuIElDTVAgZGVzdAorICogdW5yZWFjaGFibGVzLikgKi8KK3VfaW50MTZfdAoraXBfbmF0X2NoZWF0X2NoZWNrKHVfaW50MzJfdCBvbGR2YWxpbnYsIHVfaW50MzJfdCBuZXd2YWwsIHVfaW50MTZfdCBvbGRjaGVjaykKK3sKKwl1X2ludDMyX3QgZGlmZnNbXSA9IHsgb2xkdmFsaW52LCBuZXd2YWwgfTsKKwlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fcGFydGlhbCgoY2hhciAqKWRpZmZzLCBzaXplb2YoZGlmZnMpLAorCQkJCSAgICAgIG9sZGNoZWNrXjB4RkZGRikpOworfQorCisvKiBJcyB0aGlzIHR1cGxlIGFscmVhZHkgdGFrZW4/IChub3QgYnkgdXMpICovCitpbnQKK2lwX25hdF91c2VkX3R1cGxlKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAorCQkgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmlnbm9yZWRfY29ubnRyYWNrKQoreworCS8qIENvbm50cmFjayB0cmFja2luZyBkb2Vzbid0IGtlZXAgdHJhY2sgb2Ygb3V0Z29pbmcgdHVwbGVzOyBvbmx5CisJICAgaW5jb21pbmcgb25lcy4gIE5BVCBtZWFucyB0aGV5IGRvbid0IGhhdmUgYSBmaXhlZCBtYXBwaW5nLAorCSAgIHNvIHdlIGludmVydCB0aGUgdHVwbGUgYW5kIGxvb2sgZm9yIHRoZSBpbmNvbWluZyByZXBseS4KKworCSAgIFdlIGNvdWxkIGtlZXAgYSBzZXBhcmF0ZSBoYXNoIGlmIHRoaXMgcHJvdmVzIHRvbyBzbG93LiAqLworCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgcmVwbHk7CisKKwlpbnZlcnRfdHVwbGVwcigmcmVwbHksIHR1cGxlKTsKKwlyZXR1cm4gaXBfY29ubnRyYWNrX3R1cGxlX3Rha2VuKCZyZXBseSwgaWdub3JlZF9jb25udHJhY2spOworfQorCisvKiBJZiB3ZSBzb3VyY2UgbWFwIHRoaXMgdHVwbGUgc28gcmVwbHkgbG9va3MgbGlrZSByZXBseV90dXBsZSwgd2lsbAorICogdGhhdCBtZWV0IHRoZSBjb25zdHJhaW50cyBvZiByYW5nZS4gKi8KK3N0YXRpYyBpbnQKK2luX3JhbmdlKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAorCSBjb25zdCBzdHJ1Y3QgaXBfbmF0X3JhbmdlICpyYW5nZSkKK3sKKwlzdHJ1Y3QgaXBfbmF0X3Byb3RvY29sICpwcm90byA9IGlwX25hdF9maW5kX3Byb3RvKHR1cGxlLT5kc3QucHJvdG9udW0pOworCisJLyogSWYgd2UgYXJlIHN1cHBvc2VkIHRvIG1hcCBJUHMsIHRoZW4gd2UgbXVzdCBiZSBpbiB0aGUKKwkgICByYW5nZSBzcGVjaWZpZWQsIG90aGVyd2lzZSBsZXQgdGhpcyBkcmFnIHVzIG9udG8gYSBuZXcgc3JjIElQLiAqLworCWlmIChyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfTUFQX0lQUykgeworCQlpZiAobnRvaGwodHVwbGUtPnNyYy5pcCkgPCBudG9obChyYW5nZS0+bWluX2lwKQorCQkgICAgfHwgbnRvaGwodHVwbGUtPnNyYy5pcCkgPiBudG9obChyYW5nZS0+bWF4X2lwKSkKKwkJCXJldHVybiAwOworCX0KKworCWlmICghKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpCisJICAgIHx8IHByb3RvLT5pbl9yYW5nZSh0dXBsZSwgSVBfTkFUX01BTklQX1NSQywKKwkJCSAgICAgICAmcmFuZ2UtPm1pbiwgJnJhbmdlLT5tYXgpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorc2FtZV9zcmMoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCisJIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQoreworCXJldHVybiAoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5wcm90b251bQorCQk9PSB0dXBsZS0+ZHN0LnByb3RvbnVtCisJCSYmIGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMuaXAKKwkJPT0gdHVwbGUtPnNyYy5pcAorCQkmJiBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLnUuYWxsCisJCT09IHR1cGxlLT5zcmMudS5hbGwpOworfQorCisvKiBPbmx5IGNhbGxlZCBmb3IgU1JDIG1hbmlwICovCitzdGF0aWMgaW50CitmaW5kX2FwcHJvcHJpYXRlX3NyYyhjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKKwkJICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICpyZXN1bHQsCisJCSAgICAgY29uc3Qgc3RydWN0IGlwX25hdF9yYW5nZSAqcmFuZ2UpCit7CisJdW5zaWduZWQgaW50IGggPSBoYXNoX2J5X3NyYyh0dXBsZSk7CisJc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7CisKKwlSRUFEX0xPQ0soJmlwX25hdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN0LCAmYnlzb3VyY2VbaF0sIG5hdC5pbmZvLmJ5c291cmNlKSB7CisJCWlmIChzYW1lX3NyYyhjdCwgdHVwbGUpKSB7CisJCQkvKiBDb3B5IHNvdXJjZSBwYXJ0IGZyb20gcmVwbHkgdHVwbGUuICovCisJCQlpbnZlcnRfdHVwbGVwcihyZXN1bHQsCisJCQkJICAgICAgICZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUpOworCQkJcmVzdWx0LT5kc3QgPSB0dXBsZS0+ZHN0OworCisJCQlpZiAoaW5fcmFuZ2UocmVzdWx0LCByYW5nZSkpIHsKKwkJCQlSRUFEX1VOTE9DSygmaXBfbmF0X2xvY2spOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCVJFQURfVU5MT0NLKCZpcF9uYXRfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEZvciBbRlVUVVJFXSBmcmFnbWVudGF0aW9uIGhhbmRsaW5nLCB3ZSB3YW50IHRoZSBsZWFzdC11c2VkCisgICBzcmMtaXAvZHN0LWlwL3Byb3RvIHRyaXBsZS4gIEZhaXJuZXNzIGRvZXNuJ3QgY29tZSBpbnRvIGl0LiAgVGh1cworICAgaWYgdGhlIHJhbmdlIHNwZWNpZmllcyAxLjIuMy40IHBvcnRzIDEwMDAwLTEwMDA1IGFuZCAxLjIuMy41IHBvcnRzCisgICAxLTY1NTM1LCB3ZSBkb24ndCBkbyBwcm8tcmF0YSBhbGxvY2F0aW9uIGJhc2VkIG9uIHBvcnRzOyB3ZSBjaG9vc2UKKyAgIHRoZSBpcCB3aXRoIHRoZSBsb3dlc3Qgc3JjLWlwL2RzdC1pcC9wcm90byB1c2FnZS4KKyovCitzdGF0aWMgdm9pZAorZmluZF9iZXN0X2lwc19wcm90byhzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKKwkJICAgIGNvbnN0IHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlLAorCQkgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAorCQkgICAgZW51bSBpcF9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUpCit7CisJdV9pbnQzMl90ICp2YXJfaXBwOworCS8qIEhvc3Qgb3JkZXIgKi8KKwl1X2ludDMyX3QgbWluaXAsIG1heGlwLCBqOworCisJLyogTm8gSVAgbWFwcGluZz8gIERvIG5vdGhpbmcuICovCisJaWYgKCEocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX01BUF9JUFMpKQorCQlyZXR1cm47CisKKwlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9TUkMpCisJCXZhcl9pcHAgPSAmdHVwbGUtPnNyYy5pcDsKKwllbHNlCisJCXZhcl9pcHAgPSAmdHVwbGUtPmRzdC5pcDsKKworCS8qIEZhc3QgcGF0aDogb25seSBvbmUgY2hvaWNlLiAqLworCWlmIChyYW5nZS0+bWluX2lwID09IHJhbmdlLT5tYXhfaXApIHsKKwkJKnZhcl9pcHAgPSByYW5nZS0+bWluX2lwOworCQlyZXR1cm47CisJfQorCisJLyogSGFzaGluZyBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIElQcyBnaXZlcyBhIGZhaXJseSBldmVuCisJICogc3ByZWFkIGluIHByYWN0aWNlIChpZiB0aGVyZSBhcmUgYSBzbWFsbCBudW1iZXIgb2YgSVBzCisJICogaW52b2x2ZWQsIHRoZXJlIHVzdWFsbHkgYXJlbid0IHRoYXQgbWFueSBjb25uZWN0aW9ucworCSAqIGFueXdheSkuICBUaGUgY29uc2lzdGVuY3kgbWVhbnMgdGhhdCBzZXJ2ZXJzIHNlZSB0aGUgc2FtZQorCSAqIGNsaWVudCBjb21pbmcgZnJvbSB0aGUgc2FtZSBJUCAoc29tZSBJbnRlcm5ldCBCYW5raW5nIHNpdGVzCisJICogbGlrZSB0aGlzKSwgZXZlbiBhY3Jvc3MgcmVib290cy4gKi8KKwltaW5pcCA9IG50b2hsKHJhbmdlLT5taW5faXApOworCW1heGlwID0gbnRvaGwocmFuZ2UtPm1heF9pcCk7CisJaiA9IGpoYXNoXzJ3b3Jkcyh0dXBsZS0+c3JjLmlwLCB0dXBsZS0+ZHN0LmlwLCAwKTsKKwkqdmFyX2lwcCA9IGh0b25sKG1pbmlwICsgaiAlIChtYXhpcCAtIG1pbmlwICsgMSkpOworfQorCisvKiBNYW5pcHVsYXRlIHRoZSB0dXBsZSBpbnRvIHRoZSByYW5nZSBnaXZlbi4gIEZvciBORl9JUF9QT1NUX1JPVVRJTkcsCisgKiB3ZSBjaGFuZ2UgdGhlIHNvdXJjZSB0byBtYXAgaW50byB0aGUgcmFuZ2UuICBGb3IgTkZfSVBfUFJFX1JPVVRJTkcKKyAqIGFuZCBORl9JUF9MT0NBTF9PVVQsIHdlIGNoYW5nZSB0aGUgZGVzdGluYXRpb24gdG8gbWFwIGludG8gdGhlCisgKiByYW5nZS4gIEl0IG1pZ2h0IG5vdCBiZSBwb3NzaWJsZSB0byBnZXQgYSB1bmlxdWUgdHVwbGUsIGJ1dCB3ZSB0cnkuCisgKiBBdCB3b3JzdCAob3IgaWYgd2UgcmFjZSksIHdlIHdpbGwgZW5kIHVwIHdpdGggYSBmaW5hbCBkdXBsaWNhdGUgaW4KKyAqIF9faXBfY29ubnRyYWNrX2NvbmZpcm0gYW5kIGRyb3AgdGhlIHBhY2tldC4gKi8KK3N0YXRpYyB2b2lkCitnZXRfdW5pcXVlX3R1cGxlKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAorCQkgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqb3JpZ190dXBsZSwKKwkJIGNvbnN0IHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlLAorCQkgc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAorCQkgZW51bSBpcF9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUpCit7CisJc3RydWN0IGlwX25hdF9wcm90b2NvbCAqcHJvdG8KKwkJPSBpcF9uYXRfZmluZF9wcm90byhvcmlnX3R1cGxlLT5kc3QucHJvdG9udW0pOworCisJLyogMSkgSWYgdGhpcyBzcmNpcC9wcm90by9zcmMtcHJvdG8tcGFydCBpcyBjdXJyZW50bHkgbWFwcGVkLAorCSAgIGFuZCB0aGF0IHNhbWUgbWFwcGluZyBnaXZlcyBhIHVuaXF1ZSB0dXBsZSB3aXRoaW4gdGhlIGdpdmVuCisJICAgcmFuZ2UsIHVzZSB0aGF0LgorCisJICAgVGhpcyBpcyBvbmx5IHJlcXVpcmVkIGZvciBzb3VyY2UgKGllLiBOQVQvbWFzcSkgbWFwcGluZ3MuCisJICAgU28gZmFyLCB3ZSBkb24ndCBkbyBsb2NhbCBzb3VyY2UgbWFwcGluZ3MsIHNvIG11bHRpcGxlCisJICAgbWFuaXBzIG5vdCBhbiBpc3N1ZS4gICovCisJaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKSB7CisJCWlmIChmaW5kX2FwcHJvcHJpYXRlX3NyYyhvcmlnX3R1cGxlLCB0dXBsZSwgcmFuZ2UpKSB7CisJCQlERUJVR1AoImdldF91bmlxdWVfdHVwbGU6IEZvdW5kIGN1cnJlbnQgc3JjIG1hcFxuIik7CisJCQlpZiAoIWlwX25hdF91c2VkX3R1cGxlKHR1cGxlLCBjb25udHJhY2spKQorCQkJCXJldHVybjsKKwkJfQorCX0KKworCS8qIDIpIFNlbGVjdCB0aGUgbGVhc3QtdXNlZCBJUC9wcm90byBjb21iaW5hdGlvbiBpbiB0aGUgZ2l2ZW4KKwkgICByYW5nZS4gKi8KKwkqdHVwbGUgPSAqb3JpZ190dXBsZTsKKwlmaW5kX2Jlc3RfaXBzX3Byb3RvKHR1cGxlLCByYW5nZSwgY29ubnRyYWNrLCBtYW5pcHR5cGUpOworCisJLyogMykgVGhlIHBlci1wcm90b2NvbCBwYXJ0IG9mIHRoZSBtYW5pcCBpcyBtYWRlIHRvIG1hcCBpbnRvCisJICAgdGhlIHJhbmdlIHRvIG1ha2UgYSB1bmlxdWUgdHVwbGUuICovCisKKwkvKiBPbmx5IGJvdGhlciBtYXBwaW5nIGlmIGl0J3Mgbm90IGFscmVhZHkgaW4gcmFuZ2UgYW5kIHVuaXF1ZSAqLworCWlmICgoIShyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEKQorCSAgICAgfHwgcHJvdG8tPmluX3JhbmdlKHR1cGxlLCBtYW5pcHR5cGUsICZyYW5nZS0+bWluLCAmcmFuZ2UtPm1heCkpCisJICAgICYmICFpcF9uYXRfdXNlZF90dXBsZSh0dXBsZSwgY29ubnRyYWNrKSkKKwkJcmV0dXJuOworCisJLyogTGFzdCBjaGFuZ2U6IGdldCBwcm90b2NvbCB0byB0cnkgdG8gb2J0YWluIHVuaXF1ZSB0dXBsZS4gKi8KKwlwcm90by0+dW5pcXVlX3R1cGxlKHR1cGxlLCByYW5nZSwgbWFuaXB0eXBlLCBjb25udHJhY2spOworfQorCit1bnNpZ25lZCBpbnQKK2lwX25hdF9zZXR1cF9pbmZvKHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaywKKwkJICBjb25zdCBzdHJ1Y3QgaXBfbmF0X3JhbmdlICpyYW5nZSwKKwkJICB1bnNpZ25lZCBpbnQgaG9va251bSkKK3sKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlIGN1cnJfdHVwbGUsIG5ld190dXBsZTsKKwlzdHJ1Y3QgaXBfbmF0X2luZm8gKmluZm8gPSAmY29ubnRyYWNrLT5uYXQuaW5mbzsKKwlpbnQgaGF2ZV90b19oYXNoID0gIShjb25udHJhY2stPnN0YXR1cyAmIElQU19OQVRfRE9ORV9NQVNLKTsKKwllbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSA9IEhPT0syTUFOSVAoaG9va251bSk7CisKKwlJUF9ORl9BU1NFUlQoaG9va251bSA9PSBORl9JUF9QUkVfUk9VVElORworCQkgICAgIHx8IGhvb2tudW0gPT0gTkZfSVBfUE9TVF9ST1VUSU5HCisJCSAgICAgfHwgaG9va251bSA9PSBORl9JUF9MT0NBTF9JTgorCQkgICAgIHx8IGhvb2tudW0gPT0gTkZfSVBfTE9DQUxfT1VUKTsKKwlCVUdfT04oaXBfbmF0X2luaXRpYWxpemVkKGNvbm50cmFjaywgbWFuaXB0eXBlKSk7CisKKwkvKiBXaGF0IHdlJ3ZlIGdvdCB3aWxsIGxvb2sgbGlrZSBpbnZlcnNlIG9mIHJlcGx5LiBOb3JtYWxseQorCSAgIHRoaXMgaXMgd2hhdCBpcyBpbiB0aGUgY29ubnRyYWNrLCBleGNlcHQgZm9yIHByaW9yCisJICAgbWFuaXB1bGF0aW9ucyAoZnV0dXJlIG9wdGltaXphdGlvbjogaWYgbnVtX21hbmlwcyA9PSAwLAorCSAgIG9yaWdfdHAgPQorCSAgIGNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUpICovCisJaW52ZXJ0X3R1cGxlcHIoJmN1cnJfdHVwbGUsCisJCSAgICAgICAmY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZSk7CisKKwlnZXRfdW5pcXVlX3R1cGxlKCZuZXdfdHVwbGUsICZjdXJyX3R1cGxlLCByYW5nZSwgY29ubnRyYWNrLCBtYW5pcHR5cGUpOworCisJaWYgKCFpcF9jdF90dXBsZV9lcXVhbCgmbmV3X3R1cGxlLCAmY3Vycl90dXBsZSkpIHsKKwkJc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSByZXBseTsKKworCQkvKiBBbHRlciBjb25udHJhY2sgdGFibGUgc28gd2lsbCByZWNvZ25pemUgcmVwbGllcy4gKi8KKwkJaW52ZXJ0X3R1cGxlcHIoJnJlcGx5LCAmbmV3X3R1cGxlKTsKKwkJaXBfY29ubnRyYWNrX2FsdGVyX3JlcGx5KGNvbm50cmFjaywgJnJlcGx5KTsKKworCQkvKiBOb24tYXRvbWljOiB3ZSBvd24gdGhpcyBhdCB0aGUgbW9tZW50LiAqLworCQlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9TUkMpCisJCQljb25udHJhY2stPnN0YXR1cyB8PSBJUFNfU1JDX05BVDsKKwkJZWxzZQorCQkJY29ubnRyYWNrLT5zdGF0dXMgfD0gSVBTX0RTVF9OQVQ7CisJfQorCisJLyogUGxhY2UgaW4gc291cmNlIGhhc2ggaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZS4gKi8KKwlpZiAoaGF2ZV90b19oYXNoKSB7CisJCXVuc2lnbmVkIGludCBzcmNoYXNoCisJCQk9IGhhc2hfYnlfc3JjKCZjb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdCisJCQkJICAgICAgLnR1cGxlKTsKKwkJV1JJVEVfTE9DSygmaXBfbmF0X2xvY2spOworCQlsaXN0X2FkZCgmaW5mby0+Ynlzb3VyY2UsICZieXNvdXJjZVtzcmNoYXNoXSk7CisJCVdSSVRFX1VOTE9DSygmaXBfbmF0X2xvY2spOworCX0KKworCS8qIEl0J3MgZG9uZS4gKi8KKwlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9EU1QpCisJCXNldF9iaXQoSVBTX0RTVF9OQVRfRE9ORV9CSVQsICZjb25udHJhY2stPnN0YXR1cyk7CisJZWxzZQorCQlzZXRfYml0KElQU19TUkNfTkFUX0RPTkVfQklULCAmY29ubnRyYWNrLT5zdGF0dXMpOworCisJcmV0dXJuIE5GX0FDQ0VQVDsKK30KKworLyogUmV0dXJucyB0cnVlIGlmIHN1Y2NlZWRlZC4gKi8KK3N0YXRpYyBpbnQKK21hbmlwX3BrdCh1X2ludDE2X3QgcHJvdG8sCisJICBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJICB1bnNpZ25lZCBpbnQgaXBoZHJvZmYsCisJICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0YXJnZXQsCisJICBlbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSkKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKworCSgqcHNrYiktPm5mY2FjaGUgfD0gTkZDX0FMVEVSRUQ7CisJaWYgKCFza2JfaXBfbWFrZV93cml0YWJsZShwc2tiLCBpcGhkcm9mZiArIHNpemVvZigqaXBoKSkpCisJCXJldHVybiAwOworCisJaXBoID0gKHZvaWQgKikoKnBza2IpLT5kYXRhICsgaXBoZHJvZmY7CisKKwkvKiBNYW5pcHVsYXRlIHByb3Rjb2wgcGFydC4gKi8KKwlpZiAoIWlwX25hdF9maW5kX3Byb3RvKHByb3RvKS0+bWFuaXBfcGt0KHBza2IsIGlwaGRyb2ZmLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LCBtYW5pcHR5cGUpKQorCQlyZXR1cm4gMDsKKworCWlwaCA9ICh2b2lkICopKCpwc2tiKS0+ZGF0YSArIGlwaGRyb2ZmOworCisJaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKSB7CisJCWlwaC0+Y2hlY2sgPSBpcF9uYXRfY2hlYXRfY2hlY2sofmlwaC0+c2FkZHIsIHRhcmdldC0+c3JjLmlwLAorCQkJCQkJaXBoLT5jaGVjayk7CisJCWlwaC0+c2FkZHIgPSB0YXJnZXQtPnNyYy5pcDsKKwl9IGVsc2UgeworCQlpcGgtPmNoZWNrID0gaXBfbmF0X2NoZWF0X2NoZWNrKH5pcGgtPmRhZGRyLCB0YXJnZXQtPmRzdC5pcCwKKwkJCQkJCWlwaC0+Y2hlY2spOworCQlpcGgtPmRhZGRyID0gdGFyZ2V0LT5kc3QuaXA7CisJfQorCXJldHVybiAxOworfQorCisvKiBEbyBwYWNrZXQgbWFuaXB1bGF0aW9ucyBhY2NvcmRpbmcgdG8gaXBfbmF0X3NldHVwX2luZm8uICovCit1bnNpZ25lZCBpbnQgbmF0X3BhY2tldChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKKwkJCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJdW5zaWduZWQgaW50IGhvb2tudW0sCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpCit7CisJZW51bSBpcF9jb25udHJhY2tfZGlyIGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKwl1bnNpZ25lZCBsb25nIHN0YXR1c2JpdDsKKwllbnVtIGlwX25hdF9tYW5pcF90eXBlIG10eXBlID0gSE9PSzJNQU5JUChob29rbnVtKTsKKworCWlmICh0ZXN0X2JpdChJUFNfU0VRX0FESlVTVF9CSVQsICZjdC0+c3RhdHVzKQorCSAgICAmJiAoaG9va251bSA9PSBORl9JUF9QT1NUX1JPVVRJTkcgfHwgaG9va251bSA9PSBORl9JUF9MT0NBTF9JTikpIHsKKwkJREVCVUdQKCJpcF9uYXRfY29yZTogYWRqdXN0aW5nIHNlcXVlbmNlIG51bWJlclxuIik7CisJCS8qIGZ1dHVyZTogcHV0IHRoaXMgaW4gYSBsNC1wcm90byBzcGVjaWZpYyBmdW5jdGlvbiwKKwkJICogYW5kIGNhbGwgdGhpcyBmdW5jdGlvbiBoZXJlLiAqLworCQlpZiAoIWlwX25hdF9zZXFfYWRqdXN0KHBza2IsIGN0LCBjdGluZm8pKQorCQkJcmV0dXJuIE5GX0RST1A7CisJfQorCisJaWYgKG10eXBlID09IElQX05BVF9NQU5JUF9TUkMpCisJCXN0YXR1c2JpdCA9IElQU19TUkNfTkFUOworCWVsc2UKKwkJc3RhdHVzYml0ID0gSVBTX0RTVF9OQVQ7CisKKwkvKiBJbnZlcnQgaWYgdGhpcyBpcyByZXBseSBkaXIuICovCisJaWYgKGRpciA9PSBJUF9DVF9ESVJfUkVQTFkpCisJCXN0YXR1c2JpdCBePSBJUFNfTkFUX01BU0s7CisKKwkvKiBOb24tYXRvbWljOiB0aGVzZSBiaXRzIGRvbid0IGNoYW5nZS4gKi8KKwlpZiAoY3QtPnN0YXR1cyAmIHN0YXR1c2JpdCkgeworCQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlIHRhcmdldDsKKworCQkvKiBXZSBhcmUgYWltaW5nIHRvIGxvb2sgbGlrZSBpbnZlcnNlIG9mIG90aGVyIGRpcmVjdGlvbi4gKi8KKwkJaW52ZXJ0X3R1cGxlcHIoJnRhcmdldCwgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUpOworCisJCWlmICghbWFuaXBfcGt0KHRhcmdldC5kc3QucHJvdG9udW0sIHBza2IsIDAsICZ0YXJnZXQsIG10eXBlKSkKKwkJCXJldHVybiBORl9EUk9QOworCX0KKwlyZXR1cm4gTkZfQUNDRVBUOworfQorCisvKiBEaXIgaXMgZGlyZWN0aW9uIElDTVAgaXMgY29taW5nIGZyb20gKG9wcG9zaXRlIHRvIHBhY2tldCBpdCBjb250YWlucykgKi8KK2ludCBpY21wX3JlcGx5X3RyYW5zbGF0aW9uKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCSAgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAorCQkJICAgZW51bSBpcF9uYXRfbWFuaXBfdHlwZSBtYW5pcCwKKwkJCSAgIGVudW0gaXBfY29ubnRyYWNrX2RpciBkaXIpCit7CisJc3RydWN0IHsKKwkJc3RydWN0IGljbXBoZHIgaWNtcDsKKwkJc3RydWN0IGlwaGRyIGlwOworCX0gKmluc2lkZTsKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlIGlubmVyLCB0YXJnZXQ7CisJaW50IGhkcmxlbiA9ICgqcHNrYiktPm5oLmlwaC0+aWhsICogNDsKKworCWlmICghc2tiX2lwX21ha2Vfd3JpdGFibGUocHNrYiwgaGRybGVuICsgc2l6ZW9mKCppbnNpZGUpKSkKKwkJcmV0dXJuIDA7CisKKwlpbnNpZGUgPSAodm9pZCAqKSgqcHNrYiktPmRhdGEgKyAoKnBza2IpLT5uaC5pcGgtPmlobCo0OworCisJLyogV2UncmUgYWN0dWFsbHkgZ29pbmcgdG8gbWFuZ2xlIGl0IGJleW9uZCB0cml2aWFsIGNoZWNrc3VtCisJICAgYWRqdXN0bWVudCwgc28gbWFrZSBzdXJlIHRoZSBjdXJyZW50IGNoZWNrc3VtIGlzIGNvcnJlY3QuICovCisJaWYgKCgqcHNrYiktPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSkgeworCQloZHJsZW4gPSAoKnBza2IpLT5uaC5pcGgtPmlobCAqIDQ7CisJCWlmICgodTE2KWNzdW1fZm9sZChza2JfY2hlY2tzdW0oKnBza2IsIGhkcmxlbiwKKwkJCQkJCSgqcHNrYiktPmxlbiAtIGhkcmxlbiwgMCkpKQorCQkJcmV0dXJuIDA7CisJfQorCisJLyogTXVzdCBiZSBSRUxBVEVEICovCisJSVBfTkZfQVNTRVJUKCgqcHNrYiktPm5mY3RpbmZvID09IElQX0NUX1JFTEFURUQgfHwKKwkJICAgICAoKnBza2IpLT5uZmN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEK0lQX0NUX0lTX1JFUExZKTsKKworCS8qIFJlZGlyZWN0cyBvbiBub24tbnVsbCBuYXRzIG11c3QgYmUgZHJvcHBlZCwgZWxzZSB0aGV5J2xsCisgICAgICAgICAgIHN0YXJ0IHRhbGtpbmcgdG8gZWFjaCBvdGhlciB3aXRob3V0IG91ciB0cmFuc2xhdGlvbiwgYW5kIGJlCisgICAgICAgICAgIGNvbmZ1c2VkLi4uIC0tUlIgKi8KKwlpZiAoaW5zaWRlLT5pY21wLnR5cGUgPT0gSUNNUF9SRURJUkVDVCkgeworCQkvKiBJZiBOQVQgaXNuJ3QgZmluaXNoZWQsIGFzc3VtZSBpdCBhbmQgZHJvcC4gKi8KKwkJaWYgKChjdC0+c3RhdHVzICYgSVBTX05BVF9ET05FX01BU0spICE9IElQU19OQVRfRE9ORV9NQVNLKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKGN0LT5zdGF0dXMgJiBJUFNfTkFUX01BU0spCisJCQlyZXR1cm4gMDsKKwl9CisKKwlERUJVR1AoImljbXBfcmVwbHlfdHJhbnNsYXRpb246IHRyYW5zbGF0aW5nIGVycm9yICVwIG1hbnAgJXUgZGlyICVzXG4iLAorCSAgICAgICAqcHNrYiwgbWFuaXAsIGRpciA9PSBJUF9DVF9ESVJfT1JJR0lOQUwgPyAiT1JJRyIgOiAiUkVQTFkiKTsKKworCWlmICghaXBfY3RfZ2V0X3R1cGxlKCZpbnNpZGUtPmlwLCAqcHNrYiwgKCpwc2tiKS0+bmguaXBoLT5paGwqNCArCisJICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpY21waGRyKSArIGluc2lkZS0+aXAuaWhsKjQsCisJICAgICAgICAgICAgICAgICAgICAgJmlubmVyLCBpcF9jdF9maW5kX3Byb3RvKGluc2lkZS0+aXAucHJvdG9jb2wpKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBDaGFuZ2UgaW5uZXIgYmFjayB0byBsb29rIGxpa2UgaW5jb21pbmcgcGFja2V0LiAgV2UgZG8gdGhlCisJICAgb3Bwb3NpdGUgbWFuaXAgb24gdGhpcyBob29rIHRvIG5vcm1hbCwgYmVjYXVzZSBpdCBtaWdodCBub3QKKwkgICBwYXNzIGFsbCBob29rcyAobG9jYWxseS1nZW5lcmF0ZWQgSUNNUCkuICBDb25zaWRlciBpbmNvbWluZworCSAgIHBhY2tldDogUFJFUk9VVElORyAoRFNUIG1hbmlwKSwgcm91dGluZyBwcm9kdWNlcyBJQ01QLCBnb2VzCisJICAgdGhyb3VnaCBQT1NUUk9VVElORyAod2hpY2ggbXVzdCBjb3JyZWN0IHRoZSBEU1QgbWFuaXApLiAqLworCWlmICghbWFuaXBfcGt0KGluc2lkZS0+aXAucHJvdG9jb2wsIHBza2IsCisJCSAgICAgICAoKnBza2IpLT5uaC5pcGgtPmlobCo0CisJCSAgICAgICArIHNpemVvZihpbnNpZGUtPmljbXApLAorCQkgICAgICAgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUsCisJCSAgICAgICAhbWFuaXApKQorCQlyZXR1cm4gMDsKKworCS8qIFJlbG9hZGluZyAiaW5zaWRlIiBoZXJlIHNpbmNlIG1hbmlwX3BrdCBpbm5lci4gKi8KKwlpbnNpZGUgPSAodm9pZCAqKSgqcHNrYiktPmRhdGEgKyAoKnBza2IpLT5uaC5pcGgtPmlobCo0OworCWluc2lkZS0+aWNtcC5jaGVja3N1bSA9IDA7CisJaW5zaWRlLT5pY21wLmNoZWNrc3VtID0gY3N1bV9mb2xkKHNrYl9jaGVja3N1bSgqcHNrYiwgaGRybGVuLAorCQkJCQkJICAgICAgICgqcHNrYiktPmxlbiAtIGhkcmxlbiwKKwkJCQkJCSAgICAgICAwKSk7CisKKwkvKiBDaGFuZ2Ugb3V0ZXIgdG8gbG9vayB0aGUgcmVwbHkgdG8gYW4gaW5jb21pbmcgcGFja2V0CisJICogKHByb3RvIDAgbWVhbnMgZG9uJ3QgaW52ZXJ0IHBlci1wcm90byBwYXJ0KS4gKi8KKworCS8qIE9idmlvdXNseSwgd2UgbmVlZCB0byBOQVQgZGVzdGluYXRpb24gSVAsIGJ1dCBzb3VyY2UgSVAKKwkgICBzaG91bGQgYmUgTkFUJ2VkIG9ubHkgaWYgaXQgaXMgZnJvbSBhIE5BVCdkIGhvc3QuCisKKwkgICBFeHBsYW5hdGlvbjogc29tZSBwZW9wbGUgdXNlIE5BVCBmb3IgYW5vbnltaXppbmcuICBBbHNvLAorCSAgIENFUlQgcmVjb21tZW5kcyBkcm9wcGluZyBhbGwgcGFja2V0cyBmcm9tIHByaXZhdGUgSVAKKwkgICBhZGRyZXNzZXMgKGFsdGhvdWdoIElDTVAgZXJyb3JzIGZyb20gaW50ZXJuYWwgbGlua3Mgd2l0aAorCSAgIHN1Y2ggYWRkcmVzc2VzIGFyZSBub3QgdG9vIHVuY29tbW9uLCBhcyBBbGFuIENveCBwb2ludHMKKwkgICBvdXQpICovCisJaWYgKG1hbmlwICE9IElQX05BVF9NQU5JUF9TUkMKKwkgICAgfHwgKCgqcHNrYiktPm5oLmlwaC0+c2FkZHIgPT0gY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy5pcCkpIHsKKwkJaW52ZXJ0X3R1cGxlcHIoJnRhcmdldCwgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUpOworCQlpZiAoIW1hbmlwX3BrdCgwLCBwc2tiLCAwLCAmdGFyZ2V0LCBtYW5pcCkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyogUHJvdG9jb2wgcmVnaXN0cmF0aW9uLiAqLworaW50IGlwX25hdF9wcm90b2NvbF9yZWdpc3RlcihzdHJ1Y3QgaXBfbmF0X3Byb3RvY29sICpwcm90bykKK3sKKwlpbnQgcmV0ID0gMDsKKworCVdSSVRFX0xPQ0soJmlwX25hdF9sb2NrKTsKKwlpZiAoaXBfbmF0X3Byb3Rvc1twcm90by0+cHJvdG9udW1dICE9ICZpcF9uYXRfdW5rbm93bl9wcm90b2NvbCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKwlpcF9uYXRfcHJvdG9zW3Byb3RvLT5wcm90b251bV0gPSBwcm90bzsKKyBvdXQ6CisJV1JJVEVfVU5MT0NLKCZpcF9uYXRfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyogTm9vbmUgc3RvcmVzIHRoZSBwcm90b2NvbCBhbnl3aGVyZTsgc2ltcGx5IGRlbGV0ZSBpdC4gKi8KK3ZvaWQgaXBfbmF0X3Byb3RvY29sX3VucmVnaXN0ZXIoc3RydWN0IGlwX25hdF9wcm90b2NvbCAqcHJvdG8pCit7CisJV1JJVEVfTE9DSygmaXBfbmF0X2xvY2spOworCWlwX25hdF9wcm90b3NbcHJvdG8tPnByb3RvbnVtXSA9ICZpcF9uYXRfdW5rbm93bl9wcm90b2NvbDsKKwlXUklURV9VTkxPQ0soJmlwX25hdF9sb2NrKTsKKworCS8qIFNvbWVvbmUgY291bGQgYmUgc3RpbGwgbG9va2luZyBhdCB0aGUgcHJvdG8gaW4gYSBiaC4gKi8KKwlzeW5jaHJvbml6ZV9uZXQoKTsKK30KKworaW50IF9faW5pdCBpcF9uYXRfaW5pdCh2b2lkKQoreworCXNpemVfdCBpOworCisJLyogTGVhdmUgdGhlbSB0aGUgc2FtZSBmb3IgdGhlIG1vbWVudC4gKi8KKwlpcF9uYXRfaHRhYmxlX3NpemUgPSBpcF9jb25udHJhY2tfaHRhYmxlX3NpemU7CisKKwkvKiBPbmUgdm1hbGxvYyBmb3IgYm90aCBoYXNoIHRhYmxlcyAqLworCWJ5c291cmNlID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkgKiBpcF9uYXRfaHRhYmxlX3NpemUpOworCWlmICghYnlzb3VyY2UpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogU2V3IGluIGJ1aWx0aW4gcHJvdG9jb2xzLiAqLworCVdSSVRFX0xPQ0soJmlwX25hdF9sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0lQX05BVF9QUk9UTzsgaSsrKQorCQlpcF9uYXRfcHJvdG9zW2ldID0gJmlwX25hdF91bmtub3duX3Byb3RvY29sOworCWlwX25hdF9wcm90b3NbSVBQUk9UT19UQ1BdID0gJmlwX25hdF9wcm90b2NvbF90Y3A7CisJaXBfbmF0X3Byb3Rvc1tJUFBST1RPX1VEUF0gPSAmaXBfbmF0X3Byb3RvY29sX3VkcDsKKwlpcF9uYXRfcHJvdG9zW0lQUFJPVE9fSUNNUF0gPSAmaXBfbmF0X3Byb3RvY29sX2ljbXA7CisJV1JJVEVfVU5MT0NLKCZpcF9uYXRfbG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaXBfbmF0X2h0YWJsZV9zaXplOyBpKyspIHsKKwkJSU5JVF9MSVNUX0hFQUQoJmJ5c291cmNlW2ldKTsKKwl9CisKKwkvKiBGSVhNRTogTWFuLCB0aGlzIGlzIGEgaGFjay4gIDxTSUdIPiAqLworCUlQX05GX0FTU0VSVChpcF9jb25udHJhY2tfZGVzdHJveWVkID09IE5VTEwpOworCWlwX2Nvbm50cmFja19kZXN0cm95ZWQgPSAmaXBfbmF0X2NsZWFudXBfY29ubnRyYWNrOworCisJLyogSW5pdGlhbGl6ZSBmYWtlIGNvbm50cmFjayBzbyB0aGF0IE5BVCB3aWxsIHNraXAgaXQgKi8KKwlpcF9jb25udHJhY2tfdW50cmFja2VkLnN0YXR1cyB8PSBJUFNfTkFUX0RPTkVfTUFTSzsKKwlyZXR1cm4gMDsKK30KKworLyogQ2xlYXIgTkFUIHNlY3Rpb24gb2YgYWxsIGNvbm50cmFja3MsIGluIGNhc2Ugd2UncmUgbG9hZGVkIGFnYWluLiAqLworc3RhdGljIGludCBjbGVhbl9uYXQoc3RydWN0IGlwX2Nvbm50cmFjayAqaSwgdm9pZCAqZGF0YSkKK3sKKwltZW1zZXQoJmktPm5hdCwgMCwgc2l6ZW9mKGktPm5hdCkpOworCWktPnN0YXR1cyAmPSB+KElQU19OQVRfTUFTSyB8IElQU19OQVRfRE9ORV9NQVNLIHwgSVBTX1NFUV9BREpVU1QpOworCXJldHVybiAwOworfQorCisvKiBOb3QgX19leGl0OiBjYWxsZWQgZnJvbSBpcF9uYXRfc3RhbmRhbG9uZS5jOmluaXRfb3JfY2xlYW51cCgpIC0tUlIgKi8KK3ZvaWQgaXBfbmF0X2NsZWFudXAodm9pZCkKK3sKKwlpcF9jdF9pdGVyYXRlX2NsZWFudXAoJmNsZWFuX25hdCwgTlVMTCk7CisJaXBfY29ubnRyYWNrX2Rlc3Ryb3llZCA9IE5VTEw7CisJdmZyZWUoYnlzb3VyY2UpOworfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9mdHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfZnRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYwMDBlNwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfZnRwLmMKQEAgLTAsMCArMSwxODMgQEAKKy8qIEZUUCBleHRlbnNpb24gZm9yIFRDUCBOQVQgYWx0ZXJhdGlvbi4gKi8KKworLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAorICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfaGVscGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfZnRwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImZ0cCBOQVQgaGVscGVyIik7CisKKyNpZiAwCisjZGVmaW5lIERFQlVHUCBwcmludGsKKyNlbHNlCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworLyogRklYTUU6IFRpbWUgb3V0PyAtLVJSICovCisKK3N0YXRpYyBpbnQKK21hbmdsZV9yZmM5NTlfcGFja2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJICAgICB1X2ludDMyX3QgbmV3aXAsCisJCSAgICAgdV9pbnQxNl90IHBvcnQsCisJCSAgICAgdW5zaWduZWQgaW50IG1hdGNob2ZmLAorCQkgICAgIHVuc2lnbmVkIGludCBtYXRjaGxlbiwKKwkJICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKKwkJICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJICAgICB1MzIgKnNlcSkKK3sKKwljaGFyIGJ1ZmZlcltzaXplb2YoIm5ubixubm4sbm5uLG5ubixubm4sbm5uIildOworCisJc3ByaW50ZihidWZmZXIsICIldSwldSwldSwldSwldSwldSIsCisJCU5JUFFVQUQobmV3aXApLCBwb3J0Pj44LCBwb3J0JjB4RkYpOworCisJREVCVUdQKCJjYWxsaW5nIGlwX25hdF9tYW5nbGVfdGNwX3BhY2tldFxuIik7CisKKwkqc2VxICs9IHN0cmxlbihidWZmZXIpIC0gbWF0Y2hsZW47CisJcmV0dXJuIGlwX25hdF9tYW5nbGVfdGNwX3BhY2tldChwc2tiLCBjdCwgY3RpbmZvLCBtYXRjaG9mZiwgCisJCQkJCW1hdGNobGVuLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKK30KKworLyogfDF8MTMyLjIzNS4xLjJ8NjI3NXwgKi8KK3N0YXRpYyBpbnQKK21hbmdsZV9lcHJ0X3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCSAgIHVfaW50MzJfdCBuZXdpcCwKKwkJICAgdV9pbnQxNl90IHBvcnQsCisJCSAgIHVuc2lnbmVkIGludCBtYXRjaG9mZiwKKwkJICAgdW5zaWduZWQgaW50IG1hdGNobGVuLAorCQkgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKKwkJICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCSAgIHUzMiAqc2VxKQoreworCWNoYXIgYnVmZmVyW3NpemVvZigifDF8MjU1LjI1NS4yNTUuMjU1fDY1NTM1fCIpXTsKKworCXNwcmludGYoYnVmZmVyLCAifDF8JXUuJXUuJXUuJXV8JXV8IiwgTklQUVVBRChuZXdpcCksIHBvcnQpOworCisJREVCVUdQKCJjYWxsaW5nIGlwX25hdF9tYW5nbGVfdGNwX3BhY2tldFxuIik7CisKKwkqc2VxICs9IHN0cmxlbihidWZmZXIpIC0gbWF0Y2hsZW47CisJcmV0dXJuIGlwX25hdF9tYW5nbGVfdGNwX3BhY2tldChwc2tiLCBjdCwgY3RpbmZvLCBtYXRjaG9mZiwgCisJCQkJCW1hdGNobGVuLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKK30KKworLyogfDF8MTMyLjIzNS4xLjJ8NjI3NXwgKi8KK3N0YXRpYyBpbnQKK21hbmdsZV9lcHN2X3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCSAgIHVfaW50MzJfdCBuZXdpcCwKKwkJICAgdV9pbnQxNl90IHBvcnQsCisJCSAgIHVuc2lnbmVkIGludCBtYXRjaG9mZiwKKwkJICAgdW5zaWduZWQgaW50IG1hdGNobGVuLAorCQkgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKKwkJICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCSAgIHUzMiAqc2VxKQoreworCWNoYXIgYnVmZmVyW3NpemVvZigifHx8NjU1MzV8IildOworCisJc3ByaW50ZihidWZmZXIsICJ8fHwldXwiLCBwb3J0KTsKKworCURFQlVHUCgiY2FsbGluZyBpcF9uYXRfbWFuZ2xlX3RjcF9wYWNrZXRcbiIpOworCisJKnNlcSArPSBzdHJsZW4oYnVmZmVyKSAtIG1hdGNobGVuOworCXJldHVybiBpcF9uYXRfbWFuZ2xlX3RjcF9wYWNrZXQocHNrYiwgY3QsIGN0aW5mbywgbWF0Y2hvZmYsIAorCQkJCQltYXRjaGxlbiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Cit9CisKK3N0YXRpYyBpbnQgKCptYW5nbGVbXSkoc3RydWN0IHNrX2J1ZmYgKiosIHVfaW50MzJfdCwgdV9pbnQxNl90LAorCQkgICAgIHVuc2lnbmVkIGludCwKKwkJICAgICB1bnNpZ25lZCBpbnQsCisJCSAgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqLAorCQkgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8sCisJCSAgICAgdTMyICpzZXEpCis9IHsgW0lQX0NUX0ZUUF9QT1JUXSA9IG1hbmdsZV9yZmM5NTlfcGFja2V0LAorICAgIFtJUF9DVF9GVFBfUEFTVl0gPSBtYW5nbGVfcmZjOTU5X3BhY2tldCwKKyAgICBbSVBfQ1RfRlRQX0VQUlRdID0gbWFuZ2xlX2VwcnRfcGFja2V0LAorICAgIFtJUF9DVF9GVFBfRVBTVl0gPSBtYW5nbGVfZXBzdl9wYWNrZXQKK307CisKKy8qIFNvLCB0aGlzIHBhY2tldCBoYXMgaGl0IHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIG1hdGNoaW5nIGNvZGUuCisgICBNYW5nbGUgaXQsIGFuZCBjaGFuZ2UgdGhlIGV4cGVjdGF0aW9uIHRvIG1hdGNoIHRoZSBuZXcgdmVyc2lvbi4gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXBfbmF0X2Z0cChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkgICAgICAgZW51bSBpcF9jdF9mdHBfdHlwZSB0eXBlLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBtYXRjaG9mZiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sCisJCQkgICAgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCwKKwkJCSAgICAgICB1MzIgKnNlcSkKK3sKKwl1X2ludDMyX3QgbmV3aXA7CisJdV9pbnQxNl90IHBvcnQ7CisJaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCA9IGV4cC0+bWFzdGVyOworCisJREVCVUdQKCJGVFBfTkFUOiB0eXBlICVpLCBvZmYgJXUgbGVuICV1XG4iLCB0eXBlLCBtYXRjaG9mZiwgbWF0Y2hsZW4pOworCisJLyogQ29ubmVjdGlvbiB3aWxsIGNvbWUgZnJvbSB3aGVyZXZlciB0aGlzIHBhY2tldCBnb2VzLCBoZW5jZSAhZGlyICovCisJbmV3aXAgPSBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcDsKKwlleHAtPnNhdmVkX3Byb3RvLnRjcC5wb3J0ID0gZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydDsKKwlleHAtPmRpciA9ICFkaXI7CisKKwkvKiBXaGVuIHlvdSBzZWUgdGhlIHBhY2tldCwgd2UgbmVlZCB0byBOQVQgaXQgdGhlIHNhbWUgYXMgdGhlCisJICogdGhpcyBvbmUuICovCisJZXhwLT5leHBlY3RmbiA9IGlwX25hdF9mb2xsb3dfbWFzdGVyOworCisJLyogVHJ5IHRvIGdldCBzYW1lIHBvcnQ6IGlmIG5vdCwgdHJ5IHRvIGNoYW5nZSBpdC4gKi8KKwlmb3IgKHBvcnQgPSBudG9ocyhleHAtPnNhdmVkX3Byb3RvLnRjcC5wb3J0KTsgcG9ydCAhPSAwOyBwb3J0KyspIHsKKwkJZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydCA9IGh0b25zKHBvcnQpOworCQlpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCWlmIChwb3J0ID09IDApIHsKKwkJaXBfY29ubnRyYWNrX2V4cGVjdF9mcmVlKGV4cCk7CisJCXJldHVybiBORl9EUk9QOworCX0KKworCWlmICghbWFuZ2xlW3R5cGVdKHBza2IsIG5ld2lwLCBwb3J0LCBtYXRjaG9mZiwgbWF0Y2hsZW4sIGN0LCBjdGluZm8sCisJCQkgIHNlcSkpIHsKKwkJaXBfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQoZXhwKTsKKwkJcmV0dXJuIE5GX0RST1A7CisJfQorCXJldHVybiBORl9BQ0NFUFQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaXBfbmF0X2Z0cF9ob29rID0gTlVMTDsKKwkvKiBNYWtlIHN1cmUgbm9vbmUgY2FsbHMgaXQsIG1lYW53aGlsZS4gKi8KKwlzeW5jaHJvbml6ZV9uZXQoKTsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCUJVR19PTihpcF9uYXRfZnRwX2hvb2spOworCWlwX25hdF9mdHBfaG9vayA9IGlwX25hdF9mdHA7CisJcmV0dXJuIDA7Cit9CisKKy8qIFByaW9yIHRvIDIuNi4xMSwgd2UgaGFkIGEgcG9ydHMgcGFyYW0uICBObyBsb25nZXIsIGJ1dCBkb24ndCBicmVhayB1c2Vycy4gKi8KK3N0YXRpYyBpbnQgd2Fybl9zZXQoY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKK3sKKwlwcmludGsoS0VSTl9JTkZPIF9fc3RyaW5naWZ5KEtCVUlMRF9NT0ROQU1FKQorCSAgICAgICAiOiBrZXJuZWwgPj0gMi42LjEwIG9ubHkgdXNlcyAncG9ydHMnIGZvciBjb25udHJhY2sgbW9kdWxlc1xuIik7CisJcmV0dXJuIDA7Cit9Cittb2R1bGVfcGFyYW1fY2FsbChwb3J0cywgd2Fybl9zZXQsIE5VTEwsIE5VTEwsIDApOworCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9oZWxwZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaGVscGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYzN2I5NgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaGVscGVyLmMKQEAgLTAsMCArMSw0MzAgQEAKKy8qIGlwX25hdF9oZWxwZXIuYyAtIGdlbmVyaWMgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIE5BVCBoZWxwZXJzIAorICoKKyAqIChDKSAyMDAwLTIwMDIgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+CisgKiAoQykgMjAwMy0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAJMTQgSmFuIDIwMDIgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz46CisgKgkJLSBhZGQgc3VwcG9ydCBmb3IgU0FDSyBhZGp1c3RtZW50IAorICoJMTQgTWFyIDIwMDIgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz46CisgKgkJLSBtZXJnZSBTQUNLIHN1cHBvcnQgaW50byBuZXduYXQgQVBJCisgKgkxNiBBdWcgMjAwMiBCcmlhbiBKLiBNdXJyZWxsIDxuZXRmaWx0ZXJAaW50ZXJsaW54LmJjLmNhPjoKKyAqCQktIG1ha2UgaXBfbmF0X3Jlc2l6ZV9wYWNrZXQgbW9yZSBnZW5lcmljIChUQ1AgYW5kIFVEUCkKKyAqCQktIGFkZCBpcF9uYXRfbWFuZ2xlX3VkcF9wYWNrZXQKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxuZXQvaWNtcC5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvdWRwLmg+CisKKyNkZWZpbmUgQVNTRVJUX1JFQURfTE9DSyh4KSBNVVNUX0JFX1JFQURfTE9DS0VEKCZpcF9uYXRfbG9jaykKKyNkZWZpbmUgQVNTRVJUX1dSSVRFX0xPQ0soeCkgTVVTVF9CRV9XUklURV9MT0NLRUQoJmlwX25hdF9sb2NrKQorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X2hlbHBlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2xpc3RoZWxwLmg+CisKKyNpZiAwCisjZGVmaW5lIERFQlVHUCBwcmludGsKKyNkZWZpbmUgRFVNUF9PRkZTRVQoeCkJcHJpbnRrKCJvZmZzZXRfYmVmb3JlPSVkLCBvZmZzZXRfYWZ0ZXI9JWQsIGNvcnJlY3Rpb25fcG9zPSV1XG4iLCB4LT5vZmZzZXRfYmVmb3JlLCB4LT5vZmZzZXRfYWZ0ZXIsIHgtPmNvcnJlY3Rpb25fcG9zKTsKKyNlbHNlCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCisjZGVmaW5lIERVTVBfT0ZGU0VUKHgpCisjZW5kaWYKKworc3RhdGljIERFQ0xBUkVfTE9DSyhpcF9uYXRfc2Vxb2ZzX2xvY2spOworCisvKiBTZXR1cCBUQ1Agc2VxdWVuY2UgY29ycmVjdGlvbiBnaXZlbiB0aGlzIGNoYW5nZSBhdCB0aGlzIHNlcXVlbmNlICovCitzdGF0aWMgaW5saW5lIHZvaWQgCithZGp1c3RfdGNwX3NlcXVlbmNlKHUzMiBzZXEsCisJCSAgICBpbnQgc2l6ZWRpZmYsCisJCSAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwgCisJCSAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKK3sKKwlpbnQgZGlyOworCXN0cnVjdCBpcF9uYXRfc2VxICp0aGlzX3dheSwgKm90aGVyX3dheTsKKworCURFQlVHUCgiaXBfbmF0X3Jlc2l6ZV9wYWNrZXQ6IG9sZF9zaXplID0gJXUsIG5ld19zaXplID0gJXVcbiIsCisJCSgqc2tiKS0+bGVuLCBuZXdfc2l6ZSk7CisKKwlkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CisKKwl0aGlzX3dheSA9ICZjdC0+bmF0LmluZm8uc2VxW2Rpcl07CisJb3RoZXJfd2F5ID0gJmN0LT5uYXQuaW5mby5zZXFbIWRpcl07CisKKwlERUJVR1AoImlwX25hdF9yZXNpemVfcGFja2V0OiBTZXFfb2Zmc2V0IGJlZm9yZTogIik7CisJRFVNUF9PRkZTRVQodGhpc193YXkpOworCisJTE9DS19CSCgmaXBfbmF0X3NlcW9mc19sb2NrKTsKKworCS8qIFNZTiBhZGp1c3QuIElmIGl0J3MgdW5pbml0aWFsaXplZCwgb3IgdGhpcyBpcyBhZnRlciBsYXN0CisJICogY29ycmVjdGlvbiwgcmVjb3JkIGl0OiB3ZSBkb24ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZQorCSAqIGFkanVzdG1lbnQgaW4gdGhlIHdpbmRvdywgYnV0IGRvIGRlYWwgd2l0aCBjb21tb24gY2FzZSBvZiBhCisJICogcmV0cmFuc21pdCAqLworCWlmICh0aGlzX3dheS0+b2Zmc2V0X2JlZm9yZSA9PSB0aGlzX3dheS0+b2Zmc2V0X2FmdGVyCisJICAgIHx8IGJlZm9yZSh0aGlzX3dheS0+Y29ycmVjdGlvbl9wb3MsIHNlcSkpIHsKKwkJICAgIHRoaXNfd2F5LT5jb3JyZWN0aW9uX3BvcyA9IHNlcTsKKwkJICAgIHRoaXNfd2F5LT5vZmZzZXRfYmVmb3JlID0gdGhpc193YXktPm9mZnNldF9hZnRlcjsKKwkJICAgIHRoaXNfd2F5LT5vZmZzZXRfYWZ0ZXIgKz0gc2l6ZWRpZmY7CisJfQorCVVOTE9DS19CSCgmaXBfbmF0X3NlcW9mc19sb2NrKTsKKworCURFQlVHUCgiaXBfbmF0X3Jlc2l6ZV9wYWNrZXQ6IFNlcV9vZmZzZXQgYWZ0ZXI6ICIpOworCURVTVBfT0ZGU0VUKHRoaXNfd2F5KTsKK30KKworLyogRnJvYnMgZGF0YSBpbnNpZGUgdGhpcyBwYWNrZXQsIHdoaWNoIGlzIGxpbmVhci4gKi8KK3N0YXRpYyB2b2lkIG1hbmdsZV9jb250ZW50cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAorCQkJICAgIHVuc2lnbmVkIGludCBtYXRjaF9vZmZzZXQsCisJCQkgICAgdW5zaWduZWQgaW50IG1hdGNoX2xlbiwKKwkJCSAgICBjb25zdCBjaGFyICpyZXBfYnVmZmVyLAorCQkJICAgIHVuc2lnbmVkIGludCByZXBfbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisKKwlCVUdfT04oc2tiX2lzX25vbmxpbmVhcihza2IpKTsKKwlkYXRhID0gKHVuc2lnbmVkIGNoYXIgKilza2ItPm5oLmlwaCArIGRhdGFvZmY7CisKKwkvKiBtb3ZlIHBvc3QtcmVwbGFjZW1lbnQgKi8KKwltZW1tb3ZlKGRhdGEgKyBtYXRjaF9vZmZzZXQgKyByZXBfbGVuLAorCQlkYXRhICsgbWF0Y2hfb2Zmc2V0ICsgbWF0Y2hfbGVuLAorCQlza2ItPnRhaWwgLSAoZGF0YSArIG1hdGNoX29mZnNldCArIG1hdGNoX2xlbikpOworCisJLyogaW5zZXJ0IGRhdGEgZnJvbSBidWZmZXIgKi8KKwltZW1jcHkoZGF0YSArIG1hdGNoX29mZnNldCwgcmVwX2J1ZmZlciwgcmVwX2xlbik7CisKKwkvKiB1cGRhdGUgc2tiIGluZm8gKi8KKwlpZiAocmVwX2xlbiA+IG1hdGNoX2xlbikgeworCQlERUJVR1AoImlwX25hdF9tYW5nbGVfcGFja2V0OiBFeHRlbmRpbmcgcGFja2V0IGJ5ICIKKwkJCSIldSBmcm9tICV1IGJ5dGVzXG4iLCByZXBfbGVuIC0gbWF0Y2hfbGVuLAorCQkgICAgICAgc2tiLT5sZW4pOworCQlza2JfcHV0KHNrYiwgcmVwX2xlbiAtIG1hdGNoX2xlbik7CisJfSBlbHNlIHsKKwkJREVCVUdQKCJpcF9uYXRfbWFuZ2xlX3BhY2tldDogU2hyaW5raW5nIHBhY2tldCBmcm9tICIKKwkJCSIldSBmcm9tICV1IGJ5dGVzXG4iLCBtYXRjaF9sZW4gLSByZXBfbGVuLAorCQkgICAgICAgc2tiLT5sZW4pOworCQlfX3NrYl90cmltKHNrYiwgc2tiLT5sZW4gKyByZXBfbGVuIC0gbWF0Y2hfbGVuKTsKKwl9CisKKwkvKiBmaXggSVAgaGRyIGNoZWNrc3VtIGluZm9ybWF0aW9uICovCisJc2tiLT5uaC5pcGgtPnRvdF9sZW4gPSBodG9ucyhza2ItPmxlbik7CisJaXBfc2VuZF9jaGVjayhza2ItPm5oLmlwaCk7Cit9CisKKy8qIFVudXN1YWwsIGJ1dCBwb3NzaWJsZSBjYXNlLiAqLworc3RhdGljIGludCBlbmxhcmdlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGludCBleHRyYSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKKworCWlmICgoKnBza2IpLT5sZW4gKyBleHRyYSA+IDY1NTM1KQorCQlyZXR1cm4gMDsKKworCW5za2IgPSBza2JfY29weV9leHBhbmQoKnBza2IsIHNrYl9oZWFkcm9vbSgqcHNrYiksIGV4dHJhLCBHRlBfQVRPTUlDKTsKKwlpZiAoIW5za2IpCisJCXJldHVybiAwOworCisJLyogVHJhbnNmZXIgc29ja2V0IHRvIG5ldyBza2IuICovCisJaWYgKCgqcHNrYiktPnNrKQorCQlza2Jfc2V0X293bmVyX3cobnNrYiwgKCpwc2tiKS0+c2spOworI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKKwluc2tiLT5uZl9kZWJ1ZyA9ICgqcHNrYiktPm5mX2RlYnVnOworI2VuZGlmCisJa2ZyZWVfc2tiKCpwc2tiKTsKKwkqcHNrYiA9IG5za2I7CisJcmV0dXJuIDE7Cit9CisKKy8qIEdlbmVyaWMgZnVuY3Rpb24gZm9yIG1hbmdsaW5nIHZhcmlhYmxlLWxlbmd0aCBhZGRyZXNzIGNoYW5nZXMgaW5zaWRlCisgKiBOQVRlZCBUQ1AgY29ubmVjdGlvbnMgKGxpa2UgdGhlIFBPUlQgWFhYLFhYWCxYWFgsWFhYLFhYWCxYWFgKKyAqIGNvbW1hbmQgaW4gRlRQKS4KKyAqCisgKiBUYWtlcyBjYXJlIGFib3V0IGFsbCB0aGUgbmFzdHkgc2VxdWVuY2UgbnVtYmVyIGNoYW5nZXMsIGNoZWNrc3VtbWluZywKKyAqIHNrYiBlbmxhcmdlbWVudCwgLi4uCisgKgorICogKi8KK2ludCAKK2lwX25hdF9tYW5nbGVfdGNwX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCisJCQkgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkgdW5zaWduZWQgaW50IG1hdGNoX29mZnNldCwKKwkJCSB1bnNpZ25lZCBpbnQgbWF0Y2hfbGVuLAorCQkJIGNvbnN0IGNoYXIgKnJlcF9idWZmZXIsCisJCQkgdW5zaWduZWQgaW50IHJlcF9sZW4pCit7CisJc3RydWN0IGlwaGRyICppcGg7CisJc3RydWN0IHRjcGhkciAqdGNwaDsKKwlpbnQgZGF0YWxlbjsKKworCWlmICghc2tiX2lwX21ha2Vfd3JpdGFibGUocHNrYiwgKCpwc2tiKS0+bGVuKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAocmVwX2xlbiA+IG1hdGNoX2xlbgorCSAgICAmJiByZXBfbGVuIC0gbWF0Y2hfbGVuID4gc2tiX3RhaWxyb29tKCpwc2tiKQorCSAgICAmJiAhZW5sYXJnZV9za2IocHNrYiwgcmVwX2xlbiAtIG1hdGNoX2xlbikpCisJCXJldHVybiAwOworCisJU0tCX0xJTkVBUl9BU1NFUlQoKnBza2IpOworCisJaXBoID0gKCpwc2tiKS0+bmguaXBoOworCXRjcGggPSAodm9pZCAqKWlwaCArIGlwaC0+aWhsKjQ7CisKKwltYW5nbGVfY29udGVudHMoKnBza2IsIGlwaC0+aWhsKjQgKyB0Y3BoLT5kb2ZmKjQsCisJCQltYXRjaF9vZmZzZXQsIG1hdGNoX2xlbiwgcmVwX2J1ZmZlciwgcmVwX2xlbik7CisKKwlkYXRhbGVuID0gKCpwc2tiKS0+bGVuIC0gaXBoLT5paGwqNDsKKwl0Y3BoLT5jaGVjayA9IDA7CisJdGNwaC0+Y2hlY2sgPSB0Y3BfdjRfY2hlY2sodGNwaCwgZGF0YWxlbiwgaXBoLT5zYWRkciwgaXBoLT5kYWRkciwKKwkJCQkgICBjc3VtX3BhcnRpYWwoKGNoYXIgKil0Y3BoLCBkYXRhbGVuLCAwKSk7CisKKwlpZiAocmVwX2xlbiAhPSBtYXRjaF9sZW4pIHsKKwkJc2V0X2JpdChJUFNfU0VRX0FESlVTVF9CSVQsICZjdC0+c3RhdHVzKTsKKwkJYWRqdXN0X3RjcF9zZXF1ZW5jZShudG9obCh0Y3BoLT5zZXEpLAorCQkJCSAgICAoaW50KXJlcF9sZW4gLSAoaW50KW1hdGNoX2xlbiwKKwkJCQkgICAgY3QsIGN0aW5mbyk7CisJCS8qIFRlbGwgVENQIHdpbmRvdyB0cmFja2luZyBhYm91dCBzZXEgY2hhbmdlICovCisJCWlwX2Nvbm50cmFja190Y3BfdXBkYXRlKCpwc2tiLCBjdCwgQ1RJTkZPMkRJUihjdGluZm8pKTsKKwl9CisJcmV0dXJuIDE7Cit9CisJCQkKKy8qIEdlbmVyaWMgZnVuY3Rpb24gZm9yIG1hbmdsaW5nIHZhcmlhYmxlLWxlbmd0aCBhZGRyZXNzIGNoYW5nZXMgaW5zaWRlCisgKiBOQVRlZCBVRFAgY29ubmVjdGlvbnMgKGxpa2UgdGhlIENPTk5FQ1QgREFUQSBYWFhYWCBNRVNHIFhYWFhYIElOREVYIFhYWFhYCisgKiBjb21tYW5kIGluIHRoZSBBbWFuZGEgcHJvdG9jb2wpCisgKgorICogVGFrZXMgY2FyZSBhYm91dCBhbGwgdGhlIG5hc3R5IHNlcXVlbmNlIG51bWJlciBjaGFuZ2VzLCBjaGVja3N1bW1pbmcsCisgKiBza2IgZW5sYXJnZW1lbnQsIC4uLgorICoKKyAqIFhYWCAtIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbWVyZ2VkIHdpdGggaXBfbmF0X21hbmdsZV90Y3BfcGFja2V0IHdoaWNoCisgKiAgICAgICBzaG91bGQgYmUgZmFpcmx5IGVhc3kgdG8gZG8uCisgKi8KK2ludCAKK2lwX25hdF9tYW5nbGVfdWRwX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCisJCQkgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkgdW5zaWduZWQgaW50IG1hdGNoX29mZnNldCwKKwkJCSB1bnNpZ25lZCBpbnQgbWF0Y2hfbGVuLAorCQkJIGNvbnN0IGNoYXIgKnJlcF9idWZmZXIsCisJCQkgdW5zaWduZWQgaW50IHJlcF9sZW4pCit7CisJc3RydWN0IGlwaGRyICppcGg7CisJc3RydWN0IHVkcGhkciAqdWRwaDsKKworCS8qIFVEUCBoZWxwZXJzIG1pZ2h0IGFjY2lkZW50YWxseSBtYW5nbGUgdGhlIHdyb25nIHBhY2tldCAqLworCWlwaCA9ICgqcHNrYiktPm5oLmlwaDsKKwlpZiAoKCpwc2tiKS0+bGVuIDwgaXBoLT5paGwqNCArIHNpemVvZigqdWRwaCkgKyAKKwkgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX29mZnNldCArIG1hdGNoX2xlbikKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXNrYl9pcF9tYWtlX3dyaXRhYmxlKHBza2IsICgqcHNrYiktPmxlbikpCisJCXJldHVybiAwOworCisJaWYgKHJlcF9sZW4gPiBtYXRjaF9sZW4KKwkgICAgJiYgcmVwX2xlbiAtIG1hdGNoX2xlbiA+IHNrYl90YWlscm9vbSgqcHNrYikKKwkgICAgJiYgIWVubGFyZ2Vfc2tiKHBza2IsIHJlcF9sZW4gLSBtYXRjaF9sZW4pKQorCQlyZXR1cm4gMDsKKworCWlwaCA9ICgqcHNrYiktPm5oLmlwaDsKKwl1ZHBoID0gKHZvaWQgKilpcGggKyBpcGgtPmlobCo0OworCW1hbmdsZV9jb250ZW50cygqcHNrYiwgaXBoLT5paGwqNCArIHNpemVvZigqdWRwaCksCisJCQltYXRjaF9vZmZzZXQsIG1hdGNoX2xlbiwgcmVwX2J1ZmZlciwgcmVwX2xlbik7CisKKwkvKiB1cGRhdGUgdGhlIGxlbmd0aCBvZiB0aGUgVURQIHBhY2tldCAqLworCXVkcGgtPmxlbiA9IGh0b25zKCgqcHNrYiktPmxlbiAtIGlwaC0+aWhsKjQpOworCisJLyogZml4IHVkcCBjaGVja3N1bSBpZiB1ZHAgY2hlY2tzdW0gd2FzIHByZXZpb3VzbHkgY2FsY3VsYXRlZCAqLworCWlmICh1ZHBoLT5jaGVjaykgeworCQlpbnQgZGF0YWxlbiA9ICgqcHNrYiktPmxlbiAtIGlwaC0+aWhsICogNDsKKwkJdWRwaC0+Y2hlY2sgPSAwOworCQl1ZHBoLT5jaGVjayA9IGNzdW1fdGNwdWRwX21hZ2ljKGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWxlbiwgSVBQUk9UT19VRFAsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N1bV9wYXJ0aWFsKChjaGFyICopdWRwaCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWxlbiwgMCkpOworCX0KKworCXJldHVybiAxOworfQorCisvKiBBZGp1c3Qgb25lIGZvdW5kIFNBQ0sgb3B0aW9uIGluY2x1ZGluZyBjaGVja3N1bSBjb3JyZWN0aW9uICovCitzdGF0aWMgdm9pZAorc2Fja19hZGp1c3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkgICAgc3RydWN0IHRjcGhkciAqdGNwaCwgCisJICAgIHVuc2lnbmVkIGludCBzYWNrb2ZmLAorCSAgICB1bnNpZ25lZCBpbnQgc2Fja2VuZCwKKwkgICAgc3RydWN0IGlwX25hdF9zZXEgKm5hdHNlcSkKK3sKKwl3aGlsZSAoc2Fja29mZiA8IHNhY2tlbmQpIHsKKwkJc3RydWN0IHRjcF9zYWNrX2Jsb2NrICpzYWNrOworCQl1X2ludDMyX3QgbmV3X3N0YXJ0X3NlcSwgbmV3X2VuZF9zZXE7CisKKwkJc2FjayA9ICh2b2lkICopc2tiLT5kYXRhICsgc2Fja29mZjsKKwkJaWYgKGFmdGVyKG50b2hsKHNhY2stPnN0YXJ0X3NlcSkgLSBuYXRzZXEtPm9mZnNldF9iZWZvcmUsCisJCQkgIG5hdHNlcS0+Y29ycmVjdGlvbl9wb3MpKQorCQkJbmV3X3N0YXJ0X3NlcSA9IG50b2hsKHNhY2stPnN0YXJ0X3NlcSkgCisJCQkJCS0gbmF0c2VxLT5vZmZzZXRfYWZ0ZXI7CisJCWVsc2UKKwkJCW5ld19zdGFydF9zZXEgPSBudG9obChzYWNrLT5zdGFydF9zZXEpIAorCQkJCQktIG5hdHNlcS0+b2Zmc2V0X2JlZm9yZTsKKwkJbmV3X3N0YXJ0X3NlcSA9IGh0b25sKG5ld19zdGFydF9zZXEpOworCisJCWlmIChhZnRlcihudG9obChzYWNrLT5lbmRfc2VxKSAtIG5hdHNlcS0+b2Zmc2V0X2JlZm9yZSwKKwkJCSAgbmF0c2VxLT5jb3JyZWN0aW9uX3BvcykpCisJCQluZXdfZW5kX3NlcSA9IG50b2hsKHNhY2stPmVuZF9zZXEpCisJCQkJICAgICAgLSBuYXRzZXEtPm9mZnNldF9hZnRlcjsKKwkJZWxzZQorCQkJbmV3X2VuZF9zZXEgPSBudG9obChzYWNrLT5lbmRfc2VxKQorCQkJCSAgICAgIC0gbmF0c2VxLT5vZmZzZXRfYmVmb3JlOworCQluZXdfZW5kX3NlcSA9IGh0b25sKG5ld19lbmRfc2VxKTsKKworCQlERUJVR1AoInNhY2tfYWRqdXN0OiBzdGFydF9zZXE6ICVkLT4lZCwgZW5kX3NlcTogJWQtPiVkXG4iLAorCQkJbnRvaGwoc2Fjay0+c3RhcnRfc2VxKSwgbmV3X3N0YXJ0X3NlcSwKKwkJCW50b2hsKHNhY2stPmVuZF9zZXEpLCBuZXdfZW5kX3NlcSk7CisKKwkJdGNwaC0+Y2hlY2sgPSAKKwkJCWlwX25hdF9jaGVhdF9jaGVjayh+c2Fjay0+c3RhcnRfc2VxLCBuZXdfc3RhcnRfc2VxLAorCQkJCQkgICBpcF9uYXRfY2hlYXRfY2hlY2sofnNhY2stPmVuZF9zZXEsIAorCQkJCQkJICAgCSAgICAgIG5ld19lbmRfc2VxLAorCQkJCQkJCSAgICAgIHRjcGgtPmNoZWNrKSk7CisJCXNhY2stPnN0YXJ0X3NlcSA9IG5ld19zdGFydF9zZXE7CisJCXNhY2stPmVuZF9zZXEgPSBuZXdfZW5kX3NlcTsKKwkJc2Fja29mZiArPSBzaXplb2YoKnNhY2spOworCX0KK30KKworLyogVENQIFNBQ0sgc2VxdWVuY2UgbnVtYmVyIGFkanVzdG1lbnQgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CitpcF9uYXRfc2Fja19hZGp1c3Qoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkgICBzdHJ1Y3QgdGNwaGRyICp0Y3BoLAorCQkgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKKwkJICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCit7CisJdW5zaWduZWQgaW50IGRpciwgb3B0b2ZmLCBvcHRlbmQ7CisKKwlvcHRvZmYgPSAoKnBza2IpLT5uaC5pcGgtPmlobCo0ICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOworCW9wdGVuZCA9ICgqcHNrYiktPm5oLmlwaC0+aWhsKjQgKyB0Y3BoLT5kb2ZmKjQ7CisKKwlpZiAoIXNrYl9pcF9tYWtlX3dyaXRhYmxlKHBza2IsIG9wdGVuZCkpCisJCXJldHVybiAwOworCisJZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOworCisJd2hpbGUgKG9wdG9mZiA8IG9wdGVuZCkgeworCQkvKiBVc3VhbGx5OiBvcHRpb24sIGxlbmd0aC4gKi8KKwkJdW5zaWduZWQgY2hhciAqb3AgPSAoKnBza2IpLT5kYXRhICsgb3B0b2ZmOworCisJCXN3aXRjaCAob3BbMF0pIHsKKwkJY2FzZSBUQ1BPUFRfRU9MOgorCQkJcmV0dXJuIDE7CisJCWNhc2UgVENQT1BUX05PUDoKKwkJCW9wdG9mZisrOworCQkJY29udGludWU7CisJCWRlZmF1bHQ6CisJCQkvKiBubyBwYXJ0aWFsIG9wdGlvbnMgKi8KKwkJCWlmIChvcHRvZmYgKyAxID09IG9wdGVuZAorCQkJICAgIHx8IG9wdG9mZiArIG9wWzFdID4gb3B0ZW5kCisJCQkgICAgfHwgb3BbMV0gPCAyKQorCQkJCXJldHVybiAwOworCQkJaWYgKG9wWzBdID09IFRDUE9QVF9TQUNLCisJCQkgICAgJiYgb3BbMV0gPj0gMitUQ1BPTEVOX1NBQ0tfUEVSQkxPQ0sKKwkJCSAgICAmJiAoKG9wWzFdIC0gMikgJSBUQ1BPTEVOX1NBQ0tfUEVSQkxPQ0spID09IDApCisJCQkJc2Fja19hZGp1c3QoKnBza2IsIHRjcGgsIG9wdG9mZisyLAorCQkJCQkgICAgb3B0b2ZmK29wWzFdLAorCQkJCQkgICAgJmN0LT5uYXQuaW5mby5zZXFbIWRpcl0pOworCQkJb3B0b2ZmICs9IG9wWzFdOworCQl9CisJfQorCXJldHVybiAxOworfQorCisvKiBUQ1Agc2VxdWVuY2UgbnVtYmVyIGFkanVzdG1lbnQuICBSZXR1cm5zIDEgb24gc3VjY2VzcywgMCBvbiBmYWlsdXJlICovCitpbnQKK2lwX25hdF9zZXFfYWRqdXN0KHN0cnVjdCBza19idWZmICoqcHNrYiwgCisJCSAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsIAorCQkgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQoreworCXN0cnVjdCB0Y3BoZHIgKnRjcGg7CisJaW50IGRpciwgbmV3c2VxLCBuZXdhY2s7CisJc3RydWN0IGlwX25hdF9zZXEgKnRoaXNfd2F5LCAqb3RoZXJfd2F5OwkKKworCWRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKworCXRoaXNfd2F5ID0gJmN0LT5uYXQuaW5mby5zZXFbZGlyXTsKKwlvdGhlcl93YXkgPSAmY3QtPm5hdC5pbmZvLnNlcVshZGlyXTsKKworCWlmICghc2tiX2lwX21ha2Vfd3JpdGFibGUocHNrYiwgKCpwc2tiKS0+bmguaXBoLT5paGwqNCtzaXplb2YoKnRjcGgpKSkKKwkJcmV0dXJuIDA7CisKKwl0Y3BoID0gKHZvaWQgKikoKnBza2IpLT5kYXRhICsgKCpwc2tiKS0+bmguaXBoLT5paGwqNDsKKwlpZiAoYWZ0ZXIobnRvaGwodGNwaC0+c2VxKSwgdGhpc193YXktPmNvcnJlY3Rpb25fcG9zKSkKKwkJbmV3c2VxID0gbnRvaGwodGNwaC0+c2VxKSArIHRoaXNfd2F5LT5vZmZzZXRfYWZ0ZXI7CisJZWxzZQorCQluZXdzZXEgPSBudG9obCh0Y3BoLT5zZXEpICsgdGhpc193YXktPm9mZnNldF9iZWZvcmU7CisJbmV3c2VxID0gaHRvbmwobmV3c2VxKTsKKworCWlmIChhZnRlcihudG9obCh0Y3BoLT5hY2tfc2VxKSAtIG90aGVyX3dheS0+b2Zmc2V0X2JlZm9yZSwKKwkJICBvdGhlcl93YXktPmNvcnJlY3Rpb25fcG9zKSkKKwkJbmV3YWNrID0gbnRvaGwodGNwaC0+YWNrX3NlcSkgLSBvdGhlcl93YXktPm9mZnNldF9hZnRlcjsKKwllbHNlCisJCW5ld2FjayA9IG50b2hsKHRjcGgtPmFja19zZXEpIC0gb3RoZXJfd2F5LT5vZmZzZXRfYmVmb3JlOworCW5ld2FjayA9IGh0b25sKG5ld2Fjayk7CisKKwl0Y3BoLT5jaGVjayA9IGlwX25hdF9jaGVhdF9jaGVjayh+dGNwaC0+c2VxLCBuZXdzZXEsCisJCQkJCSBpcF9uYXRfY2hlYXRfY2hlY2sofnRjcGgtPmFja19zZXEsIAorCQkJCQkgCQkgICAgbmV3YWNrLCAKKwkJCQkJCQkgICAgdGNwaC0+Y2hlY2spKTsKKworCURFQlVHUCgiQWRqdXN0aW5nIHNlcXVlbmNlIG51bWJlciBmcm9tICV1LT4ldSwgYWNrIGZyb20gJXUtPiV1XG4iLAorCQludG9obCh0Y3BoLT5zZXEpLCBudG9obChuZXdzZXEpLCBudG9obCh0Y3BoLT5hY2tfc2VxKSwKKwkJbnRvaGwobmV3YWNrKSk7CisKKwl0Y3BoLT5zZXEgPSBuZXdzZXE7CisJdGNwaC0+YWNrX3NlcSA9IG5ld2FjazsKKworCWlmICghaXBfbmF0X3NhY2tfYWRqdXN0KHBza2IsIHRjcGgsIGN0LCBjdGluZm8pKQorCQlyZXR1cm4gMDsKKworCWlwX2Nvbm50cmFja190Y3BfdXBkYXRlKCpwc2tiLCBjdCwgZGlyKTsKKworCXJldHVybiAxOworfQorCisvKiBTZXR1cCBOQVQgb24gdGhpcyBleHBlY3RlZCBjb25udHJhY2sgc28gaXQgZm9sbG93cyBtYXN0ZXIuICovCisvKiBJZiB3ZSBmYWlsIHRvIGdldCBhIGZyZWUgTkFUIHNsb3QsIHdlJ2xsIGdldCBkcm9wcGVkIG9uIGNvbmZpcm0gKi8KK3ZvaWQgaXBfbmF0X2ZvbGxvd19tYXN0ZXIoc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCisJCQkgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApCit7CisJc3RydWN0IGlwX25hdF9yYW5nZSByYW5nZTsKKworCS8qIFRoaXMgbXVzdCBiZSBhIGZyZXNoIG9uZS4gKi8KKwlCVUdfT04oY3QtPnN0YXR1cyAmIElQU19OQVRfRE9ORV9NQVNLKTsKKworCS8qIENoYW5nZSBzcmMgdG8gd2hlcmUgbWFzdGVyIHNlbmRzIHRvICovCisJcmFuZ2UuZmxhZ3MgPSBJUF9OQVRfUkFOR0VfTUFQX0lQUzsKKwlyYW5nZS5taW5faXAgPSByYW5nZS5tYXhfaXAKKwkJPSBjdC0+bWFzdGVyLT50dXBsZWhhc2hbIWV4cC0+ZGlyXS50dXBsZS5kc3QuaXA7CisJLyogaG9vayBkb2Vzbid0IG1hdHRlciwgYnV0IGl0IGhhcyB0byBkbyBzb3VyY2UgbWFuaXAgKi8KKwlpcF9uYXRfc2V0dXBfaW5mbyhjdCwgJnJhbmdlLCBORl9JUF9QT1NUX1JPVVRJTkcpOworCisJLyogRm9yIERTVCBtYW5pcCwgbWFwIHBvcnQgaGVyZSB0byB3aGVyZSBpdCdzIGV4cGVjdGVkLiAqLworCXJhbmdlLmZsYWdzID0gKElQX05BVF9SQU5HRV9NQVBfSVBTIHwgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCk7CisJcmFuZ2UubWluID0gcmFuZ2UubWF4ID0gZXhwLT5zYXZlZF9wcm90bzsKKwlyYW5nZS5taW5faXAgPSByYW5nZS5tYXhfaXAKKwkJPSBjdC0+bWFzdGVyLT50dXBsZWhhc2hbIWV4cC0+ZGlyXS50dXBsZS5zcmMuaXA7CisJLyogaG9vayBkb2Vzbid0IG1hdHRlciwgYnV0IGl0IGhhcyB0byBkbyBkZXN0aW5hdGlvbiBtYW5pcCAqLworCWlwX25hdF9zZXR1cF9pbmZvKGN0LCAmcmFuZ2UsIE5GX0lQX1BSRV9ST1VUSU5HKTsKK30KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaXJjLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2lyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMWNhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2lyYy5jCkBAIC0wLDAgKzEsMTI1IEBACisvKiBJUkMgZXh0ZW5zaW9uIGZvciBUQ1AgTkFUIGFsdGVyYXRpb24uCisgKiAoQykgMjAwMC0yMDAxIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwNCBSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+IElCTSBDb3Jwb3JhdGlvbgorICogYmFzZWQgb24gYSBjb3B5IG9mIFJSJ3MgaXBfbmF0X2Z0cC5jCisgKgorICogaXBfbmF0X2lyYy5jLHYgMS4xNiAyMDAxLzEyLzA2IDA3OjQyOjEwIGxhZm9yZ2UgRXhwCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9oZWxwZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19pcmMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKworI2lmIDAKKyNkZWZpbmUgREVCVUdQIHByaW50aworI2Vsc2UKKyNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJUkMgKERDQykgTkFUIGhlbHBlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IGhlbHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJIHVuc2lnbmVkIGludCBtYXRjaG9mZiwKKwkJCSB1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sCisJCQkgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkKK3sKKwl1X2ludDE2X3QgcG9ydDsKKwl1bnNpZ25lZCBpbnQgcmV0OworCisJLyogIjQyOTQ5NjcyOTYgNjU2MzUgIiAqLworCWNoYXIgYnVmZmVyWzE4XTsKKworCURFQlVHUCgiSVJDX05BVDogaW5mbyAoc2VxICV1ICsgJXUpIGluICV1XG4iLAorCSAgICAgICBleHBlY3QtPnNlcSwgZXhwX2lyY19pbmZvLT5sZW4sCisJICAgICAgIG50b2hsKHRjcGgtPnNlcSkpOworCisJLyogUmVwbHkgY29tZXMgZnJvbSBzZXJ2ZXIuICovCisJZXhwLT5zYXZlZF9wcm90by50Y3AucG9ydCA9IGV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQ7CisJZXhwLT5kaXIgPSBJUF9DVF9ESVJfUkVQTFk7CisKKwkvKiBXaGVuIHlvdSBzZWUgdGhlIHBhY2tldCwgd2UgbmVlZCB0byBOQVQgaXQgdGhlIHNhbWUgYXMgdGhlCisJICogdGhpcyBvbmUuICovCisJZXhwLT5leHBlY3RmbiA9IGlwX25hdF9mb2xsb3dfbWFzdGVyOworCisJLyogVHJ5IHRvIGdldCBzYW1lIHBvcnQ6IGlmIG5vdCwgdHJ5IHRvIGNoYW5nZSBpdC4gKi8KKwlmb3IgKHBvcnQgPSBudG9ocyhleHAtPnNhdmVkX3Byb3RvLnRjcC5wb3J0KTsgcG9ydCAhPSAwOyBwb3J0KyspIHsKKwkJZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydCA9IGh0b25zKHBvcnQpOworCQlpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCWlmIChwb3J0ID09IDApIHsKKwkJaXBfY29ubnRyYWNrX2V4cGVjdF9mcmVlKGV4cCk7CisJCXJldHVybiBORl9EUk9QOworCX0KKworCS8qICAgICAgc3RybGVuKCJcMURDQyBDSEFUIGNoYXQgQUFBQUFBQUEgUFwxXG4iKT0yNworCSAqICAgICAgc3RybGVuKCJcMURDQyBTQ0hBVCBjaGF0IEFBQUFBQUFBIFBcMVxuIik9MjgKKwkgKiAgICAgIHN0cmxlbigiXDFEQ0MgU0VORCBGIEFBQUFBQUFBIFAgU1wxXG4iKT0yNgorCSAqICAgICAgc3RybGVuKCJcMURDQyBNT1ZFIEYgQUFBQUFBQUEgUCBTXDFcbiIpPTI2CisJICogICAgICBzdHJsZW4oIlwxRENDIFRTRU5EIEYgQUFBQUFBQUEgUCBTXDFcbiIpPTI3CisJICogICAgICAgICAgICAgIEFBQUFBQUFBQTogYm91bmQgYWRkciAoMS4wLjAuMD09MTY3NzcyMTYsIG1pbiA4IGRpZ2l0cywKKwkgKiAgICAgICAgICAgICAgICAgICAgICAyNTUuMjU1LjI1NS4yNTU9PTQyOTQ5NjcyOTYsIDEwIGRpZ2l0cykKKwkgKiAgICAgICAgICAgICAgUDogICAgICAgICBib3VuZCBwb3J0IChtaW4gMSBkLCBtYXggNWQgKDY1NjM1KSkKKwkgKiAgICAgICAgICAgICAgRjogICAgICAgICBmaWxlbmFtZSAgIChtaW4gMSBkICkKKwkgKiAgICAgICAgICAgICAgUzogICAgICAgICBzaXplICAgICAgIChtaW4gMSBkICkKKwkgKiAgICAgICAgICAgICAgMHgwMSwgXG46ICB0ZXJtaW5hdG9ycworCSAqLworCisJLyogQUFBID0gInVzIiwgaWUuIHdoZXJlIHNlcnZlciBub3JtYWxseSB0YWxrcyB0by4gKi8KKwlzcHJpbnRmKGJ1ZmZlciwgIiV1ICV1IiwKKwkJbnRvaGwoZXhwLT5tYXN0ZXItPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC5pcCksCisJCXBvcnQpOworCURFQlVHUCgiaXBfbmF0X2lyYzogSW5zZXJ0aW5nICclcycgPT0gJXUuJXUuJXUuJXUsIHBvcnQgJXVcbiIsCisJICAgICAgIGJ1ZmZlciwgTklQUVVBRChleHAtPnR1cGxlLnNyYy5pcCksIHBvcnQpOworCisJcmV0ID0gaXBfbmF0X21hbmdsZV90Y3BfcGFja2V0KHBza2IsIGV4cC0+bWFzdGVyLCBjdGluZm8sIAorCQkJCSAgICAgICBtYXRjaG9mZiwgbWF0Y2hsZW4sIGJ1ZmZlciwgCisJCQkJICAgICAgIHN0cmxlbihidWZmZXIpKTsKKwlpZiAocmV0ICE9IE5GX0FDQ0VQVCkKKwkJaXBfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQoZXhwKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCWlwX25hdF9pcmNfaG9vayA9IE5VTEw7CisJLyogTWFrZSBzdXJlIG5vb25lIGNhbGxzIGl0LCBtZWFud2hpbGUuICovCisJc3luY2hyb25pemVfbmV0KCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlCVUdfT04oaXBfbmF0X2lyY19ob29rKTsKKwlpcF9uYXRfaXJjX2hvb2sgPSBoZWxwOworCXJldHVybiAwOworfQorCisvKiBQcmlvciB0byAyLjYuMTEsIHdlIGhhZCBhIHBvcnRzIHBhcmFtLiAgTm8gbG9uZ2VyLCBidXQgZG9uJ3QgYnJlYWsgdXNlcnMuICovCitzdGF0aWMgaW50IHdhcm5fc2V0KGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCit7CisJcHJpbnRrKEtFUk5fSU5GTyBfX3N0cmluZ2lmeShLQlVJTERfTU9ETkFNRSkKKwkgICAgICAgIjoga2VybmVsID49IDIuNi4xMCBvbmx5IHVzZXMgJ3BvcnRzJyBmb3IgY29ubnRyYWNrIG1vZHVsZXNcbiIpOworCXJldHVybiAwOworfQorbW9kdWxlX3BhcmFtX2NhbGwocG9ydHMsIHdhcm5fc2V0LCBOVUxMLCBOVUxMLCAwKTsKKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9faWNtcC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b19pY21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1OGNmMAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9faWNtcC5jCkBAIC0wLDAgKzEsMTE1IEBACisvKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCisgKiAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcHJvdG9jb2wuaD4KKworc3RhdGljIGludAoraWNtcF9pbl9yYW5nZShjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKKwkgICAgICBlbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSwKKwkgICAgICBjb25zdCB1bmlvbiBpcF9jb25udHJhY2tfbWFuaXBfcHJvdG8gKm1pbiwKKwkgICAgICBjb25zdCB1bmlvbiBpcF9jb25udHJhY2tfbWFuaXBfcHJvdG8gKm1heCkKK3sKKwlyZXR1cm4gKHR1cGxlLT5zcmMudS5pY21wLmlkID49IG1pbi0+aWNtcC5pZAorCQkmJiB0dXBsZS0+c3JjLnUuaWNtcC5pZCA8PSBtYXgtPmljbXAuaWQpOworfQorCitzdGF0aWMgaW50CitpY21wX3VuaXF1ZV90dXBsZShzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKKwkJICBjb25zdCBzdHJ1Y3QgaXBfbmF0X3JhbmdlICpyYW5nZSwKKwkJICBlbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSwKKwkJICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2spCit7CisJc3RhdGljIHVfaW50MTZfdCBpZDsKKwl1bnNpZ25lZCBpbnQgcmFuZ2Vfc2l6ZQorCQk9ICh1bnNpZ25lZCBpbnQpcmFuZ2UtPm1heC5pY21wLmlkIC0gcmFuZ2UtPm1pbi5pY21wLmlkICsgMTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIElmIG5vIHJhbmdlIHNwZWNpZmllZC4uLiAqLworCWlmICghKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpKQorCQlyYW5nZV9zaXplID0gMHhGRkZGOworCisJZm9yIChpID0gMDsgaSA8IHJhbmdlX3NpemU7IGkrKywgaWQrKykgeworCQl0dXBsZS0+c3JjLnUuaWNtcC5pZCA9IHJhbmdlLT5taW4uaWNtcC5pZCArIChpZCAlIHJhbmdlX3NpemUpOworCQlpZiAoIWlwX25hdF91c2VkX3R1cGxlKHR1cGxlLCBjb25udHJhY2spKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpY21wX21hbmlwX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJICAgICAgIHVuc2lnbmVkIGludCBpcGhkcm9mZiwKKwkgICAgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCisJICAgICAgIGVudW0gaXBfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlKQoreworCXN0cnVjdCBpcGhkciAqaXBoID0gKHN0cnVjdCBpcGhkciAqKSgoKnBza2IpLT5kYXRhICsgaXBoZHJvZmYpOworCXN0cnVjdCBpY21waGRyICpoZHI7CisJdW5zaWduZWQgaW50IGhkcm9mZiA9IGlwaGRyb2ZmICsgaXBoLT5paGwqNDsKKworCWlmICghc2tiX2lwX21ha2Vfd3JpdGFibGUocHNrYiwgaGRyb2ZmICsgc2l6ZW9mKCpoZHIpKSkKKwkJcmV0dXJuIDA7CisKKwloZHIgPSAoc3RydWN0IGljbXBoZHIgKikoKCpwc2tiKS0+ZGF0YSArIGhkcm9mZik7CisKKwloZHItPmNoZWNrc3VtID0gaXBfbmF0X2NoZWF0X2NoZWNrKGhkci0+dW4uZWNoby5pZCBeIDB4RkZGRiwKKwkJCQkJICAgIHR1cGxlLT5zcmMudS5pY21wLmlkLAorCQkJCQkgICAgaGRyLT5jaGVja3N1bSk7CisJaGRyLT51bi5lY2hvLmlkID0gdHVwbGUtPnNyYy51LmljbXAuaWQ7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2ljbXBfcHJpbnQoY2hhciAqYnVmZmVyLAorCSAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKm1hdGNoLAorCSAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKm1hc2spCit7CisJdW5zaWduZWQgaW50IGxlbiA9IDA7CisKKwlpZiAobWFzay0+c3JjLnUuaWNtcC5pZCkKKwkJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiaWQ9JXUgIiwKKwkJCSAgICAgICBudG9ocyhtYXRjaC0+c3JjLnUuaWNtcC5pZCkpOworCisJaWYgKG1hc2stPmRzdC51LmljbXAudHlwZSkKKwkJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAidHlwZT0ldSAiLAorCQkJICAgICAgIG50b2hzKG1hdGNoLT5kc3QudS5pY21wLnR5cGUpKTsKKworCWlmIChtYXNrLT5kc3QudS5pY21wLmNvZGUpCisJCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgImNvZGU9JXUgIiwKKwkJCSAgICAgICBudG9ocyhtYXRjaC0+ZHN0LnUuaWNtcC5jb2RlKSk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitpY21wX3ByaW50X3JhbmdlKGNoYXIgKmJ1ZmZlciwgY29uc3Qgc3RydWN0IGlwX25hdF9yYW5nZSAqcmFuZ2UpCit7CisJaWYgKHJhbmdlLT5taW4uaWNtcC5pZCAhPSAwIHx8IHJhbmdlLT5tYXguaWNtcC5pZCAhPSAweEZGRkYpCisJCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgImlkICV1LSV1ICIsCisJCQkgICAgICAgbnRvaHMocmFuZ2UtPm1pbi5pY21wLmlkKSwKKwkJCSAgICAgICBudG9ocyhyYW5nZS0+bWF4LmljbXAuaWQpKTsKKwllbHNlIHJldHVybiAwOworfQorCitzdHJ1Y3QgaXBfbmF0X3Byb3RvY29sIGlwX25hdF9wcm90b2NvbF9pY21wCis9IHsgIklDTVAiLCBJUFBST1RPX0lDTVAsCisgICAgaWNtcF9tYW5pcF9wa3QsCisgICAgaWNtcF9pbl9yYW5nZSwKKyAgICBpY21wX3VuaXF1ZV90dXBsZSwKKyAgICBpY21wX3ByaW50LAorICAgIGljbXBfcHJpbnRfcmFuZ2UKK307CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3RjcC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b190Y3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTFjZmNlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b190Y3AuYwpAQCAtMCwwICsxLDE3OCBAQAorLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAorICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9jb3JlLmg+CisKK3N0YXRpYyBpbnQKK3RjcF9pbl9yYW5nZShjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKKwkgICAgIGVudW0gaXBfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlLAorCSAgICAgY29uc3QgdW5pb24gaXBfY29ubnRyYWNrX21hbmlwX3Byb3RvICptaW4sCisJICAgICBjb25zdCB1bmlvbiBpcF9jb25udHJhY2tfbWFuaXBfcHJvdG8gKm1heCkKK3sKKwl1X2ludDE2X3QgcG9ydDsKKworCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQykKKwkJcG9ydCA9IHR1cGxlLT5zcmMudS50Y3AucG9ydDsKKwllbHNlCisJCXBvcnQgPSB0dXBsZS0+ZHN0LnUudGNwLnBvcnQ7CisKKwlyZXR1cm4gbnRvaHMocG9ydCkgPj0gbnRvaHMobWluLT50Y3AucG9ydCkKKwkJJiYgbnRvaHMocG9ydCkgPD0gbnRvaHMobWF4LT50Y3AucG9ydCk7Cit9CisKK3N0YXRpYyBpbnQKK3RjcF91bmlxdWVfdHVwbGUoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCisJCSBjb25zdCBzdHJ1Y3QgaXBfbmF0X3JhbmdlICpyYW5nZSwKKwkJIGVudW0gaXBfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlLAorCQkgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrKQoreworCXN0YXRpYyB1X2ludDE2X3QgcG9ydCwgKnBvcnRwdHI7CisJdW5zaWduZWQgaW50IHJhbmdlX3NpemUsIG1pbiwgaTsKKworCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQykKKwkJcG9ydHB0ciA9ICZ0dXBsZS0+c3JjLnUudGNwLnBvcnQ7CisJZWxzZQorCQlwb3J0cHRyID0gJnR1cGxlLT5kc3QudS50Y3AucG9ydDsKKworCS8qIElmIG5vIHJhbmdlIHNwZWNpZmllZC4uLiAqLworCWlmICghKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpKSB7CisJCS8qIElmIGl0J3MgZHN0IHJld3JpdGUsIGNhbid0IGNoYW5nZSBwb3J0ICovCisJCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX0RTVCkKKwkJCXJldHVybiAwOworCisJCS8qIE1hcCBwcml2aWxlZ2VkIG9udG8gcHJpdmlsZWdlZC4gKi8KKwkJaWYgKG50b2hzKCpwb3J0cHRyKSA8IDEwMjQpIHsKKwkJCS8qIExvb3NlIGNvbnZlbnRpb246ID4+IDUxMiBpcyBjcmVkZW50aWFsIHBhc3NpbmcgKi8KKwkJCWlmIChudG9ocygqcG9ydHB0cik8NTEyKSB7CisJCQkJbWluID0gMTsKKwkJCQlyYW5nZV9zaXplID0gNTExIC0gbWluICsgMTsKKwkJCX0gZWxzZSB7CisJCQkJbWluID0gNjAwOworCQkJCXJhbmdlX3NpemUgPSAxMDIzIC0gbWluICsgMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW1pbiA9IDEwMjQ7CisJCQlyYW5nZV9zaXplID0gNjU1MzUgLSAxMDI0ICsgMTsKKwkJfQorCX0gZWxzZSB7CisJCW1pbiA9IG50b2hzKHJhbmdlLT5taW4udGNwLnBvcnQpOworCQlyYW5nZV9zaXplID0gbnRvaHMocmFuZ2UtPm1heC50Y3AucG9ydCkgLSBtaW4gKyAxOworCX0KKworCWZvciAoaSA9IDA7IGkgPCByYW5nZV9zaXplOyBpKyssIHBvcnQrKykgeworCQkqcG9ydHB0ciA9IGh0b25zKG1pbiArIHBvcnQgJSByYW5nZV9zaXplKTsKKwkJaWYgKCFpcF9uYXRfdXNlZF90dXBsZSh0dXBsZSwgY29ubnRyYWNrKSkgeworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3RjcF9tYW5pcF9wa3Qoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCSAgICAgIHVuc2lnbmVkIGludCBpcGhkcm9mZiwKKwkgICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKKwkgICAgICBlbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSkKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IChzdHJ1Y3QgaXBoZHIgKikoKCpwc2tiKS0+ZGF0YSArIGlwaGRyb2ZmKTsKKwlzdHJ1Y3QgdGNwaGRyICpoZHI7CisJdW5zaWduZWQgaW50IGhkcm9mZiA9IGlwaGRyb2ZmICsgaXBoLT5paGwqNDsKKwl1MzIgb2xkaXAsIG5ld2lwOworCXUxNiAqcG9ydHB0ciwgbmV3cG9ydCwgb2xkcG9ydDsKKwlpbnQgaGRyc2l6ZSA9IDg7IC8qIFRDUCBjb25uZWN0aW9uIHRyYWNraW5nIGd1YXJhbnRlZXMgdGhpcyBtdWNoICovCisKKwkvKiB0aGlzIGNvdWxkIGJlIGEgaW5uZXIgaGVhZGVyIHJldHVybmVkIGluIGljbXAgcGFja2V0OyBpbiBzdWNoCisJICAgY2FzZXMgd2UgY2Fubm90IHVwZGF0ZSB0aGUgY2hlY2tzdW0gZmllbGQgc2luY2UgaXQgaXMgb3V0c2lkZSBvZgorCSAgIHRoZSA4IGJ5dGVzIG9mIHRyYW5zcG9ydCBsYXllciBoZWFkZXJzIHdlIGFyZSBndWFyYW50ZWVkICovCisJaWYgKCgqcHNrYiktPmxlbiA+PSBoZHJvZmYgKyBzaXplb2Yoc3RydWN0IHRjcGhkcikpCisJCWhkcnNpemUgPSBzaXplb2Yoc3RydWN0IHRjcGhkcik7CisKKwlpZiAoIXNrYl9pcF9tYWtlX3dyaXRhYmxlKHBza2IsIGhkcm9mZiArIGhkcnNpemUpKQorCQlyZXR1cm4gMDsKKworCWlwaCA9IChzdHJ1Y3QgaXBoZHIgKikoKCpwc2tiKS0+ZGF0YSArIGlwaGRyb2ZmKTsKKwloZHIgPSAoc3RydWN0IHRjcGhkciAqKSgoKnBza2IpLT5kYXRhICsgaGRyb2ZmKTsKKworCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQykgeworCQkvKiBHZXQgcmlkIG9mIHNyYyBpcCBhbmQgc3JjIHB0ICovCisJCW9sZGlwID0gaXBoLT5zYWRkcjsKKwkJbmV3aXAgPSB0dXBsZS0+c3JjLmlwOworCQluZXdwb3J0ID0gdHVwbGUtPnNyYy51LnRjcC5wb3J0OworCQlwb3J0cHRyID0gJmhkci0+c291cmNlOworCX0gZWxzZSB7CisJCS8qIEdldCByaWQgb2YgZHN0IGlwIGFuZCBkc3QgcHQgKi8KKwkJb2xkaXAgPSBpcGgtPmRhZGRyOworCQluZXdpcCA9IHR1cGxlLT5kc3QuaXA7CisJCW5ld3BvcnQgPSB0dXBsZS0+ZHN0LnUudGNwLnBvcnQ7CisJCXBvcnRwdHIgPSAmaGRyLT5kZXN0OworCX0KKworCW9sZHBvcnQgPSAqcG9ydHB0cjsKKwkqcG9ydHB0ciA9IG5ld3BvcnQ7CisKKwlpZiAoaGRyc2l6ZSA8IHNpemVvZigqaGRyKSkKKwkJcmV0dXJuIDE7CisKKwloZHItPmNoZWNrID0gaXBfbmF0X2NoZWF0X2NoZWNrKH5vbGRpcCwgbmV3aXAsCisJCQkJCWlwX25hdF9jaGVhdF9jaGVjayhvbGRwb3J0IF4gMHhGRkZGLAorCQkJCQkJCSAgIG5ld3BvcnQsCisJCQkJCQkJICAgaGRyLT5jaGVjaykpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50Cit0Y3BfcHJpbnQoY2hhciAqYnVmZmVyLAorCSAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqbWF0Y2gsCisJICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICptYXNrKQoreworCXVuc2lnbmVkIGludCBsZW4gPSAwOworCisJaWYgKG1hc2stPnNyYy51LnRjcC5wb3J0KQorCQlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICJzcmNwdD0ldSAiLAorCQkJICAgICAgIG50b2hzKG1hdGNoLT5zcmMudS50Y3AucG9ydCkpOworCisKKwlpZiAobWFzay0+ZHN0LnUudGNwLnBvcnQpCisJCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgImRzdHB0PSV1ICIsCisJCQkgICAgICAgbnRvaHMobWF0Y2gtPmRzdC51LnRjcC5wb3J0KSk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50Cit0Y3BfcHJpbnRfcmFuZ2UoY2hhciAqYnVmZmVyLCBjb25zdCBzdHJ1Y3QgaXBfbmF0X3JhbmdlICpyYW5nZSkKK3sKKwlpZiAocmFuZ2UtPm1pbi50Y3AucG9ydCAhPSAwIHx8IHJhbmdlLT5tYXgudGNwLnBvcnQgIT0gMHhGRkZGKSB7CisJCWlmIChyYW5nZS0+bWluLnRjcC5wb3J0ID09IHJhbmdlLT5tYXgudGNwLnBvcnQpCisJCQlyZXR1cm4gc3ByaW50ZihidWZmZXIsICJwb3J0ICV1ICIsCisJCQkJICAgICAgIG50b2hzKHJhbmdlLT5taW4udGNwLnBvcnQpKTsKKwkJZWxzZQorCQkJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAicG9ydHMgJXUtJXUgIiwKKwkJCQkgICAgICAgbnRvaHMocmFuZ2UtPm1pbi50Y3AucG9ydCksCisJCQkJICAgICAgIG50b2hzKHJhbmdlLT5tYXgudGNwLnBvcnQpKTsKKwl9CisJZWxzZSByZXR1cm4gMDsKK30KKworc3RydWN0IGlwX25hdF9wcm90b2NvbCBpcF9uYXRfcHJvdG9jb2xfdGNwCis9IHsgIlRDUCIsIElQUFJPVE9fVENQLAorICAgIHRjcF9tYW5pcF9wa3QsCisgICAgdGNwX2luX3JhbmdlLAorICAgIHRjcF91bmlxdWVfdHVwbGUsCisgICAgdGNwX3ByaW50LAorICAgIHRjcF9wcmludF9yYW5nZQorfTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdWRwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3VkcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NjllM2IKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3VkcC5jCkBAIC0wLDAgKzEsMTY1IEBACisvKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCisgKiAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9wcm90b2NvbC5oPgorCitzdGF0aWMgaW50Cit1ZHBfaW5fcmFuZ2UoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCisJICAgICBlbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSwKKwkgICAgIGNvbnN0IHVuaW9uIGlwX2Nvbm50cmFja19tYW5pcF9wcm90byAqbWluLAorCSAgICAgY29uc3QgdW5pb24gaXBfY29ubnRyYWNrX21hbmlwX3Byb3RvICptYXgpCit7CisJdV9pbnQxNl90IHBvcnQ7CisKKwlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9TUkMpCisJCXBvcnQgPSB0dXBsZS0+c3JjLnUudWRwLnBvcnQ7CisJZWxzZQorCQlwb3J0ID0gdHVwbGUtPmRzdC51LnVkcC5wb3J0OworCisJcmV0dXJuIG50b2hzKHBvcnQpID49IG50b2hzKG1pbi0+dWRwLnBvcnQpCisJCSYmIG50b2hzKHBvcnQpIDw9IG50b2hzKG1heC0+dWRwLnBvcnQpOworfQorCitzdGF0aWMgaW50Cit1ZHBfdW5pcXVlX3R1cGxlKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAorCQkgY29uc3Qgc3RydWN0IGlwX25hdF9yYW5nZSAqcmFuZ2UsCisJCSBlbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSwKKwkJIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaykKK3sKKwlzdGF0aWMgdV9pbnQxNl90IHBvcnQsICpwb3J0cHRyOworCXVuc2lnbmVkIGludCByYW5nZV9zaXplLCBtaW4sIGk7CisKKwlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9TUkMpCisJCXBvcnRwdHIgPSAmdHVwbGUtPnNyYy51LnVkcC5wb3J0OworCWVsc2UKKwkJcG9ydHB0ciA9ICZ0dXBsZS0+ZHN0LnUudWRwLnBvcnQ7CisKKwkvKiBJZiBubyByYW5nZSBzcGVjaWZpZWQuLi4gKi8KKwlpZiAoIShyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEKSkgeworCQkvKiBJZiBpdCdzIGRzdCByZXdyaXRlLCBjYW4ndCBjaGFuZ2UgcG9ydCAqLworCQlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9EU1QpCisJCQlyZXR1cm4gMDsKKworCQlpZiAobnRvaHMoKnBvcnRwdHIpIDwgMTAyNCkgeworCQkJLyogTG9vc2UgY29udmVudGlvbjogPj4gNTEyIGlzIGNyZWRlbnRpYWwgcGFzc2luZyAqLworCQkJaWYgKG50b2hzKCpwb3J0cHRyKTw1MTIpIHsKKwkJCQltaW4gPSAxOworCQkJCXJhbmdlX3NpemUgPSA1MTEgLSBtaW4gKyAxOworCQkJfSBlbHNlIHsKKwkJCQltaW4gPSA2MDA7CisJCQkJcmFuZ2Vfc2l6ZSA9IDEwMjMgLSBtaW4gKyAxOworCQkJfQorCQl9IGVsc2UgeworCQkJbWluID0gMTAyNDsKKwkJCXJhbmdlX3NpemUgPSA2NTUzNSAtIDEwMjQgKyAxOworCQl9CisJfSBlbHNlIHsKKwkJbWluID0gbnRvaHMocmFuZ2UtPm1pbi51ZHAucG9ydCk7CisJCXJhbmdlX3NpemUgPSBudG9ocyhyYW5nZS0+bWF4LnVkcC5wb3J0KSAtIG1pbiArIDE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHJhbmdlX3NpemU7IGkrKywgcG9ydCsrKSB7CisJCSpwb3J0cHRyID0gaHRvbnMobWluICsgcG9ydCAlIHJhbmdlX3NpemUpOworCQlpZiAoIWlwX25hdF91c2VkX3R1cGxlKHR1cGxlLCBjb25udHJhY2spKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit1ZHBfbWFuaXBfcGt0KHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkgICAgICB1bnNpZ25lZCBpbnQgaXBoZHJvZmYsCisJICAgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCisJICAgICAgZW51bSBpcF9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUpCit7CisJc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyICopKCgqcHNrYiktPmRhdGEgKyBpcGhkcm9mZik7CisJc3RydWN0IHVkcGhkciAqaGRyOworCXVuc2lnbmVkIGludCBoZHJvZmYgPSBpcGhkcm9mZiArIGlwaC0+aWhsKjQ7CisJdTMyIG9sZGlwLCBuZXdpcDsKKwl1MTYgKnBvcnRwdHIsIG5ld3BvcnQ7CisKKwlpZiAoIXNrYl9pcF9tYWtlX3dyaXRhYmxlKHBza2IsIGhkcm9mZiArIHNpemVvZigqaGRyKSkpCisJCXJldHVybiAwOworCisJaXBoID0gKHN0cnVjdCBpcGhkciAqKSgoKnBza2IpLT5kYXRhICsgaXBoZHJvZmYpOworCWhkciA9IChzdHJ1Y3QgdWRwaGRyICopKCgqcHNrYiktPmRhdGEgKyBoZHJvZmYpOworCisJaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKSB7CisJCS8qIEdldCByaWQgb2Ygc3JjIGlwIGFuZCBzcmMgcHQgKi8KKwkJb2xkaXAgPSBpcGgtPnNhZGRyOworCQluZXdpcCA9IHR1cGxlLT5zcmMuaXA7CisJCW5ld3BvcnQgPSB0dXBsZS0+c3JjLnUudWRwLnBvcnQ7CisJCXBvcnRwdHIgPSAmaGRyLT5zb3VyY2U7CisJfSBlbHNlIHsKKwkJLyogR2V0IHJpZCBvZiBkc3QgaXAgYW5kIGRzdCBwdCAqLworCQlvbGRpcCA9IGlwaC0+ZGFkZHI7CisJCW5ld2lwID0gdHVwbGUtPmRzdC5pcDsKKwkJbmV3cG9ydCA9IHR1cGxlLT5kc3QudS51ZHAucG9ydDsKKwkJcG9ydHB0ciA9ICZoZHItPmRlc3Q7CisJfQorCWlmIChoZHItPmNoZWNrKSAvKiAwIGlzIGEgc3BlY2lhbCBjYXNlIG1lYW5pbmcgbm8gY2hlY2tzdW0gKi8KKwkJaGRyLT5jaGVjayA9IGlwX25hdF9jaGVhdF9jaGVjayh+b2xkaXAsIG5ld2lwLAorCQkJCQlpcF9uYXRfY2hlYXRfY2hlY2soKnBvcnRwdHIgXiAweEZGRkYsCisJCQkJCQkJICAgbmV3cG9ydCwKKwkJCQkJCQkgICBoZHItPmNoZWNrKSk7CisJKnBvcnRwdHIgPSBuZXdwb3J0OworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50Cit1ZHBfcHJpbnQoY2hhciAqYnVmZmVyLAorCSAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqbWF0Y2gsCisJICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICptYXNrKQoreworCXVuc2lnbmVkIGludCBsZW4gPSAwOworCisJaWYgKG1hc2stPnNyYy51LnVkcC5wb3J0KQorCQlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICJzcmNwdD0ldSAiLAorCQkJICAgICAgIG50b2hzKG1hdGNoLT5zcmMudS51ZHAucG9ydCkpOworCisKKwlpZiAobWFzay0+ZHN0LnUudWRwLnBvcnQpCisJCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgImRzdHB0PSV1ICIsCisJCQkgICAgICAgbnRvaHMobWF0Y2gtPmRzdC51LnVkcC5wb3J0KSk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50Cit1ZHBfcHJpbnRfcmFuZ2UoY2hhciAqYnVmZmVyLCBjb25zdCBzdHJ1Y3QgaXBfbmF0X3JhbmdlICpyYW5nZSkKK3sKKwlpZiAocmFuZ2UtPm1pbi51ZHAucG9ydCAhPSAwIHx8IHJhbmdlLT5tYXgudWRwLnBvcnQgIT0gMHhGRkZGKSB7CisJCWlmIChyYW5nZS0+bWluLnVkcC5wb3J0ID09IHJhbmdlLT5tYXgudWRwLnBvcnQpCisJCQlyZXR1cm4gc3ByaW50ZihidWZmZXIsICJwb3J0ICV1ICIsCisJCQkJICAgICAgIG50b2hzKHJhbmdlLT5taW4udWRwLnBvcnQpKTsKKwkJZWxzZQorCQkJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAicG9ydHMgJXUtJXUgIiwKKwkJCQkgICAgICAgbnRvaHMocmFuZ2UtPm1pbi51ZHAucG9ydCksCisJCQkJICAgICAgIG50b2hzKHJhbmdlLT5tYXgudWRwLnBvcnQpKTsKKwl9CisJZWxzZSByZXR1cm4gMDsKK30KKworc3RydWN0IGlwX25hdF9wcm90b2NvbCBpcF9uYXRfcHJvdG9jb2xfdWRwCis9IHsgIlVEUCIsIElQUFJPVE9fVURQLAorICAgIHVkcF9tYW5pcF9wa3QsCisgICAgdWRwX2luX3JhbmdlLAorICAgIHVkcF91bmlxdWVfdHVwbGUsCisgICAgdWRwX3ByaW50LAorICAgIHVkcF9wcmludF9yYW5nZQorfTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdW5rbm93bi5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b191bmtub3duLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU1MjViZAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdW5rbm93bi5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qIFRoZSAidW5rbm93biIgcHJvdG9jb2wuICBUaGlzIGlzIHdoYXQgaXMgdXNlZCBmb3IgcHJvdG9jb2xzIHdlCisgKiBkb24ndCB1bmRlcnN0YW5kLiAgSXQncyByZXR1cm5lZCBieSBpcF9jdF9maW5kX3Byb3RvKCkuCisgKi8KKworLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAorICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9wcm90b2NvbC5oPgorCitzdGF0aWMgaW50IHVua25vd25faW5fcmFuZ2UoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCisJCQkgICAgZW51bSBpcF9uYXRfbWFuaXBfdHlwZSBtYW5pcF90eXBlLAorCQkJICAgIGNvbnN0IHVuaW9uIGlwX2Nvbm50cmFja19tYW5pcF9wcm90byAqbWluLAorCQkJICAgIGNvbnN0IHVuaW9uIGlwX2Nvbm50cmFja19tYW5pcF9wcm90byAqbWF4KQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHVua25vd25fdW5pcXVlX3R1cGxlKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAorCQkJCWNvbnN0IHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlLAorCQkJCWVudW0gaXBfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlLAorCQkJCWNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaykKK3sKKwkvKiBTb3JyeTogd2UgY2FuJ3QgaGVscCB5b3U7IGlmIGl0J3Mgbm90IHVuaXF1ZSwgd2UgY2FuJ3QgZnJvYgorCSAgIGFueXRoaW5nLiAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit1bmtub3duX21hbmlwX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCSAgdW5zaWduZWQgaW50IGlwaGRyb2ZmLAorCQkgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAorCQkgIGVudW0gaXBfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50Cit1bmtub3duX3ByaW50KGNoYXIgKmJ1ZmZlciwKKwkgICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICptYXRjaCwKKwkgICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICptYXNrKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50Cit1bmtub3duX3ByaW50X3JhbmdlKGNoYXIgKmJ1ZmZlciwgY29uc3Qgc3RydWN0IGlwX25hdF9yYW5nZSAqcmFuZ2UpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBpcF9uYXRfcHJvdG9jb2wgaXBfbmF0X3Vua25vd25fcHJvdG9jb2wgPSB7CisJInVua25vd24iLCAwLAorCXVua25vd25fbWFuaXBfcGt0LAorCXVua25vd25faW5fcmFuZ2UsCisJdW5rbm93bl91bmlxdWVfdHVwbGUsCisJdW5rbm93bl9wcmludCwKKwl1bmtub3duX3ByaW50X3JhbmdlCit9OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9ydWxlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3J1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODFmMDk3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9ydWxlLmMKQEAgLTAsMCArMSwzMTkgQEAKKy8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKKyAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKy8qIEV2ZXJ5dGhpbmcgYWJvdXQgdGhlIHJ1bGVzIGZvciBOQVQuICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxuZXQvcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2RlZmluZSBBU1NFUlRfUkVBRF9MT0NLKHgpIE1VU1RfQkVfUkVBRF9MT0NLRUQoJmlwX25hdF9sb2NrKQorI2RlZmluZSBBU1NFUlRfV1JJVEVfTE9DSyh4KSBNVVNUX0JFX1dSSVRFX0xPQ0tFRCgmaXBfbmF0X2xvY2spCisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9ydWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvbGlzdGhlbHAuaD4KKworI2lmIDAKKyNkZWZpbmUgREVCVUdQIHByaW50aworI2Vsc2UKKyNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCisjZGVmaW5lIE5BVF9WQUxJRF9IT09LUyAoKDE8PE5GX0lQX1BSRV9ST1VUSU5HKSB8ICgxPDxORl9JUF9QT1NUX1JPVVRJTkcpIHwgKDE8PE5GX0lQX0xPQ0FMX09VVCkpCisKK3N0YXRpYyBzdHJ1Y3QKK3sKKwlzdHJ1Y3QgaXB0X3JlcGxhY2UgcmVwbDsKKwlzdHJ1Y3QgaXB0X3N0YW5kYXJkIGVudHJpZXNbM107CisJc3RydWN0IGlwdF9lcnJvciB0ZXJtOworfSBuYXRfaW5pdGlhbF90YWJsZSBfX2luaXRkYXRhCis9IHsgeyAibmF0IiwgTkFUX1ZBTElEX0hPT0tTLCA0LAorICAgICAgc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpICogMyArIHNpemVvZihzdHJ1Y3QgaXB0X2Vycm9yKSwKKyAgICAgIHsgW05GX0lQX1BSRV9ST1VUSU5HXSA9IDAsCisJW05GX0lQX1BPU1RfUk9VVElOR10gPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCksCisJW05GX0lQX0xPQ0FMX09VVF0gPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCkgKiAyIH0sCisgICAgICB7IFtORl9JUF9QUkVfUk9VVElOR10gPSAwLAorCVtORl9JUF9QT1NUX1JPVVRJTkddID0gc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpLAorCVtORl9JUF9MT0NBTF9PVVRdID0gc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpICogMiB9LAorICAgICAgMCwgTlVMTCwgeyB9IH0sCisgICAgeworCSAgICAvKiBQUkVfUk9VVElORyAqLworCSAgICB7IHsgeyB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgIiIsICIiLCB7IDAgfSwgeyAwIH0sIDAsIDAsIDAgfSwKKwkJMCwKKwkJc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpLAorCQlzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCksCisJCTAsIHsgMCwgMCB9LCB7IH0gfSwKKwkgICAgICB7IHsgeyB7IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZF90YXJnZXQpKSwgIiIgfSB9LCB7IH0gfSwKKwkJLU5GX0FDQ0VQVCAtIDEgfSB9LAorCSAgICAvKiBQT1NUX1JPVVRJTkcgKi8KKwkgICAgeyB7IHsgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sICIiLCAiIiwgeyAwIH0sIHsgMCB9LCAwLCAwLCAwIH0sCisJCTAsCisJCXNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5KSwKKwkJc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpLAorCQkwLCB7IDAsIDAgfSwgeyB9IH0sCisJICAgICAgeyB7IHsgeyBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0KSksICIiIH0gfSwgeyB9IH0sCisJCS1ORl9BQ0NFUFQgLSAxIH0gfSwKKwkgICAgLyogTE9DQUxfT1VUICovCisJICAgIHsgeyB7IHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCAiIiwgIiIsIHsgMCB9LCB7IDAgfSwgMCwgMCwgMCB9LAorCQkwLAorCQlzaXplb2Yoc3RydWN0IGlwdF9lbnRyeSksCisJCXNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSwKKwkJMCwgeyAwLCAwIH0sIHsgfSB9LAorCSAgICAgIHsgeyB7IHsgSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkX3RhcmdldCkpLCAiIiB9IH0sIHsgfSB9LAorCQktTkZfQUNDRVBUIC0gMSB9IH0KKyAgICB9LAorICAgIC8qIEVSUk9SICovCisgICAgeyB7IHsgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sICIiLCAiIiwgeyAwIH0sIHsgMCB9LCAwLCAwLCAwIH0sCisJMCwKKwlzaXplb2Yoc3RydWN0IGlwdF9lbnRyeSksCisJc2l6ZW9mKHN0cnVjdCBpcHRfZXJyb3IpLAorCTAsIHsgMCwgMCB9LCB7IH0gfSwKKyAgICAgIHsgeyB7IHsgSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X2Vycm9yX3RhcmdldCkpLCBJUFRfRVJST1JfVEFSR0VUIH0gfSwKKwkgIHsgfSB9LAorCSJFUlJPUiIKKyAgICAgIH0KKyAgICB9Cit9OworCitzdGF0aWMgc3RydWN0IGlwdF90YWJsZSBuYXRfdGFibGUgPSB7CisJLm5hbWUJCT0gIm5hdCIsCisJLnZhbGlkX2hvb2tzCT0gTkFUX1ZBTElEX0hPT0tTLAorCS5sb2NrCQk9IFJXX0xPQ0tfVU5MT0NLRUQsCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworLyogU291cmNlIE5BVCAqLworc3RhdGljIHVuc2lnbmVkIGludCBpcHRfc25hdF90YXJnZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQkJICAgIHVuc2lnbmVkIGludCBob29rbnVtLAorCQkJCSAgICBjb25zdCB2b2lkICp0YXJnaW5mbywKKwkJCQkgICAgdm9pZCAqdXNlcmluZm8pCit7CisJc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7CisJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CisJY29uc3Qgc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yID0gdGFyZ2luZm87CisKKwlJUF9ORl9BU1NFUlQoaG9va251bSA9PSBORl9JUF9QT1NUX1JPVVRJTkcpOworCisJY3QgPSBpcF9jb25udHJhY2tfZ2V0KCpwc2tiLCAmY3RpbmZvKTsKKworCS8qIENvbm5lY3Rpb24gbXVzdCBiZSB2YWxpZCBhbmQgbmV3LiAqLworCUlQX05GX0FTU0VSVChjdCAmJiAoY3RpbmZvID09IElQX0NUX05FVyB8fCBjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRAorCSAgICAgICAgICAgICAgICAgICAgfHwgY3RpbmZvID09IElQX0NUX1JFTEFURUQgKyBJUF9DVF9JU19SRVBMWSkpOworCUlQX05GX0FTU0VSVChvdXQpOworCisJcmV0dXJuIGlwX25hdF9zZXR1cF9pbmZvKGN0LCAmbXItPnJhbmdlWzBdLCBob29rbnVtKTsKK30KKworLyogQmVmb3JlIDIuNi4xMSB3ZSBkaWQgaW1wbGljaXQgc291cmNlIE5BVCBpZiByZXF1aXJlZC4gV2FybiBhYm91dCBjaGFuZ2UuICovCitzdGF0aWMgdm9pZCB3YXJuX2lmX2V4dHJhX21hbmdsZSh1MzIgZHN0aXAsIHUzMiBzcmNpcCkKK3sKKwlzdGF0aWMgaW50IHdhcm5lZCA9IDA7CisJc3RydWN0IGZsb3dpIGZsID0geyAubmxfdSA9IHsgLmlwNF91ID0geyAuZGFkZHIgPSBkc3RpcCB9IH0gfTsKKwlzdHJ1Y3QgcnRhYmxlICpydDsKKworCWlmIChpcF9yb3V0ZV9vdXRwdXRfa2V5KCZydCwgJmZsKSAhPSAwKQorCQlyZXR1cm47CisKKwlpZiAocnQtPnJ0X3NyYyAhPSBzcmNpcCAmJiAhd2FybmVkKSB7CisJCXByaW50aygiTkFUOiBubyBsb25nZXIgc3VwcG9ydCBpbXBsaWNpdCBzb3VyY2UgbG9jYWwgTkFUXG4iKTsKKwkJcHJpbnRrKCJOQVQ6IHBhY2tldCBzcmMgJXUuJXUuJXUuJXUgLT4gZHN0ICV1LiV1LiV1LiV1XG4iLAorCQkgICAgICAgTklQUVVBRChzcmNpcCksIE5JUFFVQUQoZHN0aXApKTsKKwkJd2FybmVkID0gMTsKKwl9CisJaXBfcnRfcHV0KHJ0KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBpcHRfZG5hdF90YXJnZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQkJICAgIHVuc2lnbmVkIGludCBob29rbnVtLAorCQkJCSAgICBjb25zdCB2b2lkICp0YXJnaW5mbywKKwkJCQkgICAgdm9pZCAqdXNlcmluZm8pCit7CisJc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7CisJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CisJY29uc3Qgc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yID0gdGFyZ2luZm87CisKKwlJUF9ORl9BU1NFUlQoaG9va251bSA9PSBORl9JUF9QUkVfUk9VVElORworCQkgICAgIHx8IGhvb2tudW0gPT0gTkZfSVBfTE9DQUxfT1VUKTsKKworCWN0ID0gaXBfY29ubnRyYWNrX2dldCgqcHNrYiwgJmN0aW5mbyk7CisKKwkvKiBDb25uZWN0aW9uIG11c3QgYmUgdmFsaWQgYW5kIG5ldy4gKi8KKwlJUF9ORl9BU1NFUlQoY3QgJiYgKGN0aW5mbyA9PSBJUF9DVF9ORVcgfHwgY3RpbmZvID09IElQX0NUX1JFTEFURUQpKTsKKworCWlmIChob29rbnVtID09IE5GX0lQX0xPQ0FMX09VVAorCSAgICAmJiBtci0+cmFuZ2VbMF0uZmxhZ3MgJiBJUF9OQVRfUkFOR0VfTUFQX0lQUykKKwkJd2Fybl9pZl9leHRyYV9tYW5nbGUoKCpwc2tiKS0+bmguaXBoLT5kYWRkciwKKwkJCQkgICAgIG1yLT5yYW5nZVswXS5taW5faXApOworCisJcmV0dXJuIGlwX25hdF9zZXR1cF9pbmZvKGN0LCAmbXItPnJhbmdlWzBdLCBob29rbnVtKTsKK30KKworc3RhdGljIGludCBpcHRfc25hdF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCQkJICAgICAgIHZvaWQgKnRhcmdpbmZvLAorCQkJICAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSB0YXJnaW5mbzsKKworCS8qIE11c3QgYmUgYSB2YWxpZCByYW5nZSAqLworCWlmIChtci0+cmFuZ2VzaXplICE9IDEpIHsKKwkJcHJpbnRrKCJTTkFUOiBtdWx0aXBsZSByYW5nZXMgbm8gbG9uZ2VyIHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICh0YXJnaW5mb3NpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlX2NvbXBhdCkpKSB7CisJCURFQlVHUCgiU05BVDogVGFyZ2V0IHNpemUgJXUgd3JvbmcgZm9yICV1IHJhbmdlc1xuIiwKKwkJICAgICAgIHRhcmdpbmZvc2l6ZSwgbXItPnJhbmdlc2l6ZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIE9ubHkgYWxsb3cgdGhlc2UgZm9yIE5BVC4gKi8KKwlpZiAoc3RyY21wKHRhYmxlbmFtZSwgIm5hdCIpICE9IDApIHsKKwkJREVCVUdQKCJTTkFUOiB3cm9uZyB0YWJsZSAlc1xuIiwgdGFibGVuYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGhvb2tfbWFzayAmIH4oMSA8PCBORl9JUF9QT1NUX1JPVVRJTkcpKSB7CisJCURFQlVHUCgiU05BVDogaG9vayBtYXNrIDB4JXggYmFkXG4iLCBob29rX21hc2spOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaXB0X2RuYXRfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkJCSAgICAgICB2b2lkICp0YXJnaW5mbywKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yID0gdGFyZ2luZm87CisKKwkvKiBNdXN0IGJlIGEgdmFsaWQgcmFuZ2UgKi8KKwlpZiAobXItPnJhbmdlc2l6ZSAhPSAxKSB7CisJCXByaW50aygiRE5BVDogbXVsdGlwbGUgcmFuZ2VzIG5vIGxvbmdlciBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodGFyZ2luZm9zaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZV9jb21wYXQpKSkgeworCQlERUJVR1AoIkROQVQ6IFRhcmdldCBzaXplICV1IHdyb25nIGZvciAldSByYW5nZXNcbiIsCisJCSAgICAgICB0YXJnaW5mb3NpemUsIG1yLT5yYW5nZXNpemUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBPbmx5IGFsbG93IHRoZXNlIGZvciBOQVQuICovCisJaWYgKHN0cmNtcCh0YWJsZW5hbWUsICJuYXQiKSAhPSAwKSB7CisJCURFQlVHUCgiRE5BVDogd3JvbmcgdGFibGUgJXNcbiIsIHRhYmxlbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChob29rX21hc2sgJiB+KCgxIDw8IE5GX0lQX1BSRV9ST1VUSU5HKSB8ICgxIDw8IE5GX0lQX0xPQ0FMX09VVCkpKSB7CisJCURFQlVHUCgiRE5BVDogaG9vayBtYXNrIDB4JXggYmFkXG4iLCBob29rX21hc2spOworCQlyZXR1cm4gMDsKKwl9CisJCisJcmV0dXJuIDE7Cit9CisKK2lubGluZSB1bnNpZ25lZCBpbnQKK2FsbG9jX251bGxfYmluZGluZyhzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2ssCisJCSAgIHN0cnVjdCBpcF9uYXRfaW5mbyAqaW5mbywKKwkJICAgdW5zaWduZWQgaW50IGhvb2tudW0pCit7CisJLyogRm9yY2UgcmFuZ2UgdG8gdGhpcyBJUDsgbGV0IHByb3RvIGRlY2lkZSBtYXBwaW5nIGZvcgorCSAgIHBlci1wcm90byBwYXJ0cyAoaGVuY2Ugbm90IElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpLgorCSAgIFVzZSByZXBseSBpbiBjYXNlIGl0J3MgYWxyZWFkeSBiZWVuIG1hbmdsZWQgKGVnIGxvY2FsIHBhY2tldCkuCisJKi8KKwl1X2ludDMyX3QgaXAKKwkJPSAoSE9PSzJNQU5JUChob29rbnVtKSA9PSBJUF9OQVRfTUFOSVBfU1JDCisJCSAgID8gY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5kc3QuaXAKKwkJICAgOiBjb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLnNyYy5pcCk7CisJc3RydWN0IGlwX25hdF9yYW5nZSByYW5nZQorCQk9IHsgSVBfTkFUX1JBTkdFX01BUF9JUFMsIGlwLCBpcCwgeyAwIH0sIHsgMCB9IH07CisKKwlERUJVR1AoIkFsbG9jYXRpbmcgTlVMTCBiaW5kaW5nIGZvciAlcCAoJXUuJXUuJXUuJXUpXG4iLCBjb25udHJhY2ssCisJICAgICAgIE5JUFFVQUQoaXApKTsKKwlyZXR1cm4gaXBfbmF0X3NldHVwX2luZm8oY29ubnRyYWNrLCAmcmFuZ2UsIGhvb2tudW0pOworfQorCitpbnQgaXBfbmF0X3J1bGVfZmluZChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCSAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCisJCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCSAgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCisJCSAgICAgc3RydWN0IGlwX25hdF9pbmZvICppbmZvKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpcHRfZG9fdGFibGUocHNrYiwgaG9va251bSwgaW4sIG91dCwgJm5hdF90YWJsZSwgTlVMTCk7CisKKwlpZiAocmV0ID09IE5GX0FDQ0VQVCkgeworCQlpZiAoIWlwX25hdF9pbml0aWFsaXplZChjdCwgSE9PSzJNQU5JUChob29rbnVtKSkpCisJCQkvKiBOVUwgbWFwcGluZyAqLworCQkJcmV0ID0gYWxsb2NfbnVsbF9iaW5kaW5nKGN0LCBpbmZvLCBob29rbnVtKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF9zbmF0X3JlZyA9IHsKKwkubmFtZQkJPSAiU05BVCIsCisJLnRhcmdldAkJPSBpcHRfc25hdF90YXJnZXQsCisJLmNoZWNrZW50cnkJPSBpcHRfc25hdF9jaGVja2VudHJ5LAorfTsKKworc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF9kbmF0X3JlZyA9IHsKKwkubmFtZQkJPSAiRE5BVCIsCisJLnRhcmdldAkJPSBpcHRfZG5hdF90YXJnZXQsCisJLmNoZWNrZW50cnkJPSBpcHRfZG5hdF9jaGVja2VudHJ5LAorfTsKKworaW50IF9faW5pdCBpcF9uYXRfcnVsZV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGlwdF9yZWdpc3Rlcl90YWJsZSgmbmF0X3RhYmxlLCAmbmF0X2luaXRpYWxfdGFibGUucmVwbCk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCXJldCA9IGlwdF9yZWdpc3Rlcl90YXJnZXQoJmlwdF9zbmF0X3JlZyk7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIHVucmVnaXN0ZXJfdGFibGU7CisKKwlyZXQgPSBpcHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfZG5hdF9yZWcpOworCWlmIChyZXQgIT0gMCkKKwkJZ290byB1bnJlZ2lzdGVyX3NuYXQ7CisKKwlyZXR1cm4gcmV0OworCisgdW5yZWdpc3Rlcl9zbmF0OgorCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X3NuYXRfcmVnKTsKKyB1bnJlZ2lzdGVyX3RhYmxlOgorCWlwdF91bnJlZ2lzdGVyX3RhYmxlKCZuYXRfdGFibGUpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBpcF9uYXRfcnVsZV9jbGVhbnVwKHZvaWQpCit7CisJaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfZG5hdF9yZWcpOworCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X3NuYXRfcmVnKTsKKwlpcHRfdW5yZWdpc3Rlcl90YWJsZSgmbmF0X3RhYmxlKTsKK30KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc25tcF9iYXNpYy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9zbm1wX2Jhc2ljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE0OGI2ZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc25tcF9iYXNpYy5jCkBAIC0wLDAgKzEsMTM0NyBAQAorLyoKKyAqIGlwX25hdF9zbm1wX2Jhc2ljLmMKKyAqCisgKiBCYXNpYyBTTk1QIEFwcGxpY2F0aW9uIExheWVyIEdhdGV3YXkKKyAqCisgKiBUaGlzIElQIE5BVCBtb2R1bGUgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIFNOTVAgbmV0d29yayAKKyAqIGRpc2NvdmVyeSBhbmQgbW9uaXRvcmluZyBhcHBsaWNhdGlvbnMgd2hlcmUgdGFyZ2V0IG5ldHdvcmtzIHVzZSAKKyAqIGNvbmZsaWN0aW5nIHByaXZhdGUgYWRkcmVzcyByZWFsbXMuCisgKgorICogU3RhdGljIE5BVCBpcyB1c2VkIHRvIHJlbWFwIHRoZSBuZXR3b3JrcyBmcm9tIHRoZSB2aWV3IG9mIHRoZSBuZXR3b3JrIAorICogbWFuYWdlbWVudCBzeXN0ZW0gYXQgdGhlIElQIGxheWVyLCBhbmQgdGhpcyBtb2R1bGUgcmVtYXBzIHNvbWUgYXBwbGljYXRpb24KKyAqIGxheWVyIGFkZHJlc3NlcyB0byBtYXRjaC4KKyAqCisgKiBUaGUgc2ltcGxlc3QgZm9ybSBvZiBBTEcgaXMgcGVyZm9ybWVkLCB3aGVyZSBvbmx5IHRhZ2dlZCBJUCBhZGRyZXNzZXMKKyAqIGFyZSBtb2RpZmllZC4gIFRoZSBtb2R1bGUgZG9lcyBub3QgbmVlZCB0byBiZSBNSUIgYXdhcmUgYW5kIG9ubHkgc2NhbnMKKyAqIG1lc3NhZ2VzIGF0IHRoZSBBU04uMS9CRVIgbGV2ZWwuCisgKgorICogQ3VycmVudGx5LCBvbmx5IFNOTVB2MSBhbmQgU05NUHYyIGFyZSBzdXBwb3J0ZWQuCisgKgorICogTW9yZSBpbmZvcm1hdGlvbiBvbiBBTEcgYW5kIGFzc29jaWF0ZWQgaXNzdWVzIGNhbiBiZSBmb3VuZCBpbgorICogUkZDIDI5NjIKKyAqCisgKiBUaGUgQVNCLjEvQkVSIHBhcnNpbmcgY29kZSBpcyBkZXJpdmVkIGZyb20gdGhlIGd4c25tcCBwYWNrYWdlIGJ5IEdyZWdvcnkgCisgKiBNY0xlYW4gJiBKb2NoZW4gRnJpZWRyaWNoLCBzdHJpcHBlZCBkb3duIGZvciB1c2UgaW4gdGhlIGtlcm5lbC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgUlAgSW50ZXJuZXQgKHd3dy5ycGkubmV0LmF1KS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICogQXV0aG9yOiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KKyAqCisgKiBVcGRhdGVzOgorICogMjAwMC0wOC0wNjogQ29udmVydCB0byBuZXcgaGVscGVyIEFQSSAoSGFyYWxkIFdlbHRlKS4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X2hlbHBlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bmV0L3VkcC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCYXNpYyBTTk1QIEFwcGxpY2F0aW9uIExheWVyIEdhdGV3YXkiKTsKKworI2RlZmluZSBTTk1QX1BPUlQgMTYxCisjZGVmaW5lIFNOTVBfVFJBUF9QT1JUIDE2MgorI2RlZmluZSBOT0NUMShuKSAodV9pbnQ4X3QgKSgobikgJiAweGZmKQorCitzdGF0aWMgaW50IGRlYnVnOworc3RhdGljIERFRklORV9TUElOTE9DSyhzbm1wX2xvY2spOworCisvKiAKKyAqIEFwcGxpY2F0aW9uIGxheWVyIGFkZHJlc3MgbWFwcGluZyBtaW1pY3MgdGhlIE5BVCBtYXBwaW5nLCBidXQgCisgKiBvbmx5IGZvciB0aGUgZmlyc3Qgb2N0ZXQgaW4gdGhpcyBjYXNlIChhIG1vcmUgZmxleGlibGUgc3lzdGVtCisgKiBjYW4gYmUgaW1wbGVtZW50ZWQgaWYgbmVlZGVkKS4KKyAqLworc3RydWN0IG9jdDFfbWFwCit7CisJdV9pbnQ4X3QgZnJvbTsKKwl1X2ludDhfdCB0bzsKK307CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEJhc2ljIEFTTi4xIGRlY29kaW5nIHJvdXRpbmVzIChneHNubXAgYXV0aG9yIERpcmsgV2lzc2UpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDbGFzcyAqLworI2RlZmluZSBBU04xX1VOSQkwCS8qIFVuaXZlcnNhbCAqLworI2RlZmluZSBBU04xX0FQTAkxCS8qIEFwcGxpY2F0aW9uICovCisjZGVmaW5lIEFTTjFfQ1RYCTIJLyogQ29udGV4dCAqLworI2RlZmluZSBBU04xX1BSVgkzCS8qIFByaXZhdGUgKi8KKworLyogVGFnICovCisjZGVmaW5lIEFTTjFfRU9DCTAJLyogRW5kIE9mIENvbnRlbnRzICovCisjZGVmaW5lIEFTTjFfQk9MCTEJLyogQm9vbGVhbiAqLworI2RlZmluZSBBU04xX0lOVAkyCS8qIEludGVnZXIgKi8KKyNkZWZpbmUgQVNOMV9CVFMJMwkvKiBCaXQgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfT1RTCTQJLyogT2N0ZXQgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfTlVMCTUJLyogTnVsbCAqLworI2RlZmluZSBBU04xX09KSQk2CS8qIE9iamVjdCBJZGVudGlmaWVyICAqLworI2RlZmluZSBBU04xX09KRAk3CS8qIE9iamVjdCBEZXNjcmlwdGlvbiAqLworI2RlZmluZSBBU04xX0VYVAk4CS8qIEV4dGVybmFsICovCisjZGVmaW5lIEFTTjFfU0VRCTE2CS8qIFNlcXVlbmNlICovCisjZGVmaW5lIEFTTjFfU0VUCTE3CS8qIFNldCAqLworI2RlZmluZSBBU04xX05VTVNUUgkxOAkvKiBOdW1lcmljYWwgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfUFJOU1RSCTE5CS8qIFByaW50YWJsZSBTdHJpbmcgKi8KKyNkZWZpbmUgQVNOMV9URVhTVFIJMjAJLyogVGVsZXRleHQgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfVklEU1RSCTIxCS8qIFZpZGVvIFN0cmluZyAqLworI2RlZmluZSBBU04xX0lBNVNUUgkyMgkvKiBJQTUgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfVU5JVElNCTIzCS8qIFVuaXZlcnNhbCBUaW1lICovCisjZGVmaW5lIEFTTjFfR0VOVElNCTI0CS8qIEdlbmVyYWwgVGltZSAqLworI2RlZmluZSBBU04xX0dSQVNUUgkyNQkvKiBHcmFwaGljYWwgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfVklTU1RSCTI2CS8qIFZpc2libGUgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfR0VOU1RSCTI3CS8qIEdlbmVyYWwgU3RyaW5nICovCisKKy8qIFByaW1pdGl2ZSAvIENvbnN0cnVjdGVkIG1ldGhvZHMqLworI2RlZmluZSBBU04xX1BSSQkwCS8qIFByaW1pdGl2ZSAqLworI2RlZmluZSBBU04xX0NPTgkxCS8qIENvbnN0cnVjdGVkICovCisKKy8qCisgKiBFcnJvciBjb2Rlcy4KKyAqLworI2RlZmluZSBBU04xX0VSUl9OT0VSUk9SCQkwCisjZGVmaW5lIEFTTjFfRVJSX0RFQ19FTVBUWQkJMgorI2RlZmluZSBBU04xX0VSUl9ERUNfRU9DX01JU01BVENICTMKKyNkZWZpbmUgQVNOMV9FUlJfREVDX0xFTkdUSF9NSVNNQVRDSAk0CisjZGVmaW5lIEFTTjFfRVJSX0RFQ19CQURWQUxVRQkJNQorCisvKiAKKyAqIEFTTi4xIGNvbnRleHQuCisgKi8KK3N0cnVjdCBhc24xX2N0eAoreworCWludCBlcnJvcjsJCQkvKiBFcnJvciBjb25kaXRpb24gKi8KKwl1bnNpZ25lZCBjaGFyICpwb2ludGVyOwkJLyogT2N0ZXQganVzdCB0byBiZSBkZWNvZGVkICovCisJdW5zaWduZWQgY2hhciAqYmVnaW47CQkvKiBGaXJzdCBvY3RldCAqLworCXVuc2lnbmVkIGNoYXIgKmVuZDsJCS8qIE9jdGV0IGFmdGVyIGxhc3Qgb2N0ZXQgKi8KK307CisKKy8qCisgKiBPY3RldCBzdHJpbmcgKG5vdCBudWxsIHRlcm1pbmF0ZWQpCisgKi8KK3N0cnVjdCBhc24xX29jdHN0cgoreworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJdW5zaWduZWQgaW50IGxlbjsKK307CisJCitzdGF0aWMgdm9pZCBhc24xX29wZW4oc3RydWN0IGFzbjFfY3R4ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsZW4pCit7CisJY3R4LT5iZWdpbiA9IGJ1ZjsKKwljdHgtPmVuZCA9IGJ1ZiArIGxlbjsKKwljdHgtPnBvaW50ZXIgPSBidWY7CisJY3R4LT5lcnJvciA9IEFTTjFfRVJSX05PRVJST1I7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfb2N0ZXRfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LCB1bnNpZ25lZCBjaGFyICpjaCkKK3sKKwlpZiAoY3R4LT5wb2ludGVyID49IGN0eC0+ZW5kKSB7CisJCWN0eC0+ZXJyb3IgPSBBU04xX0VSUl9ERUNfRU1QVFk7CisJCXJldHVybiAwOworCX0KKwkqY2ggPSAqKGN0eC0+cG9pbnRlcikrKzsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNuMV90YWdfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LCB1bnNpZ25lZCBpbnQgKnRhZykKK3sKKwl1bnNpZ25lZCBjaGFyIGNoOworCQorCSp0YWcgPSAwOworCQorCWRvCisJeworCQlpZiAoIWFzbjFfb2N0ZXRfZGVjb2RlKGN0eCwgJmNoKSkKKwkJCXJldHVybiAwOworCQkqdGFnIDw8PSA3OworCQkqdGFnIHw9IGNoICYgMHg3RjsKKwl9IHdoaWxlICgoY2ggJiAweDgwKSA9PSAweDgwKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNuMV9pZF9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpjbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqdGFnKQoreworCXVuc2lnbmVkIGNoYXIgY2g7CisJCisJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCXJldHVybiAwOworCQkKKwkqY2xzID0gKGNoICYgMHhDMCkgPj4gNjsKKwkqY29uID0gKGNoICYgMHgyMCkgPj4gNTsKKwkqdGFnID0gKGNoICYgMHgxRik7CisJCisJaWYgKCp0YWcgPT0gMHgxRikgeworCQlpZiAoIWFzbjFfdGFnX2RlY29kZShjdHgsIHRhZykpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfbGVuZ3RoX2RlY29kZShzdHJ1Y3QgYXNuMV9jdHggKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmxlbikKK3sKKwl1bnNpZ25lZCBjaGFyIGNoLCBjbnQ7CisJCisJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCXJldHVybiAwOworCQkKKwlpZiAoY2ggPT0gMHg4MCkKKwkJKmRlZiA9IDA7CisJZWxzZSB7CisJCSpkZWYgPSAxOworCQkKKwkJaWYgKGNoIDwgMHg4MCkKKwkJCSpsZW4gPSBjaDsKKwkJZWxzZSB7CisJCQljbnQgPSAodW5zaWduZWQgY2hhcikgKGNoICYgMHg3Rik7CisJCQkqbGVuID0gMDsKKwkJCQorCQkJd2hpbGUgKGNudCA+IDApIHsKKwkJCQlpZiAoIWFzbjFfb2N0ZXRfZGVjb2RlKGN0eCwgJmNoKSkKKwkJCQkJcmV0dXJuIDA7CisJCQkJKmxlbiA8PD0gODsKKwkJCQkqbGVuIHw9IGNoOworCQkJCWNudC0tOworCQkJfQorCQl9CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBhc24xX2hlYWRlcl9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqKmVvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmNscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnRhZykKK3sKKwl1bnNpZ25lZCBpbnQgZGVmLCBsZW47CisJCisJaWYgKCFhc24xX2lkX2RlY29kZShjdHgsIGNscywgY29uLCB0YWcpKQorCQlyZXR1cm4gMDsKKwkJCisJaWYgKCFhc24xX2xlbmd0aF9kZWNvZGUoY3R4LCAmZGVmLCAmbGVuKSkKKwkJcmV0dXJuIDA7CisJCQorCWlmIChkZWYpCisJCSplb2MgPSBjdHgtPnBvaW50ZXIgKyBsZW47CisJZWxzZQorCQkqZW9jID0gTlVMTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNuMV9lb2NfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LCB1bnNpZ25lZCBjaGFyICplb2MpCit7CisJdW5zaWduZWQgY2hhciBjaDsKKwkKKwlpZiAoZW9jID09IDApIHsKKwkJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCQlyZXR1cm4gMDsKKwkJCQorCQlpZiAoY2ggIT0gMHgwMCkgeworCQkJY3R4LT5lcnJvciA9IEFTTjFfRVJSX0RFQ19FT0NfTUlTTUFUQ0g7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkKKwkJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCQlyZXR1cm4gMDsKKwkJCQorCQlpZiAoY2ggIT0gMHgwMCkgeworCQkJY3R4LT5lcnJvciA9IEFTTjFfRVJSX0RFQ19FT0NfTUlTTUFUQ0g7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQlpZiAoY3R4LT5wb2ludGVyICE9IGVvYykgeworCQkJY3R4LT5lcnJvciA9IEFTTjFfRVJSX0RFQ19MRU5HVEhfTUlTTUFUQ0g7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gMTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfbnVsbF9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsIHVuc2lnbmVkIGNoYXIgKmVvYykKK3sKKwljdHgtPnBvaW50ZXIgPSBlb2M7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfbG9uZ19kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmVvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAqaW50ZWdlcikKK3sKKwl1bnNpZ25lZCBjaGFyIGNoOworCXVuc2lnbmVkIGludCAgbGVuOworCQorCWlmICghYXNuMV9vY3RldF9kZWNvZGUoY3R4LCAmY2gpKQorCQlyZXR1cm4gMDsKKwkJCisJKmludGVnZXIgPSAoc2lnbmVkIGNoYXIpIGNoOworCWxlbiA9IDE7CisJCisJd2hpbGUgKGN0eC0+cG9pbnRlciA8IGVvYykgeworCQlpZiAoKytsZW4gPiBzaXplb2YgKGxvbmcpKSB7CisJCQljdHgtPmVycm9yID0gQVNOMV9FUlJfREVDX0JBRFZBTFVFOworCQkJcmV0dXJuIDA7CisJCX0KKwkJCisJCWlmICghYXNuMV9vY3RldF9kZWNvZGUoY3R4LCAmY2gpKQorCQkJcmV0dXJuIDA7CisJCQkKKwkJKmludGVnZXIgPDw9IDg7CisJCSppbnRlZ2VyIHw9IGNoOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNuMV91aW50X2RlY29kZShzdHJ1Y3QgYXNuMV9jdHggKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZW9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmludGVnZXIpCit7CisJdW5zaWduZWQgY2hhciBjaDsKKwl1bnNpZ25lZCBpbnQgIGxlbjsKKwkKKwlpZiAoIWFzbjFfb2N0ZXRfZGVjb2RlKGN0eCwgJmNoKSkKKwkJcmV0dXJuIDA7CisJCQorCSppbnRlZ2VyID0gY2g7CisJaWYgKGNoID09IDApIGxlbiA9IDA7CisJZWxzZSBsZW4gPSAxOworCQorCXdoaWxlIChjdHgtPnBvaW50ZXIgPCBlb2MpIHsKKwkJaWYgKCsrbGVuID4gc2l6ZW9mICh1bnNpZ25lZCBpbnQpKSB7CisJCQljdHgtPmVycm9yID0gQVNOMV9FUlJfREVDX0JBRFZBTFVFOworCQkJcmV0dXJuIDA7CisJCX0KKwkJCisJCWlmICghYXNuMV9vY3RldF9kZWNvZGUoY3R4LCAmY2gpKQorCQkJcmV0dXJuIDA7CisJCQkKKwkJKmludGVnZXIgPDw9IDg7CisJCSppbnRlZ2VyIHw9IGNoOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNuMV91bG9uZ19kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICplb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICppbnRlZ2VyKQoreworCXVuc2lnbmVkIGNoYXIgY2g7CisJdW5zaWduZWQgaW50ICBsZW47CisJCisJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCXJldHVybiAwOworCQkKKwkqaW50ZWdlciA9IGNoOworCWlmIChjaCA9PSAwKSBsZW4gPSAwOworCWVsc2UgbGVuID0gMTsKKwkKKwl3aGlsZSAoY3R4LT5wb2ludGVyIDwgZW9jKSB7CisJCWlmICgrK2xlbiA+IHNpemVvZiAodW5zaWduZWQgbG9uZykpIHsKKwkJCWN0eC0+ZXJyb3IgPSBBU04xX0VSUl9ERUNfQkFEVkFMVUU7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkKKwkJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCQlyZXR1cm4gMDsKKwkJCQorCQkqaW50ZWdlciA8PD0gODsKKwkJKmludGVnZXIgfD0gY2g7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBhc24xX29jdGV0c19kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZW9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKipvY3RldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpsZW4pCit7CisJdW5zaWduZWQgY2hhciAqcHRyOworCQorCSpsZW4gPSAwOworCQorCSpvY3RldHMgPSBrbWFsbG9jKGVvYyAtIGN0eC0+cG9pbnRlciwgR0ZQX0FUT01JQyk7CisJaWYgKCpvY3RldHMgPT0gTlVMTCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKCJPT00gaW4gYnNhbGcgKCVkKVxuIiwgX19MSU5FX18pOworCQlyZXR1cm4gMDsKKwl9CisJCisJcHRyID0gKm9jdGV0czsKKwl3aGlsZSAoY3R4LT5wb2ludGVyIDwgZW9jKSB7CisJCWlmICghYXNuMV9vY3RldF9kZWNvZGUoY3R4LCAodW5zaWduZWQgY2hhciAqKXB0cisrKSkgeworCQkJa2ZyZWUoKm9jdGV0cyk7CisJCQkqb2N0ZXRzID0gTlVMTDsKKwkJCXJldHVybiAwOworCQl9CisJCSgqbGVuKSsrOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNuMV9zdWJpZF9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICpzdWJpZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGNoOworCQorCSpzdWJpZCA9IDA7CisJCisJZG8geworCQlpZiAoIWFzbjFfb2N0ZXRfZGVjb2RlKGN0eCwgJmNoKSkKKwkJCXJldHVybiAwOworCQkKKwkJKnN1YmlkIDw8PSA3OworCQkqc3ViaWQgfD0gY2ggJiAweDdGOworCX0gd2hpbGUgKChjaCAmIDB4ODApID09IDB4ODApOworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBhc24xX29pZF9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZW9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKipvaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpsZW4pCit7CisJdW5zaWduZWQgbG9uZyBzdWJpZDsKKwl1bnNpZ25lZCBpbnQgIHNpemU7CisJdW5zaWduZWQgbG9uZyAqb3B0cjsKKwkKKwlzaXplID0gZW9jIC0gY3R4LT5wb2ludGVyICsgMTsKKwkqb2lkID0ga21hbGxvYyhzaXplICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCBHRlBfQVRPTUlDKTsKKwlpZiAoKm9pZCA9PSBOVUxMKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoIk9PTSBpbiBic2FsZyAoJWQpXG4iLCBfX0xJTkVfXyk7CisJCXJldHVybiAwOworCX0KKwkKKwlvcHRyID0gKm9pZDsKKwkKKwlpZiAoIWFzbjFfc3ViaWRfZGVjb2RlKGN0eCwgJnN1YmlkKSkgeworCQlrZnJlZSgqb2lkKTsKKwkJKm9pZCA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKwkKKwlpZiAoc3ViaWQgPCA0MCkgeworCQlvcHRyIFswXSA9IDA7CisJCW9wdHIgWzFdID0gc3ViaWQ7CisJfSBlbHNlIGlmIChzdWJpZCA8IDgwKSB7CisJCW9wdHIgWzBdID0gMTsKKwkJb3B0ciBbMV0gPSBzdWJpZCAtIDQwOworCX0gZWxzZSB7CisJCW9wdHIgWzBdID0gMjsKKwkJb3B0ciBbMV0gPSBzdWJpZCAtIDgwOworCX0KKwkKKwkqbGVuID0gMjsKKwlvcHRyICs9IDI7CisJCisJd2hpbGUgKGN0eC0+cG9pbnRlciA8IGVvYykgeworCQlpZiAoKysoKmxlbikgPiBzaXplKSB7CisJCQljdHgtPmVycm9yID0gQVNOMV9FUlJfREVDX0JBRFZBTFVFOworCQkJa2ZyZWUoKm9pZCk7CisJCQkqb2lkID0gTlVMTDsKKwkJCXJldHVybiAwOworCQl9CisJCQorCQlpZiAoIWFzbjFfc3ViaWRfZGVjb2RlKGN0eCwgb3B0cisrKSkgeworCQkJa2ZyZWUoKm9pZCk7CisJCQkqb2lkID0gTlVMTDsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTTk1QIGRlY29kaW5nIHJvdXRpbmVzIChneHNubXAgYXV0aG9yIERpcmsgV2lzc2UpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBTTk1QIFZlcnNpb25zICovCisjZGVmaW5lIFNOTVBfVjEJCQkJMAorI2RlZmluZSBTTk1QX1YyQwkJCTEKKyNkZWZpbmUgU05NUF9WMgkJCQkyCisjZGVmaW5lIFNOTVBfVjMJCQkJMworCisvKiBEZWZhdWx0IFNpemVzICovCisjZGVmaW5lIFNOTVBfU0laRV9DT01NCQkJMjU2CisjZGVmaW5lIFNOTVBfU0laRV9PQkpFQ1RJRAkJMTI4CisjZGVmaW5lIFNOTVBfU0laRV9CVUZDSFIJCTI1NgorI2RlZmluZSBTTk1QX1NJWkVfQlVGSU5UCQkxMjgKKyNkZWZpbmUgU05NUF9TSVpFX1NNQUxMT0JKRUNUSUQJCTE2CisKKy8qIFJlcXVlc3RzICovCisjZGVmaW5lIFNOTVBfUERVX0dFVAkJCTAKKyNkZWZpbmUgU05NUF9QRFVfTkVYVAkJCTEKKyNkZWZpbmUgU05NUF9QRFVfUkVTUE9OU0UJCTIKKyNkZWZpbmUgU05NUF9QRFVfU0VUCQkJMworI2RlZmluZSBTTk1QX1BEVV9UUkFQMQkJCTQKKyNkZWZpbmUgU05NUF9QRFVfQlVMSwkJCTUKKyNkZWZpbmUgU05NUF9QRFVfSU5GT1JNCQkJNgorI2RlZmluZSBTTk1QX1BEVV9UUkFQMgkJCTcKKworLyogRXJyb3JzICovCisjZGVmaW5lIFNOTVBfTk9FUlJPUgkJCTAKKyNkZWZpbmUgU05NUF9UT09CSUcJCQkxCisjZGVmaW5lIFNOTVBfTk9TVUNITkFNRQkJCTIKKyNkZWZpbmUgU05NUF9CQURWQUxVRQkJCTMKKyNkZWZpbmUgU05NUF9SRUFET05MWQkJCTQKKyNkZWZpbmUgU05NUF9HRU5FUlJPUgkJCTUKKyNkZWZpbmUgU05NUF9OT0FDQ0VTUwkJCTYKKyNkZWZpbmUgU05NUF9XUk9OR1RZUEUJCQk3CisjZGVmaW5lIFNOTVBfV1JPTkdMRU5HVEgJCTgKKyNkZWZpbmUgU05NUF9XUk9OR0VOQ09ESU5HCQk5CisjZGVmaW5lIFNOTVBfV1JPTkdWQUxVRQkJCTEwCisjZGVmaW5lIFNOTVBfTk9DUkVBVElPTgkJCTExCisjZGVmaW5lIFNOTVBfSU5DT05TSVNURU5UVkFMVUUJCTEyCisjZGVmaW5lIFNOTVBfUkVTT1VSQ0VVTkFWQUlMQUJMRQkxMworI2RlZmluZSBTTk1QX0NPTU1JVEZBSUxFRAkJMTQKKyNkZWZpbmUgU05NUF9VTkRPRkFJTEVECQkJMTUKKyNkZWZpbmUgU05NUF9BVVRIT1JJWkFUSU9ORVJST1IJCTE2CisjZGVmaW5lIFNOTVBfTk9UV1JJVEFCTEUJCTE3CisjZGVmaW5lIFNOTVBfSU5DT05TSVNURU5UTkFNRQkJMTgKKworLyogR2VuZXJhbCBTTk1QIFYxIFRyYXBzICovCisjZGVmaW5lIFNOTVBfVFJBUF9DT0xEU1RBUlQJCTAKKyNkZWZpbmUgU05NUF9UUkFQX1dBUk1TVEFSVAkJMQorI2RlZmluZSBTTk1QX1RSQVBfTElOS0RPV04JCTIKKyNkZWZpbmUgU05NUF9UUkFQX0xJTktVUAkJMworI2RlZmluZSBTTk1QX1RSQVBfQVVURkFJTFVSRQkJNAorI2RlZmluZSBTTk1QX1RSQVBfRVFQTkVJR0hCT1JMT1NTCTUKKyNkZWZpbmUgU05NUF9UUkFQX0VOVFNQRUNJRklDCQk2CisKKy8qIFNOTVB2MSBUeXBlcyAqLworI2RlZmluZSBTTk1QX05VTEwgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTTk1QX0lOVEVHRVIgICAgICAgICAgICAgMSAgICAvKiBsICAqLworI2RlZmluZSBTTk1QX09DVEVUU1RSICAgICAgICAgICAgMiAgICAvKiBjICAqLworI2RlZmluZSBTTk1QX0RJU1BMQVlTVFIgICAgICAgICAgMiAgICAvKiBjICAqLworI2RlZmluZSBTTk1QX09CSkVDVElEICAgICAgICAgICAgMyAgICAvKiB1bCAqLworI2RlZmluZSBTTk1QX0lQQUREUiAgICAgICAgICAgICAgNCAgICAvKiB1YyAqLworI2RlZmluZSBTTk1QX0NPVU5URVIgICAgICAgICAgICAgNSAgICAvKiB1bCAqLworI2RlZmluZSBTTk1QX0dBVUdFICAgICAgICAgICAgICAgNiAgICAvKiB1bCAqLworI2RlZmluZSBTTk1QX1RJTUVUSUNLUyAgICAgICAgICAgNyAgICAvKiB1bCAqLworI2RlZmluZSBTTk1QX09QQVFVRSAgICAgICAgICAgICAgOCAgICAvKiBjICAqLworCisvKiBBZGRpdGlvbmFsIFNOTVB2MiBUeXBlcyAqLworI2RlZmluZSBTTk1QX1VJTlRFR0VSICAgICAgICAgICAgNSAgICAvKiB1bCAqLworI2RlZmluZSBTTk1QX0JJVFNUUiAgICAgICAgICAgICAgOSAgICAvKiB1YyAqLworI2RlZmluZSBTTk1QX05TQVAgICAgICAgICAgICAgICAxMCAgICAvKiB1YyAqLworI2RlZmluZSBTTk1QX0NPVU5URVI2NCAgICAgICAgICAxMSAgICAvKiB1bCAqLworI2RlZmluZSBTTk1QX05PU1VDSE9CSkVDVCAgICAgICAxMgorI2RlZmluZSBTTk1QX05PU1VDSElOU1RBTkNFICAgICAxMworI2RlZmluZSBTTk1QX0VORE9GTUlCVklFVyAgICAgICAxNAorCit1bmlvbiBzbm1wX3N5bnRheAoreworCXVuc2lnbmVkIGNoYXIgdWNbMF07CS8qIDggYml0IHVuc2lnbmVkICovCisJY2hhciBjWzBdOwkJLyogOCBiaXQgc2lnbmVkICovCisJdW5zaWduZWQgbG9uZyB1bFswXTsJLyogMzIgYml0IHVuc2lnbmVkICovCisJbG9uZyBsWzBdOwkJLyogMzIgYml0IHNpZ25lZCAqLworfTsKKworc3RydWN0IHNubXBfb2JqZWN0Cit7CisJdW5zaWduZWQgbG9uZyAqaWQ7CisJdW5zaWduZWQgaW50IGlkX2xlbjsKKwl1bnNpZ25lZCBzaG9ydCB0eXBlOworCXVuc2lnbmVkIGludCBzeW50YXhfbGVuOworCXVuaW9uIHNubXBfc3ludGF4IHN5bnRheDsKK307CisKK3N0cnVjdCBzbm1wX3JlcXVlc3QKK3sKKwl1bnNpZ25lZCBsb25nIGlkOworCXVuc2lnbmVkIGludCBlcnJvcl9zdGF0dXM7CisJdW5zaWduZWQgaW50IGVycm9yX2luZGV4OworfTsKKworc3RydWN0IHNubXBfdjFfdHJhcAoreworCXVuc2lnbmVkIGxvbmcgKmlkOworCXVuc2lnbmVkIGludCBpZF9sZW47CisJdW5zaWduZWQgbG9uZyBpcF9hZGRyZXNzOwkvKiBwb2ludGVyICAqLworCXVuc2lnbmVkIGludCBnZW5lcmFsOworCXVuc2lnbmVkIGludCBzcGVjaWZpYzsKKwl1bnNpZ25lZCBsb25nIHRpbWU7Cit9OworCisvKiBTTk1QIHR5cGVzICovCisjZGVmaW5lIFNOTVBfSVBBICAgIDAKKyNkZWZpbmUgU05NUF9DTlQgICAgMQorI2RlZmluZSBTTk1QX0dHRSAgICAyCisjZGVmaW5lIFNOTVBfVElUICAgIDMKKyNkZWZpbmUgU05NUF9PUFEgICAgNAorI2RlZmluZSBTTk1QX0M2NCAgICA2CisKKy8qIFNOTVAgZXJyb3JzICovCisjZGVmaW5lIFNFUlJfTlNPICAgIDAKKyNkZWZpbmUgU0VSUl9OU0kgICAgMQorI2RlZmluZSBTRVJSX0VPTSAgICAyCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYW5nbGVfYWRkcmVzcyh1bnNpZ25lZCBjaGFyICpiZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICphZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBvY3QxX21hcCAqbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50MTZfdCAqY2hlY2spOworc3RydWN0IHNubXBfY252Cit7CisJdW5zaWduZWQgaW50IGNsYXNzOworCXVuc2lnbmVkIGludCB0YWc7CisJaW50IHN5bnRheDsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25tcF9jbnYgc25tcF9jb252IFtdID0KK3sKKwl7QVNOMV9VTkksIEFTTjFfTlVMLCBTTk1QX05VTEx9LAorCXtBU04xX1VOSSwgQVNOMV9JTlQsIFNOTVBfSU5URUdFUn0sCisJe0FTTjFfVU5JLCBBU04xX09UUywgU05NUF9PQ1RFVFNUUn0sCisJe0FTTjFfVU5JLCBBU04xX09UUywgU05NUF9ESVNQTEFZU1RSfSwKKwl7QVNOMV9VTkksIEFTTjFfT0pJLCBTTk1QX09CSkVDVElEfSwKKwl7QVNOMV9BUEwsIFNOTVBfSVBBLCBTTk1QX0lQQUREUn0sCisJe0FTTjFfQVBMLCBTTk1QX0NOVCwgU05NUF9DT1VOVEVSfSwJLyogQ291bnRlcjMyICovCisJe0FTTjFfQVBMLCBTTk1QX0dHRSwgU05NUF9HQVVHRX0sCS8qIEdhdWdlMzIgPT0gVW5zaWduZWQzMiAgKi8KKwl7QVNOMV9BUEwsIFNOTVBfVElULCBTTk1QX1RJTUVUSUNLU30sCisJe0FTTjFfQVBMLCBTTk1QX09QUSwgU05NUF9PUEFRVUV9LAorCQorCS8qIFNOTVB2MiBkYXRhIHR5cGVzIGFuZCBlcnJvcnMgKi8KKwl7QVNOMV9VTkksIEFTTjFfQlRTLCBTTk1QX0JJVFNUUn0sCisJe0FTTjFfQVBMLCBTTk1QX0M2NCwgU05NUF9DT1VOVEVSNjR9LAorCXtBU04xX0NUWCwgU0VSUl9OU08sIFNOTVBfTk9TVUNIT0JKRUNUfSwKKwl7QVNOMV9DVFgsIFNFUlJfTlNJLCBTTk1QX05PU1VDSElOU1RBTkNFfSwKKwl7QVNOMV9DVFgsIFNFUlJfRU9NLCBTTk1QX0VORE9GTUlCVklFV30sCisJezAsICAgICAgIDAsICAgICAgIC0xfQorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc25tcF90YWdfY2xzMnN5bnRheCh1bnNpZ25lZCBpbnQgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqc3ludGF4KQoreworCXN0cnVjdCBzbm1wX2NudiAqY252OworCQorCWNudiA9IHNubXBfY29udjsKKwkKKwl3aGlsZSAoY252LT5zeW50YXggIT0gLTEpIHsKKwkJaWYgKGNudi0+dGFnID09IHRhZyAmJiBjbnYtPmNsYXNzID09IGNscykgeworCQkJKnN5bnRheCA9IGNudi0+c3ludGF4OworCQkJcmV0dXJuIDE7CisJCX0KKwkJY252Kys7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBzbm1wX29iamVjdF9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNubXBfb2JqZWN0ICoqb2JqKQoreworCXVuc2lnbmVkIGludCBjbHMsIGNvbiwgdGFnLCBsZW4sIGlkbGVuOworCXVuc2lnbmVkIHNob3J0IHR5cGU7CisJdW5zaWduZWQgY2hhciAqZW9jLCAqZW5kLCAqcDsKKwl1bnNpZ25lZCBsb25nICpscCwgKmlkOworCXVuc2lnbmVkIGxvbmcgdWw7CisJbG9uZyAgbDsKKwkKKwkqb2JqID0gTlVMTDsKKwlpZCA9IE5VTEw7CisJCisJaWYgKCFhc24xX2hlYWRlcl9kZWNvZGUoY3R4LCAmZW9jLCAmY2xzLCAmY29uLCAmdGFnKSkKKwkJcmV0dXJuIDA7CisJCQorCWlmIChjbHMgIT0gQVNOMV9VTkkgfHwgY29uICE9IEFTTjFfQ09OIHx8IHRhZyAhPSBBU04xX1NFUSkKKwkJcmV0dXJuIDA7CisJCisJaWYgKCFhc24xX2hlYWRlcl9kZWNvZGUoY3R4LCAmZW5kLCAmY2xzLCAmY29uLCAmdGFnKSkKKwkJcmV0dXJuIDA7CisJCisJaWYgKGNscyAhPSBBU04xX1VOSSB8fCBjb24gIT0gQVNOMV9QUkkgfHwgdGFnICE9IEFTTjFfT0pJKQorCQlyZXR1cm4gMDsKKwkKKwlpZiAoIWFzbjFfb2lkX2RlY29kZShjdHgsIGVuZCwgJmlkLCAmaWRsZW4pKQorCQlyZXR1cm4gMDsKKwkJCisJaWYgKCFhc24xX2hlYWRlcl9kZWNvZGUoY3R4LCAmZW5kLCAmY2xzLCAmY29uLCAmdGFnKSkgeworCQlrZnJlZShpZCk7CisJCXJldHVybiAwOworCX0KKwkKKwlpZiAoY29uICE9IEFTTjFfUFJJKSB7CisJCWtmcmVlKGlkKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCWlmICghc25tcF90YWdfY2xzMnN5bnRheCh0YWcsIGNscywgJnR5cGUpKSB7CisJCWtmcmVlKGlkKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCXN3aXRjaCAodHlwZSkgeworCQljYXNlIFNOTVBfSU5URUdFUjoKKwkJCWxlbiA9IHNpemVvZihsb25nKTsKKwkJCWlmICghYXNuMV9sb25nX2RlY29kZShjdHgsIGVuZCwgJmwpKSB7CisJCQkJa2ZyZWUoaWQpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJKm9iaiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbm1wX29iamVjdCkgKyBsZW4sCisJCQkgICAgICAgICAgICAgICBHRlBfQVRPTUlDKTsKKwkJCWlmICgqb2JqID09IE5VTEwpIHsKKwkJCQlrZnJlZShpZCk7CisJCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQkJcHJpbnRrKCJPT00gaW4gYnNhbGcgKCVkKVxuIiwgX19MSU5FX18pOworCQkJCXJldHVybiAwOworCQkJfQorCQkJKCpvYmopLT5zeW50YXgubFswXSA9IGw7CisJCQlicmVhazsKKwkJY2FzZSBTTk1QX09DVEVUU1RSOgorCQljYXNlIFNOTVBfT1BBUVVFOgorCQkJaWYgKCFhc24xX29jdGV0c19kZWNvZGUoY3R4LCBlbmQsICZwLCAmbGVuKSkgeworCQkJCWtmcmVlKGlkKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCSpvYmogPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc25tcF9vYmplY3QpICsgbGVuLAorCQkJICAgICAgICAgICAgICAgR0ZQX0FUT01JQyk7CisJCQlpZiAoKm9iaiA9PSBOVUxMKSB7CisJCQkJa2ZyZWUoaWQpOworCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJCXByaW50aygiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCW1lbWNweSgoKm9iaiktPnN5bnRheC5jLCBwLCBsZW4pOworCQkJa2ZyZWUocCk7CisJCQlicmVhazsKKwkJY2FzZSBTTk1QX05VTEw6CisJCWNhc2UgU05NUF9OT1NVQ0hPQkpFQ1Q6CisJCWNhc2UgU05NUF9OT1NVQ0hJTlNUQU5DRToKKwkJY2FzZSBTTk1QX0VORE9GTUlCVklFVzoKKwkJCWxlbiA9IDA7CisJCQkqb2JqID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNubXBfb2JqZWN0KSwgR0ZQX0FUT01JQyk7CisJCQlpZiAoKm9iaiA9PSBOVUxMKSB7CisJCQkJa2ZyZWUoaWQpOworCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJCXByaW50aygiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmICghYXNuMV9udWxsX2RlY29kZShjdHgsIGVuZCkpIHsKKwkJCQlrZnJlZShpZCk7CisJCQkJa2ZyZWUoKm9iaik7CisJCQkJKm9iaiA9IE5VTEw7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTTk1QX09CSkVDVElEOgorCQkJaWYgKCFhc24xX29pZF9kZWNvZGUoY3R4LCBlbmQsICh1bnNpZ25lZCBsb25nICoqKSZscCwgJmxlbikpIHsKKwkJCQlrZnJlZShpZCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlsZW4gKj0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCQkJKm9iaiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbm1wX29iamVjdCkgKyBsZW4sIEdGUF9BVE9NSUMpOworCQkJaWYgKCpvYmogPT0gTlVMTCkgeworCQkJCWtmcmVlKGlkKTsKKwkJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCQlwcmludGsoIk9PTSBpbiBic2FsZyAoJWQpXG4iLCBfX0xJTkVfXyk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQltZW1jcHkoKCpvYmopLT5zeW50YXgudWwsIGxwLCBsZW4pOworCQkJa2ZyZWUobHApOworCQkJYnJlYWs7CisJCWNhc2UgU05NUF9JUEFERFI6CisJCQlpZiAoIWFzbjFfb2N0ZXRzX2RlY29kZShjdHgsIGVuZCwgJnAsICZsZW4pKSB7CisJCQkJa2ZyZWUoaWQpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKGxlbiAhPSA0KSB7CisJCQkJa2ZyZWUocCk7CisJCQkJa2ZyZWUoaWQpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJKm9iaiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbm1wX29iamVjdCkgKyBsZW4sIEdGUF9BVE9NSUMpOworCQkJaWYgKCpvYmogPT0gTlVMTCkgeworCQkJCWtmcmVlKHApOworCQkJCWtmcmVlKGlkKTsKKwkJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCQlwcmludGsoIk9PTSBpbiBic2FsZyAoJWQpXG4iLCBfX0xJTkVfXyk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQltZW1jcHkoKCpvYmopLT5zeW50YXgudWMsIHAsIGxlbik7CisJCQlrZnJlZShwKTsKKwkJCWJyZWFrOworCQljYXNlIFNOTVBfQ09VTlRFUjoKKwkJY2FzZSBTTk1QX0dBVUdFOgorCQljYXNlIFNOTVBfVElNRVRJQ0tTOgorCQkJbGVuID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCQkJaWYgKCFhc24xX3Vsb25nX2RlY29kZShjdHgsIGVuZCwgJnVsKSkgeworCQkJCWtmcmVlKGlkKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCSpvYmogPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc25tcF9vYmplY3QpICsgbGVuLCBHRlBfQVRPTUlDKTsKKwkJCWlmICgqb2JqID09IE5VTEwpIHsKKwkJCQlrZnJlZShpZCk7CisJCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQkJcHJpbnRrKCJPT00gaW4gYnNhbGcgKCVkKVxuIiwgX19MSU5FX18pOworCQkJCXJldHVybiAwOworCQkJfQorCQkJKCpvYmopLT5zeW50YXgudWxbMF0gPSB1bDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJa2ZyZWUoaWQpOworCQkJcmV0dXJuIDA7CisJfQorCQorCSgqb2JqKS0+c3ludGF4X2xlbiA9IGxlbjsKKwkoKm9iaiktPnR5cGUgPSB0eXBlOworCSgqb2JqKS0+aWQgPSBpZDsKKwkoKm9iaiktPmlkX2xlbiA9IGlkbGVuOworCQorCWlmICghYXNuMV9lb2NfZGVjb2RlKGN0eCwgZW9jKSkgeworCQlrZnJlZShpZCk7CisJCWtmcmVlKCpvYmopOworCQkqb2JqID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBzbm1wX3JlcXVlc3RfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc25tcF9yZXF1ZXN0ICpyZXF1ZXN0KQoreworCXVuc2lnbmVkIGludCBjbHMsIGNvbiwgdGFnOworCXVuc2lnbmVkIGNoYXIgKmVuZDsKKwkKKwlpZiAoIWFzbjFfaGVhZGVyX2RlY29kZShjdHgsICZlbmQsICZjbHMsICZjb24sICZ0YWcpKQorCQlyZXR1cm4gMDsKKwkJCisJaWYgKGNscyAhPSBBU04xX1VOSSB8fCBjb24gIT0gQVNOMV9QUkkgfHwgdGFnICE9IEFTTjFfSU5UKQorCQlyZXR1cm4gMDsKKwkJCisJaWYgKCFhc24xX3Vsb25nX2RlY29kZShjdHgsIGVuZCwgJnJlcXVlc3QtPmlkKSkKKwkJcmV0dXJuIDA7CisJCQorCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlKGN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykpCisJCXJldHVybiAwOworCQkKKwlpZiAoY2xzICE9IEFTTjFfVU5JIHx8IGNvbiAhPSBBU04xX1BSSSB8fCB0YWcgIT0gQVNOMV9JTlQpCisJCXJldHVybiAwOworCQkKKwlpZiAoIWFzbjFfdWludF9kZWNvZGUoY3R4LCBlbmQsICZyZXF1ZXN0LT5lcnJvcl9zdGF0dXMpKQorCQlyZXR1cm4gMDsKKwkJCisJaWYgKCFhc24xX2hlYWRlcl9kZWNvZGUoY3R4LCAmZW5kLCAmY2xzLCAmY29uLCAmdGFnKSkKKwkJcmV0dXJuIDA7CisJCQorCWlmIChjbHMgIT0gQVNOMV9VTkkgfHwgY29uICE9IEFTTjFfUFJJIHx8IHRhZyAhPSBBU04xX0lOVCkKKwkJcmV0dXJuIDA7CisJCQorCWlmICghYXNuMV91aW50X2RlY29kZShjdHgsIGVuZCwgJnJlcXVlc3QtPmVycm9yX2luZGV4KSkKKwkJcmV0dXJuIDA7CisJCisJcmV0dXJuIDE7Cit9CisKKy8qIAorICogRmFzdCBjaGVja3N1bSB1cGRhdGUgZm9yIHBvc3NpYmx5IG9kZGx5LWFsaWduZWQgVURQIGJ5dGUsIGZyb20gdGhlCisgKiBjb2RlIGV4YW1wbGUgaW4gdGhlIGRyYWZ0LgorICovCitzdGF0aWMgdm9pZCBmYXN0X2NzdW0odW5zaWduZWQgY2hhciAqY3N1bSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpvcHRyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgaW50IG9kZCkKK3sKKwlsb25nIHgsIG9sZCwgbmV3OworCQorCXggPSBjc3VtWzBdICogMjU2ICsgY3N1bVsxXTsKKwkKKwl4ID1+IHggJiAweEZGRkY7CisJCisJaWYgKG9kZCkgb2xkID0gb3B0clswXSAqIDI1NjsKKwllbHNlIG9sZCA9IG9wdHJbMF07CisJCisJeCAtPSBvbGQgJiAweEZGRkY7CisJaWYgKHggPD0gMCkgeworCQl4LS07CisJCXggJj0gMHhGRkZGOworCX0KKwkKKwlpZiAob2RkKSBuZXcgPSBucHRyWzBdICogMjU2OworCWVsc2UgbmV3ID0gbnB0clswXTsKKwkKKwl4ICs9IG5ldyAmIDB4RkZGRjsKKwlpZiAoeCAmIDB4MTAwMDApIHsKKwkJeCsrOworCQl4ICY9IDB4RkZGRjsKKwl9CisJCisJeCA9fiB4ICYgMHhGRkZGOworCWNzdW1bMF0gPSB4IC8gMjU2OworCWNzdW1bMV0gPSB4ICYgMHhGRjsKK30KKworLyogCisgKiBNYW5nbGUgSVAgYWRkcmVzcy4KKyAqIAktIGJlZ2luIHBvaW50cyB0byB0aGUgc3RhcnQgb2YgdGhlIHNubXAgbWVzc2dhZQorICogICAgICAtIGFkZHIgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUgYWRkcmVzcworICovCitzdGF0aWMgaW5saW5lIHZvaWQgbWFuZ2xlX2FkZHJlc3ModW5zaWduZWQgY2hhciAqYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb2N0MV9tYXAgKm1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2ludDE2X3QgKmNoZWNrKQoreworCWlmIChtYXAtPmZyb20gPT0gTk9DVDEoKmFkZHIpKSB7CisJCXVfaW50MzJfdCBvbGQ7CisJCQorCQlpZiAoZGVidWcpCisJCQltZW1jcHkoJm9sZCwgKHVuc2lnbmVkIGNoYXIgKilhZGRyLCBzaXplb2Yob2xkKSk7CisJCQkKKwkJKmFkZHIgPSBtYXAtPnRvOworCQkKKwkJLyogVXBkYXRlIFVEUCBjaGVja3N1bSBpZiBiZWluZyB1c2VkICovCisJCWlmICgqY2hlY2spIHsKKwkJCXVuc2lnbmVkIGNoYXIgb2RkID0gISgoYWRkciAtIGJlZ2luKSAlIDIpOworCQkJCisJCQlmYXN0X2NzdW0oKHVuc2lnbmVkIGNoYXIgKiljaGVjaywKKwkJCSAgICAgICAgICAmbWFwLT5mcm9tLCAmbWFwLT50bywgb2RkKTsKKwkJCSAgICAgICAgICAKKwkJfQorCQkKKwkJaWYgKGRlYnVnKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImJzYWxnOiBtYXBwZWQgJXUuJXUuJXUuJXUgdG8gIgorCQkJICAgICAgICIldS4ldS4ldS4ldVxuIiwgTklQUVVBRChvbGQpLCBOSVBRVUFEKCphZGRyKSk7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBzbm1wX3RyYXBfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc25tcF92MV90cmFwICp0cmFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb2N0MV9tYXAgKm1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9pbnQxNl90ICpjaGVjaykKK3sKKwl1bnNpZ25lZCBpbnQgY2xzLCBjb24sIHRhZywgbGVuOworCXVuc2lnbmVkIGNoYXIgKmVuZDsKKworCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlKGN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykpCisJCXJldHVybiAwOworCQkKKwlpZiAoY2xzICE9IEFTTjFfVU5JIHx8IGNvbiAhPSBBU04xX1BSSSB8fCB0YWcgIT0gQVNOMV9PSkkpCisJCXJldHVybiAwOworCQorCWlmICghYXNuMV9vaWRfZGVjb2RlKGN0eCwgZW5kLCAmdHJhcC0+aWQsICZ0cmFwLT5pZF9sZW4pKQorCQlyZXR1cm4gMDsKKwkJCisJaWYgKCFhc24xX2hlYWRlcl9kZWNvZGUoY3R4LCAmZW5kLCAmY2xzLCAmY29uLCAmdGFnKSkKKwkJZ290byBlcnJfaWRfZnJlZTsKKworCWlmICghKChjbHMgPT0gQVNOMV9BUEwgJiYgY29uID09IEFTTjFfUFJJICYmIHRhZyA9PSBTTk1QX0lQQSkgfHwKKwkgICAgICAoY2xzID09IEFTTjFfVU5JICYmIGNvbiA9PSBBU04xX1BSSSAmJiB0YWcgPT0gQVNOMV9PVFMpKSkKKwkJZ290byBlcnJfaWRfZnJlZTsKKwkKKwlpZiAoIWFzbjFfb2N0ZXRzX2RlY29kZShjdHgsIGVuZCwgKHVuc2lnbmVkIGNoYXIgKiopJnRyYXAtPmlwX2FkZHJlc3MsICZsZW4pKQorCQlnb3RvIGVycl9pZF9mcmVlOworCQorCS8qIElQdjQgb25seSAqLworCWlmIChsZW4gIT0gNCkKKwkJZ290byBlcnJfYWRkcl9mcmVlOworCQorCW1hbmdsZV9hZGRyZXNzKGN0eC0+YmVnaW4sIGN0eC0+cG9pbnRlciAtIDQsIG1hcCwgY2hlY2spOworCQorCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlKGN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykpCisJCWdvdG8gZXJyX2FkZHJfZnJlZTsKKwkJCisJaWYgKGNscyAhPSBBU04xX1VOSSB8fCBjb24gIT0gQVNOMV9QUkkgfHwgdGFnICE9IEFTTjFfSU5UKQorCQlnb3RvIGVycl9hZGRyX2ZyZWU7CisJCQorCWlmICghYXNuMV91aW50X2RlY29kZShjdHgsIGVuZCwgJnRyYXAtPmdlbmVyYWwpKQorCQlnb3RvIGVycl9hZGRyX2ZyZWU7CisJCQorCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlKGN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykpCisJCWdvdG8gZXJyX2FkZHJfZnJlZTsKKwkKKwlpZiAoY2xzICE9IEFTTjFfVU5JIHx8IGNvbiAhPSBBU04xX1BSSSB8fCB0YWcgIT0gQVNOMV9JTlQpCisJCWdvdG8gZXJyX2FkZHJfZnJlZTsKKwkJCisJaWYgKCFhc24xX3VpbnRfZGVjb2RlKGN0eCwgZW5kLCAmdHJhcC0+c3BlY2lmaWMpKQorCQlnb3RvIGVycl9hZGRyX2ZyZWU7CisJCQorCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlKGN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykpCisJCWdvdG8gZXJyX2FkZHJfZnJlZTsKKwkJCisJaWYgKCEoKGNscyA9PSBBU04xX0FQTCAmJiBjb24gPT0gQVNOMV9QUkkgJiYgdGFnID09IFNOTVBfVElUKSB8fAorCSAgICAgIChjbHMgPT0gQVNOMV9VTkkgJiYgY29uID09IEFTTjFfUFJJICYmIHRhZyA9PSBBU04xX0lOVCkpKQorCQlnb3RvIGVycl9hZGRyX2ZyZWU7CisJCQorCWlmICghYXNuMV91bG9uZ19kZWNvZGUoY3R4LCBlbmQsICZ0cmFwLT50aW1lKSkKKwkJZ290byBlcnJfYWRkcl9mcmVlOworCQkKKwlyZXR1cm4gMTsKKworZXJyX2lkX2ZyZWU6CisJa2ZyZWUodHJhcC0+aWQpOworCitlcnJfYWRkcl9mcmVlOgorCWtmcmVlKCh1bnNpZ25lZCBsb25nICopdHJhcC0+aXBfYWRkcmVzcyk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1pc2MuIHJvdXRpbmVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBoZXhfZHVtcCh1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc2l6ZV90IGk7CisJCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmIChpICYmICEoaSAlIDE2KSkKKwkJCXByaW50aygiXG4iKTsKKwkJcHJpbnRrKCIlMDJ4ICIsICooYnVmICsgaSkpOworCX0KKwlwcmludGsoIlxuIik7Cit9CisKKy8qCisgKiBQYXJzZSBhbmQgbWFuZ2xlIFNOTVAgbWVzc2FnZSBhY2NvcmRpbmcgdG8gbWFwcGluZy4KKyAqIChBbmQgdGhpcyBpcyB0aGUgZnVja2luZyAnYmFzaWMnIG1ldGhvZCkuCisgKi8KK3N0YXRpYyBpbnQgc25tcF9wYXJzZV9tYW5nbGUodW5zaWduZWQgY2hhciAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2ludDE2X3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb2N0MV9tYXAgKm1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9pbnQxNl90ICpjaGVjaykKK3sKKwl1bnNpZ25lZCBjaGFyICplb2MsICplbmQ7CisJdW5zaWduZWQgaW50IGNscywgY29uLCB0YWcsIHZlcnMsIHBkdXR5cGU7CisJc3RydWN0IGFzbjFfY3R4IGN0eDsKKwlzdHJ1Y3QgYXNuMV9vY3RzdHIgY29tbTsKKwlzdHJ1Y3Qgc25tcF9vYmplY3QgKipvYmo7CisJCisJaWYgKGRlYnVnID4gMSkKKwkJaGV4X2R1bXAobXNnLCBsZW4pOworCisJYXNuMV9vcGVuKCZjdHgsIG1zZywgbGVuKTsKKwkKKwkvKiAKKwkgKiBTdGFydCBvZiBTTk1QIG1lc3NhZ2UuCisJICovCisJaWYgKCFhc24xX2hlYWRlcl9kZWNvZGUoJmN0eCwgJmVvYywgJmNscywgJmNvbiwgJnRhZykpCisJCXJldHVybiAwOworCWlmIChjbHMgIT0gQVNOMV9VTkkgfHwgY29uICE9IEFTTjFfQ09OIHx8IHRhZyAhPSBBU04xX1NFUSkKKwkJcmV0dXJuIDA7CisJCisJLyogCisJICogVmVyc2lvbiAxIG9yIDIgaGFuZGxlZC4KKwkgKi8KKwlpZiAoIWFzbjFfaGVhZGVyX2RlY29kZSgmY3R4LCAmZW5kLCAmY2xzLCAmY29uLCAmdGFnKSkKKwkJcmV0dXJuIDA7CisJaWYgKGNscyAhPSBBU04xX1VOSSB8fCBjb24gIT0gQVNOMV9QUkkgfHwgdGFnICE9IEFTTjFfSU5UKQorCQlyZXR1cm4gMDsKKwlpZiAoIWFzbjFfdWludF9kZWNvZGUgKCZjdHgsIGVuZCwgJnZlcnMpKQorCQlyZXR1cm4gMDsKKwlpZiAoZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiYnNhbGc6IHNubXAgdmVyc2lvbjogJXVcbiIsIHZlcnMgKyAxKTsKKwlpZiAodmVycyA+IDEpCisJCXJldHVybiAxOworCQorCS8qCisJICogQ29tbXVuaXR5LgorCSAqLworCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlICgmY3R4LCAmZW5kLCAmY2xzLCAmY29uLCAmdGFnKSkKKwkJcmV0dXJuIDA7CisJaWYgKGNscyAhPSBBU04xX1VOSSB8fCBjb24gIT0gQVNOMV9QUkkgfHwgdGFnICE9IEFTTjFfT1RTKQorCQlyZXR1cm4gMDsKKwlpZiAoIWFzbjFfb2N0ZXRzX2RlY29kZSgmY3R4LCBlbmQsICZjb21tLmRhdGEsICZjb21tLmxlbikpCisJCXJldHVybiAwOworCWlmIChkZWJ1ZyA+IDEpIHsKKwkJdW5zaWduZWQgaW50IGk7CisJCQorCQlwcmludGsoS0VSTl9ERUJVRyAiYnNhbGc6IGNvbW11bml0eTogIik7CisJCWZvciAoaSA9IDA7IGkgPCBjb21tLmxlbjsgaSsrKQorCQkJcHJpbnRrKCIlYyIsIGNvbW0uZGF0YVtpXSk7CisJCXByaW50aygiXG4iKTsKKwl9CisJa2ZyZWUoY29tbS5kYXRhKTsKKwkKKwkvKgorCSAqIFBEVSB0eXBlCisJICovCisJaWYgKCFhc24xX2hlYWRlcl9kZWNvZGUoJmN0eCwgJmVvYywgJmNscywgJmNvbiwgJnBkdXR5cGUpKQorCQlyZXR1cm4gMDsKKwlpZiAoY2xzICE9IEFTTjFfQ1RYIHx8IGNvbiAhPSBBU04xX0NPTikKKwkJcmV0dXJuIDA7CisJaWYgKGRlYnVnID4gMSkgeworCQl1bnNpZ25lZCBjaGFyICpwZHVzW10gPSB7CisJCQlbU05NUF9QRFVfR0VUXSA9ICJnZXQiLAorCQkJW1NOTVBfUERVX05FWFRdID0gImdldC1uZXh0IiwKKwkJCVtTTk1QX1BEVV9SRVNQT05TRV0gPSAicmVzcG9uc2UiLAorCQkJW1NOTVBfUERVX1NFVF0gPSAic2V0IiwKKwkJCVtTTk1QX1BEVV9UUkFQMV0gPSAidHJhcHYxIiwKKwkJCVtTTk1QX1BEVV9CVUxLXSA9ICJidWxrIiwKKwkJCVtTTk1QX1BEVV9JTkZPUk1dID0gImluZm9ybSIsCisJCQlbU05NUF9QRFVfVFJBUDJdID0gInRyYXB2MiIKKwkJfTsKKwkJCisJCWlmIChwZHV0eXBlID4gU05NUF9QRFVfVFJBUDIpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiYnNhbGc6IGJhZCBwZHUgdHlwZSAldVxuIiwgcGR1dHlwZSk7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0RFQlVHICJic2FsZzogcGR1OiAlc1xuIiwgcGR1c1twZHV0eXBlXSk7CisJfQorCWlmIChwZHV0eXBlICE9IFNOTVBfUERVX1JFU1BPTlNFICYmCisJICAgIHBkdXR5cGUgIT0gU05NUF9QRFVfVFJBUDEgJiYgcGR1dHlwZSAhPSBTTk1QX1BEVV9UUkFQMikKKwkJcmV0dXJuIDE7CisJCisJLyoKKwkgKiBSZXF1ZXN0IGhlYWRlciBvciB2MSB0cmFwCisJICovCisJaWYgKHBkdXR5cGUgPT0gU05NUF9QRFVfVFJBUDEpIHsKKwkJc3RydWN0IHNubXBfdjFfdHJhcCB0cmFwOworCQl1bnNpZ25lZCBjaGFyIHJldCA9IHNubXBfdHJhcF9kZWNvZGUoJmN0eCwgJnRyYXAsIG1hcCwgY2hlY2spOworCQkKKwkJLyogRGlzY2FyZCB0cmFwIGFsbG9jYXRpb25zIHJlZ2FyZGxlc3MgKi8KKwkJa2ZyZWUodHJhcC5pZCk7CisJCWtmcmVlKCh1bnNpZ25lZCBsb25nICopdHJhcC5pcF9hZGRyZXNzKTsKKwkJCisJCWlmICghcmV0KQorCQkJcmV0dXJuIHJldDsKKwkJCisJfSBlbHNlIHsKKwkJc3RydWN0IHNubXBfcmVxdWVzdCByZXE7CisJCQorCQlpZiAoIXNubXBfcmVxdWVzdF9kZWNvZGUoJmN0eCwgJnJlcSkpCisJCQlyZXR1cm4gMDsKKwkJCQorCQlpZiAoZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImJzYWxnOiByZXF1ZXN0OiBpZD0weCVseCBlcnJvcl9zdGF0dXM9JXUgIgorCQkJImVycm9yX2luZGV4PSV1XG4iLCByZXEuaWQsIHJlcS5lcnJvcl9zdGF0dXMsCisJCQlyZXEuZXJyb3JfaW5kZXgpOworCX0KKwkKKwkvKgorCSAqIExvb3AgdGhyb3VnaCBvYmplY3RzLCBsb29rIGZvciBJUCBhZGRyZXNzZXMgdG8gbWFuZ2xlLgorCSAqLworCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlKCZjdHgsICZlb2MsICZjbHMsICZjb24sICZ0YWcpKQorCQlyZXR1cm4gMDsKKwkJCisJaWYgKGNscyAhPSBBU04xX1VOSSB8fCBjb24gIT0gQVNOMV9DT04gfHwgdGFnICE9IEFTTjFfU0VRKQorCQlyZXR1cm4gMDsKKwkKKwlvYmogPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc25tcF9vYmplY3QpLCBHRlBfQVRPTUlDKTsKKwlpZiAob2JqID09IE5VTEwpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk9PTSBpbiBic2FsZyglZClcbiIsIF9fTElORV9fKTsKKwkJcmV0dXJuIDA7CQorCX0KKworCXdoaWxlICghYXNuMV9lb2NfZGVjb2RlKCZjdHgsIGVvYykpIHsKKwkJdW5zaWduZWQgaW50IGk7CisJCQorCQlpZiAoIXNubXBfb2JqZWN0X2RlY29kZSgmY3R4LCBvYmopKSB7CisJCQlpZiAoKm9iaikgeworCQkJCWlmICgoKm9iaiktPmlkKQorCQkJCQlrZnJlZSgoKm9iaiktPmlkKTsKKwkJCQlrZnJlZSgqb2JqKTsKKwkJCX0JCisJCQlrZnJlZShvYmopOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoZGVidWcgPiAxKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiYnNhbGc6IG9iamVjdDogIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgKCpvYmopLT5pZF9sZW47IGkrKykgeworCQkJCWlmIChpID4gMCkKKwkJCQkJcHJpbnRrKCIuIik7CisJCQkJcHJpbnRrKCIlbHUiLCAoKm9iaiktPmlkW2ldKTsKKwkJCX0KKwkJCXByaW50aygiOiB0eXBlPSV1XG4iLCAoKm9iaiktPnR5cGUpOworCQkJCisJCX0KKworCQlpZiAoKCpvYmopLT50eXBlID09IFNOTVBfSVBBRERSKQorCQkJbWFuZ2xlX2FkZHJlc3MoY3R4LmJlZ2luLCBjdHgucG9pbnRlciAtIDQgLCBtYXAsIGNoZWNrKTsKKwkJCisJCWtmcmVlKCgqb2JqKS0+aWQpOworCQlrZnJlZSgqb2JqKTsKKwl9CisJa2ZyZWUob2JqKTsKKwkKKwlpZiAoIWFzbjFfZW9jX2RlY29kZSgmY3R4LCBlb2MpKQorCQlyZXR1cm4gMDsKKwkJCisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5BVCByb3V0aW5lcy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIAorICogU05NUCB0cmFuc2xhdGlvbiByb3V0aW5lLgorICovCitzdGF0aWMgaW50IHNubXBfdHJhbnNsYXRlKHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKipwc2tiKQoreworCXN0cnVjdCBpcGhkciAqaXBoID0gKCpwc2tiKS0+bmguaXBoOworCXN0cnVjdCB1ZHBoZHIgKnVkcGggPSAoc3RydWN0IHVkcGhkciAqKSgodV9pbnQzMl90ICopaXBoICsgaXBoLT5paGwpOworCXVfaW50MTZfdCB1ZHBsZW4gPSBudG9ocyh1ZHBoLT5sZW4pOworCXVfaW50MTZfdCBwYXlsZW4gPSB1ZHBsZW4gLSBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisJaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKwlzdHJ1Y3Qgb2N0MV9tYXAgbWFwOworCisJLyoKKwkgKiBEZXRlcm1pbmUgbWFwcHBpbmcgZm9yIGFwcGxpY2F0aW9uIGxheWVyIGFkZHJlc3NlcyBiYXNlZAorCSAqIG9uIE5BVCBtYW5pcHVsYXRpb25zIGZvciB0aGUgcGFja2V0LgorCSAqLworCWlmIChkaXIgPT0gSVBfQ1RfRElSX09SSUdJTkFMKSB7CisJCS8qIFNOQVQgdHJhcHMgKi8KKwkJbWFwLmZyb20gPSBOT0NUMShjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmlwKTsKKwkJbWFwLnRvID0gTk9DVDEoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC5pcCk7CisJfSBlbHNlIHsKKwkJLyogRE5BVCByZXBsaWVzICovCisJCW1hcC5mcm9tID0gTk9DVDEoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLnNyYy5pcCk7CisJCW1hcC50byA9IE5PQ1QxKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QuaXApOworCX0KKwkKKwlpZiAobWFwLmZyb20gPT0gbWFwLnRvKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCQorCWlmICghc25tcF9wYXJzZV9tYW5nbGUoKHVuc2lnbmVkIGNoYXIgKil1ZHBoICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLAorCSAgICAgICAgICAgICAgICAgICAgICAgcGF5bGVuLCAmbWFwLCAmdWRwaC0+Y2hlY2spKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJic2FsZzogcGFyc2VyIGZhaWxlZFxuIik7CisJCXJldHVybiBORl9EUk9QOworCX0KKwlyZXR1cm4gTkZfQUNDRVBUOworfQorCisvKiBXZSBkb24ndCBhY3R1YWxseSBzZXQgdXAgZXhwZWN0YXRpb25zLCBqdXN0IGFkanVzdCBpbnRlcm5hbCBJUAorICogYWRkcmVzc2VzIGlmIHRoaXMgaXMgYmVpbmcgTkFUdGVkICovCitzdGF0aWMgaW50IGhlbHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKKwkJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCit7CisJaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKwl1bnNpZ25lZCBpbnQgcmV0OworCXN0cnVjdCBpcGhkciAqaXBoID0gKCpwc2tiKS0+bmguaXBoOworCXN0cnVjdCB1ZHBoZHIgKnVkcGggPSAoc3RydWN0IHVkcGhkciAqKSgodV9pbnQzMl90ICopaXBoICsgaXBoLT5paGwpOworCisJLyogU05NUCByZXBsaWVzIGFuZCBvcmlnaW5hdGluZyBTTk1QIHRyYXBzIGdldCBtYW5nbGVkICovCisJaWYgKHVkcGgtPnNvdXJjZSA9PSBudG9ocyhTTk1QX1BPUlQpICYmIGRpciAhPSBJUF9DVF9ESVJfUkVQTFkpCisJCXJldHVybiBORl9BQ0NFUFQ7CisJaWYgKHVkcGgtPmRlc3QgPT0gbnRvaHMoU05NUF9UUkFQX1BPUlQpICYmIGRpciAhPSBJUF9DVF9ESVJfT1JJR0lOQUwpCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwkvKiBObyBOQVQ/ICovCisJaWYgKCEoY3QtPnN0YXR1cyAmIElQU19OQVRfTUFTSykpCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwkvKiAKKwkgKiBNYWtlIHN1cmUgdGhlIHBhY2tldCBsZW5ndGggaXMgb2suICBTbyBmYXIsIHdlIHdlcmUgb25seSBndWFyYW50ZWVkCisJICogdG8gaGF2ZSBhIHZhbGlkIGxlbmd0aCBJUCBoZWFkZXIgcGx1cyA4IGJ5dGVzLCB3aGljaCBtZWFucyB3ZSBoYXZlCisJICogZW5vdWdoIHJvb20gZm9yIGEgVURQIGhlYWRlci4gIEp1c3QgdmVyaWZ5IHRoZSBVRFAgbGVuZ3RoIGZpZWxkIHNvIHdlCisJICogY2FuIG1lc3MgYXJvdW5kIHdpdGggdGhlIHBheWxvYWQuCisJICovCisJaWYgKG50b2hzKHVkcGgtPmxlbikgIT0gKCpwc2tiKS0+bGVuIC0gKGlwaC0+aWhsIDw8IDIpKSB7CisJCSBpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJIHByaW50ayhLRVJOX1dBUk5JTkcgIlNOTVA6IGRyb3BwaW5nIG1hbGZvcm1lZCBwYWNrZXQgIgorCQkJCSJzcmM9JXUuJXUuJXUuJXUgZHN0PSV1LiV1LiV1LiV1XG4iLAorCQkJCU5JUFFVQUQoaXBoLT5zYWRkciksIE5JUFFVQUQoaXBoLT5kYWRkcikpOworCQkgcmV0dXJuIE5GX0RST1A7CisJfQorCisJaWYgKCFza2JfaXBfbWFrZV93cml0YWJsZShwc2tiLCAoKnBza2IpLT5sZW4pKQorCQlyZXR1cm4gTkZfRFJPUDsKKworCXNwaW5fbG9ja19iaCgmc25tcF9sb2NrKTsKKwlyZXQgPSBzbm1wX3RyYW5zbGF0ZShjdCwgY3RpbmZvLCBwc2tiKTsKKwlzcGluX3VubG9ja19iaCgmc25tcF9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgc25tcF9oZWxwZXIgPSB7CisJLm1heF9leHBlY3RlZCA9IDAsCisJLnRpbWVvdXQgPSAxODAsCisJLm1lID0gVEhJU19NT0RVTEUsCisJLmhlbHAgPSBoZWxwLAorCS5uYW1lID0gInNubXAiLAorCisJLnR1cGxlID0geyAuc3JjID0geyAudSA9IHsgX19jb25zdGFudF9odG9ucyhTTk1QX1BPUlQpIH0gfSwKKwkJICAgLmRzdCA9IHsgLnByb3RvbnVtID0gSVBQUk9UT19VRFAgfSwKKwl9LAorCS5tYXNrID0geyAuc3JjID0geyAudSA9IHsgMHhGRkZGIH0gfSwKKwkJIC5kc3QgPSB7IC5wcm90b251bSA9IDB4RkYgfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyIHNubXBfdHJhcF9oZWxwZXIgPSB7CisJLm1heF9leHBlY3RlZCA9IDAsCisJLnRpbWVvdXQgPSAxODAsCisJLm1lID0gVEhJU19NT0RVTEUsCisJLmhlbHAgPSBoZWxwLAorCS5uYW1lID0gInNubXBfdHJhcCIsCisKKwkudHVwbGUgPSB7IC5zcmMgPSB7IC51ID0geyBfX2NvbnN0YW50X2h0b25zKFNOTVBfVFJBUF9QT1JUKSB9IH0sCisJCSAgIC5kc3QgPSB7IC5wcm90b251bSA9IElQUFJPVE9fVURQIH0sCisJfSwKKwkubWFzayA9IHsgLnNyYyA9IHsgLnUgPSB7IDB4RkZGRiB9IH0sCisJCSAuZHN0ID0geyAucHJvdG9udW0gPSAweEZGIH0sCisJfSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBzdHVmZi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBpcF9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKCZzbm1wX2hlbHBlcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0ID0gaXBfY29ubnRyYWNrX2hlbHBlcl9yZWdpc3Rlcigmc25tcF90cmFwX2hlbHBlcik7CisJaWYgKHJldCA8IDApIHsKKwkJaXBfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZzbm1wX2hlbHBlcik7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaXBfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZzbm1wX2hlbHBlcik7CisJaXBfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZzbm1wX3RyYXBfaGVscGVyKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBib29sLCAwNjAwKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc3RhbmRhbG9uZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9zdGFuZGFsb25lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVjNGE3NAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc3RhbmRhbG9uZS5jCkBAIC0wLDAgKzEsMzQ5IEBACisvKiBUaGlzIGZpbGUgY29udGFpbnMgYWxsIHRoZSBmdW5jdGlvbnMgcmVxdWlyZWQgZm9yIHRoZSBzdGFuZGFsb25lCisgICBpcF9uYXQgbW9kdWxlLgorCisgICBUaGVzZSBhcmUgbm90IHJlcXVpcmVkIGJ5IHRoZSBjb21wYXRpYmlsaXR5IGxheWVyLgorKi8KKworLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAorICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIDIzIEFwciAyMDAxOiBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogCS0gbmV3IEFQSSBhbmQgaGFuZGxpbmcgb2YgY29ubnRyYWNrL25hdCBoZWxwZXJzCisgKiAJLSBub3cgY2FwYWJsZSBvZiBtdWx0aXBsZSBleHBlY3RhdGlvbnMgZm9yIG9uZSBtYXN0ZXIKKyAqICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ljbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNkZWZpbmUgQVNTRVJUX1JFQURfTE9DSyh4KSBNVVNUX0JFX1JFQURfTE9DS0VEKCZpcF9uYXRfbG9jaykKKyNkZWZpbmUgQVNTRVJUX1dSSVRFX0xPQ0soeCkgTVVTVF9CRV9XUklURV9MT0NLRUQoJmlwX25hdF9sb2NrKQorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9oZWxwZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2xpc3RoZWxwLmg+CisKKyNpZiAwCisjZGVmaW5lIERFQlVHUCBwcmludGsKKyNlbHNlCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2RlZmluZSBIT09LTkFNRShob29rbnVtKSAoKGhvb2tudW0pID09IE5GX0lQX1BPU1RfUk9VVElORyA/ICJQT1NUX1JPVVRJTkciICBcCisJCQkgICA6ICgoaG9va251bSkgPT0gTkZfSVBfUFJFX1JPVVRJTkcgPyAiUFJFX1JPVVRJTkciIFwKKwkJCSAgICAgIDogKChob29rbnVtKSA9PSBORl9JUF9MT0NBTF9PVVQgPyAiTE9DQUxfT1VUIiAgXAorCQkJICAgICAgICAgOiAoKGhvb2tudW0pID09IE5GX0lQX0xPQ0FMX0lOID8gIkxPQ0FMX0lOIiAgXAorCQkJCSAgICA6ICIqRVJST1IqIikpKQorCitzdGF0aWMgdW5zaWduZWQgaW50CitpcF9uYXRfZm4odW5zaWduZWQgaW50IGhvb2tudW0sCisJICBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCit7CisJc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7CisJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CisJc3RydWN0IGlwX25hdF9pbmZvICppbmZvOworCS8qIG1hbmlwdHlwZSA9PSBTUkMgZm9yIHBvc3Ryb3V0aW5nLiAqLworCWVudW0gaXBfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlID0gSE9PSzJNQU5JUChob29rbnVtKTsKKworCS8qIFdlIG5ldmVyIHNlZSBmcmFnbWVudHM6IGNvbm50cmFjayBkZWZyYWdzIG9uIHByZS1yb3V0aW5nCisJICAgYW5kIGxvY2FsLW91dCwgYW5kIGlwX25hdF9vdXQgcHJvdGVjdHMgcG9zdC1yb3V0aW5nLiAqLworCUlQX05GX0FTU0VSVCghKCgqcHNrYiktPm5oLmlwaC0+ZnJhZ19vZmYKKwkJICAgICAgICYgaHRvbnMoSVBfTUZ8SVBfT0ZGU0VUKSkpOworCisJKCpwc2tiKS0+bmZjYWNoZSB8PSBORkNfVU5LTk9XTjsKKworCS8qIElmIHdlIGhhZCBhIGhhcmR3YXJlIGNoZWNrc3VtIGJlZm9yZSwgaXQncyBub3cgaW52YWxpZCAqLworCWlmICgoKnBza2IpLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpCisJCWlmIChza2JfY2hlY2tzdW1faGVscCgqcHNrYiwgKG91dCA9PSBOVUxMKSkpCisJCQlyZXR1cm4gTkZfRFJPUDsKKworCWN0ID0gaXBfY29ubnRyYWNrX2dldCgqcHNrYiwgJmN0aW5mbyk7CisJLyogQ2FuJ3QgdHJhY2s/ICBJdCdzIG5vdCBkdWUgdG8gc3RyZXNzLCBvciBjb25udHJhY2sgd291bGQKKwkgICBoYXZlIGRyb3BwZWQgaXQuICBIZW5jZSBpdCdzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWx0eSB0bworCSAgIHBhY2tldCBmaWx0ZXIgaXQgb3V0LCBvciBpbXBsZW1lbnQgY29ubnRyYWNrL05BVCBmb3IgdGhhdAorCSAgIHByb3RvY29sLiA4KSAtLVJSICovCisJaWYgKCFjdCkgeworCQkvKiBFeGNlcHRpb246IElDTVAgcmVkaXJlY3QgdG8gbmV3IGNvbm5lY3Rpb24gKG5vdCBpbgorICAgICAgICAgICAgICAgICAgIGhhc2ggdGFibGUgeWV0KS4gIFdlIG11c3Qgbm90IGxldCB0aGlzIHRocm91Z2gsIGluCisgICAgICAgICAgICAgICAgICAgY2FzZSB3ZSdyZSBkb2luZyBOQVQgdG8gdGhlIHNhbWUgbmV0d29yay4gKi8KKwkJaWYgKCgqcHNrYiktPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QKSB7CisJCQlzdHJ1Y3QgaWNtcGhkciBfaGRyLCAqaHA7CisKKwkJCWhwID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLAorCQkJCQkJKCpwc2tiKS0+bmguaXBoLT5paGwqNCwKKwkJCQkJCXNpemVvZihfaGRyKSwgJl9oZHIpOworCQkJaWYgKGhwICE9IE5VTEwgJiYKKwkJCSAgICBocC0+dHlwZSA9PSBJQ01QX1JFRElSRUNUKQorCQkJCXJldHVybiBORl9EUk9QOworCQl9CisJCXJldHVybiBORl9BQ0NFUFQ7CisJfQorCisJc3dpdGNoIChjdGluZm8pIHsKKwljYXNlIElQX0NUX1JFTEFURUQ6CisJY2FzZSBJUF9DVF9SRUxBVEVEK0lQX0NUX0lTX1JFUExZOgorCQlpZiAoKCpwc2tiKS0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX0lDTVApIHsKKwkJCWlmICghaWNtcF9yZXBseV90cmFuc2xhdGlvbihwc2tiLCBjdCwgbWFuaXB0eXBlLAorCQkJCQkJICAgIENUSU5GTzJESVIoY3RpbmZvKSkpCisJCQkJcmV0dXJuIE5GX0RST1A7CisJCQllbHNlCisJCQkJcmV0dXJuIE5GX0FDQ0VQVDsKKwkJfQorCQkvKiBGYWxsIHRocnUuLi4gKE9ubHkgSUNNUHMgY2FuIGJlIElQX0NUX0lTX1JFUExZKSAqLworCWNhc2UgSVBfQ1RfTkVXOgorCQlpbmZvID0gJmN0LT5uYXQuaW5mbzsKKworCQkvKiBTZWVuIGl0IGJlZm9yZT8gIFRoaXMgY2FuIGhhcHBlbiBmb3IgbG9vcGJhY2ssIHJldHJhbnMsCisJCSAgIG9yIGxvY2FsIHBhY2tldHMuLiAqLworCQlpZiAoIWlwX25hdF9pbml0aWFsaXplZChjdCwgbWFuaXB0eXBlKSkgeworCQkJdW5zaWduZWQgaW50IHJldDsKKworCQkJLyogTE9DQUxfSU4gaG9vayBkb2Vzbid0IGhhdmUgYSBjaGFpbiEgICovCisJCQlpZiAoaG9va251bSA9PSBORl9JUF9MT0NBTF9JTikKKwkJCQlyZXQgPSBhbGxvY19udWxsX2JpbmRpbmcoY3QsIGluZm8sIGhvb2tudW0pOworCQkJZWxzZQorCQkJCXJldCA9IGlwX25hdF9ydWxlX2ZpbmQocHNrYiwgaG9va251bSwKKwkJCQkJCSAgICAgICBpbiwgb3V0LCBjdCwKKwkJCQkJCSAgICAgICBpbmZvKTsKKworCQkJaWYgKHJldCAhPSBORl9BQ0NFUFQpIHsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9IGVsc2UKKwkJCURFQlVHUCgiQWxyZWFkeSBzZXR1cCBtYW5pcCAlcyBmb3IgY3QgJXBcbiIsCisJCQkgICAgICAgbWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9TUkMgPyAiU1JDIiA6ICJEU1QiLAorCQkJICAgICAgIGN0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBFU1RBQkxJU0hFRCAqLworCQlJUF9ORl9BU1NFUlQoY3RpbmZvID09IElQX0NUX0VTVEFCTElTSEVECisJCQkgICAgIHx8IGN0aW5mbyA9PSAoSVBfQ1RfRVNUQUJMSVNIRUQrSVBfQ1RfSVNfUkVQTFkpKTsKKwkJaW5mbyA9ICZjdC0+bmF0LmluZm87CisJfQorCisJSVBfTkZfQVNTRVJUKGluZm8pOworCXJldHVybiBuYXRfcGFja2V0KGN0LCBjdGluZm8sIGhvb2tudW0sIHBza2IpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitpcF9uYXRfaW4odW5zaWduZWQgaW50IGhvb2tudW0sCisgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorICAgICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQoreworCXVfaW50MzJfdCBzYWRkciwgZGFkZHI7CisJdW5zaWduZWQgaW50IHJldDsKKworCXNhZGRyID0gKCpwc2tiKS0+bmguaXBoLT5zYWRkcjsKKwlkYWRkciA9ICgqcHNrYiktPm5oLmlwaC0+ZGFkZHI7CisKKwlyZXQgPSBpcF9uYXRfZm4oaG9va251bSwgcHNrYiwgaW4sIG91dCwgb2tmbik7CisJaWYgKHJldCAhPSBORl9EUk9QICYmIHJldCAhPSBORl9TVE9MRU4KKwkgICAgJiYgKCgqcHNrYiktPm5oLmlwaC0+c2FkZHIgIT0gc2FkZHIKKwkgICAgICAgIHx8ICgqcHNrYiktPm5oLmlwaC0+ZGFkZHIgIT0gZGFkZHIpKSB7CisJCWRzdF9yZWxlYXNlKCgqcHNrYiktPmRzdCk7CisJCSgqcHNrYiktPmRzdCA9IE5VTEw7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2lwX25hdF9vdXQodW5zaWduZWQgaW50IGhvb2tudW0sCisJICAgc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQoreworCS8qIHJvb3QgaXMgcGxheWluZyB3aXRoIHJhdyBzb2NrZXRzLiAqLworCWlmICgoKnBza2IpLT5sZW4gPCBzaXplb2Yoc3RydWN0IGlwaGRyKQorCSAgICB8fCAoKnBza2IpLT5uaC5pcGgtPmlobCAqIDQgPCBzaXplb2Yoc3RydWN0IGlwaGRyKSkKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKworCS8qIFdlIGNhbiBoaXQgZnJhZ21lbnQgaGVyZTsgZm9yd2FyZGVkIHBhY2tldHMgZ2V0CisJICAgZGVmcmFnbWVudGVkIGJ5IGNvbm5lY3Rpb24gdHJhY2tpbmcgY29taW5nIGluLCB0aGVuCisJICAgZnJhZ21lbnRlZCAoZ3JyKSBieSB0aGUgZm9yd2FyZCBjb2RlLgorCisJICAgSW4gZnV0dXJlOiBJZiB3ZSBoYXZlIG5mY3QgIT0gTlVMTCwgQU5EIHdlIGhhdmUgTkFUCisJICAgaW5pdGlhbGl6ZWQsIEFORCB0aGVyZSBpcyBubyBoZWxwZXIsIHRoZW4gd2UgY2FuIGRvIGZ1bGwKKwkgICBOQVBUIG9uIHRoZSBoZWFkLCBhbmQgSVAtYWRkcmVzcy1vbmx5IE5BVCBvbiB0aGUgcmVzdC4KKworCSAgIEknbSBzdGFydGluZyB0byBoYXZlIG5pZ2h0bWFyZXMgYWJvdXQgZnJhZ21lbnRzLiAgKi8KKworCWlmICgoKnBza2IpLT5uaC5pcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfTUZ8SVBfT0ZGU0VUKSkgeworCQkqcHNrYiA9IGlwX2N0X2dhdGhlcl9mcmFncygqcHNrYiwgSVBfREVGUkFHX05BVF9PVVQpOworCisJCWlmICghKnBza2IpCisJCQlyZXR1cm4gTkZfU1RPTEVOOworCX0KKworCXJldHVybiBpcF9uYXRfZm4oaG9va251bSwgcHNrYiwgaW4sIG91dCwgb2tmbik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2lwX25hdF9sb2NhbF9mbih1bnNpZ25lZCBpbnQgaG9va251bSwKKwkJc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCWludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQoreworCXVfaW50MzJfdCBzYWRkciwgZGFkZHI7CisJdW5zaWduZWQgaW50IHJldDsKKworCS8qIHJvb3QgaXMgcGxheWluZyB3aXRoIHJhdyBzb2NrZXRzLiAqLworCWlmICgoKnBza2IpLT5sZW4gPCBzaXplb2Yoc3RydWN0IGlwaGRyKQorCSAgICB8fCAoKnBza2IpLT5uaC5pcGgtPmlobCAqIDQgPCBzaXplb2Yoc3RydWN0IGlwaGRyKSkKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKworCXNhZGRyID0gKCpwc2tiKS0+bmguaXBoLT5zYWRkcjsKKwlkYWRkciA9ICgqcHNrYiktPm5oLmlwaC0+ZGFkZHI7CisKKwlyZXQgPSBpcF9uYXRfZm4oaG9va251bSwgcHNrYiwgaW4sIG91dCwgb2tmbik7CisJaWYgKHJldCAhPSBORl9EUk9QICYmIHJldCAhPSBORl9TVE9MRU4KKwkgICAgJiYgKCgqcHNrYiktPm5oLmlwaC0+c2FkZHIgIT0gc2FkZHIKKwkJfHwgKCpwc2tiKS0+bmguaXBoLT5kYWRkciAhPSBkYWRkcikpCisJCXJldHVybiBpcF9yb3V0ZV9tZV9oYXJkZXIocHNrYikgPT0gMCA/IHJldCA6IE5GX0RST1A7CisJcmV0dXJuIHJldDsKK30KKworLyogV2UgbXVzdCBiZSBhZnRlciBjb25uZWN0aW9uIHRyYWNraW5nIGFuZCBiZWZvcmUgcGFja2V0IGZpbHRlcmluZy4gKi8KKworLyogQmVmb3JlIHBhY2tldCBmaWx0ZXJpbmcsIGNoYW5nZSBkZXN0aW5hdGlvbiAqLworc3RhdGljIHN0cnVjdCBuZl9ob29rX29wcyBpcF9uYXRfaW5fb3BzID0geworCS5ob29rCQk9IGlwX25hdF9pbiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnBmCQk9IFBGX0lORVQsCisJLmhvb2tudW0JPSBORl9JUF9QUkVfUk9VVElORywKKwkucHJpb3JpdHkJPSBORl9JUF9QUklfTkFUX0RTVCwKK307CisKKy8qIEFmdGVyIHBhY2tldCBmaWx0ZXJpbmcsIGNoYW5nZSBzb3VyY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgbmZfaG9va19vcHMgaXBfbmF0X291dF9vcHMgPSB7CisJLmhvb2sJCT0gaXBfbmF0X291dCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnBmCQk9IFBGX0lORVQsCisJLmhvb2tudW0JPSBORl9JUF9QT1NUX1JPVVRJTkcsCisJLnByaW9yaXR5CT0gTkZfSVBfUFJJX05BVF9TUkMsCit9OworCisvKiBCZWZvcmUgcGFja2V0IGZpbHRlcmluZywgY2hhbmdlIGRlc3RpbmF0aW9uICovCitzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIGlwX25hdF9sb2NhbF9vdXRfb3BzID0geworCS5ob29rCQk9IGlwX25hdF9sb2NhbF9mbiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnBmCQk9IFBGX0lORVQsCisJLmhvb2tudW0JPSBORl9JUF9MT0NBTF9PVVQsCisJLnByaW9yaXR5CT0gTkZfSVBfUFJJX05BVF9EU1QsCit9OworCisvKiBBZnRlciBwYWNrZXQgZmlsdGVyaW5nLCBjaGFuZ2Ugc291cmNlIGZvciByZXBseSBwYWNrZXRzIG9mIExPQ0FMX09VVCBETkFUICovCitzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIGlwX25hdF9sb2NhbF9pbl9vcHMgPSB7CisJLmhvb2sJCT0gaXBfbmF0X2ZuLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucGYJCT0gUEZfSU5FVCwKKwkuaG9va251bQk9IE5GX0lQX0xPQ0FMX0lOLAorCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9OQVRfU1JDLAorfTsKKworc3RhdGljIGludCBpbml0X29yX2NsZWFudXAoaW50IGluaXQpCit7CisJaW50IHJldCA9IDA7CisKKwluZWVkX2lwX2Nvbm50cmFjaygpOworCisJaWYgKCFpbml0KSBnb3RvIGNsZWFudXA7CisKKwlyZXQgPSBpcF9uYXRfcnVsZV9pbml0KCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKCJpcF9uYXRfaW5pdDogY2FuJ3Qgc2V0dXAgcnVsZXMuXG4iKTsKKwkJZ290byBjbGVhbnVwX25vdGhpbmc7CisJfQorCXJldCA9IGlwX25hdF9pbml0KCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKCJpcF9uYXRfaW5pdDogY2FuJ3Qgc2V0dXAgcnVsZXMuXG4iKTsKKwkJZ290byBjbGVhbnVwX3J1bGVfaW5pdDsKKwl9CisJcmV0ID0gbmZfcmVnaXN0ZXJfaG9vaygmaXBfbmF0X2luX29wcyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKCJpcF9uYXRfaW5pdDogY2FuJ3QgcmVnaXN0ZXIgaW4gaG9vay5cbiIpOworCQlnb3RvIGNsZWFudXBfbmF0OworCX0KKwlyZXQgPSBuZl9yZWdpc3Rlcl9ob29rKCZpcF9uYXRfb3V0X29wcyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKCJpcF9uYXRfaW5pdDogY2FuJ3QgcmVnaXN0ZXIgb3V0IGhvb2suXG4iKTsKKwkJZ290byBjbGVhbnVwX2lub3BzOworCX0KKwlyZXQgPSBuZl9yZWdpc3Rlcl9ob29rKCZpcF9uYXRfbG9jYWxfb3V0X29wcyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKCJpcF9uYXRfaW5pdDogY2FuJ3QgcmVnaXN0ZXIgbG9jYWwgb3V0IGhvb2suXG4iKTsKKwkJZ290byBjbGVhbnVwX291dG9wczsKKwl9CisJcmV0ID0gbmZfcmVnaXN0ZXJfaG9vaygmaXBfbmF0X2xvY2FsX2luX29wcyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKCJpcF9uYXRfaW5pdDogY2FuJ3QgcmVnaXN0ZXIgbG9jYWwgaW4gaG9vay5cbiIpOworCQlnb3RvIGNsZWFudXBfbG9jYWxvdXRvcHM7CisJfQorCXJldHVybiByZXQ7CisKKyBjbGVhbnVwOgorCW5mX3VucmVnaXN0ZXJfaG9vaygmaXBfbmF0X2xvY2FsX2luX29wcyk7CisgY2xlYW51cF9sb2NhbG91dG9wczoKKwluZl91bnJlZ2lzdGVyX2hvb2soJmlwX25hdF9sb2NhbF9vdXRfb3BzKTsKKyBjbGVhbnVwX291dG9wczoKKwluZl91bnJlZ2lzdGVyX2hvb2soJmlwX25hdF9vdXRfb3BzKTsKKyBjbGVhbnVwX2lub3BzOgorCW5mX3VucmVnaXN0ZXJfaG9vaygmaXBfbmF0X2luX29wcyk7CisgY2xlYW51cF9uYXQ6CisJaXBfbmF0X2NsZWFudXAoKTsKKyBjbGVhbnVwX3J1bGVfaW5pdDoKKwlpcF9uYXRfcnVsZV9jbGVhbnVwKCk7CisgY2xlYW51cF9ub3RoaW5nOgorCU1VU1RfQkVfUkVBRF9XUklURV9VTkxPQ0tFRCgmaXBfbmF0X2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlyZXR1cm4gaW5pdF9vcl9jbGVhbnVwKDEpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCWluaXRfb3JfY2xlYW51cCgwKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKKworRVhQT1JUX1NZTUJPTChpcF9uYXRfc2V0dXBfaW5mbyk7CitFWFBPUlRfU1lNQk9MKGlwX25hdF9wcm90b2NvbF9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGlwX25hdF9wcm90b2NvbF91bnJlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woaXBfbmF0X2NoZWF0X2NoZWNrKTsKK0VYUE9SVF9TWU1CT0woaXBfbmF0X21hbmdsZV90Y3BfcGFja2V0KTsKK0VYUE9SVF9TWU1CT0woaXBfbmF0X21hbmdsZV91ZHBfcGFja2V0KTsKK0VYUE9SVF9TWU1CT0woaXBfbmF0X3VzZWRfdHVwbGUpOworRVhQT1JUX1NZTUJPTChpcF9uYXRfZm9sbG93X21hc3Rlcik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3RmdHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfdGZ0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNDNlMGQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3RmdHAuYwpAQCAtMCwwICsxLDcwIEBACisvKiAoQykgMjAwMS0yMDAyIE1hZ251cyBCb2RlbiA8bWJAb3phYmEubWluZS5udT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFZlcnNpb246IDAuMC43CisgKgorICogVGh1IDIxIE1hciAyMDAyIEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAJLSBQb3J0IHRvIG5ld25hdCBBUEkKKyAqCisgKiBUaGlzIG1vZHVsZSBjdXJyZW50bHkgc3VwcG9ydHMgRE5BVDoKKyAqIGlwdGFibGVzIC10IG5hdCAtQSBQUkVST1VUSU5HIC1kIHgueC54LnggLWogRE5BVCAtLXRvLWRlc3QgeC54LngueQorICoKKyAqIGFuZCBTTkFUOgorICogaXB0YWJsZXMgLXQgbmF0IC1BIFBPU1RST1VUSU5HIHsgLWogTUFTUVVFUkFERSAsIC1qIFNOQVQgLS10by1zb3VyY2UgeC54LngueCB9CisgKgorICogSXQgaGFzIG5vdCBiZWVuIHRlc3RlZCB3aXRoCisgKiAtaiBTTkFUIC0tdG8tc291cmNlIHgueC54LngteC54LngueSBzaW5jZSBJIG9ubHkgaGF2ZSBvbmUgZXh0ZXJuYWwgaXAKKyAqIElmIHlvdSBkbyB0ZXN0IHRoaXMgcGxlYXNlIGxldCBtZSBrbm93IGlmIGl0IHdvcmtzIG9yIG5vdC4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfdGZ0cC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9oZWxwZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisKK01PRFVMRV9BVVRIT1IoIk1hZ251cyBCb2RlbiA8bWJAb3phYmEubWluZS5udT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigidGZ0cCBOQVQgaGVscGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGVscChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkKK3sKKwlleHAtPnNhdmVkX3Byb3RvLnVkcC5wb3J0ID0gZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydDsKKwlleHAtPmRpciA9IElQX0NUX0RJUl9SRVBMWTsKKwlleHAtPmV4cGVjdGZuID0gaXBfbmF0X2ZvbGxvd19tYXN0ZXI7CisJaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApICE9IDApIHsKKwkJaXBfY29ubnRyYWNrX2V4cGVjdF9mcmVlKGV4cCk7CisJCXJldHVybiBORl9EUk9QOworCX0KKwlyZXR1cm4gTkZfQUNDRVBUOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCWlwX25hdF90ZnRwX2hvb2sgPSBOVUxMOworCS8qIE1ha2Ugc3VyZSBub29uZSBjYWxscyBpdCwgbWVhbndoaWxlLiAqLworCXN5bmNocm9uaXplX25ldCgpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJQlVHX09OKGlwX25hdF90ZnRwX2hvb2spOworCWlwX25hdF90ZnRwX2hvb2sgPSBoZWxwOworCXJldHVybiAwOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3F1ZXVlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfcXVldWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTQwZGZmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3F1ZXVlLmMKQEAgLTAsMCArMSw3NDEgQEAKKy8qCisgKiBUaGlzIGlzIGEgbW9kdWxlIHdoaWNoIGlzIHVzZWQgZm9yIHF1ZXVlaW5nIElQdjQgcGFja2V0cyBhbmQKKyAqIGNvbW11bmljYXRpbmcgd2l0aCB1c2Vyc3BhY2UgdmlhIG5ldGxpbmsuCisgKgorICogKEMpIDIwMDAtMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIDIwMDAtMDMtMjc6IFNpbXBsaWZpZWQgY29kZSAodGhhbmtzIHRvIEFuZGkgS2xlZW4gZm9yIGNsdWVzKS4KKyAqIDIwMDAtMDUtMjA6IEZpeGVkIG5vdGlmaWVyIHByb2JsZW1zIChmb2xsb3dpbmcgTWlndWVsIEZyZWl0YXMnIHJlcG9ydCkuCisgKiAyMDAwLTA2LTE5OiBGaXhlZCBzbyBuZm1hcmsgaXMgY29waWVkIHRvIG1ldGFkYXRhIChyZXBvcnRlZCBieSBTZWJhc3RpYW4gCisgKiAgICAgICAgICAgICBaYW5kZXIpLgorICogMjAwMC0wOC0wMTogQWRkZWQgTmljayBXaWxsaWFtcycgTUFDIHN1cHBvcnQuCisgKiAyMDAyLTA2LTI1OiBDb2RlIGNsZWFudXAuCisgKiAyMDA1LTAxLTEwOiBBZGRlZCAvcHJvYyBjb3VudGVyIGZvciBkcm9wcGVkIHBhY2tldHM7IGZpeGVkIHNvCisgKiAgICAgICAgICAgICBwYWNrZXRzIGFyZW4ndCBkZWxpdmVyZWQgdG8gdXNlciBzcGFjZSBpZiB0aGV5J3JlIGdvaW5nIAorICogICAgICAgICAgICAgdG8gYmUgZHJvcHBlZC4gCisgKgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9xdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisKKyNkZWZpbmUgSVBRX1FNQVhfREVGQVVMVCAxMDI0CisjZGVmaW5lIElQUV9QUk9DX0ZTX05BTUUgImlwX3F1ZXVlIgorI2RlZmluZSBORVRfSVBRX1FNQVggMjA4OAorI2RlZmluZSBORVRfSVBRX1FNQVhfTkFNRSAiaXBfcXVldWVfbWF4bGVuIgorCitzdHJ1Y3QgaXBxX3J0X2luZm8geworCV9fdTggdG9zOworCV9fdTMyIGRhZGRyOworCV9fdTMyIHNhZGRyOworfTsKKworc3RydWN0IGlwcV9xdWV1ZV9lbnRyeSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBuZl9pbmZvICppbmZvOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGlwcV9ydF9pbmZvIHJ0X2luZm87Cit9OworCit0eXBlZGVmIGludCAoKmlwcV9jbXBmbikoc3RydWN0IGlwcV9xdWV1ZV9lbnRyeSAqLCB1bnNpZ25lZCBsb25nKTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY29weV9tb2RlID0gSVBRX0NPUFlfTk9ORTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcXVldWVfbWF4bGVuID0gSVBRX1FNQVhfREVGQVVMVDsKK3N0YXRpYyBERUZJTkVfUldMT0NLKHF1ZXVlX2xvY2spOworc3RhdGljIGludCBwZWVyX3BpZDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29weV9yYW5nZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcXVldWVfdG90YWw7CitzdGF0aWMgdW5zaWduZWQgaW50IHF1ZXVlX2Ryb3BwZWQgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBxdWV1ZV91c2VyX2Ryb3BwZWQgPSAwOworc3RhdGljIHN0cnVjdCBzb2NrICppcHFubDsKK3N0YXRpYyBMSVNUX0hFQUQocXVldWVfbGlzdCk7CitzdGF0aWMgREVDTEFSRV9NVVRFWChpcHFubF9zZW0pOworCitzdGF0aWMgdm9pZAoraXBxX2lzc3VlX3ZlcmRpY3Qoc3RydWN0IGlwcV9xdWV1ZV9lbnRyeSAqZW50cnksIGludCB2ZXJkaWN0KQoreworCW5mX3JlaW5qZWN0KGVudHJ5LT5za2IsIGVudHJ5LT5pbmZvLCB2ZXJkaWN0KTsKKwlrZnJlZShlbnRyeSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19pcHFfZW5xdWV1ZV9lbnRyeShzdHJ1Y3QgaXBxX3F1ZXVlX2VudHJ5ICplbnRyeSkKK3sKKyAgICAgICBsaXN0X2FkZCgmZW50cnktPmxpc3QsICZxdWV1ZV9saXN0KTsKKyAgICAgICBxdWV1ZV90b3RhbCsrOworfQorCisvKgorICogRmluZCBhbmQgcmV0dXJuIGEgcXVldWVkIGVudHJ5IG1hdGNoZWQgYnkgY21wZm4sIG9yIHJldHVybiB0aGUgbGFzdAorICogZW50cnkgaWYgY21wZm4gaXMgTlVMTC4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBxX3F1ZXVlX2VudHJ5ICoKK19faXBxX2ZpbmRfZW50cnkoaXBxX2NtcGZuIGNtcGZuLCB1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworCWxpc3RfZm9yX2VhY2hfcHJldihwLCAmcXVldWVfbGlzdCkgeworCQlzdHJ1Y3QgaXBxX3F1ZXVlX2VudHJ5ICplbnRyeSA9IChzdHJ1Y3QgaXBxX3F1ZXVlX2VudHJ5ICopcDsKKwkJCisJCWlmICghY21wZm4gfHwgY21wZm4oZW50cnksIGRhdGEpKQorCQkJcmV0dXJuIGVudHJ5OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2lwcV9kZXF1ZXVlX2VudHJ5KHN0cnVjdCBpcHFfcXVldWVfZW50cnkgKmVudHJ5KQoreworCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7CisJcXVldWVfdG90YWwtLTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBxX3F1ZXVlX2VudHJ5ICoKK19faXBxX2ZpbmRfZGVxdWV1ZV9lbnRyeShpcHFfY21wZm4gY21wZm4sIHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaXBxX3F1ZXVlX2VudHJ5ICplbnRyeTsKKworCWVudHJ5ID0gX19pcHFfZmluZF9lbnRyeShjbXBmbiwgZGF0YSk7CisJaWYgKGVudHJ5ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJX19pcHFfZGVxdWV1ZV9lbnRyeShlbnRyeSk7CisJcmV0dXJuIGVudHJ5OworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19pcHFfZmx1c2goaW50IHZlcmRpY3QpCit7CisJc3RydWN0IGlwcV9xdWV1ZV9lbnRyeSAqZW50cnk7CisJCisJd2hpbGUgKChlbnRyeSA9IF9faXBxX2ZpbmRfZGVxdWV1ZV9lbnRyeShOVUxMLCAwKSkpCisJCWlwcV9pc3N1ZV92ZXJkaWN0KGVudHJ5LCB2ZXJkaWN0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19faXBxX3NldF9tb2RlKHVuc2lnbmVkIGNoYXIgbW9kZSwgdW5zaWduZWQgaW50IHJhbmdlKQoreworCWludCBzdGF0dXMgPSAwOworCQorCXN3aXRjaChtb2RlKSB7CisJY2FzZSBJUFFfQ09QWV9OT05FOgorCWNhc2UgSVBRX0NPUFlfTUVUQToKKwkJY29weV9tb2RlID0gbW9kZTsKKwkJY29weV9yYW5nZSA9IDA7CisJCWJyZWFrOworCQkKKwljYXNlIElQUV9DT1BZX1BBQ0tFVDoKKwkJY29weV9tb2RlID0gbW9kZTsKKwkJY29weV9yYW5nZSA9IHJhbmdlOworCQlpZiAoY29weV9yYW5nZSA+IDB4RkZGRikKKwkJCWNvcHlfcmFuZ2UgPSAweEZGRkY7CisJCWJyZWFrOworCQkKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSAtRUlOVkFMOworCisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19pcHFfcmVzZXQodm9pZCkKK3sKKwlwZWVyX3BpZCA9IDA7CisJbmV0X2Rpc2FibGVfdGltZXN0YW1wKCk7CisJX19pcHFfc2V0X21vZGUoSVBRX0NPUFlfTk9ORSwgMCk7CisJX19pcHFfZmx1c2goTkZfRFJPUCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXBxX3F1ZXVlX2VudHJ5ICoKK2lwcV9maW5kX2RlcXVldWVfZW50cnkoaXBxX2NtcGZuIGNtcGZuLCB1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGlwcV9xdWV1ZV9lbnRyeSAqZW50cnk7CisJCisJd3JpdGVfbG9ja19iaCgmcXVldWVfbG9jayk7CisJZW50cnkgPSBfX2lwcV9maW5kX2RlcXVldWVfZW50cnkoY21wZm4sIGRhdGEpOworCXdyaXRlX3VubG9ja19iaCgmcXVldWVfbG9jayk7CisJcmV0dXJuIGVudHJ5OworfQorCitzdGF0aWMgdm9pZAoraXBxX2ZsdXNoKGludCB2ZXJkaWN0KQoreworCXdyaXRlX2xvY2tfYmgoJnF1ZXVlX2xvY2spOworCV9faXBxX2ZsdXNoKHZlcmRpY3QpOworCXdyaXRlX3VubG9ja19iaCgmcXVldWVfbG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCitpcHFfYnVpbGRfcGFja2V0X21lc3NhZ2Uoc3RydWN0IGlwcV9xdWV1ZV9lbnRyeSAqZW50cnksIGludCAqZXJycCkKK3sKKwl1bnNpZ25lZCBjaGFyICpvbGRfdGFpbDsKKwlzaXplX3Qgc2l6ZSA9IDA7CisJc2l6ZV90IGRhdGFfbGVuID0gMDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpcHFfcGFja2V0X21zZyAqcG1zZzsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKworCXJlYWRfbG9ja19iaCgmcXVldWVfbG9jayk7CisJCisJc3dpdGNoIChjb3B5X21vZGUpIHsKKwljYXNlIElQUV9DT1BZX01FVEE6CisJY2FzZSBJUFFfQ09QWV9OT05FOgorCQlzaXplID0gTkxNU0dfU1BBQ0Uoc2l6ZW9mKCpwbXNnKSk7CisJCWRhdGFfbGVuID0gMDsKKwkJYnJlYWs7CisJCisJY2FzZSBJUFFfQ09QWV9QQUNLRVQ6CisJCWlmIChjb3B5X3JhbmdlID09IDAgfHwgY29weV9yYW5nZSA+IGVudHJ5LT5za2ItPmxlbikKKwkJCWRhdGFfbGVuID0gZW50cnktPnNrYi0+bGVuOworCQllbHNlCisJCQlkYXRhX2xlbiA9IGNvcHlfcmFuZ2U7CisJCQorCQlzaXplID0gTkxNU0dfU1BBQ0Uoc2l6ZW9mKCpwbXNnKSArIGRhdGFfbGVuKTsKKwkJYnJlYWs7CisJCisJZGVmYXVsdDoKKwkJKmVycnAgPSAtRUlOVkFMOworCQlyZWFkX3VubG9ja19iaCgmcXVldWVfbG9jayk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJlYWRfdW5sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKworCXNrYiA9IGFsbG9jX3NrYihzaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJZ290byBubG1zZ19mYWlsdXJlOworCQkKKwlvbGRfdGFpbD0gc2tiLT50YWlsOworCW5saCA9IE5MTVNHX1BVVChza2IsIDAsIDAsIElQUU1fUEFDS0VULCBzaXplIC0gc2l6ZW9mKCpubGgpKTsKKwlwbXNnID0gTkxNU0dfREFUQShubGgpOworCW1lbXNldChwbXNnLCAwLCBzaXplb2YoKnBtc2cpKTsKKworCXBtc2ctPnBhY2tldF9pZCAgICAgICA9ICh1bnNpZ25lZCBsb25nICllbnRyeTsKKwlwbXNnLT5kYXRhX2xlbiAgICAgICAgPSBkYXRhX2xlbjsKKwlwbXNnLT50aW1lc3RhbXBfc2VjICAgPSBlbnRyeS0+c2tiLT5zdGFtcC50dl9zZWM7CisJcG1zZy0+dGltZXN0YW1wX3VzZWMgID0gZW50cnktPnNrYi0+c3RhbXAudHZfdXNlYzsKKwlwbXNnLT5tYXJrICAgICAgICAgICAgPSBlbnRyeS0+c2tiLT5uZm1hcms7CisJcG1zZy0+aG9vayAgICAgICAgICAgID0gZW50cnktPmluZm8tPmhvb2s7CisJcG1zZy0+aHdfcHJvdG9jb2wgICAgID0gZW50cnktPnNrYi0+cHJvdG9jb2w7CisJCisJaWYgKGVudHJ5LT5pbmZvLT5pbmRldikKKwkJc3RyY3B5KHBtc2ctPmluZGV2X25hbWUsIGVudHJ5LT5pbmZvLT5pbmRldi0+bmFtZSk7CisJZWxzZQorCQlwbXNnLT5pbmRldl9uYW1lWzBdID0gJ1wwJzsKKwkKKwlpZiAoZW50cnktPmluZm8tPm91dGRldikKKwkJc3RyY3B5KHBtc2ctPm91dGRldl9uYW1lLCBlbnRyeS0+aW5mby0+b3V0ZGV2LT5uYW1lKTsKKwllbHNlCisJCXBtc2ctPm91dGRldl9uYW1lWzBdID0gJ1wwJzsKKwkKKwlpZiAoZW50cnktPmluZm8tPmluZGV2ICYmIGVudHJ5LT5za2ItPmRldikgeworCQlwbXNnLT5od190eXBlID0gZW50cnktPnNrYi0+ZGV2LT50eXBlOworCQlpZiAoZW50cnktPnNrYi0+ZGV2LT5oYXJkX2hlYWRlcl9wYXJzZSkKKwkJCXBtc2ctPmh3X2FkZHJsZW4gPQorCQkJCWVudHJ5LT5za2ItPmRldi0+aGFyZF9oZWFkZXJfcGFyc2UoZW50cnktPnNrYiwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtc2ctPmh3X2FkZHIpOworCX0KKwkKKwlpZiAoZGF0YV9sZW4pCisJCWlmIChza2JfY29weV9iaXRzKGVudHJ5LT5za2IsIDAsIHBtc2ctPnBheWxvYWQsIGRhdGFfbGVuKSkKKwkJCUJVRygpOworCQkKKwlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIG9sZF90YWlsOworCXJldHVybiBza2I7CisKK25sbXNnX2ZhaWx1cmU6CisJaWYgKHNrYikKKwkJa2ZyZWVfc2tiKHNrYik7CisJKmVycnAgPSAtRUlOVkFMOworCXByaW50ayhLRVJOX0VSUiAiaXBfcXVldWU6IGVycm9yIGNyZWF0aW5nIHBhY2tldCBtZXNzYWdlXG4iKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludAoraXBxX2VucXVldWVfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZl9pbmZvICppbmZvLCB2b2lkICpkYXRhKQoreworCWludCBzdGF0dXMgPSAtRUlOVkFMOworCXN0cnVjdCBza19idWZmICpuc2tiOworCXN0cnVjdCBpcHFfcXVldWVfZW50cnkgKmVudHJ5OworCisJaWYgKGNvcHlfbW9kZSA9PSBJUFFfQ09QWV9OT05FKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWVudHJ5ID0ga21hbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0FUT01JQyk7CisJaWYgKGVudHJ5ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpcF9xdWV1ZTogT09NIGluIGlwcV9lbnF1ZXVlX3BhY2tldCgpXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZW50cnktPmluZm8gPSBpbmZvOworCWVudHJ5LT5za2IgPSBza2I7CisKKwlpZiAoZW50cnktPmluZm8tPmhvb2sgPT0gTkZfSVBfTE9DQUxfT1VUKSB7CisJCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisKKwkJZW50cnktPnJ0X2luZm8udG9zID0gaXBoLT50b3M7CisJCWVudHJ5LT5ydF9pbmZvLmRhZGRyID0gaXBoLT5kYWRkcjsKKwkJZW50cnktPnJ0X2luZm8uc2FkZHIgPSBpcGgtPnNhZGRyOworCX0KKworCW5za2IgPSBpcHFfYnVpbGRfcGFja2V0X21lc3NhZ2UoZW50cnksICZzdGF0dXMpOworCWlmIChuc2tiID09IE5VTEwpCisJCWdvdG8gZXJyX291dF9mcmVlOworCQkKKwl3cml0ZV9sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKwkKKwlpZiAoIXBlZXJfcGlkKQorCQlnb3RvIGVycl9vdXRfZnJlZV9uc2tiOyAKKworCWlmIChxdWV1ZV90b3RhbCA+PSBxdWV1ZV9tYXhsZW4pIHsKKyAgICAgICAgICAgICAgICBxdWV1ZV9kcm9wcGVkKys7CisJCXN0YXR1cyA9IC1FTk9TUEM7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCSAgICAgICAgICBwcmludGsgKEtFUk5fV0FSTklORyAiaXBfcXVldWU6IGZ1bGwgYXQgJWQgZW50cmllcywgIgorCQkJCSAgImRyb3BwaW5nIHBhY2tldHMocykuIERyb3BwZWQ6ICVkXG4iLCBxdWV1ZV90b3RhbCwKKwkJCQkgIHF1ZXVlX2Ryb3BwZWQpOworCQlnb3RvIGVycl9vdXRfZnJlZV9uc2tiOworCX0KKworIAkvKiBuZXRsaW5rX3VuaWNhc3Qgd2lsbCBlaXRoZXIgZnJlZSB0aGUgbnNrYiBvciBhdHRhY2ggaXQgdG8gYSBzb2NrZXQgKi8gCisJc3RhdHVzID0gbmV0bGlua191bmljYXN0KGlwcW5sLCBuc2tiLCBwZWVyX3BpZCwgTVNHX0RPTlRXQUlUKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCSAgICAgICAgcXVldWVfdXNlcl9kcm9wcGVkKys7CisJCWdvdG8gZXJyX291dF91bmxvY2s7CisJfQorCisJX19pcHFfZW5xdWV1ZV9lbnRyeShlbnRyeSk7CisKKwl3cml0ZV91bmxvY2tfYmgoJnF1ZXVlX2xvY2spOworCXJldHVybiBzdGF0dXM7CisKK2Vycl9vdXRfZnJlZV9uc2tiOgorCWtmcmVlX3NrYihuc2tiKTsgCisJCitlcnJfb3V0X3VubG9jazoKKwl3cml0ZV91bmxvY2tfYmgoJnF1ZXVlX2xvY2spOworCitlcnJfb3V0X2ZyZWU6CisJa2ZyZWUoZW50cnkpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK2lwcV9tYW5nbGVfaXB2NChpcHFfdmVyZGljdF9tc2dfdCAqdiwgc3RydWN0IGlwcV9xdWV1ZV9lbnRyeSAqZSkKK3sKKwlpbnQgZGlmZjsKKwlzdHJ1Y3QgaXBoZHIgKnVzZXJfaXBoID0gKHN0cnVjdCBpcGhkciAqKXYtPnBheWxvYWQ7CisKKwlpZiAodi0+ZGF0YV9sZW4gPCBzaXplb2YoKnVzZXJfaXBoKSkKKwkJcmV0dXJuIDA7CisJZGlmZiA9IHYtPmRhdGFfbGVuIC0gZS0+c2tiLT5sZW47CisJaWYgKGRpZmYgPCAwKQorCQlza2JfdHJpbShlLT5za2IsIHYtPmRhdGFfbGVuKTsKKwllbHNlIGlmIChkaWZmID4gMCkgeworCQlpZiAodi0+ZGF0YV9sZW4gPiAweEZGRkYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGRpZmYgPiBza2JfdGFpbHJvb20oZS0+c2tiKSkgeworCQkJc3RydWN0IHNrX2J1ZmYgKm5ld3NrYjsKKwkJCQorCQkJbmV3c2tiID0gc2tiX2NvcHlfZXhwYW5kKGUtPnNrYiwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICBza2JfaGVhZHJvb20oZS0+c2tiKSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgIEdGUF9BVE9NSUMpOworCQkJaWYgKG5ld3NrYiA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaXBfcXVldWU6IE9PTSAiCisJCQkJICAgICAgImluIG1hbmdsZSwgZHJvcHBpbmcgcGFja2V0XG4iKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWlmIChlLT5za2ItPnNrKQorCQkJCXNrYl9zZXRfb3duZXJfdyhuZXdza2IsIGUtPnNrYi0+c2spOworCQkJa2ZyZWVfc2tiKGUtPnNrYik7CisJCQllLT5za2IgPSBuZXdza2I7CisJCX0KKwkJc2tiX3B1dChlLT5za2IsIGRpZmYpOworCX0KKwlpZiAoIXNrYl9pcF9tYWtlX3dyaXRhYmxlKCZlLT5za2IsIHYtPmRhdGFfbGVuKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtY3B5KGUtPnNrYi0+ZGF0YSwgdi0+cGF5bG9hZCwgdi0+ZGF0YV9sZW4pOworCWUtPnNrYi0+bmZjYWNoZSB8PSBORkNfQUxURVJFRDsKKworCS8qCisJICogRXh0cmEgcm91dGluZyBtYXkgbmVlZGVkIG9uIGxvY2FsIG91dCwgYXMgdGhlIFFVRVVFIHRhcmdldCBuZXZlcgorCSAqIHJldHVybnMgY29udHJvbCB0byB0aGUgdGFibGUuCisJICovCisJaWYgKGUtPmluZm8tPmhvb2sgPT0gTkZfSVBfTE9DQUxfT1VUKSB7CisJCXN0cnVjdCBpcGhkciAqaXBoID0gZS0+c2tiLT5uaC5pcGg7CisKKwkJaWYgKCEoaXBoLT50b3MgPT0gZS0+cnRfaW5mby50b3MKKwkJICAgICAgJiYgaXBoLT5kYWRkciA9PSBlLT5ydF9pbmZvLmRhZGRyCisJCSAgICAgICYmIGlwaC0+c2FkZHIgPT0gZS0+cnRfaW5mby5zYWRkcikpCisJCQlyZXR1cm4gaXBfcm91dGVfbWVfaGFyZGVyKCZlLT5za2IpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lkX2NtcChzdHJ1Y3QgaXBxX3F1ZXVlX2VudHJ5ICplLCB1bnNpZ25lZCBsb25nIGlkKQoreworCXJldHVybiAoaWQgPT0gKHVuc2lnbmVkIGxvbmcgKWUpOworfQorCitzdGF0aWMgaW50CitpcHFfc2V0X3ZlcmRpY3Qoc3RydWN0IGlwcV92ZXJkaWN0X21zZyAqdm1zZywgdW5zaWduZWQgaW50IGxlbikKK3sKKwlzdHJ1Y3QgaXBxX3F1ZXVlX2VudHJ5ICplbnRyeTsKKworCWlmICh2bXNnLT52YWx1ZSA+IE5GX01BWF9WRVJESUNUKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVudHJ5ID0gaXBxX2ZpbmRfZGVxdWV1ZV9lbnRyeShpZF9jbXAsIHZtc2ctPmlkKTsKKwlpZiAoZW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJZWxzZSB7CisJCWludCB2ZXJkaWN0ID0gdm1zZy0+dmFsdWU7CisJCQorCQlpZiAodm1zZy0+ZGF0YV9sZW4gJiYgdm1zZy0+ZGF0YV9sZW4gPT0gbGVuKQorCQkJaWYgKGlwcV9tYW5nbGVfaXB2NCh2bXNnLCBlbnRyeSkgPCAwKQorCQkJCXZlcmRpY3QgPSBORl9EUk9QOworCQkKKwkJaXBxX2lzc3VlX3ZlcmRpY3QoZW50cnksIHZlcmRpY3QpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2lwcV9zZXRfbW9kZSh1bnNpZ25lZCBjaGFyIG1vZGUsIHVuc2lnbmVkIGludCByYW5nZSkKK3sKKwlpbnQgc3RhdHVzOworCisJd3JpdGVfbG9ja19iaCgmcXVldWVfbG9jayk7CisJc3RhdHVzID0gX19pcHFfc2V0X21vZGUobW9kZSwgcmFuZ2UpOworCXdyaXRlX3VubG9ja19iaCgmcXVldWVfbG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAoraXBxX3JlY2VpdmVfcGVlcihzdHJ1Y3QgaXBxX3BlZXJfbXNnICpwbXNnLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGUsIHVuc2lnbmVkIGludCBsZW4pCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwlpZiAobGVuIDwgc2l6ZW9mKCpwbXNnKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElQUU1fTU9ERToKKwkJc3RhdHVzID0gaXBxX3NldF9tb2RlKHBtc2ctPm1zZy5tb2RlLnZhbHVlLAorCQkgICAgICAgICAgICAgICAgICAgICAgcG1zZy0+bXNnLm1vZGUucmFuZ2UpOworCQlicmVhazsKKwkJCisJY2FzZSBJUFFNX1ZFUkRJQ1Q6CisJCWlmIChwbXNnLT5tc2cudmVyZGljdC52YWx1ZSA+IE5GX01BWF9WRVJESUNUKQorCQkJc3RhdHVzID0gLUVJTlZBTDsKKwkJZWxzZQorCQkJc3RhdHVzID0gaXBxX3NldF92ZXJkaWN0KCZwbXNnLT5tc2cudmVyZGljdCwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLSBzaXplb2YoKnBtc2cpKTsKKwkJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK2Rldl9jbXAoc3RydWN0IGlwcV9xdWV1ZV9lbnRyeSAqZW50cnksIHVuc2lnbmVkIGxvbmcgaWZpbmRleCkKK3sKKwlpZiAoZW50cnktPmluZm8tPmluZGV2KQorCQlpZiAoZW50cnktPmluZm8tPmluZGV2LT5pZmluZGV4ID09IGlmaW5kZXgpCisJCQlyZXR1cm4gMTsKKwkJCQorCWlmIChlbnRyeS0+aW5mby0+b3V0ZGV2KQorCQlpZiAoZW50cnktPmluZm8tPm91dGRldi0+aWZpbmRleCA9PSBpZmluZGV4KQorCQkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2lwcV9kZXZfZHJvcChpbnQgaWZpbmRleCkKK3sKKwlzdHJ1Y3QgaXBxX3F1ZXVlX2VudHJ5ICplbnRyeTsKKwkKKwl3aGlsZSAoKGVudHJ5ID0gaXBxX2ZpbmRfZGVxdWV1ZV9lbnRyeShkZXZfY21wLCBpZmluZGV4KSkgIT0gTlVMTCkKKwkJaXBxX2lzc3VlX3ZlcmRpY3QoZW50cnksIE5GX0RST1ApOworfQorCisjZGVmaW5lIFJDVl9TS0JfRkFJTChlcnIpIGRvIHsgbmV0bGlua19hY2soc2tiLCBubGgsIChlcnIpKTsgcmV0dXJuOyB9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lwcV9yY3Zfc2tiKHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHN0YXR1cywgdHlwZSwgcGlkLCBmbGFncywgbmxtc2dsZW4sIHNrYmxlbjsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKworCXNrYmxlbiA9IHNrYi0+bGVuOworCWlmIChza2JsZW4gPCBzaXplb2YoKm5saCkpCisJCXJldHVybjsKKworCW5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKilza2ItPmRhdGE7CisJbmxtc2dsZW4gPSBubGgtPm5sbXNnX2xlbjsKKwlpZiAobmxtc2dsZW4gPCBzaXplb2YoKm5saCkgfHwgc2tibGVuIDwgbmxtc2dsZW4pCisJCXJldHVybjsKKworCXBpZCA9IG5saC0+bmxtc2dfcGlkOworCWZsYWdzID0gbmxoLT5ubG1zZ19mbGFnczsKKwkKKwlpZihwaWQgPD0gMCB8fCAhKGZsYWdzICYgTkxNX0ZfUkVRVUVTVCkgfHwgZmxhZ3MgJiBOTE1fRl9NVUxUSSkKKwkJUkNWX1NLQl9GQUlMKC1FSU5WQUwpOworCQkKKwlpZiAoZmxhZ3MgJiBNU0dfVFJVTkMpCisJCVJDVl9TS0JfRkFJTCgtRUNPTU0pOworCQkKKwl0eXBlID0gbmxoLT5ubG1zZ190eXBlOworCWlmICh0eXBlIDwgTkxNU0dfTk9PUCB8fCB0eXBlID49IElQUU1fTUFYKQorCQlSQ1ZfU0tCX0ZBSUwoLUVJTlZBTCk7CisJCQorCWlmICh0eXBlIDw9IElQUU1fQkFTRSkKKwkJcmV0dXJuOworCQkKKwlpZiAoc2VjdXJpdHlfbmV0bGlua19yZWN2KHNrYikpCisJCVJDVl9TS0JfRkFJTCgtRVBFUk0pOworCQorCXdyaXRlX2xvY2tfYmgoJnF1ZXVlX2xvY2spOworCQorCWlmIChwZWVyX3BpZCkgeworCQlpZiAocGVlcl9waWQgIT0gcGlkKSB7CisJCQl3cml0ZV91bmxvY2tfYmgoJnF1ZXVlX2xvY2spOworCQkJUkNWX1NLQl9GQUlMKC1FQlVTWSk7CisJCX0KKwl9IGVsc2UgeworCQluZXRfZW5hYmxlX3RpbWVzdGFtcCgpOworCQlwZWVyX3BpZCA9IHBpZDsKKwl9CisJCQorCXdyaXRlX3VubG9ja19iaCgmcXVldWVfbG9jayk7CisJCisJc3RhdHVzID0gaXBxX3JlY2VpdmVfcGVlcihOTE1TR19EQVRBKG5saCksIHR5cGUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICBza2JsZW4gLSBOTE1TR19MRU5HVEgoMCkpOworCWlmIChzdGF0dXMgPCAwKQorCQlSQ1ZfU0tCX0ZBSUwoc3RhdHVzKTsKKwkJCisJaWYgKGZsYWdzICYgTkxNX0ZfQUNLKQorCQluZXRsaW5rX2Fjayhza2IsIG5saCwgMCk7CisgICAgICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2lwcV9yY3Zfc2soc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuKQoreworCWRvIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQlpZiAoZG93bl90cnlsb2NrKCZpcHFubF9zZW0pKQorCQkJcmV0dXJuOworCQkJCisJCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSkgIT0gTlVMTCkgeworCQkJaXBxX3Jjdl9za2Ioc2tiKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQl9CisJCQorCQl1cCgmaXBxbmxfc2VtKTsKKworCX0gd2hpbGUgKGlwcW5sICYmIGlwcW5sLT5za19yZWNlaXZlX3F1ZXVlLnFsZW4pOworfQorCitzdGF0aWMgaW50CitpcHFfcmN2X2Rldl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHB0cjsKKworCS8qIERyb3AgYW55IHBhY2tldHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkb3duZWQgZGV2aWNlICovCisJaWYgKGV2ZW50ID09IE5FVERFVl9ET1dOKQorCQlpcHFfZGV2X2Ryb3AoZGV2LT5pZmluZGV4KTsKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaXBxX2Rldl9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbAk9IGlwcV9yY3ZfZGV2X2V2ZW50LAorfTsKKworc3RhdGljIGludAoraXBxX3Jjdl9ubF9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgbmV0bGlua19ub3RpZnkgKm4gPSBwdHI7CisKKwlpZiAoZXZlbnQgPT0gTkVUTElOS19VUkVMRUFTRSAmJgorCSAgICBuLT5wcm90b2NvbCA9PSBORVRMSU5LX0ZJUkVXQUxMICYmIG4tPnBpZCkgeworCQl3cml0ZV9sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKwkJaWYgKG4tPnBpZCA9PSBwZWVyX3BpZCkKKwkJCV9faXBxX3Jlc2V0KCk7CisJCXdyaXRlX3VubG9ja19iaCgmcXVldWVfbG9jayk7CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBpcHFfbmxfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwJPSBpcHFfcmN2X25sX2V2ZW50LAorfTsKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICppcHFfc3lzY3RsX2hlYWRlcjsKKworc3RhdGljIGN0bF90YWJsZSBpcHFfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFFfUU1BWCwKKwkJLnByb2NuYW1lCT0gTkVUX0lQUV9RTUFYX05BTUUsCisJCS5kYXRhCQk9ICZxdWV1ZV9tYXhsZW4sCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHF1ZXVlX21heGxlbiksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjCisJfSwKKyAJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3N0YXRpYyBjdGxfdGFibGUgaXBxX2Rpcl90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjQsCisJCS5wcm9jbmFtZQk9ICJpcHY0IiwKKwkJLm1vZGUJCT0gMDU1NSwKKwkJLmNoaWxkCQk9IGlwcV90YWJsZQorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3N0YXRpYyBjdGxfdGFibGUgaXBxX3Jvb3RfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9ORVQsCisJCS5wcm9jbmFtZQk9ICJuZXQiLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gaXBxX2Rpcl90YWJsZQorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIGludAoraXBxX2dldF9pbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgpCit7CisJaW50IGxlbjsKKworCXJlYWRfbG9ja19iaCgmcXVldWVfbG9jayk7CisJCisJbGVuID0gc3ByaW50ZihidWZmZXIsCisJICAgICAgICAgICAgICAiUGVlciBQSUQgICAgICAgICAgOiAlZFxuIgorCSAgICAgICAgICAgICAgIkNvcHkgbW9kZSAgICAgICAgIDogJWh1XG4iCisJICAgICAgICAgICAgICAiQ29weSByYW5nZSAgICAgICAgOiAldVxuIgorCSAgICAgICAgICAgICAgIlF1ZXVlIGxlbmd0aCAgICAgIDogJXVcbiIKKwkgICAgICAgICAgICAgICJRdWV1ZSBtYXguIGxlbmd0aCA6ICV1XG4iCisJCSAgICAgICJRdWV1ZSBkcm9wcGVkICAgICA6ICV1XG4iCisJCSAgICAgICJOZXRsaW5rIGRyb3BwZWQgICA6ICV1XG4iLAorCSAgICAgICAgICAgICAgcGVlcl9waWQsCisJICAgICAgICAgICAgICBjb3B5X21vZGUsCisJICAgICAgICAgICAgICBjb3B5X3JhbmdlLAorCSAgICAgICAgICAgICAgcXVldWVfdG90YWwsCisJICAgICAgICAgICAgICBxdWV1ZV9tYXhsZW4sCisJCSAgICAgIHF1ZXVlX2Ryb3BwZWQsCisJCSAgICAgIHF1ZXVlX3VzZXJfZHJvcHBlZCk7CisKKwlyZWFkX3VubG9ja19iaCgmcXVldWVfbG9jayk7CisJCisJKnN0YXJ0ID0gYnVmZmVyICsgb2Zmc2V0OworCWxlbiAtPSBvZmZzZXQ7CisJaWYgKGxlbiA+IGxlbmd0aCkKKwkJbGVuID0gbGVuZ3RoOworCWVsc2UgaWYgKGxlbiA8IDApCisJCWxlbiA9IDA7CisJcmV0dXJuIGxlbjsKK30KKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCitzdGF0aWMgaW50Citpbml0X29yX2NsZWFudXAoaW50IGluaXQpCit7CisJaW50IHN0YXR1cyA9IC1FTk9NRU07CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jOworCQorCWlmICghaW5pdCkKKwkJZ290byBjbGVhbnVwOworCisJbmV0bGlua19yZWdpc3Rlcl9ub3RpZmllcigmaXBxX25sX25vdGlmaWVyKTsKKwlpcHFubCA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShORVRMSU5LX0ZJUkVXQUxMLCBpcHFfcmN2X3NrKTsKKwlpZiAoaXBxbmwgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImlwX3F1ZXVlOiBmYWlsZWQgdG8gY3JlYXRlIG5ldGxpbmsgc29ja2V0XG4iKTsKKwkJZ290byBjbGVhbnVwX25ldGxpbmtfbm90aWZpZXI7CisJfQorCisJcHJvYyA9IHByb2NfbmV0X2NyZWF0ZShJUFFfUFJPQ19GU19OQU1FLCAwLCBpcHFfZ2V0X2luZm8pOworCWlmIChwcm9jKQorCQlwcm9jLT5vd25lciA9IFRISVNfTU9EVUxFOworCWVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgImlwX3F1ZXVlOiBmYWlsZWQgdG8gY3JlYXRlIHByb2MgZW50cnlcbiIpOworCQlnb3RvIGNsZWFudXBfaXBxbmw7CisJfQorCQorCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmaXBxX2Rldl9ub3RpZmllcik7CisJaXBxX3N5c2N0bF9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUoaXBxX3Jvb3RfdGFibGUsIDApOworCQorCXN0YXR1cyA9IG5mX3JlZ2lzdGVyX3F1ZXVlX2hhbmRsZXIoUEZfSU5FVCwgaXBxX2VucXVldWVfcGFja2V0LCBOVUxMKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImlwX3F1ZXVlOiBmYWlsZWQgdG8gcmVnaXN0ZXIgcXVldWUgaGFuZGxlclxuIik7CisJCWdvdG8gY2xlYW51cF9zeXNjdGw7CisJfQorCXJldHVybiBzdGF0dXM7CisKK2NsZWFudXA6CisJbmZfdW5yZWdpc3Rlcl9xdWV1ZV9oYW5kbGVyKFBGX0lORVQpOworCXN5bmNocm9uaXplX25ldCgpOworCWlwcV9mbHVzaChORl9EUk9QKTsKKwkKK2NsZWFudXBfc3lzY3RsOgorCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGlwcV9zeXNjdGxfaGVhZGVyKTsKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmaXBxX2Rldl9ub3RpZmllcik7CisJcHJvY19uZXRfcmVtb3ZlKElQUV9QUk9DX0ZTX05BTUUpOworCQorY2xlYW51cF9pcHFubDoKKwlzb2NrX3JlbGVhc2UoaXBxbmwtPnNrX3NvY2tldCk7CisJZG93bigmaXBxbmxfc2VtKTsKKwl1cCgmaXBxbmxfc2VtKTsKKwkKK2NsZWFudXBfbmV0bGlua19ub3RpZmllcjoKKwluZXRsaW5rX3VucmVnaXN0ZXJfbm90aWZpZXIoJmlwcV9ubF9ub3RpZmllcik7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCQorCXJldHVybiBpbml0X29yX2NsZWFudXAoMSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaW5pdF9vcl9jbGVhbnVwKDApOworfQorCitNT0RVTEVfREVTQ1JJUFRJT04oIklQdjQgcGFja2V0IHF1ZXVlIGhhbmRsZXIiKTsKK01PRFVMRV9BVVRIT1IoIkphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNTRmOTIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMKQEAgLTAsMCArMSwxOTY0IEBACisvKgorICogUGFja2V0IG1hdGNoaW5nIGNvZGUuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IFBhdWwgYFJ1c3R5JyBSdXNzZWxsICYgTWljaGFlbCBKLiBOZXVsaW5nCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogMTkgSmFuIDIwMDIgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIAktIGluY3JlYXNlIG1vZHVsZSB1c2FnZSBjb3VudCBhcyBzb29uIGFzIHdlIGhhdmUgcnVsZXMgaW5zaWRlCisgKiAJICBhIHRhYmxlCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvaWNtcC5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJUHY0IHBhY2tldCBmaWx0ZXIiKTsKKworLyojZGVmaW5lIERFQlVHX0lQX0ZJUkVXQUxMKi8KKy8qI2RlZmluZSBERUJVR19BTExPV19BTEwqLyAvKiBVc2VmdWwgZm9yIHJlbW90ZSBkZWJ1Z2dpbmcgKi8KKy8qI2RlZmluZSBERUJVR19JUF9GSVJFV0FMTF9VU0VSKi8KKworI2lmZGVmIERFQlVHX0lQX0ZJUkVXQUxMCisjZGVmaW5lIGRwcmludGYoZm9ybWF0LCBhcmdzLi4uKSAgcHJpbnRrKGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBkcHJpbnRmKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfSVBfRklSRVdBTExfVVNFUgorI2RlZmluZSBkdXByaW50Zihmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgZHVwcmludGYoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCisjZGVmaW5lIElQX05GX0FTU0VSVCh4KQkJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlpZiAoISh4KSkJCQkJCQlcCisJCXByaW50aygiSVBfTkZfQVNTRVJUOiAlczolczoldVxuIiwJCVwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgX19GSUxFX18sIF9fTElORV9fKTsJXAorfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgSVBfTkZfQVNTRVJUKHgpCisjZW5kaWYKKyNkZWZpbmUgU01QX0FMSUdOKHgpICgoKHgpICsgU01QX0NBQ0hFX0JZVEVTLTEpICYgfihTTVBfQ0FDSEVfQllURVMtMSkpCisKK3N0YXRpYyBERUNMQVJFX01VVEVYKGlwdF9tdXRleCk7CisKKy8qIE11c3QgaGF2ZSBtdXRleCAqLworI2RlZmluZSBBU1NFUlRfUkVBRF9MT0NLKHgpIElQX05GX0FTU0VSVChkb3duX3RyeWxvY2soJmlwdF9tdXRleCkgIT0gMCkKKyNkZWZpbmUgQVNTRVJUX1dSSVRFX0xPQ0soeCkgSVBfTkZfQVNTRVJUKGRvd25fdHJ5bG9jaygmaXB0X211dGV4KSAhPSAwKQorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2xvY2toZWxwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvbGlzdGhlbHAuaD4KKworI2lmIDAKKy8qIEFsbCB0aGUgYmV0dGVyIHRvIGRlYnVnIHlvdSB3aXRoLi4uICovCisjZGVmaW5lIHN0YXRpYworI2RlZmluZSBpbmxpbmUKKyNlbmRpZgorCisvKgorICAgV2Uga2VlcCBhIHNldCBvZiBydWxlcyBmb3IgZWFjaCBDUFUsIHNvIHdlIGNhbiBhdm9pZCB3cml0ZS1sb2NraW5nCisgICB0aGVtIGluIHRoZSBzb2Z0aXJxIHdoZW4gdXBkYXRpbmcgdGhlIGNvdW50ZXJzIGFuZCB0aGVyZWZvcmUKKyAgIG9ubHkgbmVlZCB0byByZWFkLWxvY2sgaW4gdGhlIHNvZnRpcnE7IGRvaW5nIGEgd3JpdGVfbG9ja19iaCgpIGluIHVzZXIKKyAgIGNvbnRleHQgc3RvcHMgcGFja2V0cyBjb21pbmcgdGhyb3VnaCBhbmQgYWxsb3dzIHVzZXIgY29udGV4dCB0byByZWFkCisgICB0aGUgY291bnRlcnMgb3IgdXBkYXRlIHRoZSBydWxlcy4KKworICAgVG8gYmUgY2FjaGUgZnJpZW5kbHkgb24gU01QLCB3ZSBhcnJhbmdlIHRoZW0gbGlrZSBzbzoKKyAgIFsgbi1lbnRyaWVzIF0KKyAgIC4uLiBjYWNoZS1hbGlnbiBwYWRkaW5nIC4uLgorICAgWyBuLWVudHJpZXMgXQorCisgICBIZW5jZSB0aGUgc3RhcnQgb2YgYW55IHRhYmxlIGlzIGdpdmVuIGJ5IGdldF90YWJsZSgpIGJlbG93LiAgKi8KKworLyogVGhlIHRhYmxlIGl0c2VsZiAqLworc3RydWN0IGlwdF90YWJsZV9pbmZvCit7CisJLyogU2l6ZSBwZXIgdGFibGUgKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwkvKiBOdW1iZXIgb2YgZW50cmllczogRklYTUUuIC0tUlIgKi8KKwl1bnNpZ25lZCBpbnQgbnVtYmVyOworCS8qIEluaXRpYWwgbnVtYmVyIG9mIGVudHJpZXMuIE5lZWRlZCBmb3IgbW9kdWxlIHVzYWdlIGNvdW50ICovCisJdW5zaWduZWQgaW50IGluaXRpYWxfZW50cmllczsKKworCS8qIEVudHJ5IHBvaW50cyBhbmQgdW5kZXJmbG93cyAqLworCXVuc2lnbmVkIGludCBob29rX2VudHJ5W05GX0lQX05VTUhPT0tTXTsKKwl1bnNpZ25lZCBpbnQgdW5kZXJmbG93W05GX0lQX05VTUhPT0tTXTsKKworCS8qIGlwdF9lbnRyeSB0YWJsZXM6IG9uZSBwZXIgQ1BVICovCisJY2hhciBlbnRyaWVzWzBdIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKK307CisKK3N0YXRpYyBMSVNUX0hFQUQoaXB0X3RhcmdldCk7CitzdGF0aWMgTElTVF9IRUFEKGlwdF9tYXRjaCk7CitzdGF0aWMgTElTVF9IRUFEKGlwdF90YWJsZXMpOworI2RlZmluZSBBRERfQ09VTlRFUihjLGIscCkgZG8geyAoYykuYmNudCArPSAoYik7IChjKS5wY250ICs9IChwKTsgfSB3aGlsZSgwKQorCisjaWZkZWYgQ09ORklHX1NNUAorI2RlZmluZSBUQUJMRV9PRkZTRVQodCxwKSAoU01QX0FMSUdOKCh0KS0+c2l6ZSkqKHApKQorI2Vsc2UKKyNkZWZpbmUgVEFCTEVfT0ZGU0VUKHQscCkgMAorI2VuZGlmCisKKyNpZiAwCisjZGVmaW5lIGRvd24oeCkgZG8geyBwcmludGsoIkRPV046JXU6IiAjeCAiXG4iLCBfX0xJTkVfXyk7IGRvd24oeCk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgZG93bl9pbnRlcnJ1cHRpYmxlKHgpICh7IGludCBfX3I7IHByaW50aygiRE9XTmk6JXU6IiAjeCAiXG4iLCBfX0xJTkVfXyk7IF9fciA9IGRvd25faW50ZXJydXB0aWJsZSh4KTsgaWYgKF9fciAhPSAwKSBwcmludGsoIkFCT1JULURPV05pOiV1XG4iLCBfX0xJTkVfXyk7IF9fcjsgfSkKKyNkZWZpbmUgdXAoeCkgZG8geyBwcmludGsoIlVQOiV1OiIgI3ggIlxuIiwgX19MSU5FX18pOyB1cCh4KTsgfSB3aGlsZSgwKQorI2VuZGlmCisKKy8qIFJldHVybnMgd2hldGhlciBtYXRjaGVzIHJ1bGUgb3Igbm90LiAqLworc3RhdGljIGlubGluZSBpbnQKK2lwX3BhY2tldF9tYXRjaChjb25zdCBzdHJ1Y3QgaXBoZHIgKmlwLAorCQljb25zdCBjaGFyICppbmRldiwKKwkJY29uc3QgY2hhciAqb3V0ZGV2LAorCQljb25zdCBzdHJ1Y3QgaXB0X2lwICppcGluZm8sCisJCWludCBpc2ZyYWcpCit7CisJc2l6ZV90IGk7CisJdW5zaWduZWQgbG9uZyByZXQ7CisKKyNkZWZpbmUgRldJTlYoYm9vbCxpbnZmbGcpICgoYm9vbCkgXiAhIShpcGluZm8tPmludmZsYWdzICYgaW52ZmxnKSkKKworCWlmIChGV0lOVigoaXAtPnNhZGRyJmlwaW5mby0+c21zay5zX2FkZHIpICE9IGlwaW5mby0+c3JjLnNfYWRkciwKKwkJICBJUFRfSU5WX1NSQ0lQKQorCSAgICB8fCBGV0lOVigoaXAtPmRhZGRyJmlwaW5mby0+ZG1zay5zX2FkZHIpICE9IGlwaW5mby0+ZHN0LnNfYWRkciwKKwkJICAgICBJUFRfSU5WX0RTVElQKSkgeworCQlkcHJpbnRmKCJTb3VyY2Ugb3IgZGVzdCBtaXNtYXRjaC5cbiIpOworCisJCWRwcmludGYoIlNSQzogJXUuJXUuJXUuJXUuIE1hc2s6ICV1LiV1LiV1LiV1LiBUYXJnZXQ6ICV1LiV1LiV1LiV1LiVzXG4iLAorCQkJTklQUVVBRChpcC0+c2FkZHIpLAorCQkJTklQUVVBRChpcGluZm8tPnNtc2suc19hZGRyKSwKKwkJCU5JUFFVQUQoaXBpbmZvLT5zcmMuc19hZGRyKSwKKwkJCWlwaW5mby0+aW52ZmxhZ3MgJiBJUFRfSU5WX1NSQ0lQID8gIiAoSU5WKSIgOiAiIik7CisJCWRwcmludGYoIkRTVDogJXUuJXUuJXUuJXUgTWFzazogJXUuJXUuJXUuJXUgVGFyZ2V0OiAldS4ldS4ldS4ldS4lc1xuIiwKKwkJCU5JUFFVQUQoaXAtPmRhZGRyKSwKKwkJCU5JUFFVQUQoaXBpbmZvLT5kbXNrLnNfYWRkciksCisJCQlOSVBRVUFEKGlwaW5mby0+ZHN0LnNfYWRkciksCisJCQlpcGluZm8tPmludmZsYWdzICYgSVBUX0lOVl9EU1RJUCA/ICIgKElOVikiIDogIiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBMb29rIGZvciBpZm5hbWUgbWF0Y2hlczsgdGhpcyBzaG91bGQgdW5yb2xsIG5pY2VseS4gKi8KKwlmb3IgKGkgPSAwLCByZXQgPSAwOyBpIDwgSUZOQU1TSVovc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOyBpKyspIHsKKwkJcmV0IHw9ICgoKGNvbnN0IHVuc2lnbmVkIGxvbmcgKilpbmRldilbaV0KKwkJCV4gKChjb25zdCB1bnNpZ25lZCBsb25nICopaXBpbmZvLT5pbmlmYWNlKVtpXSkKKwkJCSYgKChjb25zdCB1bnNpZ25lZCBsb25nICopaXBpbmZvLT5pbmlmYWNlX21hc2spW2ldOworCX0KKworCWlmIChGV0lOVihyZXQgIT0gMCwgSVBUX0lOVl9WSUFfSU4pKSB7CisJCWRwcmludGYoIlZJQSBpbiBtaXNtYXRjaCAoJXMgdnMgJXMpLiVzXG4iLAorCQkJaW5kZXYsIGlwaW5mby0+aW5pZmFjZSwKKwkJCWlwaW5mby0+aW52ZmxhZ3MmSVBUX0lOVl9WSUFfSU4gPyIgKElOVikiOiIiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMCwgcmV0ID0gMDsgaSA8IElGTkFNU0laL3NpemVvZih1bnNpZ25lZCBsb25nKTsgaSsrKSB7CisJCXJldCB8PSAoKChjb25zdCB1bnNpZ25lZCBsb25nICopb3V0ZGV2KVtpXQorCQkJXiAoKGNvbnN0IHVuc2lnbmVkIGxvbmcgKilpcGluZm8tPm91dGlmYWNlKVtpXSkKKwkJCSYgKChjb25zdCB1bnNpZ25lZCBsb25nICopaXBpbmZvLT5vdXRpZmFjZV9tYXNrKVtpXTsKKwl9CisKKwlpZiAoRldJTlYocmV0ICE9IDAsIElQVF9JTlZfVklBX09VVCkpIHsKKwkJZHByaW50ZigiVklBIG91dCBtaXNtYXRjaCAoJXMgdnMgJXMpLiVzXG4iLAorCQkJb3V0ZGV2LCBpcGluZm8tPm91dGlmYWNlLAorCQkJaXBpbmZvLT5pbnZmbGFncyZJUFRfSU5WX1ZJQV9PVVQgPyIgKElOVikiOiIiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ2hlY2sgc3BlY2lmaWMgcHJvdG9jb2wgKi8KKwlpZiAoaXBpbmZvLT5wcm90bworCSAgICAmJiBGV0lOVihpcC0+cHJvdG9jb2wgIT0gaXBpbmZvLT5wcm90bywgSVBUX0lOVl9QUk9UTykpIHsKKwkJZHByaW50ZigiUGFja2V0IHByb3RvY29sICVoaSBkb2VzIG5vdCBtYXRjaCAlaGkuJXNcbiIsCisJCQlpcC0+cHJvdG9jb2wsIGlwaW5mby0+cHJvdG8sCisJCQlpcGluZm8tPmludmZsYWdzJklQVF9JTlZfUFJPVE8gPyAiIChJTlYpIjoiIik7CisJCXJldHVybiAwOworCX0KKworCS8qIElmIHdlIGhhdmUgYSBmcmFnbWVudCBydWxlIGJ1dCB0aGUgcGFja2V0IGlzIG5vdCBhIGZyYWdtZW50CisJICogdGhlbiB3ZSByZXR1cm4gemVybyAqLworCWlmIChGV0lOVigoaXBpbmZvLT5mbGFncyZJUFRfRl9GUkFHKSAmJiAhaXNmcmFnLCBJUFRfSU5WX0ZSQUcpKSB7CisJCWRwcmludGYoIkZyYWdtZW50IHJ1bGUgYnV0IG5vdCBmcmFnbWVudC4lc1xuIiwKKwkJCWlwaW5mby0+aW52ZmxhZ3MgJiBJUFRfSU5WX0ZSQUcgPyAiIChJTlYpIiA6ICIiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitpcF9jaGVja2VudHJ5KGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwKQoreworCWlmIChpcC0+ZmxhZ3MgJiB+SVBUX0ZfTUFTSykgeworCQlkdXByaW50ZigiVW5rbm93biBmbGFnIGJpdHMgc2V0OiAlMDhYXG4iLAorCQkJIGlwLT5mbGFncyAmIH5JUFRfRl9NQVNLKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChpcC0+aW52ZmxhZ3MgJiB+SVBUX0lOVl9NQVNLKSB7CisJCWR1cHJpbnRmKCJVbmtub3duIGludmZsYWcgYml0cyBzZXQ6ICUwOFhcbiIsCisJCQkgaXAtPmludmZsYWdzICYgfklQVF9JTlZfTUFTSyk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAoraXB0X2Vycm9yKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJICB1bnNpZ25lZCBpbnQgaG9va251bSwKKwkgIGNvbnN0IHZvaWQgKnRhcmdpbmZvLAorCSAgdm9pZCAqdXNlcmluZm8pCit7CisJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJcHJpbnRrKCJpcF90YWJsZXM6IGVycm9yOiBgJXMnXG4iLCAoY2hhciAqKXRhcmdpbmZvKTsKKworCXJldHVybiBORl9EUk9QOworfQorCitzdGF0aWMgaW5saW5lCitpbnQgZG9fbWF0Y2goc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqbSwKKwkgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSAgICAgaW50IG9mZnNldCwKKwkgICAgIGludCAqaG90ZHJvcCkKK3sKKwkvKiBTdG9wIGl0ZXJhdGlvbiBpZiBpdCBkb2Vzbid0IG1hdGNoICovCisJaWYgKCFtLT51Lmtlcm5lbC5tYXRjaC0+bWF0Y2goc2tiLCBpbiwgb3V0LCBtLT5kYXRhLCBvZmZzZXQsIGhvdGRyb3ApKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpcHRfZW50cnkgKgorZ2V0X2VudHJ5KHZvaWQgKmJhc2UsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJcmV0dXJuIChzdHJ1Y3QgaXB0X2VudHJ5ICopKGJhc2UgKyBvZmZzZXQpOworfQorCisvKiBSZXR1cm5zIG9uZSBvZiB0aGUgZ2VuZXJpYyBmaXJld2FsbCBwb2xpY2llcywgbGlrZSBORl9BQ0NFUFQuICovCit1bnNpZ25lZCBpbnQKK2lwdF9kb190YWJsZShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJICAgICB1bnNpZ25lZCBpbnQgaG9vaywKKwkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJICAgICBzdHJ1Y3QgaXB0X3RhYmxlICp0YWJsZSwKKwkgICAgIHZvaWQgKnVzZXJkYXRhKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG51bGxkZXZuYW1lW0lGTkFNU0laXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKHNpemVvZihsb25nKSkpKTsKKwl1X2ludDE2X3Qgb2Zmc2V0OworCXN0cnVjdCBpcGhkciAqaXA7CisJdV9pbnQxNl90IGRhdGFsZW47CisJaW50IGhvdGRyb3AgPSAwOworCS8qIEluaXRpYWxpemluZyB2ZXJkaWN0IHRvIE5GX0RST1Aga2VlcHMgZ2NjIGhhcHB5LiAqLworCXVuc2lnbmVkIGludCB2ZXJkaWN0ID0gTkZfRFJPUDsKKwljb25zdCBjaGFyICppbmRldiwgKm91dGRldjsKKwl2b2lkICp0YWJsZV9iYXNlOworCXN0cnVjdCBpcHRfZW50cnkgKmUsICpiYWNrOworCisJLyogSW5pdGlhbGl6YXRpb24gKi8KKwlpcCA9ICgqcHNrYiktPm5oLmlwaDsKKwlkYXRhbGVuID0gKCpwc2tiKS0+bGVuIC0gaXAtPmlobCAqIDQ7CisJaW5kZXYgPSBpbiA/IGluLT5uYW1lIDogbnVsbGRldm5hbWU7CisJb3V0ZGV2ID0gb3V0ID8gb3V0LT5uYW1lIDogbnVsbGRldm5hbWU7CisJLyogV2UgaGFuZGxlIGZyYWdtZW50cyBieSBkZWFsaW5nIHdpdGggdGhlIGZpcnN0IGZyYWdtZW50IGFzCisJICogaWYgaXQgd2FzIGEgbm9ybWFsIHBhY2tldC4gIEFsbCBvdGhlciBmcmFnbWVudHMgYXJlIHRyZWF0ZWQKKwkgKiBub3JtYWxseSwgZXhjZXB0IHRoYXQgdGhleSB3aWxsIE5FVkVSIG1hdGNoIHJ1bGVzIHRoYXQgYXNrCisJICogdGhpbmdzIHdlIGRvbid0IGtub3csIGllLiB0Y3Agc3luIGZsYWcgb3IgcG9ydHMpLiAgSWYgdGhlCisJICogcnVsZSBpcyBhbHNvIGEgZnJhZ21lbnQtc3BlY2lmaWMgcnVsZSwgbm9uLWZyYWdtZW50cyB3b24ndAorCSAqIG1hdGNoIGl0LiAqLworCW9mZnNldCA9IG50b2hzKGlwLT5mcmFnX29mZikgJiBJUF9PRkZTRVQ7CisKKwlyZWFkX2xvY2tfYmgoJnRhYmxlLT5sb2NrKTsKKwlJUF9ORl9BU1NFUlQodGFibGUtPnZhbGlkX2hvb2tzICYgKDEgPDwgaG9vaykpOworCXRhYmxlX2Jhc2UgPSAodm9pZCAqKXRhYmxlLT5wcml2YXRlLT5lbnRyaWVzCisJCSsgVEFCTEVfT0ZGU0VUKHRhYmxlLT5wcml2YXRlLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCWUgPSBnZXRfZW50cnkodGFibGVfYmFzZSwgdGFibGUtPnByaXZhdGUtPmhvb2tfZW50cnlbaG9va10pOworCisjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRworCS8qIENoZWNrIG5vb25lIGVsc2UgdXNpbmcgb3VyIHRhYmxlICovCisJaWYgKCgoc3RydWN0IGlwdF9lbnRyeSAqKXRhYmxlX2Jhc2UpLT5jb21lZnJvbSAhPSAweGRlYWQ1N2FjCisJICAgICYmICgoc3RydWN0IGlwdF9lbnRyeSAqKXRhYmxlX2Jhc2UpLT5jb21lZnJvbSAhPSAweGVlZWVlZWVjKSB7CisJCXByaW50aygiQVNTRVJUOiBDUFUgIyV1LCAlcyBjb21lZnJvbSglcCkgPSAlWFxuIiwKKwkJICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSwKKwkJICAgICAgIHRhYmxlLT5uYW1lLAorCQkgICAgICAgJigoc3RydWN0IGlwdF9lbnRyeSAqKXRhYmxlX2Jhc2UpLT5jb21lZnJvbSwKKwkJICAgICAgICgoc3RydWN0IGlwdF9lbnRyeSAqKXRhYmxlX2Jhc2UpLT5jb21lZnJvbSk7CisJfQorCSgoc3RydWN0IGlwdF9lbnRyeSAqKXRhYmxlX2Jhc2UpLT5jb21lZnJvbSA9IDB4NTdhY2MwMDE7CisjZW5kaWYKKworCS8qIEZvciByZXR1cm4gZnJvbSBidWlsdGluIGNoYWluICovCisJYmFjayA9IGdldF9lbnRyeSh0YWJsZV9iYXNlLCB0YWJsZS0+cHJpdmF0ZS0+dW5kZXJmbG93W2hvb2tdKTsKKworCWRvIHsKKwkJSVBfTkZfQVNTRVJUKGUpOworCQlJUF9ORl9BU1NFUlQoYmFjayk7CisJCSgqcHNrYiktPm5mY2FjaGUgfD0gZS0+bmZjYWNoZTsKKwkJaWYgKGlwX3BhY2tldF9tYXRjaChpcCwgaW5kZXYsIG91dGRldiwgJmUtPmlwLCBvZmZzZXQpKSB7CisJCQlzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdDsKKworCQkJaWYgKElQVF9NQVRDSF9JVEVSQVRFKGUsIGRvX21hdGNoLAorCQkJCQkgICAgICAqcHNrYiwgaW4sIG91dCwKKwkJCQkJICAgICAgb2Zmc2V0LCAmaG90ZHJvcCkgIT0gMCkKKwkJCQlnb3RvIG5vX21hdGNoOworCisJCQlBRERfQ09VTlRFUihlLT5jb3VudGVycywgbnRvaHMoaXAtPnRvdF9sZW4pLCAxKTsKKworCQkJdCA9IGlwdF9nZXRfdGFyZ2V0KGUpOworCQkJSVBfTkZfQVNTRVJUKHQtPnUua2VybmVsLnRhcmdldCk7CisJCQkvKiBTdGFuZGFyZCB0YXJnZXQ/ICovCisJCQlpZiAoIXQtPnUua2VybmVsLnRhcmdldC0+dGFyZ2V0KSB7CisJCQkJaW50IHY7CisKKwkJCQl2ID0gKChzdHJ1Y3QgaXB0X3N0YW5kYXJkX3RhcmdldCAqKXQpLT52ZXJkaWN0OworCQkJCWlmICh2IDwgMCkgeworCQkJCQkvKiBQb3AgZnJvbSBzdGFjaz8gKi8KKwkJCQkJaWYgKHYgIT0gSVBUX1JFVFVSTikgeworCQkJCQkJdmVyZGljdCA9ICh1bnNpZ25lZCkoLXYpIC0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWUgPSBiYWNrOworCQkJCQliYWNrID0gZ2V0X2VudHJ5KHRhYmxlX2Jhc2UsCisJCQkJCQkJIGJhY2stPmNvbWVmcm9tKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmICh0YWJsZV9iYXNlICsgdgorCQkJCSAgICAhPSAodm9pZCAqKWUgKyBlLT5uZXh0X29mZnNldCkgeworCQkJCQkvKiBTYXZlIG9sZCBiYWNrIHB0ciBpbiBuZXh0IGVudHJ5ICovCisJCQkJCXN0cnVjdCBpcHRfZW50cnkgKm5leHQKKwkJCQkJCT0gKHZvaWQgKillICsgZS0+bmV4dF9vZmZzZXQ7CisJCQkJCW5leHQtPmNvbWVmcm9tCisJCQkJCQk9ICh2b2lkICopYmFjayAtIHRhYmxlX2Jhc2U7CisJCQkJCS8qIHNldCBiYWNrIHBvaW50ZXIgdG8gbmV4dCBlbnRyeSAqLworCQkJCQliYWNrID0gbmV4dDsKKwkJCQl9CisKKwkJCQllID0gZ2V0X2VudHJ5KHRhYmxlX2Jhc2UsIHYpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBUYXJnZXRzIHdoaWNoIHJlZW50ZXIgbXVzdCByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzLiB2ZXJkaWN0cyAqLworI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKKwkJCQkoKHN0cnVjdCBpcHRfZW50cnkgKil0YWJsZV9iYXNlKS0+Y29tZWZyb20KKwkJCQkJPSAweGVlZWVlZWVjOworI2VuZGlmCisJCQkJdmVyZGljdCA9IHQtPnUua2VybmVsLnRhcmdldC0+dGFyZ2V0KHBza2IsCisJCQkJCQkJCSAgICAgaW4sIG91dCwKKwkJCQkJCQkJICAgICBob29rLAorCQkJCQkJCQkgICAgIHQtPmRhdGEsCisJCQkJCQkJCSAgICAgdXNlcmRhdGEpOworCisjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRworCQkJCWlmICgoKHN0cnVjdCBpcHRfZW50cnkgKil0YWJsZV9iYXNlKS0+Y29tZWZyb20KKwkJCQkgICAgIT0gMHhlZWVlZWVlYworCQkJCSAgICAmJiB2ZXJkaWN0ID09IElQVF9DT05USU5VRSkgeworCQkJCQlwcmludGsoIlRhcmdldCAlcyByZWVudGVyZWQhXG4iLAorCQkJCQkgICAgICAgdC0+dS5rZXJuZWwudGFyZ2V0LT5uYW1lKTsKKwkJCQkJdmVyZGljdCA9IE5GX0RST1A7CisJCQkJfQorCQkJCSgoc3RydWN0IGlwdF9lbnRyeSAqKXRhYmxlX2Jhc2UpLT5jb21lZnJvbQorCQkJCQk9IDB4NTdhY2MwMDE7CisjZW5kaWYKKwkJCQkvKiBUYXJnZXQgbWlnaHQgaGF2ZSBjaGFuZ2VkIHN0dWZmLiAqLworCQkJCWlwID0gKCpwc2tiKS0+bmguaXBoOworCQkJCWRhdGFsZW4gPSAoKnBza2IpLT5sZW4gLSBpcC0+aWhsICogNDsKKworCQkJCWlmICh2ZXJkaWN0ID09IElQVF9DT05USU5VRSkKKwkJCQkJZSA9ICh2b2lkICopZSArIGUtPm5leHRfb2Zmc2V0OworCQkJCWVsc2UKKwkJCQkJLyogVmVyZGljdCAqLworCQkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKworCQlub19tYXRjaDoKKwkJCWUgPSAodm9pZCAqKWUgKyBlLT5uZXh0X29mZnNldDsKKwkJfQorCX0gd2hpbGUgKCFob3Rkcm9wKTsKKworI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKKwkoKHN0cnVjdCBpcHRfZW50cnkgKil0YWJsZV9iYXNlKS0+Y29tZWZyb20gPSAweGRlYWQ1N2FjOworI2VuZGlmCisJcmVhZF91bmxvY2tfYmgoJnRhYmxlLT5sb2NrKTsKKworI2lmZGVmIERFQlVHX0FMTE9XX0FMTAorCXJldHVybiBORl9BQ0NFUFQ7CisjZWxzZQorCWlmIChob3Rkcm9wKQorCQlyZXR1cm4gTkZfRFJPUDsKKwllbHNlIHJldHVybiB2ZXJkaWN0OworI2VuZGlmCit9CisKKy8qCisgKiBUaGVzZSBhcmUgd2VpcmQsIGJ1dCBtb2R1bGUgbG9hZGluZyBtdXN0IG5vdCBiZSBkb25lIHdpdGggbXV0ZXgKKyAqIGhlbGQgKHNpbmNlIHRoZXkgd2lsbCByZWdpc3RlciksIGFuZCB3ZSBoYXZlIHRvIGhhdmUgYSBzaW5nbGUKKyAqIGZ1bmN0aW9uIHRvIHVzZSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSgpLgorICovCisKKy8qIEZpbmQgdGFibGUgYnkgbmFtZSwgZ3JhYnMgbXV0ZXggJiByZWYuICBSZXR1cm5zIEVSUl9QVFIoKSBvbiBlcnJvci4gKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwdF90YWJsZSAqZmluZF90YWJsZV9sb2NrKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGlwdF90YWJsZSAqdDsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmlwdF9tdXRleCkgIT0gMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlRSKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJmlwdF90YWJsZXMsIGxpc3QpCisJCWlmIChzdHJjbXAodC0+bmFtZSwgbmFtZSkgPT0gMCAmJiB0cnlfbW9kdWxlX2dldCh0LT5tZSkpCisJCQlyZXR1cm4gdDsKKwl1cCgmaXB0X211dGV4KTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogRmluZCBtYXRjaCwgZ3JhYnMgcmVmLiAgUmV0dXJucyBFUlJfUFRSKCkgb24gZXJyb3IuICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpcHRfbWF0Y2ggKmZpbmRfbWF0Y2goY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24pCit7CisJc3RydWN0IGlwdF9tYXRjaCAqbTsKKwlpbnQgZXJyID0gMDsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmlwdF9tdXRleCkgIT0gMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlRSKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobSwgJmlwdF9tYXRjaCwgbGlzdCkgeworCQlpZiAoc3RyY21wKG0tPm5hbWUsIG5hbWUpID09IDApIHsKKwkJCWlmIChtLT5yZXZpc2lvbiA9PSByZXZpc2lvbikgeworCQkJCWlmICh0cnlfbW9kdWxlX2dldChtLT5tZSkpIHsKKwkJCQkJdXAoJmlwdF9tdXRleCk7CisJCQkJCXJldHVybiBtOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWVyciA9IC1FUFJPVE9UWVBFOyAvKiBGb3VuZCBzb21ldGhpbmcuICovCisJCX0KKwl9CisJdXAoJmlwdF9tdXRleCk7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworLyogRmluZCB0YXJnZXQsIGdyYWJzIHJlZi4gIFJldHVybnMgRVJSX1BUUigpIG9uIGVycm9yLiAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXB0X3RhcmdldCAqZmluZF90YXJnZXQoY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24pCit7CisJc3RydWN0IGlwdF90YXJnZXQgKnQ7CisJaW50IGVyciA9IDA7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZpcHRfbXV0ZXgpICE9IDApCisJCXJldHVybiBFUlJfUFRSKC1FSU5UUik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZpcHRfdGFyZ2V0LCBsaXN0KSB7CisJCWlmIChzdHJjbXAodC0+bmFtZSwgbmFtZSkgPT0gMCkgeworCQkJaWYgKHQtPnJldmlzaW9uID09IHJldmlzaW9uKSB7CisJCQkJaWYgKHRyeV9tb2R1bGVfZ2V0KHQtPm1lKSkgeworCQkJCQl1cCgmaXB0X211dGV4KTsKKwkJCQkJcmV0dXJuIHQ7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJZXJyID0gLUVQUk9UT1RZUEU7IC8qIEZvdW5kIHNvbWV0aGluZy4gKi8KKwkJfQorCX0KKwl1cCgmaXB0X211dGV4KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCitzdHJ1Y3QgaXB0X3RhcmdldCAqaXB0X2ZpbmRfdGFyZ2V0KGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uKQoreworCXN0cnVjdCBpcHRfdGFyZ2V0ICp0YXJnZXQ7CisKKwl0YXJnZXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZShmaW5kX3RhcmdldChuYW1lLCByZXZpc2lvbiksCisJCQkJCSAiaXB0XyVzIiwgbmFtZSk7CisJaWYgKElTX0VSUih0YXJnZXQpIHx8ICF0YXJnZXQpCisJCXJldHVybiBOVUxMOworCXJldHVybiB0YXJnZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWF0Y2hfcmV2Zm4oY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24sIGludCAqYmVzdHApCit7CisJc3RydWN0IGlwdF9tYXRjaCAqbTsKKwlpbnQgaGF2ZV9yZXYgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtLCAmaXB0X21hdGNoLCBsaXN0KSB7CisJCWlmIChzdHJjbXAobS0+bmFtZSwgbmFtZSkgPT0gMCkgeworCQkJaWYgKG0tPnJldmlzaW9uID4gKmJlc3RwKQorCQkJCSpiZXN0cCA9IG0tPnJldmlzaW9uOworCQkJaWYgKG0tPnJldmlzaW9uID09IHJldmlzaW9uKQorCQkJCWhhdmVfcmV2ID0gMTsKKwkJfQorCX0KKwlyZXR1cm4gaGF2ZV9yZXY7Cit9CisKK3N0YXRpYyBpbnQgdGFyZ2V0X3JldmZuKGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uLCBpbnQgKmJlc3RwKQoreworCXN0cnVjdCBpcHRfdGFyZ2V0ICp0OworCWludCBoYXZlX3JldiA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZpcHRfdGFyZ2V0LCBsaXN0KSB7CisJCWlmIChzdHJjbXAodC0+bmFtZSwgbmFtZSkgPT0gMCkgeworCQkJaWYgKHQtPnJldmlzaW9uID4gKmJlc3RwKQorCQkJCSpiZXN0cCA9IHQtPnJldmlzaW9uOworCQkJaWYgKHQtPnJldmlzaW9uID09IHJldmlzaW9uKQorCQkJCWhhdmVfcmV2ID0gMTsKKwkJfQorCX0KKwlyZXR1cm4gaGF2ZV9yZXY7Cit9CisKKy8qIFJldHVybnMgdHJ1ZSBvciBmYWxzZSAoaWYgbm8gc3VjaCBleHRlbnNpb24gYXQgYWxsKSAqLworc3RhdGljIGlubGluZSBpbnQgZmluZF9yZXZpc2lvbihjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbiwKKwkJCQlpbnQgKCpyZXZmbikoY29uc3QgY2hhciAqLCB1OCwgaW50ICopLAorCQkJCWludCAqZXJyKQoreworCWludCBoYXZlX3JldiwgYmVzdCA9IC0xOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmaXB0X211dGV4KSAhPSAwKSB7CisJCSplcnIgPSAtRUlOVFI7CisJCXJldHVybiAxOworCX0KKwloYXZlX3JldiA9IHJldmZuKG5hbWUsIHJldmlzaW9uLCAmYmVzdCk7CisJdXAoJmlwdF9tdXRleCk7CisKKwkvKiBOb3RoaW5nIGF0IGFsbD8gIFJldHVybiAwIHRvIHRyeSBsb2FkaW5nIG1vZHVsZS4gKi8KKwlpZiAoYmVzdCA9PSAtMSkgeworCQkqZXJyID0gLUVOT0VOVDsKKwkJcmV0dXJuIDA7CisJfQorCisJKmVyciA9IGJlc3Q7CisJaWYgKCFoYXZlX3JldikKKwkJKmVyciA9IC1FUFJPVE9OT1NVUFBPUlQ7CisJcmV0dXJuIDE7Cit9CisKKworLyogQWxsIHplcm9lcyA9PSB1bmNvbmRpdGlvbmFsIHJ1bGUuICovCitzdGF0aWMgaW5saW5lIGludAordW5jb25kaXRpb25hbChjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoKmlwKS9zaXplb2YoX191MzIpOyBpKyspCisJCWlmICgoKF9fdTMyICopaXApW2ldKQorCQkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworLyogRmlndXJlcyBvdXQgZnJvbSB3aGF0IGhvb2sgZWFjaCBydWxlIGNhbiBiZSBjYWxsZWQ6IHJldHVybnMgMCBpZgorICAgdGhlcmUgYXJlIGxvb3BzLiAgUHV0cyBob29rIGJpdG1hc2sgaW4gY29tZWZyb20uICovCitzdGF0aWMgaW50CittYXJrX3NvdXJjZV9jaGFpbnMoc3RydWN0IGlwdF90YWJsZV9pbmZvICpuZXdpbmZvLCB1bnNpZ25lZCBpbnQgdmFsaWRfaG9va3MpCit7CisJdW5zaWduZWQgaW50IGhvb2s7CisKKwkvKiBObyByZWN1cnNpb247IHVzZSBwYWNrZXQgY291bnRlciB0byBzYXZlIGJhY2sgcHRycyAocmVzZXQKKwkgICB0byAwIGFzIHdlIGxlYXZlKSwgYW5kIGNvbWVmcm9tIHRvIHNhdmUgc291cmNlIGhvb2sgYml0bWFzayAqLworCWZvciAoaG9vayA9IDA7IGhvb2sgPCBORl9JUF9OVU1IT09LUzsgaG9vaysrKSB7CisJCXVuc2lnbmVkIGludCBwb3MgPSBuZXdpbmZvLT5ob29rX2VudHJ5W2hvb2tdOworCQlzdHJ1Y3QgaXB0X2VudHJ5ICplCisJCQk9IChzdHJ1Y3QgaXB0X2VudHJ5ICopKG5ld2luZm8tPmVudHJpZXMgKyBwb3MpOworCisJCWlmICghKHZhbGlkX2hvb2tzICYgKDEgPDwgaG9vaykpKQorCQkJY29udGludWU7CisKKwkJLyogU2V0IGluaXRpYWwgYmFjayBwb2ludGVyLiAqLworCQllLT5jb3VudGVycy5wY250ID0gcG9zOworCisJCWZvciAoOzspIHsKKwkJCXN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0ICp0CisJCQkJPSAodm9pZCAqKWlwdF9nZXRfdGFyZ2V0KGUpOworCisJCQlpZiAoZS0+Y29tZWZyb20gJiAoMSA8PCBORl9JUF9OVU1IT09LUykpIHsKKwkJCQlwcmludGsoImlwdGFibGVzOiBsb29wIGhvb2sgJXUgcG9zICV1ICUwOFguXG4iLAorCQkJCSAgICAgICBob29rLCBwb3MsIGUtPmNvbWVmcm9tKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWUtPmNvbWVmcm9tCisJCQkJfD0gKCgxIDw8IGhvb2spIHwgKDEgPDwgTkZfSVBfTlVNSE9PS1MpKTsKKworCQkJLyogVW5jb25kaXRpb25hbCByZXR1cm4vRU5ELiAqLworCQkJaWYgKGUtPnRhcmdldF9vZmZzZXQgPT0gc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpCisJCQkgICAgJiYgKHN0cmNtcCh0LT50YXJnZXQudS51c2VyLm5hbWUsCisJCQkJICAgICAgIElQVF9TVEFOREFSRF9UQVJHRVQpID09IDApCisJCQkgICAgJiYgdC0+dmVyZGljdCA8IDAKKwkJCSAgICAmJiB1bmNvbmRpdGlvbmFsKCZlLT5pcCkpIHsKKwkJCQl1bnNpZ25lZCBpbnQgb2xkcG9zLCBzaXplOworCisJCQkJLyogUmV0dXJuOiBiYWNrdHJhY2sgdGhyb3VnaCB0aGUgbGFzdAorCQkJCSAgIGJpZyBqdW1wLiAqLworCQkJCWRvIHsKKwkJCQkJZS0+Y29tZWZyb20gXj0gKDE8PE5GX0lQX05VTUhPT0tTKTsKKyNpZmRlZiBERUJVR19JUF9GSVJFV0FMTF9VU0VSCisJCQkJCWlmIChlLT5jb21lZnJvbQorCQkJCQkgICAgJiAoMSA8PCBORl9JUF9OVU1IT09LUykpIHsKKwkJCQkJCWR1cHJpbnRmKCJCYWNrIHVuc2V0ICIKKwkJCQkJCQkgIm9uIGhvb2sgJXUgIgorCQkJCQkJCSAicnVsZSAldVxuIiwKKwkJCQkJCQkgaG9vaywgcG9zKTsKKwkJCQkJfQorI2VuZGlmCisJCQkJCW9sZHBvcyA9IHBvczsKKwkJCQkJcG9zID0gZS0+Y291bnRlcnMucGNudDsKKwkJCQkJZS0+Y291bnRlcnMucGNudCA9IDA7CisKKwkJCQkJLyogV2UncmUgYXQgdGhlIHN0YXJ0LiAqLworCQkJCQlpZiAocG9zID09IG9sZHBvcykKKwkJCQkJCWdvdG8gbmV4dDsKKworCQkJCQllID0gKHN0cnVjdCBpcHRfZW50cnkgKikKKwkJCQkJCShuZXdpbmZvLT5lbnRyaWVzICsgcG9zKTsKKwkJCQl9IHdoaWxlIChvbGRwb3MgPT0gcG9zICsgZS0+bmV4dF9vZmZzZXQpOworCisJCQkJLyogTW92ZSBhbG9uZyBvbmUgKi8KKwkJCQlzaXplID0gZS0+bmV4dF9vZmZzZXQ7CisJCQkJZSA9IChzdHJ1Y3QgaXB0X2VudHJ5ICopCisJCQkJCShuZXdpbmZvLT5lbnRyaWVzICsgcG9zICsgc2l6ZSk7CisJCQkJZS0+Y291bnRlcnMucGNudCA9IHBvczsKKwkJCQlwb3MgKz0gc2l6ZTsKKwkJCX0gZWxzZSB7CisJCQkJaW50IG5ld3BvcyA9IHQtPnZlcmRpY3Q7CisKKwkJCQlpZiAoc3RyY21wKHQtPnRhcmdldC51LnVzZXIubmFtZSwKKwkJCQkJICAgSVBUX1NUQU5EQVJEX1RBUkdFVCkgPT0gMAorCQkJCSAgICAmJiBuZXdwb3MgPj0gMCkgeworCQkJCQkvKiBUaGlzIGEganVtcDsgY2hhc2UgaXQuICovCisJCQkJCWR1cHJpbnRmKCJKdW1wIHJ1bGUgJXUgLT4gJXVcbiIsCisJCQkJCQkgcG9zLCBuZXdwb3MpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIC4uLiB0aGlzIGlzIGEgZmFsbHRocnUgKi8KKwkJCQkJbmV3cG9zID0gcG9zICsgZS0+bmV4dF9vZmZzZXQ7CisJCQkJfQorCQkJCWUgPSAoc3RydWN0IGlwdF9lbnRyeSAqKQorCQkJCQkobmV3aW5mby0+ZW50cmllcyArIG5ld3Bvcyk7CisJCQkJZS0+Y291bnRlcnMucGNudCA9IHBvczsKKwkJCQlwb3MgPSBuZXdwb3M7CisJCQl9CisJCX0KKwkJbmV4dDoKKwkJZHVwcmludGYoIkZpbmlzaGVkIGNoYWluICV1XG4iLCBob29rKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitjbGVhbnVwX21hdGNoKHN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKm0sIHVuc2lnbmVkIGludCAqaSkKK3sKKwlpZiAoaSAmJiAoKmkpLS0gPT0gMCkKKwkJcmV0dXJuIDE7CisKKwlpZiAobS0+dS5rZXJuZWwubWF0Y2gtPmRlc3Ryb3kpCisJCW0tPnUua2VybmVsLm1hdGNoLT5kZXN0cm95KG0tPmRhdGEsCisJCQkJCSAgIG0tPnUubWF0Y2hfc2l6ZSAtIHNpemVvZigqbSkpOworCW1vZHVsZV9wdXQobS0+dS5rZXJuZWwubWF0Y2gtPm1lKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3N0YW5kYXJkX2NoZWNrKGNvbnN0IHN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICp0LAorCSAgICAgICB1bnNpZ25lZCBpbnQgbWF4X29mZnNldCkKK3sKKwlzdHJ1Y3QgaXB0X3N0YW5kYXJkX3RhcmdldCAqdGFyZyA9ICh2b2lkICopdDsKKworCS8qIENoZWNrIHN0YW5kYXJkIGluZm8uICovCisJaWYgKHQtPnUudGFyZ2V0X3NpemUKKwkgICAgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkX3RhcmdldCkpKSB7CisJCWR1cHJpbnRmKCJzdGFuZGFyZF9jaGVjazogdGFyZ2V0IHNpemUgJXUgIT0gJXVcbiIsCisJCQkgdC0+dS50YXJnZXRfc2l6ZSwKKwkJCSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0KSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodGFyZy0+dmVyZGljdCA+PSAwCisJICAgICYmIHRhcmctPnZlcmRpY3QgPiBtYXhfb2Zmc2V0IC0gc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpKSB7CisJCWR1cHJpbnRmKCJpcHRfc3RhbmRhcmRfY2hlY2s6IGJhZCB2ZXJkaWN0ICglaSlcbiIsCisJCQkgdGFyZy0+dmVyZGljdCk7CisJCXJldHVybiAwOworCX0KKworCWlmICh0YXJnLT52ZXJkaWN0IDwgLU5GX01BWF9WRVJESUNUIC0gMSkgeworCQlkdXByaW50ZigiaXB0X3N0YW5kYXJkX2NoZWNrOiBiYWQgbmVnYXRpdmUgdmVyZGljdCAoJWkpXG4iLAorCQkJIHRhcmctPnZlcmRpY3QpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitjaGVja19tYXRjaChzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICptLAorCSAgICBjb25zdCBjaGFyICpuYW1lLAorCSAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkgICAgdW5zaWduZWQgaW50IGhvb2ttYXNrLAorCSAgICB1bnNpZ25lZCBpbnQgKmkpCit7CisJc3RydWN0IGlwdF9tYXRjaCAqbWF0Y2g7CisKKwltYXRjaCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGZpbmRfbWF0Y2gobS0+dS51c2VyLm5hbWUsCisJCQkJCQkgICBtLT51LnVzZXIucmV2aXNpb24pLAorCQkJCQkiaXB0XyVzIiwgbS0+dS51c2VyLm5hbWUpOworCWlmIChJU19FUlIobWF0Y2gpIHx8ICFtYXRjaCkgeworCQlkdXByaW50ZigiY2hlY2tfbWF0Y2g6IGAlcycgbm90IGZvdW5kXG4iLCBtLT51LnVzZXIubmFtZSk7CisJCXJldHVybiBtYXRjaCA/IFBUUl9FUlIobWF0Y2gpIDogLUVOT0VOVDsKKwl9CisJbS0+dS5rZXJuZWwubWF0Y2ggPSBtYXRjaDsKKworCWlmIChtLT51Lmtlcm5lbC5tYXRjaC0+Y2hlY2tlbnRyeQorCSAgICAmJiAhbS0+dS5rZXJuZWwubWF0Y2gtPmNoZWNrZW50cnkobmFtZSwgaXAsIG0tPmRhdGEsCisJCQkJCSAgICAgIG0tPnUubWF0Y2hfc2l6ZSAtIHNpemVvZigqbSksCisJCQkJCSAgICAgIGhvb2ttYXNrKSkgeworCQltb2R1bGVfcHV0KG0tPnUua2VybmVsLm1hdGNoLT5tZSk7CisJCWR1cHJpbnRmKCJpcF90YWJsZXM6IGNoZWNrIGZhaWxlZCBmb3IgYCVzJy5cbiIsCisJCQkgbS0+dS5rZXJuZWwubWF0Y2gtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkoKmkpKys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXB0X3RhcmdldCBpcHRfc3RhbmRhcmRfdGFyZ2V0OworCitzdGF0aWMgaW5saW5lIGludAorY2hlY2tfZW50cnkoc3RydWN0IGlwdF9lbnRyeSAqZSwgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IHNpemUsCisJICAgIHVuc2lnbmVkIGludCAqaSkKK3sKKwlzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdDsKKwlzdHJ1Y3QgaXB0X3RhcmdldCAqdGFyZ2V0OworCWludCByZXQ7CisJdW5zaWduZWQgaW50IGo7CisKKwlpZiAoIWlwX2NoZWNrZW50cnkoJmUtPmlwKSkgeworCQlkdXByaW50ZigiaXBfdGFibGVzOiBpcCBjaGVjayBmYWlsZWQgJXAgJXMuXG4iLCBlLCBuYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaiA9IDA7CisJcmV0ID0gSVBUX01BVENIX0lURVJBVEUoZSwgY2hlY2tfbWF0Y2gsIG5hbWUsICZlLT5pcCwgZS0+Y29tZWZyb20sICZqKTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gY2xlYW51cF9tYXRjaGVzOworCisJdCA9IGlwdF9nZXRfdGFyZ2V0KGUpOworCXRhcmdldCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGZpbmRfdGFyZ2V0KHQtPnUudXNlci5uYW1lLAorCQkJCQkJICAgICB0LT51LnVzZXIucmV2aXNpb24pLAorCQkJCQkgImlwdF8lcyIsIHQtPnUudXNlci5uYW1lKTsKKwlpZiAoSVNfRVJSKHRhcmdldCkgfHwgIXRhcmdldCkgeworCQlkdXByaW50ZigiY2hlY2tfZW50cnk6IGAlcycgbm90IGZvdW5kXG4iLCB0LT51LnVzZXIubmFtZSk7CisJCXJldCA9IHRhcmdldCA/IFBUUl9FUlIodGFyZ2V0KSA6IC1FTk9FTlQ7CisJCWdvdG8gY2xlYW51cF9tYXRjaGVzOworCX0KKwl0LT51Lmtlcm5lbC50YXJnZXQgPSB0YXJnZXQ7CisKKwlpZiAodC0+dS5rZXJuZWwudGFyZ2V0ID09ICZpcHRfc3RhbmRhcmRfdGFyZ2V0KSB7CisJCWlmICghc3RhbmRhcmRfY2hlY2sodCwgc2l6ZSkpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGNsZWFudXBfbWF0Y2hlczsKKwkJfQorCX0gZWxzZSBpZiAodC0+dS5rZXJuZWwudGFyZ2V0LT5jaGVja2VudHJ5CisJCSAgICYmICF0LT51Lmtlcm5lbC50YXJnZXQtPmNoZWNrZW50cnkobmFtZSwgZSwgdC0+ZGF0YSwKKwkJCQkJCSAgICAgIHQtPnUudGFyZ2V0X3NpemUKKwkJCQkJCSAgICAgIC0gc2l6ZW9mKCp0KSwKKwkJCQkJCSAgICAgIGUtPmNvbWVmcm9tKSkgeworCQltb2R1bGVfcHV0KHQtPnUua2VybmVsLnRhcmdldC0+bWUpOworCQlkdXByaW50ZigiaXBfdGFibGVzOiBjaGVjayBmYWlsZWQgZm9yIGAlcycuXG4iLAorCQkJIHQtPnUua2VybmVsLnRhcmdldC0+bmFtZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gY2xlYW51cF9tYXRjaGVzOworCX0KKworCSgqaSkrKzsKKwlyZXR1cm4gMDsKKworIGNsZWFudXBfbWF0Y2hlczoKKwlJUFRfTUFUQ0hfSVRFUkFURShlLCBjbGVhbnVwX21hdGNoLCAmaik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2NoZWNrX2VudHJ5X3NpemVfYW5kX2hvb2tzKHN0cnVjdCBpcHRfZW50cnkgKmUsCisJCQkgICBzdHJ1Y3QgaXB0X3RhYmxlX2luZm8gKm5ld2luZm8sCisJCQkgICB1bnNpZ25lZCBjaGFyICpiYXNlLAorCQkJICAgdW5zaWduZWQgY2hhciAqbGltaXQsCisJCQkgICBjb25zdCB1bnNpZ25lZCBpbnQgKmhvb2tfZW50cmllcywKKwkJCSAgIGNvbnN0IHVuc2lnbmVkIGludCAqdW5kZXJmbG93cywKKwkJCSAgIHVuc2lnbmVkIGludCAqaSkKK3sKKwl1bnNpZ25lZCBpbnQgaDsKKworCWlmICgodW5zaWduZWQgbG9uZyllICUgX19hbGlnbm9mX18oc3RydWN0IGlwdF9lbnRyeSkgIT0gMAorCSAgICB8fCAodW5zaWduZWQgY2hhciAqKWUgKyBzaXplb2Yoc3RydWN0IGlwdF9lbnRyeSkgPj0gbGltaXQpIHsKKwkJZHVwcmludGYoIkJhZCBvZmZzZXQgJXBcbiIsIGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZS0+bmV4dF9vZmZzZXQKKwkgICAgPCBzaXplb2Yoc3RydWN0IGlwdF9lbnRyeSkgKyBzaXplb2Yoc3RydWN0IGlwdF9lbnRyeV90YXJnZXQpKSB7CisJCWR1cHJpbnRmKCJjaGVja2luZzogZWxlbWVudCAlcCBzaXplICV1XG4iLAorCQkJIGUsIGUtPm5leHRfb2Zmc2V0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2hlY2sgaG9va3MgJiB1bmRlcmZsb3dzICovCisJZm9yIChoID0gMDsgaCA8IE5GX0lQX05VTUhPT0tTOyBoKyspIHsKKwkJaWYgKCh1bnNpZ25lZCBjaGFyICopZSAtIGJhc2UgPT0gaG9va19lbnRyaWVzW2hdKQorCQkJbmV3aW5mby0+aG9va19lbnRyeVtoXSA9IGhvb2tfZW50cmllc1toXTsKKwkJaWYgKCh1bnNpZ25lZCBjaGFyICopZSAtIGJhc2UgPT0gdW5kZXJmbG93c1toXSkKKwkJCW5ld2luZm8tPnVuZGVyZmxvd1toXSA9IHVuZGVyZmxvd3NbaF07CisJfQorCisJLyogRklYTUU6IHVuZGVyZmxvd3MgbXVzdCBiZSB1bmNvbmRpdGlvbmFsLCBzdGFuZGFyZCB2ZXJkaWN0cworICAgICAgICAgICA8IDAgKG5vdCBJUFRfUkVUVVJOKS4gLS1SUiAqLworCisJLyogQ2xlYXIgY291bnRlcnMgYW5kIGNvbWVmcm9tICovCisJZS0+Y291bnRlcnMgPSAoKHN0cnVjdCBpcHRfY291bnRlcnMpIHsgMCwgMCB9KTsKKwllLT5jb21lZnJvbSA9IDA7CisKKwkoKmkpKys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitjbGVhbnVwX2VudHJ5KHN0cnVjdCBpcHRfZW50cnkgKmUsIHVuc2lnbmVkIGludCAqaSkKK3sKKwlzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdDsKKworCWlmIChpICYmICgqaSktLSA9PSAwKQorCQlyZXR1cm4gMTsKKworCS8qIENsZWFudXAgYWxsIG1hdGNoZXMgKi8KKwlJUFRfTUFUQ0hfSVRFUkFURShlLCBjbGVhbnVwX21hdGNoLCBOVUxMKTsKKwl0ID0gaXB0X2dldF90YXJnZXQoZSk7CisJaWYgKHQtPnUua2VybmVsLnRhcmdldC0+ZGVzdHJveSkKKwkJdC0+dS5rZXJuZWwudGFyZ2V0LT5kZXN0cm95KHQtPmRhdGEsCisJCQkJCSAgICB0LT51LnRhcmdldF9zaXplIC0gc2l6ZW9mKCp0KSk7CisJbW9kdWxlX3B1dCh0LT51Lmtlcm5lbC50YXJnZXQtPm1lKTsKKwlyZXR1cm4gMDsKK30KKworLyogQ2hlY2tzIGFuZCB0cmFuc2xhdGVzIHRoZSB1c2VyLXN1cHBsaWVkIHRhYmxlIHNlZ21lbnQgKGhlbGQgaW4KKyAgIG5ld2luZm8pICovCitzdGF0aWMgaW50Cit0cmFuc2xhdGVfdGFibGUoY29uc3QgY2hhciAqbmFtZSwKKwkJdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzLAorCQlzdHJ1Y3QgaXB0X3RhYmxlX2luZm8gKm5ld2luZm8sCisJCXVuc2lnbmVkIGludCBzaXplLAorCQl1bnNpZ25lZCBpbnQgbnVtYmVyLAorCQljb25zdCB1bnNpZ25lZCBpbnQgKmhvb2tfZW50cmllcywKKwkJY29uc3QgdW5zaWduZWQgaW50ICp1bmRlcmZsb3dzKQoreworCXVuc2lnbmVkIGludCBpOworCWludCByZXQ7CisKKwluZXdpbmZvLT5zaXplID0gc2l6ZTsKKwluZXdpbmZvLT5udW1iZXIgPSBudW1iZXI7CisKKwkvKiBJbml0IGFsbCBob29rcyB0byBpbXBvc3NpYmxlIHZhbHVlLiAqLworCWZvciAoaSA9IDA7IGkgPCBORl9JUF9OVU1IT09LUzsgaSsrKSB7CisJCW5ld2luZm8tPmhvb2tfZW50cnlbaV0gPSAweEZGRkZGRkZGOworCQluZXdpbmZvLT51bmRlcmZsb3dbaV0gPSAweEZGRkZGRkZGOworCX0KKworCWR1cHJpbnRmKCJ0cmFuc2xhdGVfdGFibGU6IHNpemUgJXVcbiIsIG5ld2luZm8tPnNpemUpOworCWkgPSAwOworCS8qIFdhbGsgdGhyb3VnaCBlbnRyaWVzLCBjaGVja2luZyBvZmZzZXRzLiAqLworCXJldCA9IElQVF9FTlRSWV9JVEVSQVRFKG5ld2luZm8tPmVudHJpZXMsIG5ld2luZm8tPnNpemUsCisJCQkJY2hlY2tfZW50cnlfc2l6ZV9hbmRfaG9va3MsCisJCQkJbmV3aW5mbywKKwkJCQluZXdpbmZvLT5lbnRyaWVzLAorCQkJCW5ld2luZm8tPmVudHJpZXMgKyBzaXplLAorCQkJCWhvb2tfZW50cmllcywgdW5kZXJmbG93cywgJmkpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChpICE9IG51bWJlcikgeworCQlkdXByaW50ZigidHJhbnNsYXRlX3RhYmxlOiAldSBub3QgJXUgZW50cmllc1xuIiwKKwkJCSBpLCBudW1iZXIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDaGVjayBob29rcyBhbGwgYXNzaWduZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTkZfSVBfTlVNSE9PS1M7IGkrKykgeworCQkvKiBPbmx5IGhvb2tzIHdoaWNoIGFyZSB2YWxpZCAqLworCQlpZiAoISh2YWxpZF9ob29rcyAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAobmV3aW5mby0+aG9va19lbnRyeVtpXSA9PSAweEZGRkZGRkZGKSB7CisJCQlkdXByaW50ZigiSW52YWxpZCBob29rIGVudHJ5ICV1ICV1XG4iLAorCQkJCSBpLCBob29rX2VudHJpZXNbaV0pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKG5ld2luZm8tPnVuZGVyZmxvd1tpXSA9PSAweEZGRkZGRkZGKSB7CisJCQlkdXByaW50ZigiSW52YWxpZCB1bmRlcmZsb3cgJXUgJXVcbiIsCisJCQkJIGksIHVuZGVyZmxvd3NbaV0pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAoIW1hcmtfc291cmNlX2NoYWlucyhuZXdpbmZvLCB2YWxpZF9ob29rcykpCisJCXJldHVybiAtRUxPT1A7CisKKwkvKiBGaW5hbGx5LCBlYWNoIHNhbml0eSBjaGVjayBtdXN0IHBhc3MgKi8KKwlpID0gMDsKKwlyZXQgPSBJUFRfRU5UUllfSVRFUkFURShuZXdpbmZvLT5lbnRyaWVzLCBuZXdpbmZvLT5zaXplLAorCQkJCWNoZWNrX2VudHJ5LCBuYW1lLCBzaXplLCAmaSk7CisKKwlpZiAocmV0ICE9IDApIHsKKwkJSVBUX0VOVFJZX0lURVJBVEUobmV3aW5mby0+ZW50cmllcywgbmV3aW5mby0+c2l6ZSwKKwkJCQkgIGNsZWFudXBfZW50cnksICZpKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBBbmQgb25lIGNvcHkgZm9yIGV2ZXJ5IG90aGVyIENQVSAqLworCWZvciAoaSA9IDE7IGkgPCBudW1fcG9zc2libGVfY3B1cygpOyBpKyspIHsKKwkJbWVtY3B5KG5ld2luZm8tPmVudHJpZXMgKyBTTVBfQUxJR04obmV3aW5mby0+c2l6ZSkqaSwKKwkJICAgICAgIG5ld2luZm8tPmVudHJpZXMsCisJCSAgICAgICBTTVBfQUxJR04obmV3aW5mby0+c2l6ZSkpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXB0X3RhYmxlX2luZm8gKgorcmVwbGFjZV90YWJsZShzdHJ1Y3QgaXB0X3RhYmxlICp0YWJsZSwKKwkgICAgICB1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzLAorCSAgICAgIHN0cnVjdCBpcHRfdGFibGVfaW5mbyAqbmV3aW5mbywKKwkgICAgICBpbnQgKmVycm9yKQoreworCXN0cnVjdCBpcHRfdGFibGVfaW5mbyAqb2xkaW5mbzsKKworI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKKwl7CisJCXN0cnVjdCBpcHRfZW50cnkgKnRhYmxlX2Jhc2U7CisJCXVuc2lnbmVkIGludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBudW1fcG9zc2libGVfY3B1cygpOyBpKyspIHsKKwkJCXRhYmxlX2Jhc2UgPQorCQkJCSh2b2lkICopbmV3aW5mby0+ZW50cmllcworCQkJCSsgVEFCTEVfT0ZGU0VUKG5ld2luZm8sIGkpOworCisJCQl0YWJsZV9iYXNlLT5jb21lZnJvbSA9IDB4ZGVhZDU3YWM7CisJCX0KKwl9CisjZW5kaWYKKworCS8qIERvIHRoZSBzdWJzdGl0dXRpb24uICovCisJd3JpdGVfbG9ja19iaCgmdGFibGUtPmxvY2spOworCS8qIENoZWNrIGluc2lkZSBsb2NrOiBpcyB0aGUgb2xkIG51bWJlciBjb3JyZWN0PyAqLworCWlmIChudW1fY291bnRlcnMgIT0gdGFibGUtPnByaXZhdGUtPm51bWJlcikgeworCQlkdXByaW50ZigibnVtX2NvdW50ZXJzICE9IHRhYmxlLT5wcml2YXRlLT5udW1iZXIgKCV1LyV1KVxuIiwKKwkJCSBudW1fY291bnRlcnMsIHRhYmxlLT5wcml2YXRlLT5udW1iZXIpOworCQl3cml0ZV91bmxvY2tfYmgoJnRhYmxlLT5sb2NrKTsKKwkJKmVycm9yID0gLUVBR0FJTjsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW9sZGluZm8gPSB0YWJsZS0+cHJpdmF0ZTsKKwl0YWJsZS0+cHJpdmF0ZSA9IG5ld2luZm87CisJbmV3aW5mby0+aW5pdGlhbF9lbnRyaWVzID0gb2xkaW5mby0+aW5pdGlhbF9lbnRyaWVzOworCXdyaXRlX3VubG9ja19iaCgmdGFibGUtPmxvY2spOworCisJcmV0dXJuIG9sZGluZm87Cit9CisKKy8qIEdldHMgY291bnRlcnMuICovCitzdGF0aWMgaW5saW5lIGludAorYWRkX2VudHJ5X3RvX2NvdW50ZXIoY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkJICAgICBzdHJ1Y3QgaXB0X2NvdW50ZXJzIHRvdGFsW10sCisJCSAgICAgdW5zaWduZWQgaW50ICppKQoreworCUFERF9DT1VOVEVSKHRvdGFsWyppXSwgZS0+Y291bnRlcnMuYmNudCwgZS0+Y291bnRlcnMucGNudCk7CisKKwkoKmkpKys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitnZXRfY291bnRlcnMoY29uc3Qgc3RydWN0IGlwdF90YWJsZV9pbmZvICp0LAorCSAgICAgc3RydWN0IGlwdF9jb3VudGVycyBjb3VudGVyc1tdKQoreworCXVuc2lnbmVkIGludCBjcHU7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGNwdSA9IDA7IGNwdSA8IG51bV9wb3NzaWJsZV9jcHVzKCk7IGNwdSsrKSB7CisJCWkgPSAwOworCQlJUFRfRU5UUllfSVRFUkFURSh0LT5lbnRyaWVzICsgVEFCTEVfT0ZGU0VUKHQsIGNwdSksCisJCQkJICB0LT5zaXplLAorCQkJCSAgYWRkX2VudHJ5X3RvX2NvdW50ZXIsCisJCQkJICBjb3VudGVycywKKwkJCQkgICZpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2NvcHlfZW50cmllc190b191c2VyKHVuc2lnbmVkIGludCB0b3RhbF9zaXplLAorCQkgICAgIHN0cnVjdCBpcHRfdGFibGUgKnRhYmxlLAorCQkgICAgIHZvaWQgX191c2VyICp1c2VycHRyKQoreworCXVuc2lnbmVkIGludCBvZmYsIG51bSwgY291bnRlcnNpemU7CisJc3RydWN0IGlwdF9lbnRyeSAqZTsKKwlzdHJ1Y3QgaXB0X2NvdW50ZXJzICpjb3VudGVyczsKKwlpbnQgcmV0ID0gMDsKKworCS8qIFdlIG5lZWQgYXRvbWljIHNuYXBzaG90IG9mIGNvdW50ZXJzOiByZXN0IGRvZXNuJ3QgY2hhbmdlCisJICAgKG90aGVyIHRoYW4gY29tZWZyb20sIHdoaWNoIHVzZXJzcGFjZSBkb2Vzbid0IGNhcmUKKwkgICBhYm91dCkuICovCisJY291bnRlcnNpemUgPSBzaXplb2Yoc3RydWN0IGlwdF9jb3VudGVycykgKiB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyOworCWNvdW50ZXJzID0gdm1hbGxvYyhjb3VudGVyc2l6ZSk7CisKKwlpZiAoY291bnRlcnMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBGaXJzdCwgc3VtIGNvdW50ZXJzLi4uICovCisJbWVtc2V0KGNvdW50ZXJzLCAwLCBjb3VudGVyc2l6ZSk7CisJd3JpdGVfbG9ja19iaCgmdGFibGUtPmxvY2spOworCWdldF9jb3VudGVycyh0YWJsZS0+cHJpdmF0ZSwgY291bnRlcnMpOworCXdyaXRlX3VubG9ja19iaCgmdGFibGUtPmxvY2spOworCisJLyogLi4uIHRoZW4gY29weSBlbnRpcmUgdGhpbmcgZnJvbSBDUFUgMC4uLiAqLworCWlmIChjb3B5X3RvX3VzZXIodXNlcnB0ciwgdGFibGUtPnByaXZhdGUtPmVudHJpZXMsIHRvdGFsX3NpemUpICE9IDApIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBmcmVlX2NvdW50ZXJzOworCX0KKworCS8qIEZJWE1FOiB1c2UgaXRlcmF0b3IgbWFjcm9zIC0tUlIgKi8KKwkvKiAuLi4gdGhlbiBnbyBiYWNrIGFuZCBmaXggY291bnRlcnMgYW5kIG5hbWVzICovCisJZm9yIChvZmYgPSAwLCBudW0gPSAwOyBvZmYgPCB0b3RhbF9zaXplOyBvZmYgKz0gZS0+bmV4dF9vZmZzZXQsIG51bSsrKXsKKwkJdW5zaWduZWQgaW50IGk7CisJCXN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKm07CisJCXN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICp0OworCisJCWUgPSAoc3RydWN0IGlwdF9lbnRyeSAqKSh0YWJsZS0+cHJpdmF0ZS0+ZW50cmllcyArIG9mZik7CisJCWlmIChjb3B5X3RvX3VzZXIodXNlcnB0ciArIG9mZgorCQkJCSArIG9mZnNldG9mKHN0cnVjdCBpcHRfZW50cnksIGNvdW50ZXJzKSwKKwkJCQkgJmNvdW50ZXJzW251bV0sCisJCQkJIHNpemVvZihjb3VudGVyc1tudW1dKSkgIT0gMCkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gZnJlZV9jb3VudGVyczsKKwkJfQorCisJCWZvciAoaSA9IHNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5KTsKKwkJICAgICBpIDwgZS0+dGFyZ2V0X29mZnNldDsKKwkJICAgICBpICs9IG0tPnUubWF0Y2hfc2l6ZSkgeworCQkJbSA9ICh2b2lkICopZSArIGk7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIodXNlcnB0ciArIG9mZiArIGkKKwkJCQkJICsgb2Zmc2V0b2Yoc3RydWN0IGlwdF9lbnRyeV9tYXRjaCwKKwkJCQkJCSAgICB1LnVzZXIubmFtZSksCisJCQkJCSBtLT51Lmtlcm5lbC5tYXRjaC0+bmFtZSwKKwkJCQkJIHN0cmxlbihtLT51Lmtlcm5lbC5tYXRjaC0+bmFtZSkrMSkKKwkJCSAgICAhPSAwKSB7CisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlnb3RvIGZyZWVfY291bnRlcnM7CisJCQl9CisJCX0KKworCQl0ID0gaXB0X2dldF90YXJnZXQoZSk7CisJCWlmIChjb3B5X3RvX3VzZXIodXNlcnB0ciArIG9mZiArIGUtPnRhcmdldF9vZmZzZXQKKwkJCQkgKyBvZmZzZXRvZihzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCwKKwkJCQkJICAgIHUudXNlci5uYW1lKSwKKwkJCQkgdC0+dS5rZXJuZWwudGFyZ2V0LT5uYW1lLAorCQkJCSBzdHJsZW4odC0+dS5rZXJuZWwudGFyZ2V0LT5uYW1lKSsxKSAhPSAwKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBmcmVlX2NvdW50ZXJzOworCQl9CisJfQorCisgZnJlZV9jb3VudGVyczoKKwl2ZnJlZShjb3VudGVycyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorZ2V0X2VudHJpZXMoY29uc3Qgc3RydWN0IGlwdF9nZXRfZW50cmllcyAqZW50cmllcywKKwkgICAgc3RydWN0IGlwdF9nZXRfZW50cmllcyBfX3VzZXIgKnVwdHIpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaXB0X3RhYmxlICp0OworCisJdCA9IGZpbmRfdGFibGVfbG9jayhlbnRyaWVzLT5uYW1lKTsKKwlpZiAodCAmJiAhSVNfRVJSKHQpKSB7CisJCWR1cHJpbnRmKCJ0LT5wcml2YXRlLT5udW1iZXIgPSAldVxuIiwKKwkJCSB0LT5wcml2YXRlLT5udW1iZXIpOworCQlpZiAoZW50cmllcy0+c2l6ZSA9PSB0LT5wcml2YXRlLT5zaXplKQorCQkJcmV0ID0gY29weV9lbnRyaWVzX3RvX3VzZXIodC0+cHJpdmF0ZS0+c2l6ZSwKKwkJCQkJCSAgIHQsIHVwdHItPmVudHJ5dGFibGUpOworCQllbHNlIHsKKwkJCWR1cHJpbnRmKCJnZXRfZW50cmllczogSSd2ZSBnb3QgJXUgbm90ICV1IVxuIiwKKwkJCQkgdC0+cHJpdmF0ZS0+c2l6ZSwKKwkJCQkgZW50cmllcy0+c2l6ZSk7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CisJCW1vZHVsZV9wdXQodC0+bWUpOworCQl1cCgmaXB0X211dGV4KTsKKwl9IGVsc2UKKwkJcmV0ID0gdCA/IFBUUl9FUlIodCkgOiAtRU5PRU5UOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorZG9fcmVwbGFjZSh2b2lkIF9fdXNlciAqdXNlciwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpcHRfcmVwbGFjZSB0bXA7CisJc3RydWN0IGlwdF90YWJsZSAqdDsKKwlzdHJ1Y3QgaXB0X3RhYmxlX2luZm8gKm5ld2luZm8sICpvbGRpbmZvOworCXN0cnVjdCBpcHRfY291bnRlcnMgKmNvdW50ZXJzOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXAsIHVzZXIsIHNpemVvZih0bXApKSAhPSAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIEhhY2s6IENhdXNlcyBpcGNoYWlucyB0byBnaXZlIGNvcnJlY3QgZXJyb3IgbXNnIC0tUlIgKi8KKwlpZiAobGVuICE9IHNpemVvZih0bXApICsgdG1wLnNpemUpCisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisKKwkvKiBQZWRhbnRyeTogcHJldmVudCB0aGVtIGZyb20gaGl0dGluZyBCVUcoKSBpbiB2bWFsbG9jLmMgLS1SUiAqLworCWlmICgoU01QX0FMSUdOKHRtcC5zaXplKSA+PiBQQUdFX1NISUZUKSArIDIgPiBudW1fcGh5c3BhZ2VzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5ld2luZm8gPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgaXB0X3RhYmxlX2luZm8pCisJCQkgICsgU01QX0FMSUdOKHRtcC5zaXplKSAqIG51bV9wb3NzaWJsZV9jcHVzKCkpOworCWlmICghbmV3aW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoY29weV9mcm9tX3VzZXIobmV3aW5mby0+ZW50cmllcywgdXNlciArIHNpemVvZih0bXApLAorCQkJICAgdG1wLnNpemUpICE9IDApIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBmcmVlX25ld2luZm87CisJfQorCisJY291bnRlcnMgPSB2bWFsbG9jKHRtcC5udW1fY291bnRlcnMgKiBzaXplb2Yoc3RydWN0IGlwdF9jb3VudGVycykpOworCWlmICghY291bnRlcnMpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmcmVlX25ld2luZm87CisJfQorCW1lbXNldChjb3VudGVycywgMCwgdG1wLm51bV9jb3VudGVycyAqIHNpemVvZihzdHJ1Y3QgaXB0X2NvdW50ZXJzKSk7CisKKwlyZXQgPSB0cmFuc2xhdGVfdGFibGUodG1wLm5hbWUsIHRtcC52YWxpZF9ob29rcywKKwkJCSAgICAgIG5ld2luZm8sIHRtcC5zaXplLCB0bXAubnVtX2VudHJpZXMsCisJCQkgICAgICB0bXAuaG9va19lbnRyeSwgdG1wLnVuZGVyZmxvdyk7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIGZyZWVfbmV3aW5mb19jb3VudGVyczsKKworCWR1cHJpbnRmKCJpcF90YWJsZXM6IFRyYW5zbGF0ZWQgdGFibGVcbiIpOworCisJdCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGZpbmRfdGFibGVfbG9jayh0bXAubmFtZSksCisJCQkJICAgICJpcHRhYmxlXyVzIiwgdG1wLm5hbWUpOworCWlmICghdCB8fCBJU19FUlIodCkpIHsKKwkJcmV0ID0gdCA/IFBUUl9FUlIodCkgOiAtRU5PRU5UOworCQlnb3RvIGZyZWVfbmV3aW5mb19jb3VudGVyc191bnRyYW5zOworCX0KKworCS8qIFlvdSBsaWVkISAqLworCWlmICh0bXAudmFsaWRfaG9va3MgIT0gdC0+dmFsaWRfaG9va3MpIHsKKwkJZHVwcmludGYoIlZhbGlkIGhvb2sgY3JhcDogJTA4WCB2cyAlMDhYXG4iLAorCQkJIHRtcC52YWxpZF9ob29rcywgdC0+dmFsaWRfaG9va3MpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHB1dF9tb2R1bGU7CisJfQorCisJb2xkaW5mbyA9IHJlcGxhY2VfdGFibGUodCwgdG1wLm51bV9jb3VudGVycywgbmV3aW5mbywgJnJldCk7CisJaWYgKCFvbGRpbmZvKQorCQlnb3RvIHB1dF9tb2R1bGU7CisKKwkvKiBVcGRhdGUgbW9kdWxlIHVzYWdlIGNvdW50IGJhc2VkIG9uIG51bWJlciBvZiBydWxlcyAqLworCWR1cHJpbnRmKCJkb19yZXBsYWNlOiBvbGRudW09JXUsIGluaXRudW09JXUsIG5ld251bT0ldVxuIiwKKwkJb2xkaW5mby0+bnVtYmVyLCBvbGRpbmZvLT5pbml0aWFsX2VudHJpZXMsIG5ld2luZm8tPm51bWJlcik7CisJaWYgKChvbGRpbmZvLT5udW1iZXIgPiBvbGRpbmZvLT5pbml0aWFsX2VudHJpZXMpIHx8IAorCSAgICAobmV3aW5mby0+bnVtYmVyIDw9IG9sZGluZm8tPmluaXRpYWxfZW50cmllcykpIAorCQltb2R1bGVfcHV0KHQtPm1lKTsKKwlpZiAoKG9sZGluZm8tPm51bWJlciA+IG9sZGluZm8tPmluaXRpYWxfZW50cmllcykgJiYKKwkgICAgKG5ld2luZm8tPm51bWJlciA8PSBvbGRpbmZvLT5pbml0aWFsX2VudHJpZXMpKQorCQltb2R1bGVfcHV0KHQtPm1lKTsKKworCS8qIEdldCB0aGUgb2xkIGNvdW50ZXJzLiAqLworCWdldF9jb3VudGVycyhvbGRpbmZvLCBjb3VudGVycyk7CisJLyogRGVjcmVhc2UgbW9kdWxlIHVzYWdlIGNvdW50cyBhbmQgZnJlZSByZXNvdXJjZSAqLworCUlQVF9FTlRSWV9JVEVSQVRFKG9sZGluZm8tPmVudHJpZXMsIG9sZGluZm8tPnNpemUsIGNsZWFudXBfZW50cnksTlVMTCk7CisJdmZyZWUob2xkaW5mbyk7CisJaWYgKGNvcHlfdG9fdXNlcih0bXAuY291bnRlcnMsIGNvdW50ZXJzLAorCQkJIHNpemVvZihzdHJ1Y3QgaXB0X2NvdW50ZXJzKSAqIHRtcC5udW1fY291bnRlcnMpICE9IDApCisJCXJldCA9IC1FRkFVTFQ7CisJdmZyZWUoY291bnRlcnMpOworCXVwKCZpcHRfbXV0ZXgpOworCXJldHVybiByZXQ7CisKKyBwdXRfbW9kdWxlOgorCW1vZHVsZV9wdXQodC0+bWUpOworCXVwKCZpcHRfbXV0ZXgpOworIGZyZWVfbmV3aW5mb19jb3VudGVyc191bnRyYW5zOgorCUlQVF9FTlRSWV9JVEVSQVRFKG5ld2luZm8tPmVudHJpZXMsIG5ld2luZm8tPnNpemUsIGNsZWFudXBfZW50cnksTlVMTCk7CisgZnJlZV9uZXdpbmZvX2NvdW50ZXJzOgorCXZmcmVlKGNvdW50ZXJzKTsKKyBmcmVlX25ld2luZm86CisJdmZyZWUobmV3aW5mbyk7CisJcmV0dXJuIHJldDsKK30KKworLyogV2UncmUgbGF6eSwgYW5kIGFkZCB0byB0aGUgZmlyc3QgQ1BVOyBvdmVyZmxvdyB3b3JrcyBpdHMgZmV5IG1hZ2ljCisgKiBhbmQgZXZlcnl0aGluZyBpcyBPSy4gKi8KK3N0YXRpYyBpbmxpbmUgaW50CithZGRfY291bnRlcl90b19lbnRyeShzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCQkgICAgIGNvbnN0IHN0cnVjdCBpcHRfY291bnRlcnMgYWRkbWVbXSwKKwkJICAgICB1bnNpZ25lZCBpbnQgKmkpCit7CisjaWYgMAorCWR1cHJpbnRmKCJhZGRfY291bnRlcjogRW50cnkgJXUgJWx1LyVsdSArICVsdS8lbHVcbiIsCisJCSAqaSwKKwkJIChsb25nIHVuc2lnbmVkIGludCllLT5jb3VudGVycy5wY250LAorCQkgKGxvbmcgdW5zaWduZWQgaW50KWUtPmNvdW50ZXJzLmJjbnQsCisJCSAobG9uZyB1bnNpZ25lZCBpbnQpYWRkbWVbKmldLnBjbnQsCisJCSAobG9uZyB1bnNpZ25lZCBpbnQpYWRkbWVbKmldLmJjbnQpOworI2VuZGlmCisKKwlBRERfQ09VTlRFUihlLT5jb3VudGVycywgYWRkbWVbKmldLmJjbnQsIGFkZG1lWyppXS5wY250KTsKKworCSgqaSkrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZG9fYWRkX2NvdW50ZXJzKHZvaWQgX191c2VyICp1c2VyLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBpcHRfY291bnRlcnNfaW5mbyB0bXAsICpwYWRkYzsKKwlzdHJ1Y3QgaXB0X3RhYmxlICp0OworCWludCByZXQgPSAwOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXAsIHVzZXIsIHNpemVvZih0bXApKSAhPSAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChsZW4gIT0gc2l6ZW9mKHRtcCkgKyB0bXAubnVtX2NvdW50ZXJzKnNpemVvZihzdHJ1Y3QgaXB0X2NvdW50ZXJzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwYWRkYyA9IHZtYWxsb2MobGVuKTsKKwlpZiAoIXBhZGRjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihwYWRkYywgdXNlciwgbGVuKSAhPSAwKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZnJlZTsKKwl9CisKKwl0ID0gZmluZF90YWJsZV9sb2NrKHRtcC5uYW1lKTsKKwlpZiAoIXQgfHwgSVNfRVJSKHQpKSB7CisJCXJldCA9IHQgPyBQVFJfRVJSKHQpIDogLUVOT0VOVDsKKwkJZ290byBmcmVlOworCX0KKworCXdyaXRlX2xvY2tfYmgoJnQtPmxvY2spOworCWlmICh0LT5wcml2YXRlLT5udW1iZXIgIT0gcGFkZGMtPm51bV9jb3VudGVycykgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHVubG9ja191cF9mcmVlOworCX0KKworCWkgPSAwOworCUlQVF9FTlRSWV9JVEVSQVRFKHQtPnByaXZhdGUtPmVudHJpZXMsCisJCQkgIHQtPnByaXZhdGUtPnNpemUsCisJCQkgIGFkZF9jb3VudGVyX3RvX2VudHJ5LAorCQkJICBwYWRkYy0+Y291bnRlcnMsCisJCQkgICZpKTsKKyB1bmxvY2tfdXBfZnJlZToKKwl3cml0ZV91bmxvY2tfYmgoJnQtPmxvY2spOworCXVwKCZpcHRfbXV0ZXgpOworCW1vZHVsZV9wdXQodC0+bWUpOworIGZyZWU6CisJdmZyZWUocGFkZGMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorZG9faXB0X3NldF9jdGwoc3RydWN0IHNvY2sgKnNrLAlpbnQgY21kLCB2b2lkIF9fdXNlciAqdXNlciwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpbnQgcmV0OworCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIElQVF9TT19TRVRfUkVQTEFDRToKKwkJcmV0ID0gZG9fcmVwbGFjZSh1c2VyLCBsZW4pOworCQlicmVhazsKKworCWNhc2UgSVBUX1NPX1NFVF9BRERfQ09VTlRFUlM6CisJCXJldCA9IGRvX2FkZF9jb3VudGVycyh1c2VyLCBsZW4pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWR1cHJpbnRmKCJkb19pcHRfc2V0X2N0bDogIHVua25vd24gcmVxdWVzdCAlaVxuIiwgY21kKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50Citkb19pcHRfZ2V0X2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHZvaWQgX191c2VyICp1c2VyLCBpbnQgKmxlbikKK3sKKwlpbnQgcmV0OworCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIElQVF9TT19HRVRfSU5GTzogeworCQljaGFyIG5hbWVbSVBUX1RBQkxFX01BWE5BTUVMRU5dOworCQlzdHJ1Y3QgaXB0X3RhYmxlICp0OworCisJCWlmICgqbGVuICE9IHNpemVvZihzdHJ1Y3QgaXB0X2dldGluZm8pKSB7CisJCQlkdXByaW50ZigibGVuZ3RoICV1ICE9ICV1XG4iLCAqbGVuLAorCQkJCSBzaXplb2Yoc3RydWN0IGlwdF9nZXRpbmZvKSk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoY29weV9mcm9tX3VzZXIobmFtZSwgdXNlciwgc2l6ZW9mKG5hbWUpKSAhPSAwKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJbmFtZVtJUFRfVEFCTEVfTUFYTkFNRUxFTi0xXSA9ICdcMCc7CisKKwkJdCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGZpbmRfdGFibGVfbG9jayhuYW1lKSwKKwkJCQkJICAgICJpcHRhYmxlXyVzIiwgbmFtZSk7CisJCWlmICh0ICYmICFJU19FUlIodCkpIHsKKwkJCXN0cnVjdCBpcHRfZ2V0aW5mbyBpbmZvOworCisJCQlpbmZvLnZhbGlkX2hvb2tzID0gdC0+dmFsaWRfaG9va3M7CisJCQltZW1jcHkoaW5mby5ob29rX2VudHJ5LCB0LT5wcml2YXRlLT5ob29rX2VudHJ5LAorCQkJICAgICAgIHNpemVvZihpbmZvLmhvb2tfZW50cnkpKTsKKwkJCW1lbWNweShpbmZvLnVuZGVyZmxvdywgdC0+cHJpdmF0ZS0+dW5kZXJmbG93LAorCQkJICAgICAgIHNpemVvZihpbmZvLnVuZGVyZmxvdykpOworCQkJaW5mby5udW1fZW50cmllcyA9IHQtPnByaXZhdGUtPm51bWJlcjsKKwkJCWluZm8uc2l6ZSA9IHQtPnByaXZhdGUtPnNpemU7CisJCQltZW1jcHkoaW5mby5uYW1lLCBuYW1lLCBzaXplb2YoaW5mby5uYW1lKSk7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIodXNlciwgJmluZm8sICpsZW4pICE9IDApCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWVsc2UKKwkJCQlyZXQgPSAwOworCQkJdXAoJmlwdF9tdXRleCk7CisJCQltb2R1bGVfcHV0KHQtPm1lKTsKKwkJfSBlbHNlCisJCQlyZXQgPSB0ID8gUFRSX0VSUih0KSA6IC1FTk9FTlQ7CisJfQorCWJyZWFrOworCisJY2FzZSBJUFRfU09fR0VUX0VOVFJJRVM6IHsKKwkJc3RydWN0IGlwdF9nZXRfZW50cmllcyBnZXQ7CisKKwkJaWYgKCpsZW4gPCBzaXplb2YoZ2V0KSkgeworCQkJZHVwcmludGYoImdldF9lbnRyaWVzOiAldSA8ICV1XG4iLCAqbGVuLCBzaXplb2YoZ2V0KSk7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9IGVsc2UgaWYgKGNvcHlfZnJvbV91c2VyKCZnZXQsIHVzZXIsIHNpemVvZihnZXQpKSAhPSAwKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQl9IGVsc2UgaWYgKCpsZW4gIT0gc2l6ZW9mKHN0cnVjdCBpcHRfZ2V0X2VudHJpZXMpICsgZ2V0LnNpemUpIHsKKwkJCWR1cHJpbnRmKCJnZXRfZW50cmllczogJXUgIT0gJXVcbiIsICpsZW4sCisJCQkJIHNpemVvZihzdHJ1Y3QgaXB0X2dldF9lbnRyaWVzKSArIGdldC5zaXplKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0gZWxzZQorCQkJcmV0ID0gZ2V0X2VudHJpZXMoJmdldCwgdXNlcik7CisJCWJyZWFrOworCX0KKworCWNhc2UgSVBUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSDoKKwljYXNlIElQVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUOiB7CisJCXN0cnVjdCBpcHRfZ2V0X3JldmlzaW9uIHJldjsKKwkJaW50ICgqcmV2Zm4pKGNvbnN0IGNoYXIgKiwgdTgsIGludCAqKTsKKworCQlpZiAoKmxlbiAhPSBzaXplb2YocmV2KSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcmV2LCB1c2VyLCBzaXplb2YocmV2KSkgIT0gMCkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGNtZCA9PSBJUFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVCkKKwkJCXJldmZuID0gdGFyZ2V0X3JldmZuOworCQllbHNlCisJCQlyZXZmbiA9IG1hdGNoX3JldmZuOworCisJCXRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGZpbmRfcmV2aXNpb24ocmV2Lm5hbWUsIHJldi5yZXZpc2lvbiwKKwkJCQkJCSAgICAgIHJldmZuLCAmcmV0KSwKKwkJCQkJImlwdF8lcyIsIHJldi5uYW1lKTsKKwkJYnJlYWs7CisJfQorCisJZGVmYXVsdDoKKwkJZHVwcmludGYoImRvX2lwdF9nZXRfY3RsOiB1bmtub3duIHJlcXVlc3QgJWlcbiIsIGNtZCk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogUmVnaXN0cmF0aW9uIGhvb2tzIGZvciB0YXJnZXRzLiAqLworaW50CitpcHRfcmVnaXN0ZXJfdGFyZ2V0KHN0cnVjdCBpcHRfdGFyZ2V0ICp0YXJnZXQpCit7CisJaW50IHJldDsKKworCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmaXB0X211dGV4KTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisJbGlzdF9hZGQoJnRhcmdldC0+bGlzdCwgJmlwdF90YXJnZXQpOworCXVwKCZpcHRfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQKK2lwdF91bnJlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgaXB0X3RhcmdldCAqdGFyZ2V0KQoreworCWRvd24oJmlwdF9tdXRleCk7CisJTElTVF9ERUxFVEUoJmlwdF90YXJnZXQsIHRhcmdldCk7CisJdXAoJmlwdF9tdXRleCk7Cit9CisKK2ludAoraXB0X3JlZ2lzdGVyX21hdGNoKHN0cnVjdCBpcHRfbWF0Y2ggKm1hdGNoKQoreworCWludCByZXQ7CisKKwlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJmlwdF9tdXRleCk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJbGlzdF9hZGQoJm1hdGNoLT5saXN0LCAmaXB0X21hdGNoKTsKKwl1cCgmaXB0X211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQKK2lwdF91bnJlZ2lzdGVyX21hdGNoKHN0cnVjdCBpcHRfbWF0Y2ggKm1hdGNoKQoreworCWRvd24oJmlwdF9tdXRleCk7CisJTElTVF9ERUxFVEUoJmlwdF9tYXRjaCwgbWF0Y2gpOworCXVwKCZpcHRfbXV0ZXgpOworfQorCitpbnQgaXB0X3JlZ2lzdGVyX3RhYmxlKHN0cnVjdCBpcHRfdGFibGUgKnRhYmxlLCBjb25zdCBzdHJ1Y3QgaXB0X3JlcGxhY2UgKnJlcGwpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaXB0X3RhYmxlX2luZm8gKm5ld2luZm87CisJc3RhdGljIHN0cnVjdCBpcHRfdGFibGVfaW5mbyBib290c3RyYXAKKwkJPSB7IDAsIDAsIDAsIHsgMCB9LCB7IDAgfSwgeyB9IH07CisKKwluZXdpbmZvID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IGlwdF90YWJsZV9pbmZvKQorCQkJICArIFNNUF9BTElHTihyZXBsLT5zaXplKSAqIG51bV9wb3NzaWJsZV9jcHVzKCkpOworCWlmICghbmV3aW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1jcHkobmV3aW5mby0+ZW50cmllcywgcmVwbC0+ZW50cmllcywgcmVwbC0+c2l6ZSk7CisKKwlyZXQgPSB0cmFuc2xhdGVfdGFibGUodGFibGUtPm5hbWUsIHRhYmxlLT52YWxpZF9ob29rcywKKwkJCSAgICAgIG5ld2luZm8sIHJlcGwtPnNpemUsCisJCQkgICAgICByZXBsLT5udW1fZW50cmllcywKKwkJCSAgICAgIHJlcGwtPmhvb2tfZW50cnksCisJCQkgICAgICByZXBsLT51bmRlcmZsb3cpOworCWlmIChyZXQgIT0gMCkgeworCQl2ZnJlZShuZXdpbmZvKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJmlwdF9tdXRleCk7CisJaWYgKHJldCAhPSAwKSB7CisJCXZmcmVlKG5ld2luZm8pOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIERvbid0IGF1dG9sb2FkOiB3ZSdkIGVhdCBvdXIgdGFpbC4uLiAqLworCWlmIChsaXN0X25hbWVkX2ZpbmQoJmlwdF90YWJsZXMsIHRhYmxlLT5uYW1lKSkgeworCQlyZXQgPSAtRUVYSVNUOworCQlnb3RvIGZyZWVfdW5sb2NrOworCX0KKworCS8qIFNpbXBsaWZpZXMgcmVwbGFjZV90YWJsZSBjb2RlLiAqLworCXRhYmxlLT5wcml2YXRlID0gJmJvb3RzdHJhcDsKKwlpZiAoIXJlcGxhY2VfdGFibGUodGFibGUsIDAsIG5ld2luZm8sICZyZXQpKQorCQlnb3RvIGZyZWVfdW5sb2NrOworCisJZHVwcmludGYoInRhYmxlLT5wcml2YXRlLT5udW1iZXIgPSAldVxuIiwKKwkJIHRhYmxlLT5wcml2YXRlLT5udW1iZXIpOworCQorCS8qIHNhdmUgbnVtYmVyIG9mIGluaXRpYWwgZW50cmllcyAqLworCXRhYmxlLT5wcml2YXRlLT5pbml0aWFsX2VudHJpZXMgPSB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyOworCisJcndsb2NrX2luaXQoJnRhYmxlLT5sb2NrKTsKKwlsaXN0X3ByZXBlbmQoJmlwdF90YWJsZXMsIHRhYmxlKTsKKworIHVubG9jazoKKwl1cCgmaXB0X211dGV4KTsKKwlyZXR1cm4gcmV0OworCisgZnJlZV91bmxvY2s6CisJdmZyZWUobmV3aW5mbyk7CisJZ290byB1bmxvY2s7Cit9CisKK3ZvaWQgaXB0X3VucmVnaXN0ZXJfdGFibGUoc3RydWN0IGlwdF90YWJsZSAqdGFibGUpCit7CisJZG93bigmaXB0X211dGV4KTsKKwlMSVNUX0RFTEVURSgmaXB0X3RhYmxlcywgdGFibGUpOworCXVwKCZpcHRfbXV0ZXgpOworCisJLyogRGVjcmVhc2UgbW9kdWxlIHVzYWdlIGNvdW50cyBhbmQgZnJlZSByZXNvdXJjZXMgKi8KKwlJUFRfRU5UUllfSVRFUkFURSh0YWJsZS0+cHJpdmF0ZS0+ZW50cmllcywgdGFibGUtPnByaXZhdGUtPnNpemUsCisJCQkgIGNsZWFudXBfZW50cnksIE5VTEwpOworCXZmcmVlKHRhYmxlLT5wcml2YXRlKTsKK30KKworLyogUmV0dXJucyAxIGlmIHRoZSBwb3J0IGlzIG1hdGNoZWQgYnkgdGhlIHJhbmdlLCAwIG90aGVyd2lzZSAqLworc3RhdGljIGlubGluZSBpbnQKK3BvcnRfbWF0Y2godV9pbnQxNl90IG1pbiwgdV9pbnQxNl90IG1heCwgdV9pbnQxNl90IHBvcnQsIGludCBpbnZlcnQpCit7CisJaW50IHJldDsKKworCXJldCA9IChwb3J0ID49IG1pbiAmJiBwb3J0IDw9IG1heCkgXiBpbnZlcnQ7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAordGNwX2ZpbmRfb3B0aW9uKHVfaW50OF90IG9wdGlvbiwKKwkJY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJdW5zaWduZWQgaW50IG9wdGxlbiwKKwkJaW50IGludmVydCwKKwkJaW50ICpob3Rkcm9wKQoreworCS8qIHRjcC5kb2ZmIGlzIG9ubHkgNCBiaXRzLCBpZS4gbWF4IDE1ICogNCBieXRlcyAqLworCXVfaW50OF90IF9vcHRbNjAgLSBzaXplb2Yoc3RydWN0IHRjcGhkcildLCAqb3A7CisJdW5zaWduZWQgaW50IGk7CisKKwlkdXByaW50ZigidGNwX21hdGNoOiBmaW5kaW5nIG9wdGlvblxuIik7CisKKwlpZiAoIW9wdGxlbikKKwkJcmV0dXJuIGludmVydDsKKworCS8qIElmIHdlIGRvbid0IGhhdmUgdGhlIHdob2xlIGhlYWRlciwgZHJvcCBwYWNrZXQuICovCisJb3AgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLAorCQkJCXNrYi0+bmguaXBoLT5paGwqNCArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSwKKwkJCQlvcHRsZW4sIF9vcHQpOworCWlmIChvcCA9PSBOVUxMKSB7CisJCSpob3Rkcm9wID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG9wdGxlbjsgKSB7CisJCWlmIChvcFtpXSA9PSBvcHRpb24pIHJldHVybiAhaW52ZXJ0OworCQlpZiAob3BbaV0gPCAyKSBpKys7CisJCWVsc2UgaSArPSBvcFtpKzFdPzoxOworCX0KKworCXJldHVybiBpbnZlcnQ7Cit9CisKK3N0YXRpYyBpbnQKK3RjcF9tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKwkgIGludCBvZmZzZXQsCisJICBpbnQgKmhvdGRyb3ApCit7CisJc3RydWN0IHRjcGhkciBfdGNwaCwgKnRoOworCWNvbnN0IHN0cnVjdCBpcHRfdGNwICp0Y3BpbmZvID0gbWF0Y2hpbmZvOworCisJaWYgKG9mZnNldCkgeworCQkvKiBUbyBxdW90ZSBBbGFuOgorCisJCSAgIERvbid0IGFsbG93IGEgZnJhZ21lbnQgb2YgVENQIDggYnl0ZXMgaW4uIE5vYm9keSBub3JtYWwKKwkJICAgY2F1c2VzIHRoaXMuIEl0cyBhIGNyYWNrZXIgdHJ5aW5nIHRvIGJyZWFrIGluIGJ5IGRvaW5nIGEKKwkJICAgZmxhZyBvdmVyd3JpdGUgdG8gcGFzcyB0aGUgZGlyZWN0aW9uIGNoZWNrcy4KKwkJKi8KKwkJaWYgKG9mZnNldCA9PSAxKSB7CisJCQlkdXByaW50ZigiRHJvcHBpbmcgZXZpbCBUQ1Agb2Zmc2V0PTEgZnJhZy5cbiIpOworCQkJKmhvdGRyb3AgPSAxOworCQl9CisJCS8qIE11c3Qgbm90IGJlIGEgZnJhZ21lbnQuICovCisJCXJldHVybiAwOworCX0KKworI2RlZmluZSBGV0lOVlRDUChib29sLGludmZsZykgKChib29sKSBeICEhKHRjcGluZm8tPmludmZsYWdzICYgaW52ZmxnKSkKKworCXRoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2tiLT5uaC5pcGgtPmlobCo0LAorCQkJCXNpemVvZihfdGNwaCksICZfdGNwaCk7CisJaWYgKHRoID09IE5VTEwpIHsKKwkJLyogV2UndmUgYmVlbiBhc2tlZCB0byBleGFtaW5lIHRoaXMgcGFja2V0LCBhbmQgd2UKKwkJICAgY2FuJ3QuICBIZW5jZSwgbm8gY2hvaWNlIGJ1dCB0byBkcm9wLiAqLworCQlkdXByaW50ZigiRHJvcHBpbmcgZXZpbCBUQ1Agb2Zmc2V0PTAgdGlueWdyYW0uXG4iKTsKKwkJKmhvdGRyb3AgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXBvcnRfbWF0Y2godGNwaW5mby0+c3B0c1swXSwgdGNwaW5mby0+c3B0c1sxXSwKKwkJCW50b2hzKHRoLT5zb3VyY2UpLAorCQkJISEodGNwaW5mby0+aW52ZmxhZ3MgJiBJUFRfVENQX0lOVl9TUkNQVCkpKQorCQlyZXR1cm4gMDsKKwlpZiAoIXBvcnRfbWF0Y2godGNwaW5mby0+ZHB0c1swXSwgdGNwaW5mby0+ZHB0c1sxXSwKKwkJCW50b2hzKHRoLT5kZXN0KSwKKwkJCSEhKHRjcGluZm8tPmludmZsYWdzICYgSVBUX1RDUF9JTlZfRFNUUFQpKSkKKwkJcmV0dXJuIDA7CisJaWYgKCFGV0lOVlRDUCgoKCh1bnNpZ25lZCBjaGFyICopdGgpWzEzXSAmIHRjcGluZm8tPmZsZ19tYXNrKQorCQkgICAgICA9PSB0Y3BpbmZvLT5mbGdfY21wLAorCQkgICAgICBJUFRfVENQX0lOVl9GTEFHUykpCisJCXJldHVybiAwOworCWlmICh0Y3BpbmZvLT5vcHRpb24pIHsKKwkJaWYgKHRoLT5kb2ZmICogNCA8IHNpemVvZihfdGNwaCkpIHsKKwkJCSpob3Rkcm9wID0gMTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmICghdGNwX2ZpbmRfb3B0aW9uKHRjcGluZm8tPm9wdGlvbiwgc2tiLAorCQkJCSAgICAgdGgtPmRvZmYqNCAtIHNpemVvZihfdGNwaCksCisJCQkJICAgICB0Y3BpbmZvLT5pbnZmbGFncyAmIElQVF9UQ1BfSU5WX09QVElPTiwKKwkJCQkgICAgIGhvdGRyb3ApKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCisvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCitzdGF0aWMgaW50Cit0Y3BfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgICAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCSAgICAgICB2b2lkICptYXRjaGluZm8sCisJICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IGlwdF90Y3AgKnRjcGluZm8gPSBtYXRjaGluZm87CisKKwkvKiBNdXN0IHNwZWNpZnkgcHJvdG8gPT0gVENQLCBhbmQgbm8gdW5rbm93biBpbnZmbGFncyAqLworCXJldHVybiBpcC0+cHJvdG8gPT0gSVBQUk9UT19UQ1AKKwkJJiYgIShpcC0+aW52ZmxhZ3MgJiBJUFRfSU5WX1BST1RPKQorCQkmJiBtYXRjaHNpemUgPT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3RjcCkpCisJCSYmICEodGNwaW5mby0+aW52ZmxhZ3MgJiB+SVBUX1RDUF9JTlZfTUFTSyk7Cit9CisKK3N0YXRpYyBpbnQKK3VkcF9tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKwkgIGludCBvZmZzZXQsCisJICBpbnQgKmhvdGRyb3ApCit7CisJc3RydWN0IHVkcGhkciBfdWRwaCwgKnVoOworCWNvbnN0IHN0cnVjdCBpcHRfdWRwICp1ZHBpbmZvID0gbWF0Y2hpbmZvOworCisJLyogTXVzdCBub3QgYmUgYSBmcmFnbWVudC4gKi8KKwlpZiAob2Zmc2V0KQorCQlyZXR1cm4gMDsKKworCXVoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2tiLT5uaC5pcGgtPmlobCo0LAorCQkJCXNpemVvZihfdWRwaCksICZfdWRwaCk7CisJaWYgKHVoID09IE5VTEwpIHsKKwkJLyogV2UndmUgYmVlbiBhc2tlZCB0byBleGFtaW5lIHRoaXMgcGFja2V0LCBhbmQgd2UKKwkJICAgY2FuJ3QuICBIZW5jZSwgbm8gY2hvaWNlIGJ1dCB0byBkcm9wLiAqLworCQlkdXByaW50ZigiRHJvcHBpbmcgZXZpbCBVRFAgdGlueWdyYW0uXG4iKTsKKwkJKmhvdGRyb3AgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gcG9ydF9tYXRjaCh1ZHBpbmZvLT5zcHRzWzBdLCB1ZHBpbmZvLT5zcHRzWzFdLAorCQkJICBudG9ocyh1aC0+c291cmNlKSwKKwkJCSAgISEodWRwaW5mby0+aW52ZmxhZ3MgJiBJUFRfVURQX0lOVl9TUkNQVCkpCisJCSYmIHBvcnRfbWF0Y2godWRwaW5mby0+ZHB0c1swXSwgdWRwaW5mby0+ZHB0c1sxXSwKKwkJCSAgICAgIG50b2hzKHVoLT5kZXN0KSwKKwkJCSAgICAgICEhKHVkcGluZm8tPmludmZsYWdzICYgSVBUX1VEUF9JTlZfRFNUUFQpKTsKK30KKworLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLworc3RhdGljIGludAordWRwX2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCSAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAorCSAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hpbmZvc2l6ZSwKKwkgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgaXB0X3VkcCAqdWRwaW5mbyA9IG1hdGNoaW5mbzsKKworCS8qIE11c3Qgc3BlY2lmeSBwcm90byA9PSBVRFAsIGFuZCBubyB1bmtub3duIGludmZsYWdzICovCisJaWYgKGlwLT5wcm90byAhPSBJUFBST1RPX1VEUCB8fCAoaXAtPmludmZsYWdzICYgSVBUX0lOVl9QUk9UTykpIHsKKwkJZHVwcmludGYoImlwdF91ZHA6IFByb3RvY29sICV1ICE9ICV1XG4iLCBpcC0+cHJvdG8sCisJCQkgSVBQUk9UT19VRFApOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKG1hdGNoaW5mb3NpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3VkcCkpKSB7CisJCWR1cHJpbnRmKCJpcHRfdWRwOiBtYXRjaHNpemUgJXUgIT0gJXVcbiIsCisJCQkgbWF0Y2hpbmZvc2l6ZSwgSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3VkcCkpKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICh1ZHBpbmZvLT5pbnZmbGFncyAmIH5JUFRfVURQX0lOVl9NQVNLKSB7CisJCWR1cHJpbnRmKCJpcHRfdWRwOiB1bmtub3duIGZsYWdzICVYXG4iLAorCQkJIHVkcGluZm8tPmludmZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qIFJldHVybnMgMSBpZiB0aGUgdHlwZSBhbmQgY29kZSBpcyBtYXRjaGVkIGJ5IHRoZSByYW5nZSwgMCBvdGhlcndpc2UgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitpY21wX3R5cGVfY29kZV9tYXRjaCh1X2ludDhfdCB0ZXN0X3R5cGUsIHVfaW50OF90IG1pbl9jb2RlLCB1X2ludDhfdCBtYXhfY29kZSwKKwkJICAgICB1X2ludDhfdCB0eXBlLCB1X2ludDhfdCBjb2RlLAorCQkgICAgIGludCBpbnZlcnQpCit7CisJcmV0dXJuICgodGVzdF90eXBlID09IDB4RkYpIHx8ICh0eXBlID09IHRlc3RfdHlwZSAmJiBjb2RlID49IG1pbl9jb2RlICYmIGNvZGUgPD0gbWF4X2NvZGUpKQorCQleIGludmVydDsKK30KKworc3RhdGljIGludAoraWNtcF9tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKwkgICBpbnQgb2Zmc2V0LAorCSAgIGludCAqaG90ZHJvcCkKK3sKKwlzdHJ1Y3QgaWNtcGhkciBfaWNtcGgsICppYzsKKwljb25zdCBzdHJ1Y3QgaXB0X2ljbXAgKmljbXBpbmZvID0gbWF0Y2hpbmZvOworCisJLyogTXVzdCBub3QgYmUgYSBmcmFnbWVudC4gKi8KKwlpZiAob2Zmc2V0KQorCQlyZXR1cm4gMDsKKworCWljID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2tiLT5uaC5pcGgtPmlobCo0LAorCQkJCXNpemVvZihfaWNtcGgpLCAmX2ljbXBoKTsKKwlpZiAoaWMgPT0gTlVMTCkgeworCQkvKiBXZSd2ZSBiZWVuIGFza2VkIHRvIGV4YW1pbmUgdGhpcyBwYWNrZXQsIGFuZCB3ZQorCQkgKiBjYW4ndC4gIEhlbmNlLCBubyBjaG9pY2UgYnV0IHRvIGRyb3AuCisJCSAqLworCQlkdXByaW50ZigiRHJvcHBpbmcgZXZpbCBJQ01QIHRpbnlncmFtLlxuIik7CisJCSpob3Rkcm9wID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGljbXBfdHlwZV9jb2RlX21hdGNoKGljbXBpbmZvLT50eXBlLAorCQkJCSAgICBpY21waW5mby0+Y29kZVswXSwKKwkJCQkgICAgaWNtcGluZm8tPmNvZGVbMV0sCisJCQkJICAgIGljLT50eXBlLCBpYy0+Y29kZSwKKwkJCQkgICAgISEoaWNtcGluZm8tPmludmZsYWdzJklQVF9JQ01QX0lOVikpOworfQorCisvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCitzdGF0aWMgaW50CitpY21wX2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCSAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCSAgIHZvaWQgKm1hdGNoaW5mbywKKwkgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorCSAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IGlwdF9pY21wICppY21waW5mbyA9IG1hdGNoaW5mbzsKKworCS8qIE11c3Qgc3BlY2lmeSBwcm90byA9PSBJQ01QLCBhbmQgbm8gdW5rbm93biBpbnZmbGFncyAqLworCXJldHVybiBpcC0+cHJvdG8gPT0gSVBQUk9UT19JQ01QCisJCSYmICEoaXAtPmludmZsYWdzICYgSVBUX0lOVl9QUk9UTykKKwkJJiYgbWF0Y2hzaXplID09IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9pY21wKSkKKwkJJiYgIShpY21waW5mby0+aW52ZmxhZ3MgJiB+SVBUX0lDTVBfSU5WKTsKK30KKworLyogVGhlIGJ1aWx0LWluIHRhcmdldHM6IHN0YW5kYXJkIChOVUxMKSBhbmQgZXJyb3IuICovCitzdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgaXB0X3N0YW5kYXJkX3RhcmdldCA9IHsKKwkubmFtZQkJPSBJUFRfU1RBTkRBUkRfVEFSR0VULAorfTsKKworc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF9lcnJvcl90YXJnZXQgPSB7CisJLm5hbWUJCT0gSVBUX0VSUk9SX1RBUkdFVCwKKwkudGFyZ2V0CQk9IGlwdF9lcnJvciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmZfc29ja29wdF9vcHMgaXB0X3NvY2tvcHRzID0geworCS5wZgkJPSBQRl9JTkVULAorCS5zZXRfb3B0bWluCT0gSVBUX0JBU0VfQ1RMLAorCS5zZXRfb3B0bWF4CT0gSVBUX1NPX1NFVF9NQVgrMSwKKwkuc2V0CQk9IGRvX2lwdF9zZXRfY3RsLAorCS5nZXRfb3B0bWluCT0gSVBUX0JBU0VfQ1RMLAorCS5nZXRfb3B0bWF4CT0gSVBUX1NPX0dFVF9NQVgrMSwKKwkuZ2V0CQk9IGRvX2lwdF9nZXRfY3RsLAorfTsKKworc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggdGNwX21hdGNoc3RydWN0ID0geworCS5uYW1lCQk9ICJ0Y3AiLAorCS5tYXRjaAkJPSAmdGNwX21hdGNoLAorCS5jaGVja2VudHJ5CT0gJnRjcF9jaGVja2VudHJ5LAorfTsKKworc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggdWRwX21hdGNoc3RydWN0ID0geworCS5uYW1lCQk9ICJ1ZHAiLAorCS5tYXRjaAkJPSAmdWRwX21hdGNoLAorCS5jaGVja2VudHJ5CT0gJnVkcF9jaGVja2VudHJ5LAorfTsKKworc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggaWNtcF9tYXRjaHN0cnVjdCA9IHsKKwkubmFtZQkJPSAiaWNtcCIsCisJLm1hdGNoCQk9ICZpY21wX21hdGNoLAorCS5jaGVja2VudHJ5CT0gJmljbXBfY2hlY2tlbnRyeSwKK307CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIGlubGluZSBpbnQgcHJpbnRfbmFtZShjb25zdCBjaGFyICppLAorCQkJICAgICBvZmZfdCBzdGFydF9vZmZzZXQsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCwKKwkJCSAgICAgb2ZmX3QgKnBvcywgdW5zaWduZWQgaW50ICpjb3VudCkKK3sKKwlpZiAoKCpjb3VudCkrKyA+PSBzdGFydF9vZmZzZXQpIHsKKwkJdW5zaWduZWQgaW50IG5hbWVsZW47CisKKwkJbmFtZWxlbiA9IHNwcmludGYoYnVmZmVyICsgKnBvcywgIiVzXG4iLAorCQkJCSAgaSArIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSk7CisJCWlmICgqcG9zICsgbmFtZWxlbiA+IGxlbmd0aCkgeworCQkJLyogU3RvcCBpdGVyYXRpbmcgKi8KKwkJCXJldHVybiAxOworCQl9CisJCSpwb3MgKz0gbmFtZWxlbjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByaW50X3RhcmdldChjb25zdCBzdHJ1Y3QgaXB0X3RhcmdldCAqdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZfdCBzdGFydF9vZmZzZXQsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZfdCAqcG9zLCB1bnNpZ25lZCBpbnQgKmNvdW50KQoreworCWlmICh0ID09ICZpcHRfc3RhbmRhcmRfdGFyZ2V0IHx8IHQgPT0gJmlwdF9lcnJvcl90YXJnZXQpCisJCXJldHVybiAwOworCXJldHVybiBwcmludF9uYW1lKChjaGFyICopdCwgc3RhcnRfb2Zmc2V0LCBidWZmZXIsIGxlbmd0aCwgcG9zLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgaXB0X2dldF90YWJsZXMoY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCkKK3sKKwlvZmZfdCBwb3MgPSAwOworCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZpcHRfbXV0ZXgpICE9IDApCisJCXJldHVybiAwOworCisJTElTVF9GSU5EKCZpcHRfdGFibGVzLCBwcmludF9uYW1lLCB2b2lkICosCisJCSAgb2Zmc2V0LCBidWZmZXIsIGxlbmd0aCwgJnBvcywgJmNvdW50KTsKKworCXVwKCZpcHRfbXV0ZXgpOworCisJLyogYHN0YXJ0JyBoYWNrIC0gc2VlIGZzL3Byb2MvZ2VuZXJpYy5jIGxpbmUgfjEwNSAqLworCSpzdGFydD0oY2hhciAqKSgodW5zaWduZWQgbG9uZyljb3VudC1vZmZzZXQpOworCXJldHVybiBwb3M7Cit9CisKK3N0YXRpYyBpbnQgaXB0X2dldF90YXJnZXRzKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgpCit7CisJb2ZmX3QgcG9zID0gMDsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSAwOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmaXB0X211dGV4KSAhPSAwKQorCQlyZXR1cm4gMDsKKworCUxJU1RfRklORCgmaXB0X3RhcmdldCwgcHJpbnRfdGFyZ2V0LCBzdHJ1Y3QgaXB0X3RhcmdldCAqLAorCQkgIG9mZnNldCwgYnVmZmVyLCBsZW5ndGgsICZwb3MsICZjb3VudCk7CisJCisJdXAoJmlwdF9tdXRleCk7CisKKwkqc3RhcnQgPSAoY2hhciAqKSgodW5zaWduZWQgbG9uZyljb3VudCAtIG9mZnNldCk7CisJcmV0dXJuIHBvczsKK30KKworc3RhdGljIGludCBpcHRfZ2V0X21hdGNoZXMoY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCkKK3sKKwlvZmZfdCBwb3MgPSAwOworCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZpcHRfbXV0ZXgpICE9IDApCisJCXJldHVybiAwOworCQorCUxJU1RfRklORCgmaXB0X21hdGNoLCBwcmludF9uYW1lLCB2b2lkICosCisJCSAgb2Zmc2V0LCBidWZmZXIsIGxlbmd0aCwgJnBvcywgJmNvdW50KTsKKworCXVwKCZpcHRfbXV0ZXgpOworCisJKnN0YXJ0ID0gKGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpY291bnQgLSBvZmZzZXQpOworCXJldHVybiBwb3M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeyBjaGFyICpuYW1lOyBnZXRfaW5mb190ICpnZXRfaW5mbzsgfSBpcHRfcHJvY19lbnRyeVtdID0KK3sgeyAiaXBfdGFibGVzX25hbWVzIiwgaXB0X2dldF90YWJsZXMgfSwKKyAgeyAiaXBfdGFibGVzX3RhcmdldHMiLCBpcHRfZ2V0X3RhcmdldHMgfSwKKyAgeyAiaXBfdGFibGVzX21hdGNoZXMiLCBpcHRfZ2V0X21hdGNoZXMgfSwKKyAgeyBOVUxMLCBOVUxMfSB9OworI2VuZGlmIC8qQ09ORklHX1BST0NfRlMqLworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCS8qIE5vb25lIGVsc2Ugd2lsbCBiZSBkb3duaW5nIHNlbSBub3csIHNvIHdlIHdvbid0IHNsZWVwICovCisJZG93bigmaXB0X211dGV4KTsKKwlsaXN0X2FwcGVuZCgmaXB0X3RhcmdldCwgJmlwdF9zdGFuZGFyZF90YXJnZXQpOworCWxpc3RfYXBwZW5kKCZpcHRfdGFyZ2V0LCAmaXB0X2Vycm9yX3RhcmdldCk7CisJbGlzdF9hcHBlbmQoJmlwdF9tYXRjaCwgJnRjcF9tYXRjaHN0cnVjdCk7CisJbGlzdF9hcHBlbmQoJmlwdF9tYXRjaCwgJnVkcF9tYXRjaHN0cnVjdCk7CisJbGlzdF9hcHBlbmQoJmlwdF9tYXRjaCwgJmljbXBfbWF0Y2hzdHJ1Y3QpOworCXVwKCZpcHRfbXV0ZXgpOworCisJLyogUmVnaXN0ZXIgc2V0c29ja29wdCAqLworCXJldCA9IG5mX3JlZ2lzdGVyX3NvY2tvcHQoJmlwdF9zb2Nrb3B0cyk7CisJaWYgKHJldCA8IDApIHsKKwkJZHVwcmludGYoIlVuYWJsZSB0byByZWdpc3RlciBzb2Nrb3B0cy5cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJeworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvYzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGlwdF9wcm9jX2VudHJ5W2ldLm5hbWU7IGkrKykgeworCQlwcm9jID0gcHJvY19uZXRfY3JlYXRlKGlwdF9wcm9jX2VudHJ5W2ldLm5hbWUsIDAsCisJCQkJICAgICAgIGlwdF9wcm9jX2VudHJ5W2ldLmdldF9pbmZvKTsKKwkJaWYgKCFwcm9jKSB7CisJCQl3aGlsZSAoLS1pID49IDApCisJCQkJcHJvY19uZXRfcmVtb3ZlKGlwdF9wcm9jX2VudHJ5W2ldLm5hbWUpOworCQkJbmZfdW5yZWdpc3Rlcl9zb2Nrb3B0KCZpcHRfc29ja29wdHMpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJcHJvYy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwl9CisJfQorI2VuZGlmCisKKwlwcmludGsoImlwX3RhYmxlczogKEMpIDIwMDAtMjAwMiBOZXRmaWx0ZXIgY29yZSB0ZWFtXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwluZl91bnJlZ2lzdGVyX3NvY2tvcHQoJmlwdF9zb2Nrb3B0cyk7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwl7CisJaW50IGk7CisJZm9yIChpID0gMDsgaXB0X3Byb2NfZW50cnlbaV0ubmFtZTsgaSsrKQorCQlwcm9jX25ldF9yZW1vdmUoaXB0X3Byb2NfZW50cnlbaV0ubmFtZSk7CisJfQorI2VuZGlmCit9CisKK0VYUE9SVF9TWU1CT0woaXB0X3JlZ2lzdGVyX3RhYmxlKTsKK0VYUE9SVF9TWU1CT0woaXB0X3VucmVnaXN0ZXJfdGFibGUpOworRVhQT1JUX1NZTUJPTChpcHRfcmVnaXN0ZXJfbWF0Y2gpOworRVhQT1JUX1NZTUJPTChpcHRfdW5yZWdpc3Rlcl9tYXRjaCk7CitFWFBPUlRfU1lNQk9MKGlwdF9kb190YWJsZSk7CitFWFBPUlRfU1lNQk9MKGlwdF9yZWdpc3Rlcl90YXJnZXQpOworRVhQT1JUX1NZTUJPTChpcHRfdW5yZWdpc3Rlcl90YXJnZXQpOworRVhQT1JUX1NZTUJPTChpcHRfZmluZF90YXJnZXQpOworCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTEFTU0lGWS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTEFTU0lGWS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NDJlNmUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMQVNTSUZZLmMKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIFRoaXMgaXMgYSBtb2R1bGUgd2hpY2ggaXMgdXNlZCBmb3Igc2V0dGluZyB0aGUgc2tiLT5wcmlvcml0eSBmaWVsZAorICogb2YgYW4gc2tiIGZvciBxZGlzYyBjbGFzc2lmaWNhdGlvbi4KKyAqLworCisvKiAoQykgMjAwMS0yMDAyIFBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfQ0xBU1NJRlkuaD4KKworTU9EVUxFX0FVVEhPUigiUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIHFkaXNjIGNsYXNzaWZpY2F0aW9uIHRhcmdldCBtb2R1bGUiKTsKKworc3RhdGljIHVuc2lnbmVkIGludAordGFyZ2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKKyAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKKyAgICAgICBjb25zdCB2b2lkICp0YXJnaW5mbywKKyAgICAgICB2b2lkICp1c2VyaW5mbykKK3sKKwljb25zdCBzdHJ1Y3QgaXB0X2NsYXNzaWZ5X3RhcmdldF9pbmZvICpjbGluZm8gPSB0YXJnaW5mbzsKKworCWlmKCgqcHNrYiktPnByaW9yaXR5ICE9IGNsaW5mby0+cHJpb3JpdHkpIHsKKwkJKCpwc2tiKS0+cHJpb3JpdHkgPSBjbGluZm8tPnByaW9yaXR5OworCQkoKnBza2IpLT5uZmNhY2hlIHw9IE5GQ19BTFRFUkVEOworCX0KKworCXJldHVybiBJUFRfQ09OVElOVUU7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorICAgICAgICAgICB2b2lkICp0YXJnaW5mbywKKyAgICAgICAgICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKKyAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlpZiAodGFyZ2luZm9zaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9jbGFzc2lmeV90YXJnZXRfaW5mbykpKXsKKwkJcHJpbnRrKEtFUk5fRVJSICJDTEFTU0lGWTogaW52YWxpZCBzaXplICgldSAhPSAlWnUpLlxuIiwKKwkJICAgICAgIHRhcmdpbmZvc2l6ZSwKKwkJICAgICAgIElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9jbGFzc2lmeV90YXJnZXRfaW5mbykpKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCWlmIChob29rX21hc2sgJiB+KCgxIDw8IE5GX0lQX0xPQ0FMX09VVCkgfCAoMSA8PCBORl9JUF9GT1JXQVJEKSB8CisJICAgICAgICAgICAgICAgICAgKDEgPDwgTkZfSVBfUE9TVF9ST1VUSU5HKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDTEFTU0lGWTogb25seSB2YWxpZCBpbiBMT0NBTF9PVVQsIEZPUldBUkQgIgorCQkgICAgICAgICAgICAgICAgImFuZCBQT1NUX1JPVVRJTkcuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0cmNtcCh0YWJsZW5hbWUsICJtYW5nbGUiKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ0xBU1NJRlk6IGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tICIKKwkJICAgICAgICAgICAgICAgICJcIm1hbmdsZVwiIHRhYmxlLCBub3QgXCIlc1wiLlxuIiwKKwkJICAgICAgICAgICAgICAgIHRhYmxlbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgaXB0X2NsYXNzaWZ5X3JlZyA9IHsgCisJLm5hbWUgCQk9ICJDTEFTU0lGWSIsIAorCS50YXJnZXQgCT0gdGFyZ2V0LAorCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKKwkubWUgCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCXJldHVybiBpcHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfY2xhc3NpZnlfcmVnKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlpcHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9jbGFzc2lmeV9yZWcpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYxMmUzYQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMKQEAgLTAsMCArMSw3NjEgQEAKKy8qIENsdXN0ZXIgSVAgaGFzaG1hcmsgdGFyZ2V0IAorICogKEMpIDIwMDMtMjAwNCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KKyAqIGJhc2VkIG9uIGlkZWFzIG9mIEZhYmlvIE9saXZlIExlaXRlIDxvbGl2ZUB1bml4Zm9yZ2Uub3JnPgorICoKKyAqIERldmVsb3BtZW50IG9mIHRoaXMgY29kZSBmdW5kZWQgYnkgU3VTRSBMaW51eCBBRywgaHR0cDovL3d3dy5zdXNlLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvaWNtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYXJwLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfQ0xVU1RFUklQLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvbG9ja2hlbHAuaD4KKworI2RlZmluZSBDTFVTVEVSSVBfVkVSU0lPTiAiMC42IgorCisjZGVmaW5lIERFQlVHX0NMVVNURVJJUAorCisjaWZkZWYgREVCVUdfQ0xVU1RFUklQCisjZGVmaW5lIERFQlVHUAlwcmludGsKKyNlbHNlCisjZGVmaW5lIERFQlVHUAorI2VuZGlmCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyB0YXJnZXQgZm9yIENMVVNURVJJUCIpOworCitzdHJ1Y3QgY2x1c3RlcmlwX2NvbmZpZyB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJCS8qIGxpc3Qgb2YgYWxsIGNvbmZpZ3MgKi8KKwlhdG9taWNfdCByZWZjb3VudDsJCQkvKiByZWZlcmVuY2UgY291bnQgKi8KKworCXVfaW50MzJfdCBjbHVzdGVyaXA7CQkJLyogdGhlIElQIGFkZHJlc3MgKi8KKwl1X2ludDhfdCBjbHVzdGVybWFjW0VUSF9BTEVOXTsJCS8qIHRoZSBNQUMgYWRkcmVzcyAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CQkJLyogZGV2aWNlICovCisJdV9pbnQxNl90IG51bV90b3RhbF9ub2RlczsJCS8qIHRvdGFsIG51bWJlciBvZiBub2RlcyAqLworCXVfaW50MTZfdCBudW1fbG9jYWxfbm9kZXM7CQkvKiBudW1iZXIgb2YgbG9jYWwgbm9kZXMgKi8KKwl1X2ludDE2X3QgbG9jYWxfbm9kZXNbQ0xVU1RFUklQX01BWF9OT0RFU107CS8qIG5vZGUgbnVtYmVyIGFycmF5ICovCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlOwkJLyogcHJvYyBkaXIgZW50cnkgKi8KKyNlbmRpZgorCWVudW0gY2x1c3RlcmlwX2hhc2htb2RlIGhhc2hfbW9kZTsJLyogd2hpY2ggaGFzaGluZyBtb2RlICovCisJdV9pbnQzMl90IGhhc2hfaW5pdHZhbDsJCQkvKiBoYXNoIGluaXRpYWxpemF0aW9uICovCit9OworCitzdGF0aWMgTElTVF9IRUFEKGNsdXN0ZXJpcF9jb25maWdzKTsKKworLyogY2x1c3RlcmlwX2xvY2sgcHJvdGVjdHMgdGhlIGNsdXN0ZXJpcF9jb25maWdzIGxpc3QgX0FORF8gdGhlIGNvbmZpZ3VyYWJsZQorICogZGF0YSB3aXRoaW4gYWxsIHN0cnVjdHVyc2VzIChudW1fbG9jYWxfbm9kZXMsIGxvY2FsX25vZGVzW10pICovCitzdGF0aWMgREVDTEFSRV9SV0xPQ0soY2x1c3RlcmlwX2xvY2spOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNsdXN0ZXJpcF9wcm9jX2ZvcHM7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpjbHVzdGVyaXBfcHJvY2RpcjsKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQKK2NsdXN0ZXJpcF9jb25maWdfZ2V0KHN0cnVjdCBjbHVzdGVyaXBfY29uZmlnICpjKSB7CisJYXRvbWljX2luYygmYy0+cmVmY291bnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2NsdXN0ZXJpcF9jb25maWdfcHV0KHN0cnVjdCBjbHVzdGVyaXBfY29uZmlnICpjKSB7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmMtPnJlZmNvdW50KSkgeworCQlXUklURV9MT0NLKCZjbHVzdGVyaXBfbG9jayk7CisJCWxpc3RfZGVsKCZjLT5saXN0KTsKKwkJV1JJVEVfVU5MT0NLKCZjbHVzdGVyaXBfbG9jayk7CisJCWRldl9tY19kZWxldGUoYy0+ZGV2LCBjLT5jbHVzdGVybWFjLCBFVEhfQUxFTiwgMCk7CisJCWRldl9wdXQoYy0+ZGV2KTsKKwkJa2ZyZWUoYyk7CisJfQorfQorCisKK3N0YXRpYyBzdHJ1Y3QgY2x1c3RlcmlwX2NvbmZpZyAqCitfX2NsdXN0ZXJpcF9jb25maWdfZmluZCh1X2ludDMyX3QgY2x1c3RlcmlwKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKworCU1VU1RfQkVfUkVBRF9MT0NLRUQoJmNsdXN0ZXJpcF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJmNsdXN0ZXJpcF9jb25maWdzKSB7CisJCXN0cnVjdCBjbHVzdGVyaXBfY29uZmlnICpjID0gbGlzdF9lbnRyeShwb3MsIAorCQkJCQlzdHJ1Y3QgY2x1c3RlcmlwX2NvbmZpZywgbGlzdCk7CisJCWlmIChjLT5jbHVzdGVyaXAgPT0gY2x1c3RlcmlwKSB7CisJCQlyZXR1cm4gYzsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjbHVzdGVyaXBfY29uZmlnICoKK2NsdXN0ZXJpcF9jb25maWdfZmluZF9nZXQodV9pbnQzMl90IGNsdXN0ZXJpcCkKK3sKKwlzdHJ1Y3QgY2x1c3RlcmlwX2NvbmZpZyAqYzsKKworCVJFQURfTE9DSygmY2x1c3RlcmlwX2xvY2spOworCWMgPSBfX2NsdXN0ZXJpcF9jb25maWdfZmluZChjbHVzdGVyaXApOworCWlmICghYykgeworCQlSRUFEX1VOTE9DSygmY2x1c3RlcmlwX2xvY2spOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYXRvbWljX2luYygmYy0+cmVmY291bnQpOworCVJFQURfVU5MT0NLKCZjbHVzdGVyaXBfbG9jayk7CisKKwlyZXR1cm4gYzsKK30KKworc3RhdGljIHN0cnVjdCBjbHVzdGVyaXBfY29uZmlnICoKK2NsdXN0ZXJpcF9jb25maWdfaW5pdChzdHJ1Y3QgaXB0X2NsdXN0ZXJpcF90Z3RfaW5mbyAqaSwgdV9pbnQzMl90IGlwLAorCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY2x1c3RlcmlwX2NvbmZpZyAqYzsKKwljaGFyIGJ1ZmZlclsxNl07CisKKwljID0ga21hbGxvYyhzaXplb2YoKmMpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWMpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KGMsIDAsIHNpemVvZigqYykpOworCWMtPmRldiA9IGRldjsKKwljLT5jbHVzdGVyaXAgPSBpcDsKKwltZW1jcHkoJmMtPmNsdXN0ZXJtYWMsICZpLT5jbHVzdGVybWFjLCBFVEhfQUxFTik7CisJYy0+bnVtX3RvdGFsX25vZGVzID0gaS0+bnVtX3RvdGFsX25vZGVzOworCWMtPm51bV9sb2NhbF9ub2RlcyA9IGktPm51bV9sb2NhbF9ub2RlczsKKwltZW1jcHkoJmMtPmxvY2FsX25vZGVzLCAmaS0+bG9jYWxfbm9kZXMsIHNpemVvZigmYy0+bG9jYWxfbm9kZXMpKTsKKwljLT5oYXNoX21vZGUgPSBpLT5oYXNoX21vZGU7CisJYy0+aGFzaF9pbml0dmFsID0gaS0+aGFzaF9pbml0dmFsOworCWF0b21pY19zZXQoJmMtPnJlZmNvdW50LCAxKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJLyogY3JlYXRlIHByb2MgZGlyIGVudHJ5ICovCisJc3ByaW50ZihidWZmZXIsICIldS4ldS4ldS4ldSIsIE5JUFFVQUQoaXApKTsKKwljLT5wZGUgPSBjcmVhdGVfcHJvY19lbnRyeShidWZmZXIsIFNfSVdVU1J8U19JUlVTUiwgY2x1c3RlcmlwX3Byb2NkaXIpOworCWlmICghYy0+cGRlKSB7CisJCWtmcmVlKGMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYy0+cGRlLT5wcm9jX2ZvcHMgPSAmY2x1c3RlcmlwX3Byb2NfZm9wczsKKwljLT5wZGUtPmRhdGEgPSBjOworI2VuZGlmCisKKwlXUklURV9MT0NLKCZjbHVzdGVyaXBfbG9jayk7CisJbGlzdF9hZGQoJmMtPmxpc3QsICZjbHVzdGVyaXBfY29uZmlncyk7CisJV1JJVEVfVU5MT0NLKCZjbHVzdGVyaXBfbG9jayk7CisKKwlyZXR1cm4gYzsKK30KKworc3RhdGljIGludAorY2x1c3RlcmlwX2FkZF9ub2RlKHN0cnVjdCBjbHVzdGVyaXBfY29uZmlnICpjLCB1X2ludDE2X3Qgbm9kZW51bSkKK3sKKwlpbnQgaTsKKworCVdSSVRFX0xPQ0soJmNsdXN0ZXJpcF9sb2NrKTsKKworCWlmIChjLT5udW1fbG9jYWxfbm9kZXMgPj0gQ0xVU1RFUklQX01BWF9OT0RFUworCSAgICB8fCBub2RlbnVtID4gQ0xVU1RFUklQX01BWF9OT0RFUykgeworCQlXUklURV9VTkxPQ0soJmNsdXN0ZXJpcF9sb2NrKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogY2hlY2sgaWYgd2UgYWxyYWR5IGhhdmUgdGhpcyBudW1iZXIgaW4gb3VyIGFycmF5ICovCisJZm9yIChpID0gMDsgaSA8IGMtPm51bV9sb2NhbF9ub2RlczsgaSsrKSB7CisJCWlmIChjLT5sb2NhbF9ub2Rlc1tpXSA9PSBub2RlbnVtKSB7CisJCQlXUklURV9VTkxPQ0soJmNsdXN0ZXJpcF9sb2NrKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJYy0+bG9jYWxfbm9kZXNbYy0+bnVtX2xvY2FsX25vZGVzKytdID0gbm9kZW51bTsKKworCVdSSVRFX1VOTE9DSygmY2x1c3RlcmlwX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitjbHVzdGVyaXBfZGVsX25vZGUoc3RydWN0IGNsdXN0ZXJpcF9jb25maWcgKmMsIHVfaW50MTZfdCBub2RlbnVtKQoreworCWludCBpOworCisJV1JJVEVfTE9DSygmY2x1c3RlcmlwX2xvY2spOworCisJaWYgKGMtPm51bV9sb2NhbF9ub2RlcyA8PSAxIHx8IG5vZGVudW0gPiBDTFVTVEVSSVBfTUFYX05PREVTKSB7CisJCVdSSVRFX1VOTE9DSygmY2x1c3RlcmlwX2xvY2spOworCQlyZXR1cm4gMTsKKwl9CisJCQorCWZvciAoaSA9IDA7IGkgPCBjLT5udW1fbG9jYWxfbm9kZXM7IGkrKykgeworCQlpZiAoYy0+bG9jYWxfbm9kZXNbaV0gPT0gbm9kZW51bSkgeworCQkJaW50IHNpemUgPSBzaXplb2YodV9pbnQxNl90KSooYy0+bnVtX2xvY2FsX25vZGVzLShpKzEpKTsKKwkJCW1lbW1vdmUoJmMtPmxvY2FsX25vZGVzW2ldLCAmYy0+bG9jYWxfbm9kZXNbaSsxXSwgc2l6ZSk7CisJCQljLT5udW1fbG9jYWxfbm9kZXMtLTsKKwkJCVdSSVRFX1VOTE9DSygmY2x1c3RlcmlwX2xvY2spOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlXUklURV9VTkxPQ0soJmNsdXN0ZXJpcF9sb2NrKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB1X2ludDMyX3QKK2NsdXN0ZXJpcF9oYXNoZm4oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNsdXN0ZXJpcF9jb25maWcgKmNvbmZpZykKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCXVuc2lnbmVkIGxvbmcgaGFzaHZhbDsKKwl1X2ludDE2X3Qgc3BvcnQsIGRwb3J0OworCXN0cnVjdCB0Y3BoZHIgKnRoOworCXN0cnVjdCB1ZHBoZHIgKnVoOworCXN0cnVjdCBpY21waGRyICppaDsKKworCXN3aXRjaCAoaXBoLT5wcm90b2NvbCkgeworCWNhc2UgSVBQUk9UT19UQ1A6CisJCXRoID0gKHZvaWQgKilpcGgraXBoLT5paGwqNDsKKwkJc3BvcnQgPSBudG9ocyh0aC0+c291cmNlKTsKKwkJZHBvcnQgPSBudG9ocyh0aC0+ZGVzdCk7CisJCWJyZWFrOworCWNhc2UgSVBQUk9UT19VRFA6CisJCXVoID0gKHZvaWQgKilpcGgraXBoLT5paGwqNDsKKwkJc3BvcnQgPSBudG9ocyh1aC0+c291cmNlKTsKKwkJZHBvcnQgPSBudG9ocyh1aC0+ZGVzdCk7CisJCWJyZWFrOworCWNhc2UgSVBQUk9UT19JQ01QOgorCQlpaCA9ICh2b2lkICopaXBoK2lwaC0+aWhsKjQ7CisJCXNwb3J0ID0gbnRvaHMoaWgtPnVuLmVjaG8uaWQpOworCQlkcG9ydCA9IChpaC0+dHlwZTw8OCl8aWgtPmNvZGU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiQ0xVU1RFUklQOiB1bmtub3duIHByb3RvY29sIGAldSdcbiIsCisJCQkJaXBoLT5wcm90b2NvbCk7CisJCX0KKwkJc3BvcnQgPSBkcG9ydCA9IDA7CisJfQorCisJc3dpdGNoIChjb25maWctPmhhc2hfbW9kZSkgeworCWNhc2UgQ0xVU1RFUklQX0hBU0hNT0RFX1NJUDoKKwkJaGFzaHZhbCA9IGpoYXNoXzF3b3JkKG50b2hsKGlwaC0+c2FkZHIpLAorCQkJCSAgICAgIGNvbmZpZy0+aGFzaF9pbml0dmFsKTsKKwkJYnJlYWs7CisJY2FzZSBDTFVTVEVSSVBfSEFTSE1PREVfU0lQX1NQVDoKKwkJaGFzaHZhbCA9IGpoYXNoXzJ3b3JkcyhudG9obChpcGgtPnNhZGRyKSwgc3BvcnQsIAorCQkJCSAgICAgICBjb25maWctPmhhc2hfaW5pdHZhbCk7CisJCWJyZWFrOworCWNhc2UgQ0xVU1RFUklQX0hBU0hNT0RFX1NJUF9TUFRfRFBUOgorCQloYXNodmFsID0gamhhc2hfM3dvcmRzKG50b2hsKGlwaC0+c2FkZHIpLCBzcG9ydCwgZHBvcnQsCisJCQkJICAgICAgIGNvbmZpZy0+aGFzaF9pbml0dmFsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogdG8gbWFrZSBnY2MgaGFwcHkgKi8KKwkJaGFzaHZhbCA9IDA7CisJCS8qIFRoaXMgY2Fubm90IGhhcHBlbiwgdW5sZXNzIHRoZSBjaGVjayBmdW5jdGlvbiB3YXNuJ3QgY2FsbGVkCisJCSAqIGF0IHJ1bGUgbG9hZCB0aW1lICovCisJCXByaW50aygiQ0xVU1RFUklQOiB1bmtub3duIG1vZGUgYCV1J1xuIiwgY29uZmlnLT5oYXNoX21vZGUpOworCQlCVUcoKTsKKwkJYnJlYWs7CisJfQorCisJLyogbm9kZSBudW1iZXJzIGFyZSAxLi5uLCBub3QgMC4ubiAqLworCXJldHVybiAoKGhhc2h2YWwgJSBjb25maWctPm51bV90b3RhbF9ub2RlcykrMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitjbHVzdGVyaXBfcmVzcG9uc2libGUoc3RydWN0IGNsdXN0ZXJpcF9jb25maWcgKmNvbmZpZywgdV9pbnQzMl90IGhhc2gpCit7CisJaW50IGk7CisKKwlSRUFEX0xPQ0soJmNsdXN0ZXJpcF9sb2NrKTsKKworCWlmIChjb25maWctPm51bV9sb2NhbF9ub2RlcyA9PSAwKSB7CisJCVJFQURfVU5MT0NLKCZjbHVzdGVyaXBfbG9jayk7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPm51bV9sb2NhbF9ub2RlczsgaSsrKSB7CisJCWlmIChjb25maWctPmxvY2FsX25vZGVzW2ldID09IGhhc2gpIHsKKwkJCVJFQURfVU5MT0NLKCZjbHVzdGVyaXBfbG9jayk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCVJFQURfVU5MT0NLKCZjbHVzdGVyaXBfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogSVBUQUJMRVMgVEFSR0VUIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdW5zaWduZWQgaW50Cit0YXJnZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgIHVuc2lnbmVkIGludCBob29rbnVtLAorICAgICAgIGNvbnN0IHZvaWQgKnRhcmdpbmZvLAorICAgICAgIHZvaWQgKnVzZXJpbmZvKQoreworCWNvbnN0IHN0cnVjdCBpcHRfY2x1c3RlcmlwX3RndF9pbmZvICpjaXBpbmZvID0gdGFyZ2luZm87CisJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CisJc3RydWN0IGlwX2Nvbm50cmFjayAqY3QgPSBpcF9jb25udHJhY2tfZ2V0KCgqcHNrYiksICZjdGluZm8pOworCXVfaW50MzJfdCBoYXNoOworCisJLyogZG9uJ3QgbmVlZCB0byBjbHVzdGVyaXBfY29uZmlnX2dldCgpIGhlcmUsIHNpbmNlIHJlZmNvdW50CisJICogaXMgb25seSBkZWNyZW1lbnRlZCBieSBkZXN0cm95KCkgLSBhbmQgaXBfdGFibGVzIGd1YXJhbnRlZXMKKwkgKiB0aGF0IHRoZSAtPnRhcmdldCgpIGZ1bmN0aW9uIGlzbid0IGNhbGxlZCBhZnRlciAtPmRlc3Ryb3koKSAqLworCisJaWYgKCFjdCkgeworCQlwcmludGsoS0VSTl9FUlIgIkNMVVNURVJJUDogbm8gY29ubnRyYWNrIVxuIik7CisJCQkvKiBGSVhNRTogbmVlZCB0byBkcm9wIGludmFsaWQgb25lcywgc2luY2UgcmVwbGllcworCQkJICogdG8gb3V0Z29pbmcgY29ubmVjdGlvbnMgb2Ygb3RoZXIgbm9kZXMgd2lsbCBiZSAKKwkJCSAqIG1hcmtlZCBhcyBJTlZBTElEICovCisJCXJldHVybiBORl9EUk9QOworCX0KKworCS8qIHNwZWNpYWwgY2FzZTogSUNNUCBlcnJvciBoYW5kbGluZy4gY29ubnRyYWNrIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbgorCSAqIGVycm9yIG1lc3NhZ2VzIChSRUxBVEVEKSBhbmQgaW5mb3JtYXRpb24gcmVxdWVzdHMgKHNlZSBiZWxvdykgKi8KKwlpZiAoKCpwc2tiKS0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX0lDTVAKKwkgICAgJiYgKGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEIAorCQl8fCBjdGluZm8gPT0gSVBfQ1RfSVNfUkVQTFkrSVBfQ1RfSVNfUkVQTFkpKQorCQlyZXR1cm4gSVBUX0NPTlRJTlVFOworCisJLyogaXBfY29ubnRyYWNrX2ljbXAgZ3VhcmFudGVlcyB1cyB0aGF0IHdlIG9ubHkgaGF2ZSBJQ01QX0VDSE8sIAorCSAqIFRJTUVTVEFNUCwgSU5GT19SRVFVRVNUIG9yIEFERFJFU1MgdHlwZSBpY21wIHBhY2tldHMgZnJvbSBoZXJlCisJICogb24sIHdoaWNoIGFsbCBoYXZlIGFuIElEIGZpZWxkIFtyZWxldmFudCBmb3IgaGFzaGluZ10uICovCisKKwloYXNoID0gY2x1c3RlcmlwX2hhc2hmbigqcHNrYiwgY2lwaW5mby0+Y29uZmlnKTsKKworCXN3aXRjaCAoY3RpbmZvKSB7CisJCWNhc2UgSVBfQ1RfTkVXOgorCQkJY3QtPm1hcmsgPSBoYXNoOworCQkJYnJlYWs7CisJCWNhc2UgSVBfQ1RfUkVMQVRFRDoKKwkJY2FzZSBJUF9DVF9SRUxBVEVEK0lQX0NUX0lTX1JFUExZOgorCQkJLyogRklYTUU6IHdlIGRvbid0IGhhbmRsZSBleHBlY3RhdGlvbnMgYXQgdGhlCisJCQkgKiBtb21lbnQuICB0aGV5IGNhbiBhcnJpdmUgb24gYSBkaWZmZXJlbnQgbm9kZSB0aGFuCisJCQkgKiB0aGUgbWFzdGVyIGNvbm5lY3Rpb24gKGUuZy4gRlRQIHBhc3NpdmUgbW9kZSkgKi8KKwkJY2FzZSBJUF9DVF9FU1RBQkxJU0hFRDoKKwkJY2FzZSBJUF9DVF9FU1RBQkxJU0hFRCtJUF9DVF9JU19SRVBMWToKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisjaWZkZWYgREVCVUdfQ0xVU1RFUlAKKwlEVU1QX1RVUExFKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUpOworI2VuZGlmCisJREVCVUdQKCJoYXNoPSV1IGN0X2hhc2g9JWx1ICIsIGhhc2gsIGN0LT5tYXJrKTsKKwlpZiAoIWNsdXN0ZXJpcF9yZXNwb25zaWJsZShjaXBpbmZvLT5jb25maWcsIGhhc2gpKSB7CisJCURFQlVHUCgibm90IHJlc3BvbnNpYmxlXG4iKTsKKwkJcmV0dXJuIE5GX0RST1A7CisJfQorCURFQlVHUCgicmVzcG9uc2libGVcbiIpOworCisJLyogZGVzcGl0ZSBiZWluZyByZWNlaXZlZCB2aWEgbGlua2xheWVyIG11bHRpY2FzdCwgdGhpcyBpcworCSAqIGFjdHVhbGx5IGEgdW5pY2FzdCBJUCBwYWNrZXQuIFRDUCBkb2Vzbid0IGxpa2UgUEFDS0VUX01VTFRJQ0FTVCAqLworCSgqcHNrYiktPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CisKKwlyZXR1cm4gSVBUX0NPTlRJTlVFOworfQorCitzdGF0aWMgaW50CitjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorICAgICAgICAgICB2b2lkICp0YXJnaW5mbywKKyAgICAgICAgICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKKyAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlzdHJ1Y3QgaXB0X2NsdXN0ZXJpcF90Z3RfaW5mbyAqY2lwaW5mbyA9IHRhcmdpbmZvOworCisJc3RydWN0IGNsdXN0ZXJpcF9jb25maWcgKmNvbmZpZzsKKworCWlmICh0YXJnaW5mb3NpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X2NsdXN0ZXJpcF90Z3RfaW5mbykpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNMVVNURVJJUDogdGFyZ2luZm9zaXplICV1ICE9ICVadVxuIiwKKwkJICAgICAgIHRhcmdpbmZvc2l6ZSwKKwkJICAgICAgIElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9jbHVzdGVyaXBfdGd0X2luZm8pKSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChjaXBpbmZvLT5oYXNoX21vZGUgIT0gQ0xVU1RFUklQX0hBU0hNT0RFX1NJUCAmJgorCSAgICBjaXBpbmZvLT5oYXNoX21vZGUgIT0gQ0xVU1RFUklQX0hBU0hNT0RFX1NJUF9TUFQgJiYKKwkgICAgY2lwaW5mby0+aGFzaF9tb2RlICE9IENMVVNURVJJUF9IQVNITU9ERV9TSVBfU1BUX0RQVCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJDTFVTVEVSSVA6IHVua25vd24gbW9kZSBgJXUnXG4iLAorCQkJY2lwaW5mby0+aGFzaF9tb2RlKTsKKwkJcmV0dXJuIDA7CisKKwl9CisJaWYgKGUtPmlwLmRtc2suc19hZGRyICE9IDB4ZmZmZmZmZmYKKwkgICAgfHwgZS0+aXAuZHN0LnNfYWRkciA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ0xVU1RFUklQOiBQbGVhc2Ugc3BlY2lmeSBkZXN0aW5hdGlvbiBJUFxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIEZJWE1FOiBmdXJ0aGVyIHNhbml0eSBjaGVja3MgKi8KKworCWNvbmZpZyA9IGNsdXN0ZXJpcF9jb25maWdfZmluZF9nZXQoZS0+aXAuZHN0LnNfYWRkcik7CisJaWYgKCFjb25maWcpIHsKKwkJaWYgKCEoY2lwaW5mby0+ZmxhZ3MgJiBDTFVTVEVSSVBfRkxBR19ORVcpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDTFVTVEVSSVA6IG5vIGNvbmZpZyBmb3VuZCBmb3IgJXUuJXUuJXUuJXUsIG5lZWQgJ25ldydcbiIsIE5JUFFVQUQoZS0+aXAuZHN0LnNfYWRkcikpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJCQlpZiAoZS0+aXAuaW5pZmFjZVswXSA9PSAnXDAnKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ0xVU1RFUklQOiBQbGVhc2Ugc3BlY2lmeSBhbiBpbnRlcmZhY2UgbmFtZVxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCWRldiA9IGRldl9nZXRfYnlfbmFtZShlLT5pcC5pbmlmYWNlKTsKKwkJCWlmICghZGV2KSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ0xVU1RFUklQOiBubyBzdWNoIGludGVyZmFjZSAlc1xuIiwgZS0+aXAuaW5pZmFjZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCWNvbmZpZyA9IGNsdXN0ZXJpcF9jb25maWdfaW5pdChjaXBpbmZvLCAKKwkJCQkJCQllLT5pcC5kc3Quc19hZGRyLCBkZXYpOworCQkJaWYgKCFjb25maWcpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDTFVTVEVSSVA6IGNhbm5vdCBhbGxvY2F0ZSBjb25maWdcbiIpOworCQkJCWRldl9wdXQoZGV2KTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWRldl9tY19hZGQoY29uZmlnLT5kZXYsY29uZmlnLT5jbHVzdGVybWFjLCBFVEhfQUxFTiwgMCk7CisJCX0KKwl9CisKKwljaXBpbmZvLT5jb25maWcgPSBjb25maWc7CisKKwlyZXR1cm4gMTsKK30KKworLyogZHJvcCByZWZlcmVuY2UgY291bnQgb2YgY2x1c3RlciBjb25maWcgd2hlbiBydWxlIGlzIGRlbGV0ZWQgKi8KK3N0YXRpYyB2b2lkIGRlc3Ryb3kodm9pZCAqbWF0Y2hpbmZvLCB1bnNpZ25lZCBpbnQgbWF0Y2hpbmZvc2l6ZSkKK3sKKwlzdHJ1Y3QgaXB0X2NsdXN0ZXJpcF90Z3RfaW5mbyAqY2lwaW5mbyA9IG1hdGNoaW5mbzsKKworCS8qIHdlIGZpcnN0IHJlbW92ZSB0aGUgcHJvYyBlbnRyeSBhbmQgdGhlbiBkcm9wIHRoZSByZWZlcmVuY2UKKwkgKiBjb3VudC4gIEluIGNhc2UgYW55b25lIHN0aWxsIGFjY2Vzc2VzIHRoZSBmaWxlLCB0aGUgb3Blbi9jbG9zZQorCSAqIGZ1bmN0aW9ucyBhcmUgYWxzbyBpbmNyZW1lbnRpbmcgdGhlIHJlZmNvdW50IG9uIHRoZWlyIG93biAqLworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJcmVtb3ZlX3Byb2NfZW50cnkoY2lwaW5mby0+Y29uZmlnLT5wZGUtPm5hbWUsCisJCQkgIGNpcGluZm8tPmNvbmZpZy0+cGRlLT5wYXJlbnQpOworI2VuZGlmCisJY2x1c3RlcmlwX2NvbmZpZ19wdXQoY2lwaW5mby0+Y29uZmlnKTsKK30KKworc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGNsdXN0ZXJpcF90Z3QgPSB7IAorCS5uYW1lID0gIkNMVVNURVJJUCIsCisJLnRhcmdldCA9ICZ0YXJnZXQsIAorCS5jaGVja2VudHJ5ID0gJmNoZWNrZW50cnksIAorCS5kZXN0cm95ID0gJmRlc3Ryb3ksCisJLm1lID0gVEhJU19NT0RVTEUKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogQVJQIE1BTkdMSU5HIENPREUgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGhhcmRjb2RlZCBmb3IgNDhiaXQgZXRoZXJuZXQgYW5kIDMyYml0IGlwdjQgYWRkcmVzc2VzICovCitzdHJ1Y3QgYXJwX3BheWxvYWQgeworCXVfaW50OF90IHNyY19od1tFVEhfQUxFTl07CisJdV9pbnQzMl90IHNyY19pcDsKKwl1X2ludDhfdCBkc3RfaHdbRVRIX0FMRU5dOworCXVfaW50MzJfdCBkc3RfaXA7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2lmZGVmIENMVVNURVJJUF9ERUJVRworc3RhdGljIHZvaWQgYXJwX3ByaW50KHN0cnVjdCBhcnBfcGF5bG9hZCAqcGF5bG9hZCkgCit7CisjZGVmaW5lIEhCVUZGRVJMRU4gMzAKKwljaGFyIGhidWZmZXJbSEJVRkZFUkxFTl07CisJaW50IGosazsKKwljb25zdCBjaGFyIGhleGJ1ZltdPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisKKwlmb3IgKGs9MCwgaj0wOyBrIDwgSEJVRkZFUkxFTi0zICYmIGogPCBFVEhfQUxFTjsgaisrKSB7CisJCWhidWZmZXJbaysrXT1oZXhidWZbKHBheWxvYWQtPnNyY19od1tqXT4+NCkmMTVdOworCQloYnVmZmVyW2srK109aGV4YnVmW3BheWxvYWQtPnNyY19od1tqXSYxNV07CisJCWhidWZmZXJbaysrXT0nOic7CisJfQorCWhidWZmZXJbLS1rXT0nXDAnOworCisJcHJpbnRrKCJzcmMgJXUuJXUuJXUuJXVAJXMsIGRzdCAldS4ldS4ldS4ldVxuIiwgCisJCU5JUFFVQUQocGF5bG9hZC0+c3JjX2lwKSwgaGJ1ZmZlciwKKwkJTklQUVVBRChwYXlsb2FkLT5kc3RfaXApKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgaW50CithcnBfbWFuZ2xlKHVuc2lnbmVkIGludCBob29rLAorCSAgIHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlzdHJ1Y3QgYXJwaGRyICphcnAgPSAoKnBza2IpLT5uaC5hcnBoOworCXN0cnVjdCBhcnBfcGF5bG9hZCAqcGF5bG9hZDsKKwlzdHJ1Y3QgY2x1c3RlcmlwX2NvbmZpZyAqYzsKKworCS8qIHdlIGRvbid0IGNhcmUgYWJvdXQgbm9uLWV0aGVybmV0IGFuZCBub24taXB2NCBBUlAgKi8KKwlpZiAoYXJwLT5hcl9ocmQgIT0gaHRvbnMoQVJQSFJEX0VUSEVSKQorCSAgICB8fCBhcnAtPmFyX3BybyAhPSBodG9ucyhFVEhfUF9JUCkKKwkgICAgfHwgYXJwLT5hcl9wbG4gIT0gNCB8fCBhcnAtPmFyX2hsbiAhPSBFVEhfQUxFTikKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKworCS8qIHdlIG9ubHkgd2FudCB0byBtYW5nbGUgYXJwIHJlcGxpZXMgKi8KKwlpZiAoYXJwLT5hcl9vcCAhPSBodG9ucyhBUlBPUF9SRVBMWSkpCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwlwYXlsb2FkID0gKHZvaWQgKikoYXJwKzEpOworCisJLyogaWYgdGhlcmUgaXMgbm8gY2x1c3RlcmlwIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBhcnAgcmVwbHkncyAKKwkgKiBzb3VyY2UgaXAsIHdlIGRvbid0IHdhbnQgdG8gbWFuZ2xlIGl0ICovCisJYyA9IGNsdXN0ZXJpcF9jb25maWdfZmluZF9nZXQocGF5bG9hZC0+c3JjX2lwKTsKKwlpZiAoIWMpCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwkvKiBub3JtYWxseSB0aGUgbGludXgga2VybmVsIGFsd2F5cyByZXBsaWVzIHRvIGFycCBxdWVyaWVzIG9mIAorCSAqIGFkZHJlc3NlcyBvbiBkaWZmZXJlbnQgaW50ZXJmYWNzLiAgSG93ZXZlciwgaW4gdGhlIENMVVNURVJJUCBjYXNlCisJICogdGhpcyB3b3VsZG4ndCB3b3JrLCBzaW5jZSB3ZSBkaWRuJ3Qgc3Vic2NyaWJlIHRoZSBtY2FzdCBncm91cCBvbgorCSAqIG90aGVyIGludGVyZmFjZXMgKi8KKwlpZiAoYy0+ZGV2ICE9IG91dCkgeworCQlERUJVR1AoIkNMVVNURVJJUDogbm90IG1hbmdsaW5nIGFycCByZXBseSBvbiBkaWZmZXJlbnQgIgorCQkgICAgICAgImludGVyZmFjZTogY2lwJyVzJy1za2InJXMnXG4iLCBjLT5kZXYtPm5hbWUsIG91dC0+bmFtZSk7CisJCWNsdXN0ZXJpcF9jb25maWdfcHV0KGMpOworCQlyZXR1cm4gTkZfQUNDRVBUOworCX0KKworCS8qIG1hbmdsZSByZXBseSBoYXJkd2FyZSBhZGRyZXNzICovCisJbWVtY3B5KHBheWxvYWQtPnNyY19odywgYy0+Y2x1c3Rlcm1hYywgYXJwLT5hcl9obG4pOworCisjaWZkZWYgQ0xVU1RFUklQX0RFQlVHCisJREVCVUdQKEtFUk5fREVCVUcgIkNMVVNURVJJUCBtYW5nbGVkIGFycCByZXBseTogIik7CisJYXJwX3ByaW50KHBheWxvYWQpOworI2VuZGlmCisKKwljbHVzdGVyaXBfY29uZmlnX3B1dChjKTsKKworCXJldHVybiBORl9BQ0NFUFQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZfaG9va19vcHMgY2lwX2FycF9vcHMgPSB7CisJLmhvb2sgPSBhcnBfbWFuZ2xlLAorCS5wZiA9IE5GX0FSUCwKKwkuaG9va251bSA9IE5GX0FSUF9PVVQsCisJLnByaW9yaXR5ID0gLTEKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIFBST0MgRElSIEhBTkRMSU5HIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworc3RhdGljIHZvaWQgKmNsdXN0ZXJpcF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IHMtPnByaXZhdGU7CisJc3RydWN0IGNsdXN0ZXJpcF9jb25maWcgKmMgPSBwZGUtPmRhdGE7CisJdW5zaWduZWQgaW50ICpub2RlaWR4OworCisJUkVBRF9MT0NLKCZjbHVzdGVyaXBfbG9jayk7CisJaWYgKCpwb3MgPj0gYy0+bnVtX2xvY2FsX25vZGVzKQorCQlyZXR1cm4gTlVMTDsKKworCW5vZGVpZHggPSBrbWFsbG9jKHNpemVvZih1bnNpZ25lZCBpbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5vZGVpZHgpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJKm5vZGVpZHggPSAqcG9zOworCXJldHVybiBub2RlaWR4OworfQorCitzdGF0aWMgdm9pZCAqY2x1c3RlcmlwX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBzLT5wcml2YXRlOworCXN0cnVjdCBjbHVzdGVyaXBfY29uZmlnICpjID0gcGRlLT5kYXRhOworCXVuc2lnbmVkIGludCAqbm9kZWlkeCA9ICh1bnNpZ25lZCBpbnQgKil2OworCisJKnBvcyA9ICsrKCpub2RlaWR4KTsKKwlpZiAoKnBvcyA+PSBjLT5udW1fbG9jYWxfbm9kZXMpIHsKKwkJa2ZyZWUodik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gbm9kZWlkeDsKK30KKworc3RhdGljIHZvaWQgY2x1c3RlcmlwX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKK3sKKwlrZnJlZSh2KTsKKworCVJFQURfVU5MT0NLKCZjbHVzdGVyaXBfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgY2x1c3RlcmlwX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IHMtPnByaXZhdGU7CisJc3RydWN0IGNsdXN0ZXJpcF9jb25maWcgKmMgPSBwZGUtPmRhdGE7CisJdW5zaWduZWQgaW50ICpub2RlaWR4ID0gKHVuc2lnbmVkIGludCAqKXY7CisKKwlpZiAoKm5vZGVpZHggIT0gMCkgCisJCXNlcV9wdXRjKHMsICcsJyk7CisJc2VxX3ByaW50ZihzLCAiJXUiLCBjLT5sb2NhbF9ub2Rlc1sqbm9kZWlkeF0pOworCisJaWYgKCpub2RlaWR4ID09IGMtPm51bV9sb2NhbF9ub2Rlcy0xKQorCQlzZXFfcHV0YyhzLCAnXG4nKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGNsdXN0ZXJpcF9zZXFfb3BzID0geworCS5zdGFydAk9IGNsdXN0ZXJpcF9zZXFfc3RhcnQsCisJLm5leHQJPSBjbHVzdGVyaXBfc2VxX25leHQsCisJLnN0b3AJPSBjbHVzdGVyaXBfc2VxX3N0b3AsCisJLnNob3cJPSBjbHVzdGVyaXBfc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IGNsdXN0ZXJpcF9wcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJldCA9IHNlcV9vcGVuKGZpbGUsICZjbHVzdGVyaXBfc2VxX29wcyk7CisKKwlpZiAoIXJldCkgeworCQlzdHJ1Y3Qgc2VxX2ZpbGUgKnNmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShpbm9kZSk7CisJCXN0cnVjdCBjbHVzdGVyaXBfY29uZmlnICpjID0gcGRlLT5kYXRhOworCisJCXNmLT5wcml2YXRlID0gcGRlOworCisJCWNsdXN0ZXJpcF9jb25maWdfZ2V0KGMpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY2x1c3RlcmlwX3Byb2NfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShpbm9kZSk7CisJc3RydWN0IGNsdXN0ZXJpcF9jb25maWcgKmMgPSBwZGUtPmRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHNlcV9yZWxlYXNlKGlub2RlLCBmaWxlKTsKKworCWlmICghcmV0KQorCQljbHVzdGVyaXBfY29uZmlnX3B1dChjKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNsdXN0ZXJpcF9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqaW5wdXQsCisJCQkJc2l6ZV90IHNpemUsIGxvZmZfdCAqb2ZzKQoreworI2RlZmluZSBQUk9DX1dSSVRFTEVOCTEwCisJY2hhciBidWZmZXJbUFJPQ19XUklURUxFTisxXTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IGNsdXN0ZXJpcF9jb25maWcgKmMgPSBwZGUtPmRhdGE7CisJdW5zaWduZWQgbG9uZyBub2RlbnVtOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZmZlciwgaW5wdXQsIFBST0NfV1JJVEVMRU4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICgqYnVmZmVyID09ICcrJykgeworCQlub2RlbnVtID0gc2ltcGxlX3N0cnRvdWwoYnVmZmVyKzEsIE5VTEwsIDEwKTsKKwkJaWYgKGNsdXN0ZXJpcF9hZGRfbm9kZShjLCBub2RlbnVtKSkKKwkJCXJldHVybiAtRU5PTUVNOworCX0gZWxzZSBpZiAoKmJ1ZmZlciA9PSAnLScpIHsKKwkJbm9kZW51bSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZmZlcisxLCBOVUxMLDEwKTsKKwkJaWYgKGNsdXN0ZXJpcF9kZWxfbm9kZShjLCBub2RlbnVtKSkKKwkJCXJldHVybiAtRU5PRU5UOworCX0gZWxzZQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjbHVzdGVyaXBfcHJvY19mb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkub3BlbgkgPSBjbHVzdGVyaXBfcHJvY19vcGVuLAorCS5yZWFkCSA9IHNlcV9yZWFkLAorCS53cml0ZQkgPSBjbHVzdGVyaXBfcHJvY193cml0ZSwKKwkubGxzZWVrCSA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IGNsdXN0ZXJpcF9wcm9jX3JlbGVhc2UsCit9OworCisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworc3RhdGljIGludCBpbml0X29yX2NsZWFudXAoaW50IGZpbmkpCit7CisJaW50IHJldDsKKworCWlmIChmaW5pKQorCQlnb3RvIGNsZWFudXA7CisKKwlpZiAoaXB0X3JlZ2lzdGVyX3RhcmdldCgmY2x1c3RlcmlwX3RndCkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBjbGVhbnVwX25vbmU7CisJfQorCisJaWYgKG5mX3JlZ2lzdGVyX2hvb2soJmNpcF9hcnBfb3BzKSA8IDApIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBjbGVhbnVwX3RhcmdldDsKKwl9CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCWNsdXN0ZXJpcF9wcm9jZGlyID0gcHJvY19ta2RpcigiaXB0X0NMVVNURVJJUCIsIHByb2NfbmV0KTsKKwlpZiAoIWNsdXN0ZXJpcF9wcm9jZGlyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ0xVU1RFUklQOiBVbmFibGUgdG8gcHJvYyBkaXIgZW50cnlcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGNsZWFudXBfaG9vazsKKwl9CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworCXByaW50ayhLRVJOX05PVElDRSAiQ2x1c3RlcklQIFZlcnNpb24gJXMgbG9hZGVkIHN1Y2Nlc3NmdWxseVxuIiwKKwkJQ0xVU1RFUklQX1ZFUlNJT04pOworCisJcmV0dXJuIDA7CisKK2NsZWFudXA6CisJcHJpbnRrKEtFUk5fTk9USUNFICJDbHVzdGVySVAgVmVyc2lvbiAlcyB1bmxvYWRpbmdcbiIsCisJCUNMVVNURVJJUF9WRVJTSU9OKTsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXJlbW92ZV9wcm9jX2VudHJ5KGNsdXN0ZXJpcF9wcm9jZGlyLT5uYW1lLCBjbHVzdGVyaXBfcHJvY2Rpci0+cGFyZW50KTsKKyNlbmRpZgorY2xlYW51cF9ob29rOgorCW5mX3VucmVnaXN0ZXJfaG9vaygmY2lwX2FycF9vcHMpOworY2xlYW51cF90YXJnZXQ6CisJaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZjbHVzdGVyaXBfdGd0KTsKK2NsZWFudXBfbm9uZToKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCXJldHVybiBpbml0X29yX2NsZWFudXAoMCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaW5pdF9vcl9jbGVhbnVwKDEpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DT05OTUFSSy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DT05OTUFSSy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZGRkM2UKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NPTk5NQVJLLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qIFRoaXMga2VybmVsIG1vZHVsZSBpcyB1c2VkIHRvIG1vZGlmeSB0aGUgY29ubmVjdGlvbiBtYXJrIHZhbHVlcywgb3IKKyAqIHRvIG9wdGlvbmFsbHkgcmVzdG9yZSB0aGUgc2tiIG5mbWFyayBmcm9tIHRoZSBjb25uZWN0aW9uIG1hcmsKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwNCBNQVJBIFN5c3RlbXMgQUIgPGh0dHA6Ly93d3cubWFyYXN5c3RlbXMuY29tPgorICogYnkgSGVucmlrIE5vcmRzdHJvbSA8aG5vQG1hcmFzeXN0ZW1zLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorCitNT0RVTEVfQVVUSE9SKCJIZW5yaWsgTm9yZHN0cm9tIDxobm9AbWFyYXN5dGVtcy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklQIHRhYmxlcyBDT05OTUFSSyBtYXRjaGluZyBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9DT05OTUFSSy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oPgorCitzdGF0aWMgdW5zaWduZWQgaW50Cit0YXJnZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgIHVuc2lnbmVkIGludCBob29rbnVtLAorICAgICAgIGNvbnN0IHZvaWQgKnRhcmdpbmZvLAorICAgICAgIHZvaWQgKnVzZXJpbmZvKQoreworCWNvbnN0IHN0cnVjdCBpcHRfY29ubm1hcmtfdGFyZ2V0X2luZm8gKm1hcmtpbmZvID0gdGFyZ2luZm87CisJdW5zaWduZWQgbG9uZyBkaWZmOworCXVuc2lnbmVkIGxvbmcgbmZtYXJrOworCXVuc2lnbmVkIGxvbmcgbmV3bWFyazsKKworCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOworCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0ID0gaXBfY29ubnRyYWNrX2dldCgoKnBza2IpLCAmY3RpbmZvKTsKKwlpZiAoY3QpIHsKKwkgICAgc3dpdGNoKG1hcmtpbmZvLT5tb2RlKSB7CisJICAgIGNhc2UgSVBUX0NPTk5NQVJLX1NFVDoKKwkJbmV3bWFyayA9IChjdC0+bWFyayAmIH5tYXJraW5mby0+bWFzaykgfCBtYXJraW5mby0+bWFyazsKKwkJaWYgKG5ld21hcmsgIT0gY3QtPm1hcmspCisJCSAgICBjdC0+bWFyayA9IG5ld21hcms7CisJCWJyZWFrOworCSAgICBjYXNlIElQVF9DT05OTUFSS19TQVZFOgorCQluZXdtYXJrID0gKGN0LT5tYXJrICYgfm1hcmtpbmZvLT5tYXNrKSB8ICgoKnBza2IpLT5uZm1hcmsgJiBtYXJraW5mby0+bWFzayk7CisJCWlmIChjdC0+bWFyayAhPSBuZXdtYXJrKQorCQkgICAgY3QtPm1hcmsgPSBuZXdtYXJrOworCQlicmVhazsKKwkgICAgY2FzZSBJUFRfQ09OTk1BUktfUkVTVE9SRToKKwkJbmZtYXJrID0gKCpwc2tiKS0+bmZtYXJrOworCQlkaWZmID0gKGN0LT5tYXJrIF4gbmZtYXJrKSAmIG1hcmtpbmZvLT5tYXNrOworCQlpZiAoZGlmZiAhPSAwKSB7CisJCSAgICAoKnBza2IpLT5uZm1hcmsgPSBuZm1hcmsgXiBkaWZmOworCQkgICAgKCpwc2tiKS0+bmZjYWNoZSB8PSBORkNfQUxURVJFRDsKKwkJfQorCQlicmVhazsKKwkgICAgfQorCX0KKworCXJldHVybiBJUFRfQ09OVElOVUU7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCSAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJICAgdm9pZCAqdGFyZ2luZm8sCisJICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKKwkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCXN0cnVjdCBpcHRfY29ubm1hcmtfdGFyZ2V0X2luZm8gKm1hdGNoaW5mbyA9IHRhcmdpbmZvOworCWlmICh0YXJnaW5mb3NpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X2Nvbm5tYXJrX3RhcmdldF9pbmZvKSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ09OTk1BUks6IHRhcmdpbmZvc2l6ZSAldSAhPSAlWnVcbiIsCisJCSAgICAgICB0YXJnaW5mb3NpemUsCisJCSAgICAgICBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfY29ubm1hcmtfdGFyZ2V0X2luZm8pKSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChtYXRjaGluZm8tPm1vZGUgPT0gSVBUX0NPTk5NQVJLX1JFU1RPUkUpIHsKKwkgICAgaWYgKHN0cmNtcCh0YWJsZW5hbWUsICJtYW5nbGUiKSAhPSAwKSB7CisJCSAgICBwcmludGsoS0VSTl9XQVJOSU5HICJDT05OTUFSSzogcmVzdG9yZSBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSBcIm1hbmdsZVwiIHRhYmxlLCBub3QgXCIlc1wiXG4iLCB0YWJsZW5hbWUpOworCQkgICAgcmV0dXJuIDA7CisJICAgIH0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF9jb25ubWFya19yZWcgPSB7CisJLm5hbWUgPSAiQ09OTk1BUksiLAorCS50YXJnZXQgPSAmdGFyZ2V0LAorCS5jaGVja2VudHJ5ID0gJmNoZWNrZW50cnksCisJLm1lID0gVEhJU19NT0RVTEUKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlyZXR1cm4gaXB0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X2Nvbm5tYXJrX3JlZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfY29ubm1hcmtfcmVnKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfRFNDUC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9EU0NQLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VhNDUwOQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfRFNDUC5jCkBAIC0wLDAgKzEsMTA2IEBACisvKiBpcHRhYmxlcyBtb2R1bGUgZm9yIHNldHRpbmcgdGhlIElQdjQgRFNDUCBmaWVsZCwgVmVyc2lvbiAxLjgKKyAqCisgKiAoQykgMjAwMiBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KKyAqIGJhc2VkIG9uIGlwdF9GVE9TLmMgKEMpIDIwMDAgYnkgTWF0dGhldyBHLiBNYXJzaCA8bWdtQHBha3Ryb25peC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIAorICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIFNlZSBSRkMyNDc0IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBEU0NQIGZpZWxkIHdpdGhpbiB0aGUgSVAgSGVhZGVyLgorICoKKyAqIGlwdF9EU0NQLmMsdiAxLjggMjAwMi8wOC8wNiAxODo0MTo1NyBsYWZvcmdlIEV4cAorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfRFNDUC5oPgorCitNT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgRFNDUCBtb2RpZmljYXRpb24gbW9kdWxlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3RhcmdldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCisgICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCisgICAgICAgdm9pZCAqdXNlcmluZm8pCit7CisJY29uc3Qgc3RydWN0IGlwdF9EU0NQX2luZm8gKmRpbmZvID0gdGFyZ2luZm87CisJdV9pbnQ4X3Qgc2hfZHNjcCA9ICgoZGluZm8tPmRzY3AgPDwgSVBUX0RTQ1BfU0hJRlQpICYgSVBUX0RTQ1BfTUFTSyk7CisKKworCWlmICgoKCpwc2tiKS0+bmguaXBoLT50b3MgJiBJUFRfRFNDUF9NQVNLKSAhPSBzaF9kc2NwKSB7CisJCXVfaW50MTZfdCBkaWZmc1syXTsKKworCQlpZiAoIXNrYl9pcF9tYWtlX3dyaXRhYmxlKHBza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKSkKKwkJCXJldHVybiBORl9EUk9QOworCisJCWRpZmZzWzBdID0gaHRvbnMoKCpwc2tiKS0+bmguaXBoLT50b3MpIF4gMHhGRkZGOworCQkoKnBza2IpLT5uaC5pcGgtPnRvcyA9ICgoKnBza2IpLT5uaC5pcGgtPnRvcyAmIH5JUFRfRFNDUF9NQVNLKQorCQkJfCBzaF9kc2NwOworCQlkaWZmc1sxXSA9IGh0b25zKCgqcHNrYiktPm5oLmlwaC0+dG9zKTsKKwkJKCpwc2tiKS0+bmguaXBoLT5jaGVjaworCQkJPSBjc3VtX2ZvbGQoY3N1bV9wYXJ0aWFsKChjaGFyICopZGlmZnMsCisJCQkJCQkgc2l6ZW9mKGRpZmZzKSwKKwkJCQkJCSAoKnBza2IpLT5uaC5pcGgtPmNoZWNrCisJCQkJCQkgXiAweEZGRkYpKTsKKwkJKCpwc2tiKS0+bmZjYWNoZSB8PSBORkNfQUxURVJFRDsKKwl9CisJcmV0dXJuIElQVF9DT05USU5VRTsKK30KKworc3RhdGljIGludAorY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKyAgICAgICAgICAgdm9pZCAqdGFyZ2luZm8sCisgICAgICAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCisgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3QgdV9pbnQ4X3QgZHNjcCA9ICgoc3RydWN0IGlwdF9EU0NQX2luZm8gKil0YXJnaW5mbyktPmRzY3A7CisKKwlpZiAodGFyZ2luZm9zaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9EU0NQX2luZm8pKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJEU0NQOiB0YXJnaW5mb3NpemUgJXUgIT0gJVp1XG4iLAorCQkgICAgICAgdGFyZ2luZm9zaXplLAorCQkgICAgICAgSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X0RTQ1BfaW5mbykpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0cmNtcCh0YWJsZW5hbWUsICJtYW5nbGUiKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRTQ1A6IGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIFwibWFuZ2xlXCIgdGFibGUsIG5vdCBcIiVzXCJcbiIsIHRhYmxlbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICgoZHNjcCA+IElQVF9EU0NQX01BWCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRFNDUDogZHNjcCAleCBvdXQgb2YgcmFuZ2VcbiIsIGRzY3ApOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF9kc2NwX3JlZyA9IHsKKwkubmFtZQkJPSAiRFNDUCIsCisJLnRhcmdldAkJPSB0YXJnZXQsCisJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlyZXR1cm4gaXB0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X2RzY3BfcmVnKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlpcHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9kc2NwX3JlZyk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0VDTi5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9FQ04uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGE5OTExCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9FQ04uYwpAQCAtMCwwICsxLDE3NSBAQAorLyogaXB0YWJsZXMgbW9kdWxlIGZvciB0aGUgSVB2NCBhbmQgVENQIEVDTiBiaXRzLCBWZXJzaW9uIDEuNQorICoKKyAqIChDKSAyMDAyIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBpcHRfRUNOLmMsdiAxLjUgMjAwMi8wOC8xOCAxOTozNjo1MSBsYWZvcmdlIEV4cAorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfRUNOLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBFQ04gbW9kaWZpY2F0aW9uIG1vZHVsZSIpOworCisvKiBzZXQgRUNUIGNvZGVwb2ludCBmcm9tIElQIGhlYWRlci4KKyAqIAlyZXR1cm4gMCBpZiB0aGVyZSB3YXMgYW4gZXJyb3IuICovCitzdGF0aWMgaW5saW5lIGludAorc2V0X2VjdF9pcChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIGNvbnN0IHN0cnVjdCBpcHRfRUNOX2luZm8gKmVpbmZvKQoreworCWlmICgoKCpwc2tiKS0+bmguaXBoLT50b3MgJiBJUFRfRUNOX0lQX01BU0spCisJICAgICE9IChlaW5mby0+aXBfZWN0ICYgSVBUX0VDTl9JUF9NQVNLKSkgeworCQl1X2ludDE2X3QgZGlmZnNbMl07CisKKwkJaWYgKCFza2JfaXBfbWFrZV93cml0YWJsZShwc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSkpCisJCQlyZXR1cm4gMDsKKworCQlkaWZmc1swXSA9IGh0b25zKCgqcHNrYiktPm5oLmlwaC0+dG9zKSBeIDB4RkZGRjsKKwkJKCpwc2tiKS0+bmguaXBoLT50b3MgJj0gfklQVF9FQ05fSVBfTUFTSzsKKwkJKCpwc2tiKS0+bmguaXBoLT50b3MgfD0gKGVpbmZvLT5pcF9lY3QgJiBJUFRfRUNOX0lQX01BU0spOworCQlkaWZmc1sxXSA9IGh0b25zKCgqcHNrYiktPm5oLmlwaC0+dG9zKTsKKwkJKCpwc2tiKS0+bmguaXBoLT5jaGVjaworCQkJPSBjc3VtX2ZvbGQoY3N1bV9wYXJ0aWFsKChjaGFyICopZGlmZnMsCisJCQkJCQkgc2l6ZW9mKGRpZmZzKSwKKwkJCQkJCSAoKnBza2IpLT5uaC5pcGgtPmNoZWNrCisJCQkJCQkgXjB4RkZGRikpOworCQkoKnBza2IpLT5uZmNhY2hlIHw9IE5GQ19BTFRFUkVEOworCX0gCisJcmV0dXJuIDE7Cit9CisKKy8qIFJldHVybiAwIGlmIHRoZXJlIHdhcyBhbiBlcnJvci4gKi8KK3N0YXRpYyBpbmxpbmUgaW50CitzZXRfZWN0X3RjcChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIGNvbnN0IHN0cnVjdCBpcHRfRUNOX2luZm8gKmVpbmZvLCBpbnQgaW53YXJkKQoreworCXN0cnVjdCB0Y3BoZHIgX3RjcGgsICp0Y3BoOworCXVfaW50MTZfdCBkaWZmc1syXTsKKworCS8qIE5vdCBlbm91Z2h0IGhlYWRlcj8gKi8KKwl0Y3BoID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLCAoKnBza2IpLT5uaC5pcGgtPmlobCo0LAorCQkJCSAgc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKKwlpZiAoIXRjcGgpCisJCXJldHVybiAwOworCisJaWYgKCEoZWluZm8tPm9wZXJhdGlvbiAmIElQVF9FQ05fT1BfU0VUX0VDRQorCSAgICAgIHx8IHRjcGgtPmVjZSA9PSBlaW5mby0+cHJvdG8udGNwLmVjZSkKKwkgICAgJiYgKCEoZWluZm8tPm9wZXJhdGlvbiAmIElQVF9FQ05fT1BfU0VUX0NXUgorCQkgIHx8IHRjcGgtPmN3ciA9PSBlaW5mby0+cHJvdG8udGNwLmN3cikpKQorCQlyZXR1cm4gMTsKKworCWlmICghc2tiX2lwX21ha2Vfd3JpdGFibGUocHNrYiwgKCpwc2tiKS0+bmguaXBoLT5paGwqNCtzaXplb2YoKnRjcGgpKSkKKwkJcmV0dXJuIDA7CisJdGNwaCA9ICh2b2lkICopKCpwc2tiKS0+bmguaXBoICsgKCpwc2tiKS0+bmguaXBoLT5paGwqNDsKKworCWRpZmZzWzBdID0gKCh1X2ludDE2X3QgKil0Y3BoKVs2XTsKKwlpZiAoZWluZm8tPm9wZXJhdGlvbiAmIElQVF9FQ05fT1BfU0VUX0VDRSkKKwkJdGNwaC0+ZWNlID0gZWluZm8tPnByb3RvLnRjcC5lY2U7CisJaWYgKGVpbmZvLT5vcGVyYXRpb24gJiBJUFRfRUNOX09QX1NFVF9DV1IpCisJCXRjcGgtPmN3ciA9IGVpbmZvLT5wcm90by50Y3AuY3dyOworCWRpZmZzWzFdID0gKCh1X2ludDE2X3QgKil0Y3BoKVs2XTsKKwlkaWZmc1swXSA9IGRpZmZzWzBdIF4gMHhGRkZGOworCisJaWYgKCgqcHNrYiktPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9IVykKKwkJdGNwaC0+Y2hlY2sgPSBjc3VtX2ZvbGQoY3N1bV9wYXJ0aWFsKChjaGFyICopZGlmZnMsCisJCQkJCQkgICAgIHNpemVvZihkaWZmcyksCisJCQkJCQkgICAgIHRjcGgtPmNoZWNrXjB4RkZGRikpOworCWVsc2UKKwkJaWYgKHNrYl9jaGVja3N1bV9oZWxwKCpwc2tiLCBpbndhcmQpKQorCQkJcmV0dXJuIDA7CisJKCpwc2tiKS0+bmZjYWNoZSB8PSBORkNfQUxURVJFRDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAordGFyZ2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKKyAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKKyAgICAgICBjb25zdCB2b2lkICp0YXJnaW5mbywKKyAgICAgICB2b2lkICp1c2VyaW5mbykKK3sKKwljb25zdCBzdHJ1Y3QgaXB0X0VDTl9pbmZvICplaW5mbyA9IHRhcmdpbmZvOworCisJaWYgKGVpbmZvLT5vcGVyYXRpb24gJiBJUFRfRUNOX09QX1NFVF9JUCkKKwkJaWYgKCFzZXRfZWN0X2lwKHBza2IsIGVpbmZvKSkKKwkJCXJldHVybiBORl9EUk9QOworCisJaWYgKGVpbmZvLT5vcGVyYXRpb24gJiAoSVBUX0VDTl9PUF9TRVRfRUNFIHwgSVBUX0VDTl9PUF9TRVRfQ1dSKQorCSAgICAmJiAoKnBza2IpLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fVENQKQorCQlpZiAoIXNldF9lY3RfdGNwKHBza2IsIGVpbmZvLCAob3V0ID09IE5VTEwpKSkKKwkJCXJldHVybiBORl9EUk9QOworCisJcmV0dXJuIElQVF9DT05USU5VRTsKK30KKworc3RhdGljIGludAorY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKyAgICAgICAgICAgdm9pZCAqdGFyZ2luZm8sCisgICAgICAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCisgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IGlwdF9FQ05faW5mbyAqZWluZm8gPSAoc3RydWN0IGlwdF9FQ05faW5mbyAqKXRhcmdpbmZvOworCisJaWYgKHRhcmdpbmZvc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfRUNOX2luZm8pKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJFQ046IHRhcmdpbmZvc2l6ZSAldSAhPSAlWnVcbiIsCisJCSAgICAgICB0YXJnaW5mb3NpemUsCisJCSAgICAgICBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfRUNOX2luZm8pKSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChzdHJjbXAodGFibGVuYW1lLCAibWFuZ2xlIikgIT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJFQ046IGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIFwibWFuZ2xlXCIgdGFibGUsIG5vdCBcIiVzXCJcbiIsIHRhYmxlbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChlaW5mby0+b3BlcmF0aW9uICYgSVBUX0VDTl9PUF9NQVNLKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVDTjogdW5zdXBwb3J0ZWQgRUNOIG9wZXJhdGlvbiAleFxuIiwKKwkJCWVpbmZvLT5vcGVyYXRpb24pOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGVpbmZvLT5pcF9lY3QgJiB+SVBUX0VDTl9JUF9NQVNLKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVDTjogbmV3IEVDVCBjb2RlcG9pbnQgJXggb3V0IG9mIG1hc2tcbiIsCisJCQllaW5mby0+aXBfZWN0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChlaW5mby0+b3BlcmF0aW9uICYgKElQVF9FQ05fT1BfU0VUX0VDRXxJUFRfRUNOX09QX1NFVF9DV1IpKQorCSAgICAmJiAoZS0+aXAucHJvdG8gIT0gSVBQUk9UT19UQ1AgfHwgKGUtPmlwLmludmZsYWdzICYgSVBUX0lOVl9QUk9UTykpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVDTjogY2Fubm90IHVzZSBUQ1Agb3BlcmF0aW9ucyBvbiBhICIKKwkJICAgICAgICJub24tdGNwIHJ1bGVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF9lY25fcmVnID0geworCS5uYW1lCQk9ICJFQ04iLAorCS50YXJnZXQJCT0gdGFyZ2V0LAorCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJcmV0dXJuIGlwdF9yZWdpc3Rlcl90YXJnZXQoJmlwdF9lY25fcmVnKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlpcHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9lY25fcmVnKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTE9HLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0xPRy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMDg3MzMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0xPRy5jCkBAIC0wLDAgKzEsNDg1IEBACisvKgorICogVGhpcyBpcyBhIG1vZHVsZSB3aGljaCBpcyB1c2VkIGZvciBsb2dnaW5nIHBhY2tldHMuCisgKi8KKworLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAorICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaWNtcC5oPgorI2luY2x1ZGUgPG5ldC91ZHAuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTE9HLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIHN5c2xvZyBsb2dnaW5nIG1vZHVsZSIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IG5mbG9nID0gMTsKK21vZHVsZV9wYXJhbShuZmxvZywgaW50LCAwNDAwKTsKK01PRFVMRV9QQVJNX0RFU0MobmZsb2csICJyZWdpc3RlciBhcyBpbnRlcm5hbCBuZXRmaWx0ZXIgbG9nZ2luZyBtb2R1bGUiKTsKKyAKKyNpZiAwCisjZGVmaW5lIERFQlVHUCBwcmludGsKKyNlbHNlCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworLyogVXNlIGxvY2sgdG8gc2VyaWFsaXplLCBzbyBwcmludGtzIGRvbid0IG92ZXJsYXAgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9nX2xvY2spOworCisvKiBPbmUgbGV2ZWwgb2YgcmVjdXJzaW9uIHdvbid0IGtpbGwgdXMgKi8KK3N0YXRpYyB2b2lkIGR1bXBfcGFja2V0KGNvbnN0IHN0cnVjdCBpcHRfbG9nX2luZm8gKmluZm8sCisJCQljb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJdW5zaWduZWQgaW50IGlwaG9mZikKK3sKKwlzdHJ1Y3QgaXBoZHIgX2lwaCwgKmloOworCisJaWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpcGhvZmYsIHNpemVvZihfaXBoKSwgJl9pcGgpOworCWlmIChpaCA9PSBOVUxMKSB7CisJCXByaW50aygiVFJVTkNBVEVEIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBJbXBvcnRhbnQgZmllbGRzOgorCSAqIFRPUywgbGVuLCBERi9NRiwgZnJhZ21lbnQgb2Zmc2V0LCBUVEwsIHNyYywgZHN0LCBvcHRpb25zLiAqLworCS8qIE1heCBsZW5ndGg6IDQwICJTUkM9MjU1LjI1NS4yNTUuMjU1IERTVD0yNTUuMjU1LjI1NS4yNTUgIiAqLworCXByaW50aygiU1JDPSV1LiV1LiV1LiV1IERTVD0ldS4ldS4ldS4ldSAiLAorCSAgICAgICBOSVBRVUFEKGloLT5zYWRkciksIE5JUFFVQUQoaWgtPmRhZGRyKSk7CisKKwkvKiBNYXggbGVuZ3RoOiA0NiAiTEVOPTY1NTM1IFRPUz0weEZGIFBSRUM9MHhGRiBUVEw9MjU1IElEPTY1NTM1ICIgKi8KKwlwcmludGsoIkxFTj0ldSBUT1M9MHglMDJYIFBSRUM9MHglMDJYIFRUTD0ldSBJRD0ldSAiLAorCSAgICAgICBudG9ocyhpaC0+dG90X2xlbiksIGloLT50b3MgJiBJUFRPU19UT1NfTUFTSywKKwkgICAgICAgaWgtPnRvcyAmIElQVE9TX1BSRUNfTUFTSywgaWgtPnR0bCwgbnRvaHMoaWgtPmlkKSk7CisKKwkvKiBNYXggbGVuZ3RoOiA2ICJDRSBERiBNRiAiICovCisJaWYgKG50b2hzKGloLT5mcmFnX29mZikgJiBJUF9DRSkKKwkJcHJpbnRrKCJDRSAiKTsKKwlpZiAobnRvaHMoaWgtPmZyYWdfb2ZmKSAmIElQX0RGKQorCQlwcmludGsoIkRGICIpOworCWlmIChudG9ocyhpaC0+ZnJhZ19vZmYpICYgSVBfTUYpCisJCXByaW50aygiTUYgIik7CisKKwkvKiBNYXggbGVuZ3RoOiAxMSAiRlJBRzo2NTUzNSAiICovCisJaWYgKG50b2hzKGloLT5mcmFnX29mZikgJiBJUF9PRkZTRVQpCisJCXByaW50aygiRlJBRzoldSAiLCBudG9ocyhpaC0+ZnJhZ19vZmYpICYgSVBfT0ZGU0VUKTsKKworCWlmICgoaW5mby0+bG9nZmxhZ3MgJiBJUFRfTE9HX0lQT1BUKQorCSAgICAmJiBpaC0+aWhsICogNCA+IHNpemVvZihzdHJ1Y3QgaXBoZHIpKSB7CisJCXVuc2lnbmVkIGNoYXIgX29wdFs0ICogMTUgLSBzaXplb2Yoc3RydWN0IGlwaGRyKV0sICpvcDsKKwkJdW5zaWduZWQgaW50IGksIG9wdHNpemU7CisKKwkJb3B0c2l6ZSA9IGloLT5paGwgKiA0IC0gc2l6ZW9mKHN0cnVjdCBpcGhkcik7CisJCW9wID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBob2ZmK3NpemVvZihfaXBoKSwKKwkJCQkJb3B0c2l6ZSwgX29wdCk7CisJCWlmIChvcCA9PSBOVUxMKSB7CisJCQlwcmludGsoIlRSVU5DQVRFRCIpOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogTWF4IGxlbmd0aDogMTI3ICJPUFQgKCIgMTUqNCoyY2hhcnMgIikgIiAqLworCQlwcmludGsoIk9QVCAoIik7CisJCWZvciAoaSA9IDA7IGkgPCBvcHRzaXplOyBpKyspCisJCQlwcmludGsoIiUwMlgiLCBvcFtpXSk7CisJCXByaW50aygiKSAiKTsKKwl9CisKKwlzd2l0Y2ggKGloLT5wcm90b2NvbCkgeworCWNhc2UgSVBQUk9UT19UQ1A6IHsKKwkJc3RydWN0IHRjcGhkciBfdGNwaCwgKnRoOworCisJCS8qIE1heCBsZW5ndGg6IDEwICJQUk9UTz1UQ1AgIiAqLworCQlwcmludGsoIlBST1RPPVRDUCAiKTsKKworCQlpZiAobnRvaHMoaWgtPmZyYWdfb2ZmKSAmIElQX09GRlNFVCkKKwkJCWJyZWFrOworCisJCS8qIE1heCBsZW5ndGg6IDI1ICJJTkNPTVBMRVRFIFs2NTUzNSBieXRlc10gIiAqLworCQl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlwaG9mZiArIGloLT5paGwgKiA0LAorCQkJCQlzaXplb2YoX3RjcGgpLCAmX3RjcGgpOworCQlpZiAodGggPT0gTlVMTCkgeworCQkJcHJpbnRrKCJJTkNPTVBMRVRFIFsldSBieXRlc10gIiwKKwkJCSAgICAgICBza2ItPmxlbiAtIGlwaG9mZiAtIGloLT5paGwqNCk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIE1heCBsZW5ndGg6IDIwICJTUFQ9NjU1MzUgRFBUPTY1NTM1ICIgKi8KKwkJcHJpbnRrKCJTUFQ9JXUgRFBUPSV1ICIsCisJCSAgICAgICBudG9ocyh0aC0+c291cmNlKSwgbnRvaHModGgtPmRlc3QpKTsKKwkJLyogTWF4IGxlbmd0aDogMzAgIlNFUT00Mjk0OTY3Mjk1IEFDSz00Mjk0OTY3Mjk1ICIgKi8KKwkJaWYgKGluZm8tPmxvZ2ZsYWdzICYgSVBUX0xPR19UQ1BTRVEpCisJCQlwcmludGsoIlNFUT0ldSBBQ0s9JXUgIiwKKwkJCSAgICAgICBudG9obCh0aC0+c2VxKSwgbnRvaGwodGgtPmFja19zZXEpKTsKKwkJLyogTWF4IGxlbmd0aDogMTMgIldJTkRPVz02NTUzNSAiICovCisJCXByaW50aygiV0lORE9XPSV1ICIsIG50b2hzKHRoLT53aW5kb3cpKTsKKwkJLyogTWF4IGxlbmd0aDogOSAiUkVTPTB4M0YgIiAqLworCQlwcmludGsoIlJFUz0weCUwMnggIiwgKHU4KShudG9obCh0Y3BfZmxhZ193b3JkKHRoKSAmIFRDUF9SRVNFUlZFRF9CSVRTKSA+PiAyMikpOworCQkvKiBNYXggbGVuZ3RoOiAzMiAiQ1dSIEVDRSBVUkcgQUNLIFBTSCBSU1QgU1lOIEZJTiAiICovCisJCWlmICh0aC0+Y3dyKQorCQkJcHJpbnRrKCJDV1IgIik7CisJCWlmICh0aC0+ZWNlKQorCQkJcHJpbnRrKCJFQ0UgIik7CisJCWlmICh0aC0+dXJnKQorCQkJcHJpbnRrKCJVUkcgIik7CisJCWlmICh0aC0+YWNrKQorCQkJcHJpbnRrKCJBQ0sgIik7CisJCWlmICh0aC0+cHNoKQorCQkJcHJpbnRrKCJQU0ggIik7CisJCWlmICh0aC0+cnN0KQorCQkJcHJpbnRrKCJSU1QgIik7CisJCWlmICh0aC0+c3luKQorCQkJcHJpbnRrKCJTWU4gIik7CisJCWlmICh0aC0+ZmluKQorCQkJcHJpbnRrKCJGSU4gIik7CisJCS8qIE1heCBsZW5ndGg6IDExICJVUkdQPTY1NTM1ICIgKi8KKwkJcHJpbnRrKCJVUkdQPSV1ICIsIG50b2hzKHRoLT51cmdfcHRyKSk7CisKKwkJaWYgKChpbmZvLT5sb2dmbGFncyAmIElQVF9MT0dfVENQT1BUKQorCQkgICAgJiYgdGgtPmRvZmYgKiA0ID4gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKSB7CisJCQl1bnNpZ25lZCBjaGFyIF9vcHRbNCAqIDE1IC0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpXTsKKwkJCXVuc2lnbmVkIGNoYXIgKm9wOworCQkJdW5zaWduZWQgaW50IGksIG9wdHNpemU7CisKKwkJCW9wdHNpemUgPSB0aC0+ZG9mZiAqIDQgLSBzaXplb2Yoc3RydWN0IHRjcGhkcik7CisJCQlvcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsCisJCQkJCQlpcGhvZmYraWgtPmlobCo0K3NpemVvZihfdGNwaCksCisJCQkJCQlvcHRzaXplLCBfb3B0KTsKKwkJCWlmIChvcCA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKCJUUlVOQ0FURUQiKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8qIE1heCBsZW5ndGg6IDEyNyAiT1BUICgiIDE1KjQqMmNoYXJzICIpICIgKi8KKwkJCXByaW50aygiT1BUICgiKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBvcHRzaXplOyBpKyspCisJCQkJcHJpbnRrKCIlMDJYIiwgb3BbaV0pOworCQkJcHJpbnRrKCIpICIpOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIElQUFJPVE9fVURQOiB7CisJCXN0cnVjdCB1ZHBoZHIgX3VkcGgsICp1aDsKKworCQkvKiBNYXggbGVuZ3RoOiAxMCAiUFJPVE89VURQICIgKi8KKwkJcHJpbnRrKCJQUk9UTz1VRFAgIik7CisKKwkJaWYgKG50b2hzKGloLT5mcmFnX29mZikgJiBJUF9PRkZTRVQpCisJCQlicmVhazsKKworCQkvKiBNYXggbGVuZ3RoOiAyNSAiSU5DT01QTEVURSBbNjU1MzUgYnl0ZXNdICIgKi8KKwkJdWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpcGhvZmYraWgtPmlobCo0LAorCQkJCQlzaXplb2YoX3VkcGgpLCAmX3VkcGgpOworCQlpZiAodWggPT0gTlVMTCkgeworCQkJcHJpbnRrKCJJTkNPTVBMRVRFIFsldSBieXRlc10gIiwKKwkJCSAgICAgICBza2ItPmxlbiAtIGlwaG9mZiAtIGloLT5paGwqNCk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIE1heCBsZW5ndGg6IDIwICJTUFQ9NjU1MzUgRFBUPTY1NTM1ICIgKi8KKwkJcHJpbnRrKCJTUFQ9JXUgRFBUPSV1IExFTj0ldSAiLAorCQkgICAgICAgbnRvaHModWgtPnNvdXJjZSksIG50b2hzKHVoLT5kZXN0KSwKKwkJICAgICAgIG50b2hzKHVoLT5sZW4pKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSVBQUk9UT19JQ01QOiB7CisJCXN0cnVjdCBpY21waGRyIF9pY21waCwgKmljaDsKKwkJc3RhdGljIHNpemVfdCByZXF1aXJlZF9sZW5bTlJfSUNNUF9UWVBFUysxXQorCQkJPSB7IFtJQ01QX0VDSE9SRVBMWV0gPSA0LAorCQkJICAgIFtJQ01QX0RFU1RfVU5SRUFDSF0KKwkJCSAgICA9IDggKyBzaXplb2Yoc3RydWN0IGlwaGRyKSwKKwkJCSAgICBbSUNNUF9TT1VSQ0VfUVVFTkNIXQorCQkJICAgID0gOCArIHNpemVvZihzdHJ1Y3QgaXBoZHIpLAorCQkJICAgIFtJQ01QX1JFRElSRUNUXQorCQkJICAgID0gOCArIHNpemVvZihzdHJ1Y3QgaXBoZHIpLAorCQkJICAgIFtJQ01QX0VDSE9dID0gNCwKKwkJCSAgICBbSUNNUF9USU1FX0VYQ0VFREVEXQorCQkJICAgID0gOCArIHNpemVvZihzdHJ1Y3QgaXBoZHIpLAorCQkJICAgIFtJQ01QX1BBUkFNRVRFUlBST0JdCisJCQkgICAgPSA4ICsgc2l6ZW9mKHN0cnVjdCBpcGhkciksCisJCQkgICAgW0lDTVBfVElNRVNUQU1QXSA9IDIwLAorCQkJICAgIFtJQ01QX1RJTUVTVEFNUFJFUExZXSA9IDIwLAorCQkJICAgIFtJQ01QX0FERFJFU1NdID0gMTIsCisJCQkgICAgW0lDTVBfQUREUkVTU1JFUExZXSA9IDEyIH07CisKKwkJLyogTWF4IGxlbmd0aDogMTEgIlBST1RPPUlDTVAgIiAqLworCQlwcmludGsoIlBST1RPPUlDTVAgIik7CisKKwkJaWYgKG50b2hzKGloLT5mcmFnX29mZikgJiBJUF9PRkZTRVQpCisJCQlicmVhazsKKworCQkvKiBNYXggbGVuZ3RoOiAyNSAiSU5DT01QTEVURSBbNjU1MzUgYnl0ZXNdICIgKi8KKwkJaWNoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBob2ZmICsgaWgtPmlobCAqIDQsCisJCQkJCSBzaXplb2YoX2ljbXBoKSwgJl9pY21waCk7CisJCWlmIChpY2ggPT0gTlVMTCkgeworCQkJcHJpbnRrKCJJTkNPTVBMRVRFIFsldSBieXRlc10gIiwKKwkJCSAgICAgICBza2ItPmxlbiAtIGlwaG9mZiAtIGloLT5paGwqNCk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIE1heCBsZW5ndGg6IDE4ICJUWVBFPTI1NSBDT0RFPTI1NSAiICovCisJCXByaW50aygiVFlQRT0ldSBDT0RFPSV1ICIsIGljaC0+dHlwZSwgaWNoLT5jb2RlKTsKKworCQkvKiBNYXggbGVuZ3RoOiAyNSAiSU5DT01QTEVURSBbNjU1MzUgYnl0ZXNdICIgKi8KKwkJaWYgKGljaC0+dHlwZSA8PSBOUl9JQ01QX1RZUEVTCisJCSAgICAmJiByZXF1aXJlZF9sZW5baWNoLT50eXBlXQorCQkgICAgJiYgc2tiLT5sZW4taXBob2ZmLWloLT5paGwqNCA8IHJlcXVpcmVkX2xlbltpY2gtPnR5cGVdKSB7CisJCQlwcmludGsoIklOQ09NUExFVEUgWyV1IGJ5dGVzXSAiLAorCQkJICAgICAgIHNrYi0+bGVuIC0gaXBob2ZmIC0gaWgtPmlobCo0KTsKKwkJCWJyZWFrOworCQl9CisKKwkJc3dpdGNoIChpY2gtPnR5cGUpIHsKKwkJY2FzZSBJQ01QX0VDSE9SRVBMWToKKwkJY2FzZSBJQ01QX0VDSE86CisJCQkvKiBNYXggbGVuZ3RoOiAxOSAiSUQ9NjU1MzUgU0VRPTY1NTM1ICIgKi8KKwkJCXByaW50aygiSUQ9JXUgU0VRPSV1ICIsCisJCQkgICAgICAgbnRvaHMoaWNoLT51bi5lY2hvLmlkKSwKKwkJCSAgICAgICBudG9ocyhpY2gtPnVuLmVjaG8uc2VxdWVuY2UpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSUNNUF9QQVJBTUVURVJQUk9COgorCQkJLyogTWF4IGxlbmd0aDogMTQgIlBBUkFNRVRFUj0yNTUgIiAqLworCQkJcHJpbnRrKCJQQVJBTUVURVI9JXUgIiwKKwkJCSAgICAgICBudG9obChpY2gtPnVuLmdhdGV3YXkpID4+IDI0KTsKKwkJCWJyZWFrOworCQljYXNlIElDTVBfUkVESVJFQ1Q6CisJCQkvKiBNYXggbGVuZ3RoOiAyNCAiR0FURVdBWT0yNTUuMjU1LjI1NS4yNTUgIiAqLworCQkJcHJpbnRrKCJHQVRFV0FZPSV1LiV1LiV1LiV1ICIsCisJCQkgICAgICAgTklQUVVBRChpY2gtPnVuLmdhdGV3YXkpKTsKKwkJCS8qIEZhbGwgdGhyb3VnaCAqLworCQljYXNlIElDTVBfREVTVF9VTlJFQUNIOgorCQljYXNlIElDTVBfU09VUkNFX1FVRU5DSDoKKwkJY2FzZSBJQ01QX1RJTUVfRVhDRUVERUQ6CisJCQkvKiBNYXggbGVuZ3RoOiAzK21heGxlbiAqLworCQkJaWYgKCFpcGhvZmYpIHsgLyogT25seSByZWN1cnNlIG9uY2UuICovCisJCQkJcHJpbnRrKCJbIik7CisJCQkJZHVtcF9wYWNrZXQoaW5mbywgc2tiLAorCQkJCQkgICAgaXBob2ZmICsgaWgtPmlobCo0K3NpemVvZihfaWNtcGgpKTsKKwkJCQlwcmludGsoIl0gIik7CisJCQl9CisKKwkJCS8qIE1heCBsZW5ndGg6IDEwICJNVFU9NjU1MzUgIiAqLworCQkJaWYgKGljaC0+dHlwZSA9PSBJQ01QX0RFU1RfVU5SRUFDSAorCQkJICAgICYmIGljaC0+Y29kZSA9PSBJQ01QX0ZSQUdfTkVFREVEKQorCQkJCXByaW50aygiTVRVPSV1ICIsIG50b2hzKGljaC0+dW4uZnJhZy5tdHUpKTsKKwkJfQorCQlicmVhazsKKwl9CisJLyogTWF4IExlbmd0aCAqLworCWNhc2UgSVBQUk9UT19BSDogeworCQlzdHJ1Y3QgaXBfYXV0aF9oZHIgX2FoZHIsICphaDsKKworCQlpZiAobnRvaHMoaWgtPmZyYWdfb2ZmKSAmIElQX09GRlNFVCkKKwkJCWJyZWFrOworCQkKKwkJLyogTWF4IGxlbmd0aDogOSAiUFJPVE89QUggIiAqLworCQlwcmludGsoIlBST1RPPUFIICIpOworCisJCS8qIE1heCBsZW5ndGg6IDI1ICJJTkNPTVBMRVRFIFs2NTUzNSBieXRlc10gIiAqLworCQlhaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlwaG9mZitpaC0+aWhsKjQsCisJCQkJCXNpemVvZihfYWhkciksICZfYWhkcik7CisJCWlmIChhaCA9PSBOVUxMKSB7CisJCQlwcmludGsoIklOQ09NUExFVEUgWyV1IGJ5dGVzXSAiLAorCQkJICAgICAgIHNrYi0+bGVuIC0gaXBob2ZmIC0gaWgtPmlobCo0KTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogTGVuZ3RoOiAxNSAiU1BJPTB4RjEyMzQ1NjcgIiAqLworCQlwcmludGsoIlNQST0weCV4ICIsIG50b2hsKGFoLT5zcGkpKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSVBQUk9UT19FU1A6IHsKKwkJc3RydWN0IGlwX2VzcF9oZHIgX2VzcGgsICplaDsKKworCQkvKiBNYXggbGVuZ3RoOiAxMCAiUFJPVE89RVNQICIgKi8KKwkJcHJpbnRrKCJQUk9UTz1FU1AgIik7CisKKwkJaWYgKG50b2hzKGloLT5mcmFnX29mZikgJiBJUF9PRkZTRVQpCisJCQlicmVhazsKKworCQkvKiBNYXggbGVuZ3RoOiAyNSAiSU5DT01QTEVURSBbNjU1MzUgYnl0ZXNdICIgKi8KKwkJZWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpcGhvZmYraWgtPmlobCo0LAorCQkJCQlzaXplb2YoX2VzcGgpLCAmX2VzcGgpOworCQlpZiAoZWggPT0gTlVMTCkgeworCQkJcHJpbnRrKCJJTkNPTVBMRVRFIFsldSBieXRlc10gIiwKKwkJCSAgICAgICBza2ItPmxlbiAtIGlwaG9mZiAtIGloLT5paGwqNCk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIExlbmd0aDogMTUgIlNQST0weEYxMjM0NTY3ICIgKi8KKwkJcHJpbnRrKCJTUEk9MHgleCAiLCBudG9obChlaC0+c3BpKSk7CisJCWJyZWFrOworCX0KKwkvKiBNYXggbGVuZ3RoOiAxMCAiUFJPVE8gMjU1ICIgKi8KKwlkZWZhdWx0OgorCQlwcmludGsoIlBST1RPPSV1ICIsIGloLT5wcm90b2NvbCk7CisJfQorCisJLyogTWF4IGxlbmd0aDogMTUgIlVJRD00Mjk0OTY3Mjk1ICIgKi8KKyAJaWYgKChpbmZvLT5sb2dmbGFncyAmIElQVF9MT0dfVUlEKSAmJiAhaXBob2ZmICYmIHNrYi0+c2spIHsKKwkJcmVhZF9sb2NrX2JoKCZza2ItPnNrLT5za19jYWxsYmFja19sb2NrKTsKKwkJaWYgKHNrYi0+c2stPnNrX3NvY2tldCAmJiBza2ItPnNrLT5za19zb2NrZXQtPmZpbGUpCisgCQkJcHJpbnRrKCJVSUQ9JXUgIiwgc2tiLT5zay0+c2tfc29ja2V0LT5maWxlLT5mX3VpZCk7CisJCXJlYWRfdW5sb2NrX2JoKCZza2ItPnNrLT5za19jYWxsYmFja19sb2NrKTsKKwl9CisKKwkvKiBQcm90byAgICBNYXggbG9nIHN0cmluZyBsZW5ndGggKi8KKwkvKiBJUDogICAgICA0MCs0Nis2KzExKzEyNyA9IDIzMCAqLworCS8qIFRDUDogICAgIDEwK21heCgyNSwyMCszMCsxMys5KzMyKzExKzEyNykgPSAyNTIgKi8KKwkvKiBVRFA6ICAgICAxMCttYXgoMjUsMjApID0gMzUgKi8KKwkvKiBJQ01QOiAgICAxMSttYXgoMjUsIDE4KzI1K21heCgxOSwxNCwyNCszK24rMTAsMytuKzEwKSkgPSA5MStuICovCisJLyogRVNQOiAgICAgMTArbWF4KDI1KSsxNSA9IDUwICovCisJLyogQUg6ICAgICAgOSttYXgoMjUpKzE1ID0gNDkgKi8KKwkvKiB1bmtub3duOiAxMCAqLworCisJLyogKElDTVAgYWxsb3dzIHJlY3Vyc2lvbiBvbmUgbGV2ZWwgZGVlcCkgKi8KKwkvKiBtYXhsZW4gPSAgSVAgKyBJQ01QICsgIElQICsgbWF4KFRDUCxVRFAsSUNNUCx1bmtub3duKSAqLworCS8qIG1heGxlbiA9IDIzMCsgICA5MSAgKyAyMzAgKyAyNTIgPSA4MDMgKi8KK30KKworc3RhdGljIHZvaWQKK2lwdF9sb2dfcGFja2V0KHVuc2lnbmVkIGludCBob29rbnVtLAorCSAgICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJICAgICAgIGNvbnN0IHN0cnVjdCBpcHRfbG9nX2luZm8gKmxvZ2luZm8sCisJICAgICAgIGNvbnN0IGNoYXIgKmxldmVsX3N0cmluZywKKwkgICAgICAgY29uc3QgY2hhciAqcHJlZml4KQoreworCXNwaW5fbG9ja19iaCgmbG9nX2xvY2spOworCXByaW50ayhsZXZlbF9zdHJpbmcpOworCXByaW50aygiJXNJTj0lcyBPVVQ9JXMgIiwKKwkgICAgICAgcHJlZml4ID09IE5VTEwgPyBsb2dpbmZvLT5wcmVmaXggOiBwcmVmaXgsCisJICAgICAgIGluID8gaW4tPm5hbWUgOiAiIiwKKwkgICAgICAgb3V0ID8gb3V0LT5uYW1lIDogIiIpOworI2lmZGVmIENPTkZJR19CUklER0VfTkVURklMVEVSCisJaWYgKHNrYi0+bmZfYnJpZGdlKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpwaHlzaW5kZXYgPSBza2ItPm5mX2JyaWRnZS0+cGh5c2luZGV2OworCQlzdHJ1Y3QgbmV0X2RldmljZSAqcGh5c291dGRldiA9IHNrYi0+bmZfYnJpZGdlLT5waHlzb3V0ZGV2OworCisJCWlmIChwaHlzaW5kZXYgJiYgaW4gIT0gcGh5c2luZGV2KQorCQkJcHJpbnRrKCJQSFlTSU49JXMgIiwgcGh5c2luZGV2LT5uYW1lKTsKKwkJaWYgKHBoeXNvdXRkZXYgJiYgb3V0ICE9IHBoeXNvdXRkZXYpCisJCQlwcmludGsoIlBIWVNPVVQ9JXMgIiwgcGh5c291dGRldi0+bmFtZSk7CisJfQorI2VuZGlmCisKKwlpZiAoaW4gJiYgIW91dCkgeworCQkvKiBNQUMgbG9nZ2luZyBmb3IgaW5wdXQgY2hhaW4gb25seS4gKi8KKwkJcHJpbnRrKCJNQUM9Iik7CisJCWlmIChza2ItPmRldiAmJiBza2ItPmRldi0+aGFyZF9oZWFkZXJfbGVuCisJCSAgICAmJiBza2ItPm1hYy5yYXcgIT0gKHZvaWQqKXNrYi0+bmguaXBoKSB7CisJCQlpbnQgaTsKKwkJCXVuc2lnbmVkIGNoYXIgKnAgPSBza2ItPm1hYy5yYXc7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2tiLT5kZXYtPmhhcmRfaGVhZGVyX2xlbjsgaSsrLHArKykKKwkJCQlwcmludGsoIiUwMnglYyIsICpwLAorCQkJCSAgICAgICBpPT1za2ItPmRldi0+aGFyZF9oZWFkZXJfbGVuIC0gMQorCQkJCSAgICAgICA/ICcgJzonOicpOworCQl9IGVsc2UKKwkJCXByaW50aygiICIpOworCX0KKworCWR1bXBfcGFja2V0KGxvZ2luZm8sIHNrYiwgMCk7CisJcHJpbnRrKCJcbiIpOworCXNwaW5fdW5sb2NrX2JoKCZsb2dfbG9jayk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2lwdF9sb2dfdGFyZ2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKKwkgICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCisJICAgICAgIHZvaWQgKnVzZXJpbmZvKQoreworCWNvbnN0IHN0cnVjdCBpcHRfbG9nX2luZm8gKmxvZ2luZm8gPSB0YXJnaW5mbzsKKwljaGFyIGxldmVsX3N0cmluZ1s0XSA9ICI8ID4iOworCisJbGV2ZWxfc3RyaW5nWzFdID0gJzAnICsgKGxvZ2luZm8tPmxldmVsICUgOCk7CisJaXB0X2xvZ19wYWNrZXQoaG9va251bSwgKnBza2IsIGluLCBvdXQsIGxvZ2luZm8sIGxldmVsX3N0cmluZywgTlVMTCk7CisKKwlyZXR1cm4gSVBUX0NPTlRJTlVFOworfQorCitzdGF0aWMgdm9pZAoraXB0X2xvZ2ZuKHVuc2lnbmVkIGludCBob29rbnVtLAorCSAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJICBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IGlwdF9sb2dfaW5mbyBsb2dpbmZvID0geyAKKwkJLmxldmVsID0gMCwgCisJCS5sb2dmbGFncyA9IElQVF9MT0dfTUFTSywgCisJCS5wcmVmaXggPSAiIiAKKwl9OworCisJaXB0X2xvZ19wYWNrZXQoaG9va251bSwgc2tiLCBpbiwgb3V0LCAmbG9naW5mbywgS0VSTl9XQVJOSU5HLCBwcmVmaXgpOworfQorCitzdGF0aWMgaW50IGlwdF9sb2dfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCQkJICAgICAgdm9pZCAqdGFyZ2luZm8sCisJCQkgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAorCQkJICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgaXB0X2xvZ19pbmZvICpsb2dpbmZvID0gdGFyZ2luZm87CisKKwlpZiAodGFyZ2luZm9zaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9sb2dfaW5mbykpKSB7CisJCURFQlVHUCgiTE9HOiB0YXJnaW5mb3NpemUgJXUgIT0gJXVcbiIsCisJCSAgICAgICB0YXJnaW5mb3NpemUsIElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9sb2dfaW5mbykpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGxvZ2luZm8tPmxldmVsID49IDgpIHsKKwkJREVCVUdQKCJMT0c6IGxldmVsICV1ID49IDhcbiIsIGxvZ2luZm8tPmxldmVsKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGxvZ2luZm8tPnByZWZpeFtzaXplb2YobG9naW5mby0+cHJlZml4KS0xXSAhPSAnXDAnKSB7CisJCURFQlVHUCgiTE9HOiBwcmVmaXggdGVybSAlaVxuIiwKKwkJICAgICAgIGxvZ2luZm8tPnByZWZpeFtzaXplb2YobG9naW5mby0+cHJlZml4KS0xXSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgaXB0X2xvZ19yZWcgPSB7CisJLm5hbWUJCT0gIkxPRyIsCisJLnRhcmdldAkJPSBpcHRfbG9nX3RhcmdldCwKKwkuY2hlY2tlbnRyeQk9IGlwdF9sb2dfY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaWYgKGlwdF9yZWdpc3Rlcl90YXJnZXQoJmlwdF9sb2dfcmVnKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG5mbG9nKQorCQluZl9sb2dfcmVnaXN0ZXIoUEZfSU5FVCwgJmlwdF9sb2dmbik7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaWYgKG5mbG9nKQorCQluZl9sb2dfdW5yZWdpc3RlcihQRl9JTkVULCAmaXB0X2xvZ2ZuKTsKKwlpcHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9sb2dfcmVnKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFSSy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9NQVJLLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNjNmY5YgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFSSy5jCkBAIC0wLDAgKzEsMTYyIEBACisvKiBUaGlzIGlzIGEgbW9kdWxlIHdoaWNoIGlzIHVzZWQgZm9yIHNldHRpbmcgdGhlIE5GTUFSSyBmaWVsZCBvZiBhbiBza2IuICovCisKKy8qIChDKSAxOTk5LTIwMDEgTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9NQVJLLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBNQVJLIG1vZGlmaWNhdGlvbiBtb2R1bGUiKTsKKworc3RhdGljIHVuc2lnbmVkIGludAordGFyZ2V0X3YwKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJICB1bnNpZ25lZCBpbnQgaG9va251bSwKKwkgIGNvbnN0IHZvaWQgKnRhcmdpbmZvLAorCSAgdm9pZCAqdXNlcmluZm8pCit7CisJY29uc3Qgc3RydWN0IGlwdF9tYXJrX3RhcmdldF9pbmZvICptYXJraW5mbyA9IHRhcmdpbmZvOworCisJaWYoKCpwc2tiKS0+bmZtYXJrICE9IG1hcmtpbmZvLT5tYXJrKSB7CisJCSgqcHNrYiktPm5mbWFyayA9IG1hcmtpbmZvLT5tYXJrOworCQkoKnBza2IpLT5uZmNhY2hlIHw9IE5GQ19BTFRFUkVEOworCX0KKwlyZXR1cm4gSVBUX0NPTlRJTlVFOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50Cit0YXJnZXRfdjEoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkgIHVuc2lnbmVkIGludCBob29rbnVtLAorCSAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCisJICB2b2lkICp1c2VyaW5mbykKK3sKKwljb25zdCBzdHJ1Y3QgaXB0X21hcmtfdGFyZ2V0X2luZm9fdjEgKm1hcmtpbmZvID0gdGFyZ2luZm87CisJaW50IG1hcmsgPSAwOworCisJc3dpdGNoIChtYXJraW5mby0+bW9kZSkgeworCWNhc2UgSVBUX01BUktfU0VUOgorCQltYXJrID0gbWFya2luZm8tPm1hcms7CisJCWJyZWFrOworCQkKKwljYXNlIElQVF9NQVJLX0FORDoKKwkJbWFyayA9ICgqcHNrYiktPm5mbWFyayAmIG1hcmtpbmZvLT5tYXJrOworCQlicmVhazsKKwkJCisJY2FzZSBJUFRfTUFSS19PUjoKKwkJbWFyayA9ICgqcHNrYiktPm5mbWFyayB8IG1hcmtpbmZvLT5tYXJrOworCQlicmVhazsKKwl9CisKKwlpZigoKnBza2IpLT5uZm1hcmsgIT0gbWFyaykgeworCQkoKnBza2IpLT5uZm1hcmsgPSBtYXJrOworCQkoKnBza2IpLT5uZmNhY2hlIHw9IE5GQ19BTFRFUkVEOworCX0KKwlyZXR1cm4gSVBUX0NPTlRJTlVFOworfQorCisKK3N0YXRpYyBpbnQKK2NoZWNrZW50cnlfdjAoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCSAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJICAgICAgdm9pZCAqdGFyZ2luZm8sCisJICAgICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKKwkgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWlmICh0YXJnaW5mb3NpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X21hcmtfdGFyZ2V0X2luZm8pKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJNQVJLOiB0YXJnaW5mb3NpemUgJXUgIT0gJVp1XG4iLAorCQkgICAgICAgdGFyZ2luZm9zaXplLAorCQkgICAgICAgSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X21hcmtfdGFyZ2V0X2luZm8pKSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChzdHJjbXAodGFibGVuYW1lLCAibWFuZ2xlIikgIT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJNQVJLOiBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSBcIm1hbmdsZVwiIHRhYmxlLCBub3QgXCIlc1wiXG4iLCB0YWJsZW5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorY2hlY2tlbnRyeV92MShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkgICAgICB2b2lkICp0YXJnaW5mbywKKwkgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAorCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJc3RydWN0IGlwdF9tYXJrX3RhcmdldF9pbmZvX3YxICptYXJraW5mbyA9IHRhcmdpbmZvOworCisJaWYgKHRhcmdpbmZvc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfbWFya190YXJnZXRfaW5mb192MSkpKXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTUFSSzogdGFyZ2luZm9zaXplICV1ICE9ICVadVxuIiwKKwkJICAgICAgIHRhcmdpbmZvc2l6ZSwKKwkJICAgICAgIElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9tYXJrX3RhcmdldF9pbmZvX3YxKSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RyY21wKHRhYmxlbmFtZSwgIm1hbmdsZSIpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTUFSSzogY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gXCJtYW5nbGVcIiB0YWJsZSwgbm90IFwiJXNcIlxuIiwgdGFibGVuYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG1hcmtpbmZvLT5tb2RlICE9IElQVF9NQVJLX1NFVAorCSAgICAmJiBtYXJraW5mby0+bW9kZSAhPSBJUFRfTUFSS19BTkQKKwkgICAgJiYgbWFya2luZm8tPm1vZGUgIT0gSVBUX01BUktfT1IpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTUFSSzogdW5rbm93biBtb2RlICV1XG4iLAorCQkgICAgICAgbWFya2luZm8tPm1vZGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF9tYXJrX3JlZ192MCA9IHsKKwkubmFtZQkJPSAiTUFSSyIsCisJLnRhcmdldAkJPSB0YXJnZXRfdjAsCisJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5X3YwLAorCS5tZQkJPSBUSElTX01PRFVMRSwKKwkucmV2aXNpb24JPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF9tYXJrX3JlZ192MSA9IHsKKwkubmFtZQkJPSAiTUFSSyIsCisJLnRhcmdldAkJPSB0YXJnZXRfdjEsCisJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5X3YxLAorCS5tZQkJPSBUSElTX01PRFVMRSwKKwkucmV2aXNpb24JPSAxLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwllcnIgPSBpcHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfbWFya19yZWdfdjApOworCWlmICghZXJyKSB7CisJCWVyciA9IGlwdF9yZWdpc3Rlcl90YXJnZXQoJmlwdF9tYXJrX3JlZ192MSk7CisJCWlmIChlcnIpCisJCQlpcHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9tYXJrX3JlZ192MCk7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfbWFya19yZWdfdjApOworCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X21hcmtfcmVnX3YxKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9NQVNRVUVSQURFLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdlOWY2YwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jCkBAIC0wLDAgKzEsMjA3IEBACisvKiBNYXNxdWVyYWRlLiAgU2ltcGxlIG1hcHBpbmcgd2hpY2ggYWx0ZXJzIHJhbmdlIHRvIGEgbG9jYWwgSVAgYWRkcmVzcworICAgKGRlcGVuZGluZyBvbiByb3V0ZSkuICovCisKKy8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKKyAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9ydWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIE1BU1FVRVJBREUgdGFyZ2V0IG1vZHVsZSIpOworCisjaWYgMAorI2RlZmluZSBERUJVR1AgcHJpbnRrCisjZWxzZQorI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKy8qIExvY2sgcHJvdGVjdHMgbWFzcSByZWdpb24gaW5zaWRlIGNvbm50cmFjayAqLworc3RhdGljIERFQ0xBUkVfUldMT0NLKG1hc3FfbG9jayk7CisKKy8qIEZJWE1FOiBNdWx0aXBsZSB0YXJnZXRzLiAtLVJSICovCitzdGF0aWMgaW50CittYXNxdWVyYWRlX2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkJIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJCSB2b2lkICp0YXJnaW5mbywKKwkJIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCisJCSB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWNvbnN0IHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHRhcmdpbmZvOworCisJaWYgKHN0cmNtcCh0YWJsZW5hbWUsICJuYXQiKSAhPSAwKSB7CisJCURFQlVHUCgibWFzcXVlcmFkZV9jaGVjazogYmFkIHRhYmxlIGAlcycuXG4iLCB0YWJsZW5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHRhcmdpbmZvc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKCptcikpKSB7CisJCURFQlVHUCgibWFzcXVlcmFkZV9jaGVjazogc2l6ZSAldSAhPSAldS5cbiIsCisJCSAgICAgICB0YXJnaW5mb3NpemUsIHNpemVvZigqbXIpKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChob29rX21hc2sgJiB+KDEgPDwgTkZfSVBfUE9TVF9ST1VUSU5HKSkgeworCQlERUJVR1AoIm1hc3F1ZXJhZGVfY2hlY2s6IGJhZCBob29rcyAleC5cbiIsIGhvb2tfbWFzayk7CisJCXJldHVybiAwOworCX0KKwlpZiAobXItPnJhbmdlWzBdLmZsYWdzICYgSVBfTkFUX1JBTkdFX01BUF9JUFMpIHsKKwkJREVCVUdQKCJtYXNxdWVyYWRlX2NoZWNrOiBiYWQgTUFQX0lQUy5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKG1yLT5yYW5nZXNpemUgIT0gMSkgeworCQlERUJVR1AoIm1hc3F1ZXJhZGVfY2hlY2s6IGJhZCByYW5nZXNpemUgJXUuXG4iLCBtci0+cmFuZ2VzaXplKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CittYXNxdWVyYWRlX3RhcmdldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCSAgdW5zaWduZWQgaW50IGhvb2tudW0sCisJCSAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCisJCSAgdm9pZCAqdXNlcmluZm8pCit7CisJc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7CisJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CisJY29uc3Qgc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yOworCXN0cnVjdCBpcF9uYXRfcmFuZ2UgbmV3cmFuZ2U7CisJc3RydWN0IHJ0YWJsZSAqcnQ7CisJdV9pbnQzMl90IG5ld3NyYzsKKworCUlQX05GX0FTU0VSVChob29rbnVtID09IE5GX0lQX1BPU1RfUk9VVElORyk7CisKKwkvKiBGSVhNRTogRm9yIHRoZSBtb21lbnQsIGRvbid0IGRvIGxvY2FsIHBhY2tldHMsIGJyZWFrcworCSAgIHRlc3RzdWl0ZSBmb3IgMi4zLjQ5IC0tUlIgKi8KKwlpZiAoKCpwc2tiKS0+c2spCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwljdCA9IGlwX2Nvbm50cmFja19nZXQoKnBza2IsICZjdGluZm8pOworCUlQX05GX0FTU0VSVChjdCAmJiAoY3RpbmZvID09IElQX0NUX05FVyB8fCBjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRAorCSAgICAgICAgICAgICAgICAgICAgfHwgY3RpbmZvID09IElQX0NUX1JFTEFURUQgKyBJUF9DVF9JU19SRVBMWSkpOworCisJbXIgPSB0YXJnaW5mbzsKKwlydCA9IChzdHJ1Y3QgcnRhYmxlICopKCpwc2tiKS0+ZHN0OworCW5ld3NyYyA9IGluZXRfc2VsZWN0X2FkZHIob3V0LCBydC0+cnRfZ2F0ZXdheSwgUlRfU0NPUEVfVU5JVkVSU0UpOworCWlmICghbmV3c3JjKSB7CisJCXByaW50aygiTUFTUVVFUkFERTogJXMgYXRlIG15IElQIGFkZHJlc3NcbiIsIG91dC0+bmFtZSk7CisJCXJldHVybiBORl9EUk9QOworCX0KKworCVdSSVRFX0xPQ0soJm1hc3FfbG9jayk7CisJY3QtPm5hdC5tYXNxX2luZGV4ID0gb3V0LT5pZmluZGV4OworCVdSSVRFX1VOTE9DSygmbWFzcV9sb2NrKTsKKworCS8qIFRyYW5zZmVyIGZyb20gb3JpZ2luYWwgcmFuZ2UuICovCisJbmV3cmFuZ2UgPSAoKHN0cnVjdCBpcF9uYXRfcmFuZ2UpCisJCXsgbXItPnJhbmdlWzBdLmZsYWdzIHwgSVBfTkFUX1JBTkdFX01BUF9JUFMsCisJCSAgbmV3c3JjLCBuZXdzcmMsCisJCSAgbXItPnJhbmdlWzBdLm1pbiwgbXItPnJhbmdlWzBdLm1heCB9KTsKKworCS8qIEhhbmQgbW9kaWZpZWQgcmFuZ2UgdG8gZ2VuZXJpYyBzZXR1cC4gKi8KKwlyZXR1cm4gaXBfbmF0X3NldHVwX2luZm8oY3QsICZuZXdyYW5nZSwgaG9va251bSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitkZXZpY2VfY21wKHN0cnVjdCBpcF9jb25udHJhY2sgKmksIHZvaWQgKmlmaW5kZXgpCit7CisJaW50IHJldDsKKworCVJFQURfTE9DSygmbWFzcV9sb2NrKTsKKwlyZXQgPSAoaS0+bmF0Lm1hc3FfaW5kZXggPT0gKGludCkobG9uZylpZmluZGV4KTsKKwlSRUFEX1VOTE9DSygmbWFzcV9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWFzcV9kZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGV2ZW50LAorCQkJICAgICB2b2lkICpwdHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHB0cjsKKworCWlmIChldmVudCA9PSBORVRERVZfRE9XTikgeworCQkvKiBEZXZpY2Ugd2FzIGRvd25lZC4gIFNlYXJjaCBlbnRpcmUgdGFibGUgZm9yCisJCSAgIGNvbm50cmFja3Mgd2hpY2ggd2VyZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBkZXZpY2UsCisJCSAgIGFuZCBmb3JnZXQgdGhlbS4gKi8KKwkJSVBfTkZfQVNTRVJUKGRldi0+aWZpbmRleCAhPSAwKTsKKworCQlpcF9jdF9pdGVyYXRlX2NsZWFudXAoZGV2aWNlX2NtcCwgKHZvaWQgKikobG9uZylkZXYtPmlmaW5kZXgpOworCX0KKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIGludCBtYXNxX2luZXRfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAorCQkJICAgdW5zaWduZWQgbG9uZyBldmVudCwKKwkJCSAgIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKChzdHJ1Y3QgaW5faWZhZGRyICopcHRyKS0+aWZhX2Rldi0+ZGV2OworCisJaWYgKGV2ZW50ID09IE5FVERFVl9ET1dOKSB7CisJCS8qIElQIGFkZHJlc3Mgd2FzIGRlbGV0ZWQuICBTZWFyY2ggZW50aXJlIHRhYmxlIGZvcgorCQkgICBjb25udHJhY2tzIHdoaWNoIHdlcmUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZGV2aWNlLAorCQkgICBhbmQgZm9yZ2V0IHRoZW0uICovCisJCUlQX05GX0FTU0VSVChkZXYtPmlmaW5kZXggIT0gMCk7CisKKwkJaXBfY3RfaXRlcmF0ZV9jbGVhbnVwKGRldmljZV9jbXAsICh2b2lkICopKGxvbmcpZGV2LT5pZmluZGV4KTsKKwl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbWFzcV9kZXZfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwJPSBtYXNxX2RldmljZV9ldmVudCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbWFzcV9pbmV0X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsCT0gbWFzcV9pbmV0X2V2ZW50LAorfTsKKworc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IG1hc3F1ZXJhZGUgPSB7CisJLm5hbWUJCT0gIk1BU1FVRVJBREUiLAorCS50YXJnZXQJCT0gbWFzcXVlcmFkZV90YXJnZXQsCisJLmNoZWNrZW50cnkJPSBtYXNxdWVyYWRlX2NoZWNrLAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaXB0X3JlZ2lzdGVyX3RhcmdldCgmbWFzcXVlcmFkZSk7CisKKwlpZiAocmV0ID09IDApIHsKKwkJLyogUmVnaXN0ZXIgZm9yIGRldmljZSBkb3duIHJlcG9ydHMgKi8KKwkJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZtYXNxX2Rldl9ub3RpZmllcik7CisJCS8qIFJlZ2lzdGVyIElQIGFkZHJlc3MgY2hhbmdlIHJlcG9ydHMgKi8KKwkJcmVnaXN0ZXJfaW5ldGFkZHJfbm90aWZpZXIoJm1hc3FfaW5ldF9ub3RpZmllcik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlpcHRfdW5yZWdpc3Rlcl90YXJnZXQoJm1hc3F1ZXJhZGUpOworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZtYXNxX2Rldl9ub3RpZmllcik7CisJdW5yZWdpc3Rlcl9pbmV0YWRkcl9ub3RpZmllcigmbWFzcV9pbmV0X25vdGlmaWVyKTsJCit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05FVE1BUC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9ORVRNQVAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjI1NGIyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9ORVRNQVAuYwpAQCAtMCwwICsxLDExNyBAQAorLyogTkVUTUFQIC0gc3RhdGljIE5BVCBtYXBwaW5nIG9mIElQIG5ldHdvcmsgYWRkcmVzc2VzICgxOjEpLgorICogVGhlIG1hcHBpbmcgY2FuIGJlIGFwcGxpZWQgdG8gc291cmNlIChQT1NUUk9VVElORyksCisgKiBkZXN0aW5hdGlvbiAoUFJFUk9VVElORyksIG9yIGJvdGggKHdpdGggc2VwYXJhdGUgcnVsZXMpLgorICovCisKKy8qIChDKSAyMDAwLTIwMDEgU3Zlbm5pbmcgU29lcmVuc2VuIDxzdmVubmluZ0Bwb3N0NS50ZWxlLmRrPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oPgorCisjZGVmaW5lIE1PRFVMRU5BTUUgIk5FVE1BUCIKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlN2ZW5uaW5nIFNvZXJlbnNlbiA8c3Zlbm5pbmdAcG9zdDUudGVsZS5kaz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgMToxIE5BVCBtYXBwaW5nIG9mIElQIG5ldHdvcmtzIHRhcmdldCIpOworCisjaWYgMAorI2RlZmluZSBERUJVR1AgcHJpbnRrCisjZWxzZQorI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKyAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisgICAgICB2b2lkICp0YXJnaW5mbywKKyAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCisgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWNvbnN0IHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHRhcmdpbmZvOworCisJaWYgKHN0cmNtcCh0YWJsZW5hbWUsICJuYXQiKSAhPSAwKSB7CisJCURFQlVHUChNT0RVTEVOQU1FIjpjaGVjazogYmFkIHRhYmxlIGAlcycuXG4iLCB0YWJsZW5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHRhcmdpbmZvc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKCptcikpKSB7CisJCURFQlVHUChNT0RVTEVOQU1FIjpjaGVjazogc2l6ZSAldS5cbiIsIHRhcmdpbmZvc2l6ZSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoaG9va19tYXNrICYgfigoMSA8PCBORl9JUF9QUkVfUk9VVElORykgfCAoMSA8PCBORl9JUF9QT1NUX1JPVVRJTkcpKSkgeworCQlERUJVR1AoTU9EVUxFTkFNRSI6Y2hlY2s6IGJhZCBob29rcyAleC5cbiIsIGhvb2tfbWFzayk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIShtci0+cmFuZ2VbMF0uZmxhZ3MgJiBJUF9OQVRfUkFOR0VfTUFQX0lQUykpIHsKKwkJREVCVUdQKE1PRFVMRU5BTUUiOmNoZWNrOiBiYWQgTUFQX0lQUy5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKG1yLT5yYW5nZXNpemUgIT0gMSkgeworCQlERUJVR1AoTU9EVUxFTkFNRSI6Y2hlY2s6IGJhZCByYW5nZXNpemUgJXUuXG4iLCBtci0+cmFuZ2VzaXplKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50Cit0YXJnZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgIHVuc2lnbmVkIGludCBob29rbnVtLAorICAgICAgIGNvbnN0IHZvaWQgKnRhcmdpbmZvLAorICAgICAgIHZvaWQgKnVzZXJpbmZvKQoreworCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OworCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOworCXVfaW50MzJfdCBuZXdfaXAsIG5ldG1hc2s7CisJY29uc3Qgc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yID0gdGFyZ2luZm87CisJc3RydWN0IGlwX25hdF9yYW5nZSBuZXdyYW5nZTsKKworCUlQX05GX0FTU0VSVChob29rbnVtID09IE5GX0lQX1BSRV9ST1VUSU5HCisJCSAgICAgfHwgaG9va251bSA9PSBORl9JUF9QT1NUX1JPVVRJTkcpOworCWN0ID0gaXBfY29ubnRyYWNrX2dldCgqcHNrYiwgJmN0aW5mbyk7CisKKwluZXRtYXNrID0gfihtci0+cmFuZ2VbMF0ubWluX2lwIF4gbXItPnJhbmdlWzBdLm1heF9pcCk7CisKKwlpZiAoaG9va251bSA9PSBORl9JUF9QUkVfUk9VVElORykKKwkJbmV3X2lwID0gKCpwc2tiKS0+bmguaXBoLT5kYWRkciAmIH5uZXRtYXNrOworCWVsc2UKKwkJbmV3X2lwID0gKCpwc2tiKS0+bmguaXBoLT5zYWRkciAmIH5uZXRtYXNrOworCW5ld19pcCB8PSBtci0+cmFuZ2VbMF0ubWluX2lwICYgbmV0bWFzazsKKworCW5ld3JhbmdlID0gKChzdHJ1Y3QgaXBfbmF0X3JhbmdlKQorCQl7IG1yLT5yYW5nZVswXS5mbGFncyB8IElQX05BVF9SQU5HRV9NQVBfSVBTLAorCQkgIG5ld19pcCwgbmV3X2lwLAorCQkgIG1yLT5yYW5nZVswXS5taW4sIG1yLT5yYW5nZVswXS5tYXggfSk7CisKKwkvKiBIYW5kIG1vZGlmaWVkIHJhbmdlIHRvIGdlbmVyaWMgc2V0dXAuICovCisJcmV0dXJuIGlwX25hdF9zZXR1cF9pbmZvKGN0LCAmbmV3cmFuZ2UsIGhvb2tudW0pOworfQorCitzdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgdGFyZ2V0X21vZHVsZSA9IHsgCisJLm5hbWUgCQk9IE1PRFVMRU5BTUUsCisJLnRhcmdldCAJPSB0YXJnZXQsIAorCS5jaGVja2VudHJ5IAk9IGNoZWNrLAorICAgIAkubWUgCQk9IFRISVNfTU9EVUxFIAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCXJldHVybiBpcHRfcmVnaXN0ZXJfdGFyZ2V0KCZ0YXJnZXRfbW9kdWxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlpcHRfdW5yZWdpc3Rlcl90YXJnZXQoJnRhcmdldF9tb2R1bGUpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9OT1RSQUNLLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05PVFJBQ0suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGJiOWIzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9OT1RSQUNLLmMKQEAgLTAsMCArMSw3NiBAQAorLyogVGhpcyBpcyBhIG1vZHVsZSB3aGljaCBpcyB1c2VkIGZvciBzZXR0aW5nIHVwIGZha2UgY29ubnRyYWNrcworICogb24gcGFja2V0cyBzbyB0aGF0IHRoZXkgYXJlIG5vdCBzZWVuIGJ5IHRoZSBjb25udHJhY2svTkFUIGNvZGUuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oPgorCitzdGF0aWMgdW5zaWduZWQgaW50Cit0YXJnZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgIHVuc2lnbmVkIGludCBob29rbnVtLAorICAgICAgIGNvbnN0IHZvaWQgKnRhcmdpbmZvLAorICAgICAgIHZvaWQgKnVzZXJpbmZvKQoreworCS8qIFByZXZpb3VzbHkgc2VlbiAobG9vcGJhY2spPyBJZ25vcmUuICovCisJaWYgKCgqcHNrYiktPm5mY3QgIT0gTlVMTCkKKwkJcmV0dXJuIElQVF9DT05USU5VRTsKKworCS8qIEF0dGFjaCBmYWtlIGNvbm50cmFjayBlbnRyeS4gCisJICAgSWYgdGhlcmUgaXMgYSByZWFsIGN0IGVudHJ5IGNvcnJlc3BvbmRpZyB0byB0aGlzIHBhY2tldCwgCisJICAgaXQnbGwgaGFuZyBhcm91biB0aWxsIHRpbWluZyBvdXQuIFdlIGRvbid0IGRlYWwgd2l0aCBpdAorCSAgIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLiBKSyAqLworCSgqcHNrYiktPm5mY3QgPSAmaXBfY29ubnRyYWNrX3VudHJhY2tlZC5jdF9nZW5lcmFsOworCSgqcHNrYiktPm5mY3RpbmZvID0gSVBfQ1RfTkVXOworCW5mX2Nvbm50cmFja19nZXQoKCpwc2tiKS0+bmZjdCk7CisKKwlyZXR1cm4gSVBUX0NPTlRJTlVFOworfQorCitzdGF0aWMgaW50CitjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorICAgICAgICAgICB2b2lkICp0YXJnaW5mbywKKyAgICAgICAgICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKKyAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlpZiAodGFyZ2luZm9zaXplICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTk9UUkFDSzogdGFyZ2luZm9zaXplICV1ICE9IDBcbiIsCisJCSAgICAgICB0YXJnaW5mb3NpemUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RyY21wKHRhYmxlbmFtZSwgInJhdyIpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTk9UUkFDSzogY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gXCJyYXdcIiB0YWJsZSwgbm90IFwiJXNcIlxuIiwgdGFibGVuYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXB0X3RhcmdldCBpcHRfbm90cmFja19yZWcgPSB7IAorCS5uYW1lID0gIk5PVFJBQ0siLCAKKwkudGFyZ2V0ID0gdGFyZ2V0LCAKKwkuY2hlY2tlbnRyeSA9IGNoZWNrZW50cnksCisJLm1lID0gVEhJU19NT0RVTEUgCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaWYgKGlwdF9yZWdpc3Rlcl90YXJnZXQoJmlwdF9ub3RyYWNrX3JlZykpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfbm90cmFja19yZWcpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRURJUkVDVC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRURJUkVDVC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZTEzNDQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFRElSRUNULmMKQEAgLTAsMCArMSwxMjkgQEAKKy8qIFJlZGlyZWN0LiAgU2ltcGxlIG1hcHBpbmcgd2hpY2ggYWx0ZXJzIGRzdCB0byBhIGxvY2FsIElQIGFkZHJlc3MuICovCisvKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCisgKiAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBSRURJUkVDVCB0YXJnZXQgbW9kdWxlIik7CisKKyNpZiAwCisjZGVmaW5lIERFQlVHUCBwcmludGsKKyNlbHNlCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworLyogRklYTUU6IFRha2UgbXVsdGlwbGUgcmFuZ2VzIC0tUlIgKi8KK3N0YXRpYyBpbnQKK3JlZGlyZWN0X2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkgICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkgICAgICAgdm9pZCAqdGFyZ2luZm8sCisJICAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCisJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yID0gdGFyZ2luZm87CisKKwlpZiAoc3RyY21wKHRhYmxlbmFtZSwgIm5hdCIpICE9IDApIHsKKwkJREVCVUdQKCJyZWRpcmVjdF9jaGVjazogYmFkIHRhYmxlIGAlcycuXG4iLCB0YWJsZSk7CisJCXJldHVybiAwOworCX0KKwlpZiAodGFyZ2luZm9zaXplICE9IElQVF9BTElHTihzaXplb2YoKm1yKSkpIHsKKwkJREVCVUdQKCJyZWRpcmVjdF9jaGVjazogc2l6ZSAldS5cbiIsIHRhcmdpbmZvc2l6ZSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoaG9va19tYXNrICYgfigoMSA8PCBORl9JUF9QUkVfUk9VVElORykgfCAoMSA8PCBORl9JUF9MT0NBTF9PVVQpKSkgeworCQlERUJVR1AoInJlZGlyZWN0X2NoZWNrOiBiYWQgaG9va3MgJXguXG4iLCBob29rX21hc2spOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKG1yLT5yYW5nZVswXS5mbGFncyAmIElQX05BVF9SQU5HRV9NQVBfSVBTKSB7CisJCURFQlVHUCgicmVkaXJlY3RfY2hlY2s6IGJhZCBNQVBfSVBTLlxuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAobXItPnJhbmdlc2l6ZSAhPSAxKSB7CisJCURFQlVHUCgicmVkaXJlY3RfY2hlY2s6IGJhZCByYW5nZXNpemUgJXUuXG4iLCBtci0+cmFuZ2VzaXplKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CityZWRpcmVjdF90YXJnZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCXVuc2lnbmVkIGludCBob29rbnVtLAorCQljb25zdCB2b2lkICp0YXJnaW5mbywKKwkJdm9pZCAqdXNlcmluZm8pCit7CisJc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7CisJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CisJdV9pbnQzMl90IG5ld2RzdDsKKwljb25zdCBzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSB0YXJnaW5mbzsKKwlzdHJ1Y3QgaXBfbmF0X3JhbmdlIG5ld3JhbmdlOworCisJSVBfTkZfQVNTRVJUKGhvb2tudW0gPT0gTkZfSVBfUFJFX1JPVVRJTkcKKwkJICAgICB8fCBob29rbnVtID09IE5GX0lQX0xPQ0FMX09VVCk7CisKKwljdCA9IGlwX2Nvbm50cmFja19nZXQoKnBza2IsICZjdGluZm8pOworCUlQX05GX0FTU0VSVChjdCAmJiAoY3RpbmZvID09IElQX0NUX05FVyB8fCBjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRCkpOworCisJLyogTG9jYWwgcGFja2V0czogbWFrZSB0aGVtIGdvIHRvIGxvb3BiYWNrICovCisJaWYgKGhvb2tudW0gPT0gTkZfSVBfTE9DQUxfT1VUKQorCQluZXdkc3QgPSBodG9ubCgweDdGMDAwMDAxKTsKKwllbHNlIHsKKwkJc3RydWN0IGluX2RldmljZSAqaW5kZXY7CisKKwkJLyogRGV2aWNlIG1pZ2h0IG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgaW5fZGV2aWNlLiAqLworCQlpbmRldiA9IChzdHJ1Y3QgaW5fZGV2aWNlICopKCpwc2tiKS0+ZGV2LT5pcF9wdHI7CisJCWlmIChpbmRldiA9PSBOVUxMIHx8IGluZGV2LT5pZmFfbGlzdCA9PSBOVUxMKQorCQkJcmV0dXJuIE5GX0RST1A7CisKKwkJLyogR3JhYiBmaXJzdCBhZGRyZXNzIG9uIGludGVyZmFjZS4gKi8KKwkJbmV3ZHN0ID0gaW5kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWw7CisJfQorCisJLyogVHJhbnNmZXIgZnJvbSBvcmlnaW5hbCByYW5nZS4gKi8KKwluZXdyYW5nZSA9ICgoc3RydWN0IGlwX25hdF9yYW5nZSkKKwkJeyBtci0+cmFuZ2VbMF0uZmxhZ3MgfCBJUF9OQVRfUkFOR0VfTUFQX0lQUywKKwkJICBuZXdkc3QsIG5ld2RzdCwKKwkJICBtci0+cmFuZ2VbMF0ubWluLCBtci0+cmFuZ2VbMF0ubWF4IH0pOworCisJLyogSGFuZCBtb2RpZmllZCByYW5nZSB0byBnZW5lcmljIHNldHVwLiAqLworCXJldHVybiBpcF9uYXRfc2V0dXBfaW5mbyhjdCwgJm5ld3JhbmdlLCBob29rbnVtKTsKK30KKworc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IHJlZGlyZWN0X3JlZyA9IHsKKwkubmFtZQkJPSAiUkVESVJFQ1QiLAorCS50YXJnZXQJCT0gcmVkaXJlY3RfdGFyZ2V0LAorCS5jaGVja2VudHJ5CT0gcmVkaXJlY3RfY2hlY2ssCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCXJldHVybiBpcHRfcmVnaXN0ZXJfdGFyZ2V0KCZyZWRpcmVjdF9yZWcpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmcmVkaXJlY3RfcmVnKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVKRUNULmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NmQ2NDkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jCkBAIC0wLDAgKzEsMzM1IEBACisvKgorICogVGhpcyBpcyBhIG1vZHVsZSB3aGljaCBpcyB1c2VkIGZvciByZWplY3RpbmcgcGFja2V0cy4KKyAqIEFkZGVkIHN1cHBvcnQgZm9yIGN1c3RvbWl6ZWQgcmVqZWN0IHBhY2tldHMgKEpvenNlZiBLYWRsZWNzaWspLgorICogQWRkZWQgc3VwcG9ydCBmb3IgSUNNUCB0eXBlLTMtY29kZS0xMyAoTWFjaWVqIFNvbHR5c2lhaykuIFtSRkMgMTgxMl0KKyAqLworCisvKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCisgKiAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wLmg+CisjaW5jbHVkZSA8bmV0L2ljbXAuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L2RzdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9SRUpFQ1QuaD4KKyNpZmRlZiBDT05GSUdfQlJJREdFX05FVEZJTFRFUgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UuaD4KKyNlbmRpZgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBSRUpFQ1QgdGFyZ2V0IG1vZHVsZSIpOworCisjaWYgMAorI2RlZmluZSBERUJVR1AgcHJpbnRrCisjZWxzZQorI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJ0YWJsZSAqcm91dGVfcmV2ZXJzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAKKwkJCQkJICAgc3RydWN0IHRjcGhkciAqdGNwaCwgaW50IGhvb2spCit7CisJc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpvZHN0OworCXN0cnVjdCBmbG93aSBmbCA9IHt9OworCXN0cnVjdCBydGFibGUgKnJ0OworCisJLyogV2UgZG9uJ3QgcmVxdWlyZSBpcCBmb3J3YXJkaW5nIHRvIGJlIGVuYWJsZWQgdG8gYmUgYWJsZSB0bworCSAqIHNlbmQgYSBSU1QgcmVwbHkgZm9yIGJyaWRnZWQgdHJhZmZpYy4gKi8KKwlpZiAoaG9vayAhPSBORl9JUF9GT1JXQVJECisjaWZkZWYgQ09ORklHX0JSSURHRV9ORVRGSUxURVIKKwkgICAgfHwgKHNrYi0+bmZfYnJpZGdlICYmIHNrYi0+bmZfYnJpZGdlLT5tYXNrICYgQlJORl9CUklER0VEKQorI2VuZGlmCisJICAgKSB7CisJCWZsLm5sX3UuaXA0X3UuZGFkZHIgPSBpcGgtPnNhZGRyOworCQlpZiAoaG9vayA9PSBORl9JUF9MT0NBTF9JTikKKwkJCWZsLm5sX3UuaXA0X3Uuc2FkZHIgPSBpcGgtPmRhZGRyOworCQlmbC5ubF91LmlwNF91LnRvcyA9IFJUX1RPUyhpcGgtPnRvcyk7CisKKwkJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpICE9IDApCisJCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgeworCQkvKiBub24tbG9jYWwgc3JjLCBmaW5kIHZhbGlkIGlpZiB0byBzYXRpc2Z5CisJCSAqIHJwLWZpbHRlciB3aGVuIGNhbGxpbmcgaXBfcm91dGVfaW5wdXQuICovCisJCWZsLm5sX3UuaXA0X3UuZGFkZHIgPSBpcGgtPmRhZGRyOworCQlpZiAoaXBfcm91dGVfb3V0cHV0X2tleSgmcnQsICZmbCkgIT0gMCkKKwkJCXJldHVybiBOVUxMOworCisJCW9kc3QgPSBza2ItPmRzdDsKKwkJaWYgKGlwX3JvdXRlX2lucHV0KHNrYiwgaXBoLT5zYWRkciwgaXBoLT5kYWRkciwKKwkJICAgICAgICAgICAgICAgICAgIFJUX1RPUyhpcGgtPnRvcyksIHJ0LT51LmRzdC5kZXYpICE9IDApIHsKKwkJCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJZHN0X3JlbGVhc2UoJnJ0LT51LmRzdCk7CisJCXJ0ID0gKHN0cnVjdCBydGFibGUgKilza2ItPmRzdDsKKwkJc2tiLT5kc3QgPSBvZHN0OworCisJCWZsLm5sX3UuaXA0X3UuZGFkZHIgPSBpcGgtPnNhZGRyOworCQlmbC5ubF91LmlwNF91LnNhZGRyID0gaXBoLT5kYWRkcjsKKwkJZmwubmxfdS5pcDRfdS50b3MgPSBSVF9UT1MoaXBoLT50b3MpOworCX0KKworCWlmIChydC0+dS5kc3QuZXJyb3IpIHsKKwkJZHN0X3JlbGVhc2UoJnJ0LT51LmRzdCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWZsLnByb3RvID0gSVBQUk9UT19UQ1A7CisJZmwuZmxfaXBfc3BvcnQgPSB0Y3BoLT5kZXN0OworCWZsLmZsX2lwX2Rwb3J0ID0gdGNwaC0+c291cmNlOworCisJaWYgKHhmcm1fbG9va3VwKChzdHJ1Y3QgZHN0X2VudHJ5ICoqKSZydCwgJmZsLCBOVUxMLCAwKSkgeworCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwkJcnQgPSBOVUxMOworCX0KKworCXJldHVybiBydDsKK30KKworLyogU2VuZCBSU1QgcmVwbHkgKi8KK3N0YXRpYyB2b2lkIHNlbmRfcmVzZXQoc3RydWN0IHNrX2J1ZmYgKm9sZHNrYiwgaW50IGhvb2spCit7CisJc3RydWN0IHNrX2J1ZmYgKm5za2I7CisJc3RydWN0IHRjcGhkciBfb3RjcGgsICpvdGgsICp0Y3BoOworCXN0cnVjdCBydGFibGUgKnJ0OworCXVfaW50MTZfdCB0bXBfcG9ydDsKKwl1X2ludDMyX3QgdG1wX2FkZHI7CisJaW50IG5lZWRzX2FjazsKKwlpbnQgaGhfbGVuOworCisJLyogSVAgaGVhZGVyIGNoZWNrczogZnJhZ21lbnQuICovCisJaWYgKG9sZHNrYi0+bmguaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX09GRlNFVCkpCisJCXJldHVybjsKKworCW90aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihvbGRza2IsIG9sZHNrYi0+bmguaXBoLT5paGwgKiA0LAorCQkJCSBzaXplb2YoX290Y3BoKSwgJl9vdGNwaCk7CisJaWYgKG90aCA9PSBOVUxMKQorIAkJcmV0dXJuOworCisJLyogTm8gUlNUIGZvciBSU1QuICovCisJaWYgKG90aC0+cnN0KQorCQlyZXR1cm47CisKKwkvKiBGSVhNRTogQ2hlY2sgY2hlY2tzdW0gLS1SUiAqLworCWlmICgocnQgPSByb3V0ZV9yZXZlcnNlKG9sZHNrYiwgb3RoLCBob29rKSkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaGhfbGVuID0gTExfUkVTRVJWRURfU1BBQ0UocnQtPnUuZHN0LmRldik7CisKKwkvKiBXZSBuZWVkIGEgbGluZWFyLCB3cml0ZWFibGUgc2tiLiAgV2UgYWxzbyBuZWVkIHRvIGV4cGFuZAorCSAgIGhlYWRyb29tIGluIGNhc2UgaGhfbGVuIG9mIGluY29taW5nIGludGVyZmFjZSA8IGhoX2xlbiBvZgorCSAgIG91dGdvaW5nIGludGVyZmFjZSAqLworCW5za2IgPSBza2JfY29weV9leHBhbmQob2xkc2tiLCBoaF9sZW4sIHNrYl90YWlscm9vbShvbGRza2IpLAorCQkJICAgICAgIEdGUF9BVE9NSUMpOworCWlmICghbnNrYikgeworCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwkJcmV0dXJuOworCX0KKworCWRzdF9yZWxlYXNlKG5za2ItPmRzdCk7CisJbnNrYi0+ZHN0ID0gJnJ0LT51LmRzdDsKKworCS8qIFRoaXMgcGFja2V0IHdpbGwgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBvdGhlcjogY2xlYXIgbmYgZmllbGRzICovCisJbmZfcmVzZXQobnNrYik7CisJbnNrYi0+bmZjYWNoZSA9IDA7CisJbnNrYi0+bmZtYXJrID0gMDsKKyNpZmRlZiBDT05GSUdfQlJJREdFX05FVEZJTFRFUgorCW5mX2JyaWRnZV9wdXQobnNrYi0+bmZfYnJpZGdlKTsKKwluc2tiLT5uZl9icmlkZ2UgPSBOVUxMOworI2VuZGlmCisKKwl0Y3BoID0gKHN0cnVjdCB0Y3BoZHIgKikoKHVfaW50MzJfdCopbnNrYi0+bmguaXBoICsgbnNrYi0+bmguaXBoLT5paGwpOworCisJLyogU3dhcCBzb3VyY2UgYW5kIGRlc3QgKi8KKwl0bXBfYWRkciA9IG5za2ItPm5oLmlwaC0+c2FkZHI7CisJbnNrYi0+bmguaXBoLT5zYWRkciA9IG5za2ItPm5oLmlwaC0+ZGFkZHI7CisJbnNrYi0+bmguaXBoLT5kYWRkciA9IHRtcF9hZGRyOworCXRtcF9wb3J0ID0gdGNwaC0+c291cmNlOworCXRjcGgtPnNvdXJjZSA9IHRjcGgtPmRlc3Q7CisJdGNwaC0+ZGVzdCA9IHRtcF9wb3J0OworCisJLyogVHJ1bmNhdGUgdG8gbGVuZ3RoIChubyBkYXRhKSAqLworCXRjcGgtPmRvZmYgPSBzaXplb2Yoc3RydWN0IHRjcGhkcikvNDsKKwlza2JfdHJpbShuc2tiLCBuc2tiLT5uaC5pcGgtPmlobCo0ICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKTsKKwluc2tiLT5uaC5pcGgtPnRvdF9sZW4gPSBodG9ucyhuc2tiLT5sZW4pOworCisJaWYgKHRjcGgtPmFjaykgeworCQluZWVkc19hY2sgPSAwOworCQl0Y3BoLT5zZXEgPSBvdGgtPmFja19zZXE7CisJCXRjcGgtPmFja19zZXEgPSAwOworCX0gZWxzZSB7CisJCW5lZWRzX2FjayA9IDE7CisJCXRjcGgtPmFja19zZXEgPSBodG9ubChudG9obChvdGgtPnNlcSkgKyBvdGgtPnN5biArIG90aC0+ZmluCisJCQkJICAgICAgKyBvbGRza2ItPmxlbiAtIG9sZHNrYi0+bmguaXBoLT5paGwqNAorCQkJCSAgICAgIC0gKG90aC0+ZG9mZjw8MikpOworCQl0Y3BoLT5zZXEgPSAwOworCX0KKworCS8qIFJlc2V0IGZsYWdzICovCisJKCh1X2ludDhfdCAqKXRjcGgpWzEzXSA9IDA7CisJdGNwaC0+cnN0ID0gMTsKKwl0Y3BoLT5hY2sgPSBuZWVkc19hY2s7CisKKwl0Y3BoLT53aW5kb3cgPSAwOworCXRjcGgtPnVyZ19wdHIgPSAwOworCisJLyogQWRqdXN0IFRDUCBjaGVja3N1bSAqLworCXRjcGgtPmNoZWNrID0gMDsKKwl0Y3BoLT5jaGVjayA9IHRjcF92NF9jaGVjayh0Y3BoLCBzaXplb2Yoc3RydWN0IHRjcGhkciksCisJCQkJICAgbnNrYi0+bmguaXBoLT5zYWRkciwKKwkJCQkgICBuc2tiLT5uaC5pcGgtPmRhZGRyLAorCQkJCSAgIGNzdW1fcGFydGlhbCgoY2hhciAqKXRjcGgsCisJCQkJCQlzaXplb2Yoc3RydWN0IHRjcGhkciksIDApKTsKKworCS8qIEFkanVzdCBJUCBUVEwsIERGICovCisJbnNrYi0+bmguaXBoLT50dGwgPSBNQVhUVEw7CisJLyogU2V0IERGLCBpZCA9IDAgKi8KKwluc2tiLT5uaC5pcGgtPmZyYWdfb2ZmID0gaHRvbnMoSVBfREYpOworCW5za2ItPm5oLmlwaC0+aWQgPSAwOworCisJLyogQWRqdXN0IElQIGNoZWNrc3VtICovCisJbnNrYi0+bmguaXBoLT5jaGVjayA9IDA7CisJbnNrYi0+bmguaXBoLT5jaGVjayA9IGlwX2Zhc3RfY3N1bSgodW5zaWduZWQgY2hhciAqKW5za2ItPm5oLmlwaCwgCisJCQkJCSAgIG5za2ItPm5oLmlwaC0+aWhsKTsKKworCS8qICJOZXZlciBoYXBwZW5zIiAqLworCWlmIChuc2tiLT5sZW4gPiBkc3RfbXR1KG5za2ItPmRzdCkpCisJCWdvdG8gZnJlZV9uc2tiOworCisJbmZfY3RfYXR0YWNoKG5za2IsIG9sZHNrYik7CisKKwlORl9IT09LKFBGX0lORVQsIE5GX0lQX0xPQ0FMX09VVCwgbnNrYiwgTlVMTCwgbnNrYi0+ZHN0LT5kZXYsCisJCWRzdF9vdXRwdXQpOworCXJldHVybjsKKworIGZyZWVfbnNrYjoKKwlrZnJlZV9za2IobnNrYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZW5kX3VucmVhY2goc3RydWN0IHNrX2J1ZmYgKnNrYl9pbiwgaW50IGNvZGUpCit7CisJaWNtcF9zZW5kKHNrYl9pbiwgSUNNUF9ERVNUX1VOUkVBQ0gsIGNvZGUsIDApOworfQkKKworc3RhdGljIHVuc2lnbmVkIGludCByZWplY3Qoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCQkJICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJCSAgIHVuc2lnbmVkIGludCBob29rbnVtLAorCQkJICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCisJCQkgICB2b2lkICp1c2VyaW5mbykKK3sKKwljb25zdCBzdHJ1Y3QgaXB0X3JlamVjdF9pbmZvICpyZWplY3QgPSB0YXJnaW5mbzsKKworCS8qIE91ciBuYWl2ZSByZXNwb25zZSBjb25zdHJ1Y3Rpb24gZG9lc24ndCBkZWFsIHdpdGggSVAKKyAgICAgICAgICAgb3B0aW9ucywgYW5kIHByb2JhYmx5IHNob3VsZG4ndCB0cnkuICovCisJaWYgKCgqcHNrYiktPm5oLmlwaC0+aWhsPDwyICE9IHNpemVvZihzdHJ1Y3QgaXBoZHIpKQorCQlyZXR1cm4gTkZfRFJPUDsKKworCS8qIFdBUk5JTkc6IFRoaXMgY29kZSBjYXVzZXMgcmVlbnRyeSB3aXRoaW4gaXB0YWJsZXMuCisJICAgVGhpcyBtZWFucyB0aGF0IHRoZSBpcHRhYmxlcyBqdW1wIHN0YWNrIGlzIG5vdyBjcmFwLiAgV2UKKwkgICBtdXN0IHJldHVybiBhbiBhYnNvbHV0ZSB2ZXJkaWN0LiAtLVJSICovCisgICAgCXN3aXRjaCAocmVqZWN0LT53aXRoKSB7CisgICAgCWNhc2UgSVBUX0lDTVBfTkVUX1VOUkVBQ0hBQkxFOgorICAgIAkJc2VuZF91bnJlYWNoKCpwc2tiLCBJQ01QX05FVF9VTlJFQUNIKTsKKyAgICAJCWJyZWFrOworICAgIAljYXNlIElQVF9JQ01QX0hPU1RfVU5SRUFDSEFCTEU6CisgICAgCQlzZW5kX3VucmVhY2goKnBza2IsIElDTVBfSE9TVF9VTlJFQUNIKTsKKyAgICAJCWJyZWFrOworICAgIAljYXNlIElQVF9JQ01QX1BST1RfVU5SRUFDSEFCTEU6CisgICAgCQlzZW5kX3VucmVhY2goKnBza2IsIElDTVBfUFJPVF9VTlJFQUNIKTsKKyAgICAJCWJyZWFrOworICAgIAljYXNlIElQVF9JQ01QX1BPUlRfVU5SRUFDSEFCTEU6CisgICAgCQlzZW5kX3VucmVhY2goKnBza2IsIElDTVBfUE9SVF9VTlJFQUNIKTsKKyAgICAJCWJyZWFrOworICAgIAljYXNlIElQVF9JQ01QX05FVF9QUk9ISUJJVEVEOgorICAgIAkJc2VuZF91bnJlYWNoKCpwc2tiLCBJQ01QX05FVF9BTk8pOworICAgIAkJYnJlYWs7CisJY2FzZSBJUFRfSUNNUF9IT1NUX1BST0hJQklURUQ6CisgICAgCQlzZW5kX3VucmVhY2goKnBza2IsIElDTVBfSE9TVF9BTk8pOworICAgIAkJYnJlYWs7CisgICAgCWNhc2UgSVBUX0lDTVBfQURNSU5fUFJPSElCSVRFRDoKKwkJc2VuZF91bnJlYWNoKCpwc2tiLCBJQ01QX1BLVF9GSUxURVJFRCk7CisJCWJyZWFrOworCWNhc2UgSVBUX1RDUF9SRVNFVDoKKwkJc2VuZF9yZXNldCgqcHNrYiwgaG9va251bSk7CisJY2FzZSBJUFRfSUNNUF9FQ0hPUkVQTFk6CisJCS8qIERvZXNuJ3QgaGFwcGVuLiAqLworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gTkZfRFJPUDsKK30KKworc3RhdGljIGludCBjaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJCSBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCQkgdm9pZCAqdGFyZ2luZm8sCisJCSB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAorCQkgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKyAJY29uc3Qgc3RydWN0IGlwdF9yZWplY3RfaW5mbyAqcmVqaW5mbyA9IHRhcmdpbmZvOworCisgCWlmICh0YXJnaW5mb3NpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3JlamVjdF9pbmZvKSkpIHsKKyAgCQlERUJVR1AoIlJFSkVDVDogdGFyZ2luZm9zaXplICV1ICE9IDBcbiIsIHRhcmdpbmZvc2l6ZSk7CisgIAkJcmV0dXJuIDA7CisgIAl9CisKKwkvKiBPbmx5IGFsbG93IHRoZXNlIGZvciBwYWNrZXQgZmlsdGVyaW5nLiAqLworCWlmIChzdHJjbXAodGFibGVuYW1lLCAiZmlsdGVyIikgIT0gMCkgeworCQlERUJVR1AoIlJFSkVDVDogYmFkIHRhYmxlIGAlcycuXG4iLCB0YWJsZW5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKChob29rX21hc2sgJiB+KCgxIDw8IE5GX0lQX0xPQ0FMX0lOKQorCQkJICAgfCAoMSA8PCBORl9JUF9GT1JXQVJEKQorCQkJICAgfCAoMSA8PCBORl9JUF9MT0NBTF9PVVQpKSkgIT0gMCkgeworCQlERUJVR1AoIlJFSkVDVDogYmFkIGhvb2sgbWFzayAlWFxuIiwgaG9va19tYXNrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHJlamluZm8tPndpdGggPT0gSVBUX0lDTVBfRUNIT1JFUExZKSB7CisJCXByaW50aygiUkVKRUNUOiBFQ0hPUkVQTFkgbm8gbG9uZ2VyIHN1cHBvcnRlZC5cbiIpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKHJlamluZm8tPndpdGggPT0gSVBUX1RDUF9SRVNFVCkgeworCQkvKiBNdXN0IHNwZWNpZnkgdGhhdCBpdCdzIGEgVENQIHBhY2tldCAqLworCQlpZiAoZS0+aXAucHJvdG8gIT0gSVBQUk9UT19UQ1AKKwkJICAgIHx8IChlLT5pcC5pbnZmbGFncyAmIElQVF9JTlZfUFJPVE8pKSB7CisJCQlERUJVR1AoIlJFSkVDVDogVENQX1JFU0VUIGludmFsaWQgZm9yIG5vbi10Y3BcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF9yZWplY3RfcmVnID0geworCS5uYW1lCQk9ICJSRUpFQ1QiLAorCS50YXJnZXQJCT0gcmVqZWN0LAorCS5jaGVja2VudHJ5CT0gY2hlY2ssCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCXJldHVybiBpcHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfcmVqZWN0X3JlZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfcmVqZWN0X3JlZyk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1NBTUUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfU0FNRS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMDUzNmQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1NBTUUuYwpAQCAtMCwwICsxLDIxMSBAQAorLyogU2FtZS4gIEp1c3QgbGlrZSBTTkFULCBvbmx5IHRyeSB0byBtYWtlIHRoZSBjb25uZWN0aW9ucworICogCSAgYmV0d2VlbiBjbGllbnQgQSBhbmQgc2VydmVyIEIgYWx3YXlzIGhhdmUgdGhlIHNhbWUgc291cmNlIGlwLgorICoKKyAqIChDKSAyMDAwIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCisgKiAoQykgMjAwMSBNYXJ0aW4gSm9zZWZzc29uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAwMTAzMjAgTWFydGluIEpvc2Vmc3NvbiA8Z2FuZGFsZkB3bHVnLndlc3Riby5zZT4KKyAqIAkqIGNvcGllZCBpcHRfQkFMQU5DRS5jIHRvIGlwdF9TQU1FLmMgYW5kIGNoYW5nZWQgYSBmZXcgdGhpbmdzLgorICogMDEwNzI4IE1hcnRpbiBKb3NlZnNzb24gPGdhbmRhbGZAd2x1Zy53ZXN0Ym8uc2U+CisgKiAJKiBhZGRlZCAtLW5vZHN0IHRvIG5vdCBpbmNsdWRlIGRlc3RpbmF0aW9uLWlwIGluIG5ldyBzb3VyY2UKKyAqIAkgIGNhbGN1bGF0aW9ucy4KKyAqCSogYWRkZWQgc29tZSBtb3JlIHNhbml0eS1jaGVja3MuCisgKiAwMTA3MjkgTWFydGluIEpvc2Vmc3NvbiA8Z2FuZGFsZkB3bHVnLndlc3Riby5zZT4KKyAqIAkqIGZpeGVkIGEgYnVnZ3kgaWYtc3RhdGVtZW50IGluIHNhbWVfY2hlY2soKSwgc2hvdWxkIGhhdmUKKyAqIAkgIHVzZWQgbnRvaGwoKSBidXQgZGlkbid0LgorICogCSogYWRkZWQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgcmFuZ2VzLiBJUFRfU0FNRV9NQVhfUkFOR0UgaXMKKyAqIAkgIGRlZmluZWQgaW4gbGludXgvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfU0FNRS5oCisgKiAJICBhbmQgaXMgY3VycmVudGx5IHNldCB0byAxMC4KKyAqIAkqIGFkZGVkIHN1cHBvcnQgZm9yIDEtYWRkcmVzcyByYW5nZSwgbmljZSB0byBoYXZlIG5vdyB0aGF0CisgKiAJICB3ZSBoYXZlIG11bHRpcGxlIHJhbmdlcy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfU0FNRS5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJNYXJ0aW4gSm9zZWZzc29uIDxnYW5kYWxmQHdsdWcud2VzdGJvLnNlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBzcGVjaWFsIFNOQVQgbW9kdWxlIGZvciBjb25zaXN0ZW50IHNvdXJjZWlwIik7CisKKyNpZiAwCisjZGVmaW5lIERFQlVHUCBwcmludGsKKyNlbHNlCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworc3RhdGljIGludAorc2FtZV9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkgICAgICB2b2lkICp0YXJnaW5mbywKKwkgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAorCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJdW5zaWduZWQgaW50IGNvdW50LCBjb3VudGVzcywgcmFuZ2VpcCwgaW5kZXggPSAwOworCXN0cnVjdCBpcHRfc2FtZV9pbmZvICptciA9IHRhcmdpbmZvOworCisJbXItPmlwbnVtID0gMDsKKworCWlmIChzdHJjbXAodGFibGVuYW1lLCAibmF0IikgIT0gMCkgeworCQlERUJVR1AoInNhbWVfY2hlY2s6IGJhZCB0YWJsZSBgJXMnLlxuIiwgdGFibGVuYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICh0YXJnaW5mb3NpemUgIT0gSVBUX0FMSUdOKHNpemVvZigqbXIpKSkgeworCQlERUJVR1AoInNhbWVfY2hlY2s6IHNpemUgJXUuXG4iLCB0YXJnaW5mb3NpemUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGhvb2tfbWFzayAmIH4oMSA8PCBORl9JUF9QUkVfUk9VVElORyB8IDEgPDwgTkZfSVBfUE9TVF9ST1VUSU5HKSkgeworCQlERUJVR1AoInNhbWVfY2hlY2s6IGJhZCBob29rcyAleC5cbiIsIGhvb2tfbWFzayk7CisJCXJldHVybiAwOworCX0KKwlpZiAobXItPnJhbmdlc2l6ZSA8IDEpIHsKKwkJREVCVUdQKCJzYW1lX2NoZWNrOiBuZWVkIGF0IGxlYXN0IG9uZSBkZXN0IHJhbmdlLlxuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAobXItPnJhbmdlc2l6ZSA+IElQVF9TQU1FX01BWF9SQU5HRSkgeworCQlERUJVR1AoInNhbWVfY2hlY2s6IHRvbyBtYW55IHJhbmdlcyBzcGVjaWZpZWQsIG1heGltdW0gIgorCQkJCSJpcyAldSByYW5nZXNcbiIsCisJCQkJSVBUX1NBTUVfTUFYX1JBTkdFKTsKKwkJcmV0dXJuIDA7CisJfQorCWZvciAoY291bnQgPSAwOyBjb3VudCA8IG1yLT5yYW5nZXNpemU7IGNvdW50KyspIHsKKwkJaWYgKG50b2hsKG1yLT5yYW5nZVtjb3VudF0ubWluX2lwKSA+CisJCQkJbnRvaGwobXItPnJhbmdlW2NvdW50XS5tYXhfaXApKSB7CisJCQlERUJVR1AoInNhbWVfY2hlY2s6IG1pbl9pcCBpcyBsYXJnZXIgdGhhbiBtYXhfaXAgaW4gIgorCQkJCSJyYW5nZSBgJXUuJXUuJXUuJXUtJXUuJXUuJXUuJXUnLlxuIiwKKwkJCQlOSVBRVUFEKG1yLT5yYW5nZVtjb3VudF0ubWluX2lwKSwKKwkJCQlOSVBRVUFEKG1yLT5yYW5nZVtjb3VudF0ubWF4X2lwKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIShtci0+cmFuZ2VbY291bnRdLmZsYWdzICYgSVBfTkFUX1JBTkdFX01BUF9JUFMpKSB7CisJCQlERUJVR1AoInNhbWVfY2hlY2s6IGJhZCBNQVBfSVBTLlxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyYW5nZWlwID0gKG50b2hsKG1yLT5yYW5nZVtjb3VudF0ubWF4X2lwKSAtIAorCQkJCQludG9obChtci0+cmFuZ2VbY291bnRdLm1pbl9pcCkgKyAxKTsKKwkJbXItPmlwbnVtICs9IHJhbmdlaXA7CisJCQorCQlERUJVR1AoInNhbWVfY2hlY2s6IHJhbmdlICV1LCBpcG51bSA9ICV1XG4iLCBjb3VudCwgcmFuZ2VpcCk7CisJfQorCURFQlVHUCgic2FtZV9jaGVjazogdG90YWwgaXBhZGRyZXNzZXMgPSAldVxuIiwgbXItPmlwbnVtKTsKKwkKKwltci0+aXBhcnJheSA9IGttYWxsb2MoKHNpemVvZih1X2ludDMyX3QpICogbXItPmlwbnVtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtci0+aXBhcnJheSkgeworCQlERUJVR1AoInNhbWVfY2hlY2s6IENvdWxkbid0IGFsbG9jYXRlICV1IGJ5dGVzICIKKwkJCSJmb3IgJXUgaXBhZGRyZXNzZXMhXG4iLCAKKwkJCShzaXplb2YodV9pbnQzMl90KSAqIG1yLT5pcG51bSksIG1yLT5pcG51bSk7CisJCXJldHVybiAwOworCX0KKwlERUJVR1AoInNhbWVfY2hlY2s6IEFsbG9jYXRlZCAldSBieXRlcyBmb3IgJXUgaXBhZGRyZXNzZXMuXG4iLAorCQkJKHNpemVvZih1X2ludDMyX3QpICogbXItPmlwbnVtKSwgbXItPmlwbnVtKTsKKwkKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBtci0+cmFuZ2VzaXplOyBjb3VudCsrKSB7CisJCWZvciAoY291bnRlc3MgPSBudG9obChtci0+cmFuZ2VbY291bnRdLm1pbl9pcCk7CisJCQkJY291bnRlc3MgPD0gbnRvaGwobXItPnJhbmdlW2NvdW50XS5tYXhfaXApOworCQkJCQljb3VudGVzcysrKSB7CisJCQltci0+aXBhcnJheVtpbmRleF0gPSBjb3VudGVzczsKKwkJCURFQlVHUCgic2FtZV9jaGVjazogQWRkZWQgaXBhZGRyZXNzIGAldS4ldS4ldS4ldScgIgorCQkJCSJpbiBpbmRleCAldS5cbiIsCisJCQkJSElQUVVBRChjb3VudGVzcyksIGluZGV4KTsKKwkJCWluZGV4Kys7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIAorc2FtZV9kZXN0cm95KHZvaWQgKnRhcmdpbmZvLAorCQl1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplKQoreworCXN0cnVjdCBpcHRfc2FtZV9pbmZvICptciA9IHRhcmdpbmZvOworCisJa2ZyZWUobXItPmlwYXJyYXkpOworCQorCURFQlVHUCgic2FtZV9kZXN0cm95OiBEZWFsbG9jYXRlZCAldSBieXRlcyBmb3IgJXUgaXBhZGRyZXNzZXMuXG4iLAorCQkJKHNpemVvZih1X2ludDMyX3QpICogbXItPmlwbnVtKSwgbXItPmlwbnVtKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorc2FtZV90YXJnZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCXVuc2lnbmVkIGludCBob29rbnVtLAorCQljb25zdCB2b2lkICp0YXJnaW5mbywKKwkJdm9pZCAqdXNlcmluZm8pCit7CisJc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7CisJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CisJdV9pbnQzMl90IHRtcGlwLCBhaW5kZXgsIG5ld19pcDsKKwljb25zdCBzdHJ1Y3QgaXB0X3NhbWVfaW5mbyAqc2FtZSA9IHRhcmdpbmZvOworCXN0cnVjdCBpcF9uYXRfcmFuZ2UgbmV3cmFuZ2U7CisJY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdDsKKworCUlQX05GX0FTU0VSVChob29rbnVtID09IE5GX0lQX1BSRV9ST1VUSU5HIHx8CisJCQlob29rbnVtID09IE5GX0lQX1BPU1RfUk9VVElORyk7CisJY3QgPSBpcF9jb25udHJhY2tfZ2V0KCpwc2tiLCAmY3RpbmZvKTsKKworCXQgPSAmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlOworCisJLyogQmFzZSBuZXcgc291cmNlIG9uIHJlYWwgc3JjIGlwIGFuZCBvcHRpb25hbGx5IGRzdCBpcCwKKwkgICBnaXZpbmcgc29tZSBob3BlIGZvciBjb25zaXN0ZW5jeSBhY3Jvc3MgcmVib290cy4KKwkgICBIZXJlIHdlIGNhbGN1bGF0ZSB0aGUgaW5kZXggaW4gc2FtZS0+aXBhcnJheSB3aGljaAorCSAgIGhvbGRzIHRoZSBpcGFkZHJlc3Mgd2Ugc2hvdWxkIHVzZSAqLworCQorCXRtcGlwID0gbnRvaGwodC0+c3JjLmlwKTsKKworCWlmICghKHNhbWUtPmluZm8gJiBJUFRfU0FNRV9OT0RTVCkpCisJCXRtcGlwICs9IG50b2hsKHQtPmRzdC5pcCk7CisJCisJYWluZGV4ID0gdG1waXAgJSBzYW1lLT5pcG51bTsKKworCW5ld19pcCA9IGh0b25sKHNhbWUtPmlwYXJyYXlbYWluZGV4XSk7CisKKwlERUJVR1AoImlwdF9TQU1FOiBzcmM9JXUuJXUuJXUuJXUgZHN0PSV1LiV1LiV1LiV1LCAiCisJCQkibmV3IHNyYz0ldS4ldS4ldS4ldVxuIiwKKwkJCU5JUFFVQUQodC0+c3JjLmlwKSwgTklQUVVBRCh0LT5kc3QuaXApLAorCQkJTklQUVVBRChuZXdfaXApKTsKKworCS8qIFRyYW5zZmVyIGZyb20gb3JpZ2luYWwgcmFuZ2UuICovCisJbmV3cmFuZ2UgPSAoKHN0cnVjdCBpcF9uYXRfcmFuZ2UpCisJCXsgc2FtZS0+cmFuZ2VbMF0uZmxhZ3MsIG5ld19pcCwgbmV3X2lwLAorCQkgIC8qIEZJWE1FOiBVc2UgcG9ydHMgZnJvbSBjb3JyZWN0IHJhbmdlISAqLworCQkgIHNhbWUtPnJhbmdlWzBdLm1pbiwgc2FtZS0+cmFuZ2VbMF0ubWF4IH0pOworCisJLyogSGFuZCBtb2RpZmllZCByYW5nZSB0byBnZW5lcmljIHNldHVwLiAqLworCXJldHVybiBpcF9uYXRfc2V0dXBfaW5mbyhjdCwgJm5ld3JhbmdlLCBob29rbnVtKTsKK30KKworc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IHNhbWVfcmVnID0geyAKKwkubmFtZQkJPSAiU0FNRSIsCisJLnRhcmdldAkJPSBzYW1lX3RhcmdldCwKKwkuY2hlY2tlbnRyeQk9IHNhbWVfY2hlY2ssCisJLmRlc3Ryb3kJPSBzYW1lX2Rlc3Ryb3ksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCXJldHVybiBpcHRfcmVnaXN0ZXJfdGFyZ2V0KCZzYW1lX3JlZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZzYW1lX3JlZyk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CisKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVENQTVNTLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RDUE1TUy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNDkwNTAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RDUE1TUy5jCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogVGhpcyBpcyBhIG1vZHVsZSB3aGljaCBpcyB1c2VkIGZvciBzZXR0aW5nIHRoZSBNU1Mgb3B0aW9uIGluIFRDUCBwYWNrZXRzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1RDUE1TUy5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgVENQIE1TUyBtb2RpZmljYXRpb24gbW9kdWxlIik7CisKKyNpZiAwCisjZGVmaW5lIERFQlVHUCBwcmludGsKKyNlbHNlCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworc3RhdGljIHVfaW50MTZfdAorY2hlYXRfY2hlY2sodV9pbnQzMl90IG9sZHZhbGludiwgdV9pbnQzMl90IG5ld3ZhbCwgdV9pbnQxNl90IG9sZGNoZWNrKQoreworCXVfaW50MzJfdCBkaWZmc1tdID0geyBvbGR2YWxpbnYsIG5ld3ZhbCB9OworCXJldHVybiBjc3VtX2ZvbGQoY3N1bV9wYXJ0aWFsKChjaGFyICopZGlmZnMsIHNpemVvZihkaWZmcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZGNoZWNrXjB4RkZGRikpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAorb3B0bGVuKGNvbnN0IHVfaW50OF90ICpvcHQsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJLyogQmV3YXJlIHplcm8tbGVuZ3RoIG9wdGlvbnM6IG1ha2UgZmluaXRlIHByb2dyZXNzICovCisJaWYgKG9wdFtvZmZzZXRdIDw9IFRDUE9QVF9OT1AgfHwgb3B0W29mZnNldCsxXSA9PSAwKSByZXR1cm4gMTsKKwllbHNlIHJldHVybiBvcHRbb2Zmc2V0KzFdOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitpcHRfdGNwbXNzX3RhcmdldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCSAgdW5zaWduZWQgaW50IGhvb2tudW0sCisJCSAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCisJCSAgdm9pZCAqdXNlcmluZm8pCit7CisJY29uc3Qgc3RydWN0IGlwdF90Y3Btc3NfaW5mbyAqdGNwbXNzaW5mbyA9IHRhcmdpbmZvOworCXN0cnVjdCB0Y3BoZHIgKnRjcGg7CisJc3RydWN0IGlwaGRyICppcGg7CisJdV9pbnQxNl90IHRjcGxlbiwgbmV3dG90bGVuLCBvbGR2YWwsIG5ld21zczsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1X2ludDhfdCAqb3B0OworCisJaWYgKCFza2JfaXBfbWFrZV93cml0YWJsZShwc2tiLCAoKnBza2IpLT5sZW4pKQorCQlyZXR1cm4gTkZfRFJPUDsKKworCWlwaCA9ICgqcHNrYiktPm5oLmlwaDsKKwl0Y3BsZW4gPSAoKnBza2IpLT5sZW4gLSBpcGgtPmlobCo0OworCisJdGNwaCA9ICh2b2lkICopaXBoICsgaXBoLT5paGwqNDsKKworCS8qIFNpbmNlIGl0IHBhc3NlZCBmbGFncyB0ZXN0IGluIHRjcCBtYXRjaCwgd2Uga25vdyBpdCBpcyBpcworCSAgIG5vdCBhIGZyYWdtZW50LCBhbmQgaGFzIGRhdGEgPj0gdGNwIGhlYWRlciBsZW5ndGguICBTWU4KKwkgICBwYWNrZXRzIHNob3VsZCBub3QgY29udGFpbiBkYXRhOiBpZiB0aGV5IGRpZCwgdGhlbiB3ZSByaXNrCisJICAgcnVubmluZyBvdmVyIE1UVSwgc2VuZGluZyBGcmFnIE5lZWRlZCBhbmQgYnJlYWtpbmcgdGhpbmdzCisJICAgYmFkbHkuIC0tUlIgKi8KKwlpZiAodGNwbGVuICE9IHRjcGgtPmRvZmYqNCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgImlwdF90Y3Btc3NfdGFyZ2V0OiBiYWQgbGVuZ3RoICglZCBieXRlcylcbiIsCisJCQkgICAgICAgKCpwc2tiKS0+bGVuKTsKKwkJcmV0dXJuIE5GX0RST1A7CisJfQorCisJaWYodGNwbXNzaW5mby0+bXNzID09IElQVF9UQ1BNU1NfQ0xBTVBfUE1UVSkgeworCQlpZighKCpwc2tiKS0+ZHN0KSB7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgIAkJImlwdF90Y3Btc3NfdGFyZ2V0OiBubyBkc3Q/ISBjYW4ndCBkZXRlcm1pbmUgcGF0aC1NVFVcbiIpOworCQkJcmV0dXJuIE5GX0RST1A7IC8qIG9yIElQVF9DT05USU5VRSA/PyAqLworCQl9CisKKwkJaWYoZHN0X210dSgoKnBza2IpLT5kc3QpIDw9IChzaXplb2Yoc3RydWN0IGlwaGRyKSArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSkpIHsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAJCQkiaXB0X3RjcG1zc190YXJnZXQ6IHVua25vd24gb3IgaW52YWxpZCBwYXRoLU1UVSAoJWQpXG4iLCBkc3RfbXR1KCgqcHNrYiktPmRzdCkpOworCQkJcmV0dXJuIE5GX0RST1A7IC8qIG9yIElQVF9DT05USU5VRSA/PyAqLworCQl9CisKKwkJbmV3bXNzID0gZHN0X210dSgoKnBza2IpLT5kc3QpIC0gc2l6ZW9mKHN0cnVjdCBpcGhkcikgLSBzaXplb2Yoc3RydWN0IHRjcGhkcik7CisJfSBlbHNlCisJCW5ld21zcyA9IHRjcG1zc2luZm8tPm1zczsKKworIAlvcHQgPSAodV9pbnQ4X3QgKil0Y3BoOworCWZvciAoaSA9IHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsgaSA8IHRjcGgtPmRvZmYqNDsgaSArPSBvcHRsZW4ob3B0LCBpKSl7CisJCWlmICgob3B0W2ldID09IFRDUE9QVF9NU1MpICYmCisJCSAgICAoKHRjcGgtPmRvZmYqNCAtIGkpID49IFRDUE9MRU5fTVNTKSAmJgorCQkgICAgKG9wdFtpKzFdID09IFRDUE9MRU5fTVNTKSkgeworCQkJdV9pbnQxNl90IG9sZG1zczsKKworCQkJb2xkbXNzID0gKG9wdFtpKzJdIDw8IDgpIHwgb3B0W2krM107CisKKwkJCWlmKCh0Y3Btc3NpbmZvLT5tc3MgPT0gSVBUX1RDUE1TU19DTEFNUF9QTVRVKSAmJgorCQkJCShvbGRtc3MgPD0gbmV3bXNzKSkKKwkJCQkJcmV0dXJuIElQVF9DT05USU5VRTsKKworCQkJb3B0W2krMl0gPSAobmV3bXNzICYgMHhmZjAwKSA+PiA4OworCQkJb3B0W2krM10gPSAobmV3bXNzICYgMHgwMGZmKTsKKworCQkJdGNwaC0+Y2hlY2sgPSBjaGVhdF9jaGVjayhodG9ucyhvbGRtc3MpXjB4RkZGRiwKKwkJCQkJCSAgaHRvbnMobmV3bXNzKSwKKwkJCQkJCSAgdGNwaC0+Y2hlY2spOworCisJCQlERUJVR1AoS0VSTl9JTkZPICJpcHRfdGNwbXNzX3RhcmdldDogJXUuJXUuJXUuJXU6JWh1IgorCQkJICAgICAgICItPiV1LiV1LiV1LiV1OiVodSBjaGFuZ2VkIFRDUCBNU1Mgb3B0aW9uIgorCQkJICAgICAgICIgKGZyb20gJXUgdG8gJXUpXG4iLCAKKwkJCSAgICAgICBOSVBRVUFEKCgqcHNrYiktPm5oLmlwaC0+c2FkZHIpLAorCQkJICAgICAgIG50b2hzKHRjcGgtPnNvdXJjZSksCisJCQkgICAgICAgTklQUVVBRCgoKnBza2IpLT5uaC5pcGgtPmRhZGRyKSwKKwkJCSAgICAgICBudG9ocyh0Y3BoLT5kZXN0KSwKKwkJCSAgICAgICBvbGRtc3MsIG5ld21zcyk7CisJCQlnb3RvIHJldG1vZGlmaWVkOworCQl9CisJfQorCisJLyoKKwkgKiBNU1MgT3B0aW9uIG5vdCBmb3VuZCA/ISBhZGQgaXQuLgorCSAqLworCWlmIChza2JfdGFpbHJvb20oKCpwc2tiKSkgPCBUQ1BPTEVOX01TUykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3c2tiOworCisJCW5ld3NrYiA9IHNrYl9jb3B5X2V4cGFuZCgqcHNrYiwgc2tiX2hlYWRyb29tKCpwc2tiKSwKKwkJCQkJIFRDUE9MRU5fTVNTLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFuZXdza2IpIHsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJcHJpbnRrKEtFUk5fRVJSICJpcHRfdGNwbXNzX3RhcmdldDoiCisJCQkJICAgICAgICIgdW5hYmxlIHRvIGFsbG9jYXRlIGxhcmdlciBza2JcbiIpOworCQkJcmV0dXJuIE5GX0RST1A7CisJCX0KKworCQlrZnJlZV9za2IoKnBza2IpOworCQkqcHNrYiA9IG5ld3NrYjsKKwkJaXBoID0gKCpwc2tiKS0+bmguaXBoOworCQl0Y3BoID0gKHZvaWQgKilpcGggKyBpcGgtPmlobCo0OworCX0KKworCXNrYl9wdXQoKCpwc2tiKSwgVENQT0xFTl9NU1MpOworCisgCW9wdCA9ICh1X2ludDhfdCAqKXRjcGggKyBzaXplb2Yoc3RydWN0IHRjcGhkcik7CisJbWVtbW92ZShvcHQgKyBUQ1BPTEVOX01TUywgb3B0LCB0Y3BsZW4gLSBzaXplb2Yoc3RydWN0IHRjcGhkcikpOworCisJdGNwaC0+Y2hlY2sgPSBjaGVhdF9jaGVjayhodG9ucyh0Y3BsZW4pIF4gMHhGRkZGLAorCQkJCSAgaHRvbnModGNwbGVuICsgVENQT0xFTl9NU1MpLCB0Y3BoLT5jaGVjayk7CisJdGNwbGVuICs9IFRDUE9MRU5fTVNTOworCisJb3B0WzBdID0gVENQT1BUX01TUzsKKwlvcHRbMV0gPSBUQ1BPTEVOX01TUzsKKwlvcHRbMl0gPSAobmV3bXNzICYgMHhmZjAwKSA+PiA4OworCW9wdFszXSA9IChuZXdtc3MgJiAweDAwZmYpOworCisJdGNwaC0+Y2hlY2sgPSBjaGVhdF9jaGVjayh+MCwgKigodV9pbnQzMl90ICopb3B0KSwgdGNwaC0+Y2hlY2spOworCisJb2xkdmFsID0gKCh1X2ludDE2X3QgKil0Y3BoKVs2XTsKKwl0Y3BoLT5kb2ZmICs9IFRDUE9MRU5fTVNTLzQ7CisJdGNwaC0+Y2hlY2sgPSBjaGVhdF9jaGVjayhvbGR2YWwgXiAweEZGRkYsCisJCQkJICAoKHVfaW50MTZfdCAqKXRjcGgpWzZdLCB0Y3BoLT5jaGVjayk7CisKKwluZXd0b3RsZW4gPSBodG9ucyhudG9ocyhpcGgtPnRvdF9sZW4pICsgVENQT0xFTl9NU1MpOworCWlwaC0+Y2hlY2sgPSBjaGVhdF9jaGVjayhpcGgtPnRvdF9sZW4gXiAweEZGRkYsCisJCQkJIG5ld3RvdGxlbiwgaXBoLT5jaGVjayk7CisJaXBoLT50b3RfbGVuID0gbmV3dG90bGVuOworCisJREVCVUdQKEtFUk5fSU5GTyAiaXB0X3RjcG1zc190YXJnZXQ6ICV1LiV1LiV1LiV1OiVodSIKKwkgICAgICAgIi0+JXUuJXUuJXUuJXU6JWh1IGFkZGVkIFRDUCBNU1Mgb3B0aW9uICgldSlcbiIsCisJICAgICAgIE5JUFFVQUQoKCpwc2tiKS0+bmguaXBoLT5zYWRkciksCisJICAgICAgIG50b2hzKHRjcGgtPnNvdXJjZSksCisJICAgICAgIE5JUFFVQUQoKCpwc2tiKS0+bmguaXBoLT5kYWRkciksCisJICAgICAgIG50b2hzKHRjcGgtPmRlc3QpLAorCSAgICAgICBuZXdtc3MpOworCisgcmV0bW9kaWZpZWQ6CisJLyogV2UgbmV2ZXIgaHcgY2hlY2tzdW0gU1lOIHBhY2tldHMuICAqLworCUJVR19PTigoKnBza2IpLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpOworCisJKCpwc2tiKS0+bmZjYWNoZSB8PSBORkNfVU5LTk9XTiB8IE5GQ19BTFRFUkVEOworCXJldHVybiBJUFRfQ09OVElOVUU7Cit9CisKKyNkZWZpbmUgVEhfU1lOIDB4MDIKKworc3RhdGljIGlubGluZSBpbnQgZmluZF9zeW5fbWF0Y2goY29uc3Qgc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqbSkKK3sKKwljb25zdCBzdHJ1Y3QgaXB0X3RjcCAqdGNwaW5mbyA9IChjb25zdCBzdHJ1Y3QgaXB0X3RjcCAqKW0tPmRhdGE7CisKKwlpZiAoc3RyY21wKG0tPnUua2VybmVsLm1hdGNoLT5uYW1lLCAidGNwIikgPT0gMAorCSAgICAmJiAodGNwaW5mby0+ZmxnX2NtcCAmIFRIX1NZTikKKwkgICAgJiYgISh0Y3BpbmZvLT5pbnZmbGFncyAmIElQVF9UQ1BfSU5WX0ZMQUdTKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyogTXVzdCBzcGVjaWZ5IC1wIHRjcCAtLXN5bi8tLXRjcC1mbGFncyBTWU4gKi8KK3N0YXRpYyBpbnQKK2lwdF90Y3Btc3NfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJCSAgICAgIHZvaWQgKnRhcmdpbmZvLAorCQkgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAorCQkgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWNvbnN0IHN0cnVjdCBpcHRfdGNwbXNzX2luZm8gKnRjcG1zc2luZm8gPSB0YXJnaW5mbzsKKworCWlmICh0YXJnaW5mb3NpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3RjcG1zc19pbmZvKSkpIHsKKwkJREVCVUdQKCJpcHRfdGNwbXNzX2NoZWNrZW50cnk6IHRhcmdpbmZvc2l6ZSAldSAhPSAldVxuIiwKKwkJICAgICAgIHRhcmdpbmZvc2l6ZSwgSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3RjcG1zc19pbmZvKSkpOworCQlyZXR1cm4gMDsKKwl9CisKKworCWlmKCh0Y3Btc3NpbmZvLT5tc3MgPT0gSVBUX1RDUE1TU19DTEFNUF9QTVRVKSAmJiAKKwkJCSgoaG9va19tYXNrICYgfigoMSA8PCBORl9JUF9GT1JXQVJEKQorCQkJICAgCXwgKDEgPDwgTkZfSVBfTE9DQUxfT1VUKQorCQkJICAgCXwgKDEgPDwgTkZfSVBfUE9TVF9ST1VUSU5HKSkpICE9IDApKSB7CisJCXByaW50aygiVENQTVNTOiBwYXRoLU1UVSBjbGFtcGluZyBvbmx5IHN1cHBvcnRlZCBpbiBGT1JXQVJELCBPVVRQVVQgYW5kIFBPU1RST1VUSU5HIGhvb2tzXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGUtPmlwLnByb3RvID09IElQUFJPVE9fVENQCisJICAgICYmICEoZS0+aXAuaW52ZmxhZ3MgJiBJUFRfSU5WX1BST1RPKQorCSAgICAmJiBJUFRfTUFUQ0hfSVRFUkFURShlLCBmaW5kX3N5bl9tYXRjaCkpCisJCXJldHVybiAxOworCisJcHJpbnRrKCJUQ1BNU1M6IE9ubHkgd29ya3Mgb24gVENQIFNZTiBwYWNrZXRzXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF90Y3Btc3NfcmVnID0geworCS5uYW1lCQk9ICJUQ1BNU1MiLAorCS50YXJnZXQJCT0gaXB0X3RjcG1zc190YXJnZXQsCisJLmNoZWNrZW50cnkJPSBpcHRfdGNwbXNzX2NoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCXJldHVybiBpcHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfdGNwbXNzX3JlZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfdGNwbXNzX3JlZyk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RPUy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UT1MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWM3MGQyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UT1MuYwpAQCAtMCwwICsxLDEwNSBAQAorLyogVGhpcyBpcyBhIG1vZHVsZSB3aGljaCBpcyB1c2VkIGZvciBzZXR0aW5nIHRoZSBUT1MgZmllbGQgb2YgYSBwYWNrZXQuICovCisKKy8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKKyAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1RPUy5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBUT1MgbWFuZ2xpbmcgbW9kdWxlIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3RhcmdldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCisgICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCisgICAgICAgdm9pZCAqdXNlcmluZm8pCit7CisJY29uc3Qgc3RydWN0IGlwdF90b3NfdGFyZ2V0X2luZm8gKnRvc2luZm8gPSB0YXJnaW5mbzsKKworCWlmICgoKCpwc2tiKS0+bmguaXBoLT50b3MgJiBJUFRPU19UT1NfTUFTSykgIT0gdG9zaW5mby0+dG9zKSB7CisJCXVfaW50MTZfdCBkaWZmc1syXTsKKworCQlpZiAoIXNrYl9pcF9tYWtlX3dyaXRhYmxlKHBza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKSkKKwkJCXJldHVybiBORl9EUk9QOworCisJCWRpZmZzWzBdID0gaHRvbnMoKCpwc2tiKS0+bmguaXBoLT50b3MpIF4gMHhGRkZGOworCQkoKnBza2IpLT5uaC5pcGgtPnRvcworCQkJPSAoKCpwc2tiKS0+bmguaXBoLT50b3MgJiBJUFRPU19QUkVDX01BU0spCisJCQl8IHRvc2luZm8tPnRvczsKKwkJZGlmZnNbMV0gPSBodG9ucygoKnBza2IpLT5uaC5pcGgtPnRvcyk7CisJCSgqcHNrYiktPm5oLmlwaC0+Y2hlY2sKKwkJCT0gY3N1bV9mb2xkKGNzdW1fcGFydGlhbCgoY2hhciAqKWRpZmZzLAorCQkJCQkJIHNpemVvZihkaWZmcyksCisJCQkJCQkgKCpwc2tiKS0+bmguaXBoLT5jaGVjaworCQkJCQkJIF4weEZGRkYpKTsKKwkJKCpwc2tiKS0+bmZjYWNoZSB8PSBORkNfQUxURVJFRDsKKwl9CisJcmV0dXJuIElQVF9DT05USU5VRTsKK30KKworc3RhdGljIGludAorY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKyAgICAgICAgICAgdm9pZCAqdGFyZ2luZm8sCisgICAgICAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCisgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3QgdV9pbnQ4X3QgdG9zID0gKChzdHJ1Y3QgaXB0X3Rvc190YXJnZXRfaW5mbyAqKXRhcmdpbmZvKS0+dG9zOworCisJaWYgKHRhcmdpbmZvc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfdG9zX3RhcmdldF9pbmZvKSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVE9TOiB0YXJnaW5mb3NpemUgJXUgIT0gJVp1XG4iLAorCQkgICAgICAgdGFyZ2luZm9zaXplLAorCQkgICAgICAgSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3Rvc190YXJnZXRfaW5mbykpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0cmNtcCh0YWJsZW5hbWUsICJtYW5nbGUiKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlRPUzogY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gXCJtYW5nbGVcIiB0YWJsZSwgbm90IFwiJXNcIlxuIiwgdGFibGVuYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHRvcyAhPSBJUFRPU19MT1dERUxBWQorCSAgICAmJiB0b3MgIT0gSVBUT1NfVEhST1VHSFBVVAorCSAgICAmJiB0b3MgIT0gSVBUT1NfUkVMSUFCSUxJVFkKKwkgICAgJiYgdG9zICE9IElQVE9TX01JTkNPU1QKKwkgICAgJiYgdG9zICE9IElQVE9TX05PUk1BTFNWQykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJUT1M6IGJhZCB0b3MgdmFsdWUgJSN4XG4iLCB0b3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF90b3NfcmVnID0geworCS5uYW1lCQk9ICJUT1MiLAorCS50YXJnZXQJCT0gdGFyZ2V0LAorCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJcmV0dXJuIGlwdF9yZWdpc3Rlcl90YXJnZXQoJmlwdF90b3NfcmVnKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlpcHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF90b3NfcmVnKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVUxPRy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9VTE9HLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYyY2VmYgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVUxPRy5jCkBAIC0wLDAgKzEsNDE5IEBACisvKgorICogbmV0ZmlsdGVyIG1vZHVsZSBmb3IgdXNlcnNwYWNlIHBhY2tldCBsb2dnaW5nIGRhZW1vbnMKKyAqCisgKiAoQykgMjAwMC0yMDA0IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIDIwMDAvMDkvMjIgdWxvZy1jcHJhbmdlIGZlYXR1cmUgYWRkZWQKKyAqIDIwMDEvMDEvMDQgaW4ta2VybmVsIHF1ZXVlIGFzIHByb3Bvc2VkIGJ5IFNlYmFzdGlhbiBaYW5kZXIgCisgKiAJCQkJCQk8emFuZGVyQGZva3VzLmdtZC5kZT4KKyAqIDIwMDEvMDEvMzAgcGVyLXJ1bGUgbmxncm91cCBjb25mbGljdHMgd2l0aCBnbG9iYWwgcXVldWUuIAorICogICAgICAgICAgICBubGdyb3VwIG5vdyBnbG9iYWwgKHN5c2N0bCkKKyAqIDIwMDEvMDQvMTkgdWxvZy1xdWV1ZSByZXdvcmtlZCwgbm93IGZpeGVkIGJ1ZmZlciBzaXplIHNwZWNpZmllZCBhdAorICogCSAgICAgIG1vZHVsZSBsb2FkdGltZSAtSFcKKyAqIDIwMDIvMDcvMDcgcmVtb3ZlIGJyb2tlbiBuZmxvZ19yY3YoKSBmdW5jdGlvbiAtSFcKKyAqIDIwMDIvMDgvMjkgZml4IHNoaWZ0ZWQvdW5zaGlmdGVkIG5sZ3JvdXAgYnVnIC1IVworICogMjAwMi8xMC8zMCBmaXggdW5pbml0aWFsaXplZCBtYWNfbGVuIGZpZWxkIC0gPEFuZGVycyBLLiBQZWRlcnNlbj4KKyAqIDIwMDQvMTAvMjUgZml4IGVycm9uZW91cyBjYWxjdWxhdGlvbiBvZiAnbGVuJyBwYXJhbWV0ZXIgdG8gTkxNU0dfUFVUCisgKgkgICAgICByZXN1bHRpbmcgaW4gYm9ndXMgJ2Vycm9yIGR1cmluZyBOTE1TR19QVVQnIG1lc3NhZ2VzLgorICoKKyAqIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKKyAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgbW9kdWxlIGFjY2VwdHMgdHdvIHBhcmFtZXRlcnM6IAorICogCisgKiBubGJ1ZnNpejoKKyAqICAgVGhlIHBhcmFtZXRlciBzcGVjaWZpZXMgaG93IGJpZyB0aGUgYnVmZmVyIGZvciBlYWNoIG5ldGxpbmsgbXVsdGljYXN0CisgKiBncm91cCBpcy4gZS5nLiBJZiB5b3Ugc2F5IG5sYnVmc2l6PTgxOTIsIHVwIHRvIGVpZ2h0IGtiIG9mIHBhY2tldHMgd2lsbAorICogZ2V0IGFjY3VtdWxhdGVkIGluIHRoZSBrZXJuZWwgdW50aWwgdGhleSBhcmUgc2VudCB0byB1c2Vyc3BhY2UuIEl0IGlzCisgKiBOT1QgcG9zc2libGUgdG8gYWxsb2NhdGUgbW9yZSB0aGFuIDEyOGtCLCBhbmQgaXQgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQsCisgKiBiZWNhdXNlIGF0b21pY2FsbHkgYWxsb2NhdGluZyAxMjhrQiBpbnNpZGUgdGhlIG5ldHdvcmsgcnggc29mdGlycSBpcyBub3QKKyAqIHJlbGlhYmxlLiBQbGVhc2UgYWxzbyBrZWVwIGluIG1pbmQgdGhhdCB0aGlzIGJ1ZmZlciBzaXplIGlzIGFsbG9jYXRlZCBmb3IKKyAqIGVhY2ggbmxncm91cCB5b3UgYXJlIHVzaW5nLCBzbyB0aGUgdG90YWwga2VybmVsIG1lbW9yeSB1c2FnZSBpbmNyZWFzZXMKKyAqIGJ5IHRoYXQgZmFjdG9yLgorICoKKyAqIGZsdXNodGltZW91dDoKKyAqICAgU3BlY2lmeSwgYWZ0ZXIgaG93IG1hbnkgaHVuZHJlZHRocyBvZiBhIHNlY29uZCB0aGUgcXVldWUgc2hvdWxkIGJlCisgKiAgIGZsdXNoZWQgZXZlbiBpZiBpdCBpcyBub3QgZnVsbCB5ZXQuCisgKgorICogaXB0X1VMT0cuYyx2IDEuMjIgMjAwMi8xMC8zMCAwOTowNzozMSBsYWZvcmdlIEV4cAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfVUxPRy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2xvY2toZWxwLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgdXNlcnNwYWNlIGxvZ2dpbmcgbW9kdWxlIik7CisKKyNkZWZpbmUgVUxPR19OTF9FVkVOVAkJMTExCQkvKiBIYXJhbGQncyBmYXZvcml0ZSBudW1iZXIgKi8KKyNkZWZpbmUgVUxPR19NQVhOTEdST1VQUwkzMgkJLyogbnVtZXIgb2Ygbmxncm91cHMgKi8KKworI2lmIDAKKyNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKCIlczolczoiIGZvcm1hdCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GSUxFX18sIF9fRlVOQ1RJT05fXyAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgUFJJTlRSKGZvcm1hdCwgYXJncy4uLikgZG8geyBpZiAobmV0X3JhdGVsaW1pdCgpKSBwcmludGsoZm9ybWF0ICwgIyMgYXJncyk7IH0gd2hpbGUgKDApCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmxidWZzaXogPSA0MDk2OworbW9kdWxlX3BhcmFtKG5sYnVmc2l6LCB1aW50LCAwNjAwKTsgLyogRklYTUU6IENoZWNrIHNpemUgPCAxMjhrIC0tUlIgKi8KK01PRFVMRV9QQVJNX0RFU0MobmxidWZzaXosICJuZXRsaW5rIGJ1ZmZlciBzaXplIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZmx1c2h0aW1lb3V0ID0gMTA7Cittb2R1bGVfcGFyYW0oZmx1c2h0aW1lb3V0LCBpbnQsIDA2MDApOworTU9EVUxFX1BBUk1fREVTQyhmbHVzaHRpbWVvdXQsICJidWZmZXIgZmx1c2ggdGltZW91dCAoaHVuZHJlZHRocyBvZiBhIHNlY29uZCkiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBuZmxvZyA9IDE7Cittb2R1bGVfcGFyYW0obmZsb2csIGludCwgMDQwMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5mbG9nLCAicmVnaXN0ZXIgYXMgaW50ZXJuYWwgbmV0ZmlsdGVyIGxvZ2dpbmcgbW9kdWxlIik7CisKKy8qIGdsb2JhbCBkYXRhIHN0cnVjdHVyZXMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBxbGVuOwkJLyogbnVtYmVyIG9mIG5sbXNncycgaW4gdGhlIHNrYiAqLworCXN0cnVjdCBubG1zZ2hkciAqbGFzdG5saDsJLyogbmV0bGluayBoZWFkZXIgb2YgbGFzdCBtc2cgaW4gc2tiICovCisJc3RydWN0IHNrX2J1ZmYgKnNrYjsJCS8qIHRoZSBwcmUtYWxsb2NhdGVkIHNrYiAqLworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwkvKiB0aGUgdGltZXIgZnVuY3Rpb24gKi8KK30gdWxvZ19idWZmX3Q7CisKK3N0YXRpYyB1bG9nX2J1ZmZfdCB1bG9nX2J1ZmZlcnNbVUxPR19NQVhOTEdST1VQU107CS8qIGFycmF5IG9mIGJ1ZmZlcnMgKi8KKworc3RhdGljIHN0cnVjdCBzb2NrICpuZmxvZ25sOwkvKiBvdXIgc29ja2V0ICovCitzdGF0aWMgREVDTEFSRV9MT0NLKHVsb2dfbG9jayk7CS8qIHNwaW5sb2NrICovCisKKy8qIHNlbmQgb25lIHVsb2dfYnVmZl90IHRvIHVzZXJzcGFjZSAqLworc3RhdGljIHZvaWQgdWxvZ19zZW5kKHVuc2lnbmVkIGludCBubGdyb3VwbnVtKQoreworCXVsb2dfYnVmZl90ICp1YiA9ICZ1bG9nX2J1ZmZlcnNbbmxncm91cG51bV07CisKKwlpZiAodGltZXJfcGVuZGluZygmdWItPnRpbWVyKSkgeworCQlERUJVR1AoImlwdF9VTE9HOiB1bG9nX3NlbmQ6IHRpbWVyIHdhcyBwZW5kaW5nLCBkZWxldGluZ1xuIik7CisJCWRlbF90aW1lcigmdWItPnRpbWVyKTsKKwl9CisKKwkvKiBsYXN0IG5sbXNnIG5lZWRzIE5MTVNHX0RPTkUgKi8KKwlpZiAodWItPnFsZW4gPiAxKQorCQl1Yi0+bGFzdG5saC0+bmxtc2dfdHlwZSA9IE5MTVNHX0RPTkU7CisKKwlORVRMSU5LX0NCKHViLT5za2IpLmRzdF9ncm91cHMgPSAoMSA8PCBubGdyb3VwbnVtKTsKKwlERUJVR1AoImlwdF9VTE9HOiB0aHJvd2luZyAlZCBwYWNrZXRzIHRvIG5ldGxpbmsgbWFzayAldVxuIiwKKwkJdWItPnFsZW4sIG5sZ3JvdXBudW0pOworCW5ldGxpbmtfYnJvYWRjYXN0KG5mbG9nbmwsIHViLT5za2IsIDAsICgxIDw8IG5sZ3JvdXBudW0pLCBHRlBfQVRPTUlDKTsKKworCXViLT5xbGVuID0gMDsKKwl1Yi0+c2tiID0gTlVMTDsKKwl1Yi0+bGFzdG5saCA9IE5VTEw7CisKK30KKworCisvKiB0aW1lciBmdW5jdGlvbiB0byBmbHVzaCBxdWV1ZSBpbiBmbHVzaHRpbWVvdXQgdGltZSAqLworc3RhdGljIHZvaWQgdWxvZ190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJREVCVUdQKCJpcHRfVUxPRzogdGltZXIgZnVuY3Rpb24gY2FsbGVkLCBjYWxsaW5nIHVsb2dfc2VuZFxuIik7CisKKwkvKiBsb2NrIHRvIHByb3RlY3QgYWdhaW5zdCBzb21lYm9keSBtb2RpZnlpbmcgb3VyIHN0cnVjdHVyZQorCSAqIGZyb20gaXB0X3Vsb2dfdGFyZ2V0IGF0IHRoZSBzYW1lIHRpbWUgKi8KKwlMT0NLX0JIKCZ1bG9nX2xvY2spOworCXVsb2dfc2VuZChkYXRhKTsKKwlVTkxPQ0tfQkgoJnVsb2dfbG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqdWxvZ19hbGxvY19za2IodW5zaWduZWQgaW50IHNpemUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCS8qIGFsbG9jIHNrYiB3aGljaCBzaG91bGQgYmUgYmlnIGVub3VnaCBmb3IgYSB3aG9sZQorCSAqIG11bHRpcGFydCBtZXNzYWdlLiBXQVJOSU5HOiBoYXMgdG8gYmUgPD0gMTMxMDAwCisJICogZHVlIHRvIHNsYWIgYWxsb2NhdG9yIHJlc3RyaWN0aW9ucyAqLworCisJc2tiID0gYWxsb2Nfc2tiKG5sYnVmc2l6LCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikgeworCQlQUklOVFIoImlwdF9VTE9HOiBjYW4ndCBhbGxvYyB3aG9sZSBidWZmZXIgJXViIVxuIiwKKwkJCW5sYnVmc2l6KTsKKworCQkvKiB0cnkgdG8gYWxsb2NhdGUgb25seSBhcyBtdWNoIGFzIHdlIG5lZWQgZm9yIAorCQkgKiBjdXJyZW50IHBhY2tldCAqLworCisJCXNrYiA9IGFsbG9jX3NrYihzaXplLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFza2IpCisJCQlQUklOVFIoImlwdF9VTE9HOiBjYW4ndCBldmVuIGFsbG9jYXRlICV1YlxuIiwgc2l6ZSk7CisJfQorCisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIHZvaWQgaXB0X3Vsb2dfcGFja2V0KHVuc2lnbmVkIGludCBob29rbnVtLAorCQkJICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQkgICAgY29uc3Qgc3RydWN0IGlwdF91bG9nX2luZm8gKmxvZ2luZm8sCisJCQkgICAgY29uc3QgY2hhciAqcHJlZml4KQoreworCXVsb2dfYnVmZl90ICp1YjsKKwl1bG9nX3BhY2tldF9tc2dfdCAqcG07CisJc2l6ZV90IHNpemUsIGNvcHlfbGVuOworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCisJLyogZmZzID09IGZpbmQgZmlyc3QgYml0IHNldCwgbmVjZXNzYXJ5IGJlY2F1c2UgdXNlcnNwYWNlCisJICogaXMgYWxyZWFkeSBzaGlmdGluZyBncm91cG51bWJlciwgYnV0IHdlIG5lZWQgdW5zaGlmdGVkLgorCSAqIGZmcygpIHJldHVybnMgWzEuLjMyXSwgd2UgbmVlZCBbMC4uMzFdICovCisJdW5zaWduZWQgaW50IGdyb3VwbnVtID0gZmZzKGxvZ2luZm8tPm5sX2dyb3VwKSAtIDE7CisKKwkvKiBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHNrYiBuZWVkZWQgKi8KKwlpZiAoKGxvZ2luZm8tPmNvcHlfcmFuZ2UgPT0gMCkgfHwKKwkgICAgKGxvZ2luZm8tPmNvcHlfcmFuZ2UgPiBza2ItPmxlbikpIHsKKwkJY29weV9sZW4gPSBza2ItPmxlbjsKKwl9IGVsc2UgeworCQljb3B5X2xlbiA9IGxvZ2luZm8tPmNvcHlfcmFuZ2U7CisJfQorCisJc2l6ZSA9IE5MTVNHX1NQQUNFKHNpemVvZigqcG0pICsgY29weV9sZW4pOworCisJdWIgPSAmdWxvZ19idWZmZXJzW2dyb3VwbnVtXTsKKwkKKwlMT0NLX0JIKCZ1bG9nX2xvY2spOworCisJaWYgKCF1Yi0+c2tiKSB7CisJCWlmICghKHViLT5za2IgPSB1bG9nX2FsbG9jX3NrYihzaXplKSkpCisJCQlnb3RvIGFsbG9jX2ZhaWx1cmU7CisJfSBlbHNlIGlmICh1Yi0+cWxlbiA+PSBsb2dpbmZvLT5xdGhyZXNob2xkIHx8CisJCSAgIHNpemUgPiBza2JfdGFpbHJvb20odWItPnNrYikpIHsKKwkJLyogZWl0aGVyIHRoZSBxdWV1ZSBsZW4gaXMgdG9vIGhpZ2ggb3Igd2UgZG9uJ3QgaGF2ZSAKKwkJICogZW5vdWdoIHJvb20gaW4gbmxza2IgbGVmdC4gc2VuZCBpdCB0byB1c2Vyc3BhY2UuICovCisKKwkJdWxvZ19zZW5kKGdyb3VwbnVtKTsKKworCQlpZiAoISh1Yi0+c2tiID0gdWxvZ19hbGxvY19za2Ioc2l6ZSkpKQorCQkJZ290byBhbGxvY19mYWlsdXJlOworCX0KKworCURFQlVHUCgiaXB0X1VMT0c6IHFsZW4gJWQsIHF0aHJlc2hvbGQgJWRcbiIsIHViLT5xbGVuLCAKKwkJbG9naW5mby0+cXRocmVzaG9sZCk7CisKKwkvKiBOTE1TR19QVVQgY29udGFpbnMgYSBoaWRkZW4gZ290byBubG1zZ19mYWlsdXJlICEhISAqLworCW5saCA9IE5MTVNHX1BVVCh1Yi0+c2tiLCAwLCB1Yi0+cWxlbiwgVUxPR19OTF9FVkVOVCwgCisJCQlzaXplb2YoKnBtKStjb3B5X2xlbik7CisJdWItPnFsZW4rKzsKKworCXBtID0gTkxNU0dfREFUQShubGgpOworCisJLyogV2UgbWlnaHQgbm90IGhhdmUgYSB0aW1lc3RhbXAsIGdldCBvbmUgKi8KKwlpZiAoc2tiLT5zdGFtcC50dl9zZWMgPT0gMCkKKwkJZG9fZ2V0dGltZW9mZGF5KChzdHJ1Y3QgdGltZXZhbCAqKSZza2ItPnN0YW1wKTsKKworCS8qIGNvcHkgaG9vaywgcHJlZml4LCB0aW1lc3RhbXAsIHBheWxvYWQsIGV0Yy4gKi8KKwlwbS0+ZGF0YV9sZW4gPSBjb3B5X2xlbjsKKwlwbS0+dGltZXN0YW1wX3NlYyA9IHNrYi0+c3RhbXAudHZfc2VjOworCXBtLT50aW1lc3RhbXBfdXNlYyA9IHNrYi0+c3RhbXAudHZfdXNlYzsKKwlwbS0+bWFyayA9IHNrYi0+bmZtYXJrOworCXBtLT5ob29rID0gaG9va251bTsKKwlpZiAocHJlZml4ICE9IE5VTEwpCisJCXN0cm5jcHkocG0tPnByZWZpeCwgcHJlZml4LCBzaXplb2YocG0tPnByZWZpeCkpOworCWVsc2UgaWYgKGxvZ2luZm8tPnByZWZpeFswXSAhPSAnXDAnKQorCQlzdHJuY3B5KHBtLT5wcmVmaXgsIGxvZ2luZm8tPnByZWZpeCwgc2l6ZW9mKHBtLT5wcmVmaXgpKTsKKwllbHNlCisJCSoocG0tPnByZWZpeCkgPSAnXDAnOworCisJaWYgKGluICYmIGluLT5oYXJkX2hlYWRlcl9sZW4gPiAwCisJICAgICYmIHNrYi0+bWFjLnJhdyAhPSAodm9pZCAqKSBza2ItPm5oLmlwaAorCSAgICAmJiBpbi0+aGFyZF9oZWFkZXJfbGVuIDw9IFVMT0dfTUFDX0xFTikgeworCQltZW1jcHkocG0tPm1hYywgc2tiLT5tYWMucmF3LCBpbi0+aGFyZF9oZWFkZXJfbGVuKTsKKwkJcG0tPm1hY19sZW4gPSBpbi0+aGFyZF9oZWFkZXJfbGVuOworCX0gZWxzZQorCQlwbS0+bWFjX2xlbiA9IDA7CisKKwlpZiAoaW4pCisJCXN0cm5jcHkocG0tPmluZGV2X25hbWUsIGluLT5uYW1lLCBzaXplb2YocG0tPmluZGV2X25hbWUpKTsKKwllbHNlCisJCXBtLT5pbmRldl9uYW1lWzBdID0gJ1wwJzsKKworCWlmIChvdXQpCisJCXN0cm5jcHkocG0tPm91dGRldl9uYW1lLCBvdXQtPm5hbWUsIHNpemVvZihwbS0+b3V0ZGV2X25hbWUpKTsKKwllbHNlCisJCXBtLT5vdXRkZXZfbmFtZVswXSA9ICdcMCc7CisKKwkvKiBjb3B5X2xlbiA8PSBza2ItPmxlbiwgc28gY2FuJ3QgZmFpbC4gKi8KKwlpZiAoc2tiX2NvcHlfYml0cyhza2IsIDAsIHBtLT5wYXlsb2FkLCBjb3B5X2xlbikgPCAwKQorCQlCVUcoKTsKKwkKKwkvKiBjaGVjayBpZiB3ZSBhcmUgYnVpbGRpbmcgbXVsdGktcGFydCBtZXNzYWdlcyAqLworCWlmICh1Yi0+cWxlbiA+IDEpIHsKKwkJdWItPmxhc3RubGgtPm5sbXNnX2ZsYWdzIHw9IE5MTV9GX01VTFRJOworCX0KKworCXViLT5sYXN0bmxoID0gbmxoOworCisJLyogaWYgdGltZXIgaXNuJ3QgYWxyZWFkeSBydW5uaW5nLCBzdGFydCBpdCAqLworCWlmICghdGltZXJfcGVuZGluZygmdWItPnRpbWVyKSkgeworCQl1Yi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBmbHVzaHRpbWVvdXQgKiBIWiAvIDEwMDsKKwkJYWRkX3RpbWVyKCZ1Yi0+dGltZXIpOworCX0KKworCS8qIGlmIHRocmVzaG9sZCBpcyByZWFjaGVkLCBzZW5kIG1lc3NhZ2UgdG8gdXNlcnNwYWNlICovCisJaWYgKHViLT5xbGVuID49IGxvZ2luZm8tPnF0aHJlc2hvbGQpIHsKKwkJaWYgKGxvZ2luZm8tPnF0aHJlc2hvbGQgPiAxKQorCQkJbmxoLT5ubG1zZ190eXBlID0gTkxNU0dfRE9ORTsKKwkJdWxvZ19zZW5kKGdyb3VwbnVtKTsKKwl9CisKKwlVTkxPQ0tfQkgoJnVsb2dfbG9jayk7CisKKwlyZXR1cm47CisKK25sbXNnX2ZhaWx1cmU6CisJUFJJTlRSKCJpcHRfVUxPRzogZXJyb3IgZHVyaW5nIE5MTVNHX1BVVFxuIik7CisKK2FsbG9jX2ZhaWx1cmU6CisJUFJJTlRSKCJpcHRfVUxPRzogRXJyb3IgYnVpbGRpbmcgbmV0bGluayBtZXNzYWdlXG4iKTsKKworCVVOTE9DS19CSCgmdWxvZ19sb2NrKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBpcHRfdWxvZ190YXJnZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQkJICAgIHVuc2lnbmVkIGludCBob29rbnVtLAorCQkJCSAgICBjb25zdCB2b2lkICp0YXJnaW5mbywgdm9pZCAqdXNlcmluZm8pCit7CisJc3RydWN0IGlwdF91bG9nX2luZm8gKmxvZ2luZm8gPSAoc3RydWN0IGlwdF91bG9nX2luZm8gKikgdGFyZ2luZm87CisKKwlpcHRfdWxvZ19wYWNrZXQoaG9va251bSwgKnBza2IsIGluLCBvdXQsIGxvZ2luZm8sIE5VTEwpOworIAorIAlyZXR1cm4gSVBUX0NPTlRJTlVFOworfQorIAorc3RhdGljIHZvaWQgaXB0X2xvZ2ZuKHVuc2lnbmVkIGludCBob29rbnVtLAorCQkgICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCSAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgaXB0X3Vsb2dfaW5mbyBsb2dpbmZvID0geyAKKwkJLm5sX2dyb3VwID0gVUxPR19ERUZBVUxUX05MR1JPVVAsCisJCS5jb3B5X3JhbmdlID0gMCwKKwkJLnF0aHJlc2hvbGQgPSBVTE9HX0RFRkFVTFRfUVRIUkVTSE9MRCwKKwkJLnByZWZpeCA9ICIiCisJfTsKKworCWlwdF91bG9nX3BhY2tldChob29rbnVtLCBza2IsIGluLCBvdXQsICZsb2dpbmZvLCBwcmVmaXgpOworfQorCitzdGF0aWMgaW50IGlwdF91bG9nX2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJCQkgICAgICAgdm9pZCAqdGFyZ2luZm8sCisJCQkgICAgICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va21hc2spCit7CisJc3RydWN0IGlwdF91bG9nX2luZm8gKmxvZ2luZm8gPSAoc3RydWN0IGlwdF91bG9nX2luZm8gKikgdGFyZ2luZm87CisKKwlpZiAodGFyZ2luZm9zaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF91bG9nX2luZm8pKSkgeworCQlERUJVR1AoImlwdF9VTE9HOiB0YXJnaW5mb3NpemUgJXUgIT0gMFxuIiwgdGFyZ2luZm9zaXplKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGxvZ2luZm8tPnByZWZpeFtzaXplb2YobG9naW5mby0+cHJlZml4KSAtIDFdICE9ICdcMCcpIHsKKwkJREVCVUdQKCJpcHRfVUxPRzogcHJlZml4IHRlcm0gJWlcbiIsCisJCSAgICAgICBsb2dpbmZvLT5wcmVmaXhbc2l6ZW9mKGxvZ2luZm8tPnByZWZpeCkgLSAxXSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChsb2dpbmZvLT5xdGhyZXNob2xkID4gVUxPR19NQVhfUUxFTikgeworCQlERUJVR1AoImlwdF9VTE9HOiBxdWV1ZSB0aHJlc2hvbGQgJWkgPiBNQVhfUUxFTlxuIiwKKwkJCWxvZ2luZm8tPnF0aHJlc2hvbGQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF91bG9nX3JlZyA9IHsKKwkubmFtZQkJPSAiVUxPRyIsCisJLnRhcmdldAkJPSBpcHRfdWxvZ190YXJnZXQsCisJLmNoZWNrZW50cnkJPSBpcHRfdWxvZ19jaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCURFQlVHUCgiaXB0X1VMT0c6IGluaXQgbW9kdWxlXG4iKTsKKworCWlmIChubGJ1ZnNpeiA+PSAxMjgqMTAyNCkgeworCQlwcmludGsoIk5ldGxpbmsgYnVmZmVyIGhhcyB0byBiZSA8PSAxMjhrQlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGluaXRpYWxpemUgdWxvZ19idWZmZXJzICovCisJZm9yIChpID0gMDsgaSA8IFVMT0dfTUFYTkxHUk9VUFM7IGkrKykgeworCQlpbml0X3RpbWVyKCZ1bG9nX2J1ZmZlcnNbaV0udGltZXIpOworCQl1bG9nX2J1ZmZlcnNbaV0udGltZXIuZnVuY3Rpb24gPSB1bG9nX3RpbWVyOworCQl1bG9nX2J1ZmZlcnNbaV0udGltZXIuZGF0YSA9IGk7CisJfQorCisJbmZsb2dubCA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShORVRMSU5LX05GTE9HLCBOVUxMKTsKKwlpZiAoIW5mbG9nbmwpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGlwdF9yZWdpc3Rlcl90YXJnZXQoJmlwdF91bG9nX3JlZykgIT0gMCkgeworCQlzb2NrX3JlbGVhc2UobmZsb2dubC0+c2tfc29ja2V0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChuZmxvZykKKwkJbmZfbG9nX3JlZ2lzdGVyKFBGX0lORVQsICZpcHRfbG9nZm4pOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCXVsb2dfYnVmZl90ICp1YjsKKwlpbnQgaTsKKworCURFQlVHUCgiaXB0X1VMT0c6IGNsZWFudXBfbW9kdWxlXG4iKTsKKworCWlmIChuZmxvZykKKwkJbmZfbG9nX3VucmVnaXN0ZXIoUEZfSU5FVCwgJmlwdF9sb2dmbik7CisJaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfdWxvZ19yZWcpOworCXNvY2tfcmVsZWFzZShuZmxvZ25sLT5za19zb2NrZXQpOworCisJLyogcmVtb3ZlIHBlbmRpbmcgdGltZXJzIGFuZCBmcmVlIGFsbG9jYXRlZCBza2IncyAqLworCWZvciAoaSA9IDA7IGkgPCBVTE9HX01BWE5MR1JPVVBTOyBpKyspIHsKKwkJdWIgPSAmdWxvZ19idWZmZXJzW2ldOworCQlpZiAodGltZXJfcGVuZGluZygmdWItPnRpbWVyKSkgeworCQkJREVCVUdQKCJ0aW1lciB3YXMgcGVuZGluZywgZGVsZXRpbmdcbiIpOworCQkJZGVsX3RpbWVyKCZ1Yi0+dGltZXIpOworCQl9CisKKwkJaWYgKHViLT5za2IpIHsKKwkJCWtmcmVlX3NrYih1Yi0+c2tiKTsKKwkJCXViLT5za2IgPSBOVUxMOworCQl9CisJfQorCit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2FkZHJ0eXBlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2FkZHJ0eXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU5MDlhNAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfYWRkcnR5cGUuYwpAQCAtMCwwICsxLDc3IEBACisvKgorICogIGlwdGFibGVzIG1vZHVsZSB0byBtYXRjaCBpbmV0X2FkZHJfdHlwZSgpIG9mIGFuIGlwLgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDQgUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxuZXQvcm91dGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9hZGRydHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgYWRkcnR5cGUgbWF0Y2giKTsKKworc3RhdGljIGlubGluZSBpbnQgbWF0Y2hfdHlwZSh1X2ludDMyX3QgYWRkciwgdV9pbnQxNl90IG1hc2spCit7CisJcmV0dXJuICEhKG1hc2sgJiAoMSA8PCBpbmV0X2FkZHJfdHlwZShhZGRyKSkpOworfQorCitzdGF0aWMgaW50IG1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKwkJIGludCBvZmZzZXQsIGludCAqaG90ZHJvcCkKK3sKKwljb25zdCBzdHJ1Y3QgaXB0X2FkZHJ0eXBlX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwlpbnQgcmV0ID0gMTsKKworCWlmIChpbmZvLT5zb3VyY2UpCisJCXJldCAmPSBtYXRjaF90eXBlKGlwaC0+c2FkZHIsIGluZm8tPnNvdXJjZSleaW5mby0+aW52ZXJ0X3NvdXJjZTsKKwlpZiAoaW5mby0+ZGVzdCkKKwkJcmV0ICY9IG1hdGNoX3R5cGUoaXBoLT5kYWRkciwgaW5mby0+ZGVzdCleaW5mby0+aW52ZXJ0X2Rlc3Q7CisJCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisJCSAgICAgIHZvaWQgKm1hdGNoaW5mbywgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkJICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9hZGRydHlwZV9pbmZvKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpcHRfYWRkcnR5cGU6IGludmFsaWQgc2l6ZSAoJXUgIT0gJVp1KVxuLiIsCisJCSAgICAgICBtYXRjaHNpemUsIElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9hZGRydHlwZV9pbmZvKSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggYWRkcnR5cGVfbWF0Y2ggPSB7CisJLm5hbWUJCT0gImFkZHJ0eXBlIiwKKwkubWF0Y2gJCT0gbWF0Y2gsCisJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRQorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJmFkZHJ0eXBlX21hdGNoKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmYWRkcnR5cGVfbWF0Y2gpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9haC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9haC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZmVhODQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2FoLmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qIEtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggQUggcGFyYW1ldGVycy4gKi8KKy8qIChDKSAxOTk5LTIwMDAgWW9uIFVyaWFydGUgPHlvbkBhc3Rhcm8uZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9haC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJZb24gVXJpYXJ0ZSA8eW9uQGFzdGFyby5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgQUggU1BJIG1hdGNoIG1vZHVsZSIpOworCisjaWZkZWYgREVCVUdfQ09OTlRSQUNLCisjZGVmaW5lIGR1cHJpbnRmKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBkdXByaW50Zihmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworLyogUmV0dXJucyAxIGlmIHRoZSBzcGkgaXMgbWF0Y2hlZCBieSB0aGUgcmFuZ2UsIDAgb3RoZXJ3aXNlICovCitzdGF0aWMgaW5saW5lIGludAorc3BpX21hdGNoKHVfaW50MzJfdCBtaW4sIHVfaW50MzJfdCBtYXgsIHVfaW50MzJfdCBzcGksIGludCBpbnZlcnQpCit7CisJaW50IHI9MDsKKyAgICAgICAgZHVwcmludGYoImFoIHNwaV9tYXRjaDolYyAweCV4IDw9IDB4JXggPD0gMHgleCIsaW52ZXJ0PyAnISc6JyAnLAorICAgICAgICAJbWluLHNwaSxtYXgpOworCXI9KHNwaSA+PSBtaW4gJiYgc3BpIDw9IG1heCkgXiBpbnZlcnQ7CisJZHVwcmludGYoIiByZXN1bHQgJXNcbiIscj8gIlBBU1MiIDogIkZBSUxFRCIpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50CittYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgIGludCBvZmZzZXQsCisgICAgICBpbnQgKmhvdGRyb3ApCit7CisJc3RydWN0IGlwX2F1dGhfaGRyIF9haGRyLCAqYWg7CisJY29uc3Qgc3RydWN0IGlwdF9haCAqYWhpbmZvID0gbWF0Y2hpbmZvOworCisJLyogTXVzdCBub3QgYmUgYSBmcmFnbWVudC4gKi8KKwlpZiAob2Zmc2V0KQorCQlyZXR1cm4gMDsKKworCWFoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2tiLT5uaC5pcGgtPmlobCAqIDQsCisJCQkJc2l6ZW9mKF9haGRyKSwgJl9haGRyKTsKKwlpZiAoYWggPT0gTlVMTCkgeworCQkvKiBXZSd2ZSBiZWVuIGFza2VkIHRvIGV4YW1pbmUgdGhpcyBwYWNrZXQsIGFuZCB3ZQorCQkgKiBjYW4ndC4gIEhlbmNlLCBubyBjaG9pY2UgYnV0IHRvIGRyb3AuCisJCSAqLworCQlkdXByaW50ZigiRHJvcHBpbmcgZXZpbCBBSCB0aW55Z3JhbS5cbiIpOworCQkqaG90ZHJvcCA9IDE7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBzcGlfbWF0Y2goYWhpbmZvLT5zcGlzWzBdLCBhaGluZm8tPnNwaXNbMV0sCisJCQkgbnRvaGwoYWgtPnNwaSksCisJCQkgISEoYWhpbmZvLT5pbnZmbGFncyAmIElQVF9BSF9JTlZfU1BJKSk7Cit9CisKKy8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KK3N0YXRpYyBpbnQKK2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCSAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCSAgIHZvaWQgKm1hdGNoaW5mbywKKwkgICB1bnNpZ25lZCBpbnQgbWF0Y2hpbmZvc2l6ZSwKKwkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWNvbnN0IHN0cnVjdCBpcHRfYWggKmFoaW5mbyA9IG1hdGNoaW5mbzsKKworCS8qIE11c3Qgc3BlY2lmeSBwcm90byA9PSBBSCwgYW5kIG5vIHVua25vd24gaW52ZmxhZ3MgKi8KKwlpZiAoaXAtPnByb3RvICE9IElQUFJPVE9fQUggfHwgKGlwLT5pbnZmbGFncyAmIElQVF9JTlZfUFJPVE8pKSB7CisJCWR1cHJpbnRmKCJpcHRfYWg6IFByb3RvY29sICV1ICE9ICV1XG4iLCBpcC0+cHJvdG8sCisJCQkgSVBQUk9UT19BSCk7CisJCXJldHVybiAwOworCX0KKwlpZiAobWF0Y2hpbmZvc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfYWgpKSkgeworCQlkdXByaW50ZigiaXB0X2FoOiBtYXRjaHNpemUgJXUgIT0gJXVcbiIsCisJCQkgbWF0Y2hpbmZvc2l6ZSwgSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X2FoKSkpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGFoaW5mby0+aW52ZmxhZ3MgJiB+SVBUX0FIX0lOVl9NQVNLKSB7CisJCWR1cHJpbnRmKCJpcHRfYWg6IHVua25vd24gZmxhZ3MgJVhcbiIsCisJCQkgYWhpbmZvLT5pbnZmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBhaF9tYXRjaCA9IHsKKwkubmFtZQkJPSAiYWgiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmYWhfbWF0Y2gpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cCh2b2lkKQoreworCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZhaF9tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoY2xlYW51cCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2NvbW1lbnQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfY29tbWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNzZhMWUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2NvbW1lbnQuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogSW1wbGVtZW50cyBhIGR1bW15IG1hdGNoIHRvIGFsbG93IGF0dGFjaGluZyBjb21tZW50cyB0byBydWxlcworICoKKyAqIDIwMDMtMDUtMTMgQnJhZCBGaXNoZXIgKGJyYWRAaW5mby1saW5rLm5ldCkKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2NvbW1lbnQuaD4KKworTU9EVUxFX0FVVEhPUigiQnJhZCBGaXNoZXIgPGJyYWRAaW5mby1saW5rLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgY29tbWVudCBtYXRjaCBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludAorbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisgICAgICBpbnQgb2Zmc2V0LAorICAgICAgaW50ICpob3Rkcm9wKQoreworCS8qIFdlIGFsd2F5cyBtYXRjaCAqLworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKyAgICAgICAgICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisgICAgICAgICAgIHZvaWQgKm1hdGNoaW5mbywKKyAgICAgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKyAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwkvKiBDaGVjayB0aGUgc2l6ZSAqLworCWlmIChtYXRjaHNpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X2NvbW1lbnRfaW5mbykpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggY29tbWVudF9tYXRjaCA9IHsKKwkubmFtZQkJPSAiY29tbWVudCIsCisJLm1hdGNoCQk9IG1hdGNoLAorCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZjb21tZW50X21hdGNoKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmY29tbWVudF9tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Nvbm5tYXJrLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Nvbm5tYXJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcwNmY5NgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfY29ubm1hcmsuYwpAQCAtMCwwICsxLDgxIEBACisvKiBUaGlzIGtlcm5lbCBtb2R1bGUgbWF0Y2hlcyBjb25uZWN0aW9uIG1hcmsgdmFsdWVzIHNldCBieSB0aGUKKyAqIENPTk5NQVJLIHRhcmdldAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwyMDA0IE1BUkEgU3lzdGVtcyBBQiA8aHR0cDovL3d3dy5tYXJhc3lzdGVtcy5jb20+CisgKiBieSBIZW5yaWsgTm9yZHN0cm9tIDxobm9AbWFyYXN5c3RlbXMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKK01PRFVMRV9BVVRIT1IoIkhlbnJpayBOb3Jkc3Ryb20gPGhub0BtYXJhc3l0ZW1zLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVAgdGFibGVzIGNvbm5tYXJrIG1hdGNoIG1vZHVsZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2Nvbm5tYXJrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+CisKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIGludCAqaG90ZHJvcCkKK3sKKwljb25zdCBzdHJ1Y3QgaXB0X2Nvbm5tYXJrX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CisJc3RydWN0IGlwX2Nvbm50cmFjayAqY3QgPSBpcF9jb25udHJhY2tfZ2V0KChzdHJ1Y3Qgc2tfYnVmZiAqKXNrYiwgJmN0aW5mbyk7CisJaWYgKCFjdCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKChjdC0+bWFyayAmIGluZm8tPm1hc2spID09IGluZm8tPm1hcmspIF4gaW5mby0+aW52ZXJ0OworfQorCitzdGF0aWMgaW50CitjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkgICB2b2lkICptYXRjaGluZm8sCisJICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWlmIChtYXRjaHNpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X2Nvbm5tYXJrX2luZm8pKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggY29ubm1hcmtfbWF0Y2ggPSB7CisJLm5hbWUgPSAiY29ubm1hcmsiLAorCS5tYXRjaCA9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeSA9ICZjaGVja2VudHJ5LAorCS5tZSA9IFRISVNfTU9EVUxFCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmY29ubm1hcmtfbWF0Y2gpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZjb25ubWFya19tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Nvbm50cmFjay5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9jb25udHJhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWQyMjgwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9jb25udHJhY2suYwpAQCAtMCwwICsxLDEzNiBAQAorLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBjb25uZWN0aW9uIHRyYWNraW5nIGluZm9ybWF0aW9uLgorICogU3VwZXJzZXQgb2YgUnVzdHkncyBtaW5pbWFsaXN0aWMgc3RhdGUgbWF0Y2guCisgKgorICogKEMpIDIwMDEgIE1hcmMgQm91Y2hlciAobWFyY0BtYnNpLmNhKS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfY29ubnRyYWNrLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBjb25uZWN0aW9uIHRyYWNraW5nIG1hdGNoIG1vZHVsZSIpOworCitzdGF0aWMgaW50CittYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgIGludCBvZmZzZXQsCisgICAgICBpbnQgKmhvdGRyb3ApCit7CisJY29uc3Qgc3RydWN0IGlwdF9jb25udHJhY2tfaW5mbyAqc2luZm8gPSBtYXRjaGluZm87CisJc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7CisJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CisJdW5zaWduZWQgaW50IHN0YXRlYml0OworCisJY3QgPSBpcF9jb25udHJhY2tfZ2V0KChzdHJ1Y3Qgc2tfYnVmZiAqKXNrYiwgJmN0aW5mbyk7CisKKyNkZWZpbmUgRldJTlYoYm9vbCxpbnZmbGcpICgoYm9vbCkgXiAhIShzaW5mby0+aW52ZmxhZ3MgJiBpbnZmbGcpKQorCisJaWYgKGN0ID09ICZpcF9jb25udHJhY2tfdW50cmFja2VkKQorCQlzdGF0ZWJpdCA9IElQVF9DT05OVFJBQ0tfU1RBVEVfVU5UUkFDS0VEOworCWVsc2UgaWYgKGN0KQorIAkJc3RhdGViaXQgPSBJUFRfQ09OTlRSQUNLX1NUQVRFX0JJVChjdGluZm8pOworIAllbHNlCisgCQlzdGF0ZWJpdCA9IElQVF9DT05OVFJBQ0tfU1RBVEVfSU5WQUxJRDsKKyAKKwlpZihzaW5mby0+ZmxhZ3MgJiBJUFRfQ09OTlRSQUNLX1NUQVRFKSB7CisJCWlmIChjdCkgeworCQkJaWYoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5pcCAhPQorCQkJICAgIGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5kc3QuaXApCisJCQkJc3RhdGViaXQgfD0gSVBUX0NPTk5UUkFDS19TVEFURV9TTkFUOworCisJCQlpZihjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LmlwICE9CisJCQkgICAgY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLnNyYy5pcCkKKwkJCQlzdGF0ZWJpdCB8PSBJUFRfQ09OTlRSQUNLX1NUQVRFX0ROQVQ7CisJCX0KKworCQlpZiAoRldJTlYoKHN0YXRlYml0ICYgc2luZm8tPnN0YXRlbWFzaykgPT0gMCwgSVBUX0NPTk5UUkFDS19TVEFURSkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZihzaW5mby0+ZmxhZ3MgJiBJUFRfQ09OTlRSQUNLX1BST1RPKSB7CisJCWlmICghY3QgfHwgRldJTlYoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5wcm90b251bSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX09SSUdJTkFMXS5kc3QucHJvdG9udW0sIElQVF9DT05OVFJBQ0tfUFJPVE8pKQorICAgICAgICAgICAgICAgIAlyZXR1cm4gMDsKKwl9CisKKwlpZihzaW5mby0+ZmxhZ3MgJiBJUFRfQ09OTlRSQUNLX09SSUdTUkMpIHsKKwkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5pcCZzaW5mby0+c2lwbXNrW0lQX0NUX0RJUl9PUklHSU5BTF0uc19hZGRyKSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX09SSUdJTkFMXS5zcmMuaXAsIElQVF9DT05OVFJBQ0tfT1JJR1NSQykpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZihzaW5mby0+ZmxhZ3MgJiBJUFRfQ09OTlRSQUNLX09SSUdEU1QpIHsKKwkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5pcCZzaW5mby0+ZGlwbXNrW0lQX0NUX0RJUl9PUklHSU5BTF0uc19hZGRyKSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX09SSUdJTkFMXS5kc3QuaXAsIElQVF9DT05OVFJBQ0tfT1JJR0RTVCkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZihzaW5mby0+ZmxhZ3MgJiBJUFRfQ09OTlRSQUNLX1JFUExTUkMpIHsKKwkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLnNyYy5pcCZzaW5mby0+c2lwbXNrW0lQX0NUX0RJUl9SRVBMWV0uc19hZGRyKSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX1JFUExZXS5zcmMuaXAsIElQVF9DT05OVFJBQ0tfUkVQTFNSQykpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZihzaW5mby0+ZmxhZ3MgJiBJUFRfQ09OTlRSQUNLX1JFUExEU1QpIHsKKwkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC5pcCZzaW5mby0+ZGlwbXNrW0lQX0NUX0RJUl9SRVBMWV0uc19hZGRyKSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX1JFUExZXS5kc3QuaXAsIElQVF9DT05OVFJBQ0tfUkVQTERTVCkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZihzaW5mby0+ZmxhZ3MgJiBJUFRfQ09OTlRSQUNLX1NUQVRVUykgeworCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+c3RhdHVzICYgc2luZm8tPnN0YXR1c21hc2spID09IDAsIElQVF9DT05OVFJBQ0tfU1RBVFVTKSkKKwkJCXJldHVybiAwOworCX0KKworCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfRVhQSVJFUykgeworCQl1bnNpZ25lZCBsb25nIGV4cGlyZXM7CisKKwkJaWYoIWN0KQorCQkJcmV0dXJuIDA7CisKKwkJZXhwaXJlcyA9IHRpbWVyX3BlbmRpbmcoJmN0LT50aW1lb3V0KSA/IChjdC0+dGltZW91dC5leHBpcmVzIC0gamlmZmllcykvSFogOiAwOworCisJCWlmIChGV0lOVighKGV4cGlyZXMgPj0gc2luZm8tPmV4cGlyZXNfbWluICYmIGV4cGlyZXMgPD0gc2luZm8tPmV4cGlyZXNfbWF4KSwgSVBUX0NPTk5UUkFDS19FWFBJUkVTKSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkJIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCQkgdm9pZCAqbWF0Y2hpbmZvLAorCQkgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkJIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfY29ubnRyYWNrX2luZm8pKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggY29ubnRyYWNrX21hdGNoID0geworCS5uYW1lCQk9ICJjb25udHJhY2siLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2ssCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCW5lZWRfaXBfY29ubnRyYWNrKCk7CisJcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmY29ubnRyYWNrX21hdGNoKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmY29ubnRyYWNrX21hdGNoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZHNjcC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9kc2NwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRmNTJhNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZHNjcC5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qIElQIHRhYmxlcyBtb2R1bGUgZm9yIG1hdGNoaW5nIHRoZSB2YWx1ZSBvZiB0aGUgSVB2NCBEU0NQIGZpZWxkCisgKgorICogaXB0X2RzY3AuYyx2IDEuMyAyMDAyLzA4LzA1IDE5OjAwOjIxIGxhZm9yZ2UgRXhwCisgKgorICogKEMpIDIwMDIgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfZHNjcC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorCitNT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgRFNDUCBtYXRjaGluZyBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBtYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCB2b2lkICptYXRjaGluZm8sCisJCSBpbnQgb2Zmc2V0LCBpbnQgKmhvdGRyb3ApCit7CisJY29uc3Qgc3RydWN0IGlwdF9kc2NwX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKworCXVfaW50OF90IHNoX2RzY3AgPSAoKGluZm8tPmRzY3AgPDwgSVBUX0RTQ1BfU0hJRlQpICYgSVBUX0RTQ1BfTUFTSyk7CisKKwlyZXR1cm4gKChpcGgtPnRvcyZJUFRfRFNDUF9NQVNLKSA9PSBzaF9kc2NwKSBeIGluZm8tPmludmVydDsKK30KKworc3RhdGljIGludCBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisJCSAgICAgIHZvaWQgKm1hdGNoaW5mbywgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkJICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9kc2NwX2luZm8pKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggZHNjcF9tYXRjaCA9IHsKKwkubmFtZQkJPSAiZHNjcCIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZkc2NwX21hdGNoKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmZHNjcF9tYXRjaCk7CisKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZWNuLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Vjbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZjcxODEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Vjbi5jCkBAIC0wLDAgKzEsMTMxIEBACisvKiBJUCB0YWJsZXMgbW9kdWxlIGZvciBtYXRjaGluZyB0aGUgdmFsdWUgb2YgdGhlIElQdjQgYW5kIFRDUCBFQ04gYml0cworICoKKyAqIGlwdF9lY24uYyx2IDEuMyAyMDAyLzA1LzI5IDE1OjA5OjAwIGxhZm9yZ2UgRXhwCisgKgorICogKEMpIDIwMDIgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9lY24uaD4KKworTU9EVUxFX0FVVEhPUigiSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIEVDTiBtYXRjaGluZyBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGlubGluZSBpbnQgbWF0Y2hfaXAoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgIGNvbnN0IHN0cnVjdCBpcHRfZWNuX2luZm8gKmVpbmZvKQoreworCXJldHVybiAoKHNrYi0+bmguaXBoLT50b3MmSVBUX0VDTl9JUF9NQVNLKSA9PSBlaW5mby0+aXBfZWN0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbWF0Y2hfdGNwKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgY29uc3Qgc3RydWN0IGlwdF9lY25faW5mbyAqZWluZm8sCisJCQkgICAgaW50ICpob3Rkcm9wKQoreworCXN0cnVjdCB0Y3BoZHIgX3RjcGgsICp0aDsKKworCS8qIEluIHByYWN0aWNlLCBUQ1AgbWF0Y2ggZG9lcyB0aGlzLCBzbyBjYW4ndCBmYWlsLiAgQnV0IGxldCdzCisJICogYmUgZ29vZCBjaXRpemVucy4KKwkgKi8KKwl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYi0+bmguaXBoLT5paGwgKiA0LAorCQkJCXNpemVvZihfdGNwaCksICZfdGNwaCk7CisJaWYgKHRoID09IE5VTEwpIHsKKwkJKmhvdGRyb3AgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZWluZm8tPm9wZXJhdGlvbiAmIElQVF9FQ05fT1BfTUFUQ0hfRUNFKSB7CisJCWlmIChlaW5mby0+aW52ZXJ0ICYgSVBUX0VDTl9PUF9NQVRDSF9FQ0UpIHsKKwkJCWlmICh0aC0+ZWNlID09IDEpCisJCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlpZiAodGgtPmVjZSA9PSAwKQorCQkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKGVpbmZvLT5vcGVyYXRpb24gJiBJUFRfRUNOX09QX01BVENIX0NXUikgeworCQlpZiAoZWluZm8tPmludmVydCAmIElQVF9FQ05fT1BfTUFUQ0hfQ1dSKSB7CisJCQlpZiAodGgtPmN3ciA9PSAxKQorCQkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJaWYgKHRoLT5jd3IgPT0gMCkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKwkJIGludCBvZmZzZXQsIGludCAqaG90ZHJvcCkKK3sKKwljb25zdCBzdHJ1Y3QgaXB0X2Vjbl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCisJaWYgKGluZm8tPm9wZXJhdGlvbiAmIElQVF9FQ05fT1BfTUFUQ0hfSVApCisJCWlmICghbWF0Y2hfaXAoc2tiLCBpbmZvKSkKKwkJCXJldHVybiAwOworCisJaWYgKGluZm8tPm9wZXJhdGlvbiAmIChJUFRfRUNOX09QX01BVENIX0VDRXxJUFRfRUNOX09QX01BVENIX0NXUikpIHsKKwkJaWYgKHNrYi0+bmguaXBoLT5wcm90b2NvbCAhPSBJUFBST1RPX1RDUCkKKwkJCXJldHVybiAwOworCQlpZiAoIW1hdGNoX3RjcChza2IsIGluZm8sIGhvdGRyb3ApKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCQkgICAgICB2b2lkICptYXRjaGluZm8sIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisJCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IGlwdF9lY25faW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKworCWlmIChtYXRjaHNpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X2Vjbl9pbmZvKSkpCisJCXJldHVybiAwOworCisJaWYgKGluZm8tPm9wZXJhdGlvbiAmIElQVF9FQ05fT1BfTUFUQ0hfTUFTSykKKwkJcmV0dXJuIDA7CisKKwlpZiAoaW5mby0+aW52ZXJ0ICYgSVBUX0VDTl9PUF9NQVRDSF9NQVNLKQorCQlyZXR1cm4gMDsKKworCWlmIChpbmZvLT5vcGVyYXRpb24gJiAoSVBUX0VDTl9PUF9NQVRDSF9FQ0V8SVBUX0VDTl9PUF9NQVRDSF9DV1IpCisJICAgICYmIGlwLT5wcm90byAhPSBJUFBST1RPX1RDUCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJpcHRfZWNuOiBjYW4ndCBtYXRjaCBUQ1AgYml0cyBpbiBydWxlIGZvciIKKwkJICAgICAgICIgbm9uLXRjcCBwYWNrZXRzXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIGVjbl9tYXRjaCA9IHsKKwkubmFtZQkJPSAiZWNuIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJmVjbl9tYXRjaCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaXB0X3VucmVnaXN0ZXJfbWF0Y2goJmVjbl9tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2VzcC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9lc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWQwZGQzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9lc3AuYwpAQCAtMCwwICsxLDExOCBAQAorLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBFU1AgcGFyYW1ldGVycy4gKi8KKworLyogKEMpIDE5OTktMjAwMCBZb24gVXJpYXJ0ZSA8eW9uQGFzdGFyby5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2VzcC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJZb24gVXJpYXJ0ZSA8eW9uQGFzdGFyby5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgRVNQIFNQSSBtYXRjaCBtb2R1bGUiKTsKKworI2lmZGVmIERFQlVHX0NPTk5UUkFDSworI2RlZmluZSBkdXByaW50Zihmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgZHVwcmludGYoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKy8qIFJldHVybnMgMSBpZiB0aGUgc3BpIGlzIG1hdGNoZWQgYnkgdGhlIHJhbmdlLCAwIG90aGVyd2lzZSAqLworc3RhdGljIGlubGluZSBpbnQKK3NwaV9tYXRjaCh1X2ludDMyX3QgbWluLCB1X2ludDMyX3QgbWF4LCB1X2ludDMyX3Qgc3BpLCBpbnQgaW52ZXJ0KQoreworCWludCByPTA7CisgICAgICAgIGR1cHJpbnRmKCJlc3Agc3BpX21hdGNoOiVjIDB4JXggPD0gMHgleCA8PSAweCV4IixpbnZlcnQ/ICchJzonICcsCisgICAgICAgIAltaW4sc3BpLG1heCk7CisJcj0oc3BpID49IG1pbiAmJiBzcGkgPD0gbWF4KSBeIGludmVydDsKKwlkdXByaW50ZigiIHJlc3VsdCAlc1xuIixyPyAiUEFTUyIgOiAiRkFJTEVEIik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIGludCAqaG90ZHJvcCkKK3sKKwlzdHJ1Y3QgaXBfZXNwX2hkciBfZXNwLCAqZWg7CisJY29uc3Qgc3RydWN0IGlwdF9lc3AgKmVzcGluZm8gPSBtYXRjaGluZm87CisKKwkvKiBNdXN0IG5vdCBiZSBhIGZyYWdtZW50LiAqLworCWlmIChvZmZzZXQpCisJCXJldHVybiAwOworCisJZWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsICogNCwKKwkJCQlzaXplb2YoX2VzcCksICZfZXNwKTsKKwlpZiAoZWggPT0gTlVMTCkgeworCQkvKiBXZSd2ZSBiZWVuIGFza2VkIHRvIGV4YW1pbmUgdGhpcyBwYWNrZXQsIGFuZCB3ZQorCQkgKiBjYW4ndC4gIEhlbmNlLCBubyBjaG9pY2UgYnV0IHRvIGRyb3AuCisJCSAqLworCQlkdXByaW50ZigiRHJvcHBpbmcgZXZpbCBFU1AgdGlueWdyYW0uXG4iKTsKKwkJKmhvdGRyb3AgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gc3BpX21hdGNoKGVzcGluZm8tPnNwaXNbMF0sIGVzcGluZm8tPnNwaXNbMV0sCisJCQkgbnRvaGwoZWgtPnNwaSksCisJCQkgISEoZXNwaW5mby0+aW52ZmxhZ3MgJiBJUFRfRVNQX0lOVl9TUEkpKTsKK30KKworLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLworc3RhdGljIGludAorY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisJICAgdm9pZCAqbWF0Y2hpbmZvLAorCSAgIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplLAorCSAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IGlwdF9lc3AgKmVzcGluZm8gPSBtYXRjaGluZm87CisKKwkvKiBNdXN0IHNwZWNpZnkgcHJvdG8gPT0gRVNQLCBhbmQgbm8gdW5rbm93biBpbnZmbGFncyAqLworCWlmIChpcC0+cHJvdG8gIT0gSVBQUk9UT19FU1AgfHwgKGlwLT5pbnZmbGFncyAmIElQVF9JTlZfUFJPVE8pKSB7CisJCWR1cHJpbnRmKCJpcHRfZXNwOiBQcm90b2NvbCAldSAhPSAldVxuIiwgaXAtPnByb3RvLAorCQkJIElQUFJPVE9fRVNQKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChtYXRjaGluZm9zaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9lc3ApKSkgeworCQlkdXByaW50ZigiaXB0X2VzcDogbWF0Y2hzaXplICV1ICE9ICV1XG4iLAorCQkJIG1hdGNoaW5mb3NpemUsIElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9lc3ApKSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoZXNwaW5mby0+aW52ZmxhZ3MgJiB+SVBUX0VTUF9JTlZfTUFTSykgeworCQlkdXByaW50ZigiaXB0X2VzcDogdW5rbm93biBmbGFncyAlWFxuIiwKKwkJCSBlc3BpbmZvLT5pbnZmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBlc3BfbWF0Y2ggPSB7CisJLm5hbWUJCT0gImVzcCIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZlc3BfbWF0Y2gpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cCh2b2lkKQoreworCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZlc3BfbWF0Y2gpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGNsZWFudXApOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9oYXNobGltaXQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaGFzaGxpbWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5MzcxOTAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2hhc2hsaW1pdC5jCkBAIC0wLDAgKzEsNzMxIEBACisvKiBpcHRhYmxlcyBtYXRjaCBleHRlbnNpb24gdG8gbGltaXQgdGhlIG51bWJlciBvZiBwYWNrZXRzIHBlciBzZWNvbmQKKyAqIHNlcGVyYXRlbHkgZm9yIGVhY2ggaGFzaGJ1Y2tldCAoc291cmNlaXAvc291cmNlcG9ydC9kc3RpcC9kc3Rwb3J0KQorICoKKyAqIChDKSAyMDAzLTIwMDQgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+CisgKgorICogJElkOiBpcHRfaGFzaGxpbWl0LmMgMzI0NCAyMDA0LTEwLTIwIDE2OjI0OjI5WiBsYWZvcmdlQG5ldGZpbHRlci5vcmcgJAorICoKKyAqIERldmVsb3BtZW50IG9mIHRoaXMgY29kZSB3YXMgZnVuZGVkIGJ5IEFzdGFybyBBRywgaHR0cDovL3d3dy5hc3Rhcm8uY29tLworICoKKyAqIGJhc2VkIG9uIGlwdF9saW1pdC5jIGJ5OgorICogSuly9G1lIGRlIFZpdmllCTxkZXZpdmllQGluZm8uZW5zZXJiLnUtYm9yZGVhdXguZnI+CisgKiBIZXJ26SBFeWNoZW5uZQk8ZXljaGVubmVAaW5mby5lbnNlcmIudS1ib3JkZWF1eC5mcj4KKyAqIFJ1c3R5IFJ1c3NlbGwJPHJ1c3R5QHJ1c3Rjb3JwLmNvbS5hdT4KKyAqCisgKiBUaGUgZ2VuZXJhbCBpZGVhIGlzIHRvIGNyZWF0ZSBhIGhhc2ggdGFibGUgZm9yIGV2ZXJ5IGRzdGlwIGFuZCBoYXZlIGEKKyAqIHNlcGVyYXRlIGxpbWl0IGNvdW50ZXIgcGVyIHR1cGxlLiAgVGhpcyB3YXkgeW91IGNhbiBkbyBzb21ldGhpbmcgbGlrZSAnbGltaXQKKyAqIHRoZSBudW1iZXIgb2Ygc3luIHBhY2tldHMgZm9yIGVhY2ggb2YgbXkgaW50ZXJuYWwgYWRkcmVzc2VzLgorICoKKyAqIElkZWFsbHkgdGhpcyB3b3VsZCBqdXN0IGJlIGltcGxlbWVudGVkIGFzIGEgZ2VuZXJhbCAnaGFzaCcgbWF0Y2gsIHdoaWNoIHdvdWxkCisgKiBhbGxvdyB1cyB0byBhdHRhY2ggYW55IGlwdGFibGVzIHRhcmdldCB0byBpdCdzIGhhc2ggYnVja2V0cy4gIEJ1dCB0aGlzIGlzCisgKiBub3QgcG9zc2libGUgaW4gdGhlIGN1cnJlbnQgaXB0YWJsZXMgYXJjaGl0ZWN0dXJlLiAgQXMgYWx3YXlzLCBwa3R0YWJsZXMgZm9yCisgKiAyLjcueCB3aWxsIGhlbHAgOykKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvamhhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjdHAuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfaGFzaGxpbWl0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvbG9ja2hlbHAuaD4KKworLyogRklYTUU6IHRoaXMgaXMganVzdCBmb3IgSVBfTkZfQVNTRVJSVCAqLworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgbWF0Y2ggZm9yIGxpbWl0aW5nIHBlciBoYXNoLWJ1Y2tldCIpOworCisvKiBuZWVkIHRvIGRlY2xhcmUgdGhpcyBhdCB0aGUgdG9wICovCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpoYXNobGltaXRfcHJvY2RpcjsKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRsX2ZpbGVfb3BzOworCisvKiBoYXNoIHRhYmxlIGNyYXAgKi8KKworc3RydWN0IGRzdGhhc2hfZHN0IHsKKwl1X2ludDMyX3Qgc3JjX2lwOworCXVfaW50MzJfdCBkc3RfaXA7CisJLyogcG9ydHMgaGF2ZSB0byBiZSBjb25zZWN1dGl2ZSAhISEgKi8KKwl1X2ludDE2X3Qgc3JjX3BvcnQ7CisJdV9pbnQxNl90IGRzdF9wb3J0OworfTsKKworc3RydWN0IGRzdGhhc2hfZW50IHsKKwkvKiBzdGF0aWMgLyByZWFkLW9ubHkgcGFydHMgaW4gdGhlIGJlZ2lubmluZyAqLworCXN0cnVjdCBobGlzdF9ub2RlIG5vZGU7CisJc3RydWN0IGRzdGhhc2hfZHN0IGRzdDsKKworCS8qIG1vZGlmaWVkIHN0cnVjdHVyZSBtZW1iZXJzIGluIHRoZSBlbmQgKi8KKwl1bnNpZ25lZCBsb25nIGV4cGlyZXM7CQkvKiBwcmVjYWxjdWxhdGVkIGV4cGlyeSB0aW1lICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgbG9uZyBwcmV2OwkvKiBsYXN0IG1vZGlmaWNhdGlvbiAqLworCQl1X2ludDMyX3QgY3JlZGl0OworCQl1X2ludDMyX3QgY3JlZGl0X2NhcCwgY29zdDsKKwl9IHJhdGVpbmZvOworfTsKKworc3RydWN0IGlwdF9oYXNobGltaXRfaHRhYmxlIHsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlOwkJLyogZ2xvYmFsIGxpc3Qgb2YgYWxsIGh0YWJsZXMgKi8KKwlhdG9taWNfdCB1c2U7CisKKwlzdHJ1Y3QgaGFzaGxpbWl0X2NmZyBjZmc7CS8qIGNvbmZpZyAqLworCisJLyogdXNlZCBpbnRlcm5hbGx5ICovCisJc3BpbmxvY2tfdCBsb2NrOwkJLyogbG9jayBmb3IgbGlzdF9oZWFkICovCisJdV9pbnQzMl90IHJuZDsJCQkvKiByYW5kb20gc2VlZCBmb3IgaGFzaCAqLworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwkvKiB0aW1lciBmb3IgZ2MgKi8KKwlhdG9taWNfdCBjb3VudDsJCQkvKiBudW1iZXIgZW50cmllcyBpbiB0YWJsZSAqLworCisJLyogc2VxX2ZpbGUgc3R1ZmYgKi8KKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZTsKKworCXN0cnVjdCBobGlzdF9oZWFkIGhhc2hbMF07CS8qIGhhc2h0YWJsZSBpdHNlbGYgKi8KK307CisKK3N0YXRpYyBERUNMQVJFX0xPQ0soaGFzaGxpbWl0X2xvY2spOwkvKiBwcm90ZWN0cyBodGFibGVzIGxpc3QgKi8KK3N0YXRpYyBERUNMQVJFX01VVEVYKGhsaW1pdF9tdXRleCk7CS8qIGFkZGl0aW9uYWwgY2hlY2tlbnRyeSBwcm90ZWN0aW9uICovCitzdGF0aWMgSExJU1RfSEVBRChoYXNobGltaXRfaHRhYmxlcyk7CitzdGF0aWMga21lbV9jYWNoZV90ICpoYXNobGltaXRfY2FjaGVwOworCitzdGF0aWMgaW5saW5lIGludCBkc3RfY21wKGNvbnN0IHN0cnVjdCBkc3RoYXNoX2VudCAqZW50LCBzdHJ1Y3QgZHN0aGFzaF9kc3QgKmIpCit7CisJcmV0dXJuIChlbnQtPmRzdC5kc3RfaXAgPT0gYi0+ZHN0X2lwIAorCQkmJiBlbnQtPmRzdC5kc3RfcG9ydCA9PSBiLT5kc3RfcG9ydAorCQkmJiBlbnQtPmRzdC5zcmNfcG9ydCA9PSBiLT5zcmNfcG9ydAorCQkmJiBlbnQtPmRzdC5zcmNfaXAgPT0gYi0+c3JjX2lwKTsKK30KKworc3RhdGljIGlubGluZSB1X2ludDMyX3QKK2hhc2hfZHN0KGNvbnN0IHN0cnVjdCBpcHRfaGFzaGxpbWl0X2h0YWJsZSAqaHQsIGNvbnN0IHN0cnVjdCBkc3RoYXNoX2RzdCAqZHN0KQoreworCXJldHVybiAoamhhc2hfM3dvcmRzKGRzdC0+ZHN0X2lwLCAoZHN0LT5kc3RfcG9ydDw8MTYgfCBkc3QtPnNyY19wb3J0KSwgCisJCQkgICAgIGRzdC0+c3JjX2lwLCBodC0+cm5kKSAlIGh0LT5jZmcuc2l6ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRzdGhhc2hfZW50ICoKK19fZHN0aGFzaF9maW5kKGNvbnN0IHN0cnVjdCBpcHRfaGFzaGxpbWl0X2h0YWJsZSAqaHQsIHN0cnVjdCBkc3RoYXNoX2RzdCAqZHN0KQoreworCXN0cnVjdCBkc3RoYXNoX2VudCAqZW50OworCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CisJdV9pbnQzMl90IGhhc2ggPSBoYXNoX2RzdChodCwgZHN0KTsKKworCWlmICghaGxpc3RfZW1wdHkoJmh0LT5oYXNoW2hhc2hdKSkKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnkoZW50LCBwb3MsICZodC0+aGFzaFtoYXNoXSwgbm9kZSkgeworCQkJaWYgKGRzdF9jbXAoZW50LCBkc3QpKSB7CisJCQkJcmV0dXJuIGVudDsKKwkJCX0KKwkJfQorCQorCXJldHVybiBOVUxMOworfQorCisvKiBhbGxvY2F0ZSBkc3RoYXNoX2VudCwgaW5pdGlhbGl6ZSBkc3QsIHB1dCBpbiBodGFibGUgYW5kIGxvY2sgaXQgKi8KK3N0YXRpYyBzdHJ1Y3QgZHN0aGFzaF9lbnQgKgorX19kc3RoYXNoX2FsbG9jX2luaXQoc3RydWN0IGlwdF9oYXNobGltaXRfaHRhYmxlICpodCwgc3RydWN0IGRzdGhhc2hfZHN0ICpkc3QpCit7CisJc3RydWN0IGRzdGhhc2hfZW50ICplbnQ7CisKKwkvKiBpbml0aWFsaXplIGhhc2ggd2l0aCByYW5kb20gdmFsIGF0IHRoZSB0aW1lIHdlIGFsbG9jYXRlCisJICogdGhlIGZpcnN0IGhhc2h0YWJsZSBlbnRyeSAqLworCWlmICghaHQtPnJuZCkKKwkJZ2V0X3JhbmRvbV9ieXRlcygmaHQtPnJuZCwgNCk7CisKKwlpZiAoaHQtPmNmZy5tYXggJiYKKwkgICAgYXRvbWljX3JlYWQoJmh0LT5jb3VudCkgPj0gaHQtPmNmZy5tYXgpIHsKKwkJLyogRklYTUU6IGRvIHNvbWV0aGluZy4gcXVlc3Rpb24gaXMgd2hhdC4uICovCisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HIAorCQkJCSJpcHRfaGFzaGxpbWl0OiBtYXggY291bnQgb2YgJXUgcmVhY2hlZFxuIiwgCisJCQkJaHQtPmNmZy5tYXgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwllbnQgPSBrbWVtX2NhY2hlX2FsbG9jKGhhc2hsaW1pdF9jYWNoZXAsIEdGUF9BVE9NSUMpOworCWlmICghZW50KSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9FUlIgCisJCQkJImlwdF9oYXNobGltaXQ6IGNhbid0IGFsbG9jYXRlIGRzdGhhc2hfZW50XG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYXRvbWljX2luYygmaHQtPmNvdW50KTsKKworCWVudC0+ZHN0LmRzdF9pcCA9IGRzdC0+ZHN0X2lwOworCWVudC0+ZHN0LmRzdF9wb3J0ID0gZHN0LT5kc3RfcG9ydDsKKwllbnQtPmRzdC5zcmNfaXAgPSBkc3QtPnNyY19pcDsKKwllbnQtPmRzdC5zcmNfcG9ydCA9IGRzdC0+c3JjX3BvcnQ7CisKKwlobGlzdF9hZGRfaGVhZCgmZW50LT5ub2RlLCAmaHQtPmhhc2hbaGFzaF9kc3QoaHQsIGRzdCldKTsKKworCXJldHVybiBlbnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAKK19fZHN0aGFzaF9mcmVlKHN0cnVjdCBpcHRfaGFzaGxpbWl0X2h0YWJsZSAqaHQsIHN0cnVjdCBkc3RoYXNoX2VudCAqZW50KQoreworCWhsaXN0X2RlbCgmZW50LT5ub2RlKTsKKwlrbWVtX2NhY2hlX2ZyZWUoaGFzaGxpbWl0X2NhY2hlcCwgZW50KTsKKwlhdG9taWNfZGVjKCZodC0+Y291bnQpOworfQorc3RhdGljIHZvaWQgaHRhYmxlX2djKHVuc2lnbmVkIGxvbmcgaHRsb25nKTsKKworc3RhdGljIGludCBodGFibGVfY3JlYXRlKHN0cnVjdCBpcHRfaGFzaGxpbWl0X2luZm8gKm1pbmZvKQoreworCWludCBpOworCXVuc2lnbmVkIGludCBzaXplOworCXN0cnVjdCBpcHRfaGFzaGxpbWl0X2h0YWJsZSAqaGluZm87CisKKwlpZiAobWluZm8tPmNmZy5zaXplKQorCQlzaXplID0gbWluZm8tPmNmZy5zaXplOworCWVsc2UgeworCQlzaXplID0gKCgobnVtX3BoeXNwYWdlcyA8PCBQQUdFX1NISUZUKSAvIDE2Mzg0KQorCQkJIC8gc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpKTsKKwkJaWYgKG51bV9waHlzcGFnZXMgPiAoMTAyNCAqIDEwMjQgKiAxMDI0IC8gUEFHRV9TSVpFKSkKKwkJCXNpemUgPSA4MTkyOworCQlpZiAoc2l6ZSA8IDE2KQorCQkJc2l6ZSA9IDE2OworCX0KKwkvKiBGSVhNRTogZG9uJ3QgdXNlIHZtYWxsb2MoKSBoZXJlIG9yIGFueXdoZXJlIGVsc2UgLUhXICovCisJaGluZm8gPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgaXB0X2hhc2hsaW1pdF9odGFibGUpCisJCQkrIChzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkgKiBzaXplKSk7CisJaWYgKCFoaW5mbykgeworCQlwcmludGsoS0VSTl9FUlIgImlwdF9oYXNobGltaXQ6IFVuYWJsZSB0byBjcmVhdGUgaGFzaHRhYmxlXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwltaW5mby0+aGluZm8gPSBoaW5mbzsKKworCS8qIGNvcHkgbWF0Y2ggY29uZmlnIGludG8gaGFzaHRhYmxlIGNvbmZpZyAqLworCW1lbWNweSgmaGluZm8tPmNmZywgJm1pbmZvLT5jZmcsIHNpemVvZihoaW5mby0+Y2ZnKSk7CisJaGluZm8tPmNmZy5zaXplID0gc2l6ZTsKKwlpZiAoIWhpbmZvLT5jZmcubWF4KQorCQloaW5mby0+Y2ZnLm1heCA9IDggKiBoaW5mby0+Y2ZnLnNpemU7CisJZWxzZSBpZiAoaGluZm8tPmNmZy5tYXggPCBoaW5mby0+Y2ZnLnNpemUpCisJCWhpbmZvLT5jZmcubWF4ID0gaGluZm8tPmNmZy5zaXplOworCisJZm9yIChpID0gMDsgaSA8IGhpbmZvLT5jZmcuc2l6ZTsgaSsrKQorCQlJTklUX0hMSVNUX0hFQUQoJmhpbmZvLT5oYXNoW2ldKTsKKworCWF0b21pY19zZXQoJmhpbmZvLT5jb3VudCwgMCk7CisJYXRvbWljX3NldCgmaGluZm8tPnVzZSwgMSk7CisJaGluZm8tPnJuZCA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJmhpbmZvLT5sb2NrKTsKKwloaW5mby0+cGRlID0gY3JlYXRlX3Byb2NfZW50cnkobWluZm8tPm5hbWUsIDAsIGhhc2hsaW1pdF9wcm9jZGlyKTsKKwlpZiAoIWhpbmZvLT5wZGUpIHsKKwkJdmZyZWUoaGluZm8pOworCQlyZXR1cm4gLTE7CisJfQorCWhpbmZvLT5wZGUtPnByb2NfZm9wcyA9ICZkbF9maWxlX29wczsKKwloaW5mby0+cGRlLT5kYXRhID0gaGluZm87CisKKwlpbml0X3RpbWVyKCZoaW5mby0+dGltZXIpOworCWhpbmZvLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoaGluZm8tPmNmZy5nY19pbnRlcnZhbCk7CisJaGluZm8tPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyApaGluZm87CisJaGluZm8tPnRpbWVyLmZ1bmN0aW9uID0gaHRhYmxlX2djOworCWFkZF90aW1lcigmaGluZm8tPnRpbWVyKTsKKworCUxPQ0tfQkgoJmhhc2hsaW1pdF9sb2NrKTsKKwlobGlzdF9hZGRfaGVhZCgmaGluZm8tPm5vZGUsICZoYXNobGltaXRfaHRhYmxlcyk7CisJVU5MT0NLX0JIKCZoYXNobGltaXRfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZWxlY3RfYWxsKHN0cnVjdCBpcHRfaGFzaGxpbWl0X2h0YWJsZSAqaHQsIHN0cnVjdCBkc3RoYXNoX2VudCAqaGUpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2VsZWN0X2djKHN0cnVjdCBpcHRfaGFzaGxpbWl0X2h0YWJsZSAqaHQsIHN0cnVjdCBkc3RoYXNoX2VudCAqaGUpCit7CisJcmV0dXJuIChqaWZmaWVzID49IGhlLT5leHBpcmVzKTsKK30KKworc3RhdGljIHZvaWQgaHRhYmxlX3NlbGVjdGl2ZV9jbGVhbnVwKHN0cnVjdCBpcHRfaGFzaGxpbWl0X2h0YWJsZSAqaHQsCisJCSAJCWludCAoKnNlbGVjdCkoc3RydWN0IGlwdF9oYXNobGltaXRfaHRhYmxlICpodCwgCisJCQkJCSAgICAgIHN0cnVjdCBkc3RoYXNoX2VudCAqaGUpKQoreworCWludCBpOworCisJSVBfTkZfQVNTRVJUKGh0LT5jZmcuc2l6ZSAmJiBodC0+Y2ZnLm1heCk7CisKKwkvKiBsb2NrIGhhc2ggdGFibGUgYW5kIGl0ZXJhdGUgb3ZlciBpdCAqLworCXNwaW5fbG9ja19iaCgmaHQtPmxvY2spOworCWZvciAoaSA9IDA7IGkgPCBodC0+Y2ZnLnNpemU7IGkrKykgeworCQlzdHJ1Y3QgZHN0aGFzaF9lbnQgKmRoOworCQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zLCAqbjsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkaCwgcG9zLCBuLCAmaHQtPmhhc2hbaV0sIG5vZGUpIHsKKwkJCWlmICgoKnNlbGVjdCkoaHQsIGRoKSkKKwkJCQlfX2RzdGhhc2hfZnJlZShodCwgZGgpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2JoKCZodC0+bG9jayk7Cit9CisKKy8qIGhhc2ggdGFibGUgZ2FyYmFnZSBjb2xsZWN0b3IsIHJ1biBieSB0aW1lciAqLworc3RhdGljIHZvaWQgaHRhYmxlX2djKHVuc2lnbmVkIGxvbmcgaHRsb25nKQoreworCXN0cnVjdCBpcHRfaGFzaGxpbWl0X2h0YWJsZSAqaHQgPSAoc3RydWN0IGlwdF9oYXNobGltaXRfaHRhYmxlICopaHRsb25nOworCisJaHRhYmxlX3NlbGVjdGl2ZV9jbGVhbnVwKGh0LCBzZWxlY3RfZ2MpOworCisJLyogcmUtYWRkIHRoZSB0aW1lciBhY2NvcmRpbmdseSAqLworCWh0LT50aW1lci5leHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoaHQtPmNmZy5nY19pbnRlcnZhbCk7CisJYWRkX3RpbWVyKCZodC0+dGltZXIpOworfQorCitzdGF0aWMgdm9pZCBodGFibGVfZGVzdHJveShzdHJ1Y3QgaXB0X2hhc2hsaW1pdF9odGFibGUgKmhpbmZvKQoreworCS8qIHJlbW92ZSB0aW1lciwgaWYgaXQgaXMgcGVuZGluZyAqLworCWlmICh0aW1lcl9wZW5kaW5nKCZoaW5mby0+dGltZXIpKQorCQlkZWxfdGltZXIoJmhpbmZvLT50aW1lcik7CisKKwkvKiByZW1vdmUgcHJvYyBlbnRyeSAqLworCXJlbW92ZV9wcm9jX2VudHJ5KGhpbmZvLT5wZGUtPm5hbWUsIGhhc2hsaW1pdF9wcm9jZGlyKTsKKworCWh0YWJsZV9zZWxlY3RpdmVfY2xlYW51cChoaW5mbywgc2VsZWN0X2FsbCk7CisJdmZyZWUoaGluZm8pOworfQorCitzdGF0aWMgc3RydWN0IGlwdF9oYXNobGltaXRfaHRhYmxlICpodGFibGVfZmluZF9nZXQoY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgaXB0X2hhc2hsaW1pdF9odGFibGUgKmhpbmZvOworCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CisKKwlMT0NLX0JIKCZoYXNobGltaXRfbG9jayk7CisJaGxpc3RfZm9yX2VhY2hfZW50cnkoaGluZm8sIHBvcywgJmhhc2hsaW1pdF9odGFibGVzLCBub2RlKSB7CisJCWlmICghc3RyY21wKG5hbWUsIGhpbmZvLT5wZGUtPm5hbWUpKSB7CisJCQlhdG9taWNfaW5jKCZoaW5mby0+dXNlKTsKKwkJCVVOTE9DS19CSCgmaGFzaGxpbWl0X2xvY2spOworCQkJcmV0dXJuIGhpbmZvOworCQl9CisJfQorCVVOTE9DS19CSCgmaGFzaGxpbWl0X2xvY2spOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGh0YWJsZV9wdXQoc3RydWN0IGlwdF9oYXNobGltaXRfaHRhYmxlICpoaW5mbykKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmaGluZm8tPnVzZSkpIHsKKwkJTE9DS19CSCgmaGFzaGxpbWl0X2xvY2spOworCQlobGlzdF9kZWwoJmhpbmZvLT5ub2RlKTsKKwkJVU5MT0NLX0JIKCZoYXNobGltaXRfbG9jayk7CisJCWh0YWJsZV9kZXN0cm95KGhpbmZvKTsKKwl9Cit9CisKKworLyogVGhlIGFsZ29yaXRobSB1c2VkIGlzIHRoZSBTaW1wbGUgVG9rZW4gQnVja2V0IEZpbHRlciAoVEJGKQorICogc2VlIG5ldC9zY2hlZC9zY2hfdGJmLmMgaW4gdGhlIGxpbnV4IHNvdXJjZSB0cmVlCisgKi8KKworLyogUnVzdHk6IFRoaXMgaXMgbXkgKG5vbi1tYXRoZW1hdGljYWxseS1pbmNsaW5lZCkgdW5kZXJzdGFuZGluZyBvZgorICAgdGhpcyBhbGdvcml0aG0uICBUaGUgYGF2ZXJhZ2UgcmF0ZScgaW4gamlmZmllcyBiZWNvbWVzIHlvdXIgaW5pdGlhbAorICAgYW1vdW50IG9mIGNyZWRpdCBgY3JlZGl0JyBhbmQgdGhlIG1vc3QgY3JlZGl0IHlvdSBjYW4gZXZlciBoYXZlCisgICBgY3JlZGl0X2NhcCcuICBUaGUgYHBlYWsgcmF0ZScgYmVjb21lcyB0aGUgY29zdCBvZiBwYXNzaW5nIHRoZQorICAgdGVzdCwgYGNvc3QnLgorCisgICBgcHJldicgdHJhY2tzIHRoZSBsYXN0IHBhY2tldCBoaXQ6IHlvdSBnYWluIG9uZSBjcmVkaXQgcGVyIGppZmZ5LgorICAgSWYgeW91IGdldCBjcmVkaXQgYmFsYW5jZSBtb3JlIHRoYW4gdGhpcywgdGhlIGV4dHJhIGNyZWRpdCBpcworICAgZGlzY2FyZGVkLiAgRXZlcnkgdGltZSB0aGUgbWF0Y2ggcGFzc2VzLCB5b3UgbG9zZSBgY29zdCcgY3JlZGl0czsKKyAgIGlmIHlvdSBkb24ndCBoYXZlIHRoYXQgbWFueSwgdGhlIHRlc3QgZmFpbHMuCisKKyAgIFNlZSBBbGV4ZXkncyBmb3JtYWwgZXhwbGFuYXRpb24gaW4gbmV0L3NjaGVkL3NjaF90YmYuYy4KKworICAgVG8gZ2V0IHRoZSBtYXhpbXVtIHJhbmdlLCB3ZSBtdWx0aXBseSBieSB0aGlzIGZhY3RvciAoaWUuIHlvdSBnZXQgTgorICAgY3JlZGl0cyBwZXIgamlmZnkpLiAgV2Ugd2FudCB0byBhbGxvdyBhIHJhdGUgYXMgbG93IGFzIDEgcGVyIGRheQorICAgKHNsb3dlc3QgdXNlcnNwYWNlIHRvb2wgYWxsb3dzKSwgd2hpY2ggbWVhbnMKKyAgIENSRURJVFNfUEVSX0pJRkZZKkhaKjYwKjYwKjI0IDwgMl4zMiBpZS4KKyovCisjZGVmaW5lIE1BWF9DUEogKDB4RkZGRkZGRkYgLyAoSFoqNjAqNjAqMjQpKQorCisvKiBSZXBlYXRlZCBzaGlmdCBhbmQgb3IgZ2l2ZXMgdXMgYWxsIDFzLCBmaW5hbCBzaGlmdCBhbmQgYWRkIDEgZ2l2ZXMKKyAqIHVzIHRoZSBwb3dlciBvZiAyIGJlbG93IHRoZSB0aGVvcmV0aWNhbCBtYXgsIHNvIEdDQyBzaW1wbHkgZG9lcyBhCisgKiBzaGlmdC4gKi8KKyNkZWZpbmUgX1BPVzJfQkVMT1cyKHgpICgoeCl8KCh4KT4+MSkpCisjZGVmaW5lIF9QT1cyX0JFTE9XNCh4KSAoX1BPVzJfQkVMT1cyKHgpfF9QT1cyX0JFTE9XMigoeCk+PjIpKQorI2RlZmluZSBfUE9XMl9CRUxPVzgoeCkgKF9QT1cyX0JFTE9XNCh4KXxfUE9XMl9CRUxPVzQoKHgpPj40KSkKKyNkZWZpbmUgX1BPVzJfQkVMT1cxNih4KSAoX1BPVzJfQkVMT1c4KHgpfF9QT1cyX0JFTE9XOCgoeCk+PjgpKQorI2RlZmluZSBfUE9XMl9CRUxPVzMyKHgpIChfUE9XMl9CRUxPVzE2KHgpfF9QT1cyX0JFTE9XMTYoKHgpPj4xNikpCisjZGVmaW5lIFBPVzJfQkVMT1czMih4KSAoKF9QT1cyX0JFTE9XMzIoeCk+PjEpICsgMSkKKworI2RlZmluZSBDUkVESVRTX1BFUl9KSUZGWSBQT1cyX0JFTE9XMzIoTUFYX0NQSikKKworLyogUHJlY2lzaW9uIHNhdmVyLiAqLworc3RhdGljIGlubGluZSB1X2ludDMyX3QKK3VzZXIyY3JlZGl0cyh1X2ludDMyX3QgdXNlcikKK3sKKwkvKiBJZiBtdWx0aXBseWluZyB3b3VsZCBvdmVyZmxvdy4uLiAqLworCWlmICh1c2VyID4gMHhGRkZGRkZGRiAvIChIWipDUkVESVRTX1BFUl9KSUZGWSkpCisJCS8qIERpdmlkZSBmaXJzdC4gKi8KKwkJcmV0dXJuICh1c2VyIC8gSVBUX0hBU0hMSU1JVF9TQ0FMRSkgKiBIWiAqIENSRURJVFNfUEVSX0pJRkZZOworCisJcmV0dXJuICh1c2VyICogSFogKiBDUkVESVRTX1BFUl9KSUZGWSkgLyBJUFRfSEFTSExJTUlUX1NDQUxFOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmF0ZWluZm9fcmVjYWxjKHN0cnVjdCBkc3RoYXNoX2VudCAqZGgsIHVuc2lnbmVkIGxvbmcgbm93KQoreworCWRoLT5yYXRlaW5mby5jcmVkaXQgKz0gKG5vdyAtIHhjaGcoJmRoLT5yYXRlaW5mby5wcmV2LCBub3cpKSAKKwkJCQkJKiBDUkVESVRTX1BFUl9KSUZGWTsKKwlpZiAoZGgtPnJhdGVpbmZvLmNyZWRpdCA+IGRoLT5yYXRlaW5mby5jcmVkaXRfY2FwKQorCQlkaC0+cmF0ZWluZm8uY3JlZGl0ID0gZGgtPnJhdGVpbmZvLmNyZWRpdF9jYXA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9wb3J0cyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0LCAKKwkJCSAgICB1MTYgcG9ydHNbMl0pCit7CisJdW5pb24geworCQlzdHJ1Y3QgdGNwaGRyIHRoOworCQlzdHJ1Y3QgdWRwaGRyIHVoOworCQlzY3RwX3NjdHBoZHJfdCBzY3RwaDsKKwl9IGhkcl91LCAqcHRyX3U7CisKKwkvKiBNdXN0IG5vdCBiZSBhIGZyYWdtZW50LiAqLworCWlmIChvZmZzZXQpCisJCXJldHVybiAxOworCisJLyogTXVzdCBiZSBiaWcgZW5vdWdoIHRvIHJlYWQgcG9ydHMgKGJvdGggVURQIGFuZCBUQ1AgaGF2ZQorCSAgIHRoZW0gYXQgdGhlIHN0YXJ0KS4gKi8KKwlwdHJfdSA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYi0+bmguaXBoLT5paGwqNCwgOCwgJmhkcl91KTsgCisJaWYgKCFwdHJfdSkKKwkJcmV0dXJuIDE7CisKKwlzd2l0Y2ggKHNrYi0+bmguaXBoLT5wcm90b2NvbCkgeworCQljYXNlIElQUFJPVE9fVENQOgorCQkJcG9ydHNbMF0gPSBwdHJfdS0+dGguc291cmNlOworCQkJcG9ydHNbMV0gPSBwdHJfdS0+dGguZGVzdDsKKwkJCWJyZWFrOworCQljYXNlIElQUFJPVE9fVURQOgorCQkJcG9ydHNbMF0gPSBwdHJfdS0+dWguc291cmNlOworCQkJcG9ydHNbMV0gPSBwdHJfdS0+dWguZGVzdDsKKwkJCWJyZWFrOworCQljYXNlIElQUFJPVE9fU0NUUDoKKwkJCXBvcnRzWzBdID0gcHRyX3UtPnNjdHBoLnNvdXJjZTsKKwkJCXBvcnRzWzFdID0gcHRyX3UtPnNjdHBoLmRlc3Q7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIGFsbCBvdGhlciBwcm90b2NvbHMgZG9uJ3Qgc3VwcHJvdCBwZXItcG9ydCBoYXNoCisJCQkgKiBidWNrZXRzICovCisJCQlwb3J0c1swXSA9IHBvcnRzWzFdID0gMDsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK2hhc2hsaW1pdF9tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCWNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKwkJaW50IG9mZnNldCwKKwkJaW50ICpob3Rkcm9wKQoreworCXN0cnVjdCBpcHRfaGFzaGxpbWl0X2luZm8gKnIgPSAKKwkJKChzdHJ1Y3QgaXB0X2hhc2hsaW1pdF9pbmZvICopbWF0Y2hpbmZvKS0+dS5tYXN0ZXI7CisJc3RydWN0IGlwdF9oYXNobGltaXRfaHRhYmxlICpoaW5mbyA9IHItPmhpbmZvOworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKwlzdHJ1Y3QgZHN0aGFzaF9lbnQgKmRoOworCXN0cnVjdCBkc3RoYXNoX2RzdCBkc3Q7CisKKwkvKiBidWlsZCAnZHN0JyBhY2NvcmRpbmcgdG8gaGluZm8tPmNmZyBhbmQgY3VycmVudCBwYWNrZXQgKi8KKwltZW1zZXQoJmRzdCwgMCwgc2l6ZW9mKGRzdCkpOworCWlmIChoaW5mby0+Y2ZnLm1vZGUgJiBJUFRfSEFTSExJTUlUX0hBU0hfRElQKQorCQlkc3QuZHN0X2lwID0gc2tiLT5uaC5pcGgtPmRhZGRyOworCWlmIChoaW5mby0+Y2ZnLm1vZGUgJiBJUFRfSEFTSExJTUlUX0hBU0hfU0lQKQorCQlkc3Quc3JjX2lwID0gc2tiLT5uaC5pcGgtPnNhZGRyOworCWlmIChoaW5mby0+Y2ZnLm1vZGUgJiBJUFRfSEFTSExJTUlUX0hBU0hfRFBUCisJICAgIHx8aGluZm8tPmNmZy5tb2RlICYgSVBUX0hBU0hMSU1JVF9IQVNIX1NQVCkgeworCQl1X2ludDE2X3QgcG9ydHNbMl07CisJCWlmIChnZXRfcG9ydHMoc2tiLCBvZmZzZXQsIHBvcnRzKSkgeworCQkJLyogV2UndmUgYmVlbiBhc2tlZCB0byBleGFtaW5lIHRoaXMgcGFja2V0LCBhbmQgd2UKKwkJIAkgIGNhbid0LiAgSGVuY2UsIG5vIGNob2ljZSBidXQgdG8gZHJvcC4gKi8KKwkJCSpob3Rkcm9wID0gMTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChoaW5mby0+Y2ZnLm1vZGUgJiBJUFRfSEFTSExJTUlUX0hBU0hfU1BUKQorCQkJZHN0LnNyY19wb3J0ID0gcG9ydHNbMF07CisJCWlmIChoaW5mby0+Y2ZnLm1vZGUgJiBJUFRfSEFTSExJTUlUX0hBU0hfRFBUKQorCQkJZHN0LmRzdF9wb3J0ID0gcG9ydHNbMV07CisJfSAKKworCXNwaW5fbG9ja19iaCgmaGluZm8tPmxvY2spOworCWRoID0gX19kc3RoYXNoX2ZpbmQoaGluZm8sICZkc3QpOworCWlmICghZGgpIHsKKwkJZGggPSBfX2RzdGhhc2hfYWxsb2NfaW5pdChoaW5mbywgJmRzdCk7CisKKwkJaWYgKCFkaCkgeworCQkJLyogZW5vbWVtLi4uIGRvbid0IG1hdGNoID09IERST1AgKi8KKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRU5PTUVNXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJc3Bpbl91bmxvY2tfYmgoJmhpbmZvLT5sb2NrKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJZGgtPmV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhoaW5mby0+Y2ZnLmV4cGlyZSk7CisKKwkJZGgtPnJhdGVpbmZvLnByZXYgPSBqaWZmaWVzOworCQlkaC0+cmF0ZWluZm8uY3JlZGl0ID0gdXNlcjJjcmVkaXRzKGhpbmZvLT5jZmcuYXZnICogCisJCQkJCQkJaGluZm8tPmNmZy5idXJzdCk7CisJCWRoLT5yYXRlaW5mby5jcmVkaXRfY2FwID0gdXNlcjJjcmVkaXRzKGhpbmZvLT5jZmcuYXZnICogCisJCQkJCQkJaGluZm8tPmNmZy5idXJzdCk7CisJCWRoLT5yYXRlaW5mby5jb3N0ID0gdXNlcjJjcmVkaXRzKGhpbmZvLT5jZmcuYXZnKTsKKworCQlzcGluX3VubG9ja19iaCgmaGluZm8tPmxvY2spOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiB1cGRhdGUgZXhwaXJhdGlvbiB0aW1lb3V0ICovCisJZGgtPmV4cGlyZXMgPSBub3cgKyBtc2Vjc190b19qaWZmaWVzKGhpbmZvLT5jZmcuZXhwaXJlKTsKKworCXJhdGVpbmZvX3JlY2FsYyhkaCwgbm93KTsKKwlpZiAoZGgtPnJhdGVpbmZvLmNyZWRpdCA+PSBkaC0+cmF0ZWluZm8uY29zdCkgeworCQkvKiBXZSdyZSB1bmRlcmxpbWl0LiAqLworCQlkaC0+cmF0ZWluZm8uY3JlZGl0IC09IGRoLT5yYXRlaW5mby5jb3N0OworCQlzcGluX3VubG9ja19iaCgmaGluZm8tPmxvY2spOworCQlyZXR1cm4gMTsKKwl9CisKKyAgICAgICAJc3Bpbl91bmxvY2tfYmgoJmhpbmZvLT5sb2NrKTsKKworCS8qIGRlZmF1bHQgY2FzZTogd2UncmUgb3ZlcmxpbWl0LCB0aHVzIGRvbid0IG1hdGNoICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2hhc2hsaW1pdF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkJICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkJICAgICB2b2lkICptYXRjaGluZm8sCisJCSAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkJICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCXN0cnVjdCBpcHRfaGFzaGxpbWl0X2luZm8gKnIgPSBtYXRjaGluZm87CisKKwlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9oYXNobGltaXRfaW5mbykpKQorCQlyZXR1cm4gMDsKKworCS8qIENoZWNrIGZvciBvdmVyZmxvdy4gKi8KKwlpZiAoci0+Y2ZnLmJ1cnN0ID09IDAKKwkgICAgfHwgdXNlcjJjcmVkaXRzKHItPmNmZy5hdmcgKiByLT5jZmcuYnVyc3QpIDwgCisJICAgIAkJCQl1c2VyMmNyZWRpdHMoci0+Y2ZnLmF2ZykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpcHRfaGFzaGxpbWl0OiBPdmVyZmxvdywgdHJ5IGxvd2VyOiAldS8ldVxuIiwKKwkJICAgICAgIHItPmNmZy5hdmcsIHItPmNmZy5idXJzdCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChyLT5jZmcubW9kZSA9PSAwIAorCSAgICB8fCByLT5jZmcubW9kZSA+IChJUFRfSEFTSExJTUlUX0hBU0hfRFBUCisJCSAgICAgICAgICB8SVBUX0hBU0hMSU1JVF9IQVNIX0RJUAorCQkJICB8SVBUX0hBU0hMSU1JVF9IQVNIX1NJUAorCQkJICB8SVBUX0hBU0hMSU1JVF9IQVNIX1NQVCkpCisJCXJldHVybiAwOworCisJaWYgKCFyLT5jZmcuZ2NfaW50ZXJ2YWwpCisJCXJldHVybiAwOworCQorCWlmICghci0+Y2ZnLmV4cGlyZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBUaGlzIGlzIHRoZSBiZXN0IHdlJ3ZlIGdvdDogV2UgY2Fubm90IHJlbGVhc2UgYW5kIHJlLWdyYWIgbG9jaywKKwkgKiBzaW5jZSBjaGVja2VudHJ5KCkgaXMgY2FsbGVkIGJlZm9yZSBpcF90YWJsZXMuYyBncmFicyBpcHRfbXV0ZXguICAKKwkgKiBXZSBhbHNvIGNhbm5vdCBncmFiIHRoZSBoYXNodGFibGUgc3BpbmxvY2ssIHNpbmNlIGh0YWJsZV9jcmVhdGUgd2lsbCAKKwkgKiBjYWxsIHZtYWxsb2MsIGFuZCB0aGF0IGNhbiBzbGVlcC4gIEFuZCB3ZSBjYW5ub3QganVzdCByZS1zZWFyY2gKKwkgKiB0aGUgbGlzdCBvZiBodGFibGUncyBpbiBodGFibGVfY3JlYXRlKCksIHNpbmNlIHRoZW4gd2Ugd291bGQKKwkgKiBjcmVhdGUgZHVwbGljYXRlIHByb2MgZmlsZXMuIC1IVyAqLworCWRvd24oJmhsaW1pdF9tdXRleCk7CisJci0+aGluZm8gPSBodGFibGVfZmluZF9nZXQoci0+bmFtZSk7CisJaWYgKCFyLT5oaW5mbyAmJiAoaHRhYmxlX2NyZWF0ZShyKSAhPSAwKSkgeworCQl1cCgmaGxpbWl0X211dGV4KTsKKwkJcmV0dXJuIDA7CisJfQorCXVwKCZobGltaXRfbXV0ZXgpOworCisJLyogVWdseSBoYWNrOiBGb3IgU01QLCB3ZSBvbmx5IHdhbnQgdG8gdXNlIG9uZSBzZXQgKi8KKwlyLT51Lm1hc3RlciA9IHI7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK2hhc2hsaW1pdF9kZXN0cm95KHZvaWQgKm1hdGNoaW5mbywgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSkKK3sKKwlzdHJ1Y3QgaXB0X2hhc2hsaW1pdF9pbmZvICpyID0gKHN0cnVjdCBpcHRfaGFzaGxpbWl0X2luZm8gKikgbWF0Y2hpbmZvOworCisJaHRhYmxlX3B1dChyLT5oaW5mbyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIGlwdF9oYXNobGltaXQgPSB7IAorCS5uYW1lID0gImhhc2hsaW1pdCIsIAorCS5tYXRjaCA9IGhhc2hsaW1pdF9tYXRjaCwgCisJLmNoZWNrZW50cnkgPSBoYXNobGltaXRfY2hlY2tlbnRyeSwgCisJLmRlc3Ryb3kgPSBoYXNobGltaXRfZGVzdHJveSwKKwkubWUgPSBUSElTX01PRFVMRSAKK307CisKKy8qIFBST0Mgc3R1ZmYgKi8KKworc3RhdGljIHZvaWQgKmRsX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gcy0+cHJpdmF0ZTsKKwlzdHJ1Y3QgaXB0X2hhc2hsaW1pdF9odGFibGUgKmh0YWJsZSA9IHBkZS0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgKmJ1Y2tldDsKKworCXNwaW5fbG9ja19iaCgmaHRhYmxlLT5sb2NrKTsKKwlpZiAoKnBvcyA+PSBodGFibGUtPmNmZy5zaXplKQorCQlyZXR1cm4gTlVMTDsKKworCWJ1Y2tldCA9IGttYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGludCksIEdGUF9BVE9NSUMpOworCWlmICghYnVja2V0KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCSpidWNrZXQgPSAqcG9zOworCXJldHVybiBidWNrZXQ7Cit9CisKK3N0YXRpYyB2b2lkICpkbF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gcy0+cHJpdmF0ZTsKKwlzdHJ1Y3QgaXB0X2hhc2hsaW1pdF9odGFibGUgKmh0YWJsZSA9IHBkZS0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgKmJ1Y2tldCA9ICh1bnNpZ25lZCBpbnQgKil2OworCisJKnBvcyA9ICsrKCpidWNrZXQpOworCWlmICgqcG9zID49IGh0YWJsZS0+Y2ZnLnNpemUpIHsKKwkJa2ZyZWUodik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gYnVja2V0OworfQorCitzdGF0aWMgdm9pZCBkbF9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBzLT5wcml2YXRlOworCXN0cnVjdCBpcHRfaGFzaGxpbWl0X2h0YWJsZSAqaHRhYmxlID0gcGRlLT5kYXRhOworCXVuc2lnbmVkIGludCAqYnVja2V0ID0gKHVuc2lnbmVkIGludCAqKXY7CisKKwlrZnJlZShidWNrZXQpOworCisJc3Bpbl91bmxvY2tfYmgoJmh0YWJsZS0+bG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRsX3NlcV9yZWFsX3Nob3coc3RydWN0IGRzdGhhc2hfZW50ICplbnQsIHN0cnVjdCBzZXFfZmlsZSAqcykKK3sKKwkvKiByZWNhbGN1bGF0ZSB0byBzaG93IGFjY3VyYXRlIG51bWJlcnMgKi8KKwlyYXRlaW5mb19yZWNhbGMoZW50LCBqaWZmaWVzKTsKKworCXJldHVybiBzZXFfcHJpbnRmKHMsICIlbGQgJXUuJXUuJXUuJXU6JXUtPiV1LiV1LiV1LiV1OiV1ICV1ICV1ICV1XG4iLAorCQkJKGxvbmcpKGVudC0+ZXhwaXJlcyAtIGppZmZpZXMpL0haLAorCQkJTklQUVVBRChlbnQtPmRzdC5zcmNfaXApLCBudG9ocyhlbnQtPmRzdC5zcmNfcG9ydCksCisJCQlOSVBRVUFEKGVudC0+ZHN0LmRzdF9pcCksIG50b2hzKGVudC0+ZHN0LmRzdF9wb3J0KSwKKwkJCWVudC0+cmF0ZWluZm8uY3JlZGl0LCBlbnQtPnJhdGVpbmZvLmNyZWRpdF9jYXAsCisJCQllbnQtPnJhdGVpbmZvLmNvc3QpOworfQorCitzdGF0aWMgaW50IGRsX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IHMtPnByaXZhdGU7CisJc3RydWN0IGlwdF9oYXNobGltaXRfaHRhYmxlICpodGFibGUgPSBwZGUtPmRhdGE7CisJdW5zaWduZWQgaW50ICpidWNrZXQgPSAodW5zaWduZWQgaW50ICopdjsKKwlzdHJ1Y3QgZHN0aGFzaF9lbnQgKmVudDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOworCisJaWYgKCFobGlzdF9lbXB0eSgmaHRhYmxlLT5oYXNoWypidWNrZXRdKSkKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnkoZW50LCBwb3MsICZodGFibGUtPmhhc2hbKmJ1Y2tldF0sIG5vZGUpIHsKKwkJCWlmIChkbF9zZXFfcmVhbF9zaG93KGVudCwgcykpIHsKKwkJCQkvKiBidWZmZXIgd2FzIGZpbGxlZCBhbmQgdW5hYmxlIHRvIHByaW50IHRoYXQgdHVwbGUgKi8KKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGRsX3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gZGxfc2VxX3N0YXJ0LAorCS5uZXh0ICA9IGRsX3NlcV9uZXh0LAorCS5zdG9wICA9IGRsX3NlcV9zdG9wLAorCS5zaG93ICA9IGRsX3NlcV9zaG93Cit9OworCitzdGF0aWMgaW50IGRsX3Byb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgcmV0ID0gc2VxX29wZW4oZmlsZSwgJmRsX3NlcV9vcHMpOworCisJaWYgKCFyZXQpIHsKKwkJc3RydWN0IHNlcV9maWxlICpzZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwkJc2YtPnByaXZhdGUgPSBQREUoaW5vZGUpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkbF9maWxlX29wcyA9IHsKKwkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gZGxfcHJvY19vcGVuLAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZQorfTsKKworc3RhdGljIGludCBpbml0X29yX2ZpbmkoaW50IGZpbmkpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZmluaSkKKwkJZ290byBjbGVhbnVwOworCisJaWYgKGlwdF9yZWdpc3Rlcl9tYXRjaCgmaXB0X2hhc2hsaW1pdCkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBjbGVhbnVwX25vdGhpbmc7CisJfQorCisJaGFzaGxpbWl0X2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJpcHRfaGFzaGxpbWl0IiwKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgZHN0aGFzaF9lbnQpLCAwLAorCQkJCQkgICAgMCwgTlVMTCwgTlVMTCk7CisJaWYgKCFoYXNobGltaXRfY2FjaGVwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGNyZWF0ZSBpcHRfaGFzaGxpbWl0IHNsYWIgY2FjaGVcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGNsZWFudXBfdW5yZWdfbWF0Y2g7CisJfQorCisJaGFzaGxpbWl0X3Byb2NkaXIgPSBwcm9jX21rZGlyKCJpcHRfaGFzaGxpbWl0IiwgcHJvY19uZXQpOworCWlmICghaGFzaGxpbWl0X3Byb2NkaXIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gY3JlYXRlIHByb2MgZGlyIGVudHJ5XG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBjbGVhbnVwX2ZyZWVfc2xhYjsKKwl9CisKKwlyZXR1cm4gcmV0OworCitjbGVhbnVwOgorCXJlbW92ZV9wcm9jX2VudHJ5KCJpcHRfaGFzaGxpbWl0IiwgcHJvY19uZXQpOworY2xlYW51cF9mcmVlX3NsYWI6CisJa21lbV9jYWNoZV9kZXN0cm95KGhhc2hsaW1pdF9jYWNoZXApOworY2xlYW51cF91bnJlZ19tYXRjaDoKKwlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmaXB0X2hhc2hsaW1pdCk7CitjbGVhbnVwX25vdGhpbmc6CisJcmV0dXJuIHJldDsKKwkKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCXJldHVybiBpbml0X29yX2ZpbmkoMCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaW5pdF9vcl9maW5pKDEpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9oZWxwZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaGVscGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmZGYzNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaGVscGVyLmMKQEAgLTAsMCArMSwxMTMgQEAKKy8qIGlwdGFibGVzIG1vZHVsZSB0byBtYXRjaCBvbiByZWxhdGVkIGNvbm5lY3Rpb25zICovCisvKgorICogKEMpIDIwMDEgTWFydGluIEpvc2Vmc3NvbiA8Z2FuZGFsZkB3bHVnLndlc3Riby5zZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICAgMTkgTWFyIDIwMDIgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz46CisgKiAgIAkJIC0gUG9ydCB0byBuZXduYXQgaW5mcmFzdHJ1Y3R1cmUKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2hlbHBlci5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJNYXJ0aW4gSm9zZWZzc29uIDxnYW5kYWxmQG5ldGZpbHRlci5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIGhlbHBlciBtYXRjaCBtb2R1bGUiKTsKKworI2lmIDAKKyNkZWZpbmUgREVCVUdQIHByaW50aworI2Vsc2UKKyNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCitzdGF0aWMgaW50CittYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgIGludCBvZmZzZXQsCisgICAgICBpbnQgKmhvdGRyb3ApCit7CisJY29uc3Qgc3RydWN0IGlwdF9oZWxwZXJfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKKwllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKKwlpbnQgcmV0ID0gaW5mby0+aW52ZXJ0OworCQorCWN0ID0gaXBfY29ubnRyYWNrX2dldCgoc3RydWN0IHNrX2J1ZmYgKilza2IsICZjdGluZm8pOworCWlmICghY3QpIHsKKwkJREVCVUdQKCJpcHRfaGVscGVyOiBFZWshIGludmFsaWQgY29ubnRyYWNrP1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCFjdC0+bWFzdGVyKSB7CisJCURFQlVHUCgiaXB0X2hlbHBlcjogY29ubnRyYWNrICVwIGhhcyBubyBtYXN0ZXJcbiIsIGN0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlSRUFEX0xPQ0soJmlwX2Nvbm50cmFja19sb2NrKTsKKwlpZiAoIWN0LT5tYXN0ZXItPmhlbHBlcikgeworCQlERUJVR1AoImlwdF9oZWxwZXI6IG1hc3RlciBjdCAlcCBoYXMgbm8gaGVscGVyXG4iLCAKKwkJCWV4cC0+ZXhwZWN0YW50KTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCURFQlVHUCgibWFzdGVyJ3MgbmFtZSA9ICVzICwgaW5mby0+bmFtZSA9ICVzXG4iLCAKKwkJY3QtPm1hc3Rlci0+aGVscGVyLT5uYW1lLCBpbmZvLT5uYW1lKTsKKworCWlmIChpbmZvLT5uYW1lWzBdID09ICdcMCcpCisJCXJldCBePSAxOworCWVsc2UKKwkJcmV0IF49ICFzdHJuY21wKGN0LT5tYXN0ZXItPmhlbHBlci0+bmFtZSwgaW5mby0+bmFtZSwgCisJCSAgICAgICAgICAgICAgICBzdHJsZW4oY3QtPm1hc3Rlci0+aGVscGVyLT5uYW1lKSk7CitvdXRfdW5sb2NrOgorCVJFQURfVU5MT0NLKCZpcF9jb25udHJhY2tfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJCSBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkJIHZvaWQgKm1hdGNoaW5mbywKKwkJIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisJCSB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCXN0cnVjdCBpcHRfaGVscGVyX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisKKwlpbmZvLT5uYW1lWzI5XSA9ICdcMCc7CisKKwkvKiB2ZXJpZnkgc2l6ZSAqLworCWlmIChtYXRjaHNpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X2hlbHBlcl9pbmZvKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIGhlbHBlcl9tYXRjaCA9IHsKKwkubmFtZQkJPSAiaGVscGVyIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmNoZWNrLAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwluZWVkX2lwX2Nvbm50cmFjaygpOworCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJmhlbHBlcl9tYXRjaCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaXB0X3VucmVnaXN0ZXJfbWF0Y2goJmhlbHBlcl9tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CisKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaXByYW5nZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9pcHJhbmdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgzNWI3YgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaXByYW5nZS5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBpcHRhYmxlcyBtb2R1bGUgdG8gbWF0Y2ggSVAgYWRkcmVzcyByYW5nZXMKKyAqCisgKiAoQykgMjAwMyBKb3pzZWYgS2FkbGVjc2lrIDxrYWRsZWNAYmxhY2tob2xlLmtma2kuaHU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2lwcmFuZ2UuaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiSm96c2VmIEthZGxlY3NpayA8a2FkbGVjQGJsYWNraG9sZS5rZmtpLmh1PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBhcmJpdHJhcnkgSVAgcmFuZ2UgbWF0Y2ggbW9kdWxlIik7CisKKyNpZiAwCisjZGVmaW5lIERFQlVHUCBwcmludGsKKyNlbHNlCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworc3RhdGljIGludAorbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisgICAgICBpbnQgb2Zmc2V0LCBpbnQgKmhvdGRyb3ApCit7CisJY29uc3Qgc3RydWN0IGlwdF9pcHJhbmdlX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKworCWlmIChpbmZvLT5mbGFncyAmIElQUkFOR0VfU1JDKSB7CisJCWlmICgoKG50b2hsKGlwaC0+c2FkZHIpIDwgbnRvaGwoaW5mby0+c3JjLm1pbl9pcCkpCisJCQkgIHx8IChudG9obChpcGgtPnNhZGRyKSA+IG50b2hsKGluZm8tPnNyYy5tYXhfaXApKSkKKwkJCSBeICEhKGluZm8tPmZsYWdzICYgSVBSQU5HRV9TUkNfSU5WKSkgeworCQkJREVCVUdQKCJzcmMgSVAgJXUuJXUuJXUuJXUgTk9UIGluIHJhbmdlICVzIgorCQkJICAgICAgICIldS4ldS4ldS4ldS0ldS4ldS4ldS4ldVxuIiwKKwkJCQlOSVBRVUFEKGlwaC0+c2FkZHIpLAorCQkJICAgICAgICBpbmZvLT5mbGFncyAmIElQUkFOR0VfU1JDX0lOViA/ICIoSU5WKSAiIDogIiIsCisJCQkJTklQUVVBRChpbmZvLT5zcmMubWluX2lwKSwKKwkJCQlOSVBRVUFEKGluZm8tPnNyYy5tYXhfaXApKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWlmIChpbmZvLT5mbGFncyAmIElQUkFOR0VfRFNUKSB7CisJCWlmICgoKG50b2hsKGlwaC0+ZGFkZHIpIDwgbnRvaGwoaW5mby0+ZHN0Lm1pbl9pcCkpCisJCQkgIHx8IChudG9obChpcGgtPmRhZGRyKSA+IG50b2hsKGluZm8tPmRzdC5tYXhfaXApKSkKKwkJCSBeICEhKGluZm8tPmZsYWdzICYgSVBSQU5HRV9EU1RfSU5WKSkgeworCQkJREVCVUdQKCJkc3QgSVAgJXUuJXUuJXUuJXUgTk9UIGluIHJhbmdlICVzIgorCQkJICAgICAgICIldS4ldS4ldS4ldS0ldS4ldS4ldS4ldVxuIiwKKwkJCQlOSVBRVUFEKGlwaC0+ZGFkZHIpLAorCQkJICAgICAgICBpbmZvLT5mbGFncyAmIElQUkFOR0VfRFNUX0lOViA/ICIoSU5WKSAiIDogIiIsCisJCQkJTklQUVVBRChpbmZvLT5kc3QubWluX2lwKSwKKwkJCQlOSVBRVUFEKGluZm8tPmRzdC5tYXhfaXApKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkJIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCQkgdm9pZCAqbWF0Y2hpbmZvLAorCQkgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkJIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJLyogdmVyaWZ5IHNpemUgKi8KKwlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9pcHJhbmdlX2luZm8pKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggaXByYW5nZV9tYXRjaCA9IAoreyAKKwkubGlzdCA9IHsgTlVMTCwgTlVMTCB9LCAKKwkubmFtZSA9ICJpcHJhbmdlIiwgCisJLm1hdGNoID0gJm1hdGNoLCAKKwkuY2hlY2tlbnRyeSA9ICZjaGVjaywgCisJLmRlc3Ryb3kgPSBOVUxMLCAKKwkubWUgPSBUSElTX01PRFVMRQorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJmlwcmFuZ2VfbWF0Y2gpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZpcHJhbmdlX21hdGNoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfbGVuZ3RoLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2xlbmd0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYWJjZmIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2xlbmd0aC5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qIEtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggcGFja2V0IGxlbmd0aC4gKi8KKy8qIChDKSAxOTk5LTIwMDEgSmFtZXMgTW9ycmlzIDxqbW9ycm9zQGludGVyY29kZS5jb20uYXU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbGVuZ3RoLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisKK01PRFVMRV9BVVRIT1IoIkphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJUCB0YWJsZXMgcGFja2V0IGxlbmd0aCBtYXRjaGluZyBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludAorbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisgICAgICBpbnQgb2Zmc2V0LAorICAgICAgaW50ICpob3Rkcm9wKQoreworCWNvbnN0IHN0cnVjdCBpcHRfbGVuZ3RoX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJdV9pbnQxNl90IHBrdGxlbiA9IG50b2hzKHNrYi0+bmguaXBoLT50b3RfbGVuKTsKKwkKKwlyZXR1cm4gKHBrdGxlbiA+PSBpbmZvLT5taW4gJiYgcGt0bGVuIDw9IGluZm8tPm1heCkgXiBpbmZvLT5pbnZlcnQ7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKyAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWlmIChtYXRjaHNpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X2xlbmd0aF9pbmZvKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIGxlbmd0aF9tYXRjaCA9IHsKKwkubmFtZQkJPSAibGVuZ3RoIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJmxlbmd0aF9tYXRjaCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaXB0X3VucmVnaXN0ZXJfbWF0Y2goJmxlbmd0aF9tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2xpbWl0LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2xpbWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMyNGRjYwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfbGltaXQuYwpAQCAtMCwwICsxLDE1NyBAQAorLyogS2VybmVsIG1vZHVsZSB0byBjb250cm9sIHRoZSByYXRlCisgKgorICogMiBTZXB0ZW1iZXIgMTk5OTogQ2hhbmdlZCBmcm9tIHRoZSB0YXJnZXQgUkFURSB0byB0aGUgbWF0Y2gKKyAqICAgICAgICAgICAgICAgICAgIGBsaW1pdCcsIHJlbW92ZWQgbG9nZ2luZy4gIERpZCBJIG1lbnRpb24gdGhhdAorICogICAgICAgICAgICAgICAgICAgQWxleGV5IGlzIGEgZnVja2luZyBnZW5pdXM/CisgKiAgICAgICAgICAgICAgICAgICBSdXN0eSBSdXNzZWxsIChydXN0eUBydXN0Y29ycC5jb20uYXUpLiAgKi8KKworLyogKEMpIDE5OTkgSuly9G1lIGRlIFZpdmllIDxkZXZpdmllQGluZm8uZW5zZXJiLnUtYm9yZGVhdXguZnI+CisgKiAoQykgMTk5OSBIZXJ26SBFeWNoZW5uZSA8ZXljaGVubmVAaW5mby5lbnNlcmIudS1ib3JkZWF1eC5mcj4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2xpbWl0Lmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkhlcnZlIEV5Y2hlbm5lIDxydkB3YWxsZmlyZS5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIHJhdGUgbGltaXQgbWF0Y2giKTsKKworLyogVGhlIGFsZ29yaXRobSB1c2VkIGlzIHRoZSBTaW1wbGUgVG9rZW4gQnVja2V0IEZpbHRlciAoVEJGKQorICogc2VlIG5ldC9zY2hlZC9zY2hfdGJmLmMgaW4gdGhlIGxpbnV4IHNvdXJjZSB0cmVlCisgKi8KKworc3RhdGljIERFRklORV9TUElOTE9DSyhsaW1pdF9sb2NrKTsKKworLyogUnVzdHk6IFRoaXMgaXMgbXkgKG5vbi1tYXRoZW1hdGljYWxseS1pbmNsaW5lZCkgdW5kZXJzdGFuZGluZyBvZgorICAgdGhpcyBhbGdvcml0aG0uICBUaGUgYGF2ZXJhZ2UgcmF0ZScgaW4gamlmZmllcyBiZWNvbWVzIHlvdXIgaW5pdGlhbAorICAgYW1vdW50IG9mIGNyZWRpdCBgY3JlZGl0JyBhbmQgdGhlIG1vc3QgY3JlZGl0IHlvdSBjYW4gZXZlciBoYXZlCisgICBgY3JlZGl0X2NhcCcuICBUaGUgYHBlYWsgcmF0ZScgYmVjb21lcyB0aGUgY29zdCBvZiBwYXNzaW5nIHRoZQorICAgdGVzdCwgYGNvc3QnLgorCisgICBgcHJldicgdHJhY2tzIHRoZSBsYXN0IHBhY2tldCBoaXQ6IHlvdSBnYWluIG9uZSBjcmVkaXQgcGVyIGppZmZ5LgorICAgSWYgeW91IGdldCBjcmVkaXQgYmFsYW5jZSBtb3JlIHRoYW4gdGhpcywgdGhlIGV4dHJhIGNyZWRpdCBpcworICAgZGlzY2FyZGVkLiAgRXZlcnkgdGltZSB0aGUgbWF0Y2ggcGFzc2VzLCB5b3UgbG9zZSBgY29zdCcgY3JlZGl0czsKKyAgIGlmIHlvdSBkb24ndCBoYXZlIHRoYXQgbWFueSwgdGhlIHRlc3QgZmFpbHMuCisKKyAgIFNlZSBBbGV4ZXkncyBmb3JtYWwgZXhwbGFuYXRpb24gaW4gbmV0L3NjaGVkL3NjaF90YmYuYy4KKworICAgVG8gZ2V0IHRoZSBtYXhtdW0gcmFuZ2UsIHdlIG11bHRpcGx5IGJ5IHRoaXMgZmFjdG9yIChpZS4geW91IGdldCBOCisgICBjcmVkaXRzIHBlciBqaWZmeSkuICBXZSB3YW50IHRvIGFsbG93IGEgcmF0ZSBhcyBsb3cgYXMgMSBwZXIgZGF5CisgICAoc2xvd2VzdCB1c2Vyc3BhY2UgdG9vbCBhbGxvd3MpLCB3aGljaCBtZWFucworICAgQ1JFRElUU19QRVJfSklGRlkqSFoqNjAqNjAqMjQgPCAyXjMyLiBpZS4gKi8KKyNkZWZpbmUgTUFYX0NQSiAoMHhGRkZGRkZGRiAvIChIWio2MCo2MCoyNCkpCisKKy8qIFJlcGVhdGVkIHNoaWZ0IGFuZCBvciBnaXZlcyB1cyBhbGwgMXMsIGZpbmFsIHNoaWZ0IGFuZCBhZGQgMSBnaXZlcworICogdXMgdGhlIHBvd2VyIG9mIDIgYmVsb3cgdGhlIHRoZW9yZXRpY2FsIG1heCwgc28gR0NDIHNpbXBseSBkb2VzIGEKKyAqIHNoaWZ0LiAqLworI2RlZmluZSBfUE9XMl9CRUxPVzIoeCkgKCh4KXwoKHgpPj4xKSkKKyNkZWZpbmUgX1BPVzJfQkVMT1c0KHgpIChfUE9XMl9CRUxPVzIoeCl8X1BPVzJfQkVMT1cyKCh4KT4+MikpCisjZGVmaW5lIF9QT1cyX0JFTE9XOCh4KSAoX1BPVzJfQkVMT1c0KHgpfF9QT1cyX0JFTE9XNCgoeCk+PjQpKQorI2RlZmluZSBfUE9XMl9CRUxPVzE2KHgpIChfUE9XMl9CRUxPVzgoeCl8X1BPVzJfQkVMT1c4KCh4KT4+OCkpCisjZGVmaW5lIF9QT1cyX0JFTE9XMzIoeCkgKF9QT1cyX0JFTE9XMTYoeCl8X1BPVzJfQkVMT1cxNigoeCk+PjE2KSkKKyNkZWZpbmUgUE9XMl9CRUxPVzMyKHgpICgoX1BPVzJfQkVMT1czMih4KT4+MSkgKyAxKQorCisjZGVmaW5lIENSRURJVFNfUEVSX0pJRkZZIFBPVzJfQkVMT1czMihNQVhfQ1BKKQorCitzdGF0aWMgaW50CitpcHRfbGltaXRfbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQljb25zdCB2b2lkICptYXRjaGluZm8sCisJCWludCBvZmZzZXQsCisJCWludCAqaG90ZHJvcCkKK3sKKwlzdHJ1Y3QgaXB0X3JhdGVpbmZvICpyID0gKChzdHJ1Y3QgaXB0X3JhdGVpbmZvICopbWF0Y2hpbmZvKS0+bWFzdGVyOworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKworCXNwaW5fbG9ja19iaCgmbGltaXRfbG9jayk7CisJci0+Y3JlZGl0ICs9IChub3cgLSB4Y2hnKCZyLT5wcmV2LCBub3cpKSAqIENSRURJVFNfUEVSX0pJRkZZOworCWlmIChyLT5jcmVkaXQgPiByLT5jcmVkaXRfY2FwKQorCQlyLT5jcmVkaXQgPSByLT5jcmVkaXRfY2FwOworCisJaWYgKHItPmNyZWRpdCA+PSByLT5jb3N0KSB7CisJCS8qIFdlJ3JlIG5vdCBsaW1pdGVkLiAqLworCQlyLT5jcmVkaXQgLT0gci0+Y29zdDsKKwkJc3Bpbl91bmxvY2tfYmgoJmxpbWl0X2xvY2spOworCQlyZXR1cm4gMTsKKwl9CisKKyAgICAgICAJc3Bpbl91bmxvY2tfYmgoJmxpbWl0X2xvY2spOworCXJldHVybiAwOworfQorCisvKiBQcmVjaXNpb24gc2F2ZXIuICovCitzdGF0aWMgdV9pbnQzMl90Cit1c2VyMmNyZWRpdHModV9pbnQzMl90IHVzZXIpCit7CisJLyogSWYgbXVsdGlwbHlpbmcgd291bGQgb3ZlcmZsb3cuLi4gKi8KKwlpZiAodXNlciA+IDB4RkZGRkZGRkYgLyAoSFoqQ1JFRElUU19QRVJfSklGRlkpKQorCQkvKiBEaXZpZGUgZmlyc3QuICovCisJCXJldHVybiAodXNlciAvIElQVF9MSU1JVF9TQ0FMRSkgKiBIWiAqIENSRURJVFNfUEVSX0pJRkZZOworCisJcmV0dXJuICh1c2VyICogSFogKiBDUkVESVRTX1BFUl9KSUZGWSkgLyBJUFRfTElNSVRfU0NBTEU7Cit9CisKK3N0YXRpYyBpbnQKK2lwdF9saW1pdF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkJICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkJICAgICB2b2lkICptYXRjaGluZm8sCisJCSAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkJICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCXN0cnVjdCBpcHRfcmF0ZWluZm8gKnIgPSBtYXRjaGluZm87CisKKwlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9yYXRlaW5mbykpKQorCQlyZXR1cm4gMDsKKworCS8qIENoZWNrIGZvciBvdmVyZmxvdy4gKi8KKwlpZiAoci0+YnVyc3QgPT0gMAorCSAgICB8fCB1c2VyMmNyZWRpdHMoci0+YXZnICogci0+YnVyc3QpIDwgdXNlcjJjcmVkaXRzKHItPmF2ZykpIHsKKwkJcHJpbnRrKCJPdmVyZmxvdyBpbiBpcHRfbGltaXQsIHRyeSBsb3dlcjogJXUvJXVcbiIsCisJCSAgICAgICByLT5hdmcsIHItPmJ1cnN0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogVXNlciBhdmcgaW4gc2Vjb25kcyAqIElQVF9MSU1JVF9TQ0FMRTogY29udmVydCB0byBqaWZmaWVzICoKKwkgICAxMjguICovCisJci0+cHJldiA9IGppZmZpZXM7CisJci0+Y3JlZGl0ID0gdXNlcjJjcmVkaXRzKHItPmF2ZyAqIHItPmJ1cnN0KTsJIC8qIENyZWRpdHMgZnVsbC4gKi8KKwlyLT5jcmVkaXRfY2FwID0gdXNlcjJjcmVkaXRzKHItPmF2ZyAqIHItPmJ1cnN0KTsgLyogQ3JlZGl0cyBmdWxsLiAqLworCXItPmNvc3QgPSB1c2VyMmNyZWRpdHMoci0+YXZnKTsKKworCS8qIEZvciBTTVAsIHdlIG9ubHkgd2FudCB0byB1c2Ugb25lIHNldCBvZiBjb3VudGVycy4gKi8KKwlyLT5tYXN0ZXIgPSByOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIGlwdF9saW1pdF9yZWcgPSB7CisJLm5hbWUJCT0gImxpbWl0IiwKKwkubWF0Y2gJCT0gaXB0X2xpbWl0X21hdGNoLAorCS5jaGVja2VudHJ5CT0gaXB0X2xpbWl0X2NoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWlmIChpcHRfcmVnaXN0ZXJfbWF0Y2goJmlwdF9saW1pdF9yZWcpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmaXB0X2xpbWl0X3JlZyk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X21hYy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9tYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWE0NTllCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9tYWMuYwpAQCAtMCwwICsxLDc5IEBACisvKiBLZXJuZWwgbW9kdWxlIHRvIG1hdGNoIE1BQyBhZGRyZXNzIHBhcmFtZXRlcnMuICovCisKKy8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKKyAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X21hYy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBtYWMgbWF0Y2hpbmcgbW9kdWxlIik7CisKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIGludCAqaG90ZHJvcCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgaXB0X21hY19pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCisgICAgLyogSXMgbWFjIHBvaW50ZXIgdmFsaWQ/ICovCisgICAgcmV0dXJuIChza2ItPm1hYy5yYXcgPj0gc2tiLT5oZWFkCisJICAgICYmIChza2ItPm1hYy5yYXcgKyBFVEhfSExFTikgPD0gc2tiLT5kYXRhCisJICAgIC8qIElmIHNvLCBjb21wYXJlLi4uICovCisJICAgICYmICgobWVtY21wKGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UsIGluZm8tPnNyY2FkZHIsIEVUSF9BTEVOKQorCQk9PSAwKSBeIGluZm8tPmludmVydCkpOworfQorCitzdGF0aWMgaW50CitpcHRfbWFjX2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCQkgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkJICAgdm9pZCAqbWF0Y2hpbmZvLAorCQkgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorCQkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCS8qIEZPUldBUkQgaXNuJ3QgYWx3YXlzIHZhbGlkLCBidXQgaXQncyBuaWNlIHRvIGJlIGFibGUgdG8gZG8gLS1SUiAqLworCWlmIChob29rX21hc2sKKwkgICAgJiB+KCgxIDw8IE5GX0lQX1BSRV9ST1VUSU5HKSB8ICgxIDw8IE5GX0lQX0xPQ0FMX0lOKQorCQl8ICgxIDw8IE5GX0lQX0ZPUldBUkQpKSkgeworCQlwcmludGsoImlwdF9tYWM6IG9ubHkgdmFsaWQgZm9yIFBSRV9ST1VUSU5HLCBMT0NBTF9JTiBvciBGT1JXQVJELlxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChtYXRjaHNpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X21hY19pbmZvKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIG1hY19tYXRjaCA9IHsKKwkubmFtZQkJPSAibWFjIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmlwdF9tYWNfY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmbWFjX21hdGNoKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmbWFjX21hdGNoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfbWFyay5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9tYXJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk1NTcyOAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfbWFyay5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qIEtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggTkZNQVJLIHZhbHVlcy4gKi8KKworLyogKEMpIDE5OTktMjAwMSBNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9tYXJrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBtYXJrIG1hdGNoaW5nIG1vZHVsZSIpOworCitzdGF0aWMgaW50CittYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgIGludCBvZmZzZXQsCisgICAgICBpbnQgKmhvdGRyb3ApCit7CisJY29uc3Qgc3RydWN0IGlwdF9tYXJrX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisKKwlyZXR1cm4gKChza2ItPm5mbWFyayAmIGluZm8tPm1hc2spID09IGluZm8tPm1hcmspIF4gaW5mby0+aW52ZXJ0OworfQorCitzdGF0aWMgaW50CitjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKyAgICAgICAgICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisgICAgICAgICAgIHZvaWQgKm1hdGNoaW5mbywKKyAgICAgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKyAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9tYXJrX2luZm8pKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggbWFya19tYXRjaCA9IHsKKwkubmFtZQkJPSAibWFyayIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZtYXJrX21hdGNoKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmbWFya19tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X211bHRpcG9ydC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9tdWx0aXBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWU4MTg4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9tdWx0aXBvcnQuYwpAQCAtMCwwICsxLDIxMiBAQAorLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBvbmUgb2YgYSBsaXN0IG9mIFRDUC9VRFAgcG9ydHM6IHBvcnRzIGFyZSBpbgorICAgdGhlIHNhbWUgcGxhY2Ugc28gd2UgY2FuIHRyZWF0IHRoZW0gYXMgZXF1YWwuICovCisKKy8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKKyAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X211bHRpcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBtdWx0aXBsZSBwb3J0IG1hdGNoIG1vZHVsZSIpOworCisjaWYgMAorI2RlZmluZSBkdXByaW50Zihmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgZHVwcmludGYoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKy8qIFJldHVybnMgMSBpZiB0aGUgcG9ydCBpcyBtYXRjaGVkIGJ5IHRoZSB0ZXN0LCAwIG90aGVyd2lzZS4gKi8KK3N0YXRpYyBpbmxpbmUgaW50Citwb3J0c19tYXRjaChjb25zdCB1X2ludDE2X3QgKnBvcnRsaXN0LCBlbnVtIGlwdF9tdWx0aXBvcnRfZmxhZ3MgZmxhZ3MsCisJICAgIHVfaW50OF90IGNvdW50LCB1X2ludDE2X3Qgc3JjLCB1X2ludDE2X3QgZHN0KQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaT0wOyBpPGNvdW50OyBpKyspIHsKKwkJaWYgKGZsYWdzICE9IElQVF9NVUxUSVBPUlRfREVTVElOQVRJT04KKwkJICAgICYmIHBvcnRsaXN0W2ldID09IHNyYykKKwkJCXJldHVybiAxOworCisJCWlmIChmbGFncyAhPSBJUFRfTVVMVElQT1JUX1NPVVJDRQorCQkgICAgJiYgcG9ydGxpc3RbaV0gPT0gZHN0KQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybnMgMSBpZiB0aGUgcG9ydCBpcyBtYXRjaGVkIGJ5IHRoZSB0ZXN0LCAwIG90aGVyd2lzZS4gKi8KK3N0YXRpYyBpbmxpbmUgaW50Citwb3J0c19tYXRjaF92MShjb25zdCBzdHJ1Y3QgaXB0X211bHRpcG9ydF92MSAqbWluZm8sCisJICAgICAgIHVfaW50MTZfdCBzcmMsIHVfaW50MTZfdCBkc3QpCit7CisJdW5zaWduZWQgaW50IGk7CisJdV9pbnQxNl90IHMsIGU7CisKKwlmb3IgKGk9MDsgaSA8IG1pbmZvLT5jb3VudDsgaSsrKSB7CisJCXMgPSBtaW5mby0+cG9ydHNbaV07CisKKwkJaWYgKG1pbmZvLT5wZmxhZ3NbaV0pIHsKKwkJCS8qIHJhbmdlIHBvcnQgbWF0Y2hpbmcgKi8KKwkJCWUgPSBtaW5mby0+cG9ydHNbKytpXTsKKwkJCWR1cHJpbnRmKCJzcmMgb3IgZHN0IG1hdGNoZXMgd2l0aCAlZC0lZD9cbiIsIHMsIGUpOworCisJCQlpZiAobWluZm8tPmZsYWdzID09IElQVF9NVUxUSVBPUlRfU09VUkNFCisJCQkgICAgJiYgc3JjID49IHMgJiYgc3JjIDw9IGUpCisJCQkJcmV0dXJuIDEgXiBtaW5mby0+aW52ZXJ0OworCQkJaWYgKG1pbmZvLT5mbGFncyA9PSBJUFRfTVVMVElQT1JUX0RFU1RJTkFUSU9OCisJCQkgICAgJiYgZHN0ID49IHMgJiYgZHN0IDw9IGUpCisJCQkJcmV0dXJuIDEgXiBtaW5mby0+aW52ZXJ0OworCQkJaWYgKG1pbmZvLT5mbGFncyA9PSBJUFRfTVVMVElQT1JUX0VJVEhFUgorCQkJICAgICYmICgoZHN0ID49IHMgJiYgZHN0IDw9IGUpCisJCQkJfHwgKHNyYyA+PSBzICYmIHNyYyA8PSBlKSkpCisJCQkJcmV0dXJuIDEgXiBtaW5mby0+aW52ZXJ0OworCQl9IGVsc2UgeworCQkJLyogZXhhY3QgcG9ydCBtYXRjaGluZyAqLworCQkJZHVwcmludGYoInNyYyBvciBkc3QgbWF0Y2hlcyB3aXRoICVkP1xuIiwgcyk7CisKKwkJCWlmIChtaW5mby0+ZmxhZ3MgPT0gSVBUX01VTFRJUE9SVF9TT1VSQ0UKKwkJCSAgICAmJiBzcmMgPT0gcykKKwkJCQlyZXR1cm4gMSBeIG1pbmZvLT5pbnZlcnQ7CisJCQlpZiAobWluZm8tPmZsYWdzID09IElQVF9NVUxUSVBPUlRfREVTVElOQVRJT04KKwkJCSAgICAmJiBkc3QgPT0gcykKKwkJCQlyZXR1cm4gMSBeIG1pbmZvLT5pbnZlcnQ7CisJCQlpZiAobWluZm8tPmZsYWdzID09IElQVF9NVUxUSVBPUlRfRUlUSEVSCisJCQkgICAgJiYgKHNyYyA9PSBzIHx8IGRzdCA9PSBzKSkKKwkJCQlyZXR1cm4gMSBeIG1pbmZvLT5pbnZlcnQ7CisJCX0KKwl9CisgCisgCXJldHVybiBtaW5mby0+aW52ZXJ0OworfQorCitzdGF0aWMgaW50CittYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgIGludCBvZmZzZXQsCisgICAgICBpbnQgKmhvdGRyb3ApCit7CisJdTE2IF9wb3J0c1syXSwgKnBwdHI7CisJY29uc3Qgc3RydWN0IGlwdF9tdWx0aXBvcnQgKm11bHRpaW5mbyA9IG1hdGNoaW5mbzsKKworCWlmIChvZmZzZXQpCisJCXJldHVybiAwOworCisJcHB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYi0+bmguaXBoLT5paGwgKiA0LAorCQkJCSAgc2l6ZW9mKF9wb3J0cyksIF9wb3J0cyk7CisJaWYgKHBwdHIgPT0gTlVMTCkgeworCQkvKiBXZSd2ZSBiZWVuIGFza2VkIHRvIGV4YW1pbmUgdGhpcyBwYWNrZXQsIGFuZCB3ZQorCQkgKiBjYW4ndC4gIEhlbmNlLCBubyBjaG9pY2UgYnV0IHRvIGRyb3AuCisJCSAqLworCQlkdXByaW50ZigiaXB0X211bHRpcG9ydDoiCisJCQkgIiBEcm9wcGluZyBldmlsIG9mZnNldD0wIHRpbnlncmFtLlxuIik7CisJCSpob3Rkcm9wID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHBvcnRzX21hdGNoKG11bHRpaW5mby0+cG9ydHMsCisJCQkgICBtdWx0aWluZm8tPmZsYWdzLCBtdWx0aWluZm8tPmNvdW50LAorCQkJICAgbnRvaHMocHB0clswXSksIG50b2hzKHBwdHJbMV0pKTsKK30KKworc3RhdGljIGludAorbWF0Y2hfdjEoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSBjb25zdCB2b2lkICptYXRjaGluZm8sCisJIGludCBvZmZzZXQsCisJIGludCAqaG90ZHJvcCkKK3sKKwl1MTYgX3BvcnRzWzJdLCAqcHB0cjsKKwljb25zdCBzdHJ1Y3QgaXB0X211bHRpcG9ydF92MSAqbXVsdGlpbmZvID0gbWF0Y2hpbmZvOworCisJaWYgKG9mZnNldCkKKwkJcmV0dXJuIDA7CisKKwlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2tiLT5uaC5pcGgtPmlobCAqIDQsCisJCQkJICBzaXplb2YoX3BvcnRzKSwgX3BvcnRzKTsKKwlpZiAocHB0ciA9PSBOVUxMKSB7CisJCS8qIFdlJ3ZlIGJlZW4gYXNrZWQgdG8gZXhhbWluZSB0aGlzIHBhY2tldCwgYW5kIHdlCisJCSAqIGNhbid0LiAgSGVuY2UsIG5vIGNob2ljZSBidXQgdG8gZHJvcC4KKwkJICovCisJCWR1cHJpbnRmKCJpcHRfbXVsdGlwb3J0OiIKKwkJCSAiIERyb3BwaW5nIGV2aWwgb2Zmc2V0PTAgdGlueWdyYW0uXG4iKTsKKwkJKmhvdGRyb3AgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gcG9ydHNfbWF0Y2hfdjEobXVsdGlpbmZvLCBudG9ocyhwcHRyWzBdKSwgbnRvaHMocHB0clsxXSkpOworfQorCisvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCitzdGF0aWMgaW50CitjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkgICB2b2lkICptYXRjaGluZm8sCisJICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCXJldHVybiAobWF0Y2hzaXplID09IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9tdWx0aXBvcnQpKSk7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrZW50cnlfdjEoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCSAgICAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCSAgICAgIHZvaWQgKm1hdGNoaW5mbywKKwkgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJcmV0dXJuIChtYXRjaHNpemUgPT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X211bHRpcG9ydF92MSkpKTsKK30KKworc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggbXVsdGlwb3J0X21hdGNoID0geworCS5uYW1lCQk9ICJtdWx0aXBvcnQiLAorCS5yZXZpc2lvbgk9IDAsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIG11bHRpcG9ydF9tYXRjaF92MSA9IHsKKwkubmFtZQkJPSAibXVsdGlwb3J0IiwKKwkucmV2aXNpb24JPSAxLAorCS5tYXRjaAkJPSAmbWF0Y2hfdjEsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeV92MSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCWVyciA9IGlwdF9yZWdpc3Rlcl9tYXRjaCgmbXVsdGlwb3J0X21hdGNoKTsKKwlpZiAoIWVycikgeworCQllcnIgPSBpcHRfcmVnaXN0ZXJfbWF0Y2goJm11bHRpcG9ydF9tYXRjaF92MSk7CisJCWlmIChlcnIpCisJCQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmbXVsdGlwb3J0X21hdGNoKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZtdWx0aXBvcnRfbWF0Y2gpOworCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZtdWx0aXBvcnRfbWF0Y2hfdjEpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9vd25lci5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9vd25lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOTA2NWUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X293bmVyLmMKQEAgLTAsMCArMSwyMTcgQEAKKy8qIEtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggdmFyaW91cyB0aGluZ3MgdGllZCB0byBzb2NrZXRzIGFzc29jaWF0ZWQgd2l0aAorICAgbG9jYWxseSBnZW5lcmF0ZWQgb3V0Z29pbmcgcGFja2V0cy4gKi8KKworLyogKEMpIDIwMDAgTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfb3duZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIG93bmVyIG1hdGNoIik7CisKK3N0YXRpYyBpbnQKK21hdGNoX2NvbW0oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3QgY2hhciAqY29tbSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmcsICpwOworCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzOworCWludCBpOworCisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlkb19lYWNoX3RocmVhZChnLCBwKSB7CisJCWlmKHN0cm5jbXAocC0+Y29tbSwgY29tbSwgc2l6ZW9mKHAtPmNvbW0pKSkKKwkJCWNvbnRpbnVlOworCisJCXRhc2tfbG9jayhwKTsKKwkJZmlsZXMgPSBwLT5maWxlczsKKwkJaWYoZmlsZXMpIHsKKwkJCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCQlmb3IgKGk9MDsgaSA8IGZpbGVzLT5tYXhfZmRzOyBpKyspIHsKKwkJCQlpZiAoZmNoZWNrX2ZpbGVzKGZpbGVzLCBpKSA9PQorCQkJCSAgICBza2ItPnNrLT5za19zb2NrZXQtPmZpbGUpIHsKKwkJCQkJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCQkJCQl0YXNrX3VubG9jayhwKTsKKwkJCQkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCQkJCQlyZXR1cm4gMTsKKwkJCQl9CisJCQl9CisJCQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCX0KKwkJdGFza191bmxvY2socCk7CisJfSB3aGlsZV9lYWNoX3RocmVhZChnLCBwKTsKKwlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK21hdGNoX3BpZChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBwaWRfdCBwaWQpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwOworCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzOworCWludCBpOworCisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlwID0gZmluZF90YXNrX2J5X3BpZChwaWQpOworCWlmICghcCkKKwkJZ290byBvdXQ7CisJdGFza19sb2NrKHApOworCWZpbGVzID0gcC0+ZmlsZXM7CisJaWYoZmlsZXMpIHsKKwkJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJZm9yIChpPTA7IGkgPCBmaWxlcy0+bWF4X2ZkczsgaSsrKSB7CisJCQlpZiAoZmNoZWNrX2ZpbGVzKGZpbGVzLCBpKSA9PQorCQkJICAgIHNrYi0+c2stPnNrX3NvY2tldC0+ZmlsZSkgeworCQkJCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJCQl0YXNrX3VubG9jayhwKTsKKwkJCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCX0KKwl0YXNrX3VubG9jayhwKTsKK291dDoKKwlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK21hdGNoX3NpZChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBwaWRfdCBzaWQpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICpnLCAqcDsKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IHNrYi0+c2stPnNrX3NvY2tldC0+ZmlsZTsKKwlpbnQgaSwgZm91bmQ9MDsKKworCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJZG9fZWFjaF90aHJlYWQoZywgcCkgeworCQlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlczsKKwkJaWYgKHAtPnNpZ25hbC0+c2Vzc2lvbiAhPSBzaWQpCisJCQljb250aW51ZTsKKworCQl0YXNrX2xvY2socCk7CisJCWZpbGVzID0gcC0+ZmlsZXM7CisJCWlmIChmaWxlcykgeworCQkJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJCWZvciAoaT0wOyBpIDwgZmlsZXMtPm1heF9mZHM7IGkrKykgeworCQkJCWlmIChmY2hlY2tfZmlsZXMoZmlsZXMsIGkpID09IGZpbGUpIHsKKwkJCQkJZm91bmQgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCX0KKwkJdGFza191bmxvY2socCk7CisJCWlmIChmb3VuZCkKKwkJCWdvdG8gb3V0OworCX0gd2hpbGVfZWFjaF90aHJlYWQoZywgcCk7CitvdXQ6CisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCisJcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgaW50CittYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgIGludCBvZmZzZXQsCisgICAgICBpbnQgKmhvdGRyb3ApCit7CisJY29uc3Qgc3RydWN0IGlwdF9vd25lcl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCisJaWYgKCFza2ItPnNrIHx8ICFza2ItPnNrLT5za19zb2NrZXQgfHwgIXNrYi0+c2stPnNrX3NvY2tldC0+ZmlsZSkKKwkJcmV0dXJuIDA7CisKKwlpZihpbmZvLT5tYXRjaCAmIElQVF9PV05FUl9VSUQpIHsKKwkJaWYgKChza2ItPnNrLT5za19zb2NrZXQtPmZpbGUtPmZfdWlkICE9IGluZm8tPnVpZCkgXgorCQkgICAgISEoaW5mby0+aW52ZXJ0ICYgSVBUX09XTkVSX1VJRCkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZihpbmZvLT5tYXRjaCAmIElQVF9PV05FUl9HSUQpIHsKKwkJaWYgKChza2ItPnNrLT5za19zb2NrZXQtPmZpbGUtPmZfZ2lkICE9IGluZm8tPmdpZCkgXgorCQkgICAgISEoaW5mby0+aW52ZXJ0ICYgSVBUX09XTkVSX0dJRCkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZihpbmZvLT5tYXRjaCAmIElQVF9PV05FUl9QSUQpIHsKKwkJaWYgKCFtYXRjaF9waWQoc2tiLCBpbmZvLT5waWQpIF4KKwkJICAgICEhKGluZm8tPmludmVydCAmIElQVF9PV05FUl9QSUQpKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYoaW5mby0+bWF0Y2ggJiBJUFRfT1dORVJfU0lEKSB7CisJCWlmICghbWF0Y2hfc2lkKHNrYiwgaW5mby0+c2lkKSBeCisJCSAgICAhIShpbmZvLT5pbnZlcnQgJiBJUFRfT1dORVJfU0lEKSkKKwkJCXJldHVybiAwOworCX0KKworCWlmKGluZm8tPm1hdGNoICYgSVBUX09XTkVSX0NPTU0pIHsKKwkJaWYgKCFtYXRjaF9jb21tKHNrYiwgaW5mby0+Y29tbSkgXgorCQkgICAgISEoaW5mby0+aW52ZXJ0ICYgSVBUX09XTkVSX0NPTU0pKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKyAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworICAgICAgICBpZiAoaG9va19tYXNrCisgICAgICAgICAgICAmIH4oKDEgPDwgTkZfSVBfTE9DQUxfT1VUKSB8ICgxIDw8IE5GX0lQX1BPU1RfUk9VVElORykpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJpcHRfb3duZXI6IG9ubHkgdmFsaWQgZm9yIExPQ0FMX09VVCBvciBQT1NUX1JPVVRJTkcuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisJaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfb3duZXJfaW5mbykpKSB7CisJCXByaW50aygiTWF0Y2hzaXplICV1ICE9ICVadVxuIiwgbWF0Y2hzaXplLAorCQkgICAgICAgSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X293bmVyX2luZm8pKSk7CisJCXJldHVybiAwOworCX0KKyNpZmRlZiBDT05GSUdfU01QCisJLyogZmlsZXMtPmZpbGVfbG9jayBjYW4gbm90IGJlIHVzZWQgaW4gYSBCSCAqLworCWlmICgoKHN0cnVjdCBpcHRfb3duZXJfaW5mbyAqKW1hdGNoaW5mbyktPm1hdGNoCisJICAgICYgKElQVF9PV05FUl9QSUR8SVBUX09XTkVSX1NJRHxJUFRfT1dORVJfQ09NTSkpIHsKKwkJcHJpbnRrKCJpcHRfb3duZXI6IHBpZCwgc2lkIGFuZCBjb21tYW5kIG1hdGNoaW5nIGlzIGJyb2tlbiAiCisJCSAgICAgICAib24gU01QLlxuIik7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBvd25lcl9tYXRjaCA9IHsKKwkubmFtZQkJPSAib3duZXIiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmb3duZXJfbWF0Y2gpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZvd25lcl9tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3BoeXNkZXYuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfcGh5c2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNTM5MjQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3BoeXNkZXYuYwpAQCAtMCwwICsxLDEzNCBAQAorLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCB0aGUgYnJpZGdlIHBvcnQgaW4gYW5kCisgKiBvdXQgZGV2aWNlIGZvciBJUCBwYWNrZXRzIGNvbWluZyBpbnRvIGNvbnRhY3Qgd2l0aCBhIGJyaWRnZS4gKi8KKworLyogKEMpIDIwMDEtMjAwMyBCYXJ0IERlIFNjaHV5bWVyIDxiZHNjaHV5bUBwYW5kb3JhLmJlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9waHlzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS5oPgorI2RlZmluZSBNQVRDSCAgIDEKKyNkZWZpbmUgTk9NQVRDSCAwCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkJhcnQgRGUgU2NodXltZXIgPGJkc2NodXltQHBhbmRvcmEuYmU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIGJyaWRnZSBwaHlzaWNhbCBkZXZpY2UgbWF0Y2ggbW9kdWxlIik7CisKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIGludCAqaG90ZHJvcCkKK3sKKwlpbnQgaTsKKwlzdGF0aWMgY29uc3QgY2hhciBudWxsZGV2bmFtZVtJRk5BTVNJWl07CisJY29uc3Qgc3RydWN0IGlwdF9waHlzZGV2X2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJdW5zaWduZWQgaW50IHJldDsKKwljb25zdCBjaGFyICppbmRldiwgKm91dGRldjsKKwlzdHJ1Y3QgbmZfYnJpZGdlX2luZm8gKm5mX2JyaWRnZTsKKworCS8qIE5vdCBhIGJyaWRnZWQgSVAgcGFja2V0IG9yIG5vIGluZm8gYXZhaWxhYmxlIHlldDoKKwkgKiBMT0NBTF9PVVQvbWFuZ2xlIGFuZCBMT0NBTF9PVVQvbmF0IGRvbid0IGtub3cgaWYKKwkgKiB0aGUgZGVzdGluYXRpb24gZGV2aWNlIHdpbGwgYmUgYSBicmlkZ2UuICovCisJaWYgKCEobmZfYnJpZGdlID0gc2tiLT5uZl9icmlkZ2UpKSB7CisJCS8qIFJldHVybiBNQVRDSCBpZiB0aGUgaW52ZXJ0IGZsYWdzIG9mIHRoZSB1c2VkIG9wdGlvbnMgYXJlIG9uICovCisJCWlmICgoaW5mby0+Yml0bWFzayAmIElQVF9QSFlTREVWX09QX0JSSURHRUQpICYmCisJCSAgICAhKGluZm8tPmludmVydCAmIElQVF9QSFlTREVWX09QX0JSSURHRUQpKQorCQkJcmV0dXJuIE5PTUFUQ0g7CisJCWlmICgoaW5mby0+Yml0bWFzayAmIElQVF9QSFlTREVWX09QX0lTSU4pICYmCisJCSAgICAhKGluZm8tPmludmVydCAmIElQVF9QSFlTREVWX09QX0lTSU4pKQorCQkJcmV0dXJuIE5PTUFUQ0g7CisJCWlmICgoaW5mby0+Yml0bWFzayAmIElQVF9QSFlTREVWX09QX0lTT1VUKSAmJgorCQkgICAgIShpbmZvLT5pbnZlcnQgJiBJUFRfUEhZU0RFVl9PUF9JU09VVCkpCisJCQlyZXR1cm4gTk9NQVRDSDsKKwkJaWYgKChpbmZvLT5iaXRtYXNrICYgSVBUX1BIWVNERVZfT1BfSU4pICYmCisJCSAgICAhKGluZm8tPmludmVydCAmIElQVF9QSFlTREVWX09QX0lOKSkKKwkJCXJldHVybiBOT01BVENIOworCQlpZiAoKGluZm8tPmJpdG1hc2sgJiBJUFRfUEhZU0RFVl9PUF9PVVQpICYmCisJCSAgICAhKGluZm8tPmludmVydCAmIElQVF9QSFlTREVWX09QX09VVCkpCisJCQlyZXR1cm4gTk9NQVRDSDsKKwkJcmV0dXJuIE1BVENIOworCX0KKworCS8qIFRoaXMgb25seSBtYWtlcyBzZW5zZSBpbiB0aGUgRk9SV0FSRCBhbmQgUE9TVFJPVVRJTkcgY2hhaW5zICovCisJaWYgKChpbmZvLT5iaXRtYXNrICYgSVBUX1BIWVNERVZfT1BfQlJJREdFRCkgJiYKKwkgICAgKCEhKG5mX2JyaWRnZS0+bWFzayAmIEJSTkZfQlJJREdFRCkgXgorCSAgICAhKGluZm8tPmludmVydCAmIElQVF9QSFlTREVWX09QX0JSSURHRUQpKSkKKwkJcmV0dXJuIE5PTUFUQ0g7CisKKwlpZiAoKGluZm8tPmJpdG1hc2sgJiBJUFRfUEhZU0RFVl9PUF9JU0lOICYmCisJICAgICghbmZfYnJpZGdlLT5waHlzaW5kZXYgXiAhIShpbmZvLT5pbnZlcnQgJiBJUFRfUEhZU0RFVl9PUF9JU0lOKSkpIHx8CisJICAgIChpbmZvLT5iaXRtYXNrICYgSVBUX1BIWVNERVZfT1BfSVNPVVQgJiYKKwkgICAgKCFuZl9icmlkZ2UtPnBoeXNvdXRkZXYgXiAhIShpbmZvLT5pbnZlcnQgJiBJUFRfUEhZU0RFVl9PUF9JU09VVCkpKSkKKwkJcmV0dXJuIE5PTUFUQ0g7CisKKwlpZiAoIShpbmZvLT5iaXRtYXNrICYgSVBUX1BIWVNERVZfT1BfSU4pKQorCQlnb3RvIG1hdGNoX291dGRldjsKKwlpbmRldiA9IG5mX2JyaWRnZS0+cGh5c2luZGV2ID8gbmZfYnJpZGdlLT5waHlzaW5kZXYtPm5hbWUgOiBudWxsZGV2bmFtZTsKKwlmb3IgKGkgPSAwLCByZXQgPSAwOyBpIDwgSUZOQU1TSVovc2l6ZW9mKHVuc2lnbmVkIGludCk7IGkrKykgeworCQlyZXQgfD0gKCgoY29uc3QgdW5zaWduZWQgaW50ICopaW5kZXYpW2ldCisJCQleICgoY29uc3QgdW5zaWduZWQgaW50ICopaW5mby0+cGh5c2luZGV2KVtpXSkKKwkJCSYgKChjb25zdCB1bnNpZ25lZCBpbnQgKilpbmZvLT5pbl9tYXNrKVtpXTsKKwl9CisKKwlpZiAoKHJldCA9PSAwKSBeICEoaW5mby0+aW52ZXJ0ICYgSVBUX1BIWVNERVZfT1BfSU4pKQorCQlyZXR1cm4gTk9NQVRDSDsKKworbWF0Y2hfb3V0ZGV2OgorCWlmICghKGluZm8tPmJpdG1hc2sgJiBJUFRfUEhZU0RFVl9PUF9PVVQpKQorCQlyZXR1cm4gTUFUQ0g7CisJb3V0ZGV2ID0gbmZfYnJpZGdlLT5waHlzb3V0ZGV2ID8KKwkJIG5mX2JyaWRnZS0+cGh5c291dGRldi0+bmFtZSA6IG51bGxkZXZuYW1lOworCWZvciAoaSA9IDAsIHJldCA9IDA7IGkgPCBJRk5BTVNJWi9zaXplb2YodW5zaWduZWQgaW50KTsgaSsrKSB7CisJCXJldCB8PSAoKChjb25zdCB1bnNpZ25lZCBpbnQgKilvdXRkZXYpW2ldCisJCQleICgoY29uc3QgdW5zaWduZWQgaW50ICopaW5mby0+cGh5c291dGRldilbaV0pCisJCQkmICgoY29uc3QgdW5zaWduZWQgaW50ICopaW5mby0+b3V0X21hc2spW2ldOworCX0KKworCXJldHVybiAocmV0ICE9IDApIF4gIShpbmZvLT5pbnZlcnQgJiBJUFRfUEhZU0RFVl9PUF9PVVQpOworfQorCitzdGF0aWMgaW50CitjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCQkgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAorCQkgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IGlwdF9waHlzZGV2X2luZm8gKmluZm8gPSBtYXRjaGluZm87CisKKwlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9waHlzZGV2X2luZm8pKSkKKwkJcmV0dXJuIDA7CisJaWYgKCEoaW5mby0+Yml0bWFzayAmIElQVF9QSFlTREVWX09QX01BU0spIHx8CisJICAgIGluZm8tPmJpdG1hc2sgJiB+SVBUX1BIWVNERVZfT1BfTUFTSykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIHBoeXNkZXZfbWF0Y2ggPSB7CisJLm5hbWUJCT0gInBoeXNkZXYiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmcGh5c2Rldl9tYXRjaCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaXB0X3VucmVnaXN0ZXJfbWF0Y2goJnBoeXNkZXZfbWF0Y2gpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9wa3R0eXBlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3BrdHR5cGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGRiMWRjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9wa3R0eXBlLmMKQEAgLTAsMCArMSw3MCBAQAorLyogKEMpIDE5OTktMjAwMSBNaWNoYWwgTHVkdmlnIDxtaWNoYWxAbG9naXguY3o+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9wYWNrZXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9wa3R0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk1pY2hhbCBMdWR2aWcgPG1pY2hhbEBsb2dpeC5jej4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVAgdGFibGVzIG1hdGNoIHRvIG1hdGNoIG9uIGxpbmtsYXllciBwYWNrZXQgdHlwZSIpOworCitzdGF0aWMgaW50IG1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIGludCAqaG90ZHJvcCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgaXB0X3BrdHR5cGVfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKworICAgIHJldHVybiAoc2tiLT5wa3RfdHlwZSA9PSBpbmZvLT5wa3R0eXBlKSBeIGluZm8tPmludmVydDsKK30KKworc3RhdGljIGludCBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkJICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisJCSAgIHZvaWQgKm1hdGNoaW5mbywKKwkJICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKy8qCisJaWYgKGhvb2tfbWFzaworCSAgICAmIH4oKDEgPDwgTkZfSVBfUFJFX1JPVVRJTkcpIHwgKDEgPDwgTkZfSVBfTE9DQUxfSU4pCisJCXwgKDEgPDwgTkZfSVBfRk9SV0FSRCkpKSB7CisJCXByaW50aygiaXB0X3BrdHR5cGU6IG9ubHkgdmFsaWQgZm9yIFBSRV9ST1VUSU5HLCBMT0NBTF9JTiBvciBGT1JXQVJELlxuIik7CisJCXJldHVybiAwOworCX0KKyovCisJaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfcGt0dHlwZV9pbmZvKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIHBrdHR5cGVfbWF0Y2ggPSB7CisJLm5hbWUJCT0gInBrdHR5cGUiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmcGt0dHlwZV9tYXRjaCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaXB0X3VucmVnaXN0ZXJfbWF0Y2goJnBrdHR5cGVfbWF0Y2gpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9yZWFsbS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9yZWFsbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YTY4OTcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3JlYWxtLmMKQEAgLTAsMCArMSw3NiBAQAorLyogSVAgdGFibGVzIG1vZHVsZSBmb3IgbWF0Y2hpbmcgdGhlIHJvdXRpbmcgcmVhbG0KKyAqCisgKiAkSWQ6IGlwdF9yZWFsbS5jLHYgMS4zIDIwMDQvMDMvMDUgMTM6MjU6NDAgbGFmb3JnZSBFeHAgJAorICoKKyAqIChDKSAyMDAzIGJ5IFNhbXBzYSBSYW50YSA8c2FtcHNhQG5ldHNvbmljLmZpPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3JlYWxtLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisKK01PRFVMRV9BVVRIT1IoIlNhbXBzYSBSYW50YSA8c2FtcHNhQG5ldHNvbmljLmZpPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyByZWFsbSBtYXRjaCIpOworCitzdGF0aWMgaW50CittYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgIGludCBvZmZzZXQsCisgICAgICBpbnQgKmhvdGRyb3ApCit7CisJY29uc3Qgc3RydWN0IGlwdF9yZWFsbV9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYi0+ZHN0OworICAgIAorCXJldHVybiAoaW5mby0+aWQgPT0gKGRzdC0+dGNsYXNzaWQgJiBpbmZvLT5tYXNrKSkgXiBpbmZvLT5pbnZlcnQ7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLAorICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKyAgICAgICAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWlmIChob29rX21hc2sKKwkgICAgJiB+KCgxIDw8IE5GX0lQX1BPU1RfUk9VVElORykgfCAoMSA8PCBORl9JUF9GT1JXQVJEKSB8CisJICAgICAgICAoMSA8PCBORl9JUF9MT0NBTF9PVVQpIHwgKDEgPDwgTkZfSVBfTE9DQUxfSU4pKSkgeworCQlwcmludGsoImlwdF9yZWFsbTogb25seSB2YWxpZCBmb3IgUE9TVF9ST1VUSU5HLCBMT0NBTF9PVVQsICIKKwkJICAgICAgICJMT0NBTF9JTiBvciBGT1JXQVJELlxuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9yZWFsbV9pbmZvKSkpIHsKKwkJcHJpbnRrKCJpcHRfcmVhbG06IGludmFsaWQgbWF0Y2hzaXplLlxuIik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggcmVhbG1fbWF0Y2ggPSB7CisJLm5hbWUJCT0gInJlYWxtIiwKKwkubWF0Y2gJCT0gbWF0Y2gsIAorCS5jaGVja2VudHJ5CT0gY2hlY2ssCisJLm1lCQk9IFRISVNfTU9EVUxFCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmcmVhbG1fbWF0Y2gpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZyZWFsbV9tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3JlY2VudC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9yZWNlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWFiOWZhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9yZWNlbnQuYwpAQCAtMCwwICsxLDEwMDIgQEAKKy8qIEtlcm5lbCBtb2R1bGUgdG8gY2hlY2sgaWYgdGhlIHNvdXJjZSBhZGRyZXNzIGhhcyBiZWVuIHNlZW4gcmVjZW50bHkuICovCisvKiBDb3B5cmlnaHQgMjAwMi0yMDAzLCBTdGVwaGVuIEZyb3N0LCAyLjUueCBwb3J0IGJ5IGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZyAqLworLyogQXV0aG9yOiBTdGVwaGVuIEZyb3N0IDxzZnJvc3RAc25vd21hbi5uZXQ+ICovCisvKiBQcm9qZWN0IFBhZ2U6IGh0dHA6Ly9zbm93bWFuLm5ldC9wcm9qZWN0cy9pcHRfcmVjZW50LyAqLworLyogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCwgVmVyc2lvbiAyICovCisvKiBUaGlzIGNvcHlyaWdodCBkb2VzIG5vdCBjb3ZlciB1c2VyIHByb2dyYW1zIHRoYXQgdXNlIGtlcm5lbCBzZXJ2aWNlcworICogYnkgbm9ybWFsIHN5c3RlbSBjYWxscy4gKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3JlY2VudC5oPgorCisjdW5kZWYgREVCVUcKKyNkZWZpbmUgSEFTSF9MT0cgOQorCisvKiBEZWZhdWx0cywgdGhlc2UgY2FuIGJlIG92ZXJyaWRkZW4gb24gdGhlIG1vZHVsZSBjb21tYW5kLWxpbmUuICovCitzdGF0aWMgaW50IGlwX2xpc3RfdG90ID0gMTAwOworc3RhdGljIGludCBpcF9wa3RfbGlzdF90b3QgPSAyMDsKK3N0YXRpYyBpbnQgaXBfbGlzdF9oYXNoX3NpemUgPSAwOworc3RhdGljIGludCBpcF9saXN0X3Blcm1zID0gMDY0NDsKKyNpZmRlZiBERUJVRworc3RhdGljIGludCBkZWJ1ZyA9IDE7CisjZW5kaWYKKworc3RhdGljIGNoYXIgdmVyc2lvbltdID0KK0tFUk5fSU5GTyBSRUNFTlRfTkFNRSAiICIgUkVDRU5UX1ZFUiAiOiBTdGVwaGVuIEZyb3N0IDxzZnJvc3RAc25vd21hbi5uZXQ+LiAgaHR0cDovL3Nub3dtYW4ubmV0L3Byb2plY3RzL2lwdF9yZWNlbnQvXG4iOworCitNT0RVTEVfQVVUSE9SKCJTdGVwaGVuIEZyb3N0IDxzZnJvc3RAc25vd21hbi5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklQIHRhYmxlcyByZWNlbnRseSBzZWVuIG1hdGNoaW5nIG1vZHVsZSAiIFJFQ0VOVF9WRVIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX3BhcmFtKGlwX2xpc3RfdG90LCBpbnQsIDA0MDApOworbW9kdWxlX3BhcmFtKGlwX3BrdF9saXN0X3RvdCwgaW50LCAwNDAwKTsKK21vZHVsZV9wYXJhbShpcF9saXN0X2hhc2hfc2l6ZSwgaW50LCAwNDAwKTsKK21vZHVsZV9wYXJhbShpcF9saXN0X3Blcm1zLCBpbnQsIDA0MDApOworI2lmZGVmIERFQlVHCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDYwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCJkZWJ1Z2dpbmcgbGV2ZWwsIGRlZmF1bHRzIHRvIDEiKTsKKyNlbmRpZgorTU9EVUxFX1BBUk1fREVTQyhpcF9saXN0X3RvdCwibnVtYmVyIG9mIElQcyB0byByZW1lbWJlciBwZXIgbGlzdCIpOworTU9EVUxFX1BBUk1fREVTQyhpcF9wa3RfbGlzdF90b3QsIm51bWJlciBvZiBwYWNrZXRzIHBlciBJUCB0byByZW1lbWJlciIpOworTU9EVUxFX1BBUk1fREVTQyhpcF9saXN0X2hhc2hfc2l6ZSwic2l6ZSBvZiBoYXNoIHRhYmxlIHVzZWQgdG8gbG9vayB1cCBJUHMiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXBfbGlzdF9wZXJtcywicGVybWlzc2lvbnMgb24gL3Byb2MvbmV0L2lwdF9yZWNlbnQvKiBmaWxlcyIpOworCisvKiBTdHJ1Y3R1cmUgb2Ygb3VyIGxpc3Qgb2YgcmVjZW50bHkgc2VlbiBhZGRyZXNzZXMuICovCitzdHJ1Y3QgcmVjZW50X2lwX2xpc3QgeworCXVfaW50MzJfdCBhZGRyOworCXVfaW50OF90ICB0dGw7CisJdW5zaWduZWQgbG9uZyBsYXN0X3NlZW47CisJdW5zaWduZWQgbG9uZyAqbGFzdF9wa3RzOworCXVfaW50MzJfdCBvbGRlc3RfcGt0OworCXVfaW50MzJfdCBoYXNoX2VudHJ5OworCXVfaW50MzJfdCB0aW1lX3BvczsKK307CisKK3N0cnVjdCB0aW1lX2luZm9fbGlzdCB7CisJdV9pbnQzMl90IHBvc2l0aW9uOworCXVfaW50MzJfdCB0aW1lOworfTsKKworLyogU3RydWN0dXJlIG9mIG91ciBsaW5rZWQgbGlzdCBvZiB0YWJsZXMgb2YgcmVjZW50IGxpc3RzLiAqLworc3RydWN0IHJlY2VudF9pcF90YWJsZXMgeworCWNoYXIgbmFtZVtJUFRfUkVDRU5UX05BTUVfTEVOXTsKKwlpbnQgY291bnQ7CisJaW50IHRpbWVfcG9zOworCXN0cnVjdCByZWNlbnRfaXBfbGlzdCAqdGFibGU7CisJc3RydWN0IHJlY2VudF9pcF90YWJsZXMgKm5leHQ7CisJc3BpbmxvY2tfdCBsaXN0X2xvY2s7CisJaW50ICpoYXNoX3RhYmxlOworCXN0cnVjdCB0aW1lX2luZm9fbGlzdCAqdGltZV9pbmZvOworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpzdGF0dXNfcHJvYzsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworfTsKKworLyogT3VyIGN1cnJlbnQgbGlzdCBvZiBhZGRyZXNzZXMgd2UgaGF2ZSByZWNlbnRseSBzZWVuLgorICogT25seSBhZGRlZCB0byBvbiBhIC0tc2V0LCBhbmQgb25seSB1cGRhdGVkIG9uIC0tc2V0IHx8IC0tdXBkYXRlIAorICovCitzdGF0aWMgc3RydWN0IHJlY2VudF9pcF90YWJsZXMgKnJfdGFibGVzID0gTlVMTDsKKworLyogV2UgcHJvdGVjdCByX2xpc3Qgd2l0aCB0aGlzIHNwaW5sb2NrIHNvIHR3byBwcm9jZXNzb3JzIGFyZSBub3QgbW9kaWZ5aW5nCisgKiB0aGUgbGlzdCBhdCB0aGUgc2FtZSB0aW1lLiAKKyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhyZWNlbnRfbG9jayk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworLyogT3VyIC9wcm9jL25ldC9pcHRfcmVjZW50IGVudHJ5ICovCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX25ldF9pcHRfcmVjZW50ID0gTlVMTDsKKyNlbmRpZgorCisvKiBGdW5jdGlvbiBkZWNsYXJhdGlvbiBmb3IgbGF0ZXIuICovCitzdGF0aWMgaW50CittYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgIGludCBvZmZzZXQsCisgICAgICBpbnQgKmhvdGRyb3ApOworCisvKiBGdW5jdGlvbiB0byBoYXNoIGEgZ2l2ZW4gYWRkcmVzcyBpbnRvIHRoZSBoYXNoIHRhYmxlIG9mIHRhYmxlX3NpemUgc2l6ZSAqLworc3RhdGljIGludCBoYXNoX2Z1bmModW5zaWduZWQgaW50IGFkZHIsIGludCB0YWJsZV9zaXplKQoreworCWludCByZXN1bHQgPSAwOworCXVuc2lnbmVkIGludCB2YWx1ZSA9IGFkZHI7CisJZG8geyByZXN1bHQgXj0gdmFsdWU7IH0gd2hpbGUoKHZhbHVlID4+PSBIQVNIX0xPRykpOworCisjaWZkZWYgREVCVUcKKwlpZihkZWJ1ZykgcHJpbnRrKEtFUk5fSU5GTyBSRUNFTlRfTkFNRSAiOiAlZCA9IGhhc2hfZnVuYygldSwlZClcbiIsCisJCQkgcmVzdWx0ICYgKHRhYmxlX3NpemUgLSAxKSwKKwkJCSBhZGRyLAorCQkJIHRhYmxlX3NpemUpOworI2VuZGlmCisKKwlyZXR1cm4ocmVzdWx0ICYgKHRhYmxlX3NpemUgLSAxKSk7Cit9CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworLyogVGhpcyBpcyB0aGUgZnVuY3Rpb24gd2hpY2ggcHJvZHVjZXMgdGhlIG91dHB1dCBmb3Igb3VyIC9wcm9jIG91dHB1dAorICogaW50ZXJmYWNlIHdoaWNoIGxpc3RzIGVhY2ggSVAgYWRkcmVzcywgdGhlIGxhc3Qgc2VlbiB0aW1lIGFuZCB0aGUgCisgKiBvdGhlciByZWNlbnQgdGltZXMgdGhlIGFkZHJlc3Mgd2FzIHNlZW4uCisgKi8KKworc3RhdGljIGludCBpcF9yZWNlbnRfZ2V0X2luZm8oY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbiA9IDAsIGNvdW50LCBsYXN0X2xlbiA9IDAsIHBrdF9jb3VudDsKKwlvZmZfdCBwb3MgPSAwOworCW9mZl90IGJlZ2luID0gMDsKKwlzdHJ1Y3QgcmVjZW50X2lwX3RhYmxlcyAqY3Vycl90YWJsZTsKKworCWN1cnJfdGFibGUgPSAoc3RydWN0IHJlY2VudF9pcF90YWJsZXMqKSBkYXRhOworCisJc3Bpbl9sb2NrX2JoKCZjdXJyX3RhYmxlLT5saXN0X2xvY2spOworCWZvcihjb3VudCA9IDA7IGNvdW50IDwgaXBfbGlzdF90b3Q7IGNvdW50KyspIHsKKwkJaWYoIWN1cnJfdGFibGUtPnRhYmxlW2NvdW50XS5hZGRyKSBjb250aW51ZTsKKwkJbGFzdF9sZW4gPSBsZW47CisJCWxlbiArPSBzcHJpbnRmKGJ1ZmZlcitsZW4sInNyYz0ldS4ldS4ldS4ldSAiLE5JUFFVQUQoY3Vycl90YWJsZS0+dGFibGVbY291bnRdLmFkZHIpKTsKKwkJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwidHRsOiAldSAiLGN1cnJfdGFibGUtPnRhYmxlW2NvdW50XS50dGwpOworCQlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCJsYXN0X3NlZW46ICVsdSAiLGN1cnJfdGFibGUtPnRhYmxlW2NvdW50XS5sYXN0X3NlZW4pOworCQlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCJvbGRlc3RfcGt0OiAldSAiLGN1cnJfdGFibGUtPnRhYmxlW2NvdW50XS5vbGRlc3RfcGt0KTsKKwkJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwibGFzdF9wa3RzOiAlbHUiLGN1cnJfdGFibGUtPnRhYmxlW2NvdW50XS5sYXN0X3BrdHNbMF0pOworCQlmb3IocGt0X2NvdW50ID0gMTsgcGt0X2NvdW50IDwgaXBfcGt0X2xpc3RfdG90OyBwa3RfY291bnQrKykgeworCQkJaWYoIWN1cnJfdGFibGUtPnRhYmxlW2NvdW50XS5sYXN0X3BrdHNbcGt0X2NvdW50XSkgYnJlYWs7CisJCQlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCIsICVsdSIsY3Vycl90YWJsZS0+dGFibGVbY291bnRdLmxhc3RfcGt0c1twa3RfY291bnRdKTsKKwkJfQorCQlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCJcbiIpOworCQlwb3MgPSBiZWdpbiArIGxlbjsKKwkJaWYocG9zIDwgb2Zmc2V0KSB7IGxlbiA9IDA7IGJlZ2luID0gcG9zOyB9CisJCWlmKHBvcyA+IG9mZnNldCArIGxlbmd0aCkgeyBsZW4gPSBsYXN0X2xlbjsgYnJlYWs7IH0KKwl9CisKKwkqc3RhcnQgPSBidWZmZXIgKyAob2Zmc2V0IC0gYmVnaW4pOworCWxlbiAtPSAob2Zmc2V0IC0gYmVnaW4pOworCWlmKGxlbiA+IGxlbmd0aCkgbGVuID0gbGVuZ3RoOworCisJc3Bpbl91bmxvY2tfYmgoJmN1cnJfdGFibGUtPmxpc3RfbG9jayk7CisJcmV0dXJuIGxlbjsKK30KKworLyogaXBfcmVjZW50X2N0cmwgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciB1c2VycyB0byBtb2RpZnkgdGhlIHRhYmxlCisgKiBkaXJlY3RseS4gIFRoaXMgYWxsb3dzIGFkZGluZyBlbnRyaWVzLCByZW1vdmluZyBlbnRyaWVzLCBhbmQKKyAqIGZsdXNoaW5nIHRoZSBlbnRpcmUgdGFibGUuCisgKiBUaGlzIGlzIGRvbmUgYnkgb3BlbmluZyB1cCB0aGUgYXBwcm9wcmlhdGUgdGFibGUgZm9yIHdyaXRpbmcgYW5kCisgKiBzZW5kaW5nIG9uZSBvZjoKKyAqIHh4Lnh4Lnh4Lnh4ICAgLS0gQWRkIGVudHJ5IHRvIHRhYmxlIHdpdGggY3VycmVudCB0aW1lCisgKiAreHgueHgueHgueHggIC0tIEFkZCBlbnRyeSB0byB0YWJsZSB3aXRoIGN1cnJlbnQgdGltZQorICogLXh4Lnh4Lnh4Lnh4ICAtLSBSZW1vdmUgZW50cnkgZnJvbSB0YWJsZQorICogY2xlYXIgICAgICAgICAtLSBGbHVzaCB0YWJsZSwgcmVtb3ZlIGFsbCBlbnRyaWVzCisgKi8KKworc3RhdGljIGludCBpcF9yZWNlbnRfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmlucHV0LCB1bnNpZ25lZCBsb25nIHNpemUsIHZvaWQgKmRhdGEpCit7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBtYXhbNF0gPSB7IDB4ZmZmZmZmZmYsIDB4ZmZmZmZmLCAweGZmZmYsIDB4ZmYgfTsKKwl1X2ludDMyX3QgdmFsOworCWludCBiYXNlLCB1c2VkID0gMDsKKwljaGFyIGMsICpjcDsKKwl1bmlvbiBpYWRkciB7CisJCXVpbnQ4X3QgYnl0ZXNbNF07CisJCXVpbnQzMl90IHdvcmQ7CisJfSByZXM7CisJdWludDhfdCAqcHAgPSByZXMuYnl0ZXM7CisJaW50IGRpZ2l0OworCisJY2hhciBidWZmZXJbMjBdOworCWludCBsZW4sIGNoZWNrX3NldCA9IDAsIGNvdW50OworCXVfaW50MzJfdCBhZGRyID0gMDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpcHRfcmVjZW50X2luZm8gKmluZm87CisJc3RydWN0IHJlY2VudF9pcF90YWJsZXMgKmN1cnJfdGFibGU7CisKKwljdXJyX3RhYmxlID0gKHN0cnVjdCByZWNlbnRfaXBfdGFibGVzKikgZGF0YTsKKworCWlmKHNpemUgPiAyMCkgbGVuID0gMjA7IGVsc2UgbGVuID0gc2l6ZTsKKworCWlmKGNvcHlfZnJvbV91c2VyKGJ1ZmZlcixpbnB1dCxsZW4pKSByZXR1cm4gLUVGQVVMVDsKKworCWlmKGxlbiA8IDIwKSBidWZmZXJbbGVuXSA9ICdcMCc7CisKKyNpZmRlZiBERUJVRworCWlmKGRlYnVnKSBwcmludGsoS0VSTl9JTkZPIFJFQ0VOVF9OQU1FICI6IGlwX3JlY2VudF9jdHJsIGxlbjogJWQsIGlucHV0OiBgJS4yMHMnXG4iLGxlbixidWZmZXIpOworI2VuZGlmCisKKwljcCA9IGJ1ZmZlcjsKKwl3aGlsZShpc3NwYWNlKCpjcCkpIHsgY3ArKzsgdXNlZCsrOyBpZih1c2VkID49IGxlbi01KSByZXR1cm4gdXNlZDsgfQorCisJLyogQ2hlY2sgaWYgd2UgYXJlIGFza2VkIHRvIGZsdXNoIHRoZSBlbnRpcmUgdGFibGUgKi8KKwlpZighbWVtY21wKGNwLCJjbGVhciIsNSkpIHsKKwkJdXNlZCArPSA1OworCQlzcGluX2xvY2tfYmgoJmN1cnJfdGFibGUtPmxpc3RfbG9jayk7CisJCWN1cnJfdGFibGUtPnRpbWVfcG9zID0gMDsKKwkJZm9yKGNvdW50ID0gMDsgY291bnQgPCBpcF9saXN0X2hhc2hfc2l6ZTsgY291bnQrKykgeworCQkJY3Vycl90YWJsZS0+aGFzaF90YWJsZVtjb3VudF0gPSAtMTsKKwkJfQorCQlmb3IoY291bnQgPSAwOyBjb3VudCA8IGlwX2xpc3RfdG90OyBjb3VudCsrKSB7CisJCQljdXJyX3RhYmxlLT50YWJsZVtjb3VudF0ubGFzdF9zZWVuID0gMDsKKwkJCWN1cnJfdGFibGUtPnRhYmxlW2NvdW50XS5hZGRyID0gMDsKKwkJCWN1cnJfdGFibGUtPnRhYmxlW2NvdW50XS50dGwgPSAwOworCQkJbWVtc2V0KGN1cnJfdGFibGUtPnRhYmxlW2NvdW50XS5sYXN0X3BrdHMsMCxpcF9wa3RfbGlzdF90b3Qqc2l6ZW9mKHVfaW50MzJfdCkpOworCQkJY3Vycl90YWJsZS0+dGFibGVbY291bnRdLm9sZGVzdF9wa3QgPSAwOworCQkJY3Vycl90YWJsZS0+dGFibGVbY291bnRdLnRpbWVfcG9zID0gMDsKKwkJCWN1cnJfdGFibGUtPnRpbWVfaW5mb1tjb3VudF0ucG9zaXRpb24gPSBjb3VudDsKKwkJCWN1cnJfdGFibGUtPnRpbWVfaW5mb1tjb3VudF0udGltZSA9IDA7CisJCX0KKwkJc3Bpbl91bmxvY2tfYmgoJmN1cnJfdGFibGUtPmxpc3RfbG9jayk7CisJCXJldHVybiB1c2VkOworCX0KKworICAgICAgICBjaGVja19zZXQgPSBJUFRfUkVDRU5UX1NFVDsKKwlzd2l0Y2goKmNwKSB7CisJCWNhc2UgJysnOiBjaGVja19zZXQgPSBJUFRfUkVDRU5UX1NFVDsgY3ArKzsgdXNlZCsrOyBicmVhazsKKwkJY2FzZSAnLSc6IGNoZWNrX3NldCA9IElQVF9SRUNFTlRfUkVNT1ZFOyBjcCsrOyB1c2VkKys7IGJyZWFrOworCQlkZWZhdWx0OiBpZighaXNkaWdpdCgqY3ApKSByZXR1cm4gKHVzZWQrMSk7IGJyZWFrOworCX0KKworI2lmZGVmIERFQlVHCisJaWYoZGVidWcpIHByaW50ayhLRVJOX0lORk8gUkVDRU5UX05BTUUgIjogaXBfcmVjZW50X2N0cmwgY3A6IGAlYycsIGNoZWNrX3NldDogJWRcbiIsKmNwLGNoZWNrX3NldCk7CisjZW5kaWYKKwkvKiBHZXQgYWRkciAoZWZmZWN0aXZlbHkgaW5ldF9hdG9uKCkpICovCisJLyogU2hhbWVsZXNzbHkgc3RvbGVuIGZyb20gbGliYywgYSBmdW5jdGlvbiBpbiB0aGUga2VybmVsIGZvciBkb2luZworCSAqIHRoaXMgd291bGQsIG9mIGNvdXJzZSwgYmUgZ3JlYXRseSBwcmVmZXJyZWQsIGJ1dCBvdXIgb3B0aW9ucyBhcHBlYXIKKwkgKiB0byBiZSByYXRoZXIgbGltaXRlZCwgc28gd2Ugd2lsbCBqdXN0IGRvIGl0IG91cnNlbHZlcyBoZXJlLgorCSAqLworCXJlcy53b3JkID0gMDsKKworCWMgPSAqY3A7CisJZm9yKDs7KSB7CisJCWlmKCFpc2RpZ2l0KGMpKSByZXR1cm4gdXNlZDsKKwkJdmFsID0gMDsgYmFzZSA9IDEwOyBkaWdpdCA9IDA7CisJCWlmKGMgPT0gJzAnKSB7CisJCQljID0gKisrY3A7CisJCQlpZihjID09ICd4JyB8fCBjID09ICdYJykgYmFzZSA9IDE2LCBjID0gKisrY3A7CisJCQllbHNlIHsgYmFzZSA9IDg7IGRpZ2l0ID0gMTsgfQorCQl9CisJCWZvcig7OykgeworCQkJaWYoaXNhc2NpaShjKSAmJiBpc2RpZ2l0KGMpKSB7CisJCQkJaWYoYmFzZSA9PSA4ICYmIChjID09ICc4JyB8fCBjID09ICcwJykpIHJldHVybiB1c2VkOworCQkJCXZhbCA9ICh2YWwgKiBiYXNlKSArIChjIC0gJzAnKTsKKwkJCQljID0gKisrY3A7CisJCQkJZGlnaXQgPSAxOworCQkJfSBlbHNlIGlmKGJhc2UgPT0gMTYgJiYgaXNhc2NpaShjKSAmJiBpc3hkaWdpdChjKSkgeworCQkJCXZhbCA9ICh2YWwgPDwgNCkgfCAoYyArIDEwIC0gKGlzbG93ZXIoYykgPyAnYScgOiAnQScpKTsKKwkJCQljID0gKisrY3A7CisJCQkJZGlnaXQgPSAxOworCQkJfSBlbHNlIGJyZWFrOworCQl9CisJCWlmKGMgPT0gJy4nKSB7CisJCQlpZihwcCA+IHJlcy5ieXRlcyArIDIgfHwgdmFsID4gMHhmZikgcmV0dXJuIHVzZWQ7CisJCQkqcHArKyA9IHZhbDsKKwkJCWMgPSAqKytjcDsKKwkJfSBlbHNlIGJyZWFrOworCX0KKwl1c2VkID0gY3AgLSBidWZmZXI7CisJaWYoYyAhPSAnXDAnICYmICghaXNhc2NpaShjKSB8fCAhaXNzcGFjZShjKSkpIHJldHVybiB1c2VkOworCWlmKGMgPT0gJ1xuJykgdXNlZCsrOworCWlmKCFkaWdpdCkgcmV0dXJuIHVzZWQ7CisKKwlpZih2YWwgPiBtYXhbcHAgLSByZXMuYnl0ZXNdKSByZXR1cm4gdXNlZDsKKwlhZGRyID0gcmVzLndvcmQgfCBodG9ubCh2YWwpOworCisJaWYoIWFkZHIgJiYgY2hlY2tfc2V0ID09IElQVF9SRUNFTlRfU0VUKSByZXR1cm4gdXNlZDsKKworI2lmZGVmIERFQlVHCisJaWYoZGVidWcpIHByaW50ayhLRVJOX0lORk8gUkVDRU5UX05BTUUgIjogaXBfcmVjZW50X2N0cmwgYzogJWMsIGFkZHI6ICV1IHVzZWQ6ICVkXG4iLGMsYWRkcix1c2VkKTsKKyNlbmRpZgorCisJLyogU2V0IHVwIGFuZCBqdXN0IGNhbGwgbWF0Y2ggKi8KKwlpbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwdF9yZWNlbnRfaW5mbyksR0ZQX0tFUk5FTCk7CisJaWYoIWluZm8pIHsgcmV0dXJuIC1FTk9NRU07IH0KKwlpbmZvLT5zZWNvbmRzID0gMDsKKwlpbmZvLT5oaXRfY291bnQgPSAwOworCWluZm8tPmNoZWNrX3NldCA9IGNoZWNrX3NldDsKKwlpbmZvLT5pbnZlcnQgPSAwOworCWluZm8tPnNpZGUgPSBJUFRfUkVDRU5UX1NPVVJDRTsKKwlzdHJuY3B5KGluZm8tPm5hbWUsY3Vycl90YWJsZS0+bmFtZSxJUFRfUkVDRU5UX05BTUVfTEVOKTsKKwlpbmZvLT5uYW1lW0lQVF9SRUNFTlRfTkFNRV9MRU4tMV0gPSAnXDAnOworCisJc2tiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNrX2J1ZmYpLEdGUF9LRVJORUwpOworCWlmICghc2tiKSB7CisJCXVzZWQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX2luZm87CisJfQorCXNrYi0+bmguaXBoID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwaGRyKSxHRlBfS0VSTkVMKTsKKwlpZiAoIXNrYi0+bmguaXBoKSB7CisJCXVzZWQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX3NrYjsKKwl9CisKKwlza2ItPm5oLmlwaC0+c2FkZHIgPSBhZGRyOworCXNrYi0+bmguaXBoLT5kYWRkciA9IDA7CisJLyogQ2xlYXIgdHRsIHNpbmNlIHdlIGhhdmUgbm8gd2F5IG9mIGtub3dpbmcgaXQgKi8KKwlza2ItPm5oLmlwaC0+dHRsID0gMDsKKwltYXRjaChza2IsTlVMTCxOVUxMLGluZm8sMCxOVUxMKTsKKworCWtmcmVlKHNrYi0+bmguaXBoKTsKK291dF9mcmVlX3NrYjoKKwlrZnJlZShza2IpOworb3V0X2ZyZWVfaW5mbzoKKwlrZnJlZShpbmZvKTsKKworI2lmZGVmIERFQlVHCisJaWYoZGVidWcpIHByaW50ayhLRVJOX0lORk8gUkVDRU5UX05BTUUgIjogTGVhdmluZyBpcF9yZWNlbnRfY3RybCBhZGRyOiAldSB1c2VkOiAlZFxuIixhZGRyLHVzZWQpOworI2VuZGlmCisJcmV0dXJuIHVzZWQ7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCisvKiAnbWF0Y2gnIGlzIG91ciBwcmltYXJ5IGZ1bmN0aW9uLCBjYWxsZWQgYnkgdGhlIGtlcm5lbCB3aGVuZXZlciBhIHJ1bGUgaXMKKyAqIGhpdCB3aXRoIG91ciBtb2R1bGUgYXMgYW4gb3B0aW9uIHRvIGl0LgorICogV2hhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgZGVwZW5kcyBvbiB3aGF0IHdhcyBzcGVjaWZpY2FsbHkgYXNrZWQgb2YgaXQgYnkKKyAqIHRoZSB1c2VyOgorICogLS1zZXQgLS0gQWRkIG9yIHVwZGF0ZSBsYXN0IHNlZW4gdGltZSBvZiB0aGUgc291cmNlIGFkZHJlc3Mgb2YgdGhlIHBhY2tldAorICogICAtLSBtYXRjaGluZm8tPmNoZWNrX3NldCA9PSBJUFRfUkVDRU5UX1NFVAorICogLS1yY2hlY2sgLS0gSnVzdCBjaGVjayBpZiB0aGUgc291cmNlIGFkZHJlc3MgaXMgaW4gdGhlIGxpc3QKKyAqICAgLS0gbWF0Y2hpbmZvLT5jaGVja19zZXQgPT0gSVBUX1JFQ0VOVF9DSEVDSworICogLS11cGRhdGUgLS0gSWYgdGhlIHNvdXJjZSBhZGRyZXNzIGlzIGluIHRoZSBsaXN0LCB1cGRhdGUgbGFzdF9zZWVuCisgKiAgIC0tIG1hdGNoaW5mby0+Y2hlY2tfc2V0ID09IElQVF9SRUNFTlRfVVBEQVRFCisgKiAtLXJlbW92ZSAtLSBJZiB0aGUgc291cmNlIGFkZHJlc3MgaXMgaW4gdGhlIGxpc3QsIHJlbW92ZSBpdAorICogICAtLSBtYXRjaGluZm8tPmNoZWNrX3NldCA9PSBJUFRfUkVDRU5UX1JFTU9WRQorICogLS1zZWNvbmRzIC0tIE9wdGlvbiB0byAtLXJjaGVjay8tLXVwZGF0ZSwgb25seSBtYXRjaCBpZiBsYXN0X3NlZW4gd2l0aGluIHNlY29uZHMKKyAqICAgLS0gbWF0Y2hpbmZvLT5zZWNvbmRzCisgKiAtLWhpdGNvdW50IC0tIE9wdGlvbiB0byAtLXJjaGVjay8tLXVwZGF0ZSwgb25seSBtYXRjaCBpZiBzZWVuIGhpdGNvdW50IHRpbWVzCisgKiAgIC0tIG1hdGNoaW5mby0+aGl0X2NvdW50CisgKiAtLXNlY29uZHMgYW5kIC0taGl0Y291bnQgY2FuIGJlIGNvbWJpbmVkCisgKi8KK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIGludCAqaG90ZHJvcCkKK3sKKwlpbnQgcGt0X2NvdW50LCBoaXRzX2ZvdW5kLCBhbnM7CisJdW5zaWduZWQgbG9uZyBub3c7CisJY29uc3Qgc3RydWN0IGlwdF9yZWNlbnRfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwl1X2ludDMyX3QgYWRkciA9IDAsIHRpbWVfdGVtcDsKKwl1X2ludDhfdCB0dGwgPSBza2ItPm5oLmlwaC0+dHRsOworCWludCAqaGFzaF90YWJsZTsKKwlpbnQgb3JpZ19oYXNoX3Jlc3VsdCwgaGFzaF9yZXN1bHQsIHRlbXAsIGxvY2F0aW9uID0gMCwgdGltZV9sb2MsIGVuZF9jb2xsaXNpb25fY2hhaW4gPSAtMTsKKwlzdHJ1Y3QgdGltZV9pbmZvX2xpc3QgKnRpbWVfaW5mbzsKKwlzdHJ1Y3QgcmVjZW50X2lwX3RhYmxlcyAqY3Vycl90YWJsZTsKKwlzdHJ1Y3QgcmVjZW50X2lwX3RhYmxlcyAqbGFzdF90YWJsZTsKKwlzdHJ1Y3QgcmVjZW50X2lwX2xpc3QgKnJfbGlzdDsKKworI2lmZGVmIERFQlVHCisJaWYoZGVidWcpIHByaW50ayhLRVJOX0lORk8gUkVDRU5UX05BTUUgIjogbWF0Y2goKSBjYWxsZWRcbiIpOworI2VuZGlmCisKKwkvKiBEZWZhdWx0IGlzIGZhbHNlIF4gaW5mby0+aW52ZXJ0ICovCisJYW5zID0gaW5mby0+aW52ZXJ0OworCisjaWZkZWYgREVCVUcKKwlpZihkZWJ1ZykgcHJpbnRrKEtFUk5fSU5GTyBSRUNFTlRfTkFNRSAiOiBtYXRjaCgpOiBuYW1lID0gJyVzJ1xuIixpbmZvLT5uYW1lKTsKKyNlbmRpZgorCisJLyogaWYgb3V0ICE9IE5VTEwgdGhlbiByb3V0aW5nIGhhcyBiZWVuIGRvbmUgYW5kIFRUTCBjaGFuZ2VkLgorCSAqIFdlIGNoYW5nZSBpdCBiYWNrIGhlcmUgaW50ZXJuYWxseSBmb3IgbWF0Y2ggd2hhdCBjYW1lIGluIGJlZm9yZSByb3V0aW5nLiAqLworCWlmKG91dCkgdHRsKys7CisKKwkvKiBGaW5kIHRoZSByaWdodCB0YWJsZSAqLworCXNwaW5fbG9ja19iaCgmcmVjZW50X2xvY2spOworCWN1cnJfdGFibGUgPSByX3RhYmxlczsKKwl3aGlsZSggKGxhc3RfdGFibGUgPSBjdXJyX3RhYmxlKSAmJiBzdHJuY21wKGluZm8tPm5hbWUsY3Vycl90YWJsZS0+bmFtZSxJUFRfUkVDRU5UX05BTUVfTEVOKSAmJiAoY3Vycl90YWJsZSA9IGN1cnJfdGFibGUtPm5leHQpICk7CisKKyNpZmRlZiBERUJVRworCWlmKGRlYnVnKSBwcmludGsoS0VSTl9JTkZPIFJFQ0VOVF9OQU1FICI6IG1hdGNoKCk6IHRhYmxlIGZvdW5kKCclcycpXG4iLGluZm8tPm5hbWUpOworI2VuZGlmCisKKwlzcGluX3VubG9ja19iaCgmcmVjZW50X2xvY2spOworCisJLyogVGFibGUgd2l0aCB0aGlzIG5hbWUgbm90IGZvdW5kLCBtYXRjaCBpbXBvc3NpYmxlICovCisJaWYoIWN1cnJfdGFibGUpIHsgcmV0dXJuIGFuczsgfQorCisJLyogTWFrZSBzdXJlIG5vIG9uZSBpcyBjaGFuZ2luZyB0aGUgbGlzdCB3aGlsZSB3ZSB3b3JrIHdpdGggaXQgKi8KKwlzcGluX2xvY2tfYmgoJmN1cnJfdGFibGUtPmxpc3RfbG9jayk7CisKKwlyX2xpc3QgPSBjdXJyX3RhYmxlLT50YWJsZTsKKwlpZihpbmZvLT5zaWRlID09IElQVF9SRUNFTlRfREVTVCkgYWRkciA9IHNrYi0+bmguaXBoLT5kYWRkcjsgZWxzZSBhZGRyID0gc2tiLT5uaC5pcGgtPnNhZGRyOworCisJaWYoIWFkZHIpIHsgCisjaWZkZWYgREVCVUcKKwkJaWYoZGVidWcpIHByaW50ayhLRVJOX0lORk8gUkVDRU5UX05BTUUgIjogbWF0Y2goKSBhZGRyZXNzICgldSkgaW52YWxpZCwgbGVhdmluZy5cbiIsYWRkcik7CisjZW5kaWYKKwkJc3Bpbl91bmxvY2tfYmgoJmN1cnJfdGFibGUtPmxpc3RfbG9jayk7CisJCXJldHVybiBhbnM7CisJfQorCisjaWZkZWYgREVCVUcKKwlpZihkZWJ1ZykgcHJpbnRrKEtFUk5fSU5GTyBSRUNFTlRfTkFNRSAiOiBtYXRjaCgpOiBjaGVja2luZyB0YWJsZSwgYWRkcjogJXUsIHR0bDogJXUsIG9yaWdfdHRsOiAldVxuIixhZGRyLHR0bCxza2ItPm5oLmlwaC0+dHRsKTsKKyNlbmRpZgorCisJLyogR2V0IGppZmZpZXMgbm93IGluIGNhc2UgdGhleSBjaGFuZ2VkIHdoaWxlIHdlIHdlcmUgd2FpdGluZyBmb3IgYSBsb2NrICovCisJbm93ID0gamlmZmllczsKKwloYXNoX3RhYmxlID0gY3Vycl90YWJsZS0+aGFzaF90YWJsZTsKKwl0aW1lX2luZm8gPSBjdXJyX3RhYmxlLT50aW1lX2luZm87CisKKwlvcmlnX2hhc2hfcmVzdWx0ID0gaGFzaF9yZXN1bHQgPSBoYXNoX2Z1bmMoYWRkcixpcF9saXN0X2hhc2hfc2l6ZSk7CisJLyogSGFzaCBlbnRyeSBhdCB0aGlzIHJlc3VsdCB1c2VkICovCisJLyogQ2hlY2sgZm9yIFRUTCBtYXRjaCBpZiByZXF1ZXN0ZWQuICBJZiBUVEwgaXMgemVybyB0aGVuIGEgbWF0Y2ggd291bGQgbmV2ZXIKKwkgKiBoYXBwZW4sIHNvIG1hdGNoIHJlZ2FyZGxlc3Mgb2YgZXhpc3RpbmcgVFRMIGluIHRoYXQgY2FzZS4gIFplcm8gbWVhbnMgdGhlCisJICogZW50cnkgd2FzIGFkZGVkIHZpYSB0aGUgL3Byb2MgaW50ZXJmYWNlIGFueXdheSwgc28gd2Ugd2lsbCBqdXN0IHVzZSB0aGUKKwkgKiBmaXJzdCBUVEwgd2UgZ2V0IGZvciB0aGF0IElQIGFkZHJlc3MuICovCisJaWYoaW5mby0+Y2hlY2tfc2V0ICYgSVBUX1JFQ0VOVF9UVEwpIHsKKwkJd2hpbGUoaGFzaF90YWJsZVtoYXNoX3Jlc3VsdF0gIT0gLTEgJiYgIShyX2xpc3RbaGFzaF90YWJsZVtoYXNoX3Jlc3VsdF1dLmFkZHIgPT0gYWRkciAmJgorCQkJKCFyX2xpc3RbaGFzaF90YWJsZVtoYXNoX3Jlc3VsdF1dLnR0bCB8fCByX2xpc3RbaGFzaF90YWJsZVtoYXNoX3Jlc3VsdF1dLnR0bCA9PSB0dGwpKSkgeworCQkJLyogQ29sbGlzaW9uIGluIGhhc2ggdGFibGUgKi8KKwkJCWhhc2hfcmVzdWx0ID0gKGhhc2hfcmVzdWx0ICsgMSkgJSBpcF9saXN0X2hhc2hfc2l6ZTsKKwkJfQorCX0gZWxzZSB7CisJCXdoaWxlKGhhc2hfdGFibGVbaGFzaF9yZXN1bHRdICE9IC0xICYmIHJfbGlzdFtoYXNoX3RhYmxlW2hhc2hfcmVzdWx0XV0uYWRkciAhPSBhZGRyKSB7CisJCQkvKiBDb2xsaXNpb24gaW4gaGFzaCB0YWJsZSAqLworCQkJaGFzaF9yZXN1bHQgPSAoaGFzaF9yZXN1bHQgKyAxKSAlIGlwX2xpc3RfaGFzaF9zaXplOworCQl9CisJfQorCisJaWYoaGFzaF90YWJsZVtoYXNoX3Jlc3VsdF0gPT0gLTEgJiYgIShpbmZvLT5jaGVja19zZXQgJiBJUFRfUkVDRU5UX1NFVCkpIHsKKwkJLyogSVAgbm90IGluIGxpc3QgYW5kIG5vdCBhc2tlZCB0byBTRVQgKi8KKwkJc3Bpbl91bmxvY2tfYmgoJmN1cnJfdGFibGUtPmxpc3RfbG9jayk7CisJCXJldHVybiBhbnM7CisJfQorCisJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBoYW5kbGUgdGhlIGNvbGxpc2lvbiwgZG8gbm90IG5lZWQgdG8gb24gUkVNT1ZFICovCisJaWYob3JpZ19oYXNoX3Jlc3VsdCAhPSBoYXNoX3Jlc3VsdCAmJiAhKGluZm8tPmNoZWNrX3NldCAmIElQVF9SRUNFTlRfUkVNT1ZFKSkgeworI2lmZGVmIERFQlVHCisJCWlmKGRlYnVnKSBwcmludGsoS0VSTl9JTkZPIFJFQ0VOVF9OQU1FICI6IG1hdGNoKCk6IENvbGxpc2lvbiBpbiBoYXNoIHRhYmxlLiAob3I6ICVkLGhyOiAlZCxvYTogJXUsaGE6ICV1KVxuIiwKKwkJCQkgb3JpZ19oYXNoX3Jlc3VsdCwKKwkJCQkgaGFzaF9yZXN1bHQsCisJCQkJIHJfbGlzdFtoYXNoX3RhYmxlW29yaWdfaGFzaF9yZXN1bHRdXS5hZGRyLAorCQkJCSBhZGRyKTsKKyNlbmRpZgorCisJCS8qIFdlIGhhZCBhIGNvbGxpc2lvbi4KKwkJICogb3JpZ19oYXNoX3Jlc3VsdCBpcyB3aGVyZSB3ZSBzdGFydGVkLCBoYXNoX3Jlc3VsdCBpcyB3aGVyZSB3ZSBlbmRlZCB1cC4KKwkJICogU28sIHN3YXAgdGhlbSBiZWNhdXNlIHdlIGFyZSBsaWtlbHkgdG8gc2VlIHRoZSBzYW1lIGd1eSBhZ2FpbiBzb29uZXIgKi8KKyNpZmRlZiBERUJVRworCQlpZihkZWJ1ZykgeworCQkgIHByaW50ayhLRVJOX0lORk8gUkVDRU5UX05BTUUgIjogbWF0Y2goKTogQ29sbGlzaW9uOyBoYXNoX3RhYmxlW29yaWdfaGFzaF9yZXN1bHRdID0gJWRcbiIsaGFzaF90YWJsZVtvcmlnX2hhc2hfcmVzdWx0XSk7CisJCSAgcHJpbnRrKEtFUk5fSU5GTyBSRUNFTlRfTkFNRSAiOiBtYXRjaCgpOiBDb2xsaXNpb247IHJfbGlzdFtoYXNoX3RhYmxlW29yaWdfaGFzaF9yZXN1bHRdXS5oYXNoX2VudHJ5ID0gJWRcbiIsCisJCQkJcl9saXN0W2hhc2hfdGFibGVbb3JpZ19oYXNoX3Jlc3VsdF1dLmhhc2hfZW50cnkpOworCQl9CisjZW5kaWYKKworCQlyX2xpc3RbaGFzaF90YWJsZVtvcmlnX2hhc2hfcmVzdWx0XV0uaGFzaF9lbnRyeSA9IGhhc2hfcmVzdWx0OworCisKKwkJdGVtcCA9IGhhc2hfdGFibGVbb3JpZ19oYXNoX3Jlc3VsdF07CisjaWZkZWYgREVCVUcKKwkJaWYoZGVidWcpIHByaW50ayhLRVJOX0lORk8gUkVDRU5UX05BTUUgIjogbWF0Y2goKTogQ29sbGlzaW9uOyBoYXNoX3RhYmxlW2hhc2hfcmVzdWx0XSA9ICVkXG4iLGhhc2hfdGFibGVbaGFzaF9yZXN1bHRdKTsKKyNlbmRpZgorCQloYXNoX3RhYmxlW29yaWdfaGFzaF9yZXN1bHRdID0gaGFzaF90YWJsZVtoYXNoX3Jlc3VsdF07CisJCWhhc2hfdGFibGVbaGFzaF9yZXN1bHRdID0gdGVtcDsKKwkJdGVtcCA9IGhhc2hfcmVzdWx0OworCQloYXNoX3Jlc3VsdCA9IG9yaWdfaGFzaF9yZXN1bHQ7CisJCW9yaWdfaGFzaF9yZXN1bHQgPSB0ZW1wOworCQl0aW1lX2luZm9bcl9saXN0W2hhc2hfdGFibGVbb3JpZ19oYXNoX3Jlc3VsdF1dLnRpbWVfcG9zXS5wb3NpdGlvbiA9IGhhc2hfdGFibGVbb3JpZ19oYXNoX3Jlc3VsdF07CisJCWlmKGhhc2hfdGFibGVbaGFzaF9yZXN1bHRdICE9IC0xKSB7CisJCQlyX2xpc3RbaGFzaF90YWJsZVtoYXNoX3Jlc3VsdF1dLmhhc2hfZW50cnkgPSBoYXNoX3Jlc3VsdDsKKwkJCXRpbWVfaW5mb1tyX2xpc3RbaGFzaF90YWJsZVtoYXNoX3Jlc3VsdF1dLnRpbWVfcG9zXS5wb3NpdGlvbiA9IGhhc2hfdGFibGVbaGFzaF9yZXN1bHRdOworCQl9CisKKyNpZmRlZiBERUJVRworCQlpZihkZWJ1ZykgcHJpbnRrKEtFUk5fSU5GTyBSRUNFTlRfTkFNRSAiOiBtYXRjaCgpOiBDb2xsaXNpb24gaGFuZGxlZC5cbiIpOworI2VuZGlmCisJfQorCisJaWYoaGFzaF90YWJsZVtoYXNoX3Jlc3VsdF0gPT0gLTEpIHsKKyNpZmRlZiBERUJVRworCQlpZihkZWJ1ZykgcHJpbnRrKEtFUk5fSU5GTyBSRUNFTlRfTkFNRSAiOiBtYXRjaCgpOiBOZXcgdGFibGUgZW50cnkuIChocjogJWQsaGE6ICV1KVxuIiwKKwkJCQkgaGFzaF9yZXN1bHQsIGFkZHIpOworI2VuZGlmCisKKwkJLyogTmV3IGl0ZW0gZm91bmQgYW5kIElQVF9SRUNFTlRfU0VULCBzbyB3ZSBuZWVkIHRvIGFkZCBpdCAqLworCQlsb2NhdGlvbiA9IHRpbWVfaW5mb1tjdXJyX3RhYmxlLT50aW1lX3Bvc10ucG9zaXRpb247CisJCWhhc2hfdGFibGVbcl9saXN0W2xvY2F0aW9uXS5oYXNoX2VudHJ5XSA9IC0xOworCQloYXNoX3RhYmxlW2hhc2hfcmVzdWx0XSA9IGxvY2F0aW9uOworCQltZW1zZXQocl9saXN0W2xvY2F0aW9uXS5sYXN0X3BrdHMsMCxpcF9wa3RfbGlzdF90b3Qqc2l6ZW9mKHVfaW50MzJfdCkpOworCQlyX2xpc3RbbG9jYXRpb25dLnRpbWVfcG9zID0gY3Vycl90YWJsZS0+dGltZV9wb3M7CisJCXJfbGlzdFtsb2NhdGlvbl0uYWRkciA9IGFkZHI7CisJCXJfbGlzdFtsb2NhdGlvbl0udHRsID0gdHRsOworCQlyX2xpc3RbbG9jYXRpb25dLmxhc3Rfc2VlbiA9IG5vdzsKKwkJcl9saXN0W2xvY2F0aW9uXS5vbGRlc3RfcGt0ID0gMTsKKwkJcl9saXN0W2xvY2F0aW9uXS5sYXN0X3BrdHNbMF0gPSBub3c7CisJCXJfbGlzdFtsb2NhdGlvbl0uaGFzaF9lbnRyeSA9IGhhc2hfcmVzdWx0OworCQl0aW1lX2luZm9bY3Vycl90YWJsZS0+dGltZV9wb3NdLnRpbWUgPSByX2xpc3RbbG9jYXRpb25dLmxhc3Rfc2VlbjsKKwkJY3Vycl90YWJsZS0+dGltZV9wb3MgPSAoY3Vycl90YWJsZS0+dGltZV9wb3MgKyAxKSAlIGlwX2xpc3RfdG90OworCisJCWFucyA9ICFpbmZvLT5pbnZlcnQ7CisJfSBlbHNlIHsKKyNpZmRlZiBERUJVRworCQlpZihkZWJ1ZykgcHJpbnRrKEtFUk5fSU5GTyBSRUNFTlRfTkFNRSAiOiBtYXRjaCgpOiBFeGlzdGluZyB0YWJsZSBlbnRyeS4gKGhyOiAlZCxoYTogJXUpXG4iLAorCQkJCSBoYXNoX3Jlc3VsdCwKKwkJCQkgYWRkcik7CisjZW5kaWYKKworCQkvKiBFeGlzdGluZyBpdGVtIGZvdW5kICovCisJCWxvY2F0aW9uID0gaGFzaF90YWJsZVtoYXNoX3Jlc3VsdF07CisJCS8qIFdlIGhhdmUgYSBtYXRjaCBvbiBhZGRyZXNzLCBub3cgdG8gbWFrZSBzdXJlIGl0IG1lZXRzIGFsbCByZXF1aXJlbWVudHMgZm9yIGEKKwkJICogZnVsbCBtYXRjaC4gKi8KKwkJaWYoaW5mby0+Y2hlY2tfc2V0ICYgSVBUX1JFQ0VOVF9DSEVDSyB8fCBpbmZvLT5jaGVja19zZXQgJiBJUFRfUkVDRU5UX1VQREFURSkgeworCQkJaWYoIWluZm8tPnNlY29uZHMgJiYgIWluZm8tPmhpdF9jb3VudCkgYW5zID0gIWluZm8tPmludmVydDsgZWxzZSBhbnMgPSBpbmZvLT5pbnZlcnQ7CisJCQlpZihpbmZvLT5zZWNvbmRzICYmICFpbmZvLT5oaXRfY291bnQpIHsKKwkJCQlpZih0aW1lX2JlZm9yZV9lcShub3cscl9saXN0W2xvY2F0aW9uXS5sYXN0X3NlZW4raW5mby0+c2Vjb25kcypIWikpIGFucyA9ICFpbmZvLT5pbnZlcnQ7IGVsc2UgYW5zID0gaW5mby0+aW52ZXJ0OworCQkJfQorCQkJaWYoaW5mby0+c2Vjb25kcyAmJiBpbmZvLT5oaXRfY291bnQpIHsKKwkJCQlmb3IocGt0X2NvdW50ID0gMCwgaGl0c19mb3VuZCA9IDA7IHBrdF9jb3VudCA8IGlwX3BrdF9saXN0X3RvdDsgcGt0X2NvdW50KyspIHsKKwkJCQkJaWYodGltZV9iZWZvcmVfZXEobm93LHJfbGlzdFtsb2NhdGlvbl0ubGFzdF9wa3RzW3BrdF9jb3VudF0raW5mby0+c2Vjb25kcypIWikpIGhpdHNfZm91bmQrKzsKKwkJCQl9CisJCQkJaWYoaGl0c19mb3VuZCA+PSBpbmZvLT5oaXRfY291bnQpIGFucyA9ICFpbmZvLT5pbnZlcnQ7IGVsc2UgYW5zID0gaW5mby0+aW52ZXJ0OworCQkJfQorCQkJaWYoaW5mby0+aGl0X2NvdW50ICYmICFpbmZvLT5zZWNvbmRzKSB7CisJCQkJZm9yKHBrdF9jb3VudCA9IDAsIGhpdHNfZm91bmQgPSAwOyBwa3RfY291bnQgPCBpcF9wa3RfbGlzdF90b3Q7IHBrdF9jb3VudCsrKSB7CisJCQkJCWlmKHJfbGlzdFtsb2NhdGlvbl0ubGFzdF9wa3RzW3BrdF9jb3VudF0gPT0gMCkgYnJlYWs7CisJCQkJCWhpdHNfZm91bmQrKzsKKwkJCQl9CisJCQkJaWYoaGl0c19mb3VuZCA+PSBpbmZvLT5oaXRfY291bnQpIGFucyA9ICFpbmZvLT5pbnZlcnQ7IGVsc2UgYW5zID0gaW5mby0+aW52ZXJ0OworCQkJfQorCQl9CisjaWZkZWYgREVCVUcKKwkJaWYoZGVidWcpIHsKKwkJCWlmKGFucykKKwkJCQlwcmludGsoS0VSTl9JTkZPIFJFQ0VOVF9OQU1FICI6IG1hdGNoKCk6IG1hdGNoIGFkZHI6ICV1XG4iLGFkZHIpOworCQkJZWxzZQorCQkJCXByaW50ayhLRVJOX0lORk8gUkVDRU5UX05BTUUgIjogbWF0Y2goKTogbm8gbWF0Y2ggYWRkcjogJXVcbiIsYWRkcik7CisJCX0KKyNlbmRpZgorCisJCS8qIElmIGFuZCBvbmx5IGlmIHdlIGhhdmUgYmVlbiBhc2tlZCB0byBTRVQsIG9yIHRvIFVQREFURSAob24gbWF0Y2gpIGRvIHdlIGFkZCB0aGUKKwkJICogY3VycmVudCB0aW1lc3RhbXAgdG8gdGhlIGxhc3Rfc2Vlbi4gKi8KKwkJaWYoKGluZm8tPmNoZWNrX3NldCAmIElQVF9SRUNFTlRfU0VUICYmIChhbnMgPSAhaW5mby0+aW52ZXJ0KSkgfHwgKGluZm8tPmNoZWNrX3NldCAmIElQVF9SRUNFTlRfVVBEQVRFICYmIGFucykpIHsKKyNpZmRlZiBERUJVRworCQkJaWYoZGVidWcpIHByaW50ayhLRVJOX0lORk8gUkVDRU5UX05BTUUgIjogbWF0Y2goKTogU0VUIG9yIFVQREFURTsgdXBkYXRpbmcgdGltZSBpbmZvLlxuIik7CisjZW5kaWYKKwkJCS8qIEhhdmUgdG8gdXBkYXRlIG91ciB0aW1lIGluZm8gKi8KKwkJCXRpbWVfbG9jID0gcl9saXN0W2xvY2F0aW9uXS50aW1lX3BvczsKKwkJCXRpbWVfaW5mb1t0aW1lX2xvY10udGltZSA9IG5vdzsKKwkJCXRpbWVfaW5mb1t0aW1lX2xvY10ucG9zaXRpb24gPSBsb2NhdGlvbjsKKwkJCXdoaWxlKCh0aW1lX2luZm9bKHRpbWVfbG9jKzEpICUgaXBfbGlzdF90b3RdLnRpbWUgPCB0aW1lX2luZm9bdGltZV9sb2NdLnRpbWUpICYmICgodGltZV9sb2MrMSkgJSBpcF9saXN0X3RvdCkgIT0gY3Vycl90YWJsZS0+dGltZV9wb3MpIHsKKwkJCQl0aW1lX3RlbXAgPSB0aW1lX2luZm9bdGltZV9sb2NdLnRpbWU7CisJCQkJdGltZV9pbmZvW3RpbWVfbG9jXS50aW1lID0gdGltZV9pbmZvWyh0aW1lX2xvYysxKSVpcF9saXN0X3RvdF0udGltZTsKKwkJCQl0aW1lX2luZm9bKHRpbWVfbG9jKzEpJWlwX2xpc3RfdG90XS50aW1lID0gdGltZV90ZW1wOworCQkJCXRpbWVfdGVtcCA9IHRpbWVfaW5mb1t0aW1lX2xvY10ucG9zaXRpb247CisJCQkJdGltZV9pbmZvW3RpbWVfbG9jXS5wb3NpdGlvbiA9IHRpbWVfaW5mb1sodGltZV9sb2MrMSklaXBfbGlzdF90b3RdLnBvc2l0aW9uOworCQkJCXRpbWVfaW5mb1sodGltZV9sb2MrMSklaXBfbGlzdF90b3RdLnBvc2l0aW9uID0gdGltZV90ZW1wOworCQkJCXJfbGlzdFt0aW1lX2luZm9bdGltZV9sb2NdLnBvc2l0aW9uXS50aW1lX3BvcyA9IHRpbWVfbG9jOworCQkJCXJfbGlzdFt0aW1lX2luZm9bKHRpbWVfbG9jKzEpJWlwX2xpc3RfdG90XS5wb3NpdGlvbl0udGltZV9wb3MgPSAodGltZV9sb2MrMSklaXBfbGlzdF90b3Q7CisJCQkJdGltZV9sb2MgPSAodGltZV9sb2MrMSkgJSBpcF9saXN0X3RvdDsKKwkJCX0KKwkJCXJfbGlzdFtsb2NhdGlvbl0udGltZV9wb3MgPSB0aW1lX2xvYzsKKwkJCXJfbGlzdFtsb2NhdGlvbl0udHRsID0gdHRsOworCQkJcl9saXN0W2xvY2F0aW9uXS5sYXN0X3BrdHNbcl9saXN0W2xvY2F0aW9uXS5vbGRlc3RfcGt0XSA9IG5vdzsKKwkJCXJfbGlzdFtsb2NhdGlvbl0ub2xkZXN0X3BrdCA9ICsrcl9saXN0W2xvY2F0aW9uXS5vbGRlc3RfcGt0ICUgaXBfcGt0X2xpc3RfdG90OworCQkJcl9saXN0W2xvY2F0aW9uXS5sYXN0X3NlZW4gPSBub3c7CisJCX0KKwkJLyogSWYgd2UgaGF2ZSBiZWVuIGFza2VkIHRvIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdCwganVzdCBzZXQgaXQgdG8gMCAqLworCQlpZihpbmZvLT5jaGVja19zZXQgJiBJUFRfUkVDRU5UX1JFTU9WRSkgeworI2lmZGVmIERFQlVHCisJCQlpZihkZWJ1ZykgcHJpbnRrKEtFUk5fSU5GTyBSRUNFTlRfTkFNRSAiOiBtYXRjaCgpOiBSRU1PVkU7IGNsZWFyaW5nIGVudHJ5IChvcjogJWQsIGhyOiAlZCkuXG4iLG9yaWdfaGFzaF9yZXN1bHQsaGFzaF9yZXN1bHQpOworI2VuZGlmCisJCQkvKiBDaGVjayBpZiB0aGlzIGlzIHBhcnQgb2YgYSBjb2xsaXNpb24gY2hhaW4gKi8KKwkJCXdoaWxlKGhhc2hfdGFibGVbKG9yaWdfaGFzaF9yZXN1bHQrMSkgJSBpcF9saXN0X2hhc2hfc2l6ZV0gIT0gLTEpIHsKKwkJCQlvcmlnX2hhc2hfcmVzdWx0Kys7CisJCQkJaWYoaGFzaF9mdW5jKHJfbGlzdFtoYXNoX3RhYmxlW29yaWdfaGFzaF9yZXN1bHRdXS5hZGRyLGlwX2xpc3RfaGFzaF9zaXplKSA9PSBoYXNoX3Jlc3VsdCkgeworCQkJCQkvKiBGb3VuZCBjb2xsaXNpb24gY2hhaW4sIGhvdyBkZWVwIGRvZXMgdGhpcyByYWJiaXQgaG9sZSBnbz8gKi8KKyNpZmRlZiBERUJVRworCQkJCQlpZihkZWJ1ZykgcHJpbnRrKEtFUk5fSU5GTyBSRUNFTlRfTkFNRSAiOiBtYXRjaCgpOiBSRU1PVkU7IGZvdW5kIGNvbGxpc2lvbiBjaGFpbi5cbiIpOworI2VuZGlmCisJCQkJCWVuZF9jb2xsaXNpb25fY2hhaW4gPSBvcmlnX2hhc2hfcmVzdWx0OworCQkJCX0KKwkJCX0KKwkJCWlmKGVuZF9jb2xsaXNpb25fY2hhaW4gIT0gLTEpIHsKKyNpZmRlZiBERUJVRworCQkJCWlmKGRlYnVnKSBwcmludGsoS0VSTl9JTkZPIFJFQ0VOVF9OQU1FICI6IG1hdGNoKCk6IFJFTU9WRTsgcGFydCBvZiBjb2xsaXNpb24gY2hhaW4sIG1vdmluZyB0byBlbmQuXG4iKTsKKyNlbmRpZgorCQkJCS8qIFBhcnQgb2YgYSBjb2xsaXNpb24gY2hhaW4sIHN3YXAgaXQgd2l0aCB0aGUgZW5kIG9mIHRoZSBjaGFpbgorCQkJCSAqIGJlZm9yZSByZW1vdmluZy4gKi8KKwkJCQlyX2xpc3RbaGFzaF90YWJsZVtlbmRfY29sbGlzaW9uX2NoYWluXV0uaGFzaF9lbnRyeSA9IGhhc2hfcmVzdWx0OworCQkJCXRlbXAgPSBoYXNoX3RhYmxlW2VuZF9jb2xsaXNpb25fY2hhaW5dOworCQkJCWhhc2hfdGFibGVbZW5kX2NvbGxpc2lvbl9jaGFpbl0gPSBoYXNoX3RhYmxlW2hhc2hfcmVzdWx0XTsKKwkJCQloYXNoX3RhYmxlW2hhc2hfcmVzdWx0XSA9IHRlbXA7CisJCQkJdGltZV9pbmZvW3JfbGlzdFtoYXNoX3RhYmxlW2hhc2hfcmVzdWx0XV0udGltZV9wb3NdLnBvc2l0aW9uID0gaGFzaF90YWJsZVtoYXNoX3Jlc3VsdF07CisJCQkJaGFzaF9yZXN1bHQgPSBlbmRfY29sbGlzaW9uX2NoYWluOworCQkJCXJfbGlzdFtoYXNoX3RhYmxlW2hhc2hfcmVzdWx0XV0uaGFzaF9lbnRyeSA9IGhhc2hfcmVzdWx0OworCQkJCXRpbWVfaW5mb1tyX2xpc3RbaGFzaF90YWJsZVtoYXNoX3Jlc3VsdF1dLnRpbWVfcG9zXS5wb3NpdGlvbiA9IGhhc2hfdGFibGVbaGFzaF9yZXN1bHRdOworCQkJfQorCQkJbG9jYXRpb24gPSBoYXNoX3RhYmxlW2hhc2hfcmVzdWx0XTsKKwkJCWhhc2hfdGFibGVbcl9saXN0W2xvY2F0aW9uXS5oYXNoX2VudHJ5XSA9IC0xOworCQkJdGltZV9sb2MgPSByX2xpc3RbbG9jYXRpb25dLnRpbWVfcG9zOworCQkJdGltZV9pbmZvW3RpbWVfbG9jXS50aW1lID0gMDsKKwkJCXRpbWVfaW5mb1t0aW1lX2xvY10ucG9zaXRpb24gPSBsb2NhdGlvbjsKKwkJCXdoaWxlKCh0aW1lX2luZm9bKHRpbWVfbG9jKzEpICUgaXBfbGlzdF90b3RdLnRpbWUgPCB0aW1lX2luZm9bdGltZV9sb2NdLnRpbWUpICYmICgodGltZV9sb2MrMSkgJSBpcF9saXN0X3RvdCkgIT0gY3Vycl90YWJsZS0+dGltZV9wb3MpIHsKKwkJCQl0aW1lX3RlbXAgPSB0aW1lX2luZm9bdGltZV9sb2NdLnRpbWU7CisJCQkJdGltZV9pbmZvW3RpbWVfbG9jXS50aW1lID0gdGltZV9pbmZvWyh0aW1lX2xvYysxKSVpcF9saXN0X3RvdF0udGltZTsKKwkJCQl0aW1lX2luZm9bKHRpbWVfbG9jKzEpJWlwX2xpc3RfdG90XS50aW1lID0gdGltZV90ZW1wOworCQkJCXRpbWVfdGVtcCA9IHRpbWVfaW5mb1t0aW1lX2xvY10ucG9zaXRpb247CisJCQkJdGltZV9pbmZvW3RpbWVfbG9jXS5wb3NpdGlvbiA9IHRpbWVfaW5mb1sodGltZV9sb2MrMSklaXBfbGlzdF90b3RdLnBvc2l0aW9uOworCQkJCXRpbWVfaW5mb1sodGltZV9sb2MrMSklaXBfbGlzdF90b3RdLnBvc2l0aW9uID0gdGltZV90ZW1wOworCQkJCXJfbGlzdFt0aW1lX2luZm9bdGltZV9sb2NdLnBvc2l0aW9uXS50aW1lX3BvcyA9IHRpbWVfbG9jOworCQkJCXJfbGlzdFt0aW1lX2luZm9bKHRpbWVfbG9jKzEpJWlwX2xpc3RfdG90XS5wb3NpdGlvbl0udGltZV9wb3MgPSAodGltZV9sb2MrMSklaXBfbGlzdF90b3Q7CisJCQkJdGltZV9sb2MgPSAodGltZV9sb2MrMSkgJSBpcF9saXN0X3RvdDsKKwkJCX0KKwkJCXJfbGlzdFtsb2NhdGlvbl0udGltZV9wb3MgPSB0aW1lX2xvYzsKKwkJCXJfbGlzdFtsb2NhdGlvbl0ubGFzdF9zZWVuID0gMDsKKwkJCXJfbGlzdFtsb2NhdGlvbl0uYWRkciA9IDA7CisJCQlyX2xpc3RbbG9jYXRpb25dLnR0bCA9IDA7CisJCQltZW1zZXQocl9saXN0W2xvY2F0aW9uXS5sYXN0X3BrdHMsMCxpcF9wa3RfbGlzdF90b3Qqc2l6ZW9mKHVfaW50MzJfdCkpOworCQkJcl9saXN0W2xvY2F0aW9uXS5vbGRlc3RfcGt0ID0gMDsKKwkJCWFucyA9ICFpbmZvLT5pbnZlcnQ7CisJCX0KKwkJc3Bpbl91bmxvY2tfYmgoJmN1cnJfdGFibGUtPmxpc3RfbG9jayk7CisJCXJldHVybiBhbnM7CisJfQorCisJc3Bpbl91bmxvY2tfYmgoJmN1cnJfdGFibGUtPmxpc3RfbG9jayk7CisjaWZkZWYgREVCVUcKKwlpZihkZWJ1ZykgcHJpbnRrKEtFUk5fSU5GTyBSRUNFTlRfTkFNRSAiOiBtYXRjaCgpIGxlZnQuXG4iKTsKKyNlbmRpZgorCXJldHVybiBhbnM7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdG8gdmVyaWZ5IHRoYXQgdGhlIHJ1bGUgZ2l2ZW4gZHVyaW5nIHRoZSB1c2Vyc3BhY2UgaXB0YWJsZXMKKyAqIGNvbW1hbmQgaXMgY29ycmVjdC4KKyAqIElmIHRoZSBjb21tYW5kIGlzIHZhbGlkIHRoZW4gd2UgY2hlY2sgaWYgdGhlIHRhYmxlIG5hbWUgcmVmZXJyZWQgdG8gYnkgdGhlCisgKiBydWxlIGV4aXN0cywgaWYgbm90IGl0IGlzIGNyZWF0ZWQuCisgKi8KK3N0YXRpYyBpbnQKK2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKyAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWludCBmbGFnID0gMCwgYzsKKwl1bnNpZ25lZCBsb25nICpob2xkOworCWNvbnN0IHN0cnVjdCBpcHRfcmVjZW50X2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJc3RydWN0IHJlY2VudF9pcF90YWJsZXMgKmN1cnJfdGFibGUsICpmaW5kX3RhYmxlLCAqbGFzdF90YWJsZTsKKworI2lmZGVmIERFQlVHCisJaWYoZGVidWcpIHByaW50ayhLRVJOX0lORk8gUkVDRU5UX05BTUUgIjogY2hlY2tlbnRyeSgpIGVudGVyZWQuXG4iKTsKKyNlbmRpZgorCisJaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfcmVjZW50X2luZm8pKSkgcmV0dXJuIDA7CisKKwkvKiBzZWNvbmRzIGFuZCBoaXRfY291bnQgb25seSB2YWxpZCBmb3IgQ0hFQ0svVVBEQVRFICovCisJaWYoaW5mby0+Y2hlY2tfc2V0ICYgSVBUX1JFQ0VOVF9TRVQpIHsgZmxhZysrOyBpZihpbmZvLT5zZWNvbmRzIHx8IGluZm8tPmhpdF9jb3VudCkgcmV0dXJuIDA7IH0KKwlpZihpbmZvLT5jaGVja19zZXQgJiBJUFRfUkVDRU5UX1JFTU9WRSkgeyBmbGFnKys7IGlmKGluZm8tPnNlY29uZHMgfHwgaW5mby0+aGl0X2NvdW50KSByZXR1cm4gMDsgfQorCWlmKGluZm8tPmNoZWNrX3NldCAmIElQVF9SRUNFTlRfQ0hFQ0spIGZsYWcrKzsKKwlpZihpbmZvLT5jaGVja19zZXQgJiBJUFRfUkVDRU5UX1VQREFURSkgZmxhZysrOworCisJLyogT25lIGFuZCBvbmx5IG9uZSBvZiB0aGVzZSBzaG91bGQgZXZlciBiZSBzZXQgKi8KKwlpZihmbGFnICE9IDEpIHJldHVybiAwOworCisJLyogTmFtZSBtdXN0IGJlIHNldCB0byBzb21ldGhpbmcgKi8KKwlpZighaW5mby0+bmFtZSB8fCAhaW5mby0+bmFtZVswXSkgcmV0dXJuIDA7CisKKwkvKiBUaGluZ3MgbG9vayBnb29kLCBjcmVhdGUgYSBsaXN0IGZvciB0aGlzIGlmIGl0IGRvZXMgbm90IGV4aXN0ICovCisJLyogTG9jayB0aGUgbGlua2VkIGxpc3Qgd2hpbGUgd2UgcGxheSB3aXRoIGl0ICovCisJc3Bpbl9sb2NrX2JoKCZyZWNlbnRfbG9jayk7CisKKwkvKiBMb29rIGZvciBhbiBlbnRyeSB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGNyZWF0ZWQgKi8KKwkvKiBGaW5kcyB0aGUgZW5kIG9mIHRoZSBsaXN0IGFuZCB0aGUgZW50cnkgYmVmb3JlIHRoZSBlbmQgaWYgY3VycmVudCBuYW1lIGRvZXMgbm90IGV4aXN0ICovCisJZmluZF90YWJsZSA9IHJfdGFibGVzOworCXdoaWxlKCAobGFzdF90YWJsZSA9IGZpbmRfdGFibGUpICYmIHN0cm5jbXAoaW5mby0+bmFtZSxmaW5kX3RhYmxlLT5uYW1lLElQVF9SRUNFTlRfTkFNRV9MRU4pICYmIChmaW5kX3RhYmxlID0gZmluZF90YWJsZS0+bmV4dCkgKTsKKworCS8qIElmIGEgdGFibGUgYWxyZWFkeSBleGlzdHMganVzdCBpbmNyZW1lbnQgdGhlIGNvdW50IG9uIHRoYXQgdGFibGUgYW5kIHJldHVybiAqLworCWlmKGZpbmRfdGFibGUpIHsgCisjaWZkZWYgREVCVUcKKwkJaWYoZGVidWcpIHByaW50ayhLRVJOX0lORk8gUkVDRU5UX05BTUUgIjogY2hlY2tlbnRyeTogdGFibGUgZm91bmQgKCVzKSwgaW5jcmVtZW50aW5nIGNvdW50LlxuIixpbmZvLT5uYW1lKTsKKyNlbmRpZgorCQlmaW5kX3RhYmxlLT5jb3VudCsrOworCQlzcGluX3VubG9ja19iaCgmcmVjZW50X2xvY2spOworCQlyZXR1cm4gMTsKKwl9CisKKwlzcGluX3VubG9ja19iaCgmcmVjZW50X2xvY2spOworCisJLyogVGFibGUgd2l0aCB0aGlzIG5hbWUgbm90IGZvdW5kICovCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBuZXcgbGlua2VkIGxpc3QgaXRlbSAqLworCisjaWZkZWYgREVCVUcKKwlpZihkZWJ1ZykgeworCQlwcmludGsoS0VSTl9JTkZPIFJFQ0VOVF9OQU1FICI6IGNoZWNrZW50cnk6IG5vIHRhYmxlIGZvdW5kICglcylcbiIsaW5mby0+bmFtZSk7CisJCXByaW50ayhLRVJOX0lORk8gUkVDRU5UX05BTUUgIjogY2hlY2tlbnRyeTogQWxsb2NhdGlvbmcgJWQgZm9yIGxpbmstbGlzdCBlbnRyeS5cbiIsc2l6ZW9mKHN0cnVjdCByZWNlbnRfaXBfdGFibGVzKSk7CisJfQorI2VuZGlmCisKKwljdXJyX3RhYmxlID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IHJlY2VudF9pcF90YWJsZXMpKTsKKwlpZihjdXJyX3RhYmxlID09IE5VTEwpIHJldHVybiAwOworCisJc3Bpbl9sb2NrX2luaXQoJmN1cnJfdGFibGUtPmxpc3RfbG9jayk7CisJY3Vycl90YWJsZS0+bmV4dCA9IE5VTEw7CisJY3Vycl90YWJsZS0+Y291bnQgPSAxOworCWN1cnJfdGFibGUtPnRpbWVfcG9zID0gMDsKKwlzdHJuY3B5KGN1cnJfdGFibGUtPm5hbWUsaW5mby0+bmFtZSxJUFRfUkVDRU5UX05BTUVfTEVOKTsKKwljdXJyX3RhYmxlLT5uYW1lW0lQVF9SRUNFTlRfTkFNRV9MRU4tMV0gPSAnXDAnOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHRhYmxlIGFuZCB0aGUgbGlzdCBvZiBwYWNrZXRzIGluIGVhY2ggZW50cnkuICovCisjaWZkZWYgREVCVUcKKwlpZihkZWJ1ZykgcHJpbnRrKEtFUk5fSU5GTyBSRUNFTlRfTkFNRSAiOiBjaGVja2VudHJ5OiBBbGxvY2F0aW5nICVkIGZvciB0YWJsZSAoJXMpLlxuIiwKKwkJCXNpemVvZihzdHJ1Y3QgcmVjZW50X2lwX2xpc3QpKmlwX2xpc3RfdG90LAorCQkJaW5mby0+bmFtZSk7CisjZW5kaWYKKworCWN1cnJfdGFibGUtPnRhYmxlID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IHJlY2VudF9pcF9saXN0KSppcF9saXN0X3RvdCk7CisJaWYoY3Vycl90YWJsZS0+dGFibGUgPT0gTlVMTCkgeyB2ZnJlZShjdXJyX3RhYmxlKTsgcmV0dXJuIDA7IH0KKwltZW1zZXQoY3Vycl90YWJsZS0+dGFibGUsMCxzaXplb2Yoc3RydWN0IHJlY2VudF9pcF9saXN0KSppcF9saXN0X3RvdCk7CisjaWZkZWYgREVCVUcKKwlpZihkZWJ1ZykgcHJpbnRrKEtFUk5fSU5GTyBSRUNFTlRfTkFNRSAiOiBjaGVja2VudHJ5OiBBbGxvY2F0aW5nICVkIGZvciBwa3RfbGlzdC5cbiIsCisJCQlzaXplb2YodV9pbnQzMl90KSppcF9wa3RfbGlzdF90b3QqaXBfbGlzdF90b3QpOworI2VuZGlmCisKKwlob2xkID0gdm1hbGxvYyhzaXplb2YodV9pbnQzMl90KSppcF9wa3RfbGlzdF90b3QqaXBfbGlzdF90b3QpOworI2lmZGVmIERFQlVHCisJaWYoZGVidWcpIHByaW50ayhLRVJOX0lORk8gUkVDRU5UX05BTUUgIjogY2hlY2tlbnRyeTogQWZ0ZXIgcGt0X2xpc3QgYWxsb2NhdGlvbi5cbiIpOworI2VuZGlmCisJaWYoaG9sZCA9PSBOVUxMKSB7IAorCQlwcmludGsoS0VSTl9JTkZPIFJFQ0VOVF9OQU1FICI6IGNoZWNrZW50cnk6IHVuYWJsZSB0byBhbGxvY2F0ZSBmb3IgcGt0X2xpc3QuXG4iKTsKKwkJdmZyZWUoY3Vycl90YWJsZS0+dGFibGUpOyAKKwkJdmZyZWUoY3Vycl90YWJsZSk7CisJCXJldHVybiAwOworCX0KKwlmb3IoYyA9IDA7IGMgPCBpcF9saXN0X3RvdDsgYysrKSB7CisJCWN1cnJfdGFibGUtPnRhYmxlW2NdLmxhc3RfcGt0cyA9IGhvbGQgKyBjKmlwX3BrdF9saXN0X3RvdDsKKwl9CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBoYXNoIHRhYmxlICovCisjaWZkZWYgREVCVUcKKwlpZihkZWJ1ZykgcHJpbnRrKEtFUk5fSU5GTyBSRUNFTlRfTkFNRSAiOiBjaGVja2VudHJ5OiBBbGxvY2F0aW5nICVkIGZvciBoYXNoX3RhYmxlLlxuIiwKKwkJCXNpemVvZihpbnQpKmlwX2xpc3RfaGFzaF9zaXplKTsKKyNlbmRpZgorCisJY3Vycl90YWJsZS0+aGFzaF90YWJsZSA9IHZtYWxsb2Moc2l6ZW9mKGludCkqaXBfbGlzdF9oYXNoX3NpemUpOworCWlmKCFjdXJyX3RhYmxlLT5oYXNoX3RhYmxlKSB7CisJCXByaW50ayhLRVJOX0lORk8gUkVDRU5UX05BTUUgIjogY2hlY2tlbnRyeTogdW5hYmxlIHRvIGFsbG9jYXRlIGZvciBoYXNoX3RhYmxlLlxuIik7CisJCXZmcmVlKGhvbGQpOworCQl2ZnJlZShjdXJyX3RhYmxlLT50YWJsZSk7IAorCQl2ZnJlZShjdXJyX3RhYmxlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yKGMgPSAwOyBjIDwgaXBfbGlzdF9oYXNoX3NpemU7IGMrKykgeworCQljdXJyX3RhYmxlLT5oYXNoX3RhYmxlW2NdID0gLTE7CisJfQorCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgdGltZSBpbmZvICovCisjaWZkZWYgREVCVUcKKwlpZihkZWJ1ZykgcHJpbnRrKEtFUk5fSU5GTyBSRUNFTlRfTkFNRSAiOiBjaGVja2VudHJ5OiBBbGxvY2F0aW5nICVkIGZvciB0aW1lX2luZm8uXG4iLAorCQkJc2l6ZW9mKHN0cnVjdCB0aW1lX2luZm9fbGlzdCkqaXBfbGlzdF90b3QpOworI2VuZGlmCisKKwljdXJyX3RhYmxlLT50aW1lX2luZm8gPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgdGltZV9pbmZvX2xpc3QpKmlwX2xpc3RfdG90KTsKKwlpZighY3Vycl90YWJsZS0+dGltZV9pbmZvKSB7CisJCXByaW50ayhLRVJOX0lORk8gUkVDRU5UX05BTUUgIjogY2hlY2tlbnRyeTogdW5hYmxlIHRvIGFsbG9jYXRlIGZvciB0aW1lX2luZm8uXG4iKTsKKwkJdmZyZWUoY3Vycl90YWJsZS0+aGFzaF90YWJsZSk7CisJCXZmcmVlKGhvbGQpOworCQl2ZnJlZShjdXJyX3RhYmxlLT50YWJsZSk7IAorCQl2ZnJlZShjdXJyX3RhYmxlKTsKKwkJcmV0dXJuIDA7CisJfQorCWZvcihjID0gMDsgYyA8IGlwX2xpc3RfdG90OyBjKyspIHsKKwkJY3Vycl90YWJsZS0+dGltZV9pbmZvW2NdLnBvc2l0aW9uID0gYzsKKwkJY3Vycl90YWJsZS0+dGltZV9pbmZvW2NdLnRpbWUgPSAwOworCX0KKworCS8qIFB1dCB0aGUgbmV3IHRhYmxlIGluIHBsYWNlICovCisJc3Bpbl9sb2NrX2JoKCZyZWNlbnRfbG9jayk7CisJZmluZF90YWJsZSA9IHJfdGFibGVzOworCXdoaWxlKCAobGFzdF90YWJsZSA9IGZpbmRfdGFibGUpICYmIHN0cm5jbXAoaW5mby0+bmFtZSxmaW5kX3RhYmxlLT5uYW1lLElQVF9SRUNFTlRfTkFNRV9MRU4pICYmIChmaW5kX3RhYmxlID0gZmluZF90YWJsZS0+bmV4dCkgKTsKKworCS8qIElmIGEgdGFibGUgYWxyZWFkeSBleGlzdHMganVzdCBpbmNyZW1lbnQgdGhlIGNvdW50IG9uIHRoYXQgdGFibGUgYW5kIHJldHVybiAqLworCWlmKGZpbmRfdGFibGUpIHsgCisJCWZpbmRfdGFibGUtPmNvdW50Kys7CQorCQlzcGluX3VubG9ja19iaCgmcmVjZW50X2xvY2spOworI2lmZGVmIERFQlVHCisJCWlmKGRlYnVnKSBwcmludGsoS0VSTl9JTkZPIFJFQ0VOVF9OQU1FICI6IGNoZWNrZW50cnk6IHRhYmxlIGZvdW5kICglcyksIGNyZWF0ZWQgYnkgb3RoZXIgcHJvY2Vzcy5cbiIsaW5mby0+bmFtZSk7CisjZW5kaWYKKwkJdmZyZWUoY3Vycl90YWJsZS0+dGltZV9pbmZvKTsKKwkJdmZyZWUoY3Vycl90YWJsZS0+aGFzaF90YWJsZSk7CisJCXZmcmVlKGhvbGQpOworCQl2ZnJlZShjdXJyX3RhYmxlLT50YWJsZSk7CisJCXZmcmVlKGN1cnJfdGFibGUpOworCQlyZXR1cm4gMTsKKwl9CisJaWYoIWxhc3RfdGFibGUpIHJfdGFibGVzID0gY3Vycl90YWJsZTsgZWxzZSBsYXN0X3RhYmxlLT5uZXh0ID0gY3Vycl90YWJsZTsKKworCXNwaW5fdW5sb2NrX2JoKCZyZWNlbnRfbG9jayk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCS8qIENyZWF0ZSBvdXIgcHJvYyAnc3RhdHVzJyBlbnRyeS4gKi8KKwljdXJyX3RhYmxlLT5zdGF0dXNfcHJvYyA9IGNyZWF0ZV9wcm9jX2VudHJ5KGN1cnJfdGFibGUtPm5hbWUsIGlwX2xpc3RfcGVybXMsIHByb2NfbmV0X2lwdF9yZWNlbnQpOworCWlmICghY3Vycl90YWJsZS0+c3RhdHVzX3Byb2MpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBSRUNFTlRfTkFNRSAiOiBjaGVja2VudHJ5OiB1bmFibGUgdG8gYWxsb2NhdGUgZm9yIC9wcm9jIGVudHJ5LlxuIik7CisJCS8qIERlc3Ryb3kgdGhlIGNyZWF0ZWQgdGFibGUgKi8KKwkJc3Bpbl9sb2NrX2JoKCZyZWNlbnRfbG9jayk7CisJCWxhc3RfdGFibGUgPSBOVUxMOworCQljdXJyX3RhYmxlID0gcl90YWJsZXM7CisJCWlmKCFjdXJyX3RhYmxlKSB7CisjaWZkZWYgREVCVUcKKwkJCWlmKGRlYnVnKSBwcmludGsoS0VSTl9JTkZPIFJFQ0VOVF9OQU1FICI6IGNoZWNrZW50cnkoKSBjcmVhdGVfcHJvYyBmYWlsZWQsIG5vIHRhYmxlcy5cbiIpOworI2VuZGlmCisJCQlzcGluX3VubG9ja19iaCgmcmVjZW50X2xvY2spOworCQkJcmV0dXJuIDA7CisJCX0KKwkJd2hpbGUoIHN0cm5jbXAoaW5mby0+bmFtZSxjdXJyX3RhYmxlLT5uYW1lLElQVF9SRUNFTlRfTkFNRV9MRU4pICYmIChsYXN0X3RhYmxlID0gY3Vycl90YWJsZSkgJiYgKGN1cnJfdGFibGUgPSBjdXJyX3RhYmxlLT5uZXh0KSApOworCQlpZighY3Vycl90YWJsZSkgeworI2lmZGVmIERFQlVHCisJCQlpZihkZWJ1ZykgcHJpbnRrKEtFUk5fSU5GTyBSRUNFTlRfTkFNRSAiOiBjaGVja2VudHJ5KCkgY3JlYXRlX3Byb2MgZmFpbGVkLCB0YWJsZSBhbHJlYWR5IGRlc3Ryb3llZC5cbiIpOworI2VuZGlmCisJCQlzcGluX3VubG9ja19iaCgmcmVjZW50X2xvY2spOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYobGFzdF90YWJsZSkgbGFzdF90YWJsZS0+bmV4dCA9IGN1cnJfdGFibGUtPm5leHQ7IGVsc2Ugcl90YWJsZXMgPSBjdXJyX3RhYmxlLT5uZXh0OworCQlzcGluX3VubG9ja19iaCgmcmVjZW50X2xvY2spOworCQl2ZnJlZShjdXJyX3RhYmxlLT50aW1lX2luZm8pOworCQl2ZnJlZShjdXJyX3RhYmxlLT5oYXNoX3RhYmxlKTsKKwkJdmZyZWUoaG9sZCk7CisJCXZmcmVlKGN1cnJfdGFibGUtPnRhYmxlKTsKKwkJdmZyZWUoY3Vycl90YWJsZSk7CisJCXJldHVybiAwOworCX0KKwkKKwljdXJyX3RhYmxlLT5zdGF0dXNfcHJvYy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwljdXJyX3RhYmxlLT5zdGF0dXNfcHJvYy0+ZGF0YSA9IGN1cnJfdGFibGU7CisJd21iKCk7CisJY3Vycl90YWJsZS0+c3RhdHVzX3Byb2MtPnJlYWRfcHJvYyA9IGlwX3JlY2VudF9nZXRfaW5mbzsKKwljdXJyX3RhYmxlLT5zdGF0dXNfcHJvYy0+d3JpdGVfcHJvYyA9IGlwX3JlY2VudF9jdHJsOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKKyNpZmRlZiBERUJVRworCWlmKGRlYnVnKSBwcmludGsoS0VSTl9JTkZPIFJFQ0VOVF9OQU1FICI6IGNoZWNrZW50cnkoKSBsZWZ0LlxuIik7CisjZW5kaWYKKworCXJldHVybiAxOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgZXZlbnQgdGhhdCBhIHJ1bGUgbWF0Y2hpbmcgdGhpcyBtb2R1bGUgaXMKKyAqIHJlbW92ZWQuCisgKiBXaGVuIHRoaXMgaGFwcGVucyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZXJlIGFyZSBubyBvdGhlciBydWxlcyBtYXRjaGluZworICogdGhlIHRhYmxlIGdpdmVuLiAgSWYgdGhhdCBpcyB0aGUgY2FzZSB0aGVuIHdlIHJlbW92ZSB0aGUgdGFibGUgYW5kIGNsZWFuCisgKiB1cCBpdHMgbWVtb3J5LgorICovCitzdGF0aWMgdm9pZAorZGVzdHJveSh2b2lkICptYXRjaGluZm8sIHVuc2lnbmVkIGludCBtYXRjaHNpemUpCit7CisJY29uc3Qgc3RydWN0IGlwdF9yZWNlbnRfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwlzdHJ1Y3QgcmVjZW50X2lwX3RhYmxlcyAqY3Vycl90YWJsZSwgKmxhc3RfdGFibGU7CisKKyNpZmRlZiBERUJVRworCWlmKGRlYnVnKSBwcmludGsoS0VSTl9JTkZPIFJFQ0VOVF9OQU1FICI6IGRlc3Ryb3koKSBlbnRlcmVkLlxuIik7CisjZW5kaWYKKworCWlmKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfcmVjZW50X2luZm8pKSkgcmV0dXJuOworCisJLyogTG9jayB0aGUgbGlua2VkIGxpc3Qgd2hpbGUgd2UgcGxheSB3aXRoIGl0ICovCisJc3Bpbl9sb2NrX2JoKCZyZWNlbnRfbG9jayk7CisKKwkvKiBMb29rIGZvciBhbiBlbnRyeSB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGNyZWF0ZWQgKi8KKwkvKiBGaW5kcyB0aGUgZW5kIG9mIHRoZSBsaXN0IGFuZCB0aGUgZW50cnkgYmVmb3JlIHRoZSBlbmQgaWYgY3VycmVudCBuYW1lIGRvZXMgbm90IGV4aXN0ICovCisJbGFzdF90YWJsZSA9IE5VTEw7CisJY3Vycl90YWJsZSA9IHJfdGFibGVzOworCWlmKCFjdXJyX3RhYmxlKSB7IAorI2lmZGVmIERFQlVHCisJCWlmKGRlYnVnKSBwcmludGsoS0VSTl9JTkZPIFJFQ0VOVF9OQU1FICI6IGRlc3Ryb3koKSBObyB0YWJsZXMgZm91bmQsIGxlYXZpbmcuXG4iKTsKKyNlbmRpZgorCQlzcGluX3VubG9ja19iaCgmcmVjZW50X2xvY2spOworCQlyZXR1cm47CisJfQorCXdoaWxlKCBzdHJuY21wKGluZm8tPm5hbWUsY3Vycl90YWJsZS0+bmFtZSxJUFRfUkVDRU5UX05BTUVfTEVOKSAmJiAobGFzdF90YWJsZSA9IGN1cnJfdGFibGUpICYmIChjdXJyX3RhYmxlID0gY3Vycl90YWJsZS0+bmV4dCkgKTsKKworCS8qIElmIGEgdGFibGUgZG9lcyBub3QgZXhpc3QgdGhlbiBkbyBub3RoaW5nIGFuZCByZXR1cm4gKi8KKwlpZighY3Vycl90YWJsZSkgeyAKKyNpZmRlZiBERUJVRworCQlpZihkZWJ1ZykgcHJpbnRrKEtFUk5fSU5GTyBSRUNFTlRfTkFNRSAiOiBkZXN0cm95KCkgdGFibGUgbm90IGZvdW5kLCBsZWF2aW5nLlxuIik7CisjZW5kaWYKKwkJc3Bpbl91bmxvY2tfYmgoJnJlY2VudF9sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCWN1cnJfdGFibGUtPmNvdW50LS07CisKKwkvKiBJZiBjb3VudCBpcyBzdGlsbCBub24temVybyB0aGVuIHRoZXJlIGFyZSBzdGlsbCBydWxlcyByZWZlcmVuY2VpbmcgaXQgc28gd2UgZG8gbm90aGluZyAqLworCWlmKGN1cnJfdGFibGUtPmNvdW50KSB7IAorI2lmZGVmIERFQlVHCisJCWlmKGRlYnVnKSBwcmludGsoS0VSTl9JTkZPIFJFQ0VOVF9OQU1FICI6IGRlc3Ryb3koKSB0YWJsZSBmb3VuZCwgbm9uLXplcm8gY291bnQsIGxlYXZpbmcuXG4iKTsKKyNlbmRpZgorCQlzcGluX3VubG9ja19iaCgmcmVjZW50X2xvY2spOworCQlyZXR1cm47CisJfQorCisjaWZkZWYgREVCVUcKKwlpZihkZWJ1ZykgcHJpbnRrKEtFUk5fSU5GTyBSRUNFTlRfTkFNRSAiOiBkZXN0cm95KCkgdGFibGUgZm91bmQsIHplcm8gY291bnQsIHJlbW92aW5nLlxuIik7CisjZW5kaWYKKworCS8qIENvdW50IG11c3QgYmUgemVybyBzbyB3ZSByZW1vdmUgdGhpcyB0YWJsZSBmcm9tIHRoZSBsaXN0ICovCisJaWYobGFzdF90YWJsZSkgbGFzdF90YWJsZS0+bmV4dCA9IGN1cnJfdGFibGUtPm5leHQ7IGVsc2Ugcl90YWJsZXMgPSBjdXJyX3RhYmxlLT5uZXh0OworCisJc3Bpbl91bmxvY2tfYmgoJnJlY2VudF9sb2NrKTsKKworCS8qIGxvY2sgdG8gbWFrZSBzdXJlIGFueSBsYXRlLXJ1bm5lcnMgc3RpbGwgdXNpbmcgdGhpcyBhZnRlciB3ZSByZW1vdmVkIGl0IGZyb20KKwkgKiB0aGUgbGlzdCBmaW5pc2ggdXAgdGhlbiByZW1vdmUgZXZlcnl0aGluZyAqLworCXNwaW5fbG9ja19iaCgmY3Vycl90YWJsZS0+bGlzdF9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmY3Vycl90YWJsZS0+bGlzdF9sb2NrKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJaWYoY3Vycl90YWJsZS0+c3RhdHVzX3Byb2MpIHJlbW92ZV9wcm9jX2VudHJ5KGN1cnJfdGFibGUtPm5hbWUscHJvY19uZXRfaXB0X3JlY2VudCk7CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKwl2ZnJlZShjdXJyX3RhYmxlLT50YWJsZVswXS5sYXN0X3BrdHMpOworCXZmcmVlKGN1cnJfdGFibGUtPnRhYmxlKTsKKwl2ZnJlZShjdXJyX3RhYmxlLT5oYXNoX3RhYmxlKTsKKwl2ZnJlZShjdXJyX3RhYmxlLT50aW1lX2luZm8pOworCXZmcmVlKGN1cnJfdGFibGUpOworCisjaWZkZWYgREVCVUcKKwlpZihkZWJ1ZykgcHJpbnRrKEtFUk5fSU5GTyBSRUNFTlRfTkFNRSAiOiBkZXN0cm95KCkgbGVmdC5cbiIpOworI2VuZGlmCisKKwlyZXR1cm47Cit9CisKKy8qIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSB3ZSBwYXNzIHRvIGlwdF9yZWdpc3RlciB0byByZWdpc3RlciBvdXIKKyAqIG1vZHVsZSB3aXRoIGlwdGFibGVzLgorICovCitzdGF0aWMgc3RydWN0IGlwdF9tYXRjaCByZWNlbnRfbWF0Y2ggPSB7IAorICAubmFtZSA9ICJyZWNlbnQiLCAKKyAgLm1hdGNoID0gJm1hdGNoLCAKKyAgLmNoZWNrZW50cnkgPSAmY2hlY2tlbnRyeSwgCisgIC5kZXN0cm95ID0gJmRlc3Ryb3ksIAorICAubWUgPSBUSElTX01PRFVMRQorfTsKKworLyogS2VybmVsIG1vZHVsZSBpbml0aWFsaXphdGlvbi4gKi8KK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgZXJyLCBjb3VudDsKKworCXByaW50ayh2ZXJzaW9uKTsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXByb2NfbmV0X2lwdF9yZWNlbnQgPSBwcm9jX21rZGlyKCJpcHRfcmVjZW50Iixwcm9jX25ldCk7CisJaWYoIXByb2NfbmV0X2lwdF9yZWNlbnQpIHJldHVybiAtRU5PTUVNOworI2VuZGlmCisKKwlpZihpcF9saXN0X2hhc2hfc2l6ZSAmJiBpcF9saXN0X2hhc2hfc2l6ZSA8PSBpcF9saXN0X3RvdCkgeworCSAgcHJpbnRrKEtFUk5fV0FSTklORyBSRUNFTlRfTkFNRSAiOiBpcF9saXN0X2hhc2hfc2l6ZSB0b28gc21hbGwsIHJlc2V0dGluZyB0byBkZWZhdWx0LlxuIik7CisJICBpcF9saXN0X2hhc2hfc2l6ZSA9IDA7CisJfQorCisJaWYoIWlwX2xpc3RfaGFzaF9zaXplKSB7CisJCWlwX2xpc3RfaGFzaF9zaXplID0gaXBfbGlzdF90b3QqMzsKKwkJY291bnQgPSAyKjI7CisJCXdoaWxlKGlwX2xpc3RfaGFzaF9zaXplID4gY291bnQpIGNvdW50ID0gY291bnQqMjsKKwkJaXBfbGlzdF9oYXNoX3NpemUgPSBjb3VudDsKKwl9CisKKyNpZmRlZiBERUJVRworCWlmKGRlYnVnKSBwcmludGsoS0VSTl9JTkZPIFJFQ0VOVF9OQU1FICI6IGlwX2xpc3RfaGFzaF9zaXplOiAlZFxuIixpcF9saXN0X2hhc2hfc2l6ZSk7CisjZW5kaWYKKworCWVyciA9IGlwdF9yZWdpc3Rlcl9tYXRjaCgmcmVjZW50X21hdGNoKTsKKwlpZiAoZXJyKQorCQlyZW1vdmVfcHJvY19lbnRyeSgiaXB0X3JlY2VudCIsIHByb2NfbmV0KTsKKwlyZXR1cm4gZXJyOworfQorCisvKiBLZXJuZWwgbW9kdWxlIGRlc3RydWN0aW9uLiAqLworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmcmVjZW50X21hdGNoKTsKKworCXJlbW92ZV9wcm9jX2VudHJ5KCJpcHRfcmVjZW50Iixwcm9jX25ldCk7Cit9CisKKy8qIFJlZ2lzdGVyIG91ciBtb2R1bGUgd2l0aCB0aGUga2VybmVsLiAqLworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfc2N0cC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9zY3RwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUyYjMyNwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfc2N0cC5jCkBAIC0wLDAgKzEsMjAzIEBACisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bGludXgvc2N0cC5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3NjdHAuaD4KKworI2lmZGVmIERFQlVHX1NDVFAKKyNkZWZpbmUgZHVwcmludGYoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIGR1cHJpbnRmKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCisjZGVmaW5lIFNDQ0hFQ0soY29uZCwgb3B0aW9uLCBmbGFnLCBpbnZmbGFnKSAoISgoZmxhZykgJiAob3B0aW9uKSkgXAorCQkJCQkgICAgICB8fCAoISEoKGludmZsYWcpICYgKG9wdGlvbikpIF4gKGNvbmQpKSkKKworc3RhdGljIGludAorbWF0Y2hfZmxhZ3MoY29uc3Qgc3RydWN0IGlwdF9zY3RwX2ZsYWdfaW5mbyAqZmxhZ19pbmZvLAorCSAgICBjb25zdCBpbnQgZmxhZ19jb3VudCwKKwkgICAgdV9pbnQ4X3QgY2h1bmt0eXBlLAorCSAgICB1X2ludDhfdCBjaHVua2ZsYWdzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGZsYWdfY291bnQ7IGkrKykgeworCQlpZiAoZmxhZ19pbmZvW2ldLmNodW5rdHlwZSA9PSBjaHVua3R5cGUpIHsKKwkJCXJldHVybiAoY2h1bmtmbGFncyAmIGZsYWdfaW5mb1tpXS5mbGFnX21hc2spID09IGZsYWdfaW5mb1tpXS5mbGFnOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK21hdGNoX3BhY2tldChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSAgICAgY29uc3QgdV9pbnQzMl90ICpjaHVua21hcCwKKwkgICAgIGludCBjaHVua19tYXRjaF90eXBlLAorCSAgICAgY29uc3Qgc3RydWN0IGlwdF9zY3RwX2ZsYWdfaW5mbyAqZmxhZ19pbmZvLAorCSAgICAgY29uc3QgaW50IGZsYWdfY291bnQsCisJICAgICBpbnQgKmhvdGRyb3ApCit7CisJaW50IG9mZnNldDsKKwl1X2ludDMyX3QgY2h1bmttYXBjb3B5WzI1NiAvIHNpemVvZiAodV9pbnQzMl90KV07CisJc2N0cF9jaHVua2hkcl90IF9zY2gsICpzY2g7CisKKyNpZmRlZiBERUJVR19TQ1RQCisJaW50IGkgPSAwOworI2VuZGlmCisKKwlpZiAoY2h1bmtfbWF0Y2hfdHlwZSA9PSBTQ1RQX0NIVU5LX01BVENIX0FMTCkgeworCQlTQ1RQX0NIVU5LTUFQX0NPUFkoY2h1bmttYXBjb3B5LCBjaHVua21hcCk7CisJfQorCisJb2Zmc2V0ID0gc2tiLT5uaC5pcGgtPmlobCAqIDQgKyBzaXplb2YgKHNjdHBfc2N0cGhkcl90KTsKKwlkbyB7CisJCXNjaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgc2l6ZW9mKF9zY2gpLCAmX3NjaCk7CisJCWlmIChzY2ggPT0gTlVMTCkgeworCQkJZHVwcmludGYoIkRyb3BwaW5nIGludmFsaWQgU0NUUCBwYWNrZXQuXG4iKTsKKwkJCSpob3Rkcm9wID0gMTsKKwkJCXJldHVybiAwOworICAgICAgICAJfQorCisJCWR1cHJpbnRmKCJDaHVuayBudW06ICVkXHRvZmZzZXQ6ICVkXHR0eXBlOiAlZFx0bGVuZ3RoOiAlZFx0ZmxhZ3M6ICV4XG4iLCAKKwkJCQkrK2ksIG9mZnNldCwgc2NoLT50eXBlLCBodG9ucyhzY2gtPmxlbmd0aCksIHNjaC0+ZmxhZ3MpOworCisJCW9mZnNldCArPSAoaHRvbnMoc2NoLT5sZW5ndGgpICsgMykgJiB+MzsKKworCQlkdXByaW50Zigic2tiLT5sZW46ICVkXHRvZmZzZXQ6ICVkXG4iLCBza2ItPmxlbiwgb2Zmc2V0KTsKKworCQlpZiAoU0NUUF9DSFVOS01BUF9JU19TRVQoY2h1bmttYXAsIHNjaC0+dHlwZSkpIHsKKwkJCXN3aXRjaCAoY2h1bmtfbWF0Y2hfdHlwZSkgeworCQkJY2FzZSBTQ1RQX0NIVU5LX01BVENIX0FOWToKKwkJCQlpZiAobWF0Y2hfZmxhZ3MoZmxhZ19pbmZvLCBmbGFnX2NvdW50LCAKKwkJCQkJc2NoLT50eXBlLCBzY2gtPmZsYWdzKSkgeworCQkJCQlyZXR1cm4gMTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU0NUUF9DSFVOS19NQVRDSF9BTEw6CisJCQkJaWYgKG1hdGNoX2ZsYWdzKGZsYWdfaW5mbywgZmxhZ19jb3VudCwgCisJCQkJCXNjaC0+dHlwZSwgc2NoLT5mbGFncykpIHsKKwkJCQkJU0NUUF9DSFVOS01BUF9DTEVBUihjaHVua21hcGNvcHksIHNjaC0+dHlwZSk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIFNDVFBfQ0hVTktfTUFUQ0hfT05MWToKKwkJCQlpZiAoIW1hdGNoX2ZsYWdzKGZsYWdfaW5mbywgZmxhZ19jb3VudCwgCisJCQkJCXNjaC0+dHlwZSwgc2NoLT5mbGFncykpIHsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJc3dpdGNoIChjaHVua19tYXRjaF90eXBlKSB7CisJCQljYXNlIFNDVFBfQ0hVTktfTUFUQ0hfT05MWToKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKG9mZnNldCA8IHNrYi0+bGVuKTsKKworCXN3aXRjaCAoY2h1bmtfbWF0Y2hfdHlwZSkgeworCWNhc2UgU0NUUF9DSFVOS19NQVRDSF9BTEw6CisJCXJldHVybiBTQ1RQX0NIVU5LTUFQX0lTX0NMRUFSKGNodW5rbWFwKTsKKwljYXNlIFNDVFBfQ0hVTktfTUFUQ0hfQU5ZOgorCQlyZXR1cm4gMDsKKwljYXNlIFNDVFBfQ0hVTktfTUFUQ0hfT05MWToKKwkJcmV0dXJuIDE7CisJfQorCisJLyogVGhpcyB3aWxsIG5ldmVyIGJlIHJlYWNoZWQsIGJ1dCByZXF1aXJlZCB0byBzdG9wIGNvbXBpbGVyIHdoaW5lICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIGludCAqaG90ZHJvcCkKK3sKKwljb25zdCBzdHJ1Y3QgaXB0X3NjdHBfaW5mbyAqaW5mbzsKKwlzY3RwX3NjdHBoZHJfdCBfc2gsICpzaDsKKworCWluZm8gPSAoY29uc3Qgc3RydWN0IGlwdF9zY3RwX2luZm8gKiltYXRjaGluZm87CisKKwlpZiAob2Zmc2V0KSB7CisJCWR1cHJpbnRmKCJEcm9wcGluZyBub24tZmlyc3QgZnJhZ21lbnQuLiBGSVhNRVxuIik7CisJCXJldHVybiAwOworCX0KKwkKKwlzaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYi0+bmguaXBoLT5paGwqNCwgc2l6ZW9mKF9zaCksICZfc2gpOworCWlmIChzaCA9PSBOVUxMKSB7CisJCWR1cHJpbnRmKCJEcm9wcGluZyBldmlsIFRDUCBvZmZzZXQ9MCB0aW55Z3JhbS5cbiIpOworCQkqaG90ZHJvcCA9IDE7CisJCXJldHVybiAwOworICAgICAgIAl9CisJZHVwcmludGYoInNwdDogJWRcdGRwdDogJWRcbiIsIG50b2hzKHNoLT5zb3VyY2UpLCBudG9ocyhzaC0+ZGVzdCkpOworCisJcmV0dXJuICBTQ0NIRUNLKCgobnRvaHMoc2gtPnNvdXJjZSkgPj0gaW5mby0+c3B0c1swXSkgCisJCQkmJiAobnRvaHMoc2gtPnNvdXJjZSkgPD0gaW5mby0+c3B0c1sxXSkpLCAKKwkJICAgCUlQVF9TQ1RQX1NSQ19QT1JUUywgaW5mby0+ZmxhZ3MsIGluZm8tPmludmZsYWdzKQorCQkmJiBTQ0NIRUNLKCgobnRvaHMoc2gtPmRlc3QpID49IGluZm8tPmRwdHNbMF0pIAorCQkJJiYgKG50b2hzKHNoLT5kZXN0KSA8PSBpbmZvLT5kcHRzWzFdKSksIAorCQkJSVBUX1NDVFBfREVTVF9QT1JUUywgaW5mby0+ZmxhZ3MsIGluZm8tPmludmZsYWdzKQorCQkmJiBTQ0NIRUNLKG1hdGNoX3BhY2tldChza2IsIGluZm8tPmNodW5rbWFwLCBpbmZvLT5jaHVua19tYXRjaF90eXBlLAorIAkJCQkJaW5mby0+ZmxhZ19pbmZvLCBpbmZvLT5mbGFnX2NvdW50LCAKKwkJCQkJaG90ZHJvcCksCisJCQkgICBJUFRfU0NUUF9DSFVOS19UWVBFUywgaW5mby0+ZmxhZ3MsIGluZm8tPmludmZsYWdzKTsKK30KKworc3RhdGljIGludAorY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisJICAgdm9pZCAqbWF0Y2hpbmZvLAorCSAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgaXB0X3NjdHBfaW5mbyAqaW5mbzsKKworCWluZm8gPSAoY29uc3Qgc3RydWN0IGlwdF9zY3RwX2luZm8gKiltYXRjaGluZm87CisKKwlyZXR1cm4gaXAtPnByb3RvID09IElQUFJPVE9fU0NUUAorCQkmJiAhKGlwLT5pbnZmbGFncyAmIElQVF9JTlZfUFJPVE8pCisJCSYmIG1hdGNoc2l6ZSA9PSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfc2N0cF9pbmZvKSkKKwkJJiYgIShpbmZvLT5mbGFncyAmIH5JUFRfU0NUUF9WQUxJRF9GTEFHUykKKwkJJiYgIShpbmZvLT5pbnZmbGFncyAmIH5JUFRfU0NUUF9WQUxJRF9GTEFHUykKKwkJJiYgIShpbmZvLT5pbnZmbGFncyAmIH5pbmZvLT5mbGFncykKKwkJJiYgKCghKGluZm8tPmZsYWdzICYgSVBUX1NDVFBfQ0hVTktfVFlQRVMpKSB8fCAKKwkJCShpbmZvLT5jaHVua19tYXRjaF90eXBlICYKKwkJCQkoU0NUUF9DSFVOS19NQVRDSF9BTEwgCisJCQkJfCBTQ1RQX0NIVU5LX01BVENIX0FOWQorCQkJCXwgU0NUUF9DSFVOS19NQVRDSF9PTkxZKSkpOworfQorCitzdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBzY3RwX21hdGNoID0gCit7IAorCS5saXN0ID0geyBOVUxMLCBOVUxMfSwKKwkubmFtZSA9ICJzY3RwIiwKKwkubWF0Y2ggPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkgPSAmY2hlY2tlbnRyeSwKKwkuZGVzdHJveSA9IE5VTEwsCisJLm1lID0gVEhJU19NT0RVTEUKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZzY3RwX21hdGNoKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmc2N0cF9tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIktpcmFuIEt1bWFyIEltbWlkaSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXRjaCBmb3IgU0NUUCBwcm90b2NvbCBwYWNrZXRzIik7CisKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfc3RhdGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfc3RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTUxMWI5Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9zdGF0ZS5jCkBAIC0wLDAgKzEsNzQgQEAKKy8qIEtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggY29ubmVjdGlvbiB0cmFja2luZyBpbmZvcm1hdGlvbi4gKi8KKworLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAorICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9zdGF0ZS5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIGNvbm5lY3Rpb24gdHJhY2tpbmcgc3RhdGUgbWF0Y2ggbW9kdWxlIik7CisKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIGludCAqaG90ZHJvcCkKK3sKKwljb25zdCBzdHJ1Y3QgaXB0X3N0YXRlX2luZm8gKnNpbmZvID0gbWF0Y2hpbmZvOworCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOworCXVuc2lnbmVkIGludCBzdGF0ZWJpdDsKKworCWlmIChza2ItPm5mY3QgPT0gJmlwX2Nvbm50cmFja191bnRyYWNrZWQuY3RfZ2VuZXJhbCkKKwkJc3RhdGViaXQgPSBJUFRfU1RBVEVfVU5UUkFDS0VEOworCWVsc2UgaWYgKCFpcF9jb25udHJhY2tfZ2V0KHNrYiwgJmN0aW5mbykpCisJCXN0YXRlYml0ID0gSVBUX1NUQVRFX0lOVkFMSUQ7CisJZWxzZQorCQlzdGF0ZWJpdCA9IElQVF9TVEFURV9CSVQoY3RpbmZvKTsKKworCXJldHVybiAoc2luZm8tPnN0YXRlbWFzayAmIHN0YXRlYml0KTsKK30KKworc3RhdGljIGludCBjaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJCSBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkJIHZvaWQgKm1hdGNoaW5mbywKKwkJIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisJCSB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWlmIChtYXRjaHNpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3N0YXRlX2luZm8pKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggc3RhdGVfbWF0Y2ggPSB7CisJLm5hbWUJCT0gInN0YXRlIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmNoZWNrLAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwluZWVkX2lwX2Nvbm50cmFjaygpOworCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJnN0YXRlX21hdGNoKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmc3RhdGVfbWF0Y2gpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF90Y3Btc3MuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdGNwbXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRjOWIxNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdGNwbXNzLmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qIEtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggVENQIE1TUyB2YWx1ZXMuICovCisKKy8qIENvcHlyaWdodCAoQykgMjAwMCBNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfdGNwbXNzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisKKyNkZWZpbmUgVEhfU1lOIDB4MDIKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIFRDUCBNU1MgbWF0Y2ggbW9kdWxlIik7CisKKy8qIFJldHVybnMgMSBpZiB0aGUgbXNzIG9wdGlvbiBpcyBzZXQgYW5kIG1hdGNoZWQgYnkgdGhlIHJhbmdlLCAwIG90aGVyd2lzZSAqLworc3RhdGljIGlubGluZSBpbnQKK21zc29wdGlvbl9tYXRjaCh1X2ludDE2X3QgbWluLCB1X2ludDE2X3QgbWF4LAorCQljb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQlpbnQgaW52ZXJ0LAorCQlpbnQgKmhvdGRyb3ApCit7CisJc3RydWN0IHRjcGhkciBfdGNwaCwgKnRoOworCS8qIHRjcC5kb2ZmIGlzIG9ubHkgNCBiaXRzLCBpZS4gbWF4IDE1ICogNCBieXRlcyAqLworCXU4IF9vcHRbMTUgKiA0IC0gc2l6ZW9mKF90Y3BoKV0sICpvcDsKKwl1bnNpZ25lZCBpbnQgaSwgb3B0bGVuOworCisJLyogSWYgd2UgZG9uJ3QgaGF2ZSB0aGUgd2hvbGUgaGVhZGVyLCBkcm9wIHBhY2tldC4gKi8KKwl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYi0+bmguaXBoLT5paGwgKiA0LAorCQkJCXNpemVvZihfdGNwaCksICZfdGNwaCk7CisJaWYgKHRoID09IE5VTEwpCisJCWdvdG8gZHJvcGl0OworCisJLyogTWFsZm9ybWVkLiAqLworCWlmICh0aC0+ZG9mZio0IDwgc2l6ZW9mKCp0aCkpCisJCWdvdG8gZHJvcGl0OworCisJb3B0bGVuID0gdGgtPmRvZmYqNCAtIHNpemVvZigqdGgpOworCWlmICghb3B0bGVuKQorCQlnb3RvIG91dDsKKworCS8qIFRydW5jYXRlZCBvcHRpb25zLiAqLworCW9wID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2tiLT5uaC5pcGgtPmlobCAqIDQgKyBzaXplb2YoKnRoKSwKKwkJCQlvcHRsZW4sIF9vcHQpOworCWlmIChvcCA9PSBOVUxMKQorCQlnb3RvIGRyb3BpdDsKKworCWZvciAoaSA9IDA7IGkgPCBvcHRsZW47ICkgeworCQlpZiAob3BbaV0gPT0gVENQT1BUX01TUworCQkgICAgJiYgKG9wdGxlbiAtIGkpID49IFRDUE9MRU5fTVNTCisJCSAgICAmJiBvcFtpKzFdID09IFRDUE9MRU5fTVNTKSB7CisJCQl1X2ludDE2X3QgbXNzdmFsOworCisJCQltc3N2YWwgPSAob3BbaSsyXSA8PCA4KSB8IG9wW2krM107CisJCQkKKwkJCXJldHVybiAobXNzdmFsID49IG1pbiAmJiBtc3N2YWwgPD0gbWF4KSBeIGludmVydDsKKwkJfQorCQlpZiAob3BbaV0gPCAyKSBpKys7CisJCWVsc2UgaSArPSBvcFtpKzFdPzoxOworCX0KK291dDoKKwlyZXR1cm4gaW52ZXJ0OworCisgZHJvcGl0OgorCSpob3Rkcm9wID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisgICAgICBpbnQgb2Zmc2V0LAorICAgICAgaW50ICpob3Rkcm9wKQoreworCWNvbnN0IHN0cnVjdCBpcHRfdGNwbXNzX21hdGNoX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisKKwlyZXR1cm4gbXNzb3B0aW9uX21hdGNoKGluZm8tPm1zc19taW4sIGluZm8tPm1zc19tYXgsIHNrYiwKKwkJCSAgICAgICBpbmZvLT5pbnZlcnQsIGhvdGRyb3ApOworfQorCitzdGF0aWMgaW50CitjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKyAgICAgICAgICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisgICAgICAgICAgIHZvaWQgKm1hdGNoaW5mbywKKyAgICAgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKyAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF90Y3Btc3NfbWF0Y2hfaW5mbykpKQorCQlyZXR1cm4gMDsKKworCS8qIE11c3Qgc3BlY2lmeSAtcCB0Y3AgKi8KKwlpZiAoaXAtPnByb3RvICE9IElQUFJPVE9fVENQIHx8IChpcC0+aW52ZmxhZ3MgJiBJUFRfSU5WX1BST1RPKSkgeworCQlwcmludGsoInRjcG1zczogT25seSB3b3JrcyBvbiBUQ1AgcGFja2V0c1xuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGlwdF9tYXRjaCB0Y3Btc3NfbWF0Y2ggPSB7CisJLm5hbWUJCT0gInRjcG1zcyIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZ0Y3Btc3NfbWF0Y2gpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZ0Y3Btc3NfbWF0Y2gpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF90b3MuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdG9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg2YTFiYgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdG9zLmMKQEAgLTAsMCArMSw2NCBAQAorLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBUT1MgdmFsdWVzLiAqLworCisvKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCisgKiAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfdG9zLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgVE9TIG1hdGNoIG1vZHVsZSIpOworCitzdGF0aWMgaW50CittYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgIGludCBvZmZzZXQsCisgICAgICBpbnQgKmhvdGRyb3ApCit7CisJY29uc3Qgc3RydWN0IGlwdF90b3NfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKworCXJldHVybiAoc2tiLT5uaC5pcGgtPnRvcyA9PSBpbmZvLT50b3MpIF4gaW5mby0+aW52ZXJ0OworfQorCitzdGF0aWMgaW50CitjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKyAgICAgICAgICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisgICAgICAgICAgIHZvaWQgKm1hdGNoaW5mbywKKyAgICAgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKyAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF90b3NfaW5mbykpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGlwdF9tYXRjaCB0b3NfbWF0Y2ggPSB7CisJLm5hbWUJCT0gInRvcyIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZ0b3NfbWF0Y2gpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZ0b3NfbWF0Y2gpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF90dGwuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdHRsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE5YWE5ZAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdHRsLmMKQEAgLTAsMCArMSw3OSBAQAorLyogSVAgdGFibGVzIG1vZHVsZSBmb3IgbWF0Y2hpbmcgdGhlIHZhbHVlIG9mIHRoZSBUVEwgCisgKgorICogaXB0X3R0bC5jLHYgMS41IDIwMDAvMTEvMTMgMTE6MTY6MDggbGFmb3JnZSBFeHAKKyAqCisgKiAoQykgMjAwMCwyMDAxIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3R0bC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorCitNT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVAgdGFibGVzIFRUTCBtYXRjaGluZyBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBtYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCB2b2lkICptYXRjaGluZm8sCisJCSBpbnQgb2Zmc2V0LCBpbnQgKmhvdGRyb3ApCit7CisJY29uc3Qgc3RydWN0IGlwdF90dGxfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKworCXN3aXRjaCAoaW5mby0+bW9kZSkgeworCQljYXNlIElQVF9UVExfRVE6CisJCQlyZXR1cm4gKHNrYi0+bmguaXBoLT50dGwgPT0gaW5mby0+dHRsKTsKKwkJCWJyZWFrOworCQljYXNlIElQVF9UVExfTkU6CisJCQlyZXR1cm4gKCEoc2tiLT5uaC5pcGgtPnR0bCA9PSBpbmZvLT50dGwpKTsKKwkJCWJyZWFrOworCQljYXNlIElQVF9UVExfTFQ6CisJCQlyZXR1cm4gKHNrYi0+bmguaXBoLT50dGwgPCBpbmZvLT50dGwpOworCQkJYnJlYWs7CisJCWNhc2UgSVBUX1RUTF9HVDoKKwkJCXJldHVybiAoc2tiLT5uaC5pcGgtPnR0bCA+IGluZm8tPnR0bCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImlwdF90dGw6IHVua25vd24gbW9kZSAlZFxuIiwgCisJCQkJaW5mby0+bW9kZSk7CisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisJCSAgICAgIHZvaWQgKm1hdGNoaW5mbywgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkJICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF90dGxfaW5mbykpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGlwdF9tYXRjaCB0dGxfbWF0Y2ggPSB7CisJLm5hbWUJCT0gInR0bCIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZ0dGxfbWF0Y2gpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZ0dGxfbWF0Y2gpOworCit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9maWx0ZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX2ZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MGE0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9maWx0ZXIuYwpAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIFRoaXMgaXMgdGhlIDE5OTkgcmV3cml0ZSBvZiBJUCBGaXJld2FsbGluZywgYWltaW5nIGZvciBrZXJuZWwgMi4zLnguCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IFBhdWwgYFJ1c3R5JyBSdXNzZWxsICYgTWljaGFlbCBKLiBOZXVsaW5nCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBmaWx0ZXIgdGFibGUiKTsKKworI2RlZmluZSBGSUxURVJfVkFMSURfSE9PS1MgKCgxIDw8IE5GX0lQX0xPQ0FMX0lOKSB8ICgxIDw8IE5GX0lQX0ZPUldBUkQpIHwgKDEgPDwgTkZfSVBfTE9DQUxfT1VUKSkKKworc3RhdGljIHN0cnVjdAoreworCXN0cnVjdCBpcHRfcmVwbGFjZSByZXBsOworCXN0cnVjdCBpcHRfc3RhbmRhcmQgZW50cmllc1szXTsKKwlzdHJ1Y3QgaXB0X2Vycm9yIHRlcm07Cit9IGluaXRpYWxfdGFibGUgX19pbml0ZGF0YSAKKz0geyB7ICJmaWx0ZXIiLCBGSUxURVJfVkFMSURfSE9PS1MsIDQsCisgICAgICBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCkgKiAzICsgc2l6ZW9mKHN0cnVjdCBpcHRfZXJyb3IpLAorICAgICAgeyBbTkZfSVBfTE9DQUxfSU5dID0gMCwKKwlbTkZfSVBfRk9SV0FSRF0gPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCksCisJW05GX0lQX0xPQ0FMX09VVF0gPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCkgKiAyIH0sCisgICAgICB7IFtORl9JUF9MT0NBTF9JTl0gPSAwLAorCVtORl9JUF9GT1JXQVJEXSA9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSwKKwlbTkZfSVBfTE9DQUxfT1VUXSA9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSAqIDIgfSwKKyAgICAgIDAsIE5VTEwsIHsgfSB9LAorICAgIHsKKwkgICAgLyogTE9DQUxfSU4gKi8KKwkgICAgeyB7IHsgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sICIiLCAiIiwgeyAwIH0sIHsgMCB9LCAwLCAwLCAwIH0sCisJCTAsCisJCXNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5KSwKKwkJc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpLAorCQkwLCB7IDAsIDAgfSwgeyB9IH0sCisJICAgICAgeyB7IHsgeyBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0KSksICIiIH0gfSwgeyB9IH0sCisJCS1ORl9BQ0NFUFQgLSAxIH0gfSwKKwkgICAgLyogRk9SV0FSRCAqLworCSAgICB7IHsgeyB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgIiIsICIiLCB7IDAgfSwgeyAwIH0sIDAsIDAsIDAgfSwKKwkJMCwKKwkJc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpLAorCQlzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCksCisJCTAsIHsgMCwgMCB9LCB7IH0gfSwKKwkgICAgICB7IHsgeyB7IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZF90YXJnZXQpKSwgIiIgfSB9LCB7IH0gfSwKKwkJLU5GX0FDQ0VQVCAtIDEgfSB9LAorCSAgICAvKiBMT0NBTF9PVVQgKi8KKwkgICAgeyB7IHsgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sICIiLCAiIiwgeyAwIH0sIHsgMCB9LCAwLCAwLCAwIH0sCisJCTAsCisJCXNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5KSwKKwkJc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpLAorCQkwLCB7IDAsIDAgfSwgeyB9IH0sCisJICAgICAgeyB7IHsgeyBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0KSksICIiIH0gfSwgeyB9IH0sCisJCS1ORl9BQ0NFUFQgLSAxIH0gfQorICAgIH0sCisgICAgLyogRVJST1IgKi8KKyAgICB7IHsgeyB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgIiIsICIiLCB7IDAgfSwgeyAwIH0sIDAsIDAsIDAgfSwKKwkwLAorCXNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5KSwKKwlzaXplb2Yoc3RydWN0IGlwdF9lcnJvciksCisJMCwgeyAwLCAwIH0sIHsgfSB9LAorICAgICAgeyB7IHsgeyBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfZXJyb3JfdGFyZ2V0KSksIElQVF9FUlJPUl9UQVJHRVQgfSB9LAorCSAgeyB9IH0sCisJIkVSUk9SIgorICAgICAgfQorICAgIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaXB0X3RhYmxlIHBhY2tldF9maWx0ZXIgPSB7CisJLm5hbWUJCT0gImZpbHRlciIsCisJLnZhbGlkX2hvb2tzCT0gRklMVEVSX1ZBTElEX0hPT0tTLAorCS5sb2NrCQk9IFJXX0xPQ0tfVU5MT0NLRUQsCisJLm1lCQk9IFRISVNfTU9EVUxFCit9OworCisvKiBUaGUgd29yayBjb21lcyBpbiBoZXJlIGZyb20gbmV0ZmlsdGVyLmMuICovCitzdGF0aWMgdW5zaWduZWQgaW50CitpcHRfaG9vayh1bnNpZ25lZCBpbnQgaG9vaywKKwkgc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQoreworCXJldHVybiBpcHRfZG9fdGFibGUocHNrYiwgaG9vaywgaW4sIG91dCwgJnBhY2tldF9maWx0ZXIsIE5VTEwpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitpcHRfbG9jYWxfb3V0X2hvb2sodW5zaWduZWQgaW50IGhvb2ssCisJCSAgIHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCQkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQkgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwkvKiByb290IGlzIHBsYXlpbmcgd2l0aCByYXcgc29ja2V0cy4gKi8KKwlpZiAoKCpwc2tiKS0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikKKwkgICAgfHwgKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0IDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50aygiaXB0X2hvb2s6IGhhcHB5IGNyYWNraW5nLlxuIik7CisJCXJldHVybiBORl9BQ0NFUFQ7CisJfQorCisJcmV0dXJuIGlwdF9kb190YWJsZShwc2tiLCBob29rLCBpbiwgb3V0LCAmcGFja2V0X2ZpbHRlciwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZfaG9va19vcHMgaXB0X29wc1tdID0geworCXsKKwkJLmhvb2sJCT0gaXB0X2hvb2ssCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkJLnBmCQk9IFBGX0lORVQsCisJCS5ob29rbnVtCT0gTkZfSVBfTE9DQUxfSU4sCisJCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9GSUxURVIsCisJfSwKKwl7CisJCS5ob29rCQk9IGlwdF9ob29rLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5wZgkJPSBQRl9JTkVULAorCQkuaG9va251bQk9IE5GX0lQX0ZPUldBUkQsCisJCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9GSUxURVIsCisJfSwKKwl7CisJCS5ob29rCQk9IGlwdF9sb2NhbF9vdXRfaG9vaywKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkucGYJCT0gUEZfSU5FVCwKKwkJLmhvb2tudW0JPSBORl9JUF9MT0NBTF9PVVQsCisJCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9GSUxURVIsCisJfSwKK307CisKKy8qIERlZmF1bHQgdG8gZm9yd2FyZCBiZWNhdXNlIEkgZ290IHRvbyBtdWNoIG1haWwgYWxyZWFkeS4gKi8KK3N0YXRpYyBpbnQgZm9yd2FyZCA9IE5GX0FDQ0VQVDsKK21vZHVsZV9wYXJhbShmb3J3YXJkLCBib29sLCAwMDAwKTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlpZiAoZm9yd2FyZCA8IDAgfHwgZm9yd2FyZCA+IE5GX01BWF9WRVJESUNUKSB7CisJCXByaW50aygiaXB0YWJsZXMgZm9yd2FyZCBtdXN0IGJlIDAgb3IgMVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEVudHJ5IDEgaXMgdGhlIEZPUldBUkQgaG9vayAqLworCWluaXRpYWxfdGFibGUuZW50cmllc1sxXS50YXJnZXQudmVyZGljdCA9IC1mb3J3YXJkIC0gMTsKKworCS8qIFJlZ2lzdGVyIHRhYmxlICovCisJcmV0ID0gaXB0X3JlZ2lzdGVyX3RhYmxlKCZwYWNrZXRfZmlsdGVyLCAmaW5pdGlhbF90YWJsZS5yZXBsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFJlZ2lzdGVyIGhvb2tzICovCisJcmV0ID0gbmZfcmVnaXN0ZXJfaG9vaygmaXB0X29wc1swXSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gY2xlYW51cF90YWJsZTsKKworCXJldCA9IG5mX3JlZ2lzdGVyX2hvb2soJmlwdF9vcHNbMV0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGNsZWFudXBfaG9vazA7CisKKwlyZXQgPSBuZl9yZWdpc3Rlcl9ob29rKCZpcHRfb3BzWzJdKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBjbGVhbnVwX2hvb2sxOworCisJcmV0dXJuIHJldDsKKworIGNsZWFudXBfaG9vazE6CisJbmZfdW5yZWdpc3Rlcl9ob29rKCZpcHRfb3BzWzFdKTsKKyBjbGVhbnVwX2hvb2swOgorCW5mX3VucmVnaXN0ZXJfaG9vaygmaXB0X29wc1swXSk7CisgY2xlYW51cF90YWJsZToKKwlpcHRfdW5yZWdpc3Rlcl90YWJsZSgmcGFja2V0X2ZpbHRlcik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihpcHRfb3BzKS9zaXplb2Yoc3RydWN0IG5mX2hvb2tfb3BzKTsgaSsrKQorCQluZl91bnJlZ2lzdGVyX2hvb2soJmlwdF9vcHNbaV0pOworCisJaXB0X3VucmVnaXN0ZXJfdGFibGUoJnBhY2tldF9maWx0ZXIpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfbWFuZ2xlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9tYW5nbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjBlYjExCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfbWFuZ2xlLmMKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiBUaGlzIGlzIHRoZSAxOTk5IHJld3JpdGUgb2YgSVAgRmlyZXdhbGxpbmcsIGFpbWluZyBmb3Iga2VybmVsIDIuMy54LgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBQYXVsIGBSdXN0eScgUnVzc2VsbCAmIE1pY2hhZWwgSi4gTmV1bGluZworICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEV4dGVuZGVkIHRvIGFsbCBmaXZlIG5ldGZpbHRlciBob29rcyBieSBCcmFkIENoYXBtYW4gJiBIYXJhbGQgV2VsdGUKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgbWFuZ2xlIHRhYmxlIik7CisKKyNkZWZpbmUgTUFOR0xFX1ZBTElEX0hPT0tTICgoMSA8PCBORl9JUF9QUkVfUk9VVElORykgfCBcCisJCQkgICAgKDEgPDwgTkZfSVBfTE9DQUxfSU4pIHwgXAorCQkJICAgICgxIDw8IE5GX0lQX0ZPUldBUkQpIHwgXAorCQkJICAgICgxIDw8IE5GX0lQX0xPQ0FMX09VVCkgfCBcCisJCQkgICAgKDEgPDwgTkZfSVBfUE9TVF9ST1VUSU5HKSkKKworLyogT3VjaCAtIGZpdmUgZGlmZmVyZW50IGhvb2tzPyBNYXliZSB0aGlzIHNob3VsZCBiZSBhIGNvbmZpZyBvcHRpb24uLi4uLiAtLSBCQyAqLworc3RhdGljIHN0cnVjdAoreworCXN0cnVjdCBpcHRfcmVwbGFjZSByZXBsOworCXN0cnVjdCBpcHRfc3RhbmRhcmQgZW50cmllc1s1XTsKKwlzdHJ1Y3QgaXB0X2Vycm9yIHRlcm07Cit9IGluaXRpYWxfdGFibGUgX19pbml0ZGF0YQorPSB7IHsgIm1hbmdsZSIsIE1BTkdMRV9WQUxJRF9IT09LUywgNiwKKyAgICAgIHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSAqIDUgKyBzaXplb2Yoc3RydWN0IGlwdF9lcnJvciksCisgICAgICB7IFtORl9JUF9QUkVfUk9VVElOR10gCT0gMCwKKwlbTkZfSVBfTE9DQUxfSU5dIAk9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSwKKwlbTkZfSVBfRk9SV0FSRF0gCT0gc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpICogMiwKKwlbTkZfSVBfTE9DQUxfT1VUXSAJPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCkgKiAzLAorCVtORl9JUF9QT1NUX1JPVVRJTkddIAk9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSAqIDQgfSwKKyAgICAgIHsgW05GX0lQX1BSRV9ST1VUSU5HXSAJPSAwLAorCVtORl9JUF9MT0NBTF9JTl0gCT0gc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpLAorCVtORl9JUF9GT1JXQVJEXSAJPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCkgKiAyLAorCVtORl9JUF9MT0NBTF9PVVRdIAk9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSAqIDMsCisJW05GX0lQX1BPU1RfUk9VVElOR10JPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCkgKiA0IH0sCisgICAgICAwLCBOVUxMLCB7IH0gfSwKKyAgICB7CisJICAgIC8qIFBSRV9ST1VUSU5HICovCisJICAgIHsgeyB7IHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCAiIiwgIiIsIHsgMCB9LCB7IDAgfSwgMCwgMCwgMCB9LAorCQkwLAorCQlzaXplb2Yoc3RydWN0IGlwdF9lbnRyeSksCisJCXNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSwKKwkJMCwgeyAwLCAwIH0sIHsgfSB9LAorCSAgICAgIHsgeyB7IHsgSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkX3RhcmdldCkpLCAiIiB9IH0sIHsgfSB9LAorCQktTkZfQUNDRVBUIC0gMSB9IH0sCisJICAgIC8qIExPQ0FMX0lOICovCisgCSAgICB7IHsgeyB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgIiIsICIiLCB7IDAgfSwgeyAwIH0sIDAsIDAsIDAgfSwKKwkJMCwKKwkJc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpLAorCQlzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCksCisJCTAsIHsgMCwgMCB9LCB7IH0gfSwKKwkgICAgICB7IHsgeyB7IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZF90YXJnZXQpKSwgIiIgfSB9LCB7IH0gfSwKKwkJLU5GX0FDQ0VQVCAtIDEgfSB9LAorCSAgICAvKiBGT1JXQVJEICovCisgCSAgICB7IHsgeyB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgIiIsICIiLCB7IDAgfSwgeyAwIH0sIDAsIDAsIDAgfSwKKwkJMCwKKwkJc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpLAorCQlzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCksCisJCTAsIHsgMCwgMCB9LCB7IH0gfSwKKwkgICAgICB7IHsgeyB7IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZF90YXJnZXQpKSwgIiIgfSB9LCB7IH0gfSwKKwkJLU5GX0FDQ0VQVCAtIDEgfSB9LAorCSAgICAvKiBMT0NBTF9PVVQgKi8KKwkgICAgeyB7IHsgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sICIiLCAiIiwgeyAwIH0sIHsgMCB9LCAwLCAwLCAwIH0sCisJCTAsCisJCXNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5KSwKKwkJc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpLAorCQkwLCB7IDAsIDAgfSwgeyB9IH0sCisJICAgICAgeyB7IHsgeyBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0KSksICIiIH0gfSwgeyB9IH0sCisJCS1ORl9BQ0NFUFQgLSAxIH0gfSwKKwkgICAgLyogUE9TVF9ST1VUSU5HICovCisJICAgIHsgeyB7IHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCAiIiwgIiIsIHsgMCB9LCB7IDAgfSwgMCwgMCwgMCB9LAorCQkwLAorCQlzaXplb2Yoc3RydWN0IGlwdF9lbnRyeSksCisJCXNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSwKKwkJMCwgeyAwLCAwIH0sIHsgfSB9LAorCSAgICAgIHsgeyB7IHsgSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkX3RhcmdldCkpLCAiIiB9IH0sIHsgfSB9LAorCQktTkZfQUNDRVBUIC0gMSB9IH0sCisgICAgfSwKKyAgICAvKiBFUlJPUiAqLworICAgIHsgeyB7IHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCAiIiwgIiIsIHsgMCB9LCB7IDAgfSwgMCwgMCwgMCB9LAorCTAsCisJc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpLAorCXNpemVvZihzdHJ1Y3QgaXB0X2Vycm9yKSwKKwkwLCB7IDAsIDAgfSwgeyB9IH0sCisgICAgICB7IHsgeyB7IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9lcnJvcl90YXJnZXQpKSwgSVBUX0VSUk9SX1RBUkdFVCB9IH0sCisJICB7IH0gfSwKKwkiRVJST1IiCisgICAgICB9CisgICAgfQorfTsKKworc3RhdGljIHN0cnVjdCBpcHRfdGFibGUgcGFja2V0X21hbmdsZXIgPSB7CisJLm5hbWUJCT0gIm1hbmdsZSIsCisJLnZhbGlkX2hvb2tzCT0gTUFOR0xFX1ZBTElEX0hPT0tTLAorCS5sb2NrCQk9IFJXX0xPQ0tfVU5MT0NLRUQsCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworLyogVGhlIHdvcmsgY29tZXMgaW4gaGVyZSBmcm9tIG5ldGZpbHRlci5jLiAqLworc3RhdGljIHVuc2lnbmVkIGludAoraXB0X3JvdXRlX2hvb2sodW5zaWduZWQgaW50IGhvb2ssCisJIHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlyZXR1cm4gaXB0X2RvX3RhYmxlKHBza2IsIGhvb2ssIGluLCBvdXQsICZwYWNrZXRfbWFuZ2xlciwgTlVMTCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2lwdF9sb2NhbF9ob29rKHVuc2lnbmVkIGludCBob29rLAorCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkJICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCit7CisJdW5zaWduZWQgaW50IHJldDsKKwl1X2ludDhfdCB0b3M7CisJdV9pbnQzMl90IHNhZGRyLCBkYWRkcjsKKwl1bnNpZ25lZCBsb25nIG5mbWFyazsKKworCS8qIHJvb3QgaXMgcGxheWluZyB3aXRoIHJhdyBzb2NrZXRzLiAqLworCWlmICgoKnBza2IpLT5sZW4gPCBzaXplb2Yoc3RydWN0IGlwaGRyKQorCSAgICB8fCAoKnBza2IpLT5uaC5pcGgtPmlobCAqIDQgPCBzaXplb2Yoc3RydWN0IGlwaGRyKSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKCJpcHRfaG9vazogaGFwcHkgY3JhY2tpbmcuXG4iKTsKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKwl9CisKKwkvKiBTYXZlIHRoaW5ncyB3aGljaCBjb3VsZCBhZmZlY3Qgcm91dGUgKi8KKwluZm1hcmsgPSAoKnBza2IpLT5uZm1hcms7CisJc2FkZHIgPSAoKnBza2IpLT5uaC5pcGgtPnNhZGRyOworCWRhZGRyID0gKCpwc2tiKS0+bmguaXBoLT5kYWRkcjsKKwl0b3MgPSAoKnBza2IpLT5uaC5pcGgtPnRvczsKKworCXJldCA9IGlwdF9kb190YWJsZShwc2tiLCBob29rLCBpbiwgb3V0LCAmcGFja2V0X21hbmdsZXIsIE5VTEwpOworCS8qIFJlcm91dGUgZm9yIEFOWSBjaGFuZ2UuICovCisJaWYgKHJldCAhPSBORl9EUk9QICYmIHJldCAhPSBORl9TVE9MRU4gJiYgcmV0ICE9IE5GX1FVRVVFCisJICAgICYmICgoKnBza2IpLT5uaC5pcGgtPnNhZGRyICE9IHNhZGRyCisJCXx8ICgqcHNrYiktPm5oLmlwaC0+ZGFkZHIgIT0gZGFkZHIKKyNpZmRlZiBDT05GSUdfSVBfUk9VVEVfRldNQVJLCisJCXx8ICgqcHNrYiktPm5mbWFyayAhPSBuZm1hcmsKKyNlbmRpZgorCQl8fCAoKnBza2IpLT5uaC5pcGgtPnRvcyAhPSB0b3MpKQorCQlyZXR1cm4gaXBfcm91dGVfbWVfaGFyZGVyKHBza2IpID09IDAgPyByZXQgOiBORl9EUk9QOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBuZl9ob29rX29wcyBpcHRfb3BzW10gPSB7CisJeworCQkuaG9vawkJPSBpcHRfcm91dGVfaG9vaywKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkucGYJCT0gUEZfSU5FVCwKKwkJLmhvb2tudW0JPSBORl9JUF9QUkVfUk9VVElORywgCisJCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9NQU5HTEUsCisJfSwKKwl7CisJCS5ob29rCQk9IGlwdF9yb3V0ZV9ob29rLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5wZgkJPSBQRl9JTkVULAorCQkuaG9va251bQk9IE5GX0lQX0xPQ0FMX0lOLAorCQkucHJpb3JpdHkJPSBORl9JUF9QUklfTUFOR0xFLAorCX0sCisJeworCQkuaG9vawkJPSBpcHRfcm91dGVfaG9vaywKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkucGYJCT0gUEZfSU5FVCwKKwkJLmhvb2tudW0JPSBORl9JUF9GT1JXQVJELAorCQkucHJpb3JpdHkJPSBORl9JUF9QUklfTUFOR0xFLAorCX0sCisJeworCQkuaG9vawkJPSBpcHRfbG9jYWxfaG9vaywKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkucGYJCT0gUEZfSU5FVCwKKwkJLmhvb2tudW0JPSBORl9JUF9MT0NBTF9PVVQsCisJCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9NQU5HTEUsCisJfSwKKwl7CisJCS5ob29rCQk9IGlwdF9yb3V0ZV9ob29rLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5wZgkJPSBQRl9JTkVULAorCQkuaG9va251bQk9IE5GX0lQX1BPU1RfUk9VVElORywKKwkJLnByaW9yaXR5CT0gTkZfSVBfUFJJX01BTkdMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwkvKiBSZWdpc3RlciB0YWJsZSAqLworCXJldCA9IGlwdF9yZWdpc3Rlcl90YWJsZSgmcGFja2V0X21hbmdsZXIsICZpbml0aWFsX3RhYmxlLnJlcGwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogUmVnaXN0ZXIgaG9va3MgKi8KKwlyZXQgPSBuZl9yZWdpc3Rlcl9ob29rKCZpcHRfb3BzWzBdKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBjbGVhbnVwX3RhYmxlOworCisJcmV0ID0gbmZfcmVnaXN0ZXJfaG9vaygmaXB0X29wc1sxXSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gY2xlYW51cF9ob29rMDsKKworCXJldCA9IG5mX3JlZ2lzdGVyX2hvb2soJmlwdF9vcHNbMl0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGNsZWFudXBfaG9vazE7CisKKwlyZXQgPSBuZl9yZWdpc3Rlcl9ob29rKCZpcHRfb3BzWzNdKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBjbGVhbnVwX2hvb2syOworCisJcmV0ID0gbmZfcmVnaXN0ZXJfaG9vaygmaXB0X29wc1s0XSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gY2xlYW51cF9ob29rMzsKKworCXJldHVybiByZXQ7CisKKyBjbGVhbnVwX2hvb2szOgorICAgICAgICBuZl91bnJlZ2lzdGVyX2hvb2soJmlwdF9vcHNbM10pOworIGNsZWFudXBfaG9vazI6CisgICAgICAgIG5mX3VucmVnaXN0ZXJfaG9vaygmaXB0X29wc1syXSk7CisgY2xlYW51cF9ob29rMToKKwluZl91bnJlZ2lzdGVyX2hvb2soJmlwdF9vcHNbMV0pOworIGNsZWFudXBfaG9vazA6CisJbmZfdW5yZWdpc3Rlcl9ob29rKCZpcHRfb3BzWzBdKTsKKyBjbGVhbnVwX3RhYmxlOgorCWlwdF91bnJlZ2lzdGVyX3RhYmxlKCZwYWNrZXRfbWFuZ2xlcik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihpcHRfb3BzKS9zaXplb2Yoc3RydWN0IG5mX2hvb2tfb3BzKTsgaSsrKQorCQluZl91bnJlZ2lzdGVyX2hvb2soJmlwdF9vcHNbaV0pOworCisJaXB0X3VucmVnaXN0ZXJfdGFibGUoJnBhY2tldF9tYW5nbGVyKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX3Jhdy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfcmF3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiNGEzYwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX3Jhdy5jCkBAIC0wLDAgKzEsMTU2IEBACisvKiAKKyAqICdyYXcnIHRhYmxlLCB3aGljaCBpcyB0aGUgdmVyeSBmaXJzdCBob29rZWQgaW4gYXQgUFJFX1JPVVRJTkcgYW5kIExPQ0FMX09VVCAuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIEpvenNlZiBLYWRsZWNzaWsgPGthZGxlY0BibGFja2hvbGUua2ZraS5odT4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorCisjZGVmaW5lIFJBV19WQUxJRF9IT09LUyAoKDEgPDwgTkZfSVBfUFJFX1JPVVRJTkcpIHwgKDEgPDwgTkZfSVBfTE9DQUxfT1VUKSkKKworc3RhdGljIHN0cnVjdAoreworCXN0cnVjdCBpcHRfcmVwbGFjZSByZXBsOworCXN0cnVjdCBpcHRfc3RhbmRhcmQgZW50cmllc1syXTsKKwlzdHJ1Y3QgaXB0X2Vycm9yIHRlcm07Cit9IGluaXRpYWxfdGFibGUgX19pbml0ZGF0YSA9IHsKKwkucmVwbCA9IHsKKwkJLm5hbWUgPSAicmF3IiwgCisJCS52YWxpZF9ob29rcyA9IFJBV19WQUxJRF9IT09LUywgCisJCS5udW1fZW50cmllcyA9IDMsCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpICogMiArIHNpemVvZihzdHJ1Y3QgaXB0X2Vycm9yKSwKKwkJLmhvb2tfZW50cnkgPSB7IAorCQkJW05GX0lQX1BSRV9ST1VUSU5HXSA9IDAsCisJCQlbTkZfSVBfTE9DQUxfT1VUXSA9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSB9LAorCQkudW5kZXJmbG93ID0geyAKKwkJCVtORl9JUF9QUkVfUk9VVElOR10gPSAwLAorCQkJW05GX0lQX0xPQ0FMX09VVF0gID0gc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpIH0sCisJfSwKKwkuZW50cmllcyA9IHsKKwkgICAgIC8qIFBSRV9ST1VUSU5HICovCisJICAgICB7IAorCQkgICAgIC5lbnRyeSA9IHsgCisJCQkgICAgIC50YXJnZXRfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpLAorCQkJICAgICAubmV4dF9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCksCisJCSAgICAgfSwKKwkJICAgICAudGFyZ2V0ID0geyAKKwkJCSAgLnRhcmdldCA9IHsgCisJCQkJICAudSA9IHsKKwkJCQkJICAudGFyZ2V0X3NpemUgPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0KSksCisJCQkJICB9LAorCQkJICB9LAorCQkJICAudmVyZGljdCA9IC1ORl9BQ0NFUFQgLSAxLAorCQkgICAgIH0sCisJICAgICB9LAorCisJICAgICAvKiBMT0NBTF9PVVQgKi8KKwkgICAgIHsKKwkJICAgICAuZW50cnkgPSB7CisJCQkgICAgIC50YXJnZXRfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpLAorCQkJICAgICAubmV4dF9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCksCisJCSAgICAgfSwKKwkJICAgICAudGFyZ2V0ID0geworCQkJICAgICAudGFyZ2V0ID0geworCQkJCSAgICAgLnUgPSB7CisJCQkJCSAgICAgLnRhcmdldF9zaXplID0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkX3RhcmdldCkpLAorCQkJCSAgICAgfSwKKwkJCSAgICAgfSwKKwkJCSAgICAgLnZlcmRpY3QgPSAtTkZfQUNDRVBUIC0gMSwKKwkJICAgICB9LAorCSAgICAgfSwKKwl9LAorCS8qIEVSUk9SICovCisJLnRlcm0gPSB7CisJCS5lbnRyeSA9IHsKKwkJCS50YXJnZXRfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpLAorCQkJLm5leHRfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBpcHRfZXJyb3IpLAorCQl9LAorCQkudGFyZ2V0ID0geworCQkJLnRhcmdldCA9IHsKKwkJCQkudSA9IHsKKwkJCQkJLnVzZXIgPSB7CisJCQkJCQkudGFyZ2V0X3NpemUgPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfZXJyb3JfdGFyZ2V0KSksIAorCQkJCQkJLm5hbWUgPSBJUFRfRVJST1JfVEFSR0VULAorCQkJCQl9LAorCQkJCX0sCisJCQl9LAorCQkJLmVycm9ybmFtZSA9ICJFUlJPUiIsCisJCX0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBpcHRfdGFibGUgcGFja2V0X3JhdyA9IHsgCisJLm5hbWUgPSAicmF3IiwgCisJLnZhbGlkX2hvb2tzID0gIFJBV19WQUxJRF9IT09LUywgCisJLmxvY2sgPSBSV19MT0NLX1VOTE9DS0VELCAKKwkubWUgPSBUSElTX01PRFVMRQorfTsKKworLyogVGhlIHdvcmsgY29tZXMgaW4gaGVyZSBmcm9tIG5ldGZpbHRlci5jLiAqLworc3RhdGljIHVuc2lnbmVkIGludAoraXB0X2hvb2sodW5zaWduZWQgaW50IGhvb2ssCisJIHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlyZXR1cm4gaXB0X2RvX3RhYmxlKHBza2IsIGhvb2ssIGluLCBvdXQsICZwYWNrZXRfcmF3LCBOVUxMKTsKK30KKworLyogJ3JhdycgaXMgdGhlIHZlcnkgZmlyc3QgdGFibGUuICovCitzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIGlwdF9vcHNbXSA9IHsKKwl7CisJICAuaG9vayA9IGlwdF9ob29rLCAKKwkgIC5wZiA9IFBGX0lORVQsIAorCSAgLmhvb2tudW0gPSBORl9JUF9QUkVfUk9VVElORywgCisJICAucHJpb3JpdHkgPSBORl9JUF9QUklfUkFXCisJfSwKKwl7CisJICAuaG9vayA9IGlwdF9ob29rLCAKKwkgIC5wZiA9IFBGX0lORVQsIAorCSAgLmhvb2tudW0gPSBORl9JUF9MT0NBTF9PVVQsIAorCSAgLnByaW9yaXR5ID0gTkZfSVBfUFJJX1JBVworCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCS8qIFJlZ2lzdGVyIHRhYmxlICovCisJcmV0ID0gaXB0X3JlZ2lzdGVyX3RhYmxlKCZwYWNrZXRfcmF3LCAmaW5pdGlhbF90YWJsZS5yZXBsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFJlZ2lzdGVyIGhvb2tzICovCisJcmV0ID0gbmZfcmVnaXN0ZXJfaG9vaygmaXB0X29wc1swXSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gY2xlYW51cF90YWJsZTsKKworCXJldCA9IG5mX3JlZ2lzdGVyX2hvb2soJmlwdF9vcHNbMV0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGNsZWFudXBfaG9vazA7CisKKwlyZXR1cm4gcmV0OworCisgY2xlYW51cF9ob29rMDoKKwluZl91bnJlZ2lzdGVyX2hvb2soJmlwdF9vcHNbMF0pOworIGNsZWFudXBfdGFibGU6CisJaXB0X3VucmVnaXN0ZXJfdGFibGUoJnBhY2tldF9yYXcpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoaXB0X29wcykvc2l6ZW9mKHN0cnVjdCBuZl9ob29rX29wcyk7IGkrKykKKwkJbmZfdW5yZWdpc3Rlcl9ob29rKCZpcHRfb3BzW2ldKTsKKworCWlwdF91bnJlZ2lzdGVyX3RhYmxlKCZwYWNrZXRfcmF3KTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3Byb2MuYyBiL25ldC9pcHY0L3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTJiYmNjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvcHJvYy5jCkBAIC0wLDAgKzEsMzgyIEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCVRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSB2YXJpb3VzIGFjY2VzcyBmdW5jdGlvbnMgZm9yIHRoZQorICoJCVBST0MgZmlsZSBzeXN0ZW0uICBJdCBpcyBtYWlubHkgdXNlZCBmb3IgZGVidWdnaW5nIGFuZAorICoJCXN0YXRpc3RpY3MuCisgKgorICogVmVyc2lvbjoJJElkOiBwcm9jLmMsdiAxLjQ1IDIwMDEvMDUvMTYgMTY6NDU6MzUgZGF2ZW0gRXhwICQKKyAqCisgKiBBdXRob3JzOglGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCQlHZXJhbGQgSi4gSGVpbSwgPGhlaW1AcGVhbnV0cy5pbmZvcm1hdGlrLnVuaS10dWViaW5nZW4uZGU+CisgKgkJRnJlZCBCYXVtZ2FydGVuLCA8ZGM2aXFAaW5zdTEuZXRlYy51bmkta2FybHNydWhlLmRlPgorICoJCUVyaWsgU2Nob2VuZmVsZGVyLCA8c2Nob2VuZnJAaWJyLmNzLnR1LWJzLmRlPgorICoKKyAqIEZpeGVzOgorICoJCUFsYW4gQ294CToJVURQIHNvY2tldHMgc2hvdyB0aGUgcnhxdWV1ZS90eHF1ZXVlCisgKgkJCQkJdXNpbmcgaGludCBmbGFnIGZvciB0aGUgbmV0aW5mby4KKyAqCVBhdWxpbmUgTWlkZGVsaW5rCToJaWRlbnRkIHN1cHBvcnQKKyAqCQlBbGFuIENveAk6CU1ha2UgL3Byb2Mgc2FmZXIuCisgKglFcmlrIFNjaG9lbmZlbGRlcgk6CS9wcm9jL25ldC9zbm1wCisgKgkJQWxhbiBDb3gJOglIYW5kbGUgZGVhZCBzb2NrZXRzIHByb3Blcmx5LgorICoJR2VyaGFyZCBLb2VydGluZwk6CVNob3cgYm90aCB0aW1lcnMKKyAqCQlBbGFuIENveAk6CUFsbG93IGlub2RlIHRvIGJlIE5VTEwgKGtlcm5lbCBzb2NrZXQpCisgKglBbmRpIEtsZWVuCQk6CUFkZCBzdXBwb3J0IGZvciBvcGVuX3JlcXVlc3RzIGFuZAorICoJCQkJCXNwbGl0IGZ1bmN0aW9ucyBmb3IgbW9yZSByZWFkaWJpbGl0eS4KKyAqCUFuZGkgS2xlZW4JCToJQWRkIHN1cHBvcnQgZm9yIC9wcm9jL25ldC9uZXRzdGF0CisgKglBcm5hbGRvIEMuIE1lbG8JCToJQ29udmVydCB0byBzZXFfZmlsZQorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXQvaWNtcC5oPgorI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvcmF3Lmg+CisKK3N0YXRpYyBpbnQgZm9sZF9wcm90X2ludXNlKHN0cnVjdCBwcm90byAqcHJvdG8pCit7CisJaW50IHJlcyA9IDA7CisJaW50IGNwdTsKKworCWZvciAoY3B1ID0gMDsgY3B1IDwgTlJfQ1BVUzsgY3B1KyspCisJCXJlcyArPSBwcm90by0+c3RhdHNbY3B1XS5pbnVzZTsKKworCXJldHVybiByZXM7Cit9CisKKy8qCisgKglSZXBvcnQgc29ja2V0IGFsbG9jYXRpb24gc3RhdGlzdGljcyBbbWVhQHV0dS5maV0KKyAqLworc3RhdGljIGludCBzb2Nrc3RhdF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwkvKiBGcm9tIG5ldC9zb2NrZXQuYyAqLworCWV4dGVybiB2b2lkIHNvY2tldF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSk7CisKKwlzb2NrZXRfc2VxX3Nob3coc2VxKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlRDUDogaW51c2UgJWQgb3JwaGFuICVkIHR3ICVkIGFsbG9jICVkIG1lbSAlZFxuIiwKKwkJICAgZm9sZF9wcm90X2ludXNlKCZ0Y3BfcHJvdCksIGF0b21pY19yZWFkKCZ0Y3Bfb3JwaGFuX2NvdW50KSwKKwkJICAgdGNwX3R3X2NvdW50LCBhdG9taWNfcmVhZCgmdGNwX3NvY2tldHNfYWxsb2NhdGVkKSwKKwkJICAgYXRvbWljX3JlYWQoJnRjcF9tZW1vcnlfYWxsb2NhdGVkKSk7CisJc2VxX3ByaW50ZihzZXEsICJVRFA6IGludXNlICVkXG4iLCBmb2xkX3Byb3RfaW51c2UoJnVkcF9wcm90KSk7CisJc2VxX3ByaW50ZihzZXEsICJSQVc6IGludXNlICVkXG4iLCBmb2xkX3Byb3RfaW51c2UoJnJhd19wcm90KSk7CisJc2VxX3ByaW50ZihzZXEsICAiRlJBRzogaW51c2UgJWQgbWVtb3J5ICVkXG4iLCBpcF9mcmFnX25xdWV1ZXMsCisJCSAgIGF0b21pY19yZWFkKCZpcF9mcmFnX21lbSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvY2tzdGF0X3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzb2Nrc3RhdF9zZXFfc2hvdywgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNvY2tzdGF0X3NlcV9mb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkub3BlbgkgPSBzb2Nrc3RhdF9zZXFfb3BlbiwKKwkucmVhZAkgPSBzZXFfcmVhZCwKKwkubGxzZWVrCSA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2ZvbGRfZmllbGQodm9pZCAqbWliW10sIGludCBvZmZ0KQoreworCXVuc2lnbmVkIGxvbmcgcmVzID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKKwkJaWYgKCFjcHVfcG9zc2libGUoaSkpCisJCQljb250aW51ZTsKKwkJcmVzICs9ICooKCh1bnNpZ25lZCBsb25nICopIHBlcl9jcHVfcHRyKG1pYlswXSwgaSkpICsgb2ZmdCk7CisJCXJlcyArPSAqKCgodW5zaWduZWQgbG9uZyAqKSBwZXJfY3B1X3B0cihtaWJbMV0sIGkpKSArIG9mZnQpOworCX0KKwlyZXR1cm4gcmVzOworfQorCisvKiBzbm1wIGl0ZW1zICovCitzdGF0aWMgc3RydWN0IHNubXBfbWliIHNubXA0X2lwc3RhdHNfbGlzdFtdID0geworCVNOTVBfTUlCX0lURU0oIkluUmVjZWl2ZXMiLCBJUFNUQVRTX01JQl9JTlJFQ0VJVkVTKSwKKwlTTk1QX01JQl9JVEVNKCJJbkhkckVycm9ycyIsIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKSwKKwlTTk1QX01JQl9JVEVNKCJJbkFkZHJFcnJvcnMiLCBJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMpLAorCVNOTVBfTUlCX0lURU0oIkZvcndEYXRhZ3JhbXMiLCBJUFNUQVRTX01JQl9PVVRGT1JXREFUQUdSQU1TKSwKKwlTTk1QX01JQl9JVEVNKCJJblVua25vd25Qcm90b3MiLCBJUFNUQVRTX01JQl9JTlVOS05PV05QUk9UT1MpLAorCVNOTVBfTUlCX0lURU0oIkluRGlzY2FyZHMiLCBJUFNUQVRTX01JQl9JTkRJU0NBUkRTKSwKKwlTTk1QX01JQl9JVEVNKCJJbkRlbGl2ZXJzIiwgSVBTVEFUU19NSUJfSU5ERUxJVkVSUyksCisJU05NUF9NSUJfSVRFTSgiT3V0UmVxdWVzdHMiLCBJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyksCisJU05NUF9NSUJfSVRFTSgiT3V0RGlzY2FyZHMiLCBJUFNUQVRTX01JQl9PVVRESVNDQVJEUyksCisJU05NUF9NSUJfSVRFTSgiT3V0Tm9Sb3V0ZXMiLCBJUFNUQVRTX01JQl9PVVROT1JPVVRFUyksCisJU05NUF9NSUJfSVRFTSgiUmVhc21UaW1lb3V0IiwgSVBTVEFUU19NSUJfUkVBU01USU1FT1VUKSwKKwlTTk1QX01JQl9JVEVNKCJSZWFzbVJlcWRzIiwgSVBTVEFUU19NSUJfUkVBU01SRVFEUyksCisJU05NUF9NSUJfSVRFTSgiUmVhc21PS3MiLCBJUFNUQVRTX01JQl9SRUFTTU9LUyksCisJU05NUF9NSUJfSVRFTSgiUmVhc21GYWlscyIsIElQU1RBVFNfTUlCX1JFQVNNRkFJTFMpLAorCVNOTVBfTUlCX0lURU0oIkZyYWdPS3MiLCBJUFNUQVRTX01JQl9GUkFHT0tTKSwKKwlTTk1QX01JQl9JVEVNKCJGcmFnRmFpbHMiLCBJUFNUQVRTX01JQl9GUkFHRkFJTFMpLAorCVNOTVBfTUlCX0lURU0oIkZyYWdDcmVhdGVzIiwgSVBTVEFUU19NSUJfRlJBR0NSRUFURVMpLAorCVNOTVBfTUlCX1NFTlRJTkVMCit9OworCitzdGF0aWMgc3RydWN0IHNubXBfbWliIHNubXA0X2ljbXBfbGlzdFtdID0geworCVNOTVBfTUlCX0lURU0oIkluTXNncyIsIElDTVBfTUlCX0lOTVNHUyksCisJU05NUF9NSUJfSVRFTSgiSW5FcnJvcnMiLCBJQ01QX01JQl9JTkVSUk9SUyksCisJU05NUF9NSUJfSVRFTSgiSW5EZXN0VW5yZWFjaHMiLCBJQ01QX01JQl9JTkRFU1RVTlJFQUNIUyksCisJU05NUF9NSUJfSVRFTSgiSW5UaW1lRXhjZHMiLCBJQ01QX01JQl9JTlRJTUVFWENEUyksCisJU05NUF9NSUJfSVRFTSgiSW5QYXJtUHJvYnMiLCBJQ01QX01JQl9JTlBBUk1QUk9CUyksCisJU05NUF9NSUJfSVRFTSgiSW5TcmNRdWVuY2hzIiwgSUNNUF9NSUJfSU5TUkNRVUVOQ0hTKSwKKwlTTk1QX01JQl9JVEVNKCJJblJlZGlyZWN0cyIsIElDTVBfTUlCX0lOUkVESVJFQ1RTKSwKKwlTTk1QX01JQl9JVEVNKCJJbkVjaG9zIiwgSUNNUF9NSUJfSU5FQ0hPUyksCisJU05NUF9NSUJfSVRFTSgiSW5FY2hvUmVwcyIsIElDTVBfTUlCX0lORUNIT1JFUFMpLAorCVNOTVBfTUlCX0lURU0oIkluVGltZXN0YW1wcyIsIElDTVBfTUlCX0lOVElNRVNUQU1QUyksCisJU05NUF9NSUJfSVRFTSgiSW5UaW1lc3RhbXBSZXBzIiwgSUNNUF9NSUJfSU5USU1FU1RBTVBSRVBTKSwKKwlTTk1QX01JQl9JVEVNKCJJbkFkZHJNYXNrcyIsIElDTVBfTUlCX0lOQUREUk1BU0tTKSwKKwlTTk1QX01JQl9JVEVNKCJJbkFkZHJNYXNrUmVwcyIsIElDTVBfTUlCX0lOQUREUk1BU0tSRVBTKSwKKwlTTk1QX01JQl9JVEVNKCJPdXRNc2dzIiwgSUNNUF9NSUJfT1VUTVNHUyksCisJU05NUF9NSUJfSVRFTSgiT3V0RXJyb3JzIiwgSUNNUF9NSUJfT1VURVJST1JTKSwKKwlTTk1QX01JQl9JVEVNKCJPdXREZXN0VW5yZWFjaHMiLCBJQ01QX01JQl9PVVRERVNUVU5SRUFDSFMpLAorCVNOTVBfTUlCX0lURU0oIk91dFRpbWVFeGNkcyIsIElDTVBfTUlCX09VVFRJTUVFWENEUyksCisJU05NUF9NSUJfSVRFTSgiT3V0UGFybVByb2JzIiwgSUNNUF9NSUJfT1VUUEFSTVBST0JTKSwKKwlTTk1QX01JQl9JVEVNKCJPdXRTcmNRdWVuY2hzIiwgSUNNUF9NSUJfT1VUU1JDUVVFTkNIUyksCisJU05NUF9NSUJfSVRFTSgiT3V0UmVkaXJlY3RzIiwgSUNNUF9NSUJfT1VUUkVESVJFQ1RTKSwKKwlTTk1QX01JQl9JVEVNKCJPdXRFY2hvcyIsIElDTVBfTUlCX09VVEVDSE9TKSwKKwlTTk1QX01JQl9JVEVNKCJPdXRFY2hvUmVwcyIsIElDTVBfTUlCX09VVEVDSE9SRVBTKSwKKwlTTk1QX01JQl9JVEVNKCJPdXRUaW1lc3RhbXBzIiwgSUNNUF9NSUJfT1VUVElNRVNUQU1QUyksCisJU05NUF9NSUJfSVRFTSgiT3V0VGltZXN0YW1wUmVwcyIsIElDTVBfTUlCX09VVFRJTUVTVEFNUFJFUFMpLAorCVNOTVBfTUlCX0lURU0oIk91dEFkZHJNYXNrcyIsIElDTVBfTUlCX09VVEFERFJNQVNLUyksCisJU05NUF9NSUJfSVRFTSgiT3V0QWRkck1hc2tSZXBzIiwgSUNNUF9NSUJfT1VUQUREUk1BU0tSRVBTKSwKKwlTTk1QX01JQl9TRU5USU5FTAorfTsKKworc3RhdGljIHN0cnVjdCBzbm1wX21pYiBzbm1wNF90Y3BfbGlzdFtdID0geworCVNOTVBfTUlCX0lURU0oIlJ0b0FsZ29yaXRobSIsIFRDUF9NSUJfUlRPQUxHT1JJVEhNKSwKKwlTTk1QX01JQl9JVEVNKCJSdG9NaW4iLCBUQ1BfTUlCX1JUT01JTiksCisJU05NUF9NSUJfSVRFTSgiUnRvTWF4IiwgVENQX01JQl9SVE9NQVgpLAorCVNOTVBfTUlCX0lURU0oIk1heENvbm4iLCBUQ1BfTUlCX01BWENPTk4pLAorCVNOTVBfTUlCX0lURU0oIkFjdGl2ZU9wZW5zIiwgVENQX01JQl9BQ1RJVkVPUEVOUyksCisJU05NUF9NSUJfSVRFTSgiUGFzc2l2ZU9wZW5zIiwgVENQX01JQl9QQVNTSVZFT1BFTlMpLAorCVNOTVBfTUlCX0lURU0oIkF0dGVtcHRGYWlscyIsIFRDUF9NSUJfQVRURU1QVEZBSUxTKSwKKwlTTk1QX01JQl9JVEVNKCJFc3RhYlJlc2V0cyIsIFRDUF9NSUJfRVNUQUJSRVNFVFMpLAorCVNOTVBfTUlCX0lURU0oIkN1cnJFc3RhYiIsIFRDUF9NSUJfQ1VSUkVTVEFCKSwKKwlTTk1QX01JQl9JVEVNKCJJblNlZ3MiLCBUQ1BfTUlCX0lOU0VHUyksCisJU05NUF9NSUJfSVRFTSgiT3V0U2VncyIsIFRDUF9NSUJfT1VUU0VHUyksCisJU05NUF9NSUJfSVRFTSgiUmV0cmFuc1NlZ3MiLCBUQ1BfTUlCX1JFVFJBTlNTRUdTKSwKKwlTTk1QX01JQl9JVEVNKCJJbkVycnMiLCBUQ1BfTUlCX0lORVJSUyksCisJU05NUF9NSUJfSVRFTSgiT3V0UnN0cyIsIFRDUF9NSUJfT1VUUlNUUyksCisJU05NUF9NSUJfU0VOVElORUwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25tcF9taWIgc25tcDRfdWRwX2xpc3RbXSA9IHsKKwlTTk1QX01JQl9JVEVNKCJJbkRhdGFncmFtcyIsIFVEUF9NSUJfSU5EQVRBR1JBTVMpLAorCVNOTVBfTUlCX0lURU0oIk5vUG9ydHMiLCBVRFBfTUlCX05PUE9SVFMpLAorCVNOTVBfTUlCX0lURU0oIkluRXJyb3JzIiwgVURQX01JQl9JTkVSUk9SUyksCisJU05NUF9NSUJfSVRFTSgiT3V0RGF0YWdyYW1zIiwgVURQX01JQl9PVVREQVRBR1JBTVMpLAorCVNOTVBfTUlCX1NFTlRJTkVMCit9OworCitzdGF0aWMgc3RydWN0IHNubXBfbWliIHNubXA0X25ldF9saXN0W10gPSB7CisJU05NUF9NSUJfSVRFTSgiU3luY29va2llc1NlbnQiLCBMSU5VWF9NSUJfU1lOQ09PS0lFU1NFTlQpLAorCVNOTVBfTUlCX0lURU0oIlN5bmNvb2tpZXNSZWN2IiwgTElOVVhfTUlCX1NZTkNPT0tJRVNSRUNWKSwKKwlTTk1QX01JQl9JVEVNKCJTeW5jb29raWVzRmFpbGVkIiwgTElOVVhfTUlCX1NZTkNPT0tJRVNGQUlMRUQpLAorCVNOTVBfTUlCX0lURU0oIkVtYnJ5b25pY1JzdHMiLCBMSU5VWF9NSUJfRU1CUllPTklDUlNUUyksCisJU05NUF9NSUJfSVRFTSgiUHJ1bmVDYWxsZWQiLCBMSU5VWF9NSUJfUFJVTkVDQUxMRUQpLAorCVNOTVBfTUlCX0lURU0oIlJjdlBydW5lZCIsIExJTlVYX01JQl9SQ1ZQUlVORUQpLAorCVNOTVBfTUlCX0lURU0oIk9mb1BydW5lZCIsIExJTlVYX01JQl9PRk9QUlVORUQpLAorCVNOTVBfTUlCX0lURU0oIk91dE9mV2luZG93SWNtcHMiLCBMSU5VWF9NSUJfT1VUT0ZXSU5ET1dJQ01QUyksCisJU05NUF9NSUJfSVRFTSgiTG9ja0Ryb3BwZWRJY21wcyIsIExJTlVYX01JQl9MT0NLRFJPUFBFRElDTVBTKSwKKwlTTk1QX01JQl9JVEVNKCJBcnBGaWx0ZXIiLCBMSU5VWF9NSUJfQVJQRklMVEVSKSwKKwlTTk1QX01JQl9JVEVNKCJUVyIsIExJTlVYX01JQl9USU1FV0FJVEVEKSwKKwlTTk1QX01JQl9JVEVNKCJUV1JlY3ljbGVkIiwgTElOVVhfTUlCX1RJTUVXQUlUUkVDWUNMRUQpLAorCVNOTVBfTUlCX0lURU0oIlRXS2lsbGVkIiwgTElOVVhfTUlCX1RJTUVXQUlUS0lMTEVEKSwKKwlTTk1QX01JQl9JVEVNKCJQQVdTUGFzc2l2ZSIsIExJTlVYX01JQl9QQVdTUEFTU0lWRVJFSkVDVEVEKSwKKwlTTk1QX01JQl9JVEVNKCJQQVdTQWN0aXZlIiwgTElOVVhfTUlCX1BBV1NBQ1RJVkVSRUpFQ1RFRCksCisJU05NUF9NSUJfSVRFTSgiUEFXU0VzdGFiIiwgTElOVVhfTUlCX1BBV1NFU1RBQlJFSkVDVEVEKSwKKwlTTk1QX01JQl9JVEVNKCJEZWxheWVkQUNLcyIsIExJTlVYX01JQl9ERUxBWUVEQUNLUyksCisJU05NUF9NSUJfSVRFTSgiRGVsYXllZEFDS0xvY2tlZCIsIExJTlVYX01JQl9ERUxBWUVEQUNLTE9DS0VEKSwKKwlTTk1QX01JQl9JVEVNKCJEZWxheWVkQUNLTG9zdCIsIExJTlVYX01JQl9ERUxBWUVEQUNLTE9TVCksCisJU05NUF9NSUJfSVRFTSgiTGlzdGVuT3ZlcmZsb3dzIiwgTElOVVhfTUlCX0xJU1RFTk9WRVJGTE9XUyksCisJU05NUF9NSUJfSVRFTSgiTGlzdGVuRHJvcHMiLCBMSU5VWF9NSUJfTElTVEVORFJPUFMpLAorCVNOTVBfTUlCX0lURU0oIlRDUFByZXF1ZXVlZCIsIExJTlVYX01JQl9UQ1BQUkVRVUVVRUQpLAorCVNOTVBfTUlCX0lURU0oIlRDUERpcmVjdENvcHlGcm9tQmFja2xvZyIsIExJTlVYX01JQl9UQ1BESVJFQ1RDT1BZRlJPTUJBQ0tMT0cpLAorCVNOTVBfTUlCX0lURU0oIlRDUERpcmVjdENvcHlGcm9tUHJlcXVldWUiLCBMSU5VWF9NSUJfVENQRElSRUNUQ09QWUZST01QUkVRVUVVRSksCisJU05NUF9NSUJfSVRFTSgiVENQUHJlcXVldWVEcm9wcGVkIiwgTElOVVhfTUlCX1RDUFBSRVFVRVVFRFJPUFBFRCksCisJU05NUF9NSUJfSVRFTSgiVENQSFBIaXRzIiwgTElOVVhfTUlCX1RDUEhQSElUUyksCisJU05NUF9NSUJfSVRFTSgiVENQSFBIaXRzVG9Vc2VyIiwgTElOVVhfTUlCX1RDUEhQSElUU1RPVVNFUiksCisJU05NUF9NSUJfSVRFTSgiVENQUHVyZUFja3MiLCBMSU5VWF9NSUJfVENQUFVSRUFDS1MpLAorCVNOTVBfTUlCX0lURU0oIlRDUEhQQWNrcyIsIExJTlVYX01JQl9UQ1BIUEFDS1MpLAorCVNOTVBfTUlCX0lURU0oIlRDUFJlbm9SZWNvdmVyeSIsIExJTlVYX01JQl9UQ1BSRU5PUkVDT1ZFUlkpLAorCVNOTVBfTUlCX0lURU0oIlRDUFNhY2tSZWNvdmVyeSIsIExJTlVYX01JQl9UQ1BTQUNLUkVDT1ZFUlkpLAorCVNOTVBfTUlCX0lURU0oIlRDUFNBQ0tSZW5lZ2luZyIsIExJTlVYX01JQl9UQ1BTQUNLUkVORUdJTkcpLAorCVNOTVBfTUlCX0lURU0oIlRDUEZBQ0tSZW9yZGVyIiwgTElOVVhfTUlCX1RDUEZBQ0tSRU9SREVSKSwKKwlTTk1QX01JQl9JVEVNKCJUQ1BTQUNLUmVvcmRlciIsIExJTlVYX01JQl9UQ1BTQUNLUkVPUkRFUiksCisJU05NUF9NSUJfSVRFTSgiVENQUmVub1Jlb3JkZXIiLCBMSU5VWF9NSUJfVENQUkVOT1JFT1JERVIpLAorCVNOTVBfTUlCX0lURU0oIlRDUFRTUmVvcmRlciIsIExJTlVYX01JQl9UQ1BUU1JFT1JERVIpLAorCVNOTVBfTUlCX0lURU0oIlRDUEZ1bGxVbmRvIiwgTElOVVhfTUlCX1RDUEZVTExVTkRPKSwKKwlTTk1QX01JQl9JVEVNKCJUQ1BQYXJ0aWFsVW5kbyIsIExJTlVYX01JQl9UQ1BQQVJUSUFMVU5ETyksCisJU05NUF9NSUJfSVRFTSgiVENQRFNBQ0tVbmRvIiwgTElOVVhfTUlCX1RDUERTQUNLVU5ETyksCisJU05NUF9NSUJfSVRFTSgiVENQTG9zc1VuZG8iLCBMSU5VWF9NSUJfVENQTE9TU1VORE8pLAorCVNOTVBfTUlCX0lURU0oIlRDUExvc3MiLCBMSU5VWF9NSUJfVENQTE9TUyksCisJU05NUF9NSUJfSVRFTSgiVENQTG9zdFJldHJhbnNtaXQiLCBMSU5VWF9NSUJfVENQTE9TVFJFVFJBTlNNSVQpLAorCVNOTVBfTUlCX0lURU0oIlRDUFJlbm9GYWlsdXJlcyIsIExJTlVYX01JQl9UQ1BSRU5PRkFJTFVSRVMpLAorCVNOTVBfTUlCX0lURU0oIlRDUFNhY2tGYWlsdXJlcyIsIExJTlVYX01JQl9UQ1BTQUNLRkFJTFVSRVMpLAorCVNOTVBfTUlCX0lURU0oIlRDUExvc3NGYWlsdXJlcyIsIExJTlVYX01JQl9UQ1BMT1NTRkFJTFVSRVMpLAorCVNOTVBfTUlCX0lURU0oIlRDUEZhc3RSZXRyYW5zIiwgTElOVVhfTUlCX1RDUEZBU1RSRVRSQU5TKSwKKwlTTk1QX01JQl9JVEVNKCJUQ1BGb3J3YXJkUmV0cmFucyIsIExJTlVYX01JQl9UQ1BGT1JXQVJEUkVUUkFOUyksCisJU05NUF9NSUJfSVRFTSgiVENQU2xvd1N0YXJ0UmV0cmFucyIsIExJTlVYX01JQl9UQ1BTTE9XU1RBUlRSRVRSQU5TKSwKKwlTTk1QX01JQl9JVEVNKCJUQ1BUaW1lb3V0cyIsIExJTlVYX01JQl9UQ1BUSU1FT1VUUyksCisJU05NUF9NSUJfSVRFTSgiVENQUmVub1JlY292ZXJ5RmFpbCIsIExJTlVYX01JQl9UQ1BSRU5PUkVDT1ZFUllGQUlMKSwKKwlTTk1QX01JQl9JVEVNKCJUQ1BTYWNrUmVjb3ZlcnlGYWlsIiwgTElOVVhfTUlCX1RDUFNBQ0tSRUNPVkVSWUZBSUwpLAorCVNOTVBfTUlCX0lURU0oIlRDUFNjaGVkdWxlckZhaWxlZCIsIExJTlVYX01JQl9UQ1BTQ0hFRFVMRVJGQUlMRUQpLAorCVNOTVBfTUlCX0lURU0oIlRDUFJjdkNvbGxhcHNlZCIsIExJTlVYX01JQl9UQ1BSQ1ZDT0xMQVBTRUQpLAorCVNOTVBfTUlCX0lURU0oIlRDUERTQUNLT2xkU2VudCIsIExJTlVYX01JQl9UQ1BEU0FDS09MRFNFTlQpLAorCVNOTVBfTUlCX0lURU0oIlRDUERTQUNLT2ZvU2VudCIsIExJTlVYX01JQl9UQ1BEU0FDS09GT1NFTlQpLAorCVNOTVBfTUlCX0lURU0oIlRDUERTQUNLUmVjdiIsIExJTlVYX01JQl9UQ1BEU0FDS1JFQ1YpLAorCVNOTVBfTUlCX0lURU0oIlRDUERTQUNLT2ZvUmVjdiIsIExJTlVYX01JQl9UQ1BEU0FDS09GT1JFQ1YpLAorCVNOTVBfTUlCX0lURU0oIlRDUEFib3J0T25TeW4iLCBMSU5VWF9NSUJfVENQQUJPUlRPTlNZTiksCisJU05NUF9NSUJfSVRFTSgiVENQQWJvcnRPbkRhdGEiLCBMSU5VWF9NSUJfVENQQUJPUlRPTkRBVEEpLAorCVNOTVBfTUlCX0lURU0oIlRDUEFib3J0T25DbG9zZSIsIExJTlVYX01JQl9UQ1BBQk9SVE9OQ0xPU0UpLAorCVNOTVBfTUlCX0lURU0oIlRDUEFib3J0T25NZW1vcnkiLCBMSU5VWF9NSUJfVENQQUJPUlRPTk1FTU9SWSksCisJU05NUF9NSUJfSVRFTSgiVENQQWJvcnRPblRpbWVvdXQiLCBMSU5VWF9NSUJfVENQQUJPUlRPTlRJTUVPVVQpLAorCVNOTVBfTUlCX0lURU0oIlRDUEFib3J0T25MaW5nZXIiLCBMSU5VWF9NSUJfVENQQUJPUlRPTkxJTkdFUiksCisJU05NUF9NSUJfSVRFTSgiVENQQWJvcnRGYWlsZWQiLCBMSU5VWF9NSUJfVENQQUJPUlRGQUlMRUQpLAorCVNOTVBfTUlCX0lURU0oIlRDUE1lbW9yeVByZXNzdXJlcyIsIExJTlVYX01JQl9UQ1BNRU1PUllQUkVTU1VSRVMpLAorCVNOTVBfTUlCX1NFTlRJTkVMCit9OworCisvKgorICoJQ2FsbGVkIGZyb20gdGhlIFBST0NmcyBtb2R1bGUuIFRoaXMgb3V0cHV0cyAvcHJvYy9uZXQvc25tcC4KKyAqLworc3RhdGljIGludCBzbm1wX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWludCBpOworCisJc2VxX3B1dHMoc2VxLCAiSXA6IEZvcndhcmRpbmcgRGVmYXVsdFRUTCIpOworCisJZm9yIChpID0gMDsgc25tcDRfaXBzdGF0c19saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCQlzZXFfcHJpbnRmKHNlcSwgIiAlcyIsIHNubXA0X2lwc3RhdHNfbGlzdFtpXS5uYW1lKTsKKworCXNlcV9wcmludGYoc2VxLCAiXG5JcDogJWQgJWQiLAorCQkJaXB2NF9kZXZjb25mLmZvcndhcmRpbmcgPyAxIDogMiwgc3lzY3RsX2lwX2RlZmF1bHRfdHRsKTsKKworCWZvciAoaSA9IDA7IHNubXA0X2lwc3RhdHNfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKKwkJc2VxX3ByaW50ZihzZXEsICIgJWx1IiwKKwkJCSAgIGZvbGRfZmllbGQoKHZvaWQgKiopIGlwX3N0YXRpc3RpY3MsIAorCQkJCSAgICAgIHNubXA0X2lwc3RhdHNfbGlzdFtpXS5lbnRyeSkpOworCisJc2VxX3B1dHMoc2VxLCAiXG5JY21wOiIpOworCWZvciAoaSA9IDA7IHNubXA0X2ljbXBfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKKwkJc2VxX3ByaW50ZihzZXEsICIgJXMiLCBzbm1wNF9pY21wX2xpc3RbaV0ubmFtZSk7CisKKwlzZXFfcHV0cyhzZXEsICJcbkljbXA6Iik7CisJZm9yIChpID0gMDsgc25tcDRfaWNtcF9saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCQlzZXFfcHJpbnRmKHNlcSwgIiAlbHUiLAorCQkJICAgZm9sZF9maWVsZCgodm9pZCAqKikgaWNtcF9zdGF0aXN0aWNzLCAKKwkJCQkgICAgICBzbm1wNF9pY21wX2xpc3RbaV0uZW50cnkpKTsKKworCXNlcV9wdXRzKHNlcSwgIlxuVGNwOiIpOworCWZvciAoaSA9IDA7IHNubXA0X3RjcF9saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCQlzZXFfcHJpbnRmKHNlcSwgIiAlcyIsIHNubXA0X3RjcF9saXN0W2ldLm5hbWUpOworCisJc2VxX3B1dHMoc2VxLCAiXG5UY3A6Iik7CisJZm9yIChpID0gMDsgc25tcDRfdGNwX2xpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKKwkJLyogTWF4Q29ubiBmaWVsZCBpcyBzaWduZWQsIFJGQyAyMDEyICovCisJCWlmIChzbm1wNF90Y3BfbGlzdFtpXS5lbnRyeSA9PSBUQ1BfTUlCX01BWENPTk4pCisJCQlzZXFfcHJpbnRmKHNlcSwgIiAlbGQiLAorCQkJCSAgIGZvbGRfZmllbGQoKHZvaWQgKiopIHRjcF9zdGF0aXN0aWNzLCAKKwkJCQkJICAgICAgc25tcDRfdGNwX2xpc3RbaV0uZW50cnkpKTsKKwkJZWxzZQorCQkJc2VxX3ByaW50ZihzZXEsICIgJWx1IiwKKwkJCQkgICBmb2xkX2ZpZWxkKCh2b2lkICoqKSB0Y3Bfc3RhdGlzdGljcywKKwkJCQkJICAgICAgc25tcDRfdGNwX2xpc3RbaV0uZW50cnkpKTsKKwl9CisKKwlzZXFfcHV0cyhzZXEsICJcblVkcDoiKTsKKwlmb3IgKGkgPSAwOyBzbm1wNF91ZHBfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKKwkJc2VxX3ByaW50ZihzZXEsICIgJXMiLCBzbm1wNF91ZHBfbGlzdFtpXS5uYW1lKTsKKworCXNlcV9wdXRzKHNlcSwgIlxuVWRwOiIpOworCWZvciAoaSA9IDA7IHNubXA0X3VkcF9saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCQlzZXFfcHJpbnRmKHNlcSwgIiAlbHUiLAorCQkJICAgZm9sZF9maWVsZCgodm9pZCAqKikgdWRwX3N0YXRpc3RpY3MsIAorCQkJCSAgICAgIHNubXA0X3VkcF9saXN0W2ldLmVudHJ5KSk7CisKKwlzZXFfcHV0YyhzZXEsICdcbicpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNubXBfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNubXBfc2VxX3Nob3csIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzbm1wX3NlcV9mb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkub3BlbgkgPSBzbm1wX3NlcV9vcGVuLAorCS5yZWFkCSA9IHNlcV9yZWFkLAorCS5sbHNlZWsJID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCisvKgorICoJT3V0cHV0IC9wcm9jL25ldC9uZXRzdGF0CisgKi8KK3N0YXRpYyBpbnQgbmV0c3RhdF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpbnQgaTsKKworCXNlcV9wdXRzKHNlcSwgIlRjcEV4dDoiKTsKKwlmb3IgKGkgPSAwOyBzbm1wNF9uZXRfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKKwkJc2VxX3ByaW50ZihzZXEsICIgJXMiLCBzbm1wNF9uZXRfbGlzdFtpXS5uYW1lKTsKKworCXNlcV9wdXRzKHNlcSwgIlxuVGNwRXh0OiIpOworCWZvciAoaSA9IDA7IHNubXA0X25ldF9saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCQlzZXFfcHJpbnRmKHNlcSwgIiAlbHUiLAorCQkJICAgZm9sZF9maWVsZCgodm9pZCAqKikgbmV0X3N0YXRpc3RpY3MsIAorCQkJCSAgICAgIHNubXA0X25ldF9saXN0W2ldLmVudHJ5KSk7CisKKwlzZXFfcHV0YyhzZXEsICdcbicpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5ldHN0YXRfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIG5ldHN0YXRfc2VxX3Nob3csIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBuZXRzdGF0X3NlcV9mb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkub3BlbgkgPSBuZXRzdGF0X3NlcV9vcGVuLAorCS5yZWFkCSA9IHNlcV9yZWFkLAorCS5sbHNlZWsJID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitpbnQgX19pbml0IGlwX21pc2NfcHJvY19pbml0KHZvaWQpCit7CisJaW50IHJjID0gMDsKKworCWlmICghcHJvY19uZXRfZm9wc19jcmVhdGUoIm5ldHN0YXQiLCBTX0lSVUdPLCAmbmV0c3RhdF9zZXFfZm9wcykpCisJCWdvdG8gb3V0X25ldHN0YXQ7CisKKwlpZiAoIXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJzbm1wIiwgU19JUlVHTywgJnNubXBfc2VxX2ZvcHMpKQorCQlnb3RvIG91dF9zbm1wOworCisJaWYgKCFwcm9jX25ldF9mb3BzX2NyZWF0ZSgic29ja3N0YXQiLCBTX0lSVUdPLCAmc29ja3N0YXRfc2VxX2ZvcHMpKQorCQlnb3RvIG91dF9zb2Nrc3RhdDsKK291dDoKKwlyZXR1cm4gcmM7CitvdXRfc29ja3N0YXQ6CisJcHJvY19uZXRfcmVtb3ZlKCJzbm1wIik7CitvdXRfc25tcDoKKwlwcm9jX25ldF9yZW1vdmUoIm5ldHN0YXQiKTsKK291dF9uZXRzdGF0OgorCXJjID0gLUVOT01FTTsKKwlnb3RvIG91dDsKK30KKwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcHJvdG9jb2wuYyBiL25ldC9pcHY0L3Byb3RvY29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBhNTg3YwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L3Byb3RvY29sLmMKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJSU5FVCBwcm90b2NvbCBkaXNwYXRjaCB0YWJsZXMuCisgKgorICogVmVyc2lvbjoJJElkOiBwcm90b2NvbC5jLHYgMS4xNCAyMDAxLzA1LzE4IDAyOjI1OjQ5IGRhdmVtIEV4cCAkCisgKgorICogQXV0aG9yczoJUm9zcyBCaXJvLCA8YmlyN0BsZWxhbmQuU3RhbmZvcmQuRWR1PgorICoJCUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoKKyAqIEZpeGVzOgorICoJCUFsYW4gQ294CTogQWhhaCEgdWRwIGljbXAgZXJyb3JzIGRvbid0IHdvcmsgYmVjYXVzZQorICoJCQkJICB1ZHBfZXJyIGlzIG5ldmVyIGNhbGxlZCEKKyAqCQlBbGFuIENveAk6IEFkZGVkIG5ldyBmaWVsZHMgZm9yIGluaXQgYW5kIHJlYWR5IGZvcgorICoJCQkJICBwcm9wZXIgZnJhZ21lbnRhdGlvbiAoX05PXyA0SyBsaW1pdHMhKQorICoJCVJpY2hhcmQgQ29sZWxsYQk6IEhhbmcgb24gaGFzaCBjb2xsaXNpb24KKyAqCQlWaW5jZSBMYXZpYW5vCTogTW9kaWZpZWQgaW5ldF9kZWxfcHJvdG9jb2woKSB0byBjb3JyZWN0bHkKKyAqCQkJCSAgbWFpbnRhaW4gY29weSBiaXQuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9pY21wLmg+CisjaW5jbHVkZSA8bmV0L3VkcC5oPgorI2luY2x1ZGUgPG5ldC9pcGlwLmg+CisjaW5jbHVkZSA8bGludXgvaWdtcC5oPgorCitzdHJ1Y3QgbmV0X3Byb3RvY29sICppbmV0X3Byb3Rvc1tNQVhfSU5FVF9QUk9UT1NdOworc3RhdGljIERFRklORV9TUElOTE9DSyhpbmV0X3Byb3RvX2xvY2spOworCisvKgorICoJQWRkIGEgcHJvdG9jb2wgaGFuZGxlciB0byB0aGUgaGFzaCB0YWJsZXMKKyAqLworCitpbnQgaW5ldF9hZGRfcHJvdG9jb2woc3RydWN0IG5ldF9wcm90b2NvbCAqcHJvdCwgdW5zaWduZWQgY2hhciBwcm90b2NvbCkKK3sKKwlpbnQgaGFzaCwgcmV0OworCisJaGFzaCA9IHByb3RvY29sICYgKE1BWF9JTkVUX1BST1RPUyAtIDEpOworCisJc3Bpbl9sb2NrX2JoKCZpbmV0X3Byb3RvX2xvY2spOworCWlmIChpbmV0X3Byb3Rvc1toYXNoXSkgeworCQlyZXQgPSAtMTsKKwl9IGVsc2UgeworCQlpbmV0X3Byb3Rvc1toYXNoXSA9IHByb3Q7CisJCXJldCA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZpbmV0X3Byb3RvX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqCVJlbW92ZSBhIHByb3RvY29sIGZyb20gdGhlIGhhc2ggdGFibGVzLgorICovCisgCitpbnQgaW5ldF9kZWxfcHJvdG9jb2woc3RydWN0IG5ldF9wcm90b2NvbCAqcHJvdCwgdW5zaWduZWQgY2hhciBwcm90b2NvbCkKK3sKKwlpbnQgaGFzaCwgcmV0OworCisJaGFzaCA9IHByb3RvY29sICYgKE1BWF9JTkVUX1BST1RPUyAtIDEpOworCisJc3Bpbl9sb2NrX2JoKCZpbmV0X3Byb3RvX2xvY2spOworCWlmIChpbmV0X3Byb3Rvc1toYXNoXSA9PSBwcm90KSB7CisJCWluZXRfcHJvdG9zW2hhc2hdID0gTlVMTDsKKwkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQlyZXQgPSAtMTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmluZXRfcHJvdG9fbG9jayk7CisKKwlzeW5jaHJvbml6ZV9uZXQoKTsKKworCXJldHVybiByZXQ7Cit9CisKK0VYUE9SVF9TWU1CT0woaW5ldF9hZGRfcHJvdG9jb2wpOworRVhQT1JUX1NZTUJPTChpbmV0X2RlbF9wcm90b2NvbCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9yYXcuYyBiL25ldC9pcHY0L3Jhdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNjI0YTMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9yYXcuYwpAQCAtMCwwICsxLDg4OCBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlSQVcgLSBpbXBsZW1lbnRhdGlvbiBvZiBJUCAicmF3IiBzb2NrZXRzLgorICoKKyAqIFZlcnNpb246CSRJZDogcmF3LmMsdiAxLjY0IDIwMDIvMDIvMDEgMjI6MDE6MDQgZGF2ZW0gRXhwICQKKyAqCisgKiBBdXRob3JzOglSb3NzIEJpcm8sIDxiaXI3QGxlbGFuZC5TdGFuZm9yZC5FZHU+CisgKgkJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgorICogRml4ZXM6CisgKgkJQWxhbiBDb3gJOgl2ZXJpZnlfYXJlYSgpIGZpeGVkIHVwCisgKgkJQWxhbiBDb3gJOglJQ01QIGVycm9yIGhhbmRsaW5nCisgKgkJQWxhbiBDb3gJOglFTVNHU0laRSBpZiB5b3Ugc2VuZCB0b28gYmlnIGEgcGFja2V0CisgKgkJQWxhbiBDb3gJOiAJTm93IHVzZXMgZ2VuZXJpYyBkYXRhZ3JhbXMgYW5kIHNoYXJlZAorICoJCQkJCXNrYnVmZiBsaWJyYXJ5LiBObyBtb3JlIHBlZWsgY3Jhc2hlcywKKyAqCQkJCQlubyBtb3JlIGJhY2tsb2dzCisgKgkJQWxhbiBDb3gJOglDaGVja3Mgc2stPmJyb2FkY2FzdC4KKyAqCQlBbGFuIENveAk6CVVzZXMgc2tiX2ZyZWVfZGF0YWdyYW0vc2tiX2NvcHlfZGF0YWdyYW0KKyAqCQlBbGFuIENveAk6CVJhdyBwYXNzZXMgaXAgb3B0aW9ucyB0b28KKyAqCQlBbGFuIENveAk6CVNldHNvY2tldG9wdCBhZGRlZAorICoJCUFsYW4gQ294CToJRml4ZWQgZXJyb3IgcmV0dXJuIGZvciBicm9hZGNhc3RzCisgKgkJQWxhbiBDb3gJOglSZW1vdmVkIHdha2VfdXAgY2FsbHMKKyAqCQlBbGFuIENveAk6CVVzZSB0dGwvdG9zCisgKgkJQWxhbiBDb3gJOglDbGVhbmVkIHVwIG9sZCBkZWJ1Z2dpbmcKKyAqCQlBbGFuIENveAk6CVVzZSBuZXcga2VybmVsIHNpZGUgYWRkcmVzc2VzCisgKglBcm50IEd1bGJyYW5kc2VuCToJRml4ZWQgTVNHX0RPTlRST1VURSBpbiByYXcgc29ja2V0cy4KKyAqCQlBbGFuIENveAk6CUJTRCBzdHlsZSBSQVcgc29ja2V0IGRlbXVsdGlwbGV4aW5nLgorICoJCUFsYW4gQ294CToJQmVnaW5uaW5ncyBvZiBtcm91dGVkIHN1cHBvcnQuCisgKgkJQWxhbiBDb3gJOglBZGRlZCBJUF9IRFJJTkNMIG9wdGlvbi4KKyAqCQlBbGFuIENveAk6CVNraXAgYnJvYWRjYXN0IGNoZWNrIGlmIEJTRGlzbSBzZXQuCisgKgkJRGF2aWQgUy4gTWlsbGVyCToJTmV3IHNvY2tldCBsb29rdXAgYXJjaGl0ZWN0dXJlLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisgCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+IAorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvbXJvdXRlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5fcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9kc3QuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L2ljbXAuaD4KKyNpbmNsdWRlIDxuZXQvdWRwLmg+CisjaW5jbHVkZSA8bmV0L3Jhdy5oPgorI2luY2x1ZGUgPG5ldC9zbm1wLmg+CisjaW5jbHVkZSA8bmV0L2luZXRfY29tbW9uLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bmV0L3hmcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorCitzdHJ1Y3QgaGxpc3RfaGVhZCByYXdfdjRfaHRhYmxlW1JBV1Y0X0hUQUJMRV9TSVpFXTsKK0RFRklORV9SV0xPQ0socmF3X3Y0X2xvY2spOworCitzdGF0aWMgdm9pZCByYXdfdjRfaGFzaChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSAmcmF3X3Y0X2h0YWJsZVtpbmV0X3NrKHNrKS0+bnVtICYKKwkJCQkJCSAoUkFXVjRfSFRBQkxFX1NJWkUgLSAxKV07CisKKwl3cml0ZV9sb2NrX2JoKCZyYXdfdjRfbG9jayk7CisJc2tfYWRkX25vZGUoc2ssIGhlYWQpOworCXNvY2tfcHJvdF9pbmNfdXNlKHNrLT5za19wcm90KTsKKwl3cml0ZV91bmxvY2tfYmgoJnJhd192NF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgcmF3X3Y0X3VuaGFzaChzdHJ1Y3Qgc29jayAqc2spCit7CisgCXdyaXRlX2xvY2tfYmgoJnJhd192NF9sb2NrKTsKKwlpZiAoc2tfZGVsX25vZGVfaW5pdChzaykpCisJCXNvY2tfcHJvdF9kZWNfdXNlKHNrLT5za19wcm90KTsKKwl3cml0ZV91bmxvY2tfYmgoJnJhd192NF9sb2NrKTsKK30KKworc3RydWN0IHNvY2sgKl9fcmF3X3Y0X2xvb2t1cChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIHNob3J0IG51bSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyByYWRkciwgdW5zaWduZWQgbG9uZyBsYWRkciwKKwkJCSAgICAgaW50IGRpZikKK3sKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCXNrX2Zvcl9lYWNoX2Zyb20oc2ssIG5vZGUpIHsKKwkJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCisJCWlmIChpbmV0LT5udW0gPT0gbnVtIAkJCQkJJiYKKwkJICAgICEoaW5ldC0+ZGFkZHIgJiYgaW5ldC0+ZGFkZHIgIT0gcmFkZHIpIAkJJiYKKwkJICAgICEoaW5ldC0+cmN2X3NhZGRyICYmIGluZXQtPnJjdl9zYWRkciAhPSBsYWRkcikJJiYKKwkJICAgICEoc2stPnNrX2JvdW5kX2Rldl9pZiAmJiBzay0+c2tfYm91bmRfZGV2X2lmICE9IGRpZikpCisJCQlnb3RvIGZvdW5kOyAvKiBnb3RjaGEgKi8KKwl9CisJc2sgPSBOVUxMOworZm91bmQ6CisJcmV0dXJuIHNrOworfQorCisvKgorICoJMCAtIGRlbGl2ZXIKKyAqCTEgLSBibG9jaworICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgaWNtcF9maWx0ZXIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCB0eXBlOworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpY21waGRyKSkpCisJCXJldHVybiAxOworCisJdHlwZSA9IHNrYi0+aC5pY21waC0+dHlwZTsKKwlpZiAodHlwZSA8IDMyKSB7CisJCV9fdTMyIGRhdGEgPSByYXdfc2soc2spLT5maWx0ZXIuZGF0YTsKKworCQlyZXR1cm4gKCgxIDw8IHR5cGUpICYgZGF0YSkgIT0gMDsKKwl9CisKKwkvKiBEbyBub3QgYmxvY2sgdW5rbm93biBJQ01QIHR5cGVzICovCisJcmV0dXJuIDA7Cit9CisKKy8qIElQIGlucHV0IHByb2Nlc3NpbmcgY29tZXMgaGVyZSBmb3IgUkFXIHNvY2tldCBkZWxpdmVyeS4KKyAqIENhbGxlciBvd25zIFNLQiwgc28gd2UgbXVzdCBtYWtlIGNsb25lcy4KKyAqCisgKiBSRkMgMTEyMjogU0hPVUxEIHBhc3MgVE9TIHZhbHVlIHVwIHRvIHRoZSB0cmFuc3BvcnQgbGF5ZXIuCisgKiAtPiBJdCBkb2VzLiBBbmQgbm90IG9ubHkgVE9TLCBidXQgYWxsIElQIGhlYWRlci4KKyAqLwordm9pZCByYXdfdjRfaW5wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwaGRyICppcGgsIGludCBoYXNoKQoreworCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKKworCXJlYWRfbG9jaygmcmF3X3Y0X2xvY2spOworCWhlYWQgPSAmcmF3X3Y0X2h0YWJsZVtoYXNoXTsKKwlpZiAoaGxpc3RfZW1wdHkoaGVhZCkpCisJCWdvdG8gb3V0OworCXNrID0gX19yYXdfdjRfbG9va3VwKF9fc2tfaGVhZChoZWFkKSwgaXBoLT5wcm90b2NvbCwKKwkJCSAgICAgaXBoLT5zYWRkciwgaXBoLT5kYWRkciwKKwkJCSAgICAgc2tiLT5kZXYtPmlmaW5kZXgpOworCisJd2hpbGUgKHNrKSB7CisJCWlmIChpcGgtPnByb3RvY29sICE9IElQUFJPVE9fSUNNUCB8fCAhaWNtcF9maWx0ZXIoc2ssIHNrYikpIHsKKwkJCXN0cnVjdCBza19idWZmICpjbG9uZSA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCisJCQkvKiBOb3QgcmVsZWFzaW5nIGhhc2ggdGFibGUhICovCisJCQlpZiAoY2xvbmUpCisJCQkJcmF3X3JjdihzaywgY2xvbmUpOworCQl9CisJCXNrID0gX19yYXdfdjRfbG9va3VwKHNrX25leHQoc2spLCBpcGgtPnByb3RvY29sLAorCQkJCSAgICAgaXBoLT5zYWRkciwgaXBoLT5kYWRkciwKKwkJCQkgICAgIHNrYi0+ZGV2LT5pZmluZGV4KTsKKwl9CitvdXQ6CisJcmVhZF91bmxvY2soJnJhd192NF9sb2NrKTsKK30KKwordm9pZCByYXdfZXJyIChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIHUzMiBpbmZvKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlpbnQgdHlwZSA9IHNrYi0+aC5pY21waC0+dHlwZTsKKwlpbnQgY29kZSA9IHNrYi0+aC5pY21waC0+Y29kZTsKKwlpbnQgZXJyID0gMDsKKwlpbnQgaGFyZGVyciA9IDA7CisKKwkvKiBSZXBvcnQgZXJyb3Igb24gcmF3IHNvY2tldCwgaWY6CisJICAgMS4gVXNlciByZXF1ZXN0ZWQgaXBfcmVjdmVyci4KKwkgICAyLiBTb2NrZXQgaXMgY29ubmVjdGVkIChvdGhlcndpc2UgdGhlIGVycm9yIGluZGljYXRpb24KKwkgICAgICBpcyB1c2VsZXNzIHdpdGhvdXQgaXBfcmVjdmVyciBhbmQgZXJyb3IgaXMgaGFyZC4KKwkgKi8KKwlpZiAoIWluZXQtPnJlY3ZlcnIgJiYgc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkKKwkJcmV0dXJuOworCisJc3dpdGNoICh0eXBlKSB7CisJZGVmYXVsdDoKKwljYXNlIElDTVBfVElNRV9FWENFRURFRDoKKwkJZXJyID0gRUhPU1RVTlJFQUNIOworCQlicmVhazsKKwljYXNlIElDTVBfU09VUkNFX1FVRU5DSDoKKwkJcmV0dXJuOworCWNhc2UgSUNNUF9QQVJBTUVURVJQUk9COgorCQllcnIgPSBFUFJPVE87CisJCWhhcmRlcnIgPSAxOworCQlicmVhazsKKwljYXNlIElDTVBfREVTVF9VTlJFQUNIOgorCQllcnIgPSBFSE9TVFVOUkVBQ0g7CisJCWlmIChjb2RlID4gTlJfSUNNUF9VTlJFQUNIKQorCQkJYnJlYWs7CisJCWVyciA9IGljbXBfZXJyX2NvbnZlcnRbY29kZV0uZXJybm87CisJCWhhcmRlcnIgPSBpY21wX2Vycl9jb252ZXJ0W2NvZGVdLmZhdGFsOworCQlpZiAoY29kZSA9PSBJQ01QX0ZSQUdfTkVFREVEKSB7CisJCQloYXJkZXJyID0gaW5ldC0+cG10dWRpc2MgIT0gSVBfUE1UVURJU0NfRE9OVDsKKwkJCWVyciA9IEVNU0dTSVpFOworCQl9CisJfQorCisJaWYgKGluZXQtPnJlY3ZlcnIpIHsKKwkJc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyKilza2ItPmRhdGE7CisJCXU4ICpwYXlsb2FkID0gc2tiLT5kYXRhICsgKGlwaC0+aWhsIDw8IDIpOworCisJCWlmIChpbmV0LT5oZHJpbmNsKQorCQkJcGF5bG9hZCA9IHNrYi0+ZGF0YTsKKwkJaXBfaWNtcF9lcnJvcihzaywgc2tiLCBlcnIsIDAsIGluZm8sIHBheWxvYWQpOworCX0KKworCWlmIChpbmV0LT5yZWN2ZXJyIHx8IGhhcmRlcnIpIHsKKwkJc2stPnNrX2VyciA9IGVycjsKKwkJc2stPnNrX2Vycm9yX3JlcG9ydChzayk7CisJfQorfQorCitzdGF0aWMgaW50IHJhd19yY3Zfc2tiKHN0cnVjdCBzb2NrICogc2ssIHN0cnVjdCBza19idWZmICogc2tiKQoreworCS8qIENoYXJnZSBpdCB0byB0aGUgc29ja2V0LiAqLworCQorCWlmIChzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYikgPCAwKSB7CisJCS8qIEZJWE1FOiBpbmNyZW1lbnQgYSByYXcgZHJvcHMgY291bnRlciBoZXJlICovCisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gTkVUX1JYX0RST1A7CisJfQorCisJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOworfQorCitpbnQgcmF3X3JjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKCF4ZnJtNF9wb2xpY3lfY2hlY2soc2ssIFhGUk1fUE9MSUNZX0lOLCBza2IpKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gTkVUX1JYX0RST1A7CisJfQorCisJc2tiX3B1c2goc2tiLCBza2ItPmRhdGEgLSBza2ItPm5oLnJhdyk7CisKKwlyYXdfcmN2X3NrYihzaywgc2tiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYXdfc2VuZF9oZHJpbmMoc3RydWN0IHNvY2sgKnNrLCB2b2lkICpmcm9tLCBpbnQgbGVuZ3RoLAorCQkJc3RydWN0IHJ0YWJsZSAqcnQsIAorCQkJdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlpbnQgaGhfbGVuOworCXN0cnVjdCBpcGhkciAqaXBoOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGVycjsKKworCWlmIChsZW5ndGggPiBydC0+dS5kc3QuZGV2LT5tdHUpIHsKKwkJaXBfbG9jYWxfZXJyb3Ioc2ssIEVNU0dTSVpFLCBydC0+cnRfZHN0LCBpbmV0LT5kcG9ydCwKKwkJCSAgICAgICBydC0+dS5kc3QuZGV2LT5tdHUpOworCQlyZXR1cm4gLUVNU0dTSVpFOworCX0KKwlpZiAoZmxhZ3MmTVNHX1BST0JFKQorCQlnb3RvIG91dDsKKworCWhoX2xlbiA9IExMX1JFU0VSVkVEX1NQQUNFKHJ0LT51LmRzdC5kZXYpOworCisJc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywgbGVuZ3RoK2hoX2xlbisxNSwKKwkJCQkgIGZsYWdzJk1TR19ET05UV0FJVCwgJmVycik7CisJaWYgKHNrYiA9PSBOVUxMKQorCQlnb3RvIGVycm9yOyAKKwlza2JfcmVzZXJ2ZShza2IsIGhoX2xlbik7CisKKwlza2ItPnByaW9yaXR5ID0gc2stPnNrX3ByaW9yaXR5OworCXNrYi0+ZHN0ID0gZHN0X2Nsb25lKCZydC0+dS5kc3QpOworCisJc2tiLT5uaC5pcGggPSBpcGggPSAoc3RydWN0IGlwaGRyICopc2tiX3B1dChza2IsIGxlbmd0aCk7CisKKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisKKwlza2ItPmgucmF3ID0gc2tiLT5uaC5yYXc7CisJZXJyID0gbWVtY3B5X2Zyb21pb3ZlY2VuZCgodm9pZCAqKWlwaCwgZnJvbSwgMCwgbGVuZ3RoKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yX2ZhdWx0OworCisJLyogV2UgZG9uJ3QgbW9kaWZ5IGludmFsaWQgaGVhZGVyICovCisJaWYgKGxlbmd0aCA+PSBzaXplb2YoKmlwaCkgJiYgaXBoLT5paGwgKiA0IDw9IGxlbmd0aCkgeworCQlpZiAoIWlwaC0+c2FkZHIpCisJCQlpcGgtPnNhZGRyID0gcnQtPnJ0X3NyYzsKKwkJaXBoLT5jaGVjayAgID0gMDsKKwkJaXBoLT50b3RfbGVuID0gaHRvbnMobGVuZ3RoKTsKKwkJaWYgKCFpcGgtPmlkKQorCQkJaXBfc2VsZWN0X2lkZW50KGlwaCwgJnJ0LT51LmRzdCwgTlVMTCk7CisKKwkJaXBoLT5jaGVjayA9IGlwX2Zhc3RfY3N1bSgodW5zaWduZWQgY2hhciAqKWlwaCwgaXBoLT5paGwpOworCX0KKworCWVyciA9IE5GX0hPT0soUEZfSU5FVCwgTkZfSVBfTE9DQUxfT1VULCBza2IsIE5VTEwsIHJ0LT51LmRzdC5kZXYsCisJCSAgICAgIGRzdF9vdXRwdXQpOworCWlmIChlcnIgPiAwKQorCQllcnIgPSBpbmV0LT5yZWN2ZXJyID8gbmV0X3htaXRfZXJybm8oZXJyKSA6IDA7CisJaWYgKGVycikKKwkJZ290byBlcnJvcjsKK291dDoKKwlyZXR1cm4gMDsKKworZXJyb3JfZmF1bHQ6CisJZXJyID0gLUVGQVVMVDsKKwlrZnJlZV9za2Ioc2tiKTsKK2Vycm9yOgorCUlQX0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CisJcmV0dXJuIGVycjsgCit9CisKK3N0YXRpYyB2b2lkIHJhd19wcm9iZV9wcm90b19vcHQoc3RydWN0IGZsb3dpICpmbCwgc3RydWN0IG1zZ2hkciAqbXNnKQoreworCXN0cnVjdCBpb3ZlYyAqaW92OworCXU4IF9fdXNlciAqdHlwZSA9IE5VTEw7CisJdTggX191c2VyICpjb2RlID0gTlVMTDsKKwlpbnQgcHJvYmVkID0gMDsKKwlpbnQgaTsKKworCWlmICghbXNnLT5tc2dfaW92KQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgbXNnLT5tc2dfaW92bGVuOyBpKyspIHsKKwkJaW92ID0gJm1zZy0+bXNnX2lvdltpXTsKKwkJaWYgKCFpb3YpCisJCQljb250aW51ZTsKKworCQlzd2l0Y2ggKGZsLT5wcm90bykgeworCQljYXNlIElQUFJPVE9fSUNNUDoKKwkJCS8qIGNoZWNrIGlmIG9uZS1ieXRlIGZpZWxkIGlzIHJlYWRhYmxlIG9yIG5vdC4gKi8KKwkJCWlmIChpb3YtPmlvdl9iYXNlICYmIGlvdi0+aW92X2xlbiA8IDEpCisJCQkJYnJlYWs7CisKKwkJCWlmICghdHlwZSkgeworCQkJCXR5cGUgPSBpb3YtPmlvdl9iYXNlOworCQkJCS8qIGNoZWNrIGlmIGNvZGUgZmllbGQgaXMgcmVhZGFibGUgb3Igbm90LiAqLworCQkJCWlmIChpb3YtPmlvdl9sZW4gPiAxKQorCQkJCQljb2RlID0gdHlwZSArIDE7CisJCQl9IGVsc2UgaWYgKCFjb2RlKQorCQkJCWNvZGUgPSBpb3YtPmlvdl9iYXNlOworCisJCQlpZiAodHlwZSAmJiBjb2RlKSB7CisJCQkJZ2V0X3VzZXIoZmwtPmZsX2ljbXBfdHlwZSwgdHlwZSk7CisJCQkJX19nZXRfdXNlcihmbC0+ZmxfaWNtcF9jb2RlLCBjb2RlKTsKKwkJCQlwcm9iZWQgPSAxOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcm9iZWQgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHByb2JlZCkKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCByYXdfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLAorCQkgICAgICAgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisJc3RydWN0IGlwY21fY29va2llIGlwYzsKKwlzdHJ1Y3QgcnRhYmxlICpydCA9IE5VTEw7CisJaW50IGZyZWUgPSAwOworCXUzMiBkYWRkcjsKKwl1MzIgc2FkZHI7CisJdTggIHRvczsKKwlpbnQgZXJyOworCisJZXJyID0gLUVNU0dTSVpFOworCWlmIChsZW4gPCAwIHx8IGxlbiA+IDB4RkZGRikKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqCUNoZWNrIHRoZSBmbGFncy4KKwkgKi8KKworCWVyciA9IC1FT1BOT1RTVVBQOworCWlmIChtc2ctPm1zZ19mbGFncyAmIE1TR19PT0IpCS8qIE1pcnJvciBCU0QgZXJyb3IgbWVzc2FnZSAqLworCQlnb3RvIG91dDsgICAgICAgICAgICAgICAvKiBjb21wYXRpYmlsaXR5ICovCisJCQkgCisJLyoKKwkgKglHZXQgYW5kIHZlcmlmeSB0aGUgYWRkcmVzcy4gCisJICovCisKKwlpZiAobXNnLT5tc2dfbmFtZWxlbikgeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnVzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luKiltc2ctPm1zZ19uYW1lOworCQllcnIgPSAtRUlOVkFMOworCQlpZiAobXNnLT5tc2dfbmFtZWxlbiA8IHNpemVvZigqdXNpbikpCisJCQlnb3RvIG91dDsKKwkJaWYgKHVzaW4tPnNpbl9mYW1pbHkgIT0gQUZfSU5FVCkgeworCQkJc3RhdGljIGludCBjb21wbGFpbmVkOworCQkJaWYgKCFjb21wbGFpbmVkKyspCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgZm9yZ290IHRvIHNldCBBRl9JTkVUIGluICIKKwkJCQkJCSAicmF3IHNlbmRtc2cuIEZpeCBpdCFcbiIsCisJCQkJCQkgY3VycmVudC0+Y29tbSk7CisJCQllcnIgPSAtRUFGTk9TVVBQT1JUOworCQkJaWYgKHVzaW4tPnNpbl9mYW1pbHkpCisJCQkJZ290byBvdXQ7CisJCX0KKwkJZGFkZHIgPSB1c2luLT5zaW5fYWRkci5zX2FkZHI7CisJCS8qIEFOSzogSSBkaWQgbm90IGZvcmdldCB0byBnZXQgcHJvdG9jb2wgZnJvbSBwb3J0IGZpZWxkLgorCQkgKiBJIGp1c3QgZG8gbm90IGtub3csIHdobyB1c2VzIHRoaXMgd2VpcmRuZXNzLgorCQkgKiBJUF9IRFJJTkNMIGlzIG11Y2ggbW9yZSBjb252ZW5pZW50LgorCQkgKi8KKwl9IGVsc2UgeworCQllcnIgPSAtRURFU1RBRERSUkVROworCQlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkgCisJCQlnb3RvIG91dDsKKwkJZGFkZHIgPSBpbmV0LT5kYWRkcjsKKwl9CisKKwlpcGMuYWRkciA9IGluZXQtPnNhZGRyOworCWlwYy5vcHQgPSBOVUxMOworCWlwYy5vaWYgPSBzay0+c2tfYm91bmRfZGV2X2lmOworCisJaWYgKG1zZy0+bXNnX2NvbnRyb2xsZW4pIHsKKwkJZXJyID0gaXBfY21zZ19zZW5kKG1zZywgJmlwYyk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwkJaWYgKGlwYy5vcHQpCisJCQlmcmVlID0gMTsKKwl9CisKKwlzYWRkciA9IGlwYy5hZGRyOworCWlwYy5hZGRyID0gZGFkZHI7CisKKwlpZiAoIWlwYy5vcHQpCisJCWlwYy5vcHQgPSBpbmV0LT5vcHQ7CisKKwlpZiAoaXBjLm9wdCkgeworCQllcnIgPSAtRUlOVkFMOworCQkvKiBMaW51eCBkb2VzIG5vdCBtYW5nbGUgaGVhZGVycyBvbiByYXcgc29ja2V0cywKKwkJICogc28gdGhhdCBJUCBvcHRpb25zICsgSVBfSERSSU5DTCBpcyBub24tc2Vuc2UuCisJCSAqLworCQlpZiAoaW5ldC0+aGRyaW5jbCkKKwkJCWdvdG8gZG9uZTsKKwkJaWYgKGlwYy5vcHQtPnNycikgeworCQkJaWYgKCFkYWRkcikKKwkJCQlnb3RvIGRvbmU7CisJCQlkYWRkciA9IGlwYy5vcHQtPmZhZGRyOworCQl9CisJfQorCXRvcyA9IFJUX0NPTk5fRkxBR1Moc2spOworCWlmIChtc2ctPm1zZ19mbGFncyAmIE1TR19ET05UUk9VVEUpCisJCXRvcyB8PSBSVE9fT05MSU5LOworCisJaWYgKE1VTFRJQ0FTVChkYWRkcikpIHsKKwkJaWYgKCFpcGMub2lmKQorCQkJaXBjLm9pZiA9IGluZXQtPm1jX2luZGV4OworCQlpZiAoIXNhZGRyKQorCQkJc2FkZHIgPSBpbmV0LT5tY19hZGRyOworCX0KKworCXsKKwkJc3RydWN0IGZsb3dpIGZsID0geyAub2lmID0gaXBjLm9pZiwKKwkJCQkgICAgLm5sX3UgPSB7IC5pcDRfdSA9CisJCQkJCSAgICAgIHsgLmRhZGRyID0gZGFkZHIsCisJCQkJCQkuc2FkZHIgPSBzYWRkciwKKwkJCQkJCS50b3MgPSB0b3MgfSB9LAorCQkJCSAgICAucHJvdG8gPSBpbmV0LT5oZHJpbmNsID8gSVBQUk9UT19SQVcgOgorCQkJCQkgICAgCQkgICAgIHNrLT5za19wcm90b2NvbCwKKwkJCQkgIH07CisJCWlmICghaW5ldC0+aGRyaW5jbCkKKwkJCXJhd19wcm9iZV9wcm90b19vcHQoJmZsLCBtc2cpOworCisJCWVyciA9IGlwX3JvdXRlX291dHB1dF9mbG93KCZydCwgJmZsLCBzaywgIShtc2ctPm1zZ19mbGFncyZNU0dfRE9OVFdBSVQpKTsKKwl9CisJaWYgKGVycikKKwkJZ290byBkb25lOworCisJZXJyID0gLUVBQ0NFUzsKKwlpZiAocnQtPnJ0X2ZsYWdzICYgUlRDRl9CUk9BRENBU1QgJiYgIXNvY2tfZmxhZyhzaywgU09DS19CUk9BRENBU1QpKQorCQlnb3RvIGRvbmU7CisKKwlpZiAobXNnLT5tc2dfZmxhZ3MgJiBNU0dfQ09ORklSTSkKKwkJZ290byBkb19jb25maXJtOworYmFja19mcm9tX2NvbmZpcm06CisKKwlpZiAoaW5ldC0+aGRyaW5jbCkKKwkJZXJyID0gcmF3X3NlbmRfaGRyaW5jKHNrLCBtc2ctPm1zZ19pb3YsIGxlbiwgCisJCQkJCXJ0LCBtc2ctPm1zZ19mbGFncyk7CisJCisJIGVsc2UgeworCQlpZiAoIWlwYy5hZGRyKQorCQkJaXBjLmFkZHIgPSBydC0+cnRfZHN0OworCQlsb2NrX3NvY2soc2spOworCQllcnIgPSBpcF9hcHBlbmRfZGF0YShzaywgaXBfZ2VuZXJpY19nZXRmcmFnLCBtc2ctPm1zZ19pb3YsIGxlbiwgMCwKKwkJCQkJJmlwYywgcnQsIG1zZy0+bXNnX2ZsYWdzKTsKKwkJaWYgKGVycikKKwkJCWlwX2ZsdXNoX3BlbmRpbmdfZnJhbWVzKHNrKTsKKwkJZWxzZSBpZiAoIShtc2ctPm1zZ19mbGFncyAmIE1TR19NT1JFKSkKKwkJCWVyciA9IGlwX3B1c2hfcGVuZGluZ19mcmFtZXMoc2spOworCQlyZWxlYXNlX3NvY2soc2spOworCX0KK2RvbmU6CisJaWYgKGZyZWUpCisJCWtmcmVlKGlwYy5vcHQpOworCWlwX3J0X3B1dChydCk7CisKK291dDoJcmV0dXJuIGVyciA8IDAgPyBlcnIgOiBsZW47CisKK2RvX2NvbmZpcm06CisJZHN0X2NvbmZpcm0oJnJ0LT51LmRzdCk7CisJaWYgKCEobXNnLT5tc2dfZmxhZ3MgJiBNU0dfUFJPQkUpIHx8IGxlbikKKwkJZ290byBiYWNrX2Zyb21fY29uZmlybTsKKwllcnIgPSAwOworCWdvdG8gZG9uZTsKK30KKworc3RhdGljIHZvaWQgcmF3X2Nsb3NlKHN0cnVjdCBzb2NrICpzaywgbG9uZyB0aW1lb3V0KQoreworICAgICAgICAvKgorCSAqIFJhdyBzb2NrZXRzIG1heSBoYXZlIGRpcmVjdCBrZXJuZWwgcmVmZXJlbmVjZXMuIEtpbGwgdGhlbS4KKwkgKi8KKwlpcF9yYV9jb250cm9sKHNrLCAwLCBOVUxMKTsKKworCXNrX2NvbW1vbl9yZWxlYXNlKHNrKTsKK30KKworLyogVGhpcyBnZXRzIHJpZCBvZiBhbGwgdGhlIG5hc3RpZXMgaW4gYWZfaW5ldC4gLURhdmVNICovCitzdGF0aWMgaW50IHJhd19iaW5kKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwgaW50IGFkZHJfbGVuKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luICopIHVhZGRyOworCWludCByZXQgPSAtRUlOVkFMOworCWludCBjaGtfYWRkcl9yZXQ7CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9DTE9TRSB8fCBhZGRyX2xlbiA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKQorCQlnb3RvIG91dDsKKwljaGtfYWRkcl9yZXQgPSBpbmV0X2FkZHJfdHlwZShhZGRyLT5zaW5fYWRkci5zX2FkZHIpOworCXJldCA9IC1FQUREUk5PVEFWQUlMOworCWlmIChhZGRyLT5zaW5fYWRkci5zX2FkZHIgJiYgY2hrX2FkZHJfcmV0ICE9IFJUTl9MT0NBTCAmJgorCSAgICBjaGtfYWRkcl9yZXQgIT0gUlROX01VTFRJQ0FTVCAmJiBjaGtfYWRkcl9yZXQgIT0gUlROX0JST0FEQ0FTVCkKKwkJZ290byBvdXQ7CisJaW5ldC0+cmN2X3NhZGRyID0gaW5ldC0+c2FkZHIgPSBhZGRyLT5zaW5fYWRkci5zX2FkZHI7CisJaWYgKGNoa19hZGRyX3JldCA9PSBSVE5fTVVMVElDQVNUIHx8IGNoa19hZGRyX3JldCA9PSBSVE5fQlJPQURDQVNUKQorCQlpbmV0LT5zYWRkciA9IDA7ICAvKiBVc2UgZGV2aWNlICovCisJc2tfZHN0X3Jlc2V0KHNrKTsKKwlyZXQgPSAwOworb3V0OglyZXR1cm4gcmV0OworfQorCisvKgorICoJVGhpcyBzaG91bGQgYmUgZWFzeSwgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRoZXJlCisgKgl3ZSByZXR1cm4gaXQsIG90aGVyd2lzZSB3ZSBibG9jay4KKyAqLworCitzdGF0aWMgaW50IHJhd19yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCSAgICAgICBzaXplX3QgbGVuLCBpbnQgbm9ibG9jaywgaW50IGZsYWdzLCBpbnQgKmFkZHJfbGVuKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlzaXplX3QgY29waWVkID0gMDsKKwlpbnQgZXJyID0gLUVPUE5PVFNVUFA7CisJc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopbXNnLT5tc2dfbmFtZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJaWYgKGZsYWdzICYgTVNHX09PQikKKwkJZ290byBvdXQ7CisKKwlpZiAoYWRkcl9sZW4pCisJCSphZGRyX2xlbiA9IHNpemVvZigqc2luKTsKKworCWlmIChmbGFncyAmIE1TR19FUlJRVUVVRSkgeworCQllcnIgPSBpcF9yZWN2X2Vycm9yKHNrLCBtc2csIGxlbik7CisJCWdvdG8gb3V0OworCX0KKworCXNrYiA9IHNrYl9yZWN2X2RhdGFncmFtKHNrLCBmbGFncywgbm9ibG9jaywgJmVycik7CisJaWYgKCFza2IpCisJCWdvdG8gb3V0OworCisJY29waWVkID0gc2tiLT5sZW47CisJaWYgKGxlbiA8IGNvcGllZCkgeworCQltc2ctPm1zZ19mbGFncyB8PSBNU0dfVFJVTkM7CisJCWNvcGllZCA9IGxlbjsKKwl9CisKKwllcnIgPSBza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhza2IsIDAsIG1zZy0+bXNnX2lvdiwgY29waWVkKTsKKwlpZiAoZXJyKQorCQlnb3RvIGRvbmU7CisKKwlzb2NrX3JlY3ZfdGltZXN0YW1wKG1zZywgc2ssIHNrYik7CisKKwkvKiBDb3B5IHRoZSBhZGRyZXNzLiAqLworCWlmIChzaW4pIHsKKwkJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSBza2ItPm5oLmlwaC0+c2FkZHI7CisJCW1lbXNldCgmc2luLT5zaW5femVybywgMCwgc2l6ZW9mKHNpbi0+c2luX3plcm8pKTsKKwl9CisJaWYgKGluZXQtPmNtc2dfZmxhZ3MpCisJCWlwX2Ntc2dfcmVjdihtc2csIHNrYik7CisJaWYgKGZsYWdzICYgTVNHX1RSVU5DKQorCQljb3BpZWQgPSBza2ItPmxlbjsKK2RvbmU6CisJc2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7CitvdXQ6CXJldHVybiBlcnIgPyBlcnIgOiBjb3BpZWQ7Cit9CisKK3N0YXRpYyBpbnQgcmF3X2luaXQoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCByYXdfc29jayAqcnAgPSByYXdfc2soc2spOworCisJaWYgKGluZXRfc2soc2spLT5udW0gPT0gSVBQUk9UT19JQ01QKQorCQltZW1zZXQoJnJwLT5maWx0ZXIsIDAsIHNpemVvZihycC0+ZmlsdGVyKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmF3X3NldGljbXBmaWx0ZXIoc3RydWN0IHNvY2sgKnNrLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQoreworCWlmIChvcHRsZW4gPiBzaXplb2Yoc3RydWN0IGljbXBfZmlsdGVyKSkKKwkJb3B0bGVuID0gc2l6ZW9mKHN0cnVjdCBpY21wX2ZpbHRlcik7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZyYXdfc2soc2spLT5maWx0ZXIsIG9wdHZhbCwgb3B0bGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmF3X2dldGljbXBmaWx0ZXIoc3RydWN0IHNvY2sgKnNrLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCit7CisJaW50IGxlbiwgcmV0ID0gLUVGQVVMVDsKKworCWlmIChnZXRfdXNlcihsZW4sIG9wdGxlbikpCisJCWdvdG8gb3V0OworCXJldCA9IC1FSU5WQUw7CisJaWYgKGxlbiA8IDApCisJCWdvdG8gb3V0OworCWlmIChsZW4gPiBzaXplb2Yoc3RydWN0IGljbXBfZmlsdGVyKSkKKwkJbGVuID0gc2l6ZW9mKHN0cnVjdCBpY21wX2ZpbHRlcik7CisJcmV0ID0gLUVGQVVMVDsKKwlpZiAocHV0X3VzZXIobGVuLCBvcHRsZW4pIHx8CisJICAgIGNvcHlfdG9fdXNlcihvcHR2YWwsICZyYXdfc2soc2spLT5maWx0ZXIsIGxlbikpCisJCWdvdG8gb3V0OworCXJldCA9IDA7CitvdXQ6CXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmF3X3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCAKKwkJCSAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK3sKKwlpZiAobGV2ZWwgIT0gU09MX1JBVykKKwkJcmV0dXJuIGlwX3NldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CisKKwlpZiAob3B0bmFtZSA9PSBJQ01QX0ZJTFRFUikgeworCQlpZiAoaW5ldF9zayhzayktPm51bSAhPSBJUFBST1RPX0lDTVApCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCWVsc2UKKwkJCXJldHVybiByYXdfc2V0aWNtcGZpbHRlcihzaywgb3B0dmFsLCBvcHRsZW4pOworCX0KKwlyZXR1cm4gLUVOT1BST1RPT1BUOworfQorCitzdGF0aWMgaW50IHJhd19nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgCisJCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKK3sKKwlpZiAobGV2ZWwgIT0gU09MX1JBVykKKwkJcmV0dXJuIGlwX2dldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CisKKwlpZiAob3B0bmFtZSA9PSBJQ01QX0ZJTFRFUikgeworCQlpZiAoaW5ldF9zayhzayktPm51bSAhPSBJUFBST1RPX0lDTVApCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCWVsc2UKKwkJCXJldHVybiByYXdfZ2V0aWNtcGZpbHRlcihzaywgb3B0dmFsLCBvcHRsZW4pOworCX0KKwlyZXR1cm4gLUVOT1BST1RPT1BUOworfQorCitzdGF0aWMgaW50IHJhd19pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgU0lPQ09VVFE6IHsKKwkJCWludCBhbW91bnQgPSBhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpOworCQkJcmV0dXJuIHB1dF91c2VyKGFtb3VudCwgKGludCBfX3VzZXIgKilhcmcpOworCQl9CisJCWNhc2UgU0lPQ0lOUTogeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJCWludCBhbW91bnQgPSAwOworCisJCQlzcGluX2xvY2tfaXJxKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwkJCXNrYiA9IHNrYl9wZWVrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJCQlpZiAoc2tiICE9IE5VTEwpCisJCQkJYW1vdW50ID0gc2tiLT5sZW47CisJCQlzcGluX3VubG9ja19pcnEoJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOworCQkJcmV0dXJuIHB1dF91c2VyKGFtb3VudCwgKGludCBfX3VzZXIgKilhcmcpOworCQl9CisKKwkJZGVmYXVsdDoKKyNpZmRlZiBDT05GSUdfSVBfTVJPVVRFCisJCQlyZXR1cm4gaXBtcl9pb2N0bChzaywgY21kLCAodm9pZCBfX3VzZXIgKilhcmcpOworI2Vsc2UKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisjZW5kaWYKKwl9Cit9CisKK3N0cnVjdCBwcm90byByYXdfcHJvdCA9IHsKKwkubmFtZSA9CQkiUkFXIiwKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkuY2xvc2UgPQlyYXdfY2xvc2UsCisJLmNvbm5lY3QgPQlpcDRfZGF0YWdyYW1fY29ubmVjdCwKKwkuZGlzY29ubmVjdCA9CXVkcF9kaXNjb25uZWN0LAorCS5pb2N0bCA9CXJhd19pb2N0bCwKKwkuaW5pdCA9CQlyYXdfaW5pdCwKKwkuc2V0c29ja29wdCA9CXJhd19zZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0ID0JcmF3X2dldHNvY2tvcHQsCisJLnNlbmRtc2cgPQlyYXdfc2VuZG1zZywKKwkucmVjdm1zZyA9CXJhd19yZWN2bXNnLAorCS5iaW5kID0JCXJhd19iaW5kLAorCS5iYWNrbG9nX3JjdiA9CXJhd19yY3Zfc2tiLAorCS5oYXNoID0JCXJhd192NF9oYXNoLAorCS51bmhhc2ggPQlyYXdfdjRfdW5oYXNoLAorCS5vYmpfc2l6ZSA9CXNpemVvZihzdHJ1Y3QgcmF3X3NvY2spLAorfTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdHJ1Y3QgcmF3X2l0ZXJfc3RhdGUgeworCWludCBidWNrZXQ7Cit9OworCisjZGVmaW5lIHJhd19zZXFfcHJpdmF0ZShzZXEpICgoc3RydWN0IHJhd19pdGVyX3N0YXRlICopKHNlcSktPnByaXZhdGUpCisKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqcmF3X2dldF9maXJzdChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IHJhd19pdGVyX3N0YXRlKiBzdGF0ZSA9IHJhd19zZXFfcHJpdmF0ZShzZXEpOworCisJZm9yIChzdGF0ZS0+YnVja2V0ID0gMDsgc3RhdGUtPmJ1Y2tldCA8IFJBV1Y0X0hUQUJMRV9TSVpFOyArK3N0YXRlLT5idWNrZXQpIHsKKwkJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisKKwkJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZyYXdfdjRfaHRhYmxlW3N0YXRlLT5idWNrZXRdKQorCQkJaWYgKHNrLT5za19mYW1pbHkgPT0gUEZfSU5FVCkKKwkJCQlnb3RvIGZvdW5kOworCX0KKwlzayA9IE5VTEw7Citmb3VuZDoKKwlyZXR1cm4gc2s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqcmF3X2dldF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHJhd19pdGVyX3N0YXRlKiBzdGF0ZSA9IHJhd19zZXFfcHJpdmF0ZShzZXEpOworCisJZG8geworCQlzayA9IHNrX25leHQoc2spOwordHJ5X2FnYWluOgorCQk7CisJfSB3aGlsZSAoc2sgJiYgc2stPnNrX2ZhbWlseSAhPSBQRl9JTkVUKTsKKworCWlmICghc2sgJiYgKytzdGF0ZS0+YnVja2V0IDwgUkFXVjRfSFRBQkxFX1NJWkUpIHsKKwkJc2sgPSBza19oZWFkKCZyYXdfdjRfaHRhYmxlW3N0YXRlLT5idWNrZXRdKTsKKwkJZ290byB0cnlfYWdhaW47CisJfQorCXJldHVybiBzazsKK30KKworc3RhdGljIHN0cnVjdCBzb2NrICpyYXdfZ2V0X2lkeChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90IHBvcykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSByYXdfZ2V0X2ZpcnN0KHNlcSk7CisKKwlpZiAoc2spCisJCXdoaWxlIChwb3MgJiYgKHNrID0gcmF3X2dldF9uZXh0KHNlcSwgc2spKSAhPSBOVUxMKQorCQkJLS1wb3M7CisJcmV0dXJuIHBvcyA/IE5VTEwgOiBzazsKK30KKworc3RhdGljIHZvaWQgKnJhd19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXJlYWRfbG9jaygmcmF3X3Y0X2xvY2spOworCXJldHVybiAqcG9zID8gcmF3X2dldF9pZHgoc2VxLCAqcG9zIC0gMSkgOiBTRVFfU1RBUlRfVE9LRU47Cit9CisKK3N0YXRpYyB2b2lkICpyYXdfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBzb2NrICpzazsKKworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKKwkJc2sgPSByYXdfZ2V0X2ZpcnN0KHNlcSk7CisJZWxzZQorCQlzayA9IHJhd19nZXRfbmV4dChzZXEsIHYpOworCSsrKnBvczsKKwlyZXR1cm4gc2s7Cit9CisKK3N0YXRpYyB2b2lkIHJhd19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlyZWFkX3VubG9jaygmcmF3X3Y0X2xvY2spOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBjaGFyICpnZXRfcmF3X3NvY2soc3RydWN0IHNvY2sgKnNwLCBjaGFyICp0bXBidWYsIGludCBpKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNwKTsKKwl1bnNpZ25lZCBpbnQgZGVzdCA9IGluZXQtPmRhZGRyLAorCQkgICAgIHNyYyA9IGluZXQtPnJjdl9zYWRkcjsKKwlfX3UxNiBkZXN0cCA9IDAsCisJICAgICAgc3JjcCAgPSBpbmV0LT5udW07CisKKwlzcHJpbnRmKHRtcGJ1ZiwgIiU0ZDogJTA4WDolMDRYICUwOFg6JTA0WCIKKwkJIiAlMDJYICUwOFg6JTA4WCAlMDJYOiUwOGxYICUwOFggJTVkICU4ZCAlbHUgJWQgJXAiLAorCQlpLCBzcmMsIHNyY3AsIGRlc3QsIGRlc3RwLCBzcC0+c2tfc3RhdGUsIAorCQlhdG9taWNfcmVhZCgmc3AtPnNrX3dtZW1fYWxsb2MpLAorCQlhdG9taWNfcmVhZCgmc3AtPnNrX3JtZW1fYWxsb2MpLAorCQkwLCAwTCwgMCwgc29ja19pX3VpZChzcCksIDAsIHNvY2tfaV9pbm8oc3ApLAorCQlhdG9taWNfcmVhZCgmc3AtPnNrX3JlZmNudCksIHNwKTsKKwlyZXR1cm4gdG1wYnVmOworfQorCitzdGF0aWMgaW50IHJhd19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwljaGFyIHRtcGJ1ZlsxMjldOworCisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlzZXFfcHJpbnRmKHNlcSwgIiUtMTI3c1xuIiwKKwkJCSAgICAgICAiICBzbCAgbG9jYWxfYWRkcmVzcyByZW1fYWRkcmVzcyAgIHN0IHR4X3F1ZXVlICIKKwkJCSAgICAgICAicnhfcXVldWUgdHIgdG0tPndoZW4gcmV0cm5zbXQgICB1aWQgIHRpbWVvdXQgIgorCQkJICAgICAgICJpbm9kZSIpOworCWVsc2UgeworCQlzdHJ1Y3QgcmF3X2l0ZXJfc3RhdGUgKnN0YXRlID0gcmF3X3NlcV9wcml2YXRlKHNlcSk7CisKKwkJc2VxX3ByaW50ZihzZXEsICIlLTEyN3NcbiIsCisJCQkgICBnZXRfcmF3X3NvY2sodiwgdG1wYnVmLCBzdGF0ZS0+YnVja2V0KSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHJhd19zZXFfb3BzID0geworCS5zdGFydCA9IHJhd19zZXFfc3RhcnQsCisJLm5leHQgID0gcmF3X3NlcV9uZXh0LAorCS5zdG9wICA9IHJhd19zZXFfc3RvcCwKKwkuc2hvdyAgPSByYXdfc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IHJhd19zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKKwlpbnQgcmMgPSAtRU5PTUVNOworCXN0cnVjdCByYXdfaXRlcl9zdGF0ZSAqcyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXMpCisJCWdvdG8gb3V0OworCXJjID0gc2VxX29wZW4oZmlsZSwgJnJhd19zZXFfb3BzKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0X2tmcmVlOworCisJc2VxID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNlcS0+cHJpdmF0ZSA9IHM7CisJbWVtc2V0KHMsIDAsIHNpemVvZigqcykpOworb3V0OgorCXJldHVybiByYzsKK291dF9rZnJlZToKKwlrZnJlZShzKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmF3X3NlcV9mb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkub3BlbgkgPSByYXdfc2VxX29wZW4sCisJLnJlYWQJID0gc2VxX3JlYWQsCisJLmxsc2VlawkgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZV9wcml2YXRlLAorfTsKKworaW50IF9faW5pdCByYXdfcHJvY19pbml0KHZvaWQpCit7CisJaWYgKCFwcm9jX25ldF9mb3BzX2NyZWF0ZSgicmF3IiwgU19JUlVHTywgJnJhd19zZXFfZm9wcykpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCit2b2lkIF9faW5pdCByYXdfcHJvY19leGl0KHZvaWQpCit7CisJcHJvY19uZXRfcmVtb3ZlKCJyYXciKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcm91dGUuYyBiL25ldC9pcHY0L3JvdXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY5MWExMTYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9yb3V0ZS5jCkBAIC0wLDAgKzEsMzE3NyBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlST1VURSAtIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJUCByb3V0ZXIuCisgKgorICogVmVyc2lvbjoJJElkOiByb3V0ZS5jLHYgMS4xMDMgMjAwMi8wMS8xMiAwNzo0NDowOSBkYXZlbSBFeHAgJAorICoKKyAqIEF1dGhvcnM6CVJvc3MgQmlybywgPGJpcjdAbGVsYW5kLlN0YW5mb3JkLkVkdT4KKyAqCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCQlBbGFuIENveCwgPGd3NHB0c0BndzRwdHMuYW1wci5vcmc+CisgKgkJTGludXMgVG9ydmFsZHMsIDxMaW51cy5Ub3J2YWxkc0BoZWxzaW5raS5maT4KKyAqCQlBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKgorICogRml4ZXM6CisgKgkJQWxhbiBDb3gJOglWZXJpZnkgYXJlYSBmaXhlcy4KKyAqCQlBbGFuIENveAk6CWNsaSgpIHByb3RlY3RzIHJvdXRpbmcgY2hhbmdlcworICoJCVJ1aSBPbGl2ZWlyYQk6CUlDTVAgcm91dGluZyB0YWJsZSB1cGRhdGVzCisgKgkJKHJjb0BkaS51bWluaG8ucHQpCVJvdXRpbmcgdGFibGUgaW5zZXJ0aW9uIGFuZCB1cGRhdGUKKyAqCQlMaW51cyBUb3J2YWxkcwk6CVJld3JvdGUgYml0cyB0byBiZSBzZW5zaWJsZQorICoJCUFsYW4gQ294CToJQWRkZWQgQlNEIHJvdXRlIGd3IHNlbWFudGljcworICoJCUFsYW4gQ294CToJU3VwZXIgL3Byb2MgPjRLIAorICoJCUFsYW4gQ294CToJTVRVIGluIHJvdXRlIHRhYmxlCisgKgkJQWxhbiBDb3gJOiAJTVNTIGFjdHVhbGx5LiBBbHNvIGFkZGVkIHRoZSB3aW5kb3cKKyAqCQkJCQljbGFtcGVyLgorICoJCVNhbSBMYW50aW5nYQk6CUZpeGVkIHJvdXRlIG1hdGNoaW5nIGluIHJ0X2RlbCgpCisgKgkJQWxhbiBDb3gJOglSb3V0aW5nIGNhY2hlIHN1cHBvcnQuCisgKgkJQWxhbiBDb3gJOglSZW1vdmVkIGNvbXBhdGliaWxpdHkgY3J1ZnQuCisgKgkJQWxhbiBDb3gJOglSVEZfUkVKRUNUIHN1cHBvcnQuCisgKgkJQWxhbiBDb3gJOglUQ1AgaXJ0dCBzdXBwb3J0LgorICoJCUpvbmF0aGFuIE5heWxvcgk6CUFkZGVkIE1ldHJpYyBzdXBwb3J0LgorICoJTWlxdWVsIHZhbiBTbW9vcmVuYnVyZwk6CUJTRCBBUEkgZml4ZXMuCisgKglNaXF1ZWwgdmFuIFNtb29yZW5idXJnCToJTWV0cmljcy4KKyAqCQlBbGFuIENveAk6CVVzZSBfX3UzMiBwcm9wZXJseQorICoJCUFsYW4gQ294CToJQWxpZ25lZCByb3V0aW5nIGVycm9ycyBtb3JlIGNsb3NlbHkgd2l0aCBCU0QKKyAqCQkJCQlvdXIgc3lzdGVtIGlzIHN0aWxsIHZlcnkgZGlmZmVyZW50LgorICoJCUFsYW4gQ294CToJRmFzdGVyIC9wcm9jIGhhbmRsaW5nCisgKglBbGV4ZXkgS3V6bmV0c292CToJTWFzc2l2ZSByZXdvcmsgdG8gc3VwcG9ydCB0cmVlIGJhc2VkIHJvdXRpbmcsCisgKgkJCQkJcm91dGluZyBjYWNoZXMgYW5kIGJldHRlciBiZWhhdmlvdXIuCisgKgkJCisgKgkJT2xhZiBFcmIJOglpcnR0IHdhc24ndCBiZWluZyBjb3BpZWQgcmlnaHQuCisgKgkJQmpvcm4gRWt3YWxsCToJS2VybmVsZCByb3V0ZSBzdXBwb3J0LgorICoJCUFsYW4gQ294CToJTXVsdGljYXN0IGZpeGVkIChJIGhvcGUpCisgKiAJCVBhdmVsIEtyYXV6CToJTGltaXRlZCBicm9hZGNhc3QgZml4ZWQKKyAqCQlNaWtlIE1jTGFnYW4JOglSb3V0aW5nIGJ5IHNvdXJjZQorICoJQWxleGV5IEt1em5ldHNvdgk6CUVuZCBvZiBvbGQgaGlzdG9yeS4gU3BsaXQgdG8gZmliLmMgYW5kCisgKgkJCQkJcm91dGUuYyBhbmQgcmV3cml0dGVuIGZyb20gc2NyYXRjaC4KKyAqCQlBbmRpIEtsZWVuCToJTG9hZC1saW1pdCB3YXJuaW5nIG1lc3NhZ2VzLgorICoJVml0YWx5IEUuIExhdnJvdgk6CVRyYW5zcGFyZW50IHByb3h5IHJldml2ZWQgYWZ0ZXIgeWVhciBjb21hLgorICoJVml0YWx5IEUuIExhdnJvdgk6CVJhY2UgY29uZGl0aW9uIGluIGlwX3JvdXRlX2lucHV0X3Nsb3cuCisgKglUb2JpYXMgUmluZ3N0cm9tCToJVW5pbml0aWFsaXplZCByZXMudHlwZSBpbiBpcF9yb3V0ZV9vdXRwdXRfc2xvdy4KKyAqCVZsYWRpbWlyIFYuIEl2YW5vdgk6CUlQIHJ1bGUgaW5mbyAoZmxvd2lkKSBpcyByZWFsbHkgdXNlZnVsLgorICoJCU1hcmMgQm91Y2hlcgk6CXJvdXRpbmcgYnkgZndtYXJrCisgKglSb2JlcnQgT2xzc29uCQk6CUFkZGVkIHJ0X2NhY2hlIHN0YXRpc3RpY3MKKyAqCUFybmFsZG8gQy4gTWVsbwkJOglDb252ZXJ0IHByb2Mgc3R1ZmYgdG8gc2VxX2ZpbGUKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWdtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdF9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvamhhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVzLmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L2luZXRwZWVyLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvaXBfZmliLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvaWNtcC5oPgorI2luY2x1ZGUgPG5ldC94ZnJtLmg+CisjaW5jbHVkZSA8bmV0L2lwX21wX2FsZy5oPgorI2lmZGVmIENPTkZJR19TWVNDVEwKKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNlbmRpZgorCisjZGVmaW5lIFJUX0ZMX1RPUyhvbGRmbHApIFwKKyAgICAoKHUzMikob2xkZmxwLT5mbDRfdG9zICYgKElQVE9TX1JUX01BU0sgfCBSVE9fT05MSU5LKSkpCisKKyNkZWZpbmUgSVBfTUFYX01UVQkweEZGRjAKKworI2RlZmluZSBSVF9HQ19USU1FT1VUICgzMDAqSFopCisKK3N0YXRpYyBpbnQgaXBfcnRfbWluX2RlbGF5CQk9IDIgKiBIWjsKK3N0YXRpYyBpbnQgaXBfcnRfbWF4X2RlbGF5CQk9IDEwICogSFo7CitzdGF0aWMgaW50IGlwX3J0X21heF9zaXplOworc3RhdGljIGludCBpcF9ydF9nY190aW1lb3V0CQk9IFJUX0dDX1RJTUVPVVQ7CitzdGF0aWMgaW50IGlwX3J0X2djX2ludGVydmFsCQk9IDYwICogSFo7CitzdGF0aWMgaW50IGlwX3J0X2djX21pbl9pbnRlcnZhbAk9IEhaIC8gMjsKK3N0YXRpYyBpbnQgaXBfcnRfcmVkaXJlY3RfbnVtYmVyCT0gOTsKK3N0YXRpYyBpbnQgaXBfcnRfcmVkaXJlY3RfbG9hZAkJPSBIWiAvIDUwOworc3RhdGljIGludCBpcF9ydF9yZWRpcmVjdF9zaWxlbmNlCT0gKChIWiAvIDUwKSA8PCAoOSArIDEpKTsKK3N0YXRpYyBpbnQgaXBfcnRfZXJyb3JfY29zdAkJPSBIWjsKK3N0YXRpYyBpbnQgaXBfcnRfZXJyb3JfYnVyc3QJCT0gNSAqIEhaOworc3RhdGljIGludCBpcF9ydF9nY19lbGFzdGljaXR5CQk9IDg7CitzdGF0aWMgaW50IGlwX3J0X210dV9leHBpcmVzCQk9IDEwICogNjAgKiBIWjsKK3N0YXRpYyBpbnQgaXBfcnRfbWluX3BtdHUJCT0gNTEyICsgMjAgKyAyMDsKK3N0YXRpYyBpbnQgaXBfcnRfbWluX2Fkdm1zcwkJPSAyNTY7CitzdGF0aWMgaW50IGlwX3J0X3NlY3JldF9pbnRlcnZhbAk9IDEwICogNjAgKiBIWjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJ0X2RlYWRsaW5lOworCisjZGVmaW5lIFJUcHJpbnQoYS4uLikJcHJpbnRrKEtFUk5fREVCVUcgYSkKKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHJ0X2ZsdXNoX3RpbWVyOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHJ0X3BlcmlvZGljX3RpbWVyOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHJ0X3NlY3JldF90aW1lcjsKKworLyoKKyAqCUludGVyZmFjZSB0byBnZW5lcmljIGRlc3RpbmF0aW9uIGNhY2hlLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgZHN0X2VudHJ5ICppcHY0X2RzdF9jaGVjayhzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHUzMiBjb29raWUpOworc3RhdGljIHZvaWQJCSBpcHY0X2RzdF9kZXN0cm95KHN0cnVjdCBkc3RfZW50cnkgKmRzdCk7CitzdGF0aWMgdm9pZAkJIGlwdjRfZHN0X2lmZG93bihzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsCisJCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaG93KTsKK3N0YXRpYyBzdHJ1Y3QgZHN0X2VudHJ5ICppcHY0X25lZ2F0aXZlX2FkdmljZShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpOworc3RhdGljIHZvaWQJCSBpcHY0X2xpbmtfZmFpbHVyZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkCQkgaXBfcnRfdXBkYXRlX3BtdHUoc3RydWN0IGRzdF9lbnRyeSAqZHN0LCB1MzIgbXR1KTsKK3N0YXRpYyBpbnQgcnRfZ2FyYmFnZV9jb2xsZWN0KHZvaWQpOworCisKK3N0YXRpYyBzdHJ1Y3QgZHN0X29wcyBpcHY0X2RzdF9vcHMgPSB7CisJLmZhbWlseSA9CQlBRl9JTkVULAorCS5wcm90b2NvbCA9CQlfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKSwKKwkuZ2MgPQkJCXJ0X2dhcmJhZ2VfY29sbGVjdCwKKwkuY2hlY2sgPQkJaXB2NF9kc3RfY2hlY2ssCisJLmRlc3Ryb3kgPQkJaXB2NF9kc3RfZGVzdHJveSwKKwkuaWZkb3duID0JCWlwdjRfZHN0X2lmZG93biwKKwkubmVnYXRpdmVfYWR2aWNlID0JaXB2NF9uZWdhdGl2ZV9hZHZpY2UsCisJLmxpbmtfZmFpbHVyZSA9CQlpcHY0X2xpbmtfZmFpbHVyZSwKKwkudXBkYXRlX3BtdHUgPQkJaXBfcnRfdXBkYXRlX3BtdHUsCisJLmVudHJ5X3NpemUgPQkJc2l6ZW9mKHN0cnVjdCBydGFibGUpLAorfTsKKworI2RlZmluZSBFQ05fT1JfQ09TVChjbGFzcykJVENfUFJJT18jI2NsYXNzCisKK19fdTggaXBfdG9zMnByaW9bMTZdID0geworCVRDX1BSSU9fQkVTVEVGRk9SVCwKKwlFQ05fT1JfQ09TVChGSUxMRVIpLAorCVRDX1BSSU9fQkVTVEVGRk9SVCwKKwlFQ05fT1JfQ09TVChCRVNURUZGT1JUKSwKKwlUQ19QUklPX0JVTEssCisJRUNOX09SX0NPU1QoQlVMSyksCisJVENfUFJJT19CVUxLLAorCUVDTl9PUl9DT1NUKEJVTEspLAorCVRDX1BSSU9fSU5URVJBQ1RJVkUsCisJRUNOX09SX0NPU1QoSU5URVJBQ1RJVkUpLAorCVRDX1BSSU9fSU5URVJBQ1RJVkUsCisJRUNOX09SX0NPU1QoSU5URVJBQ1RJVkUpLAorCVRDX1BSSU9fSU5URVJBQ1RJVkVfQlVMSywKKwlFQ05fT1JfQ09TVChJTlRFUkFDVElWRV9CVUxLKSwKKwlUQ19QUklPX0lOVEVSQUNUSVZFX0JVTEssCisJRUNOX09SX0NPU1QoSU5URVJBQ1RJVkVfQlVMSykKK307CisKKworLyoKKyAqIFJvdXRlIGNhY2hlLgorICovCisKKy8qIFRoZSBsb2NraW5nIHNjaGVtZSBpcyByYXRoZXIgc3RyYWlnaHQgZm9yd2FyZDoKKyAqCisgKiAxKSBSZWFkLUNvcHkgVXBkYXRlIHByb3RlY3RzIHRoZSBidWNrZXRzIG9mIHRoZSBjZW50cmFsIHJvdXRlIGhhc2guCisgKiAyKSBPbmx5IHdyaXRlcnMgcmVtb3ZlIGVudHJpZXMsIGFuZCB0aGV5IGhvbGQgdGhlIGxvY2sKKyAqICAgIGFzIHRoZXkgbG9vayBhdCBydGFibGUgcmVmZXJlbmNlIGNvdW50cy4KKyAqIDMpIE9ubHkgcmVhZGVycyBhY3F1aXJlIHJlZmVyZW5jZXMgdG8gcnRhYmxlIGVudHJpZXMsCisgKiAgICB0aGV5IGRvIHNvIHdpdGggYXRvbWljIGluY3JlbWVudHMgYW5kIHdpdGggdGhlCisgKiAgICBsb2NrIGhlbGQuCisgKi8KKworc3RydWN0IHJ0X2hhc2hfYnVja2V0IHsKKwlzdHJ1Y3QgcnRhYmxlCSpjaGFpbjsKKwlzcGlubG9ja190CWxvY2s7Cit9IF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKDgpKSk7CisKK3N0YXRpYyBzdHJ1Y3QgcnRfaGFzaF9idWNrZXQgCSpydF9oYXNoX3RhYmxlOworc3RhdGljIHVuc2lnbmVkCQkJcnRfaGFzaF9tYXNrOworc3RhdGljIGludAkJCXJ0X2hhc2hfbG9nOworc3RhdGljIHVuc2lnbmVkIGludAkJcnRfaGFzaF9ybmQ7CisKK3N0cnVjdCBydF9jYWNoZV9zdGF0ICpydF9jYWNoZV9zdGF0OworCitzdGF0aWMgaW50IHJ0X2ludGVybl9oYXNoKHVuc2lnbmVkIGhhc2gsIHN0cnVjdCBydGFibGUgKnJ0aCwKKwkJCQlzdHJ1Y3QgcnRhYmxlICoqcmVzKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBydF9oYXNoX2NvZGUodTMyIGRhZGRyLCB1MzIgc2FkZHIsIHU4IHRvcykKK3sKKwlyZXR1cm4gKGpoYXNoXzN3b3JkcyhkYWRkciwgc2FkZHIsICh1MzIpIHRvcywgcnRfaGFzaF9ybmQpCisJCSYgcnRfaGFzaF9tYXNrKTsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdHJ1Y3QgcnRfY2FjaGVfaXRlcl9zdGF0ZSB7CisJaW50IGJ1Y2tldDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcnRhYmxlICpydF9jYWNoZV9nZXRfZmlyc3Qoc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc3RydWN0IHJ0YWJsZSAqciA9IE5VTEw7CisJc3RydWN0IHJ0X2NhY2hlX2l0ZXJfc3RhdGUgKnN0ID0gc2VxLT5wcml2YXRlOworCisJZm9yIChzdC0+YnVja2V0ID0gcnRfaGFzaF9tYXNrOyBzdC0+YnVja2V0ID49IDA7IC0tc3QtPmJ1Y2tldCkgeworCQlyY3VfcmVhZF9sb2NrX2JoKCk7CisJCXIgPSBydF9oYXNoX3RhYmxlW3N0LT5idWNrZXRdLmNoYWluOworCQlpZiAocikKKwkJCWJyZWFrOworCQlyY3VfcmVhZF91bmxvY2tfYmgoKTsKKwl9CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnRhYmxlICpydF9jYWNoZV9nZXRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IHJ0YWJsZSAqcikKK3sKKwlzdHJ1Y3QgcnRfY2FjaGVfaXRlcl9zdGF0ZSAqc3QgPSByY3VfZGVyZWZlcmVuY2Uoc2VxLT5wcml2YXRlKTsKKworCXIgPSByLT51LnJ0X25leHQ7CisJd2hpbGUgKCFyKSB7CisJCXJjdV9yZWFkX3VubG9ja19iaCgpOworCQlpZiAoLS1zdC0+YnVja2V0IDwgMCkKKwkJCWJyZWFrOworCQlyY3VfcmVhZF9sb2NrX2JoKCk7CisJCXIgPSBydF9oYXNoX3RhYmxlW3N0LT5idWNrZXRdLmNoYWluOworCX0KKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHN0cnVjdCBydGFibGUgKnJ0X2NhY2hlX2dldF9pZHgoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCBwb3MpCit7CisJc3RydWN0IHJ0YWJsZSAqciA9IHJ0X2NhY2hlX2dldF9maXJzdChzZXEpOworCisJaWYgKHIpCisJCXdoaWxlIChwb3MgJiYgKHIgPSBydF9jYWNoZV9nZXRfbmV4dChzZXEsIHIpKSkKKwkJCS0tcG9zOworCXJldHVybiBwb3MgPyBOVUxMIDogcjsKK30KKworc3RhdGljIHZvaWQgKnJ0X2NhY2hlX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJcmV0dXJuICpwb3MgPyBydF9jYWNoZV9nZXRfaWR4KHNlcSwgKnBvcyAtIDEpIDogU0VRX1NUQVJUX1RPS0VOOworfQorCitzdGF0aWMgdm9pZCAqcnRfY2FjaGVfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBydGFibGUgKnIgPSBOVUxMOworCisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlyID0gcnRfY2FjaGVfZ2V0X2ZpcnN0KHNlcSk7CisJZWxzZQorCQlyID0gcnRfY2FjaGVfZ2V0X25leHQoc2VxLCB2KTsKKwkrKypwb3M7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIHJ0X2NhY2hlX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWlmICh2ICYmIHYgIT0gU0VRX1NUQVJUX1RPS0VOKQorCQlyY3VfcmVhZF91bmxvY2tfYmgoKTsKK30KKworc3RhdGljIGludCBydF9jYWNoZV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXNlcV9wcmludGYoc2VxLCAiJS0xMjdzXG4iLAorCQkJICAgIklmYWNlXHREZXN0aW5hdGlvblx0R2F0ZXdheSBcdEZsYWdzXHRcdFJlZkNudFx0VXNlXHQiCisJCQkgICAiTWV0cmljXHRTb3VyY2VcdFx0TVRVXHRXaW5kb3dcdElSVFRcdFRPU1x0SEhSZWZcdCIKKwkJCSAgICJISFVwdG9kXHRTcGVjRHN0Iik7CisJZWxzZSB7CisJCXN0cnVjdCBydGFibGUgKnIgPSB2OworCQljaGFyIHRlbXBbMjU2XTsKKworCQlzcHJpbnRmKHRlbXAsICIlc1x0JTA4bFhcdCUwOGxYXHQlOFhcdCVkXHQldVx0JWRcdCIKKwkJCSAgICAgICIlMDhsWFx0JWRcdCV1XHQldVx0JTAyWFx0JWRcdCUxZFx0JTA4WCIsCisJCQlyLT51LmRzdC5kZXYgPyByLT51LmRzdC5kZXYtPm5hbWUgOiAiKiIsCisJCQkodW5zaWduZWQgbG9uZylyLT5ydF9kc3QsICh1bnNpZ25lZCBsb25nKXItPnJ0X2dhdGV3YXksCisJCQlyLT5ydF9mbGFncywgYXRvbWljX3JlYWQoJnItPnUuZHN0Ll9fcmVmY250KSwKKwkJCXItPnUuZHN0Ll9fdXNlLCAwLCAodW5zaWduZWQgbG9uZylyLT5ydF9zcmMsCisJCQkoZHN0X21ldHJpYygmci0+dS5kc3QsIFJUQVhfQURWTVNTKSA/CisJCQkgICAgIChpbnQpZHN0X21ldHJpYygmci0+dS5kc3QsIFJUQVhfQURWTVNTKSArIDQwIDogMCksCisJCQlkc3RfbWV0cmljKCZyLT51LmRzdCwgUlRBWF9XSU5ET1cpLAorCQkJKGludCkoKGRzdF9tZXRyaWMoJnItPnUuZHN0LCBSVEFYX1JUVCkgPj4gMykgKworCQkJICAgICAgZHN0X21ldHJpYygmci0+dS5kc3QsIFJUQVhfUlRUVkFSKSksCisJCQlyLT5mbC5mbDRfdG9zLAorCQkJci0+dS5kc3QuaGggPyBhdG9taWNfcmVhZCgmci0+dS5kc3QuaGgtPmhoX3JlZmNudCkgOiAtMSwKKwkJCXItPnUuZHN0LmhoID8gKHItPnUuZHN0LmhoLT5oaF9vdXRwdXQgPT0KKwkJCQkgICAgICAgZGV2X3F1ZXVlX3htaXQpIDogMCwKKwkJCXItPnJ0X3NwZWNfZHN0KTsKKwkJc2VxX3ByaW50ZihzZXEsICIlLTEyN3NcbiIsIHRlbXApOworICAgICAgICB9CisgIAlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBydF9jYWNoZV9zZXFfb3BzID0geworCS5zdGFydCAgPSBydF9jYWNoZV9zZXFfc3RhcnQsCisJLm5leHQgICA9IHJ0X2NhY2hlX3NlcV9uZXh0LAorCS5zdG9wICAgPSBydF9jYWNoZV9zZXFfc3RvcCwKKwkuc2hvdyAgID0gcnRfY2FjaGVfc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IHJ0X2NhY2hlX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzZXFfZmlsZSAqc2VxOworCWludCByYyA9IC1FTk9NRU07CisJc3RydWN0IHJ0X2NhY2hlX2l0ZXJfc3RhdGUgKnMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOworCisJaWYgKCFzKQorCQlnb3RvIG91dDsKKwlyYyA9IHNlcV9vcGVuKGZpbGUsICZydF9jYWNoZV9zZXFfb3BzKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0X2tmcmVlOworCXNlcSAgICAgICAgICA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzZXEtPnByaXZhdGUgPSBzOworCW1lbXNldChzLCAwLCBzaXplb2YoKnMpKTsKK291dDoKKwlyZXR1cm4gcmM7CitvdXRfa2ZyZWU6CisJa2ZyZWUocyk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJ0X2NhY2hlX3NlcV9mb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkub3BlbgkgPSBydF9jYWNoZV9zZXFfb3BlbiwKKwkucmVhZAkgPSBzZXFfcmVhZCwKKwkubGxzZWVrCSA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlX3ByaXZhdGUsCit9OworCisKK3N0YXRpYyB2b2lkICpydF9jcHVfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlpbnQgY3B1OworCisJaWYgKCpwb3MgPT0gMCkKKwkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKKworCWZvciAoY3B1ID0gKnBvcy0xOyBjcHUgPCBOUl9DUFVTOyArK2NwdSkgeworCQlpZiAoIWNwdV9wb3NzaWJsZShjcHUpKQorCQkJY29udGludWU7CisJCSpwb3MgPSBjcHUrMTsKKwkJcmV0dXJuIHBlcl9jcHVfcHRyKHJ0X2NhY2hlX3N0YXQsIGNwdSk7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCAqcnRfY3B1X3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlpbnQgY3B1OworCisJZm9yIChjcHUgPSAqcG9zOyBjcHUgPCBOUl9DUFVTOyArK2NwdSkgeworCQlpZiAoIWNwdV9wb3NzaWJsZShjcHUpKQorCQkJY29udGludWU7CisJCSpwb3MgPSBjcHUrMTsKKwkJcmV0dXJuIHBlcl9jcHVfcHRyKHJ0X2NhY2hlX3N0YXQsIGNwdSk7CisJfQorCXJldHVybiBOVUxMOworCQorfQorCitzdGF0aWMgdm9pZCBydF9jcHVfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisKK30KKworc3RhdGljIGludCBydF9jcHVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IHJ0X2NhY2hlX3N0YXQgKnN0ID0gdjsKKworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlzZXFfcHJpbnRmKHNlcSwgImVudHJpZXMgIGluX2hpdCBpbl9zbG93X3RvdCBpbl9ub19yb3V0ZSBpbl9icmQgaW5fbWFydGlhbl9kc3QgaW5fbWFydGlhbl9zcmMgIG91dF9oaXQgb3V0X3Nsb3dfdG90IG91dF9zbG93X21jICBnY190b3RhbCBnY19pZ25vcmVkIGdjX2dvYWxfbWlzcyBnY19kc3Rfb3ZlcmZsb3cgaW5faGxpc3Rfc2VhcmNoIG91dF9obGlzdF9zZWFyY2hcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJCisJc2VxX3ByaW50ZihzZXEsIiUwOHggICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggIgorCQkgICAiICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4IFxuIiwKKwkJICAgYXRvbWljX3JlYWQoJmlwdjRfZHN0X29wcy5lbnRyaWVzKSwKKwkJICAgc3QtPmluX2hpdCwKKwkJICAgc3QtPmluX3Nsb3dfdG90LAorCQkgICBzdC0+aW5fc2xvd19tYywKKwkJICAgc3QtPmluX25vX3JvdXRlLAorCQkgICBzdC0+aW5fYnJkLAorCQkgICBzdC0+aW5fbWFydGlhbl9kc3QsCisJCSAgIHN0LT5pbl9tYXJ0aWFuX3NyYywKKworCQkgICBzdC0+b3V0X2hpdCwKKwkJICAgc3QtPm91dF9zbG93X3RvdCwKKwkJICAgc3QtPm91dF9zbG93X21jLCAKKworCQkgICBzdC0+Z2NfdG90YWwsCisJCSAgIHN0LT5nY19pZ25vcmVkLAorCQkgICBzdC0+Z2NfZ29hbF9taXNzLAorCQkgICBzdC0+Z2NfZHN0X292ZXJmbG93LAorCQkgICBzdC0+aW5faGxpc3Rfc2VhcmNoLAorCQkgICBzdC0+b3V0X2hsaXN0X3NlYXJjaAorCQkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHJ0X2NwdV9zZXFfb3BzID0geworCS5zdGFydCAgPSBydF9jcHVfc2VxX3N0YXJ0LAorCS5uZXh0ICAgPSBydF9jcHVfc2VxX25leHQsCisJLnN0b3AgICA9IHJ0X2NwdV9zZXFfc3RvcCwKKwkuc2hvdyAgID0gcnRfY3B1X3NlcV9zaG93LAorfTsKKworCitzdGF0aWMgaW50IHJ0X2NwdV9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJnJ0X2NwdV9zZXFfb3BzKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnRfY3B1X3NlcV9mb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkub3BlbgkgPSBydF9jcHVfc2VxX29wZW4sCisJLnJlYWQJID0gc2VxX3JlYWQsCisJLmxsc2VlawkgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworICAKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcnRfZnJlZShzdHJ1Y3QgcnRhYmxlICpydCkKK3sKKwltdWx0aXBhdGhfcmVtb3ZlKHJ0KTsKKwljYWxsX3JjdV9iaCgmcnQtPnUuZHN0LnJjdV9oZWFkLCBkc3RfcmN1X2ZyZWUpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHJ0X2Ryb3Aoc3RydWN0IHJ0YWJsZSAqcnQpCit7CisJbXVsdGlwYXRoX3JlbW92ZShydCk7CisJaXBfcnRfcHV0KHJ0KTsKKwljYWxsX3JjdV9iaCgmcnQtPnUuZHN0LnJjdV9oZWFkLCBkc3RfcmN1X2ZyZWUpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcnRfZmFzdF9jbGVhbihzdHJ1Y3QgcnRhYmxlICpydGgpCit7CisJLyogS2lsbCBicm9hZGNhc3QvbXVsdGljYXN0IGVudHJpZXMgdmVyeSBhZ2dyZXNpdmVseSwgaWYgdGhleQorCSAgIGNvbGxpZGUgaW4gaGFzaCB0YWJsZSB3aXRoIG1vcmUgdXNlZnVsIGVudHJpZXMgKi8KKwlyZXR1cm4gKHJ0aC0+cnRfZmxhZ3MgJiAoUlRDRl9CUk9BRENBU1QgfCBSVENGX01VTFRJQ0FTVCkpICYmCisJCXJ0aC0+ZmwuaWlmICYmIHJ0aC0+dS5ydF9uZXh0OworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcnRfdmFsdWFibGUoc3RydWN0IHJ0YWJsZSAqcnRoKQoreworCXJldHVybiAocnRoLT5ydF9mbGFncyAmIChSVENGX1JFRElSRUNURUQgfCBSVENGX05PVElGWSkpIHx8CisJCXJ0aC0+dS5kc3QuZXhwaXJlczsKK30KKworc3RhdGljIGludCBydF9tYXlfZXhwaXJlKHN0cnVjdCBydGFibGUgKnJ0aCwgdW5zaWduZWQgbG9uZyB0bW8xLCB1bnNpZ25lZCBsb25nIHRtbzIpCit7CisJdW5zaWduZWQgbG9uZyBhZ2U7CisJaW50IHJldCA9IDA7CisKKwlpZiAoYXRvbWljX3JlYWQoJnJ0aC0+dS5kc3QuX19yZWZjbnQpKQorCQlnb3RvIG91dDsKKworCXJldCA9IDE7CisJaWYgKHJ0aC0+dS5kc3QuZXhwaXJlcyAmJgorCSAgICB0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHJ0aC0+dS5kc3QuZXhwaXJlcykpCisJCWdvdG8gb3V0OworCisJYWdlID0gamlmZmllcyAtIHJ0aC0+dS5kc3QubGFzdHVzZTsKKwlyZXQgPSAwOworCWlmICgoYWdlIDw9IHRtbzEgJiYgIXJ0X2Zhc3RfY2xlYW4ocnRoKSkgfHwKKwkgICAgKGFnZSA8PSB0bW8yICYmIHJ0X3ZhbHVhYmxlKHJ0aCkpKQorCQlnb3RvIG91dDsKKwlyZXQgPSAxOworb3V0OglyZXR1cm4gcmV0OworfQorCisvKiBCaXRzIG9mIHNjb3JlIGFyZToKKyAqIDMxOiB2ZXJ5IHZhbHVhYmxlCisgKiAzMDogbm90IHF1aXRlIHVzZWxlc3MKKyAqIDI5Li4wOiB1c2FnZSBjb3VudGVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHJ0X3Njb3JlKHN0cnVjdCBydGFibGUgKnJ0KQoreworCXUzMiBzY29yZSA9IGppZmZpZXMgLSBydC0+dS5kc3QubGFzdHVzZTsKKworCXNjb3JlID0gfnNjb3JlICYgfigzPDwzMCk7CisKKwlpZiAocnRfdmFsdWFibGUocnQpKQorCQlzY29yZSB8PSAoMTw8MzEpOworCisJaWYgKCFydC0+ZmwuaWlmIHx8CisJICAgICEocnQtPnJ0X2ZsYWdzICYgKFJUQ0ZfQlJPQURDQVNUfFJUQ0ZfTVVMVElDQVNUfFJUQ0ZfTE9DQUwpKSkKKwkJc2NvcmUgfD0gKDE8PDMwKTsKKworCXJldHVybiBzY29yZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY29tcGFyZV9rZXlzKHN0cnVjdCBmbG93aSAqZmwxLCBzdHJ1Y3QgZmxvd2kgKmZsMikKK3sKKwlyZXR1cm4gbWVtY21wKCZmbDEtPm5sX3UuaXA0X3UsICZmbDItPm5sX3UuaXA0X3UsIHNpemVvZihmbDEtPm5sX3UuaXA0X3UpKSA9PSAwICYmCisJICAgICAgIGZsMS0+b2lmICAgICA9PSBmbDItPm9pZiAmJgorCSAgICAgICBmbDEtPmlpZiAgICAgPT0gZmwyLT5paWY7Cit9CisKKyNpZmRlZiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIX0NBQ0hFRAorc3RhdGljIHN0cnVjdCBydGFibGUgKipydF9yZW1vdmVfYmFsYW5jZWRfcm91dGUoc3RydWN0IHJ0YWJsZSAqKmNoYWluX2hlYWQsCisJCQkJCQlzdHJ1Y3QgcnRhYmxlICpleHBlbnRyeSwKKwkJCQkJCWludCAqcmVtb3ZlZF9jb3VudCkKK3sKKwlpbnQgcGFzc2VkZXhwaXJlZCA9IDA7CisJc3RydWN0IHJ0YWJsZSAqKm5leHRzdGVwID0gTlVMTDsKKwlzdHJ1Y3QgcnRhYmxlICoqcnRocCA9IGNoYWluX2hlYWQ7CisJc3RydWN0IHJ0YWJsZSAqcnRoOworCisJaWYgKHJlbW92ZWRfY291bnQpCisJCSpyZW1vdmVkX2NvdW50ID0gMDsKKworCXdoaWxlICgocnRoID0gKnJ0aHApICE9IE5VTEwpIHsKKwkJaWYgKHJ0aCA9PSBleHBlbnRyeSkKKwkJCXBhc3NlZGV4cGlyZWQgPSAxOworCisJCWlmICgoKCpydGhwKS0+dS5kc3QuZmxhZ3MgJiBEU1RfQkFMQU5DRUQpICE9IDAgICYmCisJCSAgICBjb21wYXJlX2tleXMoJigqcnRocCktPmZsLCAmZXhwZW50cnktPmZsKSkgeworCQkJaWYgKCpydGhwID09IGV4cGVudHJ5KSB7CisJCQkJKnJ0aHAgPSBydGgtPnUucnRfbmV4dDsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJKnJ0aHAgPSBydGgtPnUucnRfbmV4dDsKKwkJCQlydF9mcmVlKHJ0aCk7CisJCQkJaWYgKHJlbW92ZWRfY291bnQpCisJCQkJCSsrKCpyZW1vdmVkX2NvdW50KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghKCgqcnRocCktPnUuZHN0LmZsYWdzICYgRFNUX0JBTEFOQ0VEKSAmJgorCQkJICAgIHBhc3NlZGV4cGlyZWQgJiYgIW5leHRzdGVwKQorCQkJCW5leHRzdGVwID0gJnJ0aC0+dS5ydF9uZXh0OworCisJCQlydGhwID0gJnJ0aC0+dS5ydF9uZXh0OworCQl9CisJfQorCisJcnRfZnJlZShleHBlbnRyeSk7CisJaWYgKHJlbW92ZWRfY291bnQpCisJCSsrKCpyZW1vdmVkX2NvdW50KTsKKworCXJldHVybiBuZXh0c3RlcDsKK30KKyNlbmRpZiAvKiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIX0NBQ0hFRCAqLworCisKKy8qIFRoaXMgcnVucyB2aWEgYSB0aW1lciBhbmQgdGh1cyBpcyBhbHdheXMgaW4gQkggY29udGV4dC4gKi8KK3N0YXRpYyB2b2lkIHJ0X2NoZWNrX2V4cGlyZSh1bnNpZ25lZCBsb25nIGR1bW15KQoreworCXN0YXRpYyBpbnQgcm92ZXI7CisJaW50IGkgPSByb3ZlciwgdDsKKwlzdHJ1Y3QgcnRhYmxlICpydGgsICoqcnRocDsKKwl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisKKwlmb3IgKHQgPSBpcF9ydF9nY19pbnRlcnZhbCA8PCBydF9oYXNoX2xvZzsgdCA+PSAwOworCSAgICAgdCAtPSBpcF9ydF9nY190aW1lb3V0KSB7CisJCXVuc2lnbmVkIGxvbmcgdG1vID0gaXBfcnRfZ2NfdGltZW91dDsKKworCQlpID0gKGkgKyAxKSAmIHJ0X2hhc2hfbWFzazsKKwkJcnRocCA9ICZydF9oYXNoX3RhYmxlW2ldLmNoYWluOworCisJCXNwaW5fbG9jaygmcnRfaGFzaF90YWJsZVtpXS5sb2NrKTsKKwkJd2hpbGUgKChydGggPSAqcnRocCkgIT0gTlVMTCkgeworCQkJaWYgKHJ0aC0+dS5kc3QuZXhwaXJlcykgeworCQkJCS8qIEVudHJ5IGlzIGV4cGlyZWQgZXZlbiBpZiBpdCBpcyBpbiB1c2UgKi8KKwkJCQlpZiAodGltZV9iZWZvcmVfZXEobm93LCBydGgtPnUuZHN0LmV4cGlyZXMpKSB7CisJCQkJCXRtbyA+Pj0gMTsKKwkJCQkJcnRocCA9ICZydGgtPnUucnRfbmV4dDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfSBlbHNlIGlmICghcnRfbWF5X2V4cGlyZShydGgsIHRtbywgaXBfcnRfZ2NfdGltZW91dCkpIHsKKwkJCQl0bW8gPj49IDE7CisJCQkJcnRocCA9ICZydGgtPnUucnRfbmV4dDsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogQ2xlYW51cCBhZ2VkIG9mZiBlbnRyaWVzLiAqLworI2lmZGVmIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEhfQ0FDSEVECisJCQkvKiByZW1vdmUgYWxsIHJlbGF0ZWQgYmFsYW5jZWQgZW50cmllcyBpZiBuZWNlc3NhcnkgKi8KKwkJCWlmIChydGgtPnUuZHN0LmZsYWdzICYgRFNUX0JBTEFOQ0VEKSB7CisJCQkJcnRocCA9IHJ0X3JlbW92ZV9iYWxhbmNlZF9yb3V0ZSgKKwkJCQkJJnJ0X2hhc2hfdGFibGVbaV0uY2hhaW4sCisJCQkJCXJ0aCwgTlVMTCk7CisJCQkJaWYgKCFydGhwKQorCQkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJKnJ0aHAgPSBydGgtPnUucnRfbmV4dDsKKwkJCQlydF9mcmVlKHJ0aCk7CisJCQl9CisjZWxzZSAvKiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIX0NBQ0hFRCAqLworIAkJCSpydGhwID0gcnRoLT51LnJ0X25leHQ7CisgCQkJcnRfZnJlZShydGgpOworI2VuZGlmIC8qIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEhfQ0FDSEVEICovCisJCX0KKwkJc3Bpbl91bmxvY2soJnJ0X2hhc2hfdGFibGVbaV0ubG9jayk7CisKKwkJLyogRmFsbGJhY2sgbG9vcCBicmVha2VyLiAqLworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBub3cpKQorCQkJYnJlYWs7CisJfQorCXJvdmVyID0gaTsKKwltb2RfdGltZXIoJnJ0X3BlcmlvZGljX3RpbWVyLCBub3cgKyBpcF9ydF9nY19pbnRlcnZhbCk7Cit9CisKKy8qIFRoaXMgY2FuIHJ1biBmcm9tIGJvdGggQkggYW5kIG5vbi1CSCBjb250ZXh0cywgdGhlIGxhdHRlcgorICogaW4gdGhlIGNhc2Ugb2YgYSBmb3JjZWQgZmx1c2ggZXZlbnQuCisgKi8KK3N0YXRpYyB2b2lkIHJ0X3J1bl9mbHVzaCh1bnNpZ25lZCBsb25nIGR1bW15KQoreworCWludCBpOworCXN0cnVjdCBydGFibGUgKnJ0aCwgKm5leHQ7CisKKwlydF9kZWFkbGluZSA9IDA7CisKKwlnZXRfcmFuZG9tX2J5dGVzKCZydF9oYXNoX3JuZCwgNCk7CisKKwlmb3IgKGkgPSBydF9oYXNoX21hc2s7IGkgPj0gMDsgaS0tKSB7CisJCXNwaW5fbG9ja19iaCgmcnRfaGFzaF90YWJsZVtpXS5sb2NrKTsKKwkJcnRoID0gcnRfaGFzaF90YWJsZVtpXS5jaGFpbjsKKwkJaWYgKHJ0aCkKKwkJCXJ0X2hhc2hfdGFibGVbaV0uY2hhaW4gPSBOVUxMOworCQlzcGluX3VubG9ja19iaCgmcnRfaGFzaF90YWJsZVtpXS5sb2NrKTsKKworCQlmb3IgKDsgcnRoOyBydGggPSBuZXh0KSB7CisJCQluZXh0ID0gcnRoLT51LnJ0X25leHQ7CisJCQlydF9mcmVlKHJ0aCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socnRfZmx1c2hfbG9jayk7CisKK3ZvaWQgcnRfY2FjaGVfZmx1c2goaW50IGRlbGF5KQoreworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKwlpbnQgdXNlcl9tb2RlID0gIWluX3NvZnRpcnEoKTsKKworCWlmIChkZWxheSA8IDApCisJCWRlbGF5ID0gaXBfcnRfbWluX2RlbGF5OworCisJLyogZmx1c2ggZXhpc3RpbmcgbXVsdGlwYXRoIHN0YXRlKi8KKwltdWx0aXBhdGhfZmx1c2goKTsKKworCXNwaW5fbG9ja19iaCgmcnRfZmx1c2hfbG9jayk7CisKKwlpZiAoZGVsX3RpbWVyKCZydF9mbHVzaF90aW1lcikgJiYgZGVsYXkgPiAwICYmIHJ0X2RlYWRsaW5lKSB7CisJCWxvbmcgdG1vID0gKGxvbmcpKHJ0X2RlYWRsaW5lIC0gbm93KTsKKworCQkvKiBJZiBmbHVzaCB0aW1lciBpcyBhbHJlYWR5IHJ1bm5pbmcKKwkJICAgYW5kIGZsdXNoIHJlcXVlc3QgaXMgbm90IGltbWVkaWF0ZSAoZGVsYXkgPiAwKToKKworCQkgICBpZiBkZWFkbGluZSBpcyBub3QgYWNoaWV2ZWQsIHByb2xvbmdhdGUgdGltZXIgdG8gImRlbGF5IiwKKwkJICAgb3RoZXJ3aXNlIGZpcmUgaXQgYXQgZGVhZGxpbmUgdGltZS4KKwkJICovCisKKwkJaWYgKHVzZXJfbW9kZSAmJiB0bW8gPCBpcF9ydF9tYXhfZGVsYXktaXBfcnRfbWluX2RlbGF5KQorCQkJdG1vID0gMDsKKwkJCisJCWlmIChkZWxheSA+IHRtbykKKwkJCWRlbGF5ID0gdG1vOworCX0KKworCWlmIChkZWxheSA8PSAwKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZydF9mbHVzaF9sb2NrKTsKKwkJcnRfcnVuX2ZsdXNoKDApOworCQlyZXR1cm47CisJfQorCisJaWYgKHJ0X2RlYWRsaW5lID09IDApCisJCXJ0X2RlYWRsaW5lID0gbm93ICsgaXBfcnRfbWF4X2RlbGF5OworCisJbW9kX3RpbWVyKCZydF9mbHVzaF90aW1lciwgbm93K2RlbGF5KTsKKwlzcGluX3VubG9ja19iaCgmcnRfZmx1c2hfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0X3NlY3JldF9yZWJ1aWxkKHVuc2lnbmVkIGxvbmcgZHVtbXkpCit7CisJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOworCisJcnRfY2FjaGVfZmx1c2goMCk7CisJbW9kX3RpbWVyKCZydF9zZWNyZXRfdGltZXIsIG5vdyArIGlwX3J0X3NlY3JldF9pbnRlcnZhbCk7Cit9CisKKy8qCisgICBTaG9ydCBkZXNjcmlwdGlvbiBvZiBHQyBnb2Fscy4KKworICAgV2Ugd2FudCB0byBidWlsZCBhbGdvcml0aG0sIHdoaWNoIHdpbGwga2VlcCByb3V0aW5nIGNhY2hlCisgICBhdCBzb21lIGVxdWlsaWJyaXVtIHBvaW50LCB3aGVuIG51bWJlciBvZiBhZ2VkIG9mZiBlbnRyaWVzCisgICBpcyBrZXB0IGFwcHJveGltYXRlbHkgZXF1YWwgdG8gbmV3bHkgZ2VuZXJhdGVkIG9uZXMuCisKKyAgIEN1cnJlbnQgZXhwaXJhdGlvbiBzdHJlbmd0aCBpcyB2YXJpYWJsZSAiZXhwaXJlIi4KKyAgIFdlIHRyeSB0byBhZGp1c3QgaXQgZHluYW1pY2FsbHksIHNvIHRoYXQgaWYgbmV0d29ya2luZworICAgaXMgaWRsZSBleHBpcmVzIGlzIGxhcmdlIGVub3VnaCB0byBrZWVwIGVub3VnaCBvZiB3YXJtIGVudHJpZXMsCisgICBhbmQgd2hlbiBsb2FkIGluY3JlYXNlcyBpdCByZWR1Y2VzIHRvIGxpbWl0IGNhY2hlIHNpemUuCisgKi8KKworc3RhdGljIGludCBydF9nYXJiYWdlX2NvbGxlY3Qodm9pZCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBleHBpcmUgPSBSVF9HQ19USU1FT1VUOworCXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfZ2M7CisJc3RhdGljIGludCByb3ZlcjsKKwlzdGF0aWMgaW50IGVxdWlsaWJyaXVtOworCXN0cnVjdCBydGFibGUgKnJ0aCwgKipydGhwOworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKwlpbnQgZ29hbDsKKworCS8qCisJICogR2FyYmFnZSBjb2xsZWN0aW9uIGlzIHByZXR0eSBleHBlbnNpdmUsCisJICogZG8gbm90IG1ha2UgaXQgdG9vIGZyZXF1ZW50bHkuCisJICovCisKKwlSVF9DQUNIRV9TVEFUX0lOQyhnY190b3RhbCk7CisKKwlpZiAobm93IC0gbGFzdF9nYyA8IGlwX3J0X2djX21pbl9pbnRlcnZhbCAmJgorCSAgICBhdG9taWNfcmVhZCgmaXB2NF9kc3Rfb3BzLmVudHJpZXMpIDwgaXBfcnRfbWF4X3NpemUpIHsKKwkJUlRfQ0FDSEVfU1RBVF9JTkMoZ2NfaWdub3JlZCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIENhbGN1bGF0ZSBudW1iZXIgb2YgZW50cmllcywgd2hpY2ggd2Ugd2FudCB0byBleHBpcmUgbm93LiAqLworCWdvYWwgPSBhdG9taWNfcmVhZCgmaXB2NF9kc3Rfb3BzLmVudHJpZXMpIC0KKwkJKGlwX3J0X2djX2VsYXN0aWNpdHkgPDwgcnRfaGFzaF9sb2cpOworCWlmIChnb2FsIDw9IDApIHsKKwkJaWYgKGVxdWlsaWJyaXVtIDwgaXB2NF9kc3Rfb3BzLmdjX3RocmVzaCkKKwkJCWVxdWlsaWJyaXVtID0gaXB2NF9kc3Rfb3BzLmdjX3RocmVzaDsKKwkJZ29hbCA9IGF0b21pY19yZWFkKCZpcHY0X2RzdF9vcHMuZW50cmllcykgLSBlcXVpbGlicml1bTsKKwkJaWYgKGdvYWwgPiAwKSB7CisJCQllcXVpbGlicml1bSArPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGdvYWwgLyAyLCBydF9oYXNoX21hc2sgKyAxKTsKKwkJCWdvYWwgPSBhdG9taWNfcmVhZCgmaXB2NF9kc3Rfb3BzLmVudHJpZXMpIC0gZXF1aWxpYnJpdW07CisJCX0KKwl9IGVsc2UgeworCQkvKiBXZSBhcmUgaW4gZGFuZ2Vyb3VzIGFyZWEuIFRyeSB0byByZWR1Y2UgY2FjaGUgcmVhbGx5CisJCSAqIGFnZ3Jlc3NpdmVseS4KKwkJICovCisJCWdvYWwgPSBtYXhfdCh1bnNpZ25lZCBpbnQsIGdvYWwgLyAyLCBydF9oYXNoX21hc2sgKyAxKTsKKwkJZXF1aWxpYnJpdW0gPSBhdG9taWNfcmVhZCgmaXB2NF9kc3Rfb3BzLmVudHJpZXMpIC0gZ29hbDsKKwl9CisKKwlpZiAobm93IC0gbGFzdF9nYyA+PSBpcF9ydF9nY19taW5faW50ZXJ2YWwpCisJCWxhc3RfZ2MgPSBub3c7CisKKwlpZiAoZ29hbCA8PSAwKSB7CisJCWVxdWlsaWJyaXVtICs9IGdvYWw7CisJCWdvdG8gd29ya19kb25lOworCX0KKworCWRvIHsKKwkJaW50IGksIGs7CisKKwkJZm9yIChpID0gcnRfaGFzaF9tYXNrLCBrID0gcm92ZXI7IGkgPj0gMDsgaS0tKSB7CisJCQl1bnNpZ25lZCBsb25nIHRtbyA9IGV4cGlyZTsKKworCQkJayA9IChrICsgMSkgJiBydF9oYXNoX21hc2s7CisJCQlydGhwID0gJnJ0X2hhc2hfdGFibGVba10uY2hhaW47CisJCQlzcGluX2xvY2tfYmgoJnJ0X2hhc2hfdGFibGVba10ubG9jayk7CisJCQl3aGlsZSAoKHJ0aCA9ICpydGhwKSAhPSBOVUxMKSB7CisJCQkJaWYgKCFydF9tYXlfZXhwaXJlKHJ0aCwgdG1vLCBleHBpcmUpKSB7CisJCQkJCXRtbyA+Pj0gMTsKKwkJCQkJcnRocCA9ICZydGgtPnUucnRfbmV4dDsKKwkJCQkJY29udGludWU7CisJCQkJfQorI2lmZGVmIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEhfQ0FDSEVECisJCQkJLyogcmVtb3ZlIGFsbCByZWxhdGVkIGJhbGFuY2VkIGVudHJpZXMKKwkJCQkgKiBpZiBuZWNlc3NhcnkKKwkJCQkgKi8KKwkJCQlpZiAocnRoLT51LmRzdC5mbGFncyAmIERTVF9CQUxBTkNFRCkgeworCQkJCQlpbnQgcjsKKworCQkJCQlydGhwID0gcnRfcmVtb3ZlX2JhbGFuY2VkX3JvdXRlKAorCQkJCQkJJnJ0X2hhc2hfdGFibGVbaV0uY2hhaW4sCisJCQkJCQlydGgsCisJCQkJCQkmcik7CisJCQkJCWdvYWwgLT0gcjsKKwkJCQkJaWYgKCFydGhwKQorCQkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIHsKKwkJCQkJKnJ0aHAgPSBydGgtPnUucnRfbmV4dDsKKwkJCQkJcnRfZnJlZShydGgpOworCQkJCQlnb2FsLS07CisJCQkJfQorI2Vsc2UgLyogQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSF9DQUNIRUQgKi8KKwkJCQkqcnRocCA9IHJ0aC0+dS5ydF9uZXh0OworCQkJCXJ0X2ZyZWUocnRoKTsKKwkJCQlnb2FsLS07CisjZW5kaWYgLyogQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSF9DQUNIRUQgKi8KKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2JoKCZydF9oYXNoX3RhYmxlW2tdLmxvY2spOworCQkJaWYgKGdvYWwgPD0gMCkKKwkJCQlicmVhazsKKwkJfQorCQlyb3ZlciA9IGs7CisKKwkJaWYgKGdvYWwgPD0gMCkKKwkJCWdvdG8gd29ya19kb25lOworCisJCS8qIEdvYWwgaXMgbm90IGFjaGlldmVkLiBXZSBzdG9wIHByb2Nlc3MgaWY6CisKKwkJICAgLSBpZiBleHBpcmUgcmVkdWNlZCB0byB6ZXJvLiBPdGhlcndpc2UsIGV4cGlyZSBpcyBoYWxmZWQuCisJCSAgIC0gaWYgdGFibGUgaXMgbm90IGZ1bGwuCisJCSAgIC0gaWYgd2UgYXJlIGNhbGxlZCBmcm9tIGludGVycnVwdC4KKwkJICAgLSBqaWZmaWVzIGNoZWNrIGlzIGp1c3QgZmFsbGJhY2svZGVidWcgbG9vcCBicmVha2VyLgorCQkgICAgIFdlIHdpbGwgbm90IHNwaW4gaGVyZSBmb3IgbG9uZyB0aW1lIGluIGFueSBjYXNlLgorCQkgKi8KKworCQlSVF9DQUNIRV9TVEFUX0lOQyhnY19nb2FsX21pc3MpOworCisJCWlmIChleHBpcmUgPT0gMCkKKwkJCWJyZWFrOworCisJCWV4cGlyZSA+Pj0gMTsKKyNpZiBSVF9DQUNIRV9ERUJVRyA+PSAyCisJCXByaW50ayhLRVJOX0RFQlVHICJleHBpcmU+PiAldSAlZCAlZCAlZFxuIiwgZXhwaXJlLAorCQkJCWF0b21pY19yZWFkKCZpcHY0X2RzdF9vcHMuZW50cmllcyksIGdvYWwsIGkpOworI2VuZGlmCisKKwkJaWYgKGF0b21pY19yZWFkKCZpcHY0X2RzdF9vcHMuZW50cmllcykgPCBpcF9ydF9tYXhfc2l6ZSkKKwkJCWdvdG8gb3V0OworCX0gd2hpbGUgKCFpbl9zb2Z0aXJxKCkgJiYgdGltZV9iZWZvcmVfZXEoamlmZmllcywgbm93KSk7CisKKwlpZiAoYXRvbWljX3JlYWQoJmlwdjRfZHN0X29wcy5lbnRyaWVzKSA8IGlwX3J0X21heF9zaXplKQorCQlnb3RvIG91dDsKKwlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJkc3QgY2FjaGUgb3ZlcmZsb3dcbiIpOworCVJUX0NBQ0hFX1NUQVRfSU5DKGdjX2RzdF9vdmVyZmxvdyk7CisJcmV0dXJuIDE7CisKK3dvcmtfZG9uZToKKwlleHBpcmUgKz0gaXBfcnRfZ2NfbWluX2ludGVydmFsOworCWlmIChleHBpcmUgPiBpcF9ydF9nY190aW1lb3V0IHx8CisJICAgIGF0b21pY19yZWFkKCZpcHY0X2RzdF9vcHMuZW50cmllcykgPCBpcHY0X2RzdF9vcHMuZ2NfdGhyZXNoKQorCQlleHBpcmUgPSBpcF9ydF9nY190aW1lb3V0OworI2lmIFJUX0NBQ0hFX0RFQlVHID49IDIKKwlwcmludGsoS0VSTl9ERUJVRyAiZXhwaXJlKysgJXUgJWQgJWQgJWRcbiIsIGV4cGlyZSwKKwkJCWF0b21pY19yZWFkKCZpcHY0X2RzdF9vcHMuZW50cmllcyksIGdvYWwsIHJvdmVyKTsKKyNlbmRpZgorb3V0OglyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydF9pbnRlcm5faGFzaCh1bnNpZ25lZCBoYXNoLCBzdHJ1Y3QgcnRhYmxlICpydCwgc3RydWN0IHJ0YWJsZSAqKnJwKQoreworCXN0cnVjdCBydGFibGUJKnJ0aCwgKipydGhwOworCXVuc2lnbmVkIGxvbmcJbm93OworCXN0cnVjdCBydGFibGUgKmNhbmQsICoqY2FuZHA7CisJdTMyIAkJbWluX3Njb3JlOworCWludAkJY2hhaW5fbGVuZ3RoOworCWludCBhdHRlbXB0cyA9ICFpbl9zb2Z0aXJxKCk7CisKK3Jlc3RhcnQ6CisJY2hhaW5fbGVuZ3RoID0gMDsKKwltaW5fc2NvcmUgPSB+KHUzMikwOworCWNhbmQgPSBOVUxMOworCWNhbmRwID0gTlVMTDsKKwlub3cgPSBqaWZmaWVzOworCisJcnRocCA9ICZydF9oYXNoX3RhYmxlW2hhc2hdLmNoYWluOworCisJc3Bpbl9sb2NrX2JoKCZydF9oYXNoX3RhYmxlW2hhc2hdLmxvY2spOworCXdoaWxlICgocnRoID0gKnJ0aHApICE9IE5VTEwpIHsKKyNpZmRlZiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIX0NBQ0hFRAorCQlpZiAoIShydGgtPnUuZHN0LmZsYWdzICYgRFNUX0JBTEFOQ0VEKSAmJgorCQkgICAgY29tcGFyZV9rZXlzKCZydGgtPmZsLCAmcnQtPmZsKSkgeworI2Vsc2UKKwkJaWYgKGNvbXBhcmVfa2V5cygmcnRoLT5mbCwgJnJ0LT5mbCkpIHsKKyNlbmRpZgorCQkJLyogUHV0IGl0IGZpcnN0ICovCisJCQkqcnRocCA9IHJ0aC0+dS5ydF9uZXh0OworCQkJLyoKKwkJCSAqIFNpbmNlIGxvb2t1cCBpcyBsb2NrZnJlZSwgdGhlIGRlbGV0aW9uCisJCQkgKiBtdXN0IGJlIHZpc2libGUgdG8gYW5vdGhlciB3ZWFrbHkgb3JkZXJlZCBDUFUgYmVmb3JlCisJCQkgKiB0aGUgaW5zZXJ0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGUgaGFzaCBjaGFpbi4KKwkJCSAqLworCQkJcmN1X2Fzc2lnbl9wb2ludGVyKHJ0aC0+dS5ydF9uZXh0LAorCQkJCQkgICBydF9oYXNoX3RhYmxlW2hhc2hdLmNoYWluKTsKKwkJCS8qCisJCQkgKiBTaW5jZSBsb29rdXAgaXMgbG9ja2ZyZWUsIHRoZSB1cGRhdGUgd3JpdGVzCisJCQkgKiBtdXN0IGJlIG9yZGVyZWQgZm9yIGNvbnNpc3RlbmN5IG9uIFNNUC4KKwkJCSAqLworCQkJcmN1X2Fzc2lnbl9wb2ludGVyKHJ0X2hhc2hfdGFibGVbaGFzaF0uY2hhaW4sIHJ0aCk7CisKKwkJCXJ0aC0+dS5kc3QuX191c2UrKzsKKwkJCWRzdF9ob2xkKCZydGgtPnUuZHN0KTsKKwkJCXJ0aC0+dS5kc3QubGFzdHVzZSA9IG5vdzsKKwkJCXNwaW5fdW5sb2NrX2JoKCZydF9oYXNoX3RhYmxlW2hhc2hdLmxvY2spOworCisJCQlydF9kcm9wKHJ0KTsKKwkJCSpycCA9IHJ0aDsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFhdG9taWNfcmVhZCgmcnRoLT51LmRzdC5fX3JlZmNudCkpIHsKKwkJCXUzMiBzY29yZSA9IHJ0X3Njb3JlKHJ0aCk7CisKKwkJCWlmIChzY29yZSA8PSBtaW5fc2NvcmUpIHsKKwkJCQljYW5kID0gcnRoOworCQkJCWNhbmRwID0gcnRocDsKKwkJCQltaW5fc2NvcmUgPSBzY29yZTsKKwkJCX0KKwkJfQorCisJCWNoYWluX2xlbmd0aCsrOworCisJCXJ0aHAgPSAmcnRoLT51LnJ0X25leHQ7CisJfQorCisJaWYgKGNhbmQpIHsKKwkJLyogaXBfcnRfZ2NfZWxhc3RpY2l0eSB1c2VkIHRvIGJlIGF2ZXJhZ2UgbGVuZ3RoIG9mIGNoYWluCisJCSAqIGxlbmd0aCwgd2hlbiBleGNlZWRlZCBnYyBiZWNvbWVzIHJlYWxseSBhZ2dyZXNzaXZlLgorCQkgKgorCQkgKiBUaGUgc2Vjb25kIGxpbWl0IGlzIGxlc3MgY2VydGFpbi4gQXQgdGhlIG1vbWVudCBpdCBhbGxvd3MKKwkJICogb25seSAyIGVudHJpZXMgcGVyIGJ1Y2tldC4gV2Ugd2lsbCBzZWUuCisJCSAqLworCQlpZiAoY2hhaW5fbGVuZ3RoID4gaXBfcnRfZ2NfZWxhc3RpY2l0eSkgeworCQkJKmNhbmRwID0gY2FuZC0+dS5ydF9uZXh0OworCQkJcnRfZnJlZShjYW5kKTsKKwkJfQorCX0KKworCS8qIFRyeSB0byBiaW5kIHJvdXRlIHRvIGFycCBvbmx5IGlmIGl0IGlzIG91dHB1dAorCSAgIHJvdXRlIG9yIHVuaWNhc3QgZm9yd2FyZGluZyBwYXRoLgorCSAqLworCWlmIChydC0+cnRfdHlwZSA9PSBSVE5fVU5JQ0FTVCB8fCBydC0+ZmwuaWlmID09IDApIHsKKwkJaW50IGVyciA9IGFycF9iaW5kX25laWdoYm91cigmcnQtPnUuZHN0KTsKKwkJaWYgKGVycikgeworCQkJc3Bpbl91bmxvY2tfYmgoJnJ0X2hhc2hfdGFibGVbaGFzaF0ubG9jayk7CisKKwkJCWlmIChlcnIgIT0gLUVOT0JVRlMpIHsKKwkJCQlydF9kcm9wKHJ0KTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCisJCQkvKiBOZWlnaGJvdXIgdGFibGVzIGFyZSBmdWxsIGFuZCBub3RoaW5nCisJCQkgICBjYW4gYmUgcmVsZWFzZWQuIFRyeSB0byBzaHJpbmsgcm91dGUgY2FjaGUsCisJCQkgICBpdCBpcyBtb3N0IGxpa2VseSBpdCBob2xkcyBzb21lIG5laWdoYm91ciByZWNvcmRzLgorCQkJICovCisJCQlpZiAoYXR0ZW1wdHMtLSA+IDApIHsKKwkJCQlpbnQgc2F2ZWRfZWxhc3RpY2l0eSA9IGlwX3J0X2djX2VsYXN0aWNpdHk7CisJCQkJaW50IHNhdmVkX2ludCA9IGlwX3J0X2djX21pbl9pbnRlcnZhbDsKKwkJCQlpcF9ydF9nY19lbGFzdGljaXR5CT0gMTsKKwkJCQlpcF9ydF9nY19taW5faW50ZXJ2YWwJPSAwOworCQkJCXJ0X2dhcmJhZ2VfY29sbGVjdCgpOworCQkJCWlwX3J0X2djX21pbl9pbnRlcnZhbAk9IHNhdmVkX2ludDsKKwkJCQlpcF9ydF9nY19lbGFzdGljaXR5CT0gc2F2ZWRfZWxhc3RpY2l0eTsKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQl9CisKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTmVpZ2hib3VyIHRhYmxlIG92ZXJmbG93LlxuIik7CisJCQlydF9kcm9wKHJ0KTsKKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCX0KKworCXJ0LT51LnJ0X25leHQgPSBydF9oYXNoX3RhYmxlW2hhc2hdLmNoYWluOworI2lmIFJUX0NBQ0hFX0RFQlVHID49IDIKKwlpZiAocnQtPnUucnRfbmV4dCkgeworCQlzdHJ1Y3QgcnRhYmxlICp0cnQ7CisJCXByaW50ayhLRVJOX0RFQlVHICJydF9jYWNoZSBAJTAyeDogJXUuJXUuJXUuJXUiLCBoYXNoLAorCQkgICAgICAgTklQUVVBRChydC0+cnRfZHN0KSk7CisJCWZvciAodHJ0ID0gcnQtPnUucnRfbmV4dDsgdHJ0OyB0cnQgPSB0cnQtPnUucnRfbmV4dCkKKwkJCXByaW50aygiIC4gJXUuJXUuJXUuJXUiLCBOSVBRVUFEKHRydC0+cnRfZHN0KSk7CisJCXByaW50aygiXG4iKTsKKwl9CisjZW5kaWYKKwlydF9oYXNoX3RhYmxlW2hhc2hdLmNoYWluID0gcnQ7CisJc3Bpbl91bmxvY2tfYmgoJnJ0X2hhc2hfdGFibGVbaGFzaF0ubG9jayk7CisJKnJwID0gcnQ7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcnRfYmluZF9wZWVyKHN0cnVjdCBydGFibGUgKnJ0LCBpbnQgY3JlYXRlKQoreworCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0socnRfcGVlcl9sb2NrKTsKKwlzdHJ1Y3QgaW5ldF9wZWVyICpwZWVyOworCisJcGVlciA9IGluZXRfZ2V0cGVlcihydC0+cnRfZHN0LCBjcmVhdGUpOworCisJc3Bpbl9sb2NrX2JoKCZydF9wZWVyX2xvY2spOworCWlmIChydC0+cGVlciA9PSBOVUxMKSB7CisJCXJ0LT5wZWVyID0gcGVlcjsKKwkJcGVlciA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZydF9wZWVyX2xvY2spOworCWlmIChwZWVyKQorCQlpbmV0X3B1dHBlZXIocGVlcik7Cit9CisKKy8qCisgKiBQZWVyIGFsbG9jYXRpb24gbWF5IGZhaWwgb25seSBpbiBzZXJpb3VzIG91dC1vZi1tZW1vcnkgY29uZGl0aW9ucy4gIEhvd2V2ZXIKKyAqIHdlIHN0aWxsIGNhbiBnZW5lcmF0ZSBzb21lIG91dHB1dC4KKyAqIFJhbmRvbSBJRCBzZWxlY3Rpb24gbG9va3MgYSBiaXQgZGFuZ2Vyb3VzIGJlY2F1c2Ugd2UgaGF2ZSBubyBjaGFuY2VzIHRvCisgKiBzZWxlY3QgSUQgYmVpbmcgdW5pcXVlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZS4KKyAqIEJ1dCBicm9rZW4gcGFja2V0IGlkZW50aWZpZXIgbWF5IGJlIGJldHRlciB0aGFuIG5vIHBhY2tldCBhdCBhbGwuCisgKi8KK3N0YXRpYyB2b2lkIGlwX3NlbGVjdF9mYl9pZGVudChzdHJ1Y3QgaXBoZHIgKmlwaCkKK3sKKwlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlwX2ZiX2lkX2xvY2spOworCXN0YXRpYyB1MzIgaXBfZmFsbGJhY2tfaWQ7CisJdTMyIHNhbHQ7CisKKwlzcGluX2xvY2tfYmgoJmlwX2ZiX2lkX2xvY2spOworCXNhbHQgPSBzZWN1cmVfaXBfaWQoaXBfZmFsbGJhY2tfaWQgXiBpcGgtPmRhZGRyKTsKKwlpcGgtPmlkID0gaHRvbnMoc2FsdCAmIDB4RkZGRik7CisJaXBfZmFsbGJhY2tfaWQgPSBzYWx0OworCXNwaW5fdW5sb2NrX2JoKCZpcF9mYl9pZF9sb2NrKTsKK30KKwordm9pZCBfX2lwX3NlbGVjdF9pZGVudChzdHJ1Y3QgaXBoZHIgKmlwaCwgc3RydWN0IGRzdF9lbnRyeSAqZHN0LCBpbnQgbW9yZSkKK3sKKwlzdHJ1Y3QgcnRhYmxlICpydCA9IChzdHJ1Y3QgcnRhYmxlICopIGRzdDsKKworCWlmIChydCkgeworCQlpZiAocnQtPnBlZXIgPT0gTlVMTCkKKwkJCXJ0X2JpbmRfcGVlcihydCwgMSk7CisKKwkJLyogSWYgcGVlciBpcyBhdHRhY2hlZCB0byBkZXN0aW5hdGlvbiwgaXQgaXMgbmV2ZXIgZGV0YWNoZWQsCisJCSAgIHNvIHRoYXQgd2UgbmVlZCBub3QgdG8gZ3JhYiBhIGxvY2sgdG8gZGVyZWZlcmVuY2UgaXQuCisJCSAqLworCQlpZiAocnQtPnBlZXIpIHsKKwkJCWlwaC0+aWQgPSBodG9ucyhpbmV0X2dldGlkKHJ0LT5wZWVyLCBtb3JlKSk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fREVCVUcgInJ0X2JpbmRfcGVlcigwKSBAJXBcbiIsIE5FVF9DQUxMRVIoaXBoKSk7CisKKwlpcF9zZWxlY3RfZmJfaWRlbnQoaXBoKTsKK30KKworc3RhdGljIHZvaWQgcnRfZGVsKHVuc2lnbmVkIGhhc2gsIHN0cnVjdCBydGFibGUgKnJ0KQoreworCXN0cnVjdCBydGFibGUgKipydGhwOworCisJc3Bpbl9sb2NrX2JoKCZydF9oYXNoX3RhYmxlW2hhc2hdLmxvY2spOworCWlwX3J0X3B1dChydCk7CisJZm9yIChydGhwID0gJnJ0X2hhc2hfdGFibGVbaGFzaF0uY2hhaW47ICpydGhwOworCSAgICAgcnRocCA9ICYoKnJ0aHApLT51LnJ0X25leHQpCisJCWlmICgqcnRocCA9PSBydCkgeworCQkJKnJ0aHAgPSBydC0+dS5ydF9uZXh0OworCQkJcnRfZnJlZShydCk7CisJCQlicmVhazsKKwkJfQorCXNwaW5fdW5sb2NrX2JoKCZydF9oYXNoX3RhYmxlW2hhc2hdLmxvY2spOworfQorCit2b2lkIGlwX3J0X3JlZGlyZWN0KHUzMiBvbGRfZ3csIHUzMiBkYWRkciwgdTMyIG5ld19ndywKKwkJICAgIHUzMiBzYWRkciwgdTggdG9zLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpLCBrOworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiA9IGluX2Rldl9nZXQoZGV2KTsKKwlzdHJ1Y3QgcnRhYmxlICpydGgsICoqcnRocDsKKwl1MzIgIHNrZXlzWzJdID0geyBzYWRkciwgMCB9OworCWludCAgaWtleXNbMl0gPSB7IGRldi0+aWZpbmRleCwgMCB9OworCisJdG9zICY9IElQVE9TX1JUX01BU0s7CisKKwlpZiAoIWluX2RldikKKwkJcmV0dXJuOworCisJaWYgKG5ld19ndyA9PSBvbGRfZ3cgfHwgIUlOX0RFVl9SWF9SRURJUkVDVFMoaW5fZGV2KQorCSAgICB8fCBNVUxUSUNBU1QobmV3X2d3KSB8fCBCQURDTEFTUyhuZXdfZ3cpIHx8IFpFUk9ORVQobmV3X2d3KSkKKwkJZ290byByZWplY3RfcmVkaXJlY3Q7CisKKwlpZiAoIUlOX0RFVl9TSEFSRURfTUVESUEoaW5fZGV2KSkgeworCQlpZiAoIWluZXRfYWRkcl9vbmxpbmsoaW5fZGV2LCBuZXdfZ3csIG9sZF9ndykpCisJCQlnb3RvIHJlamVjdF9yZWRpcmVjdDsKKwkJaWYgKElOX0RFVl9TRUNfUkVESVJFQ1RTKGluX2RldikgJiYgaXBfZmliX2NoZWNrX2RlZmF1bHQobmV3X2d3LCBkZXYpKQorCQkJZ290byByZWplY3RfcmVkaXJlY3Q7CisJfSBlbHNlIHsKKwkJaWYgKGluZXRfYWRkcl90eXBlKG5ld19ndykgIT0gUlROX1VOSUNBU1QpCisJCQlnb3RvIHJlamVjdF9yZWRpcmVjdDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCWZvciAoayA9IDA7IGsgPCAyOyBrKyspIHsKKwkJCXVuc2lnbmVkIGhhc2ggPSBydF9oYXNoX2NvZGUoZGFkZHIsCisJCQkJCQkgICAgIHNrZXlzW2ldIF4gKGlrZXlzW2tdIDw8IDUpLAorCQkJCQkJICAgICB0b3MpOworCisJCQlydGhwPSZydF9oYXNoX3RhYmxlW2hhc2hdLmNoYWluOworCisJCQlyY3VfcmVhZF9sb2NrKCk7CisJCQl3aGlsZSAoKHJ0aCA9IHJjdV9kZXJlZmVyZW5jZSgqcnRocCkpICE9IE5VTEwpIHsKKwkJCQlzdHJ1Y3QgcnRhYmxlICpydDsKKworCQkJCWlmIChydGgtPmZsLmZsNF9kc3QgIT0gZGFkZHIgfHwKKwkJCQkgICAgcnRoLT5mbC5mbDRfc3JjICE9IHNrZXlzW2ldIHx8CisJCQkJICAgIHJ0aC0+ZmwuZmw0X3RvcyAhPSB0b3MgfHwKKwkJCQkgICAgcnRoLT5mbC5vaWYgIT0gaWtleXNba10gfHwKKwkJCQkgICAgcnRoLT5mbC5paWYgIT0gMCkgeworCQkJCQlydGhwID0gJnJ0aC0+dS5ydF9uZXh0OworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlpZiAocnRoLT5ydF9kc3QgIT0gZGFkZHIgfHwKKwkJCQkgICAgcnRoLT5ydF9zcmMgIT0gc2FkZHIgfHwKKwkJCQkgICAgcnRoLT51LmRzdC5lcnJvciB8fAorCQkJCSAgICBydGgtPnJ0X2dhdGV3YXkgIT0gb2xkX2d3IHx8CisJCQkJICAgIHJ0aC0+dS5kc3QuZGV2ICE9IGRldikKKwkJCQkJYnJlYWs7CisKKwkJCQlkc3RfaG9sZCgmcnRoLT51LmRzdCk7CisJCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkJCQlydCA9IGRzdF9hbGxvYygmaXB2NF9kc3Rfb3BzKTsKKwkJCQlpZiAocnQgPT0gTlVMTCkgeworCQkJCQlpcF9ydF9wdXQocnRoKTsKKwkJCQkJaW5fZGV2X3B1dChpbl9kZXYpOworCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQkJLyogQ29weSBhbGwgdGhlIGluZm9ybWF0aW9uLiAqLworCQkJCSpydCA9ICpydGg7CisgCQkJCUlOSVRfUkNVX0hFQUQoJnJ0LT51LmRzdC5yY3VfaGVhZCk7CisJCQkJcnQtPnUuZHN0Ll9fdXNlCQk9IDE7CisJCQkJYXRvbWljX3NldCgmcnQtPnUuZHN0Ll9fcmVmY250LCAxKTsKKwkJCQlydC0+dS5kc3QuY2hpbGQJCT0gTlVMTDsKKwkJCQlpZiAocnQtPnUuZHN0LmRldikKKwkJCQkJZGV2X2hvbGQocnQtPnUuZHN0LmRldik7CisJCQkJaWYgKHJ0LT5pZGV2KQorCQkJCQlpbl9kZXZfaG9sZChydC0+aWRldik7CisJCQkJcnQtPnUuZHN0Lm9ic29sZXRlCT0gMDsKKwkJCQlydC0+dS5kc3QubGFzdHVzZQk9IGppZmZpZXM7CisJCQkJcnQtPnUuZHN0LnBhdGgJCT0gJnJ0LT51LmRzdDsKKwkJCQlydC0+dS5kc3QubmVpZ2hib3VyCT0gTlVMTDsKKwkJCQlydC0+dS5kc3QuaGgJCT0gTlVMTDsKKwkJCQlydC0+dS5kc3QueGZybQkJPSBOVUxMOworCisJCQkJcnQtPnJ0X2ZsYWdzCQl8PSBSVENGX1JFRElSRUNURUQ7CisKKwkJCQkvKiBHYXRld2F5IGlzIGRpZmZlcmVudCAuLi4gKi8KKwkJCQlydC0+cnRfZ2F0ZXdheQkJPSBuZXdfZ3c7CisKKwkJCQkvKiBSZWRpcmVjdCByZWNlaXZlZCAtPiBwYXRoIHdhcyB2YWxpZCAqLworCQkJCWRzdF9jb25maXJtKCZydGgtPnUuZHN0KTsKKworCQkJCWlmIChydC0+cGVlcikKKwkJCQkJYXRvbWljX2luYygmcnQtPnBlZXItPnJlZmNudCk7CisKKwkJCQlpZiAoYXJwX2JpbmRfbmVpZ2hib3VyKCZydC0+dS5kc3QpIHx8CisJCQkJICAgICEocnQtPnUuZHN0Lm5laWdoYm91ci0+bnVkX3N0YXRlICYKKwkJCQkJICAgIE5VRF9WQUxJRCkpIHsKKwkJCQkJaWYgKHJ0LT51LmRzdC5uZWlnaGJvdXIpCisJCQkJCQluZWlnaF9ldmVudF9zZW5kKHJ0LT51LmRzdC5uZWlnaGJvdXIsIE5VTEwpOworCQkJCQlpcF9ydF9wdXQocnRoKTsKKwkJCQkJcnRfZHJvcChydCk7CisJCQkJCWdvdG8gZG9fbmV4dDsKKwkJCQl9CisKKwkJCQlydF9kZWwoaGFzaCwgcnRoKTsKKwkJCQlpZiAoIXJ0X2ludGVybl9oYXNoKGhhc2gsIHJ0LCAmcnQpKQorCQkJCQlpcF9ydF9wdXQocnQpOworCQkJCWdvdG8gZG9fbmV4dDsKKwkJCX0KKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQlkb19uZXh0OgorCQkJOworCQl9CisJfQorCWluX2Rldl9wdXQoaW5fZGV2KTsKKwlyZXR1cm47CisKK3JlamVjdF9yZWRpcmVjdDoKKyNpZmRlZiBDT05GSUdfSVBfUk9VVEVfVkVSQk9TRQorCWlmIChJTl9ERVZfTE9HX01BUlRJQU5TKGluX2RldikgJiYgbmV0X3JhdGVsaW1pdCgpKQorCQlwcmludGsoS0VSTl9JTkZPICJSZWRpcmVjdCBmcm9tICV1LiV1LiV1LiV1IG9uICVzIGFib3V0ICIKKwkJCSIldS4ldS4ldS4ldSBpZ25vcmVkLlxuIgorCQkJIiAgQWR2aXNlZCBwYXRoID0gJXUuJXUuJXUuJXUgLT4gJXUuJXUuJXUuJXUsICIKKwkJCSJ0b3MgJTAyeFxuIiwKKwkJICAgICAgIE5JUFFVQUQob2xkX2d3KSwgZGV2LT5uYW1lLCBOSVBRVUFEKG5ld19ndyksCisJCSAgICAgICBOSVBRVUFEKHNhZGRyKSwgTklQUVVBRChkYWRkciksIHRvcyk7CisjZW5kaWYKKwlpbl9kZXZfcHV0KGluX2Rldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHN0X2VudHJ5ICppcHY0X25lZ2F0aXZlX2FkdmljZShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCit7CisJc3RydWN0IHJ0YWJsZSAqcnQgPSAoc3RydWN0IHJ0YWJsZSopZHN0OworCXN0cnVjdCBkc3RfZW50cnkgKnJldCA9IGRzdDsKKworCWlmIChydCkgeworCQlpZiAoZHN0LT5vYnNvbGV0ZSkgeworCQkJaXBfcnRfcHV0KHJ0KTsKKwkJCXJldCA9IE5VTEw7CisJCX0gZWxzZSBpZiAoKHJ0LT5ydF9mbGFncyAmIFJUQ0ZfUkVESVJFQ1RFRCkgfHwKKwkJCSAgIHJ0LT51LmRzdC5leHBpcmVzKSB7CisJCQl1bnNpZ25lZCBoYXNoID0gcnRfaGFzaF9jb2RlKHJ0LT5mbC5mbDRfZHN0LAorCQkJCQkJICAgICBydC0+ZmwuZmw0X3NyYyBeCisJCQkJCQkJKHJ0LT5mbC5vaWYgPDwgNSksCisJCQkJCQkgICAgIHJ0LT5mbC5mbDRfdG9zKTsKKyNpZiBSVF9DQUNIRV9ERUJVRyA+PSAxCisJCQlwcmludGsoS0VSTl9ERUJVRyAiaXBfcnRfYWR2aWNlOiByZWRpcmVjdCB0byAiCisJCQkJCSAgIiV1LiV1LiV1LiV1LyUwMnggZHJvcHBlZFxuIiwKKwkJCQlOSVBRVUFEKHJ0LT5ydF9kc3QpLCBydC0+ZmwuZmw0X3Rvcyk7CisjZW5kaWYKKwkJCXJ0X2RlbChoYXNoLCBydCk7CisJCQlyZXQgPSBOVUxMOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBBbGdvcml0aG06CisgKgkxLiBUaGUgZmlyc3QgaXBfcnRfcmVkaXJlY3RfbnVtYmVyIHJlZGlyZWN0cyBhcmUgc2VudAorICoJICAgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmLCB0aGVuIHdlIHN0b3Agc2VuZGluZyB0aGVtIGF0IGFsbCwKKyAqCSAgIGFzc3VtaW5nIHRoYXQgdGhlIGhvc3QgaWdub3JlcyBvdXIgcmVkaXJlY3RzLgorICoJMi4gSWYgd2UgZGlkIG5vdCBzZWUgcGFja2V0cyByZXF1aXJpbmcgcmVkaXJlY3RzCisgKgkgICBkdXJpbmcgaXBfcnRfcmVkaXJlY3Rfc2lsZW5jZSwgd2UgYXNzdW1lIHRoYXQgdGhlIGhvc3QKKyAqCSAgIGZvcmdvdCByZWRpcmVjdGVkIHJvdXRlIGFuZCBzdGFydCB0byBzZW5kIHJlZGlyZWN0cyBhZ2Fpbi4KKyAqCisgKiBUaGlzIGFsZ29yaXRobSBpcyBtdWNoIGNoZWFwZXIgYW5kIG1vcmUgaW50ZWxsaWdlbnQgdGhhbiBkdW1iIGxvYWQgbGltaXRpbmcKKyAqIGluIGljbXAuYy4KKyAqCisgKiBOT1RFLiBEbyBub3QgZm9yZ2V0IHRvIGluaGliaXQgbG9hZCBsaW1pdGluZyBmb3IgcmVkaXJlY3RzIChyZWR1bmRhbnQpCisgKiBhbmQgImZyYWcuIG5lZWQiIChicmVha3MgUE1UVSBkaXNjb3ZlcnkpIGluIGljbXAuYy4KKyAqLworCit2b2lkIGlwX3J0X3NlbmRfcmVkaXJlY3Qoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcnRhYmxlICpydCA9IChzdHJ1Y3QgcnRhYmxlKilza2ItPmRzdDsKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBpbl9kZXZfZ2V0KHJ0LT51LmRzdC5kZXYpOworCisJaWYgKCFpbl9kZXYpCisJCXJldHVybjsKKworCWlmICghSU5fREVWX1RYX1JFRElSRUNUUyhpbl9kZXYpKQorCQlnb3RvIG91dDsKKworCS8qIE5vIHJlZGlyZWN0ZWQgcGFja2V0cyBkdXJpbmcgaXBfcnRfcmVkaXJlY3Rfc2lsZW5jZTsKKwkgKiByZXNldCB0aGUgYWxnb3JpdGhtLgorCSAqLworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHJ0LT51LmRzdC5yYXRlX2xhc3QgKyBpcF9ydF9yZWRpcmVjdF9zaWxlbmNlKSkKKwkJcnQtPnUuZHN0LnJhdGVfdG9rZW5zID0gMDsKKworCS8qIFRvbyBtYW55IGlnbm9yZWQgcmVkaXJlY3RzOyBkbyBub3Qgc2VuZCBhbnl0aGluZworCSAqIHNldCB1LmRzdC5yYXRlX2xhc3QgdG8gdGhlIGxhc3Qgc2VlbiByZWRpcmVjdGVkIHBhY2tldC4KKwkgKi8KKwlpZiAocnQtPnUuZHN0LnJhdGVfdG9rZW5zID49IGlwX3J0X3JlZGlyZWN0X251bWJlcikgeworCQlydC0+dS5kc3QucmF0ZV9sYXN0ID0gamlmZmllczsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQ2hlY2sgZm9yIGxvYWQgbGltaXQ7IHNldCByYXRlX2xhc3QgdG8gdGhlIGxhdGVzdCBzZW50CisJICogcmVkaXJlY3QuCisJICovCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywKKwkJICAgICAgIChydC0+dS5kc3QucmF0ZV9sYXN0ICsKKwkJCShpcF9ydF9yZWRpcmVjdF9sb2FkIDw8IHJ0LT51LmRzdC5yYXRlX3Rva2VucykpKSkgeworCQlpY21wX3NlbmQoc2tiLCBJQ01QX1JFRElSRUNULCBJQ01QX1JFRElSX0hPU1QsIHJ0LT5ydF9nYXRld2F5KTsKKwkJcnQtPnUuZHN0LnJhdGVfbGFzdCA9IGppZmZpZXM7CisJCSsrcnQtPnUuZHN0LnJhdGVfdG9rZW5zOworI2lmZGVmIENPTkZJR19JUF9ST1VURV9WRVJCT1NFCisJCWlmIChJTl9ERVZfTE9HX01BUlRJQU5TKGluX2RldikgJiYKKwkJICAgIHJ0LT51LmRzdC5yYXRlX3Rva2VucyA9PSBpcF9ydF9yZWRpcmVjdF9udW1iZXIgJiYKKwkJICAgIG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImhvc3QgJXUuJXUuJXUuJXUvaWYlZCBpZ25vcmVzICIKKwkJCQkicmVkaXJlY3RzIGZvciAldS4ldS4ldS4ldSB0byAldS4ldS4ldS4ldS5cbiIsCisJCQkJTklQUVVBRChydC0+cnRfc3JjKSwgcnQtPnJ0X2lpZiwKKwkJCQlOSVBRVUFEKHJ0LT5ydF9kc3QpLCBOSVBRVUFEKHJ0LT5ydF9nYXRld2F5KSk7CisjZW5kaWYKKwl9CitvdXQ6CisgICAgICAgIGluX2Rldl9wdXQoaW5fZGV2KTsKK30KKworc3RhdGljIGludCBpcF9lcnJvcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBydGFibGUgKnJ0ID0gKHN0cnVjdCBydGFibGUqKXNrYi0+ZHN0OworCXVuc2lnbmVkIGxvbmcgbm93OworCWludCBjb2RlOworCisJc3dpdGNoIChydC0+dS5kc3QuZXJyb3IpIHsKKwkJY2FzZSBFSU5WQUw6CisJCWRlZmF1bHQ6CisJCQlnb3RvIG91dDsKKwkJY2FzZSBFSE9TVFVOUkVBQ0g6CisJCQljb2RlID0gSUNNUF9IT1NUX1VOUkVBQ0g7CisJCQlicmVhazsKKwkJY2FzZSBFTkVUVU5SRUFDSDoKKwkJCWNvZGUgPSBJQ01QX05FVF9VTlJFQUNIOworCQkJYnJlYWs7CisJCWNhc2UgRUFDQ0VTOgorCQkJY29kZSA9IElDTVBfUEtUX0ZJTFRFUkVEOworCQkJYnJlYWs7CisJfQorCisJbm93ID0gamlmZmllczsKKwlydC0+dS5kc3QucmF0ZV90b2tlbnMgKz0gbm93IC0gcnQtPnUuZHN0LnJhdGVfbGFzdDsKKwlpZiAocnQtPnUuZHN0LnJhdGVfdG9rZW5zID4gaXBfcnRfZXJyb3JfYnVyc3QpCisJCXJ0LT51LmRzdC5yYXRlX3Rva2VucyA9IGlwX3J0X2Vycm9yX2J1cnN0OworCXJ0LT51LmRzdC5yYXRlX2xhc3QgPSBub3c7CisJaWYgKHJ0LT51LmRzdC5yYXRlX3Rva2VucyA+PSBpcF9ydF9lcnJvcl9jb3N0KSB7CisJCXJ0LT51LmRzdC5yYXRlX3Rva2VucyAtPSBpcF9ydF9lcnJvcl9jb3N0OworCQlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCwgY29kZSwgMCk7CisJfQorCitvdXQ6CWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfSAKKworLyoKKyAqCVRoZSBsYXN0IHR3byB2YWx1ZXMgYXJlIG5vdCBmcm9tIHRoZSBSRkMgYnV0CisgKglhcmUgbmVlZGVkIGZvciBBTVBSbmV0IEFYLjI1IHBhdGhzLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBtdHVfcGxhdGVhdVtdID0KK3szMjAwMCwgMTc5MTQsIDgxNjYsIDQzNTIsIDIwMDIsIDE0OTIsIDU3NiwgMjk2LCAyMTYsIDEyOCB9OworCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBzaG9ydCBndWVzc19tdHUodW5zaWduZWQgc2hvcnQgb2xkX210dSkKK3sKKwlpbnQgaTsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtdHVfcGxhdGVhdSk7IGkrKykKKwkJaWYgKG9sZF9tdHUgPiBtdHVfcGxhdGVhdVtpXSkKKwkJCXJldHVybiBtdHVfcGxhdGVhdVtpXTsKKwlyZXR1cm4gNjg7Cit9CisKK3Vuc2lnbmVkIHNob3J0IGlwX3J0X2ZyYWdfbmVlZGVkKHN0cnVjdCBpcGhkciAqaXBoLCB1bnNpZ25lZCBzaG9ydCBuZXdfbXR1KQoreworCWludCBpOworCXVuc2lnbmVkIHNob3J0IG9sZF9tdHUgPSBudG9ocyhpcGgtPnRvdF9sZW4pOworCXN0cnVjdCBydGFibGUgKnJ0aDsKKwl1MzIgIHNrZXlzWzJdID0geyBpcGgtPnNhZGRyLCAwLCB9OworCXUzMiAgZGFkZHIgPSBpcGgtPmRhZGRyOworCXU4ICAgdG9zID0gaXBoLT50b3MgJiBJUFRPU19SVF9NQVNLOworCXVuc2lnbmVkIHNob3J0IGVzdF9tdHUgPSAwOworCisJaWYgKGlwdjRfY29uZmlnLm5vX3BtdHVfZGlzYykKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXVuc2lnbmVkIGhhc2ggPSBydF9oYXNoX2NvZGUoZGFkZHIsIHNrZXlzW2ldLCB0b3MpOworCisJCXJjdV9yZWFkX2xvY2soKTsKKwkJZm9yIChydGggPSByY3VfZGVyZWZlcmVuY2UocnRfaGFzaF90YWJsZVtoYXNoXS5jaGFpbik7IHJ0aDsKKwkJICAgICBydGggPSByY3VfZGVyZWZlcmVuY2UocnRoLT51LnJ0X25leHQpKSB7CisJCQlpZiAocnRoLT5mbC5mbDRfZHN0ID09IGRhZGRyICYmCisJCQkgICAgcnRoLT5mbC5mbDRfc3JjID09IHNrZXlzW2ldICYmCisJCQkgICAgcnRoLT5ydF9kc3QgID09IGRhZGRyICYmCisJCQkgICAgcnRoLT5ydF9zcmMgID09IGlwaC0+c2FkZHIgJiYKKwkJCSAgICBydGgtPmZsLmZsNF90b3MgPT0gdG9zICYmCisJCQkgICAgcnRoLT5mbC5paWYgPT0gMCAmJgorCQkJICAgICEoZHN0X21ldHJpY19sb2NrZWQoJnJ0aC0+dS5kc3QsIFJUQVhfTVRVKSkpIHsKKwkJCQl1bnNpZ25lZCBzaG9ydCBtdHUgPSBuZXdfbXR1OworCisJCQkJaWYgKG5ld19tdHUgPCA2OCB8fCBuZXdfbXR1ID49IG9sZF9tdHUpIHsKKworCQkJCQkvKiBCU0QgNC4yIGNvbXBhdGliaWxpdHkgaGFjayA6LSggKi8KKwkJCQkJaWYgKG10dSA9PSAwICYmCisJCQkJCSAgICBvbGRfbXR1ID49IHJ0aC0+dS5kc3QubWV0cmljc1tSVEFYX01UVS0xXSAmJgorCQkJCQkgICAgb2xkX210dSA+PSA2OCArIChpcGgtPmlobCA8PCAyKSkKKwkJCQkJCW9sZF9tdHUgLT0gaXBoLT5paGwgPDwgMjsKKworCQkJCQltdHUgPSBndWVzc19tdHUob2xkX210dSk7CisJCQkJfQorCQkJCWlmIChtdHUgPD0gcnRoLT51LmRzdC5tZXRyaWNzW1JUQVhfTVRVLTFdKSB7CisJCQkJCWlmIChtdHUgPCBydGgtPnUuZHN0Lm1ldHJpY3NbUlRBWF9NVFUtMV0pIHsgCisJCQkJCQlkc3RfY29uZmlybSgmcnRoLT51LmRzdCk7CisJCQkJCQlpZiAobXR1IDwgaXBfcnRfbWluX3BtdHUpIHsKKwkJCQkJCQltdHUgPSBpcF9ydF9taW5fcG10dTsKKwkJCQkJCQlydGgtPnUuZHN0Lm1ldHJpY3NbUlRBWF9MT0NLLTFdIHw9CisJCQkJCQkJCSgxIDw8IFJUQVhfTVRVKTsKKwkJCQkJCX0KKwkJCQkJCXJ0aC0+dS5kc3QubWV0cmljc1tSVEFYX01UVS0xXSA9IG10dTsKKwkJCQkJCWRzdF9zZXRfZXhwaXJlcygmcnRoLT51LmRzdCwKKwkJCQkJCQlpcF9ydF9tdHVfZXhwaXJlcyk7CisJCQkJCX0KKwkJCQkJZXN0X210dSA9IG10dTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJfQorCXJldHVybiBlc3RfbXR1ID8gOiBuZXdfbXR1OworfQorCitzdGF0aWMgdm9pZCBpcF9ydF91cGRhdGVfcG10dShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHUzMiBtdHUpCit7CisJaWYgKGRzdC0+bWV0cmljc1tSVEFYX01UVS0xXSA+IG10dSAmJiBtdHUgPj0gNjggJiYKKwkgICAgIShkc3RfbWV0cmljX2xvY2tlZChkc3QsIFJUQVhfTVRVKSkpIHsKKwkJaWYgKG10dSA8IGlwX3J0X21pbl9wbXR1KSB7CisJCQltdHUgPSBpcF9ydF9taW5fcG10dTsKKwkJCWRzdC0+bWV0cmljc1tSVEFYX0xPQ0stMV0gfD0gKDEgPDwgUlRBWF9NVFUpOworCQl9CisJCWRzdC0+bWV0cmljc1tSVEFYX01UVS0xXSA9IG10dTsKKwkJZHN0X3NldF9leHBpcmVzKGRzdCwgaXBfcnRfbXR1X2V4cGlyZXMpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBkc3RfZW50cnkgKmlwdjRfZHN0X2NoZWNrKHN0cnVjdCBkc3RfZW50cnkgKmRzdCwgdTMyIGNvb2tpZSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgaXB2NF9kc3RfZGVzdHJveShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCit7CisJc3RydWN0IHJ0YWJsZSAqcnQgPSAoc3RydWN0IHJ0YWJsZSAqKSBkc3Q7CisJc3RydWN0IGluZXRfcGVlciAqcGVlciA9IHJ0LT5wZWVyOworCXN0cnVjdCBpbl9kZXZpY2UgKmlkZXYgPSBydC0+aWRldjsKKworCWlmIChwZWVyKSB7CisJCXJ0LT5wZWVyID0gTlVMTDsKKwkJaW5ldF9wdXRwZWVyKHBlZXIpOworCX0KKworCWlmIChpZGV2KSB7CisJCXJ0LT5pZGV2ID0gTlVMTDsKKwkJaW5fZGV2X3B1dChpZGV2KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlwdjRfZHN0X2lmZG93bihzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgaW50IGhvdykKK3sKKwlzdHJ1Y3QgcnRhYmxlICpydCA9IChzdHJ1Y3QgcnRhYmxlICopIGRzdDsKKwlzdHJ1Y3QgaW5fZGV2aWNlICppZGV2ID0gcnQtPmlkZXY7CisJaWYgKGRldiAhPSAmbG9vcGJhY2tfZGV2ICYmIGlkZXYgJiYgaWRldi0+ZGV2ID09IGRldikgeworCQlzdHJ1Y3QgaW5fZGV2aWNlICpsb29wYmFja19pZGV2ID0gaW5fZGV2X2dldCgmbG9vcGJhY2tfZGV2KTsKKwkJaWYgKGxvb3BiYWNrX2lkZXYpIHsKKwkJCXJ0LT5pZGV2ID0gbG9vcGJhY2tfaWRldjsKKwkJCWluX2Rldl9wdXQoaWRldik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlwdjRfbGlua19mYWlsdXJlKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHJ0YWJsZSAqcnQ7CisKKwlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCwgSUNNUF9IT1NUX1VOUkVBQ0gsIDApOworCisJcnQgPSAoc3RydWN0IHJ0YWJsZSAqKSBza2ItPmRzdDsKKwlpZiAocnQpCisJCWRzdF9zZXRfZXhwaXJlcygmcnQtPnUuZHN0LCAwKTsKK30KKworc3RhdGljIGludCBpcF9ydF9idWcoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiaXBfcnRfYnVnOiAldS4ldS4ldS4ldSAtPiAldS4ldS4ldS4ldSwgJXNcbiIsCisJCU5JUFFVQUQoc2tiLT5uaC5pcGgtPnNhZGRyKSwgTklQUVVBRChza2ItPm5oLmlwaC0+ZGFkZHIpLAorCQlza2ItPmRldiA/IHNrYi0+ZGV2LT5uYW1lIDogIj8iKTsKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAgIFdlIGRvIG5vdCBjYWNoZSBzb3VyY2UgYWRkcmVzcyBvZiBvdXRnb2luZyBpbnRlcmZhY2UsCisgICBiZWNhdXNlIGl0IGlzIHVzZWQgb25seSBieSBJUCBSUiwgVFMgYW5kIFNSUiBvcHRpb25zLAorICAgc28gdGhhdCBpdCBvdXQgb2YgZmFzdCBwYXRoLgorCisgICBCVFcgcmVtZW1iZXI6ICJhZGRyIiBpcyBhbGxvd2VkIHRvIGJlIG5vdCBhbGlnbmVkCisgICBpbiBJUCBvcHRpb25zIQorICovCisKK3ZvaWQgaXBfcnRfZ2V0X3NvdXJjZSh1OCAqYWRkciwgc3RydWN0IHJ0YWJsZSAqcnQpCit7CisJdTMyIHNyYzsKKwlzdHJ1Y3QgZmliX3Jlc3VsdCByZXM7CisKKwlpZiAocnQtPmZsLmlpZiA9PSAwKQorCQlzcmMgPSBydC0+cnRfc3JjOworCWVsc2UgaWYgKGZpYl9sb29rdXAoJnJ0LT5mbCwgJnJlcykgPT0gMCkgeworCQlzcmMgPSBGSUJfUkVTX1BSRUZTUkMocmVzKTsKKwkJZmliX3Jlc19wdXQoJnJlcyk7CisJfSBlbHNlCisJCXNyYyA9IGluZXRfc2VsZWN0X2FkZHIocnQtPnUuZHN0LmRldiwgcnQtPnJ0X2dhdGV3YXksCisJCQkJCVJUX1NDT1BFX1VOSVZFUlNFKTsKKwltZW1jcHkoYWRkciwgJnNyYywgNCk7Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19ST1VURQorc3RhdGljIHZvaWQgc2V0X2NsYXNzX3RhZyhzdHJ1Y3QgcnRhYmxlICpydCwgdTMyIHRhZykKK3sKKwlpZiAoIShydC0+dS5kc3QudGNsYXNzaWQgJiAweEZGRkYpKQorCQlydC0+dS5kc3QudGNsYXNzaWQgfD0gdGFnICYgMHhGRkZGOworCWlmICghKHJ0LT51LmRzdC50Y2xhc3NpZCAmIDB4RkZGRjAwMDApKQorCQlydC0+dS5kc3QudGNsYXNzaWQgfD0gdGFnICYgMHhGRkZGMDAwMDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBydF9zZXRfbmV4dGhvcChzdHJ1Y3QgcnRhYmxlICpydCwgc3RydWN0IGZpYl9yZXN1bHQgKnJlcywgdTMyIGl0YWcpCit7CisJc3RydWN0IGZpYl9pbmZvICpmaSA9IHJlcy0+Zmk7CisKKwlpZiAoZmkpIHsKKwkJaWYgKEZJQl9SRVNfR1coKnJlcykgJiYKKwkJICAgIEZJQl9SRVNfTkgoKnJlcykubmhfc2NvcGUgPT0gUlRfU0NPUEVfTElOSykKKwkJCXJ0LT5ydF9nYXRld2F5ID0gRklCX1JFU19HVygqcmVzKTsKKwkJbWVtY3B5KHJ0LT51LmRzdC5tZXRyaWNzLCBmaS0+ZmliX21ldHJpY3MsCisJCSAgICAgICBzaXplb2YocnQtPnUuZHN0Lm1ldHJpY3MpKTsKKwkJaWYgKGZpLT5maWJfbXR1ID09IDApIHsKKwkJCXJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfTVRVLTFdID0gcnQtPnUuZHN0LmRldi0+bXR1OworCQkJaWYgKHJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfTE9DSy0xXSAmICgxIDw8IFJUQVhfTVRVKSAmJgorCQkJICAgIHJ0LT5ydF9nYXRld2F5ICE9IHJ0LT5ydF9kc3QgJiYKKwkJCSAgICBydC0+dS5kc3QuZGV2LT5tdHUgPiA1NzYpCisJCQkJcnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9NVFUtMV0gPSA1NzY7CisJCX0KKyNpZmRlZiBDT05GSUdfTkVUX0NMU19ST1VURQorCQlydC0+dS5kc3QudGNsYXNzaWQgPSBGSUJfUkVTX05IKCpyZXMpLm5oX3RjbGFzc2lkOworI2VuZGlmCisJfSBlbHNlCisJCXJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfTVRVLTFdPSBydC0+dS5kc3QuZGV2LT5tdHU7CisKKwlpZiAocnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9IT1BMSU1JVC0xXSA9PSAwKQorCQlydC0+dS5kc3QubWV0cmljc1tSVEFYX0hPUExJTUlULTFdID0gc3lzY3RsX2lwX2RlZmF1bHRfdHRsOworCWlmIChydC0+dS5kc3QubWV0cmljc1tSVEFYX01UVS0xXSA+IElQX01BWF9NVFUpCisJCXJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfTVRVLTFdID0gSVBfTUFYX01UVTsKKwlpZiAocnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9BRFZNU1MtMV0gPT0gMCkKKwkJcnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9BRFZNU1MtMV0gPSBtYXhfdCh1bnNpZ25lZCBpbnQsIHJ0LT51LmRzdC5kZXYtPm10dSAtIDQwLAorCQkJCSAgICAgICBpcF9ydF9taW5fYWR2bXNzKTsKKwlpZiAocnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9BRFZNU1MtMV0gPiA2NTUzNSAtIDQwKQorCQlydC0+dS5kc3QubWV0cmljc1tSVEFYX0FEVk1TUy0xXSA9IDY1NTM1IC0gNDA7CisKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19ST1VURQorI2lmZGVmIENPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVMKKwlzZXRfY2xhc3NfdGFnKHJ0LCBmaWJfcnVsZXNfdGNsYXNzKHJlcykpOworI2VuZGlmCisJc2V0X2NsYXNzX3RhZyhydCwgaXRhZyk7CisjZW5kaWYKKyAgICAgICAgcnQtPnJ0X3R5cGUgPSByZXMtPnR5cGU7Cit9CisKK3N0YXRpYyBpbnQgaXBfcm91dGVfaW5wdXRfbWMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGRhZGRyLCB1MzIgc2FkZHIsCisJCQkJdTggdG9zLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgb3VyKQoreworCXVuc2lnbmVkIGhhc2g7CisJc3RydWN0IHJ0YWJsZSAqcnRoOworCXUzMiBzcGVjX2RzdDsKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBpbl9kZXZfZ2V0KGRldik7CisJdTMyIGl0YWcgPSAwOworCisJLyogUHJpbWFyeSBzYW5pdHkgY2hlY2tzLiAqLworCisJaWYgKGluX2RldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChNVUxUSUNBU1Qoc2FkZHIpIHx8IEJBRENMQVNTKHNhZGRyKSB8fCBMT09QQkFDSyhzYWRkcikgfHwKKwkgICAgc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF9JUCkpCisJCWdvdG8gZV9pbnZhbDsKKworCWlmIChaRVJPTkVUKHNhZGRyKSkgeworCQlpZiAoIUxPQ0FMX01DQVNUKGRhZGRyKSkKKwkJCWdvdG8gZV9pbnZhbDsKKwkJc3BlY19kc3QgPSBpbmV0X3NlbGVjdF9hZGRyKGRldiwgMCwgUlRfU0NPUEVfTElOSyk7CisJfSBlbHNlIGlmIChmaWJfdmFsaWRhdGVfc291cmNlKHNhZGRyLCAwLCB0b3MsIDAsCisJCQkJCWRldiwgJnNwZWNfZHN0LCAmaXRhZykgPCAwKQorCQlnb3RvIGVfaW52YWw7CisKKwlydGggPSBkc3RfYWxsb2MoJmlwdjRfZHN0X29wcyk7CisJaWYgKCFydGgpCisJCWdvdG8gZV9ub2J1ZnM7CisKKwlydGgtPnUuZHN0Lm91dHB1dD0gaXBfcnRfYnVnOworCisJYXRvbWljX3NldCgmcnRoLT51LmRzdC5fX3JlZmNudCwgMSk7CisJcnRoLT51LmRzdC5mbGFncz0gRFNUX0hPU1Q7CisJaWYgKGluX2Rldi0+Y25mLm5vX3BvbGljeSkKKwkJcnRoLT51LmRzdC5mbGFncyB8PSBEU1RfTk9QT0xJQ1k7CisJcnRoLT5mbC5mbDRfZHN0CT0gZGFkZHI7CisJcnRoLT5ydF9kc3QJPSBkYWRkcjsKKwlydGgtPmZsLmZsNF90b3MJPSB0b3M7CisjaWZkZWYgQ09ORklHX0lQX1JPVVRFX0ZXTUFSSworCXJ0aC0+ZmwuZmw0X2Z3bWFyaz0gc2tiLT5uZm1hcms7CisjZW5kaWYKKwlydGgtPmZsLmZsNF9zcmMJPSBzYWRkcjsKKwlydGgtPnJ0X3NyYwk9IHNhZGRyOworI2lmZGVmIENPTkZJR19ORVRfQ0xTX1JPVVRFCisJcnRoLT51LmRzdC50Y2xhc3NpZCA9IGl0YWc7CisjZW5kaWYKKwlydGgtPnJ0X2lpZgk9CisJcnRoLT5mbC5paWYJPSBkZXYtPmlmaW5kZXg7CisJcnRoLT51LmRzdC5kZXYJPSAmbG9vcGJhY2tfZGV2OworCWRldl9ob2xkKHJ0aC0+dS5kc3QuZGV2KTsKKwlydGgtPmlkZXYJPSBpbl9kZXZfZ2V0KHJ0aC0+dS5kc3QuZGV2KTsKKwlydGgtPmZsLm9pZgk9IDA7CisJcnRoLT5ydF9nYXRld2F5CT0gZGFkZHI7CisJcnRoLT5ydF9zcGVjX2RzdD0gc3BlY19kc3Q7CisJcnRoLT5ydF90eXBlCT0gUlROX01VTFRJQ0FTVDsKKwlydGgtPnJ0X2ZsYWdzCT0gUlRDRl9NVUxUSUNBU1Q7CisJaWYgKG91cikgeworCQlydGgtPnUuZHN0LmlucHV0PSBpcF9sb2NhbF9kZWxpdmVyOworCQlydGgtPnJ0X2ZsYWdzIHw9IFJUQ0ZfTE9DQUw7CisJfQorCisjaWZkZWYgQ09ORklHX0lQX01ST1VURQorCWlmICghTE9DQUxfTUNBU1QoZGFkZHIpICYmIElOX0RFVl9NRk9SV0FSRChpbl9kZXYpKQorCQlydGgtPnUuZHN0LmlucHV0ID0gaXBfbXJfaW5wdXQ7CisjZW5kaWYKKwlSVF9DQUNIRV9TVEFUX0lOQyhpbl9zbG93X21jKTsKKworCWluX2Rldl9wdXQoaW5fZGV2KTsKKwloYXNoID0gcnRfaGFzaF9jb2RlKGRhZGRyLCBzYWRkciBeIChkZXYtPmlmaW5kZXggPDwgNSksIHRvcyk7CisJcmV0dXJuIHJ0X2ludGVybl9oYXNoKGhhc2gsIHJ0aCwgKHN0cnVjdCBydGFibGUqKikgJnNrYi0+ZHN0KTsKKworZV9ub2J1ZnM6CisJaW5fZGV2X3B1dChpbl9kZXYpOworCXJldHVybiAtRU5PQlVGUzsKKworZV9pbnZhbDoKKwlpbl9kZXZfcHV0KGluX2Rldik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKworc3RhdGljIHZvaWQgaXBfaGFuZGxlX21hcnRpYW5fc291cmNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYsCisJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgdTMyIGRhZGRyLAorCQkJCSAgICAgdTMyIHNhZGRyKSAKK3sKKwlSVF9DQUNIRV9TVEFUX0lOQyhpbl9tYXJ0aWFuX3NyYyk7CisjaWZkZWYgQ09ORklHX0lQX1JPVVRFX1ZFUkJPU0UKKwlpZiAoSU5fREVWX0xPR19NQVJUSUFOUyhpbl9kZXYpICYmIG5ldF9yYXRlbGltaXQoKSkgeworCQkvKgorCQkgKglSRkMxODEyIHJlY29tbWVuZGF0aW9uLCBpZiBzb3VyY2UgaXMgbWFydGlhbiwKKwkJICoJdGhlIG9ubHkgaGludCBpcyBNQUMgaGVhZGVyLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWFydGlhbiBzb3VyY2UgJXUuJXUuJXUuJXUgZnJvbSAiCisJCQkiJXUuJXUuJXUuJXUsIG9uIGRldiAlc1xuIiwKKwkJCU5JUFFVQUQoZGFkZHIpLCBOSVBRVUFEKHNhZGRyKSwgZGV2LT5uYW1lKTsKKwkJaWYgKGRldi0+aGFyZF9oZWFkZXJfbGVuKSB7CisJCQlpbnQgaTsKKwkJCXVuc2lnbmVkIGNoYXIgKnAgPSBza2ItPm1hYy5yYXc7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJsbCBoZWFkZXI6ICIpOworCQkJZm9yIChpID0gMDsgaSA8IGRldi0+aGFyZF9oZWFkZXJfbGVuOyBpKyssIHArKykgeworCQkJCXByaW50aygiJTAyeCIsICpwKTsKKwkJCQlpZiAoaSA8IChkZXYtPmhhcmRfaGVhZGVyX2xlbiAtIDEpKQorCQkJCQlwcmludGsoIjoiKTsKKwkJCX0KKwkJCXByaW50aygiXG4iKTsKKwkJfQorCX0KKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGludCBfX21rcm91dGVfaW5wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgCisJCQkJICBzdHJ1Y3QgZmliX3Jlc3VsdCogcmVzLCAKKwkJCQkgIHN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiwgCisJCQkJICB1MzIgZGFkZHIsIHUzMiBzYWRkciwgdTMyIHRvcywgCisJCQkJICBzdHJ1Y3QgcnRhYmxlICoqcmVzdWx0KSAKK3sKKworCXN0cnVjdCBydGFibGUgKnJ0aDsKKwlpbnQgZXJyOworCXN0cnVjdCBpbl9kZXZpY2UgKm91dF9kZXY7CisJdW5zaWduZWQgZmxhZ3MgPSAwOworCXUzMiBzcGVjX2RzdCwgaXRhZzsKKworCS8qIGdldCBhIHdvcmtpbmcgcmVmZXJlbmNlIHRvIHRoZSBvdXRwdXQgZGV2aWNlICovCisJb3V0X2RldiA9IGluX2Rldl9nZXQoRklCX1JFU19ERVYoKnJlcykpOworCWlmIChvdXRfZGV2ID09IE5VTEwpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX0NSSVQgIkJ1ZyBpbiBpcF9yb3V0ZV9pbnB1dCIgXAorCQkJICAgICAgICJfc2xvdygpLiBQbGVhc2UsIHJlcG9ydFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCisJZXJyID0gZmliX3ZhbGlkYXRlX3NvdXJjZShzYWRkciwgZGFkZHIsIHRvcywgRklCX1JFU19PSUYoKnJlcyksIAorCQkJCSAgaW5fZGV2LT5kZXYsICZzcGVjX2RzdCwgJml0YWcpOworCWlmIChlcnIgPCAwKSB7CisJCWlwX2hhbmRsZV9tYXJ0aWFuX3NvdXJjZShpbl9kZXYtPmRldiwgaW5fZGV2LCBza2IsIGRhZGRyLCAKKwkJCQkJIHNhZGRyKTsKKwkJCisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlpZiAoZXJyKQorCQlmbGFncyB8PSBSVENGX0RJUkVDVFNSQzsKKworCWlmIChvdXRfZGV2ID09IGluX2RldiAmJiBlcnIgJiYgIShmbGFncyAmIChSVENGX05BVCB8IFJUQ0ZfTUFTUSkpICYmCisJICAgIChJTl9ERVZfU0hBUkVEX01FRElBKG91dF9kZXYpIHx8CisJICAgICBpbmV0X2FkZHJfb25saW5rKG91dF9kZXYsIHNhZGRyLCBGSUJfUkVTX0dXKCpyZXMpKSkpCisJCWZsYWdzIHw9IFJUQ0ZfRE9SRURJUkVDVDsKKworCWlmIChza2ItPnByb3RvY29sICE9IGh0b25zKEVUSF9QX0lQKSkgeworCQkvKiBOb3QgSVAgKGkuZS4gQVJQKS4gRG8gbm90IGNyZWF0ZSByb3V0ZSwgaWYgaXQgaXMKKwkJICogaW52YWxpZCBmb3IgcHJveHkgYXJwLiBETkFUIHJvdXRlcyBhcmUgYWx3YXlzIHZhbGlkLgorCQkgKi8KKwkJaWYgKG91dF9kZXYgPT0gaW5fZGV2ICYmICEoZmxhZ3MgJiBSVENGX0ROQVQpKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBjbGVhbnVwOworCQl9CisJfQorCisKKwlydGggPSBkc3RfYWxsb2MoJmlwdjRfZHN0X29wcyk7CisJaWYgKCFydGgpIHsKKwkJZXJyID0gLUVOT0JVRlM7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlydGgtPnUuZHN0LmZsYWdzPSBEU1RfSE9TVDsKKyNpZmRlZiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIX0NBQ0hFRAorCWlmIChyZXMtPmZpLT5maWJfbmhzID4gMSkKKwkJcnRoLT51LmRzdC5mbGFncyB8PSBEU1RfQkFMQU5DRUQ7CisjZW5kaWYKKwlpZiAoaW5fZGV2LT5jbmYubm9fcG9saWN5KQorCQlydGgtPnUuZHN0LmZsYWdzIHw9IERTVF9OT1BPTElDWTsKKwlpZiAoaW5fZGV2LT5jbmYubm9feGZybSkKKwkJcnRoLT51LmRzdC5mbGFncyB8PSBEU1RfTk9YRlJNOworCXJ0aC0+ZmwuZmw0X2RzdAk9IGRhZGRyOworCXJ0aC0+cnRfZHN0CT0gZGFkZHI7CisJcnRoLT5mbC5mbDRfdG9zCT0gdG9zOworI2lmZGVmIENPTkZJR19JUF9ST1VURV9GV01BUksKKwlydGgtPmZsLmZsNF9md21hcms9IHNrYi0+bmZtYXJrOworI2VuZGlmCisJcnRoLT5mbC5mbDRfc3JjCT0gc2FkZHI7CisJcnRoLT5ydF9zcmMJPSBzYWRkcjsKKwlydGgtPnJ0X2dhdGV3YXkJPSBkYWRkcjsKKwlydGgtPnJ0X2lpZiAJPQorCQlydGgtPmZsLmlpZgk9IGluX2Rldi0+ZGV2LT5pZmluZGV4OworCXJ0aC0+dS5kc3QuZGV2CT0gKG91dF9kZXYpLT5kZXY7CisJZGV2X2hvbGQocnRoLT51LmRzdC5kZXYpOworCXJ0aC0+aWRldgk9IGluX2Rldl9nZXQocnRoLT51LmRzdC5kZXYpOworCXJ0aC0+Zmwub2lmIAk9IDA7CisJcnRoLT5ydF9zcGVjX2RzdD0gc3BlY19kc3Q7CisKKwlydGgtPnUuZHN0LmlucHV0ID0gaXBfZm9yd2FyZDsKKwlydGgtPnUuZHN0Lm91dHB1dCA9IGlwX291dHB1dDsKKworCXJ0X3NldF9uZXh0aG9wKHJ0aCwgcmVzLCBpdGFnKTsKKworCXJ0aC0+cnRfZmxhZ3MgPSBmbGFnczsKKworCSpyZXN1bHQgPSBydGg7CisJZXJyID0gMDsKKyBjbGVhbnVwOgorCS8qIHJlbGVhc2UgdGhlIHdvcmtpbmcgcmVmZXJlbmNlIHRvIHRoZSBvdXRwdXQgZGV2aWNlICovCisJaW5fZGV2X3B1dChvdXRfZGV2KTsKKwlyZXR1cm4gZXJyOworfQkJCQkJCQorCitzdGF0aWMgaW5saW5lIGludCBpcF9ta3JvdXRlX2lucHV0X2RlZihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAKKwkJCQkgICAgICAgc3RydWN0IGZpYl9yZXN1bHQqIHJlcywgCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBmbG93aSAqZmwsCisJCQkJICAgICAgIHN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiwKKwkJCQkgICAgICAgdTMyIGRhZGRyLCB1MzIgc2FkZHIsIHUzMiB0b3MpCit7CisJc3RydWN0IHJ0YWJsZSogcnRoOworCWludCBlcnI7CisJdW5zaWduZWQgaGFzaDsKKworI2lmZGVmIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEgKKwlpZiAocmVzLT5maSAmJiByZXMtPmZpLT5maWJfbmhzID4gMSAmJiBmbC0+b2lmID09IDApCisJCWZpYl9zZWxlY3RfbXVsdGlwYXRoKGZsLCByZXMpOworI2VuZGlmCisKKwkvKiBjcmVhdGUgYSByb3V0aW5nIGNhY2hlIGVudHJ5ICovCisJZXJyID0gX19ta3JvdXRlX2lucHV0KHNrYiwgcmVzLCBpbl9kZXYsIGRhZGRyLCBzYWRkciwgdG9zLCAmcnRoKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWF0b21pY19zZXQoJnJ0aC0+dS5kc3QuX19yZWZjbnQsIDEpOworCisJLyogcHV0IGl0IGludG8gdGhlIGNhY2hlICovCisJaGFzaCA9IHJ0X2hhc2hfY29kZShkYWRkciwgc2FkZHIgXiAoZmwtPmlpZiA8PCA1KSwgdG9zKTsKKwlyZXR1cm4gcnRfaW50ZXJuX2hhc2goaGFzaCwgcnRoLCAoc3RydWN0IHJ0YWJsZSoqKSZza2ItPmRzdCk7CQorfQorCitzdGF0aWMgaW5saW5lIGludCBpcF9ta3JvdXRlX2lucHV0KHN0cnVjdCBza19idWZmICpza2IsIAorCQkJCSAgIHN0cnVjdCBmaWJfcmVzdWx0KiByZXMsIAorCQkJCSAgIGNvbnN0IHN0cnVjdCBmbG93aSAqZmwsCisJCQkJICAgc3RydWN0IGluX2RldmljZSAqaW5fZGV2LAorCQkJCSAgIHUzMiBkYWRkciwgdTMyIHNhZGRyLCB1MzIgdG9zKQoreworI2lmZGVmIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEhfQ0FDSEVECisJc3RydWN0IHJ0YWJsZSogcnRoOworCXVuc2lnbmVkIGNoYXIgaG9wLCBob3Bjb3VudCwgbGFzdGhvcDsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKwl1bnNpZ25lZCBpbnQgaGFzaDsKKworCWlmIChyZXMtPmZpKQorCQlob3Bjb3VudCA9IHJlcy0+ZmktPmZpYl9uaHM7CisJZWxzZQorCQlob3Bjb3VudCA9IDE7CisKKwlsYXN0aG9wID0gaG9wY291bnQgLSAxOworCisJLyogZGlzdGluZ3Vpc2ggYmV0d2VlbiBtdWx0aXBhdGggYW5kIHNpbmdsZXBhdGggKi8KKwlpZiAoaG9wY291bnQgPCAyKQorCQlyZXR1cm4gaXBfbWtyb3V0ZV9pbnB1dF9kZWYoc2tiLCByZXMsIGZsLCBpbl9kZXYsIGRhZGRyLAorCQkJCQkgICAgc2FkZHIsIHRvcyk7CisJCisJLyogYWRkIGFsbCBhbHRlcm5hdGl2ZXMgdG8gdGhlIHJvdXRpbmcgY2FjaGUgKi8KKwlmb3IgKGhvcCA9IDA7IGhvcCA8IGhvcGNvdW50OyBob3ArKykgeworCQlyZXMtPm5oX3NlbCA9IGhvcDsKKworCQkvKiBjcmVhdGUgYSByb3V0aW5nIGNhY2hlIGVudHJ5ICovCisJCWVyciA9IF9fbWtyb3V0ZV9pbnB1dChza2IsIHJlcywgaW5fZGV2LCBkYWRkciwgc2FkZHIsIHRvcywKKwkJCQkgICAgICAmcnRoKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJLyogcHV0IGl0IGludG8gdGhlIGNhY2hlICovCisJCWhhc2ggPSBydF9oYXNoX2NvZGUoZGFkZHIsIHNhZGRyIF4gKGZsLT5paWYgPDwgNSksIHRvcyk7CisJCWVyciA9IHJ0X2ludGVybl9oYXNoKGhhc2gsIHJ0aCwgKHN0cnVjdCBydGFibGUqKikmc2tiLT5kc3QpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQkvKiBmb3J3YXJkIGhvcCBpbmZvcm1hdGlvbiB0byBtdWx0aXBhdGggaW1wbC4gKi8KKwkJbXVsdGlwYXRoX3NldF9uaGluZm8ocnRoLAorCQkJCSAgICAgRklCX1JFU19ORVRXT1JLKCpyZXMpLAorCQkJCSAgICAgRklCX1JFU19ORVRNQVNLKCpyZXMpLAorCQkJCSAgICAgcmVzLT5wcmVmaXhsZW4sCisJCQkJICAgICAmRklCX1JFU19OSCgqcmVzKSk7CisKKwkJLyogb25seSBmb3IgdGhlIGxhc3QgaG9wIHRoZSByZWZlcmVuY2UgY291bnQgaXMgaGFuZGxlZAorCQkgKiBvdXRzaWRlCisJCSAqLworCQlpZiAoaG9wID09IGxhc3Rob3ApCisJCQlhdG9taWNfc2V0KCYoc2tiLT5kc3QtPl9fcmVmY250KSwgMSk7CisJfQorCXJldHVybiBlcnI7CisjZWxzZSAvKiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIX0NBQ0hFRCAgKi8KKwlyZXR1cm4gaXBfbWtyb3V0ZV9pbnB1dF9kZWYoc2tiLCByZXMsIGZsLCBpbl9kZXYsIGRhZGRyLCBzYWRkciwgdG9zKTsKKyNlbmRpZiAvKiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIX0NBQ0hFRCAgKi8KK30KKworCisvKgorICoJTk9URS4gV2UgZHJvcCBhbGwgdGhlIHBhY2tldHMgdGhhdCBoYXMgbG9jYWwgc291cmNlCisgKglhZGRyZXNzZXMsIGJlY2F1c2UgZXZlcnkgcHJvcGVybHkgbG9vcGVkIGJhY2sgcGFja2V0CisgKgltdXN0IGhhdmUgY29ycmVjdCBkZXN0aW5hdGlvbiBhbHJlYWR5IGF0dGFjaGVkIGJ5IG91dHB1dCByb3V0aW5lLgorICoKKyAqCVN1Y2ggYXBwcm9hY2ggc29sdmVzIHR3byBiaWcgcHJvYmxlbXM6CisgKgkxLiBOb3Qgc2ltcGxleCBkZXZpY2VzIGFyZSBoYW5kbGVkIHByb3Blcmx5LgorICoJMi4gSVAgc3Bvb2ZpbmcgYXR0ZW1wdHMgYXJlIGZpbHRlcmVkIHdpdGggMTAwJSBvZiBndWFyYW50ZWUuCisgKi8KKworc3RhdGljIGludCBpcF9yb3V0ZV9pbnB1dF9zbG93KHN0cnVjdCBza19idWZmICpza2IsIHUzMiBkYWRkciwgdTMyIHNhZGRyLAorCQkJICAgICAgIHU4IHRvcywgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmliX3Jlc3VsdCByZXM7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gaW5fZGV2X2dldChkZXYpOworCXN0cnVjdCBmbG93aSBmbCA9IHsgLm5sX3UgPSB7IC5pcDRfdSA9CisJCQkJICAgICAgeyAuZGFkZHIgPSBkYWRkciwKKwkJCQkJLnNhZGRyID0gc2FkZHIsCisJCQkJCS50b3MgPSB0b3MsCisJCQkJCS5zY29wZSA9IFJUX1NDT1BFX1VOSVZFUlNFLAorI2lmZGVmIENPTkZJR19JUF9ST1VURV9GV01BUksKKwkJCQkJLmZ3bWFyayA9IHNrYi0+bmZtYXJrCisjZW5kaWYKKwkJCQkgICAgICB9IH0sCisJCQkgICAgLmlpZiA9IGRldi0+aWZpbmRleCB9OworCXVuc2lnbmVkCWZsYWdzID0gMDsKKwl1MzIJCWl0YWcgPSAwOworCXN0cnVjdCBydGFibGUgKiBydGg7CisJdW5zaWduZWQJaGFzaDsKKwl1MzIJCXNwZWNfZHN0OworCWludAkJZXJyID0gLUVJTlZBTDsKKwlpbnQJCWZyZWVfcmVzID0gMDsKKworCS8qIElQIG9uIHRoaXMgZGV2aWNlIGlzIGRpc2FibGVkLiAqLworCisJaWYgKCFpbl9kZXYpCisJCWdvdG8gb3V0OworCisJLyogQ2hlY2sgZm9yIHRoZSBtb3N0IHdlaXJkIG1hcnRpYW5zLCB3aGljaCBjYW4gYmUgbm90IGRldGVjdGVkCisJICAgYnkgZmliX2xvb2t1cC4KKwkgKi8KKworCWlmIChNVUxUSUNBU1Qoc2FkZHIpIHx8IEJBRENMQVNTKHNhZGRyKSB8fCBMT09QQkFDSyhzYWRkcikpCisJCWdvdG8gbWFydGlhbl9zb3VyY2U7CisKKwlpZiAoZGFkZHIgPT0gMHhGRkZGRkZGRiB8fCAoc2FkZHIgPT0gMCAmJiBkYWRkciA9PSAwKSkKKwkJZ290byBicmRfaW5wdXQ7CisKKwkvKiBBY2NlcHQgemVybyBhZGRyZXNzZXMgb25seSB0byBsaW1pdGVkIGJyb2FkY2FzdDsKKwkgKiBJIGV2ZW4gZG8gbm90IGtub3cgdG8gZml4IGl0IG9yIG5vdC4gV2FpdGluZyBmb3IgY29tcGxhaW5zIDotKQorCSAqLworCWlmIChaRVJPTkVUKHNhZGRyKSkKKwkJZ290byBtYXJ0aWFuX3NvdXJjZTsKKworCWlmIChCQURDTEFTUyhkYWRkcikgfHwgWkVST05FVChkYWRkcikgfHwgTE9PUEJBQ0soZGFkZHIpKQorCQlnb3RvIG1hcnRpYW5fZGVzdGluYXRpb247CisKKwkvKgorCSAqCU5vdyB3ZSBhcmUgcmVhZHkgdG8gcm91dGUgcGFja2V0LgorCSAqLworCWlmICgoZXJyID0gZmliX2xvb2t1cCgmZmwsICZyZXMpKSAhPSAwKSB7CisJCWlmICghSU5fREVWX0ZPUldBUkQoaW5fZGV2KSkKKwkJCWdvdG8gZV9pbnZhbDsKKwkJZ290byBub19yb3V0ZTsKKwl9CisJZnJlZV9yZXMgPSAxOworCisJUlRfQ0FDSEVfU1RBVF9JTkMoaW5fc2xvd190b3QpOworCisJaWYgKHJlcy50eXBlID09IFJUTl9CUk9BRENBU1QpCisJCWdvdG8gYnJkX2lucHV0OworCisJaWYgKHJlcy50eXBlID09IFJUTl9MT0NBTCkgeworCQlpbnQgcmVzdWx0OworCQlyZXN1bHQgPSBmaWJfdmFsaWRhdGVfc291cmNlKHNhZGRyLCBkYWRkciwgdG9zLAorCQkJCQkgICAgIGxvb3BiYWNrX2Rldi5pZmluZGV4LAorCQkJCQkgICAgIGRldiwgJnNwZWNfZHN0LCAmaXRhZyk7CisJCWlmIChyZXN1bHQgPCAwKQorCQkJZ290byBtYXJ0aWFuX3NvdXJjZTsKKwkJaWYgKHJlc3VsdCkKKwkJCWZsYWdzIHw9IFJUQ0ZfRElSRUNUU1JDOworCQlzcGVjX2RzdCA9IGRhZGRyOworCQlnb3RvIGxvY2FsX2lucHV0OworCX0KKworCWlmICghSU5fREVWX0ZPUldBUkQoaW5fZGV2KSkKKwkJZ290byBlX2ludmFsOworCWlmIChyZXMudHlwZSAhPSBSVE5fVU5JQ0FTVCkKKwkJZ290byBtYXJ0aWFuX2Rlc3RpbmF0aW9uOworCisJZXJyID0gaXBfbWtyb3V0ZV9pbnB1dChza2IsICZyZXMsICZmbCwgaW5fZGV2LCBkYWRkciwgc2FkZHIsIHRvcyk7CisJaWYgKGVyciA9PSAtRU5PQlVGUykKKwkJZ290byBlX25vYnVmczsKKwlpZiAoZXJyID09IC1FSU5WQUwpCisJCWdvdG8gZV9pbnZhbDsKKwkKK2RvbmU6CisJaW5fZGV2X3B1dChpbl9kZXYpOworCWlmIChmcmVlX3JlcykKKwkJZmliX3Jlc19wdXQoJnJlcyk7CitvdXQ6CXJldHVybiBlcnI7CisKK2JyZF9pbnB1dDoKKwlpZiAoc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF9JUCkpCisJCWdvdG8gZV9pbnZhbDsKKworCWlmIChaRVJPTkVUKHNhZGRyKSkKKwkJc3BlY19kc3QgPSBpbmV0X3NlbGVjdF9hZGRyKGRldiwgMCwgUlRfU0NPUEVfTElOSyk7CisJZWxzZSB7CisJCWVyciA9IGZpYl92YWxpZGF0ZV9zb3VyY2Uoc2FkZHIsIDAsIHRvcywgMCwgZGV2LCAmc3BlY19kc3QsCisJCQkJCSAgJml0YWcpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gbWFydGlhbl9zb3VyY2U7CisJCWlmIChlcnIpCisJCQlmbGFncyB8PSBSVENGX0RJUkVDVFNSQzsKKwl9CisJZmxhZ3MgfD0gUlRDRl9CUk9BRENBU1Q7CisJcmVzLnR5cGUgPSBSVE5fQlJPQURDQVNUOworCVJUX0NBQ0hFX1NUQVRfSU5DKGluX2JyZCk7CisKK2xvY2FsX2lucHV0OgorCXJ0aCA9IGRzdF9hbGxvYygmaXB2NF9kc3Rfb3BzKTsKKwlpZiAoIXJ0aCkKKwkJZ290byBlX25vYnVmczsKKworCXJ0aC0+dS5kc3Qub3V0cHV0PSBpcF9ydF9idWc7CisKKwlhdG9taWNfc2V0KCZydGgtPnUuZHN0Ll9fcmVmY250LCAxKTsKKwlydGgtPnUuZHN0LmZsYWdzPSBEU1RfSE9TVDsKKwlpZiAoaW5fZGV2LT5jbmYubm9fcG9saWN5KQorCQlydGgtPnUuZHN0LmZsYWdzIHw9IERTVF9OT1BPTElDWTsKKwlydGgtPmZsLmZsNF9kc3QJPSBkYWRkcjsKKwlydGgtPnJ0X2RzdAk9IGRhZGRyOworCXJ0aC0+ZmwuZmw0X3Rvcwk9IHRvczsKKyNpZmRlZiBDT05GSUdfSVBfUk9VVEVfRldNQVJLCisJcnRoLT5mbC5mbDRfZndtYXJrPSBza2ItPm5mbWFyazsKKyNlbmRpZgorCXJ0aC0+ZmwuZmw0X3NyYwk9IHNhZGRyOworCXJ0aC0+cnRfc3JjCT0gc2FkZHI7CisjaWZkZWYgQ09ORklHX05FVF9DTFNfUk9VVEUKKwlydGgtPnUuZHN0LnRjbGFzc2lkID0gaXRhZzsKKyNlbmRpZgorCXJ0aC0+cnRfaWlmCT0KKwlydGgtPmZsLmlpZgk9IGRldi0+aWZpbmRleDsKKwlydGgtPnUuZHN0LmRldgk9ICZsb29wYmFja19kZXY7CisJZGV2X2hvbGQocnRoLT51LmRzdC5kZXYpOworCXJ0aC0+aWRldgk9IGluX2Rldl9nZXQocnRoLT51LmRzdC5kZXYpOworCXJ0aC0+cnRfZ2F0ZXdheQk9IGRhZGRyOworCXJ0aC0+cnRfc3BlY19kc3Q9IHNwZWNfZHN0OworCXJ0aC0+dS5kc3QuaW5wdXQ9IGlwX2xvY2FsX2RlbGl2ZXI7CisJcnRoLT5ydF9mbGFncyAJPSBmbGFnc3xSVENGX0xPQ0FMOworCWlmIChyZXMudHlwZSA9PSBSVE5fVU5SRUFDSEFCTEUpIHsKKwkJcnRoLT51LmRzdC5pbnB1dD0gaXBfZXJyb3I7CisJCXJ0aC0+dS5kc3QuZXJyb3I9IC1lcnI7CisJCXJ0aC0+cnRfZmxhZ3MgCSY9IH5SVENGX0xPQ0FMOworCX0KKwlydGgtPnJ0X3R5cGUJPSByZXMudHlwZTsKKwloYXNoID0gcnRfaGFzaF9jb2RlKGRhZGRyLCBzYWRkciBeIChmbC5paWYgPDwgNSksIHRvcyk7CisJZXJyID0gcnRfaW50ZXJuX2hhc2goaGFzaCwgcnRoLCAoc3RydWN0IHJ0YWJsZSoqKSZza2ItPmRzdCk7CisJZ290byBkb25lOworCitub19yb3V0ZToKKwlSVF9DQUNIRV9TVEFUX0lOQyhpbl9ub19yb3V0ZSk7CisJc3BlY19kc3QgPSBpbmV0X3NlbGVjdF9hZGRyKGRldiwgMCwgUlRfU0NPUEVfVU5JVkVSU0UpOworCXJlcy50eXBlID0gUlROX1VOUkVBQ0hBQkxFOworCWdvdG8gbG9jYWxfaW5wdXQ7CisKKwkvKgorCSAqCURvIG5vdCBjYWNoZSBtYXJ0aWFuIGFkZHJlc3NlczogdGhleSBzaG91bGQgYmUgbG9nZ2VkIChSRkMxODEyKQorCSAqLworbWFydGlhbl9kZXN0aW5hdGlvbjoKKwlSVF9DQUNIRV9TVEFUX0lOQyhpbl9tYXJ0aWFuX2RzdCk7CisjaWZkZWYgQ09ORklHX0lQX1JPVVRFX1ZFUkJPU0UKKwlpZiAoSU5fREVWX0xPR19NQVJUSUFOUyhpbl9kZXYpICYmIG5ldF9yYXRlbGltaXQoKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWFydGlhbiBkZXN0aW5hdGlvbiAldS4ldS4ldS4ldSBmcm9tICIKKwkJCSIldS4ldS4ldS4ldSwgZGV2ICVzXG4iLAorCQkJTklQUVVBRChkYWRkciksIE5JUFFVQUQoc2FkZHIpLCBkZXYtPm5hbWUpOworI2VuZGlmCitlX2ludmFsOgorCWVyciA9IC1FSU5WQUw7CisJZ290byBkb25lOworCitlX25vYnVmczoKKwllcnIgPSAtRU5PQlVGUzsKKwlnb3RvIGRvbmU7CisKK21hcnRpYW5fc291cmNlOgorCWlwX2hhbmRsZV9tYXJ0aWFuX3NvdXJjZShkZXYsIGluX2Rldiwgc2tiLCBkYWRkciwgc2FkZHIpOworCWdvdG8gZV9pbnZhbDsKK30KKworaW50IGlwX3JvdXRlX2lucHV0KHN0cnVjdCBza19idWZmICpza2IsIHUzMiBkYWRkciwgdTMyIHNhZGRyLAorCQkgICB1OCB0b3MsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0YWJsZSAqIHJ0aDsKKwl1bnNpZ25lZAloYXNoOworCWludCBpaWYgPSBkZXYtPmlmaW5kZXg7CisKKwl0b3MgJj0gSVBUT1NfUlRfTUFTSzsKKwloYXNoID0gcnRfaGFzaF9jb2RlKGRhZGRyLCBzYWRkciBeIChpaWYgPDwgNSksIHRvcyk7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJZm9yIChydGggPSByY3VfZGVyZWZlcmVuY2UocnRfaGFzaF90YWJsZVtoYXNoXS5jaGFpbik7IHJ0aDsKKwkgICAgIHJ0aCA9IHJjdV9kZXJlZmVyZW5jZShydGgtPnUucnRfbmV4dCkpIHsKKwkJaWYgKHJ0aC0+ZmwuZmw0X2RzdCA9PSBkYWRkciAmJgorCQkgICAgcnRoLT5mbC5mbDRfc3JjID09IHNhZGRyICYmCisJCSAgICBydGgtPmZsLmlpZiA9PSBpaWYgJiYKKwkJICAgIHJ0aC0+Zmwub2lmID09IDAgJiYKKyNpZmRlZiBDT05GSUdfSVBfUk9VVEVfRldNQVJLCisJCSAgICBydGgtPmZsLmZsNF9md21hcmsgPT0gc2tiLT5uZm1hcmsgJiYKKyNlbmRpZgorCQkgICAgcnRoLT5mbC5mbDRfdG9zID09IHRvcykgeworCQkJcnRoLT51LmRzdC5sYXN0dXNlID0gamlmZmllczsKKwkJCWRzdF9ob2xkKCZydGgtPnUuZHN0KTsKKwkJCXJ0aC0+dS5kc3QuX191c2UrKzsKKwkJCVJUX0NBQ0hFX1NUQVRfSU5DKGluX2hpdCk7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCXNrYi0+ZHN0ID0gKHN0cnVjdCBkc3RfZW50cnkqKXJ0aDsKKwkJCXJldHVybiAwOworCQl9CisJCVJUX0NBQ0hFX1NUQVRfSU5DKGluX2hsaXN0X3NlYXJjaCk7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJLyogTXVsdGljYXN0IHJlY29nbml0aW9uIGxvZ2ljIGlzIG1vdmVkIGZyb20gcm91dGUgY2FjaGUgdG8gaGVyZS4KKwkgICBUaGUgcHJvYmxlbSB3YXMgdGhhdCB0b28gbWFueSBFdGhlcm5ldCBjYXJkcyBoYXZlIGJyb2tlbi9taXNzaW5nCisJICAgaGFyZHdhcmUgbXVsdGljYXN0IGZpbHRlcnMgOi0oIEFzIHJlc3VsdCB0aGUgaG9zdCBvbiBtdWx0aWNhc3RpbmcKKwkgICBuZXR3b3JrIGFjcXVpcmVzIGEgbG90IG9mIHVzZWxlc3Mgcm91dGUgY2FjaGUgZW50cmllcywgc29ydCBvZgorCSAgIFNEUiBtZXNzYWdlcyBmcm9tIGFsbCB0aGUgd29ybGQuIE5vdyB3ZSB0cnkgdG8gZ2V0IHJpZCBvZiB0aGVtLgorCSAgIFJlYWxseSwgcHJvdmlkZWQgc29mdHdhcmUgSVAgbXVsdGljYXN0IGZpbHRlciBpcyBvcmdhbml6ZWQKKwkgICByZWFzb25hYmx5IChhdCBsZWFzdCwgaGFzaGVkKSwgaXQgZG9lcyBub3QgcmVzdWx0IGluIGEgc2xvd2Rvd24KKwkgICBjb21wYXJpbmcgd2l0aCByb3V0ZSBjYWNoZSByZWplY3QgZW50cmllcy4KKwkgICBOb3RlLCB0aGF0IG11bHRpY2FzdCByb3V0ZXJzIGFyZSBub3QgYWZmZWN0ZWQsIGJlY2F1c2UKKwkgICByb3V0ZSBjYWNoZSBlbnRyeSBpcyBjcmVhdGVkIGV2ZW50dWFsbHkuCisJICovCisJaWYgKE1VTFRJQ0FTVChkYWRkcikpIHsKKwkJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCisJCXJjdV9yZWFkX2xvY2soKTsKKwkJaWYgKChpbl9kZXYgPSBfX2luX2Rldl9nZXQoZGV2KSkgIT0gTlVMTCkgeworCQkJaW50IG91ciA9IGlwX2NoZWNrX21jKGluX2RldiwgZGFkZHIsIHNhZGRyLAorCQkJCXNrYi0+bmguaXBoLT5wcm90b2NvbCk7CisJCQlpZiAob3VyCisjaWZkZWYgQ09ORklHX0lQX01ST1VURQorCQkJICAgIHx8ICghTE9DQUxfTUNBU1QoZGFkZHIpICYmIElOX0RFVl9NRk9SV0FSRChpbl9kZXYpKQorI2VuZGlmCisJCQkgICAgKSB7CisJCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQkJcmV0dXJuIGlwX3JvdXRlX2lucHV0X21jKHNrYiwgZGFkZHIsIHNhZGRyLAorCQkJCQkJCSB0b3MsIGRldiwgb3VyKTsKKwkJCX0KKwkJfQorCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiBpcF9yb3V0ZV9pbnB1dF9zbG93KHNrYiwgZGFkZHIsIHNhZGRyLCB0b3MsIGRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fbWtyb3V0ZV9vdXRwdXQoc3RydWN0IHJ0YWJsZSAqKnJlc3VsdCwKKwkJCQkgICBzdHJ1Y3QgZmliX3Jlc3VsdCogcmVzLCAKKwkJCQkgICBjb25zdCBzdHJ1Y3QgZmxvd2kgKmZsLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBmbG93aSAqb2xkZmxwLCAKKwkJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X291dCwgCisJCQkJICAgdW5zaWduZWQgZmxhZ3MpIAoreworCXN0cnVjdCBydGFibGUgKnJ0aDsKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisJdTMyIHRvcyA9IFJUX0ZMX1RPUyhvbGRmbHApOworCWludCBlcnIgPSAwOworCisJaWYgKExPT1BCQUNLKGZsLT5mbDRfc3JjKSAmJiAhKGRldl9vdXQtPmZsYWdzJklGRl9MT09QQkFDSykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGZsLT5mbDRfZHN0ID09IDB4RkZGRkZGRkYpCisJCXJlcy0+dHlwZSA9IFJUTl9CUk9BRENBU1Q7CisJZWxzZSBpZiAoTVVMVElDQVNUKGZsLT5mbDRfZHN0KSkKKwkJcmVzLT50eXBlID0gUlROX01VTFRJQ0FTVDsKKwllbHNlIGlmIChCQURDTEFTUyhmbC0+Zmw0X2RzdCkgfHwgWkVST05FVChmbC0+Zmw0X2RzdCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGRldl9vdXQtPmZsYWdzICYgSUZGX0xPT1BCQUNLKQorCQlmbGFncyB8PSBSVENGX0xPQ0FMOworCisJLyogZ2V0IHdvcmsgcmVmZXJlbmNlIHRvIGluZXQgZGV2aWNlICovCisJaW5fZGV2ID0gaW5fZGV2X2dldChkZXZfb3V0KTsKKwlpZiAoIWluX2RldikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocmVzLT50eXBlID09IFJUTl9CUk9BRENBU1QpIHsKKwkJZmxhZ3MgfD0gUlRDRl9CUk9BRENBU1QgfCBSVENGX0xPQ0FMOworCQlpZiAocmVzLT5maSkgeworCQkJZmliX2luZm9fcHV0KHJlcy0+ZmkpOworCQkJcmVzLT5maSA9IE5VTEw7CisJCX0KKwl9IGVsc2UgaWYgKHJlcy0+dHlwZSA9PSBSVE5fTVVMVElDQVNUKSB7CisJCWZsYWdzIHw9IFJUQ0ZfTVVMVElDQVNUfFJUQ0ZfTE9DQUw7CisJCWlmICghaXBfY2hlY2tfbWMoaW5fZGV2LCBvbGRmbHAtPmZsNF9kc3QsIG9sZGZscC0+Zmw0X3NyYywgCisJCQkJIG9sZGZscC0+cHJvdG8pKQorCQkJZmxhZ3MgJj0gflJUQ0ZfTE9DQUw7CisJCS8qIElmIG11bHRpY2FzdCByb3V0ZSBkbyBub3QgZXhpc3QgdXNlCisJCSAgIGRlZmF1bHQgb25lLCBidXQgZG8gbm90IGdhdGV3YXkgaW4gdGhpcyBjYXNlLgorCQkgICBZZXMsIGl0IGlzIGhhY2suCisJCSAqLworCQlpZiAocmVzLT5maSAmJiByZXMtPnByZWZpeGxlbiA8IDQpIHsKKwkJCWZpYl9pbmZvX3B1dChyZXMtPmZpKTsKKwkJCXJlcy0+ZmkgPSBOVUxMOworCQl9CisJfQorCisKKwlydGggPSBkc3RfYWxsb2MoJmlwdjRfZHN0X29wcyk7CisJaWYgKCFydGgpIHsKKwkJZXJyID0gLUVOT0JVRlM7CisJCWdvdG8gY2xlYW51cDsKKwl9CQkKKworCXJ0aC0+dS5kc3QuZmxhZ3M9IERTVF9IT1NUOworI2lmZGVmIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEhfQ0FDSEVECisJaWYgKHJlcy0+ZmkpIHsKKwkJcnRoLT5ydF9tdWx0aXBhdGhfYWxnID0gcmVzLT5maS0+ZmliX21wX2FsZzsKKwkJaWYgKHJlcy0+ZmktPmZpYl9uaHMgPiAxKQorCQkJcnRoLT51LmRzdC5mbGFncyB8PSBEU1RfQkFMQU5DRUQ7CisJfQorI2VuZGlmCisJaWYgKGluX2Rldi0+Y25mLm5vX3hmcm0pCisJCXJ0aC0+dS5kc3QuZmxhZ3MgfD0gRFNUX05PWEZSTTsKKwlpZiAoaW5fZGV2LT5jbmYubm9fcG9saWN5KQorCQlydGgtPnUuZHN0LmZsYWdzIHw9IERTVF9OT1BPTElDWTsKKworCXJ0aC0+ZmwuZmw0X2RzdAk9IG9sZGZscC0+Zmw0X2RzdDsKKwlydGgtPmZsLmZsNF90b3MJPSB0b3M7CisJcnRoLT5mbC5mbDRfc3JjCT0gb2xkZmxwLT5mbDRfc3JjOworCXJ0aC0+Zmwub2lmCT0gb2xkZmxwLT5vaWY7CisjaWZkZWYgQ09ORklHX0lQX1JPVVRFX0ZXTUFSSworCXJ0aC0+ZmwuZmw0X2Z3bWFyaz0gb2xkZmxwLT5mbDRfZndtYXJrOworI2VuZGlmCisJcnRoLT5ydF9kc3QJPSBmbC0+Zmw0X2RzdDsKKwlydGgtPnJ0X3NyYwk9IGZsLT5mbDRfc3JjOworCXJ0aC0+cnRfaWlmCT0gb2xkZmxwLT5vaWYgPyA6IGRldl9vdXQtPmlmaW5kZXg7CisJLyogZ2V0IHJlZmVyZW5jZXMgdG8gdGhlIGRldmljZXMgdGhhdCBhcmUgdG8gYmUgaG9sZCBieSB0aGUgcm91dGluZyAKKwkgICBjYWNoZSBlbnRyeSAqLworCXJ0aC0+dS5kc3QuZGV2CT0gZGV2X291dDsKKwlkZXZfaG9sZChkZXZfb3V0KTsKKwlydGgtPmlkZXYJPSBpbl9kZXZfZ2V0KGRldl9vdXQpOworCXJ0aC0+cnRfZ2F0ZXdheSA9IGZsLT5mbDRfZHN0OworCXJ0aC0+cnRfc3BlY19kc3Q9IGZsLT5mbDRfc3JjOworCisJcnRoLT51LmRzdC5vdXRwdXQ9aXBfb3V0cHV0OworCisJUlRfQ0FDSEVfU1RBVF9JTkMob3V0X3Nsb3dfdG90KTsKKworCWlmIChmbGFncyAmIFJUQ0ZfTE9DQUwpIHsKKwkJcnRoLT51LmRzdC5pbnB1dCA9IGlwX2xvY2FsX2RlbGl2ZXI7CisJCXJ0aC0+cnRfc3BlY19kc3QgPSBmbC0+Zmw0X2RzdDsKKwl9CisJaWYgKGZsYWdzICYgKFJUQ0ZfQlJPQURDQVNUIHwgUlRDRl9NVUxUSUNBU1QpKSB7CisJCXJ0aC0+cnRfc3BlY19kc3QgPSBmbC0+Zmw0X3NyYzsKKwkJaWYgKGZsYWdzICYgUlRDRl9MT0NBTCAmJiAKKwkJICAgICEoZGV2X291dC0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spKSB7CisJCQlydGgtPnUuZHN0Lm91dHB1dCA9IGlwX21jX291dHB1dDsKKwkJCVJUX0NBQ0hFX1NUQVRfSU5DKG91dF9zbG93X21jKTsKKwkJfQorI2lmZGVmIENPTkZJR19JUF9NUk9VVEUKKwkJaWYgKHJlcy0+dHlwZSA9PSBSVE5fTVVMVElDQVNUKSB7CisJCQlpZiAoSU5fREVWX01GT1JXQVJEKGluX2RldikgJiYKKwkJCSAgICAhTE9DQUxfTUNBU1Qob2xkZmxwLT5mbDRfZHN0KSkgeworCQkJCXJ0aC0+dS5kc3QuaW5wdXQgPSBpcF9tcl9pbnB1dDsKKwkJCQlydGgtPnUuZHN0Lm91dHB1dCA9IGlwX21jX291dHB1dDsKKwkJCX0KKwkJfQorI2VuZGlmCisJfQorCisJcnRfc2V0X25leHRob3AocnRoLCByZXMsIDApOworCisJcnRoLT5ydF9mbGFncyA9IGZsYWdzOworCisJKnJlc3VsdCA9IHJ0aDsKKyBjbGVhbnVwOgorCS8qIHJlbGVhc2Ugd29yayByZWZlcmVuY2UgdG8gaW5ldCBkZXZpY2UgKi8KKwlpbl9kZXZfcHV0KGluX2Rldik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lIGludCBpcF9ta3JvdXRlX291dHB1dF9kZWYoc3RydWN0IHJ0YWJsZSAqKnJwLAorCQkJCQlzdHJ1Y3QgZmliX3Jlc3VsdCogcmVzLAorCQkJCQljb25zdCBzdHJ1Y3QgZmxvd2kgKmZsLAorCQkJCQljb25zdCBzdHJ1Y3QgZmxvd2kgKm9sZGZscCwKKwkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldl9vdXQsCisJCQkJCXVuc2lnbmVkIGZsYWdzKQoreworCXN0cnVjdCBydGFibGUgKnJ0aDsKKwlpbnQgZXJyID0gX19ta3JvdXRlX291dHB1dCgmcnRoLCByZXMsIGZsLCBvbGRmbHAsIGRldl9vdXQsIGZsYWdzKTsKKwl1bnNpZ25lZCBoYXNoOworCWlmIChlcnIgPT0gMCkgeworCQl1MzIgdG9zID0gUlRfRkxfVE9TKG9sZGZscCk7CisKKwkJYXRvbWljX3NldCgmcnRoLT51LmRzdC5fX3JlZmNudCwgMSk7CisJCQorCQloYXNoID0gcnRfaGFzaF9jb2RlKG9sZGZscC0+Zmw0X2RzdCwgCisJCQkJICAgIG9sZGZscC0+Zmw0X3NyYyBeIChvbGRmbHAtPm9pZiA8PCA1KSwgdG9zKTsKKwkJZXJyID0gcnRfaW50ZXJuX2hhc2goaGFzaCwgcnRoLCBycCk7CisJfQorCQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlwX21rcm91dGVfb3V0cHV0KHN0cnVjdCBydGFibGUqKiBycCwKKwkJCQkgICAgc3RydWN0IGZpYl9yZXN1bHQqIHJlcywKKwkJCQkgICAgY29uc3Qgc3RydWN0IGZsb3dpICpmbCwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGZsb3dpICpvbGRmbHAsCisJCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfb3V0LAorCQkJCSAgICB1bnNpZ25lZCBmbGFncykKK3sKKyNpZmRlZiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIX0NBQ0hFRAorCXUzMiB0b3MgPSBSVF9GTF9UT1Mob2xkZmxwKTsKKwl1bnNpZ25lZCBjaGFyIGhvcDsKKwl1bnNpZ25lZCBoYXNoOworCWludCBlcnIgPSAtRUlOVkFMOworCXN0cnVjdCBydGFibGUgKnJ0aDsKKworCWlmIChyZXMtPmZpICYmIHJlcy0+ZmktPmZpYl9uaHMgPiAxKSB7CisJCXVuc2lnbmVkIGNoYXIgaG9wY291bnQgPSByZXMtPmZpLT5maWJfbmhzOworCisJCWZvciAoaG9wID0gMDsgaG9wIDwgaG9wY291bnQ7IGhvcCsrKSB7CisJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2Mm5leHRob3A7CisKKwkJCXJlcy0+bmhfc2VsID0gaG9wOworCisJCQkvKiBob2xkIGEgd29yayByZWZlcmVuY2UgdG8gdGhlIG91dHB1dCBkZXZpY2UgKi8KKwkJCWRldjJuZXh0aG9wID0gRklCX1JFU19ERVYoKnJlcyk7CisJCQlkZXZfaG9sZChkZXYybmV4dGhvcCk7CisKKwkJCWVyciA9IF9fbWtyb3V0ZV9vdXRwdXQoJnJ0aCwgcmVzLCBmbCwgb2xkZmxwLAorCQkJCQkgICAgICAgZGV2Mm5leHRob3AsIGZsYWdzKTsKKworCQkJaWYgKGVyciAhPSAwKQorCQkJCWdvdG8gY2xlYW51cDsKKworCQkJaGFzaCA9IHJ0X2hhc2hfY29kZShvbGRmbHAtPmZsNF9kc3QsIAorCQkJCQkgICAgb2xkZmxwLT5mbDRfc3JjIF4KKwkJCQkJICAgIChvbGRmbHAtPm9pZiA8PCA1KSwgdG9zKTsKKwkJCWVyciA9IHJ0X2ludGVybl9oYXNoKGhhc2gsIHJ0aCwgcnApOworCisJCQkvKiBmb3J3YXJkIGhvcCBpbmZvcm1hdGlvbiB0byBtdWx0aXBhdGggaW1wbC4gKi8KKwkJCW11bHRpcGF0aF9zZXRfbmhpbmZvKHJ0aCwKKwkJCQkJICAgICBGSUJfUkVTX05FVFdPUksoKnJlcyksCisJCQkJCSAgICAgRklCX1JFU19ORVRNQVNLKCpyZXMpLAorCQkJCQkgICAgIHJlcy0+cHJlZml4bGVuLAorCQkJCQkgICAgICZGSUJfUkVTX05IKCpyZXMpKTsKKwkJY2xlYW51cDoKKwkJCS8qIHJlbGVhc2Ugd29yayByZWZlcmVuY2UgdG8gb3V0cHV0IGRldmljZSAqLworCQkJZGV2X3B1dChkZXYybmV4dGhvcCk7CisKKwkJCWlmIChlcnIgIT0gMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJCWF0b21pY19zZXQoJigqcnApLT51LmRzdC5fX3JlZmNudCwgMSk7CisJCXJldHVybiBlcnI7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGlwX21rcm91dGVfb3V0cHV0X2RlZihycCwgcmVzLCBmbCwgb2xkZmxwLCBkZXZfb3V0LAorCQkJCQkgICAgIGZsYWdzKTsKKwl9CisjZWxzZSAvKiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIX0NBQ0hFRCAqLworCXJldHVybiBpcF9ta3JvdXRlX291dHB1dF9kZWYocnAsIHJlcywgZmwsIG9sZGZscCwgZGV2X291dCwgZmxhZ3MpOworI2VuZGlmCit9CisKKy8qCisgKiBNYWpvciByb3V0ZSByZXNvbHZlciByb3V0aW5lLgorICovCisKK3N0YXRpYyBpbnQgaXBfcm91dGVfb3V0cHV0X3Nsb3coc3RydWN0IHJ0YWJsZSAqKnJwLCBjb25zdCBzdHJ1Y3QgZmxvd2kgKm9sZGZscCkKK3sKKwl1MzIgdG9zCT0gUlRfRkxfVE9TKG9sZGZscCk7CisJc3RydWN0IGZsb3dpIGZsID0geyAubmxfdSA9IHsgLmlwNF91ID0KKwkJCQkgICAgICB7IC5kYWRkciA9IG9sZGZscC0+Zmw0X2RzdCwKKwkJCQkJLnNhZGRyID0gb2xkZmxwLT5mbDRfc3JjLAorCQkJCQkudG9zID0gdG9zICYgSVBUT1NfUlRfTUFTSywKKwkJCQkJLnNjb3BlID0gKCh0b3MgJiBSVE9fT05MSU5LKSA/CisJCQkJCQkgIFJUX1NDT1BFX0xJTksgOgorCQkJCQkJICBSVF9TQ09QRV9VTklWRVJTRSksCisjaWZkZWYgQ09ORklHX0lQX1JPVVRFX0ZXTUFSSworCQkJCQkuZndtYXJrID0gb2xkZmxwLT5mbDRfZndtYXJrCisjZW5kaWYKKwkJCQkgICAgICB9IH0sCisJCQkgICAgLmlpZiA9IGxvb3BiYWNrX2Rldi5pZmluZGV4LAorCQkJICAgIC5vaWYgPSBvbGRmbHAtPm9pZiB9OworCXN0cnVjdCBmaWJfcmVzdWx0IHJlczsKKwl1bnNpZ25lZCBmbGFncyA9IDA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldl9vdXQgPSBOVUxMOworCWludCBmcmVlX3JlcyA9IDA7CisJaW50IGVycjsKKworCisJcmVzLmZpCQk9IE5VTEw7CisjaWZkZWYgQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUworCXJlcy5yCQk9IE5VTEw7CisjZW5kaWYKKworCWlmIChvbGRmbHAtPmZsNF9zcmMpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJaWYgKE1VTFRJQ0FTVChvbGRmbHAtPmZsNF9zcmMpIHx8CisJCSAgICBCQURDTEFTUyhvbGRmbHAtPmZsNF9zcmMpIHx8CisJCSAgICBaRVJPTkVUKG9sZGZscC0+Zmw0X3NyYykpCisJCQlnb3RvIG91dDsKKworCQkvKiBJdCBpcyBlcXVpdmFsZW50IHRvIGluZXRfYWRkcl90eXBlKHNhZGRyKSA9PSBSVE5fTE9DQUwgKi8KKwkJZGV2X291dCA9IGlwX2Rldl9maW5kKG9sZGZscC0+Zmw0X3NyYyk7CisJCWlmIChkZXZfb3V0ID09IE5VTEwpCisJCQlnb3RvIG91dDsKKworCQkvKiBJIHJlbW92ZWQgY2hlY2sgZm9yIG9pZiA9PSBkZXZfb3V0LT5vaWYgaGVyZS4KKwkJICAgSXQgd2FzIHdyb25nIGZvciB0d28gcmVhc29uczoKKwkJICAgMS4gaXBfZGV2X2ZpbmQoc2FkZHIpIGNhbiByZXR1cm4gd3JvbmcgaWZhY2UsIGlmIHNhZGRyIGlzCisJCSAgICAgIGFzc2lnbmVkIHRvIG11bHRpcGxlIGludGVyZmFjZXMuCisJCSAgIDIuIE1vcmVvdmVyLCB3ZSBhcmUgYWxsb3dlZCB0byBzZW5kIHBhY2tldHMgd2l0aCBzYWRkcgorCQkgICAgICBvZiBhbm90aGVyIGlmYWNlLiAtLUFOSworCQkgKi8KKworCQlpZiAob2xkZmxwLT5vaWYgPT0gMAorCQkgICAgJiYgKE1VTFRJQ0FTVChvbGRmbHAtPmZsNF9kc3QpIHx8IG9sZGZscC0+Zmw0X2RzdCA9PSAweEZGRkZGRkZGKSkgeworCQkJLyogU3BlY2lhbCBoYWNrOiB1c2VyIGNhbiBkaXJlY3QgbXVsdGljYXN0cworCQkJICAgYW5kIGxpbWl0ZWQgYnJvYWRjYXN0IHZpYSBuZWNlc3NhcnkgaW50ZXJmYWNlCisJCQkgICB3aXRob3V0IGZpZGRsaW5nIHdpdGggSVBfTVVMVElDQVNUX0lGIG9yIElQX1BLVElORk8uCisJCQkgICBUaGlzIGhhY2sgaXMgbm90IGp1c3QgZm9yIGZ1biwgaXQgYWxsb3dzCisJCQkgICB2aWMsdmF0IGFuZCBmcmllbmRzIHRvIHdvcmsuCisJCQkgICBUaGV5IGJpbmQgc29ja2V0IHRvIGxvb3BiYWNrLCBzZXQgdHRsIHRvIHplcm8KKwkJCSAgIGFuZCBleHBlY3QgdGhhdCBpdCB3aWxsIHdvcmsuCisJCQkgICBGcm9tIHRoZSB2aWV3cG9pbnQgb2Ygcm91dGluZyBjYWNoZSB0aGV5IGFyZSBicm9rZW4sCisJCQkgICBiZWNhdXNlIHdlIGFyZSBub3QgYWxsb3dlZCB0byBidWlsZCBtdWx0aWNhc3QgcGF0aAorCQkJICAgd2l0aCBsb29wYmFjayBzb3VyY2UgYWRkciAobG9vaywgcm91dGluZyBjYWNoZQorCQkJICAgY2Fubm90IGtub3csIHRoYXQgdHRsIGlzIHplcm8sIHNvIHRoYXQgcGFja2V0CisJCQkgICB3aWxsIG5vdCBsZWF2ZSB0aGlzIGhvc3QgYW5kIHJvdXRlIGlzIHZhbGlkKS4KKwkJCSAgIEx1Y2tpbHksIHRoaXMgaGFjayBpcyBnb29kIHdvcmthcm91bmQuCisJCQkgKi8KKworCQkJZmwub2lmID0gZGV2X291dC0+aWZpbmRleDsKKwkJCWdvdG8gbWFrZV9yb3V0ZTsKKwkJfQorCQlpZiAoZGV2X291dCkKKwkJCWRldl9wdXQoZGV2X291dCk7CisJCWRldl9vdXQgPSBOVUxMOworCX0KKworCisJaWYgKG9sZGZscC0+b2lmKSB7CisJCWRldl9vdXQgPSBkZXZfZ2V0X2J5X2luZGV4KG9sZGZscC0+b2lmKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJaWYgKGRldl9vdXQgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCQlpZiAoX19pbl9kZXZfZ2V0KGRldl9vdXQpID09IE5VTEwpIHsKKwkJCWRldl9wdXQoZGV2X291dCk7CisJCQlnb3RvIG91dDsJLyogV3JvbmcgZXJyb3IgY29kZSAqLworCQl9CisKKwkJaWYgKExPQ0FMX01DQVNUKG9sZGZscC0+Zmw0X2RzdCkgfHwgb2xkZmxwLT5mbDRfZHN0ID09IDB4RkZGRkZGRkYpIHsKKwkJCWlmICghZmwuZmw0X3NyYykKKwkJCQlmbC5mbDRfc3JjID0gaW5ldF9zZWxlY3RfYWRkcihkZXZfb3V0LCAwLAorCQkJCQkJCSAgICAgIFJUX1NDT1BFX0xJTkspOworCQkJZ290byBtYWtlX3JvdXRlOworCQl9CisJCWlmICghZmwuZmw0X3NyYykgeworCQkJaWYgKE1VTFRJQ0FTVChvbGRmbHAtPmZsNF9kc3QpKQorCQkJCWZsLmZsNF9zcmMgPSBpbmV0X3NlbGVjdF9hZGRyKGRldl9vdXQsIDAsCisJCQkJCQkJICAgICAgZmwuZmw0X3Njb3BlKTsKKwkJCWVsc2UgaWYgKCFvbGRmbHAtPmZsNF9kc3QpCisJCQkJZmwuZmw0X3NyYyA9IGluZXRfc2VsZWN0X2FkZHIoZGV2X291dCwgMCwKKwkJCQkJCQkgICAgICBSVF9TQ09QRV9IT1NUKTsKKwkJfQorCX0KKworCWlmICghZmwuZmw0X2RzdCkgeworCQlmbC5mbDRfZHN0ID0gZmwuZmw0X3NyYzsKKwkJaWYgKCFmbC5mbDRfZHN0KQorCQkJZmwuZmw0X2RzdCA9IGZsLmZsNF9zcmMgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spOworCQlpZiAoZGV2X291dCkKKwkJCWRldl9wdXQoZGV2X291dCk7CisJCWRldl9vdXQgPSAmbG9vcGJhY2tfZGV2OworCQlkZXZfaG9sZChkZXZfb3V0KTsKKwkJZmwub2lmID0gbG9vcGJhY2tfZGV2LmlmaW5kZXg7CisJCXJlcy50eXBlID0gUlROX0xPQ0FMOworCQlmbGFncyB8PSBSVENGX0xPQ0FMOworCQlnb3RvIG1ha2Vfcm91dGU7CisJfQorCisJaWYgKGZpYl9sb29rdXAoJmZsLCAmcmVzKSkgeworCQlyZXMuZmkgPSBOVUxMOworCQlpZiAob2xkZmxwLT5vaWYpIHsKKwkJCS8qIEFwcGFyZW50bHksIHJvdXRpbmcgdGFibGVzIGFyZSB3cm9uZy4gQXNzdW1lLAorCQkJICAgdGhhdCB0aGUgZGVzdGluYXRpb24gaXMgb24gbGluay4KKworCQkJICAgV0hZPyBEVy4KKwkJCSAgIEJlY2F1c2Ugd2UgYXJlIGFsbG93ZWQgdG8gc2VuZCB0byBpZmFjZQorCQkJICAgZXZlbiBpZiBpdCBoYXMgTk8gcm91dGVzIGFuZCBOTyBhc3NpZ25lZAorCQkJICAgYWRkcmVzc2VzLiBXaGVuIG9pZiBpcyBzcGVjaWZpZWQsIHJvdXRpbmcKKwkJCSAgIHRhYmxlcyBhcmUgbG9va2VkIHVwIHdpdGggb25seSBvbmUgcHVycG9zZToKKwkJCSAgIHRvIGNhdGNoIGlmIGRlc3RpbmF0aW9uIGlzIGdhdGV3YXllZCwgcmF0aGVyIHRoYW4KKwkJCSAgIGRpcmVjdC4gTW9yZW92ZXIsIGlmIE1TR19ET05UUk9VVEUgaXMgc2V0LAorCQkJICAgd2Ugc2VuZCBwYWNrZXQsIGlnbm9yaW5nIGJvdGggcm91dGluZyB0YWJsZXMKKwkJCSAgIGFuZCBpZmFkZHIgc3RhdGUuIC0tQU5LCisKKworCQkJICAgV2UgY291bGQgbWFrZSBpdCBldmVuIGlmIG9pZiBpcyB1bmtub3duLAorCQkJICAgbGlrZWx5IElQdjYsIGJ1dCB3ZSBkbyBub3QuCisJCQkgKi8KKworCQkJaWYgKGZsLmZsNF9zcmMgPT0gMCkKKwkJCQlmbC5mbDRfc3JjID0gaW5ldF9zZWxlY3RfYWRkcihkZXZfb3V0LCAwLAorCQkJCQkJCSAgICAgIFJUX1NDT1BFX0xJTkspOworCQkJcmVzLnR5cGUgPSBSVE5fVU5JQ0FTVDsKKwkJCWdvdG8gbWFrZV9yb3V0ZTsKKwkJfQorCQlpZiAoZGV2X291dCkKKwkJCWRldl9wdXQoZGV2X291dCk7CisJCWVyciA9IC1FTkVUVU5SRUFDSDsKKwkJZ290byBvdXQ7CisJfQorCWZyZWVfcmVzID0gMTsKKworCWlmIChyZXMudHlwZSA9PSBSVE5fTE9DQUwpIHsKKwkJaWYgKCFmbC5mbDRfc3JjKQorCQkJZmwuZmw0X3NyYyA9IGZsLmZsNF9kc3Q7CisJCWlmIChkZXZfb3V0KQorCQkJZGV2X3B1dChkZXZfb3V0KTsKKwkJZGV2X291dCA9ICZsb29wYmFja19kZXY7CisJCWRldl9ob2xkKGRldl9vdXQpOworCQlmbC5vaWYgPSBkZXZfb3V0LT5pZmluZGV4OworCQlpZiAocmVzLmZpKQorCQkJZmliX2luZm9fcHV0KHJlcy5maSk7CisJCXJlcy5maSA9IE5VTEw7CisJCWZsYWdzIHw9IFJUQ0ZfTE9DQUw7CisJCWdvdG8gbWFrZV9yb3V0ZTsKKwl9CisKKyNpZmRlZiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRICisJaWYgKHJlcy5maS0+ZmliX25ocyA+IDEgJiYgZmwub2lmID09IDApCisJCWZpYl9zZWxlY3RfbXVsdGlwYXRoKCZmbCwgJnJlcyk7CisJZWxzZQorI2VuZGlmCisJaWYgKCFyZXMucHJlZml4bGVuICYmIHJlcy50eXBlID09IFJUTl9VTklDQVNUICYmICFmbC5vaWYpCisJCWZpYl9zZWxlY3RfZGVmYXVsdCgmZmwsICZyZXMpOworCisJaWYgKCFmbC5mbDRfc3JjKQorCQlmbC5mbDRfc3JjID0gRklCX1JFU19QUkVGU1JDKHJlcyk7CisKKwlpZiAoZGV2X291dCkKKwkJZGV2X3B1dChkZXZfb3V0KTsKKwlkZXZfb3V0ID0gRklCX1JFU19ERVYocmVzKTsKKwlkZXZfaG9sZChkZXZfb3V0KTsKKwlmbC5vaWYgPSBkZXZfb3V0LT5pZmluZGV4OworCisKK21ha2Vfcm91dGU6CisJZXJyID0gaXBfbWtyb3V0ZV9vdXRwdXQocnAsICZyZXMsICZmbCwgb2xkZmxwLCBkZXZfb3V0LCBmbGFncyk7CisKKworCWlmIChmcmVlX3JlcykKKwkJZmliX3Jlc19wdXQoJnJlcyk7CisJaWYgKGRldl9vdXQpCisJCWRldl9wdXQoZGV2X291dCk7CitvdXQ6CXJldHVybiBlcnI7Cit9CisKK2ludCBfX2lwX3JvdXRlX291dHB1dF9rZXkoc3RydWN0IHJ0YWJsZSAqKnJwLCBjb25zdCBzdHJ1Y3QgZmxvd2kgKmZscCkKK3sKKwl1bnNpZ25lZCBoYXNoOworCXN0cnVjdCBydGFibGUgKnJ0aDsKKworCWhhc2ggPSBydF9oYXNoX2NvZGUoZmxwLT5mbDRfZHN0LCBmbHAtPmZsNF9zcmMgXiAoZmxwLT5vaWYgPDwgNSksIGZscC0+Zmw0X3Rvcyk7CisKKwlyY3VfcmVhZF9sb2NrX2JoKCk7CisJZm9yIChydGggPSByY3VfZGVyZWZlcmVuY2UocnRfaGFzaF90YWJsZVtoYXNoXS5jaGFpbik7IHJ0aDsKKwkJcnRoID0gcmN1X2RlcmVmZXJlbmNlKHJ0aC0+dS5ydF9uZXh0KSkgeworCQlpZiAocnRoLT5mbC5mbDRfZHN0ID09IGZscC0+Zmw0X2RzdCAmJgorCQkgICAgcnRoLT5mbC5mbDRfc3JjID09IGZscC0+Zmw0X3NyYyAmJgorCQkgICAgcnRoLT5mbC5paWYgPT0gMCAmJgorCQkgICAgcnRoLT5mbC5vaWYgPT0gZmxwLT5vaWYgJiYKKyNpZmRlZiBDT05GSUdfSVBfUk9VVEVfRldNQVJLCisJCSAgICBydGgtPmZsLmZsNF9md21hcmsgPT0gZmxwLT5mbDRfZndtYXJrICYmCisjZW5kaWYKKwkJICAgICEoKHJ0aC0+ZmwuZmw0X3RvcyBeIGZscC0+Zmw0X3RvcykgJgorCQkJICAgIChJUFRPU19SVF9NQVNLIHwgUlRPX09OTElOSykpKSB7CisKKwkJCS8qIGNoZWNrIGZvciBtdWx0aXBhdGggcm91dGVzIGFuZCBjaG9vc2Ugb25lIGlmCisJCQkgKiBuZWNlc3NhcnkKKwkJCSAqLworCQkJaWYgKG11bHRpcGF0aF9zZWxlY3Rfcm91dGUoZmxwLCBydGgsIHJwKSkgeworCQkJCWRzdF9ob2xkKCYoKnJwKS0+dS5kc3QpOworCQkJCVJUX0NBQ0hFX1NUQVRfSU5DKG91dF9oaXQpOworCQkJCXJjdV9yZWFkX3VubG9ja19iaCgpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlydGgtPnUuZHN0Lmxhc3R1c2UgPSBqaWZmaWVzOworCQkJZHN0X2hvbGQoJnJ0aC0+dS5kc3QpOworCQkJcnRoLT51LmRzdC5fX3VzZSsrOworCQkJUlRfQ0FDSEVfU1RBVF9JTkMob3V0X2hpdCk7CisJCQlyY3VfcmVhZF91bmxvY2tfYmgoKTsKKwkJCSpycCA9IHJ0aDsKKwkJCXJldHVybiAwOworCQl9CisJCVJUX0NBQ0hFX1NUQVRfSU5DKG91dF9obGlzdF9zZWFyY2gpOworCX0KKwlyY3VfcmVhZF91bmxvY2tfYmgoKTsKKworCXJldHVybiBpcF9yb3V0ZV9vdXRwdXRfc2xvdyhycCwgZmxwKTsKK30KKworaW50IGlwX3JvdXRlX291dHB1dF9mbG93KHN0cnVjdCBydGFibGUgKipycCwgc3RydWN0IGZsb3dpICpmbHAsIHN0cnVjdCBzb2NrICpzaywgaW50IGZsYWdzKQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IF9faXBfcm91dGVfb3V0cHV0X2tleShycCwgZmxwKSkgIT0gMCkKKwkJcmV0dXJuIGVycjsKKworCWlmIChmbHAtPnByb3RvKSB7CisJCWlmICghZmxwLT5mbDRfc3JjKQorCQkJZmxwLT5mbDRfc3JjID0gKCpycCktPnJ0X3NyYzsKKwkJaWYgKCFmbHAtPmZsNF9kc3QpCisJCQlmbHAtPmZsNF9kc3QgPSAoKnJwKS0+cnRfZHN0OworCQlyZXR1cm4geGZybV9sb29rdXAoKHN0cnVjdCBkc3RfZW50cnkgKiopcnAsIGZscCwgc2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGlwX3JvdXRlX291dHB1dF9rZXkoc3RydWN0IHJ0YWJsZSAqKnJwLCBzdHJ1Y3QgZmxvd2kgKmZscCkKK3sKKwlyZXR1cm4gaXBfcm91dGVfb3V0cHV0X2Zsb3cocnAsIGZscCwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgcnRfZmlsbF9pbmZvKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBwaWQsIHUzMiBzZXEsIGludCBldmVudCwKKwkJCWludCBub3dhaXQpCit7CisJc3RydWN0IHJ0YWJsZSAqcnQgPSAoc3RydWN0IHJ0YWJsZSopc2tiLT5kc3Q7CisJc3RydWN0IHJ0bXNnICpyOworCXN0cnVjdCBubG1zZ2hkciAgKm5saDsKKwl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3QgcnRhX2NhY2hlaW5mbyBjaTsKKyNpZmRlZiBDT05GSUdfSVBfTVJPVVRFCisJc3RydWN0IHJ0YXR0ciAqZXB0cjsKKyNlbmRpZgorCW5saCA9IE5MTVNHX1BVVChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCpyKSk7CisJciA9IE5MTVNHX0RBVEEobmxoKTsKKwlubGgtPm5sbXNnX2ZsYWdzID0gKG5vd2FpdCAmJiBwaWQpID8gTkxNX0ZfTVVMVEkgOiAwOworCXItPnJ0bV9mYW1pbHkJID0gQUZfSU5FVDsKKwlyLT5ydG1fZHN0X2xlbgk9IDMyOworCXItPnJ0bV9zcmNfbGVuCT0gMDsKKwlyLT5ydG1fdG9zCT0gcnQtPmZsLmZsNF90b3M7CisJci0+cnRtX3RhYmxlCT0gUlRfVEFCTEVfTUFJTjsKKwlyLT5ydG1fdHlwZQk9IHJ0LT5ydF90eXBlOworCXItPnJ0bV9zY29wZQk9IFJUX1NDT1BFX1VOSVZFUlNFOworCXItPnJ0bV9wcm90b2NvbCA9IFJUUFJPVF9VTlNQRUM7CisJci0+cnRtX2ZsYWdzCT0gKHJ0LT5ydF9mbGFncyAmIH4weEZGRkYpIHwgUlRNX0ZfQ0xPTkVEOworCWlmIChydC0+cnRfZmxhZ3MgJiBSVENGX05PVElGWSkKKwkJci0+cnRtX2ZsYWdzIHw9IFJUTV9GX05PVElGWTsKKwlSVEFfUFVUKHNrYiwgUlRBX0RTVCwgNCwgJnJ0LT5ydF9kc3QpOworCWlmIChydC0+ZmwuZmw0X3NyYykgeworCQlyLT5ydG1fc3JjX2xlbiA9IDMyOworCQlSVEFfUFVUKHNrYiwgUlRBX1NSQywgNCwgJnJ0LT5mbC5mbDRfc3JjKTsKKwl9CisJaWYgKHJ0LT51LmRzdC5kZXYpCisJCVJUQV9QVVQoc2tiLCBSVEFfT0lGLCBzaXplb2YoaW50KSwgJnJ0LT51LmRzdC5kZXYtPmlmaW5kZXgpOworI2lmZGVmIENPTkZJR19ORVRfQ0xTX1JPVVRFCisJaWYgKHJ0LT51LmRzdC50Y2xhc3NpZCkKKwkJUlRBX1BVVChza2IsIFJUQV9GTE9XLCA0LCAmcnQtPnUuZHN0LnRjbGFzc2lkKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEhfQ0FDSEVECisJaWYgKHJ0LT5ydF9tdWx0aXBhdGhfYWxnICE9IElQX01QX0FMR19OT05FKSB7CisJCV9fdTMyIGFsZyA9IHJ0LT5ydF9tdWx0aXBhdGhfYWxnOworCisJCVJUQV9QVVQoc2tiLCBSVEFfTVBfQUxHTywgNCwgJmFsZyk7CisJfQorI2VuZGlmCisJaWYgKHJ0LT5mbC5paWYpCisJCVJUQV9QVVQoc2tiLCBSVEFfUFJFRlNSQywgNCwgJnJ0LT5ydF9zcGVjX2RzdCk7CisJZWxzZSBpZiAocnQtPnJ0X3NyYyAhPSBydC0+ZmwuZmw0X3NyYykKKwkJUlRBX1BVVChza2IsIFJUQV9QUkVGU1JDLCA0LCAmcnQtPnJ0X3NyYyk7CisJaWYgKHJ0LT5ydF9kc3QgIT0gcnQtPnJ0X2dhdGV3YXkpCisJCVJUQV9QVVQoc2tiLCBSVEFfR0FURVdBWSwgNCwgJnJ0LT5ydF9nYXRld2F5KTsKKwlpZiAocnRuZXRsaW5rX3B1dF9tZXRyaWNzKHNrYiwgcnQtPnUuZHN0Lm1ldHJpY3MpIDwgMCkKKwkJZ290byBydGF0dHJfZmFpbHVyZTsKKwljaS5ydGFfbGFzdHVzZQk9IGppZmZpZXNfdG9fY2xvY2tfdChqaWZmaWVzIC0gcnQtPnUuZHN0Lmxhc3R1c2UpOworCWNpLnJ0YV91c2VkCT0gcnQtPnUuZHN0Ll9fdXNlOworCWNpLnJ0YV9jbG50cmVmCT0gYXRvbWljX3JlYWQoJnJ0LT51LmRzdC5fX3JlZmNudCk7CisJaWYgKHJ0LT51LmRzdC5leHBpcmVzKQorCQljaS5ydGFfZXhwaXJlcyA9IGppZmZpZXNfdG9fY2xvY2tfdChydC0+dS5kc3QuZXhwaXJlcyAtIGppZmZpZXMpOworCWVsc2UKKwkJY2kucnRhX2V4cGlyZXMgPSAwOworCWNpLnJ0YV9lcnJvcgk9IHJ0LT51LmRzdC5lcnJvcjsKKwljaS5ydGFfaWQJPSBjaS5ydGFfdHMgPSBjaS5ydGFfdHNhZ2UgPSAwOworCWlmIChydC0+cGVlcikgeworCQljaS5ydGFfaWQgPSBydC0+cGVlci0+aXBfaWRfY291bnQ7CisJCWlmIChydC0+cGVlci0+dGNwX3RzX3N0YW1wKSB7CisJCQljaS5ydGFfdHMgPSBydC0+cGVlci0+dGNwX3RzOworCQkJY2kucnRhX3RzYWdlID0geHRpbWUudHZfc2VjIC0gcnQtPnBlZXItPnRjcF90c19zdGFtcDsKKwkJfQorCX0KKyNpZmRlZiBDT05GSUdfSVBfTVJPVVRFCisJZXB0ciA9IChzdHJ1Y3QgcnRhdHRyKilza2ItPnRhaWw7CisjZW5kaWYKKwlSVEFfUFVUKHNrYiwgUlRBX0NBQ0hFSU5GTywgc2l6ZW9mKGNpKSwgJmNpKTsKKwlpZiAocnQtPmZsLmlpZikgeworI2lmZGVmIENPTkZJR19JUF9NUk9VVEUKKwkJdTMyIGRzdCA9IHJ0LT5ydF9kc3Q7CisKKwkJaWYgKE1VTFRJQ0FTVChkc3QpICYmICFMT0NBTF9NQ0FTVChkc3QpICYmCisJCSAgICBpcHY0X2RldmNvbmYubWNfZm9yd2FyZGluZykgeworCQkJaW50IGVyciA9IGlwbXJfZ2V0X3JvdXRlKHNrYiwgciwgbm93YWl0KTsKKwkJCWlmIChlcnIgPD0gMCkgeworCQkJCWlmICghbm93YWl0KSB7CisJCQkJCWlmIChlcnIgPT0gMCkKKwkJCQkJCXJldHVybiAwOworCQkJCQlnb3RvIG5sbXNnX2ZhaWx1cmU7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGVyciA9PSAtRU1TR1NJWkUpCisJCQkJCQlnb3RvIG5sbXNnX2ZhaWx1cmU7CisJCQkJCSgoc3RydWN0IHJ0YV9jYWNoZWluZm8qKVJUQV9EQVRBKGVwdHIpKS0+cnRhX2Vycm9yID0gZXJyOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlCisjZW5kaWYKKwkJCVJUQV9QVVQoc2tiLCBSVEFfSUlGLCBzaXplb2YoaW50KSwgJnJ0LT5mbC5paWYpOworCX0KKworCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlyZXR1cm4gc2tiLT5sZW47CisKK25sbXNnX2ZhaWx1cmU6CitydGF0dHJfZmFpbHVyZToKKwlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCXJldHVybiAtMTsKK30KKworaW50IGluZXRfcnRtX2dldHJvdXRlKHN0cnVjdCBza19idWZmICppbl9za2IsIHN0cnVjdCBubG1zZ2hkciogbmxoLCB2b2lkICphcmcpCit7CisJc3RydWN0IHJ0YXR0ciAqKnJ0YSA9IGFyZzsKKwlzdHJ1Y3QgcnRtc2cgKnJ0bSA9IE5MTVNHX0RBVEEobmxoKTsKKwlzdHJ1Y3QgcnRhYmxlICpydCA9IE5VTEw7CisJdTMyIGRzdCA9IDA7CisJdTMyIHNyYyA9IDA7CisJaW50IGlpZiA9IDA7CisJaW50IGVyciA9IC1FTk9CVUZTOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBhbGxvY19za2IoTkxNU0dfR09PRFNJWkUsIEdGUF9LRVJORUwpOworCWlmICghc2tiKQorCQlnb3RvIG91dDsKKworCS8qIFJlc2VydmUgcm9vbSBmb3IgZHVtbXkgaGVhZGVycywgdGhpcyBza2IgY2FuIHBhc3MKKwkgICB0aHJvdWdoIGdvb2QgY2h1bmsgb2Ygcm91dGluZyBlbmdpbmUuCisJICovCisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNlcnZlKHNrYiwgTUFYX0hFQURFUiArIHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKKworCWlmIChydGFbUlRBX1NSQyAtIDFdKQorCQltZW1jcHkoJnNyYywgUlRBX0RBVEEocnRhW1JUQV9TUkMgLSAxXSksIDQpOworCWlmIChydGFbUlRBX0RTVCAtIDFdKQorCQltZW1jcHkoJmRzdCwgUlRBX0RBVEEocnRhW1JUQV9EU1QgLSAxXSksIDQpOworCWlmIChydGFbUlRBX0lJRiAtIDFdKQorCQltZW1jcHkoJmlpZiwgUlRBX0RBVEEocnRhW1JUQV9JSUYgLSAxXSksIHNpemVvZihpbnQpKTsKKworCWlmIChpaWYpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IF9fZGV2X2dldF9ieV9pbmRleChpaWYpOworCQllcnIgPSAtRU5PREVWOworCQlpZiAoIWRldikKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCXNrYi0+cHJvdG9jb2wJPSBodG9ucyhFVEhfUF9JUCk7CisJCXNrYi0+ZGV2CT0gZGV2OworCQlsb2NhbF9iaF9kaXNhYmxlKCk7CisJCWVyciA9IGlwX3JvdXRlX2lucHV0KHNrYiwgZHN0LCBzcmMsIHJ0bS0+cnRtX3RvcywgZGV2KTsKKwkJbG9jYWxfYmhfZW5hYmxlKCk7CisJCXJ0ID0gKHN0cnVjdCBydGFibGUqKXNrYi0+ZHN0OworCQlpZiAoIWVyciAmJiBydC0+dS5kc3QuZXJyb3IpCisJCQllcnIgPSAtcnQtPnUuZHN0LmVycm9yOworCX0gZWxzZSB7CisJCXN0cnVjdCBmbG93aSBmbCA9IHsgLm5sX3UgPSB7IC5pcDRfdSA9IHsgLmRhZGRyID0gZHN0LAorCQkJCQkJCSAuc2FkZHIgPSBzcmMsCisJCQkJCQkJIC50b3MgPSBydG0tPnJ0bV90b3MgfSB9IH07CisJCWludCBvaWYgPSAwOworCQlpZiAocnRhW1JUQV9PSUYgLSAxXSkKKwkJCW1lbWNweSgmb2lmLCBSVEFfREFUQShydGFbUlRBX09JRiAtIDFdKSwgc2l6ZW9mKGludCkpOworCQlmbC5vaWYgPSBvaWY7CisJCWVyciA9IGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpOworCX0KKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlOworCisJc2tiLT5kc3QgPSAmcnQtPnUuZHN0OworCWlmIChydG0tPnJ0bV9mbGFncyAmIFJUTV9GX05PVElGWSkKKwkJcnQtPnJ0X2ZsYWdzIHw9IFJUQ0ZfTk9USUZZOworCisJTkVUTElOS19DQihza2IpLmRzdF9waWQgPSBORVRMSU5LX0NCKGluX3NrYikucGlkOworCisJZXJyID0gcnRfZmlsbF9pbmZvKHNrYiwgTkVUTElOS19DQihpbl9za2IpLnBpZCwgbmxoLT5ubG1zZ19zZXEsCisJCQkJUlRNX05FV1JPVVRFLCAwKTsKKwlpZiAoIWVycikKKwkJZ290byBvdXRfZnJlZTsKKwlpZiAoZXJyIDwgMCkgeworCQllcnIgPSAtRU1TR1NJWkU7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJZXJyID0gbmV0bGlua191bmljYXN0KHJ0bmwsIHNrYiwgTkVUTElOS19DQihpbl9za2IpLnBpZCwgTVNHX0RPTlRXQUlUKTsKKwlpZiAoZXJyID4gMCkKKwkJZXJyID0gMDsKK291dDoJcmV0dXJuIGVycjsKKworb3V0X2ZyZWU6CisJa2ZyZWVfc2tiKHNrYik7CisJZ290byBvdXQ7Cit9CisKK2ludCBpcF9ydF9kdW1wKHN0cnVjdCBza19idWZmICpza2IsICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJc3RydWN0IHJ0YWJsZSAqcnQ7CisJaW50IGgsIHNfaDsKKwlpbnQgaWR4LCBzX2lkeDsKKworCXNfaCA9IGNiLT5hcmdzWzBdOworCXNfaWR4ID0gaWR4ID0gY2ItPmFyZ3NbMV07CisJZm9yIChoID0gMDsgaCA8PSBydF9oYXNoX21hc2s7IGgrKykgeworCQlpZiAoaCA8IHNfaCkgY29udGludWU7CisJCWlmIChoID4gc19oKQorCQkJc19pZHggPSAwOworCQlyY3VfcmVhZF9sb2NrX2JoKCk7CisJCWZvciAocnQgPSByY3VfZGVyZWZlcmVuY2UocnRfaGFzaF90YWJsZVtoXS5jaGFpbiksIGlkeCA9IDA7IHJ0OworCQkgICAgIHJ0ID0gcmN1X2RlcmVmZXJlbmNlKHJ0LT51LnJ0X25leHQpLCBpZHgrKykgeworCQkJaWYgKGlkeCA8IHNfaWR4KQorCQkJCWNvbnRpbnVlOworCQkJc2tiLT5kc3QgPSBkc3RfY2xvbmUoJnJ0LT51LmRzdCk7CisJCQlpZiAocnRfZmlsbF9pbmZvKHNrYiwgTkVUTElOS19DQihjYi0+c2tiKS5waWQsCisJCQkJCSBjYi0+bmxoLT5ubG1zZ19zZXEsCisJCQkJCSBSVE1fTkVXUk9VVEUsIDEpIDw9IDApIHsKKwkJCQlkc3RfcmVsZWFzZSh4Y2hnKCZza2ItPmRzdCwgTlVMTCkpOworCQkJCXJjdV9yZWFkX3VubG9ja19iaCgpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCWRzdF9yZWxlYXNlKHhjaGcoJnNrYi0+ZHN0LCBOVUxMKSk7CisJCX0KKwkJcmN1X3JlYWRfdW5sb2NrX2JoKCk7CisJfQorCitkb25lOgorCWNiLT5hcmdzWzBdID0gaDsKKwljYi0+YXJnc1sxXSA9IGlkeDsKKwlyZXR1cm4gc2tiLT5sZW47Cit9CisKK3ZvaWQgaXBfcnRfbXVsdGljYXN0X2V2ZW50KHN0cnVjdCBpbl9kZXZpY2UgKmluX2RldikKK3sKKwlydF9jYWNoZV9mbHVzaCgwKTsKK30KKworI2lmZGVmIENPTkZJR19TWVNDVEwKK3N0YXRpYyBpbnQgZmx1c2hfZGVsYXk7CisKK3N0YXRpYyBpbnQgaXB2NF9zeXNjdGxfcnRjYWNoZV9mbHVzaChjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkJc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKHdyaXRlKSB7CisJCXByb2NfZG9pbnR2ZWMoY3RsLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwkJcnRfY2FjaGVfZmx1c2goZmx1c2hfZGVsYXkpOworCQlyZXR1cm4gMDsKKwl9IAorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgaXB2NF9zeXNjdGxfcnRjYWNoZV9mbHVzaF9zdHJhdGVneShjdGxfdGFibGUgKnRhYmxlLAorCQkJCQkJaW50IF9fdXNlciAqbmFtZSwKKwkJCQkJCWludCBubGVuLAorCQkJCQkJdm9pZCBfX3VzZXIgKm9sZHZhbCwKKwkJCQkJCXNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCisJCQkJCQl2b2lkIF9fdXNlciAqbmV3dmFsLAorCQkJCQkJc2l6ZV90IG5ld2xlbiwKKwkJCQkJCXZvaWQgKipjb250ZXh0KQoreworCWludCBkZWxheTsKKwlpZiAobmV3bGVuICE9IHNpemVvZihpbnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZ2V0X3VzZXIoZGVsYXksIChpbnQgX191c2VyICopbmV3dmFsKSkKKwkJcmV0dXJuIC1FRkFVTFQ7IAorCXJ0X2NhY2hlX2ZsdXNoKGRlbGF5KTsgCisJcmV0dXJuIDA7Cit9CisKK2N0bF90YWJsZSBpcHY0X3JvdXRlX3RhYmxlW10gPSB7CisgICAgICAgIHsKKwkJLmN0bF9uYW1lIAk9IE5FVF9JUFY0X1JPVVRFX0ZMVVNILAorCQkucHJvY25hbWUJPSAiZmx1c2giLAorCQkuZGF0YQkJPSAmZmx1c2hfZGVsYXksCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmaXB2NF9zeXNjdGxfcnRjYWNoZV9mbHVzaCwKKwkJLnN0cmF0ZWd5CT0gJmlwdjRfc3lzY3RsX3J0Y2FjaGVfZmx1c2hfc3RyYXRlZ3ksCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X1JPVVRFX01JTl9ERUxBWSwKKwkJLnByb2NuYW1lCT0gIm1pbl9kZWxheSIsCisJCS5kYXRhCQk9ICZpcF9ydF9taW5fZGVsYXksCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X1JPVVRFX01BWF9ERUxBWSwKKwkJLnByb2NuYW1lCT0gIm1heF9kZWxheSIsCisJCS5kYXRhCQk9ICZpcF9ydF9tYXhfZGVsYXksCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X1JPVVRFX0dDX1RIUkVTSCwKKwkJLnByb2NuYW1lCT0gImdjX3RocmVzaCIsCisJCS5kYXRhCQk9ICZpcHY0X2RzdF9vcHMuZ2NfdGhyZXNoLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X1JPVVRFX01BWF9TSVpFLAorCQkucHJvY25hbWUJPSAibWF4X3NpemUiLAorCQkuZGF0YQkJPSAmaXBfcnRfbWF4X3NpemUsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLyogIERlcHJlY2F0ZWQuIFVzZSBnY19taW5faW50ZXJ2YWxfbXMgKi8KKyAKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfUk9VVEVfR0NfTUlOX0lOVEVSVkFMLAorCQkucHJvY25hbWUJPSAiZ2NfbWluX2ludGVydmFsIiwKKwkJLmRhdGEJCT0gJmlwX3J0X2djX21pbl9pbnRlcnZhbCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfUk9VVEVfR0NfTUlOX0lOVEVSVkFMX01TLAorCQkucHJvY25hbWUJPSAiZ2NfbWluX2ludGVydmFsX21zIiwKKwkJLmRhdGEJCT0gJmlwX3J0X2djX21pbl9pbnRlcnZhbCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21zX2ppZmZpZXMsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfbXNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfUk9VVEVfR0NfVElNRU9VVCwKKwkJLnByb2NuYW1lCT0gImdjX3RpbWVvdXQiLAorCQkuZGF0YQkJPSAmaXBfcnRfZ2NfdGltZW91dCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfUk9VVEVfR0NfSU5URVJWQUwsCisJCS5wcm9jbmFtZQk9ICJnY19pbnRlcnZhbCIsCisJCS5kYXRhCQk9ICZpcF9ydF9nY19pbnRlcnZhbCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfUk9VVEVfUkVESVJFQ1RfTE9BRCwKKwkJLnByb2NuYW1lCT0gInJlZGlyZWN0X2xvYWQiLAorCQkuZGF0YQkJPSAmaXBfcnRfcmVkaXJlY3RfbG9hZCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ST1VURV9SRURJUkVDVF9OVU1CRVIsCisJCS5wcm9jbmFtZQk9ICJyZWRpcmVjdF9udW1iZXIiLAorCQkuZGF0YQkJPSAmaXBfcnRfcmVkaXJlY3RfbnVtYmVyLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X1JPVVRFX1JFRElSRUNUX1NJTEVOQ0UsCisJCS5wcm9jbmFtZQk9ICJyZWRpcmVjdF9zaWxlbmNlIiwKKwkJLmRhdGEJCT0gJmlwX3J0X3JlZGlyZWN0X3NpbGVuY2UsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfUk9VVEVfRVJST1JfQ09TVCwKKwkJLnByb2NuYW1lCT0gImVycm9yX2Nvc3QiLAorCQkuZGF0YQkJPSAmaXBfcnRfZXJyb3JfY29zdCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ST1VURV9FUlJPUl9CVVJTVCwKKwkJLnByb2NuYW1lCT0gImVycm9yX2J1cnN0IiwKKwkJLmRhdGEJCT0gJmlwX3J0X2Vycm9yX2J1cnN0LAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X1JPVVRFX0dDX0VMQVNUSUNJVFksCisJCS5wcm9jbmFtZQk9ICJnY19lbGFzdGljaXR5IiwKKwkJLmRhdGEJCT0gJmlwX3J0X2djX2VsYXN0aWNpdHksCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfUk9VVEVfTVRVX0VYUElSRVMsCisJCS5wcm9jbmFtZQk9ICJtdHVfZXhwaXJlcyIsCisJCS5kYXRhCQk9ICZpcF9ydF9tdHVfZXhwaXJlcywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfUk9VVEVfTUlOX1BNVFUsCisJCS5wcm9jbmFtZQk9ICJtaW5fcG10dSIsCisJCS5kYXRhCQk9ICZpcF9ydF9taW5fcG10dSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ST1VURV9NSU5fQURWTVNTLAorCQkucHJvY25hbWUJPSAibWluX2Fkdl9tc3MiLAorCQkuZGF0YQkJPSAmaXBfcnRfbWluX2Fkdm1zcywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ST1VURV9TRUNSRVRfSU5URVJWQUwsCisJCS5wcm9jbmFtZQk9ICJzZWNyZXRfaW50ZXJ2YWwiLAorCQkuZGF0YQkJPSAmaXBfcnRfc2VjcmV0X2ludGVydmFsLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9qaWZmaWVzLAorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19ORVRfQ0xTX1JPVVRFCitzdHJ1Y3QgaXBfcnRfYWNjdCAqaXBfcnRfYWNjdDsKKworLyogVGhpcyBjb2RlIHN1Y2tzLiAgQnV0IHlvdSBzaG91bGQgaGF2ZSBzZWVuIGl0IGJlZm9yZSEgLS1SUiAqLworCisvKiBJUCByb3V0ZSBhY2NvdW50aW5nIHB0ciBmb3IgdGhpcyBsb2dpY2FsIGNwdSBudW1iZXIuICovCisjZGVmaW5lIElQX1JUX0FDQ1RfQ1BVKGkpIChpcF9ydF9hY2N0ICsgaSAqIDI1NikKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgaW50IGlwX3J0X2FjY3RfcmVhZChjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJICAgaW50IGxlbmd0aCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoKG9mZnNldCAmIDMpIHx8IChsZW5ndGggJiAzKSkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAob2Zmc2V0ID49IHNpemVvZihzdHJ1Y3QgaXBfcnRfYWNjdCkgKiAyNTYpIHsKKwkJKmVvZiA9IDE7CisJCXJldHVybiAwOworCX0KKworCWlmIChvZmZzZXQgKyBsZW5ndGggPj0gc2l6ZW9mKHN0cnVjdCBpcF9ydF9hY2N0KSAqIDI1NikgeworCQlsZW5ndGggPSBzaXplb2Yoc3RydWN0IGlwX3J0X2FjY3QpICogMjU2IC0gb2Zmc2V0OworCQkqZW9mID0gMTsKKwl9CisKKwlvZmZzZXQgLz0gc2l6ZW9mKHUzMik7CisKKwlpZiAobGVuZ3RoID4gMCkgeworCQl1MzIgKnNyYyA9ICgodTMyICopIElQX1JUX0FDQ1RfQ1BVKDApKSArIG9mZnNldDsKKwkJdTMyICpkc3QgPSAodTMyICopIGJ1ZmZlcjsKKworCQkvKiBDb3B5IGZpcnN0IGNwdS4gKi8KKwkJKnN0YXJ0ID0gYnVmZmVyOworCQltZW1jcHkoZHN0LCBzcmMsIGxlbmd0aCk7CisKKwkJLyogQWRkIHRoZSBvdGhlciBjcHVzIGluLCBvbmUgaW50IGF0IGEgdGltZSAqLworCQlmb3JfZWFjaF9jcHUoaSkgeworCQkJdW5zaWduZWQgaW50IGo7CisKKwkJCXNyYyA9ICgodTMyICopIElQX1JUX0FDQ1RfQ1BVKGkpKSArIG9mZnNldDsKKworCQkJZm9yIChqID0gMDsgaiA8IGxlbmd0aC80OyBqKyspCisJCQkJZHN0W2pdICs9IHNyY1tqXTsKKwkJfQorCX0KKwlyZXR1cm4gbGVuZ3RoOworfQorI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisjZW5kaWYgLyogQ09ORklHX05FVF9DTFNfUk9VVEUgKi8KKworc3RhdGljIF9faW5pdGRhdGEgdW5zaWduZWQgbG9uZyByaGFzaF9lbnRyaWVzOworc3RhdGljIGludCBfX2luaXQgc2V0X3JoYXNoX2VudHJpZXMoY2hhciAqc3RyKQoreworCWlmICghc3RyKQorCQlyZXR1cm4gMDsKKwlyaGFzaF9lbnRyaWVzID0gc2ltcGxlX3N0cnRvdWwoc3RyLCAmc3RyLCAwKTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoInJoYXNoX2VudHJpZXM9Iiwgc2V0X3JoYXNoX2VudHJpZXMpOworCitpbnQgX19pbml0IGlwX3J0X2luaXQodm9pZCkKK3sKKwlpbnQgaSwgb3JkZXIsIGdvYWwsIHJjID0gMDsKKworCXJ0X2hhc2hfcm5kID0gKGludCkgKChudW1fcGh5c3BhZ2VzIF4gKG51bV9waHlzcGFnZXM+PjgpKSBeCisJCQkgICAgIChqaWZmaWVzIF4gKGppZmZpZXMgPj4gNykpKTsKKworI2lmZGVmIENPTkZJR19ORVRfQ0xTX1JPVVRFCisJZm9yIChvcmRlciA9IDA7CisJICAgICAoUEFHRV9TSVpFIDw8IG9yZGVyKSA8IDI1NiAqIHNpemVvZihzdHJ1Y3QgaXBfcnRfYWNjdCkgKiBOUl9DUFVTOyBvcmRlcisrKQorCQkvKiBOT1RISU5HICovOworCWlwX3J0X2FjY3QgPSAoc3RydWN0IGlwX3J0X2FjY3QgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIG9yZGVyKTsKKwlpZiAoIWlwX3J0X2FjY3QpCisJCXBhbmljKCJJUDogZmFpbGVkIHRvIGFsbG9jYXRlIGlwX3J0X2FjY3RcbiIpOworCW1lbXNldChpcF9ydF9hY2N0LCAwLCBQQUdFX1NJWkUgPDwgb3JkZXIpOworI2VuZGlmCisKKwlpcHY0X2RzdF9vcHMua21lbV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaXBfZHN0X2NhY2hlIiwKKwkJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBydGFibGUpLAorCQkJCQkJICAgICAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sCisJCQkJCQkgICAgIE5VTEwsIE5VTEwpOworCisJaWYgKCFpcHY0X2RzdF9vcHMua21lbV9jYWNoZXApCisJCXBhbmljKCJJUDogZmFpbGVkIHRvIGFsbG9jYXRlIGlwX2RzdF9jYWNoZVxuIik7CisKKwlnb2FsID0gbnVtX3BoeXNwYWdlcyA+PiAoMjYgLSBQQUdFX1NISUZUKTsKKwlpZiAocmhhc2hfZW50cmllcykKKwkJZ29hbCA9IChyaGFzaF9lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBydF9oYXNoX2J1Y2tldCkpID4+IFBBR0VfU0hJRlQ7CisJZm9yIChvcmRlciA9IDA7ICgxVUwgPDwgb3JkZXIpIDwgZ29hbDsgb3JkZXIrKykKKwkJLyogTk9USElORyAqLzsKKworCWRvIHsKKwkJcnRfaGFzaF9tYXNrID0gKDFVTCA8PCBvcmRlcikgKiBQQUdFX1NJWkUgLworCQkJc2l6ZW9mKHN0cnVjdCBydF9oYXNoX2J1Y2tldCk7CisJCXdoaWxlIChydF9oYXNoX21hc2sgJiAocnRfaGFzaF9tYXNrIC0gMSkpCisJCQlydF9oYXNoX21hc2stLTsKKwkJcnRfaGFzaF90YWJsZSA9IChzdHJ1Y3QgcnRfaGFzaF9idWNrZXQgKikKKwkJCV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0FUT01JQywgb3JkZXIpOworCX0gd2hpbGUgKHJ0X2hhc2hfdGFibGUgPT0gTlVMTCAmJiAtLW9yZGVyID4gMCk7CisKKwlpZiAoIXJ0X2hhc2hfdGFibGUpCisJCXBhbmljKCJGYWlsZWQgdG8gYWxsb2NhdGUgSVAgcm91dGUgY2FjaGUgaGFzaCB0YWJsZVxuIik7CisKKwlwcmludGsoS0VSTl9JTkZPICJJUDogcm91dGluZyBjYWNoZSBoYXNoIHRhYmxlIG9mICV1IGJ1Y2tldHMsICVsZEtieXRlc1xuIiwKKwkgICAgICAgcnRfaGFzaF9tYXNrLAorCSAgICAgICAobG9uZykgKHJ0X2hhc2hfbWFzayAqIHNpemVvZihzdHJ1Y3QgcnRfaGFzaF9idWNrZXQpKSAvIDEwMjQpOworCisJZm9yIChydF9oYXNoX2xvZyA9IDA7ICgxIDw8IHJ0X2hhc2hfbG9nKSAhPSBydF9oYXNoX21hc2s7IHJ0X2hhc2hfbG9nKyspCisJCS8qIE5PVEhJTkcgKi87CisKKwlydF9oYXNoX21hc2stLTsKKwlmb3IgKGkgPSAwOyBpIDw9IHJ0X2hhc2hfbWFzazsgaSsrKSB7CisJCXNwaW5fbG9ja19pbml0KCZydF9oYXNoX3RhYmxlW2ldLmxvY2spOworCQlydF9oYXNoX3RhYmxlW2ldLmNoYWluID0gTlVMTDsKKwl9CisKKwlpcHY0X2RzdF9vcHMuZ2NfdGhyZXNoID0gKHJ0X2hhc2hfbWFzayArIDEpOworCWlwX3J0X21heF9zaXplID0gKHJ0X2hhc2hfbWFzayArIDEpICogMTY7CisKKwlydF9jYWNoZV9zdGF0ID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBydF9jYWNoZV9zdGF0KTsKKwlpZiAoIXJ0X2NhY2hlX3N0YXQpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2aW5ldF9pbml0KCk7CisJaXBfZmliX2luaXQoKTsKKworCWluaXRfdGltZXIoJnJ0X2ZsdXNoX3RpbWVyKTsKKwlydF9mbHVzaF90aW1lci5mdW5jdGlvbiA9IHJ0X3J1bl9mbHVzaDsKKwlpbml0X3RpbWVyKCZydF9wZXJpb2RpY190aW1lcik7CisJcnRfcGVyaW9kaWNfdGltZXIuZnVuY3Rpb24gPSBydF9jaGVja19leHBpcmU7CisJaW5pdF90aW1lcigmcnRfc2VjcmV0X3RpbWVyKTsKKwlydF9zZWNyZXRfdGltZXIuZnVuY3Rpb24gPSBydF9zZWNyZXRfcmVidWlsZDsKKworCS8qIEFsbCB0aGUgdGltZXJzLCBzdGFydGVkIGF0IHN5c3RlbSBzdGFydHVwIHRlbmQKKwkgICB0byBzeW5jaHJvbml6ZS4gUGVydHVyYiBpdCBhIGJpdC4KKwkgKi8KKwlydF9wZXJpb2RpY190aW1lci5leHBpcmVzID0gamlmZmllcyArIG5ldF9yYW5kb20oKSAlIGlwX3J0X2djX2ludGVydmFsICsKKwkJCQkJaXBfcnRfZ2NfaW50ZXJ2YWw7CisJYWRkX3RpbWVyKCZydF9wZXJpb2RpY190aW1lcik7CisKKwlydF9zZWNyZXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBuZXRfcmFuZG9tKCkgJSBpcF9ydF9zZWNyZXRfaW50ZXJ2YWwgKworCQlpcF9ydF9zZWNyZXRfaW50ZXJ2YWw7CisJYWRkX3RpbWVyKCZydF9zZWNyZXRfdGltZXIpOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwl7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpydHN0YXRfcGRlID0gTlVMTDsgLyoga2VlcCBnY2MgaGFwcHkgKi8KKwlpZiAoIXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJydF9jYWNoZSIsIFNfSVJVR08sICZydF9jYWNoZV9zZXFfZm9wcykgfHwKKwkgICAgIShydHN0YXRfcGRlID0gY3JlYXRlX3Byb2NfZW50cnkoInJ0X2NhY2hlIiwgU19JUlVHTywgCisJCQkgICAgCQkgICAgIHByb2NfbmV0X3N0YXQpKSkgeworCQlmcmVlX3BlcmNwdShydF9jYWNoZV9zdGF0KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJ0c3RhdF9wZGUtPnByb2NfZm9wcyA9ICZydF9jcHVfc2VxX2ZvcHM7CisJfQorI2lmZGVmIENPTkZJR19ORVRfQ0xTX1JPVVRFCisJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgicnRfYWNjdCIsIDAsIHByb2NfbmV0LCBpcF9ydF9hY2N0X3JlYWQsIE5VTEwpOworI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfWEZSTQorCXhmcm1faW5pdCgpOworCXhmcm00X2luaXQoKTsKKyNlbmRpZgorCXJldHVybiByYzsKK30KKworRVhQT1JUX1NZTUJPTChfX2lwX3NlbGVjdF9pZGVudCk7CitFWFBPUlRfU1lNQk9MKGlwX3JvdXRlX2lucHV0KTsKK0VYUE9SVF9TWU1CT0woaXBfcm91dGVfb3V0cHV0X2tleSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9zeW5jb29raWVzLmMgYi9uZXQvaXB2NC9zeW5jb29raWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyM2QyZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L3N5bmNvb2tpZXMuYwpAQCAtMCwwICsxLDI3OSBAQAorLyoKKyAqICBTeW5jb29raWVzIGltcGxlbWVudGF0aW9uIGZvciB0aGUgTGludXgga2VybmVsCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NyBBbmRpIEtsZWVuCisgKiAgQmFzZWQgb24gaWRlYXMgYnkgRC5KLkJlcm5zdGVpbiBhbmQgRXJpYyBTY2hlbmsuIAorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAkSWQ6IHN5bmNvb2tpZXMuYyx2IDEuMTggMjAwMi8wMi8wMSAyMjowMTowNCBkYXZlbSBFeHAgJAorICoKKyAqICBNaXNzaW5nOiBJUHY2IHN1cHBvcnQuIAorICovCisKKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKworZXh0ZXJuIGludCBzeXNjdGxfdGNwX3N5bmNvb2tpZXM7CisKK3N0YXRpYyBfX3UzMiBzeW5jb29raWVfc2VjcmV0WzJdWzE2LTMrU0hBX0RJR0VTVF9XT1JEU107CisKK3N0YXRpYyBfX2luaXQgaW50IGluaXRfc3luY29va2llcyh2b2lkKQoreworCWdldF9yYW5kb21fYnl0ZXMoc3luY29va2llX3NlY3JldCwgc2l6ZW9mKHN5bmNvb2tpZV9zZWNyZXQpKTsKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KGluaXRfc3luY29va2llcyk7CisKKyNkZWZpbmUgQ09PS0lFQklUUyAyNAkvKiBVcHBlciBiaXRzIHN0b3JlIGNvdW50ICovCisjZGVmaW5lIENPT0tJRU1BU0sgKCgoX191MzIpMSA8PCBDT09LSUVCSVRTKSAtIDEpCisKK3N0YXRpYyB1MzIgY29va2llX2hhc2godTMyIHNhZGRyLCB1MzIgZGFkZHIsIHUzMiBzcG9ydCwgdTMyIGRwb3J0LAorCQkgICAgICAgdTMyIGNvdW50LCBpbnQgYykKK3sKKwlfX3UzMiB0bXBbMTYgKyA1ICsgU0hBX1dPUktTUEFDRV9XT1JEU107CisKKwltZW1jcHkodG1wICsgMywgc3luY29va2llX3NlY3JldFtjXSwgc2l6ZW9mKHN5bmNvb2tpZV9zZWNyZXRbY10pKTsKKwl0bXBbMF0gPSBzYWRkcjsKKwl0bXBbMV0gPSBkYWRkcjsKKwl0bXBbMl0gPSAoc3BvcnQgPDwgMTYpICsgZHBvcnQ7CisJdG1wWzNdID0gY291bnQ7CisJc2hhX3RyYW5zZm9ybSh0bXAgKyAxNiwgKF9fdTggKil0bXAsIHRtcCArIDE2ICsgNSk7CisKKwlyZXR1cm4gdG1wWzE3XTsKK30KKworc3RhdGljIF9fdTMyIHNlY3VyZV90Y3Bfc3luX2Nvb2tpZShfX3UzMiBzYWRkciwgX191MzIgZGFkZHIsIF9fdTE2IHNwb3J0LAorCQkJCSAgIF9fdTE2IGRwb3J0LCBfX3UzMiBzc2VxLCBfX3UzMiBjb3VudCwKKwkJCQkgICBfX3UzMiBkYXRhKQoreworCS8qCisJICogQ29tcHV0ZSB0aGUgc2VjdXJlIHNlcXVlbmNlIG51bWJlci4KKwkgKiBUaGUgb3V0cHV0IHNob3VsZCBiZToKKyAgIAkgKiAgIEhBU0goc2VjMSxzYWRkcixzcG9ydCxkYWRkcixkcG9ydCxzZWMxKSArIHNzZXEgKyAoY291bnQgKiAyXjI0KQorCSAqICAgICAgKyAoSEFTSChzZWMyLHNhZGRyLHNwb3J0LGRhZGRyLGRwb3J0LGNvdW50LHNlYzIpICUgMl4yNCkuCisJICogV2hlcmUgc3NlcSBpcyB0aGVpciBzZXF1ZW5jZSBudW1iZXIgYW5kIGNvdW50IGluY3JlYXNlcyBldmVyeQorCSAqIG1pbnV0ZSBieSAxLgorCSAqIEFzIGFuIGV4dHJhIGhhY2ssIHdlIGFkZCBhIHNtYWxsICJkYXRhIiB2YWx1ZSB0aGF0IGVuY29kZXMgdGhlCisJICogTVNTIGludG8gdGhlIHNlY29uZCBoYXNoIHZhbHVlLgorCSAqLworCisJcmV0dXJuIChjb29raWVfaGFzaChzYWRkciwgZGFkZHIsIHNwb3J0LCBkcG9ydCwgMCwgMCkgKworCQlzc2VxICsgKGNvdW50IDw8IENPT0tJRUJJVFMpICsKKwkJKChjb29raWVfaGFzaChzYWRkciwgZGFkZHIsIHNwb3J0LCBkcG9ydCwgY291bnQsIDEpICsgZGF0YSkKKwkJICYgQ09PS0lFTUFTSykpOworfQorCisvKgorICogVGhpcyByZXRyaWV2ZXMgdGhlIHNtYWxsICJkYXRhIiB2YWx1ZSBmcm9tIHRoZSBzeW5jb29raWUuCisgKiBJZiB0aGUgc3luY29va2llIGlzIGJhZCwgdGhlIGRhdGEgcmV0dXJuZWQgd2lsbCBiZSBvdXQgb2YKKyAqIHJhbmdlLiAgVGhpcyBtdXN0IGJlIGNoZWNrZWQgYnkgdGhlIGNhbGxlci4KKyAqCisgKiBUaGUgY291bnQgdmFsdWUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY29va2llIG11c3QgYmUgd2l0aGluCisgKiAibWF4ZGlmZiIgaWYgdGhlIGN1cnJlbnQgKHBhc3NlZC1pbikgImNvdW50Ii4gIFRoZSByZXR1cm4gdmFsdWUKKyAqIGlzIChfX3UzMiktMSBpZiB0aGlzIHRlc3QgZmFpbHMuCisgKi8KK3N0YXRpYyBfX3UzMiBjaGVja190Y3Bfc3luX2Nvb2tpZShfX3UzMiBjb29raWUsIF9fdTMyIHNhZGRyLCBfX3UzMiBkYWRkciwKKwkJCQkgIF9fdTE2IHNwb3J0LCBfX3UxNiBkcG9ydCwgX191MzIgc3NlcSwKKwkJCQkgIF9fdTMyIGNvdW50LCBfX3UzMiBtYXhkaWZmKQoreworCV9fdTMyIGRpZmY7CisKKwkvKiBTdHJpcCBhd2F5IHRoZSBsYXllcnMgZnJvbSB0aGUgY29va2llICovCisJY29va2llIC09IGNvb2tpZV9oYXNoKHNhZGRyLCBkYWRkciwgc3BvcnQsIGRwb3J0LCAwLCAwKSArIHNzZXE7CisKKwkvKiBDb29raWUgaXMgbm93IHJlZHVjZWQgdG8gKGNvdW50ICogMl4yNCkgXiAoaGFzaCAlIDJeMjQpICovCisJZGlmZiA9IChjb3VudCAtIChjb29raWUgPj4gQ09PS0lFQklUUykpICYgKChfX3UzMikgLSAxID4+IENPT0tJRUJJVFMpOworCWlmIChkaWZmID49IG1heGRpZmYpCisJCXJldHVybiAoX191MzIpLTE7CisKKwlyZXR1cm4gKGNvb2tpZSAtCisJCWNvb2tpZV9oYXNoKHNhZGRyLCBkYWRkciwgc3BvcnQsIGRwb3J0LCBjb3VudCAtIGRpZmYsIDEpKQorCQkmIENPT0tJRU1BU0s7CS8qIExlYXZpbmcgdGhlIGRhdGEgYmVoaW5kICovCit9CisKKy8qIAorICogVGhpcyB0YWJsZSBoYXMgdG8gYmUgc29ydGVkIGFuZCB0ZXJtaW5hdGVkIHdpdGggKF9fdTE2KS0xLgorICogWFhYIGdlbmVyYXRlIGEgYmV0dGVyIHRhYmxlLgorICogVW5yZXNvbHZlZCBJc3N1ZXM6IEhJUFBJIHdpdGggYSA2NGsgTVNTIGlzIG5vdCB3ZWxsIHN1cHBvcnRlZC4KKyAqLworc3RhdGljIF9fdTE2IGNvbnN0IG1zc3RhYltdID0geworCTY0IC0gMSwKKwkyNTYgLSAxLAkKKwk1MTIgLSAxLAorCTUzNiAtIDEsCisJMTAyNCAtIDEsCQorCTE0NDAgLSAxLAorCTE0NjAgLSAxLAorCTQzMTIgLSAxLAorCShfX3UxNiktMQorfTsKKy8qIFRoZSBudW1iZXIgZG9lc24ndCBpbmNsdWRlIHRoZSAtMSB0ZXJtaW5hdG9yICovCisjZGVmaW5lIE5VTV9NU1MgKEFSUkFZX1NJWkUobXNzdGFiKSAtIDEpCisKKy8qCisgKiBHZW5lcmF0ZSBhIHN5bmNvb2tpZS4gIG1zc3AgcG9pbnRzIHRvIHRoZSBtc3MsIHdoaWNoIGlzIHJldHVybmVkCisgKiByb3VuZGVkIGRvd24gdG8gdGhlIHZhbHVlIGVuY29kZWQgaW4gdGhlIGNvb2tpZS4KKyAqLworX191MzIgY29va2llX3Y0X2luaXRfc2VxdWVuY2Uoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX3UxNiAqbXNzcCkKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlpbnQgbXNzaW5kOworCWNvbnN0IF9fdTE2IG1zcyA9ICptc3NwOworCisJCisJdHAtPmxhc3Rfc3lucV9vdmVyZmxvdyA9IGppZmZpZXM7CisKKwkvKiBYWFggc29ydCBtc3N0YWJbXSBieSBwcm9iYWJpbGl0eT8gIEJpbmFyeSBzZWFyY2g/ICovCisJZm9yIChtc3NpbmQgPSAwOyBtc3MgPiBtc3N0YWJbbXNzaW5kICsgMV07IG1zc2luZCsrKQorCQk7CisJKm1zc3AgPSBtc3N0YWJbbXNzaW5kXSArIDE7CisKKwlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9TWU5DT09LSUVTU0VOVCk7CisKKwlyZXR1cm4gc2VjdXJlX3RjcF9zeW5fY29va2llKHNrYi0+bmguaXBoLT5zYWRkciwgc2tiLT5uaC5pcGgtPmRhZGRyLAorCQkJCSAgICAgc2tiLT5oLnRoLT5zb3VyY2UsIHNrYi0+aC50aC0+ZGVzdCwKKwkJCQkgICAgIG50b2hsKHNrYi0+aC50aC0+c2VxKSwKKwkJCQkgICAgIGppZmZpZXMgLyAoSFogKiA2MCksIG1zc2luZCk7Cit9CisKKy8qIAorICogVGhpcyAobWlzbmFtZWQpIHZhbHVlIGlzIHRoZSBhZ2Ugb2Ygc3luY29va2llIHdoaWNoIGlzIHBlcm1pdHRlZC4KKyAqIEl0cyBpZGVhbCB2YWx1ZSBzaG91bGQgYmUgZGVwZW5kZW50IG9uIFRDUF9USU1FT1VUX0lOSVQgYW5kCisgKiBzeXNjdGxfdGNwX3JldHJpZXMxLiBJdCdzIGEgcmF0aGVyIGNvbXBsaWNhdGVkIGZvcm11bGEgKGV4cG9uZW50aWFsCisgKiBiYWNrb2ZmKSB0byBjb21wdXRlIGF0IHJ1bnRpbWUgc28gaXQncyBjdXJyZW50bHkgaGFyZGNvZGVkIGhlcmUuCisgKi8KKyNkZWZpbmUgQ09VTlRFUl9UUklFUyA0CisvKiAgCisgKiBDaGVjayBpZiBhIGFjayBzZXF1ZW5jZSBudW1iZXIgaXMgYSB2YWxpZCBzeW5jb29raWUuIAorICogUmV0dXJuIHRoZSBkZWNvZGVkIG1zcyBpZiBpdCBpcywgb3IgMCBpZiBub3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvb2tpZV9jaGVjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX3UzMiBjb29raWUpCit7CisJX191MzIgc2VxOyAKKwlfX3UzMiBtc3NpbmQ7CisKKwlzZXEgPSBudG9obChza2ItPmgudGgtPnNlcSktMTsgCisJbXNzaW5kID0gY2hlY2tfdGNwX3N5bl9jb29raWUoY29va2llLAorCQkJCSAgICAgIHNrYi0+bmguaXBoLT5zYWRkciwgc2tiLT5uaC5pcGgtPmRhZGRyLAorCQkJCSAgICAgIHNrYi0+aC50aC0+c291cmNlLCBza2ItPmgudGgtPmRlc3QsCisJCQkJICAgICAgc2VxLCBqaWZmaWVzIC8gKEhaICogNjApLCBDT1VOVEVSX1RSSUVTKTsKKworCXJldHVybiBtc3NpbmQgPCBOVU1fTVNTID8gbXNzdGFiW21zc2luZF0gKyAxIDogMDsKK30KKworZXh0ZXJuIHN0cnVjdCBvcl9jYWxsdGFibGUgb3JfaXB2NDsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29jayAqZ2V0X2Nvb2tpZV9zb2NrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICAgc3RydWN0IG9wZW5fcmVxdWVzdCAqcmVxLAorCQkJCQkgICBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IHNvY2sgKmNoaWxkOworCisJY2hpbGQgPSB0cC0+YWZfc3BlY2lmaWMtPnN5bl9yZWN2X3NvY2soc2ssIHNrYiwgcmVxLCBkc3QpOworCWlmIChjaGlsZCkKKwkJdGNwX2FjY2VwdHFfcXVldWUoc2ssIHJlcSwgY2hpbGQpOworCWVsc2UKKwkJdGNwX29wZW5yZXFfZnJlZShyZXEpOworCisJcmV0dXJuIGNoaWxkOworfQorCitzdHJ1Y3Qgc29jayAqY29va2llX3Y0X2NoZWNrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgc3RydWN0IGlwX29wdGlvbnMgKm9wdCkKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlfX3UzMiBjb29raWUgPSBudG9obChza2ItPmgudGgtPmFja19zZXEpIC0gMTsgCisJc3RydWN0IHNvY2sgKnJldCA9IHNrOworCXN0cnVjdCBvcGVuX3JlcXVlc3QgKnJlcTsgCisJaW50IG1zczsgCisJc3RydWN0IHJ0YWJsZSAqcnQ7IAorCV9fdTggcmN2X3dzY2FsZTsKKworCWlmICghc3lzY3RsX3RjcF9zeW5jb29raWVzIHx8ICFza2ItPmgudGgtPmFjaykKKwkJZ290byBvdXQ7CisKKyAgCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRwLT5sYXN0X3N5bnFfb3ZlcmZsb3cgKyBUQ1BfVElNRU9VVF9JTklUKSB8fAorCSAgICAobXNzID0gY29va2llX2NoZWNrKHNrYiwgY29va2llKSkgPT0gMCkgeworCSAJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfU1lOQ09PS0lFU0ZBSUxFRCk7CisJCWdvdG8gb3V0OworCX0KKworCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1NZTkNPT0tJRVNSRUNWKTsKKworCXJlcSA9IHRjcF9vcGVucmVxX2FsbG9jKCk7CisJcmV0ID0gTlVMTDsKKwlpZiAoIXJlcSkKKwkJZ290byBvdXQ7CisKKwlyZXEtPnJjdl9pc24JCT0gaHRvbmwoc2tiLT5oLnRoLT5zZXEpIC0gMTsKKwlyZXEtPnNudF9pc24JCT0gY29va2llOyAKKwlyZXEtPm1zcwkJPSBtc3M7CisgCXJlcS0+cm10X3BvcnQJCT0gc2tiLT5oLnRoLT5zb3VyY2U7CisJcmVxLT5hZi52NF9yZXEubG9jX2FkZHIgPSBza2ItPm5oLmlwaC0+ZGFkZHI7CisJcmVxLT5hZi52NF9yZXEucm10X2FkZHIgPSBza2ItPm5oLmlwaC0+c2FkZHI7CisJcmVxLT5jbGFzcwkJPSAmb3JfaXB2NDsgLyogZm9yIHNhdmV0eSAqLworCXJlcS0+YWYudjRfcmVxLm9wdAk9IE5VTEw7CisKKwkvKiBXZSB0aHJvd2VkIHRoZSBvcHRpb25zIG9mIHRoZSBpbml0aWFsIFNZTiBhd2F5LCBzbyB3ZSBob3BlCisJICogdGhlIEFDSyBjYXJyaWVzIHRoZSBzYW1lIG9wdGlvbnMgYWdhaW4gKHNlZSBSRkMxMTIyIDQuMi4zLjgpCisJICovCisJaWYgKG9wdCAmJiBvcHQtPm9wdGxlbikgeworCQlpbnQgb3B0X3NpemUgPSBzaXplb2Yoc3RydWN0IGlwX29wdGlvbnMpICsgb3B0LT5vcHRsZW47CisKKwkJcmVxLT5hZi52NF9yZXEub3B0ID0ga21hbGxvYyhvcHRfc2l6ZSwgR0ZQX0FUT01JQyk7CisJCWlmIChyZXEtPmFmLnY0X3JlcS5vcHQpIHsKKwkJCWlmIChpcF9vcHRpb25zX2VjaG8ocmVxLT5hZi52NF9yZXEub3B0LCBza2IpKSB7CisJCQkJa2ZyZWUocmVxLT5hZi52NF9yZXEub3B0KTsKKwkJCQlyZXEtPmFmLnY0X3JlcS5vcHQgPSBOVUxMOworCQkJfQorCQl9CisJfQorCisJcmVxLT5zbmRfd3NjYWxlID0gcmVxLT5yY3Zfd3NjYWxlID0gcmVxLT50c3RhbXBfb2sgPSAwOworCXJlcS0+d3NjYWxlX29rCT0gcmVxLT5zYWNrX29rID0gMDsgCisJcmVxLT5leHBpcmVzCT0gMFVMOyAKKwlyZXEtPnJldHJhbnMJPSAwOyAKKwkKKwkvKgorCSAqIFdlIG5lZWQgdG8gbG9va3VwIHRoZSByb3V0ZSBoZXJlIHRvIGdldCBhdCB0aGUgY29ycmVjdAorCSAqIHdpbmRvdyBzaXplLiBXZSBzaG91bGQgYmV0dGVyIG1ha2Ugc3VyZSB0aGF0IHRoZSB3aW5kb3cgc2l6ZQorCSAqIGhhc24ndCBjaGFuZ2VkIHNpbmNlIHdlIHJlY2VpdmVkIHRoZSBvcmlnaW5hbCBzeW4sIGJ1dCBJIHNlZQorCSAqIG5vIGVhc3kgd2F5IHRvIGRvIHRoaXMuIAorCSAqLworCXsKKwkJc3RydWN0IGZsb3dpIGZsID0geyAubmxfdSA9IHsgLmlwNF91ID0KKwkJCQkJICAgICAgeyAuZGFkZHIgPSAoKG9wdCAmJiBvcHQtPnNycikgPworCQkJCQkJCSAgb3B0LT5mYWRkciA6CisJCQkJCQkJICByZXEtPmFmLnY0X3JlcS5ybXRfYWRkciksCisJCQkJCQkuc2FkZHIgPSByZXEtPmFmLnY0X3JlcS5sb2NfYWRkciwKKwkJCQkJCS50b3MgPSBSVF9DT05OX0ZMQUdTKHNrKSB9IH0sCisJCQkJICAgIC5wcm90byA9IElQUFJPVE9fVENQLAorCQkJCSAgICAudWxpX3UgPSB7IC5wb3J0cyA9CisJCQkJCSAgICAgICB7IC5zcG9ydCA9IHNrYi0+aC50aC0+ZGVzdCwKKwkJCQkJCSAuZHBvcnQgPSBza2ItPmgudGgtPnNvdXJjZSB9IH0gfTsKKwkJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpKSB7CisJCQl0Y3Bfb3BlbnJlcV9mcmVlKHJlcSk7CisJCQlnb3RvIG91dDsgCisJCX0KKwl9CisKKwkvKiBUcnkgdG8gcmVkbyB3aGF0IHRjcF92NF9zZW5kX3N5bmFjayBkaWQuICovCisJcmVxLT53aW5kb3dfY2xhbXAgPSBkc3RfbWV0cmljKCZydC0+dS5kc3QsIFJUQVhfV0lORE9XKTsKKwl0Y3Bfc2VsZWN0X2luaXRpYWxfd2luZG93KHRjcF9mdWxsX3NwYWNlKHNrKSwgcmVxLT5tc3MsCisJCQkJICAmcmVxLT5yY3Zfd25kLCAmcmVxLT53aW5kb3dfY2xhbXAsIAorCQkJCSAgMCwgJnJjdl93c2NhbGUpOworCS8qIEJUVyB3aW4gc2NhbGUgd2l0aCBzeW5jb29raWVzIGlzIDAgYnkgZGVmaW5pdGlvbiAqLworCXJlcS0+cmN2X3dzY2FsZQkgID0gcmN2X3dzY2FsZTsgCisKKwlyZXQgPSBnZXRfY29va2llX3NvY2soc2ssIHNrYiwgcmVxLCAmcnQtPnUuZHN0KTsKK291dDoJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jIGIvbmV0L2lwdjQvc3lzY3RsX25ldF9pcHY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FhZmIyOQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jCkBAIC0wLDAgKzEsNjk4IEBACisvKgorICogc3lzY3RsX25ldF9pcHY0LmM6IHN5c2N0bCBpbnRlcmZhY2UgdG8gbmV0IElQVjQgc3Vic3lzdGVtLgorICoKKyAqICRJZDogc3lzY3RsX25ldF9pcHY0LmMsdiAxLjUwIDIwMDEvMTAvMjAgMDA6MDA6MTEgZGF2ZW0gRXhwICQKKyAqCisgKiBCZWd1biBBcHJpbCAxLCAxOTk2LCBNaWtlIFNoYXZlci4KKyAqIEFkZGVkIC9wcm9jL3N5cy9uZXQvaXB2NCBkaXJlY3RvcnkgZW50cnkgKGVtcHR5ID0pICkuIFtNU10KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxuZXQvc25tcC5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKworLyogRnJvbSBhZl9pbmV0LmMgKi8KK2V4dGVybiBpbnQgc3lzY3RsX2lwX25vbmxvY2FsX2JpbmQ7CisKKy8qIEZyb20gaWNtcC5jICovCitleHRlcm4gaW50IHN5c2N0bF9pY21wX2VjaG9faWdub3JlX2FsbDsKK2V4dGVybiBpbnQgc3lzY3RsX2ljbXBfZWNob19pZ25vcmVfYnJvYWRjYXN0czsKK2V4dGVybiBpbnQgc3lzY3RsX2ljbXBfaWdub3JlX2JvZ3VzX2Vycm9yX3Jlc3BvbnNlczsKKworLyogRnJvbSBpcF9mcmFnbWVudC5jICovCitleHRlcm4gaW50IHN5c2N0bF9pcGZyYWdfbG93X3RocmVzaDsKK2V4dGVybiBpbnQgc3lzY3RsX2lwZnJhZ19oaWdoX3RocmVzaDsgCitleHRlcm4gaW50IHN5c2N0bF9pcGZyYWdfdGltZTsKK2V4dGVybiBpbnQgc3lzY3RsX2lwZnJhZ19zZWNyZXRfaW50ZXJ2YWw7CisKKy8qIEZyb20gaXBfb3V0cHV0LmMgKi8KK2V4dGVybiBpbnQgc3lzY3RsX2lwX2R5bmFkZHI7CisKKy8qIEZyb20gaWNtcC5jICovCitleHRlcm4gaW50IHN5c2N0bF9pY21wX3JhdGVsaW1pdDsKK2V4dGVybiBpbnQgc3lzY3RsX2ljbXBfcmF0ZW1hc2s7CisKKy8qIEZyb20gaWdtcC5jICovCitleHRlcm4gaW50IHN5c2N0bF9pZ21wX21heF9tZW1iZXJzaGlwczsKK2V4dGVybiBpbnQgc3lzY3RsX2lnbXBfbWF4X21zZjsKKworLyogRnJvbSBpbmV0cGVlci5jICovCitleHRlcm4gaW50IGluZXRfcGVlcl90aHJlc2hvbGQ7CitleHRlcm4gaW50IGluZXRfcGVlcl9taW50dGw7CitleHRlcm4gaW50IGluZXRfcGVlcl9tYXh0dGw7CitleHRlcm4gaW50IGluZXRfcGVlcl9nY19taW50aW1lOworZXh0ZXJuIGludCBpbmV0X3BlZXJfZ2NfbWF4dGltZTsKKworI2lmZGVmIENPTkZJR19TWVNDVEwKK3N0YXRpYyBpbnQgdGNwX3JldHIxX21heCA9IDI1NTsgCitzdGF0aWMgaW50IGlwX2xvY2FsX3BvcnRfcmFuZ2VfbWluW10gPSB7IDEsIDEgfTsKK3N0YXRpYyBpbnQgaXBfbG9jYWxfcG9ydF9yYW5nZV9tYXhbXSA9IHsgNjU1MzUsIDY1NTM1IH07CisjZW5kaWYKKworc3RydWN0IGlwdjRfY29uZmlnIGlwdjRfY29uZmlnOworCitleHRlcm4gY3RsX3RhYmxlIGlwdjRfcm91dGVfdGFibGVbXTsKKworI2lmZGVmIENPTkZJR19TWVNDVEwKKworc3RhdGljCitpbnQgaXB2NF9zeXNjdGxfZm9yd2FyZChjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqIGZpbHAsCisJCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgdmFsID0gaXB2NF9kZXZjb25mLmZvcndhcmRpbmc7CisJaW50IHJldDsKKworCXJldCA9IHByb2NfZG9pbnR2ZWMoY3RsLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKworCWlmICh3cml0ZSAmJiBpcHY0X2RldmNvbmYuZm9yd2FyZGluZyAhPSB2YWwpCisJCWluZXRfZm9yd2FyZF9jaGFuZ2UoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXB2NF9zeXNjdGxfZm9yd2FyZF9zdHJhdGVneShjdGxfdGFibGUgKnRhYmxlLAorCQkJIGludCBfX3VzZXIgKm5hbWUsIGludCBubGVuLAorCQkJIHZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCisJCQkgdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbiwgCisJCQkgdm9pZCAqKmNvbnRleHQpCit7CisJaW50ICp2YWxwID0gdGFibGUtPmRhdGE7CisJaW50IG5ldzsKKworCWlmICghbmV3dmFsIHx8ICFuZXdsZW4pCisJCXJldHVybiAwOworCisJaWYgKG5ld2xlbiAhPSBzaXplb2YoaW50KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZ2V0X3VzZXIobmV3LCAoaW50IF9fdXNlciAqKW5ld3ZhbCkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKG5ldyA9PSAqdmFscCkKKwkJcmV0dXJuIDA7CisKKwlpZiAob2xkdmFsICYmIG9sZGxlbnApIHsKKwkJc2l6ZV90IGxlbjsKKworCQlpZiAoZ2V0X3VzZXIobGVuLCBvbGRsZW5wKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChsZW4pIHsKKwkJCWlmIChsZW4gPiB0YWJsZS0+bWF4bGVuKQorCQkJCWxlbiA9IHRhYmxlLT5tYXhsZW47CisJCQlpZiAoY29weV90b191c2VyKG9sZHZhbCwgdmFscCwgbGVuKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChwdXRfdXNlcihsZW4sIG9sZGxlbnApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCisJKnZhbHAgPSBuZXc7CisJaW5ldF9mb3J3YXJkX2NoYW5nZSgpOworCXJldHVybiAxOworfQorCitjdGxfdGFibGUgaXB2NF90YWJsZVtdID0geworICAgICAgICB7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X1RDUF9USU1FU1RBTVBTLAorCQkucHJvY25hbWUJPSAidGNwX3RpbWVzdGFtcHMiLAorCQkuZGF0YQkJPSAmc3lzY3RsX3RjcF90aW1lc3RhbXBzLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKKwl9LAorICAgICAgICB7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X1RDUF9XSU5ET1dfU0NBTElORywKKwkJLnByb2NuYW1lCT0gInRjcF93aW5kb3dfc2NhbGluZyIsCisJCS5kYXRhCQk9ICZzeXNjdGxfdGNwX3dpbmRvd19zY2FsaW5nLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKKwl9LAorICAgICAgICB7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X1RDUF9TQUNLLAorCQkucHJvY25hbWUJPSAidGNwX3NhY2siLAorCQkuZGF0YQkJPSAmc3lzY3RsX3RjcF9zYWNrLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKKwl9LAorICAgICAgICB7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X1RDUF9SRVRSQU5TX0NPTExBUFNFLAorCQkucHJvY25hbWUJPSAidGNwX3JldHJhbnNfY29sbGFwc2UiLAorCQkuZGF0YQkJPSAmc3lzY3RsX3RjcF9yZXRyYW5zX2NvbGxhcHNlLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKKwl9LAorICAgICAgICB7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X0ZPUldBUkQsCisJCS5wcm9jbmFtZQk9ICJpcF9mb3J3YXJkIiwKKwkJLmRhdGEJCT0gJmlwdjRfZGV2Y29uZi5mb3J3YXJkaW5nLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJmlwdjRfc3lzY3RsX2ZvcndhcmQsCisJCS5zdHJhdGVneQk9ICZpcHY0X3N5c2N0bF9mb3J3YXJkX3N0cmF0ZWd5CisJfSwKKyAgICAgICAgeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ERUZBVUxUX1RUTCwKKwkJLnByb2NuYW1lCT0gImlwX2RlZmF1bHRfdHRsIiwKKyAJCS5kYXRhCQk9ICZzeXNjdGxfaXBfZGVmYXVsdF90dGwsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmaXB2NF9kb2ludF9hbmRfZmx1c2gsCisJCS5zdHJhdGVneQk9ICZpcHY0X2RvaW50X2FuZF9mbHVzaF9zdHJhdGVneSwKKwl9LAorICAgICAgICB7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X0FVVE9DT05GSUcsCisJCS5wcm9jbmFtZQk9ICJpcF9hdXRvY29uZmlnIiwKKwkJLmRhdGEJCT0gJmlwdjRfY29uZmlnLmF1dG9jb25maWcsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisgICAgICAgIHsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTk9fUE1UVV9ESVNDLAorCQkucHJvY25hbWUJPSAiaXBfbm9fcG10dV9kaXNjIiwKKwkJLmRhdGEJCT0gJmlwdjRfY29uZmlnLm5vX3BtdHVfZGlzYywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05PTkxPQ0FMX0JJTkQsCisJCS5wcm9jbmFtZQk9ICJpcF9ub25sb2NhbF9iaW5kIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9pcF9ub25sb2NhbF9iaW5kLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfVENQX1NZTl9SRVRSSUVTLAorCQkucHJvY25hbWUJPSAidGNwX3N5bl9yZXRyaWVzIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF90Y3Bfc3luX3JldHJpZXMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfVENQX1NZTkFDS19SRVRSSUVTLAorCQkucHJvY25hbWUJPSAidGNwX3N5bmFja19yZXRyaWVzIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF90Y3Bfc3luYWNrX3JldHJpZXMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfVENQX01BWF9PUlBIQU5TLAorCQkucHJvY25hbWUJPSAidGNwX21heF9vcnBoYW5zIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF90Y3BfbWF4X29ycGhhbnMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfVENQX01BWF9UV19CVUNLRVRTLAorCQkucHJvY25hbWUJPSAidGNwX21heF90d19idWNrZXRzIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF90Y3BfbWF4X3R3X2J1Y2tldHMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9JUEZSQUdfSElHSF9USFJFU0gsCisJCS5wcm9jbmFtZQk9ICJpcGZyYWdfaGlnaF90aHJlc2giLAorCQkuZGF0YQkJPSAmc3lzY3RsX2lwZnJhZ19oaWdoX3RocmVzaCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X0lQRlJBR19MT1dfVEhSRVNILAorCQkucHJvY25hbWUJPSAiaXBmcmFnX2xvd190aHJlc2giLAorCQkuZGF0YQkJPSAmc3lzY3RsX2lwZnJhZ19sb3dfdGhyZXNoLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfRFlOQUREUiwKKwkJLnByb2NuYW1lCT0gImlwX2R5bmFkZHIiLAorCQkuZGF0YQkJPSAmc3lzY3RsX2lwX2R5bmFkZHIsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9JUEZSQUdfVElNRSwKKwkJLnByb2NuYW1lCT0gImlwZnJhZ190aW1lIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9pcGZyYWdfdGltZSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfamlmZmllcworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9UQ1BfS0VFUEFMSVZFX1RJTUUsCisJCS5wcm9jbmFtZQk9ICJ0Y3Bfa2VlcGFsaXZlX3RpbWUiLAorCQkuZGF0YQkJPSAmc3lzY3RsX3RjcF9rZWVwYWxpdmVfdGltZSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfamlmZmllcworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9UQ1BfS0VFUEFMSVZFX1BST0JFUywKKwkJLnByb2NuYW1lCT0gInRjcF9rZWVwYWxpdmVfcHJvYmVzIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF90Y3Bfa2VlcGFsaXZlX3Byb2JlcywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X1RDUF9LRUVQQUxJVkVfSU5UVkwsCisJCS5wcm9jbmFtZQk9ICJ0Y3Bfa2VlcGFsaXZlX2ludHZsIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF90Y3Bfa2VlcGFsaXZlX2ludHZsLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9qaWZmaWVzCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X1RDUF9SRVRSSUVTMSwKKwkJLnByb2NuYW1lCT0gInRjcF9yZXRyaWVzMSIsCisJCS5kYXRhCQk9ICZzeXNjdGxfdGNwX3JldHJpZXMxLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMgkJPSAmdGNwX3JldHIxX21heAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9UQ1BfUkVUUklFUzIsCisJCS5wcm9jbmFtZQk9ICJ0Y3BfcmV0cmllczIiLAorCQkuZGF0YQkJPSAmc3lzY3RsX3RjcF9yZXRyaWVzMiwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X1RDUF9GSU5fVElNRU9VVCwKKwkJLnByb2NuYW1lCT0gInRjcF9maW5fdGltZW91dCIsCisJCS5kYXRhCQk9ICZzeXNjdGxfdGNwX2Zpbl90aW1lb3V0LAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9qaWZmaWVzCisJfSwKKyNpZmRlZiBDT05GSUdfU1lOX0NPT0tJRVMKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9UQ1BfU1lOQ09PS0lFUywKKwkJLnByb2NuYW1lCT0gInRjcF9zeW5jb29raWVzIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF90Y3Bfc3luY29va2llcywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKyNlbmRpZgorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX1RDUF9UV19SRUNZQ0xFLAorCQkucHJvY25hbWUJPSAidGNwX3R3X3JlY3ljbGUiLAorCQkuZGF0YQkJPSAmc3lzY3RsX3RjcF90d19yZWN5Y2xlLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX1RDUF9BQk9SVF9PTl9PVkVSRkxPVywKKwkJLnByb2NuYW1lCT0gInRjcF9hYm9ydF9vbl9vdmVyZmxvdyIsCisJCS5kYXRhCQk9ICZzeXNjdGxfdGNwX2Fib3J0X29uX292ZXJmbG93LAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX1RDUF9TVERVUkcsCisJCS5wcm9jbmFtZQk9ICJ0Y3Bfc3RkdXJnIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF90Y3Bfc3RkdXJnLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX1RDUF9SRkMxMzM3LAorCQkucHJvY25hbWUJPSAidGNwX3JmYzEzMzciLAorCQkuZGF0YQkJPSAmc3lzY3RsX3RjcF9yZmMxMzM3LAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX1RDUF9NQVhfU1lOX0JBQ0tMT0csCisJCS5wcm9jbmFtZQk9ICJ0Y3BfbWF4X3N5bl9iYWNrbG9nIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9tYXhfc3luX2JhY2tsb2csCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9MT0NBTF9QT1JUX1JBTkdFLAorCQkucHJvY25hbWUJPSAiaXBfbG9jYWxfcG9ydF9yYW5nZSIsCisJCS5kYXRhCQk9ICZzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZSwKKwkJLm1heGxlbgkJPSBzaXplb2Yoc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2UpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSBpcF9sb2NhbF9wb3J0X3JhbmdlX21pbiwKKwkJLmV4dHJhMgkJPSBpcF9sb2NhbF9wb3J0X3JhbmdlX21heAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9JQ01QX0VDSE9fSUdOT1JFX0FMTCwKKwkJLnByb2NuYW1lCT0gImljbXBfZWNob19pZ25vcmVfYWxsIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9pY21wX2VjaG9faWdub3JlX2FsbCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X0lDTVBfRUNIT19JR05PUkVfQlJPQURDQVNUUywKKwkJLnByb2NuYW1lCT0gImljbXBfZWNob19pZ25vcmVfYnJvYWRjYXN0cyIsCisJCS5kYXRhCQk9ICZzeXNjdGxfaWNtcF9lY2hvX2lnbm9yZV9icm9hZGNhc3RzLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfSUNNUF9JR05PUkVfQk9HVVNfRVJST1JfUkVTUE9OU0VTLAorCQkucHJvY25hbWUJPSAiaWNtcF9pZ25vcmVfYm9ndXNfZXJyb3JfcmVzcG9uc2VzIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9pY21wX2lnbm9yZV9ib2d1c19lcnJvcl9yZXNwb25zZXMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ST1VURSwKKwkJLnByb2NuYW1lCT0gInJvdXRlIiwKKwkJLm1heGxlbgkJPSAwLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gaXB2NF9yb3V0ZV90YWJsZQorCX0sCisjaWZkZWYgQ09ORklHX0lQX01VTFRJQ0FTVAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfSUdNUF9NQVhfTUVNQkVSU0hJUFMsCisJCS5wcm9jbmFtZQk9ICJpZ21wX21heF9tZW1iZXJzaGlwcyIsCisJCS5kYXRhCQk9ICZzeXNjdGxfaWdtcF9tYXhfbWVtYmVyc2hpcHMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisKKyNlbmRpZgorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfSUdNUF9NQVhfTVNGLAorCQkucHJvY25hbWUJPSAiaWdtcF9tYXhfbXNmIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9pZ21wX21heF9tc2YsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9JTkVUX1BFRVJfVEhSRVNIT0xELAorCQkucHJvY25hbWUJPSAiaW5ldF9wZWVyX3RocmVzaG9sZCIsCisJCS5kYXRhCQk9ICZpbmV0X3BlZXJfdGhyZXNob2xkLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfSU5FVF9QRUVSX01JTlRUTCwKKwkJLnByb2NuYW1lCT0gImluZXRfcGVlcl9taW50dGwiLAorCQkuZGF0YQkJPSAmaW5ldF9wZWVyX21pbnR0bCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfamlmZmllcworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9JTkVUX1BFRVJfTUFYVFRMLAorCQkucHJvY25hbWUJPSAiaW5ldF9wZWVyX21heHR0bCIsCisJCS5kYXRhCQk9ICZpbmV0X3BlZXJfbWF4dHRsLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9qaWZmaWVzCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X0lORVRfUEVFUl9HQ19NSU5USU1FLAorCQkucHJvY25hbWUJPSAiaW5ldF9wZWVyX2djX21pbnRpbWUiLAorCQkuZGF0YQkJPSAmaW5ldF9wZWVyX2djX21pbnRpbWUsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ppZmZpZXMKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfSU5FVF9QRUVSX0dDX01BWFRJTUUsCisJCS5wcm9jbmFtZQk9ICJpbmV0X3BlZXJfZ2NfbWF4dGltZSIsCisJCS5kYXRhCQk9ICZpbmV0X3BlZXJfZ2NfbWF4dGltZSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfamlmZmllcworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfVENQX09SUEhBTl9SRVRSSUVTLAorCQkucHJvY25hbWUJPSAidGNwX29ycGhhbl9yZXRyaWVzIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF90Y3Bfb3JwaGFuX3JldHJpZXMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfVENQX0ZBQ0ssCisJCS5wcm9jbmFtZQk9ICJ0Y3BfZmFjayIsCisJCS5kYXRhCQk9ICZzeXNjdGxfdGNwX2ZhY2ssCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfVENQX1JFT1JERVJJTkcsCisJCS5wcm9jbmFtZQk9ICJ0Y3BfcmVvcmRlcmluZyIsCisJCS5kYXRhCQk9ICZzeXNjdGxfdGNwX3Jlb3JkZXJpbmcsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfVENQX0VDTiwKKwkJLnByb2NuYW1lCT0gInRjcF9lY24iLAorCQkuZGF0YQkJPSAmc3lzY3RsX3RjcF9lY24sCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfVENQX0RTQUNLLAorCQkucHJvY25hbWUJPSAidGNwX2RzYWNrIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF90Y3BfZHNhY2ssCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfVENQX01FTSwKKwkJLnByb2NuYW1lCT0gInRjcF9tZW0iLAorCQkuZGF0YQkJPSAmc3lzY3RsX3RjcF9tZW0sCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHN5c2N0bF90Y3BfbWVtKSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9UQ1BfV01FTSwKKwkJLnByb2NuYW1lCT0gInRjcF93bWVtIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF90Y3Bfd21lbSwKKwkJLm1heGxlbgkJPSBzaXplb2Yoc3lzY3RsX3RjcF93bWVtKSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9UQ1BfUk1FTSwKKwkJLnByb2NuYW1lCT0gInRjcF9ybWVtIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF90Y3Bfcm1lbSwKKwkJLm1heGxlbgkJPSBzaXplb2Yoc3lzY3RsX3RjcF9ybWVtKSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9UQ1BfQVBQX1dJTiwKKwkJLnByb2NuYW1lCT0gInRjcF9hcHBfd2luIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF90Y3BfYXBwX3dpbiwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9UQ1BfQURWX1dJTl9TQ0FMRSwKKwkJLnByb2NuYW1lCT0gInRjcF9hZHZfd2luX3NjYWxlIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF90Y3BfYWR2X3dpbl9zY2FsZSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X0lDTVBfUkFURUxJTUlULAorCQkucHJvY25hbWUJPSAiaWNtcF9yYXRlbGltaXQiLAorCQkuZGF0YQkJPSAmc3lzY3RsX2ljbXBfcmF0ZWxpbWl0LAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfSUNNUF9SQVRFTUFTSywKKwkJLnByb2NuYW1lCT0gImljbXBfcmF0ZW1hc2siLAorCQkuZGF0YQkJPSAmc3lzY3RsX2ljbXBfcmF0ZW1hc2ssCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfVENQX1RXX1JFVVNFLAorCQkucHJvY25hbWUJPSAidGNwX3R3X3JldXNlIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF90Y3BfdHdfcmV1c2UsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfVENQX0ZSVE8sCisJCS5wcm9jbmFtZQk9ICJ0Y3BfZnJ0byIsCisJCS5kYXRhCQk9ICZzeXNjdGxfdGNwX2ZydG8sCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfVENQX0xPV19MQVRFTkNZLAorCQkucHJvY25hbWUJPSAidGNwX2xvd19sYXRlbmN5IiwKKwkJLmRhdGEJCT0gJnN5c2N0bF90Y3BfbG93X2xhdGVuY3ksCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9JUEZSQUdfU0VDUkVUX0lOVEVSVkFMLAorCQkucHJvY25hbWUJPSAiaXBmcmFnX3NlY3JldF9pbnRlcnZhbCIsCisJCS5kYXRhCQk9ICZzeXNjdGxfaXBmcmFnX3NlY3JldF9pbnRlcnZhbCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfamlmZmllcworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfVENQX05PX01FVFJJQ1NfU0FWRSwKKwkJLnByb2NuYW1lCT0gInRjcF9ub19tZXRyaWNzX3NhdmUiLAorCQkuZGF0YQkJPSAmc3lzY3RsX3RjcF9ub21ldHJpY3Nfc2F2ZSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfVENQX1dFU1RXT09ELCAKKwkJLnByb2NuYW1lCT0gInRjcF93ZXN0d29vZCIsCisJCS5kYXRhCQk9ICZzeXNjdGxfdGNwX3dlc3R3b29kLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9UQ1BfVkVHQVMsCisJCS5wcm9jbmFtZQk9ICJ0Y3BfdmVnYXNfY29uZ19hdm9pZCIsCisJCS5kYXRhCQk9ICZzeXNjdGxfdGNwX3ZlZ2FzX2NvbmdfYXZvaWQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX1RDUF9WRUdBU19BTFBIQSwKKwkJLnByb2NuYW1lCT0gInRjcF92ZWdhc19hbHBoYSIsCisJCS5kYXRhCQk9ICZzeXNjdGxfdGNwX3ZlZ2FzX2FscGhhLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9UQ1BfVkVHQVNfQkVUQSwKKwkJLnByb2NuYW1lCT0gInRjcF92ZWdhc19iZXRhIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF90Y3BfdmVnYXNfYmV0YSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfVENQX1ZFR0FTX0dBTU1BLAorCQkucHJvY25hbWUJPSAidGNwX3ZlZ2FzX2dhbW1hIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF90Y3BfdmVnYXNfZ2FtbWEsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX1RDUF9CSUMsCisJCS5wcm9jbmFtZQk9ICJ0Y3BfYmljIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF90Y3BfYmljLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9UQ1BfQklDX0ZBU1RfQ09OVkVSR0VOQ0UsCisJCS5wcm9jbmFtZQk9ICJ0Y3BfYmljX2Zhc3RfY29udmVyZ2VuY2UiLAorCQkuZGF0YQkJPSAmc3lzY3RsX3RjcF9iaWNfZmFzdF9jb252ZXJnZW5jZSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfVENQX0JJQ19MT1dfV0lORE9XLAorCQkucHJvY25hbWUJPSAidGNwX2JpY19sb3dfd2luZG93IiwKKwkJLmRhdGEJCT0gJnN5c2N0bF90Y3BfYmljX2xvd193aW5kb3csCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX1RDUF9NT0RFUkFURV9SQ1ZCVUYsCisJCS5wcm9jbmFtZQk9ICJ0Y3BfbW9kZXJhdGVfcmN2YnVmIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF90Y3BfbW9kZXJhdGVfcmN2YnVmLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9UQ1BfVFNPX1dJTl9ESVZJU09SLAorCQkucHJvY25hbWUJPSAidGNwX3Rzb193aW5fZGl2aXNvciIsCisJCS5kYXRhCQk9ICZzeXNjdGxfdGNwX3Rzb193aW5fZGl2aXNvciwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfVENQX0JJQ19CRVRBLAorCQkucHJvY25hbWUJPSAidGNwX2JpY19iZXRhIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF90Y3BfYmljX2JldGEsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCisjZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLworCitFWFBPUlRfU1lNQk9MKGlwdjRfY29uZmlnKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcC5jIGIvbmV0L2lwdjQvdGNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNmZjU2YQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L3RjcC5jCkBAIC0wLDAgKzEsMjM4NiBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlJbXBsZW1lbnRhdGlvbiBvZiB0aGUgVHJhbnNtaXNzaW9uIENvbnRyb2wgUHJvdG9jb2woVENQKS4KKyAqCisgKiBWZXJzaW9uOgkkSWQ6IHRjcC5jLHYgMS4yMTYgMjAwMi8wMi8wMSAyMjowMTowNCBkYXZlbSBFeHAgJAorICoKKyAqIEF1dGhvcnM6CVJvc3MgQmlybywgPGJpcjdAbGVsYW5kLlN0YW5mb3JkLkVkdT4KKyAqCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCQlNYXJrIEV2YW5zLCA8ZXZhbnNtcEB1aHVyYS5hc3Rvbi5hYy51az4KKyAqCQlDb3JleSBNaW55YXJkIDx3Zi1yY2ghbWlueWFyZEByZWxheS5FVS5uZXQ+CisgKgkJRmxvcmlhbiBMYSBSb2NoZSwgPGZsbGFAc3R1ZC51bmktc2IuZGU+CisgKgkJQ2hhcmxlcyBIZWRyaWNrLCA8aGVkcmlja0BrbGluemhhaS5ydXRnZXJzLmVkdT4KKyAqCQlMaW51cyBUb3J2YWxkcywgPHRvcnZhbGRzQGNzLmhlbHNpbmtpLmZpPgorICoJCUFsYW4gQ294LCA8Z3c0cHRzQGd3NHB0cy5hbXByLm9yZz4KKyAqCQlNYXR0aGV3IERpbGxvbiwgPGRpbGxvbkBhcG9sbG8ud2VzdC5vaWMuY29tPgorICoJCUFybnQgR3VsYnJhbmRzZW4sIDxhZ3VsYnJhQG52Zy51bml0Lm5vPgorICoJCUpvcmdlIEN3aWssIDxqb3JnZUBsYXNlci5zYXRsaW5rLm5ldD4KKyAqCisgKiBGaXhlczoKKyAqCQlBbGFuIENveAk6CU51bWVyb3VzIHZlcmlmeV9hcmVhKCkgY2FsbHMKKyAqCQlBbGFuIENveAk6CVNldCB0aGUgQUNLIGJpdCBvbiBhIHJlc2V0CisgKgkJQWxhbiBDb3gJOglTdG9wcGVkIGl0IGNyYXNoaW5nIGlmIGl0IGNsb3NlZCB3aGlsZQorICoJCQkJCXNrLT5pbnVzZT0xIGFuZCB3YXMgdHJ5aW5nIHRvIGNvbm5lY3QKKyAqCQkJCQkodGNwX2VycigpKS4KKyAqCQlBbGFuIENveAk6CUFsbCBpY21wIGVycm9yIGhhbmRsaW5nIHdhcyBicm9rZW4KKyAqCQkJCQlwb2ludGVycyBwYXNzZWQgd2hlcmUgd3JvbmcgYW5kIHRoZQorICoJCQkJCXNvY2tldCB3YXMgbG9va2VkIHVwIGJhY2t3YXJkcy4gTm9ib2R5CisgKgkJCQkJdGVzdGVkIGFueSBpY21wIGVycm9yIGNvZGUgb2J2aW91c2x5LgorICoJCUFsYW4gQ294CToJdGNwX2VycigpIG5vdyBoYW5kbGVkIHByb3Blcmx5LiBJdAorICoJCQkJCXdha2VzIHBlb3BsZSBvbiBlcnJvcnMuIHBvbGwKKyAqCQkJCQliZWhhdmVzIGFuZCB0aGUgaWNtcCBlcnJvciByYWNlCisgKgkJCQkJaGFzIGdvbmUgYnkgbW92aW5nIGl0IGludG8gc29jay5jCisgKgkJQWxhbiBDb3gJOgl0Y3Bfc2VuZF9yZXNldCgpIGZpeGVkIHRvIHdvcmsgZm9yCisgKgkJCQkJZXZlcnl0aGluZyBub3QganVzdCBwYWNrZXRzIGZvcgorICoJCQkJCXVua25vd24gc29ja2V0cy4KKyAqCQlBbGFuIENveAk6CXRjcCBvcHRpb24gcHJvY2Vzc2luZy4KKyAqCQlBbGFuIENveAk6CVJlc2V0IHR3ZWFrZWQgKHN0aWxsIG5vdCAxMDAlKSBbSGFkCisgKgkJCQkJc3luIHJ1bGUgd3JvbmddCisgKgkJSGVycCBSb3NtYW5pdGggIDoJTW9yZSByZXNldCBmaXhlcworICoJCUFsYW4gQ294CToJTm8gbG9uZ2VyIGFja3MgaW52YWxpZCByc3QgZnJhbWVzLgorICoJCQkJCUFja2luZyBhbnkga2luZCBvZiBSU1QgaXMgcmlnaHQgb3V0LgorICoJCUFsYW4gQ294CToJU2V0cyBhbiBpZ25vcmUgbWUgZmxhZyBvbiBhbiByc3QKKyAqCQkJCQlyZWNlaXZlIG90aGVyd2lzZSBvZGQgYml0cyBvZiBwcmF0dGxlCisgKgkJCQkJZXNjYXBlIHN0aWxsCisgKgkJQWxhbiBDb3gJOglGaXhlZCBhbm90aGVyIGFja2luZyBSU1QgZnJhbWUgYnVnLgorICoJCQkJCVNob3VsZCBzdG9wIExBTiB3b3JrcGxhY2UgbG9ja3Vwcy4KKyAqCQlBbGFuIENveAk6IAlTb21lIHRpZHl1cHMgdXNpbmcgdGhlIG5ldyBza2IgbGlzdAorICoJCQkJCWZhY2lsaXRpZXMKKyAqCQlBbGFuIENveAk6CXNrLT5rZWVwb3BlbiBub3cgc2VlbXMgdG8gd29yaworICoJCUFsYW4gQ294CToJUHVsbHMgb3B0aW9ucyBvdXQgY29ycmVjdGx5IG9uIGFjY2VwdHMKKyAqCQlBbGFuIENveAk6CUZpeGVkIGFzc29ydGVkIHNrLT5ycXVldWUtPm5leHQgZXJyb3JzCisgKgkJQWxhbiBDb3gJOglQU0ggZG9lc24ndCBlbmQgYSBUQ1AgcmVhZC4gU3dpdGNoZWQgYQorICoJCQkJCWJpdCB0byBza2Igb3BzLgorICoJCUFsYW4gQ294CToJVGlkaWVkIHRjcF9kYXRhIHRvIGF2b2lkIGEgcG90ZW50aWFsCisgKgkJCQkJbmFzdHkuCisgKgkJQWxhbiBDb3gJOglBZGRlZCBzb21lIGJldHRlciBjb21tZW50aW5nLCBhcyB0aGUKKyAqCQkJCQl0Y3AgaXMgaGFyZCB0byBmb2xsb3cKKyAqCQlBbGFuIENveAk6CVJlbW92ZWQgaW5jb3JyZWN0IGNoZWNrIGZvciAyMCAqIHBzaAorICoJTWljaGFlbCBPJ1JlaWxseQk6CWFjayA8IGNvcGllZCBidWcgZml4LgorICoJSm9oYW5uZXMgU3RpbGxlCQk6CU1pc2MgdGNwIGZpeGVzIChub3QgYWxsIGluIHlldCkuCisgKgkJQWxhbiBDb3gJOglGSU4gd2l0aCBubyBtZW1vcnkgLT4gQ1JBU0gKKyAqCQlBbGFuIENveAk6CUFkZGVkIHNvY2tldCBvcHRpb24gcHJvdG8gZW50cmllcy4KKyAqCQkJCQlBbHNvIGFkZGVkIGF3YXJlbmVzcyBvZiB0aGVtIHRvIGFjY2VwdC4KKyAqCQlBbGFuIENveAk6CUFkZGVkIFRDUCBvcHRpb25zIChTT0xfVENQKQorICoJCUFsYW4gQ294CToJU3dpdGNoZWQgd2FrZXVwIGNhbGxzIHRvIGNhbGxiYWNrcywKKyAqCQkJCQlzbyB0aGUga2VybmVsIGNhbiBsYXllciBuZXR3b3JrCisgKgkJCQkJc29ja2V0cy4KKyAqCQlBbGFuIENveAk6CVVzZSBpcF90b3MvaXBfdHRsIHNldHRpbmdzLgorICoJCUFsYW4gQ294CToJSGFuZGxlIEZJTiAobW9yZSkgcHJvcGVybHkgKHdlIGhvcGUpLgorICoJCUFsYW4gQ294CToJUlNUIGZyYW1lcyBzZW50IG9uIHVuc3luY2hyb25pc2VkCisgKgkJCQkJc3RhdGUgYWNrIGVycm9yLgorICoJCUFsYW4gQ294CToJUHV0IGluIG1pc3NpbmcgY2hlY2sgZm9yIFNZTiBiaXQuCisgKgkJQWxhbiBDb3gJOglBZGRlZCB0Y3Bfc2VsZWN0X3dpbmRvdygpIGFrYSBORVQyRQorICoJCQkJCXdpbmRvdyBub24gc2hyaW5rIHRyaWNrLgorICoJCUFsYW4gQ294CToJQWRkZWQgYSBjb3VwbGUgb2Ygc21hbGwgTkVUMkUgdGltZXIKKyAqCQkJCQlmaXhlcworICoJCUNoYXJsZXMgSGVkcmljayA6CVRDUCBmaXhlcworICoJCVRvb21hcyBUYW1tCToJVENQIHdpbmRvdyBmaXhlcworICoJCUFsYW4gQ294CToJU21hbGwgVVJHIGZpeCB0byBybG9naW4gXkMgYWNrIGZpZ2h0CisgKgkJQ2hhcmxlcyBIZWRyaWNrCToJUmV3cm90ZSBtb3N0IG9mIGl0IHRvIGFjdHVhbGx5IHdvcmsKKyAqCQlMaW51cwkJOglSZXdyb3RlIHRjcF9yZWFkKCkgYW5kIFVSRyBoYW5kbGluZworICoJCQkJCWNvbXBsZXRlbHkKKyAqCQlHZXJoYXJkIEtvZXJ0aW5nOglGaXhlZCBzb21lIG1pc3NpbmcgdGltZXIgaGFuZGxpbmcKKyAqCQlNYXR0aGV3IERpbGxvbiAgOglSZXdvcmtlZCBUQ1AgbWFjaGluZSBzdGF0ZXMgYXMgcGVyIFJGQworICoJCUdlcmhhcmQgS29lcnRpbmc6CVBDL1RDUCB3b3JrYXJvdW5kcworICoJCUFkYW0gQ2FsZHdlbGwJOglBc3NvcnRlZCB0aW1lci90aW1pbmcgZXJyb3JzCisgKgkJTWF0dGhldyBEaWxsb24JOglGaXhlZCBhbm90aGVyIFJTVCBidWcKKyAqCQlBbGFuIENveAk6CU1vdmUgdG8ga2VybmVsIHNpZGUgYWRkcmVzc2luZyBjaGFuZ2VzLgorICoJCUFsYW4gQ294CToJQmVnaW5uaW5nIHdvcmsgb24gVENQIGZhc3RwYXRoaW5nCisgKgkJCQkJKG5vdCB5ZXQgdXNhYmxlKQorICoJCUFybnQgR3VsYnJhbmRzZW46CVR1cmJvY2hhcmdlZCB0Y3BfY2hlY2soKSByb3V0aW5lLgorICoJCUFsYW4gQ294CToJVENQIGZhc3QgcGF0aCBkZWJ1Z2dpbmcKKyAqCQlBbGFuIENveAk6CVdpbmRvdyBjbGFtcGluZworICoJCU1pY2hhZWwgUmllcGUJOglCdWcgaW4gdGNwX2NoZWNrKCkKKyAqCQlNYXR0IERpbGxvbgk6CU1vcmUgVENQIGltcHJvdmVtZW50cyBhbmQgUlNUIGJ1ZyBmaXhlcworICoJCU1hdHQgRGlsbG9uCToJWWV0IG1vcmUgc21hbGwgbmFzdGllcyByZW1vdmUgZnJvbSB0aGUKKyAqCQkJCQlUQ1AgY29kZSAoQmUgdmVyeSBuaWNlIHRvIHRoaXMgbWFuIGlmCisgKgkJCQkJdGNwIGZpbmFsbHkgd29ya3MgMTAwJSkgOCkKKyAqCQlBbGFuIENveAk6CUJTRCBhY2NlcHQgc2VtYW50aWNzLgorICoJCUFsYW4gQ294CToJUmVzZXQgb24gY2xvc2Vkb3duIGJ1Zy4KKyAqCVBldGVyIERlIFNjaHJpanZlcgk6CUVOT1RDT05OIGNoZWNrIG1pc3NpbmcgaW4gdGNwX3NlbmR0bygpLgorICoJCU1pY2hhZWwgUGFsbAk6CUhhbmRsZSBwb2xsKCkgYWZ0ZXIgVVJHIHByb3Blcmx5IGluCisgKgkJCQkJYWxsIGNhc2VzLgorICoJCU1pY2hhZWwgUGFsbAk6CVVuZG8gdGhlIGxhc3QgZml4IGluIHRjcF9yZWFkX3VyZygpCisgKgkJCQkJKG11bHRpIFVSRyBQVVNIIGJyb2tlIHJsb2dpbikuCisgKgkJTWljaGFlbCBQYWxsCToJRml4IHRoZSBtdWx0aSBVUkcgUFVTSCBwcm9ibGVtIGluCisgKgkJCQkJdGNwX3JlYWRhYmxlKCksIHBvbGwoKSBhZnRlciBVUkcKKyAqCQkJCQl3b3JrcyBub3cuCisgKgkJTWljaGFlbCBQYWxsCToJcmVjdiguLi4sTVNHX09PQikgbmV2ZXIgYmxvY2tzIGluIHRoZQorICoJCQkJCUJTRCBhcGkuCisgKgkJQWxhbiBDb3gJOglDaGFuZ2VkIHRoZSBzZW1hbnRpY3Mgb2Ygc2stPnNvY2tldCB0bworICoJCQkJCWZpeCBhIHJhY2UgYW5kIGEgc2lnbmFsIHByb2JsZW0gd2l0aAorICoJCQkJCWFjY2VwdCgpIGFuZCBhc3luYyBJL08uCisgKgkJQWxhbiBDb3gJOglSZWxheGVkIHRoZSBydWxlcyBvbiB0Y3Bfc2VuZHRvKCkuCisgKgkJWXVyeSBTaGV2Y2h1awk6CVJlYWxseSBmaXhlZCBhY2NlcHQoKSBibG9ja2luZyBwcm9ibGVtLgorICoJCUNyYWlnIEkuIEhhZ2FuICA6CUFsbG93IGZvciBCU0QgY29tcGF0aWJsZSBUSU1FX1dBSVQgZm9yCisgKgkJCQkJY2xpZW50cy9zZXJ2ZXJzIHdoaWNoIGxpc3RlbiBpbiBvbgorICoJCQkJCWZpeGVkIHBvcnRzLgorICoJCUFsYW4gQ294CToJQ2xlYW5lZCB0aGUgYWJvdmUgdXAgYW5kIHNocmFuayBpdCB0bworICoJCQkJCWEgc2Vuc2libGUgY29kZSBzaXplLgorICoJCUFsYW4gQ294CToJU2VsZiBjb25uZWN0IGxvY2t1cCBmaXguCisgKgkJQWxhbiBDb3gJOglObyBjb25uZWN0IHRvIG11bHRpY2FzdC4KKyAqCQlSb3NzIEJpcm8JOglDbG9zZSB1bmFjY2VwdGVkIGNoaWxkcmVuIG9uIG1hc3RlcgorICoJCQkJCXNvY2tldCBjbG9zZS4KKyAqCQlBbGFuIENveAk6CVJlc2V0IHRyYWNpbmcgY29kZS4KKyAqCQlBbGFuIENveAk6CVNwdXJpb3VzIHJlc2V0cyBvbiBzaHV0ZG93bi4KKyAqCQlBbGFuIENveAk6CUdpYW50IDE1IG1pbnV0ZS82MCBzZWNvbmQgdGltZXIgZXJyb3IKKyAqCQlBbGFuIENveAk6CVNtYWxsIHdob29wcyBpbiBwb2xsaW5nIGJlZm9yZSBhbgorICoJCQkJCWFjY2VwdC4KKyAqCQlBbGFuIENveAk6CUtlcHQgdGhlIHN0YXRlIHRyYWNlIGZhY2lsaXR5IHNpbmNlCisgKgkJCQkJaXQncyBoYW5keSBmb3IgZGVidWdnaW5nLgorICoJCUFsYW4gQ294CToJTW9yZSByZXNldCBoYW5kbGVyIGZpeGVzLgorICoJCUFsYW4gQ294CToJU3RhcnRlZCByZXdyaXRpbmcgdGhlIGNvZGUgYmFzZWQgb24KKyAqCQkJCQl0aGUgUkZDJ3MgZm9yIG90aGVyIHVzZWZ1bCBwcm90b2NvbAorICoJCQkJCXJlZmVyZW5jZXMgc2VlOiBDb21lciwgS0E5USBOT1MsIGFuZAorICoJCQkJCWZvciBhIHJlZmVyZW5jZSBvbiB0aGUgZGlmZmVyZW5jZQorICoJCQkJCWJldHdlZW4gc3BlY2lmaWNhdGlvbnMgYW5kIGhvdyBCU0QKKyAqCQkJCQl3b3JrcyBzZWUgdGhlIDQuNGxpdGUgc291cmNlLgorICoJCUEuTi5LdXpuZXRzb3YJOglEb24ndCB0aW1lIHdhaXQgb24gY29tcGxldGlvbiBvZiB0aWR5CisgKgkJCQkJY2xvc2UuCisgKgkJTGludXMgVG9ydmFsZHMJOglGaW4vU2h1dGRvd24gJiBjb3BpZWRfc2VxIGNoYW5nZXMuCisgKgkJTGludXMgVG9ydmFsZHMJOglGaXhlZCBCU0QgcG9ydCByZXVzZSB0byB3b3JrIGZpcnN0IHN5bgorICoJCUFsYW4gQ294CToJUmVpbXBsZW1lbnRlZCB0aW1lcnMgYXMgcGVyIHRoZSBSRkMKKyAqCQkJCQlhbmQgdXNpbmcgbXVsdGlwbGUgdGltZXJzIGZvciBzYW5pdHkuCisgKgkJQWxhbiBDb3gJOglTbWFsbCBidWcgZml4ZXMsIGFuZCBhIGxvdCBvZiBuZXcKKyAqCQkJCQljb21tZW50cy4KKyAqCQlBbGFuIENveAk6CUZpeGVkIGR1YWwgcmVhZGVyIGNyYXNoIGJ5IGxvY2tpbmcKKyAqCQkJCQl0aGUgYnVmZmVycyAobXVjaCBsaWtlIGRhdGFncmFtLmMpCisgKgkJQWxhbiBDb3gJOglGaXhlZCBzdHVjayBzb2NrZXRzIGluIHByb2JlLiBBIHByb2JlCisgKgkJCQkJbm93IGdldHMgZmVkIHVwIG9mIHJldHJ5aW5nIHdpdGhvdXQKKyAqCQkJCQkoZXZlbiBhIG5vIHNwYWNlKSBhbnN3ZXIuCisgKgkJQWxhbiBDb3gJOglFeHRyYWN0ZWQgY2xvc2luZyBjb2RlIGJldHRlcgorICoJCUFsYW4gQ294CToJRml4ZWQgdGhlIGNsb3Npbmcgc3RhdGUgbWFjaGluZSB0bworICoJCQkJCXJlc2VtYmxlIHRoZSBSRkMuCisgKgkJQWxhbiBDb3gJOglNb3JlICdwZXIgc3BlYycgZml4ZXMuCisgKgkJSm9yZ2UgQ3dpawk6CUV2ZW4gZmFzdGVyIGNoZWNrc3VtbWluZy4KKyAqCQlBbGFuIENveAk6CXRjcF9kYXRhKCkgZG9lc24ndCBhY2sgaWxsZWdhbCBQU0gKKyAqCQkJCQlvbmx5IGZyYW1lcy4gQXQgbGVhc3Qgb25lIHBjIHRjcCBzdGFjaworICoJCQkJCWdlbmVyYXRlcyB0aGVtLgorICoJCUFsYW4gQ294CToJQ2FjaGUgbGFzdCBzb2NrZXQuCisgKgkJQWxhbiBDb3gJOglQZXIgcm91dGUgaXJ0dC4KKyAqCQlNYXR0IERheQk6CXBvbGwoKS0+c2VsZWN0KCkgbWF0Y2ggQlNEIHByZWNpc2VseSBvbiBlcnJvcgorICoJCUFsYW4gQ294CToJTmV3IGJ1ZmZlcnMKKyAqCQlNYXJjIFRhbXNreQk6CVZhcmlvdXMgc2stPnByb3QtPnJldHJhbnNtaXRzIGFuZAorICoJCQkJCXNrLT5yZXRyYW5zbWl0cyBtaXN1cGRhdGluZyBmaXhlZC4KKyAqCQkJCQlGaXhlZCB0Y3Bfd3JpdGVfdGltZW91dDogc3R1Y2sgY2xvc2UsCisgKgkJCQkJYW5kIFRDUCBzeW4gcmV0cmllcyBnZXRzIHVzZWQgbm93LgorICoJCU1hcmsgWWFydmlzCToJSW4gdGNwX3JlYWRfd2FrZXVwKCksIGRvbid0IHNlbmQgYW4KKyAqCQkJCQlhY2sgaWYgc3RhdGUgaXMgVENQX0NMT1NFRC4KKyAqCQlBbGFuIENveAk6CUxvb2sgdXAgZGV2aWNlIG9uIGEgcmV0cmFuc21pdCAtIHJvdXRlcyBtYXkKKyAqCQkJCQljaGFuZ2UuIERvZXNuJ3QgeWV0IGNvcGUgd2l0aCBNU1Mgc2hyaW5rIHJpZ2h0CisgKgkJCQkJYnV0IGl0J3MgYSBzdGFydCEKKyAqCQlNYXJjIFRhbXNreQk6CUNsb3NpbmcgaW4gY2xvc2luZyBmaXhlcy4KKyAqCQlNaWtlIFNoYXZlcgk6CVJGQzExMjIgdmVyaWZpY2F0aW9ucy4KKyAqCQlBbGFuIENveAk6CXJjdl9zYWRkciBlcnJvcnMuCisgKgkJQWxhbiBDb3gJOglCbG9jayBkb3VibGUgY29ubmVjdCgpLgorICoJCUFsYW4gQ294CToJU21hbGwgaG9va3MgZm9yIGVuU0tJUC4KKyAqCQlBbGV4ZXkgS3V6bmV0c292OglQYXRoIE1UVSBkaXNjb3ZlcnkuCisgKgkJQWxhbiBDb3gJOglTdXBwb3J0IHNvZnQgZXJyb3JzLgorICoJCUFsYW4gQ294CToJRml4IE1UVSBkaXNjb3ZlcnkgcGF0aG9sb2dpY2FsIGNhc2UKKyAqCQkJCQl3aGVuIHRoZSByZW1vdGUgY2xhaW1zIG5vIG10dSEKKyAqCQlNYXJjIFRhbXNreQk6CVRDUF9DTE9TRSBmaXguCisgKgkJQ29saW4gKEczVE5FKQk6CVNlbmQgYSByZXNldCBvbiBzeW4gYWNrIHJlcGxpZXMgaW4KKyAqCQkJCQl3aW5kb3cgYnV0IHdyb25nIChmaXhlcyBOVCBscGQgcHJvYmxlbXMpCisgKgkJUGVkcm8gUm9xdWUJOglCZXR0ZXIgVENQIHdpbmRvdyBoYW5kbGluZywgZGVsYXllZCBhY2suCisgKgkJSm9lcmcgUmV1dGVyCToJTm8gbW9kaWZpY2F0aW9uIG9mIGxvY2tlZCBidWZmZXJzIGluCisgKgkJCQkJdGNwX2RvX3JldHJhbnNtaXQoKQorICoJCUVyaWMgU2NoZW5rCToJQ2hhbmdlZCByZWNlaXZlciBzaWRlIHNpbGx5IHdpbmRvdworICoJCQkJCWF2b2lkYW5jZSBhbGdvcml0aG0gdG8gQlNEIHN0eWxlCisgKgkJCQkJYWxnb3JpdGhtLiBUaGlzIGRvdWJsZXMgdGhyb3VnaHB1dAorICoJCQkJCWFnYWluc3QgbWFjaGluZXMgcnVubmluZyBTb2xhcmlzLAorICoJCQkJCWFuZCBzZWVtcyB0byByZXN1bHQgaW4gZ2VuZXJhbAorICoJCQkJCWltcHJvdmVtZW50LgorICoJU3RlZmFuIE1hZ2RhbGluc2tpCToJYWRqdXN0ZWQgdGNwX3JlYWRhYmxlKCkgdG8gZml4IEZJT05SRUFECisgKglXaWxseSBLb255bmVuYmVyZwk6CVRyYW5zcGFyZW50IHByb3h5aW5nIHN1cHBvcnQuCisgKglNaWtlIE1jTGFnYW4JCToJUm91dGluZyBieSBzb3VyY2UKKyAqCQlLZWl0aCBPd2Vucwk6CURvIHByb3BlciBtZXJnaW5nIHdpdGggcGFydGlhbCBTS0IncyBpbgorICoJCQkJCXRjcF9kb19zZW5kbXNnIHRvIGF2b2lkIGJ1cnN0aW5lc3MuCisgKgkJRXJpYyBTY2hlbmsJOglGaXggZmFzdCBjbG9zZSBkb3duIGJ1ZyB3aXRoCisgKgkJCQkJc2h1dGRvd24oKSBmb2xsb3dlZCBieSBjbG9zZSgpLgorICoJCUFuZGkgS2xlZW4gCToJTWFrZSBwb2xsIGFncmVlIHdpdGggU0lHSU8KKyAqCVNhbHZhdG9yZSBTYW5maWxpcHBvCToJU3VwcG9ydCBTT19MSU5HRVIgd2l0aCBsaW5nZXIgPT0gMSBhbmQKKyAqCQkJCQlsaW5nZXJ0aW1lID09IDAgKFJGQyA3OTMgQUJPUlQgQ2FsbCkKKyAqCUhpcm9rYXp1IFRha2FoYXNoaQk6CVVzZSBjb3B5X2Zyb21fdXNlcigpIGluc3RlYWQgb2YKKyAqCQkJCQljc3VtX2FuZF9jb3B5X2Zyb21fdXNlcigpIGlmIHBvc3NpYmxlLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvcihhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRGVzY3JpcHRpb24gb2YgU3RhdGVzOgorICoKKyAqCVRDUF9TWU5fU0VOVAkJc2VudCBhIGNvbm5lY3Rpb24gcmVxdWVzdCwgd2FpdGluZyBmb3IgYWNrCisgKgorICoJVENQX1NZTl9SRUNWCQlyZWNlaXZlZCBhIGNvbm5lY3Rpb24gcmVxdWVzdCwgc2VudCBhY2ssCisgKgkJCQl3YWl0aW5nIGZvciBmaW5hbCBhY2sgaW4gdGhyZWUtd2F5IGhhbmRzaGFrZS4KKyAqCisgKglUQ1BfRVNUQUJMSVNIRUQJCWNvbm5lY3Rpb24gZXN0YWJsaXNoZWQKKyAqCisgKglUQ1BfRklOX1dBSVQxCQlvdXIgc2lkZSBoYXMgc2h1dGRvd24sIHdhaXRpbmcgdG8gY29tcGxldGUKKyAqCQkJCXRyYW5zbWlzc2lvbiBvZiByZW1haW5pbmcgYnVmZmVyZWQgZGF0YQorICoKKyAqCVRDUF9GSU5fV0FJVDIJCWFsbCBidWZmZXJlZCBkYXRhIHNlbnQsIHdhaXRpbmcgZm9yIHJlbW90ZQorICoJCQkJdG8gc2h1dGRvd24KKyAqCisgKglUQ1BfQ0xPU0lORwkJYm90aCBzaWRlcyBoYXZlIHNodXRkb3duIGJ1dCB3ZSBzdGlsbCBoYXZlCisgKgkJCQlkYXRhIHdlIGhhdmUgdG8gZmluaXNoIHNlbmRpbmcKKyAqCisgKglUQ1BfVElNRV9XQUlUCQl0aW1lb3V0IHRvIGNhdGNoIHJlc2VudCBqdW5rIGJlZm9yZSBlbnRlcmluZworICoJCQkJY2xvc2VkLCBjYW4gb25seSBiZSBlbnRlcmVkIGZyb20gRklOX1dBSVQyCisgKgkJCQlvciBDTE9TSU5HLiAgUmVxdWlyZWQgYmVjYXVzZSB0aGUgb3RoZXIgZW5kCisgKgkJCQltYXkgbm90IGhhdmUgZ290dGVuIG91ciBsYXN0IEFDSyBjYXVzaW5nIGl0CisgKgkJCQl0byByZXRyYW5zbWl0IHRoZSBkYXRhIHBhY2tldCAod2hpY2ggd2UgaWdub3JlKQorICoKKyAqCVRDUF9DTE9TRV9XQUlUCQlyZW1vdGUgc2lkZSBoYXMgc2h1dGRvd24gYW5kIGlzIHdhaXRpbmcgZm9yCisgKgkJCQl1cyB0byBmaW5pc2ggd3JpdGluZyBvdXIgZGF0YSBhbmQgdG8gc2h1dGRvd24KKyAqCQkJCSh3ZSBoYXZlIHRvIGNsb3NlKCkgdG8gbW92ZSBvbiB0byBMQVNUX0FDSykKKyAqCisgKglUQ1BfTEFTVF9BQ0sJCW91dCBzaWRlIGhhcyBzaHV0ZG93biBhZnRlciByZW1vdGUgaGFzCisgKgkJCQlzaHV0ZG93bi4gIFRoZXJlIG1heSBzdGlsbCBiZSBkYXRhIGluIG91cgorICoJCQkJYnVmZmVyIHRoYXQgd2UgaGF2ZSB0byBmaW5pc2ggc2VuZGluZworICoKKyAqCVRDUF9DTE9TRQkJc29ja2V0IGlzIGZpbmlzaGVkCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisKKyNpbmNsdWRlIDxuZXQvaWNtcC5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQveGZybS5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKworaW50IHN5c2N0bF90Y3BfZmluX3RpbWVvdXQgPSBUQ1BfRklOX1RJTUVPVVQ7CisKK0RFRklORV9TTk1QX1NUQVQoc3RydWN0IHRjcF9taWIsIHRjcF9zdGF0aXN0aWNzKTsKKwora21lbV9jYWNoZV90ICp0Y3Bfb3BlbnJlcV9jYWNoZXA7CitrbWVtX2NhY2hlX3QgKnRjcF9idWNrZXRfY2FjaGVwOwora21lbV9jYWNoZV90ICp0Y3BfdGltZXdhaXRfY2FjaGVwOworCithdG9taWNfdCB0Y3Bfb3JwaGFuX2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7CisKK2ludCBzeXNjdGxfdGNwX21lbVszXTsKK2ludCBzeXNjdGxfdGNwX3dtZW1bM10gPSB7IDQgKiAxMDI0LCAxNiAqIDEwMjQsIDEyOCAqIDEwMjQgfTsKK2ludCBzeXNjdGxfdGNwX3JtZW1bM10gPSB7IDQgKiAxMDI0LCA4NzM4MCwgODczODAgKiAyIH07CisKK0VYUE9SVF9TWU1CT0woc3lzY3RsX3RjcF9tZW0pOworRVhQT1JUX1NZTUJPTChzeXNjdGxfdGNwX3JtZW0pOworRVhQT1JUX1NZTUJPTChzeXNjdGxfdGNwX3dtZW0pOworCithdG9taWNfdCB0Y3BfbWVtb3J5X2FsbG9jYXRlZDsJLyogQ3VycmVudCBhbGxvY2F0ZWQgbWVtb3J5LiAqLworYXRvbWljX3QgdGNwX3NvY2tldHNfYWxsb2NhdGVkOwkvKiBDdXJyZW50IG51bWJlciBvZiBUQ1Agc29ja2V0cy4gKi8KKworRVhQT1JUX1NZTUJPTCh0Y3BfbWVtb3J5X2FsbG9jYXRlZCk7CitFWFBPUlRfU1lNQk9MKHRjcF9zb2NrZXRzX2FsbG9jYXRlZCk7CisKKy8qCisgKiBQcmVzc3VyZSBmbGFnOiB0cnkgdG8gY29sbGFwc2UuCisgKiBUZWNobmljYWwgbm90ZTogaXQgaXMgdXNlZCBieSBtdWx0aXBsZSBjb250ZXh0cyBub24gYXRvbWljYWxseS4KKyAqIEFsbCB0aGUgc2tfc3RyZWFtX21lbV9zY2hlZHVsZSgpIGlzIG9mIHRoaXMgbmF0dXJlOiBhY2NvdW50aW5nCisgKiBpcyBzdHJpY3QsIGFjdGlvbnMgYXJlIGFkdmlzb3J5IGFuZCBoYXZlIHNvbWUgbGF0ZW5jeS4KKyAqLworaW50IHRjcF9tZW1vcnlfcHJlc3N1cmU7CisKK0VYUE9SVF9TWU1CT0wodGNwX21lbW9yeV9wcmVzc3VyZSk7CisKK3ZvaWQgdGNwX2VudGVyX21lbW9yeV9wcmVzc3VyZSh2b2lkKQoreworCWlmICghdGNwX21lbW9yeV9wcmVzc3VyZSkgeworCQlORVRfSU5DX1NUQVRTKExJTlVYX01JQl9UQ1BNRU1PUllQUkVTU1VSRVMpOworCQl0Y3BfbWVtb3J5X3ByZXNzdXJlID0gMTsKKwl9Cit9CisKK0VYUE9SVF9TWU1CT0wodGNwX2VudGVyX21lbW9yeV9wcmVzc3VyZSk7CisKKy8qCisgKiBMSVNURU4gaXMgYSBzcGVjaWFsIGNhc2UgZm9yIHBvbGwuLgorICovCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgdGNwX2xpc3Rlbl9wb2xsKHN0cnVjdCBzb2NrICpzaywKKwkJCQkJICAgICAgIHBvbGxfdGFibGUgKndhaXQpCit7CisJcmV0dXJuIHRjcF9zayhzayktPmFjY2VwdF9xdWV1ZSA/IChQT0xMSU4gfCBQT0xMUkROT1JNKSA6IDA7Cit9CisKKy8qCisgKglXYWl0IGZvciBhIFRDUCBldmVudC4KKyAqCisgKglOb3RlIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBsb2NrIHRoZSBzb2NrZXQsIGFzIHRoZSB1cHBlciBwb2xsIGxheWVycworICoJdGFrZSBjYXJlIG9mIG5vcm1hbCByYWNlcyAoYmV0d2VlbiB0aGUgdGVzdCBhbmQgdGhlIGV2ZW50KSBhbmQgd2UgZG9uJ3QKKyAqCWdvIGxvb2sgYXQgYW55IG9mIHRoZSBzb2NrZXQgYnVmZmVycyBkaXJlY3RseS4KKyAqLwordW5zaWduZWQgaW50IHRjcF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXVuc2lnbmVkIGludCBtYXNrOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJcG9sbF93YWl0KGZpbGUsIHNrLT5za19zbGVlcCwgd2FpdCk7CisJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOKQorCQlyZXR1cm4gdGNwX2xpc3Rlbl9wb2xsKHNrLCB3YWl0KTsKKworCS8qIFNvY2tldCBpcyBub3QgbG9ja2VkLiBXZSBhcmUgcHJvdGVjdGVkIGZyb20gYXN5bmMgZXZlbnRzCisJICAgYnkgcG9sbCBsb2dpYyBhbmQgY29ycmVjdCBoYW5kbGluZyBvZiBzdGF0ZSBjaGFuZ2VzCisJICAgbWFkZSBieSBhbm90aGVyIHRocmVhZHMgaXMgaW1wb3NzaWJsZSBpbiBhbnkgY2FzZS4KKwkgKi8KKworCW1hc2sgPSAwOworCWlmIChzay0+c2tfZXJyKQorCQltYXNrID0gUE9MTEVSUjsKKworCS8qCisJICogUE9MTEhVUCBpcyBjZXJ0YWlubHkgbm90IGRvbmUgcmlnaHQuIEJ1dCBwb2xsKCkgZG9lc24ndAorCSAqIGhhdmUgYSBub3Rpb24gb2YgSFVQIGluIGp1c3Qgb25lIGRpcmVjdGlvbiwgYW5kIGZvciBhCisJICogc29ja2V0IHRoZSByZWFkIHNpZGUgaXMgbW9yZSBpbnRlcmVzdGluZy4KKwkgKgorCSAqIFNvbWUgcG9sbCgpIGRvY3VtZW50YXRpb24gc2F5cyB0aGF0IFBPTExIVVAgaXMgaW5jb21wYXRpYmxlCisJICogd2l0aCB0aGUgUE9MTE9VVC9QT0xMV1IgZmxhZ3MsIHNvIHNvbWVib2R5IHNob3VsZCBjaGVjayB0aGlzCisJICogYWxsLiBCdXQgY2FyZWZ1bCwgaXQgdGVuZHMgdG8gYmUgc2FmZXIgdG8gcmV0dXJuIHRvbyBtYW55CisJICogYml0cyB0aGFuIHRvbyBmZXcsIGFuZCB5b3UgY2FuIGVhc2lseSBicmVhayByZWFsIGFwcGxpY2F0aW9ucworCSAqIGlmIHlvdSBkb24ndCB0ZWxsIHRoZW0gdGhhdCBzb21ldGhpbmcgaGFzIGh1bmcgdXAhCisJICoKKwkgKiBDaGVjay1tZS4KKwkgKgorCSAqIENoZWNrIG51bWJlciAxLiBQT0xMSFVQIGlzIF9VTk1BU0tBQkxFXyBldmVudCAoc2VlIFVOSVg5OCBhbmQKKwkgKiBvdXIgZnMvc2VsZWN0LmMpLiBJdCBtZWFucyB0aGF0IGFmdGVyIHdlIHJlY2VpdmVkIEVPRiwKKwkgKiBwb2xsIGFsd2F5cyByZXR1cm5zIGltbWVkaWF0ZWx5LCBtYWtpbmcgaW1wb3NzaWJsZSBwb2xsKCkgb24gd3JpdGUoKQorCSAqIGluIHN0YXRlIENMT1NFX1dBSVQuIE9uZSBzb2x1dGlvbiBpcyBldmlkZW50IC0tLSB0byBzZXQgUE9MTEhVUAorCSAqIGlmIGFuZCBvbmx5IGlmIHNodXRkb3duIGhhcyBiZWVuIG1hZGUgaW4gYm90aCBkaXJlY3Rpb25zLgorCSAqIEFjdHVhbGx5LCBpdCBpcyBpbnRlcmVzdGluZyB0byBsb29rIGhvdyBTb2xhcmlzIGFuZCBEVVgKKwkgKiBzb2x2ZSB0aGlzIGRpbGVtbWEuIEkgd291bGQgcHJlZmVyLCBpZiBQVUxMSFVQIHdlcmUgbWFza2FibGUsCisJICogdGhlbiB3ZSBjb3VsZCBzZXQgaXQgb24gU05EX1NIVVRET1dOLiBCVFcgZXhhbXBsZXMgZ2l2ZW4KKwkgKiBpbiBTdGV2ZW5zJyBib29rcyBhc3N1bWUgZXhhY3RseSB0aGlzIGJlaGF2aW91ciwgaXQgZXhwbGFpbnMKKwkgKiB3aHkgUFVMTEhVUCBpcyBpbmNvbXBhdGlibGUgd2l0aCBQT0xMT1VULgktLUFOSworCSAqCisJICogTk9URS4gQ2hlY2sgZm9yIFRDUF9DTE9TRSBpcyBhZGRlZC4gVGhlIGdvYWwgaXMgdG8gcHJldmVudAorCSAqIGJsb2NraW5nIG9uIGZyZXNoIG5vdC1jb25uZWN0ZWQgb3IgZGlzY29ubmVjdGVkIHNvY2tldC4gLS1BTksKKwkgKi8KKwlpZiAoc2stPnNrX3NodXRkb3duID09IFNIVVRET1dOX01BU0sgfHwgc2stPnNrX3N0YXRlID09IFRDUF9DTE9TRSkKKwkJbWFzayB8PSBQT0xMSFVQOworCWlmIChzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKworCS8qIENvbm5lY3RlZD8gKi8KKwlpZiAoKDEgPDwgc2stPnNrX3N0YXRlKSAmIH4oVENQRl9TWU5fU0VOVCB8IFRDUEZfU1lOX1JFQ1YpKSB7CisJCS8qIFBvdGVudGlhbCByYWNlIGNvbmRpdGlvbi4gSWYgcmVhZCBvZiB0cCBiZWxvdyB3aWxsCisJCSAqIGVzY2FwZSBhYm92ZSBzay0+c2tfc3RhdGUsIHdlIGNhbiBiZSBpbGxlZ2FsbHkgYXdha2VuCisJCSAqIGluIFNZTl8qIHN0YXRlcy4gKi8KKwkJaWYgKCh0cC0+cmN2X254dCAhPSB0cC0+Y29waWVkX3NlcSkgJiYKKwkJICAgICh0cC0+dXJnX3NlcSAhPSB0cC0+Y29waWVkX3NlcSB8fAorCQkgICAgIHRwLT5yY3Zfbnh0ICE9IHRwLT5jb3BpZWRfc2VxICsgMSB8fAorCQkgICAgIHNvY2tfZmxhZyhzaywgU09DS19VUkdJTkxJTkUpIHx8ICF0cC0+dXJnX2RhdGEpKQorCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCisJCWlmICghKHNrLT5za19zaHV0ZG93biAmIFNFTkRfU0hVVERPV04pKSB7CisJCQlpZiAoc2tfc3RyZWFtX3dzcGFjZShzaykgPj0gc2tfc3RyZWFtX21pbl93c3BhY2Uoc2spKSB7CisJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJCX0gZWxzZSB7ICAvKiBzZW5kIFNJR0lPIGxhdGVyICovCisJCQkJc2V0X2JpdChTT0NLX0FTWU5DX05PU1BBQ0UsCisJCQkJCSZzay0+c2tfc29ja2V0LT5mbGFncyk7CisJCQkJc2V0X2JpdChTT0NLX05PU1BBQ0UsICZzay0+c2tfc29ja2V0LT5mbGFncyk7CisKKwkJCQkvKiBSYWNlIGJyZWFrZXIuIElmIHNwYWNlIGlzIGZyZWVkIGFmdGVyCisJCQkJICogd3NwYWNlIHRlc3QgYnV0IGJlZm9yZSB0aGUgZmxhZ3MgYXJlIHNldCwKKwkJCQkgKiBJTyBzaWduYWwgd2lsbCBiZSBsb3N0LgorCQkJCSAqLworCQkJCWlmIChza19zdHJlYW1fd3NwYWNlKHNrKSA+PSBza19zdHJlYW1fbWluX3dzcGFjZShzaykpCisJCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCQl9CisJCX0KKworCQlpZiAodHAtPnVyZ19kYXRhICYgVENQX1VSR19WQUxJRCkKKwkJCW1hc2sgfD0gUE9MTFBSSTsKKwl9CisJcmV0dXJuIG1hc2s7Cit9CisKK2ludCB0Y3BfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlpbnQgYW5zdzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DSU5ROgorCQlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9MSVNURU4pCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlsb2NrX3NvY2soc2spOworCQlpZiAoKDEgPDwgc2stPnNrX3N0YXRlKSAmIChUQ1BGX1NZTl9TRU5UIHwgVENQRl9TWU5fUkVDVikpCisJCQlhbnN3ID0gMDsKKwkJZWxzZSBpZiAoc29ja19mbGFnKHNrLCBTT0NLX1VSR0lOTElORSkgfHwKKwkJCSAhdHAtPnVyZ19kYXRhIHx8CisJCQkgYmVmb3JlKHRwLT51cmdfc2VxLCB0cC0+Y29waWVkX3NlcSkgfHwKKwkJCSAhYmVmb3JlKHRwLT51cmdfc2VxLCB0cC0+cmN2X254dCkpIHsKKwkJCWFuc3cgPSB0cC0+cmN2X254dCAtIHRwLT5jb3BpZWRfc2VxOworCisJCQkvKiBTdWJ0cmFjdCAxLCBpZiBGSU4gaXMgaW4gcXVldWUuICovCisJCQlpZiAoYW5zdyAmJiAhc2tiX3F1ZXVlX2VtcHR5KCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpCisJCQkJYW5zdyAtPQorCQkgICAgICAgKChzdHJ1Y3Qgc2tfYnVmZiAqKXNrLT5za19yZWNlaXZlX3F1ZXVlLnByZXYpLT5oLnRoLT5maW47CisJCX0gZWxzZQorCQkJYW5zdyA9IHRwLT51cmdfc2VxIC0gdHAtPmNvcGllZF9zZXE7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCWJyZWFrOworCWNhc2UgU0lPQ0FUTUFSSzoKKwkJYW5zdyA9IHRwLT51cmdfZGF0YSAmJiB0cC0+dXJnX3NlcSA9PSB0cC0+Y29waWVkX3NlcTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DT1VUUToKKwkJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKCgxIDw8IHNrLT5za19zdGF0ZSkgJiAoVENQRl9TWU5fU0VOVCB8IFRDUEZfU1lOX1JFQ1YpKQorCQkJYW5zdyA9IDA7CisJCWVsc2UKKwkJCWFuc3cgPSB0cC0+d3JpdGVfc2VxIC0gdHAtPnNuZF91bmE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfTsKKworCXJldHVybiBwdXRfdXNlcihhbnN3LCAoaW50IF9fdXNlciAqKWFyZyk7Cit9CisKKworaW50IHRjcF9saXN0ZW5fc3RhcnQoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgdGNwX2xpc3Rlbl9vcHQgKmxvcHQ7CisKKwlzay0+c2tfbWF4X2Fja19iYWNrbG9nID0gMDsKKwlzay0+c2tfYWNrX2JhY2tsb2cgPSAwOworCXRwLT5hY2NlcHRfcXVldWUgPSB0cC0+YWNjZXB0X3F1ZXVlX3RhaWwgPSBOVUxMOworCXJ3bG9ja19pbml0KCZ0cC0+c3luX3dhaXRfbG9jayk7CisJdGNwX2RlbGFja19pbml0KHRwKTsKKworCWxvcHQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdGNwX2xpc3Rlbl9vcHQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxvcHQpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KGxvcHQsIDAsIHNpemVvZihzdHJ1Y3QgdGNwX2xpc3Rlbl9vcHQpKTsKKwlmb3IgKGxvcHQtPm1heF9xbGVuX2xvZyA9IDY7IDsgbG9wdC0+bWF4X3FsZW5fbG9nKyspCisJCWlmICgoMSA8PCBsb3B0LT5tYXhfcWxlbl9sb2cpID49IHN5c2N0bF9tYXhfc3luX2JhY2tsb2cpCisJCQlicmVhazsKKwlnZXRfcmFuZG9tX2J5dGVzKCZsb3B0LT5oYXNoX3JuZCwgNCk7CisKKwl3cml0ZV9sb2NrX2JoKCZ0cC0+c3luX3dhaXRfbG9jayk7CisJdHAtPmxpc3Rlbl9vcHQgPSBsb3B0OworCXdyaXRlX3VubG9ja19iaCgmdHAtPnN5bl93YWl0X2xvY2spOworCisJLyogVGhlcmUgaXMgcmFjZSB3aW5kb3cgaGVyZTogd2UgYW5ub3VuY2Ugb3Vyc2VsdmVzIGxpc3RlbmluZywKKwkgKiBidXQgdGhpcyB0cmFuc2l0aW9uIGlzIHN0aWxsIG5vdCB2YWxpZGF0ZWQgYnkgZ2V0X3BvcnQoKS4KKwkgKiBJdCBpcyBPSywgYmVjYXVzZSB0aGlzIHNvY2tldCBlbnRlcnMgdG8gaGFzaCB0YWJsZSBvbmx5CisJICogYWZ0ZXIgdmFsaWRhdGlvbiBpcyBjb21wbGV0ZS4KKwkgKi8KKwlzay0+c2tfc3RhdGUgPSBUQ1BfTElTVEVOOworCWlmICghc2stPnNrX3Byb3QtPmdldF9wb3J0KHNrLCBpbmV0LT5udW0pKSB7CisJCWluZXQtPnNwb3J0ID0gaHRvbnMoaW5ldC0+bnVtKTsKKworCQlza19kc3RfcmVzZXQoc2spOworCQlzay0+c2tfcHJvdC0+aGFzaChzayk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJc2stPnNrX3N0YXRlID0gVENQX0NMT1NFOworCXdyaXRlX2xvY2tfYmgoJnRwLT5zeW5fd2FpdF9sb2NrKTsKKwl0cC0+bGlzdGVuX29wdCA9IE5VTEw7CisJd3JpdGVfdW5sb2NrX2JoKCZ0cC0+c3luX3dhaXRfbG9jayk7CisJa2ZyZWUobG9wdCk7CisJcmV0dXJuIC1FQUREUklOVVNFOworfQorCisvKgorICoJVGhpcyByb3V0aW5lIGNsb3NlcyBzb2NrZXRzIHdoaWNoIGhhdmUgYmVlbiBhdCBsZWFzdCBwYXJ0aWFsbHkKKyAqCW9wZW5lZCwgYnV0IG5vdCB5ZXQgYWNjZXB0ZWQuCisgKi8KKworc3RhdGljIHZvaWQgdGNwX2xpc3Rlbl9zdG9wIChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IHRjcF9saXN0ZW5fb3B0ICpsb3B0ID0gdHAtPmxpc3Rlbl9vcHQ7CisJc3RydWN0IG9wZW5fcmVxdWVzdCAqYWNjX3JlcSA9IHRwLT5hY2NlcHRfcXVldWU7CisJc3RydWN0IG9wZW5fcmVxdWVzdCAqcmVxOworCWludCBpOworCisJdGNwX2RlbGV0ZV9rZWVwYWxpdmVfdGltZXIoc2spOworCisJLyogbWFrZSBhbGwgdGhlIGxpc3Rlbl9vcHQgbG9jYWwgdG8gdXMgKi8KKwl3cml0ZV9sb2NrX2JoKCZ0cC0+c3luX3dhaXRfbG9jayk7CisJdHAtPmxpc3Rlbl9vcHQgPSBOVUxMOworCXdyaXRlX3VubG9ja19iaCgmdHAtPnN5bl93YWl0X2xvY2spOworCXRwLT5hY2NlcHRfcXVldWUgPSB0cC0+YWNjZXB0X3F1ZXVlX3RhaWwgPSBOVUxMOworCisJaWYgKGxvcHQtPnFsZW4pIHsKKwkJZm9yIChpID0gMDsgaSA8IFRDUF9TWU5RX0hTSVpFOyBpKyspIHsKKwkJCXdoaWxlICgocmVxID0gbG9wdC0+c3luX3RhYmxlW2ldKSAhPSBOVUxMKSB7CisJCQkJbG9wdC0+c3luX3RhYmxlW2ldID0gcmVxLT5kbF9uZXh0OworCQkJCWxvcHQtPnFsZW4tLTsKKwkJCQl0Y3Bfb3BlbnJlcV9mcmVlKHJlcSk7CisKKwkJLyogRm9sbG93aW5nIHNwZWNzLCBpdCB3b3VsZCBiZSBiZXR0ZXIgZWl0aGVyIHRvIHNlbmQgRklOCisJCSAqIChhbmQgZW50ZXIgRklOLVdBSVQtMSwgaXQgaXMgbm9ybWFsIGNsb3NlKQorCQkgKiBvciB0byBzZW5kIGFjdGl2ZSByZXNldCAoYWJvcnQpLgorCQkgKiBDZXJ0YWlubHksIGl0IGlzIHByZXR0eSBkYW5nZXJvdXMgd2hpbGUgc3luZmxvb2QsIGJ1dCBpdCBpcworCQkgKiBiYWQganVzdGlmaWNhdGlvbiBmb3Igb3VyIG5lZ2xpZ2VuY2UgOCkKKwkJICogVG8gYmUgaG9uZXN0LCB3ZSBhcmUgbm90IGFibGUgdG8gbWFrZSBlaXRoZXIKKwkJICogb2YgdGhlIHZhcmlhbnRzIG5vdy4JCQktLUFOSworCQkgKi8KKwkJCX0KKwkJfQorCX0KKwlCVUdfVFJBUCghbG9wdC0+cWxlbik7CisKKwlrZnJlZShsb3B0KTsKKworCXdoaWxlICgocmVxID0gYWNjX3JlcSkgIT0gTlVMTCkgeworCQlzdHJ1Y3Qgc29jayAqY2hpbGQgPSByZXEtPnNrOworCisJCWFjY19yZXEgPSByZXEtPmRsX25leHQ7CisKKwkJbG9jYWxfYmhfZGlzYWJsZSgpOworCQliaF9sb2NrX3NvY2soY2hpbGQpOworCQlCVUdfVFJBUCghc29ja19vd25lZF9ieV91c2VyKGNoaWxkKSk7CisJCXNvY2tfaG9sZChjaGlsZCk7CisKKwkJdGNwX2Rpc2Nvbm5lY3QoY2hpbGQsIE9fTk9OQkxPQ0spOworCisJCXNvY2tfb3JwaGFuKGNoaWxkKTsKKworCQlhdG9taWNfaW5jKCZ0Y3Bfb3JwaGFuX2NvdW50KTsKKworCQl0Y3BfZGVzdHJveV9zb2NrKGNoaWxkKTsKKworCQliaF91bmxvY2tfc29jayhjaGlsZCk7CisJCWxvY2FsX2JoX2VuYWJsZSgpOworCQlzb2NrX3B1dChjaGlsZCk7CisKKwkJc2tfYWNjZXB0cV9yZW1vdmVkKHNrKTsKKwkJdGNwX29wZW5yZXFfZmFzdGZyZWUocmVxKTsKKwl9CisJQlVHX1RSQVAoIXNrLT5za19hY2tfYmFja2xvZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfbWFya19wdXNoKHN0cnVjdCB0Y3Bfc29jayAqdHAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJVENQX1NLQl9DQihza2IpLT5mbGFncyB8PSBUQ1BDQl9GTEFHX1BTSDsKKwl0cC0+cHVzaGVkX3NlcSA9IHRwLT53cml0ZV9zZXE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZvcmNlZF9wdXNoKHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJcmV0dXJuIGFmdGVyKHRwLT53cml0ZV9zZXEsIHRwLT5wdXNoZWRfc2VxICsgKHRwLT5tYXhfd2luZG93ID4+IDEpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNrYl9lbnRhaWwoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlza2ItPmNzdW0gPSAwOworCVRDUF9TS0JfQ0Ioc2tiKS0+c2VxID0gdHAtPndyaXRlX3NlcTsKKwlUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEgPSB0cC0+d3JpdGVfc2VxOworCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgPSBUQ1BDQl9GTEFHX0FDSzsKKwlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCA9IDA7CisJc2tiX2hlYWRlcl9yZWxlYXNlKHNrYik7CisJX19za2JfcXVldWVfdGFpbCgmc2stPnNrX3dyaXRlX3F1ZXVlLCBza2IpOworCXNrX2NoYXJnZV9za2Ioc2ssIHNrYik7CisJaWYgKCFzay0+c2tfc2VuZF9oZWFkKQorCQlzay0+c2tfc2VuZF9oZWFkID0gc2tiOworCWVsc2UgaWYgKHRwLT5ub25hZ2xlJlRDUF9OQUdMRV9QVVNIKQorCQl0cC0+bm9uYWdsZSAmPSB+VENQX05BR0xFX1BVU0g7IAorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNwX21hcmtfdXJnKHN0cnVjdCB0Y3Bfc29jayAqdHAsIGludCBmbGFncywKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmIChmbGFncyAmIE1TR19PT0IpIHsKKwkJdHAtPnVyZ19tb2RlID0gMTsKKwkJdHAtPnNuZF91cCA9IHRwLT53cml0ZV9zZXE7CisJCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkIHw9IFRDUENCX1VSRzsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfcHVzaChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHAsIGludCBmbGFncywKKwkJCSAgICBpbnQgbXNzX25vdywgaW50IG5vbmFnbGUpCit7CisJaWYgKHNrLT5za19zZW5kX2hlYWQpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrLT5za193cml0ZV9xdWV1ZS5wcmV2OworCQlpZiAoIShmbGFncyAmIE1TR19NT1JFKSB8fCBmb3JjZWRfcHVzaCh0cCkpCisJCQl0Y3BfbWFya19wdXNoKHRwLCBza2IpOworCQl0Y3BfbWFya191cmcodHAsIGZsYWdzLCBza2IpOworCQlfX3RjcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHNrLCB0cCwgbXNzX25vdywKKwkJCQkJICAoZmxhZ3MgJiBNU0dfTU9SRSkgPyBUQ1BfTkFHTEVfQ09SSyA6IG5vbmFnbGUpOworCX0KK30KKworc3RhdGljIHNzaXplX3QgZG9fdGNwX3NlbmRwYWdlcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwYWdlICoqcGFnZXMsIGludCBwb2Zmc2V0LAorCQkJIHNpemVfdCBwc2l6ZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCWludCBtc3Nfbm93OworCWludCBlcnI7CisJc3NpemVfdCBjb3BpZWQ7CisJbG9uZyB0aW1lbyA9IHNvY2tfc25kdGltZW8oc2ssIGZsYWdzICYgTVNHX0RPTlRXQUlUKTsKKworCS8qIFdhaXQgZm9yIGEgY29ubmVjdGlvbiB0byBmaW5pc2guICovCisJaWYgKCgxIDw8IHNrLT5za19zdGF0ZSkgJiB+KFRDUEZfRVNUQUJMSVNIRUQgfCBUQ1BGX0NMT1NFX1dBSVQpKQorCQlpZiAoKGVyciA9IHNrX3N0cmVhbV93YWl0X2Nvbm5lY3Qoc2ssICZ0aW1lbykpICE9IDApCisJCQlnb3RvIG91dF9lcnI7CisKKwljbGVhcl9iaXQoU09DS19BU1lOQ19OT1NQQUNFLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOworCisJbXNzX25vdyA9IHRjcF9jdXJyZW50X21zcyhzaywgIShmbGFncyZNU0dfT09CKSk7CisJY29waWVkID0gMDsKKworCWVyciA9IC1FUElQRTsKKwlpZiAoc2stPnNrX2VyciB8fCAoc2stPnNrX3NodXRkb3duICYgU0VORF9TSFVURE9XTikpCisJCWdvdG8gZG9fZXJyb3I7CisKKwl3aGlsZSAocHNpemUgPiAwKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBzay0+c2tfd3JpdGVfcXVldWUucHJldjsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwYWdlc1twb2Zmc2V0IC8gUEFHRV9TSVpFXTsKKwkJaW50IGNvcHksIGksIGNhbl9jb2FsZXNjZTsKKwkJaW50IG9mZnNldCA9IHBvZmZzZXQgJSBQQUdFX1NJWkU7CisJCWludCBzaXplID0gbWluX3Qoc2l6ZV90LCBwc2l6ZSwgUEFHRV9TSVpFIC0gb2Zmc2V0KTsKKworCQlpZiAoIXNrLT5za19zZW5kX2hlYWQgfHwgKGNvcHkgPSBtc3Nfbm93IC0gc2tiLT5sZW4pIDw9IDApIHsKK25ld19zZWdtZW50OgorCQkJaWYgKCFza19zdHJlYW1fbWVtb3J5X2ZyZWUoc2spKQorCQkJCWdvdG8gd2FpdF9mb3Jfc25kYnVmOworCisJCQlza2IgPSBza19zdHJlYW1fYWxsb2NfcHNrYihzaywgMCwgMCwKKwkJCQkJCSAgIHNrLT5za19hbGxvY2F0aW9uKTsKKwkJCWlmICghc2tiKQorCQkJCWdvdG8gd2FpdF9mb3JfbWVtb3J5OworCisJCQlza2JfZW50YWlsKHNrLCB0cCwgc2tiKTsKKwkJCWNvcHkgPSBtc3Nfbm93OworCQl9CisKKwkJaWYgKGNvcHkgPiBzaXplKQorCQkJY29weSA9IHNpemU7CisKKwkJaSA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJCWNhbl9jb2FsZXNjZSA9IHNrYl9jYW5fY29hbGVzY2Uoc2tiLCBpLCBwYWdlLCBvZmZzZXQpOworCQlpZiAoIWNhbl9jb2FsZXNjZSAmJiBpID49IE1BWF9TS0JfRlJBR1MpIHsKKwkJCXRjcF9tYXJrX3B1c2godHAsIHNrYik7CisJCQlnb3RvIG5ld19zZWdtZW50OworCQl9CisJCWlmIChzay0+c2tfZm9yd2FyZF9hbGxvYyA8IGNvcHkgJiYKKwkJICAgICFza19zdHJlYW1fbWVtX3NjaGVkdWxlKHNrLCBjb3B5LCAwKSkKKwkJCWdvdG8gd2FpdF9mb3JfbWVtb3J5OworCQkKKwkJaWYgKGNhbl9jb2FsZXNjZSkgeworCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpIC0gMV0uc2l6ZSArPSBjb3B5OworCQl9IGVsc2UgeworCQkJZ2V0X3BhZ2UocGFnZSk7CisJCQlza2JfZmlsbF9wYWdlX2Rlc2Moc2tiLCBpLCBwYWdlLCBvZmZzZXQsIGNvcHkpOworCQl9CisKKwkJc2tiLT5sZW4gKz0gY29weTsKKwkJc2tiLT5kYXRhX2xlbiArPSBjb3B5OworCQlza2ItPnRydWVzaXplICs9IGNvcHk7CisJCXNrLT5za193bWVtX3F1ZXVlZCArPSBjb3B5OworCQlzay0+c2tfZm9yd2FyZF9hbGxvYyAtPSBjb3B5OworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0hXOworCQl0cC0+d3JpdGVfc2VxICs9IGNvcHk7CisJCVRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSArPSBjb3B5OworCQlza2Jfc2hpbmZvKHNrYiktPnRzb19zZWdzID0gMDsKKworCQlpZiAoIWNvcGllZCkKKwkJCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgJj0gflRDUENCX0ZMQUdfUFNIOworCisJCWNvcGllZCArPSBjb3B5OworCQlwb2Zmc2V0ICs9IGNvcHk7CisJCWlmICghKHBzaXplIC09IGNvcHkpKQorCQkJZ290byBvdXQ7CisKKwkJaWYgKHNrYi0+bGVuICE9IG1zc19ub3cgfHwgKGZsYWdzICYgTVNHX09PQikpCisJCQljb250aW51ZTsKKworCQlpZiAoZm9yY2VkX3B1c2godHApKSB7CisJCQl0Y3BfbWFya19wdXNoKHRwLCBza2IpOworCQkJX190Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzaywgdHAsIG1zc19ub3csIFRDUF9OQUdMRV9QVVNIKTsKKwkJfSBlbHNlIGlmIChza2IgPT0gc2stPnNrX3NlbmRfaGVhZCkKKwkJCXRjcF9wdXNoX29uZShzaywgbXNzX25vdyk7CisJCWNvbnRpbnVlOworCit3YWl0X2Zvcl9zbmRidWY6CisJCXNldF9iaXQoU09DS19OT1NQQUNFLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOword2FpdF9mb3JfbWVtb3J5OgorCQlpZiAoY29waWVkKQorCQkJdGNwX3B1c2goc2ssIHRwLCBmbGFncyAmIH5NU0dfTU9SRSwgbXNzX25vdywgVENQX05BR0xFX1BVU0gpOworCisJCWlmICgoZXJyID0gc2tfc3RyZWFtX3dhaXRfbWVtb3J5KHNrLCAmdGltZW8pKSAhPSAwKQorCQkJZ290byBkb19lcnJvcjsKKworCQltc3Nfbm93ID0gdGNwX2N1cnJlbnRfbXNzKHNrLCAhKGZsYWdzJk1TR19PT0IpKTsKKwl9CisKK291dDoKKwlpZiAoY29waWVkKQorCQl0Y3BfcHVzaChzaywgdHAsIGZsYWdzLCBtc3Nfbm93LCB0cC0+bm9uYWdsZSk7CisJcmV0dXJuIGNvcGllZDsKKworZG9fZXJyb3I6CisJaWYgKGNvcGllZCkKKwkJZ290byBvdXQ7CitvdXRfZXJyOgorCXJldHVybiBza19zdHJlYW1fZXJyb3Ioc2ssIGZsYWdzLCBlcnIpOworfQorCitzc2l6ZV90IHRjcF9zZW5kcGFnZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9mZnNldCwKKwkJICAgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXNzaXplX3QgcmVzOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCisjZGVmaW5lIFRDUF9aQ19DU1VNX0ZMQUdTIChORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX05PX0NTVU0gfCBORVRJRl9GX0hXX0NTVU0pCisKKwlpZiAoIShzay0+c2tfcm91dGVfY2FwcyAmIE5FVElGX0ZfU0cpIHx8CisJICAgICEoc2stPnNrX3JvdXRlX2NhcHMgJiBUQ1BfWkNfQ1NVTV9GTEFHUykpCisJCXJldHVybiBzb2NrX25vX3NlbmRwYWdlKHNvY2ssIHBhZ2UsIG9mZnNldCwgc2l6ZSwgZmxhZ3MpOworCisjdW5kZWYgVENQX1pDX0NTVU1fRkxBR1MKKworCWxvY2tfc29jayhzayk7CisJVENQX0NIRUNLX1RJTUVSKHNrKTsKKwlyZXMgPSBkb190Y3Bfc2VuZHBhZ2VzKHNrLCAmcGFnZSwgb2Zmc2V0LCBzaXplLCBmbGFncyk7CisJVENQX0NIRUNLX1RJTUVSKHNrKTsKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiByZXM7Cit9CisKKyNkZWZpbmUgVENQX1BBR0Uoc2spCShzay0+c2tfc25kbXNnX3BhZ2UpCisjZGVmaW5lIFRDUF9PRkYoc2spCShzay0+c2tfc25kbXNnX29mZikKKworc3RhdGljIGlubGluZSBpbnQgc2VsZWN0X3NpemUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCWludCB0bXAgPSB0cC0+bXNzX2NhY2hlX3N0ZDsKKworCWlmIChzay0+c2tfcm91dGVfY2FwcyAmIE5FVElGX0ZfU0cpIHsKKwkJaW50IHBnYnJlYWsgPSBTS0JfTUFYX0hFQUQoTUFYX1RDUF9IRUFERVIpOworCisJCWlmICh0bXAgPj0gcGdicmVhayAmJgorCQkgICAgdG1wIDw9IHBnYnJlYWsgKyAoTUFYX1NLQl9GUkFHUyAtIDEpICogUEFHRV9TSVpFKQorCQkJdG1wID0gcGdicmVhazsKKwl9CisJcmV0dXJuIHRtcDsKK30KKworaW50IHRjcF9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCXNpemVfdCBzaXplKQoreworCXN0cnVjdCBpb3ZlYyAqaW92OworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGlvdmxlbiwgZmxhZ3M7CisJaW50IG1zc19ub3c7CisJaW50IGVyciwgY29waWVkOworCWxvbmcgdGltZW87CisKKwlsb2NrX3NvY2soc2spOworCVRDUF9DSEVDS19USU1FUihzayk7CisKKwlmbGFncyA9IG1zZy0+bXNnX2ZsYWdzOworCXRpbWVvID0gc29ja19zbmR0aW1lbyhzaywgZmxhZ3MgJiBNU0dfRE9OVFdBSVQpOworCisJLyogV2FpdCBmb3IgYSBjb25uZWN0aW9uIHRvIGZpbmlzaC4gKi8KKwlpZiAoKDEgPDwgc2stPnNrX3N0YXRlKSAmIH4oVENQRl9FU1RBQkxJU0hFRCB8IFRDUEZfQ0xPU0VfV0FJVCkpCisJCWlmICgoZXJyID0gc2tfc3RyZWFtX3dhaXRfY29ubmVjdChzaywgJnRpbWVvKSkgIT0gMCkKKwkJCWdvdG8gb3V0X2VycjsKKworCS8qIFRoaXMgc2hvdWxkIGJlIGluIHBvbGwgKi8KKwljbGVhcl9iaXQoU09DS19BU1lOQ19OT1NQQUNFLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOworCisJbXNzX25vdyA9IHRjcF9jdXJyZW50X21zcyhzaywgIShmbGFncyZNU0dfT09CKSk7CisKKwkvKiBPayBjb21tZW5jZSBzZW5kaW5nLiAqLworCWlvdmxlbiA9IG1zZy0+bXNnX2lvdmxlbjsKKwlpb3YgPSBtc2ctPm1zZ19pb3Y7CisJY29waWVkID0gMDsKKworCWVyciA9IC1FUElQRTsKKwlpZiAoc2stPnNrX2VyciB8fCAoc2stPnNrX3NodXRkb3duICYgU0VORF9TSFVURE9XTikpCisJCWdvdG8gZG9fZXJyb3I7CisKKwl3aGlsZSAoLS1pb3ZsZW4gPj0gMCkgeworCQlpbnQgc2VnbGVuID0gaW92LT5pb3ZfbGVuOworCQl1bnNpZ25lZCBjaGFyIF9fdXNlciAqZnJvbSA9IGlvdi0+aW92X2Jhc2U7CisKKwkJaW92Kys7CisKKwkJd2hpbGUgKHNlZ2xlbiA+IDApIHsKKwkJCWludCBjb3B5OworCisJCQlza2IgPSBzay0+c2tfd3JpdGVfcXVldWUucHJldjsKKworCQkJaWYgKCFzay0+c2tfc2VuZF9oZWFkIHx8CisJCQkgICAgKGNvcHkgPSBtc3Nfbm93IC0gc2tiLT5sZW4pIDw9IDApIHsKKworbmV3X3NlZ21lbnQ6CisJCQkJLyogQWxsb2NhdGUgbmV3IHNlZ21lbnQuIElmIHRoZSBpbnRlcmZhY2UgaXMgU0csCisJCQkJICogYWxsb2NhdGUgc2tiIGZpdHRpbmcgdG8gc2luZ2xlIHBhZ2UuCisJCQkJICovCisJCQkJaWYgKCFza19zdHJlYW1fbWVtb3J5X2ZyZWUoc2spKQorCQkJCQlnb3RvIHdhaXRfZm9yX3NuZGJ1ZjsKKworCQkJCXNrYiA9IHNrX3N0cmVhbV9hbGxvY19wc2tiKHNrLCBzZWxlY3Rfc2l6ZShzaywgdHApLAorCQkJCQkJCSAgIDAsIHNrLT5za19hbGxvY2F0aW9uKTsKKwkJCQlpZiAoIXNrYikKKwkJCQkJZ290byB3YWl0X2Zvcl9tZW1vcnk7CisKKwkJCQkvKgorCQkJCSAqIENoZWNrIHdoZXRoZXIgd2UgY2FuIHVzZSBIVyBjaGVja3N1bS4KKwkJCQkgKi8KKwkJCQlpZiAoc2stPnNrX3JvdXRlX2NhcHMgJgorCQkJCSAgICAoTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9OT19DU1VNIHwKKwkJCQkgICAgIE5FVElGX0ZfSFdfQ1NVTSkpCisJCQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fSFc7CisKKwkJCQlza2JfZW50YWlsKHNrLCB0cCwgc2tiKTsKKwkJCQljb3B5ID0gbXNzX25vdzsKKwkJCX0KKworCQkJLyogVHJ5IHRvIGFwcGVuZCBkYXRhIHRvIHRoZSBlbmQgb2Ygc2tiLiAqLworCQkJaWYgKGNvcHkgPiBzZWdsZW4pCisJCQkJY29weSA9IHNlZ2xlbjsKKworCQkJLyogV2hlcmUgdG8gY29weSB0bz8gKi8KKwkJCWlmIChza2JfdGFpbHJvb20oc2tiKSA+IDApIHsKKwkJCQkvKiBXZSBoYXZlIHNvbWUgc3BhY2UgaW4gc2tiIGhlYWQuIFN1cGVyYiEgKi8KKwkJCQlpZiAoY29weSA+IHNrYl90YWlscm9vbShza2IpKQorCQkJCQljb3B5ID0gc2tiX3RhaWxyb29tKHNrYik7CisJCQkJaWYgKChlcnIgPSBza2JfYWRkX2RhdGEoc2tiLCBmcm9tLCBjb3B5KSkgIT0gMCkKKwkJCQkJZ290byBkb19mYXVsdDsKKwkJCX0gZWxzZSB7CisJCQkJaW50IG1lcmdlID0gMDsKKwkJCQlpbnQgaSA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBUQ1BfUEFHRShzayk7CisJCQkJaW50IG9mZiA9IFRDUF9PRkYoc2spOworCisJCQkJaWYgKHNrYl9jYW5fY29hbGVzY2Uoc2tiLCBpLCBwYWdlLCBvZmYpICYmCisJCQkJICAgIG9mZiAhPSBQQUdFX1NJWkUpIHsKKwkJCQkJLyogV2UgY2FuIGV4dGVuZCB0aGUgbGFzdCBwYWdlCisJCQkJCSAqIGZyYWdtZW50LiAqLworCQkJCQltZXJnZSA9IDE7CisJCQkJfSBlbHNlIGlmIChpID09IE1BWF9TS0JfRlJBR1MgfHwKKwkJCQkJICAgKCFpICYmCisJCQkJCSAgICEoc2stPnNrX3JvdXRlX2NhcHMgJiBORVRJRl9GX1NHKSkpIHsKKwkJCQkJLyogTmVlZCB0byBhZGQgbmV3IGZyYWdtZW50IGFuZCBjYW5ub3QKKwkJCQkJICogZG8gdGhpcyBiZWNhdXNlIGludGVyZmFjZSBpcyBub24tU0csCisJCQkJCSAqIG9yIGJlY2F1c2UgYWxsIHRoZSBwYWdlIHNsb3RzIGFyZQorCQkJCQkgKiBidXN5LiAqLworCQkJCQl0Y3BfbWFya19wdXNoKHRwLCBza2IpOworCQkJCQlnb3RvIG5ld19zZWdtZW50OworCQkJCX0gZWxzZSBpZiAocGFnZSkgeworCQkJCQkvKiBJZiBwYWdlIGlzIGNhY2hlZCwgYWxpZ24KKwkJCQkJICogb2Zmc2V0IHRvIEwxIGNhY2hlIGJvdW5kYXJ5CisJCQkJCSAqLworCQkJCQlvZmYgPSAob2ZmICsgTDFfQ0FDSEVfQllURVMgLSAxKSAmCisJCQkJCSAgICAgIH4oTDFfQ0FDSEVfQllURVMgLSAxKTsKKwkJCQkJaWYgKG9mZiA9PSBQQUdFX1NJWkUpIHsKKwkJCQkJCXB1dF9wYWdlKHBhZ2UpOworCQkJCQkJVENQX1BBR0Uoc2spID0gcGFnZSA9IE5VTEw7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoIXBhZ2UpIHsKKwkJCQkJLyogQWxsb2NhdGUgbmV3IGNhY2hlIHBhZ2UuICovCisJCQkJCWlmICghKHBhZ2UgPSBza19zdHJlYW1fYWxsb2NfcGFnZShzaykpKQorCQkJCQkJZ290byB3YWl0X2Zvcl9tZW1vcnk7CisJCQkJCW9mZiA9IDA7CisJCQkJfQorCisJCQkJaWYgKGNvcHkgPiBQQUdFX1NJWkUgLSBvZmYpCisJCQkJCWNvcHkgPSBQQUdFX1NJWkUgLSBvZmY7CisKKwkJCQkvKiBUaW1lIHRvIGNvcHkgZGF0YS4gV2UgYXJlIGNsb3NlIHRvCisJCQkJICogdGhlIGVuZCEgKi8KKwkJCQllcnIgPSBza2JfY29weV90b19wYWdlKHNrLCBmcm9tLCBza2IsIHBhZ2UsCisJCQkJCQkgICAgICAgb2ZmLCBjb3B5KTsKKwkJCQlpZiAoZXJyKSB7CisJCQkJCS8qIElmIHRoaXMgcGFnZSB3YXMgbmV3LCBnaXZlIGl0IHRvIHRoZQorCQkJCQkgKiBzb2NrZXQgc28gaXQgZG9lcyBub3QgZ2V0IGxlYWtlZC4KKwkJCQkJICovCisJCQkJCWlmICghVENQX1BBR0Uoc2spKSB7CisJCQkJCQlUQ1BfUEFHRShzaykgPSBwYWdlOworCQkJCQkJVENQX09GRihzaykgPSAwOworCQkJCQl9CisJCQkJCWdvdG8gZG9fZXJyb3I7CisJCQkJfQorCisJCQkJLyogVXBkYXRlIHRoZSBza2IuICovCisJCQkJaWYgKG1lcmdlKSB7CisJCQkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaSAtIDFdLnNpemUgKz0KKwkJCQkJCQkJCWNvcHk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc2tiX2ZpbGxfcGFnZV9kZXNjKHNrYiwgaSwgcGFnZSwgb2ZmLCBjb3B5KTsKKwkJCQkJaWYgKFRDUF9QQUdFKHNrKSkgeworCQkJCQkJZ2V0X3BhZ2UocGFnZSk7CisJCQkJCX0gZWxzZSBpZiAob2ZmICsgY29weSA8IFBBR0VfU0laRSkgeworCQkJCQkJZ2V0X3BhZ2UocGFnZSk7CisJCQkJCQlUQ1BfUEFHRShzaykgPSBwYWdlOworCQkJCQl9CisJCQkJfQorCisJCQkJVENQX09GRihzaykgPSBvZmYgKyBjb3B5OworCQkJfQorCisJCQlpZiAoIWNvcGllZCkKKwkJCQlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICY9IH5UQ1BDQl9GTEFHX1BTSDsKKworCQkJdHAtPndyaXRlX3NlcSArPSBjb3B5OworCQkJVENQX1NLQl9DQihza2IpLT5lbmRfc2VxICs9IGNvcHk7CisJCQlza2Jfc2hpbmZvKHNrYiktPnRzb19zZWdzID0gMDsKKworCQkJZnJvbSArPSBjb3B5OworCQkJY29waWVkICs9IGNvcHk7CisJCQlpZiAoKHNlZ2xlbiAtPSBjb3B5KSA9PSAwICYmIGlvdmxlbiA9PSAwKQorCQkJCWdvdG8gb3V0OworCisJCQlpZiAoc2tiLT5sZW4gIT0gbXNzX25vdyB8fCAoZmxhZ3MgJiBNU0dfT09CKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGZvcmNlZF9wdXNoKHRwKSkgeworCQkJCXRjcF9tYXJrX3B1c2godHAsIHNrYik7CisJCQkJX190Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzaywgdHAsIG1zc19ub3csIFRDUF9OQUdMRV9QVVNIKTsKKwkJCX0gZWxzZSBpZiAoc2tiID09IHNrLT5za19zZW5kX2hlYWQpCisJCQkJdGNwX3B1c2hfb25lKHNrLCBtc3Nfbm93KTsKKwkJCWNvbnRpbnVlOworCit3YWl0X2Zvcl9zbmRidWY6CisJCQlzZXRfYml0KFNPQ0tfTk9TUEFDRSwgJnNrLT5za19zb2NrZXQtPmZsYWdzKTsKK3dhaXRfZm9yX21lbW9yeToKKwkJCWlmIChjb3BpZWQpCisJCQkJdGNwX3B1c2goc2ssIHRwLCBmbGFncyAmIH5NU0dfTU9SRSwgbXNzX25vdywgVENQX05BR0xFX1BVU0gpOworCisJCQlpZiAoKGVyciA9IHNrX3N0cmVhbV93YWl0X21lbW9yeShzaywgJnRpbWVvKSkgIT0gMCkKKwkJCQlnb3RvIGRvX2Vycm9yOworCisJCQltc3Nfbm93ID0gdGNwX2N1cnJlbnRfbXNzKHNrLCAhKGZsYWdzJk1TR19PT0IpKTsKKwkJfQorCX0KKworb3V0OgorCWlmIChjb3BpZWQpCisJCXRjcF9wdXNoKHNrLCB0cCwgZmxhZ3MsIG1zc19ub3csIHRwLT5ub25hZ2xlKTsKKwlUQ1BfQ0hFQ0tfVElNRVIoc2spOworCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGNvcGllZDsKKworZG9fZmF1bHQ6CisJaWYgKCFza2ItPmxlbikgeworCQlpZiAoc2stPnNrX3NlbmRfaGVhZCA9PSBza2IpCisJCQlzay0+c2tfc2VuZF9oZWFkID0gTlVMTDsKKwkJX19za2JfdW5saW5rKHNrYiwgc2tiLT5saXN0KTsKKwkJc2tfc3RyZWFtX2ZyZWVfc2tiKHNrLCBza2IpOworCX0KKworZG9fZXJyb3I6CisJaWYgKGNvcGllZCkKKwkJZ290byBvdXQ7CitvdXRfZXJyOgorCWVyciA9IHNrX3N0cmVhbV9lcnJvcihzaywgZmxhZ3MsIGVycik7CisJVENQX0NIRUNLX1RJTUVSKHNrKTsKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKglIYW5kbGUgcmVhZGluZyB1cmdlbnQgZGF0YS4gQlNEIGhhcyB2ZXJ5IHNpbXBsZSBzZW1hbnRpY3MgZm9yCisgKgl0aGlzLCBubyBibG9ja2luZyBhbmQgdmVyeSBzdHJhbmdlIGVycm9ycyA4KQorICovCisKK3N0YXRpYyBpbnQgdGNwX3JlY3ZfdXJnKHN0cnVjdCBzb2NrICpzaywgbG9uZyB0aW1lbywKKwkJCXN0cnVjdCBtc2doZHIgKm1zZywgaW50IGxlbiwgaW50IGZsYWdzLAorCQkJaW50ICphZGRyX2xlbikKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKworCS8qIE5vIFVSRyBkYXRhIHRvIHJlYWQuICovCisJaWYgKHNvY2tfZmxhZyhzaywgU09DS19VUkdJTkxJTkUpIHx8ICF0cC0+dXJnX2RhdGEgfHwKKwkgICAgdHAtPnVyZ19kYXRhID09IFRDUF9VUkdfUkVBRCkKKwkJcmV0dXJuIC1FSU5WQUw7CS8qIFllcyB0aGlzIGlzIHJpZ2h0ICEgKi8KKworCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0NMT1NFICYmICFzb2NrX2ZsYWcoc2ssIFNPQ0tfRE9ORSkpCisJCXJldHVybiAtRU5PVENPTk47CisKKwlpZiAodHAtPnVyZ19kYXRhICYgVENQX1VSR19WQUxJRCkgeworCQlpbnQgZXJyID0gMDsKKwkJY2hhciBjID0gdHAtPnVyZ19kYXRhOworCisJCWlmICghKGZsYWdzICYgTVNHX1BFRUspKQorCQkJdHAtPnVyZ19kYXRhID0gVENQX1VSR19SRUFEOworCisJCS8qIFJlYWQgdXJnZW50IGRhdGEuICovCisJCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19PT0I7CisKKwkJaWYgKGxlbiA+IDApIHsKKwkJCWlmICghKGZsYWdzICYgTVNHX1RSVU5DKSkKKwkJCQllcnIgPSBtZW1jcHlfdG9pb3ZlYyhtc2ctPm1zZ19pb3YsICZjLCAxKTsKKwkJCWxlbiA9IDE7CisJCX0gZWxzZQorCQkJbXNnLT5tc2dfZmxhZ3MgfD0gTVNHX1RSVU5DOworCisJCXJldHVybiBlcnIgPyAtRUZBVUxUIDogbGVuOworCX0KKworCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0NMT1NFIHx8IChzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pKQorCQlyZXR1cm4gMDsKKworCS8qIEZpeGVkIHRoZSByZWN2KC4uLiwgTVNHX09PQikgYmVoYXZpb3VyLiAgQlNEIGRvY3MgYW5kCisJICogdGhlIGF2YWlsYWJsZSBpbXBsZW1lbnRhdGlvbnMgYWdyZWUgaW4gdGhpcyBjYXNlOgorCSAqIHRoaXMgY2FsbCBzaG91bGQgbmV2ZXIgYmxvY2ssIGluZGVwZW5kZW50IG9mIHRoZQorCSAqIGJsb2NraW5nIHN0YXRlIG9mIHRoZSBzb2NrZXQuCisJICogTWlrZSA8cGFsbEByei51bmkta2FybHNydWhlLmRlPgorCSAqLworCXJldHVybiAtRUFHQUlOOworfQorCisvKiBDbGVhbiB1cCB0aGUgcmVjZWl2ZSBidWZmZXIgZm9yIGZ1bGwgZnJhbWVzIHRha2VuIGJ5IHRoZSB1c2VyLAorICogdGhlbiBzZW5kIGFuIEFDSyBpZiBuZWNlc3NhcnkuICBDT1BJRUQgaXMgdGhlIG51bWJlciBvZiBieXRlcworICogdGNwX3JlY3Ztc2cgaGFzIGdpdmVuIHRvIHRoZSB1c2VyIHNvIGZhciwgaXQgc3BlZWRzIHVwIHRoZQorICogY2FsY3VsYXRpb24gb2Ygd2hldGhlciBvciBub3Qgd2UgbXVzdCBBQ0sgZm9yIHRoZSBzYWtlIG9mCisgKiBhIHdpbmRvdyB1cGRhdGUuCisgKi8KK3N0YXRpYyB2b2lkIGNsZWFudXBfcmJ1ZihzdHJ1Y3Qgc29jayAqc2ssIGludCBjb3BpZWQpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJaW50IHRpbWVfdG9fYWNrID0gMDsKKworI2lmIFRDUF9ERUJVRworCXN0cnVjdCBza19idWZmICpza2IgPSBza2JfcGVlaygmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCisJQlVHX1RSQVAoIXNrYiB8fCBiZWZvcmUodHAtPmNvcGllZF9zZXEsIFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSkpOworI2VuZGlmCisKKwlpZiAodGNwX2Fja19zY2hlZHVsZWQodHApKSB7CisJCSAgIC8qIERlbGF5ZWQgQUNLcyBmcmVxdWVudGx5IGhpdCBsb2NrZWQgc29ja2V0cyBkdXJpbmcgYnVsaworCQkgICAgKiByZWNlaXZlLiAqLworCQlpZiAodHAtPmFjay5ibG9ja2VkIHx8CisJCSAgICAvKiBPbmNlLXBlci10d28tc2VnbWVudHMgQUNLIHdhcyBub3Qgc2VudCBieSB0Y3BfaW5wdXQuYyAqLworCQkgICAgdHAtPnJjdl9ueHQgLSB0cC0+cmN2X3d1cCA+IHRwLT5hY2sucmN2X21zcyB8fAorCQkgICAgLyoKKwkJICAgICAqIElmIHRoaXMgcmVhZCBlbXB0aWVkIHJlYWQgYnVmZmVyLCB3ZSBzZW5kIEFDSywgaWYKKwkJICAgICAqIGNvbm5lY3Rpb24gaXMgbm90IGJpZGlyZWN0aW9uYWwsIHVzZXIgZHJhaW5lZAorCQkgICAgICogcmVjZWl2ZSBidWZmZXIgYW5kIHRoZXJlIHdhcyBhIHNtYWxsIHNlZ21lbnQKKwkJICAgICAqIGluIHF1ZXVlLgorCQkgICAgICovCisJCSAgICAoY29waWVkID4gMCAmJiAodHAtPmFjay5wZW5kaW5nICYgVENQX0FDS19QVVNIRUQpICYmCisJCSAgICAgIXRwLT5hY2sucGluZ3BvbmcgJiYgIWF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykpKQorCQkJdGltZV90b19hY2sgPSAxOworCX0KKworCS8qIFdlIHNlbmQgYW4gQUNLIGlmIHdlIGNhbiBub3cgYWR2ZXJ0aXNlIGEgbm9uLXplcm8gd2luZG93CisJICogd2hpY2ggaGFzIGJlZW4gcmFpc2VkICJzaWduaWZpY2FudGx5Ii4KKwkgKgorCSAqIEV2ZW4gaWYgd2luZG93IHJhaXNlZCB1cCB0byBpbmZpbml0eSwgZG8gbm90IHNlbmQgd2luZG93IG9wZW4gQUNLCisJICogaW4gc3RhdGVzLCB3aGVyZSB3ZSB3aWxsIG5vdCByZWNlaXZlIG1vcmUuIEl0IGlzIHVzZWxlc3MuCisJICovCisJaWYgKGNvcGllZCA+IDAgJiYgIXRpbWVfdG9fYWNrICYmICEoc2stPnNrX3NodXRkb3duICYgUkNWX1NIVVRET1dOKSkgeworCQlfX3UzMiByY3Zfd2luZG93X25vdyA9IHRjcF9yZWNlaXZlX3dpbmRvdyh0cCk7CisKKwkJLyogT3B0aW1pemUsIF9fdGNwX3NlbGVjdF93aW5kb3coKSBpcyBub3QgY2hlYXAuICovCisJCWlmICgyKnJjdl93aW5kb3dfbm93IDw9IHRwLT53aW5kb3dfY2xhbXApIHsKKwkJCV9fdTMyIG5ld193aW5kb3cgPSBfX3RjcF9zZWxlY3Rfd2luZG93KHNrKTsKKworCQkJLyogU2VuZCBBQ0sgbm93LCBpZiB0aGlzIHJlYWQgZnJlZWQgbG90cyBvZiBzcGFjZQorCQkJICogaW4gb3VyIGJ1ZmZlci4gQ2VydGFpbmx5LCBuZXdfd2luZG93IGlzIG5ldyB3aW5kb3cuCisJCQkgKiBXZSBjYW4gYWR2ZXJ0aXNlIGl0IG5vdywgaWYgaXQgaXMgbm90IGxlc3MgdGhhbiBjdXJyZW50IG9uZS4KKwkJCSAqICJMb3RzIiBtZWFucyAiYXQgbGVhc3QgdHdpY2UiIGhlcmUuCisJCQkgKi8KKwkJCWlmIChuZXdfd2luZG93ICYmIG5ld193aW5kb3cgPj0gMiAqIHJjdl93aW5kb3dfbm93KQorCQkJCXRpbWVfdG9fYWNrID0gMTsKKwkJfQorCX0KKwlpZiAodGltZV90b19hY2spCisJCXRjcF9zZW5kX2Fjayhzayk7Cit9CisKK3N0YXRpYyB2b2lkIHRjcF9wcmVxdWV1ZV9wcm9jZXNzKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJTkVUX0FERF9TVEFUU19VU0VSKExJTlVYX01JQl9UQ1BQUkVRVUVVRUQsIHNrYl9xdWV1ZV9sZW4oJnRwLT51Y29weS5wcmVxdWV1ZSkpOworCisJLyogUlggcHJvY2VzcyB3YW50cyB0byBydW4gd2l0aCBkaXNhYmxlZCBCSHMsIHRob3VnaCBpdCBpcyBub3QKKwkgKiBuZWNlc3NhcnkgKi8KKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlKCZ0cC0+dWNvcHkucHJlcXVldWUpKSAhPSBOVUxMKQorCQlzay0+c2tfYmFja2xvZ19yY3Yoc2ssIHNrYik7CisJbG9jYWxfYmhfZW5hYmxlKCk7CisKKwkvKiBDbGVhciBtZW1vcnkgY291bnRlci4gKi8KKwl0cC0+dWNvcHkubWVtb3J5ID0gMDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqdGNwX3JlY3Zfc2tiKHN0cnVjdCBzb2NrICpzaywgdTMyIHNlcSwgdTMyICpvZmYpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1MzIgb2Zmc2V0OworCisJc2tiX3F1ZXVlX3dhbGsoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpIHsKKwkJb2Zmc2V0ID0gc2VxIC0gVENQX1NLQl9DQihza2IpLT5zZXE7CisJCWlmIChza2ItPmgudGgtPnN5bikKKwkJCW9mZnNldC0tOworCQlpZiAob2Zmc2V0IDwgc2tiLT5sZW4gfHwgc2tiLT5oLnRoLT5maW4pIHsKKwkJCSpvZmYgPSBvZmZzZXQ7CisJCQlyZXR1cm4gc2tiOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogVGhpcyByb3V0aW5lIHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHRvIHRjcF9yZWN2bXNnKCkgZm9yIHJvdXRpbmVzCisgKiB0aGF0IHdvdWxkIGxpa2UgdG8gaGFuZGxlIGNvcHlpbmcgZnJvbSBza2J1ZmZzIGRpcmVjdGx5IGluICdzZW5kZmlsZScKKyAqIGZhc2hpb24uCisgKiBOb3RlOgorICoJLSBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHNvY2tldCB3YXMgbG9ja2VkIGJ5IHRoZSBjYWxsZXIuCisgKgktIFRoZSByb3V0aW5lIGRvZXMgbm90IGJsb2NrLgorICoJLSBBdCBwcmVzZW50LCB0aGVyZSBpcyBubyBzdXBwb3J0IGZvciByZWFkaW5nIE9PQiBkYXRhCisgKgkgIG9yIGZvciAncGVla2luZycgdGhlIHNvY2tldCB1c2luZyB0aGlzIHJvdXRpbmUKKyAqCSAgKGFsdGhvdWdoIGJvdGggd291bGQgYmUgZWFzeSB0byBpbXBsZW1lbnQpLgorICovCitpbnQgdGNwX3JlYWRfc29jayhzdHJ1Y3Qgc29jayAqc2ssIHJlYWRfZGVzY3JpcHRvcl90ICpkZXNjLAorCQkgIHNrX3JlYWRfYWN0b3JfdCByZWN2X2FjdG9yKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJdTMyIHNlcSA9IHRwLT5jb3BpZWRfc2VxOworCXUzMiBvZmZzZXQ7CisJaW50IGNvcGllZCA9IDA7CisKKwlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9MSVNURU4pCisJCXJldHVybiAtRU5PVENPTk47CisJd2hpbGUgKChza2IgPSB0Y3BfcmVjdl9za2Ioc2ssIHNlcSwgJm9mZnNldCkpICE9IE5VTEwpIHsKKwkJaWYgKG9mZnNldCA8IHNrYi0+bGVuKSB7CisJCQlzaXplX3QgdXNlZCwgbGVuOworCisJCQlsZW4gPSBza2ItPmxlbiAtIG9mZnNldDsKKwkJCS8qIFN0b3AgcmVhZGluZyBpZiB3ZSBoaXQgYSBwYXRjaCBvZiB1cmdlbnQgZGF0YSAqLworCQkJaWYgKHRwLT51cmdfZGF0YSkgeworCQkJCXUzMiB1cmdfb2Zmc2V0ID0gdHAtPnVyZ19zZXEgLSBzZXE7CisJCQkJaWYgKHVyZ19vZmZzZXQgPCBsZW4pCisJCQkJCWxlbiA9IHVyZ19vZmZzZXQ7CisJCQkJaWYgKCFsZW4pCisJCQkJCWJyZWFrOworCQkJfQorCQkJdXNlZCA9IHJlY3ZfYWN0b3IoZGVzYywgc2tiLCBvZmZzZXQsIGxlbik7CisJCQlpZiAodXNlZCA8PSBsZW4pIHsKKwkJCQlzZXEgKz0gdXNlZDsKKwkJCQljb3BpZWQgKz0gdXNlZDsKKwkJCQlvZmZzZXQgKz0gdXNlZDsKKwkJCX0KKwkJCWlmIChvZmZzZXQgIT0gc2tiLT5sZW4pCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKHNrYi0+aC50aC0+ZmluKSB7CisJCQlza19lYXRfc2tiKHNrLCBza2IpOworCQkJKytzZXE7CisJCQlicmVhazsKKwkJfQorCQlza19lYXRfc2tiKHNrLCBza2IpOworCQlpZiAoIWRlc2MtPmNvdW50KQorCQkJYnJlYWs7CisJfQorCXRwLT5jb3BpZWRfc2VxID0gc2VxOworCisJdGNwX3Jjdl9zcGFjZV9hZGp1c3Qoc2spOworCisJLyogQ2xlYW4gdXAgZGF0YSB3ZSBoYXZlIHJlYWQ6IFRoaXMgd2lsbCBkbyBBQ0sgZnJhbWVzLiAqLworCWlmIChjb3BpZWQpCisJCWNsZWFudXBfcmJ1ZihzaywgY29waWVkKTsKKwlyZXR1cm4gY29waWVkOworfQorCisvKgorICoJVGhpcyByb3V0aW5lIGNvcGllcyBmcm9tIGEgc29jayBzdHJ1Y3QgaW50byB0aGUgdXNlciBidWZmZXIuCisgKgorICoJVGVjaG5pY2FsIG5vdGU6IGluIDIuMyB3ZSB3b3JrIG9uIF9sb2NrZWRfIHNvY2tldCwgc28gdGhhdAorICoJdHJpY2tzIHdpdGggKnNlcSBhY2Nlc3Mgb3JkZXIgYW5kIHNrYi0+dXNlcnMgYXJlIG5vdCByZXF1aXJlZC4KKyAqCVByb2JhYmx5LCBjb2RlIGNhbiBiZSBlYXNpbHkgaW1wcm92ZWQgZXZlbiBtb3JlLgorICovCisKK2ludCB0Y3BfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLAorCQlzaXplX3QgbGVuLCBpbnQgbm9uYmxvY2ssIGludCBmbGFncywgaW50ICphZGRyX2xlbikKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlpbnQgY29waWVkID0gMDsKKwl1MzIgcGVla19zZXE7CisJdTMyICpzZXE7CisJdW5zaWduZWQgbG9uZyB1c2VkOworCWludCBlcnI7CisJaW50IHRhcmdldDsJCS8qIFJlYWQgYXQgbGVhc3QgdGhpcyBtYW55IGJ5dGVzICovCisJbG9uZyB0aW1lbzsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnVzZXJfcmVjdiA9IE5VTEw7CisKKwlsb2NrX3NvY2soc2spOworCisJVENQX0NIRUNLX1RJTUVSKHNrKTsKKworCWVyciA9IC1FTk9UQ09OTjsKKwlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9MSVNURU4pCisJCWdvdG8gb3V0OworCisJdGltZW8gPSBzb2NrX3JjdnRpbWVvKHNrLCBub25ibG9jayk7CisKKwkvKiBVcmdlbnQgZGF0YSBuZWVkcyB0byBiZSBoYW5kbGVkIHNwZWNpYWxseS4gKi8KKwlpZiAoZmxhZ3MgJiBNU0dfT09CKQorCQlnb3RvIHJlY3ZfdXJnOworCisJc2VxID0gJnRwLT5jb3BpZWRfc2VxOworCWlmIChmbGFncyAmIE1TR19QRUVLKSB7CisJCXBlZWtfc2VxID0gdHAtPmNvcGllZF9zZXE7CisJCXNlcSA9ICZwZWVrX3NlcTsKKwl9CisKKwl0YXJnZXQgPSBzb2NrX3Jjdmxvd2F0KHNrLCBmbGFncyAmIE1TR19XQUlUQUxMLCBsZW4pOworCisJZG8geworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQl1MzIgb2Zmc2V0OworCisJCS8qIEFyZSB3ZSBhdCB1cmdlbnQgZGF0YT8gU3RvcCBpZiB3ZSBoYXZlIHJlYWQgYW55dGhpbmcgb3IgaGF2ZSBTSUdVUkcgcGVuZGluZy4gKi8KKwkJaWYgKHRwLT51cmdfZGF0YSAmJiB0cC0+dXJnX3NlcSA9PSAqc2VxKSB7CisJCQlpZiAoY29waWVkKQorCQkJCWJyZWFrOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJY29waWVkID0gdGltZW8gPyBzb2NrX2ludHJfZXJybm8odGltZW8pIDogLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIE5leHQgZ2V0IGEgYnVmZmVyLiAqLworCisJCXNrYiA9IHNrYl9wZWVrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJCWRvIHsKKwkJCWlmICghc2tiKQorCQkJCWJyZWFrOworCisJCQkvKiBOb3cgdGhhdCB3ZSBoYXZlIHR3byByZWNlaXZlIHF1ZXVlcyB0aGlzCisJCQkgKiBzaG91bGRuJ3QgaGFwcGVuLgorCQkJICovCisJCQlpZiAoYmVmb3JlKCpzZXEsIFRDUF9TS0JfQ0Ioc2tiKS0+c2VxKSkgeworCQkJCXByaW50ayhLRVJOX0lORk8gInJlY3Ztc2cgYnVnOiBjb3BpZWQgJVggIgorCQkJCSAgICAgICAic2VxICVYXG4iLCAqc2VxLCBUQ1BfU0tCX0NCKHNrYiktPnNlcSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlvZmZzZXQgPSAqc2VxIC0gVENQX1NLQl9DQihza2IpLT5zZXE7CisJCQlpZiAoc2tiLT5oLnRoLT5zeW4pCisJCQkJb2Zmc2V0LS07CisJCQlpZiAob2Zmc2V0IDwgc2tiLT5sZW4pCisJCQkJZ290byBmb3VuZF9va19za2I7CisJCQlpZiAoc2tiLT5oLnRoLT5maW4pCisJCQkJZ290byBmb3VuZF9maW5fb2s7CisJCQlCVUdfVFJBUChmbGFncyAmIE1TR19QRUVLKTsKKwkJCXNrYiA9IHNrYi0+bmV4dDsKKwkJfSB3aGlsZSAoc2tiICE9IChzdHJ1Y3Qgc2tfYnVmZiAqKSZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisKKwkJLyogV2VsbCwgaWYgd2UgaGF2ZSBiYWNrbG9nLCB0cnkgdG8gcHJvY2VzcyBpdCBub3cgeWV0LiAqLworCisJCWlmIChjb3BpZWQgPj0gdGFyZ2V0ICYmICFzay0+c2tfYmFja2xvZy50YWlsKQorCQkJYnJlYWs7CisKKwkJaWYgKGNvcGllZCkgeworCQkJaWYgKHNrLT5za19lcnIgfHwKKwkJCSAgICBzay0+c2tfc3RhdGUgPT0gVENQX0NMT1NFIHx8CisJCQkgICAgKHNrLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikgfHwKKwkJCSAgICAhdGltZW8gfHwKKwkJCSAgICBzaWduYWxfcGVuZGluZyhjdXJyZW50KSB8fAorCQkJICAgIChmbGFncyAmIE1TR19QRUVLKSkKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfRE9ORSkpCisJCQkJYnJlYWs7CisKKwkJCWlmIChzay0+c2tfZXJyKSB7CisJCQkJY29waWVkID0gc29ja19lcnJvcihzayk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pCisJCQkJYnJlYWs7CisKKwkJCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0NMT1NFKSB7CisJCQkJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfRE9ORSkpIHsKKwkJCQkJLyogVGhpcyBvY2N1cnMgd2hlbiB1c2VyIHRyaWVzIHRvIHJlYWQKKwkJCQkJICogZnJvbSBuZXZlciBjb25uZWN0ZWQgc29ja2V0LgorCQkJCQkgKi8KKwkJCQkJY29waWVkID0gLUVOT1RDT05OOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICghdGltZW8pIHsKKwkJCQljb3BpZWQgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQljb3BpZWQgPSBzb2NrX2ludHJfZXJybm8odGltZW8pOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJY2xlYW51cF9yYnVmKHNrLCBjb3BpZWQpOworCisJCWlmICh0cC0+dWNvcHkudGFzayA9PSB1c2VyX3JlY3YpIHsKKwkJCS8qIEluc3RhbGwgbmV3IHJlYWRlciAqLworCQkJaWYgKCF1c2VyX3JlY3YgJiYgIShmbGFncyAmIChNU0dfVFJVTkMgfCBNU0dfUEVFSykpKSB7CisJCQkJdXNlcl9yZWN2ID0gY3VycmVudDsKKwkJCQl0cC0+dWNvcHkudGFzayA9IHVzZXJfcmVjdjsKKwkJCQl0cC0+dWNvcHkuaW92ID0gbXNnLT5tc2dfaW92OworCQkJfQorCisJCQl0cC0+dWNvcHkubGVuID0gbGVuOworCisJCQlCVUdfVFJBUCh0cC0+Y29waWVkX3NlcSA9PSB0cC0+cmN2X254dCB8fAorCQkJCSAoZmxhZ3MgJiAoTVNHX1BFRUsgfCBNU0dfVFJVTkMpKSk7CisKKwkJCS8qIFVnbHkuLi4gSWYgcHJlcXVldWUgaXMgbm90IGVtcHR5LCB3ZSBoYXZlIHRvCisJCQkgKiBwcm9jZXNzIGl0IGJlZm9yZSByZWxlYXNpbmcgc29ja2V0LCBvdGhlcndpc2UKKwkJCSAqIG9yZGVyIHdpbGwgYmUgYnJva2VuIGF0IHNlY29uZCBpdGVyYXRpb24uCisJCQkgKiBNb3JlIGVsZWdhbnQgc29sdXRpb24gaXMgcmVxdWlyZWQhISEKKwkJCSAqCisJCQkgKiBMb29rOiB3ZSBoYXZlIHRoZSBmb2xsb3dpbmcgKHBzZXVkbylxdWV1ZXM6CisJCQkgKgorCQkJICogMS4gcGFja2V0cyBpbiBmbGlnaHQKKwkJCSAqIDIuIGJhY2tsb2cKKwkJCSAqIDMuIHByZXF1ZXVlCisJCQkgKiA0LiByZWNlaXZlX3F1ZXVlCisJCQkgKgorCQkJICogRWFjaCBxdWV1ZSBjYW4gYmUgcHJvY2Vzc2VkIG9ubHkgaWYgdGhlIG5leHQgb25lcworCQkJICogYXJlIGVtcHR5LiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgZW1wdHkgcmVjZWl2ZV9xdWV1ZS4KKwkJCSAqIEJ1dCBwcmVxdWV1ZSBfY2FuXyBiZSBub3QgZW1wdHkgYWZ0ZXIgMm5kIGl0ZXJhdGlvbiwKKwkJCSAqIHdoZW4gd2UganVtcGVkIHRvIHN0YXJ0IG9mIGxvb3AgYmVjYXVzZSBiYWNrbG9nCisJCQkgKiBwcm9jZXNzaW5nIGFkZGVkIHNvbWV0aGluZyB0byByZWNlaXZlX3F1ZXVlLgorCQkJICogV2UgY2Fubm90IHJlbGVhc2Vfc29jaygpLCBiZWNhdXNlIGJhY2tsb2cgY29udGFpbnMKKwkJCSAqIHBhY2tldHMgYXJyaXZlZCBfYWZ0ZXJfIHByZXF1ZXVlZCBvbmVzLgorCQkJICoKKwkJCSAqIFNob3J0bHksIGFsZ29yaXRobSBpcyBjbGVhciAtLS0gdG8gcHJvY2VzcyBhbGwKKwkJCSAqIHRoZSBxdWV1ZXMgaW4gb3JkZXIuIFdlIGNvdWxkIG1ha2UgaXQgbW9yZSBkaXJlY3RseSwKKwkJCSAqIHJlcXVldWVpbmcgcGFja2V0cyBmcm9tIGJhY2tsb2cgdG8gcHJlcXVldWUsIGlmCisJCQkgKiBpcyBub3QgZW1wdHkuIEl0IGlzIG1vcmUgZWxlZ2FudCwgYnV0IGVhdHMgY3ljbGVzLAorCQkJICogdW5mb3J0dW5hdGVseS4KKwkJCSAqLworCQkJaWYgKHNrYl9xdWV1ZV9sZW4oJnRwLT51Y29weS5wcmVxdWV1ZSkpCisJCQkJZ290byBkb19wcmVxdWV1ZTsKKworCQkJLyogX18gU2V0IHJlYWx0aW1lIHBvbGljeSBpbiBzY2hlZHVsZXIgX18gKi8KKwkJfQorCisJCWlmIChjb3BpZWQgPj0gdGFyZ2V0KSB7CisJCQkvKiBEbyBub3Qgc2xlZXAsIGp1c3QgcHJvY2VzcyBiYWNrbG9nLiAqLworCQkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJCWxvY2tfc29jayhzayk7CisJCX0gZWxzZQorCQkJc2tfd2FpdF9kYXRhKHNrLCAmdGltZW8pOworCisJCWlmICh1c2VyX3JlY3YpIHsKKwkJCWludCBjaHVuazsKKworCQkJLyogX18gUmVzdG9yZSBub3JtYWwgcG9saWN5IGluIHNjaGVkdWxlciBfXyAqLworCisJCQlpZiAoKGNodW5rID0gbGVuIC0gdHAtPnVjb3B5LmxlbikgIT0gMCkgeworCQkJCU5FVF9BRERfU1RBVFNfVVNFUihMSU5VWF9NSUJfVENQRElSRUNUQ09QWUZST01CQUNLTE9HLCBjaHVuayk7CisJCQkJbGVuIC09IGNodW5rOworCQkJCWNvcGllZCArPSBjaHVuazsKKwkJCX0KKworCQkJaWYgKHRwLT5yY3Zfbnh0ID09IHRwLT5jb3BpZWRfc2VxICYmCisJCQkgICAgc2tiX3F1ZXVlX2xlbigmdHAtPnVjb3B5LnByZXF1ZXVlKSkgeworZG9fcHJlcXVldWU6CisJCQkJdGNwX3ByZXF1ZXVlX3Byb2Nlc3Moc2spOworCisJCQkJaWYgKChjaHVuayA9IGxlbiAtIHRwLT51Y29weS5sZW4pICE9IDApIHsKKwkJCQkJTkVUX0FERF9TVEFUU19VU0VSKExJTlVYX01JQl9UQ1BESVJFQ1RDT1BZRlJPTVBSRVFVRVVFLCBjaHVuayk7CisJCQkJCWxlbiAtPSBjaHVuazsKKwkJCQkJY29waWVkICs9IGNodW5rOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoKGZsYWdzICYgTVNHX1BFRUspICYmIHBlZWtfc2VxICE9IHRwLT5jb3BpZWRfc2VxKSB7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJUQ1AoJXM6JWQpOiBBcHBsaWNhdGlvbiBidWcsIHJhY2UgaW4gTVNHX1BFRUsuXG4iLAorCQkJCSAgICAgICBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQpOworCQkJcGVla19zZXEgPSB0cC0+Y29waWVkX3NlcTsKKwkJfQorCQljb250aW51ZTsKKworCWZvdW5kX29rX3NrYjoKKwkJLyogT2sgc28gaG93IG11Y2ggY2FuIHdlIHVzZT8gKi8KKwkJdXNlZCA9IHNrYi0+bGVuIC0gb2Zmc2V0OworCQlpZiAobGVuIDwgdXNlZCkKKwkJCXVzZWQgPSBsZW47CisKKwkJLyogRG8gd2UgaGF2ZSB1cmdlbnQgZGF0YSBoZXJlPyAqLworCQlpZiAodHAtPnVyZ19kYXRhKSB7CisJCQl1MzIgdXJnX29mZnNldCA9IHRwLT51cmdfc2VxIC0gKnNlcTsKKwkJCWlmICh1cmdfb2Zmc2V0IDwgdXNlZCkgeworCQkJCWlmICghdXJnX29mZnNldCkgeworCQkJCQlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19VUkdJTkxJTkUpKSB7CisJCQkJCQkrKypzZXE7CisJCQkJCQlvZmZzZXQrKzsKKwkJCQkJCXVzZWQtLTsKKwkJCQkJCWlmICghdXNlZCkKKwkJCQkJCQlnb3RvIHNraXBfY29weTsKKwkJCQkJfQorCQkJCX0gZWxzZQorCQkJCQl1c2VkID0gdXJnX29mZnNldDsKKwkJCX0KKwkJfQorCisJCWlmICghKGZsYWdzICYgTVNHX1RSVU5DKSkgeworCQkJZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCBvZmZzZXQsCisJCQkJCQkgICAgICBtc2ctPm1zZ19pb3YsIHVzZWQpOworCQkJaWYgKGVycikgeworCQkJCS8qIEV4Y2VwdGlvbi4gQmFpbG91dCEgKi8KKwkJCQlpZiAoIWNvcGllZCkKKwkJCQkJY29waWVkID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCSpzZXEgKz0gdXNlZDsKKwkJY29waWVkICs9IHVzZWQ7CisJCWxlbiAtPSB1c2VkOworCisJCXRjcF9yY3Zfc3BhY2VfYWRqdXN0KHNrKTsKKworc2tpcF9jb3B5OgorCQlpZiAodHAtPnVyZ19kYXRhICYmIGFmdGVyKHRwLT5jb3BpZWRfc2VxLCB0cC0+dXJnX3NlcSkpIHsKKwkJCXRwLT51cmdfZGF0YSA9IDA7CisJCQl0Y3BfZmFzdF9wYXRoX2NoZWNrKHNrLCB0cCk7CisJCX0KKwkJaWYgKHVzZWQgKyBvZmZzZXQgPCBza2ItPmxlbikKKwkJCWNvbnRpbnVlOworCisJCWlmIChza2ItPmgudGgtPmZpbikKKwkJCWdvdG8gZm91bmRfZmluX29rOworCQlpZiAoIShmbGFncyAmIE1TR19QRUVLKSkKKwkJCXNrX2VhdF9za2Ioc2ssIHNrYik7CisJCWNvbnRpbnVlOworCisJZm91bmRfZmluX29rOgorCQkvKiBQcm9jZXNzIHRoZSBGSU4uICovCisJCSsrKnNlcTsKKwkJaWYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpCisJCQlza19lYXRfc2tiKHNrLCBza2IpOworCQlicmVhazsKKwl9IHdoaWxlIChsZW4gPiAwKTsKKworCWlmICh1c2VyX3JlY3YpIHsKKwkJaWYgKHNrYl9xdWV1ZV9sZW4oJnRwLT51Y29weS5wcmVxdWV1ZSkpIHsKKwkJCWludCBjaHVuazsKKworCQkJdHAtPnVjb3B5LmxlbiA9IGNvcGllZCA+IDAgPyBsZW4gOiAwOworCisJCQl0Y3BfcHJlcXVldWVfcHJvY2Vzcyhzayk7CisKKwkJCWlmIChjb3BpZWQgPiAwICYmIChjaHVuayA9IGxlbiAtIHRwLT51Y29weS5sZW4pICE9IDApIHsKKwkJCQlORVRfQUREX1NUQVRTX1VTRVIoTElOVVhfTUlCX1RDUERJUkVDVENPUFlGUk9NUFJFUVVFVUUsIGNodW5rKTsKKwkJCQlsZW4gLT0gY2h1bms7CisJCQkJY29waWVkICs9IGNodW5rOworCQkJfQorCQl9CisKKwkJdHAtPnVjb3B5LnRhc2sgPSBOVUxMOworCQl0cC0+dWNvcHkubGVuID0gMDsKKwl9CisKKwkvKiBBY2NvcmRpbmcgdG8gVU5JWDk4LCBtc2dfbmFtZS9tc2dfbmFtZWxlbiBhcmUgaWdub3JlZAorCSAqIG9uIGNvbm5lY3RlZCBzb2NrZXQuIEkgd2FzIGp1c3QgaGFwcHkgd2hlbiBmb3VuZCB0aGlzIDgpIC0tQU5LCisJICovCisKKwkvKiBDbGVhbiB1cCBkYXRhIHdlIGhhdmUgcmVhZDogVGhpcyB3aWxsIGRvIEFDSyBmcmFtZXMuICovCisJY2xlYW51cF9yYnVmKHNrLCBjb3BpZWQpOworCisJVENQX0NIRUNLX1RJTUVSKHNrKTsKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBjb3BpZWQ7CisKK291dDoKKwlUQ1BfQ0hFQ0tfVElNRVIoc2spOworCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycjsKKworcmVjdl91cmc6CisJZXJyID0gdGNwX3JlY3ZfdXJnKHNrLCB0aW1lbywgbXNnLCBsZW4sIGZsYWdzLCBhZGRyX2xlbik7CisJZ290byBvdXQ7Cit9CisKKy8qCisgKglTdGF0ZSBwcm9jZXNzaW5nIG9uIGEgY2xvc2UuIFRoaXMgaW1wbGVtZW50cyB0aGUgc3RhdGUgc2hpZnQgZm9yCisgKglzZW5kaW5nIG91ciBGSU4gZnJhbWUuIE5vdGUgdGhhdCB3ZSBvbmx5IHNlbmQgYSBGSU4gZm9yIHNvbWUKKyAqCXN0YXRlcy4gQSBzaHV0ZG93bigpIG1heSBoYXZlIGFscmVhZHkgc2VudCB0aGUgRklOLCBvciB3ZSBtYXkgYmUKKyAqCWNsb3NlZC4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBuZXdfc3RhdGVbMTZdID0geworICAvKiBjdXJyZW50IHN0YXRlOiAgICAgICAgbmV3IHN0YXRlOiAgICAgIGFjdGlvbjoJKi8KKyAgLyogKEludmFsaWQpCQkqLyBUQ1BfQ0xPU0UsCisgIC8qIFRDUF9FU1RBQkxJU0hFRAkqLyBUQ1BfRklOX1dBSVQxIHwgVENQX0FDVElPTl9GSU4sCisgIC8qIFRDUF9TWU5fU0VOVAkqLyBUQ1BfQ0xPU0UsCisgIC8qIFRDUF9TWU5fUkVDVgkqLyBUQ1BfRklOX1dBSVQxIHwgVENQX0FDVElPTl9GSU4sCisgIC8qIFRDUF9GSU5fV0FJVDEJKi8gVENQX0ZJTl9XQUlUMSwKKyAgLyogVENQX0ZJTl9XQUlUMgkqLyBUQ1BfRklOX1dBSVQyLAorICAvKiBUQ1BfVElNRV9XQUlUCSovIFRDUF9DTE9TRSwKKyAgLyogVENQX0NMT1NFCQkqLyBUQ1BfQ0xPU0UsCisgIC8qIFRDUF9DTE9TRV9XQUlUCSovIFRDUF9MQVNUX0FDSyAgfCBUQ1BfQUNUSU9OX0ZJTiwKKyAgLyogVENQX0xBU1RfQUNLCSovIFRDUF9MQVNUX0FDSywKKyAgLyogVENQX0xJU1RFTgkJKi8gVENQX0NMT1NFLAorICAvKiBUQ1BfQ0xPU0lORwkqLyBUQ1BfQ0xPU0lORywKK307CisKK3N0YXRpYyBpbnQgdGNwX2Nsb3NlX3N0YXRlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlpbnQgbmV4dCA9IChpbnQpbmV3X3N0YXRlW3NrLT5za19zdGF0ZV07CisJaW50IG5zID0gbmV4dCAmIFRDUF9TVEFURV9NQVNLOworCisJdGNwX3NldF9zdGF0ZShzaywgbnMpOworCisJcmV0dXJuIG5leHQgJiBUQ1BfQUNUSU9OX0ZJTjsKK30KKworLyoKKyAqCVNodXRkb3duIHRoZSBzZW5kaW5nIHNpZGUgb2YgYSBjb25uZWN0aW9uLiBNdWNoIGxpa2UgY2xvc2UgZXhjZXB0CisgKgl0aGF0IHdlIGRvbid0IHJlY2VpdmUgc2h1dCBkb3duIG9yIHNldF9zb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkuCisgKi8KKwordm9pZCB0Y3Bfc2h1dGRvd24oc3RydWN0IHNvY2sgKnNrLCBpbnQgaG93KQoreworCS8qCVdlIG5lZWQgdG8gZ3JhYiBzb21lIG1lbW9yeSwgYW5kIHB1dCB0b2dldGhlciBhIEZJTiwKKwkgKglhbmQgdGhlbiBwdXQgaXQgaW50byB0aGUgcXVldWUgdG8gYmUgc2VudC4KKwkgKgkJVGltIE1hY0tlbnppZSh0eW1AZGliYmxlci5jcy5tb25hc2guZWR1LmF1KSA0IERlYyAnOTIuCisJICovCisJaWYgKCEoaG93ICYgU0VORF9TSFVURE9XTikpCisJCXJldHVybjsKKworCS8qIElmIHdlJ3ZlIGFscmVhZHkgc2VudCBhIEZJTiwgb3IgaXQncyBhIGNsb3NlZCBzdGF0ZSwgc2tpcCB0aGlzLiAqLworCWlmICgoMSA8PCBzay0+c2tfc3RhdGUpICYKKwkgICAgKFRDUEZfRVNUQUJMSVNIRUQgfCBUQ1BGX1NZTl9TRU5UIHwKKwkgICAgIFRDUEZfU1lOX1JFQ1YgfCBUQ1BGX0NMT1NFX1dBSVQpKSB7CisJCS8qIENsZWFyIG91dCBhbnkgaGFsZiBjb21wbGV0ZWQgcGFja2V0cy4gIEZJTiBpZiBuZWVkZWQuICovCisJCWlmICh0Y3BfY2xvc2Vfc3RhdGUoc2spKQorCQkJdGNwX3NlbmRfZmluKHNrKTsKKwl9Cit9CisKKy8qCisgKiBBdCB0aGlzIHBvaW50LCB0aGVyZSBzaG91bGQgYmUgbm8gcHJvY2VzcyByZWZlcmVuY2UgdG8gdGhpcworICogc29ja2V0LCBhbmQgdGh1cyBubyB1c2VyIHJlZmVyZW5jZXMgYXQgYWxsLiAgVGhlcmVmb3JlIHdlCisgKiBjYW4gYXNzdW1lIHRoZSBzb2NrZXQgd2FpdHF1ZXVlIGlzIGluYWN0aXZlIGFuZCBub2JvZHkgd2lsbAorICogdHJ5IHRvIGp1bXAgb250byBpdC4KKyAqLwordm9pZCB0Y3BfZGVzdHJveV9zb2NrKHN0cnVjdCBzb2NrICpzaykKK3sKKwlCVUdfVFJBUChzay0+c2tfc3RhdGUgPT0gVENQX0NMT1NFKTsKKwlCVUdfVFJBUChzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpOworCisJLyogSXQgY2Fubm90IGJlIGluIGhhc2ggdGFibGUhICovCisJQlVHX1RSQVAoc2tfdW5oYXNoZWQoc2spKTsKKworCS8qIElmIGl0IGhhcyBub3QgMCBpbmV0X3NrKHNrKS0+bnVtLCBpdCBtdXN0IGJlIGJvdW5kICovCisJQlVHX1RSQVAoIWluZXRfc2soc2spLT5udW0gfHwgdGNwX3NrKHNrKS0+YmluZF9oYXNoKTsKKworCXNrLT5za19wcm90LT5kZXN0cm95KHNrKTsKKworCXNrX3N0cmVhbV9raWxsX3F1ZXVlcyhzayk7CisKKwl4ZnJtX3NrX2ZyZWVfcG9saWN5KHNrKTsKKworI2lmZGVmIElORVRfUkVGQ05UX0RFQlVHCisJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfcmVmY250KSAhPSAxKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJEZXN0cnVjdGlvbiBUQ1AgJXAgZGVsYXllZCwgYz0lZFxuIiwKKwkJICAgICAgIHNrLCBhdG9taWNfcmVhZCgmc2stPnNrX3JlZmNudCkpOworCX0KKyNlbmRpZgorCisJYXRvbWljX2RlYygmdGNwX29ycGhhbl9jb3VudCk7CisJc29ja19wdXQoc2spOworfQorCit2b2lkIHRjcF9jbG9zZShzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgdGltZW91dCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBkYXRhX3dhc191bnJlYWQgPSAwOworCisJbG9ja19zb2NrKHNrKTsKKwlzay0+c2tfc2h1dGRvd24gPSBTSFVURE9XTl9NQVNLOworCisJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOKSB7CisJCXRjcF9zZXRfc3RhdGUoc2ssIFRDUF9DTE9TRSk7CisKKwkJLyogU3BlY2lhbCBjYXNlLiAqLworCQl0Y3BfbGlzdGVuX3N0b3Aoc2spOworCisJCWdvdG8gYWRqdWRnZV90b19kZWF0aDsKKwl9CisKKwkvKiAgV2UgbmVlZCB0byBmbHVzaCB0aGUgcmVjdi4gYnVmZnMuICBXZSBkbyB0aGlzIG9ubHkgb24gdGhlCisJICogIGRlc2NyaXB0b3IgY2xvc2UsIG5vdCBwcm90b2NvbC1zb3VyY2VkIGNsb3NlcywgYmVjYXVzZSB0aGUKKwkgKiAgcmVhZGVyIHByb2Nlc3MgbWF5IG5vdCBoYXZlIGRyYWluZWQgdGhlIGRhdGEgeWV0IQorCSAqLworCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKSAhPSBOVUxMKSB7CisJCXUzMiBsZW4gPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEgLSBUQ1BfU0tCX0NCKHNrYiktPnNlcSAtCisJCQkgIHNrYi0+aC50aC0+ZmluOworCQlkYXRhX3dhc191bnJlYWQgKz0gbGVuOworCQlfX2tmcmVlX3NrYihza2IpOworCX0KKworCXNrX3N0cmVhbV9tZW1fcmVjbGFpbShzayk7CisKKwkvKiBBcyBvdXRsaW5lZCBpbiBkcmFmdC1pZXRmLXRjcGltcGwtcHJvYi0wMy50eHQsIHNlY3Rpb24KKwkgKiAzLjEwLCB3ZSBzZW5kIGEgUlNUIGhlcmUgYmVjYXVzZSBkYXRhIHdhcyBsb3N0LiAgVG8KKwkgKiB3aXRuZXNzIHRoZSBhd2Z1bCBlZmZlY3RzIG9mIHRoZSBvbGQgYmVoYXZpb3Igb2YgYWx3YXlzCisJICogZG9pbmcgYSBGSU4sIHJ1biBhbiBvbGRlciAyLjEueCBrZXJuZWwgb3IgMi4wLngsIHN0YXJ0CisJICogYSBidWxrIEdFVCBpbiBhbiBGVFAgY2xpZW50LCBzdXNwZW5kIHRoZSBwcm9jZXNzLCB3YWl0CisJICogZm9yIHRoZSBjbGllbnQgdG8gYWR2ZXJ0aXNlIGEgemVybyB3aW5kb3csIHRoZW4ga2lsbCAtOQorCSAqIHRoZSBGVFAgY2xpZW50LCB3aGVlZS4uLiAgTm90ZTogdGltZW91dCBpcyBhbHdheXMgemVybworCSAqIGluIHN1Y2ggYSBjYXNlLgorCSAqLworCWlmIChkYXRhX3dhc191bnJlYWQpIHsKKwkJLyogVW5yZWFkIGRhdGEgd2FzIHRvc3NlZCwgemFwIHRoZSBjb25uZWN0aW9uLiAqLworCQlORVRfSU5DX1NUQVRTX1VTRVIoTElOVVhfTUlCX1RDUEFCT1JUT05DTE9TRSk7CisJCXRjcF9zZXRfc3RhdGUoc2ssIFRDUF9DTE9TRSk7CisJCXRjcF9zZW5kX2FjdGl2ZV9yZXNldChzaywgR0ZQX0tFUk5FTCk7CisJfSBlbHNlIGlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfTElOR0VSKSAmJiAhc2stPnNrX2xpbmdlcnRpbWUpIHsKKwkJLyogQ2hlY2sgemVybyBsaW5nZXIgX2FmdGVyXyBjaGVja2luZyBmb3IgdW5yZWFkIGRhdGEuICovCisJCXNrLT5za19wcm90LT5kaXNjb25uZWN0KHNrLCAwKTsKKwkJTkVUX0lOQ19TVEFUU19VU0VSKExJTlVYX01JQl9UQ1BBQk9SVE9OREFUQSk7CisJfSBlbHNlIGlmICh0Y3BfY2xvc2Vfc3RhdGUoc2spKSB7CisJCS8qIFdlIEZJTiBpZiB0aGUgYXBwbGljYXRpb24gYXRlIGFsbCB0aGUgZGF0YSBiZWZvcmUKKwkJICogemFwcGluZyB0aGUgY29ubmVjdGlvbi4KKwkJICovCisKKwkJLyogUkVELVBFTi4gRm9ybWFsbHkgc3BlYWtpbmcsIHdlIGhhdmUgYnJva2VuIFRDUCBzdGF0ZQorCQkgKiBtYWNoaW5lLiBTdGF0ZSB0cmFuc2l0aW9uczoKKwkJICoKKwkJICogVENQX0VTVEFCTElTSEVEIC0+IFRDUF9GSU5fV0FJVDEKKwkJICogVENQX1NZTl9SRUNWCS0+IFRDUF9GSU5fV0FJVDEgKGZvcmdldCBpdCwgaXQncyBpbXBvc3NpYmxlKQorCQkgKiBUQ1BfQ0xPU0VfV0FJVCAtPiBUQ1BfTEFTVF9BQ0sKKwkJICoKKwkJICogYXJlIGxlZ2FsIG9ubHkgd2hlbiBGSU4gaGFzIGJlZW4gc2VudCAoaS5lLiBpbiB3aW5kb3cpLAorCQkgKiByYXRoZXIgdGhhbiBxdWV1ZWQgb3V0IG9mIHdpbmRvdy4gUHVyaXN0cyBibGFtZS4KKwkJICoKKwkJICogRi5lLiAiUkZDIHN0YXRlIiBpcyBFU1RBQkxJU0hFRCwKKwkJICogaWYgTGludXggc3RhdGUgaXMgRklOLVdBSVQtMSwgYnV0IEZJTiBpcyBzdGlsbCBub3Qgc2VudC4KKwkJICoKKwkJICogVGhlIHZpc2libGUgZGVjbGluYXRpb25zIGFyZSB0aGF0IHNvbWV0aW1lcworCQkgKiB3ZSBlbnRlciB0aW1lLXdhaXQgc3RhdGUsIHdoZW4gaXQgaXMgbm90IHJlcXVpcmVkIHJlYWxseQorCQkgKiAoaGFybWxlc3MpLCBkbyBub3Qgc2VuZCBhY3RpdmUgcmVzZXRzLCB3aGVuIHRoZXkgYXJlCisJCSAqIHJlcXVpcmVkIGJ5IHNwZWNzIChUQ1BfRVNUQUJMSVNIRUQsIFRDUF9DTE9TRV9XQUlULCB3aGVuCisJCSAqIHRoZXkgbG9vayBhcyBDTE9TSU5HIG9yIExBU1RfQUNLIGZvciBMaW51eCkKKwkJICogUHJvYmFibHksIEkgbWlzc2VkIHNvbWUgbW9yZSBob2xlbGV0cy4KKwkJICogCQkJCQkJLS1BTksKKwkJICovCisJCXRjcF9zZW5kX2Zpbihzayk7CisJfQorCisJc2tfc3RyZWFtX3dhaXRfY2xvc2Uoc2ssIHRpbWVvdXQpOworCithZGp1ZGdlX3RvX2RlYXRoOgorCS8qIEl0IGlzIHRoZSBsYXN0IHJlbGVhc2Vfc29jayBpbiBpdHMgbGlmZS4gSXQgd2lsbCByZW1vdmUgYmFja2xvZy4gKi8KKwlyZWxlYXNlX3NvY2soc2spOworCisKKwkvKiBOb3cgc29ja2V0IGlzIG93bmVkIGJ5IGtlcm5lbCBhbmQgd2UgYWNxdWlyZSBCSCBsb2NrCisJICAgdG8gZmluaXNoIGNsb3NlLiBObyBuZWVkIHRvIGNoZWNrIGZvciB1c2VyIHJlZnMuCisJICovCisJbG9jYWxfYmhfZGlzYWJsZSgpOworCWJoX2xvY2tfc29jayhzayk7CisJQlVHX1RSQVAoIXNvY2tfb3duZWRfYnlfdXNlcihzaykpOworCisJc29ja19ob2xkKHNrKTsKKwlzb2NrX29ycGhhbihzayk7CisKKwkvKglUaGlzIGlzIGEgKHVzZWZ1bCkgQlNEIHZpb2xhdGluZyBvZiB0aGUgUkZDLiBUaGVyZSBpcyBhCisJICoJcHJvYmxlbSB3aXRoIFRDUCBhcyBzcGVjaWZpZWQgaW4gdGhhdCB0aGUgb3RoZXIgZW5kIGNvdWxkCisJICoJa2VlcCBhIHNvY2tldCBvcGVuIGZvcmV2ZXIgd2l0aCBubyBhcHBsaWNhdGlvbiBsZWZ0IHRoaXMgZW5kLgorCSAqCVdlIHVzZSBhIDMgbWludXRlIHRpbWVvdXQgKGFib3V0IHRoZSBzYW1lIGFzIEJTRCkgdGhlbiBraWxsCisJICoJb3VyIGVuZC4gSWYgdGhleSBzZW5kIGFmdGVyIHRoYXQgdGhlbiB0b3VnaCAtIEJVVDogbG9uZyBlbm91Z2gKKwkgKgl0aGF0IHdlIHdvbid0IG1ha2UgdGhlIG9sZCA0KnJ0byA9IGFsbW9zdCBubyB0aW1lIC0gd2hvb3BzCisJICoJcmVzZXQgbWlzdGFrZS4KKwkgKgorCSAqCU5vcGUsIGl0IHdhcyBub3QgbWlzdGFrZS4gSXQgaXMgcmVhbGx5IGRlc2lyZWQgYmVoYXZpb3VyCisJICoJZi5lLiBvbiBodHRwIHNlcnZlcnMsIHdoZW4gc3VjaCBzb2NrZXRzIGFyZSB1c2VsZXNzLCBidXQKKwkgKgljb25zdW1lIHNpZ25pZmljYW50IHJlc291cmNlcy4gTGV0J3MgZG8gaXQgd2l0aCBzcGVjaWFsCisJICoJbGluZ2VyMglvcHRpb24uCQkJCQktLUFOSworCSAqLworCisJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfRklOX1dBSVQyKSB7CisJCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCQlpZiAodHAtPmxpbmdlcjIgPCAwKSB7CisJCQl0Y3Bfc2V0X3N0YXRlKHNrLCBUQ1BfQ0xPU0UpOworCQkJdGNwX3NlbmRfYWN0aXZlX3Jlc2V0KHNrLCBHRlBfQVRPTUlDKTsKKwkJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUEFCT1JUT05MSU5HRVIpOworCQl9IGVsc2UgeworCQkJaW50IHRtbyA9IHRjcF9maW5fdGltZSh0cCk7CisKKwkJCWlmICh0bW8gPiBUQ1BfVElNRVdBSVRfTEVOKSB7CisJCQkJdGNwX3Jlc2V0X2tlZXBhbGl2ZV90aW1lcihzaywgdGNwX2Zpbl90aW1lKHRwKSk7CisJCQl9IGVsc2UgeworCQkJCWF0b21pY19pbmMoJnRjcF9vcnBoYW5fY291bnQpOworCQkJCXRjcF90aW1lX3dhaXQoc2ssIFRDUF9GSU5fV0FJVDIsIHRtbyk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwl9CisJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfQ0xPU0UpIHsKKwkJc2tfc3RyZWFtX21lbV9yZWNsYWltKHNrKTsKKwkJaWYgKGF0b21pY19yZWFkKCZ0Y3Bfb3JwaGFuX2NvdW50KSA+IHN5c2N0bF90Y3BfbWF4X29ycGhhbnMgfHwKKwkJICAgIChzay0+c2tfd21lbV9xdWV1ZWQgPiBTT0NLX01JTl9TTkRCVUYgJiYKKwkJICAgICBhdG9taWNfcmVhZCgmdGNwX21lbW9yeV9hbGxvY2F0ZWQpID4gc3lzY3RsX3RjcF9tZW1bMl0pKSB7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCXByaW50ayhLRVJOX0lORk8gIlRDUDogdG9vIG1hbnkgb2Ygb3JwaGFuZWQgIgorCQkJCSAgICAgICAic29ja2V0c1xuIik7CisJCQl0Y3Bfc2V0X3N0YXRlKHNrLCBUQ1BfQ0xPU0UpOworCQkJdGNwX3NlbmRfYWN0aXZlX3Jlc2V0KHNrLCBHRlBfQVRPTUlDKTsKKwkJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUEFCT1JUT05NRU1PUlkpOworCQl9CisJfQorCWF0b21pY19pbmMoJnRjcF9vcnBoYW5fY291bnQpOworCisJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfQ0xPU0UpCisJCXRjcF9kZXN0cm95X3NvY2soc2spOworCS8qIE90aGVyd2lzZSwgc29ja2V0IGlzIHJlcHJpZXZlZCB1bnRpbCBwcm90b2NvbCBjbG9zZS4gKi8KKworb3V0OgorCWJoX3VubG9ja19zb2NrKHNrKTsKKwlsb2NhbF9iaF9lbmFibGUoKTsKKwlzb2NrX3B1dChzayk7Cit9CisKKy8qIFRoZXNlIHN0YXRlcyBuZWVkIFJTVCBvbiBBQk9SVCBhY2NvcmRpbmcgdG8gUkZDNzkzICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHRjcF9uZWVkX3Jlc2V0KGludCBzdGF0ZSkKK3sKKwlyZXR1cm4gKDEgPDwgc3RhdGUpICYKKwkgICAgICAgKFRDUEZfRVNUQUJMSVNIRUQgfCBUQ1BGX0NMT1NFX1dBSVQgfCBUQ1BGX0ZJTl9XQUlUMSB8CisJCVRDUEZfRklOX1dBSVQyIHwgVENQRl9TWU5fUkVDVik7Cit9CisKK2ludCB0Y3BfZGlzY29ubmVjdChzdHJ1Y3Qgc29jayAqc2ssIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJaW50IGVyciA9IDA7CisJaW50IG9sZF9zdGF0ZSA9IHNrLT5za19zdGF0ZTsKKworCWlmIChvbGRfc3RhdGUgIT0gVENQX0NMT1NFKQorCQl0Y3Bfc2V0X3N0YXRlKHNrLCBUQ1BfQ0xPU0UpOworCisJLyogQUJPUlQgZnVuY3Rpb24gb2YgUkZDNzkzICovCisJaWYgKG9sZF9zdGF0ZSA9PSBUQ1BfTElTVEVOKSB7CisJCXRjcF9saXN0ZW5fc3RvcChzayk7CisJfSBlbHNlIGlmICh0Y3BfbmVlZF9yZXNldChvbGRfc3RhdGUpIHx8CisJCSAgICh0cC0+c25kX254dCAhPSB0cC0+d3JpdGVfc2VxICYmCisJCSAgICAoMSA8PCBvbGRfc3RhdGUpICYgKFRDUEZfQ0xPU0lORyB8IFRDUEZfTEFTVF9BQ0spKSkgeworCQkvKiBUaGUgbGFzdCBjaGVjayBhZGp1c3RzIGZvciBkaXNjcmVwYW5jZSBvZiBMaW51eCB3cnQuIFJGQworCQkgKiBzdGF0ZXMKKwkJICovCisJCXRjcF9zZW5kX2FjdGl2ZV9yZXNldChzaywgZ2ZwX2FueSgpKTsKKwkJc2stPnNrX2VyciA9IEVDT05OUkVTRVQ7CisJfSBlbHNlIGlmIChvbGRfc3RhdGUgPT0gVENQX1NZTl9TRU5UKQorCQlzay0+c2tfZXJyID0gRUNPTk5SRVNFVDsKKworCXRjcF9jbGVhcl94bWl0X3RpbWVycyhzayk7CisJX19za2JfcXVldWVfcHVyZ2UoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwlza19zdHJlYW1fd3JpdGVxdWV1ZV9wdXJnZShzayk7CisJX19za2JfcXVldWVfcHVyZ2UoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOworCisJaW5ldC0+ZHBvcnQgPSAwOworCisJaWYgKCEoc2stPnNrX3VzZXJsb2NrcyAmIFNPQ0tfQklOREFERFJfTE9DSykpCisJCWluZXRfcmVzZXRfc2FkZHIoc2spOworCisJc2stPnNrX3NodXRkb3duID0gMDsKKwlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfRE9ORSk7CisJdHAtPnNydHQgPSAwOworCWlmICgodHAtPndyaXRlX3NlcSArPSB0cC0+bWF4X3dpbmRvdyArIDIpID09IDApCisJCXRwLT53cml0ZV9zZXEgPSAxOworCXRwLT5iYWNrb2ZmID0gMDsKKwl0cC0+c25kX2N3bmQgPSAyOworCXRwLT5wcm9iZXNfb3V0ID0gMDsKKwl0cC0+cGFja2V0c19vdXQgPSAwOworCXRwLT5zbmRfc3N0aHJlc2ggPSAweDdmZmZmZmZmOworCXRwLT5zbmRfY3duZF9jbnQgPSAwOworCXRjcF9zZXRfY2Ffc3RhdGUodHAsIFRDUF9DQV9PcGVuKTsKKwl0Y3BfY2xlYXJfcmV0cmFucyh0cCk7CisJdGNwX2RlbGFja19pbml0KHRwKTsKKwlzay0+c2tfc2VuZF9oZWFkID0gTlVMTDsKKwl0cC0+cnhfb3B0LnNhd190c3RhbXAgPSAwOworCXRjcF9zYWNrX3Jlc2V0KCZ0cC0+cnhfb3B0KTsKKwlfX3NrX2RzdF9yZXNldChzayk7CisKKwlCVUdfVFJBUCghaW5ldC0+bnVtIHx8IHRwLT5iaW5kX2hhc2gpOworCisJc2stPnNrX2Vycm9yX3JlcG9ydChzayk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqCVdhaXQgZm9yIGFuIGluY29taW5nIGNvbm5lY3Rpb24sIGF2b2lkIHJhY2UKKyAqCWNvbmRpdGlvbnMuIFRoaXMgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgc29ja2V0IGxvY2tlZC4KKyAqLworc3RhdGljIGludCB3YWl0X2Zvcl9jb25uZWN0KHN0cnVjdCBzb2NrICpzaywgbG9uZyB0aW1lbykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlERUZJTkVfV0FJVCh3YWl0KTsKKwlpbnQgZXJyOworCisJLyoKKwkgKiBUcnVlIHdha2Utb25lIG1lY2hhbmlzbSBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnM6IG9ubHkKKwkgKiBvbmUgcHJvY2VzcyBnZXRzIHdva2VuIHVwLCBub3QgdGhlICd3aG9sZSBoZXJkJy4KKwkgKiBTaW5jZSB3ZSBkbyBub3QgJ3JhY2UgJiBwb2xsJyBmb3IgZXN0YWJsaXNoZWQgc29ja2V0cworCSAqIGFueW1vcmUsIHRoZSBjb21tb24gY2FzZSB3aWxsIGV4ZWN1dGUgdGhlIGxvb3Agb25seSBvbmNlLgorCSAqCisJICogU3VidGxlIGlzc3VlOiAiYWRkX3dhaXRfcXVldWVfZXhjbHVzaXZlKCkiIHdpbGwgYmUgYWRkZWQKKwkgKiBhZnRlciBhbnkgY3VycmVudCBub24tZXhjbHVzaXZlIHdhaXRlcnMsIGFuZCB3ZSBrbm93IHRoYXQKKwkgKiBpdCB3aWxsIGFsd2F5cyBfc3RheV8gYWZ0ZXIgYW55IG5ldyBub24tZXhjbHVzaXZlIHdhaXRlcnMKKwkgKiBiZWNhdXNlIGFsbCBub24tZXhjbHVzaXZlIHdhaXRlcnMgYXJlIGFkZGVkIGF0IHRoZQorCSAqIGJlZ2lubmluZyBvZiB0aGUgd2FpdC1xdWV1ZS4gQXMgc3VjaCwgaXQncyBvayB0byAiZHJvcCIKKwkgKiBvdXIgZXhjbHVzaXZlbmVzcyB0ZW1wb3JhcmlseSB3aGVuIHdlIGdldCB3b2tlbiB1cCB3aXRob3V0CisJICogaGF2aW5nIHRvIHJlbW92ZSBhbmQgcmUtaW5zZXJ0IHVzIG9uIHRoZSB3YWl0IHF1ZXVlLgorCSAqLworCWZvciAoOzspIHsKKwkJcHJlcGFyZV90b193YWl0X2V4Y2x1c2l2ZShzay0+c2tfc2xlZXAsICZ3YWl0LAorCQkJCQkgIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCWlmICghdHAtPmFjY2VwdF9xdWV1ZSkKKwkJCXRpbWVvID0gc2NoZWR1bGVfdGltZW91dCh0aW1lbyk7CisJCWxvY2tfc29jayhzayk7CisJCWVyciA9IDA7CisJCWlmICh0cC0+YWNjZXB0X3F1ZXVlKQorCQkJYnJlYWs7CisJCWVyciA9IC1FSU5WQUw7CisJCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0xJU1RFTikKKwkJCWJyZWFrOworCQllcnIgPSBzb2NrX2ludHJfZXJybm8odGltZW8pOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJZXJyID0gLUVBR0FJTjsKKwkJaWYgKCF0aW1lbykKKwkJCWJyZWFrOworCX0KKwlmaW5pc2hfd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJVGhpcyB3aWxsIGFjY2VwdCB0aGUgbmV4dCBvdXRzdGFuZGluZyBjb25uZWN0aW9uLgorICovCisKK3N0cnVjdCBzb2NrICp0Y3BfYWNjZXB0KHN0cnVjdCBzb2NrICpzaywgaW50IGZsYWdzLCBpbnQgKmVycikKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3Qgb3Blbl9yZXF1ZXN0ICpyZXE7CisJc3RydWN0IHNvY2sgKm5ld3NrOworCWludCBlcnJvcjsKKworCWxvY2tfc29jayhzayk7CisKKwkvKiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgc29ja2V0IGlzIGxpc3RlbmluZywKKwkgKiBhbmQgdGhhdCBpdCBoYXMgc29tZXRoaW5nIHBlbmRpbmcuCisJICovCisJZXJyb3IgPSAtRUlOVkFMOworCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0xJU1RFTikKKwkJZ290byBvdXQ7CisKKwkvKiBGaW5kIGFscmVhZHkgZXN0YWJsaXNoZWQgY29ubmVjdGlvbiAqLworCWlmICghdHAtPmFjY2VwdF9xdWV1ZSkgeworCQlsb25nIHRpbWVvID0gc29ja19yY3Z0aW1lbyhzaywgZmxhZ3MgJiBPX05PTkJMT0NLKTsKKworCQkvKiBJZiB0aGlzIGlzIGEgbm9uIGJsb2NraW5nIHNvY2tldCBkb24ndCBzbGVlcCAqLworCQllcnJvciA9IC1FQUdBSU47CisJCWlmICghdGltZW8pCisJCQlnb3RvIG91dDsKKworCQllcnJvciA9IHdhaXRfZm9yX2Nvbm5lY3Qoc2ssIHRpbWVvKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJfQorCisJcmVxID0gdHAtPmFjY2VwdF9xdWV1ZTsKKwlpZiAoKHRwLT5hY2NlcHRfcXVldWUgPSByZXEtPmRsX25leHQpID09IE5VTEwpCisJCXRwLT5hY2NlcHRfcXVldWVfdGFpbCA9IE5VTEw7CisKKyAJbmV3c2sgPSByZXEtPnNrOworCXNrX2FjY2VwdHFfcmVtb3ZlZChzayk7CisJdGNwX29wZW5yZXFfZmFzdGZyZWUocmVxKTsKKwlCVUdfVFJBUChuZXdzay0+c2tfc3RhdGUgIT0gVENQX1NZTl9SRUNWKTsKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBuZXdzazsKKworb3V0OgorCXJlbGVhc2Vfc29jayhzayk7CisJKmVyciA9IGVycm9yOworCXJldHVybiBOVUxMOworfQorCisvKgorICoJU29ja2V0IG9wdGlvbiBjb2RlIGZvciBUQ1AuCisgKi8KK2ludCB0Y3Bfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsCisJCSAgIGludCBvcHRsZW4pCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJaW50IHZhbDsKKwlpbnQgZXJyID0gMDsKKworCWlmIChsZXZlbCAhPSBTT0xfVENQKQorCQlyZXR1cm4gdHAtPmFmX3NwZWNpZmljLT5zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwKKwkJCQkJCSAgIG9wdHZhbCwgb3B0bGVuKTsKKworCWlmIChvcHRsZW4gPCBzaXplb2YoaW50KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKW9wdHZhbCkpCisJCXJldHVybiAtRUZBVUxUOworCisJbG9ja19zb2NrKHNrKTsKKworCXN3aXRjaCAob3B0bmFtZSkgeworCWNhc2UgVENQX01BWFNFRzoKKwkJLyogVmFsdWVzIGdyZWF0ZXIgdGhhbiBpbnRlcmZhY2UgTVRVIHdvbid0IHRha2UgZWZmZWN0LiBIb3dldmVyCisJCSAqIGF0IHRoZSBwb2ludCB3aGVuIHRoaXMgY2FsbCBpcyBkb25lIHdlIHR5cGljYWxseSBkb24ndCB5ZXQKKwkJICoga25vdyB3aGljaCBpbnRlcmZhY2UgaXMgZ29pbmcgdG8gYmUgdXNlZCAqLworCQlpZiAodmFsIDwgOCB8fCB2YWwgPiBNQVhfVENQX1dJTkRPVykgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCXRwLT5yeF9vcHQudXNlcl9tc3MgPSB2YWw7CisJCWJyZWFrOworCisJY2FzZSBUQ1BfTk9ERUxBWToKKwkJaWYgKHZhbCkgeworCQkJLyogVENQX05PREVMQVkgaXMgd2Vha2VyIHRoYW4gVENQX0NPUkssIHNvIHRoYXQKKwkJCSAqIHRoaXMgb3B0aW9uIG9uIGNvcmtlZCBzb2NrZXQgaXMgcmVtZW1iZXJlZCwgYnV0CisJCQkgKiBpdCBpcyBub3QgYWN0aXZhdGVkIHVudGlsIGNvcmsgaXMgY2xlYXJlZC4KKwkJCSAqCisJCQkgKiBIb3dldmVyLCB3aGVuIFRDUF9OT0RFTEFZIGlzIHNldCB3ZSBtYWtlCisJCQkgKiBhbiBleHBsaWNpdCBwdXNoLCB3aGljaCBvdmVycmlkZXMgZXZlbiBUQ1BfQ09SSworCQkJICogZm9yIGN1cnJlbnRseSBxdWV1ZWQgc2VnbWVudHMuCisJCQkgKi8KKwkJCXRwLT5ub25hZ2xlIHw9IFRDUF9OQUdMRV9PRkZ8VENQX05BR0xFX1BVU0g7CisJCQl0Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzaywgdHApOworCQl9IGVsc2UgeworCQkJdHAtPm5vbmFnbGUgJj0gflRDUF9OQUdMRV9PRkY7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFRDUF9DT1JLOgorCQkvKiBXaGVuIHNldCBpbmRpY2F0ZXMgdG8gYWx3YXlzIHF1ZXVlIG5vbi1mdWxsIGZyYW1lcy4KKwkJICogTGF0ZXIgdGhlIHVzZXIgY2xlYXJzIHRoaXMgb3B0aW9uIGFuZCB3ZSB0cmFuc21pdAorCQkgKiBhbnkgcGVuZGluZyBwYXJ0aWFsIGZyYW1lcyBpbiB0aGUgcXVldWUuICBUaGlzIGlzCisJCSAqIG1lYW50IHRvIGJlIHVzZWQgYWxvbmdzaWRlIHNlbmRmaWxlKCkgdG8gZ2V0IHByb3Blcmx5CisJCSAqIGZpbGxlZCBmcmFtZXMgd2hlbiB0aGUgdXNlciAoZm9yIGV4YW1wbGUpIG11c3Qgd3JpdGUKKwkJICogb3V0IGhlYWRlcnMgd2l0aCBhIHdyaXRlKCkgY2FsbCBmaXJzdCBhbmQgdGhlbiB1c2UKKwkJICogc2VuZGZpbGUgdG8gc2VuZCBvdXQgdGhlIGRhdGEgcGFydHMuCisJCSAqCisJCSAqIFRDUF9DT1JLIGNhbiBiZSBzZXQgdG9nZXRoZXIgd2l0aCBUQ1BfTk9ERUxBWSBhbmQgaXQgaXMKKwkJICogc3Ryb25nZXIgdGhhbiBUQ1BfTk9ERUxBWS4KKwkJICovCisJCWlmICh2YWwpIHsKKwkJCXRwLT5ub25hZ2xlIHw9IFRDUF9OQUdMRV9DT1JLOworCQl9IGVsc2UgeworCQkJdHAtPm5vbmFnbGUgJj0gflRDUF9OQUdMRV9DT1JLOworCQkJaWYgKHRwLT5ub25hZ2xlJlRDUF9OQUdMRV9PRkYpCisJCQkJdHAtPm5vbmFnbGUgfD0gVENQX05BR0xFX1BVU0g7CisJCQl0Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzaywgdHApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBUQ1BfS0VFUElETEU6CisJCWlmICh2YWwgPCAxIHx8IHZhbCA+IE1BWF9UQ1BfS0VFUElETEUpCisJCQllcnIgPSAtRUlOVkFMOworCQllbHNlIHsKKwkJCXRwLT5rZWVwYWxpdmVfdGltZSA9IHZhbCAqIEhaOworCQkJaWYgKHNvY2tfZmxhZyhzaywgU09DS19LRUVQT1BFTikgJiYKKwkJCSAgICAhKCgxIDw8IHNrLT5za19zdGF0ZSkgJgorCQkJICAgICAgKFRDUEZfQ0xPU0UgfCBUQ1BGX0xJU1RFTikpKSB7CisJCQkJX191MzIgZWxhcHNlZCA9IHRjcF90aW1lX3N0YW1wIC0gdHAtPnJjdl90c3RhbXA7CisJCQkJaWYgKHRwLT5rZWVwYWxpdmVfdGltZSA+IGVsYXBzZWQpCisJCQkJCWVsYXBzZWQgPSB0cC0+a2VlcGFsaXZlX3RpbWUgLSBlbGFwc2VkOworCQkJCWVsc2UKKwkJCQkJZWxhcHNlZCA9IDA7CisJCQkJdGNwX3Jlc2V0X2tlZXBhbGl2ZV90aW1lcihzaywgZWxhcHNlZCk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUQ1BfS0VFUElOVFZMOgorCQlpZiAodmFsIDwgMSB8fCB2YWwgPiBNQVhfVENQX0tFRVBJTlRWTCkKKwkJCWVyciA9IC1FSU5WQUw7CisJCWVsc2UKKwkJCXRwLT5rZWVwYWxpdmVfaW50dmwgPSB2YWwgKiBIWjsKKwkJYnJlYWs7CisJY2FzZSBUQ1BfS0VFUENOVDoKKwkJaWYgKHZhbCA8IDEgfHwgdmFsID4gTUFYX1RDUF9LRUVQQ05UKQorCQkJZXJyID0gLUVJTlZBTDsKKwkJZWxzZQorCQkJdHAtPmtlZXBhbGl2ZV9wcm9iZXMgPSB2YWw7CisJCWJyZWFrOworCWNhc2UgVENQX1NZTkNOVDoKKwkJaWYgKHZhbCA8IDEgfHwgdmFsID4gTUFYX1RDUF9TWU5DTlQpCisJCQllcnIgPSAtRUlOVkFMOworCQllbHNlCisJCQl0cC0+c3luX3JldHJpZXMgPSB2YWw7CisJCWJyZWFrOworCisJY2FzZSBUQ1BfTElOR0VSMjoKKwkJaWYgKHZhbCA8IDApCisJCQl0cC0+bGluZ2VyMiA9IC0xOworCQllbHNlIGlmICh2YWwgPiBzeXNjdGxfdGNwX2Zpbl90aW1lb3V0IC8gSFopCisJCQl0cC0+bGluZ2VyMiA9IDA7CisJCWVsc2UKKwkJCXRwLT5saW5nZXIyID0gdmFsICogSFo7CisJCWJyZWFrOworCisJY2FzZSBUQ1BfREVGRVJfQUNDRVBUOgorCQl0cC0+ZGVmZXJfYWNjZXB0ID0gMDsKKwkJaWYgKHZhbCA+IDApIHsKKwkJCS8qIFRyYW5zbGF0ZSB2YWx1ZSBpbiBzZWNvbmRzIHRvIG51bWJlciBvZgorCQkJICogcmV0cmFuc21pdHMgKi8KKwkJCXdoaWxlICh0cC0+ZGVmZXJfYWNjZXB0IDwgMzIgJiYKKwkJCSAgICAgICB2YWwgPiAoKFRDUF9USU1FT1VUX0lOSVQgLyBIWikgPDwKKwkJCQkgICAgICAgdHAtPmRlZmVyX2FjY2VwdCkpCisJCQkJdHAtPmRlZmVyX2FjY2VwdCsrOworCQkJdHAtPmRlZmVyX2FjY2VwdCsrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBUQ1BfV0lORE9XX0NMQU1QOgorCQlpZiAoIXZhbCkgeworCQkJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfQ0xPU0UpIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJdHAtPndpbmRvd19jbGFtcCA9IDA7CisJCX0gZWxzZQorCQkJdHAtPndpbmRvd19jbGFtcCA9IHZhbCA8IFNPQ0tfTUlOX1JDVkJVRiAvIDIgPworCQkJCQkJU09DS19NSU5fUkNWQlVGIC8gMiA6IHZhbDsKKwkJYnJlYWs7CisKKwljYXNlIFRDUF9RVUlDS0FDSzoKKwkJaWYgKCF2YWwpIHsKKwkJCXRwLT5hY2sucGluZ3BvbmcgPSAxOworCQl9IGVsc2UgeworCQkJdHAtPmFjay5waW5ncG9uZyA9IDA7CisJCQlpZiAoKDEgPDwgc2stPnNrX3N0YXRlKSAmCisJCQkgICAgKFRDUEZfRVNUQUJMSVNIRUQgfCBUQ1BGX0NMT1NFX1dBSVQpICYmCisJCQkgICAgdGNwX2Fja19zY2hlZHVsZWQodHApKSB7CisJCQkJdHAtPmFjay5wZW5kaW5nIHw9IFRDUF9BQ0tfUFVTSEVEOworCQkJCWNsZWFudXBfcmJ1ZihzaywgMSk7CisJCQkJaWYgKCEodmFsICYgMSkpCisJCQkJCXRwLT5hY2sucGluZ3BvbmcgPSAxOworCQkJfQorCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT1BST1RPT1BUOworCQlicmVhazsKKwl9OworCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycjsKK30KKworLyogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHN0YXRlIG9mIHRjcCBlbmRwb2ludCBpbiBBUEkgZm9ybWF0LiAqLwordm9pZCB0Y3BfZ2V0X2luZm8oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX2luZm8gKmluZm8pCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJdTMyIG5vdyA9IHRjcF90aW1lX3N0YW1wOworCisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCisJaW5mby0+dGNwaV9zdGF0ZSA9IHNrLT5za19zdGF0ZTsKKwlpbmZvLT50Y3BpX2NhX3N0YXRlID0gdHAtPmNhX3N0YXRlOworCWluZm8tPnRjcGlfcmV0cmFuc21pdHMgPSB0cC0+cmV0cmFuc21pdHM7CisJaW5mby0+dGNwaV9wcm9iZXMgPSB0cC0+cHJvYmVzX291dDsKKwlpbmZvLT50Y3BpX2JhY2tvZmYgPSB0cC0+YmFja29mZjsKKworCWlmICh0cC0+cnhfb3B0LnRzdGFtcF9vaykKKwkJaW5mby0+dGNwaV9vcHRpb25zIHw9IFRDUElfT1BUX1RJTUVTVEFNUFM7CisJaWYgKHRwLT5yeF9vcHQuc2Fja19vaykKKwkJaW5mby0+dGNwaV9vcHRpb25zIHw9IFRDUElfT1BUX1NBQ0s7CisJaWYgKHRwLT5yeF9vcHQud3NjYWxlX29rKSB7CisJCWluZm8tPnRjcGlfb3B0aW9ucyB8PSBUQ1BJX09QVF9XU0NBTEU7CisJCWluZm8tPnRjcGlfc25kX3dzY2FsZSA9IHRwLT5yeF9vcHQuc25kX3dzY2FsZTsKKwkJaW5mby0+dGNwaV9yY3Zfd3NjYWxlID0gdHAtPnJ4X29wdC5yY3Zfd3NjYWxlOworCX0gCisKKwlpZiAodHAtPmVjbl9mbGFncyZUQ1BfRUNOX09LKQorCQlpbmZvLT50Y3BpX29wdGlvbnMgfD0gVENQSV9PUFRfRUNOOworCisJaW5mby0+dGNwaV9ydG8gPSBqaWZmaWVzX3RvX3VzZWNzKHRwLT5ydG8pOworCWluZm8tPnRjcGlfYXRvID0gamlmZmllc190b191c2Vjcyh0cC0+YWNrLmF0byk7CisJaW5mby0+dGNwaV9zbmRfbXNzID0gdHAtPm1zc19jYWNoZV9zdGQ7CisJaW5mby0+dGNwaV9yY3ZfbXNzID0gdHAtPmFjay5yY3ZfbXNzOworCisJaW5mby0+dGNwaV91bmFja2VkID0gdHAtPnBhY2tldHNfb3V0OworCWluZm8tPnRjcGlfc2Fja2VkID0gdHAtPnNhY2tlZF9vdXQ7CisJaW5mby0+dGNwaV9sb3N0ID0gdHAtPmxvc3Rfb3V0OworCWluZm8tPnRjcGlfcmV0cmFucyA9IHRwLT5yZXRyYW5zX291dDsKKwlpbmZvLT50Y3BpX2ZhY2tldHMgPSB0cC0+ZmFja2V0c19vdXQ7CisKKwlpbmZvLT50Y3BpX2xhc3RfZGF0YV9zZW50ID0gamlmZmllc190b19tc2Vjcyhub3cgLSB0cC0+bHNuZHRpbWUpOworCWluZm8tPnRjcGlfbGFzdF9kYXRhX3JlY3YgPSBqaWZmaWVzX3RvX21zZWNzKG5vdyAtIHRwLT5hY2subHJjdnRpbWUpOworCWluZm8tPnRjcGlfbGFzdF9hY2tfcmVjdiA9IGppZmZpZXNfdG9fbXNlY3Mobm93IC0gdHAtPnJjdl90c3RhbXApOworCisJaW5mby0+dGNwaV9wbXR1ID0gdHAtPnBtdHVfY29va2llOworCWluZm8tPnRjcGlfcmN2X3NzdGhyZXNoID0gdHAtPnJjdl9zc3RocmVzaDsKKwlpbmZvLT50Y3BpX3J0dCA9IGppZmZpZXNfdG9fdXNlY3ModHAtPnNydHQpPj4zOworCWluZm8tPnRjcGlfcnR0dmFyID0gamlmZmllc190b191c2Vjcyh0cC0+bWRldik+PjI7CisJaW5mby0+dGNwaV9zbmRfc3N0aHJlc2ggPSB0cC0+c25kX3NzdGhyZXNoOworCWluZm8tPnRjcGlfc25kX2N3bmQgPSB0cC0+c25kX2N3bmQ7CisJaW5mby0+dGNwaV9hZHZtc3MgPSB0cC0+YWR2bXNzOworCWluZm8tPnRjcGlfcmVvcmRlcmluZyA9IHRwLT5yZW9yZGVyaW5nOworCisJaW5mby0+dGNwaV9yY3ZfcnR0ID0gamlmZmllc190b191c2Vjcyh0cC0+cmN2X3J0dF9lc3QucnR0KT4+MzsKKwlpbmZvLT50Y3BpX3Jjdl9zcGFjZSA9IHRwLT5yY3ZxX3NwYWNlLnNwYWNlOworCisJaW5mby0+dGNwaV90b3RhbF9yZXRyYW5zID0gdHAtPnRvdGFsX3JldHJhbnM7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHRjcF9nZXRfaW5mbyk7CisKK2ludCB0Y3BfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsCisJCSAgIGludCBfX3VzZXIgKm9wdGxlbikKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlpbnQgdmFsLCBsZW47CisKKwlpZiAobGV2ZWwgIT0gU09MX1RDUCkKKwkJcmV0dXJuIHRwLT5hZl9zcGVjaWZpYy0+Z2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsCisJCQkJCQkgICBvcHR2YWwsIG9wdGxlbik7CisKKwlpZiAoZ2V0X3VzZXIobGVuLCBvcHRsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLCBzaXplb2YoaW50KSk7CisKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKG9wdG5hbWUpIHsKKwljYXNlIFRDUF9NQVhTRUc6CisJCXZhbCA9IHRwLT5tc3NfY2FjaGVfc3RkOworCQlpZiAoIXZhbCAmJiAoKDEgPDwgc2stPnNrX3N0YXRlKSAmIChUQ1BGX0NMT1NFIHwgVENQRl9MSVNURU4pKSkKKwkJCXZhbCA9IHRwLT5yeF9vcHQudXNlcl9tc3M7CisJCWJyZWFrOworCWNhc2UgVENQX05PREVMQVk6CisJCXZhbCA9ICEhKHRwLT5ub25hZ2xlJlRDUF9OQUdMRV9PRkYpOworCQlicmVhazsKKwljYXNlIFRDUF9DT1JLOgorCQl2YWwgPSAhISh0cC0+bm9uYWdsZSZUQ1BfTkFHTEVfQ09SSyk7CisJCWJyZWFrOworCWNhc2UgVENQX0tFRVBJRExFOgorCQl2YWwgPSAodHAtPmtlZXBhbGl2ZV90aW1lID8gOiBzeXNjdGxfdGNwX2tlZXBhbGl2ZV90aW1lKSAvIEhaOworCQlicmVhazsKKwljYXNlIFRDUF9LRUVQSU5UVkw6CisJCXZhbCA9ICh0cC0+a2VlcGFsaXZlX2ludHZsID8gOiBzeXNjdGxfdGNwX2tlZXBhbGl2ZV9pbnR2bCkgLyBIWjsKKwkJYnJlYWs7CisJY2FzZSBUQ1BfS0VFUENOVDoKKwkJdmFsID0gdHAtPmtlZXBhbGl2ZV9wcm9iZXMgPyA6IHN5c2N0bF90Y3Bfa2VlcGFsaXZlX3Byb2JlczsKKwkJYnJlYWs7CisJY2FzZSBUQ1BfU1lOQ05UOgorCQl2YWwgPSB0cC0+c3luX3JldHJpZXMgPyA6IHN5c2N0bF90Y3Bfc3luX3JldHJpZXM7CisJCWJyZWFrOworCWNhc2UgVENQX0xJTkdFUjI6CisJCXZhbCA9IHRwLT5saW5nZXIyOworCQlpZiAodmFsID49IDApCisJCQl2YWwgPSAodmFsID8gOiBzeXNjdGxfdGNwX2Zpbl90aW1lb3V0KSAvIEhaOworCQlicmVhazsKKwljYXNlIFRDUF9ERUZFUl9BQ0NFUFQ6CisJCXZhbCA9ICF0cC0+ZGVmZXJfYWNjZXB0ID8gMCA6ICgoVENQX1RJTUVPVVRfSU5JVCAvIEhaKSA8PAorCQkJCQkgICAgICAgKHRwLT5kZWZlcl9hY2NlcHQgLSAxKSk7CisJCWJyZWFrOworCWNhc2UgVENQX1dJTkRPV19DTEFNUDoKKwkJdmFsID0gdHAtPndpbmRvd19jbGFtcDsKKwkJYnJlYWs7CisJY2FzZSBUQ1BfSU5GTzogeworCQlzdHJ1Y3QgdGNwX2luZm8gaW5mbzsKKworCQlpZiAoZ2V0X3VzZXIobGVuLCBvcHRsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJdGNwX2dldF9pbmZvKHNrLCAmaW5mbyk7CisKKwkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sIHNpemVvZihpbmZvKSk7CisJCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsICZpbmZvLCBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKwljYXNlIFRDUF9RVUlDS0FDSzoKKwkJdmFsID0gIXRwLT5hY2sucGluZ3Bvbmc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisJfTsKKworCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAmdmFsLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworCitleHRlcm4gdm9pZCBfX3NrYl9jYl90b29fc21hbGxfZm9yX3RjcChpbnQsIGludCk7CitleHRlcm4gdm9pZCB0Y3BkaWFnX2luaXQodm9pZCk7CisKK3N0YXRpYyBfX2luaXRkYXRhIHVuc2lnbmVkIGxvbmcgdGhhc2hfZW50cmllczsKK3N0YXRpYyBpbnQgX19pbml0IHNldF90aGFzaF9lbnRyaWVzKGNoYXIgKnN0cikKK3sKKwlpZiAoIXN0cikKKwkJcmV0dXJuIDA7CisJdGhhc2hfZW50cmllcyA9IHNpbXBsZV9zdHJ0b3VsKHN0ciwgJnN0ciwgMCk7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJ0aGFzaF9lbnRyaWVzPSIsIHNldF90aGFzaF9lbnRyaWVzKTsKKwordm9pZCBfX2luaXQgdGNwX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlpbnQgb3JkZXIsIGk7CisKKwlpZiAoc2l6ZW9mKHN0cnVjdCB0Y3Bfc2tiX2NiKSA+IHNpemVvZihza2ItPmNiKSkKKwkJX19za2JfY2JfdG9vX3NtYWxsX2Zvcl90Y3Aoc2l6ZW9mKHN0cnVjdCB0Y3Bfc2tiX2NiKSwKKwkJCQkJICAgc2l6ZW9mKHNrYi0+Y2IpKTsKKworCXRjcF9vcGVucmVxX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJ0Y3Bfb3Blbl9yZXF1ZXN0IiwKKwkJCQkJCSAgIHNpemVvZihzdHJ1Y3Qgb3Blbl9yZXF1ZXN0KSwKKwkJCQkJICAgICAgIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwKKwkJCQkJICAgICAgIE5VTEwsIE5VTEwpOworCWlmICghdGNwX29wZW5yZXFfY2FjaGVwKQorCQlwYW5pYygidGNwX2luaXQ6IENhbm5vdCBhbGxvYyBvcGVuX3JlcXVlc3QgY2FjaGUuIik7CisKKwl0Y3BfYnVja2V0X2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJ0Y3BfYmluZF9idWNrZXQiLAorCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHRjcF9iaW5kX2J1Y2tldCksCisJCQkJCSAgICAgIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwKKwkJCQkJICAgICAgTlVMTCwgTlVMTCk7CisJaWYgKCF0Y3BfYnVja2V0X2NhY2hlcCkKKwkJcGFuaWMoInRjcF9pbml0OiBDYW5ub3QgYWxsb2MgdGNwX2JpbmRfYnVja2V0IGNhY2hlLiIpOworCisJdGNwX3RpbWV3YWl0X2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJ0Y3BfdHdfYnVja2V0IiwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgdGNwX3R3X2J1Y2tldCksCisJCQkJCQkwLCBTTEFCX0hXQ0FDSEVfQUxJR04sCisJCQkJCQlOVUxMLCBOVUxMKTsKKwlpZiAoIXRjcF90aW1ld2FpdF9jYWNoZXApCisJCXBhbmljKCJ0Y3BfaW5pdDogQ2Fubm90IGFsbG9jIHRjcF90d19idWNrZXQgY2FjaGUuIik7CisKKwkvKiBTaXplIGFuZCBhbGxvY2F0ZSB0aGUgbWFpbiBlc3RhYmxpc2hlZCBhbmQgYmluZCBidWNrZXQKKwkgKiBoYXNoIHRhYmxlcy4KKwkgKgorCSAqIFRoZSBtZXRob2RvbG9neSBpcyBzaW1pbGFyIHRvIHRoYXQgb2YgdGhlIGJ1ZmZlciBjYWNoZS4KKwkgKi8KKwl0Y3BfZWhhc2ggPSAoc3RydWN0IHRjcF9laGFzaF9idWNrZXQgKikKKwkJYWxsb2NfbGFyZ2Vfc3lzdGVtX2hhc2goIlRDUCBlc3RhYmxpc2hlZCIsCisJCQkJCXNpemVvZihzdHJ1Y3QgdGNwX2VoYXNoX2J1Y2tldCksCisJCQkJCXRoYXNoX2VudHJpZXMsCisJCQkJCShudW1fcGh5c3BhZ2VzID49IDEyOCAqIDEwMjQpID8KKwkJCQkJCSgyNSAtIFBBR0VfU0hJRlQpIDoKKwkJCQkJCSgyNyAtIFBBR0VfU0hJRlQpLAorCQkJCQlIQVNIX0hJR0hNRU0sCisJCQkJCSZ0Y3BfZWhhc2hfc2l6ZSwKKwkJCQkJTlVMTCwKKwkJCQkJMCk7CisJdGNwX2VoYXNoX3NpemUgPSAoMSA8PCB0Y3BfZWhhc2hfc2l6ZSkgPj4gMTsKKwlmb3IgKGkgPSAwOyBpIDwgKHRjcF9laGFzaF9zaXplIDw8IDEpOyBpKyspIHsKKwkJcndsb2NrX2luaXQoJnRjcF9laGFzaFtpXS5sb2NrKTsKKwkJSU5JVF9ITElTVF9IRUFEKCZ0Y3BfZWhhc2hbaV0uY2hhaW4pOworCX0KKworCXRjcF9iaGFzaCA9IChzdHJ1Y3QgdGNwX2JpbmRfaGFzaGJ1Y2tldCAqKQorCQlhbGxvY19sYXJnZV9zeXN0ZW1faGFzaCgiVENQIGJpbmQiLAorCQkJCQlzaXplb2Yoc3RydWN0IHRjcF9iaW5kX2hhc2hidWNrZXQpLAorCQkJCQl0Y3BfZWhhc2hfc2l6ZSwKKwkJCQkJKG51bV9waHlzcGFnZXMgPj0gMTI4ICogMTAyNCkgPworCQkJCQkJKDI1IC0gUEFHRV9TSElGVCkgOgorCQkJCQkJKDI3IC0gUEFHRV9TSElGVCksCisJCQkJCUhBU0hfSElHSE1FTSwKKwkJCQkJJnRjcF9iaGFzaF9zaXplLAorCQkJCQlOVUxMLAorCQkJCQk2NCAqIDEwMjQpOworCXRjcF9iaGFzaF9zaXplID0gMSA8PCB0Y3BfYmhhc2hfc2l6ZTsKKwlmb3IgKGkgPSAwOyBpIDwgdGNwX2JoYXNoX3NpemU7IGkrKykgeworCQlzcGluX2xvY2tfaW5pdCgmdGNwX2JoYXNoW2ldLmxvY2spOworCQlJTklUX0hMSVNUX0hFQUQoJnRjcF9iaGFzaFtpXS5jaGFpbik7CisJfQorCisJLyogVHJ5IHRvIGJlIGEgYml0IHNtYXJ0ZXIgYW5kIGFkanVzdCBkZWZhdWx0cyBkZXBlbmRpbmcKKwkgKiBvbiBhdmFpbGFibGUgbWVtb3J5LgorCSAqLworCWZvciAob3JkZXIgPSAwOyAoKDEgPDwgb3JkZXIpIDw8IFBBR0VfU0hJRlQpIDwKKwkJCSh0Y3BfYmhhc2hfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgdGNwX2JpbmRfaGFzaGJ1Y2tldCkpOworCQkJb3JkZXIrKykKKwkJOworCWlmIChvcmRlciA+IDQpIHsKKwkJc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMF0gPSAzMjc2ODsKKwkJc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMV0gPSA2MTAwMDsKKwkJc3lzY3RsX3RjcF9tYXhfdHdfYnVja2V0cyA9IDE4MDAwMDsKKwkJc3lzY3RsX3RjcF9tYXhfb3JwaGFucyA9IDQwOTYgPDwgKG9yZGVyIC0gNCk7CisJCXN5c2N0bF9tYXhfc3luX2JhY2tsb2cgPSAxMDI0OworCX0gZWxzZSBpZiAob3JkZXIgPCAzKSB7CisJCXN5c2N0bF9sb2NhbF9wb3J0X3JhbmdlWzBdID0gMTAyNCAqICgzIC0gb3JkZXIpOworCQlzeXNjdGxfdGNwX21heF90d19idWNrZXRzID4+PSAoMyAtIG9yZGVyKTsKKwkJc3lzY3RsX3RjcF9tYXhfb3JwaGFucyA+Pj0gKDMgLSBvcmRlcik7CisJCXN5c2N0bF9tYXhfc3luX2JhY2tsb2cgPSAxMjg7CisJfQorCXRjcF9wb3J0X3JvdmVyID0gc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMF0gLSAxOworCisJc3lzY3RsX3RjcF9tZW1bMF0gPSAgNzY4IDw8IG9yZGVyOworCXN5c2N0bF90Y3BfbWVtWzFdID0gMTAyNCA8PCBvcmRlcjsKKwlzeXNjdGxfdGNwX21lbVsyXSA9IDE1MzYgPDwgb3JkZXI7CisKKwlpZiAob3JkZXIgPCAzKSB7CisJCXN5c2N0bF90Y3Bfd21lbVsyXSA9IDY0ICogMTAyNDsKKwkJc3lzY3RsX3RjcF9ybWVtWzBdID0gUEFHRV9TSVpFOworCQlzeXNjdGxfdGNwX3JtZW1bMV0gPSA0MzY4OTsKKwkJc3lzY3RsX3RjcF9ybWVtWzJdID0gMiAqIDQzNjg5OworCX0KKworCXByaW50ayhLRVJOX0lORk8gIlRDUDogSGFzaCB0YWJsZXMgY29uZmlndXJlZCAiCisJICAgICAgICIoZXN0YWJsaXNoZWQgJWQgYmluZCAlZClcbiIsCisJICAgICAgIHRjcF9laGFzaF9zaXplIDw8IDEsIHRjcF9iaGFzaF9zaXplKTsKK30KKworRVhQT1JUX1NZTUJPTCh0Y3BfYWNjZXB0KTsKK0VYUE9SVF9TWU1CT0wodGNwX2Nsb3NlKTsKK0VYUE9SVF9TWU1CT0wodGNwX2Rlc3Ryb3lfc29jayk7CitFWFBPUlRfU1lNQk9MKHRjcF9kaXNjb25uZWN0KTsKK0VYUE9SVF9TWU1CT0wodGNwX2dldHNvY2tvcHQpOworRVhQT1JUX1NZTUJPTCh0Y3BfaW9jdGwpOworRVhQT1JUX1NZTUJPTCh0Y3Bfb3BlbnJlcV9jYWNoZXApOworRVhQT1JUX1NZTUJPTCh0Y3BfcG9sbCk7CitFWFBPUlRfU1lNQk9MKHRjcF9yZWFkX3NvY2spOworRVhQT1JUX1NZTUJPTCh0Y3BfcmVjdm1zZyk7CitFWFBPUlRfU1lNQk9MKHRjcF9zZW5kbXNnKTsKK0VYUE9SVF9TWU1CT0wodGNwX3NlbmRwYWdlKTsKK0VYUE9SVF9TWU1CT0wodGNwX3NldHNvY2tvcHQpOworRVhQT1JUX1NZTUJPTCh0Y3Bfc2h1dGRvd24pOworRVhQT1JUX1NZTUJPTCh0Y3Bfc3RhdGlzdGljcyk7CitFWFBPUlRfU1lNQk9MKHRjcF90aW1ld2FpdF9jYWNoZXApOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2RpYWcuYyBiL25ldC9pcHY0L3RjcF9kaWFnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEzYzE0MAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L3RjcF9kaWFnLmMKQEAgLTAsMCArMSw4MDIgQEAKKy8qCisgKiB0Y3BfZGlhZy5jCU1vZHVsZSBmb3IgbW9uaXRvcmluZyBUQ1Agc29ja2V0cy4KKyAqCisgKiBWZXJzaW9uOgkkSWQ6IHRjcF9kaWFnLmMsdiAxLjMgMjAwMi8wMi8wMSAyMjowMTowNCBkYXZlbSBFeHAgJAorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCisjaW5jbHVkZSA8bmV0L2ljbXAuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvaW5ldF9jb21tb24uaD4KKworI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKworI2luY2x1ZGUgPGxpbnV4L3RjcF9kaWFnLmg+CisKK3N0cnVjdCB0Y3BkaWFnX2VudHJ5Cit7CisJdTMyICpzYWRkcjsKKwl1MzIgKmRhZGRyOworCXUxNiBzcG9ydDsKKwl1MTYgZHBvcnQ7CisJdTE2IGZhbWlseTsKKwl1MTYgdXNlcmxvY2tzOworfTsKKworc3RhdGljIHN0cnVjdCBzb2NrICp0Y3BubDsKKworCisjZGVmaW5lIFRDUERJQUdfUFVUKHNrYiwgYXR0cnR5cGUsIGF0dHJsZW4pIFwKKyh7IGludCBydGFsZW4gPSBSVEFfTEVOR1RIKGF0dHJsZW4pOyAgICAgICAgXAorICAgc3RydWN0IHJ0YXR0ciAqcnRhOyAgICAgICAgICAgICAgICAgICAgICBcCisgICBpZiAoc2tiX3RhaWxyb29tKHNrYikgPCBSVEFfQUxJR04ocnRhbGVuKSkgZ290byBubG1zZ19mYWlsdXJlOyBcCisgICBydGEgPSAodm9pZCopX19za2JfcHV0KHNrYiwgUlRBX0FMSUdOKHJ0YWxlbikpOyBcCisgICBydGEtPnJ0YV90eXBlID0gYXR0cnR5cGU7ICAgICAgICAgICAgICAgIFwKKyAgIHJ0YS0+cnRhX2xlbiA9IHJ0YWxlbjsgICAgICAgICAgICAgICAgICAgXAorICAgUlRBX0RBVEEocnRhKTsgfSkKKworc3RhdGljIGludCB0Y3BkaWFnX2ZpbGwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNvY2sgKnNrLAorCQkJaW50IGV4dCwgdTMyIHBpZCwgdTMyIHNlcSwgdTE2IG5sbXNnX2ZsYWdzKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgdGNwZGlhZ21zZyAqcjsKKwlzdHJ1Y3Qgbmxtc2doZHIgICpubGg7CisJc3RydWN0IHRjcF9pbmZvICAqaW5mbyA9IE5VTEw7CisJc3RydWN0IHRjcGRpYWdfbWVtaW5mbyAgKm1pbmZvID0gTlVMTDsKKwlzdHJ1Y3QgdGNwdmVnYXNfaW5mbyAqdmluZm8gPSBOVUxMOworCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCisJbmxoID0gTkxNU0dfUFVUKHNrYiwgcGlkLCBzZXEsIFRDUERJQUdfR0VUU09DSywgc2l6ZW9mKCpyKSk7CisJbmxoLT5ubG1zZ19mbGFncyA9IG5sbXNnX2ZsYWdzOworCXIgPSBOTE1TR19EQVRBKG5saCk7CisJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfVElNRV9XQUlUKSB7CisJCWlmIChleHQgJiAoMTw8KFRDUERJQUdfTUVNSU5GTy0xKSkpCisJCQltaW5mbyA9IFRDUERJQUdfUFVUKHNrYiwgVENQRElBR19NRU1JTkZPLCBzaXplb2YoKm1pbmZvKSk7CisJCWlmIChleHQgJiAoMTw8KFRDUERJQUdfSU5GTy0xKSkpCisJCQlpbmZvID0gVENQRElBR19QVVQoc2tiLCBUQ1BESUFHX0lORk8sIHNpemVvZigqaW5mbykpOworCQkKKwkJaWYgKCh0Y3BfaXNfd2VzdHdvb2QodHApIHx8IHRjcF9pc192ZWdhcyh0cCkpCisJCSAgICAmJiAoZXh0ICYgKDE8PChUQ1BESUFHX1ZFR0FTSU5GTy0xKSkpKQorCQkJdmluZm8gPSBUQ1BESUFHX1BVVChza2IsIFRDUERJQUdfVkVHQVNJTkZPLCBzaXplb2YoKnZpbmZvKSk7CisJfQorCXItPnRjcGRpYWdfZmFtaWx5ID0gc2stPnNrX2ZhbWlseTsKKwlyLT50Y3BkaWFnX3N0YXRlID0gc2stPnNrX3N0YXRlOworCXItPnRjcGRpYWdfdGltZXIgPSAwOworCXItPnRjcGRpYWdfcmV0cmFucyA9IDA7CisKKwlyLT5pZC50Y3BkaWFnX2lmID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKKwlyLT5pZC50Y3BkaWFnX2Nvb2tpZVswXSA9ICh1MzIpKHVuc2lnbmVkIGxvbmcpc2s7CisJci0+aWQudGNwZGlhZ19jb29raWVbMV0gPSAodTMyKSgoKHVuc2lnbmVkIGxvbmcpc2sgPj4gMzEpID4+IDEpOworCisJaWYgKHItPnRjcGRpYWdfc3RhdGUgPT0gVENQX1RJTUVfV0FJVCkgeworCQlzdHJ1Y3QgdGNwX3R3X2J1Y2tldCAqdHcgPSAoc3RydWN0IHRjcF90d19idWNrZXQqKXNrOworCQlsb25nIHRtbyA9IHR3LT50d190dGQgLSBqaWZmaWVzOworCQlpZiAodG1vIDwgMCkKKwkJCXRtbyA9IDA7CisKKwkJci0+aWQudGNwZGlhZ19zcG9ydCA9IHR3LT50d19zcG9ydDsKKwkJci0+aWQudGNwZGlhZ19kcG9ydCA9IHR3LT50d19kcG9ydDsKKwkJci0+aWQudGNwZGlhZ19zcmNbMF0gPSB0dy0+dHdfcmN2X3NhZGRyOworCQlyLT5pZC50Y3BkaWFnX2RzdFswXSA9IHR3LT50d19kYWRkcjsKKwkJci0+dGNwZGlhZ19zdGF0ZSA9IHR3LT50d19zdWJzdGF0ZTsKKwkJci0+dGNwZGlhZ190aW1lciA9IDM7CisJCXItPnRjcGRpYWdfZXhwaXJlcyA9ICh0bW8qMTAwMCtIWi0xKS9IWjsKKwkJci0+dGNwZGlhZ19ycXVldWUgPSAwOworCQlyLT50Y3BkaWFnX3dxdWV1ZSA9IDA7CisJCXItPnRjcGRpYWdfdWlkID0gMDsKKwkJci0+dGNwZGlhZ19pbm9kZSA9IDA7CisjaWZkZWYgQ09ORklHX0lQX1RDUERJQUdfSVBWNgorCQlpZiAoci0+dGNwZGlhZ19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJCWlwdjZfYWRkcl9jb3B5KChzdHJ1Y3QgaW42X2FkZHIgKilyLT5pZC50Y3BkaWFnX3NyYywKKwkJCQkgICAgICAgJnR3LT50d192Nl9yY3Zfc2FkZHIpOworCQkJaXB2Nl9hZGRyX2NvcHkoKHN0cnVjdCBpbjZfYWRkciAqKXItPmlkLnRjcGRpYWdfZHN0LAorCQkJCSAgICAgICAmdHctPnR3X3Y2X2RhZGRyKTsKKwkJfQorI2VuZGlmCisJCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwkJcmV0dXJuIHNrYi0+bGVuOworCX0KKworCXItPmlkLnRjcGRpYWdfc3BvcnQgPSBpbmV0LT5zcG9ydDsKKwlyLT5pZC50Y3BkaWFnX2Rwb3J0ID0gaW5ldC0+ZHBvcnQ7CisJci0+aWQudGNwZGlhZ19zcmNbMF0gPSBpbmV0LT5yY3Zfc2FkZHI7CisJci0+aWQudGNwZGlhZ19kc3RbMF0gPSBpbmV0LT5kYWRkcjsKKworI2lmZGVmIENPTkZJR19JUF9UQ1BESUFHX0lQVjYKKwlpZiAoci0+dGNwZGlhZ19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOworCisJCWlwdjZfYWRkcl9jb3B5KChzdHJ1Y3QgaW42X2FkZHIgKilyLT5pZC50Y3BkaWFnX3NyYywKKwkJCSAgICAgICAmbnAtPnJjdl9zYWRkcik7CisJCWlwdjZfYWRkcl9jb3B5KChzdHJ1Y3QgaW42X2FkZHIgKilyLT5pZC50Y3BkaWFnX2RzdCwKKwkJCSAgICAgICAmbnAtPmRhZGRyKTsKKwl9CisjZW5kaWYKKworI2RlZmluZSBFWFBJUkVTX0lOX01TKHRtbykgICgodG1vLWppZmZpZXMpKjEwMDArSFotMSkvSFoKKworCWlmICh0cC0+cGVuZGluZyA9PSBUQ1BfVElNRV9SRVRSQU5TKSB7CisJCXItPnRjcGRpYWdfdGltZXIgPSAxOworCQlyLT50Y3BkaWFnX3JldHJhbnMgPSB0cC0+cmV0cmFuc21pdHM7CisJCXItPnRjcGRpYWdfZXhwaXJlcyA9IEVYUElSRVNfSU5fTVModHAtPnRpbWVvdXQpOworCX0gZWxzZSBpZiAodHAtPnBlbmRpbmcgPT0gVENQX1RJTUVfUFJPQkUwKSB7CisJCXItPnRjcGRpYWdfdGltZXIgPSA0OworCQlyLT50Y3BkaWFnX3JldHJhbnMgPSB0cC0+cHJvYmVzX291dDsKKwkJci0+dGNwZGlhZ19leHBpcmVzID0gRVhQSVJFU19JTl9NUyh0cC0+dGltZW91dCk7CisJfSBlbHNlIGlmICh0aW1lcl9wZW5kaW5nKCZzay0+c2tfdGltZXIpKSB7CisJCXItPnRjcGRpYWdfdGltZXIgPSAyOworCQlyLT50Y3BkaWFnX3JldHJhbnMgPSB0cC0+cHJvYmVzX291dDsKKwkJci0+dGNwZGlhZ19leHBpcmVzID0gRVhQSVJFU19JTl9NUyhzay0+c2tfdGltZXIuZXhwaXJlcyk7CisJfSBlbHNlIHsKKwkJci0+dGNwZGlhZ190aW1lciA9IDA7CisJCXItPnRjcGRpYWdfZXhwaXJlcyA9IDA7CisJfQorI3VuZGVmIEVYUElSRVNfSU5fTVMKKworCXItPnRjcGRpYWdfcnF1ZXVlID0gdHAtPnJjdl9ueHQgLSB0cC0+Y29waWVkX3NlcTsKKwlyLT50Y3BkaWFnX3dxdWV1ZSA9IHRwLT53cml0ZV9zZXEgLSB0cC0+c25kX3VuYTsKKwlyLT50Y3BkaWFnX3VpZCA9IHNvY2tfaV91aWQoc2spOworCXItPnRjcGRpYWdfaW5vZGUgPSBzb2NrX2lfaW5vKHNrKTsKKworCWlmIChtaW5mbykgeworCQltaW5mby0+dGNwZGlhZ19ybWVtID0gYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKTsKKwkJbWluZm8tPnRjcGRpYWdfd21lbSA9IHNrLT5za193bWVtX3F1ZXVlZDsKKwkJbWluZm8tPnRjcGRpYWdfZm1lbSA9IHNrLT5za19mb3J3YXJkX2FsbG9jOworCQltaW5mby0+dGNwZGlhZ190bWVtID0gYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKTsKKwl9CisKKwlpZiAoaW5mbykgCisJCXRjcF9nZXRfaW5mbyhzaywgaW5mbyk7CisKKwlpZiAodmluZm8pIHsKKwkJaWYgKHRjcF9pc192ZWdhcyh0cCkpIHsKKwkJCXZpbmZvLT50Y3B2X2VuYWJsZWQgPSB0cC0+dmVnYXMuZG9pbmdfdmVnYXNfbm93OworCQkJdmluZm8tPnRjcHZfcnR0Y250ID0gdHAtPnZlZ2FzLmNudFJUVDsKKwkJCXZpbmZvLT50Y3B2X3J0dCA9IGppZmZpZXNfdG9fdXNlY3ModHAtPnZlZ2FzLmJhc2VSVFQpOworCQkJdmluZm8tPnRjcHZfbWlucnR0ID0gamlmZmllc190b191c2Vjcyh0cC0+dmVnYXMubWluUlRUKTsKKwkJfSBlbHNlIHsKKwkJCXZpbmZvLT50Y3B2X2VuYWJsZWQgPSAwOworCQkJdmluZm8tPnRjcHZfcnR0Y250ID0gMDsKKwkJCXZpbmZvLT50Y3B2X3J0dCA9IGppZmZpZXNfdG9fdXNlY3ModHAtPndlc3R3b29kLnJ0dCk7CisJCQl2aW5mby0+dGNwdl9taW5ydHQgPSBqaWZmaWVzX3RvX3VzZWNzKHRwLT53ZXN0d29vZC5ydHRfbWluKTsKKwkJfQorCX0KKworCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlyZXR1cm4gc2tiLT5sZW47CisKK25sbXNnX2ZhaWx1cmU6CisJc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlyZXR1cm4gLTE7Cit9CisKK2V4dGVybiBzdHJ1Y3Qgc29jayAqdGNwX3Y0X2xvb2t1cCh1MzIgc2FkZHIsIHUxNiBzcG9ydCwgdTMyIGRhZGRyLCB1MTYgZHBvcnQsCisJCQkJICBpbnQgZGlmKTsKKyNpZmRlZiBDT05GSUdfSVBfVENQRElBR19JUFY2CitleHRlcm4gc3RydWN0IHNvY2sgKnRjcF92Nl9sb29rdXAoc3RydWN0IGluNl9hZGRyICpzYWRkciwgdTE2IHNwb3J0LAorCQkJCSAgc3RydWN0IGluNl9hZGRyICpkYWRkciwgdTE2IGRwb3J0LAorCQkJCSAgaW50IGRpZik7CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29jayAqdGNwX3Y2X2xvb2t1cChzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCB1MTYgc3BvcnQsCisJCQkJCSBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCB1MTYgZHBvcnQsCisJCQkJCSBpbnQgZGlmKQoreworCXJldHVybiBOVUxMOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgdGNwZGlhZ19nZXRfZXhhY3Qoc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgpCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IHRjcGRpYWdyZXEgKnJlcSA9IE5MTVNHX0RBVEEobmxoKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcmVwOworCisJaWYgKHJlcS0+dGNwZGlhZ19mYW1pbHkgPT0gQUZfSU5FVCkgeworCQlzayA9IHRjcF92NF9sb29rdXAocmVxLT5pZC50Y3BkaWFnX2RzdFswXSwgcmVxLT5pZC50Y3BkaWFnX2Rwb3J0LAorCQkJCSAgIHJlcS0+aWQudGNwZGlhZ19zcmNbMF0sIHJlcS0+aWQudGNwZGlhZ19zcG9ydCwKKwkJCQkgICByZXEtPmlkLnRjcGRpYWdfaWYpOworCX0KKyNpZmRlZiBDT05GSUdfSVBfVENQRElBR19JUFY2CisJZWxzZSBpZiAocmVxLT50Y3BkaWFnX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQlzayA9IHRjcF92Nl9sb29rdXAoKHN0cnVjdCBpbjZfYWRkciopcmVxLT5pZC50Y3BkaWFnX2RzdCwgcmVxLT5pZC50Y3BkaWFnX2Rwb3J0LAorCQkJCSAgIChzdHJ1Y3QgaW42X2FkZHIqKXJlcS0+aWQudGNwZGlhZ19zcmMsIHJlcS0+aWQudGNwZGlhZ19zcG9ydCwKKwkJCQkgICByZXEtPmlkLnRjcGRpYWdfaWYpOworCX0KKyNlbmRpZgorCWVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc2sgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwllcnIgPSAtRVNUQUxFOworCWlmICgocmVxLT5pZC50Y3BkaWFnX2Nvb2tpZVswXSAhPSBUQ1BESUFHX05PQ09PS0lFIHx8CisJICAgICByZXEtPmlkLnRjcGRpYWdfY29va2llWzFdICE9IFRDUERJQUdfTk9DT09LSUUpICYmCisJICAgICgodTMyKSh1bnNpZ25lZCBsb25nKXNrICE9IHJlcS0+aWQudGNwZGlhZ19jb29raWVbMF0gfHwKKwkgICAgICh1MzIpKCgoKHVuc2lnbmVkIGxvbmcpc2spID4+IDMxKSA+PiAxKSAhPSByZXEtPmlkLnRjcGRpYWdfY29va2llWzFdKSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAtRU5PTUVNOworCXJlcCA9IGFsbG9jX3NrYihOTE1TR19TUEFDRShzaXplb2Yoc3RydWN0IHRjcGRpYWdtc2cpKworCQkJCSAgICBzaXplb2Yoc3RydWN0IHRjcGRpYWdfbWVtaW5mbykrCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgdGNwX2luZm8pKzY0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXApCisJCWdvdG8gb3V0OworCisJaWYgKHRjcGRpYWdfZmlsbChyZXAsIHNrLCByZXEtPnRjcGRpYWdfZXh0LAorCQkJIE5FVExJTktfQ0IoaW5fc2tiKS5waWQsCisJCQkgbmxoLT5ubG1zZ19zZXEsIDApIDw9IDApCisJCUJVRygpOworCisJZXJyID0gbmV0bGlua191bmljYXN0KHRjcG5sLCByZXAsIE5FVExJTktfQ0IoaW5fc2tiKS5waWQsIE1TR19ET05UV0FJVCk7CisJaWYgKGVyciA+IDApCisJCWVyciA9IDA7CisKK291dDoKKwlpZiAoc2spIHsKKwkJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfVElNRV9XQUlUKQorCQkJdGNwX3R3X3B1dCgoc3RydWN0IHRjcF90d19idWNrZXQqKXNrKTsKKwkJZWxzZQorCQkJc29ja19wdXQoc2spOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGJpdHN0cmluZ19tYXRjaChjb25zdCB1MzIgKmExLCBjb25zdCB1MzIgKmEyLCBpbnQgYml0cykKK3sKKwlpbnQgd29yZHMgPSBiaXRzID4+IDU7CisKKwliaXRzICY9IDB4MWY7CisKKwlpZiAod29yZHMpIHsKKwkJaWYgKG1lbWNtcChhMSwgYTIsIHdvcmRzIDw8IDIpKQorCQkJcmV0dXJuIDA7CisJfQorCWlmIChiaXRzKSB7CisJCV9fdTMyIHcxLCB3MjsKKwkJX191MzIgbWFzazsKKworCQl3MSA9IGExW3dvcmRzXTsKKwkJdzIgPSBhMlt3b3Jkc107CisKKwkJbWFzayA9IGh0b25sKCgweGZmZmZmZmZmKSA8PCAoMzIgLSBiaXRzKSk7CisKKwkJaWYgKCh3MSBeIHcyKSAmIG1hc2spCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IHRjcGRpYWdfYmNfcnVuKGNvbnN0IHZvaWQgKmJjLCBpbnQgbGVuLAorCQkJICBjb25zdCBzdHJ1Y3QgdGNwZGlhZ19lbnRyeSAqZW50cnkpCit7CisJd2hpbGUgKGxlbiA+IDApIHsKKwkJaW50IHllcyA9IDE7CisJCWNvbnN0IHN0cnVjdCB0Y3BkaWFnX2JjX29wICpvcCA9IGJjOworCisJCXN3aXRjaCAob3AtPmNvZGUpIHsKKwkJY2FzZSBUQ1BESUFHX0JDX05PUDoKKwkJCWJyZWFrOworCQljYXNlIFRDUERJQUdfQkNfSk1QOgorCQkJeWVzID0gMDsKKwkJCWJyZWFrOworCQljYXNlIFRDUERJQUdfQkNfU19HRToKKwkJCXllcyA9IGVudHJ5LT5zcG9ydCA+PSBvcFsxXS5ubzsKKwkJCWJyZWFrOworCQljYXNlIFRDUERJQUdfQkNfU19MRToKKwkJCXllcyA9IGVudHJ5LT5kcG9ydCA8PSBvcFsxXS5ubzsKKwkJCWJyZWFrOworCQljYXNlIFRDUERJQUdfQkNfRF9HRToKKwkJCXllcyA9IGVudHJ5LT5kcG9ydCA+PSBvcFsxXS5ubzsKKwkJCWJyZWFrOworCQljYXNlIFRDUERJQUdfQkNfRF9MRToKKwkJCXllcyA9IGVudHJ5LT5kcG9ydCA8PSBvcFsxXS5ubzsKKwkJCWJyZWFrOworCQljYXNlIFRDUERJQUdfQkNfQVVUTzoKKwkJCXllcyA9ICEoZW50cnktPnVzZXJsb2NrcyAmIFNPQ0tfQklORFBPUlRfTE9DSyk7CisJCQlicmVhazsKKwkJY2FzZSBUQ1BESUFHX0JDX1NfQ09ORDoKKwkJY2FzZSBUQ1BESUFHX0JDX0RfQ09ORDoKKwkJeworCQkJc3RydWN0IHRjcGRpYWdfaG9zdGNvbmQgKmNvbmQgPSAoc3RydWN0IHRjcGRpYWdfaG9zdGNvbmQqKShvcCsxKTsKKwkJCXUzMiAqYWRkcjsKKworCQkJaWYgKGNvbmQtPnBvcnQgIT0gLTEgJiYKKwkJCSAgICBjb25kLT5wb3J0ICE9IChvcC0+Y29kZSA9PSBUQ1BESUFHX0JDX1NfQ09ORCA/CisJCQkJCSAgICAgZW50cnktPnNwb3J0IDogZW50cnktPmRwb3J0KSkgeworCQkJCXllcyA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQkKKwkJCWlmIChjb25kLT5wcmVmaXhfbGVuID09IDApCisJCQkJYnJlYWs7CisKKwkJCWlmIChvcC0+Y29kZSA9PSBUQ1BESUFHX0JDX1NfQ09ORCkKKwkJCQlhZGRyID0gZW50cnktPnNhZGRyOworCQkJZWxzZQorCQkJCWFkZHIgPSBlbnRyeS0+ZGFkZHI7CisKKwkJCWlmIChiaXRzdHJpbmdfbWF0Y2goYWRkciwgY29uZC0+YWRkciwgY29uZC0+cHJlZml4X2xlbikpCisJCQkJYnJlYWs7CisJCQlpZiAoZW50cnktPmZhbWlseSA9PSBBRl9JTkVUNiAmJgorCQkJICAgIGNvbmQtPmZhbWlseSA9PSBBRl9JTkVUKSB7CisJCQkJaWYgKGFkZHJbMF0gPT0gMCAmJiBhZGRyWzFdID09IDAgJiYKKwkJCQkgICAgYWRkclsyXSA9PSBodG9ubCgweGZmZmYpICYmCisJCQkJICAgIGJpdHN0cmluZ19tYXRjaChhZGRyKzMsIGNvbmQtPmFkZHIsIGNvbmQtPnByZWZpeF9sZW4pKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCXllcyA9IDA7CisJCQlicmVhazsKKwkJfQorCQl9CisKKwkJaWYgKHllcykgeyAKKwkJCWxlbiAtPSBvcC0+eWVzOworCQkJYmMgKz0gb3AtPnllczsKKwkJfSBlbHNlIHsKKwkJCWxlbiAtPSBvcC0+bm87CisJCQliYyArPSBvcC0+bm87CisJCX0KKwl9CisJcmV0dXJuIChsZW4gPT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgdmFsaWRfY2MoY29uc3Qgdm9pZCAqYmMsIGludCBsZW4sIGludCBjYykKK3sKKwl3aGlsZSAobGVuID49IDApIHsKKwkJY29uc3Qgc3RydWN0IHRjcGRpYWdfYmNfb3AgKm9wID0gYmM7CisKKwkJaWYgKGNjID4gbGVuKQorCQkJcmV0dXJuIDA7CisJCWlmIChjYyA9PSBsZW4pCisJCQlyZXR1cm4gMTsKKwkJaWYgKG9wLT55ZXMgPCA0KQorCQkJcmV0dXJuIDA7CisJCWxlbiAtPSBvcC0+eWVzOworCQliYyAgKz0gb3AtPnllczsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGNwZGlhZ19iY19hdWRpdChjb25zdCB2b2lkICpieXRlY29kZSwgaW50IGJ5dGVjb2RlX2xlbikKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpiYyA9IGJ5dGVjb2RlOworCWludCAgbGVuID0gYnl0ZWNvZGVfbGVuOworCisJd2hpbGUgKGxlbiA+IDApIHsKKwkJc3RydWN0IHRjcGRpYWdfYmNfb3AgKm9wID0gKHN0cnVjdCB0Y3BkaWFnX2JjX29wKiliYzsKKworLy9wcmludGsoIkJDOiAlZCAlZCAlZCB7JWR9IC8gJWRcbiIsIG9wLT5jb2RlLCBvcC0+eWVzLCBvcC0+bm8sIG9wWzFdLm5vLCBsZW4pOworCQlzd2l0Y2ggKG9wLT5jb2RlKSB7CisJCWNhc2UgVENQRElBR19CQ19BVVRPOgorCQljYXNlIFRDUERJQUdfQkNfU19DT05EOgorCQljYXNlIFRDUERJQUdfQkNfRF9DT05EOgorCQljYXNlIFRDUERJQUdfQkNfU19HRToKKwkJY2FzZSBUQ1BESUFHX0JDX1NfTEU6CisJCWNhc2UgVENQRElBR19CQ19EX0dFOgorCQljYXNlIFRDUERJQUdfQkNfRF9MRToKKwkJCWlmIChvcC0+eWVzIDwgNCB8fCBvcC0+eWVzID4gbGVuKzQpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCWNhc2UgVENQRElBR19CQ19KTVA6CisJCQlpZiAob3AtPm5vIDwgNCB8fCBvcC0+bm8gPiBsZW4rNCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChvcC0+bm8gPCBsZW4gJiYKKwkJCSAgICAhdmFsaWRfY2MoYnl0ZWNvZGUsIGJ5dGVjb2RlX2xlbiwgbGVuLW9wLT5ubykpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJY2FzZSBUQ1BESUFHX0JDX05PUDoKKwkJCWlmIChvcC0+eWVzIDwgNCB8fCBvcC0+eWVzID4gbGVuKzQpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJjICs9IG9wLT55ZXM7CisJCWxlbiAtPSBvcC0+eWVzOworCX0KKwlyZXR1cm4gbGVuID09IDAgPyAwIDogLUVJTlZBTDsKK30KKworc3RhdGljIGludCB0Y3BkaWFnX2R1bXBfc29jayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlzdHJ1Y3QgdGNwZGlhZ3JlcSAqciA9IE5MTVNHX0RBVEEoY2ItPm5saCk7CisKKwlpZiAoY2ItPm5saC0+bmxtc2dfbGVuID4gNCArIE5MTVNHX1NQQUNFKHNpemVvZigqcikpKSB7CisJCXN0cnVjdCB0Y3BkaWFnX2VudHJ5IGVudHJ5OworCQlzdHJ1Y3QgcnRhdHRyICpiYyA9IChzdHJ1Y3QgcnRhdHRyICopKHIgKyAxKTsKKwkJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCisJCWVudHJ5LmZhbWlseSA9IHNrLT5za19mYW1pbHk7CisjaWZkZWYgQ09ORklHX0lQX1RDUERJQUdfSVBWNgorCQlpZiAoZW50cnkuZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCQlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CisKKwkJCWVudHJ5LnNhZGRyID0gbnAtPnJjdl9zYWRkci5zNl9hZGRyMzI7CisJCQllbnRyeS5kYWRkciA9IG5wLT5kYWRkci5zNl9hZGRyMzI7CisJCX0gZWxzZQorI2VuZGlmCisJCXsKKwkJCWVudHJ5LnNhZGRyID0gJmluZXQtPnJjdl9zYWRkcjsKKwkJCWVudHJ5LmRhZGRyID0gJmluZXQtPmRhZGRyOworCQl9CisJCWVudHJ5LnNwb3J0ID0gaW5ldC0+bnVtOworCQllbnRyeS5kcG9ydCA9IG50b2hzKGluZXQtPmRwb3J0KTsKKwkJZW50cnkudXNlcmxvY2tzID0gc2stPnNrX3VzZXJsb2NrczsKKworCQlpZiAoIXRjcGRpYWdfYmNfcnVuKFJUQV9EQVRBKGJjKSwgUlRBX1BBWUxPQUQoYmMpLCAmZW50cnkpKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHRjcGRpYWdfZmlsbChza2IsIHNrLCByLT50Y3BkaWFnX2V4dCwgTkVUTElOS19DQihjYi0+c2tiKS5waWQsCisJCQkgICAgY2ItPm5saC0+bmxtc2dfc2VxLCBOTE1fRl9NVUxUSSk7Cit9CisKK3N0YXRpYyBpbnQgdGNwZGlhZ19maWxsX3JlcShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkgICAgc3RydWN0IG9wZW5fcmVxdWVzdCAqcmVxLAorCQkJICAgIHUzMiBwaWQsIHUzMiBzZXEpCit7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJc3RydWN0IHRjcGRpYWdtc2cgKnI7CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisJbG9uZyB0bW87CisKKwlubGggPSBOTE1TR19QVVQoc2tiLCBwaWQsIHNlcSwgVENQRElBR19HRVRTT0NLLCBzaXplb2YoKnIpKTsKKwlubGgtPm5sbXNnX2ZsYWdzID0gTkxNX0ZfTVVMVEk7CisJciA9IE5MTVNHX0RBVEEobmxoKTsKKworCXItPnRjcGRpYWdfZmFtaWx5ID0gc2stPnNrX2ZhbWlseTsKKwlyLT50Y3BkaWFnX3N0YXRlID0gVENQX1NZTl9SRUNWOworCXItPnRjcGRpYWdfdGltZXIgPSAxOworCXItPnRjcGRpYWdfcmV0cmFucyA9IHJlcS0+cmV0cmFuczsKKworCXItPmlkLnRjcGRpYWdfaWYgPSBzay0+c2tfYm91bmRfZGV2X2lmOworCXItPmlkLnRjcGRpYWdfY29va2llWzBdID0gKHUzMikodW5zaWduZWQgbG9uZylyZXE7CisJci0+aWQudGNwZGlhZ19jb29raWVbMV0gPSAodTMyKSgoKHVuc2lnbmVkIGxvbmcpcmVxID4+IDMxKSA+PiAxKTsKKworCXRtbyA9IHJlcS0+ZXhwaXJlcyAtIGppZmZpZXM7CisJaWYgKHRtbyA8IDApCisJCXRtbyA9IDA7CisKKwlyLT5pZC50Y3BkaWFnX3Nwb3J0ID0gaW5ldC0+c3BvcnQ7CisJci0+aWQudGNwZGlhZ19kcG9ydCA9IHJlcS0+cm10X3BvcnQ7CisJci0+aWQudGNwZGlhZ19zcmNbMF0gPSByZXEtPmFmLnY0X3JlcS5sb2NfYWRkcjsKKwlyLT5pZC50Y3BkaWFnX2RzdFswXSA9IHJlcS0+YWYudjRfcmVxLnJtdF9hZGRyOworCXItPnRjcGRpYWdfZXhwaXJlcyA9IGppZmZpZXNfdG9fbXNlY3ModG1vKSwKKwlyLT50Y3BkaWFnX3JxdWV1ZSA9IDA7CisJci0+dGNwZGlhZ193cXVldWUgPSAwOworCXItPnRjcGRpYWdfdWlkID0gc29ja19pX3VpZChzayk7CisJci0+dGNwZGlhZ19pbm9kZSA9IDA7CisjaWZkZWYgQ09ORklHX0lQX1RDUERJQUdfSVBWNgorCWlmIChyLT50Y3BkaWFnX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQlpcHY2X2FkZHJfY29weSgoc3RydWN0IGluNl9hZGRyICopci0+aWQudGNwZGlhZ19zcmMsCisJCQkgICAgICAgJnJlcS0+YWYudjZfcmVxLmxvY19hZGRyKTsKKwkJaXB2Nl9hZGRyX2NvcHkoKHN0cnVjdCBpbjZfYWRkciAqKXItPmlkLnRjcGRpYWdfZHN0LAorCQkJICAgICAgICZyZXEtPmFmLnY2X3JlcS5ybXRfYWRkcik7CisJfQorI2VuZGlmCisJbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCisJcmV0dXJuIHNrYi0+bGVuOworCitubG1zZ19mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHRjcGRpYWdfZHVtcF9yZXFzKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzb2NrICpzaywKKwkJCSAgICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXN0cnVjdCB0Y3BkaWFnX2VudHJ5IGVudHJ5OworCXN0cnVjdCB0Y3BkaWFncmVxICpyID0gTkxNU0dfREFUQShjYi0+bmxoKTsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgdGNwX2xpc3Rlbl9vcHQgKmxvcHQ7CisJc3RydWN0IHJ0YXR0ciAqYmMgPSBOVUxMOworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlpbnQgaiwgc19qOworCWludCByZXFudW0sIHNfcmVxbnVtOworCWludCBlcnIgPSAwOworCisJc19qID0gY2ItPmFyZ3NbM107CisJc19yZXFudW0gPSBjYi0+YXJnc1s0XTsKKworCWlmIChzX2ogPiAwKQorCQlzX2otLTsKKworCWVudHJ5LmZhbWlseSA9IHNrLT5za19mYW1pbHk7CisKKwlyZWFkX2xvY2tfYmgoJnRwLT5zeW5fd2FpdF9sb2NrKTsKKworCWxvcHQgPSB0cC0+bGlzdGVuX29wdDsKKwlpZiAoIWxvcHQgfHwgIWxvcHQtPnFsZW4pCisJCWdvdG8gb3V0OworCisJaWYgKGNiLT5ubGgtPm5sbXNnX2xlbiA+IDQgKyBOTE1TR19TUEFDRShzaXplb2YoKnIpKSkgeworCQliYyA9IChzdHJ1Y3QgcnRhdHRyICopKHIgKyAxKTsKKwkJZW50cnkuc3BvcnQgPSBpbmV0LT5udW07CisJCWVudHJ5LnVzZXJsb2NrcyA9IHNrLT5za191c2VybG9ja3M7CisJfQorCisJZm9yIChqID0gc19qOyBqIDwgVENQX1NZTlFfSFNJWkU7IGorKykgeworCQlzdHJ1Y3Qgb3Blbl9yZXF1ZXN0ICpyZXEsICpoZWFkID0gbG9wdC0+c3luX3RhYmxlW2pdOworCisJCXJlcW51bSA9IDA7CisJCWZvciAocmVxID0gaGVhZDsgcmVxOyByZXFudW0rKywgcmVxID0gcmVxLT5kbF9uZXh0KSB7CisJCQlpZiAocmVxbnVtIDwgc19yZXFudW0pCisJCQkJY29udGludWU7CisJCQlpZiAoci0+aWQudGNwZGlhZ19kcG9ydCAhPSByZXEtPnJtdF9wb3J0ICYmCisJCQkgICAgci0+aWQudGNwZGlhZ19kcG9ydCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGJjKSB7CisJCQkJZW50cnkuc2FkZHIgPQorI2lmZGVmIENPTkZJR19JUF9UQ1BESUFHX0lQVjYKKwkJCQkJKGVudHJ5LmZhbWlseSA9PSBBRl9JTkVUNikgPworCQkJCQlyZXEtPmFmLnY2X3JlcS5sb2NfYWRkci5zNl9hZGRyMzIgOgorI2VuZGlmCisJCQkJCSZyZXEtPmFmLnY0X3JlcS5sb2NfYWRkcjsKKwkJCQllbnRyeS5kYWRkciA9IAorI2lmZGVmIENPTkZJR19JUF9UQ1BESUFHX0lQVjYKKwkJCQkJKGVudHJ5LmZhbWlseSA9PSBBRl9JTkVUNikgPworCQkJCQlyZXEtPmFmLnY2X3JlcS5ybXRfYWRkci5zNl9hZGRyMzIgOgorI2VuZGlmCisJCQkJCSZyZXEtPmFmLnY0X3JlcS5ybXRfYWRkcjsKKwkJCQllbnRyeS5kcG9ydCA9IG50b2hzKHJlcS0+cm10X3BvcnQpOworCisJCQkJaWYgKCF0Y3BkaWFnX2JjX3J1bihSVEFfREFUQShiYyksCisJCQkJCQkgICAgUlRBX1BBWUxPQUQoYmMpLCAmZW50cnkpKQorCQkJCQljb250aW51ZTsKKwkJCX0KKworCQkJZXJyID0gdGNwZGlhZ19maWxsX3JlcShza2IsIHNrLCByZXEsCisJCQkJCSAgICAgICBORVRMSU5LX0NCKGNiLT5za2IpLnBpZCwKKwkJCQkJICAgICAgIGNiLT5ubGgtPm5sbXNnX3NlcSk7CisJCQlpZiAoZXJyIDwgMCkgeworCQkJCWNiLT5hcmdzWzNdID0gaiArIDE7CisJCQkJY2ItPmFyZ3NbNF0gPSByZXFudW07CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKworCQlzX3JlcW51bSA9IDA7CisJfQorCitvdXQ6CisJcmVhZF91bmxvY2tfYmgoJnRwLT5zeW5fd2FpdF9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdGNwZGlhZ19kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlpbnQgaSwgbnVtOworCWludCBzX2ksIHNfbnVtOworCXN0cnVjdCB0Y3BkaWFncmVxICpyID0gTkxNU0dfREFUQShjYi0+bmxoKTsKKworCXNfaSA9IGNiLT5hcmdzWzFdOworCXNfbnVtID0gbnVtID0gY2ItPmFyZ3NbMl07CisKKwlpZiAoY2ItPmFyZ3NbMF0gPT0gMCkgeworCQlpZiAoIShyLT50Y3BkaWFnX3N0YXRlcyYoVENQRl9MSVNURU58VENQRl9TWU5fUkVDVikpKQorCQkJZ290byBza2lwX2xpc3Rlbl9odDsKKwkJdGNwX2xpc3Rlbl9sb2NrKCk7CisJCWZvciAoaSA9IHNfaTsgaSA8IFRDUF9MSFRBQkxFX1NJWkU7IGkrKykgeworCQkJc3RydWN0IHNvY2sgKnNrOworCQkJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisKKwkJCW51bSA9IDA7CisJCQlza19mb3JfZWFjaChzaywgbm9kZSwgJnRjcF9saXN0ZW5pbmdfaGFzaFtpXSkgeworCQkJCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKworCQkJCWlmIChudW0gPCBzX251bSkgeworCQkJCQludW0rKzsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJaWYgKHItPmlkLnRjcGRpYWdfc3BvcnQgIT0gaW5ldC0+c3BvcnQgJiYKKwkJCQkgICAgci0+aWQudGNwZGlhZ19zcG9ydCkKKwkJCQkJZ290byBuZXh0X2xpc3RlbjsKKworCQkJCWlmICghKHItPnRjcGRpYWdfc3RhdGVzJlRDUEZfTElTVEVOKSB8fAorCQkJCSAgICByLT5pZC50Y3BkaWFnX2Rwb3J0IHx8CisJCQkJICAgIGNiLT5hcmdzWzNdID4gMCkKKwkJCQkJZ290byBzeW5fcmVjdjsKKworCQkJCWlmICh0Y3BkaWFnX2R1bXBfc29jayhza2IsIHNrLCBjYikgPCAwKSB7CisJCQkJCXRjcF9saXN0ZW5fdW5sb2NrKCk7CisJCQkJCWdvdG8gZG9uZTsKKwkJCQl9CisKK3N5bl9yZWN2OgorCQkJCWlmICghKHItPnRjcGRpYWdfc3RhdGVzJlRDUEZfU1lOX1JFQ1YpKQorCQkJCQlnb3RvIG5leHRfbGlzdGVuOworCisJCQkJaWYgKHRjcGRpYWdfZHVtcF9yZXFzKHNrYiwgc2ssIGNiKSA8IDApIHsKKwkJCQkJdGNwX2xpc3Rlbl91bmxvY2soKTsKKwkJCQkJZ290byBkb25lOworCQkJCX0KKworbmV4dF9saXN0ZW46CisJCQkJY2ItPmFyZ3NbM10gPSAwOworCQkJCWNiLT5hcmdzWzRdID0gMDsKKwkJCQkrK251bTsKKwkJCX0KKworCQkJc19udW0gPSAwOworCQkJY2ItPmFyZ3NbM10gPSAwOworCQkJY2ItPmFyZ3NbNF0gPSAwOworCQl9CisJCXRjcF9saXN0ZW5fdW5sb2NrKCk7Citza2lwX2xpc3Rlbl9odDoKKwkJY2ItPmFyZ3NbMF0gPSAxOworCQlzX2kgPSBudW0gPSBzX251bSA9IDA7CisJfQorCisJaWYgKCEoci0+dGNwZGlhZ19zdGF0ZXMmfihUQ1BGX0xJU1RFTnxUQ1BGX1NZTl9SRUNWKSkpCisJCXJldHVybiBza2ItPmxlbjsKKworCWZvciAoaSA9IHNfaTsgaSA8IHRjcF9laGFzaF9zaXplOyBpKyspIHsKKwkJc3RydWN0IHRjcF9laGFzaF9idWNrZXQgKmhlYWQgPSAmdGNwX2VoYXNoW2ldOworCQlzdHJ1Y3Qgc29jayAqc2s7CisJCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJCWlmIChpID4gc19pKQorCQkJc19udW0gPSAwOworCisJCXJlYWRfbG9ja19iaCgmaGVhZC0+bG9jayk7CisKKwkJbnVtID0gMDsKKwkJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZoZWFkLT5jaGFpbikgeworCQkJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCisJCQlpZiAobnVtIDwgc19udW0pCisJCQkJZ290byBuZXh0X25vcm1hbDsKKwkJCWlmICghKHItPnRjcGRpYWdfc3RhdGVzICYgKDEgPDwgc2stPnNrX3N0YXRlKSkpCisJCQkJZ290byBuZXh0X25vcm1hbDsKKwkJCWlmIChyLT5pZC50Y3BkaWFnX3Nwb3J0ICE9IGluZXQtPnNwb3J0ICYmCisJCQkgICAgci0+aWQudGNwZGlhZ19zcG9ydCkKKwkJCQlnb3RvIG5leHRfbm9ybWFsOworCQkJaWYgKHItPmlkLnRjcGRpYWdfZHBvcnQgIT0gaW5ldC0+ZHBvcnQgJiYgci0+aWQudGNwZGlhZ19kcG9ydCkKKwkJCQlnb3RvIG5leHRfbm9ybWFsOworCQkJaWYgKHRjcGRpYWdfZHVtcF9zb2NrKHNrYiwgc2ssIGNiKSA8IDApIHsKKwkJCQlyZWFkX3VubG9ja19iaCgmaGVhZC0+bG9jayk7CisJCQkJZ290byBkb25lOworCQkJfQorbmV4dF9ub3JtYWw6CisJCQkrK251bTsKKwkJfQorCisJCWlmIChyLT50Y3BkaWFnX3N0YXRlcyZUQ1BGX1RJTUVfV0FJVCkgeworCQkJc2tfZm9yX2VhY2goc2ssIG5vZGUsCisJCQkJICAgICZ0Y3BfZWhhc2hbaSArIHRjcF9laGFzaF9zaXplXS5jaGFpbikgeworCQkJCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKworCQkJCWlmIChudW0gPCBzX251bSkKKwkJCQkJZ290byBuZXh0X2R5aW5nOworCQkJCWlmIChyLT5pZC50Y3BkaWFnX3Nwb3J0ICE9IGluZXQtPnNwb3J0ICYmCisJCQkJICAgIHItPmlkLnRjcGRpYWdfc3BvcnQpCisJCQkJCWdvdG8gbmV4dF9keWluZzsKKwkJCQlpZiAoci0+aWQudGNwZGlhZ19kcG9ydCAhPSBpbmV0LT5kcG9ydCAmJgorCQkJCSAgICByLT5pZC50Y3BkaWFnX2Rwb3J0KQorCQkJCQlnb3RvIG5leHRfZHlpbmc7CisJCQkJaWYgKHRjcGRpYWdfZHVtcF9zb2NrKHNrYiwgc2ssIGNiKSA8IDApIHsKKwkJCQkJcmVhZF91bmxvY2tfYmgoJmhlYWQtPmxvY2spOworCQkJCQlnb3RvIGRvbmU7CisJCQkJfQorbmV4dF9keWluZzoKKwkJCQkrK251bTsKKwkJCX0KKwkJfQorCQlyZWFkX3VubG9ja19iaCgmaGVhZC0+bG9jayk7CisJfQorCitkb25lOgorCWNiLT5hcmdzWzFdID0gaTsKKwljYi0+YXJnc1syXSA9IG51bTsKKwlyZXR1cm4gc2tiLT5sZW47Cit9CisKK3N0YXRpYyBpbnQgdGNwZGlhZ19kdW1wX2RvbmUoc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBfX2lubGluZV9fIGludAordGNwZGlhZ19yY3ZfbXNnKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoKQoreworCWlmICghKG5saC0+bmxtc2dfZmxhZ3MmTkxNX0ZfUkVRVUVTVCkpCisJCXJldHVybiAwOworCisJaWYgKG5saC0+bmxtc2dfdHlwZSAhPSBUQ1BESUFHX0dFVFNPQ0spCisJCWdvdG8gZXJyX2ludmFsOworCisJaWYgKE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IHRjcGRpYWdyZXEpKSA+IHNrYi0+bGVuKQorCQlnb3RvIGVycl9pbnZhbDsKKworCWlmIChubGgtPm5sbXNnX2ZsYWdzJk5MTV9GX0RVTVApIHsKKwkJaWYgKG5saC0+bmxtc2dfbGVuID4gNCArIE5MTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3QgdGNwZGlhZ3JlcSkpKSB7CisJCQlzdHJ1Y3QgcnRhdHRyICpydGEgPSAoc3RydWN0IHJ0YXR0ciopKE5MTVNHX0RBVEEobmxoKSArIHNpemVvZihzdHJ1Y3QgdGNwZGlhZ3JlcSkpOworCQkJaWYgKHJ0YS0+cnRhX3R5cGUgIT0gVENQRElBR19SRVFfQllURUNPREUgfHwKKwkJCSAgICBydGEtPnJ0YV9sZW4gPCA4IHx8CisJCQkgICAgcnRhLT5ydGFfbGVuID4gbmxoLT5ubG1zZ19sZW4gLSBOTE1TR19TUEFDRShzaXplb2Yoc3RydWN0IHRjcGRpYWdyZXEpKSkKKwkJCQlnb3RvIGVycl9pbnZhbDsKKwkJCWlmICh0Y3BkaWFnX2JjX2F1ZGl0KFJUQV9EQVRBKHJ0YSksIFJUQV9QQVlMT0FEKHJ0YSkpKQorCQkJCWdvdG8gZXJyX2ludmFsOworCQl9CisJCXJldHVybiBuZXRsaW5rX2R1bXBfc3RhcnQodGNwbmwsIHNrYiwgbmxoLAorCQkJCQkgIHRjcGRpYWdfZHVtcCwKKwkJCQkJICB0Y3BkaWFnX2R1bXBfZG9uZSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHRjcGRpYWdfZ2V0X2V4YWN0KHNrYiwgbmxoKTsKKwl9CisKK2Vycl9pbnZhbDoKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgdGNwZGlhZ19yY3Zfc2tiKHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qgbmxtc2doZHIgKiBubGg7CisKKwlpZiAoc2tiLT5sZW4gPj0gTkxNU0dfU1BBQ0UoMCkpIHsKKwkJbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKXNrYi0+ZGF0YTsKKwkJaWYgKG5saC0+bmxtc2dfbGVuIDwgc2l6ZW9mKCpubGgpIHx8IHNrYi0+bGVuIDwgbmxoLT5ubG1zZ19sZW4pCisJCQlyZXR1cm47CisJCWVyciA9IHRjcGRpYWdfcmN2X21zZyhza2IsIG5saCk7CisJCWlmIChlcnIgfHwgbmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX0FDSykgCisJCQluZXRsaW5rX2Fjayhza2IsIG5saCwgZXJyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRjcGRpYWdfcmN2KHN0cnVjdCBzb2NrICpzaywgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKSAhPSBOVUxMKSB7CisJCXRjcGRpYWdfcmN2X3NrYihza2IpOworCQlrZnJlZV9za2Ioc2tiKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHRjcGRpYWdfaW5pdCh2b2lkKQoreworCXRjcG5sID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfVENQRElBRywgdGNwZGlhZ19yY3YpOworCWlmICh0Y3BubCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRjcGRpYWdfZXhpdCh2b2lkKQoreworCXNvY2tfcmVsZWFzZSh0Y3BubC0+c2tfc29ja2V0KTsKK30KKworbW9kdWxlX2luaXQodGNwZGlhZ19pbml0KTsKK21vZHVsZV9leGl0KHRjcGRpYWdfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaW5wdXQuYyBiL25ldC9pcHY0L3RjcF9pbnB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MDQ5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC90Y3BfaW5wdXQuYwpAQCAtMCwwICsxLDQ5NTkgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJSW1wbGVtZW50YXRpb24gb2YgdGhlIFRyYW5zbWlzc2lvbiBDb250cm9sIFByb3RvY29sKFRDUCkuCisgKgorICogVmVyc2lvbjoJJElkOiB0Y3BfaW5wdXQuYyx2IDEuMjQzIDIwMDIvMDIvMDEgMjI6MDE6MDQgZGF2ZW0gRXhwICQKKyAqCisgKiBBdXRob3JzOglSb3NzIEJpcm8sIDxiaXI3QGxlbGFuZC5TdGFuZm9yZC5FZHU+CisgKgkJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgkJTWFyayBFdmFucywgPGV2YW5zbXBAdWh1cmEuYXN0b24uYWMudWs+CisgKgkJQ29yZXkgTWlueWFyZCA8d2YtcmNoIW1pbnlhcmRAcmVsYXkuRVUubmV0PgorICoJCUZsb3JpYW4gTGEgUm9jaGUsIDxmbGxhQHN0dWQudW5pLXNiLmRlPgorICoJCUNoYXJsZXMgSGVkcmljaywgPGhlZHJpY2tAa2xpbnpoYWkucnV0Z2Vycy5lZHU+CisgKgkJTGludXMgVG9ydmFsZHMsIDx0b3J2YWxkc0Bjcy5oZWxzaW5raS5maT4KKyAqCQlBbGFuIENveCwgPGd3NHB0c0BndzRwdHMuYW1wci5vcmc+CisgKgkJTWF0dGhldyBEaWxsb24sIDxkaWxsb25AYXBvbGxvLndlc3Qub2ljLmNvbT4KKyAqCQlBcm50IEd1bGJyYW5kc2VuLCA8YWd1bGJyYUBudmcudW5pdC5ubz4KKyAqCQlKb3JnZSBDd2lrLCA8am9yZ2VAbGFzZXIuc2F0bGluay5uZXQ+CisgKi8KKworLyoKKyAqIENoYW5nZXM6CisgKgkJUGVkcm8gUm9xdWUJOglGYXN0IFJldHJhbnNtaXQvUmVjb3ZlcnkuCisgKgkJCQkJVHdvIHJlY2VpdmUgcXVldWVzLgorICoJCQkJCVJldHJhbnNtaXQgcXVldWUgaGFuZGxlZCBieSBUQ1AuCisgKgkJCQkJQmV0dGVyIHJldHJhbnNtaXQgdGltZXIgaGFuZGxpbmcuCisgKgkJCQkJTmV3IGNvbmdlc3Rpb24gYXZvaWRhbmNlLgorICoJCQkJCUhlYWRlciBwcmVkaWN0aW9uLgorICoJCQkJCVZhcmlhYmxlIHJlbmFtaW5nLgorICoKKyAqCQlFcmljCQk6CUZhc3QgUmV0cmFuc21pdC4KKyAqCQlSYW5keSBTY290dAk6CU1TUyBvcHRpb24gZGVmaW5lcy4KKyAqCQlFcmljIFNjaGVuawk6CUZpeGVzIHRvIHNsb3cgc3RhcnQgYWxnb3JpdGhtLgorICoJCUVyaWMgU2NoZW5rCToJWWV0IGFub3RoZXIgZG91YmxlIEFDSyBidWcuCisgKgkJRXJpYyBTY2hlbmsJOglEZWxheWVkIEFDSyBidWcgZml4ZXMuCisgKgkJRXJpYyBTY2hlbmsJOglGbG95ZCBzdHlsZSBmYXN0IHJldHJhbnMgd2FyIGF2b2lkYW5jZS4KKyAqCQlEYXZpZCBTLiBNaWxsZXIJOglEb24ndCBhbGxvdyB6ZXJvIGNvbmdlc3Rpb24gd2luZG93LgorICoJCUVyaWMgU2NoZW5rCToJRml4IHJldHJhbnNtaXR0ZXIgc28gdGhhdCBpdCBzZW5kcworICoJCQkJCW5leHQgcGFja2V0IG9uIGFjayBvZiBwcmV2aW91cyBwYWNrZXQuCisgKgkJQW5kaSBLbGVlbgk6CU1vdmVkIG9wZW5fcmVxdWVzdCBjaGVja2luZyBoZXJlCisgKgkJCQkJYW5kIHByb2Nlc3MgUlNUcyBmb3Igb3Blbl9yZXF1ZXN0cy4KKyAqCQlBbmRpIEtsZWVuCToJQmV0dGVyIHBydW5lX3F1ZXVlLCBhbmQgb3RoZXIgZml4ZXMuCisgKgkJQW5kcmV5IFNhdm9jaGtpbjoJRml4IFJUVCBtZWFzdXJlbWVudHMgaW4gdGhlIHByZXNuY2Ugb2YKKyAqCQkJCQl0aW1lc3RhbXBzLgorICoJCUFuZHJleSBTYXZvY2hraW46CUNoZWNrIHNlcXVlbmNlIG51bWJlcnMgY29ycmVjdGx5IHdoZW4KKyAqCQkJCQlyZW1vdmluZyBTQUNLcyBkdWUgdG8gaW4gc2VxdWVuY2UgaW5jb21pbmcKKyAqCQkJCQlkYXRhIHNlZ21lbnRzLgorICoJCUFuZGkgS2xlZW46CQlNYWtlIHN1cmUgd2UgbmV2ZXIgYWNrIGRhdGEgdGhlcmUgaXMgbm90CisgKgkJCQkJZW5vdWdoIHJvb20gZm9yLiBBbHNvIG1ha2UgdGhpcyBjb25kaXRpb24KKyAqCQkJCQlhIGZhdGFsIGVycm9yIGlmIGl0IG1pZ2h0IHN0aWxsIGhhcHBlbi4KKyAqCQlBbmRpIEtsZWVuOgkJQWRkIHRjcF9tZWFzdXJlX3Jjdl9tc3MgdG8gbWFrZSAKKyAqCQkJCQljb25uZWN0aW9ucyB3aXRoIE1TUzxtaW4oTVRVLGFubi4gTVNTKQorICoJCQkJCXdvcmsgd2l0aG91dCBkZWxheWVkIGFja3MuIAorICoJCUFuZGkgS2xlZW46CQlQcm9jZXNzIHBhY2tldHMgd2l0aCBQU0ggc2V0IGluIHRoZQorICoJCQkJCWZhc3QgcGF0aC4KKyAqCQlKIEhhZGkgU2FsaW06CQlFQ04gc3VwcG9ydAorICoJIAlBbmRyZWkgR3VydG92LAorICoJCVBhc2kgU2Fyb2xhaHRpLAorICoJCVBhbnUgS3VobGJlcmc6CQlFeHBlcmltZW50YWwgYXVkaXQgb2YgVENQIChyZSl0cmFuc21pc3Npb24KKyAqCQkJCQllbmdpbmUuIExvdHMgb2YgYnVncyBhcmUgZm91bmQuCisgKgkJUGFzaSBTYXJvbGFodGk6CQlGLVJUTyBmb3IgZGVhbGluZyB3aXRoIHNwdXJpb3VzIFJUT3MKKyAqCQlBbmdlbG8gRGVsbCdBZXJhOglUQ1AgV2VzdHdvb2QrIHN1cHBvcnQKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisjaW5jbHVkZSA8bmV0L2luZXRfY29tbW9uLmg+CisjaW5jbHVkZSA8bGludXgvaXBzZWMuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKK2ludCBzeXNjdGxfdGNwX3RpbWVzdGFtcHMgPSAxOworaW50IHN5c2N0bF90Y3Bfd2luZG93X3NjYWxpbmcgPSAxOworaW50IHN5c2N0bF90Y3Bfc2FjayA9IDE7CitpbnQgc3lzY3RsX3RjcF9mYWNrID0gMTsKK2ludCBzeXNjdGxfdGNwX3Jlb3JkZXJpbmcgPSBUQ1BfRkFTVFJFVFJBTlNfVEhSRVNIOworaW50IHN5c2N0bF90Y3BfZWNuOworaW50IHN5c2N0bF90Y3BfZHNhY2sgPSAxOworaW50IHN5c2N0bF90Y3BfYXBwX3dpbiA9IDMxOworaW50IHN5c2N0bF90Y3BfYWR2X3dpbl9zY2FsZSA9IDI7CisKK2ludCBzeXNjdGxfdGNwX3N0ZHVyZzsKK2ludCBzeXNjdGxfdGNwX3JmYzEzMzc7CitpbnQgc3lzY3RsX3RjcF9tYXhfb3JwaGFucyA9IE5SX0ZJTEU7CitpbnQgc3lzY3RsX3RjcF9mcnRvOworaW50IHN5c2N0bF90Y3Bfbm9tZXRyaWNzX3NhdmU7CitpbnQgc3lzY3RsX3RjcF93ZXN0d29vZDsKK2ludCBzeXNjdGxfdGNwX3ZlZ2FzX2NvbmdfYXZvaWQ7CisKK2ludCBzeXNjdGxfdGNwX21vZGVyYXRlX3JjdmJ1ZiA9IDE7CisKKy8qIERlZmF1bHQgdmFsdWVzIG9mIHRoZSBWZWdhcyB2YXJpYWJsZXMsIGluIGZpeGVkLXBvaW50IHJlcHJlc2VudGF0aW9uCisgKiB3aXRoIFZfUEFSQU1fU0hJRlQgYml0cyB0byB0aGUgcmlnaHQgb2YgdGhlIGJpbmFyeSBwb2ludC4KKyAqLworI2RlZmluZSBWX1BBUkFNX1NISUZUIDEKK2ludCBzeXNjdGxfdGNwX3ZlZ2FzX2FscGhhID0gMTw8Vl9QQVJBTV9TSElGVDsKK2ludCBzeXNjdGxfdGNwX3ZlZ2FzX2JldGEgID0gMzw8Vl9QQVJBTV9TSElGVDsKK2ludCBzeXNjdGxfdGNwX3ZlZ2FzX2dhbW1hID0gMTw8Vl9QQVJBTV9TSElGVDsKK2ludCBzeXNjdGxfdGNwX2JpYyA9IDE7CitpbnQgc3lzY3RsX3RjcF9iaWNfZmFzdF9jb252ZXJnZW5jZSA9IDE7CitpbnQgc3lzY3RsX3RjcF9iaWNfbG93X3dpbmRvdyA9IDE0OworaW50IHN5c2N0bF90Y3BfYmljX2JldGEgPSA4MTk7CQkvKiA9IDgxOS8xMDI0IChCSUNUQ1BfQkVUQV9TQ0FMRSkgKi8KKworI2RlZmluZSBGTEFHX0RBVEEJCTB4MDEgLyogSW5jb21pbmcgZnJhbWUgY29udGFpbmVkIGRhdGEuCQkqLworI2RlZmluZSBGTEFHX1dJTl9VUERBVEUJCTB4MDIgLyogSW5jb21pbmcgQUNLIHdhcyBhIHdpbmRvdyB1cGRhdGUuCSovCisjZGVmaW5lIEZMQUdfREFUQV9BQ0tFRAkJMHgwNCAvKiBUaGlzIEFDSyBhY2tub3dsZWRnZWQgbmV3IGRhdGEuCQkqLworI2RlZmluZSBGTEFHX1JFVFJBTlNfREFUQV9BQ0tFRAkweDA4IC8qICIiICIiIHNvbWUgb2Ygd2hpY2ggd2FzIHJldHJhbnNtaXR0ZWQuCSovCisjZGVmaW5lIEZMQUdfU1lOX0FDS0VECQkweDEwIC8qIFRoaXMgQUNLIGFja25vd2xlZGdlZCBTWU4uCQkqLworI2RlZmluZSBGTEFHX0RBVEFfU0FDS0VECTB4MjAgLyogTmV3IFNBQ0suCQkJCSovCisjZGVmaW5lIEZMQUdfRUNFCQkweDQwIC8qIEVDRSBpbiB0aGlzIEFDSwkJCQkqLworI2RlZmluZSBGTEFHX0RBVEFfTE9TVAkJMHg4MCAvKiBTQUNLIGRldGVjdGVkIGRhdGEgbG9zc2FnZS4JCSovCisjZGVmaW5lIEZMQUdfU0xPV1BBVEgJCTB4MTAwIC8qIERvIG5vdCBza2lwIFJGQyBjaGVja3MgZm9yIHdpbmRvdyB1cGRhdGUuKi8KKworI2RlZmluZSBGTEFHX0FDS0VECQkoRkxBR19EQVRBX0FDS0VEfEZMQUdfU1lOX0FDS0VEKQorI2RlZmluZSBGTEFHX05PVF9EVVAJCShGTEFHX0RBVEF8RkxBR19XSU5fVVBEQVRFfEZMQUdfQUNLRUQpCisjZGVmaW5lIEZMQUdfQ0FfQUxFUlQJCShGTEFHX0RBVEFfU0FDS0VEfEZMQUdfRUNFKQorI2RlZmluZSBGTEFHX0ZPUldBUkRfUFJPR1JFU1MJKEZMQUdfQUNLRUR8RkxBR19EQVRBX1NBQ0tFRCkKKworI2RlZmluZSBJc1Jlbm8odHApICgodHApLT5yeF9vcHQuc2Fja19vayA9PSAwKQorI2RlZmluZSBJc0ZhY2sodHApICgodHApLT5yeF9vcHQuc2Fja19vayAmIDIpCisjZGVmaW5lIElzRFNhY2sodHApICgodHApLT5yeF9vcHQuc2Fja19vayAmIDQpCisKKyNkZWZpbmUgVENQX1JFTU5BTlQgKFRDUF9GTEFHX0ZJTnxUQ1BfRkxBR19VUkd8VENQX0ZMQUdfU1lOfFRDUF9GTEFHX1BTSCkKKworLyogQWRhcHQgdGhlIE1TUyB2YWx1ZSB1c2VkIHRvIG1ha2UgZGVsYXllZCBhY2sgZGVjaXNpb24gdG8gdGhlIAorICogcmVhbCB3b3JsZC4KKyAqLyAKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfbWVhc3VyZV9yY3ZfbXNzKHN0cnVjdCB0Y3Bfc29jayAqdHAsCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgaW50IGxlbiwgbHNzOworCisJbHNzID0gdHAtPmFjay5sYXN0X3NlZ19zaXplOyAKKwl0cC0+YWNrLmxhc3Rfc2VnX3NpemUgPSAwOyAKKworCS8qIHNrYi0+bGVuIG1heSBqaXR0ZXIgYmVjYXVzZSBvZiBTQUNLcywgZXZlbiBpZiBwZWVyCisJICogc2VuZHMgZ29vZCBmdWxsLXNpemVkIGZyYW1lcy4KKwkgKi8KKwlsZW4gPSBza2ItPmxlbjsKKwlpZiAobGVuID49IHRwLT5hY2sucmN2X21zcykgeworCQl0cC0+YWNrLnJjdl9tc3MgPSBsZW47CisJfSBlbHNlIHsKKwkJLyogT3RoZXJ3aXNlLCB3ZSBtYWtlIG1vcmUgY2FyZWZ1bCBjaGVjayB0YWtpbmcgaW50byBhY2NvdW50LAorCQkgKiB0aGF0IFNBQ0tzIGJsb2NrIGlzIHZhcmlhYmxlLgorCQkgKgorCQkgKiAibGVuIiBpcyBpbnZhcmlhbnQgc2VnbWVudCBsZW5ndGgsIGluY2x1ZGluZyBUQ1AgaGVhZGVyLgorCQkgKi8KKwkJbGVuICs9IHNrYi0+ZGF0YSAtIHNrYi0+aC5yYXc7CisJCWlmIChsZW4gPj0gVENQX01JTl9SQ1ZNU1MgKyBzaXplb2Yoc3RydWN0IHRjcGhkcikgfHwKKwkJICAgIC8qIElmIFBTSCBpcyBub3Qgc2V0LCBwYWNrZXQgc2hvdWxkIGJlCisJCSAgICAgKiBmdWxsIHNpemVkLCBwcm92aWRlZCBwZWVyIFRDUCBpcyBub3QgYmFkbHkgYnJva2VuLgorCQkgICAgICogVGhpcyBvYnNlcnZhdGlvbiAoaWYgaXQgaXMgY29ycmVjdCA4KSkgYWxsb3dzCisJCSAgICAgKiB0byBoYW5kbGUgc3VwZXItbG93IG10dSBsaW5rcyBmYWlybHkuCisJCSAgICAgKi8KKwkJICAgIChsZW4gPj0gVENQX01JTl9NU1MgKyBzaXplb2Yoc3RydWN0IHRjcGhkcikgJiYKKwkJICAgICAhKHRjcF9mbGFnX3dvcmQoc2tiLT5oLnRoKSZUQ1BfUkVNTkFOVCkpKSB7CisJCQkvKiBTdWJ0cmFjdCBhbHNvIGludmFyaWFudCAoaWYgcGVlciBpcyBSRkMgY29tcGxpYW50KSwKKwkJCSAqIHRjcCBoZWFkZXIgcGx1cyBmaXhlZCB0aW1lc3RhbXAgb3B0aW9uIGxlbmd0aC4KKwkJCSAqIFJlc3VsdGluZyAibGVuIiBpcyBNU1MgZnJlZSBvZiBTQUNLIGppdHRlci4KKwkJCSAqLworCQkJbGVuIC09IHRwLT50Y3BfaGVhZGVyX2xlbjsKKwkJCXRwLT5hY2subGFzdF9zZWdfc2l6ZSA9IGxlbjsKKwkJCWlmIChsZW4gPT0gbHNzKSB7CisJCQkJdHAtPmFjay5yY3ZfbXNzID0gbGVuOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQl0cC0+YWNrLnBlbmRpbmcgfD0gVENQX0FDS19QVVNIRUQ7CisJfQorfQorCitzdGF0aWMgdm9pZCB0Y3BfaW5jcl9xdWlja2FjayhzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCXVuc2lnbmVkIHF1aWNrYWNrcyA9IHRwLT5yY3Zfd25kLygyKnRwLT5hY2sucmN2X21zcyk7CisKKwlpZiAocXVpY2thY2tzPT0wKQorCQlxdWlja2Fja3M9MjsKKwlpZiAocXVpY2thY2tzID4gdHAtPmFjay5xdWljaykKKwkJdHAtPmFjay5xdWljayA9IG1pbihxdWlja2Fja3MsIFRDUF9NQVhfUVVJQ0tBQ0tTKTsKK30KKwordm9pZCB0Y3BfZW50ZXJfcXVpY2thY2tfbW9kZShzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCXRjcF9pbmNyX3F1aWNrYWNrKHRwKTsKKwl0cC0+YWNrLnBpbmdwb25nID0gMDsKKwl0cC0+YWNrLmF0byA9IFRDUF9BVE9fTUlOOworfQorCisvKiBTZW5kIEFDS3MgcXVpY2tseSwgaWYgInF1aWNrIiBjb3VudCBpcyBub3QgZXhoYXVzdGVkCisgKiBhbmQgdGhlIHNlc3Npb24gaXMgbm90IGludGVyYWN0aXZlLgorICovCisKK3N0YXRpYyBfX2lubGluZV9fIGludCB0Y3BfaW5fcXVpY2thY2tfbW9kZShzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCXJldHVybiAodHAtPmFjay5xdWljayAmJiAhdHAtPmFjay5waW5ncG9uZyk7Cit9CisKKy8qIEJ1ZmZlciBzaXplIGFuZCBhZHZlcnRpc2VkIHdpbmRvdyB0dW5pbmcuCisgKgorICogMS4gVHVuaW5nIHNrLT5za19zbmRidWYsIHdoZW4gY29ubmVjdGlvbiBlbnRlcnMgZXN0YWJsaXNoZWQgc3RhdGUuCisgKi8KKworc3RhdGljIHZvaWQgdGNwX2ZpeHVwX3NuZGJ1ZihzdHJ1Y3Qgc29jayAqc2spCit7CisJaW50IHNuZG1lbSA9IHRjcF9zayhzayktPnJ4X29wdC5tc3NfY2xhbXAgKyBNQVhfVENQX0hFQURFUiArIDE2ICsKKwkJICAgICBzaXplb2Yoc3RydWN0IHNrX2J1ZmYpOworCisJaWYgKHNrLT5za19zbmRidWYgPCAzICogc25kbWVtKQorCQlzay0+c2tfc25kYnVmID0gbWluKDMgKiBzbmRtZW0sIHN5c2N0bF90Y3Bfd21lbVsyXSk7Cit9CisKKy8qIDIuIFR1bmluZyBhZHZlcnRpc2VkIHdpbmRvdyAod2luZG93X2NsYW1wLCByY3Zfc3N0aHJlc2gpCisgKgorICogQWxsIHRjcF9mdWxsX3NwYWNlKCkgaXMgc3BsaXQgdG8gdHdvIHBhcnRzOiAibmV0d29yayIgYnVmZmVyLCBhbGxvY2F0ZWQKKyAqIGZvcndhcmQgYW5kIGFkdmVydGlzZWQgaW4gcmVjZWl2ZXIgd2luZG93ICh0cC0+cmN2X3duZCkgYW5kCisgKiAiYXBwbGljYXRpb24gYnVmZmVyIiwgcmVxdWlyZWQgdG8gaXNvbGF0ZSBzY2hlZHVsaW5nL2FwcGxpY2F0aW9uCisgKiBsYXRlbmNpZXMgZnJvbSBuZXR3b3JrLgorICogd2luZG93X2NsYW1wIGlzIG1heGltYWwgYWR2ZXJ0aXNlZCB3aW5kb3cuIEl0IGNhbiBiZSBsZXNzIHRoYW4KKyAqIHRjcF9mdWxsX3NwYWNlKCksIGluIHRoaXMgY2FzZSB0Y3BfZnVsbF9zcGFjZSgpIC0gd2luZG93X2NsYW1wCisgKiBpcyByZXNlcnZlZCBmb3IgImFwcGxpY2F0aW9uIiBidWZmZXIuIFRoZSBsZXNzIHdpbmRvd19jbGFtcCBpcworICogdGhlIHNtb290aGVyIG91ciBiZWhhdmlvdXIgZnJvbSB2aWV3cG9pbnQgb2YgbmV0d29yaywgYnV0IHRoZSBsb3dlcgorICogdGhyb3VnaHB1dCBhbmQgdGhlIGhpZ2hlciBzZW5zaXRpdml0eSBvZiB0aGUgY29ubmVjdGlvbiB0byBsb3NzZXMuIDgpCisgKgorICogcmN2X3NzdGhyZXNoIGlzIG1vcmUgc3RyaWN0IHdpbmRvd19jbGFtcCB1c2VkIGF0ICJzbG93IHN0YXJ0IgorICogcGhhc2UgdG8gcHJlZGljdCBmdXJ0aGVyIGJlaGF2aW91ciBvZiB0aGlzIGNvbm5lY3Rpb24uCisgKiBJdCBpcyB1c2VkIGZvciB0d28gZ29hbHM6CisgKiAtIHRvIGVuZm9yY2UgaGVhZGVyIHByZWRpY3Rpb24gYXQgc2VuZGVyLCBldmVuIHdoZW4gYXBwbGljYXRpb24KKyAqICAgcmVxdWlyZXMgc29tZSBzaWduaWZpY2FudCAiYXBwbGljYXRpb24gYnVmZmVyIi4gSXQgaXMgY2hlY2sgIzEuCisgKiAtIHRvIHByZXZlbnQgcHJ1bmluZyBvZiByZWNlaXZlIHF1ZXVlIGJlY2F1c2Ugb2YgbWlzcHJlZGljdGlvbgorICogICBvZiByZWNlaXZlciB3aW5kb3cuIENoZWNrICMyLgorICoKKyAqIFRoZSBzY2hlbWUgZG9lcyBub3Qgd29yayB3aGVuIHNlbmRlciBzZW5kcyBnb29kIHNlZ21lbnRzIG9wZW5pbmcKKyAqIHdpbmRvdyBhbmQgdGhlbiBzdGFydHMgdG8gZmVlZCB1cyBzcGFnZXR0aS4gQnV0IGl0IHNob3VsZCB3b3JrCisgKiBpbiBjb21tb24gc2l0dWF0aW9ucy4gT3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIHJlbHkgb24gcXVldWUgY29sbGFwc2luZy4KKyAqLworCisvKiBTbG93IHBhcnQgb2YgY2hlY2sjMi4gKi8KK3N0YXRpYyBpbnQgX190Y3BfZ3Jvd193aW5kb3coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLAorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCS8qIE9wdGltaXplIHRoaXMhICovCisJaW50IHRydWVzaXplID0gdGNwX3dpbl9mcm9tX3NwYWNlKHNrYi0+dHJ1ZXNpemUpLzI7CisJaW50IHdpbmRvdyA9IHRjcF9mdWxsX3NwYWNlKHNrKS8yOworCisJd2hpbGUgKHRwLT5yY3Zfc3N0aHJlc2ggPD0gd2luZG93KSB7CisJCWlmICh0cnVlc2l6ZSA8PSBza2ItPmxlbikKKwkJCXJldHVybiAyKnRwLT5hY2sucmN2X21zczsKKworCQl0cnVlc2l6ZSA+Pj0gMTsKKwkJd2luZG93ID4+PSAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjcF9ncm93X3dpbmRvdyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHAsCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKiBDaGVjayAjMSAqLworCWlmICh0cC0+cmN2X3NzdGhyZXNoIDwgdHAtPndpbmRvd19jbGFtcCAmJgorCSAgICAoaW50KXRwLT5yY3Zfc3N0aHJlc2ggPCB0Y3Bfc3BhY2Uoc2spICYmCisJICAgICF0Y3BfbWVtb3J5X3ByZXNzdXJlKSB7CisJCWludCBpbmNyOworCisJCS8qIENoZWNrICMyLiBJbmNyZWFzZSB3aW5kb3csIGlmIHNrYiB3aXRoIHN1Y2ggb3ZlcmhlYWQKKwkJICogd2lsbCBmaXQgdG8gcmN2YnVmIGluIGZ1dHVyZS4KKwkJICovCisJCWlmICh0Y3Bfd2luX2Zyb21fc3BhY2Uoc2tiLT50cnVlc2l6ZSkgPD0gc2tiLT5sZW4pCisJCQlpbmNyID0gMip0cC0+YWR2bXNzOworCQllbHNlCisJCQlpbmNyID0gX190Y3BfZ3Jvd193aW5kb3coc2ssIHRwLCBza2IpOworCisJCWlmIChpbmNyKSB7CisJCQl0cC0+cmN2X3NzdGhyZXNoID0gbWluKHRwLT5yY3Zfc3N0aHJlc2ggKyBpbmNyLCB0cC0+d2luZG93X2NsYW1wKTsKKwkJCXRwLT5hY2sucXVpY2sgfD0gMTsKKwkJfQorCX0KK30KKworLyogMy4gVHVuaW5nIHJjdmJ1Ziwgd2hlbiBjb25uZWN0aW9uIGVudGVycyBlc3RhYmxpc2hlZCBzdGF0ZS4gKi8KKworc3RhdGljIHZvaWQgdGNwX2ZpeHVwX3JjdmJ1ZihzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJaW50IHJjdm1lbSA9IHRwLT5hZHZtc3MgKyBNQVhfVENQX0hFQURFUiArIDE2ICsgc2l6ZW9mKHN0cnVjdCBza19idWZmKTsKKworCS8qIFRyeSB0byBzZWxlY3QgcmN2YnVmIHNvIHRoYXQgNCBtc3Mtc2l6ZWQgc2VnbWVudHMKKwkgKiB3aWxsIGZpdCB0byB3aW5kb3cgYW5kIGNvcnJlc3BvZGluZyBza2JzIHdpbGwgZml0IHRvIG91ciByY3ZidWYuCisJICogKHdhcyAzOyA0IGlzIG1pbmltdW0gdG8gYWxsb3cgZmFzdCByZXRyYW5zbWl0IHRvIHdvcmsuKQorCSAqLworCXdoaWxlICh0Y3Bfd2luX2Zyb21fc3BhY2UocmN2bWVtKSA8IHRwLT5hZHZtc3MpCisJCXJjdm1lbSArPSAxMjg7CisJaWYgKHNrLT5za19yY3ZidWYgPCA0ICogcmN2bWVtKQorCQlzay0+c2tfcmN2YnVmID0gbWluKDQgKiByY3ZtZW0sIHN5c2N0bF90Y3Bfcm1lbVsyXSk7Cit9CisKKy8qIDQuIFRyeSB0byBmaXh1cCBhbGwuIEl0IGlzIG1hZGUgaWltZWRpYXRlbHkgYWZ0ZXIgY29ubmVjdGlvbiBlbnRlcnMKKyAqICAgIGVzdGFibGlzaGVkIHN0YXRlLgorICovCitzdGF0aWMgdm9pZCB0Y3BfaW5pdF9idWZmZXJfc3BhY2Uoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCWludCBtYXh3aW47CisKKwlpZiAoIShzay0+c2tfdXNlcmxvY2tzICYgU09DS19SQ1ZCVUZfTE9DSykpCisJCXRjcF9maXh1cF9yY3ZidWYoc2spOworCWlmICghKHNrLT5za191c2VybG9ja3MgJiBTT0NLX1NOREJVRl9MT0NLKSkKKwkJdGNwX2ZpeHVwX3NuZGJ1Zihzayk7CisKKwl0cC0+cmN2cV9zcGFjZS5zcGFjZSA9IHRwLT5yY3Zfd25kOworCisJbWF4d2luID0gdGNwX2Z1bGxfc3BhY2Uoc2spOworCisJaWYgKHRwLT53aW5kb3dfY2xhbXAgPj0gbWF4d2luKSB7CisJCXRwLT53aW5kb3dfY2xhbXAgPSBtYXh3aW47CisKKwkJaWYgKHN5c2N0bF90Y3BfYXBwX3dpbiAmJiBtYXh3aW4gPiA0ICogdHAtPmFkdm1zcykKKwkJCXRwLT53aW5kb3dfY2xhbXAgPSBtYXgobWF4d2luIC0KKwkJCQkJICAgICAgIChtYXh3aW4gPj4gc3lzY3RsX3RjcF9hcHBfd2luKSwKKwkJCQkJICAgICAgIDQgKiB0cC0+YWR2bXNzKTsKKwl9CisKKwkvKiBGb3JjZSByZXNlcnZhdGlvbiBvZiBvbmUgc2VnbWVudC4gKi8KKwlpZiAoc3lzY3RsX3RjcF9hcHBfd2luICYmCisJICAgIHRwLT53aW5kb3dfY2xhbXAgPiAyICogdHAtPmFkdm1zcyAmJgorCSAgICB0cC0+d2luZG93X2NsYW1wICsgdHAtPmFkdm1zcyA+IG1heHdpbikKKwkJdHAtPndpbmRvd19jbGFtcCA9IG1heCgyICogdHAtPmFkdm1zcywgbWF4d2luIC0gdHAtPmFkdm1zcyk7CisKKwl0cC0+cmN2X3NzdGhyZXNoID0gbWluKHRwLT5yY3Zfc3N0aHJlc2gsIHRwLT53aW5kb3dfY2xhbXApOworCXRwLT5zbmRfY3duZF9zdGFtcCA9IHRjcF90aW1lX3N0YW1wOworfQorCitzdGF0aWMgdm9pZCBpbml0X2JpY3RjcChzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCXRwLT5iaWN0Y3AuY250ID0gMDsKKworCXRwLT5iaWN0Y3AubGFzdF9tYXhfY3duZCA9IDA7CisJdHAtPmJpY3RjcC5sYXN0X2N3bmQgPSAwOworCXRwLT5iaWN0Y3AubGFzdF9zdGFtcCA9IDA7Cit9CisKKy8qIDUuIFJlY2FsY3VsYXRlIHdpbmRvdyBjbGFtcCBhZnRlciBzb2NrZXQgaGl0IGl0cyBtZW1vcnkgYm91bmRzLiAqLworc3RhdGljIHZvaWQgdGNwX2NsYW1wX3dpbmRvdyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBpbnQgYXBwX3dpbiA9IHRwLT5yY3Zfbnh0IC0gdHAtPmNvcGllZF9zZXE7CisJaW50IG9mb193aW4gPSAwOworCisJdHAtPmFjay5xdWljayA9IDA7CisKKwlza2JfcXVldWVfd2FsaygmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSwgc2tiKSB7CisJCW9mb193aW4gKz0gc2tiLT5sZW47CisJfQorCisJLyogSWYgb3ZlcmNvbW1pdCBpcyBkdWUgdG8gb3V0IG9mIG9yZGVyIHNlZ21lbnRzLAorCSAqIGRvIG5vdCBjbGFtcCB3aW5kb3cuIFRyeSB0byBleHBhbmQgcmN2YnVmIGluc3RlYWQuCisJICovCisJaWYgKG9mb193aW4pIHsKKwkJaWYgKHNrLT5za19yY3ZidWYgPCBzeXNjdGxfdGNwX3JtZW1bMl0gJiYKKwkJICAgICEoc2stPnNrX3VzZXJsb2NrcyAmIFNPQ0tfUkNWQlVGX0xPQ0spICYmCisJCSAgICAhdGNwX21lbW9yeV9wcmVzc3VyZSAmJgorCQkgICAgYXRvbWljX3JlYWQoJnRjcF9tZW1vcnlfYWxsb2NhdGVkKSA8IHN5c2N0bF90Y3BfbWVtWzBdKQorCQkJc2stPnNrX3JjdmJ1ZiA9IG1pbihhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpLAorCQkJCQkgICAgc3lzY3RsX3RjcF9ybWVtWzJdKTsKKwl9CisJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPiBzay0+c2tfcmN2YnVmKSB7CisJCWFwcF93aW4gKz0gb2ZvX3dpbjsKKwkJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPj0gMiAqIHNrLT5za19yY3ZidWYpCisJCQlhcHBfd2luID4+PSAxOworCQlpZiAoYXBwX3dpbiA+IHRwLT5hY2sucmN2X21zcykKKwkJCWFwcF93aW4gLT0gdHAtPmFjay5yY3ZfbXNzOworCQlhcHBfd2luID0gbWF4KGFwcF93aW4sIDJVKnRwLT5hZHZtc3MpOworCisJCWlmICghb2ZvX3dpbikKKwkJCXRwLT53aW5kb3dfY2xhbXAgPSBtaW4odHAtPndpbmRvd19jbGFtcCwgYXBwX3dpbik7CisJCXRwLT5yY3Zfc3N0aHJlc2ggPSBtaW4odHAtPndpbmRvd19jbGFtcCwgMlUqdHAtPmFkdm1zcyk7CisJfQorfQorCisvKiBSZWNlaXZlciAiYXV0b3R1bmluZyIgY29kZS4KKyAqCisgKiBUaGUgYWxnb3JpdGhtIGZvciBSVFQgZXN0aW1hdGlvbiB3L28gdGltZXN0YW1wcyBpcyBiYXNlZCBvbgorICogRHluYW1pYyBSaWdodC1TaXppbmcgKERSUykgYnkgV3UgRmVuZyBhbmQgTWlrZSBGaXNrIG9mIExBTkwuCisgKiA8aHR0cDovL3d3dy5sYW5sLmdvdi9yYWRpYW50L3dlYnNpdGUvcHVicy9kcnMvbGFjc2kyMDAxLnBzPgorICoKKyAqIE1vcmUgZGV0YWlsIG9uIHRoaXMgY29kZSBjYW4gYmUgZm91bmQgYXQKKyAqIDxodHRwOi8vd3d3LnBzYy5lZHUvfmpoZWZmbmVyL3Nlbmlvcl90aGVzaXMucHM+LAorICogdGhvdWdoIHRoaXMgcmVmZXJlbmNlIGlzIG91dCBvZiBkYXRlLiAgQSBuZXcgcGFwZXIKKyAqIGlzIHBlbmRpbmcuCisgKi8KK3N0YXRpYyB2b2lkIHRjcF9yY3ZfcnR0X3VwZGF0ZShzdHJ1Y3QgdGNwX3NvY2sgKnRwLCB1MzIgc2FtcGxlLCBpbnQgd2luX2RlcCkKK3sKKwl1MzIgbmV3X3NhbXBsZSA9IHRwLT5yY3ZfcnR0X2VzdC5ydHQ7CisJbG9uZyBtID0gc2FtcGxlOworCisJaWYgKG0gPT0gMCkKKwkJbSA9IDE7CisKKwlpZiAobmV3X3NhbXBsZSAhPSAwKSB7CisJCS8qIElmIHdlIHNhbXBsZSBpbiBsYXJnZXIgc2FtcGxlcyBpbiB0aGUgbm9uLXRpbWVzdGFtcAorCQkgKiBjYXNlLCB3ZSBjb3VsZCBncm9zc2x5IG92ZXJlc3RpbWF0ZSB0aGUgUlRUIGVzcGVjaWFsbHkKKwkJICogd2l0aCBjaGF0dHkgYXBwbGljYXRpb25zIG9yIGJ1bGsgdHJhbnNmZXIgYXBwcyB3aGljaAorCQkgKiBhcmUgc3RhbGxlZCBvbiBmaWxlc3lzdGVtIEkvTy4KKwkJICoKKwkJICogQWxzbywgc2luY2Ugd2UgYXJlIG9ubHkgZ29pbmcgZm9yIGEgbWluaW11bSBpbiB0aGUKKwkJICogbm9uLXRpbWVzdGFtcCBjYXNlLCB3ZSBkbyBub3Qgc21vb3RoZSB0aGluZ3Mgb3V0CisJCSAqIGVsc2Ugd2l0aCB0aW1lc3RhbXBzIGRpc2FibGVkIGNvbnZlcmdhbmNlIHRha2VzIHRvbworCQkgKiBsb25nLgorCQkgKi8KKwkJaWYgKCF3aW5fZGVwKSB7CisJCQltIC09IChuZXdfc2FtcGxlID4+IDMpOworCQkJbmV3X3NhbXBsZSArPSBtOworCQl9IGVsc2UgaWYgKG0gPCBuZXdfc2FtcGxlKQorCQkJbmV3X3NhbXBsZSA9IG0gPDwgMzsKKwl9IGVsc2UgeworCQkvKiBObyBwcmV2aW91cyBtZXNhdXJlLiAqLworCQluZXdfc2FtcGxlID0gbSA8PCAzOworCX0KKworCWlmICh0cC0+cmN2X3J0dF9lc3QucnR0ICE9IG5ld19zYW1wbGUpCisJCXRwLT5yY3ZfcnR0X2VzdC5ydHQgPSBuZXdfc2FtcGxlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNwX3Jjdl9ydHRfbWVhc3VyZShzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCWlmICh0cC0+cmN2X3J0dF9lc3QudGltZSA9PSAwKQorCQlnb3RvIG5ld19tZWFzdXJlOworCWlmIChiZWZvcmUodHAtPnJjdl9ueHQsIHRwLT5yY3ZfcnR0X2VzdC5zZXEpKQorCQlyZXR1cm47CisJdGNwX3Jjdl9ydHRfdXBkYXRlKHRwLAorCQkJICAgamlmZmllcyAtIHRwLT5yY3ZfcnR0X2VzdC50aW1lLAorCQkJICAgMSk7CisKK25ld19tZWFzdXJlOgorCXRwLT5yY3ZfcnR0X2VzdC5zZXEgPSB0cC0+cmN2X254dCArIHRwLT5yY3Zfd25kOworCXRwLT5yY3ZfcnR0X2VzdC50aW1lID0gdGNwX3RpbWVfc3RhbXA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfcmN2X3J0dF9tZWFzdXJlX3RzKHN0cnVjdCB0Y3Bfc29jayAqdHAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKHRwLT5yeF9vcHQucmN2X3RzZWNyICYmCisJICAgIChUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEgLQorCSAgICAgVENQX1NLQl9DQihza2IpLT5zZXEgPj0gdHAtPmFjay5yY3ZfbXNzKSkKKwkJdGNwX3Jjdl9ydHRfdXBkYXRlKHRwLCB0Y3BfdGltZV9zdGFtcCAtIHRwLT5yeF9vcHQucmN2X3RzZWNyLCAwKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBldmVyeSB0aW1lIGRhdGEgaXMgY29waWVkIHRvIHVzZXIgc3BhY2UuCisgKiBJdCBjYWxjdWxhdGVzIHRoZSBhcHByb3ByaWF0ZSBUQ1AgcmVjZWl2ZSBidWZmZXIgc3BhY2UuCisgKi8KK3ZvaWQgdGNwX3Jjdl9zcGFjZV9hZGp1c3Qoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCWludCB0aW1lOworCWludCBzcGFjZTsKKwkKKwlpZiAodHAtPnJjdnFfc3BhY2UudGltZSA9PSAwKQorCQlnb3RvIG5ld19tZWFzdXJlOworCQorCXRpbWUgPSB0Y3BfdGltZV9zdGFtcCAtIHRwLT5yY3ZxX3NwYWNlLnRpbWU7CisJaWYgKHRpbWUgPCAodHAtPnJjdl9ydHRfZXN0LnJ0dCA+PiAzKSB8fAorCSAgICB0cC0+cmN2X3J0dF9lc3QucnR0ID09IDApCisJCXJldHVybjsKKwkKKwlzcGFjZSA9IDIgKiAodHAtPmNvcGllZF9zZXEgLSB0cC0+cmN2cV9zcGFjZS5zZXEpOworCisJc3BhY2UgPSBtYXgodHAtPnJjdnFfc3BhY2Uuc3BhY2UsIHNwYWNlKTsKKworCWlmICh0cC0+cmN2cV9zcGFjZS5zcGFjZSAhPSBzcGFjZSkgeworCQlpbnQgcmN2bWVtOworCisJCXRwLT5yY3ZxX3NwYWNlLnNwYWNlID0gc3BhY2U7CisKKwkJaWYgKHN5c2N0bF90Y3BfbW9kZXJhdGVfcmN2YnVmKSB7CisJCQlpbnQgbmV3X2NsYW1wID0gc3BhY2U7CisKKwkJCS8qIFJlY2VpdmUgc3BhY2UgZ3Jvd3MsIG5vcm1hbGl6ZSBpbiBvcmRlciB0bworCQkJICogdGFrZSBpbnRvIGFjY291bnQgcGFja2V0IGhlYWRlcnMgYW5kIHNrX2J1ZmYKKwkJCSAqIHN0cnVjdHVyZSBvdmVyaGVhZC4KKwkJCSAqLworCQkJc3BhY2UgLz0gdHAtPmFkdm1zczsKKwkJCWlmICghc3BhY2UpCisJCQkJc3BhY2UgPSAxOworCQkJcmN2bWVtID0gKHRwLT5hZHZtc3MgKyBNQVhfVENQX0hFQURFUiArCisJCQkJICAxNiArIHNpemVvZihzdHJ1Y3Qgc2tfYnVmZikpOworCQkJd2hpbGUgKHRjcF93aW5fZnJvbV9zcGFjZShyY3ZtZW0pIDwgdHAtPmFkdm1zcykKKwkJCQlyY3ZtZW0gKz0gMTI4OworCQkJc3BhY2UgKj0gcmN2bWVtOworCQkJc3BhY2UgPSBtaW4oc3BhY2UsIHN5c2N0bF90Y3Bfcm1lbVsyXSk7CisJCQlpZiAoc3BhY2UgPiBzay0+c2tfcmN2YnVmKSB7CisJCQkJc2stPnNrX3JjdmJ1ZiA9IHNwYWNlOworCisJCQkJLyogTWFrZSB0aGUgd2luZG93IGNsYW1wIGZvbGxvdyBhbG9uZy4gICovCisJCQkJdHAtPndpbmRvd19jbGFtcCA9IG5ld19jbGFtcDsKKwkJCX0KKwkJfQorCX0KKwkKK25ld19tZWFzdXJlOgorCXRwLT5yY3ZxX3NwYWNlLnNlcSA9IHRwLT5jb3BpZWRfc2VxOworCXRwLT5yY3ZxX3NwYWNlLnRpbWUgPSB0Y3BfdGltZV9zdGFtcDsKK30KKworLyogVGhlcmUgaXMgc29tZXRoaW5nIHdoaWNoIHlvdSBtdXN0IGtlZXAgaW4gbWluZCB3aGVuIHlvdSBhbmFseXplIHRoZQorICogYmVoYXZpb3Igb2YgdGhlIHRwLT5hdG8gZGVsYXllZCBhY2sgdGltZW91dCBpbnRlcnZhbC4gIFdoZW4gYQorICogY29ubmVjdGlvbiBzdGFydHMgdXAsIHdlIHdhbnQgdG8gYWNrIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuICBUaGUKKyAqIHByb2JsZW0gaXMgdGhhdCAiZ29vZCIgVENQJ3MgZG8gc2xvdyBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIGRhdGEKKyAqIHRyYW5zbWlzc2lvbi4gIFRoZSBtZWFucyB0aGF0IHVudGlsIHdlIHNlbmQgdGhlIGZpcnN0IGZldyBBQ0sncyB0aGUKKyAqIHNlbmRlciB3aWxsIHNpdCBvbiBoaXMgZW5kIGFuZCBvbmx5IHF1ZXVlIG1vc3Qgb2YgaGlzIGRhdGEsIGJlY2F1c2UKKyAqIGhlIGNhbiBvbmx5IHNlbmQgc25kX2N3bmQgdW5hY2tlZCBwYWNrZXRzIGF0IGFueSBnaXZlbiB0aW1lLiAgRm9yCisgKiBlYWNoIEFDSyB3ZSBzZW5kLCBoZSBpbmNyZW1lbnRzIHNuZF9jd25kIGFuZCB0cmFuc21pdHMgbW9yZSBvZiBoaXMKKyAqIHF1ZXVlLiAgLURhdmVNCisgKi8KK3N0YXRpYyB2b2lkIHRjcF9ldmVudF9kYXRhX3JlY3Yoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXUzMiBub3c7CisKKwl0Y3Bfc2NoZWR1bGVfYWNrKHRwKTsKKworCXRjcF9tZWFzdXJlX3Jjdl9tc3ModHAsIHNrYik7CisKKwl0Y3BfcmN2X3J0dF9tZWFzdXJlKHRwKTsKKwkKKwlub3cgPSB0Y3BfdGltZV9zdGFtcDsKKworCWlmICghdHAtPmFjay5hdG8pIHsKKwkJLyogVGhlIF9maXJzdF8gZGF0YSBwYWNrZXQgcmVjZWl2ZWQsIGluaXRpYWxpemUKKwkJICogZGVsYXllZCBBQ0sgZW5naW5lLgorCQkgKi8KKwkJdGNwX2luY3JfcXVpY2thY2sodHApOworCQl0cC0+YWNrLmF0byA9IFRDUF9BVE9fTUlOOworCX0gZWxzZSB7CisJCWludCBtID0gbm93IC0gdHAtPmFjay5scmN2dGltZTsKKworCQlpZiAobSA8PSBUQ1BfQVRPX01JTi8yKSB7CisJCQkvKiBUaGUgZmFzdGVzdCBjYXNlIGlzIHRoZSBmaXJzdC4gKi8KKwkJCXRwLT5hY2suYXRvID0gKHRwLT5hY2suYXRvPj4xKSArIFRDUF9BVE9fTUlOLzI7CisJCX0gZWxzZSBpZiAobSA8IHRwLT5hY2suYXRvKSB7CisJCQl0cC0+YWNrLmF0byA9ICh0cC0+YWNrLmF0bz4+MSkgKyBtOworCQkJaWYgKHRwLT5hY2suYXRvID4gdHAtPnJ0bykKKwkJCQl0cC0+YWNrLmF0byA9IHRwLT5ydG87CisJCX0gZWxzZSBpZiAobSA+IHRwLT5ydG8pIHsKKwkJCS8qIFRvbyBsb25nIGdhcC4gQXBwYXJlbnRseSBzZW5kZXIgZmFsbGVkIHRvCisJCQkgKiByZXN0YXJ0IHdpbmRvdywgc28gdGhhdCB3ZSBzZW5kIEFDS3MgcXVpY2tseS4KKwkJCSAqLworCQkJdGNwX2luY3JfcXVpY2thY2sodHApOworCQkJc2tfc3RyZWFtX21lbV9yZWNsYWltKHNrKTsKKwkJfQorCX0KKwl0cC0+YWNrLmxyY3Z0aW1lID0gbm93OworCisJVENQX0VDTl9jaGVja19jZSh0cCwgc2tiKTsKKworCWlmIChza2ItPmxlbiA+PSAxMjgpCisJCXRjcF9ncm93X3dpbmRvdyhzaywgdHAsIHNrYik7Cit9CisKKy8qIFdoZW4gc3RhcnRpbmcgYSBuZXcgY29ubmVjdGlvbiwgcGluIGRvd24gdGhlIGN1cnJlbnQgY2hvaWNlIG9mIAorICogY29uZ2VzdGlvbiBhbGdvcml0aG0uCisgKi8KK3ZvaWQgdGNwX2NhX2luaXQoc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwlpZiAoc3lzY3RsX3RjcF93ZXN0d29vZCkgCisJCXRwLT5hZHZfY29uZyA9IFRDUF9XRVNUV09PRDsKKwllbHNlIGlmIChzeXNjdGxfdGNwX2JpYykKKwkJdHAtPmFkdl9jb25nID0gVENQX0JJQzsKKwllbHNlIGlmIChzeXNjdGxfdGNwX3ZlZ2FzX2NvbmdfYXZvaWQpIHsKKwkJdHAtPmFkdl9jb25nID0gVENQX1ZFR0FTOworCQl0cC0+dmVnYXMuYmFzZVJUVCA9IDB4N2ZmZmZmZmY7CisJCXRjcF92ZWdhc19lbmFibGUodHApOworCX0gCit9CisKKy8qIERvIFJUVCBzYW1wbGluZyBuZWVkZWQgZm9yIFZlZ2FzLgorICogQmFzaWNhbGx5IHdlOgorICogICBvIG1pbi1maWx0ZXIgUlRUIHNhbXBsZXMgZnJvbSB3aXRoaW4gYW4gUlRUIHRvIGdldCB0aGUgY3VycmVudAorICogICAgIHByb3BhZ2F0aW9uIGRlbGF5ICsgcXVldWluZyBkZWxheSAod2UgYXJlIG1pbi1maWx0ZXJpbmcgdG8gdHJ5IHRvCisgKiAgICAgYXZvaWQgdGhlIGVmZmVjdHMgb2YgZGVsYXllZCBBQ0tzKQorICogICBvIG1pbi1maWx0ZXIgUlRUIHNhbXBsZXMgZnJvbSBhIG11Y2ggbG9uZ2VyIHdpbmRvdyAoZm9yZXZlciBmb3Igbm93KQorICogICAgIHRvIGZpbmQgdGhlIHByb3BhZ2F0aW9uIGRlbGF5IChiYXNlUlRUKQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdmVnYXNfcnR0X2NhbGMoc3RydWN0IHRjcF9zb2NrICp0cCwgX191MzIgcnR0KQoreworCV9fdTMyIHZydHQgPSBydHQgKyAxOyAvKiBOZXZlciBhbGxvdyB6ZXJvIHJ0dCBvciBiYXNlUlRUICovCisKKwkvKiBGaWx0ZXIgdG8gZmluZCBwcm9wYWdhdGlvbiBkZWxheTogKi8KKwlpZiAodnJ0dCA8IHRwLT52ZWdhcy5iYXNlUlRUKSAKKwkJdHAtPnZlZ2FzLmJhc2VSVFQgPSB2cnR0OworCisJLyogRmluZCB0aGUgbWluIFJUVCBkdXJpbmcgdGhlIGxhc3QgUlRUIHRvIGZpbmQKKwkgKiB0aGUgY3VycmVudCBwcm9wLiBkZWxheSArIHF1ZXVpbmcgZGVsYXk6CisJICovCisJdHAtPnZlZ2FzLm1pblJUVCA9IG1pbih0cC0+dmVnYXMubWluUlRULCB2cnR0KTsKKwl0cC0+dmVnYXMuY250UlRUKys7Cit9CisKKy8qIENhbGxlZCB0byBjb21wdXRlIGEgc21vb3RoZWQgcnR0IGVzdGltYXRlLiBUaGUgZGF0YSBmZWQgdG8gdGhpcworICogcm91dGluZSBlaXRoZXIgY29tZXMgZnJvbSB0aW1lc3RhbXBzLCBvciBmcm9tIHNlZ21lbnRzIHRoYXQgd2VyZQorICoga25vd24gX25vdF8gdG8gaGF2ZSBiZWVuIHJldHJhbnNtaXR0ZWQgW3NlZSBLYXJuL1BhcnRyaWRnZQorICogUHJvY2VlZGluZ3MgU0lHQ09NTSA4N10uIFRoZSBhbGdvcml0aG0gaXMgZnJvbSB0aGUgU0lHQ09NTSA4OAorICogcGllY2UgYnkgVmFuIEphY29ic29uLgorICogTk9URTogdGhlIG5leHQgdGhyZWUgcm91dGluZXMgdXNlZCB0byBiZSBvbmUgYmlnIHJvdXRpbmUuCisgKiBUbyBzYXZlIGN5Y2xlcyBpbiB0aGUgUkZDIDEzMjMgaW1wbGVtZW50YXRpb24gaXQgd2FzIGJldHRlciB0byBicmVhaworICogaXQgdXAgaW50byB0aHJlZSBwcm9jZWR1cmVzLiAtLSBlcmljcworICovCitzdGF0aWMgdm9pZCB0Y3BfcnR0X2VzdGltYXRvcihzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBfX3UzMiBtcnR0KQoreworCWxvbmcgbSA9IG1ydHQ7IC8qIFJUVCAqLworCisJaWYgKHRjcF92ZWdhc19lbmFibGVkKHRwKSkKKwkJdmVnYXNfcnR0X2NhbGModHAsIG1ydHQpOworCisJLyoJVGhlIGZvbGxvd2luZyBhbXVzaW5nIGNvZGUgY29tZXMgZnJvbSBKYWNvYnNvbidzCisJICoJYXJ0aWNsZSBpbiBTSUdDT01NICc4OC4gIE5vdGUgdGhhdCBydHQgYW5kIG1kZXYKKwkgKglhcmUgc2NhbGVkIHZlcnNpb25zIG9mIHJ0dCBhbmQgbWVhbiBkZXZpYXRpb24uCisJICoJVGhpcyBpcyBkZXNpZ25lZCB0byBiZSBhcyBmYXN0IGFzIHBvc3NpYmxlIAorCSAqCW0gc3RhbmRzIGZvciAibWVhc3VyZW1lbnQiLgorCSAqCisJICoJT24gYSAxOTkwIHBhcGVyIHRoZSBydG8gdmFsdWUgaXMgY2hhbmdlZCB0bzoKKwkgKglSVE8gPSBydHQgKyA0ICogbWRldgorCSAqCisJICogRnVubnkuIFRoaXMgYWxnb3JpdGhtIHNlZW1zIHRvIGJlIHZlcnkgYnJva2VuLgorCSAqIFRoZXNlIGZvcm11bGFlIGluY3JlYXNlIFJUTywgd2hlbiBpdCBzaG91bGQgYmUgZGVjcmVhc2VkLCBpbmNyZWFzZQorCSAqIHRvbyBzbG93bHksIHdoZW4gaXQgc2hvdWxkIGJlIGluY3Jlc2VkIGZhc3RseSwgZGVjcmVhc2UgdG9vIGZhc3RseQorCSAqIGV0Yy4gSSBndWVzcyBpbiBCU0QgUlRPIHRha2VzIE9ORSB2YWx1ZSwgc28gdGhhdCBpdCBpcyBhYnNvbHV0ZWx5CisJICogZG9lcyBub3QgbWF0dGVyIGhvdyB0byBfY2FsY3VsYXRlXyBpdC4gU2VlbXMsIGl0IHdhcyB0cmFwCisJICogdGhhdCBWSiBmYWlsZWQgdG8gYXZvaWQuIDgpCisJICovCisJaWYobSA9PSAwKQorCQltID0gMTsKKwlpZiAodHAtPnNydHQgIT0gMCkgeworCQltIC09ICh0cC0+c3J0dCA+PiAzKTsJLyogbSBpcyBub3cgZXJyb3IgaW4gcnR0IGVzdCAqLworCQl0cC0+c3J0dCArPSBtOwkJLyogcnR0ID0gNy84IHJ0dCArIDEvOCBuZXcgKi8KKwkJaWYgKG0gPCAwKSB7CisJCQltID0gLW07CQkvKiBtIGlzIG5vdyBhYnMoZXJyb3IpICovCisJCQltIC09ICh0cC0+bWRldiA+PiAyKTsgICAvKiBzaW1pbGFyIHVwZGF0ZSBvbiBtZGV2ICovCisJCQkvKiBUaGlzIGlzIHNpbWlsYXIgdG8gb25lIG9mIEVpZmVsIGZpbmRpbmdzLgorCQkJICogRWlmZWwgYmxvY2tzIG1kZXYgdXBkYXRlcyB3aGVuIHJ0dCBkZWNyZWFzZXMuCisJCQkgKiBUaGlzIHNvbHV0aW9uIGlzIGEgYml0IGRpZmZlcmVudDogd2UgdXNlIGZpbmVyIGdhaW4KKwkJCSAqIGZvciBtZGV2IGluIHRoaXMgY2FzZSAoYWxwaGEqYmV0YSkuCisJCQkgKiBMaWtlIEVpZmVsIGl0IGFsc28gcHJldmVudHMgZ3Jvd3RoIG9mIHJ0bywKKwkJCSAqIGJ1dCBhbHNvIGl0IGxpbWl0cyB0b28gZmFzdCBydG8gZGVjcmVhc2VzLAorCQkJICogaGFwcGVuaW5nIGluIHB1cmUgRWlmZWwuCisJCQkgKi8KKwkJCWlmIChtID4gMCkKKwkJCQltID4+PSAzOworCQl9IGVsc2UgeworCQkJbSAtPSAodHAtPm1kZXYgPj4gMik7ICAgLyogc2ltaWxhciB1cGRhdGUgb24gbWRldiAqLworCQl9CisJCXRwLT5tZGV2ICs9IG07CSAgICAJLyogbWRldiA9IDMvNCBtZGV2ICsgMS80IG5ldyAqLworCQlpZiAodHAtPm1kZXYgPiB0cC0+bWRldl9tYXgpIHsKKwkJCXRwLT5tZGV2X21heCA9IHRwLT5tZGV2OworCQkJaWYgKHRwLT5tZGV2X21heCA+IHRwLT5ydHR2YXIpCisJCQkJdHAtPnJ0dHZhciA9IHRwLT5tZGV2X21heDsKKwkJfQorCQlpZiAoYWZ0ZXIodHAtPnNuZF91bmEsIHRwLT5ydHRfc2VxKSkgeworCQkJaWYgKHRwLT5tZGV2X21heCA8IHRwLT5ydHR2YXIpCisJCQkJdHAtPnJ0dHZhciAtPSAodHAtPnJ0dHZhci10cC0+bWRldl9tYXgpPj4yOworCQkJdHAtPnJ0dF9zZXEgPSB0cC0+c25kX254dDsKKwkJCXRwLT5tZGV2X21heCA9IFRDUF9SVE9fTUlOOworCQl9CisJfSBlbHNlIHsKKwkJLyogbm8gcHJldmlvdXMgbWVhc3VyZS4gKi8KKwkJdHAtPnNydHQgPSBtPDwzOwkvKiB0YWtlIHRoZSBtZWFzdXJlZCB0aW1lIHRvIGJlIHJ0dCAqLworCQl0cC0+bWRldiA9IG08PDE7CS8qIG1ha2Ugc3VyZSBydG8gPSAzKnJ0dCAqLworCQl0cC0+bWRldl9tYXggPSB0cC0+cnR0dmFyID0gbWF4KHRwLT5tZGV2LCBUQ1BfUlRPX01JTik7CisJCXRwLT5ydHRfc2VxID0gdHAtPnNuZF9ueHQ7CisJfQorCisJdGNwX3dlc3R3b29kX3VwZGF0ZV9ydHQodHAsIHRwLT5zcnR0ID4+IDMpOworfQorCisvKiBDYWxjdWxhdGUgcnRvIHdpdGhvdXQgYmFja29mZi4gIFRoaXMgaXMgdGhlIHNlY29uZCBoYWxmIG9mIFZhbiBKYWNvYnNvbidzCisgKiByb3V0aW5lIHJlZmVycmVkIHRvIGFib3ZlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdGNwX3NldF9ydG8oc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwkvKiBPbGQgY3JhcCBpcyByZXBsYWNlZCB3aXRoIG5ldyBvbmUuIDgpCisJICoKKwkgKiBNb3JlIHNlcmlvdXNseToKKwkgKiAxLiBJZiBydHQgdmFyaWFuY2UgaGFwcGVuZWQgdG8gYmUgbGVzcyA1MG1zZWMsIGl0IGlzIGhhbGx1Y2luYXRpb24uCisJICogICAgSXQgY2Fubm90IGJlIGxlc3MgZHVlIHRvIHV0dGVybHkgZXJyYXRpYyBBQ0sgZ2VuZXJhdGlvbiBtYWRlCisJICogICAgYXQgbGVhc3QgYnkgc29sYXJpcyBhbmQgZnJlZWJzZC4gIkVycmF0aWMgQUNLcyIgaGFzIF9ub3RoaW5nXworCSAqICAgIHRvIGRvIHdpdGggZGVsYXllZCBhY2tzLCBiZWNhdXNlIGF0IGN3bmQ+MiB0cnVlIGRlbGFjayB0aW1lb3V0CisJICogICAgaXMgaW52aXNpYmxlLiBBY3R1YWxseSwgTGludXgtMi40IGFsc28gZ2VuZXJhdGVzIGVycmF0aWMKKwkgKiAgICBBQ0tzIGluIHNvbWUgY3VyY3Vtc3RhbmNlcy4KKwkgKi8KKwl0cC0+cnRvID0gKHRwLT5zcnR0ID4+IDMpICsgdHAtPnJ0dHZhcjsKKworCS8qIDIuIEZpeHVwcyBtYWRlIGVhcmxpZXIgY2Fubm90IGJlIHJpZ2h0LgorCSAqICAgIElmIHdlIGRvIG5vdCBlc3RpbWF0ZSBSVE8gY29ycmVjdGx5IHdpdGhvdXQgdGhlbSwKKwkgKiAgICBhbGwgdGhlIGFsZ28gaXMgcHVyZSBzaGl0IGFuZCBzaG91bGQgYmUgcmVwbGFjZWQKKwkgKiAgICB3aXRoIGNvcnJlY3Qgb25lLiBJdCBpcyBleGFjbHR5LCB3aGljaCB3ZSBwcmV0ZW5kIHRvIGRvLgorCSAqLworfQorCisvKiBOT1RFOiBjbGFtcGluZyBhdCBUQ1BfUlRPX01JTiBpcyBub3QgcmVxdWlyZWQsIGN1cnJlbnQgYWxnbworICogZ3VhcmFudGVlcyB0aGF0IHJ0byBpcyBoaWdoZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfYm91bmRfcnRvKHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJaWYgKHRwLT5ydG8gPiBUQ1BfUlRPX01BWCkKKwkJdHAtPnJ0byA9IFRDUF9SVE9fTUFYOworfQorCisvKiBTYXZlIG1ldHJpY3MgbGVhcm5lZCBieSB0aGlzIFRDUCBzZXNzaW9uLgorICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSwgd2hlbiBUQ1AgZmluaXNoZXMgc3VjY2Vzc2Z1bGx5CisgICBpLmUuIHdoZW4gaXQgZW50ZXJzIFRJTUUtV0FJVCBvciBnb2VzIGZyb20gTEFTVC1BQ0sgdG8gQ0xPU0UuCisgKi8KK3ZvaWQgdGNwX3VwZGF0ZV9tZXRyaWNzKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBfX3NrX2RzdF9nZXQoc2spOworCisJaWYgKHN5c2N0bF90Y3Bfbm9tZXRyaWNzX3NhdmUpCisJCXJldHVybjsKKworCWRzdF9jb25maXJtKGRzdCk7CisKKwlpZiAoZHN0ICYmIChkc3QtPmZsYWdzJkRTVF9IT1NUKSkgeworCQlpbnQgbTsKKworCQlpZiAodHAtPmJhY2tvZmYgfHwgIXRwLT5zcnR0KSB7CisJCQkvKiBUaGlzIHNlc3Npb24gZmFpbGVkIHRvIGVzdGltYXRlIHJ0dC4gV2h5PworCQkJICogUHJvYmFibHksIG5vIHBhY2tldHMgcmV0dXJuZWQgaW4gdGltZS4KKwkJCSAqIFJlc2V0IG91ciByZXN1bHRzLgorCQkJICovCisJCQlpZiAoIShkc3RfbWV0cmljX2xvY2tlZChkc3QsIFJUQVhfUlRUKSkpCisJCQkJZHN0LT5tZXRyaWNzW1JUQVhfUlRULTFdID0gMDsKKwkJCXJldHVybjsKKwkJfQorCisJCW0gPSBkc3RfbWV0cmljKGRzdCwgUlRBWF9SVFQpIC0gdHAtPnNydHQ7CisKKwkJLyogSWYgbmV3bHkgY2FsY3VsYXRlZCBydHQgbGFyZ2VyIHRoYW4gc3RvcmVkIG9uZSwKKwkJICogc3RvcmUgbmV3IG9uZS4gT3RoZXJ3aXNlLCB1c2UgRVdNQS4gUmVtZW1iZXIsCisJCSAqIHJ0dCBvdmVyZXN0aW1hdGlvbiBpcyBhbHdheXMgYmV0dGVyIHRoYW4gdW5kZXJlc3RpbWF0aW9uLgorCQkgKi8KKwkJaWYgKCEoZHN0X21ldHJpY19sb2NrZWQoZHN0LCBSVEFYX1JUVCkpKSB7CisJCQlpZiAobSA8PSAwKQorCQkJCWRzdC0+bWV0cmljc1tSVEFYX1JUVC0xXSA9IHRwLT5zcnR0OworCQkJZWxzZQorCQkJCWRzdC0+bWV0cmljc1tSVEFYX1JUVC0xXSAtPSAobT4+Myk7CisJCX0KKworCQlpZiAoIShkc3RfbWV0cmljX2xvY2tlZChkc3QsIFJUQVhfUlRUVkFSKSkpIHsKKwkJCWlmIChtIDwgMCkKKwkJCQltID0gLW07CisKKwkJCS8qIFNjYWxlIGRldmlhdGlvbiB0byBydHR2YXIgZml4ZWQgcG9pbnQgKi8KKwkJCW0gPj49IDE7CisJCQlpZiAobSA8IHRwLT5tZGV2KQorCQkJCW0gPSB0cC0+bWRldjsKKworCQkJaWYgKG0gPj0gZHN0X21ldHJpYyhkc3QsIFJUQVhfUlRUVkFSKSkKKwkJCQlkc3QtPm1ldHJpY3NbUlRBWF9SVFRWQVItMV0gPSBtOworCQkJZWxzZQorCQkJCWRzdC0+bWV0cmljc1tSVEFYX1JUVFZBUi0xXSAtPQorCQkJCQkoZHN0LT5tZXRyaWNzW1JUQVhfUlRUVkFSLTFdIC0gbSk+PjI7CisJCX0KKworCQlpZiAodHAtPnNuZF9zc3RocmVzaCA+PSAweEZGRkYpIHsKKwkJCS8qIFNsb3cgc3RhcnQgc3RpbGwgZGlkIG5vdCBmaW5pc2guICovCisJCQlpZiAoZHN0X21ldHJpYyhkc3QsIFJUQVhfU1NUSFJFU0gpICYmCisJCQkgICAgIWRzdF9tZXRyaWNfbG9ja2VkKGRzdCwgUlRBWF9TU1RIUkVTSCkgJiYKKwkJCSAgICAodHAtPnNuZF9jd25kID4+IDEpID4gZHN0X21ldHJpYyhkc3QsIFJUQVhfU1NUSFJFU0gpKQorCQkJCWRzdC0+bWV0cmljc1tSVEFYX1NTVEhSRVNILTFdID0gdHAtPnNuZF9jd25kID4+IDE7CisJCQlpZiAoIWRzdF9tZXRyaWNfbG9ja2VkKGRzdCwgUlRBWF9DV05EKSAmJgorCQkJICAgIHRwLT5zbmRfY3duZCA+IGRzdF9tZXRyaWMoZHN0LCBSVEFYX0NXTkQpKQorCQkJCWRzdC0+bWV0cmljc1tSVEFYX0NXTkQtMV0gPSB0cC0+c25kX2N3bmQ7CisJCX0gZWxzZSBpZiAodHAtPnNuZF9jd25kID4gdHAtPnNuZF9zc3RocmVzaCAmJgorCQkJICAgdHAtPmNhX3N0YXRlID09IFRDUF9DQV9PcGVuKSB7CisJCQkvKiBDb25nLiBhdm9pZGFuY2UgcGhhc2UsIGN3bmQgaXMgcmVsaWFibGUuICovCisJCQlpZiAoIWRzdF9tZXRyaWNfbG9ja2VkKGRzdCwgUlRBWF9TU1RIUkVTSCkpCisJCQkJZHN0LT5tZXRyaWNzW1JUQVhfU1NUSFJFU0gtMV0gPQorCQkJCQltYXgodHAtPnNuZF9jd25kID4+IDEsIHRwLT5zbmRfc3N0aHJlc2gpOworCQkJaWYgKCFkc3RfbWV0cmljX2xvY2tlZChkc3QsIFJUQVhfQ1dORCkpCisJCQkJZHN0LT5tZXRyaWNzW1JUQVhfQ1dORC0xXSA9IChkc3QtPm1ldHJpY3NbUlRBWF9DV05ELTFdICsgdHAtPnNuZF9jd25kKSA+PiAxOworCQl9IGVsc2UgeworCQkJLyogRWxzZSBzbG93IHN0YXJ0IGRpZCBub3QgZmluaXNoLCBjd25kIGlzIG5vbi1zZW5zZSwKKwkJCSAgIHNzdGhyZXNoIG1heSBiZSBhbHNvIGludmFsaWQuCisJCQkgKi8KKwkJCWlmICghZHN0X21ldHJpY19sb2NrZWQoZHN0LCBSVEFYX0NXTkQpKQorCQkJCWRzdC0+bWV0cmljc1tSVEFYX0NXTkQtMV0gPSAoZHN0LT5tZXRyaWNzW1JUQVhfQ1dORC0xXSArIHRwLT5zbmRfc3N0aHJlc2gpID4+IDE7CisJCQlpZiAoZHN0LT5tZXRyaWNzW1JUQVhfU1NUSFJFU0gtMV0gJiYKKwkJCSAgICAhZHN0X21ldHJpY19sb2NrZWQoZHN0LCBSVEFYX1NTVEhSRVNIKSAmJgorCQkJICAgIHRwLT5zbmRfc3N0aHJlc2ggPiBkc3QtPm1ldHJpY3NbUlRBWF9TU1RIUkVTSC0xXSkKKwkJCQlkc3QtPm1ldHJpY3NbUlRBWF9TU1RIUkVTSC0xXSA9IHRwLT5zbmRfc3N0aHJlc2g7CisJCX0KKworCQlpZiAoIWRzdF9tZXRyaWNfbG9ja2VkKGRzdCwgUlRBWF9SRU9SREVSSU5HKSkgeworCQkJaWYgKGRzdC0+bWV0cmljc1tSVEFYX1JFT1JERVJJTkctMV0gPCB0cC0+cmVvcmRlcmluZyAmJgorCQkJICAgIHRwLT5yZW9yZGVyaW5nICE9IHN5c2N0bF90Y3BfcmVvcmRlcmluZykKKwkJCQlkc3QtPm1ldHJpY3NbUlRBWF9SRU9SREVSSU5HLTFdID0gdHAtPnJlb3JkZXJpbmc7CisJCX0KKwl9Cit9CisKKy8qIE51bWJlcnMgYXJlIHRha2VuIGZyb20gUkZDMjQxNC4gICovCitfX3UzMiB0Y3BfaW5pdF9jd25kKHN0cnVjdCB0Y3Bfc29jayAqdHAsIHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKK3sKKwlfX3UzMiBjd25kID0gKGRzdCA/IGRzdF9tZXRyaWMoZHN0LCBSVEFYX0lOSVRDV05EKSA6IDApOworCisJaWYgKCFjd25kKSB7CisJCWlmICh0cC0+bXNzX2NhY2hlX3N0ZCA+IDE0NjApCisJCQljd25kID0gMjsKKwkJZWxzZQorCQkJY3duZCA9ICh0cC0+bXNzX2NhY2hlX3N0ZCA+IDEwOTUpID8gMyA6IDQ7CisJfQorCXJldHVybiBtaW5fdChfX3UzMiwgY3duZCwgdHAtPnNuZF9jd25kX2NsYW1wKTsKK30KKworLyogSW5pdGlhbGl6ZSBtZXRyaWNzIG9uIHNvY2tldC4gKi8KKworc3RhdGljIHZvaWQgdGNwX2luaXRfbWV0cmljcyhzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gX19za19kc3RfZ2V0KHNrKTsKKworCWlmIChkc3QgPT0gTlVMTCkKKwkJZ290byByZXNldDsKKworCWRzdF9jb25maXJtKGRzdCk7CisKKwlpZiAoZHN0X21ldHJpY19sb2NrZWQoZHN0LCBSVEFYX0NXTkQpKQorCQl0cC0+c25kX2N3bmRfY2xhbXAgPSBkc3RfbWV0cmljKGRzdCwgUlRBWF9DV05EKTsKKwlpZiAoZHN0X21ldHJpYyhkc3QsIFJUQVhfU1NUSFJFU0gpKSB7CisJCXRwLT5zbmRfc3N0aHJlc2ggPSBkc3RfbWV0cmljKGRzdCwgUlRBWF9TU1RIUkVTSCk7CisJCWlmICh0cC0+c25kX3NzdGhyZXNoID4gdHAtPnNuZF9jd25kX2NsYW1wKQorCQkJdHAtPnNuZF9zc3RocmVzaCA9IHRwLT5zbmRfY3duZF9jbGFtcDsKKwl9CisJaWYgKGRzdF9tZXRyaWMoZHN0LCBSVEFYX1JFT1JERVJJTkcpICYmCisJICAgIHRwLT5yZW9yZGVyaW5nICE9IGRzdF9tZXRyaWMoZHN0LCBSVEFYX1JFT1JERVJJTkcpKSB7CisJCXRwLT5yeF9vcHQuc2Fja19vayAmPSB+MjsKKwkJdHAtPnJlb3JkZXJpbmcgPSBkc3RfbWV0cmljKGRzdCwgUlRBWF9SRU9SREVSSU5HKTsKKwl9CisKKwlpZiAoZHN0X21ldHJpYyhkc3QsIFJUQVhfUlRUKSA9PSAwKQorCQlnb3RvIHJlc2V0OworCisJaWYgKCF0cC0+c3J0dCAmJiBkc3RfbWV0cmljKGRzdCwgUlRBWF9SVFQpIDwgKFRDUF9USU1FT1VUX0lOSVQgPDwgMykpCisJCWdvdG8gcmVzZXQ7CisKKwkvKiBJbml0aWFsIHJ0dCBpcyBkZXRlcm1pbmVkIGZyb20gU1lOLFNZTi1BQ0suCisJICogVGhlIHNlZ21lbnQgaXMgc21hbGwgYW5kIHJ0dCBtYXkgYXBwZWFyIG11Y2gKKwkgKiBsZXNzIHRoYW4gcmVhbCBvbmUuIFVzZSBwZXItZHN0IG1lbW9yeQorCSAqIHRvIG1ha2UgaXQgbW9yZSByZWFsaXN0aWMuCisJICoKKwkgKiBBIGJpdCBvZiB0aGVvcnkuIFJUVCBpcyB0aW1lIHBhc3NlZCBhZnRlciAibm9ybWFsIiBzaXplZCBwYWNrZXQKKwkgKiBpcyBzZW50IHVudGlsIGl0IGlzIEFDS2VkLiBJbiBub3JtYWwgY3VyY3Vtc3RhbmNlcyBzZW5kaW5nIHNtYWxsCisJICogcGFja2V0cyBmb3JjZSBwZWVyIHRvIGRlbGF5IEFDS3MgYW5kIGNhbGN1bGF0aW9uIGlzIGNvcnJlY3QgdG9vLgorCSAqIFRoZSBhbGdvcml0aG0gaXMgYWRhcHRpdmUgYW5kLCBwcm92aWRlZCB3ZSBmb2xsb3cgc3BlY3MsIGl0CisJICogTkVWRVIgdW5kZXJlc3RpbWF0ZSBSVFQuIEJVVCEgSWYgcGVlciB0cmllcyB0byBtYWtlIHNvbWUgY2xldmVyCisJICogdHJpY2tzIHNvcnQgb2YgInF1aWNrIGFja3MiIGZvciB0aW1lIGxvbmcgZW5vdWdoIHRvIGRlY3JlYXNlIFJUVAorCSAqIHRvIGxvdyB2YWx1ZSwgYW5kIHRoZW4gYWJydXB0bHkgc3RvcHMgdG8gZG8gaXQgYW5kIHN0YXJ0cyB0byBkZWxheQorCSAqIEFDS3MsIHdhaXQgZm9yIHRyb3VibGVzLgorCSAqLworCWlmIChkc3RfbWV0cmljKGRzdCwgUlRBWF9SVFQpID4gdHAtPnNydHQpIHsKKwkJdHAtPnNydHQgPSBkc3RfbWV0cmljKGRzdCwgUlRBWF9SVFQpOworCQl0cC0+cnR0X3NlcSA9IHRwLT5zbmRfbnh0OworCX0KKwlpZiAoZHN0X21ldHJpYyhkc3QsIFJUQVhfUlRUVkFSKSA+IHRwLT5tZGV2KSB7CisJCXRwLT5tZGV2ID0gZHN0X21ldHJpYyhkc3QsIFJUQVhfUlRUVkFSKTsKKwkJdHAtPm1kZXZfbWF4ID0gdHAtPnJ0dHZhciA9IG1heCh0cC0+bWRldiwgVENQX1JUT19NSU4pOworCX0KKwl0Y3Bfc2V0X3J0byh0cCk7CisJdGNwX2JvdW5kX3J0byh0cCk7CisJaWYgKHRwLT5ydG8gPCBUQ1BfVElNRU9VVF9JTklUICYmICF0cC0+cnhfb3B0LnNhd190c3RhbXApCisJCWdvdG8gcmVzZXQ7CisJdHAtPnNuZF9jd25kID0gdGNwX2luaXRfY3duZCh0cCwgZHN0KTsKKwl0cC0+c25kX2N3bmRfc3RhbXAgPSB0Y3BfdGltZV9zdGFtcDsKKwlyZXR1cm47CisKK3Jlc2V0OgorCS8qIFBsYXkgY29uc2VydmF0aXZlLiBJZiB0aW1lc3RhbXBzIGFyZSBub3QKKwkgKiBzdXBwb3J0ZWQsIFRDUCB3aWxsIGZhaWwgdG8gcmVjYWxjdWxhdGUgY29ycmVjdAorCSAqIHJ0dCwgaWYgaW5pdGlhbCBydG8gaXMgdG9vIHNtYWxsLiBGT1JHRVQgQUxMIEFORCBSRVNFVCEKKwkgKi8KKwlpZiAoIXRwLT5yeF9vcHQuc2F3X3RzdGFtcCAmJiB0cC0+c3J0dCkgeworCQl0cC0+c3J0dCA9IDA7CisJCXRwLT5tZGV2ID0gdHAtPm1kZXZfbWF4ID0gdHAtPnJ0dHZhciA9IFRDUF9USU1FT1VUX0lOSVQ7CisJCXRwLT5ydG8gPSBUQ1BfVElNRU9VVF9JTklUOworCX0KK30KKworc3RhdGljIHZvaWQgdGNwX3VwZGF0ZV9yZW9yZGVyaW5nKHN0cnVjdCB0Y3Bfc29jayAqdHAsIGludCBtZXRyaWMsIGludCB0cykKK3sKKwlpZiAobWV0cmljID4gdHAtPnJlb3JkZXJpbmcpIHsKKwkJdHAtPnJlb3JkZXJpbmcgPSBtaW4oVENQX01BWF9SRU9SREVSSU5HLCBtZXRyaWMpOworCisJCS8qIFRoaXMgZXhjaXRpbmcgZXZlbnQgaXMgd29ydGggdG8gYmUgcmVtZW1iZXJlZC4gOCkgKi8KKwkJaWYgKHRzKQorCQkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfVENQVFNSRU9SREVSKTsKKwkJZWxzZSBpZiAoSXNSZW5vKHRwKSkKKwkJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUFJFTk9SRU9SREVSKTsKKwkJZWxzZSBpZiAoSXNGYWNrKHRwKSkKKwkJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUEZBQ0tSRU9SREVSKTsKKwkJZWxzZQorCQkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfVENQU0FDS1JFT1JERVIpOworI2lmIEZBU1RSRVRSQU5TX0RFQlVHID4gMQorCQlwcmludGsoS0VSTl9ERUJVRyAiRGlzb3JkZXIlZCAlZCAldSBmJXUgcyV1IHJyJWRcbiIsCisJCSAgICAgICB0cC0+cnhfb3B0LnNhY2tfb2ssIHRwLT5jYV9zdGF0ZSwKKwkJICAgICAgIHRwLT5yZW9yZGVyaW5nLAorCQkgICAgICAgdHAtPmZhY2tldHNfb3V0LAorCQkgICAgICAgdHAtPnNhY2tlZF9vdXQsCisJCSAgICAgICB0cC0+dW5kb19tYXJrZXIgPyB0cC0+dW5kb19yZXRyYW5zIDogMCk7CisjZW5kaWYKKwkJLyogRGlzYWJsZSBGQUNLIHlldC4gKi8KKwkJdHAtPnJ4X29wdC5zYWNrX29rICY9IH4yOworCX0KK30KKworLyogVGhpcyBwcm9jZWR1cmUgdGFncyB0aGUgcmV0cmFuc21pc3Npb24gcXVldWUgd2hlbiBTQUNLcyBhcnJpdmUuCisgKgorICogV2UgaGF2ZSB0aHJlZSB0YWcgYml0czogU0FDS0VEKFMpLCBSRVRSQU5TKFIpIGFuZCBMT1NUKEwpLgorICogUGFja2V0cyBpbiBxdWV1ZSB3aXRoIHRoZXNlIGJpdHMgc2V0IGFyZSBjb3VudGVkIGluIHZhcmlhYmxlcworICogc2Fja2VkX291dCwgcmV0cmFuc19vdXQgYW5kIGxvc3Rfb3V0LCBjb3JyZXNwb25kaW5nbHkuCisgKgorICogVmFsaWQgY29tYmluYXRpb25zIGFyZToKKyAqIFRhZyAgSW5GbGlnaHQJRGVzY3JpcHRpb24KKyAqIDAJMQkJLSBvcmlnIHNlZ21lbnQgaXMgaW4gZmxpZ2h0LgorICogUwkwCQktIG5vdGhpbmcgZmxpZXMsIG9yaWcgcmVhY2hlZCByZWNlaXZlci4KKyAqIEwJMAkJLSBub3RoaW5nIGZsaWVzLCBvcmlnIGxvc3QgYnkgbmV0LgorICogUgkyCQktIGJvdGggb3JpZyBhbmQgcmV0cmFuc21pdCBhcmUgaW4gZmxpZ2h0LgorICogTHxSCTEJCS0gb3JpZyBpcyBsb3N0LCByZXRyYW5zbWl0IGlzIGluIGZsaWdodC4KKyAqIFN8UiAgMQkJLSBvcmlnIHJlYWNoZWQgcmVjZWl2ZXIsIHJldHJhbnMgaXMgc3RpbGwgaW4gZmxpZ2h0LgorICogKEx8U3xSIGlzIGxvZ2ljYWxseSB2YWxpZCwgaXQgY291bGQgb2NjdXIgd2hlbiBMfFIgaXMgc2Fja2VkLAorICogIGJ1dCBpdCBpcyBlcXVpdmFsZW50IHRvIHBsYWluIFMgYW5kIGNvZGUgc2hvcnQtY3VyY3VpdHMgaXQgdG8gUy4KKyAqICBMfFMgaXMgbG9naWNhbGx5IGludmFsaWQsIGl0IHdvdWxkIG1lYW4gLTEgcGFja2V0IGluIGZsaWdodCA4KSkKKyAqCisgKiBUaGVzZSA2IHN0YXRlcyBmb3JtIGZpbml0ZSBzdGF0ZSBtYWNoaW5lLCBjb250cm9sbGVkIGJ5IHRoZSBmb2xsb3dpbmcgZXZlbnRzOgorICogMS4gTmV3IEFDSyAoK1NBQ0spIGFycml2ZXMuICh0Y3Bfc2Fja3RhZ193cml0ZV9xdWV1ZSgpKQorICogMi4gUmV0cmFuc21pc3Npb24uICh0Y3BfcmV0cmFuc21pdF9za2IoKSwgdGNwX3htaXRfcmV0cmFuc21pdF9xdWV1ZSgpKQorICogMy4gTG9zcyBkZXRlY3Rpb24gZXZlbnQgb2Ygb25lIG9mIHRocmVlIGZsYXZvcnM6CisgKglBLiBTY29yZWJvYXJkIGVzdGltYXRvciBkZWNpZGVkIHRoZSBwYWNrZXQgaXMgbG9zdC4KKyAqCSAgIEEnLiBSZW5vICJ0aHJlZSBkdXBhY2tzIiBtYXJrcyBoZWFkIG9mIHF1ZXVlIGxvc3QuCisgKgkgICBBJycuIEl0cyBGQUNLIG1vZGZpY2F0aW9uLCBoZWFkIHVudGlsIHNuZC5mYWNrIGlzIGxvc3QuCisgKglCLiBTQUNLIGFycml2ZXMgc2Fja2luZyBkYXRhIHRyYW5zbWl0dGVkIGFmdGVyIG5ldmVyIHJldHJhbnNtaXR0ZWQKKyAqCSAgIGhvbGUgd2FzIHNlbnQgb3V0LgorICoJQy4gU0FDSyBhcnJpdmVzIHNhY2tpbmcgU05ELk5YVCBhdCB0aGUgbW9tZW50LCB3aGVuIHRoZQorICoJICAgc2VnbWVudCB3YXMgcmV0cmFuc21pdHRlZC4KKyAqIDQuIEQtU0FDSyBhZGRlZCBuZXcgcnVsZTogRC1TQUNLIGNoYW5nZXMgYW55IHRhZyB0byBTLgorICoKKyAqIEl0IGlzIHBsZWFzYW50IHRvIG5vdGUsIHRoYXQgc3RhdGUgZGlhZ3JhbSB0dXJucyBvdXQgdG8gYmUgY29tbXV0YXRpdmUsCisgKiBzbyB0aGF0IHdlIGFyZSBhbGxvd2VkIG5vdCB0byBiZSBib3RoZXJlZCBieSBvcmRlciBvZiBvdXIgYWN0aW9ucywKKyAqIHdoZW4gbXVsdGlwbGUgZXZlbnRzIGFycml2ZSBzaW11bHRhbmVvdXNseS4gKHNlZSB0aGUgZnVuY3Rpb24gYmVsb3cpLgorICoKKyAqIFJlb3JkZXJpbmcgZGV0ZWN0aW9uLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlb3JkZXJpbmcgbWV0cmljIGlzIG1heGltYWwgZGlzdGFuY2UsIHdoaWNoIGEgcGFja2V0IGNhbiBiZSBkaXNwbGFjZWQKKyAqIGluIHBhY2tldCBzdHJlYW0uIFdpdGggU0FDS3Mgd2UgY2FuIGVzdGltYXRlIGl0OgorICoKKyAqIDEuIFNBQ0sgZmlsbHMgb2xkIGhvbGUgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHNlZ21lbnQgd2FzIG5vdAorICogICAgZXZlciByZXRyYW5zbWl0dGVkIC0+IHJlb3JkZXJpbmcuIEFsYXMsIHdlIGNhbm5vdCB1c2UgaXQKKyAqICAgIHdoZW4gc2VnbWVudCB3YXMgcmV0cmFuc21pdHRlZC4KKyAqIDIuIFRoZSBsYXN0IGZsYXcgaXMgc29sdmVkIHdpdGggRC1TQUNLLiBELVNBQ0sgYXJyaXZlcworICogICAgZm9yIHJldHJhbnNtaXR0ZWQgYW5kIGFscmVhZHkgU0FDS2VkIHNlZ21lbnQgLT4gcmVvcmRlcmluZy4uCisgKiBCb3RoIG9mIHRoZXNlIGhldXJpc3RpY3MgYXJlIG5vdCB1c2VkIGluIExvc3Mgc3RhdGUsIHdoZW4gd2UgY2Fubm90CisgKiBhY2NvdW50IGZvciByZXRyYW5zbWl0cyBhY2N1cmF0ZWx5LgorICovCitzdGF0aWMgaW50Cit0Y3Bfc2Fja3RhZ193cml0ZV9xdWV1ZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICphY2tfc2tiLCB1MzIgcHJpb3Jfc25kX3VuYSkKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwl1bnNpZ25lZCBjaGFyICpwdHIgPSBhY2tfc2tiLT5oLnJhdyArIFRDUF9TS0JfQ0IoYWNrX3NrYiktPnNhY2tlZDsKKwlzdHJ1Y3QgdGNwX3NhY2tfYmxvY2sgKnNwID0gKHN0cnVjdCB0Y3Bfc2Fja19ibG9jayAqKShwdHIrMik7CisJaW50IG51bV9zYWNrcyA9IChwdHJbMV0gLSBUQ1BPTEVOX1NBQ0tfQkFTRSk+PjM7CisJaW50IHJlb3JkID0gdHAtPnBhY2tldHNfb3V0OworCWludCBwcmlvcl9mYWNrZXRzOworCXUzMiBsb3N0X3JldHJhbnMgPSAwOworCWludCBmbGFnID0gMDsKKwlpbnQgaTsKKworCS8qIFNvLCBTQUNLcyBmb3IgYWxyZWFkeSBzZW50IGxhcmdlIHNlZ21lbnRzIHdpbGwgYmUgbG9zdC4KKwkgKiBOb3QgZ29vZCwgYnV0IGFsdGVybmF0aXZlIGlzIHRvIHJlc2VnbWVudCB0aGUgcXVldWUuICovCisJaWYgKHNrLT5za19yb3V0ZV9jYXBzICYgTkVUSUZfRl9UU08pIHsKKwkJc2stPnNrX3JvdXRlX2NhcHMgJj0gfk5FVElGX0ZfVFNPOworCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX05PX0xBUkdFU0VORCk7CisJCXRwLT5tc3NfY2FjaGUgPSB0cC0+bXNzX2NhY2hlX3N0ZDsKKwl9CisKKwlpZiAoIXRwLT5zYWNrZWRfb3V0KQorCQl0cC0+ZmFja2V0c19vdXQgPSAwOworCXByaW9yX2ZhY2tldHMgPSB0cC0+ZmFja2V0c19vdXQ7CisKKwlmb3IgKGk9MDsgaTxudW1fc2Fja3M7IGkrKywgc3ArKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlfX3UzMiBzdGFydF9zZXEgPSBudG9obChzcC0+c3RhcnRfc2VxKTsKKwkJX191MzIgZW5kX3NlcSA9IG50b2hsKHNwLT5lbmRfc2VxKTsKKwkJaW50IGZhY2tfY291bnQgPSAwOworCQlpbnQgZHVwX3NhY2sgPSAwOworCisJCS8qIENoZWNrIGZvciBELVNBQ0suICovCisJCWlmIChpID09IDApIHsKKwkJCXUzMiBhY2sgPSBUQ1BfU0tCX0NCKGFja19za2IpLT5hY2tfc2VxOworCisJCQlpZiAoYmVmb3JlKHN0YXJ0X3NlcSwgYWNrKSkgeworCQkJCWR1cF9zYWNrID0gMTsKKwkJCQl0cC0+cnhfb3B0LnNhY2tfb2sgfD0gNDsKKwkJCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BEU0FDS1JFQ1YpOworCQkJfSBlbHNlIGlmIChudW1fc2Fja3MgPiAxICYmCisJCQkJICAgIWFmdGVyKGVuZF9zZXEsIG50b2hsKHNwWzFdLmVuZF9zZXEpKSAmJgorCQkJCSAgICFiZWZvcmUoc3RhcnRfc2VxLCBudG9obChzcFsxXS5zdGFydF9zZXEpKSkgeworCQkJCWR1cF9zYWNrID0gMTsKKwkJCQl0cC0+cnhfb3B0LnNhY2tfb2sgfD0gNDsKKwkJCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BEU0FDS09GT1JFQ1YpOworCQkJfQorCisJCQkvKiBELVNBQ0sgZm9yIGFscmVhZHkgZm9yZ290dGVuIGRhdGEuLi4KKwkJCSAqIERvIGR1bWIgY291bnRpbmcuICovCisJCQlpZiAoZHVwX3NhY2sgJiYKKwkJCSAgICAhYWZ0ZXIoZW5kX3NlcSwgcHJpb3Jfc25kX3VuYSkgJiYKKwkJCSAgICBhZnRlcihlbmRfc2VxLCB0cC0+dW5kb19tYXJrZXIpKQorCQkJCXRwLT51bmRvX3JldHJhbnMtLTsKKworCQkJLyogRWxpbWluYXRlIHRvbyBvbGQgQUNLcywgYnV0IHRha2UgaW50bworCQkJICogYWNjb3VudCBtb3JlIG9yIGxlc3MgZnJlc2ggb25lcywgdGhleSBjYW4KKwkJCSAqIGNvbnRhaW4gdmFsaWQgU0FDSyBpbmZvLgorCQkJICovCisJCQlpZiAoYmVmb3JlKGFjaywgcHJpb3Jfc25kX3VuYSAtIHRwLT5tYXhfd2luZG93KSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIEV2ZW50ICJCIiBpbiB0aGUgY29tbWVudCBhYm92ZS4gKi8KKwkJaWYgKGFmdGVyKGVuZF9zZXEsIHRwLT5oaWdoX3NlcSkpCisJCQlmbGFnIHw9IEZMQUdfREFUQV9MT1NUOworCisJCXNrX3N0cmVhbV9mb3JfcmV0cmFuc19xdWV1ZShza2IsIHNrKSB7CisJCQl1OCBzYWNrZWQgPSBUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZDsKKwkJCWludCBpbl9zYWNrOworCisJCQkvKiBUaGUgcmV0cmFuc21pc3Npb24gcXVldWUgaXMgYWx3YXlzIGluIG9yZGVyLCBzbworCQkJICogd2UgY2FuIHNob3J0LWNpcmN1aXQgdGhlIHdhbGsgZWFybHkuCisJCQkgKi8KKwkJCWlmKCFiZWZvcmUoVENQX1NLQl9DQihza2IpLT5zZXEsIGVuZF9zZXEpKQorCQkJCWJyZWFrOworCisJCQlmYWNrX2NvdW50ICs9IHRjcF9za2JfcGNvdW50KHNrYik7CisKKwkJCWluX3NhY2sgPSAhYWZ0ZXIoc3RhcnRfc2VxLCBUQ1BfU0tCX0NCKHNrYiktPnNlcSkgJiYKKwkJCQkhYmVmb3JlKGVuZF9zZXEsIFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSk7CisKKwkJCS8qIEFjY291bnQgRC1TQUNLIGZvciByZXRyYW5zbWl0dGVkIHBhY2tldC4gKi8KKwkJCWlmICgoZHVwX3NhY2sgJiYgaW5fc2FjaykgJiYKKwkJCSAgICAoc2Fja2VkICYgVENQQ0JfUkVUUkFOUykgJiYKKwkJCSAgICBhZnRlcihUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEsIHRwLT51bmRvX21hcmtlcikpCisJCQkJdHAtPnVuZG9fcmV0cmFucy0tOworCisJCQkvKiBUaGUgZnJhbWUgaXMgQUNLZWQuICovCisJCQlpZiAoIWFmdGVyKFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSwgdHAtPnNuZF91bmEpKSB7CisJCQkJaWYgKHNhY2tlZCZUQ1BDQl9SRVRSQU5TKSB7CisJCQkJCWlmICgoZHVwX3NhY2sgJiYgaW5fc2FjaykgJiYKKwkJCQkJICAgIChzYWNrZWQmVENQQ0JfU0FDS0VEX0FDS0VEKSkKKwkJCQkJCXJlb3JkID0gbWluKGZhY2tfY291bnQsIHJlb3JkKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBJZiBpdCB3YXMgaW4gYSBob2xlLCB3ZSBkZXRlY3RlZCByZW9yZGVyaW5nLiAqLworCQkJCQlpZiAoZmFja19jb3VudCA8IHByaW9yX2ZhY2tldHMgJiYKKwkJCQkJICAgICEoc2Fja2VkJlRDUENCX1NBQ0tFRF9BQ0tFRCkpCisJCQkJCQlyZW9yZCA9IG1pbihmYWNrX2NvdW50LCByZW9yZCk7CisJCQkJfQorCisJCQkJLyogTm90aGluZyB0byBkbzsgYWNrZWQgZnJhbWUgaXMgYWJvdXQgdG8gYmUgZHJvcHBlZC4gKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKChzYWNrZWQmVENQQ0JfU0FDS0VEX1JFVFJBTlMpICYmCisJCQkgICAgYWZ0ZXIoZW5kX3NlcSwgVENQX1NLQl9DQihza2IpLT5hY2tfc2VxKSAmJgorCQkJICAgICghbG9zdF9yZXRyYW5zIHx8IGFmdGVyKGVuZF9zZXEsIGxvc3RfcmV0cmFucykpKQorCQkJCWxvc3RfcmV0cmFucyA9IGVuZF9zZXE7CisKKwkJCWlmICghaW5fc2FjaykKKwkJCQljb250aW51ZTsKKworCQkJaWYgKCEoc2Fja2VkJlRDUENCX1NBQ0tFRF9BQ0tFRCkpIHsKKwkJCQlpZiAoc2Fja2VkICYgVENQQ0JfU0FDS0VEX1JFVFJBTlMpIHsKKwkJCQkJLyogSWYgdGhlIHNlZ21lbnQgaXMgbm90IHRhZ2dlZCBhcyBsb3N0LAorCQkJCQkgKiB3ZSBkbyBub3QgY2xlYXIgUkVUUkFOUywgYmVsaWV2aW5nCisJCQkJCSAqIHRoYXQgcmV0cmFuc21pc3Npb24gaXMgc3RpbGwgaW4gZmxpZ2h0LgorCQkJCQkgKi8KKwkJCQkJaWYgKHNhY2tlZCAmIFRDUENCX0xPU1QpIHsKKwkJCQkJCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkICY9IH4oVENQQ0JfTE9TVHxUQ1BDQl9TQUNLRURfUkVUUkFOUyk7CisJCQkJCQl0cC0+bG9zdF9vdXQgLT0gdGNwX3NrYl9wY291bnQoc2tiKTsKKwkJCQkJCXRwLT5yZXRyYW5zX291dCAtPSB0Y3Bfc2tiX3Bjb3VudChza2IpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogTmV3IHNhY2sgZm9yIG5vdCByZXRyYW5zbWl0dGVkIGZyYW1lLAorCQkJCQkgKiB3aGljaCB3YXMgaW4gaG9sZS4gSXQgaXMgcmVvcmRlcmluZy4KKwkJCQkJICovCisJCQkJCWlmICghKHNhY2tlZCAmIFRDUENCX1JFVFJBTlMpICYmCisJCQkJCSAgICBmYWNrX2NvdW50IDwgcHJpb3JfZmFja2V0cykKKwkJCQkJCXJlb3JkID0gbWluKGZhY2tfY291bnQsIHJlb3JkKTsKKworCQkJCQlpZiAoc2Fja2VkICYgVENQQ0JfTE9TVCkgeworCQkJCQkJVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJj0gflRDUENCX0xPU1Q7CisJCQkJCQl0cC0+bG9zdF9vdXQgLT0gdGNwX3NrYl9wY291bnQoc2tiKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkIHw9IFRDUENCX1NBQ0tFRF9BQ0tFRDsKKwkJCQlmbGFnIHw9IEZMQUdfREFUQV9TQUNLRUQ7CisJCQkJdHAtPnNhY2tlZF9vdXQgKz0gdGNwX3NrYl9wY291bnQoc2tiKTsKKworCQkJCWlmIChmYWNrX2NvdW50ID4gdHAtPmZhY2tldHNfb3V0KQorCQkJCQl0cC0+ZmFja2V0c19vdXQgPSBmYWNrX2NvdW50OworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZHVwX3NhY2sgJiYgKHNhY2tlZCZUQ1BDQl9SRVRSQU5TKSkKKwkJCQkJcmVvcmQgPSBtaW4oZmFja19jb3VudCwgcmVvcmQpOworCQkJfQorCisJCQkvKiBELVNBQ0suIFdlIGNhbiBkZXRlY3QgcmVkdW5kYW50IHJldHJhbnNtaXNzaW9uCisJCQkgKiBpbiBTfFIgYW5kIHBsYWluIFIgZnJhbWVzIGFuZCBjbGVhciBpdC4KKwkJCSAqIHVuZG9fcmV0cmFucyBpcyBkZWNyZWFzZWQgYWJvdmUsIEx8UiBmcmFtZXMKKwkJCSAqIGFyZSBhY2NvdW50ZWQgYWJvdmUgYXMgd2VsbC4KKwkJCSAqLworCQkJaWYgKGR1cF9zYWNrICYmCisJCQkgICAgKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkJlRDUENCX1NBQ0tFRF9SRVRSQU5TKSkgeworCQkJCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkICY9IH5UQ1BDQl9TQUNLRURfUkVUUkFOUzsKKwkJCQl0cC0+cmV0cmFuc19vdXQgLT0gdGNwX3NrYl9wY291bnQoc2tiKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIENoZWNrIGZvciBsb3N0IHJldHJhbnNtaXQuIFRoaXMgc3VwZXJiIGlkZWEgaXMKKwkgKiBib3Jyb3dlZCBmcm9tICJyYXRlaGFsdmluZyIuIEV2ZW50ICJDIi4KKwkgKiBMYXRlciBub3RlOiBGQUNLIHBlb3BsZSBjaGVhdGVkIG1lIGFnYWluIDgpLAorCSAqIHdlIGhhdmUgdG8gYWNjb3VudCBmb3IgcmVvcmRlcmluZyEgVWdseSwKKwkgKiBidXQgc2hvdWxkIGhlbHAuCisJICovCisJaWYgKGxvc3RfcmV0cmFucyAmJiB0cC0+Y2Ffc3RhdGUgPT0gVENQX0NBX1JlY292ZXJ5KSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJc2tfc3RyZWFtX2Zvcl9yZXRyYW5zX3F1ZXVlKHNrYiwgc2spIHsKKwkJCWlmIChhZnRlcihUQ1BfU0tCX0NCKHNrYiktPnNlcSwgbG9zdF9yZXRyYW5zKSkKKwkJCQlicmVhazsKKwkJCWlmICghYWZ0ZXIoVENQX1NLQl9DQihza2IpLT5lbmRfc2VxLCB0cC0+c25kX3VuYSkpCisJCQkJY29udGludWU7CisJCQlpZiAoKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkJlRDUENCX1NBQ0tFRF9SRVRSQU5TKSAmJgorCQkJICAgIGFmdGVyKGxvc3RfcmV0cmFucywgVENQX1NLQl9DQihza2IpLT5hY2tfc2VxKSAmJgorCQkJICAgIChJc0ZhY2sodHApIHx8CisJCQkgICAgICFiZWZvcmUobG9zdF9yZXRyYW5zLAorCQkJCSAgICAgVENQX1NLQl9DQihza2IpLT5hY2tfc2VxICsgdHAtPnJlb3JkZXJpbmcgKgorCQkJCSAgICAgdHAtPm1zc19jYWNoZV9zdGQpKSkgeworCQkJCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkICY9IH5UQ1BDQl9TQUNLRURfUkVUUkFOUzsKKwkJCQl0cC0+cmV0cmFuc19vdXQgLT0gdGNwX3NrYl9wY291bnQoc2tiKTsKKworCQkJCWlmICghKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkJihUQ1BDQl9MT1NUfFRDUENCX1NBQ0tFRF9BQ0tFRCkpKSB7CisJCQkJCXRwLT5sb3N0X291dCArPSB0Y3Bfc2tiX3Bjb3VudChza2IpOworCQkJCQlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCB8PSBUQ1BDQl9MT1NUOworCQkJCQlmbGFnIHw9IEZMQUdfREFUQV9TQUNLRUQ7CisJCQkJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUExPU1RSRVRSQU5TTUlUKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwl0cC0+bGVmdF9vdXQgPSB0cC0+c2Fja2VkX291dCArIHRwLT5sb3N0X291dDsKKworCWlmICgocmVvcmQgPCB0cC0+ZmFja2V0c19vdXQpICYmIHRwLT5jYV9zdGF0ZSAhPSBUQ1BfQ0FfTG9zcykKKwkJdGNwX3VwZGF0ZV9yZW9yZGVyaW5nKHRwLCAoKHRwLT5mYWNrZXRzX291dCArIDEpIC0gcmVvcmQpLCAwKTsKKworI2lmIEZBU1RSRVRSQU5TX0RFQlVHID4gMAorCUJVR19UUkFQKChpbnQpdHAtPnNhY2tlZF9vdXQgPj0gMCk7CisJQlVHX1RSQVAoKGludCl0cC0+bG9zdF9vdXQgPj0gMCk7CisJQlVHX1RSQVAoKGludCl0cC0+cmV0cmFuc19vdXQgPj0gMCk7CisJQlVHX1RSQVAoKGludCl0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApID49IDApOworI2VuZGlmCisJcmV0dXJuIGZsYWc7Cit9CisKKy8qIFJUTyBvY2N1cnJlZCwgYnV0IGRvIG5vdCB5ZXQgZW50ZXIgbG9zcyBzdGF0ZS4gSW5zdGVhZCwgdHJhbnNtaXQgdHdvIG5ldworICogc2VnbWVudHMgdG8gc2VlIGZyb20gdGhlIG5leHQgQUNLcyB3aGV0aGVyIGFueSBkYXRhIHdhcyByZWFsbHkgbWlzc2luZy4KKyAqIElmIHRoZSBSVE8gd2FzIHNwdXJpb3VzLCBuZXcgQUNLcyBzaG91bGQgYXJyaXZlLgorICovCit2b2lkIHRjcF9lbnRlcl9mcnRvKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJdHAtPmZydG9fY291bnRlciA9IDE7CisKKwlpZiAodHAtPmNhX3N0YXRlIDw9IFRDUF9DQV9EaXNvcmRlciB8fAorICAgICAgICAgICAgdHAtPnNuZF91bmEgPT0gdHAtPmhpZ2hfc2VxIHx8CisgICAgICAgICAgICAodHAtPmNhX3N0YXRlID09IFRDUF9DQV9Mb3NzICYmICF0cC0+cmV0cmFuc21pdHMpKSB7CisJCXRwLT5wcmlvcl9zc3RocmVzaCA9IHRjcF9jdXJyZW50X3NzdGhyZXNoKHRwKTsKKwkJaWYgKCF0Y3Bfd2VzdHdvb2Rfc3N0aHJlc2godHApKQorCQkJdHAtPnNuZF9zc3RocmVzaCA9IHRjcF9yZWNhbGNfc3N0aHJlc2godHApOworCX0KKworCS8qIEhhdmUgdG8gY2xlYXIgcmV0cmFuc21pc3Npb24gbWFya2VycyBoZXJlIHRvIGtlZXAgdGhlIGJvb2trZWVwaW5nCisJICogaW4gc2hhcGUsIGV2ZW4gdGhvdWdoIHdlIGFyZSBub3QgeWV0IGluIExvc3Mgc3RhdGUuCisJICogSWYgc29tZXRoaW5nIHdhcyByZWFsbHkgbG9zdCwgaXQgaXMgZXZlbnR1YWxseSBjYXVnaHQgdXAKKwkgKiBpbiB0Y3BfZW50ZXJfZnJ0b19sb3NzLgorCSAqLworCXRwLT5yZXRyYW5zX291dCA9IDA7CisJdHAtPnVuZG9fbWFya2VyID0gdHAtPnNuZF91bmE7CisJdHAtPnVuZG9fcmV0cmFucyA9IDA7CisKKwlza19zdHJlYW1fZm9yX3JldHJhbnNfcXVldWUoc2tiLCBzaykgeworCQlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmPSB+VENQQ0JfUkVUUkFOUzsKKwl9CisJdGNwX3N5bmNfbGVmdF9vdXQodHApOworCisJdGNwX3NldF9jYV9zdGF0ZSh0cCwgVENQX0NBX09wZW4pOworCXRwLT5mcnRvX2hpZ2htYXJrID0gdHAtPnNuZF9ueHQ7Cit9CisKKy8qIEVudGVyIExvc3Mgc3RhdGUgYWZ0ZXIgRi1SVE8gd2FzIGFwcGxpZWQuIER1cGFjayBhcnJpdmVkIGFmdGVyIFJUTywKKyAqIHdoaWNoIGluZGljYXRlcyB0aGF0IHdlIHNob3VsZCBmb2xsb3cgdGhlIHRyYWRpdGlvbmFsIFJUTyByZWNvdmVyeSwKKyAqIGkuZS4gbWFyayBldmVyeXRoaW5nIGxvc3QgYW5kIGRvIGdvLWJhY2stTiByZXRyYW5zbWlzc2lvbi4KKyAqLworc3RhdGljIHZvaWQgdGNwX2VudGVyX2ZydG9fbG9zcyhzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgY250ID0gMDsKKworCXRwLT5zYWNrZWRfb3V0ID0gMDsKKwl0cC0+bG9zdF9vdXQgPSAwOworCXRwLT5mYWNrZXRzX291dCA9IDA7CisKKwlza19zdHJlYW1fZm9yX3JldHJhbnNfcXVldWUoc2tiLCBzaykgeworCQljbnQgKz0gdGNwX3NrYl9wY291bnQoc2tiKTsKKwkJVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJj0gflRDUENCX0xPU1Q7CisJCWlmICghKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkJlRDUENCX1NBQ0tFRF9BQ0tFRCkpIHsKKworCQkJLyogRG8gbm90IG1hcmsgdGhvc2Ugc2VnbWVudHMgbG9zdCB0aGF0IHdlcmUKKwkJCSAqIGZvcndhcmQgdHJhbnNtaXR0ZWQgYWZ0ZXIgUlRPCisJCQkgKi8KKwkJCWlmICghYWZ0ZXIoVENQX1NLQl9DQihza2IpLT5lbmRfc2VxLAorCQkJCSAgIHRwLT5mcnRvX2hpZ2htYXJrKSkgeworCQkJCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkIHw9IFRDUENCX0xPU1Q7CisJCQkJdHAtPmxvc3Rfb3V0ICs9IHRjcF9za2JfcGNvdW50KHNrYik7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0cC0+c2Fja2VkX291dCArPSB0Y3Bfc2tiX3Bjb3VudChza2IpOworCQkJdHAtPmZhY2tldHNfb3V0ID0gY250OworCQl9CisJfQorCXRjcF9zeW5jX2xlZnRfb3V0KHRwKTsKKworCXRwLT5zbmRfY3duZCA9IHRwLT5mcnRvX2NvdW50ZXIgKyB0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApKzE7CisJdHAtPnNuZF9jd25kX2NudCA9IDA7CisJdHAtPnNuZF9jd25kX3N0YW1wID0gdGNwX3RpbWVfc3RhbXA7CisJdHAtPnVuZG9fbWFya2VyID0gMDsKKwl0cC0+ZnJ0b19jb3VudGVyID0gMDsKKworCXRwLT5yZW9yZGVyaW5nID0gbWluX3QodW5zaWduZWQgaW50LCB0cC0+cmVvcmRlcmluZywKKwkJCQkJICAgICBzeXNjdGxfdGNwX3Jlb3JkZXJpbmcpOworCXRjcF9zZXRfY2Ffc3RhdGUodHAsIFRDUF9DQV9Mb3NzKTsKKwl0cC0+aGlnaF9zZXEgPSB0cC0+ZnJ0b19oaWdobWFyazsKKwlUQ1BfRUNOX3F1ZXVlX2N3cih0cCk7CisKKwlpbml0X2JpY3RjcCh0cCk7Cit9CisKK3ZvaWQgdGNwX2NsZWFyX3JldHJhbnMoc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwl0cC0+bGVmdF9vdXQgPSAwOworCXRwLT5yZXRyYW5zX291dCA9IDA7CisKKwl0cC0+ZmFja2V0c19vdXQgPSAwOworCXRwLT5zYWNrZWRfb3V0ID0gMDsKKwl0cC0+bG9zdF9vdXQgPSAwOworCisJdHAtPnVuZG9fbWFya2VyID0gMDsKKwl0cC0+dW5kb19yZXRyYW5zID0gMDsKK30KKworLyogRW50ZXIgTG9zcyBzdGF0ZS4gSWYgImhvdyIgaXMgbm90IHplcm8sIGZvcmdldCBhbGwgU0FDSyBpbmZvcm1hdGlvbgorICogYW5kIHJlc2V0IHRhZ3MgY29tcGxldGVseSwgb3RoZXJ3aXNlIHByZXNlcnZlIFNBQ0tzLiBJZiByZWNlaXZlcgorICogZHJvcHBlZCBpdHMgb2ZvIHF1ZXVlLCB3ZSB3aWxsIGtub3cgdGhpcyBkdWUgdG8gcmVuZWdpbmcgZGV0ZWN0aW9uLgorICovCit2b2lkIHRjcF9lbnRlcl9sb3NzKHN0cnVjdCBzb2NrICpzaywgaW50IGhvdykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBjbnQgPSAwOworCisJLyogUmVkdWNlIHNzdGhyZXNoIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gbWFkZSBpbnNpZGUgdGhpcyB3aW5kb3cuICovCisJaWYgKHRwLT5jYV9zdGF0ZSA8PSBUQ1BfQ0FfRGlzb3JkZXIgfHwgdHAtPnNuZF91bmEgPT0gdHAtPmhpZ2hfc2VxIHx8CisJICAgICh0cC0+Y2Ffc3RhdGUgPT0gVENQX0NBX0xvc3MgJiYgIXRwLT5yZXRyYW5zbWl0cykpIHsKKwkJdHAtPnByaW9yX3NzdGhyZXNoID0gdGNwX2N1cnJlbnRfc3N0aHJlc2godHApOworCQl0cC0+c25kX3NzdGhyZXNoID0gdGNwX3JlY2FsY19zc3RocmVzaCh0cCk7CisJfQorCXRwLT5zbmRfY3duZAkgICA9IDE7CisJdHAtPnNuZF9jd25kX2NudCAgID0gMDsKKwl0cC0+c25kX2N3bmRfc3RhbXAgPSB0Y3BfdGltZV9zdGFtcDsKKworCXRjcF9jbGVhcl9yZXRyYW5zKHRwKTsKKworCS8qIFB1c2ggdW5kbyBtYXJrZXIsIGlmIGl0IHdhcyBwbGFpbiBSVE8gYW5kIG5vdGhpbmcKKwkgKiB3YXMgcmV0cmFuc21pdHRlZC4gKi8KKwlpZiAoIWhvdykKKwkJdHAtPnVuZG9fbWFya2VyID0gdHAtPnNuZF91bmE7CisKKwlza19zdHJlYW1fZm9yX3JldHJhbnNfcXVldWUoc2tiLCBzaykgeworCQljbnQgKz0gdGNwX3NrYl9wY291bnQoc2tiKTsKKwkJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkJlRDUENCX1JFVFJBTlMpCisJCQl0cC0+dW5kb19tYXJrZXIgPSAwOworCQlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmPSAoflRDUENCX1RBR0JJVFMpfFRDUENCX1NBQ0tFRF9BQ0tFRDsKKwkJaWYgKCEoVENQX1NLQl9DQihza2IpLT5zYWNrZWQmVENQQ0JfU0FDS0VEX0FDS0VEKSB8fCBob3cpIHsKKwkJCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkICY9IH5UQ1BDQl9TQUNLRURfQUNLRUQ7CisJCQlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCB8PSBUQ1BDQl9MT1NUOworCQkJdHAtPmxvc3Rfb3V0ICs9IHRjcF9za2JfcGNvdW50KHNrYik7CisJCX0gZWxzZSB7CisJCQl0cC0+c2Fja2VkX291dCArPSB0Y3Bfc2tiX3Bjb3VudChza2IpOworCQkJdHAtPmZhY2tldHNfb3V0ID0gY250OworCQl9CisJfQorCXRjcF9zeW5jX2xlZnRfb3V0KHRwKTsKKworCXRwLT5yZW9yZGVyaW5nID0gbWluX3QodW5zaWduZWQgaW50LCB0cC0+cmVvcmRlcmluZywKKwkJCQkJICAgICBzeXNjdGxfdGNwX3Jlb3JkZXJpbmcpOworCXRjcF9zZXRfY2Ffc3RhdGUodHAsIFRDUF9DQV9Mb3NzKTsKKwl0cC0+aGlnaF9zZXEgPSB0cC0+c25kX254dDsKKwlUQ1BfRUNOX3F1ZXVlX2N3cih0cCk7Cit9CisKK3N0YXRpYyBpbnQgdGNwX2NoZWNrX3NhY2tfcmVuZWdpbmcoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwkvKiBJZiBBQ0sgYXJyaXZlZCBwb2ludGluZyB0byBhIHJlbWVtYmVyZWQgU0FDSywKKwkgKiBpdCBtZWFucyB0aGF0IG91ciByZW1lbWJlcmVkIFNBQ0tzIGRvIG5vdCByZWZsZWN0CisJICogcmVhbCBzdGF0ZSBvZiByZWNlaXZlciBpLmUuCisJICogcmVjZWl2ZXIgX2hvc3RfIGlzIGhlYXZpbHkgY29uZ2VzdGVkIChvciBidWdneSkuCisJICogRG8gcHJvY2Vzc2luZyBzaW1pbGFyIHRvIFJUTyB0aW1lb3V0LgorCSAqLworCWlmICgoc2tiID0gc2tiX3BlZWsoJnNrLT5za193cml0ZV9xdWV1ZSkpICE9IE5VTEwgJiYKKwkgICAgKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkICYgVENQQ0JfU0FDS0VEX0FDS0VEKSkgeworCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BTQUNLUkVORUdJTkcpOworCisJCXRjcF9lbnRlcl9sb3NzKHNrLCAxKTsKKwkJdHAtPnJldHJhbnNtaXRzKys7CisJCXRjcF9yZXRyYW5zbWl0X3NrYihzaywgc2tiX3BlZWsoJnNrLT5za193cml0ZV9xdWV1ZSkpOworCQl0Y3BfcmVzZXRfeG1pdF90aW1lcihzaywgVENQX1RJTUVfUkVUUkFOUywgdHAtPnJ0byk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGNwX2ZhY2tldHNfb3V0KHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJcmV0dXJuIElzUmVubyh0cCkgPyB0cC0+c2Fja2VkX291dCsxIDogdHAtPmZhY2tldHNfb3V0OworfQorCitzdGF0aWMgaW5saW5lIGludCB0Y3Bfc2tiX3RpbWVkb3V0KHN0cnVjdCB0Y3Bfc29jayAqdHAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuICh0Y3BfdGltZV9zdGFtcCAtIFRDUF9TS0JfQ0Ioc2tiKS0+d2hlbiA+IHRwLT5ydG8pOworfQorCitzdGF0aWMgaW5saW5lIGludCB0Y3BfaGVhZF90aW1lZG91dChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJcmV0dXJuIHRwLT5wYWNrZXRzX291dCAmJgorCSAgICAgICB0Y3Bfc2tiX3RpbWVkb3V0KHRwLCBza2JfcGVlaygmc2stPnNrX3dyaXRlX3F1ZXVlKSk7Cit9CisKKy8qIExpbnV4IE5ld1Jlbm8vU0FDSy9GQUNLL0VDTiBzdGF0ZSBtYWNoaW5lLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAiT3BlbiIJTm9ybWFsIHN0YXRlLCBubyBkdWJpb3VzIGV2ZW50cywgZmFzdCBwYXRoLgorICogIkRpc29yZGVyIiAgIEluIGFsbCB0aGUgcmVzcGVjdHMgaXQgaXMgIk9wZW4iLAorICoJCWJ1dCByZXF1aXJlcyBhIGJpdCBtb3JlIGF0dGVudGlvbi4gSXQgaXMgZW50ZXJlZCB3aGVuCisgKgkJd2Ugc2VlIHNvbWUgU0FDS3Mgb3IgZHVwYWNrcy4gSXQgaXMgc3BsaXQgb2YgIk9wZW4iCisgKgkJbWFpbmx5IHRvIG1vdmUgc29tZSBwcm9jZXNzaW5nIGZyb20gZmFzdCBwYXRoIHRvIHNsb3cgb25lLgorICogIkNXUiIJQ1dORCB3YXMgcmVkdWNlZCBkdWUgdG8gc29tZSBDb25nZXN0aW9uIE5vdGlmaWNhdGlvbiBldmVudC4KKyAqCQlJdCBjYW4gYmUgRUNOLCBJQ01QIHNvdXJjZSBxdWVuY2gsIGxvY2FsIGRldmljZSBjb25nZXN0aW9uLgorICogIlJlY292ZXJ5IglDV05EIHdhcyByZWR1Y2VkLCB3ZSBhcmUgZmFzdC1yZXRyYW5zbWl0dGluZy4KKyAqICJMb3NzIglDV05EIHdhcyByZWR1Y2VkIGR1ZSB0byBSVE8gdGltZW91dCBvciBTQUNLIHJlbmVnaW5nLgorICoKKyAqIHRjcF9mYXN0cmV0cmFuc19hbGVydCgpIGlzIGVudGVyZWQ6CisgKiAtIGVhY2ggaW5jb21pbmcgQUNLLCBpZiBzdGF0ZSBpcyBub3QgIk9wZW4iCisgKiAtIHdoZW4gYXJyaXZlZCBBQ0sgaXMgdW51c3VhbCwgbmFtZWx5OgorICoJKiBTQUNLCisgKgkqIER1cGxpY2F0ZSBBQ0suCisgKgkqIEVDTiBFQ0UuCisgKgorICogQ291bnRpbmcgcGFja2V0cyBpbiBmbGlnaHQgaXMgcHJldHR5IHNpbXBsZS4KKyAqCisgKglpbl9mbGlnaHQgPSBwYWNrZXRzX291dCAtIGxlZnRfb3V0ICsgcmV0cmFuc19vdXQKKyAqCisgKglwYWNrZXRzX291dCBpcyBTTkQuTlhULVNORC5VTkEgY291bnRlZCBpbiBwYWNrZXRzLgorICoKKyAqCXJldHJhbnNfb3V0IGlzIG51bWJlciBvZiByZXRyYW5zbWl0dGVkIHNlZ21lbnRzLgorICoKKyAqCWxlZnRfb3V0IGlzIG51bWJlciBvZiBzZWdtZW50cyBsZWZ0IG5ldHdvcmssIGJ1dCBub3QgQUNLZWQgeWV0LgorICoKKyAqCQlsZWZ0X291dCA9IHNhY2tlZF9vdXQgKyBsb3N0X291dAorICoKKyAqICAgICBzYWNrZWRfb3V0OiBQYWNrZXRzLCB3aGljaCBhcnJpdmVkIHRvIHJlY2VpdmVyIG91dCBvZiBvcmRlcgorICoJCSAgIGFuZCBoZW5jZSBub3QgQUNLZWQuIFdpdGggU0FDS3MgdGhpcyBudW1iZXIgaXMgc2ltcGx5CisgKgkJICAgYW1vdW50IG9mIFNBQ0tlZCBkYXRhLiBFdmVuIHdpdGhvdXQgU0FDS3MKKyAqCQkgICBpdCBpcyBlYXN5IHRvIGdpdmUgcHJldHR5IHJlbGlhYmxlIGVzdGltYXRlIG9mIHRoaXMgbnVtYmVyLAorICoJCSAgIGNvdW50aW5nIGR1cGxpY2F0ZSBBQ0tzLgorICoKKyAqICAgICAgIGxvc3Rfb3V0OiBQYWNrZXRzIGxvc3QgYnkgbmV0d29yay4gVENQIGhhcyBubyBleHBsaWNpdAorICoJCSAgICJsb3NzIG5vdGlmaWNhdGlvbiIgZmVlZGJhY2sgZnJvbSBuZXR3b3JrIChmb3Igbm93KS4KKyAqCQkgICBJdCBtZWFucyB0aGF0IHRoaXMgbnVtYmVyIGNhbiBiZSBvbmx5IF9ndWVzc2VkXy4KKyAqCQkgICBBY3R1YWxseSwgaXQgaXMgdGhlIGhldXJpc3RpY3MgdG8gcHJlZGljdCBsb3NzYWdlIHRoYXQKKyAqCQkgICBkaXN0aW5ndWlzaGVzIGRpZmZlcmVudCBhbGdvcml0aG1zLgorICoKKyAqCUYuZS4gYWZ0ZXIgUlRPLCB3aGVuIGFsbCB0aGUgcXVldWUgaXMgY29uc2lkZXJlZCBhcyBsb3N0LAorICoJbG9zdF9vdXQgPSBwYWNrZXRzX291dCBhbmQgaW5fZmxpZ2h0ID0gcmV0cmFuc19vdXQuCisgKgorICoJCUVzc2VudGlhbGx5LCB3ZSBoYXZlIG5vdyB0d28gYWxnb3JpdGhtcyBjb3VudGluZworICoJCWxvc3QgcGFja2V0cy4KKyAqCisgKgkJRkFDSzogSXQgaXMgdGhlIHNpbXBsZXN0IGhldXJpc3RpY3MuIEFzIHNvb24gYXMgd2UgZGVjaWRlZAorICoJCXRoYXQgc29tZXRoaW5nIGlzIGxvc3QsIHdlIGRlY2lkZSB0aGF0IF9hbGxfIG5vdCBTQUNLZWQKKyAqCQlwYWNrZXRzIHVudGlsIHRoZSBtb3N0IGZvcndhcmQgU0FDSyBhcmUgbG9zdC4gSS5lLgorICoJCWxvc3Rfb3V0ID0gZmFja2V0c19vdXQgLSBzYWNrZWRfb3V0IGFuZCBsZWZ0X291dCA9IGZhY2tldHNfb3V0LgorICoJCUl0IGlzIGFic29sdXRlbHkgY29ycmVjdCBlc3RpbWF0ZSwgaWYgbmV0d29yayBkb2VzIG5vdCByZW9yZGVyCisgKgkJcGFja2V0cy4gQW5kIGl0IGxvc2VzIGFueSBjb25uZWN0aW9uIHRvIHJlYWxpdHkgd2hlbiByZW9yZGVyaW5nCisgKgkJdGFrZXMgcGxhY2UuIFdlIHVzZSBGQUNLIGJ5IGRlZmF1bHQgdW50aWwgcmVvcmRlcmluZworICoJCWlzIHN1c3BlY3RlZCBvbiB0aGUgcGF0aCB0byB0aGlzIGRlc3RpbmF0aW9uLgorICoKKyAqCQlOZXdSZW5vOiB3aGVuIFJlY292ZXJ5IGlzIGVudGVyZWQsIHdlIGFzc3VtZSB0aGF0IG9uZSBzZWdtZW50CisgKgkJaXMgbG9zdCAoY2xhc3NpYyBSZW5vKS4gV2hpbGUgd2UgYXJlIGluIFJlY292ZXJ5IGFuZAorICoJCWEgcGFydGlhbCBBQ0sgYXJyaXZlcywgd2UgYXNzdW1lIHRoYXQgb25lIG1vcmUgcGFja2V0CisgKgkJaXMgbG9zdCAoTmV3UmVubykuIFRoaXMgaGV1cmlzdGljcyBhcmUgdGhlIHNhbWUgaW4gTmV3UmVubworICoJCWFuZCBTQUNLLgorICoKKyAqICBJbWFnaW5lLCB0aGF0J3MgYWxsISBGb3JnZXQgYWJvdXQgYWxsIHRoaXMgc2hhbWFuaXNtIGFib3V0IENXTkQgaW5mbGF0aW9uCisgKiAgZGVmbGF0aW9uIGV0Yy4gQ1dORCBpcyByZWFsIGNvbmdlc3Rpb24gd2luZG93LCBuZXZlciBpbmZsYXRlZCwgY2hhbmdlcworICogIG9ubHkgYWNjb3JkaW5nIHRvIGNsYXNzaWMgVkogcnVsZXMuCisgKgorICogUmVhbGx5IHRyaWNreSAoYW5kIHJlcXVpcmluZyBjYXJlZnVsIHR1bmluZykgcGFydCBvZiBhbGdvcml0aG0KKyAqIGlzIGhpZGRlbiBpbiBmdW5jdGlvbnMgdGNwX3RpbWVfdG9fcmVjb3ZlcigpIGFuZCB0Y3BfeG1pdF9yZXRyYW5zbWl0X3F1ZXVlKCkuCisgKiBUaGUgZmlyc3QgZGV0ZXJtaW5lcyB0aGUgbW9tZW50IF93aGVuXyB3ZSBzaG91bGQgcmVkdWNlIENXTkQgYW5kLAorICogaGVuY2UsIHNsb3cgZG93biBmb3J3YXJkIHRyYW5zbWlzc2lvbi4gSW4gZmFjdCwgaXQgZGV0ZXJtaW5lcyB0aGUgbW9tZW50CisgKiB3aGVuIHdlIGRlY2lkZSB0aGF0IGhvbGUgaXMgY2F1c2VkIGJ5IGxvc3MsIHJhdGhlciB0aGFuIGJ5IGEgcmVvcmRlci4KKyAqCisgKiB0Y3BfeG1pdF9yZXRyYW5zbWl0X3F1ZXVlKCkgZGVjaWRlcywgX3doYXRfIHdlIHNob3VsZCByZXRyYW5zbWl0IHRvIGZpbGwKKyAqIGhvbGVzLCBjYXVzZWQgYnkgbG9zdCBwYWNrZXRzLgorICoKKyAqIEFuZCB0aGUgbW9zdCBsb2dpY2FsbHkgY29tcGxpY2F0ZWQgcGFydCBvZiBhbGdvcml0aG0gaXMgdW5kbworICogaGV1cmlzdGljcy4gV2UgZGV0ZWN0IGZhbHNlIHJldHJhbnNtaXRzIGR1ZSB0byBib3RoIHRvbyBlYXJseQorICogZmFzdCByZXRyYW5zbWl0IChyZW9yZGVyaW5nKSBhbmQgdW5kZXJlc3RpbWF0ZWQgUlRPLCBhbmFseXppbmcKKyAqIHRpbWVzdGFtcHMgYW5kIEQtU0FDS3MuIFdoZW4gd2UgZGV0ZWN0IHRoYXQgc29tZSBzZWdtZW50cyB3ZXJlCisgKiByZXRyYW5zbWl0dGVkIGJ5IG1pc3Rha2UgYW5kIENXTkQgcmVkdWN0aW9uIHdhcyB3cm9uZywgd2UgdW5kbworICogd2luZG93IHJlZHVjdGlvbiBhbmQgYWJvcnQgcmVjb3ZlcnkgcGhhc2UuIFRoaXMgbG9naWMgaXMgaGlkZGVuCisgKiBpbnNpZGUgc2V2ZXJhbCBmdW5jdGlvbnMgbmFtZWQgdGNwX3RyeV91bmRvXzxzb21ldGhpbmc+LgorICovCisKKy8qIFRoaXMgZnVuY3Rpb24gZGVjaWRlcywgd2hlbiB3ZSBzaG91bGQgbGVhdmUgRGlzb3JkZXJlZCBzdGF0ZQorICogYW5kIGVudGVyIFJlY292ZXJ5IHBoYXNlLCByZWR1Y2luZyBjb25nZXN0aW9uIHdpbmRvdy4KKyAqCisgKiBNYWluIHF1ZXN0aW9uOiBtYXkgd2UgZnVydGhlciBjb250aW51ZSBmb3J3YXJkIHRyYW5zbWlzc2lvbgorICogd2l0aCB0aGUgc2FtZSBjd25kPworICovCitzdGF0aWMgaW50IHRjcF90aW1lX3RvX3JlY292ZXIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCV9fdTMyIHBhY2tldHNfb3V0OworCisJLyogVHJpY2sjMTogVGhlIGxvc3MgaXMgcHJvdmVuLiAqLworCWlmICh0cC0+bG9zdF9vdXQpCisJCXJldHVybiAxOworCisJLyogTm90LUEtVHJpY2sjMiA6IENsYXNzaWMgcnVsZS4uLiAqLworCWlmICh0Y3BfZmFja2V0c19vdXQodHApID4gdHAtPnJlb3JkZXJpbmcpCisJCXJldHVybiAxOworCisJLyogVHJpY2sjMyA6IHdoZW4gd2UgdXNlIFJGQzI5ODggdGltZXIgcmVzdGFydCwgZmFzdAorCSAqIHJldHJhbnNtaXQgY2FuIGJlIHRyaWdnZXJlZCBieSB0aW1lb3V0IG9mIHF1ZXVlIGhlYWQuCisJICovCisJaWYgKHRjcF9oZWFkX3RpbWVkb3V0KHNrLCB0cCkpCisJCXJldHVybiAxOworCisJLyogVHJpY2sjNDogSXQgaXMgc3RpbGwgbm90IE9LLi4uIEJ1dCB3aWxsIGl0IGJlIHVzZWZ1bCB0byBkZWxheQorCSAqIHJlY292ZXJ5IG1vcmU/CisJICovCisJcGFja2V0c19vdXQgPSB0cC0+cGFja2V0c19vdXQ7CisJaWYgKHBhY2tldHNfb3V0IDw9IHRwLT5yZW9yZGVyaW5nICYmCisJICAgIHRwLT5zYWNrZWRfb3V0ID49IG1heF90KF9fdTMyLCBwYWNrZXRzX291dC8yLCBzeXNjdGxfdGNwX3Jlb3JkZXJpbmcpICYmCisJICAgICF0Y3BfbWF5X3NlbmRfbm93KHNrLCB0cCkpIHsKKwkJLyogV2UgaGF2ZSBub3RoaW5nIHRvIHNlbmQuIFRoaXMgY29ubmVjdGlvbiBpcyBsaW1pdGVkCisJCSAqIGVpdGhlciBieSByZWNlaXZlciB3aW5kb3cgb3IgYnkgYXBwbGljYXRpb24uCisJCSAqLworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogSWYgd2UgcmVjZWl2ZSBtb3JlIGR1cGFja3MgdGhhbiB3ZSBleHBlY3RlZCBjb3VudGluZyBzZWdtZW50cworICogaW4gYXNzdW1wdGlvbiBvZiBhYnNlbnQgcmVvcmRlcmluZywgaW50ZXJwcmV0IHRoaXMgYXMgcmVvcmRlcmluZy4KKyAqIFRoZSBvbmx5IGFub3RoZXIgcmVhc29uIGNvdWxkIGJlIGJ1ZyBpbiByZWNlaXZlciBUQ1AuCisgKi8KK3N0YXRpYyB2b2lkIHRjcF9jaGVja19yZW5vX3Jlb3JkZXJpbmcoc3RydWN0IHRjcF9zb2NrICp0cCwgaW50IGFkZGVuZCkKK3sKKwl1MzIgaG9sZXM7CisKKwlob2xlcyA9IG1heCh0cC0+bG9zdF9vdXQsIDFVKTsKKwlob2xlcyA9IG1pbihob2xlcywgdHAtPnBhY2tldHNfb3V0KTsKKworCWlmICgodHAtPnNhY2tlZF9vdXQgKyBob2xlcykgPiB0cC0+cGFja2V0c19vdXQpIHsKKwkJdHAtPnNhY2tlZF9vdXQgPSB0cC0+cGFja2V0c19vdXQgLSBob2xlczsKKwkJdGNwX3VwZGF0ZV9yZW9yZGVyaW5nKHRwLCB0cC0+cGFja2V0c19vdXQrYWRkZW5kLCAwKTsKKwl9Cit9CisKKy8qIEVtdWxhdGUgU0FDS3MgZm9yIFNBQ0tsZXNzIGNvbm5lY3Rpb246IGFjY291bnQgZm9yIGEgbmV3IGR1cGFjay4gKi8KKworc3RhdGljIHZvaWQgdGNwX2FkZF9yZW5vX3NhY2soc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwl0cC0+c2Fja2VkX291dCsrOworCXRjcF9jaGVja19yZW5vX3Jlb3JkZXJpbmcodHAsIDApOworCXRjcF9zeW5jX2xlZnRfb3V0KHRwKTsKK30KKworLyogQWNjb3VudCBmb3IgQUNLLCBBQ0tpbmcgc29tZSBkYXRhIGluIFJlbm8gUmVjb3ZlcnkgcGhhc2UuICovCisKK3N0YXRpYyB2b2lkIHRjcF9yZW1vdmVfcmVub19zYWNrcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHAsIGludCBhY2tlZCkKK3sKKwlpZiAoYWNrZWQgPiAwKSB7CisJCS8qIE9uZSBBQ0sgYWNrZWQgaG9sZS4gVGhlIHJlc3QgZWF0IGR1cGxpY2F0ZSBBQ0tzLiAqLworCQlpZiAoYWNrZWQtMSA+PSB0cC0+c2Fja2VkX291dCkKKwkJCXRwLT5zYWNrZWRfb3V0ID0gMDsKKwkJZWxzZQorCQkJdHAtPnNhY2tlZF9vdXQgLT0gYWNrZWQtMTsKKwl9CisJdGNwX2NoZWNrX3Jlbm9fcmVvcmRlcmluZyh0cCwgYWNrZWQpOworCXRjcF9zeW5jX2xlZnRfb3V0KHRwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjcF9yZXNldF9yZW5vX3NhY2soc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwl0cC0+c2Fja2VkX291dCA9IDA7CisJdHAtPmxlZnRfb3V0ID0gdHAtPmxvc3Rfb3V0OworfQorCisvKiBNYXJrIGhlYWQgb2YgcXVldWUgdXAgYXMgbG9zdC4gKi8KK3N0YXRpYyB2b2lkIHRjcF9tYXJrX2hlYWRfbG9zdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHAsCisJCQkgICAgICAgaW50IHBhY2tldHMsIHUzMiBoaWdoX3NlcSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBjbnQgPSBwYWNrZXRzOworCisJQlVHX1RSQVAoY250IDw9IHRwLT5wYWNrZXRzX291dCk7CisKKwlza19zdHJlYW1fZm9yX3JldHJhbnNfcXVldWUoc2tiLCBzaykgeworCQljbnQgLT0gdGNwX3NrYl9wY291bnQoc2tiKTsKKwkJaWYgKGNudCA8IDAgfHwgYWZ0ZXIoVENQX1NLQl9DQihza2IpLT5lbmRfc2VxLCBoaWdoX3NlcSkpCisJCQlicmVhazsKKwkJaWYgKCEoVENQX1NLQl9DQihza2IpLT5zYWNrZWQmVENQQ0JfVEFHQklUUykpIHsKKwkJCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkIHw9IFRDUENCX0xPU1Q7CisJCQl0cC0+bG9zdF9vdXQgKz0gdGNwX3NrYl9wY291bnQoc2tiKTsKKwkJfQorCX0KKwl0Y3Bfc3luY19sZWZ0X291dCh0cCk7Cit9CisKKy8qIEFjY291bnQgbmV3bHkgZGV0ZWN0ZWQgbG9zdCBwYWNrZXQocykgKi8KKworc3RhdGljIHZvaWQgdGNwX3VwZGF0ZV9zY29yZWJvYXJkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwlpZiAoSXNGYWNrKHRwKSkgeworCQlpbnQgbG9zdCA9IHRwLT5mYWNrZXRzX291dCAtIHRwLT5yZW9yZGVyaW5nOworCQlpZiAobG9zdCA8PSAwKQorCQkJbG9zdCA9IDE7CisJCXRjcF9tYXJrX2hlYWRfbG9zdChzaywgdHAsIGxvc3QsIHRwLT5oaWdoX3NlcSk7CisJfSBlbHNlIHsKKwkJdGNwX21hcmtfaGVhZF9sb3N0KHNrLCB0cCwgMSwgdHAtPmhpZ2hfc2VxKTsKKwl9CisKKwkvKiBOZXcgaGV1cmlzdGljczogaXQgaXMgcG9zc2libGUgb25seSBhZnRlciB3ZSBzd2l0Y2hlZAorCSAqIHRvIHJlc3RhcnQgdGltZXIgZWFjaCB0aW1lIHdoZW4gc29tZXRoaW5nIGlzIEFDS2VkLgorCSAqIEhlbmNlLCB3ZSBjYW4gZGV0ZWN0IHRpbWVkIG91dCBwYWNrZXRzIGR1cmluZyBmYXN0CisJICogcmV0cmFuc21pdCB3aXRob3V0IGZhbGxpbmcgdG8gc2xvdyBzdGFydC4KKwkgKi8KKwlpZiAodGNwX2hlYWRfdGltZWRvdXQoc2ssIHRwKSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCXNrX3N0cmVhbV9mb3JfcmV0cmFuc19xdWV1ZShza2IsIHNrKSB7CisJCQlpZiAodGNwX3NrYl90aW1lZG91dCh0cCwgc2tiKSAmJgorCQkJICAgICEoVENQX1NLQl9DQihza2IpLT5zYWNrZWQmVENQQ0JfVEFHQklUUykpIHsKKwkJCQlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCB8PSBUQ1BDQl9MT1NUOworCQkJCXRwLT5sb3N0X291dCArPSB0Y3Bfc2tiX3Bjb3VudChza2IpOworCQkJfQorCQl9CisJCXRjcF9zeW5jX2xlZnRfb3V0KHRwKTsKKwl9Cit9CisKKy8qIENXTkQgbW9kZXJhdGlvbiwgcHJldmVudGluZyBidXJzdHMgZHVlIHRvIHRvbyBiaWcgQUNLcworICogaW4gZHViaW91cyBzaXR1YXRpb25zLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdGNwX21vZGVyYXRlX2N3bmQoc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwl0cC0+c25kX2N3bmQgPSBtaW4odHAtPnNuZF9jd25kLAorCQkJICAgdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKSt0Y3BfbWF4X2J1cnN0KHRwKSk7CisJdHAtPnNuZF9jd25kX3N0YW1wID0gdGNwX3RpbWVfc3RhbXA7Cit9CisKKy8qIERlY3JlYXNlIGN3bmQgZWFjaCBzZWNvbmQgYWNrLiAqLworCitzdGF0aWMgdm9pZCB0Y3BfY3duZF9kb3duKHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJaW50IGRlY3IgPSB0cC0+c25kX2N3bmRfY250ICsgMTsKKwlfX3UzMiBsaW1pdDsKKworCS8qCisJICogVENQIFdlc3R3b29kCisJICogSGVyZSBsaW1pdCBpcyBldmFsdWF0ZWQgYXMgQldlc3RpbWF0aW9uKlJUVG1pbiAoZm9yIG9idGFpbmluZyBpdAorCSAqIGluIHBhY2tldHMgd2UgdXNlIG1zc19jYWNoZSkuIElmIHN5c2N0bF90Y3Bfd2VzdHdvb2QgaXMgb2ZmCisJICogdGNwX3dlc3R3b29kX2J3X3J0dG1pbigpIHJldHVybnMgMC4gSW4gc3VjaCBjYXNlIHNuZF9zc3RocmVzaCBpcworCSAqIHN0aWxsIHVzZWQgYXMgdXN1YWwuIEl0IHByZXZlbnRzIG90aGVyIHN0cmFuZ2UgY2FzZXMgaW4gd2hpY2gKKwkgKiBCV0UqUlRUbWluIGNvdWxkIGFzc3VtZSB2YWx1ZSAwLiBJdCBzaG91bGQgbm90IGhhcHBlbiBidXQuLi4KKwkgKi8KKworCWlmICghKGxpbWl0ID0gdGNwX3dlc3R3b29kX2J3X3J0dG1pbih0cCkpKQorCQlsaW1pdCA9IHRwLT5zbmRfc3N0aHJlc2gvMjsKKworCXRwLT5zbmRfY3duZF9jbnQgPSBkZWNyJjE7CisJZGVjciA+Pj0gMTsKKworCWlmIChkZWNyICYmIHRwLT5zbmRfY3duZCA+IGxpbWl0KQorCQl0cC0+c25kX2N3bmQgLT0gZGVjcjsKKworCXRwLT5zbmRfY3duZCA9IG1pbih0cC0+c25kX2N3bmQsIHRjcF9wYWNrZXRzX2luX2ZsaWdodCh0cCkrMSk7CisJdHAtPnNuZF9jd25kX3N0YW1wID0gdGNwX3RpbWVfc3RhbXA7Cit9CisKKy8qIE5vdGhpbmcgd2FzIHJldHJhbnNtaXR0ZWQgb3IgcmV0dXJuZWQgdGltZXN0YW1wIGlzIGxlc3MKKyAqIHRoYW4gdGltZXN0YW1wIG9mIHRoZSBmaXJzdCByZXRyYW5zbWlzc2lvbi4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdGNwX3BhY2tldF9kZWxheWVkKHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJcmV0dXJuICF0cC0+cmV0cmFuc19zdGFtcCB8fAorCQkodHAtPnJ4X29wdC5zYXdfdHN0YW1wICYmIHRwLT5yeF9vcHQucmN2X3RzZWNyICYmCisJCSAoX19zMzIpKHRwLT5yeF9vcHQucmN2X3RzZWNyIC0gdHAtPnJldHJhbnNfc3RhbXApIDwgMCk7Cit9CisKKy8qIFVuZG8gcHJvY2VkdXJlcy4gKi8KKworI2lmIEZBU1RSRVRSQU5TX0RFQlVHID4gMQorc3RhdGljIHZvaWQgREJHVU5ETyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHAsIGNvbnN0IGNoYXIgKm1zZykKK3sKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisJcHJpbnRrKEtFUk5fREVCVUcgIlVuZG8gJXMgJXUuJXUuJXUuJXUvJXUgYyV1IGwldSBzcyV1LyV1IHAldVxuIiwKKwkgICAgICAgbXNnLAorCSAgICAgICBOSVBRVUFEKGluZXQtPmRhZGRyKSwgbnRvaHMoaW5ldC0+ZHBvcnQpLAorCSAgICAgICB0cC0+c25kX2N3bmQsIHRwLT5sZWZ0X291dCwKKwkgICAgICAgdHAtPnNuZF9zc3RocmVzaCwgdHAtPnByaW9yX3NzdGhyZXNoLAorCSAgICAgICB0cC0+cGFja2V0c19vdXQpOworfQorI2Vsc2UKKyNkZWZpbmUgREJHVU5ETyh4Li4uKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworc3RhdGljIHZvaWQgdGNwX3VuZG9fY3dyKHN0cnVjdCB0Y3Bfc29jayAqdHAsIGludCB1bmRvKQoreworCWlmICh0cC0+cHJpb3Jfc3N0aHJlc2gpIHsKKwkJaWYgKHRjcF9pc19iaWModHApKQorCQkJdHAtPnNuZF9jd25kID0gbWF4KHRwLT5zbmRfY3duZCwgdHAtPmJpY3RjcC5sYXN0X21heF9jd25kKTsKKwkJZWxzZQorCQkJdHAtPnNuZF9jd25kID0gbWF4KHRwLT5zbmRfY3duZCwgdHAtPnNuZF9zc3RocmVzaDw8MSk7CisKKwkJaWYgKHVuZG8gJiYgdHAtPnByaW9yX3NzdGhyZXNoID4gdHAtPnNuZF9zc3RocmVzaCkgeworCQkJdHAtPnNuZF9zc3RocmVzaCA9IHRwLT5wcmlvcl9zc3RocmVzaDsKKwkJCVRDUF9FQ05fd2l0aGRyYXdfY3dyKHRwKTsKKwkJfQorCX0gZWxzZSB7CisJCXRwLT5zbmRfY3duZCA9IG1heCh0cC0+c25kX2N3bmQsIHRwLT5zbmRfc3N0aHJlc2gpOworCX0KKwl0Y3BfbW9kZXJhdGVfY3duZCh0cCk7CisJdHAtPnNuZF9jd25kX3N0YW1wID0gdGNwX3RpbWVfc3RhbXA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRjcF9tYXlfdW5kbyhzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCXJldHVybiB0cC0+dW5kb19tYXJrZXIgJiYKKwkJKCF0cC0+dW5kb19yZXRyYW5zIHx8IHRjcF9wYWNrZXRfZGVsYXllZCh0cCkpOworfQorCisvKiBQZW9wbGUgY2VsZWJyYXRlOiAiV2UgbG92ZSBvdXIgUHJlc2lkZW50ISIgKi8KK3N0YXRpYyBpbnQgdGNwX3RyeV91bmRvX3JlY292ZXJ5KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwlpZiAodGNwX21heV91bmRvKHRwKSkgeworCQkvKiBIYXBweSBlbmQhIFdlIGRpZCBub3QgcmV0cmFuc21pdCBhbnl0aGluZworCQkgKiBvciBvdXIgb3JpZ2luYWwgdHJhbnNtaXNzaW9uIHN1Y2NlZWRlZC4KKwkJICovCisJCURCR1VORE8oc2ssIHRwLCB0cC0+Y2Ffc3RhdGUgPT0gVENQX0NBX0xvc3MgPyAibG9zcyIgOiAicmV0cmFucyIpOworCQl0Y3BfdW5kb19jd3IodHAsIDEpOworCQlpZiAodHAtPmNhX3N0YXRlID09IFRDUF9DQV9Mb3NzKQorCQkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfVENQTE9TU1VORE8pOworCQllbHNlCisJCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BGVUxMVU5ETyk7CisJCXRwLT51bmRvX21hcmtlciA9IDA7CisJfQorCWlmICh0cC0+c25kX3VuYSA9PSB0cC0+aGlnaF9zZXEgJiYgSXNSZW5vKHRwKSkgeworCQkvKiBIb2xkIG9sZCBzdGF0ZSB1bnRpbCBzb21ldGhpbmcgKmFib3ZlKiBoaWdoX3NlcQorCQkgKiBpcyBBQ0tlZC4gRm9yIFJlbm8gaXQgaXMgTVVTVCB0byBwcmV2ZW50IGZhbHNlCisJCSAqIGZhc3QgcmV0cmFuc21pdHMgKFJGQzI1ODIpLiBTQUNLIFRDUCBpcyBzYWZlLiAqLworCQl0Y3BfbW9kZXJhdGVfY3duZCh0cCk7CisJCXJldHVybiAxOworCX0KKwl0Y3Bfc2V0X2NhX3N0YXRlKHRwLCBUQ1BfQ0FfT3Blbik7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRyeSB0byB1bmRvIGN3bmQgcmVkdWN0aW9uLCBiZWNhdXNlIEQtU0FDS3MgYWNrZWQgYWxsIHJldHJhbnNtaXR0ZWQgZGF0YSAqLworc3RhdGljIHZvaWQgdGNwX3RyeV91bmRvX2RzYWNrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwlpZiAodHAtPnVuZG9fbWFya2VyICYmICF0cC0+dW5kb19yZXRyYW5zKSB7CisJCURCR1VORE8oc2ssIHRwLCAiRC1TQUNLIik7CisJCXRjcF91bmRvX2N3cih0cCwgMSk7CisJCXRwLT51bmRvX21hcmtlciA9IDA7CisJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUERTQUNLVU5ETyk7CisJfQorfQorCisvKiBVbmRvIGR1cmluZyBmYXN0IHJlY292ZXJ5IGFmdGVyIHBhcnRpYWwgQUNLLiAqLworCitzdGF0aWMgaW50IHRjcF90cnlfdW5kb19wYXJ0aWFsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCwKKwkJCQlpbnQgYWNrZWQpCit7CisJLyogUGFydGlhbCBBQ0sgYXJyaXZlZC4gRm9yY2UgSG9lJ3MgcmV0cmFuc21pdC4gKi8KKwlpbnQgZmFpbGVkID0gSXNSZW5vKHRwKSB8fCB0cC0+ZmFja2V0c19vdXQ+dHAtPnJlb3JkZXJpbmc7CisKKwlpZiAodGNwX21heV91bmRvKHRwKSkgeworCQkvKiBQbGFpbiBsdWNrISBIb2xlIGlmIGZpbGxlZCB3aXRoIGRlbGF5ZWQKKwkJICogcGFja2V0LCByYXRoZXIgdGhhbiB3aXRoIGEgcmV0cmFuc21pdC4KKwkJICovCisJCWlmICh0cC0+cmV0cmFuc19vdXQgPT0gMCkKKwkJCXRwLT5yZXRyYW5zX3N0YW1wID0gMDsKKworCQl0Y3BfdXBkYXRlX3Jlb3JkZXJpbmcodHAsIHRjcF9mYWNrZXRzX291dCh0cCkrYWNrZWQsIDEpOworCisJCURCR1VORE8oc2ssIHRwLCAiSG9lIik7CisJCXRjcF91bmRvX2N3cih0cCwgMCk7CisJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUFBBUlRJQUxVTkRPKTsKKworCQkvKiBTby4uLiBEbyBub3QgbWFrZSBIb2UncyByZXRyYW5zbWl0IHlldC4KKwkJICogSWYgdGhlIGZpcnN0IHBhY2tldCB3YXMgZGVsYXllZCwgdGhlIHJlc3QKKwkJICogb25lcyBhcmUgbW9zdCBwcm9iYWJseSBkZWxheWVkIGFzIHdlbGwuCisJCSAqLworCQlmYWlsZWQgPSAwOworCX0KKwlyZXR1cm4gZmFpbGVkOworfQorCisvKiBVbmRvIGR1cmluZyBsb3NzIHJlY292ZXJ5IGFmdGVyIHBhcnRpYWwgQUNLLiAqLworc3RhdGljIGludCB0Y3BfdHJ5X3VuZG9fbG9zcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJaWYgKHRjcF9tYXlfdW5kbyh0cCkpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJc2tfc3RyZWFtX2Zvcl9yZXRyYW5zX3F1ZXVlKHNrYiwgc2spIHsKKwkJCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkICY9IH5UQ1BDQl9MT1NUOworCQl9CisJCURCR1VORE8oc2ssIHRwLCAicGFydGlhbCBsb3NzIik7CisJCXRwLT5sb3N0X291dCA9IDA7CisJCXRwLT5sZWZ0X291dCA9IHRwLT5zYWNrZWRfb3V0OworCQl0Y3BfdW5kb19jd3IodHAsIDEpOworCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BMT1NTVU5ETyk7CisJCXRwLT5yZXRyYW5zbWl0cyA9IDA7CisJCXRwLT51bmRvX21hcmtlciA9IDA7CisJCWlmICghSXNSZW5vKHRwKSkKKwkJCXRjcF9zZXRfY2Ffc3RhdGUodHAsIFRDUF9DQV9PcGVuKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNwX2NvbXBsZXRlX2N3cihzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCWlmICh0Y3Bfd2VzdHdvb2RfY3duZCh0cCkpIAorCQl0cC0+c25kX3NzdGhyZXNoID0gdHAtPnNuZF9jd25kOworCWVsc2UKKwkJdHAtPnNuZF9jd25kID0gbWluKHRwLT5zbmRfY3duZCwgdHAtPnNuZF9zc3RocmVzaCk7CisJdHAtPnNuZF9jd25kX3N0YW1wID0gdGNwX3RpbWVfc3RhbXA7Cit9CisKK3N0YXRpYyB2b2lkIHRjcF90cnlfdG9fb3BlbihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHAsIGludCBmbGFnKQoreworCXRwLT5sZWZ0X291dCA9IHRwLT5zYWNrZWRfb3V0OworCisJaWYgKHRwLT5yZXRyYW5zX291dCA9PSAwKQorCQl0cC0+cmV0cmFuc19zdGFtcCA9IDA7CisKKwlpZiAoZmxhZyZGTEFHX0VDRSkKKwkJdGNwX2VudGVyX2N3cih0cCk7CisKKwlpZiAodHAtPmNhX3N0YXRlICE9IFRDUF9DQV9DV1IpIHsKKwkJaW50IHN0YXRlID0gVENQX0NBX09wZW47CisKKwkJaWYgKHRwLT5sZWZ0X291dCB8fCB0cC0+cmV0cmFuc19vdXQgfHwgdHAtPnVuZG9fbWFya2VyKQorCQkJc3RhdGUgPSBUQ1BfQ0FfRGlzb3JkZXI7CisKKwkJaWYgKHRwLT5jYV9zdGF0ZSAhPSBzdGF0ZSkgeworCQkJdGNwX3NldF9jYV9zdGF0ZSh0cCwgc3RhdGUpOworCQkJdHAtPmhpZ2hfc2VxID0gdHAtPnNuZF9ueHQ7CisJCX0KKwkJdGNwX21vZGVyYXRlX2N3bmQodHApOworCX0gZWxzZSB7CisJCXRjcF9jd25kX2Rvd24odHApOworCX0KK30KKworLyogUHJvY2VzcyBhbiBldmVudCwgd2hpY2ggY2FuIHVwZGF0ZSBwYWNrZXRzLWluLWZsaWdodCBub3QgdHJpdmlhbGx5LgorICogTWFpbiBnb2FsIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gY2FsY3VsYXRlIG5ldyBlc3RpbWF0ZSBmb3IgbGVmdF9vdXQsCisgKiB0YWtpbmcgaW50byBhY2NvdW50IGJvdGggcGFja2V0cyBzaXR0aW5nIGluIHJlY2VpdmVyJ3MgYnVmZmVyIGFuZAorICogcGFja2V0cyBsb3N0IGJ5IG5ldHdvcmsuCisgKgorICogQmVzaWRlcyB0aGF0IGl0IGRvZXMgQ1dORCByZWR1Y3Rpb24sIHdoZW4gcGFja2V0IGxvc3MgaXMgZGV0ZWN0ZWQKKyAqIGFuZCBjaGFuZ2VzIHN0YXRlIG9mIG1hY2hpbmUuCisgKgorICogSXQgZG9lcyBfbm90XyBkZWNpZGUgd2hhdCB0byBzZW5kLCBpdCBpcyBtYWRlIGluIGZ1bmN0aW9uCisgKiB0Y3BfeG1pdF9yZXRyYW5zbWl0X3F1ZXVlKCkuCisgKi8KK3N0YXRpYyB2b2lkCit0Y3BfZmFzdHJldHJhbnNfYWxlcnQoc3RydWN0IHNvY2sgKnNrLCB1MzIgcHJpb3Jfc25kX3VuYSwKKwkJICAgICAgaW50IHByaW9yX3BhY2tldHMsIGludCBmbGFnKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCWludCBpc19kdXBhY2sgPSAodHAtPnNuZF91bmEgPT0gcHJpb3Jfc25kX3VuYSAmJiAhKGZsYWcmRkxBR19OT1RfRFVQKSk7CisKKwkvKiBTb21lIHRlY2huaWNhbCB0aGluZ3M6CisJICogMS4gUmVubyBkb2VzIG5vdCBjb3VudCBkdXBhY2tzIChzYWNrZWRfb3V0KSBhdXRvbWF0aWNhbGx5LiAqLworCWlmICghdHAtPnBhY2tldHNfb3V0KQorCQl0cC0+c2Fja2VkX291dCA9IDA7CisgICAgICAgIC8qIDIuIFNBQ0sgY291bnRzIHNuZF9mYWNrIGluIHBhY2tldHMgaW5hY2N1cmF0ZWx5LiAqLworCWlmICh0cC0+c2Fja2VkX291dCA9PSAwKQorCQl0cC0+ZmFja2V0c19vdXQgPSAwOworCisgICAgICAgIC8qIE5vdyBzdGF0ZSBtYWNoaW5lIHN0YXJ0cy4KKwkgKiBBLiBFQ0UsIGhlbmNlIHByb2hpYml0IGN3bmQgdW5kb2luZywgdGhlIHJlZHVjdGlvbiBpcyByZXF1aXJlZC4gKi8KKwlpZiAoZmxhZyZGTEFHX0VDRSkKKwkJdHAtPnByaW9yX3NzdGhyZXNoID0gMDsKKworCS8qIEIuIEluIGFsbCB0aGUgc3RhdGVzIGNoZWNrIGZvciByZW5lZ2luZyBTQUNLcy4gKi8KKwlpZiAodHAtPnNhY2tlZF9vdXQgJiYgdGNwX2NoZWNrX3NhY2tfcmVuZWdpbmcoc2ssIHRwKSkKKwkJcmV0dXJuOworCisJLyogQy4gUHJvY2VzcyBkYXRhIGxvc3Mgbm90aWZpY2F0aW9uLCBwcm92aWRlZCBpdCBpcyB2YWxpZC4gKi8KKwlpZiAoKGZsYWcmRkxBR19EQVRBX0xPU1QpICYmCisJICAgIGJlZm9yZSh0cC0+c25kX3VuYSwgdHAtPmhpZ2hfc2VxKSAmJgorCSAgICB0cC0+Y2Ffc3RhdGUgIT0gVENQX0NBX09wZW4gJiYKKwkgICAgdHAtPmZhY2tldHNfb3V0ID4gdHAtPnJlb3JkZXJpbmcpIHsKKwkJdGNwX21hcmtfaGVhZF9sb3N0KHNrLCB0cCwgdHAtPmZhY2tldHNfb3V0LXRwLT5yZW9yZGVyaW5nLCB0cC0+aGlnaF9zZXEpOworCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BMT1NTKTsKKwl9CisKKwkvKiBELiBTeW5jaHJvbml6ZSBsZWZ0X291dCB0byBjdXJyZW50IHN0YXRlLiAqLworCXRjcF9zeW5jX2xlZnRfb3V0KHRwKTsKKworCS8qIEUuIENoZWNrIHN0YXRlIGV4aXQgY29uZGl0aW9ucy4gU3RhdGUgY2FuIGJlIHRlcm1pbmF0ZWQKKwkgKiAgICB3aGVuIGhpZ2hfc2VxIGlzIEFDS2VkLiAqLworCWlmICh0cC0+Y2Ffc3RhdGUgPT0gVENQX0NBX09wZW4pIHsKKwkJaWYgKCFzeXNjdGxfdGNwX2ZydG8pCisJCQlCVUdfVFJBUCh0cC0+cmV0cmFuc19vdXQgPT0gMCk7CisJCXRwLT5yZXRyYW5zX3N0YW1wID0gMDsKKwl9IGVsc2UgaWYgKCFiZWZvcmUodHAtPnNuZF91bmEsIHRwLT5oaWdoX3NlcSkpIHsKKwkJc3dpdGNoICh0cC0+Y2Ffc3RhdGUpIHsKKwkJY2FzZSBUQ1BfQ0FfTG9zczoKKwkJCXRwLT5yZXRyYW5zbWl0cyA9IDA7CisJCQlpZiAodGNwX3RyeV91bmRvX3JlY292ZXJ5KHNrLCB0cCkpCisJCQkJcmV0dXJuOworCQkJYnJlYWs7CisKKwkJY2FzZSBUQ1BfQ0FfQ1dSOgorCQkJLyogQ1dSIGlzIHRvIGJlIGhlbGQgc29tZXRoaW5nICphYm92ZSogaGlnaF9zZXEKKwkJCSAqIGlzIEFDS2VkIGZvciBDV1IgYml0IHRvIHJlYWNoIHJlY2VpdmVyLiAqLworCQkJaWYgKHRwLT5zbmRfdW5hICE9IHRwLT5oaWdoX3NlcSkgeworCQkJCXRjcF9jb21wbGV0ZV9jd3IodHApOworCQkJCXRjcF9zZXRfY2Ffc3RhdGUodHAsIFRDUF9DQV9PcGVuKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVENQX0NBX0Rpc29yZGVyOgorCQkJdGNwX3RyeV91bmRvX2RzYWNrKHNrLCB0cCk7CisJCQlpZiAoIXRwLT51bmRvX21hcmtlciB8fAorCQkJICAgIC8qIEZvciBTQUNLIGNhc2UgZG8gbm90IE9wZW4gdG8gYWxsb3cgdG8gdW5kbworCQkJICAgICAqIGNhdGNoaW5nIGZvciBhbGwgZHVwbGljYXRlIEFDS3MuICovCisJCQkgICAgSXNSZW5vKHRwKSB8fCB0cC0+c25kX3VuYSAhPSB0cC0+aGlnaF9zZXEpIHsKKwkJCQl0cC0+dW5kb19tYXJrZXIgPSAwOworCQkJCXRjcF9zZXRfY2Ffc3RhdGUodHAsIFRDUF9DQV9PcGVuKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVENQX0NBX1JlY292ZXJ5OgorCQkJaWYgKElzUmVubyh0cCkpCisJCQkJdGNwX3Jlc2V0X3Jlbm9fc2Fjayh0cCk7CisJCQlpZiAodGNwX3RyeV91bmRvX3JlY292ZXJ5KHNrLCB0cCkpCisJCQkJcmV0dXJuOworCQkJdGNwX2NvbXBsZXRlX2N3cih0cCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIEYuIFByb2Nlc3Mgc3RhdGUuICovCisJc3dpdGNoICh0cC0+Y2Ffc3RhdGUpIHsKKwljYXNlIFRDUF9DQV9SZWNvdmVyeToKKwkJaWYgKHByaW9yX3NuZF91bmEgPT0gdHAtPnNuZF91bmEpIHsKKwkJCWlmIChJc1Jlbm8odHApICYmIGlzX2R1cGFjaykKKwkJCQl0Y3BfYWRkX3Jlbm9fc2Fjayh0cCk7CisJCX0gZWxzZSB7CisJCQlpbnQgYWNrZWQgPSBwcmlvcl9wYWNrZXRzIC0gdHAtPnBhY2tldHNfb3V0OworCQkJaWYgKElzUmVubyh0cCkpCisJCQkJdGNwX3JlbW92ZV9yZW5vX3NhY2tzKHNrLCB0cCwgYWNrZWQpOworCQkJaXNfZHVwYWNrID0gdGNwX3RyeV91bmRvX3BhcnRpYWwoc2ssIHRwLCBhY2tlZCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUQ1BfQ0FfTG9zczoKKwkJaWYgKGZsYWcmRkxBR19EQVRBX0FDS0VEKQorCQkJdHAtPnJldHJhbnNtaXRzID0gMDsKKwkJaWYgKCF0Y3BfdHJ5X3VuZG9fbG9zcyhzaywgdHApKSB7CisJCQl0Y3BfbW9kZXJhdGVfY3duZCh0cCk7CisJCQl0Y3BfeG1pdF9yZXRyYW5zbWl0X3F1ZXVlKHNrKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAodHAtPmNhX3N0YXRlICE9IFRDUF9DQV9PcGVuKQorCQkJcmV0dXJuOworCQkvKiBMb3NzIGlzIHVuZG9uZTsgZmFsbCB0aHJvdWdoIHRvIHByb2Nlc3NpbmcgaW4gT3BlbiBzdGF0ZS4gKi8KKwlkZWZhdWx0OgorCQlpZiAoSXNSZW5vKHRwKSkgeworCQkJaWYgKHRwLT5zbmRfdW5hICE9IHByaW9yX3NuZF91bmEpCisJCQkJdGNwX3Jlc2V0X3Jlbm9fc2Fjayh0cCk7CisJCQlpZiAoaXNfZHVwYWNrKQorCQkJCXRjcF9hZGRfcmVub19zYWNrKHRwKTsKKwkJfQorCisJCWlmICh0cC0+Y2Ffc3RhdGUgPT0gVENQX0NBX0Rpc29yZGVyKQorCQkJdGNwX3RyeV91bmRvX2RzYWNrKHNrLCB0cCk7CisKKwkJaWYgKCF0Y3BfdGltZV90b19yZWNvdmVyKHNrLCB0cCkpIHsKKwkJCXRjcF90cnlfdG9fb3BlbihzaywgdHAsIGZsYWcpOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogT3RoZXJ3aXNlIGVudGVyIFJlY292ZXJ5IHN0YXRlICovCisKKwkJaWYgKElzUmVubyh0cCkpCisJCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BSRU5PUkVDT1ZFUlkpOworCQllbHNlCisJCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BTQUNLUkVDT1ZFUlkpOworCisJCXRwLT5oaWdoX3NlcSA9IHRwLT5zbmRfbnh0OworCQl0cC0+cHJpb3Jfc3N0aHJlc2ggPSAwOworCQl0cC0+dW5kb19tYXJrZXIgPSB0cC0+c25kX3VuYTsKKwkJdHAtPnVuZG9fcmV0cmFucyA9IHRwLT5yZXRyYW5zX291dDsKKworCQlpZiAodHAtPmNhX3N0YXRlIDwgVENQX0NBX0NXUikgeworCQkJaWYgKCEoZmxhZyZGTEFHX0VDRSkpCisJCQkJdHAtPnByaW9yX3NzdGhyZXNoID0gdGNwX2N1cnJlbnRfc3N0aHJlc2godHApOworCQkJdHAtPnNuZF9zc3RocmVzaCA9IHRjcF9yZWNhbGNfc3N0aHJlc2godHApOworCQkJVENQX0VDTl9xdWV1ZV9jd3IodHApOworCQl9CisKKwkJdHAtPnNuZF9jd25kX2NudCA9IDA7CisJCXRjcF9zZXRfY2Ffc3RhdGUodHAsIFRDUF9DQV9SZWNvdmVyeSk7CisJfQorCisJaWYgKGlzX2R1cGFjayB8fCB0Y3BfaGVhZF90aW1lZG91dChzaywgdHApKQorCQl0Y3BfdXBkYXRlX3Njb3JlYm9hcmQoc2ssIHRwKTsKKwl0Y3BfY3duZF9kb3duKHRwKTsKKwl0Y3BfeG1pdF9yZXRyYW5zbWl0X3F1ZXVlKHNrKTsKK30KKworLyogUmVhZCBkcmFmdC1pZXRmLXRjcGx3LWhpZ2gtcGVyZm9ybWFuY2UgYmVmb3JlIG11Y2tpbmcKKyAqIHdpdGggdGhpcyBjb2RlLiAoU3VwZXJjZWVkcyBSRkMxMzIzKQorICovCitzdGF0aWMgdm9pZCB0Y3BfYWNrX3Nhd190c3RhbXAoc3RydWN0IHRjcF9zb2NrICp0cCwgaW50IGZsYWcpCit7CisJX191MzIgc2VxX3J0dDsKKworCS8qIFJUVE0gUnVsZTogQSBUU2VjciB2YWx1ZSByZWNlaXZlZCBpbiBhIHNlZ21lbnQgaXMgdXNlZCB0bworCSAqIHVwZGF0ZSB0aGUgYXZlcmFnZWQgUlRUIG1lYXN1cmVtZW50IG9ubHkgaWYgdGhlIHNlZ21lbnQKKwkgKiBhY2tub3dsZWRnZXMgc29tZSBuZXcgZGF0YSwgaS5lLiwgb25seSBpZiBpdCBhZHZhbmNlcyB0aGUKKwkgKiBsZWZ0IGVkZ2Ugb2YgdGhlIHNlbmQgd2luZG93LgorCSAqCisJICogU2VlIGRyYWZ0LWlldGYtdGNwbHctaGlnaC1wZXJmb3JtYW5jZS0wMCwgc2VjdGlvbiAzLjMuCisJICogMTk5OC8wNC8xMCBBbmRyZXkgVi4gU2F2b2Noa2luIDxzYXdAbXN1LnJ1PgorCSAqCisJICogQ2hhbmdlZDogcmVzZXQgYmFja29mZiBhcyBzb29uIGFzIHdlIHNlZSB0aGUgZmlyc3QgdmFsaWQgc2FtcGxlLgorCSAqIElmIHdlIGRvIG5vdCwgd2UgZ2V0IHN0cm9uZ2x5IG92ZXJzdGltYXRlZCBydG8uIFdpdGggdGltZXN0YW1wcworCSAqIHNhbXBsZXMgYXJlIGFjY2VwdGVkIGV2ZW4gZnJvbSB2ZXJ5IG9sZCBzZWdtZW50czogZi5lLiwgd2hlbiBydHQ9MQorCSAqIGluY3JlYXNlcyB0byA4LCB3ZSByZXRyYW5zbWl0IDUgdGltZXMgYW5kIGFmdGVyIDggc2Vjb25kcyBkZWxheWVkCisJICogYW5zd2VyIGFycml2ZXMgcnRvIGJlY29tZXMgMTIwIHNlY29uZHMhIElmIGF0IGxlYXN0IG9uZSBvZiBzZWdtZW50cworCSAqIGluIHdpbmRvdyBpcyBsb3N0Li4uIFZvaWxhLgkgCQkJLS1BTksgKDAxMDIxMCkKKwkgKi8KKwlzZXFfcnR0ID0gdGNwX3RpbWVfc3RhbXAgLSB0cC0+cnhfb3B0LnJjdl90c2VjcjsKKwl0Y3BfcnR0X2VzdGltYXRvcih0cCwgc2VxX3J0dCk7CisJdGNwX3NldF9ydG8odHApOworCXRwLT5iYWNrb2ZmID0gMDsKKwl0Y3BfYm91bmRfcnRvKHRwKTsKK30KKworc3RhdGljIHZvaWQgdGNwX2Fja19ub190c3RhbXAoc3RydWN0IHRjcF9zb2NrICp0cCwgdTMyIHNlcV9ydHQsIGludCBmbGFnKQoreworCS8qIFdlIGRvbid0IGhhdmUgYSB0aW1lc3RhbXAuIENhbiBvbmx5IHVzZQorCSAqIHBhY2tldHMgdGhhdCBhcmUgbm90IHJldHJhbnNtaXR0ZWQgdG8gZGV0ZXJtaW5lCisJICogcnR0IGVzdGltYXRlcy4gQWxzbywgd2UgbXVzdCBub3QgcmVzZXQgdGhlCisJICogYmFja29mZiBmb3IgcnRvIHVudGlsIHdlIGdldCBhIG5vbi1yZXRyYW5zbWl0dGVkCisJICogcGFja2V0LiBUaGlzIGFsbG93cyB1cyB0byBkZWFsIHdpdGggYSBzaXR1YXRpb24KKwkgKiB3aGVyZSB0aGUgbmV0d29yayBkZWxheSBoYXMgaW5jcmVhc2VkIHN1ZGRlbmx5LgorCSAqIEkuZS4gS2FybidzIGFsZ29yaXRobS4gKFNJR0NPTU0gJzg3LCBwNS4pCisJICovCisKKwlpZiAoZmxhZyAmIEZMQUdfUkVUUkFOU19EQVRBX0FDS0VEKQorCQlyZXR1cm47CisKKwl0Y3BfcnR0X2VzdGltYXRvcih0cCwgc2VxX3J0dCk7CisJdGNwX3NldF9ydG8odHApOworCXRwLT5iYWNrb2ZmID0gMDsKKwl0Y3BfYm91bmRfcnRvKHRwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjcF9hY2tfdXBkYXRlX3J0dChzdHJ1Y3QgdGNwX3NvY2sgKnRwLAorCQkJCSAgICAgIGludCBmbGFnLCBzMzIgc2VxX3J0dCkKK3sKKwkvKiBOb3RlIHRoYXQgcGVlciBNQVkgc2VuZCB6ZXJvIGVjaG8uIEluIHRoaXMgY2FzZSBpdCBpcyBpZ25vcmVkLiAocmZjMTMyMykgKi8KKwlpZiAodHAtPnJ4X29wdC5zYXdfdHN0YW1wICYmIHRwLT5yeF9vcHQucmN2X3RzZWNyKQorCQl0Y3BfYWNrX3Nhd190c3RhbXAodHAsIGZsYWcpOworCWVsc2UgaWYgKHNlcV9ydHQgPj0gMCkKKwkJdGNwX2Fja19ub190c3RhbXAodHAsIHNlcV9ydHQsIGZsYWcpOworfQorCisvKgorICogQ29tcHV0ZSBjb25nZXN0aW9uIHdpbmRvdyB0byB1c2UuCisgKgorICogVGhpcyBpcyBmcm9tIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBCSUNUQ1AgaW4KKyAqIExpc29uLVh1LCBLYWhhbGVkIEhhcmZvdXNoLCBhbmQgSW5qb2cgUmhlZS4KKyAqICAiQmluYXJ5IEluY3JlYXNlIENvbmdlc3Rpb24gQ29udHJvbCBmb3IgRmFzdCwgTG9uZyBEaXN0YW5jZQorICogIE5ldHdvcmtzIiBpbiBJbmZvQ29tbSAyMDA0CisgKiBBdmFpbGFibGUgZnJvbToKKyAqICBodHRwOi8vd3d3LmNzYy5uY3N1LmVkdS9mYWN1bHR5L3JoZWUvZXhwb3J0L2JpdGNwLnBkZgorICoKKyAqIFVubGVzcyBCSUMgaXMgZW5hYmxlZCBhbmQgY29uZ2VzdGlvbiB3aW5kb3cgaXMgbGFyZ2UKKyAqIHRoaXMgYmVoYXZlcyB0aGUgc2FtZSBhcyB0aGUgb3JpZ2luYWwgUmVuby4KKyAqLworc3RhdGljIGlubGluZSBfX3UzMiBiaWN0Y3BfY3duZChzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCS8qIG9yaWduYWwgUmVubyBiZWhhdmlvdXIgKi8KKwlpZiAoIXRjcF9pc19iaWModHApKQorCQlyZXR1cm4gdHAtPnNuZF9jd25kOworCisJaWYgKHRwLT5iaWN0Y3AubGFzdF9jd25kID09IHRwLT5zbmRfY3duZCAmJgorCSAgIChzMzIpKHRjcF90aW1lX3N0YW1wIC0gdHAtPmJpY3RjcC5sYXN0X3N0YW1wKSA8PSAoSFo+PjUpKQorCQlyZXR1cm4gdHAtPmJpY3RjcC5jbnQ7CisKKwl0cC0+YmljdGNwLmxhc3RfY3duZCA9IHRwLT5zbmRfY3duZDsKKwl0cC0+YmljdGNwLmxhc3Rfc3RhbXAgPSB0Y3BfdGltZV9zdGFtcDsKKyAgICAgIAorCS8qIHN0YXJ0IG9mZiBub3JtYWwgKi8KKwlpZiAodHAtPnNuZF9jd25kIDw9IHN5c2N0bF90Y3BfYmljX2xvd193aW5kb3cpCisJCXRwLT5iaWN0Y3AuY250ID0gdHAtPnNuZF9jd25kOworCisJLyogYmluYXJ5IGluY3JlYXNlICovCisJZWxzZSBpZiAodHAtPnNuZF9jd25kIDwgdHAtPmJpY3RjcC5sYXN0X21heF9jd25kKSB7CisJCV9fdTMyIAlkaXN0ID0gKHRwLT5iaWN0Y3AubGFzdF9tYXhfY3duZCAtIHRwLT5zbmRfY3duZCkKKwkJCS8gQklDVENQX0I7CisKKwkJaWYgKGRpc3QgPiBCSUNUQ1BfTUFYX0lOQ1JFTUVOVCkKKwkJCS8qIGxpbmVhciBpbmNyZWFzZSAqLworCQkJdHAtPmJpY3RjcC5jbnQgPSB0cC0+c25kX2N3bmQgLyBCSUNUQ1BfTUFYX0lOQ1JFTUVOVDsKKwkJZWxzZSBpZiAoZGlzdCA8PSAxVSkKKwkJCS8qIGJpbmFyeSBzZWFyY2ggaW5jcmVhc2UgKi8KKwkJCXRwLT5iaWN0Y3AuY250ID0gdHAtPnNuZF9jd25kICogQklDVENQX0ZVTkNfT0ZfTUlOX0lOQ1IKKwkJCQkvIEJJQ1RDUF9COworCQllbHNlCisJCQkvKiBiaW5hcnkgc2VhcmNoIGluY3JlYXNlICovCisJCQl0cC0+YmljdGNwLmNudCA9IHRwLT5zbmRfY3duZCAvIGRpc3Q7CisJfSBlbHNlIHsKKwkJLyogc2xvdyBzdGFydCBhbWQgbGluZWFyIGluY3JlYXNlICovCisJCWlmICh0cC0+c25kX2N3bmQgPCB0cC0+YmljdGNwLmxhc3RfbWF4X2N3bmQgKyBCSUNUQ1BfQikKKwkJCS8qIHNsb3cgc3RhcnQgKi8KKwkJCXRwLT5iaWN0Y3AuY250ID0gdHAtPnNuZF9jd25kICogQklDVENQX0ZVTkNfT0ZfTUlOX0lOQ1IKKwkJCQkvIEJJQ1RDUF9COworCQllbHNlIGlmICh0cC0+c25kX2N3bmQgPCB0cC0+YmljdGNwLmxhc3RfbWF4X2N3bmQKKwkJCSAJCSsgQklDVENQX01BWF9JTkNSRU1FTlQqKEJJQ1RDUF9CLTEpKQorCQkJLyogc2xvdyBzdGFydCAqLworCQkJdHAtPmJpY3RjcC5jbnQgPSB0cC0+c25kX2N3bmQgKiAoQklDVENQX0ItMSkKKwkJCQkvICh0cC0+c25kX2N3bmQtdHAtPmJpY3RjcC5sYXN0X21heF9jd25kKTsKKwkJZWxzZQorCQkJLyogbGluZWFyIGluY3JlYXNlICovCisJCQl0cC0+YmljdGNwLmNudCA9IHRwLT5zbmRfY3duZCAvIEJJQ1RDUF9NQVhfSU5DUkVNRU5UOworCX0KKwlyZXR1cm4gdHAtPmJpY3RjcC5jbnQ7Cit9CisKKy8qIFRoaXMgaXMgSmFjb2Jzb24ncyBzbG93IHN0YXJ0IGFuZCBjb25nZXN0aW9uIGF2b2lkYW5jZS4gCisgKiBTSUdDT01NICc4OCwgcC4gMzI4LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmVub19jb25nX2F2b2lkKHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisgICAgICAgIGlmICh0cC0+c25kX2N3bmQgPD0gdHAtPnNuZF9zc3RocmVzaCkgeworICAgICAgICAgICAgICAgIC8qIEluICJzYWZlIiBhcmVhLCBpbmNyZWFzZS4gKi8KKwkJaWYgKHRwLT5zbmRfY3duZCA8IHRwLT5zbmRfY3duZF9jbGFtcCkKKwkJCXRwLT5zbmRfY3duZCsrOworCX0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogSW4gZGFuZ2Vyb3VzIGFyZWEsIGluY3JlYXNlIHNsb3dseS4KKwkJICogSW4gdGhlb3J5IHRoaXMgaXMgdHAtPnNuZF9jd25kICs9IDEgLyB0cC0+c25kX2N3bmQKKwkJICovCisJCWlmICh0cC0+c25kX2N3bmRfY250ID49IGJpY3RjcF9jd25kKHRwKSkgeworCQkJaWYgKHRwLT5zbmRfY3duZCA8IHRwLT5zbmRfY3duZF9jbGFtcCkKKwkJCQl0cC0+c25kX2N3bmQrKzsKKwkJCXRwLT5zbmRfY3duZF9jbnQ9MDsKKwkJfSBlbHNlCisJCQl0cC0+c25kX2N3bmRfY250Kys7CisgICAgICAgIH0KKwl0cC0+c25kX2N3bmRfc3RhbXAgPSB0Y3BfdGltZV9zdGFtcDsKK30KKworLyogVGhpcyBpcyBiYXNlZCBvbiB0aGUgY29uZ2VzdGlvbiBkZXRlY3Rpb24vYXZvaWRhbmNlIHNjaGVtZSBkZXNjcmliZWQgaW4KKyAqICAgIExhd3JlbmNlIFMuIEJyYWttbyBhbmQgTGFycnkgTC4gUGV0ZXJzb24uCisgKiAgICAiVENQIFZlZ2FzOiBFbmQgdG8gZW5kIGNvbmdlc3Rpb24gYXZvaWRhbmNlIG9uIGEgZ2xvYmFsIGludGVybmV0LiIKKyAqICAgIElFRUUgSm91cm5hbCBvbiBTZWxlY3RlZCBBcmVhcyBpbiBDb21tdW5pY2F0aW9uLCAxMyg4KToxNDY1LS0xNDgwLAorICogICAgT2N0b2JlciAxOTk1LiBBdmFpbGFibGUgZnJvbToKKyAqCWZ0cDovL2Z0cC5jcy5hcml6b25hLmVkdS94a2VybmVsL1BhcGVycy9qc2FjLnBzCisgKgorICogU2VlIGh0dHA6Ly93d3cuY3MuYXJpem9uYS5lZHUveGtlcm5lbC8gZm9yIHRoZWlyIGltcGxlbWVudGF0aW9uLgorICogVGhlIG1haW4gYXNwZWN0cyB0aGF0IGRpc3Rpbmd1aXNoIHRoaXMgaW1wbGVtZW50YXRpb24gZnJvbSB0aGUKKyAqIEFyaXpvbmEgVmVnYXMgaW1wbGVtZW50YXRpb24gYXJlOgorICogICBvIFdlIGRvIG5vdCBjaGFuZ2UgdGhlIGxvc3MgZGV0ZWN0aW9uIG9yIHJlY292ZXJ5IG1lY2hhbmlzbXMgb2YKKyAqICAgICBMaW51eCBpbiBhbnkgd2F5LiBMaW51eCBhbHJlYWR5IHJlY292ZXJzIGZyb20gbG9zc2VzIHF1aXRlIHdlbGwsCisgKiAgICAgdXNpbmcgZmluZS1ncmFpbmVkIHRpbWVycywgTmV3UmVubywgYW5kIEZBQ0suCisgKiAgIG8gVG8gYXZvaWQgdGhlIHBlcmZvcm1hbmNlIHBlbmFsdHkgaW1wb3NlZCBieSBpbmNyZWFzaW5nIGN3bmQKKyAqICAgICBvbmx5IGV2ZXJ5LW90aGVyIFJUVCBkdXJpbmcgc2xvdyBzdGFydCwgd2UgaW5jcmVhc2UgZHVyaW5nCisgKiAgICAgZXZlcnkgUlRUIGR1cmluZyBzbG93IHN0YXJ0LCBqdXN0IGxpa2UgUmVuby4KKyAqICAgbyBMYXJnZWx5IHRvIGFsbG93IGNvbnRpbnVvdXMgY3duZCBncm93dGggZHVyaW5nIHNsb3cgc3RhcnQsCisgKiAgICAgd2UgdXNlIHRoZSByYXRlIGF0IHdoaWNoIEFDS3MgY29tZSBiYWNrIGFzIHRoZSAiYWN0dWFsIgorICogICAgIHJhdGUsIHJhdGhlciB0aGFuIHRoZSByYXRlIGF0IHdoaWNoIGRhdGEgaXMgc2VudC4KKyAqICAgbyBUbyBzcGVlZCBjb252ZXJnZW5jZSB0byB0aGUgcmlnaHQgcmF0ZSwgd2Ugc2V0IHRoZSBjd25kCisgKiAgICAgdG8gYWNoaWV2ZSB0aGUgcmlnaHQgKCJhY3R1YWwiKSByYXRlIHdoZW4gd2UgZXhpdCBzbG93IHN0YXJ0LgorICogICBvIFRvIGZpbHRlciBvdXQgdGhlIG5vaXNlIGNhdXNlZCBieSBkZWxheWVkIEFDS3MsIHdlIHVzZSB0aGUKKyAqICAgICBtaW5pbXVtIFJUVCBzYW1wbGUgb2JzZXJ2ZWQgZHVyaW5nIHRoZSBsYXN0IFJUVCB0byBjYWxjdWxhdGUKKyAqICAgICB0aGUgYWN0dWFsIHJhdGUuCisgKiAgIG8gV2hlbiB0aGUgc2VuZGVyIHJlLXN0YXJ0cyBmcm9tIGlkbGUsIGl0IHdhaXRzIHVudGlsIGl0IGhhcworICogICAgIHJlY2VpdmVkIEFDS3MgZm9yIGFuIGVudGlyZSBmbGlnaHQgb2YgbmV3IGRhdGEgYmVmb3JlIG1ha2luZworICogICAgIGEgY3duZCBhZGp1c3RtZW50IGRlY2lzaW9uLiBUaGUgb3JpZ2luYWwgVmVnYXMgaW1wbGVtZW50YXRpb24KKyAqICAgICBhc3N1bWVkIHNlbmRlcnMgbmV2ZXIgd2VudCBpZGxlLgorICovCitzdGF0aWMgdm9pZCB2ZWdhc19jb25nX2F2b2lkKHN0cnVjdCB0Y3Bfc29jayAqdHAsIHUzMiBhY2ssIHUzMiBzZXFfcnR0KQoreworCS8qIFRoZSBrZXkgcGxheWVycyBhcmUgdl9iZWdfc25kX3VuYSBhbmQgdl9iZWdfc25kX254dC4KKwkgKgorCSAqIFRoZXNlIGFyZSBzbyBuYW1lZCBiZWNhdXNlIHRoZXkgcmVwcmVzZW50IHRoZSBhcHByb3hpbWF0ZSB2YWx1ZXMKKwkgKiBvZiBzbmRfdW5hIGFuZCBzbmRfbnh0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgUlRULiBNb3JlCisJICogcHJlY2lzZWx5LCB0aGV5IHJlcHJlc2VudCB0aGUgYW1vdW50IG9mIGRhdGEgc2VudCBkdXJpbmcgdGhlIFJUVC4KKwkgKiBBdCB0aGUgZW5kIG9mIHRoZSBSVFQsIHdoZW4gd2UgcmVjZWl2ZSBhbiBBQ0sgZm9yIHZfYmVnX3NuZF9ueHQsCisJICogd2Ugd2lsbCBjYWxjdWxhdGUgdGhhdCAodl9iZWdfc25kX254dCAtIHZfYmVnX3NuZF91bmEpIG91dHN0YW5kaW5nCisJICogYnl0ZXMgb2YgZGF0YSBoYXZlIGJlZW4gQUNLZWQgZHVyaW5nIHRoZSBjb3Vyc2Ugb2YgdGhlIFJUVCwgZ2l2aW5nCisJICogYW4gImFjdHVhbCIgcmF0ZSBvZjoKKwkgKgorCSAqICAgICAodl9iZWdfc25kX254dCAtIHZfYmVnX3NuZF91bmEpIC8gKHJ0dCBkdXJhdGlvbikKKwkgKgorCSAqIFVuZm9ydHVuYXRlbHksIHZfYmVnX3NuZF91bmEgaXMgbm90IGV4YWN0bHkgZXF1YWwgdG8gc25kX3VuYSwKKwkgKiBiZWNhdXNlIGRlbGF5ZWQgQUNLcyBjYW4gY292ZXIgbW9yZSB0aGFuIG9uZSBzZWdtZW50LCBzbyB0aGV5CisJICogZG9uJ3QgbGluZSB1cCBuaWNlbHkgd2l0aCB0aGUgYm91bmRhcmllcyBvZiBSVFRzLgorCSAqCisJICogQW5vdGhlciB1bmZvcnR1bmF0ZSBmYWN0IG9mIGxpZmUgaXMgdGhhdCBkZWxheWVkIEFDS3MgZGVsYXkgdGhlCisJICogYWR2YW5jZSBvZiB0aGUgbGVmdCBlZGdlIG9mIG91ciBzZW5kIHdpbmRvdywgc28gdGhhdCB0aGUgbnVtYmVyCisJICogb2YgYnl0ZXMgd2Ugc2VuZCBpbiBhbiBSVFQgaXMgb2Z0ZW4gbGVzcyB0aGFuIG91ciBjd25kIHdpbGwgYWxsb3cuCisJICogU28gd2Uga2VlcCB0cmFjayBvZiBvdXIgY3duZCBzZXBhcmF0ZWx5LCBpbiB2X2JlZ19zbmRfY3duZC4KKwkgKi8KKworCWlmIChhZnRlcihhY2ssIHRwLT52ZWdhcy5iZWdfc25kX254dCkpIHsKKwkJLyogRG8gdGhlIFZlZ2FzIG9uY2UtcGVyLVJUVCBjd25kIGFkanVzdG1lbnQuICovCisJCXUzMiBvbGRfd25kLCBvbGRfc25kX2N3bmQ7CisKKwkJCisJCS8qIEhlcmUgb2xkX3duZCBpcyBlc3NlbnRpYWxseSB0aGUgd2luZG93IG9mIGRhdGEgdGhhdCB3YXMKKwkJICogc2VudCBkdXJpbmcgdGhlIHByZXZpb3VzIFJUVCwgYW5kIGhhcyBhbGwKKwkJICogYmVlbiBhY2tub3dsZWRnZWQgaW4gdGhlIGNvdXJzZSBvZiB0aGUgUlRUIHRoYXQgZW5kZWQKKwkJICogd2l0aCB0aGUgQUNLIHdlIGp1c3QgcmVjZWl2ZWQuIExpa2V3aXNlLCBvbGRfc25kX2N3bmQKKwkJICogaXMgdGhlIGN3bmQgZHVyaW5nIHRoZSBwcmV2aW91cyBSVFQuCisJCSAqLworCQlvbGRfd25kID0gKHRwLT52ZWdhcy5iZWdfc25kX254dCAtIHRwLT52ZWdhcy5iZWdfc25kX3VuYSkgLworCQkJdHAtPm1zc19jYWNoZV9zdGQ7CisJCW9sZF9zbmRfY3duZCA9IHRwLT52ZWdhcy5iZWdfc25kX2N3bmQ7CisKKwkJLyogU2F2ZSB0aGUgZXh0ZW50IG9mIHRoZSBjdXJyZW50IHdpbmRvdyBzbyB3ZSBjYW4gdXNlIHRoaXMKKwkJICogYXQgdGhlIGVuZCBvZiB0aGUgbmV4dCBSVFQuCisJCSAqLworCQl0cC0+dmVnYXMuYmVnX3NuZF91bmEgID0gdHAtPnZlZ2FzLmJlZ19zbmRfbnh0OworCQl0cC0+dmVnYXMuYmVnX3NuZF9ueHQgID0gdHAtPnNuZF9ueHQ7CisJCXRwLT52ZWdhcy5iZWdfc25kX2N3bmQgPSB0cC0+c25kX2N3bmQ7CisKKwkJLyogVGFrZSBpbnRvIGFjY291bnQgdGhlIGN1cnJlbnQgUlRUIHNhbXBsZSB0b28sIHRvCisJCSAqIGRlY3JlYXNlIHRoZSBpbXBhY3Qgb2YgZGVsYXllZCBhY2tzLiBUaGlzIGRvdWJsZSBjb3VudHMKKwkJICogdGhpcyBzYW1wbGUgc2luY2Ugd2UgY291bnQgaXQgZm9yIHRoZSBuZXh0IHdpbmRvdyBhcyB3ZWxsLAorCQkgKiBidXQgdGhhdCdzIG5vdCB0b28gYXdmdWwsIHNpbmNlIHdlJ3JlIHRha2luZyB0aGUgbWluLAorCQkgKiByYXRoZXIgdGhhbiBhdmVyYWdpbmcuCisJCSAqLworCQl2ZWdhc19ydHRfY2FsYyh0cCwgc2VxX3J0dCk7CisKKwkJLyogV2UgZG8gdGhlIFZlZ2FzIGNhbGN1bGF0aW9ucyBvbmx5IGlmIHdlIGdvdCBlbm91Z2ggUlRUCisJCSAqIHNhbXBsZXMgdGhhdCB3ZSBjYW4gYmUgcmVhc29uYWJseSBzdXJlIHRoYXQgd2UgZ290CisJCSAqIGF0IGxlYXN0IG9uZSBSVFQgc2FtcGxlIHRoYXQgd2Fzbid0IGZyb20gYSBkZWxheWVkIEFDSy4KKwkJICogSWYgd2Ugb25seSBoYWQgMiBzYW1wbGVzIHRvdGFsLAorCQkgKiB0aGVuIHRoYXQgbWVhbnMgd2UncmUgZ2V0dGluZyBvbmx5IDEgQUNLIHBlciBSVFQsIHdoaWNoCisJCSAqIG1lYW5zIHRoZXkncmUgYWxtb3N0IGNlcnRhaW5seSBkZWxheWVkIEFDS3MuCisJCSAqIElmICB3ZSBoYXZlIDMgc2FtcGxlcywgd2Ugc2hvdWxkIGJlIE9LLgorCQkgKi8KKworCQlpZiAodHAtPnZlZ2FzLmNudFJUVCA8PSAyKSB7CisJCQkvKiBXZSBkb24ndCBoYXZlIGVub3VnaCBSVFQgc2FtcGxlcyB0byBkbyB0aGUgVmVnYXMKKwkJCSAqIGNhbGN1bGF0aW9uLCBzbyB3ZSdsbCBiZWhhdmUgbGlrZSBSZW5vLgorCQkJICovCisJCQlpZiAodHAtPnNuZF9jd25kID4gdHAtPnNuZF9zc3RocmVzaCkKKwkJCQl0cC0+c25kX2N3bmQrKzsKKwkJfSBlbHNlIHsKKwkJCXUzMiBydHQsIHRhcmdldF9jd25kLCBkaWZmOworCisJCQkvKiBXZSBoYXZlIGVub3VnaCBSVFQgc2FtcGxlcywgc28sIHVzaW5nIHRoZSBWZWdhcworCQkJICogYWxnb3JpdGhtLCB3ZSBkZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIGluY3JlYXNlIG9yCisJCQkgKiBkZWNyZWFzZSBjd25kLCBhbmQgYnkgaG93IG11Y2guCisJCQkgKi8KKworCQkJLyogUGx1Y2sgb3V0IHRoZSBSVFQgd2UgYXJlIHVzaW5nIGZvciB0aGUgVmVnYXMKKwkJCSAqIGNhbGN1bGF0aW9ucy4gVGhpcyBpcyB0aGUgbWluIFJUVCBzZWVuIGR1cmluZyB0aGUKKwkJCSAqIGxhc3QgUlRULiBUYWtpbmcgdGhlIG1pbiBmaWx0ZXJzIG91dCB0aGUgZWZmZWN0cworCQkJICogb2YgZGVsYXllZCBBQ0tzLCBhdCB0aGUgY29zdCBvZiBub3RpY2luZyBjb25nZXN0aW9uCisJCQkgKiBhIGJpdCBsYXRlci4KKwkJCSAqLworCQkJcnR0ID0gdHAtPnZlZ2FzLm1pblJUVDsKKworCQkJLyogQ2FsY3VsYXRlIHRoZSBjd25kIHdlIHNob3VsZCBoYXZlLCBpZiB3ZSB3ZXJlbid0CisJCQkgKiBnb2luZyB0b28gZmFzdC4KKwkJCSAqCisJCQkgKiBUaGlzIGlzOgorCQkJICogICAgIChhY3R1YWwgcmF0ZSBpbiBzZWdtZW50cykgKiBiYXNlUlRUCisJCQkgKiBXZSBrZWVwIGl0IGFzIGEgZml4ZWQgcG9pbnQgbnVtYmVyIHdpdGgKKwkJCSAqIFZfUEFSQU1fU0hJRlQgYml0cyB0byB0aGUgcmlnaHQgb2YgdGhlIGJpbmFyeSBwb2ludC4KKwkJCSAqLworCQkJdGFyZ2V0X2N3bmQgPSAoKG9sZF93bmQgKiB0cC0+dmVnYXMuYmFzZVJUVCkKKwkJCQkgICAgICAgPDwgVl9QQVJBTV9TSElGVCkgLyBydHQ7CisKKwkJCS8qIENhbGN1bGF0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB3aW5kb3cgd2UgaGFkLAorCQkJICogYW5kIHRoZSB3aW5kb3cgd2Ugd291bGQgbGlrZSB0byBoYXZlLiBUaGlzIHF1YW50aXR5CisJCQkgKiBpcyB0aGUgIkRpZmYiIGZyb20gdGhlIEFyaXpvbmEgVmVnYXMgcGFwZXJzLgorCQkJICoKKwkJCSAqIEFnYWluLCB0aGlzIGlzIGEgZml4ZWQgcG9pbnQgbnVtYmVyIHdpdGgKKwkJCSAqIFZfUEFSQU1fU0hJRlQgYml0cyB0byB0aGUgcmlnaHQgb2YgdGhlIGJpbmFyeQorCQkJICogcG9pbnQuCisJCQkgKi8KKwkJCWRpZmYgPSAob2xkX3duZCA8PCBWX1BBUkFNX1NISUZUKSAtIHRhcmdldF9jd25kOworCisJCQlpZiAodHAtPnNuZF9jd25kIDwgdHAtPnNuZF9zc3RocmVzaCkgeworCQkJCS8qIFNsb3cgc3RhcnQuICAqLworCQkJCWlmIChkaWZmID4gc3lzY3RsX3RjcF92ZWdhc19nYW1tYSkgeworCQkJCQkvKiBHb2luZyB0b28gZmFzdC4gVGltZSB0byBzbG93IGRvd24KKwkJCQkJICogYW5kIHN3aXRjaCB0byBjb25nZXN0aW9uIGF2b2lkYW5jZS4KKwkJCQkJICovCisJCQkJCXRwLT5zbmRfc3N0aHJlc2ggPSAyOworCisJCQkJCS8qIFNldCBjd25kIHRvIG1hdGNoIHRoZSBhY3R1YWwgcmF0ZQorCQkJCQkgKiBleGFjdGx5OgorCQkJCQkgKiAgIGN3bmQgPSAoYWN0dWFsIHJhdGUpICogYmFzZVJUVAorCQkJCQkgKiBUaGVuIHdlIGFkZCAxIGJlY2F1c2UgdGhlIGludGVnZXIKKwkJCQkJICogdHJ1bmNhdGlvbiByb2JzIHVzIG9mIGZ1bGwgbGluaworCQkJCQkgKiB1dGlsaXphdGlvbi4KKwkJCQkJICovCisJCQkJCXRwLT5zbmRfY3duZCA9IG1pbih0cC0+c25kX2N3bmQsCisJCQkJCQkJICAgKHRhcmdldF9jd25kID4+CisJCQkJCQkJICAgIFZfUEFSQU1fU0hJRlQpKzEpOworCisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiBDb25nZXN0aW9uIGF2b2lkYW5jZS4gKi8KKwkJCQl1MzIgbmV4dF9zbmRfY3duZDsKKworCQkJCS8qIEZpZ3VyZSBvdXQgd2hlcmUgd2Ugd291bGQgbGlrZSBjd25kCisJCQkJICogdG8gYmUuCisJCQkJICovCisJCQkJaWYgKGRpZmYgPiBzeXNjdGxfdGNwX3ZlZ2FzX2JldGEpIHsKKwkJCQkJLyogVGhlIG9sZCB3aW5kb3cgd2FzIHRvbyBmYXN0LCBzbworCQkJCQkgKiB3ZSBzbG93IGRvd24uCisJCQkJCSAqLworCQkJCQluZXh0X3NuZF9jd25kID0gb2xkX3NuZF9jd25kIC0gMTsKKwkJCQl9IGVsc2UgaWYgKGRpZmYgPCBzeXNjdGxfdGNwX3ZlZ2FzX2FscGhhKSB7CisJCQkJCS8qIFdlIGRvbid0IGhhdmUgZW5vdWdoIGV4dHJhIHBhY2tldHMKKwkJCQkJICogaW4gdGhlIG5ldHdvcmssIHNvIHNwZWVkIHVwLgorCQkJCQkgKi8KKwkJCQkJbmV4dF9zbmRfY3duZCA9IG9sZF9zbmRfY3duZCArIDE7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogU2VuZGluZyBqdXN0IGFzIGZhc3QgYXMgd2UKKwkJCQkJICogc2hvdWxkIGJlLgorCQkJCQkgKi8KKwkJCQkJbmV4dF9zbmRfY3duZCA9IG9sZF9zbmRfY3duZDsKKwkJCQl9CisKKwkJCQkvKiBBZGp1c3QgY3duZCB1cHdhcmQgb3IgZG93bndhcmQsIHRvd2FyZCB0aGUKKwkJCQkgKiBkZXNpcmVkIHZhbHVlLgorCQkJCSAqLworCQkJCWlmIChuZXh0X3NuZF9jd25kID4gdHAtPnNuZF9jd25kKQorCQkJCQl0cC0+c25kX2N3bmQrKzsKKwkJCQllbHNlIGlmIChuZXh0X3NuZF9jd25kIDwgdHAtPnNuZF9jd25kKQorCQkJCQl0cC0+c25kX2N3bmQtLTsKKwkJCX0KKwkJfQorCisJCS8qIFdpcGUgdGhlIHNsYXRlIGNsZWFuIGZvciB0aGUgbmV4dCBSVFQuICovCisJCXRwLT52ZWdhcy5jbnRSVFQgPSAwOworCQl0cC0+dmVnYXMubWluUlRUID0gMHg3ZmZmZmZmZjsKKwl9CisKKwkvKiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgZXhlY3V0ZWQgZm9yIGV2ZXJ5IGFjayB3ZSByZWNlaXZlLAorCSAqIGV4Y2VwdCBmb3IgY29uZGl0aW9ucyBjaGVja2VkIGluIHNob3VsZF9hZHZhbmNlX2N3bmQoKQorCSAqIGJlZm9yZSB0aGUgY2FsbCB0byB0Y3BfY29uZ19hdm9pZCgpLiBNYWlubHkgdGhpcyBtZWFucyB0aGF0CisJICogd2Ugb25seSBleGVjdXRlIHRoaXMgY29kZSBpZiB0aGUgYWNrIGFjdHVhbGx5IGFja2VkIHNvbWUKKwkgKiBkYXRhLgorCSAqLworCisJLyogSWYgd2UgYXJlIGluIHNsb3cgc3RhcnQsIGluY3JlYXNlIG91ciBjd25kIGluIHJlc3BvbnNlIHRvIHRoaXMgQUNLLgorCSAqIChJZiB3ZSBhcmUgbm90IGluIHNsb3cgc3RhcnQgdGhlbiB3ZSBhcmUgaW4gY29uZ2VzdGlvbiBhdm9pZGFuY2UsCisJICogYW5kIGFkanVzdCBvdXIgY29uZ2VzdGlvbiB3aW5kb3cgb25seSBvbmNlIHBlciBSVFQuIFNlZSB0aGUgY29kZQorCSAqIGFib3ZlLikKKwkgKi8KKwlpZiAodHAtPnNuZF9jd25kIDw9IHRwLT5zbmRfc3N0aHJlc2gpIAorCQl0cC0+c25kX2N3bmQrKzsKKworCS8qIHRvIGtlZXAgY3duZCBmcm9tIGdyb3dpbmcgd2l0aG91dCBib3VuZCAqLworCXRwLT5zbmRfY3duZCA9IG1pbl90KHUzMiwgdHAtPnNuZF9jd25kLCB0cC0+c25kX2N3bmRfY2xhbXApOworCisJLyogTWFrZSBzdXJlIHRoYXQgd2UgYXJlIG5ldmVyIHNvIHRpbWlkIGFzIHRvIHJlZHVjZSBvdXIgY3duZCBiZWxvdworCSAqIDIgTVNTLgorCSAqCisJICogR29pbmcgYmVsb3cgMiBNU1Mgd291bGQgcmlzayBodWdlIGRlbGF5ZWQgQUNLcyBmcm9tIG91ciByZWNlaXZlci4KKwkgKi8KKwl0cC0+c25kX2N3bmQgPSBtYXgodHAtPnNuZF9jd25kLCAyVSk7CisKKwl0cC0+c25kX2N3bmRfc3RhbXAgPSB0Y3BfdGltZV9zdGFtcDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjcF9jb25nX2F2b2lkKHN0cnVjdCB0Y3Bfc29jayAqdHAsIHUzMiBhY2ssIHUzMiBzZXFfcnR0KQoreworCWlmICh0Y3BfdmVnYXNfZW5hYmxlZCh0cCkpCisJCXZlZ2FzX2NvbmdfYXZvaWQodHAsIGFjaywgc2VxX3J0dCk7CisJZWxzZQorCQlyZW5vX2NvbmdfYXZvaWQodHApOworfQorCisvKiBSZXN0YXJ0IHRpbWVyIGFmdGVyIGZvcndhcmQgcHJvZ3Jlc3Mgb24gY29ubmVjdGlvbi4KKyAqIFJGQzI5ODggcmVjb21tZW5kcyB0byByZXN0YXJ0IHRpbWVyIHRvIG5vdytydG8uCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHRjcF9hY2tfcGFja2V0c19vdXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCWlmICghdHAtPnBhY2tldHNfb3V0KSB7CisJCXRjcF9jbGVhcl94bWl0X3RpbWVyKHNrLCBUQ1BfVElNRV9SRVRSQU5TKTsKKwl9IGVsc2UgeworCQl0Y3BfcmVzZXRfeG1pdF90aW1lcihzaywgVENQX1RJTUVfUkVUUkFOUywgdHAtPnJ0byk7CisJfQorfQorCisvKiBUaGVyZSBpcyBvbmUgZG93bnNpZGUgdG8gdGhpcyBzY2hlbWUuICBBbHRob3VnaCB3ZSBrZWVwIHRoZQorICogQUNLIGNsb2NrIHRpY2tpbmcsIGFkanVzdGluZyBwYWNrZXQgY291bnRlcnMgYW5kIGFkdmFuY2luZworICogY29uZ2VzdGlvbiB3aW5kb3csIHdlIGRvIG5vdCBsaWJlcmF0ZSBzb2NrZXQgc2VuZCBidWZmZXIKKyAqIHNwYWNlLgorICoKKyAqIE11Y2tpbmcgd2l0aCBza2ItPnRydWVzaXplIGFuZCBzay0+c2tfd21lbV9hbGxvYyBldCBhbC4KKyAqIHRoZW4gbWFraW5nIGEgd3JpdGUgc3BhY2Ugd2FrZXVwIGNhbGxiYWNrIGlzIGEgcG9zc2libGUKKyAqIGZ1dHVyZSBlbmhhbmNlbWVudC4gIFdBUk5JTkc6IGl0IGlzIG5vdCB0cml2aWFsIHRvIG1ha2UuCisgKi8KK3N0YXRpYyBpbnQgdGNwX3Rzb19hY2tlZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgX191MzIgbm93LCBfX3MzMiAqc2VxX3J0dCkKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgdGNwX3NrYl9jYiAqc2NiID0gVENQX1NLQl9DQihza2IpOyAKKwlfX3UzMiBzZXEgPSB0cC0+c25kX3VuYTsKKwlfX3UzMiBwYWNrZXRzX2Fja2VkOworCWludCBhY2tlZCA9IDA7CisKKwkvKiBJZiB3ZSBnZXQgaGVyZSwgdGhlIHdob2xlIFRTTyBwYWNrZXQgaGFzIG5vdCBiZWVuCisJICogYWNrZWQuCisJICovCisJQlVHX09OKCFhZnRlcihzY2ItPmVuZF9zZXEsIHNlcSkpOworCisJcGFja2V0c19hY2tlZCA9IHRjcF9za2JfcGNvdW50KHNrYik7CisJaWYgKHRjcF90cmltX2hlYWQoc2ssIHNrYiwgc2VxIC0gc2NiLT5zZXEpKQorCQlyZXR1cm4gMDsKKwlwYWNrZXRzX2Fja2VkIC09IHRjcF9za2JfcGNvdW50KHNrYik7CisKKwlpZiAocGFja2V0c19hY2tlZCkgeworCQlfX3U4IHNhY2tlZCA9IHNjYi0+c2Fja2VkOworCisJCWFja2VkIHw9IEZMQUdfREFUQV9BQ0tFRDsKKwkJaWYgKHNhY2tlZCkgeworCQkJaWYgKHNhY2tlZCAmIFRDUENCX1JFVFJBTlMpIHsKKwkJCQlpZiAoc2Fja2VkICYgVENQQ0JfU0FDS0VEX1JFVFJBTlMpCisJCQkJCXRwLT5yZXRyYW5zX291dCAtPSBwYWNrZXRzX2Fja2VkOworCQkJCWFja2VkIHw9IEZMQUdfUkVUUkFOU19EQVRBX0FDS0VEOworCQkJCSpzZXFfcnR0ID0gLTE7CisJCQl9IGVsc2UgaWYgKCpzZXFfcnR0IDwgMCkKKwkJCQkqc2VxX3J0dCA9IG5vdyAtIHNjYi0+d2hlbjsKKwkJCWlmIChzYWNrZWQgJiBUQ1BDQl9TQUNLRURfQUNLRUQpCisJCQkJdHAtPnNhY2tlZF9vdXQgLT0gcGFja2V0c19hY2tlZDsKKwkJCWlmIChzYWNrZWQgJiBUQ1BDQl9MT1NUKQorCQkJCXRwLT5sb3N0X291dCAtPSBwYWNrZXRzX2Fja2VkOworCQkJaWYgKHNhY2tlZCAmIFRDUENCX1VSRykgeworCQkJCWlmICh0cC0+dXJnX21vZGUgJiYKKwkJCQkgICAgIWJlZm9yZShzZXEsIHRwLT5zbmRfdXApKQorCQkJCQl0cC0+dXJnX21vZGUgPSAwOworCQkJfQorCQl9IGVsc2UgaWYgKCpzZXFfcnR0IDwgMCkKKwkJCSpzZXFfcnR0ID0gbm93IC0gc2NiLT53aGVuOworCisJCWlmICh0cC0+ZmFja2V0c19vdXQpIHsKKwkJCV9fdTMyIGR2YWwgPSBtaW4odHAtPmZhY2tldHNfb3V0LCBwYWNrZXRzX2Fja2VkKTsKKwkJCXRwLT5mYWNrZXRzX291dCAtPSBkdmFsOworCQl9CisJCXRwLT5wYWNrZXRzX291dCAtPSBwYWNrZXRzX2Fja2VkOworCisJCUJVR19PTih0Y3Bfc2tiX3Bjb3VudChza2IpID09IDApOworCQlCVUdfT04oIWJlZm9yZShzY2ItPnNlcSwgc2NiLT5lbmRfc2VxKSk7CisJfQorCisJcmV0dXJuIGFja2VkOworfQorCisKKy8qIFJlbW92ZSBhY2tub3dsZWRnZWQgZnJhbWVzIGZyb20gdGhlIHJldHJhbnNtaXNzaW9uIHF1ZXVlLiAqLworc3RhdGljIGludCB0Y3BfY2xlYW5fcnR4X3F1ZXVlKHN0cnVjdCBzb2NrICpzaywgX19zMzIgKnNlcV9ydHRfcCkKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCV9fdTMyIG5vdyA9IHRjcF90aW1lX3N0YW1wOworCWludCBhY2tlZCA9IDA7CisJX19zMzIgc2VxX3J0dCA9IC0xOworCisJd2hpbGUgKChza2IgPSBza2JfcGVlaygmc2stPnNrX3dyaXRlX3F1ZXVlKSkgJiYKKwkgICAgICAgc2tiICE9IHNrLT5za19zZW5kX2hlYWQpIHsKKwkJc3RydWN0IHRjcF9za2JfY2IgKnNjYiA9IFRDUF9TS0JfQ0Ioc2tiKTsgCisJCV9fdTggc2Fja2VkID0gc2NiLT5zYWNrZWQ7CisKKwkJLyogSWYgb3VyIHBhY2tldCBpcyBiZWZvcmUgdGhlIGFjayBzZXF1ZW5jZSB3ZSBjYW4KKwkJICogZGlzY2FyZCBpdCBhcyBpdCdzIGNvbmZpcm1lZCB0byBoYXZlIGFycml2ZWQgYXQKKwkJICogdGhlIG90aGVyIGVuZC4KKwkJICovCisJCWlmIChhZnRlcihzY2ItPmVuZF9zZXEsIHRwLT5zbmRfdW5hKSkgeworCQkJaWYgKHRjcF9za2JfcGNvdW50KHNrYikgPiAxKQorCQkJCWFja2VkIHw9IHRjcF90c29fYWNrZWQoc2ssIHNrYiwKKwkJCQkJCSAgICAgICBub3csICZzZXFfcnR0KTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogSW5pdGlhbCBvdXRnb2luZyBTWU4ncyBnZXQgcHV0IG9udG8gdGhlIHdyaXRlX3F1ZXVlCisJCSAqIGp1c3QgbGlrZSBhbnl0aGluZyBlbHNlIHdlIHRyYW5zbWl0LiAgSXQgaXMgbm90CisJCSAqIHRydWUgZGF0YSwgYW5kIGlmIHdlIG1pc2luZm9ybSBvdXIgY2FsbGVycyB0aGF0CisJCSAqIHRoaXMgQUNLIGFja3MgcmVhbCBkYXRhLCB3ZSB3aWxsIGVycm9uZW91c2x5IGV4aXQKKwkJICogY29ubmVjdGlvbiBzdGFydHVwIHNsb3cgc3RhcnQgb25lIHBhY2tldCB0b28KKwkJICogcXVpY2tseS4gIFRoaXMgaXMgc2V2ZXJlbHkgZnJvd25lZCB1cG9uIGJlaGF2aW9yLgorCQkgKi8KKwkJaWYgKCEoc2NiLT5mbGFncyAmIFRDUENCX0ZMQUdfU1lOKSkgeworCQkJYWNrZWQgfD0gRkxBR19EQVRBX0FDS0VEOworCQl9IGVsc2UgeworCQkJYWNrZWQgfD0gRkxBR19TWU5fQUNLRUQ7CisJCQl0cC0+cmV0cmFuc19zdGFtcCA9IDA7CisJCX0KKworCQlpZiAoc2Fja2VkKSB7CisJCQlpZiAoc2Fja2VkICYgVENQQ0JfUkVUUkFOUykgeworCQkJCWlmKHNhY2tlZCAmIFRDUENCX1NBQ0tFRF9SRVRSQU5TKQorCQkJCQl0cC0+cmV0cmFuc19vdXQgLT0gdGNwX3NrYl9wY291bnQoc2tiKTsKKwkJCQlhY2tlZCB8PSBGTEFHX1JFVFJBTlNfREFUQV9BQ0tFRDsKKwkJCQlzZXFfcnR0ID0gLTE7CisJCQl9IGVsc2UgaWYgKHNlcV9ydHQgPCAwKQorCQkJCXNlcV9ydHQgPSBub3cgLSBzY2ItPndoZW47CisJCQlpZiAoc2Fja2VkICYgVENQQ0JfU0FDS0VEX0FDS0VEKQorCQkJCXRwLT5zYWNrZWRfb3V0IC09IHRjcF9za2JfcGNvdW50KHNrYik7CisJCQlpZiAoc2Fja2VkICYgVENQQ0JfTE9TVCkKKwkJCQl0cC0+bG9zdF9vdXQgLT0gdGNwX3NrYl9wY291bnQoc2tiKTsKKwkJCWlmIChzYWNrZWQgJiBUQ1BDQl9VUkcpIHsKKwkJCQlpZiAodHAtPnVyZ19tb2RlICYmCisJCQkJICAgICFiZWZvcmUoc2NiLT5lbmRfc2VxLCB0cC0+c25kX3VwKSkKKwkJCQkJdHAtPnVyZ19tb2RlID0gMDsKKwkJCX0KKwkJfSBlbHNlIGlmIChzZXFfcnR0IDwgMCkKKwkJCXNlcV9ydHQgPSBub3cgLSBzY2ItPndoZW47CisJCXRjcF9kZWNfcGNvdW50X2FwcHJveCgmdHAtPmZhY2tldHNfb3V0LCBza2IpOworCQl0Y3BfcGFja2V0c19vdXRfZGVjKHRwLCBza2IpOworCQlfX3NrYl91bmxpbmsoc2tiLCBza2ItPmxpc3QpOworCQlza19zdHJlYW1fZnJlZV9za2Ioc2ssIHNrYik7CisJfQorCisJaWYgKGFja2VkJkZMQUdfQUNLRUQpIHsKKwkJdGNwX2Fja191cGRhdGVfcnR0KHRwLCBhY2tlZCwgc2VxX3J0dCk7CisJCXRjcF9hY2tfcGFja2V0c19vdXQoc2ssIHRwKTsKKwl9CisKKyNpZiBGQVNUUkVUUkFOU19ERUJVRyA+IDAKKwlCVUdfVFJBUCgoaW50KXRwLT5zYWNrZWRfb3V0ID49IDApOworCUJVR19UUkFQKChpbnQpdHAtPmxvc3Rfb3V0ID49IDApOworCUJVR19UUkFQKChpbnQpdHAtPnJldHJhbnNfb3V0ID49IDApOworCWlmICghdHAtPnBhY2tldHNfb3V0ICYmIHRwLT5yeF9vcHQuc2Fja19vaykgeworCQlpZiAodHAtPmxvc3Rfb3V0KSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiTGVhayBsPSV1ICVkXG4iLAorCQkJICAgICAgIHRwLT5sb3N0X291dCwgdHAtPmNhX3N0YXRlKTsKKwkJCXRwLT5sb3N0X291dCA9IDA7CisJCX0KKwkJaWYgKHRwLT5zYWNrZWRfb3V0KSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiTGVhayBzPSV1ICVkXG4iLAorCQkJICAgICAgIHRwLT5zYWNrZWRfb3V0LCB0cC0+Y2Ffc3RhdGUpOworCQkJdHAtPnNhY2tlZF9vdXQgPSAwOworCQl9CisJCWlmICh0cC0+cmV0cmFuc19vdXQpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJMZWFrIHI9JXUgJWRcbiIsCisJCQkgICAgICAgdHAtPnJldHJhbnNfb3V0LCB0cC0+Y2Ffc3RhdGUpOworCQkJdHAtPnJldHJhbnNfb3V0ID0gMDsKKwkJfQorCX0KKyNlbmRpZgorCSpzZXFfcnR0X3AgPSBzZXFfcnR0OworCXJldHVybiBhY2tlZDsKK30KKworc3RhdGljIHZvaWQgdGNwX2Fja19wcm9iZShzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisKKwkvKiBXYXMgaXQgYSB1c2FibGUgd2luZG93IG9wZW4/ICovCisKKwlpZiAoIWFmdGVyKFRDUF9TS0JfQ0Ioc2stPnNrX3NlbmRfaGVhZCktPmVuZF9zZXEsCisJCSAgIHRwLT5zbmRfdW5hICsgdHAtPnNuZF93bmQpKSB7CisJCXRwLT5iYWNrb2ZmID0gMDsKKwkJdGNwX2NsZWFyX3htaXRfdGltZXIoc2ssIFRDUF9USU1FX1BST0JFMCk7CisJCS8qIFNvY2tldCBtdXN0IGJlIHdha2VkIHVwIGJ5IHN1YnNlcXVlbnQgdGNwX2RhdGFfc25kX2NoZWNrKCkuCisJCSAqIFRoaXMgZnVuY3Rpb24gaXMgbm90IGZvciByYW5kb20gdXNpbmchCisJCSAqLworCX0gZWxzZSB7CisJCXRjcF9yZXNldF94bWl0X3RpbWVyKHNrLCBUQ1BfVElNRV9QUk9CRTAsCisJCQkJICAgICBtaW4odHAtPnJ0byA8PCB0cC0+YmFja29mZiwgVENQX1JUT19NQVgpKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRjcF9hY2tfaXNfZHViaW91cyhzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBpbnQgZmxhZykKK3sKKwlyZXR1cm4gKCEoZmxhZyAmIEZMQUdfTk9UX0RVUCkgfHwgKGZsYWcgJiBGTEFHX0NBX0FMRVJUKSB8fAorCQl0cC0+Y2Ffc3RhdGUgIT0gVENQX0NBX09wZW4pOworfQorCitzdGF0aWMgaW5saW5lIGludCB0Y3BfbWF5X3JhaXNlX2N3bmQoc3RydWN0IHRjcF9zb2NrICp0cCwgaW50IGZsYWcpCit7CisJcmV0dXJuICghKGZsYWcgJiBGTEFHX0VDRSkgfHwgdHAtPnNuZF9jd25kIDwgdHAtPnNuZF9zc3RocmVzaCkgJiYKKwkJISgoMTw8dHAtPmNhX3N0YXRlKSYoVENQRl9DQV9SZWNvdmVyeXxUQ1BGX0NBX0NXUikpOworfQorCisvKiBDaGVjayB0aGF0IHdpbmRvdyB1cGRhdGUgaXMgYWNjZXB0YWJsZS4KKyAqIFRoZSBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgc25kX3VuYTw9YWNrPD1zbmRfbmV4dC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdGNwX21heV91cGRhdGVfd2luZG93KHN0cnVjdCB0Y3Bfc29jayAqdHAsIHUzMiBhY2ssCisJCQkJCXUzMiBhY2tfc2VxLCB1MzIgbndpbikKK3sKKwlyZXR1cm4gKGFmdGVyKGFjaywgdHAtPnNuZF91bmEpIHx8CisJCWFmdGVyKGFja19zZXEsIHRwLT5zbmRfd2wxKSB8fAorCQkoYWNrX3NlcSA9PSB0cC0+c25kX3dsMSAmJiBud2luID4gdHAtPnNuZF93bmQpKTsKK30KKworLyogVXBkYXRlIG91ciBzZW5kIHdpbmRvdy4KKyAqCisgKiBXaW5kb3cgdXBkYXRlIGFsZ29yaXRobSwgZGVzY3JpYmVkIGluIFJGQzc5My9SRkMxMTIyICh1c2VkIGluIGxpbnV4LTIuMgorICogYW5kIGluIEZyZWVCU0QuIE5ldEJTRCdzIG9uZSBpcyBldmVuIHdvcnNlLikgaXMgd3JvbmcuCisgKi8KK3N0YXRpYyBpbnQgdGNwX2Fja191cGRhdGVfd2luZG93KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCwKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGFjaywgdTMyIGFja19zZXEpCit7CisJaW50IGZsYWcgPSAwOworCXUzMiBud2luID0gbnRvaHMoc2tiLT5oLnRoLT53aW5kb3cpOworCisJaWYgKGxpa2VseSghc2tiLT5oLnRoLT5zeW4pKQorCQlud2luIDw8PSB0cC0+cnhfb3B0LnNuZF93c2NhbGU7CisKKwlpZiAodGNwX21heV91cGRhdGVfd2luZG93KHRwLCBhY2ssIGFja19zZXEsIG53aW4pKSB7CisJCWZsYWcgfD0gRkxBR19XSU5fVVBEQVRFOworCQl0Y3BfdXBkYXRlX3dsKHRwLCBhY2ssIGFja19zZXEpOworCisJCWlmICh0cC0+c25kX3duZCAhPSBud2luKSB7CisJCQl0cC0+c25kX3duZCA9IG53aW47CisKKwkJCS8qIE5vdGUsIGl0IGlzIHRoZSBvbmx5IHBsYWNlLCB3aGVyZQorCQkJICogZmFzdCBwYXRoIGlzIHJlY292ZXJlZCBmb3Igc2VuZGluZyBUQ1AuCisJCQkgKi8KKwkJCXRjcF9mYXN0X3BhdGhfY2hlY2soc2ssIHRwKTsKKworCQkJaWYgKG53aW4gPiB0cC0+bWF4X3dpbmRvdykgeworCQkJCXRwLT5tYXhfd2luZG93ID0gbndpbjsKKwkJCQl0Y3Bfc3luY19tc3Moc2ssIHRwLT5wbXR1X2Nvb2tpZSk7CisJCQl9CisJCX0KKwl9CisKKwl0cC0+c25kX3VuYSA9IGFjazsKKworCXJldHVybiBmbGFnOworfQorCitzdGF0aWMgdm9pZCB0Y3BfcHJvY2Vzc19mcnRvKHN0cnVjdCBzb2NrICpzaywgdTMyIHByaW9yX3NuZF91bmEpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJCisJdGNwX3N5bmNfbGVmdF9vdXQodHApOworCQorCWlmICh0cC0+c25kX3VuYSA9PSBwcmlvcl9zbmRfdW5hIHx8CisJICAgICFiZWZvcmUodHAtPnNuZF91bmEsIHRwLT5mcnRvX2hpZ2htYXJrKSkgeworCQkvKiBSVE8gd2FzIGNhdXNlZCBieSBsb3NzLCBzdGFydCByZXRyYW5zbWl0dGluZyBpbgorCQkgKiBnby1iYWNrLU4gc2xvdyBzdGFydAorCQkgKi8KKwkJdGNwX2VudGVyX2ZydG9fbG9zcyhzayk7CisJCXJldHVybjsKKwl9CisKKwlpZiAodHAtPmZydG9fY291bnRlciA9PSAxKSB7CisJCS8qIEZpcnN0IEFDSyBhZnRlciBSVE8gYWR2YW5jZXMgdGhlIHdpbmRvdzogYWxsb3cgdHdvIG5ldworCQkgKiBzZWdtZW50cyBvdXQuCisJCSAqLworCQl0cC0+c25kX2N3bmQgPSB0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApICsgMjsKKwl9IGVsc2UgeworCQkvKiBBbHNvIHRoZSBzZWNvbmQgQUNLIGFmdGVyIFJUTyBhZHZhbmNlcyB0aGUgd2luZG93LgorCQkgKiBUaGUgUlRPIHdhcyBsaWtlbHkgc3B1cmlvdXMuIFJlZHVjZSBjd25kIGFuZCBjb250aW51ZQorCQkgKiBpbiBjb25nZXN0aW9uIGF2b2lkYW5jZQorCQkgKi8KKwkJdHAtPnNuZF9jd25kID0gbWluKHRwLT5zbmRfY3duZCwgdHAtPnNuZF9zc3RocmVzaCk7CisJCXRjcF9tb2RlcmF0ZV9jd25kKHRwKTsKKwl9CisKKwkvKiBGLVJUTyBhZmZlY3RzIG9uIHR3byBuZXcgQUNLcyBmb2xsb3dpbmcgUlRPLgorCSAqIEF0IGxhdGVzdCBvbiB0aGlyZCBBQ0sgdGhlIFRDUCBiZWhhdm9yIGlzIGJhY2sgdG8gbm9ybWFsLgorCSAqLworCXRwLT5mcnRvX2NvdW50ZXIgPSAodHAtPmZydG9fY291bnRlciArIDEpICUgMzsKK30KKworLyoKKyAqIFRDUCBXZXN0d29vZCsKKyAqLworCisvKgorICogQGluaXRfd2VzdHdvb2QKKyAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgZmllbGRzIHVzZWQgaW4gVENQIFdlc3R3b29kKy4gV2UgY2FuJ3QKKyAqIGdldCBubyBpbmZvcm1hdGlvbiBhYm91dCBSVFRtaW4gYXQgdGhpcyB0aW1lIHNvIHdlIHNpbXBseSBzZXQgaXQgdG8KKyAqIFRDUF9XRVNUV09PRF9JTklUX1JUVC4gVGhpcyB2YWx1ZSB3YXMgY2hvc2VuIHRvIGJlIHRvbyBjb25zZXJ2YXRpdmUKKyAqIHNpbmNlIGluIHRoaXMgd2F5IHdlJ3JlIHN1cmUgaXQgd2lsbCBiZSB1cGRhdGVkIGluIGEgY29uc2lzdGVudAorICogd2F5IGFzIHNvb24gYXMgcG9zc2libGUuIEl0IHdpbGwgcmVhc29uYWJseSBoYXBwZW4gd2l0aGluIHRoZSBmaXJzdAorICogUlRUIHBlcmlvZCBvZiB0aGUgY29ubmVjdGlvbiBsaWZldGltZS4KKyAqLworCitzdGF0aWMgdm9pZCBpbml0X3dlc3R3b29kKHN0cnVjdCBzb2NrICpzaykKK3sKKyAgICAgICAgc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisKKyAgICAgICAgdHAtPndlc3R3b29kLmJ3X25zX2VzdCA9IDA7CisgICAgICAgIHRwLT53ZXN0d29vZC5id19lc3QgPSAwOworICAgICAgICB0cC0+d2VzdHdvb2QuYWNjb3VudGVkID0gMDsKKyAgICAgICAgdHAtPndlc3R3b29kLmN1bXVsX2FjayA9IDA7CisgICAgICAgIHRwLT53ZXN0d29vZC5ydHRfd2luX3N4ID0gdGNwX3RpbWVfc3RhbXA7CisgICAgICAgIHRwLT53ZXN0d29vZC5ydHQgPSBUQ1BfV0VTVFdPT0RfSU5JVF9SVFQ7CisgICAgICAgIHRwLT53ZXN0d29vZC5ydHRfbWluID0gVENQX1dFU1RXT09EX0lOSVRfUlRUOworICAgICAgICB0cC0+d2VzdHdvb2Quc25kX3VuYSA9IHRwLT5zbmRfdW5hOworfQorCisvKgorICogQHdlc3R3b29kX2RvX2ZpbHRlcgorICogTG93LXBhc3MgZmlsdGVyLiBJbXBsZW1lbnRlZCB1c2luZyBjb25zdGFudCBjb2VmZmllbnRzLgorICovCisKK3N0YXRpYyBpbmxpbmUgX191MzIgd2VzdHdvb2RfZG9fZmlsdGVyKF9fdTMyIGEsIF9fdTMyIGIpCit7CisJcmV0dXJuICgoKDcgKiBhKSArIGIpID4+IDMpOworfQorCitzdGF0aWMgdm9pZCB3ZXN0d29vZF9maWx0ZXIoc3RydWN0IHNvY2sgKnNrLCBfX3UzMiBkZWx0YSkKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKworCXRwLT53ZXN0d29vZC5id19uc19lc3QgPQorCQl3ZXN0d29vZF9kb19maWx0ZXIodHAtPndlc3R3b29kLmJ3X25zX2VzdCwgCisJCQkJICAgdHAtPndlc3R3b29kLmJrIC8gZGVsdGEpOworCXRwLT53ZXN0d29vZC5id19lc3QgPQorCQl3ZXN0d29vZF9kb19maWx0ZXIodHAtPndlc3R3b29kLmJ3X2VzdCwKKwkJCQkgICB0cC0+d2VzdHdvb2QuYndfbnNfZXN0KTsKK30KKworLyogCisgKiBAd2VzdHdvb2RfdXBkYXRlX3J0dG1pbgorICogSXQgaXMgdXNlZCB0byB1cGRhdGUgUlRUbWluLiBJbiB0aGlzIGNhc2Ugd2UgTVVTVCBOT1QgdXNlCisgKiBXRVNUV09PRF9SVFRfTUlOIG1pbmltdW0gYm91bmQgc2luY2Ugd2UgY291bGQgYmUgb24gYSBMQU4hCisgKi8KKworc3RhdGljIGlubGluZSBfX3UzMiB3ZXN0d29vZF91cGRhdGVfcnR0bWluKGNvbnN0IHN0cnVjdCBzb2NrICpzaykKK3sKKwljb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlfX3UzMiBydHRtaW4gPSB0cC0+d2VzdHdvb2QucnR0X21pbjsKKworCWlmICh0cC0+d2VzdHdvb2QucnR0ICE9IDAgJiYKKwkgICAgKHRwLT53ZXN0d29vZC5ydHQgPCB0cC0+d2VzdHdvb2QucnR0X21pbiB8fCAhcnR0bWluKSkKKwkJcnR0bWluID0gdHAtPndlc3R3b29kLnJ0dDsKKworCXJldHVybiBydHRtaW47Cit9CisKKy8qCisgKiBAd2VzdHdvb2RfYWNrZWQKKyAqIEV2YWx1YXRlIGluY3JlYXNlcyBmb3IgZGsuIAorICovCisKK3N0YXRpYyBpbmxpbmUgX191MzIgd2VzdHdvb2RfYWNrZWQoY29uc3Qgc3RydWN0IHNvY2sgKnNrKQoreworCWNvbnN0IHN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJcmV0dXJuIHRwLT5zbmRfdW5hIC0gdHAtPndlc3R3b29kLnNuZF91bmE7Cit9CisKKy8qCisgKiBAd2VzdHdvb2RfbmV3X3dpbmRvdworICogSXQgZXZhbHVhdGVzIGlmIHdlIGFyZSByZWNlaXZpbmcgZGF0YSBpbnNpZGUgdGhlIHNhbWUgUlRUIHdpbmRvdyBhcworICogd2hlbiB3ZSBzdGFydGVkLgorICogUmV0dXJuIHZhbHVlOgorICogSXQgcmV0dXJucyAwIGlmIHdlIGFyZSBzdGlsbCBldmFsdWF0aW5nIHNhbXBsZXMgaW4gdGhlIHNhbWUgUlRUCisgKiB3aW5kb3csIDEgaWYgdGhlIHNhbXBsZSBoYXMgdG8gYmUgY29uc2lkZXJlZCBpbiB0aGUgbmV4dCB3aW5kb3cuCisgKi8KKworc3RhdGljIGludCB3ZXN0d29vZF9uZXdfd2luZG93KGNvbnN0IHN0cnVjdCBzb2NrICpzaykKK3sKKwljb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlfX3UzMiBsZWZ0X2JvdW5kOworCV9fdTMyIHJ0dDsKKwlpbnQgcmV0ID0gMDsKKworCWxlZnRfYm91bmQgPSB0cC0+d2VzdHdvb2QucnR0X3dpbl9zeDsKKwlydHQgPSBtYXgodHAtPndlc3R3b29kLnJ0dCwgKHUzMikgVENQX1dFU1RXT09EX1JUVF9NSU4pOworCisJLyoKKwkgKiBBIFJUVC13aW5kb3cgaGFzIHBhc3NlZC4gQmUgY2FyZWZ1bCBzaW5jZSBpZiBSVFQgaXMgbGVzcyB0aGFuCisJICogNTBtcyB3ZSBkb24ndCBmaWx0ZXIgYnV0IHdlIGNvbnRpbnVlICdidWlsZGluZyB0aGUgc2FtcGxlJy4KKwkgKiBUaGlzIG1pbmltdW0gbGltaXQgd2FzIGNob29zZW4gc2luY2UgYW4gZXN0aW1hdGlvbiBvbiBzbWFsbAorCSAqIHRpbWUgaW50ZXJ2YWxzIGlzIGJldHRlciB0byBhdm9pZC4uLgorCSAqIE9idmlvdWxzeSBvbiBhIExBTiB3ZSByZWFzb25hYmx5IHdpbGwgYWx3YXlzIGhhdmUKKwkgKiByaWdodF9ib3VuZCA9IGxlZnRfYm91bmQgKyBXRVNUV09PRF9SVFRfTUlOCisgICAgICAgICAqLworCisJaWYgKChsZWZ0X2JvdW5kICsgcnR0KSA8IHRjcF90aW1lX3N0YW1wKQorCQlyZXQgPSAxOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEB3ZXN0d29vZF91cGRhdGVfd2luZG93CisgKiBJdCB1cGRhdGVzIFJUVCBldmFsdWF0aW9uIHdpbmRvdyBpZiBpdCBpcyB0aGUgcmlnaHQgbW9tZW50IHRvIGRvCisgKiBpdC4gSWYgc28gaXQgY2FsbHMgZmlsdGVyIGZvciBldmFsdWF0aW5nIGJhbmR3aWR0aC4gCisgKi8KKworc3RhdGljIHZvaWQgX193ZXN0d29vZF91cGRhdGVfd2luZG93KHN0cnVjdCBzb2NrICpzaywgX191MzIgbm93KQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCV9fdTMyIGRlbHRhID0gbm93IC0gdHAtPndlc3R3b29kLnJ0dF93aW5fc3g7CisKKyAgICAgICAgaWYgKGRlbHRhKSB7CisJCWlmICh0cC0+d2VzdHdvb2QucnR0KQorCQkJd2VzdHdvb2RfZmlsdGVyKHNrLCBkZWx0YSk7CisKKwkJdHAtPndlc3R3b29kLmJrID0gMDsKKwkJdHAtPndlc3R3b29kLnJ0dF93aW5fc3ggPSB0Y3BfdGltZV9zdGFtcDsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgd2VzdHdvb2RfdXBkYXRlX3dpbmRvdyhzdHJ1Y3Qgc29jayAqc2ssIF9fdTMyIG5vdykKK3sKKwlpZiAod2VzdHdvb2RfbmV3X3dpbmRvdyhzaykpIAorCQlfX3dlc3R3b29kX3VwZGF0ZV93aW5kb3coc2ssIG5vdyk7Cit9CisKKy8qCisgKiBAX190Y3Bfd2VzdHdvb2RfZmFzdF9idworICogSXQgaXMgY2FsbGVkIHdoZW4gd2UgYXJlIGluIGZhc3QgcGF0aC4gSW4gcGFydGljdWxhciBpdCBpcyBjYWxsZWQgd2hlbgorICogaGVhZGVyIHByZWRpY3Rpb24gaXMgc3VjY2Vzc2Z1bGwuIEluIHN1Y2ggY2FzZSBpbmZhY3QgdXBkYXRlIGlzCisgKiBzdHJhaWdodCBmb3J3YXJkIGFuZCBkb2Vzbid0IG5lZWQgYW55IHBhcnRpY3VsYXIgY2FyZS4KKyAqLworCitzdGF0aWMgdm9pZCBfX3RjcF93ZXN0d29vZF9mYXN0X2J3KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKworCXdlc3R3b29kX3VwZGF0ZV93aW5kb3coc2ssIHRjcF90aW1lX3N0YW1wKTsKKworCXRwLT53ZXN0d29vZC5iayArPSB3ZXN0d29vZF9hY2tlZChzayk7CisJdHAtPndlc3R3b29kLnNuZF91bmEgPSB0cC0+c25kX3VuYTsKKwl0cC0+d2VzdHdvb2QucnR0X21pbiA9IHdlc3R3b29kX3VwZGF0ZV9ydHRtaW4oc2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNwX3dlc3R3b29kX2Zhc3RfYncoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworICAgICAgICBpZiAodGNwX2lzX3dlc3R3b29kKHRjcF9zayhzaykpKQorICAgICAgICAgICAgICAgIF9fdGNwX3dlc3R3b29kX2Zhc3RfYncoc2ssIHNrYik7Cit9CisKKworLyoKKyAqIEB3ZXN0d29vZF9kdXBhY2tfdXBkYXRlCisgKiBJdCB1cGRhdGVzIGFjY291bnRlZCBhbmQgY3VtdWxfYWNrIHdoZW4gcmVjZWl2aW5nIGEgZHVwYWNrLgorICovCisKK3N0YXRpYyB2b2lkIHdlc3R3b29kX2R1cGFja191cGRhdGUoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJdHAtPndlc3R3b29kLmFjY291bnRlZCArPSB0cC0+bXNzX2NhY2hlX3N0ZDsKKwl0cC0+d2VzdHdvb2QuY3VtdWxfYWNrID0gdHAtPm1zc19jYWNoZV9zdGQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHdlc3R3b29kX21heV9jaGFuZ2VfY3VtdWwoc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwlyZXR1cm4gKHRwLT53ZXN0d29vZC5jdW11bF9hY2sgPiB0cC0+bXNzX2NhY2hlX3N0ZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3ZXN0d29vZF9wYXJ0aWFsX3VwZGF0ZShzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCXRwLT53ZXN0d29vZC5hY2NvdW50ZWQgLT0gdHAtPndlc3R3b29kLmN1bXVsX2FjazsKKwl0cC0+d2VzdHdvb2QuY3VtdWxfYWNrID0gdHAtPm1zc19jYWNoZV9zdGQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3ZXN0d29vZF9jb21wbGV0ZV91cGRhdGUoc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwl0cC0+d2VzdHdvb2QuY3VtdWxfYWNrIC09IHRwLT53ZXN0d29vZC5hY2NvdW50ZWQ7CisJdHAtPndlc3R3b29kLmFjY291bnRlZCA9IDA7Cit9CisKKy8qCisgKiBAd2VzdHdvb2RfYWNrZWRfY291bnQKKyAqIFRoaXMgZnVuY3Rpb24gZXZhbHVhdGVzIGN1bXVsX2FjayBmb3IgZXZhbHVhdGluZyBkayBpbiBjYXNlIG9mCisgKiBkZWxheWVkIG9yIHBhcnRpYWwgYWNrcy4KKyAqLworCitzdGF0aWMgaW5saW5lIF9fdTMyIHdlc3R3b29kX2Fja2VkX2NvdW50KHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKworCXRwLT53ZXN0d29vZC5jdW11bF9hY2sgPSB3ZXN0d29vZF9hY2tlZChzayk7CisKKyAgICAgICAgLyogSWYgY3VtdWxfYWNrIGlzIDAgdGhpcyBpcyBhIGR1cGFjayBzaW5jZSBpdCdzIG5vdCBtb3ZpbmcKKyAgICAgICAgICogdHAtPnNuZF91bmEuCisgICAgICAgICAqLworICAgICAgICBpZiAoISh0cC0+d2VzdHdvb2QuY3VtdWxfYWNrKSkKKyAgICAgICAgICAgICAgICB3ZXN0d29vZF9kdXBhY2tfdXBkYXRlKHNrKTsKKworICAgICAgICBpZiAod2VzdHdvb2RfbWF5X2NoYW5nZV9jdW11bCh0cCkpIHsKKwkJLyogUGFydGlhbCBvciBkZWxheWVkIGFjayAqLworCQlpZiAodHAtPndlc3R3b29kLmFjY291bnRlZCA+PSB0cC0+d2VzdHdvb2QuY3VtdWxfYWNrKQorCQkJd2VzdHdvb2RfcGFydGlhbF91cGRhdGUodHApOworCQllbHNlCisJCQl3ZXN0d29vZF9jb21wbGV0ZV91cGRhdGUodHApOworCX0KKworCXRwLT53ZXN0d29vZC5zbmRfdW5hID0gdHAtPnNuZF91bmE7CisKKwlyZXR1cm4gdHAtPndlc3R3b29kLmN1bXVsX2FjazsKK30KKworCisvKgorICogQF9fdGNwX3dlc3R3b29kX3Nsb3dfYncKKyAqIEl0IGlzIGNhbGxlZCB3aGVuIHNvbWV0aGluZyBpcyBnb2luZyB3cm9uZy4uZXZlbiBpZiB0aGVyZSBjb3VsZAorICogYmUgbm8gcHJvYmxlbXMhIEluZmFjdCBhIHNpbXBsZSBkZWxheWVkIHBhY2tldCBtYXkgdHJpZ2dlciBhCisgKiBkdXBhY2suIEJ1dCB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgaW4gc3VjaCBjYXNlLgorICovCisKK3N0YXRpYyB2b2lkIF9fdGNwX3dlc3R3b29kX3Nsb3dfYncoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJd2VzdHdvb2RfdXBkYXRlX3dpbmRvdyhzaywgdGNwX3RpbWVfc3RhbXApOworCisJdHAtPndlc3R3b29kLmJrICs9IHdlc3R3b29kX2Fja2VkX2NvdW50KHNrKTsKKwl0cC0+d2VzdHdvb2QucnR0X21pbiA9IHdlc3R3b29kX3VwZGF0ZV9ydHRtaW4oc2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNwX3dlc3R3b29kX3Nsb3dfYncoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworICAgICAgICBpZiAodGNwX2lzX3dlc3R3b29kKHRjcF9zayhzaykpKQorICAgICAgICAgICAgICAgIF9fdGNwX3dlc3R3b29kX3Nsb3dfYncoc2ssIHNrYik7Cit9CisKKy8qIFRoaXMgcm91dGluZSBkZWFscyB3aXRoIGluY29taW5nIGFja3MsIGJ1dCBub3Qgb3V0Z29pbmcgb25lcy4gKi8KK3N0YXRpYyBpbnQgdGNwX2FjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIGludCBmbGFnKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXUzMiBwcmlvcl9zbmRfdW5hID0gdHAtPnNuZF91bmE7CisJdTMyIGFja19zZXEgPSBUQ1BfU0tCX0NCKHNrYiktPnNlcTsKKwl1MzIgYWNrID0gVENQX1NLQl9DQihza2IpLT5hY2tfc2VxOworCXUzMiBwcmlvcl9pbl9mbGlnaHQ7CisJczMyIHNlcV9ydHQ7CisJaW50IHByaW9yX3BhY2tldHM7CisKKwkvKiBJZiB0aGUgYWNrIGlzIG5ld2VyIHRoYW4gc2VudCBvciBvbGRlciB0aGFuIHByZXZpb3VzIGFja3MKKwkgKiB0aGVuIHdlIGNhbiBwcm9iYWJseSBpZ25vcmUgaXQuCisJICovCisJaWYgKGFmdGVyKGFjaywgdHAtPnNuZF9ueHQpKQorCQlnb3RvIHVuaW50ZXJlc3RpbmdfYWNrOworCisJaWYgKGJlZm9yZShhY2ssIHByaW9yX3NuZF91bmEpKQorCQlnb3RvIG9sZF9hY2s7CisKKwlpZiAoIShmbGFnJkZMQUdfU0xPV1BBVEgpICYmIGFmdGVyKGFjaywgcHJpb3Jfc25kX3VuYSkpIHsKKwkJLyogV2luZG93IGlzIGNvbnN0YW50LCBwdXJlIGZvcndhcmQgYWR2YW5jZS4KKwkJICogTm8gbW9yZSBjaGVja3MgYXJlIHJlcXVpcmVkLgorCQkgKiBOb3RlLCB3ZSB1c2UgdGhlIGZhY3QgdGhhdCBTTkQuVU5BPj1TTkQuV0wyLgorCQkgKi8KKwkJdGNwX3VwZGF0ZV93bCh0cCwgYWNrLCBhY2tfc2VxKTsKKwkJdHAtPnNuZF91bmEgPSBhY2s7CisJCXRjcF93ZXN0d29vZF9mYXN0X2J3KHNrLCBza2IpOworCQlmbGFnIHw9IEZMQUdfV0lOX1VQREFURTsKKworCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BIUEFDS1MpOworCX0gZWxzZSB7CisJCWlmIChhY2tfc2VxICE9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSkKKwkJCWZsYWcgfD0gRkxBR19EQVRBOworCQllbHNlCisJCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BQVVJFQUNLUyk7CisKKwkJZmxhZyB8PSB0Y3BfYWNrX3VwZGF0ZV93aW5kb3coc2ssIHRwLCBza2IsIGFjaywgYWNrX3NlcSk7CisKKwkJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkKQorCQkJZmxhZyB8PSB0Y3Bfc2Fja3RhZ193cml0ZV9xdWV1ZShzaywgc2tiLCBwcmlvcl9zbmRfdW5hKTsKKworCQlpZiAoVENQX0VDTl9yY3ZfZWNuX2VjaG8odHAsIHNrYi0+aC50aCkpCisJCQlmbGFnIHw9IEZMQUdfRUNFOworCisJCXRjcF93ZXN0d29vZF9zbG93X2J3KHNrLHNrYik7CisJfQorCisJLyogV2UgcGFzc2VkIGRhdGEgYW5kIGdvdCBpdCBhY2tlZCwgcmVtb3ZlIGFueSBzb2Z0IGVycm9yCisJICogbG9nLiBTb21ldGhpbmcgd29ya2VkLi4uCisJICovCisJc2stPnNrX2Vycl9zb2Z0ID0gMDsKKwl0cC0+cmN2X3RzdGFtcCA9IHRjcF90aW1lX3N0YW1wOworCXByaW9yX3BhY2tldHMgPSB0cC0+cGFja2V0c19vdXQ7CisJaWYgKCFwcmlvcl9wYWNrZXRzKQorCQlnb3RvIG5vX3F1ZXVlOworCisJcHJpb3JfaW5fZmxpZ2h0ID0gdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKTsKKworCS8qIFNlZSBpZiB3ZSBjYW4gdGFrZSBhbnl0aGluZyBvZmYgb2YgdGhlIHJldHJhbnNtaXQgcXVldWUuICovCisJZmxhZyB8PSB0Y3BfY2xlYW5fcnR4X3F1ZXVlKHNrLCAmc2VxX3J0dCk7CisKKwlpZiAodHAtPmZydG9fY291bnRlcikKKwkJdGNwX3Byb2Nlc3NfZnJ0byhzaywgcHJpb3Jfc25kX3VuYSk7CisKKwlpZiAodGNwX2Fja19pc19kdWJpb3VzKHRwLCBmbGFnKSkgeworCQkvKiBBZHZhbnZlIENXTkQsIGlmIHN0YXRlIGFsbG93cyB0aGlzLiAqLworCQlpZiAoKGZsYWcgJiBGTEFHX0RBVEFfQUNLRUQpICYmCisJCSAgICAodGNwX3ZlZ2FzX2VuYWJsZWQodHApIHx8IHByaW9yX2luX2ZsaWdodCA+PSB0cC0+c25kX2N3bmQpICYmCisJCSAgICB0Y3BfbWF5X3JhaXNlX2N3bmQodHAsIGZsYWcpKQorCQkJdGNwX2NvbmdfYXZvaWQodHAsIGFjaywgc2VxX3J0dCk7CisJCXRjcF9mYXN0cmV0cmFuc19hbGVydChzaywgcHJpb3Jfc25kX3VuYSwgcHJpb3JfcGFja2V0cywgZmxhZyk7CisJfSBlbHNlIHsKKwkJaWYgKChmbGFnICYgRkxBR19EQVRBX0FDS0VEKSAmJiAKKwkJICAgICh0Y3BfdmVnYXNfZW5hYmxlZCh0cCkgfHwgcHJpb3JfaW5fZmxpZ2h0ID49IHRwLT5zbmRfY3duZCkpCisJCQl0Y3BfY29uZ19hdm9pZCh0cCwgYWNrLCBzZXFfcnR0KTsKKwl9CisKKwlpZiAoKGZsYWcgJiBGTEFHX0ZPUldBUkRfUFJPR1JFU1MpIHx8ICEoZmxhZyZGTEFHX05PVF9EVVApKQorCQlkc3RfY29uZmlybShzay0+c2tfZHN0X2NhY2hlKTsKKworCXJldHVybiAxOworCitub19xdWV1ZToKKwl0cC0+cHJvYmVzX291dCA9IDA7CisKKwkvKiBJZiB0aGlzIGFjayBvcGVucyB1cCBhIHplcm8gd2luZG93LCBjbGVhciBiYWNrb2ZmLiAgSXQgd2FzCisJICogYmVpbmcgdXNlZCB0byB0aW1lIHRoZSBwcm9iZXMsIGFuZCBpcyBwcm9iYWJseSBmYXIgaGlnaGVyIHRoYW4KKwkgKiBpdCBuZWVkcyB0byBiZSBmb3Igbm9ybWFsIHJldHJhbnNtaXNzaW9uLgorCSAqLworCWlmIChzay0+c2tfc2VuZF9oZWFkKQorCQl0Y3BfYWNrX3Byb2JlKHNrKTsKKwlyZXR1cm4gMTsKKworb2xkX2FjazoKKwlpZiAoVENQX1NLQl9DQihza2IpLT5zYWNrZWQpCisJCXRjcF9zYWNrdGFnX3dyaXRlX3F1ZXVlKHNrLCBza2IsIHByaW9yX3NuZF91bmEpOworCit1bmludGVyZXN0aW5nX2FjazoKKwlTT0NLX0RFQlVHKHNrLCAiQWNrICV1IG91dCBvZiAldToldVxuIiwgYWNrLCB0cC0+c25kX3VuYSwgdHAtPnNuZF9ueHQpOworCXJldHVybiAwOworfQorCisKKy8qIExvb2sgZm9yIHRjcCBvcHRpb25zLiBOb3JtYWxseSBvbmx5IGNhbGxlZCBvbiBTWU4gYW5kIFNZTkFDSyBwYWNrZXRzLgorICogQnV0LCB0aGlzIGNhbiBhbHNvIGJlIGNhbGxlZCBvbiBwYWNrZXRzIGluIHRoZSBlc3RhYmxpc2hlZCBmbG93IHdoZW4KKyAqIHRoZSBmYXN0IHZlcnNpb24gYmVsb3cgZmFpbHMuCisgKi8KK3ZvaWQgdGNwX3BhcnNlX29wdGlvbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjcF9vcHRpb25zX3JlY2VpdmVkICpvcHRfcngsIGludCBlc3RhYikKK3sKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisJc3RydWN0IHRjcGhkciAqdGggPSBza2ItPmgudGg7CisJaW50IGxlbmd0aD0odGgtPmRvZmYqNCktc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOworCisJcHRyID0gKHVuc2lnbmVkIGNoYXIgKikodGggKyAxKTsKKwlvcHRfcngtPnNhd190c3RhbXAgPSAwOworCisJd2hpbGUobGVuZ3RoPjApIHsKKwkgIAlpbnQgb3Bjb2RlPSpwdHIrKzsKKwkJaW50IG9wc2l6ZTsKKworCQlzd2l0Y2ggKG9wY29kZSkgeworCQkJY2FzZSBUQ1BPUFRfRU9MOgorCQkJCXJldHVybjsKKwkJCWNhc2UgVENQT1BUX05PUDoJLyogUmVmOiBSRkMgNzkzIHNlY3Rpb24gMy4xICovCisJCQkJbGVuZ3RoLS07CisJCQkJY29udGludWU7CisJCQlkZWZhdWx0OgorCQkJCW9wc2l6ZT0qcHRyKys7CisJCQkJaWYgKG9wc2l6ZSA8IDIpIC8qICJzaWxseSBvcHRpb25zIiAqLworCQkJCQlyZXR1cm47CisJCQkJaWYgKG9wc2l6ZSA+IGxlbmd0aCkKKwkJCQkJcmV0dXJuOwkvKiBkb24ndCBwYXJzZSBwYXJ0aWFsIG9wdGlvbnMgKi8KKwkgIAkJCXN3aXRjaChvcGNvZGUpIHsKKwkJCQljYXNlIFRDUE9QVF9NU1M6CisJCQkJCWlmKG9wc2l6ZT09VENQT0xFTl9NU1MgJiYgdGgtPnN5biAmJiAhZXN0YWIpIHsKKwkJCQkJCXUxNiBpbl9tc3MgPSBudG9ocyhnZXRfdW5hbGlnbmVkKChfX3UxNiAqKXB0cikpOworCQkJCQkJaWYgKGluX21zcykgeworCQkJCQkJCWlmIChvcHRfcngtPnVzZXJfbXNzICYmIG9wdF9yeC0+dXNlcl9tc3MgPCBpbl9tc3MpCisJCQkJCQkJCWluX21zcyA9IG9wdF9yeC0+dXNlcl9tc3M7CisJCQkJCQkJb3B0X3J4LT5tc3NfY2xhbXAgPSBpbl9tc3M7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUQ1BPUFRfV0lORE9XOgorCQkJCQlpZihvcHNpemU9PVRDUE9MRU5fV0lORE9XICYmIHRoLT5zeW4gJiYgIWVzdGFiKQorCQkJCQkJaWYgKHN5c2N0bF90Y3Bfd2luZG93X3NjYWxpbmcpIHsKKwkJCQkJCQlfX3U4IHNuZF93c2NhbGUgPSAqKF9fdTggKikgcHRyOworCQkJCQkJCW9wdF9yeC0+d3NjYWxlX29rID0gMTsKKwkJCQkJCQlpZiAoc25kX3dzY2FsZSA+IDE0KSB7CisJCQkJCQkJCWlmKG5ldF9yYXRlbGltaXQoKSkKKwkJCQkJCQkJCXByaW50ayhLRVJOX0lORk8gInRjcF9wYXJzZV9vcHRpb25zOiBJbGxlZ2FsIHdpbmRvdyAiCisJCQkJCQkJCQkgICAgICAgInNjYWxpbmcgdmFsdWUgJWQgPjE0IHJlY2VpdmVkLlxuIiwKKwkJCQkJCQkJCSAgICAgICBzbmRfd3NjYWxlKTsKKwkJCQkJCQkJc25kX3dzY2FsZSA9IDE0OworCQkJCQkJCX0KKwkJCQkJCQlvcHRfcngtPnNuZF93c2NhbGUgPSBzbmRfd3NjYWxlOworCQkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFRDUE9QVF9USU1FU1RBTVA6CisJCQkJCWlmKG9wc2l6ZT09VENQT0xFTl9USU1FU1RBTVApIHsKKwkJCQkJCWlmICgoZXN0YWIgJiYgb3B0X3J4LT50c3RhbXBfb2spIHx8CisJCQkJCQkgICAgKCFlc3RhYiAmJiBzeXNjdGxfdGNwX3RpbWVzdGFtcHMpKSB7CisJCQkJCQkJb3B0X3J4LT5zYXdfdHN0YW1wID0gMTsKKwkJCQkJCQlvcHRfcngtPnJjdl90c3ZhbCA9IG50b2hsKGdldF91bmFsaWduZWQoKF9fdTMyICopcHRyKSk7CisJCQkJCQkJb3B0X3J4LT5yY3ZfdHNlY3IgPSBudG9obChnZXRfdW5hbGlnbmVkKChfX3UzMiAqKShwdHIrNCkpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFRDUE9QVF9TQUNLX1BFUk06CisJCQkJCWlmKG9wc2l6ZT09VENQT0xFTl9TQUNLX1BFUk0gJiYgdGgtPnN5biAmJiAhZXN0YWIpIHsKKwkJCQkJCWlmIChzeXNjdGxfdGNwX3NhY2spIHsKKwkJCQkJCQlvcHRfcngtPnNhY2tfb2sgPSAxOworCQkJCQkJCXRjcF9zYWNrX3Jlc2V0KG9wdF9yeCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIFRDUE9QVF9TQUNLOgorCQkJCQlpZigob3BzaXplID49IChUQ1BPTEVOX1NBQ0tfQkFTRSArIFRDUE9MRU5fU0FDS19QRVJCTE9DSykpICYmCisJCQkJCSAgICEoKG9wc2l6ZSAtIFRDUE9MRU5fU0FDS19CQVNFKSAlIFRDUE9MRU5fU0FDS19QRVJCTE9DSykgJiYKKwkJCQkJICAgb3B0X3J4LT5zYWNrX29rKSB7CisJCQkJCQlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCA9IChwdHIgLSAyKSAtICh1bnNpZ25lZCBjaGFyICopdGg7CisJCQkJCX0KKwkgIAkJCX07CisJICAJCQlwdHIrPW9wc2l6ZS0yOworCSAgCQkJbGVuZ3RoLT1vcHNpemU7CisJICAJfTsKKwl9Cit9CisKKy8qIEZhc3QgcGFyc2Ugb3B0aW9ucy4gVGhpcyBob3BlcyB0byBvbmx5IHNlZSB0aW1lc3RhbXBzLgorICogSWYgaXQgaXMgd3JvbmcgaXQgZmFsbHMgYmFjayBvbiB0Y3BfcGFyc2Vfb3B0aW9ucygpLgorICovCitzdGF0aWMgaW5saW5lIGludCB0Y3BfZmFzdF9wYXJzZV9vcHRpb25zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y3BoZHIgKnRoLAorCQkJCQkgc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwlpZiAodGgtPmRvZmYgPT0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpPj4yKSB7CisJCXRwLT5yeF9vcHQuc2F3X3RzdGFtcCA9IDA7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAodHAtPnJ4X29wdC50c3RhbXBfb2sgJiYKKwkJICAgdGgtPmRvZmYgPT0gKHNpemVvZihzdHJ1Y3QgdGNwaGRyKT4+MikrKFRDUE9MRU5fVFNUQU1QX0FMSUdORUQ+PjIpKSB7CisJCV9fdTMyICpwdHIgPSAoX191MzIgKikodGggKyAxKTsKKwkJaWYgKCpwdHIgPT0gbnRvaGwoKFRDUE9QVF9OT1AgPDwgMjQpIHwgKFRDUE9QVF9OT1AgPDwgMTYpCisJCQkJICB8IChUQ1BPUFRfVElNRVNUQU1QIDw8IDgpIHwgVENQT0xFTl9USU1FU1RBTVApKSB7CisJCQl0cC0+cnhfb3B0LnNhd190c3RhbXAgPSAxOworCQkJKytwdHI7CisJCQl0cC0+cnhfb3B0LnJjdl90c3ZhbCA9IG50b2hsKCpwdHIpOworCQkJKytwdHI7CisJCQl0cC0+cnhfb3B0LnJjdl90c2VjciA9IG50b2hsKCpwdHIpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJdGNwX3BhcnNlX29wdGlvbnMoc2tiLCAmdHAtPnJ4X29wdCwgMSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y3Bfc3RvcmVfdHNfcmVjZW50KHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJdHAtPnJ4X29wdC50c19yZWNlbnQgPSB0cC0+cnhfb3B0LnJjdl90c3ZhbDsKKwl0cC0+cnhfb3B0LnRzX3JlY2VudF9zdGFtcCA9IHh0aW1lLnR2X3NlYzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjcF9yZXBsYWNlX3RzX3JlY2VudChzdHJ1Y3QgdGNwX3NvY2sgKnRwLCB1MzIgc2VxKQoreworCWlmICh0cC0+cnhfb3B0LnNhd190c3RhbXAgJiYgIWFmdGVyKHNlcSwgdHAtPnJjdl93dXApKSB7CisJCS8qIFBBV1MgYnVnIHdvcmthcm91bmQgd3J0LiBBQ0sgZnJhbWVzLCB0aGUgUEFXUyBkaXNjYXJkCisJCSAqIGV4dHJhIGNoZWNrIGJlbG93IG1ha2VzIHN1cmUgdGhpcyBjYW4gb25seSBoYXBwZW4KKwkJICogZm9yIHB1cmUgQUNLIGZyYW1lcy4gIC1EYXZlTQorCQkgKgorCQkgKiBOb3Qgb25seSwgYWxzbyBpdCBvY2N1cnMgZm9yIGV4cGlyZWQgdGltZXN0YW1wcy4KKwkJICovCisKKwkJaWYoKHMzMikodHAtPnJ4X29wdC5yY3ZfdHN2YWwgLSB0cC0+cnhfb3B0LnRzX3JlY2VudCkgPj0gMCB8fAorCQkgICB4dGltZS50dl9zZWMgPj0gdHAtPnJ4X29wdC50c19yZWNlbnRfc3RhbXAgKyBUQ1BfUEFXU18yNERBWVMpCisJCQl0Y3Bfc3RvcmVfdHNfcmVjZW50KHRwKTsKKwl9Cit9CisKKy8qIFNvcnJ5LCBQQVdTIGFzIHNwZWNpZmllZCBpcyBicm9rZW4gd3J0LiBwdXJlLUFDS3MgLURhdmVNCisgKgorICogSXQgaXMgbm90IGZhdGFsLiBJZiB0aGlzIEFDSyBkb2VzIF9ub3RfIGNoYW5nZSBjcml0aWNhbCBzdGF0ZSAoc2Vxcywgd2luZG93KQorICogaXQgY2FuIHBhc3MgdGhyb3VnaCBzdGFjay4gU28sIHRoZSBmb2xsb3dpbmcgcHJlZGljYXRlIHZlcmlmaWVzIHRoYXQKKyAqIHRoaXMgc2VnbWVudCBpcyBub3QgdXNlZCBmb3IgYW55dGhpbmcgYnV0IGNvbmdlc3Rpb24gYXZvaWRhbmNlIG9yCisgKiBmYXN0IHJldHJhbnNtaXQuIE1vcmVvdmVyLCB3ZSBldmVuIGFyZSBhYmxlIHRvIGVsaW1pbmF0ZSBtb3N0IG9mIHN1Y2gKKyAqIHNlY29uZCBvcmRlciBlZmZlY3RzLCBpZiB3ZSBhcHBseSBzb21lIHNtYWxsICJyZXBsYXkiIHdpbmRvdyAoflJUTykKKyAqIHRvIHRpbWVzdGFtcCBzcGFjZS4KKyAqCisgKiBBbGwgdGhlc2UgbWVhc3VyZXMgc3RpbGwgZG8gbm90IGd1YXJhbnRlZSB0aGF0IHdlIHJlamVjdCB3cmFwcGVkIEFDS3MKKyAqIG9uIG5ldHdvcmtzIHdpdGggaGlnaCBiYW5kd2lkdGgsIHdoZW4gc2VxdWVuY2Ugc3BhY2UgaXMgcmVjeWNsZWQgZmFzdGx5LAorICogYnV0IGl0IGd1YXJhbnRlZXMgdGhhdCBzdWNoIGV2ZW50cyB3aWxsIGJlIHZlcnkgcmFyZSBhbmQgZG8gbm90IGFmZmVjdAorICogY29ubmVjdGlvbiBzZXJpb3VzbHkuIFRoaXMgZG9lc24ndCBsb29rIG5pY2UsIGJ1dCBhbGFzLCBQQVdTIGlzIHJlYWxseQorICogYnVnZ3kgZXh0ZW5zaW9uLgorICoKKyAqIFsgTGF0ZXIgbm90ZS4gRXZlbiB3b3JzZSEgSXQgaXMgYnVnZ3kgZm9yIHNlZ21lbnRzIF93aXRoXyBkYXRhLiBSRkMKKyAqIHN0YXRlcyB0aGF0IGV2ZW50cyB3aGVuIHJldHJhbnNtaXQgYXJyaXZlcyBhZnRlciBvcmlnaW5hbCBkYXRhIGFyZSByYXJlLgorICogSXQgaXMgYSBibGF0YW50IGxpZS4gVkogZm9yZ290IGFib3V0IGZhc3QgcmV0cmFuc21pdCEgOCk4KSBJdCBpcworICogdGhlIGJpZ2dlc3QgcHJvYmxlbSBvbiBsYXJnZSBwb3dlciBuZXR3b3JrcyBldmVuIHdpdGggbWlub3IgcmVvcmRlcmluZy4KKyAqIE9LLCBsZXQncyBnaXZlIGl0IHNtYWxsIHJlcGxheSB3aW5kb3cuIElmIHBlZXIgY2xvY2sgaXMgZXZlbiAxaHosIGl0IGlzIHNhZmUKKyAqIHVwIHRvIGJhbmR3aWR0aCBvZiAxOEdpZ2FiaXQvc2VjLiA4KSBdCisgKi8KKworc3RhdGljIGludCB0Y3BfZGlzb3JkZXJlZF9hY2soc3RydWN0IHRjcF9zb2NrICp0cCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgdGNwaGRyICp0aCA9IHNrYi0+aC50aDsKKwl1MzIgc2VxID0gVENQX1NLQl9DQihza2IpLT5zZXE7CisJdTMyIGFjayA9IFRDUF9TS0JfQ0Ioc2tiKS0+YWNrX3NlcTsKKworCXJldHVybiAoLyogMS4gUHVyZSBBQ0sgd2l0aCBjb3JyZWN0IHNlcXVlbmNlIG51bWJlci4gKi8KKwkJKHRoLT5hY2sgJiYgc2VxID09IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSAmJiBzZXEgPT0gdHAtPnJjdl9ueHQpICYmCisKKwkJLyogMi4gLi4uIGFuZCBkdXBsaWNhdGUgQUNLLiAqLworCQlhY2sgPT0gdHAtPnNuZF91bmEgJiYKKworCQkvKiAzLiAuLi4gYW5kIGRvZXMgbm90IHVwZGF0ZSB3aW5kb3cuICovCisJCSF0Y3BfbWF5X3VwZGF0ZV93aW5kb3codHAsIGFjaywgc2VxLCBudG9ocyh0aC0+d2luZG93KSA8PCB0cC0+cnhfb3B0LnNuZF93c2NhbGUpICYmCisKKwkJLyogNC4gLi4uIGFuZCBzaXRzIGluIHJlcGxheSB3aW5kb3cuICovCisJCShzMzIpKHRwLT5yeF9vcHQudHNfcmVjZW50IC0gdHAtPnJ4X29wdC5yY3ZfdHN2YWwpIDw9ICh0cC0+cnRvKjEwMjQpL0haKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGNwX3Bhd3NfZGlzY2FyZChzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAoKHMzMikodHAtPnJ4X29wdC50c19yZWNlbnQgLSB0cC0+cnhfb3B0LnJjdl90c3ZhbCkgPiBUQ1BfUEFXU19XSU5ET1cgJiYKKwkJeHRpbWUudHZfc2VjIDwgdHAtPnJ4X29wdC50c19yZWNlbnRfc3RhbXAgKyBUQ1BfUEFXU18yNERBWVMgJiYKKwkJIXRjcF9kaXNvcmRlcmVkX2Fjayh0cCwgc2tiKSk7Cit9CisKKy8qIENoZWNrIHNlZ21lbnQgc2VxdWVuY2UgbnVtYmVyIGZvciB2YWxpZGl0eS4KKyAqCisgKiBTZWdtZW50IGNvbnRyb2xzIGFyZSBjb25zaWRlcmVkIHZhbGlkLCBpZiB0aGUgc2VnbWVudAorICogZml0cyB0byB0aGUgd2luZG93IGFmdGVyIHRydW5jYXRpb24gdG8gdGhlIHdpbmRvdy4gQWNjZXB0YWJpbGl0eQorICogb2YgZGF0YSAoYW5kIFNZTiwgRklOLCBvZiBjb3Vyc2UpIGlzIGNoZWNrZWQgc2VwYXJhdGVseS4KKyAqIFNlZSB0Y3BfZGF0YV9xdWV1ZSgpLCBmb3IgZXhhbXBsZS4KKyAqCisgKiBBbHNvLCBjb250cm9scyAoUlNUIGlzIG1haW4gb25lKSBhcmUgYWNjZXB0ZWQgdXNpbmcgUkNWLldVUCBpbnN0ZWFkCisgKiBvZiBSQ1YuTlhULiBQZWVyIHN0aWxsIGRpZCBub3QgYWR2YW5jZSBoaXMgU05ELlVOQSB3aGVuIHdlCisgKiBkZWxheWVkIEFDSywgc28gdGhhdCBoaXNTTkQuVU5BPD1vdXJSQ1YuV1VQLgorICogKGJvcnJvd2VkIGZyb20gZnJlZWJzZCkKKyAqLworCitzdGF0aWMgaW5saW5lIGludCB0Y3Bfc2VxdWVuY2Uoc3RydWN0IHRjcF9zb2NrICp0cCwgdTMyIHNlcSwgdTMyIGVuZF9zZXEpCit7CisJcmV0dXJuCSFiZWZvcmUoZW5kX3NlcSwgdHAtPnJjdl93dXApICYmCisJCSFhZnRlcihzZXEsIHRwLT5yY3Zfbnh0ICsgdGNwX3JlY2VpdmVfd2luZG93KHRwKSk7Cit9CisKKy8qIFdoZW4gd2UgZ2V0IGEgcmVzZXQgd2UgZG8gdGhpcy4gKi8KK3N0YXRpYyB2b2lkIHRjcF9yZXNldChzdHJ1Y3Qgc29jayAqc2spCit7CisJLyogV2Ugd2FudCB0aGUgcmlnaHQgZXJyb3IgYXMgQlNEIHNlZXMgaXQgKGFuZCBpbmRlZWQgYXMgd2UgZG8pLiAqLworCXN3aXRjaCAoc2stPnNrX3N0YXRlKSB7CisJCWNhc2UgVENQX1NZTl9TRU5UOgorCQkJc2stPnNrX2VyciA9IEVDT05OUkVGVVNFRDsKKwkJCWJyZWFrOworCQljYXNlIFRDUF9DTE9TRV9XQUlUOgorCQkJc2stPnNrX2VyciA9IEVQSVBFOworCQkJYnJlYWs7CisJCWNhc2UgVENQX0NMT1NFOgorCQkJcmV0dXJuOworCQlkZWZhdWx0OgorCQkJc2stPnNrX2VyciA9IEVDT05OUkVTRVQ7CisJfQorCisJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCisJCXNrLT5za19lcnJvcl9yZXBvcnQoc2spOworCisJdGNwX2RvbmUoc2spOworfQorCisvKgorICogCVByb2Nlc3MgdGhlIEZJTiBiaXQuIFRoaXMgbm93IGJlaGF2ZXMgYXMgaXQgaXMgc3VwcG9zZWQgdG8gd29yaworICoJYW5kIHRoZSBGSU4gdGFrZXMgZWZmZWN0IHdoZW4gaXQgaXMgdmFsaWRseSBwYXJ0IG9mIHNlcXVlbmNlCisgKglzcGFjZS4gTm90IGJlZm9yZSB3aGVuIHdlIGdldCBob2xlcy4KKyAqCisgKglJZiB3ZSBhcmUgRVNUQUJMSVNIRUQsIGEgcmVjZWl2ZWQgZmluIG1vdmVzIHVzIHRvIENMT1NFLVdBSVQKKyAqCShhbmQgdGhlbmNlIG9udG8gTEFTVC1BQ0sgYW5kIGZpbmFsbHksIENMT1NFLCB3ZSBuZXZlciBlbnRlcgorICoJVElNRS1XQUlUKQorICoKKyAqCUlmIHdlIGFyZSBpbiBGSU5XQUlULTEsIGEgcmVjZWl2ZWQgRklOIGluZGljYXRlcyBzaW11bHRhbmVvdXMKKyAqCWNsb3NlIGFuZCB3ZSBnbyBpbnRvIENMT1NJTkcgKGFuZCBsYXRlciBvbnRvIFRJTUUtV0FJVCkKKyAqCisgKglJZiB3ZSBhcmUgaW4gRklOV0FJVC0yLCBhIHJlY2VpdmVkIEZJTiBtb3ZlcyB1cyB0byBUSU1FLVdBSVQuCisgKi8KK3N0YXRpYyB2b2lkIHRjcF9maW4oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwaGRyICp0aCkKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKworCXRjcF9zY2hlZHVsZV9hY2sodHApOworCisJc2stPnNrX3NodXRkb3duIHw9IFJDVl9TSFVURE9XTjsKKwlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX0RPTkUpOworCisJc3dpdGNoIChzay0+c2tfc3RhdGUpIHsKKwkJY2FzZSBUQ1BfU1lOX1JFQ1Y6CisJCWNhc2UgVENQX0VTVEFCTElTSEVEOgorCQkJLyogTW92ZSB0byBDTE9TRV9XQUlUICovCisJCQl0Y3Bfc2V0X3N0YXRlKHNrLCBUQ1BfQ0xPU0VfV0FJVCk7CisJCQl0cC0+YWNrLnBpbmdwb25nID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgVENQX0NMT1NFX1dBSVQ6CisJCWNhc2UgVENQX0NMT1NJTkc6CisJCQkvKiBSZWNlaXZlZCBhIHJldHJhbnNtaXNzaW9uIG9mIHRoZSBGSU4sIGRvCisJCQkgKiBub3RoaW5nLgorCQkJICovCisJCQlicmVhazsKKwkJY2FzZSBUQ1BfTEFTVF9BQ0s6CisJCQkvKiBSRkM3OTM6IFJlbWFpbiBpbiB0aGUgTEFTVC1BQ0sgc3RhdGUuICovCisJCQlicmVhazsKKworCQljYXNlIFRDUF9GSU5fV0FJVDE6CisJCQkvKiBUaGlzIGNhc2Ugb2NjdXJzIHdoZW4gYSBzaW11bHRhbmVvdXMgY2xvc2UKKwkJCSAqIGhhcHBlbnMsIHdlIG11c3QgYWNrIHRoZSByZWNlaXZlZCBGSU4gYW5kCisJCQkgKiBlbnRlciB0aGUgQ0xPU0lORyBzdGF0ZS4KKwkJCSAqLworCQkJdGNwX3NlbmRfYWNrKHNrKTsKKwkJCXRjcF9zZXRfc3RhdGUoc2ssIFRDUF9DTE9TSU5HKTsKKwkJCWJyZWFrOworCQljYXNlIFRDUF9GSU5fV0FJVDI6CisJCQkvKiBSZWNlaXZlZCBhIEZJTiAtLSBzZW5kIEFDSyBhbmQgZW50ZXIgVElNRV9XQUlULiAqLworCQkJdGNwX3NlbmRfYWNrKHNrKTsKKwkJCXRjcF90aW1lX3dhaXQoc2ssIFRDUF9USU1FX1dBSVQsIDApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBPbmx5IFRDUF9MSVNURU4gYW5kIFRDUF9DTE9TRSBhcmUgbGVmdCwgaW4gdGhlc2UKKwkJCSAqIGNhc2VzIHdlIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIHBpZWNlIG9mIGNvZGUuCisJCQkgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEltcG9zc2libGUsIHNrLT5za19zdGF0ZT0lZFxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIHNrLT5za19zdGF0ZSk7CisJCQlicmVhazsKKwl9OworCisJLyogSXQgX2lzXyBwb3NzaWJsZSwgdGhhdCB3ZSBoYXZlIHNvbWV0aGluZyBvdXQtb2Ytb3JkZXIgX2FmdGVyXyBGSU4uCisJICogUHJvYmFibHksIHdlIHNob3VsZCByZXNldCBpbiB0aGlzIGNhc2UuIEZvciBub3cgZHJvcCB0aGVtLgorCSAqLworCV9fc2tiX3F1ZXVlX3B1cmdlKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKKwlpZiAodHAtPnJ4X29wdC5zYWNrX29rKQorCQl0Y3Bfc2Fja19yZXNldCgmdHAtPnJ4X29wdCk7CisJc2tfc3RyZWFtX21lbV9yZWNsYWltKHNrKTsKKworCWlmICghc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKSB7CisJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCisJCS8qIERvIG5vdCBzZW5kIFBPTExfSFVQIGZvciBoYWxmIGR1cGxleCBjbG9zZS4gKi8KKwkJaWYgKHNrLT5za19zaHV0ZG93biA9PSBTSFVURE9XTl9NQVNLIHx8CisJCSAgICBzay0+c2tfc3RhdGUgPT0gVENQX0NMT1NFKQorCQkJc2tfd2FrZV9hc3luYyhzaywgMSwgUE9MTF9IVVApOworCQllbHNlCisJCQlza193YWtlX2FzeW5jKHNrLCAxLCBQT0xMX0lOKTsKKwl9Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludAordGNwX3NhY2tfZXh0ZW5kKHN0cnVjdCB0Y3Bfc2Fja19ibG9jayAqc3AsIHUzMiBzZXEsIHUzMiBlbmRfc2VxKQoreworCWlmICghYWZ0ZXIoc2VxLCBzcC0+ZW5kX3NlcSkgJiYgIWFmdGVyKHNwLT5zdGFydF9zZXEsIGVuZF9zZXEpKSB7CisJCWlmIChiZWZvcmUoc2VxLCBzcC0+c3RhcnRfc2VxKSkKKwkJCXNwLT5zdGFydF9zZXEgPSBzZXE7CisJCWlmIChhZnRlcihlbmRfc2VxLCBzcC0+ZW5kX3NlcSkpCisJCQlzcC0+ZW5kX3NlcSA9IGVuZF9zZXE7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjcF9kc2Fja19zZXQoc3RydWN0IHRjcF9zb2NrICp0cCwgdTMyIHNlcSwgdTMyIGVuZF9zZXEpCit7CisJaWYgKHRwLT5yeF9vcHQuc2Fja19vayAmJiBzeXNjdGxfdGNwX2RzYWNrKSB7CisJCWlmIChiZWZvcmUoc2VxLCB0cC0+cmN2X254dCkpCisJCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BEU0FDS09MRFNFTlQpOworCQllbHNlCisJCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BEU0FDS09GT1NFTlQpOworCisJCXRwLT5yeF9vcHQuZHNhY2sgPSAxOworCQl0cC0+ZHVwbGljYXRlX3NhY2tbMF0uc3RhcnRfc2VxID0gc2VxOworCQl0cC0+ZHVwbGljYXRlX3NhY2tbMF0uZW5kX3NlcSA9IGVuZF9zZXE7CisJCXRwLT5yeF9vcHQuZWZmX3NhY2tzID0gbWluKHRwLT5yeF9vcHQubnVtX3NhY2tzICsgMSwgNCAtIHRwLT5yeF9vcHQudHN0YW1wX29rKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfZHNhY2tfZXh0ZW5kKHN0cnVjdCB0Y3Bfc29jayAqdHAsIHUzMiBzZXEsIHUzMiBlbmRfc2VxKQoreworCWlmICghdHAtPnJ4X29wdC5kc2FjaykKKwkJdGNwX2RzYWNrX3NldCh0cCwgc2VxLCBlbmRfc2VxKTsKKwllbHNlCisJCXRjcF9zYWNrX2V4dGVuZCh0cC0+ZHVwbGljYXRlX3NhY2ssIHNlcSwgZW5kX3NlcSk7Cit9CisKK3N0YXRpYyB2b2lkIHRjcF9zZW5kX2R1cGFjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisKKwlpZiAoVENQX1NLQl9DQihza2IpLT5lbmRfc2VxICE9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxICYmCisJICAgIGJlZm9yZShUQ1BfU0tCX0NCKHNrYiktPnNlcSwgdHAtPnJjdl9ueHQpKSB7CisJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX0RFTEFZRURBQ0tMT1NUKTsKKwkJdGNwX2VudGVyX3F1aWNrYWNrX21vZGUodHApOworCisJCWlmICh0cC0+cnhfb3B0LnNhY2tfb2sgJiYgc3lzY3RsX3RjcF9kc2FjaykgeworCQkJdTMyIGVuZF9zZXEgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7CisKKwkJCWlmIChhZnRlcihUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEsIHRwLT5yY3Zfbnh0KSkKKwkJCQllbmRfc2VxID0gdHAtPnJjdl9ueHQ7CisJCQl0Y3BfZHNhY2tfc2V0KHRwLCBUQ1BfU0tCX0NCKHNrYiktPnNlcSwgZW5kX3NlcSk7CisJCX0KKwl9CisKKwl0Y3Bfc2VuZF9hY2soc2spOworfQorCisvKiBUaGVzZSByb3V0aW5lcyB1cGRhdGUgdGhlIFNBQ0sgYmxvY2sgYXMgb3V0LW9mLW9yZGVyIHBhY2tldHMgYXJyaXZlIG9yCisgKiBpbi1vcmRlciBwYWNrZXRzIGNsb3NlIHVwIHRoZSBzZXF1ZW5jZSBzcGFjZS4KKyAqLworc3RhdGljIHZvaWQgdGNwX3NhY2tfbWF5YmVfY29hbGVzY2Uoc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwlpbnQgdGhpc19zYWNrOworCXN0cnVjdCB0Y3Bfc2Fja19ibG9jayAqc3AgPSAmdHAtPnNlbGVjdGl2ZV9hY2tzWzBdOworCXN0cnVjdCB0Y3Bfc2Fja19ibG9jayAqc3dhbGsgPSBzcCsxOworCisJLyogU2VlIGlmIHRoZSByZWNlbnQgY2hhbmdlIHRvIHRoZSBmaXJzdCBTQUNLIGVhdHMgaW50bworCSAqIG9yIGhpdHMgdGhlIHNlcXVlbmNlIHNwYWNlIG9mIG90aGVyIFNBQ0sgYmxvY2tzLCBpZiBzbyBjb2FsZXNjZS4KKwkgKi8KKwlmb3IgKHRoaXNfc2FjayA9IDE7IHRoaXNfc2FjayA8IHRwLT5yeF9vcHQubnVtX3NhY2tzOyApIHsKKwkJaWYgKHRjcF9zYWNrX2V4dGVuZChzcCwgc3dhbGstPnN0YXJ0X3NlcSwgc3dhbGstPmVuZF9zZXEpKSB7CisJCQlpbnQgaTsKKworCQkJLyogWmFwIFNXQUxLLCBieSBtb3ZpbmcgZXZlcnkgZnVydGhlciBTQUNLIHVwIGJ5IG9uZSBzbG90LgorCQkJICogRGVjcmVhc2UgbnVtX3NhY2tzLgorCQkJICovCisJCQl0cC0+cnhfb3B0Lm51bV9zYWNrcy0tOworCQkJdHAtPnJ4X29wdC5lZmZfc2Fja3MgPSBtaW4odHAtPnJ4X29wdC5udW1fc2Fja3MgKyB0cC0+cnhfb3B0LmRzYWNrLCA0IC0gdHAtPnJ4X29wdC50c3RhbXBfb2spOworCQkJZm9yKGk9dGhpc19zYWNrOyBpIDwgdHAtPnJ4X29wdC5udW1fc2Fja3M7IGkrKykKKwkJCQlzcFtpXSA9IHNwW2krMV07CisJCQljb250aW51ZTsKKwkJfQorCQl0aGlzX3NhY2srKywgc3dhbGsrKzsKKwl9Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgdGNwX3NhY2tfc3dhcChzdHJ1Y3QgdGNwX3NhY2tfYmxvY2sgKnNhY2sxLCBzdHJ1Y3QgdGNwX3NhY2tfYmxvY2sgKnNhY2syKQoreworCV9fdTMyIHRtcDsKKworCXRtcCA9IHNhY2sxLT5zdGFydF9zZXE7CisJc2FjazEtPnN0YXJ0X3NlcSA9IHNhY2syLT5zdGFydF9zZXE7CisJc2FjazItPnN0YXJ0X3NlcSA9IHRtcDsKKworCXRtcCA9IHNhY2sxLT5lbmRfc2VxOworCXNhY2sxLT5lbmRfc2VxID0gc2FjazItPmVuZF9zZXE7CisJc2FjazItPmVuZF9zZXEgPSB0bXA7Cit9CisKK3N0YXRpYyB2b2lkIHRjcF9zYWNrX25ld19vZm9fc2tiKHN0cnVjdCBzb2NrICpzaywgdTMyIHNlcSwgdTMyIGVuZF9zZXEpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IHRjcF9zYWNrX2Jsb2NrICpzcCA9ICZ0cC0+c2VsZWN0aXZlX2Fja3NbMF07CisJaW50IGN1cl9zYWNrcyA9IHRwLT5yeF9vcHQubnVtX3NhY2tzOworCWludCB0aGlzX3NhY2s7CisKKwlpZiAoIWN1cl9zYWNrcykKKwkJZ290byBuZXdfc2FjazsKKworCWZvciAodGhpc19zYWNrPTA7IHRoaXNfc2FjazxjdXJfc2Fja3M7IHRoaXNfc2FjaysrLCBzcCsrKSB7CisJCWlmICh0Y3Bfc2Fja19leHRlbmQoc3AsIHNlcSwgZW5kX3NlcSkpIHsKKwkJCS8qIFJvdGF0ZSB0aGlzX3NhY2sgdG8gdGhlIGZpcnN0IG9uZS4gKi8KKwkJCWZvciAoOyB0aGlzX3NhY2s+MDsgdGhpc19zYWNrLS0sIHNwLS0pCisJCQkJdGNwX3NhY2tfc3dhcChzcCwgc3AtMSk7CisJCQlpZiAoY3VyX3NhY2tzID4gMSkKKwkJCQl0Y3Bfc2Fja19tYXliZV9jb2FsZXNjZSh0cCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBDb3VsZCBub3QgZmluZCBhbiBhZGphY2VudCBleGlzdGluZyBTQUNLLCBidWlsZCBhIG5ldyBvbmUsCisJICogcHV0IGl0IGF0IHRoZSBmcm9udCwgYW5kIHNoaWZ0IGV2ZXJ5b25lIGVsc2UgZG93bi4gIFdlCisJICogYWx3YXlzIGtub3cgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIFNBQ0sgcHJlc2VudCBhbHJlYWR5IGhlcmUuCisJICoKKwkgKiBJZiB0aGUgc2FjayBhcnJheSBpcyBmdWxsLCBmb3JnZXQgYWJvdXQgdGhlIGxhc3Qgb25lLgorCSAqLworCWlmICh0aGlzX3NhY2sgPj0gNCkgeworCQl0aGlzX3NhY2stLTsKKwkJdHAtPnJ4X29wdC5udW1fc2Fja3MtLTsKKwkJc3AtLTsKKwl9CisJZm9yKDsgdGhpc19zYWNrID4gMDsgdGhpc19zYWNrLS0sIHNwLS0pCisJCSpzcCA9ICooc3AtMSk7CisKK25ld19zYWNrOgorCS8qIEJ1aWxkIHRoZSBuZXcgaGVhZCBTQUNLLCBhbmQgd2UncmUgZG9uZS4gKi8KKwlzcC0+c3RhcnRfc2VxID0gc2VxOworCXNwLT5lbmRfc2VxID0gZW5kX3NlcTsKKwl0cC0+cnhfb3B0Lm51bV9zYWNrcysrOworCXRwLT5yeF9vcHQuZWZmX3NhY2tzID0gbWluKHRwLT5yeF9vcHQubnVtX3NhY2tzICsgdHAtPnJ4X29wdC5kc2FjaywgNCAtIHRwLT5yeF9vcHQudHN0YW1wX29rKTsKK30KKworLyogUkNWLk5YVCBhZHZhbmNlcywgc29tZSBTQUNLcyBzaG91bGQgYmUgZWF0ZW4uICovCisKK3N0YXRpYyB2b2lkIHRjcF9zYWNrX3JlbW92ZShzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCXN0cnVjdCB0Y3Bfc2Fja19ibG9jayAqc3AgPSAmdHAtPnNlbGVjdGl2ZV9hY2tzWzBdOworCWludCBudW1fc2Fja3MgPSB0cC0+cnhfb3B0Lm51bV9zYWNrczsKKwlpbnQgdGhpc19zYWNrOworCisJLyogRW1wdHkgb2ZvIHF1ZXVlLCBoZW5jZSwgYWxsIHRoZSBTQUNLcyBhcmUgZWF0ZW4uIENsZWFyLiAqLworCWlmIChza2JfcXVldWVfbGVuKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSA9PSAwKSB7CisJCXRwLT5yeF9vcHQubnVtX3NhY2tzID0gMDsKKwkJdHAtPnJ4X29wdC5lZmZfc2Fja3MgPSB0cC0+cnhfb3B0LmRzYWNrOworCQlyZXR1cm47CisJfQorCisJZm9yKHRoaXNfc2FjayA9IDA7IHRoaXNfc2FjayA8IG51bV9zYWNrczsgKSB7CisJCS8qIENoZWNrIGlmIHRoZSBzdGFydCBvZiB0aGUgc2FjayBpcyBjb3ZlcmVkIGJ5IFJDVi5OWFQuICovCisJCWlmICghYmVmb3JlKHRwLT5yY3Zfbnh0LCBzcC0+c3RhcnRfc2VxKSkgeworCQkJaW50IGk7CisKKwkJCS8qIFJDVi5OWFQgbXVzdCBjb3ZlciBhbGwgdGhlIGJsb2NrISAqLworCQkJQlVHX1RSQVAoIWJlZm9yZSh0cC0+cmN2X254dCwgc3AtPmVuZF9zZXEpKTsKKworCQkJLyogWmFwIHRoaXMgU0FDSywgYnkgbW92aW5nIGZvcndhcmQgYW55IG90aGVyIFNBQ0tTLiAqLworCQkJZm9yIChpPXRoaXNfc2FjaysxOyBpIDwgbnVtX3NhY2tzOyBpKyspCisJCQkJdHAtPnNlbGVjdGl2ZV9hY2tzW2ktMV0gPSB0cC0+c2VsZWN0aXZlX2Fja3NbaV07CisJCQludW1fc2Fja3MtLTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXRoaXNfc2FjaysrOworCQlzcCsrOworCX0KKwlpZiAobnVtX3NhY2tzICE9IHRwLT5yeF9vcHQubnVtX3NhY2tzKSB7CisJCXRwLT5yeF9vcHQubnVtX3NhY2tzID0gbnVtX3NhY2tzOworCQl0cC0+cnhfb3B0LmVmZl9zYWNrcyA9IG1pbih0cC0+cnhfb3B0Lm51bV9zYWNrcyArIHRwLT5yeF9vcHQuZHNhY2ssIDQgLSB0cC0+cnhfb3B0LnRzdGFtcF9vayk7CisJfQorfQorCisvKiBUaGlzIG9uZSBjaGVja3MgdG8gc2VlIGlmIHdlIGNhbiBwdXQgZGF0YSBmcm9tIHRoZQorICogb3V0X29mX29yZGVyIHF1ZXVlIGludG8gdGhlIHJlY2VpdmVfcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkIHRjcF9vZm9fcXVldWUoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCV9fdTMyIGRzYWNrX2hpZ2ggPSB0cC0+cmN2X254dDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJd2hpbGUgKChza2IgPSBza2JfcGVlaygmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkpICE9IE5VTEwpIHsKKwkJaWYgKGFmdGVyKFRDUF9TS0JfQ0Ioc2tiKS0+c2VxLCB0cC0+cmN2X254dCkpCisJCQlicmVhazsKKworCQlpZiAoYmVmb3JlKFRDUF9TS0JfQ0Ioc2tiKS0+c2VxLCBkc2Fja19oaWdoKSkgeworCQkJX191MzIgZHNhY2sgPSBkc2Fja19oaWdoOworCQkJaWYgKGJlZm9yZShUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEsIGRzYWNrX2hpZ2gpKQorCQkJCWRzYWNrX2hpZ2ggPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7CisJCQl0Y3BfZHNhY2tfZXh0ZW5kKHRwLCBUQ1BfU0tCX0NCKHNrYiktPnNlcSwgZHNhY2spOworCQl9CisKKwkJaWYgKCFhZnRlcihUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEsIHRwLT5yY3Zfbnh0KSkgeworCQkJU09DS19ERUJVRyhzaywgIm9mbyBwYWNrZXQgd2FzIGFscmVhZHkgcmVjZWl2ZWQgXG4iKTsKKwkJCV9fc2tiX3VubGluayhza2IsIHNrYi0+bGlzdCk7CisJCQlfX2tmcmVlX3NrYihza2IpOworCQkJY29udGludWU7CisJCX0KKwkJU09DS19ERUJVRyhzaywgIm9mbyByZXF1ZXVpbmcgOiByY3ZfbmV4dCAlWCBzZXEgJVggLSAlWFxuIiwKKwkJCSAgIHRwLT5yY3Zfbnh0LCBUQ1BfU0tCX0NCKHNrYiktPnNlcSwKKwkJCSAgIFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSk7CisKKwkJX19za2JfdW5saW5rKHNrYiwgc2tiLT5saXN0KTsKKwkJX19za2JfcXVldWVfdGFpbCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJCXRwLT5yY3Zfbnh0ID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxOworCQlpZihza2ItPmgudGgtPmZpbikKKwkJCXRjcF9maW4oc2tiLCBzaywgc2tiLT5oLnRoKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdGNwX3BydW5lX3F1ZXVlKHN0cnVjdCBzb2NrICpzayk7CisKK3N0YXRpYyB2b2lkIHRjcF9kYXRhX3F1ZXVlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgdGNwaGRyICp0aCA9IHNrYi0+aC50aDsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlpbnQgZWF0ZW4gPSAtMTsKKworCWlmIChUQ1BfU0tCX0NCKHNrYiktPnNlcSA9PSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEpCisJCWdvdG8gZHJvcDsKKworCXRoID0gc2tiLT5oLnRoOworCV9fc2tiX3B1bGwoc2tiLCB0aC0+ZG9mZio0KTsKKworCVRDUF9FQ05fYWNjZXB0X2N3cih0cCwgc2tiKTsKKworCWlmICh0cC0+cnhfb3B0LmRzYWNrKSB7CisJCXRwLT5yeF9vcHQuZHNhY2sgPSAwOworCQl0cC0+cnhfb3B0LmVmZl9zYWNrcyA9IG1pbl90KHVuc2lnbmVkIGludCwgdHAtPnJ4X29wdC5udW1fc2Fja3MsCisJCQkJCQkgICAgNCAtIHRwLT5yeF9vcHQudHN0YW1wX29rKTsKKwl9CisKKwkvKiAgUXVldWUgZGF0YSBmb3IgZGVsaXZlcnkgdG8gdGhlIHVzZXIuCisJICogIFBhY2tldHMgaW4gc2VxdWVuY2UgZ28gdG8gdGhlIHJlY2VpdmUgcXVldWUuCisJICogIE91dCBvZiBzZXF1ZW5jZSBwYWNrZXRzIHRvIHRoZSBvdXRfb2Zfb3JkZXJfcXVldWUuCisJICovCisJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+c2VxID09IHRwLT5yY3Zfbnh0KSB7CisJCWlmICh0Y3BfcmVjZWl2ZV93aW5kb3codHApID09IDApCisJCQlnb3RvIG91dF9vZl93aW5kb3c7CisKKwkJLyogT2suIEluIHNlcXVlbmNlLiBJbiB3aW5kb3cuICovCisJCWlmICh0cC0+dWNvcHkudGFzayA9PSBjdXJyZW50ICYmCisJCSAgICB0cC0+Y29waWVkX3NlcSA9PSB0cC0+cmN2X254dCAmJiB0cC0+dWNvcHkubGVuICYmCisJCSAgICBzb2NrX293bmVkX2J5X3VzZXIoc2spICYmICF0cC0+dXJnX2RhdGEpIHsKKwkJCWludCBjaHVuayA9IG1pbl90KHVuc2lnbmVkIGludCwgc2tiLT5sZW4sCisJCQkJCQkJdHAtPnVjb3B5Lmxlbik7CisKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCQkJbG9jYWxfYmhfZW5hYmxlKCk7CisJCQlpZiAoIXNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgMCwgdHAtPnVjb3B5LmlvdiwgY2h1bmspKSB7CisJCQkJdHAtPnVjb3B5LmxlbiAtPSBjaHVuazsKKwkJCQl0cC0+Y29waWVkX3NlcSArPSBjaHVuazsKKwkJCQllYXRlbiA9IChjaHVuayA9PSBza2ItPmxlbiAmJiAhdGgtPmZpbik7CisJCQkJdGNwX3Jjdl9zcGFjZV9hZGp1c3Qoc2spOworCQkJfQorCQkJbG9jYWxfYmhfZGlzYWJsZSgpOworCQl9CisKKwkJaWYgKGVhdGVuIDw9IDApIHsKK3F1ZXVlX2FuZF9vdXQ6CisJCQlpZiAoZWF0ZW4gPCAwICYmCisJCQkgICAgKGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPiBzay0+c2tfcmN2YnVmIHx8CisJCQkgICAgICFza19zdHJlYW1fcm1lbV9zY2hlZHVsZShzaywgc2tiKSkpIHsKKwkJCQlpZiAodGNwX3BydW5lX3F1ZXVlKHNrKSA8IDAgfHwKKwkJCQkgICAgIXNrX3N0cmVhbV9ybWVtX3NjaGVkdWxlKHNrLCBza2IpKQorCQkJCQlnb3RvIGRyb3A7CisJCQl9CisJCQlza19zdHJlYW1fc2V0X293bmVyX3Ioc2tiLCBzayk7CisJCQlfX3NrYl9xdWV1ZV90YWlsKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKKwkJfQorCQl0cC0+cmN2X254dCA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKKwkJaWYoc2tiLT5sZW4pCisJCQl0Y3BfZXZlbnRfZGF0YV9yZWN2KHNrLCB0cCwgc2tiKTsKKwkJaWYodGgtPmZpbikKKwkJCXRjcF9maW4oc2tiLCBzaywgdGgpOworCisJCWlmIChza2JfcXVldWVfbGVuKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkgeworCQkJdGNwX29mb19xdWV1ZShzayk7CisKKwkJCS8qIFJGQzI1ODEuIDQuMi4gU0hPVUxEIHNlbmQgaW1tZWRpYXRlIEFDSywgd2hlbgorCQkJICogZ2FwIGluIHF1ZXVlIGlzIGZpbGxlZC4KKwkJCSAqLworCQkJaWYgKCFza2JfcXVldWVfbGVuKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkKKwkJCQl0cC0+YWNrLnBpbmdwb25nID0gMDsKKwkJfQorCisJCWlmICh0cC0+cnhfb3B0Lm51bV9zYWNrcykKKwkJCXRjcF9zYWNrX3JlbW92ZSh0cCk7CisKKwkJdGNwX2Zhc3RfcGF0aF9jaGVjayhzaywgdHApOworCisJCWlmIChlYXRlbiA+IDApCisJCQlfX2tmcmVlX3NrYihza2IpOworCQllbHNlIGlmICghc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKQorCQkJc2stPnNrX2RhdGFfcmVhZHkoc2ssIDApOworCQlyZXR1cm47CisJfQorCisJaWYgKCFhZnRlcihUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEsIHRwLT5yY3Zfbnh0KSkgeworCQkvKiBBIHJldHJhbnNtaXQsIDJuZCBtb3N0IGNvbW1vbiBjYXNlLiAgRm9yY2UgYW4gaW1tZWRpYXRlIGFjay4gKi8KKwkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfREVMQVlFREFDS0xPU1QpOworCQl0Y3BfZHNhY2tfc2V0KHRwLCBUQ1BfU0tCX0NCKHNrYiktPnNlcSwgVENQX1NLQl9DQihza2IpLT5lbmRfc2VxKTsKKworb3V0X29mX3dpbmRvdzoKKwkJdGNwX2VudGVyX3F1aWNrYWNrX21vZGUodHApOworCQl0Y3Bfc2NoZWR1bGVfYWNrKHRwKTsKK2Ryb3A6CisJCV9fa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisKKwkvKiBPdXQgb2Ygd2luZG93LiBGLmUuIHplcm8gd2luZG93IHByb2JlLiAqLworCWlmICghYmVmb3JlKFRDUF9TS0JfQ0Ioc2tiKS0+c2VxLCB0cC0+cmN2X254dCArIHRjcF9yZWNlaXZlX3dpbmRvdyh0cCkpKQorCQlnb3RvIG91dF9vZl93aW5kb3c7CisKKwl0Y3BfZW50ZXJfcXVpY2thY2tfbW9kZSh0cCk7CisKKwlpZiAoYmVmb3JlKFRDUF9TS0JfQ0Ioc2tiKS0+c2VxLCB0cC0+cmN2X254dCkpIHsKKwkJLyogUGFydGlhbCBwYWNrZXQsIHNlcSA8IHJjdl9uZXh0IDwgZW5kX3NlcSAqLworCQlTT0NLX0RFQlVHKHNrLCAicGFydGlhbCBwYWNrZXQ6IHJjdl9uZXh0ICVYIHNlcSAlWCAtICVYXG4iLAorCQkJICAgdHAtPnJjdl9ueHQsIFRDUF9TS0JfQ0Ioc2tiKS0+c2VxLAorCQkJICAgVENQX1NLQl9DQihza2IpLT5lbmRfc2VxKTsKKworCQl0Y3BfZHNhY2tfc2V0KHRwLCBUQ1BfU0tCX0NCKHNrYiktPnNlcSwgdHAtPnJjdl9ueHQpOworCQkKKwkJLyogSWYgd2luZG93IGlzIGNsb3NlZCwgZHJvcCB0YWlsIG9mIHBhY2tldC4gQnV0IGFmdGVyCisJCSAqIHJlbWVtYmVyaW5nIEQtU0FDSyBmb3IgaXRzIGhlYWQgbWFkZSBpbiBwcmV2aW91cyBsaW5lLgorCQkgKi8KKwkJaWYgKCF0Y3BfcmVjZWl2ZV93aW5kb3codHApKQorCQkJZ290byBvdXRfb2Zfd2luZG93OworCQlnb3RvIHF1ZXVlX2FuZF9vdXQ7CisJfQorCisJVENQX0VDTl9jaGVja19jZSh0cCwgc2tiKTsKKworCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpID4gc2stPnNrX3JjdmJ1ZiB8fAorCSAgICAhc2tfc3RyZWFtX3JtZW1fc2NoZWR1bGUoc2ssIHNrYikpIHsKKwkJaWYgKHRjcF9wcnVuZV9xdWV1ZShzaykgPCAwIHx8CisJCSAgICAhc2tfc3RyZWFtX3JtZW1fc2NoZWR1bGUoc2ssIHNrYikpCisJCQlnb3RvIGRyb3A7CisJfQorCisJLyogRGlzYWJsZSBoZWFkZXIgcHJlZGljdGlvbi4gKi8KKwl0cC0+cHJlZF9mbGFncyA9IDA7CisJdGNwX3NjaGVkdWxlX2Fjayh0cCk7CisKKwlTT0NLX0RFQlVHKHNrLCAib3V0IG9mIG9yZGVyIHNlZ21lbnQ6IHJjdl9uZXh0ICVYIHNlcSAlWCAtICVYXG4iLAorCQkgICB0cC0+cmN2X254dCwgVENQX1NLQl9DQihza2IpLT5zZXEsIFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSk7CisKKwlza19zdHJlYW1fc2V0X293bmVyX3Ioc2tiLCBzayk7CisKKwlpZiAoIXNrYl9wZWVrKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkgeworCQkvKiBJbml0aWFsIG91dCBvZiBvcmRlciBzZWdtZW50LCBidWlsZCAxIFNBQ0suICovCisJCWlmICh0cC0+cnhfb3B0LnNhY2tfb2spIHsKKwkJCXRwLT5yeF9vcHQubnVtX3NhY2tzID0gMTsKKwkJCXRwLT5yeF9vcHQuZHNhY2sgICAgID0gMDsKKwkJCXRwLT5yeF9vcHQuZWZmX3NhY2tzID0gMTsKKwkJCXRwLT5zZWxlY3RpdmVfYWNrc1swXS5zdGFydF9zZXEgPSBUQ1BfU0tCX0NCKHNrYiktPnNlcTsKKwkJCXRwLT5zZWxlY3RpdmVfYWNrc1swXS5lbmRfc2VxID0KKwkJCQkJCVRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKKwkJfQorCQlfX3NrYl9xdWV1ZV9oZWFkKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlLHNrYik7CisJfSBlbHNlIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjEgPSB0cC0+b3V0X29mX29yZGVyX3F1ZXVlLnByZXY7CisJCXUzMiBzZXEgPSBUQ1BfU0tCX0NCKHNrYiktPnNlcTsKKwkJdTMyIGVuZF9zZXEgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7CisKKwkJaWYgKHNlcSA9PSBUQ1BfU0tCX0NCKHNrYjEpLT5lbmRfc2VxKSB7CisJCQlfX3NrYl9hcHBlbmQoc2tiMSwgc2tiKTsKKworCQkJaWYgKCF0cC0+cnhfb3B0Lm51bV9zYWNrcyB8fAorCQkJICAgIHRwLT5zZWxlY3RpdmVfYWNrc1swXS5lbmRfc2VxICE9IHNlcSkKKwkJCQlnb3RvIGFkZF9zYWNrOworCisJCQkvKiBDb21tb24gY2FzZTogZGF0YSBhcnJpdmUgaW4gb3JkZXIgYWZ0ZXIgaG9sZS4gKi8KKwkJCXRwLT5zZWxlY3RpdmVfYWNrc1swXS5lbmRfc2VxID0gZW5kX3NlcTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIEZpbmQgcGxhY2UgdG8gaW5zZXJ0IHRoaXMgc2VnbWVudC4gKi8KKwkJZG8geworCQkJaWYgKCFhZnRlcihUQ1BfU0tCX0NCKHNrYjEpLT5zZXEsIHNlcSkpCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKChza2IxID0gc2tiMS0+cHJldikgIT0KKwkJCSAoc3RydWN0IHNrX2J1ZmYqKSZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKKworCQkvKiBEbyBza2Igb3ZlcmxhcCB0byBwcmV2aW91cyBvbmU/ICovCisJCWlmIChza2IxICE9IChzdHJ1Y3Qgc2tfYnVmZiopJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUgJiYKKwkJICAgIGJlZm9yZShzZXEsIFRDUF9TS0JfQ0Ioc2tiMSktPmVuZF9zZXEpKSB7CisJCQlpZiAoIWFmdGVyKGVuZF9zZXEsIFRDUF9TS0JfQ0Ioc2tiMSktPmVuZF9zZXEpKSB7CisJCQkJLyogQWxsIHRoZSBiaXRzIGFyZSBwcmVzZW50LiBEcm9wLiAqLworCQkJCV9fa2ZyZWVfc2tiKHNrYik7CisJCQkJdGNwX2RzYWNrX3NldCh0cCwgc2VxLCBlbmRfc2VxKTsKKwkJCQlnb3RvIGFkZF9zYWNrOworCQkJfQorCQkJaWYgKGFmdGVyKHNlcSwgVENQX1NLQl9DQihza2IxKS0+c2VxKSkgeworCQkJCS8qIFBhcnRpYWwgb3ZlcmxhcC4gKi8KKwkJCQl0Y3BfZHNhY2tfc2V0KHRwLCBzZXEsIFRDUF9TS0JfQ0Ioc2tiMSktPmVuZF9zZXEpOworCQkJfSBlbHNlIHsKKwkJCQlza2IxID0gc2tiMS0+cHJldjsKKwkJCX0KKwkJfQorCQlfX3NrYl9pbnNlcnQoc2tiLCBza2IxLCBza2IxLT5uZXh0LCAmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CisJCQorCQkvKiBBbmQgY2xlYW4gc2VnbWVudHMgY292ZXJlZCBieSBuZXcgb25lIGFzIHdob2xlLiAqLworCQl3aGlsZSAoKHNrYjEgPSBza2ItPm5leHQpICE9CisJCSAgICAgICAoc3RydWN0IHNrX2J1ZmYqKSZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlICYmCisJCSAgICAgICBhZnRlcihlbmRfc2VxLCBUQ1BfU0tCX0NCKHNrYjEpLT5zZXEpKSB7CisJCSAgICAgICBpZiAoYmVmb3JlKGVuZF9zZXEsIFRDUF9TS0JfQ0Ioc2tiMSktPmVuZF9zZXEpKSB7CisJCQkgICAgICAgdGNwX2RzYWNrX2V4dGVuZCh0cCwgVENQX1NLQl9DQihza2IxKS0+c2VxLCBlbmRfc2VxKTsKKwkJCSAgICAgICBicmVhazsKKwkJICAgICAgIH0KKwkJICAgICAgIF9fc2tiX3VubGluayhza2IxLCBza2IxLT5saXN0KTsKKwkJICAgICAgIHRjcF9kc2Fja19leHRlbmQodHAsIFRDUF9TS0JfQ0Ioc2tiMSktPnNlcSwgVENQX1NLQl9DQihza2IxKS0+ZW5kX3NlcSk7CisJCSAgICAgICBfX2tmcmVlX3NrYihza2IxKTsKKwkJfQorCithZGRfc2FjazoKKwkJaWYgKHRwLT5yeF9vcHQuc2Fja19vaykKKwkJCXRjcF9zYWNrX25ld19vZm9fc2tiKHNrLCBzZXEsIGVuZF9zZXEpOworCX0KK30KKworLyogQ29sbGFwc2UgY29udGlndW91cyBzZXF1ZW5jZSBvZiBza2JzIGhlYWQuLnRhaWwgd2l0aAorICogc2VxdWVuY2UgbnVtYmVycyBzdGFydC4uZW5kLgorICogU2VnbWVudHMgd2l0aCBGSU4vU1lOIGFyZSBub3QgY29sbGFwc2VkIChvbmx5IGJlY2F1c2UgdGhpcworICogc2ltcGxpZmllcyBjb2RlKQorICovCitzdGF0aWMgdm9pZAordGNwX2NvbGxhcHNlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKmhlYWQsCisJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqdGFpbCwgdTMyIHN0YXJ0LCB1MzIgZW5kKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwkvKiBGaXJzdCwgY2hlY2sgdGhhdCBxdWV1ZSBpcyBjb2xsYXBzYWJsZSBhbmQgZmluZAorCSAqIHRoZSBwb2ludCB3aGVyZSBjb2xsYXBzaW5nIGNhbiBiZSB1c2VmdWwuICovCisJZm9yIChza2IgPSBoZWFkOyBza2IgIT0gdGFpbDsgKSB7CisJCS8qIE5vIG5ldyBiaXRzPyBJdCBpcyBwb3NzaWJsZSBvbiBvZm8gcXVldWUuICovCisJCWlmICghYmVmb3JlKHN0YXJ0LCBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEpKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dCA9IHNrYi0+bmV4dDsKKwkJCV9fc2tiX3VubGluayhza2IsIHNrYi0+bGlzdCk7CisJCQlfX2tmcmVlX3NrYihza2IpOworCQkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfVENQUkNWQ09MTEFQU0VEKTsKKwkJCXNrYiA9IG5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFRoZSBmaXJzdCBza2IgdG8gY29sbGFwc2UgaXM6CisJCSAqIC0gbm90IFNZTi9GSU4gYW5kCisJCSAqIC0gYmxvYXRlZCBvciBjb250YWlucyBkYXRhIGJlZm9yZSAic3RhcnQiIG9yCisJCSAqICAgb3ZlcmxhcHMgdG8gdGhlIG5leHQgb25lLgorCQkgKi8KKwkJaWYgKCFza2ItPmgudGgtPnN5biAmJiAhc2tiLT5oLnRoLT5maW4gJiYKKwkJICAgICh0Y3Bfd2luX2Zyb21fc3BhY2Uoc2tiLT50cnVlc2l6ZSkgPiBza2ItPmxlbiB8fAorCQkgICAgIGJlZm9yZShUQ1BfU0tCX0NCKHNrYiktPnNlcSwgc3RhcnQpIHx8CisJCSAgICAgKHNrYi0+bmV4dCAhPSB0YWlsICYmCisJCSAgICAgIFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSAhPSBUQ1BfU0tCX0NCKHNrYi0+bmV4dCktPnNlcSkpKQorCQkJYnJlYWs7CisKKwkJLyogRGVjaWRlZCB0byBza2lwIHRoaXMsIGFkdmFuY2Ugc3RhcnQgc2VxLiAqLworCQlzdGFydCA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKKwkJc2tiID0gc2tiLT5uZXh0OworCX0KKwlpZiAoc2tiID09IHRhaWwgfHwgc2tiLT5oLnRoLT5zeW4gfHwgc2tiLT5oLnRoLT5maW4pCisJCXJldHVybjsKKworCXdoaWxlIChiZWZvcmUoc3RhcnQsIGVuZCkpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKm5za2I7CisJCWludCBoZWFkZXIgPSBza2JfaGVhZHJvb20oc2tiKTsKKwkJaW50IGNvcHkgPSBTS0JfTUFYX09SREVSKGhlYWRlciwgMCk7CisKKwkJLyogVG9vIGJpZyBoZWFkZXI/IFRoaXMgY2FuIGhhcHBlbiB3aXRoIElQdjYuICovCisJCWlmIChjb3B5IDwgMCkKKwkJCXJldHVybjsKKwkJaWYgKGVuZC1zdGFydCA8IGNvcHkpCisJCQljb3B5ID0gZW5kLXN0YXJ0OworCQluc2tiID0gYWxsb2Nfc2tiKGNvcHkraGVhZGVyLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFuc2tiKQorCQkJcmV0dXJuOworCQlza2JfcmVzZXJ2ZShuc2tiLCBoZWFkZXIpOworCQltZW1jcHkobnNrYi0+aGVhZCwgc2tiLT5oZWFkLCBoZWFkZXIpOworCQluc2tiLT5uaC5yYXcgPSBuc2tiLT5oZWFkICsgKHNrYi0+bmgucmF3LXNrYi0+aGVhZCk7CisJCW5za2ItPmgucmF3ID0gbnNrYi0+aGVhZCArIChza2ItPmgucmF3LXNrYi0+aGVhZCk7CisJCW5za2ItPm1hYy5yYXcgPSBuc2tiLT5oZWFkICsgKHNrYi0+bWFjLnJhdy1za2ItPmhlYWQpOworCQltZW1jcHkobnNrYi0+Y2IsIHNrYi0+Y2IsIHNpemVvZihza2ItPmNiKSk7CisJCVRDUF9TS0JfQ0IobnNrYiktPnNlcSA9IFRDUF9TS0JfQ0IobnNrYiktPmVuZF9zZXEgPSBzdGFydDsKKwkJX19za2JfaW5zZXJ0KG5za2IsIHNrYi0+cHJldiwgc2tiLCBza2ItPmxpc3QpOworCQlza19zdHJlYW1fc2V0X293bmVyX3IobnNrYiwgc2spOworCisJCS8qIENvcHkgZGF0YSwgcmVsZWFzaW5nIGNvbGxhcHNlZCBza2JzLiAqLworCQl3aGlsZSAoY29weSA+IDApIHsKKwkJCWludCBvZmZzZXQgPSBzdGFydCAtIFRDUF9TS0JfQ0Ioc2tiKS0+c2VxOworCQkJaW50IHNpemUgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEgLSBzdGFydDsKKworCQkJaWYgKG9mZnNldCA8IDApIEJVRygpOworCQkJaWYgKHNpemUgPiAwKSB7CisJCQkJc2l6ZSA9IG1pbihjb3B5LCBzaXplKTsKKwkJCQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIG9mZnNldCwgc2tiX3B1dChuc2tiLCBzaXplKSwgc2l6ZSkpCisJCQkJCUJVRygpOworCQkJCVRDUF9TS0JfQ0IobnNrYiktPmVuZF9zZXEgKz0gc2l6ZTsKKwkJCQljb3B5IC09IHNpemU7CisJCQkJc3RhcnQgKz0gc2l6ZTsKKwkJCX0KKwkJCWlmICghYmVmb3JlKHN0YXJ0LCBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEpKSB7CisJCQkJc3RydWN0IHNrX2J1ZmYgKm5leHQgPSBza2ItPm5leHQ7CisJCQkJX19za2JfdW5saW5rKHNrYiwgc2tiLT5saXN0KTsKKwkJCQlfX2tmcmVlX3NrYihza2IpOworCQkJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUFJDVkNPTExBUFNFRCk7CisJCQkJc2tiID0gbmV4dDsKKwkJCQlpZiAoc2tiID09IHRhaWwgfHwgc2tiLT5oLnRoLT5zeW4gfHwgc2tiLT5oLnRoLT5maW4pCisJCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KK30KKworLyogQ29sbGFwc2Ugb2ZvIHF1ZXVlLiBBbGdvcml0aG06IHNlbGVjdCBjb250aWd1b3VzIHNlcXVlbmNlIG9mIHNrYnMKKyAqIGFuZCB0Y3BfY29sbGFwc2UoKSB0aGVtIHVudGlsIGFsbCB0aGUgcXVldWUgaXMgY29sbGFwc2VkLgorICovCitzdGF0aWMgdm9pZCB0Y3BfY29sbGFwc2Vfb2ZvX3F1ZXVlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2tiX3BlZWsoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOworCXN0cnVjdCBza19idWZmICpoZWFkOworCXUzMiBzdGFydCwgZW5kOworCisJaWYgKHNrYiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlzdGFydCA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxOworCWVuZCA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKKwloZWFkID0gc2tiOworCisJZm9yICg7OykgeworCQlza2IgPSBza2ItPm5leHQ7CisKKwkJLyogU2VnbWVudCBpcyB0ZXJtaW5hdGVkIHdoZW4gd2Ugc2VlIGdhcCBvciB3aGVuCisJCSAqIHdlIGFyZSBhdCB0aGUgZW5kIG9mIGFsbCB0aGUgcXVldWUuICovCisJCWlmIChza2IgPT0gKHN0cnVjdCBza19idWZmICopJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUgfHwKKwkJICAgIGFmdGVyKFRDUF9TS0JfQ0Ioc2tiKS0+c2VxLCBlbmQpIHx8CisJCSAgICBiZWZvcmUoVENQX1NLQl9DQihza2IpLT5lbmRfc2VxLCBzdGFydCkpIHsKKwkJCXRjcF9jb2xsYXBzZShzaywgaGVhZCwgc2tiLCBzdGFydCwgZW5kKTsKKwkJCWhlYWQgPSBza2I7CisJCQlpZiAoc2tiID09IChzdHJ1Y3Qgc2tfYnVmZiAqKSZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKQorCQkJCWJyZWFrOworCQkJLyogU3RhcnQgbmV3IHNlZ21lbnQgKi8KKwkJCXN0YXJ0ID0gVENQX1NLQl9DQihza2IpLT5zZXE7CisJCQllbmQgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7CisJCX0gZWxzZSB7CisJCQlpZiAoYmVmb3JlKFRDUF9TS0JfQ0Ioc2tiKS0+c2VxLCBzdGFydCkpCisJCQkJc3RhcnQgPSBUQ1BfU0tCX0NCKHNrYiktPnNlcTsKKwkJCWlmIChhZnRlcihUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEsIGVuZCkpCisJCQkJZW5kID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxOworCQl9CisJfQorfQorCisvKiBSZWR1Y2UgYWxsb2NhdGVkIG1lbW9yeSBpZiB3ZSBjYW4sIHRyeWluZyB0byBnZXQKKyAqIHRoZSBzb2NrZXQgd2l0aGluIGl0cyBtZW1vcnkgbGltaXRzIGFnYWluLgorICoKKyAqIFJldHVybiBsZXNzIHRoYW4gemVybyBpZiB3ZSBzaG91bGQgc3RhcnQgZHJvcHBpbmcgZnJhbWVzCisgKiB1bnRpbCB0aGUgc29ja2V0IG93bmluZyBwcm9jZXNzIHJlYWRzIHNvbWUgb2YgdGhlIGRhdGEKKyAqIHRvIHN0YWJpbGl6ZSB0aGUgc2l0dWF0aW9uLgorICovCitzdGF0aWMgaW50IHRjcF9wcnVuZV9xdWV1ZShzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7IAorCisJU09DS19ERUJVRyhzaywgInBydW5lX3F1ZXVlOiBjPSV4XG4iLCB0cC0+Y29waWVkX3NlcSk7CisKKwlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9QUlVORUNBTExFRCk7CisKKwlpZiAoYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSA+PSBzay0+c2tfcmN2YnVmKQorCQl0Y3BfY2xhbXBfd2luZG93KHNrLCB0cCk7CisJZWxzZSBpZiAodGNwX21lbW9yeV9wcmVzc3VyZSkKKwkJdHAtPnJjdl9zc3RocmVzaCA9IG1pbih0cC0+cmN2X3NzdGhyZXNoLCA0VSAqIHRwLT5hZHZtc3MpOworCisJdGNwX2NvbGxhcHNlX29mb19xdWV1ZShzayk7CisJdGNwX2NvbGxhcHNlKHNrLCBzay0+c2tfcmVjZWl2ZV9xdWV1ZS5uZXh0LAorCQkgICAgIChzdHJ1Y3Qgc2tfYnVmZiopJnNrLT5za19yZWNlaXZlX3F1ZXVlLAorCQkgICAgIHRwLT5jb3BpZWRfc2VxLCB0cC0+cmN2X254dCk7CisJc2tfc3RyZWFtX21lbV9yZWNsYWltKHNrKTsKKworCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpIDw9IHNrLT5za19yY3ZidWYpCisJCXJldHVybiAwOworCisJLyogQ29sbGFwc2luZyBkaWQgbm90IGhlbHAsIGRlc3RydWN0aXZlIGFjdGlvbnMgZm9sbG93LgorCSAqIFRoaXMgbXVzdCBub3QgZXZlciBvY2N1ci4gKi8KKworCS8qIEZpcnN0LCBwdXJnZSB0aGUgb3V0X29mX29yZGVyIHF1ZXVlLiAqLworCWlmIChza2JfcXVldWVfbGVuKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkgeworCQlORVRfQUREX1NUQVRTX0JIKExJTlVYX01JQl9PRk9QUlVORUQsIAorCQkJCSBza2JfcXVldWVfbGVuKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSk7CisJCV9fc2tiX3F1ZXVlX3B1cmdlKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKKworCQkvKiBSZXNldCBTQUNLIHN0YXRlLiAgQSBjb25mb3JtaW5nIFNBQ0sgaW1wbGVtZW50YXRpb24gd2lsbAorCQkgKiBkbyB0aGUgc2FtZSBhdCBhIHRpbWVvdXQgYmFzZWQgcmV0cmFuc21pdC4gIFdoZW4gYSBjb25uZWN0aW9uCisJCSAqIGlzIGluIGEgc2FkIHN0YXRlIGxpa2UgdGhpcywgd2UgY2FyZSBvbmx5IGFib3V0IGludGVncml0eQorCQkgKiBvZiB0aGUgY29ubmVjdGlvbiBub3QgcGVyZm9ybWFuY2UuCisJCSAqLworCQlpZiAodHAtPnJ4X29wdC5zYWNrX29rKQorCQkJdGNwX3NhY2tfcmVzZXQoJnRwLT5yeF9vcHQpOworCQlza19zdHJlYW1fbWVtX3JlY2xhaW0oc2spOworCX0KKworCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpIDw9IHNrLT5za19yY3ZidWYpCisJCXJldHVybiAwOworCisJLyogSWYgd2UgYXJlIHJlYWxseSBiZWluZyBhYnVzZWQsIHRlbGwgdGhlIGNhbGxlciB0byBzaWxlbnRseQorCSAqIGRyb3AgcmVjZWl2ZSBkYXRhIG9uIHRoZSBmbG9vci4gIEl0IHdpbGwgZ2V0IHJldHJhbnNtaXR0ZWQKKwkgKiBhbmQgaG9wZWZ1bGx5IHRoZW4gd2UnbGwgaGF2ZSBzdWZmaWNpZW50IHNwYWNlLgorCSAqLworCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1JDVlBSVU5FRCk7CisKKwkvKiBNYXNzaXZlIGJ1ZmZlciBvdmVyY29tbWl0LiAqLworCXRwLT5wcmVkX2ZsYWdzID0gMDsKKwlyZXR1cm4gLTE7Cit9CisKKworLyogUkZDMjg2MSwgc2xvdyBwYXJ0LiBBZGp1c3QgY3duZCwgYWZ0ZXIgaXQgd2FzIG5vdCBmdWxsIGR1cmluZyBvbmUgcnRvLgorICogQXMgYWRkaXRpb25hbCBwcm90ZWN0aW9ucywgd2UgZG8gbm90IHRvdWNoIGN3bmQgaW4gcmV0cmFuc21pc3Npb24gcGhhc2VzLAorICogYW5kIGlmIGFwcGxpY2F0aW9uIGhpdCBpdHMgc25kYnVmIGxpbWl0IHJlY2VudGx5LgorICovCit2b2lkIHRjcF9jd25kX2FwcGxpY2F0aW9uX2xpbWl0ZWQoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJaWYgKHRwLT5jYV9zdGF0ZSA9PSBUQ1BfQ0FfT3BlbiAmJgorCSAgICBzay0+c2tfc29ja2V0ICYmICF0ZXN0X2JpdChTT0NLX05PU1BBQ0UsICZzay0+c2tfc29ja2V0LT5mbGFncykpIHsKKwkJLyogTGltaXRlZCBieSBhcHBsaWNhdGlvbiBvciByZWNlaXZlciB3aW5kb3cuICovCisJCXUzMiB3aW5fdXNlZCA9IG1heCh0cC0+c25kX2N3bmRfdXNlZCwgMlUpOworCQlpZiAod2luX3VzZWQgPCB0cC0+c25kX2N3bmQpIHsKKwkJCXRwLT5zbmRfc3N0aHJlc2ggPSB0Y3BfY3VycmVudF9zc3RocmVzaCh0cCk7CisJCQl0cC0+c25kX2N3bmQgPSAodHAtPnNuZF9jd25kICsgd2luX3VzZWQpID4+IDE7CisJCX0KKwkJdHAtPnNuZF9jd25kX3VzZWQgPSAwOworCX0KKwl0cC0+c25kX2N3bmRfc3RhbXAgPSB0Y3BfdGltZV9zdGFtcDsKK30KKworCisvKiBXaGVuIGluY29taW5nIEFDSyBhbGxvd2VkIHRvIGZyZWUgc29tZSBza2IgZnJvbSB3cml0ZV9xdWV1ZSwKKyAqIHdlIHJlbWVtYmVyIHRoaXMgZXZlbnQgaW4gZmxhZyBTT0NLX1FVRVVFX1NIUlVOSyBhbmQgd2FrZSB1cCBzb2NrZXQKKyAqIG9uIHRoZSBleGl0IGZyb20gdGNwIGlucHV0IGhhbmRsZXIuCisgKgorICogUFJPQkxFTTogc25kYnVmIGV4cGFuc2lvbiBkb2VzIG5vdCB3b3JrIHdlbGwgd2l0aCBsYXJnZXNlbmQuCisgKi8KK3N0YXRpYyB2b2lkIHRjcF9uZXdfc3BhY2Uoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJaWYgKHRwLT5wYWNrZXRzX291dCA8IHRwLT5zbmRfY3duZCAmJgorCSAgICAhKHNrLT5za191c2VybG9ja3MgJiBTT0NLX1NOREJVRl9MT0NLKSAmJgorCSAgICAhdGNwX21lbW9yeV9wcmVzc3VyZSAmJgorCSAgICBhdG9taWNfcmVhZCgmdGNwX21lbW9yeV9hbGxvY2F0ZWQpIDwgc3lzY3RsX3RjcF9tZW1bMF0pIHsKKyAJCWludCBzbmRtZW0gPSBtYXhfdCh1MzIsIHRwLT5yeF9vcHQubXNzX2NsYW1wLCB0cC0+bXNzX2NhY2hlX3N0ZCkgKworCQkJTUFYX1RDUF9IRUFERVIgKyAxNiArIHNpemVvZihzdHJ1Y3Qgc2tfYnVmZiksCisJCSAgICBkZW1hbmRlZCA9IG1heF90KHVuc2lnbmVkIGludCwgdHAtPnNuZF9jd25kLAorCQkJCQkJICAgdHAtPnJlb3JkZXJpbmcgKyAxKTsKKwkJc25kbWVtICo9IDIqZGVtYW5kZWQ7CisJCWlmIChzbmRtZW0gPiBzay0+c2tfc25kYnVmKQorCQkJc2stPnNrX3NuZGJ1ZiA9IG1pbihzbmRtZW0sIHN5c2N0bF90Y3Bfd21lbVsyXSk7CisJCXRwLT5zbmRfY3duZF9zdGFtcCA9IHRjcF90aW1lX3N0YW1wOworCX0KKworCXNrLT5za193cml0ZV9zcGFjZShzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfY2hlY2tfc3BhY2Uoc3RydWN0IHNvY2sgKnNrKQoreworCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfUVVFVUVfU0hSVU5LKSkgeworCQlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfUVVFVUVfU0hSVU5LKTsKKwkJaWYgKHNrLT5za19zb2NrZXQgJiYKKwkJICAgIHRlc3RfYml0KFNPQ0tfTk9TUEFDRSwgJnNrLT5za19zb2NrZXQtPmZsYWdzKSkKKwkJCXRjcF9uZXdfc3BhY2Uoc2spOworCX0KK30KKworc3RhdGljIHZvaWQgX190Y3BfZGF0YV9zbmRfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJaWYgKGFmdGVyKFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSwgdHAtPnNuZF91bmEgKyB0cC0+c25kX3duZCkgfHwKKwkgICAgdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKSA+PSB0cC0+c25kX2N3bmQgfHwKKwkgICAgdGNwX3dyaXRlX3htaXQoc2ssIHRwLT5ub25hZ2xlKSkKKwkJdGNwX2NoZWNrX3Byb2JlX3RpbWVyKHNrLCB0cCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgdGNwX2RhdGFfc25kX2NoZWNrKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2stPnNrX3NlbmRfaGVhZDsKKworCWlmIChza2IgIT0gTlVMTCkKKwkJX190Y3BfZGF0YV9zbmRfY2hlY2soc2ssIHNrYik7CisJdGNwX2NoZWNrX3NwYWNlKHNrKTsKK30KKworLyoKKyAqIENoZWNrIGlmIHNlbmRpbmcgYW4gYWNrIGlzIG5lZWRlZC4KKyAqLworc3RhdGljIHZvaWQgX190Y3BfYWNrX3NuZF9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIGludCBvZm9fcG9zc2libGUpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisKKwkgICAgLyogTW9yZSB0aGFuIG9uZSBmdWxsIGZyYW1lIHJlY2VpdmVkLi4uICovCisJaWYgKCgodHAtPnJjdl9ueHQgLSB0cC0+cmN2X3d1cCkgPiB0cC0+YWNrLnJjdl9tc3MKKwkgICAgIC8qIC4uLiBhbmQgcmlnaHQgZWRnZSBvZiB3aW5kb3cgYWR2YW5jZXMgZmFyIGVub3VnaC4KKwkgICAgICAqICh0Y3BfcmVjdm1zZygpIHdpbGwgc2VuZCBBQ0sgb3RoZXJ3aXNlKS4gT3IuLi4KKwkgICAgICAqLworCSAgICAgJiYgX190Y3Bfc2VsZWN0X3dpbmRvdyhzaykgPj0gdHAtPnJjdl93bmQpIHx8CisJICAgIC8qIFdlIEFDSyBlYWNoIGZyYW1lIG9yLi4uICovCisJICAgIHRjcF9pbl9xdWlja2Fja19tb2RlKHRwKSB8fAorCSAgICAvKiBXZSBoYXZlIG91dCBvZiBvcmRlciBkYXRhLiAqLworCSAgICAob2ZvX3Bvc3NpYmxlICYmCisJICAgICBza2JfcGVlaygmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkpKSB7CisJCS8qIFRoZW4gYWNrIGl0IG5vdyAqLworCQl0Y3Bfc2VuZF9hY2soc2spOworCX0gZWxzZSB7CisJCS8qIEVsc2UsIHNlbmQgZGVsYXllZCBhY2suICovCisJCXRjcF9zZW5kX2RlbGF5ZWRfYWNrKHNrKTsKKwl9Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgdGNwX2Fja19zbmRfY2hlY2soc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCWlmICghdGNwX2Fja19zY2hlZHVsZWQodHApKSB7CisJCS8qIFdlIHNlbnQgYSBkYXRhIHNlZ21lbnQgYWxyZWFkeS4gKi8KKwkJcmV0dXJuOworCX0KKwlfX3RjcF9hY2tfc25kX2NoZWNrKHNrLCAxKTsKK30KKworLyoKKyAqCVRoaXMgcm91dGluZSBpcyBvbmx5IGNhbGxlZCB3aGVuIHdlIGhhdmUgdXJnZW50IGRhdGEKKyAqCXNpZ25hbGxlZC4gSXRzIHRoZSAnc2xvdycgcGFydCBvZiB0Y3BfdXJnLiBJdCBjb3VsZCBiZQorICoJbW92ZWQgaW5saW5lIG5vdyBhcyB0Y3BfdXJnIGlzIG9ubHkgY2FsbGVkIGZyb20gb25lCisgKglwbGFjZS4gV2UgaGFuZGxlIFVSR2VudCBkYXRhIHdyb25nLiBXZSBoYXZlIHRvIC0gYXMKKyAqCUJTRCBzdGlsbCBkb2Vzbid0IHVzZSB0aGUgY29ycmVjdGlvbiBmcm9tIFJGQzk2MS4KKyAqCUZvciAxMDAzLjFnIHdlIHNob3VsZCBzdXBwb3J0IGEgbmV3IG9wdGlvbiBUQ1BfU1REVVJHIHRvIHBlcm1pdAorICoJZWl0aGVyIGZvcm0gKG9yIGp1c3Qgc2V0IHRoZSBzeXNjdGwgdGNwX3N0ZHVyZykuCisgKi8KKyAKK3N0YXRpYyB2b2lkIHRjcF9jaGVja191cmcoc3RydWN0IHNvY2sgKiBzaywgc3RydWN0IHRjcGhkciAqIHRoKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXUzMiBwdHIgPSBudG9ocyh0aC0+dXJnX3B0cik7CisKKwlpZiAocHRyICYmICFzeXNjdGxfdGNwX3N0ZHVyZykKKwkJcHRyLS07CisJcHRyICs9IG50b2hsKHRoLT5zZXEpOworCisJLyogSWdub3JlIHVyZ2VudCBkYXRhIHRoYXQgd2UndmUgYWxyZWFkeSBzZWVuIGFuZCByZWFkLiAqLworCWlmIChhZnRlcih0cC0+Y29waWVkX3NlcSwgcHRyKSkKKwkJcmV0dXJuOworCisJLyogRG8gbm90IHJlcGxheSB1cmcgcHRyLgorCSAqCisJICogTk9URTogaW50ZXJlc3Rpbmcgc2l0dWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHNwZWNzLgorCSAqIE1pc2JlaGF2aW5nIHNlbmRlciBtYXkgc2VuZCB1cmcgcHRyLCBwb2ludGluZyB0byBzZWdtZW50LAorCSAqIHdoaWNoIHdlIGFscmVhZHkgaGF2ZSBpbiBvZm8gcXVldWUuIFdlIGFyZSBub3QgYWJsZSB0byBmZXRjaAorCSAqIHN1Y2ggZGF0YSBhbmQgd2lsbCBzdGF5IGluIFRDUF9VUkdfTk9UWUVUIHVudGlsIHdpbGwgYmUgZWF0ZW4KKwkgKiBieSByZWN2bXNnKCkuIFNlZW1zLCB3ZSBhcmUgbm90IG9ibGlnZWQgdG8gaGFuZGxlIHN1Y2ggd2lja2VkCisJICogc2l0dWF0aW9ucy4gQnV0IGl0IGlzIHdvcnRoIHRvIHRoaW5rIGFib3V0IHBvc3NpYmlsaXR5IG9mIHNvbWUKKwkgKiBEb1NlcyB1c2luZyBzb21lIGh5cG90aGV0aWNhbCBhcHBsaWNhdGlvbiBsZXZlbCBkZWFkbG9jay4KKwkgKi8KKwlpZiAoYmVmb3JlKHB0ciwgdHAtPnJjdl9ueHQpKQorCQlyZXR1cm47CisKKwkvKiBEbyB3ZSBhbHJlYWR5IGhhdmUgYSBuZXdlciAob3IgZHVwbGljYXRlKSB1cmdlbnQgcG9pbnRlcj8gKi8KKwlpZiAodHAtPnVyZ19kYXRhICYmICFhZnRlcihwdHIsIHRwLT51cmdfc2VxKSkKKwkJcmV0dXJuOworCisJLyogVGVsbCB0aGUgd29ybGQgYWJvdXQgb3VyIG5ldyB1cmdlbnQgcG9pbnRlci4gKi8KKwlza19zZW5kX3NpZ3VyZyhzayk7CisKKwkvKiBXZSBtYXkgYmUgYWRkaW5nIHVyZ2VudCBkYXRhIHdoZW4gdGhlIGxhc3QgYnl0ZSByZWFkIHdhcworCSAqIHVyZ2VudC4gVG8gZG8gdGhpcyByZXF1aXJlcyBzb21lIGNhcmUuIFdlIGNhbm5vdCBqdXN0IGlnbm9yZQorCSAqIHRwLT5jb3BpZWRfc2VxIHNpbmNlIHdlIHdvdWxkIHJlYWQgdGhlIGxhc3QgdXJnZW50IGJ5dGUgYWdhaW4KKwkgKiBhcyBkYXRhLCBub3IgY2FuIHdlIGFsdGVyIGNvcGllZF9zZXEgdW50aWwgdGhpcyBkYXRhIGFycml2ZXMKKwkgKiBvciB3ZSBicmVhayB0aGUgc2VtYXRpY3Mgb2YgU0lPQ0FUTUFSSyAoYW5kIHRodXMgc29ja2F0bWFyaygpKQorCSAqCisJICogTk9URS4gRG91YmxlIER1dGNoLiBSZW5kZXJpbmcgdG8gcGxhaW4gRW5nbGlzaDogYXV0aG9yIG9mIGNvbW1lbnQKKwkgKiBhYm92ZSBkaWQgc29tZXRoaW5nIHNvcnQgb2YgCXNlbmQoIkEiLCBNU0dfT09CKTsgc2VuZCgiQiIsIE1TR19PT0IpOworCSAqIGFuZCBleHBlY3QgdGhhdCBib3RoIEEgYW5kIEIgZGlzYXBwZWFyIGZyb20gc3RyZWFtLiBUaGlzIGlzIF93cm9uZ18uCisJICogVGhvdWdoIHRoaXMgaGFwcGVucyBpbiBCU0Qgd2l0aCBoaWdoIHByb2JhYmlsaXR5LCB0aGlzIGlzIG9jY2FzaW9uYWwuCisJICogQW55IGFwcGxpY2F0aW9uIHJlbHlpbmcgb24gdGhpcyBpcyBidWdneS4gTm90ZSBhbHNvLCB0aGF0IGZpeCAid29ya3MiCisJICogb25seSBpbiB0aGlzIGFydGlmaWNpYWwgdGVzdC4gSW5zZXJ0IHNvbWUgbm9ybWFsIGRhdGEgYmV0d2VlbiBBIGFuZCBCIGFuZCB3ZSB3aWxsCisJICogZGVjbGluZSBvZiBCU0QgYWdhaW4uIFZlcmRpY3Q6IGl0IGlzIGJldHRlciB0byByZW1vdmUgdG8gdHJhcAorCSAqIGJ1Z2d5IHVzZXJzLgorCSAqLworCWlmICh0cC0+dXJnX3NlcSA9PSB0cC0+Y29waWVkX3NlcSAmJiB0cC0+dXJnX2RhdGEgJiYKKwkgICAgIXNvY2tfZmxhZyhzaywgU09DS19VUkdJTkxJTkUpICYmCisJICAgIHRwLT5jb3BpZWRfc2VxICE9IHRwLT5yY3Zfbnh0KSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBza2JfcGVlaygmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCQl0cC0+Y29waWVkX3NlcSsrOworCQlpZiAoc2tiICYmICFiZWZvcmUodHAtPmNvcGllZF9zZXEsIFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSkpIHsKKwkJCV9fc2tiX3VubGluayhza2IsIHNrYi0+bGlzdCk7CisJCQlfX2tmcmVlX3NrYihza2IpOworCQl9CisJfQorCisJdHAtPnVyZ19kYXRhICAgPSBUQ1BfVVJHX05PVFlFVDsKKwl0cC0+dXJnX3NlcSAgICA9IHB0cjsKKworCS8qIERpc2FibGUgaGVhZGVyIHByZWRpY3Rpb24uICovCisJdHAtPnByZWRfZmxhZ3MgPSAwOworfQorCisvKiBUaGlzIGlzIHRoZSAnZmFzdCcgcGFydCBvZiB1cmdlbnQgaGFuZGxpbmcuICovCitzdGF0aWMgdm9pZCB0Y3BfdXJnKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjcGhkciAqdGgpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisKKwkvKiBDaGVjayBpZiB3ZSBnZXQgYSBuZXcgdXJnZW50IHBvaW50ZXIgLSBub3JtYWxseSBub3QuICovCisJaWYgKHRoLT51cmcpCisJCXRjcF9jaGVja191cmcoc2ssdGgpOworCisJLyogRG8gd2Ugd2FpdCBmb3IgYW55IHVyZ2VudCBkYXRhPyAtIG5vcm1hbGx5IG5vdC4uLiAqLworCWlmICh0cC0+dXJnX2RhdGEgPT0gVENQX1VSR19OT1RZRVQpIHsKKwkJdTMyIHB0ciA9IHRwLT51cmdfc2VxIC0gbnRvaGwodGgtPnNlcSkgKyAodGgtPmRvZmYgKiA0KSAtCisJCQkgIHRoLT5zeW47CisKKwkJLyogSXMgdGhlIHVyZ2VudCBwb2ludGVyIHBvaW50aW5nIGludG8gdGhpcyBwYWNrZXQ/ICovCSAKKwkJaWYgKHB0ciA8IHNrYi0+bGVuKSB7CisJCQl1OCB0bXA7CisJCQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIHB0ciwgJnRtcCwgMSkpCisJCQkJQlVHKCk7CisJCQl0cC0+dXJnX2RhdGEgPSBUQ1BfVVJHX1ZBTElEIHwgdG1wOworCQkJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCisJCQkJc2stPnNrX2RhdGFfcmVhZHkoc2ssIDApOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHRjcF9jb3B5X3RvX2lvdmVjKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhsZW4pCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJaW50IGNodW5rID0gc2tiLT5sZW4gLSBobGVuOworCWludCBlcnI7CisKKwlsb2NhbF9iaF9lbmFibGUoKTsKKwlpZiAoc2tiLT5pcF9zdW1tZWQ9PUNIRUNLU1VNX1VOTkVDRVNTQVJZKQorCQllcnIgPSBza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhza2IsIGhsZW4sIHRwLT51Y29weS5pb3YsIGNodW5rKTsKKwllbHNlCisJCWVyciA9IHNrYl9jb3B5X2FuZF9jc3VtX2RhdGFncmFtX2lvdmVjKHNrYiwgaGxlbiwKKwkJCQkJCSAgICAgICB0cC0+dWNvcHkuaW92KTsKKworCWlmICghZXJyKSB7CisJCXRwLT51Y29weS5sZW4gLT0gY2h1bms7CisJCXRwLT5jb3BpZWRfc2VxICs9IGNodW5rOworCQl0Y3BfcmN2X3NwYWNlX2FkanVzdChzayk7CisJfQorCisJbG9jYWxfYmhfZGlzYWJsZSgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX190Y3BfY2hlY2tzdW1fY29tcGxldGVfdXNlcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHJlc3VsdDsKKworCWlmIChzb2NrX293bmVkX2J5X3VzZXIoc2spKSB7CisJCWxvY2FsX2JoX2VuYWJsZSgpOworCQlyZXN1bHQgPSBfX3RjcF9jaGVja3N1bV9jb21wbGV0ZShza2IpOworCQlsb2NhbF9iaF9kaXNhYmxlKCk7CisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gX190Y3BfY2hlY2tzdW1fY29tcGxldGUoc2tiKTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50Cit0Y3BfY2hlY2tzdW1fY29tcGxldGVfdXNlcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1VOTkVDRVNTQVJZICYmCisJCV9fdGNwX2NoZWNrc3VtX2NvbXBsZXRlX3VzZXIoc2ssIHNrYik7Cit9CisKKy8qCisgKglUQ1AgcmVjZWl2ZSBmdW5jdGlvbiBmb3IgdGhlIEVTVEFCTElTSEVEIHN0YXRlLiAKKyAqCisgKglJdCBpcyBzcGxpdCBpbnRvIGEgZmFzdCBwYXRoIGFuZCBhIHNsb3cgcGF0aC4gVGhlIGZhc3QgcGF0aCBpcyAKKyAqIAlkaXNhYmxlZCB3aGVuOgorICoJLSBBIHplcm8gd2luZG93IHdhcyBhbm5vdW5jZWQgZnJvbSB1cyAtIHplcm8gd2luZG93IHByb2JpbmcKKyAqICAgICAgICBpcyBvbmx5IGhhbmRsZWQgcHJvcGVybHkgaW4gdGhlIHNsb3cgcGF0aC4gCisgKgktIE91dCBvZiBvcmRlciBzZWdtZW50cyBhcnJpdmVkLgorICoJLSBVcmdlbnQgZGF0YSBpcyBleHBlY3RlZC4KKyAqCS0gVGhlcmUgaXMgbm8gYnVmZmVyIHNwYWNlIGxlZnQKKyAqCS0gVW5leHBlY3RlZCBUQ1AgZmxhZ3Mvd2luZG93IHZhbHVlcy9oZWFkZXIgbGVuZ3RocyBhcmUgcmVjZWl2ZWQKKyAqCSAgKGRldGVjdGVkIGJ5IGNoZWNraW5nIHRoZSBUQ1AgaGVhZGVyIGFnYWluc3QgcHJlZF9mbGFncykgCisgKgktIERhdGEgaXMgc2VudCBpbiBib3RoIGRpcmVjdGlvbnMuIEZhc3QgcGF0aCBvbmx5IHN1cHBvcnRzIHB1cmUgc2VuZGVycworICoJICBvciBwdXJlIHJlY2VpdmVycyAodGhpcyBtZWFucyBlaXRoZXIgdGhlIHNlcXVlbmNlIG51bWJlciBvciB0aGUgYWNrCisgKgkgIHZhbHVlIG11c3Qgc3RheSBjb25zdGFudCkKKyAqCS0gVW5leHBlY3RlZCBUQ1Agb3B0aW9uLgorICoKKyAqCVdoZW4gdGhlc2UgY29uZGl0aW9ucyBhcmUgbm90IHNhdGlzZmllZCBpdCBkcm9wcyBpbnRvIGEgc3RhbmRhcmQgCisgKglyZWNlaXZlIHByb2NlZHVyZSBwYXR0ZXJuZWQgYWZ0ZXIgUkZDNzkzIHRvIGhhbmRsZSBhbGwgY2FzZXMuCisgKglUaGUgZmlyc3QgdGhyZWUgY2FzZXMgYXJlIGd1YXJhbnRlZWQgYnkgcHJvcGVyIHByZWRfZmxhZ3Mgc2V0dGluZywKKyAqCXRoZSByZXN0IGlzIGNoZWNrZWQgaW5saW5lLiBGYXN0IHByb2Nlc3NpbmcgaXMgdHVybmVkIG9uIGluIAorICoJdGNwX2RhdGFfcXVldWUgd2hlbiBldmVyeXRoaW5nIGlzIE9LLgorICovCitpbnQgdGNwX3Jjdl9lc3RhYmxpc2hlZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgdGNwaGRyICp0aCwgdW5zaWduZWQgbGVuKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJLyoKKwkgKglIZWFkZXIgcHJlZGljdGlvbi4KKwkgKglUaGUgY29kZSBsb29zZWx5IGZvbGxvd3MgdGhlIG9uZSBpbiB0aGUgZmFtb3VzIAorCSAqCSIzMCBpbnN0cnVjdGlvbiBUQ1AgcmVjZWl2ZSIgVmFuIEphY29ic29uIG1haWwuCisJICoJCisJICoJVmFuJ3MgdHJpY2sgaXMgdG8gZGVwb3NpdCBidWZmZXJzIGludG8gc29ja2V0IHF1ZXVlIAorCSAqCW9uIGEgZGV2aWNlIGludGVycnVwdCwgdG8gY2FsbCB0Y3BfcmVjdiBmdW5jdGlvbgorCSAqCW9uIHRoZSByZWNlaXZlIHByb2Nlc3MgY29udGV4dCBhbmQgY2hlY2tzdW0gYW5kIGNvcHkKKwkgKgl0aGUgYnVmZmVyIHRvIHVzZXIgc3BhY2UuIHNtYXJ0Li4uCisJICoKKwkgKglPdXIgY3VycmVudCBzY2hlbWUgaXMgbm90IHNpbGx5IGVpdGhlciBidXQgd2UgdGFrZSB0aGUgCisJICoJZXh0cmEgY29zdCBvZiB0aGUgbmV0X2JoIHNvZnQgaW50ZXJydXB0IHByb2Nlc3NpbmcuLi4KKwkgKglXZSBkbyBjaGVja3N1bSBhbmQgY29weSBhbHNvIGJ1dCBmcm9tIGRldmljZSB0byBrZXJuZWwuCisJICovCisKKwl0cC0+cnhfb3B0LnNhd190c3RhbXAgPSAwOworCisJLyoJcHJlZF9mbGFncyBpcyAweFM/MTAgPDwgMTYgKyBzbmRfd25kCisJICoJaWYgaGVhZGVyX3ByZWRpdGlvbiBpcyB0byBiZSBtYWRlCisJICoJJ1MnIHdpbGwgYWx3YXlzIGJlIHRwLT50Y3BfaGVhZGVyX2xlbiA+PiAyCisJICoJJz8nIHdpbGwgYmUgMCBmb3IgdGhlIGZhc3QgcGF0aCwgb3RoZXJ3aXNlIHByZWRfZmxhZ3MgaXMgMCB0bworCSAqICB0dXJuIGl0IG9mZgkod2hlbiB0aGVyZSBhcmUgaG9sZXMgaW4gdGhlIHJlY2VpdmUgCisJICoJIHNwYWNlIGZvciBpbnN0YW5jZSkKKwkgKglQU0ggZmxhZyBpcyBpZ25vcmVkLgorCSAqLworCisJaWYgKCh0Y3BfZmxhZ193b3JkKHRoKSAmIFRDUF9IUF9CSVRTKSA9PSB0cC0+cHJlZF9mbGFncyAmJgorCQlUQ1BfU0tCX0NCKHNrYiktPnNlcSA9PSB0cC0+cmN2X254dCkgeworCQlpbnQgdGNwX2hlYWRlcl9sZW4gPSB0cC0+dGNwX2hlYWRlcl9sZW47CisKKwkJLyogVGltZXN0YW1wIGhlYWRlciBwcmVkaWN0aW9uOiB0Y3BfaGVhZGVyX2xlbgorCQkgKiBpcyBhdXRvbWF0aWNhbGx5IGVxdWFsIHRvIHRoLT5kb2ZmKjQgZHVlIHRvIHByZWRfZmxhZ3MKKwkJICogbWF0Y2guCisJCSAqLworCisJCS8qIENoZWNrIHRpbWVzdGFtcCAqLworCQlpZiAodGNwX2hlYWRlcl9sZW4gPT0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpICsgVENQT0xFTl9UU1RBTVBfQUxJR05FRCkgeworCQkJX191MzIgKnB0ciA9IChfX3UzMiAqKSh0aCArIDEpOworCisJCQkvKiBObz8gU2xvdyBwYXRoISAqLworCQkJaWYgKCpwdHIgIT0gbnRvaGwoKFRDUE9QVF9OT1AgPDwgMjQpIHwgKFRDUE9QVF9OT1AgPDwgMTYpCisJCQkJCSAgfCAoVENQT1BUX1RJTUVTVEFNUCA8PCA4KSB8IFRDUE9MRU5fVElNRVNUQU1QKSkKKwkJCQlnb3RvIHNsb3dfcGF0aDsKKworCQkJdHAtPnJ4X29wdC5zYXdfdHN0YW1wID0gMTsKKwkJCSsrcHRyOyAKKwkJCXRwLT5yeF9vcHQucmN2X3RzdmFsID0gbnRvaGwoKnB0cik7CisJCQkrK3B0cjsKKwkJCXRwLT5yeF9vcHQucmN2X3RzZWNyID0gbnRvaGwoKnB0cik7CisKKwkJCS8qIElmIFBBV1MgZmFpbGVkLCBjaGVjayBpdCBtb3JlIGNhcmVmdWxseSBpbiBzbG93IHBhdGggKi8KKwkJCWlmICgoczMyKSh0cC0+cnhfb3B0LnJjdl90c3ZhbCAtIHRwLT5yeF9vcHQudHNfcmVjZW50KSA8IDApCisJCQkJZ290byBzbG93X3BhdGg7CisKKwkJCS8qIERPIE5PVCB1cGRhdGUgdHNfcmVjZW50IGhlcmUsIGlmIGNoZWNrc3VtIGZhaWxzCisJCQkgKiBhbmQgdGltZXN0YW1wIHdhcyBjb3JydXB0ZWQgcGFydCwgaXQgd2lsbCByZXN1bHQKKwkJCSAqIGluIGEgaHVuZyBjb25uZWN0aW9uIHNpbmNlIHdlIHdpbGwgZHJvcCBhbGwKKwkJCSAqIGZ1dHVyZSBwYWNrZXRzIGR1ZSB0byB0aGUgUEFXUyB0ZXN0LgorCQkJICovCisJCX0KKworCQlpZiAobGVuIDw9IHRjcF9oZWFkZXJfbGVuKSB7CisJCQkvKiBCdWxrIGRhdGEgdHJhbnNmZXI6IHNlbmRlciAqLworCQkJaWYgKGxlbiA9PSB0Y3BfaGVhZGVyX2xlbikgeworCQkJCS8qIFByZWRpY3RlZCBwYWNrZXQgaXMgaW4gd2luZG93IGJ5IGRlZmluaXRpb24uCisJCQkJICogc2VxID09IHJjdl9ueHQgYW5kIHJjdl93dXAgPD0gcmN2X254dC4KKwkJCQkgKiBIZW5jZSwgY2hlY2sgc2VxPD1yY3Zfd3VwIHJlZHVjZXMgdG86CisJCQkJICovCisJCQkJaWYgKHRjcF9oZWFkZXJfbGVuID09CisJCQkJICAgIChzaXplb2Yoc3RydWN0IHRjcGhkcikgKyBUQ1BPTEVOX1RTVEFNUF9BTElHTkVEKSAmJgorCQkJCSAgICB0cC0+cmN2X254dCA9PSB0cC0+cmN2X3d1cCkKKwkJCQkJdGNwX3N0b3JlX3RzX3JlY2VudCh0cCk7CisKKwkJCQl0Y3BfcmN2X3J0dF9tZWFzdXJlX3RzKHRwLCBza2IpOworCisJCQkJLyogV2Uga25vdyB0aGF0IHN1Y2ggcGFja2V0cyBhcmUgY2hlY2tzdW1tZWQKKwkJCQkgKiBvbiBlbnRyeS4KKwkJCQkgKi8KKwkJCQl0Y3BfYWNrKHNrLCBza2IsIDApOworCQkJCV9fa2ZyZWVfc2tiKHNrYik7IAorCQkJCXRjcF9kYXRhX3NuZF9jaGVjayhzayk7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgeyAvKiBIZWFkZXIgdG9vIHNtYWxsICovCisJCQkJVENQX0lOQ19TVEFUU19CSChUQ1BfTUlCX0lORVJSUyk7CisJCQkJZ290byBkaXNjYXJkOworCQkJfQorCQl9IGVsc2UgeworCQkJaW50IGVhdGVuID0gMDsKKworCQkJaWYgKHRwLT51Y29weS50YXNrID09IGN1cnJlbnQgJiYKKwkJCSAgICB0cC0+Y29waWVkX3NlcSA9PSB0cC0+cmN2X254dCAmJgorCQkJICAgIGxlbiAtIHRjcF9oZWFkZXJfbGVuIDw9IHRwLT51Y29weS5sZW4gJiYKKwkJCSAgICBzb2NrX293bmVkX2J5X3VzZXIoc2spKSB7CisJCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCisJCQkJaWYgKCF0Y3BfY29weV90b19pb3ZlYyhzaywgc2tiLCB0Y3BfaGVhZGVyX2xlbikpIHsKKwkJCQkJLyogUHJlZGljdGVkIHBhY2tldCBpcyBpbiB3aW5kb3cgYnkgZGVmaW5pdGlvbi4KKwkJCQkJICogc2VxID09IHJjdl9ueHQgYW5kIHJjdl93dXAgPD0gcmN2X254dC4KKwkJCQkJICogSGVuY2UsIGNoZWNrIHNlcTw9cmN2X3d1cCByZWR1Y2VzIHRvOgorCQkJCQkgKi8KKwkJCQkJaWYgKHRjcF9oZWFkZXJfbGVuID09CisJCQkJCSAgICAoc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpICsKKwkJCQkJICAgICBUQ1BPTEVOX1RTVEFNUF9BTElHTkVEKSAmJgorCQkJCQkgICAgdHAtPnJjdl9ueHQgPT0gdHAtPnJjdl93dXApCisJCQkJCQl0Y3Bfc3RvcmVfdHNfcmVjZW50KHRwKTsKKworCQkJCQl0Y3BfcmN2X3J0dF9tZWFzdXJlX3RzKHRwLCBza2IpOworCisJCQkJCV9fc2tiX3B1bGwoc2tiLCB0Y3BfaGVhZGVyX2xlbik7CisJCQkJCXRwLT5yY3Zfbnh0ID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxOworCQkJCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BIUEhJVFNUT1VTRVIpOworCQkJCQllYXRlbiA9IDE7CisJCQkJfQorCQkJfQorCQkJaWYgKCFlYXRlbikgeworCQkJCWlmICh0Y3BfY2hlY2tzdW1fY29tcGxldGVfdXNlcihzaywgc2tiKSkKKwkJCQkJZ290byBjc3VtX2Vycm9yOworCisJCQkJLyogUHJlZGljdGVkIHBhY2tldCBpcyBpbiB3aW5kb3cgYnkgZGVmaW5pdGlvbi4KKwkJCQkgKiBzZXEgPT0gcmN2X254dCBhbmQgcmN2X3d1cCA8PSByY3Zfbnh0LgorCQkJCSAqIEhlbmNlLCBjaGVjayBzZXE8PXJjdl93dXAgcmVkdWNlcyB0bzoKKwkJCQkgKi8KKwkJCQlpZiAodGNwX2hlYWRlcl9sZW4gPT0KKwkJCQkgICAgKHNpemVvZihzdHJ1Y3QgdGNwaGRyKSArIFRDUE9MRU5fVFNUQU1QX0FMSUdORUQpICYmCisJCQkJICAgIHRwLT5yY3Zfbnh0ID09IHRwLT5yY3Zfd3VwKQorCQkJCQl0Y3Bfc3RvcmVfdHNfcmVjZW50KHRwKTsKKworCQkJCXRjcF9yY3ZfcnR0X21lYXN1cmVfdHModHAsIHNrYik7CisKKwkJCQlpZiAoKGludClza2ItPnRydWVzaXplID4gc2stPnNrX2ZvcndhcmRfYWxsb2MpCisJCQkJCWdvdG8gc3RlcDU7CisKKwkJCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BIUEhJVFMpOworCisJCQkJLyogQnVsayBkYXRhIHRyYW5zZmVyOiByZWNlaXZlciAqLworCQkJCV9fc2tiX3B1bGwoc2tiLHRjcF9oZWFkZXJfbGVuKTsKKwkJCQlfX3NrYl9xdWV1ZV90YWlsKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKKwkJCQlza19zdHJlYW1fc2V0X293bmVyX3Ioc2tiLCBzayk7CisJCQkJdHAtPnJjdl9ueHQgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7CisJCQl9CisKKwkJCXRjcF9ldmVudF9kYXRhX3JlY3Yoc2ssIHRwLCBza2IpOworCisJCQlpZiAoVENQX1NLQl9DQihza2IpLT5hY2tfc2VxICE9IHRwLT5zbmRfdW5hKSB7CisJCQkJLyogV2VsbCwgb25seSBvbmUgc21hbGwganVtcGxldCBpbiBmYXN0IHBhdGguLi4gKi8KKwkJCQl0Y3BfYWNrKHNrLCBza2IsIEZMQUdfREFUQSk7CisJCQkJdGNwX2RhdGFfc25kX2NoZWNrKHNrKTsKKwkJCQlpZiAoIXRjcF9hY2tfc2NoZWR1bGVkKHRwKSkKKwkJCQkJZ290byBub19hY2s7CisJCQl9CisKKwkJCWlmIChlYXRlbikgeworCQkJCWlmICh0Y3BfaW5fcXVpY2thY2tfbW9kZSh0cCkpIHsKKwkJCQkJdGNwX3NlbmRfYWNrKHNrKTsKKwkJCQl9IGVsc2UgeworCQkJCQl0Y3Bfc2VuZF9kZWxheWVkX2Fjayhzayk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlfX3RjcF9hY2tfc25kX2NoZWNrKHNrLCAwKTsKKwkJCX0KKworbm9fYWNrOgorCQkJaWYgKGVhdGVuKQorCQkJCV9fa2ZyZWVfc2tiKHNrYik7CisJCQllbHNlCisJCQkJc2stPnNrX2RhdGFfcmVhZHkoc2ssIDApOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKK3Nsb3dfcGF0aDoKKwlpZiAobGVuIDwgKHRoLT5kb2ZmPDwyKSB8fCB0Y3BfY2hlY2tzdW1fY29tcGxldGVfdXNlcihzaywgc2tiKSkKKwkJZ290byBjc3VtX2Vycm9yOworCisJLyoKKwkgKiBSRkMxMzIzOiBIMS4gQXBwbHkgUEFXUyBjaGVjayBmaXJzdC4KKwkgKi8KKwlpZiAodGNwX2Zhc3RfcGFyc2Vfb3B0aW9ucyhza2IsIHRoLCB0cCkgJiYgdHAtPnJ4X29wdC5zYXdfdHN0YW1wICYmCisJICAgIHRjcF9wYXdzX2Rpc2NhcmQodHAsIHNrYikpIHsKKwkJaWYgKCF0aC0+cnN0KSB7CisJCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9QQVdTRVNUQUJSRUpFQ1RFRCk7CisJCQl0Y3Bfc2VuZF9kdXBhY2soc2ssIHNrYik7CisJCQlnb3RvIGRpc2NhcmQ7CisJCX0KKwkJLyogUmVzZXRzIGFyZSBhY2NlcHRlZCBldmVuIGlmIFBBV1MgZmFpbGVkLgorCisJCSAgIHRzX3JlY2VudCB1cGRhdGUgbXVzdCBiZSBtYWRlIGFmdGVyIHdlIGFyZSBzdXJlCisJCSAgIHRoYXQgdGhlIHBhY2tldCBpcyBpbiB3aW5kb3cuCisJCSAqLworCX0KKworCS8qCisJICoJU3RhbmRhcmQgc2xvdyBwYXRoLgorCSAqLworCisJaWYgKCF0Y3Bfc2VxdWVuY2UodHAsIFRDUF9TS0JfQ0Ioc2tiKS0+c2VxLCBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEpKSB7CisJCS8qIFJGQzc5MywgcGFnZSAzNzogIkluIGFsbCBzdGF0ZXMgZXhjZXB0IFNZTi1TRU5ULCBhbGwgcmVzZXQKKwkJICogKFJTVCkgc2VnbWVudHMgYXJlIHZhbGlkYXRlZCBieSBjaGVja2luZyB0aGVpciBTRVEtZmllbGRzLiIKKwkJICogQW5kIHBhZ2UgNjk6ICJJZiBhbiBpbmNvbWluZyBzZWdtZW50IGlzIG5vdCBhY2NlcHRhYmxlLAorCQkgKiBhbiBhY2tub3dsZWRnbWVudCBzaG91bGQgYmUgc2VudCBpbiByZXBseSAodW5sZXNzIHRoZSBSU1QgYml0CisJCSAqIGlzIHNldCwgaWYgc28gZHJvcCB0aGUgc2VnbWVudCBhbmQgcmV0dXJuKSIuCisJCSAqLworCQlpZiAoIXRoLT5yc3QpCisJCQl0Y3Bfc2VuZF9kdXBhY2soc2ssIHNrYik7CisJCWdvdG8gZGlzY2FyZDsKKwl9CisKKwlpZih0aC0+cnN0KSB7CisJCXRjcF9yZXNldChzayk7CisJCWdvdG8gZGlzY2FyZDsKKwl9CisKKwl0Y3BfcmVwbGFjZV90c19yZWNlbnQodHAsIFRDUF9TS0JfQ0Ioc2tiKS0+c2VxKTsKKworCWlmICh0aC0+c3luICYmICFiZWZvcmUoVENQX1NLQl9DQihza2IpLT5zZXEsIHRwLT5yY3Zfbnh0KSkgeworCQlUQ1BfSU5DX1NUQVRTX0JIKFRDUF9NSUJfSU5FUlJTKTsKKwkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfVENQQUJPUlRPTlNZTik7CisJCXRjcF9yZXNldChzayk7CisJCXJldHVybiAxOworCX0KKworc3RlcDU6CisJaWYodGgtPmFjaykKKwkJdGNwX2Fjayhzaywgc2tiLCBGTEFHX1NMT1dQQVRIKTsKKworCXRjcF9yY3ZfcnR0X21lYXN1cmVfdHModHAsIHNrYik7CisKKwkvKiBQcm9jZXNzIHVyZ2VudCBkYXRhLiAqLworCXRjcF91cmcoc2ssIHNrYiwgdGgpOworCisJLyogc3RlcCA3OiBwcm9jZXNzIHRoZSBzZWdtZW50IHRleHQgKi8KKwl0Y3BfZGF0YV9xdWV1ZShzaywgc2tiKTsKKworCXRjcF9kYXRhX3NuZF9jaGVjayhzayk7CisJdGNwX2Fja19zbmRfY2hlY2soc2spOworCXJldHVybiAwOworCitjc3VtX2Vycm9yOgorCVRDUF9JTkNfU1RBVFNfQkgoVENQX01JQl9JTkVSUlMpOworCitkaXNjYXJkOgorCV9fa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGNwX3Jjdl9zeW5zZW50X3N0YXRlX3Byb2Nlc3Moc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgc3RydWN0IHRjcGhkciAqdGgsIHVuc2lnbmVkIGxlbikKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlpbnQgc2F2ZWRfY2xhbXAgPSB0cC0+cnhfb3B0Lm1zc19jbGFtcDsKKworCXRjcF9wYXJzZV9vcHRpb25zKHNrYiwgJnRwLT5yeF9vcHQsIDApOworCisJaWYgKHRoLT5hY2spIHsKKwkJLyogcmZjNzkzOgorCQkgKiAiSWYgdGhlIHN0YXRlIGlzIFNZTi1TRU5UIHRoZW4KKwkJICogICAgZmlyc3QgY2hlY2sgdGhlIEFDSyBiaXQKKwkJICogICAgICBJZiB0aGUgQUNLIGJpdCBpcyBzZXQKKwkJICoJICBJZiBTRUcuQUNLID08IElTUywgb3IgU0VHLkFDSyA+IFNORC5OWFQsIHNlbmQKKwkJICogICAgICAgIGEgcmVzZXQgKHVubGVzcyB0aGUgUlNUIGJpdCBpcyBzZXQsIGlmIHNvIGRyb3AKKwkJICogICAgICAgIHRoZSBzZWdtZW50IGFuZCByZXR1cm4pIgorCQkgKgorCQkgKiAgV2UgZG8gbm90IHNlbmQgZGF0YSB3aXRoIFNZTiwgc28gdGhhdCBSRkMtY29ycmVjdAorCQkgKiAgdGVzdCByZWR1Y2VzIHRvOgorCQkgKi8KKwkJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+YWNrX3NlcSAhPSB0cC0+c25kX254dCkKKwkJCWdvdG8gcmVzZXRfYW5kX3VuZG87CisKKwkJaWYgKHRwLT5yeF9vcHQuc2F3X3RzdGFtcCAmJiB0cC0+cnhfb3B0LnJjdl90c2VjciAmJgorCQkgICAgIWJldHdlZW4odHAtPnJ4X29wdC5yY3ZfdHNlY3IsIHRwLT5yZXRyYW5zX3N0YW1wLAorCQkJICAgICB0Y3BfdGltZV9zdGFtcCkpIHsKKwkJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1BBV1NBQ1RJVkVSRUpFQ1RFRCk7CisJCQlnb3RvIHJlc2V0X2FuZF91bmRvOworCQl9CisKKwkJLyogTm93IEFDSyBpcyBhY2NlcHRhYmxlLgorCQkgKgorCQkgKiAiSWYgdGhlIFJTVCBiaXQgaXMgc2V0CisJCSAqICAgIElmIHRoZSBBQ0sgd2FzIGFjY2VwdGFibGUgdGhlbiBzaWduYWwgdGhlIHVzZXIgImVycm9yOgorCQkgKiAgICBjb25uZWN0aW9uIHJlc2V0IiwgZHJvcCB0aGUgc2VnbWVudCwgZW50ZXIgQ0xPU0VEIHN0YXRlLAorCQkgKiAgICBkZWxldGUgVENCLCBhbmQgcmV0dXJuLiIKKwkJICovCisKKwkJaWYgKHRoLT5yc3QpIHsKKwkJCXRjcF9yZXNldChzayk7CisJCQlnb3RvIGRpc2NhcmQ7CisJCX0KKworCQkvKiByZmM3OTM6CisJCSAqICAgImZpZnRoLCBpZiBuZWl0aGVyIG9mIHRoZSBTWU4gb3IgUlNUIGJpdHMgaXMgc2V0IHRoZW4KKwkJICogICAgZHJvcCB0aGUgc2VnbWVudCBhbmQgcmV0dXJuLiIKKwkJICoKKwkJICogICAgU2VlIG5vdGUgYmVsb3chCisJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tQU5LKDk5MDUxMykKKwkJICovCisJCWlmICghdGgtPnN5bikKKwkJCWdvdG8gZGlzY2FyZF9hbmRfdW5kbzsKKworCQkvKiByZmM3OTM6CisJCSAqICAgIklmIHRoZSBTWU4gYml0IGlzIG9uIC4uLgorCQkgKiAgICBhcmUgYWNjZXB0YWJsZSB0aGVuIC4uLgorCQkgKiAgICAob3VyIFNZTiBoYXMgYmVlbiBBQ0tlZCksIGNoYW5nZSB0aGUgY29ubmVjdGlvbgorCQkgKiAgICBzdGF0ZSB0byBFU1RBQkxJU0hFRC4uLiIKKwkJICovCisKKwkJVENQX0VDTl9yY3Zfc3luYWNrKHRwLCB0aCk7CisJCWlmICh0cC0+ZWNuX2ZsYWdzJlRDUF9FQ05fT0spCisJCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX05PX0xBUkdFU0VORCk7CisKKwkJdHAtPnNuZF93bDEgPSBUQ1BfU0tCX0NCKHNrYiktPnNlcTsKKwkJdGNwX2Fjayhzaywgc2tiLCBGTEFHX1NMT1dQQVRIKTsKKworCQkvKiBPay4uIGl0J3MgZ29vZC4gU2V0IHVwIHNlcXVlbmNlIG51bWJlcnMgYW5kCisJCSAqIG1vdmUgdG8gZXN0YWJsaXNoZWQuCisJCSAqLworCQl0cC0+cmN2X254dCA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxICsgMTsKKwkJdHAtPnJjdl93dXAgPSBUQ1BfU0tCX0NCKHNrYiktPnNlcSArIDE7CisKKwkJLyogUkZDMTMyMzogVGhlIHdpbmRvdyBpbiBTWU4gJiBTWU4vQUNLIHNlZ21lbnRzIGlzCisJCSAqIG5ldmVyIHNjYWxlZC4KKwkJICovCisJCXRwLT5zbmRfd25kID0gbnRvaHModGgtPndpbmRvdyk7CisJCXRjcF9pbml0X3dsKHRwLCBUQ1BfU0tCX0NCKHNrYiktPmFja19zZXEsIFRDUF9TS0JfQ0Ioc2tiKS0+c2VxKTsKKworCQlpZiAoIXRwLT5yeF9vcHQud3NjYWxlX29rKSB7CisJCQl0cC0+cnhfb3B0LnNuZF93c2NhbGUgPSB0cC0+cnhfb3B0LnJjdl93c2NhbGUgPSAwOworCQkJdHAtPndpbmRvd19jbGFtcCA9IG1pbih0cC0+d2luZG93X2NsYW1wLCA2NTUzNVUpOworCQl9CisKKwkJaWYgKHRwLT5yeF9vcHQuc2F3X3RzdGFtcCkgeworCQkJdHAtPnJ4X29wdC50c3RhbXBfb2sJICAgPSAxOworCQkJdHAtPnRjcF9oZWFkZXJfbGVuID0KKwkJCQlzaXplb2Yoc3RydWN0IHRjcGhkcikgKyBUQ1BPTEVOX1RTVEFNUF9BTElHTkVEOworCQkJdHAtPmFkdm1zcwkgICAgLT0gVENQT0xFTl9UU1RBTVBfQUxJR05FRDsKKwkJCXRjcF9zdG9yZV90c19yZWNlbnQodHApOworCQl9IGVsc2UgeworCQkJdHAtPnRjcF9oZWFkZXJfbGVuID0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOworCQl9CisKKwkJaWYgKHRwLT5yeF9vcHQuc2Fja19vayAmJiBzeXNjdGxfdGNwX2ZhY2spCisJCQl0cC0+cnhfb3B0LnNhY2tfb2sgfD0gMjsKKworCQl0Y3Bfc3luY19tc3Moc2ssIHRwLT5wbXR1X2Nvb2tpZSk7CisJCXRjcF9pbml0aWFsaXplX3Jjdl9tc3Moc2spOworCisJCS8qIFJlbWVtYmVyLCB0Y3BfcG9sbCgpIGRvZXMgbm90IGxvY2sgc29ja2V0IQorCQkgKiBDaGFuZ2Ugc3RhdGUgZnJvbSBTWU4tU0VOVCBvbmx5IGFmdGVyIGNvcGllZF9zZXEKKwkJICogaXMgaW5pdGlhbGl6ZWQuICovCisJCXRwLT5jb3BpZWRfc2VxID0gdHAtPnJjdl9ueHQ7CisJCW1iKCk7CisJCXRjcF9zZXRfc3RhdGUoc2ssIFRDUF9FU1RBQkxJU0hFRCk7CisKKwkJLyogTWFrZSBzdXJlIHNvY2tldCBpcyByb3V0ZWQsIGZvciBjb3JyZWN0IG1ldHJpY3MuICAqLworCQl0cC0+YWZfc3BlY2lmaWMtPnJlYnVpbGRfaGVhZGVyKHNrKTsKKworCQl0Y3BfaW5pdF9tZXRyaWNzKHNrKTsKKworCQkvKiBQcmV2ZW50IHNwdXJpb3VzIHRjcF9jd25kX3Jlc3RhcnQoKSBvbiBmaXJzdCBkYXRhCisJCSAqIHBhY2tldC4KKwkJICovCisJCXRwLT5sc25kdGltZSA9IHRjcF90aW1lX3N0YW1wOworCisJCXRjcF9pbml0X2J1ZmZlcl9zcGFjZShzayk7CisKKwkJaWYgKHNvY2tfZmxhZyhzaywgU09DS19LRUVQT1BFTikpCisJCQl0Y3BfcmVzZXRfa2VlcGFsaXZlX3RpbWVyKHNrLCBrZWVwYWxpdmVfdGltZV93aGVuKHRwKSk7CisKKwkJaWYgKCF0cC0+cnhfb3B0LnNuZF93c2NhbGUpCisJCQlfX3RjcF9mYXN0X3BhdGhfb24odHAsIHRwLT5zbmRfd25kKTsKKwkJZWxzZQorCQkJdHAtPnByZWRfZmxhZ3MgPSAwOworCisJCWlmICghc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKSB7CisJCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKKwkJCXNrX3dha2VfYXN5bmMoc2ssIDAsIFBPTExfT1VUKTsKKwkJfQorCisJCWlmIChzay0+c2tfd3JpdGVfcGVuZGluZyB8fCB0cC0+ZGVmZXJfYWNjZXB0IHx8IHRwLT5hY2sucGluZ3BvbmcpIHsKKwkJCS8qIFNhdmUgb25lIEFDSy4gRGF0YSB3aWxsIGJlIHJlYWR5IGFmdGVyCisJCQkgKiBzZXZlcmFsIHRpY2tzLCBpZiB3cml0ZV9wZW5kaW5nIGlzIHNldC4KKwkJCSAqCisJCQkgKiBJdCBtYXkgYmUgZGVsZXRlZCwgYnV0IHdpdGggdGhpcyBmZWF0dXJlIHRjcGR1bXBzCisJCQkgKiBsb29rIHNvIF93b25kZXJmdWxseV8gY2xldmVyLCB0aGF0IEkgd2FzIG5vdCBhYmxlCisJCQkgKiB0byBzdGFuZCBhZ2FpbnN0IHRoZSB0ZW1wdGF0aW9uIDgpICAgICAtLUFOSworCQkJICovCisJCQl0Y3Bfc2NoZWR1bGVfYWNrKHRwKTsKKwkJCXRwLT5hY2subHJjdnRpbWUgPSB0Y3BfdGltZV9zdGFtcDsKKwkJCXRwLT5hY2suYXRvCSA9IFRDUF9BVE9fTUlOOworCQkJdGNwX2luY3JfcXVpY2thY2sodHApOworCQkJdGNwX2VudGVyX3F1aWNrYWNrX21vZGUodHApOworCQkJdGNwX3Jlc2V0X3htaXRfdGltZXIoc2ssIFRDUF9USU1FX0RBQ0ssIFRDUF9ERUxBQ0tfTUFYKTsKKworZGlzY2FyZDoKKwkJCV9fa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXRjcF9zZW5kX2Fjayhzayk7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKworCS8qIE5vIEFDSyBpbiB0aGUgc2VnbWVudCAqLworCisJaWYgKHRoLT5yc3QpIHsKKwkJLyogcmZjNzkzOgorCQkgKiAiSWYgdGhlIFJTVCBiaXQgaXMgc2V0CisJCSAqCisJCSAqICAgICAgT3RoZXJ3aXNlIChubyBBQ0spIGRyb3AgdGhlIHNlZ21lbnQgYW5kIHJldHVybi4iCisJCSAqLworCisJCWdvdG8gZGlzY2FyZF9hbmRfdW5kbzsKKwl9CisKKwkvKiBQQVdTIGNoZWNrLiAqLworCWlmICh0cC0+cnhfb3B0LnRzX3JlY2VudF9zdGFtcCAmJiB0cC0+cnhfb3B0LnNhd190c3RhbXAgJiYgdGNwX3Bhd3NfY2hlY2soJnRwLT5yeF9vcHQsIDApKQorCQlnb3RvIGRpc2NhcmRfYW5kX3VuZG87CisKKwlpZiAodGgtPnN5bikgeworCQkvKiBXZSBzZWUgU1lOIHdpdGhvdXQgQUNLLiBJdCBpcyBhdHRlbXB0IG9mCisJCSAqIHNpbXVsdGFuZW91cyBjb25uZWN0IHdpdGggY3Jvc3NlZCBTWU5zLgorCQkgKiBQYXJ0aWN1bGFybHksIGl0IGNhbiBiZSBjb25uZWN0IHRvIHNlbGYuCisJCSAqLworCQl0Y3Bfc2V0X3N0YXRlKHNrLCBUQ1BfU1lOX1JFQ1YpOworCisJCWlmICh0cC0+cnhfb3B0LnNhd190c3RhbXApIHsKKwkJCXRwLT5yeF9vcHQudHN0YW1wX29rID0gMTsKKwkJCXRjcF9zdG9yZV90c19yZWNlbnQodHApOworCQkJdHAtPnRjcF9oZWFkZXJfbGVuID0KKwkJCQlzaXplb2Yoc3RydWN0IHRjcGhkcikgKyBUQ1BPTEVOX1RTVEFNUF9BTElHTkVEOworCQl9IGVsc2UgeworCQkJdHAtPnRjcF9oZWFkZXJfbGVuID0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOworCQl9CisKKwkJdHAtPnJjdl9ueHQgPSBUQ1BfU0tCX0NCKHNrYiktPnNlcSArIDE7CisJCXRwLT5yY3Zfd3VwID0gVENQX1NLQl9DQihza2IpLT5zZXEgKyAxOworCisJCS8qIFJGQzEzMjM6IFRoZSB3aW5kb3cgaW4gU1lOICYgU1lOL0FDSyBzZWdtZW50cyBpcworCQkgKiBuZXZlciBzY2FsZWQuCisJCSAqLworCQl0cC0+c25kX3duZCAgICA9IG50b2hzKHRoLT53aW5kb3cpOworCQl0cC0+c25kX3dsMSAgICA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxOworCQl0cC0+bWF4X3dpbmRvdyA9IHRwLT5zbmRfd25kOworCisJCVRDUF9FQ05fcmN2X3N5bih0cCwgdGgpOworCQlpZiAodHAtPmVjbl9mbGFncyZUQ1BfRUNOX09LKQorCQkJc29ja19zZXRfZmxhZyhzaywgU09DS19OT19MQVJHRVNFTkQpOworCisJCXRjcF9zeW5jX21zcyhzaywgdHAtPnBtdHVfY29va2llKTsKKwkJdGNwX2luaXRpYWxpemVfcmN2X21zcyhzayk7CisKKworCQl0Y3Bfc2VuZF9zeW5hY2soc2spOworI2lmIDAKKwkJLyogTm90ZSwgd2UgY291bGQgYWNjZXB0IGRhdGEgYW5kIFVSRyBmcm9tIHRoaXMgc2VnbWVudC4KKwkJICogVGhlcmUgYXJlIG5vIG9ic3RhY2xlcyB0byBtYWtlIHRoaXMuCisJCSAqCisJCSAqIEhvd2V2ZXIsIGlmIHdlIGlnbm9yZSBkYXRhIGluIEFDS2xlc3Mgc2VnbWVudHMgc29tZXRpbWVzLAorCQkgKiB3ZSBoYXZlIG5vIHJlYXNvbnMgdG8gYWNjZXB0IGl0IHNvbWV0aW1lcy4KKwkJICogQWxzbywgc2VlbXMgdGhlIGNvZGUgZG9pbmcgaXQgaW4gc3RlcDYgb2YgdGNwX3Jjdl9zdGF0ZV9wcm9jZXNzCisJCSAqIGlzIG5vdCBmbGF3bGVzcy4gU28sIGRpc2NhcmQgcGFja2V0IGZvciBzYW5pdHkuCisJCSAqIFVuY29tbWVudCB0aGlzIHJldHVybiB0byBwcm9jZXNzIHRoZSBkYXRhLgorCQkgKi8KKwkJcmV0dXJuIC0xOworI2Vsc2UKKwkJZ290byBkaXNjYXJkOworI2VuZGlmCisJfQorCS8qICJmaWZ0aCwgaWYgbmVpdGhlciBvZiB0aGUgU1lOIG9yIFJTVCBiaXRzIGlzIHNldCB0aGVuCisJICogZHJvcCB0aGUgc2VnbWVudCBhbmQgcmV0dXJuLiIKKwkgKi8KKworZGlzY2FyZF9hbmRfdW5kbzoKKwl0Y3BfY2xlYXJfb3B0aW9ucygmdHAtPnJ4X29wdCk7CisJdHAtPnJ4X29wdC5tc3NfY2xhbXAgPSBzYXZlZF9jbGFtcDsKKwlnb3RvIGRpc2NhcmQ7CisKK3Jlc2V0X2FuZF91bmRvOgorCXRjcF9jbGVhcl9vcHRpb25zKCZ0cC0+cnhfb3B0KTsKKwl0cC0+cnhfb3B0Lm1zc19jbGFtcCA9IHNhdmVkX2NsYW1wOworCXJldHVybiAxOworfQorCisKKy8qCisgKglUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIHJlY2VpdmluZyBwcm9jZWR1cmUgb2YgUkZDIDc5MyBmb3IKKyAqCWFsbCBzdGF0ZXMgZXhjZXB0IEVTVEFCTElTSEVEIGFuZCBUSU1FX1dBSVQuIAorICoJSXQncyBjYWxsZWQgZnJvbSBib3RoIHRjcF92NF9yY3YgYW5kIHRjcF92Nl9yY3YgYW5kIHNob3VsZCBiZQorICoJYWRkcmVzcyBpbmRlcGVuZGVudC4KKyAqLworCQoraW50IHRjcF9yY3Zfc3RhdGVfcHJvY2VzcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIHN0cnVjdCB0Y3BoZHIgKnRoLCB1bnNpZ25lZCBsZW4pCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJaW50IHF1ZXVlZCA9IDA7CisKKwl0cC0+cnhfb3B0LnNhd190c3RhbXAgPSAwOworCisJc3dpdGNoIChzay0+c2tfc3RhdGUpIHsKKwljYXNlIFRDUF9DTE9TRToKKwkJZ290byBkaXNjYXJkOworCisJY2FzZSBUQ1BfTElTVEVOOgorCQlpZih0aC0+YWNrKQorCQkJcmV0dXJuIDE7CisKKwkJaWYodGgtPnJzdCkKKwkJCWdvdG8gZGlzY2FyZDsKKworCQlpZih0aC0+c3luKSB7CisJCQlpZih0cC0+YWZfc3BlY2lmaWMtPmNvbm5fcmVxdWVzdChzaywgc2tiKSA8IDApCisJCQkJcmV0dXJuIDE7CisKKwkJCWluaXRfd2VzdHdvb2Qoc2spOworCQkJaW5pdF9iaWN0Y3AodHApOworCisJCQkvKiBOb3cgd2UgaGF2ZSBzZXZlcmFsIG9wdGlvbnM6IEluIHRoZW9yeSB0aGVyZSBpcyAKKwkJCSAqIG5vdGhpbmcgZWxzZSBpbiB0aGUgZnJhbWUuIEtBOVEgaGFzIGFuIG9wdGlvbiB0byAKKwkJCSAqIHNlbmQgZGF0YSB3aXRoIHRoZSBzeW4sIEJTRCBhY2NlcHRzIGRhdGEgd2l0aCB0aGUKKwkJCSAqIHN5biB1cCB0byB0aGUgW3RvIGJlXSBhZHZlcnRpc2VkIHdpbmRvdyBhbmQgCisJCQkgKiBTb2xhcmlzIDIuMSBnaXZlcyB5b3UgYSBwcm90b2NvbCBlcnJvci4gRm9yIG5vdyAKKwkJCSAqIHdlIGp1c3QgaWdub3JlIGl0LCB0aGF0IGZpdHMgdGhlIHNwZWMgcHJlY2lzZWx5IAorCQkJICogYW5kIGF2b2lkcyBpbmNvbXBhdGliaWxpdGllcy4gSXQgd291bGQgYmUgbmljZSBpbgorCQkJICogZnV0dXJlIHRvIGRyb3AgdGhyb3VnaCBhbmQgcHJvY2VzcyB0aGUgZGF0YS4KKwkJCSAqCisJCQkgKiBOb3cgdGhhdCBUVENQIGlzIHN0YXJ0aW5nIHRvIGJlIHVzZWQgd2Ugb3VnaHQgdG8gCisJCQkgKiBxdWV1ZSB0aGlzIGRhdGEuCisJCQkgKiBCdXQsIHRoaXMgbGVhdmVzIG9uZSBvcGVuIHRvIGFuIGVhc3kgZGVuaWFsIG9mCisJCSAJICogc2VydmljZSBhdHRhY2ssIGFuZCBTWU4gY29va2llcyBjYW4ndCBkZWZlbmQKKwkJCSAqIGFnYWluc3QgdGhpcyBwcm9ibGVtLiBTbywgd2UgZHJvcCB0aGUgZGF0YQorCQkJICogaW4gdGhlIGludGVyZXN0IG9mIHNlY3VyaXR5IG92ZXIgc3BlZWQuCisJCQkgKi8KKwkJCWdvdG8gZGlzY2FyZDsKKwkJfQorCQlnb3RvIGRpc2NhcmQ7CisKKwljYXNlIFRDUF9TWU5fU0VOVDoKKwkJaW5pdF93ZXN0d29vZChzayk7CisJCWluaXRfYmljdGNwKHRwKTsKKworCQlxdWV1ZWQgPSB0Y3BfcmN2X3N5bnNlbnRfc3RhdGVfcHJvY2Vzcyhzaywgc2tiLCB0aCwgbGVuKTsKKwkJaWYgKHF1ZXVlZCA+PSAwKQorCQkJcmV0dXJuIHF1ZXVlZDsKKworCQkvKiBEbyBzdGVwNiBvbndhcmQgYnkgaGFuZC4gKi8KKwkJdGNwX3VyZyhzaywgc2tiLCB0aCk7CisJCV9fa2ZyZWVfc2tiKHNrYik7CisJCXRjcF9kYXRhX3NuZF9jaGVjayhzayk7CisJCXJldHVybiAwOworCX0KKworCWlmICh0Y3BfZmFzdF9wYXJzZV9vcHRpb25zKHNrYiwgdGgsIHRwKSAmJiB0cC0+cnhfb3B0LnNhd190c3RhbXAgJiYKKwkgICAgdGNwX3Bhd3NfZGlzY2FyZCh0cCwgc2tiKSkgeworCQlpZiAoIXRoLT5yc3QpIHsKKwkJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1BBV1NFU1RBQlJFSkVDVEVEKTsKKwkJCXRjcF9zZW5kX2R1cGFjayhzaywgc2tiKTsKKwkJCWdvdG8gZGlzY2FyZDsKKwkJfQorCQkvKiBSZXNldCBpcyBhY2NlcHRlZCBldmVuIGlmIGl0IGRpZCBub3QgcGFzcyBQQVdTLiAqLworCX0KKworCS8qIHN0ZXAgMTogY2hlY2sgc2VxdWVuY2UgbnVtYmVyICovCisJaWYgKCF0Y3Bfc2VxdWVuY2UodHAsIFRDUF9TS0JfQ0Ioc2tiKS0+c2VxLCBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEpKSB7CisJCWlmICghdGgtPnJzdCkKKwkJCXRjcF9zZW5kX2R1cGFjayhzaywgc2tiKTsKKwkJZ290byBkaXNjYXJkOworCX0KKworCS8qIHN0ZXAgMjogY2hlY2sgUlNUIGJpdCAqLworCWlmKHRoLT5yc3QpIHsKKwkJdGNwX3Jlc2V0KHNrKTsKKwkJZ290byBkaXNjYXJkOworCX0KKworCXRjcF9yZXBsYWNlX3RzX3JlY2VudCh0cCwgVENQX1NLQl9DQihza2IpLT5zZXEpOworCisJLyogc3RlcCAzOiBjaGVjayBzZWN1cml0eSBhbmQgcHJlY2VkZW5jZSBbaWdub3JlZF0gKi8KKworCS8qCXN0ZXAgNDoKKwkgKgorCSAqCUNoZWNrIGZvciBhIFNZTiBpbiB3aW5kb3cuCisJICovCisJaWYgKHRoLT5zeW4gJiYgIWJlZm9yZShUQ1BfU0tCX0NCKHNrYiktPnNlcSwgdHAtPnJjdl9ueHQpKSB7CisJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUEFCT1JUT05TWU4pOworCQl0Y3BfcmVzZXQoc2spOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBzdGVwIDU6IGNoZWNrIHRoZSBBQ0sgZmllbGQgKi8KKwlpZiAodGgtPmFjaykgeworCQlpbnQgYWNjZXB0YWJsZSA9IHRjcF9hY2soc2ssIHNrYiwgRkxBR19TTE9XUEFUSCk7CisKKwkJc3dpdGNoKHNrLT5za19zdGF0ZSkgeworCQljYXNlIFRDUF9TWU5fUkVDVjoKKwkJCWlmIChhY2NlcHRhYmxlKSB7CisJCQkJdHAtPmNvcGllZF9zZXEgPSB0cC0+cmN2X254dDsKKwkJCQltYigpOworCQkJCXRjcF9zZXRfc3RhdGUoc2ssIFRDUF9FU1RBQkxJU0hFRCk7CisJCQkJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisKKwkJCQkvKiBOb3RlLCB0aGF0IHRoaXMgd2FrZXVwIGlzIG9ubHkgZm9yIG1hcmdpbmFsCisJCQkJICogY3Jvc3NlZCBTWU4gY2FzZS4gUGFzc2l2ZWx5IG9wZW4gc29ja2V0cworCQkJCSAqIGFyZSBub3Qgd2FrZWQgdXAsIGJlY2F1c2Ugc2stPnNrX3NsZWVwID09CisJCQkJICogTlVMTCBhbmQgc2stPnNrX3NvY2tldCA9PSBOVUxMLgorCQkJCSAqLworCQkJCWlmIChzay0+c2tfc29ja2V0KSB7CisJCQkJCXNrX3dha2VfYXN5bmMoc2ssMCxQT0xMX09VVCk7CisJCQkJfQorCisJCQkJdHAtPnNuZF91bmEgPSBUQ1BfU0tCX0NCKHNrYiktPmFja19zZXE7CisJCQkJdHAtPnNuZF93bmQgPSBudG9ocyh0aC0+d2luZG93KSA8PAorCQkJCQkgICAgICB0cC0+cnhfb3B0LnNuZF93c2NhbGU7CisJCQkJdGNwX2luaXRfd2wodHAsIFRDUF9TS0JfQ0Ioc2tiKS0+YWNrX3NlcSwKKwkJCQkJICAgIFRDUF9TS0JfQ0Ioc2tiKS0+c2VxKTsKKworCQkJCS8qIHRjcF9hY2sgY29uc2lkZXJzIHRoaXMgQUNLIGFzIGR1cGxpY2F0ZQorCQkJCSAqIGFuZCBkb2VzIG5vdCBjYWxjdWxhdGUgcnR0LgorCQkJCSAqIEZpeCBpdCBhdCBsZWFzdCB3aXRoIHRpbWVzdGFtcHMuCisJCQkJICovCisJCQkJaWYgKHRwLT5yeF9vcHQuc2F3X3RzdGFtcCAmJiB0cC0+cnhfb3B0LnJjdl90c2VjciAmJgorCQkJCSAgICAhdHAtPnNydHQpCisJCQkJCXRjcF9hY2tfc2F3X3RzdGFtcCh0cCwgMCk7CisKKwkJCQlpZiAodHAtPnJ4X29wdC50c3RhbXBfb2spCisJCQkJCXRwLT5hZHZtc3MgLT0gVENQT0xFTl9UU1RBTVBfQUxJR05FRDsKKworCQkJCS8qIE1ha2Ugc3VyZSBzb2NrZXQgaXMgcm91dGVkLCBmb3IKKwkJCQkgKiBjb3JyZWN0IG1ldHJpY3MuCisJCQkJICovCisJCQkJdHAtPmFmX3NwZWNpZmljLT5yZWJ1aWxkX2hlYWRlcihzayk7CisKKwkJCQl0Y3BfaW5pdF9tZXRyaWNzKHNrKTsKKworCQkJCS8qIFByZXZlbnQgc3B1cmlvdXMgdGNwX2N3bmRfcmVzdGFydCgpIG9uCisJCQkJICogZmlyc3QgZGF0YSBwYWNrZXQuCisJCQkJICovCisJCQkJdHAtPmxzbmR0aW1lID0gdGNwX3RpbWVfc3RhbXA7CisKKwkJCQl0Y3BfaW5pdGlhbGl6ZV9yY3ZfbXNzKHNrKTsKKwkJCQl0Y3BfaW5pdF9idWZmZXJfc3BhY2Uoc2spOworCQkJCXRjcF9mYXN0X3BhdGhfb24odHApOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVENQX0ZJTl9XQUlUMToKKwkJCWlmICh0cC0+c25kX3VuYSA9PSB0cC0+d3JpdGVfc2VxKSB7CisJCQkJdGNwX3NldF9zdGF0ZShzaywgVENQX0ZJTl9XQUlUMik7CisJCQkJc2stPnNrX3NodXRkb3duIHw9IFNFTkRfU0hVVERPV047CisJCQkJZHN0X2NvbmZpcm0oc2stPnNrX2RzdF9jYWNoZSk7CisKKwkJCQlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkKKwkJCQkJLyogV2FrZSB1cCBsaW5nZXJpbmcgY2xvc2UoKSAqLworCQkJCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKKwkJCQllbHNlIHsKKwkJCQkJaW50IHRtbzsKKworCQkJCQlpZiAodHAtPmxpbmdlcjIgPCAwIHx8CisJCQkJCSAgICAoVENQX1NLQl9DQihza2IpLT5lbmRfc2VxICE9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxICYmCisJCQkJCSAgICAgYWZ0ZXIoVENQX1NLQl9DQihza2IpLT5lbmRfc2VxIC0gdGgtPmZpbiwgdHAtPnJjdl9ueHQpKSkgeworCQkJCQkJdGNwX2RvbmUoc2spOworCQkJCQkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfVENQQUJPUlRPTkRBVEEpOworCQkJCQkJcmV0dXJuIDE7CisJCQkJCX0KKworCQkJCQl0bW8gPSB0Y3BfZmluX3RpbWUodHApOworCQkJCQlpZiAodG1vID4gVENQX1RJTUVXQUlUX0xFTikgeworCQkJCQkJdGNwX3Jlc2V0X2tlZXBhbGl2ZV90aW1lcihzaywgdG1vIC0gVENQX1RJTUVXQUlUX0xFTik7CisJCQkJCX0gZWxzZSBpZiAodGgtPmZpbiB8fCBzb2NrX293bmVkX2J5X3VzZXIoc2spKSB7CisJCQkJCQkvKiBCYWQgY2FzZS4gV2UgY291bGQgbG9zZSBzdWNoIEZJTiBvdGhlcndpc2UuCisJCQkJCQkgKiBJdCBpcyBub3QgYSBiaWcgcHJvYmxlbSwgYnV0IGl0IGxvb2tzIGNvbmZ1c2luZworCQkJCQkJICogYW5kIG5vdCBzbyByYXJlIGV2ZW50LiBXZSBzdGlsbCBjYW4gbG9zZSBpdCBub3csCisJCQkJCQkgKiBpZiBpdCBzcGlucyBpbiBiaF9sb2NrX3NvY2soKSwgYnV0IGl0IGlzIHJlYWxseQorCQkJCQkJICogbWFyZ2luYWwgY2FzZS4KKwkJCQkJCSAqLworCQkJCQkJdGNwX3Jlc2V0X2tlZXBhbGl2ZV90aW1lcihzaywgdG1vKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXRjcF90aW1lX3dhaXQoc2ssIFRDUF9GSU5fV0FJVDIsIHRtbyk7CisJCQkJCQlnb3RvIGRpc2NhcmQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFRDUF9DTE9TSU5HOgorCQkJaWYgKHRwLT5zbmRfdW5hID09IHRwLT53cml0ZV9zZXEpIHsKKwkJCQl0Y3BfdGltZV93YWl0KHNrLCBUQ1BfVElNRV9XQUlULCAwKTsKKwkJCQlnb3RvIGRpc2NhcmQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFRDUF9MQVNUX0FDSzoKKwkJCWlmICh0cC0+c25kX3VuYSA9PSB0cC0+d3JpdGVfc2VxKSB7CisJCQkJdGNwX3VwZGF0ZV9tZXRyaWNzKHNrKTsKKwkJCQl0Y3BfZG9uZShzayk7CisJCQkJZ290byBkaXNjYXJkOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UKKwkJZ290byBkaXNjYXJkOworCisJLyogc3RlcCA2OiBjaGVjayB0aGUgVVJHIGJpdCAqLworCXRjcF91cmcoc2ssIHNrYiwgdGgpOworCisJLyogc3RlcCA3OiBwcm9jZXNzIHRoZSBzZWdtZW50IHRleHQgKi8KKwlzd2l0Y2ggKHNrLT5za19zdGF0ZSkgeworCWNhc2UgVENQX0NMT1NFX1dBSVQ6CisJY2FzZSBUQ1BfQ0xPU0lORzoKKwljYXNlIFRDUF9MQVNUX0FDSzoKKwkJaWYgKCFiZWZvcmUoVENQX1NLQl9DQihza2IpLT5zZXEsIHRwLT5yY3Zfbnh0KSkKKwkJCWJyZWFrOworCWNhc2UgVENQX0ZJTl9XQUlUMToKKwljYXNlIFRDUF9GSU5fV0FJVDI6CisJCS8qIFJGQyA3OTMgc2F5cyB0byBxdWV1ZSBkYXRhIGluIHRoZXNlIHN0YXRlcywKKwkJICogUkZDIDExMjIgc2F5cyB3ZSBNVVNUIHNlbmQgYSByZXNldC4gCisJCSAqIEJTRCA0LjQgYWxzbyBkb2VzIHJlc2V0LgorCQkgKi8KKwkJaWYgKHNrLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikgeworCQkJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSAhPSBUQ1BfU0tCX0NCKHNrYiktPnNlcSAmJgorCQkJICAgIGFmdGVyKFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSAtIHRoLT5maW4sIHRwLT5yY3Zfbnh0KSkgeworCQkJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUEFCT1JUT05EQVRBKTsKKwkJCQl0Y3BfcmVzZXQoc2spOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJCS8qIEZhbGwgdGhyb3VnaCAqLworCWNhc2UgVENQX0VTVEFCTElTSEVEOiAKKwkJdGNwX2RhdGFfcXVldWUoc2ssIHNrYik7CisJCXF1ZXVlZCA9IDE7CisJCWJyZWFrOworCX0KKworCS8qIHRjcF9kYXRhIGNvdWxkIG1vdmUgc29ja2V0IHRvIFRJTUUtV0FJVCAqLworCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0NMT1NFKSB7CisJCXRjcF9kYXRhX3NuZF9jaGVjayhzayk7CisJCXRjcF9hY2tfc25kX2NoZWNrKHNrKTsKKwl9CisKKwlpZiAoIXF1ZXVlZCkgeyAKK2Rpc2NhcmQ6CisJCV9fa2ZyZWVfc2tiKHNrYik7CisJfQorCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHN5c2N0bF90Y3BfZWNuKTsKK0VYUE9SVF9TWU1CT0woc3lzY3RsX3RjcF9yZW9yZGVyaW5nKTsKK0VYUE9SVF9TWU1CT0wodGNwX3BhcnNlX29wdGlvbnMpOworRVhQT1JUX1NZTUJPTCh0Y3BfcmN2X2VzdGFibGlzaGVkKTsKK0VYUE9SVF9TWU1CT0wodGNwX3Jjdl9zdGF0ZV9wcm9jZXNzKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9pcHY0LmMgYi9uZXQvaXB2NC90Y3BfaXB2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYzY2NTkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC90Y3BfaXB2NC5jCkBAIC0wLDAgKzEsMjY2MyBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlJbXBsZW1lbnRhdGlvbiBvZiB0aGUgVHJhbnNtaXNzaW9uIENvbnRyb2wgUHJvdG9jb2woVENQKS4KKyAqCisgKiBWZXJzaW9uOgkkSWQ6IHRjcF9pcHY0LmMsdiAxLjI0MCAyMDAyLzAyLzAxIDIyOjAxOjA0IGRhdmVtIEV4cCAkCisgKgorICoJCUlQdjQgc3BlY2lmaWMgZnVuY3Rpb25zCisgKgorICoKKyAqCQljb2RlIHNwbGl0IGZyb206CisgKgkJbGludXgvaXB2NC90Y3AuYworICoJCWxpbnV4L2lwdjQvdGNwX2lucHV0LmMKKyAqCQlsaW51eC9pcHY0L3RjcF9vdXRwdXQuYworICoKKyAqCQlTZWUgdGNwLmMgZm9yIGF1dGhvciBpbmZvcm1hdGlvbgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworLyoKKyAqIENoYW5nZXM6CisgKgkJRGF2aWQgUy4gTWlsbGVyCToJTmV3IHNvY2tldCBsb29rdXAgYXJjaGl0ZWN0dXJlLgorICoJCQkJCVRoaXMgY29kZSBpcyBkZWRpY2F0ZWQgdG8gSm9obiBEeXNvbi4KKyAqCQlEYXZpZCBTLiBNaWxsZXIgOglDaGFuZ2Ugc2VtYW50aWNzIG9mIGVzdGFibGlzaGVkIGhhc2gsCisgKgkJCQkJaGFsZiBpcyBkZXZvdGVkIHRvIFRJTUVfV0FJVCBzb2NrZXRzCisgKgkJCQkJYW5kIHRoZSByZXN0IGdvIGluIHRoZSBvdGhlciBoYWxmLgorICoJCUFuZGkgS2xlZW4gOgkJQWRkIHN1cHBvcnQgZm9yIHN5bmNvb2tpZXMgYW5kIGZpeGVkCisgKgkJCQkJc29tZSBidWdzOiBpcCBvcHRpb25zIHdlcmVuJ3QgcGFzc2VkIHRvCisgKgkJCQkJdGhlIFRDUCBsYXllciwgbWlzc2VkIGEgY2hlY2sgZm9yIGFuCisgKgkJCQkJQUNLIGJpdC4KKyAqCQlBbmRpIEtsZWVuIDoJCUltcGxlbWVudGVkIGZhc3QgcGF0aCBtdHUgZGlzY292ZXJ5LgorICoJICAgICAJCQkJRml4ZWQgbWFueSBzZXJpb3VzIGJ1Z3MgaW4gdGhlCisgKgkJCQkJb3Blbl9yZXF1ZXN0IGhhbmRsaW5nIGFuZCBtb3ZlZAorICoJCQkJCW1vc3Qgb2YgaXQgaW50byB0aGUgYWYgaW5kZXBlbmRlbnQgY29kZS4KKyAqCQkJCQlBZGRlZCB0YWlsIGRyb3AgYW5kIHNvbWUgb3RoZXIgYnVnZml4ZXMuCisgKgkJCQkJQWRkZWQgbmV3IGxpc3RlbiBzZW1hdGljcy4KKyAqCQlNaWtlIE1jTGFnYW4JOglSb3V0aW5nIGJ5IHNvdXJjZQorICoJSnVhbiBKb3NlIENpYXJsYW50ZToJCWlwX2R5bmFkZHIgYml0cworICoJCUFuZGkgS2xlZW46CQl2YXJpb3VzIGZpeGVzLgorICoJVml0YWx5IEUuIExhdnJvdgk6CVRyYW5zcGFyZW50IHByb3h5IHJldml2ZWQgYWZ0ZXIgeWVhcgorICoJCQkJCWNvbWEuCisgKglBbmRpIEtsZWVuCQk6CUZpeCBuZXcgbGlzdGVuLgorICoJQW5kaSBLbGVlbgkJOglGaXggYWNjZXB0IGVycm9yIHJlcG9ydGluZy4KKyAqCVlPU0hJRlVKSSBIaWRlYWtpIEBVU0FHSSBhbmQ6CVN1cHBvcnQgSVBWNl9WNk9OTFkgc29ja2V0IG9wdGlvbiwgd2hpY2gKKyAqCUFsZXhleSBLdXpuZXRzb3YJCWFsbG93IGJvdGggSVB2NCBhbmQgSVB2NiBzb2NrZXRzIHRvIGJpbmQKKyAqCQkJCQlhIHNpbmdsZSBwb3J0IGF0IHRoZSBzYW1lIHRpbWUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvamhhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXMuaD4KKworI2luY2x1ZGUgPG5ldC9pY21wLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L2luZXRfY29tbW9uLmg+CisjaW5jbHVkZSA8bmV0L3hmcm0uaD4KKworI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKK2V4dGVybiBpbnQgc3lzY3RsX2lwX2R5bmFkZHI7CitpbnQgc3lzY3RsX3RjcF90d19yZXVzZTsKK2ludCBzeXNjdGxfdGNwX2xvd19sYXRlbmN5OworCisvKiBDaGVjayBUQ1Agc2VxdWVuY2UgbnVtYmVycyBpbiBJQ01QIHBhY2tldHMuICovCisjZGVmaW5lIElDTVBfTUlOX0xFTkdUSCA4CisKKy8qIFNvY2tldCB1c2VkIGZvciBzZW5kaW5nIFJTVHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ja2V0ICp0Y3Bfc29ja2V0OworCit2b2lkIHRjcF92NF9zZW5kX2NoZWNrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcGhkciAqdGgsIGludCBsZW4sCisJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworc3RydWN0IHRjcF9oYXNoaW5mbyBfX2NhY2hlbGluZV9hbGlnbmVkIHRjcF9oYXNoaW5mbyA9IHsKKwkuX190Y3BfbGhhc2hfbG9jawk9CVJXX0xPQ0tfVU5MT0NLRUQsCisJLl9fdGNwX2xoYXNoX3VzZXJzCT0JQVRPTUlDX0lOSVQoMCksCisJLl9fdGNwX2xoYXNoX3dhaXQKKwkgID0gX19XQUlUX1FVRVVFX0hFQURfSU5JVElBTElaRVIodGNwX2hhc2hpbmZvLl9fdGNwX2xoYXNoX3dhaXQpLAorCS5fX3RjcF9wb3J0YWxsb2NfbG9jawk9CVNQSU5fTE9DS19VTkxPQ0tFRAorfTsKKworLyoKKyAqIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGZpcnN0IGFuZCBsYXN0IGxvY2FsIHBvcnQgbnVtYmVyLgorICogRm9yIGhpZ2gtdXNhZ2Ugc3lzdGVtcywgdXNlIHN5c2N0bCB0byBjaGFuZ2UgdGhpcyB0bworICogMzI3NjgtNjEwMDAKKyAqLworaW50IHN5c2N0bF9sb2NhbF9wb3J0X3JhbmdlWzJdID0geyAxMDI0LCA0OTk5IH07CitpbnQgdGNwX3BvcnRfcm92ZXIgPSAxMDI0IC0gMTsKKworc3RhdGljIF9faW5saW5lX18gaW50IHRjcF9oYXNoZm4oX191MzIgbGFkZHIsIF9fdTE2IGxwb3J0LAorCQkJCSBfX3UzMiBmYWRkciwgX191MTYgZnBvcnQpCit7CisJaW50IGggPSAobGFkZHIgXiBscG9ydCkgXiAoZmFkZHIgXiBmcG9ydCk7CisJaCBePSBoID4+IDE2OworCWggXj0gaCA+PiA4OworCXJldHVybiBoICYgKHRjcF9laGFzaF9zaXplIC0gMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCB0Y3Bfc2tfaGFzaGZuKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisJX191MzIgbGFkZHIgPSBpbmV0LT5yY3Zfc2FkZHI7CisJX191MTYgbHBvcnQgPSBpbmV0LT5udW07CisJX191MzIgZmFkZHIgPSBpbmV0LT5kYWRkcjsKKwlfX3UxNiBmcG9ydCA9IGluZXQtPmRwb3J0OworCisJcmV0dXJuIHRjcF9oYXNoZm4obGFkZHIsIGxwb3J0LCBmYWRkciwgZnBvcnQpOworfQorCisvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBUQ1AgbG9jYWwgcG9ydCBiaW5kIGJ1Y2tldC4KKyAqIFRoZSBiaW5kaGFzaCBtdXRleCBmb3Igc251bSdzIGhhc2ggY2hhaW4gbXVzdCBiZSBoZWxkIGhlcmUuCisgKi8KK3N0cnVjdCB0Y3BfYmluZF9idWNrZXQgKnRjcF9idWNrZXRfY3JlYXRlKHN0cnVjdCB0Y3BfYmluZF9oYXNoYnVja2V0ICpoZWFkLAorCQkJCQkgIHVuc2lnbmVkIHNob3J0IHNudW0pCit7CisJc3RydWN0IHRjcF9iaW5kX2J1Y2tldCAqdGIgPSBrbWVtX2NhY2hlX2FsbG9jKHRjcF9idWNrZXRfY2FjaGVwLAorCQkJCQkJICAgICAgU0xBQl9BVE9NSUMpOworCWlmICh0YikgeworCQl0Yi0+cG9ydCA9IHNudW07CisJCXRiLT5mYXN0cmV1c2UgPSAwOworCQlJTklUX0hMSVNUX0hFQUQoJnRiLT5vd25lcnMpOworCQlobGlzdF9hZGRfaGVhZCgmdGItPm5vZGUsICZoZWFkLT5jaGFpbik7CisJfQorCXJldHVybiB0YjsKK30KKworLyogQ2FsbGVyIG11c3QgaG9sZCBoYXNoYnVja2V0IGxvY2sgZm9yIHRoaXMgdGIgd2l0aCBsb2NhbCBCSCBkaXNhYmxlZCAqLwordm9pZCB0Y3BfYnVja2V0X2Rlc3Ryb3koc3RydWN0IHRjcF9iaW5kX2J1Y2tldCAqdGIpCit7CisJaWYgKGhsaXN0X2VtcHR5KCZ0Yi0+b3duZXJzKSkgeworCQlfX2hsaXN0X2RlbCgmdGItPm5vZGUpOworCQlrbWVtX2NhY2hlX2ZyZWUodGNwX2J1Y2tldF9jYWNoZXAsIHRiKTsKKwl9Cit9CisKKy8qIENhbGxlciBtdXN0IGRpc2FibGUgbG9jYWwgQkggcHJvY2Vzc2luZy4gKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX190Y3BfaW5oZXJpdF9wb3J0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2sgKmNoaWxkKQoreworCXN0cnVjdCB0Y3BfYmluZF9oYXNoYnVja2V0ICpoZWFkID0KKwkJCQkmdGNwX2JoYXNoW3RjcF9iaGFzaGZuKGluZXRfc2soY2hpbGQpLT5udW0pXTsKKwlzdHJ1Y3QgdGNwX2JpbmRfYnVja2V0ICp0YjsKKworCXNwaW5fbG9jaygmaGVhZC0+bG9jayk7CisJdGIgPSB0Y3Bfc2soc2spLT5iaW5kX2hhc2g7CisJc2tfYWRkX2JpbmRfbm9kZShjaGlsZCwgJnRiLT5vd25lcnMpOworCXRjcF9zayhjaGlsZCktPmJpbmRfaGFzaCA9IHRiOworCXNwaW5fdW5sb2NrKCZoZWFkLT5sb2NrKTsKK30KKworaW5saW5lIHZvaWQgdGNwX2luaGVyaXRfcG9ydChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrICpjaGlsZCkKK3sKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJX190Y3BfaW5oZXJpdF9wb3J0KHNrLCBjaGlsZCk7CisJbG9jYWxfYmhfZW5hYmxlKCk7Cit9CisKK3ZvaWQgdGNwX2JpbmRfaGFzaChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3BfYmluZF9idWNrZXQgKnRiLAorCQkgICB1bnNpZ25lZCBzaG9ydCBzbnVtKQoreworCWluZXRfc2soc2spLT5udW0gPSBzbnVtOworCXNrX2FkZF9iaW5kX25vZGUoc2ssICZ0Yi0+b3duZXJzKTsKKwl0Y3Bfc2soc2spLT5iaW5kX2hhc2ggPSB0YjsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGNwX2JpbmRfY29uZmxpY3Qoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX2JpbmRfYnVja2V0ICp0YikKK3sKKwljb25zdCB1MzIgc2tfcmN2X3NhZGRyID0gdGNwX3Y0X3Jjdl9zYWRkcihzayk7CisJc3RydWN0IHNvY2sgKnNrMjsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlpbnQgcmV1c2UgPSBzay0+c2tfcmV1c2U7CisKKwlza19mb3JfZWFjaF9ib3VuZChzazIsIG5vZGUsICZ0Yi0+b3duZXJzKSB7CisJCWlmIChzayAhPSBzazIgJiYKKwkJICAgICF0Y3BfdjZfaXB2Nm9ubHkoc2syKSAmJgorCQkgICAgKCFzay0+c2tfYm91bmRfZGV2X2lmIHx8CisJCSAgICAgIXNrMi0+c2tfYm91bmRfZGV2X2lmIHx8CisJCSAgICAgc2stPnNrX2JvdW5kX2Rldl9pZiA9PSBzazItPnNrX2JvdW5kX2Rldl9pZikpIHsKKwkJCWlmICghcmV1c2UgfHwgIXNrMi0+c2tfcmV1c2UgfHwKKwkJCSAgICBzazItPnNrX3N0YXRlID09IFRDUF9MSVNURU4pIHsKKwkJCQljb25zdCB1MzIgc2syX3Jjdl9zYWRkciA9IHRjcF92NF9yY3Zfc2FkZHIoc2syKTsKKwkJCQlpZiAoIXNrMl9yY3Zfc2FkZHIgfHwgIXNrX3Jjdl9zYWRkciB8fAorCQkJCSAgICBzazJfcmN2X3NhZGRyID09IHNrX3Jjdl9zYWRkcikKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIG5vZGUgIT0gTlVMTDsKK30KKworLyogT2J0YWluIGEgcmVmZXJlbmNlIHRvIGEgbG9jYWwgcG9ydCBmb3IgdGhlIGdpdmVuIHNvY2ssCisgKiBpZiBzbnVtIGlzIHplcm8gaXQgbWVhbnMgc2VsZWN0IGFueSBhdmFpbGFibGUgbG9jYWwgcG9ydC4KKyAqLworc3RhdGljIGludCB0Y3BfdjRfZ2V0X3BvcnQoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBzaG9ydCBzbnVtKQoreworCXN0cnVjdCB0Y3BfYmluZF9oYXNoYnVja2V0ICpoZWFkOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXN0cnVjdCB0Y3BfYmluZF9idWNrZXQgKnRiOworCWludCByZXQ7CisKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJaWYgKCFzbnVtKSB7CisJCWludCBsb3cgPSBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVswXTsKKwkJaW50IGhpZ2ggPSBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVsxXTsKKwkJaW50IHJlbWFpbmluZyA9IChoaWdoIC0gbG93KSArIDE7CisJCWludCByb3ZlcjsKKworCQlzcGluX2xvY2soJnRjcF9wb3J0YWxsb2NfbG9jayk7CisJCXJvdmVyID0gdGNwX3BvcnRfcm92ZXI7CisJCWRvIHsKKwkJCXJvdmVyKys7CisJCQlpZiAocm92ZXIgPCBsb3cgfHwgcm92ZXIgPiBoaWdoKQorCQkJCXJvdmVyID0gbG93OworCQkJaGVhZCA9ICZ0Y3BfYmhhc2hbdGNwX2JoYXNoZm4ocm92ZXIpXTsKKwkJCXNwaW5fbG9jaygmaGVhZC0+bG9jayk7CisJCQl0Yl9mb3JfZWFjaCh0Yiwgbm9kZSwgJmhlYWQtPmNoYWluKQorCQkJCWlmICh0Yi0+cG9ydCA9PSByb3ZlcikKKwkJCQkJZ290byBuZXh0OworCQkJYnJlYWs7CisJCW5leHQ6CisJCQlzcGluX3VubG9jaygmaGVhZC0+bG9jayk7CisJCX0gd2hpbGUgKC0tcmVtYWluaW5nID4gMCk7CisJCXRjcF9wb3J0X3JvdmVyID0gcm92ZXI7CisJCXNwaW5fdW5sb2NrKCZ0Y3BfcG9ydGFsbG9jX2xvY2spOworCisJCS8qIEV4aGF1c3RlZCBsb2NhbCBwb3J0IHJhbmdlIGR1cmluZyBzZWFyY2g/ICovCisJCXJldCA9IDE7CisJCWlmIChyZW1haW5pbmcgPD0gMCkKKwkJCWdvdG8gZmFpbDsKKworCQkvKiBPSywgaGVyZSBpcyB0aGUgb25lIHdlIHdpbGwgdXNlLiAgSEVBRCBpcworCQkgKiBub24tTlVMTCBhbmQgd2UgaG9sZCBpdCdzIG11dGV4LgorCQkgKi8KKwkJc251bSA9IHJvdmVyOworCX0gZWxzZSB7CisJCWhlYWQgPSAmdGNwX2JoYXNoW3RjcF9iaGFzaGZuKHNudW0pXTsKKwkJc3Bpbl9sb2NrKCZoZWFkLT5sb2NrKTsKKwkJdGJfZm9yX2VhY2godGIsIG5vZGUsICZoZWFkLT5jaGFpbikKKwkJCWlmICh0Yi0+cG9ydCA9PSBzbnVtKQorCQkJCWdvdG8gdGJfZm91bmQ7CisJfQorCXRiID0gTlVMTDsKKwlnb3RvIHRiX25vdF9mb3VuZDsKK3RiX2ZvdW5kOgorCWlmICghaGxpc3RfZW1wdHkoJnRiLT5vd25lcnMpKSB7CisJCWlmIChzay0+c2tfcmV1c2UgPiAxKQorCQkJZ290byBzdWNjZXNzOworCQlpZiAodGItPmZhc3RyZXVzZSA+IDAgJiYKKwkJICAgIHNrLT5za19yZXVzZSAmJiBzay0+c2tfc3RhdGUgIT0gVENQX0xJU1RFTikgeworCQkJZ290byBzdWNjZXNzOworCQl9IGVsc2UgeworCQkJcmV0ID0gMTsKKwkJCWlmICh0Y3BfYmluZF9jb25mbGljdChzaywgdGIpKQorCQkJCWdvdG8gZmFpbF91bmxvY2s7CisJCX0KKwl9Cit0Yl9ub3RfZm91bmQ6CisJcmV0ID0gMTsKKwlpZiAoIXRiICYmICh0YiA9IHRjcF9idWNrZXRfY3JlYXRlKGhlYWQsIHNudW0pKSA9PSBOVUxMKQorCQlnb3RvIGZhaWxfdW5sb2NrOworCWlmIChobGlzdF9lbXB0eSgmdGItPm93bmVycykpIHsKKwkJaWYgKHNrLT5za19yZXVzZSAmJiBzay0+c2tfc3RhdGUgIT0gVENQX0xJU1RFTikKKwkJCXRiLT5mYXN0cmV1c2UgPSAxOworCQllbHNlCisJCQl0Yi0+ZmFzdHJldXNlID0gMDsKKwl9IGVsc2UgaWYgKHRiLT5mYXN0cmV1c2UgJiYKKwkJICAgKCFzay0+c2tfcmV1c2UgfHwgc2stPnNrX3N0YXRlID09IFRDUF9MSVNURU4pKQorCQl0Yi0+ZmFzdHJldXNlID0gMDsKK3N1Y2Nlc3M6CisJaWYgKCF0Y3Bfc2soc2spLT5iaW5kX2hhc2gpCisJCXRjcF9iaW5kX2hhc2goc2ssIHRiLCBzbnVtKTsKKwlCVUdfVFJBUCh0Y3Bfc2soc2spLT5iaW5kX2hhc2ggPT0gdGIpOworIAlyZXQgPSAwOworCitmYWlsX3VubG9jazoKKwlzcGluX3VubG9jaygmaGVhZC0+bG9jayk7CitmYWlsOgorCWxvY2FsX2JoX2VuYWJsZSgpOworCXJldHVybiByZXQ7Cit9CisKKy8qIEdldCByaWQgb2YgYW55IHJlZmVyZW5jZXMgdG8gYSBsb2NhbCBwb3J0IGhlbGQgYnkgdGhlCisgKiBnaXZlbiBzb2NrLgorICovCitzdGF0aWMgdm9pZCBfX3RjcF9wdXRfcG9ydChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCXN0cnVjdCB0Y3BfYmluZF9oYXNoYnVja2V0ICpoZWFkID0gJnRjcF9iaGFzaFt0Y3BfYmhhc2hmbihpbmV0LT5udW0pXTsKKwlzdHJ1Y3QgdGNwX2JpbmRfYnVja2V0ICp0YjsKKworCXNwaW5fbG9jaygmaGVhZC0+bG9jayk7CisJdGIgPSB0Y3Bfc2soc2spLT5iaW5kX2hhc2g7CisJX19za19kZWxfYmluZF9ub2RlKHNrKTsKKwl0Y3Bfc2soc2spLT5iaW5kX2hhc2ggPSBOVUxMOworCWluZXQtPm51bSA9IDA7CisJdGNwX2J1Y2tldF9kZXN0cm95KHRiKTsKKwlzcGluX3VubG9jaygmaGVhZC0+bG9jayk7Cit9CisKK3ZvaWQgdGNwX3B1dF9wb3J0KHN0cnVjdCBzb2NrICpzaykKK3sKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJX190Y3BfcHV0X3BvcnQoc2spOworCWxvY2FsX2JoX2VuYWJsZSgpOworfQorCisvKiBUaGlzIGxvY2sgd2l0aG91dCBXUV9GTEFHX0VYQ0xVU0lWRSBpcyBnb29kIG9uIFVQIGFuZCBpdCBjYW4gYmUgdmVyeSBiYWQgb24gU01QLgorICogTG9vaywgd2hlbiBzZXZlcmFsIHdyaXRlcnMgc2xlZXAgYW5kIHJlYWRlciB3YWtlcyB0aGVtIHVwLCBhbGwgYnV0IG9uZQorICogaW1tZWRpYXRlbHkgaGl0IHdyaXRlIGxvY2sgYW5kIGdyYWIgYWxsIHRoZSBjcHVzLiBFeGNsdXNpdmUgc2xlZXAgc29sdmVzCisgKiB0aGlzLCBfYnV0XyByZW1lbWJlciwgaXQgYWRkcyB1c2VsZXNzIHdvcmsgb24gVVAgbWFjaGluZXMgKHdha2UgdXAgZWFjaAorICogZXhjbHVzaXZlIGxvY2sgcmVsZWFzZSkuIEl0IHNob3VsZCBiZSBpZmRlZmVkIHJlYWxseS4KKyAqLworCit2b2lkIHRjcF9saXN0ZW5fd2xvY2sodm9pZCkKK3sKKwl3cml0ZV9sb2NrKCZ0Y3BfbGhhc2hfbG9jayk7CisKKwlpZiAoYXRvbWljX3JlYWQoJnRjcF9saGFzaF91c2VycykpIHsKKwkJREVGSU5FX1dBSVQod2FpdCk7CisKKwkJZm9yICg7OykgeworCQkJcHJlcGFyZV90b193YWl0X2V4Y2x1c2l2ZSgmdGNwX2xoYXNoX3dhaXQsCisJCQkJCQkmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJaWYgKCFhdG9taWNfcmVhZCgmdGNwX2xoYXNoX3VzZXJzKSkKKwkJCQlicmVhazsKKwkJCXdyaXRlX3VubG9ja19iaCgmdGNwX2xoYXNoX2xvY2spOworCQkJc2NoZWR1bGUoKTsKKwkJCXdyaXRlX2xvY2tfYmgoJnRjcF9saGFzaF9sb2NrKTsKKwkJfQorCisJCWZpbmlzaF93YWl0KCZ0Y3BfbGhhc2hfd2FpdCwgJndhaXQpOworCX0KK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3RjcF92NF9oYXNoKHN0cnVjdCBzb2NrICpzaywgY29uc3QgaW50IGxpc3Rlbl9wb3NzaWJsZSkKK3sKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqbGlzdDsKKwlyd2xvY2tfdCAqbG9jazsKKworCUJVR19UUkFQKHNrX3VuaGFzaGVkKHNrKSk7CisJaWYgKGxpc3Rlbl9wb3NzaWJsZSAmJiBzay0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTikgeworCQlsaXN0ID0gJnRjcF9saXN0ZW5pbmdfaGFzaFt0Y3Bfc2tfbGlzdGVuX2hhc2hmbihzayldOworCQlsb2NrID0gJnRjcF9saGFzaF9sb2NrOworCQl0Y3BfbGlzdGVuX3dsb2NrKCk7CisJfSBlbHNlIHsKKwkJbGlzdCA9ICZ0Y3BfZWhhc2hbKHNrLT5za19oYXNoZW50ID0gdGNwX3NrX2hhc2hmbihzaykpXS5jaGFpbjsKKwkJbG9jayA9ICZ0Y3BfZWhhc2hbc2stPnNrX2hhc2hlbnRdLmxvY2s7CisJCXdyaXRlX2xvY2sobG9jayk7CisJfQorCV9fc2tfYWRkX25vZGUoc2ssIGxpc3QpOworCXNvY2tfcHJvdF9pbmNfdXNlKHNrLT5za19wcm90KTsKKwl3cml0ZV91bmxvY2sobG9jayk7CisJaWYgKGxpc3Rlbl9wb3NzaWJsZSAmJiBzay0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTikKKwkJd2FrZV91cCgmdGNwX2xoYXNoX3dhaXQpOworfQorCitzdGF0aWMgdm9pZCB0Y3BfdjRfaGFzaChzdHJ1Y3Qgc29jayAqc2spCit7CisJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfQ0xPU0UpIHsKKwkJbG9jYWxfYmhfZGlzYWJsZSgpOworCQlfX3RjcF92NF9oYXNoKHNrLCAxKTsKKwkJbG9jYWxfYmhfZW5hYmxlKCk7CisJfQorfQorCit2b2lkIHRjcF91bmhhc2goc3RydWN0IHNvY2sgKnNrKQoreworCXJ3bG9ja190ICpsb2NrOworCisJaWYgKHNrX3VuaGFzaGVkKHNrKSkKKwkJZ290byBlbmRlOworCisJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOKSB7CisJCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwkJdGNwX2xpc3Rlbl93bG9jaygpOworCQlsb2NrID0gJnRjcF9saGFzaF9sb2NrOworCX0gZWxzZSB7CisJCXN0cnVjdCB0Y3BfZWhhc2hfYnVja2V0ICpoZWFkID0gJnRjcF9laGFzaFtzay0+c2tfaGFzaGVudF07CisJCWxvY2sgPSAmaGVhZC0+bG9jazsKKwkJd3JpdGVfbG9ja19iaCgmaGVhZC0+bG9jayk7CisJfQorCisJaWYgKF9fc2tfZGVsX25vZGVfaW5pdChzaykpCisJCXNvY2tfcHJvdF9kZWNfdXNlKHNrLT5za19wcm90KTsKKwl3cml0ZV91bmxvY2tfYmgobG9jayk7CisKKyBlbmRlOgorCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTikKKwkJd2FrZV91cCgmdGNwX2xoYXNoX3dhaXQpOworfQorCisvKiBEb24ndCBpbmxpbmUgdGhpcyBjcnVmdC4gIEhlcmUgYXJlIHNvbWUgbmljZSBwcm9wZXJ0aWVzIHRvCisgKiBleHBsb2l0IGhlcmUuICBUaGUgQlNEIEFQSSBkb2VzIG5vdCBhbGxvdyBhIGxpc3RlbmluZyBUQ1AKKyAqIHRvIHNwZWNpZnkgdGhlIHJlbW90ZSBwb3J0IG5vciB0aGUgcmVtb3RlIGFkZHJlc3MgZm9yIHRoZQorICogY29ubmVjdGlvbi4gIFNvIGFsd2F5cyBhc3N1bWUgdGhvc2UgYXJlIGJvdGggd2lsZGNhcmRlZAorICogZHVyaW5nIHRoZSBzZWFyY2ggc2luY2UgdGhleSBjYW4gbmV2ZXIgYmUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgc3RydWN0IHNvY2sgKl9fdGNwX3Y0X2xvb2t1cF9saXN0ZW5lcihzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCwgdTMyIGRhZGRyLAorCQkJCQkgICAgIHVuc2lnbmVkIHNob3J0IGhudW0sIGludCBkaWYpCit7CisJc3RydWN0IHNvY2sgKnJlc3VsdCA9IE5VTEwsICpzazsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlpbnQgc2NvcmUsIGhpc2NvcmU7CisKKwloaXNjb3JlPS0xOworCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCBoZWFkKSB7CisJCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKworCQlpZiAoaW5ldC0+bnVtID09IGhudW0gJiYgIWlwdjZfb25seV9zb2NrKHNrKSkgeworCQkJX191MzIgcmN2X3NhZGRyID0gaW5ldC0+cmN2X3NhZGRyOworCisJCQlzY29yZSA9IChzay0+c2tfZmFtaWx5ID09IFBGX0lORVQgPyAxIDogMCk7CisJCQlpZiAocmN2X3NhZGRyKSB7CisJCQkJaWYgKHJjdl9zYWRkciAhPSBkYWRkcikKKwkJCQkJY29udGludWU7CisJCQkJc2NvcmUrPTI7CisJCQl9CisJCQlpZiAoc2stPnNrX2JvdW5kX2Rldl9pZikgeworCQkJCWlmIChzay0+c2tfYm91bmRfZGV2X2lmICE9IGRpZikKKwkJCQkJY29udGludWU7CisJCQkJc2NvcmUrPTI7CisJCQl9CisJCQlpZiAoc2NvcmUgPT0gNSkKKwkJCQlyZXR1cm4gc2s7CisJCQlpZiAoc2NvcmUgPiBoaXNjb3JlKSB7CisJCQkJaGlzY29yZSA9IHNjb3JlOworCQkJCXJlc3VsdCA9IHNrOworCQkJfQorCQl9CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIE9wdGltaXplIHRoZSBjb21tb24gbGlzdGVuZXIgY2FzZS4gKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2sgKnRjcF92NF9sb29rdXBfbGlzdGVuZXIodTMyIGRhZGRyLAorCQl1bnNpZ25lZCBzaG9ydCBobnVtLCBpbnQgZGlmKQoreworCXN0cnVjdCBzb2NrICpzayA9IE5VTEw7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CisKKwlyZWFkX2xvY2soJnRjcF9saGFzaF9sb2NrKTsKKwloZWFkID0gJnRjcF9saXN0ZW5pbmdfaGFzaFt0Y3BfbGhhc2hmbihobnVtKV07CisJaWYgKCFobGlzdF9lbXB0eShoZWFkKSkgeworCQlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zaygoc2sgPSBfX3NrX2hlYWQoaGVhZCkpKTsKKworCQlpZiAoaW5ldC0+bnVtID09IGhudW0gJiYgIXNrLT5za19ub2RlLm5leHQgJiYKKwkJICAgICghaW5ldC0+cmN2X3NhZGRyIHx8IGluZXQtPnJjdl9zYWRkciA9PSBkYWRkcikgJiYKKwkJICAgIChzay0+c2tfZmFtaWx5ID09IFBGX0lORVQgfHwgIWlwdjZfb25seV9zb2NrKHNrKSkgJiYKKwkJICAgICFzay0+c2tfYm91bmRfZGV2X2lmKQorCQkJZ290byBzaGVycnlfY2FjaGU7CisJCXNrID0gX190Y3BfdjRfbG9va3VwX2xpc3RlbmVyKGhlYWQsIGRhZGRyLCBobnVtLCBkaWYpOworCX0KKwlpZiAoc2spIHsKK3NoZXJyeV9jYWNoZToKKwkJc29ja19ob2xkKHNrKTsKKwl9CisJcmVhZF91bmxvY2soJnRjcF9saGFzaF9sb2NrKTsKKwlyZXR1cm4gc2s7Cit9CisKKy8qIFNvY2tldHMgaW4gVENQX0NMT1NFIHN0YXRlIGFyZSBfYWx3YXlzXyB0YWtlbiBvdXQgb2YgdGhlIGhhc2gsIHNvCisgKiB3ZSBuZWVkIG5vdCBjaGVjayBpdCBmb3IgVENQIGxvb2t1cHMgYW55bW9yZSwgdGhhbmtzIEFsZXhleS4gLURhdmVNCisgKgorICogTG9jYWwgQkggbXVzdCBiZSBkaXNhYmxlZCBoZXJlLgorICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2sgKl9fdGNwX3Y0X2xvb2t1cF9lc3RhYmxpc2hlZCh1MzIgc2FkZHIsIHUxNiBzcG9ydCwKKwkJCQkJCSAgICAgICB1MzIgZGFkZHIsIHUxNiBobnVtLAorCQkJCQkJICAgICAgIGludCBkaWYpCit7CisJc3RydWN0IHRjcF9laGFzaF9idWNrZXQgKmhlYWQ7CisJVENQX1Y0X0FERFJfQ09PS0lFKGFjb29raWUsIHNhZGRyLCBkYWRkcikKKwlfX3UzMiBwb3J0cyA9IFRDUF9DT01CSU5FRF9QT1JUUyhzcG9ydCwgaG51bSk7CisJc3RydWN0IHNvY2sgKnNrOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCS8qIE9wdGltaXplIGhlcmUgZm9yIGRpcmVjdCBoaXQsIG9ubHkgbGlzdGVuaW5nIGNvbm5lY3Rpb25zIGNhbgorCSAqIGhhdmUgd2lsZGNhcmRzIGFueXdheXMuCisJICovCisJaW50IGhhc2ggPSB0Y3BfaGFzaGZuKGRhZGRyLCBobnVtLCBzYWRkciwgc3BvcnQpOworCWhlYWQgPSAmdGNwX2VoYXNoW2hhc2hdOworCXJlYWRfbG9jaygmaGVhZC0+bG9jayk7CisJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZoZWFkLT5jaGFpbikgeworCQlpZiAoVENQX0lQVjRfTUFUQ0goc2ssIGFjb29raWUsIHNhZGRyLCBkYWRkciwgcG9ydHMsIGRpZikpCisJCQlnb3RvIGhpdDsgLyogWW91IHN1bmsgbXkgYmF0dGxlc2hpcCEgKi8KKwl9CisKKwkvKiBNdXN0IGNoZWNrIGZvciBhIFRJTUVfV0FJVCdlciBiZWZvcmUgZ29pbmcgdG8gbGlzdGVuZXIgaGFzaC4gKi8KKwlza19mb3JfZWFjaChzaywgbm9kZSwgJihoZWFkICsgdGNwX2VoYXNoX3NpemUpLT5jaGFpbikgeworCQlpZiAoVENQX0lQVjRfVFdfTUFUQ0goc2ssIGFjb29raWUsIHNhZGRyLCBkYWRkciwgcG9ydHMsIGRpZikpCisJCQlnb3RvIGhpdDsKKwl9CisJc2sgPSBOVUxMOworb3V0OgorCXJlYWRfdW5sb2NrKCZoZWFkLT5sb2NrKTsKKwlyZXR1cm4gc2s7CitoaXQ6CisJc29ja19ob2xkKHNrKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29jayAqX190Y3BfdjRfbG9va3VwKHUzMiBzYWRkciwgdTE2IHNwb3J0LAorCQkJCQkgICB1MzIgZGFkZHIsIHUxNiBobnVtLCBpbnQgZGlmKQoreworCXN0cnVjdCBzb2NrICpzayA9IF9fdGNwX3Y0X2xvb2t1cF9lc3RhYmxpc2hlZChzYWRkciwgc3BvcnQsCisJCQkJCQkgICAgICBkYWRkciwgaG51bSwgZGlmKTsKKworCXJldHVybiBzayA/IDogdGNwX3Y0X2xvb2t1cF9saXN0ZW5lcihkYWRkciwgaG51bSwgZGlmKTsKK30KKworaW5saW5lIHN0cnVjdCBzb2NrICp0Y3BfdjRfbG9va3VwKHUzMiBzYWRkciwgdTE2IHNwb3J0LCB1MzIgZGFkZHIsCisJCQkJICB1MTYgZHBvcnQsIGludCBkaWYpCit7CisJc3RydWN0IHNvY2sgKnNrOworCisJbG9jYWxfYmhfZGlzYWJsZSgpOworCXNrID0gX190Y3BfdjRfbG9va3VwKHNhZGRyLCBzcG9ydCwgZGFkZHIsIG50b2hzKGRwb3J0KSwgZGlmKTsKKwlsb2NhbF9iaF9lbmFibGUoKTsKKworCXJldHVybiBzazsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwodGNwX3Y0X2xvb2t1cCk7CisKK3N0YXRpYyBpbmxpbmUgX191MzIgdGNwX3Y0X2luaXRfc2VxdWVuY2Uoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBzZWN1cmVfdGNwX3NlcXVlbmNlX251bWJlcihza2ItPm5oLmlwaC0+ZGFkZHIsCisJCQkJCSAgc2tiLT5uaC5pcGgtPnNhZGRyLAorCQkJCQkgIHNrYi0+aC50aC0+ZGVzdCwKKwkJCQkJICBza2ItPmgudGgtPnNvdXJjZSk7Cit9CisKKy8qIGNhbGxlZCB3aXRoIGxvY2FsIGJoIGRpc2FibGVkICovCitzdGF0aWMgaW50IF9fdGNwX3Y0X2NoZWNrX2VzdGFibGlzaGVkKHN0cnVjdCBzb2NrICpzaywgX191MTYgbHBvcnQsCisJCQkJICAgICAgc3RydWN0IHRjcF90d19idWNrZXQgKip0d3ApCit7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCXUzMiBkYWRkciA9IGluZXQtPnJjdl9zYWRkcjsKKwl1MzIgc2FkZHIgPSBpbmV0LT5kYWRkcjsKKwlpbnQgZGlmID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKKwlUQ1BfVjRfQUREUl9DT09LSUUoYWNvb2tpZSwgc2FkZHIsIGRhZGRyKQorCV9fdTMyIHBvcnRzID0gVENQX0NPTUJJTkVEX1BPUlRTKGluZXQtPmRwb3J0LCBscG9ydCk7CisJaW50IGhhc2ggPSB0Y3BfaGFzaGZuKGRhZGRyLCBscG9ydCwgc2FkZHIsIGluZXQtPmRwb3J0KTsKKwlzdHJ1Y3QgdGNwX2VoYXNoX2J1Y2tldCAqaGVhZCA9ICZ0Y3BfZWhhc2hbaGFzaF07CisJc3RydWN0IHNvY2sgKnNrMjsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgdGNwX3R3X2J1Y2tldCAqdHc7CisKKwl3cml0ZV9sb2NrKCZoZWFkLT5sb2NrKTsKKworCS8qIENoZWNrIFRJTUUtV0FJVCBzb2NrZXRzIGZpcnN0LiAqLworCXNrX2Zvcl9lYWNoKHNrMiwgbm9kZSwgJihoZWFkICsgdGNwX2VoYXNoX3NpemUpLT5jaGFpbikgeworCQl0dyA9IChzdHJ1Y3QgdGNwX3R3X2J1Y2tldCAqKXNrMjsKKworCQlpZiAoVENQX0lQVjRfVFdfTUFUQ0goc2syLCBhY29va2llLCBzYWRkciwgZGFkZHIsIHBvcnRzLCBkaWYpKSB7CisJCQlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKworCQkJLyogV2l0aCBQQVdTLCBpdCBpcyBzYWZlIGZyb20gdGhlIHZpZXdwb2ludAorCQkJICAgb2YgZGF0YSBpbnRlZ3JpdHkuIEV2ZW4gd2l0aG91dCBQQVdTIGl0CisJCQkgICBpcyBzYWZlIHByb3ZpZGVkIHNlcXVlbmNlIHNwYWNlcyBkbyBub3QKKwkJCSAgIG92ZXJsYXAgaS5lLiBhdCBkYXRhIHJhdGVzIDw9IDgwTWJpdC9zZWMuCisKKwkJCSAgIEFjdHVhbGx5LCB0aGUgaWRlYSBpcyBjbG9zZSB0byBWSidzIG9uZSwKKwkJCSAgIG9ubHkgdGltZXN0YW1wIGNhY2hlIGlzIGhlbGQgbm90IHBlciBob3N0LAorCQkJICAgYnV0IHBlciBwb3J0IHBhaXIgYW5kIFRXIGJ1Y2tldCBpcyB1c2VkCisJCQkgICBhcyBzdGF0ZSBob2xkZXIuCisKKwkJCSAgIElmIFRXIGJ1Y2tldCBoYXMgYmVlbiBhbHJlYWR5IGRlc3Ryb3llZCB3ZQorCQkJICAgZmFsbCBiYWNrIHRvIFZKJ3Mgc2NoZW1lIGFuZCB1c2UgaW5pdGlhbAorCQkJICAgdGltZXN0YW1wIHJldHJpZXZlZCBmcm9tIHBlZXIgdGFibGUuCisJCQkgKi8KKwkJCWlmICh0dy0+dHdfdHNfcmVjZW50X3N0YW1wICYmCisJCQkgICAgKCF0d3AgfHwgKHN5c2N0bF90Y3BfdHdfcmV1c2UgJiYKKwkJCQkgICAgICB4dGltZS50dl9zZWMgLQorCQkJCSAgICAgIHR3LT50d190c19yZWNlbnRfc3RhbXAgPiAxKSkpIHsKKwkJCQlpZiAoKHRwLT53cml0ZV9zZXEgPQorCQkJCQkJdHctPnR3X3NuZF9ueHQgKyA2NTUzNSArIDIpID09IDApCisJCQkJCXRwLT53cml0ZV9zZXEgPSAxOworCQkJCXRwLT5yeF9vcHQudHNfcmVjZW50CSAgID0gdHctPnR3X3RzX3JlY2VudDsKKwkJCQl0cC0+cnhfb3B0LnRzX3JlY2VudF9zdGFtcCA9IHR3LT50d190c19yZWNlbnRfc3RhbXA7CisJCQkJc29ja19ob2xkKHNrMik7CisJCQkJZ290byB1bmlxdWU7CisJCQl9IGVsc2UKKwkJCQlnb3RvIG5vdF91bmlxdWU7CisJCX0KKwl9CisJdHcgPSBOVUxMOworCisJLyogQW5kIGVzdGFibGlzaGVkIHBhcnQuLi4gKi8KKwlza19mb3JfZWFjaChzazIsIG5vZGUsICZoZWFkLT5jaGFpbikgeworCQlpZiAoVENQX0lQVjRfTUFUQ0goc2syLCBhY29va2llLCBzYWRkciwgZGFkZHIsIHBvcnRzLCBkaWYpKQorCQkJZ290byBub3RfdW5pcXVlOworCX0KKwordW5pcXVlOgorCS8qIE11c3QgcmVjb3JkIG51bSBhbmQgc3BvcnQgbm93LiBPdGhlcndpc2Ugd2Ugd2lsbCBzZWUKKwkgKiBpbiBoYXNoIHRhYmxlIHNvY2tldCB3aXRoIGEgZnVubnkgaWRlbnRpdHkuICovCisJaW5ldC0+bnVtID0gbHBvcnQ7CisJaW5ldC0+c3BvcnQgPSBodG9ucyhscG9ydCk7CisJc2stPnNrX2hhc2hlbnQgPSBoYXNoOworCUJVR19UUkFQKHNrX3VuaGFzaGVkKHNrKSk7CisJX19za19hZGRfbm9kZShzaywgJmhlYWQtPmNoYWluKTsKKwlzb2NrX3Byb3RfaW5jX3VzZShzay0+c2tfcHJvdCk7CisJd3JpdGVfdW5sb2NrKCZoZWFkLT5sb2NrKTsKKworCWlmICh0d3ApIHsKKwkJKnR3cCA9IHR3OworCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9USU1FV0FJVFJFQ1lDTEVEKTsKKwl9IGVsc2UgaWYgKHR3KSB7CisJCS8qIFNpbGx5LiBTaG91bGQgaGFzaC1kYW5jZSBpbnN0ZWFkLi4uICovCisJCXRjcF90d19kZXNjaGVkdWxlKHR3KTsKKwkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfVElNRVdBSVRSRUNZQ0xFRCk7CisKKwkJdGNwX3R3X3B1dCh0dyk7CisJfQorCisJcmV0dXJuIDA7CisKK25vdF91bmlxdWU6CisJd3JpdGVfdW5sb2NrKCZoZWFkLT5sb2NrKTsKKwlyZXR1cm4gLUVBRERSTk9UQVZBSUw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGNvbm5lY3RfcG9ydF9vZmZzZXQoY29uc3Qgc3RydWN0IHNvY2sgKnNrKQoreworCWNvbnN0IHN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKworCXJldHVybiBzZWN1cmVfdGNwX3BvcnRfZXBoZW1lcmFsKGluZXQtPnJjdl9zYWRkciwgaW5ldC0+ZGFkZHIsIAorCQkJCQkgaW5ldC0+ZHBvcnQpOworfQorCisvKgorICogQmluZCBhIHBvcnQgZm9yIGEgY29ubmVjdCBvcGVyYXRpb24gYW5kIGhhc2ggaXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHRjcF92NF9oYXNoX2Nvbm5lY3Qoc3RydWN0IHNvY2sgKnNrKQoreworCXVuc2lnbmVkIHNob3J0IHNudW0gPSBpbmV0X3NrKHNrKS0+bnVtOworIAlzdHJ1Y3QgdGNwX2JpbmRfaGFzaGJ1Y2tldCAqaGVhZDsKKyAJc3RydWN0IHRjcF9iaW5kX2J1Y2tldCAqdGI7CisJaW50IHJldDsKKworIAlpZiAoIXNudW0pIHsKKyAJCWludCBsb3cgPSBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVswXTsKKyAJCWludCBoaWdoID0gc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMV07CisJCWludCByYW5nZSA9IGhpZ2ggLSBsb3c7CisgCQlpbnQgaTsKKwkJaW50IHBvcnQ7CisJCXN0YXRpYyB1MzIgaGludDsKKwkJdTMyIG9mZnNldCA9IGhpbnQgKyBjb25uZWN0X3BvcnRfb2Zmc2V0KHNrKTsKKwkJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisgCQlzdHJ1Y3QgdGNwX3R3X2J1Y2tldCAqdHcgPSBOVUxMOworCisgCQlsb2NhbF9iaF9kaXNhYmxlKCk7CisJCWZvciAoaSA9IDE7IGkgPD0gcmFuZ2U7IGkrKykgeworCQkJcG9ydCA9IGxvdyArIChpICsgb2Zmc2V0KSAlIHJhbmdlOworIAkJCWhlYWQgPSAmdGNwX2JoYXNoW3RjcF9iaGFzaGZuKHBvcnQpXTsKKyAJCQlzcGluX2xvY2soJmhlYWQtPmxvY2spOworCisgCQkJLyogRG9lcyBub3QgYm90aGVyIHdpdGggcmN2X3NhZGRyIGNoZWNrcywKKyAJCQkgKiBiZWNhdXNlIHRoZSBlc3RhYmxpc2hlZCBjaGVjayBpcyBhbHJlYWR5CisgCQkJICogdW5pcXVlIGVub3VnaC4KKyAJCQkgKi8KKwkJCXRiX2Zvcl9lYWNoKHRiLCBub2RlLCAmaGVhZC0+Y2hhaW4pIHsKKyAJCQkJaWYgKHRiLT5wb3J0ID09IHBvcnQpIHsKKyAJCQkJCUJVR19UUkFQKCFobGlzdF9lbXB0eSgmdGItPm93bmVycykpOworIAkJCQkJaWYgKHRiLT5mYXN0cmV1c2UgPj0gMCkKKyAJCQkJCQlnb3RvIG5leHRfcG9ydDsKKyAJCQkJCWlmICghX190Y3BfdjRfY2hlY2tfZXN0YWJsaXNoZWQoc2ssCisJCQkJCQkJCQlwb3J0LAorCQkJCQkJCQkJJnR3KSkKKyAJCQkJCQlnb3RvIG9rOworIAkJCQkJZ290byBuZXh0X3BvcnQ7CisgCQkJCX0KKyAJCQl9CisKKyAJCQl0YiA9IHRjcF9idWNrZXRfY3JlYXRlKGhlYWQsIHBvcnQpOworIAkJCWlmICghdGIpIHsKKyAJCQkJc3Bpbl91bmxvY2soJmhlYWQtPmxvY2spOworIAkJCQlicmVhazsKKyAJCQl9CisgCQkJdGItPmZhc3RyZXVzZSA9IC0xOworIAkJCWdvdG8gb2s7CisKKyAJCW5leHRfcG9ydDoKKyAJCQlzcGluX3VubG9jaygmaGVhZC0+bG9jayk7CisgCQl9CisgCQlsb2NhbF9iaF9lbmFibGUoKTsKKworIAkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCitvazoKKwkJaGludCArPSBpOworCisgCQkvKiBIZWFkIGxvY2sgc3RpbGwgaGVsZCBhbmQgYmgncyBkaXNhYmxlZCAqLworIAkJdGNwX2JpbmRfaGFzaChzaywgdGIsIHBvcnQpOworCQlpZiAoc2tfdW5oYXNoZWQoc2spKSB7CisgCQkJaW5ldF9zayhzayktPnNwb3J0ID0gaHRvbnMocG9ydCk7CisgCQkJX190Y3BfdjRfaGFzaChzaywgMCk7CisgCQl9CisgCQlzcGluX3VubG9jaygmaGVhZC0+bG9jayk7CisKKyAJCWlmICh0dykgeworIAkJCXRjcF90d19kZXNjaGVkdWxlKHR3KTsKKyAJCQl0Y3BfdHdfcHV0KHR3KTsKKyAJCX0KKworCQlyZXQgPSAwOworCQlnb3RvIG91dDsKKyAJfQorCisgCWhlYWQgID0gJnRjcF9iaGFzaFt0Y3BfYmhhc2hmbihzbnVtKV07CisgCXRiICA9IHRjcF9zayhzayktPmJpbmRfaGFzaDsKKwlzcGluX2xvY2tfYmgoJmhlYWQtPmxvY2spOworCWlmIChza19oZWFkKCZ0Yi0+b3duZXJzKSA9PSBzayAmJiAhc2stPnNrX2JpbmRfbm9kZS5uZXh0KSB7CisJCV9fdGNwX3Y0X2hhc2goc2ssIDApOworCQlzcGluX3VubG9ja19iaCgmaGVhZC0+bG9jayk7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrKCZoZWFkLT5sb2NrKTsKKwkJLyogTm8gZGVmaW5pdGUgYW5zd2VyLi4uIFdhbGsgdG8gZXN0YWJsaXNoZWQgaGFzaCB0YWJsZSAqLworCQlyZXQgPSBfX3RjcF92NF9jaGVja19lc3RhYmxpc2hlZChzaywgc251bSwgTlVMTCk7CitvdXQ6CisJCWxvY2FsX2JoX2VuYWJsZSgpOworCQlyZXR1cm4gcmV0OworCX0KK30KKworLyogVGhpcyB3aWxsIGluaXRpYXRlIGFuIG91dGdvaW5nIGNvbm5lY3Rpb24uICovCitpbnQgdGNwX3Y0X2Nvbm5lY3Qoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLCBpbnQgYWRkcl9sZW4pCit7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqdXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKil1YWRkcjsKKwlzdHJ1Y3QgcnRhYmxlICpydDsKKwl1MzIgZGFkZHIsIG5leHRob3A7CisJaW50IHRtcDsKKwlpbnQgZXJyOworCisJaWYgKGFkZHJfbGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHVzaW4tPnNpbl9mYW1pbHkgIT0gQUZfSU5FVCkKKwkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisKKwluZXh0aG9wID0gZGFkZHIgPSB1c2luLT5zaW5fYWRkci5zX2FkZHI7CisJaWYgKGluZXQtPm9wdCAmJiBpbmV0LT5vcHQtPnNycikgeworCQlpZiAoIWRhZGRyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW5leHRob3AgPSBpbmV0LT5vcHQtPmZhZGRyOworCX0KKworCXRtcCA9IGlwX3JvdXRlX2Nvbm5lY3QoJnJ0LCBuZXh0aG9wLCBpbmV0LT5zYWRkciwKKwkJCSAgICAgICBSVF9DT05OX0ZMQUdTKHNrKSwgc2stPnNrX2JvdW5kX2Rldl9pZiwKKwkJCSAgICAgICBJUFBST1RPX1RDUCwKKwkJCSAgICAgICBpbmV0LT5zcG9ydCwgdXNpbi0+c2luX3BvcnQsIHNrKTsKKwlpZiAodG1wIDwgMCkKKwkJcmV0dXJuIHRtcDsKKworCWlmIChydC0+cnRfZmxhZ3MgJiAoUlRDRl9NVUxUSUNBU1QgfCBSVENGX0JST0FEQ0FTVCkpIHsKKwkJaXBfcnRfcHV0KHJ0KTsKKwkJcmV0dXJuIC1FTkVUVU5SRUFDSDsKKwl9CisKKwlpZiAoIWluZXQtPm9wdCB8fCAhaW5ldC0+b3B0LT5zcnIpCisJCWRhZGRyID0gcnQtPnJ0X2RzdDsKKworCWlmICghaW5ldC0+c2FkZHIpCisJCWluZXQtPnNhZGRyID0gcnQtPnJ0X3NyYzsKKwlpbmV0LT5yY3Zfc2FkZHIgPSBpbmV0LT5zYWRkcjsKKworCWlmICh0cC0+cnhfb3B0LnRzX3JlY2VudF9zdGFtcCAmJiBpbmV0LT5kYWRkciAhPSBkYWRkcikgeworCQkvKiBSZXNldCBpbmhlcml0ZWQgc3RhdGUgKi8KKwkJdHAtPnJ4X29wdC50c19yZWNlbnQJICAgPSAwOworCQl0cC0+cnhfb3B0LnRzX3JlY2VudF9zdGFtcCA9IDA7CisJCXRwLT53cml0ZV9zZXEJCSAgID0gMDsKKwl9CisKKwlpZiAoc3lzY3RsX3RjcF90d19yZWN5Y2xlICYmCisJICAgICF0cC0+cnhfb3B0LnRzX3JlY2VudF9zdGFtcCAmJiBydC0+cnRfZHN0ID09IGRhZGRyKSB7CisJCXN0cnVjdCBpbmV0X3BlZXIgKnBlZXIgPSBydF9nZXRfcGVlcihydCk7CisKKwkJLyogVkoncyBpZGVhLiBXZSBzYXZlIGxhc3QgdGltZXN0YW1wIHNlZW4gZnJvbQorCQkgKiB0aGUgZGVzdGluYXRpb24gaW4gcGVlciB0YWJsZSwgd2hlbiBlbnRlcmluZyBzdGF0ZSBUSU1FLVdBSVQKKwkJICogYW5kIGluaXRpYWxpemUgcnhfb3B0LnRzX3JlY2VudCBmcm9tIGl0LCB3aGVuIHRyeWluZyBuZXcgY29ubmVjdGlvbi4KKwkJICovCisKKwkJaWYgKHBlZXIgJiYgcGVlci0+dGNwX3RzX3N0YW1wICsgVENQX1BBV1NfTVNMID49IHh0aW1lLnR2X3NlYykgeworCQkJdHAtPnJ4X29wdC50c19yZWNlbnRfc3RhbXAgPSBwZWVyLT50Y3BfdHNfc3RhbXA7CisJCQl0cC0+cnhfb3B0LnRzX3JlY2VudCA9IHBlZXItPnRjcF90czsKKwkJfQorCX0KKworCWluZXQtPmRwb3J0ID0gdXNpbi0+c2luX3BvcnQ7CisJaW5ldC0+ZGFkZHIgPSBkYWRkcjsKKworCXRwLT5leHRfaGVhZGVyX2xlbiA9IDA7CisJaWYgKGluZXQtPm9wdCkKKwkJdHAtPmV4dF9oZWFkZXJfbGVuID0gaW5ldC0+b3B0LT5vcHRsZW47CisKKwl0cC0+cnhfb3B0Lm1zc19jbGFtcCA9IDUzNjsKKworCS8qIFNvY2tldCBpZGVudGl0eSBpcyBzdGlsbCB1bmtub3duIChzcG9ydCBtYXkgYmUgemVybykuCisJICogSG93ZXZlciB3ZSBzZXQgc3RhdGUgdG8gU1lOLVNFTlQgYW5kIG5vdCByZWxlYXNpbmcgc29ja2V0CisJICogbG9jayBzZWxlY3Qgc291cmNlIHBvcnQsIGVudGVyIG91cnNlbHZlcyBpbnRvIHRoZSBoYXNoIHRhYmxlcyBhbmQKKwkgKiBjb21wbGV0ZSBpbml0aWFsaXphdGlvbiBhZnRlciB0aGlzLgorCSAqLworCXRjcF9zZXRfc3RhdGUoc2ssIFRDUF9TWU5fU0VOVCk7CisJZXJyID0gdGNwX3Y0X2hhc2hfY29ubmVjdChzayk7CisJaWYgKGVycikKKwkJZ290byBmYWlsdXJlOworCisJZXJyID0gaXBfcm91dGVfbmV3cG9ydHMoJnJ0LCBpbmV0LT5zcG9ydCwgaW5ldC0+ZHBvcnQsIHNrKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWx1cmU7CisKKwkvKiBPSywgbm93IGNvbW1pdCBkZXN0aW5hdGlvbiB0byBzb2NrZXQuICAqLworCV9fc2tfZHN0X3NldChzaywgJnJ0LT51LmRzdCk7CisJdGNwX3Y0X3NldHVwX2NhcHMoc2ssICZydC0+dS5kc3QpOworCisJaWYgKCF0cC0+d3JpdGVfc2VxKQorCQl0cC0+d3JpdGVfc2VxID0gc2VjdXJlX3RjcF9zZXF1ZW5jZV9udW1iZXIoaW5ldC0+c2FkZHIsCisJCQkJCQkJICAgaW5ldC0+ZGFkZHIsCisJCQkJCQkJICAgaW5ldC0+c3BvcnQsCisJCQkJCQkJICAgdXNpbi0+c2luX3BvcnQpOworCisJaW5ldC0+aWQgPSB0cC0+d3JpdGVfc2VxIF4gamlmZmllczsKKworCWVyciA9IHRjcF9jb25uZWN0KHNrKTsKKwlydCA9IE5VTEw7CisJaWYgKGVycikKKwkJZ290byBmYWlsdXJlOworCisJcmV0dXJuIDA7CisKK2ZhaWx1cmU6CisJLyogVGhpcyB1bmhhc2hlcyB0aGUgc29ja2V0IGFuZCByZWxlYXNlcyB0aGUgbG9jYWwgcG9ydCwgaWYgbmVjZXNzYXJ5LiAqLworCXRjcF9zZXRfc3RhdGUoc2ssIFRDUF9DTE9TRSk7CisJaXBfcnRfcHV0KHJ0KTsKKwlzay0+c2tfcm91dGVfY2FwcyA9IDA7CisJaW5ldC0+ZHBvcnQgPSAwOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCB0Y3BfdjRfaWlmKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuICgoc3RydWN0IHJ0YWJsZSAqKXNrYi0+ZHN0KS0+cnRfaWlmOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1MzIgdGNwX3Y0X3N5bnFfaGFzaCh1MzIgcmFkZHIsIHUxNiBycG9ydCwgdTMyIHJuZCkKK3sKKwlyZXR1cm4gKGpoYXNoXzJ3b3JkcyhyYWRkciwgKHUzMikgcnBvcnQsIHJuZCkgJiAoVENQX1NZTlFfSFNJWkUgLSAxKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3Blbl9yZXF1ZXN0ICp0Y3BfdjRfc2VhcmNoX3JlcShzdHJ1Y3QgdGNwX3NvY2sgKnRwLAorCQkJCQkgICAgICBzdHJ1Y3Qgb3Blbl9yZXF1ZXN0ICoqKnByZXZwLAorCQkJCQkgICAgICBfX3UxNiBycG9ydCwKKwkJCQkJICAgICAgX191MzIgcmFkZHIsIF9fdTMyIGxhZGRyKQoreworCXN0cnVjdCB0Y3BfbGlzdGVuX29wdCAqbG9wdCA9IHRwLT5saXN0ZW5fb3B0OworCXN0cnVjdCBvcGVuX3JlcXVlc3QgKnJlcSwgKipwcmV2OworCisJZm9yIChwcmV2ID0gJmxvcHQtPnN5bl90YWJsZVt0Y3BfdjRfc3lucV9oYXNoKHJhZGRyLCBycG9ydCwgbG9wdC0+aGFzaF9ybmQpXTsKKwkgICAgIChyZXEgPSAqcHJldikgIT0gTlVMTDsKKwkgICAgIHByZXYgPSAmcmVxLT5kbF9uZXh0KSB7CisJCWlmIChyZXEtPnJtdF9wb3J0ID09IHJwb3J0ICYmCisJCSAgICByZXEtPmFmLnY0X3JlcS5ybXRfYWRkciA9PSByYWRkciAmJgorCQkgICAgcmVxLT5hZi52NF9yZXEubG9jX2FkZHIgPT0gbGFkZHIgJiYKKwkJICAgIFRDUF9JTkVUX0ZBTUlMWShyZXEtPmNsYXNzLT5mYW1pbHkpKSB7CisJCQlCVUdfVFJBUCghcmVxLT5zayk7CisJCQkqcHJldnAgPSBwcmV2OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmVxOworfQorCitzdGF0aWMgdm9pZCB0Y3BfdjRfc3lucV9hZGQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgb3Blbl9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IHRjcF9saXN0ZW5fb3B0ICpsb3B0ID0gdHAtPmxpc3Rlbl9vcHQ7CisJdTMyIGggPSB0Y3BfdjRfc3lucV9oYXNoKHJlcS0+YWYudjRfcmVxLnJtdF9hZGRyLCByZXEtPnJtdF9wb3J0LCBsb3B0LT5oYXNoX3JuZCk7CisKKwlyZXEtPmV4cGlyZXMgPSBqaWZmaWVzICsgVENQX1RJTUVPVVRfSU5JVDsKKwlyZXEtPnJldHJhbnMgPSAwOworCXJlcS0+c2sgPSBOVUxMOworCXJlcS0+ZGxfbmV4dCA9IGxvcHQtPnN5bl90YWJsZVtoXTsKKworCXdyaXRlX2xvY2soJnRwLT5zeW5fd2FpdF9sb2NrKTsKKwlsb3B0LT5zeW5fdGFibGVbaF0gPSByZXE7CisJd3JpdGVfdW5sb2NrKCZ0cC0+c3luX3dhaXRfbG9jayk7CisKKwl0Y3Bfc3lucV9hZGRlZChzayk7Cit9CisKKworLyoKKyAqIFRoaXMgcm91dGluZSBkb2VzIHBhdGggbXR1IGRpc2NvdmVyeSBhcyBkZWZpbmVkIGluIFJGQzExOTEuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkb19wbXR1X2Rpc2NvdmVyeShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBpcGhkciAqaXBoLAorCQkJCSAgICAgdTMyIG10dSkKK3sKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJLyogV2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIFRDUF9MSVNURU4gYW5kIG9wZW5fcmVxdWVzdHMgKFNZTi1BQ0tzCisJICogc2VuZCBvdXQgYnkgTGludXggYXJlIGFsd2F5cyA8NTc2Ynl0ZXMgc28gdGhleSBzaG91bGQgZ28gdGhyb3VnaAorCSAqIHVuZnJhZ21lbnRlZCkuCisJICovCisJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOKQorCQlyZXR1cm47CisKKwkvKiBXZSBkb24ndCBjaGVjayBpbiB0aGUgZGVzdGVudHJ5IGlmIHBtdHUgZGlzY292ZXJ5IGlzIGZvcmJpZGRlbgorCSAqIG9uIHRoaXMgcm91dGUuIFdlIGp1c3QgYXNzdW1lIHRoYXQgbm8gcGFja2V0X3RvX2JpZyBwYWNrZXRzCisJICogYXJlIHNlbmQgYmFjayB3aGVuIHBtdHUgZGlzY292ZXJ5IGlzIG5vdCBhY3RpdmUuCisgICAgIAkgKiBUaGVyZSBpcyBhIHNtYWxsIHJhY2Ugd2hlbiB0aGUgdXNlciBjaGFuZ2VzIHRoaXMgZmxhZyBpbiB0aGUKKwkgKiByb3V0ZSwgYnV0IEkgdGhpbmsgdGhhdCdzIGFjY2VwdGFibGUuCisJICovCisJaWYgKChkc3QgPSBfX3NrX2RzdF9jaGVjayhzaywgMCkpID09IE5VTEwpCisJCXJldHVybjsKKworCWRzdC0+b3BzLT51cGRhdGVfcG10dShkc3QsIG10dSk7CisKKwkvKiBTb21ldGhpbmcgaXMgYWJvdXQgdG8gYmUgd3JvbmcuLi4gUmVtZW1iZXIgc29mdCBlcnJvcgorCSAqIGZvciB0aGUgY2FzZSwgaWYgdGhpcyBjb25uZWN0aW9uIHdpbGwgbm90IGFibGUgdG8gcmVjb3Zlci4KKwkgKi8KKwlpZiAobXR1IDwgZHN0X210dShkc3QpICYmIGlwX2RvbnRfZnJhZ21lbnQoc2ssIGRzdCkpCisJCXNrLT5za19lcnJfc29mdCA9IEVNU0dTSVpFOworCisJbXR1ID0gZHN0X210dShkc3QpOworCisJaWYgKGluZXQtPnBtdHVkaXNjICE9IElQX1BNVFVESVNDX0RPTlQgJiYKKwkgICAgdHAtPnBtdHVfY29va2llID4gbXR1KSB7CisJCXRjcF9zeW5jX21zcyhzaywgbXR1KTsKKworCQkvKiBSZXNlbmQgdGhlIFRDUCBwYWNrZXQgYmVjYXVzZSBpdCdzCisJCSAqIGNsZWFyIHRoYXQgdGhlIG9sZCBwYWNrZXQgaGFzIGJlZW4KKwkJICogZHJvcHBlZC4gVGhpcyBpcyB0aGUgbmV3ICJmYXN0IiBwYXRoIG10dQorCQkgKiBkaXNjb3ZlcnkuCisJCSAqLworCQl0Y3Bfc2ltcGxlX3JldHJhbnNtaXQoc2spOworCX0gLyogZWxzZSBsZXQgdGhlIHVzdWFsIHJldHJhbnNtaXQgdGltZXIgaGFuZGxlIGl0ICovCit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBJQ01QIG1vZHVsZSB3aGVuIGl0IGdldHMgc29tZQorICogc29ydCBvZiBlcnJvciBjb25kaXRpb24uICBJZiBlcnIgPCAwIHRoZW4gdGhlIHNvY2tldCBzaG91bGQKKyAqIGJlIGNsb3NlZCBhbmQgdGhlIGVycm9yIHJldHVybmVkIHRvIHRoZSB1c2VyLiAgSWYgZXJyID4gMAorICogaXQncyBqdXN0IHRoZSBpY21wIHR5cGUgPDwgOCB8IGljbXAgY29kZS4gIEFmdGVyIGFkanVzdG1lbnQKKyAqIGhlYWRlciBwb2ludHMgdG8gdGhlIGZpcnN0IDggYnl0ZXMgb2YgdGhlIHRjcCBoZWFkZXIuICBXZSBuZWVkCisgKiB0byBmaW5kIHRoZSBhcHByb3ByaWF0ZSBwb3J0LgorICoKKyAqIFRoZSBsb2NraW5nIHN0cmF0ZWd5IHVzZWQgaGVyZSBpcyB2ZXJ5ICJvcHRpbWlzdGljIi4gV2hlbgorICogc29tZW9uZSBlbHNlIGFjY2Vzc2VzIHRoZSBzb2NrZXQgdGhlIElDTVAgaXMganVzdCBkcm9wcGVkCisgKiBhbmQgZm9yIHNvbWUgcGF0aHMgdGhlcmUgaXMgbm8gY2hlY2sgYXQgYWxsLgorICogQSBtb3JlIGdlbmVyYWwgZXJyb3IgcXVldWUgdG8gcXVldWUgZXJyb3JzIGZvciBsYXRlciBoYW5kbGluZworICogaXMgcHJvYmFibHkgYmV0dGVyLgorICoKKyAqLworCit2b2lkIHRjcF92NF9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGluZm8pCit7CisJc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyICopc2tiLT5kYXRhOworCXN0cnVjdCB0Y3BoZHIgKnRoID0gKHN0cnVjdCB0Y3BoZHIgKikoc2tiLT5kYXRhICsgKGlwaC0+aWhsIDw8IDIpKTsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwOworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQ7CisJaW50IHR5cGUgPSBza2ItPmguaWNtcGgtPnR5cGU7CisJaW50IGNvZGUgPSBza2ItPmguaWNtcGgtPmNvZGU7CisJc3RydWN0IHNvY2sgKnNrOworCV9fdTMyIHNlcTsKKwlpbnQgZXJyOworCisJaWYgKHNrYi0+bGVuIDwgKGlwaC0+aWhsIDw8IDIpICsgOCkgeworCQlJQ01QX0lOQ19TVEFUU19CSChJQ01QX01JQl9JTkVSUk9SUyk7CisJCXJldHVybjsKKwl9CisKKwlzayA9IHRjcF92NF9sb29rdXAoaXBoLT5kYWRkciwgdGgtPmRlc3QsIGlwaC0+c2FkZHIsCisJCQkgICB0aC0+c291cmNlLCB0Y3BfdjRfaWlmKHNrYikpOworCWlmICghc2spIHsKKwkJSUNNUF9JTkNfU1RBVFNfQkgoSUNNUF9NSUJfSU5FUlJPUlMpOworCQlyZXR1cm47CisJfQorCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX1RJTUVfV0FJVCkgeworCQl0Y3BfdHdfcHV0KChzdHJ1Y3QgdGNwX3R3X2J1Y2tldCAqKXNrKTsKKwkJcmV0dXJuOworCX0KKworCWJoX2xvY2tfc29jayhzayk7CisJLyogSWYgdG9vIG1hbnkgSUNNUHMgZ2V0IGRyb3BwZWQgb24gYnVzeQorCSAqIHNlcnZlcnMgdGhpcyBuZWVkcyB0byBiZSBzb2x2ZWQgZGlmZmVyZW50bHkuCisJICovCisJaWYgKHNvY2tfb3duZWRfYnlfdXNlcihzaykpCisJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX0xPQ0tEUk9QUEVESUNNUFMpOworCisJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfQ0xPU0UpCisJCWdvdG8gb3V0OworCisJdHAgPSB0Y3Bfc2soc2spOworCXNlcSA9IG50b2hsKHRoLT5zZXEpOworCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0xJU1RFTiAmJgorCSAgICAhYmV0d2VlbihzZXEsIHRwLT5zbmRfdW5hLCB0cC0+c25kX254dCkpIHsKKwkJTkVUX0lOQ19TVEFUUyhMSU5VWF9NSUJfT1VUT0ZXSU5ET1dJQ01QUyk7CisJCWdvdG8gb3V0OworCX0KKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSUNNUF9TT1VSQ0VfUVVFTkNIOgorCQkvKiBKdXN0IHNpbGVudGx5IGlnbm9yZSB0aGVzZS4gKi8KKwkJZ290byBvdXQ7CisJY2FzZSBJQ01QX1BBUkFNRVRFUlBST0I6CisJCWVyciA9IEVQUk9UTzsKKwkJYnJlYWs7CisJY2FzZSBJQ01QX0RFU1RfVU5SRUFDSDoKKwkJaWYgKGNvZGUgPiBOUl9JQ01QX1VOUkVBQ0gpCisJCQlnb3RvIG91dDsKKworCQlpZiAoY29kZSA9PSBJQ01QX0ZSQUdfTkVFREVEKSB7IC8qIFBNVFUgZGlzY292ZXJ5IChSRkMxMTkxKSAqLworCQkJaWYgKCFzb2NrX293bmVkX2J5X3VzZXIoc2spKQorCQkJCWRvX3BtdHVfZGlzY292ZXJ5KHNrLCBpcGgsIGluZm8pOworCQkJZ290byBvdXQ7CisJCX0KKworCQllcnIgPSBpY21wX2Vycl9jb252ZXJ0W2NvZGVdLmVycm5vOworCQlicmVhazsKKwljYXNlIElDTVBfVElNRV9FWENFRURFRDoKKwkJZXJyID0gRUhPU1RVTlJFQUNIOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIG91dDsKKwl9CisKKwlzd2l0Y2ggKHNrLT5za19zdGF0ZSkgeworCQlzdHJ1Y3Qgb3Blbl9yZXF1ZXN0ICpyZXEsICoqcHJldjsKKwljYXNlIFRDUF9MSVNURU46CisJCWlmIChzb2NrX293bmVkX2J5X3VzZXIoc2spKQorCQkJZ290byBvdXQ7CisKKwkJcmVxID0gdGNwX3Y0X3NlYXJjaF9yZXEodHAsICZwcmV2LCB0aC0+ZGVzdCwKKwkJCQkJaXBoLT5kYWRkciwgaXBoLT5zYWRkcik7CisJCWlmICghcmVxKQorCQkJZ290byBvdXQ7CisKKwkJLyogSUNNUHMgYXJlIG5vdCBiYWNrbG9nZ2VkLCBoZW5jZSB3ZSBjYW5ub3QgZ2V0CisJCSAgIGFuIGVzdGFibGlzaGVkIHNvY2tldCBoZXJlLgorCQkgKi8KKwkJQlVHX1RSQVAoIXJlcS0+c2spOworCisJCWlmIChzZXEgIT0gcmVxLT5zbnRfaXNuKSB7CisJCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9PVVRPRldJTkRPV0lDTVBTKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyoKKwkJICogU3RpbGwgaW4gU1lOX1JFQ1YsIGp1c3QgcmVtb3ZlIGl0IHNpbGVudGx5LgorCQkgKiBUaGVyZSBpcyBubyBnb29kIHdheSB0byBwYXNzIHRoZSBlcnJvciB0byB0aGUgbmV3bHkKKwkJICogY3JlYXRlZCBzb2NrZXQsIGFuZCBQT1NJWCBkb2VzIG5vdCB3YW50IG5ldHdvcmsKKwkJICogZXJyb3JzIHJldHVybmVkIGZyb20gYWNjZXB0KCkuCisJCSAqLworCQl0Y3Bfc3lucV9kcm9wKHNrLCByZXEsIHByZXYpOworCQlnb3RvIG91dDsKKworCWNhc2UgVENQX1NZTl9TRU5UOgorCWNhc2UgVENQX1NZTl9SRUNWOiAgLyogQ2Fubm90IGhhcHBlbi4KKwkJCSAgICAgICBJdCBjYW4gZi5lLiBpZiBTWU5zIGNyb3NzZWQuCisJCQkgICAgICovCisJCWlmICghc29ja19vd25lZF9ieV91c2VyKHNrKSkgeworCQkJVENQX0lOQ19TVEFUU19CSChUQ1BfTUlCX0FUVEVNUFRGQUlMUyk7CisJCQlzay0+c2tfZXJyID0gZXJyOworCisJCQlzay0+c2tfZXJyb3JfcmVwb3J0KHNrKTsKKworCQkJdGNwX2RvbmUoc2spOworCQl9IGVsc2UgeworCQkJc2stPnNrX2Vycl9zb2Z0ID0gZXJyOworCQl9CisJCWdvdG8gb3V0OworCX0KKworCS8qIElmIHdlJ3ZlIGFscmVhZHkgY29ubmVjdGVkIHdlIHdpbGwga2VlcCB0cnlpbmcKKwkgKiB1bnRpbCB3ZSB0aW1lIG91dCwgb3IgdGhlIHVzZXIgZ2l2ZXMgdXAuCisJICoKKwkgKiByZmMxMTIyIDQuMi4zLjkgYWxsb3dzIHRvIGNvbnNpZGVyIGFzIGhhcmQgZXJyb3JzCisJICogb25seSBQUk9UT19VTlJFQUNIIGFuZCBQT1JUX1VOUkVBQ0ggKHdlbGwsIEZSQUdfRkFJTEVEIHRvbywKKwkgKiBidXQgaXQgaXMgb2Jzb2xldGVkIGJ5IHBtdHUgZGlzY292ZXJ5KS4KKwkgKgorCSAqIE5vdGUsIHRoYXQgaW4gbW9kZXJuIGludGVybmV0LCB3aGVyZSByb3V0aW5nIGlzIHVucmVsaWFibGUKKwkgKiBhbmQgaW4gZWFjaCBkYXJrIGNvcm5lciBicm9rZW4gZmlyZXdhbGxzIHNpdCwgc2VuZGluZyByYW5kb20KKwkgKiBlcnJvcnMgb3JkZXJlZCBieSB0aGVpciBtYXN0ZXJzIGV2ZW4gdGhpcyB0d28gbWVzc2FnZXMgZmluYWxseSBsb3NlCisJICogdGhlaXIgb3JpZ2luYWwgc2Vuc2UgKGV2ZW4gTGludXggc2VuZHMgaW52YWxpZCBQT1JUX1VOUkVBQ0hzKQorCSAqCisJICogTm93IHdlIGFyZSBpbiBjb21wbGlhbmNlIHdpdGggUkZDcy4KKwkgKgkJCQkJCQktLUFOSyAoOTgwOTA1KQorCSAqLworCisJaW5ldCA9IGluZXRfc2soc2spOworCWlmICghc29ja19vd25lZF9ieV91c2VyKHNrKSAmJiBpbmV0LT5yZWN2ZXJyKSB7CisJCXNrLT5za19lcnIgPSBlcnI7CisJCXNrLT5za19lcnJvcl9yZXBvcnQoc2spOworCX0gZWxzZQl7IC8qIE9ubHkgYW4gZXJyb3Igb24gdGltZW91dCAqLworCQlzay0+c2tfZXJyX3NvZnQgPSBlcnI7CisJfQorCitvdXQ6CisJYmhfdW5sb2NrX3NvY2soc2spOworCXNvY2tfcHV0KHNrKTsKK30KKworLyogVGhpcyByb3V0aW5lIGNvbXB1dGVzIGFuIElQdjQgVENQIGNoZWNrc3VtLiAqLwordm9pZCB0Y3BfdjRfc2VuZF9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3BoZHIgKnRoLCBpbnQgbGVuLAorCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisKKwlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpIHsKKwkJdGgtPmNoZWNrID0gfnRjcF92NF9jaGVjayh0aCwgbGVuLCBpbmV0LT5zYWRkciwgaW5ldC0+ZGFkZHIsIDApOworCQlza2ItPmNzdW0gPSBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBjaGVjayk7CisJfSBlbHNlIHsKKwkJdGgtPmNoZWNrID0gdGNwX3Y0X2NoZWNrKHRoLCBsZW4sIGluZXQtPnNhZGRyLCBpbmV0LT5kYWRkciwKKwkJCQkJIGNzdW1fcGFydGlhbCgoY2hhciAqKXRoLAorCQkJCQkJICAgICAgdGgtPmRvZmYgPDwgMiwKKwkJCQkJCSAgICAgIHNrYi0+Y3N1bSkpOworCX0KK30KKworLyoKKyAqCVRoaXMgcm91dGluZSB3aWxsIHNlbmQgYW4gUlNUIHRvIHRoZSBvdGhlciB0Y3AuCisgKgorICoJU29tZW9uZSBhc2tzOiB3aHkgSSBORVZFUiB1c2Ugc29ja2V0IHBhcmFtZXRlcnMgKFRPUywgVFRMIGV0Yy4pCisgKgkJICAgICAgZm9yIHJlc2V0LgorICoJQW5zd2VyOiBpZiBhIHBhY2tldCBjYXVzZWQgUlNULCBpdCBpcyBub3QgZm9yIGEgc29ja2V0CisgKgkJZXhpc3RpbmcgaW4gb3VyIHN5c3RlbSwgaWYgaXQgaXMgbWF0Y2hlZCB0byBhIHNvY2tldCwKKyAqCQlpdCBpcyBqdXN0IGR1cGxpY2F0ZSBzZWdtZW50IG9yIGJ1ZyBpbiBvdGhlciBzaWRlJ3MgVENQLgorICoJCVNvIHRoYXQgd2UgYnVpbGQgcmVwbHkgb25seSBiYXNpbmcgb24gcGFyYW1ldGVycworICoJCWFycml2ZWQgd2l0aCBzZWdtZW50LgorICoJRXhjZXB0aW9uOiBwcmVjZWRlbmNlIHZpb2xhdGlvbi4gV2UgZG8gbm90IGltcGxlbWVudCBpdCBpbiBhbnkgY2FzZS4KKyAqLworCitzdGF0aWMgdm9pZCB0Y3BfdjRfc2VuZF9yZXNldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB0Y3BoZHIgKnRoID0gc2tiLT5oLnRoOworCXN0cnVjdCB0Y3BoZHIgcnRoOworCXN0cnVjdCBpcF9yZXBseV9hcmcgYXJnOworCisJLyogTmV2ZXIgc2VuZCBhIHJlc2V0IGluIHJlc3BvbnNlIHRvIGEgcmVzZXQuICovCisJaWYgKHRoLT5yc3QpCisJCXJldHVybjsKKworCWlmICgoKHN0cnVjdCBydGFibGUgKilza2ItPmRzdCktPnJ0X3R5cGUgIT0gUlROX0xPQ0FMKQorCQlyZXR1cm47CisKKwkvKiBTd2FwIHRoZSBzZW5kIGFuZCB0aGUgcmVjZWl2ZS4gKi8KKwltZW1zZXQoJnJ0aCwgMCwgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKTsKKwlydGguZGVzdCAgID0gdGgtPnNvdXJjZTsKKwlydGguc291cmNlID0gdGgtPmRlc3Q7CisJcnRoLmRvZmYgICA9IHNpemVvZihzdHJ1Y3QgdGNwaGRyKSAvIDQ7CisJcnRoLnJzdCAgICA9IDE7CisKKwlpZiAodGgtPmFjaykgeworCQlydGguc2VxID0gdGgtPmFja19zZXE7CisJfSBlbHNlIHsKKwkJcnRoLmFjayA9IDE7CisJCXJ0aC5hY2tfc2VxID0gaHRvbmwobnRvaGwodGgtPnNlcSkgKyB0aC0+c3luICsgdGgtPmZpbiArCisJCQkJICAgIHNrYi0+bGVuIC0gKHRoLT5kb2ZmIDw8IDIpKTsKKwl9CisKKwltZW1zZXQoJmFyZywgMCwgc2l6ZW9mIGFyZyk7CisJYXJnLmlvdlswXS5pb3ZfYmFzZSA9ICh1bnNpZ25lZCBjaGFyICopJnJ0aDsKKwlhcmcuaW92WzBdLmlvdl9sZW4gID0gc2l6ZW9mIHJ0aDsKKwlhcmcuY3N1bSA9IGNzdW1fdGNwdWRwX25vZm9sZChza2ItPm5oLmlwaC0+ZGFkZHIsCisJCQkJICAgICAgc2tiLT5uaC5pcGgtPnNhZGRyLCAvKlhYWCovCisJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpLCBJUFBST1RPX1RDUCwgMCk7CisJYXJnLmNzdW1vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBjaGVjaykgLyAyOworCisJaXBfc2VuZF9yZXBseSh0Y3Bfc29ja2V0LT5zaywgc2tiLCAmYXJnLCBzaXplb2YgcnRoKTsKKworCVRDUF9JTkNfU1RBVFNfQkgoVENQX01JQl9PVVRTRUdTKTsKKwlUQ1BfSU5DX1NUQVRTX0JIKFRDUF9NSUJfT1VUUlNUUyk7Cit9CisKKy8qIFRoZSBjb2RlIGZvbGxvd2luZyBiZWxvdyBzZW5kaW5nIEFDS3MgaW4gU1lOLVJFQ1YgYW5kIFRJTUUtV0FJVCBzdGF0ZXMKKyAgIG91dHNpZGUgc29ja2V0IGNvbnRleHQgaXMgdWdseSwgY2VydGFpbmx5LiBXaGF0IGNhbiBJIGRvPworICovCisKK3N0YXRpYyB2b2lkIHRjcF92NF9zZW5kX2FjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgc2VxLCB1MzIgYWNrLAorCQkJICAgIHUzMiB3aW4sIHUzMiB0cykKK3sKKwlzdHJ1Y3QgdGNwaGRyICp0aCA9IHNrYi0+aC50aDsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgdGNwaGRyIHRoOworCQl1MzIgdHNvcHRbM107CisJfSByZXA7CisJc3RydWN0IGlwX3JlcGx5X2FyZyBhcmc7CisKKwltZW1zZXQoJnJlcC50aCwgMCwgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKTsKKwltZW1zZXQoJmFyZywgMCwgc2l6ZW9mIGFyZyk7CisKKwlhcmcuaW92WzBdLmlvdl9iYXNlID0gKHVuc2lnbmVkIGNoYXIgKikmcmVwOworCWFyZy5pb3ZbMF0uaW92X2xlbiAgPSBzaXplb2YocmVwLnRoKTsKKwlpZiAodHMpIHsKKwkJcmVwLnRzb3B0WzBdID0gaHRvbmwoKFRDUE9QVF9OT1AgPDwgMjQpIHwgKFRDUE9QVF9OT1AgPDwgMTYpIHwKKwkJCQkgICAgIChUQ1BPUFRfVElNRVNUQU1QIDw8IDgpIHwKKwkJCQkgICAgIFRDUE9MRU5fVElNRVNUQU1QKTsKKwkJcmVwLnRzb3B0WzFdID0gaHRvbmwodGNwX3RpbWVfc3RhbXApOworCQlyZXAudHNvcHRbMl0gPSBodG9ubCh0cyk7CisJCWFyZy5pb3ZbMF0uaW92X2xlbiA9IHNpemVvZihyZXApOworCX0KKworCS8qIFN3YXAgdGhlIHNlbmQgYW5kIHRoZSByZWNlaXZlLiAqLworCXJlcC50aC5kZXN0ICAgID0gdGgtPnNvdXJjZTsKKwlyZXAudGguc291cmNlICA9IHRoLT5kZXN0OworCXJlcC50aC5kb2ZmICAgID0gYXJnLmlvdlswXS5pb3ZfbGVuIC8gNDsKKwlyZXAudGguc2VxICAgICA9IGh0b25sKHNlcSk7CisJcmVwLnRoLmFja19zZXEgPSBodG9ubChhY2spOworCXJlcC50aC5hY2sgICAgID0gMTsKKwlyZXAudGgud2luZG93ICA9IGh0b25zKHdpbik7CisKKwlhcmcuY3N1bSA9IGNzdW1fdGNwdWRwX25vZm9sZChza2ItPm5oLmlwaC0+ZGFkZHIsCisJCQkJICAgICAgc2tiLT5uaC5pcGgtPnNhZGRyLCAvKlhYWCovCisJCQkJICAgICAgYXJnLmlvdlswXS5pb3ZfbGVuLCBJUFBST1RPX1RDUCwgMCk7CisJYXJnLmNzdW1vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBjaGVjaykgLyAyOworCisJaXBfc2VuZF9yZXBseSh0Y3Bfc29ja2V0LT5zaywgc2tiLCAmYXJnLCBhcmcuaW92WzBdLmlvdl9sZW4pOworCisJVENQX0lOQ19TVEFUU19CSChUQ1BfTUlCX09VVFNFR1MpOworfQorCitzdGF0aWMgdm9pZCB0Y3BfdjRfdGltZXdhaXRfYWNrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgdGNwX3R3X2J1Y2tldCAqdHcgPSAoc3RydWN0IHRjcF90d19idWNrZXQgKilzazsKKworCXRjcF92NF9zZW5kX2Fjayhza2IsIHR3LT50d19zbmRfbnh0LCB0dy0+dHdfcmN2X254dCwKKwkJCXR3LT50d19yY3Zfd25kID4+IHR3LT50d19yY3Zfd3NjYWxlLCB0dy0+dHdfdHNfcmVjZW50KTsKKworCXRjcF90d19wdXQodHcpOworfQorCitzdGF0aWMgdm9pZCB0Y3BfdjRfb3Jfc2VuZF9hY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG9wZW5fcmVxdWVzdCAqcmVxKQoreworCXRjcF92NF9zZW5kX2Fjayhza2IsIHJlcS0+c250X2lzbiArIDEsIHJlcS0+cmN2X2lzbiArIDEsIHJlcS0+cmN2X3duZCwKKwkJCXJlcS0+dHNfcmVjZW50KTsKK30KKworc3RhdGljIHN0cnVjdCBkc3RfZW50cnkqIHRjcF92NF9yb3V0ZV9yZXEoc3RydWN0IHNvY2sgKnNrLAorCQkJCQkgIHN0cnVjdCBvcGVuX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgcnRhYmxlICpydDsKKwlzdHJ1Y3QgaXBfb3B0aW9ucyAqb3B0ID0gcmVxLT5hZi52NF9yZXEub3B0OworCXN0cnVjdCBmbG93aSBmbCA9IHsgLm9pZiA9IHNrLT5za19ib3VuZF9kZXZfaWYsCisJCQkgICAgLm5sX3UgPSB7IC5pcDRfdSA9CisJCQkJICAgICAgeyAuZGFkZHIgPSAoKG9wdCAmJiBvcHQtPnNycikgPworCQkJCQkJICBvcHQtPmZhZGRyIDoKKwkJCQkJCSAgcmVxLT5hZi52NF9yZXEucm10X2FkZHIpLAorCQkJCQkuc2FkZHIgPSByZXEtPmFmLnY0X3JlcS5sb2NfYWRkciwKKwkJCQkJLnRvcyA9IFJUX0NPTk5fRkxBR1Moc2spIH0gfSwKKwkJCSAgICAucHJvdG8gPSBJUFBST1RPX1RDUCwKKwkJCSAgICAudWxpX3UgPSB7IC5wb3J0cyA9CisJCQkJICAgICAgIHsgLnNwb3J0ID0gaW5ldF9zayhzayktPnNwb3J0LAorCQkJCQkgLmRwb3J0ID0gcmVxLT5ybXRfcG9ydCB9IH0gfTsKKworCWlmIChpcF9yb3V0ZV9vdXRwdXRfZmxvdygmcnQsICZmbCwgc2ssIDApKSB7CisJCUlQX0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9PVVROT1JPVVRFUyk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAob3B0ICYmIG9wdC0+aXNfc3RyaWN0cm91dGUgJiYgcnQtPnJ0X2RzdCAhPSBydC0+cnRfZ2F0ZXdheSkgeworCQlpcF9ydF9wdXQocnQpOworCQlJUF9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfT1VUTk9ST1VURVMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuICZydC0+dS5kc3Q7Cit9CisKKy8qCisgKglTZW5kIGEgU1lOLUFDSyBhZnRlciBoYXZpbmcgcmVjZWl2ZWQgYW4gQUNLLgorICoJVGhpcyBzdGlsbCBvcGVyYXRlcyBvbiBhIG9wZW5fcmVxdWVzdCBvbmx5LCBub3Qgb24gYSBiaWcKKyAqCXNvY2tldC4KKyAqLworc3RhdGljIGludCB0Y3BfdjRfc2VuZF9zeW5hY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgb3Blbl9yZXF1ZXN0ICpyZXEsCisJCQkgICAgICBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCit7CisJaW50IGVyciA9IC0xOworCXN0cnVjdCBza19idWZmICogc2tiOworCisJLyogRmlyc3QsIGdyYWIgYSByb3V0ZS4gKi8KKwlpZiAoIWRzdCAmJiAoZHN0ID0gdGNwX3Y0X3JvdXRlX3JlcShzaywgcmVxKSkgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlza2IgPSB0Y3BfbWFrZV9zeW5hY2soc2ssIGRzdCwgcmVxKTsKKworCWlmIChza2IpIHsKKwkJc3RydWN0IHRjcGhkciAqdGggPSBza2ItPmgudGg7CisKKwkJdGgtPmNoZWNrID0gdGNwX3Y0X2NoZWNrKHRoLCBza2ItPmxlbiwKKwkJCQkJIHJlcS0+YWYudjRfcmVxLmxvY19hZGRyLAorCQkJCQkgcmVxLT5hZi52NF9yZXEucm10X2FkZHIsCisJCQkJCSBjc3VtX3BhcnRpYWwoKGNoYXIgKil0aCwgc2tiLT5sZW4sCisJCQkJCQkgICAgICBza2ItPmNzdW0pKTsKKworCQllcnIgPSBpcF9idWlsZF9hbmRfc2VuZF9wa3Qoc2tiLCBzaywgcmVxLT5hZi52NF9yZXEubG9jX2FkZHIsCisJCQkJCSAgICByZXEtPmFmLnY0X3JlcS5ybXRfYWRkciwKKwkJCQkJICAgIHJlcS0+YWYudjRfcmVxLm9wdCk7CisJCWlmIChlcnIgPT0gTkVUX1hNSVRfQ04pCisJCQllcnIgPSAwOworCX0KKworb3V0OgorCWRzdF9yZWxlYXNlKGRzdCk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqCUlQdjQgb3Blbl9yZXF1ZXN0IGRlc3RydWN0b3IuCisgKi8KK3N0YXRpYyB2b2lkIHRjcF92NF9vcl9mcmVlKHN0cnVjdCBvcGVuX3JlcXVlc3QgKnJlcSkKK3sKKwlpZiAocmVxLT5hZi52NF9yZXEub3B0KQorCQlrZnJlZShyZXEtPmFmLnY0X3JlcS5vcHQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3luX2Zsb29kX3dhcm5pbmcoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyB3YXJudGltZTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsICh3YXJudGltZSArIEhaICogNjApKSkgeworCQl3YXJudGltZSA9IGppZmZpZXM7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICJwb3NzaWJsZSBTWU4gZmxvb2Rpbmcgb24gcG9ydCAlZC4gU2VuZGluZyBjb29raWVzLlxuIiwKKwkJICAgICAgIG50b2hzKHNrYi0+aC50aC0+ZGVzdCkpOworCX0KK30KKworLyoKKyAqIFNhdmUgYW5kIGNvbXBpbGUgSVB2NCBvcHRpb25zIGludG8gdGhlIG9wZW5fcmVxdWVzdCBpZiBuZWVkZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwX29wdGlvbnMgKnRjcF92NF9zYXZlX29wdGlvbnMoc3RydWN0IHNvY2sgKnNrLAorCQkJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcF9vcHRpb25zICpvcHQgPSAmKElQQ0Ioc2tiKS0+b3B0KTsKKwlzdHJ1Y3QgaXBfb3B0aW9ucyAqZG9wdCA9IE5VTEw7CisKKwlpZiAob3B0ICYmIG9wdC0+b3B0bGVuKSB7CisJCWludCBvcHRfc2l6ZSA9IG9wdGxlbmd0aChvcHQpOworCQlkb3B0ID0ga21hbGxvYyhvcHRfc2l6ZSwgR0ZQX0FUT01JQyk7CisJCWlmIChkb3B0KSB7CisJCQlpZiAoaXBfb3B0aW9uc19lY2hvKGRvcHQsIHNrYikpIHsKKwkJCQlrZnJlZShkb3B0KTsKKwkJCQlkb3B0ID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gZG9wdDsKK30KKworLyoKKyAqIE1heGltdW0gbnVtYmVyIG9mIFNZTl9SRUNWIHNvY2tldHMgaW4gcXVldWUgcGVyIExJU1RFTiBzb2NrZXQuCisgKiBPbmUgU1lOX1JFQ1Ygc29ja2V0IGNvc3RzIGFib3V0IDgwYnl0ZXMgb24gYSAzMmJpdCBtYWNoaW5lLgorICogSXQgd291bGQgYmUgYmV0dGVyIHRvIHJlcGxhY2UgaXQgd2l0aCBhIGdsb2JhbCBjb3VudGVyIGZvciBhbGwgc29ja2V0cworICogYnV0IHRoZW4gc29tZSBtZWFzdXJlIGFnYWluc3Qgb25lIHNvY2tldCBzdGFydmluZyBhbGwgb3RoZXIgc29ja2V0cworICogd291bGQgYmUgbmVlZGVkLgorICoKKyAqIEl0IHdhcyAxMjggYnkgZGVmYXVsdC4gRXhwZXJpbWVudHMgd2l0aCByZWFsIHNlcnZlcnMgc2hvdywgdGhhdAorICogaXQgaXMgYWJzb2x1dGVseSBub3QgZW5vdWdoIGV2ZW4gYXQgMTAwY29ubi9zZWMuIDI1NiBjdXJlcyBtb3N0CisgKiBvZiBwcm9ibGVtcy4gVGhpcyB2YWx1ZSBpcyBhZGp1c3RlZCB0byAxMjggZm9yIHZlcnkgc21hbGwgbWFjaGluZXMKKyAqICg8PTMyTWIgb2YgbWVtb3J5KSBhbmQgdG8gMTAyNCBvbiBub3JtYWwgb3IgYmV0dGVyIG9uZXMgKD49MjU2TWIpLgorICogRnVydGhlciBpbmNyZWFzaW5nIHJlcXVpcmVzIHRvIGNoYW5nZSBoYXNoIHRhYmxlIHNpemUuCisgKi8KK2ludCBzeXNjdGxfbWF4X3N5bl9iYWNrbG9nID0gMjU2OworCitzdHJ1Y3Qgb3JfY2FsbHRhYmxlIG9yX2lwdjQgPSB7CisJLmZhbWlseQkJPQlQRl9JTkVULAorCS5ydHhfc3luX2Fjawk9CXRjcF92NF9zZW5kX3N5bmFjaywKKwkuc2VuZF9hY2sJPQl0Y3BfdjRfb3Jfc2VuZF9hY2ssCisJLmRlc3RydWN0b3IJPQl0Y3BfdjRfb3JfZnJlZSwKKwkuc2VuZF9yZXNldAk9CXRjcF92NF9zZW5kX3Jlc2V0LAorfTsKKworaW50IHRjcF92NF9jb25uX3JlcXVlc3Qoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB0Y3Bfb3B0aW9uc19yZWNlaXZlZCB0bXBfb3B0OworCXN0cnVjdCBvcGVuX3JlcXVlc3QgKnJlcTsKKwlfX3UzMiBzYWRkciA9IHNrYi0+bmguaXBoLT5zYWRkcjsKKwlfX3UzMiBkYWRkciA9IHNrYi0+bmguaXBoLT5kYWRkcjsKKwlfX3UzMiBpc24gPSBUQ1BfU0tCX0NCKHNrYiktPndoZW47CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gTlVMTDsKKyNpZmRlZiBDT05GSUdfU1lOX0NPT0tJRVMKKwlpbnQgd2FudF9jb29raWUgPSAwOworI2Vsc2UKKyNkZWZpbmUgd2FudF9jb29raWUgMCAvKiBBcmdoLCB3aHkgZG9lc24ndCBnY2Mgb3B0aW1pemUgdGhpcyA6KCAqLworI2VuZGlmCisKKwkvKiBOZXZlciBhbnN3ZXIgdG8gU1lOcyBzZW5kIHRvIGJyb2FkY2FzdCBvciBtdWx0aWNhc3QgKi8KKwlpZiAoKChzdHJ1Y3QgcnRhYmxlICopc2tiLT5kc3QpLT5ydF9mbGFncyAmCisJICAgIChSVENGX0JST0FEQ0FTVCB8IFJUQ0ZfTVVMVElDQVNUKSkKKwkJZ290byBkcm9wOworCisJLyogVFcgYnVja2V0cyBhcmUgY29udmVydGVkIHRvIG9wZW4gcmVxdWVzdHMgd2l0aG91dAorCSAqIGxpbWl0YXRpb25zLCB0aGV5IGNvbnNlcnZlIHJlc291cmNlcyBhbmQgcGVlciBpcworCSAqIGV2aWRlbnRseSByZWFsIG9uZS4KKwkgKi8KKwlpZiAodGNwX3N5bnFfaXNfZnVsbChzaykgJiYgIWlzbikgeworI2lmZGVmIENPTkZJR19TWU5fQ09PS0lFUworCQlpZiAoc3lzY3RsX3RjcF9zeW5jb29raWVzKSB7CisJCQl3YW50X2Nvb2tpZSA9IDE7CisJCX0gZWxzZQorI2VuZGlmCisJCWdvdG8gZHJvcDsKKwl9CisKKwkvKiBBY2NlcHQgYmFja2xvZyBpcyBmdWxsLiBJZiB3ZSBoYXZlIGFscmVhZHkgcXVldWVkIGVub3VnaAorCSAqIG9mIHdhcm0gZW50cmllcyBpbiBzeW4gcXVldWUsIGRyb3AgcmVxdWVzdC4gSXQgaXMgYmV0dGVyIHRoYW4KKwkgKiBjbG9nZ2luZyBzeW4gcXVldWUgd2l0aCBvcGVucmVxcyB3aXRoIGV4cG9uZW50aWFsbHkgaW5jcmVhc2luZworCSAqIHRpbWVvdXQuCisJICovCisJaWYgKHNrX2FjY2VwdHFfaXNfZnVsbChzaykgJiYgdGNwX3N5bnFfeW91bmcoc2spID4gMSkKKwkJZ290byBkcm9wOworCisJcmVxID0gdGNwX29wZW5yZXFfYWxsb2MoKTsKKwlpZiAoIXJlcSkKKwkJZ290byBkcm9wOworCisJdGNwX2NsZWFyX29wdGlvbnMoJnRtcF9vcHQpOworCXRtcF9vcHQubXNzX2NsYW1wID0gNTM2OworCXRtcF9vcHQudXNlcl9tc3MgID0gdGNwX3NrKHNrKS0+cnhfb3B0LnVzZXJfbXNzOworCisJdGNwX3BhcnNlX29wdGlvbnMoc2tiLCAmdG1wX29wdCwgMCk7CisKKwlpZiAod2FudF9jb29raWUpIHsKKwkJdGNwX2NsZWFyX29wdGlvbnMoJnRtcF9vcHQpOworCQl0bXBfb3B0LnNhd190c3RhbXAgPSAwOworCX0KKworCWlmICh0bXBfb3B0LnNhd190c3RhbXAgJiYgIXRtcF9vcHQucmN2X3RzdmFsKSB7CisJCS8qIFNvbWUgT1NlcyAodW5rbm93biBvbmVzLCBidXQgSSBzZWUgdGhlbSBvbiB3ZWIgc2VydmVyLCB3aGljaAorCQkgKiBjb250YWlucyBpbmZvcm1hdGlvbiBpbnRlcmVzdGluZyBvbmx5IGZvciB3aW5kb3dzJworCQkgKiB1c2VycykgZG8gbm90IHNlbmQgdGhlaXIgc3RhbXAgaW4gU1lOLiBJdCBpcyBlYXN5IGNhc2UuCisJCSAqIFdlIHNpbXBseSBkbyBub3QgYWR2ZXJ0aXNlIFRTIHN1cHBvcnQuCisJCSAqLworCQl0bXBfb3B0LnNhd190c3RhbXAgPSAwOworCQl0bXBfb3B0LnRzdGFtcF9vayAgPSAwOworCX0KKwl0bXBfb3B0LnRzdGFtcF9vayA9IHRtcF9vcHQuc2F3X3RzdGFtcDsKKworCXRjcF9vcGVucmVxX2luaXQocmVxLCAmdG1wX29wdCwgc2tiKTsKKworCXJlcS0+YWYudjRfcmVxLmxvY19hZGRyID0gZGFkZHI7CisJcmVxLT5hZi52NF9yZXEucm10X2FkZHIgPSBzYWRkcjsKKwlyZXEtPmFmLnY0X3JlcS5vcHQgPSB0Y3BfdjRfc2F2ZV9vcHRpb25zKHNrLCBza2IpOworCXJlcS0+Y2xhc3MgPSAmb3JfaXB2NDsKKwlpZiAoIXdhbnRfY29va2llKQorCQlUQ1BfRUNOX2NyZWF0ZV9yZXF1ZXN0KHJlcSwgc2tiLT5oLnRoKTsKKworCWlmICh3YW50X2Nvb2tpZSkgeworI2lmZGVmIENPTkZJR19TWU5fQ09PS0lFUworCQlzeW5fZmxvb2Rfd2FybmluZyhza2IpOworI2VuZGlmCisJCWlzbiA9IGNvb2tpZV92NF9pbml0X3NlcXVlbmNlKHNrLCBza2IsICZyZXEtPm1zcyk7CisJfSBlbHNlIGlmICghaXNuKSB7CisJCXN0cnVjdCBpbmV0X3BlZXIgKnBlZXIgPSBOVUxMOworCisJCS8qIFZKJ3MgaWRlYS4gV2Ugc2F2ZSBsYXN0IHRpbWVzdGFtcCBzZWVuCisJCSAqIGZyb20gdGhlIGRlc3RpbmF0aW9uIGluIHBlZXIgdGFibGUsIHdoZW4gZW50ZXJpbmcKKwkJICogc3RhdGUgVElNRS1XQUlULCBhbmQgY2hlY2sgYWdhaW5zdCBpdCBiZWZvcmUKKwkJICogYWNjZXB0aW5nIG5ldyBjb25uZWN0aW9uIHJlcXVlc3QuCisJCSAqCisJCSAqIElmICJpc24iIGlzIG5vdCB6ZXJvLCB0aGlzIHJlcXVlc3QgaGl0IGFsaXZlCisJCSAqIHRpbWV3YWl0IGJ1Y2tldCwgc28gdGhhdCBhbGwgdGhlIG5lY2Vzc2FyeSBjaGVja3MKKwkJICogYXJlIG1hZGUgaW4gdGhlIGZ1bmN0aW9uIHByb2Nlc3NpbmcgdGltZXdhaXQgc3RhdGUuCisJCSAqLworCQlpZiAodG1wX29wdC5zYXdfdHN0YW1wICYmCisJCSAgICBzeXNjdGxfdGNwX3R3X3JlY3ljbGUgJiYKKwkJICAgIChkc3QgPSB0Y3BfdjRfcm91dGVfcmVxKHNrLCByZXEpKSAhPSBOVUxMICYmCisJCSAgICAocGVlciA9IHJ0X2dldF9wZWVyKChzdHJ1Y3QgcnRhYmxlICopZHN0KSkgIT0gTlVMTCAmJgorCQkgICAgcGVlci0+djRkYWRkciA9PSBzYWRkcikgeworCQkJaWYgKHh0aW1lLnR2X3NlYyA8IHBlZXItPnRjcF90c19zdGFtcCArIFRDUF9QQVdTX01TTCAmJgorCQkJICAgIChzMzIpKHBlZXItPnRjcF90cyAtIHJlcS0+dHNfcmVjZW50KSA+CisJCQkJCQkJVENQX1BBV1NfV0lORE9XKSB7CisJCQkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfUEFXU1BBU1NJVkVSRUpFQ1RFRCk7CisJCQkJZHN0X3JlbGVhc2UoZHN0KTsKKwkJCQlnb3RvIGRyb3BfYW5kX2ZyZWU7CisJCQl9CisJCX0KKwkJLyogS2lsbCB0aGUgZm9sbG93aW5nIGNsYXVzZSwgaWYgeW91IGRpc2xpa2UgdGhpcyB3YXkuICovCisJCWVsc2UgaWYgKCFzeXNjdGxfdGNwX3N5bmNvb2tpZXMgJiYKKwkJCSAoc3lzY3RsX21heF9zeW5fYmFja2xvZyAtIHRjcF9zeW5xX2xlbihzaykgPAorCQkJICAoc3lzY3RsX21heF9zeW5fYmFja2xvZyA+PiAyKSkgJiYKKwkJCSAoIXBlZXIgfHwgIXBlZXItPnRjcF90c19zdGFtcCkgJiYKKwkJCSAoIWRzdCB8fCAhZHN0X21ldHJpYyhkc3QsIFJUQVhfUlRUKSkpIHsKKwkJCS8qIFdpdGhvdXQgc3luY29va2llcyBsYXN0IHF1YXJ0ZXIgb2YKKwkJCSAqIGJhY2tsb2cgaXMgZmlsbGVkIHdpdGggZGVzdGluYXRpb25zLAorCQkJICogcHJvdmVuIHRvIGJlIGFsaXZlLgorCQkJICogSXQgbWVhbnMgdGhhdCB3ZSBjb250aW51ZSB0byBjb21tdW5pY2F0ZQorCQkJICogdG8gZGVzdGluYXRpb25zLCBhbHJlYWR5IHJlbWVtYmVyZWQKKwkJCSAqIHRvIHRoZSBtb21lbnQgb2Ygc3luZmxvb2QuCisJCQkgKi8KKwkJCU5FVERFQlVHKGlmIChuZXRfcmF0ZWxpbWl0KCkpIFwKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIlRDUDogZHJvcCBvcGVuICIKKwkJCQkJCQkgICJyZXF1ZXN0IGZyb20gJXUuJXUuIgorCQkJCQkJCSAgIiV1LiV1LyV1XG4iLCBcCisJCQkJCSAgICAgICBOSVBRVUFEKHNhZGRyKSwKKwkJCQkJICAgICAgIG50b2hzKHNrYi0+aC50aC0+c291cmNlKSkpOworCQkJZHN0X3JlbGVhc2UoZHN0KTsKKwkJCWdvdG8gZHJvcF9hbmRfZnJlZTsKKwkJfQorCisJCWlzbiA9IHRjcF92NF9pbml0X3NlcXVlbmNlKHNrLCBza2IpOworCX0KKwlyZXEtPnNudF9pc24gPSBpc247CisKKwlpZiAodGNwX3Y0X3NlbmRfc3luYWNrKHNrLCByZXEsIGRzdCkpCisJCWdvdG8gZHJvcF9hbmRfZnJlZTsKKworCWlmICh3YW50X2Nvb2tpZSkgeworCSAgIAl0Y3Bfb3BlbnJlcV9mcmVlKHJlcSk7CisJfSBlbHNlIHsKKwkJdGNwX3Y0X3N5bnFfYWRkKHNrLCByZXEpOworCX0KKwlyZXR1cm4gMDsKKworZHJvcF9hbmRfZnJlZToKKwl0Y3Bfb3BlbnJlcV9mcmVlKHJlcSk7Citkcm9wOgorCVRDUF9JTkNfU1RBVFNfQkgoVENQX01JQl9BVFRFTVBURkFJTFMpOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBUaGUgdGhyZWUgd2F5IGhhbmRzaGFrZSBoYXMgY29tcGxldGVkIC0gd2UgZ290IGEgdmFsaWQgc3luYWNrIC0KKyAqIG5vdyBjcmVhdGUgdGhlIG5ldyBzb2NrZXQuCisgKi8KK3N0cnVjdCBzb2NrICp0Y3BfdjRfc3luX3JlY3Zfc29jayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICBzdHJ1Y3Qgb3Blbl9yZXF1ZXN0ICpyZXEsCisJCQkJICBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCit7CisJc3RydWN0IGluZXRfc29jayAqbmV3aW5ldDsKKwlzdHJ1Y3QgdGNwX3NvY2sgKm5ld3RwOworCXN0cnVjdCBzb2NrICpuZXdzazsKKworCWlmIChza19hY2NlcHRxX2lzX2Z1bGwoc2spKQorCQlnb3RvIGV4aXRfb3ZlcmZsb3c7CisKKwlpZiAoIWRzdCAmJiAoZHN0ID0gdGNwX3Y0X3JvdXRlX3JlcShzaywgcmVxKSkgPT0gTlVMTCkKKwkJZ290byBleGl0OworCisJbmV3c2sgPSB0Y3BfY3JlYXRlX29wZW5yZXFfY2hpbGQoc2ssIHJlcSwgc2tiKTsKKwlpZiAoIW5ld3NrKQorCQlnb3RvIGV4aXQ7CisKKwluZXdzay0+c2tfZHN0X2NhY2hlID0gZHN0OworCXRjcF92NF9zZXR1cF9jYXBzKG5ld3NrLCBkc3QpOworCisJbmV3dHAJCSAgICAgID0gdGNwX3NrKG5ld3NrKTsKKwluZXdpbmV0CQkgICAgICA9IGluZXRfc2sobmV3c2spOworCW5ld2luZXQtPmRhZGRyCSAgICAgID0gcmVxLT5hZi52NF9yZXEucm10X2FkZHI7CisJbmV3aW5ldC0+cmN2X3NhZGRyICAgID0gcmVxLT5hZi52NF9yZXEubG9jX2FkZHI7CisJbmV3aW5ldC0+c2FkZHIJICAgICAgPSByZXEtPmFmLnY0X3JlcS5sb2NfYWRkcjsKKwluZXdpbmV0LT5vcHQJICAgICAgPSByZXEtPmFmLnY0X3JlcS5vcHQ7CisJcmVxLT5hZi52NF9yZXEub3B0ICAgID0gTlVMTDsKKwluZXdpbmV0LT5tY19pbmRleCAgICAgPSB0Y3BfdjRfaWlmKHNrYik7CisJbmV3aW5ldC0+bWNfdHRsCSAgICAgID0gc2tiLT5uaC5pcGgtPnR0bDsKKwluZXd0cC0+ZXh0X2hlYWRlcl9sZW4gPSAwOworCWlmIChuZXdpbmV0LT5vcHQpCisJCW5ld3RwLT5leHRfaGVhZGVyX2xlbiA9IG5ld2luZXQtPm9wdC0+b3B0bGVuOworCW5ld2luZXQtPmlkID0gbmV3dHAtPndyaXRlX3NlcSBeIGppZmZpZXM7CisKKwl0Y3Bfc3luY19tc3MobmV3c2ssIGRzdF9tdHUoZHN0KSk7CisJbmV3dHAtPmFkdm1zcyA9IGRzdF9tZXRyaWMoZHN0LCBSVEFYX0FEVk1TUyk7CisJdGNwX2luaXRpYWxpemVfcmN2X21zcyhuZXdzayk7CisKKwlfX3RjcF92NF9oYXNoKG5ld3NrLCAwKTsKKwlfX3RjcF9pbmhlcml0X3BvcnQoc2ssIG5ld3NrKTsKKworCXJldHVybiBuZXdzazsKKworZXhpdF9vdmVyZmxvdzoKKwlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9MSVNURU5PVkVSRkxPV1MpOworZXhpdDoKKwlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9MSVNURU5EUk9QUyk7CisJZHN0X3JlbGVhc2UoZHN0KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBzb2NrICp0Y3BfdjRfaG5kX3JlcShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHRjcGhkciAqdGggPSBza2ItPmgudGg7CisJc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3Qgc29jayAqbnNrOworCXN0cnVjdCBvcGVuX3JlcXVlc3QgKipwcmV2OworCS8qIEZpbmQgcG9zc2libGUgY29ubmVjdGlvbiByZXF1ZXN0cy4gKi8KKwlzdHJ1Y3Qgb3Blbl9yZXF1ZXN0ICpyZXEgPSB0Y3BfdjRfc2VhcmNoX3JlcSh0cCwgJnByZXYsIHRoLT5zb3VyY2UsCisJCQkJCQkgICAgIGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIpOworCWlmIChyZXEpCisJCXJldHVybiB0Y3BfY2hlY2tfcmVxKHNrLCBza2IsIHJlcSwgcHJldik7CisKKwluc2sgPSBfX3RjcF92NF9sb29rdXBfZXN0YWJsaXNoZWQoc2tiLT5uaC5pcGgtPnNhZGRyLAorCQkJCQkgIHRoLT5zb3VyY2UsCisJCQkJCSAgc2tiLT5uaC5pcGgtPmRhZGRyLAorCQkJCQkgIG50b2hzKHRoLT5kZXN0KSwKKwkJCQkJICB0Y3BfdjRfaWlmKHNrYikpOworCisJaWYgKG5zaykgeworCQlpZiAobnNrLT5za19zdGF0ZSAhPSBUQ1BfVElNRV9XQUlUKSB7CisJCQliaF9sb2NrX3NvY2sobnNrKTsKKwkJCXJldHVybiBuc2s7CisJCX0KKwkJdGNwX3R3X3B1dCgoc3RydWN0IHRjcF90d19idWNrZXQgKiluc2spOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1lOX0NPT0tJRVMKKwlpZiAoIXRoLT5yc3QgJiYgIXRoLT5zeW4gJiYgdGgtPmFjaykKKwkJc2sgPSBjb29raWVfdjRfY2hlY2soc2ssIHNrYiwgJihJUENCKHNrYiktPm9wdCkpOworI2VuZGlmCisJcmV0dXJuIHNrOworfQorCitzdGF0aWMgaW50IHRjcF92NF9jaGVja3N1bV9pbml0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSB7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCWlmICghdGNwX3Y0X2NoZWNrKHNrYi0+aC50aCwgc2tiLT5sZW4sIHNrYi0+bmguaXBoLT5zYWRkciwKKwkJCQkgIHNrYi0+bmguaXBoLT5kYWRkciwgc2tiLT5jc3VtKSkKKwkJCXJldHVybiAwOworCisJCU5FVERFQlVHKGlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImh3IHRjcCB2NCBjc3VtIGZhaWxlZFxuIikpOworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJfQorCWlmIChza2ItPmxlbiA8PSA3NikgeworCQlpZiAodGNwX3Y0X2NoZWNrKHNrYi0+aC50aCwgc2tiLT5sZW4sIHNrYi0+bmguaXBoLT5zYWRkciwKKwkJCQkgc2tiLT5uaC5pcGgtPmRhZGRyLAorCQkJCSBza2JfY2hlY2tzdW0oc2tiLCAwLCBza2ItPmxlbiwgMCkpKQorCQkJcmV0dXJuIC0xOworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCX0gZWxzZSB7CisJCXNrYi0+Y3N1bSA9IH50Y3BfdjRfY2hlY2soc2tiLT5oLnRoLCBza2ItPmxlbiwKKwkJCQkJICBza2ItPm5oLmlwaC0+c2FkZHIsCisJCQkJCSAgc2tiLT5uaC5pcGgtPmRhZGRyLCAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyogVGhlIHNvY2tldCBtdXN0IGhhdmUgaXQncyBzcGlubG9jayBoZWxkIHdoZW4gd2UgZ2V0CisgKiBoZXJlLgorICoKKyAqIFdlIGhhdmUgYSBwb3RlbnRpYWwgZG91YmxlLWxvY2sgY2FzZSBoZXJlLCBzbyBldmVuIHdoZW4KKyAqIGRvaW5nIGJhY2tsb2cgcHJvY2Vzc2luZyB3ZSB1c2UgdGhlIEJIIGxvY2tpbmcgc2NoZW1lLgorICogVGhpcyBpcyBiZWNhdXNlIHdlIGNhbm5vdCBzbGVlcCB3aXRoIHRoZSBvcmlnaW5hbCBzcGlubG9jaworICogaGVsZC4KKyAqLworaW50IHRjcF92NF9kb19yY3Yoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0VTVEFCTElTSEVEKSB7IC8qIEZhc3QgcGF0aCAqLworCQlUQ1BfQ0hFQ0tfVElNRVIoc2spOworCQlpZiAodGNwX3Jjdl9lc3RhYmxpc2hlZChzaywgc2tiLCBza2ItPmgudGgsIHNrYi0+bGVuKSkKKwkJCWdvdG8gcmVzZXQ7CisJCVRDUF9DSEVDS19USU1FUihzayk7CisJCXJldHVybiAwOworCX0KKworCWlmIChza2ItPmxlbiA8IChza2ItPmgudGgtPmRvZmYgPDwgMikgfHwgdGNwX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpCisJCWdvdG8gY3N1bV9lcnI7CisKKwlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9MSVNURU4pIHsKKwkJc3RydWN0IHNvY2sgKm5zayA9IHRjcF92NF9obmRfcmVxKHNrLCBza2IpOworCQlpZiAoIW5zaykKKwkJCWdvdG8gZGlzY2FyZDsKKworCQlpZiAobnNrICE9IHNrKSB7CisJCQlpZiAodGNwX2NoaWxkX3Byb2Nlc3Moc2ssIG5zaywgc2tiKSkKKwkJCQlnb3RvIHJlc2V0OworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlUQ1BfQ0hFQ0tfVElNRVIoc2spOworCWlmICh0Y3BfcmN2X3N0YXRlX3Byb2Nlc3Moc2ssIHNrYiwgc2tiLT5oLnRoLCBza2ItPmxlbikpCisJCWdvdG8gcmVzZXQ7CisJVENQX0NIRUNLX1RJTUVSKHNrKTsKKwlyZXR1cm4gMDsKKworcmVzZXQ6CisJdGNwX3Y0X3NlbmRfcmVzZXQoc2tiKTsKK2Rpc2NhcmQ6CisJa2ZyZWVfc2tiKHNrYik7CisJLyogQmUgY2FyZWZ1bCBoZXJlLiBJZiB0aGlzIGZ1bmN0aW9uIGdldHMgbW9yZSBjb21wbGljYXRlZCBhbmQKKwkgKiBnY2Mgc3VmZmVycyBmcm9tIHJlZ2lzdGVyIHByZXNzdXJlIG9uIHRoZSB4ODYsIHNrIChpbiAlZWJ4KQorCSAqIG1pZ2h0IGJlIGRlc3Ryb3llZCBoZXJlLiBUaGlzIGN1cnJlbnQgdmVyc2lvbiBjb21waWxlcyBjb3JyZWN0bHksCisJICogYnV0IHlvdSBoYXZlIGJlZW4gd2FybmVkLgorCSAqLworCXJldHVybiAwOworCitjc3VtX2VycjoKKwlUQ1BfSU5DX1NUQVRTX0JIKFRDUF9NSUJfSU5FUlJTKTsKKwlnb3RvIGRpc2NhcmQ7Cit9CisKKy8qCisgKglGcm9tIHRjcF9pbnB1dC5jCisgKi8KKworaW50IHRjcF92NF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgdGNwaGRyICp0aDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJaW50IHJldDsKKworCWlmIChza2ItPnBrdF90eXBlICE9IFBBQ0tFVF9IT1NUKQorCQlnb3RvIGRpc2NhcmRfaXQ7CisKKwkvKiBDb3VudCBpdCBldmVuIGlmIGl0J3MgYmFkICovCisJVENQX0lOQ19TVEFUU19CSChUQ1BfTUlCX0lOU0VHUyk7CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHRjcGhkcikpKQorCQlnb3RvIGRpc2NhcmRfaXQ7CisKKwl0aCA9IHNrYi0+aC50aDsKKworCWlmICh0aC0+ZG9mZiA8IHNpemVvZihzdHJ1Y3QgdGNwaGRyKSAvIDQpCisJCWdvdG8gYmFkX3BhY2tldDsKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCB0aC0+ZG9mZiAqIDQpKQorCQlnb3RvIGRpc2NhcmRfaXQ7CisKKwkvKiBBbiBleHBsYW5hdGlvbiBpcyByZXF1aXJlZCBoZXJlLCBJIHRoaW5rLgorCSAqIFBhY2tldCBsZW5ndGggYW5kIGRvZmYgYXJlIHZhbGlkYXRlZCBieSBoZWFkZXIgcHJlZGljdGlvbiwKKwkgKiBwcm92aWRlZCBjYXNlIG9mIHRoLT5kb2ZmPT0wIGlzIGVsaW1pbmV0ZWQuCisJICogU28sIHdlIGRlZmVyIHRoZSBjaGVja3MuICovCisJaWYgKChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSAmJgorCSAgICAgdGNwX3Y0X2NoZWNrc3VtX2luaXQoc2tiKSA8IDApKQorCQlnb3RvIGJhZF9wYWNrZXQ7CisKKwl0aCA9IHNrYi0+aC50aDsKKwlUQ1BfU0tCX0NCKHNrYiktPnNlcSA9IG50b2hsKHRoLT5zZXEpOworCVRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSA9IChUQ1BfU0tCX0NCKHNrYiktPnNlcSArIHRoLT5zeW4gKyB0aC0+ZmluICsKKwkJCQkgICAgc2tiLT5sZW4gLSB0aC0+ZG9mZiAqIDQpOworCVRDUF9TS0JfQ0Ioc2tiKS0+YWNrX3NlcSA9IG50b2hsKHRoLT5hY2tfc2VxKTsKKwlUQ1BfU0tCX0NCKHNrYiktPndoZW4JID0gMDsKKwlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzCSA9IHNrYi0+bmguaXBoLT50b3M7CisJVENQX1NLQl9DQihza2IpLT5zYWNrZWQJID0gMDsKKworCXNrID0gX190Y3BfdjRfbG9va3VwKHNrYi0+bmguaXBoLT5zYWRkciwgdGgtPnNvdXJjZSwKKwkJCSAgICAgc2tiLT5uaC5pcGgtPmRhZGRyLCBudG9ocyh0aC0+ZGVzdCksCisJCQkgICAgIHRjcF92NF9paWYoc2tiKSk7CisKKwlpZiAoIXNrKQorCQlnb3RvIG5vX3RjcF9zb2NrZXQ7CisKK3Byb2Nlc3M6CisJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfVElNRV9XQUlUKQorCQlnb3RvIGRvX3RpbWVfd2FpdDsKKworCWlmICgheGZybTRfcG9saWN5X2NoZWNrKHNrLCBYRlJNX1BPTElDWV9JTiwgc2tiKSkKKwkJZ290byBkaXNjYXJkX2FuZF9yZWxzZTsKKworCWlmIChza19maWx0ZXIoc2ssIHNrYiwgMCkpCisJCWdvdG8gZGlzY2FyZF9hbmRfcmVsc2U7CisKKwlza2ItPmRldiA9IE5VTEw7CisKKwliaF9sb2NrX3NvY2soc2spOworCXJldCA9IDA7CisJaWYgKCFzb2NrX293bmVkX2J5X3VzZXIoc2spKSB7CisJCWlmICghdGNwX3ByZXF1ZXVlKHNrLCBza2IpKQorCQkJcmV0ID0gdGNwX3Y0X2RvX3Jjdihzaywgc2tiKTsKKwl9IGVsc2UKKwkJc2tfYWRkX2JhY2tsb2coc2ssIHNrYik7CisJYmhfdW5sb2NrX3NvY2soc2spOworCisJc29ja19wdXQoc2spOworCisJcmV0dXJuIHJldDsKKworbm9fdGNwX3NvY2tldDoKKwlpZiAoIXhmcm00X3BvbGljeV9jaGVjayhOVUxMLCBYRlJNX1BPTElDWV9JTiwgc2tiKSkKKwkJZ290byBkaXNjYXJkX2l0OworCisJaWYgKHNrYi0+bGVuIDwgKHRoLT5kb2ZmIDw8IDIpIHx8IHRjcF9jaGVja3N1bV9jb21wbGV0ZShza2IpKSB7CitiYWRfcGFja2V0OgorCQlUQ1BfSU5DX1NUQVRTX0JIKFRDUF9NSUJfSU5FUlJTKTsKKwl9IGVsc2UgeworCQl0Y3BfdjRfc2VuZF9yZXNldChza2IpOworCX0KKworZGlzY2FyZF9pdDoKKwkvKiBEaXNjYXJkIGZyYW1lLiAqLworCWtmcmVlX3NrYihza2IpOworICAJcmV0dXJuIDA7CisKK2Rpc2NhcmRfYW5kX3JlbHNlOgorCXNvY2tfcHV0KHNrKTsKKwlnb3RvIGRpc2NhcmRfaXQ7CisKK2RvX3RpbWVfd2FpdDoKKwlpZiAoIXhmcm00X3BvbGljeV9jaGVjayhOVUxMLCBYRlJNX1BPTElDWV9JTiwgc2tiKSkgeworCQl0Y3BfdHdfcHV0KChzdHJ1Y3QgdGNwX3R3X2J1Y2tldCAqKSBzayk7CisJCWdvdG8gZGlzY2FyZF9pdDsKKwl9CisKKwlpZiAoc2tiLT5sZW4gPCAodGgtPmRvZmYgPDwgMikgfHwgdGNwX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpIHsKKwkJVENQX0lOQ19TVEFUU19CSChUQ1BfTUlCX0lORVJSUyk7CisJCXRjcF90d19wdXQoKHN0cnVjdCB0Y3BfdHdfYnVja2V0ICopIHNrKTsKKwkJZ290byBkaXNjYXJkX2l0OworCX0KKwlzd2l0Y2ggKHRjcF90aW1ld2FpdF9zdGF0ZV9wcm9jZXNzKChzdHJ1Y3QgdGNwX3R3X2J1Y2tldCAqKXNrLAorCQkJCQkgICBza2IsIHRoLCBza2ItPmxlbikpIHsKKwljYXNlIFRDUF9UV19TWU46IHsKKwkJc3RydWN0IHNvY2sgKnNrMiA9IHRjcF92NF9sb29rdXBfbGlzdGVuZXIoc2tiLT5uaC5pcGgtPmRhZGRyLAorCQkJCQkJCSAgbnRvaHModGgtPmRlc3QpLAorCQkJCQkJCSAgdGNwX3Y0X2lpZihza2IpKTsKKwkJaWYgKHNrMikgeworCQkJdGNwX3R3X2Rlc2NoZWR1bGUoKHN0cnVjdCB0Y3BfdHdfYnVja2V0ICopc2spOworCQkJdGNwX3R3X3B1dCgoc3RydWN0IHRjcF90d19idWNrZXQgKilzayk7CisJCQlzayA9IHNrMjsKKwkJCWdvdG8gcHJvY2VzczsKKwkJfQorCQkvKiBGYWxsIHRocm91Z2ggdG8gQUNLICovCisJfQorCWNhc2UgVENQX1RXX0FDSzoKKwkJdGNwX3Y0X3RpbWV3YWl0X2Fjayhzaywgc2tiKTsKKwkJYnJlYWs7CisJY2FzZSBUQ1BfVFdfUlNUOgorCQlnb3RvIG5vX3RjcF9zb2NrZXQ7CisJY2FzZSBUQ1BfVFdfU1VDQ0VTUzo7CisJfQorCWdvdG8gZGlzY2FyZF9pdDsKK30KKworLyogV2l0aCBwZXItYnVja2V0IGxvY2tzIHRoaXMgb3BlcmF0aW9uIGlzIG5vdC1hdG9taWMsIHNvIHRoYXQKKyAqIHRoaXMgdmVyc2lvbiBpcyBub3Qgd29yc2UuCisgKi8KK3N0YXRpYyB2b2lkIF9fdGNwX3Y0X3JlaGFzaChzdHJ1Y3Qgc29jayAqc2spCit7CisJc2stPnNrX3Byb3QtPnVuaGFzaChzayk7CisJc2stPnNrX3Byb3QtPmhhc2goc2spOworfQorCitzdGF0aWMgaW50IHRjcF92NF9yZXNlbGVjdF9zYWRkcihzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCWludCBlcnI7CisJc3RydWN0IHJ0YWJsZSAqcnQ7CisJX191MzIgb2xkX3NhZGRyID0gaW5ldC0+c2FkZHI7CisJX191MzIgbmV3X3NhZGRyOworCV9fdTMyIGRhZGRyID0gaW5ldC0+ZGFkZHI7CisKKwlpZiAoaW5ldC0+b3B0ICYmIGluZXQtPm9wdC0+c3JyKQorCQlkYWRkciA9IGluZXQtPm9wdC0+ZmFkZHI7CisKKwkvKiBRdWVyeSBuZXcgcm91dGUuICovCisJZXJyID0gaXBfcm91dGVfY29ubmVjdCgmcnQsIGRhZGRyLCAwLAorCQkJICAgICAgIFJUX0NPTk5fRkxBR1Moc2spLAorCQkJICAgICAgIHNrLT5za19ib3VuZF9kZXZfaWYsCisJCQkgICAgICAgSVBQUk9UT19UQ1AsCisJCQkgICAgICAgaW5ldC0+c3BvcnQsIGluZXQtPmRwb3J0LCBzayk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCV9fc2tfZHN0X3NldChzaywgJnJ0LT51LmRzdCk7CisJdGNwX3Y0X3NldHVwX2NhcHMoc2ssICZydC0+dS5kc3QpOworCisJbmV3X3NhZGRyID0gcnQtPnJ0X3NyYzsKKworCWlmIChuZXdfc2FkZHIgPT0gb2xkX3NhZGRyKQorCQlyZXR1cm4gMDsKKworCWlmIChzeXNjdGxfaXBfZHluYWRkciA+IDEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidGNwX3Y0X3JlYnVpbGRfaGVhZGVyKCk6IHNoaWZ0aW5nIGluZXQtPiIKKwkJCQkgInNhZGRyIGZyb20gJWQuJWQuJWQuJWQgdG8gJWQuJWQuJWQuJWRcbiIsCisJCSAgICAgICBOSVBRVUFEKG9sZF9zYWRkciksCisJCSAgICAgICBOSVBRVUFEKG5ld19zYWRkcikpOworCX0KKworCWluZXQtPnNhZGRyID0gbmV3X3NhZGRyOworCWluZXQtPnJjdl9zYWRkciA9IG5ld19zYWRkcjsKKworCS8qIFhYWCBUaGUgb25seSBvbmUgdWdseSBzcG90IHdoZXJlIHdlIG5lZWQgdG8KKwkgKiBYWFggcmVhbGx5IGNoYW5nZSB0aGUgc29ja2V0cyBpZGVudGl0eSBhZnRlcgorCSAqIFhYWCBpdCBoYXMgZW50ZXJlZCB0aGUgaGFzaGVzLiAtRGF2ZU0KKwkgKgorCSAqIEJlc2lkZXMgdGhhdCwgaXQgZG9lcyBub3QgY2hlY2sgZm9yIGNvbm5lY3Rpb24KKwkgKiB1bmlxdWVuZXNzLiBXYWl0IGZvciB0cm91Ymxlcy4KKwkgKi8KKwlfX3RjcF92NF9yZWhhc2goc2spOworCXJldHVybiAwOworfQorCitpbnQgdGNwX3Y0X3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisJc3RydWN0IHJ0YWJsZSAqcnQgPSAoc3RydWN0IHJ0YWJsZSAqKV9fc2tfZHN0X2NoZWNrKHNrLCAwKTsKKwl1MzIgZGFkZHI7CisJaW50IGVycjsKKworCS8qIFJvdXRlIGlzIE9LLCBub3RoaW5nIHRvIGRvLiAqLworCWlmIChydCkKKwkJcmV0dXJuIDA7CisKKwkvKiBSZXJvdXRlLiAqLworCWRhZGRyID0gaW5ldC0+ZGFkZHI7CisJaWYgKGluZXQtPm9wdCAmJiBpbmV0LT5vcHQtPnNycikKKwkJZGFkZHIgPSBpbmV0LT5vcHQtPmZhZGRyOworCisJeworCQlzdHJ1Y3QgZmxvd2kgZmwgPSB7IC5vaWYgPSBzay0+c2tfYm91bmRfZGV2X2lmLAorCQkJCSAgICAubmxfdSA9IHsgLmlwNF91ID0KKwkJCQkJICAgICAgeyAuZGFkZHIgPSBkYWRkciwKKwkJCQkJCS5zYWRkciA9IGluZXQtPnNhZGRyLAorCQkJCQkJLnRvcyA9IFJUX0NPTk5fRkxBR1Moc2spIH0gfSwKKwkJCQkgICAgLnByb3RvID0gSVBQUk9UT19UQ1AsCisJCQkJICAgIC51bGlfdSA9IHsgLnBvcnRzID0KKwkJCQkJICAgICAgIHsgLnNwb3J0ID0gaW5ldC0+c3BvcnQsCisJCQkJCQkgLmRwb3J0ID0gaW5ldC0+ZHBvcnQgfSB9IH07CisJCQkJCQkKKwkJZXJyID0gaXBfcm91dGVfb3V0cHV0X2Zsb3coJnJ0LCAmZmwsIHNrLCAwKTsKKwl9CisJaWYgKCFlcnIpIHsKKwkJX19za19kc3Rfc2V0KHNrLCAmcnQtPnUuZHN0KTsKKwkJdGNwX3Y0X3NldHVwX2NhcHMoc2ssICZydC0+dS5kc3QpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBSb3V0aW5nIGZhaWxlZC4uLiAqLworCXNrLT5za19yb3V0ZV9jYXBzID0gMDsKKworCWlmICghc3lzY3RsX2lwX2R5bmFkZHIgfHwKKwkgICAgc2stPnNrX3N0YXRlICE9IFRDUF9TWU5fU0VOVCB8fAorCSAgICAoc2stPnNrX3VzZXJsb2NrcyAmIFNPQ0tfQklOREFERFJfTE9DSykgfHwKKwkgICAgKGVyciA9IHRjcF92NF9yZXNlbGVjdF9zYWRkcihzaykpICE9IDApCisJCXNrLT5za19lcnJfc29mdCA9IC1lcnI7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCB2NF9hZGRyMnNvY2thZGRyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2thZGRyICogdWFkZHIpCit7CisJc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopIHVhZGRyOworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKworCXNpbi0+c2luX2ZhbWlseQkJPSBBRl9JTkVUOworCXNpbi0+c2luX2FkZHIuc19hZGRyCT0gaW5ldC0+ZGFkZHI7CisJc2luLT5zaW5fcG9ydAkJPSBpbmV0LT5kcG9ydDsKK30KKworLyogVkoncyBpZGVhLiBTYXZlIGxhc3QgdGltZXN0YW1wIHNlZW4gZnJvbSB0aGlzIGRlc3RpbmF0aW9uCisgKiBhbmQgaG9sZCBpdCBhdCBsZWFzdCBmb3Igbm9ybWFsIHRpbWV3YWl0IGludGVydmFsIHRvIHVzZSBmb3IgZHVwbGljYXRlCisgKiBzZWdtZW50IGRldGVjdGlvbiBpbiBzdWJzZXF1ZW50IGNvbm5lY3Rpb25zLCBiZWZvcmUgdGhleSBlbnRlciBzeW5jaHJvbml6ZWQKKyAqIHN0YXRlLgorICovCisKK2ludCB0Y3BfdjRfcmVtZW1iZXJfc3RhbXAoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgcnRhYmxlICpydCA9IChzdHJ1Y3QgcnRhYmxlICopX19za19kc3RfZ2V0KHNrKTsKKwlzdHJ1Y3QgaW5ldF9wZWVyICpwZWVyID0gTlVMTDsKKwlpbnQgcmVsZWFzZV9pdCA9IDA7CisKKwlpZiAoIXJ0IHx8IHJ0LT5ydF9kc3QgIT0gaW5ldC0+ZGFkZHIpIHsKKwkJcGVlciA9IGluZXRfZ2V0cGVlcihpbmV0LT5kYWRkciwgMSk7CisJCXJlbGVhc2VfaXQgPSAxOworCX0gZWxzZSB7CisJCWlmICghcnQtPnBlZXIpCisJCQlydF9iaW5kX3BlZXIocnQsIDEpOworCQlwZWVyID0gcnQtPnBlZXI7CisJfQorCisJaWYgKHBlZXIpIHsKKwkJaWYgKChzMzIpKHBlZXItPnRjcF90cyAtIHRwLT5yeF9vcHQudHNfcmVjZW50KSA8PSAwIHx8CisJCSAgICAocGVlci0+dGNwX3RzX3N0YW1wICsgVENQX1BBV1NfTVNMIDwgeHRpbWUudHZfc2VjICYmCisJCSAgICAgcGVlci0+dGNwX3RzX3N0YW1wIDw9IHRwLT5yeF9vcHQudHNfcmVjZW50X3N0YW1wKSkgeworCQkJcGVlci0+dGNwX3RzX3N0YW1wID0gdHAtPnJ4X29wdC50c19yZWNlbnRfc3RhbXA7CisJCQlwZWVyLT50Y3BfdHMgPSB0cC0+cnhfb3B0LnRzX3JlY2VudDsKKwkJfQorCQlpZiAocmVsZWFzZV9pdCkKKwkJCWluZXRfcHV0cGVlcihwZWVyKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCB0Y3BfdjRfdHdfcmVtZW1iZXJfc3RhbXAoc3RydWN0IHRjcF90d19idWNrZXQgKnR3KQoreworCXN0cnVjdCBpbmV0X3BlZXIgKnBlZXIgPSBOVUxMOworCisJcGVlciA9IGluZXRfZ2V0cGVlcih0dy0+dHdfZGFkZHIsIDEpOworCisJaWYgKHBlZXIpIHsKKwkJaWYgKChzMzIpKHBlZXItPnRjcF90cyAtIHR3LT50d190c19yZWNlbnQpIDw9IDAgfHwKKwkJICAgIChwZWVyLT50Y3BfdHNfc3RhbXAgKyBUQ1BfUEFXU19NU0wgPCB4dGltZS50dl9zZWMgJiYKKwkJICAgICBwZWVyLT50Y3BfdHNfc3RhbXAgPD0gdHctPnR3X3RzX3JlY2VudF9zdGFtcCkpIHsKKwkJCXBlZXItPnRjcF90c19zdGFtcCA9IHR3LT50d190c19yZWNlbnRfc3RhbXA7CisJCQlwZWVyLT50Y3BfdHMgPSB0dy0+dHdfdHNfcmVjZW50OworCQl9CisJCWluZXRfcHV0cGVlcihwZWVyKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB0Y3BfZnVuYyBpcHY0X3NwZWNpZmljID0geworCS5xdWV1ZV94bWl0CT0JaXBfcXVldWVfeG1pdCwKKwkuc2VuZF9jaGVjawk9CXRjcF92NF9zZW5kX2NoZWNrLAorCS5yZWJ1aWxkX2hlYWRlcgk9CXRjcF92NF9yZWJ1aWxkX2hlYWRlciwKKwkuY29ubl9yZXF1ZXN0CT0JdGNwX3Y0X2Nvbm5fcmVxdWVzdCwKKwkuc3luX3JlY3Zfc29jawk9CXRjcF92NF9zeW5fcmVjdl9zb2NrLAorCS5yZW1lbWJlcl9zdGFtcAk9CXRjcF92NF9yZW1lbWJlcl9zdGFtcCwKKwkubmV0X2hlYWRlcl9sZW4JPQlzaXplb2Yoc3RydWN0IGlwaGRyKSwKKwkuc2V0c29ja29wdAk9CWlwX3NldHNvY2tvcHQsCisJLmdldHNvY2tvcHQJPQlpcF9nZXRzb2Nrb3B0LAorCS5hZGRyMnNvY2thZGRyCT0JdjRfYWRkcjJzb2NrYWRkciwKKwkuc29ja2FkZHJfbGVuCT0Jc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbiksCit9OworCisvKiBOT1RFOiBBIGxvdCBvZiB0aGluZ3Mgc2V0IHRvIHplcm8gZXhwbGljaXRseSBieSBjYWxsIHRvCisgKiAgICAgICBza19hbGxvYygpIHNvIG5lZWQgbm90IGJlIGRvbmUgaGVyZS4KKyAqLworc3RhdGljIGludCB0Y3BfdjRfaW5pdF9zb2NrKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOworCXRjcF9pbml0X3htaXRfdGltZXJzKHNrKTsKKwl0Y3BfcHJlcXVldWVfaW5pdCh0cCk7CisKKwl0cC0+cnRvICA9IFRDUF9USU1FT1VUX0lOSVQ7CisJdHAtPm1kZXYgPSBUQ1BfVElNRU9VVF9JTklUOworCisJLyogU28gbWFueSBUQ1AgaW1wbGVtZW50YXRpb25zIG91dCB0aGVyZSAoaW5jb3JyZWN0bHkpIGNvdW50IHRoZQorCSAqIGluaXRpYWwgU1lOIGZyYW1lIGluIHRoZWlyIGRlbGF5ZWQtQUNLIGFuZCBjb25nZXN0aW9uIGNvbnRyb2wKKwkgKiBhbGdvcml0aG1zIHRoYXQgd2UgbXVzdCBoYXZlIHRoZSBmb2xsb3dpbmcgYmFuZGFpZCB0byB0YWxrCisJICogZWZmaWNpZW50bHkgdG8gdGhlbS4gIC1EYXZlTQorCSAqLworCXRwLT5zbmRfY3duZCA9IDI7CisKKwkvKiBTZWUgZHJhZnQtc3RldmVucy10Y3BjYS1zcGVjLTAxIGZvciBkaXNjdXNzaW9uIG9mIHRoZQorCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZXNlIHZhbHVlcy4KKwkgKi8KKwl0cC0+c25kX3NzdGhyZXNoID0gMHg3ZmZmZmZmZjsJLyogSW5maW5pdHkgKi8KKwl0cC0+c25kX2N3bmRfY2xhbXAgPSB+MDsKKwl0cC0+bXNzX2NhY2hlX3N0ZCA9IHRwLT5tc3NfY2FjaGUgPSA1MzY7CisKKwl0cC0+cmVvcmRlcmluZyA9IHN5c2N0bF90Y3BfcmVvcmRlcmluZzsKKworCXNrLT5za19zdGF0ZSA9IFRDUF9DTE9TRTsKKworCXNrLT5za193cml0ZV9zcGFjZSA9IHNrX3N0cmVhbV93cml0ZV9zcGFjZTsKKwlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX1VTRV9XUklURV9RVUVVRSk7CisKKwl0cC0+YWZfc3BlY2lmaWMgPSAmaXB2NF9zcGVjaWZpYzsKKworCXNrLT5za19zbmRidWYgPSBzeXNjdGxfdGNwX3dtZW1bMV07CisJc2stPnNrX3JjdmJ1ZiA9IHN5c2N0bF90Y3Bfcm1lbVsxXTsKKworCWF0b21pY19pbmMoJnRjcF9zb2NrZXRzX2FsbG9jYXRlZCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHRjcF92NF9kZXN0cm95X3NvY2soc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJdGNwX2NsZWFyX3htaXRfdGltZXJzKHNrKTsKKworCS8qIENsZWFudXAgdXAgdGhlIHdyaXRlIGJ1ZmZlci4gKi8KKyAgCXNrX3N0cmVhbV93cml0ZXF1ZXVlX3B1cmdlKHNrKTsKKworCS8qIENsZWFucyB1cCBvdXIsIGhvcGVmdWxseSBlbXB0eSwgb3V0X29mX29yZGVyX3F1ZXVlLiAqLworICAJX19za2JfcXVldWVfcHVyZ2UoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOworCisJLyogQ2xlYW4gcHJlcXVldWUsIGl0IG11c3QgYmUgZW1wdHkgcmVhbGx5ICovCisJX19za2JfcXVldWVfcHVyZ2UoJnRwLT51Y29weS5wcmVxdWV1ZSk7CisKKwkvKiBDbGVhbiB1cCBhIHJlZmVyZW5jZWQgVENQIGJpbmQgYnVja2V0LiAqLworCWlmICh0cC0+YmluZF9oYXNoKQorCQl0Y3BfcHV0X3BvcnQoc2spOworCisJLyoKKwkgKiBJZiBzZW5kbXNnIGNhY2hlZCBwYWdlIGV4aXN0cywgdG9zcyBpdC4KKwkgKi8KKwlpZiAoc2stPnNrX3NuZG1zZ19wYWdlKSB7CisJCV9fZnJlZV9wYWdlKHNrLT5za19zbmRtc2dfcGFnZSk7CisJCXNrLT5za19zbmRtc2dfcGFnZSA9IE5VTEw7CisJfQorCisJYXRvbWljX2RlYygmdGNwX3NvY2tldHNfYWxsb2NhdGVkKTsKKworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHRjcF92NF9kZXN0cm95X3NvY2spOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKy8qIFByb2MgZmlsZXN5c3RlbSBUQ1Agc29jayBsaXN0IGR1bXBpbmcuICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRjcF90d19idWNrZXQgKnR3X2hlYWQoc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQpCit7CisJcmV0dXJuIGhsaXN0X2VtcHR5KGhlYWQpID8gTlVMTCA6CisJCWxpc3RfZW50cnkoaGVhZC0+Zmlyc3QsIHN0cnVjdCB0Y3BfdHdfYnVja2V0LCB0d19ub2RlKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdGNwX3R3X2J1Y2tldCAqdHdfbmV4dChzdHJ1Y3QgdGNwX3R3X2J1Y2tldCAqdHcpCit7CisJcmV0dXJuIHR3LT50d19ub2RlLm5leHQgPworCQlobGlzdF9lbnRyeSh0dy0+dHdfbm9kZS5uZXh0LCB0eXBlb2YoKnR3KSwgdHdfbm9kZSkgOiBOVUxMOworfQorCitzdGF0aWMgdm9pZCAqbGlzdGVuaW5nX2dldF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpjdXIpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBjdXI7CisJc3RydWN0IHRjcF9pdGVyX3N0YXRlKiBzdCA9IHNlcS0+cHJpdmF0ZTsKKworCWlmICghc2spIHsKKwkJc3QtPmJ1Y2tldCA9IDA7CisJCXNrID0gc2tfaGVhZCgmdGNwX2xpc3RlbmluZ19oYXNoWzBdKTsKKwkJZ290byBnZXRfc2s7CisJfQorCisJKytzdC0+bnVtOworCisJaWYgKHN0LT5zdGF0ZSA9PSBUQ1BfU0VRX1NUQVRFX09QRU5SRVEpIHsKKwkJc3RydWN0IG9wZW5fcmVxdWVzdCAqcmVxID0gY3VyOworCisJICAgICAgIAl0cCA9IHRjcF9zayhzdC0+c3luX3dhaXRfc2spOworCQlyZXEgPSByZXEtPmRsX25leHQ7CisJCXdoaWxlICgxKSB7CisJCQl3aGlsZSAocmVxKSB7CisJCQkJaWYgKHJlcS0+Y2xhc3MtPmZhbWlseSA9PSBzdC0+ZmFtaWx5KSB7CisJCQkJCWN1ciA9IHJlcTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCXJlcSA9IHJlcS0+ZGxfbmV4dDsKKwkJCX0KKwkJCWlmICgrK3N0LT5zYnVja2V0ID49IFRDUF9TWU5RX0hTSVpFKQorCQkJCWJyZWFrOworZ2V0X3JlcToKKwkJCXJlcSA9IHRwLT5saXN0ZW5fb3B0LT5zeW5fdGFibGVbc3QtPnNidWNrZXRdOworCQl9CisJCXNrCSAgPSBza19uZXh0KHN0LT5zeW5fd2FpdF9zayk7CisJCXN0LT5zdGF0ZSA9IFRDUF9TRVFfU1RBVEVfTElTVEVOSU5HOworCQlyZWFkX3VubG9ja19iaCgmdHAtPnN5bl93YWl0X2xvY2spOworCX0gZWxzZSB7CisJICAgICAgIAl0cCA9IHRjcF9zayhzayk7CisJCXJlYWRfbG9ja19iaCgmdHAtPnN5bl93YWl0X2xvY2spOworCQlpZiAodHAtPmxpc3Rlbl9vcHQgJiYgdHAtPmxpc3Rlbl9vcHQtPnFsZW4pCisJCQlnb3RvIHN0YXJ0X3JlcTsKKwkJcmVhZF91bmxvY2tfYmgoJnRwLT5zeW5fd2FpdF9sb2NrKTsKKwkJc2sgPSBza19uZXh0KHNrKTsKKwl9CitnZXRfc2s6CisJc2tfZm9yX2VhY2hfZnJvbShzaywgbm9kZSkgeworCQlpZiAoc2stPnNrX2ZhbWlseSA9PSBzdC0+ZmFtaWx5KSB7CisJCQljdXIgPSBzazsKKwkJCWdvdG8gb3V0OworCQl9CisJICAgICAgIAl0cCA9IHRjcF9zayhzayk7CisJCXJlYWRfbG9ja19iaCgmdHAtPnN5bl93YWl0X2xvY2spOworCQlpZiAodHAtPmxpc3Rlbl9vcHQgJiYgdHAtPmxpc3Rlbl9vcHQtPnFsZW4pIHsKK3N0YXJ0X3JlcToKKwkJCXN0LT51aWQJCT0gc29ja19pX3VpZChzayk7CisJCQlzdC0+c3luX3dhaXRfc2sgPSBzazsKKwkJCXN0LT5zdGF0ZQk9IFRDUF9TRVFfU1RBVEVfT1BFTlJFUTsKKwkJCXN0LT5zYnVja2V0CT0gMDsKKwkJCWdvdG8gZ2V0X3JlcTsKKwkJfQorCQlyZWFkX3VubG9ja19iaCgmdHAtPnN5bl93YWl0X2xvY2spOworCX0KKwlpZiAoKytzdC0+YnVja2V0IDwgVENQX0xIVEFCTEVfU0laRSkgeworCQlzayA9IHNrX2hlYWQoJnRjcF9saXN0ZW5pbmdfaGFzaFtzdC0+YnVja2V0XSk7CisJCWdvdG8gZ2V0X3NrOworCX0KKwljdXIgPSBOVUxMOworb3V0OgorCXJldHVybiBjdXI7Cit9CisKK3N0YXRpYyB2b2lkICpsaXN0ZW5pbmdfZ2V0X2lkeChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJdm9pZCAqcmMgPSBsaXN0ZW5pbmdfZ2V0X25leHQoc2VxLCBOVUxMKTsKKworCXdoaWxlIChyYyAmJiAqcG9zKSB7CisJCXJjID0gbGlzdGVuaW5nX2dldF9uZXh0KHNlcSwgcmMpOworCQktLSpwb3M7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgKmVzdGFibGlzaGVkX2dldF9maXJzdChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwlzdHJ1Y3QgdGNwX2l0ZXJfc3RhdGUqIHN0ID0gc2VxLT5wcml2YXRlOworCXZvaWQgKnJjID0gTlVMTDsKKworCWZvciAoc3QtPmJ1Y2tldCA9IDA7IHN0LT5idWNrZXQgPCB0Y3BfZWhhc2hfc2l6ZTsgKytzdC0+YnVja2V0KSB7CisJCXN0cnVjdCBzb2NrICpzazsKKwkJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJCXN0cnVjdCB0Y3BfdHdfYnVja2V0ICp0dzsKKworCQkvKiBXZSBjYW4gcmVzY2hlZHVsZSBfYmVmb3JlXyBoYXZpbmcgcGlja2VkIHRoZSB0YXJnZXQ6ICovCisJCWNvbmRfcmVzY2hlZF9zb2Z0aXJxKCk7CisKKwkJcmVhZF9sb2NrKCZ0Y3BfZWhhc2hbc3QtPmJ1Y2tldF0ubG9jayk7CisJCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmdGNwX2VoYXNoW3N0LT5idWNrZXRdLmNoYWluKSB7CisJCQlpZiAoc2stPnNrX2ZhbWlseSAhPSBzdC0+ZmFtaWx5KSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlyYyA9IHNrOworCQkJZ290byBvdXQ7CisJCX0KKwkJc3QtPnN0YXRlID0gVENQX1NFUV9TVEFURV9USU1FX1dBSVQ7CisJCXR3X2Zvcl9lYWNoKHR3LCBub2RlLAorCQkJICAgICZ0Y3BfZWhhc2hbc3QtPmJ1Y2tldCArIHRjcF9laGFzaF9zaXplXS5jaGFpbikgeworCQkJaWYgKHR3LT50d19mYW1pbHkgIT0gc3QtPmZhbWlseSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcmMgPSB0dzsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJlYWRfdW5sb2NrKCZ0Y3BfZWhhc2hbc3QtPmJ1Y2tldF0ubG9jayk7CisJCXN0LT5zdGF0ZSA9IFRDUF9TRVFfU1RBVEVfRVNUQUJMSVNIRUQ7CisJfQorb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgKmVzdGFibGlzaGVkX2dldF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpjdXIpCit7CisJc3RydWN0IHNvY2sgKnNrID0gY3VyOworCXN0cnVjdCB0Y3BfdHdfYnVja2V0ICp0dzsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgdGNwX2l0ZXJfc3RhdGUqIHN0ID0gc2VxLT5wcml2YXRlOworCisJKytzdC0+bnVtOworCisJaWYgKHN0LT5zdGF0ZSA9PSBUQ1BfU0VRX1NUQVRFX1RJTUVfV0FJVCkgeworCQl0dyA9IGN1cjsKKwkJdHcgPSB0d19uZXh0KHR3KTsKK2dldF90dzoKKwkJd2hpbGUgKHR3ICYmIHR3LT50d19mYW1pbHkgIT0gc3QtPmZhbWlseSkgeworCQkJdHcgPSB0d19uZXh0KHR3KTsKKwkJfQorCQlpZiAodHcpIHsKKwkJCWN1ciA9IHR3OworCQkJZ290byBvdXQ7CisJCX0KKwkJcmVhZF91bmxvY2soJnRjcF9laGFzaFtzdC0+YnVja2V0XS5sb2NrKTsKKwkJc3QtPnN0YXRlID0gVENQX1NFUV9TVEFURV9FU1RBQkxJU0hFRDsKKworCQkvKiBXZSBjYW4gcmVzY2hlZHVsZSBiZXR3ZWVuIGJ1Y2tldHM6ICovCisJCWNvbmRfcmVzY2hlZF9zb2Z0aXJxKCk7CisKKwkJaWYgKCsrc3QtPmJ1Y2tldCA8IHRjcF9laGFzaF9zaXplKSB7CisJCQlyZWFkX2xvY2soJnRjcF9laGFzaFtzdC0+YnVja2V0XS5sb2NrKTsKKwkJCXNrID0gc2tfaGVhZCgmdGNwX2VoYXNoW3N0LT5idWNrZXRdLmNoYWluKTsKKwkJfSBlbHNlIHsKKwkJCWN1ciA9IE5VTEw7CisJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZQorCQlzayA9IHNrX25leHQoc2spOworCisJc2tfZm9yX2VhY2hfZnJvbShzaywgbm9kZSkgeworCQlpZiAoc2stPnNrX2ZhbWlseSA9PSBzdC0+ZmFtaWx5KQorCQkJZ290byBmb3VuZDsKKwl9CisKKwlzdC0+c3RhdGUgPSBUQ1BfU0VRX1NUQVRFX1RJTUVfV0FJVDsKKwl0dyA9IHR3X2hlYWQoJnRjcF9laGFzaFtzdC0+YnVja2V0ICsgdGNwX2VoYXNoX3NpemVdLmNoYWluKTsKKwlnb3RvIGdldF90dzsKK2ZvdW5kOgorCWN1ciA9IHNrOworb3V0OgorCXJldHVybiBjdXI7Cit9CisKK3N0YXRpYyB2b2lkICplc3RhYmxpc2hlZF9nZXRfaWR4KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgcG9zKQoreworCXZvaWQgKnJjID0gZXN0YWJsaXNoZWRfZ2V0X2ZpcnN0KHNlcSk7CisKKwl3aGlsZSAocmMgJiYgcG9zKSB7CisJCXJjID0gZXN0YWJsaXNoZWRfZ2V0X25leHQoc2VxLCByYyk7CisJCS0tcG9zOworCX0JCQorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgKnRjcF9nZXRfaWR4KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgcG9zKQoreworCXZvaWQgKnJjOworCXN0cnVjdCB0Y3BfaXRlcl9zdGF0ZSogc3QgPSBzZXEtPnByaXZhdGU7CisKKwl0Y3BfbGlzdGVuX2xvY2soKTsKKwlzdC0+c3RhdGUgPSBUQ1BfU0VRX1NUQVRFX0xJU1RFTklORzsKKwlyYwkgID0gbGlzdGVuaW5nX2dldF9pZHgoc2VxLCAmcG9zKTsKKworCWlmICghcmMpIHsKKwkJdGNwX2xpc3Rlbl91bmxvY2soKTsKKwkJbG9jYWxfYmhfZGlzYWJsZSgpOworCQlzdC0+c3RhdGUgPSBUQ1BfU0VRX1NUQVRFX0VTVEFCTElTSEVEOworCQlyYwkgID0gZXN0YWJsaXNoZWRfZ2V0X2lkeChzZXEsIHBvcyk7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCAqdGNwX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHRjcF9pdGVyX3N0YXRlKiBzdCA9IHNlcS0+cHJpdmF0ZTsKKwlzdC0+c3RhdGUgPSBUQ1BfU0VRX1NUQVRFX0xJU1RFTklORzsKKwlzdC0+bnVtID0gMDsKKwlyZXR1cm4gKnBvcyA/IHRjcF9nZXRfaWR4KHNlcSwgKnBvcyAtIDEpIDogU0VRX1NUQVJUX1RPS0VOOworfQorCitzdGF0aWMgdm9pZCAqdGNwX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwl2b2lkICpyYyA9IE5VTEw7CisJc3RydWN0IHRjcF9pdGVyX3N0YXRlKiBzdDsKKworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlyYyA9IHRjcF9nZXRfaWR4KHNlcSwgMCk7CisJCWdvdG8gb3V0OworCX0KKwlzdCA9IHNlcS0+cHJpdmF0ZTsKKworCXN3aXRjaCAoc3QtPnN0YXRlKSB7CisJY2FzZSBUQ1BfU0VRX1NUQVRFX09QRU5SRVE6CisJY2FzZSBUQ1BfU0VRX1NUQVRFX0xJU1RFTklORzoKKwkJcmMgPSBsaXN0ZW5pbmdfZ2V0X25leHQoc2VxLCB2KTsKKwkJaWYgKCFyYykgeworCQkJdGNwX2xpc3Rlbl91bmxvY2soKTsKKwkJCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwkJCXN0LT5zdGF0ZSA9IFRDUF9TRVFfU1RBVEVfRVNUQUJMSVNIRUQ7CisJCQlyYwkgID0gZXN0YWJsaXNoZWRfZ2V0X2ZpcnN0KHNlcSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUQ1BfU0VRX1NUQVRFX0VTVEFCTElTSEVEOgorCWNhc2UgVENQX1NFUV9TVEFURV9USU1FX1dBSVQ6CisJCXJjID0gZXN0YWJsaXNoZWRfZ2V0X25leHQoc2VxLCB2KTsKKwkJYnJlYWs7CisJfQorb3V0OgorCSsrKnBvczsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIHRjcF9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgdGNwX2l0ZXJfc3RhdGUqIHN0ID0gc2VxLT5wcml2YXRlOworCisJc3dpdGNoIChzdC0+c3RhdGUpIHsKKwljYXNlIFRDUF9TRVFfU1RBVEVfT1BFTlJFUToKKwkJaWYgKHYpIHsKKwkJCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc3QtPnN5bl93YWl0X3NrKTsKKwkJCXJlYWRfdW5sb2NrX2JoKCZ0cC0+c3luX3dhaXRfbG9jayk7CisJCX0KKwljYXNlIFRDUF9TRVFfU1RBVEVfTElTVEVOSU5HOgorCQlpZiAodiAhPSBTRVFfU1RBUlRfVE9LRU4pCisJCQl0Y3BfbGlzdGVuX3VubG9jaygpOworCQlicmVhazsKKwljYXNlIFRDUF9TRVFfU1RBVEVfVElNRV9XQUlUOgorCWNhc2UgVENQX1NFUV9TVEFURV9FU1RBQkxJU0hFRDoKKwkJaWYgKHYpCisJCQlyZWFkX3VubG9jaygmdGNwX2VoYXNoW3N0LT5idWNrZXRdLmxvY2spOworCQlsb2NhbF9iaF9lbmFibGUoKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IHRjcF9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdGNwX3NlcV9hZmluZm8gKmFmaW5mbyA9IFBERShpbm9kZSktPmRhdGE7CisJc3RydWN0IHNlcV9maWxlICpzZXE7CisJc3RydWN0IHRjcF9pdGVyX3N0YXRlICpzOworCWludCByYzsKKworCWlmICh1bmxpa2VseShhZmluZm8gPT0gTlVMTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7CisJcy0+ZmFtaWx5CQk9IGFmaW5mby0+ZmFtaWx5OworCXMtPnNlcV9vcHMuc3RhcnQJPSB0Y3Bfc2VxX3N0YXJ0OworCXMtPnNlcV9vcHMubmV4dAkJPSB0Y3Bfc2VxX25leHQ7CisJcy0+c2VxX29wcy5zaG93CQk9IGFmaW5mby0+c2VxX3Nob3c7CisJcy0+c2VxX29wcy5zdG9wCQk9IHRjcF9zZXFfc3RvcDsKKworCXJjID0gc2VxX29wZW4oZmlsZSwgJnMtPnNlcV9vcHMpOworCWlmIChyYykKKwkJZ290byBvdXRfa2ZyZWU7CisJc2VxCSAgICAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc2VxLT5wcml2YXRlID0gczsKK291dDoKKwlyZXR1cm4gcmM7CitvdXRfa2ZyZWU6CisJa2ZyZWUocyk7CisJZ290byBvdXQ7Cit9CisKK2ludCB0Y3BfcHJvY19yZWdpc3RlcihzdHJ1Y3QgdGNwX3NlcV9hZmluZm8gKmFmaW5mbykKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcDsKKworCWlmICghYWZpbmZvKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlhZmluZm8tPnNlcV9mb3BzLT5vd25lcgkJPSBhZmluZm8tPm93bmVyOworCWFmaW5mby0+c2VxX2ZvcHMtPm9wZW4JCT0gdGNwX3NlcV9vcGVuOworCWFmaW5mby0+c2VxX2ZvcHMtPnJlYWQJCT0gc2VxX3JlYWQ7CisJYWZpbmZvLT5zZXFfZm9wcy0+bGxzZWVrCT0gc2VxX2xzZWVrOworCWFmaW5mby0+c2VxX2ZvcHMtPnJlbGVhc2UJPSBzZXFfcmVsZWFzZV9wcml2YXRlOworCQorCXAgPSBwcm9jX25ldF9mb3BzX2NyZWF0ZShhZmluZm8tPm5hbWUsIFNfSVJVR08sIGFmaW5mby0+c2VxX2ZvcHMpOworCWlmIChwKQorCQlwLT5kYXRhID0gYWZpbmZvOworCWVsc2UKKwkJcmMgPSAtRU5PTUVNOworCXJldHVybiByYzsKK30KKwordm9pZCB0Y3BfcHJvY191bnJlZ2lzdGVyKHN0cnVjdCB0Y3Bfc2VxX2FmaW5mbyAqYWZpbmZvKQoreworCWlmICghYWZpbmZvKQorCQlyZXR1cm47CisJcHJvY19uZXRfcmVtb3ZlKGFmaW5mby0+bmFtZSk7CisJbWVtc2V0KGFmaW5mby0+c2VxX2ZvcHMsIDAsIHNpemVvZigqYWZpbmZvLT5zZXFfZm9wcykpOyAKK30KKworc3RhdGljIHZvaWQgZ2V0X29wZW5yZXE0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG9wZW5fcmVxdWVzdCAqcmVxLAorCQkJIGNoYXIgKnRtcGJ1ZiwgaW50IGksIGludCB1aWQpCit7CisJaW50IHR0ZCA9IHJlcS0+ZXhwaXJlcyAtIGppZmZpZXM7CisKKwlzcHJpbnRmKHRtcGJ1ZiwgIiU0ZDogJTA4WDolMDRYICUwOFg6JTA0WCIKKwkJIiAlMDJYICUwOFg6JTA4WCAlMDJYOiUwOGxYICUwOFggJTVkICU4ZCAldSAlZCAlcCIsCisJCWksCisJCXJlcS0+YWYudjRfcmVxLmxvY19hZGRyLAorCQludG9ocyhpbmV0X3NrKHNrKS0+c3BvcnQpLAorCQlyZXEtPmFmLnY0X3JlcS5ybXRfYWRkciwKKwkJbnRvaHMocmVxLT5ybXRfcG9ydCksCisJCVRDUF9TWU5fUkVDViwKKwkJMCwgMCwgLyogY291bGQgcHJpbnQgb3B0aW9uIHNpemUsIGJ1dCB0aGF0IGlzIGFmIGRlcGVuZGVudC4gKi8KKwkJMSwgICAgLyogdGltZXJzIGFjdGl2ZSAob25seSB0aGUgZXhwaXJlIHRpbWVyKSAqLworCQlqaWZmaWVzX3RvX2Nsb2NrX3QodHRkKSwKKwkJcmVxLT5yZXRyYW5zLAorCQl1aWQsCisJCTAsICAvKiBub24gc3RhbmRhcmQgdGltZXIgKi8KKwkJMCwgLyogb3Blbl9yZXF1ZXN0cyBoYXZlIG5vIGlub2RlICovCisJCWF0b21pY19yZWFkKCZzay0+c2tfcmVmY250KSwKKwkJcmVxKTsKK30KKworc3RhdGljIHZvaWQgZ2V0X3RjcDRfc29jayhzdHJ1Y3Qgc29jayAqc3AsIGNoYXIgKnRtcGJ1ZiwgaW50IGkpCit7CisJaW50IHRpbWVyX2FjdGl2ZTsKKwl1bnNpZ25lZCBsb25nIHRpbWVyX2V4cGlyZXM7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzcCk7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc3ApOworCXVuc2lnbmVkIGludCBkZXN0ID0gaW5ldC0+ZGFkZHI7CisJdW5zaWduZWQgaW50IHNyYyA9IGluZXQtPnJjdl9zYWRkcjsKKwlfX3UxNiBkZXN0cCA9IG50b2hzKGluZXQtPmRwb3J0KTsKKwlfX3UxNiBzcmNwID0gbnRvaHMoaW5ldC0+c3BvcnQpOworCisJaWYgKHRwLT5wZW5kaW5nID09IFRDUF9USU1FX1JFVFJBTlMpIHsKKwkJdGltZXJfYWN0aXZlCT0gMTsKKwkJdGltZXJfZXhwaXJlcwk9IHRwLT50aW1lb3V0OworCX0gZWxzZSBpZiAodHAtPnBlbmRpbmcgPT0gVENQX1RJTUVfUFJPQkUwKSB7CisJCXRpbWVyX2FjdGl2ZQk9IDQ7CisJCXRpbWVyX2V4cGlyZXMJPSB0cC0+dGltZW91dDsKKwl9IGVsc2UgaWYgKHRpbWVyX3BlbmRpbmcoJnNwLT5za190aW1lcikpIHsKKwkJdGltZXJfYWN0aXZlCT0gMjsKKwkJdGltZXJfZXhwaXJlcwk9IHNwLT5za190aW1lci5leHBpcmVzOworCX0gZWxzZSB7CisJCXRpbWVyX2FjdGl2ZQk9IDA7CisJCXRpbWVyX2V4cGlyZXMgPSBqaWZmaWVzOworCX0KKworCXNwcmludGYodG1wYnVmLCAiJTRkOiAlMDhYOiUwNFggJTA4WDolMDRYICUwMlggJTA4WDolMDhYICUwMlg6JTA4bFggIgorCQkJIiUwOFggJTVkICU4ZCAlbHUgJWQgJXAgJXUgJXUgJXUgJXUgJWQiLAorCQlpLCBzcmMsIHNyY3AsIGRlc3QsIGRlc3RwLCBzcC0+c2tfc3RhdGUsCisJCXRwLT53cml0ZV9zZXEgLSB0cC0+c25kX3VuYSwgdHAtPnJjdl9ueHQgLSB0cC0+Y29waWVkX3NlcSwKKwkJdGltZXJfYWN0aXZlLAorCQlqaWZmaWVzX3RvX2Nsb2NrX3QodGltZXJfZXhwaXJlcyAtIGppZmZpZXMpLAorCQl0cC0+cmV0cmFuc21pdHMsCisJCXNvY2tfaV91aWQoc3ApLAorCQl0cC0+cHJvYmVzX291dCwKKwkJc29ja19pX2lubyhzcCksCisJCWF0b21pY19yZWFkKCZzcC0+c2tfcmVmY250KSwgc3AsCisJCXRwLT5ydG8sIHRwLT5hY2suYXRvLCAodHAtPmFjay5xdWljayA8PCAxKSB8IHRwLT5hY2sucGluZ3BvbmcsCisJCXRwLT5zbmRfY3duZCwKKwkJdHAtPnNuZF9zc3RocmVzaCA+PSAweEZGRkYgPyAtMSA6IHRwLT5zbmRfc3N0aHJlc2gpOworfQorCitzdGF0aWMgdm9pZCBnZXRfdGltZXdhaXQ0X3NvY2soc3RydWN0IHRjcF90d19idWNrZXQgKnR3LCBjaGFyICp0bXBidWYsIGludCBpKQoreworCXVuc2lnbmVkIGludCBkZXN0LCBzcmM7CisJX191MTYgZGVzdHAsIHNyY3A7CisJaW50IHR0ZCA9IHR3LT50d190dGQgLSBqaWZmaWVzOworCisJaWYgKHR0ZCA8IDApCisJCXR0ZCA9IDA7CisKKwlkZXN0ICA9IHR3LT50d19kYWRkcjsKKwlzcmMgICA9IHR3LT50d19yY3Zfc2FkZHI7CisJZGVzdHAgPSBudG9ocyh0dy0+dHdfZHBvcnQpOworCXNyY3AgID0gbnRvaHModHctPnR3X3Nwb3J0KTsKKworCXNwcmludGYodG1wYnVmLCAiJTRkOiAlMDhYOiUwNFggJTA4WDolMDRYIgorCQkiICUwMlggJTA4WDolMDhYICUwMlg6JTA4bFggJTA4WCAlNWQgJThkICVkICVkICVwIiwKKwkJaSwgc3JjLCBzcmNwLCBkZXN0LCBkZXN0cCwgdHctPnR3X3N1YnN0YXRlLCAwLCAwLAorCQkzLCBqaWZmaWVzX3RvX2Nsb2NrX3QodHRkKSwgMCwgMCwgMCwgMCwKKwkJYXRvbWljX3JlYWQoJnR3LT50d19yZWZjbnQpLCB0dyk7Cit9CisKKyNkZWZpbmUgVE1QU1ogMTUwCisKK3N0YXRpYyBpbnQgdGNwNF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgdGNwX2l0ZXJfc3RhdGUqIHN0OworCWNoYXIgdG1wYnVmW1RNUFNaICsgMV07CisKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJc2VxX3ByaW50ZihzZXEsICIlLSpzXG4iLCBUTVBTWiAtIDEsCisJCQkgICAiICBzbCAgbG9jYWxfYWRkcmVzcyByZW1fYWRkcmVzcyAgIHN0IHR4X3F1ZXVlICIKKwkJCSAgICJyeF9xdWV1ZSB0ciB0bS0+d2hlbiByZXRybnNtdCAgIHVpZCAgdGltZW91dCAiCisJCQkgICAiaW5vZGUiKTsKKwkJZ290byBvdXQ7CisJfQorCXN0ID0gc2VxLT5wcml2YXRlOworCisJc3dpdGNoIChzdC0+c3RhdGUpIHsKKwljYXNlIFRDUF9TRVFfU1RBVEVfTElTVEVOSU5HOgorCWNhc2UgVENQX1NFUV9TVEFURV9FU1RBQkxJU0hFRDoKKwkJZ2V0X3RjcDRfc29jayh2LCB0bXBidWYsIHN0LT5udW0pOworCQlicmVhazsKKwljYXNlIFRDUF9TRVFfU1RBVEVfT1BFTlJFUToKKwkJZ2V0X29wZW5yZXE0KHN0LT5zeW5fd2FpdF9zaywgdiwgdG1wYnVmLCBzdC0+bnVtLCBzdC0+dWlkKTsKKwkJYnJlYWs7CisJY2FzZSBUQ1BfU0VRX1NUQVRFX1RJTUVfV0FJVDoKKwkJZ2V0X3RpbWV3YWl0NF9zb2NrKHYsIHRtcGJ1Ziwgc3QtPm51bSk7CisJCWJyZWFrOworCX0KKwlzZXFfcHJpbnRmKHNlcSwgIiUtKnNcbiIsIFRNUFNaIC0gMSwgdG1wYnVmKTsKK291dDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdGNwNF9zZXFfZm9wczsKK3N0YXRpYyBzdHJ1Y3QgdGNwX3NlcV9hZmluZm8gdGNwNF9zZXFfYWZpbmZvID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAidGNwIiwKKwkuZmFtaWx5CQk9IEFGX0lORVQsCisJLnNlcV9zaG93CT0gdGNwNF9zZXFfc2hvdywKKwkuc2VxX2ZvcHMJPSAmdGNwNF9zZXFfZm9wcywKK307CisKK2ludCBfX2luaXQgdGNwNF9wcm9jX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gdGNwX3Byb2NfcmVnaXN0ZXIoJnRjcDRfc2VxX2FmaW5mbyk7Cit9CisKK3ZvaWQgdGNwNF9wcm9jX2V4aXQodm9pZCkKK3sKKwl0Y3BfcHJvY191bnJlZ2lzdGVyKCZ0Y3A0X3NlcV9hZmluZm8pOworfQorI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKK3N0cnVjdCBwcm90byB0Y3BfcHJvdCA9IHsKKwkubmFtZQkJCT0gIlRDUCIsCisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuY2xvc2UJCQk9IHRjcF9jbG9zZSwKKwkuY29ubmVjdAkJPSB0Y3BfdjRfY29ubmVjdCwKKwkuZGlzY29ubmVjdAkJPSB0Y3BfZGlzY29ubmVjdCwKKwkuYWNjZXB0CQkJPSB0Y3BfYWNjZXB0LAorCS5pb2N0bAkJCT0gdGNwX2lvY3RsLAorCS5pbml0CQkJPSB0Y3BfdjRfaW5pdF9zb2NrLAorCS5kZXN0cm95CQk9IHRjcF92NF9kZXN0cm95X3NvY2ssCisJLnNodXRkb3duCQk9IHRjcF9zaHV0ZG93biwKKwkuc2V0c29ja29wdAkJPSB0Y3Bfc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdAkJPSB0Y3BfZ2V0c29ja29wdCwKKwkuc2VuZG1zZwkJPSB0Y3Bfc2VuZG1zZywKKwkucmVjdm1zZwkJPSB0Y3BfcmVjdm1zZywKKwkuYmFja2xvZ19yY3YJCT0gdGNwX3Y0X2RvX3JjdiwKKwkuaGFzaAkJCT0gdGNwX3Y0X2hhc2gsCisJLnVuaGFzaAkJCT0gdGNwX3VuaGFzaCwKKwkuZ2V0X3BvcnQJCT0gdGNwX3Y0X2dldF9wb3J0LAorCS5lbnRlcl9tZW1vcnlfcHJlc3N1cmUJPSB0Y3BfZW50ZXJfbWVtb3J5X3ByZXNzdXJlLAorCS5zb2NrZXRzX2FsbG9jYXRlZAk9ICZ0Y3Bfc29ja2V0c19hbGxvY2F0ZWQsCisJLm1lbW9yeV9hbGxvY2F0ZWQJPSAmdGNwX21lbW9yeV9hbGxvY2F0ZWQsCisJLm1lbW9yeV9wcmVzc3VyZQk9ICZ0Y3BfbWVtb3J5X3ByZXNzdXJlLAorCS5zeXNjdGxfbWVtCQk9IHN5c2N0bF90Y3BfbWVtLAorCS5zeXNjdGxfd21lbQkJPSBzeXNjdGxfdGNwX3dtZW0sCisJLnN5c2N0bF9ybWVtCQk9IHN5c2N0bF90Y3Bfcm1lbSwKKwkubWF4X2hlYWRlcgkJPSBNQVhfVENQX0hFQURFUiwKKwkub2JqX3NpemUJCT0gc2l6ZW9mKHN0cnVjdCB0Y3Bfc29jayksCit9OworCisKKwordm9pZCBfX2luaXQgdGNwX3Y0X2luaXQoc3RydWN0IG5ldF9wcm90b19mYW1pbHkgKm9wcykKK3sKKwlpbnQgZXJyID0gc29ja19jcmVhdGVfa2VybihQRl9JTkVULCBTT0NLX1JBVywgSVBQUk9UT19UQ1AsICZ0Y3Bfc29ja2V0KTsKKwlpZiAoZXJyIDwgMCkKKwkJcGFuaWMoIkZhaWxlZCB0byBjcmVhdGUgdGhlIFRDUCBjb250cm9sIHNvY2tldC5cbiIpOworCXRjcF9zb2NrZXQtPnNrLT5za19hbGxvY2F0aW9uICAgPSBHRlBfQVRPTUlDOworCWluZXRfc2sodGNwX3NvY2tldC0+c2spLT51Y190dGwgPSAtMTsKKworCS8qIFVuaGFzaCBpdCBzbyB0aGF0IElQIGlucHV0IHByb2Nlc3NpbmcgZG9lcyBub3QgZXZlbgorCSAqIHNlZSBpdCwgd2UgZG8gbm90IHdpc2ggdGhpcyBzb2NrZXQgdG8gc2VlIGluY29taW5nCisJICogcGFja2V0cy4KKwkgKi8KKwl0Y3Bfc29ja2V0LT5zay0+c2tfcHJvdC0+dW5oYXNoKHRjcF9zb2NrZXQtPnNrKTsKK30KKworRVhQT1JUX1NZTUJPTChpcHY0X3NwZWNpZmljKTsKK0VYUE9SVF9TWU1CT0wodGNwX2JpbmRfaGFzaCk7CitFWFBPUlRfU1lNQk9MKHRjcF9idWNrZXRfY3JlYXRlKTsKK0VYUE9SVF9TWU1CT0wodGNwX2hhc2hpbmZvKTsKK0VYUE9SVF9TWU1CT0wodGNwX2luaGVyaXRfcG9ydCk7CitFWFBPUlRfU1lNQk9MKHRjcF9saXN0ZW5fd2xvY2spOworRVhQT1JUX1NZTUJPTCh0Y3BfcG9ydF9yb3Zlcik7CitFWFBPUlRfU1lNQk9MKHRjcF9wcm90KTsKK0VYUE9SVF9TWU1CT0wodGNwX3B1dF9wb3J0KTsKK0VYUE9SVF9TWU1CT0wodGNwX3VuaGFzaCk7CitFWFBPUlRfU1lNQk9MKHRjcF92NF9jb25uX3JlcXVlc3QpOworRVhQT1JUX1NZTUJPTCh0Y3BfdjRfY29ubmVjdCk7CitFWFBPUlRfU1lNQk9MKHRjcF92NF9kb19yY3YpOworRVhQT1JUX1NZTUJPTCh0Y3BfdjRfcmVidWlsZF9oZWFkZXIpOworRVhQT1JUX1NZTUJPTCh0Y3BfdjRfcmVtZW1iZXJfc3RhbXApOworRVhQT1JUX1NZTUJPTCh0Y3BfdjRfc2VuZF9jaGVjayk7CitFWFBPUlRfU1lNQk9MKHRjcF92NF9zeW5fcmVjdl9zb2NrKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitFWFBPUlRfU1lNQk9MKHRjcF9wcm9jX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0wodGNwX3Byb2NfdW5yZWdpc3Rlcik7CisjZW5kaWYKK0VYUE9SVF9TWU1CT0woc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2UpOworRVhQT1JUX1NZTUJPTChzeXNjdGxfbWF4X3N5bl9iYWNrbG9nKTsKK0VYUE9SVF9TWU1CT0woc3lzY3RsX3RjcF9sb3dfbGF0ZW5jeSk7CitFWFBPUlRfU1lNQk9MKHN5c2N0bF90Y3BfdHdfcmV1c2UpOworCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfbWluaXNvY2tzLmMgYi9uZXQvaXB2NC90Y3BfbWluaXNvY2tzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ3MDUwOQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L3RjcF9taW5pc29ja3MuYwpAQCAtMCwwICsxLDEwNzcgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJSW1wbGVtZW50YXRpb24gb2YgdGhlIFRyYW5zbWlzc2lvbiBDb250cm9sIFByb3RvY29sKFRDUCkuCisgKgorICogVmVyc2lvbjoJJElkOiB0Y3BfbWluaXNvY2tzLmMsdiAxLjE1IDIwMDIvMDIvMDEgMjI6MDE6MDQgZGF2ZW0gRXhwICQKKyAqCisgKiBBdXRob3JzOglSb3NzIEJpcm8sIDxiaXI3QGxlbGFuZC5TdGFuZm9yZC5FZHU+CisgKgkJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgkJTWFyayBFdmFucywgPGV2YW5zbXBAdWh1cmEuYXN0b24uYWMudWs+CisgKgkJQ29yZXkgTWlueWFyZCA8d2YtcmNoIW1pbnlhcmRAcmVsYXkuRVUubmV0PgorICoJCUZsb3JpYW4gTGEgUm9jaGUsIDxmbGxhQHN0dWQudW5pLXNiLmRlPgorICoJCUNoYXJsZXMgSGVkcmljaywgPGhlZHJpY2tAa2xpbnpoYWkucnV0Z2Vycy5lZHU+CisgKgkJTGludXMgVG9ydmFsZHMsIDx0b3J2YWxkc0Bjcy5oZWxzaW5raS5maT4KKyAqCQlBbGFuIENveCwgPGd3NHB0c0BndzRwdHMuYW1wci5vcmc+CisgKgkJTWF0dGhldyBEaWxsb24sIDxkaWxsb25AYXBvbGxvLndlc3Qub2ljLmNvbT4KKyAqCQlBcm50IEd1bGJyYW5kc2VuLCA8YWd1bGJyYUBudmcudW5pdC5ubz4KKyAqCQlKb3JnZSBDd2lrLCA8am9yZ2VAbGFzZXIuc2F0bGluay5uZXQ+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPG5ldC9pbmV0X2NvbW1vbi5oPgorI2luY2x1ZGUgPG5ldC94ZnJtLmg+CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisjZGVmaW5lIFNZTkNfSU5JVCAwIC8qIGxldCB0aGUgdXNlciBlbmFibGUgaXQgKi8KKyNlbHNlCisjZGVmaW5lIFNZTkNfSU5JVCAxCisjZW5kaWYKKworaW50IHN5c2N0bF90Y3BfdHdfcmVjeWNsZTsKK2ludCBzeXNjdGxfdGNwX21heF90d19idWNrZXRzID0gTlJfRklMRSoyOworCitpbnQgc3lzY3RsX3RjcF9zeW5jb29raWVzID0gU1lOQ19JTklUOyAKK2ludCBzeXNjdGxfdGNwX2Fib3J0X29uX292ZXJmbG93OworCitzdGF0aWMgdm9pZCB0Y3BfdHdfc2NoZWR1bGUoc3RydWN0IHRjcF90d19idWNrZXQgKnR3LCBpbnQgdGltZW8pOworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdGNwX2luX3dpbmRvdyh1MzIgc2VxLCB1MzIgZW5kX3NlcSwgdTMyIHNfd2luLCB1MzIgZV93aW4pCit7CisJaWYgKHNlcSA9PSBzX3dpbikKKwkJcmV0dXJuIDE7CisJaWYgKGFmdGVyKGVuZF9zZXEsIHNfd2luKSAmJiBiZWZvcmUoc2VxLCBlX3dpbikpCisJCXJldHVybiAxOworCXJldHVybiAoc2VxID09IGVfd2luICYmIHNlcSA9PSBlbmRfc2VxKTsKK30KKworLyogTmV3LXN0eWxlIGhhbmRsaW5nIG9mIFRJTUVfV0FJVCBzb2NrZXRzLiAqLworCitpbnQgdGNwX3R3X2NvdW50OworCisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggbG9jYWxseSBkaXNhYmxlZCBCSHMuICovCitzdGF0aWMgdm9pZCB0Y3BfdGltZXdhaXRfa2lsbChzdHJ1Y3QgdGNwX3R3X2J1Y2tldCAqdHcpCit7CisJc3RydWN0IHRjcF9laGFzaF9idWNrZXQgKmVoZWFkOworCXN0cnVjdCB0Y3BfYmluZF9oYXNoYnVja2V0ICpiaGVhZDsKKwlzdHJ1Y3QgdGNwX2JpbmRfYnVja2V0ICp0YjsKKworCS8qIFVubGluayBmcm9tIGVzdGFibGlzaGVkIGhhc2hlcy4gKi8KKwllaGVhZCA9ICZ0Y3BfZWhhc2hbdHctPnR3X2hhc2hlbnRdOworCXdyaXRlX2xvY2soJmVoZWFkLT5sb2NrKTsKKwlpZiAoaGxpc3RfdW5oYXNoZWQoJnR3LT50d19ub2RlKSkgeworCQl3cml0ZV91bmxvY2soJmVoZWFkLT5sb2NrKTsKKwkJcmV0dXJuOworCX0KKwlfX2hsaXN0X2RlbCgmdHctPnR3X25vZGUpOworCXNrX25vZGVfaW5pdCgmdHctPnR3X25vZGUpOworCXdyaXRlX3VubG9jaygmZWhlYWQtPmxvY2spOworCisJLyogRGlzYXNzb2NpYXRlIHdpdGggYmluZCBidWNrZXQuICovCisJYmhlYWQgPSAmdGNwX2JoYXNoW3RjcF9iaGFzaGZuKHR3LT50d19udW0pXTsKKwlzcGluX2xvY2soJmJoZWFkLT5sb2NrKTsKKwl0YiA9IHR3LT50d190YjsKKwlfX2hsaXN0X2RlbCgmdHctPnR3X2JpbmRfbm9kZSk7CisJdHctPnR3X3RiID0gTlVMTDsKKwl0Y3BfYnVja2V0X2Rlc3Ryb3kodGIpOworCXNwaW5fdW5sb2NrKCZiaGVhZC0+bG9jayk7CisKKyNpZmRlZiBJTkVUX1JFRkNOVF9ERUJVRworCWlmIChhdG9taWNfcmVhZCgmdHctPnR3X3JlZmNudCkgIT0gMSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAidHdfYnVja2V0ICVwIHJlZmNudD0lZFxuIiwgdHcsCisJCSAgICAgICBhdG9taWNfcmVhZCgmdHctPnR3X3JlZmNudCkpOworCX0KKyNlbmRpZgorCXRjcF90d19wdXQodHcpOworfQorCisvKiAKKyAqICogTWFpbiBwdXJwb3NlIG9mIFRJTUUtV0FJVCBzdGF0ZSBpcyB0byBjbG9zZSBjb25uZWN0aW9uIGdyYWNlZnVsbHksCisgKiAgIHdoZW4gb25lIG9mIGVuZHMgc2l0cyBpbiBMQVNULUFDSyBvciBDTE9TSU5HIHJldHJhbnNtaXR0aW5nIEZJTgorICogICAoYW5kLCBwcm9iYWJseSwgdGFpbCBvZiBkYXRhKSBhbmQgb25lIG9yIG1vcmUgb3VyIEFDS3MgYXJlIGxvc3QuCisgKiAqIFdoYXQgaXMgVElNRS1XQUlUIHRpbWVvdXQ/IEl0IGlzIGFzc29jaWF0ZWQgd2l0aCBtYXhpbWFsIHBhY2tldAorICogICBsaWZldGltZSBpbiB0aGUgaW50ZXJuZXQsIHdoaWNoIHJlc3VsdHMgaW4gd3JvbmcgY29uY2x1c2lvbiwgdGhhdAorICogICBpdCBpcyBzZXQgdG8gY2F0Y2ggIm9sZCBkdXBsaWNhdGUgc2VnbWVudHMiIHdhbmRlcmluZyBvdXQgb2YgdGhlaXIgcGF0aC4KKyAqICAgSXQgaXMgbm90IHF1aXRlIGNvcnJlY3QuIFRoaXMgdGltZW91dCBpcyBjYWxjdWxhdGVkIHNvIHRoYXQgaXQgZXhjZWVkcworICogICBtYXhpbWFsIHJldHJhbnNtaXNzaW9uIHRpbWVvdXQgZW5vdWdoIHRvIGFsbG93IHRvIGxvc2Ugb25lIChvciBtb3JlKQorICogICBzZWdtZW50cyBzZW50IGJ5IHBlZXIgYW5kIG91ciBBQ0tzLiBUaGlzIHRpbWUgbWF5IGJlIGNhbGN1bGF0ZWQgZnJvbSBSVE8uCisgKiAqIFdoZW4gVElNRS1XQUlUIHNvY2tldCByZWNlaXZlcyBSU1QsIGl0IG1lYW5zIHRoYXQgYW5vdGhlciBlbmQKKyAqICAgZmluYWxseSBjbG9zZWQgYW5kIHdlIGFyZSBhbGxvd2VkIHRvIGtpbGwgVElNRS1XQUlUIHRvby4KKyAqICogU2Vjb25kIHB1cnBvc2Ugb2YgVElNRS1XQUlUIGlzIGNhdGNoaW5nIG9sZCBkdXBsaWNhdGUgc2VnbWVudHMuCisgKiAgIFdlbGwsIGNlcnRhaW5seSBpdCBpcyBwdXJlIHBhcmFub2lhLCBidXQgaWYgd2UgbG9hZCBUSU1FLVdBSVQKKyAqICAgd2l0aCB0aGlzIHNlbWFudGljcywgd2UgTVVTVCBOT1Qga2lsbCBUSU1FLVdBSVQgc3RhdGUgd2l0aCBSU1RzLgorICogKiBJZiB3ZSBpbnZlbnRlZCBzb21lIG1vcmUgY2xldmVyIHdheSB0byBjYXRjaCBkdXBsaWNhdGVzCisgKiAgIChmLmUuIGJhc2VkIG9uIFBBV1MpLCB3ZSBjb3VsZCB0cnVuY2F0ZSBUSU1FLVdBSVQgdG8gc2V2ZXJhbCBSVE9zLgorICoKKyAqIFRoZSBhbGdvcml0aG0gYmVsb3cgaXMgYmFzZWQgb24gRk9STUFMIElOVEVSUFJFVEFUSU9OIG9mIFJGQ3MuCisgKiBXaGVuIHlvdSBjb21wYXJlIGl0IHRvIFJGQ3MsIHBsZWFzZSwgcmVhZCBzZWN0aW9uIFNFR01FTlQgQVJSSVZFUworICogZnJvbSB0aGUgdmVyeSBiZWdpbm5pbmcuCisgKgorICogTk9URS4gV2l0aCByZWN5Y2xpbmcgKGFuZCBsYXRlciB3aXRoIGZpbi13YWl0LTIpIFRXIGJ1Y2tldAorICogaXMgX25vdF8gc3RhdGVsZXNzLiBJdCBtZWFucywgdGhhdCBzdHJpY3RseSBzcGVha2luZyB3ZSBtdXN0CisgKiBzcGlubG9jayBpdC4gSSBkbyBub3Qgd2FudCEgV2VsbCwgcHJvYmFiaWxpdHkgb2YgbWlzYmVoYXZpb3VyCisgKiBpcyByaWRpY3Vsb3VzbHkgbG93IGFuZCwgc2VlbXMsIHdlIGNvdWxkIHVzZSBzb21lIG1iKCkgdHJpY2tzCisgKiB0byBhdm9pZCBtaXNyZWFkIHNlcXVlbmNlIG51bWJlcnMsIHN0YXRlcyBldGMuICAtLUFOSworICovCitlbnVtIHRjcF90d19zdGF0dXMKK3RjcF90aW1ld2FpdF9zdGF0ZV9wcm9jZXNzKHN0cnVjdCB0Y3BfdHdfYnVja2V0ICp0dywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgIHN0cnVjdCB0Y3BoZHIgKnRoLCB1bnNpZ25lZCBsZW4pCit7CisJc3RydWN0IHRjcF9vcHRpb25zX3JlY2VpdmVkIHRtcF9vcHQ7CisJaW50IHBhd3NfcmVqZWN0ID0gMDsKKworCXRtcF9vcHQuc2F3X3RzdGFtcCA9IDA7CisJaWYgKHRoLT5kb2ZmID4gKHNpemVvZihzdHJ1Y3QgdGNwaGRyKSA+PiAyKSAmJiB0dy0+dHdfdHNfcmVjZW50X3N0YW1wKSB7CisJCXRjcF9wYXJzZV9vcHRpb25zKHNrYiwgJnRtcF9vcHQsIDApOworCisJCWlmICh0bXBfb3B0LnNhd190c3RhbXApIHsKKwkJCXRtcF9vcHQudHNfcmVjZW50CSAgID0gdHctPnR3X3RzX3JlY2VudDsKKwkJCXRtcF9vcHQudHNfcmVjZW50X3N0YW1wID0gdHctPnR3X3RzX3JlY2VudF9zdGFtcDsKKwkJCXBhd3NfcmVqZWN0ID0gdGNwX3Bhd3NfY2hlY2soJnRtcF9vcHQsIHRoLT5yc3QpOworCQl9CisJfQorCisJaWYgKHR3LT50d19zdWJzdGF0ZSA9PSBUQ1BfRklOX1dBSVQyKSB7CisJCS8qIEp1c3QgcmVwZWF0IGFsbCB0aGUgY2hlY2tzIG9mIHRjcF9yY3Zfc3RhdGVfcHJvY2VzcygpICovCisKKwkJLyogT3V0IG9mIHdpbmRvdywgc2VuZCBBQ0sgKi8KKwkJaWYgKHBhd3NfcmVqZWN0IHx8CisJCSAgICAhdGNwX2luX3dpbmRvdyhUQ1BfU0tCX0NCKHNrYiktPnNlcSwgVENQX1NLQl9DQihza2IpLT5lbmRfc2VxLAorCQkJCSAgIHR3LT50d19yY3Zfbnh0LAorCQkJCSAgIHR3LT50d19yY3Zfbnh0ICsgdHctPnR3X3Jjdl93bmQpKQorCQkJcmV0dXJuIFRDUF9UV19BQ0s7CisKKwkJaWYgKHRoLT5yc3QpCisJCQlnb3RvIGtpbGw7CisKKwkJaWYgKHRoLT5zeW4gJiYgIWJlZm9yZShUQ1BfU0tCX0NCKHNrYiktPnNlcSwgdHctPnR3X3Jjdl9ueHQpKQorCQkJZ290byBraWxsX3dpdGhfcnN0OworCisJCS8qIER1cCBBQ0s/ICovCisJCWlmICghYWZ0ZXIoVENQX1NLQl9DQihza2IpLT5lbmRfc2VxLCB0dy0+dHdfcmN2X254dCkgfHwKKwkJICAgIFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSA9PSBUQ1BfU0tCX0NCKHNrYiktPnNlcSkgeworCQkJdGNwX3R3X3B1dCh0dyk7CisJCQlyZXR1cm4gVENQX1RXX1NVQ0NFU1M7CisJCX0KKworCQkvKiBOZXcgZGF0YSBvciBGSU4uIElmIG5ldyBkYXRhIGFycml2ZSBhZnRlciBoYWxmLWR1cGxleCBjbG9zZSwKKwkJICogcmVzZXQuCisJCSAqLworCQlpZiAoIXRoLT5maW4gfHwKKwkJICAgIFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSAhPSB0dy0+dHdfcmN2X254dCArIDEpIHsKK2tpbGxfd2l0aF9yc3Q6CisJCQl0Y3BfdHdfZGVzY2hlZHVsZSh0dyk7CisJCQl0Y3BfdHdfcHV0KHR3KTsKKwkJCXJldHVybiBUQ1BfVFdfUlNUOworCQl9CisKKwkJLyogRklOIGFycml2ZWQsIGVudGVyIHRydWUgdGltZS13YWl0IHN0YXRlLiAqLworCQl0dy0+dHdfc3Vic3RhdGUJPSBUQ1BfVElNRV9XQUlUOworCQl0dy0+dHdfcmN2X254dAk9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKKwkJaWYgKHRtcF9vcHQuc2F3X3RzdGFtcCkgeworCQkJdHctPnR3X3RzX3JlY2VudF9zdGFtcAk9IHh0aW1lLnR2X3NlYzsKKwkJCXR3LT50d190c19yZWNlbnQJPSB0bXBfb3B0LnJjdl90c3ZhbDsKKwkJfQorCisJCS8qIEkgYW0gc2hhbWVkLCBidXQgZmFpbGVkIHRvIG1ha2UgaXQgbW9yZSBlbGVnYW50LgorCQkgKiBZZXMsIGl0IGlzIGRpcmVjdCByZWZlcmVuY2UgdG8gSVAsIHdoaWNoIGlzIGltcG9zc2libGUKKwkJICogdG8gZ2VuZXJhbGl6ZSB0byBJUHY2LiBUYWtpbmcgaW50byBhY2NvdW50IHRoYXQgSVB2NgorCQkgKiBkbyBub3QgdW5kZXJ0c25hZCByZWN5Y2xpbmcgaW4gYW55IGNhc2UsIGl0IG5vdAorCQkgKiBhIGJpZyBwcm9ibGVtIGluIHByYWN0aWNlLiAtLUFOSyAqLworCQlpZiAodHctPnR3X2ZhbWlseSA9PSBBRl9JTkVUICYmCisJCSAgICBzeXNjdGxfdGNwX3R3X3JlY3ljbGUgJiYgdHctPnR3X3RzX3JlY2VudF9zdGFtcCAmJgorCQkgICAgdGNwX3Y0X3R3X3JlbWVtYmVyX3N0YW1wKHR3KSkKKwkJCXRjcF90d19zY2hlZHVsZSh0dywgdHctPnR3X3RpbWVvdXQpOworCQllbHNlCisJCQl0Y3BfdHdfc2NoZWR1bGUodHcsIFRDUF9USU1FV0FJVF9MRU4pOworCQlyZXR1cm4gVENQX1RXX0FDSzsKKwl9CisKKwkvKgorCSAqCU5vdyByZWFsIFRJTUUtV0FJVCBzdGF0ZS4KKwkgKgorCSAqCVJGQyAxMTIyOgorCSAqCSJXaGVuIGEgY29ubmVjdGlvbiBpcyBbLi4uXSBvbiBUSU1FLVdBSVQgc3RhdGUgWy4uLl0KKwkgKglbYSBUQ1BdIE1BWSBhY2NlcHQgYSBuZXcgU1lOIGZyb20gdGhlIHJlbW90ZSBUQ1AgdG8KKwkgKglyZW9wZW4gdGhlIGNvbm5lY3Rpb24gZGlyZWN0bHksIGlmIGl0OgorCSAqCQorCSAqCSgxKSAgYXNzaWducyBpdHMgaW5pdGlhbCBzZXF1ZW5jZSBudW1iZXIgZm9yIHRoZSBuZXcKKwkgKgljb25uZWN0aW9uIHRvIGJlIGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0IHNlcXVlbmNlCisJICoJbnVtYmVyIGl0IHVzZWQgb24gdGhlIHByZXZpb3VzIGNvbm5lY3Rpb24gaW5jYXJuYXRpb24sCisJICoJYW5kCisJICoKKwkgKgkoMikgIHJldHVybnMgdG8gVElNRS1XQUlUIHN0YXRlIGlmIHRoZSBTWU4gdHVybnMgb3V0IAorCSAqCXRvIGJlIGFuIG9sZCBkdXBsaWNhdGUiLgorCSAqLworCisJaWYgKCFwYXdzX3JlamVjdCAmJgorCSAgICAoVENQX1NLQl9DQihza2IpLT5zZXEgPT0gdHctPnR3X3Jjdl9ueHQgJiYKKwkgICAgIChUQ1BfU0tCX0NCKHNrYiktPnNlcSA9PSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEgfHwgdGgtPnJzdCkpKSB7CisJCS8qIEluIHdpbmRvdyBzZWdtZW50LCBpdCBtYXkgYmUgb25seSByZXNldCBvciBiYXJlIGFjay4gKi8KKworCQlpZiAodGgtPnJzdCkgeworCQkJLyogVGhpcyBpcyBUSU1FX1dBSVQgYXNzYXNpbmF0aW9uLCBpbiB0d28gZmxhdm9ycy4KKwkJCSAqIE9oIHdlbGwuLi4gbm9ib2R5IGhhcyBhIHN1ZmZpY2llbnQgc29sdXRpb24gdG8gdGhpcworCQkJICogcHJvdG9jb2wgYnVnIHlldC4KKwkJCSAqLworCQkJaWYgKHN5c2N0bF90Y3BfcmZjMTMzNyA9PSAwKSB7CitraWxsOgorCQkJCXRjcF90d19kZXNjaGVkdWxlKHR3KTsKKwkJCQl0Y3BfdHdfcHV0KHR3KTsKKwkJCQlyZXR1cm4gVENQX1RXX1NVQ0NFU1M7CisJCQl9CisJCX0KKwkJdGNwX3R3X3NjaGVkdWxlKHR3LCBUQ1BfVElNRVdBSVRfTEVOKTsKKworCQlpZiAodG1wX29wdC5zYXdfdHN0YW1wKSB7CisJCQl0dy0+dHdfdHNfcmVjZW50CT0gdG1wX29wdC5yY3ZfdHN2YWw7CisJCQl0dy0+dHdfdHNfcmVjZW50X3N0YW1wCT0geHRpbWUudHZfc2VjOworCQl9CisKKwkJdGNwX3R3X3B1dCh0dyk7CisJCXJldHVybiBUQ1BfVFdfU1VDQ0VTUzsKKwl9CisKKwkvKiBPdXQgb2Ygd2luZG93IHNlZ21lbnQuCisKKwkgICBBbGwgdGhlIHNlZ21lbnRzIGFyZSBBQ0tlZCBpbW1lZGlhdGVseS4KKworCSAgIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyBuZXcgU1lOLiBXZSBhY2NlcHQgaXQsIGlmIGl0IGlzCisJICAgbm90IG9sZCBkdXBsaWNhdGUgYW5kIHdlIGFyZSBub3QgaW4gZGFuZ2VyIHRvIGJlIGtpbGxlZAorCSAgIGJ5IGRlbGF5ZWQgb2xkIGR1cGxpY2F0ZXMuIFJGQyBjaGVjayBpcyB0aGF0IGl0IGhhcworCSAgIG5ld2VyIHNlcXVlbmNlIG51bWJlciB3b3JrcyBhdCByYXRlcyA8NDBNYml0L3NlYy4KKwkgICBIb3dldmVyLCBpZiBwYXdzIHdvcmtzLCBpdCBpcyByZWxpYWJsZSBBTkQgZXZlbiBtb3JlLAorCSAgIHdlIGV2ZW4gbWF5IHJlbGF4IHNpbGx5IHNlcSBzcGFjZSBjdXRvZmYuCisKKwkgICBSRUQtUEVOOiB3ZSB2aW9sYXRlIG1haW4gUkZDIHJlcXVpcmVtZW50LCBpZiB0aGlzIFNZTiB3aWxsIGFwcGVhcgorCSAgIG9sZCBkdXBsaWNhdGUgKGkuZS4gd2UgcmVjZWl2ZSBSU1QgaW4gcmVwbHkgdG8gU1lOLUFDSyksCisJICAgd2UgbXVzdCByZXR1cm4gc29ja2V0IHRvIHRpbWUtd2FpdCBzdGF0ZS4gSXQgaXMgbm90IGdvb2QsCisJICAgYnV0IG5vdCBmYXRhbCB5ZXQuCisJICovCisKKwlpZiAodGgtPnN5biAmJiAhdGgtPnJzdCAmJiAhdGgtPmFjayAmJiAhcGF3c19yZWplY3QgJiYKKwkgICAgKGFmdGVyKFRDUF9TS0JfQ0Ioc2tiKS0+c2VxLCB0dy0+dHdfcmN2X254dCkgfHwKKwkgICAgICh0bXBfb3B0LnNhd190c3RhbXAgJiYgKHMzMikodHctPnR3X3RzX3JlY2VudCAtIHRtcF9vcHQucmN2X3RzdmFsKSA8IDApKSkgeworCQl1MzIgaXNuID0gdHctPnR3X3NuZF9ueHQgKyA2NTUzNSArIDI7CisJCWlmIChpc24gPT0gMCkKKwkJCWlzbisrOworCQlUQ1BfU0tCX0NCKHNrYiktPndoZW4gPSBpc247CisJCXJldHVybiBUQ1BfVFdfU1lOOworCX0KKworCWlmIChwYXdzX3JlamVjdCkKKwkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfUEFXU0VTVEFCUkVKRUNURUQpOworCisJaWYoIXRoLT5yc3QpIHsKKwkJLyogSW4gdGhpcyBjYXNlIHdlIG11c3QgcmVzZXQgdGhlIFRJTUVXQUlUIHRpbWVyLgorCQkgKgorCQkgKiBJZiBpdCBpcyBBQ0tsZXNzIFNZTiBpdCBtYXkgYmUgYm90aCBvbGQgZHVwbGljYXRlCisJCSAqIGFuZCBuZXcgZ29vZCBTWU4gd2l0aCByYW5kb20gc2VxdWVuY2UgbnVtYmVyIDxyY3Zfbnh0LgorCQkgKiBEbyBub3QgcmVzY2hlZHVsZSBpbiB0aGUgbGFzdCBjYXNlLgorCQkgKi8KKwkJaWYgKHBhd3NfcmVqZWN0IHx8IHRoLT5hY2spCisJCQl0Y3BfdHdfc2NoZWR1bGUodHcsIFRDUF9USU1FV0FJVF9MRU4pOworCisJCS8qIFNlbmQgQUNLLiBOb3RlLCB3ZSBkbyBub3QgcHV0IHRoZSBidWNrZXQsCisJCSAqIGl0IHdpbGwgYmUgcmVsZWFzZWQgYnkgY2FsbGVyLgorCQkgKi8KKwkJcmV0dXJuIFRDUF9UV19BQ0s7CisJfQorCXRjcF90d19wdXQodHcpOworCXJldHVybiBUQ1BfVFdfU1VDQ0VTUzsKK30KKworLyogRW50ZXIgdGhlIHRpbWUgd2FpdCBzdGF0ZS4gIFRoaXMgaXMgY2FsbGVkIHdpdGggbG9jYWxseSBkaXNhYmxlZCBCSC4KKyAqIEVzc2VudGlhbGx5IHdlIHdoaXAgdXAgYSB0aW1ld2FpdCBidWNrZXQsIGNvcHkgdGhlCisgKiByZWxldmFudCBpbmZvIGludG8gaXQgZnJvbSB0aGUgU0ssIGFuZCBtZXNzIHdpdGggaGFzaCBjaGFpbnMKKyAqIGFuZCBsaXN0IGxpbmthZ2UuCisgKi8KK3N0YXRpYyB2b2lkIF9fdGNwX3R3X2hhc2hkYW5jZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3BfdHdfYnVja2V0ICp0dykKK3sKKwlzdHJ1Y3QgdGNwX2VoYXNoX2J1Y2tldCAqZWhlYWQgPSAmdGNwX2VoYXNoW3NrLT5za19oYXNoZW50XTsKKwlzdHJ1Y3QgdGNwX2JpbmRfaGFzaGJ1Y2tldCAqYmhlYWQ7CisKKwkvKiBTdGVwIDE6IFB1dCBUVyBpbnRvIGJpbmQgaGFzaC4gT3JpZ2luYWwgc29ja2V0IHN0YXlzIHRoZXJlIHRvby4KKwkgICBOb3RlLCB0aGF0IGFueSBzb2NrZXQgd2l0aCBpbmV0X3NrKHNrKS0+bnVtICE9IDAgTVVTVCBiZSBib3VuZCBpbgorCSAgIGJpbmRpbmcgY2FjaGUsIGV2ZW4gaWYgaXQgaXMgY2xvc2VkLgorCSAqLworCWJoZWFkID0gJnRjcF9iaGFzaFt0Y3BfYmhhc2hmbihpbmV0X3NrKHNrKS0+bnVtKV07CisJc3Bpbl9sb2NrKCZiaGVhZC0+bG9jayk7CisJdHctPnR3X3RiID0gdGNwX3NrKHNrKS0+YmluZF9oYXNoOworCUJVR19UUkFQKHRjcF9zayhzayktPmJpbmRfaGFzaCk7CisJdHdfYWRkX2JpbmRfbm9kZSh0dywgJnR3LT50d190Yi0+b3duZXJzKTsKKwlzcGluX3VubG9jaygmYmhlYWQtPmxvY2spOworCisJd3JpdGVfbG9jaygmZWhlYWQtPmxvY2spOworCisJLyogU3RlcCAyOiBSZW1vdmUgU0sgZnJvbSBlc3RhYmxpc2hlZCBoYXNoLiAqLworCWlmIChfX3NrX2RlbF9ub2RlX2luaXQoc2spKQorCQlzb2NrX3Byb3RfZGVjX3VzZShzay0+c2tfcHJvdCk7CisKKwkvKiBTdGVwIDM6IEhhc2ggVFcgaW50byBUSU1FV0FJVCBoYWxmIG9mIGVzdGFibGlzaGVkIGhhc2ggdGFibGUuICovCisJdHdfYWRkX25vZGUodHcsICYoZWhlYWQgKyB0Y3BfZWhhc2hfc2l6ZSktPmNoYWluKTsKKwlhdG9taWNfaW5jKCZ0dy0+dHdfcmVmY250KTsKKworCXdyaXRlX3VubG9jaygmZWhlYWQtPmxvY2spOworfQorCisvKiAKKyAqIE1vdmUgYSBzb2NrZXQgdG8gdGltZS13YWl0IG9yIGRlYWQgZmluLXdhaXQtMiBzdGF0ZS4KKyAqLyAKK3ZvaWQgdGNwX3RpbWVfd2FpdChzdHJ1Y3Qgc29jayAqc2ssIGludCBzdGF0ZSwgaW50IHRpbWVvKQoreworCXN0cnVjdCB0Y3BfdHdfYnVja2V0ICp0dyA9IE5VTEw7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJaW50IHJlY3ljbGVfb2sgPSAwOworCisJaWYgKHN5c2N0bF90Y3BfdHdfcmVjeWNsZSAmJiB0cC0+cnhfb3B0LnRzX3JlY2VudF9zdGFtcCkKKwkJcmVjeWNsZV9vayA9IHRwLT5hZl9zcGVjaWZpYy0+cmVtZW1iZXJfc3RhbXAoc2spOworCisJaWYgKHRjcF90d19jb3VudCA8IHN5c2N0bF90Y3BfbWF4X3R3X2J1Y2tldHMpCisJCXR3ID0ga21lbV9jYWNoZV9hbGxvYyh0Y3BfdGltZXdhaXRfY2FjaGVwLCBTTEFCX0FUT01JQyk7CisKKwlpZih0dyAhPSBOVUxMKSB7CisJCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwkJaW50IHJ0byA9ICh0cC0+cnRvPDwyKSAtICh0cC0+cnRvPj4xKTsKKworCQkvKiBHaXZlIHVzIGFuIGlkZW50aXR5LiAqLworCQl0dy0+dHdfZGFkZHIJCT0gaW5ldC0+ZGFkZHI7CisJCXR3LT50d19yY3Zfc2FkZHIJPSBpbmV0LT5yY3Zfc2FkZHI7CisJCXR3LT50d19ib3VuZF9kZXZfaWYJPSBzay0+c2tfYm91bmRfZGV2X2lmOworCQl0dy0+dHdfbnVtCQk9IGluZXQtPm51bTsKKwkJdHctPnR3X3N0YXRlCQk9IFRDUF9USU1FX1dBSVQ7CisJCXR3LT50d19zdWJzdGF0ZQkJPSBzdGF0ZTsKKwkJdHctPnR3X3Nwb3J0CQk9IGluZXQtPnNwb3J0OworCQl0dy0+dHdfZHBvcnQJCT0gaW5ldC0+ZHBvcnQ7CisJCXR3LT50d19mYW1pbHkJCT0gc2stPnNrX2ZhbWlseTsKKwkJdHctPnR3X3JldXNlCQk9IHNrLT5za19yZXVzZTsKKwkJdHctPnR3X3Jjdl93c2NhbGUJPSB0cC0+cnhfb3B0LnJjdl93c2NhbGU7CisJCWF0b21pY19zZXQoJnR3LT50d19yZWZjbnQsIDEpOworCisJCXR3LT50d19oYXNoZW50CQk9IHNrLT5za19oYXNoZW50OworCQl0dy0+dHdfcmN2X254dAkJPSB0cC0+cmN2X254dDsKKwkJdHctPnR3X3NuZF9ueHQJCT0gdHAtPnNuZF9ueHQ7CisJCXR3LT50d19yY3Zfd25kCQk9IHRjcF9yZWNlaXZlX3dpbmRvdyh0cCk7CisJCXR3LT50d190c19yZWNlbnQJPSB0cC0+cnhfb3B0LnRzX3JlY2VudDsKKwkJdHctPnR3X3RzX3JlY2VudF9zdGFtcAk9IHRwLT5yeF9vcHQudHNfcmVjZW50X3N0YW1wOworCQl0d19kZWFkX25vZGVfaW5pdCh0dyk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwkJaWYgKHR3LT50d19mYW1pbHkgPT0gUEZfSU5FVDYpIHsKKwkJCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKKworCQkJaXB2Nl9hZGRyX2NvcHkoJnR3LT50d192Nl9kYWRkciwgJm5wLT5kYWRkcik7CisJCQlpcHY2X2FkZHJfY29weSgmdHctPnR3X3Y2X3Jjdl9zYWRkciwgJm5wLT5yY3Zfc2FkZHIpOworCQkJdHctPnR3X3Y2X2lwdjZvbmx5ID0gbnAtPmlwdjZvbmx5OworCQl9IGVsc2UgeworCQkJbWVtc2V0KCZ0dy0+dHdfdjZfZGFkZHIsIDAsIHNpemVvZih0dy0+dHdfdjZfZGFkZHIpKTsKKwkJCW1lbXNldCgmdHctPnR3X3Y2X3Jjdl9zYWRkciwgMCwgc2l6ZW9mKHR3LT50d192Nl9yY3Zfc2FkZHIpKTsKKwkJCXR3LT50d192Nl9pcHY2b25seSA9IDA7CisJCX0KKyNlbmRpZgorCQkvKiBMaW5rYWdlIHVwZGF0ZXMuICovCisJCV9fdGNwX3R3X2hhc2hkYW5jZShzaywgdHcpOworCisJCS8qIEdldCB0aGUgVElNRV9XQUlUIHRpbWVvdXQgZmlyaW5nLiAqLworCQlpZiAodGltZW8gPCBydG8pCisJCQl0aW1lbyA9IHJ0bzsKKworCQlpZiAocmVjeWNsZV9vaykgeworCQkJdHctPnR3X3RpbWVvdXQgPSBydG87CisJCX0gZWxzZSB7CisJCQl0dy0+dHdfdGltZW91dCA9IFRDUF9USU1FV0FJVF9MRU47CisJCQlpZiAoc3RhdGUgPT0gVENQX1RJTUVfV0FJVCkKKwkJCQl0aW1lbyA9IFRDUF9USU1FV0FJVF9MRU47CisJCX0KKworCQl0Y3BfdHdfc2NoZWR1bGUodHcsIHRpbWVvKTsKKwkJdGNwX3R3X3B1dCh0dyk7CisJfSBlbHNlIHsKKwkJLyogU29ycnksIGlmIHdlJ3JlIG91dCBvZiBtZW1vcnksIGp1c3QgQ0xPU0UgdGhpcworCQkgKiBzb2NrZXQgdXAuICBXZSd2ZSBnb3QgYmlnZ2VyIHByb2JsZW1zIHRoYW4KKwkJICogbm9uLWdyYWNlZnVsIHNvY2tldCBjbG9zaW5ncy4KKwkJICovCisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9JTkZPICJUQ1A6IHRpbWUgd2FpdCBidWNrZXQgdGFibGUgb3ZlcmZsb3dcbiIpOworCX0KKworCXRjcF91cGRhdGVfbWV0cmljcyhzayk7CisJdGNwX2RvbmUoc2spOworfQorCisvKiBLaWxsIG9mZiBUSU1FX1dBSVQgc29ja2V0cyBvbmNlIHRoZWlyIGxpZmV0aW1lIGhhcyBleHBpcmVkLiAqLworc3RhdGljIGludCB0Y3BfdHdfZGVhdGhfcm93X3Nsb3Q7CisKK3N0YXRpYyB2b2lkIHRjcF90d2tpbGwodW5zaWduZWQgbG9uZyk7CisKKy8qIFRJTUVfV0FJVCByZWFwaW5nIG1lY2hhbmlzbS4gKi8KKyNkZWZpbmUgVENQX1RXS0lMTF9TTE9UUwk4CS8qIFBsZWFzZSBrZWVwIHRoaXMgYSBwb3dlciBvZiAyLiAqLworI2RlZmluZSBUQ1BfVFdLSUxMX1BFUklPRAkoVENQX1RJTUVXQUlUX0xFTi9UQ1BfVFdLSUxMX1NMT1RTKQorCisjZGVmaW5lIFRDUF9UV0tJTExfUVVPVEEJMTAwCisKK3N0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCB0Y3BfdHdfZGVhdGhfcm93W1RDUF9UV0tJTExfU0xPVFNdOworc3RhdGljIERFRklORV9TUElOTE9DSyh0d19kZWF0aF9sb2NrKTsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCB0Y3BfdHdfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUih0Y3BfdHdraWxsLCAwLCAwKTsKK3N0YXRpYyB2b2lkIHR3a2lsbF93b3JrKHZvaWQgKik7CitzdGF0aWMgREVDTEFSRV9XT1JLKHRjcF90d2tpbGxfd29yaywgdHdraWxsX3dvcmssIE5VTEwpOworc3RhdGljIHUzMiB0d2tpbGxfdGhyZWFkX3Nsb3RzOworCisvKiBSZXR1cm5zIG5vbi16ZXJvIGlmIHF1b3RhIGV4Y2VlZGVkLiAgKi8KK3N0YXRpYyBpbnQgdGNwX2RvX3R3a2lsbF93b3JrKGludCBzbG90LCB1bnNpZ25lZCBpbnQgcXVvdGEpCit7CisJc3RydWN0IHRjcF90d19idWNrZXQgKnR3OworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXVuc2lnbmVkIGludCBraWxsZWQ7CisJaW50IHJldDsKKworCS8qIE5PVEU6IGNvbXBhcmUgdGhpcyB0byBwcmV2aW91cyB2ZXJzaW9uIHdoZXJlIGxvY2sKKwkgKiB3YXMgcmVsZWFzZWQgYWZ0ZXIgZGV0YWNoaW5nIGNoYWluLiBJdCB3YXMgcmFjeSwKKwkgKiBiZWNhdXNlIHR3IGJ1Y2tldHMgYXJlIHNjaGVkdWxlZCBpbiBub3Qgc2VyaWFsaXplZCBjb250ZXh0CisJICogaW4gMi4zICh3aXRoIG5ldGZpbHRlciksIGFuZCB3aXRoIHNvZnRuZXQgaXQgaXMgY29tbW9uLCBiZWNhdXNlCisJICogc29mdCBpcnFzIGFyZSBub3Qgc2VxdWVuY2VkLgorCSAqLworCWtpbGxlZCA9IDA7CisJcmV0ID0gMDsKK3Jlc2NhbjoKKwl0d19mb3JfZWFjaF9pbm1hdGUodHcsIG5vZGUsICZ0Y3BfdHdfZGVhdGhfcm93W3Nsb3RdKSB7CisJCV9fdHdfZGVsX2RlYWRfbm9kZSh0dyk7CisJCXNwaW5fdW5sb2NrKCZ0d19kZWF0aF9sb2NrKTsKKwkJdGNwX3RpbWV3YWl0X2tpbGwodHcpOworCQl0Y3BfdHdfcHV0KHR3KTsKKwkJa2lsbGVkKys7CisJCXNwaW5fbG9jaygmdHdfZGVhdGhfbG9jayk7CisJCWlmIChraWxsZWQgPiBxdW90YSkgeworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogV2hpbGUgd2UgZHJvcHBlZCB0d19kZWF0aF9sb2NrLCBhbm90aGVyIGNwdSBtYXkgaGF2ZQorCQkgKiBraWxsZWQgb2ZmIHRoZSBuZXh0IFRXIGJ1Y2tldCBpbiB0aGUgbGlzdCwgdGhlcmVmb3JlCisJCSAqIGRvIGEgZnJlc2ggcmUtcmVhZCBvZiB0aGUgaGxpc3QgaGVhZCBub2RlIHdpdGggdGhlCisJCSAqIGxvY2sgcmVhY3F1aXJlZC4gIFdlIHN0aWxsIHVzZSB0aGUgaGxpc3QgdHJhdmVyc2FsCisJCSAqIG1hY3JvIGluIG9yZGVyIHRvIGdldCB0aGUgcHJlZmV0Y2hlcy4KKwkJICovCisJCWdvdG8gcmVzY2FuOworCX0KKworCXRjcF90d19jb3VudCAtPSBraWxsZWQ7CisJTkVUX0FERF9TVEFUU19CSChMSU5VWF9NSUJfVElNRVdBSVRFRCwga2lsbGVkKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHRjcF90d2tpbGwodW5zaWduZWQgbG9uZyBkdW1teSkKK3sKKwlpbnQgbmVlZF90aW1lciwgcmV0OworCisJc3Bpbl9sb2NrKCZ0d19kZWF0aF9sb2NrKTsKKworCWlmICh0Y3BfdHdfY291bnQgPT0gMCkKKwkJZ290byBvdXQ7CisKKwluZWVkX3RpbWVyID0gMDsKKwlyZXQgPSB0Y3BfZG9fdHdraWxsX3dvcmsodGNwX3R3X2RlYXRoX3Jvd19zbG90LCBUQ1BfVFdLSUxMX1FVT1RBKTsKKwlpZiAocmV0KSB7CisJCXR3a2lsbF90aHJlYWRfc2xvdHMgfD0gKDEgPDwgdGNwX3R3X2RlYXRoX3Jvd19zbG90KTsKKwkJbWIoKTsKKwkJc2NoZWR1bGVfd29yaygmdGNwX3R3a2lsbF93b3JrKTsKKwkJbmVlZF90aW1lciA9IDE7CisJfSBlbHNlIHsKKwkJLyogV2UgcHVyZ2VkIHRoZSBlbnRpcmUgc2xvdCwgYW55dGhpbmcgbGVmdD8gICovCisJCWlmICh0Y3BfdHdfY291bnQpCisJCQluZWVkX3RpbWVyID0gMTsKKwl9CisJdGNwX3R3X2RlYXRoX3Jvd19zbG90ID0KKwkJKCh0Y3BfdHdfZGVhdGhfcm93X3Nsb3QgKyAxKSAmIChUQ1BfVFdLSUxMX1NMT1RTIC0gMSkpOworCWlmIChuZWVkX3RpbWVyKQorCQltb2RfdGltZXIoJnRjcF90d190aW1lciwgamlmZmllcyArIFRDUF9UV0tJTExfUEVSSU9EKTsKK291dDoKKwlzcGluX3VubG9jaygmdHdfZGVhdGhfbG9jayk7Cit9CisKK2V4dGVybiB2b2lkIHR3a2lsbF9zbG90c19pbnZhbGlkKHZvaWQpOworCitzdGF0aWMgdm9pZCB0d2tpbGxfd29yayh2b2lkICpkdW1teSkKK3sKKwlpbnQgaTsKKworCWlmICgoVENQX1RXS0lMTF9TTE9UUyAtIDEpID4gKHNpemVvZih0d2tpbGxfdGhyZWFkX3Nsb3RzKSAqIDgpKQorCQl0d2tpbGxfc2xvdHNfaW52YWxpZCgpOworCisJd2hpbGUgKHR3a2lsbF90aHJlYWRfc2xvdHMpIHsKKwkJc3Bpbl9sb2NrX2JoKCZ0d19kZWF0aF9sb2NrKTsKKwkJZm9yIChpID0gMDsgaSA8IFRDUF9UV0tJTExfU0xPVFM7IGkrKykgeworCQkJaWYgKCEodHdraWxsX3RocmVhZF9zbG90cyAmICgxIDw8IGkpKSkKKwkJCQljb250aW51ZTsKKworCQkJd2hpbGUgKHRjcF9kb190d2tpbGxfd29yayhpLCBUQ1BfVFdLSUxMX1FVT1RBKSAhPSAwKSB7CisJCQkJaWYgKG5lZWRfcmVzY2hlZCgpKSB7CisJCQkJCXNwaW5fdW5sb2NrX2JoKCZ0d19kZWF0aF9sb2NrKTsKKwkJCQkJc2NoZWR1bGUoKTsKKwkJCQkJc3Bpbl9sb2NrX2JoKCZ0d19kZWF0aF9sb2NrKTsKKwkJCQl9CisJCQl9CisKKwkJCXR3a2lsbF90aHJlYWRfc2xvdHMgJj0gfigxIDw8IGkpOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZ0d19kZWF0aF9sb2NrKTsKKwl9Cit9CisKKy8qIFRoZXNlIGFyZSBhbHdheXMgY2FsbGVkIGZyb20gQkggY29udGV4dC4gIFNlZSBjYWxsZXJzIGluCisgKiB0Y3BfaW5wdXQuYyB0byB2ZXJpZnkgdGhpcy4KKyAqLworCisvKiBUaGlzIGlzIGZvciBoYW5kbGluZyBlYXJseS1raWxscyBvZiBUSU1FX1dBSVQgc29ja2V0cy4gKi8KK3ZvaWQgdGNwX3R3X2Rlc2NoZWR1bGUoc3RydWN0IHRjcF90d19idWNrZXQgKnR3KQoreworCXNwaW5fbG9jaygmdHdfZGVhdGhfbG9jayk7CisJaWYgKHR3X2RlbF9kZWFkX25vZGUodHcpKSB7CisJCXRjcF90d19wdXQodHcpOworCQlpZiAoLS10Y3BfdHdfY291bnQgPT0gMCkKKwkJCWRlbF90aW1lcigmdGNwX3R3X3RpbWVyKTsKKwl9CisJc3Bpbl91bmxvY2soJnR3X2RlYXRoX2xvY2spOworCXRjcF90aW1ld2FpdF9raWxsKHR3KTsKK30KKworLyogU2hvcnQtdGltZSB0aW1ld2FpdCBjYWxlbmRhciAqLworCitzdGF0aWMgaW50IHRjcF90d2NhbF9oYW5kID0gLTE7CitzdGF0aWMgaW50IHRjcF90d2NhbF9qaWZmaWU7CitzdGF0aWMgdm9pZCB0Y3BfdHdjYWxfdGljayh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCB0Y3BfdHdjYWxfdGltZXIgPQorCQlUSU1FUl9JTklUSUFMSVpFUih0Y3BfdHdjYWxfdGljaywgMCwgMCk7CitzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgdGNwX3R3Y2FsX3Jvd1tUQ1BfVFdfUkVDWUNMRV9TTE9UU107CisKK3N0YXRpYyB2b2lkIHRjcF90d19zY2hlZHVsZShzdHJ1Y3QgdGNwX3R3X2J1Y2tldCAqdHcsIGludCB0aW1lbykKK3sKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqbGlzdDsKKwlpbnQgc2xvdDsKKworCS8qIHRpbWVvdXQgOj0gUlRPICogMy41CisJICoKKwkgKiAzLjUgPSAxKzIrMC41IHRvIHdhaXQgZm9yIHR3byByZXRyYW5zbWl0cy4KKwkgKgorCSAqIFJBVElPTkFMRTogaWYgRklOIGFycml2ZWQgYW5kIHdlIGVudGVyZWQgVElNRS1XQUlUIHN0YXRlLAorCSAqIG91ciBBQ0sgYWNraW5nIHRoYXQgRklOIGNhbiBiZSBsb3N0LiBJZiBOIHN1YnNlcXVlbnQgcmV0cmFuc21pdHRlZAorCSAqIEZJTnMgKG9yIHByZXZpb3VzIHNlcW1lbnRzKSBhcmUgbG9zdCAocHJvYmFiaWxpdHkgb2Ygc3VjaCBldmVudAorCSAqIGlzIHBeKE4rMSksIHdoZXJlIHAgaXMgcHJvYmFiaWxpdHkgdG8gbG9zZSBzaW5nbGUgcGFja2V0IGFuZAorCSAqIHRpbWUgdG8gZGV0ZWN0IHRoZSBsb3NzIGlzIGFib3V0IFJUTyooMl5OIC0gMSkgd2l0aCBleHBvbmVudGlhbAorCSAqIGJhY2tvZmYpLiBOb3JtYWwgdGltZXdhaXQgbGVuZ3RoIGlzIGNhbGN1bGF0ZWQgc28sIHRoYXQgd2UKKwkgKiB3YWl0ZWQgYXQgbGVhc3QgZm9yIG9uZSByZXRyYW5zbWl0dGVkIEZJTiAobWF4aW1hbCBSVE8gaXMgMTIwc2VjKS4KKwkgKiBbIEJUVyBMaW51eC4gZm9sbG93aW5nIEJTRCwgdmlvbGF0ZXMgdGhpcyByZXF1aXJlbWVudCB3YWl0aW5nCisJICogICBvbmx5IGZvciA2MHNlYywgd2Ugc2hvdWxkIHdhaXQgYXQgbGVhc3QgZm9yIDI0MCBzZWNzLgorCSAqICAgV2VsbCwgMjQwIGNvbnN1bWVzIHRvbyBtdWNoIG9mIHJlc291cmNlcyA4KQorCSAqIF0KKwkgKiBUaGlzIGludGVydmFsIGlzIG5vdCByZWR1Y2VkIHRvIGNhdGNoIG9sZCBkdXBsaWNhdGUgYW5kCisJICogcmVzcG9uY2VzIHRvIG91ciB3YW5kZXJpbmcgc2VnbWVudHMgbGl2aW5nIGZvciB0d28gTVNMcy4KKwkgKiBIb3dldmVyLCBpZiB3ZSB1c2UgUEFXUyB0byBkZXRlY3QKKwkgKiBvbGQgZHVwbGljYXRlcywgd2UgY2FuIHJlZHVjZSB0aGUgaW50ZXJ2YWwgdG8gYm91bmRzIHJlcXVpcmVkCisJICogYnkgUlRPLCByYXRoZXIgdGhhbiBNU0wuIFNvLCBpZiBwZWVyIHVuZGVyc3RhbmRzIFBBV1MsIHdlCisJICoga2lsbCB0dyBidWNrZXQgYWZ0ZXIgMy41KlJUTyAoaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhpcyBudW1iZXIKKwkgKiBpcyBncmVhdGVyIHRoYW4gVFMgdGljayEpIGFuZCBkZXRlY3Qgb2xkIGR1cGxpY2F0ZXMgd2l0aCBoZWxwCisJICogb2YgUEFXUy4KKwkgKi8KKwlzbG90ID0gKHRpbWVvICsgKDE8PFRDUF9UV19SRUNZQ0xFX1RJQ0spIC0gMSkgPj4gVENQX1RXX1JFQ1lDTEVfVElDSzsKKworCXNwaW5fbG9jaygmdHdfZGVhdGhfbG9jayk7CisKKwkvKiBVbmxpbmsgaXQsIGlmIGl0IHdhcyBzY2hlZHVsZWQgKi8KKwlpZiAodHdfZGVsX2RlYWRfbm9kZSh0dykpCisJCXRjcF90d19jb3VudC0tOworCWVsc2UKKwkJYXRvbWljX2luYygmdHctPnR3X3JlZmNudCk7CisKKwlpZiAoc2xvdCA+PSBUQ1BfVFdfUkVDWUNMRV9TTE9UUykgeworCQkvKiBTY2hlZHVsZSB0byBzbG93IHRpbWVyICovCisJCWlmICh0aW1lbyA+PSBUQ1BfVElNRVdBSVRfTEVOKSB7CisJCQlzbG90ID0gVENQX1RXS0lMTF9TTE9UUy0xOworCQl9IGVsc2UgeworCQkJc2xvdCA9ICh0aW1lbyArIFRDUF9UV0tJTExfUEVSSU9ELTEpIC8gVENQX1RXS0lMTF9QRVJJT0Q7CisJCQlpZiAoc2xvdCA+PSBUQ1BfVFdLSUxMX1NMT1RTKQorCQkJCXNsb3QgPSBUQ1BfVFdLSUxMX1NMT1RTLTE7CisJCX0KKwkJdHctPnR3X3R0ZCA9IGppZmZpZXMgKyB0aW1lbzsKKwkJc2xvdCA9ICh0Y3BfdHdfZGVhdGhfcm93X3Nsb3QgKyBzbG90KSAmIChUQ1BfVFdLSUxMX1NMT1RTIC0gMSk7CisJCWxpc3QgPSAmdGNwX3R3X2RlYXRoX3Jvd1tzbG90XTsKKwl9IGVsc2UgeworCQl0dy0+dHdfdHRkID0gamlmZmllcyArIChzbG90IDw8IFRDUF9UV19SRUNZQ0xFX1RJQ0spOworCisJCWlmICh0Y3BfdHdjYWxfaGFuZCA8IDApIHsKKwkJCXRjcF90d2NhbF9oYW5kID0gMDsKKwkJCXRjcF90d2NhbF9qaWZmaWUgPSBqaWZmaWVzOworCQkJdGNwX3R3Y2FsX3RpbWVyLmV4cGlyZXMgPSB0Y3BfdHdjYWxfamlmZmllICsgKHNsb3Q8PFRDUF9UV19SRUNZQ0xFX1RJQ0spOworCQkJYWRkX3RpbWVyKCZ0Y3BfdHdjYWxfdGltZXIpOworCQl9IGVsc2UgeworCQkJaWYgKHRpbWVfYWZ0ZXIodGNwX3R3Y2FsX3RpbWVyLmV4cGlyZXMsIGppZmZpZXMgKyAoc2xvdDw8VENQX1RXX1JFQ1lDTEVfVElDSykpKQorCQkJCW1vZF90aW1lcigmdGNwX3R3Y2FsX3RpbWVyLCBqaWZmaWVzICsgKHNsb3Q8PFRDUF9UV19SRUNZQ0xFX1RJQ0spKTsKKwkJCXNsb3QgPSAodGNwX3R3Y2FsX2hhbmQgKyBzbG90KSYoVENQX1RXX1JFQ1lDTEVfU0xPVFMtMSk7CisJCX0KKwkJbGlzdCA9ICZ0Y3BfdHdjYWxfcm93W3Nsb3RdOworCX0KKworCWhsaXN0X2FkZF9oZWFkKCZ0dy0+dHdfZGVhdGhfbm9kZSwgbGlzdCk7CisKKwlpZiAodGNwX3R3X2NvdW50KysgPT0gMCkKKwkJbW9kX3RpbWVyKCZ0Y3BfdHdfdGltZXIsIGppZmZpZXMrVENQX1RXS0lMTF9QRVJJT0QpOworCXNwaW5fdW5sb2NrKCZ0d19kZWF0aF9sb2NrKTsKK30KKwordm9pZCB0Y3BfdHdjYWxfdGljayh1bnNpZ25lZCBsb25nIGR1bW15KQoreworCWludCBuLCBzbG90OworCXVuc2lnbmVkIGxvbmcgajsKKwl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisJaW50IGtpbGxlZCA9IDA7CisJaW50IGFkdiA9IDA7CisKKwlzcGluX2xvY2soJnR3X2RlYXRoX2xvY2spOworCWlmICh0Y3BfdHdjYWxfaGFuZCA8IDApCisJCWdvdG8gb3V0OworCisJc2xvdCA9IHRjcF90d2NhbF9oYW5kOworCWogPSB0Y3BfdHdjYWxfamlmZmllOworCisJZm9yIChuPTA7IG48VENQX1RXX1JFQ1lDTEVfU0xPVFM7IG4rKykgeworCQlpZiAodGltZV9iZWZvcmVfZXEoaiwgbm93KSkgeworCQkJc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsICpzYWZlOworCQkJc3RydWN0IHRjcF90d19idWNrZXQgKnR3OworCisJCQl0d19mb3JfZWFjaF9pbm1hdGVfc2FmZSh0dywgbm9kZSwgc2FmZSwKKwkJCQkJICAgJnRjcF90d2NhbF9yb3dbc2xvdF0pIHsKKwkJCQlfX3R3X2RlbF9kZWFkX25vZGUodHcpOworCQkJCXRjcF90aW1ld2FpdF9raWxsKHR3KTsKKwkJCQl0Y3BfdHdfcHV0KHR3KTsKKwkJCQlraWxsZWQrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghYWR2KSB7CisJCQkJYWR2ID0gMTsKKwkJCQl0Y3BfdHdjYWxfamlmZmllID0gajsKKwkJCQl0Y3BfdHdjYWxfaGFuZCA9IHNsb3Q7CisJCQl9CisKKwkJCWlmICghaGxpc3RfZW1wdHkoJnRjcF90d2NhbF9yb3dbc2xvdF0pKSB7CisJCQkJbW9kX3RpbWVyKCZ0Y3BfdHdjYWxfdGltZXIsIGopOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJCWogKz0gKDE8PFRDUF9UV19SRUNZQ0xFX1RJQ0spOworCQlzbG90ID0gKHNsb3QrMSkmKFRDUF9UV19SRUNZQ0xFX1NMT1RTLTEpOworCX0KKwl0Y3BfdHdjYWxfaGFuZCA9IC0xOworCitvdXQ6CisJaWYgKCh0Y3BfdHdfY291bnQgLT0ga2lsbGVkKSA9PSAwKQorCQlkZWxfdGltZXIoJnRjcF90d190aW1lcik7CisJTkVUX0FERF9TVEFUU19CSChMSU5VWF9NSUJfVElNRVdBSVRLSUxMRUQsIGtpbGxlZCk7CisJc3Bpbl91bmxvY2soJnR3X2RlYXRoX2xvY2spOworfQorCisvKiBUaGlzIGlzIG5vdCBvbmx5IG1vcmUgZWZmaWNpZW50IHRoYW4gd2hhdCB3ZSB1c2VkIHRvIGRvLCBpdCBlbGltaW5hdGVzCisgKiBhIGxvdCBvZiBjb2RlIGR1cGxpY2F0aW9uIGJldHdlZW4gSVB2NC9JUHY2IFNZTiByZWN2IHByb2Nlc3NpbmcuIC1EYXZlTQorICoKKyAqIEFjdHVhbGx5LCB3ZSBjb3VsZCBsb3RzIG9mIG1lbW9yeSB3cml0ZXMgaGVyZS4gdHAgb2YgbGlzdGVuaW5nCisgKiBzb2NrZXQgY29udGFpbnMgYWxsIG5lY2Vzc2FyeSBkZWZhdWx0IHBhcmFtZXRlcnMuCisgKi8KK3N0cnVjdCBzb2NrICp0Y3BfY3JlYXRlX29wZW5yZXFfY2hpbGQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgb3Blbl9yZXF1ZXN0ICpyZXEsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJLyogYWxsb2NhdGUgdGhlIG5ld3NrIGZyb20gdGhlIHNhbWUgc2xhYiBvZiB0aGUgbWFzdGVyIHNvY2ssCisJICogaWYgbm90LCBhdCBza19mcmVlIHRpbWUgd2UnbGwgdHJ5IHRvIGZyZWUgaXQgZnJvbSB0aGUgd3JvbmcKKwkgKiBzbGFiY2FjaGUgKGkuZS4gaXMgaXQgVENQdjQgb3IgdjY/KSwgdGhpcyBpcyBoYW5kbGVkIHRocnUgc2stPnNrX3Byb3QgLWFjbWUgKi8KKwlzdHJ1Y3Qgc29jayAqbmV3c2sgPSBza19hbGxvYyhQRl9JTkVULCBHRlBfQVRPTUlDLCBzay0+c2tfcHJvdCwgMCk7CisKKwlpZihuZXdzayAhPSBOVUxMKSB7CisJCXN0cnVjdCB0Y3Bfc29jayAqbmV3dHA7CisJCXN0cnVjdCBza19maWx0ZXIgKmZpbHRlcjsKKworCQltZW1jcHkobmV3c2ssIHNrLCBzaXplb2Yoc3RydWN0IHRjcF9zb2NrKSk7CisJCW5ld3NrLT5za19zdGF0ZSA9IFRDUF9TWU5fUkVDVjsKKworCQkvKiBTQU5JVFkgKi8KKwkJc2tfbm9kZV9pbml0KCZuZXdzay0+c2tfbm9kZSk7CisJCXRjcF9zayhuZXdzayktPmJpbmRfaGFzaCA9IE5VTEw7CisKKwkJLyogQ2xvbmUgdGhlIFRDUCBoZWFkZXIgdGVtcGxhdGUgKi8KKwkJaW5ldF9zayhuZXdzayktPmRwb3J0ID0gcmVxLT5ybXRfcG9ydDsKKworCQlzb2NrX2xvY2tfaW5pdChuZXdzayk7CisJCWJoX2xvY2tfc29jayhuZXdzayk7CisKKwkJcndsb2NrX2luaXQoJm5ld3NrLT5za19kc3RfbG9jayk7CisJCWF0b21pY19zZXQoJm5ld3NrLT5za19ybWVtX2FsbG9jLCAwKTsKKwkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbmV3c2stPnNrX3JlY2VpdmVfcXVldWUpOworCQlhdG9taWNfc2V0KCZuZXdzay0+c2tfd21lbV9hbGxvYywgMCk7CisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJm5ld3NrLT5za193cml0ZV9xdWV1ZSk7CisJCWF0b21pY19zZXQoJm5ld3NrLT5za19vbWVtX2FsbG9jLCAwKTsKKwkJbmV3c2stPnNrX3dtZW1fcXVldWVkID0gMDsKKwkJbmV3c2stPnNrX2ZvcndhcmRfYWxsb2MgPSAwOworCisJCXNvY2tfcmVzZXRfZmxhZyhuZXdzaywgU09DS19ET05FKTsKKwkJbmV3c2stPnNrX3VzZXJsb2NrcyA9IHNrLT5za191c2VybG9ja3MgJiB+U09DS19CSU5EUE9SVF9MT0NLOworCQluZXdzay0+c2tfYmFja2xvZy5oZWFkID0gbmV3c2stPnNrX2JhY2tsb2cudGFpbCA9IE5VTEw7CisJCW5ld3NrLT5za19zZW5kX2hlYWQgPSBOVUxMOworCQlyd2xvY2tfaW5pdCgmbmV3c2stPnNrX2NhbGxiYWNrX2xvY2spOworCQlza2JfcXVldWVfaGVhZF9pbml0KCZuZXdzay0+c2tfZXJyb3JfcXVldWUpOworCQluZXdzay0+c2tfd3JpdGVfc3BhY2UgPSBza19zdHJlYW1fd3JpdGVfc3BhY2U7CisKKwkJaWYgKChmaWx0ZXIgPSBuZXdzay0+c2tfZmlsdGVyKSAhPSBOVUxMKQorCQkJc2tfZmlsdGVyX2NoYXJnZShuZXdzaywgZmlsdGVyKTsKKworCQlpZiAodW5saWtlbHkoeGZybV9za19jbG9uZV9wb2xpY3kobmV3c2spKSkgeworCQkJLyogSXQgaXMgc3RpbGwgcmF3IGNvcHkgb2YgcGFyZW50LCBzbyBpbnZhbGlkYXRlCisJCQkgKiBkZXN0cnVjdG9yIGFuZCBtYWtlIHBsYWluIHNrX2ZyZWUoKSAqLworCQkJbmV3c2stPnNrX2Rlc3RydWN0ID0gTlVMTDsKKwkJCXNrX2ZyZWUobmV3c2spOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQkvKiBOb3cgc2V0dXAgdGNwX3NvY2sgKi8KKwkJbmV3dHAgPSB0Y3Bfc2sobmV3c2spOworCQluZXd0cC0+cHJlZF9mbGFncyA9IDA7CisJCW5ld3RwLT5yY3Zfbnh0ID0gcmVxLT5yY3ZfaXNuICsgMTsKKwkJbmV3dHAtPnNuZF9ueHQgPSByZXEtPnNudF9pc24gKyAxOworCQluZXd0cC0+c25kX3VuYSA9IHJlcS0+c250X2lzbiArIDE7CisJCW5ld3RwLT5zbmRfc21sID0gcmVxLT5zbnRfaXNuICsgMTsKKworCQl0Y3BfcHJlcXVldWVfaW5pdChuZXd0cCk7CisKKwkJdGNwX2luaXRfd2wobmV3dHAsIHJlcS0+c250X2lzbiwgcmVxLT5yY3ZfaXNuKTsKKworCQluZXd0cC0+cmV0cmFuc21pdHMgPSAwOworCQluZXd0cC0+YmFja29mZiA9IDA7CisJCW5ld3RwLT5zcnR0ID0gMDsKKwkJbmV3dHAtPm1kZXYgPSBUQ1BfVElNRU9VVF9JTklUOworCQluZXd0cC0+cnRvID0gVENQX1RJTUVPVVRfSU5JVDsKKworCQluZXd0cC0+cGFja2V0c19vdXQgPSAwOworCQluZXd0cC0+bGVmdF9vdXQgPSAwOworCQluZXd0cC0+cmV0cmFuc19vdXQgPSAwOworCQluZXd0cC0+c2Fja2VkX291dCA9IDA7CisJCW5ld3RwLT5mYWNrZXRzX291dCA9IDA7CisJCW5ld3RwLT5zbmRfc3N0aHJlc2ggPSAweDdmZmZmZmZmOworCisJCS8qIFNvIG1hbnkgVENQIGltcGxlbWVudGF0aW9ucyBvdXQgdGhlcmUgKGluY29ycmVjdGx5KSBjb3VudCB0aGUKKwkJICogaW5pdGlhbCBTWU4gZnJhbWUgaW4gdGhlaXIgZGVsYXllZC1BQ0sgYW5kIGNvbmdlc3Rpb24gY29udHJvbAorCQkgKiBhbGdvcml0aG1zIHRoYXQgd2UgbXVzdCBoYXZlIHRoZSBmb2xsb3dpbmcgYmFuZGFpZCB0byB0YWxrCisJCSAqIGVmZmljaWVudGx5IHRvIHRoZW0uICAtRGF2ZU0KKwkJICovCisJCW5ld3RwLT5zbmRfY3duZCA9IDI7CisJCW5ld3RwLT5zbmRfY3duZF9jbnQgPSAwOworCisJCW5ld3RwLT5mcnRvX2NvdW50ZXIgPSAwOworCQluZXd0cC0+ZnJ0b19oaWdobWFyayA9IDA7CisKKwkJdGNwX3NldF9jYV9zdGF0ZShuZXd0cCwgVENQX0NBX09wZW4pOworCQl0Y3BfaW5pdF94bWl0X3RpbWVycyhuZXdzayk7CisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJm5ld3RwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOworCQluZXd0cC0+cmN2X3d1cCA9IHJlcS0+cmN2X2lzbiArIDE7CisJCW5ld3RwLT53cml0ZV9zZXEgPSByZXEtPnNudF9pc24gKyAxOworCQluZXd0cC0+cHVzaGVkX3NlcSA9IG5ld3RwLT53cml0ZV9zZXE7CisJCW5ld3RwLT5jb3BpZWRfc2VxID0gcmVxLT5yY3ZfaXNuICsgMTsKKworCQluZXd0cC0+cnhfb3B0LnNhd190c3RhbXAgPSAwOworCisJCW5ld3RwLT5yeF9vcHQuZHNhY2sgPSAwOworCQluZXd0cC0+cnhfb3B0LmVmZl9zYWNrcyA9IDA7CisKKwkJbmV3dHAtPnByb2Jlc19vdXQgPSAwOworCQluZXd0cC0+cnhfb3B0Lm51bV9zYWNrcyA9IDA7CisJCW5ld3RwLT51cmdfZGF0YSA9IDA7CisJCW5ld3RwLT5saXN0ZW5fb3B0ID0gTlVMTDsKKwkJbmV3dHAtPmFjY2VwdF9xdWV1ZSA9IG5ld3RwLT5hY2NlcHRfcXVldWVfdGFpbCA9IE5VTEw7CisJCS8qIERlaW5pdGlhbGl6ZSBzeW5fd2FpdF9sb2NrIHRvIHRyYXAgaWxsZWdhbCBhY2Nlc3Nlcy4gKi8KKwkJbWVtc2V0KCZuZXd0cC0+c3luX3dhaXRfbG9jaywgMCwgc2l6ZW9mKG5ld3RwLT5zeW5fd2FpdF9sb2NrKSk7CisKKwkJLyogQmFjayB0byBiYXNlIHN0cnVjdCBzb2NrIG1lbWJlcnMuICovCisJCW5ld3NrLT5za19lcnIgPSAwOworCQluZXdzay0+c2tfcHJpb3JpdHkgPSAwOworCQlhdG9taWNfc2V0KCZuZXdzay0+c2tfcmVmY250LCAyKTsKKyNpZmRlZiBJTkVUX1JFRkNOVF9ERUJVRworCQlhdG9taWNfaW5jKCZpbmV0X3NvY2tfbnIpOworI2VuZGlmCisJCWF0b21pY19pbmMoJnRjcF9zb2NrZXRzX2FsbG9jYXRlZCk7CisKKwkJaWYgKHNvY2tfZmxhZyhuZXdzaywgU09DS19LRUVQT1BFTikpCisJCQl0Y3BfcmVzZXRfa2VlcGFsaXZlX3RpbWVyKG5ld3NrLAorCQkJCQkJICBrZWVwYWxpdmVfdGltZV93aGVuKG5ld3RwKSk7CisJCW5ld3NrLT5za19zb2NrZXQgPSBOVUxMOworCQluZXdzay0+c2tfc2xlZXAgPSBOVUxMOworCisJCW5ld3RwLT5yeF9vcHQudHN0YW1wX29rID0gcmVxLT50c3RhbXBfb2s7CisJCWlmKChuZXd0cC0+cnhfb3B0LnNhY2tfb2sgPSByZXEtPnNhY2tfb2spICE9IDApIHsKKwkJCWlmIChzeXNjdGxfdGNwX2ZhY2spCisJCQkJbmV3dHAtPnJ4X29wdC5zYWNrX29rIHw9IDI7CisJCX0KKwkJbmV3dHAtPndpbmRvd19jbGFtcCA9IHJlcS0+d2luZG93X2NsYW1wOworCQluZXd0cC0+cmN2X3NzdGhyZXNoID0gcmVxLT5yY3Zfd25kOworCQluZXd0cC0+cmN2X3duZCA9IHJlcS0+cmN2X3duZDsKKwkJbmV3dHAtPnJ4X29wdC53c2NhbGVfb2sgPSByZXEtPndzY2FsZV9vazsKKwkJaWYgKG5ld3RwLT5yeF9vcHQud3NjYWxlX29rKSB7CisJCQluZXd0cC0+cnhfb3B0LnNuZF93c2NhbGUgPSByZXEtPnNuZF93c2NhbGU7CisJCQluZXd0cC0+cnhfb3B0LnJjdl93c2NhbGUgPSByZXEtPnJjdl93c2NhbGU7CisJCX0gZWxzZSB7CisJCQluZXd0cC0+cnhfb3B0LnNuZF93c2NhbGUgPSBuZXd0cC0+cnhfb3B0LnJjdl93c2NhbGUgPSAwOworCQkJbmV3dHAtPndpbmRvd19jbGFtcCA9IG1pbihuZXd0cC0+d2luZG93X2NsYW1wLCA2NTUzNVUpOworCQl9CisJCW5ld3RwLT5zbmRfd25kID0gbnRvaHMoc2tiLT5oLnRoLT53aW5kb3cpIDw8IG5ld3RwLT5yeF9vcHQuc25kX3dzY2FsZTsKKwkJbmV3dHAtPm1heF93aW5kb3cgPSBuZXd0cC0+c25kX3duZDsKKworCQlpZiAobmV3dHAtPnJ4X29wdC50c3RhbXBfb2spIHsKKwkJCW5ld3RwLT5yeF9vcHQudHNfcmVjZW50ID0gcmVxLT50c19yZWNlbnQ7CisJCQluZXd0cC0+cnhfb3B0LnRzX3JlY2VudF9zdGFtcCA9IHh0aW1lLnR2X3NlYzsKKwkJCW5ld3RwLT50Y3BfaGVhZGVyX2xlbiA9IHNpemVvZihzdHJ1Y3QgdGNwaGRyKSArIFRDUE9MRU5fVFNUQU1QX0FMSUdORUQ7CisJCX0gZWxzZSB7CisJCQluZXd0cC0+cnhfb3B0LnRzX3JlY2VudF9zdGFtcCA9IDA7CisJCQluZXd0cC0+dGNwX2hlYWRlcl9sZW4gPSBzaXplb2Yoc3RydWN0IHRjcGhkcik7CisJCX0KKwkJaWYgKHNrYi0+bGVuID49IFRDUF9NSU5fUkNWTVNTK25ld3RwLT50Y3BfaGVhZGVyX2xlbikKKwkJCW5ld3RwLT5hY2subGFzdF9zZWdfc2l6ZSA9IHNrYi0+bGVuLW5ld3RwLT50Y3BfaGVhZGVyX2xlbjsKKwkJbmV3dHAtPnJ4X29wdC5tc3NfY2xhbXAgPSByZXEtPm1zczsKKwkJVENQX0VDTl9vcGVucmVxX2NoaWxkKG5ld3RwLCByZXEpOworCQlpZiAobmV3dHAtPmVjbl9mbGFncyZUQ1BfRUNOX09LKQorCQkJc29ja19zZXRfZmxhZyhuZXdzaywgU09DS19OT19MQVJHRVNFTkQpOworCisJCXRjcF9jYV9pbml0KG5ld3RwKTsKKworCQlUQ1BfSU5DX1NUQVRTX0JIKFRDUF9NSUJfUEFTU0lWRU9QRU5TKTsKKwl9CisJcmV0dXJuIG5ld3NrOworfQorCisvKiAKKyAqCVByb2Nlc3MgYW4gaW5jb21pbmcgcGFja2V0IGZvciBTWU5fUkVDViBzb2NrZXRzIHJlcHJlc2VudGVkCisgKglhcyBhbiBvcGVuX3JlcXVlc3QuCisgKi8KKworc3RydWN0IHNvY2sgKnRjcF9jaGVja19yZXEoc3RydWN0IHNvY2sgKnNrLHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICBzdHJ1Y3Qgb3Blbl9yZXF1ZXN0ICpyZXEsCisJCQkgICBzdHJ1Y3Qgb3Blbl9yZXF1ZXN0ICoqcHJldikKK3sKKwlzdHJ1Y3QgdGNwaGRyICp0aCA9IHNrYi0+aC50aDsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwl1MzIgZmxnID0gdGNwX2ZsYWdfd29yZCh0aCkgJiAoVENQX0ZMQUdfUlNUfFRDUF9GTEFHX1NZTnxUQ1BfRkxBR19BQ0spOworCWludCBwYXdzX3JlamVjdCA9IDA7CisJc3RydWN0IHRjcF9vcHRpb25zX3JlY2VpdmVkIHRtcF9vcHQ7CisJc3RydWN0IHNvY2sgKmNoaWxkOworCisJdG1wX29wdC5zYXdfdHN0YW1wID0gMDsKKwlpZiAodGgtPmRvZmYgPiAoc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpPj4yKSkgeworCQl0Y3BfcGFyc2Vfb3B0aW9ucyhza2IsICZ0bXBfb3B0LCAwKTsKKworCQlpZiAodG1wX29wdC5zYXdfdHN0YW1wKSB7CisJCQl0bXBfb3B0LnRzX3JlY2VudCA9IHJlcS0+dHNfcmVjZW50OworCQkJLyogV2UgZG8gbm90IHN0b3JlIHRydWUgc3RhbXAsIGJ1dCBpdCBpcyBub3QgcmVxdWlyZWQsCisJCQkgKiBpdCBjYW4gYmUgZXN0aW1hdGVkIChhcHByb3hpbWF0ZWx5KQorCQkJICogZnJvbSBhbm90aGVyIGRhdGEuCisJCQkgKi8KKwkJCXRtcF9vcHQudHNfcmVjZW50X3N0YW1wID0geHRpbWUudHZfc2VjIC0gKChUQ1BfVElNRU9VVF9JTklUL0haKTw8cmVxLT5yZXRyYW5zKTsKKwkJCXBhd3NfcmVqZWN0ID0gdGNwX3Bhd3NfY2hlY2soJnRtcF9vcHQsIHRoLT5yc3QpOworCQl9CisJfQorCisJLyogQ2hlY2sgZm9yIHB1cmUgcmV0cmFuc21pdHRlZCBTWU4uICovCisJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+c2VxID09IHJlcS0+cmN2X2lzbiAmJgorCSAgICBmbGcgPT0gVENQX0ZMQUdfU1lOICYmCisJICAgICFwYXdzX3JlamVjdCkgeworCQkvKgorCQkgKiBSRkM3OTMgZHJhd3MgKEluY29ycmVjdGx5ISBJdCB3YXMgZml4ZWQgaW4gUkZDMTEyMikKKwkJICogdGhpcyBjYXNlIG9uIGZpZ3VyZSA2IGFuZCBmaWd1cmUgOCwgYnV0IGZvcm1hbAorCQkgKiBwcm90b2NvbCBkZXNjcmlwdGlvbiBzYXlzIE5PVEhJTkcuCisJCSAqIFRvIGJlIG1vcmUgZXhhY3QsIGl0IHNheXMgdGhhdCB3ZSBzaG91bGQgc2VuZCBBQ0ssCisJCSAqIGJlY2F1c2UgdGhpcyBzZWdtZW50IChhdCBsZWFzdCwgaWYgaXQgaGFzIG5vIGRhdGEpCisJCSAqIGlzIG91dCBvZiB3aW5kb3cuCisJCSAqCisJCSAqICBDT05DTFVTSU9OOiBSRkM3OTMgKGV2ZW4gd2l0aCBSRkMxMTIyKSBET0VTIE5PVAorCQkgKiAgZGVzY3JpYmUgU1lOLVJFQ1Ygc3RhdGUuIEFsbCB0aGUgZGVzY3JpcHRpb24KKwkJICogIGlzIHdyb25nLCB3ZSBjYW5ub3QgYmVsaWV2ZSB0byBpdCBhbmQgc2hvdWxkCisJCSAqICByZWx5IG9ubHkgb24gY29tbW9uIHNlbnNlIGFuZCBpbXBsZW1lbnRhdGlvbgorCQkgKiAgZXhwZXJpZW5jZS4KKwkJICoKKwkJICogRW5mb3JjZSAiU1lOLUFDSyIgYWNjb3JkaW5nIHRvIGZpZ3VyZSA4LCBmaWd1cmUgNgorCQkgKiBvZiBSRkM3OTMsIGZpeGVkIGJ5IFJGQzExMjIuCisJCSAqLworCQlyZXEtPmNsYXNzLT5ydHhfc3luX2FjayhzaywgcmVxLCBOVUxMKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogRnVydGhlciByZXByb2R1Y2VzIHNlY3Rpb24gIlNFR01FTlQgQVJSSVZFUyIKKwkgICBmb3Igc3RhdGUgU1lOLVJFQ0VJVkVEIG9mIFJGQzc5My4KKwkgICBJdCBpcyBicm9rZW4sIGhvd2V2ZXIsIGl0IGRvZXMgbm90IHdvcmsgb25seQorCSAgIHdoZW4gU1lOcyBhcmUgY3Jvc3NlZC4KKworCSAgIFlvdSB3b3VsZCB0aGluayB0aGF0IFNZTiBjcm9zc2luZyBpcyBpbXBvc3NpYmxlIGhlcmUsIHNpbmNlCisJICAgd2Ugc2hvdWxkIGhhdmUgYSBTWU5fU0VOVCBzb2NrZXQgKGZyb20gY29ubmVjdCgpKSBvbiBvdXIgZW5kLAorCSAgIGJ1dCB0aGlzIGlzIG5vdCB0cnVlIGlmIHRoZSBjcm9zc2VkIFNZTnMgd2VyZSBzZW50IHRvIGJvdGgKKwkgICBlbmRzIGJ5IGEgbWFsaWNpb3VzIHRoaXJkIHBhcnR5LiAgV2UgbXVzdCBkZWZlbmQgYWdhaW5zdCB0aGlzLAorCSAgIGFuZCB0byBkbyB0aGF0IHdlIGZpcnN0IHZlcmlmeSB0aGUgQUNLIChhcyBwZXIgUkZDNzkzLCBwYWdlCisJICAgMzYpIGFuZCByZXNldCBpZiBpdCBpcyBpbnZhbGlkLiAgSXMgdGhpcyBhIHRydWUgZnVsbCBkZWZlbnNlPworCSAgIFRvIGNvbnZpbmNlIG91cnNlbHZlcywgbGV0IHVzIGNvbnNpZGVyIGEgd2F5IGluIHdoaWNoIHRoZSBBQ0sKKwkgICB0ZXN0IGNhbiBzdGlsbCBwYXNzIGluIHRoaXMgJ21hbGljaW91cyBjcm9zc2VkIFNZTnMnIGNhc2UuCisJICAgTWFsaWNpb3VzIHNlbmRlciBzZW5kcyBpZGVudGljYWwgU1lOcyAoYW5kIHRodXMgaWRlbnRpY2FsIHNlcXVlbmNlCisJICAgbnVtYmVycykgdG8gYm90aCBBIGFuZCBCOgorCisJCUE6IGdldHMgU1lOLCBzZXE9NworCQlCOiBnZXRzIFNZTiwgc2VxPTcKKworCSAgIEJ5IG91ciBnb29kIGZvcnR1bmUsIGJvdGggQSBhbmQgQiBzZWxlY3QgdGhlIHNhbWUgaW5pdGlhbAorCSAgIHNlbmQgc2VxdWVuY2UgbnVtYmVyIG9mIHNldmVuIDotKQorCisJCUE6IHNlbmRzIFNZTnxBQ0ssIHNlcT03LCBhY2tfc2VxPTgKKwkJQjogc2VuZHMgU1lOfEFDSywgc2VxPTcsIGFja19zZXE9OAorCisJICAgU28gd2UgYXJlIG5vdyBBIGVhdGluZyB0aGlzIFNZTnxBQ0ssIEFDSyB0ZXN0IHBhc3Nlcy4gIFNvCisJICAgZG9lcyBzZXF1ZW5jZSB0ZXN0LCBTWU4gaXMgdHJ1bmNhdGVkLCBhbmQgdGh1cyB3ZSBjb25zaWRlcgorCSAgIGl0IGEgYmFyZSBBQ0suCisKKwkgICBJZiB0cC0+ZGVmZXJfYWNjZXB0LCB3ZSBzaWxlbnRseSBkcm9wIHRoaXMgYmFyZSBBQ0suICBPdGhlcndpc2UsCisJICAgd2UgY3JlYXRlIGFuIGVzdGFibGlzaGVkIGNvbm5lY3Rpb24uICBCb3RoIGVuZHMgKGxpc3RlbmluZyBzb2NrZXRzKQorCSAgIGFjY2VwdCB0aGUgbmV3IGluY29taW5nIGNvbm5lY3Rpb24gYW5kIHRyeSB0byB0YWxrIHRvIGVhY2ggb3RoZXIuIDgtKQorCisJICAgTm90ZTogVGhpcyBjYXNlIGlzIGJvdGggaGFybWxlc3MsIGFuZCByYXJlLiAgUG9zc2liaWxpdHkgaXMgYWJvdXQgdGhlCisJICAgc2FtZSBhcyB1cyBkaXNjb3ZlcmluZyBpbnRlbGxpZ2VudCBsaWZlIG9uIGFub3RoZXIgcGxhbnQgdG9tb3Jyb3cuCisKKwkgICBCdXQgZ2VuZXJhbGx5LCB3ZSBzaG91bGQgKFJGQyBsaWVzISkgdG8gYWNjZXB0IEFDSworCSAgIGZyb20gU1lOQUNLIGJvdGggaGVyZSBhbmQgaW4gdGNwX3Jjdl9zdGF0ZV9wcm9jZXNzKCkuCisJICAgdGNwX3Jjdl9zdGF0ZV9wcm9jZXNzKCkgZG9lcyBub3QsIGhlbmNlLCB3ZSBkbyBub3QgdG9vLgorCisJICAgTm90ZSB0aGF0IHRoZSBjYXNlIGlzIGFic29sdXRlbHkgZ2VuZXJpYzoKKwkgICB3ZSBjYW5ub3Qgb3B0aW1pemUgYW55dGhpbmcgaGVyZSB3aXRob3V0CisJICAgdmlvbGF0aW5nIHByb3RvY29sLiBBbGwgdGhlIGNoZWNrcyBtdXN0IGJlIG1hZGUKKwkgICBiZWZvcmUgYXR0ZW1wdCB0byBjcmVhdGUgc29ja2V0LgorCSAqLworCisJLyogUkZDNzkzIHBhZ2UgMzY6ICJJZiB0aGUgY29ubmVjdGlvbiBpcyBpbiBhbnkgbm9uLXN5bmNocm9uaXplZCBzdGF0ZSAuLi4KKwkgKiAgICAgICAgICAgICAgICAgIGFuZCB0aGUgaW5jb21pbmcgc2VnbWVudCBhY2tub3dsZWRnZXMgc29tZXRoaW5nIG5vdCB5ZXQKKwkgKiAgICAgICAgICAgICAgICAgIHNlbnQgKHRoZSBzZWdtZW50IGNhcnJpZXMgYW4gdW5hY2NhcHRhYmxlIEFDSykgLi4uCisJICogICAgICAgICAgICAgICAgICBhIHJlc2V0IGlzIHNlbnQuIgorCSAqCisJICogSW52YWxpZCBBQ0s6IHJlc2V0IHdpbGwgYmUgc2VudCBieSBsaXN0ZW5pbmcgc29ja2V0CisJICovCisJaWYgKChmbGcgJiBUQ1BfRkxBR19BQ0spICYmCisJICAgIChUQ1BfU0tCX0NCKHNrYiktPmFja19zZXEgIT0gcmVxLT5zbnRfaXNuKzEpKQorCQlyZXR1cm4gc2s7CisKKwkvKiBBbHNvLCBpdCB3b3VsZCBiZSBub3Qgc28gYmFkIGlkZWEgdG8gY2hlY2sgcmN2X3RzZWNyLCB3aGljaAorCSAqIGlzIGVzc2VudGlhbGx5IEFDSyBleHRlbnNpb24gYW5kIHRvbyBlYXJseSBvciB0b28gbGF0ZSB2YWx1ZXMKKwkgKiBzaG91bGQgY2F1c2UgcmVzZXQgaW4gdW5zeW5jaHJvbml6ZWQgc3RhdGVzLgorCSAqLworCisJLyogUkZDNzkzOiAiZmlyc3QgY2hlY2sgc2VxdWVuY2UgbnVtYmVyIi4gKi8KKworCWlmIChwYXdzX3JlamVjdCB8fCAhdGNwX2luX3dpbmRvdyhUQ1BfU0tCX0NCKHNrYiktPnNlcSwgVENQX1NLQl9DQihza2IpLT5lbmRfc2VxLAorCQkJCQkgIHJlcS0+cmN2X2lzbisxLCByZXEtPnJjdl9pc24rMStyZXEtPnJjdl93bmQpKSB7CisJCS8qIE91dCBvZiB3aW5kb3c6IHNlbmQgQUNLIGFuZCBkcm9wLiAqLworCQlpZiAoIShmbGcgJiBUQ1BfRkxBR19SU1QpKQorCQkJcmVxLT5jbGFzcy0+c2VuZF9hY2soc2tiLCByZXEpOworCQlpZiAocGF3c19yZWplY3QpCisJCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9QQVdTRVNUQUJSRUpFQ1RFRCk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIEluIHNlcXVlbmNlLCBQQVdTIGlzIE9LLiAqLworCisJaWYgKHRtcF9vcHQuc2F3X3RzdGFtcCAmJiAhYWZ0ZXIoVENQX1NLQl9DQihza2IpLT5zZXEsIHJlcS0+cmN2X2lzbisxKSkKKwkJCXJlcS0+dHNfcmVjZW50ID0gdG1wX29wdC5yY3ZfdHN2YWw7CisKKwkJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+c2VxID09IHJlcS0+cmN2X2lzbikgeworCQkJLyogVHJ1bmNhdGUgU1lOLCBpdCBpcyBvdXQgb2Ygd2luZG93IHN0YXJ0aW5nCisJCQkgICBhdCByZXEtPnJjdl9pc24rMS4gKi8KKwkJCWZsZyAmPSB+VENQX0ZMQUdfU1lOOworCQl9CisKKwkJLyogUkZDNzkzOiAic2Vjb25kIGNoZWNrIHRoZSBSU1QgYml0IiBhbmQKKwkJICoJICAgImZvdXJ0aCwgY2hlY2sgdGhlIFNZTiBiaXQiCisJCSAqLworCQlpZiAoZmxnICYgKFRDUF9GTEFHX1JTVHxUQ1BfRkxBR19TWU4pKQorCQkJZ290byBlbWJyeW9uaWNfcmVzZXQ7CisKKwkJLyogQUNLIHNlcXVlbmNlIHZlcmlmaWVkIGFib3ZlLCBqdXN0IG1ha2Ugc3VyZSBBQ0sgaXMKKwkJICogc2V0LiAgSWYgQUNLIG5vdCBzZXQsIGp1c3Qgc2lsZW50bHkgZHJvcCB0aGUgcGFja2V0LgorCQkgKi8KKwkJaWYgKCEoZmxnICYgVENQX0ZMQUdfQUNLKSkKKwkJCXJldHVybiBOVUxMOworCisJCS8qIElmIFRDUF9ERUZFUl9BQ0NFUFQgaXMgc2V0LCBkcm9wIGJhcmUgQUNLLiAqLworCQlpZiAodHAtPmRlZmVyX2FjY2VwdCAmJiBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEgPT0gcmVxLT5yY3ZfaXNuKzEpIHsKKwkJCXJlcS0+YWNrZWQgPSAxOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQkvKiBPSywgQUNLIGlzIHZhbGlkLCBjcmVhdGUgYmlnIHNvY2tldCBhbmQKKwkJICogZmVlZCB0aGlzIHNlZ21lbnQgdG8gaXQuIEl0IHdpbGwgcmVwZWF0IGFsbAorCQkgKiB0aGUgdGVzdHMuIFRISVMgU0VHTUVOVCBNVVNUIE1PVkUgU09DS0VUIFRPCisJCSAqIEVTVEFCTElTSEVEIFNUQVRFLiBJZiBpdCB3aWxsIGJlIGRyb3BwZWQgYWZ0ZXIKKwkJICogc29ja2V0IGlzIGNyZWF0ZWQsIHdhaXQgZm9yIHRyb3VibGVzLgorCQkgKi8KKwkJY2hpbGQgPSB0cC0+YWZfc3BlY2lmaWMtPnN5bl9yZWN2X3NvY2soc2ssIHNrYiwgcmVxLCBOVUxMKTsKKwkJaWYgKGNoaWxkID09IE5VTEwpCisJCQlnb3RvIGxpc3Rlbl9vdmVyZmxvdzsKKworCQl0Y3Bfc3lucV91bmxpbmsodHAsIHJlcSwgcHJldik7CisJCXRjcF9zeW5xX3JlbW92ZWQoc2ssIHJlcSk7CisKKwkJdGNwX2FjY2VwdHFfcXVldWUoc2ssIHJlcSwgY2hpbGQpOworCQlyZXR1cm4gY2hpbGQ7CisKKwlsaXN0ZW5fb3ZlcmZsb3c6CisJCWlmICghc3lzY3RsX3RjcF9hYm9ydF9vbl9vdmVyZmxvdykgeworCQkJcmVxLT5hY2tlZCA9IDE7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJZW1icnlvbmljX3Jlc2V0OgorCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9FTUJSWU9OSUNSU1RTKTsKKwkJaWYgKCEoZmxnICYgVENQX0ZMQUdfUlNUKSkKKwkJCXJlcS0+Y2xhc3MtPnNlbmRfcmVzZXQoc2tiKTsKKworCQl0Y3Bfc3lucV9kcm9wKHNrLCByZXEsIHByZXYpOworCQlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFF1ZXVlIHNlZ21lbnQgb24gdGhlIG5ldyBzb2NrZXQgaWYgdGhlIG5ldyBzb2NrZXQgaXMgYWN0aXZlLAorICogb3RoZXJ3aXNlIHdlIGp1c3Qgc2hvcnRjaXJjdWl0IHRoaXMgYW5kIGNvbnRpbnVlIHdpdGgKKyAqIHRoZSBuZXcgc29ja2V0LgorICovCisKK2ludCB0Y3BfY2hpbGRfcHJvY2VzcyhzdHJ1Y3Qgc29jayAqcGFyZW50LCBzdHJ1Y3Qgc29jayAqY2hpbGQsCisJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHJldCA9IDA7CisJaW50IHN0YXRlID0gY2hpbGQtPnNrX3N0YXRlOworCisJaWYgKCFzb2NrX293bmVkX2J5X3VzZXIoY2hpbGQpKSB7CisJCXJldCA9IHRjcF9yY3Zfc3RhdGVfcHJvY2VzcyhjaGlsZCwgc2tiLCBza2ItPmgudGgsIHNrYi0+bGVuKTsKKworCQkvKiBXYWtldXAgcGFyZW50LCBzZW5kIFNJR0lPICovCisJCWlmIChzdGF0ZSA9PSBUQ1BfU1lOX1JFQ1YgJiYgY2hpbGQtPnNrX3N0YXRlICE9IHN0YXRlKQorCQkJcGFyZW50LT5za19kYXRhX3JlYWR5KHBhcmVudCwgMCk7CisJfSBlbHNlIHsKKwkJLyogQWxhcywgaXQgaXMgcG9zc2libGUgYWdhaW4sIGJlY2F1c2Ugd2UgZG8gbG9va3VwCisJCSAqIGluIG1haW4gc29ja2V0IGhhc2ggdGFibGUgYW5kIGxvY2sgb24gbGlzdGVuaW5nCisJCSAqIHNvY2tldCBkb2VzIG5vdCBwcm90ZWN0IHVzIG1vcmUuCisJCSAqLworCQlza19hZGRfYmFja2xvZyhjaGlsZCwgc2tiKTsKKwl9CisKKwliaF91bmxvY2tfc29jayhjaGlsZCk7CisJc29ja19wdXQoY2hpbGQpOworCXJldHVybiByZXQ7Cit9CisKK0VYUE9SVF9TWU1CT0wodGNwX2NoZWNrX3JlcSk7CitFWFBPUlRfU1lNQk9MKHRjcF9jaGlsZF9wcm9jZXNzKTsKK0VYUE9SVF9TWU1CT0wodGNwX2NyZWF0ZV9vcGVucmVxX2NoaWxkKTsKK0VYUE9SVF9TWU1CT0wodGNwX3RpbWV3YWl0X3N0YXRlX3Byb2Nlc3MpOworRVhQT1JUX1NZTUJPTCh0Y3BfdHdfZGVzY2hlZHVsZSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMgYi9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNjMTRjYgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L3RjcF9vdXRwdXQuYwpAQCAtMCwwICsxLDE3MzkgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJSW1wbGVtZW50YXRpb24gb2YgdGhlIFRyYW5zbWlzc2lvbiBDb250cm9sIFByb3RvY29sKFRDUCkuCisgKgorICogVmVyc2lvbjoJJElkOiB0Y3Bfb3V0cHV0LmMsdiAxLjE0NiAyMDAyLzAyLzAxIDIyOjAxOjA0IGRhdmVtIEV4cCAkCisgKgorICogQXV0aG9yczoJUm9zcyBCaXJvLCA8YmlyN0BsZWxhbmQuU3RhbmZvcmQuRWR1PgorICoJCUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoJCU1hcmsgRXZhbnMsIDxldmFuc21wQHVodXJhLmFzdG9uLmFjLnVrPgorICoJCUNvcmV5IE1pbnlhcmQgPHdmLXJjaCFtaW55YXJkQHJlbGF5LkVVLm5ldD4KKyAqCQlGbG9yaWFuIExhIFJvY2hlLCA8ZmxsYUBzdHVkLnVuaS1zYi5kZT4KKyAqCQlDaGFybGVzIEhlZHJpY2ssIDxoZWRyaWNrQGtsaW56aGFpLnJ1dGdlcnMuZWR1PgorICoJCUxpbnVzIFRvcnZhbGRzLCA8dG9ydmFsZHNAY3MuaGVsc2lua2kuZmk+CisgKgkJQWxhbiBDb3gsIDxndzRwdHNAZ3c0cHRzLmFtcHIub3JnPgorICoJCU1hdHRoZXcgRGlsbG9uLCA8ZGlsbG9uQGFwb2xsby53ZXN0Lm9pYy5jb20+CisgKgkJQXJudCBHdWxicmFuZHNlbiwgPGFndWxicmFAbnZnLnVuaXQubm8+CisgKgkJSm9yZ2UgQ3dpaywgPGpvcmdlQGxhc2VyLnNhdGxpbmsubmV0PgorICovCisKKy8qCisgKiBDaGFuZ2VzOglQZWRybyBSb3F1ZQk6CVJldHJhbnNtaXQgcXVldWUgaGFuZGxlZCBieSBUQ1AuCisgKgkJCQk6CUZyYWdtZW50YXRpb24gb24gbXR1IGRlY3JlYXNlCisgKgkJCQk6CVNlZ21lbnQgY29sbGFwc2Ugb24gcmV0cmFuc21pdAorICoJCQkJOglBRiBpbmRlcGVuZGVuY2UKKyAqCisgKgkJTGludXMgVG9ydmFsZHMJOglzZW5kX2RlbGF5ZWRfYWNrCisgKgkJRGF2aWQgUy4gTWlsbGVyCToJQ2hhcmdlIG1lbW9yeSB1c2luZyB0aGUgcmlnaHQgc2tiCisgKgkJCQkJZHVyaW5nIHN5bi9hY2sgcHJvY2Vzc2luZy4KKyAqCQlEYXZpZCBTLiBNaWxsZXIgOglPdXRwdXQgZW5naW5lIGNvbXBsZXRlbHkgcmV3cml0dGVuLgorICoJCUFuZHJlYSBBcmNhbmdlbGk6CVNZTkFDSyBjYXJyeSB0c19yZWNlbnQgaW4gdHNlY3IuCisgKgkJQ2Fjb3Bob25peCBHYXVsIDoJZHJhZnQtbWluc2hhbGwtbmFnbGUtMDEKKyAqCQlKIEhhZGkgU2FsaW0JOglFQ04gc3VwcG9ydAorICoKKyAqLworCisjaW5jbHVkZSA8bmV0L3RjcC5oPgorCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisvKiBQZW9wbGUgY2FuIHR1cm4gdGhpcyBvZmYgZm9yIGJ1Z2d5IFRDUCdzIGZvdW5kIGluIHByaW50ZXJzIGV0Yy4gKi8KK2ludCBzeXNjdGxfdGNwX3JldHJhbnNfY29sbGFwc2UgPSAxOworCisvKiBUaGlzIGxpbWl0cyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgY29uZ2VzdGlvbiB3aW5kb3cgd2hpY2ggd2UKKyAqIHdpbGwgYWxsb3cgYSBzaW5nbGUgVFNPIGZyYW1lIHRvIGNvbnN1bWUuICBCdWlsZGluZyBUU08gZnJhbWVzCisgKiB3aGljaCBhcmUgdG9vIGxhcmdlIGNhbiBjYXVzZSBUQ1Agc3RyZWFtcyB0byBiZSBidXJzdHkuCisgKi8KK2ludCBzeXNjdGxfdGNwX3Rzb193aW5fZGl2aXNvciA9IDg7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfc2VuZF9oZWFkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzay0+c2tfc2VuZF9oZWFkID0gc2tiLT5uZXh0OworCWlmIChzay0+c2tfc2VuZF9oZWFkID09IChzdHJ1Y3Qgc2tfYnVmZiAqKSZzay0+c2tfd3JpdGVfcXVldWUpCisJCXNrLT5za19zZW5kX2hlYWQgPSBOVUxMOworCXRwLT5zbmRfbnh0ID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxOworCXRjcF9wYWNrZXRzX291dF9pbmMoc2ssIHRwLCBza2IpOworfQorCisvKiBTTkQuTlhULCBpZiB3aW5kb3cgd2FzIG5vdCBzaHJ1bmsuCisgKiBJZiB3aW5kb3cgaGFzIGJlZW4gc2hydW5rLCB3aGF0IHNob3VsZCB3ZSBtYWtlPyBJdCBpcyBub3QgY2xlYXIgYXQgYWxsLgorICogVXNpbmcgU05ELlVOQSB3ZSB3aWxsIGZhaWwgdG8gb3BlbiB3aW5kb3csIFNORC5OWFQgaXMgb3V0IG9mIHdpbmRvdy4gOi0oCisgKiBBbnl0aGluZyBpbiBiZXR3ZWVuIFNORC5VTkEuLi5TTkQuVU5BK1NORC5XTkQgYWxzbyBjYW4gYmUgYWxyZWFkeQorICogaW52YWxpZC4gT0ssIGxldCdzIG1ha2UgdGhpcyBmb3Igbm93OgorICovCitzdGF0aWMgaW5saW5lIF9fdTMyIHRjcF9hY2NlcHRhYmxlX3NlcShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJaWYgKCFiZWZvcmUodHAtPnNuZF91bmErdHAtPnNuZF93bmQsIHRwLT5zbmRfbnh0KSkKKwkJcmV0dXJuIHRwLT5zbmRfbnh0OworCWVsc2UKKwkJcmV0dXJuIHRwLT5zbmRfdW5hK3RwLT5zbmRfd25kOworfQorCisvKiBDYWxjdWxhdGUgbXNzIHRvIGFkdmVydGlzZSBpbiBTWU4gc2VnbWVudC4KKyAqIFJGQzExMjIsIFJGQzEwNjMsIGRyYWZ0LWlldGYtdGNwaW1wbC1wbXR1ZC0wMSBzdGF0ZSB0aGF0OgorICoKKyAqIDEuIEl0IGlzIGluZGVwZW5kZW50IG9mIHBhdGggbXR1LgorICogMi4gSWRlYWxseSwgaXQgaXMgbWF4aW1hbCBwb3NzaWJsZSBzZWdtZW50IHNpemUgaS5lLiA2NTUzNS00MC4KKyAqIDMuIEZvciBJUHY0IGl0IGlzIHJlYXNvbmFibGUgdG8gY2FsY3VsYXRlIGl0IGZyb20gbWF4aW1hbCBNVFUgb2YKKyAqICAgIGF0dGFjaGVkIGRldmljZXMsIGJlY2F1c2Ugc29tZSBidWdneSBob3N0cyBhcmUgY29uZnVzZWQgYnkKKyAqICAgIGxhcmdlIE1TUy4KKyAqIDQuIFdlIGRvIG5vdCBtYWtlIDMsIHdlIGFkdmVydGlzZSBNU1MsIGNhbGN1bGF0ZWQgZnJvbSBmaXJzdAorICogICAgaG9wIGRldmljZSBtdHUsIGJ1dCBhbGxvdyB0byByYWlzZSBpdCB0byBpcF9ydF9taW5fYWR2bXNzLgorICogICAgVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB2aWEgaW5mb3JtYXRpb24gc3RvcmVkIGluIHJvdXRpbmcgdGFibGUuCisgKiA1LiBWYWx1ZSA2NTUzNSBmb3IgTVNTIGlzIHZhbGlkIGluIElQdjYgYW5kIG1lYW5zICJhcyBsYXJnZSBhcyBwb3NzaWJsZSwKKyAqICAgIHByb2JhYmx5IGV2ZW4gSnVtYm8iLgorICovCitzdGF0aWMgX191MTYgdGNwX2FkdmVydGlzZV9tc3Moc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IF9fc2tfZHN0X2dldChzayk7CisJaW50IG1zcyA9IHRwLT5hZHZtc3M7CisKKwlpZiAoZHN0ICYmIGRzdF9tZXRyaWMoZHN0LCBSVEFYX0FEVk1TUykgPCBtc3MpIHsKKwkJbXNzID0gZHN0X21ldHJpYyhkc3QsIFJUQVhfQURWTVNTKTsKKwkJdHAtPmFkdm1zcyA9IG1zczsKKwl9CisKKwlyZXR1cm4gKF9fdTE2KW1zczsKK30KKworLyogUkZDMjg2MS4gUmVzZXQgQ1dORCBhZnRlciBpZGxlIHBlcmlvZCBsb25nZXIgUlRPIHRvICJyZXN0YXJ0IHdpbmRvdyIuCisgKiBUaGlzIGlzIHRoZSBmaXJzdCBwYXJ0IG9mIGN3bmQgdmFsaWRhdGlvbiBtZWNoYW5pc20uICovCitzdGF0aWMgdm9pZCB0Y3BfY3duZF9yZXN0YXJ0KHN0cnVjdCB0Y3Bfc29jayAqdHAsIHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKK3sKKwlzMzIgZGVsdGEgPSB0Y3BfdGltZV9zdGFtcCAtIHRwLT5sc25kdGltZTsKKwl1MzIgcmVzdGFydF9jd25kID0gdGNwX2luaXRfY3duZCh0cCwgZHN0KTsKKwl1MzIgY3duZCA9IHRwLT5zbmRfY3duZDsKKworCWlmICh0Y3BfaXNfdmVnYXModHApKSAKKwkJdGNwX3ZlZ2FzX2VuYWJsZSh0cCk7CisKKwl0cC0+c25kX3NzdGhyZXNoID0gdGNwX2N1cnJlbnRfc3N0aHJlc2godHApOworCXJlc3RhcnRfY3duZCA9IG1pbihyZXN0YXJ0X2N3bmQsIGN3bmQpOworCisJd2hpbGUgKChkZWx0YSAtPSB0cC0+cnRvKSA+IDAgJiYgY3duZCA+IHJlc3RhcnRfY3duZCkKKwkJY3duZCA+Pj0gMTsKKwl0cC0+c25kX2N3bmQgPSBtYXgoY3duZCwgcmVzdGFydF9jd25kKTsKKwl0cC0+c25kX2N3bmRfc3RhbXAgPSB0Y3BfdGltZV9zdGFtcDsKKwl0cC0+c25kX2N3bmRfdXNlZCA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfZXZlbnRfZGF0YV9zZW50KHN0cnVjdCB0Y3Bfc29jayAqdHAsCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzb2NrICpzaykKK3sKKwl1MzIgbm93ID0gdGNwX3RpbWVfc3RhbXA7CisKKwlpZiAoIXRwLT5wYWNrZXRzX291dCAmJiAoczMyKShub3cgLSB0cC0+bHNuZHRpbWUpID4gdHAtPnJ0bykKKwkJdGNwX2N3bmRfcmVzdGFydCh0cCwgX19za19kc3RfZ2V0KHNrKSk7CisKKwl0cC0+bHNuZHRpbWUgPSBub3c7CisKKwkvKiBJZiBpdCBpcyBhIHJlcGx5IGZvciBhdG8gYWZ0ZXIgbGFzdCByZWNlaXZlZAorCSAqIHBhY2tldCwgZW50ZXIgcGluZ3BvbmcgbW9kZS4KKwkgKi8KKwlpZiAoKHUzMikobm93IC0gdHAtPmFjay5scmN2dGltZSkgPCB0cC0+YWNrLmF0bykKKwkJdHAtPmFjay5waW5ncG9uZyA9IDE7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgdGNwX2V2ZW50X2Fja19zZW50KHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKworCXRjcF9kZWNfcXVpY2thY2tfbW9kZSh0cCk7CisJdGNwX2NsZWFyX3htaXRfdGltZXIoc2ssIFRDUF9USU1FX0RBQ0spOworfQorCisvKiBEZXRlcm1pbmUgYSB3aW5kb3cgc2NhbGluZyBhbmQgaW5pdGlhbCB3aW5kb3cgdG8gb2ZmZXIuCisgKiBCYXNlZCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBnaXZlbiBhbW91bnQgb2Ygc3BhY2UKKyAqIHdpbGwgYmUgb2ZmZXJlZC4gU3RvcmUgdGhlIHJlc3VsdHMgaW4gdGhlIHRwIHN0cnVjdHVyZS4KKyAqIE5PVEU6IGZvciBzbW9vdGggb3BlcmF0aW9uIGluaXRpYWwgc3BhY2Ugb2ZmZXJpbmcgc2hvdWxkCisgKiBiZSBhIG11bHRpcGxlIG9mIG1zcyBpZiBwb3NzaWJsZS4gV2UgYXNzdW1lIGhlcmUgdGhhdCBtc3MgPj0gMS4KKyAqIFRoaXMgTVVTVCBiZSBlbmZvcmNlZCBieSBhbGwgY2FsbGVycy4KKyAqLwordm9pZCB0Y3Bfc2VsZWN0X2luaXRpYWxfd2luZG93KGludCBfX3NwYWNlLCBfX3UzMiBtc3MsCisJCQkgICAgICAgX191MzIgKnJjdl93bmQsIF9fdTMyICp3aW5kb3dfY2xhbXAsCisJCQkgICAgICAgaW50IHdzY2FsZV9vaywgX191OCAqcmN2X3dzY2FsZSkKK3sKKwl1bnNpZ25lZCBpbnQgc3BhY2UgPSAoX19zcGFjZSA8IDAgPyAwIDogX19zcGFjZSk7CisKKwkvKiBJZiBubyBjbGFtcCBzZXQgdGhlIGNsYW1wIHRvIHRoZSBtYXggcG9zc2libGUgc2NhbGVkIHdpbmRvdyAqLworCWlmICgqd2luZG93X2NsYW1wID09IDApCisJCSgqd2luZG93X2NsYW1wKSA9ICg2NTUzNSA8PCAxNCk7CisJc3BhY2UgPSBtaW4oKndpbmRvd19jbGFtcCwgc3BhY2UpOworCisJLyogUXVhbnRpemUgc3BhY2Ugb2ZmZXJpbmcgdG8gYSBtdWx0aXBsZSBvZiBtc3MgaWYgcG9zc2libGUuICovCisJaWYgKHNwYWNlID4gbXNzKQorCQlzcGFjZSA9IChzcGFjZSAvIG1zcykgKiBtc3M7CisKKwkvKiBOT1RFOiBvZmZlcmluZyBhbiBpbml0aWFsIHdpbmRvdyBsYXJnZXIgdGhhbiAzMjc2NworCSAqIHdpbGwgYnJlYWsgc29tZSBidWdneSBUQ1Agc3RhY2tzLiBXZSB0cnkgdG8gYmUgbmljZS4KKwkgKiBJZiB3ZSBhcmUgbm90IHdpbmRvdyBzY2FsaW5nLCB0aGVuIHRoaXMgdHJ1bmNhdGVzCisJICogb3VyIGluaXRpYWwgd2luZG93IG9mZmVyaW5nIHRvIDMyay4gVGhlcmUgc2hvdWxkIGFsc28KKwkgKiBiZSBhIHN5c2N0bCBvcHRpb24gdG8gc3RvcCBiZWluZyBuaWNlLgorCSAqLworCSgqcmN2X3duZCkgPSBtaW4oc3BhY2UsIE1BWF9UQ1BfV0lORE9XKTsKKwkoKnJjdl93c2NhbGUpID0gMDsKKwlpZiAod3NjYWxlX29rKSB7CisJCS8qIFNldCB3aW5kb3cgc2NhbGluZyBvbiBtYXggcG9zc2libGUgd2luZG93CisJCSAqIFNlZSBSRkMxMzIzIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgbGltaXQgdG8gMTQgCisJCSAqLworCQlzcGFjZSA9IG1heF90KHUzMiwgc3lzY3RsX3RjcF9ybWVtWzJdLCBzeXNjdGxfcm1lbV9tYXgpOworCQl3aGlsZSAoc3BhY2UgPiA2NTUzNSAmJiAoKnJjdl93c2NhbGUpIDwgMTQpIHsKKwkJCXNwYWNlID4+PSAxOworCQkJKCpyY3Zfd3NjYWxlKSsrOworCQl9CisJfQorCisJLyogU2V0IGluaXRpYWwgd2luZG93IHRvIHZhbHVlIGVub3VnaCBmb3Igc2VuZGVycywKKwkgKiBmb2xsb3dpbmcgUkZDMTQxNC4gU2VuZGVycywgbm90IGZvbGxvd2luZyB0aGlzIFJGQywKKwkgKiB3aWxsIGJlIHNhdGlzZmllZCB3aXRoIDIuCisJICovCisJaWYgKG1zcyA+ICgxPDwqcmN2X3dzY2FsZSkpIHsKKwkJaW50IGluaXRfY3duZCA9IDQ7CisJCWlmIChtc3MgPiAxNDYwKjMpCisJCQlpbml0X2N3bmQgPSAyOworCQllbHNlIGlmIChtc3MgPiAxNDYwKQorCQkJaW5pdF9jd25kID0gMzsKKwkJaWYgKCpyY3Zfd25kID4gaW5pdF9jd25kKm1zcykKKwkJCSpyY3Zfd25kID0gaW5pdF9jd25kKm1zczsKKwl9CisKKwkvKiBTZXQgdGhlIGNsYW1wIG5vIGhpZ2hlciB0aGFuIG1heCByZXByZXNlbnRhYmxlIHZhbHVlICovCisJKCp3aW5kb3dfY2xhbXApID0gbWluKDY1NTM1VSA8PCAoKnJjdl93c2NhbGUpLCAqd2luZG93X2NsYW1wKTsKK30KKworLyogQ2hvc2UgYSBuZXcgd2luZG93IHRvIGFkdmVydGlzZSwgdXBkYXRlIHN0YXRlIGluIHRjcF9zb2NrIGZvciB0aGUKKyAqIHNvY2tldCwgYW5kIHJldHVybiByZXN1bHQgd2l0aCBSRkMxMzIzIHNjYWxpbmcgYXBwbGllZC4gIFRoZSByZXR1cm4KKyAqIHZhbHVlIGNhbiBiZSBzdHVmZmVkIGRpcmVjdGx5IGludG8gdGgtPndpbmRvdyBmb3IgYW4gb3V0Z29pbmcKKyAqIGZyYW1lLgorICovCitzdGF0aWMgX19pbmxpbmVfXyB1MTYgdGNwX3NlbGVjdF93aW5kb3coc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXUzMiBjdXJfd2luID0gdGNwX3JlY2VpdmVfd2luZG93KHRwKTsKKwl1MzIgbmV3X3dpbiA9IF9fdGNwX3NlbGVjdF93aW5kb3coc2spOworCisJLyogTmV2ZXIgc2hyaW5rIHRoZSBvZmZlcmVkIHdpbmRvdyAqLworCWlmKG5ld193aW4gPCBjdXJfd2luKSB7CisJCS8qIERhbmdlciBXaWxsIFJvYmluc29uIQorCQkgKiBEb24ndCB1cGRhdGUgcmN2X3d1cC9yY3Zfd25kIGhlcmUgb3IgZWxzZQorCQkgKiB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvIGFkdmVydGlzZSBhIHplcm8KKwkJICogd2luZG93IGluIHRpbWUuICAtLURhdmVNCisJCSAqCisJCSAqIFJlbGF4IFdpbGwgUm9iaW5zb24uCisJCSAqLworCQluZXdfd2luID0gY3VyX3dpbjsKKwl9CisJdHAtPnJjdl93bmQgPSBuZXdfd2luOworCXRwLT5yY3Zfd3VwID0gdHAtPnJjdl9ueHQ7CisKKwkvKiBNYWtlIHN1cmUgd2UgZG8gbm90IGV4Y2VlZCB0aGUgbWF4aW11bSBwb3NzaWJsZQorCSAqIHNjYWxlZCB3aW5kb3cuCisJICovCisJaWYgKCF0cC0+cnhfb3B0LnJjdl93c2NhbGUpCisJCW5ld193aW4gPSBtaW4obmV3X3dpbiwgTUFYX1RDUF9XSU5ET1cpOworCWVsc2UKKwkJbmV3X3dpbiA9IG1pbihuZXdfd2luLCAoNjU1MzVVIDw8IHRwLT5yeF9vcHQucmN2X3dzY2FsZSkpOworCisJLyogUkZDMTMyMyBzY2FsaW5nIGFwcGxpZWQgKi8KKwluZXdfd2luID4+PSB0cC0+cnhfb3B0LnJjdl93c2NhbGU7CisKKwkvKiBJZiB3ZSBhZHZlcnRpc2UgemVybyB3aW5kb3csIGRpc2FibGUgZmFzdCBwYXRoLiAqLworCWlmIChuZXdfd2luID09IDApCisJCXRwLT5wcmVkX2ZsYWdzID0gMDsKKworCXJldHVybiBuZXdfd2luOworfQorCisKKy8qIFRoaXMgcm91dGluZSBhY3R1YWxseSB0cmFuc21pdHMgVENQIHBhY2tldHMgcXVldWVkIGluIGJ5CisgKiB0Y3BfZG9fc2VuZG1zZygpLiAgVGhpcyBpcyB1c2VkIGJ5IGJvdGggdGhlIGluaXRpYWwKKyAqIHRyYW5zbWlzc2lvbiBhbmQgcG9zc2libGUgbGF0ZXIgcmV0cmFuc21pc3Npb25zLgorICogQWxsIFNLQidzIHNlZW4gaGVyZSBhcmUgY29tcGxldGVseSBoZWFkZXJsZXNzLiAgSXQgaXMgb3VyCisgKiBqb2IgdG8gYnVpbGQgdGhlIFRDUCBoZWFkZXIsIGFuZCBwYXNzIHRoZSBwYWNrZXQgZG93biB0bworICogSVAgc28gaXQgY2FuIGRvIHRoZSBzYW1lIHBsdXMgcGFzcyB0aGUgcGFja2V0IG9mZiB0byB0aGUKKyAqIGRldmljZS4KKyAqCisgKiBXZSBhcmUgd29ya2luZyBoZXJlIHdpdGggZWl0aGVyIGEgY2xvbmUgb2YgdGhlIG9yaWdpbmFsCisgKiBTS0IsIG9yIGEgZnJlc2ggdW5pcXVlIGNvcHkgbWFkZSBieSB0aGUgcmV0cmFuc21pdCBlbmdpbmUuCisgKi8KK3N0YXRpYyBpbnQgdGNwX3RyYW5zbWl0X3NrYihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKHNrYiAhPSBOVUxMKSB7CisJCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwkJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJCXN0cnVjdCB0Y3Bfc2tiX2NiICp0Y2IgPSBUQ1BfU0tCX0NCKHNrYik7CisJCWludCB0Y3BfaGVhZGVyX3NpemUgPSB0cC0+dGNwX2hlYWRlcl9sZW47CisJCXN0cnVjdCB0Y3BoZHIgKnRoOworCQlpbnQgc3lzY3RsX2ZsYWdzOworCQlpbnQgZXJyOworCisJCUJVR19PTighdGNwX3NrYl9wY291bnQoc2tiKSk7CisKKyNkZWZpbmUgU1lTQ1RMX0ZMQUdfVFNUQU1QUwkweDEKKyNkZWZpbmUgU1lTQ1RMX0ZMQUdfV1NDQUxFCTB4MgorI2RlZmluZSBTWVNDVExfRkxBR19TQUNLCTB4NAorCisJCXN5c2N0bF9mbGFncyA9IDA7CisJCWlmICh0Y2ItPmZsYWdzICYgVENQQ0JfRkxBR19TWU4pIHsKKwkJCXRjcF9oZWFkZXJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdGNwaGRyKSArIFRDUE9MRU5fTVNTOworCQkJaWYoc3lzY3RsX3RjcF90aW1lc3RhbXBzKSB7CisJCQkJdGNwX2hlYWRlcl9zaXplICs9IFRDUE9MRU5fVFNUQU1QX0FMSUdORUQ7CisJCQkJc3lzY3RsX2ZsYWdzIHw9IFNZU0NUTF9GTEFHX1RTVEFNUFM7CisJCQl9CisJCQlpZihzeXNjdGxfdGNwX3dpbmRvd19zY2FsaW5nKSB7CisJCQkJdGNwX2hlYWRlcl9zaXplICs9IFRDUE9MRU5fV1NDQUxFX0FMSUdORUQ7CisJCQkJc3lzY3RsX2ZsYWdzIHw9IFNZU0NUTF9GTEFHX1dTQ0FMRTsKKwkJCX0KKwkJCWlmKHN5c2N0bF90Y3Bfc2FjaykgeworCQkJCXN5c2N0bF9mbGFncyB8PSBTWVNDVExfRkxBR19TQUNLOworCQkJCWlmKCEoc3lzY3RsX2ZsYWdzICYgU1lTQ1RMX0ZMQUdfVFNUQU1QUykpCisJCQkJCXRjcF9oZWFkZXJfc2l6ZSArPSBUQ1BPTEVOX1NBQ0tQRVJNX0FMSUdORUQ7CisJCQl9CisJCX0gZWxzZSBpZiAodHAtPnJ4X29wdC5lZmZfc2Fja3MpIHsKKwkJCS8qIEEgU0FDSyBpcyAyIHBhZCBieXRlcywgYSAyIGJ5dGUgaGVhZGVyLCBwbHVzCisJCQkgKiAyIDMyLWJpdCBzZXF1ZW5jZSBudW1iZXJzIGZvciBlYWNoIFNBQ0sgYmxvY2suCisJCQkgKi8KKwkJCXRjcF9oZWFkZXJfc2l6ZSArPSAoVENQT0xFTl9TQUNLX0JBU0VfQUxJR05FRCArCisJCQkJCSAgICAodHAtPnJ4X29wdC5lZmZfc2Fja3MgKiBUQ1BPTEVOX1NBQ0tfUEVSQkxPQ0spKTsKKwkJfQorCQkKKwkJLyoKKwkJICogSWYgdGhlIGNvbm5lY3Rpb24gaXMgaWRsZSBhbmQgd2UgYXJlIHJlc3RhcnRpbmcsCisJCSAqIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byBkbyBhbnkgVmVnYXMgY2FsY3VsYXRpb25zCisJCSAqIHVudGlsIHdlIGdldCBmcmVzaCBSVFQgc2FtcGxlcy4gIFNvIHdoZW4gd2UKKwkJICogcmVzdGFydCwgd2UgcmVzZXQgb3VyIFZlZ2FzIHN0YXRlIHRvIGEgY2xlYW4KKwkJICogc2xhdGUuIEFmdGVyIHdlIGdldCBhY2tzIGZvciB0aGlzIGZsaWdodCBvZgorCQkgKiBwYWNrZXRzLCBfdGhlbl8gd2UgY2FuIG1ha2UgVmVnYXMgY2FsY3VsYXRpb25zCisJCSAqIGFnYWluLgorCQkgKi8KKwkJaWYgKHRjcF9pc192ZWdhcyh0cCkgJiYgdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKSA9PSAwKQorCQkJdGNwX3ZlZ2FzX2VuYWJsZSh0cCk7CisKKwkJdGggPSAoc3RydWN0IHRjcGhkciAqKSBza2JfcHVzaChza2IsIHRjcF9oZWFkZXJfc2l6ZSk7CisJCXNrYi0+aC50aCA9IHRoOworCQlza2Jfc2V0X293bmVyX3coc2tiLCBzayk7CisKKwkJLyogQnVpbGQgVENQIGhlYWRlciBhbmQgY2hlY2tzdW0gaXQuICovCisJCXRoLT5zb3VyY2UJCT0gaW5ldC0+c3BvcnQ7CisJCXRoLT5kZXN0CQk9IGluZXQtPmRwb3J0OworCQl0aC0+c2VxCQkJPSBodG9ubCh0Y2ItPnNlcSk7CisJCXRoLT5hY2tfc2VxCQk9IGh0b25sKHRwLT5yY3Zfbnh0KTsKKwkJKigoKF9fdTE2ICopdGgpICsgNikJPSBodG9ucygoKHRjcF9oZWFkZXJfc2l6ZSA+PiAyKSA8PCAxMikgfCB0Y2ItPmZsYWdzKTsKKwkJaWYgKHRjYi0+ZmxhZ3MgJiBUQ1BDQl9GTEFHX1NZTikgeworCQkJLyogUkZDMTMyMzogVGhlIHdpbmRvdyBpbiBTWU4gJiBTWU4vQUNLIHNlZ21lbnRzCisJCQkgKiBpcyBuZXZlciBzY2FsZWQuCisJCQkgKi8KKwkJCXRoLT53aW5kb3cJPSBodG9ucyh0cC0+cmN2X3duZCk7CisJCX0gZWxzZSB7CisJCQl0aC0+d2luZG93CT0gaHRvbnModGNwX3NlbGVjdF93aW5kb3coc2spKTsKKwkJfQorCQl0aC0+Y2hlY2sJCT0gMDsKKwkJdGgtPnVyZ19wdHIJCT0gMDsKKworCQlpZiAodHAtPnVyZ19tb2RlICYmCisJCSAgICBiZXR3ZWVuKHRwLT5zbmRfdXAsIHRjYi0+c2VxKzEsIHRjYi0+c2VxKzB4RkZGRikpIHsKKwkJCXRoLT51cmdfcHRyCQk9IGh0b25zKHRwLT5zbmRfdXAtdGNiLT5zZXEpOworCQkJdGgtPnVyZwkJCT0gMTsKKwkJfQorCisJCWlmICh0Y2ItPmZsYWdzICYgVENQQ0JfRkxBR19TWU4pIHsKKwkJCXRjcF9zeW5fYnVpbGRfb3B0aW9ucygoX191MzIgKikodGggKyAxKSwKKwkJCQkJICAgICAgdGNwX2FkdmVydGlzZV9tc3Moc2spLAorCQkJCQkgICAgICAoc3lzY3RsX2ZsYWdzICYgU1lTQ1RMX0ZMQUdfVFNUQU1QUyksCisJCQkJCSAgICAgIChzeXNjdGxfZmxhZ3MgJiBTWVNDVExfRkxBR19TQUNLKSwKKwkJCQkJICAgICAgKHN5c2N0bF9mbGFncyAmIFNZU0NUTF9GTEFHX1dTQ0FMRSksCisJCQkJCSAgICAgIHRwLT5yeF9vcHQucmN2X3dzY2FsZSwKKwkJCQkJICAgICAgdGNiLT53aGVuLAorCQkgICAgICAJCQkgICAgICB0cC0+cnhfb3B0LnRzX3JlY2VudCk7CisJCX0gZWxzZSB7CisJCQl0Y3BfYnVpbGRfYW5kX3VwZGF0ZV9vcHRpb25zKChfX3UzMiAqKSh0aCArIDEpLAorCQkJCQkJICAgICB0cCwgdGNiLT53aGVuKTsKKworCQkJVENQX0VDTl9zZW5kKHNrLCB0cCwgc2tiLCB0Y3BfaGVhZGVyX3NpemUpOworCQl9CisJCXRwLT5hZl9zcGVjaWZpYy0+c2VuZF9jaGVjayhzaywgdGgsIHNrYi0+bGVuLCBza2IpOworCisJCWlmICh0Y2ItPmZsYWdzICYgVENQQ0JfRkxBR19BQ0spCisJCQl0Y3BfZXZlbnRfYWNrX3NlbnQoc2spOworCisJCWlmIChza2ItPmxlbiAhPSB0Y3BfaGVhZGVyX3NpemUpCisJCQl0Y3BfZXZlbnRfZGF0YV9zZW50KHRwLCBza2IsIHNrKTsKKworCQlUQ1BfSU5DX1NUQVRTKFRDUF9NSUJfT1VUU0VHUyk7CisKKwkJZXJyID0gdHAtPmFmX3NwZWNpZmljLT5xdWV1ZV94bWl0KHNrYiwgMCk7CisJCWlmIChlcnIgPD0gMCkKKwkJCXJldHVybiBlcnI7CisKKwkJdGNwX2VudGVyX2N3cih0cCk7CisKKwkJLyogTkVUX1hNSVRfQ04gaXMgc3BlY2lhbC4gSXQgZG9lcyBub3QgZ3VhcmFudGVlLAorCQkgKiB0aGF0IHRoaXMgcGFja2V0IGlzIGxvc3QuIEl0IHRlbGxzIHRoYXQgZGV2aWNlCisJCSAqIGlzIGFib3V0IHRvIHN0YXJ0IHRvIGRyb3AgcGFja2V0cyBvciBhbHJlYWR5CisJCSAqIGRyb3BzIHNvbWUgcGFja2V0cyBvZiB0aGUgc2FtZSBwcmlvcml0eSBhbmQKKwkJICogaW52b2tlcyB1cyB0byBzZW5kIGxlc3MgYWdncmVzc2l2ZWx5LgorCQkgKi8KKwkJcmV0dXJuIGVyciA9PSBORVRfWE1JVF9DTiA/IDAgOiBlcnI7CisJfQorCXJldHVybiAtRU5PQlVGUzsKKyN1bmRlZiBTWVNDVExfRkxBR19UU1RBTVBTCisjdW5kZWYgU1lTQ1RMX0ZMQUdfV1NDQUxFCisjdW5kZWYgU1lTQ1RMX0ZMQUdfU0FDSworfQorCisKKy8qIFRoaXMgcm91dGluZSBqdXN0IHF1ZXVlJ3MgdGhlIGJ1ZmZlciAKKyAqCisgKiBOT1RFOiBwcm9iZTAgdGltZXIgaXMgbm90IGNoZWNrZWQsIGRvIG5vdCBmb3JnZXQgdGNwX3B1c2hfcGVuZGluZ19mcmFtZXMsCisgKiBvdGhlcndpc2Ugc29ja2V0IGNhbiBzdGFsbC4KKyAqLworc3RhdGljIHZvaWQgdGNwX3F1ZXVlX3NrYihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisKKwkvKiBBZHZhbmNlIHdyaXRlX3NlcSBhbmQgcGxhY2Ugb250byB0aGUgd3JpdGVfcXVldWUuICovCisJdHAtPndyaXRlX3NlcSA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKKwlza2JfaGVhZGVyX3JlbGVhc2Uoc2tiKTsKKwlfX3NrYl9xdWV1ZV90YWlsKCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYik7CisJc2tfY2hhcmdlX3NrYihzaywgc2tiKTsKKworCS8qIFF1ZXVlIGl0LCByZW1lbWJlcmluZyB3aGVyZSB3ZSBtdXN0IHN0YXJ0IHNlbmRpbmcuICovCisJaWYgKHNrLT5za19zZW5kX2hlYWQgPT0gTlVMTCkKKwkJc2stPnNrX3NlbmRfaGVhZCA9IHNrYjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjcF90c29fc2V0X3B1c2goc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKiBGb3JjZSBwdXNoIHRvIGJlIG9uIGZvciBhbnkgVFNPIGZyYW1lcyB0byB3b3JrYXJvdW5kCisJICogcHJvYmxlbXMgd2l0aCBidXN0ZWQgaW1wbGVtZW50YXRpb25zIGxpa2UgTWFjIE9TLVggdGhhdAorCSAqIGhvbGQgb2ZmIHNvY2tldCByZWNlaXZlIHdha2V1cHMgdW50aWwgcHVzaCBpcyBzZWVuLgorCSAqLworCWlmICh0Y3Bfc2tiX3Bjb3VudChza2IpID4gMSkKKwkJVENQX1NLQl9DQihza2IpLT5mbGFncyB8PSBUQ1BDQl9GTEFHX1BTSDsKK30KKworLyogU2VuZCBfc2luZ2xlXyBza2Igc2l0dGluZyBhdCB0aGUgc2VuZCBoZWFkLiBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzCisgKiB0cnVlIHB1c2ggcGVuZGluZyBmcmFtZXMgdG8gc2V0dXAgcHJvYmUgdGltZXIgZXRjLgorICovCit2b2lkIHRjcF9wdXNoX29uZShzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGN1cl9tc3MpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrLT5za19zZW5kX2hlYWQ7CisKKwlpZiAodGNwX3NuZF90ZXN0KHRwLCBza2IsIGN1cl9tc3MsIFRDUF9OQUdMRV9QVVNIKSkgeworCQkvKiBTZW5kIGl0IG91dCBub3cuICovCisJCVRDUF9TS0JfQ0Ioc2tiKS0+d2hlbiA9IHRjcF90aW1lX3N0YW1wOworCQl0Y3BfdHNvX3NldF9wdXNoKHNrYik7CisJCWlmICghdGNwX3RyYW5zbWl0X3NrYihzaywgc2tiX2Nsb25lKHNrYiwgc2stPnNrX2FsbG9jYXRpb24pKSkgeworCQkJc2stPnNrX3NlbmRfaGVhZCA9IE5VTEw7CisJCQl0cC0+c25kX254dCA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKKwkJCXRjcF9wYWNrZXRzX291dF9pbmMoc2ssIHRwLCBza2IpOworCQkJcmV0dXJuOworCQl9CisJfQorfQorCit2b2lkIHRjcF9zZXRfc2tiX3Rzb19zZWdzKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBtc3Nfc3RkKQoreworCWlmIChza2ItPmxlbiA8PSBtc3Nfc3RkKSB7CisJCS8qIEF2b2lkIHRoZSBjb3N0bHkgZGl2aWRlIGluIHRoZSBub3JtYWwKKwkJICogbm9uLVRTTyBjYXNlLgorCQkgKi8KKwkJc2tiX3NoaW5mbyhza2IpLT50c29fc2VncyA9IDE7CisJCXNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemUgPSAwOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGludCBmYWN0b3I7CisKKwkJZmFjdG9yID0gc2tiLT5sZW4gKyAobXNzX3N0ZCAtIDEpOworCQlmYWN0b3IgLz0gbXNzX3N0ZDsKKwkJc2tiX3NoaW5mbyhza2IpLT50c29fc2VncyA9IGZhY3RvcjsKKwkJc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZSA9IG1zc19zdGQ7CisJfQorfQorCisvKiBGdW5jdGlvbiB0byBjcmVhdGUgdHdvIG5ldyBUQ1Agc2VnbWVudHMuICBTaHJpbmtzIHRoZSBnaXZlbiBzZWdtZW50CisgKiB0byB0aGUgc3BlY2lmaWVkIHNpemUgYW5kIGFwcGVuZHMgYSBuZXcgc2VnbWVudCB3aXRoIHRoZSByZXN0IG9mIHRoZQorICogcGFja2V0IHRvIHRoZSBsaXN0LiAgVGhpcyB3b24ndCBiZSBjYWxsZWQgZnJlcXVlbnRseSwgSSBob3BlLiAKKyAqIFJlbWVtYmVyLCB0aGVzZSBhcmUgc3RpbGwgaGVhZGVybGVzcyBTS0JzIGF0IHRoaXMgcG9pbnQuCisgKi8KK3N0YXRpYyBpbnQgdGNwX2ZyYWdtZW50KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGxlbikKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmZjsKKwlpbnQgbnNpemU7CisJdTE2IGZsYWdzOworCisJbnNpemUgPSBza2JfaGVhZGxlbihza2IpIC0gbGVuOworCWlmIChuc2l6ZSA8IDApCisJCW5zaXplID0gMDsKKworCWlmIChza2JfY2xvbmVkKHNrYikgJiYKKwkgICAgc2tiX2lzX25vbmxpbmVhcihza2IpICYmCisJICAgIHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCAwLCBHRlBfQVRPTUlDKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBHZXQgYSBuZXcgc2tiLi4uIGZvcmNlIGZsYWcgb24uICovCisJYnVmZiA9IHNrX3N0cmVhbV9hbGxvY19za2Ioc2ssIG5zaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoYnVmZiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsgLyogV2UnbGwganVzdCB0cnkgYWdhaW4gbGF0ZXIuICovCisJc2tfY2hhcmdlX3NrYihzaywgYnVmZik7CisKKwkvKiBDb3JyZWN0IHRoZSBzZXF1ZW5jZSBudW1iZXJzLiAqLworCVRDUF9TS0JfQ0IoYnVmZiktPnNlcSA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxICsgbGVuOworCVRDUF9TS0JfQ0IoYnVmZiktPmVuZF9zZXEgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7CisJVENQX1NLQl9DQihza2IpLT5lbmRfc2VxID0gVENQX1NLQl9DQihidWZmKS0+c2VxOworCisJLyogUFNIIGFuZCBGSU4gc2hvdWxkIG9ubHkgYmUgc2V0IGluIHRoZSBzZWNvbmQgcGFja2V0LiAqLworCWZsYWdzID0gVENQX1NLQl9DQihza2IpLT5mbGFnczsKKwlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzID0gZmxhZ3MgJiB+KFRDUENCX0ZMQUdfRklOfFRDUENCX0ZMQUdfUFNIKTsKKwlUQ1BfU0tCX0NCKGJ1ZmYpLT5mbGFncyA9IGZsYWdzOworCVRDUF9TS0JfQ0IoYnVmZiktPnNhY2tlZCA9CisJCShUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmCisJCSAoVENQQ0JfTE9TVCB8IFRDUENCX0VWRVJfUkVUUkFOUyB8IFRDUENCX0FUX1RBSUwpKTsKKwlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmPSB+VENQQ0JfQVRfVEFJTDsKKworCWlmICghc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyAmJiBza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9IVykgeworCQkvKiBDb3B5IGFuZCBjaGVja3N1bSBkYXRhIHRhaWwgaW50byB0aGUgbmV3IGJ1ZmZlci4gKi8KKwkJYnVmZi0+Y3N1bSA9IGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soc2tiLT5kYXRhICsgbGVuLCBza2JfcHV0KGJ1ZmYsIG5zaXplKSwKKwkJCQkJCSAgICAgICBuc2l6ZSwgMCk7CisKKwkJc2tiX3RyaW0oc2tiLCBsZW4pOworCisJCXNrYi0+Y3N1bSA9IGNzdW1fYmxvY2tfc3ViKHNrYi0+Y3N1bSwgYnVmZi0+Y3N1bSwgbGVuKTsKKwl9IGVsc2UgeworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0hXOworCQlza2Jfc3BsaXQoc2tiLCBidWZmLCBsZW4pOworCX0KKworCWJ1ZmYtPmlwX3N1bW1lZCA9IHNrYi0+aXBfc3VtbWVkOworCisJLyogTG9va3Mgc3R1cGlkLCBidXQgb3VyIGNvZGUgcmVhbGx5IHVzZXMgd2hlbiBvZgorCSAqIHNrYnMsIHdoaWNoIGl0IG5ldmVyIHNlbnQgYmVmb3JlLiAtLUFOSworCSAqLworCVRDUF9TS0JfQ0IoYnVmZiktPndoZW4gPSBUQ1BfU0tCX0NCKHNrYiktPndoZW47CisKKwlpZiAoVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJiBUQ1BDQl9MT1NUKSB7CisJCXRwLT5sb3N0X291dCAtPSB0Y3Bfc2tiX3Bjb3VudChza2IpOworCQl0cC0+bGVmdF9vdXQgLT0gdGNwX3NrYl9wY291bnQoc2tiKTsKKwl9CisKKwkvKiBGaXggdXAgdHNvX2ZhY3RvciBmb3IgYm90aCBvcmlnaW5hbCBhbmQgbmV3IFNLQi4gICovCisJdGNwX3NldF9za2JfdHNvX3NlZ3Moc2tiLCB0cC0+bXNzX2NhY2hlX3N0ZCk7CisJdGNwX3NldF9za2JfdHNvX3NlZ3MoYnVmZiwgdHAtPm1zc19jYWNoZV9zdGQpOworCisJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkICYgVENQQ0JfTE9TVCkgeworCQl0cC0+bG9zdF9vdXQgKz0gdGNwX3NrYl9wY291bnQoc2tiKTsKKwkJdHAtPmxlZnRfb3V0ICs9IHRjcF9za2JfcGNvdW50KHNrYik7CisJfQorCisJaWYgKFRDUF9TS0JfQ0IoYnVmZiktPnNhY2tlZCZUQ1BDQl9MT1NUKSB7CisJCXRwLT5sb3N0X291dCArPSB0Y3Bfc2tiX3Bjb3VudChidWZmKTsKKwkJdHAtPmxlZnRfb3V0ICs9IHRjcF9za2JfcGNvdW50KGJ1ZmYpOworCX0KKworCS8qIExpbmsgQlVGRiBpbnRvIHRoZSBzZW5kIHF1ZXVlLiAqLworCV9fc2tiX2FwcGVuZChza2IsIGJ1ZmYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgaXMgc2ltaWxhciB0byBfX3Bza2JfcHVsbF9oZWFkKCkgKGl0IHdpbGwgZ28gdG8gY29yZS9za2J1ZmYuYworICogZXZlbnR1YWxseSkuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgcHVsbGVkIGRhdGEgbm90IGNvcGllZCwgYnV0CisgKiBpbW1lZGlhdGVseSBkaXNjYXJkZWQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpfX3Bza2JfdHJpbV9oZWFkKHN0cnVjdCBza19idWZmICpza2IsIGludCBsZW4pCit7CisJaW50IGksIGssIGVhdDsKKworCWVhdCA9IGxlbjsKKwlrID0gMDsKKwlmb3IgKGk9MDsgaTxza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBpKyspIHsKKwkJaWYgKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZSA8PSBlYXQpIHsKKwkJCXB1dF9wYWdlKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZSk7CisJCQllYXQgLT0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOworCQl9IGVsc2UgeworCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1trXSA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisJCQlpZiAoZWF0KSB7CisJCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1trXS5wYWdlX29mZnNldCArPSBlYXQ7CisJCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1trXS5zaXplIC09IGVhdDsKKwkJCQllYXQgPSAwOworCQkJfQorCQkJaysrOworCQl9CisJfQorCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPSBrOworCisJc2tiLT50YWlsID0gc2tiLT5kYXRhOworCXNrYi0+ZGF0YV9sZW4gLT0gbGVuOworCXNrYi0+bGVuID0gc2tiLT5kYXRhX2xlbjsKKwlyZXR1cm4gc2tiLT50YWlsOworfQorCitpbnQgdGNwX3RyaW1faGVhZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIHUzMiBsZW4pCit7CisJaWYgKHNrYl9jbG9uZWQoc2tiKSAmJgorCSAgICBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgMCwgR0ZQX0FUT01JQykpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGxlbiA8PSBza2JfaGVhZGxlbihza2IpKSB7CisJCV9fc2tiX3B1bGwoc2tiLCBsZW4pOworCX0gZWxzZSB7CisJCWlmIChfX3Bza2JfdHJpbV9oZWFkKHNrYiwgbGVuLXNrYl9oZWFkbGVuKHNrYikpID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlUQ1BfU0tCX0NCKHNrYiktPnNlcSArPSBsZW47CisJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9IVzsKKworCXNrYi0+dHJ1ZXNpemUJICAgICAtPSBsZW47CisJc2stPnNrX3dtZW1fcXVldWVkICAgLT0gbGVuOworCXNrLT5za19mb3J3YXJkX2FsbG9jICs9IGxlbjsKKwlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX1FVRVVFX1NIUlVOSyk7CisKKwkvKiBBbnkgY2hhbmdlIG9mIHNrYi0+bGVuIHJlcXVpcmVzIHJlY2FsY3VsYXRpb24gb2YgdHNvCisJICogZmFjdG9yIGFuZCBtc3MuCisJICovCisJaWYgKHRjcF9za2JfcGNvdW50KHNrYikgPiAxKQorCQl0Y3Bfc2V0X3NrYl90c29fc2Vncyhza2IsIHRjcF9za2JfbXNzKHNrYikpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gc3luY2hyb25pemUgc25kIG1zcyB0byBjdXJyZW50IHBtdHUvZXh0aGRyIHNldC4KKworICAgdHAtPnJ4X29wdC51c2VyX21zcyBpcyBtc3Mgc2V0IGJ5IHVzZXIgYnkgVENQX01BWFNFRy4gSXQgZG9lcyBOT1QgY291bnRzCisgICBmb3IgVENQIG9wdGlvbnMsIGJ1dCBpbmNsdWRlcyBvbmx5IGJhcmUgVENQIGhlYWRlci4KKworICAgdHAtPnJ4X29wdC5tc3NfY2xhbXAgaXMgbXNzIG5lZ290aWF0ZWQgYXQgY29ubmVjdGlvbiBzZXR1cC4KKyAgIEl0IGlzIG1pbnVtdW0gb2YgdXNlcl9tc3MgYW5kIG1zcyByZWNlaXZlZCB3aXRoIFNZTi4KKyAgIEl0IGFsc28gZG9lcyBub3QgaW5jbHVkZSBUQ1Agb3B0aW9ucy4KKworICAgdHAtPnBtdHVfY29va2llIGlzIGxhc3QgcG10dSwgc2VlbiBieSB0aGlzIGZ1bmN0aW9uLgorCisgICB0cC0+bXNzX2NhY2hlIGlzIGN1cnJlbnQgZWZmZWN0aXZlIHNlbmRpbmcgbXNzLCBpbmNsdWRpbmcKKyAgIGFsbCB0Y3Agb3B0aW9ucyBleGNlcHQgZm9yIFNBQ0tzLiBJdCBpcyBldmFsdWF0ZWQsCisgICB0YWtpbmcgaW50byBhY2NvdW50IGN1cnJlbnQgcG10dSwgYnV0IG5ldmVyIGV4Y2VlZHMKKyAgIHRwLT5yeF9vcHQubXNzX2NsYW1wLgorCisgICBOT1RFMS4gcmZjMTEyMiBjbGVhcmx5IHN0YXRlcyB0aGF0IGFkdmVydGlzZWQgTVNTCisgICBET0VTIE5PVCBpbmNsdWRlIGVpdGhlciB0Y3Agb3IgaXAgb3B0aW9ucy4KKworICAgTk9URTIuIHRwLT5wbXR1X2Nvb2tpZSBhbmQgdHAtPm1zc19jYWNoZSBhcmUgUkVBRCBPTkxZIG91dHNpZGUKKyAgIHRoaXMgZnVuY3Rpb24uCQkJLS1BTksgKDk4MDczMSkKKyAqLworCit1bnNpZ25lZCBpbnQgdGNwX3N5bmNfbXNzKHN0cnVjdCBzb2NrICpzaywgdTMyIHBtdHUpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJaW50IG1zc19ub3c7CisKKwkvKiBDYWxjdWxhdGUgYmFzZSBtc3Mgd2l0aG91dCBUQ1Agb3B0aW9uczoKKwkgICBJdCBpcyBNTVNfUyAtIHNpemVvZih0Y3BoZHIpIG9mIHJmYzExMjIKKwkgKi8KKwltc3Nfbm93ID0gcG10dSAtIHRwLT5hZl9zcGVjaWZpYy0+bmV0X2hlYWRlcl9sZW4gLSBzaXplb2Yoc3RydWN0IHRjcGhkcik7CisKKwkvKiBDbGFtcCBpdCAobXNzX2NsYW1wIGRvZXMgbm90IGluY2x1ZGUgdGNwIG9wdGlvbnMpICovCisJaWYgKG1zc19ub3cgPiB0cC0+cnhfb3B0Lm1zc19jbGFtcCkKKwkJbXNzX25vdyA9IHRwLT5yeF9vcHQubXNzX2NsYW1wOworCisJLyogTm93IHN1YnRyYWN0IG9wdGlvbmFsIHRyYW5zcG9ydCBvdmVyaGVhZCAqLworCW1zc19ub3cgLT0gdHAtPmV4dF9oZWFkZXJfbGVuOworCisJLyogVGhlbiByZXNlcnZlIHJvb20gZm9yIGZ1bGwgc2V0IG9mIFRDUCBvcHRpb25zIGFuZCA4IGJ5dGVzIG9mIGRhdGEgKi8KKwlpZiAobXNzX25vdyA8IDQ4KQorCQltc3Nfbm93ID0gNDg7CisKKwkvKiBOb3cgc3VidHJhY3QgVENQIG9wdGlvbnMgc2l6ZSwgbm90IGluY2x1ZGluZyBTQUNLcyAqLworCW1zc19ub3cgLT0gdHAtPnRjcF9oZWFkZXJfbGVuIC0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOworCisJLyogQm91bmQgbXNzIHdpdGggaGFsZiBvZiB3aW5kb3cgKi8KKwlpZiAodHAtPm1heF93aW5kb3cgJiYgbXNzX25vdyA+ICh0cC0+bWF4X3dpbmRvdz4+MSkpCisJCW1zc19ub3cgPSBtYXgoKHRwLT5tYXhfd2luZG93Pj4xKSwgNjhVIC0gdHAtPnRjcF9oZWFkZXJfbGVuKTsKKworCS8qIEFuZCBzdG9yZSBjYWNoZWQgcmVzdWx0cyAqLworCXRwLT5wbXR1X2Nvb2tpZSA9IHBtdHU7CisJdHAtPm1zc19jYWNoZSA9IHRwLT5tc3NfY2FjaGVfc3RkID0gbXNzX25vdzsKKworCXJldHVybiBtc3Nfbm93OworfQorCisvKiBDb21wdXRlIHRoZSBjdXJyZW50IGVmZmVjdGl2ZSBNU1MsIHRha2luZyBTQUNLcyBhbmQgSVAgb3B0aW9ucywKKyAqIGFuZCBldmVuIFBNVFUgZGlzY292ZXJ5IGV2ZW50cyBpbnRvIGFjY291bnQuCisgKgorICogTEFSR0VTRU5EIG5vdGU6ICF1cmdfbW9kZSBpcyBvdmVya2lsbCwgb25seSBmcmFtZXMgdXAgdG8gc25kX3VwCisgKiBjYW5ub3QgYmUgbGFyZ2UuIEhvd2V2ZXIsIHRha2luZyBpbnRvIGFjY291bnQgcmFyZSB1c2Ugb2YgVVJHLCB0aGlzCisgKiBpcyBub3QgYSBiaWcgZmxhdy4KKyAqLworCit1bnNpZ25lZCBpbnQgdGNwX2N1cnJlbnRfbXNzKHN0cnVjdCBzb2NrICpzaywgaW50IGxhcmdlKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IF9fc2tfZHN0X2dldChzayk7CisJdW5zaWduZWQgaW50IGRvX2xhcmdlLCBtc3Nfbm93OworCisJbXNzX25vdyA9IHRwLT5tc3NfY2FjaGVfc3RkOworCWlmIChkc3QpIHsKKwkJdTMyIG10dSA9IGRzdF9tdHUoZHN0KTsKKwkJaWYgKG10dSAhPSB0cC0+cG10dV9jb29raWUpCisJCQltc3Nfbm93ID0gdGNwX3N5bmNfbXNzKHNrLCBtdHUpOworCX0KKworCWRvX2xhcmdlID0gKGxhcmdlICYmCisJCSAgICAoc2stPnNrX3JvdXRlX2NhcHMgJiBORVRJRl9GX1RTTykgJiYKKwkJICAgICF0cC0+dXJnX21vZGUpOworCisJaWYgKGRvX2xhcmdlKSB7CisJCXVuc2lnbmVkIGludCBsYXJnZV9tc3MsIGZhY3RvciwgbGltaXQ7CisKKwkJbGFyZ2VfbXNzID0gNjU1MzUgLSB0cC0+YWZfc3BlY2lmaWMtPm5ldF9oZWFkZXJfbGVuIC0KKwkJCXRwLT5leHRfaGVhZGVyX2xlbiAtIHRwLT50Y3BfaGVhZGVyX2xlbjsKKworCQlpZiAodHAtPm1heF93aW5kb3cgJiYgbGFyZ2VfbXNzID4gKHRwLT5tYXhfd2luZG93Pj4xKSkKKwkJCWxhcmdlX21zcyA9IG1heCgodHAtPm1heF93aW5kb3c+PjEpLAorCQkJCQk2OFUgLSB0cC0+dGNwX2hlYWRlcl9sZW4pOworCisJCWZhY3RvciA9IGxhcmdlX21zcyAvIG1zc19ub3c7CisKKwkJLyogQWx3YXlzIGtlZXAgbGFyZ2UgbXNzIG11bHRpcGxlIG9mIHJlYWwgbXNzLCBidXQKKwkJICogZG8gbm90IGV4Y2VlZCAxL3Rzb193aW5fZGl2aXNvciBvZiB0aGUgY29uZ2VzdGlvbiB3aW5kb3cKKwkJICogc28gd2UgY2FuIGtlZXAgdGhlIEFDSyBjbG9jayB0aWNraW5nIGFuZCBtaW5pbWl6ZQorCQkgKiBidXJzdGluZy4KKwkJICovCisJCWxpbWl0ID0gdHAtPnNuZF9jd25kOworCQlpZiAoc3lzY3RsX3RjcF90c29fd2luX2Rpdmlzb3IpCisJCQlsaW1pdCAvPSBzeXNjdGxfdGNwX3Rzb193aW5fZGl2aXNvcjsKKwkJbGltaXQgPSBtYXgoMVUsIGxpbWl0KTsKKwkJaWYgKGZhY3RvciA+IGxpbWl0KQorCQkJZmFjdG9yID0gbGltaXQ7CisKKwkJdHAtPm1zc19jYWNoZSA9IG1zc19ub3cgKiBmYWN0b3I7CisKKwkJbXNzX25vdyA9IHRwLT5tc3NfY2FjaGU7CisJfQorCisJaWYgKHRwLT5yeF9vcHQuZWZmX3NhY2tzKQorCQltc3Nfbm93IC09IChUQ1BPTEVOX1NBQ0tfQkFTRV9BTElHTkVEICsKKwkJCSAgICAodHAtPnJ4X29wdC5lZmZfc2Fja3MgKiBUQ1BPTEVOX1NBQ0tfUEVSQkxPQ0spKTsKKwlyZXR1cm4gbXNzX25vdzsKK30KKworLyogVGhpcyByb3V0aW5lIHdyaXRlcyBwYWNrZXRzIHRvIHRoZSBuZXR3b3JrLiAgSXQgYWR2YW5jZXMgdGhlCisgKiBzZW5kX2hlYWQuICBUaGlzIGhhcHBlbnMgYXMgaW5jb21pbmcgYWNrcyBvcGVuIHVwIHRoZSByZW1vdGUKKyAqIHdpbmRvdyBmb3IgdXMuCisgKgorICogUmV0dXJucyAxLCBpZiBubyBzZWdtZW50cyBhcmUgaW4gZmxpZ2h0IGFuZCB3ZSBoYXZlIHF1ZXVlZCBzZWdtZW50cywgYnV0CisgKiBjYW5ub3Qgc2VuZCBhbnl0aGluZyBub3cgYmVjYXVzZSBvZiBTV1Mgb3IgYW5vdGhlciBwcm9ibGVtLgorICovCitpbnQgdGNwX3dyaXRlX3htaXQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbm9uYWdsZSkKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwl1bnNpZ25lZCBpbnQgbXNzX25vdzsKKworCS8qIElmIHdlIGFyZSBjbG9zZWQsIHRoZSBieXRlcyB3aWxsIGhhdmUgdG8gcmVtYWluIGhlcmUuCisJICogSW4gdGltZSBjbG9zZWRvd24gd2lsbCBmaW5pc2gsIHdlIGVtcHR5IHRoZSB3cml0ZSBxdWV1ZSBhbmQgYWxsCisJICogd2lsbCBiZSBoYXBweS4KKwkgKi8KKwlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9DTE9TRSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlpbnQgc2VudF9wa3RzID0gMDsKKworCQkvKiBBY2NvdW50IGZvciBTQUNLUywgd2UgbWF5IG5lZWQgdG8gZnJhZ21lbnQgZHVlIHRvIHRoaXMuCisJCSAqIEl0IGlzIGp1c3QgbGlrZSB0aGUgcmVhbCBNU1MgY2hhbmdpbmcgb24gdXMgbWlkc3RyZWFtLgorCQkgKiBXZSBhbHNvIGhhbmRsZSB0aGluZ3MgY29ycmVjdGx5IHdoZW4gdGhlIHVzZXIgYWRkcyBzb21lCisJCSAqIElQIG9wdGlvbnMgbWlkLXN0cmVhbS4gIFNpbGx5IHRvIGRvLCBidXQgY292ZXIgaXQuCisJCSAqLworCQltc3Nfbm93ID0gdGNwX2N1cnJlbnRfbXNzKHNrLCAxKTsKKworCQl3aGlsZSAoKHNrYiA9IHNrLT5za19zZW5kX2hlYWQpICYmCisJCSAgICAgICB0Y3Bfc25kX3Rlc3QodHAsIHNrYiwgbXNzX25vdywKKwkJCSAgICAgICAJICAgIHRjcF9za2JfaXNfbGFzdChzaywgc2tiKSA/IG5vbmFnbGUgOgorCQkJCSAgICAJCQkgICAgICAgVENQX05BR0xFX1BVU0gpKSB7CisJCQlpZiAoc2tiLT5sZW4gPiBtc3Nfbm93KSB7CisJCQkJaWYgKHRjcF9mcmFnbWVudChzaywgc2tiLCBtc3Nfbm93KSkKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCVRDUF9TS0JfQ0Ioc2tiKS0+d2hlbiA9IHRjcF90aW1lX3N0YW1wOworCQkJdGNwX3Rzb19zZXRfcHVzaChza2IpOworCQkJaWYgKHRjcF90cmFuc21pdF9za2Ioc2ssIHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpKSkKKwkJCQlicmVhazsKKworCQkJLyogQWR2YW5jZSB0aGUgc2VuZF9oZWFkLiAgVGhpcyBvbmUgaXMgc2VudCBvdXQuCisJCQkgKiBUaGlzIGNhbGwgd2lsbCBpbmNyZW1lbnQgcGFja2V0c19vdXQuCisJCQkgKi8KKwkJCXVwZGF0ZV9zZW5kX2hlYWQoc2ssIHRwLCBza2IpOworCisJCQl0Y3BfbWluc2hhbGxfdXBkYXRlKHRwLCBtc3Nfbm93LCBza2IpOworCQkJc2VudF9wa3RzID0gMTsKKwkJfQorCisJCWlmIChzZW50X3BrdHMpIHsKKwkJCXRjcF9jd25kX3ZhbGlkYXRlKHNrLCB0cCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXJldHVybiAhdHAtPnBhY2tldHNfb3V0ICYmIHNrLT5za19zZW5kX2hlYWQ7CisJfQorCXJldHVybiAwOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFtb3VudCB0aGF0IHdlIGNhbiByYWlzZSB0aGUKKyAqIHVzYWJsZSB3aW5kb3cgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBjb25zdHJhaW50cworICogIAorICogMS4gVGhlIHdpbmRvdyBjYW4gbmV2ZXIgYmUgc2hydW5rIG9uY2UgaXQgaXMgb2ZmZXJlZCAoUkZDIDc5MykKKyAqIDIuIFdlIGxpbWl0IG1lbW9yeSBwZXIgc29ja2V0CisgKgorICogUkZDIDExMjI6CisgKiAidGhlIHN1Z2dlc3RlZCBbU1dTXSBhdm9pZGFuY2UgYWxnb3JpdGhtIGZvciB0aGUgcmVjZWl2ZXIgaXMgdG8ga2VlcAorICogIFJFQ1YuTkVYVCArIFJDVi5XSU4gZml4ZWQgdW50aWw6CisgKiAgUkNWLkJVRkYgLSBSQ1YuVVNFUiAtIFJDVi5XSU5ET1cgPj0gbWluKDEvMiBSQ1YuQlVGRiwgTVNTKSIKKyAqCisgKiBpLmUuIGRvbid0IHJhaXNlIHRoZSByaWdodCBlZGdlIG9mIHRoZSB3aW5kb3cgdW50aWwgeW91IGNhbiByYWlzZQorICogaXQgYXQgbGVhc3QgTVNTIGJ5dGVzLgorICoKKyAqIFVuZm9ydHVuYXRlbHksIHRoZSByZWNvbW1lbmRlZCBhbGdvcml0aG0gYnJlYWtzIGhlYWRlciBwcmVkaWN0aW9uLAorICogc2luY2UgaGVhZGVyIHByZWRpY3Rpb24gYXNzdW1lcyB0aC0+d2luZG93IHN0YXlzIGZpeGVkLgorICoKKyAqIFN0cmljdGx5IHNwZWFraW5nLCBrZWVwaW5nIHRoLT53aW5kb3cgZml4ZWQgdmlvbGF0ZXMgdGhlIHJlY2VpdmVyCisgKiBzaWRlIFNXUyBwcmV2ZW50aW9uIGNyaXRlcmlhLiBUaGUgcHJvYmxlbSBpcyB0aGF0IHVuZGVyIHRoaXMgcnVsZQorICogYSBzdHJlYW0gb2Ygc2luZ2xlIGJ5dGUgcGFja2V0cyB3aWxsIGNhdXNlIHRoZSByaWdodCBzaWRlIG9mIHRoZQorICogd2luZG93IHRvIGFsd2F5cyBhZHZhbmNlIGJ5IGEgc2luZ2xlIGJ5dGUuCisgKiAKKyAqIE9mIGNvdXJzZSwgaWYgdGhlIHNlbmRlciBpbXBsZW1lbnRzIHNlbmRlciBzaWRlIFNXUyBwcmV2ZW50aW9uCisgKiB0aGVuIHRoaXMgd2lsbCBub3QgYmUgYSBwcm9ibGVtLgorICogCisgKiBCU0Qgc2VlbXMgdG8gbWFrZSB0aGUgZm9sbG93aW5nIGNvbXByb21pc2U6CisgKiAKKyAqCUlmIHRoZSBmcmVlIHNwYWNlIGlzIGxlc3MgdGhhbiB0aGUgMS80IG9mIHRoZSBtYXhpbXVtCisgKglzcGFjZSBhdmFpbGFibGUgYW5kIHRoZSBmcmVlIHNwYWNlIGlzIGxlc3MgdGhhbiAxLzIgbXNzLAorICoJdGhlbiBzZXQgdGhlIHdpbmRvdyB0byAwLgorICoJWyBBY3R1YWxseSwgYnNkIHVzZXMgTVNTIGFuZCAxLzQgb2YgbWF4aW1hbCBfd2luZG93XyBdCisgKglPdGhlcndpc2UsIGp1c3QgcHJldmVudCB0aGUgd2luZG93IGZyb20gc2hyaW5raW5nCisgKglhbmQgZnJvbSBiZWluZyBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdCByZXByZXNlbnRhYmxlIHZhbHVlLgorICoKKyAqIFRoaXMgcHJldmVudHMgaW5jcmVtZW50YWwgb3BlbmluZyBvZiB0aGUgd2luZG93IGluIHRoZSByZWdpbWUKKyAqIHdoZXJlIFRDUCBpcyBsaW1pdGVkIGJ5IHRoZSBzcGVlZCBvZiB0aGUgcmVhZGVyIHNpZGUgdGFraW5nCisgKiBkYXRhIG91dCBvZiB0aGUgVENQIHJlY2VpdmUgcXVldWUuIEl0IGRvZXMgbm90aGluZyBhYm91dAorICogdGhvc2UgY2FzZXMgd2hlcmUgdGhlIHdpbmRvdyBpcyBjb25zdHJhaW5lZCBvbiB0aGUgc2VuZGVyIHNpZGUKKyAqIGJlY2F1c2UgdGhlIHBpcGVsaW5lIGlzIGZ1bGwuCisgKgorICogQlNEIGFsc28gc2VlbXMgdG8gImFjY2lkZW50YWxseSIgbGltaXQgaXRzZWxmIHRvIHdpbmRvd3MgdGhhdCBhcmUgYQorICogbXVsdGlwbGUgb2YgTVNTLCBhdCBsZWFzdCB1bnRpbCB0aGUgZnJlZSBzcGFjZSBnZXRzIHF1aXRlIHNtYWxsLgorICogVGhpcyB3b3VsZCBhcHBlYXIgdG8gYmUgYSBzaWRlIGVmZmVjdCBvZiB0aGUgbWJ1ZiBpbXBsZW1lbnRhdGlvbi4KKyAqIENvbWJpbmluZyB0aGVzZSB0d28gYWxnb3JpdGhtcyByZXN1bHRzIGluIHRoZSBvYnNlcnZlZCBiZWhhdmlvcgorICogb2YgaGF2aW5nIGEgZml4ZWQgd2luZG93IHNpemUgYXQgYWxtb3N0IGFsbCB0aW1lcy4KKyAqCisgKiBCZWxvdyB3ZSBvYnRhaW4gc2ltaWxhciBiZWhhdmlvciBieSBmb3JjaW5nIHRoZSBvZmZlcmVkIHdpbmRvdyB0bworICogYSBtdWx0aXBsZSBvZiB0aGUgbXNzIHdoZW4gaXQgaXMgZmVhc2libGUgdG8gZG8gc28uCisgKgorICogTm90ZSwgd2UgZG9uJ3QgImFkanVzdCIgZm9yIFRJTUVTVEFNUCBvciBTQUNLIG9wdGlvbiBieXRlcy4KKyAqIFJlZ3VsYXIgb3B0aW9ucyBsaWtlIFRJTUVTVEFNUCBhcmUgdGFrZW4gaW50byBhY2NvdW50LgorICovCit1MzIgX190Y3Bfc2VsZWN0X3dpbmRvdyhzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJLyogTVNTIGZvciB0aGUgcGVlcidzIGRhdGEuICBQcmV2aW91cyB2ZXJpb25zIHVzZWQgbXNzX2NsYW1wCisJICogaGVyZS4gIEkgZG9uJ3Qga25vdyBpZiB0aGUgdmFsdWUgYmFzZWQgb24gb3VyIGd1ZXNzZXMKKwkgKiBvZiBwZWVyJ3MgTVNTIGlzIGJldHRlciBmb3IgdGhlIHBlcmZvcm1hbmNlLiAgSXQncyBtb3JlIGNvcnJlY3QKKwkgKiBidXQgbWF5IGJlIHdvcnNlIGZvciB0aGUgcGVyZm9ybWFuY2UgYmVjYXVzZSBvZiByY3ZfbXNzCisJICogZmx1Y3R1YXRpb25zLiAgLS1TQVcgIDE5OTgvMTEvMQorCSAqLworCWludCBtc3MgPSB0cC0+YWNrLnJjdl9tc3M7CisJaW50IGZyZWVfc3BhY2UgPSB0Y3Bfc3BhY2Uoc2spOworCWludCBmdWxsX3NwYWNlID0gbWluX3QoaW50LCB0cC0+d2luZG93X2NsYW1wLCB0Y3BfZnVsbF9zcGFjZShzaykpOworCWludCB3aW5kb3c7CisKKwlpZiAobXNzID4gZnVsbF9zcGFjZSkKKwkJbXNzID0gZnVsbF9zcGFjZTsgCisKKwlpZiAoZnJlZV9zcGFjZSA8IGZ1bGxfc3BhY2UvMikgeworCQl0cC0+YWNrLnF1aWNrID0gMDsKKworCQlpZiAodGNwX21lbW9yeV9wcmVzc3VyZSkKKwkJCXRwLT5yY3Zfc3N0aHJlc2ggPSBtaW4odHAtPnJjdl9zc3RocmVzaCwgNFUqdHAtPmFkdm1zcyk7CisKKwkJaWYgKGZyZWVfc3BhY2UgPCBtc3MpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZnJlZV9zcGFjZSA+IHRwLT5yY3Zfc3N0aHJlc2gpCisJCWZyZWVfc3BhY2UgPSB0cC0+cmN2X3NzdGhyZXNoOworCisJLyogRG9uJ3QgZG8gcm91bmRpbmcgaWYgd2UgYXJlIHVzaW5nIHdpbmRvdyBzY2FsaW5nLCBzaW5jZSB0aGUKKwkgKiBzY2FsZWQgd2luZG93IHdpbGwgbm90IGxpbmUgdXAgd2l0aCB0aGUgTVNTIGJvdW5kYXJ5IGFueXdheS4KKwkgKi8KKwl3aW5kb3cgPSB0cC0+cmN2X3duZDsKKwlpZiAodHAtPnJ4X29wdC5yY3Zfd3NjYWxlKSB7CisJCXdpbmRvdyA9IGZyZWVfc3BhY2U7CisKKwkJLyogQWR2ZXJ0aXNlIGVub3VnaCBzcGFjZSBzbyB0aGF0IGl0IHdvbid0IGdldCBzY2FsZWQgYXdheS4KKwkJICogSW1wb3J0IGNhc2U6IHByZXZlbnQgemVybyB3aW5kb3cgYW5ub3VuY2VtZW50IGlmCisJCSAqIDE8PHJjdl93c2NhbGUgPiBtc3MuCisJCSAqLworCQlpZiAoKCh3aW5kb3cgPj4gdHAtPnJ4X29wdC5yY3Zfd3NjYWxlKSA8PCB0cC0+cnhfb3B0LnJjdl93c2NhbGUpICE9IHdpbmRvdykKKwkJCXdpbmRvdyA9ICgoKHdpbmRvdyA+PiB0cC0+cnhfb3B0LnJjdl93c2NhbGUpICsgMSkKKwkJCQkgIDw8IHRwLT5yeF9vcHQucmN2X3dzY2FsZSk7CisJfSBlbHNlIHsKKwkJLyogR2V0IHRoZSBsYXJnZXN0IHdpbmRvdyB0aGF0IGlzIGEgbmljZSBtdWx0aXBsZSBvZiBtc3MuCisJCSAqIFdpbmRvdyBjbGFtcCBhbHJlYWR5IGFwcGxpZWQgYWJvdmUuCisJCSAqIElmIG91ciBjdXJyZW50IHdpbmRvdyBvZmZlcmluZyBpcyB3aXRoaW4gMSBtc3Mgb2YgdGhlCisJCSAqIGZyZWUgc3BhY2Ugd2UganVzdCBrZWVwIGl0LiBUaGlzIHByZXZlbnRzIHRoZSBkaXZpZGUKKwkJICogYW5kIG11bHRpcGx5IGZyb20gaGFwcGVuaW5nIG1vc3Qgb2YgdGhlIHRpbWUuCisJCSAqIFdlIGFsc28gZG9uJ3QgZG8gYW55IHdpbmRvdyByb3VuZGluZyB3aGVuIHRoZSBmcmVlIHNwYWNlCisJCSAqIGlzIHRvbyBzbWFsbC4KKwkJICovCisJCWlmICh3aW5kb3cgPD0gZnJlZV9zcGFjZSAtIG1zcyB8fCB3aW5kb3cgPiBmcmVlX3NwYWNlKQorCQkJd2luZG93ID0gKGZyZWVfc3BhY2UvbXNzKSptc3M7CisJfQorCisJcmV0dXJuIHdpbmRvdzsKK30KKworLyogQXR0ZW1wdCB0byBjb2xsYXBzZSB0d28gYWRqYWNlbnQgU0tCJ3MgZHVyaW5nIHJldHJhbnNtaXNzaW9uLiAqLworc3RhdGljIHZvaWQgdGNwX3JldHJhbnNfdHJ5X2NvbGxhcHNlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG1zc19ub3cpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IHNrX2J1ZmYgKm5leHRfc2tiID0gc2tiLT5uZXh0OworCisJLyogVGhlIGZpcnN0IHRlc3Qgd2UgbXVzdCBtYWtlIGlzIHRoYXQgbmVpdGhlciBvZiB0aGVzZSB0d28KKwkgKiBTS0IncyBhcmUgc3RpbGwgcmVmZXJlbmNlZCBieSBzb21lb25lIGVsc2UuCisJICovCisJaWYgKCFza2JfY2xvbmVkKHNrYikgJiYgIXNrYl9jbG9uZWQobmV4dF9za2IpKSB7CisJCWludCBza2Jfc2l6ZSA9IHNrYi0+bGVuLCBuZXh0X3NrYl9zaXplID0gbmV4dF9za2ItPmxlbjsKKwkJdTE2IGZsYWdzID0gVENQX1NLQl9DQihza2IpLT5mbGFnczsKKworCQkvKiBBbHNvIHB1bnQgaWYgbmV4dCBza2IgaGFzIGJlZW4gU0FDSydkLiAqLworCQlpZihUQ1BfU0tCX0NCKG5leHRfc2tiKS0+c2Fja2VkICYgVENQQ0JfU0FDS0VEX0FDS0VEKQorCQkJcmV0dXJuOworCisJCS8qIE5leHQgc2tiIGlzIG91dCBvZiB3aW5kb3cuICovCisJCWlmIChhZnRlcihUQ1BfU0tCX0NCKG5leHRfc2tiKS0+ZW5kX3NlcSwgdHAtPnNuZF91bmErdHAtPnNuZF93bmQpKQorCQkJcmV0dXJuOworCisJCS8qIFB1bnQgaWYgbm90IGVub3VnaCBzcGFjZSBleGlzdHMgaW4gdGhlIGZpcnN0IFNLQiBmb3IKKwkJICogdGhlIGRhdGEgaW4gdGhlIHNlY29uZCwgb3IgdGhlIHRvdGFsIGNvbWJpbmVkIHBheWxvYWQKKwkJICogd291bGQgZXhjZWVkIHRoZSBNU1MuCisJCSAqLworCQlpZiAoKG5leHRfc2tiX3NpemUgPiBza2JfdGFpbHJvb20oc2tiKSkgfHwKKwkJICAgICgoc2tiX3NpemUgKyBuZXh0X3NrYl9zaXplKSA+IG1zc19ub3cpKQorCQkJcmV0dXJuOworCisJCUJVR19PTih0Y3Bfc2tiX3Bjb3VudChza2IpICE9IDEgfHwKKwkJICAgICAgIHRjcF9za2JfcGNvdW50KG5leHRfc2tiKSAhPSAxKTsKKworCQkvKiBPay4gIFdlIHdpbGwgYmUgYWJsZSB0byBjb2xsYXBzZSB0aGUgcGFja2V0LiAqLworCQlfX3NrYl91bmxpbmsobmV4dF9za2IsIG5leHRfc2tiLT5saXN0KTsKKworCQltZW1jcHkoc2tiX3B1dChza2IsIG5leHRfc2tiX3NpemUpLCBuZXh0X3NrYi0+ZGF0YSwgbmV4dF9za2Jfc2l6ZSk7CisKKwkJaWYgKG5leHRfc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpCisJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0hXOworCisJCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9IVykKKwkJCXNrYi0+Y3N1bSA9IGNzdW1fYmxvY2tfYWRkKHNrYi0+Y3N1bSwgbmV4dF9za2ItPmNzdW0sIHNrYl9zaXplKTsKKworCQkvKiBVcGRhdGUgc2VxdWVuY2UgcmFuZ2Ugb24gb3JpZ2luYWwgc2tiLiAqLworCQlUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEgPSBUQ1BfU0tCX0NCKG5leHRfc2tiKS0+ZW5kX3NlcTsKKworCQkvKiBNZXJnZSBvdmVyIGNvbnRyb2wgaW5mb3JtYXRpb24uICovCisJCWZsYWdzIHw9IFRDUF9TS0JfQ0IobmV4dF9za2IpLT5mbGFnczsgLyogVGhpcyBtb3ZlcyBQU0gvRklOIGV0Yy4gb3ZlciAqLworCQlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzID0gZmxhZ3M7CisKKwkJLyogQWxsIGRvbmUsIGdldCByaWQgb2Ygc2Vjb25kIFNLQiBhbmQgYWNjb3VudCBmb3IgaXQgc28KKwkJICogcGFja2V0IGNvdW50aW5nIGRvZXMgbm90IGJyZWFrLgorCQkgKi8KKwkJVENQX1NLQl9DQihza2IpLT5zYWNrZWQgfD0gVENQX1NLQl9DQihuZXh0X3NrYiktPnNhY2tlZCYoVENQQ0JfRVZFUl9SRVRSQU5TfFRDUENCX0FUX1RBSUwpOworCQlpZiAoVENQX1NLQl9DQihuZXh0X3NrYiktPnNhY2tlZCZUQ1BDQl9TQUNLRURfUkVUUkFOUykKKwkJCXRwLT5yZXRyYW5zX291dCAtPSB0Y3Bfc2tiX3Bjb3VudChuZXh0X3NrYik7CisJCWlmIChUQ1BfU0tCX0NCKG5leHRfc2tiKS0+c2Fja2VkJlRDUENCX0xPU1QpIHsKKwkJCXRwLT5sb3N0X291dCAtPSB0Y3Bfc2tiX3Bjb3VudChuZXh0X3NrYik7CisJCQl0cC0+bGVmdF9vdXQgLT0gdGNwX3NrYl9wY291bnQobmV4dF9za2IpOworCQl9CisJCS8qIFJlbm8gY2FzZSBpcyBzcGVjaWFsLiBTaWdoLi4uICovCisJCWlmICghdHAtPnJ4X29wdC5zYWNrX29rICYmIHRwLT5zYWNrZWRfb3V0KSB7CisJCQl0Y3BfZGVjX3Bjb3VudF9hcHByb3goJnRwLT5zYWNrZWRfb3V0LCBuZXh0X3NrYik7CisJCQl0cC0+bGVmdF9vdXQgLT0gdGNwX3NrYl9wY291bnQobmV4dF9za2IpOworCQl9CisKKwkJLyogTm90IHF1aXRlIHJpZ2h0OiBpdCBjYW4gYmUgPiBzbmQuZmFjaywgYnV0CisJCSAqIGl0IGlzIGJldHRlciB0byB1bmRlcmVzdGltYXRlIGZhY2tldHMuCisJCSAqLworCQl0Y3BfZGVjX3Bjb3VudF9hcHByb3goJnRwLT5mYWNrZXRzX291dCwgbmV4dF9za2IpOworCQl0Y3BfcGFja2V0c19vdXRfZGVjKHRwLCBuZXh0X3NrYik7CisJCXNrX3N0cmVhbV9mcmVlX3NrYihzaywgbmV4dF9za2IpOworCX0KK30KKworLyogRG8gYSBzaW1wbGUgcmV0cmFuc21pdCB3aXRob3V0IHVzaW5nIHRoZSBiYWNrb2ZmIG1lY2hhbmlzbXMgaW4KKyAqIHRjcF90aW1lci4gVGhpcyBpcyB1c2VkIGZvciBwYXRoIG10dSBkaXNjb3ZlcnkuIAorICogVGhlIHNvY2tldCBpcyBhbHJlYWR5IGxvY2tlZCBoZXJlLgorICovIAordm9pZCB0Y3Bfc2ltcGxlX3JldHJhbnNtaXQoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgaW50IG1zcyA9IHRjcF9jdXJyZW50X21zcyhzaywgMCk7CisJaW50IGxvc3QgPSAwOworCisJc2tfc3RyZWFtX2Zvcl9yZXRyYW5zX3F1ZXVlKHNrYiwgc2spIHsKKwkJaWYgKHNrYi0+bGVuID4gbXNzICYmIAorCQkgICAgIShUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCZUQ1BDQl9TQUNLRURfQUNLRUQpKSB7CisJCQlpZiAoVENQX1NLQl9DQihza2IpLT5zYWNrZWQmVENQQ0JfU0FDS0VEX1JFVFJBTlMpIHsKKwkJCQlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmPSB+VENQQ0JfU0FDS0VEX1JFVFJBTlM7CisJCQkJdHAtPnJldHJhbnNfb3V0IC09IHRjcF9za2JfcGNvdW50KHNrYik7CisJCQl9CisJCQlpZiAoIShUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCZUQ1BDQl9MT1NUKSkgeworCQkJCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkIHw9IFRDUENCX0xPU1Q7CisJCQkJdHAtPmxvc3Rfb3V0ICs9IHRjcF9za2JfcGNvdW50KHNrYik7CisJCQkJbG9zdCA9IDE7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIWxvc3QpCisJCXJldHVybjsKKworCXRjcF9zeW5jX2xlZnRfb3V0KHRwKTsKKworIAkvKiBEb24ndCBtdWNrIHdpdGggdGhlIGNvbmdlc3Rpb24gd2luZG93IGhlcmUuCisJICogUmVhc29uIGlzIHRoYXQgd2UgZG8gbm90IGluY3JlYXNlIGFtb3VudCBvZiBfZGF0YV8KKwkgKiBpbiBuZXR3b3JrLCBidXQgdW5pdHMgY2hhbmdlZCBhbmQgZWZmZWN0aXZlCisJICogY3duZC9zc3RocmVzaCByZWFsbHkgcmVkdWNlZCBub3cuCisJICovCisJaWYgKHRwLT5jYV9zdGF0ZSAhPSBUQ1BfQ0FfTG9zcykgeworCQl0cC0+aGlnaF9zZXEgPSB0cC0+c25kX254dDsKKwkJdHAtPnNuZF9zc3RocmVzaCA9IHRjcF9jdXJyZW50X3NzdGhyZXNoKHRwKTsKKwkJdHAtPnByaW9yX3NzdGhyZXNoID0gMDsKKwkJdHAtPnVuZG9fbWFya2VyID0gMDsKKwkJdGNwX3NldF9jYV9zdGF0ZSh0cCwgVENQX0NBX0xvc3MpOworCX0KKwl0Y3BfeG1pdF9yZXRyYW5zbWl0X3F1ZXVlKHNrKTsKK30KKworLyogVGhpcyByZXRyYW5zbWl0cyBvbmUgU0tCLiAgUG9saWN5IGRlY2lzaW9ucyBhbmQgcmV0cmFuc21pdCBxdWV1ZQorICogc3RhdGUgdXBkYXRlcyBhcmUgZG9uZSBieSB0aGUgY2FsbGVyLiAgUmV0dXJucyBub24temVybyBpZiBhbgorICogZXJyb3Igb2NjdXJyZWQgd2hpY2ggcHJldmVudGVkIHRoZSBzZW5kLgorICovCitpbnQgdGNwX3JldHJhbnNtaXRfc2tiKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKyAJdW5zaWduZWQgaW50IGN1cl9tc3MgPSB0Y3BfY3VycmVudF9tc3Moc2ssIDApOworCWludCBlcnI7CisKKwkvKiBEbyBub3Qgc2VudCBtb3JlIHRoYW4gd2UgcXVldWVkLiAxLzQgaXMgcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlCisJICogY29weWluZyBvdmVyaGVhZDogZnJnYWdtZW50YXRpb24sIHR1bm5lbGluZywgbWFuZ2xpbmcgZXRjLgorCSAqLworCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpID4KKwkgICAgbWluKHNrLT5za193bWVtX3F1ZXVlZCArIChzay0+c2tfd21lbV9xdWV1ZWQgPj4gMiksIHNrLT5za19zbmRidWYpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWlmIChiZWZvcmUoVENQX1NLQl9DQihza2IpLT5zZXEsIHRwLT5zbmRfdW5hKSkgeworCQlpZiAoYmVmb3JlKFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSwgdHAtPnNuZF91bmEpKQorCQkJQlVHKCk7CisKKwkJaWYgKHNrLT5za19yb3V0ZV9jYXBzICYgTkVUSUZfRl9UU08pIHsKKwkJCXNrLT5za19yb3V0ZV9jYXBzICY9IH5ORVRJRl9GX1RTTzsKKwkJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfTk9fTEFSR0VTRU5EKTsKKwkJCXRwLT5tc3NfY2FjaGUgPSB0cC0+bXNzX2NhY2hlX3N0ZDsKKwkJfQorCisJCWlmICh0Y3BfdHJpbV9oZWFkKHNrLCBza2IsIHRwLT5zbmRfdW5hIC0gVENQX1NLQl9DQihza2IpLT5zZXEpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogSWYgcmVjZWl2ZXIgaGFzIHNocnVuayBoaXMgd2luZG93LCBhbmQgc2tiIGlzIG91dCBvZgorCSAqIG5ldyB3aW5kb3csIGRvIG5vdCByZXRyYW5zbWl0IGl0LiBUaGUgZXhjZXB0aW9uIGlzIHRoZQorCSAqIGNhc2UsIHdoZW4gd2luZG93IGlzIHNocnVuayB0byB6ZXJvLiBJbiB0aGlzIGNhc2UKKwkgKiBvdXIgcmV0cmFuc21pdCBzZXJ2ZXMgYXMgYSB6ZXJvIHdpbmRvdyBwcm9iZS4KKwkgKi8KKwlpZiAoIWJlZm9yZShUQ1BfU0tCX0NCKHNrYiktPnNlcSwgdHAtPnNuZF91bmErdHAtPnNuZF93bmQpCisJICAgICYmIFRDUF9TS0JfQ0Ioc2tiKS0+c2VxICE9IHRwLT5zbmRfdW5hKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWlmIChza2ItPmxlbiA+IGN1cl9tc3MpIHsKKwkJaW50IG9sZF9mYWN0b3IgPSB0Y3Bfc2tiX3Bjb3VudChza2IpOworCQlpbnQgbmV3X2ZhY3RvcjsKKworCQlpZiAodGNwX2ZyYWdtZW50KHNrLCBza2IsIGN1cl9tc3MpKQorCQkJcmV0dXJuIC1FTk9NRU07IC8qIFdlJ2xsIHRyeSBhZ2FpbiBsYXRlci4gKi8KKworCQkvKiBOZXcgU0tCIGNyZWF0ZWQsIGFjY291bnQgZm9yIGl0LiAqLworCQluZXdfZmFjdG9yID0gdGNwX3NrYl9wY291bnQoc2tiKTsKKwkJdHAtPnBhY2tldHNfb3V0IC09IG9sZF9mYWN0b3IgLSBuZXdfZmFjdG9yOworCQl0cC0+cGFja2V0c19vdXQgKz0gdGNwX3NrYl9wY291bnQoc2tiLT5uZXh0KTsKKwl9CisKKwkvKiBDb2xsYXBzZSB0d28gYWRqYWNlbnQgcGFja2V0cyBpZiB3b3J0aHdoaWxlIGFuZCB3ZSBjYW4uICovCisJaWYoIShUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICYgVENQQ0JfRkxBR19TWU4pICYmCisJICAgKHNrYi0+bGVuIDwgKGN1cl9tc3MgPj4gMSkpICYmCisJICAgKHNrYi0+bmV4dCAhPSBzay0+c2tfc2VuZF9oZWFkKSAmJgorCSAgIChza2ItPm5leHQgIT0gKHN0cnVjdCBza19idWZmICopJnNrLT5za193cml0ZV9xdWV1ZSkgJiYKKwkgICAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA9PSAwICYmIHNrYl9zaGluZm8oc2tiLT5uZXh0KS0+bnJfZnJhZ3MgPT0gMCkgJiYKKwkgICAodGNwX3NrYl9wY291bnQoc2tiKSA9PSAxICYmIHRjcF9za2JfcGNvdW50KHNrYi0+bmV4dCkgPT0gMSkgJiYKKwkgICAoc3lzY3RsX3RjcF9yZXRyYW5zX2NvbGxhcHNlICE9IDApKQorCQl0Y3BfcmV0cmFuc190cnlfY29sbGFwc2Uoc2ssIHNrYiwgY3VyX21zcyk7CisKKwlpZih0cC0+YWZfc3BlY2lmaWMtPnJlYnVpbGRfaGVhZGVyKHNrKSkKKwkJcmV0dXJuIC1FSE9TVFVOUkVBQ0g7IC8qIFJvdXRpbmcgZmFpbHVyZSBvciBzaW1pbGFyLiAqLworCisJLyogU29tZSBTb2xhcmlzIHN0YWNrcyBvdmVyb3B0aW1pemUgYW5kIGlnbm9yZSB0aGUgRklOIG9uIGEKKwkgKiByZXRyYW5zbWl0IHdoZW4gb2xkIGRhdGEgaXMgYXR0YWNoZWQuICBTbyBzdHJpcCBpdCBvZmYKKwkgKiBzaW5jZSBpdCBpcyBjaGVhcCB0byBkbyBzbyBhbmQgc2F2ZXMgYnl0ZXMgb24gdGhlIG5ldHdvcmsuCisJICovCisJaWYoc2tiLT5sZW4gPiAwICYmCisJICAgKFRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgJiBUQ1BDQl9GTEFHX0ZJTikgJiYKKwkgICB0cC0+c25kX3VuYSA9PSAoVENQX1NLQl9DQihza2IpLT5lbmRfc2VxIC0gMSkpIHsKKwkJaWYgKCFwc2tiX3RyaW0oc2tiLCAwKSkgeworCQkJVENQX1NLQl9DQihza2IpLT5zZXEgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEgLSAxOworCQkJc2tiX3NoaW5mbyhza2IpLT50c29fc2VncyA9IDE7CisJCQlza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplID0gMDsKKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJCXNrYi0+Y3N1bSA9IDA7CisJCX0KKwl9CisKKwkvKiBNYWtlIGEgY29weSwgaWYgdGhlIGZpcnN0IHRyYW5zbWlzc2lvbiBTS0IgY2xvbmUgd2UgbWFkZQorCSAqIGlzIHN0aWxsIGluIHNvbWVib2R5J3MgaGFuZHMsIGVsc2UgbWFrZSBhIGNsb25lLgorCSAqLworCVRDUF9TS0JfQ0Ioc2tiKS0+d2hlbiA9IHRjcF90aW1lX3N0YW1wOworCXRjcF90c29fc2V0X3B1c2goc2tiKTsKKworCWVyciA9IHRjcF90cmFuc21pdF9za2Ioc2ssIChza2JfY2xvbmVkKHNrYikgPworCQkJCSAgICBwc2tiX2NvcHkoc2tiLCBHRlBfQVRPTUlDKToKKwkJCQkgICAgc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQykpKTsKKworCWlmIChlcnIgPT0gMCkgeworCQkvKiBVcGRhdGUgZ2xvYmFsIFRDUCBzdGF0aXN0aWNzLiAqLworCQlUQ1BfSU5DX1NUQVRTKFRDUF9NSUJfUkVUUkFOU1NFR1MpOworCisJCXRwLT50b3RhbF9yZXRyYW5zKys7CisKKyNpZiBGQVNUUkVUUkFOU19ERUJVRyA+IDAKKwkJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkJlRDUENCX1NBQ0tFRF9SRVRSQU5TKSB7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJyZXRyYW5zX291dCBsZWFrZWQuXG4iKTsKKwkJfQorI2VuZGlmCisJCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkIHw9IFRDUENCX1JFVFJBTlM7CisJCXRwLT5yZXRyYW5zX291dCArPSB0Y3Bfc2tiX3Bjb3VudChza2IpOworCisJCS8qIFNhdmUgc3RhbXAgb2YgdGhlIGZpcnN0IHJldHJhbnNtaXQuICovCisJCWlmICghdHAtPnJldHJhbnNfc3RhbXApCisJCQl0cC0+cmV0cmFuc19zdGFtcCA9IFRDUF9TS0JfQ0Ioc2tiKS0+d2hlbjsKKworCQl0cC0+dW5kb19yZXRyYW5zKys7CisKKwkJLyogc25kX254dCBpcyBzdG9yZWQgdG8gZGV0ZWN0IGxvc3Mgb2YgcmV0cmFuc21pdHRlZCBzZWdtZW50LAorCQkgKiBzZWUgdGNwX2lucHV0LmMgdGNwX3NhY2t0YWdfd3JpdGVfcXVldWUoKS4KKwkJICovCisJCVRDUF9TS0JfQ0Ioc2tiKS0+YWNrX3NlcSA9IHRwLT5zbmRfbnh0OworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKiBUaGlzIGdldHMgY2FsbGVkIGFmdGVyIGEgcmV0cmFuc21pdCB0aW1lb3V0LCBhbmQgdGhlIGluaXRpYWxseQorICogcmV0cmFuc21pdHRlZCBkYXRhIGlzIGFja25vd2xlZGdlZC4gIEl0IHRyaWVzIHRvIGNvbnRpbnVlCisgKiByZXNlbmRpbmcgdGhlIHJlc3Qgb2YgdGhlIHJldHJhbnNtaXQgcXVldWUsIHVudGlsIGVpdGhlcgorICogd2UndmUgc2VudCBpdCBhbGwgb3IgdGhlIGNvbmdlc3Rpb24gd2luZG93IGxpbWl0IGlzIHJlYWNoZWQuCisgKiBJZiBkb2luZyBTQUNLLCB0aGUgZmlyc3QgQUNLIHdoaWNoIGNvbWVzIGJhY2sgZm9yIGEgdGltZW91dAorICogYmFzZWQgcmV0cmFuc21pdCBwYWNrZXQgbWlnaHQgZmVlZCB1cyBGQUNLIGluZm9ybWF0aW9uIGFnYWluLgorICogSWYgc28sIHdlIHVzZSBpdCB0byBhdm9pZCB1bm5lY2Vzc2FyaWx5IHJldHJhbnNtaXNzaW9ucy4KKyAqLwordm9pZCB0Y3BfeG1pdF9yZXRyYW5zbWl0X3F1ZXVlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBwYWNrZXRfY250ID0gdHAtPmxvc3Rfb3V0OworCisJLyogRmlyc3QgcGFzczogcmV0cmFuc21pdCBsb3N0IHBhY2tldHMuICovCisJaWYgKHBhY2tldF9jbnQpIHsKKwkJc2tfc3RyZWFtX2Zvcl9yZXRyYW5zX3F1ZXVlKHNrYiwgc2spIHsKKwkJCV9fdTggc2Fja2VkID0gVENQX1NLQl9DQihza2IpLT5zYWNrZWQ7CisKKwkJCS8qIEFzc3VtZSB0aGlzIHJldHJhbnNtaXQgd2lsbCBnZW5lcmF0ZQorCQkJICogb25seSBvbmUgcGFja2V0IGZvciBjb25nZXN0aW9uIHdpbmRvdworCQkJICogY2FsY3VsYXRpb24gcHVycG9zZXMuICBUaGlzIHdvcmtzIGJlY2F1c2UKKwkJCSAqIHRjcF9yZXRyYW5zbWl0X3NrYigpIHdpbGwgY2hvcCB1cCB0aGUKKwkJCSAqIHBhY2tldCB0byBiZSBNU1Mgc2l6ZWQgYW5kIGFsbCB0aGUKKwkJCSAqIHBhY2tldCBjb3VudGluZyB3b3JrcyBvdXQuCisJCQkgKi8KKwkJCWlmICh0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApID49IHRwLT5zbmRfY3duZCkKKwkJCQlyZXR1cm47CisKKwkJCWlmIChzYWNrZWQmVENQQ0JfTE9TVCkgeworCQkJCWlmICghKHNhY2tlZCYoVENQQ0JfU0FDS0VEX0FDS0VEfFRDUENCX1NBQ0tFRF9SRVRSQU5TKSkpIHsKKwkJCQkJaWYgKHRjcF9yZXRyYW5zbWl0X3NrYihzaywgc2tiKSkKKwkJCQkJCXJldHVybjsKKwkJCQkJaWYgKHRwLT5jYV9zdGF0ZSAhPSBUQ1BfQ0FfTG9zcykKKwkJCQkJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUEZBU1RSRVRSQU5TKTsKKwkJCQkJZWxzZQorCQkJCQkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfVENQU0xPV1NUQVJUUkVUUkFOUyk7CisKKwkJCQkJaWYgKHNrYiA9PQorCQkJCQkgICAgc2tiX3BlZWsoJnNrLT5za193cml0ZV9xdWV1ZSkpCisJCQkJCQl0Y3BfcmVzZXRfeG1pdF90aW1lcihzaywgVENQX1RJTUVfUkVUUkFOUywgdHAtPnJ0byk7CisJCQkJfQorCisJCQkJcGFja2V0X2NudCAtPSB0Y3Bfc2tiX3Bjb3VudChza2IpOworCQkJCWlmIChwYWNrZXRfY250IDw9IDApCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLyogT0ssIGRlbWFuZGVkIHJldHJhbnNtaXNzaW9uIGlzIGZpbmlzaGVkLiAqLworCisJLyogRm9yd2FyZCByZXRyYW5zbWlzc2lvbnMgYXJlIHBvc3NpYmxlIG9ubHkgZHVyaW5nIFJlY292ZXJ5LiAqLworCWlmICh0cC0+Y2Ffc3RhdGUgIT0gVENQX0NBX1JlY292ZXJ5KQorCQlyZXR1cm47CisKKwkvKiBObyBmb3J3YXJkIHJldHJhbnNtaXNzaW9ucyBpbiBSZW5vIGFyZSBwb3NzaWJsZS4gKi8KKwlpZiAoIXRwLT5yeF9vcHQuc2Fja19vaykKKwkJcmV0dXJuOworCisJLyogWWVhaCwgd2UgaGF2ZSB0byBtYWtlIGRpZmZpY3VsdCBjaG9pY2UgYmV0d2VlbiBmb3J3YXJkIHRyYW5zbWlzc2lvbgorCSAqIGFuZCByZXRyYW5zbWlzc2lvbi4uLiBCb3RoIHdheXMgaGF2ZSB0aGVpciBtZXJpdHMuLi4KKwkgKgorCSAqIEZvciBub3cgd2UgZG8gbm90IHJldHJhbnNtaXQgYW55dGhpbmcsIHdoaWxlIHdlIGhhdmUgc29tZSBuZXcKKwkgKiBzZWdtZW50cyB0byBzZW5kLgorCSAqLworCisJaWYgKHRjcF9tYXlfc2VuZF9ub3coc2ssIHRwKSkKKwkJcmV0dXJuOworCisJcGFja2V0X2NudCA9IDA7CisKKwlza19zdHJlYW1fZm9yX3JldHJhbnNfcXVldWUoc2tiLCBzaykgeworCQkvKiBTaW1pbGFyIHRvIHRoZSByZXRyYW5zbWl0IGxvb3AgYWJvdmUgd2UKKwkJICogY2FuIHByZXRlbmQgdGhhdCB0aGUgcmV0cmFuc21pdHRlZCBTS0IKKwkJICogd2Ugc2VuZCBvdXQgaGVyZSB3aWxsIGJlIGNvbXBvc2VkIG9mIG9uZQorCQkgKiByZWFsIE1TUyBzaXplZCBwYWNrZXQgYmVjYXVzZSB0Y3BfcmV0cmFuc21pdF9za2IoKQorCQkgKiB3aWxsIGZyYWdtZW50IGl0IGlmIG5lY2Vzc2FyeS4KKwkJICovCisJCWlmICgrK3BhY2tldF9jbnQgPiB0cC0+ZmFja2V0c19vdXQpCisJCQlicmVhazsKKworCQlpZiAodGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKSA+PSB0cC0+c25kX2N3bmQpCisJCQlicmVhazsKKworCQlpZiAoVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJiBUQ1BDQl9UQUdCSVRTKQorCQkJY29udGludWU7CisKKwkJLyogT2ssIHJldHJhbnNtaXQgaXQuICovCisJCWlmICh0Y3BfcmV0cmFuc21pdF9za2Ioc2ssIHNrYikpCisJCQlicmVhazsKKworCQlpZiAoc2tiID09IHNrYl9wZWVrKCZzay0+c2tfd3JpdGVfcXVldWUpKQorCQkJdGNwX3Jlc2V0X3htaXRfdGltZXIoc2ssIFRDUF9USU1FX1JFVFJBTlMsIHRwLT5ydG8pOworCisJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUEZPUldBUkRSRVRSQU5TKTsKKwl9Cit9CisKKworLyogU2VuZCBhIGZpbi4gIFRoZSBjYWxsZXIgbG9ja3MgdGhlIHNvY2tldCBmb3IgdXMuICBUaGlzIGNhbm5vdCBiZQorICogYWxsb3dlZCB0byBmYWlsIHF1ZXVlaW5nIGEgRklOIGZyYW1lIHVuZGVyIGFueSBjaXJjdW1zdGFuY2VzLgorICovCit2b2lkIHRjcF9zZW5kX2ZpbihzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CQorCXN0cnVjdCBza19idWZmICpza2IgPSBza2JfcGVla190YWlsKCZzay0+c2tfd3JpdGVfcXVldWUpOworCWludCBtc3Nfbm93OworCQorCS8qIE9wdGltaXphdGlvbiwgdGFjayBvbiB0aGUgRklOIGlmIHdlIGhhdmUgYSBxdWV1ZSBvZgorCSAqIHVuc2VudCBmcmFtZXMuICBCdXQgYmUgY2FyZWZ1bCBhYm91dCBvdXRnb2luZyBTQUNLUworCSAqIGFuZCBJUCBvcHRpb25zLgorCSAqLworCW1zc19ub3cgPSB0Y3BfY3VycmVudF9tc3Moc2ssIDEpOworCisJaWYgKHNrLT5za19zZW5kX2hlYWQgIT0gTlVMTCkgeworCQlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzIHw9IFRDUENCX0ZMQUdfRklOOworCQlUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXErKzsKKwkJdHAtPndyaXRlX3NlcSsrOworCX0gZWxzZSB7CisJCS8qIFNvY2tldCBpcyBsb2NrZWQsIGtlZXAgdHJ5aW5nIHVudGlsIG1lbW9yeSBpcyBhdmFpbGFibGUuICovCisJCWZvciAoOzspIHsKKwkJCXNrYiA9IGFsbG9jX3NrYihNQVhfVENQX0hFQURFUiwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoc2tiKQorCQkJCWJyZWFrOworCQkJeWllbGQoKTsKKwkJfQorCisJCS8qIFJlc2VydmUgc3BhY2UgZm9yIGhlYWRlcnMgYW5kIHByZXBhcmUgY29udHJvbCBiaXRzLiAqLworCQlza2JfcmVzZXJ2ZShza2IsIE1BWF9UQ1BfSEVBREVSKTsKKwkJc2tiLT5jc3VtID0gMDsKKwkJVENQX1NLQl9DQihza2IpLT5mbGFncyA9IChUQ1BDQl9GTEFHX0FDSyB8IFRDUENCX0ZMQUdfRklOKTsKKwkJVENQX1NLQl9DQihza2IpLT5zYWNrZWQgPSAwOworCQlza2Jfc2hpbmZvKHNrYiktPnRzb19zZWdzID0gMTsKKwkJc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZSA9IDA7CisKKwkJLyogRklOIGVhdHMgYSBzZXF1ZW5jZSBieXRlLCB3cml0ZV9zZXEgYWR2YW5jZWQgYnkgdGNwX3F1ZXVlX3NrYigpLiAqLworCQlUQ1BfU0tCX0NCKHNrYiktPnNlcSA9IHRwLT53cml0ZV9zZXE7CisJCVRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxICsgMTsKKwkJdGNwX3F1ZXVlX3NrYihzaywgc2tiKTsKKwl9CisJX190Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzaywgdHAsIG1zc19ub3csIFRDUF9OQUdMRV9PRkYpOworfQorCisvKiBXZSBnZXQgaGVyZSB3aGVuIGEgcHJvY2VzcyBjbG9zZXMgYSBmaWxlIGRlc2NyaXB0b3IgKGVpdGhlciBkdWUgdG8KKyAqIGFuIGV4cGxpY2l0IGNsb3NlKCkgb3IgYXMgYSBieXByb2R1Y3Qgb2YgZXhpdCgpJ2luZykgYW5kIHRoZXJlCisgKiB3YXMgdW5yZWFkIGRhdGEgaW4gdGhlIHJlY2VpdmUgcXVldWUuICBUaGlzIGJlaGF2aW9yIGlzIHJlY29tbWVuZGVkCisgKiBieSBkcmFmdC1pZXRmLXRjcGltcGwtcHJvYi0wMy50eHQgc2VjdGlvbiAzLjEwLiAgLURhdmVNCisgKi8KK3ZvaWQgdGNwX3NlbmRfYWN0aXZlX3Jlc2V0KHN0cnVjdCBzb2NrICpzaywgaW50IHByaW9yaXR5KQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwkvKiBOT1RFOiBObyBUQ1Agb3B0aW9ucyBhdHRhY2hlZCBhbmQgd2UgbmV2ZXIgcmV0cmFuc21pdCB0aGlzLiAqLworCXNrYiA9IGFsbG9jX3NrYihNQVhfVENQX0hFQURFUiwgcHJpb3JpdHkpOworCWlmICghc2tiKSB7CisJCU5FVF9JTkNfU1RBVFMoTElOVVhfTUlCX1RDUEFCT1JURkFJTEVEKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFJlc2VydmUgc3BhY2UgZm9yIGhlYWRlcnMgYW5kIHByZXBhcmUgY29udHJvbCBiaXRzLiAqLworCXNrYl9yZXNlcnZlKHNrYiwgTUFYX1RDUF9IRUFERVIpOworCXNrYi0+Y3N1bSA9IDA7CisJVENQX1NLQl9DQihza2IpLT5mbGFncyA9IChUQ1BDQl9GTEFHX0FDSyB8IFRDUENCX0ZMQUdfUlNUKTsKKwlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCA9IDA7CisJc2tiX3NoaW5mbyhza2IpLT50c29fc2VncyA9IDE7CisJc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZSA9IDA7CisKKwkvKiBTZW5kIGl0IG9mZi4gKi8KKwlUQ1BfU0tCX0NCKHNrYiktPnNlcSA9IHRjcF9hY2NlcHRhYmxlX3NlcShzaywgdHApOworCVRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxOworCVRDUF9TS0JfQ0Ioc2tiKS0+d2hlbiA9IHRjcF90aW1lX3N0YW1wOworCWlmICh0Y3BfdHJhbnNtaXRfc2tiKHNrLCBza2IpKQorCQlORVRfSU5DX1NUQVRTKExJTlVYX01JQl9UQ1BBQk9SVEZBSUxFRCk7Cit9CisKKy8qIFdBUk5JTkc6IFRoaXMgcm91dGluZSBtdXN0IG9ubHkgYmUgY2FsbGVkIHdoZW4gd2UgaGF2ZSBhbHJlYWR5IHNlbnQKKyAqIGEgU1lOIHBhY2tldCB0aGF0IGNyb3NzZWQgdGhlIGluY29taW5nIFNZTiB0aGF0IGNhdXNlZCB0aGlzIHJvdXRpbmUKKyAqIHRvIGdldCBjYWxsZWQuIElmIHRoaXMgYXNzdW1wdGlvbiBmYWlscyB0aGVuIHRoZSBpbml0aWFsIHJjdl93bmQKKyAqIGFuZCByY3Zfd3NjYWxlIHZhbHVlcyB3aWxsIG5vdCBiZSBjb3JyZWN0LgorICovCitpbnQgdGNwX3NlbmRfc3luYWNrKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiogc2tiOworCisJc2tiID0gc2tiX3BlZWsoJnNrLT5za193cml0ZV9xdWV1ZSk7CisJaWYgKHNrYiA9PSBOVUxMIHx8ICEoVENQX1NLQl9DQihza2IpLT5mbGFncyZUQ1BDQl9GTEFHX1NZTikpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInRjcF9zZW5kX3N5bmFjazogd3JvbmcgcXVldWUgc3RhdGVcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJaWYgKCEoVENQX1NLQl9DQihza2IpLT5mbGFncyZUQ1BDQl9GTEFHX0FDSykpIHsKKwkJaWYgKHNrYl9jbG9uZWQoc2tiKSkgeworCQkJc3RydWN0IHNrX2J1ZmYgKm5za2IgPSBza2JfY29weShza2IsIEdGUF9BVE9NSUMpOworCQkJaWYgKG5za2IgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCV9fc2tiX3VubGluayhza2IsICZzay0+c2tfd3JpdGVfcXVldWUpOworCQkJc2tiX2hlYWRlcl9yZWxlYXNlKG5za2IpOworCQkJX19za2JfcXVldWVfaGVhZCgmc2stPnNrX3dyaXRlX3F1ZXVlLCBuc2tiKTsKKwkJCXNrX3N0cmVhbV9mcmVlX3NrYihzaywgc2tiKTsKKwkJCXNrX2NoYXJnZV9za2Ioc2ssIG5za2IpOworCQkJc2tiID0gbnNrYjsKKwkJfQorCisJCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgfD0gVENQQ0JfRkxBR19BQ0s7CisJCVRDUF9FQ05fc2VuZF9zeW5hY2sodGNwX3NrKHNrKSwgc2tiKTsKKwl9CisJVENQX1NLQl9DQihza2IpLT53aGVuID0gdGNwX3RpbWVfc3RhbXA7CisJcmV0dXJuIHRjcF90cmFuc21pdF9za2Ioc2ssIHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpKTsKK30KKworLyoKKyAqIFByZXBhcmUgYSBTWU4tQUNLLgorICovCitzdHJ1Y3Qgc2tfYnVmZiAqIHRjcF9tYWtlX3N5bmFjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBkc3RfZW50cnkgKmRzdCwKKwkJCQkgc3RydWN0IG9wZW5fcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCB0Y3BoZHIgKnRoOworCWludCB0Y3BfaGVhZGVyX3NpemU7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXNrYiA9IHNvY2tfd21hbGxvYyhzaywgTUFYX1RDUF9IRUFERVIgKyAxNSwgMSwgR0ZQX0FUT01JQyk7CisJaWYgKHNrYiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIFJlc2VydmUgc3BhY2UgZm9yIGhlYWRlcnMuICovCisJc2tiX3Jlc2VydmUoc2tiLCBNQVhfVENQX0hFQURFUik7CisKKwlza2ItPmRzdCA9IGRzdF9jbG9uZShkc3QpOworCisJdGNwX2hlYWRlcl9zaXplID0gKHNpemVvZihzdHJ1Y3QgdGNwaGRyKSArIFRDUE9MRU5fTVNTICsKKwkJCSAgIChyZXEtPnRzdGFtcF9vayA/IFRDUE9MRU5fVFNUQU1QX0FMSUdORUQgOiAwKSArCisJCQkgICAocmVxLT53c2NhbGVfb2sgPyBUQ1BPTEVOX1dTQ0FMRV9BTElHTkVEIDogMCkgKworCQkJICAgLyogU0FDS19QRVJNIGlzIGluIHRoZSBwbGFjZSBvZiBOT1AgTk9QIG9mIFRTICovCisJCQkgICAoKHJlcS0+c2Fja19vayAmJiAhcmVxLT50c3RhbXBfb2spID8gVENQT0xFTl9TQUNLUEVSTV9BTElHTkVEIDogMCkpOworCXNrYi0+aC50aCA9IHRoID0gKHN0cnVjdCB0Y3BoZHIgKikgc2tiX3B1c2goc2tiLCB0Y3BfaGVhZGVyX3NpemUpOworCisJbWVtc2V0KHRoLCAwLCBzaXplb2Yoc3RydWN0IHRjcGhkcikpOworCXRoLT5zeW4gPSAxOworCXRoLT5hY2sgPSAxOworCWlmIChkc3QtPmRldi0+ZmVhdHVyZXMmTkVUSUZfRl9UU08pCisJCXJlcS0+ZWNuX29rID0gMDsKKwlUQ1BfRUNOX21ha2Vfc3luYWNrKHJlcSwgdGgpOworCXRoLT5zb3VyY2UgPSBpbmV0X3NrKHNrKS0+c3BvcnQ7CisJdGgtPmRlc3QgPSByZXEtPnJtdF9wb3J0OworCVRDUF9TS0JfQ0Ioc2tiKS0+c2VxID0gcmVxLT5zbnRfaXNuOworCVRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxICsgMTsKKwlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCA9IDA7CisJc2tiX3NoaW5mbyhza2IpLT50c29fc2VncyA9IDE7CisJc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZSA9IDA7CisJdGgtPnNlcSA9IGh0b25sKFRDUF9TS0JfQ0Ioc2tiKS0+c2VxKTsKKwl0aC0+YWNrX3NlcSA9IGh0b25sKHJlcS0+cmN2X2lzbiArIDEpOworCWlmIChyZXEtPnJjdl93bmQgPT0gMCkgeyAvKiBpZ25vcmVkIGZvciByZXRyYW5zbWl0dGVkIHN5bnMgKi8KKwkJX191OCByY3Zfd3NjYWxlOyAKKwkJLyogU2V0IHRoaXMgdXAgb24gdGhlIGZpcnN0IGNhbGwgb25seSAqLworCQlyZXEtPndpbmRvd19jbGFtcCA9IHRwLT53aW5kb3dfY2xhbXAgPyA6IGRzdF9tZXRyaWMoZHN0LCBSVEFYX1dJTkRPVyk7CisJCS8qIHRjcF9mdWxsX3NwYWNlIGJlY2F1c2UgaXQgaXMgZ3VhcmFudGVlZCB0byBiZSB0aGUgZmlyc3QgcGFja2V0ICovCisJCXRjcF9zZWxlY3RfaW5pdGlhbF93aW5kb3codGNwX2Z1bGxfc3BhY2Uoc2spLCAKKwkJCWRzdF9tZXRyaWMoZHN0LCBSVEFYX0FEVk1TUykgLSAocmVxLT50c3RhbXBfb2sgPyBUQ1BPTEVOX1RTVEFNUF9BTElHTkVEIDogMCksCisJCQkmcmVxLT5yY3Zfd25kLAorCQkJJnJlcS0+d2luZG93X2NsYW1wLAorCQkJcmVxLT53c2NhbGVfb2ssCisJCQkmcmN2X3dzY2FsZSk7CisJCXJlcS0+cmN2X3dzY2FsZSA9IHJjdl93c2NhbGU7IAorCX0KKworCS8qIFJGQzEzMjM6IFRoZSB3aW5kb3cgaW4gU1lOICYgU1lOL0FDSyBzZWdtZW50cyBpcyBuZXZlciBzY2FsZWQuICovCisJdGgtPndpbmRvdyA9IGh0b25zKHJlcS0+cmN2X3duZCk7CisKKwlUQ1BfU0tCX0NCKHNrYiktPndoZW4gPSB0Y3BfdGltZV9zdGFtcDsKKwl0Y3Bfc3luX2J1aWxkX29wdGlvbnMoKF9fdTMyICopKHRoICsgMSksIGRzdF9tZXRyaWMoZHN0LCBSVEFYX0FEVk1TUyksIHJlcS0+dHN0YW1wX29rLAorCQkJICAgICAgcmVxLT5zYWNrX29rLCByZXEtPndzY2FsZV9vaywgcmVxLT5yY3Zfd3NjYWxlLAorCQkJICAgICAgVENQX1NLQl9DQihza2IpLT53aGVuLAorCQkJICAgICAgcmVxLT50c19yZWNlbnQpOworCisJc2tiLT5jc3VtID0gMDsKKwl0aC0+ZG9mZiA9ICh0Y3BfaGVhZGVyX3NpemUgPj4gMik7CisJVENQX0lOQ19TVEFUUyhUQ1BfTUlCX09VVFNFR1MpOworCXJldHVybiBza2I7Cit9CisKKy8qIAorICogRG8gYWxsIGNvbm5lY3Qgc29ja2V0IHNldHVwcyB0aGF0IGNhbiBiZSBkb25lIEFGIGluZGVwZW5kZW50LgorICovIAorc3RhdGljIGlubGluZSB2b2lkIHRjcF9jb25uZWN0X2luaXQoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IF9fc2tfZHN0X2dldChzayk7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJX191OCByY3Zfd3NjYWxlOworCisJLyogV2UnbGwgZml4IHRoaXMgdXAgd2hlbiB3ZSBnZXQgYSByZXNwb25zZSBmcm9tIHRoZSBvdGhlciBlbmQuCisJICogU2VlIHRjcF9pbnB1dC5jOnRjcF9yY3Zfc3RhdGVfcHJvY2VzcyBjYXNlIFRDUF9TWU5fU0VOVC4KKwkgKi8KKwl0cC0+dGNwX2hlYWRlcl9sZW4gPSBzaXplb2Yoc3RydWN0IHRjcGhkcikgKworCQkoc3lzY3RsX3RjcF90aW1lc3RhbXBzID8gVENQT0xFTl9UU1RBTVBfQUxJR05FRCA6IDApOworCisJLyogSWYgdXNlciBnYXZlIGhpcyBUQ1BfTUFYU0VHLCByZWNvcmQgaXQgdG8gY2xhbXAgKi8KKwlpZiAodHAtPnJ4X29wdC51c2VyX21zcykKKwkJdHAtPnJ4X29wdC5tc3NfY2xhbXAgPSB0cC0+cnhfb3B0LnVzZXJfbXNzOworCXRwLT5tYXhfd2luZG93ID0gMDsKKwl0Y3Bfc3luY19tc3Moc2ssIGRzdF9tdHUoZHN0KSk7CisKKwlpZiAoIXRwLT53aW5kb3dfY2xhbXApCisJCXRwLT53aW5kb3dfY2xhbXAgPSBkc3RfbWV0cmljKGRzdCwgUlRBWF9XSU5ET1cpOworCXRwLT5hZHZtc3MgPSBkc3RfbWV0cmljKGRzdCwgUlRBWF9BRFZNU1MpOworCXRjcF9pbml0aWFsaXplX3Jjdl9tc3Moc2spOworCXRjcF9jYV9pbml0KHRwKTsKKworCXRjcF9zZWxlY3RfaW5pdGlhbF93aW5kb3codGNwX2Z1bGxfc3BhY2Uoc2spLAorCQkJCSAgdHAtPmFkdm1zcyAtICh0cC0+cnhfb3B0LnRzX3JlY2VudF9zdGFtcCA/IHRwLT50Y3BfaGVhZGVyX2xlbiAtIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSA6IDApLAorCQkJCSAgJnRwLT5yY3Zfd25kLAorCQkJCSAgJnRwLT53aW5kb3dfY2xhbXAsCisJCQkJICBzeXNjdGxfdGNwX3dpbmRvd19zY2FsaW5nLAorCQkJCSAgJnJjdl93c2NhbGUpOworCisJdHAtPnJ4X29wdC5yY3Zfd3NjYWxlID0gcmN2X3dzY2FsZTsKKwl0cC0+cmN2X3NzdGhyZXNoID0gdHAtPnJjdl93bmQ7CisKKwlzay0+c2tfZXJyID0gMDsKKwlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfRE9ORSk7CisJdHAtPnNuZF93bmQgPSAwOworCXRjcF9pbml0X3dsKHRwLCB0cC0+d3JpdGVfc2VxLCAwKTsKKwl0cC0+c25kX3VuYSA9IHRwLT53cml0ZV9zZXE7CisJdHAtPnNuZF9zbWwgPSB0cC0+d3JpdGVfc2VxOworCXRwLT5yY3Zfbnh0ID0gMDsKKwl0cC0+cmN2X3d1cCA9IDA7CisJdHAtPmNvcGllZF9zZXEgPSAwOworCisJdHAtPnJ0byA9IFRDUF9USU1FT1VUX0lOSVQ7CisJdHAtPnJldHJhbnNtaXRzID0gMDsKKwl0Y3BfY2xlYXJfcmV0cmFucyh0cCk7Cit9CisKKy8qCisgKiBCdWlsZCBhIFNZTiBhbmQgc2VuZCBpdCBvZmYuCisgKi8gCitpbnQgdGNwX2Nvbm5lY3Qoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBza19idWZmICpidWZmOworCisJdGNwX2Nvbm5lY3RfaW5pdChzayk7CisKKwlidWZmID0gYWxsb2Nfc2tiKE1BWF9UQ1BfSEVBREVSICsgMTUsIHNrLT5za19hbGxvY2F0aW9uKTsKKwlpZiAodW5saWtlbHkoYnVmZiA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgaGVhZGVycy4gKi8KKwlza2JfcmVzZXJ2ZShidWZmLCBNQVhfVENQX0hFQURFUik7CisKKwlUQ1BfU0tCX0NCKGJ1ZmYpLT5mbGFncyA9IFRDUENCX0ZMQUdfU1lOOworCVRDUF9FQ05fc2VuZF9zeW4oc2ssIHRwLCBidWZmKTsKKwlUQ1BfU0tCX0NCKGJ1ZmYpLT5zYWNrZWQgPSAwOworCXNrYl9zaGluZm8oYnVmZiktPnRzb19zZWdzID0gMTsKKwlza2Jfc2hpbmZvKGJ1ZmYpLT50c29fc2l6ZSA9IDA7CisJYnVmZi0+Y3N1bSA9IDA7CisJVENQX1NLQl9DQihidWZmKS0+c2VxID0gdHAtPndyaXRlX3NlcSsrOworCVRDUF9TS0JfQ0IoYnVmZiktPmVuZF9zZXEgPSB0cC0+d3JpdGVfc2VxOworCXRwLT5zbmRfbnh0ID0gdHAtPndyaXRlX3NlcTsKKwl0cC0+cHVzaGVkX3NlcSA9IHRwLT53cml0ZV9zZXE7CisJdGNwX2NhX2luaXQodHApOworCisJLyogU2VuZCBpdCBvZmYuICovCisJVENQX1NLQl9DQihidWZmKS0+d2hlbiA9IHRjcF90aW1lX3N0YW1wOworCXRwLT5yZXRyYW5zX3N0YW1wID0gVENQX1NLQl9DQihidWZmKS0+d2hlbjsKKwlza2JfaGVhZGVyX3JlbGVhc2UoYnVmZik7CisJX19za2JfcXVldWVfdGFpbCgmc2stPnNrX3dyaXRlX3F1ZXVlLCBidWZmKTsKKwlza19jaGFyZ2Vfc2tiKHNrLCBidWZmKTsKKwl0cC0+cGFja2V0c19vdXQgKz0gdGNwX3NrYl9wY291bnQoYnVmZik7CisJdGNwX3RyYW5zbWl0X3NrYihzaywgc2tiX2Nsb25lKGJ1ZmYsIEdGUF9LRVJORUwpKTsKKwlUQ1BfSU5DX1NUQVRTKFRDUF9NSUJfQUNUSVZFT1BFTlMpOworCisJLyogVGltZXIgZm9yIHJlcGVhdGluZyB0aGUgU1lOIHVudGlsIGFuIGFuc3dlci4gKi8KKwl0Y3BfcmVzZXRfeG1pdF90aW1lcihzaywgVENQX1RJTUVfUkVUUkFOUywgdHAtPnJ0byk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFNlbmQgb3V0IGEgZGVsYXllZCBhY2ssIHRoZSBjYWxsZXIgZG9lcyB0aGUgcG9saWN5IGNoZWNraW5nCisgKiB0byBzZWUgaWYgd2Ugc2hvdWxkIGV2ZW4gYmUgaGVyZS4gIFNlZSB0Y3BfaW5wdXQuYzp0Y3BfYWNrX3NuZF9jaGVjaygpCisgKiBmb3IgZGV0YWlscy4KKyAqLwordm9pZCB0Y3Bfc2VuZF9kZWxheWVkX2FjayhzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJaW50IGF0byA9IHRwLT5hY2suYXRvOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCWlmIChhdG8gPiBUQ1BfREVMQUNLX01JTikgeworCQlpbnQgbWF4X2F0byA9IEhaLzI7CisKKwkJaWYgKHRwLT5hY2sucGluZ3BvbmcgfHwgKHRwLT5hY2sucGVuZGluZyZUQ1BfQUNLX1BVU0hFRCkpCisJCQltYXhfYXRvID0gVENQX0RFTEFDS19NQVg7CisKKwkJLyogU2xvdyBwYXRoLCBpbnRlcnNlZ21lbnQgaW50ZXJ2YWwgaXMgImhpZ2giLiAqLworCisJCS8qIElmIHNvbWUgcnR0IGVzdGltYXRlIGlzIGtub3duLCB1c2UgaXQgdG8gYm91bmQgZGVsYXllZCBhY2suCisJCSAqIERvIG5vdCB1c2UgdHAtPnJ0byBoZXJlLCB1c2UgcmVzdWx0cyBvZiBydHQgbWVhc3VyZW1lbnRzCisJCSAqIGRpcmVjdGx5LgorCQkgKi8KKwkJaWYgKHRwLT5zcnR0KSB7CisJCQlpbnQgcnR0ID0gbWF4KHRwLT5zcnR0Pj4zLCBUQ1BfREVMQUNLX01JTik7CisKKwkJCWlmIChydHQgPCBtYXhfYXRvKQorCQkJCW1heF9hdG8gPSBydHQ7CisJCX0KKworCQlhdG8gPSBtaW4oYXRvLCBtYXhfYXRvKTsKKwl9CisKKwkvKiBTdGF5IHdpdGhpbiB0aGUgbGltaXQgd2Ugd2VyZSBnaXZlbiAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgYXRvOworCisJLyogVXNlIG5ldyB0aW1lb3V0IG9ubHkgaWYgdGhlcmUgd2Fzbid0IGEgb2xkZXIgb25lIGVhcmxpZXIuICovCisJaWYgKHRwLT5hY2sucGVuZGluZyZUQ1BfQUNLX1RJTUVSKSB7CisJCS8qIElmIGRlbGFjayB0aW1lciB3YXMgYmxvY2tlZCBvciBpcyBhYm91dCB0byBleHBpcmUsCisJCSAqIHNlbmQgQUNLIG5vdy4KKwkJICovCisJCWlmICh0cC0+YWNrLmJsb2NrZWQgfHwgdGltZV9iZWZvcmVfZXEodHAtPmFjay50aW1lb3V0LCBqaWZmaWVzKyhhdG8+PjIpKSkgeworCQkJdGNwX3NlbmRfYWNrKHNrKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICghdGltZV9iZWZvcmUodGltZW91dCwgdHAtPmFjay50aW1lb3V0KSkKKwkJCXRpbWVvdXQgPSB0cC0+YWNrLnRpbWVvdXQ7CisJfQorCXRwLT5hY2sucGVuZGluZyB8PSBUQ1BfQUNLX1NDSEVEfFRDUF9BQ0tfVElNRVI7CisJdHAtPmFjay50aW1lb3V0ID0gdGltZW91dDsKKwlza19yZXNldF90aW1lcihzaywgJnRwLT5kZWxhY2tfdGltZXIsIHRpbWVvdXQpOworfQorCisvKiBUaGlzIHJvdXRpbmUgc2VuZHMgYW4gYWNrIGFuZCBhbHNvIHVwZGF0ZXMgdGhlIHdpbmRvdy4gKi8KK3ZvaWQgdGNwX3NlbmRfYWNrKHN0cnVjdCBzb2NrICpzaykKK3sKKwkvKiBJZiB3ZSBoYXZlIGJlZW4gcmVzZXQsIHdlIG1heSBub3Qgc2VuZCBhZ2Fpbi4gKi8KKwlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9DTE9TRSkgeworCQlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwkJc3RydWN0IHNrX2J1ZmYgKmJ1ZmY7CisKKwkJLyogV2UgYXJlIG5vdCBwdXR0aW5nIHRoaXMgb24gdGhlIHdyaXRlIHF1ZXVlLCBzbworCQkgKiB0Y3BfdHJhbnNtaXRfc2tiKCkgd2lsbCBzZXQgdGhlIG93bmVyc2hpcCB0byB0aGlzCisJCSAqIHNvY2suCisJCSAqLworCQlidWZmID0gYWxsb2Nfc2tiKE1BWF9UQ1BfSEVBREVSLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGJ1ZmYgPT0gTlVMTCkgeworCQkJdGNwX3NjaGVkdWxlX2Fjayh0cCk7CisJCQl0cC0+YWNrLmF0byA9IFRDUF9BVE9fTUlOOworCQkJdGNwX3Jlc2V0X3htaXRfdGltZXIoc2ssIFRDUF9USU1FX0RBQ0ssIFRDUF9ERUxBQ0tfTUFYKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIFJlc2VydmUgc3BhY2UgZm9yIGhlYWRlcnMgYW5kIHByZXBhcmUgY29udHJvbCBiaXRzLiAqLworCQlza2JfcmVzZXJ2ZShidWZmLCBNQVhfVENQX0hFQURFUik7CisJCWJ1ZmYtPmNzdW0gPSAwOworCQlUQ1BfU0tCX0NCKGJ1ZmYpLT5mbGFncyA9IFRDUENCX0ZMQUdfQUNLOworCQlUQ1BfU0tCX0NCKGJ1ZmYpLT5zYWNrZWQgPSAwOworCQlza2Jfc2hpbmZvKGJ1ZmYpLT50c29fc2VncyA9IDE7CisJCXNrYl9zaGluZm8oYnVmZiktPnRzb19zaXplID0gMDsKKworCQkvKiBTZW5kIGl0IG9mZiwgdGhpcyBjbGVhcnMgZGVsYXllZCBhY2tzIGZvciB1cy4gKi8KKwkJVENQX1NLQl9DQihidWZmKS0+c2VxID0gVENQX1NLQl9DQihidWZmKS0+ZW5kX3NlcSA9IHRjcF9hY2NlcHRhYmxlX3NlcShzaywgdHApOworCQlUQ1BfU0tCX0NCKGJ1ZmYpLT53aGVuID0gdGNwX3RpbWVfc3RhbXA7CisJCXRjcF90cmFuc21pdF9za2Ioc2ssIGJ1ZmYpOworCX0KK30KKworLyogVGhpcyByb3V0aW5lIHNlbmRzIGEgcGFja2V0IHdpdGggYW4gb3V0IG9mIGRhdGUgc2VxdWVuY2UKKyAqIG51bWJlci4gSXQgYXNzdW1lcyB0aGUgb3RoZXIgZW5kIHdpbGwgdHJ5IHRvIGFjayBpdC4KKyAqCisgKiBRdWVzdGlvbjogd2hhdCBzaG91bGQgd2UgbWFrZSB3aGlsZSB1cmdlbnQgbW9kZT8KKyAqIDQuNEJTRCBmb3JjZXMgc2VuZGluZyBzaW5nbGUgYnl0ZSBvZiBkYXRhLiBXZSBjYW5ub3Qgc2VuZAorICogb3V0IG9mIHdpbmRvdyBkYXRhLCBiZWNhdXNlIHdlIGhhdmUgU05ELk5YVD09U05ELk1BWC4uLgorICoKKyAqIEN1cnJlbnQgc29sdXRpb246IHRvIHNlbmQgVFdPIHplcm8tbGVuZ3RoIHNlZ21lbnRzIGluIHVyZ2VudCBtb2RlOgorICogb25lIGlzIHdpdGggU0VHLlNFUT1TTkQuVU5BIHRvIGRlbGl2ZXIgdXJnZW50IHBvaW50ZXIsIGFub3RoZXIgaXMKKyAqIG91dC1vZi1kYXRlIHdpdGggU05ELlVOQS0xIHRvIHByb2JlIHdpbmRvdy4KKyAqLworc3RhdGljIGludCB0Y3BfeG1pdF9wcm9iZV9za2Ioc3RydWN0IHNvY2sgKnNrLCBpbnQgdXJnZW50KQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwkvKiBXZSBkb24ndCBxdWV1ZSBpdCwgdGNwX3RyYW5zbWl0X3NrYigpIHNldHMgb3duZXJzaGlwLiAqLworCXNrYiA9IGFsbG9jX3NrYihNQVhfVENQX0hFQURFUiwgR0ZQX0FUT01JQyk7CisJaWYgKHNrYiA9PSBOVUxMKSAKKwkJcmV0dXJuIC0xOworCisJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgaGVhZGVycyBhbmQgc2V0IGNvbnRyb2wgYml0cy4gKi8KKwlza2JfcmVzZXJ2ZShza2IsIE1BWF9UQ1BfSEVBREVSKTsKKwlza2ItPmNzdW0gPSAwOworCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgPSBUQ1BDQl9GTEFHX0FDSzsKKwlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCA9IHVyZ2VudDsKKwlza2Jfc2hpbmZvKHNrYiktPnRzb19zZWdzID0gMTsKKwlza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplID0gMDsKKworCS8qIFVzZSBhIHByZXZpb3VzIHNlcXVlbmNlLiAgVGhpcyBzaG91bGQgY2F1c2UgdGhlIG90aGVyCisJICogZW5kIHRvIHNlbmQgYW4gYWNrLiAgRG9uJ3QgcXVldWUgb3IgY2xvbmUgU0tCLCBqdXN0CisJICogc2VuZCBpdC4KKwkgKi8KKwlUQ1BfU0tCX0NCKHNrYiktPnNlcSA9IHVyZ2VudCA/IHRwLT5zbmRfdW5hIDogdHAtPnNuZF91bmEgLSAxOworCVRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxOworCVRDUF9TS0JfQ0Ioc2tiKS0+d2hlbiA9IHRjcF90aW1lX3N0YW1wOworCXJldHVybiB0Y3BfdHJhbnNtaXRfc2tiKHNrLCBza2IpOworfQorCitpbnQgdGNwX3dyaXRlX3dha2V1cChzdHJ1Y3Qgc29jayAqc2spCit7CisJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfQ0xPU0UpIHsKKwkJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJaWYgKChza2IgPSBzay0+c2tfc2VuZF9oZWFkKSAhPSBOVUxMICYmCisJCSAgICBiZWZvcmUoVENQX1NLQl9DQihza2IpLT5zZXEsIHRwLT5zbmRfdW5hK3RwLT5zbmRfd25kKSkgeworCQkJaW50IGVycjsKKwkJCXVuc2lnbmVkIGludCBtc3MgPSB0Y3BfY3VycmVudF9tc3Moc2ssIDApOworCQkJdW5zaWduZWQgaW50IHNlZ19zaXplID0gdHAtPnNuZF91bmErdHAtPnNuZF93bmQtVENQX1NLQl9DQihza2IpLT5zZXE7CisKKwkJCWlmIChiZWZvcmUodHAtPnB1c2hlZF9zZXEsIFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSkpCisJCQkJdHAtPnB1c2hlZF9zZXEgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7CisKKwkJCS8qIFdlIGFyZSBwcm9iaW5nIHRoZSBvcGVuaW5nIG9mIGEgd2luZG93CisJCQkgKiBidXQgdGhlIHdpbmRvdyBzaXplIGlzICE9IDAKKwkJCSAqIG11c3QgaGF2ZSBiZWVuIGEgcmVzdWx0IFNXUyBhdm9pZGFuY2UgKCBzZW5kZXIgKQorCQkJICovCisJCQlpZiAoc2VnX3NpemUgPCBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEgLSBUQ1BfU0tCX0NCKHNrYiktPnNlcSB8fAorCQkJICAgIHNrYi0+bGVuID4gbXNzKSB7CisJCQkJc2VnX3NpemUgPSBtaW4oc2VnX3NpemUsIG1zcyk7CisJCQkJVENQX1NLQl9DQihza2IpLT5mbGFncyB8PSBUQ1BDQl9GTEFHX1BTSDsKKwkJCQlpZiAodGNwX2ZyYWdtZW50KHNrLCBza2IsIHNlZ19zaXplKSkKKwkJCQkJcmV0dXJuIC0xOworCQkJCS8qIFNXUyBvdmVycmlkZSB0cmlnZ2VyZWQgZm9yY2VkIGZyYWdtZW50YXRpb24uCisJCQkJICogRGlzYWJsZSBUU08sIHRoZSBjb25uZWN0aW9uIGlzIHRvbyBzaWNrLiAqLworCQkJCWlmIChzay0+c2tfcm91dGVfY2FwcyAmIE5FVElGX0ZfVFNPKSB7CisJCQkJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfTk9fTEFSR0VTRU5EKTsKKwkJCQkJc2stPnNrX3JvdXRlX2NhcHMgJj0gfk5FVElGX0ZfVFNPOworCQkJCQl0cC0+bXNzX2NhY2hlID0gdHAtPm1zc19jYWNoZV9zdGQ7CisJCQkJfQorCQkJfSBlbHNlIGlmICghdGNwX3NrYl9wY291bnQoc2tiKSkKKwkJCQl0Y3Bfc2V0X3NrYl90c29fc2Vncyhza2IsIHRwLT5tc3NfY2FjaGVfc3RkKTsKKworCQkJVENQX1NLQl9DQihza2IpLT5mbGFncyB8PSBUQ1BDQl9GTEFHX1BTSDsKKwkJCVRDUF9TS0JfQ0Ioc2tiKS0+d2hlbiA9IHRjcF90aW1lX3N0YW1wOworCQkJdGNwX3Rzb19zZXRfcHVzaChza2IpOworCQkJZXJyID0gdGNwX3RyYW5zbWl0X3NrYihzaywgc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQykpOworCQkJaWYgKCFlcnIpIHsKKwkJCQl1cGRhdGVfc2VuZF9oZWFkKHNrLCB0cCwgc2tiKTsKKwkJCX0KKwkJCXJldHVybiBlcnI7CisJCX0gZWxzZSB7CisJCQlpZiAodHAtPnVyZ19tb2RlICYmCisJCQkgICAgYmV0d2Vlbih0cC0+c25kX3VwLCB0cC0+c25kX3VuYSsxLCB0cC0+c25kX3VuYSsweEZGRkYpKQorCQkJCXRjcF94bWl0X3Byb2JlX3NrYihzaywgVENQQ0JfVVJHKTsKKwkJCXJldHVybiB0Y3BfeG1pdF9wcm9iZV9za2Ioc2ssIDApOworCQl9CisJfQorCXJldHVybiAtMTsKK30KKworLyogQSB3aW5kb3cgcHJvYmUgdGltZW91dCBoYXMgb2NjdXJyZWQuICBJZiB3aW5kb3cgaXMgbm90IGNsb3NlZCBzZW5kCisgKiBhIHBhcnRpYWwgcGFja2V0IGVsc2UgYSB6ZXJvIHByb2JlLgorICovCit2b2lkIHRjcF9zZW5kX3Byb2JlMChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJaW50IGVycjsKKworCWVyciA9IHRjcF93cml0ZV93YWtldXAoc2spOworCisJaWYgKHRwLT5wYWNrZXRzX291dCB8fCAhc2stPnNrX3NlbmRfaGVhZCkgeworCQkvKiBDYW5jZWwgcHJvYmUgdGltZXIsIGlmIGl0IGlzIG5vdCByZXF1aXJlZC4gKi8KKwkJdHAtPnByb2Jlc19vdXQgPSAwOworCQl0cC0+YmFja29mZiA9IDA7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZXJyIDw9IDApIHsKKwkJaWYgKHRwLT5iYWNrb2ZmIDwgc3lzY3RsX3RjcF9yZXRyaWVzMikKKwkJCXRwLT5iYWNrb2ZmKys7CisJCXRwLT5wcm9iZXNfb3V0Kys7CisJCXRjcF9yZXNldF94bWl0X3RpbWVyIChzaywgVENQX1RJTUVfUFJPQkUwLCAKKwkJCQkgICAgICBtaW4odHAtPnJ0byA8PCB0cC0+YmFja29mZiwgVENQX1JUT19NQVgpKTsKKwl9IGVsc2UgeworCQkvKiBJZiBwYWNrZXQgd2FzIG5vdCBzZW50IGR1ZSB0byBsb2NhbCBjb25nZXN0aW9uLAorCQkgKiBkbyBub3QgYmFja29mZiBhbmQgZG8gbm90IHJlbWVtYmVyIHByb2Jlc19vdXQuCisJCSAqIExldCBsb2NhbCBzZW5kZXJzIHRvIGZpZ2h0IGZvciBsb2NhbCByZXNvdXJjZXMuCisJCSAqCisJCSAqIFVzZSBhY2N1bXVsYXRlZCBiYWNrb2ZmIHlldC4KKwkJICovCisJCWlmICghdHAtPnByb2Jlc19vdXQpCisJCQl0cC0+cHJvYmVzX291dD0xOworCQl0Y3BfcmVzZXRfeG1pdF90aW1lciAoc2ssIFRDUF9USU1FX1BST0JFMCwgCisJCQkJICAgICAgbWluKHRwLT5ydG8gPDwgdHAtPmJhY2tvZmYsIFRDUF9SRVNPVVJDRV9QUk9CRV9JTlRFUlZBTCkpOworCX0KK30KKworRVhQT1JUX1NZTUJPTCh0Y3BfY29ubmVjdCk7CitFWFBPUlRfU1lNQk9MKHRjcF9tYWtlX3N5bmFjayk7CitFWFBPUlRfU1lNQk9MKHRjcF9zaW1wbGVfcmV0cmFuc21pdCk7CitFWFBPUlRfU1lNQk9MKHRjcF9zeW5jX21zcyk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfdGltZXIuYyBiL25ldC9pcHY0L3RjcF90aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YjI3OWYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC90Y3BfdGltZXIuYwpAQCAtMCwwICsxLDY1NiBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlJbXBsZW1lbnRhdGlvbiBvZiB0aGUgVHJhbnNtaXNzaW9uIENvbnRyb2wgUHJvdG9jb2woVENQKS4KKyAqCisgKiBWZXJzaW9uOgkkSWQ6IHRjcF90aW1lci5jLHYgMS44OCAyMDAyLzAyLzAxIDIyOjAxOjA0IGRhdmVtIEV4cCAkCisgKgorICogQXV0aG9yczoJUm9zcyBCaXJvLCA8YmlyN0BsZWxhbmQuU3RhbmZvcmQuRWR1PgorICoJCUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoJCU1hcmsgRXZhbnMsIDxldmFuc21wQHVodXJhLmFzdG9uLmFjLnVrPgorICoJCUNvcmV5IE1pbnlhcmQgPHdmLXJjaCFtaW55YXJkQHJlbGF5LkVVLm5ldD4KKyAqCQlGbG9yaWFuIExhIFJvY2hlLCA8ZmxsYUBzdHVkLnVuaS1zYi5kZT4KKyAqCQlDaGFybGVzIEhlZHJpY2ssIDxoZWRyaWNrQGtsaW56aGFpLnJ1dGdlcnMuZWR1PgorICoJCUxpbnVzIFRvcnZhbGRzLCA8dG9ydmFsZHNAY3MuaGVsc2lua2kuZmk+CisgKgkJQWxhbiBDb3gsIDxndzRwdHNAZ3c0cHRzLmFtcHIub3JnPgorICoJCU1hdHRoZXcgRGlsbG9uLCA8ZGlsbG9uQGFwb2xsby53ZXN0Lm9pYy5jb20+CisgKgkJQXJudCBHdWxicmFuZHNlbiwgPGFndWxicmFAbnZnLnVuaXQubm8+CisgKgkJSm9yZ2UgQ3dpaywgPGpvcmdlQGxhc2VyLnNhdGxpbmsubmV0PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisKK2ludCBzeXNjdGxfdGNwX3N5bl9yZXRyaWVzID0gVENQX1NZTl9SRVRSSUVTOyAKK2ludCBzeXNjdGxfdGNwX3N5bmFja19yZXRyaWVzID0gVENQX1NZTkFDS19SRVRSSUVTOyAKK2ludCBzeXNjdGxfdGNwX2tlZXBhbGl2ZV90aW1lID0gVENQX0tFRVBBTElWRV9USU1FOworaW50IHN5c2N0bF90Y3Bfa2VlcGFsaXZlX3Byb2JlcyA9IFRDUF9LRUVQQUxJVkVfUFJPQkVTOworaW50IHN5c2N0bF90Y3Bfa2VlcGFsaXZlX2ludHZsID0gVENQX0tFRVBBTElWRV9JTlRWTDsKK2ludCBzeXNjdGxfdGNwX3JldHJpZXMxID0gVENQX1JFVFIxOworaW50IHN5c2N0bF90Y3BfcmV0cmllczIgPSBUQ1BfUkVUUjI7CitpbnQgc3lzY3RsX3RjcF9vcnBoYW5fcmV0cmllczsKKworc3RhdGljIHZvaWQgdGNwX3dyaXRlX3RpbWVyKHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgdGNwX2RlbGFja190aW1lcih1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyB2b2lkIHRjcF9rZWVwYWxpdmVfdGltZXIgKHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKKyNpZmRlZiBUQ1BfREVCVUcKK2NvbnN0IGNoYXIgdGNwX3RpbWVyX2J1Z19tc2dbXSA9IEtFUk5fREVCVUcgInRjcGJ1ZzogdW5rbm93biB0aW1lciB2YWx1ZVxuIjsKK0VYUE9SVF9TWU1CT0wodGNwX3RpbWVyX2J1Z19tc2cpOworI2VuZGlmCisKKy8qCisgKiBVc2luZyBkaWZmZXJlbnQgdGltZXJzIGZvciByZXRyYW5zbWl0LCBkZWxheWVkIGFja3MgYW5kIHByb2JlcworICogV2UgbWF5IHdpc2ggdXNlIGp1c3Qgb25lIHRpbWVyIG1haW50YWluaW5nIGEgbGlzdCBvZiBleHBpcmUgamlmZmllcyAKKyAqIHRvIG9wdGltaXplLgorICovCisKK3ZvaWQgdGNwX2luaXRfeG1pdF90aW1lcnMoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJaW5pdF90aW1lcigmdHAtPnJldHJhbnNtaXRfdGltZXIpOworCXRwLT5yZXRyYW5zbWl0X3RpbWVyLmZ1bmN0aW9uPSZ0Y3Bfd3JpdGVfdGltZXI7CisJdHAtPnJldHJhbnNtaXRfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBzazsKKwl0cC0+cGVuZGluZyA9IDA7CisKKwlpbml0X3RpbWVyKCZ0cC0+ZGVsYWNrX3RpbWVyKTsKKwl0cC0+ZGVsYWNrX3RpbWVyLmZ1bmN0aW9uPSZ0Y3BfZGVsYWNrX3RpbWVyOworCXRwLT5kZWxhY2tfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBzazsKKwl0cC0+YWNrLnBlbmRpbmcgPSAwOworCisJaW5pdF90aW1lcigmc2stPnNrX3RpbWVyKTsKKwlzay0+c2tfdGltZXIuZnVuY3Rpb24JPSAmdGNwX2tlZXBhbGl2ZV90aW1lcjsKKwlzay0+c2tfdGltZXIuZGF0YQk9ICh1bnNpZ25lZCBsb25nKXNrOworfQorCit2b2lkIHRjcF9jbGVhcl94bWl0X3RpbWVycyhzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisKKwl0cC0+cGVuZGluZyA9IDA7CisJc2tfc3RvcF90aW1lcihzaywgJnRwLT5yZXRyYW5zbWl0X3RpbWVyKTsKKworCXRwLT5hY2sucGVuZGluZyA9IDA7CisJdHAtPmFjay5ibG9ja2VkID0gMDsKKwlza19zdG9wX3RpbWVyKHNrLCAmdHAtPmRlbGFja190aW1lcik7CisKKwlza19zdG9wX3RpbWVyKHNrLCAmc2stPnNrX3RpbWVyKTsKK30KKworc3RhdGljIHZvaWQgdGNwX3dyaXRlX2VycihzdHJ1Y3Qgc29jayAqc2spCit7CisJc2stPnNrX2VyciA9IHNrLT5za19lcnJfc29mdCA/IDogRVRJTUVET1VUOworCXNrLT5za19lcnJvcl9yZXBvcnQoc2spOworCisJdGNwX2RvbmUoc2spOworCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUEFCT1JUT05USU1FT1VUKTsKK30KKworLyogRG8gbm90IGFsbG93IG9ycGhhbmVkIHNvY2tldHMgdG8gZWF0IGFsbCBvdXIgcmVzb3VyY2VzLgorICogVGhpcyBpcyBkaXJlY3QgdmlvbGF0aW9uIG9mIFRDUCBzcGVjcywgYnV0IGl0IGlzIHJlcXVpcmVkCisgKiB0byBwcmV2ZW50IERvUyBhdHRhY2tzLiBJdCBpcyBjYWxsZWQgd2hlbiBhIHJldHJhbnNtaXNzaW9uIHRpbWVvdXQKKyAqIG9yIHplcm8gcHJvYmUgdGltZW91dCBvY2N1cnMgb24gb3JwaGFuZWQgc29ja2V0LgorICoKKyAqIENyaXRlcml1bSBpcyBzdGlsbCBub3QgY29uZmlybWVkIGV4cGVyaW1lbnRhbGx5IGFuZCBtYXkgY2hhbmdlLgorICogV2Uga2lsbCB0aGUgc29ja2V0LCBpZjoKKyAqIDEuIElmIG51bWJlciBvZiBvcnBoYW5lZCBzb2NrZXRzIGV4Y2VlZHMgYW4gYWRtaW5pc3RyYXRpdmVseSBjb25maWd1cmVkCisgKiAgICBsaW1pdC4KKyAqIDIuIElmIHdlIGhhdmUgc3Ryb25nIG1lbW9yeSBwcmVzc3VyZS4KKyAqLworc3RhdGljIGludCB0Y3Bfb3V0X29mX3Jlc291cmNlcyhzdHJ1Y3Qgc29jayAqc2ssIGludCBkb19yZXNldCkKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlpbnQgb3JwaGFucyA9IGF0b21pY19yZWFkKCZ0Y3Bfb3JwaGFuX2NvdW50KTsKKworCS8qIElmIHBlZXIgZG9lcyBub3Qgb3BlbiB3aW5kb3cgZm9yIGxvbmcgdGltZSwgb3IgZGlkIG5vdCB0cmFuc21pdCAKKwkgKiBhbnl0aGluZyBmb3IgbG9uZyB0aW1lLCBwZW5hbGl6ZSBpdC4gKi8KKwlpZiAoKHMzMikodGNwX3RpbWVfc3RhbXAgLSB0cC0+bHNuZHRpbWUpID4gMipUQ1BfUlRPX01BWCB8fCAhZG9fcmVzZXQpCisJCW9ycGhhbnMgPDw9IDE7CisKKwkvKiBJZiBzb21lIGR1YmlvdXMgSUNNUCBhcnJpdmVkLCBwZW5hbGl6ZSBldmVuIG1vcmUuICovCisJaWYgKHNrLT5za19lcnJfc29mdCkKKwkJb3JwaGFucyA8PD0gMTsKKworCWlmIChvcnBoYW5zID49IHN5c2N0bF90Y3BfbWF4X29ycGhhbnMgfHwKKwkgICAgKHNrLT5za193bWVtX3F1ZXVlZCA+IFNPQ0tfTUlOX1NOREJVRiAmJgorCSAgICAgYXRvbWljX3JlYWQoJnRjcF9tZW1vcnlfYWxsb2NhdGVkKSA+IHN5c2N0bF90Y3BfbWVtWzJdKSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiT3V0IG9mIHNvY2tldCBtZW1vcnlcbiIpOworCisJCS8qIENhdGNoIGV4Y2VwdGlvbmFsIGNhc2VzLCB3aGVuIGNvbm5lY3Rpb24gcmVxdWlyZXMgcmVzZXQuCisJCSAqICAgICAgMS4gTGFzdCBzZWdtZW50IHdhcyBzZW50IHJlY2VudGx5LiAqLworCQlpZiAoKHMzMikodGNwX3RpbWVfc3RhbXAgLSB0cC0+bHNuZHRpbWUpIDw9IFRDUF9USU1FV0FJVF9MRU4gfHwKKwkJICAgIC8qICAyLiBXaW5kb3cgaXMgY2xvc2VkLiAqLworCQkgICAgKCF0cC0+c25kX3duZCAmJiAhdHAtPnBhY2tldHNfb3V0KSkKKwkJCWRvX3Jlc2V0ID0gMTsKKwkJaWYgKGRvX3Jlc2V0KQorCQkJdGNwX3NlbmRfYWN0aXZlX3Jlc2V0KHNrLCBHRlBfQVRPTUlDKTsKKwkJdGNwX2RvbmUoc2spOworCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BBQk9SVE9OTUVNT1JZKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKiBDYWxjdWxhdGUgbWF4aW1hbCBudW1iZXIgb3IgcmV0cmllcyBvbiBhbiBvcnBoYW5lZCBzb2NrZXQuICovCitzdGF0aWMgaW50IHRjcF9vcnBoYW5fcmV0cmllcyhzdHJ1Y3Qgc29jayAqc2ssIGludCBhbGl2ZSkKK3sKKwlpbnQgcmV0cmllcyA9IHN5c2N0bF90Y3Bfb3JwaGFuX3JldHJpZXM7IC8qIE1heSBiZSB6ZXJvLiAqLworCisJLyogV2Uga25vdyBmcm9tIGFuIElDTVAgdGhhdCBzb21ldGhpbmcgaXMgd3JvbmcuICovCisJaWYgKHNrLT5za19lcnJfc29mdCAmJiAhYWxpdmUpCisJCXJldHJpZXMgPSAwOworCisJLyogSG93ZXZlciwgaWYgc29ja2V0IHNlbnQgc29tZXRoaW5nIHJlY2VudGx5LCBzZWxlY3Qgc29tZSBzYWZlCisJICogbnVtYmVyIG9mIHJldHJpZXMuIDggY29ycmVzcG9uZHMgdG8gPjEwMCBzZWNvbmRzIHdpdGggbWluaW1hbAorCSAqIFJUTyBvZiAyMDBtc2VjLiAqLworCWlmIChyZXRyaWVzID09IDAgJiYgYWxpdmUpCisJCXJldHJpZXMgPSA4OworCXJldHVybiByZXRyaWVzOworfQorCisvKiBBIHdyaXRlIHRpbWVvdXQgaGFzIG9jY3VycmVkLiBQcm9jZXNzIHRoZSBhZnRlciBlZmZlY3RzLiAqLworc3RhdGljIGludCB0Y3Bfd3JpdGVfdGltZW91dChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJaW50IHJldHJ5X3VudGlsOworCisJaWYgKCgxIDw8IHNrLT5za19zdGF0ZSkgJiAoVENQRl9TWU5fU0VOVCB8IFRDUEZfU1lOX1JFQ1YpKSB7CisJCWlmICh0cC0+cmV0cmFuc21pdHMpCisJCQlkc3RfbmVnYXRpdmVfYWR2aWNlKCZzay0+c2tfZHN0X2NhY2hlKTsKKwkJcmV0cnlfdW50aWwgPSB0cC0+c3luX3JldHJpZXMgPyA6IHN5c2N0bF90Y3Bfc3luX3JldHJpZXM7CisJfSBlbHNlIHsKKwkJaWYgKHRwLT5yZXRyYW5zbWl0cyA+PSBzeXNjdGxfdGNwX3JldHJpZXMxKSB7CisJCQkvKiBOT1RFLiBkcmFmdC1pZXRmLXRjcGltcGwtcG10dWQtMDEudHh0IHJlcXVpcmVzIHBtdHUgYmxhY2sKKwkJCSAgIGhvbGUgZGV0ZWN0aW9uLiA6LSgKKworCQkJICAgSXQgaXMgcGxhY2UgdG8gbWFrZSBpdC4gSXQgaXMgbm90IG1hZGUuIEkgZG8gbm90IHdhbnQKKwkJCSAgIHRvIG1ha2UgaXQuIEl0IGlzIGRpc2d1aXN0aW5nLiBJdCBkb2VzIG5vdCB3b3JrIGluIGFueQorCQkJICAgY2FzZS4gTGV0IG1lIHRvIGNpdGUgdGhlIHNhbWUgZHJhZnQsIHdoaWNoIHJlcXVpcmVzIGZvcgorCQkJICAgdXMgdG8gaW1wbGVtZW50IHRoaXM6CisKKyAgICJUaGUgb25lIHNlY3VyaXR5IGNvbmNlcm4gcmFpc2VkIGJ5IHRoaXMgbWVtbyBpcyB0aGF0IElDTVAgYmxhY2sgaG9sZXMKKyAgIGFyZSBvZnRlbiBjYXVzZWQgYnkgb3Zlci16ZWFsb3VzIHNlY3VyaXR5IGFkbWluaXN0cmF0b3JzIHdobyBibG9jaworICAgYWxsIElDTVAgbWVzc2FnZXMuICBJdCBpcyB2aXRhbGx5IGltcG9ydGFudCB0aGF0IHRob3NlIHdobyBkZXNpZ24gYW5kCisgICBkZXBsb3kgc2VjdXJpdHkgc3lzdGVtcyB1bmRlcnN0YW5kIHRoZSBpbXBhY3Qgb2Ygc3RyaWN0IGZpbHRlcmluZyBvbgorICAgdXBwZXItbGF5ZXIgcHJvdG9jb2xzLiAgVGhlIHNhZmVzdCB3ZWIgc2l0ZSBpbiB0aGUgd29ybGQgaXMgd29ydGhsZXNzCisgICBpZiBtb3N0IFRDUCBpbXBsZW1lbnRhdGlvbnMgY2Fubm90IHRyYW5zZmVyIGRhdGEgZnJvbSBpdC4gIEl0IHdvdWxkCisgICBiZSBmYXIgbmljZXIgdG8gaGF2ZSBhbGwgb2YgdGhlIGJsYWNrIGhvbGVzIGZpeGVkIHJhdGhlciB0aGFuIGZpeGluZworICAgYWxsIG9mIHRoZSBUQ1AgaW1wbGVtZW50YXRpb25zLiIKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgR29sZGVuIHdvcmRzIDotKS4KKwkJICAgKi8KKworCQkJZHN0X25lZ2F0aXZlX2FkdmljZSgmc2stPnNrX2RzdF9jYWNoZSk7CisJCX0KKworCQlyZXRyeV91bnRpbCA9IHN5c2N0bF90Y3BfcmV0cmllczI7CisJCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpIHsKKwkJCWludCBhbGl2ZSA9ICh0cC0+cnRvIDwgVENQX1JUT19NQVgpOworIAorCQkJcmV0cnlfdW50aWwgPSB0Y3Bfb3JwaGFuX3JldHJpZXMoc2ssIGFsaXZlKTsKKworCQkJaWYgKHRjcF9vdXRfb2ZfcmVzb3VyY2VzKHNrLCBhbGl2ZSB8fCB0cC0+cmV0cmFuc21pdHMgPCByZXRyeV91bnRpbCkpCisJCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlpZiAodHAtPnJldHJhbnNtaXRzID49IHJldHJ5X3VudGlsKSB7CisJCS8qIEhhcyBpdCBnb25lIGp1c3QgdG9vIGZhcj8gKi8KKwkJdGNwX3dyaXRlX2Vycihzayk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGNwX2RlbGFja190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHNvY2sgKnNrID0gKHN0cnVjdCBzb2NrKilkYXRhOworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJYmhfbG9ja19zb2NrKHNrKTsKKwlpZiAoc29ja19vd25lZF9ieV91c2VyKHNrKSkgeworCQkvKiBUcnkgYWdhaW4gbGF0ZXIuICovCisJCXRwLT5hY2suYmxvY2tlZCA9IDE7CisJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX0RFTEFZRURBQ0tMT0NLRUQpOworCQlza19yZXNldF90aW1lcihzaywgJnRwLT5kZWxhY2tfdGltZXIsIGppZmZpZXMgKyBUQ1BfREVMQUNLX01JTik7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlza19zdHJlYW1fbWVtX3JlY2xhaW0oc2spOworCisJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfQ0xPU0UgfHwgISh0cC0+YWNrLnBlbmRpbmcgJiBUQ1BfQUNLX1RJTUVSKSkKKwkJZ290byBvdXQ7CisKKwlpZiAodGltZV9hZnRlcih0cC0+YWNrLnRpbWVvdXQsIGppZmZpZXMpKSB7CisJCXNrX3Jlc2V0X3RpbWVyKHNrLCAmdHAtPmRlbGFja190aW1lciwgdHAtPmFjay50aW1lb3V0KTsKKwkJZ290byBvdXQ7CisJfQorCXRwLT5hY2sucGVuZGluZyAmPSB+VENQX0FDS19USU1FUjsKKworCWlmIChza2JfcXVldWVfbGVuKCZ0cC0+dWNvcHkucHJlcXVldWUpKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJTkVUX0FERF9TVEFUU19CSChMSU5VWF9NSUJfVENQU0NIRURVTEVSRkFJTEVELCAKKwkJCQkgc2tiX3F1ZXVlX2xlbigmdHAtPnVjb3B5LnByZXF1ZXVlKSk7CisKKwkJd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlKCZ0cC0+dWNvcHkucHJlcXVldWUpKSAhPSBOVUxMKQorCQkJc2stPnNrX2JhY2tsb2dfcmN2KHNrLCBza2IpOworCisJCXRwLT51Y29weS5tZW1vcnkgPSAwOworCX0KKworCWlmICh0Y3BfYWNrX3NjaGVkdWxlZCh0cCkpIHsKKwkJaWYgKCF0cC0+YWNrLnBpbmdwb25nKSB7CisJCQkvKiBEZWxheWVkIEFDSyBtaXNzZWQ6IGluZmxhdGUgQVRPLiAqLworCQkJdHAtPmFjay5hdG8gPSBtaW4odHAtPmFjay5hdG8gPDwgMSwgdHAtPnJ0byk7CisJCX0gZWxzZSB7CisJCQkvKiBEZWxheWVkIEFDSyBtaXNzZWQ6IGxlYXZlIHBpbmdwb25nIG1vZGUgYW5kCisJCQkgKiBkZWZsYXRlIEFUTy4KKwkJCSAqLworCQkJdHAtPmFjay5waW5ncG9uZyA9IDA7CisJCQl0cC0+YWNrLmF0byA9IFRDUF9BVE9fTUlOOworCQl9CisJCXRjcF9zZW5kX2Fjayhzayk7CisJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX0RFTEFZRURBQ0tTKTsKKwl9CisJVENQX0NIRUNLX1RJTUVSKHNrKTsKKworb3V0OgorCWlmICh0Y3BfbWVtb3J5X3ByZXNzdXJlKQorCQlza19zdHJlYW1fbWVtX3JlY2xhaW0oc2spOworb3V0X3VubG9jazoKKwliaF91bmxvY2tfc29jayhzayk7CisJc29ja19wdXQoc2spOworfQorCitzdGF0aWMgdm9pZCB0Y3BfcHJvYmVfdGltZXIoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCWludCBtYXhfcHJvYmVzOworCisJaWYgKHRwLT5wYWNrZXRzX291dCB8fCAhc2stPnNrX3NlbmRfaGVhZCkgeworCQl0cC0+cHJvYmVzX291dCA9IDA7CisJCXJldHVybjsKKwl9CisKKwkvKiAqV0FSTklORyogUkZDIDExMjIgZm9yYmlkcyB0aGlzCisJICoKKwkgKiBJdCBkb2Vzbid0IEFGQUlLLCBiZWNhdXNlIHdlIGtpbGwgdGhlIHJldHJhbnNtaXQgdGltZXIgLUFLCisJICoKKwkgKiBGSVhNRTogV2Ugb3VnaHQgbm90IHRvIGRvIGl0LCBTb2xhcmlzIDIuNSBhY3R1YWxseSBoYXMgZml4aW5nCisJICogdGhpcyBiZWhhdmlvdXIgaW4gU29sYXJpcyBkb3duIGFzIGEgYnVnIGZpeC4gW0FDXQorCSAqCisJICogTGV0IG1lIHRvIGV4cGxhaW4uIHByb2Jlc19vdXQgaXMgemVyb2VkIGJ5IGluY29taW5nIEFDS3MKKwkgKiBldmVuIGlmIHRoZXkgYWR2ZXJ0aXNlIHplcm8gd2luZG93LiBIZW5jZSwgY29ubmVjdGlvbiBpcyBraWxsZWQgb25seQorCSAqIGlmIHdlIHJlY2VpdmVkIG5vIEFDS3MgZm9yIG5vcm1hbCBjb25uZWN0aW9uIHRpbWVvdXQuIEl0IGlzIG5vdCBraWxsZWQKKwkgKiBvbmx5IGJlY2F1c2Ugd2luZG93IHN0YXlzIHplcm8gZm9yIHNvbWUgdGltZSwgd2luZG93IG1heSBiZSB6ZXJvCisJICogdW50aWwgYXJtYWdlZGRvbiBhbmQgZXZlbiBsYXRlci4gV2UgYXJlIGluIGZ1bGwgYWNjb3JkYW5jZQorCSAqIHdpdGggUkZDcywgb25seSBwcm9iZSB0aW1lciBjb21iaW5lcyBib3RoIHJldHJhbnNtaXNzaW9uIHRpbWVvdXQKKwkgKiBhbmQgcHJvYmUgdGltZW91dCBpbiBvbmUgYm90dGxlLgkJCQktLUFOSworCSAqLworCW1heF9wcm9iZXMgPSBzeXNjdGxfdGNwX3JldHJpZXMyOworCisJaWYgKHNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkgeworCQlpbnQgYWxpdmUgPSAoKHRwLT5ydG88PHRwLT5iYWNrb2ZmKSA8IFRDUF9SVE9fTUFYKTsKKyAKKwkJbWF4X3Byb2JlcyA9IHRjcF9vcnBoYW5fcmV0cmllcyhzaywgYWxpdmUpOworCisJCWlmICh0Y3Bfb3V0X29mX3Jlc291cmNlcyhzaywgYWxpdmUgfHwgdHAtPnByb2Jlc19vdXQgPD0gbWF4X3Byb2JlcykpCisJCQlyZXR1cm47CisJfQorCisJaWYgKHRwLT5wcm9iZXNfb3V0ID4gbWF4X3Byb2JlcykgeworCQl0Y3Bfd3JpdGVfZXJyKHNrKTsKKwl9IGVsc2UgeworCQkvKiBPbmx5IHNlbmQgYW5vdGhlciBwcm9iZSBpZiB3ZSBkaWRuJ3QgY2xvc2UgdGhpbmdzIHVwLiAqLworCQl0Y3Bfc2VuZF9wcm9iZTAoc2spOworCX0KK30KKworLyoKKyAqCVRoZSBUQ1AgcmV0cmFuc21pdCB0aW1lci4KKyAqLworCitzdGF0aWMgdm9pZCB0Y3BfcmV0cmFuc21pdF90aW1lcihzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisKKwlpZiAoIXRwLT5wYWNrZXRzX291dCkKKwkJZ290byBvdXQ7CisKKwlCVUdfVFJBUCghc2tiX3F1ZXVlX2VtcHR5KCZzay0+c2tfd3JpdGVfcXVldWUpKTsKKworCWlmICghdHAtPnNuZF93bmQgJiYgIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSAmJgorCSAgICAhKCgxIDw8IHNrLT5za19zdGF0ZSkgJiAoVENQRl9TWU5fU0VOVCB8IFRDUEZfU1lOX1JFQ1YpKSkgeworCQkvKiBSZWNlaXZlciBkYXN0YXJkbHkgc2hyaW5rcyB3aW5kb3cuIE91ciByZXRyYW5zbWl0cworCQkgKiBiZWNvbWUgemVybyBwcm9iZXMsIGJ1dCB3ZSBzaG91bGQgbm90IHRpbWVvdXQgdGhpcworCQkgKiBjb25uZWN0aW9uLiBJZiB0aGUgc29ja2V0IGlzIGFuIG9ycGhhbiwgdGltZSBpdCBvdXQsCisJCSAqIHdlIGNhbm5vdCBhbGxvdyBzdWNoIGJlYXN0cyB0byBoYW5nIGluZmluaXRlbHkuCisJCSAqLworI2lmZGVmIFRDUF9ERUJVRworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiVENQOiBUcmVhc29uIHVuY2xvYWtlZCEgUGVlciAldS4ldS4ldS4ldToldS8ldSBzaHJpbmtzIHdpbmRvdyAldToldS4gUmVwYWlyZWQuXG4iLAorCQkJICAgICAgIE5JUFFVQUQoaW5ldC0+ZGFkZHIpLCBodG9ucyhpbmV0LT5kcG9ydCksCisJCQkgICAgICAgaW5ldC0+bnVtLCB0cC0+c25kX3VuYSwgdHAtPnNuZF9ueHQpOworCQl9CisjZW5kaWYKKwkJaWYgKHRjcF90aW1lX3N0YW1wIC0gdHAtPnJjdl90c3RhbXAgPiBUQ1BfUlRPX01BWCkgeworCQkJdGNwX3dyaXRlX2Vycihzayk7CisJCQlnb3RvIG91dDsKKwkJfQorCQl0Y3BfZW50ZXJfbG9zcyhzaywgMCk7CisJCXRjcF9yZXRyYW5zbWl0X3NrYihzaywgc2tiX3BlZWsoJnNrLT5za193cml0ZV9xdWV1ZSkpOworCQlfX3NrX2RzdF9yZXNldChzayk7CisJCWdvdG8gb3V0X3Jlc2V0X3RpbWVyOworCX0KKworCWlmICh0Y3Bfd3JpdGVfdGltZW91dChzaykpCisJCWdvdG8gb3V0OworCisJaWYgKHRwLT5yZXRyYW5zbWl0cyA9PSAwKSB7CisJCWlmICh0cC0+Y2Ffc3RhdGUgPT0gVENQX0NBX0Rpc29yZGVyIHx8IHRwLT5jYV9zdGF0ZSA9PSBUQ1BfQ0FfUmVjb3ZlcnkpIHsKKwkJCWlmICh0cC0+cnhfb3B0LnNhY2tfb2spIHsKKwkJCQlpZiAodHAtPmNhX3N0YXRlID09IFRDUF9DQV9SZWNvdmVyeSkKKwkJCQkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfVENQU0FDS1JFQ09WRVJZRkFJTCk7CisJCQkJZWxzZQorCQkJCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BTQUNLRkFJTFVSRVMpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodHAtPmNhX3N0YXRlID09IFRDUF9DQV9SZWNvdmVyeSkKKwkJCQkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfVENQUkVOT1JFQ09WRVJZRkFJTCk7CisJCQkJZWxzZQorCQkJCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BSRU5PRkFJTFVSRVMpOworCQkJfQorCQl9IGVsc2UgaWYgKHRwLT5jYV9zdGF0ZSA9PSBUQ1BfQ0FfTG9zcykgeworCQkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfVENQTE9TU0ZBSUxVUkVTKTsKKwkJfSBlbHNlIHsKKwkJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUFRJTUVPVVRTKTsKKwkJfQorCX0KKworCWlmICh0Y3BfdXNlX2ZydG8oc2spKSB7CisJCXRjcF9lbnRlcl9mcnRvKHNrKTsKKwl9IGVsc2UgeworCQl0Y3BfZW50ZXJfbG9zcyhzaywgMCk7CisJfQorCisJaWYgKHRjcF9yZXRyYW5zbWl0X3NrYihzaywgc2tiX3BlZWsoJnNrLT5za193cml0ZV9xdWV1ZSkpID4gMCkgeworCQkvKiBSZXRyYW5zbWlzc2lvbiBmYWlsZWQgYmVjYXVzZSBvZiBsb2NhbCBjb25nZXN0aW9uLAorCQkgKiBkbyBub3QgYmFja29mZi4KKwkJICovCisJCWlmICghdHAtPnJldHJhbnNtaXRzKQorCQkJdHAtPnJldHJhbnNtaXRzPTE7CisJCXRjcF9yZXNldF94bWl0X3RpbWVyKHNrLCBUQ1BfVElNRV9SRVRSQU5TLAorCQkJCSAgICAgbWluKHRwLT5ydG8sIFRDUF9SRVNPVVJDRV9QUk9CRV9JTlRFUlZBTCkpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBJbmNyZWFzZSB0aGUgdGltZW91dCBlYWNoIHRpbWUgd2UgcmV0cmFuc21pdC4gIE5vdGUgdGhhdAorCSAqIHdlIGRvIG5vdCBpbmNyZWFzZSB0aGUgcnR0IGVzdGltYXRlLiAgcnRvIGlzIGluaXRpYWxpemVkCisJICogZnJvbSBydHQsIGJ1dCBpbmNyZWFzZXMgaGVyZS4gIEphY29ic29uIChTSUdDT01NIDg4KSBzdWdnZXN0cworCSAqIHRoYXQgZG91YmxpbmcgcnRvIGVhY2ggdGltZSBpcyB0aGUgbGVhc3Qgd2UgY2FuIGdldCBhd2F5IHdpdGguCisJICogSW4gS0E5USwgS2FybiB1c2VzIHRoaXMgZm9yIHRoZSBmaXJzdCBmZXcgdGltZXMsIGFuZCB0aGVuCisJICogZ29lcyB0byBxdWFkcmF0aWMuICBuZXRCU0QgZG91YmxlcywgYnV0IG9ubHkgZ29lcyB1cCB0byAqNjQsCisJICogYW5kIGNsYW1wcyBhdCAxIHRvIDY0IHNlYyBhZnRlcndhcmRzLiAgTm90ZSB0aGF0IDEyMCBzZWMgaXMKKwkgKiBkZWZpbmVkIGluIHRoZSBwcm90b2NvbCBhcyB0aGUgbWF4aW11bSBwb3NzaWJsZSBSVFQuICBJIGd1ZXNzCisJICogd2UnbGwgaGF2ZSB0byB1c2Ugc29tZXRoaW5nIG90aGVyIHRoYW4gVENQIHRvIHRhbGsgdG8gdGhlCisJICogVW5pdmVyc2l0eSBvZiBNYXJzLgorCSAqCisJICogUEFXUyBhbGxvd3MgdXMgbG9uZ2VyIHRpbWVvdXRzIGFuZCBsYXJnZSB3aW5kb3dzLCBzbyBvbmNlCisJICogaW1wbGVtZW50ZWQgZnRwIHRvIG1hcnMgd2lsbCB3b3JrIG5pY2VseS4gV2Ugd2lsbCBoYXZlIHRvIGZpeAorCSAqIHRoZSAxMjAgc2Vjb25kIGNsYW1wcyB0aG91Z2ghCisJICovCisJdHAtPmJhY2tvZmYrKzsKKwl0cC0+cmV0cmFuc21pdHMrKzsKKworb3V0X3Jlc2V0X3RpbWVyOgorCXRwLT5ydG8gPSBtaW4odHAtPnJ0byA8PCAxLCBUQ1BfUlRPX01BWCk7CisJdGNwX3Jlc2V0X3htaXRfdGltZXIoc2ssIFRDUF9USU1FX1JFVFJBTlMsIHRwLT5ydG8pOworCWlmICh0cC0+cmV0cmFuc21pdHMgPiBzeXNjdGxfdGNwX3JldHJpZXMxKQorCQlfX3NrX2RzdF9yZXNldChzayk7CisKK291dDo7Cit9CisKK3N0YXRpYyB2b2lkIHRjcF93cml0ZV90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHNvY2sgKnNrID0gKHN0cnVjdCBzb2NrKilkYXRhOworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCWludCBldmVudDsKKworCWJoX2xvY2tfc29jayhzayk7CisJaWYgKHNvY2tfb3duZWRfYnlfdXNlcihzaykpIHsKKwkJLyogVHJ5IGFnYWluIGxhdGVyICovCisJCXNrX3Jlc2V0X3RpbWVyKHNrLCAmdHAtPnJldHJhbnNtaXRfdGltZXIsIGppZmZpZXMgKyAoSFogLyAyMCkpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfQ0xPU0UgfHwgIXRwLT5wZW5kaW5nKQorCQlnb3RvIG91dDsKKworCWlmICh0aW1lX2FmdGVyKHRwLT50aW1lb3V0LCBqaWZmaWVzKSkgeworCQlza19yZXNldF90aW1lcihzaywgJnRwLT5yZXRyYW5zbWl0X3RpbWVyLCB0cC0+dGltZW91dCk7CisJCWdvdG8gb3V0OworCX0KKworCWV2ZW50ID0gdHAtPnBlbmRpbmc7CisJdHAtPnBlbmRpbmcgPSAwOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgVENQX1RJTUVfUkVUUkFOUzoKKwkJdGNwX3JldHJhbnNtaXRfdGltZXIoc2spOworCQlicmVhazsKKwljYXNlIFRDUF9USU1FX1BST0JFMDoKKwkJdGNwX3Byb2JlX3RpbWVyKHNrKTsKKwkJYnJlYWs7CisJfQorCVRDUF9DSEVDS19USU1FUihzayk7CisKK291dDoKKwlza19zdHJlYW1fbWVtX3JlY2xhaW0oc2spOworb3V0X3VubG9jazoKKwliaF91bmxvY2tfc29jayhzayk7CisJc29ja19wdXQoc2spOworfQorCisvKgorICoJVGltZXIgZm9yIGxpc3RlbmluZyBzb2NrZXRzCisgKi8KKworc3RhdGljIHZvaWQgdGNwX3N5bmFja190aW1lcihzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IHRjcF9saXN0ZW5fb3B0ICpsb3B0ID0gdHAtPmxpc3Rlbl9vcHQ7CisJaW50IG1heF9yZXRyaWVzID0gdHAtPnN5bl9yZXRyaWVzID8gOiBzeXNjdGxfdGNwX3N5bmFja19yZXRyaWVzOworCWludCB0aHJlc2ggPSBtYXhfcmV0cmllczsKKwl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisJc3RydWN0IG9wZW5fcmVxdWVzdCAqKnJlcXAsICpyZXE7CisJaW50IGksIGJ1ZGdldDsKKworCWlmIChsb3B0ID09IE5VTEwgfHwgbG9wdC0+cWxlbiA9PSAwKQorCQlyZXR1cm47CisKKwkvKiBOb3JtYWxseSBhbGwgdGhlIG9wZW5yZXFzIGFyZSB5b3VuZyBhbmQgYmVjb21lIG1hdHVyZQorCSAqIChpLmUuIGNvbnZlcnRlZCB0byBlc3RhYmxpc2hlZCBzb2NrZXQpIGZvciBmaXJzdCB0aW1lb3V0LgorCSAqIElmIHN5bmFjayB3YXMgbm90IGFja25vd2xlZGdlZCBmb3IgMyBzZWNvbmRzLCBpdCBtZWFucworCSAqIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRoaW5nczogc3luYWNrIHdhcyBsb3N0LCBhY2sgd2FzIGxvc3QsCisJICogcnR0IGlzIGhpZ2ggb3Igbm9ib2R5IHBsYW5uZWQgdG8gYWNrIChpLmUuIHN5bmZsb29kKS4KKwkgKiBXaGVuIHNlcnZlciBpcyBhIGJpdCBsb2FkZWQsIHF1ZXVlIGlzIHBvcHVsYXRlZCB3aXRoIG9sZAorCSAqIG9wZW4gcmVxdWVzdHMsIHJlZHVjaW5nIGVmZmVjdGl2ZSBzaXplIG9mIHF1ZXVlLgorCSAqIFdoZW4gc2VydmVyIGlzIHdlbGwgbG9hZGVkLCBxdWV1ZSBzaXplIHJlZHVjZXMgdG8gemVybworCSAqIGFmdGVyIHNldmVyYWwgbWludXRlcyBvZiB3b3JrLiBJdCBpcyBub3Qgc3luZmxvb2QsCisJICogaXQgaXMgbm9ybWFsIG9wZXJhdGlvbi4gVGhlIHNvbHV0aW9uIGlzIHBydW5pbmcKKwkgKiB0b28gb2xkIGVudHJpZXMgb3ZlcnJpZGluZyBub3JtYWwgdGltZW91dCwgd2hlbgorCSAqIHNpdHVhdGlvbiBiZWNvbWVzIGRhbmdlcm91cy4KKwkgKgorCSAqIEVzc2VudGlhbGx5LCB3ZSByZXNlcnZlIGhhbGYgb2Ygcm9vbSBmb3IgeW91bmcKKwkgKiBlbWJyaW9uczsgYW5kIGFib3J0IG9sZCBvbmVzIHdpdGhvdXQgcGl0eSwgaWYgb2xkCisJICogb25lcyBhcmUgYWJvdXQgdG8gY2xvZyBvdXIgdGFibGUuCisJICovCisJaWYgKGxvcHQtPnFsZW4+Pihsb3B0LT5tYXhfcWxlbl9sb2ctMSkpIHsKKwkJaW50IHlvdW5nID0gKGxvcHQtPnFsZW5feW91bmc8PDEpOworCisJCXdoaWxlICh0aHJlc2ggPiAyKSB7CisJCQlpZiAobG9wdC0+cWxlbiA8IHlvdW5nKQorCQkJCWJyZWFrOworCQkJdGhyZXNoLS07CisJCQl5b3VuZyA8PD0gMTsKKwkJfQorCX0KKworCWlmICh0cC0+ZGVmZXJfYWNjZXB0KQorCQltYXhfcmV0cmllcyA9IHRwLT5kZWZlcl9hY2NlcHQ7CisKKwlidWRnZXQgPSAyKihUQ1BfU1lOUV9IU0laRS8oVENQX1RJTUVPVVRfSU5JVC9UQ1BfU1lOUV9JTlRFUlZBTCkpOworCWkgPSBsb3B0LT5jbG9ja19oYW5kOworCisJZG8geworCQlyZXFwPSZsb3B0LT5zeW5fdGFibGVbaV07CisJCXdoaWxlICgocmVxID0gKnJlcXApICE9IE5VTEwpIHsKKwkJCWlmICh0aW1lX2FmdGVyX2VxKG5vdywgcmVxLT5leHBpcmVzKSkgeworCQkJCWlmICgocmVxLT5yZXRyYW5zIDwgdGhyZXNoIHx8CisJCQkJICAgICAocmVxLT5hY2tlZCAmJiByZXEtPnJldHJhbnMgPCBtYXhfcmV0cmllcykpCisJCQkJICAgICYmICFyZXEtPmNsYXNzLT5ydHhfc3luX2FjayhzaywgcmVxLCBOVUxMKSkgeworCQkJCQl1bnNpZ25lZCBsb25nIHRpbWVvOworCisJCQkJCWlmIChyZXEtPnJldHJhbnMrKyA9PSAwKQorCQkJCQkJbG9wdC0+cWxlbl95b3VuZy0tOworCQkJCQl0aW1lbyA9IG1pbigoVENQX1RJTUVPVVRfSU5JVCA8PCByZXEtPnJldHJhbnMpLAorCQkJCQkJICAgIFRDUF9SVE9fTUFYKTsKKwkJCQkJcmVxLT5leHBpcmVzID0gbm93ICsgdGltZW87CisJCQkJCXJlcXAgPSAmcmVxLT5kbF9uZXh0OworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQkvKiBEcm9wIHRoaXMgcmVxdWVzdCAqLworCQkJCXdyaXRlX2xvY2soJnRwLT5zeW5fd2FpdF9sb2NrKTsKKwkJCQkqcmVxcCA9IHJlcS0+ZGxfbmV4dDsKKwkJCQl3cml0ZV91bmxvY2soJnRwLT5zeW5fd2FpdF9sb2NrKTsKKwkJCQlsb3B0LT5xbGVuLS07CisJCQkJaWYgKHJlcS0+cmV0cmFucyA9PSAwKQorCQkJCQlsb3B0LT5xbGVuX3lvdW5nLS07CisJCQkJdGNwX29wZW5yZXFfZnJlZShyZXEpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcmVxcCA9ICZyZXEtPmRsX25leHQ7CisJCX0KKworCQlpID0gKGkrMSkmKFRDUF9TWU5RX0hTSVpFLTEpOworCisJfSB3aGlsZSAoLS1idWRnZXQgPiAwKTsKKworCWxvcHQtPmNsb2NrX2hhbmQgPSBpOworCisJaWYgKGxvcHQtPnFsZW4pCisJCXRjcF9yZXNldF9rZWVwYWxpdmVfdGltZXIoc2ssIFRDUF9TWU5RX0lOVEVSVkFMKTsKK30KKwordm9pZCB0Y3BfZGVsZXRlX2tlZXBhbGl2ZV90aW1lciAoc3RydWN0IHNvY2sgKnNrKQoreworCXNrX3N0b3BfdGltZXIoc2ssICZzay0+c2tfdGltZXIpOworfQorCit2b2lkIHRjcF9yZXNldF9rZWVwYWxpdmVfdGltZXIgKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJc2tfcmVzZXRfdGltZXIoc2ssICZzay0+c2tfdGltZXIsIGppZmZpZXMgKyBsZW4pOworfQorCit2b2lkIHRjcF9zZXRfa2VlcGFsaXZlKHN0cnVjdCBzb2NrICpzaywgaW50IHZhbCkKK3sKKwlpZiAoKDEgPDwgc2stPnNrX3N0YXRlKSAmIChUQ1BGX0NMT1NFIHwgVENQRl9MSVNURU4pKQorCQlyZXR1cm47CisKKwlpZiAodmFsICYmICFzb2NrX2ZsYWcoc2ssIFNPQ0tfS0VFUE9QRU4pKQorCQl0Y3BfcmVzZXRfa2VlcGFsaXZlX3RpbWVyKHNrLCBrZWVwYWxpdmVfdGltZV93aGVuKHRjcF9zayhzaykpKTsKKwllbHNlIGlmICghdmFsKQorCQl0Y3BfZGVsZXRlX2tlZXBhbGl2ZV90aW1lcihzayk7Cit9CisKKworc3RhdGljIHZvaWQgdGNwX2tlZXBhbGl2ZV90aW1lciAodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBzb2NrICpzayA9IChzdHJ1Y3Qgc29jayAqKSBkYXRhOworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCV9fdTMyIGVsYXBzZWQ7CisKKwkvKiBPbmx5IHByb2Nlc3MgaWYgc29ja2V0IGlzIG5vdCBpbiB1c2UuICovCisJYmhfbG9ja19zb2NrKHNrKTsKKwlpZiAoc29ja19vd25lZF9ieV91c2VyKHNrKSkgeworCQkvKiBUcnkgYWdhaW4gbGF0ZXIuICovIAorCQl0Y3BfcmVzZXRfa2VlcGFsaXZlX3RpbWVyIChzaywgSFovMjApOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9MSVNURU4pIHsKKwkJdGNwX3N5bmFja190aW1lcihzayk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0ZJTl9XQUlUMiAmJiBzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpIHsKKwkJaWYgKHRwLT5saW5nZXIyID49IDApIHsKKwkJCWludCB0bW8gPSB0Y3BfZmluX3RpbWUodHApIC0gVENQX1RJTUVXQUlUX0xFTjsKKworCQkJaWYgKHRtbyA+IDApIHsKKwkJCQl0Y3BfdGltZV93YWl0KHNrLCBUQ1BfRklOX1dBSVQyLCB0bW8pOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJCXRjcF9zZW5kX2FjdGl2ZV9yZXNldChzaywgR0ZQX0FUT01JQyk7CisJCWdvdG8gZGVhdGg7CisJfQorCisJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfS0VFUE9QRU4pIHx8IHNrLT5za19zdGF0ZSA9PSBUQ1BfQ0xPU0UpCisJCWdvdG8gb3V0OworCisJZWxhcHNlZCA9IGtlZXBhbGl2ZV90aW1lX3doZW4odHApOworCisJLyogSXQgaXMgYWxpdmUgd2l0aG91dCBrZWVwYWxpdmUgOCkgKi8KKwlpZiAodHAtPnBhY2tldHNfb3V0IHx8IHNrLT5za19zZW5kX2hlYWQpCisJCWdvdG8gcmVzY2hlZDsKKworCWVsYXBzZWQgPSB0Y3BfdGltZV9zdGFtcCAtIHRwLT5yY3ZfdHN0YW1wOworCisJaWYgKGVsYXBzZWQgPj0ga2VlcGFsaXZlX3RpbWVfd2hlbih0cCkpIHsKKwkJaWYgKCghdHAtPmtlZXBhbGl2ZV9wcm9iZXMgJiYgdHAtPnByb2Jlc19vdXQgPj0gc3lzY3RsX3RjcF9rZWVwYWxpdmVfcHJvYmVzKSB8fAorCQkgICAgICh0cC0+a2VlcGFsaXZlX3Byb2JlcyAmJiB0cC0+cHJvYmVzX291dCA+PSB0cC0+a2VlcGFsaXZlX3Byb2JlcykpIHsKKwkJCXRjcF9zZW5kX2FjdGl2ZV9yZXNldChzaywgR0ZQX0FUT01JQyk7CisJCQl0Y3Bfd3JpdGVfZXJyKHNrKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmICh0Y3Bfd3JpdGVfd2FrZXVwKHNrKSA8PSAwKSB7CisJCQl0cC0+cHJvYmVzX291dCsrOworCQkJZWxhcHNlZCA9IGtlZXBhbGl2ZV9pbnR2bF93aGVuKHRwKTsKKwkJfSBlbHNlIHsKKwkJCS8qIElmIGtlZXBhbGl2ZSB3YXMgbG9zdCBkdWUgdG8gbG9jYWwgY29uZ2VzdGlvbiwKKwkJCSAqIHRyeSBoYXJkZXIuCisJCQkgKi8KKwkJCWVsYXBzZWQgPSBUQ1BfUkVTT1VSQ0VfUFJPQkVfSU5URVJWQUw7CisJCX0KKwl9IGVsc2UgeworCQkvKiBJdCBpcyB0cC0+cmN2X3RzdGFtcCArIGtlZXBhbGl2ZV90aW1lX3doZW4odHApICovCisJCWVsYXBzZWQgPSBrZWVwYWxpdmVfdGltZV93aGVuKHRwKSAtIGVsYXBzZWQ7CisJfQorCisJVENQX0NIRUNLX1RJTUVSKHNrKTsKKwlza19zdHJlYW1fbWVtX3JlY2xhaW0oc2spOworCityZXNjaGVkOgorCXRjcF9yZXNldF9rZWVwYWxpdmVfdGltZXIgKHNrLCBlbGFwc2VkKTsKKwlnb3RvIG91dDsKKworZGVhdGg6CQorCXRjcF9kb25lKHNrKTsKKworb3V0OgorCWJoX3VubG9ja19zb2NrKHNrKTsKKwlzb2NrX3B1dChzayk7Cit9CisKK0VYUE9SVF9TWU1CT0wodGNwX2NsZWFyX3htaXRfdGltZXJzKTsKK0VYUE9SVF9TWU1CT0wodGNwX2RlbGV0ZV9rZWVwYWxpdmVfdGltZXIpOworRVhQT1JUX1NZTUJPTCh0Y3BfaW5pdF94bWl0X3RpbWVycyk7CitFWFBPUlRfU1lNQk9MKHRjcF9yZXNldF9rZWVwYWxpdmVfdGltZXIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdWRwLmMgYi9uZXQvaXB2NC91ZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmFkZGZiCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvdWRwLmMKQEAgLTAsMCArMSwxNTc1IEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCVRoZSBVc2VyIERhdGFncmFtIFByb3RvY29sIChVRFApLgorICoKKyAqIFZlcnNpb246CSRJZDogdWRwLmMsdiAxLjEwMiAyMDAyLzAyLzAxIDIyOjAxOjA0IGRhdmVtIEV4cCAkCisgKgorICogQXV0aG9yczoJUm9zcyBCaXJvLCA8YmlyN0BsZWxhbmQuU3RhbmZvcmQuRWR1PgorICoJCUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoJCUFybnQgR3VsYnJhbmRzZW4sIDxhZ3VsYnJhQG52Zy51bml0Lm5vPgorICoJCUFsYW4gQ294LCA8QWxhbi5Db3hAbGludXgub3JnPgorICoJCUhpcm9rYXp1IFRha2FoYXNoaSwgPHRha2FAdmFsaW51eC5jby5qcD4KKyAqCisgKiBGaXhlczoKKyAqCQlBbGFuIENveAk6CXZlcmlmeV9hcmVhKCkgY2FsbHMKKyAqCQlBbGFuIENveAk6IAlzdG9wcGVkIGNsb3NlIHdoaWxlIGluIHVzZSBvZmYgaWNtcAorICoJCQkJCW1lc3NhZ2VzLiBOb3QgYSBmaXggYnV0IGEgYm90Y2ggdGhhdAorICoJCQkJCWZvciB1ZHAgYXQgbGVhc3QgaXMgJ3ZhbGlkJy4KKyAqCQlBbGFuIENveAk6CUZpeGVkIGljbXAgaGFuZGxpbmcgcHJvcGVybHkKKyAqCQlBbGFuIENveAk6IAlDb3JyZWN0IGVycm9yIGZvciBvdmVyc2l6ZWQgZGF0YWdyYW1zCisgKgkJQWxhbiBDb3gJOglUaWRpZWQgc2VsZWN0KCkgc2VtYW50aWNzLiAKKyAqCQlBbGFuIENveAk6CXVkcF9lcnIoKSBmaXhlZCBwcm9wZXJseSwgYWxzbyBub3cgCisgKgkJCQkJc2VsZWN0IGFuZCByZWFkIHdha2UgY29ycmVjdGx5IG9uIGVycm9ycworICoJCUFsYW4gQ294CToJdWRwX3NlbmQgdmVyaWZ5X2FyZWEgbW92ZWQgdG8gYXZvaWQgbWVtIGxlYWsKKyAqCQlBbGFuIENveAk6CVVEUCBjYW4gY291bnQgaXRzIG1lbW9yeQorICoJCUFsYW4gQ294CToJc2VuZCB0byBhbiB1bmtub3duIGNvbm5lY3Rpb24gY2F1c2VzCisgKgkJCQkJYW4gRUNPTk5SRUZVU0VEIG9mZiB0aGUgaWNtcCwgYnV0CisgKgkJCQkJZG9lcyBOT1QgY2xvc2UuCisgKgkJQWxhbiBDb3gJOglTd2l0Y2hlZCB0byBuZXcgc2tfYnVmZiBoYW5kbGVycy4gTm8gbW9yZSBiYWNrbG9nIQorICoJCUFsYW4gQ294CToJVXNpbmcgZ2VuZXJpYyBkYXRhZ3JhbSBjb2RlLiBFdmVuIHNtYWxsZXIgYW5kIHRoZSBQRUVLCisgKgkJCQkJYnVnIG5vIGxvbmdlciBjcmFzaGVzIGl0LgorICoJCUZyZWQgVmFuIEtlbXBlbgk6IAlOZXQyZSBzdXBwb3J0IGZvciBzay0+YnJvYWRjYXN0LgorICoJCUFsYW4gQ294CToJVXNlcyBza2JfZnJlZV9kYXRhZ3JhbQorICoJCUFsYW4gQ294CToJQWRkZWQgZ2V0L3NldCBzb2Nrb3B0IHN1cHBvcnQuCisgKgkJQWxhbiBDb3gJOglCcm9hZGNhc3Rpbmcgd2l0aG91dCBvcHRpb24gc2V0IHJldHVybnMgRUFDQ0VTLgorICoJCUFsYW4gQ294CToJTm8gd2FrZXVwIGNhbGxzLiBJbnN0ZWFkIHdlIG5vdyB1c2UgdGhlIGNhbGxiYWNrcy4KKyAqCQlBbGFuIENveAk6CVVzZSBpcF90b3MgYW5kIGlwX3R0bAorICoJCUFsYW4gQ294CToJU05NUCBNaWJzCisgKgkJQWxhbiBDb3gJOglNU0dfRE9OVFJPVVRFLCBhbmQgMC4wLjAuMCBzdXBwb3J0LgorICoJCU1hdHQgRGlsbG9uCToJVURQIGxlbmd0aCBjaGVja3MuCisgKgkJQWxhbiBDb3gJOglTbWFydGVyIGFmX2luZXQgdXNlZCBwcm9wZXJseS4KKyAqCQlBbGFuIENveAk6CVVzZSBuZXcga2VybmVsIHNpZGUgYWRkcmVzc2luZy4KKyAqCQlBbGFuIENveAk6CUluY29ycmVjdCByZXR1cm4gb24gdHJ1bmNhdGVkIGRhdGFncmFtIHJlY2VpdmUuCisgKglBcm50IEd1bGJyYW5kc2VuIAk6CU5ldyB1ZHBfc2VuZCBhbmQgc3R1ZmYKKyAqCQlBbGFuIENveAk6CUNhY2hlIGxhc3Qgc29ja2V0CisgKgkJQWxhbiBDb3gJOglSb3V0ZSBjYWNoZQorICoJCUpvbiBQZWF0ZmllbGQJOglNaW5vciBlZmZpY2llbmN5IGZpeCB0byBzZW5kdG8oKS4KKyAqCQlNaWtlIFNoYXZlcgk6CVJGQzExMjIgY2hlY2tzLgorICoJCUFsYW4gQ294CToJTm9uYmxvY2tpbmcgZXJyb3IgZml4LgorICoJV2lsbHkgS29ueW5lbmJlcmcJOglUcmFuc3BhcmVudCBwcm94eWluZyBzdXBwb3J0LgorICoJCU1pa2UgTWNMYWdhbgk6CVJvdXRpbmcgYnkgc291cmNlCisgKgkJRGF2aWQgUy4gTWlsbGVyCToJTmV3IHNvY2tldCBsb29rdXAgYXJjaGl0ZWN0dXJlLgorICoJCQkJCUxhc3Qgc29ja2V0IGNhY2hlIHJldGFpbmVkIGFzIGl0CisgKgkJCQkJZG9lcyBoYXZlIGEgaGlnaCBoaXQgcmF0ZS4KKyAqCQlPbGFmIEtpcmNoCToJRG9uJ3QgbGluZWFyaXNlIGlvdmVjIG9uIHNlbmRtc2cuCisgKgkJQW5kaSBLbGVlbgk6CVNvbWUgY2xlYW51cHMsIGNhY2hlIGRlc3RpbmF0aW9uIGVudHJ5CisgKgkJCQkJZm9yIGNvbm5lY3QuIAorICoJVml0YWx5IEUuIExhdnJvdgk6CVRyYW5zcGFyZW50IHByb3h5IHJldml2ZWQgYWZ0ZXIgeWVhciBjb21hLgorICoJCU1lbHZpbiBTbWl0aAk6CUNoZWNrIG1zZ19uYW1lIG5vdCBtc2dfbmFtZWxlbiBpbiBzZW5kdG8oKSwKKyAqCQkJCQlyZXR1cm4gRU5PVENPTk4gZm9yIHVuY29ubmVjdGVkIHNvY2tldHMgKFBPU0lYKQorICoJCUphbm9zIEZhcmthcwk6CWRvbid0IGRlbGl2ZXIgbXVsdGkvYnJvYWRjYXN0cyB0byBhIGRpZmZlcmVudAorICoJCQkJCWJvdW5kLXRvLWRldmljZSBzb2NrZXQKKyAqCUhpcm9rYXp1IFRha2FoYXNoaQk6CUhXIGNoZWNrc3VtbWluZyBmb3Igb3V0Z29pbmcgVURQCisgKgkJCQkJZGF0YWdyYW1zLgorICoJSGlyb2thenUgVGFrYWhhc2hpCToJc2VuZGZpbGUoKSBvbiBVRFAgd29ya3Mgbm93LgorICoJCUFybmFsZG8gQy4gTWVsbyA6CWNvbnZlcnQgL3Byb2MvbmV0L3VkcCB0byBzZXFfZmlsZQorICoJWU9TSElGVUpJIEhpZGVha2kgQFVTQUdJIGFuZDoJU3VwcG9ydCBJUFY2X1Y2T05MWSBzb2NrZXQgb3B0aW9uLCB3aGljaAorICoJQWxleGV5IEt1em5ldHNvdjoJCWFsbG93IGJvdGggSVB2NCBhbmQgSVB2NiBzb2NrZXRzIHRvIGJpbmQKKyAqCQkJCQlhIHNpbmdsZSBwb3J0IGF0IHRoZSBzYW1lIHRpbWUuCisgKglEZXJlayBBdGtpbnMgPGRlcmVrQGlodGZwLmNvbT46IEFkZCBFbmNhcHVsYXRpb24gU3VwcG9ydAorICoKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworIAorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvc25tcC5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC91ZHAuaD4KKyNpbmNsdWRlIDxuZXQvaWNtcC5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPG5ldC9pbmV0X2NvbW1vbi5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorI2luY2x1ZGUgPG5ldC94ZnJtLmg+CisKKy8qCisgKglTbm1wIE1JQiBmb3IgdGhlIFVEUCBsYXllcgorICovCisKK0RFRklORV9TTk1QX1NUQVQoc3RydWN0IHVkcF9taWIsIHVkcF9zdGF0aXN0aWNzKTsKKworc3RydWN0IGhsaXN0X2hlYWQgdWRwX2hhc2hbVURQX0hUQUJMRV9TSVpFXTsKK0RFRklORV9SV0xPQ0sodWRwX2hhc2hfbG9jayk7CisKKy8qIFNoYXJlZCBieSB2NC92NiB1ZHAuICovCitpbnQgdWRwX3BvcnRfcm92ZXI7CisKK3N0YXRpYyBpbnQgdWRwX3Y0X2dldF9wb3J0KHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgc2hvcnQgc251bSkKK3sKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlzdHJ1Y3Qgc29jayAqc2syOworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKworCXdyaXRlX2xvY2tfYmgoJnVkcF9oYXNoX2xvY2spOworCWlmIChzbnVtID09IDApIHsKKwkJaW50IGJlc3Rfc2l6ZV9zb19mYXIsIGJlc3QsIHJlc3VsdCwgaTsKKworCQlpZiAodWRwX3BvcnRfcm92ZXIgPiBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVsxXSB8fAorCQkgICAgdWRwX3BvcnRfcm92ZXIgPCBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVswXSkKKwkJCXVkcF9wb3J0X3JvdmVyID0gc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMF07CisJCWJlc3Rfc2l6ZV9zb19mYXIgPSAzMjc2NzsKKwkJYmVzdCA9IHJlc3VsdCA9IHVkcF9wb3J0X3JvdmVyOworCQlmb3IgKGkgPSAwOyBpIDwgVURQX0hUQUJMRV9TSVpFOyBpKyssIHJlc3VsdCsrKSB7CisJCQlzdHJ1Y3QgaGxpc3RfaGVhZCAqbGlzdDsKKwkJCWludCBzaXplOworCisJCQlsaXN0ID0gJnVkcF9oYXNoW3Jlc3VsdCAmIChVRFBfSFRBQkxFX1NJWkUgLSAxKV07CisJCQlpZiAoaGxpc3RfZW1wdHkobGlzdCkpIHsKKwkJCQlpZiAocmVzdWx0ID4gc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMV0pCisJCQkJCXJlc3VsdCA9IHN5c2N0bF9sb2NhbF9wb3J0X3JhbmdlWzBdICsKKwkJCQkJCSgocmVzdWx0IC0gc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMF0pICYKKwkJCQkJCSAoVURQX0hUQUJMRV9TSVpFIC0gMSkpOworCQkJCWdvdG8gZ290aXQ7CisJCQl9CisJCQlzaXplID0gMDsKKwkJCXNrX2Zvcl9lYWNoKHNrMiwgbm9kZSwgbGlzdCkKKwkJCQlpZiAoKytzaXplID49IGJlc3Rfc2l6ZV9zb19mYXIpCisJCQkJCWdvdG8gbmV4dDsKKwkJCWJlc3Rfc2l6ZV9zb19mYXIgPSBzaXplOworCQkJYmVzdCA9IHJlc3VsdDsKKwkJbmV4dDo7CisJCX0KKwkJcmVzdWx0ID0gYmVzdDsKKwkJZm9yKGkgPSAwOyBpIDwgKDEgPDwgMTYpIC8gVURQX0hUQUJMRV9TSVpFOyBpKyssIHJlc3VsdCArPSBVRFBfSFRBQkxFX1NJWkUpIHsKKwkJCWlmIChyZXN1bHQgPiBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVsxXSkKKwkJCQlyZXN1bHQgPSBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVswXQorCQkJCQkrICgocmVzdWx0IC0gc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMF0pICYKKwkJCQkJICAgKFVEUF9IVEFCTEVfU0laRSAtIDEpKTsKKwkJCWlmICghdWRwX2xwb3J0X2ludXNlKHJlc3VsdCkpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgPj0gKDEgPDwgMTYpIC8gVURQX0hUQUJMRV9TSVpFKQorCQkJZ290byBmYWlsOworZ290aXQ6CisJCXVkcF9wb3J0X3JvdmVyID0gc251bSA9IHJlc3VsdDsKKwl9IGVsc2UgeworCQlza19mb3JfZWFjaChzazIsIG5vZGUsCisJCQkgICAgJnVkcF9oYXNoW3NudW0gJiAoVURQX0hUQUJMRV9TSVpFIC0gMSldKSB7CisJCQlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0MiA9IGluZXRfc2soc2syKTsKKworCQkJaWYgKGluZXQyLT5udW0gPT0gc251bSAmJgorCQkJICAgIHNrMiAhPSBzayAmJgorCQkJICAgICFpcHY2X29ubHlfc29jayhzazIpICYmCisJCQkgICAgKCFzazItPnNrX2JvdW5kX2Rldl9pZiB8fAorCQkJICAgICAhc2stPnNrX2JvdW5kX2Rldl9pZiB8fAorCQkJICAgICBzazItPnNrX2JvdW5kX2Rldl9pZiA9PSBzay0+c2tfYm91bmRfZGV2X2lmKSAmJgorCQkJICAgICghaW5ldDItPnJjdl9zYWRkciB8fAorCQkJICAgICAhaW5ldC0+cmN2X3NhZGRyIHx8CisJCQkgICAgIGluZXQyLT5yY3Zfc2FkZHIgPT0gaW5ldC0+cmN2X3NhZGRyKSAmJgorCQkJICAgICghc2syLT5za19yZXVzZSB8fCAhc2stPnNrX3JldXNlKSkKKwkJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisJaW5ldC0+bnVtID0gc251bTsKKwlpZiAoc2tfdW5oYXNoZWQoc2spKSB7CisJCXN0cnVjdCBobGlzdF9oZWFkICpoID0gJnVkcF9oYXNoW3NudW0gJiAoVURQX0hUQUJMRV9TSVpFIC0gMSldOworCisJCXNrX2FkZF9ub2RlKHNrLCBoKTsKKwkJc29ja19wcm90X2luY191c2Uoc2stPnNrX3Byb3QpOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJnVkcF9oYXNoX2xvY2spOworCXJldHVybiAwOworCitmYWlsOgorCXdyaXRlX3VubG9ja19iaCgmdWRwX2hhc2hfbG9jayk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHVkcF92NF9oYXNoKHN0cnVjdCBzb2NrICpzaykKK3sKKwlCVUcoKTsKK30KKworc3RhdGljIHZvaWQgdWRwX3Y0X3VuaGFzaChzdHJ1Y3Qgc29jayAqc2spCit7CisJd3JpdGVfbG9ja19iaCgmdWRwX2hhc2hfbG9jayk7CisJaWYgKHNrX2RlbF9ub2RlX2luaXQoc2spKSB7CisJCWluZXRfc2soc2spLT5udW0gPSAwOworCQlzb2NrX3Byb3RfZGVjX3VzZShzay0+c2tfcHJvdCk7CisJfQorCXdyaXRlX3VubG9ja19iaCgmdWRwX2hhc2hfbG9jayk7Cit9CisKKy8qIFVEUCBpcyBuZWFybHkgYWx3YXlzIHdpbGRjYXJkcyBvdXQgdGhlIHdhem9vLCBpdCBtYWtlcyBubyBzZW5zZSB0byB0cnkKKyAqIGhhcmRlciB0aGFuIHRoaXMuIC1EYXZlTQorICovCitzdGF0aWMgc3RydWN0IHNvY2sgKnVkcF92NF9sb29rdXBfbG9uZ3dheSh1MzIgc2FkZHIsIHUxNiBzcG9ydCwKKwkJCQkJICB1MzIgZGFkZHIsIHUxNiBkcG9ydCwgaW50IGRpZikKK3sKKwlzdHJ1Y3Qgc29jayAqc2ssICpyZXN1bHQgPSBOVUxMOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXVuc2lnbmVkIHNob3J0IGhudW0gPSBudG9ocyhkcG9ydCk7CisJaW50IGJhZG5lc3MgPSAtMTsKKworCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmdWRwX2hhc2hbaG51bSAmIChVRFBfSFRBQkxFX1NJWkUgLSAxKV0pIHsKKwkJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCisJCWlmIChpbmV0LT5udW0gPT0gaG51bSAmJiAhaXB2Nl9vbmx5X3NvY2soc2spKSB7CisJCQlpbnQgc2NvcmUgPSAoc2stPnNrX2ZhbWlseSA9PSBQRl9JTkVUID8gMSA6IDApOworCQkJaWYgKGluZXQtPnJjdl9zYWRkcikgeworCQkJCWlmIChpbmV0LT5yY3Zfc2FkZHIgIT0gZGFkZHIpCisJCQkJCWNvbnRpbnVlOworCQkJCXNjb3JlKz0yOworCQkJfQorCQkJaWYgKGluZXQtPmRhZGRyKSB7CisJCQkJaWYgKGluZXQtPmRhZGRyICE9IHNhZGRyKQorCQkJCQljb250aW51ZTsKKwkJCQlzY29yZSs9MjsKKwkJCX0KKwkJCWlmIChpbmV0LT5kcG9ydCkgeworCQkJCWlmIChpbmV0LT5kcG9ydCAhPSBzcG9ydCkKKwkJCQkJY29udGludWU7CisJCQkJc2NvcmUrPTI7CisJCQl9CisJCQlpZiAoc2stPnNrX2JvdW5kX2Rldl9pZikgeworCQkJCWlmIChzay0+c2tfYm91bmRfZGV2X2lmICE9IGRpZikKKwkJCQkJY29udGludWU7CisJCQkJc2NvcmUrPTI7CisJCQl9CisJCQlpZihzY29yZSA9PSA5KSB7CisJCQkJcmVzdWx0ID0gc2s7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYoc2NvcmUgPiBiYWRuZXNzKSB7CisJCQkJcmVzdWx0ID0gc2s7CisJCQkJYmFkbmVzcyA9IHNjb3JlOworCQkJfQorCQl9CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBzb2NrICp1ZHBfdjRfbG9va3VwKHUzMiBzYWRkciwgdTE2IHNwb3J0LAorCQkJCQkgICAgIHUzMiBkYWRkciwgdTE2IGRwb3J0LCBpbnQgZGlmKQoreworCXN0cnVjdCBzb2NrICpzazsKKworCXJlYWRfbG9jaygmdWRwX2hhc2hfbG9jayk7CisJc2sgPSB1ZHBfdjRfbG9va3VwX2xvbmd3YXkoc2FkZHIsIHNwb3J0LCBkYWRkciwgZHBvcnQsIGRpZik7CisJaWYgKHNrKQorCQlzb2NrX2hvbGQoc2spOworCXJlYWRfdW5sb2NrKCZ1ZHBfaGFzaF9sb2NrKTsKKwlyZXR1cm4gc2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2sgKnVkcF92NF9tY2FzdF9uZXh0KHN0cnVjdCBzb2NrICpzaywKKwkJCQkJICAgICB1MTYgbG9jX3BvcnQsIHUzMiBsb2NfYWRkciwKKwkJCQkJICAgICB1MTYgcm10X3BvcnQsIHUzMiBybXRfYWRkciwKKwkJCQkJICAgICBpbnQgZGlmKQoreworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXN0cnVjdCBzb2NrICpzID0gc2s7CisJdW5zaWduZWQgc2hvcnQgaG51bSA9IG50b2hzKGxvY19wb3J0KTsKKworCXNrX2Zvcl9lYWNoX2Zyb20ocywgbm9kZSkgeworCQlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzKTsKKworCQlpZiAoaW5ldC0+bnVtICE9IGhudW0JCQkJCXx8CisJCSAgICAoaW5ldC0+ZGFkZHIgJiYgaW5ldC0+ZGFkZHIgIT0gcm10X2FkZHIpCQl8fAorCQkgICAgKGluZXQtPmRwb3J0ICE9IHJtdF9wb3J0ICYmIGluZXQtPmRwb3J0KQkJfHwKKwkJICAgIChpbmV0LT5yY3Zfc2FkZHIgJiYgaW5ldC0+cmN2X3NhZGRyICE9IGxvY19hZGRyKQl8fAorCQkgICAgaXB2Nl9vbmx5X3NvY2socykJCQkJCXx8CisJCSAgICAocy0+c2tfYm91bmRfZGV2X2lmICYmIHMtPnNrX2JvdW5kX2Rldl9pZiAhPSBkaWYpKQorCQkJY29udGludWU7CisJCWlmICghaXBfbWNfc2ZfYWxsb3cocywgbG9jX2FkZHIsIHJtdF9hZGRyLCBkaWYpKQorCQkJY29udGludWU7CisJCWdvdG8gZm91bmQ7CisgIAl9CisJcyA9IE5VTEw7Citmb3VuZDoKKyAgCXJldHVybiBzOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgSUNNUCBtb2R1bGUgd2hlbiBpdCBnZXRzIHNvbWUKKyAqIHNvcnQgb2YgZXJyb3IgY29uZGl0aW9uLiAgSWYgZXJyIDwgMCB0aGVuIHRoZSBzb2NrZXQgc2hvdWxkCisgKiBiZSBjbG9zZWQgYW5kIHRoZSBlcnJvciByZXR1cm5lZCB0byB0aGUgdXNlci4gIElmIGVyciA+IDAKKyAqIGl0J3MganVzdCB0aGUgaWNtcCB0eXBlIDw8IDggfCBpY21wIGNvZGUuICAKKyAqIEhlYWRlciBwb2ludHMgdG8gdGhlIGlwIGhlYWRlciBvZiB0aGUgZXJyb3IgcGFja2V0LiBXZSBtb3ZlCisgKiBvbiBwYXN0IHRoaXMuIFRoZW4gKGFzIGl0IHVzZWQgdG8gY2xhaW0gYmVmb3JlIGFkanVzdG1lbnQpCisgKiBoZWFkZXIgcG9pbnRzIHRvIHRoZSBmaXJzdCA4IGJ5dGVzIG9mIHRoZSB1ZHAgaGVhZGVyLiAgV2UgbmVlZAorICogdG8gZmluZCB0aGUgYXBwcm9wcmlhdGUgcG9ydC4KKyAqLworCit2b2lkIHVkcF9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGluZm8pCit7CisJc3RydWN0IGluZXRfc29jayAqaW5ldDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IChzdHJ1Y3QgaXBoZHIqKXNrYi0+ZGF0YTsKKwlzdHJ1Y3QgdWRwaGRyICp1aCA9IChzdHJ1Y3QgdWRwaGRyKikoc2tiLT5kYXRhKyhpcGgtPmlobDw8MikpOworCWludCB0eXBlID0gc2tiLT5oLmljbXBoLT50eXBlOworCWludCBjb2RlID0gc2tiLT5oLmljbXBoLT5jb2RlOworCXN0cnVjdCBzb2NrICpzazsKKwlpbnQgaGFyZGVycjsKKwlpbnQgZXJyOworCisJc2sgPSB1ZHBfdjRfbG9va3VwKGlwaC0+ZGFkZHIsIHVoLT5kZXN0LCBpcGgtPnNhZGRyLCB1aC0+c291cmNlLCBza2ItPmRldi0+aWZpbmRleCk7CisJaWYgKHNrID09IE5VTEwpIHsKKwkJSUNNUF9JTkNfU1RBVFNfQkgoSUNNUF9NSUJfSU5FUlJPUlMpOworICAgIAkgIAlyZXR1cm47CS8qIE5vIHNvY2tldCBmb3IgZXJyb3IgKi8KKwl9CisKKwllcnIgPSAwOworCWhhcmRlcnIgPSAwOworCWluZXQgPSBpbmV0X3NrKHNrKTsKKworCXN3aXRjaCAodHlwZSkgeworCWRlZmF1bHQ6CisJY2FzZSBJQ01QX1RJTUVfRVhDRUVERUQ6CisJCWVyciA9IEVIT1NUVU5SRUFDSDsKKwkJYnJlYWs7CisJY2FzZSBJQ01QX1NPVVJDRV9RVUVOQ0g6CisJCWdvdG8gb3V0OworCWNhc2UgSUNNUF9QQVJBTUVURVJQUk9COgorCQllcnIgPSBFUFJPVE87CisJCWhhcmRlcnIgPSAxOworCQlicmVhazsKKwljYXNlIElDTVBfREVTVF9VTlJFQUNIOgorCQlpZiAoY29kZSA9PSBJQ01QX0ZSQUdfTkVFREVEKSB7IC8qIFBhdGggTVRVIGRpc2NvdmVyeSAqLworCQkJaWYgKGluZXQtPnBtdHVkaXNjICE9IElQX1BNVFVESVNDX0RPTlQpIHsKKwkJCQllcnIgPSBFTVNHU0laRTsKKwkJCQloYXJkZXJyID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWdvdG8gb3V0OworCQl9CisJCWVyciA9IEVIT1NUVU5SRUFDSDsKKwkJaWYgKGNvZGUgPD0gTlJfSUNNUF9VTlJFQUNIKSB7CisJCQloYXJkZXJyID0gaWNtcF9lcnJfY29udmVydFtjb2RlXS5mYXRhbDsKKwkJCWVyciA9IGljbXBfZXJyX2NvbnZlcnRbY29kZV0uZXJybm87CisJCX0KKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiAgICAgIFJGQzExMjI6IE9LLiAgUGFzc2VzIElDTVAgZXJyb3JzIGJhY2sgdG8gYXBwbGljYXRpb24sIGFzIHBlciAKKwkgKgk0LjEuMy4zLgorCSAqLworCWlmICghaW5ldC0+cmVjdmVycikgeworCQlpZiAoIWhhcmRlcnIgfHwgc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkKKwkJCWdvdG8gb3V0OworCX0gZWxzZSB7CisJCWlwX2ljbXBfZXJyb3Ioc2ssIHNrYiwgZXJyLCB1aC0+ZGVzdCwgaW5mbywgKHU4KikodWgrMSkpOworCX0KKwlzay0+c2tfZXJyID0gZXJyOworCXNrLT5za19lcnJvcl9yZXBvcnQoc2spOworb3V0OgorCXNvY2tfcHV0KHNrKTsKK30KKworLyoKKyAqIFRocm93IGF3YXkgYWxsIHBlbmRpbmcgZGF0YSBhbmQgY2FuY2VsIHRoZSBjb3JraW5nLiBTb2NrZXQgaXMgbG9ja2VkLgorICovCitzdGF0aWMgdm9pZCB1ZHBfZmx1c2hfcGVuZGluZ19mcmFtZXMoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB1ZHBfc29jayAqdXAgPSB1ZHBfc2soc2spOworCisJaWYgKHVwLT5wZW5kaW5nKSB7CisJCXVwLT5sZW4gPSAwOworCQl1cC0+cGVuZGluZyA9IDA7CisJCWlwX2ZsdXNoX3BlbmRpbmdfZnJhbWVzKHNrKTsKKwl9Cit9CisKKy8qCisgKiBQdXNoIG91dCBhbGwgcGVuZGluZyBkYXRhIGFzIG9uZSBVRFAgZGF0YWdyYW0uIFNvY2tldCBpcyBsb2NrZWQuCisgKi8KK3N0YXRpYyBpbnQgdWRwX3B1c2hfcGVuZGluZ19mcmFtZXMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdWRwX3NvY2sgKnVwKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlzdHJ1Y3QgZmxvd2kgKmZsID0gJmluZXQtPmNvcmsuZmw7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgdWRwaGRyICp1aDsKKwlpbnQgZXJyID0gMDsKKworCS8qIEdyYWIgdGhlIHNrYnVmZiB3aGVyZSBVRFAgaGVhZGVyIHNwYWNlIGV4aXN0cy4gKi8KKwlpZiAoKHNrYiA9IHNrYl9wZWVrKCZzay0+c2tfd3JpdGVfcXVldWUpKSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCS8qCisJICogQ3JlYXRlIGEgVURQIGhlYWRlcgorCSAqLworCXVoID0gc2tiLT5oLnVoOworCXVoLT5zb3VyY2UgPSBmbC0+ZmxfaXBfc3BvcnQ7CisJdWgtPmRlc3QgPSBmbC0+ZmxfaXBfZHBvcnQ7CisJdWgtPmxlbiA9IGh0b25zKHVwLT5sZW4pOworCXVoLT5jaGVjayA9IDA7CisKKwlpZiAoc2stPnNrX25vX2NoZWNrID09IFVEUF9DU1VNX05PWE1JVCkgeworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCWdvdG8gc2VuZDsKKwl9CisKKwlpZiAoc2tiX3F1ZXVlX2xlbigmc2stPnNrX3dyaXRlX3F1ZXVlKSA9PSAxKSB7CisJCS8qCisJCSAqIE9ubHkgb25lIGZyYWdtZW50IG9uIHRoZSBzb2NrZXQuCisJCSAqLworCQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpIHsKKwkJCXNrYi0+Y3N1bSA9IG9mZnNldG9mKHN0cnVjdCB1ZHBoZHIsIGNoZWNrKTsKKwkJCXVoLT5jaGVjayA9IH5jc3VtX3RjcHVkcF9tYWdpYyhmbC0+Zmw0X3NyYywgZmwtPmZsNF9kc3QsCisJCQkJCXVwLT5sZW4sIElQUFJPVE9fVURQLCAwKTsKKwkJfSBlbHNlIHsKKwkJCXNrYi0+Y3N1bSA9IGNzdW1fcGFydGlhbCgoY2hhciAqKXVoLAorCQkJCQlzaXplb2Yoc3RydWN0IHVkcGhkciksIHNrYi0+Y3N1bSk7CisJCQl1aC0+Y2hlY2sgPSBjc3VtX3RjcHVkcF9tYWdpYyhmbC0+Zmw0X3NyYywgZmwtPmZsNF9kc3QsCisJCQkJCXVwLT5sZW4sIElQUFJPVE9fVURQLCBza2ItPmNzdW0pOworCQkJaWYgKHVoLT5jaGVjayA9PSAwKQorCQkJCXVoLT5jaGVjayA9IC0xOworCQl9CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgaW50IGNzdW0gPSAwOworCQkvKgorCQkgKiBIVy1jaGVja3N1bSB3b24ndCB3b3JrIGFzIHRoZXJlIGFyZSB0d28gb3IgbW9yZSAKKwkJICogZnJhZ21lbnRzIG9uIHRoZSBzb2NrZXQgc28gdGhhdCBhbGwgY3N1bXMgb2Ygc2tfYnVmZnMKKwkJICogc2hvdWxkIGJlIHRvZ2V0aGVyLgorCQkgKi8KKwkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSB7CisJCQlpbnQgb2Zmc2V0ID0gKHVuc2lnbmVkIGNoYXIgKil1aCAtIHNrYi0+ZGF0YTsKKwkJCXNrYi0+Y3N1bSA9IHNrYl9jaGVja3N1bShza2IsIG9mZnNldCwgc2tiLT5sZW4gLSBvZmZzZXQsIDApOworCisJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCX0gZWxzZSB7CisJCQlza2ItPmNzdW0gPSBjc3VtX3BhcnRpYWwoKGNoYXIgKil1aCwKKwkJCQkJc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLCBza2ItPmNzdW0pOworCQl9CisKKwkJc2tiX3F1ZXVlX3dhbGsoJnNrLT5za193cml0ZV9xdWV1ZSwgc2tiKSB7CisJCQljc3VtID0gY3N1bV9hZGQoY3N1bSwgc2tiLT5jc3VtKTsKKwkJfQorCQl1aC0+Y2hlY2sgPSBjc3VtX3RjcHVkcF9tYWdpYyhmbC0+Zmw0X3NyYywgZmwtPmZsNF9kc3QsCisJCQkJdXAtPmxlbiwgSVBQUk9UT19VRFAsIGNzdW0pOworCQlpZiAodWgtPmNoZWNrID09IDApCisJCQl1aC0+Y2hlY2sgPSAtMTsKKwl9CitzZW5kOgorCWVyciA9IGlwX3B1c2hfcGVuZGluZ19mcmFtZXMoc2spOworb3V0OgorCXVwLT5sZW4gPSAwOworCXVwLT5wZW5kaW5nID0gMDsKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB1ZHBfY2hlY2soc3RydWN0IHVkcGhkciAqdWgsIGludCBsZW4sIHVuc2lnbmVkIGxvbmcgc2FkZHIsIHVuc2lnbmVkIGxvbmcgZGFkZHIsIHVuc2lnbmVkIGxvbmcgYmFzZSkKK3sKKwlyZXR1cm4oY3N1bV90Y3B1ZHBfbWFnaWMoc2FkZHIsIGRhZGRyLCBsZW4sIElQUFJPVE9fVURQLCBiYXNlKSk7Cit9CisKK2ludCB1ZHBfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlzdHJ1Y3QgdWRwX3NvY2sgKnVwID0gdWRwX3NrKHNrKTsKKwlpbnQgdWxlbiA9IGxlbjsKKwlzdHJ1Y3QgaXBjbV9jb29raWUgaXBjOworCXN0cnVjdCBydGFibGUgKnJ0ID0gTlVMTDsKKwlpbnQgZnJlZSA9IDA7CisJaW50IGNvbm5lY3RlZCA9IDA7CisJdTMyIGRhZGRyLCBmYWRkciwgc2FkZHI7CisJdTE2IGRwb3J0OworCXU4ICB0b3M7CisJaW50IGVycjsKKwlpbnQgY29ya3JlcSA9IHVwLT5jb3JrZmxhZyB8fCBtc2ctPm1zZ19mbGFncyZNU0dfTU9SRTsKKworCWlmIChsZW4gPiAweEZGRkYpCisJCXJldHVybiAtRU1TR1NJWkU7CisKKwkvKiAKKwkgKglDaGVjayB0aGUgZmxhZ3MuCisJICovCisKKwlpZiAobXNnLT5tc2dfZmxhZ3MmTVNHX09PQikJLyogTWlycm9yIEJTRCBlcnJvciBtZXNzYWdlIGNvbXBhdGliaWxpdHkgKi8KKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaXBjLm9wdCA9IE5VTEw7CisKKwlpZiAodXAtPnBlbmRpbmcpIHsKKwkJLyoKKwkJICogVGhlcmUgYXJlIHBlbmRpbmcgZnJhbWVzLgorCSAJICogVGhlIHNvY2tldCBsb2NrIG11c3QgYmUgaGVsZCB3aGlsZSBpdCdzIGNvcmtlZC4KKwkJICovCisJCWxvY2tfc29jayhzayk7CisJCWlmIChsaWtlbHkodXAtPnBlbmRpbmcpKSB7CisJCQlpZiAodW5saWtlbHkodXAtPnBlbmRpbmcgIT0gQUZfSU5FVCkpIHsKKwkJCQlyZWxlYXNlX3NvY2soc2spOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorIAkJCWdvdG8gZG9fYXBwZW5kX2RhdGE7CisJCX0KKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwl9CisJdWxlbiArPSBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisKKwkvKgorCSAqCUdldCBhbmQgdmVyaWZ5IHRoZSBhZGRyZXNzLiAKKwkgKi8KKwlpZiAobXNnLT5tc2dfbmFtZSkgeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKiB1c2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiopbXNnLT5tc2dfbmFtZTsKKwkJaWYgKG1zZy0+bXNnX25hbWVsZW4gPCBzaXplb2YoKnVzaW4pKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICh1c2luLT5zaW5fZmFtaWx5ICE9IEFGX0lORVQpIHsKKwkJCWlmICh1c2luLT5zaW5fZmFtaWx5ICE9IEFGX1VOU1BFQykKKwkJCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKKwkJfQorCisJCWRhZGRyID0gdXNpbi0+c2luX2FkZHIuc19hZGRyOworCQlkcG9ydCA9IHVzaW4tPnNpbl9wb3J0OworCQlpZiAoZHBvcnQgPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKQorCQkJcmV0dXJuIC1FREVTVEFERFJSRVE7CisJCWRhZGRyID0gaW5ldC0+ZGFkZHI7CisJCWRwb3J0ID0gaW5ldC0+ZHBvcnQ7CisJCS8qIE9wZW4gZmFzdCBwYXRoIGZvciBjb25uZWN0ZWQgc29ja2V0LgorCQkgICBSb3V0ZSB3aWxsIG5vdCBiZSB1c2VkLCBpZiBhdCBsZWFzdCBvbmUgb3B0aW9uIGlzIHNldC4KKwkJICovCisJCWNvbm5lY3RlZCA9IDE7CisgIAl9CisJaXBjLmFkZHIgPSBpbmV0LT5zYWRkcjsKKworCWlwYy5vaWYgPSBzay0+c2tfYm91bmRfZGV2X2lmOworCWlmIChtc2ctPm1zZ19jb250cm9sbGVuKSB7CisJCWVyciA9IGlwX2Ntc2dfc2VuZChtc2csICZpcGMpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKGlwYy5vcHQpCisJCQlmcmVlID0gMTsKKwkJY29ubmVjdGVkID0gMDsKKwl9CisJaWYgKCFpcGMub3B0KQorCQlpcGMub3B0ID0gaW5ldC0+b3B0OworCisJc2FkZHIgPSBpcGMuYWRkcjsKKwlpcGMuYWRkciA9IGZhZGRyID0gZGFkZHI7CisKKwlpZiAoaXBjLm9wdCAmJiBpcGMub3B0LT5zcnIpIHsKKwkJaWYgKCFkYWRkcikKKwkJCXJldHVybiAtRUlOVkFMOworCQlmYWRkciA9IGlwYy5vcHQtPmZhZGRyOworCQljb25uZWN0ZWQgPSAwOworCX0KKwl0b3MgPSBSVF9UT1MoaW5ldC0+dG9zKTsKKwlpZiAoc29ja19mbGFnKHNrLCBTT0NLX0xPQ0FMUk9VVEUpIHx8CisJICAgIChtc2ctPm1zZ19mbGFncyAmIE1TR19ET05UUk9VVEUpIHx8IAorCSAgICAoaXBjLm9wdCAmJiBpcGMub3B0LT5pc19zdHJpY3Ryb3V0ZSkpIHsKKwkJdG9zIHw9IFJUT19PTkxJTks7CisJCWNvbm5lY3RlZCA9IDA7CisJfQorCisJaWYgKE1VTFRJQ0FTVChkYWRkcikpIHsKKwkJaWYgKCFpcGMub2lmKQorCQkJaXBjLm9pZiA9IGluZXQtPm1jX2luZGV4OworCQlpZiAoIXNhZGRyKQorCQkJc2FkZHIgPSBpbmV0LT5tY19hZGRyOworCQljb25uZWN0ZWQgPSAwOworCX0KKworCWlmIChjb25uZWN0ZWQpCisJCXJ0ID0gKHN0cnVjdCBydGFibGUqKXNrX2RzdF9jaGVjayhzaywgMCk7CisKKwlpZiAocnQgPT0gTlVMTCkgeworCQlzdHJ1Y3QgZmxvd2kgZmwgPSB7IC5vaWYgPSBpcGMub2lmLAorCQkJCSAgICAubmxfdSA9IHsgLmlwNF91ID0KKwkJCQkJICAgICAgeyAuZGFkZHIgPSBmYWRkciwKKwkJCQkJCS5zYWRkciA9IHNhZGRyLAorCQkJCQkJLnRvcyA9IHRvcyB9IH0sCisJCQkJICAgIC5wcm90byA9IElQUFJPVE9fVURQLAorCQkJCSAgICAudWxpX3UgPSB7IC5wb3J0cyA9CisJCQkJCSAgICAgICB7IC5zcG9ydCA9IGluZXQtPnNwb3J0LAorCQkJCQkJIC5kcG9ydCA9IGRwb3J0IH0gfSB9OworCQllcnIgPSBpcF9yb3V0ZV9vdXRwdXRfZmxvdygmcnQsICZmbCwgc2ssICEobXNnLT5tc2dfZmxhZ3MmTVNHX0RPTlRXQUlUKSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKworCQllcnIgPSAtRUFDQ0VTOworCQlpZiAoKHJ0LT5ydF9mbGFncyAmIFJUQ0ZfQlJPQURDQVNUKSAmJgorCQkgICAgIXNvY2tfZmxhZyhzaywgU09DS19CUk9BRENBU1QpKQorCQkJZ290byBvdXQ7CisJCWlmIChjb25uZWN0ZWQpCisJCQlza19kc3Rfc2V0KHNrLCBkc3RfY2xvbmUoJnJ0LT51LmRzdCkpOworCX0KKworCWlmIChtc2ctPm1zZ19mbGFncyZNU0dfQ09ORklSTSkKKwkJZ290byBkb19jb25maXJtOworYmFja19mcm9tX2NvbmZpcm06CisKKwlzYWRkciA9IHJ0LT5ydF9zcmM7CisJaWYgKCFpcGMuYWRkcikKKwkJZGFkZHIgPSBpcGMuYWRkciA9IHJ0LT5ydF9kc3Q7CisKKwlsb2NrX3NvY2soc2spOworCWlmICh1bmxpa2VseSh1cC0+cGVuZGluZykpIHsKKwkJLyogVGhlIHNvY2tldCBpcyBhbHJlYWR5IGNvcmtlZCB3aGlsZSBwcmVwYXJpbmcgaXQuICovCisJCS8qIC4uLiB3aGljaCBpcyBhbiBldmlkZW50IGFwcGxpY2F0aW9uIGJ1Zy4gLS1BTksgKi8KKwkJcmVsZWFzZV9zb2NrKHNrKTsKKworCQlORVRERUJVRyhpZiAobmV0X3JhdGVsaW1pdCgpKSBwcmludGsoS0VSTl9ERUJVRyAidWRwIGNvcmsgYXBwIGJ1ZyAyXG4iKSk7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwkvKgorCSAqCU5vdyBjb3JrIHRoZSBzb2NrZXQgdG8gcGVuZCBkYXRhLgorCSAqLworCWluZXQtPmNvcmsuZmwuZmw0X2RzdCA9IGRhZGRyOworCWluZXQtPmNvcmsuZmwuZmxfaXBfZHBvcnQgPSBkcG9ydDsKKwlpbmV0LT5jb3JrLmZsLmZsNF9zcmMgPSBzYWRkcjsKKwlpbmV0LT5jb3JrLmZsLmZsX2lwX3Nwb3J0ID0gaW5ldC0+c3BvcnQ7CisJdXAtPnBlbmRpbmcgPSBBRl9JTkVUOworCitkb19hcHBlbmRfZGF0YToKKwl1cC0+bGVuICs9IHVsZW47CisJZXJyID0gaXBfYXBwZW5kX2RhdGEoc2ssIGlwX2dlbmVyaWNfZ2V0ZnJhZywgbXNnLT5tc2dfaW92LCB1bGVuLCAKKwkJCXNpemVvZihzdHJ1Y3QgdWRwaGRyKSwgJmlwYywgcnQsIAorCQkJY29ya3JlcSA/IG1zZy0+bXNnX2ZsYWdzfE1TR19NT1JFIDogbXNnLT5tc2dfZmxhZ3MpOworCWlmIChlcnIpCisJCXVkcF9mbHVzaF9wZW5kaW5nX2ZyYW1lcyhzayk7CisJZWxzZSBpZiAoIWNvcmtyZXEpCisJCWVyciA9IHVkcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHNrLCB1cCk7CisJcmVsZWFzZV9zb2NrKHNrKTsKKworb3V0OgorCWlwX3J0X3B1dChydCk7CisJaWYgKGZyZWUpCisJCWtmcmVlKGlwYy5vcHQpOworCWlmICghZXJyKSB7CisJCVVEUF9JTkNfU1RBVFNfVVNFUihVRFBfTUlCX09VVERBVEFHUkFNUyk7CisJCXJldHVybiBsZW47CisJfQorCXJldHVybiBlcnI7CisKK2RvX2NvbmZpcm06CisJZHN0X2NvbmZpcm0oJnJ0LT51LmRzdCk7CisJaWYgKCEobXNnLT5tc2dfZmxhZ3MmTVNHX1BST0JFKSB8fCBsZW4pCisJCWdvdG8gYmFja19mcm9tX2NvbmZpcm07CisJZXJyID0gMDsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIGludCB1ZHBfc2VuZHBhZ2Uoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9mZnNldCwKKwkJCXNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHVkcF9zb2NrICp1cCA9IHVkcF9zayhzayk7CisJaW50IHJldDsKKworCWlmICghdXAtPnBlbmRpbmcpIHsKKwkJc3RydWN0IG1zZ2hkciBtc2cgPSB7CS5tc2dfZmxhZ3MgPSBmbGFnc3xNU0dfTU9SRSB9OworCisJCS8qIENhbGwgdWRwX3NlbmRtc2cgdG8gc3BlY2lmeSBkZXN0aW5hdGlvbiBhZGRyZXNzIHdoaWNoCisJCSAqIHNlbmRwYWdlIGludGVyZmFjZSBjYW4ndCBwYXNzLgorCQkgKiBUaGlzIHdpbGwgc3VjY2VlZCBvbmx5IHdoZW4gdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQuCisJCSAqLworCQlyZXQgPSB1ZHBfc2VuZG1zZyhOVUxMLCBzaywgJm1zZywgMCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlsb2NrX3NvY2soc2spOworCisJaWYgKHVubGlrZWx5KCF1cC0+cGVuZGluZykpIHsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKworCQlORVRERUJVRyhpZiAobmV0X3JhdGVsaW1pdCgpKSBwcmludGsoS0VSTl9ERUJVRyAidWRwIGNvcmsgYXBwIGJ1ZyAzXG4iKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGlwX2FwcGVuZF9wYWdlKHNrLCBwYWdlLCBvZmZzZXQsIHNpemUsIGZsYWdzKTsKKwlpZiAocmV0ID09IC1FT1BOT1RTVVBQKSB7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCXJldHVybiBzb2NrX25vX3NlbmRwYWdlKHNrLT5za19zb2NrZXQsIHBhZ2UsIG9mZnNldCwKKwkJCQkJc2l6ZSwgZmxhZ3MpOworCX0KKwlpZiAocmV0IDwgMCkgeworCQl1ZHBfZmx1c2hfcGVuZGluZ19mcmFtZXMoc2spOworCQlnb3RvIG91dDsKKwl9CisKKwl1cC0+bGVuICs9IHNpemU7CisJaWYgKCEodXAtPmNvcmtmbGFnIHx8IChmbGFncyZNU0dfTU9SRSkpKQorCQlyZXQgPSB1ZHBfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzaywgdXApOworCWlmICghcmV0KQorCQlyZXQgPSBzaXplOworb3V0OgorCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqCUlPQ1RMIHJlcXVlc3RzIGFwcGxpY2FibGUgdG8gdGhlIFVEUCBwcm90b2NvbAorICovCisgCitpbnQgdWRwX2lvY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3dpdGNoKGNtZCkgCisJeworCQljYXNlIFNJT0NPVVRROgorCQl7CisJCQlpbnQgYW1vdW50ID0gYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKTsKKwkJCXJldHVybiBwdXRfdXNlcihhbW91bnQsIChpbnQgX191c2VyICopYXJnKTsKKwkJfQorCisJCWNhc2UgU0lPQ0lOUToKKwkJeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJCXVuc2lnbmVkIGxvbmcgYW1vdW50OworCisJCQlhbW91bnQgPSAwOworCQkJc3Bpbl9sb2NrX2lycSgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7CisJCQlza2IgPSBza2JfcGVlaygmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCQkJaWYgKHNrYiAhPSBOVUxMKSB7CisJCQkJLyoKKwkJCQkgKiBXZSB3aWxsIG9ubHkgcmV0dXJuIHRoZSBhbW91bnQKKwkJCQkgKiBvZiB0aGlzIHBhY2tldCBzaW5jZSB0aGF0IGlzIGFsbAorCQkJCSAqIHRoYXQgd2lsbCBiZSByZWFkLgorCQkJCSAqLworCQkJCWFtb3VudCA9IHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwkJCXJldHVybiBwdXRfdXNlcihhbW91bnQsIChpbnQgX191c2VyICopYXJnKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX3VkcF9jaGVja3N1bV9jb21wbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAodW5zaWduZWQgc2hvcnQpY3N1bV9mb2xkKHNrYl9jaGVja3N1bShza2IsIDAsIHNrYi0+bGVuLCBza2ItPmNzdW0pKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IHVkcF9jaGVja3N1bV9jb21wbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSAmJgorCQlfX3VkcF9jaGVja3N1bV9jb21wbGV0ZShza2IpOworfQorCisvKgorICogCVRoaXMgc2hvdWxkIGJlIGVhc3ksIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0aGVyZSB3ZQorICogCXJldHVybiBpdCwgb3RoZXJ3aXNlIHdlIGJsb2NrLgorICovCisKK3N0YXRpYyBpbnQgdWRwX3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywKKwkJICAgICAgIHNpemVfdCBsZW4sIGludCBub2Jsb2NrLCBpbnQgZmxhZ3MsIGludCAqYWRkcl9sZW4pCit7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworICAJc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopbXNnLT5tc2dfbmFtZTsKKyAgCXN0cnVjdCBza19idWZmICpza2I7CisgIAlpbnQgY29waWVkLCBlcnI7CisKKwkvKgorCSAqCUNoZWNrIGFueSBwYXNzZWQgYWRkcmVzc2VzCisJICovCisJaWYgKGFkZHJfbGVuKQorCQkqYWRkcl9sZW49c2l6ZW9mKCpzaW4pOworCisJaWYgKGZsYWdzICYgTVNHX0VSUlFVRVVFKQorCQlyZXR1cm4gaXBfcmVjdl9lcnJvcihzaywgbXNnLCBsZW4pOworCit0cnlfYWdhaW46CisJc2tiID0gc2tiX3JlY3ZfZGF0YWdyYW0oc2ssIGZsYWdzLCBub2Jsb2NrLCAmZXJyKTsKKwlpZiAoIXNrYikKKwkJZ290byBvdXQ7CisgIAorICAJY29waWVkID0gc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisJaWYgKGNvcGllZCA+IGxlbikgeworCQljb3BpZWQgPSBsZW47CisJCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19UUlVOQzsKKwl9CisKKwlpZiAoc2tiLT5pcF9zdW1tZWQ9PUNIRUNLU1VNX1VOTkVDRVNTQVJZKSB7CisJCWVyciA9IHNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLCBtc2ctPm1zZ19pb3YsCisJCQkJCSAgICAgIGNvcGllZCk7CisJfSBlbHNlIGlmIChtc2ctPm1zZ19mbGFncyZNU0dfVFJVTkMpIHsKKwkJaWYgKF9fdWRwX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpCisJCQlnb3RvIGNzdW1fY29weV9lcnI7CisJCWVyciA9IHNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLCBtc2ctPm1zZ19pb3YsCisJCQkJCSAgICAgIGNvcGllZCk7CisJfSBlbHNlIHsKKwkJZXJyID0gc2tiX2NvcHlfYW5kX2NzdW1fZGF0YWdyYW1faW92ZWMoc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkciksIG1zZy0+bXNnX2lvdik7CisKKwkJaWYgKGVyciA9PSAtRUlOVkFMKQorCQkJZ290byBjc3VtX2NvcHlfZXJyOworCX0KKworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlzb2NrX3JlY3ZfdGltZXN0YW1wKG1zZywgc2ssIHNrYik7CisKKwkvKiBDb3B5IHRoZSBhZGRyZXNzLiAqLworCWlmIChzaW4pCisJeworCQlzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQlzaW4tPnNpbl9wb3J0ID0gc2tiLT5oLnVoLT5zb3VyY2U7CisJCXNpbi0+c2luX2FkZHIuc19hZGRyID0gc2tiLT5uaC5pcGgtPnNhZGRyOworCQltZW1zZXQoc2luLT5zaW5femVybywgMCwgc2l6ZW9mKHNpbi0+c2luX3plcm8pKTsKKyAgCX0KKwlpZiAoaW5ldC0+Y21zZ19mbGFncykKKwkJaXBfY21zZ19yZWN2KG1zZywgc2tiKTsKKworCWVyciA9IGNvcGllZDsKKwlpZiAoZmxhZ3MgJiBNU0dfVFJVTkMpCisJCWVyciA9IHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworICAKK291dF9mcmVlOgorICAJc2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7CitvdXQ6CisgIAlyZXR1cm4gZXJyOworCitjc3VtX2NvcHlfZXJyOgorCVVEUF9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkVSUk9SUyk7CisKKwkvKiBDbGVhciBxdWV1ZS4gKi8KKwlpZiAoZmxhZ3MmTVNHX1BFRUspIHsKKwkJaW50IGNsZWFyID0gMDsKKwkJc3Bpbl9sb2NrX2lycSgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7CisJCWlmIChza2IgPT0gc2tiX3BlZWsoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSkgeworCQkJX19za2JfdW5saW5rKHNrYiwgJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwkJCWNsZWFyID0gMTsKKwkJfQorCQlzcGluX3VubG9ja19pcnEoJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOworCQlpZiAoY2xlYXIpCisJCQlrZnJlZV9za2Ioc2tiKTsKKwl9CisKKwlza2JfZnJlZV9kYXRhZ3JhbShzaywgc2tiKTsKKworCWlmIChub2Jsb2NrKQorCQlyZXR1cm4gLUVBR0FJTjsJCisJZ290byB0cnlfYWdhaW47Cit9CisKKworaW50IHVkcF9kaXNjb25uZWN0KHN0cnVjdCBzb2NrICpzaywgaW50IGZsYWdzKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwkvKgorCSAqCTEwMDMuMWcgLSBicmVhayBhc3NvY2lhdGlvbi4KKwkgKi8KKwkgCisJc2stPnNrX3N0YXRlID0gVENQX0NMT1NFOworCWluZXQtPmRhZGRyID0gMDsKKwlpbmV0LT5kcG9ydCA9IDA7CisJc2stPnNrX2JvdW5kX2Rldl9pZiA9IDA7CisJaWYgKCEoc2stPnNrX3VzZXJsb2NrcyAmIFNPQ0tfQklOREFERFJfTE9DSykpCisJCWluZXRfcmVzZXRfc2FkZHIoc2spOworCisJaWYgKCEoc2stPnNrX3VzZXJsb2NrcyAmIFNPQ0tfQklORFBPUlRfTE9DSykpIHsKKwkJc2stPnNrX3Byb3QtPnVuaGFzaChzayk7CisJCWluZXQtPnNwb3J0ID0gMDsKKwl9CisJc2tfZHN0X3Jlc2V0KHNrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdWRwX2Nsb3NlKHN0cnVjdCBzb2NrICpzaywgbG9uZyB0aW1lb3V0KQoreworCXNrX2NvbW1vbl9yZWxlYXNlKHNrKTsKK30KKworLyogcmV0dXJuOgorICogCTEgIGlmIHRoZSB0aGUgVURQIHN5c3RlbSBzaG91bGQgcHJvY2VzcyBpdAorICoJMCAgaWYgd2Ugc2hvdWxkIGRyb3AgdGhpcyBwYWNrZXQKKyAqIAktMSBpZiBpdCBzaG91bGQgZ2V0IHByb2Nlc3NlZCBieSB4ZnJtNF9yY3ZfZW5jYXAKKyAqLworc3RhdGljIGludCB1ZHBfZW5jYXBfcmN2KHN0cnVjdCBzb2NrICogc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisjaWZuZGVmIENPTkZJR19YRlJNCisJcmV0dXJuIDE7IAorI2Vsc2UKKwlzdHJ1Y3QgdWRwX3NvY2sgKnVwID0gdWRwX3NrKHNrKTsKKyAgCXN0cnVjdCB1ZHBoZHIgKnVoID0gc2tiLT5oLnVoOworCXN0cnVjdCBpcGhkciAqaXBoOworCWludCBpcGhsZW4sIGxlbjsKKyAgCisJX191OCAqdWRwZGF0YSA9IChfX3U4ICopdWggKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisJX191MzIgKnVkcGRhdGEzMiA9IChfX3UzMiAqKXVkcGRhdGE7CisJX191MTYgZW5jYXBfdHlwZSA9IHVwLT5lbmNhcF90eXBlOworCisJLyogaWYgd2UncmUgb3Zlcmx5IHNob3J0LCBsZXQgVURQIGhhbmRsZSBpdCAqLworCWlmICh1ZHBkYXRhID4gc2tiLT50YWlsKQorCQlyZXR1cm4gMTsKKworCS8qIGlmIHRoaXMgaXMgbm90IGVuY2Fwc3VsYXRlZCBzb2NrZXQsIHRoZW4ganVzdCByZXR1cm4gbm93ICovCisJaWYgKCFlbmNhcF90eXBlKQorCQlyZXR1cm4gMTsKKworCWxlbiA9IHNrYi0+dGFpbCAtIHVkcGRhdGE7CisKKwlzd2l0Y2ggKGVuY2FwX3R5cGUpIHsKKwlkZWZhdWx0OgorCWNhc2UgVURQX0VOQ0FQX0VTUElOVURQOgorCQkvKiBDaGVjayBpZiB0aGlzIGlzIGEga2VlcGFsaXZlIHBhY2tldC4gIElmIHNvLCBlYXQgaXQuICovCisJCWlmIChsZW4gPT0gMSAmJiB1ZHBkYXRhWzBdID09IDB4ZmYpIHsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKGxlbiA+IHNpemVvZihzdHJ1Y3QgaXBfZXNwX2hkcikgJiYgdWRwZGF0YTMyWzBdICE9IDAgKSB7CisJCQkvKiBFU1AgUGFja2V0IHdpdGhvdXQgTm9uLUVTUCBoZWFkZXIgKi8KKwkJCWxlbiA9IHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwkJfSBlbHNlCisJCQkvKiBNdXN0IGJlIGFuIElLRSBwYWNrZXQuLiBwYXNzIGl0IHRocm91Z2ggKi8KKwkJCXJldHVybiAxOworCQlicmVhazsKKwljYXNlIFVEUF9FTkNBUF9FU1BJTlVEUF9OT05fSUtFOgorCQkvKiBDaGVjayBpZiB0aGlzIGlzIGEga2VlcGFsaXZlIHBhY2tldC4gIElmIHNvLCBlYXQgaXQuICovCisJCWlmIChsZW4gPT0gMSAmJiB1ZHBkYXRhWzBdID09IDB4ZmYpIHsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKGxlbiA+IDIgKiBzaXplb2YodTMyKSArIHNpemVvZihzdHJ1Y3QgaXBfZXNwX2hkcikgJiYKKwkJCSAgIHVkcGRhdGEzMlswXSA9PSAwICYmIHVkcGRhdGEzMlsxXSA9PSAwKSB7CisJCQkKKwkJCS8qIEVTUCBQYWNrZXQgd2l0aCBOb24tSUtFIG1hcmtlciAqLworCQkJbGVuID0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpICsgMiAqIHNpemVvZih1MzIpOworCQl9IGVsc2UKKwkJCS8qIE11c3QgYmUgYW4gSUtFIHBhY2tldC4uIHBhc3MgaXQgdGhyb3VnaCAqLworCQkJcmV0dXJuIDE7CisJCWJyZWFrOworCX0KKworCS8qIEF0IHRoaXMgcG9pbnQgd2UgYXJlIHN1cmUgdGhhdCB0aGlzIGlzIGFuIEVTUGluVURQIHBhY2tldCwKKwkgKiBzbyB3ZSBuZWVkIHRvIHJlbW92ZSAnbGVuJyBieXRlcyBmcm9tIHRoZSBwYWNrZXQgKHRoZSBVRFAKKwkgKiBoZWFkZXIgYW5kIG9wdGlvbmFsIEVTUCBtYXJrZXIgYnl0ZXMpIGFuZCB0aGVuIG1vZGlmeSB0aGUKKwkgKiBwcm90b2NvbCB0byBFU1AsIGFuZCB0aGVuIGNhbGwgaW50byB0aGUgdHJhbnNmb3JtIHJlY2VpdmVyLgorCSAqLworCisJLyogTm93IHdlIGNhbiB1cGRhdGUgYW5kIHZlcmlmeSB0aGUgcGFja2V0IGxlbmd0aC4uLiAqLworCWlwaCA9IHNrYi0+bmguaXBoOworCWlwaGxlbiA9IGlwaC0+aWhsIDw8IDI7CisJaXBoLT50b3RfbGVuID0gaHRvbnMobnRvaHMoaXBoLT50b3RfbGVuKSAtIGxlbik7CisJaWYgKHNrYi0+bGVuIDwgaXBobGVuICsgbGVuKSB7CisJCS8qIHBhY2tldCBpcyB0b28gc21hbGwhPyEgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJLyogcHVsbCB0aGUgZGF0YSBidWZmZXIgdXAgdG8gdGhlIEVTUCBoZWFkZXIgYW5kIHNldCB0aGUKKwkgKiB0cmFuc3BvcnQgaGVhZGVyIHRvIHBvaW50IHRvIEVTUC4gIEtlZXAgVURQIG9uIHRoZSBzdGFjaworCSAqIGZvciBsYXRlci4KKwkgKi8KKwlza2ItPmgucmF3ID0gc2tiX3B1bGwoc2tiLCBsZW4pOworCisJLyogbW9kaWZ5IHRoZSBwcm90b2NvbCAoaXQncyBFU1AhKSAqLworCWlwaC0+cHJvdG9jb2wgPSBJUFBST1RPX0VTUDsKKworCS8qIGFuZCBsZXQgdGhlIGNhbGxlciBrbm93IHRvIHNlbmQgdGhpcyBpbnRvIHRoZSBFU1AgcHJvY2Vzc29yLi4uICovCisJcmV0dXJuIC0xOworI2VuZGlmCit9CisKKy8qIHJldHVybnM6CisgKiAgLTE6IGVycm9yCisgKiAgIDA6IHN1Y2Nlc3MKKyAqICA+MDogInVkcCBlbmNhcCIgcHJvdG9jb2wgcmVzdWJtaXNzaW9uCisgKgorICogTm90ZSB0aGF0IGluIHRoZSBzdWNjZXNzIGFuZCBlcnJvciBjYXNlcywgdGhlIHNrYiBpcyBhc3N1bWVkIHRvCisgKiBoYXZlIGVpdGhlciBiZWVuIHJlcXVldWVkIG9yIGZyZWVkLgorICovCitzdGF0aWMgaW50IHVkcF9xdWV1ZV9yY3Zfc2tiKHN0cnVjdCBzb2NrICogc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHVkcF9zb2NrICp1cCA9IHVkcF9zayhzayk7CisKKwkvKgorCSAqCUNoYXJnZSBpdCB0byB0aGUgc29ja2V0LCBkcm9wcGluZyBpZiB0aGUgcXVldWUgaXMgZnVsbC4KKwkgKi8KKwlpZiAoIXhmcm00X3BvbGljeV9jaGVjayhzaywgWEZSTV9QT0xJQ1lfSU4sIHNrYikpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAodXAtPmVuY2FwX3R5cGUpIHsKKwkJLyoKKwkJICogVGhpcyBpcyBhbiBlbmNhcHN1bGF0aW9uIHNvY2tldCwgc28gbGV0J3Mgc2VlIGlmIHRoaXMgaXMKKwkJICogYW4gZW5jYXBzdWxhdGVkIHBhY2tldC4KKwkJICogSWYgaXQncyBhIGtlZXBhbGl2ZSBwYWNrZXQsIHRoZW4ganVzdCBlYXQgaXQuCisJCSAqIElmIGl0J3MgYW4gZW5jYXBzdWxhdGVlZCBwYWNrZXQsIHRoZW4gcGFzcyBpdCB0byB0aGUKKwkJICogSVBzZWMgeGZybSBpbnB1dCBhbmQgcmV0dXJuIHRoZSByZXNwb25zZQorCQkgKiBhcHByb3ByaWF0ZWx5LiAgT3RoZXJ3aXNlLCBqdXN0IGZhbGwgdGhyb3VnaCBhbmQKKwkJICogcGFzcyB0aGlzIHVwIHRoZSBVRFAgc29ja2V0LgorCQkgKi8KKwkJaW50IHJldDsKKworCQlyZXQgPSB1ZHBfZW5jYXBfcmN2KHNrLCBza2IpOworCQlpZiAocmV0ID09IDApIHsKKwkJCS8qIEVhdCB0aGUgcGFja2V0IC4uICovCisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChyZXQgPCAwKSB7CisJCQkvKiBwcm9jZXNzIHRoZSBFU1AgcGFja2V0ICovCisJCQlyZXQgPSB4ZnJtNF9yY3ZfZW5jYXAoc2tiLCB1cC0+ZW5jYXBfdHlwZSk7CisJCQlVRFBfSU5DX1NUQVRTX0JIKFVEUF9NSUJfSU5EQVRBR1JBTVMpOworCQkJcmV0dXJuIC1yZXQ7CisJCX0KKwkJLyogRkFMTFRIUk9VR0ggLS0gaXQncyBhIFVEUCBQYWNrZXQgKi8KKwl9CisKKwlpZiAoc2stPnNrX2ZpbHRlciAmJiBza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSkgeworCQlpZiAoX191ZHBfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkgeworCQkJVURQX0lOQ19TVEFUU19CSChVRFBfTUlCX0lORVJST1JTKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJfQorCisJaWYgKHNvY2tfcXVldWVfcmN2X3NrYihzayxza2IpPDApIHsKKwkJVURQX0lOQ19TVEFUU19CSChVRFBfTUlCX0lORVJST1JTKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAtMTsKKwl9CisJVURQX0lOQ19TVEFUU19CSChVRFBfTUlCX0lOREFUQUdSQU1TKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCU11bHRpY2FzdHMgYW5kIGJyb2FkY2FzdHMgZ28gdG8gZWFjaCBsaXN0ZW5lci4KKyAqCisgKglOb3RlOiBjYWxsZWQgb25seSBmcm9tIHRoZSBCSCBoYW5kbGVyIGNvbnRleHQsCisgKglzbyB3ZSBkb24ndCBuZWVkIHRvIGxvY2sgdGhlIGhhc2hlcy4KKyAqLworc3RhdGljIGludCB1ZHBfdjRfbWNhc3RfZGVsaXZlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdWRwaGRyICp1aCwKKwkJCQkgdTMyIHNhZGRyLCB1MzIgZGFkZHIpCit7CisJc3RydWN0IHNvY2sgKnNrOworCWludCBkaWY7CisKKwlyZWFkX2xvY2soJnVkcF9oYXNoX2xvY2spOworCXNrID0gc2tfaGVhZCgmdWRwX2hhc2hbbnRvaHModWgtPmRlc3QpICYgKFVEUF9IVEFCTEVfU0laRSAtIDEpXSk7CisJZGlmID0gc2tiLT5kZXYtPmlmaW5kZXg7CisJc2sgPSB1ZHBfdjRfbWNhc3RfbmV4dChzaywgdWgtPmRlc3QsIGRhZGRyLCB1aC0+c291cmNlLCBzYWRkciwgZGlmKTsKKwlpZiAoc2spIHsKKwkJc3RydWN0IHNvY2sgKnNrbmV4dCA9IE5VTEw7CisKKwkJZG8geworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjEgPSBza2I7CisKKwkJCXNrbmV4dCA9IHVkcF92NF9tY2FzdF9uZXh0KHNrX25leHQoc2spLCB1aC0+ZGVzdCwgZGFkZHIsCisJCQkJCQkgICB1aC0+c291cmNlLCBzYWRkciwgZGlmKTsKKwkJCWlmKHNrbmV4dCkKKwkJCQlza2IxID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisKKwkJCWlmKHNrYjEpIHsKKwkJCQlpbnQgcmV0ID0gdWRwX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYjEpOworCQkJCWlmIChyZXQgPiAwKQorCQkJCQkvKiB3ZSBzaG91bGQgcHJvYmFibHkgcmUtcHJvY2VzcyBpbnN0ZWFkCisJCQkJCSAqIG9mIGRyb3BwaW5nIHBhY2tldHMgaGVyZS4gKi8KKwkJCQkJa2ZyZWVfc2tiKHNrYjEpOworCQkJfQorCQkJc2sgPSBza25leHQ7CisJCX0gd2hpbGUoc2tuZXh0KTsKKwl9IGVsc2UKKwkJa2ZyZWVfc2tiKHNrYik7CisJcmVhZF91bmxvY2soJnVkcF9oYXNoX2xvY2spOworCXJldHVybiAwOworfQorCisvKiBJbml0aWFsaXplIFVEUCBjaGVja3N1bS4gSWYgZXhpdGVkIHdpdGggemVybyB2YWx1ZSAoc3VjY2VzcyksCisgKiBDSEVDS1NVTV9VTk5FQ0VTU0FSWSBtZWFucywgdGhhdCBubyBtb3JlIGNoZWNrcyBhcmUgcmVxdWlyZWQuCisgKiBPdGhlcndpc2UsIGNzdW0gY29tcGxldGlvbiByZXF1aXJlcyBjaGFja3N1bW1pbmcgcGFja2V0IGJvZHksCisgKiBpbmNsdWRpbmcgdWRwIGhlYWRlciBhbmQgZm9sZGluZyBpdCB0byBza2ItPmNzdW0uCisgKi8KK3N0YXRpYyBpbnQgdWRwX2NoZWNrc3VtX2luaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHVkcGhkciAqdWgsCisJCQkgICAgIHVuc2lnbmVkIHNob3J0IHVsZW4sIHUzMiBzYWRkciwgdTMyIGRhZGRyKQoreworCWlmICh1aC0+Y2hlY2sgPT0gMCkgeworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCX0gZWxzZSBpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpIHsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJaWYgKCF1ZHBfY2hlY2sodWgsIHVsZW4sIHNhZGRyLCBkYWRkciwgc2tiLT5jc3VtKSkKKwkJCXJldHVybiAwOworCQlORVRERUJVRyhpZiAobmV0X3JhdGVsaW1pdCgpKSBwcmludGsoS0VSTl9ERUJVRyAidWRwIHY0IGh3IGNzdW0gZmFpbHVyZS5cbiIpKTsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCX0KKwlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpCisJCXNrYi0+Y3N1bSA9IGNzdW1fdGNwdWRwX25vZm9sZChzYWRkciwgZGFkZHIsIHVsZW4sIElQUFJPVE9fVURQLCAwKTsKKwkvKiBQcm9iYWJseSwgd2Ugc2hvdWxkIGNoZWNrc3VtIHVkcCBoZWFkZXIgKGl0IHNob3VsZCBiZSBpbiBjYWNoZQorCSAqIGluIGFueSBjYXNlKSBhbmQgZGF0YSBpbiB0aW55IHBhY2tldHMgKDwgcnggY29weWJyZWFrKS4KKwkgKi8KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCUFsbCB3ZSBuZWVkIHRvIGRvIGlzIGdldCB0aGUgc29ja2V0LCBhbmQgdGhlbiBkbyBhIGNoZWNrc3VtLiAKKyAqLworIAoraW50IHVkcF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyAgCXN0cnVjdCBzb2NrICpzazsKKyAgCXN0cnVjdCB1ZHBoZHIgKnVoOworCXVuc2lnbmVkIHNob3J0IHVsZW47CisJc3RydWN0IHJ0YWJsZSAqcnQgPSAoc3RydWN0IHJ0YWJsZSopc2tiLT5kc3Q7CisJdTMyIHNhZGRyID0gc2tiLT5uaC5pcGgtPnNhZGRyOworCXUzMiBkYWRkciA9IHNrYi0+bmguaXBoLT5kYWRkcjsKKwlpbnQgbGVuID0gc2tiLT5sZW47CisKKwkvKgorCSAqCVZhbGlkYXRlIHRoZSBwYWNrZXQgYW5kIHRoZSBVRFAgbGVuZ3RoLgorCSAqLworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSkpCisJCWdvdG8gbm9faGVhZGVyOworCisJdWggPSBza2ItPmgudWg7CisKKwl1bGVuID0gbnRvaHModWgtPmxlbik7CisKKwlpZiAodWxlbiA+IGxlbiB8fCB1bGVuIDwgc2l6ZW9mKCp1aCkpCisJCWdvdG8gc2hvcnRfcGFja2V0OworCisJaWYgKHBza2JfdHJpbShza2IsIHVsZW4pKQorCQlnb3RvIHNob3J0X3BhY2tldDsKKworCWlmICh1ZHBfY2hlY2tzdW1faW5pdChza2IsIHVoLCB1bGVuLCBzYWRkciwgZGFkZHIpIDwgMCkKKwkJZ290byBjc3VtX2Vycm9yOworCisJaWYocnQtPnJ0X2ZsYWdzICYgKFJUQ0ZfQlJPQURDQVNUfFJUQ0ZfTVVMVElDQVNUKSkKKwkJcmV0dXJuIHVkcF92NF9tY2FzdF9kZWxpdmVyKHNrYiwgdWgsIHNhZGRyLCBkYWRkcik7CisKKwlzayA9IHVkcF92NF9sb29rdXAoc2FkZHIsIHVoLT5zb3VyY2UsIGRhZGRyLCB1aC0+ZGVzdCwgc2tiLT5kZXYtPmlmaW5kZXgpOworCisJaWYgKHNrICE9IE5VTEwpIHsKKwkJaW50IHJldCA9IHVkcF9xdWV1ZV9yY3Zfc2tiKHNrLCBza2IpOworCQlzb2NrX3B1dChzayk7CisKKwkJLyogYSByZXR1cm4gdmFsdWUgPiAwIG1lYW5zIHRvIHJlc3VibWl0IHRoZSBpbnB1dCwgYnV0CisJCSAqIGl0IGl0IHdhbnRzIHRoZSByZXR1cm4gdG8gYmUgLXByb3RvY29sLCBvciAwCisJCSAqLworCQlpZiAocmV0ID4gMCkKKwkJCXJldHVybiAtcmV0OworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXhmcm00X3BvbGljeV9jaGVjayhOVUxMLCBYRlJNX1BPTElDWV9JTiwgc2tiKSkKKwkJZ290byBkcm9wOworCisJLyogTm8gc29ja2V0LiBEcm9wIHBhY2tldCBzaWxlbnRseSwgaWYgY2hlY2tzdW0gaXMgd3JvbmcgKi8KKwlpZiAodWRwX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpCisJCWdvdG8gY3N1bV9lcnJvcjsKKworCVVEUF9JTkNfU1RBVFNfQkgoVURQX01JQl9OT1BPUlRTKTsKKwlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCwgSUNNUF9QT1JUX1VOUkVBQ0gsIDApOworCisJLyoKKwkgKiBIbW0uICBXZSBnb3QgYW4gVURQIHBhY2tldCB0byBhIHBvcnQgdG8gd2hpY2ggd2UKKwkgKiBkb24ndCB3YW5uYSBsaXN0ZW4uICBJZ25vcmUgaXQuCisJICovCisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuKDApOworCitzaG9ydF9wYWNrZXQ6CisJTkVUREVCVUcoaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlVEUDogc2hvcnQgcGFja2V0OiBGcm9tICV1LiV1LiV1LiV1OiV1ICVkLyVkIHRvICV1LiV1LiV1LiV1OiV1XG4iLAorCQkJTklQUVVBRChzYWRkciksCisJCQludG9ocyh1aC0+c291cmNlKSwKKwkJCXVsZW4sCisJCQlsZW4sCisJCQlOSVBRVUFEKGRhZGRyKSwKKwkJCW50b2hzKHVoLT5kZXN0KSkpOworbm9faGVhZGVyOgorCVVEUF9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkVSUk9SUyk7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuKDApOworCitjc3VtX2Vycm9yOgorCS8qIAorCSAqIFJGQzExMjI6IE9LLiAgRGlzY2FyZHMgdGhlIGJhZCBwYWNrZXQgc2lsZW50bHkgKGFzIGZhciBhcyAKKwkgKiB0aGUgbmV0d29yayBpcyBjb25jZXJuZWQsIGFueXdheSkgYXMgcGVyIDQuMS4zLjQgKE1VU1QpLiAKKwkgKi8KKwlORVRERUJVRyhpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkgcHJpbnRrKEtFUk5fREVCVUcgIlVEUDogYmFkIGNoZWNrc3VtLiBGcm9tICVkLiVkLiVkLiVkOiVkIHRvICVkLiVkLiVkLiVkOiVkIHVsZW4gJWRcbiIsCisJCQlOSVBRVUFEKHNhZGRyKSwKKwkJCW50b2hzKHVoLT5zb3VyY2UpLAorCQkJTklQUVVBRChkYWRkciksCisJCQludG9ocyh1aC0+ZGVzdCksCisJCQl1bGVuKSk7Citkcm9wOgorCVVEUF9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkVSUk9SUyk7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IHVkcF9kZXN0cm95X3NvY2soc3RydWN0IHNvY2sgKnNrKQoreworCWxvY2tfc29jayhzayk7CisJdWRwX2ZsdXNoX3BlbmRpbmdfZnJhbWVzKHNrKTsKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiAwOworfQorCisvKgorICoJU29ja2V0IG9wdGlvbiBjb2RlIGZvciBVRFAKKyAqLworc3RhdGljIGludCB1ZHBfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIAorCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQoreworCXN0cnVjdCB1ZHBfc29jayAqdXAgPSB1ZHBfc2soc2spOworCWludCB2YWw7CisJaW50IGVyciA9IDA7CisKKwlpZiAobGV2ZWwgIT0gU09MX1VEUCkKKwkJcmV0dXJuIGlwX3NldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CisKKwlpZihvcHRsZW48c2l6ZW9mKGludCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilvcHR2YWwpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaChvcHRuYW1lKSB7CisJY2FzZSBVRFBfQ09SSzoKKwkJaWYgKHZhbCAhPSAwKSB7CisJCQl1cC0+Y29ya2ZsYWcgPSAxOworCQl9IGVsc2UgeworCQkJdXAtPmNvcmtmbGFnID0gMDsKKwkJCWxvY2tfc29jayhzayk7CisJCQl1ZHBfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzaywgdXApOworCQkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJfQorCQlicmVhazsKKwkJCisJY2FzZSBVRFBfRU5DQVA6CisJCXN3aXRjaCAodmFsKSB7CisJCWNhc2UgMDoKKwkJY2FzZSBVRFBfRU5DQVBfRVNQSU5VRFA6CisJCWNhc2UgVURQX0VOQ0FQX0VTUElOVURQX05PTl9JS0U6CisJCQl1cC0+ZW5jYXBfdHlwZSA9IHZhbDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyID0gLUVOT1BST1RPT1BUOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PUFJPVE9PUFQ7CisJCWJyZWFrOworCX07CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHVkcF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgCisJCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKK3sKKwlzdHJ1Y3QgdWRwX3NvY2sgKnVwID0gdWRwX3NrKHNrKTsKKwlpbnQgdmFsLCBsZW47CisKKwlpZiAobGV2ZWwgIT0gU09MX1VEUCkKKwkJcmV0dXJuIGlwX2dldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CisKKwlpZihnZXRfdXNlcihsZW4sb3B0bGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgc2l6ZW9mKGludCkpOworCQorCWlmKGxlbiA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoKG9wdG5hbWUpIHsKKwljYXNlIFVEUF9DT1JLOgorCQl2YWwgPSB1cC0+Y29ya2ZsYWc7CisJCWJyZWFrOworCisJY2FzZSBVRFBfRU5DQVA6CisJCXZhbCA9IHVwLT5lbmNhcF90eXBlOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisJfTsKKworICAJaWYocHV0X3VzZXIobGVuLCBvcHRsZW4pKQorICAJCXJldHVybiAtRUZBVUxUOworCWlmKGNvcHlfdG9fdXNlcihvcHR2YWwsICZ2YWwsbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisgIAlyZXR1cm4gMDsKK30KKworLyoqCisgKiAJdWRwX3BvbGwgLSB3YWl0IGZvciBhIFVEUCBldmVudC4KKyAqCUBmaWxlIC0gZmlsZSBzdHJ1Y3QKKyAqCUBzb2NrIC0gc29ja2V0CisgKglAd2FpdCAtIHBvbGwgdGFibGUKKyAqCisgKglUaGlzIGlzIHNhbWUgYXMgZGF0YWdyYW0gcG9sbCwgZXhjZXB0IGZvciB0aGUgc3BlY2lhbCBjYXNlIG9mIAorICoJYmxvY2tpbmcgc29ja2V0cy4gSWYgYXBwbGljYXRpb24gaXMgdXNpbmcgYSBibG9ja2luZyBmZAorICoJYW5kIGEgcGFja2V0IHdpdGggY2hlY2tzdW0gZXJyb3IgaXMgaW4gdGhlIHF1ZXVlOworICoJdGhlbiBpdCBjb3VsZCBnZXQgcmV0dXJuIGZyb20gc2VsZWN0IGluZGljYXRpbmcgZGF0YSBhdmFpbGFibGUKKyAqCWJ1dCB0aGVuIGJsb2NrIHdoZW4gcmVhZGluZyBpdC4gQWRkIHNwZWNpYWwgY2FzZSBjb2RlCisgKgl0byB3b3JrIGFyb3VuZCB0aGVzZSBhcmd1YWJseSBicm9rZW4gYXBwbGljYXRpb25zLgorICovCit1bnNpZ25lZCBpbnQgdWRwX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIHBvbGxfdGFibGUgKndhaXQpCit7CisJdW5zaWduZWQgaW50IG1hc2sgPSBkYXRhZ3JhbV9wb2xsKGZpbGUsIHNvY2ssIHdhaXQpOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCQorCS8qIENoZWNrIGZvciBmYWxzZSBwb3NpdGl2ZXMgZHVlIHRvIGNoZWNrc3VtIGVycm9ycyAqLworCWlmICggKG1hc2sgJiBQT0xMUkROT1JNKSAmJgorCSAgICAgIShmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgJiYKKwkgICAgICEoc2stPnNrX3NodXRkb3duICYgUkNWX1NIVVRET1dOKSl7CisJCXN0cnVjdCBza19idWZmX2hlYWQgKnJjdnEgPSAmc2stPnNrX3JlY2VpdmVfcXVldWU7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJc3Bpbl9sb2NrX2lycSgmcmN2cS0+bG9jayk7CisJCXdoaWxlICgoc2tiID0gc2tiX3BlZWsocmN2cSkpICE9IE5VTEwpIHsKKwkJCWlmICh1ZHBfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkgeworCQkJCVVEUF9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkVSUk9SUyk7CisJCQkJX19za2JfdW5saW5rKHNrYiwgcmN2cSk7CisJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQl9IGVsc2UgeworCQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxKCZyY3ZxLT5sb2NrKTsKKworCQkvKiBub3RoaW5nIHRvIHNlZSwgbW92ZSBhbG9uZyAqLworCQlpZiAoc2tiID09IE5VTEwpCisJCQltYXNrICY9IH4oUE9MTElOIHwgUE9MTFJETk9STSk7CisJfQorCisJcmV0dXJuIG1hc2s7CisJCit9CisKK3N0cnVjdCBwcm90byB1ZHBfcHJvdCA9IHsKKyAJLm5hbWUgPQkJIlVEUCIsCisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLmNsb3NlID0JdWRwX2Nsb3NlLAorCS5jb25uZWN0ID0JaXA0X2RhdGFncmFtX2Nvbm5lY3QsCisJLmRpc2Nvbm5lY3QgPQl1ZHBfZGlzY29ubmVjdCwKKwkuaW9jdGwgPQl1ZHBfaW9jdGwsCisJLmRlc3Ryb3kgPQl1ZHBfZGVzdHJveV9zb2NrLAorCS5zZXRzb2Nrb3B0ID0JdWRwX3NldHNvY2tvcHQsCisJLmdldHNvY2tvcHQgPQl1ZHBfZ2V0c29ja29wdCwKKwkuc2VuZG1zZyA9CXVkcF9zZW5kbXNnLAorCS5yZWN2bXNnID0JdWRwX3JlY3Ztc2csCisJLnNlbmRwYWdlID0JdWRwX3NlbmRwYWdlLAorCS5iYWNrbG9nX3JjdiA9CXVkcF9xdWV1ZV9yY3Zfc2tiLAorCS5oYXNoID0JCXVkcF92NF9oYXNoLAorCS51bmhhc2ggPQl1ZHBfdjRfdW5oYXNoLAorCS5nZXRfcG9ydCA9CXVkcF92NF9nZXRfcG9ydCwKKwkub2JqX3NpemUgPQlzaXplb2Yoc3RydWN0IHVkcF9zb2NrKSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqdWRwX2dldF9maXJzdChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IHVkcF9pdGVyX3N0YXRlICpzdGF0ZSA9IHNlcS0+cHJpdmF0ZTsKKworCWZvciAoc3RhdGUtPmJ1Y2tldCA9IDA7IHN0YXRlLT5idWNrZXQgPCBVRFBfSFRBQkxFX1NJWkU7ICsrc3RhdGUtPmJ1Y2tldCkgeworCQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwkJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZ1ZHBfaGFzaFtzdGF0ZS0+YnVja2V0XSkgeworCQkJaWYgKHNrLT5za19mYW1pbHkgPT0gc3RhdGUtPmZhbWlseSkKKwkJCQlnb3RvIGZvdW5kOworCQl9CisJfQorCXNrID0gTlVMTDsKK2ZvdW5kOgorCXJldHVybiBzazsKK30KKworc3RhdGljIHN0cnVjdCBzb2NrICp1ZHBfZ2V0X25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgdWRwX2l0ZXJfc3RhdGUgKnN0YXRlID0gc2VxLT5wcml2YXRlOworCisJZG8geworCQlzayA9IHNrX25leHQoc2spOwordHJ5X2FnYWluOgorCQk7CisJfSB3aGlsZSAoc2sgJiYgc2stPnNrX2ZhbWlseSAhPSBzdGF0ZS0+ZmFtaWx5KTsKKworCWlmICghc2sgJiYgKytzdGF0ZS0+YnVja2V0IDwgVURQX0hUQUJMRV9TSVpFKSB7CisJCXNrID0gc2tfaGVhZCgmdWRwX2hhc2hbc3RhdGUtPmJ1Y2tldF0pOworCQlnb3RvIHRyeV9hZ2FpbjsKKwl9CisJcmV0dXJuIHNrOworfQorCitzdGF0aWMgc3RydWN0IHNvY2sgKnVkcF9nZXRfaWR4KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBzb2NrICpzayA9IHVkcF9nZXRfZmlyc3Qoc2VxKTsKKworCWlmIChzaykKKwkJd2hpbGUocG9zICYmIChzayA9IHVkcF9nZXRfbmV4dChzZXEsIHNrKSkgIT0gTlVMTCkKKwkJCS0tcG9zOworCXJldHVybiBwb3MgPyBOVUxMIDogc2s7Cit9CisKK3N0YXRpYyB2b2lkICp1ZHBfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlyZWFkX2xvY2soJnVkcF9oYXNoX2xvY2spOworCXJldHVybiAqcG9zID8gdWRwX2dldF9pZHgoc2VxLCAqcG9zLTEpIDogKHZvaWQgKikxOworfQorCitzdGF0aWMgdm9pZCAqdWRwX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlpZiAodiA9PSAodm9pZCAqKTEpCisJCXNrID0gdWRwX2dldF9pZHgoc2VxLCAwKTsKKwllbHNlCisJCXNrID0gdWRwX2dldF9uZXh0KHNlcSwgdik7CisKKwkrKypwb3M7CisJcmV0dXJuIHNrOworfQorCitzdGF0aWMgdm9pZCB1ZHBfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJcmVhZF91bmxvY2soJnVkcF9oYXNoX2xvY2spOworfQorCitzdGF0aWMgaW50IHVkcF9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdWRwX3NlcV9hZmluZm8gKmFmaW5mbyA9IFBERShpbm9kZSktPmRhdGE7CisJc3RydWN0IHNlcV9maWxlICpzZXE7CisJaW50IHJjID0gLUVOT01FTTsKKwlzdHJ1Y3QgdWRwX2l0ZXJfc3RhdGUgKnMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOworCisJaWYgKCFzKQorCQlnb3RvIG91dDsKKwltZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7CisJcy0+ZmFtaWx5CQk9IGFmaW5mby0+ZmFtaWx5OworCXMtPnNlcV9vcHMuc3RhcnQJPSB1ZHBfc2VxX3N0YXJ0OworCXMtPnNlcV9vcHMubmV4dAkJPSB1ZHBfc2VxX25leHQ7CisJcy0+c2VxX29wcy5zaG93CQk9IGFmaW5mby0+c2VxX3Nob3c7CisJcy0+c2VxX29wcy5zdG9wCQk9IHVkcF9zZXFfc3RvcDsKKworCXJjID0gc2VxX29wZW4oZmlsZSwgJnMtPnNlcV9vcHMpOworCWlmIChyYykKKwkJZ290byBvdXRfa2ZyZWU7CisKKwlzZXEJICAgICA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzZXEtPnByaXZhdGUgPSBzOworb3V0OgorCXJldHVybiByYzsKK291dF9rZnJlZToKKwlrZnJlZShzKTsKKwlnb3RvIG91dDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitpbnQgdWRwX3Byb2NfcmVnaXN0ZXIoc3RydWN0IHVkcF9zZXFfYWZpbmZvICphZmluZm8pCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwOworCWludCByYyA9IDA7CisKKwlpZiAoIWFmaW5mbykKKwkJcmV0dXJuIC1FSU5WQUw7CisJYWZpbmZvLT5zZXFfZm9wcy0+b3duZXIJCT0gYWZpbmZvLT5vd25lcjsKKwlhZmluZm8tPnNlcV9mb3BzLT5vcGVuCQk9IHVkcF9zZXFfb3BlbjsKKwlhZmluZm8tPnNlcV9mb3BzLT5yZWFkCQk9IHNlcV9yZWFkOworCWFmaW5mby0+c2VxX2ZvcHMtPmxsc2Vlawk9IHNlcV9sc2VlazsKKwlhZmluZm8tPnNlcV9mb3BzLT5yZWxlYXNlCT0gc2VxX3JlbGVhc2VfcHJpdmF0ZTsKKworCXAgPSBwcm9jX25ldF9mb3BzX2NyZWF0ZShhZmluZm8tPm5hbWUsIFNfSVJVR08sIGFmaW5mby0+c2VxX2ZvcHMpOworCWlmIChwKQorCQlwLT5kYXRhID0gYWZpbmZvOworCWVsc2UKKwkJcmMgPSAtRU5PTUVNOworCXJldHVybiByYzsKK30KKwordm9pZCB1ZHBfcHJvY191bnJlZ2lzdGVyKHN0cnVjdCB1ZHBfc2VxX2FmaW5mbyAqYWZpbmZvKQoreworCWlmICghYWZpbmZvKQorCQlyZXR1cm47CisJcHJvY19uZXRfcmVtb3ZlKGFmaW5mby0+bmFtZSk7CisJbWVtc2V0KGFmaW5mby0+c2VxX2ZvcHMsIDAsIHNpemVvZigqYWZpbmZvLT5zZXFfZm9wcykpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB2b2lkIHVkcDRfZm9ybWF0X3NvY2soc3RydWN0IHNvY2sgKnNwLCBjaGFyICp0bXBidWYsIGludCBidWNrZXQpCit7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc3ApOworCXVuc2lnbmVkIGludCBkZXN0ID0gaW5ldC0+ZGFkZHI7CisJdW5zaWduZWQgaW50IHNyYyAgPSBpbmV0LT5yY3Zfc2FkZHI7CisJX191MTYgZGVzdHAJICA9IG50b2hzKGluZXQtPmRwb3J0KTsKKwlfX3UxNiBzcmNwCSAgPSBudG9ocyhpbmV0LT5zcG9ydCk7CisKKwlzcHJpbnRmKHRtcGJ1ZiwgIiU0ZDogJTA4WDolMDRYICUwOFg6JTA0WCIKKwkJIiAlMDJYICUwOFg6JTA4WCAlMDJYOiUwOGxYICUwOFggJTVkICU4ZCAlbHUgJWQgJXAiLAorCQlidWNrZXQsIHNyYywgc3JjcCwgZGVzdCwgZGVzdHAsIHNwLT5za19zdGF0ZSwgCisJCWF0b21pY19yZWFkKCZzcC0+c2tfd21lbV9hbGxvYyksCisJCWF0b21pY19yZWFkKCZzcC0+c2tfcm1lbV9hbGxvYyksCisJCTAsIDBMLCAwLCBzb2NrX2lfdWlkKHNwKSwgMCwgc29ja19pX2lubyhzcCksCisJCWF0b21pY19yZWFkKCZzcC0+c2tfcmVmY250KSwgc3ApOworfQorCitzdGF0aWMgaW50IHVkcDRfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlzZXFfcHJpbnRmKHNlcSwgIiUtMTI3c1xuIiwKKwkJCSAgICIgIHNsICBsb2NhbF9hZGRyZXNzIHJlbV9hZGRyZXNzICAgc3QgdHhfcXVldWUgIgorCQkJICAgInJ4X3F1ZXVlIHRyIHRtLT53aGVuIHJldHJuc210ICAgdWlkICB0aW1lb3V0ICIKKwkJCSAgICJpbm9kZSIpOworCWVsc2UgeworCQljaGFyIHRtcGJ1ZlsxMjldOworCQlzdHJ1Y3QgdWRwX2l0ZXJfc3RhdGUgKnN0YXRlID0gc2VxLT5wcml2YXRlOworCisJCXVkcDRfZm9ybWF0X3NvY2sodiwgdG1wYnVmLCBzdGF0ZS0+YnVja2V0KTsKKwkJc2VxX3ByaW50ZihzZXEsICIlLTEyN3NcbiIsIHRtcGJ1Zik7CisJfQorCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVkcDRfc2VxX2ZvcHM7CitzdGF0aWMgc3RydWN0IHVkcF9zZXFfYWZpbmZvIHVkcDRfc2VxX2FmaW5mbyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gInVkcCIsCisJLmZhbWlseQkJPSBBRl9JTkVULAorCS5zZXFfc2hvdwk9IHVkcDRfc2VxX3Nob3csCisJLnNlcV9mb3BzCT0gJnVkcDRfc2VxX2ZvcHMsCit9OworCitpbnQgX19pbml0IHVkcDRfcHJvY19pbml0KHZvaWQpCit7CisJcmV0dXJuIHVkcF9wcm9jX3JlZ2lzdGVyKCZ1ZHA0X3NlcV9hZmluZm8pOworfQorCit2b2lkIHVkcDRfcHJvY19leGl0KHZvaWQpCit7CisJdWRwX3Byb2NfdW5yZWdpc3RlcigmdWRwNF9zZXFfYWZpbmZvKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCitFWFBPUlRfU1lNQk9MKHVkcF9kaXNjb25uZWN0KTsKK0VYUE9SVF9TWU1CT0wodWRwX2hhc2gpOworRVhQT1JUX1NZTUJPTCh1ZHBfaGFzaF9sb2NrKTsKK0VYUE9SVF9TWU1CT0wodWRwX2lvY3RsKTsKK0VYUE9SVF9TWU1CT0wodWRwX3BvcnRfcm92ZXIpOworRVhQT1JUX1NZTUJPTCh1ZHBfcHJvdCk7CitFWFBPUlRfU1lNQk9MKHVkcF9zZW5kbXNnKTsKK0VYUE9SVF9TWU1CT0wodWRwX3BvbGwpOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK0VYUE9SVF9TWU1CT0wodWRwX3Byb2NfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTCh1ZHBfcHJvY191bnJlZ2lzdGVyKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdXRpbHMuYyBiL25ldC9pcHY0L3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFlY2Q3YQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L3V0aWxzLmMKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlWYXJpb3VzIGtlcm5lbC1yZXNpZGVudCBJTkVUIHV0aWxpdHkgZnVuY3Rpb25zOyBtYWlubHkKKyAqCQlmb3IgZm9ybWF0IGNvbnZlcnNpb24gYW5kIGRlYnVnZ2luZyBvdXRwdXQuCisgKgorICogVmVyc2lvbjoJJElkOiB1dGlscy5jLHYgMS44IDIwMDAvMTAvMDMgMDc6Mjk6MDEgYW50b24gRXhwICQKKyAqCisgKiBBdXRob3I6CUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoKKyAqIEZpeGVzOgorICoJCUFsYW4gQ294CToJdmVyaWZ5X2FyZWEgY2hlY2suCisgKgkJQWxhbiBDb3gJOglyZW1vdmVkIG9sZCBkZWJ1Z2dpbmcuCisgKgkJQW5kaSBLbGVlbgk6CWFkZCBuZXRfcmF0ZWxpbWl0KCkgIAorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworLyoKKyAqCUNvbnZlcnQgYW4gQVNDSUkgc3RyaW5nIHRvIGJpbmFyeSBJUC4gCisgKi8KKyAKK19fdTMyIGluX2F0b24oY29uc3QgY2hhciAqc3RyKQoreworCXVuc2lnbmVkIGxvbmcgbDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBpOworCisJbCA9IDA7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgCisJeworCQlsIDw8PSA4OworCQlpZiAoKnN0ciAhPSAnXDAnKSAKKwkJeworCQkJdmFsID0gMDsKKwkJCXdoaWxlICgqc3RyICE9ICdcMCcgJiYgKnN0ciAhPSAnLicpIAorCQkJeworCQkJCXZhbCAqPSAxMDsKKwkJCQl2YWwgKz0gKnN0ciAtICcwJzsKKwkJCQlzdHIrKzsKKwkJCX0KKwkJCWwgfD0gdmFsOworCQkJaWYgKCpzdHIgIT0gJ1wwJykgCisJCQkJc3RyKys7CisJCX0KKwl9CisJcmV0dXJuKGh0b25sKGwpKTsKK30KKworRVhQT1JUX1NZTUJPTChpbl9hdG9uKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3hmcm00X2lucHV0LmMgYi9uZXQvaXB2NC94ZnJtNF9pbnB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMzg0OWMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC94ZnJtNF9pbnB1dC5jCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogeGZybTRfaW5wdXQuYworICoKKyAqIENoYW5nZXM6CisgKglZT1NISUZVSkkgSGlkZWFraSBAVVNBR0kKKyAqCQlTcGxpdCB1cCBhZi1zcGVjaWZpYyBwb3J0aW9uCisgKglEZXJlayBBdGtpbnMgPGRlcmVrQGlodGZwLmNvbT4KKyAqCQlBZGQgRW5jYXBzdWxhdGlvbiBzdXBwb3J0CisgKiAJCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPG5ldC9pbmV0X2Vjbi5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC94ZnJtLmg+CisKK2ludCB4ZnJtNF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4geGZybTRfcmN2X2VuY2FwKHNrYiwgMCk7Cit9CisKK0VYUE9SVF9TWU1CT0woeGZybTRfcmN2KTsKKworc3RhdGljIGlubGluZSB2b2lkIGlwaXBfZWNuX2RlY2Fwc3VsYXRlKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlwaGRyICpvdXRlcl9pcGggPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgaXBoZHIgKmlubmVyX2lwaCA9IHNrYi0+aC5pcGlwaDsKKworCWlmIChJTkVUX0VDTl9pc19jZShvdXRlcl9pcGgtPnRvcykpCisJCUlQX0VDTl9zZXRfY2UoaW5uZXJfaXBoKTsKK30KKworc3RhdGljIGludCB4ZnJtNF9wYXJzZV9zcGkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggbmV4dGhkciwgdTMyICpzcGksIHUzMiAqc2VxKQoreworCXN3aXRjaCAobmV4dGhkcikgeworCWNhc2UgSVBQUk9UT19JUElQOgorCQlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJKnNwaSA9IHNrYi0+bmguaXBoLT5zYWRkcjsKKwkJKnNlcSA9IDA7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiB4ZnJtX3BhcnNlX3NwaShza2IsIG5leHRoZHIsIHNwaSwgc2VxKTsKK30KKworaW50IHhmcm00X3Jjdl9lbmNhcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX3UxNiBlbmNhcF90eXBlKQoreworCWludCBlcnI7CisJdTMyIHNwaSwgc2VxOworCXN0cnVjdCBzZWNfZGVjYXBfc3RhdGUgeGZybV92ZWNbWEZSTV9NQVhfREVQVEhdOworCXN0cnVjdCB4ZnJtX3N0YXRlICp4OworCWludCB4ZnJtX25yID0gMDsKKwlpbnQgZGVjYXBzID0gMDsKKworCWlmICgoZXJyID0geGZybTRfcGFyc2Vfc3BpKHNrYiwgc2tiLT5uaC5pcGgtPnByb3RvY29sLCAmc3BpLCAmc2VxKSkgIT0gMCkKKwkJZ290byBkcm9wOworCisJZG8geworCQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCisJCWlmICh4ZnJtX25yID09IFhGUk1fTUFYX0RFUFRIKQorCQkJZ290byBkcm9wOworCisJCXggPSB4ZnJtX3N0YXRlX2xvb2t1cCgoeGZybV9hZGRyZXNzX3QgKikmaXBoLT5kYWRkciwgc3BpLCBpcGgtPnByb3RvY29sLCBBRl9JTkVUKTsKKwkJaWYgKHggPT0gTlVMTCkKKwkJCWdvdG8gZHJvcDsKKworCQlzcGluX2xvY2soJngtPmxvY2spOworCQlpZiAodW5saWtlbHkoeC0+a20uc3RhdGUgIT0gWEZSTV9TVEFURV9WQUxJRCkpCisJCQlnb3RvIGRyb3BfdW5sb2NrOworCisJCWlmICh4LT5wcm9wcy5yZXBsYXlfd2luZG93ICYmIHhmcm1fcmVwbGF5X2NoZWNrKHgsIHNlcSkpCisJCQlnb3RvIGRyb3BfdW5sb2NrOworCisJCWlmICh4ZnJtX3N0YXRlX2NoZWNrX2V4cGlyZSh4KSkKKwkJCWdvdG8gZHJvcF91bmxvY2s7CisKKwkJeGZybV92ZWNbeGZybV9ucl0uZGVjYXAuZGVjYXBfdHlwZSA9IGVuY2FwX3R5cGU7CisJCWlmICh4LT50eXBlLT5pbnB1dCh4LCAmKHhmcm1fdmVjW3hmcm1fbnJdLmRlY2FwKSwgc2tiKSkKKwkJCWdvdG8gZHJvcF91bmxvY2s7CisKKwkJLyogb25seSB0aGUgZmlyc3QgeGZybSBnZXRzIHRoZSBlbmNhcCB0eXBlICovCisJCWVuY2FwX3R5cGUgPSAwOworCisJCWlmICh4LT5wcm9wcy5yZXBsYXlfd2luZG93KQorCQkJeGZybV9yZXBsYXlfYWR2YW5jZSh4LCBzZXEpOworCisJCXgtPmN1cmxmdC5ieXRlcyArPSBza2ItPmxlbjsKKwkJeC0+Y3VybGZ0LnBhY2tldHMrKzsKKworCQlzcGluX3VubG9jaygmeC0+bG9jayk7CisKKwkJeGZybV92ZWNbeGZybV9ucisrXS54dmVjID0geDsKKworCQlpcGggPSBza2ItPm5oLmlwaDsKKworCQlpZiAoeC0+cHJvcHMubW9kZSkgeworCQkJaWYgKGlwaC0+cHJvdG9jb2wgIT0gSVBQUk9UT19JUElQKQorCQkJCWdvdG8gZHJvcDsKKwkJCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKSkKKwkJCQlnb3RvIGRyb3A7CisJCQlpZiAoc2tiX2Nsb25lZChza2IpICYmCisJCQkgICAgcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpKQorCQkJCWdvdG8gZHJvcDsKKwkJCWlmICh4LT5wcm9wcy5mbGFncyAmIFhGUk1fU1RBVEVfREVDQVBfRFNDUCkKKwkJCQlpcHY0X2NvcHlfZHNjcChpcGgsIHNrYi0+aC5pcGlwaCk7CisJCQlpZiAoISh4LT5wcm9wcy5mbGFncyAmIFhGUk1fU1RBVEVfTk9FQ04pKQorCQkJCWlwaXBfZWNuX2RlY2Fwc3VsYXRlKHNrYik7CisJCQlza2ItPm1hYy5yYXcgPSBtZW1tb3ZlKHNrYi0+ZGF0YSAtIHNrYi0+bWFjX2xlbiwKKwkJCQkJICAgICAgIHNrYi0+bWFjLnJhdywgc2tiLT5tYWNfbGVuKTsKKwkJCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCQkJbWVtc2V0KCYoSVBDQihza2IpLT5vcHQpLCAwLCBzaXplb2Yoc3RydWN0IGlwX29wdGlvbnMpKTsKKwkJCWRlY2FwcyA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCWlmICgoZXJyID0geGZybV9wYXJzZV9zcGkoc2tiLCBza2ItPm5oLmlwaC0+cHJvdG9jb2wsICZzcGksICZzZXEpKSA8IDApCisJCQlnb3RvIGRyb3A7CisJfSB3aGlsZSAoIWVycik7CisKKwkvKiBBbGxvY2F0ZSBuZXcgc2VjcGF0aCBvciBDT1cgZXhpc3Rpbmcgb25lLiAqLworCisJaWYgKCFza2ItPnNwIHx8IGF0b21pY19yZWFkKCZza2ItPnNwLT5yZWZjbnQpICE9IDEpIHsKKwkJc3RydWN0IHNlY19wYXRoICpzcDsKKwkJc3AgPSBzZWNwYXRoX2R1cChza2ItPnNwKTsKKwkJaWYgKCFzcCkKKwkJCWdvdG8gZHJvcDsKKwkJaWYgKHNrYi0+c3ApCisJCQlzZWNwYXRoX3B1dChza2ItPnNwKTsKKwkJc2tiLT5zcCA9IHNwOworCX0KKwlpZiAoeGZybV9uciArIHNrYi0+c3AtPmxlbiA+IFhGUk1fTUFYX0RFUFRIKQorCQlnb3RvIGRyb3A7CisKKwltZW1jcHkoc2tiLT5zcC0+eCtza2ItPnNwLT5sZW4sIHhmcm1fdmVjLCB4ZnJtX25yKnNpemVvZihzdHJ1Y3Qgc2VjX2RlY2FwX3N0YXRlKSk7CisJc2tiLT5zcC0+bGVuICs9IHhmcm1fbnI7CisKKwlpZiAoZGVjYXBzKSB7CisJCWlmICghKHNrYi0+ZGV2LT5mbGFncyZJRkZfTE9PUEJBQ0spKSB7CisJCQlkc3RfcmVsZWFzZShza2ItPmRzdCk7CisJCQlza2ItPmRzdCA9IE5VTEw7CisJCX0KKwkJbmV0aWZfcngoc2tiKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1za2ItPm5oLmlwaC0+cHJvdG9jb2w7CisJfQorCitkcm9wX3VubG9jazoKKwlzcGluX3VubG9jaygmeC0+bG9jayk7CisJeGZybV9zdGF0ZV9wdXQoeCk7Citkcm9wOgorCXdoaWxlICgtLXhmcm1fbnIgPj0gMCkKKwkJeGZybV9zdGF0ZV9wdXQoeGZybV92ZWNbeGZybV9ucl0ueHZlYyk7CisKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3hmcm00X291dHB1dC5jIGIvbmV0L2lwdjQveGZybTRfb3V0cHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYyMzkyYQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L3hmcm00X291dHB1dC5jCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogeGZybTRfb3V0cHV0LmMgLSBDb21tb24gSVBzZWMgZW5jYXBzdWxhdGlvbiBjb2RlIGZvciBJUHY0LgorICogQ29weXJpZ2h0IChjKSAyMDA0IEhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxuZXQvaW5ldF9lY24uaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQveGZybS5oPgorI2luY2x1ZGUgPG5ldC9pY21wLmg+CisKKy8qIEFkZCBlbmNhcHN1bGF0aW9uIGhlYWRlci4KKyAqCisgKiBJbiB0cmFuc3BvcnQgbW9kZSwgdGhlIElQIGhlYWRlciB3aWxsIGJlIG1vdmVkIGZvcndhcmQgdG8gbWFrZSBzcGFjZQorICogZm9yIHRoZSBlbmNhcHN1bGF0aW9uIGhlYWRlci4KKyAqCisgKiBJbiB0dW5uZWwgbW9kZSwgdGhlIHRvcCBJUCBoZWFkZXIgd2lsbCBiZSBjb25zdHJ1Y3RlZCBwZXIgUkZDIDI0MDEuCisgKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBpbiBpdCBzaGFsbCBiZSBmaWxsZWQgaW4gYnkgeC0+dHlwZS0+b3V0cHV0OgorICoJdG90X2xlbgorICoJY2hlY2sKKyAqCisgKiBPbiBleGl0LCBza2ItPmggd2lsbCBiZSBzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwYXlsb2FkIHRvIGJlIHByb2Nlc3NlZAorICogYnkgeC0+dHlwZS0+b3V0cHV0IGFuZCBza2ItPm5oIHdpbGwgYmUgc2V0IHRvIHRoZSB0b3AgSVAgaGVhZGVyLgorICovCitzdGF0aWMgdm9pZCB4ZnJtNF9lbmNhcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYi0+ZHN0OworCXN0cnVjdCB4ZnJtX3N0YXRlICp4ID0gZHN0LT54ZnJtOworCXN0cnVjdCBpcGhkciAqaXBoLCAqdG9wX2lwaDsKKworCWlwaCA9IHNrYi0+bmguaXBoOworCXNrYi0+aC5pcGlwaCA9IGlwaDsKKworCXNrYi0+bmgucmF3ID0gc2tiX3B1c2goc2tiLCB4LT5wcm9wcy5oZWFkZXJfbGVuKTsKKwl0b3BfaXBoID0gc2tiLT5uaC5pcGg7CisKKwlpZiAoIXgtPnByb3BzLm1vZGUpIHsKKwkJc2tiLT5oLnJhdyArPSBpcGgtPmlobCo0OworCQltZW1tb3ZlKHRvcF9pcGgsIGlwaCwgaXBoLT5paGwqNCk7CisJCXJldHVybjsKKwl9CisKKwl0b3BfaXBoLT5paGwgPSA1OworCXRvcF9pcGgtPnZlcnNpb24gPSA0OworCisJLyogRFMgZGlzY2xvc2VkICovCisJdG9wX2lwaC0+dG9zID0gSU5FVF9FQ05fZW5jYXBzdWxhdGUoaXBoLT50b3MsIGlwaC0+dG9zKTsKKwlpZiAoeC0+cHJvcHMuZmxhZ3MgJiBYRlJNX1NUQVRFX05PRUNOKQorCQlJUF9FQ05fY2xlYXIodG9wX2lwaCk7CisKKwl0b3BfaXBoLT5mcmFnX29mZiA9IGlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9ERik7CisJaWYgKCF0b3BfaXBoLT5mcmFnX29mZikKKwkJX19pcF9zZWxlY3RfaWRlbnQodG9wX2lwaCwgZHN0LCAwKTsKKworCXRvcF9pcGgtPnR0bCA9IGRzdF9tZXRyaWMoZHN0LT5jaGlsZCwgUlRBWF9IT1BMSU1JVCk7CisKKwl0b3BfaXBoLT5zYWRkciA9IHgtPnByb3BzLnNhZGRyLmE0OworCXRvcF9pcGgtPmRhZGRyID0geC0+aWQuZGFkZHIuYTQ7CisJdG9wX2lwaC0+cHJvdG9jb2wgPSBJUFBST1RPX0lQSVA7CisKKwltZW1zZXQoJihJUENCKHNrYiktPm9wdCksIDAsIHNpemVvZihzdHJ1Y3QgaXBfb3B0aW9ucykpOworfQorCitzdGF0aWMgaW50IHhmcm00X3R1bm5lbF9jaGVja19zaXplKHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IG10dSwgcmV0ID0gMDsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CisJc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKworCWlmIChJUENCKHNrYiktPmZsYWdzICYgSVBTS0JfWEZSTV9UVU5ORUxfU0laRSkKKwkJZ290byBvdXQ7CisKKwlJUENCKHNrYiktPmZsYWdzIHw9IElQU0tCX1hGUk1fVFVOTkVMX1NJWkU7CisJCisJaWYgKCEoaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX0RGKSkgfHwgc2tiLT5sb2NhbF9kZikKKwkJZ290byBvdXQ7CisKKwlkc3QgPSBza2ItPmRzdDsKKwltdHUgPSBkc3RfbXR1KGRzdCk7CisJaWYgKHNrYi0+bGVuID4gbXR1KSB7CisJCWljbXBfc2VuZChza2IsIElDTVBfREVTVF9VTlJFQUNILCBJQ01QX0ZSQUdfTkVFREVELCBodG9ubChtdHUpKTsKKwkJcmV0ID0gLUVNU0dTSVpFOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgeGZybTRfb3V0cHV0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiLT5kc3Q7CisJc3RydWN0IHhmcm1fc3RhdGUgKnggPSBkc3QtPnhmcm07CisJaW50IGVycjsKKwkKKwlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpIHsKKwkJZXJyID0gc2tiX2NoZWNrc3VtX2hlbHAoc2tiLCAwKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyb3Jfbm9sb2NrOworCX0KKworCWlmICh4LT5wcm9wcy5tb2RlKSB7CisJCWVyciA9IHhmcm00X3R1bm5lbF9jaGVja19zaXplKHNrYik7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycm9yX25vbG9jazsKKwl9CisKKwlzcGluX2xvY2tfYmgoJngtPmxvY2spOworCWVyciA9IHhmcm1fc3RhdGVfY2hlY2soeCwgc2tiKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yOworCisJeGZybTRfZW5jYXAoc2tiKTsKKworCWVyciA9IHgtPnR5cGUtPm91dHB1dCh4LCBza2IpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3I7CisKKwl4LT5jdXJsZnQuYnl0ZXMgKz0gc2tiLT5sZW47CisJeC0+Y3VybGZ0LnBhY2tldHMrKzsKKworCXNwaW5fdW5sb2NrX2JoKCZ4LT5sb2NrKTsKKwkKKwlpZiAoIShza2ItPmRzdCA9IGRzdF9wb3AoZHN0KSkpIHsKKwkJZXJyID0gLUVIT1NUVU5SRUFDSDsKKwkJZ290byBlcnJvcl9ub2xvY2s7CisJfQorCWVyciA9IE5FVF9YTUlUX0JZUEFTUzsKKworb3V0X2V4aXQ6CisJcmV0dXJuIGVycjsKK2Vycm9yOgorCXNwaW5fdW5sb2NrX2JoKCZ4LT5sb2NrKTsKK2Vycm9yX25vbG9jazoKKwlrZnJlZV9za2Ioc2tiKTsKKwlnb3RvIG91dF9leGl0OworfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQveGZybTRfcG9saWN5LmMgYi9uZXQvaXB2NC94ZnJtNF9wb2xpY3kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmUyYWZkCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQveGZybTRfcG9saWN5LmMKQEAgLTAsMCArMSwyODEgQEAKKy8qIAorICogeGZybTRfcG9saWN5LmMKKyAqCisgKiBDaGFuZ2VzOgorICoJS2F6dW5vcmkgTUlZQVpBV0EgQFVTQUdJCisgKiAJWU9TSElGVUpJIEhpZGVha2kgQFVTQUdJCisgKgkJU3BsaXQgdXAgYWYtc3BlY2lmaWMgcG9ydGlvbgorICogCQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxuZXQveGZybS5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorCitzdGF0aWMgc3RydWN0IGRzdF9vcHMgeGZybTRfZHN0X29wczsKK3N0YXRpYyBzdHJ1Y3QgeGZybV9wb2xpY3lfYWZpbmZvIHhmcm00X3BvbGljeV9hZmluZm87CisKK3N0YXRpYyBzdHJ1Y3QgeGZybV90eXBlX21hcCB4ZnJtNF90eXBlX21hcCA9IHsgLmxvY2sgPSBSV19MT0NLX1VOTE9DS0VEIH07CisKK3N0YXRpYyBpbnQgeGZybTRfZHN0X2xvb2t1cChzdHJ1Y3QgeGZybV9kc3QgKipkc3QsIHN0cnVjdCBmbG93aSAqZmwpCit7CisJcmV0dXJuIF9faXBfcm91dGVfb3V0cHV0X2tleSgoc3RydWN0IHJ0YWJsZSoqKWRzdCwgZmwpOworfQorCitzdGF0aWMgc3RydWN0IGRzdF9lbnRyeSAqCitfX3hmcm00X2ZpbmRfYnVuZGxlKHN0cnVjdCBmbG93aSAqZmwsIHN0cnVjdCB4ZnJtX3BvbGljeSAqcG9saWN5KQoreworCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKKworCXJlYWRfbG9ja19iaCgmcG9saWN5LT5sb2NrKTsKKwlmb3IgKGRzdCA9IHBvbGljeS0+YnVuZGxlczsgZHN0OyBkc3QgPSBkc3QtPm5leHQpIHsKKwkJc3RydWN0IHhmcm1fZHN0ICp4ZHN0ID0gKHN0cnVjdCB4ZnJtX2RzdCopZHN0OworCQlpZiAoeGRzdC0+dS5ydC5mbC5vaWYgPT0gZmwtPm9pZiAmJgkvKlhYWCovCisJCSAgICB4ZHN0LT51LnJ0LmZsLmZsNF9kc3QgPT0gZmwtPmZsNF9kc3QgJiYKKwkgICAgCSAgICB4ZHN0LT51LnJ0LmZsLmZsNF9zcmMgPT0gZmwtPmZsNF9zcmMgJiYKKwkJICAgIHhmcm1fYnVuZGxlX29rKHhkc3QsIGZsLCBBRl9JTkVUKSkgeworCQkJZHN0X2Nsb25lKGRzdCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZWFkX3VubG9ja19iaCgmcG9saWN5LT5sb2NrKTsKKwlyZXR1cm4gZHN0OworfQorCisvKiBBbGxvY2F0ZSBjaGFpbiBvZiBkc3RfZW50cnkncywgYXR0YWNoIGtub3duIHhmcm0ncywgY2FsY3VsYXRlCisgKiBhbGwgdGhlIG1ldHJpY3MuLi4gU2hvcnRseSwgYnVuZGxlIGEgYnVuZGxlLgorICovCisKK3N0YXRpYyBpbnQKK19feGZybTRfYnVuZGxlX2NyZWF0ZShzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbGljeSwgc3RydWN0IHhmcm1fc3RhdGUgKip4ZnJtLCBpbnQgbngsCisJCSAgICAgIHN0cnVjdCBmbG93aSAqZmwsIHN0cnVjdCBkc3RfZW50cnkgKipkc3RfcCkKK3sKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsICpkc3RfcHJldjsKKwlzdHJ1Y3QgcnRhYmxlICpydDAgPSAoc3RydWN0IHJ0YWJsZSopKCpkc3RfcCk7CisJc3RydWN0IHJ0YWJsZSAqcnQgPSBydDA7CisJdTMyIHJlbW90ZSA9IGZsLT5mbDRfZHN0OworCXUzMiBsb2NhbCAgPSBmbC0+Zmw0X3NyYzsKKwlzdHJ1Y3QgZmxvd2kgZmxfdHVubmVsID0geworCQkubmxfdSA9IHsKKwkJCS5pcDRfdSA9IHsKKwkJCQkuc2FkZHIgPSBsb2NhbCwKKwkJCQkuZGFkZHIgPSByZW1vdGUKKwkJCX0KKwkJfQorCX07CisJaW50IGk7CisJaW50IGVycjsKKwlpbnQgaGVhZGVyX2xlbiA9IDA7CisJaW50IHRyYWlsZXJfbGVuID0gMDsKKworCWRzdCA9IGRzdF9wcmV2ID0gTlVMTDsKKwlkc3RfaG9sZCgmcnQtPnUuZHN0KTsKKworCWZvciAoaSA9IDA7IGkgPCBueDsgaSsrKSB7CisJCXN0cnVjdCBkc3RfZW50cnkgKmRzdDEgPSBkc3RfYWxsb2MoJnhmcm00X2RzdF9vcHMpOworCQlzdHJ1Y3QgeGZybV9kc3QgKnhkc3Q7CisJCWludCB0dW5uZWwgPSAwOworCisJCWlmICh1bmxpa2VseShkc3QxID09IE5VTEwpKSB7CisJCQllcnIgPSAtRU5PQlVGUzsKKwkJCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWlmICghZHN0KQorCQkJZHN0ID0gZHN0MTsKKwkJZWxzZSB7CisJCQlkc3RfcHJldi0+Y2hpbGQgPSBkc3QxOworCQkJZHN0MS0+ZmxhZ3MgfD0gRFNUX05PSEFTSDsKKwkJCWRzdF9jbG9uZShkc3QxKTsKKwkJfQorCisJCXhkc3QgPSAoc3RydWN0IHhmcm1fZHN0ICopZHN0MTsKKwkJeGRzdC0+cm91dGUgPSAmcnQtPnUuZHN0OworCisJCWRzdDEtPm5leHQgPSBkc3RfcHJldjsKKwkJZHN0X3ByZXYgPSBkc3QxOworCQlpZiAoeGZybVtpXS0+cHJvcHMubW9kZSkgeworCQkJcmVtb3RlID0geGZybVtpXS0+aWQuZGFkZHIuYTQ7CisJCQlsb2NhbCAgPSB4ZnJtW2ldLT5wcm9wcy5zYWRkci5hNDsKKwkJCXR1bm5lbCA9IDE7CisJCX0KKwkJaGVhZGVyX2xlbiArPSB4ZnJtW2ldLT5wcm9wcy5oZWFkZXJfbGVuOworCQl0cmFpbGVyX2xlbiArPSB4ZnJtW2ldLT5wcm9wcy50cmFpbGVyX2xlbjsKKworCQlpZiAodHVubmVsKSB7CisJCQlmbF90dW5uZWwuZmw0X3NyYyA9IGxvY2FsOworCQkJZmxfdHVubmVsLmZsNF9kc3QgPSByZW1vdGU7CisJCQllcnIgPSB4ZnJtX2RzdF9sb29rdXAoKHN0cnVjdCB4ZnJtX2RzdCAqKikmcnQsCisJCQkJCSAgICAgICZmbF90dW5uZWwsIEFGX0lORVQpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIGVycm9yOworCQl9IGVsc2UKKwkJCWRzdF9ob2xkKCZydC0+dS5kc3QpOworCX0KKworCWRzdF9wcmV2LT5jaGlsZCA9ICZydC0+dS5kc3Q7CisJZHN0LT5wYXRoID0gJnJ0LT51LmRzdDsKKworCSpkc3RfcCA9IGRzdDsKKwlkc3QgPSBkc3RfcHJldjsKKworCWRzdF9wcmV2ID0gKmRzdF9wOworCWkgPSAwOworCWZvciAoOyBkc3RfcHJldiAhPSAmcnQtPnUuZHN0OyBkc3RfcHJldiA9IGRzdF9wcmV2LT5jaGlsZCkgeworCQlzdHJ1Y3QgeGZybV9kc3QgKnggPSAoc3RydWN0IHhmcm1fZHN0Kilkc3RfcHJldjsKKwkJeC0+dS5ydC5mbCA9ICpmbDsKKworCQlkc3RfcHJldi0+eGZybSA9IHhmcm1baSsrXTsKKwkJZHN0X3ByZXYtPmRldiA9IHJ0LT51LmRzdC5kZXY7CisJCWlmIChydC0+dS5kc3QuZGV2KQorCQkJZGV2X2hvbGQocnQtPnUuZHN0LmRldik7CisJCWRzdF9wcmV2LT5vYnNvbGV0ZQk9IC0xOworCQlkc3RfcHJldi0+ZmxhZ3MJICAgICAgIHw9IERTVF9IT1NUOworCQlkc3RfcHJldi0+bGFzdHVzZQk9IGppZmZpZXM7CisJCWRzdF9wcmV2LT5oZWFkZXJfbGVuCT0gaGVhZGVyX2xlbjsKKwkJZHN0X3ByZXYtPnRyYWlsZXJfbGVuCT0gdHJhaWxlcl9sZW47CisJCW1lbWNweSgmZHN0X3ByZXYtPm1ldHJpY3MsICZ4LT5yb3V0ZS0+bWV0cmljcywgc2l6ZW9mKGRzdF9wcmV2LT5tZXRyaWNzKSk7CisKKwkJLyogQ29weSBuZWlnaGJvdXQgZm9yIHJlYWNoYWJpbGl0eSBjb25maXJtYXRpb24gKi8KKwkJZHN0X3ByZXYtPm5laWdoYm91cgk9IG5laWdoX2Nsb25lKHJ0LT51LmRzdC5uZWlnaGJvdXIpOworCQlkc3RfcHJldi0+aW5wdXQJCT0gcnQtPnUuZHN0LmlucHV0OworCQlkc3RfcHJldi0+b3V0cHV0CT0geGZybTRfb3V0cHV0OworCQlpZiAocnQtPnBlZXIpCisJCQlhdG9taWNfaW5jKCZydC0+cGVlci0+cmVmY250KTsKKwkJeC0+dS5ydC5wZWVyID0gcnQtPnBlZXI7CisJCS8qIFNoZWl0Li4uIEkgcmVtZW1iZXIgSSBkaWQgdGhpcyByaWdodC4gQXBwYXJlbnRseSwKKwkJICogaXQgd2FzIG1hZ2ljYWxseSBsb3N0LCBzbyB0aGlzIGNvZGUgbmVlZHMgYXVkaXQgKi8KKwkJeC0+dS5ydC5ydF9mbGFncyA9IHJ0MC0+cnRfZmxhZ3MmKFJUQ0ZfQlJPQURDQVNUfFJUQ0ZfTVVMVElDQVNUfFJUQ0ZfTE9DQUwpOworCQl4LT51LnJ0LnJ0X3R5cGUgPSBydC0+cnRfdHlwZTsKKwkJeC0+dS5ydC5ydF9zcmMgPSBydDAtPnJ0X3NyYzsKKwkJeC0+dS5ydC5ydF9kc3QgPSBydDAtPnJ0X2RzdDsKKwkJeC0+dS5ydC5ydF9nYXRld2F5ID0gcnQtPnJ0X2dhdGV3YXk7CisJCXgtPnUucnQucnRfc3BlY19kc3QgPSBydDAtPnJ0X3NwZWNfZHN0OworCQloZWFkZXJfbGVuIC09IHgtPnUuZHN0Lnhmcm0tPnByb3BzLmhlYWRlcl9sZW47CisJCXRyYWlsZXJfbGVuIC09IHgtPnUuZHN0Lnhmcm0tPnByb3BzLnRyYWlsZXJfbGVuOworCX0KKworCXhmcm1faW5pdF9wbXR1KGRzdCk7CisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWlmIChkc3QpCisJCWRzdF9mcmVlKGRzdCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQKK19kZWNvZGVfc2Vzc2lvbjQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGZsb3dpICpmbCkKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCXU4ICp4cHJ0aCA9IHNrYi0+bmgucmF3ICsgaXBoLT5paGwqNDsKKworCW1lbXNldChmbCwgMCwgc2l6ZW9mKHN0cnVjdCBmbG93aSkpOworCWlmICghKGlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRiB8IElQX09GRlNFVCkpKSB7CisJCXN3aXRjaCAoaXBoLT5wcm90b2NvbCkgeworCQljYXNlIElQUFJPVE9fVURQOgorCQljYXNlIElQUFJPVE9fVENQOgorCQljYXNlIElQUFJPVE9fU0NUUDoKKwkJCWlmIChwc2tiX21heV9wdWxsKHNrYiwgeHBydGggKyA0IC0gc2tiLT5kYXRhKSkgeworCQkJCXUxNiAqcG9ydHMgPSAodTE2ICopeHBydGg7CisKKwkJCQlmbC0+ZmxfaXBfc3BvcnQgPSBwb3J0c1swXTsKKwkJCQlmbC0+ZmxfaXBfZHBvcnQgPSBwb3J0c1sxXTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgSVBQUk9UT19JQ01QOgorCQkJaWYgKHBza2JfbWF5X3B1bGwoc2tiLCB4cHJ0aCArIDIgLSBza2ItPmRhdGEpKSB7CisJCQkJdTggKmljbXAgPSB4cHJ0aDsKKworCQkJCWZsLT5mbF9pY21wX3R5cGUgPSBpY21wWzBdOworCQkJCWZsLT5mbF9pY21wX2NvZGUgPSBpY21wWzFdOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJUFBST1RPX0VTUDoKKwkJCWlmIChwc2tiX21heV9wdWxsKHNrYiwgeHBydGggKyA0IC0gc2tiLT5kYXRhKSkgeworCQkJCXUzMiAqZWhkciA9ICh1MzIgKil4cHJ0aDsKKworCQkJCWZsLT5mbF9pcHNlY19zcGkgPSBlaGRyWzBdOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJUFBST1RPX0FIOgorCQkJaWYgKHBza2JfbWF5X3B1bGwoc2tiLCB4cHJ0aCArIDggLSBza2ItPmRhdGEpKSB7CisJCQkJdTMyICphaF9oZHIgPSAodTMyKil4cHJ0aDsKKworCQkJCWZsLT5mbF9pcHNlY19zcGkgPSBhaF9oZHJbMV07CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIElQUFJPVE9fQ09NUDoKKwkJCWlmIChwc2tiX21heV9wdWxsKHNrYiwgeHBydGggKyA0IC0gc2tiLT5kYXRhKSkgeworCQkJCXUxNiAqaXBjb21wX2hkciA9ICh1MTYgKil4cHJ0aDsKKworCQkJCWZsLT5mbF9pcHNlY19zcGkgPSBudG9obChudG9ocyhpcGNvbXBfaGRyWzFdKSk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZsLT5mbF9pcHNlY19zcGkgPSAwOworCQkJYnJlYWs7CisJCX07CisJfQorCWZsLT5wcm90byA9IGlwaC0+cHJvdG9jb2w7CisJZmwtPmZsNF9kc3QgPSBpcGgtPmRhZGRyOworCWZsLT5mbDRfc3JjID0gaXBoLT5zYWRkcjsKK30KKworc3RhdGljIGlubGluZSBpbnQgeGZybTRfZ2FyYmFnZV9jb2xsZWN0KHZvaWQpCit7CisJcmVhZF9sb2NrKCZ4ZnJtNF9wb2xpY3lfYWZpbmZvLmxvY2spOworCXhmcm00X3BvbGljeV9hZmluZm8uZ2FyYmFnZV9jb2xsZWN0KCk7CisJcmVhZF91bmxvY2soJnhmcm00X3BvbGljeV9hZmluZm8ubG9jayk7CisJcmV0dXJuIChhdG9taWNfcmVhZCgmeGZybTRfZHN0X29wcy5lbnRyaWVzKSA+IHhmcm00X2RzdF9vcHMuZ2NfdGhyZXNoKjIpOworfQorCitzdGF0aWMgdm9pZCB4ZnJtNF91cGRhdGVfcG10dShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHUzMiBtdHUpCit7CisJc3RydWN0IHhmcm1fZHN0ICp4ZHN0ID0gKHN0cnVjdCB4ZnJtX2RzdCAqKWRzdDsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpwYXRoID0geGRzdC0+cm91dGU7CisKKwlwYXRoLT5vcHMtPnVwZGF0ZV9wbXR1KHBhdGgsIG10dSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHN0X29wcyB4ZnJtNF9kc3Rfb3BzID0geworCS5mYW1pbHkgPQkJQUZfSU5FVCwKKwkucHJvdG9jb2wgPQkJX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCksCisJLmdjID0JCQl4ZnJtNF9nYXJiYWdlX2NvbGxlY3QsCisJLnVwZGF0ZV9wbXR1ID0JCXhmcm00X3VwZGF0ZV9wbXR1LAorCS5nY190aHJlc2ggPQkJMTAyNCwKKwkuZW50cnlfc2l6ZSA9CQlzaXplb2Yoc3RydWN0IHhmcm1fZHN0KSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgeGZybV9wb2xpY3lfYWZpbmZvIHhmcm00X3BvbGljeV9hZmluZm8gPSB7CisJLmZhbWlseSA9IAkJQUZfSU5FVCwKKwkubG9jayA9IAkJUldfTE9DS19VTkxPQ0tFRCwKKwkudHlwZV9tYXAgPSAJCSZ4ZnJtNF90eXBlX21hcCwKKwkuZHN0X29wcyA9CQkmeGZybTRfZHN0X29wcywKKwkuZHN0X2xvb2t1cCA9CQl4ZnJtNF9kc3RfbG9va3VwLAorCS5maW5kX2J1bmRsZSA9IAkJX194ZnJtNF9maW5kX2J1bmRsZSwKKwkuYnVuZGxlX2NyZWF0ZSA9CV9feGZybTRfYnVuZGxlX2NyZWF0ZSwKKwkuZGVjb2RlX3Nlc3Npb24gPQlfZGVjb2RlX3Nlc3Npb240LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHhmcm00X3BvbGljeV9pbml0KHZvaWQpCit7CisJeGZybV9wb2xpY3lfcmVnaXN0ZXJfYWZpbmZvKCZ4ZnJtNF9wb2xpY3lfYWZpbmZvKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHhmcm00X3BvbGljeV9maW5pKHZvaWQpCit7CisJeGZybV9wb2xpY3lfdW5yZWdpc3Rlcl9hZmluZm8oJnhmcm00X3BvbGljeV9hZmluZm8pOworfQorCit2b2lkIF9faW5pdCB4ZnJtNF9pbml0KHZvaWQpCit7CisJeGZybTRfc3RhdGVfaW5pdCgpOworCXhmcm00X3BvbGljeV9pbml0KCk7Cit9CisKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3hmcm00X3N0YXRlLmMgYi9uZXQvaXB2NC94ZnJtNF9zdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyM2EyZTgKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC94ZnJtNF9zdGF0ZS5jCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogeGZybTRfc3RhdGUuYworICoKKyAqIENoYW5nZXM6CisgKiAJWU9TSElGVUpJIEhpZGVha2kgQFVTQUdJCisgKiAJCVNwbGl0IHVwIGFmLXNwZWNpZmljIHBvcnRpb24KKyAqCisgKi8KKworI2luY2x1ZGUgPG5ldC94ZnJtLmg+CisjaW5jbHVkZSA8bGludXgvcGZrZXl2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwc2VjLmg+CisKK3N0YXRpYyBzdHJ1Y3QgeGZybV9zdGF0ZV9hZmluZm8geGZybTRfc3RhdGVfYWZpbmZvOworCitzdGF0aWMgdm9pZAorX194ZnJtNF9pbml0X3RlbXBzZWwoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBmbG93aSAqZmwsCisJCSAgICAgc3RydWN0IHhmcm1fdG1wbCAqdG1wbCwKKwkJICAgICB4ZnJtX2FkZHJlc3NfdCAqZGFkZHIsIHhmcm1fYWRkcmVzc190ICpzYWRkcikKK3sKKwl4LT5zZWwuZGFkZHIuYTQgPSBmbC0+Zmw0X2RzdDsKKwl4LT5zZWwuc2FkZHIuYTQgPSBmbC0+Zmw0X3NyYzsKKwl4LT5zZWwuZHBvcnQgPSB4ZnJtX2Zsb3dpX2Rwb3J0KGZsKTsKKwl4LT5zZWwuZHBvcnRfbWFzayA9IH4wOworCXgtPnNlbC5zcG9ydCA9IHhmcm1fZmxvd2lfc3BvcnQoZmwpOworCXgtPnNlbC5zcG9ydF9tYXNrID0gfjA7CisJeC0+c2VsLnByZWZpeGxlbl9kID0gMzI7CisJeC0+c2VsLnByZWZpeGxlbl9zID0gMzI7CisJeC0+c2VsLnByb3RvID0gZmwtPnByb3RvOworCXgtPnNlbC5pZmluZGV4ID0gZmwtPm9pZjsKKwl4LT5pZCA9IHRtcGwtPmlkOworCWlmICh4LT5pZC5kYWRkci5hNCA9PSAwKQorCQl4LT5pZC5kYWRkci5hNCA9IGRhZGRyLT5hNDsKKwl4LT5wcm9wcy5zYWRkciA9IHRtcGwtPnNhZGRyOworCWlmICh4LT5wcm9wcy5zYWRkci5hNCA9PSAwKQorCQl4LT5wcm9wcy5zYWRkci5hNCA9IHNhZGRyLT5hNDsKKwl4LT5wcm9wcy5tb2RlID0gdG1wbC0+bW9kZTsKKwl4LT5wcm9wcy5yZXFpZCA9IHRtcGwtPnJlcWlkOworCXgtPnByb3BzLmZhbWlseSA9IEFGX0lORVQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeGZybV9zdGF0ZSAqCitfX3hmcm00X3N0YXRlX2xvb2t1cCh4ZnJtX2FkZHJlc3NfdCAqZGFkZHIsIHUzMiBzcGksIHU4IHByb3RvKQoreworCXVuc2lnbmVkIGggPSBfX3hmcm00X3NwaV9oYXNoKGRhZGRyLCBzcGksIHByb3RvKTsKKwlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoeCwgeGZybTRfc3RhdGVfYWZpbmZvLnN0YXRlX2J5c3BpK2gsIGJ5c3BpKSB7CisJCWlmICh4LT5wcm9wcy5mYW1pbHkgPT0gQUZfSU5FVCAmJgorCQkgICAgc3BpID09IHgtPmlkLnNwaSAmJgorCQkgICAgZGFkZHItPmE0ID09IHgtPmlkLmRhZGRyLmE0ICYmCisJCSAgICBwcm90byA9PSB4LT5pZC5wcm90bykgeworCQkJeGZybV9zdGF0ZV9ob2xkKHgpOworCQkJcmV0dXJuIHg7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeGZybV9zdGF0ZSAqCitfX3hmcm00X2ZpbmRfYWNxKHU4IG1vZGUsIHUzMiByZXFpZCwgdTggcHJvdG8sIAorCQkgeGZybV9hZGRyZXNzX3QgKmRhZGRyLCB4ZnJtX2FkZHJlc3NfdCAqc2FkZHIsIAorCQkgaW50IGNyZWF0ZSkKK3sKKwlzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgKngwOworCXVuc2lnbmVkIGggPSBfX3hmcm00X2RzdF9oYXNoKGRhZGRyKTsKKworCXgwID0gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoeCwgeGZybTRfc3RhdGVfYWZpbmZvLnN0YXRlX2J5ZHN0K2gsIGJ5ZHN0KSB7CisJCWlmICh4LT5wcm9wcy5mYW1pbHkgPT0gQUZfSU5FVCAmJgorCQkgICAgZGFkZHItPmE0ID09IHgtPmlkLmRhZGRyLmE0ICYmCisJCSAgICBtb2RlID09IHgtPnByb3BzLm1vZGUgJiYKKwkJICAgIHByb3RvID09IHgtPmlkLnByb3RvICYmCisJCSAgICBzYWRkci0+YTQgPT0geC0+cHJvcHMuc2FkZHIuYTQgJiYKKwkJICAgIHJlcWlkID09IHgtPnByb3BzLnJlcWlkICYmCisJCSAgICB4LT5rbS5zdGF0ZSA9PSBYRlJNX1NUQVRFX0FDUSAmJgorCQkgICAgIXgtPmlkLnNwaSkgeworCQkJICAgIHgwID0geDsKKwkJCSAgICBicmVhazsKKwkJICAgIH0KKwl9CisJaWYgKCF4MCAmJiBjcmVhdGUgJiYgKHgwID0geGZybV9zdGF0ZV9hbGxvYygpKSAhPSBOVUxMKSB7CisJCXgwLT5zZWwuZGFkZHIuYTQgPSBkYWRkci0+YTQ7CisJCXgwLT5zZWwuc2FkZHIuYTQgPSBzYWRkci0+YTQ7CisJCXgwLT5zZWwucHJlZml4bGVuX2QgPSAzMjsKKwkJeDAtPnNlbC5wcmVmaXhsZW5fcyA9IDMyOworCQl4MC0+cHJvcHMuc2FkZHIuYTQgPSBzYWRkci0+YTQ7CisJCXgwLT5rbS5zdGF0ZSA9IFhGUk1fU1RBVEVfQUNROworCQl4MC0+aWQuZGFkZHIuYTQgPSBkYWRkci0+YTQ7CisJCXgwLT5pZC5wcm90byA9IHByb3RvOworCQl4MC0+cHJvcHMuZmFtaWx5ID0gQUZfSU5FVDsKKwkJeDAtPnByb3BzLm1vZGUgPSBtb2RlOworCQl4MC0+cHJvcHMucmVxaWQgPSByZXFpZDsKKwkJeDAtPnByb3BzLmZhbWlseSA9IEFGX0lORVQ7CisJCXgwLT5sZnQuaGFyZF9hZGRfZXhwaXJlc19zZWNvbmRzID0gWEZSTV9BQ1FfRVhQSVJFUzsKKwkJeGZybV9zdGF0ZV9ob2xkKHgwKTsKKwkJeDAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgWEZSTV9BQ1FfRVhQSVJFUypIWjsKKwkJYWRkX3RpbWVyKCZ4MC0+dGltZXIpOworCQl4ZnJtX3N0YXRlX2hvbGQoeDApOworCQlsaXN0X2FkZF90YWlsKCZ4MC0+Ynlkc3QsIHhmcm00X3N0YXRlX2FmaW5mby5zdGF0ZV9ieWRzdCtoKTsKKwkJd2FrZV91cCgma21fd2FpdHEpOworCX0KKwlpZiAoeDApCisJCXhmcm1fc3RhdGVfaG9sZCh4MCk7CisJcmV0dXJuIHgwOworfQorCitzdGF0aWMgc3RydWN0IHhmcm1fc3RhdGVfYWZpbmZvIHhmcm00X3N0YXRlX2FmaW5mbyA9IHsKKwkuZmFtaWx5CQkJPSBBRl9JTkVULAorCS5sb2NrCQkJPSBSV19MT0NLX1VOTE9DS0VELAorCS5pbml0X3RlbXBzZWwJCT0gX194ZnJtNF9pbml0X3RlbXBzZWwsCisJLnN0YXRlX2xvb2t1cAkJPSBfX3hmcm00X3N0YXRlX2xvb2t1cCwKKwkuZmluZF9hY3EJCT0gX194ZnJtNF9maW5kX2FjcSwKK307CisKK3ZvaWQgX19pbml0IHhmcm00X3N0YXRlX2luaXQodm9pZCkKK3sKKwl4ZnJtX3N0YXRlX3JlZ2lzdGVyX2FmaW5mbygmeGZybTRfc3RhdGVfYWZpbmZvKTsKK30KKwordm9pZCBfX2V4aXQgeGZybTRfc3RhdGVfZmluaSh2b2lkKQoreworCXhmcm1fc3RhdGVfdW5yZWdpc3Rlcl9hZmluZm8oJnhmcm00X3N0YXRlX2FmaW5mbyk7Cit9CisKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3hmcm00X3R1bm5lbC5jIGIvbmV0L2lwdjQveGZybTRfdHVubmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEzMTkxZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L3hmcm00X3R1bm5lbC5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKiB4ZnJtNF90dW5uZWwuYzogR2VuZXJpYyBJUCB0dW5uZWwgdHJhbnNmb3JtZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bmV0L3hmcm0uaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKworc3RhdGljIGludCBpcGlwX291dHB1dChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwkKKwlpcGggPSBza2ItPm5oLmlwaDsKKwlpcGgtPnRvdF9sZW4gPSBodG9ucyhza2ItPmxlbik7CisJaXBfc2VuZF9jaGVjayhpcGgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXBpcF94ZnJtX3JjdihzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHhmcm1fZGVjYXBfc3RhdGUgKmRlY2FwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHhmcm1fdHVubmVsICppcGlwX2hhbmRsZXI7CitzdGF0aWMgREVDTEFSRV9NVVRFWCh4ZnJtNF90dW5uZWxfc2VtKTsKKworaW50IHhmcm00X3R1bm5lbF9yZWdpc3RlcihzdHJ1Y3QgeGZybV90dW5uZWwgKmhhbmRsZXIpCit7CisJaW50IHJldDsKKworCWRvd24oJnhmcm00X3R1bm5lbF9zZW0pOworCXJldCA9IDA7CisJaWYgKGlwaXBfaGFuZGxlciAhPSBOVUxMKQorCQlyZXQgPSAtRUlOVkFMOworCWlmICghcmV0KQorCQlpcGlwX2hhbmRsZXIgPSBoYW5kbGVyOworCXVwKCZ4ZnJtNF90dW5uZWxfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKK0VYUE9SVF9TWU1CT0woeGZybTRfdHVubmVsX3JlZ2lzdGVyKTsKKworaW50IHhmcm00X3R1bm5lbF9kZXJlZ2lzdGVyKHN0cnVjdCB4ZnJtX3R1bm5lbCAqaGFuZGxlcikKK3sKKwlpbnQgcmV0OworCisJZG93bigmeGZybTRfdHVubmVsX3NlbSk7CisJcmV0ID0gMDsKKwlpZiAoaXBpcF9oYW5kbGVyICE9IGhhbmRsZXIpCisJCXJldCA9IC1FSU5WQUw7CisJaWYgKCFyZXQpCisJCWlwaXBfaGFuZGxlciA9IE5VTEw7CisJdXAoJnhmcm00X3R1bm5lbF9zZW0pOworCisJc3luY2hyb25pemVfbmV0KCk7CisKKwlyZXR1cm4gcmV0OworfQorCitFWFBPUlRfU1lNQk9MKHhmcm00X3R1bm5lbF9kZXJlZ2lzdGVyKTsKKworc3RhdGljIGludCBpcGlwX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB4ZnJtX3R1bm5lbCAqaGFuZGxlciA9IGlwaXBfaGFuZGxlcjsKKworCS8qIFR1bm5lbCBkZXZpY2VzIHRha2UgcHJlY2VkZW5jZS4gICovCisJaWYgKGhhbmRsZXIgJiYgaGFuZGxlci0+aGFuZGxlcihza2IpID09IDApCisJCXJldHVybiAwOworCisJcmV0dXJuIHhmcm00X3Jjdihza2IpOworfQorCitzdGF0aWMgdm9pZCBpcGlwX2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgaW5mbykKK3sKKwlzdHJ1Y3QgeGZybV90dW5uZWwgKmhhbmRsZXIgPSBpcGlwX2hhbmRsZXI7CisJdTMyIGFyZyA9IGluZm87CisKKwlpZiAoaGFuZGxlcikKKwkJaGFuZGxlci0+ZXJyX2hhbmRsZXIoc2tiLCAmYXJnKTsKK30KKworc3RhdGljIGludCBpcGlwX2luaXRfc3RhdGUoc3RydWN0IHhmcm1fc3RhdGUgKngsIHZvaWQgKmFyZ3MpCit7CisJaWYgKCF4LT5wcm9wcy5tb2RlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh4LT5lbmNhcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl4LT5wcm9wcy5oZWFkZXJfbGVuID0gc2l6ZW9mKHN0cnVjdCBpcGhkcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXBpcF9kZXN0cm95KHN0cnVjdCB4ZnJtX3N0YXRlICp4KQoreworfQorCitzdGF0aWMgc3RydWN0IHhmcm1fdHlwZSBpcGlwX3R5cGUgPSB7CisJLmRlc2NyaXB0aW9uCT0gIklQSVAiLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucHJvdG8JICAgICAJPSBJUFBST1RPX0lQSVAsCisJLmluaXRfc3RhdGUJPSBpcGlwX2luaXRfc3RhdGUsCisJLmRlc3RydWN0b3IJPSBpcGlwX2Rlc3Ryb3ksCisJLmlucHV0CQk9IGlwaXBfeGZybV9yY3YsCisJLm91dHB1dAkJPSBpcGlwX291dHB1dAorfTsKKworc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9jb2wgaXBpcF9wcm90b2NvbCA9IHsKKwkuaGFuZGxlcgk9CWlwaXBfcmN2LAorCS5lcnJfaGFuZGxlcgk9CWlwaXBfZXJyLAorCS5ub19wb2xpY3kJPQkxLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaXBpcF9pbml0KHZvaWQpCit7CisJaWYgKHhmcm1fcmVnaXN0ZXJfdHlwZSgmaXBpcF90eXBlLCBBRl9JTkVUKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaXBpcCBpbml0OiBjYW4ndCBhZGQgeGZybSB0eXBlXG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCWlmIChpbmV0X2FkZF9wcm90b2NvbCgmaXBpcF9wcm90b2NvbCwgSVBQUk9UT19JUElQKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaXBpcCBpbml0OiBjYW4ndCBhZGQgcHJvdG9jb2xcbiIpOworCQl4ZnJtX3VucmVnaXN0ZXJfdHlwZSgmaXBpcF90eXBlLCBBRl9JTkVUKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXBpcF9maW5pKHZvaWQpCit7CisJaWYgKGluZXRfZGVsX3Byb3RvY29sKCZpcGlwX3Byb3RvY29sLCBJUFBST1RPX0lQSVApIDwgMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaXBpcCBjbG9zZTogY2FuJ3QgcmVtb3ZlIHByb3RvY29sXG4iKTsKKwlpZiAoeGZybV91bnJlZ2lzdGVyX3R5cGUoJmlwaXBfdHlwZSwgQUZfSU5FVCkgPCAwKQorCQlwcmludGsoS0VSTl9JTkZPICJpcGlwIGNsb3NlOiBjYW4ndCByZW1vdmUgeGZybSB0eXBlXG4iKTsKK30KKworbW9kdWxlX2luaXQoaXBpcF9pbml0KTsKK21vZHVsZV9leGl0KGlwaXBfZmluaSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9LY29uZmlnIGIvbmV0L2lwdjYvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjZjYTkzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvS2NvbmZpZwpAQCAtMCwwICsxLDc5IEBACisjCisjIElQdjYgY29uZmlndXJhdGlvbgorIyAKK2NvbmZpZyBJUFY2X1BSSVZBQ1kKKwlib29sICJJUHY2OiBQcml2YWN5IEV4dGVuc2lvbnMgKFJGQyAzMDQxKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVBWNgorCS0tLWhlbHAtLS0KKwkgIFByaXZhY3kgRXh0ZW5zaW9ucyBmb3IgU3RhdGVsZXNzIEFkZHJlc3MgQXV0b2NvbmZpZ3VyYXRpb24gaW4gSVB2NgorCSAgc3VwcG9ydC4gIFdpdGggdGhpcyBvcHRpb24sIGFkZGl0aW9uYWwgcGVyaW9kaWNhbGx5LWFsdGVyIAorCSAgcHNldWRvLXJhbmRvbSBnbG9iYWwtc2NvcGUgdW5pY2FzdCBhZGRyZXNzKGVzKSB3aWxsIGFzc2lnbmVkIHRvCisJICB5b3VyIGludGVyZmFjZShzKS4KKwkKKwkgIEJ5IGRlZmF1bHQsIGtlcm5lbCBkbyBub3QgZ2VuZXJhdGUgdGVtcG9yYXJ5IGFkZHJlc3Nlcy4KKwkgIFRvIHVzZSB0ZW1wb3JhcnkgYWRkcmVzc2VzLCBkbworCQorCSAgICAgICAgZWNobyAyID4vcHJvYy9zeXMvbmV0L2lwdjYvY29uZi9hbGwvdXNlX3RlbXBhZGRyIAorCisJICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwLXN5c2N0bC50eHQ+IGZvciBkZXRhaWxzLgorCitjb25maWcgSU5FVDZfQUgKKwl0cmlzdGF0ZSAiSVB2NjogQUggdHJhbnNmb3JtYXRpb24iCisJZGVwZW5kcyBvbiBJUFY2CisJc2VsZWN0IFhGUk0KKwlzZWxlY3QgQ1JZUFRPCisJc2VsZWN0IENSWVBUT19ITUFDCisJc2VsZWN0IENSWVBUT19NRDUKKwlzZWxlY3QgQ1JZUFRPX1NIQTEKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0IGZvciBJUHNlYyBBSC4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIElORVQ2X0VTUAorCXRyaXN0YXRlICJJUHY2OiBFU1AgdHJhbnNmb3JtYXRpb24iCisJZGVwZW5kcyBvbiBJUFY2CisJc2VsZWN0IFhGUk0KKwlzZWxlY3QgQ1JZUFRPCisJc2VsZWN0IENSWVBUT19ITUFDCisJc2VsZWN0IENSWVBUT19NRDUKKwlzZWxlY3QgQ1JZUFRPX1NIQTEKKwlzZWxlY3QgQ1JZUFRPX0RFUworCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIElQc2VjIEVTUC4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIElORVQ2X0lQQ09NUAorCXRyaXN0YXRlICJJUHY2OiBJUENvbXAgdHJhbnNmb3JtYXRpb24iCisJZGVwZW5kcyBvbiBJUFY2CisJc2VsZWN0IFhGUk0KKwlzZWxlY3QgSU5FVDZfVFVOTkVMCisJc2VsZWN0IENSWVBUTworCXNlbGVjdCBDUllQVE9fREVGTEFURQorCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIElQIFBheWxvYWQgQ29tcHJlc3Npb24gUHJvdG9jb2wgKElQQ29tcCkgKFJGQzMxNzMpLAorCSAgdHlwaWNhbGx5IG5lZWRlZCBmb3IgSVBzZWMuCisKKwkgIElmIHVuc3VyZSwgc2F5IFkuCisKK2NvbmZpZyBJTkVUNl9UVU5ORUwKKwl0cmlzdGF0ZSAiSVB2NjogdHVubmVsIHRyYW5zZm9ybWF0aW9uIgorCWRlcGVuZHMgb24gSVBWNgorCXNlbGVjdCBYRlJNCisJLS0taGVscC0tLQorCSAgU3VwcG9ydCBmb3IgZ2VuZXJpYyBJUHY2LWluLUlQdjYgdHVubmVsIHRyYW5zZm9ybWF0aW9uLCB3aGljaCBpcworCSAgcmVxdWlyZWQgYnkgdGhlIElQdjYtaW4tSVB2NiB0dW5uZWxpbmcgbW9kdWxlIGFzIHdlbGwgYXMgdHVubmVsIG1vZGUKKwkgIElQQ29tcC4KKwkgIAorCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIElQVjZfVFVOTkVMCisJdHJpc3RhdGUgIklQdjY6IElQdjYtaW4tSVB2NiB0dW5uZWwiCisJZGVwZW5kcyBvbiBJUFY2CisJc2VsZWN0IElORVQ2X1RVTk5FTAorCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIElQdjYtaW4tSVB2NiB0dW5uZWxzIGRlc2NyaWJlZCBpbiBSRkMgMjQ3My4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvTWFrZWZpbGUgYi9uZXQvaXB2Ni9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzllMDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvTWFrZWZpbGUKQEAgLTAsMCArMSwyNSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IFRDUC9JUCAoSU5FVDYpIGxheWVyLgorIworCitvYmotJChDT05GSUdfSVBWNikgKz0gaXB2Ni5vCisKK2lwdjYtb2JqcyA6PQlhZl9pbmV0Ni5vIGFueWNhc3QubyBpcDZfb3V0cHV0Lm8gaXA2X2lucHV0Lm8gYWRkcmNvbmYubyBzaXQubyBcCisJCXJvdXRlLm8gaXA2X2ZpYi5vIGlwdjZfc29ja2dsdWUubyBuZGlzYy5vIHVkcC5vIHJhdy5vIFwKKwkJcHJvdG9jb2wubyBpY21wLm8gbWNhc3QubyByZWFzc2VtYmx5Lm8gdGNwX2lwdjYubyBcCisJCWV4dGhkcnMubyBzeXNjdGxfbmV0X2lwdjYubyBkYXRhZ3JhbS5vIHByb2MubyBcCisJCWlwNl9mbG93bGFiZWwubyBpcHY2X3N5bXMubworCitpcHY2LSQoQ09ORklHX1hGUk0pICs9IHhmcm02X3BvbGljeS5vIHhmcm02X3N0YXRlLm8geGZybTZfaW5wdXQubyBcCisJeGZybTZfb3V0cHV0Lm8KK2lwdjYtb2JqcyArPSAkKGlwdjYteSkKKworb2JqLSQoQ09ORklHX0lORVQ2X0FIKSArPSBhaDYubworb2JqLSQoQ09ORklHX0lORVQ2X0VTUCkgKz0gZXNwNi5vCitvYmotJChDT05GSUdfSU5FVDZfSVBDT01QKSArPSBpcGNvbXA2Lm8KK29iai0kKENPTkZJR19JTkVUNl9UVU5ORUwpICs9IHhmcm02X3R1bm5lbC5vIAorb2JqLSQoQ09ORklHX05FVEZJTFRFUikJKz0gbmV0ZmlsdGVyLworCitvYmotJChDT05GSUdfSVBWNl9UVU5ORUwpICs9IGlwNl90dW5uZWwubworCitvYmoteSArPSBleHRoZHJzX2NvcmUubwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWRkcmNvbmYuYyBiL25ldC9pcHY2L2FkZHJjb25mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZmZGUxNAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY2L2FkZHJjb25mLmMKQEAgLTAsMCArMSwzNjE1IEBACisvKgorICoJSVB2NiBBZGRyZXNzIFthdXRvXWNvbmZpZ3VyYXRpb24KKyAqCUxpbnV4IElORVQ2IGltcGxlbWVudGF0aW9uCisgKgorICoJQXV0aG9yczoKKyAqCVBlZHJvIFJvcXVlCQk8cm9xdWVAZGkuZmMudWwucHQ+CQorICoJQWxleGV5IEt1em5ldHNvdgk8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKgorICoJJElkOiBhZGRyY29uZi5jLHYgMS42OSAyMDAxLzEwLzMxIDIxOjU1OjU0IGRhdmVtIEV4cCAkCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisvKgorICoJQ2hhbmdlczoKKyAqCisgKglKYW5vcyBGYXJrYXMJCQk6CWRlbGV0ZSB0aW1lciBvbiBpZmRvd24KKyAqCTxjaGV4dW1AYmFua2luZi5iYW5raS5odT4KKyAqCUFuZGkgS2xlZW4JCQk6CWtpbGwgZG91YmxlIGtmcmVlIG9uIG1vZHVsZQorICoJCQkJCQl1bmxvYWQuCisgKglNYWNpZWogVy4gUm96eWNraQkJOglGRERJIHN1cHBvcnQKKyAqCXNla2l5YUBVU0FHSQkJCToJRG9uJ3Qgc2VuZCB0b28gbWFueSBSUworICoJCQkJCQlwYWNrZXRzLgorICoJeW9zaGZ1amlAVVNBR0kJCQk6ICAgICAgIEZpeGVkIGludGVydmFsIGJldHdlZW4gREFECisgKgkJCQkJCXBhY2tldHMuCisgKglZT1NISUZVSkkgSGlkZWFraSBAVVNBR0kJOglpbXByb3ZlZCBhY2N1cmFjeSBvZgorICoJCQkJCQlhZGRyZXNzIHZhbGlkYXRpb24gdGltZXIuCisgKglZT1NISUZVSkkgSGlkZWFraSBAVVNBR0kJOglQcml2YWN5IEV4dGVuc2lvbnMgKFJGQzMwNDEpCisgKgkJCQkJCXN1cHBvcnQuCisgKglZdWppIFNFS0lZQSBAVVNBR0kJCToJRG9uJ3QgYXNzaWduIGEgc2FtZSBJUHY2CisgKgkJCQkJCWFkZHJlc3Mgb24gYSBzYW1lIGludGVyZmFjZS4KKyAqCVlPU0hJRlVKSSBIaWRlYWtpIEBVU0FHSQk6CUFSQ25ldCBzdXBwb3J0CisgKglZT1NISUZVSkkgSGlkZWFraSBAVVNBR0kJOgljb252ZXJ0IC9wcm9jL25ldC9pZl9pbmV0NiB0bworICoJCQkJCQlzZXFfZmlsZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FyY25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2luZmluaWJhbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaWZkZWYgQ09ORklHX1NZU0NUTAorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorCisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvc25tcC5oPgorCisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvbmRpc2MuaD4KKyNpbmNsdWRlIDxuZXQvaXA2X3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3R1bm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorCisjaWZkZWYgQ09ORklHX0lQVjZfUFJJVkFDWQorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKKy8qIFNldCB0byAzIHRvIGdldCB0cmFjaW5nLi4uICovCisjZGVmaW5lIEFDT05GX0RFQlVHIDIKKworI2lmIEFDT05GX0RFQlVHID49IDMKKyNkZWZpbmUgQURCRyh4KSBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgQURCRyh4KQorI2VuZGlmCisKKyNkZWZpbmUJSU5GSU5JVFlfTElGRV9USU1FCTB4RkZGRkZGRkYKKyNkZWZpbmUgVElNRV9ERUxUQShhLGIpICgodW5zaWduZWQgbG9uZykoKGxvbmcpKGEpIC0gKGxvbmcpKGIpKSkKKworI2lmZGVmIENPTkZJR19TWVNDVEwKK3N0YXRpYyB2b2lkIGFkZHJjb25mX3N5c2N0bF9yZWdpc3RlcihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2LCBzdHJ1Y3QgaXB2Nl9kZXZjb25mICpwKTsKK3N0YXRpYyB2b2lkIGFkZHJjb25mX3N5c2N0bF91bnJlZ2lzdGVyKHN0cnVjdCBpcHY2X2RldmNvbmYgKnApOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfSVBWNl9QUklWQUNZCitzdGF0aWMgaW50IF9faXB2Nl9yZWdlbl9ybmRpZChzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KTsKK3N0YXRpYyBpbnQgX19pcHY2X3RyeV9yZWdlbl9ybmRpZChzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2LCBzdHJ1Y3QgaW42X2FkZHIgKnRtcGFkZHIpOyAKK3N0YXRpYyB2b2lkIGlwdjZfcmVnZW5fcm5kaWQodW5zaWduZWQgbG9uZyBkYXRhKTsKKworc3RhdGljIGludCBkZXN5bmNfZmFjdG9yID0gTUFYX0RFU1lOQ19GQUNUT1IgKiBIWjsKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX3RmbSAqbWQ1X3RmbTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWQ1X3RmbV9sb2NrKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IGlwdjZfY291bnRfYWRkcmVzc2VzKHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpOworCisvKgorICoJQ29uZmlndXJlZCB1bmljYXN0IGFkZHJlc3MgaGFzaCB0YWJsZQorICovCitzdGF0aWMgc3RydWN0IGluZXQ2X2lmYWRkcgkJKmluZXQ2X2FkZHJfbHN0W0lONl9BRERSX0hTSVpFXTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKGFkZHJjb25mX2hhc2hfbG9jayk7CisKKy8qIFByb3RlY3RzIGluZXQ2IGRldmljZXMgKi8KK0RFRklORV9SV0xPQ0soYWRkcmNvbmZfbG9jayk7CisKK3N0YXRpYyB2b2lkIGFkZHJjb25mX3ZlcmlmeSh1bnNpZ25lZCBsb25nKTsKKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGFkZHJfY2hrX3RpbWVyID0KKwkJCVRJTUVSX0lOSVRJQUxJWkVSKGFkZHJjb25mX3ZlcmlmeSwgMCwgMCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGFkZHJjb25mX3ZlcmlmeV9sb2NrKTsKKworc3RhdGljIHZvaWQgYWRkcmNvbmZfam9pbl9hbnljYXN0KHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCk7CitzdGF0aWMgdm9pZCBhZGRyY29uZl9sZWF2ZV9hbnljYXN0KHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCk7CisKK3N0YXRpYyBpbnQgYWRkcmNvbmZfaWZkb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBob3cpOworCitzdGF0aWMgdm9pZCBhZGRyY29uZl9kYWRfc3RhcnQoc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwLCBpbnQgZmxhZ3MpOworc3RhdGljIHZvaWQgYWRkcmNvbmZfZGFkX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBhZGRyY29uZl9kYWRfY29tcGxldGVkKHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCk7CitzdGF0aWMgdm9pZCBhZGRyY29uZl9yc190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgX19pcHY2X2lmYV9ub3RpZnkoaW50IGV2ZW50LCBzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZmEpOworc3RhdGljIHZvaWQgaXB2Nl9pZmFfbm90aWZ5KGludCBldmVudCwgc3RydWN0IGluZXQ2X2lmYWRkciAqaWZhKTsKKworc3RhdGljIHZvaWQgaW5ldDZfcHJlZml4X25vdGlmeShpbnQgZXZlbnQsIHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYsIAorCQkJCXN0cnVjdCBwcmVmaXhfaW5mbyAqcGluZm8pOworc3RhdGljIGludCBpcHY2X2Noa19zYW1lX2FkZHIoY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayAqaW5ldDZhZGRyX2NoYWluOworCitzdHJ1Y3QgaXB2Nl9kZXZjb25mIGlwdjZfZGV2Y29uZiA9IHsKKwkuZm9yd2FyZGluZwkJPSAwLAorCS5ob3BfbGltaXQJCT0gSVBWNl9ERUZBVUxUX0hPUExJTUlULAorCS5tdHU2CQkJPSBJUFY2X01JTl9NVFUsCisJLmFjY2VwdF9yYQkJPSAxLAorCS5hY2NlcHRfcmVkaXJlY3RzCT0gMSwKKwkuYXV0b2NvbmYJCT0gMSwKKwkuZm9yY2VfbWxkX3ZlcnNpb24JPSAwLAorCS5kYWRfdHJhbnNtaXRzCQk9IDEsCisJLnJ0cl9zb2xpY2l0cwkJPSBNQVhfUlRSX1NPTElDSVRBVElPTlMsCisJLnJ0cl9zb2xpY2l0X2ludGVydmFsCT0gUlRSX1NPTElDSVRBVElPTl9JTlRFUlZBTCwKKwkucnRyX3NvbGljaXRfZGVsYXkJPSBNQVhfUlRSX1NPTElDSVRBVElPTl9ERUxBWSwKKyNpZmRlZiBDT05GSUdfSVBWNl9QUklWQUNZCisJLnVzZV90ZW1wYWRkciAJCT0gMCwKKwkudGVtcF92YWxpZF9sZnQJCT0gVEVNUF9WQUxJRF9MSUZFVElNRSwKKwkudGVtcF9wcmVmZXJlZF9sZnQJPSBURU1QX1BSRUZFUlJFRF9MSUZFVElNRSwKKwkucmVnZW5fbWF4X3JldHJ5CT0gUkVHRU5fTUFYX1JFVFJZLAorCS5tYXhfZGVzeW5jX2ZhY3Rvcgk9IE1BWF9ERVNZTkNfRkFDVE9SLAorI2VuZGlmCisJLm1heF9hZGRyZXNzZXMJCT0gSVBWNl9NQVhfQUREUkVTU0VTLAorfTsKKworc3RhdGljIHN0cnVjdCBpcHY2X2RldmNvbmYgaXB2Nl9kZXZjb25mX2RmbHQgPSB7CisJLmZvcndhcmRpbmcJCT0gMCwKKwkuaG9wX2xpbWl0CQk9IElQVjZfREVGQVVMVF9IT1BMSU1JVCwKKwkubXR1NgkJCT0gSVBWNl9NSU5fTVRVLAorCS5hY2NlcHRfcmEJCT0gMSwKKwkuYWNjZXB0X3JlZGlyZWN0cwk9IDEsCisJLmF1dG9jb25mCQk9IDEsCisJLmRhZF90cmFuc21pdHMJCT0gMSwKKwkucnRyX3NvbGljaXRzCQk9IE1BWF9SVFJfU09MSUNJVEFUSU9OUywKKwkucnRyX3NvbGljaXRfaW50ZXJ2YWwJPSBSVFJfU09MSUNJVEFUSU9OX0lOVEVSVkFMLAorCS5ydHJfc29saWNpdF9kZWxheQk9IE1BWF9SVFJfU09MSUNJVEFUSU9OX0RFTEFZLAorI2lmZGVmIENPTkZJR19JUFY2X1BSSVZBQ1kKKwkudXNlX3RlbXBhZGRyCQk9IDAsCisJLnRlbXBfdmFsaWRfbGZ0CQk9IFRFTVBfVkFMSURfTElGRVRJTUUsCisJLnRlbXBfcHJlZmVyZWRfbGZ0CT0gVEVNUF9QUkVGRVJSRURfTElGRVRJTUUsCisJLnJlZ2VuX21heF9yZXRyeQk9IFJFR0VOX01BWF9SRVRSWSwKKwkubWF4X2Rlc3luY19mYWN0b3IJPSBNQVhfREVTWU5DX0ZBQ1RPUiwKKyNlbmRpZgorCS5tYXhfYWRkcmVzc2VzCQk9IElQVjZfTUFYX0FERFJFU1NFUywKK307CisKKy8qIElQdjYgV2lsZGNhcmQgQWRkcmVzcyBhbmQgTG9vcGJhY2sgQWRkcmVzcyBkZWZpbmVkIGJ5IFJGQzI1NTMgKi8KKyNpZiAwCitjb25zdCBzdHJ1Y3QgaW42X2FkZHIgaW42YWRkcl9hbnkgPSBJTjZBRERSX0FOWV9JTklUOworI2VuZGlmCitjb25zdCBzdHJ1Y3QgaW42X2FkZHIgaW42YWRkcl9sb29wYmFjayA9IElONkFERFJfTE9PUEJBQ0tfSU5JVDsKKworaW50IGlwdjZfYWRkcl90eXBlKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcikKK3sKKwlpbnQgdHlwZTsKKwl1MzIgc3Q7CisKKwlzdCA9IGFkZHItPnM2X2FkZHIzMlswXTsKKworCWlmICgoc3QgJiBodG9ubCgweEZGMDAwMDAwKSkgPT0gaHRvbmwoMHhGRjAwMDAwMCkpIHsKKwkJdHlwZSA9IElQVjZfQUREUl9NVUxUSUNBU1Q7CisKKwkJc3dpdGNoKChzdCAmIGh0b25sKDB4MDBGRjAwMDApKSkgeworCQkJY2FzZSBfX2NvbnN0YW50X2h0b25sKDB4MDAwMTAwMDApOgorCQkJCXR5cGUgfD0gSVBWNl9BRERSX0xPT1BCQUNLOworCQkJCWJyZWFrOworCisJCQljYXNlIF9fY29uc3RhbnRfaHRvbmwoMHgwMDAyMDAwMCk6CisJCQkJdHlwZSB8PSBJUFY2X0FERFJfTElOS0xPQ0FMOworCQkJCWJyZWFrOworCisJCQljYXNlIF9fY29uc3RhbnRfaHRvbmwoMHgwMDA1MDAwMCk6CisJCQkJdHlwZSB8PSBJUFY2X0FERFJfU0lURUxPQ0FMOworCQkJCWJyZWFrOworCQl9OworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwl0eXBlID0gSVBWNl9BRERSX1VOSUNBU1Q7CisKKwkvKiBDb25zaWRlciBhbGwgYWRkcmVzc2VzIHdpdGggdGhlIGZpcnN0IHRocmVlIGJpdHMgZGlmZmVyZW50IG9mCisJICAgMDAwIGFuZCAxMTEgYXMgZmluaXNoZWQuCisJICovCisJaWYgKChzdCAmIGh0b25sKDB4RTAwMDAwMDApKSAhPSBodG9ubCgweDAwMDAwMDAwKSAmJgorCSAgICAoc3QgJiBodG9ubCgweEUwMDAwMDAwKSkgIT0gaHRvbmwoMHhFMDAwMDAwMCkpCisJCXJldHVybiB0eXBlOworCQorCWlmICgoc3QgJiBodG9ubCgweEZGQzAwMDAwKSkgPT0gaHRvbmwoMHhGRTgwMDAwMCkpCisJCXJldHVybiAoSVBWNl9BRERSX0xJTktMT0NBTCB8IHR5cGUpOworCisJaWYgKChzdCAmIGh0b25sKDB4RkZDMDAwMDApKSA9PSBodG9ubCgweEZFQzAwMDAwKSkKKwkJcmV0dXJuIChJUFY2X0FERFJfU0lURUxPQ0FMIHwgdHlwZSk7CisKKwlpZiAoKGFkZHItPnM2X2FkZHIzMlswXSB8IGFkZHItPnM2X2FkZHIzMlsxXSkgPT0gMCkgeworCQlpZiAoYWRkci0+czZfYWRkcjMyWzJdID09IDApIHsKKwkJCWlmIChhZGRyLT5zNl9hZGRyMzJbM10gPT0gMCkKKwkJCQlyZXR1cm4gSVBWNl9BRERSX0FOWTsKKworCQkJaWYgKGFkZHItPnM2X2FkZHIzMlszXSA9PSBodG9ubCgweDAwMDAwMDAxKSkKKwkJCQlyZXR1cm4gKElQVjZfQUREUl9MT09QQkFDSyB8IHR5cGUpOworCisJCQlyZXR1cm4gKElQVjZfQUREUl9DT01QQVR2NCB8IHR5cGUpOworCQl9CisKKwkJaWYgKGFkZHItPnM2X2FkZHIzMlsyXSA9PSBodG9ubCgweDAwMDBmZmZmKSkKKwkJCXJldHVybiBJUFY2X0FERFJfTUFQUEVEOworCX0KKworCXN0ICY9IGh0b25sKDB4RkYwMDAwMDApOworCWlmIChzdCA9PSAwKQorCQlyZXR1cm4gSVBWNl9BRERSX1JFU0VSVkVEOworCXN0ICY9IGh0b25sKDB4RkUwMDAwMDApOworCWlmIChzdCA9PSBodG9ubCgweDAyMDAwMDAwKSkKKwkJcmV0dXJuIElQVjZfQUREUl9SRVNFUlZFRDsJLyogZm9yIE5TQVAgKi8KKwlpZiAoc3QgPT0gaHRvbmwoMHgwNDAwMDAwMCkpCisJCXJldHVybiBJUFY2X0FERFJfUkVTRVJWRUQ7CS8qIGZvciBJUFggKi8KKwlyZXR1cm4gdHlwZTsKK30KKworc3RhdGljIHZvaWQgYWRkcmNvbmZfZGVsX3RpbWVyKHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCkKK3sKKwlpZiAoZGVsX3RpbWVyKCZpZnAtPnRpbWVyKSkKKwkJX19pbjZfaWZhX3B1dChpZnApOworfQorCitlbnVtIGFkZHJjb25mX3RpbWVyX3QKK3sKKwlBQ19OT05FLAorCUFDX0RBRCwKKwlBQ19SUywKK307CisKK3N0YXRpYyB2b2lkIGFkZHJjb25mX21vZF90aW1lcihzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnAsCisJCQkgICAgICAgZW51bSBhZGRyY29uZl90aW1lcl90IHdoYXQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyB3aGVuKQoreworCWlmICghZGVsX3RpbWVyKCZpZnAtPnRpbWVyKSkKKwkJaW42X2lmYV9ob2xkKGlmcCk7CisKKwlzd2l0Y2ggKHdoYXQpIHsKKwljYXNlIEFDX0RBRDoKKwkJaWZwLT50aW1lci5mdW5jdGlvbiA9IGFkZHJjb25mX2RhZF90aW1lcjsKKwkJYnJlYWs7CisJY2FzZSBBQ19SUzoKKwkJaWZwLT50aW1lci5mdW5jdGlvbiA9IGFkZHJjb25mX3JzX3RpbWVyOworCQlicmVhazsKKwlkZWZhdWx0OjsKKwl9CisJaWZwLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIHdoZW47CisJYWRkX3RpbWVyKCZpZnAtPnRpbWVyKTsKK30KKworLyogTm9ib2R5IHJlZmVycyB0byB0aGlzIGRldmljZSwgd2UgbWF5IGRlc3Ryb3kgaXQuICovCisKK3ZvaWQgaW42X2Rldl9maW5pc2hfZGVzdHJveShzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZGV2LT5kZXY7CisJQlVHX1RSQVAoaWRldi0+YWRkcl9saXN0PT1OVUxMKTsKKwlCVUdfVFJBUChpZGV2LT5tY19saXN0PT1OVUxMKTsKKyNpZmRlZiBORVRfUkVGQ05UX0RFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgImluNl9kZXZfZmluaXNoX2Rlc3Ryb3k6ICVzXG4iLCBkZXYgPyBkZXYtPm5hbWUgOiAiTklMIik7CisjZW5kaWYKKwlkZXZfcHV0KGRldik7CisJaWYgKCFpZGV2LT5kZWFkKSB7CisJCXByaW50aygiRnJlZWluZyBhbGl2ZSBpbmV0NiBkZXZpY2UgJXBcbiIsIGlkZXYpOworCQlyZXR1cm47CisJfQorCXNubXA2X2ZyZWVfZGV2KGlkZXYpOworCWtmcmVlKGlkZXYpOworfQorCitzdGF0aWMgc3RydWN0IGluZXQ2X2RldiAqIGlwdjZfYWRkX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpbmV0Nl9kZXYgKm5kZXY7CisKKwlBU1NFUlRfUlROTCgpOworCisJaWYgKGRldi0+bXR1IDwgSVBWNl9NSU5fTVRVKQorCQlyZXR1cm4gTlVMTDsKKworCW5kZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW5ldDZfZGV2KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAobmRldikgeworCQltZW1zZXQobmRldiwgMCwgc2l6ZW9mKHN0cnVjdCBpbmV0Nl9kZXYpKTsKKworCQlyd2xvY2tfaW5pdCgmbmRldi0+bG9jayk7CisJCW5kZXYtPmRldiA9IGRldjsKKwkJbWVtY3B5KCZuZGV2LT5jbmYsICZpcHY2X2RldmNvbmZfZGZsdCwgc2l6ZW9mKG5kZXYtPmNuZikpOworCQluZGV2LT5jbmYubXR1NiA9IGRldi0+bXR1OworCQluZGV2LT5jbmYuc3lzY3RsID0gTlVMTDsKKwkJbmRldi0+bmRfcGFybXMgPSBuZWlnaF9wYXJtc19hbGxvYyhkZXYsICZuZF90YmwpOworCQlpZiAobmRldi0+bmRfcGFybXMgPT0gTlVMTCkgeworCQkJa2ZyZWUobmRldik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQkvKiBXZSByZWZlciB0byB0aGUgZGV2aWNlICovCisJCWRldl9ob2xkKGRldik7CisKKwkJaWYgKHNubXA2X2FsbG9jX2RldihuZGV2KSA8IDApIHsKKwkJCUFEQkcoKEtFUk5fV0FSTklORworCQkJCSIlcygpOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBzdGF0aXN0aWNzOyBkZXY9JXMuXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgZGV2LT5uYW1lKSk7CisJCQluZWlnaF9wYXJtc19yZWxlYXNlKCZuZF90YmwsIG5kZXYtPm5kX3Bhcm1zKTsKKwkJCW5kZXYtPmRlYWQgPSAxOworCQkJaW42X2Rldl9maW5pc2hfZGVzdHJveShuZGV2KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJaWYgKHNubXA2X3JlZ2lzdGVyX2RldihuZGV2KSA8IDApIHsKKwkJCUFEQkcoKEtFUk5fV0FSTklORworCQkJCSIlcygpOiBjYW5ub3QgY3JlYXRlIC9wcm9jL25ldC9kZXZfc25tcDYvJXNcbiIsCisJCQkJX19GVU5DVElPTl9fLCBkZXYtPm5hbWUpKTsKKwkJCW5laWdoX3Bhcm1zX3JlbGVhc2UoJm5kX3RibCwgbmRldi0+bmRfcGFybXMpOworCQkJbmRldi0+ZGVhZCA9IDE7CisJCQlpbjZfZGV2X2ZpbmlzaF9kZXN0cm95KG5kZXYpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQkvKiBPbmUgcmVmZXJlbmNlIGZyb20gZGV2aWNlLiAgV2UgbXVzdCBkbyB0aGlzIGJlZm9yZQorCQkgKiB3ZSBpbnZva2UgX19pcHY2X3JlZ2VuX3JuZGlkKCkuCisJCSAqLworCQlpbjZfZGV2X2hvbGQobmRldik7CisKKyNpZmRlZiBDT05GSUdfSVBWNl9QUklWQUNZCisJCWdldF9yYW5kb21fYnl0ZXMobmRldi0+cm5kaWQsIHNpemVvZihuZGV2LT5ybmRpZCkpOworCQlnZXRfcmFuZG9tX2J5dGVzKG5kZXYtPmVudHJvcHksIHNpemVvZihuZGV2LT5lbnRyb3B5KSk7CisJCWluaXRfdGltZXIoJm5kZXYtPnJlZ2VuX3RpbWVyKTsKKwkJbmRldi0+cmVnZW5fdGltZXIuZnVuY3Rpb24gPSBpcHY2X3JlZ2VuX3JuZGlkOworCQluZGV2LT5yZWdlbl90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIG5kZXY7CisJCWlmICgoZGV2LT5mbGFncyZJRkZfTE9PUEJBQ0spIHx8CisJCSAgICBkZXYtPnR5cGUgPT0gQVJQSFJEX1RVTk5FTCB8fAorCQkgICAgZGV2LT50eXBlID09IEFSUEhSRF9TSVQpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiRGlzYWJsZWQgUHJpdmFjeSBFeHRlbnNpb25zIG9uIGRldmljZSAlcCglcylcbiIsCisJCQkJZGV2LCBkZXYtPm5hbWUpOworCQkJbmRldi0+Y25mLnVzZV90ZW1wYWRkciA9IC0xOworCQl9IGVsc2UgeworCQkJaW42X2Rldl9ob2xkKG5kZXYpOworCQkJaXB2Nl9yZWdlbl9ybmRpZCgodW5zaWduZWQgbG9uZykgbmRldik7CisJCX0KKyNlbmRpZgorCisJCXdyaXRlX2xvY2tfYmgoJmFkZHJjb25mX2xvY2spOworCQlkZXYtPmlwNl9wdHIgPSBuZGV2OworCQl3cml0ZV91bmxvY2tfYmgoJmFkZHJjb25mX2xvY2spOworCisJCWlwdjZfbWNfaW5pdF9kZXYobmRldik7CisJCW5kZXYtPnRzdGFtcCA9IGppZmZpZXM7CisjaWZkZWYgQ09ORklHX1NZU0NUTAorCQluZWlnaF9zeXNjdGxfcmVnaXN0ZXIoZGV2LCBuZGV2LT5uZF9wYXJtcywgTkVUX0lQVjYsIAorCQkJCSAgICAgIE5FVF9JUFY2X05FSUdILCAiaXB2NiIsCisJCQkJICAgICAgJm5kaXNjX2lmaW5mb19zeXNjdGxfY2hhbmdlLAorCQkJCSAgICAgIE5VTEwpOworCQlhZGRyY29uZl9zeXNjdGxfcmVnaXN0ZXIobmRldiwgJm5kZXYtPmNuZik7CisjZW5kaWYKKwl9CisJcmV0dXJuIG5kZXY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5ldDZfZGV2ICogaXB2Nl9maW5kX2lkZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OworCisJQVNTRVJUX1JUTkwoKTsKKworCWlmICgoaWRldiA9IF9faW42X2Rldl9nZXQoZGV2KSkgPT0gTlVMTCkgeworCQlpZiAoKGlkZXYgPSBpcHY2X2FkZF9kZXYoZGV2KSkgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCX0KKwlpZiAoZGV2LT5mbGFncyZJRkZfVVApCisJCWlwdjZfbWNfdXAoaWRldik7CisJcmV0dXJuIGlkZXY7Cit9CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCitzdGF0aWMgdm9pZCBkZXZfZm9yd2FyZF9jaGFuZ2Uoc3RydWN0IGluZXQ2X2RldiAqaWRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmYTsKKwlzdHJ1Y3QgaW42X2FkZHIgYWRkcjsKKworCWlmICghaWRldikKKwkJcmV0dXJuOworCWRldiA9IGlkZXYtPmRldjsKKwlpZiAoZGV2ICYmIChkZXYtPmZsYWdzICYgSUZGX01VTFRJQ0FTVCkpIHsKKwkJaXB2Nl9hZGRyX2FsbF9yb3V0ZXJzKCZhZGRyKTsKKwkKKwkJaWYgKGlkZXYtPmNuZi5mb3J3YXJkaW5nKQorCQkJaXB2Nl9kZXZfbWNfaW5jKGRldiwgJmFkZHIpOworCQllbHNlCisJCQlpcHY2X2Rldl9tY19kZWMoZGV2LCAmYWRkcik7CisJfQorCWZvciAoaWZhPWlkZXYtPmFkZHJfbGlzdDsgaWZhOyBpZmE9aWZhLT5pZl9uZXh0KSB7CisJCWlmIChpZGV2LT5jbmYuZm9yd2FyZGluZykKKwkJCWFkZHJjb25mX2pvaW5fYW55Y2FzdChpZmEpOworCQllbHNlCisJCQlhZGRyY29uZl9sZWF2ZV9hbnljYXN0KGlmYSk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGFkZHJjb25mX2ZvcndhcmRfY2hhbmdlKHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OworCisJcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKwlmb3IgKGRldj1kZXZfYmFzZTsgZGV2OyBkZXY9ZGV2LT5uZXh0KSB7CisJCXJlYWRfbG9jaygmYWRkcmNvbmZfbG9jayk7CisJCWlkZXYgPSBfX2luNl9kZXZfZ2V0KGRldik7CisJCWlmIChpZGV2KSB7CisJCQlpbnQgY2hhbmdlZCA9ICghaWRldi0+Y25mLmZvcndhcmRpbmcpIF4gKCFpcHY2X2RldmNvbmYuZm9yd2FyZGluZyk7CisJCQlpZGV2LT5jbmYuZm9yd2FyZGluZyA9IGlwdjZfZGV2Y29uZi5mb3J3YXJkaW5nOworCQkJaWYgKGNoYW5nZWQpCisJCQkJZGV2X2ZvcndhcmRfY2hhbmdlKGlkZXYpOworCQl9CisJCXJlYWRfdW5sb2NrKCZhZGRyY29uZl9sb2NrKTsKKwl9CisJcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOworfQorI2VuZGlmCisKKy8qIE5vYm9keSByZWZlcnMgdG8gdGhpcyBpZmFkZHIsIGRlc3Ryb3kgaXQgKi8KKwordm9pZCBpbmV0Nl9pZmFfZmluaXNoX2Rlc3Ryb3koc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwKQoreworCUJVR19UUkFQKGlmcC0+aWZfbmV4dD09TlVMTCk7CisJQlVHX1RSQVAoaWZwLT5sc3RfbmV4dD09TlVMTCk7CisjaWZkZWYgTkVUX1JFRkNOVF9ERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJpbmV0Nl9pZmFfZmluaXNoX2Rlc3Ryb3lcbiIpOworI2VuZGlmCisKKwlpbjZfZGV2X3B1dChpZnAtPmlkZXYpOworCisJaWYgKGRlbF90aW1lcigmaWZwLT50aW1lcikpCisJCXByaW50aygiVGltZXIgaXMgc3RpbGwgcnVubmluZywgd2hlbiBmcmVlaW5nIGlmYT0lcFxuIiwgaWZwKTsKKworCWlmICghaWZwLT5kZWFkKSB7CisJCXByaW50aygiRnJlZWluZyBhbGl2ZSBpbmV0NiBhZGRyZXNzICVwXG4iLCBpZnApOworCQlyZXR1cm47CisJfQorCWRzdF9yZWxlYXNlKCZpZnAtPnJ0LT51LmRzdCk7CisKKwlrZnJlZShpZnApOworfQorCisvKiBPbiBzdWNjZXNzIGl0IHJldHVybnMgaWZwIHdpdGggaW5jcmVhc2VkIHJlZmVyZW5jZSBjb3VudCAqLworCitzdGF0aWMgc3RydWN0IGluZXQ2X2lmYWRkciAqCitpcHY2X2FkZF9hZGRyKHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYsIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkciwgaW50IHBmeGxlbiwKKwkgICAgICBpbnQgc2NvcGUsIHVuc2lnbmVkIGZsYWdzKQoreworCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmYSA9IE5VTEw7CisJc3RydWN0IHJ0Nl9pbmZvICpydDsKKwlpbnQgaGFzaDsKKwlpbnQgZXJyID0gMDsKKworCXJlYWRfbG9ja19iaCgmYWRkcmNvbmZfbG9jayk7CisJaWYgKGlkZXYtPmRlYWQpIHsKKwkJZXJyID0gLUVOT0RFVjsJCQkvKlhYWCovCisJCWdvdG8gb3V0MjsKKwl9CisKKwl3cml0ZV9sb2NrKCZhZGRyY29uZl9oYXNoX2xvY2spOworCisJLyogSWdub3JlIGFkZGluZyBkdXBsaWNhdGUgYWRkcmVzc2VzIG9uIGFuIGludGVyZmFjZSAqLworCWlmIChpcHY2X2Noa19zYW1lX2FkZHIoYWRkciwgaWRldi0+ZGV2KSkgeworCQlBREJHKCgiaXB2Nl9hZGRfYWRkcjogYWxyZWFkeSBhc3NpZ25lZFxuIikpOworCQllcnIgPSAtRUVYSVNUOworCQlnb3RvIG91dDsKKwl9CisKKwlpZmEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW5ldDZfaWZhZGRyKSwgR0ZQX0FUT01JQyk7CisKKwlpZiAoaWZhID09IE5VTEwpIHsKKwkJQURCRygoImlwdjZfYWRkX2FkZHI6IG1hbGxvYyBmYWlsZWRcbiIpKTsKKwkJZXJyID0gLUVOT0JVRlM7CisJCWdvdG8gb3V0OworCX0KKworCXJ0ID0gYWRkcmNvbmZfZHN0X2FsbG9jKGlkZXYsIGFkZHIsIDApOworCWlmIChJU19FUlIocnQpKSB7CisJCWVyciA9IFBUUl9FUlIocnQpOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1zZXQoaWZhLCAwLCBzaXplb2Yoc3RydWN0IGluZXQ2X2lmYWRkcikpOworCWlwdjZfYWRkcl9jb3B5KCZpZmEtPmFkZHIsIGFkZHIpOworCisJc3Bpbl9sb2NrX2luaXQoJmlmYS0+bG9jayk7CisJaW5pdF90aW1lcigmaWZhLT50aW1lcik7CisJaWZhLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGlmYTsKKwlpZmEtPnNjb3BlID0gc2NvcGU7CisJaWZhLT5wcmVmaXhfbGVuID0gcGZ4bGVuOworCWlmYS0+ZmxhZ3MgPSBmbGFncyB8IElGQV9GX1RFTlRBVElWRTsKKwlpZmEtPmNzdGFtcCA9IGlmYS0+dHN0YW1wID0gamlmZmllczsKKworCWlmYS0+aWRldiA9IGlkZXY7CisJaW42X2Rldl9ob2xkKGlkZXYpOworCS8qIEZvciBjYWxsZXIgKi8KKwlpbjZfaWZhX2hvbGQoaWZhKTsKKworCS8qIEFkZCB0byBiaWcgaGFzaCB0YWJsZSAqLworCWhhc2ggPSBpcHY2X2FkZHJfaGFzaChhZGRyKTsKKworCWlmYS0+bHN0X25leHQgPSBpbmV0Nl9hZGRyX2xzdFtoYXNoXTsKKwlpbmV0Nl9hZGRyX2xzdFtoYXNoXSA9IGlmYTsKKwlpbjZfaWZhX2hvbGQoaWZhKTsKKwl3cml0ZV91bmxvY2soJmFkZHJjb25mX2hhc2hfbG9jayk7CisKKwl3cml0ZV9sb2NrKCZpZGV2LT5sb2NrKTsKKwkvKiBBZGQgdG8gaW5ldDZfZGV2IHVuaWNhc3QgYWRkciBsaXN0LiAqLworCWlmYS0+aWZfbmV4dCA9IGlkZXYtPmFkZHJfbGlzdDsKKwlpZGV2LT5hZGRyX2xpc3QgPSBpZmE7CisKKyNpZmRlZiBDT05GSUdfSVBWNl9QUklWQUNZCisJaWYgKGlmYS0+ZmxhZ3MmSUZBX0ZfVEVNUE9SQVJZKSB7CisJCWlmYS0+dG1wX25leHQgPSBpZGV2LT50ZW1wYWRkcl9saXN0OworCQlpZGV2LT50ZW1wYWRkcl9saXN0ID0gaWZhOworCQlpbjZfaWZhX2hvbGQoaWZhKTsKKwl9CisjZW5kaWYKKworCWlmYS0+cnQgPSBydDsKKworCWluNl9pZmFfaG9sZChpZmEpOworCXdyaXRlX3VubG9jaygmaWRldi0+bG9jayk7CitvdXQyOgorCXJlYWRfdW5sb2NrX2JoKCZhZGRyY29uZl9sb2NrKTsKKworCWlmICh1bmxpa2VseShlcnIgPT0gMCkpCisJCW5vdGlmaWVyX2NhbGxfY2hhaW4oJmluZXQ2YWRkcl9jaGFpbiwgTkVUREVWX1VQLCBpZmEpOworCWVsc2UgeworCQlrZnJlZShpZmEpOworCQlpZmEgPSBFUlJfUFRSKGVycik7CisJfQorCisJcmV0dXJuIGlmYTsKK291dDoKKwl3cml0ZV91bmxvY2soJmFkZHJjb25mX2hhc2hfbG9jayk7CisJZ290byBvdXQyOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHdhbnRzIHRvIGdldCByZWZlcmVuY2VkIGlmcCBhbmQgcmVsZWFzZXMgaXQgYmVmb3JlIHJldHVybiAqLworCitzdGF0aWMgdm9pZCBpcHY2X2RlbF9hZGRyKHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCkKK3sKKwlzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZmEsICoqaWZhcDsKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gaWZwLT5pZGV2OworCWludCBoYXNoOworCWludCBkZWxldGVkID0gMCwgb25saW5rID0gMDsKKwl1bnNpZ25lZCBsb25nIGV4cGlyZXMgPSBqaWZmaWVzOworCisJaGFzaCA9IGlwdjZfYWRkcl9oYXNoKCZpZnAtPmFkZHIpOworCisJaWZwLT5kZWFkID0gMTsKKworCXdyaXRlX2xvY2tfYmgoJmFkZHJjb25mX2hhc2hfbG9jayk7CisJZm9yIChpZmFwID0gJmluZXQ2X2FkZHJfbHN0W2hhc2hdOyAoaWZhPSppZmFwKSAhPSBOVUxMOworCSAgICAgaWZhcCA9ICZpZmEtPmxzdF9uZXh0KSB7CisJCWlmIChpZmEgPT0gaWZwKSB7CisJCQkqaWZhcCA9IGlmYS0+bHN0X25leHQ7CisJCQlfX2luNl9pZmFfcHV0KGlmcCk7CisJCQlpZmEtPmxzdF9uZXh0ID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJfQorCXdyaXRlX3VubG9ja19iaCgmYWRkcmNvbmZfaGFzaF9sb2NrKTsKKworCXdyaXRlX2xvY2tfYmgoJmlkZXYtPmxvY2spOworI2lmZGVmIENPTkZJR19JUFY2X1BSSVZBQ1kKKwlpZiAoaWZwLT5mbGFncyZJRkFfRl9URU1QT1JBUlkpIHsKKwkJZm9yIChpZmFwID0gJmlkZXYtPnRlbXBhZGRyX2xpc3Q7IChpZmE9KmlmYXApICE9IE5VTEw7CisJCSAgICAgaWZhcCA9ICZpZmEtPnRtcF9uZXh0KSB7CisJCQlpZiAoaWZhID09IGlmcCkgeworCQkJCSppZmFwID0gaWZhLT50bXBfbmV4dDsKKwkJCQlpZiAoaWZwLT5pZnB1YikgeworCQkJCQlpbjZfaWZhX3B1dChpZnAtPmlmcHViKTsKKwkJCQkJaWZwLT5pZnB1YiA9IE5VTEw7CisJCQkJfQorCQkJCV9faW42X2lmYV9wdXQoaWZwKTsKKwkJCQlpZmEtPnRtcF9uZXh0ID0gTlVMTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCisJZm9yIChpZmFwID0gJmlkZXYtPmFkZHJfbGlzdDsgKGlmYT0qaWZhcCkgIT0gTlVMTDsKKwkgICAgIGlmYXAgPSAmaWZhLT5pZl9uZXh0KSB7CisJCWlmIChpZmEgPT0gaWZwKSB7CisJCQkqaWZhcCA9IGlmYS0+aWZfbmV4dDsKKwkJCV9faW42X2lmYV9wdXQoaWZwKTsKKwkJCWlmYS0+aWZfbmV4dCA9IE5VTEw7CisJCQlpZiAoIShpZnAtPmZsYWdzICYgSUZBX0ZfUEVSTUFORU5UKSB8fCBvbmxpbmsgPiAwKQorCQkJCWJyZWFrOworCQkJZGVsZXRlZCA9IDE7CisJCX0gZWxzZSBpZiAoaWZwLT5mbGFncyAmIElGQV9GX1BFUk1BTkVOVCkgeworCQkJaWYgKGlwdjZfcHJlZml4X2VxdWFsKCZpZmEtPmFkZHIsICZpZnAtPmFkZHIsCisJCQkJCSAgICAgIGlmcC0+cHJlZml4X2xlbikpIHsKKwkJCQlpZiAoaWZhLT5mbGFncyAmIElGQV9GX1BFUk1BTkVOVCkgeworCQkJCQlvbmxpbmsgPSAxOworCQkJCQlpZiAoZGVsZXRlZCkKKwkJCQkJCWJyZWFrOworCQkJCX0gZWxzZSB7CisJCQkJCXVuc2lnbmVkIGxvbmcgbGlmZXRpbWU7CisKKwkJCQkJaWYgKCFvbmxpbmspCisJCQkJCQlvbmxpbmsgPSAtMTsKKworCQkJCQlzcGluX2xvY2soJmlmYS0+bG9jayk7CisJCQkJCWxpZmV0aW1lID0gbWluX3QodW5zaWduZWQgbG9uZywKKwkJCQkJCQkgaWZhLT52YWxpZF9sZnQsIDB4N2ZmZmZmZmZVTC9IWik7CisJCQkJCWlmICh0aW1lX2JlZm9yZShleHBpcmVzLAorCQkJCQkJCWlmYS0+dHN0YW1wICsgbGlmZXRpbWUgKiBIWikpCisJCQkJCQlleHBpcmVzID0gaWZhLT50c3RhbXAgKyBsaWZldGltZSAqIEhaOworCQkJCQlzcGluX3VubG9jaygmaWZhLT5sb2NrKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKworCWlwdjZfaWZhX25vdGlmeShSVE1fREVMQUREUiwgaWZwKTsKKworCW5vdGlmaWVyX2NhbGxfY2hhaW4oJmluZXQ2YWRkcl9jaGFpbixORVRERVZfRE9XTixpZnApOworCisJYWRkcmNvbmZfZGVsX3RpbWVyKGlmcCk7CisKKwkvKgorCSAqIFB1cmdlIG9yIHVwZGF0ZSBjb3JyZXNwb25kaW5nIHByZWZpeAorCSAqCisJICogMSkgd2UgZG9uJ3QgcHVyZ2UgcHJlZml4IGhlcmUgaWYgYWRkcmVzcyB3YXMgbm90IHBlcm1hbmVudC4KKwkgKiAgICBwcmVmaXggaXMgbWFuYWdlZCBieSBpdHMgb3duIGxpZmV0aW1lLgorCSAqIDIpIGlmIHRoZXJlJ3JlIG5vIGFkZHJlc3NlcywgZGVsZXRlIHByZWZpeC4KKwkgKiAzKSBpZiB0aGVyZSdyZSBzdGlsbCBvdGhlciBwZXJtYW5lbnQgYWRkcmVzcyhlcyksCisJICogICAgY29ycmVzcG9uZGluZyBwcmVmaXggaXMgc3RpbGwgcGVybWFuZW50LgorCSAqIDQpIG90aGVyd2lzZSwgdXBkYXRlIHByZWZpeCBsaWZldGltZSB0byB0aGUKKwkgKiAgICBsb25nZXN0IHZhbGlkIGxpZmV0aW1lIGFtb25nIHRoZSBjb3JyZXNwb25kaW5nCisJICogICAgYWRkcmVzc2VzIG9uIHRoZSBkZXZpY2UuCisJICogICAgTm90ZTogc3Vic2VxdWVudCBSQSB3aWxsIHVwZGF0ZSBsaWZldGltZS4KKwkgKgorCSAqIC0teW9zaGZ1amkKKwkgKi8KKwlpZiAoKGlmcC0+ZmxhZ3MgJiBJRkFfRl9QRVJNQU5FTlQpICYmIG9ubGluayA8IDEpIHsKKwkJc3RydWN0IGluNl9hZGRyIHByZWZpeDsKKwkJc3RydWN0IHJ0Nl9pbmZvICpydDsKKworCQlpcHY2X2FkZHJfcHJlZml4KCZwcmVmaXgsICZpZnAtPmFkZHIsIGlmcC0+cHJlZml4X2xlbik7CisJCXJ0ID0gcnQ2X2xvb2t1cCgmcHJlZml4LCBOVUxMLCBpZnAtPmlkZXYtPmRldi0+aWZpbmRleCwgMSk7CisKKwkJaWYgKHJ0ICYmICgocnQtPnJ0NmlfZmxhZ3MgJiAoUlRGX0dBVEVXQVkgfCBSVEZfREVGQVVMVCkpID09IDApKSB7CisJCQlpZiAob25saW5rID09IDApIHsKKwkJCQlpcDZfZGVsX3J0KHJ0LCBOVUxMLCBOVUxMKTsKKwkJCQlydCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCEocnQtPnJ0NmlfZmxhZ3MgJiBSVEZfRVhQSVJFUykpIHsKKwkJCQlydC0+cnQ2aV9leHBpcmVzID0gZXhwaXJlczsKKwkJCQlydC0+cnQ2aV9mbGFncyB8PSBSVEZfRVhQSVJFUzsKKwkJCX0KKwkJfQorCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwl9CisKKwlpbjZfaWZhX3B1dChpZnApOworfQorCisjaWZkZWYgQ09ORklHX0lQVjZfUFJJVkFDWQorc3RhdGljIGludCBpcHY2X2NyZWF0ZV90ZW1wYWRkcihzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnAsIHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmdCkKK3sKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gaWZwLT5pZGV2OworCXN0cnVjdCBpbjZfYWRkciBhZGRyLCAqdG1wYWRkcjsKKwl1bnNpZ25lZCBsb25nIHRtcF9wcmVmZXJlZF9sZnQsIHRtcF92YWxpZF9sZnQsIHRtcF9jc3RhbXAsIHRtcF90c3RhbXA7CisJaW50IHRtcF9wbGVuOworCWludCByZXQgPSAwOworCWludCBtYXhfYWRkcmVzc2VzOworCisJd3JpdGVfbG9jaygmaWRldi0+bG9jayk7CisJaWYgKGlmdCkgeworCQlzcGluX2xvY2tfYmgoJmlmdC0+bG9jayk7CisJCW1lbWNweSgmYWRkci5zNl9hZGRyWzhdLCAmaWZ0LT5hZGRyLnM2X2FkZHJbOF0sIDgpOworCQlzcGluX3VubG9ja19iaCgmaWZ0LT5sb2NrKTsKKwkJdG1wYWRkciA9ICZhZGRyOworCX0gZWxzZSB7CisJCXRtcGFkZHIgPSBOVUxMOworCX0KK3JldHJ5OgorCWluNl9kZXZfaG9sZChpZGV2KTsKKwlpZiAoaWRldi0+Y25mLnVzZV90ZW1wYWRkciA8PSAwKSB7CisJCXdyaXRlX3VubG9jaygmaWRldi0+bG9jayk7CisJCXByaW50ayhLRVJOX0lORk8KKwkJCSJpcHY2X2NyZWF0ZV90ZW1wYWRkcigpOiB1c2VfdGVtcGFkZHIgaXMgZGlzYWJsZWQuXG4iKTsKKwkJaW42X2Rldl9wdXQoaWRldik7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisJc3Bpbl9sb2NrX2JoKCZpZnAtPmxvY2spOworCWlmIChpZnAtPnJlZ2VuX2NvdW50KysgPj0gaWRldi0+Y25mLnJlZ2VuX21heF9yZXRyeSkgeworCQlpZGV2LT5jbmYudXNlX3RlbXBhZGRyID0gLTE7CS8qWFhYKi8KKwkJc3Bpbl91bmxvY2tfYmgoJmlmcC0+bG9jayk7CisJCXdyaXRlX3VubG9jaygmaWRldi0+bG9jayk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJpcHY2X2NyZWF0ZV90ZW1wYWRkcigpOiByZWdlbmVyYXRpb24gdGltZSBleGNlZWRlZC4gZGlzYWJsZWQgdGVtcG9yYXJ5IGFkZHJlc3Mgc3VwcG9ydC5cbiIpOworCQlpbjZfZGV2X3B1dChpZGV2KTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKwlpbjZfaWZhX2hvbGQoaWZwKTsKKwltZW1jcHkoYWRkci5zNl9hZGRyLCBpZnAtPmFkZHIuczZfYWRkciwgOCk7CisJaWYgKF9faXB2Nl90cnlfcmVnZW5fcm5kaWQoaWRldiwgdG1wYWRkcikgPCAwKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZpZnAtPmxvY2spOworCQl3cml0ZV91bmxvY2soJmlkZXYtPmxvY2spOworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiaXB2Nl9jcmVhdGVfdGVtcGFkZHIoKTogcmVnZW5lcmF0aW9uIG9mIHJhbmRvbWl6ZWQgaW50ZXJmYWNlIGlkIGZhaWxlZC5cbiIpOworCQlpbjZfaWZhX3B1dChpZnApOworCQlpbjZfZGV2X3B1dChpZGV2KTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKwltZW1jcHkoJmFkZHIuczZfYWRkcls4XSwgaWRldi0+cm5kaWQsIDgpOworCXRtcF92YWxpZF9sZnQgPSBtaW5fdChfX3UzMiwKKwkJCSAgICAgIGlmcC0+dmFsaWRfbGZ0LAorCQkJICAgICAgaWRldi0+Y25mLnRlbXBfdmFsaWRfbGZ0KTsKKwl0bXBfcHJlZmVyZWRfbGZ0ID0gbWluX3QoX191MzIsIAorCQkJCSBpZnAtPnByZWZlcmVkX2xmdCwgCisJCQkJIGlkZXYtPmNuZi50ZW1wX3ByZWZlcmVkX2xmdCAtIGRlc3luY19mYWN0b3IgLyBIWik7CisJdG1wX3BsZW4gPSBpZnAtPnByZWZpeF9sZW47CisJbWF4X2FkZHJlc3NlcyA9IGlkZXYtPmNuZi5tYXhfYWRkcmVzc2VzOworCXRtcF9jc3RhbXAgPSBpZnAtPmNzdGFtcDsKKwl0bXBfdHN0YW1wID0gaWZwLT50c3RhbXA7CisJc3Bpbl91bmxvY2tfYmgoJmlmcC0+bG9jayk7CisKKwl3cml0ZV91bmxvY2soJmlkZXYtPmxvY2spOworCWlmdCA9ICFtYXhfYWRkcmVzc2VzIHx8CisJICAgICAgaXB2Nl9jb3VudF9hZGRyZXNzZXMoaWRldikgPCBtYXhfYWRkcmVzc2VzID8gCisJCWlwdjZfYWRkX2FkZHIoaWRldiwgJmFkZHIsIHRtcF9wbGVuLAorCQkJICAgICAgaXB2Nl9hZGRyX3R5cGUoJmFkZHIpJklQVjZfQUREUl9TQ09QRV9NQVNLLCBJRkFfRl9URU1QT1JBUlkpIDogTlVMTDsKKwlpZiAoIWlmdCB8fCBJU19FUlIoaWZ0KSkgeworCQlpbjZfaWZhX3B1dChpZnApOworCQlpbjZfZGV2X3B1dChpZGV2KTsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJImlwdjZfY3JlYXRlX3RlbXBhZGRyKCk6IHJldHJ5IHRlbXBvcmFyeSBhZGRyZXNzIHJlZ2VuZXJhdGlvbi5cbiIpOworCQl0bXBhZGRyID0gJmFkZHI7CisJCXdyaXRlX2xvY2soJmlkZXYtPmxvY2spOworCQlnb3RvIHJldHJ5OworCX0KKworCXNwaW5fbG9ja19iaCgmaWZ0LT5sb2NrKTsKKwlpZnQtPmlmcHViID0gaWZwOworCWlmdC0+dmFsaWRfbGZ0ID0gdG1wX3ZhbGlkX2xmdDsKKwlpZnQtPnByZWZlcmVkX2xmdCA9IHRtcF9wcmVmZXJlZF9sZnQ7CisJaWZ0LT5jc3RhbXAgPSB0bXBfY3N0YW1wOworCWlmdC0+dHN0YW1wID0gdG1wX3RzdGFtcDsKKwlzcGluX3VubG9ja19iaCgmaWZ0LT5sb2NrKTsKKworCWFkZHJjb25mX2RhZF9zdGFydChpZnQsIDApOworCWluNl9pZmFfcHV0KGlmdCk7CisJaW42X2Rldl9wdXQoaWRldik7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisvKgorICoJQ2hvb3NlIGFuIGFwcHJvcHJpYXRlIHNvdXJjZSBhZGRyZXNzCisgKglzaG91bGQgZG86CisgKglpKQlnZXQgYW4gYWRkcmVzcyB3aXRoIGFuIGFwcHJvcHJpYXRlIHNjb3BlCisgKglpaSkJc2VlIGlmIHRoZXJlIGlzIGEgc3BlY2lmaWMgcm91dGUgZm9yIHRoZSBkZXN0aW5hdGlvbiBhbmQgdXNlCisgKgkJYW4gYWRkcmVzcyBvZiB0aGUgYXR0YWNoZWQgaW50ZXJmYWNlIAorICoJaWlpKQlkb24ndCB1c2UgZGVwcmVjYXRlZCBhZGRyZXNzZXMKKyAqLworc3RhdGljIGludCBpbmxpbmUgaXB2Nl9zYWRkcl9wcmVmKGNvbnN0IHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCwgdTggaW52cHJlZikKK3sKKwlpbnQgcHJlZjsKKwlwcmVmID0gaWZwLT5mbGFncyZJRkFfRl9ERVBSRUNBVEVEID8gMCA6IDI7CisjaWZkZWYgQ09ORklHX0lQVjZfUFJJVkFDWQorCXByZWYgfD0gKGlmcC0+ZmxhZ3NeaW52cHJlZikmSUZBX0ZfVEVNUE9SQVJZID8gMCA6IDE7CisjZW5kaWYKKwlyZXR1cm4gcHJlZjsKK30KKworI2lmZGVmIENPTkZJR19JUFY2X1BSSVZBQ1kKKyNkZWZpbmUgSVBWNl9HRVRfU0FERFJfTUFYU0NPUkUoc2NvcmUpCSgoc2NvcmUpID09IDMpCisjZWxzZQorI2RlZmluZSBJUFY2X0dFVF9TQUREUl9NQVhTQ09SRShzY29yZSkJKHNjb3JlKQorI2VuZGlmCisKK2ludCBpcHY2X2Rldl9nZXRfc2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsIHN0cnVjdCBpbjZfYWRkciAqc2FkZHIpCit7CisJc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwID0gTlVMTDsKKwlzdHJ1Y3QgaW5ldDZfaWZhZGRyICptYXRjaCA9IE5VTEw7CisJc3RydWN0IGluZXQ2X2RldiAqaWRldjsKKwlpbnQgc2NvcGU7CisJaW50IGVycjsKKwlpbnQgaGlzY29yZSA9IC0xLCBzY29yZTsKKworCXNjb3BlID0gaXB2Nl9hZGRyX3Njb3BlKGRhZGRyKTsKKworCS8qCisJICoJa25vd24gZGV2CisJICoJc2VhcmNoIGRldiBhbmQgd2FsayB0aHJvdWdoIGRldiBhZGRyZXNzZXMKKwkgKi8KKworCWlmIChkZXYpIHsKKwkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spCisJCQlzY29wZSA9IElGQV9IT1NUOworCisJCXJlYWRfbG9jaygmYWRkcmNvbmZfbG9jayk7CisJCWlkZXYgPSBfX2luNl9kZXZfZ2V0KGRldik7CisJCWlmIChpZGV2KSB7CisJCQlyZWFkX2xvY2tfYmgoJmlkZXYtPmxvY2spOworCQkJZm9yIChpZnA9aWRldi0+YWRkcl9saXN0OyBpZnA7IGlmcD1pZnAtPmlmX25leHQpIHsKKwkJCQlpZiAoaWZwLT5zY29wZSA9PSBzY29wZSkgeworCQkJCQlpZiAoaWZwLT5mbGFncyZJRkFfRl9URU5UQVRJVkUpCisJCQkJCQljb250aW51ZTsKKyNpZmRlZiBDT05GSUdfSVBWNl9QUklWQUNZCisJCQkJCXNjb3JlID0gaXB2Nl9zYWRkcl9wcmVmKGlmcCwgaWRldi0+Y25mLnVzZV90ZW1wYWRkciA+IDEgPyBJRkFfRl9URU1QT1JBUlkgOiAwKTsKKyNlbHNlCisJCQkJCXNjb3JlID0gaXB2Nl9zYWRkcl9wcmVmKGlmcCwgMCk7CisjZW5kaWYKKwkJCQkJaWYgKHNjb3JlIDw9IGhpc2NvcmUpCisJCQkJCQljb250aW51ZTsKKworCQkJCQlpZiAobWF0Y2gpCisJCQkJCQlpbjZfaWZhX3B1dChtYXRjaCk7CisJCQkJCW1hdGNoID0gaWZwOworCQkJCQloaXNjb3JlID0gc2NvcmU7CisJCQkJCWluNl9pZmFfaG9sZChpZnApOworCisJCQkJCWlmIChJUFY2X0dFVF9TQUREUl9NQVhTQ09SRShzY29yZSkpIHsKKwkJCQkJCXJlYWRfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwkJCQkJCXJlYWRfdW5sb2NrKCZhZGRyY29uZl9sb2NrKTsKKwkJCQkJCWdvdG8gb3V0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOworCQl9CisJCXJlYWRfdW5sb2NrKCZhZGRyY29uZl9sb2NrKTsKKwl9CisKKwlpZiAoc2NvcGUgPT0gSUZBX0xJTkspCisJCWdvdG8gb3V0OworCisJLyoKKwkgKglkZXYgPT0gTlVMTCBvciBzZWFyY2ggZmFpbGVkIGZvciBzcGVjaWZpZWQgZGV2CisJICovCisKKwlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOworCXJlYWRfbG9jaygmYWRkcmNvbmZfbG9jayk7CisJZm9yIChkZXYgPSBkZXZfYmFzZTsgZGV2OyBkZXY9ZGV2LT5uZXh0KSB7CisJCWlkZXYgPSBfX2luNl9kZXZfZ2V0KGRldik7CisJCWlmIChpZGV2KSB7CisJCQlyZWFkX2xvY2tfYmgoJmlkZXYtPmxvY2spOworCQkJZm9yIChpZnA9aWRldi0+YWRkcl9saXN0OyBpZnA7IGlmcD1pZnAtPmlmX25leHQpIHsKKwkJCQlpZiAoaWZwLT5zY29wZSA9PSBzY29wZSkgeworCQkJCQlpZiAoaWZwLT5mbGFncyZJRkFfRl9URU5UQVRJVkUpCisJCQkJCQljb250aW51ZTsKKyNpZmRlZiBDT05GSUdfSVBWNl9QUklWQUNZCisJCQkJCXNjb3JlID0gaXB2Nl9zYWRkcl9wcmVmKGlmcCwgaWRldi0+Y25mLnVzZV90ZW1wYWRkciA+IDEgPyBJRkFfRl9URU1QT1JBUlkgOiAwKTsKKyNlbHNlCisJCQkJCXNjb3JlID0gaXB2Nl9zYWRkcl9wcmVmKGlmcCwgMCk7CisjZW5kaWYKKwkJCQkJaWYgKHNjb3JlIDw9IGhpc2NvcmUpCisJCQkJCQljb250aW51ZTsKKworCQkJCQlpZiAobWF0Y2gpCisJCQkJCQlpbjZfaWZhX3B1dChtYXRjaCk7CisJCQkJCW1hdGNoID0gaWZwOworCQkJCQloaXNjb3JlID0gc2NvcmU7CisJCQkJCWluNl9pZmFfaG9sZChpZnApOworCisJCQkJCWlmIChJUFY2X0dFVF9TQUREUl9NQVhTQ09SRShzY29yZSkpIHsKKwkJCQkJCXJlYWRfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwkJCQkJCWdvdG8gb3V0X3VubG9ja19iYXNlOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOworCQl9CisJfQorCitvdXRfdW5sb2NrX2Jhc2U6CisJcmVhZF91bmxvY2soJmFkZHJjb25mX2xvY2spOworCXJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKworb3V0OgorCWVyciA9IC1FQUREUk5PVEFWQUlMOworCWlmIChtYXRjaCkgeworCQlpcHY2X2FkZHJfY29weShzYWRkciwgJm1hdGNoLT5hZGRyKTsKKwkJZXJyID0gMDsKKwkJaW42X2lmYV9wdXQobWF0Y2gpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKworaW50IGlwdjZfZ2V0X3NhZGRyKHN0cnVjdCBkc3RfZW50cnkgKmRzdCwKKwkJICAgc3RydWN0IGluNl9hZGRyICpkYWRkciwgc3RydWN0IGluNl9hZGRyICpzYWRkcikKK3sKKwlyZXR1cm4gaXB2Nl9kZXZfZ2V0X3NhZGRyKGRzdCA/ICgoc3RydWN0IHJ0Nl9pbmZvICopZHN0KS0+cnQ2aV9pZGV2LT5kZXYgOiBOVUxMLCBkYWRkciwgc2FkZHIpOworfQorCisKK2ludCBpcHY2X2dldF9sbGFkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGluNl9hZGRyICphZGRyKQoreworCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CisJaW50IGVyciA9IC1FQUREUk5PVEFWQUlMOworCisJcmVhZF9sb2NrKCZhZGRyY29uZl9sb2NrKTsKKwlpZiAoKGlkZXYgPSBfX2luNl9kZXZfZ2V0KGRldikpICE9IE5VTEwpIHsKKwkJc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwOworCisJCXJlYWRfbG9ja19iaCgmaWRldi0+bG9jayk7CisJCWZvciAoaWZwPWlkZXYtPmFkZHJfbGlzdDsgaWZwOyBpZnA9aWZwLT5pZl9uZXh0KSB7CisJCQlpZiAoaWZwLT5zY29wZSA9PSBJRkFfTElOSyAmJiAhKGlmcC0+ZmxhZ3MmSUZBX0ZfVEVOVEFUSVZFKSkgeworCQkJCWlwdjZfYWRkcl9jb3B5KGFkZHIsICZpZnAtPmFkZHIpOworCQkJCWVyciA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOworCX0KKwlyZWFkX3VubG9jaygmYWRkcmNvbmZfbG9jayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpcHY2X2NvdW50X2FkZHJlc3NlcyhzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KQoreworCWludCBjbnQgPSAwOworCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcDsKKworCXJlYWRfbG9ja19iaCgmaWRldi0+bG9jayk7CisJZm9yIChpZnA9aWRldi0+YWRkcl9saXN0OyBpZnA7IGlmcD1pZnAtPmlmX25leHQpCisJCWNudCsrOworCXJlYWRfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwlyZXR1cm4gY250OworfQorCitpbnQgaXB2Nl9jaGtfYWRkcihzdHJ1Y3QgaW42X2FkZHIgKmFkZHIsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzdHJpY3QpCit7CisJc3RydWN0IGluZXQ2X2lmYWRkciAqIGlmcDsKKwl1OCBoYXNoID0gaXB2Nl9hZGRyX2hhc2goYWRkcik7CisKKwlyZWFkX2xvY2tfYmgoJmFkZHJjb25mX2hhc2hfbG9jayk7CisJZm9yKGlmcCA9IGluZXQ2X2FkZHJfbHN0W2hhc2hdOyBpZnA7IGlmcD1pZnAtPmxzdF9uZXh0KSB7CisJCWlmIChpcHY2X2FkZHJfZXF1YWwoJmlmcC0+YWRkciwgYWRkcikgJiYKKwkJICAgICEoaWZwLT5mbGFncyZJRkFfRl9URU5UQVRJVkUpKSB7CisJCQlpZiAoZGV2ID09IE5VTEwgfHwgaWZwLT5pZGV2LT5kZXYgPT0gZGV2IHx8CisJCQkgICAgIShpZnAtPnNjb3BlJihJRkFfTElOS3xJRkFfSE9TVCkgfHwgc3RyaWN0KSkKKwkJCQlicmVhazsKKwkJfQorCX0KKwlyZWFkX3VubG9ja19iaCgmYWRkcmNvbmZfaGFzaF9sb2NrKTsKKwlyZXR1cm4gaWZwICE9IE5VTEw7Cit9CisKK3N0YXRpYworaW50IGlwdjZfY2hrX3NhbWVfYWRkcihjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGluZXQ2X2lmYWRkciAqIGlmcDsKKwl1OCBoYXNoID0gaXB2Nl9hZGRyX2hhc2goYWRkcik7CisKKwlmb3IoaWZwID0gaW5ldDZfYWRkcl9sc3RbaGFzaF07IGlmcDsgaWZwPWlmcC0+bHN0X25leHQpIHsKKwkJaWYgKGlwdjZfYWRkcl9lcXVhbCgmaWZwLT5hZGRyLCBhZGRyKSkgeworCQkJaWYgKGRldiA9PSBOVUxMIHx8IGlmcC0+aWRldi0+ZGV2ID09IGRldikKKwkJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gaWZwICE9IE5VTEw7Cit9CisKK3N0cnVjdCBpbmV0Nl9pZmFkZHIgKiBpcHY2X2dldF9pZmFkZHIoc3RydWN0IGluNl9hZGRyICphZGRyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RyaWN0KQoreworCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKiBpZnA7CisJdTggaGFzaCA9IGlwdjZfYWRkcl9oYXNoKGFkZHIpOworCisJcmVhZF9sb2NrX2JoKCZhZGRyY29uZl9oYXNoX2xvY2spOworCWZvcihpZnAgPSBpbmV0Nl9hZGRyX2xzdFtoYXNoXTsgaWZwOyBpZnA9aWZwLT5sc3RfbmV4dCkgeworCQlpZiAoaXB2Nl9hZGRyX2VxdWFsKCZpZnAtPmFkZHIsIGFkZHIpKSB7CisJCQlpZiAoZGV2ID09IE5VTEwgfHwgaWZwLT5pZGV2LT5kZXYgPT0gZGV2IHx8CisJCQkgICAgIShpZnAtPnNjb3BlJihJRkFfTElOS3xJRkFfSE9TVCkgfHwgc3RyaWN0KSkgeworCQkJCWluNl9pZmFfaG9sZChpZnApOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXJlYWRfdW5sb2NrX2JoKCZhZGRyY29uZl9oYXNoX2xvY2spOworCisJcmV0dXJuIGlmcDsKK30KKworaW50IGlwdjZfcmN2X3NhZGRyX2VxdWFsKGNvbnN0IHN0cnVjdCBzb2NrICpzaywgY29uc3Qgc3RydWN0IHNvY2sgKnNrMikKK3sKKwljb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNrX3Jjdl9zYWRkcjYgPSAmaW5ldDZfc2soc2spLT5yY3Zfc2FkZHI7CisJY29uc3Qgc3RydWN0IGluNl9hZGRyICpzazJfcmN2X3NhZGRyNiA9IHRjcF92Nl9yY3Zfc2FkZHIoc2syKTsKKwl1MzIgc2tfcmN2X3NhZGRyID0gaW5ldF9zayhzayktPnJjdl9zYWRkcjsKKwl1MzIgc2syX3Jjdl9zYWRkciA9IHRjcF92NF9yY3Zfc2FkZHIoc2syKTsKKwlpbnQgc2tfaXB2Nm9ubHkgPSBpcHY2X29ubHlfc29jayhzayk7CisJaW50IHNrMl9pcHY2b25seSA9IHRjcF92Nl9pcHY2b25seShzazIpOworCWludCBhZGRyX3R5cGUgPSBpcHY2X2FkZHJfdHlwZShza19yY3Zfc2FkZHI2KTsKKwlpbnQgYWRkcl90eXBlMiA9IHNrMl9yY3Zfc2FkZHI2ID8gaXB2Nl9hZGRyX3R5cGUoc2syX3Jjdl9zYWRkcjYpIDogSVBWNl9BRERSX01BUFBFRDsKKworCWlmICghc2syX3Jjdl9zYWRkciAmJiAhc2tfaXB2Nm9ubHkpCisJCXJldHVybiAxOworCisJaWYgKGFkZHJfdHlwZTIgPT0gSVBWNl9BRERSX0FOWSAmJgorCSAgICAhKHNrMl9pcHY2b25seSAmJiBhZGRyX3R5cGUgPT0gSVBWNl9BRERSX01BUFBFRCkpCisJCXJldHVybiAxOworCisJaWYgKGFkZHJfdHlwZSA9PSBJUFY2X0FERFJfQU5ZICYmCisJICAgICEoc2tfaXB2Nm9ubHkgJiYgYWRkcl90eXBlMiA9PSBJUFY2X0FERFJfTUFQUEVEKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoc2syX3Jjdl9zYWRkcjYgJiYKKwkgICAgaXB2Nl9hZGRyX2VxdWFsKHNrX3Jjdl9zYWRkcjYsIHNrMl9yY3Zfc2FkZHI2KSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoYWRkcl90eXBlID09IElQVjZfQUREUl9NQVBQRUQgJiYKKwkgICAgIXNrMl9pcHY2b25seSAmJgorCSAgICAoIXNrMl9yY3Zfc2FkZHIgfHwgIXNrX3Jjdl9zYWRkciB8fCBza19yY3Zfc2FkZHIgPT0gc2syX3Jjdl9zYWRkcikpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEdldHMgcmVmZXJlbmNlZCBhZGRyZXNzLCBkZXN0cm95cyBpZmFkZHIgKi8KKwordm9pZCBhZGRyY29uZl9kYWRfZmFpbHVyZShzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnApCit7CisJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGR1cGxpY2F0ZSBhZGRyZXNzIGRldGVjdGVkIVxuIiwgaWZwLT5pZGV2LT5kZXYtPm5hbWUpOworCWlmIChpZnAtPmZsYWdzJklGQV9GX1BFUk1BTkVOVCkgeworCQlzcGluX2xvY2tfYmgoJmlmcC0+bG9jayk7CisJCWFkZHJjb25mX2RlbF90aW1lcihpZnApOworCQlpZnAtPmZsYWdzIHw9IElGQV9GX1RFTlRBVElWRTsKKwkJc3Bpbl91bmxvY2tfYmgoJmlmcC0+bG9jayk7CisJCWluNl9pZmFfcHV0KGlmcCk7CisjaWZkZWYgQ09ORklHX0lQVjZfUFJJVkFDWQorCX0gZWxzZSBpZiAoaWZwLT5mbGFncyZJRkFfRl9URU1QT1JBUlkpIHsKKwkJc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwdWI7CisJCXNwaW5fbG9ja19iaCgmaWZwLT5sb2NrKTsKKwkJaWZwdWIgPSBpZnAtPmlmcHViOworCQlpZiAoaWZwdWIpIHsKKwkJCWluNl9pZmFfaG9sZChpZnB1Yik7CisJCQlzcGluX3VubG9ja19iaCgmaWZwLT5sb2NrKTsKKwkJCWlwdjZfY3JlYXRlX3RlbXBhZGRyKGlmcHViLCBpZnApOworCQkJaW42X2lmYV9wdXQoaWZwdWIpOworCQl9IGVsc2UgeworCQkJc3Bpbl91bmxvY2tfYmgoJmlmcC0+bG9jayk7CisJCX0KKwkJaXB2Nl9kZWxfYWRkcihpZnApOworI2VuZGlmCisJfSBlbHNlCisJCWlwdjZfZGVsX2FkZHIoaWZwKTsKK30KKworCisvKiBKb2luIHRvIHNvbGljaXRlZCBhZGRyIG11bHRpY2FzdCBncm91cC4gKi8KKwordm9pZCBhZGRyY29uZl9qb2luX3NvbGljdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIpCit7CisJc3RydWN0IGluNl9hZGRyIG1hZGRyOworCisJaWYgKGRldi0+ZmxhZ3MmKElGRl9MT09QQkFDS3xJRkZfTk9BUlApKQorCQlyZXR1cm47CisKKwlhZGRyY29uZl9hZGRyX3NvbGljdF9tdWx0KGFkZHIsICZtYWRkcik7CisJaXB2Nl9kZXZfbWNfaW5jKGRldiwgJm1hZGRyKTsKK30KKwordm9pZCBhZGRyY29uZl9sZWF2ZV9zb2xpY3Qoc3RydWN0IGluZXQ2X2RldiAqaWRldiwgc3RydWN0IGluNl9hZGRyICphZGRyKQoreworCXN0cnVjdCBpbjZfYWRkciBtYWRkcjsKKworCWlmIChpZGV2LT5kZXYtPmZsYWdzJihJRkZfTE9PUEJBQ0t8SUZGX05PQVJQKSkKKwkJcmV0dXJuOworCisJYWRkcmNvbmZfYWRkcl9zb2xpY3RfbXVsdChhZGRyLCAmbWFkZHIpOworCV9faXB2Nl9kZXZfbWNfZGVjKGlkZXYsICZtYWRkcik7Cit9CisKK3ZvaWQgYWRkcmNvbmZfam9pbl9hbnljYXN0KHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCkKK3sKKwlzdHJ1Y3QgaW42X2FkZHIgYWRkcjsKKwlpcHY2X2FkZHJfcHJlZml4KCZhZGRyLCAmaWZwLT5hZGRyLCBpZnAtPnByZWZpeF9sZW4pOworCWlmIChpcHY2X2FkZHJfYW55KCZhZGRyKSkKKwkJcmV0dXJuOworCWlwdjZfZGV2X2FjX2luYyhpZnAtPmlkZXYtPmRldiwgJmFkZHIpOworfQorCit2b2lkIGFkZHJjb25mX2xlYXZlX2FueWNhc3Qoc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwKQoreworCXN0cnVjdCBpbjZfYWRkciBhZGRyOworCWlwdjZfYWRkcl9wcmVmaXgoJmFkZHIsICZpZnAtPmFkZHIsIGlmcC0+cHJlZml4X2xlbik7CisJaWYgKGlwdjZfYWRkcl9hbnkoJmFkZHIpKQorCQlyZXR1cm47CisJX19pcHY2X2Rldl9hY19kZWMoaWZwLT5pZGV2LCAmYWRkcik7Cit9CisKK3N0YXRpYyBpbnQgaXB2Nl9nZW5lcmF0ZV9ldWk2NCh1OCAqZXVpLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN3aXRjaCAoZGV2LT50eXBlKSB7CisJY2FzZSBBUlBIUkRfRVRIRVI6CisJY2FzZSBBUlBIUkRfRkRESToKKwljYXNlIEFSUEhSRF9JRUVFODAyX1RSOgorCQlpZiAoZGV2LT5hZGRyX2xlbiAhPSBFVEhfQUxFTikKKwkJCXJldHVybiAtMTsKKwkJbWVtY3B5KGV1aSwgZGV2LT5kZXZfYWRkciwgMyk7CisJCW1lbWNweShldWkgKyA1LCBkZXYtPmRldl9hZGRyICsgMywgMyk7CisKKwkJLyoKKwkJICogVGhlIHpTZXJpZXMgT1NBIG5ldHdvcmsgY2FyZHMgY2FuIGJlIHNoYXJlZCBhbW9uZyB2YXJpb3VzCisJCSAqIE9TIGluc3RhbmNlcywgYnV0IHRoZSBPU0EgY2FyZHMgaGF2ZSBvbmx5IG9uZSBNQUMgYWRkcmVzcy4KKwkJICogVGhpcyBsZWFkcyB0byBkdXBsaWNhdGUgYWRkcmVzcyBjb25mbGljdHMgaW4gY29uanVuY3Rpb24KKwkJICogd2l0aCBJUHY2IGlmIG1vcmUgdGhhbiBvbmUgaW5zdGFuY2UgdXNlcyB0aGUgc2FtZSBjYXJkLgorCQkgKiAKKwkJICogVGhlIGRyaXZlciBmb3IgdGhlc2UgY2FyZHMgY2FuIGRlbGl2ZXIgYSB1bmlxdWUgMTYtYml0CisJCSAqIGlkZW50aWZpZXIgZm9yIGVhY2ggaW5zdGFuY2Ugc2hhcmluZyB0aGUgc2FtZSBjYXJkLiAgSXQgaXMKKwkJICogcGxhY2VkIGluc3RlYWQgb2YgMHhGRkZFIGluIHRoZSBpbnRlcmZhY2UgaWRlbnRpZmllci4gIFRoZQorCQkgKiAidSIgYml0IG9mIHRoZSBpbnRlcmZhY2UgaWRlbnRpZmllciBpcyBub3QgaW52ZXJ0ZWQgaW4gdGhpcworCQkgKiBjYXNlLiAgSGVuY2UgdGhlIHJlc3VsdGluZyBpbnRlcmZhY2UgaWRlbnRpZmllciBoYXMgbG9jYWwKKwkJICogc2NvcGUgYWNjb3JkaW5nIHRvIFJGQzIzNzMuCisJCSAqLworCQlpZiAoZGV2LT5kZXZfaWQpIHsKKwkJCWV1aVszXSA9IChkZXYtPmRldl9pZCA+PiA4KSAmIDB4RkY7CisJCQlldWlbNF0gPSBkZXYtPmRldl9pZCAmIDB4RkY7CisJCX0gZWxzZSB7CisJCQlldWlbM10gPSAweEZGOworCQkJZXVpWzRdID0gMHhGRTsKKwkJCWV1aVswXSBePSAyOworCQl9CisJCXJldHVybiAwOworCWNhc2UgQVJQSFJEX0FSQ05FVDoKKwkJLyogWFhYOiBpbmhlcml0IEVVSS02NCBmcm9tIG90aGVyIGludGVyZmFjZSAtLSB5b3NoZnVqaSAqLworCQlpZiAoZGV2LT5hZGRyX2xlbiAhPSBBUkNORVRfQUxFTikKKwkJCXJldHVybiAtMTsKKwkJbWVtc2V0KGV1aSwgMCwgNyk7CisJCWV1aVs3XSA9ICoodTgqKWRldi0+ZGV2X2FkZHI7CisJCXJldHVybiAwOworCWNhc2UgQVJQSFJEX0lORklOSUJBTkQ6CisJCWlmIChkZXYtPmFkZHJfbGVuICE9IElORklOSUJBTkRfQUxFTikKKwkJCXJldHVybiAtMTsKKwkJbWVtY3B5KGV1aSwgZGV2LT5kZXZfYWRkciArIDEyLCA4KTsKKwkJZXVpWzBdIHw9IDI7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgaXB2Nl9pbmhlcml0X2V1aTY0KHU4ICpldWksIHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpCit7CisJaW50IGVyciA9IC0xOworCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcDsKKworCXJlYWRfbG9ja19iaCgmaWRldi0+bG9jayk7CisJZm9yIChpZnA9aWRldi0+YWRkcl9saXN0OyBpZnA7IGlmcD1pZnAtPmlmX25leHQpIHsKKwkJaWYgKGlmcC0+c2NvcGUgPT0gSUZBX0xJTksgJiYgIShpZnAtPmZsYWdzJklGQV9GX1RFTlRBVElWRSkpIHsKKwkJCW1lbWNweShldWksIGlmcC0+YWRkci5zNl9hZGRyKzgsIDgpOworCQkJZXJyID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCXJlYWRfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCisjaWZkZWYgQ09ORklHX0lQVjZfUFJJVkFDWQorLyogKHJlKWdlbmVyYXRpb24gb2YgcmFuZG9taXplZCBpbnRlcmZhY2UgaWRlbnRpZmllciAoUkZDIDMwNDEgMy4yLCAzLjUpICovCitzdGF0aWMgaW50IF9faXB2Nl9yZWdlbl9ybmRpZChzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzJdOworCisJc2dbMF0ucGFnZSA9IHZpcnRfdG9fcGFnZShpZGV2LT5lbnRyb3B5KTsKKwlzZ1swXS5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShpZGV2LT5lbnRyb3B5KTsKKwlzZ1swXS5sZW5ndGggPSA4OworCXNnWzFdLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UoaWRldi0+d29ya19ldWk2NCk7CisJc2dbMV0ub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoaWRldi0+d29ya19ldWk2NCk7CisJc2dbMV0ubGVuZ3RoID0gODsKKworCWRldiA9IGlkZXYtPmRldjsKKworCWlmIChpcHY2X2dlbmVyYXRlX2V1aTY0KGlkZXYtPndvcmtfZXVpNjQsIGRldikpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIl9faXB2Nl9yZWdlbl9ybmRpZChpZGV2PSVwKTogY2Fubm90IGdldCBFVUk2NCBpZGVudGlmaWVyOyB1c2UgcmFuZG9tIGJ5dGVzLlxuIiwKKwkJCWlkZXYpOworCQlnZXRfcmFuZG9tX2J5dGVzKGlkZXYtPndvcmtfZXVpNjQsIHNpemVvZihpZGV2LT53b3JrX2V1aTY0KSk7CisJfQorcmVnZW46CisJc3Bpbl9sb2NrKCZtZDVfdGZtX2xvY2spOworCWlmICh1bmxpa2VseShtZDVfdGZtID09IE5VTEwpKSB7CisJCXNwaW5fdW5sb2NrKCZtZDVfdGZtX2xvY2spOworCQlyZXR1cm4gLTE7CisJfQorCWNyeXB0b19kaWdlc3RfaW5pdChtZDVfdGZtKTsKKwljcnlwdG9fZGlnZXN0X3VwZGF0ZShtZDVfdGZtLCBzZywgMik7CisJY3J5cHRvX2RpZ2VzdF9maW5hbChtZDVfdGZtLCBpZGV2LT53b3JrX2RpZ2VzdCk7CisJc3Bpbl91bmxvY2soJm1kNV90Zm1fbG9jayk7CisKKwltZW1jcHkoaWRldi0+cm5kaWQsICZpZGV2LT53b3JrX2RpZ2VzdFswXSwgOCk7CisJaWRldi0+cm5kaWRbMF0gJj0gfjB4MDI7CisJbWVtY3B5KGlkZXYtPmVudHJvcHksICZpZGV2LT53b3JrX2RpZ2VzdFs4XSwgOCk7CisKKwkvKgorCSAqIDxkcmFmdC1pZXRmLWlwbmd3Zy10ZW1wLWFkZHJlc3Nlcy12Mi0wMC50eHQ+OgorCSAqIGNoZWNrIGlmIGdlbmVyYXRlZCBhZGRyZXNzIGlzIG5vdCBpbmFwcHJvcHJpYXRlCisJICoKKwkgKiAgLSBSZXNlcnZlZCBzdWJuZXQgYW55Y2FzdCAoUkZDIDI1MjYpCisJICoJMTExMTExMDEgMTEuLi4uMTEgMXh4eHh4eHgKKwkgKiAgLSBJU0FUQVAgKGRyYWZ0LWlldGYtbmd0cmFucy1pc2F0YXAtMTMudHh0KSA1LjEKKwkgKgkwMC0wMC01RS1GRS14eC14eC14eC14eAorCSAqICAtIHZhbHVlIDAKKwkgKiAgLSBYWFg6IGFscmVhZHkgYXNzaWduZWQgdG8gYW4gYWRkcmVzcyBvbiB0aGUgZGV2aWNlCisJICovCisJaWYgKGlkZXYtPnJuZGlkWzBdID09IDB4ZmQgJiYgCisJICAgIChpZGV2LT5ybmRpZFsxXSZpZGV2LT5ybmRpZFsyXSZpZGV2LT5ybmRpZFszXSZpZGV2LT5ybmRpZFs0XSZpZGV2LT5ybmRpZFs1XSZpZGV2LT5ybmRpZFs2XSkgPT0gMHhmZiAmJgorCSAgICAoaWRldi0+cm5kaWRbN10mMHg4MCkpCisJCWdvdG8gcmVnZW47CisJaWYgKChpZGV2LT5ybmRpZFswXXxpZGV2LT5ybmRpZFsxXSkgPT0gMCkgeworCQlpZiAoaWRldi0+cm5kaWRbMl0gPT0gMHg1ZSAmJiBpZGV2LT5ybmRpZFszXSA9PSAweGZlKQorCQkJZ290byByZWdlbjsKKwkJaWYgKChpZGV2LT5ybmRpZFsyXXxpZGV2LT5ybmRpZFszXXxpZGV2LT5ybmRpZFs0XXxpZGV2LT5ybmRpZFs1XXxpZGV2LT5ybmRpZFs2XXxpZGV2LT5ybmRpZFs3XSkgPT0gMHgwMCkKKwkJCWdvdG8gcmVnZW47CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlwdjZfcmVnZW5fcm5kaWQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSAoc3RydWN0IGluZXQ2X2RldiAqKSBkYXRhOworCXVuc2lnbmVkIGxvbmcgZXhwaXJlczsKKworCXJlYWRfbG9ja19iaCgmYWRkcmNvbmZfbG9jayk7CisJd3JpdGVfbG9ja19iaCgmaWRldi0+bG9jayk7CisKKwlpZiAoaWRldi0+ZGVhZCkKKwkJZ290byBvdXQ7CisKKwlpZiAoX19pcHY2X3JlZ2VuX3JuZGlkKGlkZXYpIDwgMCkKKwkJZ290byBvdXQ7CisJCisJZXhwaXJlcyA9IGppZmZpZXMgKworCQlpZGV2LT5jbmYudGVtcF9wcmVmZXJlZF9sZnQgKiBIWiAtIAorCQlpZGV2LT5jbmYucmVnZW5fbWF4X3JldHJ5ICogaWRldi0+Y25mLmRhZF90cmFuc21pdHMgKiBpZGV2LT5uZF9wYXJtcy0+cmV0cmFuc190aW1lIC0gZGVzeW5jX2ZhY3RvcjsKKwlpZiAodGltZV9iZWZvcmUoZXhwaXJlcywgamlmZmllcykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJImlwdjZfcmVnZW5fcm5kaWQoKTogdG9vIHNob3J0IHJlZ2VuZXJhdGlvbiBpbnRlcnZhbDsgdGltZXIgZGlzYWJsZWQgZm9yICVzLlxuIiwKKwkJCWlkZXYtPmRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghbW9kX3RpbWVyKCZpZGV2LT5yZWdlbl90aW1lciwgZXhwaXJlcykpCisJCWluNl9kZXZfaG9sZChpZGV2KTsKKworb3V0OgorCXdyaXRlX3VubG9ja19iaCgmaWRldi0+bG9jayk7CisJcmVhZF91bmxvY2tfYmgoJmFkZHJjb25mX2xvY2spOworCWluNl9kZXZfcHV0KGlkZXYpOworfQorCitzdGF0aWMgaW50IF9faXB2Nl90cnlfcmVnZW5fcm5kaWQoc3RydWN0IGluZXQ2X2RldiAqaWRldiwgc3RydWN0IGluNl9hZGRyICp0bXBhZGRyKSB7CisJaW50IHJldCA9IDA7CisKKwlpZiAodG1wYWRkciAmJiBtZW1jbXAoaWRldi0+cm5kaWQsICZ0bXBhZGRyLT5zNl9hZGRyWzhdLCA4KSA9PSAwKQorCQlyZXQgPSBfX2lwdjZfcmVnZW5fcm5kaWQoaWRldik7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisvKgorICoJQWRkIHByZWZpeCByb3V0ZS4KKyAqLworCitzdGF0aWMgdm9pZAorYWRkcmNvbmZfcHJlZml4X3JvdXRlKHN0cnVjdCBpbjZfYWRkciAqcGZ4LCBpbnQgcGxlbiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBleHBpcmVzLCB1bnNpZ25lZCBmbGFncykKK3sKKwlzdHJ1Y3QgaW42X3J0bXNnIHJ0bXNnOworCisJbWVtc2V0KCZydG1zZywgMCwgc2l6ZW9mKHJ0bXNnKSk7CisJaXB2Nl9hZGRyX2NvcHkoJnJ0bXNnLnJ0bXNnX2RzdCwgcGZ4KTsKKwlydG1zZy5ydG1zZ19kc3RfbGVuID0gcGxlbjsKKwlydG1zZy5ydG1zZ19tZXRyaWMgPSBJUDZfUlRfUFJJT19BRERSQ09ORjsKKwlydG1zZy5ydG1zZ19pZmluZGV4ID0gZGV2LT5pZmluZGV4OworCXJ0bXNnLnJ0bXNnX2luZm8gPSBleHBpcmVzOworCXJ0bXNnLnJ0bXNnX2ZsYWdzID0gUlRGX1VQfGZsYWdzOworCXJ0bXNnLnJ0bXNnX3R5cGUgPSBSVE1TR19ORVdST1VURTsKKworCS8qIFByZXZlbnQgdXNlbGVzcyBjbG9uaW5nIG9uIFB0UCBTSVQuCisJICAgVGhpcyB0aGluZyBpcyBkb25lIGhlcmUgZXhwZWN0aW5nIHRoYXQgdGhlIHdob2xlCisJICAgY2xhc3Mgb2Ygbm9uLWJyb2FkY2FzdCBkZXZpY2VzIG5lZWQgbm90IGNsb25pbmcuCisJICovCisJaWYgKGRldi0+dHlwZSA9PSBBUlBIUkRfU0lUICYmIChkZXYtPmZsYWdzJklGRl9QT0lOVE9QT0lOVCkpCisJCXJ0bXNnLnJ0bXNnX2ZsYWdzIHw9IFJURl9OT05FWFRIT1A7CisKKwlpcDZfcm91dGVfYWRkKCZydG1zZywgTlVMTCwgTlVMTCk7Cit9CisKKy8qIENyZWF0ZSAiZGVmYXVsdCIgbXVsdGljYXN0IHJvdXRlIHRvIHRoZSBpbnRlcmZhY2UgKi8KKworc3RhdGljIHZvaWQgYWRkcmNvbmZfYWRkX21yb3V0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpbjZfcnRtc2cgcnRtc2c7CisKKwltZW1zZXQoJnJ0bXNnLCAwLCBzaXplb2YocnRtc2cpKTsKKwlpcHY2X2FkZHJfc2V0KCZydG1zZy5ydG1zZ19kc3QsCisJCSAgICAgIGh0b25sKDB4RkYwMDAwMDApLCAwLCAwLCAwKTsKKwlydG1zZy5ydG1zZ19kc3RfbGVuID0gODsKKwlydG1zZy5ydG1zZ19tZXRyaWMgPSBJUDZfUlRfUFJJT19BRERSQ09ORjsKKwlydG1zZy5ydG1zZ19pZmluZGV4ID0gZGV2LT5pZmluZGV4OworCXJ0bXNnLnJ0bXNnX2ZsYWdzID0gUlRGX1VQOworCXJ0bXNnLnJ0bXNnX3R5cGUgPSBSVE1TR19ORVdST1VURTsKKwlpcDZfcm91dGVfYWRkKCZydG1zZywgTlVMTCwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIHNpdF9yb3V0ZV9hZGQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW42X3J0bXNnIHJ0bXNnOworCisJbWVtc2V0KCZydG1zZywgMCwgc2l6ZW9mKHJ0bXNnKSk7CisKKwlydG1zZy5ydG1zZ190eXBlCT0gUlRNU0dfTkVXUk9VVEU7CisJcnRtc2cucnRtc2dfbWV0cmljCT0gSVA2X1JUX1BSSU9fQUREUkNPTkY7CisKKwkvKiBwcmVmaXggbGVuZ3RoIC0gOTYgYml0cyAiOjpkLmQuZC5kIiAqLworCXJ0bXNnLnJ0bXNnX2RzdF9sZW4JPSA5NjsKKwlydG1zZy5ydG1zZ19mbGFncwk9IFJURl9VUHxSVEZfTk9ORVhUSE9QOworCXJ0bXNnLnJ0bXNnX2lmaW5kZXgJPSBkZXYtPmlmaW5kZXg7CisKKwlpcDZfcm91dGVfYWRkKCZydG1zZywgTlVMTCwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZHJjb25mX2FkZF9scm91dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW42X2FkZHIgYWRkcjsKKworCWlwdjZfYWRkcl9zZXQoJmFkZHIsICBodG9ubCgweEZFODAwMDAwKSwgMCwgMCwgMCk7CisJYWRkcmNvbmZfcHJlZml4X3JvdXRlKCZhZGRyLCA2NCwgZGV2LCAwLCAwKTsKK30KKworc3RhdGljIHN0cnVjdCBpbmV0Nl9kZXYgKmFkZHJjb25mX2FkZF9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OworCisJQVNTRVJUX1JUTkwoKTsKKworCWlmICgoaWRldiA9IGlwdjZfZmluZF9pZGV2KGRldikpID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJLyogQWRkIGRlZmF1bHQgbXVsdGljYXN0IHJvdXRlICovCisJYWRkcmNvbmZfYWRkX21yb3V0ZShkZXYpOworCisJLyogQWRkIGxpbmsgbG9jYWwgcm91dGUgKi8KKwlhZGRyY29uZl9hZGRfbHJvdXRlKGRldik7CisJcmV0dXJuIGlkZXY7Cit9CisKK3ZvaWQgYWRkcmNvbmZfcHJlZml4X3JjdihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqb3B0LCBpbnQgbGVuKQoreworCXN0cnVjdCBwcmVmaXhfaW5mbyAqcGluZm87CisJX191MzIgdmFsaWRfbGZ0OworCV9fdTMyIHByZWZlcmVkX2xmdDsKKwlpbnQgYWRkcl90eXBlOworCXVuc2lnbmVkIGxvbmcgcnRfZXhwaXJlczsKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppbjZfZGV2OworCisJcGluZm8gPSAoc3RydWN0IHByZWZpeF9pbmZvICopIG9wdDsKKwkKKwlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBwcmVmaXhfaW5mbykpIHsKKwkJQURCRygoImFkZHJjb25mOiBwcmVmaXggb3B0aW9uIHRvbyBzaG9ydFxuIikpOworCQlyZXR1cm47CisJfQorCQorCS8qCisJICoJVmFsaWRhdGlvbiBjaGVja3MgKFtBRERSQ09ORl0sIHBhZ2UgMTkpCisJICovCisKKwlhZGRyX3R5cGUgPSBpcHY2X2FkZHJfdHlwZSgmcGluZm8tPnByZWZpeCk7CisKKwlpZiAoYWRkcl90eXBlICYgKElQVjZfQUREUl9NVUxUSUNBU1R8SVBWNl9BRERSX0xJTktMT0NBTCkpCisJCXJldHVybjsKKworCXZhbGlkX2xmdCA9IG50b2hsKHBpbmZvLT52YWxpZCk7CisJcHJlZmVyZWRfbGZ0ID0gbnRvaGwocGluZm8tPnByZWZlcmVkKTsKKworCWlmIChwcmVmZXJlZF9sZnQgPiB2YWxpZF9sZnQpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFkZHJjb25mOiBwcmVmaXggb3B0aW9uIGhhcyBpbnZhbGlkIGxpZmV0aW1lXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWluNl9kZXYgPSBpbjZfZGV2X2dldChkZXYpOworCisJaWYgKGluNl9kZXYgPT0gTlVMTCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImFkZHJjb25mOiBkZXZpY2UgJXMgbm90IGNvbmZpZ3VyZWRcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqCVR3byB0aGluZ3MgZ29pbmcgb24gaGVyZToKKwkgKgkxKSBBZGQgcm91dGVzIGZvciBvbi1saW5rIHByZWZpeGVzCisJICoJMikgQ29uZmlndXJlIHByZWZpeGVzIHdpdGggdGhlIGF1dG8gZmxhZyBzZXQKKwkgKi8KKworCS8qIEF2b2lkIGFyaXRobWV0aWMgb3ZlcmZsb3cuIFJlYWxseSwgd2UgY291bGQKKwkgICBzYXZlIHJ0X2V4cGlyZXMgaW4gc2Vjb25kcywgbGlrZWx5IHZhbGlkX2xmdCwKKwkgICBidXQgaXQgd291bGQgcmVxdWlyZSBkaXZpc2lvbiBpbiBmaWIgZ2MsIHRoYXQgaXQKKwkgICBub3QgZ29vZC4KKwkgKi8KKwlpZiAodmFsaWRfbGZ0ID49IDB4N0ZGRkZGRkYvSFopCisJCXJ0X2V4cGlyZXMgPSAwOworCWVsc2UKKwkJcnRfZXhwaXJlcyA9IGppZmZpZXMgKyB2YWxpZF9sZnQgKiBIWjsKKworCWlmIChwaW5mby0+b25saW5rKSB7CisJCXN0cnVjdCBydDZfaW5mbyAqcnQ7CisJCXJ0ID0gcnQ2X2xvb2t1cCgmcGluZm8tPnByZWZpeCwgTlVMTCwgZGV2LT5pZmluZGV4LCAxKTsKKworCQlpZiAocnQgJiYgKChydC0+cnQ2aV9mbGFncyAmIChSVEZfR0FURVdBWSB8IFJURl9ERUZBVUxUKSkgPT0gMCkpIHsKKwkJCWlmIChydC0+cnQ2aV9mbGFncyZSVEZfRVhQSVJFUykgeworCQkJCWlmICh2YWxpZF9sZnQgPT0gMCkgeworCQkJCQlpcDZfZGVsX3J0KHJ0LCBOVUxMLCBOVUxMKTsKKwkJCQkJcnQgPSBOVUxMOworCQkJCX0gZWxzZSB7CisJCQkJCXJ0LT5ydDZpX2V4cGlyZXMgPSBydF9leHBpcmVzOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmICh2YWxpZF9sZnQpIHsKKwkJCWFkZHJjb25mX3ByZWZpeF9yb3V0ZSgmcGluZm8tPnByZWZpeCwgcGluZm8tPnByZWZpeF9sZW4sCisJCQkJCSAgICAgIGRldiwgcnRfZXhwaXJlcywgUlRGX0FERFJDT05GfFJURl9FWFBJUkVTfFJURl9QUkVGSVhfUlQpOworCQl9CisJCWlmIChydCkKKwkJCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCX0KKworCS8qIFRyeSB0byBmaWd1cmUgb3V0IG91ciBsb2NhbCBhZGRyZXNzIGZvciB0aGlzIHByZWZpeCAqLworCisJaWYgKHBpbmZvLT5hdXRvY29uZiAmJiBpbjZfZGV2LT5jbmYuYXV0b2NvbmYpIHsKKwkJc3RydWN0IGluZXQ2X2lmYWRkciAqIGlmcDsKKwkJc3RydWN0IGluNl9hZGRyIGFkZHI7CisJCWludCBjcmVhdGUgPSAwLCB1cGRhdGVfbGZ0ID0gMDsKKworCQlpZiAocGluZm8tPnByZWZpeF9sZW4gPT0gNjQpIHsKKwkJCW1lbWNweSgmYWRkciwgJnBpbmZvLT5wcmVmaXgsIDgpOworCQkJaWYgKGlwdjZfZ2VuZXJhdGVfZXVpNjQoYWRkci5zNl9hZGRyICsgOCwgZGV2KSAmJgorCQkJICAgIGlwdjZfaW5oZXJpdF9ldWk2NChhZGRyLnM2X2FkZHIgKyA4LCBpbjZfZGV2KSkgeworCQkJCWluNl9kZXZfcHV0KGluNl9kZXYpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWdvdG8gb2s7CisJCX0KKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICJJUHY2IGFkZHJjb25mOiBwcmVmaXggd2l0aCB3cm9uZyBsZW5ndGggJWRcbiIsCisJCQkgICAgICAgcGluZm8tPnByZWZpeF9sZW4pOworCQlpbjZfZGV2X3B1dChpbjZfZGV2KTsKKwkJcmV0dXJuOworCitvazoKKworCQlpZnAgPSBpcHY2X2dldF9pZmFkZHIoJmFkZHIsIGRldiwgMSk7CisKKwkJaWYgKGlmcCA9PSBOVUxMICYmIHZhbGlkX2xmdCkgeworCQkJaW50IG1heF9hZGRyZXNzZXMgPSBpbjZfZGV2LT5jbmYubWF4X2FkZHJlc3NlczsKKworCQkJLyogRG8gbm90IGFsbG93IHRvIGNyZWF0ZSB0b28gbXVjaCBvZiBhdXRvY29uZmlndXJlZAorCQkJICogYWRkcmVzc2VzOyB0aGlzIHdvdWxkIGJlIHRvbyBlYXN5IHdheSB0byBjcmFzaCBrZXJuZWwuCisJCQkgKi8KKwkJCWlmICghbWF4X2FkZHJlc3NlcyB8fAorCQkJICAgIGlwdjZfY291bnRfYWRkcmVzc2VzKGluNl9kZXYpIDwgbWF4X2FkZHJlc3NlcykKKwkJCQlpZnAgPSBpcHY2X2FkZF9hZGRyKGluNl9kZXYsICZhZGRyLCBwaW5mby0+cHJlZml4X2xlbiwKKwkJCQkJCSAgICBhZGRyX3R5cGUmSVBWNl9BRERSX1NDT1BFX01BU0ssIDApOworCisJCQlpZiAoIWlmcCB8fCBJU19FUlIoaWZwKSkgeworCQkJCWluNl9kZXZfcHV0KGluNl9kZXYpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJdXBkYXRlX2xmdCA9IGNyZWF0ZSA9IDE7CisJCQlpZnAtPmNzdGFtcCA9IGppZmZpZXM7CisJCQlhZGRyY29uZl9kYWRfc3RhcnQoaWZwLCBSVEZfQUREUkNPTkZ8UlRGX1BSRUZJWF9SVCk7CisJCX0KKworCQlpZiAoaWZwKSB7CisJCQlpbnQgZmxhZ3M7CisJCQl1bnNpZ25lZCBsb25nIG5vdzsKKyNpZmRlZiBDT05GSUdfSVBWNl9QUklWQUNZCisJCQlzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnQ7CisjZW5kaWYKKwkJCXUzMiBzdG9yZWRfbGZ0OworCisJCQkvKiB1cGRhdGUgbGlmZXRpbWUgKFJGQzI0NjIgNS41LjMgZSkgKi8KKwkJCXNwaW5fbG9jaygmaWZwLT5sb2NrKTsKKwkJCW5vdyA9IGppZmZpZXM7CisJCQlpZiAoaWZwLT52YWxpZF9sZnQgPiAobm93IC0gaWZwLT50c3RhbXApIC8gSFopCisJCQkJc3RvcmVkX2xmdCA9IGlmcC0+dmFsaWRfbGZ0IC0gKG5vdyAtIGlmcC0+dHN0YW1wKSAvIEhaOworCQkJZWxzZQorCQkJCXN0b3JlZF9sZnQgPSAwOworCQkJaWYgKCF1cGRhdGVfbGZ0ICYmIHN0b3JlZF9sZnQpIHsKKwkJCQlpZiAodmFsaWRfbGZ0ID4gTUlOX1ZBTElEX0xJRkVUSU1FIHx8CisJCQkJICAgIHZhbGlkX2xmdCA+IHN0b3JlZF9sZnQpCisJCQkJCXVwZGF0ZV9sZnQgPSAxOworCQkJCWVsc2UgaWYgKHN0b3JlZF9sZnQgPD0gTUlOX1ZBTElEX0xJRkVUSU1FKSB7CisJCQkJCS8qIHZhbGlkX2xmdCA8PSBzdG9yZWRfbGZ0IGlzIGFsd2F5cyB0cnVlICovCisJCQkJCS8qIFhYWDogSVBzZWMgKi8KKwkJCQkJdXBkYXRlX2xmdCA9IDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJdmFsaWRfbGZ0ID0gTUlOX1ZBTElEX0xJRkVUSU1FOworCQkJCQlpZiAodmFsaWRfbGZ0IDwgcHJlZmVyZWRfbGZ0KQorCQkJCQkJcHJlZmVyZWRfbGZ0ID0gdmFsaWRfbGZ0OworCQkJCQl1cGRhdGVfbGZ0ID0gMTsKKwkJCQl9CisJCQl9CisKKwkJCWlmICh1cGRhdGVfbGZ0KSB7CisJCQkJaWZwLT52YWxpZF9sZnQgPSB2YWxpZF9sZnQ7CisJCQkJaWZwLT5wcmVmZXJlZF9sZnQgPSBwcmVmZXJlZF9sZnQ7CisJCQkJaWZwLT50c3RhbXAgPSBub3c7CisJCQkJZmxhZ3MgPSBpZnAtPmZsYWdzOworCQkJCWlmcC0+ZmxhZ3MgJj0gfklGQV9GX0RFUFJFQ0FURUQ7CisJCQkJc3Bpbl91bmxvY2soJmlmcC0+bG9jayk7CisKKwkJCQlpZiAoIShmbGFncyZJRkFfRl9URU5UQVRJVkUpKQorCQkJCQlpcHY2X2lmYV9ub3RpZnkoMCwgaWZwKTsKKwkJCX0gZWxzZQorCQkJCXNwaW5fdW5sb2NrKCZpZnAtPmxvY2spOworCisjaWZkZWYgQ09ORklHX0lQVjZfUFJJVkFDWQorCQkJcmVhZF9sb2NrX2JoKCZpbjZfZGV2LT5sb2NrKTsKKwkJCS8qIHVwZGF0ZSBhbGwgdGVtcG9yYXJ5IGFkZHJlc3NlcyBpbiB0aGUgbGlzdCAqLworCQkJZm9yIChpZnQ9aW42X2Rldi0+dGVtcGFkZHJfbGlzdDsgaWZ0OyBpZnQ9aWZ0LT50bXBfbmV4dCkgeworCQkJCS8qCisJCQkJICogV2hlbiBhZGp1c3RpbmcgdGhlIGxpZmV0aW1lcyBvZiBhbiBleGlzdGluZworCQkJCSAqIHRlbXBvcmFyeSBhZGRyZXNzLCBvbmx5IGxvd2VyIHRoZSBsaWZldGltZXMuCisJCQkJICogSW1wbGVtZW50YXRpb25zIG11c3Qgbm90IGluY3JlYXNlIHRoZQorCQkJCSAqIGxpZmV0aW1lcyBvZiBhbiBleGlzdGluZyB0ZW1wb3JhcnkgYWRkcmVzcworCQkJCSAqIHdoZW4gcHJvY2Vzc2luZyBhIFByZWZpeCBJbmZvcm1hdGlvbiBPcHRpb24uCisJCQkJICovCisJCQkJc3Bpbl9sb2NrKCZpZnQtPmxvY2spOworCQkJCWZsYWdzID0gaWZ0LT5mbGFnczsKKwkJCQlpZiAoaWZ0LT52YWxpZF9sZnQgPiB2YWxpZF9sZnQgJiYKKwkJCQkgICAgaWZ0LT52YWxpZF9sZnQgLSB2YWxpZF9sZnQgPiAoamlmZmllcyAtIGlmdC0+dHN0YW1wKSAvIEhaKQorCQkJCQlpZnQtPnZhbGlkX2xmdCA9IHZhbGlkX2xmdCArIChqaWZmaWVzIC0gaWZ0LT50c3RhbXApIC8gSFo7CisJCQkJaWYgKGlmdC0+cHJlZmVyZWRfbGZ0ID4gcHJlZmVyZWRfbGZ0ICYmCisJCQkJICAgIGlmdC0+cHJlZmVyZWRfbGZ0IC0gcHJlZmVyZWRfbGZ0ID4gKGppZmZpZXMgLSBpZnQtPnRzdGFtcCkgLyBIWikKKwkJCQkJaWZ0LT5wcmVmZXJlZF9sZnQgPSBwcmVmZXJlZF9sZnQgKyAoamlmZmllcyAtIGlmdC0+dHN0YW1wKSAvIEhaOworCQkJCXNwaW5fdW5sb2NrKCZpZnQtPmxvY2spOworCQkJCWlmICghKGZsYWdzJklGQV9GX1RFTlRBVElWRSkpCisJCQkJCWlwdjZfaWZhX25vdGlmeSgwLCBpZnQpOworCQkJfQorCisJCQlpZiAoY3JlYXRlICYmIGluNl9kZXYtPmNuZi51c2VfdGVtcGFkZHIgPiAwKSB7CisJCQkJLyoKKwkJCQkgKiBXaGVuIGEgbmV3IHB1YmxpYyBhZGRyZXNzIGlzIGNyZWF0ZWQgYXMgZGVzY3JpYmVkIGluIFtBRERSQ09ORl0sCisJCQkJICogYWxzbyBjcmVhdGUgYSBuZXcgdGVtcG9yYXJ5IGFkZHJlc3MuCisJCQkJICovCisJCQkJcmVhZF91bmxvY2tfYmgoJmluNl9kZXYtPmxvY2spOyAKKwkJCQlpcHY2X2NyZWF0ZV90ZW1wYWRkcihpZnAsIE5VTEwpOworCQkJfSBlbHNlIHsKKwkJCQlyZWFkX3VubG9ja19iaCgmaW42X2Rldi0+bG9jayk7CisJCQl9CisjZW5kaWYKKwkJCWluNl9pZmFfcHV0KGlmcCk7CisJCQlhZGRyY29uZl92ZXJpZnkoMCk7CisJCX0KKwl9CisJaW5ldDZfcHJlZml4X25vdGlmeShSVE1fTkVXUFJFRklYLCBpbjZfZGV2LCBwaW5mbyk7CisJaW42X2Rldl9wdXQoaW42X2Rldik7Cit9CisKKy8qCisgKglTZXQgZGVzdGluYXRpb24gYWRkcmVzcy4KKyAqCVNwZWNpYWwgY2FzZSBmb3IgU0lUIGludGVyZmFjZXMgd2hlcmUgd2UgY3JlYXRlIGEgbmV3ICJ2aXJ0dWFsIgorICoJZGV2aWNlLgorICovCitpbnQgYWRkcmNvbmZfc2V0X2RzdGFkZHIodm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgaW42X2lmcmVxIGlyZXE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworCXJ0bmxfbG9jaygpOworCisJZXJyID0gLUVGQVVMVDsKKwlpZiAoY29weV9mcm9tX3VzZXIoJmlyZXEsIGFyZywgc2l6ZW9mKHN0cnVjdCBpbjZfaWZyZXEpKSkKKwkJZ290byBlcnJfZXhpdDsKKworCWRldiA9IF9fZGV2X2dldF9ieV9pbmRleChpcmVxLmlmcjZfaWZpbmRleCk7CisKKwllcnIgPSAtRU5PREVWOworCWlmIChkZXYgPT0gTlVMTCkKKwkJZ290byBlcnJfZXhpdDsKKworCWlmIChkZXYtPnR5cGUgPT0gQVJQSFJEX1NJVCkgeworCQlzdHJ1Y3QgaWZyZXEgaWZyOworCQltbV9zZWdtZW50X3QJb2xkZnM7CisJCXN0cnVjdCBpcF90dW5uZWxfcGFybSBwOworCisJCWVyciA9IC1FQUREUk5PVEFWQUlMOworCQlpZiAoIShpcHY2X2FkZHJfdHlwZSgmaXJlcS5pZnI2X2FkZHIpICYgSVBWNl9BRERSX0NPTVBBVHY0KSkKKwkJCWdvdG8gZXJyX2V4aXQ7CisKKwkJbWVtc2V0KCZwLCAwLCBzaXplb2YocCkpOworCQlwLmlwaC5kYWRkciA9IGlyZXEuaWZyNl9hZGRyLnM2X2FkZHIzMlszXTsKKwkJcC5pcGguc2FkZHIgPSAwOworCQlwLmlwaC52ZXJzaW9uID0gNDsKKwkJcC5pcGguaWhsID0gNTsKKwkJcC5pcGgucHJvdG9jb2wgPSBJUFBST1RPX0lQVjY7CisJCXAuaXBoLnR0bCA9IDY0OworCQlpZnIuaWZyX2lmcnUuaWZydV9kYXRhID0gKHZvaWQgX191c2VyICopJnA7CisKKwkJb2xkZnMgPSBnZXRfZnMoKTsgc2V0X2ZzKEtFUk5FTF9EUyk7CisJCWVyciA9IGRldi0+ZG9faW9jdGwoZGV2LCAmaWZyLCBTSU9DQUREVFVOTkVMKTsKKwkJc2V0X2ZzKG9sZGZzKTsKKworCQlpZiAoZXJyID09IDApIHsKKwkJCWVyciA9IC1FTk9CVUZTOworCQkJaWYgKChkZXYgPSBfX2Rldl9nZXRfYnlfbmFtZShwLm5hbWUpKSA9PSBOVUxMKQorCQkJCWdvdG8gZXJyX2V4aXQ7CisJCQllcnIgPSBkZXZfb3BlbihkZXYpOworCQl9CisJfQorCitlcnJfZXhpdDoKKwlydG5sX3VubG9jaygpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKglNYW51YWwgY29uZmlndXJhdGlvbiBvZiBhZGRyZXNzIG9uIGFuIGludGVyZmFjZQorICovCitzdGF0aWMgaW50IGluZXQ2X2FkZHJfYWRkKGludCBpZmluZGV4LCBzdHJ1Y3QgaW42X2FkZHIgKnBmeCwgaW50IHBsZW4pCit7CisJc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwOworCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgc2NvcGU7CisKKwlBU1NFUlRfUlROTCgpOworCQorCWlmICgoZGV2ID0gX19kZXZfZ2V0X2J5X2luZGV4KGlmaW5kZXgpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkKKwlpZiAoIShkZXYtPmZsYWdzJklGRl9VUCkpCisJCXJldHVybiAtRU5FVERPV047CisKKwlpZiAoKGlkZXYgPSBhZGRyY29uZl9hZGRfZGV2KGRldikpID09IE5VTEwpCisJCXJldHVybiAtRU5PQlVGUzsKKworCXNjb3BlID0gaXB2Nl9hZGRyX3Njb3BlKHBmeCk7CisKKwlpZnAgPSBpcHY2X2FkZF9hZGRyKGlkZXYsIHBmeCwgcGxlbiwgc2NvcGUsIElGQV9GX1BFUk1BTkVOVCk7CisJaWYgKCFJU19FUlIoaWZwKSkgeworCQlhZGRyY29uZl9kYWRfc3RhcnQoaWZwLCAwKTsKKwkJaW42X2lmYV9wdXQoaWZwKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIFBUUl9FUlIoaWZwKTsKK30KKworc3RhdGljIGludCBpbmV0Nl9hZGRyX2RlbChpbnQgaWZpbmRleCwgc3RydWN0IGluNl9hZGRyICpwZngsIGludCBwbGVuKQoreworCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcDsKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJCisJaWYgKChkZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgoaWZpbmRleCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKChpZGV2ID0gX19pbjZfZGV2X2dldChkZXYpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOWElPOworCisJcmVhZF9sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwlmb3IgKGlmcCA9IGlkZXYtPmFkZHJfbGlzdDsgaWZwOyBpZnA9aWZwLT5pZl9uZXh0KSB7CisJCWlmIChpZnAtPnByZWZpeF9sZW4gPT0gcGxlbiAmJgorCQkgICAgaXB2Nl9hZGRyX2VxdWFsKHBmeCwgJmlmcC0+YWRkcikpIHsKKwkJCWluNl9pZmFfaG9sZChpZnApOworCQkJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOworCQkJCisJCQlpcHY2X2RlbF9hZGRyKGlmcCk7CisKKwkJCS8qIElmIHRoZSBsYXN0IGFkZHJlc3MgaXMgZGVsZXRlZCBhZG1pbmlzdHJhdGl2ZWx5LAorCQkJICAgZGlzYWJsZSBJUHY2IG9uIHRoaXMgaW50ZXJmYWNlLgorCQkJICovCisJCQlpZiAoaWRldi0+YWRkcl9saXN0ID09IE5VTEwpCisJCQkJYWRkcmNvbmZfaWZkb3duKGlkZXYtPmRldiwgMSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZWFkX3VubG9ja19iaCgmaWRldi0+bG9jayk7CisJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworfQorCisKK2ludCBhZGRyY29uZl9hZGRfaWZhZGRyKHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGluNl9pZnJlcSBpcmVxOworCWludCBlcnI7CisJCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCQorCWlmIChjb3B5X2Zyb21fdXNlcigmaXJlcSwgYXJnLCBzaXplb2Yoc3RydWN0IGluNl9pZnJlcSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJ0bmxfbG9jaygpOworCWVyciA9IGluZXQ2X2FkZHJfYWRkKGlyZXEuaWZyNl9pZmluZGV4LCAmaXJlcS5pZnI2X2FkZHIsIGlyZXEuaWZyNl9wcmVmaXhsZW4pOworCXJ0bmxfdW5sb2NrKCk7CisJcmV0dXJuIGVycjsKK30KKworaW50IGFkZHJjb25mX2RlbF9pZmFkZHIodm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgaW42X2lmcmVxIGlyZXE7CisJaW50IGVycjsKKwkKKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmlyZXEsIGFyZywgc2l6ZW9mKHN0cnVjdCBpbjZfaWZyZXEpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlydG5sX2xvY2soKTsKKwllcnIgPSBpbmV0Nl9hZGRyX2RlbChpcmVxLmlmcjZfaWZpbmRleCwgJmlyZXEuaWZyNl9hZGRyLCBpcmVxLmlmcjZfcHJlZml4bGVuKTsKKwlydG5sX3VubG9jaygpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHNpdF9hZGRfdjRfYWRkcnMoc3RydWN0IGluZXQ2X2RldiAqaWRldikKK3sKKwlzdHJ1Y3QgaW5ldDZfaWZhZGRyICogaWZwOworCXN0cnVjdCBpbjZfYWRkciBhZGRyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IHNjb3BlOworCisJQVNTRVJUX1JUTkwoKTsKKworCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCW1lbWNweSgmYWRkci5zNl9hZGRyMzJbM10sIGlkZXYtPmRldi0+ZGV2X2FkZHIsIDQpOworCisJaWYgKGlkZXYtPmRldi0+ZmxhZ3MmSUZGX1BPSU5UT1BPSU5UKSB7CisJCWFkZHIuczZfYWRkcjMyWzBdID0gaHRvbmwoMHhmZTgwMDAwMCk7CisJCXNjb3BlID0gSUZBX0xJTks7CisJfSBlbHNlIHsKKwkJc2NvcGUgPSBJUFY2X0FERFJfQ09NUEFUdjQ7CisJfQorCisJaWYgKGFkZHIuczZfYWRkcjMyWzNdKSB7CisJCWlmcCA9IGlwdjZfYWRkX2FkZHIoaWRldiwgJmFkZHIsIDEyOCwgc2NvcGUsIElGQV9GX1BFUk1BTkVOVCk7CisJCWlmICghSVNfRVJSKGlmcCkpIHsKKwkJCXNwaW5fbG9ja19iaCgmaWZwLT5sb2NrKTsKKwkJCWlmcC0+ZmxhZ3MgJj0gfklGQV9GX1RFTlRBVElWRTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZpZnAtPmxvY2spOworCQkJaXB2Nl9pZmFfbm90aWZ5KFJUTV9ORVdBRERSLCBpZnApOworCQkJaW42X2lmYV9wdXQoaWZwKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisgICAgICAgIGZvciAoZGV2ID0gZGV2X2Jhc2U7IGRldiAhPSBOVUxMOyBkZXYgPSBkZXYtPm5leHQpIHsKKwkJc3RydWN0IGluX2RldmljZSAqIGluX2RldiA9IF9faW5fZGV2X2dldChkZXYpOworCQlpZiAoaW5fZGV2ICYmIChkZXYtPmZsYWdzICYgSUZGX1VQKSkgeworCQkJc3RydWN0IGluX2lmYWRkciAqIGlmYTsKKworCQkJaW50IGZsYWcgPSBzY29wZTsKKworCQkJZm9yIChpZmEgPSBpbl9kZXYtPmlmYV9saXN0OyBpZmE7IGlmYSA9IGlmYS0+aWZhX25leHQpIHsKKwkJCQlpbnQgcGxlbjsKKworCQkJCWFkZHIuczZfYWRkcjMyWzNdID0gaWZhLT5pZmFfbG9jYWw7CisKKwkJCQlpZiAoaWZhLT5pZmFfc2NvcGUgPT0gUlRfU0NPUEVfTElOSykKKwkJCQkJY29udGludWU7CisJCQkJaWYgKGlmYS0+aWZhX3Njb3BlID49IFJUX1NDT1BFX0hPU1QpIHsKKwkJCQkJaWYgKGlkZXYtPmRldi0+ZmxhZ3MmSUZGX1BPSU5UT1BPSU5UKQorCQkJCQkJY29udGludWU7CisJCQkJCWZsYWcgfD0gSUZBX0hPU1Q7CisJCQkJfQorCQkJCWlmIChpZGV2LT5kZXYtPmZsYWdzJklGRl9QT0lOVE9QT0lOVCkKKwkJCQkJcGxlbiA9IDY0OworCQkJCWVsc2UKKwkJCQkJcGxlbiA9IDk2OworCisJCQkJaWZwID0gaXB2Nl9hZGRfYWRkcihpZGV2LCAmYWRkciwgcGxlbiwgZmxhZywKKwkJCQkJCSAgICBJRkFfRl9QRVJNQU5FTlQpOworCQkJCWlmICghSVNfRVJSKGlmcCkpIHsKKwkJCQkJc3Bpbl9sb2NrX2JoKCZpZnAtPmxvY2spOworCQkJCQlpZnAtPmZsYWdzICY9IH5JRkFfRl9URU5UQVRJVkU7CisJCQkJCXNwaW5fdW5sb2NrX2JoKCZpZnAtPmxvY2spOworCQkJCQlpcHY2X2lmYV9ub3RpZnkoUlRNX05FV0FERFIsIGlmcCk7CisJCQkJCWluNl9pZmFfcHV0KGlmcCk7CisJCQkJfQorCQkJfQorCQl9CisgICAgICAgIH0KK30KKworc3RhdGljIHZvaWQgaW5pdF9sb29wYmFjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpbmV0Nl9kZXYgICppZGV2OworCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKiBpZnA7CisKKwkvKiA6OjEgKi8KKworCUFTU0VSVF9SVE5MKCk7CisKKwlpZiAoKGlkZXYgPSBpcHY2X2ZpbmRfaWRldihkZXYpKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpbml0IGxvb3BiYWNrOiBhZGRfZGV2IGZhaWxlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZnAgPSBpcHY2X2FkZF9hZGRyKGlkZXYsICZpbjZhZGRyX2xvb3BiYWNrLCAxMjgsIElGQV9IT1NULCBJRkFfRl9QRVJNQU5FTlQpOworCWlmICghSVNfRVJSKGlmcCkpIHsKKwkJc3Bpbl9sb2NrX2JoKCZpZnAtPmxvY2spOworCQlpZnAtPmZsYWdzICY9IH5JRkFfRl9URU5UQVRJVkU7CisJCXNwaW5fdW5sb2NrX2JoKCZpZnAtPmxvY2spOworCQlpcHY2X2lmYV9ub3RpZnkoUlRNX05FV0FERFIsIGlmcCk7CisJCWluNl9pZmFfcHV0KGlmcCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhZGRyY29uZl9hZGRfbGlua2xvY2FsKHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYsIHN0cnVjdCBpbjZfYWRkciAqYWRkcikKK3sKKwlzdHJ1Y3QgaW5ldDZfaWZhZGRyICogaWZwOworCisJaWZwID0gaXB2Nl9hZGRfYWRkcihpZGV2LCBhZGRyLCA2NCwgSUZBX0xJTkssIElGQV9GX1BFUk1BTkVOVCk7CisJaWYgKCFJU19FUlIoaWZwKSkgeworCQlhZGRyY29uZl9kYWRfc3RhcnQoaWZwLCAwKTsKKwkJaW42X2lmYV9wdXQoaWZwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFkZHJjb25mX2Rldl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW42X2FkZHIgYWRkcjsKKwlzdHJ1Y3QgaW5ldDZfZGV2ICAgICogaWRldjsKKworCUFTU0VSVF9SVE5MKCk7CisKKwlpZiAoKGRldi0+dHlwZSAhPSBBUlBIUkRfRVRIRVIpICYmIAorCSAgICAoZGV2LT50eXBlICE9IEFSUEhSRF9GRERJKSAmJgorCSAgICAoZGV2LT50eXBlICE9IEFSUEhSRF9JRUVFODAyX1RSKSAmJgorCSAgICAoZGV2LT50eXBlICE9IEFSUEhSRF9BUkNORVQpICYmCisJICAgIChkZXYtPnR5cGUgIT0gQVJQSFJEX0lORklOSUJBTkQpKSB7CisJCS8qIEFsYXMsIHdlIHN1cHBvcnQgb25seSBFdGhlcm5ldCBhdXRvY29uZmlndXJhdGlvbi4gKi8KKwkJcmV0dXJuOworCX0KKworCWlkZXYgPSBhZGRyY29uZl9hZGRfZGV2KGRldik7CisJaWYgKGlkZXYgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisJYWRkci5zNl9hZGRyMzJbMF0gPSBodG9ubCgweEZFODAwMDAwKTsKKworCWlmIChpcHY2X2dlbmVyYXRlX2V1aTY0KGFkZHIuczZfYWRkciArIDgsIGRldikgPT0gMCkKKwkJYWRkcmNvbmZfYWRkX2xpbmtsb2NhbChpZGV2LCAmYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIGFkZHJjb25mX3NpdF9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OworCisJQVNTRVJUX1JUTkwoKTsKKworCS8qIAorCSAqIENvbmZpZ3VyZSB0aGUgdHVubmVsIHdpdGggb25lIG9mIG91ciBJUHY0IAorCSAqIGFkZHJlc3Nlcy4uLiB3ZSBzaG91bGQgY29uZmlndXJlIGFsbCBvZiAKKwkgKiBvdXIgdjQgYWRkcnMgaW4gdGhlIHR1bm5lbAorCSAqLworCisJaWYgKChpZGV2ID0gaXB2Nl9maW5kX2lkZXYoZGV2KSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaW5pdCBzaXQ6IGFkZF9kZXYgZmFpbGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXNpdF9hZGRfdjRfYWRkcnMoaWRldik7CisKKwlpZiAoZGV2LT5mbGFncyZJRkZfUE9JTlRPUE9JTlQpIHsKKwkJYWRkcmNvbmZfYWRkX21yb3V0ZShkZXYpOworCQlhZGRyY29uZl9hZGRfbHJvdXRlKGRldik7CisJfSBlbHNlCisJCXNpdF9yb3V0ZV9hZGQoZGV2KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lwdjZfaW5oZXJpdF9saW5rbG9jYWwoc3RydWN0IGluZXQ2X2RldiAqaWRldiwgc3RydWN0IG5ldF9kZXZpY2UgKmxpbmtfZGV2KQoreworCXN0cnVjdCBpbjZfYWRkciBsbGFkZHI7CisKKwlpZiAoIWlwdjZfZ2V0X2xsYWRkcihsaW5rX2RldiwgJmxsYWRkcikpIHsKKwkJYWRkcmNvbmZfYWRkX2xpbmtsb2NhbChpZGV2LCAmbGxhZGRyKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgaXA2X3RubF9hZGRfbGlua2xvY2FsKHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmxpbmtfZGV2OworCisJLyogZmlyc3QgdHJ5IHRvIGluaGVyaXQgdGhlIGxpbmstbG9jYWwgYWRkcmVzcyBmcm9tIHRoZSBsaW5rIGRldmljZSAqLworCWlmIChpZGV2LT5kZXYtPmlmbGluayAmJgorCSAgICAobGlua19kZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgoaWRldi0+ZGV2LT5pZmxpbmspKSkgeworCQlpZiAoIWlwdjZfaW5oZXJpdF9saW5rbG9jYWwoaWRldiwgbGlua19kZXYpKQorCQkJcmV0dXJuOworCX0KKwkvKiB0aGVuIHRyeSB0byBpbmhlcml0IGl0IGZyb20gYW55IGRldmljZSAqLworCWZvciAobGlua19kZXYgPSBkZXZfYmFzZTsgbGlua19kZXY7IGxpbmtfZGV2ID0gbGlua19kZXYtPm5leHQpIHsKKwkJaWYgKCFpcHY2X2luaGVyaXRfbGlua2xvY2FsKGlkZXYsIGxpbmtfZGV2KSkKKwkJCXJldHVybjsKKwl9CisJcHJpbnRrKEtFUk5fREVCVUcgImluaXQgaXA2LWlwNjogYWRkX2xpbmtsb2NhbCBmYWlsZWRcbiIpOworfQorCisvKgorICogQXV0b2NvbmZpZ3VyZSB0dW5uZWwgd2l0aCBhIGxpbmstbG9jYWwgYWRkcmVzcyBzbyByb3V0aW5nIHByb3RvY29scywKKyAqIERIQ1B2NiwgTUxEIGV0Yy4gY2FuIGJlIHJ1biBvdmVyIHRoZSB2aXJ0dWFsIGxpbmsKKyAqLworCitzdGF0aWMgdm9pZCBhZGRyY29uZl9pcDZfdG5sX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CisKKwlBU1NFUlRfUlROTCgpOworCisJaWYgKChpZGV2ID0gYWRkcmNvbmZfYWRkX2RldihkZXYpKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpbml0IGlwNi1pcDY6IGFkZF9kZXYgZmFpbGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpcDZfdG5sX2FkZF9saW5rbG9jYWwoaWRldik7CisJYWRkcmNvbmZfYWRkX21yb3V0ZShkZXYpOworfQorCitzdGF0aWMgaW50IGFkZHJjb25mX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIAorCQkJICAgdm9pZCAqIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkYXRhOworCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBfX2luNl9kZXZfZ2V0KGRldik7CisKKwlzd2l0Y2goZXZlbnQpIHsKKwljYXNlIE5FVERFVl9VUDoKKwkJc3dpdGNoKGRldi0+dHlwZSkgeworCQljYXNlIEFSUEhSRF9TSVQ6CisJCQlhZGRyY29uZl9zaXRfY29uZmlnKGRldik7CisJCQlicmVhazsKKwkJY2FzZSBBUlBIUkRfVFVOTkVMNjoKKwkJCWFkZHJjb25mX2lwNl90bmxfY29uZmlnKGRldik7CisJCQlicmVhazsKKwkJY2FzZSBBUlBIUkRfTE9PUEJBQ0s6CisJCQlpbml0X2xvb3BiYWNrKGRldik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYWRkcmNvbmZfZGV2X2NvbmZpZyhkZXYpOworCQkJYnJlYWs7CisJCX07CisJCWlmIChpZGV2KSB7CisJCQkvKiBJZiB0aGUgTVRVIGNoYW5nZWQgZHVyaW5nIHRoZSBpbnRlcmZhY2UgZG93biwgd2hlbiB0aGUKKwkJCSAgIGludGVyZmFjZSB1cCwgdGhlIGNoYW5nZWQgTVRVIG11c3QgYmUgcmVmbGVjdGVkIGluIHRoZQorCQkJICAgaWRldiBhcyB3ZWxsIGFzIHJvdXRlcnMuCisJCQkgKi8KKwkJCWlmIChpZGV2LT5jbmYubXR1NiAhPSBkZXYtPm10dSAmJiBkZXYtPm10dSA+PSBJUFY2X01JTl9NVFUpIHsKKwkJCQlydDZfbXR1X2NoYW5nZShkZXYsIGRldi0+bXR1KTsKKwkJCQlpZGV2LT5jbmYubXR1NiA9IGRldi0+bXR1OworCQkJfQorCQkJaWRldi0+dHN0YW1wID0gamlmZmllczsKKwkJCWluZXQ2X2lmaW5mb19ub3RpZnkoUlRNX05FV0xJTkssIGlkZXYpOworCQkJLyogSWYgdGhlIGNoYW5nZWQgbXR1IGR1cmluZyBkb3duIGlzIGxvd2VyIHRoYW4gSVBWNl9NSU5fTVRVCisJCQkgICBzdG9wIElQdjYgb24gdGhpcyBpbnRlcmZhY2UuCisJCQkgKi8KKwkJCWlmIChkZXYtPm10dSA8IElQVjZfTUlOX01UVSkKKwkJCQlhZGRyY29uZl9pZmRvd24oZGV2LCBldmVudCAhPSBORVRERVZfRE9XTik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE5FVERFVl9DSEFOR0VNVFU6CisJCWlmICggaWRldiAmJiBkZXYtPm10dSA+PSBJUFY2X01JTl9NVFUpIHsKKwkJCXJ0Nl9tdHVfY2hhbmdlKGRldiwgZGV2LT5tdHUpOworCQkJaWRldi0+Y25mLm10dTYgPSBkZXYtPm10dTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogTVRVIGZhbGxlZCB1bmRlciBJUFY2X01JTl9NVFUuIFN0b3AgSVB2NiBvbiB0aGlzIGludGVyZmFjZS4gKi8KKworCWNhc2UgTkVUREVWX0RPV046CisJY2FzZSBORVRERVZfVU5SRUdJU1RFUjoKKwkJLyoKKwkJICoJUmVtb3ZlIGFsbCBhZGRyZXNzZXMgZnJvbSB0aGlzIGludGVyZmFjZS4KKwkJICovCisJCWFkZHJjb25mX2lmZG93bihkZXYsIGV2ZW50ICE9IE5FVERFVl9ET1dOKTsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfQ0hBTkdFOgorCQlicmVhazsKKwljYXNlIE5FVERFVl9DSEFOR0VOQU1FOgorI2lmZGVmIENPTkZJR19TWVNDVEwKKwkJaWYgKGlkZXYpIHsKKwkJCWFkZHJjb25mX3N5c2N0bF91bnJlZ2lzdGVyKCZpZGV2LT5jbmYpOworCQkJbmVpZ2hfc3lzY3RsX3VucmVnaXN0ZXIoaWRldi0+bmRfcGFybXMpOworCQkJbmVpZ2hfc3lzY3RsX3JlZ2lzdGVyKGRldiwgaWRldi0+bmRfcGFybXMsCisJCQkJCSAgICAgIE5FVF9JUFY2LCBORVRfSVBWNl9ORUlHSCwgImlwdjYiLAorCQkJCQkgICAgICAmbmRpc2NfaWZpbmZvX3N5c2N0bF9jaGFuZ2UsCisJCQkJCSAgICAgIE5VTEwpOworCQkJYWRkcmNvbmZfc3lzY3RsX3JlZ2lzdGVyKGlkZXYsICZpZGV2LT5jbmYpOworCQl9CisjZW5kaWYKKwkJYnJlYWs7CisJfTsKKworCXJldHVybiBOT1RJRllfT0s7Cit9CisKKy8qCisgKglhZGRyY29uZiBtb2R1bGUgc2hvdWxkIGJlIG5vdGlmaWVkIG9mIGEgZGV2aWNlIGdvaW5nIHVwCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaXB2Nl9kZXZfbm90ZiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGFkZHJjb25mX25vdGlmeSwKKwkucHJpb3JpdHkgPSAwCit9OworCitzdGF0aWMgaW50IGFkZHJjb25mX2lmZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaG93KQoreworCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CisJc3RydWN0IGluZXQ2X2lmYWRkciAqaWZhLCAqKmJpZmE7CisJaW50IGk7CisKKwlBU1NFUlRfUlROTCgpOworCisJaWYgKGRldiA9PSAmbG9vcGJhY2tfZGV2ICYmIGhvdyA9PSAxKQorCQlob3cgPSAwOworCisJcnQ2X2lmZG93bihkZXYpOworCW5laWdoX2lmZG93bigmbmRfdGJsLCBkZXYpOworCisJaWRldiA9IF9faW42X2Rldl9nZXQoZGV2KTsKKwlpZiAoaWRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIFN0ZXAgMTogcmVtb3ZlIHJlZmVyZW5jZSB0byBpcHY2IGRldmljZSBmcm9tIHBhcmVudCBkZXZpY2UuCisJICAgICAgICAgICBEbyBub3QgZGV2X3B1dCEKKwkgKi8KKwlpZiAoaG93ID09IDEpIHsKKwkJd3JpdGVfbG9ja19iaCgmYWRkcmNvbmZfbG9jayk7CisJCWRldi0+aXA2X3B0ciA9IE5VTEw7CisJCWlkZXYtPmRlYWQgPSAxOworCQl3cml0ZV91bmxvY2tfYmgoJmFkZHJjb25mX2xvY2spOworCisJCS8qIFN0ZXAgMS41OiByZW1vdmUgc25tcDYgZW50cnkgKi8KKwkJc25tcDZfdW5yZWdpc3Rlcl9kZXYoaWRldik7CisKKwl9CisKKwkvKiBTdGVwIDI6IGNsZWFyIGhhc2ggdGFibGUgKi8KKwlmb3IgKGk9MDsgaTxJTjZfQUREUl9IU0laRTsgaSsrKSB7CisJCWJpZmEgPSAmaW5ldDZfYWRkcl9sc3RbaV07CisKKwkJd3JpdGVfbG9ja19iaCgmYWRkcmNvbmZfaGFzaF9sb2NrKTsKKwkJd2hpbGUgKChpZmEgPSAqYmlmYSkgIT0gTlVMTCkgeworCQkJaWYgKGlmYS0+aWRldiA9PSBpZGV2KSB7CisJCQkJKmJpZmEgPSBpZmEtPmxzdF9uZXh0OworCQkJCWlmYS0+bHN0X25leHQgPSBOVUxMOworCQkJCWFkZHJjb25mX2RlbF90aW1lcihpZmEpOworCQkJCWluNl9pZmFfcHV0KGlmYSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQliaWZhID0gJmlmYS0+bHN0X25leHQ7CisJCX0KKwkJd3JpdGVfdW5sb2NrX2JoKCZhZGRyY29uZl9oYXNoX2xvY2spOworCX0KKworCXdyaXRlX2xvY2tfYmgoJmlkZXYtPmxvY2spOworCisJLyogU3RlcCAzOiBjbGVhciBmbGFncyBmb3Igc3RhdGVsZXNzIGFkZHJjb25mICovCisJaWYgKGhvdyAhPSAxKQorCQlpZGV2LT5pZl9mbGFncyAmPSB+KElGX1JTX1NFTlR8SUZfUkFfUkNWRCk7CisKKwkvKiBTdGVwIDQ6IGNsZWFyIGFkZHJlc3MgbGlzdCAqLworI2lmZGVmIENPTkZJR19JUFY2X1BSSVZBQ1kKKwlpZiAoaG93ID09IDEgJiYgZGVsX3RpbWVyKCZpZGV2LT5yZWdlbl90aW1lcikpCisJCWluNl9kZXZfcHV0KGlkZXYpOworCisJLyogY2xlYXIgdGVtcGFkZHIgbGlzdCAqLworCXdoaWxlICgoaWZhID0gaWRldi0+dGVtcGFkZHJfbGlzdCkgIT0gTlVMTCkgeworCQlpZGV2LT50ZW1wYWRkcl9saXN0ID0gaWZhLT50bXBfbmV4dDsKKwkJaWZhLT50bXBfbmV4dCA9IE5VTEw7CisJCWlmYS0+ZGVhZCA9IDE7CisJCXdyaXRlX3VubG9ja19iaCgmaWRldi0+bG9jayk7CisJCXNwaW5fbG9ja19iaCgmaWZhLT5sb2NrKTsKKworCQlpZiAoaWZhLT5pZnB1YikgeworCQkJaW42X2lmYV9wdXQoaWZhLT5pZnB1Yik7CisJCQlpZmEtPmlmcHViID0gTlVMTDsKKwkJfQorCQlzcGluX3VubG9ja19iaCgmaWZhLT5sb2NrKTsKKwkJaW42X2lmYV9wdXQoaWZhKTsKKwkJd3JpdGVfbG9ja19iaCgmaWRldi0+bG9jayk7CisJfQorI2VuZGlmCisJd2hpbGUgKChpZmEgPSBpZGV2LT5hZGRyX2xpc3QpICE9IE5VTEwpIHsKKwkJaWRldi0+YWRkcl9saXN0ID0gaWZhLT5pZl9uZXh0OworCQlpZmEtPmlmX25leHQgPSBOVUxMOworCQlpZmEtPmRlYWQgPSAxOworCQlhZGRyY29uZl9kZWxfdGltZXIoaWZhKTsKKwkJd3JpdGVfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKworCQlfX2lwdjZfaWZhX25vdGlmeShSVE1fREVMQUREUiwgaWZhKTsKKwkJaW42X2lmYV9wdXQoaWZhKTsKKworCQl3cml0ZV9sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKworCS8qIFN0ZXAgNTogRGlzY2FyZCBtdWx0aWNhc3QgbGlzdCAqLworCisJaWYgKGhvdyA9PSAxKQorCQlpcHY2X21jX2Rlc3Ryb3lfZGV2KGlkZXYpOworCWVsc2UKKwkJaXB2Nl9tY19kb3duKGlkZXYpOworCisJLyogU3RlcCA1OiBuZXRsaW5rIG5vdGlmaWNhdGlvbiBvZiB0aGlzIGludGVyZmFjZSAqLworCWlkZXYtPnRzdGFtcCA9IGppZmZpZXM7CisJaW5ldDZfaWZpbmZvX25vdGlmeShSVE1fTkVXTElOSywgaWRldik7CisJCisJLyogU2hvdCB0aGUgZGV2aWNlIChpZiB1bnJlZ2lzdGVyZWQpICovCisKKwlpZiAoaG93ID09IDEpIHsKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJCWFkZHJjb25mX3N5c2N0bF91bnJlZ2lzdGVyKCZpZGV2LT5jbmYpOworCQluZWlnaF9zeXNjdGxfdW5yZWdpc3RlcihpZGV2LT5uZF9wYXJtcyk7CisjZW5kaWYKKwkJbmVpZ2hfcGFybXNfcmVsZWFzZSgmbmRfdGJsLCBpZGV2LT5uZF9wYXJtcyk7CisJCW5laWdoX2lmZG93bigmbmRfdGJsLCBkZXYpOworCQlpbjZfZGV2X3B1dChpZGV2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFkZHJjb25mX3JzX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnAgPSAoc3RydWN0IGluZXQ2X2lmYWRkciAqKSBkYXRhOworCisJaWYgKGlmcC0+aWRldi0+Y25mLmZvcndhcmRpbmcpCisJCWdvdG8gb3V0OworCisJaWYgKGlmcC0+aWRldi0+aWZfZmxhZ3MgJiBJRl9SQV9SQ1ZEKSB7CisJCS8qCisJCSAqCUFubm91bmNlbWVudCByZWNlaXZlZCBhZnRlciBzb2xpY2l0YXRpb24KKwkJICoJd2FzIHNlbnQKKwkJICovCisJCWdvdG8gb3V0OworCX0KKworCXNwaW5fbG9jaygmaWZwLT5sb2NrKTsKKwlpZiAoaWZwLT5wcm9iZXMrKyA8IGlmcC0+aWRldi0+Y25mLnJ0cl9zb2xpY2l0cykgeworCQlzdHJ1Y3QgaW42X2FkZHIgYWxsX3JvdXRlcnM7CisKKwkJLyogVGhlIHdhaXQgYWZ0ZXIgdGhlIGxhc3QgcHJvYmUgY2FuIGJlIHNob3J0ZXIgKi8KKwkJYWRkcmNvbmZfbW9kX3RpbWVyKGlmcCwgQUNfUlMsCisJCQkJICAgKGlmcC0+cHJvYmVzID09IGlmcC0+aWRldi0+Y25mLnJ0cl9zb2xpY2l0cykgPworCQkJCSAgIGlmcC0+aWRldi0+Y25mLnJ0cl9zb2xpY2l0X2RlbGF5IDoKKwkJCQkgICBpZnAtPmlkZXYtPmNuZi5ydHJfc29saWNpdF9pbnRlcnZhbCk7CisJCXNwaW5fdW5sb2NrKCZpZnAtPmxvY2spOworCisJCWlwdjZfYWRkcl9hbGxfcm91dGVycygmYWxsX3JvdXRlcnMpOworCisJCW5kaXNjX3NlbmRfcnMoaWZwLT5pZGV2LT5kZXYsICZpZnAtPmFkZHIsICZhbGxfcm91dGVycyk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2soJmlmcC0+bG9jayk7CisJCS8qCisJCSAqIE5vdGU6IHdlIGRvIG5vdCBzdXBwb3J0IGRlcHJlY2F0ZWQgImFsbCBvbi1saW5rIgorCQkgKiBhc3N1bXB0aW9uIGFueSBsb25nZXIuCisJCSAqLworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG5vIElQdjYgcm91dGVycyBwcmVzZW50XG4iLAorCQkgICAgICAgaWZwLT5pZGV2LT5kZXYtPm5hbWUpOworCX0KKworb3V0OgorCWluNl9pZmFfcHV0KGlmcCk7Cit9CisKKy8qCisgKglEdXBsaWNhdGUgQWRkcmVzcyBEZXRlY3Rpb24KKyAqLworc3RhdGljIHZvaWQgYWRkcmNvbmZfZGFkX3N0YXJ0KHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBpZnAtPmlkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGlkZXYtPmRldjsKKwl1bnNpZ25lZCBsb25nIHJhbmRfbnVtOworCisJYWRkcmNvbmZfam9pbl9zb2xpY3QoZGV2LCAmaWZwLT5hZGRyKTsKKworCWlmIChpZnAtPnByZWZpeF9sZW4gIT0gMTI4ICYmIChpZnAtPmZsYWdzJklGQV9GX1BFUk1BTkVOVCkpCisJCWFkZHJjb25mX3ByZWZpeF9yb3V0ZSgmaWZwLT5hZGRyLCBpZnAtPnByZWZpeF9sZW4sIGRldiwgMCwKKwkJCQkJZmxhZ3MpOworCisJbmV0X3NyYW5kb20oaWZwLT5hZGRyLnM2X2FkZHIzMlszXSk7CisJcmFuZF9udW0gPSBuZXRfcmFuZG9tKCkgJSAoaWRldi0+Y25mLnJ0cl9zb2xpY2l0X2RlbGF5ID8gOiAxKTsKKworCXJlYWRfbG9ja19iaCgmaWRldi0+bG9jayk7CisJaWYgKGlmcC0+ZGVhZCkKKwkJZ290byBvdXQ7CisJc3Bpbl9sb2NrX2JoKCZpZnAtPmxvY2spOworCisJaWYgKGRldi0+ZmxhZ3MmKElGRl9OT0FSUHxJRkZfTE9PUEJBQ0spIHx8CisJICAgICEoaWZwLT5mbGFncyZJRkFfRl9URU5UQVRJVkUpKSB7CisJCWlmcC0+ZmxhZ3MgJj0gfklGQV9GX1RFTlRBVElWRTsKKwkJc3Bpbl91bmxvY2tfYmgoJmlmcC0+bG9jayk7CisJCXJlYWRfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKworCQlhZGRyY29uZl9kYWRfY29tcGxldGVkKGlmcCk7CisJCXJldHVybjsKKwl9CisKKwlpZnAtPnByb2JlcyA9IGlkZXYtPmNuZi5kYWRfdHJhbnNtaXRzOworCWFkZHJjb25mX21vZF90aW1lcihpZnAsIEFDX0RBRCwgcmFuZF9udW0pOworCisJc3Bpbl91bmxvY2tfYmgoJmlmcC0+bG9jayk7CitvdXQ6CisJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBhZGRyY29uZl9kYWRfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCA9IChzdHJ1Y3QgaW5ldDZfaWZhZGRyICopIGRhdGE7CisJc3RydWN0IGluZXQ2X2RldiAqaWRldiA9IGlmcC0+aWRldjsKKwlzdHJ1Y3QgaW42X2FkZHIgdW5zcGVjOworCXN0cnVjdCBpbjZfYWRkciBtY2FkZHI7CisKKwlyZWFkX2xvY2tfYmgoJmlkZXYtPmxvY2spOworCWlmIChpZGV2LT5kZWFkKSB7CisJCXJlYWRfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwkJZ290byBvdXQ7CisJfQorCXNwaW5fbG9ja19iaCgmaWZwLT5sb2NrKTsKKwlpZiAoaWZwLT5wcm9iZXMgPT0gMCkgeworCQkvKgorCQkgKiBEQUQgd2FzIHN1Y2Nlc3NmdWwKKwkJICovCisKKwkJaWZwLT5mbGFncyAmPSB+SUZBX0ZfVEVOVEFUSVZFOworCQlzcGluX3VubG9ja19iaCgmaWZwLT5sb2NrKTsKKwkJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOworCisJCWFkZHJjb25mX2RhZF9jb21wbGV0ZWQoaWZwKTsKKworCQlnb3RvIG91dDsKKwl9CisKKwlpZnAtPnByb2Jlcy0tOworCWFkZHJjb25mX21vZF90aW1lcihpZnAsIEFDX0RBRCwgaWZwLT5pZGV2LT5uZF9wYXJtcy0+cmV0cmFuc190aW1lKTsKKwlzcGluX3VubG9ja19iaCgmaWZwLT5sb2NrKTsKKwlyZWFkX3VubG9ja19iaCgmaWRldi0+bG9jayk7CisKKwkvKiBzZW5kIGEgbmVpZ2hib3VyIHNvbGljaXRhdGlvbiBmb3Igb3VyIGFkZHIgKi8KKwltZW1zZXQoJnVuc3BlYywgMCwgc2l6ZW9mKHVuc3BlYykpOworCWFkZHJjb25mX2FkZHJfc29saWN0X211bHQoJmlmcC0+YWRkciwgJm1jYWRkcik7CisJbmRpc2Nfc2VuZF9ucyhpZnAtPmlkZXYtPmRldiwgTlVMTCwgJmlmcC0+YWRkciwgJm1jYWRkciwgJnVuc3BlYyk7CitvdXQ6CisJaW42X2lmYV9wdXQoaWZwKTsKK30KKworc3RhdGljIHZvaWQgYWRkcmNvbmZfZGFkX2NvbXBsZXRlZChzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKglkZXYgPSBpZnAtPmlkZXYtPmRldjsKKworCS8qCisJICoJQ29uZmlndXJlIHRoZSBhZGRyZXNzIGZvciByZWNlcHRpb24uIE5vdyBpdCBpcyB2YWxpZC4KKwkgKi8KKworCWlwdjZfaWZhX25vdGlmeShSVE1fTkVXQUREUiwgaWZwKTsKKworCS8qIElmIGFkZGVkIHByZWZpeCBpcyBsaW5rIGxvY2FsIGFuZCBmb3J3YXJkaW5nIGlzIG9mZiwKKwkgICBzdGFydCBzZW5kaW5nIHJvdXRlciBzb2xpY2l0YXRpb25zLgorCSAqLworCisJaWYgKGlmcC0+aWRldi0+Y25mLmZvcndhcmRpbmcgPT0gMCAmJgorCSAgICBpZnAtPmlkZXYtPmNuZi5ydHJfc29saWNpdHMgPiAwICYmCisJICAgIChkZXYtPmZsYWdzJklGRl9MT09QQkFDSykgPT0gMCAmJgorCSAgICAoaXB2Nl9hZGRyX3R5cGUoJmlmcC0+YWRkcikgJiBJUFY2X0FERFJfTElOS0xPQ0FMKSkgeworCQlzdHJ1Y3QgaW42X2FkZHIgYWxsX3JvdXRlcnM7CisKKwkJaXB2Nl9hZGRyX2FsbF9yb3V0ZXJzKCZhbGxfcm91dGVycyk7CisKKwkJLyoKKwkJICoJSWYgYSBob3N0IGFzIGFscmVhZHkgcGVyZm9ybWVkIGEgcmFuZG9tIGRlbGF5CisJCSAqCVsuLi5dIGFzIHBhcnQgb2YgREFEIFsuLi5dIHRoZXJlIGlzIG5vIG5lZWQKKwkJICoJdG8gZGVsYXkgYWdhaW4gYmVmb3JlIHNlbmRpbmcgdGhlIGZpcnN0IFJTCisJCSAqLworCQluZGlzY19zZW5kX3JzKGlmcC0+aWRldi0+ZGV2LCAmaWZwLT5hZGRyLCAmYWxsX3JvdXRlcnMpOworCisJCXNwaW5fbG9ja19iaCgmaWZwLT5sb2NrKTsKKwkJaWZwLT5wcm9iZXMgPSAxOworCQlpZnAtPmlkZXYtPmlmX2ZsYWdzIHw9IElGX1JTX1NFTlQ7CisJCWFkZHJjb25mX21vZF90aW1lcihpZnAsIEFDX1JTLCBpZnAtPmlkZXYtPmNuZi5ydHJfc29saWNpdF9pbnRlcnZhbCk7CisJCXNwaW5fdW5sb2NrX2JoKCZpZnAtPmxvY2spOworCX0KK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdHJ1Y3QgaWY2X2l0ZXJfc3RhdGUgeworCWludCBidWNrZXQ7Cit9OworCitzdGF0aWMgc3RydWN0IGluZXQ2X2lmYWRkciAqaWY2X2dldF9maXJzdChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwlzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZmEgPSBOVUxMOworCXN0cnVjdCBpZjZfaXRlcl9zdGF0ZSAqc3RhdGUgPSBzZXEtPnByaXZhdGU7CisKKwlmb3IgKHN0YXRlLT5idWNrZXQgPSAwOyBzdGF0ZS0+YnVja2V0IDwgSU42X0FERFJfSFNJWkU7ICsrc3RhdGUtPmJ1Y2tldCkgeworCQlpZmEgPSBpbmV0Nl9hZGRyX2xzdFtzdGF0ZS0+YnVja2V0XTsKKwkJaWYgKGlmYSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gaWZhOworfQorCitzdGF0aWMgc3RydWN0IGluZXQ2X2lmYWRkciAqaWY2X2dldF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZmEpCit7CisJc3RydWN0IGlmNl9pdGVyX3N0YXRlICpzdGF0ZSA9IHNlcS0+cHJpdmF0ZTsKKworCWlmYSA9IGlmYS0+bHN0X25leHQ7Cit0cnlfYWdhaW46CisJaWYgKCFpZmEgJiYgKytzdGF0ZS0+YnVja2V0IDwgSU42X0FERFJfSFNJWkUpIHsKKwkJaWZhID0gaW5ldDZfYWRkcl9sc3Rbc3RhdGUtPmJ1Y2tldF07CisJCWdvdG8gdHJ5X2FnYWluOworCX0KKwlyZXR1cm4gaWZhOworfQorCitzdGF0aWMgc3RydWN0IGluZXQ2X2lmYWRkciAqaWY2X2dldF9pZHgoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCBwb3MpCit7CisJc3RydWN0IGluZXQ2X2lmYWRkciAqaWZhID0gaWY2X2dldF9maXJzdChzZXEpOworCisJaWYgKGlmYSkKKwkJd2hpbGUocG9zICYmIChpZmEgPSBpZjZfZ2V0X25leHQoc2VxLCBpZmEpKSAhPSBOVUxMKQorCQkJLS1wb3M7CisJcmV0dXJuIHBvcyA/IE5VTEwgOiBpZmE7Cit9CisKK3N0YXRpYyB2b2lkICppZjZfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlyZWFkX2xvY2tfYmgoJmFkZHJjb25mX2hhc2hfbG9jayk7CisJcmV0dXJuIGlmNl9nZXRfaWR4KHNlcSwgKnBvcyk7Cit9CisKK3N0YXRpYyB2b2lkICppZjZfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmYTsKKworCWlmYSA9IGlmNl9nZXRfbmV4dChzZXEsIHYpOworCSsrKnBvczsKKwlyZXR1cm4gaWZhOworfQorCitzdGF0aWMgdm9pZCBpZjZfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJcmVhZF91bmxvY2tfYmgoJmFkZHJjb25mX2hhc2hfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgaWY2X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCA9IChzdHJ1Y3QgaW5ldDZfaWZhZGRyICopdjsKKwlzZXFfcHJpbnRmKHNlcSwKKwkJICAgIiUwNHglMDR4JTA0eCUwNHglMDR4JTA0eCUwNHglMDR4ICUwMnggJTAyeCAlMDJ4ICUwMnggJThzXG4iLAorCQkgICBOSVA2KGlmcC0+YWRkciksCisJCSAgIGlmcC0+aWRldi0+ZGV2LT5pZmluZGV4LAorCQkgICBpZnAtPnByZWZpeF9sZW4sCisJCSAgIGlmcC0+c2NvcGUsCisJCSAgIGlmcC0+ZmxhZ3MsCisJCSAgIGlmcC0+aWRldi0+ZGV2LT5uYW1lKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBpZjZfc2VxX29wcyA9IHsKKwkuc3RhcnQJPSBpZjZfc2VxX3N0YXJ0LAorCS5uZXh0CT0gaWY2X3NlcV9uZXh0LAorCS5zaG93CT0gaWY2X3NlcV9zaG93LAorCS5zdG9wCT0gaWY2X3NlcV9zdG9wLAorfTsKKworc3RhdGljIGludCBpZjZfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNlcV9maWxlICpzZXE7CisJaW50IHJjID0gLUVOT01FTTsKKwlzdHJ1Y3QgaWY2X2l0ZXJfc3RhdGUgKnMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOworCisJaWYgKCFzKQorCQlnb3RvIG91dDsKKwltZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7CisKKwlyYyA9IHNlcV9vcGVuKGZpbGUsICZpZjZfc2VxX29wcyk7CisJaWYgKHJjKQorCQlnb3RvIG91dF9rZnJlZTsKKworCXNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzZXEtPnByaXZhdGUgPSBzOworb3V0OgorCXJldHVybiByYzsKK291dF9rZnJlZToKKwlrZnJlZShzKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaWY2X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IGlmNl9zZXFfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlX3ByaXZhdGUsCit9OworCitpbnQgX19pbml0IGlmNl9wcm9jX2luaXQodm9pZCkKK3sKKwlpZiAoIXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJpZl9pbmV0NiIsIFNfSVJVR08sICZpZjZfZm9wcykpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCit2b2lkIGlmNl9wcm9jX2V4aXQodm9pZCkKK3sKKwlwcm9jX25ldF9yZW1vdmUoImlmX2luZXQ2Iik7Cit9CisjZW5kaWYJLyogQ09ORklHX1BST0NfRlMgKi8KKworLyoKKyAqCVBlcmlvZGljIGFkZHJlc3Mgc3RhdHVzIHZlcmlmaWNhdGlvbgorICovCisKK3N0YXRpYyB2b2lkIGFkZHJjb25mX3ZlcmlmeSh1bnNpZ25lZCBsb25nIGZvbykKK3sKKwlzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnA7CisJdW5zaWduZWQgbG9uZyBub3csIG5leHQ7CisJaW50IGk7CisKKwlzcGluX2xvY2tfYmgoJmFkZHJjb25mX3ZlcmlmeV9sb2NrKTsKKwlub3cgPSBqaWZmaWVzOworCW5leHQgPSBub3cgKyBBRERSX0NIRUNLX0ZSRVFVRU5DWTsKKworCWRlbF90aW1lcigmYWRkcl9jaGtfdGltZXIpOworCisJZm9yIChpPTA7IGkgPCBJTjZfQUREUl9IU0laRTsgaSsrKSB7CisKK3Jlc3RhcnQ6CisJCXdyaXRlX2xvY2soJmFkZHJjb25mX2hhc2hfbG9jayk7CisJCWZvciAoaWZwPWluZXQ2X2FkZHJfbHN0W2ldOyBpZnA7IGlmcD1pZnAtPmxzdF9uZXh0KSB7CisJCQl1bnNpZ25lZCBsb25nIGFnZTsKKyNpZmRlZiBDT05GSUdfSVBWNl9QUklWQUNZCisJCQl1bnNpZ25lZCBsb25nIHJlZ2VuX2FkdmFuY2U7CisjZW5kaWYKKworCQkJaWYgKGlmcC0+ZmxhZ3MgJiBJRkFfRl9QRVJNQU5FTlQpCisJCQkJY29udGludWU7CisKKwkJCXNwaW5fbG9jaygmaWZwLT5sb2NrKTsKKwkJCWFnZSA9IChub3cgLSBpZnAtPnRzdGFtcCkgLyBIWjsKKworI2lmZGVmIENPTkZJR19JUFY2X1BSSVZBQ1kKKwkJCXJlZ2VuX2FkdmFuY2UgPSBpZnAtPmlkZXYtPmNuZi5yZWdlbl9tYXhfcmV0cnkgKiAKKwkJCQkJaWZwLT5pZGV2LT5jbmYuZGFkX3RyYW5zbWl0cyAqIAorCQkJCQlpZnAtPmlkZXYtPm5kX3Bhcm1zLT5yZXRyYW5zX3RpbWUgLyBIWjsKKyNlbmRpZgorCisJCQlpZiAoYWdlID49IGlmcC0+dmFsaWRfbGZ0KSB7CisJCQkJc3Bpbl91bmxvY2soJmlmcC0+bG9jayk7CisJCQkJaW42X2lmYV9ob2xkKGlmcCk7CisJCQkJd3JpdGVfdW5sb2NrKCZhZGRyY29uZl9oYXNoX2xvY2spOworCQkJCWlwdjZfZGVsX2FkZHIoaWZwKTsKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQl9IGVsc2UgaWYgKGFnZSA+PSBpZnAtPnByZWZlcmVkX2xmdCkgeworCQkJCS8qIGppZmZpZXMgLSBpZnAtPnRzYW1wID4gYWdlID49IGlmcC0+cHJlZmVyZWRfbGZ0ICovCisJCQkJaW50IGRlcHJlY2F0ZSA9IDA7CisKKwkJCQlpZiAoIShpZnAtPmZsYWdzJklGQV9GX0RFUFJFQ0FURUQpKSB7CisJCQkJCWRlcHJlY2F0ZSA9IDE7CisJCQkJCWlmcC0+ZmxhZ3MgfD0gSUZBX0ZfREVQUkVDQVRFRDsKKwkJCQl9CisKKwkJCQlpZiAodGltZV9iZWZvcmUoaWZwLT50c3RhbXAgKyBpZnAtPnZhbGlkX2xmdCAqIEhaLCBuZXh0KSkKKwkJCQkJbmV4dCA9IGlmcC0+dHN0YW1wICsgaWZwLT52YWxpZF9sZnQgKiBIWjsKKworCQkJCXNwaW5fdW5sb2NrKCZpZnAtPmxvY2spOworCisJCQkJaWYgKGRlcHJlY2F0ZSkgeworCQkJCQlpbjZfaWZhX2hvbGQoaWZwKTsKKwkJCQkJd3JpdGVfdW5sb2NrKCZhZGRyY29uZl9oYXNoX2xvY2spOworCisJCQkJCWlwdjZfaWZhX25vdGlmeSgwLCBpZnApOworCQkJCQlpbjZfaWZhX3B1dChpZnApOworCQkJCQlnb3RvIHJlc3RhcnQ7CisJCQkJfQorI2lmZGVmIENPTkZJR19JUFY2X1BSSVZBQ1kKKwkJCX0gZWxzZSBpZiAoKGlmcC0+ZmxhZ3MmSUZBX0ZfVEVNUE9SQVJZKSAmJgorCQkJCSAgICEoaWZwLT5mbGFncyZJRkFfRl9URU5UQVRJVkUpKSB7CisJCQkJaWYgKGFnZSA+PSBpZnAtPnByZWZlcmVkX2xmdCAtIHJlZ2VuX2FkdmFuY2UpIHsKKwkJCQkJc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwdWIgPSBpZnAtPmlmcHViOworCQkJCQlpZiAodGltZV9iZWZvcmUoaWZwLT50c3RhbXAgKyBpZnAtPnByZWZlcmVkX2xmdCAqIEhaLCBuZXh0KSkKKwkJCQkJCW5leHQgPSBpZnAtPnRzdGFtcCArIGlmcC0+cHJlZmVyZWRfbGZ0ICogSFo7CisJCQkJCWlmICghaWZwLT5yZWdlbl9jb3VudCAmJiBpZnB1YikgeworCQkJCQkJaWZwLT5yZWdlbl9jb3VudCsrOworCQkJCQkJaW42X2lmYV9ob2xkKGlmcCk7CisJCQkJCQlpbjZfaWZhX2hvbGQoaWZwdWIpOworCQkJCQkJc3Bpbl91bmxvY2soJmlmcC0+bG9jayk7CisJCQkJCQl3cml0ZV91bmxvY2soJmFkZHJjb25mX2hhc2hfbG9jayk7CisJCQkJCQlpcHY2X2NyZWF0ZV90ZW1wYWRkcihpZnB1YiwgaWZwKTsKKwkJCQkJCWluNl9pZmFfcHV0KGlmcHViKTsKKwkJCQkJCWluNl9pZmFfcHV0KGlmcCk7CisJCQkJCQlnb3RvIHJlc3RhcnQ7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKHRpbWVfYmVmb3JlKGlmcC0+dHN0YW1wICsgaWZwLT5wcmVmZXJlZF9sZnQgKiBIWiAtIHJlZ2VuX2FkdmFuY2UgKiBIWiwgbmV4dCkpCisJCQkJCW5leHQgPSBpZnAtPnRzdGFtcCArIGlmcC0+cHJlZmVyZWRfbGZ0ICogSFogLSByZWdlbl9hZHZhbmNlICogSFo7CisJCQkJc3Bpbl91bmxvY2soJmlmcC0+bG9jayk7CisjZW5kaWYKKwkJCX0gZWxzZSB7CisJCQkJLyogaWZwLT5wcmVmZXJlZF9sZnQgPD0gaWZwLT52YWxpZF9sZnQgKi8KKwkJCQlpZiAodGltZV9iZWZvcmUoaWZwLT50c3RhbXAgKyBpZnAtPnByZWZlcmVkX2xmdCAqIEhaLCBuZXh0KSkKKwkJCQkJbmV4dCA9IGlmcC0+dHN0YW1wICsgaWZwLT5wcmVmZXJlZF9sZnQgKiBIWjsKKwkJCQlzcGluX3VubG9jaygmaWZwLT5sb2NrKTsKKwkJCX0KKwkJfQorCQl3cml0ZV91bmxvY2soJmFkZHJjb25mX2hhc2hfbG9jayk7CisJfQorCisJYWRkcl9jaGtfdGltZXIuZXhwaXJlcyA9IHRpbWVfYmVmb3JlKG5leHQsIGppZmZpZXMgKyBIWikgPyBqaWZmaWVzICsgSFogOiBuZXh0OworCWFkZF90aW1lcigmYWRkcl9jaGtfdGltZXIpOworCXNwaW5fdW5sb2NrX2JoKCZhZGRyY29uZl92ZXJpZnlfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQKK2luZXQ2X3J0bV9kZWxhZGRyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpCit7CisJc3RydWN0IHJ0YXR0ciAqKnJ0YSA9IGFyZzsKKwlzdHJ1Y3QgaWZhZGRybXNnICppZm0gPSBOTE1TR19EQVRBKG5saCk7CisJc3RydWN0IGluNl9hZGRyICpwZng7CisKKwlwZnggPSBOVUxMOworCWlmIChydGFbSUZBX0FERFJFU1MtMV0pIHsKKwkJaWYgKFJUQV9QQVlMT0FEKHJ0YVtJRkFfQUREUkVTUy0xXSkgPCBzaXplb2YoKnBmeCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcGZ4ID0gUlRBX0RBVEEocnRhW0lGQV9BRERSRVNTLTFdKTsKKwl9CisJaWYgKHJ0YVtJRkFfTE9DQUwtMV0pIHsKKwkJaWYgKHBmeCAmJiBtZW1jbXAocGZ4LCBSVEFfREFUQShydGFbSUZBX0xPQ0FMLTFdKSwgc2l6ZW9mKCpwZngpKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlwZnggPSBSVEFfREFUQShydGFbSUZBX0xPQ0FMLTFdKTsKKwl9CisJaWYgKHBmeCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBpbmV0Nl9hZGRyX2RlbChpZm0tPmlmYV9pbmRleCwgcGZ4LCBpZm0tPmlmYV9wcmVmaXhsZW4pOworfQorCitzdGF0aWMgaW50CitpbmV0Nl9ydG1fbmV3YWRkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBydGF0dHIgICoqcnRhID0gYXJnOworCXN0cnVjdCBpZmFkZHJtc2cgKmlmbSA9IE5MTVNHX0RBVEEobmxoKTsKKwlzdHJ1Y3QgaW42X2FkZHIgKnBmeDsKKworCXBmeCA9IE5VTEw7CisJaWYgKHJ0YVtJRkFfQUREUkVTUy0xXSkgeworCQlpZiAoUlRBX1BBWUxPQUQocnRhW0lGQV9BRERSRVNTLTFdKSA8IHNpemVvZigqcGZ4KSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlwZnggPSBSVEFfREFUQShydGFbSUZBX0FERFJFU1MtMV0pOworCX0KKwlpZiAocnRhW0lGQV9MT0NBTC0xXSkgeworCQlpZiAocGZ4ICYmIG1lbWNtcChwZngsIFJUQV9EQVRBKHJ0YVtJRkFfTE9DQUwtMV0pLCBzaXplb2YoKnBmeCkpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXBmeCA9IFJUQV9EQVRBKHJ0YVtJRkFfTE9DQUwtMV0pOworCX0KKwlpZiAocGZ4ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGluZXQ2X2FkZHJfYWRkKGlmbS0+aWZhX2luZGV4LCBwZngsIGlmbS0+aWZhX3ByZWZpeGxlbik7Cit9CisKK3N0YXRpYyBpbnQgaW5ldDZfZmlsbF9pZmFkZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluZXQ2X2lmYWRkciAqaWZhLAorCQkJICAgICB1MzIgcGlkLCB1MzIgc2VxLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IGlmYWRkcm1zZyAqaWZtOworCXN0cnVjdCBubG1zZ2hkciAgKm5saDsKKwlzdHJ1Y3QgaWZhX2NhY2hlaW5mbyBjaTsKKwl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYi0+dGFpbDsKKworCW5saCA9IE5MTVNHX1BVVChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCppZm0pKTsKKwlpZiAocGlkKSBubGgtPm5sbXNnX2ZsYWdzIHw9IE5MTV9GX01VTFRJOworCWlmbSA9IE5MTVNHX0RBVEEobmxoKTsKKwlpZm0tPmlmYV9mYW1pbHkgPSBBRl9JTkVUNjsKKwlpZm0tPmlmYV9wcmVmaXhsZW4gPSBpZmEtPnByZWZpeF9sZW47CisJaWZtLT5pZmFfZmxhZ3MgPSBpZmEtPmZsYWdzOworCWlmbS0+aWZhX3Njb3BlID0gUlRfU0NPUEVfVU5JVkVSU0U7CisJaWYgKGlmYS0+c2NvcGUmSUZBX0hPU1QpCisJCWlmbS0+aWZhX3Njb3BlID0gUlRfU0NPUEVfSE9TVDsKKwllbHNlIGlmIChpZmEtPnNjb3BlJklGQV9MSU5LKQorCQlpZm0tPmlmYV9zY29wZSA9IFJUX1NDT1BFX0xJTks7CisJZWxzZSBpZiAoaWZhLT5zY29wZSZJRkFfU0lURSkKKwkJaWZtLT5pZmFfc2NvcGUgPSBSVF9TQ09QRV9TSVRFOworCWlmbS0+aWZhX2luZGV4ID0gaWZhLT5pZGV2LT5kZXYtPmlmaW5kZXg7CisJUlRBX1BVVChza2IsIElGQV9BRERSRVNTLCAxNiwgJmlmYS0+YWRkcik7CisJaWYgKCEoaWZhLT5mbGFncyZJRkFfRl9QRVJNQU5FTlQpKSB7CisJCWNpLmlmYV9wcmVmZXJlZCA9IGlmYS0+cHJlZmVyZWRfbGZ0OworCQljaS5pZmFfdmFsaWQgPSBpZmEtPnZhbGlkX2xmdDsKKwkJaWYgKGNpLmlmYV9wcmVmZXJlZCAhPSBJTkZJTklUWV9MSUZFX1RJTUUpIHsKKwkJCWxvbmcgdHZhbCA9IChqaWZmaWVzIC0gaWZhLT50c3RhbXApL0haOworCQkJY2kuaWZhX3ByZWZlcmVkIC09IHR2YWw7CisJCQlpZiAoY2kuaWZhX3ZhbGlkICE9IElORklOSVRZX0xJRkVfVElNRSkKKwkJCQljaS5pZmFfdmFsaWQgLT0gdHZhbDsKKwkJfQorCX0gZWxzZSB7CisJCWNpLmlmYV9wcmVmZXJlZCA9IElORklOSVRZX0xJRkVfVElNRTsKKwkJY2kuaWZhX3ZhbGlkID0gSU5GSU5JVFlfTElGRV9USU1FOworCX0KKwljaS5jc3RhbXAgPSAoX191MzIpKFRJTUVfREVMVEEoaWZhLT5jc3RhbXAsIElOSVRJQUxfSklGRklFUykgLyBIWiAqIDEwMAorCQkgICAgKyBUSU1FX0RFTFRBKGlmYS0+Y3N0YW1wLCBJTklUSUFMX0pJRkZJRVMpICUgSFogKiAxMDAgLyBIWik7CisJY2kudHN0YW1wID0gKF9fdTMyKShUSU1FX0RFTFRBKGlmYS0+dHN0YW1wLCBJTklUSUFMX0pJRkZJRVMpIC8gSFogKiAxMDAKKwkJICAgICsgVElNRV9ERUxUQShpZmEtPnRzdGFtcCwgSU5JVElBTF9KSUZGSUVTKSAlIEhaICogMTAwIC8gSFopOworCVJUQV9QVVQoc2tiLCBJRkFfQ0FDSEVJTkZPLCBzaXplb2YoY2kpLCAmY2kpOworCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlyZXR1cm4gc2tiLT5sZW47CisKK25sbXNnX2ZhaWx1cmU6CitydGF0dHJfZmFpbHVyZToKKwlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBpbmV0Nl9maWxsX2lmbWNhZGRyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpZm1jYWRkcjYgKmlmbWNhLAorCQkJCXUzMiBwaWQsIHUzMiBzZXEsIGludCBldmVudCkKK3sKKwlzdHJ1Y3QgaWZhZGRybXNnICppZm07CisJc3RydWN0IG5sbXNnaGRyICAqbmxoOworCXN0cnVjdCBpZmFfY2FjaGVpbmZvIGNpOworCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCisJbmxoID0gTkxNU0dfUFVUKHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKmlmbSkpOworCWlmIChwaWQpIG5saC0+bmxtc2dfZmxhZ3MgfD0gTkxNX0ZfTVVMVEk7CisJaWZtID0gTkxNU0dfREFUQShubGgpOworCWlmbS0+aWZhX2ZhbWlseSA9IEFGX0lORVQ2OwkKKwlpZm0tPmlmYV9wcmVmaXhsZW4gPSAxMjg7CisJaWZtLT5pZmFfZmxhZ3MgPSBJRkFfRl9QRVJNQU5FTlQ7CisJaWZtLT5pZmFfc2NvcGUgPSBSVF9TQ09QRV9VTklWRVJTRTsKKwlpZiAoaXB2Nl9hZGRyX3Njb3BlKCZpZm1jYS0+bWNhX2FkZHIpJklGQV9TSVRFKQorCQlpZm0tPmlmYV9zY29wZSA9IFJUX1NDT1BFX1NJVEU7CisJaWZtLT5pZmFfaW5kZXggPSBpZm1jYS0+aWRldi0+ZGV2LT5pZmluZGV4OworCVJUQV9QVVQoc2tiLCBJRkFfTVVMVElDQVNULCAxNiwgJmlmbWNhLT5tY2FfYWRkcik7CisJY2kuY3N0YW1wID0gKF9fdTMyKShUSU1FX0RFTFRBKGlmbWNhLT5tY2FfY3N0YW1wLCBJTklUSUFMX0pJRkZJRVMpIC8gSFoKKwkJICAgICogMTAwICsgVElNRV9ERUxUQShpZm1jYS0+bWNhX2NzdGFtcCwgSU5JVElBTF9KSUZGSUVTKSAlIEhaCisJCSAgICAqIDEwMCAvIEhaKTsKKwljaS50c3RhbXAgPSAoX191MzIpKFRJTUVfREVMVEEoaWZtY2EtPm1jYV90c3RhbXAsIElOSVRJQUxfSklGRklFUykgLyBIWgorCQkgICAgKiAxMDAgKyBUSU1FX0RFTFRBKGlmbWNhLT5tY2FfdHN0YW1wLCBJTklUSUFMX0pJRkZJRVMpICUgSFoKKwkJICAgICogMTAwIC8gSFopOworCWNpLmlmYV9wcmVmZXJlZCA9IElORklOSVRZX0xJRkVfVElNRTsKKwljaS5pZmFfdmFsaWQgPSBJTkZJTklUWV9MSUZFX1RJTUU7CisJUlRBX1BVVChza2IsIElGQV9DQUNIRUlORk8sIHNpemVvZihjaSksICZjaSk7CisJbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCXJldHVybiBza2ItPmxlbjsKKworbmxtc2dfZmFpbHVyZToKK3J0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGluZXQ2X2ZpbGxfaWZhY2FkZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlmYWNhZGRyNiAqaWZhY2EsCisJCQkJdTMyIHBpZCwgdTMyIHNlcSwgaW50IGV2ZW50KQoreworCXN0cnVjdCBpZmFkZHJtc2cgKmlmbTsKKwlzdHJ1Y3Qgbmxtc2doZHIgICpubGg7CisJc3RydWN0IGlmYV9jYWNoZWluZm8gY2k7CisJdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisKKwlubGggPSBOTE1TR19QVVQoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqaWZtKSk7CisJaWYgKHBpZCkgbmxoLT5ubG1zZ19mbGFncyB8PSBOTE1fRl9NVUxUSTsKKwlpZm0gPSBOTE1TR19EQVRBKG5saCk7CisJaWZtLT5pZmFfZmFtaWx5ID0gQUZfSU5FVDY7CQorCWlmbS0+aWZhX3ByZWZpeGxlbiA9IDEyODsKKwlpZm0tPmlmYV9mbGFncyA9IElGQV9GX1BFUk1BTkVOVDsKKwlpZm0tPmlmYV9zY29wZSA9IFJUX1NDT1BFX1VOSVZFUlNFOworCWlmIChpcHY2X2FkZHJfc2NvcGUoJmlmYWNhLT5hY2FfYWRkcikmSUZBX1NJVEUpCisJCWlmbS0+aWZhX3Njb3BlID0gUlRfU0NPUEVfU0lURTsKKwlpZm0tPmlmYV9pbmRleCA9IGlmYWNhLT5hY2FfaWRldi0+ZGV2LT5pZmluZGV4OworCVJUQV9QVVQoc2tiLCBJRkFfQU5ZQ0FTVCwgMTYsICZpZmFjYS0+YWNhX2FkZHIpOworCWNpLmNzdGFtcCA9IChfX3UzMikoVElNRV9ERUxUQShpZmFjYS0+YWNhX2NzdGFtcCwgSU5JVElBTF9KSUZGSUVTKSAvIEhaCisJCSAgICAqIDEwMCArIFRJTUVfREVMVEEoaWZhY2EtPmFjYV9jc3RhbXAsIElOSVRJQUxfSklGRklFUykgJSBIWgorCQkgICAgKiAxMDAgLyBIWik7CisJY2kudHN0YW1wID0gKF9fdTMyKShUSU1FX0RFTFRBKGlmYWNhLT5hY2FfdHN0YW1wLCBJTklUSUFMX0pJRkZJRVMpIC8gSFoKKwkJICAgICogMTAwICsgVElNRV9ERUxUQShpZmFjYS0+YWNhX3RzdGFtcCwgSU5JVElBTF9KSUZGSUVTKSAlIEhaCisJCSAgICAqIDEwMCAvIEhaKTsKKwljaS5pZmFfcHJlZmVyZWQgPSBJTkZJTklUWV9MSUZFX1RJTUU7CisJY2kuaWZhX3ZhbGlkID0gSU5GSU5JVFlfTElGRV9USU1FOworCVJUQV9QVVQoc2tiLCBJRkFfQ0FDSEVJTkZPLCBzaXplb2YoY2kpLCAmY2kpOworCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlyZXR1cm4gc2tiLT5sZW47CisKK25sbXNnX2ZhaWx1cmU6CitydGF0dHJfZmFpbHVyZToKKwlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCXJldHVybiAtMTsKK30KKworZW51bSBhZGRyX3R5cGVfdAoreworCVVOSUNBU1RfQUREUiwKKwlNVUxUSUNBU1RfQUREUiwKKwlBTllDQVNUX0FERFIsCit9OworCitzdGF0aWMgaW50IGluZXQ2X2R1bXBfYWRkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCisJCQkgICBlbnVtIGFkZHJfdHlwZV90IHR5cGUpCit7CisJaW50IGlkeCwgaXBfaWR4OworCWludCBzX2lkeCwgc19pcF9pZHg7CisJaW50IGVyciA9IDE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZmE7CisJc3RydWN0IGlmbWNhZGRyNiAqaWZtY2E7CisJc3RydWN0IGlmYWNhZGRyNiAqaWZhY2E7CisKKwlzX2lkeCA9IGNiLT5hcmdzWzBdOworCXNfaXBfaWR4ID0gaXBfaWR4ID0gY2ItPmFyZ3NbMV07CisJcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKwkKKwlmb3IgKGRldiA9IGRldl9iYXNlLCBpZHggPSAwOyBkZXY7IGRldiA9IGRldi0+bmV4dCwgaWR4KyspIHsKKwkJaWYgKGlkeCA8IHNfaWR4KQorCQkJY29udGludWU7CisJCWlmIChpZHggPiBzX2lkeCkKKwkJCXNfaXBfaWR4ID0gMDsKKwkJaXBfaWR4ID0gMDsKKwkJaWYgKChpZGV2ID0gaW42X2Rldl9nZXQoZGV2KSkgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlyZWFkX2xvY2tfYmgoJmlkZXYtPmxvY2spOworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBVTklDQVNUX0FERFI6CisJCQkvKiB1bmljYXN0IGFkZHJlc3MgKi8KKwkJCWZvciAoaWZhID0gaWRldi0+YWRkcl9saXN0OyBpZmE7CisJCQkgICAgIGlmYSA9IGlmYS0+aWZfbmV4dCwgaXBfaWR4KyspIHsKKwkJCQlpZiAoaXBfaWR4IDwgc19pcF9pZHgpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICgoZXJyID0gaW5ldDZfZmlsbF9pZmFkZHIoc2tiLCBpZmEsIAorCQkJCSAgICBORVRMSU5LX0NCKGNiLT5za2IpLnBpZCwgCisJCQkJICAgIGNiLT5ubGgtPm5sbXNnX3NlcSwgUlRNX05FV0FERFIpKSA8PSAwKQorCQkJCQlnb3RvIGRvbmU7CisJCQl9CisJCQkvKiB0ZW1wIGFkZHIgKi8KKyNpZmRlZiBDT05GSUdfSVBWNl9QUklWQUNZCisJCQlmb3IgKGlmYSA9IGlkZXYtPnRlbXBhZGRyX2xpc3Q7IGlmYTsgCisJCQkgICAgIGlmYSA9IGlmYS0+dG1wX25leHQsIGlwX2lkeCsrKSB7CisJCQkJaWYgKGlwX2lkeCA8IHNfaXBfaWR4KQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoKGVyciA9IGluZXQ2X2ZpbGxfaWZhZGRyKHNrYiwgaWZhLCAKKwkJCQkgICAgTkVUTElOS19DQihjYi0+c2tiKS5waWQsIAorCQkJCSAgICBjYi0+bmxoLT5ubG1zZ19zZXEsIFJUTV9ORVdBRERSKSkgPD0gMCkgCisJCQkJCWdvdG8gZG9uZTsKKwkJCX0KKyNlbmRpZgorCQkJYnJlYWs7CisJCWNhc2UgTVVMVElDQVNUX0FERFI6CisJCQkvKiBtdWx0aWNhc3QgYWRkcmVzcyAqLworCQkJZm9yIChpZm1jYSA9IGlkZXYtPm1jX2xpc3Q7IGlmbWNhOyAKKwkJCSAgICAgaWZtY2EgPSBpZm1jYS0+bmV4dCwgaXBfaWR4KyspIHsKKwkJCQlpZiAoaXBfaWR4IDwgc19pcF9pZHgpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICgoZXJyID0gaW5ldDZfZmlsbF9pZm1jYWRkcihza2IsIGlmbWNhLCAKKwkJCQkgICAgTkVUTElOS19DQihjYi0+c2tiKS5waWQsIAorCQkJCSAgICBjYi0+bmxoLT5ubG1zZ19zZXEsIFJUTV9HRVRNVUxUSUNBU1QpKSA8PSAwKQorCQkJCQlnb3RvIGRvbmU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBBTllDQVNUX0FERFI6CisJCQkvKiBhbnljYXN0IGFkZHJlc3MgKi8KKwkJCWZvciAoaWZhY2EgPSBpZGV2LT5hY19saXN0OyBpZmFjYTsKKwkJCSAgICAgaWZhY2EgPSBpZmFjYS0+YWNhX25leHQsIGlwX2lkeCsrKSB7CisJCQkJaWYgKGlwX2lkeCA8IHNfaXBfaWR4KQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoKGVyciA9IGluZXQ2X2ZpbGxfaWZhY2FkZHIoc2tiLCBpZmFjYSwgCisJCQkJICAgIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLCAKKwkJCQkgICAgY2ItPm5saC0+bmxtc2dfc2VxLCBSVE1fR0VUQU5ZQ0FTVCkpIDw9IDApIAorCQkJCQlnb3RvIGRvbmU7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCXJlYWRfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwkJaW42X2Rldl9wdXQoaWRldik7CisJfQorZG9uZToKKwlpZiAoZXJyIDw9IDApIHsKKwkJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOworCQlpbjZfZGV2X3B1dChpZGV2KTsKKwl9CisJcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOworCWNiLT5hcmdzWzBdID0gaWR4OworCWNiLT5hcmdzWzFdID0gaXBfaWR4OworCXJldHVybiBza2ItPmxlbjsKK30KKworc3RhdGljIGludCBpbmV0Nl9kdW1wX2lmYWRkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJZW51bSBhZGRyX3R5cGVfdCB0eXBlID0gVU5JQ0FTVF9BRERSOworCXJldHVybiBpbmV0Nl9kdW1wX2FkZHIoc2tiLCBjYiwgdHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgaW5ldDZfZHVtcF9pZm1jYWRkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJZW51bSBhZGRyX3R5cGVfdCB0eXBlID0gTVVMVElDQVNUX0FERFI7CisJcmV0dXJuIGluZXQ2X2R1bXBfYWRkcihza2IsIGNiLCB0eXBlKTsKK30KKworCitzdGF0aWMgaW50IGluZXQ2X2R1bXBfaWZhY2FkZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCWVudW0gYWRkcl90eXBlX3QgdHlwZSA9IEFOWUNBU1RfQUREUjsKKwlyZXR1cm4gaW5ldDZfZHVtcF9hZGRyKHNrYiwgY2IsIHR5cGUpOworfQorCitzdGF0aWMgdm9pZCBpbmV0Nl9pZmFfbm90aWZ5KGludCBldmVudCwgc3RydWN0IGluZXQ2X2lmYWRkciAqaWZhKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHNpemUgPSBOTE1TR19TUEFDRShzaXplb2Yoc3RydWN0IGlmYWRkcm1zZykrMTI4KTsKKworCXNrYiA9IGFsbG9jX3NrYihzaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikgeworCQluZXRsaW5rX3NldF9lcnIocnRubCwgMCwgUlRNR1JQX0lQVjZfSUZBRERSLCBFTk9CVUZTKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoaW5ldDZfZmlsbF9pZmFkZHIoc2tiLCBpZmEsIDAsIDAsIGV2ZW50KSA8IDApIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCW5ldGxpbmtfc2V0X2VycihydG5sLCAwLCBSVE1HUlBfSVBWNl9JRkFERFIsIEVJTlZBTCk7CisJCXJldHVybjsKKwl9CisJTkVUTElOS19DQihza2IpLmRzdF9ncm91cHMgPSBSVE1HUlBfSVBWNl9JRkFERFI7CisJbmV0bGlua19icm9hZGNhc3QocnRubCwgc2tiLCAwLCBSVE1HUlBfSVBWNl9JRkFERFIsIEdGUF9BVE9NSUMpOworfQorCitzdGF0aWMgdm9pZCBpbmxpbmUgaXB2Nl9zdG9yZV9kZXZjb25mKHN0cnVjdCBpcHY2X2RldmNvbmYgKmNuZiwKKwkJCQlfX3MzMiAqYXJyYXksIGludCBieXRlcykKK3sKKwltZW1zZXQoYXJyYXksIDAsIGJ5dGVzKTsKKwlhcnJheVtERVZDT05GX0ZPUldBUkRJTkddID0gY25mLT5mb3J3YXJkaW5nOworCWFycmF5W0RFVkNPTkZfSE9QTElNSVRdID0gY25mLT5ob3BfbGltaXQ7CisJYXJyYXlbREVWQ09ORl9NVFU2XSA9IGNuZi0+bXR1NjsKKwlhcnJheVtERVZDT05GX0FDQ0VQVF9SQV0gPSBjbmYtPmFjY2VwdF9yYTsKKwlhcnJheVtERVZDT05GX0FDQ0VQVF9SRURJUkVDVFNdID0gY25mLT5hY2NlcHRfcmVkaXJlY3RzOworCWFycmF5W0RFVkNPTkZfQVVUT0NPTkZdID0gY25mLT5hdXRvY29uZjsKKwlhcnJheVtERVZDT05GX0RBRF9UUkFOU01JVFNdID0gY25mLT5kYWRfdHJhbnNtaXRzOworCWFycmF5W0RFVkNPTkZfUlRSX1NPTElDSVRTXSA9IGNuZi0+cnRyX3NvbGljaXRzOworCWFycmF5W0RFVkNPTkZfUlRSX1NPTElDSVRfSU5URVJWQUxdID0gY25mLT5ydHJfc29saWNpdF9pbnRlcnZhbDsKKwlhcnJheVtERVZDT05GX1JUUl9TT0xJQ0lUX0RFTEFZXSA9IGNuZi0+cnRyX3NvbGljaXRfZGVsYXk7CisJYXJyYXlbREVWQ09ORl9GT1JDRV9NTERfVkVSU0lPTl0gPSBjbmYtPmZvcmNlX21sZF92ZXJzaW9uOworI2lmZGVmIENPTkZJR19JUFY2X1BSSVZBQ1kKKwlhcnJheVtERVZDT05GX1VTRV9URU1QQUREUl0gPSBjbmYtPnVzZV90ZW1wYWRkcjsKKwlhcnJheVtERVZDT05GX1RFTVBfVkFMSURfTEZUXSA9IGNuZi0+dGVtcF92YWxpZF9sZnQ7CisJYXJyYXlbREVWQ09ORl9URU1QX1BSRUZFUkVEX0xGVF0gPSBjbmYtPnRlbXBfcHJlZmVyZWRfbGZ0OworCWFycmF5W0RFVkNPTkZfUkVHRU5fTUFYX1JFVFJZXSA9IGNuZi0+cmVnZW5fbWF4X3JldHJ5OworCWFycmF5W0RFVkNPTkZfTUFYX0RFU1lOQ19GQUNUT1JdID0gY25mLT5tYXhfZGVzeW5jX2ZhY3RvcjsKKyNlbmRpZgorCWFycmF5W0RFVkNPTkZfTUFYX0FERFJFU1NFU10gPSBjbmYtPm1heF9hZGRyZXNzZXM7Cit9CisKK3N0YXRpYyBpbnQgaW5ldDZfZmlsbF9pZmluZm8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluZXQ2X2RldiAqaWRldiwgCisJCQkgICAgIHUzMiBwaWQsIHUzMiBzZXEsIGludCBldmVudCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2ID0gaWRldi0+ZGV2OworCV9fczMyCQkJKmFycmF5ID0gTlVMTDsKKwlzdHJ1Y3QgaWZpbmZvbXNnCSpyOworCXN0cnVjdCBubG1zZ2hkciAJKm5saDsKKwl1bnNpZ25lZCBjaGFyCQkqYiA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3QgcnRhdHRyCQkqc3ViYXR0cjsKKwlfX3UzMgkJCW10dSA9IGRldi0+bXR1OworCXN0cnVjdCBpZmxhX2NhY2hlaW5mbwljaTsKKworCW5saCA9IE5MTVNHX1BVVChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCpyKSk7CisJaWYgKHBpZCkgbmxoLT5ubG1zZ19mbGFncyB8PSBOTE1fRl9NVUxUSTsKKwlyID0gTkxNU0dfREFUQShubGgpOworCXItPmlmaV9mYW1pbHkgPSBBRl9JTkVUNjsKKwlyLT5pZmlfdHlwZSA9IGRldi0+dHlwZTsKKwlyLT5pZmlfaW5kZXggPSBkZXYtPmlmaW5kZXg7CisJci0+aWZpX2ZsYWdzID0gZGV2X2dldF9mbGFncyhkZXYpOworCXItPmlmaV9jaGFuZ2UgPSAwOworCisJUlRBX1BVVChza2IsIElGTEFfSUZOQU1FLCBzdHJsZW4oZGV2LT5uYW1lKSsxLCBkZXYtPm5hbWUpOworCisJaWYgKGRldi0+YWRkcl9sZW4pCisJCVJUQV9QVVQoc2tiLCBJRkxBX0FERFJFU1MsIGRldi0+YWRkcl9sZW4sIGRldi0+ZGV2X2FkZHIpOworCisJUlRBX1BVVChza2IsIElGTEFfTVRVLCBzaXplb2YobXR1KSwgJm10dSk7CisJaWYgKGRldi0+aWZpbmRleCAhPSBkZXYtPmlmbGluaykKKwkJUlRBX1BVVChza2IsIElGTEFfTElOSywgc2l6ZW9mKGludCksICZkZXYtPmlmbGluayk7CisJCQkKKwlzdWJhdHRyID0gKHN0cnVjdCBydGF0dHIqKXNrYi0+dGFpbDsKKworCVJUQV9QVVQoc2tiLCBJRkxBX1BST1RJTkZPLCAwLCBOVUxMKTsKKworCS8qIHJldHVybiB0aGUgZGV2aWNlIGZsYWdzICovCisJUlRBX1BVVChza2IsIElGTEFfSU5FVDZfRkxBR1MsIHNpemVvZihfX3UzMiksICZpZGV2LT5pZl9mbGFncyk7CisKKwkvKiByZXR1cm4gaW50ZXJmYWNlIGNhY2hlaW5mbyAqLworCWNpLm1heF9yZWFzbV9sZW4gPSBJUFY2X01BWFBMRU47CisJY2kudHN0YW1wID0gKF9fdTMyKShUSU1FX0RFTFRBKGlkZXYtPnRzdGFtcCwgSU5JVElBTF9KSUZGSUVTKSAvIEhaICogMTAwCisJCSAgICArIFRJTUVfREVMVEEoaWRldi0+dHN0YW1wLCBJTklUSUFMX0pJRkZJRVMpICUgSFogKiAxMDAgLyBIWik7CisJY2kucmVhY2hhYmxlX3RpbWUgPSBpZGV2LT5uZF9wYXJtcy0+cmVhY2hhYmxlX3RpbWU7CisJY2kucmV0cmFuc190aW1lID0gaWRldi0+bmRfcGFybXMtPnJldHJhbnNfdGltZTsKKwlSVEFfUFVUKHNrYiwgSUZMQV9JTkVUNl9DQUNIRUlORk8sIHNpemVvZihjaSksICZjaSk7CisJCisJLyogcmV0dXJuIHRoZSBkZXZpY2Ugc3lzY3RsIHBhcmFtcyAqLworCWlmICgoYXJyYXkgPSBrbWFsbG9jKERFVkNPTkZfTUFYICogc2l6ZW9mKCphcnJheSksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOworCWlwdjZfc3RvcmVfZGV2Y29uZigmaWRldi0+Y25mLCBhcnJheSwgREVWQ09ORl9NQVggKiBzaXplb2YoKmFycmF5KSk7CisJUlRBX1BVVChza2IsIElGTEFfSU5FVDZfQ09ORiwgREVWQ09ORl9NQVggKiBzaXplb2YoKmFycmF5KSwgYXJyYXkpOworCisJLyogWFhYIC0gU3RhdGlzdGljcy9NQyBub3QgaW1wbGVtZW50ZWQgKi8KKwlzdWJhdHRyLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4KilzdWJhdHRyOworCisJbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCWtmcmVlKGFycmF5KTsKKwlyZXR1cm4gc2tiLT5sZW47CisKK25sbXNnX2ZhaWx1cmU6CitydGF0dHJfZmFpbHVyZToKKwlpZiAoYXJyYXkpCisJCWtmcmVlKGFycmF5KTsKKwlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBpbmV0Nl9kdW1wX2lmaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJaW50IGlkeCwgZXJyOworCWludCBzX2lkeCA9IGNiLT5hcmdzWzBdOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGluZXQ2X2RldiAqaWRldjsKKworCXJlYWRfbG9jaygmZGV2X2Jhc2VfbG9jayk7CisJZm9yIChkZXY9ZGV2X2Jhc2UsIGlkeD0wOyBkZXY7IGRldiA9IGRldi0+bmV4dCwgaWR4KyspIHsKKwkJaWYgKGlkeCA8IHNfaWR4KQorCQkJY29udGludWU7CisJCWlmICgoaWRldiA9IGluNl9kZXZfZ2V0KGRldikpID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJZXJyID0gaW5ldDZfZmlsbF9pZmluZm8oc2tiLCBpZGV2LCBORVRMSU5LX0NCKGNiLT5za2IpLnBpZCwgCisJCQkJY2ItPm5saC0+bmxtc2dfc2VxLCBSVE1fTkVXTElOSyk7CisJCWluNl9kZXZfcHV0KGlkZXYpOworCQlpZiAoZXJyIDw9IDApCisJCQlicmVhazsKKwl9CisJcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOworCWNiLT5hcmdzWzBdID0gaWR4OworCisJcmV0dXJuIHNrYi0+bGVuOworfQorCit2b2lkIGluZXQ2X2lmaW5mb19ub3RpZnkoaW50IGV2ZW50LCBzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJLyogMTI4IGJ5dGVzID8/ICovCisJaW50IHNpemUgPSBOTE1TR19TUEFDRShzaXplb2Yoc3RydWN0IGlmaW5mb21zZykrMTI4KTsKKwkKKwlza2IgPSBhbGxvY19za2Ioc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKCFza2IpIHsKKwkJbmV0bGlua19zZXRfZXJyKHJ0bmwsIDAsIFJUTUdSUF9JUFY2X0lGSU5GTywgRU5PQlVGUyk7CisJCXJldHVybjsKKwl9CisJaWYgKGluZXQ2X2ZpbGxfaWZpbmZvKHNrYiwgaWRldiwgMCwgMCwgZXZlbnQpIDwgMCkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJbmV0bGlua19zZXRfZXJyKHJ0bmwsIDAsIFJUTUdSUF9JUFY2X0lGSU5GTywgRUlOVkFMKTsKKwkJcmV0dXJuOworCX0KKwlORVRMSU5LX0NCKHNrYikuZHN0X2dyb3VwcyA9IFJUTUdSUF9JUFY2X0lGSU5GTzsKKwluZXRsaW5rX2Jyb2FkY2FzdChydG5sLCBza2IsIDAsIFJUTUdSUF9JUFY2X0lGSU5GTywgR0ZQX0FUT01JQyk7Cit9CisKK3N0YXRpYyBpbnQgaW5ldDZfZmlsbF9wcmVmaXgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluZXQ2X2RldiAqaWRldiwKKwkJCXN0cnVjdCBwcmVmaXhfaW5mbyAqcGluZm8sIHUzMiBwaWQsIHUzMiBzZXEsIGludCBldmVudCkKK3sKKwlzdHJ1Y3QgcHJlZml4bXNnCSpwbXNnOworCXN0cnVjdCBubG1zZ2hkciAJKm5saDsKKwl1bnNpZ25lZCBjaGFyCQkqYiA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3QgcHJlZml4X2NhY2hlaW5mbwljaTsKKworCW5saCA9IE5MTVNHX1BVVChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCpwbXNnKSk7CisJCisJaWYgKHBpZCkgCisJCW5saC0+bmxtc2dfZmxhZ3MgfD0gTkxNX0ZfTVVMVEk7CisJCisJcG1zZyA9IE5MTVNHX0RBVEEobmxoKTsKKwlwbXNnLT5wcmVmaXhfZmFtaWx5ID0gQUZfSU5FVDY7CisJcG1zZy0+cHJlZml4X2lmaW5kZXggPSBpZGV2LT5kZXYtPmlmaW5kZXg7CisJcG1zZy0+cHJlZml4X2xlbiA9IHBpbmZvLT5wcmVmaXhfbGVuOworCXBtc2ctPnByZWZpeF90eXBlID0gcGluZm8tPnR5cGU7CisJCisJcG1zZy0+cHJlZml4X2ZsYWdzID0gMDsKKwlpZiAocGluZm8tPm9ubGluaykKKwkJcG1zZy0+cHJlZml4X2ZsYWdzIHw9IElGX1BSRUZJWF9PTkxJTks7CisJaWYgKHBpbmZvLT5hdXRvY29uZikKKwkJcG1zZy0+cHJlZml4X2ZsYWdzIHw9IElGX1BSRUZJWF9BVVRPQ09ORjsKKworCVJUQV9QVVQoc2tiLCBQUkVGSVhfQUREUkVTUywgc2l6ZW9mKHBpbmZvLT5wcmVmaXgpLCAmcGluZm8tPnByZWZpeCk7CisKKwljaS5wcmVmZXJyZWRfdGltZSA9IG50b2hsKHBpbmZvLT5wcmVmZXJlZCk7CisJY2kudmFsaWRfdGltZSA9IG50b2hsKHBpbmZvLT52YWxpZCk7CisJUlRBX1BVVChza2IsIFBSRUZJWF9DQUNIRUlORk8sIHNpemVvZihjaSksICZjaSk7CisKKwlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJcmV0dXJuIHNrYi0+bGVuOworCitubG1zZ19mYWlsdXJlOgorcnRhdHRyX2ZhaWx1cmU6CisJc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGluZXQ2X3ByZWZpeF9ub3RpZnkoaW50IGV2ZW50LCBzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2LCAKKwkJCSBzdHJ1Y3QgcHJlZml4X2luZm8gKnBpbmZvKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHNpemUgPSBOTE1TR19TUEFDRShzaXplb2Yoc3RydWN0IHByZWZpeG1zZykrMTI4KTsKKworCXNrYiA9IGFsbG9jX3NrYihzaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikgeworCQluZXRsaW5rX3NldF9lcnIocnRubCwgMCwgUlRNR1JQX0lQVjZfUFJFRklYLCBFTk9CVUZTKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoaW5ldDZfZmlsbF9wcmVmaXgoc2tiLCBpZGV2LCBwaW5mbywgMCwgMCwgZXZlbnQpIDwgMCkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJbmV0bGlua19zZXRfZXJyKHJ0bmwsIDAsIFJUTUdSUF9JUFY2X1BSRUZJWCwgRUlOVkFMKTsKKwkJcmV0dXJuOworCX0KKwlORVRMSU5LX0NCKHNrYikuZHN0X2dyb3VwcyA9IFJUTUdSUF9JUFY2X1BSRUZJWDsKKwluZXRsaW5rX2Jyb2FkY2FzdChydG5sLCBza2IsIDAsIFJUTUdSUF9JUFY2X1BSRUZJWCwgR0ZQX0FUT01JQyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnRuZXRsaW5rX2xpbmsgaW5ldDZfcnRuZXRsaW5rX3RhYmxlW1JUTV9NQVggLSBSVE1fQkFTRSArIDFdID0geworCVtSVE1fR0VUTElOSyAtIFJUTV9CQVNFXSA9IHsgLmR1bXBpdAk9IGluZXQ2X2R1bXBfaWZpbmZvLCB9LAorCVtSVE1fTkVXQUREUiAtIFJUTV9CQVNFXSA9IHsgLmRvaXQJPSBpbmV0Nl9ydG1fbmV3YWRkciwgfSwKKwlbUlRNX0RFTEFERFIgLSBSVE1fQkFTRV0gPSB7IC5kb2l0CT0gaW5ldDZfcnRtX2RlbGFkZHIsIH0sCisJW1JUTV9HRVRBRERSIC0gUlRNX0JBU0VdID0geyAuZHVtcGl0CT0gaW5ldDZfZHVtcF9pZmFkZHIsIH0sCisJW1JUTV9HRVRNVUxUSUNBU1QgLSBSVE1fQkFTRV0gPSB7IC5kdW1waXQgPSBpbmV0Nl9kdW1wX2lmbWNhZGRyLCB9LAorCVtSVE1fR0VUQU5ZQ0FTVCAtIFJUTV9CQVNFXSA9IHsgLmR1bXBpdAk9IGluZXQ2X2R1bXBfaWZhY2FkZHIsIH0sCisJW1JUTV9ORVdST1VURSAtIFJUTV9CQVNFXSA9IHsgLmRvaXQJPSBpbmV0Nl9ydG1fbmV3cm91dGUsIH0sCisJW1JUTV9ERUxST1VURSAtIFJUTV9CQVNFXSA9IHsgLmRvaXQJPSBpbmV0Nl9ydG1fZGVscm91dGUsIH0sCisJW1JUTV9HRVRST1VURSAtIFJUTV9CQVNFXSA9IHsgLmRvaXQJPSBpbmV0Nl9ydG1fZ2V0cm91dGUsCisJCQkJICAgICAgLmR1bXBpdAk9IGluZXQ2X2R1bXBfZmliLCB9LAorfTsKKworc3RhdGljIHZvaWQgX19pcHY2X2lmYV9ub3RpZnkoaW50IGV2ZW50LCBzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnApCit7CisJaW5ldDZfaWZhX25vdGlmeShldmVudCA/IDogUlRNX05FV0FERFIsIGlmcCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBSVE1fTkVXQUREUjoKKwkJZHN0X2hvbGQoJmlmcC0+cnQtPnUuZHN0KTsKKwkJaWYgKGlwNl9pbnNfcnQoaWZwLT5ydCwgTlVMTCwgTlVMTCkpCisJCQlkc3RfcmVsZWFzZSgmaWZwLT5ydC0+dS5kc3QpOworCQlpZiAoaWZwLT5pZGV2LT5jbmYuZm9yd2FyZGluZykKKwkJCWFkZHJjb25mX2pvaW5fYW55Y2FzdChpZnApOworCQlicmVhazsKKwljYXNlIFJUTV9ERUxBRERSOgorCQlpZiAoaWZwLT5pZGV2LT5jbmYuZm9yd2FyZGluZykKKwkJCWFkZHJjb25mX2xlYXZlX2FueWNhc3QoaWZwKTsKKwkJYWRkcmNvbmZfbGVhdmVfc29saWN0KGlmcC0+aWRldiwgJmlmcC0+YWRkcik7CisJCWRzdF9ob2xkKCZpZnAtPnJ0LT51LmRzdCk7CisJCWlmIChpcDZfZGVsX3J0KGlmcC0+cnQsIE5VTEwsIE5VTEwpKQorCQkJZHN0X2ZyZWUoJmlmcC0+cnQtPnUuZHN0KTsKKwkJZWxzZQorCQkJZHN0X3JlbGVhc2UoJmlmcC0+cnQtPnUuZHN0KTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBpcHY2X2lmYV9ub3RpZnkoaW50IGV2ZW50LCBzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnApCit7CisJcmVhZF9sb2NrX2JoKCZhZGRyY29uZl9sb2NrKTsKKwlpZiAobGlrZWx5KGlmcC0+aWRldi0+ZGVhZCA9PSAwKSkKKwkJX19pcHY2X2lmYV9ub3RpZnkoZXZlbnQsIGlmcCk7CisJcmVhZF91bmxvY2tfYmgoJmFkZHJjb25mX2xvY2spOworfQorCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCitzdGF0aWMKK2ludCBhZGRyY29uZl9zeXNjdGxfZm9yd2FyZChjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqIGZpbHAsCisJCQkgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgKnZhbHAgPSBjdGwtPmRhdGE7CisJaW50IHZhbCA9ICp2YWxwOworCWludCByZXQ7CisKKwlyZXQgPSBwcm9jX2RvaW50dmVjKGN0bCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisKKwlpZiAod3JpdGUgJiYgdmFscCAhPSAmaXB2Nl9kZXZjb25mX2RmbHQuZm9yd2FyZGluZykgeworCQlpZiAodmFscCAhPSAmaXB2Nl9kZXZjb25mLmZvcndhcmRpbmcpIHsKKwkJCWlmICgoISp2YWxwKSBeICghdmFsKSkgeworCQkJCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSAoc3RydWN0IGluZXQ2X2RldiAqKWN0bC0+ZXh0cmExOworCQkJCWlmIChpZGV2ID09IE5VTEwpCisJCQkJCXJldHVybiByZXQ7CisJCQkJZGV2X2ZvcndhcmRfY2hhbmdlKGlkZXYpOworCQkJfQorCQl9IGVsc2UgeworCQkJaXB2Nl9kZXZjb25mX2RmbHQuZm9yd2FyZGluZyA9IGlwdjZfZGV2Y29uZi5mb3J3YXJkaW5nOworCQkJYWRkcmNvbmZfZm9yd2FyZF9jaGFuZ2UoKTsKKwkJfQorCQlpZiAoKnZhbHApCisJCQlydDZfcHVyZ2VfZGZsdF9yb3V0ZXJzKCk7CisJfQorCisgICAgICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRkcmNvbmZfc3lzY3RsX2ZvcndhcmRfc3RyYXRlZ3koY3RsX3RhYmxlICp0YWJsZSwgCisJCQkJCSAgICBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKKwkJCQkJICAgIHZvaWQgX191c2VyICpvbGR2YWwsCisJCQkJCSAgICBzaXplX3QgX191c2VyICpvbGRsZW5wLAorCQkJCQkgICAgdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbiwKKwkJCQkJICAgIHZvaWQgKipjb250ZXh0KQoreworCWludCAqdmFscCA9IHRhYmxlLT5kYXRhOworCWludCBuZXc7CisKKwlpZiAoIW5ld3ZhbCB8fCAhbmV3bGVuKQorCQlyZXR1cm4gMDsKKwlpZiAobmV3bGVuICE9IHNpemVvZihpbnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZ2V0X3VzZXIobmV3LCAoaW50IF9fdXNlciAqKW5ld3ZhbCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChuZXcgPT0gKnZhbHApCisJCXJldHVybiAwOworCWlmIChvbGR2YWwgJiYgb2xkbGVucCkgeworCQlzaXplX3QgbGVuOworCQlpZiAoZ2V0X3VzZXIobGVuLCBvbGRsZW5wKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAobGVuKSB7CisJCQlpZiAobGVuID4gdGFibGUtPm1heGxlbikKKwkJCQlsZW4gPSB0YWJsZS0+bWF4bGVuOworCQkJaWYgKGNvcHlfdG9fdXNlcihvbGR2YWwsIHZhbHAsIGxlbikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAocHV0X3VzZXIobGVuLCBvbGRsZW5wKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKworCWlmICh2YWxwICE9ICZpcHY2X2RldmNvbmZfZGZsdC5mb3J3YXJkaW5nKSB7CisJCWlmICh2YWxwICE9ICZpcHY2X2RldmNvbmYuZm9yd2FyZGluZykgeworCQkJc3RydWN0IGluZXQ2X2RldiAqaWRldiA9IChzdHJ1Y3QgaW5ldDZfZGV2ICopdGFibGUtPmV4dHJhMTsKKwkJCWludCBjaGFuZ2VkOworCQkJaWYgKHVubGlrZWx5KGlkZXYgPT0gTlVMTCkpCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQljaGFuZ2VkID0gKCEqdmFscCkgXiAoIW5ldyk7CisJCQkqdmFscCA9IG5ldzsKKwkJCWlmIChjaGFuZ2VkKQorCQkJCWRldl9mb3J3YXJkX2NoYW5nZShpZGV2KTsKKwkJfSBlbHNlIHsKKwkJCSp2YWxwID0gbmV3OworCQkJYWRkcmNvbmZfZm9yd2FyZF9jaGFuZ2UoKTsKKwkJfQorCisJCWlmICgqdmFscCkKKwkJCXJ0Nl9wdXJnZV9kZmx0X3JvdXRlcnMoKTsKKwl9IGVsc2UKKwkJKnZhbHAgPSBuZXc7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBhZGRyY29uZl9zeXNjdGxfdGFibGUKK3sKKwlzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqc3lzY3RsX2hlYWRlcjsKKwljdGxfdGFibGUgYWRkcmNvbmZfdmFyc1tfX05FVF9JUFY2X01BWF07CisJY3RsX3RhYmxlIGFkZHJjb25mX2RldlsyXTsKKwljdGxfdGFibGUgYWRkcmNvbmZfY29uZl9kaXJbMl07CisJY3RsX3RhYmxlIGFkZHJjb25mX3Byb3RvX2RpclsyXTsKKwljdGxfdGFibGUgYWRkcmNvbmZfcm9vdF9kaXJbMl07Cit9IGFkZHJjb25mX3N5c2N0bCA9IHsKKwkuc3lzY3RsX2hlYWRlciA9IE5VTEwsCisJLmFkZHJjb25mX3ZhcnMgPSB7CisgICAgICAgIAl7CisJCQkuY3RsX25hbWUJPQlORVRfSVBWNl9GT1JXQVJESU5HLAorCQkJLnByb2NuYW1lCT0JImZvcndhcmRpbmciLAorICAgICAgICAgCQkuZGF0YQkJPQkmaXB2Nl9kZXZjb25mLmZvcndhcmRpbmcsCisJCQkubWF4bGVuCQk9CXNpemVvZihpbnQpLAorCQkJLm1vZGUJCT0JMDY0NCwKKyAgICAgICAgIAkJLnByb2NfaGFuZGxlcgk9CSZhZGRyY29uZl9zeXNjdGxfZm9yd2FyZCwKKwkJCS5zdHJhdGVneQk9CSZhZGRyY29uZl9zeXNjdGxfZm9yd2FyZF9zdHJhdGVneSwKKwkJfSwKKwkJeworCQkJLmN0bF9uYW1lCT0JTkVUX0lQVjZfSE9QX0xJTUlULAorCQkJLnByb2NuYW1lCT0JImhvcF9saW1pdCIsCisgICAgICAgICAJCS5kYXRhCQk9CSZpcHY2X2RldmNvbmYuaG9wX2xpbWl0LAorCQkJLm1heGxlbgkJPQlzaXplb2YoaW50KSwKKwkJCS5tb2RlCQk9CTA2NDQsCisJCQkucHJvY19oYW5kbGVyCT0JcHJvY19kb2ludHZlYywKKwkJfSwKKwkJeworCQkJLmN0bF9uYW1lCT0JTkVUX0lQVjZfTVRVLAorCQkJLnByb2NuYW1lCT0JIm10dSIsCisJCQkuZGF0YQkJPQkmaXB2Nl9kZXZjb25mLm10dTYsCisgICAgICAgICAJCS5tYXhsZW4JCT0Jc2l6ZW9mKGludCksCisJCQkubW9kZQkJPQkwNjQ0LAorICAgICAgICAgCQkucHJvY19oYW5kbGVyCT0JJnByb2NfZG9pbnR2ZWMsCisJCX0sCisJCXsKKwkJCS5jdGxfbmFtZQk9CU5FVF9JUFY2X0FDQ0VQVF9SQSwKKwkJCS5wcm9jbmFtZQk9CSJhY2NlcHRfcmEiLAorICAgICAgICAgCQkuZGF0YQkJPQkmaXB2Nl9kZXZjb25mLmFjY2VwdF9yYSwKKwkJCS5tYXhsZW4JCT0Jc2l6ZW9mKGludCksCisJCQkubW9kZQkJPQkwNjQ0LAorICAgICAgICAgCQkucHJvY19oYW5kbGVyCT0JJnByb2NfZG9pbnR2ZWMsCisJCX0sCisJCXsKKwkJCS5jdGxfbmFtZQk9CU5FVF9JUFY2X0FDQ0VQVF9SRURJUkVDVFMsCisJCQkucHJvY25hbWUJPQkiYWNjZXB0X3JlZGlyZWN0cyIsCisgICAgICAgICAJCS5kYXRhCQk9CSZpcHY2X2RldmNvbmYuYWNjZXB0X3JlZGlyZWN0cywKKwkJCS5tYXhsZW4JCT0Jc2l6ZW9mKGludCksCisJCQkubW9kZQkJPQkwNjQ0LAorICAgICAgICAgCQkucHJvY19oYW5kbGVyCT0JJnByb2NfZG9pbnR2ZWMsCisJCX0sCisJCXsKKwkJCS5jdGxfbmFtZQk9CU5FVF9JUFY2X0FVVE9DT05GLAorCQkJLnByb2NuYW1lCT0JImF1dG9jb25mIiwKKyAgICAgICAgIAkJLmRhdGEJCT0JJmlwdjZfZGV2Y29uZi5hdXRvY29uZiwKKwkJCS5tYXhsZW4JCT0Jc2l6ZW9mKGludCksCisJCQkubW9kZQkJPQkwNjQ0LAorICAgICAgICAgCQkucHJvY19oYW5kbGVyCT0JJnByb2NfZG9pbnR2ZWMsCisJCX0sCisJCXsKKwkJCS5jdGxfbmFtZQk9CU5FVF9JUFY2X0RBRF9UUkFOU01JVFMsCisJCQkucHJvY25hbWUJPQkiZGFkX3RyYW5zbWl0cyIsCisgICAgICAgICAJCS5kYXRhCQk9CSZpcHY2X2RldmNvbmYuZGFkX3RyYW5zbWl0cywKKwkJCS5tYXhsZW4JCT0Jc2l6ZW9mKGludCksCisJCQkubW9kZQkJPQkwNjQ0LAorICAgICAgICAgCQkucHJvY19oYW5kbGVyCT0JJnByb2NfZG9pbnR2ZWMsCisJCX0sCisJCXsKKwkJCS5jdGxfbmFtZQk9CU5FVF9JUFY2X1JUUl9TT0xJQ0lUUywKKwkJCS5wcm9jbmFtZQk9CSJyb3V0ZXJfc29saWNpdGF0aW9ucyIsCisgICAgICAgICAJCS5kYXRhCQk9CSZpcHY2X2RldmNvbmYucnRyX3NvbGljaXRzLAorCQkJLm1heGxlbgkJPQlzaXplb2YoaW50KSwKKwkJCS5tb2RlCQk9CTA2NDQsCisgICAgICAgICAJCS5wcm9jX2hhbmRsZXIJPQkmcHJvY19kb2ludHZlYywKKwkJfSwKKwkJeworCQkJLmN0bF9uYW1lCT0JTkVUX0lQVjZfUlRSX1NPTElDSVRfSU5URVJWQUwsCisJCQkucHJvY25hbWUJPQkicm91dGVyX3NvbGljaXRhdGlvbl9pbnRlcnZhbCIsCisgICAgICAgICAJCS5kYXRhCQk9CSZpcHY2X2RldmNvbmYucnRyX3NvbGljaXRfaW50ZXJ2YWwsCisJCQkubWF4bGVuCQk9CXNpemVvZihpbnQpLAorCQkJLm1vZGUJCT0JMDY0NCwKKyAgICAgICAgIAkJLnByb2NfaGFuZGxlcgk9CSZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJCQkuc3RyYXRlZ3kJPQkmc3lzY3RsX2ppZmZpZXMsCisJCX0sCisJCXsKKwkJCS5jdGxfbmFtZQk9CU5FVF9JUFY2X1JUUl9TT0xJQ0lUX0RFTEFZLAorCQkJLnByb2NuYW1lCT0JInJvdXRlcl9zb2xpY2l0YXRpb25fZGVsYXkiLAorICAgICAgICAgCQkuZGF0YQkJPQkmaXB2Nl9kZXZjb25mLnJ0cl9zb2xpY2l0X2RlbGF5LAorCQkJLm1heGxlbgkJPQlzaXplb2YoaW50KSwKKwkJCS5tb2RlCQk9CTA2NDQsCisgICAgICAgICAJCS5wcm9jX2hhbmRsZXIJPQkmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCQkJLnN0cmF0ZWd5CT0JJnN5c2N0bF9qaWZmaWVzLAorCQl9LAorCQl7CisJCQkuY3RsX25hbWUJPQlORVRfSVBWNl9GT1JDRV9NTERfVkVSU0lPTiwKKwkJCS5wcm9jbmFtZQk9CSJmb3JjZV9tbGRfdmVyc2lvbiIsCisgICAgICAgICAJCS5kYXRhCQk9CSZpcHY2X2RldmNvbmYuZm9yY2VfbWxkX3ZlcnNpb24sCisJCQkubWF4bGVuCQk9CXNpemVvZihpbnQpLAorCQkJLm1vZGUJCT0JMDY0NCwKKyAgICAgICAgIAkJLnByb2NfaGFuZGxlcgk9CSZwcm9jX2RvaW50dmVjLAorCQl9LAorI2lmZGVmIENPTkZJR19JUFY2X1BSSVZBQ1kKKwkJeworCQkJLmN0bF9uYW1lCT0JTkVUX0lQVjZfVVNFX1RFTVBBRERSLAorCQkJLnByb2NuYW1lCT0JInVzZV90ZW1wYWRkciIsCisJIAkJLmRhdGEJCT0JJmlwdjZfZGV2Y29uZi51c2VfdGVtcGFkZHIsCisJCQkubWF4bGVuCQk9CXNpemVvZihpbnQpLAorCQkJLm1vZGUJCT0JMDY0NCwKKwkgCQkucHJvY19oYW5kbGVyCT0JJnByb2NfZG9pbnR2ZWMsCisJCX0sCisJCXsKKwkJCS5jdGxfbmFtZQk9CU5FVF9JUFY2X1RFTVBfVkFMSURfTEZULAorCQkJLnByb2NuYW1lCT0JInRlbXBfdmFsaWRfbGZ0IiwKKwkgCQkuZGF0YQkJPQkmaXB2Nl9kZXZjb25mLnRlbXBfdmFsaWRfbGZ0LAorCQkJLm1heGxlbgkJPQlzaXplb2YoaW50KSwKKwkJCS5tb2RlCQk9CTA2NDQsCisJIAkJLnByb2NfaGFuZGxlcgk9CSZwcm9jX2RvaW50dmVjLAorCQl9LAorCQl7CisJCQkuY3RsX25hbWUJPQlORVRfSVBWNl9URU1QX1BSRUZFUkVEX0xGVCwKKwkJCS5wcm9jbmFtZQk9CSJ0ZW1wX3ByZWZlcmVkX2xmdCIsCisJIAkJLmRhdGEJCT0JJmlwdjZfZGV2Y29uZi50ZW1wX3ByZWZlcmVkX2xmdCwKKwkJCS5tYXhsZW4JCT0Jc2l6ZW9mKGludCksCisJCQkubW9kZQkJPQkwNjQ0LAorCSAJCS5wcm9jX2hhbmRsZXIJPQkmcHJvY19kb2ludHZlYywKKwkJfSwKKwkJeworCQkJLmN0bF9uYW1lCT0JTkVUX0lQVjZfUkVHRU5fTUFYX1JFVFJZLAorCQkJLnByb2NuYW1lCT0JInJlZ2VuX21heF9yZXRyeSIsCisJIAkJLmRhdGEJCT0JJmlwdjZfZGV2Y29uZi5yZWdlbl9tYXhfcmV0cnksCisJCQkubWF4bGVuCQk9CXNpemVvZihpbnQpLAorCQkJLm1vZGUJCT0JMDY0NCwKKwkgCQkucHJvY19oYW5kbGVyCT0JJnByb2NfZG9pbnR2ZWMsCisJCX0sCisJCXsKKwkJCS5jdGxfbmFtZQk9CU5FVF9JUFY2X01BWF9ERVNZTkNfRkFDVE9SLAorCQkJLnByb2NuYW1lCT0JIm1heF9kZXN5bmNfZmFjdG9yIiwKKwkgCQkuZGF0YQkJPQkmaXB2Nl9kZXZjb25mLm1heF9kZXN5bmNfZmFjdG9yLAorCQkJLm1heGxlbgkJPQlzaXplb2YoaW50KSwKKwkJCS5tb2RlCQk9CTA2NDQsCisJIAkJLnByb2NfaGFuZGxlcgk9CSZwcm9jX2RvaW50dmVjLAorCQl9LAorI2VuZGlmCisJCXsKKwkJCS5jdGxfbmFtZQk9CU5FVF9JUFY2X01BWF9BRERSRVNTRVMsCisJCQkucHJvY25hbWUJPQkibWF4X2FkZHJlc3NlcyIsCisJCQkuZGF0YQkJPQkmaXB2Nl9kZXZjb25mLm1heF9hZGRyZXNzZXMsCisJCQkubWF4bGVuCQk9CXNpemVvZihpbnQpLAorCQkJLm1vZGUJCT0JMDY0NCwKKwkJCS5wcm9jX2hhbmRsZXIJPQkmcHJvY19kb2ludHZlYywKKwkJfSwKKwkJeworCQkJLmN0bF9uYW1lCT0JMCwJLyogc2VudGluZWwgKi8KKwkJfQorCX0sCisJLmFkZHJjb25mX2RldiA9IHsKKwkJeworCQkJLmN0bF9uYW1lCT0JTkVUX1BST1RPX0NPTkZfQUxMLAorCQkJLnByb2NuYW1lCT0JImFsbCIsCisJCQkubW9kZQkJPQkwNTU1LAorCQkJLmNoaWxkCQk9CWFkZHJjb25mX3N5c2N0bC5hZGRyY29uZl92YXJzLAorCQl9LAorCQl7CisJCQkuY3RsX25hbWUJPQkwLAkvKiBzZW50aW5lbCAqLworCQl9CisJfSwKKwkuYWRkcmNvbmZfY29uZl9kaXIgPSB7CisJCXsKKwkJCS5jdGxfbmFtZQk9CU5FVF9JUFY2X0NPTkYsCisJCQkucHJvY25hbWUJPQkiY29uZiIsCisJCQkubW9kZQkJPQkwNTU1LAorCQkJLmNoaWxkCQk9CWFkZHJjb25mX3N5c2N0bC5hZGRyY29uZl9kZXYsCisJCX0sCisJCXsKKwkJCS5jdGxfbmFtZQk9CTAsCS8qIHNlbnRpbmVsICovCisJCX0KKwl9LAorCS5hZGRyY29uZl9wcm90b19kaXIgPSB7CisJCXsKKwkJCS5jdGxfbmFtZQk9CU5FVF9JUFY2LAorCQkJLnByb2NuYW1lCT0JImlwdjYiLAorCQkJLm1vZGUJCT0JMDU1NSwKKwkJCS5jaGlsZAkJPQlhZGRyY29uZl9zeXNjdGwuYWRkcmNvbmZfY29uZl9kaXIsCisJCX0sCisJCXsKKwkJCS5jdGxfbmFtZQk9CTAsCS8qIHNlbnRpbmVsICovCisJCX0KKwl9LAorCS5hZGRyY29uZl9yb290X2RpciA9IHsKKwkJeworCQkJLmN0bF9uYW1lCT0JQ1RMX05FVCwKKwkJCS5wcm9jbmFtZQk9CSJuZXQiLAorCQkJLm1vZGUJCT0JMDU1NSwKKwkJCS5jaGlsZAkJPQlhZGRyY29uZl9zeXNjdGwuYWRkcmNvbmZfcHJvdG9fZGlyLAorCQl9LAorCQl7CisJCQkuY3RsX25hbWUJPQkwLAkvKiBzZW50aW5lbCAqLworCQl9CisJfSwKK307CisKK3N0YXRpYyB2b2lkIGFkZHJjb25mX3N5c2N0bF9yZWdpc3RlcihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2LCBzdHJ1Y3QgaXB2Nl9kZXZjb25mICpwKQoreworCWludCBpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZGV2ID8gaWRldi0+ZGV2IDogTlVMTDsKKwlzdHJ1Y3QgYWRkcmNvbmZfc3lzY3RsX3RhYmxlICp0OworCWNoYXIgKmRldl9uYW1lID0gTlVMTDsKKworCXQgPSBrbWFsbG9jKHNpemVvZigqdCksIEdGUF9LRVJORUwpOworCWlmICh0ID09IE5VTEwpCisJCXJldHVybjsKKwltZW1jcHkodCwgJmFkZHJjb25mX3N5c2N0bCwgc2l6ZW9mKCp0KSk7CisJZm9yIChpPTA7IHQtPmFkZHJjb25mX3ZhcnNbaV0uZGF0YTsgaSsrKSB7CisJCXQtPmFkZHJjb25mX3ZhcnNbaV0uZGF0YSArPSAoY2hhciopcCAtIChjaGFyKikmaXB2Nl9kZXZjb25mOworCQl0LT5hZGRyY29uZl92YXJzW2ldLmRlID0gTlVMTDsKKwkJdC0+YWRkcmNvbmZfdmFyc1tpXS5leHRyYTEgPSBpZGV2OyAvKiBlbWJlZGRlZDsgbm8gcmVmICovCisJfQorCWlmIChkZXYpIHsKKwkJZGV2X25hbWUgPSBkZXYtPm5hbWU7IAorCQl0LT5hZGRyY29uZl9kZXZbMF0uY3RsX25hbWUgPSBkZXYtPmlmaW5kZXg7CisJfSBlbHNlIHsKKwkJZGV2X25hbWUgPSAiZGVmYXVsdCI7CisJCXQtPmFkZHJjb25mX2RldlswXS5jdGxfbmFtZSA9IE5FVF9QUk9UT19DT05GX0RFRkFVTFQ7CisJfQorCisJLyogCisJICogTWFrZSBhIGNvcHkgb2YgZGV2X25hbWUsIGJlY2F1c2UgJy5wcm9jbmFtZScgaXMgcmVnYXJkZWQgYXMgY29uc3QgCisJICogYnkgc3lzY3RsIGFuZCB3ZSB3b3VsZG4ndCB3YW50IGFueW9uZSB0byBjaGFuZ2UgaXQgdW5kZXIgb3VyIGZlZXQKKwkgKiAoc2VlIFNJT0NTSUZOQU1FKS4KKwkgKi8JCisJZGV2X25hbWUgPSBuZXRfc3lzY3RsX3N0cmR1cChkZXZfbmFtZSk7CisJaWYgKCFkZXZfbmFtZSkKKwkgICAgZ290byBmcmVlOworCisJdC0+YWRkcmNvbmZfZGV2WzBdLnByb2NuYW1lID0gZGV2X25hbWU7CisKKwl0LT5hZGRyY29uZl9kZXZbMF0uY2hpbGQgPSB0LT5hZGRyY29uZl92YXJzOworCXQtPmFkZHJjb25mX2RldlswXS5kZSA9IE5VTEw7CisJdC0+YWRkcmNvbmZfY29uZl9kaXJbMF0uY2hpbGQgPSB0LT5hZGRyY29uZl9kZXY7CisJdC0+YWRkcmNvbmZfY29uZl9kaXJbMF0uZGUgPSBOVUxMOworCXQtPmFkZHJjb25mX3Byb3RvX2RpclswXS5jaGlsZCA9IHQtPmFkZHJjb25mX2NvbmZfZGlyOworCXQtPmFkZHJjb25mX3Byb3RvX2RpclswXS5kZSA9IE5VTEw7CisJdC0+YWRkcmNvbmZfcm9vdF9kaXJbMF0uY2hpbGQgPSB0LT5hZGRyY29uZl9wcm90b19kaXI7CisJdC0+YWRkcmNvbmZfcm9vdF9kaXJbMF0uZGUgPSBOVUxMOworCisJdC0+c3lzY3RsX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZSh0LT5hZGRyY29uZl9yb290X2RpciwgMCk7CisJaWYgKHQtPnN5c2N0bF9oZWFkZXIgPT0gTlVMTCkKKwkJZ290byBmcmVlX3Byb2NuYW1lOworCWVsc2UKKwkJcC0+c3lzY3RsID0gdDsKKwlyZXR1cm47CisKKwkvKiBlcnJvciBwYXRoICovCisgZnJlZV9wcm9jbmFtZToKKwlrZnJlZShkZXZfbmFtZSk7CisgZnJlZToKKwlrZnJlZSh0KTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgYWRkcmNvbmZfc3lzY3RsX3VucmVnaXN0ZXIoc3RydWN0IGlwdjZfZGV2Y29uZiAqcCkKK3sKKwlpZiAocC0+c3lzY3RsKSB7CisJCXN0cnVjdCBhZGRyY29uZl9zeXNjdGxfdGFibGUgKnQgPSBwLT5zeXNjdGw7CisJCXAtPnN5c2N0bCA9IE5VTEw7CisJCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHQtPnN5c2N0bF9oZWFkZXIpOworCQlrZnJlZSh0LT5hZGRyY29uZl9kZXZbMF0ucHJvY25hbWUpOworCQlrZnJlZSh0KTsKKwl9Cit9CisKKworI2VuZGlmCisKKy8qCisgKiAgICAgIERldmljZSBub3RpZmllcgorICovCisKK2ludCByZWdpc3Rlcl9pbmV0NmFkZHJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKyAgICAgICAgcmV0dXJuIG5vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZpbmV0NmFkZHJfY2hhaW4sIG5iKTsKK30KKworaW50IHVucmVnaXN0ZXJfaW5ldDZhZGRyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisgICAgICAgIHJldHVybiBub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZpbmV0NmFkZHJfY2hhaW4sbmIpOworfQorCisvKgorICoJSW5pdCAvIGNsZWFudXAgY29kZQorICovCisKK2ludCBfX2luaXQgYWRkcmNvbmZfaW5pdCh2b2lkKQoreworCWludCBlcnIgPSAwOworCisJLyogVGhlIGFkZHJjb25mIG5ldGRldiBub3RpZmllciByZXF1aXJlcyB0aGF0IGxvb3BiYWNrX2RldgorCSAqIGhhcyBpdCdzIGlwdjYgcHJpdmF0ZSBpbmZvcm1hdGlvbiBhbGxvY2F0ZWQgYW5kIHNldHVwCisJICogYmVmb3JlIGl0IGNhbiBicmluZyB1cCBhbmQgZ2l2ZSBsaW5rLWxvY2FsIGFkZHJlc3NlcworCSAqIHRvIG90aGVyIGRldmljZXMgd2hpY2ggYXJlIHVwLgorCSAqCisJICogVW5mb3J0dW5hdGVseSwgbG9vcGJhY2tfZGV2IGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgZmlyc3QKKwkgKiBlbnRyeSBpbiB0aGUgZ2xvYmFsIGRldl9iYXNlIGxpc3Qgb2YgbmV0IGRldmljZXMuICBJbiBmYWN0LAorCSAqIGl0IGlzIGxpa2VseSB0byBiZSB0aGUgdmVyeSBsYXN0IGVudHJ5IG9uIHRoYXQgbGlzdC4KKwkgKiBTbyB0aGlzIGNhdXNlcyB0aGUgbm90aWZpZXIgcmVnaXN0cnkgYmVsb3cgdG8gdHJ5IGFuZAorCSAqIGdpdmUgbGluay1sb2NhbCBhZGRyZXNzZXMgdG8gYWxsIGRldmljZXMgYmVzaWRlcyBsb29wYmFja19kZXYKKwkgKiBmaXJzdCwgdGhlbiBsb29wYmFja19kZXYsIHdoaWNoIGNhc2VzIGFsbCB0aGUgbm9uLWxvb3BiYWNrX2RldgorCSAqIGRldmljZXMgdG8gZmFpbCB0byBnZXQgYSBsaW5rLWxvY2FsIGFkZHJlc3MuCisJICoKKwkgKiBTbywgYXMgYSB0ZW1wb3JhcnkgZml4LCBhbGxvY2F0ZSB0aGUgaXB2NiBzdHJ1Y3R1cmUgZm9yCisJICogbG9vcGJhY2tfZGV2IGZpcnN0IGJ5IGhhbmQuCisJICogTG9uZ2VyIHRlcm0sIGFsbCBvZiB0aGUgZGVwZW5kZW5jaWVzIGlwdjYgaGFzIHVwb24gdGhlIGxvb3BiYWNrCisJICogZGV2aWNlIGFuZCBpdCBiZWluZyB1cCBzaG91bGQgYmUgcmVtb3ZlZC4KKwkgKi8KKwlydG5sX2xvY2soKTsKKwlpZiAoIWlwdjZfYWRkX2RldigmbG9vcGJhY2tfZGV2KSkKKwkJZXJyID0gLUVOT01FTTsKKwlydG5sX3VubG9jaygpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmlwdjZfZGV2X25vdGYpOworCisjaWZkZWYgQ09ORklHX0lQVjZfUFJJVkFDWQorCW1kNV90Zm0gPSBjcnlwdG9fYWxsb2NfdGZtKCJtZDUiLCAwKTsKKwlpZiAodW5saWtlbHkobWQ1X3RmbSA9PSBOVUxMKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJImZhaWxlZCB0byBsb2FkIHRyYW5zZm9ybSBmb3IgbWQ1XG4iKTsKKyNlbmRpZgorCisJYWRkcmNvbmZfdmVyaWZ5KDApOworCXJ0bmV0bGlua19saW5rc1tQRl9JTkVUNl0gPSBpbmV0Nl9ydG5ldGxpbmtfdGFibGU7CisjaWZkZWYgQ09ORklHX1NZU0NUTAorCWFkZHJjb25mX3N5c2N0bC5zeXNjdGxfaGVhZGVyID0KKwkJcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGFkZHJjb25mX3N5c2N0bC5hZGRyY29uZl9yb290X2RpciwgMCk7CisJYWRkcmNvbmZfc3lzY3RsX3JlZ2lzdGVyKE5VTEwsICZpcHY2X2RldmNvbmZfZGZsdCk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCit2b2lkIF9fZXhpdCBhZGRyY29uZl9jbGVhbnVwKHZvaWQpCit7CisgCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CisgCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmYTsKKwlpbnQgaTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZpcHY2X2Rldl9ub3RmKTsKKworCXJ0bmV0bGlua19saW5rc1tQRl9JTkVUNl0gPSBOVUxMOworI2lmZGVmIENPTkZJR19TWVNDVEwKKwlhZGRyY29uZl9zeXNjdGxfdW5yZWdpc3RlcigmaXB2Nl9kZXZjb25mX2RmbHQpOworCWFkZHJjb25mX3N5c2N0bF91bnJlZ2lzdGVyKCZpcHY2X2RldmNvbmYpOworI2VuZGlmCisKKwlydG5sX2xvY2soKTsKKworCS8qCisJICoJY2xlYW4gZGV2IGxpc3QuCisJICovCisKKwlmb3IgKGRldj1kZXZfYmFzZTsgZGV2OyBkZXY9ZGV2LT5uZXh0KSB7CisJCWlmICgoaWRldiA9IF9faW42X2Rldl9nZXQoZGV2KSkgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlhZGRyY29uZl9pZmRvd24oZGV2LCAxKTsKKwl9CisJYWRkcmNvbmZfaWZkb3duKCZsb29wYmFja19kZXYsIDIpOworCisJLyoKKwkgKglDaGVjayBoYXNoIHRhYmxlLgorCSAqLworCisJd3JpdGVfbG9ja19iaCgmYWRkcmNvbmZfaGFzaF9sb2NrKTsKKwlmb3IgKGk9MDsgaSA8IElONl9BRERSX0hTSVpFOyBpKyspIHsKKwkJZm9yIChpZmE9aW5ldDZfYWRkcl9sc3RbaV07IGlmYTsgKSB7CisJCQlzdHJ1Y3QgaW5ldDZfaWZhZGRyICpiaWZhOworCisJCQliaWZhID0gaWZhOworCQkJaWZhID0gaWZhLT5sc3RfbmV4dDsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJidWc6IElQdjYgYWRkcmVzcyBsZWFrYWdlIGRldGVjdGVkOiBpZmE9JXBcbiIsIGJpZmEpOworCQkJLyogRG8gbm90IGZyZWUgaXQ7IHNvbWV0aGluZyBpcyB3cm9uZy4KKwkJCSAgIE5vdyB3ZSBjYW4gaW52ZXN0aWdhdGUgaXQgd2l0aCBkZWJ1Z2dlci4KKwkJCSAqLworCQl9CisJfQorCXdyaXRlX3VubG9ja19iaCgmYWRkcmNvbmZfaGFzaF9sb2NrKTsKKworCWRlbF90aW1lcigmYWRkcl9jaGtfdGltZXIpOworCisJcnRubF91bmxvY2soKTsKKworI2lmZGVmIENPTkZJR19JUFY2X1BSSVZBQ1kKKwlpZiAobGlrZWx5KG1kNV90Zm0gIT0gTlVMTCkpIHsKKwkJY3J5cHRvX2ZyZWVfdGZtKG1kNV90Zm0pOworCQltZDVfdGZtID0gTlVMTDsKKwl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJcHJvY19uZXRfcmVtb3ZlKCJpZl9pbmV0NiIpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9hZl9pbmV0Ni5jIGIvbmV0L2lwdjYvYWZfaW5ldDYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjhiMTE3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvYWZfaW5ldDYuYwpAQCAtMCwwICsxLDg2NyBAQAorLyoKKyAqCVBGX0lORVQ2IHNvY2tldCBwcm90b2NvbCBmYW1pbHkKKyAqCUxpbnV4IElORVQ2IGltcGxlbWVudGF0aW9uIAorICoKKyAqCUF1dGhvcnM6CisgKglQZWRybyBSb3F1ZQkJPHJvcXVlQGRpLmZjLnVsLnB0PgkKKyAqCisgKglBZGFwdGVkIGZyb20gbGludXgvbmV0L2lwdjQvYWZfaW5ldC5jCisgKgorICoJJElkOiBhZl9pbmV0Ni5jLHYgMS42NiAyMDAyLzAyLzAxIDIyOjAxOjA0IGRhdmVtIEV4cCAkCisgKgorICogCUZpeGVzOgorICoJcGlnZ3ksIEthcmwgS251dHNvbgk6CVNvY2tldCBwcm90b2NvbCB0YWJsZQorICogCUhpZGVha2kgWU9TSElGVUpJCToJc2luNl9zY29wZV9pZCBzdXBwb3J0CisgKiAJQXJuYWxkbyBNZWxvCQk6IAljaGVjayBwcm9jX25ldF9jcmVhdGUgcmV0dXJuLCBjbGVhbnVwcworICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvdWRwLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPG5ldC9pcGlwLmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L2luZXRfY29tbW9uLmg+CisjaW5jbHVkZSA8bmV0L3RyYW5zcF92Ni5oPgorI2luY2x1ZGUgPG5ldC9pcDZfcm91dGUuaD4KKyNpbmNsdWRlIDxuZXQvYWRkcmNvbmYuaD4KKyNpZmRlZiBDT05GSUdfSVBWNl9UVU5ORUwKKyNpbmNsdWRlIDxuZXQvaXA2X3R1bm5lbC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworTU9EVUxFX0FVVEhPUigiQ2FzdCBvZiBkb3plbnMiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVB2NiBwcm90b2NvbCBzdGFjayBmb3IgTGludXgiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogSVB2NiBwcm9jZnMgZ29vZGllcy4uLiAqLworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK2V4dGVybiBpbnQgcmF3Nl9wcm9jX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCByYXc2X3Byb2NfZXhpdCh2b2lkKTsKK2V4dGVybiBpbnQgdGNwNl9wcm9jX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCB0Y3A2X3Byb2NfZXhpdCh2b2lkKTsKK2V4dGVybiBpbnQgdWRwNl9wcm9jX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCB1ZHA2X3Byb2NfZXhpdCh2b2lkKTsKK2V4dGVybiBpbnQgaXB2Nl9taXNjX3Byb2NfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGlwdjZfbWlzY19wcm9jX2V4aXQodm9pZCk7CitleHRlcm4gaW50IGFjNl9wcm9jX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBhYzZfcHJvY19leGl0KHZvaWQpOworZXh0ZXJuIGludCBpZjZfcHJvY19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgaWY2X3Byb2NfZXhpdCh2b2lkKTsKKyNlbmRpZgorCitpbnQgc3lzY3RsX2lwdjZfYmluZHY2b25seTsKKworI2lmZGVmIElORVRfUkVGQ05UX0RFQlVHCithdG9taWNfdCBpbmV0Nl9zb2NrX25yOworI2VuZGlmCisKKy8qIFRoZSBpbmV0c3cgdGFibGUgY29udGFpbnMgZXZlcnl0aGluZyB0aGF0IGluZXRfY3JlYXRlIG5lZWRzIHRvCisgKiBidWlsZCBhIG5ldyBzb2NrZXQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGluZXRzdzZbU09DS19NQVhdOworc3RhdGljIERFRklORV9TUElOTE9DSyhpbmV0c3c2X2xvY2spOworCitzdGF0aWMgdm9pZCBpbmV0Nl9zb2NrX2Rlc3RydWN0KHN0cnVjdCBzb2NrICpzaykKK3sKKwlpbmV0X3NvY2tfZGVzdHJ1Y3Qoc2spOworCisjaWZkZWYgSU5FVF9SRUZDTlRfREVCVUcKKwlhdG9taWNfZGVjKCZpbmV0Nl9zb2NrX25yKTsKKyNlbmRpZgorfQorCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgaXB2Nl9waW5mbyAqaW5ldDZfc2tfZ2VuZXJpYyhzdHJ1Y3Qgc29jayAqc2spCit7CisJY29uc3QgaW50IG9mZnNldCA9IHNrLT5za19wcm90LT5vYmpfc2l6ZSAtIHNpemVvZihzdHJ1Y3QgaXB2Nl9waW5mbyk7CisKKwlyZXR1cm4gKHN0cnVjdCBpcHY2X3BpbmZvICopKCgodTggKilzaykgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW50IGluZXQ2X2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgcHJvdG9jb2wpCit7CisJc3RydWN0IGluZXRfc29jayAqaW5ldDsKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnA7CisJc3RydWN0IHNvY2sgKnNrOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJc3RydWN0IGluZXRfcHJvdG9zdyAqYW5zd2VyOworCXN0cnVjdCBwcm90byAqYW5zd2VyX3Byb3Q7CisJdW5zaWduZWQgY2hhciBhbnN3ZXJfZmxhZ3M7CisJY2hhciBhbnN3ZXJfbm9fY2hlY2s7CisJaW50IHJjOworCisJLyogTG9vayBmb3IgdGhlIHJlcXVlc3RlZCB0eXBlL3Byb3RvY29sIHBhaXIuICovCisJYW5zd2VyID0gTlVMTDsKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9yY3UocCwgJmluZXRzdzZbc29jay0+dHlwZV0pIHsKKwkJYW5zd2VyID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaW5ldF9wcm90b3N3LCBsaXN0KTsKKworCQkvKiBDaGVjayB0aGUgbm9uLXdpbGQgbWF0Y2guICovCisJCWlmIChwcm90b2NvbCA9PSBhbnN3ZXItPnByb3RvY29sKSB7CisJCQlpZiAocHJvdG9jb2wgIT0gSVBQUk9UT19JUCkKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCS8qIENoZWNrIGZvciB0aGUgdHdvIHdpbGQgY2FzZXMuICovCisJCQlpZiAoSVBQUk9UT19JUCA9PSBwcm90b2NvbCkgeworCQkJCXByb3RvY29sID0gYW5zd2VyLT5wcm90b2NvbDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChJUFBST1RPX0lQID09IGFuc3dlci0+cHJvdG9jb2wpCisJCQkJYnJlYWs7CisJCX0KKwkJYW5zd2VyID0gTlVMTDsKKwl9CisKKwlyYyA9IC1FU09DS1ROT1NVUFBPUlQ7CisJaWYgKCFhbnN3ZXIpCisJCWdvdG8gb3V0X3JjdV91bmxvY2s7CisJcmMgPSAtRVBFUk07CisJaWYgKGFuc3dlci0+Y2FwYWJpbGl0eSA+IDAgJiYgIWNhcGFibGUoYW5zd2VyLT5jYXBhYmlsaXR5KSkKKwkJZ290byBvdXRfcmN1X3VubG9jazsKKwlyYyA9IC1FUFJPVE9OT1NVUFBPUlQ7CisJaWYgKCFwcm90b2NvbCkKKwkJZ290byBvdXRfcmN1X3VubG9jazsKKworCXNvY2stPm9wcyA9IGFuc3dlci0+b3BzOworCisJYW5zd2VyX3Byb3QgPSBhbnN3ZXItPnByb3Q7CisJYW5zd2VyX25vX2NoZWNrID0gYW5zd2VyLT5ub19jaGVjazsKKwlhbnN3ZXJfZmxhZ3MgPSBhbnN3ZXItPmZsYWdzOworCXJjdV9yZWFkX3VubG9jaygpOworCisJQlVHX1RSQVAoYW5zd2VyX3Byb3QtPnNsYWIgIT0gTlVMTCk7CisKKwlyYyA9IC1FTk9CVUZTOworCXNrID0gc2tfYWxsb2MoUEZfSU5FVDYsIEdGUF9LRVJORUwsIGFuc3dlcl9wcm90LCAxKTsKKwlpZiAoc2sgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisKKwlyYyA9IDA7CisJc2stPnNrX25vX2NoZWNrID0gYW5zd2VyX25vX2NoZWNrOworCWlmIChJTkVUX1BST1RPU1dfUkVVU0UgJiBhbnN3ZXJfZmxhZ3MpCisJCXNrLT5za19yZXVzZSA9IDE7CisKKwlpbmV0ID0gaW5ldF9zayhzayk7CisKKwlpZiAoU09DS19SQVcgPT0gc29jay0+dHlwZSkgeworCQlpbmV0LT5udW0gPSBwcm90b2NvbDsKKwkJaWYgKElQUFJPVE9fUkFXID09IHByb3RvY29sKQorCQkJaW5ldC0+aGRyaW5jbCA9IDE7CisJfQorCisJc2stPnNrX2Rlc3RydWN0CQk9IGluZXQ2X3NvY2tfZGVzdHJ1Y3Q7CisJc2stPnNrX2ZhbWlseQkJPSBQRl9JTkVUNjsKKwlzay0+c2tfcHJvdG9jb2wJCT0gcHJvdG9jb2w7CisKKwlzay0+c2tfYmFja2xvZ19yY3YJPSBhbnN3ZXItPnByb3QtPmJhY2tsb2dfcmN2OworCisJaW5ldF9zayhzayktPnBpbmV0NiA9IG5wID0gaW5ldDZfc2tfZ2VuZXJpYyhzayk7CisJbnAtPmhvcF9saW1pdAk9IC0xOworCW5wLT5tY2FzdF9ob3BzCT0gLTE7CisJbnAtPm1jX2xvb3AJPSAxOworCW5wLT5wbXR1ZGlzYwk9IElQVjZfUE1UVURJU0NfV0FOVDsKKwlucC0+aXB2Nm9ubHkJPSBzeXNjdGxfaXB2Nl9iaW5kdjZvbmx5OworCQorCS8qIEluaXQgdGhlIGlwdjQgcGFydCBvZiB0aGUgc29ja2V0IHNpbmNlIHdlIGNhbiBoYXZlIHNvY2tldHMKKwkgKiB1c2luZyB2NiBBUEkgZm9yIGlwdjQuCisJICovCisJaW5ldC0+dWNfdHRsCT0gLTE7CisKKwlpbmV0LT5tY19sb29wCT0gMTsKKwlpbmV0LT5tY190dGwJPSAxOworCWluZXQtPm1jX2luZGV4CT0gMDsKKwlpbmV0LT5tY19saXN0CT0gTlVMTDsKKworCWlmIChpcHY0X2NvbmZpZy5ub19wbXR1X2Rpc2MpCisJCWluZXQtPnBtdHVkaXNjID0gSVBfUE1UVURJU0NfRE9OVDsKKwllbHNlCisJCWluZXQtPnBtdHVkaXNjID0gSVBfUE1UVURJU0NfV0FOVDsKKworCisjaWZkZWYgSU5FVF9SRUZDTlRfREVCVUcKKwlhdG9taWNfaW5jKCZpbmV0Nl9zb2NrX25yKTsKKwlhdG9taWNfaW5jKCZpbmV0X3NvY2tfbnIpOworI2VuZGlmCisJaWYgKGluZXQtPm51bSkgeworCQkvKiBJdCBhc3N1bWVzIHRoYXQgYW55IHByb3RvY29sIHdoaWNoIGFsbG93cworCQkgKiB0aGUgdXNlciB0byBhc3NpZ24gYSBudW1iZXIgYXQgc29ja2V0CisJCSAqIGNyZWF0aW9uIHRpbWUgYXV0b21hdGljYWxseSBzaGFyZXMuCisJCSAqLworCQlpbmV0LT5zcG9ydCA9IG50b2hzKGluZXQtPm51bSk7CisJCXNrLT5za19wcm90LT5oYXNoKHNrKTsKKwl9CisJaWYgKHNrLT5za19wcm90LT5pbml0KSB7CisJCXJjID0gc2stPnNrX3Byb3QtPmluaXQoc2spOworCQlpZiAocmMpIHsKKwkJCXNrX2NvbW1vbl9yZWxlYXNlKHNrKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorb3V0OgorCXJldHVybiByYzsKK291dF9yY3VfdW5sb2NrOgorCXJjdV9yZWFkX3VubG9jaygpOworCWdvdG8gb3V0OworfQorCisKKy8qIGJpbmQgZm9yIElORVQ2IEFQSSAqLworaW50IGluZXQ2X2JpbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwgaW50IGFkZHJfbGVuKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmFkZHI9KHN0cnVjdCBzb2NrYWRkcl9pbjYgKil1YWRkcjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOworCV9fdTMyIHY0YWRkciA9IDA7CisJdW5zaWduZWQgc2hvcnQgc251bTsKKwlpbnQgYWRkcl90eXBlID0gMDsKKwlpbnQgZXJyID0gMDsKKworCS8qIElmIHRoZSBzb2NrZXQgaGFzIGl0cyBvd24gYmluZCBmdW5jdGlvbiB0aGVuIHVzZSBpdC4gKi8KKwlpZiAoc2stPnNrX3Byb3QtPmJpbmQpCisJCXJldHVybiBzay0+c2tfcHJvdC0+YmluZChzaywgdWFkZHIsIGFkZHJfbGVuKTsKKworCWlmIChhZGRyX2xlbiA8IFNJTjZfTEVOX1JGQzIxMzMpCisJCXJldHVybiAtRUlOVkFMOworCWFkZHJfdHlwZSA9IGlwdjZfYWRkcl90eXBlKCZhZGRyLT5zaW42X2FkZHIpOworCWlmICgoYWRkcl90eXBlICYgSVBWNl9BRERSX01VTFRJQ0FTVCkgJiYgc29jay0+dHlwZSA9PSBTT0NLX1NUUkVBTSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzbnVtID0gbnRvaHMoYWRkci0+c2luNl9wb3J0KTsKKwlpZiAoc251bSAmJiBzbnVtIDwgUFJPVF9TT0NLICYmICFjYXBhYmxlKENBUF9ORVRfQklORF9TRVJWSUNFKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwlsb2NrX3NvY2soc2spOworCisJLyogQ2hlY2sgdGhlc2UgZXJyb3JzIChhY3RpdmUgc29ja2V0LCBkb3VibGUgYmluZCkuICovCisJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfQ0xPU0UgfHwgaW5ldC0+bnVtKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qIENoZWNrIGlmIHRoZSBhZGRyZXNzIGJlbG9uZ3MgdG8gdGhlIGhvc3QuICovCisJaWYgKGFkZHJfdHlwZSA9PSBJUFY2X0FERFJfTUFQUEVEKSB7CisJCXY0YWRkciA9IGFkZHItPnNpbjZfYWRkci5zNl9hZGRyMzJbM107CisJCWlmIChpbmV0X2FkZHJfdHlwZSh2NGFkZHIpICE9IFJUTl9MT0NBTCkgeworCQkJZXJyID0gLUVBRERSTk9UQVZBSUw7CisJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChhZGRyX3R5cGUgIT0gSVBWNl9BRERSX0FOWSkgeworCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisKKwkJCWlmIChhZGRyX3R5cGUgJiBJUFY2X0FERFJfTElOS0xPQ0FMKSB7CisJCQkJaWYgKGFkZHJfbGVuID49IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSAmJgorCQkJCSAgICBhZGRyLT5zaW42X3Njb3BlX2lkKSB7CisJCQkJCS8qIE92ZXJyaWRlIGFueSBleGlzdGluZyBiaW5kaW5nLCBpZiBhbm90aGVyIG9uZQorCQkJCQkgKiBpcyBzdXBwbGllZCBieSB1c2VyLgorCQkJCQkgKi8KKwkJCQkJc2stPnNrX2JvdW5kX2Rldl9pZiA9IGFkZHItPnNpbjZfc2NvcGVfaWQ7CisJCQkJfQorCQkJCQorCQkJCS8qIEJpbmRpbmcgdG8gbGluay1sb2NhbCBhZGRyZXNzIHJlcXVpcmVzIGFuIGludGVyZmFjZSAqLworCQkJCWlmICghc2stPnNrX2JvdW5kX2Rldl9pZikgeworCQkJCQllcnIgPSAtRUlOVkFMOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJZGV2ID0gZGV2X2dldF9ieV9pbmRleChzay0+c2tfYm91bmRfZGV2X2lmKTsKKwkJCQlpZiAoIWRldikgeworCQkJCQllcnIgPSAtRU5PREVWOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQl9CisKKwkJCS8qIGlwdjQgYWRkciBvZiB0aGUgc29ja2V0IGlzIGludmFsaWQuICBPbmx5IHRoZQorCQkJICogdW5zcGVjaWZpZWQgYW5kIG1hcHBlZCBhZGRyZXNzIGhhdmUgYSB2NCBlcXVpdmFsZW50LgorCQkJICovCisJCQl2NGFkZHIgPSBMT09QQkFDSzRfSVBWNjsKKwkJCWlmICghKGFkZHJfdHlwZSAmIElQVjZfQUREUl9NVUxUSUNBU1QpKQl7CisJCQkJaWYgKCFpcHY2X2Noa19hZGRyKCZhZGRyLT5zaW42X2FkZHIsIGRldiwgMCkpIHsKKwkJCQkJaWYgKGRldikKKwkJCQkJCWRldl9wdXQoZGV2KTsKKwkJCQkJZXJyID0gLUVBRERSTk9UQVZBSUw7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCX0KKwkJCWlmIChkZXYpCisJCQkJZGV2X3B1dChkZXYpOworCQl9CisJfQorCisJaW5ldC0+cmN2X3NhZGRyID0gdjRhZGRyOworCWluZXQtPnNhZGRyID0gdjRhZGRyOworCisJaXB2Nl9hZGRyX2NvcHkoJm5wLT5yY3Zfc2FkZHIsICZhZGRyLT5zaW42X2FkZHIpOworCQkKKwlpZiAoIShhZGRyX3R5cGUgJiBJUFY2X0FERFJfTVVMVElDQVNUKSkKKwkJaXB2Nl9hZGRyX2NvcHkoJm5wLT5zYWRkciwgJmFkZHItPnNpbjZfYWRkcik7CisKKwkvKiBNYWtlIHN1cmUgd2UgYXJlIGFsbG93ZWQgdG8gYmluZCBoZXJlLiAqLworCWlmIChzay0+c2tfcHJvdC0+Z2V0X3BvcnQoc2ssIHNudW0pKSB7CisJCWluZXRfcmVzZXRfc2FkZHIoc2spOworCQllcnIgPSAtRUFERFJJTlVTRTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGFkZHJfdHlwZSAhPSBJUFY2X0FERFJfQU5ZKQorCQlzay0+c2tfdXNlcmxvY2tzIHw9IFNPQ0tfQklOREFERFJfTE9DSzsKKwlpZiAoc251bSkKKwkJc2stPnNrX3VzZXJsb2NrcyB8PSBTT0NLX0JJTkRQT1JUX0xPQ0s7CisJaW5ldC0+c3BvcnQgPSBudG9ocyhpbmV0LT5udW0pOworCWluZXQtPmRwb3J0ID0gMDsKKwlpbmV0LT5kYWRkciA9IDA7CitvdXQ6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgaW5ldDZfcmVsZWFzZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCisJaWYgKHNrID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRnJlZSBtYyBsaXN0cyAqLworCWlwdjZfc29ja19tY19jbG9zZShzayk7CisKKwkvKiBGcmVlIGFjIGxpc3RzICovCisJaXB2Nl9zb2NrX2FjX2Nsb3NlKHNrKTsKKworCXJldHVybiBpbmV0X3JlbGVhc2Uoc29jayk7Cit9CisKK2ludCBpbmV0Nl9kZXN0cm95X3NvY2soc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpcHY2X3R4b3B0aW9ucyAqb3B0OworCisJLyoKKwkgKglSZWxlYXNlIGRlc3RpbmF0aW9uIGVudHJ5CisJICovCisKKwlza19kc3RfcmVzZXQoc2spOworCisJLyogUmVsZWFzZSByeCBvcHRpb25zICovCisKKwlpZiAoKHNrYiA9IHhjaGcoJm5wLT5wa3RvcHRpb25zLCBOVUxMKSkgIT0gTlVMTCkKKwkJa2ZyZWVfc2tiKHNrYik7CisKKwkvKiBGcmVlIGZsb3dsYWJlbHMgKi8KKwlmbDZfZnJlZV9zb2NrbGlzdChzayk7CisKKwkvKiBGcmVlIHR4IG9wdGlvbnMgKi8KKworCWlmICgob3B0ID0geGNoZygmbnAtPm9wdCwgTlVMTCkpICE9IE5VTEwpCisJCXNvY2tfa2ZyZWVfcyhzaywgb3B0LCBvcHQtPnRvdF9sZW4pOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglUaGlzIGRvZXMgYm90aCBwZWVybmFtZSBhbmQgc29ja25hbWUuCisgKi8KKyAKK2ludCBpbmV0Nl9nZXRuYW1lKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsCisJCSBpbnQgKnVhZGRyX2xlbiwgaW50IHBlZXIpCit7CisJc3RydWN0IHNvY2thZGRyX2luNiAqc2luPShzdHJ1Y3Qgc29ja2FkZHJfaW42ICopdWFkZHI7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKKyAgCisJc2luLT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCXNpbi0+c2luNl9mbG93aW5mbyA9IDA7CisJc2luLT5zaW42X3Njb3BlX2lkID0gMDsKKwlpZiAocGVlcikgeworCQlpZiAoIWluZXQtPmRwb3J0KQorCQkJcmV0dXJuIC1FTk9UQ09OTjsKKwkJaWYgKCgoMSA8PCBzay0+c2tfc3RhdGUpICYgKFRDUEZfQ0xPU0UgfCBUQ1BGX1NZTl9TRU5UKSkgJiYKKwkJICAgIHBlZXIgPT0gMSkKKwkJCXJldHVybiAtRU5PVENPTk47CisJCXNpbi0+c2luNl9wb3J0ID0gaW5ldC0+ZHBvcnQ7CisJCWlwdjZfYWRkcl9jb3B5KCZzaW4tPnNpbjZfYWRkciwgJm5wLT5kYWRkcik7CisJCWlmIChucC0+c25kZmxvdykKKwkJCXNpbi0+c2luNl9mbG93aW5mbyA9IG5wLT5mbG93X2xhYmVsOworCX0gZWxzZSB7CisJCWlmIChpcHY2X2FkZHJfYW55KCZucC0+cmN2X3NhZGRyKSkKKwkJCWlwdjZfYWRkcl9jb3B5KCZzaW4tPnNpbjZfYWRkciwgJm5wLT5zYWRkcik7CisJCWVsc2UKKwkJCWlwdjZfYWRkcl9jb3B5KCZzaW4tPnNpbjZfYWRkciwgJm5wLT5yY3Zfc2FkZHIpOworCisJCXNpbi0+c2luNl9wb3J0ID0gaW5ldC0+c3BvcnQ7CisJfQorCWlmIChpcHY2X2FkZHJfdHlwZSgmc2luLT5zaW42X2FkZHIpICYgSVBWNl9BRERSX0xJTktMT0NBTCkKKwkJc2luLT5zaW42X3Njb3BlX2lkID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKKwkqdWFkZHJfbGVuID0gc2l6ZW9mKCpzaW4pOworCXJldHVybigwKTsKK30KKworaW50IGluZXQ2X2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnIgPSAtRUlOVkFMOworCisJc3dpdGNoKGNtZCkgCisJeworCWNhc2UgU0lPQ0dTVEFNUDoKKwkJcmV0dXJuIHNvY2tfZ2V0X3RpbWVzdGFtcChzaywgKHN0cnVjdCB0aW1ldmFsIF9fdXNlciAqKWFyZyk7CisKKwljYXNlIFNJT0NBRERSVDoKKwljYXNlIFNJT0NERUxSVDoKKwkgIAorCQlyZXR1cm4oaXB2Nl9yb3V0ZV9pb2N0bChjbWQsKHZvaWQgX191c2VyICopYXJnKSk7CisKKwljYXNlIFNJT0NTSUZBRERSOgorCQlyZXR1cm4gYWRkcmNvbmZfYWRkX2lmYWRkcigodm9pZCBfX3VzZXIgKikgYXJnKTsKKwljYXNlIFNJT0NESUZBRERSOgorCQlyZXR1cm4gYWRkcmNvbmZfZGVsX2lmYWRkcigodm9pZCBfX3VzZXIgKikgYXJnKTsKKwljYXNlIFNJT0NTSUZEU1RBRERSOgorCQlyZXR1cm4gYWRkcmNvbmZfc2V0X2RzdGFkZHIoKHZvaWQgX191c2VyICopIGFyZyk7CisJZGVmYXVsdDoKKwkJaWYgKCFzay0+c2tfcHJvdC0+aW9jdGwgfHwKKwkJICAgIChlcnIgPSBzay0+c2tfcHJvdC0+aW9jdGwoc2ssIGNtZCwgYXJnKSkgPT0gLUVOT0lPQ1RMQ01EKQorCQkJcmV0dXJuKGRldl9pb2N0bChjbWQsKHZvaWQgX191c2VyICopIGFyZykpOwkJCisJCXJldHVybiBlcnI7CisJfQorCS8qTk9UUkVBQ0hFRCovCisJcmV0dXJuKDApOworfQorCitzdHJ1Y3QgcHJvdG9fb3BzIGluZXQ2X3N0cmVhbV9vcHMgPSB7CisJLmZhbWlseSA9CVBGX0lORVQ2LAorCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5yZWxlYXNlID0JaW5ldDZfcmVsZWFzZSwKKwkuYmluZCA9CQlpbmV0Nl9iaW5kLAorCS5jb25uZWN0ID0JaW5ldF9zdHJlYW1fY29ubmVjdCwJCS8qIG9rCQkqLworCS5zb2NrZXRwYWlyID0Jc29ja19ub19zb2NrZXRwYWlyLAkJLyogYSBkbyBub3RoaW5nCSovCisJLmFjY2VwdCA9CWluZXRfYWNjZXB0LAkJCS8qIG9rCQkqLworCS5nZXRuYW1lID0JaW5ldDZfZ2V0bmFtZSwgCisJLnBvbGwgPQkJdGNwX3BvbGwsCQkJLyogb2sJCSovCisJLmlvY3RsID0JaW5ldDZfaW9jdGwsCQkJLyogbXVzdCBjaGFuZ2UgICovCisJLmxpc3RlbiA9CWluZXRfbGlzdGVuLAkJCS8qIG9rCQkqLworCS5zaHV0ZG93biA9CWluZXRfc2h1dGRvd24sCQkJLyogb2sJCSovCisJLnNldHNvY2tvcHQgPQlzb2NrX2NvbW1vbl9zZXRzb2Nrb3B0LAkJLyogb2sJCSovCisJLmdldHNvY2tvcHQgPQlzb2NrX2NvbW1vbl9nZXRzb2Nrb3B0LAkJLyogb2sJCSovCisJLnNlbmRtc2cgPQlpbmV0X3NlbmRtc2csCQkJLyogb2sJCSovCisJLnJlY3Ztc2cgPQlzb2NrX2NvbW1vbl9yZWN2bXNnLAkJLyogb2sJCSovCisJLm1tYXAgPQkJc29ja19ub19tbWFwLAorCS5zZW5kcGFnZSA9CXRjcF9zZW5kcGFnZQorfTsKKworc3RydWN0IHByb3RvX29wcyBpbmV0Nl9kZ3JhbV9vcHMgPSB7CisJLmZhbWlseSA9CVBGX0lORVQ2LAorCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5yZWxlYXNlID0JaW5ldDZfcmVsZWFzZSwKKwkuYmluZCA9CQlpbmV0Nl9iaW5kLAorCS5jb25uZWN0ID0JaW5ldF9kZ3JhbV9jb25uZWN0LAkJLyogb2sJCSovCisJLnNvY2tldHBhaXIgPQlzb2NrX25vX3NvY2tldHBhaXIsCQkvKiBhIGRvIG5vdGhpbmcJKi8KKwkuYWNjZXB0ID0Jc29ja19ub19hY2NlcHQsCQkJLyogYSBkbyBub3RoaW5nCSovCisJLmdldG5hbWUgPQlpbmV0Nl9nZXRuYW1lLCAKKwkucG9sbCA9CQl1ZHBfcG9sbCwJCQkvKiBvawkJKi8KKwkuaW9jdGwgPQlpbmV0Nl9pb2N0bCwJCQkvKiBtdXN0IGNoYW5nZSAgKi8KKwkubGlzdGVuID0Jc29ja19ub19saXN0ZW4sCQkJLyogb2sJCSovCisJLnNodXRkb3duID0JaW5ldF9zaHV0ZG93biwJCQkvKiBvawkJKi8KKwkuc2V0c29ja29wdCA9CXNvY2tfY29tbW9uX3NldHNvY2tvcHQsCQkvKiBvawkJKi8KKwkuZ2V0c29ja29wdCA9CXNvY2tfY29tbW9uX2dldHNvY2tvcHQsCQkvKiBvawkJKi8KKwkuc2VuZG1zZyA9CWluZXRfc2VuZG1zZywJCQkvKiBvawkJKi8KKwkucmVjdm1zZyA9CXNvY2tfY29tbW9uX3JlY3Ztc2csCQkvKiBvawkJKi8KKwkubW1hcCA9CQlzb2NrX25vX21tYXAsCisJLnNlbmRwYWdlID0Jc29ja19ub19zZW5kcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSBpbmV0Nl9mYW1pbHlfb3BzID0geworCS5mYW1pbHkgPSBQRl9JTkVUNiwKKwkuY3JlYXRlID0gaW5ldDZfY3JlYXRlLAorCS5vd25lcgk9IFRISVNfTU9EVUxFLAorfTsKKworI2lmZGVmIENPTkZJR19TWVNDVEwKK2V4dGVybiB2b2lkIGlwdjZfc3lzY3RsX3JlZ2lzdGVyKHZvaWQpOworZXh0ZXJuIHZvaWQgaXB2Nl9zeXNjdGxfdW5yZWdpc3Rlcih2b2lkKTsKKyNlbmRpZgorCisvKiBTYW1lIGFzIGluZXQ2X2RncmFtX29wcywgc2FucyB1ZHBfcG9sbC4gICovCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBpbmV0Nl9zb2NrcmF3X29wcyA9IHsKKwkuZmFtaWx5ID0JUEZfSU5FVDYsCisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLnJlbGVhc2UgPQlpbmV0Nl9yZWxlYXNlLAorCS5iaW5kID0JCWluZXQ2X2JpbmQsCisJLmNvbm5lY3QgPQlpbmV0X2RncmFtX2Nvbm5lY3QsCQkvKiBvawkJKi8KKwkuc29ja2V0cGFpciA9CXNvY2tfbm9fc29ja2V0cGFpciwJCS8qIGEgZG8gbm90aGluZwkqLworCS5hY2NlcHQgPQlzb2NrX25vX2FjY2VwdCwJCQkvKiBhIGRvIG5vdGhpbmcJKi8KKwkuZ2V0bmFtZSA9CWluZXQ2X2dldG5hbWUsIAorCS5wb2xsID0JCWRhdGFncmFtX3BvbGwsCQkJLyogb2sJCSovCisJLmlvY3RsID0JaW5ldDZfaW9jdGwsCQkJLyogbXVzdCBjaGFuZ2UgICovCisJLmxpc3RlbiA9CXNvY2tfbm9fbGlzdGVuLAkJCS8qIG9rCQkqLworCS5zaHV0ZG93biA9CWluZXRfc2h1dGRvd24sCQkJLyogb2sJCSovCisJLnNldHNvY2tvcHQgPQlzb2NrX2NvbW1vbl9zZXRzb2Nrb3B0LAkJLyogb2sJCSovCisJLmdldHNvY2tvcHQgPQlzb2NrX2NvbW1vbl9nZXRzb2Nrb3B0LAkJLyogb2sJCSovCisJLnNlbmRtc2cgPQlpbmV0X3NlbmRtc2csCQkJLyogb2sJCSovCisJLnJlY3Ztc2cgPQlzb2NrX2NvbW1vbl9yZWN2bXNnLAkJLyogb2sJCSovCisJLm1tYXAgPQkJc29ja19ub19tbWFwLAorCS5zZW5kcGFnZSA9CXNvY2tfbm9fc2VuZHBhZ2UsCit9OworCitzdGF0aWMgc3RydWN0IGluZXRfcHJvdG9zdyByYXd2Nl9wcm90b3N3ID0geworCS50eXBlCQk9IFNPQ0tfUkFXLAorCS5wcm90b2NvbAk9IElQUFJPVE9fSVAsCS8qIHdpbGQgY2FyZCAqLworCS5wcm90CQk9ICZyYXd2Nl9wcm90LAorCS5vcHMJCT0gJmluZXQ2X3NvY2tyYXdfb3BzLAorCS5jYXBhYmlsaXR5CT0gQ0FQX05FVF9SQVcsCisJLm5vX2NoZWNrCT0gVURQX0NTVU1fREVGQVVMVCwKKwkuZmxhZ3MJCT0gSU5FVF9QUk9UT1NXX1JFVVNFLAorfTsKKwordm9pZAoraW5ldDZfcmVnaXN0ZXJfcHJvdG9zdyhzdHJ1Y3QgaW5ldF9wcm90b3N3ICpwKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxoOworCXN0cnVjdCBpbmV0X3Byb3Rvc3cgKmFuc3dlcjsKKwlpbnQgcHJvdG9jb2wgPSBwLT5wcm90b2NvbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsYXN0X3Blcm07CisKKwlzcGluX2xvY2tfYmgoJmluZXRzdzZfbG9jayk7CisKKwlpZiAocC0+dHlwZSA+PSBTT0NLX01BWCkKKwkJZ290byBvdXRfaWxsZWdhbDsKKworCS8qIElmIHdlIGFyZSB0cnlpbmcgdG8gb3ZlcnJpZGUgYSBwZXJtYW5lbnQgcHJvdG9jb2wsIGJhaWwuICovCisJYW5zd2VyID0gTlVMTDsKKwlsYXN0X3Blcm0gPSAmaW5ldHN3NltwLT50eXBlXTsKKwlsaXN0X2Zvcl9lYWNoKGxoLCAmaW5ldHN3NltwLT50eXBlXSkgeworCQlhbnN3ZXIgPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3QgaW5ldF9wcm90b3N3LCBsaXN0KTsKKworCQkvKiBDaGVjayBvbmx5IHRoZSBub24td2lsZCBtYXRjaC4gKi8KKwkJaWYgKElORVRfUFJPVE9TV19QRVJNQU5FTlQgJiBhbnN3ZXItPmZsYWdzKSB7CisJCQlpZiAocHJvdG9jb2wgPT0gYW5zd2VyLT5wcm90b2NvbCkKKwkJCQlicmVhazsKKwkJCWxhc3RfcGVybSA9IGxoOworCQl9CisKKwkJYW5zd2VyID0gTlVMTDsKKwl9CisJaWYgKGFuc3dlcikKKwkJZ290byBvdXRfcGVybWFuZW50OworCisJLyogQWRkIHRoZSBuZXcgZW50cnkgYWZ0ZXIgdGhlIGxhc3QgcGVybWFuZW50IGVudHJ5IGlmIGFueSwgc28gdGhhdAorCSAqIHRoZSBuZXcgZW50cnkgZG9lcyBub3Qgb3ZlcnJpZGUgYSBwZXJtYW5lbnQgZW50cnkgd2hlbiBtYXRjaGVkIHdpdGgKKwkgKiBhIHdpbGQtY2FyZCBwcm90b2NvbC4gQnV0IGl0IGlzIGFsbG93ZWQgdG8gb3ZlcnJpZGUgYW55IGV4aXN0aW5nCisJICogbm9uLXBlcm1hbmVudCBlbnRyeS4gIFRoaXMgbWVhbnMgdGhhdCB3aGVuIHdlIHJlbW92ZSB0aGlzIGVudHJ5LCB0aGUgCisJICogc3lzdGVtIGF1dG9tYXRpY2FsbHkgcmV0dXJucyB0byB0aGUgb2xkIGJlaGF2aW9yLgorCSAqLworCWxpc3RfYWRkX3JjdSgmcC0+bGlzdCwgbGFzdF9wZXJtKTsKK291dDoKKwlzcGluX3VubG9ja19iaCgmaW5ldHN3Nl9sb2NrKTsKKwlyZXR1cm47CisKK291dF9wZXJtYW5lbnQ6CisJcHJpbnRrKEtFUk5fRVJSICJBdHRlbXB0IHRvIG92ZXJyaWRlIHBlcm1hbmVudCBwcm90b2NvbCAlZC5cbiIsCisJICAgICAgIHByb3RvY29sKTsKKwlnb3RvIG91dDsKKworb3V0X2lsbGVnYWw6CisJcHJpbnRrKEtFUk5fRVJSCisJICAgICAgICJJZ25vcmluZyBhdHRlbXB0IHRvIHJlZ2lzdGVyIGludmFsaWQgc29ja2V0IHR5cGUgJWQuXG4iLAorCSAgICAgICBwLT50eXBlKTsKKwlnb3RvIG91dDsKK30KKwordm9pZAoraW5ldDZfdW5yZWdpc3Rlcl9wcm90b3N3KHN0cnVjdCBpbmV0X3Byb3Rvc3cgKnApCit7CisJaWYgKElORVRfUFJPVE9TV19QRVJNQU5FTlQgJiBwLT5mbGFncykgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJBdHRlbXB0IHRvIHVucmVnaXN0ZXIgcGVybWFuZW50IHByb3RvY29sICVkLlxuIiwKKwkJICAgICAgIHAtPnByb3RvY29sKTsKKwl9IGVsc2UgeworCQlzcGluX2xvY2tfYmgoJmluZXRzdzZfbG9jayk7CisJCWxpc3RfZGVsX3JjdSgmcC0+bGlzdCk7CisJCXNwaW5fdW5sb2NrX2JoKCZpbmV0c3c2X2xvY2spOworCisJCXN5bmNocm9uaXplX25ldCgpOworCX0KK30KKworaW50Citzbm1wNl9taWJfaW5pdCh2b2lkICpwdHJbMl0sIHNpemVfdCBtaWJzaXplLCBzaXplX3QgbWliYWxpZ24pCit7CisJaWYgKHB0ciA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXB0clswXSA9IF9fYWxsb2NfcGVyY3B1KG1pYnNpemUsIG1pYmFsaWduKTsKKwlpZiAoIXB0clswXSkKKwkJZ290byBlcnIwOworCisJcHRyWzFdID0gX19hbGxvY19wZXJjcHUobWlic2l6ZSwgbWliYWxpZ24pOworCWlmICghcHRyWzFdKQorCQlnb3RvIGVycjE7CisKKwlyZXR1cm4gMDsKKworZXJyMToKKwlmcmVlX3BlcmNwdShwdHJbMF0pOworCXB0clswXSA9IE5VTEw7CitlcnIwOgorCXJldHVybiAtRU5PTUVNOworfQorCit2b2lkCitzbm1wNl9taWJfZnJlZSh2b2lkICpwdHJbMl0pCit7CisJaWYgKHB0ciA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKHB0clswXSkKKwkJZnJlZV9wZXJjcHUocHRyWzBdKTsKKwlpZiAocHRyWzFdKQorCQlmcmVlX3BlcmNwdShwdHJbMV0pOworCXB0clswXSA9IHB0clsxXSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfaXB2Nl9taWJzKHZvaWQpCit7CisJaWYgKHNubXA2X21pYl9pbml0KCh2b2lkICoqKWlwdjZfc3RhdGlzdGljcywgc2l6ZW9mIChzdHJ1Y3QgaXBzdGF0c19taWIpLAorCQkJICAgX19hbGlnbm9mX18oc3RydWN0IGlwc3RhdHNfbWliKSkgPCAwKQorCQlnb3RvIGVycl9pcF9taWI7CisJaWYgKHNubXA2X21pYl9pbml0KCh2b2lkICoqKWljbXB2Nl9zdGF0aXN0aWNzLCBzaXplb2YgKHN0cnVjdCBpY21wdjZfbWliKSwKKwkJCSAgIF9fYWxpZ25vZl9fKHN0cnVjdCBpY21wdjZfbWliKSkgPCAwKQorCQlnb3RvIGVycl9pY21wX21pYjsKKwlpZiAoc25tcDZfbWliX2luaXQoKHZvaWQgKiopdWRwX3N0YXRzX2luNiwgc2l6ZW9mIChzdHJ1Y3QgdWRwX21pYiksCisJCQkgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgdWRwX21pYikpIDwgMCkKKwkJZ290byBlcnJfdWRwX21pYjsKKwlyZXR1cm4gMDsKKworZXJyX3VkcF9taWI6CisJc25tcDZfbWliX2ZyZWUoKHZvaWQgKiopaWNtcHY2X3N0YXRpc3RpY3MpOworZXJyX2ljbXBfbWliOgorCXNubXA2X21pYl9mcmVlKCh2b2lkICoqKWlwdjZfc3RhdGlzdGljcyk7CitlcnJfaXBfbWliOgorCXJldHVybiAtRU5PTUVNOworCQorfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwX2lwdjZfbWlicyh2b2lkKQoreworCXNubXA2X21pYl9mcmVlKCh2b2lkICoqKWlwdjZfc3RhdGlzdGljcyk7CisJc25tcDZfbWliX2ZyZWUoKHZvaWQgKiopaWNtcHY2X3N0YXRpc3RpY3MpOworCXNubXA2X21pYl9mcmVlKCh2b2lkICoqKXVkcF9zdGF0c19pbjYpOworfQorCitleHRlcm4gaW50IGlwdjZfbWlzY19wcm9jX2luaXQodm9pZCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGluZXQ2X2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqZHVtbXlfc2tiOworICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpyOworCWludCBlcnI7CisKKyNpZmRlZiBNT0RVTEUKKyNpZiAwIC8qIEZJWE1FIC0tUlIgKi8KKwlpZiAoIW1vZF9tZW1iZXJfcHJlc2VudCgmX190aGlzX21vZHVsZSwgY2FuX3VubG9hZCkpCisJICByZXR1cm4gLUVJTlZBTDsKKworCV9fdGhpc19tb2R1bGUuY2FuX3VubG9hZCA9ICZpcHY2X3VubG9hZDsKKyNlbmRpZgorI2VuZGlmCisKKwlpZiAoc2l6ZW9mKHN0cnVjdCBpbmV0Nl9za2JfcGFybSkgPiBzaXplb2YoZHVtbXlfc2tiLT5jYikpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiaW5ldDZfcHJvdG9faW5pdDogc2l6ZSBmYXVsdFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWVyciA9IHByb3RvX3JlZ2lzdGVyKCZ0Y3B2Nl9wcm90LCAxKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IHByb3RvX3JlZ2lzdGVyKCZ1ZHB2Nl9wcm90LCAxKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF91bnJlZ2lzdGVyX3RjcF9wcm90bzsKKworCWVyciA9IHByb3RvX3JlZ2lzdGVyKCZyYXd2Nl9wcm90LCAxKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF91bnJlZ2lzdGVyX3VkcF9wcm90bzsKKworCisJLyogUmVnaXN0ZXIgdGhlIHNvY2tldC1zaWRlIGluZm9ybWF0aW9uIGZvciBpbmV0Nl9jcmVhdGUuICAqLworCWZvcihyID0gJmluZXRzdzZbMF07IHIgPCAmaW5ldHN3NltTT0NLX01BWF07ICsrcikKKwkJSU5JVF9MSVNUX0hFQUQocik7CisKKwkvKiBXZSBNVVNUIHJlZ2lzdGVyIFJBVyBzb2NrZXRzIGJlZm9yZSB3ZSBjcmVhdGUgdGhlIElDTVA2LAorCSAqIElHTVA2LCBvciBORElTQyBjb250cm9sIHNvY2tldHMuCisJICovCisJaW5ldDZfcmVnaXN0ZXJfcHJvdG9zdygmcmF3djZfcHJvdG9zdyk7CisKKwkvKiBSZWdpc3RlciB0aGUgZmFtaWx5IGhlcmUgc28gdGhhdCB0aGUgaW5pdCBjYWxscyBiZWxvdyB3aWxsCisJICogYmUgYWJsZSB0byBjcmVhdGUgc29ja2V0cy4gKD8/IGlzIHRoaXMgZGFuZ2Vyb3VzID8/KQorCSAqLworCSh2b2lkKSBzb2NrX3JlZ2lzdGVyKCZpbmV0Nl9mYW1pbHlfb3BzKTsKKworCS8qIEluaXRpYWxpc2UgaXB2NiBtaWJzICovCisJZXJyID0gaW5pdF9pcHY2X21pYnMoKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF91bnJlZ2lzdGVyX3Jhd19wcm90bzsKKwkKKwkvKgorCSAqCWlwbmd3ZyBBUEkgZHJhZnQgbWFrZXMgY2xlYXIgdGhhdCB0aGUgY29ycmVjdCBzZW1hbnRpY3MKKwkgKglmb3IgVENQIGFuZCBVRFAgaXMgdG8gY29uc2lkZXIgb25lIFRDUCBhbmQgVURQIGluc3RhbmNlCisJICoJaW4gYSBob3N0IGF2YWlsaWFibGUgYnkgYm90aCBJTkVUIGFuZCBJTkVUNiBBUElzIGFuZAorCSAqCWFibGUgdG8gY29tbXVuaWNhdGUgdmlhIGJvdGggbmV0d29yayBwcm90b2NvbHMuCisJICovCisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJaXB2Nl9zeXNjdGxfcmVnaXN0ZXIoKTsKKyNlbmRpZgorCWVyciA9IGljbXB2Nl9pbml0KCZpbmV0Nl9mYW1pbHlfb3BzKTsKKwlpZiAoZXJyKQorCQlnb3RvIGljbXBfZmFpbDsKKwllcnIgPSBuZGlzY19pbml0KCZpbmV0Nl9mYW1pbHlfb3BzKTsKKwlpZiAoZXJyKQorCQlnb3RvIG5kaXNjX2ZhaWw7CisJZXJyID0gaWdtcDZfaW5pdCgmaW5ldDZfZmFtaWx5X29wcyk7CisJaWYgKGVycikKKwkJZ290byBpZ21wX2ZhaWw7CisJLyogQ3JlYXRlIC9wcm9jL2ZvbzYgZW50cmllcy4gKi8KKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCWVyciA9IC1FTk9NRU07CisJaWYgKHJhdzZfcHJvY19pbml0KCkpCisJCWdvdG8gcHJvY19yYXc2X2ZhaWw7CisJaWYgKHRjcDZfcHJvY19pbml0KCkpCisJCWdvdG8gcHJvY190Y3A2X2ZhaWw7CisJaWYgKHVkcDZfcHJvY19pbml0KCkpCisJCWdvdG8gcHJvY191ZHA2X2ZhaWw7CisJaWYgKGlwdjZfbWlzY19wcm9jX2luaXQoKSkKKwkJZ290byBwcm9jX21pc2M2X2ZhaWw7CisKKwlpZiAoYWM2X3Byb2NfaW5pdCgpKQorCQlnb3RvIHByb2NfYW55Y2FzdDZfZmFpbDsKKwlpZiAoaWY2X3Byb2NfaW5pdCgpKQorCQlnb3RvIHByb2NfaWY2X2ZhaWw7CisjZW5kaWYKKwlpcHY2X3BhY2tldF9pbml0KCk7CisJaXA2X3JvdXRlX2luaXQoKTsKKwlpcDZfZmxvd2xhYmVsX2luaXQoKTsKKwllcnIgPSBhZGRyY29uZl9pbml0KCk7CisJaWYgKGVycikKKwkJZ290byBhZGRyY29uZl9mYWlsOworCXNpdF9pbml0KCk7CisKKwkvKiBJbml0IHY2IGV4dGVuc2lvbiBoZWFkZXJzLiAqLworCWlwdjZfcnRoZHJfaW5pdCgpOworCWlwdjZfZnJhZ19pbml0KCk7CisJaXB2Nl9ub2RhdGFfaW5pdCgpOworCWlwdjZfZGVzdG9wdF9pbml0KCk7CisKKwkvKiBJbml0IHY2IHRyYW5zcG9ydCBwcm90b2NvbHMuICovCisJdWRwdjZfaW5pdCgpOworCXRjcHY2X2luaXQoKTsKKwllcnIgPSAwOworb3V0OgorCXJldHVybiBlcnI7CisKK2FkZHJjb25mX2ZhaWw6CisJaXA2X2Zsb3dsYWJlbF9jbGVhbnVwKCk7CisJaXA2X3JvdXRlX2NsZWFudXAoKTsKKwlpcHY2X3BhY2tldF9jbGVhbnVwKCk7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlpZjZfcHJvY19leGl0KCk7Citwcm9jX2lmNl9mYWlsOgorCWFjNl9wcm9jX2V4aXQoKTsKK3Byb2NfYW55Y2FzdDZfZmFpbDoKKwlpcHY2X21pc2NfcHJvY19leGl0KCk7Citwcm9jX21pc2M2X2ZhaWw6CisJdWRwNl9wcm9jX2V4aXQoKTsKK3Byb2NfdWRwNl9mYWlsOgorCXRjcDZfcHJvY19leGl0KCk7Citwcm9jX3RjcDZfZmFpbDoKKwlyYXc2X3Byb2NfZXhpdCgpOworcHJvY19yYXc2X2ZhaWw6CisjZW5kaWYKKwlpZ21wNl9jbGVhbnVwKCk7CitpZ21wX2ZhaWw6CisJbmRpc2NfY2xlYW51cCgpOworbmRpc2NfZmFpbDoKKwlpY21wdjZfY2xlYW51cCgpOworaWNtcF9mYWlsOgorI2lmZGVmIENPTkZJR19TWVNDVEwKKwlpcHY2X3N5c2N0bF91bnJlZ2lzdGVyKCk7CisjZW5kaWYKKwljbGVhbnVwX2lwdjZfbWlicygpOworb3V0X3VucmVnaXN0ZXJfcmF3X3Byb3RvOgorCXByb3RvX3VucmVnaXN0ZXIoJnJhd3Y2X3Byb3QpOworb3V0X3VucmVnaXN0ZXJfdWRwX3Byb3RvOgorCXByb3RvX3VucmVnaXN0ZXIoJnVkcHY2X3Byb3QpOworb3V0X3VucmVnaXN0ZXJfdGNwX3Byb3RvOgorCXByb3RvX3VucmVnaXN0ZXIoJnRjcHY2X3Byb3QpOworCWdvdG8gb3V0OworfQorbW9kdWxlX2luaXQoaW5ldDZfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpbmV0Nl9leGl0KHZvaWQpCit7CisJLyogRmlyc3Qgb2YgYWxsIGRpc2FsbG93IG5ldyBzb2NrZXRzIGNyZWF0aW9uLiAqLworCXNvY2tfdW5yZWdpc3RlcihQRl9JTkVUNik7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlpZjZfcHJvY19leGl0KCk7CisJYWM2X3Byb2NfZXhpdCgpOworIAlpcHY2X21pc2NfcHJvY19leGl0KCk7CisgCXVkcDZfcHJvY19leGl0KCk7CisgCXRjcDZfcHJvY19leGl0KCk7CisgCXJhdzZfcHJvY19leGl0KCk7CisjZW5kaWYKKwkvKiBDbGVhbnVwIGNvZGUgcGFydHMuICovCisJc2l0X2NsZWFudXAoKTsKKwlpcDZfZmxvd2xhYmVsX2NsZWFudXAoKTsKKwlhZGRyY29uZl9jbGVhbnVwKCk7CisJaXA2X3JvdXRlX2NsZWFudXAoKTsKKwlpcHY2X3BhY2tldF9jbGVhbnVwKCk7CisJaWdtcDZfY2xlYW51cCgpOworCW5kaXNjX2NsZWFudXAoKTsKKwlpY21wdjZfY2xlYW51cCgpOworI2lmZGVmIENPTkZJR19TWVNDVEwKKwlpcHY2X3N5c2N0bF91bnJlZ2lzdGVyKCk7CQorI2VuZGlmCisJY2xlYW51cF9pcHY2X21pYnMoKTsKKwlwcm90b191bnJlZ2lzdGVyKCZyYXd2Nl9wcm90KTsKKwlwcm90b191bnJlZ2lzdGVyKCZ1ZHB2Nl9wcm90KTsKKwlwcm90b191bnJlZ2lzdGVyKCZ0Y3B2Nl9wcm90KTsKK30KK21vZHVsZV9leGl0KGluZXQ2X2V4aXQpOworCitNT0RVTEVfQUxJQVNfTkVUUFJPVE8oUEZfSU5FVDYpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWg2LmMgYi9uZXQvaXB2Ni9haDYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2VjZjYyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvYWg2LmMKQEAgLTAsMCArMSw0NzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpMjAwMiBVU0FHSS9XSURFIFByb2plY3QKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogQXV0aG9ycworICoKKyAqCU1pdHN1cnUgS0FOREEgQFVTQUdJICAgICAgIDogSVB2NiBTdXBwb3J0IAorICogCUthenVub3JpIE1JWUFaQVdBIEBVU0FHSSAgIDoKKyAqIAlLdW5paGlybyBJc2hpZ3VybyA8a3VuaWhpcm9AaXBpbmZ1c2lvbi5jb20+CisgKiAJCisgKiAJVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBuZXQvaXB2NC9haC5jLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvYWguaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC9wZmtleXYyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bmV0L2ljbXAuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC94ZnJtLmg+CisjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CisKK3N0YXRpYyBpbnQgemVyb19vdXRfbXV0YWJsZV9vcHRzKHN0cnVjdCBpcHY2X29wdF9oZHIgKm9wdGhkcikKK3sKKwl1OCAqb3B0ID0gKHU4ICopb3B0aGRyOworCWludCBsZW4gPSBpcHY2X29wdGxlbihvcHRoZHIpOworCWludCBvZmYgPSAwOworCWludCBvcHRsZW4gPSAwOworCisJb2ZmICs9IDI7CisJbGVuIC09IDI7CisKKwl3aGlsZSAobGVuID4gMCkgeworCisJCXN3aXRjaCAob3B0W29mZl0pIHsKKworCQljYXNlIElQVjZfVExWX1BBRDA6CisJCQlvcHRsZW4gPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAobGVuIDwgMikgCisJCQkJZ290byBiYWQ7CisJCQlvcHRsZW4gPSBvcHRbb2ZmKzFdKzI7CisJCQlpZiAobGVuIDwgb3B0bGVuKQorCQkJCWdvdG8gYmFkOworCQkJaWYgKG9wdFtvZmZdICYgMHgyMCkKKwkJCQltZW1zZXQoJm9wdFtvZmYrMl0sIDAsIG9wdFtvZmYrMV0pOworCQkJYnJlYWs7CisJCX0KKworCQlvZmYgKz0gb3B0bGVuOworCQlsZW4gLT0gb3B0bGVuOworCX0KKwlpZiAobGVuID09IDApCisJCXJldHVybiAxOworCitiYWQ6CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJaXB2Nl9yZWFycmFuZ2VfcnRoZHIgLSByZWFycmFuZ2UgSVB2NiByb3V0aW5nIGhlYWRlcgorICoJQGlwaDogSVB2NiBoZWFkZXIKKyAqCUBydGhkcjogcm91dGluZyBoZWFkZXIKKyAqCisgKglSZWFycmFuZ2UgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgaW4gQGlwaCBhbmQgdGhlIGFkZHJlc3NlcyBpbiBAcnRoZHIKKyAqCXNvIHRoYXQgdGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIHRoZXkgd2lsbCBhdCB0aGUgZmluYWwgZGVzdGluYXRpb24uCisgKglTZWUgQXBwZW5kaXggQTIgb2YgUkZDIDI0MDIgZm9yIGRldGFpbHMuCisgKi8KK3N0YXRpYyB2b2lkIGlwdjZfcmVhcnJhbmdlX3J0aGRyKHN0cnVjdCBpcHY2aGRyICppcGgsIHN0cnVjdCBpcHY2X3J0X2hkciAqcnRoZHIpCit7CisJaW50IHNlZ21lbnRzLCBzZWdtZW50c19sZWZ0OworCXN0cnVjdCBpbjZfYWRkciAqYWRkcnM7CisJc3RydWN0IGluNl9hZGRyIGZpbmFsX2FkZHI7CisKKwlzZWdtZW50c19sZWZ0ID0gcnRoZHItPnNlZ21lbnRzX2xlZnQ7CisJaWYgKHNlZ21lbnRzX2xlZnQgPT0gMCkKKwkJcmV0dXJuOworCXJ0aGRyLT5zZWdtZW50c19sZWZ0ID0gMDsgCisKKwkvKiBUaGUgdmFsdWUgb2YgcnRoZHItPmhkcmxlbiBoYXMgYmVlbiB2ZXJpZmllZCBlaXRoZXIgYnkgdGhlIHN5c3RlbQorCSAqIGNhbGwgaWYgaXQgaXMgbG9jYWxseSBnZW5lcmF0ZWQsIG9yIGJ5IGlwdjZfcnRoZHJfcmN2KCkgZm9yIGluY29taW5nCisJICogcGFja2V0cy4gIFNvIHdlIGNhbiBhc3N1bWUgdGhhdCBpdCBpcyBldmVuIGFuZCB0aGF0IHNlZ21lbnRzIGlzCisJICogZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHNlZ21lbnRzX2xlZnQuCisJICoKKwkgKiBGb3IgdGhlIHNhbWUgcmVhc29uIHdlIGNhbiBhc3N1bWUgdGhhdCB0aGlzIG9wdGlvbiBpcyBvZiB0eXBlIDAuCisJICovCisJc2VnbWVudHMgPSBydGhkci0+aGRybGVuID4+IDE7CisKKwlhZGRycyA9ICgoc3RydWN0IHJ0MF9oZHIgKilydGhkciktPmFkZHI7CisJaXB2Nl9hZGRyX2NvcHkoJmZpbmFsX2FkZHIsIGFkZHJzICsgc2VnbWVudHMgLSAxKTsKKworCWFkZHJzICs9IHNlZ21lbnRzIC0gc2VnbWVudHNfbGVmdDsKKwltZW1tb3ZlKGFkZHJzICsgMSwgYWRkcnMsIChzZWdtZW50c19sZWZ0IC0gMSkgKiBzaXplb2YoKmFkZHJzKSk7CisKKwlpcHY2X2FkZHJfY29weShhZGRycywgJmlwaC0+ZGFkZHIpOworCWlwdjZfYWRkcl9jb3B5KCZpcGgtPmRhZGRyLCAmZmluYWxfYWRkcik7Cit9CisKK3N0YXRpYyBpbnQgaXB2Nl9jbGVhcl9tdXRhYmxlX29wdGlvbnMoc3RydWN0IGlwdjZoZHIgKmlwaCwgaW50IGxlbikKK3sKKwl1bmlvbiB7CisJCXN0cnVjdCBpcHY2aGRyICppcGg7CisJCXN0cnVjdCBpcHY2X29wdF9oZHIgKm9wdGg7CisJCXN0cnVjdCBpcHY2X3J0X2hkciAqcnRoOworCQljaGFyICpyYXc7CisJfSBleHRoZHIgPSB7IC5pcGggPSBpcGggfTsKKwljaGFyICplbmQgPSBleHRoZHIucmF3ICsgbGVuOworCWludCBuZXh0aGRyID0gaXBoLT5uZXh0aGRyOworCisJZXh0aGRyLmlwaCsrOworCisJd2hpbGUgKGV4dGhkci5yYXcgPCBlbmQpIHsKKwkJc3dpdGNoIChuZXh0aGRyKSB7CisJCWNhc2UgTkVYVEhEUl9IT1A6CisJCWNhc2UgTkVYVEhEUl9ERVNUOgorCQkJaWYgKCF6ZXJvX291dF9tdXRhYmxlX29wdHMoZXh0aGRyLm9wdGgpKSB7CisJCQkJTElNSVRfTkVUREVCVUcocHJpbnRrKAorCQkJCQlLRVJOX1dBUk5JTkcgIm92ZXJydW4gJXNvcHRzXG4iLAorCQkJCQluZXh0aGRyID09IE5FWFRIRFJfSE9QID8KKwkJCQkJCSJob3AiIDogImRlc3QiKSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE5FWFRIRFJfUk9VVElORzoKKwkJCWlwdjZfcmVhcnJhbmdlX3J0aGRyKGlwaCwgZXh0aGRyLnJ0aCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0IDoKKwkJCXJldHVybiAwOworCQl9CisKKwkJbmV4dGhkciA9IGV4dGhkci5vcHRoLT5uZXh0aGRyOworCQlleHRoZHIucmF3ICs9IGlwdjZfb3B0bGVuKGV4dGhkci5vcHRoKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhaDZfb3V0cHV0KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBlcnI7CisJaW50IGV4dGxlbjsKKwlzdHJ1Y3QgaXB2NmhkciAqdG9wX2lwaDsKKwlzdHJ1Y3QgaXBfYXV0aF9oZHIgKmFoOworCXN0cnVjdCBhaF9kYXRhICphaHA7CisJdTggbmV4dGhkcjsKKwljaGFyIHRtcF9iYXNlWzhdOworCXN0cnVjdCB7CisJCXN0cnVjdCBpbjZfYWRkciBkYWRkcjsKKwkJY2hhciBoZHJzWzBdOworCX0gKnRtcF9leHQ7CisKKwl0b3BfaXBoID0gKHN0cnVjdCBpcHY2aGRyICopc2tiLT5kYXRhOworCXRvcF9pcGgtPnBheWxvYWRfbGVuID0gaHRvbnMoc2tiLT5sZW4gLSBzaXplb2YoKnRvcF9pcGgpKTsKKworCW5leHRoZHIgPSAqc2tiLT5uaC5yYXc7CisJKnNrYi0+bmgucmF3ID0gSVBQUk9UT19BSDsKKworCS8qIFdoZW4gdGhlcmUgYXJlIG5vIGV4dGVuc2lvbiBoZWFkZXJzLCB3ZSBvbmx5IG5lZWQgdG8gc2F2ZSB0aGUgZmlyc3QKKwkgKiA4IGJ5dGVzIG9mIHRoZSBiYXNlIElQIGhlYWRlci4KKwkgKi8KKwltZW1jcHkodG1wX2Jhc2UsIHRvcF9pcGgsIHNpemVvZih0bXBfYmFzZSkpOworCisJdG1wX2V4dCA9IE5VTEw7CisJZXh0bGVuID0gc2tiLT5oLnJhdyAtICh1bnNpZ25lZCBjaGFyICopKHRvcF9pcGggKyAxKTsKKwlpZiAoZXh0bGVuKSB7CisJCWV4dGxlbiArPSBzaXplb2YoKnRtcF9leHQpOworCQl0bXBfZXh0ID0ga21hbGxvYyhleHRsZW4sIEdGUF9BVE9NSUMpOworCQlpZiAoIXRtcF9leHQpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIGVycm9yOworCQl9CisJCW1lbWNweSh0bXBfZXh0LCAmdG9wX2lwaC0+ZGFkZHIsIGV4dGxlbik7CisJCWVyciA9IGlwdjZfY2xlYXJfbXV0YWJsZV9vcHRpb25zKHRvcF9pcGgsCisJCQkJCQkgZXh0bGVuIC0gc2l6ZW9mKCp0bXBfZXh0KSArCisJCQkJCQkgc2l6ZW9mKCp0b3BfaXBoKSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycm9yX2ZyZWVfaXBoOworCX0KKworCWFoID0gKHN0cnVjdCBpcF9hdXRoX2hkciAqKXNrYi0+aC5yYXc7CisJYWgtPm5leHRoZHIgPSBuZXh0aGRyOworCisJdG9wX2lwaC0+cHJpb3JpdHkgICAgPSAwOworCXRvcF9pcGgtPmZsb3dfbGJsWzBdID0gMDsKKwl0b3BfaXBoLT5mbG93X2xibFsxXSA9IDA7CisJdG9wX2lwaC0+Zmxvd19sYmxbMl0gPSAwOworCXRvcF9pcGgtPmhvcF9saW1pdCAgID0gMDsKKworCWFocCA9IHgtPmRhdGE7CisJYWgtPmhkcmxlbiAgPSAoWEZSTV9BTElHTjgoc2l6ZW9mKHN0cnVjdCBpcHY2X2F1dGhfaGRyKSArIAorCQkJCSAgIGFocC0+aWN2X3RydW5jX2xlbikgPj4gMikgLSAyOworCisJYWgtPnJlc2VydmVkID0gMDsKKwlhaC0+c3BpID0geC0+aWQuc3BpOworCWFoLT5zZXFfbm8gPSBodG9ubCgrK3gtPnJlcGxheS5vc2VxKTsKKwlhaHAtPmljdihhaHAsIHNrYiwgYWgtPmF1dGhfZGF0YSk7CisKKwllcnIgPSAwOworCisJbWVtY3B5KHRvcF9pcGgsIHRtcF9iYXNlLCBzaXplb2YodG1wX2Jhc2UpKTsKKwlpZiAodG1wX2V4dCkgeworCQltZW1jcHkoJnRvcF9pcGgtPmRhZGRyLCB0bXBfZXh0LCBleHRsZW4pOworZXJyb3JfZnJlZV9pcGg6CisJCWtmcmVlKHRtcF9leHQpOworCX0KKworZXJyb3I6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBhaDZfaW5wdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCB4ZnJtX2RlY2FwX3N0YXRlICpkZWNhcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKgorCSAqIEJlZm9yZSBwcm9jZXNzIEFICisJICogW0lQdjZdW0V4dDFdW0V4dDJdW0FIXVtEZXN0XVtQYXlsb2FkXQorCSAqIHw8LS0tLS0tLS0tLS0tLS0+fCBoZHJfbGVuCisJICoKKwkgKiBUbyBlcmFzZSBBSDoKKwkgKiBLZWVwaW5nIGNvcHkgb2YgY2xlYXJlZCBoZWFkZXJzLiBBZnRlciBBSCBwcm9jZXNzaW5nLAorCSAqIE1vdmluZyB0aGUgcG9pbnRlciBvZiBza2ItPm5oLnJhdyBieSB1c2luZyBza2JfcHVsbCBhcyBsb25nIGFzIEFICisJICogaGVhZGVyIGxlbmd0aC4gVGhlbiBjb3B5IGJhY2sgdGhlIGNvcHkgYXMgbG9uZyBhcyBoZHJfbGVuCisJICogSWYgZGVzdGluYXRpb24gaGVhZGVyIGZvbGxvd2luZyBBSCBleGlzdHMsIGNvcHkgaXQgaW50byBhZnRlciBbRXh0Ml0uCisJICogCisJICogfDw+fFtJUHY2XVtFeHQxXVtFeHQyXVtEZXN0XVtQYXlsb2FkXQorCSAqIFRoZXJlIGlzIG9mZnNldCBvZiBBSCBiZWZvcmUgSVB2NiBoZWFkZXIgYWZ0ZXIgdGhlIHByb2Nlc3MuCisJICovCisKKwlzdHJ1Y3QgaXB2Nl9hdXRoX2hkciAqYWg7CisJc3RydWN0IGFoX2RhdGEgKmFocDsKKwl1bnNpZ25lZCBjaGFyICp0bXBfaGRyID0gTlVMTDsKKwl1MTYgaGRyX2xlbjsKKwl1MTYgYWhfaGxlbjsKKwlpbnQgbmV4dGhkcjsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaXBfYXV0aF9oZHIpKSkKKwkJZ290byBvdXQ7CisKKwkvKiBXZSBhcmUgZ29pbmcgdG8gX3JlbW92ZV8gQUggaGVhZGVyIHRvIGtlZXAgc29ja2V0cyBoYXBweSwKKwkgKiBzby4uLiBMYXRlciB0aGlzIGNhbiBjaGFuZ2UuICovCisJaWYgKHNrYl9jbG9uZWQoc2tiKSAmJgorCSAgICBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgMCwgR0ZQX0FUT01JQykpCisJCWdvdG8gb3V0OworCisJaGRyX2xlbiA9IHNrYi0+ZGF0YSAtIHNrYi0+bmgucmF3OworCWFoID0gKHN0cnVjdCBpcHY2X2F1dGhfaGRyKilza2ItPmRhdGE7CisJYWhwID0geC0+ZGF0YTsKKwluZXh0aGRyID0gYWgtPm5leHRoZHI7CisJYWhfaGxlbiA9IChhaC0+aGRybGVuICsgMikgPDwgMjsKKworICAgICAgICBpZiAoYWhfaGxlbiAhPSBYRlJNX0FMSUdOOChzaXplb2Yoc3RydWN0IGlwdjZfYXV0aF9oZHIpICsgYWhwLT5pY3ZfZnVsbF9sZW4pICYmCisgICAgICAgICAgICBhaF9obGVuICE9IFhGUk1fQUxJR044KHNpemVvZihzdHJ1Y3QgaXB2Nl9hdXRoX2hkcikgKyBhaHAtPmljdl90cnVuY19sZW4pKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgYWhfaGxlbikpCisJCWdvdG8gb3V0OworCisJdG1wX2hkciA9IGttYWxsb2MoaGRyX2xlbiwgR0ZQX0FUT01JQyk7CisJaWYgKCF0bXBfaGRyKQorCQlnb3RvIG91dDsKKwltZW1jcHkodG1wX2hkciwgc2tiLT5uaC5yYXcsIGhkcl9sZW4pOworCWlmIChpcHY2X2NsZWFyX211dGFibGVfb3B0aW9ucyhza2ItPm5oLmlwdjZoLCBoZHJfbGVuKSkKKwkJZ290byBvdXQ7CisJc2tiLT5uaC5pcHY2aC0+cHJpb3JpdHkgICAgPSAwOworCXNrYi0+bmguaXB2NmgtPmZsb3dfbGJsWzBdID0gMDsKKwlza2ItPm5oLmlwdjZoLT5mbG93X2xibFsxXSA9IDA7CisJc2tiLT5uaC5pcHY2aC0+Zmxvd19sYmxbMl0gPSAwOworCXNrYi0+bmguaXB2NmgtPmhvcF9saW1pdCAgID0gMDsKKworICAgICAgICB7CisJCXU4IGF1dGhfZGF0YVtNQVhfQUhfQVVUSF9MRU5dOworCisJCW1lbWNweShhdXRoX2RhdGEsIGFoLT5hdXRoX2RhdGEsIGFocC0+aWN2X3RydW5jX2xlbik7CisJCW1lbXNldChhaC0+YXV0aF9kYXRhLCAwLCBhaHAtPmljdl90cnVuY19sZW4pOworCQlza2JfcHVzaChza2IsIHNrYi0+ZGF0YSAtIHNrYi0+bmgucmF3KTsKKwkJYWhwLT5pY3YoYWhwLCBza2IsIGFoLT5hdXRoX2RhdGEpOworCQlpZiAobWVtY21wKGFoLT5hdXRoX2RhdGEsIGF1dGhfZGF0YSwgYWhwLT5pY3ZfdHJ1bmNfbGVuKSkgeworCQkJTElNSVRfTkVUREVCVUcoCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaXBzZWMgYWggYXV0aGVudGljYXRpb24gZXJyb3JcbiIpKTsKKwkJCXgtPnN0YXRzLmludGVncml0eV9mYWlsZWQrKzsKKwkJCWdvdG8gZnJlZV9vdXQ7CisJCX0KKwl9CisKKwlza2ItPm5oLnJhdyA9IHNrYl9wdWxsKHNrYiwgYWhfaGxlbik7CisJbWVtY3B5KHNrYi0+bmgucmF3LCB0bXBfaGRyLCBoZHJfbGVuKTsKKwlza2ItPm5oLmlwdjZoLT5wYXlsb2FkX2xlbiA9IGh0b25zKHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisJc2tiX3B1bGwoc2tiLCBoZHJfbGVuKTsKKwlza2ItPmgucmF3ID0gc2tiLT5kYXRhOworCisKKwlrZnJlZSh0bXBfaGRyKTsKKworCXJldHVybiBuZXh0aGRyOworCitmcmVlX291dDoKKwlrZnJlZSh0bXBfaGRyKTsKK291dDoKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgYWg2X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCwgCisgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX191MzIgaW5mbykKK3sKKwlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gKHN0cnVjdCBpcHY2aGRyKilza2ItPmRhdGE7CisJc3RydWN0IGlwX2F1dGhfaGRyICphaCA9IChzdHJ1Y3QgaXBfYXV0aF9oZHIqKShza2ItPmRhdGErb2Zmc2V0KTsKKwlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDsKKworCWlmICh0eXBlICE9IElDTVBWNl9ERVNUX1VOUkVBQ0ggJiYKKwkgICAgdHlwZSAhPSBJQ01QVjZfUEtUX1RPT0JJRykKKwkJcmV0dXJuOworCisJeCA9IHhmcm1fc3RhdGVfbG9va3VwKCh4ZnJtX2FkZHJlc3NfdCAqKSZpcGgtPmRhZGRyLCBhaC0+c3BpLCBJUFBST1RPX0FILCBBRl9JTkVUNik7CisJaWYgKCF4KQorCQlyZXR1cm47CisKKwlORVRERUJVRyhwcmludGsoS0VSTl9ERUJVRyAicG10dSBkaXNjb3Zlcnkgb24gU0EgQUgvJTA4eC8iCisJCQkiJTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4XG4iLAorCSAgICAgICBudG9obChhaC0+c3BpKSwgTklQNihpcGgtPmRhZGRyKSkpOworCisJeGZybV9zdGF0ZV9wdXQoeCk7Cit9CisKK3N0YXRpYyBpbnQgYWg2X2luaXRfc3RhdGUoc3RydWN0IHhmcm1fc3RhdGUgKngsIHZvaWQgKmFyZ3MpCit7CisJc3RydWN0IGFoX2RhdGEgKmFocCA9IE5VTEw7CisJc3RydWN0IHhmcm1fYWxnb19kZXNjICphYWxnX2Rlc2M7CisKKwlpZiAoIXgtPmFhbGcpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBudWxsIGF1dGggY2FuIHVzZSBhIHplcm8gbGVuZ3RoIGtleSAqLworCWlmICh4LT5hYWxnLT5hbGdfa2V5X2xlbiA+IDUxMikKKwkJZ290byBlcnJvcjsKKworCWlmICh4LT5lbmNhcCkKKwkJZ290byBlcnJvcjsKKworCWFocCA9IGttYWxsb2Moc2l6ZW9mKCphaHApLCBHRlBfS0VSTkVMKTsKKwlpZiAoYWhwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KGFocCwgMCwgc2l6ZW9mKCphaHApKTsKKworCWFocC0+a2V5ID0geC0+YWFsZy0+YWxnX2tleTsKKwlhaHAtPmtleV9sZW4gPSAoeC0+YWFsZy0+YWxnX2tleV9sZW4rNykvODsKKwlhaHAtPnRmbSA9IGNyeXB0b19hbGxvY190Zm0oeC0+YWFsZy0+YWxnX25hbWUsIDApOworCWlmICghYWhwLT50Zm0pCisJCWdvdG8gZXJyb3I7CisJYWhwLT5pY3YgPSBhaF9obWFjX2RpZ2VzdDsKKwkKKwkvKgorCSAqIExvb2t1cCB0aGUgYWxnb3JpdGhtIGRlc2NyaXB0aW9uIG1haW50YWluZWQgYnkgeGZybV9hbGdvLAorCSAqIHZlcmlmeSBjcnlwdG8gdHJhbnNmb3JtIHByb3BlcnRpZXMsIGFuZCBzdG9yZSBpbmZvcm1hdGlvbgorCSAqIHdlIG5lZWQgZm9yIEFIIHByb2Nlc3NpbmcuICBUaGlzIGxvb2t1cCBjYW5ub3QgZmFpbCBoZXJlCisJICogYWZ0ZXIgYSBzdWNjZXNzZnVsIGNyeXB0b19hbGxvY190Zm0oKS4KKwkgKi8KKwlhYWxnX2Rlc2MgPSB4ZnJtX2FhbGdfZ2V0X2J5bmFtZSh4LT5hYWxnLT5hbGdfbmFtZSwgMCk7CisJQlVHX09OKCFhYWxnX2Rlc2MpOworCisJaWYgKGFhbGdfZGVzYy0+dWluZm8uYXV0aC5pY3ZfZnVsbGJpdHMvOCAhPQorCSAgICBjcnlwdG9fdGZtX2FsZ19kaWdlc3RzaXplKGFocC0+dGZtKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJBSDogJXMgZGlnZXN0c2l6ZSAldSAhPSAlaHVcbiIsCisJCSAgICAgICB4LT5hYWxnLT5hbGdfbmFtZSwgY3J5cHRvX3RmbV9hbGdfZGlnZXN0c2l6ZShhaHAtPnRmbSksCisJCSAgICAgICBhYWxnX2Rlc2MtPnVpbmZvLmF1dGguaWN2X2Z1bGxiaXRzLzgpOworCQlnb3RvIGVycm9yOworCX0KKwkKKwlhaHAtPmljdl9mdWxsX2xlbiA9IGFhbGdfZGVzYy0+dWluZm8uYXV0aC5pY3ZfZnVsbGJpdHMvODsKKwlhaHAtPmljdl90cnVuY19sZW4gPSBhYWxnX2Rlc2MtPnVpbmZvLmF1dGguaWN2X3RydW5jYml0cy84OworCQorCUJVR19PTihhaHAtPmljdl90cnVuY19sZW4gPiBNQVhfQUhfQVVUSF9MRU4pOworCQorCWFocC0+d29ya19pY3YgPSBrbWFsbG9jKGFocC0+aWN2X2Z1bGxfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFocC0+d29ya19pY3YpCisJCWdvdG8gZXJyb3I7CisJCisJeC0+cHJvcHMuaGVhZGVyX2xlbiA9IFhGUk1fQUxJR044KHNpemVvZihzdHJ1Y3QgaXB2Nl9hdXRoX2hkcikgKyBhaHAtPmljdl90cnVuY19sZW4pOworCWlmICh4LT5wcm9wcy5tb2RlKQorCQl4LT5wcm9wcy5oZWFkZXJfbGVuICs9IHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisJeC0+ZGF0YSA9IGFocDsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlpZiAoYWhwKSB7CisJCWlmIChhaHAtPndvcmtfaWN2KQorCQkJa2ZyZWUoYWhwLT53b3JrX2ljdik7CisJCWlmIChhaHAtPnRmbSkKKwkJCWNyeXB0b19mcmVlX3RmbShhaHAtPnRmbSk7CisJCWtmcmVlKGFocCk7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgdm9pZCBhaDZfZGVzdHJveShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCkKK3sKKwlzdHJ1Y3QgYWhfZGF0YSAqYWhwID0geC0+ZGF0YTsKKworCWlmICghYWhwKQorCQlyZXR1cm47CisKKwlpZiAoYWhwLT53b3JrX2ljdikgeworCQlrZnJlZShhaHAtPndvcmtfaWN2KTsKKwkJYWhwLT53b3JrX2ljdiA9IE5VTEw7CisJfQorCWlmIChhaHAtPnRmbSkgeworCQljcnlwdG9fZnJlZV90Zm0oYWhwLT50Zm0pOworCQlhaHAtPnRmbSA9IE5VTEw7CisJfQorCWtmcmVlKGFocCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeGZybV90eXBlIGFoNl90eXBlID0KK3sKKwkuZGVzY3JpcHRpb24JPSAiQUg2IiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnByb3RvCSAgICAgCT0gSVBQUk9UT19BSCwKKwkuaW5pdF9zdGF0ZQk9IGFoNl9pbml0X3N0YXRlLAorCS5kZXN0cnVjdG9yCT0gYWg2X2Rlc3Ryb3ksCisJLmlucHV0CQk9IGFoNl9pbnB1dCwKKwkub3V0cHV0CQk9IGFoNl9vdXRwdXQKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5ldDZfcHJvdG9jb2wgYWg2X3Byb3RvY29sID0geworCS5oYW5kbGVyCT0JeGZybTZfcmN2LAorCS5lcnJfaGFuZGxlcgk9CWFoNl9lcnIsCisJLmZsYWdzCQk9CUlORVQ2X1BST1RPX05PUE9MSUNZLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWg2X2luaXQodm9pZCkKK3sKKwlpZiAoeGZybV9yZWdpc3Rlcl90eXBlKCZhaDZfdHlwZSwgQUZfSU5FVDYpIDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJpcHY2IGFoIGluaXQ6IGNhbid0IGFkZCB4ZnJtIHR5cGVcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlpZiAoaW5ldDZfYWRkX3Byb3RvY29sKCZhaDZfcHJvdG9jb2wsIElQUFJPVE9fQUgpIDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJpcHY2IGFoIGluaXQ6IGNhbid0IGFkZCBwcm90b2NvbFxuIik7CisJCXhmcm1fdW5yZWdpc3Rlcl90eXBlKCZhaDZfdHlwZSwgQUZfSU5FVDYpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFoNl9maW5pKHZvaWQpCit7CisJaWYgKGluZXQ2X2RlbF9wcm90b2NvbCgmYWg2X3Byb3RvY29sLCBJUFBST1RPX0FIKSA8IDApCisJCXByaW50ayhLRVJOX0lORk8gImlwdjYgYWggY2xvc2U6IGNhbid0IHJlbW92ZSBwcm90b2NvbFxuIik7CisKKwlpZiAoeGZybV91bnJlZ2lzdGVyX3R5cGUoJmFoNl90eXBlLCBBRl9JTkVUNikgPCAwKQorCQlwcmludGsoS0VSTl9JTkZPICJpcHY2IGFoIGNsb3NlOiBjYW4ndCByZW1vdmUgeGZybSB0eXBlXG4iKTsKKworfQorCittb2R1bGVfaW5pdChhaDZfaW5pdCk7Cittb2R1bGVfZXhpdChhaDZfZmluaSk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FueWNhc3QuYyBiL25ldC9pcHY2L2FueWNhc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDIyY2EzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvYW55Y2FzdC5jCkBAIC0wLDAgKzEsNTk0IEBACisvKgorICoJQW55Y2FzdCBzdXBwb3J0IGZvciBJUHY2CisgKglMaW51eCBJTkVUNiBpbXBsZW1lbnRhdGlvbiAKKyAqCisgKglBdXRob3JzOgorICoJRGF2aWQgTCBTdGV2ZW5zIChkbHN0ZXZlbnNAdXMuaWJtLmNvbSkKKyAqCisgKgliYXNlZCBoZWF2aWx5IG9uIG5ldC9pcHY2L21jYXN0LmMKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9zbm1wLmg+CisKKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgorI2luY2x1ZGUgPG5ldC9pZl9pbmV0Ni5oPgorI2luY2x1ZGUgPG5ldC9uZGlzYy5oPgorI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgorI2luY2x1ZGUgPG5ldC9pcDZfcm91dGUuaD4KKworI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorCitzdGF0aWMgaW50IGlwdjZfZGV2X2FjX2RlYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIpOworCisvKiBCaWcgYWMgbGlzdCBsb2NrIGZvciBhbGwgdGhlIHNvY2tldHMgKi8KK3N0YXRpYyBERUZJTkVfUldMT0NLKGlwdjZfc2tfYWNfbG9jayk7CisKK3N0YXRpYyBpbnQKK2lwNl9vbmxpbmsoc3RydWN0IGluNl9hZGRyICphZGRyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpbmV0Nl9kZXYJKmlkZXY7CisJc3RydWN0IGluZXQ2X2lmYWRkcgkqaWZhOworCWludAlvbmxpbms7CisKKwlvbmxpbmsgPSAwOworCXJlYWRfbG9jaygmYWRkcmNvbmZfbG9jayk7CisJaWRldiA9IF9faW42X2Rldl9nZXQoZGV2KTsKKwlpZiAoaWRldikgeworCQlyZWFkX2xvY2tfYmgoJmlkZXYtPmxvY2spOworCQlmb3IgKGlmYT1pZGV2LT5hZGRyX2xpc3Q7IGlmYTsgaWZhPWlmYS0+aWZfbmV4dCkgeworCQkJb25saW5rID0gaXB2Nl9wcmVmaXhfZXF1YWwoYWRkciwgJmlmYS0+YWRkciwKKwkJCQkJCSAgIGlmYS0+cHJlZml4X2xlbik7CisJCQlpZiAob25saW5rKQorCQkJCWJyZWFrOworCQl9CisJCXJlYWRfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwl9CisJcmVhZF91bmxvY2soJmFkZHJjb25mX2xvY2spOworCXJldHVybiBvbmxpbms7Cit9CisKKy8qCisgKglzb2NrZXQgam9pbiBhbiBhbnljYXN0IGdyb3VwCisgKi8KKworaW50IGlwdjZfc29ja19hY19qb2luKHN0cnVjdCBzb2NrICpzaywgaW50IGlmaW5kZXgsIHN0cnVjdCBpbjZfYWRkciAqYWRkcikKK3sKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IGluZXQ2X2RldiAqaWRldjsKKwlzdHJ1Y3QgaXB2Nl9hY19zb2NrbGlzdCAqcGFjOworCWludAlpc2hvc3QgPSAhaXB2Nl9kZXZjb25mLmZvcndhcmRpbmc7CisJaW50CWVyciA9IDA7CisKKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJaWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoYWRkcikpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChpcHY2X2Noa19hZGRyKGFkZHIsIE5VTEwsIDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBhYyA9IHNvY2tfa21hbGxvYyhzaywgc2l6ZW9mKHN0cnVjdCBpcHY2X2FjX3NvY2tsaXN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBhYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwYWMtPmFjbF9uZXh0ID0gTlVMTDsKKwlpcHY2X2FkZHJfY29weSgmcGFjLT5hY2xfYWRkciwgYWRkcik7CisKKwlpZiAoaWZpbmRleCA9PSAwKSB7CisJCXN0cnVjdCBydDZfaW5mbyAqcnQ7CisKKwkJcnQgPSBydDZfbG9va3VwKGFkZHIsIE5VTEwsIDAsIDApOworCQlpZiAocnQpIHsKKwkJCWRldiA9IHJ0LT5ydDZpX2RldjsKKwkJCWRldl9ob2xkKGRldik7CisJCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwkJfSBlbHNlIGlmIChpc2hvc3QpIHsKKwkJCWVyciA9IC1FQUREUk5PVEFWQUlMOworCQkJZ290byBvdXRfZnJlZV9wYWM7CisJCX0gZWxzZSB7CisJCQkvKiByb3V0ZXIsIG5vIG1hdGNoaW5nIGludGVyZmFjZToganVzdCBwaWNrIG9uZSAqLworCisJCQlkZXYgPSBkZXZfZ2V0X2J5X2ZsYWdzKElGRl9VUCwgSUZGX1VQfElGRl9MT09QQkFDSyk7CisJCX0KKwl9IGVsc2UKKwkJZGV2ID0gZGV2X2dldF9ieV9pbmRleChpZmluZGV4KTsKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dF9mcmVlX3BhYzsKKwl9CisKKwlpZGV2ID0gaW42X2Rldl9nZXQoZGV2KTsKKwlpZiAoIWlkZXYpIHsKKwkJaWYgKGlmaW5kZXgpCisJCQllcnIgPSAtRU5PREVWOworCQllbHNlCisJCQllcnIgPSAtRUFERFJOT1RBVkFJTDsKKwkJZ290byBvdXRfZGV2X3B1dDsKKwl9CisJLyogcmVzZXQgaXNob3N0LCBub3cgdGhhdCB3ZSBoYXZlIGEgc3BlY2lmaWMgZGV2aWNlICovCisJaXNob3N0ID0gIWlkZXYtPmNuZi5mb3J3YXJkaW5nOworCWluNl9kZXZfcHV0KGlkZXYpOworCisJcGFjLT5hY2xfaWZpbmRleCA9IGRldi0+aWZpbmRleDsKKworCS8qIFhYWAorCSAqIEZvciBob3N0cywgYWxsb3cgbGluay1sb2NhbCBvciBtYXRjaGluZyBwcmVmaXggYW55Y2FzdHMuCisJICogVGhpcyBvYnZpYXRlcyB0aGUgbmVlZCBmb3IgcHJvcGFnYXRpbmcgYW55Y2FzdCByb3V0ZXMgd2hpbGUKKwkgKiBzdGlsbCBhbGxvd2luZyBzb21lIG5vbi1yb3V0ZXIgYW55Y2FzdCBwYXJ0aWNpcGF0aW9uLgorCSAqLworCWlmICghaXA2X29ubGluayhhZGRyLCBkZXYpKSB7CisJCWlmIChpc2hvc3QpCisJCQllcnIgPSAtRUFERFJOT1RBVkFJTDsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2Rldl9wdXQ7CisJfQorCisJZXJyID0gaXB2Nl9kZXZfYWNfaW5jKGRldiwgYWRkcik7CisJaWYgKGVycikKKwkJZ290byBvdXRfZGV2X3B1dDsKKworCXdyaXRlX2xvY2tfYmgoJmlwdjZfc2tfYWNfbG9jayk7CisJcGFjLT5hY2xfbmV4dCA9IG5wLT5pcHY2X2FjX2xpc3Q7CisJbnAtPmlwdjZfYWNfbGlzdCA9IHBhYzsKKwl3cml0ZV91bmxvY2tfYmgoJmlwdjZfc2tfYWNfbG9jayk7CisKKwlkZXZfcHV0KGRldik7CisKKwlyZXR1cm4gMDsKKworb3V0X2Rldl9wdXQ6CisJZGV2X3B1dChkZXYpOworb3V0X2ZyZWVfcGFjOgorCXNvY2tfa2ZyZWVfcyhzaywgcGFjLCBzaXplb2YoKnBhYykpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKglzb2NrZXQgbGVhdmUgYW4gYW55Y2FzdCBncm91cAorICovCitpbnQgaXB2Nl9zb2NrX2FjX2Ryb3Aoc3RydWN0IHNvY2sgKnNrLCBpbnQgaWZpbmRleCwgc3RydWN0IGluNl9hZGRyICphZGRyKQoreworCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBpcHY2X2FjX3NvY2tsaXN0ICpwYWMsICpwcmV2X3BhYzsKKworCXdyaXRlX2xvY2tfYmgoJmlwdjZfc2tfYWNfbG9jayk7CisJcHJldl9wYWMgPSBOVUxMOworCWZvciAocGFjID0gbnAtPmlwdjZfYWNfbGlzdDsgcGFjOyBwYWMgPSBwYWMtPmFjbF9uZXh0KSB7CisJCWlmICgoaWZpbmRleCA9PSAwIHx8IHBhYy0+YWNsX2lmaW5kZXggPT0gaWZpbmRleCkgJiYKKwkJICAgICBpcHY2X2FkZHJfZXF1YWwoJnBhYy0+YWNsX2FkZHIsIGFkZHIpKQorCQkJYnJlYWs7CisJCXByZXZfcGFjID0gcGFjOworCX0KKwlpZiAoIXBhYykgeworCQl3cml0ZV91bmxvY2tfYmgoJmlwdjZfc2tfYWNfbG9jayk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKwlpZiAocHJldl9wYWMpCisJCXByZXZfcGFjLT5hY2xfbmV4dCA9IHBhYy0+YWNsX25leHQ7CisJZWxzZQorCQlucC0+aXB2Nl9hY19saXN0ID0gcGFjLT5hY2xfbmV4dDsKKworCXdyaXRlX3VubG9ja19iaCgmaXB2Nl9za19hY19sb2NrKTsKKworCWRldiA9IGRldl9nZXRfYnlfaW5kZXgocGFjLT5hY2xfaWZpbmRleCk7CisJaWYgKGRldikgeworCQlpcHY2X2Rldl9hY19kZWMoZGV2LCAmcGFjLT5hY2xfYWRkcik7CisJCWRldl9wdXQoZGV2KTsKKwl9CisJc29ja19rZnJlZV9zKHNrLCBwYWMsIHNpemVvZigqcGFjKSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaXB2Nl9zb2NrX2FjX2Nsb3NlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IGlwdjZfYWNfc29ja2xpc3QgKnBhYzsKKwlpbnQJcHJldl9pbmRleDsKKworCXdyaXRlX2xvY2tfYmgoJmlwdjZfc2tfYWNfbG9jayk7CisJcGFjID0gbnAtPmlwdjZfYWNfbGlzdDsKKwlucC0+aXB2Nl9hY19saXN0ID0gTlVMTDsKKwl3cml0ZV91bmxvY2tfYmgoJmlwdjZfc2tfYWNfbG9jayk7CisKKwlwcmV2X2luZGV4ID0gMDsKKwl3aGlsZSAocGFjKSB7CisJCXN0cnVjdCBpcHY2X2FjX3NvY2tsaXN0ICpuZXh0ID0gcGFjLT5hY2xfbmV4dDsKKworCQlpZiAocGFjLT5hY2xfaWZpbmRleCAhPSBwcmV2X2luZGV4KSB7CisJCQlpZiAoZGV2KQorCQkJCWRldl9wdXQoZGV2KTsKKwkJCWRldiA9IGRldl9nZXRfYnlfaW5kZXgocGFjLT5hY2xfaWZpbmRleCk7CisJCQlwcmV2X2luZGV4ID0gcGFjLT5hY2xfaWZpbmRleDsKKwkJfQorCQlpZiAoZGV2KQorCQkJaXB2Nl9kZXZfYWNfZGVjKGRldiwgJnBhYy0+YWNsX2FkZHIpOworCQlzb2NrX2tmcmVlX3Moc2ssIHBhYywgc2l6ZW9mKCpwYWMpKTsKKwkJcGFjID0gbmV4dDsKKwl9CisJaWYgKGRldikKKwkJZGV2X3B1dChkZXYpOworfQorCisjaWYgMAorLyogVGhlIGZ1bmN0aW9uIGlzIG5vdCB1c2VkLCB3aGljaCBpcyBmdW5ueS4gQXBwYXJlbnRseSwgYXV0aG9yCisgKiBzdXBwb3NlZCB0byB1c2UgaXQgdG8gZmlsdGVyIG91dCBkYXRhZ3JhbXMgaW5zaWRlIHVkcC9yYXcgYnV0IGZvcmdvdC4KKyAqCisgKiBJdCBpcyBPSywgYW55Y2FzdHMgYXJlIG5vdCBzcGVjaWFsIGNvbXBhcmluZyB0byBkZWxpdmVyeSB0byB1bmljYXN0cy4KKyAqLworCitpbnQgaW5ldDZfYWNfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIsIGludCBpZmluZGV4KQoreworCXN0cnVjdCBpcHY2X2FjX3NvY2tsaXN0ICpwYWM7CisJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOworCWludAlmb3VuZDsKKworCWZvdW5kID0gMDsKKwlyZWFkX2xvY2soJmlwdjZfc2tfYWNfbG9jayk7CisJZm9yIChwYWM9bnAtPmlwdjZfYWNfbGlzdDsgcGFjOyBwYWM9cGFjLT5hY2xfbmV4dCkgeworCQlpZiAoaWZpbmRleCAmJiBwYWMtPmFjbF9pZmluZGV4ICE9IGlmaW5kZXgpCisJCQljb250aW51ZTsKKwkJZm91bmQgPSBpcHY2X2FkZHJfZXF1YWwoJnBhYy0+YWNsX2FkZHIsIGFkZHIpOworCQlpZiAoZm91bmQpCisJCQlicmVhazsKKwl9CisJcmVhZF91bmxvY2soJmlwdjZfc2tfYWNfbG9jayk7CisKKwlyZXR1cm4gZm91bmQ7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBhY2FfcHV0KHN0cnVjdCBpZmFjYWRkcjYgKmFjKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZhYy0+YWNhX3JlZmNudCkpIHsKKwkJaW42X2Rldl9wdXQoYWMtPmFjYV9pZGV2KTsKKwkJZHN0X3JlbGVhc2UoJmFjLT5hY2FfcnQtPnUuZHN0KTsKKwkJa2ZyZWUoYWMpOworCX0KK30KKworLyoKKyAqCWRldmljZSBhbnljYXN0IGdyb3VwIGluYyAoYWRkIGlmIG5vdCBmb3VuZCkKKyAqLworaW50IGlwdjZfZGV2X2FjX2luYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIpCit7CisJc3RydWN0IGlmYWNhZGRyNiAqYWNhOworCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CisJc3RydWN0IHJ0Nl9pbmZvICpydDsKKwlpbnQgZXJyOworCisJaWRldiA9IGluNl9kZXZfZ2V0KGRldik7CisKKwlpZiAoaWRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdyaXRlX2xvY2tfYmgoJmlkZXYtPmxvY2spOworCWlmIChpZGV2LT5kZWFkKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCWZvciAoYWNhID0gaWRldi0+YWNfbGlzdDsgYWNhOyBhY2EgPSBhY2EtPmFjYV9uZXh0KSB7CisJCWlmIChpcHY2X2FkZHJfZXF1YWwoJmFjYS0+YWNhX2FkZHIsIGFkZHIpKSB7CisJCQlhY2EtPmFjYV91c2VycysrOworCQkJZXJyID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJLyoKKwkgKglub3QgZm91bmQ6IGNyZWF0ZSBhIG5ldyBvbmUuCisJICovCisKKwlhY2EgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWZhY2FkZHI2KSwgR0ZQX0FUT01JQyk7CisKKwlpZiAoYWNhID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJcnQgPSBhZGRyY29uZl9kc3RfYWxsb2MoaWRldiwgYWRkciwgMSk7CisJaWYgKElTX0VSUihydCkpIHsKKwkJa2ZyZWUoYWNhKTsKKwkJZXJyID0gUFRSX0VSUihydCk7CisJCWdvdG8gb3V0OworCX0KKworCW1lbXNldChhY2EsIDAsIHNpemVvZihzdHJ1Y3QgaWZhY2FkZHI2KSk7CisKKwlpcHY2X2FkZHJfY29weSgmYWNhLT5hY2FfYWRkciwgYWRkcik7CisJYWNhLT5hY2FfaWRldiA9IGlkZXY7CisJYWNhLT5hY2FfcnQgPSBydDsKKwlhY2EtPmFjYV91c2VycyA9IDE7CisJLyogYWNhX3RzdGFtcCBzaG91bGQgYmUgdXBkYXRlZCB1cG9uIGNoYW5nZXMgKi8KKwlhY2EtPmFjYV9jc3RhbXAgPSBhY2EtPmFjYV90c3RhbXAgPSBqaWZmaWVzOworCWF0b21pY19zZXQoJmFjYS0+YWNhX3JlZmNudCwgMik7CisJc3Bpbl9sb2NrX2luaXQoJmFjYS0+YWNhX2xvY2spOworCisJYWNhLT5hY2FfbmV4dCA9IGlkZXYtPmFjX2xpc3Q7CisJaWRldi0+YWNfbGlzdCA9IGFjYTsKKwl3cml0ZV91bmxvY2tfYmgoJmlkZXYtPmxvY2spOworCisJZHN0X2hvbGQoJnJ0LT51LmRzdCk7CisJaWYgKGlwNl9pbnNfcnQocnQsIE5VTEwsIE5VTEwpKQorCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKworCWFkZHJjb25mX2pvaW5fc29saWN0KGRldiwgJmFjYS0+YWNhX2FkZHIpOworCisJYWNhX3B1dChhY2EpOworCXJldHVybiAwOworb3V0OgorCXdyaXRlX3VubG9ja19iaCgmaWRldi0+bG9jayk7CisJaW42X2Rldl9wdXQoaWRldik7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqCWRldmljZSBhbnljYXN0IGdyb3VwIGRlY3JlbWVudAorICovCitpbnQgX19pcHY2X2Rldl9hY19kZWMoc3RydWN0IGluZXQ2X2RldiAqaWRldiwgc3RydWN0IGluNl9hZGRyICphZGRyKQoreworCXN0cnVjdCBpZmFjYWRkcjYgKmFjYSwgKnByZXZfYWNhOworCisJd3JpdGVfbG9ja19iaCgmaWRldi0+bG9jayk7CisJcHJldl9hY2EgPSBOVUxMOworCWZvciAoYWNhID0gaWRldi0+YWNfbGlzdDsgYWNhOyBhY2EgPSBhY2EtPmFjYV9uZXh0KSB7CisJCWlmIChpcHY2X2FkZHJfZXF1YWwoJmFjYS0+YWNhX2FkZHIsIGFkZHIpKQorCQkJYnJlYWs7CisJCXByZXZfYWNhID0gYWNhOworCX0KKwlpZiAoIWFjYSkgeworCQl3cml0ZV91bmxvY2tfYmgoJmlkZXYtPmxvY2spOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJaWYgKC0tYWNhLT5hY2FfdXNlcnMgPiAwKSB7CisJCXdyaXRlX3VubG9ja19iaCgmaWRldi0+bG9jayk7CisJCXJldHVybiAwOworCX0KKwlpZiAocHJldl9hY2EpCisJCXByZXZfYWNhLT5hY2FfbmV4dCA9IGFjYS0+YWNhX25leHQ7CisJZWxzZQorCQlpZGV2LT5hY19saXN0ID0gYWNhLT5hY2FfbmV4dDsKKwl3cml0ZV91bmxvY2tfYmgoJmlkZXYtPmxvY2spOworCWFkZHJjb25mX2xlYXZlX3NvbGljdChpZGV2LCAmYWNhLT5hY2FfYWRkcik7CisKKwlkc3RfaG9sZCgmYWNhLT5hY2FfcnQtPnUuZHN0KTsKKwlpZiAoaXA2X2RlbF9ydChhY2EtPmFjYV9ydCwgTlVMTCwgTlVMTCkpCisJCWRzdF9mcmVlKCZhY2EtPmFjYV9ydC0+dS5kc3QpOworCWVsc2UKKwkJZHN0X3JlbGVhc2UoJmFjYS0+YWNhX3J0LT51LmRzdCk7CisKKwlhY2FfcHV0KGFjYSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB2Nl9kZXZfYWNfZGVjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpbjZfYWRkciAqYWRkcikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBpbjZfZGV2X2dldChkZXYpOworCWlmIChpZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCXJldCA9IF9faXB2Nl9kZXZfYWNfZGVjKGlkZXYsIGFkZHIpOworCWluNl9kZXZfcHV0KGlkZXYpOworCXJldHVybiByZXQ7Cit9CisJCisvKgorICoJY2hlY2sgaWYgdGhlIGludGVyZmFjZSBoYXMgdGhpcyBhbnljYXN0IGFkZHJlc3MKKyAqLworc3RhdGljIGludCBpcHY2X2Noa19hY2FzdF9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGluNl9hZGRyICphZGRyKQoreworCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CisJc3RydWN0IGlmYWNhZGRyNiAqYWNhOworCisJaWRldiA9IGluNl9kZXZfZ2V0KGRldik7CisJaWYgKGlkZXYpIHsKKwkJcmVhZF9sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwkJZm9yIChhY2EgPSBpZGV2LT5hY19saXN0OyBhY2E7IGFjYSA9IGFjYS0+YWNhX25leHQpCisJCQlpZiAoaXB2Nl9hZGRyX2VxdWFsKCZhY2EtPmFjYV9hZGRyLCBhZGRyKSkKKwkJCQlicmVhazsKKwkJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOworCQlpbjZfZGV2X3B1dChpZGV2KTsKKwkJcmV0dXJuIGFjYSAhPSAwOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCWNoZWNrIGlmIGdpdmVuIGludGVyZmFjZSAob3IgYW55LCBpZiBkZXY9PTApIGhhcyB0aGlzIGFueWNhc3QgYWRkcmVzcworICovCitpbnQgaXB2Nl9jaGtfYWNhc3RfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIpCit7CisJaWYgKGRldikKKwkJcmV0dXJuIGlwdjZfY2hrX2FjYXN0X2RldihkZXYsIGFkZHIpOworCXJlYWRfbG9jaygmZGV2X2Jhc2VfbG9jayk7CisJZm9yIChkZXY9ZGV2X2Jhc2U7IGRldjsgZGV2PWRldi0+bmV4dCkKKwkJaWYgKGlwdjZfY2hrX2FjYXN0X2RldihkZXYsIGFkZHIpKQorCQkJYnJlYWs7CisJcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOworCXJldHVybiBkZXYgIT0gMDsKK30KKworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0cnVjdCBhYzZfaXRlcl9zdGF0ZSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OworfTsKKworI2RlZmluZSBhYzZfc2VxX3ByaXZhdGUoc2VxKQkoKHN0cnVjdCBhYzZfaXRlcl9zdGF0ZSAqKShzZXEpLT5wcml2YXRlKQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpZmFjYWRkcjYgKmFjNl9nZXRfZmlyc3Qoc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc3RydWN0IGlmYWNhZGRyNiAqaW0gPSBOVUxMOworCXN0cnVjdCBhYzZfaXRlcl9zdGF0ZSAqc3RhdGUgPSBhYzZfc2VxX3ByaXZhdGUoc2VxKTsKKworCWZvciAoc3RhdGUtPmRldiA9IGRldl9iYXNlLCBzdGF0ZS0+aWRldiA9IE5VTEw7CisJICAgICBzdGF0ZS0+ZGV2OworCSAgICAgc3RhdGUtPmRldiA9IHN0YXRlLT5kZXYtPm5leHQpIHsKKwkJc3RydWN0IGluZXQ2X2RldiAqaWRldjsKKwkJaWRldiA9IGluNl9kZXZfZ2V0KHN0YXRlLT5kZXYpOworCQlpZiAoIWlkZXYpCisJCQljb250aW51ZTsKKwkJcmVhZF9sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwkJaW0gPSBpZGV2LT5hY19saXN0OworCQlpZiAoaW0pIHsKKwkJCXN0YXRlLT5pZGV2ID0gaWRldjsKKwkJCWJyZWFrOworCQl9CisJCXJlYWRfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwl9CisJcmV0dXJuIGltOworfQorCitzdGF0aWMgc3RydWN0IGlmYWNhZGRyNiAqYWM2X2dldF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgaWZhY2FkZHI2ICppbSkKK3sKKwlzdHJ1Y3QgYWM2X2l0ZXJfc3RhdGUgKnN0YXRlID0gYWM2X3NlcV9wcml2YXRlKHNlcSk7CisKKwlpbSA9IGltLT5hY2FfbmV4dDsKKwl3aGlsZSAoIWltKSB7CisJCWlmIChsaWtlbHkoc3RhdGUtPmlkZXYgIT0gTlVMTCkpIHsKKwkJCXJlYWRfdW5sb2NrX2JoKCZzdGF0ZS0+aWRldi0+bG9jayk7CisJCQlpbjZfZGV2X3B1dChzdGF0ZS0+aWRldik7CisJCX0KKwkJc3RhdGUtPmRldiA9IHN0YXRlLT5kZXYtPm5leHQ7CisJCWlmICghc3RhdGUtPmRldikgeworCQkJc3RhdGUtPmlkZXYgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJc3RhdGUtPmlkZXYgPSBpbjZfZGV2X2dldChzdGF0ZS0+ZGV2KTsKKwkJaWYgKCFzdGF0ZS0+aWRldikKKwkJCWNvbnRpbnVlOworCQlyZWFkX2xvY2tfYmgoJnN0YXRlLT5pZGV2LT5sb2NrKTsKKwkJaW0gPSBzdGF0ZS0+aWRldi0+YWNfbGlzdDsKKwl9CisJcmV0dXJuIGltOworfQorCitzdGF0aWMgc3RydWN0IGlmYWNhZGRyNiAqYWM2X2dldF9pZHgoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCBwb3MpCit7CisJc3RydWN0IGlmYWNhZGRyNiAqaW0gPSBhYzZfZ2V0X2ZpcnN0KHNlcSk7CisJaWYgKGltKQorCQl3aGlsZSAocG9zICYmIChpbSA9IGFjNl9nZXRfbmV4dChzZXEsIGltKSkgIT0gTlVMTCkKKwkJCS0tcG9zOworCXJldHVybiBwb3MgPyBOVUxMIDogaW07Cit9CisKK3N0YXRpYyB2b2lkICphYzZfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOworCXJldHVybiBhYzZfZ2V0X2lkeChzZXEsICpwb3MpOworfQorCitzdGF0aWMgdm9pZCAqYWM2X3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaWZhY2FkZHI2ICppbTsKKwlpbSA9IGFjNl9nZXRfbmV4dChzZXEsIHYpOworCSsrKnBvczsKKwlyZXR1cm4gaW07Cit9CisKK3N0YXRpYyB2b2lkIGFjNl9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgYWM2X2l0ZXJfc3RhdGUgKnN0YXRlID0gYWM2X3NlcV9wcml2YXRlKHNlcSk7CisJaWYgKGxpa2VseShzdGF0ZS0+aWRldiAhPSBOVUxMKSkgeworCQlyZWFkX3VubG9ja19iaCgmc3RhdGUtPmlkZXYtPmxvY2spOworCQlpbjZfZGV2X3B1dChzdGF0ZS0+aWRldik7CisJfQorCXJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsKK30KKworc3RhdGljIGludCBhYzZfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IGlmYWNhZGRyNiAqaW0gPSAoc3RydWN0IGlmYWNhZGRyNiAqKXY7CisJc3RydWN0IGFjNl9pdGVyX3N0YXRlICpzdGF0ZSA9IGFjNl9zZXFfcHJpdmF0ZShzZXEpOworCisJc2VxX3ByaW50ZihzZXEsCisJCSAgICIlLTRkICUtMTVzICIKKwkJICAgIiUwNHglMDR4JTA0eCUwNHglMDR4JTA0eCUwNHglMDR4ICIKKwkJICAgIiU1ZFxuIiwKKwkJICAgc3RhdGUtPmRldi0+aWZpbmRleCwgc3RhdGUtPmRldi0+bmFtZSwKKwkJICAgTklQNihpbS0+YWNhX2FkZHIpLAorCQkgICBpbS0+YWNhX3VzZXJzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBhYzZfc2VxX29wcyA9IHsKKwkuc3RhcnQJPQlhYzZfc2VxX3N0YXJ0LAorCS5uZXh0CT0JYWM2X3NlcV9uZXh0LAorCS5zdG9wCT0JYWM2X3NlcV9zdG9wLAorCS5zaG93CT0JYWM2X3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBhYzZfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNlcV9maWxlICpzZXE7CisJaW50IHJjID0gLUVOT01FTTsKKwlzdHJ1Y3QgYWM2X2l0ZXJfc3RhdGUgKnMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOworCisJaWYgKCFzKQorCQlnb3RvIG91dDsKKworCXJjID0gc2VxX29wZW4oZmlsZSwgJmFjNl9zZXFfb3BzKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0X2tmcmVlOworCisJc2VxID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNlcS0+cHJpdmF0ZSA9IHM7CisJbWVtc2V0KHMsIDAsIHNpemVvZigqcykpOworb3V0OgorCXJldHVybiByYzsKK291dF9rZnJlZToKKwlrZnJlZShzKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWM2X3NlcV9mb3BzID0geworCS5vd25lcgkJPQlUSElTX01PRFVMRSwKKwkub3BlbgkJPQlhYzZfc2VxX29wZW4sCisJLnJlYWQJCT0Jc2VxX3JlYWQsCisJLmxsc2VlawkJPQlzZXFfbHNlZWssCisJLnJlbGVhc2UJPQlzZXFfcmVsZWFzZV9wcml2YXRlLAorfTsKKworaW50IF9faW5pdCBhYzZfcHJvY19pbml0KHZvaWQpCit7CisJaWYgKCFwcm9jX25ldF9mb3BzX2NyZWF0ZSgiYW55Y2FzdDYiLCBTX0lSVUdPLCAmYWM2X3NlcV9mb3BzKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBhYzZfcHJvY19leGl0KHZvaWQpCit7CisJcHJvY19uZXRfcmVtb3ZlKCJhbnljYXN0NiIpOworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2RhdGFncmFtLmMgYi9uZXQvaXB2Ni9kYXRhZ3JhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YjkzNzUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2Ni9kYXRhZ3JhbS5jCkBAIC0wLDAgKzEsNjAwIEBACisvKgorICoJY29tbW9uIFVEUC9SQVcgY29kZQorICoJTGludXggSU5FVDYgaW1wbGVtZW50YXRpb24gCisgKgorICoJQXV0aG9yczoKKyAqCVBlZHJvIFJvcXVlCQk8cm9xdWVAZGkuZmMudWwucHQ+CQorICoKKyAqCSRJZDogZGF0YWdyYW0uYyx2IDEuMjQgMjAwMi8wMi8wMSAyMjowMTowNCBkYXZlbSBFeHAgJAorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvcm91dGUuaD4KKworI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L25kaXNjLmg+CisjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CisjaW5jbHVkZSA8bmV0L3RyYW5zcF92Ni5oPgorI2luY2x1ZGUgPG5ldC9pcDZfcm91dGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2VycnF1ZXVlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworaW50IGlwNl9kYXRhZ3JhbV9jb25uZWN0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwgaW50IGFkZHJfbGVuKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbjYJKnVzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSB1YWRkcjsKKwlzdHJ1Y3QgaW5ldF9zb2NrICAgICAgCSppbmV0ID0gaW5ldF9zayhzayk7CisJc3RydWN0IGlwdjZfcGluZm8gICAgICAJKm5wID0gaW5ldDZfc2soc2spOworCXN0cnVjdCBpbjZfYWRkcgkJKmRhZGRyLCAqZmluYWxfcCA9IE5VTEwsIGZpbmFsOworCXN0cnVjdCBkc3RfZW50cnkJKmRzdDsKKwlzdHJ1Y3QgZmxvd2kJCWZsOworCXN0cnVjdCBpcDZfZmxvd2xhYmVsCSpmbG93bGFiZWwgPSBOVUxMOworCWludAkJCWFkZHJfdHlwZTsKKwlpbnQJCQllcnI7CisKKwlpZiAodXNpbi0+c2luNl9mYW1pbHkgPT0gQUZfSU5FVCkgeworCQlpZiAoX19pcHY2X29ubHlfc29jayhzaykpCisJCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKKwkJZXJyID0gaXA0X2RhdGFncmFtX2Nvbm5lY3Qoc2ssIHVhZGRyLCBhZGRyX2xlbik7CisJCWdvdG8gaXB2NF9jb25uZWN0ZWQ7CisJfQorCisJaWYgKGFkZHJfbGVuIDwgU0lONl9MRU5fUkZDMjEzMykKKwkgIAlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh1c2luLT5zaW42X2ZhbWlseSAhPSBBRl9JTkVUNikgCisJICAJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisKKwltZW1zZXQoJmZsLCAwLCBzaXplb2YoZmwpKTsKKwlpZiAobnAtPnNuZGZsb3cpIHsKKwkJZmwuZmw2X2Zsb3dsYWJlbCA9IHVzaW4tPnNpbjZfZmxvd2luZm8mSVBWNl9GTE9XSU5GT19NQVNLOworCQlpZiAoZmwuZmw2X2Zsb3dsYWJlbCZJUFY2X0ZMT1dMQUJFTF9NQVNLKSB7CisJCQlmbG93bGFiZWwgPSBmbDZfc29ja19sb29rdXAoc2ssIGZsLmZsNl9mbG93bGFiZWwpOworCQkJaWYgKGZsb3dsYWJlbCA9PSBOVUxMKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaXB2Nl9hZGRyX2NvcHkoJnVzaW4tPnNpbjZfYWRkciwgJmZsb3dsYWJlbC0+ZHN0KTsKKwkJfQorCX0KKworCWFkZHJfdHlwZSA9IGlwdjZfYWRkcl90eXBlKCZ1c2luLT5zaW42X2FkZHIpOworCisJaWYgKGFkZHJfdHlwZSA9PSBJUFY2X0FERFJfQU5ZKSB7CisJCS8qCisJCSAqCWNvbm5lY3QgdG8gc2VsZgorCQkgKi8KKwkJdXNpbi0+c2luNl9hZGRyLnM2X2FkZHJbMTVdID0gMHgwMTsKKwl9CisKKwlkYWRkciA9ICZ1c2luLT5zaW42X2FkZHI7CisKKwlpZiAoYWRkcl90eXBlID09IElQVjZfQUREUl9NQVBQRUQpIHsKKwkJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKworCQlpZiAoX19pcHY2X29ubHlfc29jayhzaykpIHsKKwkJCWVyciA9IC1FTkVUVU5SRUFDSDsKKwkJCWdvdG8gb3V0OworCQl9CisJCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJc2luLnNpbl9hZGRyLnNfYWRkciA9IGRhZGRyLT5zNl9hZGRyMzJbM107CisJCXNpbi5zaW5fcG9ydCA9IHVzaW4tPnNpbjZfcG9ydDsKKworCQllcnIgPSBpcDRfZGF0YWdyYW1fY29ubmVjdChzaywgCisJCQkJCSAgIChzdHJ1Y3Qgc29ja2FkZHIqKSAmc2luLCAKKwkJCQkJICAgc2l6ZW9mKHNpbikpOworCitpcHY0X2Nvbm5lY3RlZDoKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCQkKKwkJaXB2Nl9hZGRyX3NldCgmbnAtPmRhZGRyLCAwLCAwLCBodG9ubCgweDAwMDBmZmZmKSwgaW5ldC0+ZGFkZHIpOworCisJCWlmIChpcHY2X2FkZHJfYW55KCZucC0+c2FkZHIpKSB7CisJCQlpcHY2X2FkZHJfc2V0KCZucC0+c2FkZHIsIDAsIDAsIGh0b25sKDB4MDAwMGZmZmYpLAorCQkJCSAgICAgIGluZXQtPnNhZGRyKTsKKwkJfQorCisJCWlmIChpcHY2X2FkZHJfYW55KCZucC0+cmN2X3NhZGRyKSkgeworCQkJaXB2Nl9hZGRyX3NldCgmbnAtPnJjdl9zYWRkciwgMCwgMCwgaHRvbmwoMHgwMDAwZmZmZiksCisJCQkJICAgICAgaW5ldC0+cmN2X3NhZGRyKTsKKwkJfQorCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYWRkcl90eXBlJklQVjZfQUREUl9MSU5LTE9DQUwpIHsKKwkJaWYgKGFkZHJfbGVuID49IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSAmJgorCQkgICAgdXNpbi0+c2luNl9zY29wZV9pZCkgeworCQkJaWYgKHNrLT5za19ib3VuZF9kZXZfaWYgJiYKKwkJCSAgICBzay0+c2tfYm91bmRfZGV2X2lmICE9IHVzaW4tPnNpbjZfc2NvcGVfaWQpIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJc2stPnNrX2JvdW5kX2Rldl9pZiA9IHVzaW4tPnNpbjZfc2NvcGVfaWQ7CisJCQlpZiAoIXNrLT5za19ib3VuZF9kZXZfaWYgJiYKKwkJCSAgICAoYWRkcl90eXBlICYgSVBWNl9BRERSX01VTFRJQ0FTVCkpCisJCQkJZmwub2lmID0gbnAtPm1jYXN0X29pZjsKKwkJfQorCisJCS8qIENvbm5lY3QgdG8gbGluay1sb2NhbCBhZGRyZXNzIHJlcXVpcmVzIGFuIGludGVyZmFjZSAqLworCQlpZiAoIXNrLT5za19ib3VuZF9kZXZfaWYpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlwdjZfYWRkcl9jb3B5KCZucC0+ZGFkZHIsIGRhZGRyKTsKKwlucC0+Zmxvd19sYWJlbCA9IGZsLmZsNl9mbG93bGFiZWw7CisKKwlpbmV0LT5kcG9ydCA9IHVzaW4tPnNpbjZfcG9ydDsKKworCS8qCisJICoJQ2hlY2sgZm9yIGEgcm91dGUgdG8gZGVzdGluYXRpb24gYW4gb2J0YWluIHRoZQorCSAqCWRlc3RpbmF0aW9uIGNhY2hlIGZvciBpdC4KKwkgKi8KKworCWZsLnByb3RvID0gc2stPnNrX3Byb3RvY29sOworCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCAmbnAtPmRhZGRyKTsKKwlpcHY2X2FkZHJfY29weSgmZmwuZmw2X3NyYywgJm5wLT5zYWRkcik7CisJZmwub2lmID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKKwlmbC5mbF9pcF9kcG9ydCA9IGluZXQtPmRwb3J0OworCWZsLmZsX2lwX3Nwb3J0ID0gaW5ldC0+c3BvcnQ7CisKKwlpZiAoIWZsLm9pZiAmJiAoYWRkcl90eXBlJklQVjZfQUREUl9NVUxUSUNBU1QpKQorCQlmbC5vaWYgPSBucC0+bWNhc3Rfb2lmOworCisJaWYgKGZsb3dsYWJlbCkgeworCQlpZiAoZmxvd2xhYmVsLT5vcHQgJiYgZmxvd2xhYmVsLT5vcHQtPnNyY3J0KSB7CisJCQlzdHJ1Y3QgcnQwX2hkciAqcnQwID0gKHN0cnVjdCBydDBfaGRyICopIGZsb3dsYWJlbC0+b3B0LT5zcmNydDsKKwkJCWlwdjZfYWRkcl9jb3B5KCZmaW5hbCwgJmZsLmZsNl9kc3QpOworCQkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsIHJ0MC0+YWRkcik7CisJCQlmaW5hbF9wID0gJmZpbmFsOworCQl9CisJfSBlbHNlIGlmIChucC0+b3B0ICYmIG5wLT5vcHQtPnNyY3J0KSB7CisJCXN0cnVjdCBydDBfaGRyICpydDAgPSAoc3RydWN0IHJ0MF9oZHIgKilucC0+b3B0LT5zcmNydDsKKwkJaXB2Nl9hZGRyX2NvcHkoJmZpbmFsLCAmZmwuZmw2X2RzdCk7CisJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCBydDAtPmFkZHIpOworCQlmaW5hbF9wID0gJmZpbmFsOworCX0KKworCWVyciA9IGlwNl9kc3RfbG9va3VwKHNrLCAmZHN0LCAmZmwpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWlmIChmaW5hbF9wKQorCQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgZmluYWxfcCk7CisKKwlpZiAoKGVyciA9IHhmcm1fbG9va3VwKCZkc3QsICZmbCwgc2ssIDApKSA8IDApIHsKKwkJZHN0X3JlbGVhc2UoZHN0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogc291cmNlIGFkZHJlc3MgbG9va3VwIGRvbmUgaW4gaXA2X2RzdF9sb29rdXAgKi8KKworCWlmIChpcHY2X2FkZHJfYW55KCZucC0+c2FkZHIpKQorCQlpcHY2X2FkZHJfY29weSgmbnAtPnNhZGRyLCAmZmwuZmw2X3NyYyk7CisKKwlpZiAoaXB2Nl9hZGRyX2FueSgmbnAtPnJjdl9zYWRkcikpIHsKKwkJaXB2Nl9hZGRyX2NvcHkoJm5wLT5yY3Zfc2FkZHIsICZmbC5mbDZfc3JjKTsKKwkJaW5ldC0+cmN2X3NhZGRyID0gTE9PUEJBQ0s0X0lQVjY7CisJfQorCisJaXA2X2RzdF9zdG9yZShzaywgZHN0LAorCQkgICAgICBpcHY2X2FkZHJfZXF1YWwoJmZsLmZsNl9kc3QsICZucC0+ZGFkZHIpID8KKwkJICAgICAgJm5wLT5kYWRkciA6IE5VTEwpOworCisJc2stPnNrX3N0YXRlID0gVENQX0VTVEFCTElTSEVEOworb3V0OgorCWZsNl9zb2NrX3JlbGVhc2UoZmxvd2xhYmVsKTsKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIGlwdjZfaWNtcF9lcnJvcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIGludCBlcnIsIAorCQkgICAgIHUxNiBwb3J0LCB1MzIgaW5mbywgdTggKnBheWxvYWQpCit7CisJc3RydWN0IGlwdjZfcGluZm8gKm5wICA9IGluZXQ2X3NrKHNrKTsKKwlzdHJ1Y3QgaWNtcDZoZHIgKmljbXBoID0gKHN0cnVjdCBpY21wNmhkciAqKXNrYi0+aC5yYXc7CisJc3RydWN0IHNvY2tfZXh0ZXJyX3NrYiAqc2VycjsKKworCWlmICghbnAtPnJlY3ZlcnIpCisJCXJldHVybjsKKworCXNrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCWlmICghc2tiKQorCQlyZXR1cm47CisKKwlzZXJyID0gU0tCX0VYVF9FUlIoc2tiKTsKKwlzZXJyLT5lZS5lZV9lcnJubyA9IGVycjsKKwlzZXJyLT5lZS5lZV9vcmlnaW4gPSBTT19FRV9PUklHSU5fSUNNUDY7CisJc2Vyci0+ZWUuZWVfdHlwZSA9IGljbXBoLT5pY21wNl90eXBlOyAKKwlzZXJyLT5lZS5lZV9jb2RlID0gaWNtcGgtPmljbXA2X2NvZGU7CisJc2Vyci0+ZWUuZWVfcGFkID0gMDsKKwlzZXJyLT5lZS5lZV9pbmZvID0gaW5mbzsKKwlzZXJyLT5lZS5lZV9kYXRhID0gMDsKKwlzZXJyLT5hZGRyX29mZnNldCA9ICh1OCopJigoKHN0cnVjdCBpcHY2aGRyKikoaWNtcGgrMSkpLT5kYWRkcikgLSBza2ItPm5oLnJhdzsKKwlzZXJyLT5wb3J0ID0gcG9ydDsKKworCXNrYi0+aC5yYXcgPSBwYXlsb2FkOworCV9fc2tiX3B1bGwoc2tiLCBwYXlsb2FkIC0gc2tiLT5kYXRhKTsKKworCWlmIChzb2NrX3F1ZXVlX2Vycl9za2Ioc2ssIHNrYikpCisJCWtmcmVlX3NrYihza2IpOworfQorCit2b2lkIGlwdjZfbG9jYWxfZXJyb3Ioc3RydWN0IHNvY2sgKnNrLCBpbnQgZXJyLCBzdHJ1Y3QgZmxvd2kgKmZsLCB1MzIgaW5mbykKK3sKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CisJc3RydWN0IHNvY2tfZXh0ZXJyX3NrYiAqc2VycjsKKwlzdHJ1Y3QgaXB2NmhkciAqaXBoOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlpZiAoIW5wLT5yZWN2ZXJyKQorCQlyZXR1cm47CisKKwlza2IgPSBhbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFza2IpCisJCXJldHVybjsKKworCWlwaCA9IChzdHJ1Y3QgaXB2Nmhkciopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCXNrYi0+bmguaXB2NmggPSBpcGg7CisJaXB2Nl9hZGRyX2NvcHkoJmlwaC0+ZGFkZHIsICZmbC0+Zmw2X2RzdCk7CisKKwlzZXJyID0gU0tCX0VYVF9FUlIoc2tiKTsKKwlzZXJyLT5lZS5lZV9lcnJubyA9IGVycjsKKwlzZXJyLT5lZS5lZV9vcmlnaW4gPSBTT19FRV9PUklHSU5fTE9DQUw7CisJc2Vyci0+ZWUuZWVfdHlwZSA9IDA7IAorCXNlcnItPmVlLmVlX2NvZGUgPSAwOworCXNlcnItPmVlLmVlX3BhZCA9IDA7CisJc2Vyci0+ZWUuZWVfaW5mbyA9IGluZm87CisJc2Vyci0+ZWUuZWVfZGF0YSA9IDA7CisJc2Vyci0+YWRkcl9vZmZzZXQgPSAodTgqKSZpcGgtPmRhZGRyIC0gc2tiLT5uaC5yYXc7CisJc2Vyci0+cG9ydCA9IGZsLT5mbF9pcF9kcG9ydDsKKworCXNrYi0+aC5yYXcgPSBza2ItPnRhaWw7CisJX19za2JfcHVsbChza2IsIHNrYi0+dGFpbCAtIHNrYi0+ZGF0YSk7CisKKwlpZiAoc29ja19xdWV1ZV9lcnJfc2tiKHNrLCBza2IpKQorCQlrZnJlZV9za2Ioc2tiKTsKK30KKworLyogCisgKglIYW5kbGUgTVNHX0VSUlFVRVVFCisgKi8KK2ludCBpcHY2X3JlY3ZfZXJyb3Ioc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIGludCBsZW4pCit7CisJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOworCXN0cnVjdCBzb2NrX2V4dGVycl9za2IgKnNlcnI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnNrYjI7CisJc3RydWN0IHNvY2thZGRyX2luNiAqc2luOworCXN0cnVjdCB7CisJCXN0cnVjdCBzb2NrX2V4dGVuZGVkX2VyciBlZTsKKwkJc3RydWN0IHNvY2thZGRyX2luNgkgb2ZmZW5kZXI7CisJfSBlcnJoZHI7CisJaW50IGVycjsKKwlpbnQgY29waWVkOworCisJZXJyID0gLUVBR0FJTjsKKwlza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX2Vycm9yX3F1ZXVlKTsKKwlpZiAoc2tiID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJY29waWVkID0gc2tiLT5sZW47CisJaWYgKGNvcGllZCA+IGxlbikgeworCQltc2ctPm1zZ19mbGFncyB8PSBNU0dfVFJVTkM7CisJCWNvcGllZCA9IGxlbjsKKwl9CisJZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCAwLCBtc2ctPm1zZ19pb3YsIGNvcGllZCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV9za2I7CisKKwlzb2NrX3JlY3ZfdGltZXN0YW1wKG1zZywgc2ssIHNrYik7CisKKwlzZXJyID0gU0tCX0VYVF9FUlIoc2tiKTsKKworCXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopbXNnLT5tc2dfbmFtZTsKKwlpZiAoc2luKSB7CisJCXNpbi0+c2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKwkJc2luLT5zaW42X2Zsb3dpbmZvID0gMDsKKwkJc2luLT5zaW42X3BvcnQgPSBzZXJyLT5wb3J0OyAKKwkJc2luLT5zaW42X3Njb3BlX2lkID0gMDsKKwkJaWYgKHNlcnItPmVlLmVlX29yaWdpbiA9PSBTT19FRV9PUklHSU5fSUNNUDYpIHsKKwkJCWlwdjZfYWRkcl9jb3B5KCZzaW4tPnNpbjZfYWRkciwKKwkJCSAgKHN0cnVjdCBpbjZfYWRkciAqKShza2ItPm5oLnJhdyArIHNlcnItPmFkZHJfb2Zmc2V0KSk7CisJCQlpZiAobnAtPnNuZGZsb3cpCisJCQkJc2luLT5zaW42X2Zsb3dpbmZvID0gKih1MzIqKShza2ItPm5oLnJhdyArIHNlcnItPmFkZHJfb2Zmc2V0IC0gMjQpICYgSVBWNl9GTE9XSU5GT19NQVNLOworCQkJaWYgKGlwdjZfYWRkcl90eXBlKCZzaW4tPnNpbjZfYWRkcikgJiBJUFY2X0FERFJfTElOS0xPQ0FMKQorCQkJCXNpbi0+c2luNl9zY29wZV9pZCA9IElQNkNCKHNrYiktPmlpZjsKKwkJfSBlbHNlIHsKKwkJCWlwdjZfYWRkcl9zZXQoJnNpbi0+c2luNl9hZGRyLCAwLCAwLAorCQkJCSAgICAgIGh0b25sKDB4ZmZmZiksCisJCQkJICAgICAgKih1MzIqKShza2ItPm5oLnJhdyArIHNlcnItPmFkZHJfb2Zmc2V0KSk7CisJCX0KKwl9CisKKwltZW1jcHkoJmVycmhkci5lZSwgJnNlcnItPmVlLCBzaXplb2Yoc3RydWN0IHNvY2tfZXh0ZW5kZWRfZXJyKSk7CisJc2luID0gJmVycmhkci5vZmZlbmRlcjsKKwlzaW4tPnNpbjZfZmFtaWx5ID0gQUZfVU5TUEVDOworCWlmIChzZXJyLT5lZS5lZV9vcmlnaW4gIT0gU09fRUVfT1JJR0lOX0xPQ0FMKSB7CisJCXNpbi0+c2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKwkJc2luLT5zaW42X2Zsb3dpbmZvID0gMDsKKwkJc2luLT5zaW42X3Njb3BlX2lkID0gMDsKKwkJaWYgKHNlcnItPmVlLmVlX29yaWdpbiA9PSBTT19FRV9PUklHSU5fSUNNUDYpIHsKKwkJCWlwdjZfYWRkcl9jb3B5KCZzaW4tPnNpbjZfYWRkciwgJnNrYi0+bmguaXB2NmgtPnNhZGRyKTsKKwkJCWlmIChucC0+cnhvcHQuYWxsKQorCQkJCWRhdGFncmFtX3JlY3ZfY3RsKHNrLCBtc2csIHNrYik7CisJCQlpZiAoaXB2Nl9hZGRyX3R5cGUoJnNpbi0+c2luNl9hZGRyKSAmIElQVjZfQUREUl9MSU5LTE9DQUwpCisJCQkJc2luLT5zaW42X3Njb3BlX2lkID0gSVA2Q0Ioc2tiKS0+aWlmOworCQl9IGVsc2UgeworCQkJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCisJCQlpcHY2X2FkZHJfc2V0KCZzaW4tPnNpbjZfYWRkciwgMCwgMCwKKwkJCQkgICAgICBodG9ubCgweGZmZmYpLAorCQkJCSAgICAgIHNrYi0+bmguaXBoLT5zYWRkcik7CisJCQlpZiAoaW5ldC0+Y21zZ19mbGFncykKKwkJCQlpcF9jbXNnX3JlY3YobXNnLCBza2IpOworCQl9CisJfQorCisJcHV0X2Ntc2cobXNnLCBTT0xfSVBWNiwgSVBWNl9SRUNWRVJSLCBzaXplb2YoZXJyaGRyKSwgJmVycmhkcik7CisKKwkvKiBOb3cgd2UgY291bGQgdHJ5IHRvIGR1bXAgb2ZmZW5kZWQgcGFja2V0IG9wdGlvbnMgKi8KKworCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19FUlJRVUVVRTsKKwllcnIgPSBjb3BpZWQ7CisKKwkvKiBSZXNldCBhbmQgcmVnZW5lcmF0ZSBzb2NrZXQgZXJyb3IgKi8KKwlzcGluX2xvY2tfaXJxKCZzay0+c2tfZXJyb3JfcXVldWUubG9jayk7CisJc2stPnNrX2VyciA9IDA7CisJaWYgKChza2IyID0gc2tiX3BlZWsoJnNrLT5za19lcnJvcl9xdWV1ZSkpICE9IE5VTEwpIHsKKwkJc2stPnNrX2VyciA9IFNLQl9FWFRfRVJSKHNrYjIpLT5lZS5lZV9lcnJubzsKKwkJc3Bpbl91bmxvY2tfaXJxKCZzay0+c2tfZXJyb3JfcXVldWUubG9jayk7CisJCXNrLT5za19lcnJvcl9yZXBvcnQoc2spOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2lycSgmc2stPnNrX2Vycm9yX3F1ZXVlLmxvY2spOworCX0KKworb3V0X2ZyZWVfc2tiOgkKKwlrZnJlZV9za2Ioc2tiKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisKKworaW50IGRhdGFncmFtX3JlY3ZfY3RsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKKwlzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCA9IElQNkNCKHNrYik7CisKKwlpZiAobnAtPnJ4b3B0LmJpdHMucnhpbmZvKSB7CisJCXN0cnVjdCBpbjZfcGt0aW5mbyBzcmNfaW5mbzsKKworCQlzcmNfaW5mby5pcGk2X2lmaW5kZXggPSBvcHQtPmlpZjsKKwkJaXB2Nl9hZGRyX2NvcHkoJnNyY19pbmZvLmlwaTZfYWRkciwgJnNrYi0+bmguaXB2NmgtPmRhZGRyKTsKKwkJcHV0X2Ntc2cobXNnLCBTT0xfSVBWNiwgSVBWNl9QS1RJTkZPLCBzaXplb2Yoc3JjX2luZm8pLCAmc3JjX2luZm8pOworCX0KKworCWlmIChucC0+cnhvcHQuYml0cy5yeGhsaW0pIHsKKwkJaW50IGhsaW0gPSBza2ItPm5oLmlwdjZoLT5ob3BfbGltaXQ7CisJCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfSE9QTElNSVQsIHNpemVvZihobGltKSwgJmhsaW0pOworCX0KKworCWlmIChucC0+cnhvcHQuYml0cy5yeGZsb3cgJiYgKCoodTMyKilza2ItPm5oLnJhdyAmIElQVjZfRkxPV0lORk9fTUFTSykpIHsKKwkJdTMyIGZsb3dpbmZvID0gKih1MzIqKXNrYi0+bmgucmF3ICYgSVBWNl9GTE9XSU5GT19NQVNLOworCQlwdXRfY21zZyhtc2csIFNPTF9JUFY2LCBJUFY2X0ZMT1dJTkZPLCBzaXplb2YoZmxvd2luZm8pLCAmZmxvd2luZm8pOworCX0KKwlpZiAobnAtPnJ4b3B0LmJpdHMuaG9wb3B0cyAmJiBvcHQtPmhvcCkgeworCQl1OCAqcHRyID0gc2tiLT5uaC5yYXcgKyBvcHQtPmhvcDsKKwkJcHV0X2Ntc2cobXNnLCBTT0xfSVBWNiwgSVBWNl9IT1BPUFRTLCAocHRyWzFdKzEpPDwzLCBwdHIpOworCX0KKwlpZiAobnAtPnJ4b3B0LmJpdHMuZHN0b3B0cyAmJiBvcHQtPmRzdDApIHsKKwkJdTggKnB0ciA9IHNrYi0+bmgucmF3ICsgb3B0LT5kc3QwOworCQlwdXRfY21zZyhtc2csIFNPTF9JUFY2LCBJUFY2X0RTVE9QVFMsIChwdHJbMV0rMSk8PDMsIHB0cik7CisJfQorCWlmIChucC0+cnhvcHQuYml0cy5zcmNydCAmJiBvcHQtPnNyY3J0KSB7CisJCXN0cnVjdCBpcHY2X3J0X2hkciAqcnRoZHIgPSAoc3RydWN0IGlwdjZfcnRfaGRyICopKHNrYi0+bmgucmF3ICsgb3B0LT5zcmNydCk7CisJCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfUlRIRFIsIChydGhkci0+aGRybGVuKzEpIDw8IDMsIHJ0aGRyKTsKKwl9CisJaWYgKG5wLT5yeG9wdC5iaXRzLmRzdG9wdHMgJiYgb3B0LT5kc3QxKSB7CisJCXU4ICpwdHIgPSBza2ItPm5oLnJhdyArIG9wdC0+ZHN0MTsKKwkJcHV0X2Ntc2cobXNnLCBTT0xfSVBWNiwgSVBWNl9EU1RPUFRTLCAocHRyWzFdKzEpPDwzLCBwdHIpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGRhdGFncmFtX3NlbmRfY3RsKHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IGZsb3dpICpmbCwKKwkJICAgICAgc3RydWN0IGlwdjZfdHhvcHRpb25zICpvcHQsCisJCSAgICAgIGludCAqaGxpbWl0KQoreworCXN0cnVjdCBpbjZfcGt0aW5mbyAqc3JjX2luZm87CisJc3RydWN0IGNtc2doZHIgKmNtc2c7CisJc3RydWN0IGlwdjZfcnRfaGRyICpydGhkcjsKKwlzdHJ1Y3QgaXB2Nl9vcHRfaGRyICpoZHI7CisJaW50IGxlbjsKKwlpbnQgZXJyID0gMDsKKworCWZvciAoY21zZyA9IENNU0dfRklSU1RIRFIobXNnKTsgY21zZzsgY21zZyA9IENNU0dfTlhUSERSKG1zZywgY21zZykpIHsKKwkJaW50IGFkZHJfdHlwZTsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisKKwkJaWYgKCFDTVNHX09LKG1zZywgY21zZykpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIGV4aXRfZjsKKwkJfQorCisJCWlmIChjbXNnLT5jbXNnX2xldmVsICE9IFNPTF9JUFY2KQorCQkJY29udGludWU7CisKKwkJc3dpdGNoIChjbXNnLT5jbXNnX3R5cGUpIHsKKyAJCWNhc2UgSVBWNl9QS1RJTkZPOgorIAkJCWlmIChjbXNnLT5jbXNnX2xlbiA8IENNU0dfTEVOKHNpemVvZihzdHJ1Y3QgaW42X3BrdGluZm8pKSkgeworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJZ290byBleGl0X2Y7CisJCQl9CisKKwkJCXNyY19pbmZvID0gKHN0cnVjdCBpbjZfcGt0aW5mbyAqKUNNU0dfREFUQShjbXNnKTsKKwkJCQorCQkJaWYgKHNyY19pbmZvLT5pcGk2X2lmaW5kZXgpIHsKKwkJCQlpZiAoZmwtPm9pZiAmJiBzcmNfaW5mby0+aXBpNl9pZmluZGV4ICE9IGZsLT5vaWYpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWZsLT5vaWYgPSBzcmNfaW5mby0+aXBpNl9pZmluZGV4OworCQkJfQorCisJCQlhZGRyX3R5cGUgPSBpcHY2X2FkZHJfdHlwZSgmc3JjX2luZm8tPmlwaTZfYWRkcik7CisKKwkJCWlmIChhZGRyX3R5cGUgPT0gSVBWNl9BRERSX0FOWSkKKwkJCQlicmVhazsKKwkJCQorCQkJaWYgKGFkZHJfdHlwZSAmIElQVjZfQUREUl9MSU5LTE9DQUwpIHsKKwkJCQlpZiAoIXNyY19pbmZvLT5pcGk2X2lmaW5kZXgpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWVsc2UgeworCQkJCQlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KHNyY19pbmZvLT5pcGk2X2lmaW5kZXgpOworCQkJCQlpZiAoIWRldikKKwkJCQkJCXJldHVybiAtRU5PREVWOworCQkJCX0KKwkJCX0KKwkJCWlmICghaXB2Nl9jaGtfYWRkcigmc3JjX2luZm8tPmlwaTZfYWRkciwgZGV2LCAwKSkgeworCQkJCWlmIChkZXYpCisJCQkJCWRldl9wdXQoZGV2KTsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gZXhpdF9mOworCQkJfQorCQkJaWYgKGRldikKKwkJCQlkZXZfcHV0KGRldik7CisKKwkJCWlwdjZfYWRkcl9jb3B5KCZmbC0+Zmw2X3NyYywgJnNyY19pbmZvLT5pcGk2X2FkZHIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJUFY2X0ZMT1dJTkZPOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNtc2ctPmNtc2dfbGVuIDwgQ01TR19MRU4oNCkpIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gZXhpdF9mOworCQkJfQorCisJCQlpZiAoZmwtPmZsNl9mbG93bGFiZWwmSVBWNl9GTE9XSU5GT19NQVNLKSB7CisJCQkJaWYgKChmbC0+Zmw2X2Zsb3dsYWJlbF4qKHUzMiAqKUNNU0dfREFUQShjbXNnKSkmfklQVjZfRkxPV0lORk9fTUFTSykgeworCQkJCQllcnIgPSAtRUlOVkFMOworCQkJCQlnb3RvIGV4aXRfZjsKKwkJCQl9CisJCQl9CisJCQlmbC0+Zmw2X2Zsb3dsYWJlbCA9IElQVjZfRkxPV0lORk9fTUFTSyAmICoodTMyICopQ01TR19EQVRBKGNtc2cpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJUFY2X0hPUE9QVFM6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0LT5ob3BvcHQgfHwgY21zZy0+Y21zZ19sZW4gPCBDTVNHX0xFTihzaXplb2Yoc3RydWN0IGlwdjZfb3B0X2hkcikpKSB7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlnb3RvIGV4aXRfZjsKKwkJCX0KKworCQkJaGRyID0gKHN0cnVjdCBpcHY2X29wdF9oZHIgKilDTVNHX0RBVEEoY21zZyk7CisJCQlsZW4gPSAoKGhkci0+aGRybGVuICsgMSkgPDwgMyk7CisJCQlpZiAoY21zZy0+Y21zZ19sZW4gPCBDTVNHX0xFTihsZW4pKSB7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlnb3RvIGV4aXRfZjsKKwkJCX0KKwkJCWlmICghY2FwYWJsZShDQVBfTkVUX1JBVykpIHsKKwkJCQllcnIgPSAtRVBFUk07CisJCQkJZ290byBleGl0X2Y7CisJCQl9CisJCQlvcHQtPm9wdF9uZmxlbiArPSBsZW47CisJCQlvcHQtPmhvcG9wdCA9IGhkcjsKKwkJCWJyZWFrOworCisJCWNhc2UgSVBWNl9EU1RPUFRTOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNtc2ctPmNtc2dfbGVuIDwgQ01TR19MRU4oc2l6ZW9mKHN0cnVjdCBpcHY2X29wdF9oZHIpKSkgeworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJZ290byBleGl0X2Y7CisJCQl9CisKKwkJCWhkciA9IChzdHJ1Y3QgaXB2Nl9vcHRfaGRyICopQ01TR19EQVRBKGNtc2cpOworCQkJbGVuID0gKChoZHItPmhkcmxlbiArIDEpIDw8IDMpOworCQkJaWYgKGNtc2ctPmNtc2dfbGVuIDwgQ01TR19MRU4obGVuKSkgeworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJZ290byBleGl0X2Y7CisJCQl9CisJCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9SQVcpKSB7CisJCQkJZXJyID0gLUVQRVJNOworCQkJCWdvdG8gZXhpdF9mOworCQkJfQorCQkJaWYgKG9wdC0+ZHN0MW9wdCkgeworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJZ290byBleGl0X2Y7CisJCQl9CisJCQlvcHQtPm9wdF9mbGVuICs9IGxlbjsKKwkJCW9wdC0+ZHN0MW9wdCA9IGhkcjsKKwkJCWJyZWFrOworCisJCWNhc2UgSVBWNl9SVEhEUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbXNnLT5jbXNnX2xlbiA8IENNU0dfTEVOKHNpemVvZihzdHJ1Y3QgaXB2Nl9ydF9oZHIpKSkgeworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJZ290byBleGl0X2Y7CisJCQl9CisKKwkJCXJ0aGRyID0gKHN0cnVjdCBpcHY2X3J0X2hkciAqKUNNU0dfREFUQShjbXNnKTsKKworCQkJLyoKKwkJCSAqCVRZUEUgMAorCQkJICovCisJCQlpZiAocnRoZHItPnR5cGUpIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gZXhpdF9mOworCQkJfQorCisJCQlsZW4gPSAoKHJ0aGRyLT5oZHJsZW4gKyAxKSA8PCAzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNtc2ctPmNtc2dfbGVuIDwgQ01TR19MRU4obGVuKSkgeworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJZ290byBleGl0X2Y7CisJCQl9CisKKwkJCS8qIHNlZ21lbnRzIGxlZnQgbXVzdCBhbHNvIG1hdGNoICovCisJCQlpZiAoKHJ0aGRyLT5oZHJsZW4gPj4gMSkgIT0gcnRoZHItPnNlZ21lbnRzX2xlZnQpIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gZXhpdF9mOworCQkJfQorCisJCQlvcHQtPm9wdF9uZmxlbiArPSBsZW47CisJCQlvcHQtPnNyY3J0ID0gcnRoZHI7CisKKwkJCWlmIChvcHQtPmRzdDFvcHQpIHsKKwkJCQlpbnQgZHN0aGRybGVuID0gKChvcHQtPmRzdDFvcHQtPmhkcmxlbisxKTw8Myk7CisKKwkJCQlvcHQtPm9wdF9uZmxlbiArPSBkc3RoZHJsZW47CisJCQkJb3B0LT5kc3Qwb3B0ID0gb3B0LT5kc3Qxb3B0OworCQkJCW9wdC0+ZHN0MW9wdCA9IE5VTEw7CisJCQkJb3B0LT5vcHRfZmxlbiAtPSBkc3RoZHJsZW47CisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgSVBWNl9IT1BMSU1JVDoKKwkJCWlmIChjbXNnLT5jbXNnX2xlbiAhPSBDTVNHX0xFTihzaXplb2YoaW50KSkpIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gZXhpdF9mOworCQkJfQorCisJCQkqaGxpbWl0ID0gKihpbnQgKilDTVNHX0RBVEEoY21zZyk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJTElNSVRfTkVUREVCVUcoCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImludmFsaWQgY21zZyB0eXBlOiAlZFxuIiwgY21zZy0+Y21zZ190eXBlKSk7CisJCQllcnIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX07CisJfQorCitleGl0X2Y6CisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL25ldC9pcHY2L2VzcDYuYyBiL25ldC9pcHY2L2VzcDYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTcwOTVkCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvZXNwNi5jCkBAIC0wLDAgKzEsNDI0IEBACisvKgorICogQ29weXJpZ2h0IChDKTIwMDIgVVNBR0kvV0lERSBQcm9qZWN0CisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqIEF1dGhvcnMKKyAqCisgKglNaXRzdXJ1IEtBTkRBIEBVU0FHSSAgICAgICA6IElQdjYgU3VwcG9ydCAKKyAqIAlLYXp1bm9yaSBNSVlBWkFXQSBAVVNBR0kgICA6CisgKiAJS3VuaWhpcm8gSXNoaWd1cm8gPGt1bmloaXJvQGlwaW5mdXNpb24uY29tPgorICogCQorICogCVRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gbmV0L2lwdjQvZXNwLmMKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L3hmcm0uaD4KKyNpbmNsdWRlIDxuZXQvZXNwLmg+CisjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvcGZrZXl2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPG5ldC9pY21wLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wdjYuaD4KKworc3RhdGljIGludCBlc3A2X291dHB1dChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgZXJyOworCWludCBoZHJfbGVuOworCXN0cnVjdCBpcHY2aGRyICp0b3BfaXBoOworCXN0cnVjdCBpcHY2X2VzcF9oZHIgKmVzcGg7CisJc3RydWN0IGNyeXB0b190Zm0gKnRmbTsKKwlzdHJ1Y3QgZXNwX2RhdGEgKmVzcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHJhaWxlcjsKKwlpbnQgYmxrc2l6ZTsKKwlpbnQgY2xlbjsKKwlpbnQgYWxlbjsKKwlpbnQgbmZyYWdzOworCisJZXNwID0geC0+ZGF0YTsKKwloZHJfbGVuID0gc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSArCisJCSAgc2l6ZW9mKCplc3BoKSArIGVzcC0+Y29uZi5pdmxlbjsKKworCS8qIFN0cmlwIElQK0VTUCBoZWFkZXIuICovCisJX19za2JfcHVsbChza2IsIGhkcl9sZW4pOworCisJLyogTm93IHNrYiBpcyBwdXJlIHBheWxvYWQgdG8gZW5jcnlwdCAqLworCWVyciA9IC1FTk9NRU07CisKKwkvKiBSb3VuZCB0byBibG9jayBzaXplICovCisJY2xlbiA9IHNrYi0+bGVuOworCisJYWxlbiA9IGVzcC0+YXV0aC5pY3ZfdHJ1bmNfbGVuOworCXRmbSA9IGVzcC0+Y29uZi50Zm07CisJYmxrc2l6ZSA9IChjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSArIDMpICYgfjM7CisJY2xlbiA9IChjbGVuICsgMiArIGJsa3NpemUtMSkmfihibGtzaXplLTEpOworCWlmIChlc3AtPmNvbmYucGFkbGVuKQorCQljbGVuID0gKGNsZW4gKyBlc3AtPmNvbmYucGFkbGVuLTEpJn4oZXNwLT5jb25mLnBhZGxlbi0xKTsKKworCWlmICgobmZyYWdzID0gc2tiX2Nvd19kYXRhKHNrYiwgY2xlbi1za2ItPmxlbithbGVuLCAmdHJhaWxlcikpIDwgMCkgeworCQlnb3RvIGVycm9yOworCX0KKworCS8qIEZpbGwgcGFkZGluZy4uLiAqLworCWRvIHsKKwkJaW50IGk7CisJCWZvciAoaT0wOyBpPGNsZW4tc2tiLT5sZW4gLSAyOyBpKyspCisJCQkqKHU4KikodHJhaWxlci0+dGFpbCArIGkpID0gaSsxOworCX0gd2hpbGUgKDApOworCSoodTgqKSh0cmFpbGVyLT50YWlsICsgY2xlbi1za2ItPmxlbiAtIDIpID0gKGNsZW4gLSBza2ItPmxlbiktMjsKKwlwc2tiX3B1dChza2IsIHRyYWlsZXIsIGNsZW4gLSBza2ItPmxlbik7CisKKwl0b3BfaXBoID0gKHN0cnVjdCBpcHY2aGRyICopX19za2JfcHVzaChza2IsIGhkcl9sZW4pOworCWVzcGggPSAoc3RydWN0IGlwdjZfZXNwX2hkciAqKXNrYi0+aC5yYXc7CisJdG9wX2lwaC0+cGF5bG9hZF9sZW4gPSBodG9ucyhza2ItPmxlbiArIGFsZW4gLSBzaXplb2YoKnRvcF9pcGgpKTsKKwkqKHU4KikodHJhaWxlci0+dGFpbCAtIDEpID0gKnNrYi0+bmgucmF3OworCSpza2ItPm5oLnJhdyA9IElQUFJPVE9fRVNQOworCisJZXNwaC0+c3BpID0geC0+aWQuc3BpOworCWVzcGgtPnNlcV9ubyA9IGh0b25sKCsreC0+cmVwbGF5Lm9zZXEpOworCisJaWYgKGVzcC0+Y29uZi5pdmxlbikKKwkJY3J5cHRvX2NpcGhlcl9zZXRfaXYodGZtLCBlc3AtPmNvbmYuaXZlYywgY3J5cHRvX3RmbV9hbGdfaXZzaXplKHRmbSkpOworCisJZG8geworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gJmVzcC0+c2didWZbMF07CisKKwkJaWYgKHVubGlrZWx5KG5mcmFncyA+IEVTUF9OVU1fRkFTVF9TRykpIHsKKwkJCXNnID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSpuZnJhZ3MsIEdGUF9BVE9NSUMpOworCQkJaWYgKCFzZykKKwkJCQlnb3RvIGVycm9yOworCQl9CisJCXNrYl90b19zZ3ZlYyhza2IsIHNnLCBlc3BoLT5lbmNfZGF0YStlc3AtPmNvbmYuaXZsZW4tc2tiLT5kYXRhLCBjbGVuKTsKKwkJY3J5cHRvX2NpcGhlcl9lbmNyeXB0KHRmbSwgc2csIHNnLCBjbGVuKTsKKwkJaWYgKHVubGlrZWx5KHNnICE9ICZlc3AtPnNnYnVmWzBdKSkKKwkJCWtmcmVlKHNnKTsKKwl9IHdoaWxlICgwKTsKKworCWlmIChlc3AtPmNvbmYuaXZsZW4pIHsKKwkJbWVtY3B5KGVzcGgtPmVuY19kYXRhLCBlc3AtPmNvbmYuaXZlYywgY3J5cHRvX3RmbV9hbGdfaXZzaXplKHRmbSkpOworCQljcnlwdG9fY2lwaGVyX2dldF9pdih0Zm0sIGVzcC0+Y29uZi5pdmVjLCBjcnlwdG9fdGZtX2FsZ19pdnNpemUodGZtKSk7CisJfQorCisJaWYgKGVzcC0+YXV0aC5pY3ZfZnVsbF9sZW4pIHsKKwkJZXNwLT5hdXRoLmljdihlc3AsIHNrYiwgKHU4Killc3BoLXNrYi0+ZGF0YSwKKwkJCXNpemVvZihzdHJ1Y3QgaXB2Nl9lc3BfaGRyKSArIGVzcC0+Y29uZi5pdmxlbitjbGVuLCB0cmFpbGVyLT50YWlsKTsKKwkJcHNrYl9wdXQoc2tiLCB0cmFpbGVyLCBhbGVuKTsKKwl9CisKKwllcnIgPSAwOworCitlcnJvcjoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGVzcDZfaW5wdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCB4ZnJtX2RlY2FwX3N0YXRlICpkZWNhcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXB2NmhkciAqaXBoOworCXN0cnVjdCBpcHY2X2VzcF9oZHIgKmVzcGg7CisJc3RydWN0IGVzcF9kYXRhICplc3AgPSB4LT5kYXRhOworCXN0cnVjdCBza19idWZmICp0cmFpbGVyOworCWludCBibGtzaXplID0gY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKGVzcC0+Y29uZi50Zm0pOworCWludCBhbGVuID0gZXNwLT5hdXRoLmljdl90cnVuY19sZW47CisJaW50IGVsZW4gPSBza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgaXB2Nl9lc3BfaGRyKSAtIGVzcC0+Y29uZi5pdmxlbiAtIGFsZW47CisKKwlpbnQgaGRyX2xlbiA9IHNrYi0+aC5yYXcgLSBza2ItPm5oLnJhdzsKKwlpbnQgbmZyYWdzOworCXVuc2lnbmVkIGNoYXIgKnRtcF9oZHIgPSBOVUxMOworCWludCByZXQgPSAwOworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2X2VzcF9oZHIpKSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF9ub2ZyZWU7CisJfQorCisJaWYgKGVsZW4gPD0gMCB8fCAoZWxlbiAmIChibGtzaXplLTEpKSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF9ub2ZyZWU7CisJfQorCisJdG1wX2hkciA9IGttYWxsb2MoaGRyX2xlbiwgR0ZQX0FUT01JQyk7CisJaWYgKCF0bXBfaGRyKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X25vZnJlZTsKKwl9CisJbWVtY3B5KHRtcF9oZHIsIHNrYi0+bmgucmF3LCBoZHJfbGVuKTsKKworCS8qIElmIGludGVncml0eSBjaGVjayBpcyByZXF1aXJlZCwgZG8gdGhpcy4gKi8KKyAgICAgICAgaWYgKGVzcC0+YXV0aC5pY3ZfZnVsbF9sZW4pIHsKKwkJdTggc3VtW2VzcC0+YXV0aC5pY3ZfZnVsbF9sZW5dOworCQl1OCBzdW0xW2FsZW5dOworCisJCWVzcC0+YXV0aC5pY3YoZXNwLCBza2IsIDAsIHNrYi0+bGVuLWFsZW4sIHN1bSk7CisKKwkJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCBza2ItPmxlbi1hbGVuLCBzdW0xLCBhbGVuKSkKKwkJCUJVRygpOworCisJCWlmICh1bmxpa2VseShtZW1jbXAoc3VtLCBzdW0xLCBhbGVuKSkpIHsKKwkJCXgtPnN0YXRzLmludGVncml0eV9mYWlsZWQrKzsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmICgobmZyYWdzID0gc2tiX2Nvd19kYXRhKHNrYiwgMCwgJnRyYWlsZXIpKSA8IDApIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCisJZXNwaCA9IChzdHJ1Y3QgaXB2Nl9lc3BfaGRyKilza2ItPmRhdGE7CisJaXBoID0gc2tiLT5uaC5pcHY2aDsKKworCS8qIEdldCBpdmVjLiBUaGlzIGNhbiBiZSB3cm9uZywgY2hlY2sgYWdhaW5zdCBhbm90aGVyIGltcGxzLiAqLworCWlmIChlc3AtPmNvbmYuaXZsZW4pCisJCWNyeXB0b19jaXBoZXJfc2V0X2l2KGVzcC0+Y29uZi50Zm0sIGVzcGgtPmVuY19kYXRhLCBjcnlwdG9fdGZtX2FsZ19pdnNpemUoZXNwLT5jb25mLnRmbSkpOworCisgICAgICAgIHsKKwkJdTggbmV4dGhkclsyXTsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9ICZlc3AtPnNnYnVmWzBdOworCQl1OCBwYWRsZW47CisKKwkJaWYgKHVubGlrZWx5KG5mcmFncyA+IEVTUF9OVU1fRkFTVF9TRykpIHsKKwkJCXNnID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSpuZnJhZ3MsIEdGUF9BVE9NSUMpOworCQkJaWYgKCFzZykgeworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJc2tiX3RvX3NndmVjKHNrYiwgc2csIHNpemVvZihzdHJ1Y3QgaXB2Nl9lc3BfaGRyKSArIGVzcC0+Y29uZi5pdmxlbiwgZWxlbik7CisJCWNyeXB0b19jaXBoZXJfZGVjcnlwdChlc3AtPmNvbmYudGZtLCBzZywgc2csIGVsZW4pOworCQlpZiAodW5saWtlbHkoc2cgIT0gJmVzcC0+c2didWZbMF0pKQorCQkJa2ZyZWUoc2cpOworCisJCWlmIChza2JfY29weV9iaXRzKHNrYiwgc2tiLT5sZW4tYWxlbi0yLCBuZXh0aGRyLCAyKSkKKwkJCUJVRygpOworCisJCXBhZGxlbiA9IG5leHRoZHJbMF07CisJCWlmIChwYWRsZW4rMiA+PSBlbGVuKSB7CisJCQlMSU1JVF9ORVRERUJVRygKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJpcHNlYyBlc3AgcGFja2V0IGlzIGdhcmJhZ2UgcGFkbGVuPSVkLCBlbGVuPSVkXG4iLCBwYWRsZW4rMiwgZWxlbikpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCS8qIC4uLiBjaGVjayBwYWRkaW5nIGJpdHMgaGVyZS4gU2lsbHkuIDotKSAqLyAKKworCQlwc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIGFsZW4gLSBwYWRsZW4gLSAyKTsKKwkJc2tiLT5oLnJhdyA9IHNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2X2VzcF9oZHIpICsgZXNwLT5jb25mLml2bGVuKTsKKwkJc2tiLT5uaC5yYXcgKz0gc2l6ZW9mKHN0cnVjdCBpcHY2X2VzcF9oZHIpICsgZXNwLT5jb25mLml2bGVuOworCQltZW1jcHkoc2tiLT5uaC5yYXcsIHRtcF9oZHIsIGhkcl9sZW4pOworCQlza2ItPm5oLmlwdjZoLT5wYXlsb2FkX2xlbiA9IGh0b25zKHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisJCXJldCA9IG5leHRoZHJbMV07CisJfQorCitvdXQ6CisJa2ZyZWUodG1wX2hkcik7CitvdXRfbm9mcmVlOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1MzIgZXNwNl9nZXRfbWF4X3NpemUoc3RydWN0IHhmcm1fc3RhdGUgKngsIGludCBtdHUpCit7CisJc3RydWN0IGVzcF9kYXRhICplc3AgPSB4LT5kYXRhOworCXUzMiBibGtzaXplID0gY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKGVzcC0+Y29uZi50Zm0pOworCisJaWYgKHgtPnByb3BzLm1vZGUpIHsKKwkJbXR1ID0gKG10dSArIDIgKyBibGtzaXplLTEpJn4oYmxrc2l6ZS0xKTsKKwl9IGVsc2UgeworCQkvKiBUaGUgd29yc3QgY2FzZS4gKi8KKwkJbXR1ICs9IDIgKyBibGtzaXplOworCX0KKwlpZiAoZXNwLT5jb25mLnBhZGxlbikKKwkJbXR1ID0gKG10dSArIGVzcC0+Y29uZi5wYWRsZW4tMSkmfihlc3AtPmNvbmYucGFkbGVuLTEpOworCisJcmV0dXJuIG10dSArIHgtPnByb3BzLmhlYWRlcl9sZW4gKyBlc3AtPmF1dGguaWN2X2Z1bGxfbGVuOworfQorCitzdGF0aWMgdm9pZCBlc3A2X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCwKKyAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX191MzIgaW5mbykKK3sKKwlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gKHN0cnVjdCBpcHY2aGRyKilza2ItPmRhdGE7CisJc3RydWN0IGlwdjZfZXNwX2hkciAqZXNwaCA9IChzdHJ1Y3QgaXB2Nl9lc3BfaGRyKikoc2tiLT5kYXRhK29mZnNldCk7CisJc3RydWN0IHhmcm1fc3RhdGUgKng7CisKKwlpZiAodHlwZSAhPSBJQ01QVjZfREVTVF9VTlJFQUNIICYmIAorCSAgICB0eXBlICE9IElDTVBWNl9QS1RfVE9PQklHKQorCQlyZXR1cm47CisKKwl4ID0geGZybV9zdGF0ZV9sb29rdXAoKHhmcm1fYWRkcmVzc190ICopJmlwaC0+ZGFkZHIsIGVzcGgtPnNwaSwgSVBQUk9UT19FU1AsIEFGX0lORVQ2KTsKKwlpZiAoIXgpCisJCXJldHVybjsKKwlwcmludGsoS0VSTl9ERUJVRyAicG10dSBkaXNjb3Zlcnkgb24gU0EgRVNQLyUwOHgvIgorCQkJIiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eFxuIiwgCisJCQludG9obChlc3BoLT5zcGkpLCBOSVA2KGlwaC0+ZGFkZHIpKTsKKwl4ZnJtX3N0YXRlX3B1dCh4KTsKK30KKworc3RhdGljIHZvaWQgZXNwNl9kZXN0cm95KHN0cnVjdCB4ZnJtX3N0YXRlICp4KQoreworCXN0cnVjdCBlc3BfZGF0YSAqZXNwID0geC0+ZGF0YTsKKworCWlmICghZXNwKQorCQlyZXR1cm47CisKKwlpZiAoZXNwLT5jb25mLnRmbSkgeworCQljcnlwdG9fZnJlZV90Zm0oZXNwLT5jb25mLnRmbSk7CisJCWVzcC0+Y29uZi50Zm0gPSBOVUxMOworCX0KKwlpZiAoZXNwLT5jb25mLml2ZWMpIHsKKwkJa2ZyZWUoZXNwLT5jb25mLml2ZWMpOworCQllc3AtPmNvbmYuaXZlYyA9IE5VTEw7CisJfQorCWlmIChlc3AtPmF1dGgudGZtKSB7CisJCWNyeXB0b19mcmVlX3RmbShlc3AtPmF1dGgudGZtKTsKKwkJZXNwLT5hdXRoLnRmbSA9IE5VTEw7CisJfQorCWlmIChlc3AtPmF1dGgud29ya19pY3YpIHsKKwkJa2ZyZWUoZXNwLT5hdXRoLndvcmtfaWN2KTsKKwkJZXNwLT5hdXRoLndvcmtfaWN2ID0gTlVMTDsKKwl9CisJa2ZyZWUoZXNwKTsKK30KKworc3RhdGljIGludCBlc3A2X2luaXRfc3RhdGUoc3RydWN0IHhmcm1fc3RhdGUgKngsIHZvaWQgKmFyZ3MpCit7CisJc3RydWN0IGVzcF9kYXRhICplc3AgPSBOVUxMOworCisJLyogbnVsbCBhdXRoIGFuZCBlbmNyeXB0aW9uIGNhbiBoYXZlIHplcm8gbGVuZ3RoIGtleXMgKi8KKwlpZiAoeC0+YWFsZykgeworCQlpZiAoeC0+YWFsZy0+YWxnX2tleV9sZW4gPiA1MTIpCisJCQlnb3RvIGVycm9yOworCX0KKwlpZiAoeC0+ZWFsZyA9PSBOVUxMKQorCQlnb3RvIGVycm9yOworCisJaWYgKHgtPmVuY2FwKQorCQlnb3RvIGVycm9yOworCisJZXNwID0ga21hbGxvYyhzaXplb2YoKmVzcCksIEdGUF9LRVJORUwpOworCWlmIChlc3AgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoZXNwLCAwLCBzaXplb2YoKmVzcCkpOworCisJaWYgKHgtPmFhbGcpIHsKKwkJc3RydWN0IHhmcm1fYWxnb19kZXNjICphYWxnX2Rlc2M7CisKKwkJZXNwLT5hdXRoLmtleSA9IHgtPmFhbGctPmFsZ19rZXk7CisJCWVzcC0+YXV0aC5rZXlfbGVuID0gKHgtPmFhbGctPmFsZ19rZXlfbGVuKzcpLzg7CisJCWVzcC0+YXV0aC50Zm0gPSBjcnlwdG9fYWxsb2NfdGZtKHgtPmFhbGctPmFsZ19uYW1lLCAwKTsKKwkJaWYgKGVzcC0+YXV0aC50Zm0gPT0gTlVMTCkKKwkJCWdvdG8gZXJyb3I7CisJCWVzcC0+YXV0aC5pY3YgPSBlc3BfaG1hY19kaWdlc3Q7CisgCisJCWFhbGdfZGVzYyA9IHhmcm1fYWFsZ19nZXRfYnluYW1lKHgtPmFhbGctPmFsZ19uYW1lLCAwKTsKKwkJQlVHX09OKCFhYWxnX2Rlc2MpOworIAorCQlpZiAoYWFsZ19kZXNjLT51aW5mby5hdXRoLmljdl9mdWxsYml0cy84ICE9CisJCQljcnlwdG9fdGZtX2FsZ19kaWdlc3RzaXplKGVzcC0+YXV0aC50Zm0pKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiRVNQOiAlcyBkaWdlc3RzaXplICV1ICE9ICVodVxuIiwKKwkJCQkJeC0+YWFsZy0+YWxnX25hbWUsCisJCQkJCWNyeXB0b190Zm1fYWxnX2RpZ2VzdHNpemUoZXNwLT5hdXRoLnRmbSksCisJCQkJCWFhbGdfZGVzYy0+dWluZm8uYXV0aC5pY3ZfZnVsbGJpdHMvOCk7CisJCQkJZ290byBlcnJvcjsKKwkJfQorIAorCQllc3AtPmF1dGguaWN2X2Z1bGxfbGVuID0gYWFsZ19kZXNjLT51aW5mby5hdXRoLmljdl9mdWxsYml0cy84OworCQllc3AtPmF1dGguaWN2X3RydW5jX2xlbiA9IGFhbGdfZGVzYy0+dWluZm8uYXV0aC5pY3ZfdHJ1bmNiaXRzLzg7CisgCisJCWVzcC0+YXV0aC53b3JrX2ljdiA9IGttYWxsb2MoZXNwLT5hdXRoLmljdl9mdWxsX2xlbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghZXNwLT5hdXRoLndvcmtfaWN2KQorCQkJZ290byBlcnJvcjsKKwl9CisJZXNwLT5jb25mLmtleSA9IHgtPmVhbGctPmFsZ19rZXk7CisJZXNwLT5jb25mLmtleV9sZW4gPSAoeC0+ZWFsZy0+YWxnX2tleV9sZW4rNykvODsKKwlpZiAoeC0+cHJvcHMuZWFsZ28gPT0gU0FEQl9FQUxHX05VTEwpCisJCWVzcC0+Y29uZi50Zm0gPSBjcnlwdG9fYWxsb2NfdGZtKHgtPmVhbGctPmFsZ19uYW1lLCBDUllQVE9fVEZNX01PREVfRUNCKTsKKwllbHNlCisJCWVzcC0+Y29uZi50Zm0gPSBjcnlwdG9fYWxsb2NfdGZtKHgtPmVhbGctPmFsZ19uYW1lLCBDUllQVE9fVEZNX01PREVfQ0JDKTsKKwlpZiAoZXNwLT5jb25mLnRmbSA9PSBOVUxMKQorCQlnb3RvIGVycm9yOworCWVzcC0+Y29uZi5pdmxlbiA9IGNyeXB0b190Zm1fYWxnX2l2c2l6ZShlc3AtPmNvbmYudGZtKTsKKwllc3AtPmNvbmYucGFkbGVuID0gMDsKKwlpZiAoZXNwLT5jb25mLml2bGVuKSB7CisJCWVzcC0+Y29uZi5pdmVjID0ga21hbGxvYyhlc3AtPmNvbmYuaXZsZW4sIEdGUF9LRVJORUwpOworCQlpZiAodW5saWtlbHkoZXNwLT5jb25mLml2ZWMgPT0gTlVMTCkpCisJCQlnb3RvIGVycm9yOworCQlnZXRfcmFuZG9tX2J5dGVzKGVzcC0+Y29uZi5pdmVjLCBlc3AtPmNvbmYuaXZsZW4pOworCX0KKwlpZiAoY3J5cHRvX2NpcGhlcl9zZXRrZXkoZXNwLT5jb25mLnRmbSwgZXNwLT5jb25mLmtleSwgZXNwLT5jb25mLmtleV9sZW4pKQorCQlnb3RvIGVycm9yOworCXgtPnByb3BzLmhlYWRlcl9sZW4gPSBzaXplb2Yoc3RydWN0IGlwdjZfZXNwX2hkcikgKyBlc3AtPmNvbmYuaXZsZW47CisJaWYgKHgtPnByb3BzLm1vZGUpCisJCXgtPnByb3BzLmhlYWRlcl9sZW4gKz0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKKwl4LT5kYXRhID0gZXNwOworCXJldHVybiAwOworCitlcnJvcjoKKwl4LT5kYXRhID0gZXNwOworCWVzcDZfZGVzdHJveSh4KTsKKwl4LT5kYXRhID0gTlVMTDsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCB4ZnJtX3R5cGUgZXNwNl90eXBlID0KK3sKKwkuZGVzY3JpcHRpb24JPSAiRVNQNiIsCisJLm93bmVyCSAgICAgCT0gVEhJU19NT0RVTEUsCisJLnByb3RvCSAgICAgCT0gSVBQUk9UT19FU1AsCisJLmluaXRfc3RhdGUJPSBlc3A2X2luaXRfc3RhdGUsCisJLmRlc3RydWN0b3IJPSBlc3A2X2Rlc3Ryb3ksCisJLmdldF9tYXhfc2l6ZQk9IGVzcDZfZ2V0X21heF9zaXplLAorCS5pbnB1dAkJPSBlc3A2X2lucHV0LAorCS5vdXRwdXQJCT0gZXNwNl9vdXRwdXQKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5ldDZfcHJvdG9jb2wgZXNwNl9wcm90b2NvbCA9IHsKKwkuaGFuZGxlciAJPQl4ZnJtNl9yY3YsCisJLmVycl9oYW5kbGVyCT0JZXNwNl9lcnIsCisJLmZsYWdzCQk9CUlORVQ2X1BST1RPX05PUE9MSUNZLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZXNwNl9pbml0KHZvaWQpCit7CisJaWYgKHhmcm1fcmVnaXN0ZXJfdHlwZSgmZXNwNl90eXBlLCBBRl9JTkVUNikgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gImlwdjYgZXNwIGluaXQ6IGNhbid0IGFkZCB4ZnJtIHR5cGVcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJaWYgKGluZXQ2X2FkZF9wcm90b2NvbCgmZXNwNl9wcm90b2NvbCwgSVBQUk9UT19FU1ApIDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJpcHY2IGVzcCBpbml0OiBjYW4ndCBhZGQgcHJvdG9jb2xcbiIpOworCQl4ZnJtX3VucmVnaXN0ZXJfdHlwZSgmZXNwNl90eXBlLCBBRl9JTkVUNik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXNwNl9maW5pKHZvaWQpCit7CisJaWYgKGluZXQ2X2RlbF9wcm90b2NvbCgmZXNwNl9wcm90b2NvbCwgSVBQUk9UT19FU1ApIDwgMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaXB2NiBlc3AgY2xvc2U6IGNhbid0IHJlbW92ZSBwcm90b2NvbFxuIik7CisJaWYgKHhmcm1fdW5yZWdpc3Rlcl90eXBlKCZlc3A2X3R5cGUsIEFGX0lORVQ2KSA8IDApCisJCXByaW50ayhLRVJOX0lORk8gImlwdjYgZXNwIGNsb3NlOiBjYW4ndCByZW1vdmUgeGZybSB0eXBlXG4iKTsKK30KKworbW9kdWxlX2luaXQoZXNwNl9pbml0KTsKK21vZHVsZV9leGl0KGVzcDZfZmluaSk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2V4dGhkcnMuYyBiL25ldC9pcHY2L2V4dGhkcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDgzOWVhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvZXh0aGRycy5jCkBAIC0wLDAgKzEsNTc1IEBACisvKgorICoJRXh0ZW5zaW9uIEhlYWRlciBoYW5kbGluZyBmb3IgSVB2NgorICoJTGludXggSU5FVDYgaW1wbGVtZW50YXRpb24KKyAqCisgKglBdXRob3JzOgorICoJUGVkcm8gUm9xdWUJCTxyb3F1ZUBkaS5mYy51bC5wdD4KKyAqCUFuZGkgS2xlZW4JCTxha0BtdWMuZGU+CisgKglBbGV4ZXkgS3V6bmV0c292CTxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKgkkSWQ6IGV4dGhkcnMuYyx2IDEuMTMgMjAwMS8wNi8xOSAxNTo1ODo1NiBkYXZlbSBFeHAgJAorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworLyogQ2hhbmdlczoKKyAqCXlvc2hmdWppCQk6IGVuc3VyZSBub3QgdG8gb3ZlcnJ1biB3aGlsZSBwYXJzaW5nIAorICoJCQkJICB0bHYgb3B0aW9ucy4KKyAqCU1pdHN1cnUgS0FOREEgQFVTQUdJIGFuZDogUmVtb3ZlIGlwdjZfcGFyc2VfZXh0aGRycygpLgorICoJWU9TSElGVUpJIEhpZGVha2kgQFVTQUdJICBSZWdpc3RlciBpbmJvdW5kIGV4dGVuc2lvbiBoZWFkZXIKKyAqCQkJCSAgaGFuZGxlcnMgYXMgaW5ldDZfcHJvdG9jb2x7fS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L2ljbXB2Ni5oPgorCisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvc25tcC5oPgorCisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvdHJhbnNwX3Y2Lmg+CisjaW5jbHVkZSA8bmV0L3Jhd3Y2Lmg+CisjaW5jbHVkZSA8bmV0L25kaXNjLmg+CisjaW5jbHVkZSA8bmV0L2lwNl9yb3V0ZS5oPgorI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyoKKyAqCVBhcnNpbmcgdGx2IGVuY29kZWQgaGVhZGVycy4KKyAqCisgKglQYXJzaW5nIGZ1bmN0aW9uICJmdW5jIiByZXR1cm5zIDEsIGlmIHBhcnNpbmcgc3VjY2VlZAorICoJYW5kIDAsIGlmIGl0IGZhaWxlZC4KKyAqCUl0IE1VU1QgTk9UIHRvdWNoIHNrYi0+aC4KKyAqLworCitzdHJ1Y3QgdGx2dHlwZV9wcm9jIHsKKwlpbnQJdHlwZTsKKwlpbnQJKCpmdW5jKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0KTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioKKyAgR2VuZXJpYyBmdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEFuIHVua25vd24gb3B0aW9uIGlzIGRldGVjdGVkLCBkZWNpZGUgd2hhdCB0byBkbyAqLworCitzdGF0aWMgaW50IGlwNl90bHZvcHRfdW5rbm93bihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb3B0b2ZmKQoreworCXN3aXRjaCAoKHNrYi0+bmgucmF3W29wdG9mZl0gJiAweEMwKSA+PiA2KSB7CisJY2FzZSAwOiAvKiBpZ25vcmUgKi8KKwkJcmV0dXJuIDE7CisKKwljYXNlIDE6IC8qIGRyb3AgcGFja2V0ICovCisJCWJyZWFrOworCisJY2FzZSAzOiAvKiBTZW5kIElDTVAgaWYgbm90IGEgbXVsdGljYXN0IGFkZHJlc3MgYW5kIGRyb3AgcGFja2V0ICovCisJCS8qIEFjdHVhbGx5LCBpdCBpcyByZWR1bmRhbnQgY2hlY2suIGljbXBfc2VuZAorCQkgICB3aWxsIHJlY2hlY2sgaW4gYW55IGNhc2UuCisJCSAqLworCQlpZiAoaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmc2tiLT5uaC5pcHY2aC0+ZGFkZHIpKQorCQkJYnJlYWs7CisJY2FzZSAyOiAvKiBzZW5kIElDTVAgUEFSTSBQUk9CIHJlZ2FyZGxlc3MgYW5kIGRyb3AgcGFja2V0ICovCisJCWljbXB2Nl9wYXJhbV9wcm9iKHNrYiwgSUNNUFY2X1VOS19PUFRJT04sIG9wdG9mZik7CisJCXJldHVybiAwOworCX07CisKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKworLyogUGFyc2UgdGx2IGVuY29kZWQgb3B0aW9uIGhlYWRlciAoaG9wLWJ5LWhvcCBvciBkZXN0aW5hdGlvbikgKi8KKworc3RhdGljIGludCBpcDZfcGFyc2VfdGx2KHN0cnVjdCB0bHZ0eXBlX3Byb2MgKnByb2NzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB0bHZ0eXBlX3Byb2MgKmN1cnI7CisJaW50IG9mZiA9IHNrYi0+aC5yYXcgLSBza2ItPm5oLnJhdzsKKwlpbnQgbGVuID0gKChza2ItPmgucmF3WzFdKzEpPDwzKTsKKworCWlmICgoc2tiLT5oLnJhdyArIGxlbikgLSBza2ItPmRhdGEgPiBza2JfaGVhZGxlbihza2IpKQorCQlnb3RvIGJhZDsKKworCW9mZiArPSAyOworCWxlbiAtPSAyOworCisJd2hpbGUgKGxlbiA+IDApIHsKKwkJaW50IG9wdGxlbiA9IHNrYi0+bmgucmF3W29mZisxXSsyOworCisJCXN3aXRjaCAoc2tiLT5uaC5yYXdbb2ZmXSkgeworCQljYXNlIElQVjZfVExWX1BBRDA6CisJCQlvcHRsZW4gPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBJUFY2X1RMVl9QQUROOgorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDogLyogT3RoZXIgVExWIGNvZGUgc28gc2NhbiBsaXN0ICovCisJCQlpZiAob3B0bGVuID4gbGVuKQorCQkJCWdvdG8gYmFkOworCQkJZm9yIChjdXJyPXByb2NzOyBjdXJyLT50eXBlID49IDA7IGN1cnIrKykgeworCQkJCWlmIChjdXJyLT50eXBlID09IHNrYi0+bmgucmF3W29mZl0pIHsKKwkJCQkJLyogdHlwZSBzcGVjaWZpYyBsZW5ndGgvYWxpZ25tZW50IAorCQkJCQkgICBjaGVja3Mgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIAorCQkJCQkgICBmdW5jKCkuICovCisJCQkJCWlmIChjdXJyLT5mdW5jKHNrYiwgb2ZmKSA9PSAwKQorCQkJCQkJcmV0dXJuIDA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChjdXJyLT50eXBlIDwgMCkgeworCQkJCWlmIChpcDZfdGx2b3B0X3Vua25vd24oc2tiLCBvZmYpID09IDApCisJCQkJCXJldHVybiAwOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJb2ZmICs9IG9wdGxlbjsKKwkJbGVuIC09IG9wdGxlbjsKKwl9CisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gMTsKK2JhZDoKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIERlc3RpbmF0aW9uIG9wdGlvbnMgaGVhZGVyLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IHRsdnR5cGVfcHJvYyB0bHZwcm9jZGVzdG9wdF9sc3RbXSA9IHsKKwkvKiBObyBkZXN0aW5hdGlvbiBvcHRpb25zIGFyZSBkZWZpbmVkIG5vdyAqLworCXstMSwJCQlOVUxMfQorfTsKKworc3RhdGljIGludCBpcHY2X2Rlc3RvcHRfcmN2KHN0cnVjdCBza19idWZmICoqc2ticCwgdW5zaWduZWQgaW50ICpuaG9mZnApCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpza2JwOworCXN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0ID0gSVA2Q0Ioc2tiKTsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIChza2ItPmgucmF3LXNrYi0+ZGF0YSkrOCkgfHwKKwkgICAgIXBza2JfbWF5X3B1bGwoc2tiLCAoc2tiLT5oLnJhdy1za2ItPmRhdGEpKygoc2tiLT5oLnJhd1sxXSsxKTw8MykpKSB7CisJCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW9wdC0+ZHN0MSA9IHNrYi0+aC5yYXcgLSBza2ItPm5oLnJhdzsKKworCWlmIChpcDZfcGFyc2VfdGx2KHRsdnByb2NkZXN0b3B0X2xzdCwgc2tiKSkgeworCQlza2ItPmgucmF3ICs9ICgoc2tiLT5oLnJhd1sxXSsxKTw8Myk7CisJCSpuaG9mZnAgPSBvcHQtPmRzdDE7CisJCXJldHVybiAxOworCX0KKworCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHN0cnVjdCBpbmV0Nl9wcm90b2NvbCBkZXN0b3B0X3Byb3RvY29sID0geworCS5oYW5kbGVyCT0JaXB2Nl9kZXN0b3B0X3JjdiwKKwkuZmxhZ3MJCT0JSU5FVDZfUFJPVE9fTk9QT0xJQ1ksCit9OworCit2b2lkIF9faW5pdCBpcHY2X2Rlc3RvcHRfaW5pdCh2b2lkKQoreworCWlmIChpbmV0Nl9hZGRfcHJvdG9jb2woJmRlc3RvcHRfcHJvdG9jb2wsIElQUFJPVE9fRFNUT1BUUykgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImlwdjZfZGVzdG9wdF9pbml0OiBDb3VsZCBub3QgcmVnaXN0ZXIgcHJvdG9jb2xcbiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgTk9ORSBoZWFkZXIuIE5vIGRhdGEgaW4gcGFja2V0LgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGlwdjZfbm9kYXRhX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqKnNrYnAsIHVuc2lnbmVkIGludCAqbmhvZmZwKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSAqc2ticDsKKworCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGluZXQ2X3Byb3RvY29sIG5vZGF0YV9wcm90b2NvbCA9IHsKKwkuaGFuZGxlcgk9CWlwdjZfbm9kYXRhX3JjdiwKKwkuZmxhZ3MJCT0JSU5FVDZfUFJPVE9fTk9QT0xJQ1ksCit9OworCit2b2lkIF9faW5pdCBpcHY2X25vZGF0YV9pbml0KHZvaWQpCit7CisJaWYgKGluZXQ2X2FkZF9wcm90b2NvbCgmbm9kYXRhX3Byb3RvY29sLCBJUFBST1RPX05PTkUpIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJpcHY2X25vZGF0YV9pbml0OiBDb3VsZCBub3QgcmVnaXN0ZXIgcHJvdG9jb2xcbiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgUm91dGluZyBoZWFkZXIuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgaXB2Nl9ydGhkcl9yY3Yoc3RydWN0IHNrX2J1ZmYgKipza2JwLCB1bnNpZ25lZCBpbnQgKm5ob2ZmcCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKnNrYnA7CisJc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQgPSBJUDZDQihza2IpOworCXN0cnVjdCBpbjZfYWRkciAqYWRkcjsKKwlzdHJ1Y3QgaW42X2FkZHIgZGFkZHI7CisJaW50IG4sIGk7CisKKwlzdHJ1Y3QgaXB2Nl9ydF9oZHIgKmhkcjsKKwlzdHJ1Y3QgcnQwX2hkciAqcnRoZHI7CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCAoc2tiLT5oLnJhdy1za2ItPmRhdGEpKzgpIHx8CisJICAgICFwc2tiX21heV9wdWxsKHNrYiwgKHNrYi0+aC5yYXctc2tiLT5kYXRhKSsoKHNrYi0+aC5yYXdbMV0rMSk8PDMpKSkgeworCQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAtMTsKKwl9CisKKwloZHIgPSAoc3RydWN0IGlwdjZfcnRfaGRyICopIHNrYi0+aC5yYXc7CisKKwlpZiAoaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmc2tiLT5uaC5pcHY2aC0+ZGFkZHIpIHx8CisJICAgIHNrYi0+cGt0X3R5cGUgIT0gUEFDS0VUX0hPU1QpIHsKKwkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC0xOworCX0KKworbG9vcGVkX2JhY2s6CisJaWYgKGhkci0+c2VnbWVudHNfbGVmdCA9PSAwKSB7CisJCW9wdC0+c3JjcnQgPSBza2ItPmgucmF3IC0gc2tiLT5uaC5yYXc7CisJCXNrYi0+aC5yYXcgKz0gKGhkci0+aGRybGVuICsgMSkgPDwgMzsKKwkJb3B0LT5kc3QwID0gb3B0LT5kc3QxOworCQlvcHQtPmRzdDEgPSAwOworCQkqbmhvZmZwID0gKCZoZHItPm5leHRoZHIpIC0gc2tiLT5uaC5yYXc7CisJCXJldHVybiAxOworCX0KKworCWlmIChoZHItPnR5cGUgIT0gSVBWNl9TUkNSVF9UWVBFXzApIHsKKwkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCWljbXB2Nl9wYXJhbV9wcm9iKHNrYiwgSUNNUFY2X0hEUl9GSUVMRCwgKCZoZHItPnR5cGUpIC0gc2tiLT5uaC5yYXcpOworCQlyZXR1cm4gLTE7CisJfQorCQorCWlmIChoZHItPmhkcmxlbiAmIDB4MDEpIHsKKwkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCWljbXB2Nl9wYXJhbV9wcm9iKHNrYiwgSUNNUFY2X0hEUl9GSUVMRCwgKCZoZHItPmhkcmxlbikgLSBza2ItPm5oLnJhdyk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqCVRoaXMgaXMgdGhlIHJvdXRpbmcgaGVhZGVyIGZvcndhcmRpbmcgYWxnb3JpdGhtIGZyb20KKwkgKglSRkMgMjQ2MCwgcGFnZSAxNi4KKwkgKi8KKworCW4gPSBoZHItPmhkcmxlbiA+PiAxOworCisJaWYgKGhkci0+c2VnbWVudHNfbGVmdCA+IG4pIHsKKwkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCWljbXB2Nl9wYXJhbV9wcm9iKHNrYiwgSUNNUFY2X0hEUl9GSUVMRCwgKCZoZHItPnNlZ21lbnRzX2xlZnQpIC0gc2tiLT5uaC5yYXcpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogV2UgYXJlIGFib3V0IHRvIG1hbmdsZSBwYWNrZXQgaGVhZGVyLiBCZSBjYXJlZnVsIQorCSAgIERvIG5vdCBkYW1hZ2UgcGFja2V0cyBxdWV1ZWQgc29tZXdoZXJlLgorCSAqLworCWlmIChza2JfY2xvbmVkKHNrYikpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjIgPSBza2JfY29weShza2IsIEdGUF9BVE9NSUMpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJLyogdGhlIGNvcHkgaXMgYSBmb3J3YXJkZWQgcGFja2V0ICovCisJCWlmIChza2IyID09IE5VTEwpIHsKKwkJCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfT1VURElTQ0FSRFMpOwkKKwkJCXJldHVybiAtMTsKKwkJfQorCQkqc2ticCA9IHNrYiA9IHNrYjI7CisJCW9wdCA9IElQNkNCKHNrYjIpOworCQloZHIgPSAoc3RydWN0IGlwdjZfcnRfaGRyICopIHNrYjItPmgucmF3OworCX0KKworCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCisJaSA9IG4gLSAtLWhkci0+c2VnbWVudHNfbGVmdDsKKworCXJ0aGRyID0gKHN0cnVjdCBydDBfaGRyICopIGhkcjsKKwlhZGRyID0gcnRoZHItPmFkZHI7CisJYWRkciArPSBpIC0gMTsKKworCWlmIChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KGFkZHIpKSB7CisJCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5BRERSRVJST1JTKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpcHY2X2FkZHJfY29weSgmZGFkZHIsIGFkZHIpOworCWlwdjZfYWRkcl9jb3B5KGFkZHIsICZza2ItPm5oLmlwdjZoLT5kYWRkcik7CisJaXB2Nl9hZGRyX2NvcHkoJnNrYi0+bmguaXB2NmgtPmRhZGRyLCAmZGFkZHIpOworCisJZHN0X3JlbGVhc2UoeGNoZygmc2tiLT5kc3QsIE5VTEwpKTsKKwlpcDZfcm91dGVfaW5wdXQoc2tiKTsKKwlpZiAoc2tiLT5kc3QtPmVycm9yKSB7CisJCXNrYl9wdXNoKHNrYiwgc2tiLT5kYXRhIC0gc2tiLT5uaC5yYXcpOworCQlkc3RfaW5wdXQoc2tiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChza2ItPmRzdC0+ZGV2LT5mbGFncyZJRkZfTE9PUEJBQ0spIHsKKwkJaWYgKHNrYi0+bmguaXB2NmgtPmhvcF9saW1pdCA8PSAxKSB7CisJCQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKKwkJCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1RJTUVfRVhDRUVELCBJQ01QVjZfRVhDX0hPUExJTUlULAorCQkJCSAgICAwLCBza2ItPmRldik7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlza2ItPm5oLmlwdjZoLT5ob3BfbGltaXQtLTsKKwkJZ290byBsb29wZWRfYmFjazsKKwl9CisKKwlza2JfcHVzaChza2IsIHNrYi0+ZGF0YSAtIHNrYi0+bmgucmF3KTsKKwlkc3RfaW5wdXQoc2tiKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5ldDZfcHJvdG9jb2wgcnRoZHJfcHJvdG9jb2wgPSB7CisJLmhhbmRsZXIJPQlpcHY2X3J0aGRyX3JjdiwKKwkuZmxhZ3MJCT0JSU5FVDZfUFJPVE9fTk9QT0xJQ1ksCit9OworCit2b2lkIF9faW5pdCBpcHY2X3J0aGRyX2luaXQodm9pZCkKK3sKKwlpZiAoaW5ldDZfYWRkX3Byb3RvY29sKCZydGhkcl9wcm90b2NvbCwgSVBQUk9UT19ST1VUSU5HKSA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiaXB2Nl9ydGhkcl9pbml0OiBDb3VsZCBub3QgcmVnaXN0ZXIgcHJvdG9jb2xcbiIpOworfTsKKworLyoKKyAgIFRoaXMgZnVuY3Rpb24gaW52ZXJ0cyByZWNlaXZlZCBydGhkci4KKyAgIE5PVEU6IHNwZWNzIGFsbG93IHRvIG1ha2UgaXQgYXV0b21hdGljYWxseSBvbmx5IGlmCisgICBwYWNrZXQgYXV0aGVudGljYXRlZC4KKworICAgSSB3aWxsIG5vdCBkaXNjdXNzIGl0IGhlcmUgKHRob3VnaCwgSSBhbSByZWFsbHkgcGlzc2VkIG9mZiBhdAorICAgdGhpcyBzdHVwaWQgcmVxdWlyZW1lbnQgbWFraW5nIHJ0aGRyIGlkZWEgdXNlbGVzcykKKworICAgQWN0dWFsbHksIGl0IGNyZWF0ZXMgc2V2ZXJlIHByb2JsZW1zICBmb3IgdXMuCisgICBFbWJyeW9uaWMgcmVxdWVzdHMgaGFzIG5vIGFzc29jaWF0ZWQgc29ja2V0cywKKyAgIHNvIHRoYXQgdXNlciBoYXZlIG5vIGNvbnRyb2wgb3ZlciBpdCBhbmQKKyAgIGNhbm5vdCBub3Qgb25seSB0byBzZXQgcmVwbHkgb3B0aW9ucywgYnV0CisgICBldmVuIHRvIGtub3csIHRoYXQgc29tZW9uZSB3YW50cyB0byBjb25uZWN0CisgICB3aXRob3V0IHN1Y2Nlc3MuIDotKAorCisgICBGb3Igbm93IHdlIG5lZWQgdG8gdGVzdCB0aGUgZW5naW5lLCBzbyB0aGF0IEkgY3JlYXRlZAorICAgdGVtcG9yYXJ5IChvciBwZXJtYW5lbnQpIGJhY2tkb29yLgorICAgSWYgbGlzdGVuaW5nIHNvY2tldCBzZXQgSVBWNl9SVEhEUiB0byAyLCB0aGVuIHdlIGludmVydCBoZWFkZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLUFOSyAoOTgwNzI5KQorICovCisKK3N0cnVjdCBpcHY2X3R4b3B0aW9ucyAqCitpcHY2X2ludmVydF9ydGhkcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBpcHY2X3J0X2hkciAqaGRyKQoreworCS8qIFJlY2VpdmVkIHJ0aGRyOgorCisJICAgWyBIMSAtPiBIMiAtPiAuLi4gSF9wcmV2IF0gIGRhZGRyPU1FCisKKwkgICBJbnZlcnRlZCByZXN1bHQ6CisJICAgWyBIX3ByZXYgLT4gLi4uIC0+IEgxIF0gZGFkZHIgPXNlbmRlcgorCisJICAgTm90ZSwgdGhhdCBJUCBvdXRwdXQgZW5naW5lIHdpbGwgcmV3cml0ZSB0aGlzIHJ0aGRyCisJICAgYnkgcm90YXRpbmcgaXQgbGVmdCBieSBvbmUgYWRkci4KKwkgKi8KKworCWludCBuLCBpOworCXN0cnVjdCBydDBfaGRyICpydGhkciA9IChzdHJ1Y3QgcnQwX2hkciopaGRyOworCXN0cnVjdCBydDBfaGRyICppcnRoZHI7CisJc3RydWN0IGlwdjZfdHhvcHRpb25zICpvcHQ7CisJaW50IGhkcmxlbiA9IGlwdjZfb3B0bGVuKGhkcik7CisKKwlpZiAoaGRyLT5zZWdtZW50c19sZWZ0IHx8CisJICAgIGhkci0+dHlwZSAhPSBJUFY2X1NSQ1JUX1RZUEVfMCB8fAorCSAgICBoZHItPmhkcmxlbiAmIDB4MDEpCisJCXJldHVybiBOVUxMOworCisJbiA9IGhkci0+aGRybGVuID4+IDE7CisJb3B0ID0gc29ja19rbWFsbG9jKHNrLCBzaXplb2YoKm9wdCkgKyBoZHJsZW4sIEdGUF9BVE9NSUMpOworCWlmIChvcHQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KG9wdCwgMCwgc2l6ZW9mKCpvcHQpKTsKKwlvcHQtPnRvdF9sZW4gPSBzaXplb2YoKm9wdCkgKyBoZHJsZW47CisJb3B0LT5zcmNydCA9ICh2b2lkKikob3B0KzEpOworCW9wdC0+b3B0X25mbGVuID0gaGRybGVuOworCisJbWVtY3B5KG9wdC0+c3JjcnQsIGhkciwgc2l6ZW9mKCpoZHIpKTsKKwlpcnRoZHIgPSAoc3RydWN0IHJ0MF9oZHIqKW9wdC0+c3JjcnQ7CisJLyogT2Jzb2xldGUgZmllbGQsIE1CWiwgd2hlbiBvcmlnaW5hdGVkIGJ5IHVzICovCisJaXJ0aGRyLT5iaXRtYXAgPSAwOworCW9wdC0+c3JjcnQtPnNlZ21lbnRzX2xlZnQgPSBuOworCWZvciAoaT0wOyBpPG47IGkrKykKKwkJbWVtY3B5KGlydGhkci0+YWRkcitpLCBydGhkci0+YWRkcisobi0xLWkpLCAxNik7CisJcmV0dXJuIG9wdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgSG9wLWJ5LWhvcCBvcHRpb25zLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFJvdXRlciBBbGVydCBhcyBvZiBSRkMgMjcxMSAqLworCitzdGF0aWMgaW50IGlwdjZfaG9wX3JhKHN0cnVjdCBza19idWZmICpza2IsIGludCBvcHRvZmYpCit7CisJaWYgKHNrYi0+bmgucmF3W29wdG9mZisxXSA9PSAyKSB7CisJCUlQNkNCKHNrYiktPnJhID0gb3B0b2ZmOworCQlyZXR1cm4gMTsKKwl9CisJTElNSVRfTkVUREVCVUcoCisJCSBwcmludGsoS0VSTl9ERUJVRyAiaXB2Nl9ob3BfcmE6IHdyb25nIFJBIGxlbmd0aCAlZFxuIiwgc2tiLT5uaC5yYXdbb3B0b2ZmKzFdKSk7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKKy8qIEp1bWJvIHBheWxvYWQgKi8KKworc3RhdGljIGludCBpcHY2X2hvcF9qdW1ibyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb3B0b2ZmKQoreworCXUzMiBwa3RfbGVuOworCisJaWYgKHNrYi0+bmgucmF3W29wdG9mZisxXSAhPSA0IHx8IChvcHRvZmYmMykgIT0gMikgeworCQlMSU1JVF9ORVRERUJVRygKKwkJCSBwcmludGsoS0VSTl9ERUJVRyAiaXB2Nl9ob3BfanVtYm86IHdyb25nIGp1bWJvIG9wdCBsZW5ndGgvYWxpZ25tZW50ICVkXG4iLCBza2ItPm5oLnJhd1tvcHRvZmYrMV0pKTsKKwkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCWdvdG8gZHJvcDsKKwl9CisKKwlwa3RfbGVuID0gbnRvaGwoKih1MzIqKShza2ItPm5oLnJhdytvcHRvZmYrMikpOworCWlmIChwa3RfbGVuIDw9IElQVjZfTUFYUExFTikgeworCQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKKwkJaWNtcHY2X3BhcmFtX3Byb2Ioc2tiLCBJQ01QVjZfSERSX0ZJRUxELCBvcHRvZmYrMik7CisJCXJldHVybiAwOworCX0KKwlpZiAoc2tiLT5uaC5pcHY2aC0+cGF5bG9hZF9sZW4pIHsKKwkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCWljbXB2Nl9wYXJhbV9wcm9iKHNrYiwgSUNNUFY2X0hEUl9GSUVMRCwgb3B0b2ZmKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBrdF9sZW4gPiBza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpIHsKKwkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTlRSVU5DQVRFRFBLVFMpOworCQlnb3RvIGRyb3A7CisJfQorCWlmIChwa3RfbGVuICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSA8IHNrYi0+bGVuKSB7CisJCV9fcHNrYl90cmltKHNrYiwgcGt0X2xlbiArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpCisJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJfQorCXJldHVybiAxOworCitkcm9wOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHRsdnR5cGVfcHJvYyB0bHZwcm9jaG9wb3B0X2xzdFtdID0geworCXsKKwkJLnR5cGUJPSBJUFY2X1RMVl9ST1VURVJBTEVSVCwKKwkJLmZ1bmMJPSBpcHY2X2hvcF9yYSwKKwl9LAorCXsKKwkJLnR5cGUJPSBJUFY2X1RMVl9KVU1CTywKKwkJLmZ1bmMJPSBpcHY2X2hvcF9qdW1ibywKKwl9LAorCXsgLTEsIH0KK307CisKK2ludCBpcHY2X3BhcnNlX2hvcG9wdHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG5ob2ZmKQoreworCUlQNkNCKHNrYiktPmhvcCA9IHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisJaWYgKGlwNl9wYXJzZV90bHYodGx2cHJvY2hvcG9wdF9sc3QsIHNrYikpCisJCXJldHVybiBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCXJldHVybiAtMTsKK30KKworLyoKKyAqCUNyZWF0aW5nIG91dGJvdW5kIGhlYWRlcnMuCisgKgorICoJImJ1aWxkIiBmdW5jdGlvbnMgd29yayB3aGVuIHNrYiBpcyBmaWxsZWQgZnJvbSBoZWFkIHRvIHRhaWwgKGRhdGFncmFtKQorICoJInB1c2giCWZ1bmN0aW9ucyB3b3JrIHdoZW4gaGVhZGVycyBhcmUgYWRkZWQgZnJvbSB0YWlsIHRvIGhlYWQgKHRjcCkKKyAqCisgKglJbiBib3RoIGNhc2VzIHdlIGFzc3VtZSwgdGhhdCBjYWxsZXIgcmVzZXJ2ZWQgZW5vdWdoIHJvb20KKyAqCWZvciBoZWFkZXJzLgorICovCisKK3N0YXRpYyB2b2lkIGlwdjZfcHVzaF9ydGhkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqcHJvdG8sCisJCQkgICAgc3RydWN0IGlwdjZfcnRfaGRyICpvcHQsCisJCQkgICAgc3RydWN0IGluNl9hZGRyICoqYWRkcl9wKQoreworCXN0cnVjdCBydDBfaGRyICpwaGRyLCAqaWhkcjsKKwlpbnQgaG9wczsKKworCWloZHIgPSAoc3RydWN0IHJ0MF9oZHIgKikgb3B0OworCQorCXBoZHIgPSAoc3RydWN0IHJ0MF9oZHIgKikgc2tiX3B1c2goc2tiLCAoaWhkci0+cnRfaGRyLmhkcmxlbiArIDEpIDw8IDMpOworCW1lbWNweShwaGRyLCBpaGRyLCBzaXplb2Yoc3RydWN0IHJ0MF9oZHIpKTsKKworCWhvcHMgPSBpaGRyLT5ydF9oZHIuaGRybGVuID4+IDE7CisKKwlpZiAoaG9wcyA+IDEpCisJCW1lbWNweShwaGRyLT5hZGRyLCBpaGRyLT5hZGRyICsgMSwKKwkJICAgICAgIChob3BzIC0gMSkgKiBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisKKwlpcHY2X2FkZHJfY29weShwaGRyLT5hZGRyICsgKGhvcHMgLSAxKSwgKmFkZHJfcCk7CisJKmFkZHJfcCA9IGloZHItPmFkZHI7CisKKwlwaGRyLT5ydF9oZHIubmV4dGhkciA9ICpwcm90bzsKKwkqcHJvdG8gPSBORVhUSERSX1JPVVRJTkc7Cit9CisKK3N0YXRpYyB2b2lkIGlwdjZfcHVzaF9leHRoZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKnByb3RvLCB1OCB0eXBlLCBzdHJ1Y3QgaXB2Nl9vcHRfaGRyICpvcHQpCit7CisJc3RydWN0IGlwdjZfb3B0X2hkciAqaCA9IChzdHJ1Y3QgaXB2Nl9vcHRfaGRyICopc2tiX3B1c2goc2tiLCBpcHY2X29wdGxlbihvcHQpKTsKKworCW1lbWNweShoLCBvcHQsIGlwdjZfb3B0bGVuKG9wdCkpOworCWgtPm5leHRoZHIgPSAqcHJvdG87CisJKnByb3RvID0gdHlwZTsKK30KKwordm9pZCBpcHY2X3B1c2hfbmZyYWdfb3B0cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdCwKKwkJCSAgdTggKnByb3RvLAorCQkJICBzdHJ1Y3QgaW42X2FkZHIgKipkYWRkcikKK3sKKwlpZiAob3B0LT5zcmNydCkKKwkJaXB2Nl9wdXNoX3J0aGRyKHNrYiwgcHJvdG8sIG9wdC0+c3JjcnQsIGRhZGRyKTsKKwlpZiAob3B0LT5kc3Qwb3B0KQorCQlpcHY2X3B1c2hfZXh0aGRyKHNrYiwgcHJvdG8sIE5FWFRIRFJfREVTVCwgb3B0LT5kc3Qwb3B0KTsKKwlpZiAob3B0LT5ob3BvcHQpCisJCWlwdjZfcHVzaF9leHRoZHIoc2tiLCBwcm90bywgTkVYVEhEUl9IT1AsIG9wdC0+aG9wb3B0KTsKK30KKwordm9pZCBpcHY2X3B1c2hfZnJhZ19vcHRzKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcHY2X3R4b3B0aW9ucyAqb3B0LCB1OCAqcHJvdG8pCit7CisJaWYgKG9wdC0+ZHN0MW9wdCkKKwkJaXB2Nl9wdXNoX2V4dGhkcihza2IsIHByb3RvLCBORVhUSERSX0RFU1QsIG9wdC0+ZHN0MW9wdCk7Cit9CisKK3N0cnVjdCBpcHY2X3R4b3B0aW9ucyAqCitpcHY2X2R1cF9vcHRpb25zKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGlwdjZfdHhvcHRpb25zICpvcHQpCit7CisJc3RydWN0IGlwdjZfdHhvcHRpb25zICpvcHQyOworCisJb3B0MiA9IHNvY2tfa21hbGxvYyhzaywgb3B0LT50b3RfbGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAob3B0MikgeworCQlsb25nIGRpZiA9IChjaGFyKilvcHQyIC0gKGNoYXIqKW9wdDsKKwkJbWVtY3B5KG9wdDIsIG9wdCwgb3B0LT50b3RfbGVuKTsKKwkJaWYgKG9wdDItPmhvcG9wdCkKKwkJCSooKGNoYXIqKikmb3B0Mi0+aG9wb3B0KSArPSBkaWY7CisJCWlmIChvcHQyLT5kc3Qwb3B0KQorCQkJKigoY2hhcioqKSZvcHQyLT5kc3Qwb3B0KSArPSBkaWY7CisJCWlmIChvcHQyLT5kc3Qxb3B0KQorCQkJKigoY2hhcioqKSZvcHQyLT5kc3Qxb3B0KSArPSBkaWY7CisJCWlmIChvcHQyLT5zcmNydCkKKwkJCSooKGNoYXIqKikmb3B0Mi0+c3JjcnQpICs9IGRpZjsKKwl9CisJcmV0dXJuIG9wdDI7Cit9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9leHRoZHJzX2NvcmUuYyBiL25ldC9pcHY2L2V4dGhkcnNfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZGE4MTUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2Ni9leHRoZHJzX2NvcmUuYwpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIElQdjYgbGlicmFyeSBjb2RlLCBuZWVkZWQgYnkgc3RhdGljIGNvbXBvbmVudHMgd2hlbiBmdWxsIElQdjYgc3VwcG9ydCBpcworICogbm90IGNvbmZpZ3VyZWQgb3Igc3RhdGljLgorICovCisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKworLyogCisgKiBmaW5kIG91dCBpZiBuZXh0aGRyIGlzIGEgd2VsbC1rbm93biBleHRlbnNpb24gaGVhZGVyIG9yIGEgcHJvdG9jb2wKKyAqLworCitpbnQgaXB2Nl9leHRfaGRyKHU4IG5leHRoZHIpCit7CisJLyogCisJICogZmluZCBvdXQgaWYgbmV4dGhkciBpcyBhbiBleHRlbnNpb24gaGVhZGVyIG9yIGEgcHJvdG9jb2wKKwkgKi8KKwlyZXR1cm4gKCAobmV4dGhkciA9PSBORVhUSERSX0hPUCkJfHwKKwkJIChuZXh0aGRyID09IE5FWFRIRFJfUk9VVElORykJfHwKKwkJIChuZXh0aGRyID09IE5FWFRIRFJfRlJBR01FTlQpCXx8CisJCSAobmV4dGhkciA9PSBORVhUSERSX0FVVEgpCXx8CisJCSAobmV4dGhkciA9PSBORVhUSERSX05PTkUpCXx8CisJCSAobmV4dGhkciA9PSBORVhUSERSX0RFU1QpICk7Cit9CisKKy8qCisgKiBTa2lwIGFueSBleHRlbnNpb24gaGVhZGVycy4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBJQ01QIG1vZHVsZS4KKyAqCisgKiBOb3RlIHRoYXQgc3RyaWN0bHkgc3BlYWtpbmcgdGhpcyBjb25mbGljdHMgd2l0aCBSRkMgMjQ2MCA0LjA6CisgKiAuLi5UaGUgY29udGVudHMgYW5kIHNlbWFudGljcyBvZiBlYWNoIGV4dGVuc2lvbiBoZWFkZXIgZGV0ZXJtaW5lIHdoZXRoZXIgCisgKiBvciBub3QgdG8gcHJvY2VlZCB0byB0aGUgbmV4dCBoZWFkZXIuICBUaGVyZWZvcmUsIGV4dGVuc2lvbiBoZWFkZXJzIG11c3QKKyAqIGJlIHByb2Nlc3NlZCBzdHJpY3RseSBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIHBhY2tldDsgYQorICogcmVjZWl2ZXIgbXVzdCBub3QsIGZvciBleGFtcGxlLCBzY2FuIHRocm91Z2ggYSBwYWNrZXQgbG9va2luZyBmb3IgYQorICogcGFydGljdWxhciBraW5kIG9mIGV4dGVuc2lvbiBoZWFkZXIgYW5kIHByb2Nlc3MgdGhhdCBoZWFkZXIgcHJpb3IgdG8KKyAqIHByb2Nlc3NpbmcgYWxsIHByZWNlZGluZyBvbmVzLgorICogCisgKiBXZSBkbyBleGFjdGx5IHRoaXMuIFRoaXMgaXMgYSBwcm90b2NvbCBidWcuIFdlIGNhbid0IGRlY2lkZSBhZnRlciBhCisgKiBzZWVpbmcgYW4gdW5rbm93biBkaXNjYXJkLXdpdGgtZXJyb3IgZmxhdm91ciBUTFYgb3B0aW9uIGlmIGl0J3MgYSAKKyAqIElDTVAgZXJyb3IgbWVzc2FnZSBvciBub3QgKGVycm9ycyBzaG91bGQgbmV2ZXIgYmUgc2VuZCBpbiByZXBseSB0bworICogSUNNUCBlcnJvciBtZXNzYWdlcykuCisgKiAKKyAqIEJ1dCBJIHNlZSBubyBvdGhlciB3YXkgdG8gZG8gdGhpcy4gVGhpcyBtaWdodCBuZWVkIHRvIGJlIHJlZXhhbWluZWQKKyAqIHdoZW4gTGludXggaW1wbGVtZW50cyBFU1AgKGFuZCBtYXliZSBBVVRIKSBoZWFkZXJzLgorICogLS1BSworICoKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIChwcm9iYWJseSB0cnVuY2F0ZWQpIGV4dGhkciBzZXQgImhkciIKKyAqIG9mIGxlbmd0aCAibGVuIi4gIm5leHRoZHJwIiBpbml0aWFsbHkgcG9pbnRzIHRvIHNvbWUgcGxhY2UsCisgKiB3aGVyZSB0eXBlIG9mIHRoZSBmaXJzdCBoZWFkZXIgY2FuIGJlIGZvdW5kLgorICoKKyAqIEl0IHNraXBzIGFsbCB3ZWxsLWtub3duIGV4dGhkcnMsIGFuZCByZXR1cm5zIHBvaW50ZXIgdG8gdGhlIHN0YXJ0CisgKiBvZiB1bnBhcnNhYmxlIGFyZWEgaS5lLiB0aGUgZmlyc3QgaGVhZGVyIHdpdGggdW5rbm93biB0eXBlLgorICogSWYgaXQgaXMgbm90IE5VTEwgKm5leHRoZHIgaXMgdXBkYXRlZCBieSB0eXBlL3Byb3RvY29sIG9mIHRoaXMgaGVhZGVyLgorICoKKyAqIE5PVEVTOiAtIGlmIHBhY2tldCB0ZXJtaW5hdGVkIHdpdGggTkVYVEhEUl9OT05FIGl0IHJldHVybnMgTlVMTC4KKyAqICAgICAgICAtIGl0IG1heSByZXR1cm4gcG9pbnRlciBwb2ludGluZyBiZXlvbmQgZW5kIG9mIHBhY2tldCwKKyAqCSAgICBpZiB0aGUgbGFzdCByZWNvZ25pemVkIGhlYWRlciBpcyB0cnVuY2F0ZWQgaW4gdGhlIG1pZGRsZS4KKyAqICAgICAgICAtIGlmIHBhY2tldCBpcyB0cnVuY2F0ZWQsIHNvIHRoYXQgYWxsIHBhcnNlZCBoZWFkZXJzIGFyZSBza2lwcGVkLAorICoJICAgIGl0IHJldHVybnMgTlVMTC4KKyAqCSAgLSBGaXJzdCBmcmFnbWVudCBoZWFkZXIgaXMgc2tpcHBlZCwgbm90LWZpcnN0IG9uZXMKKyAqCSAgICBhcmUgY29uc2lkZXJlZCBhcyB1bnBhcnNhYmxlLgorICoJICAtIEVTUCBpcyB1bnBhcnNhYmxlIGZvciBub3cgYW5kIGNvbnNpZGVyZWQgbGlrZQorICoJICAgIG5vcm1hbCBwYXlsb2FkIHByb3RvY29sLgorICoJICAtIE5vdGUgYWxzbyBzcGVjaWFsIGhhbmRsaW5nIG9mIEFVVEggaGVhZGVyLiBUaGFua3MgdG8gSVBzZWMgd2l6YXJkcy4KKyAqCisgKiAtLUFOSyAoOTgwNzI2KQorICovCisKK2ludCBpcHY2X3NraXBfZXh0aGRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGludCBzdGFydCwgdTggKm5leHRoZHJwLCBpbnQgbGVuKQoreworCXU4IG5leHRoZHIgPSAqbmV4dGhkcnA7CisKKwl3aGlsZSAoaXB2Nl9leHRfaGRyKG5leHRoZHIpKSB7CisJCXN0cnVjdCBpcHY2X29wdF9oZHIgX2hkciwgKmhwOworCQlpbnQgaGRybGVuOworCisJCWlmIChsZW4gPCAoaW50KXNpemVvZihzdHJ1Y3QgaXB2Nl9vcHRfaGRyKSkKKwkJCXJldHVybiAtMTsKKwkJaWYgKG5leHRoZHIgPT0gTkVYVEhEUl9OT05FKQorCQkJcmV0dXJuIC0xOworCQlocCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHN0YXJ0LCBzaXplb2YoX2hkciksICZfaGRyKTsKKwkJaWYgKGhwID09IE5VTEwpCisJCQlCVUcoKTsKKwkJaWYgKG5leHRoZHIgPT0gTkVYVEhEUl9GUkFHTUVOVCkgeworCQkJdW5zaWduZWQgc2hvcnQgX2ZyYWdfb2ZmLCAqZnA7CisJCQlmcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsCisJCQkJCQlzdGFydCtvZmZzZXRvZihzdHJ1Y3QgZnJhZ19oZHIsCisJCQkJCQkJICAgICAgIGZyYWdfb2ZmKSwKKwkJCQkJCXNpemVvZihfZnJhZ19vZmYpLAorCQkJCQkJJl9mcmFnX29mZik7CisJCQlpZiAoZnAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLTE7CisKKwkJCWlmIChudG9ocygqZnApICYgfjB4NykKKwkJCQlicmVhazsKKwkJCWhkcmxlbiA9IDg7CisJCX0gZWxzZSBpZiAobmV4dGhkciA9PSBORVhUSERSX0FVVEgpCisJCQloZHJsZW4gPSAoaHAtPmhkcmxlbisyKTw8MjsgCisJCWVsc2UKKwkJCWhkcmxlbiA9IGlwdjZfb3B0bGVuKGhwKTsgCisKKwkJbmV4dGhkciA9IGhwLT5uZXh0aGRyOworCQlsZW4gLT0gaGRybGVuOworCQlzdGFydCArPSBoZHJsZW47CisJfQorCisJKm5leHRoZHJwID0gbmV4dGhkcjsKKwlyZXR1cm4gc3RhcnQ7Cit9CisKK0VYUE9SVF9TWU1CT0woaXB2Nl9leHRfaGRyKTsKK0VYUE9SVF9TWU1CT0woaXB2Nl9za2lwX2V4dGhkcik7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pY21wLmMgYi9uZXQvaXB2Ni9pY21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdiOTA4MgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY2L2ljbXAuYwpAQCAtMCwwICsxLDgyMiBAQAorLyoKKyAqCUludGVybmV0IENvbnRyb2wgTWVzc2FnZSBQcm90b2NvbCAoSUNNUHY2KQorICoJTGludXggSU5FVDYgaW1wbGVtZW50YXRpb24KKyAqCisgKglBdXRob3JzOgorICoJUGVkcm8gUm9xdWUJCTxyb3F1ZUBkaS5mYy51bC5wdD4KKyAqCisgKgkkSWQ6IGljbXAuYyx2IDEuMzggMjAwMi8wMi8wOCAwMzo1NzoxOSBkYXZlbSBFeHAgJAorICoKKyAqCUJhc2VkIG9uIG5ldC9pcHY0L2ljbXAuYworICoKKyAqCVJGQyAxODg1CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisvKgorICoJQ2hhbmdlczoKKyAqCisgKglBbmRpIEtsZWVuCQk6CWV4Y2VwdGlvbiBoYW5kbGluZworICoJQW5kaSBLbGVlbgkJCWFkZCByYXRlIGxpbWl0cy4gbmV2ZXIgcmVwbHkgdG8gYSBpY21wLgorICoJCQkJCWFkZCBtb3JlIGxlbmd0aCBjaGVja3MgYW5kIG90aGVyIGZpeGVzLgorICoJeW9zaGZ1amkJCToJZW5zdXJlIHRvIHNlbnQgcGFyYW1ldGVyIHByb2JsZW0gZm9yCisgKgkJCQkJZnJhZ21lbnRzLgorICoJWU9TSElGVUpJIEhpZGVha2kgQFVTQUdJOglhZGRlZCBzeXNjdGwgZm9yIGljbXAgcmF0ZSBsaW1pdC4KKyAqCVJhbmR5IER1bmxhcCBhbmQKKyAqCVlPU0hJRlVKSSBIaWRlYWtpIEBVU0FHSToJUGVyLWludGVyZmFjZSBzdGF0aXN0aWNzIHN1cHBvcnQKKyAqCUthenVub3JpIE1JWUFaQVdBIEBVU0FHSTogICAgICAgY2hhbmdlIG91dHB1dCBwcm9jZXNzIHRvIHVzZSBpcDZfYXBwZW5kX2RhdGEKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaWZkZWYgQ09ORklHX1NZU0NUTAorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWNtcHY2Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvaXA2X2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L3Jhdy5oPgorI2luY2x1ZGUgPG5ldC9yYXd2Ni5oPgorI2luY2x1ZGUgPG5ldC90cmFuc3BfdjYuaD4KKyNpbmNsdWRlIDxuZXQvaXA2X3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CisjaW5jbHVkZSA8bmV0L2ljbXAuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCitERUZJTkVfU05NUF9TVEFUKHN0cnVjdCBpY21wdjZfbWliLCBpY21wdjZfc3RhdGlzdGljcyk7CisKKy8qCisgKglUaGUgSUNNUCBzb2NrZXQocykuIFRoaXMgaXMgdGhlIG1vc3QgY29udmVuaWVudCB3YXkgdG8gZmxvdyBjb250cm9sCisgKglvdXIgSUNNUCBvdXRwdXQgYXMgd2VsbCBhcyBtYWludGFpbiBhIGNsZWFuIGludGVyZmFjZSB0aHJvdWdob3V0CisgKglhbGwgbGF5ZXJzLiBBbGwgU29ja2V0bGVzcyBJUCBzZW5kcyB3aWxsIHNvb24gYmUgZ29uZS4KKyAqCisgKglPbiBTTVAgd2UgaGF2ZSBvbmUgSUNNUCBzb2NrZXQgcGVyLWNwdS4KKyAqLworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzb2NrZXQgKiwgX19pY21wdjZfc29ja2V0KSA9IE5VTEw7CisjZGVmaW5lIGljbXB2Nl9zb2NrZXQJX19nZXRfY3B1X3ZhcihfX2ljbXB2Nl9zb2NrZXQpCisKK3N0YXRpYyBpbnQgaWNtcHY2X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGludCAqbmhvZmZwKTsKKworc3RhdGljIHN0cnVjdCBpbmV0Nl9wcm90b2NvbCBpY21wdjZfcHJvdG9jb2wgPSB7CisJLmhhbmRsZXIJPQlpY21wdjZfcmN2LAorCS5mbGFncwkJPQlJTkVUNl9QUk9UT19GSU5BTCwKK307CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBpY21wdjZfeG1pdF9sb2NrKHZvaWQpCit7CisJbG9jYWxfYmhfZGlzYWJsZSgpOworCisJaWYgKHVubGlrZWx5KCFzcGluX3RyeWxvY2soJmljbXB2Nl9zb2NrZXQtPnNrLT5za19sb2NrLnNsb2NrKSkpIHsKKwkJLyogVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBvdXRwdXQgcGF0aCAoZi5lLiBTSVQgb3IKKwkJICogaXA2aXA2IHR1bm5lbCkgc2lnbmFscyBkc3RfbGlua19mYWlsdXJlKCkgZm9yIGFuCisJCSAqIG91dGdvaW5nIElDTVA2IHBhY2tldC4KKwkJICovCisJCWxvY2FsX2JoX2VuYWJsZSgpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgaWNtcHY2X3htaXRfdW5sb2NrKHZvaWQpCit7CisJc3Bpbl91bmxvY2tfYmgoJmljbXB2Nl9zb2NrZXQtPnNrLT5za19sb2NrLnNsb2NrKTsKK30KKworLyogCisgKiBTbGlnaHRseSBtb3JlIGNvbnZlbmllbnQgdmVyc2lvbiBvZiBpY21wdjZfc2VuZC4KKyAqLwordm9pZCBpY21wdjZfcGFyYW1fcHJvYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgY29kZSwgaW50IHBvcykKK3sKKwlpY21wdjZfc2VuZChza2IsIElDTVBWNl9QQVJBTVBST0IsIGNvZGUsIHBvcywgc2tiLT5kZXYpOworCWtmcmVlX3NrYihza2IpOworfQorCisvKgorICogRmlndXJlIG91dCwgbWF5IHdlIHJlcGx5IHRvIHRoaXMgcGFja2V0IHdpdGggaWNtcCBlcnJvci4KKyAqCisgKiBXZSBkbyBub3QgcmVwbHksIGlmOgorICoJLSBpdCB3YXMgaWNtcCBlcnJvciBtZXNzYWdlLgorICoJLSBpdCBpcyB0cnVuY2F0ZWQsIHNvIHRoYXQgaXQgaXMga25vd24sIHRoYXQgcHJvdG9jb2wgaXMgSUNNUFY2CisgKgkgIChpLmUuIGluIHRoZSBtaWRkbGUgb2Ygc29tZSBleHRoZHIpCisgKgorICoJLS1BTksgKDk4MDcyNikKKyAqLworCitzdGF0aWMgaW50IGlzX2luZWxpZ2libGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcHRyID0gKHU4Kikoc2tiLT5uaC5pcHY2aCsxKSAtIHNrYi0+ZGF0YTsKKwlpbnQgbGVuID0gc2tiLT5sZW4gLSBwdHI7CisJX191OCBuZXh0aGRyID0gc2tiLT5uaC5pcHY2aC0+bmV4dGhkcjsKKworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gMTsKKworCXB0ciA9IGlwdjZfc2tpcF9leHRoZHIoc2tiLCBwdHIsICZuZXh0aGRyLCBsZW4pOworCWlmIChwdHIgPCAwKQorCQlyZXR1cm4gMDsKKwlpZiAobmV4dGhkciA9PSBJUFBST1RPX0lDTVBWNikgeworCQl1OCBfdHlwZSwgKnRwOworCQl0cCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsCisJCQlwdHIrb2Zmc2V0b2Yoc3RydWN0IGljbXA2aGRyLCBpY21wNl90eXBlKSwKKwkJCXNpemVvZihfdHlwZSksICZfdHlwZSk7CisJCWlmICh0cCA9PSBOVUxMIHx8CisJCSAgICAhKCp0cCAmIElDTVBWNl9JTkZPTVNHX01BU0spKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN5c2N0bF9pY21wdjZfdGltZSA9IDEqSFo7IAorCisvKiAKKyAqIENoZWNrIHRoZSBJQ01QIG91dHB1dCByYXRlIGxpbWl0IAorICovCitzdGF0aWMgaW5saW5lIGludCBpY21wdjZfeHJsaW1fYWxsb3coc3RydWN0IHNvY2sgKnNrLCBpbnQgdHlwZSwKKwkJCQkgICAgIHN0cnVjdCBmbG93aSAqZmwpCit7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0OworCWludCByZXMgPSAwOworCisJLyogSW5mb3JtYXRpb25hbCBtZXNzYWdlcyBhcmUgbm90IGxpbWl0ZWQuICovCisJaWYgKHR5cGUgJiBJQ01QVjZfSU5GT01TR19NQVNLKQorCQlyZXR1cm4gMTsKKworCS8qIERvIG5vdCBsaW1pdCBwbXR1IGRpc2NvdmVyeSwgaXQgd291bGQgYnJlYWsgaXQuICovCisJaWYgKHR5cGUgPT0gSUNNUFY2X1BLVF9UT09CSUcpCisJCXJldHVybiAxOworCisJLyogCisJICogTG9vayB1cCB0aGUgb3V0cHV0IHJvdXRlLgorCSAqIFhYWDogcGVyaGFwcyB0aGUgZXhwaXJlIGZvciByb3V0aW5nIGVudHJpZXMgY2xvbmVkIGJ5CisJICogdGhpcyBsb29rdXAgc2hvdWxkIGJlIG1vcmUgYWdncmVzc2l2ZSAobm90IGxvbmdlciB0aGFuIHRpbWVvdXQpLgorCSAqLworCWRzdCA9IGlwNl9yb3V0ZV9vdXRwdXQoc2ssIGZsKTsKKwlpZiAoZHN0LT5lcnJvcikgeworCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVE5PUk9VVEVTKTsKKwl9IGVsc2UgaWYgKGRzdC0+ZGV2ICYmIChkc3QtPmRldi0+ZmxhZ3MmSUZGX0xPT1BCQUNLKSkgeworCQlyZXMgPSAxOworCX0gZWxzZSB7CisJCXN0cnVjdCBydDZfaW5mbyAqcnQgPSAoc3RydWN0IHJ0Nl9pbmZvICopZHN0OworCQlpbnQgdG1vID0gc3lzY3RsX2ljbXB2Nl90aW1lOworCisJCS8qIEdpdmUgbW9yZSBiYW5kd2lkdGggdG8gd2lkZXIgcHJlZml4ZXMuICovCisJCWlmIChydC0+cnQ2aV9kc3QucGxlbiA8IDEyOCkKKwkJCXRtbyA+Pj0gKCgxMjggLSBydC0+cnQ2aV9kc3QucGxlbik+PjUpOworCisJCXJlcyA9IHhybGltX2FsbG93KGRzdCwgdG1vKTsKKwl9CisJZHN0X3JlbGVhc2UoZHN0KTsKKwlyZXR1cm4gcmVzOworfQorCisvKgorICoJYW4gaW5saW5lIGhlbHBlciBmb3IgdGhlICJzaW1wbGUiIGlmIHN0YXRlbWVudCBiZWxvdworICoJY2hlY2tzIGlmIHBhcmFtZXRlciBwcm9ibGVtIHJlcG9ydCBpcyBjYXVzZWQgYnkgYW4KKyAqCXVucmVjb2duaXplZCBJUHY2IG9wdGlvbiB0aGF0IGhhcyB0aGUgT3B0aW9uIFR5cGUgCisgKgloaWdoZXN0LW9yZGVyIHR3byBiaXRzIHNldCB0byAxMAorICovCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBvcHRfdW5yZWMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgX191MzIgb2Zmc2V0KQoreworCXU4IF9vcHR2YWwsICpvcDsKKworCW9mZnNldCArPSBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YTsKKwlvcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgc2l6ZW9mKF9vcHR2YWwpLCAmX29wdHZhbCk7CisJaWYgKG9wID09IE5VTEwpCisJCXJldHVybiAxOworCXJldHVybiAoKm9wICYgMHhDMCkgPT0gMHg4MDsKK30KKworc3RhdGljIGludCBpY21wdjZfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBmbG93aSAqZmwsIHN0cnVjdCBpY21wNmhkciAqdGhkciwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpY21wNmhkciAqaWNtcDZoOworCWludCBlcnIgPSAwOworCisJaWYgKChza2IgPSBza2JfcGVlaygmc2stPnNrX3dyaXRlX3F1ZXVlKSkgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlpY21wNmggPSAoc3RydWN0IGljbXA2aGRyKikgc2tiLT5oLnJhdzsKKwltZW1jcHkoaWNtcDZoLCB0aGRyLCBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSk7CisJaWNtcDZoLT5pY21wNl9ja3N1bSA9IDA7CisKKwlpZiAoc2tiX3F1ZXVlX2xlbigmc2stPnNrX3dyaXRlX3F1ZXVlKSA9PSAxKSB7CisJCXNrYi0+Y3N1bSA9IGNzdW1fcGFydGlhbCgoY2hhciAqKWljbXA2aCwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBpY21wNmhkciksIHNrYi0+Y3N1bSk7CisJCWljbXA2aC0+aWNtcDZfY2tzdW0gPSBjc3VtX2lwdjZfbWFnaWMoJmZsLT5mbDZfc3JjLAorCQkJCQkJICAgICAgJmZsLT5mbDZfZHN0LAorCQkJCQkJICAgICAgbGVuLCBmbC0+cHJvdG8sCisJCQkJCQkgICAgICBza2ItPmNzdW0pOworCX0gZWxzZSB7CisJCXUzMiB0bXBfY3N1bSA9IDA7CisKKwkJc2tiX3F1ZXVlX3dhbGsoJnNrLT5za193cml0ZV9xdWV1ZSwgc2tiKSB7CisJCQl0bXBfY3N1bSA9IGNzdW1fYWRkKHRtcF9jc3VtLCBza2ItPmNzdW0pOworCQl9CisKKwkJdG1wX2NzdW0gPSBjc3VtX3BhcnRpYWwoKGNoYXIgKilpY21wNmgsCisJCQkJCXNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpLCB0bXBfY3N1bSk7CisJCXRtcF9jc3VtID0gY3N1bV9pcHY2X21hZ2ljKCZmbC0+Zmw2X3NyYywKKwkJCQkJICAgJmZsLT5mbDZfZHN0LAorCQkJCQkgICBsZW4sIGZsLT5wcm90bywgdG1wX2NzdW0pOworCQlpY21wNmgtPmljbXA2X2Nrc3VtID0gdG1wX2NzdW07CisJfQorCWlmIChpY21wNmgtPmljbXA2X2Nrc3VtID09IDApCisJCWljbXA2aC0+aWNtcDZfY2tzdW0gPSAtMTsKKwlpcDZfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzayk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IGljbXB2Nl9tc2cgeworCXN0cnVjdCBza19idWZmCSpza2I7CisJaW50CQlvZmZzZXQ7Cit9OworCitzdGF0aWMgaW50IGljbXB2Nl9nZXRmcmFnKHZvaWQgKmZyb20sIGNoYXIgKnRvLCBpbnQgb2Zmc2V0LCBpbnQgbGVuLCBpbnQgb2RkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpY21wdjZfbXNnICptc2cgPSAoc3RydWN0IGljbXB2Nl9tc2cgKikgZnJvbTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqb3JnX3NrYiA9IG1zZy0+c2tiOworCV9fdTMyIGNzdW0gPSAwOworCisJY3N1bSA9IHNrYl9jb3B5X2FuZF9jc3VtX2JpdHMob3JnX3NrYiwgbXNnLT5vZmZzZXQgKyBvZmZzZXQsCisJCQkJICAgICAgdG8sIGxlbiwgY3N1bSk7CisJc2tiLT5jc3VtID0gY3N1bV9ibG9ja19hZGQoc2tiLT5jc3VtLCBjc3VtLCBvZGQpOworCXJldHVybiAwOworfQorCisvKgorICoJU2VuZCBhbiBJQ01QIG1lc3NhZ2UgaW4gcmVzcG9uc2UgdG8gYSBwYWNrZXQgaW4gZXJyb3IKKyAqLwordm9pZCBpY21wdjZfc2VuZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgdHlwZSwgaW50IGNvZGUsIF9fdTMyIGluZm8sIAorCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgaXB2NmhkciAqaGRyID0gc2tiLT5uaC5pcHY2aDsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBpY21wdjZfc29ja2V0LT5zazsKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CisJc3RydWN0IGluNl9hZGRyICpzYWRkciA9IE5VTEw7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0OworCXN0cnVjdCBpY21wNmhkciB0bXBfaGRyOworCXN0cnVjdCBmbG93aSBmbDsKKwlzdHJ1Y3QgaWNtcHY2X21zZyBtc2c7CisJaW50IGlpZiA9IDA7CisJaW50IGFkZHJfdHlwZSA9IDA7CisJaW50IGxlbjsKKwlpbnQgaGxpbWl0OworCWludCBlcnIgPSAwOworCisJaWYgKCh1OCopaGRyIDwgc2tiLT5oZWFkIHx8ICh1OCopKGhkcisxKSA+IHNrYi0+dGFpbCkKKwkJcmV0dXJuOworCisJLyoKKwkgKglNYWtlIHN1cmUgd2UgcmVzcGVjdCB0aGUgcnVsZXMgCisJICoJaS5lLiBSRkMgMTg4NSAyLjQoZSkKKwkgKglSdWxlIChlLjEpIGlzIGVuZm9yY2VkIGJ5IG5vdCB1c2luZyBpY21wdjZfc2VuZAorCSAqCWluIGFueSBjb2RlIHRoYXQgcHJvY2Vzc2VzIGljbXAgZXJyb3JzLgorCSAqLworCWFkZHJfdHlwZSA9IGlwdjZfYWRkcl90eXBlKCZoZHItPmRhZGRyKTsKKworCWlmIChpcHY2X2Noa19hZGRyKCZoZHItPmRhZGRyLCBza2ItPmRldiwgMCkpCisJCXNhZGRyID0gJmhkci0+ZGFkZHI7CisKKwkvKgorCSAqCURlc3QgYWRkciBjaGVjaworCSAqLworCisJaWYgKChhZGRyX3R5cGUgJiBJUFY2X0FERFJfTVVMVElDQVNUIHx8IHNrYi0+cGt0X3R5cGUgIT0gUEFDS0VUX0hPU1QpKSB7CisJCWlmICh0eXBlICE9IElDTVBWNl9QS1RfVE9PQklHICYmCisJCSAgICAhKHR5cGUgPT0gSUNNUFY2X1BBUkFNUFJPQiAmJiAKKwkJICAgICAgY29kZSA9PSBJQ01QVjZfVU5LX09QVElPTiAmJiAKKwkJICAgICAgKG9wdF91bnJlYyhza2IsIGluZm8pKSkpCisJCQlyZXR1cm47CisKKwkJc2FkZHIgPSBOVUxMOworCX0KKworCWFkZHJfdHlwZSA9IGlwdjZfYWRkcl90eXBlKCZoZHItPnNhZGRyKTsKKworCS8qCisJICoJU291cmNlIGFkZHIgY2hlY2sKKwkgKi8KKworCWlmIChhZGRyX3R5cGUgJiBJUFY2X0FERFJfTElOS0xPQ0FMKQorCQlpaWYgPSBza2ItPmRldi0+aWZpbmRleDsKKworCS8qCisJICoJTXVzdCBub3Qgc2VuZCBpZiB3ZSBrbm93IHRoYXQgc291cmNlIGlzIEFueWNhc3QgYWxzby4KKwkgKglmb3Igbm93IHdlIGRvbid0IGtub3cgdGhhdC4KKwkgKi8KKwlpZiAoKGFkZHJfdHlwZSA9PSBJUFY2X0FERFJfQU5ZKSB8fCAoYWRkcl90eXBlICYgSVBWNl9BRERSX01VTFRJQ0FTVCkpIHsKKwkJTElNSVRfTkVUREVCVUcoCisJCQlwcmludGsoS0VSTl9ERUJVRyAiaWNtcHY2X3NlbmQ6IGFkZHJfYW55L21jYXN0IHNvdXJjZVxuIikpOworCQlyZXR1cm47CisJfQorCisJLyogCisJICoJTmV2ZXIgYW5zd2VyIHRvIGEgSUNNUCBwYWNrZXQuCisJICovCisJaWYgKGlzX2luZWxpZ2libGUoc2tiKSkgeworCQlMSU1JVF9ORVRERUJVRygKKwkJCXByaW50ayhLRVJOX0RFQlVHICJpY21wdjZfc2VuZDogbm8gcmVwbHkgdG8gaWNtcCBlcnJvclxuIikpOyAKKwkJcmV0dXJuOworCX0KKworCW1lbXNldCgmZmwsIDAsIHNpemVvZihmbCkpOworCWZsLnByb3RvID0gSVBQUk9UT19JQ01QVjY7CisJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsICZoZHItPnNhZGRyKTsKKwlpZiAoc2FkZHIpCisJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfc3JjLCBzYWRkcik7CisJZmwub2lmID0gaWlmOworCWZsLmZsX2ljbXBfdHlwZSA9IHR5cGU7CisJZmwuZmxfaWNtcF9jb2RlID0gY29kZTsKKworCWlmIChpY21wdjZfeG1pdF9sb2NrKCkpCisJCXJldHVybjsKKworCWlmICghaWNtcHY2X3hybGltX2FsbG93KHNrLCB0eXBlLCAmZmwpKQorCQlnb3RvIG91dDsKKworCXRtcF9oZHIuaWNtcDZfdHlwZSA9IHR5cGU7CisJdG1wX2hkci5pY21wNl9jb2RlID0gY29kZTsKKwl0bXBfaGRyLmljbXA2X2Nrc3VtID0gMDsKKwl0bXBfaGRyLmljbXA2X3BvaW50ZXIgPSBodG9ubChpbmZvKTsKKworCWlmICghZmwub2lmICYmIGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJmZsLmZsNl9kc3QpKQorCQlmbC5vaWYgPSBucC0+bWNhc3Rfb2lmOworCisJZXJyID0gaXA2X2RzdF9sb29rdXAoc2ssICZkc3QsICZmbCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJaWYgKChlcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIHNrLCAwKSkgPCAwKQorCQlnb3RvIG91dF9kc3RfcmVsZWFzZTsKKworCWlmIChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZmbC5mbDZfZHN0KSkKKwkJaGxpbWl0ID0gbnAtPm1jYXN0X2hvcHM7CisJZWxzZQorCQlobGltaXQgPSBucC0+aG9wX2xpbWl0OworCWlmIChobGltaXQgPCAwKQorCQlobGltaXQgPSBkc3RfbWV0cmljKGRzdCwgUlRBWF9IT1BMSU1JVCk7CisJaWYgKGhsaW1pdCA8IDApCisJCWhsaW1pdCA9IGlwdjZfZ2V0X2hvcGxpbWl0KGRzdC0+ZGV2KTsKKworCW1zZy5za2IgPSBza2I7CisJbXNnLm9mZnNldCA9IHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhOworCisJbGVuID0gc2tiLT5sZW4gLSBtc2cub2Zmc2V0OworCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLCBJUFY2X01JTl9NVFUgLSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpIC1zaXplb2Yoc3RydWN0IGljbXA2aGRyKSk7CisJaWYgKGxlbiA8IDApIHsKKwkJTElNSVRfTkVUREVCVUcoCisJCQlwcmludGsoS0VSTl9ERUJVRyAiaWNtcDogbGVuIHByb2JsZW1cbiIpKTsKKwkJZ290byBvdXRfZHN0X3JlbGVhc2U7CisJfQorCisJaWRldiA9IGluNl9kZXZfZ2V0KHNrYi0+ZGV2KTsKKworCWVyciA9IGlwNl9hcHBlbmRfZGF0YShzaywgaWNtcHY2X2dldGZyYWcsICZtc2csCisJCQkgICAgICBsZW4gKyBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSwKKwkJCSAgICAgIHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpLAorCQkJICAgICAgaGxpbWl0LCBOVUxMLCAmZmwsIChzdHJ1Y3QgcnQ2X2luZm8qKWRzdCwKKwkJCSAgICAgIE1TR19ET05UV0FJVCk7CisJaWYgKGVycikgeworCQlpcDZfZmx1c2hfcGVuZGluZ19mcmFtZXMoc2spOworCQlnb3RvIG91dF9wdXQ7CisJfQorCWVyciA9IGljbXB2Nl9wdXNoX3BlbmRpbmdfZnJhbWVzKHNrLCAmZmwsICZ0bXBfaGRyLCBsZW4gKyBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSk7CisKKwlpZiAodHlwZSA+PSBJQ01QVjZfREVTVF9VTlJFQUNIICYmIHR5cGUgPD0gSUNNUFY2X1BBUkFNUFJPQikKKwkJSUNNUDZfSU5DX1NUQVRTX09GRlNFVF9CSChpZGV2LCBJQ01QNl9NSUJfT1VUREVTVFVOUkVBQ0hTLCB0eXBlIC0gSUNNUFY2X0RFU1RfVU5SRUFDSCk7CisJSUNNUDZfSU5DX1NUQVRTX0JIKGlkZXYsIElDTVA2X01JQl9PVVRNU0dTKTsKKworb3V0X3B1dDoKKwlpZiAobGlrZWx5KGlkZXYgIT0gTlVMTCkpCisJCWluNl9kZXZfcHV0KGlkZXYpOworb3V0X2RzdF9yZWxlYXNlOgorCWRzdF9yZWxlYXNlKGRzdCk7CitvdXQ6CisJaWNtcHY2X3htaXRfdW5sb2NrKCk7Cit9CisKK3N0YXRpYyB2b2lkIGljbXB2Nl9lY2hvX3JlcGx5KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNvY2sgKnNrID0gaWNtcHY2X3NvY2tldC0+c2s7CisJc3RydWN0IGluZXQ2X2RldiAqaWRldjsKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CisJc3RydWN0IGluNl9hZGRyICpzYWRkciA9IE5VTEw7CisJc3RydWN0IGljbXA2aGRyICppY21waCA9IChzdHJ1Y3QgaWNtcDZoZHIgKikgc2tiLT5oLnJhdzsKKwlzdHJ1Y3QgaWNtcDZoZHIgdG1wX2hkcjsKKwlzdHJ1Y3QgZmxvd2kgZmw7CisJc3RydWN0IGljbXB2Nl9tc2cgbXNnOworCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKKwlpbnQgZXJyID0gMDsKKwlpbnQgaGxpbWl0OworCisJc2FkZHIgPSAmc2tiLT5uaC5pcHY2aC0+ZGFkZHI7CisKKwlpZiAoIWlwdjZfdW5pY2FzdF9kZXN0aW5hdGlvbihza2IpKQorCQlzYWRkciA9IE5VTEw7CisKKwltZW1jcHkoJnRtcF9oZHIsIGljbXBoLCBzaXplb2YodG1wX2hkcikpOworCXRtcF9oZHIuaWNtcDZfdHlwZSA9IElDTVBWNl9FQ0hPX1JFUExZOworCisJbWVtc2V0KCZmbCwgMCwgc2l6ZW9mKGZsKSk7CisJZmwucHJvdG8gPSBJUFBST1RPX0lDTVBWNjsKKwlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgJnNrYi0+bmguaXB2NmgtPnNhZGRyKTsKKwlpZiAoc2FkZHIpCisJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfc3JjLCBzYWRkcik7CisJZmwub2lmID0gc2tiLT5kZXYtPmlmaW5kZXg7CisJZmwuZmxfaWNtcF90eXBlID0gSUNNUFY2X0VDSE9fUkVQTFk7CisKKwlpZiAoaWNtcHY2X3htaXRfbG9jaygpKQorCQlyZXR1cm47CisKKwlpZiAoIWZsLm9pZiAmJiBpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZmbC5mbDZfZHN0KSkKKwkJZmwub2lmID0gbnAtPm1jYXN0X29pZjsKKworCWVyciA9IGlwNl9kc3RfbG9va3VwKHNrLCAmZHN0LCAmZmwpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWlmICgoZXJyID0geGZybV9sb29rdXAoJmRzdCwgJmZsLCBzaywgMCkpIDwgMCkKKwkJZ290byBvdXRfZHN0X3JlbGVhc2U7CisKKwlpZiAoaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmZmwuZmw2X2RzdCkpCisJCWhsaW1pdCA9IG5wLT5tY2FzdF9ob3BzOworCWVsc2UKKwkJaGxpbWl0ID0gbnAtPmhvcF9saW1pdDsKKwlpZiAoaGxpbWl0IDwgMCkKKwkJaGxpbWl0ID0gZHN0X21ldHJpYyhkc3QsIFJUQVhfSE9QTElNSVQpOworCWlmIChobGltaXQgPCAwKQorCQlobGltaXQgPSBpcHY2X2dldF9ob3BsaW1pdChkc3QtPmRldik7CisKKwlpZGV2ID0gaW42X2Rldl9nZXQoc2tiLT5kZXYpOworCisJbXNnLnNrYiA9IHNrYjsKKwltc2cub2Zmc2V0ID0gMDsKKworCWVyciA9IGlwNl9hcHBlbmRfZGF0YShzaywgaWNtcHY2X2dldGZyYWcsICZtc2csIHNrYi0+bGVuICsgc2l6ZW9mKHN0cnVjdCBpY21wNmhkciksCisJCQkJc2l6ZW9mKHN0cnVjdCBpY21wNmhkciksIGhsaW1pdCwgTlVMTCwgJmZsLAorCQkJCShzdHJ1Y3QgcnQ2X2luZm8qKWRzdCwgTVNHX0RPTlRXQUlUKTsKKworCWlmIChlcnIpIHsKKwkJaXA2X2ZsdXNoX3BlbmRpbmdfZnJhbWVzKHNrKTsKKwkJZ290byBvdXRfcHV0OworCX0KKwllcnIgPSBpY21wdjZfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzaywgJmZsLCAmdG1wX2hkciwgc2tiLT5sZW4gKyBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSk7CisKKyAgICAgICAgSUNNUDZfSU5DX1NUQVRTX0JIKGlkZXYsIElDTVA2X01JQl9PVVRFQ0hPUkVQTElFUyk7CisgICAgICAgIElDTVA2X0lOQ19TVEFUU19CSChpZGV2LCBJQ01QNl9NSUJfT1VUTVNHUyk7CisKK291dF9wdXQ6IAorCWlmIChsaWtlbHkoaWRldiAhPSBOVUxMKSkKKwkJaW42X2Rldl9wdXQoaWRldik7CitvdXRfZHN0X3JlbGVhc2U6CisJZHN0X3JlbGVhc2UoZHN0KTsKK291dDogCisJaWNtcHY2X3htaXRfdW5sb2NrKCk7Cit9CisKK3N0YXRpYyB2b2lkIGljbXB2Nl9ub3RpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHR5cGUsIGludCBjb2RlLCB1MzIgaW5mbykKK3sKKwlzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCAqZGFkZHI7CisJc3RydWN0IGluZXQ2X3Byb3RvY29sICppcHByb3Q7CisJc3RydWN0IHNvY2sgKnNrOworCWludCBpbm5lcl9vZmZzZXQ7CisJaW50IGhhc2g7CisJdTggbmV4dGhkcjsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpKQorCQlyZXR1cm47CisKKwluZXh0aGRyID0gKChzdHJ1Y3QgaXB2NmhkciAqKXNrYi0+ZGF0YSktPm5leHRoZHI7CisJaWYgKGlwdjZfZXh0X2hkcihuZXh0aGRyKSkgeworCQkvKiBub3cgc2tpcCBvdmVyIGV4dGVuc2lvbiBoZWFkZXJzICovCisJCWlubmVyX29mZnNldCA9IGlwdjZfc2tpcF9leHRoZHIoc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpLCAmbmV4dGhkciwgc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKKwkJaWYgKGlubmVyX29mZnNldDwwKQorCQkJcmV0dXJuOworCX0gZWxzZSB7CisJCWlubmVyX29mZnNldCA9IHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisJfQorCisJLyogQ2hlY2tpbiBoZWFkZXIgaW5jbHVkaW5nIDggYnl0ZXMgb2YgaW5uZXIgcHJvdG9jb2wgaGVhZGVyLiAqLworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIGlubmVyX29mZnNldCs4KSkKKwkJcmV0dXJuOworCisJc2FkZHIgPSAmc2tiLT5uaC5pcHY2aC0+c2FkZHI7CisJZGFkZHIgPSAmc2tiLT5uaC5pcHY2aC0+ZGFkZHI7CisKKwkvKiBCVUdHR19GVVRVUkU6IHdlIHNob3VsZCB0cnkgdG8gcGFyc2UgZXh0aGRycyBpbiB0aGlzIHBhY2tldC4KKwkgICBXaXRob3V0IHRoaXMgd2Ugd2lsbCBub3QgYWJsZSBmLmUuIHRvIG1ha2Ugc291cmNlIHJvdXRlZAorCSAgIHBtdHUgZGlzY292ZXJ5LgorCSAgIENvcnJlc3BvbmRpbmcgYXJndW1lbnQgKG9wdCkgdG8gbm90aWZpZXJzIGlzIGFscmVhZHkgYWRkZWQuCisJICAgLS1BTksgKDk4MDcyNikKKwkgKi8KKworCWhhc2ggPSBuZXh0aGRyICYgKE1BWF9JTkVUX1BST1RPUyAtIDEpOworCisJcmN1X3JlYWRfbG9jaygpOworCWlwcHJvdCA9IHJjdV9kZXJlZmVyZW5jZShpbmV0Nl9wcm90b3NbaGFzaF0pOworCWlmIChpcHByb3QgJiYgaXBwcm90LT5lcnJfaGFuZGxlcikKKwkJaXBwcm90LT5lcnJfaGFuZGxlcihza2IsIE5VTEwsIHR5cGUsIGNvZGUsIGlubmVyX29mZnNldCwgaW5mbyk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZWFkX2xvY2soJnJhd192Nl9sb2NrKTsKKwlpZiAoKHNrID0gc2tfaGVhZCgmcmF3X3Y2X2h0YWJsZVtoYXNoXSkpICE9IE5VTEwpIHsKKwkJd2hpbGUoKHNrID0gX19yYXdfdjZfbG9va3VwKHNrLCBuZXh0aGRyLCBkYWRkciwgc2FkZHIpKSkgeworCQkJcmF3djZfZXJyKHNrLCBza2IsIE5VTEwsIHR5cGUsIGNvZGUsIGlubmVyX29mZnNldCwgaW5mbyk7CisJCQlzayA9IHNrX25leHQoc2spOworCQl9CisJfQorCXJlYWRfdW5sb2NrKCZyYXdfdjZfbG9jayk7Cit9CisgIAorLyoKKyAqCUhhbmRsZSBpY21wIG1lc3NhZ2VzCisgKi8KKworc3RhdGljIGludCBpY21wdjZfcmN2KHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgaW50ICpuaG9mZnApCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpwc2tiOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gX19pbjZfZGV2X2dldChkZXYpOworCXN0cnVjdCBpbjZfYWRkciAqc2FkZHIsICpkYWRkcjsKKwlzdHJ1Y3QgaXB2NmhkciAqb3JpZ19oZHI7CisJc3RydWN0IGljbXA2aGRyICpoZHI7CisJaW50IHR5cGU7CisKKwlJQ01QNl9JTkNfU1RBVFNfQkgoaWRldiwgSUNNUDZfTUlCX0lOTVNHUyk7CisKKwlzYWRkciA9ICZza2ItPm5oLmlwdjZoLT5zYWRkcjsKKwlkYWRkciA9ICZza2ItPm5oLmlwdjZoLT5kYWRkcjsKKworCS8qIFBlcmZvcm0gY2hlY2tzdW0uICovCisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSB7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCWlmIChjc3VtX2lwdjZfbWFnaWMoc2FkZHIsIGRhZGRyLCBza2ItPmxlbiwgSVBQUk9UT19JQ01QVjYsCisJCQkJICAgIHNrYi0+Y3N1bSkpIHsKKwkJCUxJTUlUX05FVERFQlVHKAorCQkJCXByaW50ayhLRVJOX0RFQlVHICJJQ01QdjYgaHcgY2hlY2tzdW0gZmFpbGVkXG4iKSk7CisJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCX0KKwl9CisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX05PTkUpIHsKKwkJaWYgKGNzdW1faXB2Nl9tYWdpYyhzYWRkciwgZGFkZHIsIHNrYi0+bGVuLCBJUFBST1RPX0lDTVBWNiwKKwkJCQkgICAgc2tiX2NoZWNrc3VtKHNrYiwgMCwgc2tiLT5sZW4sIDApKSkgeworCQkJTElNSVRfTkVUREVCVUcoCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIklDTVB2NiBjaGVja3N1bSBmYWlsZWQgWyUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eCA+ICUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eF1cbiIsCisJCQkJICAgICAgIE5JUDYoKnNhZGRyKSwgTklQNigqZGFkZHIpKSk7CisJCQlnb3RvIGRpc2NhcmRfaXQ7CisJCX0KKwl9CisKKwlpZiAoIXBza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpKSkKKwkJZ290byBkaXNjYXJkX2l0OworCisJaGRyID0gKHN0cnVjdCBpY21wNmhkciAqKSBza2ItPmgucmF3OworCisJdHlwZSA9IGhkci0+aWNtcDZfdHlwZTsKKworCWlmICh0eXBlID49IElDTVBWNl9ERVNUX1VOUkVBQ0ggJiYgdHlwZSA8PSBJQ01QVjZfUEFSQU1QUk9CKQorCQlJQ01QNl9JTkNfU1RBVFNfT0ZGU0VUX0JIKGlkZXYsIElDTVA2X01JQl9JTkRFU1RVTlJFQUNIUywgdHlwZSAtIElDTVBWNl9ERVNUX1VOUkVBQ0gpOworCWVsc2UgaWYgKHR5cGUgPj0gSUNNUFY2X0VDSE9fUkVRVUVTVCAmJiB0eXBlIDw9IE5ESVNDX1JFRElSRUNUKQorCQlJQ01QNl9JTkNfU1RBVFNfT0ZGU0VUX0JIKGlkZXYsIElDTVA2X01JQl9JTkVDSE9TLCB0eXBlIC0gSUNNUFY2X0VDSE9fUkVRVUVTVCk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElDTVBWNl9FQ0hPX1JFUVVFU1Q6CisJCWljbXB2Nl9lY2hvX3JlcGx5KHNrYik7CisJCWJyZWFrOworCisJY2FzZSBJQ01QVjZfRUNIT19SRVBMWToKKwkJLyogd2UgY291bGRuJ3QgY2FyZSBsZXNzICovCisJCWJyZWFrOworCisJY2FzZSBJQ01QVjZfUEtUX1RPT0JJRzoKKwkJLyogQlVHR0dfRlVUVVJFOiBpZiBwYWNrZXQgY29udGFpbnMgcnRoZHIsIHdlIGNhbm5vdCB1cGRhdGUKKwkJICAgc3RhbmRhcmQgZGVzdGluYXRpb24gY2FjaGUuIFNlZW1zLCBvbmx5ICJhZHZhbmNlZCIKKwkJICAgZGVzdGluYXRpb24gY2FjaGUgd2lsbCBhbGxvdyB0byBzb2x2ZSB0aGlzIHByb2JsZW0KKwkJICAgLS1BTksgKDk4MDcyNikKKwkJICovCisJCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpKQorCQkJZ290byBkaXNjYXJkX2l0OworCQloZHIgPSAoc3RydWN0IGljbXA2aGRyICopIHNrYi0+aC5yYXc7CisJCW9yaWdfaGRyID0gKHN0cnVjdCBpcHY2aGRyICopIChoZHIgKyAxKTsKKwkJcnQ2X3BtdHVfZGlzY292ZXJ5KCZvcmlnX2hkci0+ZGFkZHIsICZvcmlnX2hkci0+c2FkZHIsIGRldiwKKwkJCQkgICBudG9obChoZHItPmljbXA2X210dSkpOworCisJCS8qCisJCSAqCURyb3AgdGhyb3VnaCB0byBub3RpZnkKKwkJICovCisKKwljYXNlIElDTVBWNl9ERVNUX1VOUkVBQ0g6CisJY2FzZSBJQ01QVjZfVElNRV9FWENFRUQ6CisJY2FzZSBJQ01QVjZfUEFSQU1QUk9COgorCQlpY21wdjZfbm90aWZ5KHNrYiwgdHlwZSwgaGRyLT5pY21wNl9jb2RlLCBoZHItPmljbXA2X210dSk7CisJCWJyZWFrOworCisJY2FzZSBORElTQ19ST1VURVJfU09MSUNJVEFUSU9OOgorCWNhc2UgTkRJU0NfUk9VVEVSX0FEVkVSVElTRU1FTlQ6CisJY2FzZSBORElTQ19ORUlHSEJPVVJfU09MSUNJVEFUSU9OOgorCWNhc2UgTkRJU0NfTkVJR0hCT1VSX0FEVkVSVElTRU1FTlQ6CisJY2FzZSBORElTQ19SRURJUkVDVDoKKwkJbmRpc2NfcmN2KHNrYik7CisJCWJyZWFrOworCisJY2FzZSBJQ01QVjZfTUdNX1FVRVJZOgorCQlpZ21wNl9ldmVudF9xdWVyeShza2IpOworCQlicmVhazsKKworCWNhc2UgSUNNUFY2X01HTV9SRVBPUlQ6CisJCWlnbXA2X2V2ZW50X3JlcG9ydChza2IpOworCQlicmVhazsKKworCWNhc2UgSUNNUFY2X01HTV9SRURVQ1RJT046CisJY2FzZSBJQ01QVjZfTklfUVVFUlk6CisJY2FzZSBJQ01QVjZfTklfUkVQTFk6CisJY2FzZSBJQ01QVjZfTUxEMl9SRVBPUlQ6CisJY2FzZSBJQ01QVjZfREhBQURfUkVRVUVTVDoKKwljYXNlIElDTVBWNl9ESEFBRF9SRVBMWToKKwljYXNlIElDTVBWNl9NT0JJTEVfUFJFRklYX1NPTDoKKwljYXNlIElDTVBWNl9NT0JJTEVfUFJFRklYX0FEVjoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlMSU1JVF9ORVRERUJVRygKKwkJCXByaW50ayhLRVJOX0RFQlVHICJpY21wdjY6IG1zZyBvZiB1bmtub3duIHR5cGVcbiIpKTsKKworCQkvKiBpbmZvcm1hdGlvbmFsICovCisJCWlmICh0eXBlICYgSUNNUFY2X0lORk9NU0dfTUFTSykKKwkJCWJyZWFrOworCisJCS8qIAorCQkgKiBlcnJvciBvZiB1bmtub3duIHR5cGUuIAorCQkgKiBtdXN0IHBhc3MgdG8gdXBwZXIgbGV2ZWwgCisJCSAqLworCisJCWljbXB2Nl9ub3RpZnkoc2tiLCB0eXBlLCBoZHItPmljbXA2X2NvZGUsIGhkci0+aWNtcDZfbXR1KTsKKwl9OworCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworCitkaXNjYXJkX2l0OgorCUlDTVA2X0lOQ19TVEFUU19CSChpZGV2LCBJQ01QNl9NSUJfSU5FUlJPUlMpOworCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCitpbnQgX19pbml0IGljbXB2Nl9pbml0KHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5ICpvcHMpCit7CisJc3RydWN0IHNvY2sgKnNrOworCWludCBlcnIsIGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7CisJCWlmICghY3B1X3Bvc3NpYmxlKGkpKQorCQkJY29udGludWU7CisKKwkJZXJyID0gc29ja19jcmVhdGVfa2VybihQRl9JTkVUNiwgU09DS19SQVcsIElQUFJPVE9fSUNNUFY2LAorCQkJCSAgICAgICAmcGVyX2NwdShfX2ljbXB2Nl9zb2NrZXQsIGkpKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgSUNNUDYgY29udHJvbCBzb2NrZXQgIgorCQkJICAgICAgICIoZXJyICVkKS5cbiIsCisJCQkgICAgICAgZXJyKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCXNrID0gcGVyX2NwdShfX2ljbXB2Nl9zb2NrZXQsIGkpLT5zazsKKwkJc2stPnNrX2FsbG9jYXRpb24gPSBHRlBfQVRPTUlDOworCisJCS8qIEVub3VnaCBzcGFjZSBmb3IgMiA2NEsgSUNNUCBwYWNrZXRzLCBpbmNsdWRpbmcKKwkJICogc2tfYnVmZiBzdHJ1Y3Qgb3ZlcmhlYWQuCisJCSAqLworCQlzay0+c2tfc25kYnVmID0KKwkJCSgyICogKCg2NCAqIDEwMjQpICsgc2l6ZW9mKHN0cnVjdCBza19idWZmKSkpOworCisJCXNrLT5za19wcm90LT51bmhhc2goc2spOworCX0KKworCisJaWYgKGluZXQ2X2FkZF9wcm90b2NvbCgmaWNtcHY2X3Byb3RvY29sLCBJUFBST1RPX0lDTVBWNikgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlZ2lzdGVyIElDTVA2IHByb3RvY29sXG4iKTsKKwkJZXJyID0gLUVBR0FJTjsKKwkJZ290byBmYWlsOworCX0KKworCXJldHVybiAwOworCisgZmFpbDoKKwlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisJCWlmICghY3B1X3Bvc3NpYmxlKGopKQorCQkJY29udGludWU7CisJCXNvY2tfcmVsZWFzZShwZXJfY3B1KF9faWNtcHY2X3NvY2tldCwgaikpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgaWNtcHY2X2NsZWFudXAodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKKwkJaWYgKCFjcHVfcG9zc2libGUoaSkpCisJCQljb250aW51ZTsKKwkJc29ja19yZWxlYXNlKHBlcl9jcHUoX19pY21wdjZfc29ja2V0LCBpKSk7CisJfQorCWluZXQ2X2RlbF9wcm90b2NvbCgmaWNtcHY2X3Byb3RvY29sLCBJUFBST1RPX0lDTVBWNik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWNtcDZfZXJyIHsKKwlpbnQgZXJyOworCWludCBmYXRhbDsKK30gdGFiX3VucmVhY2hbXSA9IHsKKwl7CS8qIE5PUk9VVEUgKi8KKwkJLmVycgk9IEVORVRVTlJFQUNILAorCQkuZmF0YWwJPSAwLAorCX0sCisJewkvKiBBRE1fUFJPSElCSVRFRCAqLworCQkuZXJyCT0gRUFDQ0VTLAorCQkuZmF0YWwJPSAxLAorCX0sCisJewkvKiBXYXMgTk9UX05FSUdIQk9VUiwgbm93IHJlc2VydmVkICovCisJCS5lcnIJPSBFSE9TVFVOUkVBQ0gsCisJCS5mYXRhbAk9IDAsCisJfSwKKwl7CS8qIEFERFJfVU5SRUFDSAkqLworCQkuZXJyCT0gRUhPU1RVTlJFQUNILAorCQkuZmF0YWwJPSAwLAorCX0sCisJewkvKiBQT1JUX1VOUkVBQ0gJKi8KKwkJLmVycgk9IEVDT05OUkVGVVNFRCwKKwkJLmZhdGFsCT0gMSwKKwl9LAorfTsKKworaW50IGljbXB2Nl9lcnJfY29udmVydChpbnQgdHlwZSwgaW50IGNvZGUsIGludCAqZXJyKQoreworCWludCBmYXRhbCA9IDA7CisKKwkqZXJyID0gRVBST1RPOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJQ01QVjZfREVTVF9VTlJFQUNIOgorCQlmYXRhbCA9IDE7CisJCWlmIChjb2RlIDw9IElDTVBWNl9QT1JUX1VOUkVBQ0gpIHsKKwkJCSplcnIgID0gdGFiX3VucmVhY2hbY29kZV0uZXJyOworCQkJZmF0YWwgPSB0YWJfdW5yZWFjaFtjb2RlXS5mYXRhbDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgSUNNUFY2X1BLVF9UT09CSUc6CisJCSplcnIgPSBFTVNHU0laRTsKKwkJYnJlYWs7CisJCQorCWNhc2UgSUNNUFY2X1BBUkFNUFJPQjoKKwkJKmVyciA9IEVQUk9UTzsKKwkJZmF0YWwgPSAxOworCQlicmVhazsKKworCWNhc2UgSUNNUFY2X1RJTUVfRVhDRUVEOgorCQkqZXJyID0gRUhPU1RVTlJFQUNIOworCQlicmVhazsKKwl9OworCisJcmV0dXJuIGZhdGFsOworfQorCisjaWZkZWYgQ09ORklHX1NZU0NUTAorY3RsX3RhYmxlIGlwdjZfaWNtcF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjZfSUNNUF9SQVRFTElNSVQsCisJCS5wcm9jbmFtZQk9ICJyYXRlbGltaXQiLAorCQkuZGF0YQkJPSAmc3lzY3RsX2ljbXB2Nl90aW1lLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9LAorfTsKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfZmliLmMgYi9uZXQvaXB2Ni9pcDZfZmliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA1NzQwYgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY2L2lwNl9maWIuYwpAQCAtMCwwICsxLDEyMjUgQEAKKy8qCisgKglMaW51eCBJTkVUNiBpbXBsZW1lbnRhdGlvbiAKKyAqCUZvcndhcmRpbmcgSW5mb3JtYXRpb24gRGF0YWJhc2UKKyAqCisgKglBdXRob3JzOgorICoJUGVkcm8gUm9xdWUJCTxyb3F1ZUBkaS5mYy51bC5wdD4JCisgKgorICoJJElkOiBpcDZfZmliLmMsdiAxLjI1IDIwMDEvMTAvMzEgMjE6NTU6NTUgZGF2ZW0gRXhwICQKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKy8qCisgKiAJQ2hhbmdlczoKKyAqIAlZdWppIFNFS0lZQSBAVVNBR0k6CVN1cHBvcnQgZGVmYXVsdCByb3V0ZSBvbiByb3V0ZXIgbm9kZTsKKyAqIAkJCQlyZW1vdmUgaXA2X251bGxfZW50cnkgZnJvbSB0aGUgdG9wIG9mCisgKiAJCQkJcm91dGluZyB0YWJsZS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2lmZGVmIAlDT05GSUdfUFJPQ19GUworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvbmRpc2MuaD4KKyNpbmNsdWRlIDxuZXQvYWRkcmNvbmYuaD4KKworI2luY2x1ZGUgPG5ldC9pcDZfZmliLmg+CisjaW5jbHVkZSA8bmV0L2lwNl9yb3V0ZS5oPgorCisjZGVmaW5lIFJUNl9ERUJVRyAyCisKKyNpZiBSVDZfREVCVUcgPj0gMworI2RlZmluZSBSVDZfVFJBQ0UoeC4uLikgcHJpbnRrKEtFUk5fREVCVUcgeCkKKyNlbHNlCisjZGVmaW5lIFJUNl9UUkFDRSh4Li4uKSBkbyB7IDsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCitzdHJ1Y3QgcnQ2X3N0YXRpc3RpY3MJcnQ2X3N0YXRzOworCitzdGF0aWMga21lbV9jYWNoZV90ICogZmliNl9ub2RlX2ttZW07CisKK2VudW0gZmliX3dhbGtfc3RhdGVfdAoreworI2lmZGVmIENPTkZJR19JUFY2X1NVQlRSRUVTCisJRldTX1MsCisjZW5kaWYKKwlGV1NfTCwKKwlGV1NfUiwKKwlGV1NfQywKKwlGV1NfVQorfTsKKworc3RydWN0IGZpYjZfY2xlYW5lcl90Cit7CisJc3RydWN0IGZpYjZfd2Fsa2VyX3QgdzsKKwlpbnQgKCpmdW5jKShzdHJ1Y3QgcnQ2X2luZm8gKiwgdm9pZCAqYXJnKTsKKwl2b2lkICphcmc7Cit9OworCitERUZJTkVfUldMT0NLKGZpYjZfd2Fsa2VyX2xvY2spOworCisKKyNpZmRlZiBDT05GSUdfSVBWNl9TVUJUUkVFUworI2RlZmluZSBGV1NfSU5JVCBGV1NfUworI2RlZmluZSBTVUJUUkVFKGZuKSAoKGZuKS0+c3VidHJlZSkKKyNlbHNlCisjZGVmaW5lIEZXU19JTklUIEZXU19MCisjZGVmaW5lIFNVQlRSRUUoZm4pIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBmaWI2X3BydW5lX2Nsb25lcyhzdHJ1Y3QgZmliNl9ub2RlICpmbiwgc3RydWN0IHJ0Nl9pbmZvICpydCk7CitzdGF0aWMgc3RydWN0IGZpYjZfbm9kZSAqIGZpYjZfcmVwYWlyX3RyZWUoc3RydWN0IGZpYjZfbm9kZSAqZm4pOworCisvKgorICoJQSByb3V0aW5nIHVwZGF0ZSBjYXVzZXMgYW4gaW5jcmVhc2Ugb2YgdGhlIHNlcmlhbCBudW1iZXIgb24gdGhlCisgKglhZmZlY3RlZCBzdWJ0cmVlLiBUaGlzIGFsbG93cyBmb3IgY2FjaGVkIHJvdXRlcyB0byBiZSBhc3luY2hyb25vdXNseQorICoJdGVzdGVkIHdoZW4gbW9kaWZpY2F0aW9ucyBhcmUgbWFkZSB0byB0aGUgZGVzdGluYXRpb24gY2FjaGUgYXMgYQorICoJcmVzdWx0IG9mIHJlZGlyZWN0cywgcGF0aCBNVFUgY2hhbmdlcywgZXRjLgorICovCisKK3N0YXRpYyBfX3UzMiBydF9zZXJudW07CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBpcDZfZmliX3RpbWVyID0gVElNRVJfSU5JVElBTElaRVIoZmliNl9ydW5fZ2MsIDAsIDApOworCitzdHJ1Y3QgZmliNl93YWxrZXJfdCBmaWI2X3dhbGtlcl9saXN0ID0geworCS5wcmV2CT0gJmZpYjZfd2Fsa2VyX2xpc3QsCisJLm5leHQJPSAmZmliNl93YWxrZXJfbGlzdCwgCit9OworCisjZGVmaW5lIEZPUl9XQUxLRVJTKHcpIGZvciAoKHcpPWZpYjZfd2Fsa2VyX2xpc3QubmV4dDsgKHcpICE9ICZmaWI2X3dhbGtlcl9saXN0OyAodyk9KHcpLT5uZXh0KQorCitzdGF0aWMgX19pbmxpbmVfXyB1MzIgZmliNl9uZXdfc2VybnVtKHZvaWQpCit7CisJdTMyIG4gPSArK3J0X3Nlcm51bTsKKwlpZiAoKF9fczMyKW4gPD0gMCkKKwkJcnRfc2VybnVtID0gbiA9IDE7CisJcmV0dXJuIG47Cit9CisKKy8qCisgKglBdXhpbGlhcnkgYWRkcmVzcyB0ZXN0IGZ1bmN0aW9ucyBmb3IgdGhlIHJhZGl4IHRyZWUuCisgKgorICoJVGhlc2UgYXNzdW1lIGEgMzJiaXQgcHJvY2Vzc29yIChhbHRob3VnaCBpdCB3aWxsIHdvcmsgb24gCisgKgk2NGJpdCBwcm9jZXNzb3JzKQorICovCisKKy8qCisgKgl0ZXN0IGJpdAorICovCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBhZGRyX2JpdF9zZXQodm9pZCAqdG9rZW4sIGludCBmbl9iaXQpCit7CisJX191MzIgKmFkZHIgPSB0b2tlbjsKKworCXJldHVybiBodG9ubCgxIDw8ICgofmZuX2JpdCkmMHgxRikpICYgYWRkcltmbl9iaXQ+PjVdOworfQorCisvKgorICoJZmluZCB0aGUgZmlyc3QgZGlmZmVyZW50IGJpdCBiZXR3ZWVuIHR3byBhZGRyZXNzZXMKKyAqCWxlbmd0aCBvZiBhZGRyZXNzIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMmJpdHMKKyAqLworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgYWRkcl9kaWZmKHZvaWQgKnRva2VuMSwgdm9pZCAqdG9rZW4yLCBpbnQgYWRkcmxlbikKK3sKKwlfX3UzMiAqYTEgPSB0b2tlbjE7CisJX191MzIgKmEyID0gdG9rZW4yOworCWludCBpOworCisJYWRkcmxlbiA+Pj0gMjsKKworCWZvciAoaSA9IDA7IGkgPCBhZGRybGVuOyBpKyspIHsKKwkJX191MzIgeGI7CisKKwkJeGIgPSBhMVtpXSBeIGEyW2ldOworCisJCWlmICh4YikgeworCQkJaW50IGogPSAzMTsKKworCQkJeGIgPSBudG9obCh4Yik7CisKKwkJCXdoaWxlICgoeGIgJiAoMSA8PCBqKSkgPT0gMCkKKwkJCQlqLS07CisKKwkJCXJldHVybiAoaSAqIDMyICsgMzEgLSBqKTsKKwkJfQorCX0KKworCS8qCisJICoJd2Ugc2hvdWxkICpuZXZlciogZ2V0IHRvIHRoaXMgcG9pbnQgc2luY2UgdGhhdCAKKwkgKgl3b3VsZCBtZWFuIHRoZSBhZGRycyBhcmUgZXF1YWwKKwkgKgorCSAqCUhvd2V2ZXIsIHdlIGRvIGdldCB0byBpdCA4KSBBbmQgZXhhY2x5LCB3aGVuCisJICoJYWRkcmVzc2VzIGFyZSBlcXVhbCA4KQorCSAqCisJICoJaXAgcm91dGUgYWRkIDExMTE6Oi8xMjggdmlhIC4uLgorCSAqCWlwIHJvdXRlIGFkZCAxMTExOjovNjQgdmlhIC4uLgorCSAqCWFuZCB3ZSBhcmUgaGVyZS4KKwkgKgorCSAqCUlkZWFsbHksIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHN0b3AgY29tcGFyaXNvbgorCSAqCWF0IHByZWZpeCBsZW5ndGguIEl0IGRvZXMgbm90LCBidXQgaXQgaXMgc3RpbGwgT0ssCisJICoJaWYgcmV0dXJuZWQgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHByZWZpeCBsZW5ndGguCisJICoJCQkJCS0tQU5LICg5ODA4MDMpCisJICovCisKKwlyZXR1cm4gYWRkcmxlbjw8NTsKK30KKworc3RhdGljIF9faW5saW5lX18gc3RydWN0IGZpYjZfbm9kZSAqIG5vZGVfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgZmliNl9ub2RlICpmbjsKKworCWlmICgoZm4gPSBrbWVtX2NhY2hlX2FsbG9jKGZpYjZfbm9kZV9rbWVtLCBTTEFCX0FUT01JQykpICE9IE5VTEwpCisJCW1lbXNldChmbiwgMCwgc2l6ZW9mKHN0cnVjdCBmaWI2X25vZGUpKTsKKworCXJldHVybiBmbjsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBub2RlX2ZyZWUoc3RydWN0IGZpYjZfbm9kZSAqIGZuKQoreworCWttZW1fY2FjaGVfZnJlZShmaWI2X25vZGVfa21lbSwgZm4pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHJ0Nl9yZWxlYXNlKHN0cnVjdCBydDZfaW5mbyAqcnQpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnJ0LT5ydDZpX3JlZikpCisJCWRzdF9mcmVlKCZydC0+dS5kc3QpOworfQorCisKKy8qCisgKglSb3V0aW5nIFRhYmxlCisgKgorICoJcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBub2RlIGZvciBhIHJvdXRpbmcgdHJlZSAiYWRkIiBvcGVyYXRpb24KKyAqCWJ5IGVpdGhlciBjcmVhdGluZyBhbmQgaW5zZXJ0aW5nIG9yIGJ5IHJldHVybmluZyBhbiBleGlzdGluZworICoJbm9kZS4KKyAqLworCitzdGF0aWMgc3RydWN0IGZpYjZfbm9kZSAqIGZpYjZfYWRkXzEoc3RydWN0IGZpYjZfbm9kZSAqcm9vdCwgdm9pZCAqYWRkciwKKwkJCQkgICAgIGludCBhZGRybGVuLCBpbnQgcGxlbiwKKwkJCQkgICAgIGludCBvZmZzZXQpCit7CisJc3RydWN0IGZpYjZfbm9kZSAqZm4sICppbiwgKmxuOworCXN0cnVjdCBmaWI2X25vZGUgKnBuID0gTlVMTDsKKwlzdHJ1Y3QgcnQ2a2V5ICprZXk7CisJaW50CWJpdDsKKyAgICAgICAJaW50CWRpciA9IDA7CisJX191MzIJc2VybnVtID0gZmliNl9uZXdfc2VybnVtKCk7CisKKwlSVDZfVFJBQ0UoImZpYjZfYWRkXzFcbiIpOworCisJLyogaW5zZXJ0IG5vZGUgaW4gdHJlZSAqLworCisJZm4gPSByb290OworCisJZG8geworCQlrZXkgPSAoc3RydWN0IHJ0NmtleSAqKSgodTggKilmbi0+bGVhZiArIG9mZnNldCk7CisKKwkJLyoKKwkJICoJUHJlZml4IG1hdGNoCisJCSAqLworCQlpZiAocGxlbiA8IGZuLT5mbl9iaXQgfHwKKwkJICAgICFpcHY2X3ByZWZpeF9lcXVhbCgma2V5LT5hZGRyLCBhZGRyLCBmbi0+Zm5fYml0KSkKKwkJCWdvdG8gaW5zZXJ0X2Fib3ZlOworCQkKKwkJLyoKKwkJICoJRXhhY3QgbWF0Y2ggPworCQkgKi8KKwkJCSAKKwkJaWYgKHBsZW4gPT0gZm4tPmZuX2JpdCkgeworCQkJLyogY2xlYW4gdXAgYW4gaW50ZXJtZWRpYXRlIG5vZGUgKi8KKwkJCWlmICgoZm4tPmZuX2ZsYWdzICYgUlROX1JUSU5GTykgPT0gMCkgeworCQkJCXJ0Nl9yZWxlYXNlKGZuLT5sZWFmKTsKKwkJCQlmbi0+bGVhZiA9IE5VTEw7CisJCQl9CisJCQkKKwkJCWZuLT5mbl9zZXJudW0gPSBzZXJudW07CisJCQkJCisJCQlyZXR1cm4gZm47CisJCX0KKworCQkvKgorCQkgKglXZSBoYXZlIG1vcmUgYml0cyB0byBnbworCQkgKi8KKwkJCSAKKwkJLyogVHJ5IHRvIHdhbGsgZG93biBvbiB0cmVlLiAqLworCQlmbi0+Zm5fc2VybnVtID0gc2VybnVtOworCQlkaXIgPSBhZGRyX2JpdF9zZXQoYWRkciwgZm4tPmZuX2JpdCk7CisJCXBuID0gZm47CisJCWZuID0gZGlyID8gZm4tPnJpZ2h0OiBmbi0+bGVmdDsKKwl9IHdoaWxlIChmbik7CisKKwkvKgorCSAqCVdlIHdhbGtlZCB0byB0aGUgYm90dG9tIG9mIHRyZWUuCisJICoJQ3JlYXRlIG5ldyBsZWFmIG5vZGUgd2l0aG91dCBjaGlsZHJlbi4KKwkgKi8KKworCWxuID0gbm9kZV9hbGxvYygpOworCisJaWYgKGxuID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWxuLT5mbl9iaXQgPSBwbGVuOworCQkJCisJbG4tPnBhcmVudCA9IHBuOworCWxuLT5mbl9zZXJudW0gPSBzZXJudW07CisKKwlpZiAoZGlyKQorCQlwbi0+cmlnaHQgPSBsbjsKKwllbHNlCisJCXBuLT5sZWZ0ICA9IGxuOworCisJcmV0dXJuIGxuOworCisKK2luc2VydF9hYm92ZToKKwkvKgorCSAqIHNwbGl0IHNpbmNlIHdlIGRvbid0IGhhdmUgYSBjb21tb24gcHJlZml4IGFueW1vcmUgb3IgCisJICogd2UgaGF2ZSBhIGxlc3Mgc2lnbmlmaWNhbnQgcm91dGUuCisJICogd2UndmUgdG8gaW5zZXJ0IGFuIGludGVybWVkaWF0ZSBub2RlIG9uIHRoZSBsaXN0CisJICogdGhpcyBuZXcgbm9kZSB3aWxsIHBvaW50IHRvIHRoZSBvbmUgd2UgbmVlZCB0byBjcmVhdGUKKwkgKiBhbmQgdGhlIGN1cnJlbnQKKwkgKi8KKworCXBuID0gZm4tPnBhcmVudDsKKworCS8qIGZpbmQgMXN0IGJpdCBpbiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIDIgYWRkcnMuCisKKwkgICBTZWUgY29tbWVudCBpbiBhZGRyX2RpZmY6IGJpdCBtYXkgYmUgYW4gaW52YWxpZCB2YWx1ZSwKKwkgICBidXQgaWYgaXQgaXMgPj0gcGxlbiwgdGhlIHZhbHVlIGlzIGlnbm9yZWQgaW4gYW55IGNhc2UuCisJICovCisJCisJYml0ID0gYWRkcl9kaWZmKGFkZHIsICZrZXktPmFkZHIsIGFkZHJsZW4pOworCisJLyogCisJICoJCShpbnRlcm1lZGlhdGUpW2luXQkKKwkgKgkgICAgICAgICAgLwkgICBcCisJICoJKG5ldyBsZWFmIG5vZGUpW2xuXSAob2xkIG5vZGUpW2ZuXQorCSAqLworCWlmIChwbGVuID4gYml0KSB7CisJCWluID0gbm9kZV9hbGxvYygpOworCQlsbiA9IG5vZGVfYWxsb2MoKTsKKwkJCisJCWlmIChpbiA9PSBOVUxMIHx8IGxuID09IE5VTEwpIHsKKwkJCWlmIChpbikKKwkJCQlub2RlX2ZyZWUoaW4pOworCQkJaWYgKGxuKQorCQkJCW5vZGVfZnJlZShsbik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCS8qIAorCQkgKiBuZXcgaW50ZXJtZWRpYXRlIG5vZGUuIAorCQkgKiBSVE5fUlRJTkZPIHdpbGwKKwkJICogYmUgb2ZmIHNpbmNlIHRoYXQgYW4gYWRkcmVzcyB0aGF0IGNob29zZXMgb25lIG9mCisJCSAqIHRoZSBicmFuY2hlcyB3b3VsZCBub3QgbWF0Y2ggbGVzcyBzcGVjaWZpYyByb3V0ZXMKKwkJICogaW4gdGhlIG90aGVyIGJyYW5jaAorCQkgKi8KKworCQlpbi0+Zm5fYml0ID0gYml0OworCisJCWluLT5wYXJlbnQgPSBwbjsKKwkJaW4tPmxlYWYgPSBmbi0+bGVhZjsKKwkJYXRvbWljX2luYygmaW4tPmxlYWYtPnJ0NmlfcmVmKTsKKworCQlpbi0+Zm5fc2VybnVtID0gc2VybnVtOworCisJCS8qIHVwZGF0ZSBwYXJlbnQgcG9pbnRlciAqLworCQlpZiAoZGlyKQorCQkJcG4tPnJpZ2h0ID0gaW47CisJCWVsc2UKKwkJCXBuLT5sZWZ0ICA9IGluOworCisJCWxuLT5mbl9iaXQgPSBwbGVuOworCisJCWxuLT5wYXJlbnQgPSBpbjsKKwkJZm4tPnBhcmVudCA9IGluOworCisJCWxuLT5mbl9zZXJudW0gPSBzZXJudW07CisKKwkJaWYgKGFkZHJfYml0X3NldChhZGRyLCBiaXQpKSB7CisJCQlpbi0+cmlnaHQgPSBsbjsKKwkJCWluLT5sZWZ0ICA9IGZuOworCQl9IGVsc2UgeworCQkJaW4tPmxlZnQgID0gbG47CisJCQlpbi0+cmlnaHQgPSBmbjsKKwkJfQorCX0gZWxzZSB7IC8qIHBsZW4gPD0gYml0ICovCisKKwkJLyogCisJCSAqCQkobmV3IGxlYWYgbm9kZSlbbG5dCisJCSAqCSAgICAgICAgICAvCSAgIFwKKwkJICoJICAgICAob2xkIG5vZGUpW2ZuXSBOVUxMCisJCSAqLworCisJCWxuID0gbm9kZV9hbGxvYygpOworCisJCWlmIChsbiA9PSBOVUxMKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJbG4tPmZuX2JpdCA9IHBsZW47CisKKwkJbG4tPnBhcmVudCA9IHBuOworCisJCWxuLT5mbl9zZXJudW0gPSBzZXJudW07CisJCQorCQlpZiAoZGlyKQorCQkJcG4tPnJpZ2h0ID0gbG47CisJCWVsc2UKKwkJCXBuLT5sZWZ0ICA9IGxuOworCisJCWlmIChhZGRyX2JpdF9zZXQoJmtleS0+YWRkciwgcGxlbikpCisJCQlsbi0+cmlnaHQgPSBmbjsKKwkJZWxzZQorCQkJbG4tPmxlZnQgID0gZm47CisKKwkJZm4tPnBhcmVudCA9IGxuOworCX0KKwlyZXR1cm4gbG47Cit9CisKKy8qCisgKglJbnNlcnQgcm91dGluZyBpbmZvcm1hdGlvbiBpbiBhIG5vZGUuCisgKi8KKworc3RhdGljIGludCBmaWI2X2FkZF9ydDJub2RlKHN0cnVjdCBmaWI2X25vZGUgKmZuLCBzdHJ1Y3QgcnQ2X2luZm8gKnJ0LAorICAgIHN0cnVjdCBubG1zZ2hkciAqbmxoKQoreworCXN0cnVjdCBydDZfaW5mbyAqaXRlciA9IE5VTEw7CisJc3RydWN0IHJ0Nl9pbmZvICoqaW5zOworCisJaW5zID0gJmZuLT5sZWFmOworCisJaWYgKGZuLT5mbl9mbGFncyZSVE5fVExfUk9PVCAmJgorCSAgICBmbi0+bGVhZiA9PSAmaXA2X251bGxfZW50cnkgJiYKKwkgICAgIShydC0+cnQ2aV9mbGFncyAmIChSVEZfREVGQVVMVCB8IFJURl9BRERSQ09ORikpICl7CisJCWZuLT5sZWFmID0gcnQ7CisJCXJ0LT51Lm5leHQgPSBOVUxMOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKGl0ZXIgPSBmbi0+bGVhZjsgaXRlcjsgaXRlcj1pdGVyLT51Lm5leHQpIHsKKwkJLyoKKwkJICoJU2VhcmNoIGZvciBkdXBsaWNhdGVzCisJCSAqLworCisJCWlmIChpdGVyLT5ydDZpX21ldHJpYyA9PSBydC0+cnQ2aV9tZXRyaWMpIHsKKwkJCS8qCisJCQkgKglTYW1lIHByaW9yaXR5IGxldmVsCisJCQkgKi8KKworCQkJaWYgKGl0ZXItPnJ0NmlfZGV2ID09IHJ0LT5ydDZpX2RldiAmJgorCQkJICAgIGl0ZXItPnJ0NmlfaWRldiA9PSBydC0+cnQ2aV9pZGV2ICYmCisJCQkgICAgaXB2Nl9hZGRyX2VxdWFsKCZpdGVyLT5ydDZpX2dhdGV3YXksCisJCQkJCSAgICAmcnQtPnJ0NmlfZ2F0ZXdheSkpIHsKKwkJCQlpZiAoIShpdGVyLT5ydDZpX2ZsYWdzJlJURl9FWFBJUkVTKSkKKwkJCQkJcmV0dXJuIC1FRVhJU1Q7CisJCQkJaXRlci0+cnQ2aV9leHBpcmVzID0gcnQtPnJ0NmlfZXhwaXJlczsKKwkJCQlpZiAoIShydC0+cnQ2aV9mbGFncyZSVEZfRVhQSVJFUykpIHsKKwkJCQkJaXRlci0+cnQ2aV9mbGFncyAmPSB+UlRGX0VYUElSRVM7CisJCQkJCWl0ZXItPnJ0NmlfZXhwaXJlcyA9IDA7CisJCQkJfQorCQkJCXJldHVybiAtRUVYSVNUOworCQkJfQorCQl9CisKKwkJaWYgKGl0ZXItPnJ0NmlfbWV0cmljID4gcnQtPnJ0NmlfbWV0cmljKQorCQkJYnJlYWs7CisKKwkJaW5zID0gJml0ZXItPnUubmV4dDsKKwl9CisKKwkvKgorCSAqCWluc2VydCBub2RlCisJICovCisKK291dDoKKwlydC0+dS5uZXh0ID0gaXRlcjsKKwkqaW5zID0gcnQ7CisJcnQtPnJ0Nmlfbm9kZSA9IGZuOworCWF0b21pY19pbmMoJnJ0LT5ydDZpX3JlZik7CisJaW5ldDZfcnRfbm90aWZ5KFJUTV9ORVdST1VURSwgcnQsIG5saCk7CisJcnQ2X3N0YXRzLmZpYl9ydF9lbnRyaWVzKys7CisKKwlpZiAoKGZuLT5mbl9mbGFncyAmIFJUTl9SVElORk8pID09IDApIHsKKwkJcnQ2X3N0YXRzLmZpYl9yb3V0ZV9ub2RlcysrOworCQlmbi0+Zm5fZmxhZ3MgfD0gUlROX1JUSU5GTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBmaWI2X3N0YXJ0X2djKHN0cnVjdCBydDZfaW5mbyAqcnQpCit7CisJaWYgKGlwNl9maWJfdGltZXIuZXhwaXJlcyA9PSAwICYmCisJICAgIChydC0+cnQ2aV9mbGFncyAmIChSVEZfRVhQSVJFU3xSVEZfQ0FDSEUpKSkKKwkJbW9kX3RpbWVyKCZpcDZfZmliX3RpbWVyLCBqaWZmaWVzICsgaXA2X3J0X2djX2ludGVydmFsKTsKK30KKwordm9pZCBmaWI2X2ZvcmNlX3N0YXJ0X2djKHZvaWQpCit7CisJaWYgKGlwNl9maWJfdGltZXIuZXhwaXJlcyA9PSAwKQorCQltb2RfdGltZXIoJmlwNl9maWJfdGltZXIsIGppZmZpZXMgKyBpcDZfcnRfZ2NfaW50ZXJ2YWwpOworfQorCisvKgorICoJQWRkIHJvdXRpbmcgaW5mb3JtYXRpb24gdG8gdGhlIHJvdXRpbmcgdHJlZS4KKyAqCTxkZXN0aW5hdGlvbiBhZGRyPi88c291cmNlIGFkZHI+CisgKgl3aXRoIHNvdXJjZSBhZGRyIGluZm8gaW4gc3ViLXRyZWVzCisgKi8KKworaW50IGZpYjZfYWRkKHN0cnVjdCBmaWI2X25vZGUgKnJvb3QsIHN0cnVjdCBydDZfaW5mbyAqcnQsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICpfcnRhdHRyKQoreworCXN0cnVjdCBmaWI2X25vZGUgKmZuOworCWludCBlcnIgPSAtRU5PTUVNOworCisJZm4gPSBmaWI2X2FkZF8xKHJvb3QsICZydC0+cnQ2aV9kc3QuYWRkciwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksCisJCQlydC0+cnQ2aV9kc3QucGxlbiwgb2Zmc2V0b2Yoc3RydWN0IHJ0Nl9pbmZvLCBydDZpX2RzdCkpOworCisJaWYgKGZuID09IE5VTEwpCisJCWdvdG8gb3V0OworCisjaWZkZWYgQ09ORklHX0lQVjZfU1VCVFJFRVMKKwlpZiAocnQtPnJ0Nmlfc3JjLnBsZW4pIHsKKwkJc3RydWN0IGZpYjZfbm9kZSAqc247CisKKwkJaWYgKGZuLT5zdWJ0cmVlID09IE5VTEwpIHsKKwkJCXN0cnVjdCBmaWI2X25vZGUgKnNmbjsKKworCQkJLyoKKwkJCSAqIENyZWF0ZSBzdWJ0cmVlLgorCQkJICoKKwkJCSAqCQlmblttYWluIHRyZWVdCisJCQkgKgkJfAorCQkJICoJCXNmbltzdWJ0cmVlIHJvb3RdCisJCQkgKgkJICAgXAorCQkJICoJCSAgICBzbltuZXcgbGVhZiBub2RlXQorCQkJICovCisKKwkJCS8qIENyZWF0ZSBzdWJ0cmVlIHJvb3Qgbm9kZSAqLworCQkJc2ZuID0gbm9kZV9hbGxvYygpOworCQkJaWYgKHNmbiA9PSBOVUxMKQorCQkJCWdvdG8gc3RfZmFpbHVyZTsKKworCQkJc2ZuLT5sZWFmID0gJmlwNl9udWxsX2VudHJ5OworCQkJYXRvbWljX2luYygmaXA2X251bGxfZW50cnkucnQ2aV9yZWYpOworCQkJc2ZuLT5mbl9mbGFncyA9IFJUTl9ST09UOworCQkJc2ZuLT5mbl9zZXJudW0gPSBmaWI2X25ld19zZXJudW0oKTsKKworCQkJLyogTm93IGFkZCB0aGUgZmlyc3QgbGVhZiBub2RlIHRvIG5ldyBzdWJ0cmVlICovCisKKwkJCXNuID0gZmliNl9hZGRfMShzZm4sICZydC0+cnQ2aV9zcmMuYWRkciwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksIHJ0LT5ydDZpX3NyYy5wbGVuLAorCQkJCQlvZmZzZXRvZihzdHJ1Y3QgcnQ2X2luZm8sIHJ0Nmlfc3JjKSk7CisKKwkJCWlmIChzbiA9PSBOVUxMKSB7CisJCQkJLyogSWYgaXQgaXMgZmFpbGVkLCBkaXNjYXJkIGp1c3QgYWxsb2NhdGVkCisJCQkJICAgcm9vdCwgYW5kIHRoZW4gKGluIHN0X2ZhaWx1cmUpIHN0YWxlIG5vZGUKKwkJCQkgICBpbiBtYWluIHRyZWUuCisJCQkJICovCisJCQkJbm9kZV9mcmVlKHNmbik7CisJCQkJZ290byBzdF9mYWlsdXJlOworCQkJfQorCisJCQkvKiBOb3cgbGluayBuZXcgc3VidHJlZSB0byBtYWluIHRyZWUgKi8KKwkJCXNmbi0+cGFyZW50ID0gZm47CisJCQlmbi0+c3VidHJlZSA9IHNmbjsKKwkJCWlmIChmbi0+bGVhZiA9PSBOVUxMKSB7CisJCQkJZm4tPmxlYWYgPSBydDsKKwkJCQlhdG9taWNfaW5jKCZydC0+cnQ2aV9yZWYpOworCQkJfQorCQl9IGVsc2UgeworCQkJc24gPSBmaWI2X2FkZF8xKGZuLT5zdWJ0cmVlLCAmcnQtPnJ0Nmlfc3JjLmFkZHIsCisJCQkJCXNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLCBydC0+cnQ2aV9zcmMucGxlbiwKKwkJCQkJb2Zmc2V0b2Yoc3RydWN0IHJ0Nl9pbmZvLCBydDZpX3NyYykpOworCisJCQlpZiAoc24gPT0gTlVMTCkKKwkJCQlnb3RvIHN0X2ZhaWx1cmU7CisJCX0KKworCQlmbiA9IHNuOworCX0KKyNlbmRpZgorCisJZXJyID0gZmliNl9hZGRfcnQybm9kZShmbiwgcnQsIG5saCk7CisKKwlpZiAoZXJyID09IDApIHsKKwkJZmliNl9zdGFydF9nYyhydCk7CisJCWlmICghKHJ0LT5ydDZpX2ZsYWdzJlJURl9DQUNIRSkpCisJCQlmaWI2X3BydW5lX2Nsb25lcyhmbiwgcnQpOworCX0KKworb3V0OgorCWlmIChlcnIpCisJCWRzdF9mcmVlKCZydC0+dS5kc3QpOworCXJldHVybiBlcnI7CisKKyNpZmRlZiBDT05GSUdfSVBWNl9TVUJUUkVFUworCS8qIFN1YnRyZWUgY3JlYXRpb24gZmFpbGVkLCBwcm9iYWJseSBtYWluIHRyZWUgbm9kZQorCSAgIGlzIG9ycGhhbi4gSWYgaXQgaXMsIHNob290IGl0LgorCSAqLworc3RfZmFpbHVyZToKKwlpZiAoZm4gJiYgIShmbi0+Zm5fZmxhZ3MgJiAoUlROX1JUSU5GT3xSVE5fUk9PVCkpKQorCQlmaWI2X3JlcGFpcl90cmVlKGZuKTsKKwlkc3RfZnJlZSgmcnQtPnUuZHN0KTsKKwlyZXR1cm4gZXJyOworI2VuZGlmCit9CisKKy8qCisgKglSb3V0aW5nIHRyZWUgbG9va3VwCisgKgorICovCisKK3N0cnVjdCBsb29rdXBfYXJncyB7CisJaW50CQlvZmZzZXQ7CQkvKiBrZXkgb2Zmc2V0IG9uIHJ0Nl9pbmZvCSovCisJc3RydWN0IGluNl9hZGRyCSphZGRyOwkJLyogc2VhcmNoIGtleQkJCSovCit9OworCitzdGF0aWMgc3RydWN0IGZpYjZfbm9kZSAqIGZpYjZfbG9va3VwXzEoc3RydWN0IGZpYjZfbm9kZSAqcm9vdCwKKwkJCQkJc3RydWN0IGxvb2t1cF9hcmdzICphcmdzKQoreworCXN0cnVjdCBmaWI2X25vZGUgKmZuOworCWludCBkaXI7CisKKwkvKgorCSAqCURlc2NlbmQgb24gYSB0cmVlCisJICovCisKKwlmbiA9IHJvb3Q7CisKKwlmb3IgKDs7KSB7CisJCXN0cnVjdCBmaWI2X25vZGUgKm5leHQ7CisKKwkJZGlyID0gYWRkcl9iaXRfc2V0KGFyZ3MtPmFkZHIsIGZuLT5mbl9iaXQpOworCisJCW5leHQgPSBkaXIgPyBmbi0+cmlnaHQgOiBmbi0+bGVmdDsKKworCQlpZiAobmV4dCkgeworCQkJZm4gPSBuZXh0OworCQkJY29udGludWU7CisJCX0KKworCQlicmVhazsKKwl9CisKKwl3aGlsZSAoKGZuLT5mbl9mbGFncyAmIFJUTl9ST09UKSA9PSAwKSB7CisjaWZkZWYgQ09ORklHX0lQVjZfU1VCVFJFRVMKKwkJaWYgKGZuLT5zdWJ0cmVlKSB7CisJCQlzdHJ1Y3QgZmliNl9ub2RlICpzdDsKKwkJCXN0cnVjdCBsb29rdXBfYXJncyAqbmFyZzsKKworCQkJbmFyZyA9IGFyZ3MgKyAxOworCisJCQlpZiAobmFyZy0+YWRkcikgeworCQkJCXN0ID0gZmliNl9sb29rdXBfMShmbi0+c3VidHJlZSwgbmFyZyk7CisKKwkJCQlpZiAoc3QgJiYgIShzdC0+Zm5fZmxhZ3MgJiBSVE5fUk9PVCkpCisJCQkJCXJldHVybiBzdDsKKwkJCX0KKwkJfQorI2VuZGlmCisKKwkJaWYgKGZuLT5mbl9mbGFncyAmIFJUTl9SVElORk8pIHsKKwkJCXN0cnVjdCBydDZrZXkgKmtleTsKKworCQkJa2V5ID0gKHN0cnVjdCBydDZrZXkgKikgKCh1OCAqKSBmbi0+bGVhZiArCisJCQkJCQkgYXJncy0+b2Zmc2V0KTsKKworCQkJaWYgKGlwdjZfcHJlZml4X2VxdWFsKCZrZXktPmFkZHIsIGFyZ3MtPmFkZHIsIGtleS0+cGxlbikpCisJCQkJcmV0dXJuIGZuOworCQl9CisKKwkJZm4gPSBmbi0+cGFyZW50OworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgZmliNl9ub2RlICogZmliNl9sb29rdXAoc3RydWN0IGZpYjZfbm9kZSAqcm9vdCwgc3RydWN0IGluNl9hZGRyICpkYWRkciwKKwkJCSAgICAgICBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyKQoreworCXN0cnVjdCBsb29rdXBfYXJncyBhcmdzWzJdOworCXN0cnVjdCBmaWI2X25vZGUgKmZuOworCisJYXJnc1swXS5vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgcnQ2X2luZm8sIHJ0NmlfZHN0KTsKKwlhcmdzWzBdLmFkZHIgPSBkYWRkcjsKKworI2lmZGVmIENPTkZJR19JUFY2X1NVQlRSRUVTCisJYXJnc1sxXS5vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgcnQ2X2luZm8sIHJ0Nmlfc3JjKTsKKwlhcmdzWzFdLmFkZHIgPSBzYWRkcjsKKyNlbmRpZgorCisJZm4gPSBmaWI2X2xvb2t1cF8xKHJvb3QsIGFyZ3MpOworCisJaWYgKGZuID09IE5VTEwgfHwgZm4tPmZuX2ZsYWdzICYgUlROX1RMX1JPT1QpCisJCWZuID0gcm9vdDsKKworCXJldHVybiBmbjsKK30KKworLyoKKyAqCUdldCBub2RlIHdpdGggc3BlY2lmaWVkIGRlc3RpbmF0aW9uIHByZWZpeCAoYW5kIHNvdXJjZSBwcmVmaXgsCisgKglpZiBzdWJ0cmVlcyBhcmUgdXNlZCkKKyAqLworCisKK3N0YXRpYyBzdHJ1Y3QgZmliNl9ub2RlICogZmliNl9sb2NhdGVfMShzdHJ1Y3QgZmliNl9ub2RlICpyb290LAorCQkJCQlzdHJ1Y3QgaW42X2FkZHIgKmFkZHIsCisJCQkJCWludCBwbGVuLCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBmaWI2X25vZGUgKmZuOworCisJZm9yIChmbiA9IHJvb3Q7IGZuIDsgKSB7CisJCXN0cnVjdCBydDZrZXkgKmtleSA9IChzdHJ1Y3QgcnQ2a2V5ICopKCh1OCAqKWZuLT5sZWFmICsgb2Zmc2V0KTsKKworCQkvKgorCQkgKglQcmVmaXggbWF0Y2gKKwkJICovCisJCWlmIChwbGVuIDwgZm4tPmZuX2JpdCB8fAorCQkgICAgIWlwdjZfcHJlZml4X2VxdWFsKCZrZXktPmFkZHIsIGFkZHIsIGZuLT5mbl9iaXQpKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJaWYgKHBsZW4gPT0gZm4tPmZuX2JpdCkKKwkJCXJldHVybiBmbjsKKworCQkvKgorCQkgKglXZSBoYXZlIG1vcmUgYml0cyB0byBnbworCQkgKi8KKwkJaWYgKGFkZHJfYml0X3NldChhZGRyLCBmbi0+Zm5fYml0KSkKKwkJCWZuID0gZm4tPnJpZ2h0OworCQllbHNlCisJCQlmbiA9IGZuLT5sZWZ0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGZpYjZfbm9kZSAqIGZpYjZfbG9jYXRlKHN0cnVjdCBmaWI2X25vZGUgKnJvb3QsCisJCQkgICAgICAgc3RydWN0IGluNl9hZGRyICpkYWRkciwgaW50IGRzdF9sZW4sCisJCQkgICAgICAgc3RydWN0IGluNl9hZGRyICpzYWRkciwgaW50IHNyY19sZW4pCit7CisJc3RydWN0IGZpYjZfbm9kZSAqZm47CisKKwlmbiA9IGZpYjZfbG9jYXRlXzEocm9vdCwgZGFkZHIsIGRzdF9sZW4sCisJCQkgICBvZmZzZXRvZihzdHJ1Y3QgcnQ2X2luZm8sIHJ0NmlfZHN0KSk7CisKKyNpZmRlZiBDT05GSUdfSVBWNl9TVUJUUkVFUworCWlmIChzcmNfbGVuKSB7CisJCUJVR19UUkFQKHNhZGRyIT1OVUxMKTsKKwkJaWYgKGZuID09IE5VTEwpCisJCQlmbiA9IGZuLT5zdWJ0cmVlOworCQlpZiAoZm4pCisJCQlmbiA9IGZpYjZfbG9jYXRlXzEoZm4sIHNhZGRyLCBzcmNfbGVuLAorCQkJCQkgICBvZmZzZXRvZihzdHJ1Y3QgcnQ2X2luZm8sIHJ0Nmlfc3JjKSk7CisJfQorI2VuZGlmCisKKwlpZiAoZm4gJiYgZm4tPmZuX2ZsYWdzJlJUTl9SVElORk8pCisJCXJldHVybiBmbjsKKworCXJldHVybiBOVUxMOworfQorCisKKy8qCisgKglEZWxldGlvbgorICoKKyAqLworCitzdGF0aWMgc3RydWN0IHJ0Nl9pbmZvICogZmliNl9maW5kX3ByZWZpeChzdHJ1Y3QgZmliNl9ub2RlICpmbikKK3sKKwlpZiAoZm4tPmZuX2ZsYWdzJlJUTl9ST09UKQorCQlyZXR1cm4gJmlwNl9udWxsX2VudHJ5OworCisJd2hpbGUoZm4pIHsKKwkJaWYoZm4tPmxlZnQpCisJCQlyZXR1cm4gZm4tPmxlZnQtPmxlYWY7CisKKwkJaWYoZm4tPnJpZ2h0KQorCQkJcmV0dXJuIGZuLT5yaWdodC0+bGVhZjsKKworCQlmbiA9IFNVQlRSRUUoZm4pOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqCUNhbGxlZCB0byB0cmltIHRoZSB0cmVlIG9mIGludGVybWVkaWF0ZSBub2RlcyB3aGVuIHBvc3NpYmxlLiAiZm4iCisgKglpcyB0aGUgbm9kZSB3ZSB3YW50IHRvIHRyeSBhbmQgcmVtb3ZlLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgZmliNl9ub2RlICogZmliNl9yZXBhaXJfdHJlZShzdHJ1Y3QgZmliNl9ub2RlICpmbikKK3sKKwlpbnQgY2hpbGRyZW47CisJaW50IG5zdGF0ZTsKKwlzdHJ1Y3QgZmliNl9ub2RlICpjaGlsZCwgKnBuOworCXN0cnVjdCBmaWI2X3dhbGtlcl90ICp3OworCWludCBpdGVyID0gMDsKKworCWZvciAoOzspIHsKKwkJUlQ2X1RSQUNFKCJmaXhpbmcgdHJlZTogcGxlbj0lZCBpdGVyPSVkXG4iLCBmbi0+Zm5fYml0LCBpdGVyKTsKKwkJaXRlcisrOworCisJCUJVR19UUkFQKCEoZm4tPmZuX2ZsYWdzJlJUTl9SVElORk8pKTsKKwkJQlVHX1RSQVAoIShmbi0+Zm5fZmxhZ3MmUlROX1RMX1JPT1QpKTsKKwkJQlVHX1RSQVAoZm4tPmxlYWY9PU5VTEwpOworCisJCWNoaWxkcmVuID0gMDsKKwkJY2hpbGQgPSBOVUxMOworCQlpZiAoZm4tPnJpZ2h0KSBjaGlsZCA9IGZuLT5yaWdodCwgY2hpbGRyZW4gfD0gMTsKKwkJaWYgKGZuLT5sZWZ0KSBjaGlsZCA9IGZuLT5sZWZ0LCBjaGlsZHJlbiB8PSAyOworCisJCWlmIChjaGlsZHJlbiA9PSAzIHx8IFNVQlRSRUUoZm4pIAorI2lmZGVmIENPTkZJR19JUFY2X1NVQlRSRUVTCisJCSAgICAvKiBTdWJ0cmVlIHJvb3QgKGkuZS4gZm4pIG1heSBoYXZlIG9uZSBjaGlsZCAqLworCQkgICAgfHwgKGNoaWxkcmVuICYmIGZuLT5mbl9mbGFncyZSVE5fUk9PVCkKKyNlbmRpZgorCQkgICAgKSB7CisJCQlmbi0+bGVhZiA9IGZpYjZfZmluZF9wcmVmaXgoZm4pOworI2lmIFJUNl9ERUJVRyA+PSAyCisJCQlpZiAoZm4tPmxlYWY9PU5VTEwpIHsKKwkJCQlCVUdfVFJBUChmbi0+bGVhZik7CisJCQkJZm4tPmxlYWYgPSAmaXA2X251bGxfZW50cnk7CisJCQl9CisjZW5kaWYKKwkJCWF0b21pY19pbmMoJmZuLT5sZWFmLT5ydDZpX3JlZik7CisJCQlyZXR1cm4gZm4tPnBhcmVudDsKKwkJfQorCisJCXBuID0gZm4tPnBhcmVudDsKKyNpZmRlZiBDT05GSUdfSVBWNl9TVUJUUkVFUworCQlpZiAoU1VCVFJFRShwbikgPT0gZm4pIHsKKwkJCUJVR19UUkFQKGZuLT5mbl9mbGFncyZSVE5fUk9PVCk7CisJCQlTVUJUUkVFKHBuKSA9IE5VTEw7CisJCQluc3RhdGUgPSBGV1NfTDsKKwkJfSBlbHNlIHsKKwkJCUJVR19UUkFQKCEoZm4tPmZuX2ZsYWdzJlJUTl9ST09UKSk7CisjZW5kaWYKKwkJCWlmIChwbi0+cmlnaHQgPT0gZm4pIHBuLT5yaWdodCA9IGNoaWxkOworCQkJZWxzZSBpZiAocG4tPmxlZnQgPT0gZm4pIHBuLT5sZWZ0ID0gY2hpbGQ7CisjaWYgUlQ2X0RFQlVHID49IDIKKwkJCWVsc2UgQlVHX1RSQVAoMCk7CisjZW5kaWYKKwkJCWlmIChjaGlsZCkKKwkJCQljaGlsZC0+cGFyZW50ID0gcG47CisJCQluc3RhdGUgPSBGV1NfUjsKKyNpZmRlZiBDT05GSUdfSVBWNl9TVUJUUkVFUworCQl9CisjZW5kaWYKKworCQlyZWFkX2xvY2soJmZpYjZfd2Fsa2VyX2xvY2spOworCQlGT1JfV0FMS0VSUyh3KSB7CisJCQlpZiAoY2hpbGQgPT0gTlVMTCkgeworCQkJCWlmICh3LT5yb290ID09IGZuKSB7CisJCQkJCXctPnJvb3QgPSB3LT5ub2RlID0gTlVMTDsKKwkJCQkJUlQ2X1RSQUNFKCJXICVwIGFkanVzdGVkIGJ5IGRlbHJvb3QgMVxuIiwgdyk7CisJCQkJfSBlbHNlIGlmICh3LT5ub2RlID09IGZuKSB7CisJCQkJCVJUNl9UUkFDRSgiVyAlcCBhZGp1c3RlZCBieSBkZWxub2RlIDEsIHM9JWQvJWRcbiIsIHcsIHctPnN0YXRlLCBuc3RhdGUpOworCQkJCQl3LT5ub2RlID0gcG47CisJCQkJCXctPnN0YXRlID0gbnN0YXRlOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKHctPnJvb3QgPT0gZm4pIHsKKwkJCQkJdy0+cm9vdCA9IGNoaWxkOworCQkJCQlSVDZfVFJBQ0UoIlcgJXAgYWRqdXN0ZWQgYnkgZGVscm9vdCAyXG4iLCB3KTsKKwkJCQl9CisJCQkJaWYgKHctPm5vZGUgPT0gZm4pIHsKKwkJCQkJdy0+bm9kZSA9IGNoaWxkOworCQkJCQlpZiAoY2hpbGRyZW4mMikgeworCQkJCQkJUlQ2X1RSQUNFKCJXICVwIGFkanVzdGVkIGJ5IGRlbG5vZGUgMiwgcz0lZFxuIiwgdywgdy0+c3RhdGUpOworCQkJCQkJdy0+c3RhdGUgPSB3LT5zdGF0ZT49RldTX1IgPyBGV1NfVSA6IEZXU19JTklUOworCQkJCQl9IGVsc2UgeworCQkJCQkJUlQ2X1RSQUNFKCJXICVwIGFkanVzdGVkIGJ5IGRlbG5vZGUgMiwgcz0lZFxuIiwgdywgdy0+c3RhdGUpOworCQkJCQkJdy0+c3RhdGUgPSB3LT5zdGF0ZT49RldTX0MgPyBGV1NfVSA6IEZXU19JTklUOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJlYWRfdW5sb2NrKCZmaWI2X3dhbGtlcl9sb2NrKTsKKworCQlub2RlX2ZyZWUoZm4pOworCQlpZiAocG4tPmZuX2ZsYWdzJlJUTl9SVElORk8gfHwgU1VCVFJFRShwbikpCisJCQlyZXR1cm4gcG47CisKKwkJcnQ2X3JlbGVhc2UocG4tPmxlYWYpOworCQlwbi0+bGVhZiA9IE5VTEw7CisJCWZuID0gcG47CisJfQorfQorCitzdGF0aWMgdm9pZCBmaWI2X2RlbF9yb3V0ZShzdHJ1Y3QgZmliNl9ub2RlICpmbiwgc3RydWN0IHJ0Nl9pbmZvICoqcnRwLAorICAgIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICpfcnRhdHRyKQoreworCXN0cnVjdCBmaWI2X3dhbGtlcl90ICp3OworCXN0cnVjdCBydDZfaW5mbyAqcnQgPSAqcnRwOworCisJUlQ2X1RSQUNFKCJmaWI2X2RlbF9yb3V0ZVxuIik7CisKKwkvKiBVbmxpbmsgaXQgKi8KKwkqcnRwID0gcnQtPnUubmV4dDsKKwlydC0+cnQ2aV9ub2RlID0gTlVMTDsKKwlydDZfc3RhdHMuZmliX3J0X2VudHJpZXMtLTsKKwlydDZfc3RhdHMuZmliX2Rpc2NhcmRlZF9yb3V0ZXMrKzsKKworCS8qIEFkanVzdCB3YWxrZXJzICovCisJcmVhZF9sb2NrKCZmaWI2X3dhbGtlcl9sb2NrKTsKKwlGT1JfV0FMS0VSUyh3KSB7CisJCWlmICh3LT5zdGF0ZSA9PSBGV1NfQyAmJiB3LT5sZWFmID09IHJ0KSB7CisJCQlSVDZfVFJBQ0UoIndhbGtlciAlcCBhZGp1c3RlZCBieSBkZWxyb3V0ZVxuIiwgdyk7CisJCQl3LT5sZWFmID0gcnQtPnUubmV4dDsKKwkJCWlmICh3LT5sZWFmID09IE5VTEwpCisJCQkJdy0+c3RhdGUgPSBGV1NfVTsKKwkJfQorCX0KKwlyZWFkX3VubG9jaygmZmliNl93YWxrZXJfbG9jayk7CisKKwlydC0+dS5uZXh0ID0gTlVMTDsKKworCWlmIChmbi0+bGVhZiA9PSBOVUxMICYmIGZuLT5mbl9mbGFncyZSVE5fVExfUk9PVCkKKwkJZm4tPmxlYWYgPSAmaXA2X251bGxfZW50cnk7CisKKwkvKiBJZiBpdCB3YXMgbGFzdCByb3V0ZSwgZXhwdW5nZSBpdHMgcmFkaXggdHJlZSBub2RlICovCisJaWYgKGZuLT5sZWFmID09IE5VTEwpIHsKKwkJZm4tPmZuX2ZsYWdzICY9IH5SVE5fUlRJTkZPOworCQlydDZfc3RhdHMuZmliX3JvdXRlX25vZGVzLS07CisJCWZuID0gZmliNl9yZXBhaXJfdHJlZShmbik7CisJfQorCisJaWYgKGF0b21pY19yZWFkKCZydC0+cnQ2aV9yZWYpICE9IDEpIHsKKwkJLyogVGhpcyByb3V0ZSBpcyB1c2VkIGFzIGR1bW15IGFkZHJlc3MgaG9sZGVyIGluIHNvbWUgc3BsaXQKKwkJICogbm9kZXMuIEl0IGlzIG5vdCBsZWFrZWQsIGJ1dCBpdCBzdGlsbCBob2xkcyBvdGhlciByZXNvdXJjZXMsCisJCSAqIHdoaWNoIG11c3QgYmUgcmVsZWFzZWQgaW4gdGltZS4gU28sIHNjYW4gYXNjZW5kYW50IG5vZGVzCisJCSAqIGFuZCByZXBsYWNlIGR1bW15IHJlZmVyZW5jZXMgdG8gdGhpcyByb3V0ZSB3aXRoIHJlZmVyZW5jZXMKKwkJICogdG8gc3RpbGwgYWxpdmUgb25lcy4KKwkJICovCisJCXdoaWxlIChmbikgeworCQkJaWYgKCEoZm4tPmZuX2ZsYWdzJlJUTl9SVElORk8pICYmIGZuLT5sZWFmID09IHJ0KSB7CisJCQkJZm4tPmxlYWYgPSBmaWI2X2ZpbmRfcHJlZml4KGZuKTsKKwkJCQlhdG9taWNfaW5jKCZmbi0+bGVhZi0+cnQ2aV9yZWYpOworCQkJCXJ0Nl9yZWxlYXNlKHJ0KTsKKwkJCX0KKwkJCWZuID0gZm4tPnBhcmVudDsKKwkJfQorCQkvKiBObyBtb3JlIHJlZmVyZW5jZXMgYXJlIHBvc3NpYmxlIGF0IHRoaXMgcG9pbnQuICovCisJCWlmIChhdG9taWNfcmVhZCgmcnQtPnJ0NmlfcmVmKSAhPSAxKSBCVUcoKTsKKwl9CisKKwlpbmV0Nl9ydF9ub3RpZnkoUlRNX0RFTFJPVVRFLCBydCwgbmxoKTsKKwlydDZfcmVsZWFzZShydCk7Cit9CisKK2ludCBmaWI2X2RlbChzdHJ1Y3QgcnQ2X2luZm8gKnJ0LCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqX3J0YXR0cikKK3sKKwlzdHJ1Y3QgZmliNl9ub2RlICpmbiA9IHJ0LT5ydDZpX25vZGU7CisJc3RydWN0IHJ0Nl9pbmZvICoqcnRwOworCisjaWYgUlQ2X0RFQlVHID49IDIKKwlpZiAocnQtPnUuZHN0Lm9ic29sZXRlPjApIHsKKwkJQlVHX1RSQVAoZm49PU5VTEwpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisjZW5kaWYKKwlpZiAoZm4gPT0gTlVMTCB8fCBydCA9PSAmaXA2X251bGxfZW50cnkpCisJCXJldHVybiAtRU5PRU5UOworCisJQlVHX1RSQVAoZm4tPmZuX2ZsYWdzJlJUTl9SVElORk8pOworCisJaWYgKCEocnQtPnJ0NmlfZmxhZ3MmUlRGX0NBQ0hFKSkKKwkJZmliNl9wcnVuZV9jbG9uZXMoZm4sIHJ0KTsKKworCS8qCisJICoJV2FsayB0aGUgbGVhZiBlbnRyaWVzIGxvb2tpbmcgZm9yIG91cnNlbGYKKwkgKi8KKworCWZvciAocnRwID0gJmZuLT5sZWFmOyAqcnRwOyBydHAgPSAmKCpydHApLT51Lm5leHQpIHsKKwkJaWYgKCpydHAgPT0gcnQpIHsKKwkJCWZpYjZfZGVsX3JvdXRlKGZuLCBydHAsIG5saCwgX3J0YXR0cik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVOT0VOVDsKK30KKworLyoKKyAqCVRyZWUgdHJhdmVyc2FsIGZ1bmN0aW9uLgorICoKKyAqCUNlcnRhaW5seSwgaXQgaXMgbm90IGludGVycnVwdCBzYWZlLgorICoJSG93ZXZlciwgaXQgaXMgaW50ZXJuYWxseSByZWVudGVyYWJsZSB3cnQgaXRzZWxmIGFuZCBmaWI2X2FkZC9maWI2X2RlbC4KKyAqCUl0IG1lYW5zLCB0aGF0IHdlIGNhbiBtb2RpZnkgdHJlZSBkdXJpbmcgd2Fsa2luZworICoJYW5kIHVzZSB0aGlzIGZ1bmN0aW9uIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24sIGNsb25lIHBydW5pbmcsCisgKgljbGVhbmluZyB0cmVlIHdoZW4gYSBkZXZpY2UgZ29lcyBkb3duIGV0Yy4gZXRjLgkKKyAqCisgKglJdCBndWFyYW50ZWVzIHRoYXQgZXZlcnkgbm9kZSB3aWxsIGJlIHRyYXZlcnNlZCwKKyAqCWFuZCB0aGF0IGl0IHdpbGwgYmUgdHJhdmVyc2VkIG9ubHkgb25jZS4KKyAqCisgKglDYWxsYmFjayBmdW5jdGlvbiB3LT5mdW5jIG1heSByZXR1cm46CisgKgkwIC0+IGNvbnRpbnVlIHdhbGtpbmcuCisgKglwb3NpdGl2ZSB2YWx1ZSAtPiB3YWxraW5nIGlzIHN1c3BlbmRlZCAodXNlZCBieSB0cmVlIGR1bXBzLAorICoJYW5kIHByb2JhYmx5IGJ5IGdjLCBpZiBpdCB3aWxsIGJlIHNwbGl0IHRvIHNldmVyYWwgc2xpY2VzKQorICoJbmVnYXRpdmUgdmFsdWUgLT4gdGVybWluYXRlIHdhbGtpbmcuCisgKgorICoJVGhlIGZ1bmN0aW9uIGl0c2VsZiByZXR1cm5zOgorICoJMCAgIC0+IHdhbGsgaXMgY29tcGxldGUuCisgKgk+MCAgLT4gd2FsayBpcyBpbmNvbXBsZXRlIChpLmUuIHN1c3BlbmRlZCkKKyAqCTwwICAtPiB3YWxrIGlzIHRlcm1pbmF0ZWQgYnkgYW4gZXJyb3IuCisgKi8KKworaW50IGZpYjZfd2Fsa19jb250aW51ZShzdHJ1Y3QgZmliNl93YWxrZXJfdCAqdykKK3sKKwlzdHJ1Y3QgZmliNl9ub2RlICpmbiwgKnBuOworCisJZm9yICg7OykgeworCQlmbiA9IHctPm5vZGU7CisJCWlmIChmbiA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKHctPnBydW5lICYmIGZuICE9IHctPnJvb3QgJiYKKwkJICAgIGZuLT5mbl9mbGFncyZSVE5fUlRJTkZPICYmIHctPnN0YXRlIDwgRldTX0MpIHsKKwkJCXctPnN0YXRlID0gRldTX0M7CisJCQl3LT5sZWFmID0gZm4tPmxlYWY7CisJCX0KKwkJc3dpdGNoICh3LT5zdGF0ZSkgeworI2lmZGVmIENPTkZJR19JUFY2X1NVQlRSRUVTCisJCWNhc2UgRldTX1M6CisJCQlpZiAoU1VCVFJFRShmbikpIHsKKwkJCQl3LT5ub2RlID0gU1VCVFJFRShmbik7CisJCQkJY29udGludWU7CisJCQl9CisJCQl3LT5zdGF0ZSA9IEZXU19MOworI2VuZGlmCQorCQljYXNlIEZXU19MOgorCQkJaWYgKGZuLT5sZWZ0KSB7CisJCQkJdy0+bm9kZSA9IGZuLT5sZWZ0OworCQkJCXctPnN0YXRlID0gRldTX0lOSVQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQl3LT5zdGF0ZSA9IEZXU19SOworCQljYXNlIEZXU19SOgorCQkJaWYgKGZuLT5yaWdodCkgeworCQkJCXctPm5vZGUgPSBmbi0+cmlnaHQ7CisJCQkJdy0+c3RhdGUgPSBGV1NfSU5JVDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXctPnN0YXRlID0gRldTX0M7CisJCQl3LT5sZWFmID0gZm4tPmxlYWY7CisJCWNhc2UgRldTX0M6CisJCQlpZiAody0+bGVhZiAmJiBmbi0+Zm5fZmxhZ3MmUlROX1JUSU5GTykgeworCQkJCWludCBlcnIgPSB3LT5mdW5jKHcpOworCQkJCWlmIChlcnIpCisJCQkJCXJldHVybiBlcnI7CisJCQkJY29udGludWU7CisJCQl9CisJCQl3LT5zdGF0ZSA9IEZXU19VOworCQljYXNlIEZXU19VOgorCQkJaWYgKGZuID09IHctPnJvb3QpCisJCQkJcmV0dXJuIDA7CisJCQlwbiA9IGZuLT5wYXJlbnQ7CisJCQl3LT5ub2RlID0gcG47CisjaWZkZWYgQ09ORklHX0lQVjZfU1VCVFJFRVMKKwkJCWlmIChTVUJUUkVFKHBuKSA9PSBmbikgeworCQkJCUJVR19UUkFQKGZuLT5mbl9mbGFncyZSVE5fUk9PVCk7CisJCQkJdy0+c3RhdGUgPSBGV1NfTDsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZgorCQkJaWYgKHBuLT5sZWZ0ID09IGZuKSB7CisJCQkJdy0+c3RhdGUgPSBGV1NfUjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChwbi0+cmlnaHQgPT0gZm4pIHsKKwkJCQl3LT5zdGF0ZSA9IEZXU19DOworCQkJCXctPmxlYWYgPSB3LT5ub2RlLT5sZWFmOworCQkJCWNvbnRpbnVlOworCQkJfQorI2lmIFJUNl9ERUJVRyA+PSAyCisJCQlCVUdfVFJBUCgwKTsKKyNlbmRpZgorCQl9CisJfQorfQorCitpbnQgZmliNl93YWxrKHN0cnVjdCBmaWI2X3dhbGtlcl90ICp3KQoreworCWludCByZXM7CisKKwl3LT5zdGF0ZSA9IEZXU19JTklUOworCXctPm5vZGUgPSB3LT5yb290OworCisJZmliNl93YWxrZXJfbGluayh3KTsKKwlyZXMgPSBmaWI2X3dhbGtfY29udGludWUodyk7CisJaWYgKHJlcyA8PSAwKQorCQlmaWI2X3dhbGtlcl91bmxpbmsodyk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBmaWI2X2NsZWFuX25vZGUoc3RydWN0IGZpYjZfd2Fsa2VyX3QgKncpCit7CisJaW50IHJlczsKKwlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OworCXN0cnVjdCBmaWI2X2NsZWFuZXJfdCAqYyA9IChzdHJ1Y3QgZmliNl9jbGVhbmVyX3QqKXc7CisKKwlmb3IgKHJ0ID0gdy0+bGVhZjsgcnQ7IHJ0ID0gcnQtPnUubmV4dCkgeworCQlyZXMgPSBjLT5mdW5jKHJ0LCBjLT5hcmcpOworCQlpZiAocmVzIDwgMCkgeworCQkJdy0+bGVhZiA9IHJ0OworCQkJcmVzID0gZmliNl9kZWwocnQsIE5VTEwsIE5VTEwpOworCQkJaWYgKHJlcykgeworI2lmIFJUNl9ERUJVRyA+PSAyCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImZpYjZfY2xlYW5fbm9kZTogZGVsIGZhaWxlZDogcnQ9JXBAJXAgZXJyPSVkXG4iLCBydCwgcnQtPnJ0Nmlfbm9kZSwgcmVzKTsKKyNlbmRpZgorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwkJQlVHX1RSQVAocmVzPT0wKTsKKwl9CisJdy0+bGVhZiA9IHJ0OworCXJldHVybiAwOworfQorCisvKgorICoJQ29udmVuaWVudCBmcm9udGVuZCB0byB0cmVlIHdhbGtlci4KKyAqCQorICoJZnVuYyBpcyBjYWxsZWQgb24gZWFjaCByb3V0ZS4KKyAqCQlJdCBtYXkgcmV0dXJuIC0xIC0+IGRlbGV0ZSB0aGlzIHJvdXRlLgorICoJCSAgICAgICAgICAgICAgMCAgLT4gY29udGludWUgd2Fsa2luZworICoKKyAqCXBydW5lPT0xIC0+IG9ubHkgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIG5vZGUgKGNlcnRhaW5seSwKKyAqCWlnbm9yaW5nIHB1cmUgc3BsaXQgbm9kZXMpIHdpbGwgYmUgc2Nhbm5lZC4KKyAqLworCit2b2lkIGZpYjZfY2xlYW5fdHJlZShzdHJ1Y3QgZmliNl9ub2RlICpyb290LAorCQkgICAgIGludCAoKmZ1bmMpKHN0cnVjdCBydDZfaW5mbyAqLCB2b2lkICphcmcpLAorCQkgICAgIGludCBwcnVuZSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBmaWI2X2NsZWFuZXJfdCBjOworCisJYy53LnJvb3QgPSByb290OworCWMudy5mdW5jID0gZmliNl9jbGVhbl9ub2RlOworCWMudy5wcnVuZSA9IHBydW5lOworCWMuZnVuYyA9IGZ1bmM7CisJYy5hcmcgPSBhcmc7CisKKwlmaWI2X3dhbGsoJmMudyk7Cit9CisKK3N0YXRpYyBpbnQgZmliNl9wcnVuZV9jbG9uZShzdHJ1Y3QgcnQ2X2luZm8gKnJ0LCB2b2lkICphcmcpCit7CisJaWYgKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX0NBQ0hFKSB7CisJCVJUNl9UUkFDRSgicHJ1bmluZyBjbG9uZSAlcFxuIiwgcnQpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZpYjZfcHJ1bmVfY2xvbmVzKHN0cnVjdCBmaWI2X25vZGUgKmZuLCBzdHJ1Y3QgcnQ2X2luZm8gKnJ0KQoreworCWZpYjZfY2xlYW5fdHJlZShmbiwgZmliNl9wcnVuZV9jbG9uZSwgMSwgcnQpOworfQorCisvKgorICoJR2FyYmFnZSBjb2xsZWN0aW9uCisgKi8KKworc3RhdGljIHN0cnVjdCBmaWI2X2djX2FyZ3MKK3sKKwlpbnQJCQl0aW1lb3V0OworCWludAkJCW1vcmU7Cit9IGdjX2FyZ3M7CisKK3N0YXRpYyBpbnQgZmliNl9hZ2Uoc3RydWN0IHJ0Nl9pbmZvICpydCwgdm9pZCAqYXJnKQoreworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKworCS8qCisJICoJY2hlY2sgYWRkcmNvbmYgZXhwaXJhdGlvbiBoZXJlLgorCSAqCVJvdXRlcyBhcmUgZXhwaXJlZCBldmVuIGlmIHRoZXkgYXJlIGluIHVzZS4KKwkgKgorCSAqCUFsc28gYWdlIGNsb25lcy4gTm90ZSwgdGhhdCBjbG9uZXMgYXJlIGFnZWQgb3V0CisJICoJb25seSBpZiB0aGV5IGFyZSBub3QgaW4gdXNlIG5vdy4KKwkgKi8KKworCWlmIChydC0+cnQ2aV9mbGFncyZSVEZfRVhQSVJFUyAmJiBydC0+cnQ2aV9leHBpcmVzKSB7CisJCWlmICh0aW1lX2FmdGVyKG5vdywgcnQtPnJ0NmlfZXhwaXJlcykpIHsKKwkJCVJUNl9UUkFDRSgiZXhwaXJpbmcgJXBcbiIsIHJ0KTsKKwkJCXJ0Nl9yZXNldF9kZmx0X3BvaW50ZXIocnQpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWdjX2FyZ3MubW9yZSsrOworCX0gZWxzZSBpZiAocnQtPnJ0NmlfZmxhZ3MgJiBSVEZfQ0FDSEUpIHsKKwkJaWYgKGF0b21pY19yZWFkKCZydC0+dS5kc3QuX19yZWZjbnQpID09IDAgJiYKKwkJICAgIHRpbWVfYWZ0ZXJfZXEobm93LCBydC0+dS5kc3QubGFzdHVzZSArIGdjX2FyZ3MudGltZW91dCkpIHsKKwkJCVJUNl9UUkFDRSgiYWdpbmcgY2xvbmUgJXBcbiIsIHJ0KTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIGlmICgocnQtPnJ0NmlfZmxhZ3MgJiBSVEZfR0FURVdBWSkgJiYKKwkJCSAgICghKHJ0LT5ydDZpX25leHRob3AtPmZsYWdzICYgTlRGX1JPVVRFUikpKSB7CisJCQlSVDZfVFJBQ0UoInB1cmdpbmcgcm91dGUgJXAgdmlhIG5vbi1yb3V0ZXIgYnV0IGdhdGV3YXlcbiIsCisJCQkJICBydCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZ2NfYXJncy5tb3JlKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZmliNl9nY19sb2NrKTsKKwordm9pZCBmaWI2X3J1bl9nYyh1bnNpZ25lZCBsb25nIGR1bW15KQoreworCWlmIChkdW1teSAhPSB+MFVMKSB7CisJCXNwaW5fbG9ja19iaCgmZmliNl9nY19sb2NrKTsKKwkJZ2NfYXJncy50aW1lb3V0ID0gZHVtbXkgPyAoaW50KWR1bW15IDogaXA2X3J0X2djX2ludGVydmFsOworCX0gZWxzZSB7CisJCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwkJaWYgKCFzcGluX3RyeWxvY2soJmZpYjZfZ2NfbG9jaykpIHsKKwkJCW1vZF90aW1lcigmaXA2X2ZpYl90aW1lciwgamlmZmllcyArIEhaKTsKKwkJCWxvY2FsX2JoX2VuYWJsZSgpOworCQkJcmV0dXJuOworCQl9CisJCWdjX2FyZ3MudGltZW91dCA9IGlwNl9ydF9nY19pbnRlcnZhbDsKKwl9CisJZ2NfYXJncy5tb3JlID0gMDsKKworCisJd3JpdGVfbG9ja19iaCgmcnQ2X2xvY2spOworCW5kaXNjX2RzdF9nYygmZ2NfYXJncy5tb3JlKTsKKwlmaWI2X2NsZWFuX3RyZWUoJmlwNl9yb3V0aW5nX3RhYmxlLCBmaWI2X2FnZSwgMCwgTlVMTCk7CisJd3JpdGVfdW5sb2NrX2JoKCZydDZfbG9jayk7CisKKwlpZiAoZ2NfYXJncy5tb3JlKQorCQltb2RfdGltZXIoJmlwNl9maWJfdGltZXIsIGppZmZpZXMgKyBpcDZfcnRfZ2NfaW50ZXJ2YWwpOworCWVsc2UgeworCQlkZWxfdGltZXIoJmlwNl9maWJfdGltZXIpOworCQlpcDZfZmliX3RpbWVyLmV4cGlyZXMgPSAwOworCX0KKwlzcGluX3VubG9ja19iaCgmZmliNl9nY19sb2NrKTsKK30KKwordm9pZCBfX2luaXQgZmliNl9pbml0KHZvaWQpCit7CisJZmliNl9ub2RlX2ttZW0gPSBrbWVtX2NhY2hlX2NyZWF0ZSgiZmliNl9ub2RlcyIsCisJCQkJCSAgIHNpemVvZihzdHJ1Y3QgZmliNl9ub2RlKSwKKwkJCQkJICAgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOLAorCQkJCQkgICBOVUxMLCBOVUxMKTsKKwlpZiAoIWZpYjZfbm9kZV9rbWVtKQorCQlwYW5pYygiY2Fubm90IGNyZWF0ZSBmaWI2X25vZGVzIGNhY2hlIik7Cit9CisKK3ZvaWQgZmliNl9nY19jbGVhbnVwKHZvaWQpCit7CisJZGVsX3RpbWVyKCZpcDZfZmliX3RpbWVyKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koZmliNl9ub2RlX2ttZW0pOworfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X2Zsb3dsYWJlbC5jIGIvbmV0L2lwdjYvaXA2X2Zsb3dsYWJlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5M2Y2ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2Ni9pcDZfZmxvd2xhYmVsLmMKQEAgLTAsMCArMSw3MDYgQEAKKy8qCisgKglpcDZfZmxvd2xhYmVsLmMJCUlQdjYgZmxvd2xhYmVsIG1hbmFnZXIuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L25kaXNjLmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L2lwNl9yb3V0ZS5oPgorI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgorI2luY2x1ZGUgPG5ldC9yYXd2Ni5oPgorI2luY2x1ZGUgPG5ldC9pY21wLmg+CisjaW5jbHVkZSA8bmV0L3RyYW5zcF92Ni5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBGTF9NSU5fTElOR0VSCTYJLyogTWluaW1hbCBsaW5nZXIuIEl0IGlzIHNldCB0byA2c2VjIHNwZWNpZmllZAorCQkJCSAgIGluIG9sZCBJUHY2IFJGQy4gV2VsbCwgaXQgd2FzIHJlYXNvbmFibGUgdmFsdWUuCisJCQkJICovCisjZGVmaW5lIEZMX01BWF9MSU5HRVIJNjAJLyogTWF4aW1hbCBsaW5nZXIgdGltZW91dCAqLworCisvKiBGTCBoYXNoIHRhYmxlICovCisKKyNkZWZpbmUgRkxfTUFYX1BFUl9TT0NLCTMyCisjZGVmaW5lIEZMX01BWF9TSVpFCTQwOTYKKyNkZWZpbmUgRkxfSEFTSF9NQVNLCTI1NQorI2RlZmluZSBGTF9IQVNIKGwpCShudG9obChsKSZGTF9IQVNIX01BU0spCisKK3N0YXRpYyBhdG9taWNfdCBmbF9zaXplID0gQVRPTUlDX0lOSVQoMCk7CitzdGF0aWMgc3RydWN0IGlwNl9mbG93bGFiZWwgKmZsX2h0W0ZMX0hBU0hfTUFTSysxXTsKKworc3RhdGljIHZvaWQgaXA2X2ZsX2djKHVuc2lnbmVkIGxvbmcgZHVtbXkpOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGlwNl9mbF9nY190aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKGlwNl9mbF9nYywgMCwgMCk7CisKKy8qIEZMIGhhc2ggdGFibGUgbG9jazogaXQgcHJvdGVjdHMgb25seSBvZiBHQyAqLworCitzdGF0aWMgREVGSU5FX1JXTE9DSyhpcDZfZmxfbG9jayk7CisKKy8qIEJpZyBzb2NrZXQgc29jayAqLworCitzdGF0aWMgREVGSU5FX1JXTE9DSyhpcDZfc2tfZmxfbG9jayk7CisKKworc3RhdGljIF9faW5saW5lX18gc3RydWN0IGlwNl9mbG93bGFiZWwgKiBfX2ZsX2xvb2t1cCh1MzIgbGFiZWwpCit7CisJc3RydWN0IGlwNl9mbG93bGFiZWwgKmZsOworCisJZm9yIChmbD1mbF9odFtGTF9IQVNIKGxhYmVsKV07IGZsOyBmbCA9IGZsLT5uZXh0KSB7CisJCWlmIChmbC0+bGFiZWwgPT0gbGFiZWwpCisJCQlyZXR1cm4gZmw7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGlwNl9mbG93bGFiZWwgKiBmbF9sb29rdXAodTMyIGxhYmVsKQoreworCXN0cnVjdCBpcDZfZmxvd2xhYmVsICpmbDsKKworCXJlYWRfbG9ja19iaCgmaXA2X2ZsX2xvY2spOworCWZsID0gX19mbF9sb29rdXAobGFiZWwpOworCWlmIChmbCkKKwkJYXRvbWljX2luYygmZmwtPnVzZXJzKTsKKwlyZWFkX3VubG9ja19iaCgmaXA2X2ZsX2xvY2spOworCXJldHVybiBmbDsKK30KKworCitzdGF0aWMgdm9pZCBmbF9mcmVlKHN0cnVjdCBpcDZfZmxvd2xhYmVsICpmbCkKK3sKKwlpZiAoZmwpCisJCWtmcmVlKGZsLT5vcHQpOworCWtmcmVlKGZsKTsKK30KKworc3RhdGljIHZvaWQgZmxfcmVsZWFzZShzdHJ1Y3QgaXA2X2Zsb3dsYWJlbCAqZmwpCit7CisJd3JpdGVfbG9ja19iaCgmaXA2X2ZsX2xvY2spOworCisJZmwtPmxhc3R1c2UgPSBqaWZmaWVzOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZmbC0+dXNlcnMpKSB7CisJCXVuc2lnbmVkIGxvbmcgdHRkID0gZmwtPmxhc3R1c2UgKyBmbC0+bGluZ2VyOworCQlpZiAodGltZV9hZnRlcih0dGQsIGZsLT5leHBpcmVzKSkKKwkJCWZsLT5leHBpcmVzID0gdHRkOworCQl0dGQgPSBmbC0+ZXhwaXJlczsKKwkJaWYgKGZsLT5vcHQgJiYgZmwtPnNoYXJlID09IElQVjZfRkxfU19FWENMKSB7CisJCQlzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdCA9IGZsLT5vcHQ7CisJCQlmbC0+b3B0ID0gTlVMTDsKKwkJCWtmcmVlKG9wdCk7CisJCX0KKwkJaWYgKCF0aW1lcl9wZW5kaW5nKCZpcDZfZmxfZ2NfdGltZXIpIHx8CisJCSAgICB0aW1lX2FmdGVyKGlwNl9mbF9nY190aW1lci5leHBpcmVzLCB0dGQpKQorCQkJbW9kX3RpbWVyKCZpcDZfZmxfZ2NfdGltZXIsIHR0ZCk7CisJfQorCisJd3JpdGVfdW5sb2NrX2JoKCZpcDZfZmxfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGlwNl9mbF9nYyh1bnNpZ25lZCBsb25nIGR1bW15KQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKwl1bnNpZ25lZCBsb25nIHNjaGVkID0gMDsKKworCXdyaXRlX2xvY2soJmlwNl9mbF9sb2NrKTsKKworCWZvciAoaT0wOyBpPD1GTF9IQVNIX01BU0s7IGkrKykgeworCQlzdHJ1Y3QgaXA2X2Zsb3dsYWJlbCAqZmwsICoqZmxwOworCQlmbHAgPSAmZmxfaHRbaV07CisJCXdoaWxlICgoZmw9KmZscCkgIT0gTlVMTCkgeworCQkJaWYgKGF0b21pY19yZWFkKCZmbC0+dXNlcnMpID09IDApIHsKKwkJCQl1bnNpZ25lZCBsb25nIHR0ZCA9IGZsLT5sYXN0dXNlICsgZmwtPmxpbmdlcjsKKwkJCQlpZiAodGltZV9hZnRlcih0dGQsIGZsLT5leHBpcmVzKSkKKwkJCQkJZmwtPmV4cGlyZXMgPSB0dGQ7CisJCQkJdHRkID0gZmwtPmV4cGlyZXM7CisJCQkJaWYgKHRpbWVfYWZ0ZXJfZXEobm93LCB0dGQpKSB7CisJCQkJCSpmbHAgPSBmbC0+bmV4dDsKKwkJCQkJZmxfZnJlZShmbCk7CisJCQkJCWF0b21pY19kZWMoJmZsX3NpemUpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKCFzY2hlZCB8fCB0aW1lX2JlZm9yZSh0dGQsIHNjaGVkKSkKKwkJCQkJc2NoZWQgPSB0dGQ7CisJCQl9CisJCQlmbHAgPSAmZmwtPm5leHQ7CisJCX0KKwl9CisJaWYgKCFzY2hlZCAmJiBhdG9taWNfcmVhZCgmZmxfc2l6ZSkpCisJCXNjaGVkID0gbm93ICsgRkxfTUFYX0xJTkdFUjsKKwlpZiAoc2NoZWQpIHsKKwkJaXA2X2ZsX2djX3RpbWVyLmV4cGlyZXMgPSBzY2hlZDsKKwkJYWRkX3RpbWVyKCZpcDZfZmxfZ2NfdGltZXIpOworCX0KKwl3cml0ZV91bmxvY2soJmlwNl9mbF9sb2NrKTsKK30KKworc3RhdGljIGludCBmbF9pbnRlcm4oc3RydWN0IGlwNl9mbG93bGFiZWwgKmZsLCBfX3UzMiBsYWJlbCkKK3sKKwlmbC0+bGFiZWwgPSBsYWJlbCAmIElQVjZfRkxPV0xBQkVMX01BU0s7CisKKwl3cml0ZV9sb2NrX2JoKCZpcDZfZmxfbG9jayk7CisJaWYgKGxhYmVsID09IDApIHsKKwkJZm9yICg7OykgeworCQkJZmwtPmxhYmVsID0gaHRvbmwobmV0X3JhbmRvbSgpKSZJUFY2X0ZMT1dMQUJFTF9NQVNLOworCQkJaWYgKGZsLT5sYWJlbCkgeworCQkJCXN0cnVjdCBpcDZfZmxvd2xhYmVsICpsZmw7CisJCQkJbGZsID0gX19mbF9sb29rdXAoZmwtPmxhYmVsKTsKKwkJCQlpZiAobGZsID09IE5VTEwpCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJZmwtPmxhc3R1c2UgPSBqaWZmaWVzOworCWZsLT5uZXh0ID0gZmxfaHRbRkxfSEFTSChmbC0+bGFiZWwpXTsKKwlmbF9odFtGTF9IQVNIKGZsLT5sYWJlbCldID0gZmw7CisJYXRvbWljX2luYygmZmxfc2l6ZSk7CisJd3JpdGVfdW5sb2NrX2JoKCZpcDZfZmxfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKworCisvKiBTb2NrZXQgZmxvd2xhYmVsIGxpc3RzICovCisKK3N0cnVjdCBpcDZfZmxvd2xhYmVsICogZmw2X3NvY2tfbG9va3VwKHN0cnVjdCBzb2NrICpzaywgdTMyIGxhYmVsKQoreworCXN0cnVjdCBpcHY2X2ZsX3NvY2tsaXN0ICpzZmw7CisJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOworCisJbGFiZWwgJj0gSVBWNl9GTE9XTEFCRUxfTUFTSzsKKworCWZvciAoc2ZsPW5wLT5pcHY2X2ZsX2xpc3Q7IHNmbDsgc2ZsID0gc2ZsLT5uZXh0KSB7CisJCXN0cnVjdCBpcDZfZmxvd2xhYmVsICpmbCA9IHNmbC0+Zmw7CisJCWlmIChmbC0+bGFiZWwgPT0gbGFiZWwpIHsKKwkJCWZsLT5sYXN0dXNlID0gamlmZmllczsKKwkJCWF0b21pY19pbmMoJmZsLT51c2Vycyk7CisJCQlyZXR1cm4gZmw7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgZmw2X2ZyZWVfc29ja2xpc3Qoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKKwlzdHJ1Y3QgaXB2Nl9mbF9zb2NrbGlzdCAqc2ZsOworCisJd2hpbGUgKChzZmwgPSBucC0+aXB2Nl9mbF9saXN0KSAhPSBOVUxMKSB7CisJCW5wLT5pcHY2X2ZsX2xpc3QgPSBzZmwtPm5leHQ7CisJCWZsX3JlbGVhc2Uoc2ZsLT5mbCk7CisJCWtmcmVlKHNmbCk7CisJfQorfQorCisvKiBTZXJ2aWNlIHJvdXRpbmVzICovCisKKworLyoKKyAgIEl0IGlzIHRoZSBvbmx5IGRpZmZpY3VsdCBwbGFjZS4gZmxvd2xhYmVsIGVuZm9yY2VzIGVxdWFsIGhlYWRlcnMKKyAgIGJlZm9yZSBhbmQgaW5jbHVkaW5nIHJvdXRpbmcgaGVhZGVyLCBob3dldmVyIHVzZXIgbWF5IHN1cHBseSBvcHRpb25zCisgICBmb2xsb3dpbmcgcnRoZHIuCisgKi8KKworc3RydWN0IGlwdjZfdHhvcHRpb25zICpmbDZfbWVyZ2Vfb3B0aW9ucyhzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKiBvcHRfc3BhY2UsCisJCQkJCSBzdHJ1Y3QgaXA2X2Zsb3dsYWJlbCAqIGZsLAorCQkJCQkgc3RydWN0IGlwdjZfdHhvcHRpb25zICogZm9wdCkKK3sKKwlzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKiBmbF9vcHQgPSBmbC0+b3B0OworCisJaWYgKGZvcHQgPT0gTlVMTCB8fCBmb3B0LT5vcHRfZmxlbiA9PSAwKQorCQlyZXR1cm4gZmxfb3B0OworCisJaWYgKGZsX29wdCAhPSBOVUxMKSB7CisJCW9wdF9zcGFjZS0+aG9wb3B0ID0gZmxfb3B0LT5ob3BvcHQ7CisJCW9wdF9zcGFjZS0+ZHN0MG9wdCA9IGZsX29wdC0+ZHN0MG9wdDsKKwkJb3B0X3NwYWNlLT5zcmNydCA9IGZsX29wdC0+c3JjcnQ7CisJCW9wdF9zcGFjZS0+b3B0X25mbGVuID0gZmxfb3B0LT5vcHRfbmZsZW47CisJfSBlbHNlIHsKKwkJaWYgKGZvcHQtPm9wdF9uZmxlbiA9PSAwKQorCQkJcmV0dXJuIGZvcHQ7CisJCW9wdF9zcGFjZS0+aG9wb3B0ID0gTlVMTDsKKwkJb3B0X3NwYWNlLT5kc3Qwb3B0ID0gTlVMTDsKKwkJb3B0X3NwYWNlLT5zcmNydCA9IE5VTEw7CisJCW9wdF9zcGFjZS0+b3B0X25mbGVuID0gMDsKKwl9CisJb3B0X3NwYWNlLT5kc3Qxb3B0ID0gZm9wdC0+ZHN0MW9wdDsKKwlvcHRfc3BhY2UtPmF1dGggPSBmb3B0LT5hdXRoOworCW9wdF9zcGFjZS0+b3B0X2ZsZW4gPSBmb3B0LT5vcHRfZmxlbjsKKwlyZXR1cm4gb3B0X3NwYWNlOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjaGVja19saW5nZXIodW5zaWduZWQgbG9uZyB0dGwpCit7CisJaWYgKHR0bCA8IEZMX01JTl9MSU5HRVIpCisJCXJldHVybiBGTF9NSU5fTElOR0VSKkhaOworCWlmICh0dGwgPiBGTF9NQVhfTElOR0VSICYmICFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gdHRsKkhaOworfQorCitzdGF0aWMgaW50IGZsNl9yZW5ldyhzdHJ1Y3QgaXA2X2Zsb3dsYWJlbCAqZmwsIHVuc2lnbmVkIGxvbmcgbGluZ2VyLCB1bnNpZ25lZCBsb25nIGV4cGlyZXMpCit7CisJbGluZ2VyID0gY2hlY2tfbGluZ2VyKGxpbmdlcik7CisJaWYgKCFsaW5nZXIpCisJCXJldHVybiAtRVBFUk07CisJZXhwaXJlcyA9IGNoZWNrX2xpbmdlcihleHBpcmVzKTsKKwlpZiAoIWV4cGlyZXMpCisJCXJldHVybiAtRVBFUk07CisJZmwtPmxhc3R1c2UgPSBqaWZmaWVzOworCWlmICh0aW1lX2JlZm9yZShmbC0+bGluZ2VyLCBsaW5nZXIpKQorCQlmbC0+bGluZ2VyID0gbGluZ2VyOworCWlmICh0aW1lX2JlZm9yZShleHBpcmVzLCBmbC0+bGluZ2VyKSkKKwkJZXhwaXJlcyA9IGZsLT5saW5nZXI7CisJaWYgKHRpbWVfYmVmb3JlKGZsLT5leHBpcmVzLCBmbC0+bGFzdHVzZSArIGV4cGlyZXMpKQorCQlmbC0+ZXhwaXJlcyA9IGZsLT5sYXN0dXNlICsgZXhwaXJlczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpcDZfZmxvd2xhYmVsICoKK2ZsX2NyZWF0ZShzdHJ1Y3QgaW42X2Zsb3dsYWJlbF9yZXEgKmZyZXEsIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4sIGludCAqZXJyX3ApCit7CisJc3RydWN0IGlwNl9mbG93bGFiZWwgKmZsOworCWludCBvbGVuOworCWludCBhZGRyX3R5cGU7CisJaW50IGVycjsKKworCWVyciA9IC1FTk9NRU07CisJZmwgPSBrbWFsbG9jKHNpemVvZigqZmwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZmwgPT0gTlVMTCkKKwkJZ290byBkb25lOworCW1lbXNldChmbCwgMCwgc2l6ZW9mKCpmbCkpOworCisJb2xlbiA9IG9wdGxlbiAtIENNU0dfQUxJR04oc2l6ZW9mKCpmcmVxKSk7CisJaWYgKG9sZW4gPiAwKSB7CisJCXN0cnVjdCBtc2doZHIgbXNnOworCQlzdHJ1Y3QgZmxvd2kgZmxvd2k7CisJCWludCBqdW5rOworCisJCWVyciA9IC1FTk9NRU07CisJCWZsLT5vcHQgPSBrbWFsbG9jKHNpemVvZigqZmwtPm9wdCkgKyBvbGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGZsLT5vcHQgPT0gTlVMTCkKKwkJCWdvdG8gZG9uZTsKKworCQltZW1zZXQoZmwtPm9wdCwgMCwgc2l6ZW9mKCpmbC0+b3B0KSk7CisJCWZsLT5vcHQtPnRvdF9sZW4gPSBzaXplb2YoKmZsLT5vcHQpICsgb2xlbjsKKwkJZXJyID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGZsLT5vcHQrMSwgb3B0dmFsK0NNU0dfQUxJR04oc2l6ZW9mKCpmcmVxKSksIG9sZW4pKQorCQkJZ290byBkb25lOworCisJCW1zZy5tc2dfY29udHJvbGxlbiA9IG9sZW47CisJCW1zZy5tc2dfY29udHJvbCA9ICh2b2lkKikoZmwtPm9wdCsxKTsKKwkJZmxvd2kub2lmID0gMDsKKworCQllcnIgPSBkYXRhZ3JhbV9zZW5kX2N0bCgmbXNnLCAmZmxvd2ksIGZsLT5vcHQsICZqdW5rKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZG9uZTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJaWYgKGZsLT5vcHQtPm9wdF9mbGVuKQorCQkJZ290byBkb25lOworCQlpZiAoZmwtPm9wdC0+b3B0X25mbGVuID09IDApIHsKKwkJCWtmcmVlKGZsLT5vcHQpOworCQkJZmwtPm9wdCA9IE5VTEw7CisJCX0KKwl9CisKKwlmbC0+ZXhwaXJlcyA9IGppZmZpZXM7CisJZXJyID0gZmw2X3JlbmV3KGZsLCBmcmVxLT5mbHJfbGluZ2VyLCBmcmVxLT5mbHJfZXhwaXJlcyk7CisJaWYgKGVycikKKwkJZ290byBkb25lOworCWZsLT5zaGFyZSA9IGZyZXEtPmZscl9zaGFyZTsKKwlhZGRyX3R5cGUgPSBpcHY2X2FkZHJfdHlwZSgmZnJlcS0+ZmxyX2RzdCk7CisJaWYgKChhZGRyX3R5cGUmSVBWNl9BRERSX01BUFBFRCkKKwkgICAgfHwgYWRkcl90eXBlID09IElQVjZfQUREUl9BTlkpCisJCWdvdG8gZG9uZTsKKwlpcHY2X2FkZHJfY29weSgmZmwtPmRzdCwgJmZyZXEtPmZscl9kc3QpOworCWF0b21pY19zZXQoJmZsLT51c2VycywgMSk7CisJc3dpdGNoIChmbC0+c2hhcmUpIHsKKwljYXNlIElQVjZfRkxfU19FWENMOgorCWNhc2UgSVBWNl9GTF9TX0FOWToKKwkJYnJlYWs7CisJY2FzZSBJUFY2X0ZMX1NfUFJPQ0VTUzoKKwkJZmwtPm93bmVyID0gY3VycmVudC0+cGlkOworCQlicmVhazsKKwljYXNlIElQVjZfRkxfU19VU0VSOgorCQlmbC0+b3duZXIgPSBjdXJyZW50LT5ldWlkOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCXJldHVybiBmbDsKKworZG9uZToKKwlmbF9mcmVlKGZsKTsKKwkqZXJyX3AgPSBlcnI7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgbWVtX2NoZWNrKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CisJc3RydWN0IGlwdjZfZmxfc29ja2xpc3QgKnNmbDsKKwlpbnQgcm9vbSA9IEZMX01BWF9TSVpFIC0gYXRvbWljX3JlYWQoJmZsX3NpemUpOworCWludCBjb3VudCA9IDA7CisKKwlpZiAocm9vbSA+IEZMX01BWF9TSVpFIC0gRkxfTUFYX1BFUl9TT0NLKQorCQlyZXR1cm4gMDsKKworCWZvciAoc2ZsID0gbnAtPmlwdjZfZmxfbGlzdDsgc2ZsOyBzZmwgPSBzZmwtPm5leHQpCisJCWNvdW50Kys7CisKKwlpZiAocm9vbSA8PSAwIHx8CisJICAgICgoY291bnQgPj0gRkxfTUFYX1BFUl9TT0NLIHx8CisJICAgICAoY291bnQgPiAwICYmIHJvb20gPCBGTF9NQVhfU0laRS8yKSB8fCByb29tIDwgRkxfTUFYX1NJWkUvNCkKKwkgICAgICYmICFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSkKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB2Nl9oZHJfY21wKHN0cnVjdCBpcHY2X29wdF9oZHIgKmgxLCBzdHJ1Y3QgaXB2Nl9vcHRfaGRyICpoMikKK3sKKwlpZiAoaDEgPT0gaDIpCisJCXJldHVybiAwOworCWlmIChoMSA9PSBOVUxMIHx8IGgyID09IE5VTEwpCisJCXJldHVybiAxOworCWlmIChoMS0+aGRybGVuICE9IGgyLT5oZHJsZW4pCisJCXJldHVybiAxOworCXJldHVybiBtZW1jbXAoaDErMSwgaDIrMSwgKChoMS0+aGRybGVuKzEpPDwzKSAtIHNpemVvZigqaDEpKTsKK30KKworc3RhdGljIGludCBpcHY2X29wdF9jbXAoc3RydWN0IGlwdjZfdHhvcHRpb25zICpvMSwgc3RydWN0IGlwdjZfdHhvcHRpb25zICpvMikKK3sKKwlpZiAobzEgPT0gbzIpCisJCXJldHVybiAwOworCWlmIChvMSA9PSBOVUxMIHx8IG8yID09IE5VTEwpCisJCXJldHVybiAxOworCWlmIChvMS0+b3B0X25mbGVuICE9IG8yLT5vcHRfbmZsZW4pCisJCXJldHVybiAxOworCWlmIChpcHY2X2hkcl9jbXAobzEtPmhvcG9wdCwgbzItPmhvcG9wdCkpCisJCXJldHVybiAxOworCWlmIChpcHY2X2hkcl9jbXAobzEtPmRzdDBvcHQsIG8yLT5kc3Qwb3B0KSkKKwkJcmV0dXJuIDE7CisJaWYgKGlwdjZfaGRyX2NtcCgoc3RydWN0IGlwdjZfb3B0X2hkciAqKW8xLT5zcmNydCwgKHN0cnVjdCBpcHY2X29wdF9oZHIgKilvMi0+c3JjcnQpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IGlwdjZfZmxvd2xhYmVsX29wdChzdHJ1Y3Qgc29jayAqc2ssIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CisJc3RydWN0IGluNl9mbG93bGFiZWxfcmVxIGZyZXE7CisJc3RydWN0IGlwdjZfZmxfc29ja2xpc3QgKnNmbDE9TlVMTDsKKwlzdHJ1Y3QgaXB2Nl9mbF9zb2NrbGlzdCAqc2ZsLCAqKnNmbHA7CisJc3RydWN0IGlwNl9mbG93bGFiZWwgKmZsOworCisJaWYgKG9wdGxlbiA8IHNpemVvZihmcmVxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmZyZXEsIG9wdHZhbCwgc2l6ZW9mKGZyZXEpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKGZyZXEuZmxyX2FjdGlvbikgeworCWNhc2UgSVBWNl9GTF9BX1BVVDoKKwkJd3JpdGVfbG9ja19iaCgmaXA2X3NrX2ZsX2xvY2spOworCQlmb3IgKHNmbHAgPSAmbnAtPmlwdjZfZmxfbGlzdDsgKHNmbD0qc2ZscCkhPU5VTEw7IHNmbHAgPSAmc2ZsLT5uZXh0KSB7CisJCQlpZiAoc2ZsLT5mbC0+bGFiZWwgPT0gZnJlcS5mbHJfbGFiZWwpIHsKKwkJCQlpZiAoZnJlcS5mbHJfbGFiZWwgPT0gKG5wLT5mbG93X2xhYmVsJklQVjZfRkxPV0xBQkVMX01BU0spKQorCQkJCQlucC0+Zmxvd19sYWJlbCAmPSB+SVBWNl9GTE9XTEFCRUxfTUFTSzsKKwkJCQkqc2ZscCA9IHNmbC0+bmV4dDsKKwkJCQl3cml0ZV91bmxvY2tfYmgoJmlwNl9za19mbF9sb2NrKTsKKwkJCQlmbF9yZWxlYXNlKHNmbC0+ZmwpOworCQkJCWtmcmVlKHNmbCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJd3JpdGVfdW5sb2NrX2JoKCZpcDZfc2tfZmxfbG9jayk7CisJCXJldHVybiAtRVNSQ0g7CisKKwljYXNlIElQVjZfRkxfQV9SRU5FVzoKKwkJcmVhZF9sb2NrX2JoKCZpcDZfc2tfZmxfbG9jayk7CisJCWZvciAoc2ZsID0gbnAtPmlwdjZfZmxfbGlzdDsgc2ZsOyBzZmwgPSBzZmwtPm5leHQpIHsKKwkJCWlmIChzZmwtPmZsLT5sYWJlbCA9PSBmcmVxLmZscl9sYWJlbCkgeworCQkJCWVyciA9IGZsNl9yZW5ldyhzZmwtPmZsLCBmcmVxLmZscl9saW5nZXIsIGZyZXEuZmxyX2V4cGlyZXMpOworCQkJCXJlYWRfdW5sb2NrX2JoKCZpcDZfc2tfZmxfbG9jayk7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJfQorCQlyZWFkX3VubG9ja19iaCgmaXA2X3NrX2ZsX2xvY2spOworCisJCWlmIChmcmVxLmZscl9zaGFyZSA9PSBJUFY2X0ZMX1NfTk9ORSAmJiBjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlmbCA9IGZsX2xvb2t1cChmcmVxLmZscl9sYWJlbCk7CisJCQlpZiAoZmwpIHsKKwkJCQllcnIgPSBmbDZfcmVuZXcoZmwsIGZyZXEuZmxyX2xpbmdlciwgZnJlcS5mbHJfZXhwaXJlcyk7CisJCQkJZmxfcmVsZWFzZShmbCk7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gLUVTUkNIOworCisJY2FzZSBJUFY2X0ZMX0FfR0VUOgorCQlpZiAoZnJlcS5mbHJfbGFiZWwgJiB+SVBWNl9GTE9XTEFCRUxfTUFTSykKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWZsID0gZmxfY3JlYXRlKCZmcmVxLCBvcHR2YWwsIG9wdGxlbiwgJmVycik7CisJCWlmIChmbCA9PSBOVUxMKQorCQkJcmV0dXJuIGVycjsKKwkJc2ZsMSA9IGttYWxsb2Moc2l6ZW9mKCpzZmwxKSwgR0ZQX0tFUk5FTCk7CisKKwkJaWYgKGZyZXEuZmxyX2xhYmVsKSB7CisJCQlzdHJ1Y3QgaXA2X2Zsb3dsYWJlbCAqZmwxID0gTlVMTDsKKworCQkJZXJyID0gLUVFWElTVDsKKwkJCXJlYWRfbG9ja19iaCgmaXA2X3NrX2ZsX2xvY2spOworCQkJZm9yIChzZmwgPSBucC0+aXB2Nl9mbF9saXN0OyBzZmw7IHNmbCA9IHNmbC0+bmV4dCkgeworCQkJCWlmIChzZmwtPmZsLT5sYWJlbCA9PSBmcmVxLmZscl9sYWJlbCkgeworCQkJCQlpZiAoZnJlcS5mbHJfZmxhZ3MmSVBWNl9GTF9GX0VYQ0wpIHsKKwkJCQkJCXJlYWRfdW5sb2NrX2JoKCZpcDZfc2tfZmxfbG9jayk7CisJCQkJCQlnb3RvIGRvbmU7CisJCQkJCX0KKwkJCQkJZmwxID0gc2ZsLT5mbDsKKwkJCQkJYXRvbWljX2luYygmZmwtPnVzZXJzKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJcmVhZF91bmxvY2tfYmgoJmlwNl9za19mbF9sb2NrKTsKKworCQkJaWYgKGZsMSA9PSBOVUxMKQorCQkJCWZsMSA9IGZsX2xvb2t1cChmcmVxLmZscl9sYWJlbCk7CisJCQlpZiAoZmwxKSB7CisJCQkJZXJyID0gLUVFWElTVDsKKwkJCQlpZiAoZnJlcS5mbHJfZmxhZ3MmSVBWNl9GTF9GX0VYQ0wpCisJCQkJCWdvdG8gcmVsZWFzZTsKKwkJCQllcnIgPSAtRVBFUk07CisJCQkJaWYgKGZsMS0+c2hhcmUgPT0gSVBWNl9GTF9TX0VYQ0wgfHwKKwkJCQkgICAgZmwxLT5zaGFyZSAhPSBmbC0+c2hhcmUgfHwKKwkJCQkgICAgZmwxLT5vd25lciAhPSBmbC0+b3duZXIpCisJCQkJCWdvdG8gcmVsZWFzZTsKKworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJaWYgKCFpcHY2X2FkZHJfZXF1YWwoJmZsMS0+ZHN0LCAmZmwtPmRzdCkgfHwKKwkJCQkgICAgaXB2Nl9vcHRfY21wKGZsMS0+b3B0LCBmbC0+b3B0KSkKKwkJCQkJZ290byByZWxlYXNlOworCisJCQkJZXJyID0gLUVOT01FTTsKKwkJCQlpZiAoc2ZsMSA9PSBOVUxMKQorCQkJCQlnb3RvIHJlbGVhc2U7CisJCQkJaWYgKGZsLT5saW5nZXIgPiBmbDEtPmxpbmdlcikKKwkJCQkJZmwxLT5saW5nZXIgPSBmbC0+bGluZ2VyOworCQkJCWlmICgobG9uZykoZmwtPmV4cGlyZXMgLSBmbDEtPmV4cGlyZXMpID4gMCkKKwkJCQkJZmwxLT5leHBpcmVzID0gZmwtPmV4cGlyZXM7CisJCQkJd3JpdGVfbG9ja19iaCgmaXA2X3NrX2ZsX2xvY2spOworCQkJCXNmbDEtPmZsID0gZmwxOworCQkJCXNmbDEtPm5leHQgPSBucC0+aXB2Nl9mbF9saXN0OworCQkJCW5wLT5pcHY2X2ZsX2xpc3QgPSBzZmwxOworCQkJCXdyaXRlX3VubG9ja19iaCgmaXA2X3NrX2ZsX2xvY2spOworCQkJCWZsX2ZyZWUoZmwpOworCQkJCXJldHVybiAwOworCityZWxlYXNlOgorCQkJCWZsX3JlbGVhc2UoZmwxKTsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCX0KKwkJZXJyID0gLUVOT0VOVDsKKwkJaWYgKCEoZnJlcS5mbHJfZmxhZ3MmSVBWNl9GTF9GX0NSRUFURSkpCisJCQlnb3RvIGRvbmU7CisKKwkJZXJyID0gLUVOT01FTTsKKwkJaWYgKHNmbDEgPT0gTlVMTCB8fCAoZXJyID0gbWVtX2NoZWNrKHNrKSkgIT0gMCkKKwkJCWdvdG8gZG9uZTsKKworCQllcnIgPSBmbF9pbnRlcm4oZmwsIGZyZXEuZmxyX2xhYmVsKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZG9uZTsKKworCQkvKiBEbyBub3QgY2hlY2sgZm9yIGZhdWx0ICovCisJCWlmICghZnJlcS5mbHJfbGFiZWwpCisJCQljb3B5X3RvX3VzZXIoJigoc3RydWN0IGluNl9mbG93bGFiZWxfcmVxIF9fdXNlciAqKSBvcHR2YWwpLT5mbHJfbGFiZWwsCisJCQkJICAgICAmZmwtPmxhYmVsLCBzaXplb2YoZmwtPmxhYmVsKSk7CisKKwkJc2ZsMS0+ZmwgPSBmbDsKKwkJc2ZsMS0+bmV4dCA9IG5wLT5pcHY2X2ZsX2xpc3Q7CisJCW5wLT5pcHY2X2ZsX2xpc3QgPSBzZmwxOworCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworZG9uZToKKwlmbF9mcmVlKGZsKTsKKwlrZnJlZShzZmwxKTsKKwlyZXR1cm4gZXJyOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworc3RydWN0IGlwNmZsX2l0ZXJfc3RhdGUgeworCWludCBidWNrZXQ7Cit9OworCisjZGVmaW5lIGlwNmZsX3NlcV9wcml2YXRlKHNlcSkJKChzdHJ1Y3QgaXA2ZmxfaXRlcl9zdGF0ZSAqKShzZXEpLT5wcml2YXRlKQorCitzdGF0aWMgc3RydWN0IGlwNl9mbG93bGFiZWwgKmlwNmZsX2dldF9maXJzdChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwlzdHJ1Y3QgaXA2X2Zsb3dsYWJlbCAqZmwgPSBOVUxMOworCXN0cnVjdCBpcDZmbF9pdGVyX3N0YXRlICpzdGF0ZSA9IGlwNmZsX3NlcV9wcml2YXRlKHNlcSk7CisKKwlmb3IgKHN0YXRlLT5idWNrZXQgPSAwOyBzdGF0ZS0+YnVja2V0IDw9IEZMX0hBU0hfTUFTSzsgKytzdGF0ZS0+YnVja2V0KSB7CisJCWlmIChmbF9odFtzdGF0ZS0+YnVja2V0XSkgeworCQkJZmwgPSBmbF9odFtzdGF0ZS0+YnVja2V0XTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBmbDsKK30KKworc3RhdGljIHN0cnVjdCBpcDZfZmxvd2xhYmVsICppcDZmbF9nZXRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IGlwNl9mbG93bGFiZWwgKmZsKQoreworCXN0cnVjdCBpcDZmbF9pdGVyX3N0YXRlICpzdGF0ZSA9IGlwNmZsX3NlcV9wcml2YXRlKHNlcSk7CisKKwlmbCA9IGZsLT5uZXh0OworCXdoaWxlICghZmwpIHsKKwkJaWYgKCsrc3RhdGUtPmJ1Y2tldCA8PSBGTF9IQVNIX01BU0spCisJCQlmbCA9IGZsX2h0W3N0YXRlLT5idWNrZXRdOworCX0KKwlyZXR1cm4gZmw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXA2X2Zsb3dsYWJlbCAqaXA2ZmxfZ2V0X2lkeChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90IHBvcykKK3sKKwlzdHJ1Y3QgaXA2X2Zsb3dsYWJlbCAqZmwgPSBpcDZmbF9nZXRfZmlyc3Qoc2VxKTsKKwlpZiAoZmwpCisJCXdoaWxlIChwb3MgJiYgKGZsID0gaXA2ZmxfZ2V0X25leHQoc2VxLCBmbCkpICE9IE5VTEwpCisJCQktLXBvczsKKwlyZXR1cm4gcG9zID8gTlVMTCA6IGZsOworfQorCitzdGF0aWMgdm9pZCAqaXA2Zmxfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlyZWFkX2xvY2tfYmgoJmlwNl9mbF9sb2NrKTsKKwlyZXR1cm4gKnBvcyA/IGlwNmZsX2dldF9pZHgoc2VxLCAqcG9zIC0gMSkgOiBTRVFfU1RBUlRfVE9LRU47Cit9CisKK3N0YXRpYyB2b2lkICppcDZmbF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGlwNl9mbG93bGFiZWwgKmZsOworCisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlmbCA9IGlwNmZsX2dldF9maXJzdChzZXEpOworCWVsc2UKKwkJZmwgPSBpcDZmbF9nZXRfbmV4dChzZXEsIHYpOworCSsrKnBvczsKKwlyZXR1cm4gZmw7Cit9CisKK3N0YXRpYyB2b2lkIGlwNmZsX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXJlYWRfdW5sb2NrX2JoKCZpcDZfZmxfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGlwNmZsX2ZsX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgaXA2X2Zsb3dsYWJlbCAqZmwpCit7CisJd2hpbGUoZmwpIHsKKwkJc2VxX3ByaW50ZihzZXEsCisJCQkgICAiJTA1WCAlLTFkICUtNmQgJS02ZCAlLTZsZCAlLThsZCAiCisJCQkgICAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgorCQkJICAgIiUtNGRcbiIsCisJCQkgICAodW5zaWduZWQpbnRvaGwoZmwtPmxhYmVsKSwKKwkJCSAgIGZsLT5zaGFyZSwKKwkJCSAgICh1bnNpZ25lZClmbC0+b3duZXIsCisJCQkgICBhdG9taWNfcmVhZCgmZmwtPnVzZXJzKSwKKwkJCSAgIGZsLT5saW5nZXIvSFosCisJCQkgICAobG9uZykoZmwtPmV4cGlyZXMgLSBqaWZmaWVzKS9IWiwKKwkJCSAgIE5JUDYoZmwtPmRzdCksCisJCQkgICBmbC0+b3B0ID8gZmwtPm9wdC0+b3B0X25mbGVuIDogMCk7CisJCWZsID0gZmwtPm5leHQ7CisJfQorfQorCitzdGF0aWMgaW50IGlwNmZsX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKKwkJc2VxX3B1dHMoc2VxLCAiTGFiZWwgUyBPd25lciAgVXNlcnMgIExpbmdlciBFeHBpcmVzICAiCisJCQkgICAgICAiRHN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0XG4iKTsKKwllbHNlCisJCWlwNmZsX2ZsX3NlcV9zaG93KHNlcSwgdik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaXA2Zmxfc2VxX29wcyA9IHsKKwkuc3RhcnQJPQlpcDZmbF9zZXFfc3RhcnQsCisJLm5leHQJPQlpcDZmbF9zZXFfbmV4dCwKKwkuc3RvcAk9CWlwNmZsX3NlcV9zdG9wLAorCS5zaG93CT0JaXA2Zmxfc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IGlwNmZsX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzZXFfZmlsZSAqc2VxOworCWludCByYyA9IC1FTk9NRU07CisJc3RydWN0IGlwNmZsX2l0ZXJfc3RhdGUgKnMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOworCisJaWYgKCFzKQorCQlnb3RvIG91dDsKKworCXJjID0gc2VxX29wZW4oZmlsZSwgJmlwNmZsX3NlcV9vcHMpOworCWlmIChyYykKKwkJZ290byBvdXRfa2ZyZWU7CisKKwlzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc2VxLT5wcml2YXRlID0gczsKKwltZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7CitvdXQ6CisJcmV0dXJuIHJjOworb3V0X2tmcmVlOgorCWtmcmVlKHMpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcDZmbF9zZXFfZm9wcyA9IHsKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCisJLm9wZW4JCT0JaXA2Zmxfc2VxX29wZW4sCisJLnJlYWQJCT0Jc2VxX3JlYWQsCisJLmxsc2VlawkJPQlzZXFfbHNlZWssCisJLnJlbGVhc2UJPQlzZXFfcmVsZWFzZV9wcml2YXRlLAorfTsKKyNlbmRpZgorCisKK3ZvaWQgaXA2X2Zsb3dsYWJlbF9pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlwcm9jX25ldF9mb3BzX2NyZWF0ZSgiaXA2X2Zsb3dsYWJlbCIsIFNfSVJVR08sICZpcDZmbF9zZXFfZm9wcyk7CisjZW5kaWYKK30KKwordm9pZCBpcDZfZmxvd2xhYmVsX2NsZWFudXAodm9pZCkKK3sKKwlkZWxfdGltZXIoJmlwNl9mbF9nY190aW1lcik7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlwcm9jX25ldF9yZW1vdmUoImlwNl9mbG93bGFiZWwiKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X2lucHV0LmMgYi9uZXQvaXB2Ni9pcDZfaW5wdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjZmMTA3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvaXA2X2lucHV0LmMKQEAgLTAsMCArMSwyNjkgQEAKKy8qCisgKglJUHY2IGlucHV0CisgKglMaW51eCBJTkVUNiBpbXBsZW1lbnRhdGlvbiAKKyAqCisgKglBdXRob3JzOgorICoJUGVkcm8gUm9xdWUJCTxyb3F1ZUBkaS5mYy51bC5wdD4KKyAqCUlhbiBQLiBNb3JyaXMJCTxJLlAuTW9ycmlzQHNvdG9uLmFjLnVrPgorICoKKyAqCSRJZDogaXA2X2lucHV0LmMsdiAxLjE5IDIwMDAvMTIvMTMgMTg6MzE6NTAgZGF2ZW0gRXhwICQKKyAqCisgKglCYXNlZCBpbiBsaW51eC9uZXQvaXB2NC9pcF9pbnB1dC5jCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworLyogQ2hhbmdlcworICoKKyAqIAlNaXRzdXJ1IEtBTkRBIEBVU0FHSSBhbmQKKyAqIAlZT1NISUZVSkkgSGlkZWFraSBAVVNBR0k6IFJlbW92ZSBpcHY2X3BhcnNlX2V4dGhkcnMoKS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L2ljbXB2Ni5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYuaD4KKworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3NubXAuaD4KKworI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L3RyYW5zcF92Ni5oPgorI2luY2x1ZGUgPG5ldC9yYXd2Ni5oPgorI2luY2x1ZGUgPG5ldC9uZGlzYy5oPgorI2luY2x1ZGUgPG5ldC9pcDZfcm91dGUuaD4KKyNpbmNsdWRlIDxuZXQvYWRkcmNvbmYuaD4KKyNpbmNsdWRlIDxuZXQveGZybS5oPgorCisKKworc3RhdGljIGlubGluZSBpbnQgaXA2X3Jjdl9maW5pc2goIHN0cnVjdCBza19idWZmICpza2IpIAoreworCWlmIChza2ItPmRzdCA9PSBOVUxMKQorCQlpcDZfcm91dGVfaW5wdXQoc2tiKTsKKworCXJldHVybiBkc3RfaW5wdXQoc2tiKTsKK30KKworaW50IGlwdjZfcmN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBwYWNrZXRfdHlwZSAqcHQpCit7CisJc3RydWN0IGlwdjZoZHIgKmhkcjsKKwl1MzIgCQlwa3RfbGVuOworCisJaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09USEVSSE9TVCkKKwkJZ290byBkcm9wOworCisJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTlJFQ0VJVkVTKTsKKworCWlmICgoc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkRJU0NBUkRTKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBTdG9yZSBpbmNvbWluZyBkZXZpY2UgaW5kZXguIFdoZW4gdGhlIHBhY2tldCB3aWxsCisJICogYmUgcXVldWVkLCB3ZSBjYW5ub3QgcmVmZXIgdG8gc2tiLT5kZXYgYW55bW9yZS4KKwkgKgorCSAqIEJUVywgd2hlbiB3ZSBzZW5kIGEgcGFja2V0IGZvciBvdXIgb3duIGxvY2FsIGFkZHJlc3Mgb24gYQorCSAqIG5vbi1sb29wYmFjayBpbnRlcmZhY2UgKGUuZy4gZXRoWCksIGl0IGlzIGJlaW5nIGRlbGl2ZXJlZAorCSAqIHZpYSB0aGUgbG9vcGJhY2sgaW50ZXJmYWNlIChsbykgaGVyZTsgc2tiLT5kZXYgPSAmbG9vcGJhY2tfZGV2LgorCSAqIEl0LCBob3dldmVyLCBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyBpZiBpdCBpcyBiZWluZworCSAqIGFycml2ZWQgdmlhIHRoZSBzZW5kaW5nIGludGVyZmFjZSAoZXRoWCksIGJlY2F1c2Ugb2YgdGhlCisJICogbmF0dXJlIG9mIHNjb3BpbmcgYXJjaGl0ZWN0dXJlLiAtLXlvc2hmdWppCisJICovCisJSVA2Q0Ioc2tiKS0+aWlmID0gc2tiLT5kc3QgPyAoKHN0cnVjdCBydDZfaW5mbyAqKXNrYi0+ZHN0KS0+cnQ2aV9pZGV2LT5kZXYtPmlmaW5kZXggOiBkZXYtPmlmaW5kZXg7CisKKwlpZiAoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKQorCQlnb3RvIGVycjsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpKSB7CisJCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCQlnb3RvIGRyb3A7CisJfQorCisJaGRyID0gc2tiLT5uaC5pcHY2aDsKKworCWlmIChoZHItPnZlcnNpb24gIT0gNikKKwkJZ290byBlcnI7CisKKwlwa3RfbGVuID0gbnRvaHMoaGRyLT5wYXlsb2FkX2xlbik7CisKKwkvKiBwa3RfbGVuIG1heSBiZSB6ZXJvIGlmIEp1bWJvIHBheWxvYWQgb3B0aW9uIGlzIHByZXNlbnQgKi8KKwlpZiAocGt0X2xlbiB8fCBoZHItPm5leHRoZHIgIT0gTkVYVEhEUl9IT1ApIHsKKwkJaWYgKHBrdF9sZW4gKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpID4gc2tiLT5sZW4pCisJCQlnb3RvIHRydW5jYXRlZDsKKwkJaWYgKHBza2JfdHJpbV9yY3N1bShza2IsIHBrdF9sZW4gKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKSkgeworCQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCQlnb3RvIGRyb3A7CisJCX0KKwkJaGRyID0gc2tiLT5uaC5pcHY2aDsKKwl9CisKKwlpZiAoaGRyLT5uZXh0aGRyID09IE5FWFRIRFJfSE9QKSB7CisJCXNrYi0+aC5yYXcgPSAodTgqKShoZHIrMSk7CisJCWlmIChpcHY2X3BhcnNlX2hvcG9wdHMoc2tiLCBvZmZzZXRvZihzdHJ1Y3QgaXB2NmhkciwgbmV4dGhkcikpIDwgMCkgeworCQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQloZHIgPSBza2ItPm5oLmlwdjZoOworCX0KKworCXJldHVybiBORl9IT09LKFBGX0lORVQ2LE5GX0lQNl9QUkVfUk9VVElORywgc2tiLCBkZXYsIE5VTEwsIGlwNl9yY3ZfZmluaXNoKTsKK3RydW5jYXRlZDoKKwlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOVFJVTkNBVEVEUEtUUyk7CitlcnI6CisJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7Citkcm9wOgorCWtmcmVlX3NrYihza2IpOworb3V0OgorCXJldHVybiAwOworfQorCisvKgorICoJRGVsaXZlciB0aGUgcGFja2V0IHRvIHRoZSBob3N0CisgKi8KKworCitzdGF0aWMgaW5saW5lIGludCBpcDZfaW5wdXRfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGluZXQ2X3Byb3RvY29sICppcHByb3Q7CisJc3RydWN0IHNvY2sgKnJhd19zazsKKwl1bnNpZ25lZCBpbnQgbmhvZmY7CisJaW50IG5leHRoZHI7CisJdTggaGFzaDsKKworCXNrYi0+aC5yYXcgPSBza2ItPm5oLnJhdyArIHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisKKwkvKgorCSAqCVBhcnNlIGV4dGVuc2lvbiBoZWFkZXJzCisJICovCisKKwluZXh0aGRyID0gc2tiLT5uaC5pcHY2aC0+bmV4dGhkcjsKKwluaG9mZiA9IG9mZnNldG9mKHN0cnVjdCBpcHY2aGRyLCBuZXh0aGRyKTsKKworCS8qIFNraXAgaG9wLWJ5LWhvcCBvcHRpb25zLCB0aGV5IGFyZSBhbHJlYWR5IHBhcnNlZC4gKi8KKwlpZiAobmV4dGhkciA9PSBORVhUSERSX0hPUCkgeworCQluaG9mZiA9IHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisJCW5leHRoZHIgPSBza2ItPmgucmF3WzBdOworCQlza2ItPmgucmF3ICs9IChza2ItPmgucmF3WzFdKzEpPDwzOworCX0KKworCXJjdV9yZWFkX2xvY2soKTsKK3Jlc3VibWl0OgorCWlmICghcHNrYl9wdWxsKHNrYiwgc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSkpCisJCWdvdG8gZGlzY2FyZDsKKwluZXh0aGRyID0gc2tiLT5uaC5yYXdbbmhvZmZdOworCisJcmF3X3NrID0gc2tfaGVhZCgmcmF3X3Y2X2h0YWJsZVtuZXh0aGRyICYgKE1BWF9JTkVUX1BST1RPUyAtIDEpXSk7CisJaWYgKHJhd19zaykKKwkJaXB2Nl9yYXdfZGVsaXZlcihza2IsIG5leHRoZHIpOworCisJaGFzaCA9IG5leHRoZHIgJiAoTUFYX0lORVRfUFJPVE9TIC0gMSk7CisJaWYgKChpcHByb3QgPSByY3VfZGVyZWZlcmVuY2UoaW5ldDZfcHJvdG9zW2hhc2hdKSkgIT0gTlVMTCkgeworCQlpbnQgcmV0OworCQkKKwkJaWYgKGlwcHJvdC0+ZmxhZ3MgJiBJTkVUNl9QUk9UT19GSU5BTCkgeworCQkJc3RydWN0IGlwdjZoZHIgKmhkcjsJCisKKwkJCXNrYl9wb3N0cHVsbF9yY3N1bShza2IsIHNrYi0+bmgucmF3LAorCQkJCQkgICBza2ItPmgucmF3IC0gc2tiLT5uaC5yYXcpOworCQkJaGRyID0gc2tiLT5uaC5pcHY2aDsKKwkJCWlmIChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZoZHItPmRhZGRyKSAmJgorCQkJICAgICFpcHY2X2Noa19tY2FzdF9hZGRyKHNrYi0+ZGV2LCAmaGRyLT5kYWRkciwKKwkJCSAgICAmaGRyLT5zYWRkcikgJiYKKwkJCSAgICAhaXB2Nl9pc19tbGQoc2tiLCBuZXh0aGRyKSkKKwkJCQlnb3RvIGRpc2NhcmQ7CisJCX0KKwkJaWYgKCEoaXBwcm90LT5mbGFncyAmIElORVQ2X1BST1RPX05PUE9MSUNZKSAmJgorCQkgICAgIXhmcm02X3BvbGljeV9jaGVjayhOVUxMLCBYRlJNX1BPTElDWV9JTiwgc2tiKSkgCisJCQlnb3RvIGRpc2NhcmQ7CisJCQorCQlyZXQgPSBpcHByb3QtPmhhbmRsZXIoJnNrYiwgJm5ob2ZmKTsKKwkJaWYgKHJldCA+IDApCisJCQlnb3RvIHJlc3VibWl0OworCQllbHNlIGlmIChyZXQgPT0gMCkKKwkJCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5ERUxJVkVSUyk7CisJfSBlbHNlIHsKKwkJaWYgKCFyYXdfc2spIHsKKwkJCWlmICh4ZnJtNl9wb2xpY3lfY2hlY2soTlVMTCwgWEZSTV9QT0xJQ1lfSU4sIHNrYikpIHsKKwkJCQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOVU5LTk9XTlBST1RPUyk7CisJCQkJaWNtcHY2X3BhcmFtX3Byb2Ioc2tiLCBJQ01QVjZfVU5LX05FWFRIRFIsIG5ob2ZmKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5ERUxJVkVSUyk7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJfQorCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gMDsKKworZGlzY2FyZDoKKwlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lORElTQ0FSRFMpOworCXJjdV9yZWFkX3VubG9jaygpOworCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCisKK2ludCBpcDZfaW5wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gTkZfSE9PSyhQRl9JTkVUNixORl9JUDZfTE9DQUxfSU4sIHNrYiwgc2tiLT5kZXYsIE5VTEwsIGlwNl9pbnB1dF9maW5pc2gpOworfQorCitpbnQgaXA2X21jX2lucHV0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlwdjZoZHIgKmhkcjsKKwlpbnQgZGVsaXZlcjsKKworCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5NQ0FTVFBLVFMpOworCisJaGRyID0gc2tiLT5uaC5pcHY2aDsKKwlkZWxpdmVyID0gbGlrZWx5KCEoc2tiLT5kZXYtPmZsYWdzICYgKElGRl9QUk9NSVNDfElGRl9BTExNVUxUSSkpKSB8fAorCSAgICBpcHY2X2Noa19tY2FzdF9hZGRyKHNrYi0+ZGV2LCAmaGRyLT5kYWRkciwgTlVMTCk7CisKKwkvKgorCSAqCUlQdjYgbXVsdGljYXN0IHJvdXRlciBtb2RlIGlzbnQgY3VycmVudGx5IHN1cHBvcnRlZC4KKwkgKi8KKyNpZiAwCisJaWYgKGlwdjZfY29uZmlnLm11bHRpY2FzdF9yb3V0ZSkgeworCQlpbnQgYWRkcl90eXBlOworCisJCWFkZHJfdHlwZSA9IGlwdjZfYWRkcl90eXBlKCZoZHItPmRhZGRyKTsKKworCQlpZiAoIShhZGRyX3R5cGUgJiAoSVBWNl9BRERSX0xPT1BCQUNLIHwgSVBWNl9BRERSX0xJTktMT0NBTCkpKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKKwkJCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKKworCQkJZHN0ID0gc2tiLT5kc3Q7CisJCQkKKwkJCWlmIChkZWxpdmVyKSB7CisJCQkJc2tiMiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCQkJCWRzdF9vdXRwdXQoc2tiMik7CisJCQl9IGVsc2UgeworCQkJCWRzdF9vdXRwdXQoc2tiKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCisJaWYgKGxpa2VseShkZWxpdmVyKSkgeworCQlpcDZfaW5wdXQoc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIGRpc2NhcmQgKi8KKwlrZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X291dHB1dC5jIGIvbmV0L2lwdjYvaXA2X291dHB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MjA4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKQEAgLTAsMCArMSwxMTk3IEBACisvKgorICoJSVB2NiBvdXRwdXQgZnVuY3Rpb25zCisgKglMaW51eCBJTkVUNiBpbXBsZW1lbnRhdGlvbiAKKyAqCisgKglBdXRob3JzOgorICoJUGVkcm8gUm9xdWUJCTxyb3F1ZUBkaS5mYy51bC5wdD4JCisgKgorICoJJElkOiBpcDZfb3V0cHV0LmMsdiAxLjM0IDIwMDIvMDIvMDEgMjI6MDE6MDQgZGF2ZW0gRXhwICQKKyAqCisgKglCYXNlZCBvbiBsaW51eC9uZXQvaXB2NC9pcF9vdXRwdXQuYworICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJQ2hhbmdlczoKKyAqCUEuTi5LdXpuZXRzb3YJOglhaXJ0aG1ldGljcyBpbiBmcmFnbWVudGF0aW9uLgorICoJCQkJZXh0ZW5zaW9uIGhlYWRlcnMgYXJlIGltcGxlbWVudGVkLgorICoJCQkJcm91dGUgY2hhbmdlcyBub3cgd29yay4KKyAqCQkJCWlwNl9mb3J3YXJkIGRvZXMgbm90IGNvbmZ1c2Ugc25pZmZlcnMuCisgKgkJCQlldGMuCisgKgorICogICAgICBILiB2b24gQnJhbmQgICAgOiAgICAgICBBZGRlZCBtaXNzaW5nICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyAqCUltcmFuIFBhdGVsCTogCWZyYWcgaWQgc2hvdWxkIGJlIGluIE5CTworICogICAgICBLYXp1bm9yaSBNSVlBWkFXQSBAVVNBR0kKKyAqCQkJOiAgICAgICBhZGQgaXA2X2FwcGVuZF9kYXRhIGFuZCByZWxhdGVkIGZ1bmN0aW9ucworICoJCQkJZm9yIGRhdGFncmFtIHhtaXQKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3JvdXRlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni5oPgorCisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvc25tcC5oPgorCisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvbmRpc2MuaD4KKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvaXA2X3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CisjaW5jbHVkZSA8bmV0L3Jhd3Y2Lmg+CisjaW5jbHVkZSA8bmV0L2ljbXAuaD4KKyNpbmNsdWRlIDxuZXQveGZybS5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorCitzdGF0aWMgaW50IGlwNl9mcmFnbWVudChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgKCpvdXRwdXQpKHN0cnVjdCBza19idWZmICopKTsKKworc3RhdGljIF9faW5saW5lX18gdm9pZCBpcHY2X3NlbGVjdF9pZGVudChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZnJhZ19oZHIgKmZoZHIpCit7CisJc3RhdGljIHUzMiBpcHY2X2ZyYWdtZW50YXRpb25faWQgPSAxOworCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXA2X2lkX2xvY2spOworCisJc3Bpbl9sb2NrX2JoKCZpcDZfaWRfbG9jayk7CisJZmhkci0+aWRlbnRpZmljYXRpb24gPSBodG9ubChpcHY2X2ZyYWdtZW50YXRpb25faWQpOworCWlmICgrK2lwdjZfZnJhZ21lbnRhdGlvbl9pZCA9PSAwKQorCQlpcHY2X2ZyYWdtZW50YXRpb25faWQgPSAxOworCXNwaW5fdW5sb2NrX2JoKCZpcDZfaWRfbG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlwNl9vdXRwdXRfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IpCit7CisKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2ItPmRzdDsKKwlzdHJ1Y3QgaGhfY2FjaGUgKmhoID0gZHN0LT5oaDsKKworCWlmIChoaCkgeworCQlpbnQgaGhfYWxlbjsKKworCQlyZWFkX2xvY2tfYmgoJmhoLT5oaF9sb2NrKTsKKwkJaGhfYWxlbiA9IEhIX0RBVEFfQUxJR04oaGgtPmhoX2xlbik7CisJCW1lbWNweShza2ItPmRhdGEgLSBoaF9hbGVuLCBoaC0+aGhfZGF0YSwgaGhfYWxlbik7CisJCXJlYWRfdW5sb2NrX2JoKCZoaC0+aGhfbG9jayk7CisJICAgICAgICBza2JfcHVzaChza2IsIGhoLT5oaF9sZW4pOworCQlyZXR1cm4gaGgtPmhoX291dHB1dChza2IpOworCX0gZWxzZSBpZiAoZHN0LT5uZWlnaGJvdXIpCisJCXJldHVybiBkc3QtPm5laWdoYm91ci0+b3V0cHV0KHNrYik7CisKKwlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX09VVE5PUk9VVEVTKTsKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gLUVJTlZBTDsKKworfQorCisvKiBkZXZfbG9vcGJhY2tfeG1pdCBmb3IgdXNlIHdpdGggbmV0ZmlsdGVyLiAqLworc3RhdGljIGludCBpcDZfZGV2X2xvb3BiYWNrX3htaXQoc3RydWN0IHNrX2J1ZmYgKm5ld3NrYikKK3sKKwluZXdza2ItPm1hYy5yYXcgPSBuZXdza2ItPmRhdGE7CisJX19za2JfcHVsbChuZXdza2IsIG5ld3NrYi0+bmgucmF3IC0gbmV3c2tiLT5kYXRhKTsKKwluZXdza2ItPnBrdF90eXBlID0gUEFDS0VUX0xPT1BCQUNLOworCW5ld3NrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJQlVHX1RSQVAobmV3c2tiLT5kc3QpOworCisJbmV0aWZfcngobmV3c2tiKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGlwNl9vdXRwdXQyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiLT5kc3Q7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRzdC0+ZGV2OworCisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQVjYpOworCXNrYi0+ZGV2ID0gZGV2OworCisJaWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJnNrYi0+bmguaXB2NmgtPmRhZGRyKSkgeworCQlzdHJ1Y3QgaXB2Nl9waW5mbyogbnAgPSBza2ItPnNrID8gaW5ldDZfc2soc2tiLT5zaykgOiBOVUxMOworCisJCWlmICghKGRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spICYmICghbnAgfHwgbnAtPm1jX2xvb3ApICYmCisJCSAgICBpcHY2X2Noa19tY2FzdF9hZGRyKGRldiwgJnNrYi0+bmguaXB2NmgtPmRhZGRyLAorCQkJCSZza2ItPm5oLmlwdjZoLT5zYWRkcikpIHsKKwkJCXN0cnVjdCBza19idWZmICpuZXdza2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKworCQkJLyogRG8gbm90IGNoZWNrIGZvciBJRkZfQUxMTVVMVEk7IG11bHRpY2FzdCByb3V0aW5nCisJCQkgICBpcyBub3Qgc3VwcG9ydGVkIGluIGFueSBjYXNlLgorCQkJICovCisJCQlpZiAobmV3c2tiKQorCQkJCU5GX0hPT0soUEZfSU5FVDYsIE5GX0lQNl9QT1NUX1JPVVRJTkcsIG5ld3NrYiwgTlVMTCwKKwkJCQkJbmV3c2tiLT5kZXYsCisJCQkJCWlwNl9kZXZfbG9vcGJhY2tfeG1pdCk7CisKKwkJCWlmIChza2ItPm5oLmlwdjZoLT5ob3BfbGltaXQgPT0gMCkgeworCQkJCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfT1VURElTQ0FSRFMpOworCQkJCWtmcmVlX3NrYihza2IpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisKKwkJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRNQ0FTVFBLVFMpOworCX0KKworCXJldHVybiBORl9IT09LKFBGX0lORVQ2LCBORl9JUDZfUE9TVF9ST1VUSU5HLCBza2IsTlVMTCwgc2tiLT5kZXYsaXA2X291dHB1dF9maW5pc2gpOworfQorCitpbnQgaXA2X291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmIChza2ItPmxlbiA+IGRzdF9tdHUoc2tiLT5kc3QpIHx8IGRzdF9hbGxmcmFnKHNrYi0+ZHN0KSkKKwkJcmV0dXJuIGlwNl9mcmFnbWVudChza2IsIGlwNl9vdXRwdXQyKTsKKwllbHNlCisJCXJldHVybiBpcDZfb3V0cHV0Mihza2IpOworfQorCisjaWZkZWYgQ09ORklHX05FVEZJTFRFUgoraW50IGlwNl9yb3V0ZV9tZV9oYXJkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gc2tiLT5uaC5pcHY2aDsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CisJc3RydWN0IGZsb3dpIGZsID0geworCQkub2lmID0gc2tiLT5zayA/IHNrYi0+c2stPnNrX2JvdW5kX2Rldl9pZiA6IDAsCisJCS5ubF91ID0KKwkJeyAuaXA2X3UgPQorCQkgIHsgLmRhZGRyID0gaXBoLT5kYWRkciwKKwkJICAgIC5zYWRkciA9IGlwaC0+c2FkZHIsIH0gfSwKKwkJLnByb3RvID0gaXBoLT5uZXh0aGRyLAorCX07CisKKwlkc3QgPSBpcDZfcm91dGVfb3V0cHV0KHNrYi0+c2ssICZmbCk7CisKKwlpZiAoZHN0LT5lcnJvcikgeworCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVE5PUk9VVEVTKTsKKwkJTElNSVRfTkVUREVCVUcoCisJCQlwcmludGsoS0VSTl9ERUJVRyAiaXA2X3JvdXRlX21lX2hhcmRlcjogTm8gbW9yZSByb3V0ZS5cbiIpKTsKKwkJZHN0X3JlbGVhc2UoZHN0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogRHJvcCBvbGQgcm91dGUuICovCisJZHN0X3JlbGVhc2Uoc2tiLT5kc3QpOworCisJc2tiLT5kc3QgPSBkc3Q7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQgaXA2X21heWJlX3Jlcm91dGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSCisJaWYgKHNrYi0+bmZjYWNoZSAmIE5GQ19BTFRFUkVEKXsKKwkJaWYgKGlwNl9yb3V0ZV9tZV9oYXJkZXIoc2tiKSAhPSAwKXsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisjZW5kaWYgLyogQ09ORklHX05FVEZJTFRFUiAqLworCXJldHVybiBkc3Rfb3V0cHV0KHNrYik7Cit9CisKKy8qCisgKgl4bWl0IGFuIHNrX2J1ZmYgKHVzZWQgYnkgVENQKQorICovCisKK2ludCBpcDZfeG1pdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBmbG93aSAqZmwsCisJICAgICBzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdCwgaW50IGlwZnJhZ29rKQoreworCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IHNrID8gaW5ldDZfc2soc2spIDogTlVMTDsKKwlzdHJ1Y3QgaW42X2FkZHIgKmZpcnN0X2hvcCA9ICZmbC0+Zmw2X2RzdDsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2ItPmRzdDsKKwlzdHJ1Y3QgaXB2NmhkciAqaGRyOworCXU4ICBwcm90byA9IGZsLT5wcm90bzsKKwlpbnQgc2VnX2xlbiA9IHNrYi0+bGVuOworCWludCBobGltaXQ7CisJdTMyIG10dTsKKworCWlmIChvcHQpIHsKKwkJaW50IGhlYWRfcm9vbTsKKworCQkvKiBGaXJzdDogZXh0aGRycyBtYXkgdGFrZSBsb3RzIG9mIHNwYWNlICh+OEsgZm9yIG5vdykKKwkJICAgTUFYX0hFQURFUiBpcyBub3QgZW5vdWdoLgorCQkgKi8KKwkJaGVhZF9yb29tID0gb3B0LT5vcHRfbmZsZW4gKyBvcHQtPm9wdF9mbGVuOworCQlzZWdfbGVuICs9IGhlYWRfcm9vbTsKKwkJaGVhZF9yb29tICs9IHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKyBMTF9SRVNFUlZFRF9TUEFDRShkc3QtPmRldik7CisKKwkJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgaGVhZF9yb29tKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IHNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwgaGVhZF9yb29tKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJc2tiID0gc2tiMjsKKwkJCWlmIChza2IgPT0gTlVMTCkgewkKKwkJCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKKwkJCQlyZXR1cm4gLUVOT0JVRlM7CisJCQl9CisJCQlpZiAoc2spCisJCQkJc2tiX3NldF9vd25lcl93KHNrYiwgc2spOworCQl9CisJCWlmIChvcHQtPm9wdF9mbGVuKQorCQkJaXB2Nl9wdXNoX2ZyYWdfb3B0cyhza2IsIG9wdCwgJnByb3RvKTsKKwkJaWYgKG9wdC0+b3B0X25mbGVuKQorCQkJaXB2Nl9wdXNoX25mcmFnX29wdHMoc2tiLCBvcHQsICZwcm90bywgJmZpcnN0X2hvcCk7CisJfQorCisJaGRyID0gc2tiLT5uaC5pcHY2aCA9IChzdHJ1Y3QgaXB2Nmhkciopc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKKworCS8qCisJICoJRmlsbCBpbiB0aGUgSVB2NiBoZWFkZXIKKwkgKi8KKworCSoodTMyKiloZHIgPSBodG9ubCgweDYwMDAwMDAwKSB8IGZsLT5mbDZfZmxvd2xhYmVsOworCWhsaW1pdCA9IC0xOworCWlmIChucCkKKwkJaGxpbWl0ID0gbnAtPmhvcF9saW1pdDsKKwlpZiAoaGxpbWl0IDwgMCkKKwkJaGxpbWl0ID0gZHN0X21ldHJpYyhkc3QsIFJUQVhfSE9QTElNSVQpOworCWlmIChobGltaXQgPCAwKQorCQlobGltaXQgPSBpcHY2X2dldF9ob3BsaW1pdChkc3QtPmRldik7CisKKwloZHItPnBheWxvYWRfbGVuID0gaHRvbnMoc2VnX2xlbik7CisJaGRyLT5uZXh0aGRyID0gcHJvdG87CisJaGRyLT5ob3BfbGltaXQgPSBobGltaXQ7CisKKwlpcHY2X2FkZHJfY29weSgmaGRyLT5zYWRkciwgJmZsLT5mbDZfc3JjKTsKKwlpcHY2X2FkZHJfY29weSgmaGRyLT5kYWRkciwgZmlyc3RfaG9wKTsKKworCW10dSA9IGRzdF9tdHUoZHN0KTsKKwlpZiAoKHNrYi0+bGVuIDw9IG10dSkgfHwgaXBmcmFnb2spIHsKKwkJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CisJCXJldHVybiBORl9IT09LKFBGX0lORVQ2LCBORl9JUDZfTE9DQUxfT1VULCBza2IsIE5VTEwsIGRzdC0+ZGV2LCBpcDZfbWF5YmVfcmVyb3V0ZSk7CisJfQorCisJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIklQdjY6IHNlbmRpbmcgcGt0X3Rvb19iaWcgdG8gc2VsZlxuIik7CisJc2tiLT5kZXYgPSBkc3QtPmRldjsKKwlpY21wdjZfc2VuZChza2IsIElDTVBWNl9QS1RfVE9PQklHLCAwLCBtdHUsIHNrYi0+ZGV2KTsKKwlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX0ZSQUdGQUlMUyk7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworLyoKKyAqCVRvIGF2b2lkIGV4dHJhIHByb2JsZW1zIE5EIHBhY2tldHMgYXJlIHNlbmQgdGhyb3VnaCB0aGlzCisgKglyb3V0aW5lLiBJdCdzIGNvZGUgZHVwbGljYXRpb24gYnV0IEkgcmVhbGx5IHdhbnQgdG8gYXZvaWQKKyAqCWV4dHJhIGNoZWNrcyBzaW5jZSBpcHY2X2J1aWxkX2hlYWRlciBpcyB1c2VkIGJ5IFRDUCAod2hpY2gKKyAqCWlzIGZvciB1cyBwZXJmb3JtYW5jZSBjcml0aWNhbCkKKyAqLworCitpbnQgaXA2X25kX2hkcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJICAgICAgIHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCisJICAgICAgIGludCBwcm90bywgaW50IGxlbikKK3sKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CisJc3RydWN0IGlwdjZoZHIgKmhkcjsKKwlpbnQgdG90bGVuOworCisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQVjYpOworCXNrYi0+ZGV2ID0gZGV2OworCisJdG90bGVuID0gbGVuICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKKworCWhkciA9IChzdHJ1Y3QgaXB2NmhkciAqKSBza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisJc2tiLT5uaC5pcHY2aCA9IGhkcjsKKworCSoodTMyKiloZHIgPSBodG9ubCgweDYwMDAwMDAwKTsKKworCWhkci0+cGF5bG9hZF9sZW4gPSBodG9ucyhsZW4pOworCWhkci0+bmV4dGhkciA9IHByb3RvOworCWhkci0+aG9wX2xpbWl0ID0gbnAtPmhvcF9saW1pdDsKKworCWlwdjZfYWRkcl9jb3B5KCZoZHItPnNhZGRyLCBzYWRkcik7CisJaXB2Nl9hZGRyX2NvcHkoJmhkci0+ZGFkZHIsIGRhZGRyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwNl9jYWxsX3JhX2NoYWluKHN0cnVjdCBza19idWZmICpza2IsIGludCBzZWwpCit7CisJc3RydWN0IGlwNl9yYV9jaGFpbiAqcmE7CisJc3RydWN0IHNvY2sgKmxhc3QgPSBOVUxMOworCisJcmVhZF9sb2NrKCZpcDZfcmFfbG9jayk7CisJZm9yIChyYSA9IGlwNl9yYV9jaGFpbjsgcmE7IHJhID0gcmEtPm5leHQpIHsKKwkJc3RydWN0IHNvY2sgKnNrID0gcmEtPnNrOworCQlpZiAoc2sgJiYgcmEtPnNlbCA9PSBzZWwpIHsKKwkJCWlmIChsYXN0KSB7CisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJCQlpZiAoc2tiMikKKwkJCQkJcmF3djZfcmN2KGxhc3QsIHNrYjIpOworCQkJfQorCQkJbGFzdCA9IHNrOworCQl9CisJfQorCisJaWYgKGxhc3QpIHsKKwkJcmF3djZfcmN2KGxhc3QsIHNrYik7CisJCXJlYWRfdW5sb2NrKCZpcDZfcmFfbG9jayk7CisJCXJldHVybiAxOworCX0KKwlyZWFkX3VubG9jaygmaXA2X3JhX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBpcDZfZm9yd2FyZF9maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gZHN0X291dHB1dChza2IpOworfQorCitpbnQgaXA2X2ZvcndhcmQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2ItPmRzdDsKKwlzdHJ1Y3QgaXB2NmhkciAqaGRyID0gc2tiLT5uaC5pcHY2aDsKKwlzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCA9IElQNkNCKHNrYik7CisJCisJaWYgKGlwdjZfZGV2Y29uZi5mb3J3YXJkaW5nID09IDApCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoIXhmcm02X3BvbGljeV9jaGVjayhOVUxMLCBYRlJNX1BPTElDWV9GV0QsIHNrYikpIHsKKwkJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9JTkRJU0NBUkRTKTsKKwkJZ290byBkcm9wOworCX0KKworCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKworCS8qCisJICoJV2UgRE8gTk9UIG1ha2UgYW55IHByb2Nlc3Npbmcgb24KKwkgKglSQSBwYWNrZXRzLCBwdXNoaW5nIHRoZW0gdG8gdXNlciBsZXZlbCBBUyBJUworCSAqCXdpdGhvdXQgYW5lIFdBUlJBTlRZIHRoYXQgYXBwbGljYXRpb24gd2lsbCBiZSBhYmxlCisJICoJdG8gaW50ZXJwcmV0IHRoZW0uIFRoZSByZWFzb24gaXMgdGhhdCB3ZQorCSAqCWNhbm5vdCBtYWtlIGFueXRoaW5nIGNsZXZlciBoZXJlLgorCSAqCisJICoJV2UgYXJlIG5vdCBlbmQtbm9kZSwgc28gdGhhdCBpZiBwYWNrZXQgY29udGFpbnMKKwkgKglBSC9FU1AsIHdlIGNhbm5vdCBtYWtlIGFueXRoaW5nLgorCSAqCURlZnJhZ21lbnRhdGlvbiBhbHNvIHdvdWxkIGJlIG1pc3Rha2UsIFJBIHBhY2tldHMKKwkgKgljYW5ub3QgYmUgZnJhZ21lbnRlZCwgYmVjYXVzZSB0aGVyZSBpcyBubyB3YXJyYW50eQorCSAqCXRoYXQgZGlmZmVyZW50IGZyYWdtZW50cyB3aWxsIGdvIGFsb25nIG9uZSBwYXRoLiAtLUFOSworCSAqLworCWlmIChvcHQtPnJhKSB7CisJCXU4ICpwdHIgPSBza2ItPm5oLnJhdyArIG9wdC0+cmE7CisJCWlmIChpcDZfY2FsbF9yYV9jaGFpbihza2IsIChwdHJbMl08PDgpICsgcHRyWzNdKSkKKwkJCXJldHVybiAwOworCX0KKworCS8qCisJICoJY2hlY2sgYW5kIGRlY3JlbWVudCB0dGwKKwkgKi8KKwlpZiAoaGRyLT5ob3BfbGltaXQgPD0gMSkgeworCQkvKiBGb3JjZSBPVVRQVVQgZGV2aWNlIHVzZWQgYXMgc291cmNlIGFkZHJlc3MgKi8KKwkJc2tiLT5kZXYgPSBkc3QtPmRldjsKKwkJaWNtcHY2X3NlbmQoc2tiLCBJQ01QVjZfVElNRV9FWENFRUQsIElDTVBWNl9FWENfSE9QTElNSVQsCisJCQkgICAgMCwgc2tiLT5kZXYpOworCisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlpZiAoIXhmcm02X3JvdXRlX2ZvcndhcmQoc2tiKSkgeworCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX0lORElTQ0FSRFMpOworCQlnb3RvIGRyb3A7CisJfQorCWRzdCA9IHNrYi0+ZHN0OworCisJLyogSVB2NiBzcGVjcyBzYXkgbm90aGluZyBhYm91dCBpdCwgYnV0IGl0IGlzIGNsZWFyIHRoYXQgd2UgY2Fubm90CisJICAgc2VuZCByZWRpcmVjdHMgdG8gc291cmNlIHJvdXRlZCBmcmFtZXMuCisJICovCisJaWYgKHNrYi0+ZGV2ID09IGRzdC0+ZGV2ICYmIGRzdC0+bmVpZ2hib3VyICYmIG9wdC0+c3JjcnQgPT0gMCkgeworCQlzdHJ1Y3QgaW42X2FkZHIgKnRhcmdldCA9IE5VTEw7CisJCXN0cnVjdCBydDZfaW5mbyAqcnQ7CisJCXN0cnVjdCBuZWlnaGJvdXIgKm4gPSBkc3QtPm5laWdoYm91cjsKKworCQkvKgorCQkgKglpbmNvbWluZyBhbmQgb3V0Z29pbmcgZGV2aWNlcyBhcmUgdGhlIHNhbWUKKwkJICoJc2VuZCBhIHJlZGlyZWN0LgorCQkgKi8KKworCQlydCA9IChzdHJ1Y3QgcnQ2X2luZm8gKikgZHN0OworCQlpZiAoKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX0dBVEVXQVkpKQorCQkJdGFyZ2V0ID0gKHN0cnVjdCBpbjZfYWRkciopJm4tPnByaW1hcnlfa2V5OworCQllbHNlCisJCQl0YXJnZXQgPSAmaGRyLT5kYWRkcjsKKworCQkvKiBMaW1pdCByZWRpcmVjdHMgYm90aCBieSBkZXN0aW5hdGlvbiAoaGVyZSkKKwkJICAgYW5kIGJ5IHNvdXJjZSAoaW5zaWRlIG5kaXNjX3NlbmRfcmVkaXJlY3QpCisJCSAqLworCQlpZiAoeHJsaW1fYWxsb3coZHN0LCAxKkhaKSkKKwkJCW5kaXNjX3NlbmRfcmVkaXJlY3Qoc2tiLCBuLCB0YXJnZXQpOworCX0gZWxzZSBpZiAoaXB2Nl9hZGRyX3R5cGUoJmhkci0+c2FkZHIpJihJUFY2X0FERFJfTVVMVElDQVNUfElQVjZfQUREUl9MT09QQkFDSworCQkJCQkJfElQVjZfQUREUl9MSU5LTE9DQUwpKSB7CisJCS8qIFRoaXMgY2hlY2sgaXMgc2VjdXJpdHkgY3JpdGljYWwuICovCisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKHNrYi0+bGVuID4gZHN0X210dShkc3QpKSB7CisJCS8qIEFnYWluLCBmb3JjZSBPVVRQVVQgZGV2aWNlIHVzZWQgYXMgc291cmNlIGFkZHJlc3MgKi8KKwkJc2tiLT5kZXYgPSBkc3QtPmRldjsKKwkJaWNtcHY2X3NlbmQoc2tiLCBJQ01QVjZfUEtUX1RPT0JJRywgMCwgZHN0X210dShkc3QpLCBza2ItPmRldik7CisJCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5UT09CSUdFUlJPUlMpOworCQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0ZSQUdGQUlMUyk7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLUVNU0dTSVpFOworCX0KKworCWlmIChza2JfY293KHNrYiwgZHN0LT5kZXYtPmhhcmRfaGVhZGVyX2xlbikpIHsKKwkJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CisJCWdvdG8gZHJvcDsKKwl9CisKKwloZHIgPSBza2ItPm5oLmlwdjZoOworCisJLyogTWFuZ2xpbmcgaG9wcyBudW1iZXIgZGVsYXllZCB0byBwb2ludCBhZnRlciBza2IgQ09XICovCisgCisJaGRyLT5ob3BfbGltaXQtLTsKKworCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfT1VURk9SV0RBVEFHUkFNUyk7CisJcmV0dXJuIE5GX0hPT0soUEZfSU5FVDYsTkZfSVA2X0ZPUldBUkQsIHNrYiwgc2tiLT5kZXYsIGRzdC0+ZGV2LCBpcDZfZm9yd2FyZF9maW5pc2gpOworCitlcnJvcjoKKwlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOQUREUkVSUk9SUyk7Citkcm9wOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgdm9pZCBpcDZfY29weV9tZXRhZGF0YShzdHJ1Y3Qgc2tfYnVmZiAqdG8sIHN0cnVjdCBza19idWZmICpmcm9tKQoreworCXRvLT5wa3RfdHlwZSA9IGZyb20tPnBrdF90eXBlOworCXRvLT5wcmlvcml0eSA9IGZyb20tPnByaW9yaXR5OworCXRvLT5wcm90b2NvbCA9IGZyb20tPnByb3RvY29sOworCXRvLT5zZWN1cml0eSA9IGZyb20tPnNlY3VyaXR5OworCWRzdF9yZWxlYXNlKHRvLT5kc3QpOworCXRvLT5kc3QgPSBkc3RfY2xvbmUoZnJvbS0+ZHN0KTsKKwl0by0+ZGV2ID0gZnJvbS0+ZGV2OworCisjaWZkZWYgQ09ORklHX05FVF9TQ0hFRAorCXRvLT50Y19pbmRleCA9IGZyb20tPnRjX2luZGV4OworI2VuZGlmCisjaWZkZWYgQ09ORklHX05FVEZJTFRFUgorCXRvLT5uZm1hcmsgPSBmcm9tLT5uZm1hcms7CisJLyogQ29ubmVjdGlvbiBhc3NvY2lhdGlvbiBpcyBzYW1lIGFzIHByZS1mcmFnIHBhY2tldCAqLworCXRvLT5uZmN0ID0gZnJvbS0+bmZjdDsKKwluZl9jb25udHJhY2tfZ2V0KHRvLT5uZmN0KTsKKwl0by0+bmZjdGluZm8gPSBmcm9tLT5uZmN0aW5mbzsKKyNpZmRlZiBDT05GSUdfQlJJREdFX05FVEZJTFRFUgorCW5mX2JyaWRnZV9wdXQodG8tPm5mX2JyaWRnZSk7CisJdG8tPm5mX2JyaWRnZSA9IGZyb20tPm5mX2JyaWRnZTsKKwluZl9icmlkZ2VfZ2V0KHRvLT5uZl9icmlkZ2UpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRworCXRvLT5uZl9kZWJ1ZyA9IGZyb20tPm5mX2RlYnVnOworI2VuZGlmCisjZW5kaWYKK30KKworaW50IGlwNl9maW5kXzFzdGZyYWdvcHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKipuZXh0aGRyKQoreworCXUxNiBvZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCXN0cnVjdCBpcHY2X29wdF9oZHIgKmV4dGhkciA9IChzdHJ1Y3QgaXB2Nl9vcHRfaGRyKikoc2tiLT5uaC5pcHY2aCArIDEpOworCXVuc2lnbmVkIGludCBwYWNrZXRfbGVuID0gc2tiLT50YWlsIC0gc2tiLT5uaC5yYXc7CisJaW50IGZvdW5kX3JoZHIgPSAwOworCSpuZXh0aGRyID0gJnNrYi0+bmguaXB2NmgtPm5leHRoZHI7CisKKwl3aGlsZSAob2Zmc2V0ICsgMSA8PSBwYWNrZXRfbGVuKSB7CisKKwkJc3dpdGNoICgqKm5leHRoZHIpIHsKKworCQljYXNlIE5FWFRIRFJfSE9QOgorCQljYXNlIE5FWFRIRFJfUk9VVElORzoKKwkJY2FzZSBORVhUSERSX0RFU1Q6CisJCQlpZiAoKipuZXh0aGRyID09IE5FWFRIRFJfUk9VVElORykgZm91bmRfcmhkciA9IDE7CisJCQlpZiAoKipuZXh0aGRyID09IE5FWFRIRFJfREVTVCAmJiBmb3VuZF9yaGRyKSByZXR1cm4gb2Zmc2V0OworCQkJb2Zmc2V0ICs9IGlwdjZfb3B0bGVuKGV4dGhkcik7CisJCQkqbmV4dGhkciA9ICZleHRoZHItPm5leHRoZHI7CisJCQlleHRoZHIgPSAoc3RydWN0IGlwdjZfb3B0X2hkciopKHNrYi0+bmgucmF3ICsgb2Zmc2V0KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0IDoKKwkJCXJldHVybiBvZmZzZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgaW50IGlwNl9mcmFnbWVudChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgKCpvdXRwdXQpKHN0cnVjdCBza19idWZmICopKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHNrX2J1ZmYgKmZyYWc7CisJc3RydWN0IHJ0Nl9pbmZvICpydCA9IChzdHJ1Y3QgcnQ2X2luZm8qKXNrYi0+ZHN0OworCXN0cnVjdCBpcHY2aGRyICp0bXBfaGRyOworCXN0cnVjdCBmcmFnX2hkciAqZmg7CisJdW5zaWduZWQgaW50IG10dSwgaGxlbiwgbGVmdCwgbGVuOworCXUzMiBmcmFnX2lkID0gMDsKKwlpbnQgcHRyLCBvZmZzZXQgPSAwLCBlcnI9MDsKKwl1OCAqcHJldmhkciwgbmV4dGhkciA9IDA7CisKKwlkZXYgPSBydC0+dS5kc3QuZGV2OworCWhsZW4gPSBpcDZfZmluZF8xc3RmcmFnb3B0KHNrYiwgJnByZXZoZHIpOworCW5leHRoZHIgPSAqcHJldmhkcjsKKworCW10dSA9IGRzdF9tdHUoJnJ0LT51LmRzdCkgLSBobGVuIC0gc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcik7CisKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QpIHsKKwkJaW50IGZpcnN0X2xlbiA9IHNrYl9wYWdlbGVuKHNrYik7CisKKwkJaWYgKGZpcnN0X2xlbiAtIGhsZW4gPiBtdHUgfHwKKwkJICAgICgoZmlyc3RfbGVuIC0gaGxlbikgJiA3KSB8fAorCQkgICAgc2tiX2Nsb25lZChza2IpKQorCQkJZ290byBzbG93X3BhdGg7CisKKwkJZm9yIChmcmFnID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3Q7IGZyYWc7IGZyYWcgPSBmcmFnLT5uZXh0KSB7CisJCQkvKiBDb3JyZWN0IGdlb21ldHJ5LiAqLworCQkJaWYgKGZyYWctPmxlbiA+IG10dSB8fAorCQkJICAgICgoZnJhZy0+bGVuICYgNykgJiYgZnJhZy0+bmV4dCkgfHwKKwkJCSAgICBza2JfaGVhZHJvb20oZnJhZykgPCBobGVuKQorCQkJICAgIGdvdG8gc2xvd19wYXRoOworCisJCQkvKiBDb3JyZWN0IHNvY2tldCBvd25lcnNoaXAuICovCisJCQlpZiAoZnJhZy0+c2sgPT0gTlVMTCkKKwkJCQlnb3RvIHNsb3dfcGF0aDsKKworCQkJLyogUGFydGlhbGx5IGNsb25lZCBza2I/ICovCisJCQlpZiAoc2tiX3NoYXJlZChmcmFnKSkKKwkJCQlnb3RvIHNsb3dfcGF0aDsKKwkJfQorCisJCWVyciA9IDA7CisJCW9mZnNldCA9IDA7CisJCWZyYWcgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKKwkJc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QgPSBOVUxMOworCQkvKiBCVUlMRCBIRUFERVIgKi8KKworCQl0bXBfaGRyID0ga21hbGxvYyhobGVuLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCF0bXBfaGRyKSB7CisJCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX0ZSQUdGQUlMUyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCSpwcmV2aGRyID0gTkVYVEhEUl9GUkFHTUVOVDsKKwkJbWVtY3B5KHRtcF9oZHIsIHNrYi0+bmgucmF3LCBobGVuKTsKKwkJX19za2JfcHVsbChza2IsIGhsZW4pOworCQlmaCA9IChzdHJ1Y3QgZnJhZ19oZHIqKV9fc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKSk7CisJCXNrYi0+bmgucmF3ID0gX19za2JfcHVzaChza2IsIGhsZW4pOworCQltZW1jcHkoc2tiLT5uaC5yYXcsIHRtcF9oZHIsIGhsZW4pOworCisJCWlwdjZfc2VsZWN0X2lkZW50KHNrYiwgZmgpOworCQlmaC0+bmV4dGhkciA9IG5leHRoZHI7CisJCWZoLT5yZXNlcnZlZCA9IDA7CisJCWZoLT5mcmFnX29mZiA9IGh0b25zKElQNl9NRik7CisJCWZyYWdfaWQgPSBmaC0+aWRlbnRpZmljYXRpb247CisKKwkJZmlyc3RfbGVuID0gc2tiX3BhZ2VsZW4oc2tiKTsKKwkJc2tiLT5kYXRhX2xlbiA9IGZpcnN0X2xlbiAtIHNrYl9oZWFkbGVuKHNrYik7CisJCXNrYi0+bGVuID0gZmlyc3RfbGVuOworCQlza2ItPm5oLmlwdjZoLT5wYXlsb2FkX2xlbiA9IGh0b25zKGZpcnN0X2xlbiAtIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworIAorCisJCWZvciAoOzspIHsKKwkJCS8qIFByZXBhcmUgaGVhZGVyIG9mIHRoZSBuZXh0IGZyYW1lLAorCQkJICogYmVmb3JlIHByZXZpb3VzIG9uZSB3ZW50IGRvd24uICovCisJCQlpZiAoZnJhZykgeworCQkJCWZyYWctPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCQkJZnJhZy0+aC5yYXcgPSBmcmFnLT5kYXRhOworCQkJCWZoID0gKHN0cnVjdCBmcmFnX2hkciopX19za2JfcHVzaChmcmFnLCBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKSk7CisJCQkJZnJhZy0+bmgucmF3ID0gX19za2JfcHVzaChmcmFnLCBobGVuKTsKKwkJCQltZW1jcHkoZnJhZy0+bmgucmF3LCB0bXBfaGRyLCBobGVuKTsKKwkJCQlvZmZzZXQgKz0gc2tiLT5sZW4gLSBobGVuIC0gc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcik7CisJCQkJZmgtPm5leHRoZHIgPSBuZXh0aGRyOworCQkJCWZoLT5yZXNlcnZlZCA9IDA7CisJCQkJZmgtPmZyYWdfb2ZmID0gaHRvbnMob2Zmc2V0KTsKKwkJCQlpZiAoZnJhZy0+bmV4dCAhPSBOVUxMKQorCQkJCQlmaC0+ZnJhZ19vZmYgfD0gaHRvbnMoSVA2X01GKTsKKwkJCQlmaC0+aWRlbnRpZmljYXRpb24gPSBmcmFnX2lkOworCQkJCWZyYWctPm5oLmlwdjZoLT5wYXlsb2FkX2xlbiA9IGh0b25zKGZyYWctPmxlbiAtIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCQkJCWlwNl9jb3B5X21ldGFkYXRhKGZyYWcsIHNrYik7CisJCQl9CisJCQkKKwkJCWVyciA9IG91dHB1dChza2IpOworCQkJaWYgKGVyciB8fCAhZnJhZykKKwkJCQlicmVhazsKKworCQkJc2tiID0gZnJhZzsKKwkJCWZyYWcgPSBza2ItPm5leHQ7CisJCQlza2ItPm5leHQgPSBOVUxMOworCQl9CisKKwkJaWYgKHRtcF9oZHIpCisJCQlrZnJlZSh0bXBfaGRyKTsKKworCQlpZiAoZXJyID09IDApIHsKKwkJCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfRlJBR09LUyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXdoaWxlIChmcmFnKSB7CisJCQlza2IgPSBmcmFnLT5uZXh0OworCQkJa2ZyZWVfc2tiKGZyYWcpOworCQkJZnJhZyA9IHNrYjsKKwkJfQorCisJCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfRlJBR0ZBSUxTKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKK3Nsb3dfcGF0aDoKKwlsZWZ0ID0gc2tiLT5sZW4gLSBobGVuOwkJLyogU3BhY2UgcGVyIGZyYW1lICovCisJcHRyID0gaGxlbjsJCQkvKiBXaGVyZSB0byBzdGFydCBmcm9tICovCisKKwkvKgorCSAqCUZyYWdtZW50IHRoZSBkYXRhZ3JhbS4KKwkgKi8KKworCSpwcmV2aGRyID0gTkVYVEhEUl9GUkFHTUVOVDsKKworCS8qCisJICoJS2VlcCBjb3B5aW5nIGRhdGEgdW50aWwgd2UgcnVuIG91dC4KKwkgKi8KKwl3aGlsZShsZWZ0ID4gMCkJeworCQlsZW4gPSBsZWZ0OworCQkvKiBJRjogaXQgZG9lc24ndCBmaXQsIHVzZSAnbXR1JyAtIHRoZSBkYXRhIHNwYWNlIGxlZnQgKi8KKwkJaWYgKGxlbiA+IG10dSkKKwkJCWxlbiA9IG10dTsKKwkJLyogSUY6IHdlIGFyZSBub3Qgc2VuZGluZyB1cHRvIGFuZCBpbmNsdWRpbmcgdGhlIHBhY2tldCBlbmQKKwkJICAgdGhlbiBhbGlnbiB0aGUgbmV4dCBzdGFydCBvbiBhbiBlaWdodCBieXRlIGJvdW5kYXJ5ICovCisJCWlmIChsZW4gPCBsZWZ0KQl7CisJCQlsZW4gJj0gfjc7CisJCX0KKwkJLyoKKwkJICoJQWxsb2NhdGUgYnVmZmVyLgorCQkgKi8KKworCQlpZiAoKGZyYWcgPSBhbGxvY19za2IobGVuK2hsZW4rc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcikrTExfUkVTRVJWRURfU1BBQ0UocnQtPnUuZHN0LmRldiksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCQlORVRERUJVRyhwcmludGsoS0VSTl9JTkZPICJJUHY2OiBmcmFnOiBubyBtZW1vcnkgZm9yIG5ldyBmcmFnbWVudCFcbiIpKTsKKwkJCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfRlJBR0ZBSUxTKTsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQkvKgorCQkgKglTZXQgdXAgZGF0YSBvbiBwYWNrZXQKKwkJICovCisKKwkJaXA2X2NvcHlfbWV0YWRhdGEoZnJhZywgc2tiKTsKKwkJc2tiX3Jlc2VydmUoZnJhZywgTExfUkVTRVJWRURfU1BBQ0UocnQtPnUuZHN0LmRldikpOworCQlza2JfcHV0KGZyYWcsIGxlbiArIGhsZW4gKyBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKSk7CisJCWZyYWctPm5oLnJhdyA9IGZyYWctPmRhdGE7CisJCWZoID0gKHN0cnVjdCBmcmFnX2hkciopKGZyYWctPmRhdGEgKyBobGVuKTsKKwkJZnJhZy0+aC5yYXcgPSBmcmFnLT5kYXRhICsgaGxlbiArIHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpOworCisJCS8qCisJCSAqCUNoYXJnZSB0aGUgbWVtb3J5IGZvciB0aGUgZnJhZ21lbnQgdG8gYW55IG93bmVyCisJCSAqCWl0IG1pZ2h0IHBvc3Nlc3MKKwkJICovCisJCWlmIChza2ItPnNrKQorCQkJc2tiX3NldF9vd25lcl93KGZyYWcsIHNrYi0+c2spOworCisJCS8qCisJCSAqCUNvcHkgdGhlIHBhY2tldCBoZWFkZXIgaW50byB0aGUgbmV3IGJ1ZmZlci4KKwkJICovCisJCW1lbWNweShmcmFnLT5uaC5yYXcsIHNrYi0+ZGF0YSwgaGxlbik7CisKKwkJLyoKKwkJICoJQnVpbGQgZnJhZ21lbnQgaGVhZGVyLgorCQkgKi8KKwkJZmgtPm5leHRoZHIgPSBuZXh0aGRyOworCQlmaC0+cmVzZXJ2ZWQgPSAwOworCQlpZiAoZnJhZ19pZCkgeworCQkJaXB2Nl9zZWxlY3RfaWRlbnQoc2tiLCBmaCk7CisJCQlmcmFnX2lkID0gZmgtPmlkZW50aWZpY2F0aW9uOworCQl9IGVsc2UKKwkJCWZoLT5pZGVudGlmaWNhdGlvbiA9IGZyYWdfaWQ7CisKKwkJLyoKKwkJICoJQ29weSBhIGJsb2NrIG9mIHRoZSBJUCBkYXRhZ3JhbS4KKwkJICovCisJCWlmIChza2JfY29weV9iaXRzKHNrYiwgcHRyLCBmcmFnLT5oLnJhdywgbGVuKSkKKwkJCUJVRygpOworCQlsZWZ0IC09IGxlbjsKKworCQlmaC0+ZnJhZ19vZmYgPSBodG9ucyhvZmZzZXQpOworCQlpZiAobGVmdCA+IDApCisJCQlmaC0+ZnJhZ19vZmYgfD0gaHRvbnMoSVA2X01GKTsKKwkJZnJhZy0+bmguaXB2NmgtPnBheWxvYWRfbGVuID0gaHRvbnMoZnJhZy0+bGVuIC0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisKKwkJcHRyICs9IGxlbjsKKwkJb2Zmc2V0ICs9IGxlbjsKKworCQkvKgorCQkgKglQdXQgdGhpcyBmcmFnbWVudCBpbnRvIHRoZSBzZW5kaW5nIHF1ZXVlLgorCQkgKi8KKworCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX0ZSQUdDUkVBVEVTKTsKKworCQllcnIgPSBvdXRwdXQoZnJhZyk7CisJCWlmIChlcnIpCisJCQlnb3RvIGZhaWw7CisJfQorCWtmcmVlX3NrYihza2IpOworCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfRlJBR09LUyk7CisJcmV0dXJuIGVycjsKKworZmFpbDoKKwlrZnJlZV9za2Ioc2tiKTsgCisJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9GUkFHRkFJTFMpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBpcDZfZHN0X2xvb2t1cChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBkc3RfZW50cnkgKipkc3QsIHN0cnVjdCBmbG93aSAqZmwpCit7CisJaW50IGVyciA9IDA7CisKKwkqZHN0ID0gTlVMTDsKKwlpZiAoc2spIHsKKwkJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOworCQorCQkqZHN0ID0gc2tfZHN0X2NoZWNrKHNrLCBucC0+ZHN0X2Nvb2tpZSk7CisJCWlmICgqZHN0KSB7CisJCQlzdHJ1Y3QgcnQ2X2luZm8gKnJ0ID0gKHN0cnVjdCBydDZfaW5mbyopKmRzdDsKKwkKKwkJCQkvKiBZZXMsIGNoZWNraW5nIHJvdXRlIHZhbGlkaXR5IGluIG5vdCBjb25uZWN0ZWQKKwkJCQkgICBjYXNlIGlzIG5vdCB2ZXJ5IHNpbXBsZS4gVGFrZSBpbnRvIGFjY291bnQsCisJCQkJICAgdGhhdCB3ZSBkbyBub3Qgc3VwcG9ydCByb3V0aW5nIGJ5IHNvdXJjZSwgVE9TLAorCQkJCSAgIGFuZCBNU0dfRE9OVFJPVVRFIAkJLS1BTksgKDk4MDcyNikKKwkKKwkJCQkgICAxLiBJZiByb3V0ZSB3YXMgaG9zdCByb3V0ZSwgY2hlY2sgdGhhdAorCQkJCSAgICAgIGNhY2hlZCBkZXN0aW5hdGlvbiBpcyBjdXJyZW50LgorCQkJCSAgICAgIElmIGl0IGlzIG5ldHdvcmsgcm91dGUsIHdlIHN0aWxsIG1heQorCQkJCSAgICAgIGNoZWNrIGl0cyB2YWxpZGl0eSB1c2luZyBzYXZlZCBwb2ludGVyCisJCQkJICAgICAgdG8gdGhlIGxhc3QgdXNlZCBhZGRyZXNzOiBkYWRkcl9jYWNoZS4KKwkJCQkgICAgICBXZSBkbyBub3Qgd2FudCB0byBzYXZlIHdob2xlIGFkZHJlc3Mgbm93LAorCQkJCSAgICAgIChiZWNhdXNlIG1haW4gY29uc3VtZXIgb2YgdGhpcyBzZXJ2aWNlCisJCQkJICAgICAgIGlzIHRjcCwgd2hpY2ggaGFzIG5vdCB0aGlzIHByb2JsZW0pLAorCQkJCSAgICAgIHNvIHRoYXQgdGhlIGxhc3QgdHJpY2sgd29ya3Mgb25seSBvbiBjb25uZWN0ZWQKKwkJCQkgICAgICBzb2NrZXRzLgorCQkJCSAgIDIuIG9pZiBhbHNvIHNob3VsZCBiZSB0aGUgc2FtZS4KKwkJCQkgKi8KKwkKKwkJCWlmICgoKHJ0LT5ydDZpX2RzdC5wbGVuICE9IDEyOCB8fAorCQkJICAgICAgIWlwdjZfYWRkcl9lcXVhbCgmZmwtPmZsNl9kc3QsICZydC0+cnQ2aV9kc3QuYWRkcikpCisJCQkgICAgICYmIChucC0+ZGFkZHJfY2FjaGUgPT0gTlVMTCB8fAorCQkJCSAhaXB2Nl9hZGRyX2VxdWFsKCZmbC0+Zmw2X2RzdCwgbnAtPmRhZGRyX2NhY2hlKSkpCisJCQkgICAgfHwgKGZsLT5vaWYgJiYgZmwtPm9pZiAhPSAoKmRzdCktPmRldi0+aWZpbmRleCkpIHsKKwkJCQlkc3RfcmVsZWFzZSgqZHN0KTsKKwkJCQkqZHN0ID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKworCWlmICgqZHN0ID09IE5VTEwpCisJCSpkc3QgPSBpcDZfcm91dGVfb3V0cHV0KHNrLCBmbCk7CisKKwlpZiAoKGVyciA9ICgqZHN0KS0+ZXJyb3IpKQorCQlnb3RvIG91dF9lcnJfcmVsZWFzZTsKKworCWlmIChpcHY2X2FkZHJfYW55KCZmbC0+Zmw2X3NyYykpIHsKKwkJZXJyID0gaXB2Nl9nZXRfc2FkZHIoKmRzdCwgJmZsLT5mbDZfZHN0LCAmZmwtPmZsNl9zcmMpOworCisJCWlmIChlcnIpIHsKKyNpZiBJUDZfREVCVUcgPj0gMgorCQkJcHJpbnRrKEtFUk5fREVCVUcgImlwNl9kc3RfbG9va3VwOiAiCisJCQkgICAgICAgIm5vIGF2YWlsYWJsZSBzb3VyY2UgYWRkcmVzc1xuIik7CisjZW5kaWYKKwkJCWdvdG8gb3V0X2Vycl9yZWxlYXNlOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK291dF9lcnJfcmVsZWFzZToKKwlkc3RfcmVsZWFzZSgqZHN0KTsKKwkqZHN0ID0gTlVMTDsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgaXA2X2FwcGVuZF9kYXRhKHN0cnVjdCBzb2NrICpzaywgaW50IGdldGZyYWcodm9pZCAqZnJvbSwgY2hhciAqdG8sIGludCBvZmZzZXQsIGludCBsZW4sIGludCBvZGQsIHN0cnVjdCBza19idWZmICpza2IpLAorCQkgICAgdm9pZCAqZnJvbSwgaW50IGxlbmd0aCwgaW50IHRyYW5zaGRybGVuLAorCQkgICAgaW50IGhsaW1pdCwgc3RydWN0IGlwdjZfdHhvcHRpb25zICpvcHQsIHN0cnVjdCBmbG93aSAqZmwsIHN0cnVjdCBydDZfaW5mbyAqcnQsCisJCSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGludCBtYXhmcmFnbGVuLCBmcmFnaGVhZGVybGVuOworCWludCBleHRoZHJsZW47CisJaW50IGhoX2xlbjsKKwlpbnQgbXR1OworCWludCBjb3B5OworCWludCBlcnI7CisJaW50IG9mZnNldCA9IDA7CisJaW50IGNzdW1tb2RlID0gQ0hFQ0tTVU1fTk9ORTsKKworCWlmIChmbGFncyZNU0dfUFJPQkUpCisJCXJldHVybiAwOworCWlmIChza2JfcXVldWVfZW1wdHkoJnNrLT5za193cml0ZV9xdWV1ZSkpIHsKKwkJLyoKKwkJICogc2V0dXAgZm9yIGNvcmtpbmcKKwkJICovCisJCWlmIChvcHQpIHsKKwkJCWlmIChucC0+Y29yay5vcHQgPT0gTlVMTCkgeworCQkJCW5wLT5jb3JrLm9wdCA9IGttYWxsb2Mob3B0LT50b3RfbGVuLAorCQkJCQkJICAgICAgIHNrLT5za19hbGxvY2F0aW9uKTsKKwkJCQlpZiAodW5saWtlbHkobnAtPmNvcmsub3B0ID09IE5VTEwpKQorCQkJCQlyZXR1cm4gLUVOT0JVRlM7CisJCQl9IGVsc2UgaWYgKG5wLT5jb3JrLm9wdC0+dG90X2xlbiA8IG9wdC0+dG90X2xlbikgeworCQkJCXByaW50ayhLRVJOX0RFQlVHICJpcDZfYXBwZW5kX2RhdGE6IGludmFsaWQgb3B0aW9uIGxlbmd0aFxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQltZW1jcHkobnAtPmNvcmsub3B0LCBvcHQsIG9wdC0+dG90X2xlbik7CisJCQlpbmV0LT5jb3JrLmZsYWdzIHw9IElQQ09SS19PUFQ7CisJCQkvKiBuZWVkIHNvdXJjZSBhZGRyZXNzIGFib3ZlIG1peWF6YXdhKi8KKwkJfQorCQlkc3RfaG9sZCgmcnQtPnUuZHN0KTsKKwkJbnAtPmNvcmsucnQgPSBydDsKKwkJaW5ldC0+Y29yay5mbCA9ICpmbDsKKwkJbnAtPmNvcmsuaG9wX2xpbWl0ID0gaGxpbWl0OworCQlpbmV0LT5jb3JrLmZyYWdzaXplID0gbXR1ID0gZHN0X210dShydC0+dS5kc3QucGF0aCk7CisJCWlmIChkc3RfYWxsZnJhZyhydC0+dS5kc3QucGF0aCkpCisJCQlpbmV0LT5jb3JrLmZsYWdzIHw9IElQQ09SS19BTExGUkFHOworCQlpbmV0LT5jb3JrLmxlbmd0aCA9IDA7CisJCXNrLT5za19zbmRtc2dfcGFnZSA9IE5VTEw7CisJCXNrLT5za19zbmRtc2dfb2ZmID0gMDsKKwkJZXh0aGRybGVuID0gcnQtPnUuZHN0LmhlYWRlcl9sZW4gKyAob3B0ID8gb3B0LT5vcHRfZmxlbiA6IDApOworCQlsZW5ndGggKz0gZXh0aGRybGVuOworCQl0cmFuc2hkcmxlbiArPSBleHRoZHJsZW47CisJfSBlbHNlIHsKKwkJcnQgPSBucC0+Y29yay5ydDsKKwkJZmwgPSAmaW5ldC0+Y29yay5mbDsKKwkJaWYgKGluZXQtPmNvcmsuZmxhZ3MgJiBJUENPUktfT1BUKQorCQkJb3B0ID0gbnAtPmNvcmsub3B0OworCQl0cmFuc2hkcmxlbiA9IDA7CisJCWV4dGhkcmxlbiA9IDA7CisJCW10dSA9IGluZXQtPmNvcmsuZnJhZ3NpemU7CisJfQorCisJaGhfbGVuID0gTExfUkVTRVJWRURfU1BBQ0UocnQtPnUuZHN0LmRldik7CisKKwlmcmFnaGVhZGVybGVuID0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArIChvcHQgPyBvcHQtPm9wdF9uZmxlbiA6IDApOworCW1heGZyYWdsZW4gPSAoKG10dSAtIGZyYWdoZWFkZXJsZW4pICYgfjcpICsgZnJhZ2hlYWRlcmxlbiAtIHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpOworCisJaWYgKG10dSA8PSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsgSVBWNl9NQVhQTEVOKSB7CisJCWlmIChpbmV0LT5jb3JrLmxlbmd0aCArIGxlbmd0aCA+IHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKyBJUFY2X01BWFBMRU4gLSBmcmFnaGVhZGVybGVuKSB7CisJCQlpcHY2X2xvY2FsX2Vycm9yKHNrLCBFTVNHU0laRSwgZmwsIG10dS1leHRoZHJsZW4pOworCQkJcmV0dXJuIC1FTVNHU0laRTsKKwkJfQorCX0KKworCS8qCisJICogTGV0J3MgdHJ5IHVzaW5nIGFzIG11Y2ggc3BhY2UgYXMgcG9zc2libGUuCisJICogVXNlIE1UVSBpZiB0b3RhbCBsZW5ndGggb2YgdGhlIG1lc3NhZ2UgZml0cyBpbnRvIHRoZSBNVFUuCisJICogT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIHJlc2VydmUgZnJhZ21lbnQgaGVhZGVyIGFuZAorCSAqIGZyYWdtZW50IGFsaWdubWVudCAoPSA4LTE1IG9jdGVjdHMsIGluIHRvdGFsKS4KKwkgKgorCSAqIE5vdGUgdGhhdCB3ZSBtYXkgbmVlZCB0byAibW92ZSIgdGhlIGRhdGEgZnJvbSB0aGUgdGFpbCBvZgorCSAqIG9mIHRoZSBidWZmZXIgdG8gdGhlIG5ldyBmcmFnbWVudCB3aGVuIHdlIHNwbGl0IAorCSAqIHRoZSBtZXNzYWdlLgorCSAqCisJICogRklYTUU6IEl0IG1heSBiZSBmcmFnbWVudGVkIGludG8gbXVsdGlwbGUgY2h1bmtzIAorCSAqICAgICAgICBhdCBvbmNlIGlmIG5vbi1mcmFnbWVudGFibGUgZXh0ZW5zaW9uIGhlYWRlcnMKKwkgKiAgICAgICAgYXJlIHRvbyBsYXJnZS4KKwkgKiAtLXlvc2hmdWppIAorCSAqLworCisJaW5ldC0+Y29yay5sZW5ndGggKz0gbGVuZ3RoOworCisJaWYgKChza2IgPSBza2JfcGVla190YWlsKCZzay0+c2tfd3JpdGVfcXVldWUpKSA9PSBOVUxMKQorCQlnb3RvIGFsbG9jX25ld19za2I7CisKKwl3aGlsZSAobGVuZ3RoID4gMCkgeworCQkvKiBDaGVjayBpZiB0aGUgcmVtYWluaW5nIGRhdGEgZml0cyBpbnRvIGN1cnJlbnQgcGFja2V0LiAqLworCQljb3B5ID0gKGluZXQtPmNvcmsubGVuZ3RoIDw9IG10dSAmJiAhKGluZXQtPmNvcmsuZmxhZ3MgJiBJUENPUktfQUxMRlJBRykgPyBtdHUgOiBtYXhmcmFnbGVuKSAtIHNrYi0+bGVuOworCQlpZiAoY29weSA8IGxlbmd0aCkKKwkJCWNvcHkgPSBtYXhmcmFnbGVuIC0gc2tiLT5sZW47CisKKwkJaWYgKGNvcHkgPD0gMCkgeworCQkJY2hhciAqZGF0YTsKKwkJCXVuc2lnbmVkIGludCBkYXRhbGVuOworCQkJdW5zaWduZWQgaW50IGZyYWdsZW47CisJCQl1bnNpZ25lZCBpbnQgZnJhZ2dhcDsKKwkJCXVuc2lnbmVkIGludCBhbGxvY2xlbjsKKwkJCXN0cnVjdCBza19idWZmICpza2JfcHJldjsKK2FsbG9jX25ld19za2I6CisJCQlza2JfcHJldiA9IHNrYjsKKworCQkJLyogVGhlcmUncyBubyByb29tIGluIHRoZSBjdXJyZW50IHNrYiAqLworCQkJaWYgKHNrYl9wcmV2KQorCQkJCWZyYWdnYXAgPSBza2JfcHJldi0+bGVuIC0gbWF4ZnJhZ2xlbjsKKwkJCWVsc2UKKwkJCQlmcmFnZ2FwID0gMDsKKworCQkJLyoKKwkJCSAqIElmIHJlbWFpbmluZyBkYXRhIGV4Y2VlZHMgdGhlIG10dSwKKwkJCSAqIHdlIGtub3cgd2UgbmVlZCBtb3JlIGZyYWdtZW50KHMpLgorCQkJICovCisJCQlkYXRhbGVuID0gbGVuZ3RoICsgZnJhZ2dhcDsKKwkJCWlmIChkYXRhbGVuID4gKGluZXQtPmNvcmsubGVuZ3RoIDw9IG10dSAmJiAhKGluZXQtPmNvcmsuZmxhZ3MgJiBJUENPUktfQUxMRlJBRykgPyBtdHUgOiBtYXhmcmFnbGVuKSAtIGZyYWdoZWFkZXJsZW4pCisJCQkJZGF0YWxlbiA9IG1heGZyYWdsZW4gLSBmcmFnaGVhZGVybGVuOworCisJCQlmcmFnbGVuID0gZGF0YWxlbiArIGZyYWdoZWFkZXJsZW47CisJCQlpZiAoKGZsYWdzICYgTVNHX01PUkUpICYmCisJCQkgICAgIShydC0+dS5kc3QuZGV2LT5mZWF0dXJlcyZORVRJRl9GX1NHKSkKKwkJCQlhbGxvY2xlbiA9IG10dTsKKwkJCWVsc2UKKwkJCQlhbGxvY2xlbiA9IGRhdGFsZW4gKyBmcmFnaGVhZGVybGVuOworCisJCQkvKgorCQkJICogVGhlIGxhc3QgZnJhZ21lbnQgZ2V0cyBhZGRpdGlvbmFsIHNwYWNlIGF0IHRhaWwuCisJCQkgKiBOb3RlOiB3ZSBvdmVyYWxsb2NhdGUgb24gZnJhZ21lbnRzIHdpdGggTVNHX01PREUKKwkJCSAqIGJlY2F1c2Ugd2UgaGF2ZSBubyBpZGVhIGlmIHdlJ3JlIHRoZSBsYXN0IG9uZS4KKwkJCSAqLworCQkJaWYgKGRhdGFsZW4gPT0gbGVuZ3RoICsgZnJhZ2dhcCkKKwkJCQlhbGxvY2xlbiArPSBydC0+dS5kc3QudHJhaWxlcl9sZW47CisKKwkJCS8qCisJCQkgKiBXZSBqdXN0IHJlc2VydmUgc3BhY2UgZm9yIGZyYWdtZW50IGhlYWRlci4KKwkJCSAqIE5vdGU6IHRoaXMgbWF5IGJlIG92ZXJhbGxvY2F0aW9uIGlmIHRoZSBtZXNzYWdlIAorCQkJICogKHdpdGhvdXQgTVNHX01PUkUpIGZpdHMgaW50byB0aGUgTVRVLgorCQkJICovCisJCQlhbGxvY2xlbiArPSBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKTsKKworCQkJaWYgKHRyYW5zaGRybGVuKSB7CisJCQkJc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywKKwkJCQkJCWFsbG9jbGVuICsgaGhfbGVuLAorCQkJCQkJKGZsYWdzICYgTVNHX0RPTlRXQUlUKSwgJmVycik7CisJCQl9IGVsc2UgeworCQkJCXNrYiA9IE5VTEw7CisJCQkJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYykgPD0KKwkJCQkgICAgMiAqIHNrLT5za19zbmRidWYpCisJCQkJCXNrYiA9IHNvY2tfd21hbGxvYyhzaywKKwkJCQkJCQkgICBhbGxvY2xlbiArIGhoX2xlbiwgMSwKKwkJCQkJCQkgICBzay0+c2tfYWxsb2NhdGlvbik7CisJCQkJaWYgKHVubGlrZWx5KHNrYiA9PSBOVUxMKSkKKwkJCQkJZXJyID0gLUVOT0JVRlM7CisJCQl9CisJCQlpZiAoc2tiID09IE5VTEwpCisJCQkJZ290byBlcnJvcjsKKwkJCS8qCisJCQkgKglGaWxsIGluIHRoZSBjb250cm9sIHN0cnVjdHVyZXMKKwkJCSAqLworCQkJc2tiLT5pcF9zdW1tZWQgPSBjc3VtbW9kZTsKKwkJCXNrYi0+Y3N1bSA9IDA7CisJCQkvKiByZXNlcnZlIGZvciBmcmFnbWVudGF0aW9uICovCisJCQlza2JfcmVzZXJ2ZShza2IsIGhoX2xlbitzaXplb2Yoc3RydWN0IGZyYWdfaGRyKSk7CisKKwkJCS8qCisJCQkgKglGaW5kIHdoZXJlIHRvIHN0YXJ0IHB1dHRpbmcgYnl0ZXMKKwkJCSAqLworCQkJZGF0YSA9IHNrYl9wdXQoc2tiLCBmcmFnbGVuKTsKKwkJCXNrYi0+bmgucmF3ID0gZGF0YSArIGV4dGhkcmxlbjsKKwkJCWRhdGEgKz0gZnJhZ2hlYWRlcmxlbjsKKwkJCXNrYi0+aC5yYXcgPSBkYXRhICsgZXh0aGRybGVuOworCisJCQlpZiAoZnJhZ2dhcCkgeworCQkJCXNrYi0+Y3N1bSA9IHNrYl9jb3B5X2FuZF9jc3VtX2JpdHMoCisJCQkJCXNrYl9wcmV2LCBtYXhmcmFnbGVuLAorCQkJCQlkYXRhICsgdHJhbnNoZHJsZW4sIGZyYWdnYXAsIDApOworCQkJCXNrYl9wcmV2LT5jc3VtID0gY3N1bV9zdWIoc2tiX3ByZXYtPmNzdW0sCisJCQkJCQkJICBza2ItPmNzdW0pOworCQkJCWRhdGEgKz0gZnJhZ2dhcDsKKwkJCQlza2JfdHJpbShza2JfcHJldiwgbWF4ZnJhZ2xlbik7CisJCQl9CisJCQljb3B5ID0gZGF0YWxlbiAtIHRyYW5zaGRybGVuIC0gZnJhZ2dhcDsKKwkJCWlmIChjb3B5IDwgMCkgeworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQkJZ290byBlcnJvcjsKKwkJCX0gZWxzZSBpZiAoY29weSA+IDAgJiYgZ2V0ZnJhZyhmcm9tLCBkYXRhICsgdHJhbnNoZHJsZW4sIG9mZnNldCwgY29weSwgZnJhZ2dhcCwgc2tiKSA8IDApIHsKKwkJCQllcnIgPSAtRUZBVUxUOworCQkJCWtmcmVlX3NrYihza2IpOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisKKwkJCW9mZnNldCArPSBjb3B5OworCQkJbGVuZ3RoIC09IGRhdGFsZW4gLSBmcmFnZ2FwOworCQkJdHJhbnNoZHJsZW4gPSAwOworCQkJZXh0aGRybGVuID0gMDsKKwkJCWNzdW1tb2RlID0gQ0hFQ0tTVU1fTk9ORTsKKworCQkJLyoKKwkJCSAqIFB1dCB0aGUgcGFja2V0IG9uIHRoZSBwZW5kaW5nIHF1ZXVlCisJCQkgKi8KKwkJCV9fc2tiX3F1ZXVlX3RhaWwoJnNrLT5za193cml0ZV9xdWV1ZSwgc2tiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGNvcHkgPiBsZW5ndGgpCisJCQljb3B5ID0gbGVuZ3RoOworCisJCWlmICghKHJ0LT51LmRzdC5kZXYtPmZlYXR1cmVzJk5FVElGX0ZfU0cpKSB7CisJCQl1bnNpZ25lZCBpbnQgb2ZmOworCisJCQlvZmYgPSBza2ItPmxlbjsKKwkJCWlmIChnZXRmcmFnKGZyb20sIHNrYl9wdXQoc2tiLCBjb3B5KSwKKwkJCQkJCW9mZnNldCwgY29weSwgb2ZmLCBza2IpIDwgMCkgeworCQkJCV9fc2tiX3RyaW0oc2tiLCBvZmYpOworCQkJCWVyciA9IC1FRkFVTFQ7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWludCBpID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwkJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpLTFdOworCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBzay0+c2tfc25kbXNnX3BhZ2U7CisJCQlpbnQgb2ZmID0gc2stPnNrX3NuZG1zZ19vZmY7CisJCQl1bnNpZ25lZCBpbnQgbGVmdDsKKworCQkJaWYgKHBhZ2UgJiYgKGxlZnQgPSBQQUdFX1NJWkUgLSBvZmYpID4gMCkgeworCQkJCWlmIChjb3B5ID49IGxlZnQpCisJCQkJCWNvcHkgPSBsZWZ0OworCQkJCWlmIChwYWdlICE9IGZyYWctPnBhZ2UpIHsKKwkJCQkJaWYgKGkgPT0gTUFYX1NLQl9GUkFHUykgeworCQkJCQkJZXJyID0gLUVNU0dTSVpFOworCQkJCQkJZ290byBlcnJvcjsKKwkJCQkJfQorCQkJCQlnZXRfcGFnZShwYWdlKTsKKwkJCQkJc2tiX2ZpbGxfcGFnZV9kZXNjKHNrYiwgaSwgcGFnZSwgc2stPnNrX3NuZG1zZ19vZmYsIDApOworCQkJCQlmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisJCQkJfQorCQkJfSBlbHNlIGlmKGkgPCBNQVhfU0tCX0ZSQUdTKSB7CisJCQkJaWYgKGNvcHkgPiBQQUdFX1NJWkUpCisJCQkJCWNvcHkgPSBQQUdFX1NJWkU7CisJCQkJcGFnZSA9IGFsbG9jX3BhZ2VzKHNrLT5za19hbGxvY2F0aW9uLCAwKTsKKwkJCQlpZiAocGFnZSA9PSBOVUxMKSB7CisJCQkJCWVyciA9IC1FTk9NRU07CisJCQkJCWdvdG8gZXJyb3I7CisJCQkJfQorCQkJCXNrLT5za19zbmRtc2dfcGFnZSA9IHBhZ2U7CisJCQkJc2stPnNrX3NuZG1zZ19vZmYgPSAwOworCisJCQkJc2tiX2ZpbGxfcGFnZV9kZXNjKHNrYiwgaSwgcGFnZSwgMCwgMCk7CisJCQkJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCQkJCXNrYi0+dHJ1ZXNpemUgKz0gUEFHRV9TSVpFOworCQkJCWF0b21pY19hZGQoUEFHRV9TSVpFLCAmc2stPnNrX3dtZW1fYWxsb2MpOworCQkJfSBlbHNlIHsKKwkJCQllcnIgPSAtRU1TR1NJWkU7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCWlmIChnZXRmcmFnKGZyb20sIHBhZ2VfYWRkcmVzcyhmcmFnLT5wYWdlKStmcmFnLT5wYWdlX29mZnNldCtmcmFnLT5zaXplLCBvZmZzZXQsIGNvcHksIHNrYi0+bGVuLCBza2IpIDwgMCkgeworCQkJCWVyciA9IC1FRkFVTFQ7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCXNrLT5za19zbmRtc2dfb2ZmICs9IGNvcHk7CisJCQlmcmFnLT5zaXplICs9IGNvcHk7CisJCQlza2ItPmxlbiArPSBjb3B5OworCQkJc2tiLT5kYXRhX2xlbiArPSBjb3B5OworCQl9CisJCW9mZnNldCArPSBjb3B5OworCQlsZW5ndGggLT0gY29weTsKKwl9CisJcmV0dXJuIDA7CitlcnJvcjoKKwlpbmV0LT5jb3JrLmxlbmd0aCAtPSBsZW5ndGg7CisJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CisJcmV0dXJuIGVycjsKK30KKworaW50IGlwNl9wdXNoX3BlbmRpbmdfZnJhbWVzKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqdG1wX3NrYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqKnRhaWxfc2tiOworCXN0cnVjdCBpbjZfYWRkciBmaW5hbF9kc3RfYnVmLCAqZmluYWxfZHN0ID0gJmZpbmFsX2RzdF9idWY7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKKwlzdHJ1Y3QgaXB2NmhkciAqaGRyOworCXN0cnVjdCBpcHY2X3R4b3B0aW9ucyAqb3B0ID0gbnAtPmNvcmsub3B0OworCXN0cnVjdCBydDZfaW5mbyAqcnQgPSBucC0+Y29yay5ydDsKKwlzdHJ1Y3QgZmxvd2kgKmZsID0gJmluZXQtPmNvcmsuZmw7CisJdW5zaWduZWQgY2hhciBwcm90byA9IGZsLT5wcm90bzsKKwlpbnQgZXJyID0gMDsKKworCWlmICgoc2tiID0gX19za2JfZGVxdWV1ZSgmc2stPnNrX3dyaXRlX3F1ZXVlKSkgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJdGFpbF9za2IgPSAmKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0KTsKKworCS8qIG1vdmUgc2tiLT5kYXRhIHRvIGlwIGhlYWRlciBmcm9tIGV4dCBoZWFkZXIgKi8KKwlpZiAoc2tiLT5kYXRhIDwgc2tiLT5uaC5yYXcpCisJCV9fc2tiX3B1bGwoc2tiLCBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YSk7CisJd2hpbGUgKCh0bXBfc2tiID0gX19za2JfZGVxdWV1ZSgmc2stPnNrX3dyaXRlX3F1ZXVlKSkgIT0gTlVMTCkgeworCQlfX3NrYl9wdWxsKHRtcF9za2IsIHNrYi0+aC5yYXcgLSBza2ItPm5oLnJhdyk7CisJCSp0YWlsX3NrYiA9IHRtcF9za2I7CisJCXRhaWxfc2tiID0gJih0bXBfc2tiLT5uZXh0KTsKKwkJc2tiLT5sZW4gKz0gdG1wX3NrYi0+bGVuOworCQlza2ItPmRhdGFfbGVuICs9IHRtcF9za2ItPmxlbjsKKyNpZiAwIC8qIExvZ2ljYWxseSBjb3JyZWN0LCBidXQgdXNlbGVzcyB3b3JrLCBpcF9mcmFnbWVudCgpIHdpbGwgaGF2ZSB0byB1bmRvICovCisJCXNrYi0+dHJ1ZXNpemUgKz0gdG1wX3NrYi0+dHJ1ZXNpemU7CisJCV9fc29ja19wdXQodG1wX3NrYi0+c2spOworCQl0bXBfc2tiLT5kZXN0cnVjdG9yID0gTlVMTDsKKwkJdG1wX3NrYi0+c2sgPSBOVUxMOworI2VuZGlmCisJfQorCisJaXB2Nl9hZGRyX2NvcHkoZmluYWxfZHN0LCAmZmwtPmZsNl9kc3QpOworCV9fc2tiX3B1bGwoc2tiLCBza2ItPmgucmF3IC0gc2tiLT5uaC5yYXcpOworCWlmIChvcHQgJiYgb3B0LT5vcHRfZmxlbikKKwkJaXB2Nl9wdXNoX2ZyYWdfb3B0cyhza2IsIG9wdCwgJnByb3RvKTsKKwlpZiAob3B0ICYmIG9wdC0+b3B0X25mbGVuKQorCQlpcHY2X3B1c2hfbmZyYWdfb3B0cyhza2IsIG9wdCwgJnByb3RvLCAmZmluYWxfZHN0KTsKKworCXNrYi0+bmguaXB2NmggPSBoZHIgPSAoc3RydWN0IGlwdjZoZHIqKSBza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCQorCSoodTMyKiloZHIgPSBmbC0+Zmw2X2Zsb3dsYWJlbCB8IGh0b25sKDB4NjAwMDAwMDApOworCisJaWYgKHNrYi0+bGVuIDw9IHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKyBJUFY2X01BWFBMRU4pCisJCWhkci0+cGF5bG9hZF9sZW4gPSBodG9ucyhza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCWVsc2UKKwkJaGRyLT5wYXlsb2FkX2xlbiA9IDA7CisJaGRyLT5ob3BfbGltaXQgPSBucC0+Y29yay5ob3BfbGltaXQ7CisJaGRyLT5uZXh0aGRyID0gcHJvdG87CisJaXB2Nl9hZGRyX2NvcHkoJmhkci0+c2FkZHIsICZmbC0+Zmw2X3NyYyk7CisJaXB2Nl9hZGRyX2NvcHkoJmhkci0+ZGFkZHIsIGZpbmFsX2RzdCk7CisKKwlza2ItPmRzdCA9IGRzdF9jbG9uZSgmcnQtPnUuZHN0KTsKKwlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsJCisJZXJyID0gTkZfSE9PSyhQRl9JTkVUNiwgTkZfSVA2X0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBza2ItPmRzdC0+ZGV2LCBkc3Rfb3V0cHV0KTsKKwlpZiAoZXJyKSB7CisJCWlmIChlcnIgPiAwKQorCQkJZXJyID0gaW5ldC0+cmVjdmVyciA/IG5ldF94bWl0X2Vycm5vKGVycikgOiAwOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJvcjsKKwl9CisKK291dDoKKwlpbmV0LT5jb3JrLmZsYWdzICY9IH5JUENPUktfT1BUOworCWlmIChucC0+Y29yay5vcHQpIHsKKwkJa2ZyZWUobnAtPmNvcmsub3B0KTsKKwkJbnAtPmNvcmsub3B0ID0gTlVMTDsKKwl9CisJaWYgKG5wLT5jb3JrLnJ0KSB7CisJCWRzdF9yZWxlYXNlKCZucC0+Y29yay5ydC0+dS5kc3QpOworCQlucC0+Y29yay5ydCA9IE5VTEw7CisJCWluZXQtPmNvcmsuZmxhZ3MgJj0gfklQQ09SS19BTExGUkFHOworCX0KKwltZW1zZXQoJmluZXQtPmNvcmsuZmwsIDAsIHNpemVvZihpbmV0LT5jb3JrLmZsKSk7CisJcmV0dXJuIGVycjsKK2Vycm9yOgorCWdvdG8gb3V0OworfQorCit2b2lkIGlwNl9mbHVzaF9wZW5kaW5nX2ZyYW1lcyhzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlX3RhaWwoJnNrLT5za193cml0ZV9xdWV1ZSkpICE9IE5VTEwpIHsKKwkJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CisJCWtmcmVlX3NrYihza2IpOworCX0KKworCWluZXQtPmNvcmsuZmxhZ3MgJj0gfklQQ09SS19PUFQ7CisKKwlpZiAobnAtPmNvcmsub3B0KSB7CisJCWtmcmVlKG5wLT5jb3JrLm9wdCk7CisJCW5wLT5jb3JrLm9wdCA9IE5VTEw7CisJfQorCWlmIChucC0+Y29yay5ydCkgeworCQlkc3RfcmVsZWFzZSgmbnAtPmNvcmsucnQtPnUuZHN0KTsKKwkJbnAtPmNvcmsucnQgPSBOVUxMOworCQlpbmV0LT5jb3JrLmZsYWdzICY9IH5JUENPUktfQUxMRlJBRzsKKwl9CisJbWVtc2V0KCZpbmV0LT5jb3JrLmZsLCAwLCBzaXplb2YoaW5ldC0+Y29yay5mbCkpOworfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X3R1bm5lbC5jIGIvbmV0L2lwdjYvaXA2X3R1bm5lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMWM5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2Ni9pcDZfdHVubmVsLmMKQEAgLTAsMCArMSwxMTYzIEBACisvKgorICoJSVB2NiBvdmVyIElQdjYgdHVubmVsIGRldmljZQorICoJTGludXggSU5FVDYgaW1wbGVtZW50YXRpb24KKyAqCisgKglBdXRob3JzOgorICoJVmlsbGUgTnVvcnZhbGEJCTx2bnVvcnZhbEB0Y3MuaHV0LmZpPgkKKyAqCisgKgkkSWQkCisgKgorICogICAgICBCYXNlZCBvbjoKKyAqICAgICAgbGludXgvbmV0L2lwdjYvc2l0LmMKKyAqCisgKiAgICAgIFJGQyAyNDczCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdHVubmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaWNtcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JvdXRlLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvaXA2X3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CisjaW5jbHVkZSA8bmV0L2lwNl90dW5uZWwuaD4KKyNpbmNsdWRlIDxuZXQveGZybS5oPgorI2luY2x1ZGUgPG5ldC9kc2ZpZWxkLmg+CisjaW5jbHVkZSA8bmV0L2luZXRfZWNuLmg+CisKK01PRFVMRV9BVVRIT1IoIlZpbGxlIE51b3J2YWxhIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklQdjYtaW4tSVB2NiB0dW5uZWwiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBJUFY2X1RMVl9URUxfRFNUX1NJWkUgOAorCisjaWZkZWYgSVA2X1ROTF9ERUJVRworI2RlZmluZSBJUDZfVE5MX1RSQUNFKHguLi4pIHByaW50ayhLRVJOX0RFQlVHICIlczoiIHggIlxuIiwgX19GVU5DVElPTl9fKQorI2Vsc2UKKyNkZWZpbmUgSVA2X1ROTF9UUkFDRSh4Li4uKSBkbyB7O30gd2hpbGUoMCkKKyNlbmRpZgorCisjZGVmaW5lIElQVjZfVENMQVNTX01BU0sgKElQVjZfRkxPV0lORk9fTUFTSyAmIH5JUFY2X0ZMT1dMQUJFTF9NQVNLKQorCisjZGVmaW5lIEhBU0hfU0laRSAgMzIKKworI2RlZmluZSBIQVNIKGFkZHIpICgoKGFkZHIpLT5zNl9hZGRyMzJbMF0gXiAoYWRkciktPnM2X2FkZHIzMlsxXSBeIFwKKwkgICAgICAgICAgICAgKGFkZHIpLT5zNl9hZGRyMzJbMl0gXiAoYWRkciktPnM2X2FkZHIzMlszXSkgJiBcCisgICAgICAgICAgICAgICAgICAgIChIQVNIX1NJWkUgLSAxKSkKKworc3RhdGljIGludCBpcDZpcDZfZmJfdG5sX2Rldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBpcDZpcDZfdG5sX2Rldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaXA2aXA2X3RubF9kZXZfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIHRoZSBJUHY2IHR1bm5lbCBmYWxsYmFjayBkZXZpY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqaXA2aXA2X2ZiX3RubF9kZXY7CisKKworLyogbGlzdHMgZm9yIHN0b3JpbmcgdHVubmVscyBpbiB1c2UgKi8KK3N0YXRpYyBzdHJ1Y3QgaXA2X3RubCAqdG5sc19yX2xbSEFTSF9TSVpFXTsKK3N0YXRpYyBzdHJ1Y3QgaXA2X3RubCAqdG5sc193Y1sxXTsKK3N0YXRpYyBzdHJ1Y3QgaXA2X3RubCAqKnRubHNbMl0gPSB7IHRubHNfd2MsIHRubHNfcl9sIH07CisKKy8qIGxvY2sgZm9yIHRoZSB0dW5uZWwgbGlzdHMgKi8KK3N0YXRpYyBERUZJTkVfUldMT0NLKGlwNmlwNl9sb2NrKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZHN0X2VudHJ5ICppcDZfdG5sX2RzdF9jaGVjayhzdHJ1Y3QgaXA2X3RubCAqdCkKK3sKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSB0LT5kc3RfY2FjaGU7CisKKwlpZiAoZHN0ICYmIGRzdC0+b2Jzb2xldGUgJiYgCisJICAgIGRzdC0+b3BzLT5jaGVjayhkc3QsIHQtPmRzdF9jb29raWUpID09IE5VTEwpIHsKKwkJdC0+ZHN0X2NhY2hlID0gTlVMTDsKKwkJZHN0X3JlbGVhc2UoZHN0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGRzdDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlwNl90bmxfZHN0X3Jlc2V0KHN0cnVjdCBpcDZfdG5sICp0KQoreworCWRzdF9yZWxlYXNlKHQtPmRzdF9jYWNoZSk7CisJdC0+ZHN0X2NhY2hlID0gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlwNl90bmxfZHN0X3N0b3JlKHN0cnVjdCBpcDZfdG5sICp0LCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCit7CisJc3RydWN0IHJ0Nl9pbmZvICpydCA9IChzdHJ1Y3QgcnQ2X2luZm8gKikgZHN0OworCXQtPmRzdF9jb29raWUgPSBydC0+cnQ2aV9ub2RlID8gcnQtPnJ0Nmlfbm9kZS0+Zm5fc2VybnVtIDogMDsKKwlkc3RfcmVsZWFzZSh0LT5kc3RfY2FjaGUpOworCXQtPmRzdF9jYWNoZSA9IGRzdDsKK30KKworLyoqCisgKiBpcDZpcDZfdG5sX2xvb2t1cCAtIGZldGNoIHR1bm5lbCBtYXRjaGluZyB0aGUgZW5kLXBvaW50IGFkZHJlc3NlcworICogICBAcmVtb3RlOiB0aGUgYWRkcmVzcyBvZiB0aGUgdHVubmVsIGV4aXQtcG9pbnQgCisgKiAgIEBsb2NhbDogdGhlIGFkZHJlc3Mgb2YgdGhlIHR1bm5lbCBlbnRyeS1wb2ludCAKKyAqCisgKiBSZXR1cm46ICAKKyAqICAgdHVubmVsIG1hdGNoaW5nIGdpdmVuIGVuZC1wb2ludHMgaWYgZm91bmQsCisgKiAgIGVsc2UgZmFsbGJhY2sgdHVubmVsIGlmIGl0cyBkZXZpY2UgaXMgdXAsIAorICogICBlbHNlICVOVUxMCisgKiovCisKK3N0YXRpYyBzdHJ1Y3QgaXA2X3RubCAqCitpcDZpcDZfdG5sX2xvb2t1cChzdHJ1Y3QgaW42X2FkZHIgKnJlbW90ZSwgc3RydWN0IGluNl9hZGRyICpsb2NhbCkKK3sKKwl1bnNpZ25lZCBoMCA9IEhBU0gocmVtb3RlKTsKKwl1bnNpZ25lZCBoMSA9IEhBU0gobG9jYWwpOworCXN0cnVjdCBpcDZfdG5sICp0OworCisJZm9yICh0ID0gdG5sc19yX2xbaDAgXiBoMV07IHQ7IHQgPSB0LT5uZXh0KSB7CisJCWlmIChpcHY2X2FkZHJfZXF1YWwobG9jYWwsICZ0LT5wYXJtcy5sYWRkcikgJiYKKwkJICAgIGlwdjZfYWRkcl9lcXVhbChyZW1vdGUsICZ0LT5wYXJtcy5yYWRkcikgJiYKKwkJICAgICh0LT5kZXYtPmZsYWdzICYgSUZGX1VQKSkKKwkJCXJldHVybiB0OworCX0KKwlpZiAoKHQgPSB0bmxzX3djWzBdKSAhPSBOVUxMICYmICh0LT5kZXYtPmZsYWdzICYgSUZGX1VQKSkKKwkJcmV0dXJuIHQ7CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBpcDZpcDZfYnVja2V0IC0gZ2V0IGhlYWQgb2YgbGlzdCBtYXRjaGluZyBnaXZlbiB0dW5uZWwgcGFyYW1ldGVycworICogICBAcDogcGFyYW1ldGVycyBjb250YWluaW5nIHR1bm5lbCBlbmQtcG9pbnRzIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBpcDZpcDZfYnVja2V0KCkgcmV0dXJucyB0aGUgaGVhZCBvZiB0aGUgbGlzdCBtYXRjaGluZyB0aGUgCisgKiAgICZzdHJ1Y3QgaW42X2FkZHIgZW50cmllcyBsYWRkciBhbmQgcmFkZHIgaW4gQHAuCisgKgorICogUmV0dXJuOiBoZWFkIG9mIElQdjYgdHVubmVsIGxpc3QgCisgKiovCisKK3N0YXRpYyBzdHJ1Y3QgaXA2X3RubCAqKgoraXA2aXA2X2J1Y2tldChzdHJ1Y3QgaXA2X3RubF9wYXJtICpwKQoreworCXN0cnVjdCBpbjZfYWRkciAqcmVtb3RlID0gJnAtPnJhZGRyOworCXN0cnVjdCBpbjZfYWRkciAqbG9jYWwgPSAmcC0+bGFkZHI7CisJdW5zaWduZWQgaCA9IDA7CisJaW50IHByaW8gPSAwOworCisJaWYgKCFpcHY2X2FkZHJfYW55KHJlbW90ZSkgfHwgIWlwdjZfYWRkcl9hbnkobG9jYWwpKSB7CisJCXByaW8gPSAxOworCQloID0gSEFTSChyZW1vdGUpIF4gSEFTSChsb2NhbCk7CisJfQorCXJldHVybiAmdG5sc1twcmlvXVtoXTsKK30KKworLyoqCisgKiBpcDZpcDZfdG5sX2xpbmsgLSBhZGQgdHVubmVsIHRvIGhhc2ggdGFibGUKKyAqICAgQHQ6IHR1bm5lbCB0byBiZSBhZGRlZAorICoqLworCitzdGF0aWMgdm9pZAoraXA2aXA2X3RubF9saW5rKHN0cnVjdCBpcDZfdG5sICp0KQoreworCXN0cnVjdCBpcDZfdG5sICoqdHAgPSBpcDZpcDZfYnVja2V0KCZ0LT5wYXJtcyk7CisKKwl0LT5uZXh0ID0gKnRwOworCXdyaXRlX2xvY2tfYmgoJmlwNmlwNl9sb2NrKTsKKwkqdHAgPSB0OworCXdyaXRlX3VubG9ja19iaCgmaXA2aXA2X2xvY2spOworfQorCisvKioKKyAqIGlwNmlwNl90bmxfdW5saW5rIC0gcmVtb3ZlIHR1bm5lbCBmcm9tIGhhc2ggdGFibGUKKyAqICAgQHQ6IHR1bm5lbCB0byBiZSByZW1vdmVkCisgKiovCisKK3N0YXRpYyB2b2lkCitpcDZpcDZfdG5sX3VubGluayhzdHJ1Y3QgaXA2X3RubCAqdCkKK3sKKwlzdHJ1Y3QgaXA2X3RubCAqKnRwOworCisJZm9yICh0cCA9IGlwNmlwNl9idWNrZXQoJnQtPnBhcm1zKTsgKnRwOyB0cCA9ICYoKnRwKS0+bmV4dCkgeworCQlpZiAodCA9PSAqdHApIHsKKwkJCXdyaXRlX2xvY2tfYmgoJmlwNmlwNl9sb2NrKTsKKwkJCSp0cCA9IHQtPm5leHQ7CisJCQl3cml0ZV91bmxvY2tfYmgoJmlwNmlwNl9sb2NrKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKioKKyAqIGlwNl90bmxfY3JlYXRlKCkgLSBjcmVhdGUgYSBuZXcgdHVubmVsCisgKiAgIEBwOiB0dW5uZWwgcGFyYW1ldGVycworICogICBAcHQ6IHBvaW50ZXIgdG8gbmV3IHR1bm5lbAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBDcmVhdGUgdHVubmVsIG1hdGNoaW5nIGdpdmVuIHBhcmFtZXRlcnMuCisgKiAKKyAqIFJldHVybjogCisgKiAgIDAgb24gc3VjY2VzcworICoqLworCitzdGF0aWMgaW50CitpcDZfdG5sX2NyZWF0ZShzdHJ1Y3QgaXA2X3RubF9wYXJtICpwLCBzdHJ1Y3QgaXA2X3RubCAqKnB0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGlwNl90bmwgKnQ7CisJY2hhciBuYW1lW0lGTkFNU0laXTsKKwlpbnQgZXJyOworCisJaWYgKHAtPm5hbWVbMF0pIHsKKwkJc3RybGNweShuYW1lLCBwLT5uYW1lLCBJRk5BTVNJWik7CisJfSBlbHNlIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDE7IGkgPCBJUDZfVE5MX01BWDsgaSsrKSB7CisJCQlzcHJpbnRmKG5hbWUsICJpcDZ0bmwlZCIsIGkpOworCQkJaWYgKF9fZGV2X2dldF9ieV9uYW1lKG5hbWUpID09IE5VTEwpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgPT0gSVA2X1ROTF9NQVgpIAorCQkJcmV0dXJuIC1FTk9CVUZTOworCX0KKwlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mICgqdCksIG5hbWUsIGlwNmlwNl90bmxfZGV2X3NldHVwKTsKKwlpZiAoZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJdCA9IGRldi0+cHJpdjsKKwlkZXYtPmluaXQgPSBpcDZpcDZfdG5sX2Rldl9pbml0OworCXQtPnBhcm1zID0gKnA7CisKKwlpZiAoKGVyciA9IHJlZ2lzdGVyX25ldGRldmljZShkZXYpKSA8IDApIHsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisJZGV2X2hvbGQoZGV2KTsKKworCWlwNmlwNl90bmxfbGluayh0KTsKKwkqcHQgPSB0OworCXJldHVybiAwOworfQorCisvKioKKyAqIGlwNmlwNl90bmxfbG9jYXRlIC0gZmluZCBvciBjcmVhdGUgdHVubmVsIG1hdGNoaW5nIGdpdmVuIHBhcmFtZXRlcnMKKyAqICAgQHA6IHR1bm5lbCBwYXJhbWV0ZXJzIAorICogICBAY3JlYXRlOiAhPSAwIGlmIGFsbG93ZWQgdG8gY3JlYXRlIG5ldyB0dW5uZWwgaWYgbm8gbWF0Y2ggZm91bmQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgaXA2aXA2X3RubF9sb2NhdGUoKSBmaXJzdCB0cmllcyB0byBsb2NhdGUgYW4gZXhpc3RpbmcgdHVubmVsCisgKiAgIGJhc2VkIG9uIEBwYXJtcy4gSWYgdGhpcyBpcyB1bnN1Y2Nlc3NmdWwsIGJ1dCBAY3JlYXRlIGlzIHNldCBhIG5ldworICogICB0dW5uZWwgZGV2aWNlIGlzIGNyZWF0ZWQgYW5kIHJlZ2lzdGVyZWQgZm9yIHVzZS4KKyAqCisgKiBSZXR1cm46CisgKiAgIDAgaWYgdHVubmVsIGxvY2F0ZWQgb3IgY3JlYXRlZCwKKyAqICAgLUVJTlZBTCBpZiBwYXJhbWV0ZXJzIGluY29ycmVjdCwKKyAqICAgLUVOT0RFViBpZiBubyBtYXRjaGluZyB0dW5uZWwgYXZhaWxhYmxlCisgKiovCisKK3N0YXRpYyBpbnQKK2lwNmlwNl90bmxfbG9jYXRlKHN0cnVjdCBpcDZfdG5sX3Bhcm0gKnAsIHN0cnVjdCBpcDZfdG5sICoqcHQsIGludCBjcmVhdGUpCit7CisJc3RydWN0IGluNl9hZGRyICpyZW1vdGUgPSAmcC0+cmFkZHI7CisJc3RydWN0IGluNl9hZGRyICpsb2NhbCA9ICZwLT5sYWRkcjsKKwlzdHJ1Y3QgaXA2X3RubCAqdDsKKworCWlmIChwLT5wcm90byAhPSBJUFBST1RPX0lQVjYpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yICh0ID0gKmlwNmlwNl9idWNrZXQocCk7IHQ7IHQgPSB0LT5uZXh0KSB7CisJCWlmIChpcHY2X2FkZHJfZXF1YWwobG9jYWwsICZ0LT5wYXJtcy5sYWRkcikgJiYKKwkJICAgIGlwdjZfYWRkcl9lcXVhbChyZW1vdGUsICZ0LT5wYXJtcy5yYWRkcikpIHsKKwkJCSpwdCA9IHQ7CisJCQlyZXR1cm4gKGNyZWF0ZSA/IC1FRVhJU1QgOiAwKTsKKwkJfQorCX0KKwlpZiAoIWNyZWF0ZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJCisJcmV0dXJuIGlwNl90bmxfY3JlYXRlKHAsIHB0KTsKK30KKworLyoqCisgKiBpcDZpcDZfdG5sX2Rldl91bmluaXQgLSB0dW5uZWwgZGV2aWNlIHVuaW5pdGlhbGl6ZXIKKyAqICAgQGRldjogdGhlIGRldmljZSB0byBiZSBkZXN0cm95ZWQKKyAqICAgCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgaXA2aXA2X3RubF9kZXZfdW5pbml0KCkgcmVtb3ZlcyB0dW5uZWwgZnJvbSBpdHMgbGlzdAorICoqLworCitzdGF0aWMgdm9pZAoraXA2aXA2X3RubF9kZXZfdW5pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlwNl90bmwgKnQgPSBkZXYtPnByaXY7CisKKwlpZiAoZGV2ID09IGlwNmlwNl9mYl90bmxfZGV2KSB7CisJCXdyaXRlX2xvY2tfYmgoJmlwNmlwNl9sb2NrKTsKKwkJdG5sc193Y1swXSA9IE5VTEw7CisJCXdyaXRlX3VubG9ja19iaCgmaXA2aXA2X2xvY2spOworCX0gZWxzZSB7CisJCWlwNmlwNl90bmxfdW5saW5rKHQpOworCX0KKwlpcDZfdG5sX2RzdF9yZXNldCh0KTsKKwlkZXZfcHV0KGRldik7Cit9CisKKy8qKgorICogcGFyc2VfdHZsX3RubF9lbmNfbGltIC0gaGFuZGxlIGVuY2Fwc3VsYXRpb24gbGltaXQgb3B0aW9uCisgKiAgIEBza2I6IHJlY2VpdmVkIHNvY2tldCBidWZmZXIKKyAqCisgKiBSZXR1cm46IAorICogICAwIGlmIG5vbmUgd2FzIGZvdW5kLCAKKyAqICAgZWxzZSBpbmRleCB0byBlbmNhcHN1bGF0aW9uIGxpbWl0CisgKiovCisKK3N0YXRpYyBfX3UxNgorcGFyc2VfdGx2X3RubF9lbmNfbGltKHN0cnVjdCBza19idWZmICpza2IsIF9fdTggKiByYXcpCit7CisJc3RydWN0IGlwdjZoZHIgKmlwdjZoID0gKHN0cnVjdCBpcHY2aGRyICopIHJhdzsKKwlfX3U4IG5leHRoZHIgPSBpcHY2aC0+bmV4dGhkcjsKKwlfX3UxNiBvZmYgPSBzaXplb2YgKCppcHY2aCk7CisKKwl3aGlsZSAoaXB2Nl9leHRfaGRyKG5leHRoZHIpICYmIG5leHRoZHIgIT0gTkVYVEhEUl9OT05FKSB7CisJCV9fdTE2IG9wdGxlbiA9IDA7CisJCXN0cnVjdCBpcHY2X29wdF9oZHIgKmhkcjsKKwkJaWYgKHJhdyArIG9mZiArIHNpemVvZiAoKmhkcikgPiBza2ItPmRhdGEgJiYKKwkJICAgICFwc2tiX21heV9wdWxsKHNrYiwgcmF3IC0gc2tiLT5kYXRhICsgb2ZmICsgc2l6ZW9mICgqaGRyKSkpCisJCQlicmVhazsKKworCQloZHIgPSAoc3RydWN0IGlwdjZfb3B0X2hkciAqKSAocmF3ICsgb2ZmKTsKKwkJaWYgKG5leHRoZHIgPT0gTkVYVEhEUl9GUkFHTUVOVCkgeworCQkJc3RydWN0IGZyYWdfaGRyICpmcmFnX2hkciA9IChzdHJ1Y3QgZnJhZ19oZHIgKikgaGRyOworCQkJaWYgKGZyYWdfaGRyLT5mcmFnX29mZikKKwkJCQlicmVhazsKKwkJCW9wdGxlbiA9IDg7CisJCX0gZWxzZSBpZiAobmV4dGhkciA9PSBORVhUSERSX0FVVEgpIHsKKwkJCW9wdGxlbiA9IChoZHItPmhkcmxlbiArIDIpIDw8IDI7CisJCX0gZWxzZSB7CisJCQlvcHRsZW4gPSBpcHY2X29wdGxlbihoZHIpOworCQl9CisJCWlmIChuZXh0aGRyID09IE5FWFRIRFJfREVTVCkgeworCQkJX191MTYgaSA9IG9mZiArIDI7CisJCQl3aGlsZSAoMSkgeworCQkJCXN0cnVjdCBpcHY2X3Rsdl90bmxfZW5jX2xpbSAqdGVsOworCisJCQkJLyogTm8gbW9yZSByb29tIGZvciBlbmNhcHN1bGF0aW9uIGxpbWl0ICovCisJCQkJaWYgKGkgKyBzaXplb2YgKCp0ZWwpID4gb2ZmICsgb3B0bGVuKQorCQkJCQlicmVhazsKKworCQkJCXRlbCA9IChzdHJ1Y3QgaXB2Nl90bHZfdG5sX2VuY19saW0gKikgJnJhd1tpXTsKKwkJCQkvKiByZXR1cm4gaW5kZXggb2Ygb3B0aW9uIGlmIGZvdW5kIGFuZCB2YWxpZCAqLworCQkJCWlmICh0ZWwtPnR5cGUgPT0gSVBWNl9UTFZfVE5MX0VOQ0FQX0xJTUlUICYmCisJCQkJICAgIHRlbC0+bGVuZ3RoID09IDEpCisJCQkJCXJldHVybiBpOworCQkJCS8qIGVsc2UganVtcCB0byBuZXh0IG9wdGlvbiAqLworCQkJCWlmICh0ZWwtPnR5cGUpCisJCQkJCWkgKz0gdGVsLT5sZW5ndGggKyAyOworCQkJCWVsc2UKKwkJCQkJaSsrOworCQkJfQorCQl9CisJCW5leHRoZHIgPSBoZHItPm5leHRoZHI7CisJCW9mZiArPSBvcHRsZW47CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGlwNmlwNl9lcnIgLSB0dW5uZWwgZXJyb3IgaGFuZGxlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBpcDZpcDZfZXJyKCkgc2hvdWxkIGhhbmRsZSBlcnJvcnMgaW4gdGhlIHR1bm5lbCBhY2NvcmRpbmcKKyAqICAgdG8gdGhlIHNwZWNpZmljYXRpb25zIGluIFJGQyAyNDczLgorICoqLworCitzdGF0aWMgdm9pZCAKK2lwNmlwNl9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQsCisJICAgaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX3UzMiBpbmZvKQoreworCXN0cnVjdCBpcHY2aGRyICppcHY2aCA9IChzdHJ1Y3QgaXB2NmhkciAqKSBza2ItPmRhdGE7CisJc3RydWN0IGlwNl90bmwgKnQ7CisJaW50IHJlbF9tc2cgPSAwOworCWludCByZWxfdHlwZSA9IElDTVBWNl9ERVNUX1VOUkVBQ0g7CisJaW50IHJlbF9jb2RlID0gSUNNUFY2X0FERFJfVU5SRUFDSDsKKwlfX3UzMiByZWxfaW5mbyA9IDA7CisJX191MTYgbGVuOworCisJLyogSWYgdGhlIHBhY2tldCBkb2Vzbid0IGNvbnRhaW4gdGhlIG9yaWdpbmFsIElQdjYgaGVhZGVyIHdlIGFyZSAKKwkgICBpbiB0cm91YmxlIHNpbmNlIHdlIG1pZ2h0IG5lZWQgdGhlIHNvdXJjZSBhZGRyZXNzIGZvciBmdXJ0aGVyIAorCSAgIHByb2Nlc3Npbmcgb2YgdGhlIGVycm9yLiAqLworCisJcmVhZF9sb2NrKCZpcDZpcDZfbG9jayk7CisJaWYgKCh0ID0gaXA2aXA2X3RubF9sb29rdXAoJmlwdjZoLT5kYWRkciwgJmlwdjZoLT5zYWRkcikpID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJc3dpdGNoICh0eXBlKSB7CisJCV9fdTMyIHRlbGk7CisJCXN0cnVjdCBpcHY2X3Rsdl90bmxfZW5jX2xpbSAqdGVsOworCQlfX3UzMiBtdHU7CisJY2FzZSBJQ01QVjZfREVTVF9VTlJFQUNIOgorCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogUGF0aCB0byBkZXN0aW5hdGlvbiBpbnZhbGlkICIKKwkJCSAgICAgICAib3IgaW5hY3RpdmUhXG4iLCB0LT5wYXJtcy5uYW1lKTsKKwkJcmVsX21zZyA9IDE7CisJCWJyZWFrOworCWNhc2UgSUNNUFY2X1RJTUVfRVhDRUVEOgorCQlpZiAoY29kZSA9PSBJQ01QVjZfRVhDX0hPUExJTUlUKSB7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkgICAgICAgIiVzOiBUb28gc21hbGwgaG9wIGxpbWl0IG9yICIKKwkJCQkgICAgICAgInJvdXRpbmcgbG9vcCBpbiB0dW5uZWwhXG4iLCAKKwkJCQkgICAgICAgdC0+cGFybXMubmFtZSk7CisJCQlyZWxfbXNnID0gMTsKKwkJfQorCQlicmVhazsKKwljYXNlIElDTVBWNl9QQVJBTVBST0I6CisJCS8qIGlnbm9yZSBpZiBwYXJhbWV0ZXIgcHJvYmxlbSBub3QgY2F1c2VkIGJ5IGEgdHVubmVsCisJCSAgIGVuY2Fwc3VsYXRpb24gbGltaXQgc3ViLW9wdGlvbiAqLworCQlpZiAoY29kZSAhPSBJQ01QVjZfSERSX0ZJRUxEKSB7CisJCQlicmVhazsKKwkJfQorCQl0ZWxpID0gcGFyc2VfdGx2X3RubF9lbmNfbGltKHNrYiwgc2tiLT5kYXRhKTsKKworCQlpZiAodGVsaSAmJiB0ZWxpID09IG50b2hsKGluZm8pIC0gMikgeworCQkJdGVsID0gKHN0cnVjdCBpcHY2X3Rsdl90bmxfZW5jX2xpbSAqKSAmc2tiLT5kYXRhW3RlbGldOworCQkJaWYgKHRlbC0+ZW5jYXBfbGltaXQgPT0gMCkgeworCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJICAgICAgICIlczogVG9vIHNtYWxsIGVuY2Fwc3VsYXRpb24gIgorCQkJCQkgICAgICAgImxpbWl0IG9yIHJvdXRpbmcgbG9vcCBpbiAiCisJCQkJCSAgICAgICAidHVubmVsIVxuIiwgdC0+cGFybXMubmFtZSk7CisJCQkJcmVsX21zZyA9IDE7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJQ01QVjZfUEtUX1RPT0JJRzoKKwkJbXR1ID0gbnRvaGwoaW5mbykgLSBvZmZzZXQ7CisJCWlmIChtdHUgPCBJUFY2X01JTl9NVFUpCisJCQltdHUgPSBJUFY2X01JTl9NVFU7CisJCXQtPmRldi0+bXR1ID0gbXR1OworCisJCWlmICgobGVuID0gc2l6ZW9mICgqaXB2NmgpICsgaXB2NmgtPnBheWxvYWRfbGVuKSA+IG10dSkgeworCQkJcmVsX3R5cGUgPSBJQ01QVjZfUEtUX1RPT0JJRzsKKwkJCXJlbF9jb2RlID0gMDsKKwkJCXJlbF9pbmZvID0gbXR1OworCQkJcmVsX21zZyA9IDE7CisJCX0KKwkJYnJlYWs7CisJfQorCWlmIChyZWxfbXNnICYmICBwc2tiX21heV9wdWxsKHNrYiwgb2Zmc2V0ICsgc2l6ZW9mICgqaXB2NmgpKSkgeworCQlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCQlpZiAoIXNrYjIpCisJCQlnb3RvIG91dDsKKworCQlkc3RfcmVsZWFzZShza2IyLT5kc3QpOworCQlza2IyLT5kc3QgPSBOVUxMOworCQlza2JfcHVsbChza2IyLCBvZmZzZXQpOworCQlza2IyLT5uaC5yYXcgPSBza2IyLT5kYXRhOworCisJCS8qIFRyeSB0byBndWVzcyBpbmNvbWluZyBpbnRlcmZhY2UgKi8KKwkJcnQgPSBydDZfbG9va3VwKCZza2IyLT5uaC5pcHY2aC0+c2FkZHIsIE5VTEwsIDAsIDApOworCisJCWlmIChydCAmJiBydC0+cnQ2aV9kZXYpCisJCQlza2IyLT5kZXYgPSBydC0+cnQ2aV9kZXY7CisKKwkJaWNtcHY2X3NlbmQoc2tiMiwgcmVsX3R5cGUsIHJlbF9jb2RlLCByZWxfaW5mbywgc2tiMi0+ZGV2KTsKKworCQlpZiAocnQpCisJCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKworCQlrZnJlZV9za2Ioc2tiMik7CisJfQorb3V0OgorCXJlYWRfdW5sb2NrKCZpcDZpcDZfbG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcDZpcDZfZWNuX2RlY2Fwc3VsYXRlKHN0cnVjdCBpcHY2aGRyICpvdXRlcl9pcGgsCisJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXB2NmhkciAqaW5uZXJfaXBoID0gc2tiLT5uaC5pcHY2aDsKKworCWlmIChJTkVUX0VDTl9pc19jZShpcHY2X2dldF9kc2ZpZWxkKG91dGVyX2lwaCkpKQorCQlJUDZfRUNOX3NldF9jZShpbm5lcl9pcGgpOworfQorCisvKioKKyAqIGlwNmlwNl9yY3YgLSBkZWNhcHN1bGF0ZSBJUHY2IHBhY2tldCBhbmQgcmV0cmFuc21pdCBpdCBsb2NhbGx5CisgKiAgIEBza2I6IHJlY2VpdmVkIHNvY2tldCBidWZmZXIKKyAqCisgKiBSZXR1cm46IDAKKyAqKi8KKworc3RhdGljIGludCAKK2lwNmlwNl9yY3Yoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCB1bnNpZ25lZCBpbnQgKm5ob2ZmcCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKnBza2I7CisJc3RydWN0IGlwdjZoZHIgKmlwdjZoOworCXN0cnVjdCBpcDZfdG5sICp0OworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mICgqaXB2NmgpKSkKKwkJZ290byBkaXNjYXJkOworCisJaXB2NmggPSBza2ItPm5oLmlwdjZoOworCisJcmVhZF9sb2NrKCZpcDZpcDZfbG9jayk7CisKKwlpZiAoKHQgPSBpcDZpcDZfdG5sX2xvb2t1cCgmaXB2NmgtPnNhZGRyLCAmaXB2NmgtPmRhZGRyKSkgIT0gTlVMTCkgeworCQlpZiAoIXhmcm02X3BvbGljeV9jaGVjayhOVUxMLCBYRlJNX1BPTElDWV9JTiwgc2tiKSkgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX0NBUF9SQ1YpKSB7CisJCQl0LT5zdGF0LnJ4X2Ryb3BwZWQrKzsKKwkJCXJlYWRfdW5sb2NrKCZpcDZpcDZfbG9jayk7CisJCQlnb3RvIGRpc2NhcmQ7CisJCX0KKwkJc2VjcGF0aF9yZXNldChza2IpOworCQlza2ItPm1hYy5yYXcgPSBza2ItPm5oLnJhdzsKKwkJc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUFY2KTsKKwkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOworCQltZW1zZXQoc2tiLT5jYiwgMCwgc2l6ZW9mKHN0cnVjdCBpbmV0Nl9za2JfcGFybSkpOworCQlza2ItPmRldiA9IHQtPmRldjsKKwkJZHN0X3JlbGVhc2Uoc2tiLT5kc3QpOworCQlza2ItPmRzdCA9IE5VTEw7CisJCWlmICh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9SQ1ZfRFNDUF9DT1BZKQorCQkJaXB2Nl9jb3B5X2RzY3AoaXB2NmgsIHNrYi0+bmguaXB2NmgpOworCQlpcDZpcDZfZWNuX2RlY2Fwc3VsYXRlKGlwdjZoLCBza2IpOworCQl0LT5zdGF0LnJ4X3BhY2tldHMrKzsKKwkJdC0+c3RhdC5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJbmV0aWZfcngoc2tiKTsKKwkJcmVhZF91bmxvY2soJmlwNmlwNl9sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCXJlYWRfdW5sb2NrKCZpcDZpcDZfbG9jayk7CisJaWNtcHY2X3NlbmQoc2tiLCBJQ01QVjZfREVTVF9VTlJFQUNILCBJQ01QVjZfQUREUl9VTlJFQUNILCAwLCBza2ItPmRldik7CitkaXNjYXJkOgorCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpcHY2X3R4b3B0aW9ucyAqY3JlYXRlX3RlbChfX3U4IGVuY2FwX2xpbWl0KQoreworCXN0cnVjdCBpcHY2X3Rsdl90bmxfZW5jX2xpbSAqdGVsOworCXN0cnVjdCBpcHY2X3R4b3B0aW9ucyAqb3B0OworCV9fdTggKnJhdzsKKworCWludCBvcHRfbGVuID0gc2l6ZW9mKCpvcHQpICsgODsKKworCWlmICghKG9wdCA9IGttYWxsb2Mob3B0X2xlbiwgR0ZQX0FUT01JQykpKSB7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQob3B0LCAwLCBvcHRfbGVuKTsKKwlvcHQtPnRvdF9sZW4gPSBvcHRfbGVuOworCW9wdC0+ZHN0MG9wdCA9IChzdHJ1Y3QgaXB2Nl9vcHRfaGRyICopIChvcHQgKyAxKTsKKwlvcHQtPm9wdF9uZmxlbiA9IDg7CisKKwl0ZWwgPSAoc3RydWN0IGlwdjZfdGx2X3RubF9lbmNfbGltICopIChvcHQtPmRzdDBvcHQgKyAxKTsKKwl0ZWwtPnR5cGUgPSBJUFY2X1RMVl9UTkxfRU5DQVBfTElNSVQ7CisJdGVsLT5sZW5ndGggPSAxOworCXRlbC0+ZW5jYXBfbGltaXQgPSBlbmNhcF9saW1pdDsKKworCXJhdyA9IChfX3U4ICopIG9wdC0+ZHN0MG9wdDsKKwlyYXdbNV0gPSBJUFY2X1RMVl9QQUROOworCXJhd1s2XSA9IDE7CisKKwlyZXR1cm4gb3B0OworfQorCisvKioKKyAqIGlwNmlwNl90bmxfYWRkcl9jb25mbGljdCAtIGNvbXBhcmUgcGFja2V0IGFkZHJlc3NlcyB0byB0dW5uZWwncyBvd24KKyAqICAgQHQ6IHRoZSBvdXRnb2luZyB0dW5uZWwgZGV2aWNlCisgKiAgIEBoZHI6IElQdjYgaGVhZGVyIGZyb20gdGhlIGluY29taW5nIHBhY2tldCAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgQXZvaWQgdHJpdmlhbCB0dW5uZWxpbmcgbG9vcCBieSBjaGVja2luZyB0aGF0IHR1bm5lbCBleGl0LXBvaW50IAorICogICBkb2Vzbid0IG1hdGNoIHNvdXJjZSBvZiBpbmNvbWluZyBwYWNrZXQuCisgKgorICogUmV0dXJuOiAKKyAqICAgMSBpZiBjb25mbGljdCwKKyAqICAgMCBlbHNlCisgKiovCisKK3N0YXRpYyBpbmxpbmUgaW50CitpcDZpcDZfdG5sX2FkZHJfY29uZmxpY3Qoc3RydWN0IGlwNl90bmwgKnQsIHN0cnVjdCBpcHY2aGRyICpoZHIpCit7CisJcmV0dXJuIGlwdjZfYWRkcl9lcXVhbCgmdC0+cGFybXMucmFkZHIsICZoZHItPnNhZGRyKTsKK30KKworLyoqCisgKiBpcDZpcDZfdG5sX3htaXQgLSBlbmNhcHN1bGF0ZSBwYWNrZXQgYW5kIHNlbmQgCisgKiAgIEBza2I6IHRoZSBvdXRnb2luZyBzb2NrZXQgYnVmZmVyCisgKiAgIEBkZXY6IHRoZSBvdXRnb2luZyB0dW5uZWwgZGV2aWNlIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBCdWlsZCBuZXcgaGVhZGVyIGFuZCBkbyBzb21lIHNhbml0eSBjaGVja3Mgb24gdGhlIHBhY2tldCBiZWZvcmUgc2VuZGluZworICogICBpdC4KKyAqCisgKiBSZXR1cm46IAorICogICAwCisgKiovCisKK3N0YXRpYyBpbnQgCitpcDZpcDZfdG5sX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXA2X3RubCAqdCA9IChzdHJ1Y3QgaXA2X3RubCAqKSBkZXYtPnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnQtPnN0YXQ7CisJc3RydWN0IGlwdjZoZHIgKmlwdjZoID0gc2tiLT5uaC5pcHY2aDsKKwlzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdCA9IE5VTEw7CisJaW50IGVuY2FwX2xpbWl0ID0gLTE7CisJX191MTYgb2Zmc2V0OworCXN0cnVjdCBmbG93aSBmbDsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CisJc3RydWN0IG5ldF9kZXZpY2UgKnRkZXY7CisJaW50IG10dTsKKwlpbnQgbWF4X2hlYWRyb29tID0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKKwl1OCBwcm90bzsKKwlpbnQgZXJyOworCWludCBwa3RfbGVuOworCWludCBkc2ZpZWxkOworCisJaWYgKHQtPnJlY3Vyc2lvbisrKSB7CisJCXN0YXRzLT5jb2xsaXNpb25zKys7CisJCWdvdG8gdHhfZXJyOworCX0KKwlpZiAoc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF9JUFY2KSB8fAorCSAgICAhKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX0NBUF9YTUlUKSB8fAorCSAgICBpcDZpcDZfdG5sX2FkZHJfY29uZmxpY3QodCwgaXB2NmgpKSB7CisJCWdvdG8gdHhfZXJyOworCX0KKwlpZiAoKG9mZnNldCA9IHBhcnNlX3Rsdl90bmxfZW5jX2xpbShza2IsIHNrYi0+bmgucmF3KSkgPiAwKSB7CisJCXN0cnVjdCBpcHY2X3Rsdl90bmxfZW5jX2xpbSAqdGVsOworCQl0ZWwgPSAoc3RydWN0IGlwdjZfdGx2X3RubF9lbmNfbGltICopICZza2ItPm5oLnJhd1tvZmZzZXRdOworCQlpZiAodGVsLT5lbmNhcF9saW1pdCA9PSAwKSB7CisJCQlpY21wdjZfc2VuZChza2IsIElDTVBWNl9QQVJBTVBST0IsCisJCQkJICAgIElDTVBWNl9IRFJfRklFTEQsIG9mZnNldCArIDIsIHNrYi0+ZGV2KTsKKwkJCWdvdG8gdHhfZXJyOworCQl9CisJCWVuY2FwX2xpbWl0ID0gdGVsLT5lbmNhcF9saW1pdCAtIDE7CisJfSBlbHNlIGlmICghKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX0lHTl9FTkNBUF9MSU1JVCkpIHsKKwkJZW5jYXBfbGltaXQgPSB0LT5wYXJtcy5lbmNhcF9saW1pdDsKKwl9CisJbWVtY3B5KCZmbCwgJnQtPmZsLCBzaXplb2YgKGZsKSk7CisJcHJvdG8gPSBmbC5wcm90bzsKKworCWRzZmllbGQgPSBpcHY2X2dldF9kc2ZpZWxkKGlwdjZoKTsKKwlpZiAoKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX1VTRV9PUklHX1RDTEFTUykpCisJCWZsLmZsNl9mbG93bGFiZWwgfD0gKCooX191MzIgKikgaXB2NmggJiBJUFY2X1RDTEFTU19NQVNLKTsKKwlpZiAoKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX1VTRV9PUklHX0ZMT1dMQUJFTCkpCisJCWZsLmZsNl9mbG93bGFiZWwgfD0gKCooX191MzIgKikgaXB2NmggJiBJUFY2X0ZMT1dMQUJFTF9NQVNLKTsKKworCWlmIChlbmNhcF9saW1pdCA+PSAwICYmIChvcHQgPSBjcmVhdGVfdGVsKGVuY2FwX2xpbWl0KSkgPT0gTlVMTCkKKwkJZ290byB0eF9lcnI7CisKKwlpZiAoKGRzdCA9IGlwNl90bmxfZHN0X2NoZWNrKHQpKSAhPSBOVUxMKQorCQlkc3RfaG9sZChkc3QpOworCWVsc2UKKwkJZHN0ID0gaXA2X3JvdXRlX291dHB1dChOVUxMLCAmZmwpOworCisJaWYgKGRzdC0+ZXJyb3IgfHwgeGZybV9sb29rdXAoJmRzdCwgJmZsLCBOVUxMLCAwKSA8IDApCisJCWdvdG8gdHhfZXJyX2xpbmtfZmFpbHVyZTsKKworCXRkZXYgPSBkc3QtPmRldjsKKworCWlmICh0ZGV2ID09IGRldikgeworCQlzdGF0cy0+Y29sbGlzaW9ucysrOworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCSAgICAgICAiJXM6IExvY2FsIHJvdXRpbmcgbG9vcCBkZXRlY3RlZCFcbiIsCisJCQkgICAgICAgdC0+cGFybXMubmFtZSk7CisJCWdvdG8gdHhfZXJyX2RzdF9yZWxlYXNlOworCX0KKwltdHUgPSBkc3RfbXR1KGRzdCkgLSBzaXplb2YgKCppcHY2aCk7CisJaWYgKG9wdCkgeworCQltYXhfaGVhZHJvb20gKz0gODsKKwkJbXR1IC09IDg7CisJfQorCWlmIChtdHUgPCBJUFY2X01JTl9NVFUpCisJCW10dSA9IElQVjZfTUlOX01UVTsKKwlpZiAoc2tiLT5kc3QgJiYgbXR1IDwgZHN0X210dShza2ItPmRzdCkpIHsKKwkJc3RydWN0IHJ0Nl9pbmZvICpydCA9IChzdHJ1Y3QgcnQ2X2luZm8gKikgc2tiLT5kc3Q7CisJCXJ0LT5ydDZpX2ZsYWdzIHw9IFJURl9NT0RJRklFRDsKKwkJcnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9NVFUtMV0gPSBtdHU7CisJfQorCWlmIChza2ItPmxlbiA+IG10dSkgeworCQlpY21wdjZfc2VuZChza2IsIElDTVBWNl9QS1RfVE9PQklHLCAwLCBtdHUsIGRldik7CisJCWdvdG8gdHhfZXJyX2RzdF9yZWxlYXNlOworCX0KKworCS8qCisJICogT2theSwgbm93IHNlZSBpZiB3ZSBjYW4gc3R1ZmYgaXQgaW4gdGhlIGJ1ZmZlciBhcy1pcy4KKwkgKi8KKwltYXhfaGVhZHJvb20gKz0gTExfUkVTRVJWRURfU1BBQ0UodGRldik7CisJCisJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgbWF4X2hlYWRyb29tIHx8IAorCSAgICBza2JfY2xvbmVkKHNrYikgfHwgc2tiX3NoYXJlZChza2IpKSB7CisJCXN0cnVjdCBza19idWZmICpuZXdfc2tiOworCQkKKwkJaWYgKCEobmV3X3NrYiA9IHNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwgbWF4X2hlYWRyb29tKSkpCisJCQlnb3RvIHR4X2Vycl9kc3RfcmVsZWFzZTsKKworCQlpZiAoc2tiLT5zaykKKwkJCXNrYl9zZXRfb3duZXJfdyhuZXdfc2tiLCBza2ItPnNrKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXNrYiA9IG5ld19za2I7CisJfQorCWRzdF9yZWxlYXNlKHNrYi0+ZHN0KTsKKwlza2ItPmRzdCA9IGRzdF9jbG9uZShkc3QpOworCisJc2tiLT5oLnJhdyA9IHNrYi0+bmgucmF3OworCisJaWYgKG9wdCkKKwkJaXB2Nl9wdXNoX25mcmFnX29wdHMoc2tiLCBvcHQsICZwcm90bywgTlVMTCk7CisKKwlza2ItPm5oLnJhdyA9IHNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisJaXB2NmggPSBza2ItPm5oLmlwdjZoOworCSoodTMyKilpcHY2aCA9IGZsLmZsNl9mbG93bGFiZWwgfCBodG9ubCgweDYwMDAwMDAwKTsKKwlkc2ZpZWxkID0gSU5FVF9FQ05fZW5jYXBzdWxhdGUoMCwgZHNmaWVsZCk7CisJaXB2Nl9jaGFuZ2VfZHNmaWVsZChpcHY2aCwgfklORVRfRUNOX01BU0ssIGRzZmllbGQpOworCWlwdjZoLT5wYXlsb2FkX2xlbiA9IGh0b25zKHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisJaXB2NmgtPmhvcF9saW1pdCA9IHQtPnBhcm1zLmhvcF9saW1pdDsKKwlpcHY2aC0+bmV4dGhkciA9IHByb3RvOworCWlwdjZfYWRkcl9jb3B5KCZpcHY2aC0+c2FkZHIsICZmbC5mbDZfc3JjKTsKKwlpcHY2X2FkZHJfY29weSgmaXB2NmgtPmRhZGRyLCAmZmwuZmw2X2RzdCk7CisJbmZfcmVzZXQoc2tiKTsKKwlwa3RfbGVuID0gc2tiLT5sZW47CisJZXJyID0gTkZfSE9PSyhQRl9JTkVUNiwgTkZfSVA2X0xPQ0FMX09VVCwgc2tiLCBOVUxMLCAKKwkJICAgICAgc2tiLT5kc3QtPmRldiwgZHN0X291dHB1dCk7CisKKwlpZiAoZXJyID09IE5FVF9YTUlUX1NVQ0NFU1MgfHwgZXJyID09IE5FVF9YTUlUX0NOKSB7CisJCXN0YXRzLT50eF9ieXRlcyArPSBwa3RfbGVuOworCQlzdGF0cy0+dHhfcGFja2V0cysrOworCX0gZWxzZSB7CisJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwkJc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJfQorCWlwNl90bmxfZHN0X3N0b3JlKHQsIGRzdCk7CisKKwlpZiAob3B0KQorCQlrZnJlZShvcHQpOworCisJdC0+cmVjdXJzaW9uLS07CisJcmV0dXJuIDA7Cit0eF9lcnJfbGlua19mYWlsdXJlOgorCXN0YXRzLT50eF9jYXJyaWVyX2Vycm9ycysrOworCWRzdF9saW5rX2ZhaWx1cmUoc2tiKTsKK3R4X2Vycl9kc3RfcmVsZWFzZToKKwlkc3RfcmVsZWFzZShkc3QpOworCWlmIChvcHQpCisJCWtmcmVlKG9wdCk7Cit0eF9lcnI6CisJc3RhdHMtPnR4X2Vycm9ycysrOworCXN0YXRzLT50eF9kcm9wcGVkKys7CisJa2ZyZWVfc2tiKHNrYik7CisJdC0+cmVjdXJzaW9uLS07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlwNl90bmxfc2V0X2NhcChzdHJ1Y3QgaXA2X3RubCAqdCkKK3sKKwlzdHJ1Y3QgaXA2X3RubF9wYXJtICpwID0gJnQtPnBhcm1zOworCXN0cnVjdCBpbjZfYWRkciAqbGFkZHIgPSAmcC0+bGFkZHI7CisJc3RydWN0IGluNl9hZGRyICpyYWRkciA9ICZwLT5yYWRkcjsKKwlpbnQgbHR5cGUgPSBpcHY2X2FkZHJfdHlwZShsYWRkcik7CisJaW50IHJ0eXBlID0gaXB2Nl9hZGRyX3R5cGUocmFkZHIpOworCisJcC0+ZmxhZ3MgJj0gfihJUDZfVE5MX0ZfQ0FQX1hNSVR8SVA2X1ROTF9GX0NBUF9SQ1YpOworCisJaWYgKGx0eXBlICE9IElQVjZfQUREUl9BTlkgJiYgcnR5cGUgIT0gSVBWNl9BRERSX0FOWSAmJgorCSAgICAoKGx0eXBlfHJ0eXBlKSAmCisJICAgICAoSVBWNl9BRERSX1VOSUNBU1R8CisJICAgICAgSVBWNl9BRERSX0xPT1BCQUNLfElQVjZfQUREUl9MSU5LTE9DQUx8CisJICAgICAgSVBWNl9BRERSX01BUFBFRHxJUFY2X0FERFJfUkVTRVJWRUQpKSA9PSBJUFY2X0FERFJfVU5JQ0FTVCkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqbGRldiA9IE5VTEw7CisJCWludCBsX29rID0gMTsKKwkJaW50IHJfb2sgPSAxOworCisJCWlmIChwLT5saW5rKQorCQkJbGRldiA9IGRldl9nZXRfYnlfaW5kZXgocC0+bGluayk7CisJCQorCQlpZiAobHR5cGUmSVBWNl9BRERSX1VOSUNBU1QgJiYgIWlwdjZfY2hrX2FkZHIobGFkZHIsIGxkZXYsIDApKQorCQkJbF9vayA9IDA7CisJCQorCQlpZiAocnR5cGUmSVBWNl9BRERSX1VOSUNBU1QgJiYgaXB2Nl9jaGtfYWRkcihyYWRkciwgTlVMTCwgMCkpCisJCQlyX29rID0gMDsKKwkJCisJCWlmIChsX29rICYmIHJfb2spIHsKKwkJCWlmIChsdHlwZSZJUFY2X0FERFJfVU5JQ0FTVCkKKwkJCQlwLT5mbGFncyB8PSBJUDZfVE5MX0ZfQ0FQX1hNSVQ7CisJCQlpZiAocnR5cGUmSVBWNl9BRERSX1VOSUNBU1QpCisJCQkJcC0+ZmxhZ3MgfD0gSVA2X1ROTF9GX0NBUF9SQ1Y7CisJCX0KKwkJaWYgKGxkZXYpCisJCQlkZXZfcHV0KGxkZXYpOworCX0KK30KKworc3RhdGljIHZvaWQgaXA2aXA2X3RubF9saW5rX2NvbmZpZyhzdHJ1Y3QgaXA2X3RubCAqdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdC0+ZGV2OworCXN0cnVjdCBpcDZfdG5sX3Bhcm0gKnAgPSAmdC0+cGFybXM7CisJc3RydWN0IGZsb3dpICpmbCA9ICZ0LT5mbDsKKworCW1lbWNweSgmZGV2LT5kZXZfYWRkciwgJnAtPmxhZGRyLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisJbWVtY3B5KCZkZXYtPmJyb2FkY2FzdCwgJnAtPnJhZGRyLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisKKwkvKiBTZXQgdXAgZmxvd2kgdGVtcGxhdGUgKi8KKwlpcHY2X2FkZHJfY29weSgmZmwtPmZsNl9zcmMsICZwLT5sYWRkcik7CisJaXB2Nl9hZGRyX2NvcHkoJmZsLT5mbDZfZHN0LCAmcC0+cmFkZHIpOworCWZsLT5vaWYgPSBwLT5saW5rOworCWZsLT5mbDZfZmxvd2xhYmVsID0gMDsKKworCWlmICghKHAtPmZsYWdzJklQNl9UTkxfRl9VU0VfT1JJR19UQ0xBU1MpKQorCQlmbC0+Zmw2X2Zsb3dsYWJlbCB8PSBJUFY2X1RDTEFTU19NQVNLICYgcC0+Zmxvd2luZm87CisJaWYgKCEocC0+ZmxhZ3MmSVA2X1ROTF9GX1VTRV9PUklHX0ZMT1dMQUJFTCkpCisJCWZsLT5mbDZfZmxvd2xhYmVsIHw9IElQVjZfRkxPV0xBQkVMX01BU0sgJiBwLT5mbG93aW5mbzsKKworCWlwNl90bmxfc2V0X2NhcCh0KTsKKworCWlmIChwLT5mbGFncyZJUDZfVE5MX0ZfQ0FQX1hNSVQgJiYgcC0+ZmxhZ3MmSVA2X1ROTF9GX0NBUF9SQ1YpCisJCWRldi0+ZmxhZ3MgfD0gSUZGX1BPSU5UT1BPSU5UOworCWVsc2UKKwkJZGV2LT5mbGFncyAmPSB+SUZGX1BPSU5UT1BPSU5UOworCisJZGV2LT5pZmxpbmsgPSBwLT5saW5rOworCisJaWYgKHAtPmZsYWdzICYgSVA2X1ROTF9GX0NBUF9YTUlUKSB7CisJCXN0cnVjdCBydDZfaW5mbyAqcnQgPSBydDZfbG9va3VwKCZwLT5yYWRkciwgJnAtPmxhZGRyLAorCQkJCQkJIHAtPmxpbmssIDApOworCisJCWlmIChydCA9PSBOVUxMKQorCQkJcmV0dXJuOworCisJCWlmIChydC0+cnQ2aV9kZXYpIHsKKwkJCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gcnQtPnJ0NmlfZGV2LT5oYXJkX2hlYWRlcl9sZW4gKworCQkJCXNpemVvZiAoc3RydWN0IGlwdjZoZHIpOworCisJCQlkZXYtPm10dSA9IHJ0LT5ydDZpX2Rldi0+bXR1IC0gc2l6ZW9mIChzdHJ1Y3QgaXB2Nmhkcik7CisKKwkJCWlmIChkZXYtPm10dSA8IElQVjZfTUlOX01UVSkKKwkJCQlkZXYtPm10dSA9IElQVjZfTUlOX01UVTsKKwkJfQorCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwl9Cit9CisKKy8qKgorICogaXA2aXA2X3RubF9jaGFuZ2UgLSB1cGRhdGUgdGhlIHR1bm5lbCBwYXJhbWV0ZXJzCisgKiAgIEB0OiB0dW5uZWwgdG8gYmUgY2hhbmdlZAorICogICBAcDogdHVubmVsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICogICBAYWN0aXZlOiAhPSAwIGlmIHR1bm5lbCBpcyByZWFkeSBmb3IgdXNlCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIGlwNmlwNl90bmxfY2hhbmdlKCkgdXBkYXRlcyB0aGUgdHVubmVsIHBhcmFtZXRlcnMKKyAqKi8KKworc3RhdGljIGludAoraXA2aXA2X3RubF9jaGFuZ2Uoc3RydWN0IGlwNl90bmwgKnQsIHN0cnVjdCBpcDZfdG5sX3Bhcm0gKnApCit7CisJaXB2Nl9hZGRyX2NvcHkoJnQtPnBhcm1zLmxhZGRyLCAmcC0+bGFkZHIpOworCWlwdjZfYWRkcl9jb3B5KCZ0LT5wYXJtcy5yYWRkciwgJnAtPnJhZGRyKTsKKwl0LT5wYXJtcy5mbGFncyA9IHAtPmZsYWdzOworCXQtPnBhcm1zLmhvcF9saW1pdCA9IHAtPmhvcF9saW1pdDsKKwl0LT5wYXJtcy5lbmNhcF9saW1pdCA9IHAtPmVuY2FwX2xpbWl0OworCXQtPnBhcm1zLmZsb3dpbmZvID0gcC0+Zmxvd2luZm87CisJaXA2aXA2X3RubF9saW5rX2NvbmZpZyh0KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpcDZpcDZfdG5sX2lvY3RsIC0gY29uZmlndXJlIGlwdjYgdHVubmVscyBmcm9tIHVzZXJzcGFjZSAKKyAqICAgQGRldjogdmlydHVhbCBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHR1bm5lbAorICogICBAaWZyOiBwYXJhbWV0ZXJzIHBhc3NlZCBmcm9tIHVzZXJzcGFjZQorICogICBAY21kOiBjb21tYW5kIHRvIGJlIHBlcmZvcm1lZAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBpcDZpcDZfdG5sX2lvY3RsKCkgaXMgdXNlZCBmb3IgbWFuYWdpbmcgSVB2NiB0dW5uZWxzIAorICogICBmcm9tIHVzZXJzcGFjZS4gCisgKgorICogICBUaGUgcG9zc2libGUgY29tbWFuZHMgYXJlIHRoZSBmb2xsb3dpbmc6CisgKiAgICAgJVNJT0NHRVRUVU5ORUw6IGdldCB0dW5uZWwgcGFyYW1ldGVycyBmb3IgZGV2aWNlCisgKiAgICAgJVNJT0NBRERUVU5ORUw6IGFkZCB0dW5uZWwgbWF0Y2hpbmcgZ2l2ZW4gdHVubmVsIHBhcmFtZXRlcnMKKyAqICAgICAlU0lPQ0NIR1RVTk5FTDogY2hhbmdlIHR1bm5lbCBwYXJhbWV0ZXJzIHRvIHRob3NlIGdpdmVuCisgKiAgICAgJVNJT0NERUxUVU5ORUw6IGRlbGV0ZSB0dW5uZWwKKyAqCisgKiAgIFRoZSBmYWxsYmFjayBkZXZpY2UgImlwNnRubDAiLCBjcmVhdGVkIGR1cmluZyBtb2R1bGUgCisgKiAgIGluaXRpYWxpemF0aW9uLCBjYW4gYmUgdXNlZCBmb3IgY3JlYXRpbmcgb3RoZXIgdHVubmVsIGRldmljZXMuCisgKgorICogUmV0dXJuOgorICogICAwIG9uIHN1Y2Nlc3MsCisgKiAgICUtRUZBVUxUIGlmIHVuYWJsZSB0byBjb3B5IGRhdGEgdG8gb3IgZnJvbSB1c2Vyc3BhY2UsCisgKiAgICUtRVBFUk0gaWYgY3VycmVudCBwcm9jZXNzIGhhc24ndCAlQ0FQX05FVF9BRE1JTiBzZXQKKyAqICAgJS1FSU5WQUwgaWYgcGFzc2VkIHR1bm5lbCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLAorICogICAlLUVFWElTVCBpZiBjaGFuZ2luZyBhIHR1bm5lbCdzIHBhcmFtZXRlcnMgd291bGQgY2F1c2UgYSBjb25mbGljdAorICogICAlLUVOT0RFViBpZiBhdHRlbXB0aW5nIHRvIGNoYW5nZSBvciBkZWxldGUgYSBub25leGlzdGluZyBkZXZpY2UKKyAqKi8KKworc3RhdGljIGludAoraXA2aXA2X3RubF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlpbnQgZXJyID0gMDsKKwlpbnQgY3JlYXRlOworCXN0cnVjdCBpcDZfdG5sX3Bhcm0gcDsKKwlzdHJ1Y3QgaXA2X3RubCAqdCA9IE5VTEw7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0dFVFRVTk5FTDoKKwkJaWYgKGRldiA9PSBpcDZpcDZfZmJfdG5sX2RldikgeworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLAorCQkJCQkgICBpZnItPmlmcl9pZnJ1LmlmcnVfZGF0YSwKKwkJCQkJICAgc2l6ZW9mIChwKSkpIHsKKwkJCQllcnIgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKChlcnIgPSBpcDZpcDZfdG5sX2xvY2F0ZSgmcCwgJnQsIDApKSA9PSAtRU5PREVWKQorCQkJCXQgPSAoc3RydWN0IGlwNl90bmwgKikgZGV2LT5wcml2OworCQkJZWxzZSBpZiAoZXJyKQorCQkJCWJyZWFrOworCQl9IGVsc2UKKwkJCXQgPSAoc3RydWN0IGlwNl90bmwgKikgZGV2LT5wcml2OworCisJCW1lbWNweSgmcCwgJnQtPnBhcm1zLCBzaXplb2YgKHApKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9pZnJ1LmlmcnVfZGF0YSwgJnAsIHNpemVvZiAocCkpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCWNhc2UgU0lPQ0FERFRVTk5FTDoKKwljYXNlIFNJT0NDSEdUVU5ORUw6CisJCWVyciA9IC1FUEVSTTsKKwkJY3JlYXRlID0gKGNtZCA9PSBTSU9DQUREVFVOTkVMKTsKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJYnJlYWs7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcCwgaWZyLT5pZnJfaWZydS5pZnJ1X2RhdGEsIHNpemVvZiAocCkpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFjcmVhdGUgJiYgZGV2ICE9IGlwNmlwNl9mYl90bmxfZGV2KSB7CisJCQl0ID0gKHN0cnVjdCBpcDZfdG5sICopIGRldi0+cHJpdjsKKwkJfQorCQlpZiAoIXQgJiYgKGVyciA9IGlwNmlwNl90bmxfbG9jYXRlKCZwLCAmdCwgY3JlYXRlKSkpIHsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjbWQgPT0gU0lPQ0NIR1RVTk5FTCkgeworCQkJaWYgKHQtPmRldiAhPSBkZXYpIHsKKwkJCQllcnIgPSAtRUVYSVNUOworCQkJCWJyZWFrOworCQkJfQorCQkJaXA2aXA2X3RubF91bmxpbmsodCk7CisJCQllcnIgPSBpcDZpcDZfdG5sX2NoYW5nZSh0LCAmcCk7CisJCQlpcDZpcDZfdG5sX2xpbmsodCk7CisJCQluZXRkZXZfc3RhdGVfY2hhbmdlKGRldik7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9pZnJ1LmlmcnVfZGF0YSwKKwkJCQkgJnQtPnBhcm1zLCBzaXplb2YgKHApKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJfSBlbHNlIHsKKwkJCWVyciA9IDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTSU9DREVMVFVOTkVMOgorCQllcnIgPSAtRVBFUk07CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCWJyZWFrOworCisJCWlmIChkZXYgPT0gaXA2aXA2X2ZiX3RubF9kZXYpIHsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmcCwgaWZyLT5pZnJfaWZydS5pZnJ1X2RhdGEsCisJCQkJCSAgIHNpemVvZiAocCkpKSB7CisJCQkJZXJyID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVyciA9IGlwNmlwNl90bmxfbG9jYXRlKCZwLCAmdCwgMCk7CisJCQlpZiAoZXJyKQorCQkJCWJyZWFrOworCQkJaWYgKHQgPT0gaXA2aXA2X2ZiX3RubF9kZXYtPnByaXYpIHsKKwkJCQllcnIgPSAtRVBFUk07CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0ID0gKHN0cnVjdCBpcDZfdG5sICopIGRldi0+cHJpdjsKKwkJfQorCQllcnIgPSB1bnJlZ2lzdGVyX25ldGRldmljZSh0LT5kZXYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGlwNmlwNl90bmxfZ2V0X3N0YXRzIC0gcmV0dXJuIHRoZSBzdGF0cyBmb3IgdHVubmVsIGRldmljZSAKKyAqICAgQGRldjogdmlydHVhbCBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHR1bm5lbAorICoKKyAqIFJldHVybjogc3RhdHMgZm9yIGRldmljZQorICoqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgoraXA2aXA2X3RubF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gJigoKHN0cnVjdCBpcDZfdG5sICopIGRldi0+cHJpdiktPnN0YXQpOworfQorCisvKioKKyAqIGlwNmlwNl90bmxfY2hhbmdlX210dSAtIGNoYW5nZSBtdHUgbWFudWFsbHkgZm9yIHR1bm5lbCBkZXZpY2UKKyAqICAgQGRldjogdmlydHVhbCBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHR1bm5lbAorICogICBAbmV3X210dTogdGhlIG5ldyBtdHUKKyAqCisgKiBSZXR1cm46CisgKiAgIDAgb24gc3VjY2VzcywKKyAqICAgJS1FSU5WQUwgaWYgbXR1IHRvbyBzbWFsbAorICoqLworCitzdGF0aWMgaW50CitpcDZpcDZfdG5sX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJaWYgKG5ld19tdHUgPCBJUFY2X01JTl9NVFUpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRldi0+bXR1ID0gbmV3X210dTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpcDZpcDZfdG5sX2Rldl9zZXR1cCAtIHNldHVwIHZpcnR1YWwgdHVubmVsIGRldmljZQorICogICBAZGV2OiB2aXJ0dWFsIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdHVubmVsCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIEluaXRpYWxpemUgZnVuY3Rpb24gcG9pbnRlcnMgYW5kIGRldmljZSBwYXJhbWV0ZXJzCisgKiovCisKK3N0YXRpYyB2b2lkIGlwNmlwNl90bmxfZGV2X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCWRldi0+dW5pbml0ID0gaXA2aXA2X3RubF9kZXZfdW5pbml0OworCWRldi0+ZGVzdHJ1Y3RvciA9IGZyZWVfbmV0ZGV2OworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gaXA2aXA2X3RubF94bWl0OworCWRldi0+Z2V0X3N0YXRzID0gaXA2aXA2X3RubF9nZXRfc3RhdHM7CisJZGV2LT5kb19pb2N0bCA9IGlwNmlwNl90bmxfaW9jdGw7CisJZGV2LT5jaGFuZ2VfbXR1ID0gaXA2aXA2X3RubF9jaGFuZ2VfbXR1OworCisJZGV2LT50eXBlID0gQVJQSFJEX1RVTk5FTDY7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBMTF9NQVhfSEVBREVSICsgc2l6ZW9mIChzdHJ1Y3QgaXB2Nmhkcik7CisJZGV2LT5tdHUgPSBFVEhfREFUQV9MRU4gLSBzaXplb2YgKHN0cnVjdCBpcHY2aGRyKTsKKwlkZXYtPmZsYWdzIHw9IElGRl9OT0FSUDsKKwlkZXYtPmFkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7Cit9CisKKworLyoqCisgKiBpcDZpcDZfdG5sX2Rldl9pbml0X2dlbiAtIGdlbmVyYWwgaW5pdGlhbGl6ZXIgZm9yIGFsbCB0dW5uZWwgZGV2aWNlcworICogICBAZGV2OiB2aXJ0dWFsIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdHVubmVsCisgKiovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraXA2aXA2X3RubF9kZXZfaW5pdF9nZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXA2X3RubCAqdCA9IChzdHJ1Y3QgaXA2X3RubCAqKSBkZXYtPnByaXY7CisJdC0+ZmwucHJvdG8gPSBJUFBST1RPX0lQVjY7CisJdC0+ZGV2ID0gZGV2OworCXN0cmNweSh0LT5wYXJtcy5uYW1lLCBkZXYtPm5hbWUpOworfQorCisvKioKKyAqIGlwNmlwNl90bmxfZGV2X2luaXQgLSBpbml0aWFsaXplciBmb3IgYWxsIG5vbiBmYWxsYmFjayB0dW5uZWwgZGV2aWNlcworICogICBAZGV2OiB2aXJ0dWFsIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdHVubmVsCisgKiovCisKK3N0YXRpYyBpbnQKK2lwNmlwNl90bmxfZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXA2X3RubCAqdCA9IChzdHJ1Y3QgaXA2X3RubCAqKSBkZXYtPnByaXY7CisJaXA2aXA2X3RubF9kZXZfaW5pdF9nZW4oZGV2KTsKKwlpcDZpcDZfdG5sX2xpbmtfY29uZmlnKHQpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGlwNmlwNl9mYl90bmxfZGV2X2luaXQgLSBpbml0aWFsaXplciBmb3IgZmFsbGJhY2sgdHVubmVsIGRldmljZQorICogICBAZGV2OiBmYWxsYmFjayBkZXZpY2UKKyAqCisgKiBSZXR1cm46IDAKKyAqKi8KKworc3RhdGljIGludCAKK2lwNmlwNl9mYl90bmxfZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXA2X3RubCAqdCA9IGRldi0+cHJpdjsKKwlpcDZpcDZfdG5sX2Rldl9pbml0X2dlbihkZXYpOworCWRldl9ob2xkKGRldik7CisJdG5sc193Y1swXSA9IHQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeGZybTZfdHVubmVsIGlwNmlwNl9oYW5kbGVyID0geworCS5oYW5kbGVyID0gaXA2aXA2X3JjdiwKKwkuZXJyX2hhbmRsZXIgPSBpcDZpcDZfZXJyLAorfTsKKworLyoqCisgKiBpcDZfdHVubmVsX2luaXQgLSByZWdpc3RlciBwcm90b2NvbCBhbmQgcmVzZXJ2ZSBuZWVkZWQgcmVzb3VyY2VzCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MKKyAqKi8KKworc3RhdGljIGludCBfX2luaXQgaXA2X3R1bm5lbF9pbml0KHZvaWQpCit7CisJaW50ICBlcnI7CisKKwlpZiAoeGZybTZfdHVubmVsX3JlZ2lzdGVyKCZpcDZpcDZfaGFuZGxlcikgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXA2aXA2IGluaXQ6IGNhbid0IHJlZ2lzdGVyIHR1bm5lbFxuIik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlpcDZpcDZfZmJfdG5sX2RldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IGlwNl90bmwpLCAiaXA2dG5sMCIsCisJCQkJCSBpcDZpcDZfdG5sX2Rldl9zZXR1cCk7CisKKwlpZiAoIWlwNmlwNl9mYl90bmxfZGV2KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisJaXA2aXA2X2ZiX3RubF9kZXYtPmluaXQgPSBpcDZpcDZfZmJfdG5sX2Rldl9pbml0OworCisJaWYgKChlcnIgPSByZWdpc3Rlcl9uZXRkZXYoaXA2aXA2X2ZiX3RubF9kZXYpKSkgeworCQlmcmVlX25ldGRldihpcDZpcDZfZmJfdG5sX2Rldik7CisJCWdvdG8gZmFpbDsKKwl9CisJcmV0dXJuIDA7CitmYWlsOgorCXhmcm02X3R1bm5lbF9kZXJlZ2lzdGVyKCZpcDZpcDZfaGFuZGxlcik7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBpcDZfdHVubmVsX2NsZWFudXAgLSBmcmVlIHJlc291cmNlcyBhbmQgdW5yZWdpc3RlciBwcm90b2NvbAorICoqLworCitzdGF0aWMgdm9pZCBfX2V4aXQgaXA2X3R1bm5lbF9jbGVhbnVwKHZvaWQpCit7CisJaWYgKHhmcm02X3R1bm5lbF9kZXJlZ2lzdGVyKCZpcDZpcDZfaGFuZGxlcikgPCAwKQorCQlwcmludGsoS0VSTl9JTkZPICJpcDZpcDYgY2xvc2U6IGNhbid0IGRlcmVnaXN0ZXIgdHVubmVsXG4iKTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGlwNmlwNl9mYl90bmxfZGV2KTsKK30KKworbW9kdWxlX2luaXQoaXA2X3R1bm5lbF9pbml0KTsKK21vZHVsZV9leGl0KGlwNl90dW5uZWxfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcGNvbXA2LmMgYi9uZXQvaXB2Ni9pcGNvbXA2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkZTUzMQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY2L2lwY29tcDYuYwpAQCAtMCwwICsxLDUyNCBAQAorLyoKKyAqIElQIFBheWxvYWQgQ29tcHJlc3Npb24gUHJvdG9jb2wgKElQQ29tcCkgZm9yIElQdjYgLSBSRkMzMTczCisgKgorICogQ29weXJpZ2h0IChDKTIwMDMgVVNBR0kvV0lERSBQcm9qZWN0CisgKgorICogQXV0aG9yCU1pdHN1cnUgS0FOREEgIDxta0BsaW51eC1pcHY2Lm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworLyogCisgKiBbTWVtb10KKyAqCisgKiBPdXRib3VuZDoKKyAqICBUaGUgY29tcHJlc3Npb24gb2YgSVAgZGF0YWdyYW0gTVVTVCBiZSBkb25lIGJlZm9yZSBBSC9FU1AgcHJvY2Vzc2luZywgCisgKiAgZnJhZ21lbnRhdGlvbiwgYW5kIHRoZSBhZGRpdGlvbiBvZiBIb3AtYnktSG9wL1JvdXRpbmcgaGVhZGVyLiAKKyAqCisgKiBJbmJvdW5kOgorICogIFRoZSBkZWNvbXByZXNzaW9uIG9mIElQIGRhdGFncmFtIE1VU1QgYmUgZG9uZSBhZnRlciB0aGUgcmVhc3NlbWJseSwgCisgKiAgQUgvRVNQIHByb2Nlc3NpbmcuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQveGZybS5oPgorI2luY2x1ZGUgPG5ldC9pcGNvbXAuaD4KKyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvcGZrZXl2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L2ljbXAuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wdjYuaD4KKworc3RydWN0IGlwY29tcDZfdGZtcyB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBjcnlwdG9fdGZtICoqdGZtczsKKwlpbnQgdXNlcnM7Cit9OworCitzdGF0aWMgREVDTEFSRV9NVVRFWChpcGNvbXA2X3Jlc291cmNlX3NlbSk7CitzdGF0aWMgdm9pZCAqKmlwY29tcDZfc2NyYXRjaGVzOworc3RhdGljIGludCBpcGNvbXA2X3NjcmF0Y2hfdXNlcnM7CitzdGF0aWMgTElTVF9IRUFEKGlwY29tcDZfdGZtc19saXN0KTsKKworc3RhdGljIGludCBpcGNvbXA2X2lucHV0KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBzdHJ1Y3QgeGZybV9kZWNhcF9zdGF0ZSAqZGVjYXAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGVyciA9IDA7CisJdTggbmV4dGhkciA9IDA7CisJaW50IGhkcl9sZW4gPSBza2ItPmgucmF3IC0gc2tiLT5uaC5yYXc7CisJdW5zaWduZWQgY2hhciAqdG1wX2hkciA9IE5VTEw7CisJc3RydWN0IGlwdjZoZHIgKmlwaDsKKwlpbnQgcGxlbiwgZGxlbjsKKwlzdHJ1Y3QgaXBjb21wX2RhdGEgKmlwY2QgPSB4LT5kYXRhOworCXU4ICpzdGFydCwgKnNjcmF0Y2g7CisJc3RydWN0IGNyeXB0b190Zm0gKnRmbTsKKwlpbnQgY3B1OworCisJaWYgKChza2JfaXNfbm9ubGluZWFyKHNrYikgfHwgc2tiX2Nsb25lZChza2IpKSAmJgorCQlza2JfbGluZWFyaXplKHNrYiwgR0ZQX0FUT01JQykgIT0gMCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisKKwkvKiBSZW1vdmUgaXBjb21wIGhlYWRlciBhbmQgZGVjb21wcmVzcyBvcmlnaW5hbCBwYXlsb2FkICovCisJaXBoID0gc2tiLT5uaC5pcHY2aDsKKwl0bXBfaGRyID0ga21hbGxvYyhoZHJfbGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXRtcF9oZHIpCisJCWdvdG8gb3V0OworCW1lbWNweSh0bXBfaGRyLCBpcGgsIGhkcl9sZW4pOworCW5leHRoZHIgPSAqKHU4ICopc2tiLT5kYXRhOworCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2X2NvbXBfaGRyKSk7IAorCXNrYi0+bmgucmF3ICs9IHNpemVvZihzdHJ1Y3QgaXB2Nl9jb21wX2hkcik7CisJbWVtY3B5KHNrYi0+bmgucmF3LCB0bXBfaGRyLCBoZHJfbGVuKTsKKwlpcGggPSBza2ItPm5oLmlwdjZoOworCWlwaC0+cGF5bG9hZF9sZW4gPSBodG9ucyhudG9ocyhpcGgtPnBheWxvYWRfbGVuKSAtIHNpemVvZihzdHJ1Y3QgaXB2Nl9jb21wX2hkcikpOworCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisKKwkvKiBkZWNvbXByZXNzaW9uICovCisJcGxlbiA9IHNrYi0+bGVuOworCWRsZW4gPSBJUENPTVBfU0NSQVRDSF9TSVpFOworCXN0YXJ0ID0gc2tiLT5kYXRhOworCisJY3B1ID0gZ2V0X2NwdSgpOworCXNjcmF0Y2ggPSAqcGVyX2NwdV9wdHIoaXBjb21wNl9zY3JhdGNoZXMsIGNwdSk7CisJdGZtID0gKnBlcl9jcHVfcHRyKGlwY2QtPnRmbXMsIGNwdSk7CisKKwllcnIgPSBjcnlwdG9fY29tcF9kZWNvbXByZXNzKHRmbSwgc3RhcnQsIHBsZW4sIHNjcmF0Y2gsICZkbGVuKTsKKwlpZiAoZXJyKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3B1dF9jcHU7CisJfQorCisJaWYgKGRsZW4gPCAocGxlbiArIHNpemVvZihzdHJ1Y3QgaXB2Nl9jb21wX2hkcikpKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3B1dF9jcHU7CisJfQorCisJZXJyID0gcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIGRsZW4gLSBwbGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAoZXJyKSB7CisJCWdvdG8gb3V0X3B1dF9jcHU7CisJfQorCisJc2tiX3B1dChza2IsIGRsZW4gLSBwbGVuKTsKKwltZW1jcHkoc2tiLT5kYXRhLCBzY3JhdGNoLCBkbGVuKTsKKworCWlwaCA9IHNrYi0+bmguaXB2Nmg7CisJaXBoLT5wYXlsb2FkX2xlbiA9IGh0b25zKHNrYi0+bGVuKTsKKwkKK291dF9wdXRfY3B1OgorCXB1dF9jcHUoKTsKK291dDoKKwlpZiAodG1wX2hkcikKKwkJa2ZyZWUodG1wX2hkcik7CisJaWYgKGVycikKKwkJZ290byBlcnJvcl9vdXQ7CisJcmV0dXJuIG5leHRoZHI7CitlcnJvcl9vdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpcGNvbXA2X291dHB1dChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBpcHY2aGRyICp0b3BfaXBoOworCWludCBoZHJfbGVuOworCXN0cnVjdCBpcHY2X2NvbXBfaGRyICppcGNoOworCXN0cnVjdCBpcGNvbXBfZGF0YSAqaXBjZCA9IHgtPmRhdGE7CisJaW50IHBsZW4sIGRsZW47CisJdTggKnN0YXJ0LCAqc2NyYXRjaDsKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtOworCWludCBjcHU7CisKKwloZHJfbGVuID0gc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YTsKKworCS8qIGNoZWNrIHdoZXRoZXIgZGF0YWdyYW0gbGVuIGlzIGxhcmdlciB0aGFuIHRocmVzaG9sZCAqLworCWlmICgoc2tiLT5sZW4gLSBoZHJfbGVuKSA8IGlwY2QtPnRocmVzaG9sZCkgeworCQlnb3RvIG91dF9vazsKKwl9CisKKwlpZiAoKHNrYl9pc19ub25saW5lYXIoc2tiKSB8fCBza2JfY2xvbmVkKHNrYikpICYmCisJCXNrYl9saW5lYXJpemUoc2tiLCBHRlBfQVRPTUlDKSAhPSAwKSB7CisJCWdvdG8gb3V0X29rOworCX0KKworCS8qIGNvbXByZXNzaW9uICovCisJcGxlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbjsKKwlkbGVuID0gSVBDT01QX1NDUkFUQ0hfU0laRTsKKwlzdGFydCA9IHNrYi0+aC5yYXc7CisKKwljcHUgPSBnZXRfY3B1KCk7CisJc2NyYXRjaCA9ICpwZXJfY3B1X3B0cihpcGNvbXA2X3NjcmF0Y2hlcywgY3B1KTsKKwl0Zm0gPSAqcGVyX2NwdV9wdHIoaXBjZC0+dGZtcywgY3B1KTsKKworCWVyciA9IGNyeXB0b19jb21wX2NvbXByZXNzKHRmbSwgc3RhcnQsIHBsZW4sIHNjcmF0Y2gsICZkbGVuKTsKKwlpZiAoZXJyIHx8IChkbGVuICsgc2l6ZW9mKHN0cnVjdCBpcHY2X2NvbXBfaGRyKSkgPj0gcGxlbikgeworCQlwdXRfY3B1KCk7CisJCWdvdG8gb3V0X29rOworCX0KKwltZW1jcHkoc3RhcnQgKyBzaXplb2Yoc3RydWN0IGlwX2NvbXBfaGRyKSwgc2NyYXRjaCwgZGxlbik7CisJcHV0X2NwdSgpOworCXBza2JfdHJpbShza2IsIGhkcl9sZW4gKyBkbGVuICsgc2l6ZW9mKHN0cnVjdCBpcF9jb21wX2hkcikpOworCisJLyogaW5zZXJ0IGlwY29tcCBoZWFkZXIgYW5kIHJlcGxhY2UgZGF0YWdyYW0gKi8KKwl0b3BfaXBoID0gKHN0cnVjdCBpcHY2aGRyICopc2tiLT5kYXRhOworCisJdG9wX2lwaC0+cGF5bG9hZF9sZW4gPSBodG9ucyhza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCisJaXBjaCA9IChzdHJ1Y3QgaXB2Nl9jb21wX2hkciAqKXN0YXJ0OworCWlwY2gtPm5leHRoZHIgPSAqc2tiLT5uaC5yYXc7CisJaXBjaC0+ZmxhZ3MgPSAwOworCWlwY2gtPmNwaSA9IGh0b25zKCh1MTYgKW50b2hsKHgtPmlkLnNwaSkpOworCSpza2ItPm5oLnJhdyA9IElQUFJPVE9fQ09NUDsKKworb3V0X29rOgorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpcGNvbXA2X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCwKKwkJICAgICAgICAgICAgICAgIGludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX191MzIgaW5mbykKK3sKKwl1MzIgc3BpOworCXN0cnVjdCBpcHY2aGRyICppcGggPSAoc3RydWN0IGlwdjZoZHIqKXNrYi0+ZGF0YTsKKwlzdHJ1Y3QgaXB2Nl9jb21wX2hkciAqaXBjb21waCA9IChzdHJ1Y3QgaXB2Nl9jb21wX2hkciopKHNrYi0+ZGF0YStvZmZzZXQpOworCXN0cnVjdCB4ZnJtX3N0YXRlICp4OworCisJaWYgKHR5cGUgIT0gSUNNUFY2X0RFU1RfVU5SRUFDSCAmJiB0eXBlICE9IElDTVBWNl9QS1RfVE9PQklHKQorCQlyZXR1cm47CisKKwlzcGkgPSBudG9obChudG9ocyhpcGNvbXBoLT5jcGkpKTsKKwl4ID0geGZybV9zdGF0ZV9sb29rdXAoKHhmcm1fYWRkcmVzc190ICopJmlwaC0+ZGFkZHIsIHNwaSwgSVBQUk9UT19DT01QLCBBRl9JTkVUNik7CisJaWYgKCF4KQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9ERUJVRyAicG10dSBkaXNjb3Zlcnkgb24gU0EgSVBDT01QLyUwOHgvIgorCQkJIiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eFxuIiwKKwkJCXNwaSwgTklQNihpcGgtPmRhZGRyKSk7CisJeGZybV9zdGF0ZV9wdXQoeCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeGZybV9zdGF0ZSAqaXBjb21wNl90dW5uZWxfY3JlYXRlKHN0cnVjdCB4ZnJtX3N0YXRlICp4KQoreworCXN0cnVjdCB4ZnJtX3N0YXRlICp0ID0gTlVMTDsKKworCXQgPSB4ZnJtX3N0YXRlX2FsbG9jKCk7CisJaWYgKCF0KQorCQlnb3RvIG91dDsKKworCXQtPmlkLnByb3RvID0gSVBQUk9UT19JUFY2OworCXQtPmlkLnNwaSA9IHhmcm02X3R1bm5lbF9hbGxvY19zcGkoKHhmcm1fYWRkcmVzc190ICopJngtPnByb3BzLnNhZGRyKTsKKwltZW1jcHkodC0+aWQuZGFkZHIuYTYsIHgtPmlkLmRhZGRyLmE2LCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisJbWVtY3B5KCZ0LT5zZWwsICZ4LT5zZWwsIHNpemVvZih0LT5zZWwpKTsKKwl0LT5wcm9wcy5mYW1pbHkgPSBBRl9JTkVUNjsKKwl0LT5wcm9wcy5tb2RlID0gMTsKKwltZW1jcHkodC0+cHJvcHMuc2FkZHIuYTYsIHgtPnByb3BzLnNhZGRyLmE2LCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisKKwl0LT50eXBlID0geGZybV9nZXRfdHlwZShJUFBST1RPX0lQVjYsIHQtPnByb3BzLmZhbWlseSk7CisJaWYgKHQtPnR5cGUgPT0gTlVMTCkKKwkJZ290byBlcnJvcjsKKworCWlmICh0LT50eXBlLT5pbml0X3N0YXRlKHQsIE5VTEwpKQorCQlnb3RvIGVycm9yOworCisJdC0+a20uc3RhdGUgPSBYRlJNX1NUQVRFX1ZBTElEOworCWF0b21pY19zZXQoJnQtPnR1bm5lbF91c2VycywgMSk7CisKK291dDoKKwlyZXR1cm4gdDsKKworZXJyb3I6CisJeGZybV9zdGF0ZV9wdXQodCk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBpbnQgaXBjb21wNl90dW5uZWxfYXR0YWNoKHN0cnVjdCB4ZnJtX3N0YXRlICp4KQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCB4ZnJtX3N0YXRlICp0ID0gTlVMTDsKKwl1MzIgc3BpOworCisJc3BpID0geGZybTZfdHVubmVsX3NwaV9sb29rdXAoKHhmcm1fYWRkcmVzc190ICopJngtPnByb3BzLnNhZGRyKTsKKwlpZiAoc3BpKQorCQl0ID0geGZybV9zdGF0ZV9sb29rdXAoKHhmcm1fYWRkcmVzc190ICopJngtPmlkLmRhZGRyLAorCQkJCQkgICAgICBzcGksIElQUFJPVE9fSVBWNiwgQUZfSU5FVDYpOworCWlmICghdCkgeworCQl0ID0gaXBjb21wNl90dW5uZWxfY3JlYXRlKHgpOworCQlpZiAoIXQpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCQl4ZnJtX3N0YXRlX2luc2VydCh0KTsKKwkJeGZybV9zdGF0ZV9ob2xkKHQpOworCX0KKwl4LT50dW5uZWwgPSB0OworCWF0b21pY19pbmMoJnQtPnR1bm5lbF91c2Vycyk7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBpcGNvbXA2X2ZyZWVfc2NyYXRjaGVzKHZvaWQpCit7CisJaW50IGk7CisJdm9pZCAqKnNjcmF0Y2hlczsKKworCWlmICgtLWlwY29tcDZfc2NyYXRjaF91c2VycykKKwkJcmV0dXJuOworCisJc2NyYXRjaGVzID0gaXBjb21wNl9zY3JhdGNoZXM7CisJaWYgKCFzY3JhdGNoZXMpCisJCXJldHVybjsKKworCWZvcl9lYWNoX2NwdShpKSB7CisJCXZvaWQgKnNjcmF0Y2ggPSAqcGVyX2NwdV9wdHIoc2NyYXRjaGVzLCBpKTsKKwkJaWYgKHNjcmF0Y2gpCisJCQl2ZnJlZShzY3JhdGNoKTsKKwl9CisKKwlmcmVlX3BlcmNwdShzY3JhdGNoZXMpOworfQorCitzdGF0aWMgdm9pZCAqKmlwY29tcDZfYWxsb2Nfc2NyYXRjaGVzKHZvaWQpCit7CisJaW50IGk7CisJdm9pZCAqKnNjcmF0Y2hlczsKKworCWlmIChpcGNvbXA2X3NjcmF0Y2hfdXNlcnMrKykKKwkJcmV0dXJuIGlwY29tcDZfc2NyYXRjaGVzOworCisJc2NyYXRjaGVzID0gYWxsb2NfcGVyY3B1KHZvaWQgKik7CisJaWYgKCFzY3JhdGNoZXMpCisJCXJldHVybiBOVUxMOworCisJaXBjb21wNl9zY3JhdGNoZXMgPSBzY3JhdGNoZXM7CisKKwlmb3JfZWFjaF9jcHUoaSkgeworCQl2b2lkICpzY3JhdGNoID0gdm1hbGxvYyhJUENPTVBfU0NSQVRDSF9TSVpFKTsKKwkJaWYgKCFzY3JhdGNoKQorCQkJcmV0dXJuIE5VTEw7CisJCSpwZXJfY3B1X3B0cihzY3JhdGNoZXMsIGkpID0gc2NyYXRjaDsKKwl9CisKKwlyZXR1cm4gc2NyYXRjaGVzOworfQorCitzdGF0aWMgdm9pZCBpcGNvbXA2X2ZyZWVfdGZtcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqKnRmbXMpCit7CisJc3RydWN0IGlwY29tcDZfdGZtcyAqcG9zOworCWludCBjcHU7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJmlwY29tcDZfdGZtc19saXN0LCBsaXN0KSB7CisJCWlmIChwb3MtPnRmbXMgPT0gdGZtcykKKwkJCWJyZWFrOworCX0KKworCUJVR19UUkFQKHBvcyk7CisKKwlpZiAoLS1wb3MtPnVzZXJzKQorCQlyZXR1cm47CisKKwlsaXN0X2RlbCgmcG9zLT5saXN0KTsKKwlrZnJlZShwb3MpOworCisJaWYgKCF0Zm1zKQorCQlyZXR1cm47CisKKwlmb3JfZWFjaF9jcHUoY3B1KSB7CisJCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSAqcGVyX2NwdV9wdHIodGZtcywgY3B1KTsKKwkJaWYgKHRmbSkKKwkJCWNyeXB0b19mcmVlX3RmbSh0Zm0pOworCX0KKwlmcmVlX3BlcmNwdSh0Zm1zKTsKK30KKworc3RhdGljIHN0cnVjdCBjcnlwdG9fdGZtICoqaXBjb21wNl9hbGxvY190Zm1zKGNvbnN0IGNoYXIgKmFsZ19uYW1lKQoreworCXN0cnVjdCBpcGNvbXA2X3RmbXMgKnBvczsKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqKnRmbXM7CisJaW50IGNwdTsKKworCS8qIFRoaXMgY2FuIGJlIGFueSB2YWxpZCBDUFUgSUQgc28gd2UgZG9uJ3QgbmVlZCBsb2NraW5nLiAqLworCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmaXBjb21wNl90Zm1zX2xpc3QsIGxpc3QpIHsKKwkJc3RydWN0IGNyeXB0b190Zm0gKnRmbTsKKworCQl0Zm1zID0gcG9zLT50Zm1zOworCQl0Zm0gPSAqcGVyX2NwdV9wdHIodGZtcywgY3B1KTsKKworCQlpZiAoIXN0cmNtcChjcnlwdG9fdGZtX2FsZ19uYW1lKHRmbSksIGFsZ19uYW1lKSkgeworCQkJcG9zLT51c2VycysrOworCQkJcmV0dXJuIHRmbXM7CisJCX0KKwl9CisKKwlwb3MgPSBrbWFsbG9jKHNpemVvZigqcG9zKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwb3MpCisJCXJldHVybiBOVUxMOworCisJcG9zLT51c2VycyA9IDE7CisJSU5JVF9MSVNUX0hFQUQoJnBvcy0+bGlzdCk7CisJbGlzdF9hZGQoJnBvcy0+bGlzdCwgJmlwY29tcDZfdGZtc19saXN0KTsKKworCXBvcy0+dGZtcyA9IHRmbXMgPSBhbGxvY19wZXJjcHUoc3RydWN0IGNyeXB0b190Zm0gKik7CisJaWYgKCF0Zm1zKQorCQlnb3RvIGVycm9yOworCisJZm9yX2VhY2hfY3B1KGNwdSkgeworCQlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gY3J5cHRvX2FsbG9jX3RmbShhbGdfbmFtZSwgMCk7CisJCWlmICghdGZtKQorCQkJZ290byBlcnJvcjsKKwkJKnBlcl9jcHVfcHRyKHRmbXMsIGNwdSkgPSB0Zm07CisJfQorCisJcmV0dXJuIHRmbXM7CisKK2Vycm9yOgorCWlwY29tcDZfZnJlZV90Zm1zKHRmbXMpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBpcGNvbXA2X2ZyZWVfZGF0YShzdHJ1Y3QgaXBjb21wX2RhdGEgKmlwY2QpCit7CisJaWYgKGlwY2QtPnRmbXMpCisJCWlwY29tcDZfZnJlZV90Zm1zKGlwY2QtPnRmbXMpOworCWlwY29tcDZfZnJlZV9zY3JhdGNoZXMoKTsKK30KKworc3RhdGljIHZvaWQgaXBjb21wNl9kZXN0cm95KHN0cnVjdCB4ZnJtX3N0YXRlICp4KQoreworCXN0cnVjdCBpcGNvbXBfZGF0YSAqaXBjZCA9IHgtPmRhdGE7CisJaWYgKCFpcGNkKQorCQlyZXR1cm47CisJeGZybV9zdGF0ZV9kZWxldGVfdHVubmVsKHgpOworCWRvd24oJmlwY29tcDZfcmVzb3VyY2Vfc2VtKTsKKwlpcGNvbXA2X2ZyZWVfZGF0YShpcGNkKTsKKwl1cCgmaXBjb21wNl9yZXNvdXJjZV9zZW0pOworCWtmcmVlKGlwY2QpOworCisJeGZybTZfdHVubmVsX2ZyZWVfc3BpKCh4ZnJtX2FkZHJlc3NfdCAqKSZ4LT5wcm9wcy5zYWRkcik7Cit9CisKK3N0YXRpYyBpbnQgaXBjb21wNl9pbml0X3N0YXRlKHN0cnVjdCB4ZnJtX3N0YXRlICp4LCB2b2lkICphcmdzKQoreworCWludCBlcnI7CisJc3RydWN0IGlwY29tcF9kYXRhICppcGNkOworCXN0cnVjdCB4ZnJtX2FsZ29fZGVzYyAqY2FsZ19kZXNjOworCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoIXgtPmNhbGcpCisJCWdvdG8gb3V0OworCisJaWYgKHgtPmVuY2FwKQorCQlnb3RvIG91dDsKKworCWVyciA9IC1FTk9NRU07CisJaXBjZCA9IGttYWxsb2Moc2l6ZW9mKCppcGNkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpcGNkKQorCQlnb3RvIG91dDsKKworCW1lbXNldChpcGNkLCAwLCBzaXplb2YoKmlwY2QpKTsKKwl4LT5wcm9wcy5oZWFkZXJfbGVuID0gMDsKKwlpZiAoeC0+cHJvcHMubW9kZSkKKwkJeC0+cHJvcHMuaGVhZGVyX2xlbiArPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCQorCWRvd24oJmlwY29tcDZfcmVzb3VyY2Vfc2VtKTsKKwlpZiAoIWlwY29tcDZfYWxsb2Nfc2NyYXRjaGVzKCkpCisJCWdvdG8gZXJyb3I7CisKKwlpcGNkLT50Zm1zID0gaXBjb21wNl9hbGxvY190Zm1zKHgtPmNhbGctPmFsZ19uYW1lKTsKKwlpZiAoIWlwY2QtPnRmbXMpCisJCWdvdG8gZXJyb3I7CisJdXAoJmlwY29tcDZfcmVzb3VyY2Vfc2VtKTsKKworCWlmICh4LT5wcm9wcy5tb2RlKSB7CisJCWVyciA9IGlwY29tcDZfdHVubmVsX2F0dGFjaCh4KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyb3JfdHVubmVsOworCX0KKworCWNhbGdfZGVzYyA9IHhmcm1fY2FsZ19nZXRfYnluYW1lKHgtPmNhbGctPmFsZ19uYW1lLCAwKTsKKwlCVUdfT04oIWNhbGdfZGVzYyk7CisJaXBjZC0+dGhyZXNob2xkID0gY2FsZ19kZXNjLT51aW5mby5jb21wLnRocmVzaG9sZDsKKwl4LT5kYXRhID0gaXBjZDsKKwllcnIgPSAwOworb3V0OgorCXJldHVybiBlcnI7CitlcnJvcl90dW5uZWw6CisJZG93bigmaXBjb21wNl9yZXNvdXJjZV9zZW0pOworZXJyb3I6CisJaXBjb21wNl9mcmVlX2RhdGEoaXBjZCk7CisJdXAoJmlwY29tcDZfcmVzb3VyY2Vfc2VtKTsKKwlrZnJlZShpcGNkKTsKKworCWdvdG8gb3V0OworfQorCitzdGF0aWMgc3RydWN0IHhmcm1fdHlwZSBpcGNvbXA2X3R5cGUgPSAKK3sKKwkuZGVzY3JpcHRpb24JPSAiSVBDT01QNiIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5wcm90bwkJPSBJUFBST1RPX0NPTVAsCisJLmluaXRfc3RhdGUJPSBpcGNvbXA2X2luaXRfc3RhdGUsCisJLmRlc3RydWN0b3IJPSBpcGNvbXA2X2Rlc3Ryb3ksCisJLmlucHV0CQk9IGlwY29tcDZfaW5wdXQsCisJLm91dHB1dAkJPSBpcGNvbXA2X291dHB1dCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5ldDZfcHJvdG9jb2wgaXBjb21wNl9wcm90b2NvbCA9IAoreworCS5oYW5kbGVyCT0geGZybTZfcmN2LAorCS5lcnJfaGFuZGxlcgk9IGlwY29tcDZfZXJyLAorCS5mbGFncwkJPSBJTkVUNl9QUk9UT19OT1BPTElDWSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlwY29tcDZfaW5pdCh2b2lkKQoreworCWlmICh4ZnJtX3JlZ2lzdGVyX3R5cGUoJmlwY29tcDZfdHlwZSwgQUZfSU5FVDYpIDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJpcGNvbXA2IGluaXQ6IGNhbid0IGFkZCB4ZnJtIHR5cGVcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJaWYgKGluZXQ2X2FkZF9wcm90b2NvbCgmaXBjb21wNl9wcm90b2NvbCwgSVBQUk9UT19DT01QKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaXBjb21wNiBpbml0OiBjYW4ndCBhZGQgcHJvdG9jb2xcbiIpOworCQl4ZnJtX3VucmVnaXN0ZXJfdHlwZSgmaXBjb21wNl90eXBlLCBBRl9JTkVUNik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGlwY29tcDZfZmluaSh2b2lkKQoreworCWlmIChpbmV0Nl9kZWxfcHJvdG9jb2woJmlwY29tcDZfcHJvdG9jb2wsIElQUFJPVE9fQ09NUCkgPCAwKSAKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaXB2NiBpcGNvbXAgY2xvc2U6IGNhbid0IHJlbW92ZSBwcm90b2NvbFxuIik7CisJaWYgKHhmcm1fdW5yZWdpc3Rlcl90eXBlKCZpcGNvbXA2X3R5cGUsIEFGX0lORVQ2KSA8IDApCisJCXByaW50ayhLRVJOX0lORk8gImlwdjYgaXBjb21wIGNsb3NlOiBjYW4ndCByZW1vdmUgeGZybSB0eXBlXG4iKTsKK30KKworbW9kdWxlX2luaXQoaXBjb21wNl9pbml0KTsKK21vZHVsZV9leGl0KGlwY29tcDZfZmluaSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklQIFBheWxvYWQgQ29tcHJlc3Npb24gUHJvdG9jb2wgKElQQ29tcCkgZm9yIElQdjYgLSBSRkMzMTczIik7CitNT0RVTEVfQVVUSE9SKCJNaXRzdXJ1IEtBTkRBIDxta0BsaW51eC1pcHY2Lm9yZz4iKTsKKworCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcHY2X3NvY2tnbHVlLmMgYi9uZXQvaXB2Ni9pcHY2X3NvY2tnbHVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc5YWI4NgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY2L2lwdjZfc29ja2dsdWUuYwpAQCAtMCwwICsxLDcwNCBAQAorLyoKKyAqCUlQdjYgQlNEIHNvY2tldCBvcHRpb25zIGludGVyZmFjZQorICoJTGludXggSU5FVDYgaW1wbGVtZW50YXRpb24gCisgKgorICoJQXV0aG9yczoKKyAqCVBlZHJvIFJvcXVlCQk8cm9xdWVAZGkuZmMudWwucHQ+CQorICoKKyAqCUJhc2VkIG9uIGxpbnV4L25ldC9pcHY0L2lwX3NvY2tnbHVlLmMKKyAqCisgKgkkSWQ6IGlwdjZfc29ja2dsdWUuYyx2IDEuNDEgMjAwMi8wMi8wMSAyMjowMTowNCBkYXZlbSBFeHAgJAorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJRklYTUU6IE1ha2UgdGhlIHNldHNvY2tvcHQgY29kZSBQT1NJWCBjb21wbGlhbnQ6IFRoYXQgaXMKKyAqCisgKglvCVJldHVybiAtRUlOVkFMIGZvciBzZXRzb2Nrb3B0IG9mIHNob3J0IGxlbmd0aHMKKyAqCW8JVHJ1bmNhdGUgZ2V0c29ja29wdCByZXR1cm5zCisgKglvCVJldHVybiBhbiBvcHRsZW4gb2YgdGhlIHRydW5jYXRlZCBsZW5ndGggaWYgbmVlZCBiZQorICoKKyAqCUNoYW5nZXM6CisgKglEYXZpZCBMIFN0ZXZlbnMgPGRsc3RldmVuc0B1cy5pYm0uY29tPjoKKyAqCQktIGFkZGVkIG11bHRpY2FzdCBzb3VyY2UgZmlsdGVyaW5nIEFQSSBmb3IgTUxEdjIKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3NubXAuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC9uZGlzYy5oPgorI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgorI2luY2x1ZGUgPG5ldC90cmFuc3BfdjYuaD4KKyNpbmNsdWRlIDxuZXQvaXA2X3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CisjaW5jbHVkZSA8bmV0L2luZXRfY29tbW9uLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPG5ldC91ZHAuaD4KKyNpbmNsdWRlIDxuZXQveGZybS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworREVGSU5FX1NOTVBfU1RBVChzdHJ1Y3QgaXBzdGF0c19taWIsIGlwdjZfc3RhdGlzdGljcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGFja2V0X3R5cGUgaXB2Nl9wYWNrZXRfdHlwZSA9IHsKKwkudHlwZSA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVBWNiksIAorCS5mdW5jID0gaXB2Nl9yY3YsCit9OworCitzdHJ1Y3QgaXA2X3JhX2NoYWluICppcDZfcmFfY2hhaW47CitERUZJTkVfUldMT0NLKGlwNl9yYV9sb2NrKTsKKworaW50IGlwNl9yYV9jb250cm9sKHN0cnVjdCBzb2NrICpzaywgaW50IHNlbCwgdm9pZCAoKmRlc3RydWN0b3IpKHN0cnVjdCBzb2NrICopKQoreworCXN0cnVjdCBpcDZfcmFfY2hhaW4gKnJhLCAqbmV3X3JhLCAqKnJhcDsKKworCS8qIFJBIHBhY2tldCBtYXkgYmUgZGVsaXZlcmVkIE9OTFkgdG8gSVBQUk9UT19SQVcgc29ja2V0ICovCisJaWYgKHNrLT5za190eXBlICE9IFNPQ0tfUkFXIHx8IGluZXRfc2soc2spLT5udW0gIT0gSVBQUk9UT19SQVcpCisJCXJldHVybiAtRUlOVkFMOworCisJbmV3X3JhID0gKHNlbD49MCkgPyBrbWFsbG9jKHNpemVvZigqbmV3X3JhKSwgR0ZQX0tFUk5FTCkgOiBOVUxMOworCisJd3JpdGVfbG9ja19iaCgmaXA2X3JhX2xvY2spOworCWZvciAocmFwID0gJmlwNl9yYV9jaGFpbjsgKHJhPSpyYXApICE9IE5VTEw7IHJhcCA9ICZyYS0+bmV4dCkgeworCQlpZiAocmEtPnNrID09IHNrKSB7CisJCQlpZiAoc2VsPj0wKSB7CisJCQkJd3JpdGVfdW5sb2NrX2JoKCZpcDZfcmFfbG9jayk7CisJCQkJaWYgKG5ld19yYSkKKwkJCQkJa2ZyZWUobmV3X3JhKTsKKwkJCQlyZXR1cm4gLUVBRERSSU5VU0U7CisJCQl9CisKKwkJCSpyYXAgPSByYS0+bmV4dDsKKwkJCXdyaXRlX3VubG9ja19iaCgmaXA2X3JhX2xvY2spOworCisJCQlpZiAocmEtPmRlc3RydWN0b3IpCisJCQkJcmEtPmRlc3RydWN0b3Ioc2spOworCQkJc29ja19wdXQoc2spOworCQkJa2ZyZWUocmEpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJaWYgKG5ld19yYSA9PSBOVUxMKSB7CisJCXdyaXRlX3VubG9ja19iaCgmaXA2X3JhX2xvY2spOworCQlyZXR1cm4gLUVOT0JVRlM7CisJfQorCW5ld19yYS0+c2sgPSBzazsKKwluZXdfcmEtPnNlbCA9IHNlbDsKKwluZXdfcmEtPmRlc3RydWN0b3IgPSBkZXN0cnVjdG9yOworCW5ld19yYS0+bmV4dCA9IHJhOworCSpyYXAgPSBuZXdfcmE7CisJc29ja19ob2xkKHNrKTsKKwl3cml0ZV91bmxvY2tfYmgoJmlwNl9yYV9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIGludCBpcDZfbWNfc291cmNlKGludCBhZGQsIGludCBvbW9kZSwgc3RydWN0IHNvY2sgKnNrLAorCXN0cnVjdCBncm91cF9zb3VyY2VfcmVxICpwZ3NyKTsKK2V4dGVybiBpbnQgaXA2X21jX21zZmlsdGVyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGdyb3VwX2ZpbHRlciAqZ3NmKTsKK2V4dGVybiBpbnQgaXA2X21jX21zZmdldChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBncm91cF9maWx0ZXIgKmdzZiwKKwlzdHJ1Y3QgZ3JvdXBfZmlsdGVyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pOworCisKK2ludCBpcHY2X3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK3sKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CisJaW50IHZhbCwgdmFsYm9vbDsKKwlpbnQgcmV0diA9IC1FTk9QUk9UT09QVDsKKworCWlmIChsZXZlbCA9PSBTT0xfSVAgJiYgc2stPnNrX3R5cGUgIT0gU09DS19SQVcpCisJCXJldHVybiB1ZHBfcHJvdC5zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOworCisJaWYobGV2ZWwhPVNPTF9JUFY2KQorCQlnb3RvIG91dDsKKworCWlmIChvcHR2YWwgPT0gTlVMTCkKKwkJdmFsPTA7CisJZWxzZSBpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKSBvcHR2YWwpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXZhbGJvb2wgPSAodmFsIT0wKTsKKworCWxvY2tfc29jayhzayk7CisKKwlzd2l0Y2ggKG9wdG5hbWUpIHsKKworCWNhc2UgSVBWNl9BRERSRk9STToKKwkJaWYgKHZhbCA9PSBQRl9JTkVUKSB7CisJCQlzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdDsKKwkJCXN0cnVjdCBza19idWZmICpwa3RvcHQ7CisKKwkJCWlmIChzay0+c2tfcHJvdG9jb2wgIT0gSVBQUk9UT19VRFAgJiYKKwkJCSAgICBzay0+c2tfcHJvdG9jb2wgIT0gSVBQUk9UT19UQ1ApCisJCQkJYnJlYWs7CisKKwkJCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKSB7CisJCQkJcmV0diA9IC1FTk9UQ09OTjsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGlwdjZfb25seV9zb2NrKHNrKSB8fAorCQkJICAgICEoaXB2Nl9hZGRyX3R5cGUoJm5wLT5kYWRkcikgJiBJUFY2X0FERFJfTUFQUEVEKSkgeworCQkJCXJldHYgPSAtRUFERFJOT1RBVkFJTDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZmw2X2ZyZWVfc29ja2xpc3Qoc2spOworCQkJaXB2Nl9zb2NrX21jX2Nsb3NlKHNrKTsKKworCQkJaWYgKHNrLT5za19wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkgeworCQkJCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJCQkJbG9jYWxfYmhfZGlzYWJsZSgpOworCQkJCXNvY2tfcHJvdF9kZWNfdXNlKHNrLT5za19wcm90KTsKKwkJCQlzb2NrX3Byb3RfaW5jX3VzZSgmdGNwX3Byb3QpOworCQkJCWxvY2FsX2JoX2VuYWJsZSgpOworCQkJCXNrLT5za19wcm90ID0gJnRjcF9wcm90OworCQkJCXRwLT5hZl9zcGVjaWZpYyA9ICZpcHY0X3NwZWNpZmljOworCQkJCXNrLT5za19zb2NrZXQtPm9wcyA9ICZpbmV0X3N0cmVhbV9vcHM7CisJCQkJc2stPnNrX2ZhbWlseSA9IFBGX0lORVQ7CisJCQkJdGNwX3N5bmNfbXNzKHNrLCB0cC0+cG10dV9jb29raWUpOworCQkJfSBlbHNlIHsKKwkJCQlsb2NhbF9iaF9kaXNhYmxlKCk7CisJCQkJc29ja19wcm90X2RlY191c2Uoc2stPnNrX3Byb3QpOworCQkJCXNvY2tfcHJvdF9pbmNfdXNlKCZ1ZHBfcHJvdCk7CisJCQkJbG9jYWxfYmhfZW5hYmxlKCk7CisJCQkJc2stPnNrX3Byb3QgPSAmdWRwX3Byb3Q7CisJCQkJc2stPnNrX3NvY2tldC0+b3BzID0gJmluZXRfZGdyYW1fb3BzOworCQkJCXNrLT5za19mYW1pbHkgPSBQRl9JTkVUOworCQkJfQorCQkJb3B0ID0geGNoZygmbnAtPm9wdCwgTlVMTCk7CisJCQlpZiAob3B0KQorCQkJCXNvY2tfa2ZyZWVfcyhzaywgb3B0LCBvcHQtPnRvdF9sZW4pOworCQkJcGt0b3B0ID0geGNoZygmbnAtPnBrdG9wdGlvbnMsIE5VTEwpOworCQkJaWYgKHBrdG9wdCkKKwkJCQlrZnJlZV9za2IocGt0b3B0KTsKKworCQkJc2stPnNrX2Rlc3RydWN0ID0gaW5ldF9zb2NrX2Rlc3RydWN0OworI2lmZGVmIElORVRfUkVGQ05UX0RFQlVHCisJCQlhdG9taWNfZGVjKCZpbmV0Nl9zb2NrX25yKTsKKyNlbmRpZgorCQkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJCQlyZXR2ID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWdvdG8gZV9pbnZhbDsKKworCWNhc2UgSVBWNl9WNk9OTFk6CisJCWlmIChpbmV0X3NrKHNrKS0+bnVtKQorCQkJZ290byBlX2ludmFsOworCQlucC0+aXB2Nm9ubHkgPSB2YWxib29sOworCQlyZXR2ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIElQVjZfUEtUSU5GTzoKKwkJbnAtPnJ4b3B0LmJpdHMucnhpbmZvID0gdmFsYm9vbDsKKwkJcmV0diA9IDA7CisJCWJyZWFrOworCisJY2FzZSBJUFY2X0hPUExJTUlUOgorCQlucC0+cnhvcHQuYml0cy5yeGhsaW0gPSB2YWxib29sOworCQlyZXR2ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIElQVjZfUlRIRFI6CisJCWlmICh2YWwgPCAwIHx8IHZhbCA+IDIpCisJCQlnb3RvIGVfaW52YWw7CisJCW5wLT5yeG9wdC5iaXRzLnNyY3J0ID0gdmFsOworCQlyZXR2ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIElQVjZfSE9QT1BUUzoKKwkJbnAtPnJ4b3B0LmJpdHMuaG9wb3B0cyA9IHZhbGJvb2w7CisJCXJldHYgPSAwOworCQlicmVhazsKKworCWNhc2UgSVBWNl9EU1RPUFRTOgorCQlucC0+cnhvcHQuYml0cy5kc3RvcHRzID0gdmFsYm9vbDsKKwkJcmV0diA9IDA7CisJCWJyZWFrOworCisJY2FzZSBJUFY2X0ZMT1dJTkZPOgorCQlucC0+cnhvcHQuYml0cy5yeGZsb3cgPSB2YWxib29sOworCQlyZXR2ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIElQVjZfUEtUT1BUSU9OUzoKKwl7CisJCXN0cnVjdCBpcHY2X3R4b3B0aW9ucyAqb3B0ID0gTlVMTDsKKwkJc3RydWN0IG1zZ2hkciBtc2c7CisJCXN0cnVjdCBmbG93aSBmbDsKKwkJaW50IGp1bms7CisKKwkJZmwuZmw2X2Zsb3dsYWJlbCA9IDA7CisJCWZsLm9pZiA9IHNrLT5za19ib3VuZF9kZXZfaWY7CisKKwkJaWYgKG9wdGxlbiA9PSAwKQorCQkJZ290byB1cGRhdGU7CisKKwkJLyogMUsgaXMgcHJvYmFibHkgZXhjZXNzaXZlCisJCSAqIDFLIGlzIHN1cmVseSBub3QgZW5vdWdoLCAySyBwZXIgc3RhbmRhcmQgaGVhZGVyIGlzIDE2Sy4KKwkJICovCisJCXJldHYgPSAtRUlOVkFMOworCQlpZiAob3B0bGVuID4gNjQqMTAyNCkKKwkJCWJyZWFrOworCisJCW9wdCA9IHNvY2tfa21hbGxvYyhzaywgc2l6ZW9mKCpvcHQpICsgb3B0bGVuLCBHRlBfS0VSTkVMKTsKKwkJcmV0diA9IC1FTk9CVUZTOworCQlpZiAob3B0ID09IE5VTEwpCisJCQlicmVhazsKKworCQltZW1zZXQob3B0LCAwLCBzaXplb2YoKm9wdCkpOworCQlvcHQtPnRvdF9sZW4gPSBzaXplb2YoKm9wdCkgKyBvcHRsZW47CisJCXJldHYgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIob3B0KzEsIG9wdHZhbCwgb3B0bGVuKSkKKwkJCWdvdG8gZG9uZTsKKworCQltc2cubXNnX2NvbnRyb2xsZW4gPSBvcHRsZW47CisJCW1zZy5tc2dfY29udHJvbCA9ICh2b2lkKikob3B0KzEpOworCisJCXJldHYgPSBkYXRhZ3JhbV9zZW5kX2N0bCgmbXNnLCAmZmwsIG9wdCwgJmp1bmspOworCQlpZiAocmV0dikKKwkJCWdvdG8gZG9uZTsKK3VwZGF0ZToKKwkJcmV0diA9IDA7CisJCWlmIChzay0+c2tfdHlwZSA9PSBTT0NLX1NUUkVBTSkgeworCQkJaWYgKG9wdCkgeworCQkJCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCQkJCWlmICghKCgxIDw8IHNrLT5za19zdGF0ZSkgJgorCQkJCSAgICAgIChUQ1BGX0xJU1RFTiB8IFRDUEZfQ0xPU0UpKQorCQkJCSAgICAmJiBpbmV0X3NrKHNrKS0+ZGFkZHIgIT0gTE9PUEJBQ0s0X0lQVjYpIHsKKwkJCQkJdHAtPmV4dF9oZWFkZXJfbGVuID0gb3B0LT5vcHRfZmxlbiArIG9wdC0+b3B0X25mbGVuOworCQkJCQl0Y3Bfc3luY19tc3Moc2ssIHRwLT5wbXR1X2Nvb2tpZSk7CisJCQkJfQorCQkJfQorCQkJb3B0ID0geGNoZygmbnAtPm9wdCwgb3B0KTsKKwkJCXNrX2RzdF9yZXNldChzayk7CisJCX0gZWxzZSB7CisJCQl3cml0ZV9sb2NrKCZzay0+c2tfZHN0X2xvY2spOworCQkJb3B0ID0geGNoZygmbnAtPm9wdCwgb3B0KTsKKwkJCXdyaXRlX3VubG9jaygmc2stPnNrX2RzdF9sb2NrKTsKKwkJCXNrX2RzdF9yZXNldChzayk7CisJCX0KKworZG9uZToKKwkJaWYgKG9wdCkKKwkJCXNvY2tfa2ZyZWVfcyhzaywgb3B0LCBvcHQtPnRvdF9sZW4pOworCQlicmVhazsKKwl9CisJY2FzZSBJUFY2X1VOSUNBU1RfSE9QUzoKKwkJaWYgKHZhbCA+IDI1NSB8fCB2YWwgPCAtMSkKKwkJCWdvdG8gZV9pbnZhbDsKKwkJbnAtPmhvcF9saW1pdCA9IHZhbDsKKwkJcmV0diA9IDA7CisJCWJyZWFrOworCisJY2FzZSBJUFY2X01VTFRJQ0FTVF9IT1BTOgorCQlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19TVFJFQU0pCisJCQlnb3RvIGVfaW52YWw7CisJCWlmICh2YWwgPiAyNTUgfHwgdmFsIDwgLTEpCisJCQlnb3RvIGVfaW52YWw7CisJCW5wLT5tY2FzdF9ob3BzID0gdmFsOworCQlyZXR2ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIElQVjZfTVVMVElDQVNUX0xPT1A6CisJCW5wLT5tY19sb29wID0gdmFsYm9vbDsKKwkJcmV0diA9IDA7CisJCWJyZWFrOworCisJY2FzZSBJUFY2X01VTFRJQ0FTVF9JRjoKKwkJaWYgKHNrLT5za190eXBlID09IFNPQ0tfU1RSRUFNKQorCQkJZ290byBlX2ludmFsOworCQlpZiAoc2stPnNrX2JvdW5kX2Rldl9pZiAmJiBzay0+c2tfYm91bmRfZGV2X2lmICE9IHZhbCkKKwkJCWdvdG8gZV9pbnZhbDsKKworCQlpZiAoX19kZXZfZ2V0X2J5X2luZGV4KHZhbCkgPT0gTlVMTCkgeworCQkJcmV0diA9IC1FTk9ERVY7CisJCQlicmVhazsKKwkJfQorCQlucC0+bWNhc3Rfb2lmID0gdmFsOworCQlyZXR2ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBJUFY2X0FERF9NRU1CRVJTSElQOgorCWNhc2UgSVBWNl9EUk9QX01FTUJFUlNISVA6CisJeworCQlzdHJ1Y3QgaXB2Nl9tcmVxIG1yZXE7CisKKwkJcmV0diA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbXJlcSwgb3B0dmFsLCBzaXplb2Yoc3RydWN0IGlwdjZfbXJlcSkpKQorCQkJYnJlYWs7CisKKwkJaWYgKG9wdG5hbWUgPT0gSVBWNl9BRERfTUVNQkVSU0hJUCkKKwkJCXJldHYgPSBpcHY2X3NvY2tfbWNfam9pbihzaywgbXJlcS5pcHY2bXJfaWZpbmRleCwgJm1yZXEuaXB2Nm1yX211bHRpYWRkcik7CisJCWVsc2UKKwkJCXJldHYgPSBpcHY2X3NvY2tfbWNfZHJvcChzaywgbXJlcS5pcHY2bXJfaWZpbmRleCwgJm1yZXEuaXB2Nm1yX211bHRpYWRkcik7CisJCWJyZWFrOworCX0KKwljYXNlIElQVjZfSk9JTl9BTllDQVNUOgorCWNhc2UgSVBWNl9MRUFWRV9BTllDQVNUOgorCXsKKwkJc3RydWN0IGlwdjZfbXJlcSBtcmVxOworCisJCWlmIChvcHRsZW4gIT0gc2l6ZW9mKHN0cnVjdCBpcHY2X21yZXEpKQorCQkJZ290byBlX2ludmFsOworCisJCXJldHYgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJm1yZXEsIG9wdHZhbCwgc2l6ZW9mKHN0cnVjdCBpcHY2X21yZXEpKSkKKwkJCWJyZWFrOworCisJCWlmIChvcHRuYW1lID09IElQVjZfSk9JTl9BTllDQVNUKQorCQkJcmV0diA9IGlwdjZfc29ja19hY19qb2luKHNrLCBtcmVxLmlwdjZtcl9pZmluZGV4LCAmbXJlcS5pcHY2bXJfYWNhZGRyKTsKKwkJZWxzZQorCQkJcmV0diA9IGlwdjZfc29ja19hY19kcm9wKHNrLCBtcmVxLmlwdjZtcl9pZmluZGV4LCAmbXJlcS5pcHY2bXJfYWNhZGRyKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgTUNBU1RfSk9JTl9HUk9VUDoKKwljYXNlIE1DQVNUX0xFQVZFX0dST1VQOgorCXsKKwkJc3RydWN0IGdyb3VwX3JlcSBncmVxOworCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpwc2luNjsKKworCQlyZXR2ID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZncmVxLCBvcHR2YWwsIHNpemVvZihzdHJ1Y3QgZ3JvdXBfcmVxKSkpCisJCQlicmVhazsKKwkJaWYgKGdyZXEuZ3JfZ3JvdXAuc3NfZmFtaWx5ICE9IEFGX0lORVQ2KSB7CisJCQlyZXR2ID0gLUVBRERSTk9UQVZBSUw7CisJCQlicmVhazsKKwkJfQorCQlwc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJmdyZXEuZ3JfZ3JvdXA7CisJCWlmIChvcHRuYW1lID09IE1DQVNUX0pPSU5fR1JPVVApCisJCQlyZXR2ID0gaXB2Nl9zb2NrX21jX2pvaW4oc2ssIGdyZXEuZ3JfaW50ZXJmYWNlLAorCQkJCSZwc2luNi0+c2luNl9hZGRyKTsKKwkJZWxzZQorCQkJcmV0diA9IGlwdjZfc29ja19tY19kcm9wKHNrLCBncmVxLmdyX2ludGVyZmFjZSwKKwkJCQkmcHNpbjYtPnNpbjZfYWRkcik7CisJCWJyZWFrOworCX0KKwljYXNlIE1DQVNUX0pPSU5fU09VUkNFX0dST1VQOgorCWNhc2UgTUNBU1RfTEVBVkVfU09VUkNFX0dST1VQOgorCWNhc2UgTUNBU1RfQkxPQ0tfU09VUkNFOgorCWNhc2UgTUNBU1RfVU5CTE9DS19TT1VSQ0U6CisJeworCQlzdHJ1Y3QgZ3JvdXBfc291cmNlX3JlcSBncmVxczsKKwkJaW50IG9tb2RlLCBhZGQ7CisKKwkJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IGdyb3VwX3NvdXJjZV9yZXEpKQorCQkJZ290byBlX2ludmFsOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmdyZXFzLCBvcHR2YWwsIHNpemVvZihncmVxcykpKSB7CisJCQlyZXR2ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChncmVxcy5nc3JfZ3JvdXAuc3NfZmFtaWx5ICE9IEFGX0lORVQ2IHx8CisJCSAgICBncmVxcy5nc3Jfc291cmNlLnNzX2ZhbWlseSAhPSBBRl9JTkVUNikgeworCQkJcmV0diA9IC1FQUREUk5PVEFWQUlMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKG9wdG5hbWUgPT0gTUNBU1RfQkxPQ0tfU09VUkNFKSB7CisJCQlvbW9kZSA9IE1DQVNUX0VYQ0xVREU7CisJCQlhZGQgPSAxOworCQl9IGVsc2UgaWYgKG9wdG5hbWUgPT0gTUNBU1RfVU5CTE9DS19TT1VSQ0UpIHsKKwkJCW9tb2RlID0gTUNBU1RfRVhDTFVERTsKKwkJCWFkZCA9IDA7CisJCX0gZWxzZSBpZiAob3B0bmFtZSA9PSBNQ0FTVF9KT0lOX1NPVVJDRV9HUk9VUCkgeworCQkJc3RydWN0IHNvY2thZGRyX2luNiAqcHNpbjY7CisKKwkJCXBzaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmZ3JlcXMuZ3NyX2dyb3VwOworCQkJcmV0diA9IGlwdjZfc29ja19tY19qb2luKHNrLCBncmVxcy5nc3JfaW50ZXJmYWNlLAorCQkJCSZwc2luNi0+c2luNl9hZGRyKTsKKwkJCWlmIChyZXR2KQorCQkJCWJyZWFrOworCQkJb21vZGUgPSBNQ0FTVF9JTkNMVURFOworCQkJYWRkID0gMTsKKwkJfSBlbHNlIC8qSVBfRFJPUF9TT1VSQ0VfTUVNQkVSU0hJUCAqLyB7CisJCQlvbW9kZSA9IE1DQVNUX0lOQ0xVREU7CisJCQlhZGQgPSAwOworCQl9CisJCXJldHYgPSBpcDZfbWNfc291cmNlKGFkZCwgb21vZGUsIHNrLCAmZ3JlcXMpOworCQlicmVhazsKKwl9CisJY2FzZSBNQ0FTVF9NU0ZJTFRFUjoKKwl7CisJCWV4dGVybiBpbnQgc3lzY3RsX29wdG1lbV9tYXg7CisJCWV4dGVybiBpbnQgc3lzY3RsX21sZF9tYXhfbXNmOworCQlzdHJ1Y3QgZ3JvdXBfZmlsdGVyICpnc2Y7CisKKwkJaWYgKG9wdGxlbiA8IEdST1VQX0ZJTFRFUl9TSVpFKDApKQorCQkJZ290byBlX2ludmFsOworCQlpZiAob3B0bGVuID4gc3lzY3RsX29wdG1lbV9tYXgpIHsKKwkJCXJldHYgPSAtRU5PQlVGUzsKKwkJCWJyZWFrOworCQl9CisJCWdzZiA9IChzdHJ1Y3QgZ3JvdXBfZmlsdGVyICopa21hbGxvYyhvcHRsZW4sR0ZQX0tFUk5FTCk7CisJCWlmIChnc2YgPT0gMCkgeworCQkJcmV0diA9IC1FTk9CVUZTOworCQkJYnJlYWs7CisJCX0KKwkJcmV0diA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcihnc2YsIG9wdHZhbCwgb3B0bGVuKSkgeworCQkJa2ZyZWUoZ3NmKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIG51bXNyYyA+PSAoNEctMTQwKS8xMjggb3ZlcmZsb3cgaW4gMzIgYml0cyAqLworCQlpZiAoZ3NmLT5nZl9udW1zcmMgPj0gMHgxZmZmZmZmVSB8fAorCQkgICAgZ3NmLT5nZl9udW1zcmMgPiBzeXNjdGxfbWxkX21heF9tc2YpIHsKKwkJCWtmcmVlKGdzZik7CisJCQlyZXR2ID0gLUVOT0JVRlM7CisJCQlicmVhazsKKwkJfQorCQlpZiAoR1JPVVBfRklMVEVSX1NJWkUoZ3NmLT5nZl9udW1zcmMpID4gb3B0bGVuKSB7CisJCQlrZnJlZShnc2YpOworCQkJcmV0diA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlyZXR2ID0gaXA2X21jX21zZmlsdGVyKHNrLCBnc2YpOworCQlrZnJlZShnc2YpOworCisJCWJyZWFrOworCX0KKwljYXNlIElQVjZfUk9VVEVSX0FMRVJUOgorCQlyZXR2ID0gaXA2X3JhX2NvbnRyb2woc2ssIHZhbCwgTlVMTCk7CisJCWJyZWFrOworCWNhc2UgSVBWNl9NVFVfRElTQ09WRVI6CisJCWlmICh2YWw8MCB8fCB2YWw+MikKKwkJCWdvdG8gZV9pbnZhbDsKKwkJbnAtPnBtdHVkaXNjID0gdmFsOworCQlyZXR2ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBJUFY2X01UVToKKwkJaWYgKHZhbCAmJiB2YWwgPCBJUFY2X01JTl9NVFUpCisJCQlnb3RvIGVfaW52YWw7CisJCW5wLT5mcmFnX3NpemUgPSB2YWw7CisJCXJldHYgPSAwOworCQlicmVhazsKKwljYXNlIElQVjZfUkVDVkVSUjoKKwkJbnAtPnJlY3ZlcnIgPSB2YWxib29sOworCQlpZiAoIXZhbCkKKwkJCXNrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX2Vycm9yX3F1ZXVlKTsKKwkJcmV0diA9IDA7CisJCWJyZWFrOworCWNhc2UgSVBWNl9GTE9XSU5GT19TRU5EOgorCQlucC0+c25kZmxvdyA9IHZhbGJvb2w7CisJCXJldHYgPSAwOworCQlicmVhazsKKwljYXNlIElQVjZfRkxPV0xBQkVMX01HUjoKKwkJcmV0diA9IGlwdjZfZmxvd2xhYmVsX29wdChzaywgb3B0dmFsLCBvcHRsZW4pOworCQlicmVhazsKKwljYXNlIElQVjZfSVBTRUNfUE9MSUNZOgorCWNhc2UgSVBWNl9YRlJNX1BPTElDWToKKwkJcmV0diA9IHhmcm1fdXNlcl9wb2xpY3koc2ssIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKKwkJYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSCisJZGVmYXVsdDoKKwkJcmV0diA9IG5mX3NldHNvY2tvcHQoc2ssIFBGX0lORVQ2LCBvcHRuYW1lLCBvcHR2YWwsIAorCQkJCQkgICAgb3B0bGVuKTsKKwkJYnJlYWs7CisjZW5kaWYKKworCX0KKwlyZWxlYXNlX3NvY2soc2spOworCitvdXQ6CisJcmV0dXJuIHJldHY7CisKK2VfaW52YWw6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IGlwdjZfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCSAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCit7CisJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOworCWludCBsZW47CisJaW50IHZhbDsKKworCWlmIChsZXZlbCA9PSBTT0xfSVAgJiYgc2stPnNrX3R5cGUgIT0gU09DS19SQVcpCisJCXJldHVybiB1ZHBfcHJvdC5nZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOworCWlmKGxldmVsIT1TT0xfSVBWNikKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKwlpZiAoZ2V0X3VzZXIobGVuLCBvcHRsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlzd2l0Y2ggKG9wdG5hbWUpIHsKKwljYXNlIElQVjZfQUREUkZPUk06CisJCWlmIChzay0+c2tfcHJvdG9jb2wgIT0gSVBQUk9UT19VRFAgJiYKKwkJICAgIHNrLT5za19wcm90b2NvbCAhPSBJUFBST1RPX1RDUCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkKKwkJCXJldHVybiAtRU5PVENPTk47CisJCXZhbCA9IHNrLT5za19mYW1pbHk7CisJCWJyZWFrOworCWNhc2UgTUNBU1RfTVNGSUxURVI6CisJeworCQlzdHJ1Y3QgZ3JvdXBfZmlsdGVyIGdzZjsKKwkJaW50IGVycjsKKworCQlpZiAobGVuIDwgR1JPVVBfRklMVEVSX1NJWkUoMCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZnc2YsIG9wdHZhbCwgR1JPVVBfRklMVEVSX1NJWkUoMCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWxvY2tfc29jayhzayk7CisJCWVyciA9IGlwNl9tY19tc2ZnZXQoc2ssICZnc2YsCisJCQkoc3RydWN0IGdyb3VwX2ZpbHRlciBfX3VzZXIgKilvcHR2YWwsIG9wdGxlbik7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCXJldHVybiBlcnI7CisJfQorCisJY2FzZSBJUFY2X1BLVE9QVElPTlM6CisJeworCQlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQlpZiAoc2stPnNrX3R5cGUgIT0gU09DS19TVFJFQU0pCisJCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCisJCW1zZy5tc2dfY29udHJvbCA9IG9wdHZhbDsKKwkJbXNnLm1zZ19jb250cm9sbGVuID0gbGVuOworCQltc2cubXNnX2ZsYWdzID0gMDsKKworCQlsb2NrX3NvY2soc2spOworCQlza2IgPSBucC0+cGt0b3B0aW9uczsKKwkJaWYgKHNrYikKKwkJCWF0b21pY19pbmMoJnNrYi0+dXNlcnMpOworCQlyZWxlYXNlX3NvY2soc2spOworCisJCWlmIChza2IpIHsKKwkJCWludCBlcnIgPSBkYXRhZ3JhbV9yZWN2X2N0bChzaywgJm1zZywgc2tiKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQl9IGVsc2UgeworCQkJaWYgKG5wLT5yeG9wdC5iaXRzLnJ4aW5mbykgeworCQkJCXN0cnVjdCBpbjZfcGt0aW5mbyBzcmNfaW5mbzsKKwkJCQlzcmNfaW5mby5pcGk2X2lmaW5kZXggPSBucC0+bWNhc3Rfb2lmOworCQkJCWlwdjZfYWRkcl9jb3B5KCZzcmNfaW5mby5pcGk2X2FkZHIsICZucC0+ZGFkZHIpOworCQkJCXB1dF9jbXNnKCZtc2csIFNPTF9JUFY2LCBJUFY2X1BLVElORk8sIHNpemVvZihzcmNfaW5mbyksICZzcmNfaW5mbyk7CisJCQl9CisJCQlpZiAobnAtPnJ4b3B0LmJpdHMucnhobGltKSB7CisJCQkJaW50IGhsaW0gPSBucC0+bWNhc3RfaG9wczsKKwkJCQlwdXRfY21zZygmbXNnLCBTT0xfSVBWNiwgSVBWNl9IT1BMSU1JVCwgc2l6ZW9mKGhsaW0pLCAmaGxpbSk7CisJCQl9CisJCX0KKwkJbGVuIC09IG1zZy5tc2dfY29udHJvbGxlbjsKKwkJcmV0dXJuIHB1dF91c2VyKGxlbiwgb3B0bGVuKTsKKwl9CisJY2FzZSBJUFY2X01UVToKKwl7CisJCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKKwkJdmFsID0gMDsJCisJCWxvY2tfc29jayhzayk7CisJCWRzdCA9IHNrX2RzdF9nZXQoc2spOworCQlpZiAoZHN0KSB7CisJCQl2YWwgPSBkc3RfbXR1KGRzdCk7CisJCQlkc3RfcmVsZWFzZShkc3QpOworCQl9CisJCXJlbGVhc2Vfc29jayhzayk7CisJCWlmICghdmFsKQorCQkJcmV0dXJuIC1FTk9UQ09OTjsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBJUFY2X1Y2T05MWToKKwkJdmFsID0gbnAtPmlwdjZvbmx5OworCQlicmVhazsKKworCWNhc2UgSVBWNl9QS1RJTkZPOgorCQl2YWwgPSBucC0+cnhvcHQuYml0cy5yeGluZm87CisJCWJyZWFrOworCisJY2FzZSBJUFY2X0hPUExJTUlUOgorCQl2YWwgPSBucC0+cnhvcHQuYml0cy5yeGhsaW07CisJCWJyZWFrOworCisJY2FzZSBJUFY2X1JUSERSOgorCQl2YWwgPSBucC0+cnhvcHQuYml0cy5zcmNydDsKKwkJYnJlYWs7CisKKwljYXNlIElQVjZfSE9QT1BUUzoKKwkJdmFsID0gbnAtPnJ4b3B0LmJpdHMuaG9wb3B0czsKKwkJYnJlYWs7CisKKwljYXNlIElQVjZfRFNUT1BUUzoKKwkJdmFsID0gbnAtPnJ4b3B0LmJpdHMuZHN0b3B0czsKKwkJYnJlYWs7CisKKwljYXNlIElQVjZfRkxPV0lORk86CisJCXZhbCA9IG5wLT5yeG9wdC5iaXRzLnJ4ZmxvdzsKKwkJYnJlYWs7CisKKwljYXNlIElQVjZfVU5JQ0FTVF9IT1BTOgorCQl2YWwgPSBucC0+aG9wX2xpbWl0OworCQlicmVhazsKKworCWNhc2UgSVBWNl9NVUxUSUNBU1RfSE9QUzoKKwkJdmFsID0gbnAtPm1jYXN0X2hvcHM7CisJCWJyZWFrOworCisJY2FzZSBJUFY2X01VTFRJQ0FTVF9MT09QOgorCQl2YWwgPSBucC0+bWNfbG9vcDsKKwkJYnJlYWs7CisKKwljYXNlIElQVjZfTVVMVElDQVNUX0lGOgorCQl2YWwgPSBucC0+bWNhc3Rfb2lmOworCQlicmVhazsKKworCWNhc2UgSVBWNl9NVFVfRElTQ09WRVI6CisJCXZhbCA9IG5wLT5wbXR1ZGlzYzsKKwkJYnJlYWs7CisKKwljYXNlIElQVjZfUkVDVkVSUjoKKwkJdmFsID0gbnAtPnJlY3ZlcnI7CisJCWJyZWFrOworCisJY2FzZSBJUFY2X0ZMT1dJTkZPX1NFTkQ6CisJCXZhbCA9IG5wLT5zbmRmbG93OworCQlicmVhazsKKworCWRlZmF1bHQ6CisjaWZkZWYgQ09ORklHX05FVEZJTFRFUgorCQlsb2NrX3NvY2soc2spOworCQl2YWwgPSBuZl9nZXRzb2Nrb3B0KHNrLCBQRl9JTkVUNiwgb3B0bmFtZSwgb3B0dmFsLCAKKwkJCQkgICAgJmxlbik7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCWlmICh2YWwgPj0gMCkKKwkJCXZhbCA9IHB1dF91c2VyKGxlbiwgb3B0bGVuKTsKKwkJcmV0dXJuIHZhbDsKKyNlbHNlCisJCXJldHVybiAtRUlOVkFMOworI2VuZGlmCisJfQorCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgc2l6ZW9mKGludCksIGxlbik7CisJaWYocHV0X3VzZXIobGVuLCBvcHRsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZihjb3B5X3RvX3VzZXIob3B0dmFsLCZ2YWwsbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19pbml0IGlwdjZfcGFja2V0X2luaXQodm9pZCkKK3sKKwlkZXZfYWRkX3BhY2soJmlwdjZfcGFja2V0X3R5cGUpOworfQorCit2b2lkIGlwdjZfcGFja2V0X2NsZWFudXAodm9pZCkKK3sKKwlkZXZfcmVtb3ZlX3BhY2soJmlwdjZfcGFja2V0X3R5cGUpOworfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXB2Nl9zeW1zLmMgYi9uZXQvaXB2Ni9pcHY2X3N5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjRjOTFkCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvaXB2Nl9zeW1zLmMKQEAgLTAsMCArMSw0MSBAQAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvYWRkcmNvbmYuaD4KKyNpbmNsdWRlIDxuZXQvaXA2X3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L3hmcm0uaD4KKworRVhQT1JUX1NZTUJPTChpcHY2X2FkZHJfdHlwZSk7CitFWFBPUlRfU1lNQk9MKGljbXB2Nl9zZW5kKTsKK0VYUE9SVF9TWU1CT0woaWNtcHY2X3N0YXRpc3RpY3MpOworRVhQT1JUX1NZTUJPTChpY21wdjZfZXJyX2NvbnZlcnQpOworRVhQT1JUX1NZTUJPTChuZGlzY19tY19tYXApOworRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9pbmV0NmFkZHJfbm90aWZpZXIpOworRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX2luZXQ2YWRkcl9ub3RpZmllcik7CitFWFBPUlRfU1lNQk9MKGlwNl9yb3V0ZV9vdXRwdXQpOworI2lmZGVmIENPTkZJR19ORVRGSUxURVIKK0VYUE9SVF9TWU1CT0woaXA2X3JvdXRlX21lX2hhcmRlcik7CisjZW5kaWYKK0VYUE9SVF9TWU1CT0woYWRkcmNvbmZfbG9jayk7CitFWFBPUlRfU1lNQk9MKGlwdjZfc2V0c29ja29wdCk7CitFWFBPUlRfU1lNQk9MKGlwdjZfZ2V0c29ja29wdCk7CitFWFBPUlRfU1lNQk9MKGluZXQ2X3JlZ2lzdGVyX3Byb3Rvc3cpOworRVhQT1JUX1NZTUJPTChpbmV0Nl91bnJlZ2lzdGVyX3Byb3Rvc3cpOworRVhQT1JUX1NZTUJPTChpbmV0Nl9hZGRfcHJvdG9jb2wpOworRVhQT1JUX1NZTUJPTChpbmV0Nl9kZWxfcHJvdG9jb2wpOworRVhQT1JUX1NZTUJPTChpcDZfeG1pdCk7CitFWFBPUlRfU1lNQk9MKGluZXQ2X3JlbGVhc2UpOworRVhQT1JUX1NZTUJPTChpbmV0Nl9iaW5kKTsKK0VYUE9SVF9TWU1CT0woaW5ldDZfZ2V0bmFtZSk7CitFWFBPUlRfU1lNQk9MKGluZXQ2X2lvY3RsKTsKK0VYUE9SVF9TWU1CT0woaXB2Nl9nZXRfc2FkZHIpOworRVhQT1JUX1NZTUJPTChpcHY2X2Noa19hZGRyKTsKK0VYUE9SVF9TWU1CT0woaW42X2Rldl9maW5pc2hfZGVzdHJveSk7CisjaWZkZWYgQ09ORklHX1hGUk0KK0VYUE9SVF9TWU1CT0woeGZybTZfcmN2KTsKKyNlbmRpZgorRVhQT1JUX1NZTUJPTChydDZfbG9va3VwKTsKK0VYUE9SVF9TWU1CT0woZmw2X3NvY2tfbG9va3VwKTsKK0VYUE9SVF9TWU1CT0woaXB2Nl9wdXNoX25mcmFnX29wdHMpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbWNhc3QuYyBiL25ldC9pcHY2L21jYXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkzYjZlNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY2L21jYXN0LmMKQEAgLTAsMCArMSwyNDk5IEBACisvKgorICoJTXVsdGljYXN0IHN1cHBvcnQgZm9yIElQdjYKKyAqCUxpbnV4IElORVQ2IGltcGxlbWVudGF0aW9uIAorICoKKyAqCUF1dGhvcnM6CisgKglQZWRybyBSb3F1ZQkJPHJvcXVlQGRpLmZjLnVsLnB0PgkKKyAqCisgKgkkSWQ6IG1jYXN0LmMsdiAxLjQwIDIwMDIvMDIvMDggMDM6NTc6MTkgZGF2ZW0gRXhwICQKKyAqCisgKglCYXNlZCBvbiBsaW51eC9pcHY0L2lnbXAuYyBhbmQgbGludXgvaXB2NC9pcF9zb2NrZ2x1ZS5jIAorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworLyogQ2hhbmdlczoKKyAqCisgKgl5b3NoZnVqaQk6IGZpeCBmb3JtYXQgb2Ygcm91dGVyLWFsZXJ0IG9wdGlvbgorICoJWU9TSElGVUpJIEhpZGVha2kgQFVTQUdJOgorICoJCUZpeGVkIHNvdXJjZSBhZGRyZXNzIGZvciBNTEQgbWVzc2FnZSBiYXNlZCBvbgorICoJCTxkcmFmdC1pZXRmLW1hZ21hLW1sZC1zb3VyY2UtMDUudHh0Pi4KKyAqCVlPU0hJRlVKSSBIaWRlYWtpIEBVU0FHSToKKyAqCQktIElnbm9yZSBRdWVyaWVzIGZvciBpbnZhbGlkIGFkZHJlc3Nlcy4KKyAqCQktIE1MRCBmb3IgbGluay1sb2NhbCBhZGRyZXNzZXMuCisgKglEYXZpZCBMIFN0ZXZlbnMgPGRsc3RldmVuc0B1cy5pYm0uY29tPjoKKyAqCQktIE1MRHYyIHN1cHBvcnQKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L3JvdXRlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYuaD4KKworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3NubXAuaD4KKworI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L2lmX2luZXQ2Lmg+CisjaW5jbHVkZSA8bmV0L25kaXNjLmg+CisjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CisjaW5jbHVkZSA8bmV0L2lwNl9yb3V0ZS5oPgorCisjaW5jbHVkZSA8bmV0L2lwNl9jaGVja3N1bS5oPgorCisvKiBTZXQgdG8gMyB0byBnZXQgdHJhY2luZy4uLiAqLworI2RlZmluZSBNQ0FTVF9ERUJVRyAyCisKKyNpZiBNQ0FTVF9ERUJVRyA+PSAzCisjZGVmaW5lIE1EQkcoeCkgcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIE1EQkcoeCkKKyNlbmRpZgorCisvKgorICogIFRoZXNlIGhlYWRlciBmb3JtYXRzIHNob3VsZCBiZSBpbiBhIHNlcGFyYXRlIGluY2x1ZGUgZmlsZSwgYnV0IGljbXB2Ni5oCisgKiAgZG9lc24ndCBoYXZlIGluNl9hZGRyIGRlZmluZWQgaW4gYWxsIGNhc2VzLCB0aGVyZSBpcyBubyBfX3UxMjgsIGFuZCBubworICogIG90aGVyIGZpbGVzIHJlZmVyZW5jZSB0aGVzZS4KKyAqCisgKiAgCQkJKy1ETFMgNC8xNC8wMworICovCisKKy8qIE11bHRpY2FzdCBMaXN0ZW5lciBEaXNjb3ZlcnkgdmVyc2lvbiAyIGhlYWRlcnMgKi8KKworc3RydWN0IG1sZDJfZ3JlYyB7CisJX191OAkJZ3JlY190eXBlOworCV9fdTgJCWdyZWNfYXV4d29yZHM7CisJX191MTYJCWdyZWNfbnNyY3M7CisJc3RydWN0IGluNl9hZGRyCWdyZWNfbWNhOworCXN0cnVjdCBpbjZfYWRkcglncmVjX3NyY1swXTsKK307CisKK3N0cnVjdCBtbGQyX3JlcG9ydCB7CisJX191OAl0eXBlOworCV9fdTgJcmVzdjE7CisJX191MTYJY3N1bTsKKwlfX3UxNglyZXN2MjsKKwlfX3UxNgluZ3JlYzsKKwlzdHJ1Y3QgbWxkMl9ncmVjIGdyZWNbMF07Cit9OworCitzdHJ1Y3QgbWxkMl9xdWVyeSB7CisJX191OCB0eXBlOworCV9fdTggY29kZTsKKwlfX3UxNiBjc3VtOworCV9fdTE2IG1yYzsKKwlfX3UxNiByZXN2MTsKKwlzdHJ1Y3QgaW42X2FkZHIgbWNhOworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggcXJ2OjMsCisJICAgICBzdXBwcmVzczoxLAorCSAgICAgcmVzdjI6NDsKKyNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggcmVzdjI6NCwKKwkgICAgIHN1cHByZXNzOjEsCisJICAgICBxcnY6MzsKKyNlbHNlCisjZXJyb3IgIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCisjZW5kaWYKKwlfX3U4IHFxaWM7CisJX191MTYgbnNyY3M7CisJc3RydWN0IGluNl9hZGRyIHNyY3NbMF07Cit9OworCitzdGF0aWMgc3RydWN0IGluNl9hZGRyIG1sZDJfYWxsX21jciA9IE1MRDJfQUxMX01DUl9JTklUOworCisvKiBCaWcgbWMgbGlzdCBsb2NrIGZvciBhbGwgdGhlIHNvY2tldHMgKi8KK3N0YXRpYyBERUZJTkVfUldMT0NLKGlwdjZfc2tfbWNfbG9jayk7CisKK3N0YXRpYyBzdHJ1Y3Qgc29ja2V0ICppZ21wNl9zb2NrZXQ7CisKK2ludCBfX2lwdjZfZGV2X21jX2RlYyhzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2LCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIpOworCitzdGF0aWMgdm9pZCBpZ21wNl9qb2luX2dyb3VwKHN0cnVjdCBpZm1jYWRkcjYgKm1hKTsKK3N0YXRpYyB2b2lkIGlnbXA2X2xlYXZlX2dyb3VwKHN0cnVjdCBpZm1jYWRkcjYgKm1hKTsKK3N0YXRpYyB2b2lkIGlnbXA2X3RpbWVyX2hhbmRsZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKKworc3RhdGljIHZvaWQgbWxkX2dxX3RpbWVyX2V4cGlyZSh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgbWxkX2lmY190aW1lcl9leHBpcmUodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIG1sZF9pZmNfZXZlbnQoc3RydWN0IGluZXQ2X2RldiAqaWRldik7CitzdGF0aWMgdm9pZCBtbGRfYWRkX2RlbHJlYyhzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2LCBzdHJ1Y3QgaWZtY2FkZHI2ICpwbWMpOworc3RhdGljIHZvaWQgbWxkX2RlbF9kZWxyZWMoc3RydWN0IGluZXQ2X2RldiAqaWRldiwgc3RydWN0IGluNl9hZGRyICphZGRyKTsKK3N0YXRpYyB2b2lkIG1sZF9jbGVhcl9kZWxyZWMoc3RydWN0IGluZXQ2X2RldiAqaWRldik7CitzdGF0aWMgaW50IHNmX3NldHN0YXRlKHN0cnVjdCBpZm1jYWRkcjYgKnBtYyk7CitzdGF0aWMgdm9pZCBzZl9tYXJrc3RhdGUoc3RydWN0IGlmbWNhZGRyNiAqcG1jKTsKK3N0YXRpYyB2b2lkIGlwNl9tY19jbGVhcl9zcmMoc3RydWN0IGlmbWNhZGRyNiAqcG1jKTsKK3N0YXRpYyBpbnQgaXA2X21jX2RlbF9zcmMoc3RydWN0IGluZXQ2X2RldiAqaWRldiwgc3RydWN0IGluNl9hZGRyICpwbWNhLAorCQkJICBpbnQgc2Ztb2RlLCBpbnQgc2Zjb3VudCwgc3RydWN0IGluNl9hZGRyICpwc2ZzcmMsCisJCQkgIGludCBkZWx0YSk7CitzdGF0aWMgaW50IGlwNl9tY19hZGRfc3JjKHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYsIHN0cnVjdCBpbjZfYWRkciAqcG1jYSwKKwkJCSAgaW50IHNmbW9kZSwgaW50IHNmY291bnQsIHN0cnVjdCBpbjZfYWRkciAqcHNmc3JjLAorCQkJICBpbnQgZGVsdGEpOworc3RhdGljIGludCBpcDZfbWNfbGVhdmVfc3JjKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGlwdjZfbWNfc29ja2xpc3QgKmltbCwKKwkJCSAgICBzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KTsKKworCisjZGVmaW5lIElHTVA2X1VOU09MSUNJVEVEX0lWQUwJKDEwKkhaKQorI2RlZmluZSBNTERfUVJWX0RFRkFVTFQJCTIKKworI2RlZmluZSBNTERfVjFfU0VFTihpZGV2KSAoaXB2Nl9kZXZjb25mLmZvcmNlX21sZF92ZXJzaW9uID09IDEgfHwgXAorCQkoaWRldiktPmNuZi5mb3JjZV9tbGRfdmVyc2lvbiA9PSAxIHx8IFwKKwkJKChpZGV2KS0+bWNfdjFfc2VlbiAmJiBcCisJCXRpbWVfYmVmb3JlKGppZmZpZXMsIChpZGV2KS0+bWNfdjFfc2VlbikpKQorCisjZGVmaW5lIE1MRFYyX01BU0sodmFsdWUsIG5iKSAoKG5iKT49MzIgPyAodmFsdWUpIDogKCgxPDwobmIpKS0xKSAmICh2YWx1ZSkpCisjZGVmaW5lIE1MRFYyX0VYUCh0aHJlc2gsIG5ibWFudCwgbmJleHAsIHZhbHVlKSBcCisJKCh2YWx1ZSkgPCAodGhyZXNoKSA/ICh2YWx1ZSkgOiBcCisJKChNTERWMl9NQVNLKHZhbHVlLCBuYm1hbnQpIHwgKDE8PChuYm1hbnQrbmJleHApKSkgPDwgXAorCShNTERWMl9NQVNLKCh2YWx1ZSkgPj4gKG5ibWFudCksIG5iZXhwKSArIChuYmV4cCkpKSkKKworI2RlZmluZSBNTERWMl9RUUlDKHZhbHVlKSBNTERWMl9FWFAoMHg4MCwgNCwgMywgdmFsdWUpCisjZGVmaW5lIE1MRFYyX01SQyh2YWx1ZSkgTUxEVjJfRVhQKDB4ODAwMCwgMTIsIDMsIHZhbHVlKQorCisjZGVmaW5lIElQVjZfTUxEX01BWF9NU0YJMTAKKworaW50IHN5c2N0bF9tbGRfbWF4X21zZiA9IElQVjZfTUxEX01BWF9NU0Y7CisKKy8qCisgKglzb2NrZXQgam9pbiBvbiBtdWx0aWNhc3QgZ3JvdXAKKyAqLworCitpbnQgaXB2Nl9zb2NrX21jX2pvaW4oc3RydWN0IHNvY2sgKnNrLCBpbnQgaWZpbmRleCwgc3RydWN0IGluNl9hZGRyICphZGRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCXN0cnVjdCBpcHY2X21jX3NvY2tsaXN0ICptY19sc3Q7CisJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOworCWludCBlcnI7CisKKwlpZiAoIWlwdjZfYWRkcl9pc19tdWx0aWNhc3QoYWRkcikpCisJCXJldHVybiAtRUlOVkFMOworCisJbWNfbHN0ID0gc29ja19rbWFsbG9jKHNrLCBzaXplb2Yoc3RydWN0IGlwdjZfbWNfc29ja2xpc3QpLCBHRlBfS0VSTkVMKTsKKworCWlmIChtY19sc3QgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltY19sc3QtPm5leHQgPSBOVUxMOworCWlwdjZfYWRkcl9jb3B5KCZtY19sc3QtPmFkZHIsIGFkZHIpOworCisJaWYgKGlmaW5kZXggPT0gMCkgeworCQlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OworCQlydCA9IHJ0Nl9sb29rdXAoYWRkciwgTlVMTCwgMCwgMCk7CisJCWlmIChydCkgeworCQkJZGV2ID0gcnQtPnJ0NmlfZGV2OworCQkJZGV2X2hvbGQoZGV2KTsKKwkJCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCQl9CisJfSBlbHNlCisJCWRldiA9IGRldl9nZXRfYnlfaW5kZXgoaWZpbmRleCk7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJc29ja19rZnJlZV9zKHNrLCBtY19sc3QsIHNpemVvZigqbWNfbHN0KSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW1jX2xzdC0+aWZpbmRleCA9IGRldi0+aWZpbmRleDsKKwltY19sc3QtPnNmbW9kZSA9IE1DQVNUX0VYQ0xVREU7CisJbWNfbHN0LT5zZmxpc3QgPSBOVUxMOworCisJLyoKKwkgKglub3cgYWRkL2luY3JlYXNlIHRoZSBncm91cCBtZW1iZXJzaGlwIG9uIHRoZSBkZXZpY2UKKwkgKi8KKworCWVyciA9IGlwdjZfZGV2X21jX2luYyhkZXYsIGFkZHIpOworCisJaWYgKGVycikgeworCQlzb2NrX2tmcmVlX3Moc2ssIG1jX2xzdCwgc2l6ZW9mKCptY19sc3QpKTsKKwkJZGV2X3B1dChkZXYpOworCQlyZXR1cm4gZXJyOworCX0KKworCXdyaXRlX2xvY2tfYmgoJmlwdjZfc2tfbWNfbG9jayk7CisJbWNfbHN0LT5uZXh0ID0gbnAtPmlwdjZfbWNfbGlzdDsKKwlucC0+aXB2Nl9tY19saXN0ID0gbWNfbHN0OworCXdyaXRlX3VubG9ja19iaCgmaXB2Nl9za19tY19sb2NrKTsKKworCWRldl9wdXQoZGV2KTsKKworCXJldHVybiAwOworfQorCisvKgorICoJc29ja2V0IGxlYXZlIG9uIG11bHRpY2FzdCBncm91cAorICovCitpbnQgaXB2Nl9zb2NrX21jX2Ryb3Aoc3RydWN0IHNvY2sgKnNrLCBpbnQgaWZpbmRleCwgc3RydWN0IGluNl9hZGRyICphZGRyKQoreworCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKKwlzdHJ1Y3QgaXB2Nl9tY19zb2NrbGlzdCAqbWNfbHN0LCAqKmxuazsKKworCXdyaXRlX2xvY2tfYmgoJmlwdjZfc2tfbWNfbG9jayk7CisJZm9yIChsbmsgPSAmbnAtPmlwdjZfbWNfbGlzdDsgKG1jX2xzdCA9ICpsbmspICE9TlVMTCA7IGxuayA9ICZtY19sc3QtPm5leHQpIHsKKwkJaWYgKChpZmluZGV4ID09IDAgfHwgbWNfbHN0LT5pZmluZGV4ID09IGlmaW5kZXgpICYmCisJCSAgICBpcHY2X2FkZHJfZXF1YWwoJm1jX2xzdC0+YWRkciwgYWRkcikpIHsKKwkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwkJCSpsbmsgPSBtY19sc3QtPm5leHQ7CisJCQl3cml0ZV91bmxvY2tfYmgoJmlwdjZfc2tfbWNfbG9jayk7CisKKwkJCWlmICgoZGV2ID0gZGV2X2dldF9ieV9pbmRleChtY19sc3QtPmlmaW5kZXgpKSAhPSBOVUxMKSB7CisJCQkJc3RydWN0IGluZXQ2X2RldiAqaWRldiA9IGluNl9kZXZfZ2V0KGRldik7CisKKwkJCQlpZiAoaWRldikgeworCQkJCQkodm9pZCkgaXA2X21jX2xlYXZlX3NyYyhzayxtY19sc3QsaWRldik7CisJCQkJCV9faXB2Nl9kZXZfbWNfZGVjKGlkZXYsICZtY19sc3QtPmFkZHIpOworCQkJCQlpbjZfZGV2X3B1dChpZGV2KTsKKwkJCQl9CisJCQkJZGV2X3B1dChkZXYpOworCQkJfQorCQkJc29ja19rZnJlZV9zKHNrLCBtY19sc3QsIHNpemVvZigqbWNfbHN0KSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwl3cml0ZV91bmxvY2tfYmgoJmlwdjZfc2tfbWNfbG9jayk7CisKKwlyZXR1cm4gLUVOT0VOVDsKK30KKworc3RhdGljIHN0cnVjdCBpbmV0Nl9kZXYgKmlwNl9tY19maW5kX2RldihzdHJ1Y3QgaW42X2FkZHIgKmdyb3VwLCBpbnQgaWZpbmRleCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gTlVMTDsKKworCWlmIChpZmluZGV4ID09IDApIHsKKwkJc3RydWN0IHJ0Nl9pbmZvICpydDsKKworCQlydCA9IHJ0Nl9sb29rdXAoZ3JvdXAsIE5VTEwsIDAsIDApOworCQlpZiAocnQpIHsKKwkJCWRldiA9IHJ0LT5ydDZpX2RldjsKKwkJCWRldl9ob2xkKGRldik7CisJCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwkJfQorCX0gZWxzZQorCQlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KGlmaW5kZXgpOworCisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCWlkZXYgPSBpbjZfZGV2X2dldChkZXYpOworCWlmICghaWRldikgeworCQlkZXZfcHV0KGRldik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZWFkX2xvY2tfYmgoJmlkZXYtPmxvY2spOworCWlmIChpZGV2LT5kZWFkKSB7CisJCXJlYWRfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwkJaW42X2Rldl9wdXQoaWRldik7CisJCWRldl9wdXQoZGV2KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBpZGV2OworfQorCit2b2lkIGlwdjZfc29ja19tY19jbG9zZShzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOworCXN0cnVjdCBpcHY2X21jX3NvY2tsaXN0ICptY19sc3Q7CisKKwl3cml0ZV9sb2NrX2JoKCZpcHY2X3NrX21jX2xvY2spOworCXdoaWxlICgobWNfbHN0ID0gbnAtPmlwdjZfbWNfbGlzdCkgIT0gTlVMTCkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJCW5wLT5pcHY2X21jX2xpc3QgPSBtY19sc3QtPm5leHQ7CisJCXdyaXRlX3VubG9ja19iaCgmaXB2Nl9za19tY19sb2NrKTsKKworCQlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KG1jX2xzdC0+aWZpbmRleCk7CisJCWlmIChkZXYpIHsKKwkJCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBpbjZfZGV2X2dldChkZXYpOworCisJCQlpZiAoaWRldikgeworCQkJCSh2b2lkKSBpcDZfbWNfbGVhdmVfc3JjKHNrLCBtY19sc3QsIGlkZXYpOworCQkJCV9faXB2Nl9kZXZfbWNfZGVjKGlkZXYsICZtY19sc3QtPmFkZHIpOworCQkJCWluNl9kZXZfcHV0KGlkZXYpOworCQkJfQorCQkJZGV2X3B1dChkZXYpOworCQl9CisKKwkJc29ja19rZnJlZV9zKHNrLCBtY19sc3QsIHNpemVvZigqbWNfbHN0KSk7CisKKwkJd3JpdGVfbG9ja19iaCgmaXB2Nl9za19tY19sb2NrKTsKKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZpcHY2X3NrX21jX2xvY2spOworfQorCitpbnQgaXA2X21jX3NvdXJjZShpbnQgYWRkLCBpbnQgb21vZGUsIHN0cnVjdCBzb2NrICpzaywKKwlzdHJ1Y3QgZ3JvdXBfc291cmNlX3JlcSAqcGdzcikKK3sKKwlzdHJ1Y3QgaW42X2FkZHIgKnNvdXJjZSwgKmdyb3VwOworCXN0cnVjdCBpcHY2X21jX3NvY2tsaXN0ICpwbWM7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OworCXN0cnVjdCBpcHY2X3BpbmZvICppbmV0NiA9IGluZXQ2X3NrKHNrKTsKKwlzdHJ1Y3QgaXA2X3NmX3NvY2tsaXN0ICpwc2w7CisJaW50IGksIGosIHJ2OworCWludCBlcnI7CisKKwlpZiAocGdzci0+Z3NyX2dyb3VwLnNzX2ZhbWlseSAhPSBBRl9JTkVUNiB8fAorCSAgICBwZ3NyLT5nc3Jfc291cmNlLnNzX2ZhbWlseSAhPSBBRl9JTkVUNikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzb3VyY2UgPSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJnBnc3ItPmdzcl9zb3VyY2UpLT5zaW42X2FkZHI7CisJZ3JvdXAgPSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJnBnc3ItPmdzcl9ncm91cCktPnNpbjZfYWRkcjsKKworCWlmICghaXB2Nl9hZGRyX2lzX211bHRpY2FzdChncm91cCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWRldiA9IGlwNl9tY19maW5kX2Rldihncm91cCwgcGdzci0+Z3NyX2ludGVyZmFjZSk7CisJaWYgKCFpZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKwlkZXYgPSBpZGV2LT5kZXY7CisKKwllcnIgPSAtRUFERFJOT1RBVkFJTDsKKworCWZvciAocG1jPWluZXQ2LT5pcHY2X21jX2xpc3Q7IHBtYzsgcG1jPXBtYy0+bmV4dCkgeworCQlpZiAocGdzci0+Z3NyX2ludGVyZmFjZSAmJiBwbWMtPmlmaW5kZXggIT0gcGdzci0+Z3NyX2ludGVyZmFjZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoaXB2Nl9hZGRyX2VxdWFsKCZwbWMtPmFkZHIsIGdyb3VwKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoIXBtYykJCS8qIG11c3QgaGF2ZSBhIHByaW9yIGpvaW4gKi8KKwkJZ290byBkb25lOworCS8qIGlmIGEgc291cmNlIGZpbHRlciB3YXMgc2V0LCBtdXN0IGJlIHRoZSBzYW1lIG1vZGUgYXMgYmVmb3JlICovCisJaWYgKHBtYy0+c2ZsaXN0KSB7CisJCWlmIChwbWMtPnNmbW9kZSAhPSBvbW9kZSkKKwkJCWdvdG8gZG9uZTsKKwl9IGVsc2UgaWYgKHBtYy0+c2Ztb2RlICE9IG9tb2RlKSB7CisJCS8qIGFsbG93IG1vZGUgc3dpdGNoZXMgZm9yIGVtcHR5LXNldCBmaWx0ZXJzICovCisJCWlwNl9tY19hZGRfc3JjKGlkZXYsIGdyb3VwLCBvbW9kZSwgMCwgTlVMTCwgMCk7CisJCWlwNl9tY19kZWxfc3JjKGlkZXYsIGdyb3VwLCBwbWMtPnNmbW9kZSwgMCwgTlVMTCwgMCk7CisJCXBtYy0+c2Ztb2RlID0gb21vZGU7CisJfQorCisJcHNsID0gcG1jLT5zZmxpc3Q7CisJaWYgKCFhZGQpIHsKKwkJaWYgKCFwc2wpCisJCQlnb3RvIGRvbmU7CisJCXJ2ID0gITA7CisJCWZvciAoaT0wOyBpPHBzbC0+c2xfY291bnQ7IGkrKykgeworCQkJcnYgPSBtZW1jbXAoJnBzbC0+c2xfYWRkcltpXSwgc291cmNlLAorCQkJCXNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJCWlmIChydiA9PSAwKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChydikJCS8qIHNvdXJjZSBub3QgZm91bmQgKi8KKwkJCWdvdG8gZG9uZTsKKworCQkvKiB1cGRhdGUgdGhlIGludGVyZmFjZSBmaWx0ZXIgKi8KKwkJaXA2X21jX2RlbF9zcmMoaWRldiwgZ3JvdXAsIG9tb2RlLCAxLCBzb3VyY2UsIDEpOworCisJCWZvciAoaj1pKzE7IGo8cHNsLT5zbF9jb3VudDsgaisrKQorCQkJcHNsLT5zbF9hZGRyW2otMV0gPSBwc2wtPnNsX2FkZHJbal07CisJCXBzbC0+c2xfY291bnQtLTsKKwkJZXJyID0gMDsKKwkJZ290byBkb25lOworCX0KKwkvKiBlbHNlLCBhZGQgYSBuZXcgc291cmNlIHRvIHRoZSBmaWx0ZXIgKi8KKworCWlmIChwc2wgJiYgcHNsLT5zbF9jb3VudCA+PSBzeXNjdGxfbWxkX21heF9tc2YpIHsKKwkJZXJyID0gLUVOT0JVRlM7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKCFwc2wgfHwgcHNsLT5zbF9jb3VudCA9PSBwc2wtPnNsX21heCkgeworCQlzdHJ1Y3QgaXA2X3NmX3NvY2tsaXN0ICpuZXdwc2w7CisJCWludCBjb3VudCA9IElQNl9TRkJMT0NLOworCisJCWlmIChwc2wpCisJCQljb3VudCArPSBwc2wtPnNsX21heDsKKwkJbmV3cHNsID0gKHN0cnVjdCBpcDZfc2Zfc29ja2xpc3QgKilzb2NrX2ttYWxsb2Moc2ssCisJCQlJUDZfU0ZMU0laRShjb3VudCksIEdGUF9BVE9NSUMpOworCQlpZiAoIW5ld3BzbCkgeworCQkJZXJyID0gLUVOT0JVRlM7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJbmV3cHNsLT5zbF9tYXggPSBjb3VudDsKKwkJbmV3cHNsLT5zbF9jb3VudCA9IGNvdW50IC0gSVA2X1NGQkxPQ0s7CisJCWlmIChwc2wpIHsKKwkJCWZvciAoaT0wOyBpPHBzbC0+c2xfY291bnQ7IGkrKykKKwkJCQluZXdwc2wtPnNsX2FkZHJbaV0gPSBwc2wtPnNsX2FkZHJbaV07CisJCQlzb2NrX2tmcmVlX3Moc2ssIHBzbCwgSVA2X1NGTFNJWkUocHNsLT5zbF9tYXgpKTsKKwkJfQorCQlwbWMtPnNmbGlzdCA9IHBzbCA9IG5ld3BzbDsKKwl9CisJcnYgPSAxOwkvKiA+IDAgZm9yIGluc2VydCBsb2dpYyBiZWxvdyBpZiBzbF9jb3VudCBpcyAwICovCisJZm9yIChpPTA7IGk8cHNsLT5zbF9jb3VudDsgaSsrKSB7CisJCXJ2ID0gbWVtY21wKCZwc2wtPnNsX2FkZHJbaV0sIHNvdXJjZSwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQlpZiAocnYgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAocnYgPT0gMCkJCS8qIGFkZHJlc3MgYWxyZWFkeSB0aGVyZSBpcyBhbiBlcnJvciAqLworCQlnb3RvIGRvbmU7CisJZm9yIChqPXBzbC0+c2xfY291bnQtMTsgaj49aTsgai0tKQorCQlwc2wtPnNsX2FkZHJbaisxXSA9IHBzbC0+c2xfYWRkcltqXTsKKwlwc2wtPnNsX2FkZHJbaV0gPSAqc291cmNlOworCXBzbC0+c2xfY291bnQrKzsKKwllcnIgPSAwOworCS8qIHVwZGF0ZSB0aGUgaW50ZXJmYWNlIGxpc3QgKi8KKwlpcDZfbWNfYWRkX3NyYyhpZGV2LCBncm91cCwgb21vZGUsIDEsIHNvdXJjZSwgMSk7Citkb25lOgorCXJlYWRfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwlpbjZfZGV2X3B1dChpZGV2KTsKKwlkZXZfcHV0KGRldik7CisJcmV0dXJuIGVycjsKK30KKworaW50IGlwNl9tY19tc2ZpbHRlcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBncm91cF9maWx0ZXIgKmdzZikKK3sKKwlzdHJ1Y3QgaW42X2FkZHIgKmdyb3VwOworCXN0cnVjdCBpcHY2X21jX3NvY2tsaXN0ICpwbWM7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OworCXN0cnVjdCBpcHY2X3BpbmZvICppbmV0NiA9IGluZXQ2X3NrKHNrKTsKKwlzdHJ1Y3QgaXA2X3NmX3NvY2tsaXN0ICpuZXdwc2wsICpwc2w7CisJaW50IGksIGVycjsKKworCWdyb3VwID0gJigoc3RydWN0IHNvY2thZGRyX2luNiAqKSZnc2YtPmdmX2dyb3VwKS0+c2luNl9hZGRyOworCisJaWYgKCFpcHY2X2FkZHJfaXNfbXVsdGljYXN0KGdyb3VwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGdzZi0+Z2ZfZm1vZGUgIT0gTUNBU1RfSU5DTFVERSAmJgorCSAgICBnc2YtPmdmX2Ztb2RlICE9IE1DQVNUX0VYQ0xVREUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWRldiA9IGlwNl9tY19maW5kX2Rldihncm91cCwgZ3NmLT5nZl9pbnRlcmZhY2UpOworCisJaWYgKCFpZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKwlkZXYgPSBpZGV2LT5kZXY7CisJZXJyID0gLUVBRERSTk9UQVZBSUw7CisKKwlmb3IgKHBtYz1pbmV0Ni0+aXB2Nl9tY19saXN0OyBwbWM7IHBtYz1wbWMtPm5leHQpIHsKKwkJaWYgKHBtYy0+aWZpbmRleCAhPSBnc2YtPmdmX2ludGVyZmFjZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoaXB2Nl9hZGRyX2VxdWFsKCZwbWMtPmFkZHIsIGdyb3VwKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoIXBtYykJCS8qIG11c3QgaGF2ZSBhIHByaW9yIGpvaW4gKi8KKwkJZ290byBkb25lOworCWlmIChnc2YtPmdmX251bXNyYykgeworCQluZXdwc2wgPSAoc3RydWN0IGlwNl9zZl9zb2NrbGlzdCAqKXNvY2tfa21hbGxvYyhzaywKKwkJCQlJUDZfU0ZMU0laRShnc2YtPmdmX251bXNyYyksIEdGUF9BVE9NSUMpOworCQlpZiAoIW5ld3BzbCkgeworCQkJZXJyID0gLUVOT0JVRlM7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJbmV3cHNsLT5zbF9tYXggPSBuZXdwc2wtPnNsX2NvdW50ID0gZ3NmLT5nZl9udW1zcmM7CisJCWZvciAoaT0wOyBpPG5ld3BzbC0+c2xfY291bnQ7ICsraSkgeworCQkJc3RydWN0IHNvY2thZGRyX2luNiAqcHNpbjY7CisKKwkJCXBzaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmZ3NmLT5nZl9zbGlzdFtpXTsKKwkJCW5ld3BzbC0+c2xfYWRkcltpXSA9IHBzaW42LT5zaW42X2FkZHI7CisJCX0KKwkJZXJyID0gaXA2X21jX2FkZF9zcmMoaWRldiwgZ3JvdXAsIGdzZi0+Z2ZfZm1vZGUsCisJCQluZXdwc2wtPnNsX2NvdW50LCBuZXdwc2wtPnNsX2FkZHIsIDApOworCQlpZiAoZXJyKSB7CisJCQlzb2NrX2tmcmVlX3Moc2ssIG5ld3BzbCwgSVA2X1NGTFNJWkUobmV3cHNsLT5zbF9tYXgpKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0gZWxzZQorCQluZXdwc2wgPSBOVUxMOworCXBzbCA9IHBtYy0+c2ZsaXN0OworCWlmIChwc2wpIHsKKwkJKHZvaWQpIGlwNl9tY19kZWxfc3JjKGlkZXYsIGdyb3VwLCBwbWMtPnNmbW9kZSwKKwkJCXBzbC0+c2xfY291bnQsIHBzbC0+c2xfYWRkciwgMCk7CisJCXNvY2tfa2ZyZWVfcyhzaywgcHNsLCBJUDZfU0ZMU0laRShwc2wtPnNsX21heCkpOworCX0gZWxzZQorCQkodm9pZCkgaXA2X21jX2RlbF9zcmMoaWRldiwgZ3JvdXAsIHBtYy0+c2Ztb2RlLCAwLCBOVUxMLCAwKTsKKwlwbWMtPnNmbGlzdCA9IG5ld3BzbDsKKwlwbWMtPnNmbW9kZSA9IGdzZi0+Z2ZfZm1vZGU7Citkb25lOgorCXJlYWRfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwlpbjZfZGV2X3B1dChpZGV2KTsKKwlkZXZfcHV0KGRldik7CisJcmV0dXJuIGVycjsKK30KKworaW50IGlwNl9tY19tc2ZnZXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgZ3JvdXBfZmlsdGVyICpnc2YsCisJc3RydWN0IGdyb3VwX2ZpbHRlciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoreworCWludCBlcnIsIGksIGNvdW50LCBjb3B5Y291bnQ7CisJc3RydWN0IGluNl9hZGRyICpncm91cDsKKwlzdHJ1Y3QgaXB2Nl9tY19zb2NrbGlzdCAqcG1jOworCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqaW5ldDYgPSBpbmV0Nl9zayhzayk7CisJc3RydWN0IGlwNl9zZl9zb2NrbGlzdCAqcHNsOworCisJZ3JvdXAgPSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJmdzZi0+Z2ZfZ3JvdXApLT5zaW42X2FkZHI7CisKKwlpZiAoIWlwdjZfYWRkcl9pc19tdWx0aWNhc3QoZ3JvdXApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlkZXYgPSBpcDZfbWNfZmluZF9kZXYoZ3JvdXAsIGdzZi0+Z2ZfaW50ZXJmYWNlKTsKKworCWlmICghaWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkZXYgPSBpZGV2LT5kZXY7CisKKwllcnIgPSAtRUFERFJOT1RBVkFJTDsKKworCWZvciAocG1jPWluZXQ2LT5pcHY2X21jX2xpc3Q7IHBtYzsgcG1jPXBtYy0+bmV4dCkgeworCQlpZiAocG1jLT5pZmluZGV4ICE9IGdzZi0+Z2ZfaW50ZXJmYWNlKQorCQkJY29udGludWU7CisJCWlmIChpcHY2X2FkZHJfZXF1YWwoZ3JvdXAsICZwbWMtPmFkZHIpKQorCQkJYnJlYWs7CisJfQorCWlmICghcG1jKQkJLyogbXVzdCBoYXZlIGEgcHJpb3Igam9pbiAqLworCQlnb3RvIGRvbmU7CisJZ3NmLT5nZl9mbW9kZSA9IHBtYy0+c2Ztb2RlOworCXBzbCA9IHBtYy0+c2ZsaXN0OworCWNvdW50ID0gcHNsID8gcHNsLT5zbF9jb3VudCA6IDA7CisJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOworCWluNl9kZXZfcHV0KGlkZXYpOworCWRldl9wdXQoZGV2KTsKKworCWNvcHljb3VudCA9IGNvdW50IDwgZ3NmLT5nZl9udW1zcmMgPyBjb3VudCA6IGdzZi0+Z2ZfbnVtc3JjOworCWdzZi0+Z2ZfbnVtc3JjID0gY291bnQ7CisJaWYgKHB1dF91c2VyKEdST1VQX0ZJTFRFUl9TSVpFKGNvcHljb3VudCksIG9wdGxlbikgfHwKKwkgICAgY29weV90b191c2VyKG9wdHZhbCwgZ3NmLCBHUk9VUF9GSUxURVJfU0laRSgwKSkpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWZvciAoaT0wOyBpPGNvcHljb3VudDsgaSsrKSB7CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnBzaW42OworCQlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzczsKKworCQlwc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJnNzOworCQltZW1zZXQoJnNzLCAwLCBzaXplb2Yoc3MpKTsKKwkJcHNpbjYtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJCXBzaW42LT5zaW42X2FkZHIgPSBwc2wtPnNsX2FkZHJbaV07CisJICAgIAlpZiAoY29weV90b191c2VyKCZvcHR2YWwtPmdmX3NsaXN0W2ldLCAmc3MsIHNpemVvZihzcykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiAwOworZG9uZToKKwlyZWFkX3VubG9ja19iaCgmaWRldi0+bG9jayk7CisJaW42X2Rldl9wdXQoaWRldik7CisJZGV2X3B1dChkZXYpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBpbmV0Nl9tY19jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBpbjZfYWRkciAqbWNfYWRkciwKKwlzdHJ1Y3QgaW42X2FkZHIgKnNyY19hZGRyKQoreworCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKKwlzdHJ1Y3QgaXB2Nl9tY19zb2NrbGlzdCAqbWM7CisJc3RydWN0IGlwNl9zZl9zb2NrbGlzdCAqcHNsOworCWludCBydiA9IDE7CisKKwlyZWFkX2xvY2soJmlwdjZfc2tfbWNfbG9jayk7CisJZm9yIChtYyA9IG5wLT5pcHY2X21jX2xpc3Q7IG1jOyBtYyA9IG1jLT5uZXh0KSB7CisJCWlmIChpcHY2X2FkZHJfZXF1YWwoJm1jLT5hZGRyLCBtY19hZGRyKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoIW1jKSB7CisJCXJlYWRfdW5sb2NrKCZpcHY2X3NrX21jX2xvY2spOworCQlyZXR1cm4gMTsKKwl9CisJcHNsID0gbWMtPnNmbGlzdDsKKwlpZiAoIXBzbCkgeworCQlydiA9IG1jLT5zZm1vZGUgPT0gTUNBU1RfRVhDTFVERTsKKwl9IGVsc2UgeworCQlpbnQgaTsKKworCQlmb3IgKGk9MDsgaTxwc2wtPnNsX2NvdW50OyBpKyspIHsKKwkJCWlmIChpcHY2X2FkZHJfZXF1YWwoJnBzbC0+c2xfYWRkcltpXSwgc3JjX2FkZHIpKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChtYy0+c2Ztb2RlID09IE1DQVNUX0lOQ0xVREUgJiYgaSA+PSBwc2wtPnNsX2NvdW50KQorCQkJcnYgPSAwOworCQlpZiAobWMtPnNmbW9kZSA9PSBNQ0FTVF9FWENMVURFICYmIGkgPCBwc2wtPnNsX2NvdW50KQorCQkJcnYgPSAwOworCX0KKwlyZWFkX3VubG9jaygmaXB2Nl9za19tY19sb2NrKTsKKworCXJldHVybiBydjsKK30KKworc3RhdGljIHZvaWQgbWFfcHV0KHN0cnVjdCBpZm1jYWRkcjYgKm1jKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZtYy0+bWNhX3JlZmNudCkpIHsKKwkJaW42X2Rldl9wdXQobWMtPmlkZXYpOworCQlrZnJlZShtYyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpZ21wNl9ncm91cF9hZGRlZChzdHJ1Y3QgaWZtY2FkZHI2ICptYykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbWMtPmlkZXYtPmRldjsKKwljaGFyIGJ1ZltNQVhfQUREUl9MRU5dOworCisJc3Bpbl9sb2NrX2JoKCZtYy0+bWNhX2xvY2spOworCWlmICghKG1jLT5tY2FfZmxhZ3MmTUFGX0xPQURFRCkpIHsKKwkJbWMtPm1jYV9mbGFncyB8PSBNQUZfTE9BREVEOworCQlpZiAobmRpc2NfbWNfbWFwKCZtYy0+bWNhX2FkZHIsIGJ1ZiwgZGV2LCAwKSA9PSAwKQorCQkJZGV2X21jX2FkZChkZXYsIGJ1ZiwgZGV2LT5hZGRyX2xlbiwgMCk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZtYy0+bWNhX2xvY2spOworCisJaWYgKCEoZGV2LT5mbGFncyAmIElGRl9VUCkgfHwgKG1jLT5tY2FfZmxhZ3MgJiBNQUZfTk9SRVBPUlQpKQorCQlyZXR1cm47CisKKwlpZiAoTUxEX1YxX1NFRU4obWMtPmlkZXYpKSB7CisJCWlnbXA2X2pvaW5fZ3JvdXAobWMpOworCQlyZXR1cm47CisJfQorCS8qIGVsc2UgdjIgKi8KKworCW1jLT5tY2FfY3Jjb3VudCA9IG1jLT5pZGV2LT5tY19xcnY7CisJbWxkX2lmY19ldmVudChtYy0+aWRldik7Cit9CisKK3N0YXRpYyB2b2lkIGlnbXA2X2dyb3VwX2Ryb3BwZWQoc3RydWN0IGlmbWNhZGRyNiAqbWMpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG1jLT5pZGV2LT5kZXY7CisJY2hhciBidWZbTUFYX0FERFJfTEVOXTsKKworCXNwaW5fbG9ja19iaCgmbWMtPm1jYV9sb2NrKTsKKwlpZiAobWMtPm1jYV9mbGFncyZNQUZfTE9BREVEKSB7CisJCW1jLT5tY2FfZmxhZ3MgJj0gfk1BRl9MT0FERUQ7CisJCWlmIChuZGlzY19tY19tYXAoJm1jLT5tY2FfYWRkciwgYnVmLCBkZXYsIDApID09IDApCisJCQlkZXZfbWNfZGVsZXRlKGRldiwgYnVmLCBkZXYtPmFkZHJfbGVuLCAwKTsKKwl9CisKKwlpZiAobWMtPm1jYV9mbGFncyAmIE1BRl9OT1JFUE9SVCkKKwkJZ290byBkb25lOworCXNwaW5fdW5sb2NrX2JoKCZtYy0+bWNhX2xvY2spOworCisJaWYgKCFtYy0+aWRldi0+ZGVhZCkKKwkJaWdtcDZfbGVhdmVfZ3JvdXAobWMpOworCisJc3Bpbl9sb2NrX2JoKCZtYy0+bWNhX2xvY2spOworCWlmIChkZWxfdGltZXIoJm1jLT5tY2FfdGltZXIpKQorCQlhdG9taWNfZGVjKCZtYy0+bWNhX3JlZmNudCk7Citkb25lOgorCWlwNl9tY19jbGVhcl9zcmMobWMpOworCXNwaW5fdW5sb2NrX2JoKCZtYy0+bWNhX2xvY2spOworfQorCisvKgorICogZGVsZXRlZCBpZm1jYWRkcjYgbWFuaXB1bGF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIG1sZF9hZGRfZGVscmVjKHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYsIHN0cnVjdCBpZm1jYWRkcjYgKmltKQoreworCXN0cnVjdCBpZm1jYWRkcjYgKnBtYzsKKworCS8qIHRoaXMgaXMgYW4gImlmbWNhZGRyNiIgZm9yIGNvbnZlbmllbmNlOyBvbmx5IHRoZSBmaWVsZHMgYmVsb3cKKwkgKiBhcmUgYWN0dWFsbHkgdXNlZC4gSW4gcGFydGljdWxhciwgdGhlIHJlZmNudCBhbmQgdXNlcnMgYXJlIG5vdAorCSAqIHVzZWQgZm9yIG1hbmFnZW1lbnQgb2YgdGhlIGRlbGV0ZSBsaXN0LiBVc2luZyB0aGUgc2FtZSBzdHJ1Y3R1cmUKKwkgKiBmb3IgZGVsZXRlZCBpdGVtcyBhbGxvd3MgY2hhbmdlIHJlcG9ydHMgdG8gdXNlIGNvbW1vbiBjb2RlIHdpdGgKKwkgKiBub24tZGVsZXRlZCBvciBxdWVyeS1yZXNwb25zZSBNQ0Ency4KKwkgKi8KKwlwbWMgPSAoc3RydWN0IGlmbWNhZGRyNiAqKWttYWxsb2Moc2l6ZW9mKCpwbWMpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXBtYykKKwkJcmV0dXJuOworCW1lbXNldChwbWMsIDAsIHNpemVvZigqcG1jKSk7CisJc3Bpbl9sb2NrX2JoKCZpbS0+bWNhX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZwbWMtPm1jYV9sb2NrKTsKKwlwbWMtPmlkZXYgPSBpbS0+aWRldjsKKwlpbjZfZGV2X2hvbGQoaWRldik7CisJcG1jLT5tY2FfYWRkciA9IGltLT5tY2FfYWRkcjsKKwlwbWMtPm1jYV9jcmNvdW50ID0gaWRldi0+bWNfcXJ2OworCXBtYy0+bWNhX3NmbW9kZSA9IGltLT5tY2Ffc2Ztb2RlOworCWlmIChwbWMtPm1jYV9zZm1vZGUgPT0gTUNBU1RfSU5DTFVERSkgeworCQlzdHJ1Y3QgaXA2X3NmX2xpc3QgKnBzZjsKKworCQlwbWMtPm1jYV90b21iID0gaW0tPm1jYV90b21iOworCQlwbWMtPm1jYV9zb3VyY2VzID0gaW0tPm1jYV9zb3VyY2VzOworCQlpbS0+bWNhX3RvbWIgPSBpbS0+bWNhX3NvdXJjZXMgPSBOVUxMOworCQlmb3IgKHBzZj1wbWMtPm1jYV9zb3VyY2VzOyBwc2Y7IHBzZj1wc2YtPnNmX25leHQpCisJCQlwc2YtPnNmX2NyY291bnQgPSBwbWMtPm1jYV9jcmNvdW50OworCX0KKwlzcGluX3VubG9ja19iaCgmaW0tPm1jYV9sb2NrKTsKKworCXdyaXRlX2xvY2tfYmgoJmlkZXYtPm1jX2xvY2spOworCXBtYy0+bmV4dCA9IGlkZXYtPm1jX3RvbWI7CisJaWRldi0+bWNfdG9tYiA9IHBtYzsKKwl3cml0ZV91bmxvY2tfYmgoJmlkZXYtPm1jX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBtbGRfZGVsX2RlbHJlYyhzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2LCBzdHJ1Y3QgaW42X2FkZHIgKnBtY2EpCit7CisJc3RydWN0IGlmbWNhZGRyNiAqcG1jLCAqcG1jX3ByZXY7CisJc3RydWN0IGlwNl9zZl9saXN0ICpwc2YsICpwc2ZfbmV4dDsKKworCXdyaXRlX2xvY2tfYmgoJmlkZXYtPm1jX2xvY2spOworCXBtY19wcmV2ID0gTlVMTDsKKwlmb3IgKHBtYz1pZGV2LT5tY190b21iOyBwbWM7IHBtYz1wbWMtPm5leHQpIHsKKwkJaWYgKGlwdjZfYWRkcl9lcXVhbCgmcG1jLT5tY2FfYWRkciwgcG1jYSkpCisJCQlicmVhazsKKwkJcG1jX3ByZXYgPSBwbWM7CisJfQorCWlmIChwbWMpIHsKKwkJaWYgKHBtY19wcmV2KQorCQkJcG1jX3ByZXYtPm5leHQgPSBwbWMtPm5leHQ7CisJCWVsc2UKKwkJCWlkZXYtPm1jX3RvbWIgPSBwbWMtPm5leHQ7CisJfQorCXdyaXRlX3VubG9ja19iaCgmaWRldi0+bWNfbG9jayk7CisJaWYgKHBtYykgeworCQlmb3IgKHBzZj1wbWMtPm1jYV90b21iOyBwc2Y7IHBzZj1wc2ZfbmV4dCkgeworCQkJcHNmX25leHQgPSBwc2YtPnNmX25leHQ7CisJCQlrZnJlZShwc2YpOworCQl9CisJCWluNl9kZXZfcHV0KHBtYy0+aWRldik7CisJCWtmcmVlKHBtYyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBtbGRfY2xlYXJfZGVscmVjKHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpCit7CisJc3RydWN0IGlmbWNhZGRyNiAqcG1jLCAqbmV4dHBtYzsKKworCXdyaXRlX2xvY2tfYmgoJmlkZXYtPm1jX2xvY2spOworCXBtYyA9IGlkZXYtPm1jX3RvbWI7CisJaWRldi0+bWNfdG9tYiA9IE5VTEw7CisJd3JpdGVfdW5sb2NrX2JoKCZpZGV2LT5tY19sb2NrKTsKKworCWZvciAoOyBwbWM7IHBtYyA9IG5leHRwbWMpIHsKKwkJbmV4dHBtYyA9IHBtYy0+bmV4dDsKKwkJaXA2X21jX2NsZWFyX3NyYyhwbWMpOworCQlpbjZfZGV2X3B1dChwbWMtPmlkZXYpOworCQlrZnJlZShwbWMpOworCX0KKworCS8qIGNsZWFyIGRlYWQgc291cmNlcywgdG9vICovCisJcmVhZF9sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwlmb3IgKHBtYz1pZGV2LT5tY19saXN0OyBwbWM7IHBtYz1wbWMtPm5leHQpIHsKKwkJc3RydWN0IGlwNl9zZl9saXN0ICpwc2YsICpwc2ZfbmV4dDsKKworCQlzcGluX2xvY2tfYmgoJnBtYy0+bWNhX2xvY2spOworCQlwc2YgPSBwbWMtPm1jYV90b21iOworCQlwbWMtPm1jYV90b21iID0gTlVMTDsKKwkJc3Bpbl91bmxvY2tfYmgoJnBtYy0+bWNhX2xvY2spOworCQlmb3IgKDsgcHNmOyBwc2Y9cHNmX25leHQpIHsKKwkJCXBzZl9uZXh0ID0gcHNmLT5zZl9uZXh0OworCQkJa2ZyZWUocHNmKTsKKwkJfQorCX0KKwlyZWFkX3VubG9ja19iaCgmaWRldi0+bG9jayk7Cit9CisKKworLyoKKyAqCWRldmljZSBtdWx0aWNhc3QgZ3JvdXAgaW5jIChhZGQgaWYgbm90IGZvdW5kKQorICovCitpbnQgaXB2Nl9kZXZfbWNfaW5jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpbjZfYWRkciAqYWRkcikKK3sKKwlzdHJ1Y3QgaWZtY2FkZHI2ICptYzsKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OworCisJaWRldiA9IGluNl9kZXZfZ2V0KGRldik7CisKKwlpZiAoaWRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdyaXRlX2xvY2tfYmgoJmlkZXYtPmxvY2spOworCWlmIChpZGV2LT5kZWFkKSB7CisJCXdyaXRlX3VubG9ja19iaCgmaWRldi0+bG9jayk7CisJCWluNl9kZXZfcHV0KGlkZXYpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlmb3IgKG1jID0gaWRldi0+bWNfbGlzdDsgbWM7IG1jID0gbWMtPm5leHQpIHsKKwkJaWYgKGlwdjZfYWRkcl9lcXVhbCgmbWMtPm1jYV9hZGRyLCBhZGRyKSkgeworCQkJbWMtPm1jYV91c2VycysrOworCQkJd3JpdGVfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwkJCWlwNl9tY19hZGRfc3JjKGlkZXYsICZtYy0+bWNhX2FkZHIsIE1DQVNUX0VYQ0xVREUsIDAsCisJCQkJTlVMTCwgMCk7CisJCQlpbjZfZGV2X3B1dChpZGV2KTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyoKKwkgKglub3QgZm91bmQ6IGNyZWF0ZSBhIG5ldyBvbmUuCisJICovCisKKwltYyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpZm1jYWRkcjYpLCBHRlBfQVRPTUlDKTsKKworCWlmIChtYyA9PSBOVUxMKSB7CisJCXdyaXRlX3VubG9ja19iaCgmaWRldi0+bG9jayk7CisJCWluNl9kZXZfcHV0KGlkZXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQobWMsIDAsIHNpemVvZihzdHJ1Y3QgaWZtY2FkZHI2KSk7CisJaW5pdF90aW1lcigmbWMtPm1jYV90aW1lcik7CisJbWMtPm1jYV90aW1lci5mdW5jdGlvbiA9IGlnbXA2X3RpbWVyX2hhbmRsZXI7CisJbWMtPm1jYV90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIG1jOworCisJaXB2Nl9hZGRyX2NvcHkoJm1jLT5tY2FfYWRkciwgYWRkcik7CisJbWMtPmlkZXYgPSBpZGV2OworCW1jLT5tY2FfdXNlcnMgPSAxOworCS8qIG1jYV9zdGFtcCBzaG91bGQgYmUgdXBkYXRlZCB1cG9uIGNoYW5nZXMgKi8KKwltYy0+bWNhX2NzdGFtcCA9IG1jLT5tY2FfdHN0YW1wID0gamlmZmllczsKKwlhdG9taWNfc2V0KCZtYy0+bWNhX3JlZmNudCwgMik7CisJc3Bpbl9sb2NrX2luaXQoJm1jLT5tY2FfbG9jayk7CisKKwkvKiBpbml0aWFsIG1vZGUgaXMgKEVYLCBlbXB0eSkgKi8KKwltYy0+bWNhX3NmbW9kZSA9IE1DQVNUX0VYQ0xVREU7CisJbWMtPm1jYV9zZmNvdW50W01DQVNUX0VYQ0xVREVdID0gMTsKKworCWlmIChpcHY2X2FkZHJfaXNfbGxfYWxsX25vZGVzKCZtYy0+bWNhX2FkZHIpIHx8CisJICAgIElQVjZfQUREUl9NQ19TQ09QRSgmbWMtPm1jYV9hZGRyKSA8IElQVjZfQUREUl9TQ09QRV9MSU5LTE9DQUwpCisJCW1jLT5tY2FfZmxhZ3MgfD0gTUFGX05PUkVQT1JUOworCisJbWMtPm5leHQgPSBpZGV2LT5tY19saXN0OworCWlkZXYtPm1jX2xpc3QgPSBtYzsKKwl3cml0ZV91bmxvY2tfYmgoJmlkZXYtPmxvY2spOworCisJbWxkX2RlbF9kZWxyZWMoaWRldiwgJm1jLT5tY2FfYWRkcik7CisJaWdtcDZfZ3JvdXBfYWRkZWQobWMpOworCW1hX3B1dChtYyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglkZXZpY2UgbXVsdGljYXN0IGdyb3VwIGRlbAorICovCitpbnQgX19pcHY2X2Rldl9tY19kZWMoc3RydWN0IGluZXQ2X2RldiAqaWRldiwgc3RydWN0IGluNl9hZGRyICphZGRyKQoreworCXN0cnVjdCBpZm1jYWRkcjYgKm1hLCAqKm1hcDsKKworCXdyaXRlX2xvY2tfYmgoJmlkZXYtPmxvY2spOworCWZvciAobWFwID0gJmlkZXYtPm1jX2xpc3Q7IChtYT0qbWFwKSAhPSBOVUxMOyBtYXAgPSAmbWEtPm5leHQpIHsKKwkJaWYgKGlwdjZfYWRkcl9lcXVhbCgmbWEtPm1jYV9hZGRyLCBhZGRyKSkgeworCQkJaWYgKC0tbWEtPm1jYV91c2VycyA9PSAwKSB7CisJCQkJKm1hcCA9IG1hLT5uZXh0OworCQkJCXdyaXRlX3VubG9ja19iaCgmaWRldi0+bG9jayk7CisKKwkJCQlpZ21wNl9ncm91cF9kcm9wcGVkKG1hKTsKKworCQkJCW1hX3B1dChtYSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQl3cml0ZV91bmxvY2tfYmgoJmlkZXYtPmxvY2spOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKworCXJldHVybiAtRU5PRU5UOworfQorCitpbnQgaXB2Nl9kZXZfbWNfZGVjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpbjZfYWRkciAqYWRkcikKK3sKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gaW42X2Rldl9nZXQoZGV2KTsKKwlpbnQgZXJyOworCisJaWYgKCFpZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWVyciA9IF9faXB2Nl9kZXZfbWNfZGVjKGlkZXYsIGFkZHIpOworCisJaW42X2Rldl9wdXQoaWRldik7CisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogaWRlbnRpZnkgTUxEIHBhY2tldHMgZm9yIE1MRCBmaWx0ZXIgZXhjZXB0aW9ucworICovCitpbnQgaXB2Nl9pc19tbGQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG5leHRoZHIpCit7CisJc3RydWN0IGljbXA2aGRyICpwaWM7CisKKwlpZiAobmV4dGhkciAhPSBJUFBST1RPX0lDTVBWNikKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSkpCisJCXJldHVybiAwOworCisJcGljID0gKHN0cnVjdCBpY21wNmhkciAqKXNrYi0+aC5yYXc7CisKKwlzd2l0Y2ggKHBpYy0+aWNtcDZfdHlwZSkgeworCWNhc2UgSUNNUFY2X01HTV9RVUVSWToKKwljYXNlIElDTVBWNl9NR01fUkVQT1JUOgorCWNhc2UgSUNNUFY2X01HTV9SRURVQ1RJT046CisJY2FzZSBJQ01QVjZfTUxEMl9SRVBPUlQ6CisJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCWNoZWNrIGlmIHRoZSBpbnRlcmZhY2UvYWRkcmVzcyBwYWlyIGlzIHZhbGlkCisgKi8KK2ludCBpcHY2X2Noa19tY2FzdF9hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpbjZfYWRkciAqZ3JvdXAsCisJc3RydWN0IGluNl9hZGRyICpzcmNfYWRkcikKK3sKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OworCXN0cnVjdCBpZm1jYWRkcjYgKm1jOworCWludCBydiA9IDA7CisKKwlpZGV2ID0gaW42X2Rldl9nZXQoZGV2KTsKKwlpZiAoaWRldikgeworCQlyZWFkX2xvY2tfYmgoJmlkZXYtPmxvY2spOworCQlmb3IgKG1jID0gaWRldi0+bWNfbGlzdDsgbWM7IG1jPW1jLT5uZXh0KSB7CisJCQlpZiAoaXB2Nl9hZGRyX2VxdWFsKCZtYy0+bWNhX2FkZHIsIGdyb3VwKSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAobWMpIHsKKwkJCWlmIChzcmNfYWRkciAmJiAhaXB2Nl9hZGRyX2FueShzcmNfYWRkcikpIHsKKwkJCQlzdHJ1Y3QgaXA2X3NmX2xpc3QgKnBzZjsKKworCQkJCXNwaW5fbG9ja19iaCgmbWMtPm1jYV9sb2NrKTsKKwkJCQlmb3IgKHBzZj1tYy0+bWNhX3NvdXJjZXM7cHNmO3BzZj1wc2YtPnNmX25leHQpIHsKKwkJCQkJaWYgKGlwdjZfYWRkcl9lcXVhbCgmcHNmLT5zZl9hZGRyLCBzcmNfYWRkcikpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKHBzZikKKwkJCQkJcnYgPSBwc2YtPnNmX2NvdW50W01DQVNUX0lOQ0xVREVdIHx8CisJCQkJCQlwc2YtPnNmX2NvdW50W01DQVNUX0VYQ0xVREVdICE9CisJCQkJCQltYy0+bWNhX3NmY291bnRbTUNBU1RfRVhDTFVERV07CisJCQkJZWxzZQorCQkJCQlydiA9IG1jLT5tY2Ffc2Zjb3VudFtNQ0FTVF9FWENMVURFXSAhPTA7CisJCQkJc3Bpbl91bmxvY2tfYmgoJm1jLT5tY2FfbG9jayk7CisJCQl9IGVsc2UKKwkJCQlydiA9IDE7IC8qIGRvbid0IGZpbHRlciB1bnNwZWNpZmllZCBzb3VyY2UgKi8KKwkJfQorCQlyZWFkX3VubG9ja19iaCgmaWRldi0+bG9jayk7CisJCWluNl9kZXZfcHV0KGlkZXYpOworCX0KKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyB2b2lkIG1sZF9ncV9zdGFydF90aW1lcihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KQoreworCWludCB0diA9IG5ldF9yYW5kb20oKSAlIGlkZXYtPm1jX21heGRlbGF5OworCisJaWRldi0+bWNfZ3FfcnVubmluZyA9IDE7CisJaWYgKCFtb2RfdGltZXIoJmlkZXYtPm1jX2dxX3RpbWVyLCBqaWZmaWVzK3R2KzIpKQorCQlpbjZfZGV2X2hvbGQoaWRldik7Cit9CisKK3N0YXRpYyB2b2lkIG1sZF9pZmNfc3RhcnRfdGltZXIoc3RydWN0IGluZXQ2X2RldiAqaWRldiwgaW50IGRlbGF5KQoreworCWludCB0diA9IG5ldF9yYW5kb20oKSAlIGRlbGF5OworCisJaWYgKCFtb2RfdGltZXIoJmlkZXYtPm1jX2lmY190aW1lciwgamlmZmllcyt0disyKSkKKwkJaW42X2Rldl9ob2xkKGlkZXYpOworfQorCisvKgorICoJSUdNUCBoYW5kbGluZyAoYWxpYXMgbXVsdGljYXN0IElDTVB2NiBtZXNzYWdlcykKKyAqLworCitzdGF0aWMgdm9pZCBpZ21wNl9ncm91cF9xdWVyaWVkKHN0cnVjdCBpZm1jYWRkcjYgKm1hLCB1bnNpZ25lZCBsb25nIHJlc3B0aW1lKQoreworCXVuc2lnbmVkIGxvbmcgZGVsYXkgPSByZXNwdGltZTsKKworCS8qIERvIG5vdCBzdGFydCB0aW1lciBmb3IgdGhlc2UgYWRkcmVzc2VzICovCisJaWYgKGlwdjZfYWRkcl9pc19sbF9hbGxfbm9kZXMoJm1hLT5tY2FfYWRkcikgfHwKKwkgICAgSVBWNl9BRERSX01DX1NDT1BFKCZtYS0+bWNhX2FkZHIpIDwgSVBWNl9BRERSX1NDT1BFX0xJTktMT0NBTCkKKwkJcmV0dXJuOworCisJaWYgKGRlbF90aW1lcigmbWEtPm1jYV90aW1lcikpIHsKKwkJYXRvbWljX2RlYygmbWEtPm1jYV9yZWZjbnQpOworCQlkZWxheSA9IG1hLT5tY2FfdGltZXIuZXhwaXJlcyAtIGppZmZpZXM7CisJfQorCisJaWYgKGRlbGF5ID49IHJlc3B0aW1lKSB7CisJCWlmIChyZXNwdGltZSkKKwkJCWRlbGF5ID0gbmV0X3JhbmRvbSgpICUgcmVzcHRpbWU7CisJCWVsc2UKKwkJCWRlbGF5ID0gMTsKKwl9CisJbWEtPm1jYV90aW1lci5leHBpcmVzID0gamlmZmllcyArIGRlbGF5OworCWlmICghbW9kX3RpbWVyKCZtYS0+bWNhX3RpbWVyLCBqaWZmaWVzICsgZGVsYXkpKQorCQlhdG9taWNfaW5jKCZtYS0+bWNhX3JlZmNudCk7CisJbWEtPm1jYV9mbGFncyB8PSBNQUZfVElNRVJfUlVOTklORzsKK30KKworc3RhdGljIHZvaWQgbWxkX21hcmtzb3VyY2VzKHN0cnVjdCBpZm1jYWRkcjYgKnBtYywgaW50IG5zcmNzLAorCXN0cnVjdCBpbjZfYWRkciAqc3JjcykKK3sKKwlzdHJ1Y3QgaXA2X3NmX2xpc3QgKnBzZjsKKwlpbnQgaSwgc2NvdW50OworCisJc2NvdW50ID0gMDsKKwlmb3IgKHBzZj1wbWMtPm1jYV9zb3VyY2VzOyBwc2Y7IHBzZj1wc2YtPnNmX25leHQpIHsKKwkJaWYgKHNjb3VudCA9PSBuc3JjcykKKwkJCWJyZWFrOworCQlmb3IgKGk9MDsgaTxuc3JjczsgaSsrKQorCQkJaWYgKGlwdjZfYWRkcl9lcXVhbCgmc3Jjc1tpXSwgJnBzZi0+c2ZfYWRkcikpIHsKKwkJCQlwc2YtPnNmX2dzcmVzcCA9IDE7CisJCQkJc2NvdW50Kys7CisJCQkJYnJlYWs7CisJCQl9CisJfQorfQorCitpbnQgaWdtcDZfZXZlbnRfcXVlcnkoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbWxkMl9xdWVyeSAqbWxoMiA9IChzdHJ1Y3QgbWxkMl9xdWVyeSAqKSBza2ItPmgucmF3OworCXN0cnVjdCBpZm1jYWRkcjYgKm1hOworCXN0cnVjdCBpbjZfYWRkciAqZ3JvdXA7CisJdW5zaWduZWQgbG9uZyBtYXhfZGVsYXk7CisJc3RydWN0IGluZXQ2X2RldiAqaWRldjsKKwlzdHJ1Y3QgaWNtcDZoZHIgKmhkcjsKKwlpbnQgZ3JvdXBfdHlwZTsKKwlpbnQgbWFyayA9IDA7CisJaW50IGxlbjsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBjb21wdXRlIHBheWxvYWQgbGVuZ3RoIGV4Y2x1ZGluZyBleHRlbnNpb24gaGVhZGVycyAqLworCWxlbiA9IG50b2hzKHNrYi0+bmguaXB2NmgtPnBheWxvYWRfbGVuKSArIHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisJbGVuIC09IChjaGFyICopc2tiLT5oLnJhdyAtIChjaGFyICopc2tiLT5uaC5pcHY2aDsgCisKKwkvKiBEcm9wIHF1ZXJpZXMgd2l0aCBub3QgbGluayBsb2NhbCBzb3VyY2UgKi8KKwlpZiAoIShpcHY2X2FkZHJfdHlwZSgmc2tiLT5uaC5pcHY2aC0+c2FkZHIpJklQVjZfQUREUl9MSU5LTE9DQUwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlkZXYgPSBpbjZfZGV2X2dldChza2ItPmRldik7CisKKwlpZiAoaWRldiA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWhkciA9IChzdHJ1Y3QgaWNtcDZoZHIgKikgc2tiLT5oLnJhdzsKKwlncm91cCA9IChzdHJ1Y3QgaW42X2FkZHIgKikgKGhkciArIDEpOworCWdyb3VwX3R5cGUgPSBpcHY2X2FkZHJfdHlwZShncm91cCk7CisKKwlpZiAoZ3JvdXBfdHlwZSAhPSBJUFY2X0FERFJfQU5ZICYmCisJICAgICEoZ3JvdXBfdHlwZSZJUFY2X0FERFJfTVVMVElDQVNUKSkgeworCQlpbjZfZGV2X3B1dChpZGV2KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGxlbiA9PSAyNCkgeworCQlpbnQgc3dpdGNoYmFjazsKKwkJLyogTUxEdjEgcm91dGVyIHByZXNlbnQgKi8KKworCQkvKiBUcmFuc2xhdGUgbWlsbGlzZWNvbmRzIHRvIGppZmZpZXMgKi8KKwkJbWF4X2RlbGF5ID0gKG50b2hzKGhkci0+aWNtcDZfbWF4ZGVsYXkpKkhaKS8xMDAwOworCisJCXN3aXRjaGJhY2sgPSAoaWRldi0+bWNfcXJ2ICsgMSkgKiBtYXhfZGVsYXk7CisJCWlkZXYtPm1jX3YxX3NlZW4gPSBqaWZmaWVzICsgc3dpdGNoYmFjazsKKworCQkvKiBjYW5jZWwgdGhlIGludGVyZmFjZSBjaGFuZ2UgdGltZXIgKi8KKwkJaWRldi0+bWNfaWZjX2NvdW50ID0gMDsKKwkJaWYgKGRlbF90aW1lcigmaWRldi0+bWNfaWZjX3RpbWVyKSkKKwkJCV9faW42X2Rldl9wdXQoaWRldik7CisJCS8qIGNsZWFyIGRlbGV0ZWQgcmVwb3J0IGl0ZW1zICovCisJCW1sZF9jbGVhcl9kZWxyZWMoaWRldik7CisJfSBlbHNlIGlmIChsZW4gPj0gMjgpIHsKKwkJbWF4X2RlbGF5ID0gKE1MRFYyX01SQyhudG9ocyhtbGgyLT5tcmMpKSpIWikvMTAwMDsKKwkJaWYgKCFtYXhfZGVsYXkpCisJCQltYXhfZGVsYXkgPSAxOworCQlpZGV2LT5tY19tYXhkZWxheSA9IG1heF9kZWxheTsKKwkJaWYgKG1saDItPnFydikKKwkJCWlkZXYtPm1jX3FydiA9IG1saDItPnFydjsKKwkJaWYgKGdyb3VwX3R5cGUgPT0gSVBWNl9BRERSX0FOWSkgeyAvKiBnZW5lcmFsIHF1ZXJ5ICovCisJCQlpZiAobWxoMi0+bnNyY3MpIHsKKwkJCQlpbjZfZGV2X3B1dChpZGV2KTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsgLyogbm8gc291cmNlcyBhbGxvd2VkICovCisJCQl9CisJCQltbGRfZ3Ffc3RhcnRfdGltZXIoaWRldik7CisJCQlpbjZfZGV2X3B1dChpZGV2KTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qIG1hcmsgc291cmNlcyB0byBpbmNsdWRlLCBpZiBncm91cCAmIHNvdXJjZS1zcGVjaWZpYyAqLworCQltYXJrID0gbWxoMi0+bnNyY3MgIT0gMDsKKwl9IGVsc2UgeworCQlpbjZfZGV2X3B1dChpZGV2KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVhZF9sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwlpZiAoZ3JvdXBfdHlwZSA9PSBJUFY2X0FERFJfQU5ZKSB7CisJCWZvciAobWEgPSBpZGV2LT5tY19saXN0OyBtYTsgbWE9bWEtPm5leHQpIHsKKwkJCXNwaW5fbG9ja19iaCgmbWEtPm1jYV9sb2NrKTsKKwkJCWlnbXA2X2dyb3VwX3F1ZXJpZWQobWEsIG1heF9kZWxheSk7CisJCQlzcGluX3VubG9ja19iaCgmbWEtPm1jYV9sb2NrKTsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAobWEgPSBpZGV2LT5tY19saXN0OyBtYTsgbWE9bWEtPm5leHQpIHsKKwkJCWlmIChncm91cF90eXBlICE9IElQVjZfQUREUl9BTlkgJiYKKwkJCSAgICAhaXB2Nl9hZGRyX2VxdWFsKGdyb3VwLCAmbWEtPm1jYV9hZGRyKSkKKwkJCQljb250aW51ZTsKKwkJCXNwaW5fbG9ja19iaCgmbWEtPm1jYV9sb2NrKTsKKwkJCWlmIChtYS0+bWNhX2ZsYWdzICYgTUFGX1RJTUVSX1JVTk5JTkcpIHsKKwkJCQkvKiBnc3F1ZXJ5IDwtIGdzcXVlcnkgJiYgbWFyayAqLworCQkJCWlmICghbWFyaykKKwkJCQkJbWEtPm1jYV9mbGFncyAmPSB+TUFGX0dTUVVFUlk7CisJCQl9IGVsc2UgeworCQkJCS8qIGdzcXVlcnkgPC0gbWFyayAqLworCQkJCWlmIChtYXJrKQorCQkJCQltYS0+bWNhX2ZsYWdzIHw9IE1BRl9HU1FVRVJZOworCQkJCWVsc2UKKwkJCQkJbWEtPm1jYV9mbGFncyAmPSB+TUFGX0dTUVVFUlk7CisJCQl9CisJCQlpZiAobWEtPm1jYV9mbGFncyAmIE1BRl9HU1FVRVJZKQorCQkJCW1sZF9tYXJrc291cmNlcyhtYSwgbnRvaHMobWxoMi0+bnNyY3MpLAorCQkJCQltbGgyLT5zcmNzKTsKKwkJCWlnbXA2X2dyb3VwX3F1ZXJpZWQobWEsIG1heF9kZWxheSk7CisJCQlzcGluX3VubG9ja19iaCgmbWEtPm1jYV9sb2NrKTsKKwkJCWlmIChncm91cF90eXBlICE9IElQVjZfQUREUl9BTlkpCisJCQkJYnJlYWs7CisJCX0KKwl9CisJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOworCWluNl9kZXZfcHV0KGlkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKworaW50IGlnbXA2X2V2ZW50X3JlcG9ydChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpZm1jYWRkcjYgKm1hOworCXN0cnVjdCBpbjZfYWRkciAqYWRkcnA7CisJc3RydWN0IGluZXQ2X2RldiAqaWRldjsKKwlzdHJ1Y3QgaWNtcDZoZHIgKmhkcjsKKwlpbnQgYWRkcl90eXBlOworCisJLyogT3VyIG93biByZXBvcnQgbG9vcGVkIGJhY2suIElnbm9yZSBpdC4gKi8KKwlpZiAoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfTE9PUEJBQ0spCisJCXJldHVybiAwOworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWhkciA9IChzdHJ1Y3QgaWNtcDZoZHIqKSBza2ItPmgucmF3OworCisJLyogRHJvcCByZXBvcnRzIHdpdGggbm90IGxpbmsgbG9jYWwgc291cmNlICovCisJYWRkcl90eXBlID0gaXB2Nl9hZGRyX3R5cGUoJnNrYi0+bmguaXB2NmgtPnNhZGRyKTsKKwlpZiAoYWRkcl90eXBlICE9IElQVjZfQUREUl9BTlkgJiYgCisJICAgICEoYWRkcl90eXBlJklQVjZfQUREUl9MSU5LTE9DQUwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFkZHJwID0gKHN0cnVjdCBpbjZfYWRkciAqKSAoaGRyICsgMSk7CisKKwlpZGV2ID0gaW42X2Rldl9nZXQoc2tiLT5kZXYpOworCWlmIChpZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJLyoKKwkgKglDYW5jZWwgdGhlIHRpbWVyIGZvciB0aGlzIGdyb3VwCisJICovCisKKwlyZWFkX2xvY2tfYmgoJmlkZXYtPmxvY2spOworCWZvciAobWEgPSBpZGV2LT5tY19saXN0OyBtYTsgbWE9bWEtPm5leHQpIHsKKwkJaWYgKGlwdjZfYWRkcl9lcXVhbCgmbWEtPm1jYV9hZGRyLCBhZGRycCkpIHsKKwkJCXNwaW5fbG9jaygmbWEtPm1jYV9sb2NrKTsKKwkJCWlmIChkZWxfdGltZXIoJm1hLT5tY2FfdGltZXIpKQorCQkJCWF0b21pY19kZWMoJm1hLT5tY2FfcmVmY250KTsKKwkJCW1hLT5tY2FfZmxhZ3MgJj0gfihNQUZfTEFTVF9SRVBPUlRFUnxNQUZfVElNRVJfUlVOTklORyk7CisJCQlzcGluX3VubG9jaygmbWEtPm1jYV9sb2NrKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJlYWRfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwlpbjZfZGV2X3B1dChpZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc19pbihzdHJ1Y3QgaWZtY2FkZHI2ICpwbWMsIHN0cnVjdCBpcDZfc2ZfbGlzdCAqcHNmLCBpbnQgdHlwZSwKKwlpbnQgZ2RlbGV0ZWQsIGludCBzZGVsZXRlZCkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIE1MRDJfTU9ERV9JU19JTkNMVURFOgorCWNhc2UgTUxEMl9NT0RFX0lTX0VYQ0xVREU6CisJCWlmIChnZGVsZXRlZCB8fCBzZGVsZXRlZCkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gISgocG1jLT5tY2FfZmxhZ3MgJiBNQUZfR1NRVUVSWSkgJiYgIXBzZi0+c2ZfZ3NyZXNwKTsKKwljYXNlIE1MRDJfQ0hBTkdFX1RPX0lOQ0xVREU6CisJCWlmIChnZGVsZXRlZCB8fCBzZGVsZXRlZCkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gcHNmLT5zZl9jb3VudFtNQ0FTVF9JTkNMVURFXSAhPSAwOworCWNhc2UgTUxEMl9DSEFOR0VfVE9fRVhDTFVERToKKwkJaWYgKGdkZWxldGVkIHx8IHNkZWxldGVkKQorCQkJcmV0dXJuIDA7CisJCWlmIChwbWMtPm1jYV9zZmNvdW50W01DQVNUX0VYQ0xVREVdID09IDAgfHwKKwkJICAgIHBzZi0+c2ZfY291bnRbTUNBU1RfSU5DTFVERV0pCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIHBtYy0+bWNhX3NmY291bnRbTUNBU1RfRVhDTFVERV0gPT0KKwkJCXBzZi0+c2ZfY291bnRbTUNBU1RfRVhDTFVERV07CisJY2FzZSBNTEQyX0FMTE9XX05FV19TT1VSQ0VTOgorCQlpZiAoZ2RlbGV0ZWQgfHwgIXBzZi0+c2ZfY3Jjb3VudCkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gKHBtYy0+bWNhX3NmbW9kZSA9PSBNQ0FTVF9JTkNMVURFKSBeIHNkZWxldGVkOworCWNhc2UgTUxEMl9CTE9DS19PTERfU09VUkNFUzoKKwkJaWYgKHBtYy0+bWNhX3NmbW9kZSA9PSBNQ0FTVF9JTkNMVURFKQorCQkJcmV0dXJuIGdkZWxldGVkIHx8IChwc2YtPnNmX2NyY291bnQgJiYgc2RlbGV0ZWQpOworCQlyZXR1cm4gcHNmLT5zZl9jcmNvdW50ICYmICFnZGVsZXRlZCAmJiAhc2RlbGV0ZWQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CittbGRfc2NvdW50KHN0cnVjdCBpZm1jYWRkcjYgKnBtYywgaW50IHR5cGUsIGludCBnZGVsZXRlZCwgaW50IHNkZWxldGVkKQoreworCXN0cnVjdCBpcDZfc2ZfbGlzdCAqcHNmOworCWludCBzY291bnQgPSAwOworCisJZm9yIChwc2Y9cG1jLT5tY2Ffc291cmNlczsgcHNmOyBwc2Y9cHNmLT5zZl9uZXh0KSB7CisJCWlmICghaXNfaW4ocG1jLCBwc2YsIHR5cGUsIGdkZWxldGVkLCBzZGVsZXRlZCkpCisJCQljb250aW51ZTsKKwkJc2NvdW50Kys7CisJfQorCXJldHVybiBzY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqbWxkX25ld3BhY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNpemUpCit7CisJc3RydWN0IHNvY2sgKnNrID0gaWdtcDZfc29ja2V0LT5zazsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBtbGQyX3JlcG9ydCAqcG1yOworCXN0cnVjdCBpbjZfYWRkciBhZGRyX2J1ZjsKKwlpbnQgZXJyOworCXU4IHJhWzhdID0geyBJUFBST1RPX0lDTVBWNiwgMCwKKwkJICAgICBJUFY2X1RMVl9ST1VURVJBTEVSVCwgMiwgMCwgMCwKKwkJICAgICBJUFY2X1RMVl9QQUROLCAwIH07CisKKwkvKiB3ZSBhc3N1bWUgc2l6ZSA+IHNpemVvZihyYSkgaGVyZSAqLworCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssIHNpemUgKyBMTF9SRVNFUlZFRF9TUEFDRShkZXYpLCAxLCAmZXJyKTsKKworCWlmIChza2IgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlza2JfcmVzZXJ2ZShza2IsIExMX1JFU0VSVkVEX1NQQUNFKGRldikpOworCWlmIChkZXYtPmhhcmRfaGVhZGVyKSB7CisJCXVuc2lnbmVkIGNoYXIgaGFbTUFYX0FERFJfTEVOXTsKKworCQluZGlzY19tY19tYXAoJm1sZDJfYWxsX21jciwgaGEsIGRldiwgMSk7CisJCWlmIChkZXYtPmhhcmRfaGVhZGVyKHNrYiwgZGV2LCBFVEhfUF9JUFY2LGhhLE5VTEwsc2l6ZSkgPCAwKSB7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJaWYgKGlwdjZfZ2V0X2xsYWRkcihkZXYsICZhZGRyX2J1ZikpIHsKKwkJLyogPGRyYWZ0LWlldGYtbWFnbWEtbWxkLXNvdXJjZS0wNS50eHQ+OgorCQkgKiB1c2UgdW5zcGVjaWZpZWQgYWRkcmVzcyBhcyB0aGUgc291cmNlIGFkZHJlc3MgCisJCSAqIHdoZW4gYSB2YWxpZCBsaW5rLWxvY2FsIGFkZHJlc3MgaXMgbm90IGF2YWlsYWJsZS4KKwkJICovCisJCW1lbXNldCgmYWRkcl9idWYsIDAsIHNpemVvZihhZGRyX2J1ZikpOworCX0KKworCWlwNl9uZF9oZHIoc2ssIHNrYiwgZGV2LCAmYWRkcl9idWYsICZtbGQyX2FsbF9tY3IsIE5FWFRIRFJfSE9QLCAwKTsKKworCW1lbWNweShza2JfcHV0KHNrYiwgc2l6ZW9mKHJhKSksIHJhLCBzaXplb2YocmEpKTsKKworCXBtciA9KHN0cnVjdCBtbGQyX3JlcG9ydCAqKXNrYl9wdXQoc2tiLCBzaXplb2YoKnBtcikpOworCXNrYi0+aC5yYXcgPSAodW5zaWduZWQgY2hhciAqKXBtcjsKKwlwbXItPnR5cGUgPSBJQ01QVjZfTUxEMl9SRVBPUlQ7CisJcG1yLT5yZXN2MSA9IDA7CisJcG1yLT5jc3VtID0gMDsKKwlwbXItPnJlc3YyID0gMDsKKwlwbXItPm5ncmVjID0gMDsKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgdm9pZCBtbGRfc2VuZHBhY2soc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXB2NmhkciAqcGlwNiA9IHNrYi0+bmguaXB2Nmg7CisJc3RydWN0IG1sZDJfcmVwb3J0ICpwbXIgPSAoc3RydWN0IG1sZDJfcmVwb3J0ICopc2tiLT5oLnJhdzsKKwlpbnQgcGF5bG9hZF9sZW4sIG1sZGxlbjsKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gaW42X2Rldl9nZXQoc2tiLT5kZXYpOworCWludCBlcnI7CisKKwlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsKKwlwYXlsb2FkX2xlbiA9IHNrYi0+dGFpbCAtICh1bnNpZ25lZCBjaGFyICopc2tiLT5uaC5pcHY2aCAtCisJCXNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisJbWxkbGVuID0gc2tiLT50YWlsIC0gc2tiLT5oLnJhdzsKKwlwaXA2LT5wYXlsb2FkX2xlbiA9IGh0b25zKHBheWxvYWRfbGVuKTsKKworCXBtci0+Y3N1bSA9IGNzdW1faXB2Nl9tYWdpYygmcGlwNi0+c2FkZHIsICZwaXA2LT5kYWRkciwgbWxkbGVuLAorCQlJUFBST1RPX0lDTVBWNiwgY3N1bV9wYXJ0aWFsKHNrYi0+aC5yYXcsIG1sZGxlbiwgMCkpOworCWVyciA9IE5GX0hPT0soUEZfSU5FVDYsIE5GX0lQNl9MT0NBTF9PVVQsIHNrYiwgTlVMTCwgc2tiLT5kZXYsCisJCWRldl9xdWV1ZV94bWl0KTsKKwlpZiAoIWVycikgeworCQlJQ01QNl9JTkNfU1RBVFMoaWRldixJQ01QNl9NSUJfT1VUTVNHUyk7CisJCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfT1VUTUNBU1RQS1RTKTsKKwl9IGVsc2UKKwkJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CisKKwlpZiAobGlrZWx5KGlkZXYgIT0gTlVMTCkpCisJCWluNl9kZXZfcHV0KGlkZXYpOworfQorCitzdGF0aWMgaW50IGdyZWNfc2l6ZShzdHJ1Y3QgaWZtY2FkZHI2ICpwbWMsIGludCB0eXBlLCBpbnQgZ2RlbCwgaW50IHNkZWwpCit7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgbWxkMl9ncmVjKSArIDQqbWxkX3Njb3VudChwbWMsdHlwZSxnZGVsLHNkZWwpOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmFkZF9ncmhlYWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlmbWNhZGRyNiAqcG1jLAorCWludCB0eXBlLCBzdHJ1Y3QgbWxkMl9ncmVjICoqcHBncikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG1jLT5pZGV2LT5kZXY7CisJc3RydWN0IG1sZDJfcmVwb3J0ICpwbXI7CisJc3RydWN0IG1sZDJfZ3JlYyAqcGdyOworCisJaWYgKCFza2IpCisJCXNrYiA9IG1sZF9uZXdwYWNrKGRldiwgZGV2LT5tdHUpOworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKwlwZ3IgPSAoc3RydWN0IG1sZDJfZ3JlYyAqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IG1sZDJfZ3JlYykpOworCXBnci0+Z3JlY190eXBlID0gdHlwZTsKKwlwZ3ItPmdyZWNfYXV4d29yZHMgPSAwOworCXBnci0+Z3JlY19uc3JjcyA9IDA7CisJcGdyLT5ncmVjX21jYSA9IHBtYy0+bWNhX2FkZHI7CS8qIHN0cnVjdHVyZSBjb3B5ICovCisJcG1yID0gKHN0cnVjdCBtbGQyX3JlcG9ydCAqKXNrYi0+aC5yYXc7CisJcG1yLT5uZ3JlYyA9IGh0b25zKG50b2hzKHBtci0+bmdyZWMpKzEpOworCSpwcGdyID0gcGdyOworCXJldHVybiBza2I7Cit9CisKKyNkZWZpbmUgQVZBSUxBQkxFKHNrYikgKChza2IpID8gKChza2IpLT5kZXYgPyAoc2tiKS0+ZGV2LT5tdHUgLSAoc2tiKS0+bGVuIDogXAorCXNrYl90YWlscm9vbShza2IpKSA6IDApCisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqYWRkX2dyZWMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlmbWNhZGRyNiAqcG1jLAorCWludCB0eXBlLCBpbnQgZ2RlbGV0ZWQsIGludCBzZGVsZXRlZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG1jLT5pZGV2LT5kZXY7CisJc3RydWN0IG1sZDJfcmVwb3J0ICpwbXI7CisJc3RydWN0IG1sZDJfZ3JlYyAqcGdyID0gTlVMTDsKKwlzdHJ1Y3QgaXA2X3NmX2xpc3QgKnBzZiwgKnBzZl9uZXh0LCAqcHNmX3ByZXYsICoqcHNmX2xpc3Q7CisJaW50IHNjb3VudCwgZmlyc3QsIGlzcXVlcnksIHRydW5jYXRlOworCisJaWYgKHBtYy0+bWNhX2ZsYWdzICYgTUFGX05PUkVQT1JUKQorCQlyZXR1cm4gc2tiOworCisJaXNxdWVyeSA9IHR5cGUgPT0gTUxEMl9NT0RFX0lTX0lOQ0xVREUgfHwKKwkJICB0eXBlID09IE1MRDJfTU9ERV9JU19FWENMVURFOworCXRydW5jYXRlID0gdHlwZSA9PSBNTEQyX01PREVfSVNfRVhDTFVERSB8fAorCQkgICAgdHlwZSA9PSBNTEQyX0NIQU5HRV9UT19FWENMVURFOworCisJcHNmX2xpc3QgPSBzZGVsZXRlZCA/ICZwbWMtPm1jYV90b21iIDogJnBtYy0+bWNhX3NvdXJjZXM7CisKKwlpZiAoISpwc2ZfbGlzdCkgeworCQlpZiAodHlwZSA9PSBNTEQyX0FMTE9XX05FV19TT1VSQ0VTIHx8CisJCSAgICB0eXBlID09IE1MRDJfQkxPQ0tfT0xEX1NPVVJDRVMpCisJCQlyZXR1cm4gc2tiOworCQlpZiAocG1jLT5tY2FfY3Jjb3VudCB8fCBpc3F1ZXJ5KSB7CisJCQkvKiBtYWtlIHN1cmUgd2UgaGF2ZSByb29tIGZvciBncm91cCBoZWFkZXIgYW5kIGF0CisJCQkgKiBsZWFzdCBvbmUgc291cmNlLgorCQkJICovCisJCQlpZiAoc2tiICYmIEFWQUlMQUJMRShza2IpIDwgc2l6ZW9mKHN0cnVjdCBtbGQyX2dyZWMpKworCQkJICAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKSB7CisJCQkJbWxkX3NlbmRwYWNrKHNrYik7CisJCQkJc2tiID0gTlVMTDsgLyogYWRkX2dyaGVhZCB3aWxsIGdldCBhIG5ldyBvbmUgKi8KKwkJCX0KKwkJCXNrYiA9IGFkZF9ncmhlYWQoc2tiLCBwbWMsIHR5cGUsICZwZ3IpOworCQl9CisJCXJldHVybiBza2I7CisJfQorCXBtciA9IHNrYiA/IChzdHJ1Y3QgbWxkMl9yZXBvcnQgKilza2ItPmgucmF3IDogTlVMTDsKKworCS8qIEVYIGFuZCBUT19FWCBnZXQgYSBmcmVzaCBwYWNrZXQsIGlmIG5lZWRlZCAqLworCWlmICh0cnVuY2F0ZSkgeworCQlpZiAocG1yICYmIHBtci0+bmdyZWMgJiYKKwkJICAgIEFWQUlMQUJMRShza2IpIDwgZ3JlY19zaXplKHBtYywgdHlwZSwgZ2RlbGV0ZWQsIHNkZWxldGVkKSkgeworCQkJaWYgKHNrYikKKwkJCQltbGRfc2VuZHBhY2soc2tiKTsKKwkJCXNrYiA9IG1sZF9uZXdwYWNrKGRldiwgZGV2LT5tdHUpOworCQl9CisJfQorCWZpcnN0ID0gMTsKKwlzY291bnQgPSAwOworCXBzZl9wcmV2ID0gTlVMTDsKKwlmb3IgKHBzZj0qcHNmX2xpc3Q7IHBzZjsgcHNmPXBzZl9uZXh0KSB7CisJCXN0cnVjdCBpbjZfYWRkciAqcHNyYzsKKworCQlwc2ZfbmV4dCA9IHBzZi0+c2ZfbmV4dDsKKworCQlpZiAoIWlzX2luKHBtYywgcHNmLCB0eXBlLCBnZGVsZXRlZCwgc2RlbGV0ZWQpKSB7CisJCQlwc2ZfcHJldiA9IHBzZjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogY2xlYXIgbWFya3Mgb24gcXVlcnkgcmVzcG9uc2VzICovCisJCWlmIChpc3F1ZXJ5KQorCQkJcHNmLT5zZl9nc3Jlc3AgPSAwOworCisJCWlmIChBVkFJTEFCTEUoc2tiKSA8IHNpemVvZigqcHNyYykgKworCQkgICAgZmlyc3Qqc2l6ZW9mKHN0cnVjdCBtbGQyX2dyZWMpKSB7CisJCQlpZiAodHJ1bmNhdGUgJiYgIWZpcnN0KQorCQkJCWJyZWFrOwkgLyogdHJ1bmNhdGUgdGhlc2UgKi8KKwkJCWlmIChwZ3IpCisJCQkJcGdyLT5ncmVjX25zcmNzID0gaHRvbnMoc2NvdW50KTsKKwkJCWlmIChza2IpCisJCQkJbWxkX3NlbmRwYWNrKHNrYik7CisJCQlza2IgPSBtbGRfbmV3cGFjayhkZXYsIGRldi0+bXR1KTsKKwkJCWZpcnN0ID0gMTsKKwkJCXNjb3VudCA9IDA7CisJCX0KKwkJaWYgKGZpcnN0KSB7CisJCQlza2IgPSBhZGRfZ3JoZWFkKHNrYiwgcG1jLCB0eXBlLCAmcGdyKTsKKwkJCWZpcnN0ID0gMDsKKwkJfQorCQlwc3JjID0gKHN0cnVjdCBpbjZfYWRkciAqKXNrYl9wdXQoc2tiLCBzaXplb2YoKnBzcmMpKTsKKwkJKnBzcmMgPSBwc2YtPnNmX2FkZHI7CisJCXNjb3VudCsrOworCQlpZiAoKHR5cGUgPT0gTUxEMl9BTExPV19ORVdfU09VUkNFUyB8fAorCQkgICAgIHR5cGUgPT0gTUxEMl9CTE9DS19PTERfU09VUkNFUykgJiYgcHNmLT5zZl9jcmNvdW50KSB7CisJCQlwc2YtPnNmX2NyY291bnQtLTsKKwkJCWlmICgoc2RlbGV0ZWQgfHwgZ2RlbGV0ZWQpICYmIHBzZi0+c2ZfY3Jjb3VudCA9PSAwKSB7CisJCQkJaWYgKHBzZl9wcmV2KQorCQkJCQlwc2ZfcHJldi0+c2ZfbmV4dCA9IHBzZi0+c2ZfbmV4dDsKKwkJCQllbHNlCisJCQkJCSpwc2ZfbGlzdCA9IHBzZi0+c2ZfbmV4dDsKKwkJCQlrZnJlZShwc2YpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCXBzZl9wcmV2ID0gcHNmOworCX0KKwlpZiAocGdyKQorCQlwZ3ItPmdyZWNfbnNyY3MgPSBodG9ucyhzY291bnQpOworCisJaWYgKGlzcXVlcnkpCisJCXBtYy0+bWNhX2ZsYWdzICY9IH5NQUZfR1NRVUVSWTsJLyogY2xlYXIgcXVlcnkgc3RhdGUgKi8KKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgdm9pZCBtbGRfc2VuZF9yZXBvcnQoc3RydWN0IGluZXQ2X2RldiAqaWRldiwgc3RydWN0IGlmbWNhZGRyNiAqcG1jKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCWludCB0eXBlOworCisJaWYgKCFwbWMpIHsKKwkJcmVhZF9sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwkJZm9yIChwbWM9aWRldi0+bWNfbGlzdDsgcG1jOyBwbWM9cG1jLT5uZXh0KSB7CisJCQlpZiAocG1jLT5tY2FfZmxhZ3MgJiBNQUZfTk9SRVBPUlQpCisJCQkJY29udGludWU7CisJCQlzcGluX2xvY2tfYmgoJnBtYy0+bWNhX2xvY2spOworCQkJaWYgKHBtYy0+bWNhX3NmY291bnRbTUNBU1RfRVhDTFVERV0pCisJCQkJdHlwZSA9IE1MRDJfTU9ERV9JU19FWENMVURFOworCQkJZWxzZQorCQkJCXR5cGUgPSBNTEQyX01PREVfSVNfSU5DTFVERTsKKwkJCXNrYiA9IGFkZF9ncmVjKHNrYiwgcG1jLCB0eXBlLCAwLCAwKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZwbWMtPm1jYV9sb2NrKTsKKwkJfQorCQlyZWFkX3VubG9ja19iaCgmaWRldi0+bG9jayk7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrX2JoKCZwbWMtPm1jYV9sb2NrKTsKKwkJaWYgKHBtYy0+bWNhX3NmY291bnRbTUNBU1RfRVhDTFVERV0pCisJCQl0eXBlID0gTUxEMl9NT0RFX0lTX0VYQ0xVREU7CisJCWVsc2UKKwkJCXR5cGUgPSBNTEQyX01PREVfSVNfSU5DTFVERTsKKwkJc2tiID0gYWRkX2dyZWMoc2tiLCBwbWMsIHR5cGUsIDAsIDApOworCQlzcGluX3VubG9ja19iaCgmcG1jLT5tY2FfbG9jayk7CisJfQorCWlmIChza2IpCisJCW1sZF9zZW5kcGFjayhza2IpOworfQorCisvKgorICogcmVtb3ZlIHplcm8tY291bnQgc291cmNlIHJlY29yZHMgZnJvbSBhIHNvdXJjZSBmaWx0ZXIgbGlzdAorICovCitzdGF0aWMgdm9pZCBtbGRfY2xlYXJfemVyb3Moc3RydWN0IGlwNl9zZl9saXN0ICoqcHBzZikKK3sKKwlzdHJ1Y3QgaXA2X3NmX2xpc3QgKnBzZl9wcmV2LCAqcHNmX25leHQsICpwc2Y7CisKKwlwc2ZfcHJldiA9IE5VTEw7CisJZm9yIChwc2Y9KnBwc2Y7IHBzZjsgcHNmID0gcHNmX25leHQpIHsKKwkJcHNmX25leHQgPSBwc2YtPnNmX25leHQ7CisJCWlmIChwc2YtPnNmX2NyY291bnQgPT0gMCkgeworCQkJaWYgKHBzZl9wcmV2KQorCQkJCXBzZl9wcmV2LT5zZl9uZXh0ID0gcHNmLT5zZl9uZXh0OworCQkJZWxzZQorCQkJCSpwcHNmID0gcHNmLT5zZl9uZXh0OworCQkJa2ZyZWUocHNmKTsKKwkJfSBlbHNlCisJCQlwc2ZfcHJldiA9IHBzZjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1sZF9zZW5kX2NyKHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpCit7CisJc3RydWN0IGlmbWNhZGRyNiAqcG1jLCAqcG1jX3ByZXYsICpwbWNfbmV4dDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlpbnQgdHlwZSwgZHR5cGU7CisKKwlyZWFkX2xvY2tfYmgoJmlkZXYtPmxvY2spOworCXdyaXRlX2xvY2tfYmgoJmlkZXYtPm1jX2xvY2spOworCisJLyogZGVsZXRlZCBNQ0EncyAqLworCXBtY19wcmV2ID0gTlVMTDsKKwlmb3IgKHBtYz1pZGV2LT5tY190b21iOyBwbWM7IHBtYz1wbWNfbmV4dCkgeworCQlwbWNfbmV4dCA9IHBtYy0+bmV4dDsKKwkJaWYgKHBtYy0+bWNhX3NmbW9kZSA9PSBNQ0FTVF9JTkNMVURFKSB7CisJCQl0eXBlID0gTUxEMl9CTE9DS19PTERfU09VUkNFUzsKKwkJCWR0eXBlID0gTUxEMl9CTE9DS19PTERfU09VUkNFUzsKKwkJCXNrYiA9IGFkZF9ncmVjKHNrYiwgcG1jLCB0eXBlLCAxLCAwKTsKKwkJCXNrYiA9IGFkZF9ncmVjKHNrYiwgcG1jLCBkdHlwZSwgMSwgMSk7CisJCX0KKwkJaWYgKHBtYy0+bWNhX2NyY291bnQpIHsKKwkJCXBtYy0+bWNhX2NyY291bnQtLTsKKwkJCWlmIChwbWMtPm1jYV9zZm1vZGUgPT0gTUNBU1RfRVhDTFVERSkgeworCQkJCXR5cGUgPSBNTEQyX0NIQU5HRV9UT19JTkNMVURFOworCQkJCXNrYiA9IGFkZF9ncmVjKHNrYiwgcG1jLCB0eXBlLCAxLCAwKTsKKwkJCX0KKwkJCWlmIChwbWMtPm1jYV9jcmNvdW50ID09IDApIHsKKwkJCQltbGRfY2xlYXJfemVyb3MoJnBtYy0+bWNhX3RvbWIpOworCQkJCW1sZF9jbGVhcl96ZXJvcygmcG1jLT5tY2Ffc291cmNlcyk7CisJCQl9CisJCX0KKwkJaWYgKHBtYy0+bWNhX2NyY291bnQgPT0gMCAmJiAhcG1jLT5tY2FfdG9tYiAmJgorCQkgICAgIXBtYy0+bWNhX3NvdXJjZXMpIHsKKwkJCWlmIChwbWNfcHJldikKKwkJCQlwbWNfcHJldi0+bmV4dCA9IHBtY19uZXh0OworCQkJZWxzZQorCQkJCWlkZXYtPm1jX3RvbWIgPSBwbWNfbmV4dDsKKwkJCWluNl9kZXZfcHV0KHBtYy0+aWRldik7CisJCQlrZnJlZShwbWMpOworCQl9IGVsc2UKKwkJCXBtY19wcmV2ID0gcG1jOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJmlkZXYtPm1jX2xvY2spOworCisJLyogY2hhbmdlIHJlY3MgKi8KKwlmb3IgKHBtYz1pZGV2LT5tY19saXN0OyBwbWM7IHBtYz1wbWMtPm5leHQpIHsKKwkJc3Bpbl9sb2NrX2JoKCZwbWMtPm1jYV9sb2NrKTsKKwkJaWYgKHBtYy0+bWNhX3NmY291bnRbTUNBU1RfRVhDTFVERV0pIHsKKwkJCXR5cGUgPSBNTEQyX0JMT0NLX09MRF9TT1VSQ0VTOworCQkJZHR5cGUgPSBNTEQyX0FMTE9XX05FV19TT1VSQ0VTOworCQl9IGVsc2UgeworCQkJdHlwZSA9IE1MRDJfQUxMT1dfTkVXX1NPVVJDRVM7CisJCQlkdHlwZSA9IE1MRDJfQkxPQ0tfT0xEX1NPVVJDRVM7CisJCX0KKwkJc2tiID0gYWRkX2dyZWMoc2tiLCBwbWMsIHR5cGUsIDAsIDApOworCQlza2IgPSBhZGRfZ3JlYyhza2IsIHBtYywgZHR5cGUsIDAsIDEpOwkvKiBkZWxldGVkIHNvdXJjZXMgKi8KKworCQkvKiBmaWx0ZXIgbW9kZSBjaGFuZ2VzICovCisJCWlmIChwbWMtPm1jYV9jcmNvdW50KSB7CisJCQlwbWMtPm1jYV9jcmNvdW50LS07CisJCQlpZiAocG1jLT5tY2Ffc2Ztb2RlID09IE1DQVNUX0VYQ0xVREUpCisJCQkJdHlwZSA9IE1MRDJfQ0hBTkdFX1RPX0VYQ0xVREU7CisJCQllbHNlCisJCQkJdHlwZSA9IE1MRDJfQ0hBTkdFX1RPX0lOQ0xVREU7CisJCQlza2IgPSBhZGRfZ3JlYyhza2IsIHBtYywgdHlwZSwgMCwgMCk7CisJCX0KKwkJc3Bpbl91bmxvY2tfYmgoJnBtYy0+bWNhX2xvY2spOworCX0KKwlyZWFkX3VubG9ja19iaCgmaWRldi0+bG9jayk7CisJaWYgKCFza2IpCisJCXJldHVybjsKKwkodm9pZCkgbWxkX3NlbmRwYWNrKHNrYik7Cit9CisKK3N0YXRpYyB2b2lkIGlnbXA2X3NlbmQoc3RydWN0IGluNl9hZGRyICphZGRyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBpZ21wNl9zb2NrZXQtPnNrOworCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CisgICAgICAgIHN0cnVjdCBza19idWZmICpza2I7CisgICAgICAgIHN0cnVjdCBpY21wNmhkciAqaGRyOworCXN0cnVjdCBpbjZfYWRkciAqc25kX2FkZHI7CisJc3RydWN0IGluNl9hZGRyICphZGRycDsKKwlzdHJ1Y3QgaW42X2FkZHIgYWRkcl9idWY7CisJc3RydWN0IGluNl9hZGRyIGFsbF9yb3V0ZXJzOworCWludCBlcnIsIGxlbiwgcGF5bG9hZF9sZW4sIGZ1bGxfbGVuOworCXU4IHJhWzhdID0geyBJUFBST1RPX0lDTVBWNiwgMCwKKwkJICAgICBJUFY2X1RMVl9ST1VURVJBTEVSVCwgMiwgMCwgMCwKKwkJICAgICBJUFY2X1RMVl9QQUROLCAwIH07CisKKwlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsKKwlzbmRfYWRkciA9IGFkZHI7CisJaWYgKHR5cGUgPT0gSUNNUFY2X01HTV9SRURVQ1RJT04pIHsKKwkJc25kX2FkZHIgPSAmYWxsX3JvdXRlcnM7CisJCWlwdjZfYWRkcl9hbGxfcm91dGVycygmYWxsX3JvdXRlcnMpOworCX0KKworCWxlbiA9IHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpICsgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7CisJcGF5bG9hZF9sZW4gPSBsZW4gKyBzaXplb2YocmEpOworCWZ1bGxfbGVuID0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArIHBheWxvYWRfbGVuOworCisJc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSArIGZ1bGxfbGVuLCAxLCAmZXJyKTsKKworCWlmIChza2IgPT0gTlVMTCkgeworCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKKwkJcmV0dXJuOworCX0KKworCXNrYl9yZXNlcnZlKHNrYiwgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSk7CisJaWYgKGRldi0+aGFyZF9oZWFkZXIpIHsKKwkJdW5zaWduZWQgY2hhciBoYVtNQVhfQUREUl9MRU5dOworCQluZGlzY19tY19tYXAoc25kX2FkZHIsIGhhLCBkZXYsIDEpOworCQlpZiAoZGV2LT5oYXJkX2hlYWRlcihza2IsIGRldiwgRVRIX1BfSVBWNiwgaGEsIE5VTEwsIGZ1bGxfbGVuKSA8IDApCisJCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoaXB2Nl9nZXRfbGxhZGRyKGRldiwgJmFkZHJfYnVmKSkgeworCQkvKiA8ZHJhZnQtaWV0Zi1tYWdtYS1tbGQtc291cmNlLTA1LnR4dD46CisJCSAqIHVzZSB1bnNwZWNpZmllZCBhZGRyZXNzIGFzIHRoZSBzb3VyY2UgYWRkcmVzcyAKKwkJICogd2hlbiBhIHZhbGlkIGxpbmstbG9jYWwgYWRkcmVzcyBpcyBub3QgYXZhaWxhYmxlLgorCQkgKi8KKwkJbWVtc2V0KCZhZGRyX2J1ZiwgMCwgc2l6ZW9mKGFkZHJfYnVmKSk7CisJfQorCisJaXA2X25kX2hkcihzaywgc2tiLCBkZXYsICZhZGRyX2J1Ziwgc25kX2FkZHIsIE5FWFRIRFJfSE9QLCBwYXlsb2FkX2xlbik7CisKKwltZW1jcHkoc2tiX3B1dChza2IsIHNpemVvZihyYSkpLCByYSwgc2l6ZW9mKHJhKSk7CisKKwloZHIgPSAoc3RydWN0IGljbXA2aGRyICopIHNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSk7CisJbWVtc2V0KGhkciwgMCwgc2l6ZW9mKHN0cnVjdCBpY21wNmhkcikpOworCWhkci0+aWNtcDZfdHlwZSA9IHR5cGU7CisKKwlhZGRycCA9IChzdHJ1Y3QgaW42X2FkZHIgKikgc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwlpcHY2X2FkZHJfY29weShhZGRycCwgYWRkcik7CisKKwloZHItPmljbXA2X2Nrc3VtID0gY3N1bV9pcHY2X21hZ2ljKCZhZGRyX2J1Ziwgc25kX2FkZHIsIGxlbiwKKwkJCQkJICAgSVBQUk9UT19JQ01QVjYsCisJCQkJCSAgIGNzdW1fcGFydGlhbCgoX191OCAqKSBoZHIsIGxlbiwgMCkpOworCisJaWRldiA9IGluNl9kZXZfZ2V0KHNrYi0+ZGV2KTsKKworCWVyciA9IE5GX0hPT0soUEZfSU5FVDYsIE5GX0lQNl9MT0NBTF9PVVQsIHNrYiwgTlVMTCwgc2tiLT5kZXYsCisJCWRldl9xdWV1ZV94bWl0KTsKKwlpZiAoIWVycikgeworCQlpZiAodHlwZSA9PSBJQ01QVjZfTUdNX1JFRFVDVElPTikKKwkJCUlDTVA2X0lOQ19TVEFUUyhpZGV2LCBJQ01QNl9NSUJfT1VUR1JPVVBNRU1CUkVEVUNUSU9OUyk7CisJCWVsc2UKKwkJCUlDTVA2X0lOQ19TVEFUUyhpZGV2LCBJQ01QNl9NSUJfT1VUR1JPVVBNRU1CUkVTUE9OU0VTKTsKKwkJSUNNUDZfSU5DX1NUQVRTKGlkZXYsIElDTVA2X01JQl9PVVRNU0dTKTsKKwkJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRNQ0FTVFBLVFMpOworCX0gZWxzZQorCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKKworCWlmIChsaWtlbHkoaWRldiAhPSBOVUxMKSkKKwkJaW42X2Rldl9wdXQoaWRldik7CisJcmV0dXJuOworCitvdXQ6CisJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CisJa2ZyZWVfc2tiKHNrYik7Cit9CisKK3N0YXRpYyBpbnQgaXA2X21jX2RlbDFfc3JjKHN0cnVjdCBpZm1jYWRkcjYgKnBtYywgaW50IHNmbW9kZSwKKwlzdHJ1Y3QgaW42X2FkZHIgKnBzZnNyYykKK3sKKwlzdHJ1Y3QgaXA2X3NmX2xpc3QgKnBzZiwgKnBzZl9wcmV2OworCWludCBydiA9IDA7CisKKwlwc2ZfcHJldiA9IE5VTEw7CisJZm9yIChwc2Y9cG1jLT5tY2Ffc291cmNlczsgcHNmOyBwc2Y9cHNmLT5zZl9uZXh0KSB7CisJCWlmIChpcHY2X2FkZHJfZXF1YWwoJnBzZi0+c2ZfYWRkciwgcHNmc3JjKSkKKwkJCWJyZWFrOworCQlwc2ZfcHJldiA9IHBzZjsKKwl9CisJaWYgKCFwc2YgfHwgcHNmLT5zZl9jb3VudFtzZm1vZGVdID09IDApIHsKKwkJLyogc291cmNlIGZpbHRlciBub3QgZm91bmQsIG9yIGNvdW50IHdyb25nID0+ICBidWcgKi8KKwkJcmV0dXJuIC1FU1JDSDsKKwl9CisJcHNmLT5zZl9jb3VudFtzZm1vZGVdLS07CisJaWYgKCFwc2YtPnNmX2NvdW50W01DQVNUX0lOQ0xVREVdICYmICFwc2YtPnNmX2NvdW50W01DQVNUX0VYQ0xVREVdKSB7CisJCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBwbWMtPmlkZXY7CisKKwkJLyogbm8gbW9yZSBmaWx0ZXJzIGZvciB0aGlzIHNvdXJjZSAqLworCQlpZiAocHNmX3ByZXYpCisJCQlwc2ZfcHJldi0+c2ZfbmV4dCA9IHBzZi0+c2ZfbmV4dDsKKwkJZWxzZQorCQkJcG1jLT5tY2Ffc291cmNlcyA9IHBzZi0+c2ZfbmV4dDsKKwkJaWYgKHBzZi0+c2Zfb2xkaW4gJiYgIShwbWMtPm1jYV9mbGFncyAmIE1BRl9OT1JFUE9SVCkgJiYKKwkJICAgICFNTERfVjFfU0VFTihpZGV2KSkgeworCQkJcHNmLT5zZl9jcmNvdW50ID0gaWRldi0+bWNfcXJ2OworCQkJcHNmLT5zZl9uZXh0ID0gcG1jLT5tY2FfdG9tYjsKKwkJCXBtYy0+bWNhX3RvbWIgPSBwc2Y7CisJCQlydiA9IDE7CisJCX0gZWxzZQorCQkJa2ZyZWUocHNmKTsKKwl9CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50IGlwNl9tY19kZWxfc3JjKHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYsIHN0cnVjdCBpbjZfYWRkciAqcG1jYSwKKwkJCSAgaW50IHNmbW9kZSwgaW50IHNmY291bnQsIHN0cnVjdCBpbjZfYWRkciAqcHNmc3JjLAorCQkJICBpbnQgZGVsdGEpCit7CisJc3RydWN0IGlmbWNhZGRyNiAqcG1jOworCWludAljaGFuZ2VyZWMgPSAwOworCWludAlpLCBlcnI7CisKKwlpZiAoIWlkZXYpCisJCXJldHVybiAtRU5PREVWOworCXJlYWRfbG9ja19iaCgmaWRldi0+bG9jayk7CisJZm9yIChwbWM9aWRldi0+bWNfbGlzdDsgcG1jOyBwbWM9cG1jLT5uZXh0KSB7CisJCWlmIChpcHY2X2FkZHJfZXF1YWwocG1jYSwgJnBtYy0+bWNhX2FkZHIpKQorCQkJYnJlYWs7CisJfQorCWlmICghcG1jKSB7CisJCS8qIE1DQSBub3QgZm91bmQ/PyBidWcgKi8KKwkJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOworCQlyZXR1cm4gLUVTUkNIOworCX0KKwlzcGluX2xvY2tfYmgoJnBtYy0+bWNhX2xvY2spOworCXNmX21hcmtzdGF0ZShwbWMpOworCWlmICghZGVsdGEpIHsKKwkJaWYgKCFwbWMtPm1jYV9zZmNvdW50W3NmbW9kZV0pIHsKKwkJCXNwaW5fdW5sb2NrX2JoKCZwbWMtPm1jYV9sb2NrKTsKKwkJCXJlYWRfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXBtYy0+bWNhX3NmY291bnRbc2Ztb2RlXS0tOworCX0KKwllcnIgPSAwOworCWZvciAoaT0wOyBpPHNmY291bnQ7IGkrKykgeworCQlpbnQgcnYgPSBpcDZfbWNfZGVsMV9zcmMocG1jLCBzZm1vZGUsICZwc2ZzcmNbaV0pOworCisJCWNoYW5nZXJlYyB8PSBydiA+IDA7CisJCWlmICghZXJyICYmIHJ2IDwgMCkKKwkJCWVyciA9IHJ2OworCX0KKwlpZiAocG1jLT5tY2Ffc2Ztb2RlID09IE1DQVNUX0VYQ0xVREUgJiYKKwkgICAgcG1jLT5tY2Ffc2Zjb3VudFtNQ0FTVF9FWENMVURFXSA9PSAwICYmCisJICAgIHBtYy0+bWNhX3NmY291bnRbTUNBU1RfSU5DTFVERV0pIHsKKwkJc3RydWN0IGlwNl9zZl9saXN0ICpwc2Y7CisKKwkJLyogZmlsdGVyIG1vZGUgY2hhbmdlICovCisJCXBtYy0+bWNhX3NmbW9kZSA9IE1DQVNUX0lOQ0xVREU7CisJCXBtYy0+bWNhX2NyY291bnQgPSBpZGV2LT5tY19xcnY7CisJCWlkZXYtPm1jX2lmY19jb3VudCA9IHBtYy0+bWNhX2NyY291bnQ7CisJCWZvciAocHNmPXBtYy0+bWNhX3NvdXJjZXM7IHBzZjsgcHNmID0gcHNmLT5zZl9uZXh0KQorCQkJcHNmLT5zZl9jcmNvdW50ID0gMDsKKwkJbWxkX2lmY19ldmVudChwbWMtPmlkZXYpOworCX0gZWxzZSBpZiAoc2Zfc2V0c3RhdGUocG1jKSB8fCBjaGFuZ2VyZWMpCisJCW1sZF9pZmNfZXZlbnQocG1jLT5pZGV2KTsKKwlzcGluX3VubG9ja19iaCgmcG1jLT5tY2FfbG9jayk7CisJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBBZGQgbXVsdGljYXN0IHNpbmdsZS1zb3VyY2UgZmlsdGVyIHRvIHRoZSBpbnRlcmZhY2UgbGlzdAorICovCitzdGF0aWMgaW50IGlwNl9tY19hZGQxX3NyYyhzdHJ1Y3QgaWZtY2FkZHI2ICpwbWMsIGludCBzZm1vZGUsCisJc3RydWN0IGluNl9hZGRyICpwc2ZzcmMsIGludCBkZWx0YSkKK3sKKwlzdHJ1Y3QgaXA2X3NmX2xpc3QgKnBzZiwgKnBzZl9wcmV2OworCisJcHNmX3ByZXYgPSBOVUxMOworCWZvciAocHNmPXBtYy0+bWNhX3NvdXJjZXM7IHBzZjsgcHNmPXBzZi0+c2ZfbmV4dCkgeworCQlpZiAoaXB2Nl9hZGRyX2VxdWFsKCZwc2YtPnNmX2FkZHIsIHBzZnNyYykpCisJCQlicmVhazsKKwkJcHNmX3ByZXYgPSBwc2Y7CisJfQorCWlmICghcHNmKSB7CisJCXBzZiA9IChzdHJ1Y3QgaXA2X3NmX2xpc3QgKilrbWFsbG9jKHNpemVvZigqcHNmKSwgR0ZQX0FUT01JQyk7CisJCWlmICghcHNmKQorCQkJcmV0dXJuIC1FTk9CVUZTOworCQltZW1zZXQocHNmLCAwLCBzaXplb2YoKnBzZikpOworCQlwc2YtPnNmX2FkZHIgPSAqcHNmc3JjOworCQlpZiAocHNmX3ByZXYpIHsKKwkJCXBzZl9wcmV2LT5zZl9uZXh0ID0gcHNmOworCQl9IGVsc2UKKwkJCXBtYy0+bWNhX3NvdXJjZXMgPSBwc2Y7CisJfQorCXBzZi0+c2ZfY291bnRbc2Ztb2RlXSsrOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZl9tYXJrc3RhdGUoc3RydWN0IGlmbWNhZGRyNiAqcG1jKQoreworCXN0cnVjdCBpcDZfc2ZfbGlzdCAqcHNmOworCWludCBtY2FfeGNvdW50ID0gcG1jLT5tY2Ffc2Zjb3VudFtNQ0FTVF9FWENMVURFXTsKKworCWZvciAocHNmPXBtYy0+bWNhX3NvdXJjZXM7IHBzZjsgcHNmPXBzZi0+c2ZfbmV4dCkKKwkJaWYgKHBtYy0+bWNhX3NmY291bnRbTUNBU1RfRVhDTFVERV0pIHsKKwkJCXBzZi0+c2Zfb2xkaW4gPSBtY2FfeGNvdW50ID09CisJCQkJcHNmLT5zZl9jb3VudFtNQ0FTVF9FWENMVURFXSAmJgorCQkJCSFwc2YtPnNmX2NvdW50W01DQVNUX0lOQ0xVREVdOworCQl9IGVsc2UKKwkJCXBzZi0+c2Zfb2xkaW4gPSBwc2YtPnNmX2NvdW50W01DQVNUX0lOQ0xVREVdICE9IDA7Cit9CisKK3N0YXRpYyBpbnQgc2Zfc2V0c3RhdGUoc3RydWN0IGlmbWNhZGRyNiAqcG1jKQoreworCXN0cnVjdCBpcDZfc2ZfbGlzdCAqcHNmOworCWludCBtY2FfeGNvdW50ID0gcG1jLT5tY2Ffc2Zjb3VudFtNQ0FTVF9FWENMVURFXTsKKwlpbnQgcXJ2ID0gcG1jLT5pZGV2LT5tY19xcnY7CisJaW50IG5ld19pbiwgcnY7CisKKwlydiA9IDA7CisJZm9yIChwc2Y9cG1jLT5tY2Ffc291cmNlczsgcHNmOyBwc2Y9cHNmLT5zZl9uZXh0KSB7CisJCWlmIChwbWMtPm1jYV9zZmNvdW50W01DQVNUX0VYQ0xVREVdKSB7CisJCQluZXdfaW4gPSBtY2FfeGNvdW50ID09IHBzZi0+c2ZfY291bnRbTUNBU1RfRVhDTFVERV0gJiYKKwkJCQkhcHNmLT5zZl9jb3VudFtNQ0FTVF9JTkNMVURFXTsKKwkJfSBlbHNlCisJCQluZXdfaW4gPSBwc2YtPnNmX2NvdW50W01DQVNUX0lOQ0xVREVdICE9IDA7CisJCWlmIChuZXdfaW4gIT0gcHNmLT5zZl9vbGRpbikgeworCQkJcHNmLT5zZl9jcmNvdW50ID0gcXJ2OworCQkJcnYrKzsKKwkJfQorCX0KKwlyZXR1cm4gcnY7Cit9CisKKy8qCisgKiBBZGQgbXVsdGljYXN0IHNvdXJjZSBmaWx0ZXIgbGlzdCB0byB0aGUgaW50ZXJmYWNlIGxpc3QKKyAqLworc3RhdGljIGludCBpcDZfbWNfYWRkX3NyYyhzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2LCBzdHJ1Y3QgaW42X2FkZHIgKnBtY2EsCisJCQkgIGludCBzZm1vZGUsIGludCBzZmNvdW50LCBzdHJ1Y3QgaW42X2FkZHIgKnBzZnNyYywKKwkJCSAgaW50IGRlbHRhKQoreworCXN0cnVjdCBpZm1jYWRkcjYgKnBtYzsKKwlpbnQJaXNleGNsdWRlOworCWludAlpLCBlcnI7CisKKwlpZiAoIWlkZXYpCisJCXJldHVybiAtRU5PREVWOworCXJlYWRfbG9ja19iaCgmaWRldi0+bG9jayk7CisJZm9yIChwbWM9aWRldi0+bWNfbGlzdDsgcG1jOyBwbWM9cG1jLT5uZXh0KSB7CisJCWlmIChpcHY2X2FkZHJfZXF1YWwocG1jYSwgJnBtYy0+bWNhX2FkZHIpKQorCQkJYnJlYWs7CisJfQorCWlmICghcG1jKSB7CisJCS8qIE1DQSBub3QgZm91bmQ/PyBidWcgKi8KKwkJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOworCQlyZXR1cm4gLUVTUkNIOworCX0KKwlzcGluX2xvY2tfYmgoJnBtYy0+bWNhX2xvY2spOworCisJc2ZfbWFya3N0YXRlKHBtYyk7CisJaXNleGNsdWRlID0gcG1jLT5tY2Ffc2Ztb2RlID09IE1DQVNUX0VYQ0xVREU7CisJaWYgKCFkZWx0YSkKKwkJcG1jLT5tY2Ffc2Zjb3VudFtzZm1vZGVdKys7CisJZXJyID0gMDsKKwlmb3IgKGk9MDsgaTxzZmNvdW50OyBpKyspIHsKKwkJZXJyID0gaXA2X21jX2FkZDFfc3JjKHBtYywgc2Ztb2RlLCAmcHNmc3JjW2ldLCBkZWx0YSk7CisJCWlmIChlcnIpCisJCQlicmVhazsKKwl9CisJaWYgKGVycikgeworCQlpbnQgajsKKworCQlpZiAoIWRlbHRhKQorCQkJcG1jLT5tY2Ffc2Zjb3VudFtzZm1vZGVdLS07CisJCWZvciAoaj0wOyBqPGk7IGorKykKKwkJCSh2b2lkKSBpcDZfbWNfZGVsMV9zcmMocG1jLCBzZm1vZGUsICZwc2ZzcmNbaV0pOworCX0gZWxzZSBpZiAoaXNleGNsdWRlICE9IChwbWMtPm1jYV9zZmNvdW50W01DQVNUX0VYQ0xVREVdICE9IDApKSB7CisJCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBwbWMtPmlkZXY7CisJCXN0cnVjdCBpcDZfc2ZfbGlzdCAqcHNmOworCisJCS8qIGZpbHRlciBtb2RlIGNoYW5nZSAqLworCQlpZiAocG1jLT5tY2Ffc2Zjb3VudFtNQ0FTVF9FWENMVURFXSkKKwkJCXBtYy0+bWNhX3NmbW9kZSA9IE1DQVNUX0VYQ0xVREU7CisJCWVsc2UgaWYgKHBtYy0+bWNhX3NmY291bnRbTUNBU1RfSU5DTFVERV0pCisJCQlwbWMtPm1jYV9zZm1vZGUgPSBNQ0FTVF9JTkNMVURFOworCQkvKiBlbHNlIG5vIGZpbHRlcnM7IGtlZXAgb2xkIG1vZGUgZm9yIHJlcG9ydHMgKi8KKworCQlwbWMtPm1jYV9jcmNvdW50ID0gaWRldi0+bWNfcXJ2OworCQlpZGV2LT5tY19pZmNfY291bnQgPSBwbWMtPm1jYV9jcmNvdW50OworCQlmb3IgKHBzZj1wbWMtPm1jYV9zb3VyY2VzOyBwc2Y7IHBzZiA9IHBzZi0+c2ZfbmV4dCkKKwkJCXBzZi0+c2ZfY3Jjb3VudCA9IDA7CisJCW1sZF9pZmNfZXZlbnQoaWRldik7CisJfSBlbHNlIGlmIChzZl9zZXRzdGF0ZShwbWMpKQorCQltbGRfaWZjX2V2ZW50KGlkZXYpOworCXNwaW5fdW5sb2NrX2JoKCZwbWMtPm1jYV9sb2NrKTsKKwlyZWFkX3VubG9ja19iaCgmaWRldi0+bG9jayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgaXA2X21jX2NsZWFyX3NyYyhzdHJ1Y3QgaWZtY2FkZHI2ICpwbWMpCit7CisJc3RydWN0IGlwNl9zZl9saXN0ICpwc2YsICpuZXh0cHNmOworCisJZm9yIChwc2Y9cG1jLT5tY2FfdG9tYjsgcHNmOyBwc2Y9bmV4dHBzZikgeworCQluZXh0cHNmID0gcHNmLT5zZl9uZXh0OworCQlrZnJlZShwc2YpOworCX0KKwlwbWMtPm1jYV90b21iID0gTlVMTDsKKwlmb3IgKHBzZj1wbWMtPm1jYV9zb3VyY2VzOyBwc2Y7IHBzZj1uZXh0cHNmKSB7CisJCW5leHRwc2YgPSBwc2YtPnNmX25leHQ7CisJCWtmcmVlKHBzZik7CisJfQorCXBtYy0+bWNhX3NvdXJjZXMgPSBOVUxMOworCXBtYy0+bWNhX3NmbW9kZSA9IE1DQVNUX0VYQ0xVREU7CisJcG1jLT5tY2Ffc2Zjb3VudFtNQ0FTVF9FWENMVURFXSA9IDA7CisJcG1jLT5tY2Ffc2Zjb3VudFtNQ0FTVF9FWENMVURFXSA9IDE7Cit9CisKKworc3RhdGljIHZvaWQgaWdtcDZfam9pbl9ncm91cChzdHJ1Y3QgaWZtY2FkZHI2ICptYSkKK3sKKwl1bnNpZ25lZCBsb25nIGRlbGF5OworCisJaWYgKG1hLT5tY2FfZmxhZ3MgJiBNQUZfTk9SRVBPUlQpCisJCXJldHVybjsKKworCWlnbXA2X3NlbmQoJm1hLT5tY2FfYWRkciwgbWEtPmlkZXYtPmRldiwgSUNNUFY2X01HTV9SRVBPUlQpOworCisJZGVsYXkgPSBuZXRfcmFuZG9tKCkgJSBJR01QNl9VTlNPTElDSVRFRF9JVkFMOworCisJc3Bpbl9sb2NrX2JoKCZtYS0+bWNhX2xvY2spOworCWlmIChkZWxfdGltZXIoJm1hLT5tY2FfdGltZXIpKSB7CisJCWF0b21pY19kZWMoJm1hLT5tY2FfcmVmY250KTsKKwkJZGVsYXkgPSBtYS0+bWNhX3RpbWVyLmV4cGlyZXMgLSBqaWZmaWVzOworCX0KKworCWlmICghbW9kX3RpbWVyKCZtYS0+bWNhX3RpbWVyLCBqaWZmaWVzICsgZGVsYXkpKQorCQlhdG9taWNfaW5jKCZtYS0+bWNhX3JlZmNudCk7CisJbWEtPm1jYV9mbGFncyB8PSBNQUZfVElNRVJfUlVOTklORyB8IE1BRl9MQVNUX1JFUE9SVEVSOworCXNwaW5fdW5sb2NrX2JoKCZtYS0+bWNhX2xvY2spOworfQorCitzdGF0aWMgaW50IGlwNl9tY19sZWF2ZV9zcmMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaXB2Nl9tY19zb2NrbGlzdCAqaW1sLAorCQkJICAgIHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpCit7CisJaW50IGVycjsKKworCWlmIChpbWwtPnNmbGlzdCA9PSAwKSB7CisJCS8qIGFueS1zb3VyY2UgZW1wdHkgZXhjbHVkZSBjYXNlICovCisJCXJldHVybiBpcDZfbWNfZGVsX3NyYyhpZGV2LCAmaW1sLT5hZGRyLCBpbWwtPnNmbW9kZSwgMCwgTlVMTCwgMCk7CisJfQorCWVyciA9IGlwNl9tY19kZWxfc3JjKGlkZXYsICZpbWwtPmFkZHIsIGltbC0+c2Ztb2RlLAorCQlpbWwtPnNmbGlzdC0+c2xfY291bnQsIGltbC0+c2ZsaXN0LT5zbF9hZGRyLCAwKTsKKwlzb2NrX2tmcmVlX3Moc2ssIGltbC0+c2ZsaXN0LCBJUDZfU0ZMU0laRShpbWwtPnNmbGlzdC0+c2xfbWF4KSk7CisJaW1sLT5zZmxpc3QgPSBOVUxMOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGlnbXA2X2xlYXZlX2dyb3VwKHN0cnVjdCBpZm1jYWRkcjYgKm1hKQoreworCWlmIChNTERfVjFfU0VFTihtYS0+aWRldikpIHsKKwkJaWYgKG1hLT5tY2FfZmxhZ3MgJiBNQUZfTEFTVF9SRVBPUlRFUikKKwkJCWlnbXA2X3NlbmQoJm1hLT5tY2FfYWRkciwgbWEtPmlkZXYtPmRldiwKKwkJCQlJQ01QVjZfTUdNX1JFRFVDVElPTik7CisJfSBlbHNlIHsKKwkJbWxkX2FkZF9kZWxyZWMobWEtPmlkZXYsIG1hKTsKKwkJbWxkX2lmY19ldmVudChtYS0+aWRldik7CisJfQorfQorCitzdGF0aWMgdm9pZCBtbGRfZ3FfdGltZXJfZXhwaXJlKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gKHN0cnVjdCBpbmV0Nl9kZXYgKilkYXRhOworCisJaWRldi0+bWNfZ3FfcnVubmluZyA9IDA7CisJbWxkX3NlbmRfcmVwb3J0KGlkZXYsIE5VTEwpOworCV9faW42X2Rldl9wdXQoaWRldik7Cit9CisKK3N0YXRpYyB2b2lkIG1sZF9pZmNfdGltZXJfZXhwaXJlKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gKHN0cnVjdCBpbmV0Nl9kZXYgKilkYXRhOworCisJbWxkX3NlbmRfY3IoaWRldik7CisJaWYgKGlkZXYtPm1jX2lmY19jb3VudCkgeworCQlpZGV2LT5tY19pZmNfY291bnQtLTsKKwkJaWYgKGlkZXYtPm1jX2lmY19jb3VudCkKKwkJCW1sZF9pZmNfc3RhcnRfdGltZXIoaWRldiwgaWRldi0+bWNfbWF4ZGVsYXkpOworCX0KKwlfX2luNl9kZXZfcHV0KGlkZXYpOworfQorCitzdGF0aWMgdm9pZCBtbGRfaWZjX2V2ZW50KHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpCit7CisJaWYgKE1MRF9WMV9TRUVOKGlkZXYpKQorCQlyZXR1cm47CisJaWRldi0+bWNfaWZjX2NvdW50ID0gaWRldi0+bWNfcXJ2OworCW1sZF9pZmNfc3RhcnRfdGltZXIoaWRldiwgMSk7Cit9CisKKworc3RhdGljIHZvaWQgaWdtcDZfdGltZXJfaGFuZGxlcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGlmbWNhZGRyNiAqbWEgPSAoc3RydWN0IGlmbWNhZGRyNiAqKSBkYXRhOworCisJaWYgKE1MRF9WMV9TRUVOKG1hLT5pZGV2KSkKKwkJaWdtcDZfc2VuZCgmbWEtPm1jYV9hZGRyLCBtYS0+aWRldi0+ZGV2LCBJQ01QVjZfTUdNX1JFUE9SVCk7CisJZWxzZQorCQltbGRfc2VuZF9yZXBvcnQobWEtPmlkZXYsIG1hKTsKKworCXNwaW5fbG9jaygmbWEtPm1jYV9sb2NrKTsKKwltYS0+bWNhX2ZsYWdzIHw9ICBNQUZfTEFTVF9SRVBPUlRFUjsKKwltYS0+bWNhX2ZsYWdzICY9IH5NQUZfVElNRVJfUlVOTklORzsKKwlzcGluX3VubG9jaygmbWEtPm1jYV9sb2NrKTsKKwltYV9wdXQobWEpOworfQorCisvKiBEZXZpY2UgZ29pbmcgZG93biAqLworCit2b2lkIGlwdjZfbWNfZG93bihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KQoreworCXN0cnVjdCBpZm1jYWRkcjYgKmk7CisKKwkvKiBXaXRoZHJhdyBtdWx0aWNhc3QgbGlzdCAqLworCisJcmVhZF9sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwlpZGV2LT5tY19pZmNfY291bnQgPSAwOworCWlmIChkZWxfdGltZXIoJmlkZXYtPm1jX2lmY190aW1lcikpCisJCV9faW42X2Rldl9wdXQoaWRldik7CisJaWRldi0+bWNfZ3FfcnVubmluZyA9IDA7CisJaWYgKGRlbF90aW1lcigmaWRldi0+bWNfZ3FfdGltZXIpKQorCQlfX2luNl9kZXZfcHV0KGlkZXYpOworCisJZm9yIChpID0gaWRldi0+bWNfbGlzdDsgaTsgaT1pLT5uZXh0KQorCQlpZ21wNl9ncm91cF9kcm9wcGVkKGkpOworCXJlYWRfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKworCW1sZF9jbGVhcl9kZWxyZWMoaWRldik7Cit9CisKKworLyogRGV2aWNlIGdvaW5nIHVwICovCisKK3ZvaWQgaXB2Nl9tY191cChzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KQoreworCXN0cnVjdCBpZm1jYWRkcjYgKmk7CisKKwkvKiBJbnN0YWxsIG11bHRpY2FzdCBsaXN0LCBleGNlcHQgZm9yIGFsbC1ub2RlcyAoYWxyZWFkeSBpbnN0YWxsZWQpICovCisKKwlyZWFkX2xvY2tfYmgoJmlkZXYtPmxvY2spOworCWZvciAoaSA9IGlkZXYtPm1jX2xpc3Q7IGk7IGk9aS0+bmV4dCkKKwkJaWdtcDZfZ3JvdXBfYWRkZWQoaSk7CisJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOworfQorCisvKiBJUHY2IGRldmljZSBpbml0aWFsaXphdGlvbi4gKi8KKwordm9pZCBpcHY2X21jX2luaXRfZGV2KHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpCit7CisJc3RydWN0IGluNl9hZGRyIG1hZGRyOworCisJd3JpdGVfbG9ja19iaCgmaWRldi0+bG9jayk7CisJcndsb2NrX2luaXQoJmlkZXYtPm1jX2xvY2spOworCWlkZXYtPm1jX2dxX3J1bm5pbmcgPSAwOworCWluaXRfdGltZXIoJmlkZXYtPm1jX2dxX3RpbWVyKTsKKwlpZGV2LT5tY19ncV90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGlkZXY7CisJaWRldi0+bWNfZ3FfdGltZXIuZnVuY3Rpb24gPSAmbWxkX2dxX3RpbWVyX2V4cGlyZTsKKwlpZGV2LT5tY190b21iID0gTlVMTDsKKwlpZGV2LT5tY19pZmNfY291bnQgPSAwOworCWluaXRfdGltZXIoJmlkZXYtPm1jX2lmY190aW1lcik7CisJaWRldi0+bWNfaWZjX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgaWRldjsKKwlpZGV2LT5tY19pZmNfdGltZXIuZnVuY3Rpb24gPSAmbWxkX2lmY190aW1lcl9leHBpcmU7CisJaWRldi0+bWNfcXJ2ID0gTUxEX1FSVl9ERUZBVUxUOworCWlkZXYtPm1jX21heGRlbGF5ID0gSUdNUDZfVU5TT0xJQ0lURURfSVZBTDsKKwlpZGV2LT5tY192MV9zZWVuID0gMDsKKwl3cml0ZV91bmxvY2tfYmgoJmlkZXYtPmxvY2spOworCisJLyogQWRkIGFsbC1ub2RlcyBhZGRyZXNzLiAqLworCWlwdjZfYWRkcl9hbGxfbm9kZXMoJm1hZGRyKTsKKwlpcHY2X2Rldl9tY19pbmMoaWRldi0+ZGV2LCAmbWFkZHIpOworfQorCisvKgorICoJRGV2aWNlIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZDogY2xlYW4gdXAuCisgKi8KKwordm9pZCBpcHY2X21jX2Rlc3Ryb3lfZGV2KHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpCit7CisJc3RydWN0IGlmbWNhZGRyNiAqaTsKKwlzdHJ1Y3QgaW42X2FkZHIgbWFkZHI7CisKKwkvKiBEZWFjdGl2YXRlIHRpbWVycyAqLworCWlwdjZfbWNfZG93bihpZGV2KTsKKworCS8qIERlbGV0ZSBhbGwtbm9kZXMgYWRkcmVzcy4gKi8KKwlpcHY2X2FkZHJfYWxsX25vZGVzKCZtYWRkcik7CisKKwkvKiBXZSBjYW5ub3QgY2FsbCBpcHY2X2Rldl9tY19kZWMoKSBkaXJlY3RseSwgb3VyIGNhbGxlciBpbgorCSAqIGFkZHJjb25mLmMgaGFzIE5VTEwnZCBvdXQgZGV2LT5pcDZfcHRyIHNvIGluNl9kZXZfZ2V0KCkgd2lsbAorCSAqIGZhaWwuCisJICovCisJX19pcHY2X2Rldl9tY19kZWMoaWRldiwgJm1hZGRyKTsKKworCWlmIChpZGV2LT5jbmYuZm9yd2FyZGluZykgeworCQlpcHY2X2FkZHJfYWxsX3JvdXRlcnMoJm1hZGRyKTsKKwkJX19pcHY2X2Rldl9tY19kZWMoaWRldiwgJm1hZGRyKTsKKwl9CisKKwl3cml0ZV9sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwl3aGlsZSAoKGkgPSBpZGV2LT5tY19saXN0KSAhPSBOVUxMKSB7CisJCWlkZXYtPm1jX2xpc3QgPSBpLT5uZXh0OworCQl3cml0ZV91bmxvY2tfYmgoJmlkZXYtPmxvY2spOworCisJCWlnbXA2X2dyb3VwX2Ryb3BwZWQoaSk7CisJCW1hX3B1dChpKTsKKworCQl3cml0ZV9sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdHJ1Y3QgaWdtcDZfbWNfaXRlcl9zdGF0ZSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OworfTsKKworI2RlZmluZSBpZ21wNl9tY19zZXFfcHJpdmF0ZShzZXEpCSgoc3RydWN0IGlnbXA2X21jX2l0ZXJfc3RhdGUgKikoc2VxKS0+cHJpdmF0ZSkKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaWZtY2FkZHI2ICppZ21wNl9tY19nZXRfZmlyc3Qoc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc3RydWN0IGlmbWNhZGRyNiAqaW0gPSBOVUxMOworCXN0cnVjdCBpZ21wNl9tY19pdGVyX3N0YXRlICpzdGF0ZSA9IGlnbXA2X21jX3NlcV9wcml2YXRlKHNlcSk7CisKKwlmb3IgKHN0YXRlLT5kZXYgPSBkZXZfYmFzZSwgc3RhdGUtPmlkZXYgPSBOVUxMOworCSAgICAgc3RhdGUtPmRldjsgCisJICAgICBzdGF0ZS0+ZGV2ID0gc3RhdGUtPmRldi0+bmV4dCkgeworCQlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OworCQlpZGV2ID0gaW42X2Rldl9nZXQoc3RhdGUtPmRldik7CisJCWlmICghaWRldikKKwkJCWNvbnRpbnVlOworCQlyZWFkX2xvY2tfYmgoJmlkZXYtPmxvY2spOworCQlpbSA9IGlkZXYtPm1jX2xpc3Q7CisJCWlmIChpbSkgeworCQkJc3RhdGUtPmlkZXYgPSBpZGV2OworCQkJYnJlYWs7CisJCX0KKwkJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOworCQlpbjZfZGV2X3B1dChpZGV2KTsKKwl9CisJcmV0dXJuIGltOworfQorCitzdGF0aWMgc3RydWN0IGlmbWNhZGRyNiAqaWdtcDZfbWNfZ2V0X25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBpZm1jYWRkcjYgKmltKQoreworCXN0cnVjdCBpZ21wNl9tY19pdGVyX3N0YXRlICpzdGF0ZSA9IGlnbXA2X21jX3NlcV9wcml2YXRlKHNlcSk7CisKKwlpbSA9IGltLT5uZXh0OworCXdoaWxlICghaW0pIHsKKwkJaWYgKGxpa2VseShzdGF0ZS0+aWRldiAhPSBOVUxMKSkgeworCQkJcmVhZF91bmxvY2tfYmgoJnN0YXRlLT5pZGV2LT5sb2NrKTsKKwkJCWluNl9kZXZfcHV0KHN0YXRlLT5pZGV2KTsKKwkJfQorCQlzdGF0ZS0+ZGV2ID0gc3RhdGUtPmRldi0+bmV4dDsKKwkJaWYgKCFzdGF0ZS0+ZGV2KSB7CisJCQlzdGF0ZS0+aWRldiA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCQlzdGF0ZS0+aWRldiA9IGluNl9kZXZfZ2V0KHN0YXRlLT5kZXYpOworCQlpZiAoIXN0YXRlLT5pZGV2KQorCQkJY29udGludWU7CisJCXJlYWRfbG9ja19iaCgmc3RhdGUtPmlkZXYtPmxvY2spOworCQlpbSA9IHN0YXRlLT5pZGV2LT5tY19saXN0OworCX0KKwlyZXR1cm4gaW07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWZtY2FkZHI2ICppZ21wNl9tY19nZXRfaWR4KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBpZm1jYWRkcjYgKmltID0gaWdtcDZfbWNfZ2V0X2ZpcnN0KHNlcSk7CisJaWYgKGltKQorCQl3aGlsZSAocG9zICYmIChpbSA9IGlnbXA2X21jX2dldF9uZXh0KHNlcSwgaW0pKSAhPSBOVUxMKQorCQkJLS1wb3M7CisJcmV0dXJuIHBvcyA/IE5VTEwgOiBpbTsKK30KKworc3RhdGljIHZvaWQgKmlnbXA2X21jX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKwlyZXR1cm4gaWdtcDZfbWNfZ2V0X2lkeChzZXEsICpwb3MpOworfQorCitzdGF0aWMgdm9pZCAqaWdtcDZfbWNfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBpZm1jYWRkcjYgKmltOworCWltID0gaWdtcDZfbWNfZ2V0X25leHQoc2VxLCB2KTsKKwkrKypwb3M7CisJcmV0dXJuIGltOworfQorCitzdGF0aWMgdm9pZCBpZ21wNl9tY19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaWdtcDZfbWNfaXRlcl9zdGF0ZSAqc3RhdGUgPSBpZ21wNl9tY19zZXFfcHJpdmF0ZShzZXEpOworCWlmIChsaWtlbHkoc3RhdGUtPmlkZXYgIT0gTlVMTCkpIHsKKwkJcmVhZF91bmxvY2tfYmgoJnN0YXRlLT5pZGV2LT5sb2NrKTsKKwkJaW42X2Rldl9wdXQoc3RhdGUtPmlkZXYpOworCQlzdGF0ZS0+aWRldiA9IE5VTEw7CisJfQorCXN0YXRlLT5kZXYgPSBOVUxMOworCXJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsKK30KKworc3RhdGljIGludCBpZ21wNl9tY19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaWZtY2FkZHI2ICppbSA9IChzdHJ1Y3QgaWZtY2FkZHI2ICopdjsKKwlzdHJ1Y3QgaWdtcDZfbWNfaXRlcl9zdGF0ZSAqc3RhdGUgPSBpZ21wNl9tY19zZXFfcHJpdmF0ZShzZXEpOworCisJc2VxX3ByaW50ZihzZXEsCisJCSAgICIlLTRkICUtMTVzICUwNHglMDR4JTA0eCUwNHglMDR4JTA0eCUwNHglMDR4ICU1ZCAlMDhYICVsZFxuIiwgCisJCSAgIHN0YXRlLT5kZXYtPmlmaW5kZXgsIHN0YXRlLT5kZXYtPm5hbWUsCisJCSAgIE5JUDYoaW0tPm1jYV9hZGRyKSwKKwkJICAgaW0tPm1jYV91c2VycywgaW0tPm1jYV9mbGFncywKKwkJICAgKGltLT5tY2FfZmxhZ3MmTUFGX1RJTUVSX1JVTk5JTkcpID8KKwkJICAgamlmZmllc190b19jbG9ja190KGltLT5tY2FfdGltZXIuZXhwaXJlcy1qaWZmaWVzKSA6IDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGlnbXA2X21jX3NlcV9vcHMgPSB7CisJLnN0YXJ0CT0JaWdtcDZfbWNfc2VxX3N0YXJ0LAorCS5uZXh0CT0JaWdtcDZfbWNfc2VxX25leHQsCisJLnN0b3AJPQlpZ21wNl9tY19zZXFfc3RvcCwKKwkuc2hvdwk9CWlnbXA2X21jX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBpZ21wNl9tY19zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKKwlpbnQgcmMgPSAtRU5PTUVNOworCXN0cnVjdCBpZ21wNl9tY19pdGVyX3N0YXRlICpzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKworCWlmICghcykKKwkJZ290byBvdXQ7CisKKwlyYyA9IHNlcV9vcGVuKGZpbGUsICZpZ21wNl9tY19zZXFfb3BzKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0X2tmcmVlOworCisJc2VxID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNlcS0+cHJpdmF0ZSA9IHM7CisJbWVtc2V0KHMsIDAsIHNpemVvZigqcykpOworb3V0OgorCXJldHVybiByYzsKK291dF9rZnJlZToKKwlrZnJlZShzKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaWdtcDZfbWNfc2VxX2ZvcHMgPSB7CisJLm93bmVyCQk9CVRISVNfTU9EVUxFLAorCS5vcGVuCQk9CWlnbXA2X21jX3NlcV9vcGVuLAorCS5yZWFkCQk9CXNlcV9yZWFkLAorCS5sbHNlZWsJCT0Jc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0Jc2VxX3JlbGVhc2VfcHJpdmF0ZSwKK307CisKK3N0cnVjdCBpZ21wNl9tY2ZfaXRlcl9zdGF0ZSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OworCXN0cnVjdCBpZm1jYWRkcjYgKmltOworfTsKKworI2RlZmluZSBpZ21wNl9tY2Zfc2VxX3ByaXZhdGUoc2VxKQkoKHN0cnVjdCBpZ21wNl9tY2ZfaXRlcl9zdGF0ZSAqKShzZXEpLT5wcml2YXRlKQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpcDZfc2ZfbGlzdCAqaWdtcDZfbWNmX2dldF9maXJzdChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwlzdHJ1Y3QgaXA2X3NmX2xpc3QgKnBzZiA9IE5VTEw7CisJc3RydWN0IGlmbWNhZGRyNiAqaW0gPSBOVUxMOworCXN0cnVjdCBpZ21wNl9tY2ZfaXRlcl9zdGF0ZSAqc3RhdGUgPSBpZ21wNl9tY2Zfc2VxX3ByaXZhdGUoc2VxKTsKKworCWZvciAoc3RhdGUtPmRldiA9IGRldl9iYXNlLCBzdGF0ZS0+aWRldiA9IE5VTEwsIHN0YXRlLT5pbSA9IE5VTEw7CisJICAgICBzdGF0ZS0+ZGV2OyAKKwkgICAgIHN0YXRlLT5kZXYgPSBzdGF0ZS0+ZGV2LT5uZXh0KSB7CisJCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CisJCWlkZXYgPSBpbjZfZGV2X2dldChzdGF0ZS0+ZGV2KTsKKwkJaWYgKHVubGlrZWx5KGlkZXYgPT0gTlVMTCkpCisJCQljb250aW51ZTsKKwkJcmVhZF9sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwkJaW0gPSBpZGV2LT5tY19saXN0OworCQlpZiAobGlrZWx5KGltICE9IE5VTEwpKSB7CisJCQlzcGluX2xvY2tfYmgoJmltLT5tY2FfbG9jayk7CisJCQlwc2YgPSBpbS0+bWNhX3NvdXJjZXM7CisJCQlpZiAobGlrZWx5KHBzZiAhPSBOVUxMKSkgeworCQkJCXN0YXRlLT5pbSA9IGltOworCQkJCXN0YXRlLT5pZGV2ID0gaWRldjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2JoKCZpbS0+bWNhX2xvY2spOworCQl9CisJCXJlYWRfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKKwkJaW42X2Rldl9wdXQoaWRldik7CisJfQorCXJldHVybiBwc2Y7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXA2X3NmX2xpc3QgKmlnbXA2X21jZl9nZXRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IGlwNl9zZl9saXN0ICpwc2YpCit7CisJc3RydWN0IGlnbXA2X21jZl9pdGVyX3N0YXRlICpzdGF0ZSA9IGlnbXA2X21jZl9zZXFfcHJpdmF0ZShzZXEpOworCisJcHNmID0gcHNmLT5zZl9uZXh0OworCXdoaWxlICghcHNmKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZzdGF0ZS0+aW0tPm1jYV9sb2NrKTsKKwkJc3RhdGUtPmltID0gc3RhdGUtPmltLT5uZXh0OworCQl3aGlsZSAoIXN0YXRlLT5pbSkgeworCQkJaWYgKGxpa2VseShzdGF0ZS0+aWRldiAhPSBOVUxMKSkgeworCQkJCXJlYWRfdW5sb2NrX2JoKCZzdGF0ZS0+aWRldi0+bG9jayk7CisJCQkJaW42X2Rldl9wdXQoc3RhdGUtPmlkZXYpOworCQkJfQorCQkJc3RhdGUtPmRldiA9IHN0YXRlLT5kZXYtPm5leHQ7CisJCQlpZiAoIXN0YXRlLT5kZXYpIHsKKwkJCQlzdGF0ZS0+aWRldiA9IE5VTEw7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlzdGF0ZS0+aWRldiA9IGluNl9kZXZfZ2V0KHN0YXRlLT5kZXYpOworCQkJaWYgKCFzdGF0ZS0+aWRldikKKwkJCQljb250aW51ZTsKKwkJCXJlYWRfbG9ja19iaCgmc3RhdGUtPmlkZXYtPmxvY2spOworCQkJc3RhdGUtPmltID0gc3RhdGUtPmlkZXYtPm1jX2xpc3Q7CisJCX0KKwkJaWYgKCFzdGF0ZS0+aW0pCisJCQlicmVhazsKKwkJc3Bpbl9sb2NrX2JoKCZzdGF0ZS0+aW0tPm1jYV9sb2NrKTsKKwkJcHNmID0gc3RhdGUtPmltLT5tY2Ffc291cmNlczsKKwl9CitvdXQ6CisJcmV0dXJuIHBzZjsKK30KKworc3RhdGljIHN0cnVjdCBpcDZfc2ZfbGlzdCAqaWdtcDZfbWNmX2dldF9pZHgoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCBwb3MpCit7CisJc3RydWN0IGlwNl9zZl9saXN0ICpwc2YgPSBpZ21wNl9tY2ZfZ2V0X2ZpcnN0KHNlcSk7CisJaWYgKHBzZikKKwkJd2hpbGUgKHBvcyAmJiAocHNmID0gaWdtcDZfbWNmX2dldF9uZXh0KHNlcSwgcHNmKSkgIT0gTlVMTCkKKwkJCS0tcG9zOworCXJldHVybiBwb3MgPyBOVUxMIDogcHNmOworfQorCitzdGF0aWMgdm9pZCAqaWdtcDZfbWNmX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKwlyZXR1cm4gKnBvcyA/IGlnbXA2X21jZl9nZXRfaWR4KHNlcSwgKnBvcyAtIDEpIDogU0VRX1NUQVJUX1RPS0VOOworfQorCitzdGF0aWMgdm9pZCAqaWdtcDZfbWNmX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaXA2X3NmX2xpc3QgKnBzZjsKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXBzZiA9IGlnbXA2X21jZl9nZXRfZmlyc3Qoc2VxKTsKKwllbHNlCisJCXBzZiA9IGlnbXA2X21jZl9nZXRfbmV4dChzZXEsIHYpOworCSsrKnBvczsKKwlyZXR1cm4gcHNmOworfQorCitzdGF0aWMgdm9pZCBpZ21wNl9tY2Zfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IGlnbXA2X21jZl9pdGVyX3N0YXRlICpzdGF0ZSA9IGlnbXA2X21jZl9zZXFfcHJpdmF0ZShzZXEpOworCWlmIChsaWtlbHkoc3RhdGUtPmltICE9IE5VTEwpKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZzdGF0ZS0+aW0tPm1jYV9sb2NrKTsKKwkJc3RhdGUtPmltID0gTlVMTDsKKwl9CisJaWYgKGxpa2VseShzdGF0ZS0+aWRldiAhPSBOVUxMKSkgeworCQlyZWFkX3VubG9ja19iaCgmc3RhdGUtPmlkZXYtPmxvY2spOworCQlpbjZfZGV2X3B1dChzdGF0ZS0+aWRldik7CisJCXN0YXRlLT5pZGV2ID0gTlVMTDsKKwl9CisJc3RhdGUtPmRldiA9IE5VTEw7CisJcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOworfQorCitzdGF0aWMgaW50IGlnbXA2X21jZl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaXA2X3NmX2xpc3QgKnBzZiA9IChzdHJ1Y3QgaXA2X3NmX2xpc3QgKil2OworCXN0cnVjdCBpZ21wNl9tY2ZfaXRlcl9zdGF0ZSAqc3RhdGUgPSBpZ21wNl9tY2Zfc2VxX3ByaXZhdGUoc2VxKTsKKworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlzZXFfcHJpbnRmKHNlcSwgCisJCQkgICAiJTNzICU2cyAiCisJCQkgICAiJTMycyAlMzJzICU2cyAlNnNcbiIsICJJZHgiLAorCQkJICAgIkRldmljZSIsICJNdWx0aWNhc3QgQWRkcmVzcyIsCisJCQkgICAiU291cmNlIEFkZHJlc3MiLCAiSU5DIiwgIkVYQyIpOworCX0gZWxzZSB7CisJCXNlcV9wcmludGYoc2VxLAorCQkJICAgIiUzZCAlNi42cyAiCisJCQkgICAiJTA0eCUwNHglMDR4JTA0eCUwNHglMDR4JTA0eCUwNHggIgorCQkJICAgIiUwNHglMDR4JTA0eCUwNHglMDR4JTA0eCUwNHglMDR4ICIKKwkJCSAgICIlNmx1ICU2bHVcbiIsCisJCQkgICBzdGF0ZS0+ZGV2LT5pZmluZGV4LCBzdGF0ZS0+ZGV2LT5uYW1lLAorCQkJICAgTklQNihzdGF0ZS0+aW0tPm1jYV9hZGRyKSwKKwkJCSAgIE5JUDYocHNmLT5zZl9hZGRyKSwKKwkJCSAgIHBzZi0+c2ZfY291bnRbTUNBU1RfSU5DTFVERV0sCisJCQkgICBwc2YtPnNmX2NvdW50W01DQVNUX0VYQ0xVREVdKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaWdtcDZfbWNmX3NlcV9vcHMgPSB7CisJLnN0YXJ0CT0JaWdtcDZfbWNmX3NlcV9zdGFydCwKKwkubmV4dAk9CWlnbXA2X21jZl9zZXFfbmV4dCwKKwkuc3RvcAk9CWlnbXA2X21jZl9zZXFfc3RvcCwKKwkuc2hvdwk9CWlnbXA2X21jZl9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgaWdtcDZfbWNmX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzZXFfZmlsZSAqc2VxOworCWludCByYyA9IC1FTk9NRU07CisJc3RydWN0IGlnbXA2X21jZl9pdGVyX3N0YXRlICpzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKwkKKwlpZiAoIXMpCisJCWdvdG8gb3V0OworCisJcmMgPSBzZXFfb3BlbihmaWxlLCAmaWdtcDZfbWNmX3NlcV9vcHMpOworCWlmIChyYykKKwkJZ290byBvdXRfa2ZyZWU7CisKKwlzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc2VxLT5wcml2YXRlID0gczsKKwltZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7CitvdXQ6CisJcmV0dXJuIHJjOworb3V0X2tmcmVlOgorCWtmcmVlKHMpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpZ21wNl9tY2Zfc2VxX2ZvcHMgPSB7CisJLm93bmVyCQk9CVRISVNfTU9EVUxFLAorCS5vcGVuCQk9CWlnbXA2X21jZl9zZXFfb3BlbiwKKwkucmVhZAkJPQlzZXFfcmVhZCwKKwkubGxzZWVrCQk9CXNlcV9sc2VlaywKKwkucmVsZWFzZQk9CXNlcV9yZWxlYXNlX3ByaXZhdGUsCit9OworI2VuZGlmCisKK2ludCBfX2luaXQgaWdtcDZfaW5pdChzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSAqb3BzKQoreworCXN0cnVjdCBpcHY2X3BpbmZvICpucDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJaW50IGVycjsKKworCWVyciA9IHNvY2tfY3JlYXRlX2tlcm4oUEZfSU5FVDYsIFNPQ0tfUkFXLCBJUFBST1RPX0lDTVBWNiwgJmlnbXA2X3NvY2tldCk7CisJaWYgKGVyciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIElHTVA2IGNvbnRyb2wgc29ja2V0IChlcnIgJWQpLlxuIiwKKwkJICAgICAgIGVycik7CisJCWlnbXA2X3NvY2tldCA9IE5VTEw7IC8qIEZvciBzYWZldHkuICovCisJCXJldHVybiBlcnI7CisJfQorCisJc2sgPSBpZ21wNl9zb2NrZXQtPnNrOworCXNrLT5za19hbGxvY2F0aW9uID0gR0ZQX0FUT01JQzsKKwlzay0+c2tfcHJvdC0+dW5oYXNoKHNrKTsKKworCW5wID0gaW5ldDZfc2soc2spOworCW5wLT5ob3BfbGltaXQgPSAxOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlwcm9jX25ldF9mb3BzX2NyZWF0ZSgiaWdtcDYiLCBTX0lSVUdPLCAmaWdtcDZfbWNfc2VxX2ZvcHMpOworCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJtY2ZpbHRlcjYiLCBTX0lSVUdPLCAmaWdtcDZfbWNmX3NlcV9mb3BzKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaWdtcDZfY2xlYW51cCh2b2lkKQoreworCXNvY2tfcmVsZWFzZShpZ21wNl9zb2NrZXQpOworCWlnbXA2X3NvY2tldCA9IE5VTEw7IC8qIGZvciBzYWZldHkgKi8KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJcHJvY19uZXRfcmVtb3ZlKCJtY2ZpbHRlcjYiKTsKKwlwcm9jX25ldF9yZW1vdmUoImlnbXA2Iik7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL25ldC9pcHY2L25kaXNjLmMgYi9uZXQvaXB2Ni9uZGlzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMjkxZjQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2Ni9uZGlzYy5jCkBAIC0wLDAgKzEsMTY5MCBAQAorLyoKKyAqCU5laWdoYm91ciBEaXNjb3ZlcnkgZm9yIElQdjYKKyAqCUxpbnV4IElORVQ2IGltcGxlbWVudGF0aW9uIAorICoKKyAqCUF1dGhvcnM6CisgKglQZWRybyBSb3F1ZQkJPHJvcXVlQGRpLmZjLnVsLnB0PgkKKyAqCU1pa2UgU2hhdmVyCQk8c2hhdmVyQGluZ2VuaWEuY29tPgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworLyoKKyAqCUNoYW5nZXM6CisgKgorICoJTGFycyBGZW5uZWJlcmcJCQk6CWZpeGVkIE1UVSBzZXR0aW5nIG9uIHJlY2VpcHQKKyAqCQkJCQkJb2YgYW4gUkEuCisgKgorICoJSmFub3MgRmFya2FzCQkJOglrbWFsbG9jIGZhaWx1cmUgY2hlY2tzCisgKglBbGV4ZXkgS3V6bmV0c292CQk6CXN0YXRlIG1hY2hpbmUgcmV3b3JrZWQKKyAqCQkJCQkJYW5kIG1vdmVkIHRvIG5ldC9jb3JlLgorICoJUGVra2EgU2F2b2xhCQkJOglSRkMyNDYxIHZhbGlkYXRpb24KKyAqCVlPU0hJRlVKSSBIaWRlYWtpIEBVU0FHSQk6CVZlcmlmeSBORCBvcHRpb25zIHByb3Blcmx5CisgKi8KKworLyogU2V0IHRvIDMgdG8gZ2V0IHRyYWNpbmcuLi4gKi8KKyNkZWZpbmUgTkRfREVCVUcgMQorCisjZGVmaW5lIE5EX1BSSU5USyhmbXQsIGFyZ3MuLi4pIGRvIHsgaWYgKG5ldF9yYXRlbGltaXQoKSkgeyBwcmludGsoZm10LCAjIyBhcmdzKTsgfSB9IHdoaWxlKDApCisjZGVmaW5lIE5EX05PUFJJTlRLKHguLi4pIGRvIHsgOyB9IHdoaWxlKDApCisjZGVmaW5lIE5EX1BSSU5USzAgTkRfUFJJTlRLCisjZGVmaW5lIE5EX1BSSU5USzEgTkRfTk9QUklOVEsKKyNkZWZpbmUgTkRfUFJJTlRLMiBORF9OT1BSSU5USworI2RlZmluZSBORF9QUklOVEszIE5EX05PUFJJTlRLCisjaWYgTkRfREVCVUcgPj0gMQorI3VuZGVmIE5EX1BSSU5USzEKKyNkZWZpbmUgTkRfUFJJTlRLMSBORF9QUklOVEsKKyNlbmRpZgorI2lmIE5EX0RFQlVHID49IDIKKyN1bmRlZiBORF9QUklOVEsyCisjZGVmaW5lIE5EX1BSSU5USzIgTkRfUFJJTlRLCisjZW5kaWYKKyNpZiBORF9ERUJVRyA+PSAzCisjdW5kZWYgTkRfUFJJTlRLMworI2RlZmluZSBORF9QUklOVEszIE5EX1BSSU5USworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8bGludXgvcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgorCisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvc25tcC5oPgorCisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvbmRpc2MuaD4KKyNpbmNsdWRlIDxuZXQvaXA2X3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CisjaW5jbHVkZSA8bmV0L2ljbXAuaD4KKworI2luY2x1ZGUgPG5ldC9mbG93Lmg+CisjaW5jbHVkZSA8bmV0L2lwNl9jaGVja3N1bS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2Lmg+CisKK3N0YXRpYyBzdHJ1Y3Qgc29ja2V0ICpuZGlzY19zb2NrZXQ7CisKK3N0YXRpYyB1MzIgbmRpc2NfaGFzaChjb25zdCB2b2lkICpwa2V5LCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbmRpc2NfY29uc3RydWN0b3Ioc3RydWN0IG5laWdoYm91ciAqbmVpZ2gpOworc3RhdGljIHZvaWQgbmRpc2Nfc29saWNpdChzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBuZGlzY19lcnJvcl9yZXBvcnQoc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBwbmRpc2NfY29uc3RydWN0b3Ioc3RydWN0IHBuZWlnaF9lbnRyeSAqbik7CitzdGF0aWMgdm9pZCBwbmRpc2NfZGVzdHJ1Y3RvcihzdHJ1Y3QgcG5laWdoX2VudHJ5ICpuKTsKK3N0YXRpYyB2b2lkIHBuZGlzY19yZWRvKHN0cnVjdCBza19idWZmICpza2IpOworCitzdGF0aWMgc3RydWN0IG5laWdoX29wcyBuZGlzY19nZW5lcmljX29wcyA9IHsKKwkuZmFtaWx5ID0JCUFGX0lORVQ2LAorCS5zb2xpY2l0ID0JCW5kaXNjX3NvbGljaXQsCisJLmVycm9yX3JlcG9ydCA9CQluZGlzY19lcnJvcl9yZXBvcnQsCisJLm91dHB1dCA9CQluZWlnaF9yZXNvbHZlX291dHB1dCwKKwkuY29ubmVjdGVkX291dHB1dCA9CW5laWdoX2Nvbm5lY3RlZF9vdXRwdXQsCisJLmhoX291dHB1dCA9CQlkZXZfcXVldWVfeG1pdCwKKwkucXVldWVfeG1pdCA9CQlkZXZfcXVldWVfeG1pdCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmVpZ2hfb3BzIG5kaXNjX2hoX29wcyA9IHsKKwkuZmFtaWx5ID0JCUFGX0lORVQ2LAorCS5zb2xpY2l0ID0JCW5kaXNjX3NvbGljaXQsCisJLmVycm9yX3JlcG9ydCA9CQluZGlzY19lcnJvcl9yZXBvcnQsCisJLm91dHB1dCA9CQluZWlnaF9yZXNvbHZlX291dHB1dCwKKwkuY29ubmVjdGVkX291dHB1dCA9CW5laWdoX3Jlc29sdmVfb3V0cHV0LAorCS5oaF9vdXRwdXQgPQkJZGV2X3F1ZXVlX3htaXQsCisJLnF1ZXVlX3htaXQgPQkJZGV2X3F1ZXVlX3htaXQsCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgbmVpZ2hfb3BzIG5kaXNjX2RpcmVjdF9vcHMgPSB7CisJLmZhbWlseSA9CQlBRl9JTkVUNiwKKwkub3V0cHV0ID0JCWRldl9xdWV1ZV94bWl0LAorCS5jb25uZWN0ZWRfb3V0cHV0ID0JZGV2X3F1ZXVlX3htaXQsCisJLmhoX291dHB1dCA9CQlkZXZfcXVldWVfeG1pdCwKKwkucXVldWVfeG1pdCA9CQlkZXZfcXVldWVfeG1pdCwKK307CisKK3N0cnVjdCBuZWlnaF90YWJsZSBuZF90YmwgPSB7CisJLmZhbWlseSA9CUFGX0lORVQ2LAorCS5lbnRyeV9zaXplID0Jc2l6ZW9mKHN0cnVjdCBuZWlnaGJvdXIpICsgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksCisJLmtleV9sZW4gPQlzaXplb2Yoc3RydWN0IGluNl9hZGRyKSwKKwkuaGFzaCA9CQluZGlzY19oYXNoLAorCS5jb25zdHJ1Y3RvciA9CW5kaXNjX2NvbnN0cnVjdG9yLAorCS5wY29uc3RydWN0b3IgPQlwbmRpc2NfY29uc3RydWN0b3IsCisJLnBkZXN0cnVjdG9yID0JcG5kaXNjX2Rlc3RydWN0b3IsCisJLnByb3h5X3JlZG8gPQlwbmRpc2NfcmVkbywKKwkuaWQgPQkJIm5kaXNjX2NhY2hlIiwKKwkucGFybXMgPSB7CisJCS50YmwgPQkJCSZuZF90YmwsCisJCS5iYXNlX3JlYWNoYWJsZV90aW1lID0JMzAgKiBIWiwKKwkJLnJldHJhbnNfdGltZSA9CSAxICogSFosCisJCS5nY19zdGFsZXRpbWUgPQk2MCAqIEhaLAorCQkucmVhY2hhYmxlX3RpbWUgPQkJMzAgKiBIWiwKKwkJLmRlbGF5X3Byb2JlX3RpbWUgPQkgNSAqIEhaLAorCQkucXVldWVfbGVuID0JCSAzLAorCQkudWNhc3RfcHJvYmVzID0JIDMsCisJCS5tY2FzdF9wcm9iZXMgPQkgMywKKwkJLmFueWNhc3RfZGVsYXkgPQkgMSAqIEhaLAorCQkucHJveHlfZGVsYXkgPQkJKDggKiBIWikgLyAxMCwKKwkJLnByb3h5X3FsZW4gPQkJNjQsCisJfSwKKwkuZ2NfaW50ZXJ2YWwgPQkgIDMwICogSFosCisJLmdjX3RocmVzaDEgPQkgMTI4LAorCS5nY190aHJlc2gyID0JIDUxMiwKKwkuZ2NfdGhyZXNoMyA9CTEwMjQsCit9OworCisvKiBORCBvcHRpb25zICovCitzdHJ1Y3QgbmRpc2Nfb3B0aW9ucyB7CisJc3RydWN0IG5kX29wdF9oZHIgKm5kX29wdF9hcnJheVtfX05EX09QVF9NQVhdOworfTsKKworI2RlZmluZSBuZF9vcHRzX3NyY19sbGFkZHIJbmRfb3B0X2FycmF5W05EX09QVF9TT1VSQ0VfTExfQUREUl0KKyNkZWZpbmUgbmRfb3B0c190Z3RfbGxhZGRyCW5kX29wdF9hcnJheVtORF9PUFRfVEFSR0VUX0xMX0FERFJdCisjZGVmaW5lIG5kX29wdHNfcGkJCW5kX29wdF9hcnJheVtORF9PUFRfUFJFRklYX0lORk9dCisjZGVmaW5lIG5kX29wdHNfcGlfZW5kCQluZF9vcHRfYXJyYXlbX19ORF9PUFRfUFJFRklYX0lORk9fRU5EXQorI2RlZmluZSBuZF9vcHRzX3JoCQluZF9vcHRfYXJyYXlbTkRfT1BUX1JFRElSRUNUX0hEUl0KKyNkZWZpbmUgbmRfb3B0c19tdHUJCW5kX29wdF9hcnJheVtORF9PUFRfTVRVXQorCisjZGVmaW5lIE5ESVNDX09QVF9TUEFDRShsZW4pICgoKGxlbikrMis3KSZ+NykKKworLyoKKyAqIFJldHVybiB0aGUgcGFkZGluZyBiZXR3ZWVuIHRoZSBvcHRpb24gbGVuZ3RoIGFuZCB0aGUgc3RhcnQgb2YgdGhlCisgKiBsaW5rIGFkZHIuICBDdXJyZW50bHkgb25seSBJUC1vdmVyLUluZmluaUJhbmQgbmVlZHMgdGhpcywgYWx0aG91Z2gKKyAqIGlmIFJGQyAzODMxIElQdjYtb3Zlci1GaWJyZSBDaGFubmVsIGlzIGV2ZXIgaW1wbGVtZW50ZWQgaXQgbWF5CisgKiBhbHNvIG5lZWQgYSBwYWQgb2YgMi4KKyAqLworc3RhdGljIGludCBuZGlzY19hZGRyX29wdGlvbl9wYWQodW5zaWduZWQgc2hvcnQgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEFSUEhSRF9JTkZJTklCQU5EOiByZXR1cm4gMjsKKwlkZWZhdWx0OiAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5kaXNjX29wdF9hZGRyX3NwYWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIE5ESVNDX09QVF9TUEFDRShkZXYtPmFkZHJfbGVuICsgbmRpc2NfYWRkcl9vcHRpb25fcGFkKGRldi0+dHlwZSkpOworfQorCitzdGF0aWMgdTggKm5kaXNjX2ZpbGxfYWRkcl9vcHRpb24odTggKm9wdCwgaW50IHR5cGUsIHZvaWQgKmRhdGEsIGludCBkYXRhX2xlbiwKKwkJCQkgIHVuc2lnbmVkIHNob3J0IGFkZHJfdHlwZSkKK3sKKwlpbnQgc3BhY2UgPSBORElTQ19PUFRfU1BBQ0UoZGF0YV9sZW4pOworCWludCBwYWQgICA9IG5kaXNjX2FkZHJfb3B0aW9uX3BhZChhZGRyX3R5cGUpOworCisJb3B0WzBdID0gdHlwZTsKKwlvcHRbMV0gPSBzcGFjZT4+MzsKKworCW1lbXNldChvcHQgKyAyLCAwLCBwYWQpOworCW9wdCAgICs9IHBhZDsKKwlzcGFjZSAtPSBwYWQ7CisKKwltZW1jcHkob3B0KzIsIGRhdGEsIGRhdGFfbGVuKTsKKwlkYXRhX2xlbiArPSAyOworCW9wdCArPSBkYXRhX2xlbjsKKwlpZiAoKHNwYWNlIC09IGRhdGFfbGVuKSA+IDApCisJCW1lbXNldChvcHQsIDAsIHNwYWNlKTsKKwlyZXR1cm4gb3B0ICsgc3BhY2U7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmRfb3B0X2hkciAqbmRpc2NfbmV4dF9vcHRpb24oc3RydWN0IG5kX29wdF9oZHIgKmN1ciwKKwkJCQkJICAgIHN0cnVjdCBuZF9vcHRfaGRyICplbmQpCit7CisJaW50IHR5cGU7CisJaWYgKCFjdXIgfHwgIWVuZCB8fCBjdXIgPj0gZW5kKQorCQlyZXR1cm4gTlVMTDsKKwl0eXBlID0gY3VyLT5uZF9vcHRfdHlwZTsKKwlkbyB7CisJCWN1ciA9ICgodm9pZCAqKWN1cikgKyAoY3VyLT5uZF9vcHRfbGVuIDw8IDMpOworCX0gd2hpbGUoY3VyIDwgZW5kICYmIGN1ci0+bmRfb3B0X3R5cGUgIT0gdHlwZSk7CisJcmV0dXJuIChjdXIgPD0gZW5kICYmIGN1ci0+bmRfb3B0X3R5cGUgPT0gdHlwZSA/IGN1ciA6IE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IG5kaXNjX29wdGlvbnMgKm5kaXNjX3BhcnNlX29wdGlvbnModTggKm9wdCwgaW50IG9wdF9sZW4sCisJCQkJCQkgc3RydWN0IG5kaXNjX29wdGlvbnMgKm5kb3B0cykKK3sKKwlzdHJ1Y3QgbmRfb3B0X2hkciAqbmRfb3B0ID0gKHN0cnVjdCBuZF9vcHRfaGRyICopb3B0OworCisJaWYgKCFuZF9vcHQgfHwgb3B0X2xlbiA8IDAgfHwgIW5kb3B0cykKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KG5kb3B0cywgMCwgc2l6ZW9mKCpuZG9wdHMpKTsKKwl3aGlsZSAob3B0X2xlbikgeworCQlpbnQgbDsKKwkJaWYgKG9wdF9sZW4gPCBzaXplb2Yoc3RydWN0IG5kX29wdF9oZHIpKQorCQkJcmV0dXJuIE5VTEw7CisJCWwgPSBuZF9vcHQtPm5kX29wdF9sZW4gPDwgMzsKKwkJaWYgKG9wdF9sZW4gPCBsIHx8IGwgPT0gMCkKKwkJCXJldHVybiBOVUxMOworCQlzd2l0Y2ggKG5kX29wdC0+bmRfb3B0X3R5cGUpIHsKKwkJY2FzZSBORF9PUFRfU09VUkNFX0xMX0FERFI6CisJCWNhc2UgTkRfT1BUX1RBUkdFVF9MTF9BRERSOgorCQljYXNlIE5EX09QVF9NVFU6CisJCWNhc2UgTkRfT1BUX1JFRElSRUNUX0hEUjoKKwkJCWlmIChuZG9wdHMtPm5kX29wdF9hcnJheVtuZF9vcHQtPm5kX29wdF90eXBlXSkgeworCQkJCU5EX1BSSU5USzIoS0VSTl9XQVJOSU5HCisJCQkJCSAgICIlcygpOiBkdXBsaWNhdGVkIE5ENiBvcHRpb24gZm91bmQ6IHR5cGU9JWRcbiIsCisJCQkJCSAgIF9fRlVOQ1RJT05fXywKKwkJCQkJICAgbmRfb3B0LT5uZF9vcHRfdHlwZSk7CisJCQl9IGVsc2UgeworCQkJCW5kb3B0cy0+bmRfb3B0X2FycmF5W25kX29wdC0+bmRfb3B0X3R5cGVdID0gbmRfb3B0OworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgTkRfT1BUX1BSRUZJWF9JTkZPOgorCQkJbmRvcHRzLT5uZF9vcHRzX3BpX2VuZCA9IG5kX29wdDsKKwkJCWlmIChuZG9wdHMtPm5kX29wdF9hcnJheVtuZF9vcHQtPm5kX29wdF90eXBlXSA9PSAwKQorCQkJCW5kb3B0cy0+bmRfb3B0X2FycmF5W25kX29wdC0+bmRfb3B0X3R5cGVdID0gbmRfb3B0OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKgorCQkJICogVW5rbm93biBvcHRpb25zIG11c3QgYmUgc2lsZW50bHkgaWdub3JlZCwKKwkJCSAqIHRvIGFjY29tbW9kYXRlIGZ1dHVyZSBleHRlbnNpb24gdG8gdGhlIHByb3RvY29sLgorCQkJICovCisJCQlORF9QUklOVEsyKEtFUk5fTk9USUNFCisJCQkJICAgIiVzKCk6IGlnbm9yZWQgdW5zdXBwb3J0ZWQgb3B0aW9uOyB0eXBlPSVkLCBsZW49JWRcbiIsCisJCQkJICAgX19GVU5DVElPTl9fLAorCQkJCSAgIG5kX29wdC0+bmRfb3B0X3R5cGUsIG5kX29wdC0+bmRfb3B0X2xlbik7CisJCX0KKwkJb3B0X2xlbiAtPSBsOworCQluZF9vcHQgPSAoKHZvaWQgKiluZF9vcHQpICsgbDsKKwl9CisJcmV0dXJuIG5kb3B0czsKK30KKworc3RhdGljIGlubGluZSB1OCAqbmRpc2Nfb3B0X2FkZHJfZGF0YShzdHJ1Y3QgbmRfb3B0X2hkciAqcCwKKwkJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXU4ICpsbGFkZHIgPSAodTggKikocCArIDEpOworCWludCBsbGFkZHJsZW4gPSBwLT5uZF9vcHRfbGVuIDw8IDM7CisJaW50IHByZXBhZCA9IG5kaXNjX2FkZHJfb3B0aW9uX3BhZChkZXYtPnR5cGUpOworCWlmIChsbGFkZHJsZW4gIT0gTkRJU0NfT1BUX1NQQUNFKGRldi0+YWRkcl9sZW4gKyBwcmVwYWQpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gKGxsYWRkciArIHByZXBhZCk7Cit9CisKK2ludCBuZGlzY19tY19tYXAoc3RydWN0IGluNl9hZGRyICphZGRyLCBjaGFyICpidWYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBkaXIpCit7CisJc3dpdGNoIChkZXYtPnR5cGUpIHsKKwljYXNlIEFSUEhSRF9FVEhFUjoKKwljYXNlIEFSUEhSRF9JRUVFODAyOgkvKiBOb3Qgc3VyZS4gQ2hlY2sgaXQgbGF0ZXIuIC0tQU5LICovCisJY2FzZSBBUlBIUkRfRkRESToKKwkJaXB2Nl9ldGhfbWNfbWFwKGFkZHIsIGJ1Zik7CisJCXJldHVybiAwOworCWNhc2UgQVJQSFJEX0lFRUU4MDJfVFI6CisJCWlwdjZfdHJfbWNfbWFwKGFkZHIsYnVmKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBBUlBIUkRfQVJDTkVUOgorCQlpcHY2X2FyY25ldF9tY19tYXAoYWRkciwgYnVmKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBBUlBIUkRfSU5GSU5JQkFORDoKKwkJaXB2Nl9pYl9tY19tYXAoYWRkciwgYnVmKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJaWYgKGRpcikgeworCQkJbWVtY3B5KGJ1ZiwgZGV2LT5icm9hZGNhc3QsIGRldi0+YWRkcl9sZW4pOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB1MzIgbmRpc2NfaGFzaChjb25zdCB2b2lkICpwa2V5LCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWNvbnN0IHUzMiAqcDMyID0gcGtleTsKKwl1MzIgYWRkcl9oYXNoLCBpOworCisJYWRkcl9oYXNoID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpIC8gc2l6ZW9mKHUzMikpOyBpKyspCisJCWFkZHJfaGFzaCBePSAqcDMyKys7CisKKwlyZXR1cm4gamhhc2hfMndvcmRzKGFkZHJfaGFzaCwgZGV2LT5pZmluZGV4LCBuZF90YmwuaGFzaF9ybmQpOworfQorCitzdGF0aWMgaW50IG5kaXNjX2NvbnN0cnVjdG9yKHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoKQoreworCXN0cnVjdCBpbjZfYWRkciAqYWRkciA9IChzdHJ1Y3QgaW42X2FkZHIqKSZuZWlnaC0+cHJpbWFyeV9rZXk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5laWdoLT5kZXY7CisJc3RydWN0IGluZXQ2X2RldiAqaW42X2RldjsKKwlzdHJ1Y3QgbmVpZ2hfcGFybXMgKnBhcm1zOworCWludCBpc19tdWx0aWNhc3QgPSBpcHY2X2FkZHJfaXNfbXVsdGljYXN0KGFkZHIpOworCisJcmN1X3JlYWRfbG9jaygpOworCWluNl9kZXYgPSBpbjZfZGV2X2dldChkZXYpOworCWlmIChpbjZfZGV2ID09IE5VTEwpIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBhcm1zID0gaW42X2Rldi0+bmRfcGFybXM7CisJX19uZWlnaF9wYXJtc19wdXQobmVpZ2gtPnBhcm1zKTsKKwluZWlnaC0+cGFybXMgPSBuZWlnaF9wYXJtc19jbG9uZShwYXJtcyk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwluZWlnaC0+dHlwZSA9IGlzX211bHRpY2FzdCA/IFJUTl9NVUxUSUNBU1QgOiBSVE5fVU5JQ0FTVDsKKwlpZiAoZGV2LT5oYXJkX2hlYWRlciA9PSBOVUxMKSB7CisJCW5laWdoLT5udWRfc3RhdGUgPSBOVURfTk9BUlA7CisJCW5laWdoLT5vcHMgPSAmbmRpc2NfZGlyZWN0X29wczsKKwkJbmVpZ2gtPm91dHB1dCA9IG5laWdoLT5vcHMtPnF1ZXVlX3htaXQ7CisJfSBlbHNlIHsKKwkJaWYgKGlzX211bHRpY2FzdCkgeworCQkJbmVpZ2gtPm51ZF9zdGF0ZSA9IE5VRF9OT0FSUDsKKwkJCW5kaXNjX21jX21hcChhZGRyLCBuZWlnaC0+aGEsIGRldiwgMSk7CisJCX0gZWxzZSBpZiAoZGV2LT5mbGFncyYoSUZGX05PQVJQfElGRl9MT09QQkFDSykpIHsKKwkJCW5laWdoLT5udWRfc3RhdGUgPSBOVURfTk9BUlA7CisJCQltZW1jcHkobmVpZ2gtPmhhLCBkZXYtPmRldl9hZGRyLCBkZXYtPmFkZHJfbGVuKTsKKwkJCWlmIChkZXYtPmZsYWdzJklGRl9MT09QQkFDSykKKwkJCQluZWlnaC0+dHlwZSA9IFJUTl9MT0NBTDsKKwkJfSBlbHNlIGlmIChkZXYtPmZsYWdzJklGRl9QT0lOVE9QT0lOVCkgeworCQkJbmVpZ2gtPm51ZF9zdGF0ZSA9IE5VRF9OT0FSUDsKKwkJCW1lbWNweShuZWlnaC0+aGEsIGRldi0+YnJvYWRjYXN0LCBkZXYtPmFkZHJfbGVuKTsKKwkJfQorCQlpZiAoZGV2LT5oYXJkX2hlYWRlcl9jYWNoZSkKKwkJCW5laWdoLT5vcHMgPSAmbmRpc2NfaGhfb3BzOworCQllbHNlCisJCQluZWlnaC0+b3BzID0gJm5kaXNjX2dlbmVyaWNfb3BzOworCQlpZiAobmVpZ2gtPm51ZF9zdGF0ZSZOVURfVkFMSUQpCisJCQluZWlnaC0+b3V0cHV0ID0gbmVpZ2gtPm9wcy0+Y29ubmVjdGVkX291dHB1dDsKKwkJZWxzZQorCQkJbmVpZ2gtPm91dHB1dCA9IG5laWdoLT5vcHMtPm91dHB1dDsKKwl9CisJaW42X2Rldl9wdXQoaW42X2Rldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG5kaXNjX2NvbnN0cnVjdG9yKHN0cnVjdCBwbmVpZ2hfZW50cnkgKm4pCit7CisJc3RydWN0IGluNl9hZGRyICphZGRyID0gKHN0cnVjdCBpbjZfYWRkciopJm4tPmtleTsKKwlzdHJ1Y3QgaW42X2FkZHIgbWFkZHI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG4tPmRldjsKKworCWlmIChkZXYgPT0gTlVMTCB8fCBfX2luNl9kZXZfZ2V0KGRldikgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJYWRkcmNvbmZfYWRkcl9zb2xpY3RfbXVsdChhZGRyLCAmbWFkZHIpOworCWlwdjZfZGV2X21jX2luYyhkZXYsICZtYWRkcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBuZGlzY19kZXN0cnVjdG9yKHN0cnVjdCBwbmVpZ2hfZW50cnkgKm4pCit7CisJc3RydWN0IGluNl9hZGRyICphZGRyID0gKHN0cnVjdCBpbjZfYWRkciopJm4tPmtleTsKKwlzdHJ1Y3QgaW42X2FkZHIgbWFkZHI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG4tPmRldjsKKworCWlmIChkZXYgPT0gTlVMTCB8fCBfX2luNl9kZXZfZ2V0KGRldikgPT0gTlVMTCkKKwkJcmV0dXJuOworCWFkZHJjb25mX2FkZHJfc29saWN0X211bHQoYWRkciwgJm1hZGRyKTsKKwlpcHY2X2Rldl9tY19kZWMoZGV2LCAmbWFkZHIpOworfQorCisvKgorICoJU2VuZCBhIE5laWdoYm91ciBBZHZlcnRpc2VtZW50CisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIG5kaXNjX2Zsb3dfaW5pdChzdHJ1Y3QgZmxvd2kgKmZsLCB1OCB0eXBlLAorCQkJICAgIHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIpCit7CisJbWVtc2V0KGZsLCAwLCBzaXplb2YoKmZsKSk7CisJaXB2Nl9hZGRyX2NvcHkoJmZsLT5mbDZfc3JjLCBzYWRkcik7CisJaXB2Nl9hZGRyX2NvcHkoJmZsLT5mbDZfZHN0LCBkYWRkcik7CisJZmwtPnByb3RvCSAJPSBJUFBST1RPX0lDTVBWNjsKKwlmbC0+ZmxfaWNtcF90eXBlCT0gdHlwZTsKKwlmbC0+ZmxfaWNtcF9jb2RlCT0gMDsKK30KKworc3RhdGljIHZvaWQgbmRpc2Nfc2VuZF9uYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwKKwkJICAgc3RydWN0IGluNl9hZGRyICpkYWRkciwgc3RydWN0IGluNl9hZGRyICpzb2xpY2l0ZWRfYWRkciwKKwkgCSAgIGludCByb3V0ZXIsIGludCBzb2xpY2l0ZWQsIGludCBvdmVycmlkZSwgaW50IGluY19vcHQpIAoreworCXN0cnVjdCBpbjZfYWRkciB0bXBhZGRyOworCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcDsKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OworCXN0cnVjdCBmbG93aSBmbDsKKwlzdHJ1Y3QgZHN0X2VudHJ5KiBkc3Q7CisgICAgICAgIHN0cnVjdCBzb2NrICpzayA9IG5kaXNjX3NvY2tldC0+c2s7CisJc3RydWN0IGluNl9hZGRyICpzcmNfYWRkcjsKKyAgICAgICAgc3RydWN0IG5kX21zZyAqbXNnOworICAgICAgICBpbnQgbGVuOworICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBlcnI7CisKKwlsZW4gPSBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSArIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOworCisJLyogZm9yIGFueWNhc3Qgb3IgcHJveHksIHNvbGljaXRlZF9hZGRyICE9IHNyY19hZGRyICovCisJaWZwID0gaXB2Nl9nZXRfaWZhZGRyKHNvbGljaXRlZF9hZGRyLCBkZXYsIDEpOworIAlpZiAoaWZwKSB7CisJCXNyY19hZGRyID0gc29saWNpdGVkX2FkZHI7CisJCWluNl9pZmFfcHV0KGlmcCk7CisJfSBlbHNlIHsKKwkJaWYgKGlwdjZfZGV2X2dldF9zYWRkcihkZXYsIGRhZGRyLCAmdG1wYWRkcikpCisJCQlyZXR1cm47CisJCXNyY19hZGRyID0gJnRtcGFkZHI7CisJfQorCisJbmRpc2NfZmxvd19pbml0KCZmbCwgTkRJU0NfTkVJR0hCT1VSX0FEVkVSVElTRU1FTlQsIHNyY19hZGRyLCBkYWRkcik7CisKKwlkc3QgPSBuZGlzY19kc3RfYWxsb2MoZGV2LCBuZWlnaCwgZGFkZHIsIGlwNl9vdXRwdXQpOworCWlmICghZHN0KQorCQlyZXR1cm47CisKKwllcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIE5VTEwsIDApOworCWlmIChlcnIgPCAwKSB7CisJCWRzdF9yZWxlYXNlKGRzdCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaW5jX29wdCkgeworCQlpZiAoZGV2LT5hZGRyX2xlbikKKwkJCWxlbiArPSBuZGlzY19vcHRfYWRkcl9zcGFjZShkZXYpOworCQllbHNlCisJCQlpbmNfb3B0ID0gMDsKKwl9CisKKwlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCBNQVhfSEVBREVSICsgbGVuICsgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSwKKwkJCQkgIDEsICZlcnIpOworCisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCU5EX1BSSU5USzAoS0VSTl9FUlIKKwkJCSAgICJJQ01QdjYgTkE6ICVzKCkgZmFpbGVkIHRvIGFsbG9jYXRlIGFuIHNrYi5cbiIsIAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJZHN0X3JlbGVhc2UoZHN0KTsKKwkJcmV0dXJuOworCX0KKworCXNrYl9yZXNlcnZlKHNrYiwgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSk7CisJaXA2X25kX2hkcihzaywgc2tiLCBkZXYsIHNyY19hZGRyLCBkYWRkciwgSVBQUk9UT19JQ01QVjYsIGxlbik7CisKKwltc2cgPSAoc3RydWN0IG5kX21zZyAqKXNrYl9wdXQoc2tiLCBsZW4pOworCXNrYi0+aC5yYXcgPSAodW5zaWduZWQgY2hhciopbXNnOworCisgICAgICAgIG1zZy0+aWNtcGguaWNtcDZfdHlwZSA9IE5ESVNDX05FSUdIQk9VUl9BRFZFUlRJU0VNRU5UOworICAgICAgICBtc2ctPmljbXBoLmljbXA2X2NvZGUgPSAwOworICAgICAgICBtc2ctPmljbXBoLmljbXA2X2Nrc3VtID0gMDsKKworICAgICAgICBtc2ctPmljbXBoLmljbXA2X3VudXNlZCA9IDA7CisgICAgICAgIG1zZy0+aWNtcGguaWNtcDZfcm91dGVyICAgID0gcm91dGVyOworICAgICAgICBtc2ctPmljbXBoLmljbXA2X3NvbGljaXRlZCA9IHNvbGljaXRlZDsKKyAgICAgICAgbXNnLT5pY21waC5pY21wNl9vdmVycmlkZSAgPSAhIW92ZXJyaWRlOworCisgICAgICAgIC8qIFNldCB0aGUgdGFyZ2V0IGFkZHJlc3MuICovCisJaXB2Nl9hZGRyX2NvcHkoJm1zZy0+dGFyZ2V0LCBzb2xpY2l0ZWRfYWRkcik7CisKKwlpZiAoaW5jX29wdCkKKwkJbmRpc2NfZmlsbF9hZGRyX29wdGlvbihtc2ctPm9wdCwgTkRfT1BUX1RBUkdFVF9MTF9BRERSLCBkZXYtPmRldl9hZGRyLAorCQkJCSAgICAgICBkZXYtPmFkZHJfbGVuLCBkZXYtPnR5cGUpOworCisJLyogY2hlY2tzdW0gKi8KKwltc2ctPmljbXBoLmljbXA2X2Nrc3VtID0gY3N1bV9pcHY2X21hZ2ljKHNyY19hZGRyLCBkYWRkciwgbGVuLCAKKwkJCQkJCSBJUFBST1RPX0lDTVBWNiwKKwkJCQkJCSBjc3VtX3BhcnRpYWwoKF9fdTggKikgbXNnLCAKKwkJCQkJCQkgICAgICBsZW4sIDApKTsKKworCXNrYi0+ZHN0ID0gZHN0OworCWlkZXYgPSBpbjZfZGV2X2dldChkc3QtPmRldik7CisJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CisJZXJyID0gTkZfSE9PSyhQRl9JTkVUNiwgTkZfSVA2X0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBkc3QtPmRldiwgZHN0X291dHB1dCk7CisJaWYgKCFlcnIpIHsKKwkJSUNNUDZfSU5DX1NUQVRTKGlkZXYsIElDTVA2X01JQl9PVVRORUlHSEJPUkFEVkVSVElTRU1FTlRTKTsKKwkJSUNNUDZfSU5DX1NUQVRTKGlkZXYsIElDTVA2X01JQl9PVVRNU0dTKTsKKwl9CisKKwlpZiAobGlrZWx5KGlkZXYgIT0gTlVMTCkpCisJCWluNl9kZXZfcHV0KGlkZXYpOworfSAgICAgICAgCisKK3ZvaWQgbmRpc2Nfc2VuZF9ucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwKKwkJICAgc3RydWN0IGluNl9hZGRyICpzb2xpY2l0LAorCQkgICBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyKSAKK3sKKwlzdHJ1Y3QgZmxvd2kgZmw7CisJc3RydWN0IGRzdF9lbnRyeSogZHN0OworCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CisgICAgICAgIHN0cnVjdCBzb2NrICpzayA9IG5kaXNjX3NvY2tldC0+c2s7CisgICAgICAgIHN0cnVjdCBza19idWZmICpza2I7CisgICAgICAgIHN0cnVjdCBuZF9tc2cgKm1zZzsKKwlzdHJ1Y3QgaW42X2FkZHIgYWRkcl9idWY7CisgICAgICAgIGludCBsZW47CisJaW50IGVycjsKKwlpbnQgc2VuZF9sbGluZm87CisKKwlpZiAoc2FkZHIgPT0gTlVMTCkgeworCQlpZiAoaXB2Nl9nZXRfbGxhZGRyKGRldiwgJmFkZHJfYnVmKSkKKwkJCXJldHVybjsKKwkJc2FkZHIgPSAmYWRkcl9idWY7CisJfQorCisJbmRpc2NfZmxvd19pbml0KCZmbCwgTkRJU0NfTkVJR0hCT1VSX1NPTElDSVRBVElPTiwgc2FkZHIsIGRhZGRyKTsKKworCWRzdCA9IG5kaXNjX2RzdF9hbGxvYyhkZXYsIG5laWdoLCBkYWRkciwgaXA2X291dHB1dCk7CisJaWYgKCFkc3QpCisJCXJldHVybjsKKworCWVyciA9IHhmcm1fbG9va3VwKCZkc3QsICZmbCwgTlVMTCwgMCk7CisJaWYgKGVyciA8IDApIHsKKwkJZHN0X3JlbGVhc2UoZHN0KTsKKwkJcmV0dXJuOworCX0KKworCWxlbiA9IHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpICsgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7CisJc2VuZF9sbGluZm8gPSBkZXYtPmFkZHJfbGVuICYmICFpcHY2X2FkZHJfYW55KHNhZGRyKTsKKwlpZiAoc2VuZF9sbGluZm8pCisJCWxlbiArPSBuZGlzY19vcHRfYWRkcl9zcGFjZShkZXYpOworCisJc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywgTUFYX0hFQURFUiArIGxlbiArIExMX1JFU0VSVkVEX1NQQUNFKGRldiksCisJCQkJICAxLCAmZXJyKTsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJTkRfUFJJTlRLMChLRVJOX0VSUgorCQkJICAgIklDTVB2NiBOQTogJXMoKSBmYWlsZWQgdG8gYWxsb2NhdGUgYW4gc2tiLlxuIiwgCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlkc3RfcmVsZWFzZShkc3QpOworCQlyZXR1cm47CisJfQorCisJc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKKwlpcDZfbmRfaGRyKHNrLCBza2IsIGRldiwgc2FkZHIsIGRhZGRyLCBJUFBST1RPX0lDTVBWNiwgbGVuKTsKKworCW1zZyA9IChzdHJ1Y3QgbmRfbXNnICopc2tiX3B1dChza2IsIGxlbik7CisJc2tiLT5oLnJhdyA9ICh1bnNpZ25lZCBjaGFyKiltc2c7CisJbXNnLT5pY21waC5pY21wNl90eXBlID0gTkRJU0NfTkVJR0hCT1VSX1NPTElDSVRBVElPTjsKKwltc2ctPmljbXBoLmljbXA2X2NvZGUgPSAwOworCW1zZy0+aWNtcGguaWNtcDZfY2tzdW0gPSAwOworCW1zZy0+aWNtcGguaWNtcDZfdW51c2VkID0gMDsKKworCS8qIFNldCB0aGUgdGFyZ2V0IGFkZHJlc3MuICovCisJaXB2Nl9hZGRyX2NvcHkoJm1zZy0+dGFyZ2V0LCBzb2xpY2l0KTsKKworCWlmIChzZW5kX2xsaW5mbykKKwkJbmRpc2NfZmlsbF9hZGRyX29wdGlvbihtc2ctPm9wdCwgTkRfT1BUX1NPVVJDRV9MTF9BRERSLCBkZXYtPmRldl9hZGRyLAorCQkJCSAgICAgICBkZXYtPmFkZHJfbGVuLCBkZXYtPnR5cGUpOworCisJLyogY2hlY2tzdW0gKi8KKwltc2ctPmljbXBoLmljbXA2X2Nrc3VtID0gY3N1bV9pcHY2X21hZ2ljKCZza2ItPm5oLmlwdjZoLT5zYWRkciwKKwkJCQkJCSBkYWRkciwgbGVuLCAKKwkJCQkJCSBJUFBST1RPX0lDTVBWNiwKKwkJCQkJCSBjc3VtX3BhcnRpYWwoKF9fdTggKikgbXNnLCAKKwkJCQkJCQkgICAgICBsZW4sIDApKTsKKwkvKiBzZW5kIGl0ISAqLworCXNrYi0+ZHN0ID0gZHN0OworCWlkZXYgPSBpbjZfZGV2X2dldChkc3QtPmRldik7CisJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CisJZXJyID0gTkZfSE9PSyhQRl9JTkVUNiwgTkZfSVA2X0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBkc3QtPmRldiwgZHN0X291dHB1dCk7CisJaWYgKCFlcnIpIHsKKwkJSUNNUDZfSU5DX1NUQVRTKGlkZXYsIElDTVA2X01JQl9PVVRORUlHSEJPUlNPTElDSVRTKTsKKwkJSUNNUDZfSU5DX1NUQVRTKGlkZXYsIElDTVA2X01JQl9PVVRNU0dTKTsKKwl9CisKKwlpZiAobGlrZWx5KGlkZXYgIT0gTlVMTCkpCisJCWluNl9kZXZfcHV0KGlkZXYpOworfQorCit2b2lkIG5kaXNjX3NlbmRfcnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGluNl9hZGRyICpzYWRkciwKKwkJICAgc3RydWN0IGluNl9hZGRyICpkYWRkcikKK3sKKwlzdHJ1Y3QgZmxvd2kgZmw7CisJc3RydWN0IGRzdF9lbnRyeSogZHN0OworCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CisJc3RydWN0IHNvY2sgKnNrID0gbmRpc2Nfc29ja2V0LT5zazsKKyAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKyAgICAgICAgc3RydWN0IGljbXA2aGRyICpoZHI7CisJX191OCAqIG9wdDsKKyAgICAgICAgaW50IGxlbjsKKwlpbnQgZXJyOworCisJbmRpc2NfZmxvd19pbml0KCZmbCwgTkRJU0NfUk9VVEVSX1NPTElDSVRBVElPTiwgc2FkZHIsIGRhZGRyKTsKKworCWRzdCA9IG5kaXNjX2RzdF9hbGxvYyhkZXYsIE5VTEwsIGRhZGRyLCBpcDZfb3V0cHV0KTsKKwlpZiAoIWRzdCkKKwkJcmV0dXJuOworCisJZXJyID0geGZybV9sb29rdXAoJmRzdCwgJmZsLCBOVUxMLCAwKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkc3RfcmVsZWFzZShkc3QpOworCQlyZXR1cm47CisJfQorCisJbGVuID0gc2l6ZW9mKHN0cnVjdCBpY21wNmhkcik7CisJaWYgKGRldi0+YWRkcl9sZW4pCisJCWxlbiArPSBuZGlzY19vcHRfYWRkcl9zcGFjZShkZXYpOworCisgICAgICAgIHNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssIE1BWF9IRUFERVIgKyBsZW4gKyBMTF9SRVNFUlZFRF9TUEFDRShkZXYpLAorCQkJCSAgMSwgJmVycik7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCU5EX1BSSU5USzAoS0VSTl9FUlIKKwkJCSAgICJJQ01QdjYgUlM6ICVzKCkgZmFpbGVkIHRvIGFsbG9jYXRlIGFuIHNrYi5cbiIsIAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJZHN0X3JlbGVhc2UoZHN0KTsKKwkJcmV0dXJuOworCX0KKworCXNrYl9yZXNlcnZlKHNrYiwgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSk7CisJaXA2X25kX2hkcihzaywgc2tiLCBkZXYsIHNhZGRyLCBkYWRkciwgSVBQUk9UT19JQ01QVjYsIGxlbik7CisKKyAgICAgICAgaGRyID0gKHN0cnVjdCBpY21wNmhkciAqKXNrYl9wdXQoc2tiLCBsZW4pOworICAgICAgICBza2ItPmgucmF3ID0gKHVuc2lnbmVkIGNoYXIqKWhkcjsKKyAgICAgICAgaGRyLT5pY21wNl90eXBlID0gTkRJU0NfUk9VVEVSX1NPTElDSVRBVElPTjsKKyAgICAgICAgaGRyLT5pY21wNl9jb2RlID0gMDsKKyAgICAgICAgaGRyLT5pY21wNl9ja3N1bSA9IDA7CisgICAgICAgIGhkci0+aWNtcDZfdW51c2VkID0gMDsKKworCW9wdCA9ICh1OCopIChoZHIgKyAxKTsKKworCWlmIChkZXYtPmFkZHJfbGVuKQorCQluZGlzY19maWxsX2FkZHJfb3B0aW9uKG9wdCwgTkRfT1BUX1NPVVJDRV9MTF9BRERSLCBkZXYtPmRldl9hZGRyLAorCQkJCSAgICAgICBkZXYtPmFkZHJfbGVuLCBkZXYtPnR5cGUpOworCisJLyogY2hlY2tzdW0gKi8KKwloZHItPmljbXA2X2Nrc3VtID0gY3N1bV9pcHY2X21hZ2ljKCZza2ItPm5oLmlwdjZoLT5zYWRkciwgZGFkZHIsIGxlbiwKKwkJCQkJICAgSVBQUk9UT19JQ01QVjYsCisJCQkJCSAgIGNzdW1fcGFydGlhbCgoX191OCAqKSBoZHIsIGxlbiwgMCkpOworCisJLyogc2VuZCBpdCEgKi8KKwlza2ItPmRzdCA9IGRzdDsKKwlpZGV2ID0gaW42X2Rldl9nZXQoZHN0LT5kZXYpOworCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfT1VUUkVRVUVTVFMpOwkKKwllcnIgPSBORl9IT09LKFBGX0lORVQ2LCBORl9JUDZfTE9DQUxfT1VULCBza2IsIE5VTEwsIGRzdC0+ZGV2LCBkc3Rfb3V0cHV0KTsKKwlpZiAoIWVycikgeworCQlJQ01QNl9JTkNfU1RBVFMoaWRldiwgSUNNUDZfTUlCX09VVFJPVVRFUlNPTElDSVRTKTsKKwkJSUNNUDZfSU5DX1NUQVRTKGlkZXYsIElDTVA2X01JQl9PVVRNU0dTKTsKKwl9CisKKwlpZiAobGlrZWx5KGlkZXYgIT0gTlVMTCkpCisJCWluNl9kZXZfcHV0KGlkZXYpOworfQorCQkgICAKKworc3RhdGljIHZvaWQgbmRpc2NfZXJyb3JfcmVwb3J0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCS8qCisJICoJIlRoZSBzZW5kZXIgTVVTVCByZXR1cm4gYW4gSUNNUAorCSAqCSBkZXN0aW5hdGlvbiB1bnJlYWNoYWJsZSIKKwkgKi8KKwlkc3RfbGlua19mYWlsdXJlKHNrYik7CisJa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qIENhbGxlZCB3aXRoIGxvY2tlZCBuZWlnaDogZWl0aGVyIHJlYWQgb3IgYm90aCAqLworCitzdGF0aWMgdm9pZCBuZGlzY19zb2xpY2l0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpbjZfYWRkciAqc2FkZHIgPSBOVUxMOworCXN0cnVjdCBpbjZfYWRkciBtY2FkZHI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5laWdoLT5kZXY7CisJc3RydWN0IGluNl9hZGRyICp0YXJnZXQgPSAoc3RydWN0IGluNl9hZGRyICopJm5laWdoLT5wcmltYXJ5X2tleTsKKwlpbnQgcHJvYmVzID0gYXRvbWljX3JlYWQoJm5laWdoLT5wcm9iZXMpOworCisJaWYgKHNrYiAmJiBpcHY2X2Noa19hZGRyKCZza2ItPm5oLmlwdjZoLT5zYWRkciwgZGV2LCAxKSkKKwkJc2FkZHIgPSAmc2tiLT5uaC5pcHY2aC0+c2FkZHI7CisKKwlpZiAoKHByb2JlcyAtPSBuZWlnaC0+cGFybXMtPnVjYXN0X3Byb2JlcykgPCAwKSB7CisJCWlmICghKG5laWdoLT5udWRfc3RhdGUgJiBOVURfVkFMSUQpKSB7CisJCQlORF9QUklOVEsxKEtFUk5fREVCVUcKKwkJCQkgICAiJXMoKTogdHJ5aW5nIHRvIHVjYXN0IHByb2JlIGluIE5VRF9JTlZBTElEOiAiCisJCQkJICAgIiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eFxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18sCisJCQkJICAgTklQNigqdGFyZ2V0KSk7CisJCX0KKwkJbmRpc2Nfc2VuZF9ucyhkZXYsIG5laWdoLCB0YXJnZXQsIHRhcmdldCwgc2FkZHIpOworCX0gZWxzZSBpZiAoKHByb2JlcyAtPSBuZWlnaC0+cGFybXMtPmFwcF9wcm9iZXMpIDwgMCkgeworI2lmZGVmIENPTkZJR19BUlBECisJCW5laWdoX2FwcF9ucyhuZWlnaCk7CisjZW5kaWYKKwl9IGVsc2UgeworCQlhZGRyY29uZl9hZGRyX3NvbGljdF9tdWx0KHRhcmdldCwgJm1jYWRkcik7CisJCW5kaXNjX3NlbmRfbnMoZGV2LCBOVUxMLCB0YXJnZXQsICZtY2FkZHIsIHNhZGRyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG5kaXNjX3JlY3ZfbnMoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmRfbXNnICptc2cgPSAoc3RydWN0IG5kX21zZyAqKXNrYi0+aC5yYXc7CisJc3RydWN0IGluNl9hZGRyICpzYWRkciA9ICZza2ItPm5oLmlwdjZoLT5zYWRkcjsKKwlzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyID0gJnNrYi0+bmguaXB2NmgtPmRhZGRyOworCXU4ICpsbGFkZHIgPSBOVUxMOworCXUzMiBuZG9wdGxlbiA9IHNrYi0+dGFpbCAtIG1zZy0+b3B0OworCXN0cnVjdCBuZGlzY19vcHRpb25zIG5kb3B0czsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CisJc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwOworCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBOVUxMOworCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoOworCWludCBkYWQgPSBpcHY2X2FkZHJfYW55KHNhZGRyKTsKKwlpbnQgaW5jOworCisJaWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJm1zZy0+dGFyZ2V0KSkgeworCQlORF9QUklOVEsyKEtFUk5fV0FSTklORyAKKwkJCSAgICJJQ01QdjYgTlM6IG11bHRpY2FzdCB0YXJnZXQgYWRkcmVzcyIpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBSRkMyNDYxIDcuMS4xOgorCSAqIERBRCBoYXMgdG8gYmUgZGVzdGluZWQgZm9yIHNvbGljaXRlZCBub2RlIG11bHRpY2FzdCBhZGRyZXNzLgorCSAqLworCWlmIChkYWQgJiYKKwkgICAgIShkYWRkci0+czZfYWRkcjMyWzBdID09IGh0b25sKDB4ZmYwMjAwMDApICYmCisJICAgICAgZGFkZHItPnM2X2FkZHIzMlsxXSA9PSBodG9ubCgweDAwMDAwMDAwKSAmJgorCSAgICAgIGRhZGRyLT5zNl9hZGRyMzJbMl0gPT0gaHRvbmwoMHgwMDAwMDAwMSkgJiYKKwkgICAgICBkYWRkci0+czZfYWRkciBbMTJdID09IDB4ZmYgKSkgeworCQlORF9QUklOVEsyKEtFUk5fV0FSTklORworCQkJICAgIklDTVB2NiBOUzogYmFkIERBRCBwYWNrZXQgKHdyb25nIGRlc3RpbmF0aW9uKVxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIW5kaXNjX3BhcnNlX29wdGlvbnMobXNnLT5vcHQsIG5kb3B0bGVuLCAmbmRvcHRzKSkgeworCQlORF9QUklOVEsyKEtFUk5fV0FSTklORyAKKwkJCSAgICJJQ01QdjYgTlM6IGludmFsaWQgTkQgb3B0aW9uc1xuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAobmRvcHRzLm5kX29wdHNfc3JjX2xsYWRkcikgeworCQlsbGFkZHIgPSBuZGlzY19vcHRfYWRkcl9kYXRhKG5kb3B0cy5uZF9vcHRzX3NyY19sbGFkZHIsIGRldik7CisJCWlmICghbGxhZGRyKSB7CisJCQlORF9QUklOVEsyKEtFUk5fV0FSTklORworCQkJCSAgICJJQ01QdjYgTlM6IGludmFsaWQgbGluay1sYXllciBhZGRyZXNzIGxlbmd0aFxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBSRkMyNDYxIDcuMS4xOgorCSAJICoJSWYgdGhlIElQIHNvdXJjZSBhZGRyZXNzIGlzIHRoZSB1bnNwZWNpZmllZCBhZGRyZXNzLCAKKwkJICoJdGhlcmUgTVVTVCBOT1QgYmUgc291cmNlIGxpbmstbGF5ZXIgYWRkcmVzcyBvcHRpb24gCisJCSAqCWluIHRoZSBtZXNzYWdlLgorCQkgKi8KKwkJaWYgKGRhZCkgeworCQkJTkRfUFJJTlRLMihLRVJOX1dBUk5JTkcgCisJCQkJICAgIklDTVB2NiBOUzogYmFkIERBRCBwYWNrZXQgKGxpbmstbGF5ZXIgYWRkcmVzcyBvcHRpb24pXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWluYyA9IGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoZGFkZHIpOworCisJaWYgKChpZnAgPSBpcHY2X2dldF9pZmFkZHIoJm1zZy0+dGFyZ2V0LCBkZXYsIDEpKSAhPSBOVUxMKSB7CisJCWlmIChpZnAtPmZsYWdzICYgSUZBX0ZfVEVOVEFUSVZFKSB7CisJCQkvKiBBZGRyZXNzIGlzIHRlbnRhdGl2ZS4gSWYgdGhlIHNvdXJjZQorCQkJICAgaXMgdW5zcGVjaWZpZWQgYWRkcmVzcywgaXQgaXMgc29tZW9uZQorCQkJICAgZG9lcyBEQUQsIG90aGVyd2lzZSB3ZSBpZ25vcmUgc29saWNpdGF0aW9ucworCQkJICAgdW50aWwgREFEIHRpbWVyIGV4cGlyZXMuCisJCQkgKi8KKwkJCWlmICghZGFkKQorCQkJCWdvdG8gb3V0OworCQkJaWYgKGRldi0+dHlwZSA9PSBBUlBIUkRfSUVFRTgwMl9UUikgeworCQkJCXVuc2lnbmVkIGNoYXIgKnNhZHIgPSBza2ItPm1hYy5yYXc7CisJCQkJaWYgKCgoc2Fkcls4XSBeIGRldi0+ZGV2X2FkZHJbMF0pICYgMHg3ZikgPT0gMCAmJgorCQkJCSAgICBzYWRyWzldID09IGRldi0+ZGV2X2FkZHJbMV0gJiYKKwkJCQkgICAgc2FkclsxMF0gPT0gZGV2LT5kZXZfYWRkclsyXSAmJgorCQkJCSAgICBzYWRyWzExXSA9PSBkZXYtPmRldl9hZGRyWzNdICYmCisJCQkJICAgIHNhZHJbMTJdID09IGRldi0+ZGV2X2FkZHJbNF0gJiYKKwkJCQkgICAgc2FkclsxM10gPT0gZGV2LT5kZXZfYWRkcls1XSkgeworCQkJCQkvKiBsb29wZWQtYmFjayB0byB1cyAqLworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQl9CisJCQlhZGRyY29uZl9kYWRfZmFpbHVyZShpZnApOyAKKwkJCXJldHVybjsKKwkJfQorCisJCWlkZXYgPSBpZnAtPmlkZXY7CisJfSBlbHNlIHsKKwkJaWRldiA9IGluNl9kZXZfZ2V0KGRldik7CisJCWlmICghaWRldikgeworCQkJLyogWFhYOiBjb3VudCB0aGlzIGRyb3A/ICovCisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoaXB2Nl9jaGtfYWNhc3RfYWRkcihkZXYsICZtc2ctPnRhcmdldCkgfHwKKwkJICAgIChpZGV2LT5jbmYuZm9yd2FyZGluZyAmJiAKKwkJICAgICBwbmVpZ2hfbG9va3VwKCZuZF90YmwsICZtc2ctPnRhcmdldCwgZGV2LCAwKSkpIHsKKwkJCWlmIChza2ItPnN0YW1wLnR2X3NlYyAhPSBMT0NBTExZX0VOUVVFVUVEICYmCisJCQkgICAgc2tiLT5wa3RfdHlwZSAhPSBQQUNLRVRfSE9TVCAmJgorCQkJICAgIGluYyAhPSAwICYmCisJCQkgICAgaWRldi0+bmRfcGFybXMtPnByb3h5X2RlbGF5ICE9IDApIHsKKwkJCQkvKgorCQkJCSAqIGZvciBhbnljYXN0IG9yIHByb3h5LAorCQkJCSAqIHNlbmRlciBzaG91bGQgZGVsYXkgaXRzIHJlc3BvbnNlIAorCQkJCSAqIGJ5IGEgcmFuZG9tIHRpbWUgYmV0d2VlbiAwIGFuZCAKKwkJCQkgKiBNQVhfQU5ZQ0FTVF9ERUxBWV9USU1FIHNlY29uZHMuCisJCQkJICogKFJGQzI0NjEpIC0tIHlvc2hmdWppCisJCQkJICovCisJCQkJc3RydWN0IHNrX2J1ZmYgKm4gPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJCQlpZiAobikKKwkJCQkJcG5laWdoX2VucXVldWUoJm5kX3RibCwgaWRldi0+bmRfcGFybXMsIG4pOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9IGVsc2UKKwkJCWdvdG8gb3V0OworCX0KKworCWlmIChkYWQpIHsKKwkJc3RydWN0IGluNl9hZGRyIG1hZGRyOworCisJCWlwdjZfYWRkcl9hbGxfbm9kZXMoJm1hZGRyKTsKKwkJbmRpc2Nfc2VuZF9uYShkZXYsIE5VTEwsICZtYWRkciwgJm1zZy0+dGFyZ2V0LAorCQkJICAgICAgaWRldi0+Y25mLmZvcndhcmRpbmcsIDAsIChpZnAgIT0gTlVMTCksIDEpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoaW5jKQorCQlORUlHSF9DQUNIRV9TVEFUX0lOQygmbmRfdGJsLCByY3ZfcHJvYmVzX21jYXN0KTsKKwllbHNlCisJCU5FSUdIX0NBQ0hFX1NUQVRfSU5DKCZuZF90YmwsIHJjdl9wcm9iZXNfdWNhc3QpOworCisJLyogCisJICoJdXBkYXRlIC8gY3JlYXRlIGNhY2hlIGVudHJ5CisJICoJZm9yIHRoZSBzb3VyY2UgYWRkcmVzcworCSAqLworCW5laWdoID0gX19uZWlnaF9sb29rdXAoJm5kX3RibCwgc2FkZHIsIGRldiwKKwkJCSAgICAgICAhaW5jIHx8IGxsYWRkciB8fCAhZGV2LT5hZGRyX2xlbik7CisJaWYgKG5laWdoKQorCQluZWlnaF91cGRhdGUobmVpZ2gsIGxsYWRkciwgTlVEX1NUQUxFLCAKKwkJCSAgICAgTkVJR0hfVVBEQVRFX0ZfV0VBS19PVkVSUklERXwKKwkJCSAgICAgTkVJR0hfVVBEQVRFX0ZfT1ZFUlJJREUpOworCWlmIChuZWlnaCB8fCAhZGV2LT5oYXJkX2hlYWRlcikgeworCQluZGlzY19zZW5kX25hKGRldiwgbmVpZ2gsIHNhZGRyLCAmbXNnLT50YXJnZXQsCisJCQkgICAgICBpZGV2LT5jbmYuZm9yd2FyZGluZywgCisJCQkgICAgICAxLCAoaWZwICE9IE5VTEwgJiYgaW5jKSwgaW5jKTsKKwkJaWYgKG5laWdoKQorCQkJbmVpZ2hfcmVsZWFzZShuZWlnaCk7CisJfQorCitvdXQ6CisJaWYgKGlmcCkKKwkJaW42X2lmYV9wdXQoaWZwKTsKKwllbHNlCisJCWluNl9kZXZfcHV0KGlkZXYpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBuZGlzY19yZWN2X25hKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5kX21zZyAqbXNnID0gKHN0cnVjdCBuZF9tc2cgKilza2ItPmgucmF3OworCXN0cnVjdCBpbjZfYWRkciAqc2FkZHIgPSAmc2tiLT5uaC5pcHY2aC0+c2FkZHI7CisJc3RydWN0IGluNl9hZGRyICpkYWRkciA9ICZza2ItPm5oLmlwdjZoLT5kYWRkcjsKKwl1OCAqbGxhZGRyID0gTlVMTDsKKwl1MzIgbmRvcHRsZW4gPSBza2ItPnRhaWwgLSBtc2ctPm9wdDsKKwlzdHJ1Y3QgbmRpc2Nfb3B0aW9ucyBuZG9wdHM7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OworCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcDsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaDsKKworCWlmIChza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgbmRfbXNnKSkgeworCQlORF9QUklOVEsyKEtFUk5fV0FSTklORworCQkJICAgIklDTVB2NiBOQTogcGFja2V0IHRvbyBzaG9ydFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmbXNnLT50YXJnZXQpKSB7CisJCU5EX1BSSU5USzIoS0VSTl9XQVJOSU5HCisJCQkgICAiSUNNUHY2IE5BOiB0YXJnZXQgYWRkcmVzcyBpcyBtdWx0aWNhc3QuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KGRhZGRyKSAmJgorCSAgICBtc2ctPmljbXBoLmljbXA2X3NvbGljaXRlZCkgeworCQlORF9QUklOVEsyKEtFUk5fV0FSTklORworCQkJICAgIklDTVB2NiBOQTogc29saWNpdGVkIE5BIGlzIG11bHRpY2FzdGVkLlxuIik7CisJCXJldHVybjsKKwl9CisJCQorCWlmICghbmRpc2NfcGFyc2Vfb3B0aW9ucyhtc2ctPm9wdCwgbmRvcHRsZW4sICZuZG9wdHMpKSB7CisJCU5EX1BSSU5USzIoS0VSTl9XQVJOSU5HCisJCQkgICAiSUNNUHY2IE5TOiBpbnZhbGlkIE5EIG9wdGlvblxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKG5kb3B0cy5uZF9vcHRzX3RndF9sbGFkZHIpIHsKKwkJbGxhZGRyID0gbmRpc2Nfb3B0X2FkZHJfZGF0YShuZG9wdHMubmRfb3B0c190Z3RfbGxhZGRyLCBkZXYpOworCQlpZiAoIWxsYWRkcikgeworCQkJTkRfUFJJTlRLMihLRVJOX1dBUk5JTkcKKwkJCQkgICAiSUNNUHY2IE5BOiBpbnZhbGlkIGxpbmstbGF5ZXIgYWRkcmVzcyBsZW5ndGhcbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorCWlmICgoaWZwID0gaXB2Nl9nZXRfaWZhZGRyKCZtc2ctPnRhcmdldCwgZGV2LCAxKSkpIHsKKwkJaWYgKGlmcC0+ZmxhZ3MgJiBJRkFfRl9URU5UQVRJVkUpIHsKKwkJCWFkZHJjb25mX2RhZF9mYWlsdXJlKGlmcCk7CisJCQlyZXR1cm47CisJCX0KKwkJLyogV2hhdCBzaG91bGQgd2UgbWFrZSBub3c/IFRoZSBhZHZlcnRpc2VtZW50CisJCSAgIGlzIGludmFsaWQsIGJ1dCBuZGlzYyBzcGVjcyBzYXkgbm90aGluZworCQkgICBhYm91dCBpdC4gSXQgY291bGQgYmUgbWlzY29uZmlndXJhdGlvbiwgb3IKKwkJICAgYW4gc21hcnQgcHJveHkgYWdlbnQgdHJpZXMgdG8gaGVscCB1cyA6LSkKKwkJICovCisJCU5EX1BSSU5USzEoS0VSTl9XQVJOSU5HCisJCQkgICAiSUNNUHY2IE5BOiBzb21lb25lIGFkdmVydGlzZXMgb3VyIGFkZHJlc3Mgb24gJXMhXG4iLAorCQkJICAgaWZwLT5pZGV2LT5kZXYtPm5hbWUpOworCQlpbjZfaWZhX3B1dChpZnApOworCQlyZXR1cm47CisJfQorCW5laWdoID0gbmVpZ2hfbG9va3VwKCZuZF90YmwsICZtc2ctPnRhcmdldCwgZGV2KTsKKworCWlmIChuZWlnaCkgeworCQl1OCBvbGRfZmxhZ3MgPSBuZWlnaC0+ZmxhZ3M7CisKKwkJaWYgKG5laWdoLT5udWRfc3RhdGUgJiBOVURfRkFJTEVEKQorCQkJZ290byBvdXQ7CisKKwkJbmVpZ2hfdXBkYXRlKG5laWdoLCBsbGFkZHIsCisJCQkgICAgIG1zZy0+aWNtcGguaWNtcDZfc29saWNpdGVkID8gTlVEX1JFQUNIQUJMRSA6IE5VRF9TVEFMRSwKKwkJCSAgICAgTkVJR0hfVVBEQVRFX0ZfV0VBS19PVkVSUklERXwKKwkJCSAgICAgKG1zZy0+aWNtcGguaWNtcDZfb3ZlcnJpZGUgPyBORUlHSF9VUERBVEVfRl9PVkVSUklERSA6IDApfAorCQkJICAgICBORUlHSF9VUERBVEVfRl9PVkVSUklERV9JU1JPVVRFUnwKKwkJCSAgICAgKG1zZy0+aWNtcGguaWNtcDZfcm91dGVyID8gTkVJR0hfVVBEQVRFX0ZfSVNST1VURVIgOiAwKSk7CisKKwkJaWYgKChvbGRfZmxhZ3MgJiB+bmVpZ2gtPmZsYWdzKSAmIE5URl9ST1VURVIpIHsKKwkJCS8qCisJCQkgKiBDaGFuZ2U6IHJvdXRlciB0byBob3N0CisJCQkgKi8KKwkJCXN0cnVjdCBydDZfaW5mbyAqcnQ7CisJCQlydCA9IHJ0Nl9nZXRfZGZsdF9yb3V0ZXIoc2FkZHIsIGRldik7CisJCQlpZiAocnQpCisJCQkJaXA2X2RlbF9ydChydCwgTlVMTCwgTlVMTCk7CisJCX0KKworb3V0OgorCQluZWlnaF9yZWxlYXNlKG5laWdoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG5kaXNjX3JlY3ZfcnMoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcnNfbXNnICpyc19tc2cgPSAoc3RydWN0IHJzX21zZyAqKSBza2ItPmgucmF3OworCXVuc2lnbmVkIGxvbmcgbmRvcHRsZW4gPSBza2ItPmxlbiAtIHNpemVvZigqcnNfbXNnKTsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaDsKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OworCXN0cnVjdCBpbjZfYWRkciAqc2FkZHIgPSAmc2tiLT5uaC5pcHY2aC0+c2FkZHI7CisJc3RydWN0IG5kaXNjX29wdGlvbnMgbmRvcHRzOworCXU4ICpsbGFkZHIgPSBOVUxMOworCisJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKCpyc19tc2cpKQorCQlyZXR1cm47CisKKwlpZGV2ID0gaW42X2Rldl9nZXQoc2tiLT5kZXYpOworCWlmICghaWRldikgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJTkRfUFJJTlRLMSgiSUNNUDYgUlM6IGNhbid0IGZpbmQgaW42IGRldmljZVxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBEb24ndCBhY2NlcHQgUlMgaWYgd2UncmUgbm90IGluIHJvdXRlciBtb2RlICovCisJaWYgKCFpZGV2LT5jbmYuZm9yd2FyZGluZykKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIERvbid0IHVwZGF0ZSBOQ0UgaWYgc3JjID0gOjo7CisJICogdGhpcyBpbXBsaWVzIHRoYXQgdGhlIHNvdXJjZSBub2RlIGhhcyBubyBpcCBhZGRyZXNzIGFzc2lnbmVkIHlldC4KKwkgKi8KKwlpZiAoaXB2Nl9hZGRyX2FueShzYWRkcikpCisJCWdvdG8gb3V0OworCisJLyogUGFyc2UgTkQgb3B0aW9ucyAqLworCWlmICghbmRpc2NfcGFyc2Vfb3B0aW9ucyhyc19tc2ctPm9wdCwgbmRvcHRsZW4sICZuZG9wdHMpKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlORF9QUklOVEsyKCJJQ01QNiBOUzogaW52YWxpZCBORCBvcHRpb24sIGlnbm9yZWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobmRvcHRzLm5kX29wdHNfc3JjX2xsYWRkcikgeworCQlsbGFkZHIgPSBuZGlzY19vcHRfYWRkcl9kYXRhKG5kb3B0cy5uZF9vcHRzX3NyY19sbGFkZHIsCisJCQkJCSAgICAgc2tiLT5kZXYpOworCQlpZiAoIWxsYWRkcikKKwkJCWdvdG8gb3V0OworCX0KKworCW5laWdoID0gX19uZWlnaF9sb29rdXAoJm5kX3RibCwgc2FkZHIsIHNrYi0+ZGV2LCAxKTsKKwlpZiAobmVpZ2gpIHsKKwkJbmVpZ2hfdXBkYXRlKG5laWdoLCBsbGFkZHIsIE5VRF9TVEFMRSwKKwkJCSAgICAgTkVJR0hfVVBEQVRFX0ZfV0VBS19PVkVSUklERXwKKwkJCSAgICAgTkVJR0hfVVBEQVRFX0ZfT1ZFUlJJREV8CisJCQkgICAgIE5FSUdIX1VQREFURV9GX09WRVJSSURFX0lTUk9VVEVSKTsKKwkJbmVpZ2hfcmVsZWFzZShuZWlnaCk7CisJfQorb3V0OgorCWluNl9kZXZfcHV0KGlkZXYpOworfQorCitzdGF0aWMgdm9pZCBuZGlzY19yb3V0ZXJfZGlzY292ZXJ5KHN0cnVjdCBza19idWZmICpza2IpCit7CisgICAgICAgIHN0cnVjdCByYV9tc2cgKnJhX21zZyA9IChzdHJ1Y3QgcmFfbXNnICopIHNrYi0+aC5yYXc7CisJc3RydWN0IG5laWdoYm91ciAqbmVpZ2ggPSBOVUxMOworCXN0cnVjdCBpbmV0Nl9kZXYgKmluNl9kZXY7CisJc3RydWN0IHJ0Nl9pbmZvICpydDsKKwlpbnQgbGlmZXRpbWU7CisJc3RydWN0IG5kaXNjX29wdGlvbnMgbmRvcHRzOworCWludCBvcHRsZW47CisKKwlfX3U4ICogb3B0ID0gKF9fdTggKikocmFfbXNnICsgMSk7CisKKwlvcHRsZW4gPSAoc2tiLT50YWlsIC0gc2tiLT5oLnJhdykgLSBzaXplb2Yoc3RydWN0IHJhX21zZyk7CisKKwlpZiAoIShpcHY2X2FkZHJfdHlwZSgmc2tiLT5uaC5pcHY2aC0+c2FkZHIpICYgSVBWNl9BRERSX0xJTktMT0NBTCkpIHsKKwkJTkRfUFJJTlRLMihLRVJOX1dBUk5JTkcKKwkJCSAgICJJQ01QdjYgUkE6IHNvdXJjZSBhZGRyZXNzIGlzIG5vdCBsaW5rLWxvY2FsLlxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKG9wdGxlbiA8IDApIHsKKwkJTkRfUFJJTlRLMihLRVJOX1dBUk5JTkcgCisJCQkgICAiSUNNUHY2IFJBOiBwYWNrZXQgdG9vIHNob3J0XG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICoJc2V0IHRoZSBSQV9SRUNWIGZsYWcgaW4gdGhlIGludGVyZmFjZQorCSAqLworCisJaW42X2RldiA9IGluNl9kZXZfZ2V0KHNrYi0+ZGV2KTsKKwlpZiAoaW42X2RldiA9PSBOVUxMKSB7CisJCU5EX1BSSU5USzAoS0VSTl9FUlIKKwkJCSAgICJJQ01QdjYgUkE6IGNhbid0IGZpbmQgaW5ldDYgZGV2aWNlIGZvciAlcy5cbiIsCisJCQkgICBza2ItPmRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisJaWYgKGluNl9kZXYtPmNuZi5mb3J3YXJkaW5nIHx8ICFpbjZfZGV2LT5jbmYuYWNjZXB0X3JhKSB7CisJCWluNl9kZXZfcHV0KGluNl9kZXYpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFuZGlzY19wYXJzZV9vcHRpb25zKG9wdCwgb3B0bGVuLCAmbmRvcHRzKSkgeworCQlpbjZfZGV2X3B1dChpbjZfZGV2KTsKKwkJTkRfUFJJTlRLMihLRVJOX1dBUk5JTkcKKwkJCSAgICJJQ01QNiBSQTogaW52YWxpZCBORCBvcHRpb25zXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpbjZfZGV2LT5pZl9mbGFncyAmIElGX1JTX1NFTlQpIHsKKwkJLyoKKwkJICoJZmxhZyB0aGF0IGFuIFJBIHdhcyByZWNlaXZlZCBhZnRlciBhbiBSUyB3YXMgc2VudAorCQkgKglvdXQgb24gdGhpcyBpbnRlcmZhY2UuCisJCSAqLworCQlpbjZfZGV2LT5pZl9mbGFncyB8PSBJRl9SQV9SQ1ZEOworCX0KKworCS8qCisJICogUmVtZW1iZXIgdGhlIG1hbmFnZWQvb3RoZXJjb25mIGZsYWdzIGZyb20gbW9zdCByZWNlbnRseQorCSAqIHJlY2VpdmVkIFJBIG1lc3NhZ2UgKFJGQyAyNDYyKSAtLSB5b3NoZnVqaQorCSAqLworCWluNl9kZXYtPmlmX2ZsYWdzID0gKGluNl9kZXYtPmlmX2ZsYWdzICYgfihJRl9SQV9NQU5BR0VEIHwKKwkJCQlJRl9SQV9PVEhFUkNPTkYpKSB8CisJCQkJKHJhX21zZy0+aWNtcGguaWNtcDZfYWRkcmNvbmZfbWFuYWdlZCA/CisJCQkJCUlGX1JBX01BTkFHRUQgOiAwKSB8CisJCQkJKHJhX21zZy0+aWNtcGguaWNtcDZfYWRkcmNvbmZfb3RoZXIgPworCQkJCQlJRl9SQV9PVEhFUkNPTkYgOiAwKTsKKworCWxpZmV0aW1lID0gbnRvaHMocmFfbXNnLT5pY21waC5pY21wNl9ydF9saWZldGltZSk7CisKKwlydCA9IHJ0Nl9nZXRfZGZsdF9yb3V0ZXIoJnNrYi0+bmguaXB2NmgtPnNhZGRyLCBza2ItPmRldik7CisKKwlpZiAocnQpCisJCW5laWdoID0gcnQtPnJ0NmlfbmV4dGhvcDsKKworCWlmIChydCAmJiBsaWZldGltZSA9PSAwKSB7CisJCW5laWdoX2Nsb25lKG5laWdoKTsKKwkJaXA2X2RlbF9ydChydCwgTlVMTCwgTlVMTCk7CisJCXJ0ID0gTlVMTDsKKwl9CisKKwlpZiAocnQgPT0gTlVMTCAmJiBsaWZldGltZSkgeworCQlORF9QUklOVEszKEtFUk5fREVCVUcKKwkJCSAgICJJQ01QdjYgUkE6IGFkZGluZyBkZWZhdWx0IHJvdXRlci5cbiIpOworCisJCXJ0ID0gcnQ2X2FkZF9kZmx0X3JvdXRlcigmc2tiLT5uaC5pcHY2aC0+c2FkZHIsIHNrYi0+ZGV2KTsKKwkJaWYgKHJ0ID09IE5VTEwpIHsKKwkJCU5EX1BSSU5USzAoS0VSTl9FUlIKKwkJCQkgICAiSUNNUHY2IFJBOiAlcygpIGZhaWxlZCB0byBhZGQgZGVmYXVsdCByb3V0ZS5cbiIsCisJCQkJICAgX19GVU5DVElPTl9fKTsKKwkJCWluNl9kZXZfcHV0KGluNl9kZXYpOworCQkJcmV0dXJuOworCQl9CisKKwkJbmVpZ2ggPSBydC0+cnQ2aV9uZXh0aG9wOworCQlpZiAobmVpZ2ggPT0gTlVMTCkgeworCQkJTkRfUFJJTlRLMChLRVJOX0VSUgorCQkJCSAgICJJQ01QdjYgUkE6ICVzKCkgZ290IGRlZmF1bHQgcm91dGVyIHdpdGhvdXQgbmVpZ2hib3VyLlxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18pOworCQkJZHN0X3JlbGVhc2UoJnJ0LT51LmRzdCk7CisJCQlpbjZfZGV2X3B1dChpbjZfZGV2KTsKKwkJCXJldHVybjsKKwkJfQorCQluZWlnaC0+ZmxhZ3MgfD0gTlRGX1JPVVRFUjsKKwl9CisKKwlpZiAocnQpCisJCXJ0LT5ydDZpX2V4cGlyZXMgPSBqaWZmaWVzICsgKEhaICogbGlmZXRpbWUpOworCisJaWYgKHJhX21zZy0+aWNtcGguaWNtcDZfaG9wX2xpbWl0KSB7CisJCWluNl9kZXYtPmNuZi5ob3BfbGltaXQgPSByYV9tc2ctPmljbXBoLmljbXA2X2hvcF9saW1pdDsKKwkJaWYgKHJ0KQorCQkJcnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9IT1BMSU1JVC0xXSA9IHJhX21zZy0+aWNtcGguaWNtcDZfaG9wX2xpbWl0OworCX0KKworCS8qCisJICoJVXBkYXRlIFJlYWNoYWJsZSBUaW1lIGFuZCBSZXRyYW5zIFRpbWVyCisJICovCisKKwlpZiAoaW42X2Rldi0+bmRfcGFybXMpIHsKKwkJdW5zaWduZWQgbG9uZyBydGltZSA9IG50b2hsKHJhX21zZy0+cmV0cmFuc190aW1lcik7CisKKwkJaWYgKHJ0aW1lICYmIHJ0aW1lLzEwMDAgPCBNQVhfU0NIRURVTEVfVElNRU9VVC9IWikgeworCQkJcnRpbWUgPSAocnRpbWUqSFopLzEwMDA7CisJCQlpZiAocnRpbWUgPCBIWi8xMCkKKwkJCQlydGltZSA9IEhaLzEwOworCQkJaW42X2Rldi0+bmRfcGFybXMtPnJldHJhbnNfdGltZSA9IHJ0aW1lOworCQkJaW42X2Rldi0+dHN0YW1wID0gamlmZmllczsKKwkJCWluZXQ2X2lmaW5mb19ub3RpZnkoUlRNX05FV0xJTkssIGluNl9kZXYpOworCQl9CisKKwkJcnRpbWUgPSBudG9obChyYV9tc2ctPnJlYWNoYWJsZV90aW1lKTsKKwkJaWYgKHJ0aW1lICYmIHJ0aW1lLzEwMDAgPCBNQVhfU0NIRURVTEVfVElNRU9VVC8oMypIWikpIHsKKwkJCXJ0aW1lID0gKHJ0aW1lKkhaKS8xMDAwOworCisJCQlpZiAocnRpbWUgPCBIWi8xMCkKKwkJCQlydGltZSA9IEhaLzEwOworCisJCQlpZiAocnRpbWUgIT0gaW42X2Rldi0+bmRfcGFybXMtPmJhc2VfcmVhY2hhYmxlX3RpbWUpIHsKKwkJCQlpbjZfZGV2LT5uZF9wYXJtcy0+YmFzZV9yZWFjaGFibGVfdGltZSA9IHJ0aW1lOworCQkJCWluNl9kZXYtPm5kX3Bhcm1zLT5nY19zdGFsZXRpbWUgPSAzICogcnRpbWU7CisJCQkJaW42X2Rldi0+bmRfcGFybXMtPnJlYWNoYWJsZV90aW1lID0gbmVpZ2hfcmFuZF9yZWFjaF90aW1lKHJ0aW1lKTsKKwkJCQlpbjZfZGV2LT50c3RhbXAgPSBqaWZmaWVzOworCQkJCWluZXQ2X2lmaW5mb19ub3RpZnkoUlRNX05FV0xJTkssIGluNl9kZXYpOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKglQcm9jZXNzIG9wdGlvbnMuCisJICovCisKKwlpZiAoIW5laWdoKQorCQluZWlnaCA9IF9fbmVpZ2hfbG9va3VwKCZuZF90YmwsICZza2ItPm5oLmlwdjZoLT5zYWRkciwKKwkJCQkgICAgICAgc2tiLT5kZXYsIDEpOworCWlmIChuZWlnaCkgeworCQl1OCAqbGxhZGRyID0gTlVMTDsKKwkJaWYgKG5kb3B0cy5uZF9vcHRzX3NyY19sbGFkZHIpIHsKKwkJCWxsYWRkciA9IG5kaXNjX29wdF9hZGRyX2RhdGEobmRvcHRzLm5kX29wdHNfc3JjX2xsYWRkciwKKwkJCQkJCSAgICAgc2tiLT5kZXYpOworCQkJaWYgKCFsbGFkZHIpIHsKKwkJCQlORF9QUklOVEsyKEtFUk5fV0FSTklORworCQkJCQkgICAiSUNNUHY2IFJBOiBpbnZhbGlkIGxpbmstbGF5ZXIgYWRkcmVzcyBsZW5ndGhcbiIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJCW5laWdoX3VwZGF0ZShuZWlnaCwgbGxhZGRyLCBOVURfU1RBTEUsCisJCQkgICAgIE5FSUdIX1VQREFURV9GX1dFQUtfT1ZFUlJJREV8CisJCQkgICAgIE5FSUdIX1VQREFURV9GX09WRVJSSURFfAorCQkJICAgICBORUlHSF9VUERBVEVfRl9PVkVSUklERV9JU1JPVVRFUnwKKwkJCSAgICAgTkVJR0hfVVBEQVRFX0ZfSVNST1VURVIpOworCX0KKworCWlmIChuZG9wdHMubmRfb3B0c19waSkgeworCQlzdHJ1Y3QgbmRfb3B0X2hkciAqcDsKKwkJZm9yIChwID0gbmRvcHRzLm5kX29wdHNfcGk7CisJCSAgICAgcDsKKwkJICAgICBwID0gbmRpc2NfbmV4dF9vcHRpb24ocCwgbmRvcHRzLm5kX29wdHNfcGlfZW5kKSkgeworCQkJYWRkcmNvbmZfcHJlZml4X3Jjdihza2ItPmRldiwgKHU4KilwLCAocC0+bmRfb3B0X2xlbikgPDwgMyk7CisJCX0KKwl9CisKKwlpZiAobmRvcHRzLm5kX29wdHNfbXR1KSB7CisJCXUzMiBtdHU7CisKKwkJbWVtY3B5KCZtdHUsICgodTgqKShuZG9wdHMubmRfb3B0c19tdHUrMSkpKzIsIHNpemVvZihtdHUpKTsKKwkJbXR1ID0gbnRvaGwobXR1KTsKKworCQlpZiAobXR1IDwgSVBWNl9NSU5fTVRVIHx8IG10dSA+IHNrYi0+ZGV2LT5tdHUpIHsKKwkJCU5EX1BSSU5USzIoS0VSTl9XQVJOSU5HCisJCQkJICAgIklDTVB2NiBSQTogaW52YWxpZCBtdHU6ICVkXG4iLAorCQkJCSAgIG10dSk7CisJCX0gZWxzZSBpZiAoaW42X2Rldi0+Y25mLm10dTYgIT0gbXR1KSB7CisJCQlpbjZfZGV2LT5jbmYubXR1NiA9IG10dTsKKworCQkJaWYgKHJ0KQorCQkJCXJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfTVRVLTFdID0gbXR1OworCisJCQlydDZfbXR1X2NoYW5nZShza2ItPmRldiwgbXR1KTsKKwkJfQorCX0KKwkJCQorCWlmIChuZG9wdHMubmRfb3B0c190Z3RfbGxhZGRyIHx8IG5kb3B0cy5uZF9vcHRzX3JoKSB7CisJCU5EX1BSSU5USzIoS0VSTl9XQVJOSU5HCisJCQkgICAiSUNNUHY2IFJBOiBpbnZhbGlkIFJBIG9wdGlvbnMiKTsKKwl9CitvdXQ6CisJaWYgKHJ0KQorCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwllbHNlIGlmIChuZWlnaCkKKwkJbmVpZ2hfcmVsZWFzZShuZWlnaCk7CisJaW42X2Rldl9wdXQoaW42X2Rldik7Cit9CisKK3N0YXRpYyB2b2lkIG5kaXNjX3JlZGlyZWN0X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpbmV0Nl9kZXYgKmluNl9kZXY7CisJc3RydWN0IGljbXA2aGRyICppY21waDsKKwlzdHJ1Y3QgaW42X2FkZHIgKmRlc3Q7CisJc3RydWN0IGluNl9hZGRyICp0YXJnZXQ7CS8qIG5ldyBmaXJzdCBob3AgdG8gZGVzdGluYXRpb24gKi8KKwlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaDsKKwlpbnQgb25fbGluayA9IDA7CisJc3RydWN0IG5kaXNjX29wdGlvbnMgbmRvcHRzOworCWludCBvcHRsZW47CisJdTggKmxsYWRkciA9IE5VTEw7CisKKwlpZiAoIShpcHY2X2FkZHJfdHlwZSgmc2tiLT5uaC5pcHY2aC0+c2FkZHIpICYgSVBWNl9BRERSX0xJTktMT0NBTCkpIHsKKwkJTkRfUFJJTlRLMihLRVJOX1dBUk5JTkcKKwkJCSAgICJJQ01QdjYgUmVkaXJlY3Q6IHNvdXJjZSBhZGRyZXNzIGlzIG5vdCBsaW5rLWxvY2FsLlxuIik7CisJCXJldHVybjsKKwl9CisKKwlvcHRsZW4gPSBza2ItPnRhaWwgLSBza2ItPmgucmF3OworCW9wdGxlbiAtPSBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSArIDIgKiBzaXplb2Yoc3RydWN0IGluNl9hZGRyKTsKKworCWlmIChvcHRsZW4gPCAwKSB7CisJCU5EX1BSSU5USzIoS0VSTl9XQVJOSU5HCisJCQkgICAiSUNNUHY2IFJlZGlyZWN0OiBwYWNrZXQgdG9vIHNob3J0XG4iKTsKKwkJcmV0dXJuOworCX0KKworCWljbXBoID0gKHN0cnVjdCBpY21wNmhkciAqKSBza2ItPmgucmF3OworCXRhcmdldCA9IChzdHJ1Y3QgaW42X2FkZHIgKikgKGljbXBoICsgMSk7CisJZGVzdCA9IHRhcmdldCArIDE7CisKKwlpZiAoaXB2Nl9hZGRyX2lzX211bHRpY2FzdChkZXN0KSkgeworCQlORF9QUklOVEsyKEtFUk5fV0FSTklORworCQkJICAgIklDTVB2NiBSZWRpcmVjdDogZGVzdGluYXRpb24gYWRkcmVzcyBpcyBtdWx0aWNhc3QuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpcHY2X2FkZHJfZXF1YWwoZGVzdCwgdGFyZ2V0KSkgeworCQlvbl9saW5rID0gMTsKKwl9IGVsc2UgaWYgKCEoaXB2Nl9hZGRyX3R5cGUodGFyZ2V0KSAmIElQVjZfQUREUl9MSU5LTE9DQUwpKSB7CisJCU5EX1BSSU5USzIoS0VSTl9XQVJOSU5HIAorCQkJICAgIklDTVB2NiBSZWRpcmVjdDogdGFyZ2V0IGFkZHJlc3MgaXMgbm90IGxpbmstbG9jYWwuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWluNl9kZXYgPSBpbjZfZGV2X2dldChza2ItPmRldik7CisJaWYgKCFpbjZfZGV2KQorCQlyZXR1cm47CisJaWYgKGluNl9kZXYtPmNuZi5mb3J3YXJkaW5nIHx8ICFpbjZfZGV2LT5jbmYuYWNjZXB0X3JlZGlyZWN0cykgeworCQlpbjZfZGV2X3B1dChpbjZfZGV2KTsKKwkJcmV0dXJuOworCX0KKworCS8qIFJGQzI0NjEgOC4xOiAKKwkgKglUaGUgSVAgc291cmNlIGFkZHJlc3Mgb2YgdGhlIFJlZGlyZWN0IE1VU1QgYmUgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQKKwkgKglmaXJzdC1ob3Agcm91dGVyIGZvciB0aGUgc3BlY2lmaWVkIElDTVAgRGVzdGluYXRpb24gQWRkcmVzcy4KKwkgKi8KKwkJCisJaWYgKCFuZGlzY19wYXJzZV9vcHRpb25zKCh1OCopKGRlc3QgKyAxKSwgb3B0bGVuLCAmbmRvcHRzKSkgeworCQlORF9QUklOVEsyKEtFUk5fV0FSTklORworCQkJICAgIklDTVB2NiBSZWRpcmVjdDogaW52YWxpZCBORCBvcHRpb25zXG4iKTsKKwkJaW42X2Rldl9wdXQoaW42X2Rldik7CisJCXJldHVybjsKKwl9CisJaWYgKG5kb3B0cy5uZF9vcHRzX3RndF9sbGFkZHIpIHsKKwkJbGxhZGRyID0gbmRpc2Nfb3B0X2FkZHJfZGF0YShuZG9wdHMubmRfb3B0c190Z3RfbGxhZGRyLAorCQkJCQkgICAgIHNrYi0+ZGV2KTsKKwkJaWYgKCFsbGFkZHIpIHsKKwkJCU5EX1BSSU5USzIoS0VSTl9XQVJOSU5HCisJCQkJICAgIklDTVB2NiBSZWRpcmVjdDogaW52YWxpZCBsaW5rLWxheWVyIGFkZHJlc3MgbGVuZ3RoXG4iKTsKKwkJCWluNl9kZXZfcHV0KGluNl9kZXYpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJbmVpZ2ggPSBfX25laWdoX2xvb2t1cCgmbmRfdGJsLCB0YXJnZXQsIHNrYi0+ZGV2LCAxKTsKKwlpZiAobmVpZ2gpIHsKKwkJcnQ2X3JlZGlyZWN0KGRlc3QsICZza2ItPm5oLmlwdjZoLT5zYWRkciwgbmVpZ2gsIGxsYWRkciwgCisJCQkgICAgIG9uX2xpbmspOworCQluZWlnaF9yZWxlYXNlKG5laWdoKTsKKwl9CisJaW42X2Rldl9wdXQoaW42X2Rldik7Cit9CisKK3ZvaWQgbmRpc2Nfc2VuZF9yZWRpcmVjdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwKKwkJCSBzdHJ1Y3QgaW42X2FkZHIgKnRhcmdldCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBuZGlzY19zb2NrZXQtPnNrOworCWludCBsZW4gPSBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSArIDIgKiBzaXplb2Yoc3RydWN0IGluNl9hZGRyKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmZjsKKwlzdHJ1Y3QgaWNtcDZoZHIgKmljbXBoOworCXN0cnVjdCBpbjZfYWRkciBzYWRkcl9idWY7CisJc3RydWN0IGluNl9hZGRyICphZGRycDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBydDZfaW5mbyAqcnQ7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0OworCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CisJc3RydWN0IGZsb3dpIGZsOworCXU4ICpvcHQ7CisJaW50IHJkX2xlbjsKKwlpbnQgZXJyOworCWludCBobGVuOworCXU4IGhhX2J1ZltNQVhfQUREUl9MRU5dLCAqaGEgPSBOVUxMOworCisJZGV2ID0gc2tiLT5kZXY7CisKKwlpZiAoaXB2Nl9nZXRfbGxhZGRyKGRldiwgJnNhZGRyX2J1ZikpIHsKKwkJTkRfUFJJTlRLMihLRVJOX1dBUk5JTkcKKwkJCSAgICJJQ01QdjYgUmVkaXJlY3Q6IG5vIGxpbmstbG9jYWwgYWRkcmVzcyBvbiAlc1xuIiwKKwkJCSAgIGRldi0+bmFtZSk7CisgCQlyZXR1cm47CisgCX0KKworCW5kaXNjX2Zsb3dfaW5pdCgmZmwsIE5ESVNDX1JFRElSRUNULCAmc2FkZHJfYnVmLCAmc2tiLT5uaC5pcHY2aC0+c2FkZHIpOworCisJZHN0ID0gaXA2X3JvdXRlX291dHB1dChOVUxMLCAmZmwpOworCWlmIChkc3QgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZXJyID0geGZybV9sb29rdXAoJmRzdCwgJmZsLCBOVUxMLCAwKTsKKwlpZiAoZXJyKSB7CisJCWRzdF9yZWxlYXNlKGRzdCk7CisJCXJldHVybjsKKwl9CisKKwlydCA9IChzdHJ1Y3QgcnQ2X2luZm8gKikgZHN0OworCisJaWYgKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX0dBVEVXQVkpIHsKKwkJTkRfUFJJTlRLMihLRVJOX1dBUk5JTkcKKwkJCSAgICJJQ01QdjYgUmVkaXJlY3Q6IGRlc3RpbmF0aW9uIGlzIG5vdCBhIG5laWdoYm91ci5cbiIpOworCQlkc3RfcmVsZWFzZShkc3QpOworCQlyZXR1cm47CisJfQorCWlmICgheHJsaW1fYWxsb3coZHN0LCAxKkhaKSkgeworCQlkc3RfcmVsZWFzZShkc3QpOworCQlyZXR1cm47CisJfQorCisJaWYgKGRldi0+YWRkcl9sZW4pIHsKKwkJcmVhZF9sb2NrX2JoKCZuZWlnaC0+bG9jayk7CisJCWlmIChuZWlnaC0+bnVkX3N0YXRlICYgTlVEX1ZBTElEKSB7CisJCQltZW1jcHkoaGFfYnVmLCBuZWlnaC0+aGEsIGRldi0+YWRkcl9sZW4pOworCQkJcmVhZF91bmxvY2tfYmgoJm5laWdoLT5sb2NrKTsKKwkJCWhhID0gaGFfYnVmOworCQkJbGVuICs9IG5kaXNjX29wdF9hZGRyX3NwYWNlKGRldik7CisJCX0gZWxzZQorCQkJcmVhZF91bmxvY2tfYmgoJm5laWdoLT5sb2NrKTsKKwl9CisKKwlyZF9sZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCSAgICAgSVBWNl9NSU5fTVRVLXNpemVvZihzdHJ1Y3QgaXB2NmhkciktbGVuLCBza2ItPmxlbiArIDgpOworCXJkX2xlbiAmPSB+MHg3OworCWxlbiArPSByZF9sZW47CisKKwlidWZmID0gc29ja19hbGxvY19zZW5kX3NrYihzaywgTUFYX0hFQURFUiArIGxlbiArIExMX1JFU0VSVkVEX1NQQUNFKGRldiksCisJCQkJICAgMSwgJmVycik7CisJaWYgKGJ1ZmYgPT0gTlVMTCkgeworCQlORF9QUklOVEswKEtFUk5fRVJSCisJCQkgICAiSUNNUHY2IFJlZGlyZWN0OiAlcygpIGZhaWxlZCB0byBhbGxvY2F0ZSBhbiBza2IuXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJZHN0X3JlbGVhc2UoZHN0KTsKKwkJcmV0dXJuOworCX0KKworCWhsZW4gPSAwOworCisJc2tiX3Jlc2VydmUoYnVmZiwgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSk7CisJaXA2X25kX2hkcihzaywgYnVmZiwgZGV2LCAmc2FkZHJfYnVmLCAmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCisJCSAgIElQUFJPVE9fSUNNUFY2LCBsZW4pOworCisJaWNtcGggPSAoc3RydWN0IGljbXA2aGRyICopc2tiX3B1dChidWZmLCBsZW4pOworCWJ1ZmYtPmgucmF3ID0gKHVuc2lnbmVkIGNoYXIqKWljbXBoOworCisJbWVtc2V0KGljbXBoLCAwLCBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSk7CisJaWNtcGgtPmljbXA2X3R5cGUgPSBORElTQ19SRURJUkVDVDsKKworCS8qCisJICoJY29weSB0YXJnZXQgYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3NlcworCSAqLworCisJYWRkcnAgPSAoc3RydWN0IGluNl9hZGRyICopKGljbXBoICsgMSk7CisJaXB2Nl9hZGRyX2NvcHkoYWRkcnAsIHRhcmdldCk7CisJYWRkcnArKzsKKwlpcHY2X2FkZHJfY29weShhZGRycCwgJnNrYi0+bmguaXB2NmgtPmRhZGRyKTsKKworCW9wdCA9ICh1OCopIChhZGRycCArIDEpOworCisJLyoKKwkgKglpbmNsdWRlIHRhcmdldF9hZGRyZXNzIG9wdGlvbgorCSAqLworCisJaWYgKGhhKQorCQlvcHQgPSBuZGlzY19maWxsX2FkZHJfb3B0aW9uKG9wdCwgTkRfT1BUX1RBUkdFVF9MTF9BRERSLCBoYSwKKwkJCQkJICAgICBkZXYtPmFkZHJfbGVuLCBkZXYtPnR5cGUpOworCisJLyoKKwkgKglidWlsZCByZWRpcmVjdCBvcHRpb24gYW5kIGNvcHkgc2tiIG92ZXIgdG8gdGhlIG5ldyBwYWNrZXQuCisJICovCisKKwltZW1zZXQob3B0LCAwLCA4KTsJCisJKihvcHQrKykgPSBORF9PUFRfUkVESVJFQ1RfSERSOworCSoob3B0KyspID0gKHJkX2xlbiA+PiAzKTsKKwlvcHQgKz0gNjsKKworCW1lbWNweShvcHQsIHNrYi0+bmguaXB2NmgsIHJkX2xlbiAtIDgpOworCisJaWNtcGgtPmljbXA2X2Nrc3VtID0gY3N1bV9pcHY2X21hZ2ljKCZzYWRkcl9idWYsICZza2ItPm5oLmlwdjZoLT5zYWRkciwKKwkJCQkJICAgICBsZW4sIElQUFJPVE9fSUNNUFY2LAorCQkJCQkgICAgIGNzdW1fcGFydGlhbCgodTggKikgaWNtcGgsIGxlbiwgMCkpOworCisJYnVmZi0+ZHN0ID0gZHN0OworCWlkZXYgPSBpbjZfZGV2X2dldChkc3QtPmRldik7CisJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CisJZXJyID0gTkZfSE9PSyhQRl9JTkVUNiwgTkZfSVA2X0xPQ0FMX09VVCwgYnVmZiwgTlVMTCwgZHN0LT5kZXYsIGRzdF9vdXRwdXQpOworCWlmICghZXJyKSB7CisJCUlDTVA2X0lOQ19TVEFUUyhpZGV2LCBJQ01QNl9NSUJfT1VUUkVESVJFQ1RTKTsKKwkJSUNNUDZfSU5DX1NUQVRTKGlkZXYsIElDTVA2X01JQl9PVVRNU0dTKTsKKwl9CisKKwlpZiAobGlrZWx5KGlkZXYgIT0gTlVMTCkpCisJCWluNl9kZXZfcHV0KGlkZXYpOworfQorCitzdGF0aWMgdm9pZCBwbmRpc2NfcmVkbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCW5kaXNjX3Jjdihza2IpOworCWtmcmVlX3NrYihza2IpOworfQorCitpbnQgbmRpc2NfcmN2KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5kX21zZyAqbXNnOworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2tiLT5sZW4pKQorCQlyZXR1cm4gMDsKKworCW1zZyA9IChzdHJ1Y3QgbmRfbXNnICopIHNrYi0+aC5yYXc7CisKKwlfX3NrYl9wdXNoKHNrYiwgc2tiLT5kYXRhLXNrYi0+aC5yYXcpOworCisJaWYgKHNrYi0+bmguaXB2NmgtPmhvcF9saW1pdCAhPSAyNTUpIHsKKwkJTkRfUFJJTlRLMihLRVJOX1dBUk5JTkcKKwkJCSAgICJJQ01QdjYgTkRJU0M6IGludmFsaWQgaG9wLWxpbWl0OiAlZFxuIiwKKwkJCSAgIHNrYi0+bmguaXB2NmgtPmhvcF9saW1pdCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChtc2ctPmljbXBoLmljbXA2X2NvZGUgIT0gMCkgeworCQlORF9QUklOVEsyKEtFUk5fV0FSTklORyAKKwkJCSAgICJJQ01QdjYgTkRJU0M6IGludmFsaWQgSUNNUHY2IGNvZGU6ICVkXG4iLAorCQkJICAgbXNnLT5pY21waC5pY21wNl9jb2RlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChtc2ctPmljbXBoLmljbXA2X3R5cGUpIHsKKwljYXNlIE5ESVNDX05FSUdIQk9VUl9TT0xJQ0lUQVRJT046CisJCW5kaXNjX3JlY3ZfbnMoc2tiKTsKKwkJYnJlYWs7CisKKwljYXNlIE5ESVNDX05FSUdIQk9VUl9BRFZFUlRJU0VNRU5UOgorCQluZGlzY19yZWN2X25hKHNrYik7CisJCWJyZWFrOworCisJY2FzZSBORElTQ19ST1VURVJfU09MSUNJVEFUSU9OOgorCQluZGlzY19yZWN2X3JzKHNrYik7CisJCWJyZWFrOworCisJY2FzZSBORElTQ19ST1VURVJfQURWRVJUSVNFTUVOVDoKKwkJbmRpc2Nfcm91dGVyX2Rpc2NvdmVyeShza2IpOworCQlicmVhazsKKworCWNhc2UgTkRJU0NfUkVESVJFQ1Q6CisJCW5kaXNjX3JlZGlyZWN0X3Jjdihza2IpOworCQlicmVhazsKKwl9OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmRpc2NfbmV0ZGV2X2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwdHI7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBORVRERVZfQ0hBTkdFQUREUjoKKwkJbmVpZ2hfY2hhbmdlYWRkcigmbmRfdGJsLCBkZXYpOworCQlmaWI2X3J1bl9nYyh+MFVMKTsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfRE9XTjoKKwkJbmVpZ2hfaWZkb3duKCZuZF90YmwsIGRldik7CisJCWZpYjZfcnVuX2djKH4wVUwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbmRpc2NfbmV0ZGV2X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gbmRpc2NfbmV0ZGV2X2V2ZW50LAorfTsKKworI2lmZGVmIENPTkZJR19TWVNDVEwKK3N0YXRpYyB2b2lkIG5kaXNjX3dhcm5fZGVwcmVjYXRlZF9zeXNjdGwoc3RydWN0IGN0bF90YWJsZSAqY3RsLAorCQkJCQkgY29uc3QgY2hhciAqZnVuYywgY29uc3QgY2hhciAqZGV2X25hbWUpCit7CisJc3RhdGljIGNoYXIgd2FybmNvbW1bVEFTS19DT01NX0xFTl07CisJc3RhdGljIGludCB3YXJuZWQ7CisJaWYgKHN0cmNtcCh3YXJuY29tbSwgY3VycmVudC0+Y29tbSkgJiYgd2FybmVkIDwgNSkgeworCQlzdHJjcHkod2FybmNvbW0sIGN1cnJlbnQtPmNvbW0pOworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkicHJvY2VzcyBgJXMnIGlzIHVzaW5nIGRlcHJlY2F0ZWQgc3lzY3RsICglcykgIgorCQkJIm5ldC5pcHY2Lm5laWdoLiVzLiVzOyAiCisJCQkiVXNlIG5ldC5pcHY2Lm5laWdoLiVzLiVzX21zICIKKwkJCSJpbnN0ZWFkLlxuIiwKKwkJCXdhcm5jb21tLCBmdW5jLAorCQkJZGV2X25hbWUsIGN0bC0+cHJvY25hbWUsCisJCQlkZXZfbmFtZSwgY3RsLT5wcm9jbmFtZSk7CisJCXdhcm5lZCsrOworCX0KK30KKworaW50IG5kaXNjX2lmaW5mb19zeXNjdGxfY2hhbmdlKHN0cnVjdCBjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqIGZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjdGwtPmV4dHJhMTsKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OworCWludCByZXQ7CisKKwlpZiAoY3RsLT5jdGxfbmFtZSA9PSBORVRfTkVJR0hfUkVUUkFOU19USU1FIHx8CisJICAgIGN0bC0+Y3RsX25hbWUgPT0gTkVUX05FSUdIX1JFQUNIQUJMRV9USU1FKQorCQluZGlzY193YXJuX2RlcHJlY2F0ZWRfc3lzY3RsKGN0bCwgInN5c2NhbGwiLCBkZXYgPyBkZXYtPm5hbWUgOiAiZGVmYXVsdCIpOworCisJc3dpdGNoIChjdGwtPmN0bF9uYW1lKSB7CisJY2FzZSBORVRfTkVJR0hfUkVUUkFOU19USU1FOgorCQlyZXQgPSBwcm9jX2RvaW50dmVjKGN0bCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJCWJyZWFrOworCWNhc2UgTkVUX05FSUdIX1JFQUNIQUJMRV9USU1FOgorCQlyZXQgPSBwcm9jX2RvaW50dmVjX2ppZmZpZXMoY3RsLCB3cml0ZSwKKwkJCQkJICAgIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJCWJyZWFrOworCWNhc2UgTkVUX05FSUdIX1JFVFJBTlNfVElNRV9NUzoKKwljYXNlIE5FVF9ORUlHSF9SRUFDSEFCTEVfVElNRV9NUzoKKwkJcmV0ID0gcHJvY19kb2ludHZlY19tc19qaWZmaWVzKGN0bCwgd3JpdGUsCisJCQkJCSAgICAgICBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtMTsKKwl9CisKKwlpZiAod3JpdGUgJiYgcmV0ID09IDAgJiYgZGV2ICYmIChpZGV2ID0gaW42X2Rldl9nZXQoZGV2KSkgIT0gTlVMTCkgeworCQlpZiAoY3RsLT5jdGxfbmFtZSA9PSBORVRfTkVJR0hfUkVBQ0hBQkxFX1RJTUUgfHwKKwkJICAgIGN0bC0+Y3RsX25hbWUgPT0gTkVUX05FSUdIX1JFQUNIQUJMRV9USU1FX01TKQorCQkJaWRldi0+bmRfcGFybXMtPnJlYWNoYWJsZV90aW1lID0gbmVpZ2hfcmFuZF9yZWFjaF90aW1lKGlkZXYtPm5kX3Bhcm1zLT5iYXNlX3JlYWNoYWJsZV90aW1lKTsKKwkJaWRldi0+dHN0YW1wID0gamlmZmllczsKKwkJaW5ldDZfaWZpbmZvX25vdGlmeShSVE1fTkVXTElOSywgaWRldik7CisJCWluNl9kZXZfcHV0KGlkZXYpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG5kaXNjX2lmaW5mb19zeXNjdGxfc3RyYXRlZ3koY3RsX3RhYmxlICpjdGwsIGludCBfX3VzZXIgKm5hbWUsCisJCQkJCWludCBubGVuLCB2b2lkIF9fdXNlciAqb2xkdmFsLAorCQkJCQlzaXplX3QgX191c2VyICpvbGRsZW5wLAorCQkJCQl2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuLAorCQkJCQl2b2lkICoqY29udGV4dCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY3RsLT5leHRyYTE7CisJc3RydWN0IGluZXQ2X2RldiAqaWRldjsKKwlpbnQgcmV0OworCisJaWYgKGN0bC0+Y3RsX25hbWUgPT0gTkVUX05FSUdIX1JFVFJBTlNfVElNRSB8fAorCSAgICBjdGwtPmN0bF9uYW1lID09IE5FVF9ORUlHSF9SRUFDSEFCTEVfVElNRSkKKwkJbmRpc2Nfd2Fybl9kZXByZWNhdGVkX3N5c2N0bChjdGwsICJwcm9jZnMiLCBkZXYgPyBkZXYtPm5hbWUgOiAiZGVmYXVsdCIpOworCisJc3dpdGNoIChjdGwtPmN0bF9uYW1lKSB7CisJY2FzZSBORVRfTkVJR0hfUkVBQ0hBQkxFX1RJTUU6CisJCXJldCA9IHN5c2N0bF9qaWZmaWVzKGN0bCwgbmFtZSwgbmxlbiwKKwkJCQkgICAgIG9sZHZhbCwgb2xkbGVucCwgbmV3dmFsLCBuZXdsZW4sCisJCQkJICAgICBjb250ZXh0KTsKKwkJYnJlYWs7CisJY2FzZSBORVRfTkVJR0hfUkVUUkFOU19USU1FX01TOgorCWNhc2UgTkVUX05FSUdIX1JFQUNIQUJMRV9USU1FX01TOgorCQkgcmV0ID0gc3lzY3RsX21zX2ppZmZpZXMoY3RsLCBuYW1lLCBubGVuLAorCQkJCQkgb2xkdmFsLCBvbGRsZW5wLCBuZXd2YWwsIG5ld2xlbiwKKwkJCQkJIGNvbnRleHQpOworCQkgYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gMDsKKwl9CisKKwlpZiAobmV3dmFsICYmIG5ld2xlbiAmJiByZXQgPiAwICYmCisJICAgIGRldiAmJiAoaWRldiA9IGluNl9kZXZfZ2V0KGRldikpICE9IE5VTEwpIHsKKwkJaWYgKGN0bC0+Y3RsX25hbWUgPT0gTkVUX05FSUdIX1JFQUNIQUJMRV9USU1FIHx8CisJCSAgICBjdGwtPmN0bF9uYW1lID09IE5FVF9ORUlHSF9SRUFDSEFCTEVfVElNRV9NUykKKwkJCWlkZXYtPm5kX3Bhcm1zLT5yZWFjaGFibGVfdGltZSA9IG5laWdoX3JhbmRfcmVhY2hfdGltZShpZGV2LT5uZF9wYXJtcy0+YmFzZV9yZWFjaGFibGVfdGltZSk7CisJCWlkZXYtPnRzdGFtcCA9IGppZmZpZXM7CisJCWluZXQ2X2lmaW5mb19ub3RpZnkoUlRNX05FV0xJTkssIGlkZXYpOworCQlpbjZfZGV2X3B1dChpZGV2KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYKKworaW50IF9faW5pdCBuZGlzY19pbml0KHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5ICpvcHMpCit7CisJc3RydWN0IGlwdjZfcGluZm8gKm5wOworCXN0cnVjdCBzb2NrICpzazsKKyAgICAgICAgaW50IGVycjsKKworCWVyciA9IHNvY2tfY3JlYXRlX2tlcm4oUEZfSU5FVDYsIFNPQ0tfUkFXLCBJUFBST1RPX0lDTVBWNiwgJm5kaXNjX3NvY2tldCk7CisJaWYgKGVyciA8IDApIHsKKwkJTkRfUFJJTlRLMChLRVJOX0VSUgorCQkJICAgIklDTVB2NiBORElTQzogRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIGNvbnRyb2wgc29ja2V0IChlcnIgJWQpLlxuIiwgCisJCQkgICBlcnIpOworCQluZGlzY19zb2NrZXQgPSBOVUxMOyAvKiBGb3Igc2FmZXR5LiAqLworCQlyZXR1cm4gZXJyOworCX0KKworCXNrID0gbmRpc2Nfc29ja2V0LT5zazsKKwlucCA9IGluZXQ2X3NrKHNrKTsKKwlzay0+c2tfYWxsb2NhdGlvbiA9IEdGUF9BVE9NSUM7CisJbnAtPmhvcF9saW1pdCA9IDI1NTsKKwkvKiBEbyBub3QgbG9vcGJhY2sgbmRpc2MgbWVzc2FnZXMgKi8KKwlucC0+bWNfbG9vcCA9IDA7CisJc2stPnNrX3Byb3QtPnVuaGFzaChzayk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSW5pdGlhbGl6ZSB0aGUgbmVpZ2hib3VyIHRhYmxlCisgICAgICAgICAqLworCQorCW5laWdoX3RhYmxlX2luaXQoJm5kX3RibCk7CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJbmVpZ2hfc3lzY3RsX3JlZ2lzdGVyKE5VTEwsICZuZF90YmwucGFybXMsIE5FVF9JUFY2LCBORVRfSVBWNl9ORUlHSCwgCisJCQkgICAgICAiaXB2NiIsCisJCQkgICAgICAmbmRpc2NfaWZpbmZvX3N5c2N0bF9jaGFuZ2UsCisJCQkgICAgICAmbmRpc2NfaWZpbmZvX3N5c2N0bF9zdHJhdGVneSk7CisjZW5kaWYKKworCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmbmRpc2NfbmV0ZGV2X25vdGlmaWVyKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBuZGlzY19jbGVhbnVwKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1NZU0NUTAorCW5laWdoX3N5c2N0bF91bnJlZ2lzdGVyKCZuZF90YmwucGFybXMpOworI2VuZGlmCisJbmVpZ2hfdGFibGVfY2xlYXIoJm5kX3RibCk7CisJc29ja19yZWxlYXNlKG5kaXNjX3NvY2tldCk7CisJbmRpc2Nfc29ja2V0ID0gTlVMTDsgLyogRm9yIHNhZmV0eS4gKi8KK30KZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9LY29uZmlnIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdlYzcwNAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9LY29uZmlnCkBAIC0wLDAgKzEsMjQyIEBACisjCisjIElQIG5ldGZpbHRlciBjb25maWd1cmF0aW9uCisjCisKK21lbnUgIklQdjY6IE5ldGZpbHRlciBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gSU5FVCAmJiBJUFY2ICYmIE5FVEZJTFRFUiAmJiBFWFBFUklNRU5UQUwKKworI3RyaXN0YXRlICdDb25uZWN0aW9uIHRyYWNraW5nIChyZXF1aXJlZCBmb3IgbWFzcS9OQVQpJyBDT05GSUdfSVA2X05GX0NPTk5UUkFDSworI2lmIFsgIiRDT05GSUdfSVA2X05GX0NPTk5UUkFDSyIgIT0gIm4iIF07IHRoZW4KKyMgIGRlcF90cmlzdGF0ZSAnICBGVFAgcHJvdG9jb2wgc3VwcG9ydCcgQ09ORklHX0lQNl9ORl9GVFAgJENPTkZJR19JUDZfTkZfQ09OTlRSQUNLCisjZmkKK2NvbmZpZyBJUDZfTkZfUVVFVUUKKwl0cmlzdGF0ZSAiVXNlcnNwYWNlIHF1ZXVlaW5nIHZpYSBORVRMSU5LIgorCS0tLWhlbHAtLS0KKworCSAgVGhpcyBvcHRpb24gYWRkcyBhIHF1ZXVlIGhhbmRsZXIgdG8gdGhlIGtlcm5lbCBmb3IgSVB2NgorCSAgcGFja2V0cyB3aGljaCBsZXRzIHVzIHRvIHJlY2VpdmUgdGhlIGZpbHRlcmVkIHBhY2tldHMKKwkgIHdpdGggUVVFVUUgdGFyZ2V0IHVzaW5nIGxpYmlwdGMgYXMgd2UgY2FuIGRvIHdpdGgKKwkgIHRoZSBJUHY0IG5vdy4KKworCSAgKEMpIEZlcm5hbmRvIEFudG9uIDIwMDEKKwkgIElQdjY0IFByb2plY3QgLSBXb3JrIGJhc2VkIGluIElQdjY0IGRyYWZ0IGJ5IEFydHVybyBBemNvcnJhLgorCSAgVW5pdmVyc2lkYWQgQ2FybG9zIElJSSBkZSBNYWRyaWQKKwkgIFVuaXZlcnNpZGFkIFBvbGl0ZWNuaWNhIGRlIEFsY2FsYSBkZSBIZW5hcmVzCisJICBlbWFpbDogPGZhbnRvbkBpdC51YzNtLmVzPi4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBJUDZfTkZfSVBUQUJMRVMKKwl0cmlzdGF0ZSAiSVA2IHRhYmxlcyBzdXBwb3J0IChyZXF1aXJlZCBmb3IgZmlsdGVyaW5nL21hc3EvTkFUKSIKKwloZWxwCisJICBpcDZ0YWJsZXMgaXMgYSBnZW5lcmFsLCBleHRlbnNpYmxlIHBhY2tldCBpZGVudGlmaWNhdGlvbiBmcmFtZXdvcmsuCisJICBDdXJyZW50bHkgb25seSB0aGUgcGFja2V0IGZpbHRlcmluZyBhbmQgcGFja2V0IG1hbmdsaW5nIHN1YnN5c3RlbQorCSAgZm9yIElQdjYgdXNlIHRoaXMsIGJ1dCBjb25uZWN0aW9uIHRyYWNraW5nIGlzIGdvaW5nIHRvIGZvbGxvdy4KKwkgIFNheSAnWScgb3IgJ00nIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGVpdGhlciBvZiB0aG9zZS4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKKyMgVGhlIHNpbXBsZSBtYXRjaGVzLgorY29uZmlnIElQNl9ORl9NQVRDSF9MSU1JVAorCXRyaXN0YXRlICJsaW1pdCBtYXRjaCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTCisJaGVscAorCSAgbGltaXQgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBjb250cm9sIHRoZSByYXRlIGF0IHdoaWNoIGEgcnVsZSBjYW4gYmUKKwkgIG1hdGNoZWQ6IG1haW5seSB1c2VmdWwgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgTE9HIHRhcmdldCAoIkxPRworCSAgdGFyZ2V0IHN1cHBvcnQiLCBiZWxvdykgYW5kIHRvIGF2b2lkIHNvbWUgRGVuaWFsIG9mIFNlcnZpY2UgYXR0YWNrcy4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBJUDZfTkZfTUFUQ0hfTUFDCisJdHJpc3RhdGUgIk1BQyBhZGRyZXNzIG1hdGNoIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJUDZfTkZfSVBUQUJMRVMKKwloZWxwCisJICBtYWMgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBwYWNrZXRzIGJhc2VkIG9uIHRoZSBzb3VyY2UKKwkgIEV0aGVybmV0IGFkZHJlc3Mgb2YgdGhlIHBhY2tldC4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBJUDZfTkZfTUFUQ0hfUlQKKwl0cmlzdGF0ZSAiUm91dGluZyBoZWFkZXIgbWF0Y2ggc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElQNl9ORl9JUFRBQkxFUworCWhlbHAKKwkgIHJ0IG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggcGFja2V0cyBiYXNlZCBvbiB0aGUgcm91dGluZworCSAgaGVhZGVyIG9mIHRoZSBwYWNrZXQuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgSVA2X05GX01BVENIX09QVFMKKwl0cmlzdGF0ZSAiSG9wLWJ5LWhvcCBhbmQgRHN0IG9wdHMgaGVhZGVyIG1hdGNoIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJUDZfTkZfSVBUQUJMRVMKKwloZWxwCisJICBUaGlzIGFsbG93cyBvbmUgdG8gbWF0Y2ggcGFja2V0cyBiYXNlZCBvbiB0aGUgaG9wLWJ5LWhvcAorCSAgYW5kIGRlc3RpbmF0aW9uIG9wdGlvbnMgaGVhZGVycyBvZiBhIHBhY2tldC4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBJUDZfTkZfTUFUQ0hfRlJBRworCXRyaXN0YXRlICJGcmFnbWVudGF0aW9uIGhlYWRlciBtYXRjaCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTCisJaGVscAorCSAgZnJhZyBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIHBhY2tldHMgYmFzZWQgb24gdGhlIGZyYWdtZW50YXRpb24KKwkgIGhlYWRlciBvZiB0aGUgcGFja2V0LgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIElQNl9ORl9NQVRDSF9ITAorCXRyaXN0YXRlICJITCBtYXRjaCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTCisJaGVscAorCSAgSEwgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBwYWNrZXRzIGJhc2VkIG9uIHRoZSBob3AKKwkgIGxpbWl0IG9mIHRoZSBwYWNrZXQuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgSVA2X05GX01BVENIX01VTFRJUE9SVAorCXRyaXN0YXRlICJNdWx0aXBsZSBwb3J0IG1hdGNoIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJUDZfTkZfSVBUQUJMRVMKKwloZWxwCisJICBNdWx0aXBvcnQgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBUQ1Agb3IgVURQIHBhY2tldHMgYmFzZWQgb24KKwkgIGEgc2VyaWVzIG9mIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBwb3J0czogbm9ybWFsbHkgYSBydWxlIGNhbiBvbmx5CisJICBtYXRjaCBhIHNpbmdsZSByYW5nZSBvZiBwb3J0cy4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBJUDZfTkZfTUFUQ0hfT1dORVIKKwl0cmlzdGF0ZSAiT3duZXIgbWF0Y2ggc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElQNl9ORl9JUFRBQkxFUworCWhlbHAKKwkgIFBhY2tldCBvd25lciBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIGxvY2FsbHktZ2VuZXJhdGVkIHBhY2tldHMKKwkgIGJhc2VkIG9uIHdobyBjcmVhdGVkIHRoZW06IHRoZSB1c2VyLCBncm91cCwgcHJvY2VzcyBvciBzZXNzaW9uLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworIyAgZGVwX3RyaXN0YXRlICcgIE1BQyBhZGRyZXNzIG1hdGNoIHN1cHBvcnQnIENPTkZJR19JUDZfTkZfTUFUQ0hfTUFDICRDT05GSUdfSVA2X05GX0lQVEFCTEVTCitjb25maWcgSVA2X05GX01BVENIX01BUksKKwl0cmlzdGF0ZSAibmV0ZmlsdGVyIE1BUksgbWF0Y2ggc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElQNl9ORl9JUFRBQkxFUworCWhlbHAKKwkgIE5ldGZpbHRlciBtYXJrIG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggcGFja2V0cyBiYXNlZCBvbiB0aGUKKwkgIGBuZm1hcmsnIHZhbHVlIGluIHRoZSBwYWNrZXQuICBUaGlzIGNhbiBiZSBzZXQgYnkgdGhlIE1BUksgdGFyZ2V0CisJICAoc2VlIGJlbG93KS4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBJUDZfTkZfTUFUQ0hfSVBWNkhFQURFUgorCXRyaXN0YXRlICJJUHY2IEV4dGVuc2lvbiBIZWFkZXJzIE1hdGNoIgorCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTCisJaGVscAorCSAgVGhpcyBtb2R1bGUgYWxsb3dzIG9uZSB0byBtYXRjaCBwYWNrZXRzIGJhc2VkIHVwb24KKwkgIHRoZSBpcHY2IGV4dGVuc2lvbiBoZWFkZXJzLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIElQNl9ORl9NQVRDSF9BSEVTUAorCXRyaXN0YXRlICJBSC9FU1AgbWF0Y2ggc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElQNl9ORl9JUFRBQkxFUworCWhlbHAKKwkgIFRoaXMgbW9kdWxlIGFsbG93cyBvbmUgdG8gbWF0Y2ggQUggYW5kIEVTUCBwYWNrZXRzLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIElQNl9ORl9NQVRDSF9MRU5HVEgKKwl0cmlzdGF0ZSAiUGFja2V0IExlbmd0aCBtYXRjaCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBtYXRjaCB0aGUgbGVuZ3RoIG9mIGEgcGFja2V0IGFnYWluc3QgYQorCSAgc3BlY2lmaWMgdmFsdWUgb3IgcmFuZ2Ugb2YgdmFsdWVzLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIElQNl9ORl9NQVRDSF9FVUk2NAorCXRyaXN0YXRlICJFVUk2NCBhZGRyZXNzIGNoZWNrIgorCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTCisJaGVscAorCSAgVGhpcyBtb2R1bGUgcGVyZm9ybXMgY2hlY2tpbmcgb24gdGhlIElQdjYgc291cmNlIGFkZHJlc3MKKwkgIENvbXBhcmVzIHRoZSBsYXN0IDY0IGJpdHMgd2l0aCB0aGUgRVVJNjQgKGRlbGl2ZXJlZAorCSAgZnJvbSB0aGUgTUFDIGFkZHJlc3MpIGFkZHJlc3MKKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBJUDZfTkZfTUFUQ0hfUEhZU0RFVgorCXRyaXN0YXRlICJQaHlzZGV2IG1hdGNoIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJUDZfTkZfSVBUQUJMRVMgJiYgQlJJREdFX05FVEZJTFRFUgorCWhlbHAKKwkgIFBoeXNkZXYgcGFja2V0IG1hdGNoaW5nIG1hdGNoZXMgYWdhaW5zdCB0aGUgcGh5c2ljYWwgYnJpZGdlIHBvcnRzCisJICB0aGUgSVAgcGFja2V0IGFycml2ZWQgb24gb3Igd2lsbCBsZWF2ZSBieS4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKKyMgIGRlcF90cmlzdGF0ZSAnICBNdWx0aXBsZSBwb3J0IG1hdGNoIHN1cHBvcnQnIENPTkZJR19JUDZfTkZfTUFUQ0hfTVVMVElQT1JUICRDT05GSUdfSVA2X05GX0lQVEFCTEVTCisjICBkZXBfdHJpc3RhdGUgJyAgVE9TIG1hdGNoIHN1cHBvcnQnIENPTkZJR19JUDZfTkZfTUFUQ0hfVE9TICRDT05GSUdfSVA2X05GX0lQVEFCTEVTCisjICBpZiBbICIkQ09ORklHX0lQNl9ORl9DT05OVFJBQ0siICE9ICJuIiBdOyB0aGVuCisjICAgIGRlcF90cmlzdGF0ZSAnICBDb25uZWN0aW9uIHN0YXRlIG1hdGNoIHN1cHBvcnQnIENPTkZJR19JUDZfTkZfTUFUQ0hfU1RBVEUgJENPTkZJR19JUDZfTkZfQ09OTlRSQUNLICRDT05GSUdfSVA2X05GX0lQVEFCTEVTIAorIyAgZmkKKyMgIGlmIFsgIiRDT05GSUdfRVhQRVJJTUVOVEFMIiA9ICJ5IiBdOyB0aGVuCisjICAgIGRlcF90cmlzdGF0ZSAnICBVbmNsZWFuIG1hdGNoIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCknIENPTkZJR19JUDZfTkZfTUFUQ0hfVU5DTEVBTiAkQ09ORklHX0lQNl9ORl9JUFRBQkxFUworIyAgICBkZXBfdHJpc3RhdGUgJyAgT3duZXIgbWF0Y2ggc3VwcG9ydCAoRVhQRVJJTUVOVEFMKScgQ09ORklHX0lQNl9ORl9NQVRDSF9PV05FUiAkQ09ORklHX0lQNl9ORl9JUFRBQkxFUworIyAgZmkKKyMgVGhlIHRhcmdldHMKK2NvbmZpZyBJUDZfTkZfRklMVEVSCisJdHJpc3RhdGUgIlBhY2tldCBmaWx0ZXJpbmciCisJZGVwZW5kcyBvbiBJUDZfTkZfSVBUQUJMRVMKKwloZWxwCisJICBQYWNrZXQgZmlsdGVyaW5nIGRlZmluZXMgYSB0YWJsZSBgZmlsdGVyJywgd2hpY2ggaGFzIGEgc2VyaWVzIG9mCisJICBydWxlcyBmb3Igc2ltcGxlIHBhY2tldCBmaWx0ZXJpbmcgYXQgbG9jYWwgaW5wdXQsIGZvcndhcmRpbmcgYW5kCisJICBsb2NhbCBvdXRwdXQuICBTZWUgdGhlIG1hbiBwYWdlIGZvciBpcHRhYmxlcyg4KS4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBJUDZfTkZfVEFSR0VUX0xPRworCXRyaXN0YXRlICJMT0cgdGFyZ2V0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJUDZfTkZfRklMVEVSCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBMT0cnIHRhcmdldCwgd2hpY2ggYWxsb3dzIHlvdSB0byBjcmVhdGUgcnVsZXMgaW4KKwkgIGFueSBpcHRhYmxlcyB0YWJsZSB3aGljaCByZWNvcmRzIHRoZSBwYWNrZXQgaGVhZGVyIHRvIHRoZSBzeXNsb2cuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCisjICBpZiBbICIkQ09ORklHX0lQNl9ORl9GSUxURVIiICE9ICJuIiBdOyB0aGVuCisjICAgIGRlcF90cmlzdGF0ZSAnICAgIFJFSkVDVCB0YXJnZXQgc3VwcG9ydCcgQ09ORklHX0lQNl9ORl9UQVJHRVRfUkVKRUNUICRDT05GSUdfSVA2X05GX0ZJTFRFUgorIyAgICBpZiBbICIkQ09ORklHX0VYUEVSSU1FTlRBTCIgPSAieSIgXTsgdGhlbgorIyAgICAgIGRlcF90cmlzdGF0ZSAnICAgIE1JUlJPUiB0YXJnZXQgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKScgQ09ORklHX0lQNl9ORl9UQVJHRVRfTUlSUk9SICRDT05GSUdfSVA2X05GX0ZJTFRFUgorIyAgICBmaQorIyAgZmkKK2NvbmZpZyBJUDZfTkZfTUFOR0xFCisJdHJpc3RhdGUgIlBhY2tldCBtYW5nbGluZyIKKwlkZXBlbmRzIG9uIElQNl9ORl9JUFRBQkxFUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgbWFuZ2xlJyB0YWJsZSB0byBpcHRhYmxlczogc2VlIHRoZSBtYW4gcGFnZSBmb3IKKwkgIGlwdGFibGVzKDgpLiAgVGhpcyB0YWJsZSBpcyB1c2VkIGZvciB2YXJpb3VzIHBhY2tldCBhbHRlcmF0aW9ucworCSAgd2hpY2ggY2FuIGVmZmVjdCBob3cgdGhlIHBhY2tldCBpcyByb3V0ZWQuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCisjICAgIGRlcF90cmlzdGF0ZSAnICAgIFRPUyB0YXJnZXQgc3VwcG9ydCcgQ09ORklHX0lQNl9ORl9UQVJHRVRfVE9TICRDT05GSUdfSVBfTkZfTUFOR0xFCitjb25maWcgSVA2X05GX1RBUkdFVF9NQVJLCisJdHJpc3RhdGUgIk1BUksgdGFyZ2V0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJUDZfTkZfTUFOR0xFCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBNQVJLJyB0YXJnZXQsIHdoaWNoIGFsbG93cyB5b3UgdG8gY3JlYXRlIHJ1bGVzCisJICBpbiB0aGUgYG1hbmdsZScgdGFibGUgd2hpY2ggYWx0ZXIgdGhlIG5ldGZpbHRlciBtYXJrIChuZm1hcmspIGZpZWxkCisJICBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2tldCBwYWNrZXQgcHJpb3IgdG8gcm91dGluZy4gVGhpcyBjYW4gY2hhbmdlCisJICB0aGUgcm91dGluZyBtZXRob2QgKHNlZSBgVXNlIG5ldGZpbHRlciBNQVJLIHZhbHVlIGFzIHJvdXRpbmcKKwkgIGtleScpIGFuZCBjYW4gYWxzbyBiZSB1c2VkIGJ5IG90aGVyIHN1YnN5c3RlbXMgdG8gY2hhbmdlIHRoZWlyCisJICBiZWhhdmlvci4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKKyNkZXBfdHJpc3RhdGUgJyAgTE9HIHRhcmdldCBzdXBwb3J0JyBDT05GSUdfSVA2X05GX1RBUkdFVF9MT0cgJENPTkZJR19JUDZfTkZfSVBUQUJMRVMKK2NvbmZpZyBJUDZfTkZfUkFXCisJdHJpc3RhdGUgICdyYXcgdGFibGUgc3VwcG9ydCAocmVxdWlyZWQgZm9yIFRSQUNFKScKKwlkZXBlbmRzIG9uIElQNl9ORl9JUFRBQkxFUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgcmF3JyB0YWJsZSB0byBpcDZ0YWJsZXMuIFRoaXMgdGFibGUgaXMgdGhlIHZlcnkKKwkgIGZpcnN0IGluIHRoZSBuZXRmaWx0ZXIgZnJhbWV3b3JrIGFuZCBob29rcyBpbiBhdCB0aGUgUFJFUk9VVElORworCSAgYW5kIE9VVFBVVCBjaGFpbnMuCisJCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KKworZW5kbWVudQorCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvTWFrZWZpbGUgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU1MTcxNAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9NYWtlZmlsZQpAQCAtMCwwICsxLDI2IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbmV0ZmlsdGVyIG1vZHVsZXMgb24gdG9wIG9mIElQdjYuCisjCisKKyMgTGluayBvcmRlciBtYXR0ZXJzIGhlcmUuCitvYmotJChDT05GSUdfSVA2X05GX0lQVEFCTEVTKSArPSBpcDZfdGFibGVzLm8KK29iai0kKENPTkZJR19JUDZfTkZfTUFUQ0hfTElNSVQpICs9IGlwNnRfbGltaXQubworb2JqLSQoQ09ORklHX0lQNl9ORl9NQVRDSF9NQVJLKSArPSBpcDZ0X21hcmsubworb2JqLSQoQ09ORklHX0lQNl9ORl9NQVRDSF9MRU5HVEgpICs9IGlwNnRfbGVuZ3RoLm8KK29iai0kKENPTkZJR19JUDZfTkZfTUFUQ0hfTUFDKSArPSBpcDZ0X21hYy5vCitvYmotJChDT05GSUdfSVA2X05GX01BVENIX1JUKSArPSBpcDZ0X3J0Lm8KK29iai0kKENPTkZJR19JUDZfTkZfTUFUQ0hfT1BUUykgKz0gaXA2dF9oYmgubyBpcDZ0X2RzdC5vCitvYmotJChDT05GSUdfSVA2X05GX01BVENIX0lQVjZIRUFERVIpICs9IGlwNnRfaXB2NmhlYWRlci5vCitvYmotJChDT05GSUdfSVA2X05GX01BVENIX0ZSQUcpICs9IGlwNnRfZnJhZy5vCitvYmotJChDT05GSUdfSVA2X05GX01BVENIX0FIRVNQKSArPSBpcDZ0X2VzcC5vIGlwNnRfYWgubworb2JqLSQoQ09ORklHX0lQNl9ORl9NQVRDSF9FVUk2NCkgKz0gaXA2dF9ldWk2NC5vCitvYmotJChDT05GSUdfSVA2X05GX01BVENIX01VTFRJUE9SVCkgKz0gaXA2dF9tdWx0aXBvcnQubworb2JqLSQoQ09ORklHX0lQNl9ORl9NQVRDSF9PV05FUikgKz0gaXA2dF9vd25lci5vCitvYmotJChDT05GSUdfSVA2X05GX01BVENIX1BIWVNERVYpICs9IGlwNnRfcGh5c2Rldi5vCitvYmotJChDT05GSUdfSVA2X05GX0ZJTFRFUikgKz0gaXA2dGFibGVfZmlsdGVyLm8KK29iai0kKENPTkZJR19JUDZfTkZfTUFOR0xFKSArPSBpcDZ0YWJsZV9tYW5nbGUubworb2JqLSQoQ09ORklHX0lQNl9ORl9UQVJHRVRfTUFSSykgKz0gaXA2dF9NQVJLLm8KK29iai0kKENPTkZJR19JUDZfTkZfUVVFVUUpICs9IGlwNl9xdWV1ZS5vCitvYmotJChDT05GSUdfSVA2X05GX1RBUkdFVF9MT0cpICs9IGlwNnRfTE9HLm8KK29iai0kKENPTkZJR19JUDZfTkZfUkFXKSArPSBpcDZ0YWJsZV9yYXcubworb2JqLSQoQ09ORklHX0lQNl9ORl9NQVRDSF9ITCkgKz0gaXA2dF9obC5vCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3F1ZXVlLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3F1ZXVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU0ODMwYgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZfcXVldWUuYwpAQCAtMCwwICsxLDc0MSBAQAorLyoKKyAqIFRoaXMgaXMgYSBtb2R1bGUgd2hpY2ggaXMgdXNlZCBmb3IgcXVldWVpbmcgSVB2NiBwYWNrZXRzIGFuZAorICogY29tbXVuaWNhdGluZyB3aXRoIHVzZXJzcGFjZSB2aWEgbmV0bGluay4KKyAqCisgKiAoQykgMjAwMSBGZXJuYW5kbyBBbnRvbiwgdGhpcyBjb2RlIGlzIEdQTC4KKyAqICAgICBJUHY2NCBQcm9qZWN0IC0gV29yayBiYXNlZCBpbiBJUHY2NCBkcmFmdCBieSBBcnR1cm8gQXpjb3JyYS4KKyAqICAgICBVbml2ZXJzaWRhZCBDYXJsb3MgSUlJIGRlIE1hZHJpZCAtIExlZ2FuZXMgKE1hZHJpZCkgLSBTcGFpbgorICogICAgIFVuaXZlcnNpZGFkIFBvbGl0ZWNuaWNhIGRlIEFsY2FsYSBkZSBIZW5hcmVzIC0gQWxjYWxhIGRlIEguIChNYWRyaWQpIC0gU3BhaW4KKyAqICAgICBlbWFpbDogZmFudG9uQGl0LnVjM20uZXMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIDIwMDEtMTEtMDY6IEZpcnN0IHRyeS4gV29ya2luZyB3aXRoIGlwX3F1ZXVlLmMgZm9yIElQdjQgYW5kIHRyeWluZworICogICAgICAgICAgICAgdG8gYWRhcHQgaXQgdG8gSVB2NgorICogICAgICAgICAgICAgSEVBVklMWSBiYXNlZCBpbiBpcHF1ZXVlLmMgYnkgSmFtZXMgTW9ycmlzLiBJdCdzIGp1c3QKKyAqICAgICAgICAgICAgIGEgbGl0dGxlIG1vZGlmaWVkIHZlcnNpb24gb2YgaXQsIHNvIGhlJ3MgbmVhcmx5IHRoZQorICogICAgICAgICAgICAgcmVhbCBjb2RlciBvZiB0aGlzLgorICogICAgICAgICAgICAgRmV3IGNoYW5nZXMgbmVlZGVkLCBtYWlubHkgdGhlIGhhcmRfcm91dGluZyBjb2RlIGFuZAorICogICAgICAgICAgICAgdGhlIG5ldGxpbmsgc29ja2V0IHByb3RvY29sICh3ZSdyZSBORVRMSU5LX0lQNl9GVykuCisgKiAyMDAyLTA2LTI1OiBDb2RlIGNsZWFudXAuIFtKTTogcG9ydGVkIGNsZWFudXAgb3ZlciBmcm9tIGlwX3F1ZXVlLmNdCisgKiAyMDA1LTAyLTA0OiBBZGRlZCAvcHJvYyBjb3VudGVyIGZvciBkcm9wcGVkIHBhY2tldHM7IGZpeGVkIHNvCisgKiAgICAgICAgICAgICBwYWNrZXRzIGFyZW4ndCBkZWxpdmVyZWQgdG8gdXNlciBzcGFjZSBpZiB0aGV5J3JlIGdvaW5nCisgKiAgICAgICAgICAgICB0byBiZSBkcm9wcGVkLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L2lwNl9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oPgorCisjZGVmaW5lIElQUV9RTUFYX0RFRkFVTFQgMTAyNAorI2RlZmluZSBJUFFfUFJPQ19GU19OQU1FICJpcDZfcXVldWUiCisjZGVmaW5lIE5FVF9JUFFfUU1BWCAyMDg4CisjZGVmaW5lIE5FVF9JUFFfUU1BWF9OQU1FICJpcDZfcXVldWVfbWF4bGVuIgorCitzdHJ1Y3QgaXBxX3J0X2luZm8geworCXN0cnVjdCBpbjZfYWRkciBkYWRkcjsKKwlzdHJ1Y3QgaW42X2FkZHIgc2FkZHI7Cit9OworCitzdHJ1Y3QgaXBxX3F1ZXVlX2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IG5mX2luZm8gKmluZm87CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaXBxX3J0X2luZm8gcnRfaW5mbzsKK307CisKK3R5cGVkZWYgaW50ICgqaXBxX2NtcGZuKShzdHJ1Y3QgaXBxX3F1ZXVlX2VudHJ5ICosIHVuc2lnbmVkIGxvbmcpOworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjb3B5X21vZGUgPSBJUFFfQ09QWV9OT05FOworc3RhdGljIHVuc2lnbmVkIGludCBxdWV1ZV9tYXhsZW4gPSBJUFFfUU1BWF9ERUZBVUxUOworc3RhdGljIERFRklORV9SV0xPQ0socXVldWVfbG9jayk7CitzdGF0aWMgaW50IHBlZXJfcGlkOworc3RhdGljIHVuc2lnbmVkIGludCBjb3B5X3JhbmdlOworc3RhdGljIHVuc2lnbmVkIGludCBxdWV1ZV90b3RhbDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcXVldWVfZHJvcHBlZCA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IHF1ZXVlX3VzZXJfZHJvcHBlZCA9IDA7CitzdGF0aWMgc3RydWN0IHNvY2sgKmlwcW5sOworc3RhdGljIExJU1RfSEVBRChxdWV1ZV9saXN0KTsKK3N0YXRpYyBERUNMQVJFX01VVEVYKGlwcW5sX3NlbSk7CisKK3N0YXRpYyB2b2lkCitpcHFfaXNzdWVfdmVyZGljdChzdHJ1Y3QgaXBxX3F1ZXVlX2VudHJ5ICplbnRyeSwgaW50IHZlcmRpY3QpCit7CisJbmZfcmVpbmplY3QoZW50cnktPnNrYiwgZW50cnktPmluZm8sIHZlcmRpY3QpOworCWtmcmVlKGVudHJ5KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2lwcV9lbnF1ZXVlX2VudHJ5KHN0cnVjdCBpcHFfcXVldWVfZW50cnkgKmVudHJ5KQoreworICAgICAgIGxpc3RfYWRkKCZlbnRyeS0+bGlzdCwgJnF1ZXVlX2xpc3QpOworICAgICAgIHF1ZXVlX3RvdGFsKys7Cit9CisKKy8qCisgKiBGaW5kIGFuZCByZXR1cm4gYSBxdWV1ZWQgZW50cnkgbWF0Y2hlZCBieSBjbXBmbiwgb3IgcmV0dXJuIHRoZSBsYXN0CisgKiBlbnRyeSBpZiBjbXBmbiBpcyBOVUxMLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpcHFfcXVldWVfZW50cnkgKgorX19pcHFfZmluZF9lbnRyeShpcHFfY21wZm4gY21wZm4sIHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCisJbGlzdF9mb3JfZWFjaF9wcmV2KHAsICZxdWV1ZV9saXN0KSB7CisJCXN0cnVjdCBpcHFfcXVldWVfZW50cnkgKmVudHJ5ID0gKHN0cnVjdCBpcHFfcXVldWVfZW50cnkgKilwOworCQkKKwkJaWYgKCFjbXBmbiB8fCBjbXBmbihlbnRyeSwgZGF0YSkpCisJCQlyZXR1cm4gZW50cnk7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19faXBxX2RlcXVldWVfZW50cnkoc3RydWN0IGlwcV9xdWV1ZV9lbnRyeSAqZW50cnkpCit7CisJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKKwlxdWV1ZV90b3RhbC0tOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpcHFfcXVldWVfZW50cnkgKgorX19pcHFfZmluZF9kZXF1ZXVlX2VudHJ5KGlwcV9jbXBmbiBjbXBmbiwgdW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBpcHFfcXVldWVfZW50cnkgKmVudHJ5OworCisJZW50cnkgPSBfX2lwcV9maW5kX2VudHJ5KGNtcGZuLCBkYXRhKTsKKwlpZiAoZW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlfX2lwcV9kZXF1ZXVlX2VudHJ5KGVudHJ5KTsKKwlyZXR1cm4gZW50cnk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkCitfX2lwcV9mbHVzaChpbnQgdmVyZGljdCkKK3sKKwlzdHJ1Y3QgaXBxX3F1ZXVlX2VudHJ5ICplbnRyeTsKKwkKKwl3aGlsZSAoKGVudHJ5ID0gX19pcHFfZmluZF9kZXF1ZXVlX2VudHJ5KE5VTEwsIDApKSkKKwkJaXBxX2lzc3VlX3ZlcmRpY3QoZW50cnksIHZlcmRpY3QpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19pcHFfc2V0X21vZGUodW5zaWduZWQgY2hhciBtb2RlLCB1bnNpZ25lZCBpbnQgcmFuZ2UpCit7CisJaW50IHN0YXR1cyA9IDA7CisJCisJc3dpdGNoKG1vZGUpIHsKKwljYXNlIElQUV9DT1BZX05PTkU6CisJY2FzZSBJUFFfQ09QWV9NRVRBOgorCQljb3B5X21vZGUgPSBtb2RlOworCQljb3B5X3JhbmdlID0gMDsKKwkJYnJlYWs7CisJCQorCWNhc2UgSVBRX0NPUFlfUEFDS0VUOgorCQljb3B5X21vZGUgPSBtb2RlOworCQljb3B5X3JhbmdlID0gcmFuZ2U7CisJCWlmIChjb3B5X3JhbmdlID4gMHhGRkZGKQorCQkJY29weV9yYW5nZSA9IDB4RkZGRjsKKwkJYnJlYWs7CisJCQorCWRlZmF1bHQ6CisJCXN0YXR1cyA9IC1FSU5WQUw7CisKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2lwcV9yZXNldCh2b2lkKQoreworCXBlZXJfcGlkID0gMDsKKwluZXRfZGlzYWJsZV90aW1lc3RhbXAoKTsKKwlfX2lwcV9zZXRfbW9kZShJUFFfQ09QWV9OT05FLCAwKTsKKwlfX2lwcV9mbHVzaChORl9EUk9QKTsKK30KKworc3RhdGljIHN0cnVjdCBpcHFfcXVldWVfZW50cnkgKgoraXBxX2ZpbmRfZGVxdWV1ZV9lbnRyeShpcHFfY21wZm4gY21wZm4sIHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaXBxX3F1ZXVlX2VudHJ5ICplbnRyeTsKKwkKKwl3cml0ZV9sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKwllbnRyeSA9IF9faXBxX2ZpbmRfZGVxdWV1ZV9lbnRyeShjbXBmbiwgZGF0YSk7CisJd3JpdGVfdW5sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKwlyZXR1cm4gZW50cnk7Cit9CisKK3N0YXRpYyB2b2lkCitpcHFfZmx1c2goaW50IHZlcmRpY3QpCit7CisJd3JpdGVfbG9ja19iaCgmcXVldWVfbG9jayk7CisJX19pcHFfZmx1c2godmVyZGljdCk7CisJd3JpdGVfdW5sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICoKK2lwcV9idWlsZF9wYWNrZXRfbWVzc2FnZShzdHJ1Y3QgaXBxX3F1ZXVlX2VudHJ5ICplbnRyeSwgaW50ICplcnJwKQoreworCXVuc2lnbmVkIGNoYXIgKm9sZF90YWlsOworCXNpemVfdCBzaXplID0gMDsKKwlzaXplX3QgZGF0YV9sZW4gPSAwOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGlwcV9wYWNrZXRfbXNnICpwbXNnOworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCisJcmVhZF9sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKwkKKwlzd2l0Y2ggKGNvcHlfbW9kZSkgeworCWNhc2UgSVBRX0NPUFlfTUVUQToKKwljYXNlIElQUV9DT1BZX05PTkU6CisJCXNpemUgPSBOTE1TR19TUEFDRShzaXplb2YoKnBtc2cpKTsKKwkJZGF0YV9sZW4gPSAwOworCQlicmVhazsKKwkKKwljYXNlIElQUV9DT1BZX1BBQ0tFVDoKKwkJaWYgKGNvcHlfcmFuZ2UgPT0gMCB8fCBjb3B5X3JhbmdlID4gZW50cnktPnNrYi0+bGVuKQorCQkJZGF0YV9sZW4gPSBlbnRyeS0+c2tiLT5sZW47CisJCWVsc2UKKwkJCWRhdGFfbGVuID0gY29weV9yYW5nZTsKKwkJCisJCXNpemUgPSBOTE1TR19TUEFDRShzaXplb2YoKnBtc2cpICsgZGF0YV9sZW4pOworCQlicmVhazsKKwkKKwlkZWZhdWx0OgorCQkqZXJycCA9IC1FSU5WQUw7CisJCXJlYWRfdW5sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmVhZF91bmxvY2tfYmgoJnF1ZXVlX2xvY2spOworCisJc2tiID0gYWxsb2Nfc2tiKHNpemUsIEdGUF9BVE9NSUMpOworCWlmICghc2tiKQorCQlnb3RvIG5sbXNnX2ZhaWx1cmU7CisJCQorCW9sZF90YWlsPSBza2ItPnRhaWw7CisJbmxoID0gTkxNU0dfUFVUKHNrYiwgMCwgMCwgSVBRTV9QQUNLRVQsIHNpemUgLSBzaXplb2YoKm5saCkpOworCXBtc2cgPSBOTE1TR19EQVRBKG5saCk7CisJbWVtc2V0KHBtc2csIDAsIHNpemVvZigqcG1zZykpOworCisJcG1zZy0+cGFja2V0X2lkICAgICAgID0gKHVuc2lnbmVkIGxvbmcgKWVudHJ5OworCXBtc2ctPmRhdGFfbGVuICAgICAgICA9IGRhdGFfbGVuOworCXBtc2ctPnRpbWVzdGFtcF9zZWMgICA9IGVudHJ5LT5za2ItPnN0YW1wLnR2X3NlYzsKKwlwbXNnLT50aW1lc3RhbXBfdXNlYyAgPSBlbnRyeS0+c2tiLT5zdGFtcC50dl91c2VjOworCXBtc2ctPm1hcmsgICAgICAgICAgICA9IGVudHJ5LT5za2ItPm5mbWFyazsKKwlwbXNnLT5ob29rICAgICAgICAgICAgPSBlbnRyeS0+aW5mby0+aG9vazsKKwlwbXNnLT5od19wcm90b2NvbCAgICAgPSBlbnRyeS0+c2tiLT5wcm90b2NvbDsKKwkKKwlpZiAoZW50cnktPmluZm8tPmluZGV2KQorCQlzdHJjcHkocG1zZy0+aW5kZXZfbmFtZSwgZW50cnktPmluZm8tPmluZGV2LT5uYW1lKTsKKwllbHNlCisJCXBtc2ctPmluZGV2X25hbWVbMF0gPSAnXDAnOworCQorCWlmIChlbnRyeS0+aW5mby0+b3V0ZGV2KQorCQlzdHJjcHkocG1zZy0+b3V0ZGV2X25hbWUsIGVudHJ5LT5pbmZvLT5vdXRkZXYtPm5hbWUpOworCWVsc2UKKwkJcG1zZy0+b3V0ZGV2X25hbWVbMF0gPSAnXDAnOworCQorCWlmIChlbnRyeS0+aW5mby0+aW5kZXYgJiYgZW50cnktPnNrYi0+ZGV2KSB7CisJCXBtc2ctPmh3X3R5cGUgPSBlbnRyeS0+c2tiLT5kZXYtPnR5cGU7CisJCWlmIChlbnRyeS0+c2tiLT5kZXYtPmhhcmRfaGVhZGVyX3BhcnNlKQorCQkJcG1zZy0+aHdfYWRkcmxlbiA9CisJCQkJZW50cnktPnNrYi0+ZGV2LT5oYXJkX2hlYWRlcl9wYXJzZShlbnRyeS0+c2tiLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1zZy0+aHdfYWRkcik7CisJfQorCQorCWlmIChkYXRhX2xlbikKKwkJaWYgKHNrYl9jb3B5X2JpdHMoZW50cnktPnNrYiwgMCwgcG1zZy0+cGF5bG9hZCwgZGF0YV9sZW4pKQorCQkJQlVHKCk7CisJCQorCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gb2xkX3RhaWw7CisJcmV0dXJuIHNrYjsKKworbmxtc2dfZmFpbHVyZToKKwlpZiAoc2tiKQorCQlrZnJlZV9za2Ioc2tiKTsKKwkqZXJycCA9IC1FSU5WQUw7CisJcHJpbnRrKEtFUk5fRVJSICJpcDZfcXVldWU6IGVycm9yIGNyZWF0aW5nIHBhY2tldCBtZXNzYWdlXG4iKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludAoraXBxX2VucXVldWVfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZl9pbmZvICppbmZvLCB2b2lkICpkYXRhKQoreworCWludCBzdGF0dXMgPSAtRUlOVkFMOworCXN0cnVjdCBza19idWZmICpuc2tiOworCXN0cnVjdCBpcHFfcXVldWVfZW50cnkgKmVudHJ5OworCisJaWYgKGNvcHlfbW9kZSA9PSBJUFFfQ09QWV9OT05FKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWVudHJ5ID0ga21hbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0FUT01JQyk7CisJaWYgKGVudHJ5ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpcDZfcXVldWU6IE9PTSBpbiBpcHFfZW5xdWV1ZV9wYWNrZXQoKVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWVudHJ5LT5pbmZvID0gaW5mbzsKKwllbnRyeS0+c2tiID0gc2tiOworCisJaWYgKGVudHJ5LT5pbmZvLT5ob29rID09IE5GX0lQX0xPQ0FMX09VVCkgeworCQlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gc2tiLT5uaC5pcHY2aDsKKworCQllbnRyeS0+cnRfaW5mby5kYWRkciA9IGlwaC0+ZGFkZHI7CisJCWVudHJ5LT5ydF9pbmZvLnNhZGRyID0gaXBoLT5zYWRkcjsKKwl9CisKKwluc2tiID0gaXBxX2J1aWxkX3BhY2tldF9tZXNzYWdlKGVudHJ5LCAmc3RhdHVzKTsKKwlpZiAobnNrYiA9PSBOVUxMKQorCQlnb3RvIGVycl9vdXRfZnJlZTsKKwkJCisJd3JpdGVfbG9ja19iaCgmcXVldWVfbG9jayk7CisJCisJaWYgKCFwZWVyX3BpZCkKKwkJZ290byBlcnJfb3V0X2ZyZWVfbnNrYjsgCisKKwlpZiAocXVldWVfdG90YWwgPj0gcXVldWVfbWF4bGVuKSB7CisgICAgICAgICAgICAgICAgcXVldWVfZHJvcHBlZCsrOworCQlzdGF0dXMgPSAtRU5PU1BDOworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkgICAgICAgIHByaW50ayAoS0VSTl9XQVJOSU5HICJpcDZfcXVldWU6IGZpbGwgYXQgJWQgZW50cmllcywgIgorCQkJCSJkcm9wcGluZyBwYWNrZXQocykuICBEcm9wcGVkOiAlZFxuIiwgcXVldWVfdG90YWwsCisJCQkJcXVldWVfZHJvcHBlZCk7CisJCWdvdG8gZXJyX291dF9mcmVlX25za2I7CisJfQorCisgCS8qIG5ldGxpbmtfdW5pY2FzdCB3aWxsIGVpdGhlciBmcmVlIHRoZSBuc2tiIG9yIGF0dGFjaCBpdCB0byBhIHNvY2tldCAqLyAKKwlzdGF0dXMgPSBuZXRsaW5rX3VuaWNhc3QoaXBxbmwsIG5za2IsIHBlZXJfcGlkLCBNU0dfRE9OVFdBSVQpOworCWlmIChzdGF0dXMgPCAwKSB7CisgCSAgICAgICAgcXVldWVfdXNlcl9kcm9wcGVkKys7CisJCWdvdG8gZXJyX291dF91bmxvY2s7CisJfQorCQorCV9faXBxX2VucXVldWVfZW50cnkoZW50cnkpOworCisJd3JpdGVfdW5sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKwlyZXR1cm4gc3RhdHVzOworCQorZXJyX291dF9mcmVlX25za2I6CisJa2ZyZWVfc2tiKG5za2IpOyAKKwkKK2Vycl9vdXRfdW5sb2NrOgorCXdyaXRlX3VubG9ja19iaCgmcXVldWVfbG9jayk7CisKK2Vycl9vdXRfZnJlZToKKwlrZnJlZShlbnRyeSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAoraXBxX21hbmdsZV9pcHY2KGlwcV92ZXJkaWN0X21zZ190ICp2LCBzdHJ1Y3QgaXBxX3F1ZXVlX2VudHJ5ICplKQoreworCWludCBkaWZmOworCXN0cnVjdCBpcHY2aGRyICp1c2VyX2lwaCA9IChzdHJ1Y3QgaXB2NmhkciAqKXYtPnBheWxvYWQ7CisKKwlpZiAodi0+ZGF0YV9sZW4gPCBzaXplb2YoKnVzZXJfaXBoKSkKKwkJcmV0dXJuIDA7CisJZGlmZiA9IHYtPmRhdGFfbGVuIC0gZS0+c2tiLT5sZW47CisJaWYgKGRpZmYgPCAwKQorCQlza2JfdHJpbShlLT5za2IsIHYtPmRhdGFfbGVuKTsKKwllbHNlIGlmIChkaWZmID4gMCkgeworCQlpZiAodi0+ZGF0YV9sZW4gPiAweEZGRkYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGRpZmYgPiBza2JfdGFpbHJvb20oZS0+c2tiKSkgeworCQkJc3RydWN0IHNrX2J1ZmYgKm5ld3NrYjsKKwkJCQorCQkJbmV3c2tiID0gc2tiX2NvcHlfZXhwYW5kKGUtPnNrYiwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICBza2JfaGVhZHJvb20oZS0+c2tiKSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgIEdGUF9BVE9NSUMpOworCQkJaWYgKG5ld3NrYiA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaXA2X3F1ZXVlOiBPT00gIgorCQkJCSAgICAgICJpbiBtYW5nbGUsIGRyb3BwaW5nIHBhY2tldFxuIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlpZiAoZS0+c2tiLT5zaykKKwkJCQlza2Jfc2V0X293bmVyX3cobmV3c2tiLCBlLT5za2ItPnNrKTsKKwkJCWtmcmVlX3NrYihlLT5za2IpOworCQkJZS0+c2tiID0gbmV3c2tiOworCQl9CisJCXNrYl9wdXQoZS0+c2tiLCBkaWZmKTsKKwl9CisJaWYgKCFza2JfaXBfbWFrZV93cml0YWJsZSgmZS0+c2tiLCB2LT5kYXRhX2xlbikpCisJCXJldHVybiAtRU5PTUVNOworCW1lbWNweShlLT5za2ItPmRhdGEsIHYtPnBheWxvYWQsIHYtPmRhdGFfbGVuKTsKKwllLT5za2ItPm5mY2FjaGUgfD0gTkZDX0FMVEVSRUQ7CisKKwkvKgorCSAqIEV4dHJhIHJvdXRpbmcgbWF5IG5lZWRlZCBvbiBsb2NhbCBvdXQsIGFzIHRoZSBRVUVVRSB0YXJnZXQgbmV2ZXIKKwkgKiByZXR1cm5zIGNvbnRyb2wgdG8gdGhlIHRhYmxlLgorICAgICAgICAgKiBOb3QgYSBuaWNlIHdheSB0byBjbXAsIGJ1dCB3b3JrcworCSAqLworCWlmIChlLT5pbmZvLT5ob29rID09IE5GX0lQX0xPQ0FMX09VVCkgeworCQlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gZS0+c2tiLT5uaC5pcHY2aDsKKwkJaWYgKCFpcHY2X2FkZHJfZXF1YWwoJmlwaC0+ZGFkZHIsICZlLT5ydF9pbmZvLmRhZGRyKSB8fAorCQkgICAgIWlwdjZfYWRkcl9lcXVhbCgmaXBoLT5zYWRkciwgJmUtPnJ0X2luZm8uc2FkZHIpKQorCQkJcmV0dXJuIGlwNl9yb3V0ZV9tZV9oYXJkZXIoZS0+c2tiKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitpZF9jbXAoc3RydWN0IGlwcV9xdWV1ZV9lbnRyeSAqZSwgdW5zaWduZWQgbG9uZyBpZCkKK3sKKwlyZXR1cm4gKGlkID09ICh1bnNpZ25lZCBsb25nICllKTsKK30KKworc3RhdGljIGludAoraXBxX3NldF92ZXJkaWN0KHN0cnVjdCBpcHFfdmVyZGljdF9tc2cgKnZtc2csIHVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IGlwcV9xdWV1ZV9lbnRyeSAqZW50cnk7CisKKwlpZiAodm1zZy0+dmFsdWUgPiBORl9NQVhfVkVSRElDVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllbnRyeSA9IGlwcV9maW5kX2RlcXVldWVfZW50cnkoaWRfY21wLCB2bXNnLT5pZCk7CisJaWYgKGVudHJ5ID09IE5VTEwpCisJCXJldHVybiAtRU5PRU5UOworCWVsc2UgeworCQlpbnQgdmVyZGljdCA9IHZtc2ctPnZhbHVlOworCQkKKwkJaWYgKHZtc2ctPmRhdGFfbGVuICYmIHZtc2ctPmRhdGFfbGVuID09IGxlbikKKwkJCWlmIChpcHFfbWFuZ2xlX2lwdjYodm1zZywgZW50cnkpIDwgMCkKKwkJCQl2ZXJkaWN0ID0gTkZfRFJPUDsKKwkJCisJCWlwcV9pc3N1ZV92ZXJkaWN0KGVudHJ5LCB2ZXJkaWN0KTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50CitpcHFfc2V0X21vZGUodW5zaWduZWQgY2hhciBtb2RlLCB1bnNpZ25lZCBpbnQgcmFuZ2UpCit7CisJaW50IHN0YXR1czsKKworCXdyaXRlX2xvY2tfYmgoJnF1ZXVlX2xvY2spOworCXN0YXR1cyA9IF9faXBxX3NldF9tb2RlKG1vZGUsIHJhbmdlKTsKKwl3cml0ZV91bmxvY2tfYmgoJnF1ZXVlX2xvY2spOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK2lwcV9yZWNlaXZlX3BlZXIoc3RydWN0IGlwcV9wZWVyX21zZyAqcG1zZywKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWludCBzdGF0dXMgPSAwOworCisJaWYgKGxlbiA8IHNpemVvZigqcG1zZykpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJUFFNX01PREU6CisJCXN0YXR1cyA9IGlwcV9zZXRfbW9kZShwbXNnLT5tc2cubW9kZS52YWx1ZSwKKwkJICAgICAgICAgICAgICAgICAgICAgIHBtc2ctPm1zZy5tb2RlLnJhbmdlKTsKKwkJYnJlYWs7CisJCQorCWNhc2UgSVBRTV9WRVJESUNUOgorCQlpZiAocG1zZy0+bXNnLnZlcmRpY3QudmFsdWUgPiBORl9NQVhfVkVSRElDVCkKKwkJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWVsc2UKKwkJCXN0YXR1cyA9IGlwcV9zZXRfdmVyZGljdCgmcG1zZy0+bXNnLnZlcmRpY3QsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC0gc2l6ZW9mKCpwbXNnKSk7CisJCQlicmVhazsKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50CitkZXZfY21wKHN0cnVjdCBpcHFfcXVldWVfZW50cnkgKmVudHJ5LCB1bnNpZ25lZCBsb25nIGlmaW5kZXgpCit7CisJaWYgKGVudHJ5LT5pbmZvLT5pbmRldikKKwkJaWYgKGVudHJ5LT5pbmZvLT5pbmRldi0+aWZpbmRleCA9PSBpZmluZGV4KQorCQkJcmV0dXJuIDE7CisJCQkKKwlpZiAoZW50cnktPmluZm8tPm91dGRldikKKwkJaWYgKGVudHJ5LT5pbmZvLT5vdXRkZXYtPmlmaW5kZXggPT0gaWZpbmRleCkKKwkJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitpcHFfZGV2X2Ryb3AoaW50IGlmaW5kZXgpCit7CisJc3RydWN0IGlwcV9xdWV1ZV9lbnRyeSAqZW50cnk7CisJCisJd2hpbGUgKChlbnRyeSA9IGlwcV9maW5kX2RlcXVldWVfZW50cnkoZGV2X2NtcCwgaWZpbmRleCkpICE9IE5VTEwpCisJCWlwcV9pc3N1ZV92ZXJkaWN0KGVudHJ5LCBORl9EUk9QKTsKK30KKworI2RlZmluZSBSQ1ZfU0tCX0ZBSUwoZXJyKSBkbyB7IG5ldGxpbmtfYWNrKHNrYiwgbmxoLCAoZXJyKSk7IHJldHVybjsgfSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSB2b2lkCitpcHFfcmN2X3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBzdGF0dXMsIHR5cGUsIHBpZCwgZmxhZ3MsIG5sbXNnbGVuLCBza2JsZW47CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisKKwlza2JsZW4gPSBza2ItPmxlbjsKKwlpZiAoc2tibGVuIDwgc2l6ZW9mKCpubGgpKQorCQlyZXR1cm47CisKKwlubGggPSAoc3RydWN0IG5sbXNnaGRyICopc2tiLT5kYXRhOworCW5sbXNnbGVuID0gbmxoLT5ubG1zZ19sZW47CisJaWYgKG5sbXNnbGVuIDwgc2l6ZW9mKCpubGgpIHx8IHNrYmxlbiA8IG5sbXNnbGVuKQorCQlyZXR1cm47CisKKwlwaWQgPSBubGgtPm5sbXNnX3BpZDsKKwlmbGFncyA9IG5saC0+bmxtc2dfZmxhZ3M7CisJCisJaWYocGlkIDw9IDAgfHwgIShmbGFncyAmIE5MTV9GX1JFUVVFU1QpIHx8IGZsYWdzICYgTkxNX0ZfTVVMVEkpCisJCVJDVl9TS0JfRkFJTCgtRUlOVkFMKTsKKwkJCisJaWYgKGZsYWdzICYgTVNHX1RSVU5DKQorCQlSQ1ZfU0tCX0ZBSUwoLUVDT01NKTsKKwkJCisJdHlwZSA9IG5saC0+bmxtc2dfdHlwZTsKKwlpZiAodHlwZSA8IE5MTVNHX05PT1AgfHwgdHlwZSA+PSBJUFFNX01BWCkKKwkJUkNWX1NLQl9GQUlMKC1FSU5WQUwpOworCQkKKwlpZiAodHlwZSA8PSBJUFFNX0JBU0UpCisJCXJldHVybjsKKwkKKwlpZiAoc2VjdXJpdHlfbmV0bGlua19yZWN2KHNrYikpCisJCVJDVl9TS0JfRkFJTCgtRVBFUk0pOwkKKworCXdyaXRlX2xvY2tfYmgoJnF1ZXVlX2xvY2spOworCQorCWlmIChwZWVyX3BpZCkgeworCQlpZiAocGVlcl9waWQgIT0gcGlkKSB7CisJCQl3cml0ZV91bmxvY2tfYmgoJnF1ZXVlX2xvY2spOworCQkJUkNWX1NLQl9GQUlMKC1FQlVTWSk7CisJCX0KKwl9IGVsc2UgeworCQluZXRfZW5hYmxlX3RpbWVzdGFtcCgpOworCQlwZWVyX3BpZCA9IHBpZDsKKwl9CisJCQorCXdyaXRlX3VubG9ja19iaCgmcXVldWVfbG9jayk7CisJCisJc3RhdHVzID0gaXBxX3JlY2VpdmVfcGVlcihOTE1TR19EQVRBKG5saCksIHR5cGUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICBza2JsZW4gLSBOTE1TR19MRU5HVEgoMCkpOworCWlmIChzdGF0dXMgPCAwKQorCQlSQ1ZfU0tCX0ZBSUwoc3RhdHVzKTsKKwkJCisJaWYgKGZsYWdzICYgTkxNX0ZfQUNLKQorCQluZXRsaW5rX2Fjayhza2IsIG5saCwgMCk7CisgICAgICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2lwcV9yY3Zfc2soc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuKQoreworCWRvIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQlpZiAoZG93bl90cnlsb2NrKCZpcHFubF9zZW0pKQorCQkJcmV0dXJuOworCQkJCisJCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSkgIT0gTlVMTCkgeworCQkJaXBxX3Jjdl9za2Ioc2tiKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQl9CisJCQorCQl1cCgmaXBxbmxfc2VtKTsKKworCX0gd2hpbGUgKGlwcW5sICYmIGlwcW5sLT5za19yZWNlaXZlX3F1ZXVlLnFsZW4pOworfQorCitzdGF0aWMgaW50CitpcHFfcmN2X2Rldl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHB0cjsKKworCS8qIERyb3AgYW55IHBhY2tldHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkb3duZWQgZGV2aWNlICovCisJaWYgKGV2ZW50ID09IE5FVERFVl9ET1dOKQorCQlpcHFfZGV2X2Ryb3AoZGV2LT5pZmluZGV4KTsKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaXBxX2Rldl9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbAk9IGlwcV9yY3ZfZGV2X2V2ZW50LAorfTsKKworc3RhdGljIGludAoraXBxX3Jjdl9ubF9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgbmV0bGlua19ub3RpZnkgKm4gPSBwdHI7CisKKwlpZiAoZXZlbnQgPT0gTkVUTElOS19VUkVMRUFTRSAmJgorCSAgICBuLT5wcm90b2NvbCA9PSBORVRMSU5LX0lQNl9GVyAmJiBuLT5waWQpIHsKKwkJd3JpdGVfbG9ja19iaCgmcXVldWVfbG9jayk7CisJCWlmIChuLT5waWQgPT0gcGVlcl9waWQpCisJCQlfX2lwcV9yZXNldCgpOworCQl3cml0ZV91bmxvY2tfYmgoJnF1ZXVlX2xvY2spOworCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaXBxX25sX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsCT0gaXBxX3Jjdl9ubF9ldmVudCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqaXBxX3N5c2N0bF9oZWFkZXI7CisKK3N0YXRpYyBjdGxfdGFibGUgaXBxX3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBORVRfSVBRX1FNQVgsCisJCS5wcm9jbmFtZQk9IE5FVF9JUFFfUU1BWF9OQU1FLAorCQkuZGF0YQkJPSAmcXVldWVfbWF4bGVuLAorCQkubWF4bGVuCQk9IHNpemVvZihxdWV1ZV9tYXhsZW4pLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYworCX0sCisgCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCitzdGF0aWMgY3RsX3RhYmxlIGlwcV9kaXJfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY2LAorCQkucHJvY25hbWUJPSAiaXB2NiIsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSBpcHFfdGFibGUKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCitzdGF0aWMgY3RsX3RhYmxlIGlwcV9yb290X3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBDVExfTkVULAorCQkucHJvY25hbWUJPSAibmV0IiwKKwkJLm1vZGUJCT0gMDU1NSwKKwkJLmNoaWxkCQk9IGlwcV9kaXJfdGFibGUKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCitzdGF0aWMgaW50CitpcHFfZ2V0X2luZm8oY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCkKK3sKKwlpbnQgbGVuOworCisJcmVhZF9sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKwkKKwlsZW4gPSBzcHJpbnRmKGJ1ZmZlciwKKwkgICAgICAgICAgICAgICJQZWVyIFBJRCAgICAgICAgICA6ICVkXG4iCisJICAgICAgICAgICAgICAiQ29weSBtb2RlICAgICAgICAgOiAlaHVcbiIKKwkgICAgICAgICAgICAgICJDb3B5IHJhbmdlICAgICAgICA6ICV1XG4iCisJICAgICAgICAgICAgICAiUXVldWUgbGVuZ3RoICAgICAgOiAldVxuIgorCSAgICAgICAgICAgICAgIlF1ZXVlIG1heC4gbGVuZ3RoIDogJXVcbiIKKwkJICAgICAgIlF1ZXVlIGRyb3BwZWQgICAgIDogJXVcbiIKKwkJICAgICAgIk5ldGZpbHRlciBkcm9wcGVkIDogJXVcbiIsCisJICAgICAgICAgICAgICBwZWVyX3BpZCwKKwkgICAgICAgICAgICAgIGNvcHlfbW9kZSwKKwkgICAgICAgICAgICAgIGNvcHlfcmFuZ2UsCisJICAgICAgICAgICAgICBxdWV1ZV90b3RhbCwKKwkgICAgICAgICAgICAgIHF1ZXVlX21heGxlbiwKKwkJICAgICAgcXVldWVfZHJvcHBlZCwKKwkJICAgICAgcXVldWVfdXNlcl9kcm9wcGVkKTsKKworCXJlYWRfdW5sb2NrX2JoKCZxdWV1ZV9sb2NrKTsKKwkKKwkqc3RhcnQgPSBidWZmZXIgKyBvZmZzZXQ7CisJbGVuIC09IG9mZnNldDsKKwlpZiAobGVuID4gbGVuZ3RoKQorCQlsZW4gPSBsZW5ndGg7CisJZWxzZSBpZiAobGVuIDwgMCkKKwkJbGVuID0gMDsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50Citpbml0X29yX2NsZWFudXAoaW50IGluaXQpCit7CisJaW50IHN0YXR1cyA9IC1FTk9NRU07CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jOworCQorCWlmICghaW5pdCkKKwkJZ290byBjbGVhbnVwOworCisJbmV0bGlua19yZWdpc3Rlcl9ub3RpZmllcigmaXBxX25sX25vdGlmaWVyKTsKKwlpcHFubCA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShORVRMSU5LX0lQNl9GVywgaXBxX3Jjdl9zayk7CisJaWYgKGlwcW5sID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpcDZfcXVldWU6IGZhaWxlZCB0byBjcmVhdGUgbmV0bGluayBzb2NrZXRcbiIpOworCQlnb3RvIGNsZWFudXBfbmV0bGlua19ub3RpZmllcjsKKwl9CisKKwlwcm9jID0gcHJvY19uZXRfY3JlYXRlKElQUV9QUk9DX0ZTX05BTUUsIDAsIGlwcV9nZXRfaW5mbyk7CisJaWYgKHByb2MpCisJCXByb2MtPm93bmVyID0gVEhJU19NT0RVTEU7CisJZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXA2X3F1ZXVlOiBmYWlsZWQgdG8gY3JlYXRlIHByb2MgZW50cnlcbiIpOworCQlnb3RvIGNsZWFudXBfaXBxbmw7CisJfQorCQorCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmaXBxX2Rldl9ub3RpZmllcik7CisJaXBxX3N5c2N0bF9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUoaXBxX3Jvb3RfdGFibGUsIDApOworCQorCXN0YXR1cyA9IG5mX3JlZ2lzdGVyX3F1ZXVlX2hhbmRsZXIoUEZfSU5FVDYsIGlwcV9lbnF1ZXVlX3BhY2tldCwgTlVMTCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpcDZfcXVldWU6IGZhaWxlZCB0byByZWdpc3RlciBxdWV1ZSBoYW5kbGVyXG4iKTsKKwkJZ290byBjbGVhbnVwX3N5c2N0bDsKKwl9CisJcmV0dXJuIHN0YXR1czsKKworY2xlYW51cDoKKwluZl91bnJlZ2lzdGVyX3F1ZXVlX2hhbmRsZXIoUEZfSU5FVDYpOworCXN5bmNocm9uaXplX25ldCgpOworCWlwcV9mbHVzaChORl9EUk9QKTsKKwkKK2NsZWFudXBfc3lzY3RsOgorCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGlwcV9zeXNjdGxfaGVhZGVyKTsKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmaXBxX2Rldl9ub3RpZmllcik7CisJcHJvY19uZXRfcmVtb3ZlKElQUV9QUk9DX0ZTX05BTUUpOworCQorY2xlYW51cF9pcHFubDoKKwlzb2NrX3JlbGVhc2UoaXBxbmwtPnNrX3NvY2tldCk7CisJZG93bigmaXBxbmxfc2VtKTsKKwl1cCgmaXBxbmxfc2VtKTsKKwkKK2NsZWFudXBfbmV0bGlua19ub3RpZmllcjoKKwluZXRsaW5rX3VucmVnaXN0ZXJfbm90aWZpZXIoJmlwcV9ubF9ub3RpZmllcik7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCQorCXJldHVybiBpbml0X29yX2NsZWFudXAoMSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaW5pdF9vcl9jbGVhbnVwKDApOworfQorCitNT0RVTEVfREVTQ1JJUFRJT04oIklQdjYgcGFja2V0IHF1ZXVlIGhhbmRsZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3RhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MzUyNzYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3RhYmxlcy5jCkBAIC0wLDAgKzEsMTk3MCBAQAorLyoKKyAqIFBhY2tldCBtYXRjaGluZyBjb2RlLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBQYXVsIGBSdXN0eScgUnVzc2VsbCAmIE1pY2hhZWwgSi4gTmV1bGluZworICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgTmV0ZmlsdGVyIGNvcmUgdGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIDE5IEphbiAyMDAyIEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAJLSBpbmNyZWFzZSBtb2R1bGUgdXNhZ2UgY291bnQgYXMgc29vbiBhcyB3ZSBoYXZlIHJ1bGVzIGluc2lkZQorICogCSAgYSB0YWJsZQorICogMDYgSnVuIDIwMDIgQW5kcmFzIEtpcy1TemFibyA8a2lzemFAc2NoLmJtZS5odT4KKyAqICAgICAgLSBuZXcgZXh0ZW5zaW9uIGhlYWRlciBwYXJzZXIgY29kZQorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wdjYuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVB2NiBwYWNrZXQgZmlsdGVyIik7CisKKyNkZWZpbmUgSVBWNl9IRFJfTEVOCShzaXplb2Yoc3RydWN0IGlwdjZoZHIpKQorI2RlZmluZSBJUFY2X09QVEhEUl9MRU4JKHNpemVvZihzdHJ1Y3QgaXB2Nl9vcHRfaGRyKSkKKworLyojZGVmaW5lIERFQlVHX0lQX0ZJUkVXQUxMKi8KKy8qI2RlZmluZSBERUJVR19BTExPV19BTEwqLyAvKiBVc2VmdWwgZm9yIHJlbW90ZSBkZWJ1Z2dpbmcgKi8KKy8qI2RlZmluZSBERUJVR19JUF9GSVJFV0FMTF9VU0VSKi8KKworI2lmZGVmIERFQlVHX0lQX0ZJUkVXQUxMCisjZGVmaW5lIGRwcmludGYoZm9ybWF0LCBhcmdzLi4uKSAgcHJpbnRrKGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBkcHJpbnRmKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfSVBfRklSRVdBTExfVVNFUgorI2RlZmluZSBkdXByaW50Zihmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgZHVwcmludGYoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCisjZGVmaW5lIElQX05GX0FTU0VSVCh4KQkJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlpZiAoISh4KSkJCQkJCQlcCisJCXByaW50aygiSVBfTkZfQVNTRVJUOiAlczolczoldVxuIiwJCVwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgX19GSUxFX18sIF9fTElORV9fKTsJXAorfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgSVBfTkZfQVNTRVJUKHgpCisjZW5kaWYKKyNkZWZpbmUgU01QX0FMSUdOKHgpICgoKHgpICsgU01QX0NBQ0hFX0JZVEVTLTEpICYgfihTTVBfQ0FDSEVfQllURVMtMSkpCisKK3N0YXRpYyBERUNMQVJFX01VVEVYKGlwNnRfbXV0ZXgpOworCisvKiBNdXN0IGhhdmUgbXV0ZXggKi8KKyNkZWZpbmUgQVNTRVJUX1JFQURfTE9DSyh4KSBJUF9ORl9BU1NFUlQoZG93bl90cnlsb2NrKCZpcDZ0X211dGV4KSAhPSAwKQorI2RlZmluZSBBU1NFUlRfV1JJVEVfTE9DSyh4KSBJUF9ORl9BU1NFUlQoZG93bl90cnlsb2NrKCZpcDZ0X211dGV4KSAhPSAwKQorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2xvY2toZWxwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvbGlzdGhlbHAuaD4KKworI2lmIDAKKy8qIEFsbCB0aGUgYmV0dGVyIHRvIGRlYnVnIHlvdSB3aXRoLi4uICovCisjZGVmaW5lIHN0YXRpYworI2RlZmluZSBpbmxpbmUKKyNlbmRpZgorCisvKiBMb2NraW5nIGlzIHNpbXBsZTogd2UgYXNzdW1lIGF0IHdvcnN0IGNhc2UgdGhlcmUgd2lsbCBiZSBvbmUgcGFja2V0CisgICBpbiB1c2VyIGNvbnRleHQgYW5kIG9uZSBmcm9tIGJvdHRvbSBoYWx2ZXMgKG9yIHNvZnQgaXJxIGlmIEFsZXhleSdzCisgICBzb2Z0bmV0IHBhdGNoIHdhcyBhcHBsaWVkKS4KKworICAgV2Uga2VlcCBhIHNldCBvZiBydWxlcyBmb3IgZWFjaCBDUFUsIHNvIHdlIGNhbiBhdm9pZCB3cml0ZS1sb2NraW5nCisgICB0aGVtOyBkb2luZyBhIHJlYWRsb2NrX2JoKCkgc3RvcHMgcGFja2V0cyBjb21pbmcgdGhyb3VnaCBpZiB3ZSdyZQorICAgaW4gdXNlciBjb250ZXh0LgorCisgICBUbyBiZSBjYWNoZSBmcmllbmRseSBvbiBTTVAsIHdlIGFycmFuZ2UgdGhlbSBsaWtlIHNvOgorICAgWyBuLWVudHJpZXMgXQorICAgLi4uIGNhY2hlLWFsaWduIHBhZGRpbmcgLi4uCisgICBbIG4tZW50cmllcyBdCisKKyAgIEhlbmNlIHRoZSBzdGFydCBvZiBhbnkgdGFibGUgaXMgZ2l2ZW4gYnkgZ2V0X3RhYmxlKCkgYmVsb3cuICAqLworCisvKiBUaGUgdGFibGUgaXRzZWxmICovCitzdHJ1Y3QgaXA2dF90YWJsZV9pbmZvCit7CisJLyogU2l6ZSBwZXIgdGFibGUgKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwkvKiBOdW1iZXIgb2YgZW50cmllczogRklYTUUuIC0tUlIgKi8KKwl1bnNpZ25lZCBpbnQgbnVtYmVyOworCS8qIEluaXRpYWwgbnVtYmVyIG9mIGVudHJpZXMuIE5lZWRlZCBmb3IgbW9kdWxlIHVzYWdlIGNvdW50ICovCisJdW5zaWduZWQgaW50IGluaXRpYWxfZW50cmllczsKKworCS8qIEVudHJ5IHBvaW50cyBhbmQgdW5kZXJmbG93cyAqLworCXVuc2lnbmVkIGludCBob29rX2VudHJ5W05GX0lQNl9OVU1IT09LU107CisJdW5zaWduZWQgaW50IHVuZGVyZmxvd1tORl9JUDZfTlVNSE9PS1NdOworCisJLyogaXA2dF9lbnRyeSB0YWJsZXM6IG9uZSBwZXIgQ1BVICovCisJY2hhciBlbnRyaWVzWzBdIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKK307CisKK3N0YXRpYyBMSVNUX0hFQUQoaXA2dF90YXJnZXQpOworc3RhdGljIExJU1RfSEVBRChpcDZ0X21hdGNoKTsKK3N0YXRpYyBMSVNUX0hFQUQoaXA2dF90YWJsZXMpOworI2RlZmluZSBBRERfQ09VTlRFUihjLGIscCkgZG8geyAoYykuYmNudCArPSAoYik7IChjKS5wY250ICs9IChwKTsgfSB3aGlsZSgwKQorCisjaWZkZWYgQ09ORklHX1NNUAorI2RlZmluZSBUQUJMRV9PRkZTRVQodCxwKSAoU01QX0FMSUdOKCh0KS0+c2l6ZSkqKHApKQorI2Vsc2UKKyNkZWZpbmUgVEFCTEVfT0ZGU0VUKHQscCkgMAorI2VuZGlmCisKKyNpZiAwCisjZGVmaW5lIGRvd24oeCkgZG8geyBwcmludGsoIkRPV046JXU6IiAjeCAiXG4iLCBfX0xJTkVfXyk7IGRvd24oeCk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgZG93bl9pbnRlcnJ1cHRpYmxlKHgpICh7IGludCBfX3I7IHByaW50aygiRE9XTmk6JXU6IiAjeCAiXG4iLCBfX0xJTkVfXyk7IF9fciA9IGRvd25faW50ZXJydXB0aWJsZSh4KTsgaWYgKF9fciAhPSAwKSBwcmludGsoIkFCT1JULURPV05pOiV1XG4iLCBfX0xJTkVfXyk7IF9fcjsgfSkKKyNkZWZpbmUgdXAoeCkgZG8geyBwcmludGsoIlVQOiV1OiIgI3ggIlxuIiwgX19MSU5FX18pOyB1cCh4KTsgfSB3aGlsZSgwKQorI2VuZGlmCisKK3N0YXRpYyBpbnQgaXA2X21hc2tlZF9hZGRyY21wKHN0cnVjdCBpbjZfYWRkciBhZGRyMSwgc3RydWN0IGluNl9hZGRyIG1hc2ssCisJCQkgICAgICBzdHJ1Y3QgaW42X2FkZHIgYWRkcjIpCit7CisJaW50IGk7CisJZm9yKCBpID0gMDsgaSA8IDE2OyBpKyspeworCQlpZigoYWRkcjEuczZfYWRkcltpXSAmIG1hc2suczZfYWRkcltpXSkgIT0gCisJCSAgIChhZGRyMi5zNl9hZGRyW2ldICYgbWFzay5zNl9hZGRyW2ldKSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQ2hlY2sgZm9yIGFuIGV4dGVuc2lvbiAqLworaW50IAoraXA2dF9leHRfaGRyKHU4IG5leHRoZHIpCit7CisgICAgICAgIHJldHVybiAoIChuZXh0aGRyID09IElQUFJPVE9fSE9QT1BUUykgICB8fAorICAgICAgICAgICAgICAgICAobmV4dGhkciA9PSBJUFBST1RPX1JPVVRJTkcpICAgfHwKKyAgICAgICAgICAgICAgICAgKG5leHRoZHIgPT0gSVBQUk9UT19GUkFHTUVOVCkgIHx8CisgICAgICAgICAgICAgICAgIChuZXh0aGRyID09IElQUFJPVE9fRVNQKSAgICAgICB8fAorICAgICAgICAgICAgICAgICAobmV4dGhkciA9PSBJUFBST1RPX0FIKSAgICAgICAgfHwKKyAgICAgICAgICAgICAgICAgKG5leHRoZHIgPT0gSVBQUk9UT19OT05FKSAgICAgIHx8CisgICAgICAgICAgICAgICAgIChuZXh0aGRyID09IElQUFJPVE9fRFNUT1BUUykgKTsKK30KKworLyogUmV0dXJucyB3aGV0aGVyIG1hdGNoZXMgcnVsZSBvciBub3QuICovCitzdGF0aWMgaW5saW5lIGludAoraXA2X3BhY2tldF9tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgY29uc3QgY2hhciAqaW5kZXYsCisJCSBjb25zdCBjaGFyICpvdXRkZXYsCisJCSBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwNmluZm8sCisJCSB1bnNpZ25lZCBpbnQgKnByb3RvZmYsCisJCSBpbnQgKmZyYWdvZmYpCit7CisJc2l6ZV90IGk7CisJdW5zaWduZWQgbG9uZyByZXQ7CisJY29uc3Qgc3RydWN0IGlwdjZoZHIgKmlwdjYgPSBza2ItPm5oLmlwdjZoOworCisjZGVmaW5lIEZXSU5WKGJvb2wsaW52ZmxnKSAoKGJvb2wpIF4gISEoaXA2aW5mby0+aW52ZmxhZ3MgJiBpbnZmbGcpKQorCisJaWYgKEZXSU5WKGlwNl9tYXNrZWRfYWRkcmNtcChpcHY2LT5zYWRkcixpcDZpbmZvLT5zbXNrLGlwNmluZm8tPnNyYyksCisJCSAgSVA2VF9JTlZfU1JDSVApCisJICAgIHx8IEZXSU5WKGlwNl9tYXNrZWRfYWRkcmNtcChpcHY2LT5kYWRkcixpcDZpbmZvLT5kbXNrLGlwNmluZm8tPmRzdCksCisJCSAgICAgSVA2VF9JTlZfRFNUSVApKSB7CisJCWRwcmludGYoIlNvdXJjZSBvciBkZXN0IG1pc21hdGNoLlxuIik7CisvKgorCQlkcHJpbnRmKCJTUkM6ICV1LiBNYXNrOiAldS4gVGFyZ2V0OiAldS4lc1xuIiwgaXAtPnNhZGRyLAorCQkJaXBpbmZvLT5zbXNrLnNfYWRkciwgaXBpbmZvLT5zcmMuc19hZGRyLAorCQkJaXBpbmZvLT5pbnZmbGFncyAmIElQNlRfSU5WX1NSQ0lQID8gIiAoSU5WKSIgOiAiIik7CisJCWRwcmludGYoIkRTVDogJXUuIE1hc2s6ICV1LiBUYXJnZXQ6ICV1LiVzXG4iLCBpcC0+ZGFkZHIsCisJCQlpcGluZm8tPmRtc2suc19hZGRyLCBpcGluZm8tPmRzdC5zX2FkZHIsCisJCQlpcGluZm8tPmludmZsYWdzICYgSVA2VF9JTlZfRFNUSVAgPyAiIChJTlYpIiA6ICIiKTsqLworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBMb29rIGZvciBpZm5hbWUgbWF0Y2hlczsgdGhpcyBzaG91bGQgdW5yb2xsIG5pY2VseS4gKi8KKwlmb3IgKGkgPSAwLCByZXQgPSAwOyBpIDwgSUZOQU1TSVovc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOyBpKyspIHsKKwkJcmV0IHw9ICgoKGNvbnN0IHVuc2lnbmVkIGxvbmcgKilpbmRldilbaV0KKwkJCV4gKChjb25zdCB1bnNpZ25lZCBsb25nICopaXA2aW5mby0+aW5pZmFjZSlbaV0pCisJCQkmICgoY29uc3QgdW5zaWduZWQgbG9uZyAqKWlwNmluZm8tPmluaWZhY2VfbWFzaylbaV07CisJfQorCisJaWYgKEZXSU5WKHJldCAhPSAwLCBJUDZUX0lOVl9WSUFfSU4pKSB7CisJCWRwcmludGYoIlZJQSBpbiBtaXNtYXRjaCAoJXMgdnMgJXMpLiVzXG4iLAorCQkJaW5kZXYsIGlwNmluZm8tPmluaWZhY2UsCisJCQlpcDZpbmZvLT5pbnZmbGFncyZJUDZUX0lOVl9WSUFfSU4gPyIgKElOVikiOiIiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMCwgcmV0ID0gMDsgaSA8IElGTkFNU0laL3NpemVvZih1bnNpZ25lZCBsb25nKTsgaSsrKSB7CisJCXJldCB8PSAoKChjb25zdCB1bnNpZ25lZCBsb25nICopb3V0ZGV2KVtpXQorCQkJXiAoKGNvbnN0IHVuc2lnbmVkIGxvbmcgKilpcDZpbmZvLT5vdXRpZmFjZSlbaV0pCisJCQkmICgoY29uc3QgdW5zaWduZWQgbG9uZyAqKWlwNmluZm8tPm91dGlmYWNlX21hc2spW2ldOworCX0KKworCWlmIChGV0lOVihyZXQgIT0gMCwgSVA2VF9JTlZfVklBX09VVCkpIHsKKwkJZHByaW50ZigiVklBIG91dCBtaXNtYXRjaCAoJXMgdnMgJXMpLiVzXG4iLAorCQkJb3V0ZGV2LCBpcDZpbmZvLT5vdXRpZmFjZSwKKwkJCWlwNmluZm8tPmludmZsYWdzJklQNlRfSU5WX1ZJQV9PVVQgPyIgKElOVikiOiIiKTsKKwkJcmV0dXJuIDA7CisJfQorCisvKiAuLi4gbWlnaHQgd2FudCB0byBkbyBzb21ldGhpbmcgd2l0aCBjbGFzcyBhbmQgZmxvd2xhYmVsIGhlcmUgLi4uICovCisKKwkvKiBsb29rIGZvciB0aGUgZGVzaXJlZCBwcm90b2NvbCBoZWFkZXIgKi8KKwlpZigoaXA2aW5mby0+ZmxhZ3MgJiBJUDZUX0ZfUFJPVE8pKSB7CisJCXVfaW50OF90IGN1cnJlbnRoZHIgPSBpcHY2LT5uZXh0aGRyOworCQlzdHJ1Y3QgaXB2Nl9vcHRfaGRyIF9oZHIsICpocDsKKwkJdV9pbnQxNl90IHB0cjsJCS8qIEhlYWRlciBvZmZzZXQgaW4gc2tiICovCisJCXVfaW50MTZfdCBoZHJsZW47CS8qIEhlYWRlciAqLworCQl1X2ludDE2X3QgX2ZyYWdvZmYgPSAwLCAqZnAgPSBOVUxMOworCisJCXB0ciA9IElQVjZfSERSX0xFTjsKKworCQl3aGlsZSAoaXA2dF9leHRfaGRyKGN1cnJlbnRoZHIpKSB7CisJICAgICAgICAgICAgICAgIC8qIElzIHRoZXJlIGVub3VnaCBzcGFjZSBmb3IgdGhlIG5leHQgZXh0IGhlYWRlcj8gKi8KKwkgICAgICAgICAgICAgICAgaWYgKHNrYi0+bGVuIC0gcHRyIDwgSVBWNl9PUFRIRFJfTEVOKQorCSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworCisJCQkvKiBOT05FIG9yIEVTUDogdGhlcmUgaXNuJ3QgcHJvdG9jb2wgcGFydCAqLworCQkJLyogSWYgd2Ugd2FudCB0byBjb3VudCB0aGVzZSBwYWNrZXRzIGluICctcCBhbGwnLAorCQkJICogd2Ugd2lsbCBjaGFuZ2UgdGhlIHJldHVybiAwIHRvIDEqLworCQkJaWYgKChjdXJyZW50aGRyID09IElQUFJPVE9fTk9ORSkgfHwgCisJCQkJKGN1cnJlbnRoZHIgPT0gSVBQUk9UT19FU1ApKQorCQkJCWJyZWFrOworCisJCQlocCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHB0ciwgc2l6ZW9mKF9oZHIpLCAmX2hkcik7CisJCQlCVUdfT04oaHAgPT0gTlVMTCk7CisKKwkJCS8qIFNpemUgY2FsY3VsYXRpb24gKi8KKwkgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRoZHIgPT0gSVBQUk9UT19GUkFHTUVOVCkgeworCQkJCWZwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwKKwkJCQkJCSAgIHB0citvZmZzZXRvZihzdHJ1Y3QgZnJhZ19oZHIsCisJCQkJCQkJCWZyYWdfb2ZmKSwKKwkJCQkJCSAgIHNpemVvZihfZnJhZ29mZiksCisJCQkJCQkgICAmX2ZyYWdvZmYpOworCQkJCWlmIChmcCA9PSBOVUxMKQorCQkJCQlyZXR1cm4gMDsKKworCQkJCV9mcmFnb2ZmID0gbnRvaHMoKmZwKSAmIH4weDc7CisJICAgICAgICAgICAgICAgICAgICAgICAgaGRybGVuID0gODsKKwkgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50aGRyID09IElQUFJPVE9fQUgpCisJICAgICAgICAgICAgICAgICAgICAgICAgaGRybGVuID0gKGhwLT5oZHJsZW4rMik8PDI7CisJICAgICAgICAgICAgICAgIGVsc2UKKwkgICAgICAgICAgICAgICAgICAgICAgICBoZHJsZW4gPSBpcHY2X29wdGxlbihocCk7CisKKwkJCWN1cnJlbnRoZHIgPSBocC0+bmV4dGhkcjsKKwkgICAgICAgICAgICAgICAgcHRyICs9IGhkcmxlbjsKKwkJCS8qIHB0ciBpcyB0b28gbGFyZ2UgKi8KKwkgICAgICAgICAgICAgICAgaWYgKCBwdHIgPiBza2ItPmxlbiApIAorCQkJCXJldHVybiAwOworCQkJaWYgKF9mcmFnb2ZmKSB7CisJCQkJaWYgKGlwNnRfZXh0X2hkcihjdXJyZW50aGRyKSkKKwkJCQkJcmV0dXJuIDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkqcHJvdG9mZiA9IHB0cjsKKwkJKmZyYWdvZmYgPSBfZnJhZ29mZjsKKworCQkvKiBjdXJyZW50aGRyIGNvbnRhaW5zIHRoZSBwcm90b2NvbCBoZWFkZXIgKi8KKworCQlkcHJpbnRmKCJQYWNrZXQgcHJvdG9jb2wgJWhpID89ICVzJWhpLlxuIiwKKwkJCQljdXJyZW50aGRyLCAKKwkJCQlpcDZpbmZvLT5pbnZmbGFncyAmIElQNlRfSU5WX1BST1RPID8gIiEiOiIiLAorCQkJCWlwNmluZm8tPnByb3RvKTsKKworCQlpZiAoaXA2aW5mby0+cHJvdG8gPT0gY3VycmVudGhkcikgeworCQkJaWYoaXA2aW5mby0+aW52ZmxhZ3MgJiBJUDZUX0lOVl9QUk9UTykgeworCQkJCXJldHVybiAwOworCQkJfQorCQkJcmV0dXJuIDE7CisJCX0KKworCQkvKiBXZSBuZWVkIG1hdGNoIGZvciB0aGUgJy1wIGFsbCcsIHRvbyEgKi8KKwkJaWYgKChpcDZpbmZvLT5wcm90byAhPSAwKSAmJgorCQkJIShpcDZpbmZvLT5pbnZmbGFncyAmIElQNlRfSU5WX1BST1RPKSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworLyogc2hvdWxkIGJlIGlwNiBzYWZlICovCitzdGF0aWMgaW5saW5lIGludCAKK2lwNl9jaGVja2VudHJ5KGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXB2NikKK3sKKwlpZiAoaXB2Ni0+ZmxhZ3MgJiB+SVA2VF9GX01BU0spIHsKKwkJZHVwcmludGYoIlVua25vd24gZmxhZyBiaXRzIHNldDogJTA4WFxuIiwKKwkJCSBpcHY2LT5mbGFncyAmIH5JUDZUX0ZfTUFTSyk7CisJCXJldHVybiAwOworCX0KKwlpZiAoaXB2Ni0+aW52ZmxhZ3MgJiB+SVA2VF9JTlZfTUFTSykgeworCQlkdXByaW50ZigiVW5rbm93biBpbnZmbGFnIGJpdHMgc2V0OiAlMDhYXG4iLAorCQkJIGlwdjYtPmludmZsYWdzICYgfklQNlRfSU5WX01BU0spOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2lwNnRfZXJyb3Ioc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkgIHVuc2lnbmVkIGludCBob29rbnVtLAorCSAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCisJICB2b2lkICp1c2VyaW5mbykKK3sKKwlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQlwcmludGsoImlwNl90YWJsZXM6IGVycm9yOiBgJXMnXG4iLCAoY2hhciAqKXRhcmdpbmZvKTsKKworCXJldHVybiBORl9EUk9QOworfQorCitzdGF0aWMgaW5saW5lCitpbnQgZG9fbWF0Y2goc3RydWN0IGlwNnRfZW50cnlfbWF0Y2ggKm0sCisJICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkgICAgIGludCBvZmZzZXQsCisJICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKwkgICAgIGludCAqaG90ZHJvcCkKK3sKKwkvKiBTdG9wIGl0ZXJhdGlvbiBpZiBpdCBkb2Vzbid0IG1hdGNoICovCisJaWYgKCFtLT51Lmtlcm5lbC5tYXRjaC0+bWF0Y2goc2tiLCBpbiwgb3V0LCBtLT5kYXRhLAorCQkJCSAgICAgIG9mZnNldCwgcHJvdG9mZiwgaG90ZHJvcCkpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwNnRfZW50cnkgKgorZ2V0X2VudHJ5KHZvaWQgKmJhc2UsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJcmV0dXJuIChzdHJ1Y3QgaXA2dF9lbnRyeSAqKShiYXNlICsgb2Zmc2V0KTsKK30KKworLyogUmV0dXJucyBvbmUgb2YgdGhlIGdlbmVyaWMgZmlyZXdhbGwgcG9saWNpZXMsIGxpa2UgTkZfQUNDRVBULiAqLwordW5zaWduZWQgaW50CitpcDZ0X2RvX3RhYmxlKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkgICAgICB1bnNpZ25lZCBpbnQgaG9vaywKKwkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkgICAgICBzdHJ1Y3QgaXA2dF90YWJsZSAqdGFibGUsCisJICAgICAgdm9pZCAqdXNlcmRhdGEpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbnVsbGRldm5hbWVbSUZOQU1TSVpdOworCWludCBvZmZzZXQgPSAwOworCXVuc2lnbmVkIGludCBwcm90b2ZmID0gMDsKKwlpbnQgaG90ZHJvcCA9IDA7CisJLyogSW5pdGlhbGl6aW5nIHZlcmRpY3QgdG8gTkZfRFJPUCBrZWVwcyBnY2MgaGFwcHkuICovCisJdW5zaWduZWQgaW50IHZlcmRpY3QgPSBORl9EUk9QOworCWNvbnN0IGNoYXIgKmluZGV2LCAqb3V0ZGV2OworCXZvaWQgKnRhYmxlX2Jhc2U7CisJc3RydWN0IGlwNnRfZW50cnkgKmUsICpiYWNrOworCisJLyogSW5pdGlhbGl6YXRpb24gKi8KKwlpbmRldiA9IGluID8gaW4tPm5hbWUgOiBudWxsZGV2bmFtZTsKKwlvdXRkZXYgPSBvdXQgPyBvdXQtPm5hbWUgOiBudWxsZGV2bmFtZTsKKworCS8qIFdlIGhhbmRsZSBmcmFnbWVudHMgYnkgZGVhbGluZyB3aXRoIHRoZSBmaXJzdCBmcmFnbWVudCBhcworCSAqIGlmIGl0IHdhcyBhIG5vcm1hbCBwYWNrZXQuICBBbGwgb3RoZXIgZnJhZ21lbnRzIGFyZSB0cmVhdGVkCisJICogbm9ybWFsbHksIGV4Y2VwdCB0aGF0IHRoZXkgd2lsbCBORVZFUiBtYXRjaCBydWxlcyB0aGF0IGFzaworCSAqIHRoaW5ncyB3ZSBkb24ndCBrbm93LCBpZS4gdGNwIHN5biBmbGFnIG9yIHBvcnRzKS4gIElmIHRoZQorCSAqIHJ1bGUgaXMgYWxzbyBhIGZyYWdtZW50LXNwZWNpZmljIHJ1bGUsIG5vbi1mcmFnbWVudHMgd29uJ3QKKwkgKiBtYXRjaCBpdC4gKi8KKworCXJlYWRfbG9ja19iaCgmdGFibGUtPmxvY2spOworCUlQX05GX0FTU0VSVCh0YWJsZS0+dmFsaWRfaG9va3MgJiAoMSA8PCBob29rKSk7CisJdGFibGVfYmFzZSA9ICh2b2lkICopdGFibGUtPnByaXZhdGUtPmVudHJpZXMKKwkJKyBUQUJMRV9PRkZTRVQodGFibGUtPnByaXZhdGUsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJZSA9IGdldF9lbnRyeSh0YWJsZV9iYXNlLCB0YWJsZS0+cHJpdmF0ZS0+aG9va19lbnRyeVtob29rXSk7CisKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCisJLyogQ2hlY2sgbm9vbmUgZWxzZSB1c2luZyBvdXIgdGFibGUgKi8KKwlpZiAoKChzdHJ1Y3QgaXA2dF9lbnRyeSAqKXRhYmxlX2Jhc2UpLT5jb21lZnJvbSAhPSAweGRlYWQ1N2FjCisJICAgICYmICgoc3RydWN0IGlwNnRfZW50cnkgKil0YWJsZV9iYXNlKS0+Y29tZWZyb20gIT0gMHhlZWVlZWVlYykgeworCQlwcmludGsoIkFTU0VSVDogQ1BVICMldSwgJXMgY29tZWZyb20oJXApID0gJVhcbiIsCisJCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCksCisJCSAgICAgICB0YWJsZS0+bmFtZSwKKwkJICAgICAgICYoKHN0cnVjdCBpcDZ0X2VudHJ5ICopdGFibGVfYmFzZSktPmNvbWVmcm9tLAorCQkgICAgICAgKChzdHJ1Y3QgaXA2dF9lbnRyeSAqKXRhYmxlX2Jhc2UpLT5jb21lZnJvbSk7CisJfQorCSgoc3RydWN0IGlwNnRfZW50cnkgKil0YWJsZV9iYXNlKS0+Y29tZWZyb20gPSAweDU3YWNjMDAxOworI2VuZGlmCisKKwkvKiBGb3IgcmV0dXJuIGZyb20gYnVpbHRpbiBjaGFpbiAqLworCWJhY2sgPSBnZXRfZW50cnkodGFibGVfYmFzZSwgdGFibGUtPnByaXZhdGUtPnVuZGVyZmxvd1tob29rXSk7CisKKwlkbyB7CisJCUlQX05GX0FTU0VSVChlKTsKKwkJSVBfTkZfQVNTRVJUKGJhY2spOworCQkoKnBza2IpLT5uZmNhY2hlIHw9IGUtPm5mY2FjaGU7CisJCWlmIChpcDZfcGFja2V0X21hdGNoKCpwc2tiLCBpbmRldiwgb3V0ZGV2LCAmZS0+aXB2NiwKKwkJCSZwcm90b2ZmLCAmb2Zmc2V0KSkgeworCQkJc3RydWN0IGlwNnRfZW50cnlfdGFyZ2V0ICp0OworCisJCQlpZiAoSVA2VF9NQVRDSF9JVEVSQVRFKGUsIGRvX21hdGNoLAorCQkJCQkgICAgICAgKnBza2IsIGluLCBvdXQsCisJCQkJCSAgICAgICBvZmZzZXQsIHByb3RvZmYsICZob3Rkcm9wKSAhPSAwKQorCQkJCWdvdG8gbm9fbWF0Y2g7CisKKwkJCUFERF9DT1VOVEVSKGUtPmNvdW50ZXJzLAorCQkJCSAgICBudG9ocygoKnBza2IpLT5uaC5pcHY2aC0+cGF5bG9hZF9sZW4pCisJCQkJICAgICsgSVBWNl9IRFJfTEVOLAorCQkJCSAgICAxKTsKKworCQkJdCA9IGlwNnRfZ2V0X3RhcmdldChlKTsKKwkJCUlQX05GX0FTU0VSVCh0LT51Lmtlcm5lbC50YXJnZXQpOworCQkJLyogU3RhbmRhcmQgdGFyZ2V0PyAqLworCQkJaWYgKCF0LT51Lmtlcm5lbC50YXJnZXQtPnRhcmdldCkgeworCQkJCWludCB2OworCisJCQkJdiA9ICgoc3RydWN0IGlwNnRfc3RhbmRhcmRfdGFyZ2V0ICopdCktPnZlcmRpY3Q7CisJCQkJaWYgKHYgPCAwKSB7CisJCQkJCS8qIFBvcCBmcm9tIHN0YWNrPyAqLworCQkJCQlpZiAodiAhPSBJUDZUX1JFVFVSTikgeworCQkJCQkJdmVyZGljdCA9ICh1bnNpZ25lZCkoLXYpIC0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWUgPSBiYWNrOworCQkJCQliYWNrID0gZ2V0X2VudHJ5KHRhYmxlX2Jhc2UsCisJCQkJCQkJIGJhY2stPmNvbWVmcm9tKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmICh0YWJsZV9iYXNlICsgdgorCQkJCSAgICAhPSAodm9pZCAqKWUgKyBlLT5uZXh0X29mZnNldCkgeworCQkJCQkvKiBTYXZlIG9sZCBiYWNrIHB0ciBpbiBuZXh0IGVudHJ5ICovCisJCQkJCXN0cnVjdCBpcDZ0X2VudHJ5ICpuZXh0CisJCQkJCQk9ICh2b2lkICopZSArIGUtPm5leHRfb2Zmc2V0OworCQkJCQluZXh0LT5jb21lZnJvbQorCQkJCQkJPSAodm9pZCAqKWJhY2sgLSB0YWJsZV9iYXNlOworCQkJCQkvKiBzZXQgYmFjayBwb2ludGVyIHRvIG5leHQgZW50cnkgKi8KKwkJCQkJYmFjayA9IG5leHQ7CisJCQkJfQorCisJCQkJZSA9IGdldF9lbnRyeSh0YWJsZV9iYXNlLCB2KTsKKwkJCX0gZWxzZSB7CisJCQkJLyogVGFyZ2V0cyB3aGljaCByZWVudGVyIG11c3QgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicy4gdmVyZGljdHMgKi8KKyNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCisJCQkJKChzdHJ1Y3QgaXA2dF9lbnRyeSAqKXRhYmxlX2Jhc2UpLT5jb21lZnJvbQorCQkJCQk9IDB4ZWVlZWVlZWM7CisjZW5kaWYKKwkJCQl2ZXJkaWN0ID0gdC0+dS5rZXJuZWwudGFyZ2V0LT50YXJnZXQocHNrYiwKKwkJCQkJCQkJICAgICBpbiwgb3V0LAorCQkJCQkJCQkgICAgIGhvb2ssCisJCQkJCQkJCSAgICAgdC0+ZGF0YSwKKwkJCQkJCQkJICAgICB1c2VyZGF0YSk7CisKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCisJCQkJaWYgKCgoc3RydWN0IGlwNnRfZW50cnkgKil0YWJsZV9iYXNlKS0+Y29tZWZyb20KKwkJCQkgICAgIT0gMHhlZWVlZWVlYworCQkJCSAgICAmJiB2ZXJkaWN0ID09IElQNlRfQ09OVElOVUUpIHsKKwkJCQkJcHJpbnRrKCJUYXJnZXQgJXMgcmVlbnRlcmVkIVxuIiwKKwkJCQkJICAgICAgIHQtPnUua2VybmVsLnRhcmdldC0+bmFtZSk7CisJCQkJCXZlcmRpY3QgPSBORl9EUk9QOworCQkJCX0KKwkJCQkoKHN0cnVjdCBpcDZ0X2VudHJ5ICopdGFibGVfYmFzZSktPmNvbWVmcm9tCisJCQkJCT0gMHg1N2FjYzAwMTsKKyNlbmRpZgorCQkJCWlmICh2ZXJkaWN0ID09IElQNlRfQ09OVElOVUUpCisJCQkJCWUgPSAodm9pZCAqKWUgKyBlLT5uZXh0X29mZnNldDsKKwkJCQllbHNlCisJCQkJCS8qIFZlcmRpY3QgKi8KKwkJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisKKwkJbm9fbWF0Y2g6CisJCQllID0gKHZvaWQgKillICsgZS0+bmV4dF9vZmZzZXQ7CisJCX0KKwl9IHdoaWxlICghaG90ZHJvcCk7CisKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCisJKChzdHJ1Y3QgaXA2dF9lbnRyeSAqKXRhYmxlX2Jhc2UpLT5jb21lZnJvbSA9IDB4ZGVhZDU3YWM7CisjZW5kaWYKKwlyZWFkX3VubG9ja19iaCgmdGFibGUtPmxvY2spOworCisjaWZkZWYgREVCVUdfQUxMT1dfQUxMCisJcmV0dXJuIE5GX0FDQ0VQVDsKKyNlbHNlCisJaWYgKGhvdGRyb3ApCisJCXJldHVybiBORl9EUk9QOworCWVsc2UgcmV0dXJuIHZlcmRpY3Q7CisjZW5kaWYKK30KKworLyogSWYgaXQgc3VjY2VlZHMsIHJldHVybnMgZWxlbWVudCBhbmQgbG9ja3MgbXV0ZXggKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitmaW5kX2lubGlzdF9sb2NrX25vbG9hZChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLAorCQkJY29uc3QgY2hhciAqbmFtZSwKKwkJCWludCAqZXJyb3IsCisJCQlzdHJ1Y3Qgc2VtYXBob3JlICptdXRleCkKK3sKKwl2b2lkICpyZXQ7CisKKyNpZiAxCisJZHVwcmludGYoImZpbmRfaW5saXN0OiBzZWFyY2hpbmcgZm9yIGAlcycgaW4gJXMuXG4iLAorCQkgbmFtZSwgaGVhZCA9PSAmaXA2dF90YXJnZXQgPyAiaXA2dF90YXJnZXQiCisJCSA6IGhlYWQgPT0gJmlwNnRfbWF0Y2ggPyAiaXA2dF9tYXRjaCIKKwkJIDogaGVhZCA9PSAmaXA2dF90YWJsZXMgPyAiaXA2dF90YWJsZXMiIDogIlVOS05PV04iKTsKKyNlbmRpZgorCisJKmVycm9yID0gZG93bl9pbnRlcnJ1cHRpYmxlKG11dGV4KTsKKwlpZiAoKmVycm9yICE9IDApCisJCXJldHVybiBOVUxMOworCisJcmV0ID0gbGlzdF9uYW1lZF9maW5kKGhlYWQsIG5hbWUpOworCWlmICghcmV0KSB7CisJCSplcnJvciA9IC1FTk9FTlQ7CisJCXVwKG11dGV4KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworI2lmbmRlZiBDT05GSUdfS01PRAorI2RlZmluZSBmaW5kX2lubGlzdF9sb2NrKGgsbixwLGUsbSkgZmluZF9pbmxpc3RfbG9ja19ub2xvYWQoKGgpLChuKSwoZSksKG0pKQorI2Vsc2UKK3N0YXRpYyB2b2lkICoKK2ZpbmRfaW5saXN0X2xvY2soc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwKKwkJIGNvbnN0IGNoYXIgKm5hbWUsCisJCSBjb25zdCBjaGFyICpwcmVmaXgsCisJCSBpbnQgKmVycm9yLAorCQkgc3RydWN0IHNlbWFwaG9yZSAqbXV0ZXgpCit7CisJdm9pZCAqcmV0OworCisJcmV0ID0gZmluZF9pbmxpc3RfbG9ja19ub2xvYWQoaGVhZCwgbmFtZSwgZXJyb3IsIG11dGV4KTsKKwlpZiAoIXJldCkgeworCQlkdXByaW50ZigiZmluZF9pbmxpc3Q6IGxvYWRpbmcgYCVzJXMnLlxuIiwgcHJlZml4LCBuYW1lKTsKKwkJcmVxdWVzdF9tb2R1bGUoIiVzJXMiLCBwcmVmaXgsIG5hbWUpOworCQlyZXQgPSBmaW5kX2lubGlzdF9sb2NrX25vbG9hZChoZWFkLCBuYW1lLCBlcnJvciwgbXV0ZXgpOworCX0KKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXA2dF90YWJsZSAqCitpcDZ0X2ZpbmRfdGFibGVfbG9jayhjb25zdCBjaGFyICpuYW1lLCBpbnQgKmVycm9yLCBzdHJ1Y3Qgc2VtYXBob3JlICptdXRleCkKK3sKKwlyZXR1cm4gZmluZF9pbmxpc3RfbG9jaygmaXA2dF90YWJsZXMsIG5hbWUsICJpcDZ0YWJsZV8iLCBlcnJvciwgbXV0ZXgpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpcDZ0X21hdGNoICoKK2ZpbmRfbWF0Y2hfbG9jayhjb25zdCBjaGFyICpuYW1lLCBpbnQgKmVycm9yLCBzdHJ1Y3Qgc2VtYXBob3JlICptdXRleCkKK3sKKwlyZXR1cm4gZmluZF9pbmxpc3RfbG9jaygmaXA2dF9tYXRjaCwgbmFtZSwgImlwNnRfIiwgZXJyb3IsIG11dGV4KTsKK30KKworc3RhdGljIHN0cnVjdCBpcDZ0X3RhcmdldCAqCitpcDZ0X2ZpbmRfdGFyZ2V0X2xvY2soY29uc3QgY2hhciAqbmFtZSwgaW50ICplcnJvciwgc3RydWN0IHNlbWFwaG9yZSAqbXV0ZXgpCit7CisJcmV0dXJuIGZpbmRfaW5saXN0X2xvY2soJmlwNnRfdGFyZ2V0LCBuYW1lLCAiaXA2dF8iLCBlcnJvciwgbXV0ZXgpOworfQorCisvKiBBbGwgemVyb2VzID09IHVuY29uZGl0aW9uYWwgcnVsZS4gKi8KK3N0YXRpYyBpbmxpbmUgaW50Cit1bmNvbmRpdGlvbmFsKGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXB2NikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoKmlwdjYpOyBpKyspCisJCWlmICgoKGNoYXIgKilpcHY2KVtpXSkKKwkJCWJyZWFrOworCisJcmV0dXJuIChpID09IHNpemVvZigqaXB2NikpOworfQorCisvKiBGaWd1cmVzIG91dCBmcm9tIHdoYXQgaG9vayBlYWNoIHJ1bGUgY2FuIGJlIGNhbGxlZDogcmV0dXJucyAwIGlmCisgICB0aGVyZSBhcmUgbG9vcHMuICBQdXRzIGhvb2sgYml0bWFzayBpbiBjb21lZnJvbS4gKi8KK3N0YXRpYyBpbnQKK21hcmtfc291cmNlX2NoYWlucyhzdHJ1Y3QgaXA2dF90YWJsZV9pbmZvICpuZXdpbmZvLCB1bnNpZ25lZCBpbnQgdmFsaWRfaG9va3MpCit7CisJdW5zaWduZWQgaW50IGhvb2s7CisKKwkvKiBObyByZWN1cnNpb247IHVzZSBwYWNrZXQgY291bnRlciB0byBzYXZlIGJhY2sgcHRycyAocmVzZXQKKwkgICB0byAwIGFzIHdlIGxlYXZlKSwgYW5kIGNvbWVmcm9tIHRvIHNhdmUgc291cmNlIGhvb2sgYml0bWFzayAqLworCWZvciAoaG9vayA9IDA7IGhvb2sgPCBORl9JUDZfTlVNSE9PS1M7IGhvb2srKykgeworCQl1bnNpZ25lZCBpbnQgcG9zID0gbmV3aW5mby0+aG9va19lbnRyeVtob29rXTsKKwkJc3RydWN0IGlwNnRfZW50cnkgKmUKKwkJCT0gKHN0cnVjdCBpcDZ0X2VudHJ5ICopKG5ld2luZm8tPmVudHJpZXMgKyBwb3MpOworCisJCWlmICghKHZhbGlkX2hvb2tzICYgKDEgPDwgaG9vaykpKQorCQkJY29udGludWU7CisKKwkJLyogU2V0IGluaXRpYWwgYmFjayBwb2ludGVyLiAqLworCQllLT5jb3VudGVycy5wY250ID0gcG9zOworCisJCWZvciAoOzspIHsKKwkJCXN0cnVjdCBpcDZ0X3N0YW5kYXJkX3RhcmdldCAqdAorCQkJCT0gKHZvaWQgKilpcDZ0X2dldF90YXJnZXQoZSk7CisKKwkJCWlmIChlLT5jb21lZnJvbSAmICgxIDw8IE5GX0lQNl9OVU1IT09LUykpIHsKKwkJCQlwcmludGsoImlwdGFibGVzOiBsb29wIGhvb2sgJXUgcG9zICV1ICUwOFguXG4iLAorCQkJCSAgICAgICBob29rLCBwb3MsIGUtPmNvbWVmcm9tKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWUtPmNvbWVmcm9tCisJCQkJfD0gKCgxIDw8IGhvb2spIHwgKDEgPDwgTkZfSVA2X05VTUhPT0tTKSk7CisKKwkJCS8qIFVuY29uZGl0aW9uYWwgcmV0dXJuL0VORC4gKi8KKwkJCWlmIChlLT50YXJnZXRfb2Zmc2V0ID09IHNpemVvZihzdHJ1Y3QgaXA2dF9lbnRyeSkKKwkJCSAgICAmJiAoc3RyY21wKHQtPnRhcmdldC51LnVzZXIubmFtZSwKKwkJCQkgICAgICAgSVA2VF9TVEFOREFSRF9UQVJHRVQpID09IDApCisJCQkgICAgJiYgdC0+dmVyZGljdCA8IDAKKwkJCSAgICAmJiB1bmNvbmRpdGlvbmFsKCZlLT5pcHY2KSkgeworCQkJCXVuc2lnbmVkIGludCBvbGRwb3MsIHNpemU7CisKKwkJCQkvKiBSZXR1cm46IGJhY2t0cmFjayB0aHJvdWdoIHRoZSBsYXN0CisJCQkJICAgYmlnIGp1bXAuICovCisJCQkJZG8geworCQkJCQllLT5jb21lZnJvbSBePSAoMTw8TkZfSVA2X05VTUhPT0tTKTsKKyNpZmRlZiBERUJVR19JUF9GSVJFV0FMTF9VU0VSCisJCQkJCWlmIChlLT5jb21lZnJvbQorCQkJCQkgICAgJiAoMSA8PCBORl9JUDZfTlVNSE9PS1MpKSB7CisJCQkJCQlkdXByaW50ZigiQmFjayB1bnNldCAiCisJCQkJCQkJICJvbiBob29rICV1ICIKKwkJCQkJCQkgInJ1bGUgJXVcbiIsCisJCQkJCQkJIGhvb2ssIHBvcyk7CisJCQkJCX0KKyNlbmRpZgorCQkJCQlvbGRwb3MgPSBwb3M7CisJCQkJCXBvcyA9IGUtPmNvdW50ZXJzLnBjbnQ7CisJCQkJCWUtPmNvdW50ZXJzLnBjbnQgPSAwOworCisJCQkJCS8qIFdlJ3JlIGF0IHRoZSBzdGFydC4gKi8KKwkJCQkJaWYgKHBvcyA9PSBvbGRwb3MpCisJCQkJCQlnb3RvIG5leHQ7CisKKwkJCQkJZSA9IChzdHJ1Y3QgaXA2dF9lbnRyeSAqKQorCQkJCQkJKG5ld2luZm8tPmVudHJpZXMgKyBwb3MpOworCQkJCX0gd2hpbGUgKG9sZHBvcyA9PSBwb3MgKyBlLT5uZXh0X29mZnNldCk7CisKKwkJCQkvKiBNb3ZlIGFsb25nIG9uZSAqLworCQkJCXNpemUgPSBlLT5uZXh0X29mZnNldDsKKwkJCQllID0gKHN0cnVjdCBpcDZ0X2VudHJ5ICopCisJCQkJCShuZXdpbmZvLT5lbnRyaWVzICsgcG9zICsgc2l6ZSk7CisJCQkJZS0+Y291bnRlcnMucGNudCA9IHBvczsKKwkJCQlwb3MgKz0gc2l6ZTsKKwkJCX0gZWxzZSB7CisJCQkJaW50IG5ld3BvcyA9IHQtPnZlcmRpY3Q7CisKKwkJCQlpZiAoc3RyY21wKHQtPnRhcmdldC51LnVzZXIubmFtZSwKKwkJCQkJICAgSVA2VF9TVEFOREFSRF9UQVJHRVQpID09IDAKKwkJCQkgICAgJiYgbmV3cG9zID49IDApIHsKKwkJCQkJLyogVGhpcyBhIGp1bXA7IGNoYXNlIGl0LiAqLworCQkJCQlkdXByaW50ZigiSnVtcCBydWxlICV1IC0+ICV1XG4iLAorCQkJCQkJIHBvcywgbmV3cG9zKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiAuLi4gdGhpcyBpcyBhIGZhbGx0aHJ1ICovCisJCQkJCW5ld3BvcyA9IHBvcyArIGUtPm5leHRfb2Zmc2V0OworCQkJCX0KKwkJCQllID0gKHN0cnVjdCBpcDZ0X2VudHJ5ICopCisJCQkJCShuZXdpbmZvLT5lbnRyaWVzICsgbmV3cG9zKTsKKwkJCQllLT5jb3VudGVycy5wY250ID0gcG9zOworCQkJCXBvcyA9IG5ld3BvczsKKwkJCX0KKwkJfQorCQluZXh0OgorCQlkdXByaW50ZigiRmluaXNoZWQgY2hhaW4gJXVcbiIsIGhvb2spOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2NsZWFudXBfbWF0Y2goc3RydWN0IGlwNnRfZW50cnlfbWF0Y2ggKm0sIHVuc2lnbmVkIGludCAqaSkKK3sKKwlpZiAoaSAmJiAoKmkpLS0gPT0gMCkKKwkJcmV0dXJuIDE7CisKKwlpZiAobS0+dS5rZXJuZWwubWF0Y2gtPmRlc3Ryb3kpCisJCW0tPnUua2VybmVsLm1hdGNoLT5kZXN0cm95KG0tPmRhdGEsCisJCQkJCSAgIG0tPnUubWF0Y2hfc2l6ZSAtIHNpemVvZigqbSkpOworCW1vZHVsZV9wdXQobS0+dS5rZXJuZWwubWF0Y2gtPm1lKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3N0YW5kYXJkX2NoZWNrKGNvbnN0IHN0cnVjdCBpcDZ0X2VudHJ5X3RhcmdldCAqdCwKKwkgICAgICAgdW5zaWduZWQgaW50IG1heF9vZmZzZXQpCit7CisJc3RydWN0IGlwNnRfc3RhbmRhcmRfdGFyZ2V0ICp0YXJnID0gKHZvaWQgKil0OworCisJLyogQ2hlY2sgc3RhbmRhcmQgaW5mby4gKi8KKwlpZiAodC0+dS50YXJnZXRfc2l6ZQorCSAgICAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZF90YXJnZXQpKSkgeworCQlkdXByaW50Zigic3RhbmRhcmRfY2hlY2s6IHRhcmdldCBzaXplICV1ICE9ICV1XG4iLAorCQkJIHQtPnUudGFyZ2V0X3NpemUsCisJCQkgSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmRfdGFyZ2V0KSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodGFyZy0+dmVyZGljdCA+PSAwCisJICAgICYmIHRhcmctPnZlcmRpY3QgPiBtYXhfb2Zmc2V0IC0gc2l6ZW9mKHN0cnVjdCBpcDZ0X2VudHJ5KSkgeworCQlkdXByaW50ZigiaXA2dF9zdGFuZGFyZF9jaGVjazogYmFkIHZlcmRpY3QgKCVpKVxuIiwKKwkJCSB0YXJnLT52ZXJkaWN0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHRhcmctPnZlcmRpY3QgPCAtTkZfTUFYX1ZFUkRJQ1QgLSAxKSB7CisJCWR1cHJpbnRmKCJpcDZ0X3N0YW5kYXJkX2NoZWNrOiBiYWQgbmVnYXRpdmUgdmVyZGljdCAoJWkpXG4iLAorCQkJIHRhcmctPnZlcmRpY3QpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitjaGVja19tYXRjaChzdHJ1Y3QgaXA2dF9lbnRyeV9tYXRjaCAqbSwKKwkgICAgY29uc3QgY2hhciAqbmFtZSwKKwkgICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcHY2LAorCSAgICB1bnNpZ25lZCBpbnQgaG9va21hc2ssCisJICAgIHVuc2lnbmVkIGludCAqaSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpcDZ0X21hdGNoICptYXRjaDsKKworCW1hdGNoID0gZmluZF9tYXRjaF9sb2NrKG0tPnUudXNlci5uYW1lLCAmcmV0LCAmaXA2dF9tdXRleCk7CisJaWYgKCFtYXRjaCkgeworCSAgLy8JCWR1cHJpbnRmKCJjaGVja19tYXRjaDogYCVzJyBub3QgZm91bmRcbiIsIG0tPnUubmFtZSk7CisJCXJldHVybiByZXQ7CisJfQorCWlmICghdHJ5X21vZHVsZV9nZXQobWF0Y2gtPm1lKSkgeworCQl1cCgmaXA2dF9tdXRleCk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKwltLT51Lmtlcm5lbC5tYXRjaCA9IG1hdGNoOworCXVwKCZpcDZ0X211dGV4KTsKKworCWlmIChtLT51Lmtlcm5lbC5tYXRjaC0+Y2hlY2tlbnRyeQorCSAgICAmJiAhbS0+dS5rZXJuZWwubWF0Y2gtPmNoZWNrZW50cnkobmFtZSwgaXB2NiwgbS0+ZGF0YSwKKwkJCQkJICAgICAgbS0+dS5tYXRjaF9zaXplIC0gc2l6ZW9mKCptKSwKKwkJCQkJICAgICAgaG9va21hc2spKSB7CisJCW1vZHVsZV9wdXQobS0+dS5rZXJuZWwubWF0Y2gtPm1lKTsKKwkJZHVwcmludGYoImlwX3RhYmxlczogY2hlY2sgZmFpbGVkIGZvciBgJXMnLlxuIiwKKwkJCSBtLT51Lmtlcm5lbC5tYXRjaC0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCSgqaSkrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpcDZ0X3RhcmdldCBpcDZ0X3N0YW5kYXJkX3RhcmdldDsKKworc3RhdGljIGlubGluZSBpbnQKK2NoZWNrX2VudHJ5KHN0cnVjdCBpcDZ0X2VudHJ5ICplLCBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgc2l6ZSwKKwkgICAgdW5zaWduZWQgaW50ICppKQoreworCXN0cnVjdCBpcDZ0X2VudHJ5X3RhcmdldCAqdDsKKwlzdHJ1Y3QgaXA2dF90YXJnZXQgKnRhcmdldDsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBqOworCisJaWYgKCFpcDZfY2hlY2tlbnRyeSgmZS0+aXB2NikpIHsKKwkJZHVwcmludGYoImlwX3RhYmxlczogaXAgY2hlY2sgZmFpbGVkICVwICVzLlxuIiwgZSwgbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWogPSAwOworCXJldCA9IElQNlRfTUFUQ0hfSVRFUkFURShlLCBjaGVja19tYXRjaCwgbmFtZSwgJmUtPmlwdjYsIGUtPmNvbWVmcm9tLCAmaik7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIGNsZWFudXBfbWF0Y2hlczsKKworCXQgPSBpcDZ0X2dldF90YXJnZXQoZSk7CisJdGFyZ2V0ID0gaXA2dF9maW5kX3RhcmdldF9sb2NrKHQtPnUudXNlci5uYW1lLCAmcmV0LCAmaXA2dF9tdXRleCk7CisJaWYgKCF0YXJnZXQpIHsKKwkJZHVwcmludGYoImNoZWNrX2VudHJ5OiBgJXMnIG5vdCBmb3VuZFxuIiwgdC0+dS51c2VyLm5hbWUpOworCQlnb3RvIGNsZWFudXBfbWF0Y2hlczsKKwl9CisJaWYgKCF0cnlfbW9kdWxlX2dldCh0YXJnZXQtPm1lKSkgeworCQl1cCgmaXA2dF9tdXRleCk7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gY2xlYW51cF9tYXRjaGVzOworCX0KKwl0LT51Lmtlcm5lbC50YXJnZXQgPSB0YXJnZXQ7CisJdXAoJmlwNnRfbXV0ZXgpOworCWlmICghdC0+dS5rZXJuZWwudGFyZ2V0KSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBjbGVhbnVwX21hdGNoZXM7CisJfQorCWlmICh0LT51Lmtlcm5lbC50YXJnZXQgPT0gJmlwNnRfc3RhbmRhcmRfdGFyZ2V0KSB7CisJCWlmICghc3RhbmRhcmRfY2hlY2sodCwgc2l6ZSkpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGNsZWFudXBfbWF0Y2hlczsKKwkJfQorCX0gZWxzZSBpZiAodC0+dS5rZXJuZWwudGFyZ2V0LT5jaGVja2VudHJ5CisJCSAgICYmICF0LT51Lmtlcm5lbC50YXJnZXQtPmNoZWNrZW50cnkobmFtZSwgZSwgdC0+ZGF0YSwKKwkJCQkJCSAgICAgIHQtPnUudGFyZ2V0X3NpemUKKwkJCQkJCSAgICAgIC0gc2l6ZW9mKCp0KSwKKwkJCQkJCSAgICAgIGUtPmNvbWVmcm9tKSkgeworCQltb2R1bGVfcHV0KHQtPnUua2VybmVsLnRhcmdldC0+bWUpOworCQlkdXByaW50ZigiaXBfdGFibGVzOiBjaGVjayBmYWlsZWQgZm9yIGAlcycuXG4iLAorCQkJIHQtPnUua2VybmVsLnRhcmdldC0+bmFtZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gY2xlYW51cF9tYXRjaGVzOworCX0KKworCSgqaSkrKzsKKwlyZXR1cm4gMDsKKworIGNsZWFudXBfbWF0Y2hlczoKKwlJUDZUX01BVENIX0lURVJBVEUoZSwgY2xlYW51cF9tYXRjaCwgJmopOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitjaGVja19lbnRyeV9zaXplX2FuZF9ob29rcyhzdHJ1Y3QgaXA2dF9lbnRyeSAqZSwKKwkJCSAgIHN0cnVjdCBpcDZ0X3RhYmxlX2luZm8gKm5ld2luZm8sCisJCQkgICB1bnNpZ25lZCBjaGFyICpiYXNlLAorCQkJICAgdW5zaWduZWQgY2hhciAqbGltaXQsCisJCQkgICBjb25zdCB1bnNpZ25lZCBpbnQgKmhvb2tfZW50cmllcywKKwkJCSAgIGNvbnN0IHVuc2lnbmVkIGludCAqdW5kZXJmbG93cywKKwkJCSAgIHVuc2lnbmVkIGludCAqaSkKK3sKKwl1bnNpZ25lZCBpbnQgaDsKKworCWlmICgodW5zaWduZWQgbG9uZyllICUgX19hbGlnbm9mX18oc3RydWN0IGlwNnRfZW50cnkpICE9IDAKKwkgICAgfHwgKHVuc2lnbmVkIGNoYXIgKillICsgc2l6ZW9mKHN0cnVjdCBpcDZ0X2VudHJ5KSA+PSBsaW1pdCkgeworCQlkdXByaW50ZigiQmFkIG9mZnNldCAlcFxuIiwgZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChlLT5uZXh0X29mZnNldAorCSAgICA8IHNpemVvZihzdHJ1Y3QgaXA2dF9lbnRyeSkgKyBzaXplb2Yoc3RydWN0IGlwNnRfZW50cnlfdGFyZ2V0KSkgeworCQlkdXByaW50ZigiY2hlY2tpbmc6IGVsZW1lbnQgJXAgc2l6ZSAldVxuIiwKKwkJCSBlLCBlLT5uZXh0X29mZnNldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENoZWNrIGhvb2tzICYgdW5kZXJmbG93cyAqLworCWZvciAoaCA9IDA7IGggPCBORl9JUDZfTlVNSE9PS1M7IGgrKykgeworCQlpZiAoKHVuc2lnbmVkIGNoYXIgKillIC0gYmFzZSA9PSBob29rX2VudHJpZXNbaF0pCisJCQluZXdpbmZvLT5ob29rX2VudHJ5W2hdID0gaG9va19lbnRyaWVzW2hdOworCQlpZiAoKHVuc2lnbmVkIGNoYXIgKillIC0gYmFzZSA9PSB1bmRlcmZsb3dzW2hdKQorCQkJbmV3aW5mby0+dW5kZXJmbG93W2hdID0gdW5kZXJmbG93c1toXTsKKwl9CisKKwkvKiBGSVhNRTogdW5kZXJmbG93cyBtdXN0IGJlIHVuY29uZGl0aW9uYWwsIHN0YW5kYXJkIHZlcmRpY3RzCisgICAgICAgICAgIDwgMCAobm90IElQNlRfUkVUVVJOKS4gLS1SUiAqLworCisJLyogQ2xlYXIgY291bnRlcnMgYW5kIGNvbWVmcm9tICovCisJZS0+Y291bnRlcnMgPSAoKHN0cnVjdCBpcDZ0X2NvdW50ZXJzKSB7IDAsIDAgfSk7CisJZS0+Y29tZWZyb20gPSAwOworCisJKCppKSsrOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorY2xlYW51cF9lbnRyeShzdHJ1Y3QgaXA2dF9lbnRyeSAqZSwgdW5zaWduZWQgaW50ICppKQoreworCXN0cnVjdCBpcDZ0X2VudHJ5X3RhcmdldCAqdDsKKworCWlmIChpICYmICgqaSktLSA9PSAwKQorCQlyZXR1cm4gMTsKKworCS8qIENsZWFudXAgYWxsIG1hdGNoZXMgKi8KKwlJUDZUX01BVENIX0lURVJBVEUoZSwgY2xlYW51cF9tYXRjaCwgTlVMTCk7CisJdCA9IGlwNnRfZ2V0X3RhcmdldChlKTsKKwlpZiAodC0+dS5rZXJuZWwudGFyZ2V0LT5kZXN0cm95KQorCQl0LT51Lmtlcm5lbC50YXJnZXQtPmRlc3Ryb3kodC0+ZGF0YSwKKwkJCQkJICAgIHQtPnUudGFyZ2V0X3NpemUgLSBzaXplb2YoKnQpKTsKKwltb2R1bGVfcHV0KHQtPnUua2VybmVsLnRhcmdldC0+bWUpOworCXJldHVybiAwOworfQorCisvKiBDaGVja3MgYW5kIHRyYW5zbGF0ZXMgdGhlIHVzZXItc3VwcGxpZWQgdGFibGUgc2VnbWVudCAoaGVsZCBpbgorICAgbmV3aW5mbykgKi8KK3N0YXRpYyBpbnQKK3RyYW5zbGF0ZV90YWJsZShjb25zdCBjaGFyICpuYW1lLAorCQl1bnNpZ25lZCBpbnQgdmFsaWRfaG9va3MsCisJCXN0cnVjdCBpcDZ0X3RhYmxlX2luZm8gKm5ld2luZm8sCisJCXVuc2lnbmVkIGludCBzaXplLAorCQl1bnNpZ25lZCBpbnQgbnVtYmVyLAorCQljb25zdCB1bnNpZ25lZCBpbnQgKmhvb2tfZW50cmllcywKKwkJY29uc3QgdW5zaWduZWQgaW50ICp1bmRlcmZsb3dzKQoreworCXVuc2lnbmVkIGludCBpOworCWludCByZXQ7CisKKwluZXdpbmZvLT5zaXplID0gc2l6ZTsKKwluZXdpbmZvLT5udW1iZXIgPSBudW1iZXI7CisKKwkvKiBJbml0IGFsbCBob29rcyB0byBpbXBvc3NpYmxlIHZhbHVlLiAqLworCWZvciAoaSA9IDA7IGkgPCBORl9JUDZfTlVNSE9PS1M7IGkrKykgeworCQluZXdpbmZvLT5ob29rX2VudHJ5W2ldID0gMHhGRkZGRkZGRjsKKwkJbmV3aW5mby0+dW5kZXJmbG93W2ldID0gMHhGRkZGRkZGRjsKKwl9CisKKwlkdXByaW50ZigidHJhbnNsYXRlX3RhYmxlOiBzaXplICV1XG4iLCBuZXdpbmZvLT5zaXplKTsKKwlpID0gMDsKKwkvKiBXYWxrIHRocm91Z2ggZW50cmllcywgY2hlY2tpbmcgb2Zmc2V0cy4gKi8KKwlyZXQgPSBJUDZUX0VOVFJZX0lURVJBVEUobmV3aW5mby0+ZW50cmllcywgbmV3aW5mby0+c2l6ZSwKKwkJCQljaGVja19lbnRyeV9zaXplX2FuZF9ob29rcywKKwkJCQluZXdpbmZvLAorCQkJCW5ld2luZm8tPmVudHJpZXMsCisJCQkJbmV3aW5mby0+ZW50cmllcyArIHNpemUsCisJCQkJaG9va19lbnRyaWVzLCB1bmRlcmZsb3dzLCAmaSk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGkgIT0gbnVtYmVyKSB7CisJCWR1cHJpbnRmKCJ0cmFuc2xhdGVfdGFibGU6ICV1IG5vdCAldSBlbnRyaWVzXG4iLAorCQkJIGksIG51bWJlcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENoZWNrIGhvb2tzIGFsbCBhc3NpZ25lZCAqLworCWZvciAoaSA9IDA7IGkgPCBORl9JUDZfTlVNSE9PS1M7IGkrKykgeworCQkvKiBPbmx5IGhvb2tzIHdoaWNoIGFyZSB2YWxpZCAqLworCQlpZiAoISh2YWxpZF9ob29rcyAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAobmV3aW5mby0+aG9va19lbnRyeVtpXSA9PSAweEZGRkZGRkZGKSB7CisJCQlkdXByaW50ZigiSW52YWxpZCBob29rIGVudHJ5ICV1ICV1XG4iLAorCQkJCSBpLCBob29rX2VudHJpZXNbaV0pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKG5ld2luZm8tPnVuZGVyZmxvd1tpXSA9PSAweEZGRkZGRkZGKSB7CisJCQlkdXByaW50ZigiSW52YWxpZCB1bmRlcmZsb3cgJXUgJXVcbiIsCisJCQkJIGksIHVuZGVyZmxvd3NbaV0pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAoIW1hcmtfc291cmNlX2NoYWlucyhuZXdpbmZvLCB2YWxpZF9ob29rcykpCisJCXJldHVybiAtRUxPT1A7CisKKwkvKiBGaW5hbGx5LCBlYWNoIHNhbml0eSBjaGVjayBtdXN0IHBhc3MgKi8KKwlpID0gMDsKKwlyZXQgPSBJUDZUX0VOVFJZX0lURVJBVEUobmV3aW5mby0+ZW50cmllcywgbmV3aW5mby0+c2l6ZSwKKwkJCQljaGVja19lbnRyeSwgbmFtZSwgc2l6ZSwgJmkpOworCisJaWYgKHJldCAhPSAwKSB7CisJCUlQNlRfRU5UUllfSVRFUkFURShuZXdpbmZvLT5lbnRyaWVzLCBuZXdpbmZvLT5zaXplLAorCQkJCSAgY2xlYW51cF9lbnRyeSwgJmkpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIEFuZCBvbmUgY29weSBmb3IgZXZlcnkgb3RoZXIgQ1BVICovCisJZm9yIChpID0gMTsgaSA8IG51bV9wb3NzaWJsZV9jcHVzKCk7IGkrKykgeworCQltZW1jcHkobmV3aW5mby0+ZW50cmllcyArIFNNUF9BTElHTihuZXdpbmZvLT5zaXplKSppLAorCQkgICAgICAgbmV3aW5mby0+ZW50cmllcywKKwkJICAgICAgIFNNUF9BTElHTihuZXdpbmZvLT5zaXplKSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBpcDZ0X3RhYmxlX2luZm8gKgorcmVwbGFjZV90YWJsZShzdHJ1Y3QgaXA2dF90YWJsZSAqdGFibGUsCisJICAgICAgdW5zaWduZWQgaW50IG51bV9jb3VudGVycywKKwkgICAgICBzdHJ1Y3QgaXA2dF90YWJsZV9pbmZvICpuZXdpbmZvLAorCSAgICAgIGludCAqZXJyb3IpCit7CisJc3RydWN0IGlwNnRfdGFibGVfaW5mbyAqb2xkaW5mbzsKKworI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKKwl7CisJCXN0cnVjdCBpcDZ0X2VudHJ5ICp0YWJsZV9iYXNlOworCQl1bnNpZ25lZCBpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3Bvc3NpYmxlX2NwdXMoKTsgaSsrKSB7CisJCQl0YWJsZV9iYXNlID0KKwkJCQkodm9pZCAqKW5ld2luZm8tPmVudHJpZXMKKwkJCQkrIFRBQkxFX09GRlNFVChuZXdpbmZvLCBpKTsKKworCQkJdGFibGVfYmFzZS0+Y29tZWZyb20gPSAweGRlYWQ1N2FjOworCQl9CisJfQorI2VuZGlmCisKKwkvKiBEbyB0aGUgc3Vic3RpdHV0aW9uLiAqLworCXdyaXRlX2xvY2tfYmgoJnRhYmxlLT5sb2NrKTsKKwkvKiBDaGVjayBpbnNpZGUgbG9jazogaXMgdGhlIG9sZCBudW1iZXIgY29ycmVjdD8gKi8KKwlpZiAobnVtX2NvdW50ZXJzICE9IHRhYmxlLT5wcml2YXRlLT5udW1iZXIpIHsKKwkJZHVwcmludGYoIm51bV9jb3VudGVycyAhPSB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyICgldS8ldSlcbiIsCisJCQkgbnVtX2NvdW50ZXJzLCB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyKTsKKwkJd3JpdGVfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7CisJCSplcnJvciA9IC1FQUdBSU47CisJCXJldHVybiBOVUxMOworCX0KKwlvbGRpbmZvID0gdGFibGUtPnByaXZhdGU7CisJdGFibGUtPnByaXZhdGUgPSBuZXdpbmZvOworCW5ld2luZm8tPmluaXRpYWxfZW50cmllcyA9IG9sZGluZm8tPmluaXRpYWxfZW50cmllczsKKwl3cml0ZV91bmxvY2tfYmgoJnRhYmxlLT5sb2NrKTsKKworCXJldHVybiBvbGRpbmZvOworfQorCisvKiBHZXRzIGNvdW50ZXJzLiAqLworc3RhdGljIGlubGluZSBpbnQKK2FkZF9lbnRyeV90b19jb3VudGVyKGNvbnN0IHN0cnVjdCBpcDZ0X2VudHJ5ICplLAorCQkgICAgIHN0cnVjdCBpcDZ0X2NvdW50ZXJzIHRvdGFsW10sCisJCSAgICAgdW5zaWduZWQgaW50ICppKQoreworCUFERF9DT1VOVEVSKHRvdGFsWyppXSwgZS0+Y291bnRlcnMuYmNudCwgZS0+Y291bnRlcnMucGNudCk7CisKKwkoKmkpKys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitnZXRfY291bnRlcnMoY29uc3Qgc3RydWN0IGlwNnRfdGFibGVfaW5mbyAqdCwKKwkgICAgIHN0cnVjdCBpcDZ0X2NvdW50ZXJzIGNvdW50ZXJzW10pCit7CisJdW5zaWduZWQgaW50IGNwdTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoY3B1ID0gMDsgY3B1IDwgbnVtX3Bvc3NpYmxlX2NwdXMoKTsgY3B1KyspIHsKKwkJaSA9IDA7CisJCUlQNlRfRU5UUllfSVRFUkFURSh0LT5lbnRyaWVzICsgVEFCTEVfT0ZGU0VUKHQsIGNwdSksCisJCQkJICB0LT5zaXplLAorCQkJCSAgYWRkX2VudHJ5X3RvX2NvdW50ZXIsCisJCQkJICBjb3VudGVycywKKwkJCQkgICZpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2NvcHlfZW50cmllc190b191c2VyKHVuc2lnbmVkIGludCB0b3RhbF9zaXplLAorCQkgICAgIHN0cnVjdCBpcDZ0X3RhYmxlICp0YWJsZSwKKwkJICAgICB2b2lkIF9fdXNlciAqdXNlcnB0cikKK3sKKwl1bnNpZ25lZCBpbnQgb2ZmLCBudW0sIGNvdW50ZXJzaXplOworCXN0cnVjdCBpcDZ0X2VudHJ5ICplOworCXN0cnVjdCBpcDZ0X2NvdW50ZXJzICpjb3VudGVyczsKKwlpbnQgcmV0ID0gMDsKKworCS8qIFdlIG5lZWQgYXRvbWljIHNuYXBzaG90IG9mIGNvdW50ZXJzOiByZXN0IGRvZXNuJ3QgY2hhbmdlCisJICAgKG90aGVyIHRoYW4gY29tZWZyb20sIHdoaWNoIHVzZXJzcGFjZSBkb2Vzbid0IGNhcmUKKwkgICBhYm91dCkuICovCisJY291bnRlcnNpemUgPSBzaXplb2Yoc3RydWN0IGlwNnRfY291bnRlcnMpICogdGFibGUtPnByaXZhdGUtPm51bWJlcjsKKwljb3VudGVycyA9IHZtYWxsb2MoY291bnRlcnNpemUpOworCisJaWYgKGNvdW50ZXJzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogRmlyc3QsIHN1bSBjb3VudGVycy4uLiAqLworCW1lbXNldChjb3VudGVycywgMCwgY291bnRlcnNpemUpOworCXdyaXRlX2xvY2tfYmgoJnRhYmxlLT5sb2NrKTsKKwlnZXRfY291bnRlcnModGFibGUtPnByaXZhdGUsIGNvdW50ZXJzKTsKKwl3cml0ZV91bmxvY2tfYmgoJnRhYmxlLT5sb2NrKTsKKworCS8qIC4uLiB0aGVuIGNvcHkgZW50aXJlIHRoaW5nIGZyb20gQ1BVIDAuLi4gKi8KKwlpZiAoY29weV90b191c2VyKHVzZXJwdHIsIHRhYmxlLT5wcml2YXRlLT5lbnRyaWVzLCB0b3RhbF9zaXplKSAhPSAwKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZnJlZV9jb3VudGVyczsKKwl9CisKKwkvKiBGSVhNRTogdXNlIGl0ZXJhdG9yIG1hY3JvcyAtLVJSICovCisJLyogLi4uIHRoZW4gZ28gYmFjayBhbmQgZml4IGNvdW50ZXJzIGFuZCBuYW1lcyAqLworCWZvciAob2ZmID0gMCwgbnVtID0gMDsgb2ZmIDwgdG90YWxfc2l6ZTsgb2ZmICs9IGUtPm5leHRfb2Zmc2V0LCBudW0rKyl7CisJCXVuc2lnbmVkIGludCBpOworCQlzdHJ1Y3QgaXA2dF9lbnRyeV9tYXRjaCAqbTsKKwkJc3RydWN0IGlwNnRfZW50cnlfdGFyZ2V0ICp0OworCisJCWUgPSAoc3RydWN0IGlwNnRfZW50cnkgKikodGFibGUtPnByaXZhdGUtPmVudHJpZXMgKyBvZmYpOworCQlpZiAoY29weV90b191c2VyKHVzZXJwdHIgKyBvZmYKKwkJCQkgKyBvZmZzZXRvZihzdHJ1Y3QgaXA2dF9lbnRyeSwgY291bnRlcnMpLAorCQkJCSAmY291bnRlcnNbbnVtXSwKKwkJCQkgc2l6ZW9mKGNvdW50ZXJzW251bV0pKSAhPSAwKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBmcmVlX2NvdW50ZXJzOworCQl9CisKKwkJZm9yIChpID0gc2l6ZW9mKHN0cnVjdCBpcDZ0X2VudHJ5KTsKKwkJICAgICBpIDwgZS0+dGFyZ2V0X29mZnNldDsKKwkJICAgICBpICs9IG0tPnUubWF0Y2hfc2l6ZSkgeworCQkJbSA9ICh2b2lkICopZSArIGk7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIodXNlcnB0ciArIG9mZiArIGkKKwkJCQkJICsgb2Zmc2V0b2Yoc3RydWN0IGlwNnRfZW50cnlfbWF0Y2gsCisJCQkJCQkgICAgdS51c2VyLm5hbWUpLAorCQkJCQkgbS0+dS5rZXJuZWwubWF0Y2gtPm5hbWUsCisJCQkJCSBzdHJsZW4obS0+dS5rZXJuZWwubWF0Y2gtPm5hbWUpKzEpCisJCQkgICAgIT0gMCkgeworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJZ290byBmcmVlX2NvdW50ZXJzOworCQkJfQorCQl9CisKKwkJdCA9IGlwNnRfZ2V0X3RhcmdldChlKTsKKwkJaWYgKGNvcHlfdG9fdXNlcih1c2VycHRyICsgb2ZmICsgZS0+dGFyZ2V0X29mZnNldAorCQkJCSArIG9mZnNldG9mKHN0cnVjdCBpcDZ0X2VudHJ5X3RhcmdldCwKKwkJCQkJICAgIHUudXNlci5uYW1lKSwKKwkJCQkgdC0+dS5rZXJuZWwudGFyZ2V0LT5uYW1lLAorCQkJCSBzdHJsZW4odC0+dS5rZXJuZWwudGFyZ2V0LT5uYW1lKSsxKSAhPSAwKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBmcmVlX2NvdW50ZXJzOworCQl9CisJfQorCisgZnJlZV9jb3VudGVyczoKKwl2ZnJlZShjb3VudGVycyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorZ2V0X2VudHJpZXMoY29uc3Qgc3RydWN0IGlwNnRfZ2V0X2VudHJpZXMgKmVudHJpZXMsCisJICAgIHN0cnVjdCBpcDZ0X2dldF9lbnRyaWVzIF9fdXNlciAqdXB0cikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpcDZ0X3RhYmxlICp0OworCisJdCA9IGlwNnRfZmluZF90YWJsZV9sb2NrKGVudHJpZXMtPm5hbWUsICZyZXQsICZpcDZ0X211dGV4KTsKKwlpZiAodCkgeworCQlkdXByaW50ZigidC0+cHJpdmF0ZS0+bnVtYmVyID0gJXVcbiIsCisJCQkgdC0+cHJpdmF0ZS0+bnVtYmVyKTsKKwkJaWYgKGVudHJpZXMtPnNpemUgPT0gdC0+cHJpdmF0ZS0+c2l6ZSkKKwkJCXJldCA9IGNvcHlfZW50cmllc190b191c2VyKHQtPnByaXZhdGUtPnNpemUsCisJCQkJCQkgICB0LCB1cHRyLT5lbnRyeXRhYmxlKTsKKwkJZWxzZSB7CisJCQlkdXByaW50ZigiZ2V0X2VudHJpZXM6IEkndmUgZ290ICV1IG5vdCAldSFcbiIsCisJCQkJIHQtPnByaXZhdGUtPnNpemUsCisJCQkJIGVudHJpZXMtPnNpemUpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCQl1cCgmaXA2dF9tdXRleCk7CisJfSBlbHNlCisJCWR1cHJpbnRmKCJnZXRfZW50cmllczogQ2FuJ3QgZmluZCAlcyFcbiIsCisJCQkgZW50cmllcy0+bmFtZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50Citkb19yZXBsYWNlKHZvaWQgX191c2VyICp1c2VyLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWludCByZXQ7CisJc3RydWN0IGlwNnRfcmVwbGFjZSB0bXA7CisJc3RydWN0IGlwNnRfdGFibGUgKnQ7CisJc3RydWN0IGlwNnRfdGFibGVfaW5mbyAqbmV3aW5mbywgKm9sZGluZm87CisJc3RydWN0IGlwNnRfY291bnRlcnMgKmNvdW50ZXJzOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXAsIHVzZXIsIHNpemVvZih0bXApKSAhPSAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIFBlZGFudHJ5OiBwcmV2ZW50IHRoZW0gZnJvbSBoaXR0aW5nIEJVRygpIGluIHZtYWxsb2MuYyAtLVJSICovCisJaWYgKChTTVBfQUxJR04odG1wLnNpemUpID4+IFBBR0VfU0hJRlQpICsgMiA+IG51bV9waHlzcGFnZXMpCisJCXJldHVybiAtRU5PTUVNOworCisJbmV3aW5mbyA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcDZ0X3RhYmxlX2luZm8pCisJCQkgICsgU01QX0FMSUdOKHRtcC5zaXplKSAqIG51bV9wb3NzaWJsZV9jcHVzKCkpOworCWlmICghbmV3aW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoY29weV9mcm9tX3VzZXIobmV3aW5mby0+ZW50cmllcywgdXNlciArIHNpemVvZih0bXApLAorCQkJICAgdG1wLnNpemUpICE9IDApIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBmcmVlX25ld2luZm87CisJfQorCisJY291bnRlcnMgPSB2bWFsbG9jKHRtcC5udW1fY291bnRlcnMgKiBzaXplb2Yoc3RydWN0IGlwNnRfY291bnRlcnMpKTsKKwlpZiAoIWNvdW50ZXJzKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZnJlZV9uZXdpbmZvOworCX0KKwltZW1zZXQoY291bnRlcnMsIDAsIHRtcC5udW1fY291bnRlcnMgKiBzaXplb2Yoc3RydWN0IGlwNnRfY291bnRlcnMpKTsKKworCXJldCA9IHRyYW5zbGF0ZV90YWJsZSh0bXAubmFtZSwgdG1wLnZhbGlkX2hvb2tzLAorCQkJICAgICAgbmV3aW5mbywgdG1wLnNpemUsIHRtcC5udW1fZW50cmllcywKKwkJCSAgICAgIHRtcC5ob29rX2VudHJ5LCB0bXAudW5kZXJmbG93KTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gZnJlZV9uZXdpbmZvX2NvdW50ZXJzOworCisJZHVwcmludGYoImlwX3RhYmxlczogVHJhbnNsYXRlZCB0YWJsZVxuIik7CisKKwl0ID0gaXA2dF9maW5kX3RhYmxlX2xvY2sodG1wLm5hbWUsICZyZXQsICZpcDZ0X211dGV4KTsKKwlpZiAoIXQpCisJCWdvdG8gZnJlZV9uZXdpbmZvX2NvdW50ZXJzX3VudHJhbnM7CisKKwkvKiBZb3UgbGllZCEgKi8KKwlpZiAodG1wLnZhbGlkX2hvb2tzICE9IHQtPnZhbGlkX2hvb2tzKSB7CisJCWR1cHJpbnRmKCJWYWxpZCBob29rIGNyYXA6ICUwOFggdnMgJTA4WFxuIiwKKwkJCSB0bXAudmFsaWRfaG9va3MsIHQtPnZhbGlkX2hvb2tzKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmcmVlX25ld2luZm9fY291bnRlcnNfdW50cmFuc191bmxvY2s7CisJfQorCisJLyogR2V0IGEgcmVmZXJlbmNlIGluIGFkdmFuY2UsIHdlJ3JlIG5vdCBhbGxvd2VkIGZhaWwgbGF0ZXIgKi8KKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KHQtPm1lKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZnJlZV9uZXdpbmZvX2NvdW50ZXJzX3VudHJhbnNfdW5sb2NrOworCX0KKworCW9sZGluZm8gPSByZXBsYWNlX3RhYmxlKHQsIHRtcC5udW1fY291bnRlcnMsIG5ld2luZm8sICZyZXQpOworCWlmICghb2xkaW5mbykKKwkJZ290byBwdXRfbW9kdWxlOworCisJLyogVXBkYXRlIG1vZHVsZSB1c2FnZSBjb3VudCBiYXNlZCBvbiBudW1iZXIgb2YgcnVsZXMgKi8KKwlkdXByaW50ZigiZG9fcmVwbGFjZTogb2xkbnVtPSV1LCBpbml0bnVtPSV1LCBuZXdudW09JXVcbiIsCisJCW9sZGluZm8tPm51bWJlciwgb2xkaW5mby0+aW5pdGlhbF9lbnRyaWVzLCBuZXdpbmZvLT5udW1iZXIpOworCWlmICgob2xkaW5mby0+bnVtYmVyID4gb2xkaW5mby0+aW5pdGlhbF9lbnRyaWVzKSB8fCAKKwkgICAgKG5ld2luZm8tPm51bWJlciA8PSBvbGRpbmZvLT5pbml0aWFsX2VudHJpZXMpKSAKKwkJbW9kdWxlX3B1dCh0LT5tZSk7CisJaWYgKChvbGRpbmZvLT5udW1iZXIgPiBvbGRpbmZvLT5pbml0aWFsX2VudHJpZXMpICYmCisJICAgIChuZXdpbmZvLT5udW1iZXIgPD0gb2xkaW5mby0+aW5pdGlhbF9lbnRyaWVzKSkKKwkJbW9kdWxlX3B1dCh0LT5tZSk7CisKKwkvKiBHZXQgdGhlIG9sZCBjb3VudGVycy4gKi8KKwlnZXRfY291bnRlcnMob2xkaW5mbywgY291bnRlcnMpOworCS8qIERlY3JlYXNlIG1vZHVsZSB1c2FnZSBjb3VudHMgYW5kIGZyZWUgcmVzb3VyY2UgKi8KKwlJUDZUX0VOVFJZX0lURVJBVEUob2xkaW5mby0+ZW50cmllcywgb2xkaW5mby0+c2l6ZSwgY2xlYW51cF9lbnRyeSxOVUxMKTsKKwl2ZnJlZShvbGRpbmZvKTsKKwkvKiBTaWxlbnQgZXJyb3I6IHRvbyBsYXRlIG5vdy4gKi8KKwlpZiAoY29weV90b191c2VyKHRtcC5jb3VudGVycywgY291bnRlcnMsCisJCQkgc2l6ZW9mKHN0cnVjdCBpcDZ0X2NvdW50ZXJzKSAqIHRtcC5udW1fY291bnRlcnMpICE9IDApCisJCXJldCA9IC1FRkFVTFQ7CisJdmZyZWUoY291bnRlcnMpOworCXVwKCZpcDZ0X211dGV4KTsKKwlyZXR1cm4gcmV0OworCisgcHV0X21vZHVsZToKKwltb2R1bGVfcHV0KHQtPm1lKTsKKyBmcmVlX25ld2luZm9fY291bnRlcnNfdW50cmFuc191bmxvY2s6CisJdXAoJmlwNnRfbXV0ZXgpOworIGZyZWVfbmV3aW5mb19jb3VudGVyc191bnRyYW5zOgorCUlQNlRfRU5UUllfSVRFUkFURShuZXdpbmZvLT5lbnRyaWVzLCBuZXdpbmZvLT5zaXplLCBjbGVhbnVwX2VudHJ5LE5VTEwpOworIGZyZWVfbmV3aW5mb19jb3VudGVyczoKKwl2ZnJlZShjb3VudGVycyk7CisgZnJlZV9uZXdpbmZvOgorCXZmcmVlKG5ld2luZm8pOworCXJldHVybiByZXQ7Cit9CisKKy8qIFdlJ3JlIGxhenksIGFuZCBhZGQgdG8gdGhlIGZpcnN0IENQVTsgb3ZlcmZsb3cgd29ya3MgaXRzIGZleSBtYWdpYworICogYW5kIGV2ZXJ5dGhpbmcgaXMgT0suICovCitzdGF0aWMgaW5saW5lIGludAorYWRkX2NvdW50ZXJfdG9fZW50cnkoc3RydWN0IGlwNnRfZW50cnkgKmUsCisJCSAgICAgY29uc3Qgc3RydWN0IGlwNnRfY291bnRlcnMgYWRkbWVbXSwKKwkJICAgICB1bnNpZ25lZCBpbnQgKmkpCit7CisjaWYgMAorCWR1cHJpbnRmKCJhZGRfY291bnRlcjogRW50cnkgJXUgJWx1LyVsdSArICVsdS8lbHVcbiIsCisJCSAqaSwKKwkJIChsb25nIHVuc2lnbmVkIGludCllLT5jb3VudGVycy5wY250LAorCQkgKGxvbmcgdW5zaWduZWQgaW50KWUtPmNvdW50ZXJzLmJjbnQsCisJCSAobG9uZyB1bnNpZ25lZCBpbnQpYWRkbWVbKmldLnBjbnQsCisJCSAobG9uZyB1bnNpZ25lZCBpbnQpYWRkbWVbKmldLmJjbnQpOworI2VuZGlmCisKKwlBRERfQ09VTlRFUihlLT5jb3VudGVycywgYWRkbWVbKmldLmJjbnQsIGFkZG1lWyppXS5wY250KTsKKworCSgqaSkrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZG9fYWRkX2NvdW50ZXJzKHZvaWQgX191c2VyICp1c2VyLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBpcDZ0X2NvdW50ZXJzX2luZm8gdG1wLCAqcGFkZGM7CisJc3RydWN0IGlwNnRfdGFibGUgKnQ7CisJaW50IHJldDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wLCB1c2VyLCBzaXplb2YodG1wKSkgIT0gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAobGVuICE9IHNpemVvZih0bXApICsgdG1wLm51bV9jb3VudGVycypzaXplb2Yoc3RydWN0IGlwNnRfY291bnRlcnMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBhZGRjID0gdm1hbGxvYyhsZW4pOworCWlmICghcGFkZGMpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGNvcHlfZnJvbV91c2VyKHBhZGRjLCB1c2VyLCBsZW4pICE9IDApIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBmcmVlOworCX0KKworCXQgPSBpcDZ0X2ZpbmRfdGFibGVfbG9jayh0bXAubmFtZSwgJnJldCwgJmlwNnRfbXV0ZXgpOworCWlmICghdCkKKwkJZ290byBmcmVlOworCisJd3JpdGVfbG9ja19iaCgmdC0+bG9jayk7CisJaWYgKHQtPnByaXZhdGUtPm51bWJlciAhPSBwYWRkYy0+bnVtX2NvdW50ZXJzKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gdW5sb2NrX3VwX2ZyZWU7CisJfQorCisJaSA9IDA7CisJSVA2VF9FTlRSWV9JVEVSQVRFKHQtPnByaXZhdGUtPmVudHJpZXMsCisJCQkgIHQtPnByaXZhdGUtPnNpemUsCisJCQkgIGFkZF9jb3VudGVyX3RvX2VudHJ5LAorCQkJICBwYWRkYy0+Y291bnRlcnMsCisJCQkgICZpKTsKKyB1bmxvY2tfdXBfZnJlZToKKwl3cml0ZV91bmxvY2tfYmgoJnQtPmxvY2spOworCXVwKCZpcDZ0X211dGV4KTsKKyBmcmVlOgorCXZmcmVlKHBhZGRjKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2RvX2lwNnRfc2V0X2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHZvaWQgX191c2VyICp1c2VyLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWludCByZXQ7CisKKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSVA2VF9TT19TRVRfUkVQTEFDRToKKwkJcmV0ID0gZG9fcmVwbGFjZSh1c2VyLCBsZW4pOworCQlicmVhazsKKworCWNhc2UgSVA2VF9TT19TRVRfQUREX0NPVU5URVJTOgorCQlyZXQgPSBkb19hZGRfY291bnRlcnModXNlciwgbGVuKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkdXByaW50ZigiZG9faXA2dF9zZXRfY3RsOiAgdW5rbm93biByZXF1ZXN0ICVpXG4iLCBjbWQpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2RvX2lwNnRfZ2V0X2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHZvaWQgX191c2VyICp1c2VyLCBpbnQgKmxlbikKK3sKKwlpbnQgcmV0OworCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIElQNlRfU09fR0VUX0lORk86IHsKKwkJY2hhciBuYW1lW0lQNlRfVEFCTEVfTUFYTkFNRUxFTl07CisJCXN0cnVjdCBpcDZ0X3RhYmxlICp0OworCisJCWlmICgqbGVuICE9IHNpemVvZihzdHJ1Y3QgaXA2dF9nZXRpbmZvKSkgeworCQkJZHVwcmludGYoImxlbmd0aCAldSAhPSAldVxuIiwgKmxlbiwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBpcDZ0X2dldGluZm8pKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChjb3B5X2Zyb21fdXNlcihuYW1lLCB1c2VyLCBzaXplb2YobmFtZSkpICE9IDApIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQluYW1lW0lQNlRfVEFCTEVfTUFYTkFNRUxFTi0xXSA9ICdcMCc7CisJCXQgPSBpcDZ0X2ZpbmRfdGFibGVfbG9jayhuYW1lLCAmcmV0LCAmaXA2dF9tdXRleCk7CisJCWlmICh0KSB7CisJCQlzdHJ1Y3QgaXA2dF9nZXRpbmZvIGluZm87CisKKwkJCWluZm8udmFsaWRfaG9va3MgPSB0LT52YWxpZF9ob29rczsKKwkJCW1lbWNweShpbmZvLmhvb2tfZW50cnksIHQtPnByaXZhdGUtPmhvb2tfZW50cnksCisJCQkgICAgICAgc2l6ZW9mKGluZm8uaG9va19lbnRyeSkpOworCQkJbWVtY3B5KGluZm8udW5kZXJmbG93LCB0LT5wcml2YXRlLT51bmRlcmZsb3csCisJCQkgICAgICAgc2l6ZW9mKGluZm8udW5kZXJmbG93KSk7CisJCQlpbmZvLm51bV9lbnRyaWVzID0gdC0+cHJpdmF0ZS0+bnVtYmVyOworCQkJaW5mby5zaXplID0gdC0+cHJpdmF0ZS0+c2l6ZTsKKwkJCW1lbWNweShpbmZvLm5hbWUsIG5hbWUsIHNpemVvZihpbmZvLm5hbWUpKTsKKworCQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyLCAmaW5mbywgKmxlbikgIT0gMCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJZWxzZQorCQkJCXJldCA9IDA7CisKKwkJCXVwKCZpcDZ0X211dGV4KTsKKwkJfQorCX0KKwlicmVhazsKKworCWNhc2UgSVA2VF9TT19HRVRfRU5UUklFUzogeworCQlzdHJ1Y3QgaXA2dF9nZXRfZW50cmllcyBnZXQ7CisKKwkJaWYgKCpsZW4gPCBzaXplb2YoZ2V0KSkgeworCQkJZHVwcmludGYoImdldF9lbnRyaWVzOiAldSA8ICV1XG4iLCAqbGVuLCBzaXplb2YoZ2V0KSk7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9IGVsc2UgaWYgKGNvcHlfZnJvbV91c2VyKCZnZXQsIHVzZXIsIHNpemVvZihnZXQpKSAhPSAwKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQl9IGVsc2UgaWYgKCpsZW4gIT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X2dldF9lbnRyaWVzKSArIGdldC5zaXplKSB7CisJCQlkdXByaW50ZigiZ2V0X2VudHJpZXM6ICV1ICE9ICV1XG4iLCAqbGVuLAorCQkJCSBzaXplb2Yoc3RydWN0IGlwNnRfZ2V0X2VudHJpZXMpICsgZ2V0LnNpemUpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfSBlbHNlCisJCQlyZXQgPSBnZXRfZW50cmllcygmZ2V0LCB1c2VyKTsKKwkJYnJlYWs7CisJfQorCisJZGVmYXVsdDoKKwkJZHVwcmludGYoImRvX2lwNnRfZ2V0X2N0bDogdW5rbm93biByZXF1ZXN0ICVpXG4iLCBjbWQpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIFJlZ2lzdHJhdGlvbiBob29rcyBmb3IgdGFyZ2V0cy4gKi8KK2ludAoraXA2dF9yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGlwNnRfdGFyZ2V0ICp0YXJnZXQpCit7CisJaW50IHJldDsKKworCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmaXA2dF9tdXRleCk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKCFsaXN0X25hbWVkX2luc2VydCgmaXA2dF90YXJnZXQsIHRhcmdldCkpIHsKKwkJZHVwcmludGYoImlwNnRfcmVnaXN0ZXJfdGFyZ2V0OiBgJXMnIGFscmVhZHkgaW4gbGlzdCFcbiIsCisJCQkgdGFyZ2V0LT5uYW1lKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJdXAoJmlwNnRfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQKK2lwNnRfdW5yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGlwNnRfdGFyZ2V0ICp0YXJnZXQpCit7CisJZG93bigmaXA2dF9tdXRleCk7CisJTElTVF9ERUxFVEUoJmlwNnRfdGFyZ2V0LCB0YXJnZXQpOworCXVwKCZpcDZ0X211dGV4KTsKK30KKworaW50CitpcDZ0X3JlZ2lzdGVyX21hdGNoKHN0cnVjdCBpcDZ0X21hdGNoICptYXRjaCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZpcDZ0X211dGV4KTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoIWxpc3RfbmFtZWRfaW5zZXJ0KCZpcDZ0X21hdGNoLCBtYXRjaCkpIHsKKwkJZHVwcmludGYoImlwNnRfcmVnaXN0ZXJfbWF0Y2g6IGAlcycgYWxyZWFkeSBpbiBsaXN0IVxuIiwKKwkJCSBtYXRjaC0+bmFtZSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCXVwKCZpcDZ0X211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQKK2lwNnRfdW5yZWdpc3Rlcl9tYXRjaChzdHJ1Y3QgaXA2dF9tYXRjaCAqbWF0Y2gpCit7CisJZG93bigmaXA2dF9tdXRleCk7CisJTElTVF9ERUxFVEUoJmlwNnRfbWF0Y2gsIG1hdGNoKTsKKwl1cCgmaXA2dF9tdXRleCk7Cit9CisKK2ludCBpcDZ0X3JlZ2lzdGVyX3RhYmxlKHN0cnVjdCBpcDZ0X3RhYmxlICp0YWJsZSwKKwkJCWNvbnN0IHN0cnVjdCBpcDZ0X3JlcGxhY2UgKnJlcGwpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaXA2dF90YWJsZV9pbmZvICpuZXdpbmZvOworCXN0YXRpYyBzdHJ1Y3QgaXA2dF90YWJsZV9pbmZvIGJvb3RzdHJhcAorCQk9IHsgMCwgMCwgMCwgeyAwIH0sIHsgMCB9LCB7IH0gfTsKKworCW5ld2luZm8gPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgaXA2dF90YWJsZV9pbmZvKQorCQkJICArIFNNUF9BTElHTihyZXBsLT5zaXplKSAqIG51bV9wb3NzaWJsZV9jcHVzKCkpOworCWlmICghbmV3aW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1jcHkobmV3aW5mby0+ZW50cmllcywgcmVwbC0+ZW50cmllcywgcmVwbC0+c2l6ZSk7CisKKwlyZXQgPSB0cmFuc2xhdGVfdGFibGUodGFibGUtPm5hbWUsIHRhYmxlLT52YWxpZF9ob29rcywKKwkJCSAgICAgIG5ld2luZm8sIHJlcGwtPnNpemUsCisJCQkgICAgICByZXBsLT5udW1fZW50cmllcywKKwkJCSAgICAgIHJlcGwtPmhvb2tfZW50cnksCisJCQkgICAgICByZXBsLT51bmRlcmZsb3cpOworCWlmIChyZXQgIT0gMCkgeworCQl2ZnJlZShuZXdpbmZvKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJmlwNnRfbXV0ZXgpOworCWlmIChyZXQgIT0gMCkgeworCQl2ZnJlZShuZXdpbmZvKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBEb24ndCBhdXRvbG9hZDogd2UnZCBlYXQgb3VyIHRhaWwuLi4gKi8KKwlpZiAobGlzdF9uYW1lZF9maW5kKCZpcDZ0X3RhYmxlcywgdGFibGUtPm5hbWUpKSB7CisJCXJldCA9IC1FRVhJU1Q7CisJCWdvdG8gZnJlZV91bmxvY2s7CisJfQorCisJLyogU2ltcGxpZmllcyByZXBsYWNlX3RhYmxlIGNvZGUuICovCisJdGFibGUtPnByaXZhdGUgPSAmYm9vdHN0cmFwOworCWlmICghcmVwbGFjZV90YWJsZSh0YWJsZSwgMCwgbmV3aW5mbywgJnJldCkpCisJCWdvdG8gZnJlZV91bmxvY2s7CisKKwlkdXByaW50ZigidGFibGUtPnByaXZhdGUtPm51bWJlciA9ICV1XG4iLAorCQkgdGFibGUtPnByaXZhdGUtPm51bWJlcik7CisKKwkvKiBzYXZlIG51bWJlciBvZiBpbml0aWFsIGVudHJpZXMgKi8KKwl0YWJsZS0+cHJpdmF0ZS0+aW5pdGlhbF9lbnRyaWVzID0gdGFibGUtPnByaXZhdGUtPm51bWJlcjsKKworCXJ3bG9ja19pbml0KCZ0YWJsZS0+bG9jayk7CisJbGlzdF9wcmVwZW5kKCZpcDZ0X3RhYmxlcywgdGFibGUpOworCisgdW5sb2NrOgorCXVwKCZpcDZ0X211dGV4KTsKKwlyZXR1cm4gcmV0OworCisgZnJlZV91bmxvY2s6CisJdmZyZWUobmV3aW5mbyk7CisJZ290byB1bmxvY2s7Cit9CisKK3ZvaWQgaXA2dF91bnJlZ2lzdGVyX3RhYmxlKHN0cnVjdCBpcDZ0X3RhYmxlICp0YWJsZSkKK3sKKwlkb3duKCZpcDZ0X211dGV4KTsKKwlMSVNUX0RFTEVURSgmaXA2dF90YWJsZXMsIHRhYmxlKTsKKwl1cCgmaXA2dF9tdXRleCk7CisKKwkvKiBEZWNyZWFzZSBtb2R1bGUgdXNhZ2UgY291bnRzIGFuZCBmcmVlIHJlc291cmNlcyAqLworCUlQNlRfRU5UUllfSVRFUkFURSh0YWJsZS0+cHJpdmF0ZS0+ZW50cmllcywgdGFibGUtPnByaXZhdGUtPnNpemUsCisJCQkgIGNsZWFudXBfZW50cnksIE5VTEwpOworCXZmcmVlKHRhYmxlLT5wcml2YXRlKTsKK30KKworLyogUmV0dXJucyAxIGlmIHRoZSBwb3J0IGlzIG1hdGNoZWQgYnkgdGhlIHJhbmdlLCAwIG90aGVyd2lzZSAqLworc3RhdGljIGlubGluZSBpbnQKK3BvcnRfbWF0Y2godV9pbnQxNl90IG1pbiwgdV9pbnQxNl90IG1heCwgdV9pbnQxNl90IHBvcnQsIGludCBpbnZlcnQpCit7CisJaW50IHJldDsKKworCXJldCA9IChwb3J0ID49IG1pbiAmJiBwb3J0IDw9IG1heCkgXiBpbnZlcnQ7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAordGNwX2ZpbmRfb3B0aW9uKHVfaW50OF90IG9wdGlvbiwKKwkJY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJdW5zaWduZWQgaW50IHRjcG9mZiwKKwkJdW5zaWduZWQgaW50IG9wdGxlbiwKKwkJaW50IGludmVydCwKKwkJaW50ICpob3Rkcm9wKQoreworCS8qIHRjcC5kb2ZmIGlzIG9ubHkgNCBiaXRzLCBpZS4gbWF4IDE1ICogNCBieXRlcyAqLworCXVfaW50OF90IF9vcHRbNjAgLSBzaXplb2Yoc3RydWN0IHRjcGhkcildLCAqb3A7CisJdW5zaWduZWQgaW50IGk7CisKKwlkdXByaW50ZigidGNwX21hdGNoOiBmaW5kaW5nIG9wdGlvblxuIik7CisJaWYgKCFvcHRsZW4pCisJCXJldHVybiBpbnZlcnQ7CisJLyogSWYgd2UgZG9uJ3QgaGF2ZSB0aGUgd2hvbGUgaGVhZGVyLCBkcm9wIHBhY2tldC4gKi8KKwlvcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHRjcG9mZiArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSwgb3B0bGVuLAorCQkJCV9vcHQpOworCWlmIChvcCA9PSBOVUxMKSB7CisJCSpob3Rkcm9wID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG9wdGxlbjsgKSB7CisJCWlmIChvcFtpXSA9PSBvcHRpb24pIHJldHVybiAhaW52ZXJ0OworCQlpZiAob3BbaV0gPCAyKSBpKys7CisJCWVsc2UgaSArPSBvcFtpKzFdPzoxOworCX0KKworCXJldHVybiBpbnZlcnQ7Cit9CisKK3N0YXRpYyBpbnQKK3RjcF9tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKwkgIGludCBvZmZzZXQsCisJICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKwkgIGludCAqaG90ZHJvcCkKK3sKKwlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGg7CisJY29uc3Qgc3RydWN0IGlwNnRfdGNwICp0Y3BpbmZvID0gbWF0Y2hpbmZvOworCisJaWYgKG9mZnNldCkgeworCQkvKiBUbyBxdW90ZSBBbGFuOgorCisJCSAgIERvbid0IGFsbG93IGEgZnJhZ21lbnQgb2YgVENQIDggYnl0ZXMgaW4uIE5vYm9keSBub3JtYWwKKwkJICAgY2F1c2VzIHRoaXMuIEl0cyBhIGNyYWNrZXIgdHJ5aW5nIHRvIGJyZWFrIGluIGJ5IGRvaW5nIGEKKwkJICAgZmxhZyBvdmVyd3JpdGUgdG8gcGFzcyB0aGUgZGlyZWN0aW9uIGNoZWNrcy4KKwkJKi8KKwkJaWYgKG9mZnNldCA9PSAxKSB7CisJCQlkdXByaW50ZigiRHJvcHBpbmcgZXZpbCBUQ1Agb2Zmc2V0PTEgZnJhZy5cbiIpOworCQkJKmhvdGRyb3AgPSAxOworCQl9CisJCS8qIE11c3Qgbm90IGJlIGEgZnJhZ21lbnQuICovCisJCXJldHVybiAwOworCX0KKworI2RlZmluZSBGV0lOVlRDUChib29sLGludmZsZykgKChib29sKSBeICEhKHRjcGluZm8tPmludmZsYWdzICYgaW52ZmxnKSkKKworCXRoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiwgc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKKwlpZiAodGggPT0gTlVMTCkgeworCQkvKiBXZSd2ZSBiZWVuIGFza2VkIHRvIGV4YW1pbmUgdGhpcyBwYWNrZXQsIGFuZCB3ZQorCQkgICBjYW4ndC4gIEhlbmNlLCBubyBjaG9pY2UgYnV0IHRvIGRyb3AuICovCisJCWR1cHJpbnRmKCJEcm9wcGluZyBldmlsIFRDUCBvZmZzZXQ9MCB0aW55Z3JhbS5cbiIpOworCQkqaG90ZHJvcCA9IDE7CisJCXJldHVybiAwOworCX0KKworCWlmICghcG9ydF9tYXRjaCh0Y3BpbmZvLT5zcHRzWzBdLCB0Y3BpbmZvLT5zcHRzWzFdLAorCQkJbnRvaHModGgtPnNvdXJjZSksCisJCQkhISh0Y3BpbmZvLT5pbnZmbGFncyAmIElQNlRfVENQX0lOVl9TUkNQVCkpKQorCQlyZXR1cm4gMDsKKwlpZiAoIXBvcnRfbWF0Y2godGNwaW5mby0+ZHB0c1swXSwgdGNwaW5mby0+ZHB0c1sxXSwKKwkJCW50b2hzKHRoLT5kZXN0KSwKKwkJCSEhKHRjcGluZm8tPmludmZsYWdzICYgSVA2VF9UQ1BfSU5WX0RTVFBUKSkpCisJCXJldHVybiAwOworCWlmICghRldJTlZUQ1AoKCgodW5zaWduZWQgY2hhciAqKXRoKVsxM10gJiB0Y3BpbmZvLT5mbGdfbWFzaykKKwkJICAgICAgPT0gdGNwaW5mby0+ZmxnX2NtcCwKKwkJICAgICAgSVA2VF9UQ1BfSU5WX0ZMQUdTKSkKKwkJcmV0dXJuIDA7CisJaWYgKHRjcGluZm8tPm9wdGlvbikgeworCQlpZiAodGgtPmRvZmYgKiA0IDwgc2l6ZW9mKF90Y3BoKSkgeworCQkJKmhvdGRyb3AgPSAxOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCF0Y3BfZmluZF9vcHRpb24odGNwaW5mby0+b3B0aW9uLCBza2IsIHByb3RvZmYsCisJCQkJICAgICB0aC0+ZG9mZio0IC0gc2l6ZW9mKCp0aCksCisJCQkJICAgICB0Y3BpbmZvLT5pbnZmbGFncyAmIElQNlRfVENQX0lOVl9PUFRJT04sCisJCQkJICAgICBob3Rkcm9wKSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLworc3RhdGljIGludAordGNwX2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCSAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwdjYsCisJICAgICAgIHZvaWQgKm1hdGNoaW5mbywKKwkgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgaXA2dF90Y3AgKnRjcGluZm8gPSBtYXRjaGluZm87CisKKwkvKiBNdXN0IHNwZWNpZnkgcHJvdG8gPT0gVENQLCBhbmQgbm8gdW5rbm93biBpbnZmbGFncyAqLworCXJldHVybiBpcHY2LT5wcm90byA9PSBJUFBST1RPX1RDUAorCQkmJiAhKGlwdjYtPmludmZsYWdzICYgSVA2VF9JTlZfUFJPVE8pCisJCSYmIG1hdGNoc2l6ZSA9PSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF90Y3ApKQorCQkmJiAhKHRjcGluZm8tPmludmZsYWdzICYgfklQNlRfVENQX0lOVl9NQVNLKTsKK30KKworc3RhdGljIGludAordWRwX21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorCSAgaW50IG9mZnNldCwKKwkgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorCSAgaW50ICpob3Rkcm9wKQoreworCXN0cnVjdCB1ZHBoZHIgX3VkcGgsICp1aDsKKwljb25zdCBzdHJ1Y3QgaXA2dF91ZHAgKnVkcGluZm8gPSBtYXRjaGluZm87CisKKwkvKiBNdXN0IG5vdCBiZSBhIGZyYWdtZW50LiAqLworCWlmIChvZmZzZXQpCisJCXJldHVybiAwOworCisJdWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwcm90b2ZmLCBzaXplb2YoX3VkcGgpLCAmX3VkcGgpOworCWlmICh1aCA9PSBOVUxMKSB7CisJCS8qIFdlJ3ZlIGJlZW4gYXNrZWQgdG8gZXhhbWluZSB0aGlzIHBhY2tldCwgYW5kIHdlCisJCSAgIGNhbid0LiAgSGVuY2UsIG5vIGNob2ljZSBidXQgdG8gZHJvcC4gKi8KKwkJZHVwcmludGYoIkRyb3BwaW5nIGV2aWwgVURQIHRpbnlncmFtLlxuIik7CisJCSpob3Rkcm9wID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHBvcnRfbWF0Y2godWRwaW5mby0+c3B0c1swXSwgdWRwaW5mby0+c3B0c1sxXSwKKwkJCSAgbnRvaHModWgtPnNvdXJjZSksCisJCQkgICEhKHVkcGluZm8tPmludmZsYWdzICYgSVA2VF9VRFBfSU5WX1NSQ1BUKSkKKwkJJiYgcG9ydF9tYXRjaCh1ZHBpbmZvLT5kcHRzWzBdLCB1ZHBpbmZvLT5kcHRzWzFdLAorCQkJICAgICAgbnRvaHModWgtPmRlc3QpLAorCQkJICAgICAgISEodWRwaW5mby0+aW52ZmxhZ3MgJiBJUDZUX1VEUF9JTlZfRFNUUFQpKTsKK30KKworLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLworc3RhdGljIGludAordWRwX2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCSAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwdjYsCisJICAgICAgIHZvaWQgKm1hdGNoaW5mbywKKwkgICAgICAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCisJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IGlwNnRfdWRwICp1ZHBpbmZvID0gbWF0Y2hpbmZvOworCisJLyogTXVzdCBzcGVjaWZ5IHByb3RvID09IFVEUCwgYW5kIG5vIHVua25vd24gaW52ZmxhZ3MgKi8KKwlpZiAoaXB2Ni0+cHJvdG8gIT0gSVBQUk9UT19VRFAgfHwgKGlwdjYtPmludmZsYWdzICYgSVA2VF9JTlZfUFJPVE8pKSB7CisJCWR1cHJpbnRmKCJpcDZ0X3VkcDogUHJvdG9jb2wgJXUgIT0gJXVcbiIsIGlwdjYtPnByb3RvLAorCQkJIElQUFJPVE9fVURQKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChtYXRjaGluZm9zaXplICE9IElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X3VkcCkpKSB7CisJCWR1cHJpbnRmKCJpcDZ0X3VkcDogbWF0Y2hzaXplICV1ICE9ICV1XG4iLAorCQkJIG1hdGNoaW5mb3NpemUsIElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X3VkcCkpKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICh1ZHBpbmZvLT5pbnZmbGFncyAmIH5JUDZUX1VEUF9JTlZfTUFTSykgeworCQlkdXByaW50ZigiaXA2dF91ZHA6IHVua25vd24gZmxhZ3MgJVhcbiIsCisJCQkgdWRwaW5mby0+aW52ZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyogUmV0dXJucyAxIGlmIHRoZSB0eXBlIGFuZCBjb2RlIGlzIG1hdGNoZWQgYnkgdGhlIHJhbmdlLCAwIG90aGVyd2lzZSAqLworc3RhdGljIGlubGluZSBpbnQKK2ljbXA2X3R5cGVfY29kZV9tYXRjaCh1X2ludDhfdCB0ZXN0X3R5cGUsIHVfaW50OF90IG1pbl9jb2RlLCB1X2ludDhfdCBtYXhfY29kZSwKKwkJICAgICB1X2ludDhfdCB0eXBlLCB1X2ludDhfdCBjb2RlLAorCQkgICAgIGludCBpbnZlcnQpCit7CisJcmV0dXJuICh0eXBlID09IHRlc3RfdHlwZSAmJiBjb2RlID49IG1pbl9jb2RlICYmIGNvZGUgPD0gbWF4X2NvZGUpCisJCV4gaW52ZXJ0OworfQorCitzdGF0aWMgaW50CitpY21wNl9tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKwkgICBpbnQgb2Zmc2V0LAorCSAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorCSAgIGludCAqaG90ZHJvcCkKK3sKKwlzdHJ1Y3QgaWNtcDZoZHIgX2ljbXAsICppYzsKKwljb25zdCBzdHJ1Y3QgaXA2dF9pY21wICppY21waW5mbyA9IG1hdGNoaW5mbzsKKworCS8qIE11c3Qgbm90IGJlIGEgZnJhZ21lbnQuICovCisJaWYgKG9mZnNldCkKKwkJcmV0dXJuIDA7CisKKwlpYyA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYsIHNpemVvZihfaWNtcCksICZfaWNtcCk7CisJaWYgKGljID09IE5VTEwpIHsKKwkJLyogV2UndmUgYmVlbiBhc2tlZCB0byBleGFtaW5lIHRoaXMgcGFja2V0LCBhbmQgd2UKKwkJICAgY2FuJ3QuICBIZW5jZSwgbm8gY2hvaWNlIGJ1dCB0byBkcm9wLiAqLworCQlkdXByaW50ZigiRHJvcHBpbmcgZXZpbCBJQ01QIHRpbnlncmFtLlxuIik7CisJCSpob3Rkcm9wID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGljbXA2X3R5cGVfY29kZV9tYXRjaChpY21waW5mby0+dHlwZSwKKwkJCQkgICAgIGljbXBpbmZvLT5jb2RlWzBdLAorCQkJCSAgICAgaWNtcGluZm8tPmNvZGVbMV0sCisJCQkJICAgICBpYy0+aWNtcDZfdHlwZSwgaWMtPmljbXA2X2NvZGUsCisJCQkJICAgICAhIShpY21waW5mby0+aW52ZmxhZ3MmSVA2VF9JQ01QX0lOVikpOworfQorCisvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCitzdGF0aWMgaW50CitpY21wNl9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkgICBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwdjYsCisJICAgdm9pZCAqbWF0Y2hpbmZvLAorCSAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgaXA2dF9pY21wICppY21waW5mbyA9IG1hdGNoaW5mbzsKKworCS8qIE11c3Qgc3BlY2lmeSBwcm90byA9PSBJQ01QLCBhbmQgbm8gdW5rbm93biBpbnZmbGFncyAqLworCXJldHVybiBpcHY2LT5wcm90byA9PSBJUFBST1RPX0lDTVBWNgorCQkmJiAhKGlwdjYtPmludmZsYWdzICYgSVA2VF9JTlZfUFJPVE8pCisJCSYmIG1hdGNoc2l6ZSA9PSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9pY21wKSkKKwkJJiYgIShpY21waW5mby0+aW52ZmxhZ3MgJiB+SVA2VF9JQ01QX0lOVik7Cit9CisKKy8qIFRoZSBidWlsdC1pbiB0YXJnZXRzOiBzdGFuZGFyZCAoTlVMTCkgYW5kIGVycm9yLiAqLworc3RhdGljIHN0cnVjdCBpcDZ0X3RhcmdldCBpcDZ0X3N0YW5kYXJkX3RhcmdldCA9IHsKKwkubmFtZQkJPSBJUDZUX1NUQU5EQVJEX1RBUkdFVCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXA2dF90YXJnZXQgaXA2dF9lcnJvcl90YXJnZXQgPSB7CisJLm5hbWUJCT0gSVA2VF9FUlJPUl9UQVJHRVQsCisJLnRhcmdldAkJPSBpcDZ0X2Vycm9yLAorfTsKKworc3RhdGljIHN0cnVjdCBuZl9zb2Nrb3B0X29wcyBpcDZ0X3NvY2tvcHRzID0geworCS5wZgkJPSBQRl9JTkVUNiwKKwkuc2V0X29wdG1pbgk9IElQNlRfQkFTRV9DVEwsCisJLnNldF9vcHRtYXgJPSBJUDZUX1NPX1NFVF9NQVgrMSwKKwkuc2V0CQk9IGRvX2lwNnRfc2V0X2N0bCwKKwkuZ2V0X29wdG1pbgk9IElQNlRfQkFTRV9DVEwsCisJLmdldF9vcHRtYXgJPSBJUDZUX1NPX0dFVF9NQVgrMSwKKwkuZ2V0CQk9IGRvX2lwNnRfZ2V0X2N0bCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXA2dF9tYXRjaCB0Y3BfbWF0Y2hzdHJ1Y3QgPSB7CisJLm5hbWUJCT0gInRjcCIsCisJLm1hdGNoCQk9ICZ0Y3BfbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmdGNwX2NoZWNrZW50cnksCit9OworCitzdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggdWRwX21hdGNoc3RydWN0ID0geworCS5uYW1lCQk9ICJ1ZHAiLAorCS5tYXRjaAkJPSAmdWRwX21hdGNoLAorCS5jaGVja2VudHJ5CT0gJnVkcF9jaGVja2VudHJ5LAorfTsKKworc3RhdGljIHN0cnVjdCBpcDZ0X21hdGNoIGljbXA2X21hdGNoc3RydWN0ID0geworCS5uYW1lCQk9ICJpY21wNiIsCisJLm1hdGNoCQk9ICZpY21wNl9tYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZpY21wNl9jaGVja2VudHJ5LAorfTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgaW5saW5lIGludCBwcmludF9uYW1lKGNvbnN0IGNoYXIgKmksCisJCQkgICAgIG9mZl90IHN0YXJ0X29mZnNldCwgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoLAorCQkJICAgICBvZmZfdCAqcG9zLCB1bnNpZ25lZCBpbnQgKmNvdW50KQoreworCWlmICgoKmNvdW50KSsrID49IHN0YXJ0X29mZnNldCkgeworCQl1bnNpZ25lZCBpbnQgbmFtZWxlbjsKKworCQluYW1lbGVuID0gc3ByaW50ZihidWZmZXIgKyAqcG9zLCAiJXNcbiIsCisJCQkJICBpICsgc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpKTsKKwkJaWYgKCpwb3MgKyBuYW1lbGVuID4gbGVuZ3RoKSB7CisJCQkvKiBTdG9wIGl0ZXJhdGluZyAqLworCQkJcmV0dXJuIDE7CisJCX0KKwkJKnBvcyArPSBuYW1lbGVuOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJpbnRfdGFyZ2V0KGNvbnN0IHN0cnVjdCBpcDZ0X3RhcmdldCAqdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZfdCBzdGFydF9vZmZzZXQsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZfdCAqcG9zLCB1bnNpZ25lZCBpbnQgKmNvdW50KQoreworCWlmICh0ID09ICZpcDZ0X3N0YW5kYXJkX3RhcmdldCB8fCB0ID09ICZpcDZ0X2Vycm9yX3RhcmdldCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHByaW50X25hbWUoKGNoYXIgKil0LCBzdGFydF9vZmZzZXQsIGJ1ZmZlciwgbGVuZ3RoLCBwb3MsIGNvdW50KTsKK30KKworc3RhdGljIGludCBpcDZ0X2dldF90YWJsZXMoY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCkKK3sKKwlvZmZfdCBwb3MgPSAwOworCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZpcDZ0X211dGV4KSAhPSAwKQorCQlyZXR1cm4gMDsKKworCUxJU1RfRklORCgmaXA2dF90YWJsZXMsIHByaW50X25hbWUsIGNoYXIgKiwKKwkJICBvZmZzZXQsIGJ1ZmZlciwgbGVuZ3RoLCAmcG9zLCAmY291bnQpOworCisJdXAoJmlwNnRfbXV0ZXgpOworCisJLyogYHN0YXJ0JyBoYWNrIC0gc2VlIGZzL3Byb2MvZ2VuZXJpYy5jIGxpbmUgfjEwNSAqLworCSpzdGFydD0oY2hhciAqKSgodW5zaWduZWQgbG9uZyljb3VudC1vZmZzZXQpOworCXJldHVybiBwb3M7Cit9CisKK3N0YXRpYyBpbnQgaXA2dF9nZXRfdGFyZ2V0cyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoKQoreworCW9mZl90IHBvcyA9IDA7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmlwNnRfbXV0ZXgpICE9IDApCisJCXJldHVybiAwOworCisJTElTVF9GSU5EKCZpcDZ0X3RhcmdldCwgcHJpbnRfdGFyZ2V0LCBzdHJ1Y3QgaXA2dF90YXJnZXQgKiwKKwkJICBvZmZzZXQsIGJ1ZmZlciwgbGVuZ3RoLCAmcG9zLCAmY291bnQpOworCisJdXAoJmlwNnRfbXV0ZXgpOworCisJKnN0YXJ0ID0gKGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpY291bnQgLSBvZmZzZXQpOworCXJldHVybiBwb3M7Cit9CisKK3N0YXRpYyBpbnQgaXA2dF9nZXRfbWF0Y2hlcyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoKQoreworCW9mZl90IHBvcyA9IDA7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmlwNnRfbXV0ZXgpICE9IDApCisJCXJldHVybiAwOworCisJTElTVF9GSU5EKCZpcDZ0X21hdGNoLCBwcmludF9uYW1lLCBjaGFyICosCisJCSAgb2Zmc2V0LCBidWZmZXIsIGxlbmd0aCwgJnBvcywgJmNvdW50KTsKKworCXVwKCZpcDZ0X211dGV4KTsKKworCSpzdGFydCA9IChjaGFyICopKCh1bnNpZ25lZCBsb25nKWNvdW50IC0gb2Zmc2V0KTsKKwlyZXR1cm4gcG9zOworfQorCitzdGF0aWMgc3RydWN0IHsgY2hhciAqbmFtZTsgZ2V0X2luZm9fdCAqZ2V0X2luZm87IH0gaXA2dF9wcm9jX2VudHJ5W10gPQoreyB7ICJpcDZfdGFibGVzX25hbWVzIiwgaXA2dF9nZXRfdGFibGVzIH0sCisgIHsgImlwNl90YWJsZXNfdGFyZ2V0cyIsIGlwNnRfZ2V0X3RhcmdldHMgfSwKKyAgeyAiaXA2X3RhYmxlc19tYXRjaGVzIiwgaXA2dF9nZXRfbWF0Y2hlcyB9LAorICB7IE5VTEwsIE5VTEx9IH07CisjZW5kaWYgLypDT05GSUdfUFJPQ19GUyovCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJLyogTm9vbmUgZWxzZSB3aWxsIGJlIGRvd25pbmcgc2VtIG5vdywgc28gd2Ugd29uJ3Qgc2xlZXAgKi8KKwlkb3duKCZpcDZ0X211dGV4KTsKKwlsaXN0X2FwcGVuZCgmaXA2dF90YXJnZXQsICZpcDZ0X3N0YW5kYXJkX3RhcmdldCk7CisJbGlzdF9hcHBlbmQoJmlwNnRfdGFyZ2V0LCAmaXA2dF9lcnJvcl90YXJnZXQpOworCWxpc3RfYXBwZW5kKCZpcDZ0X21hdGNoLCAmdGNwX21hdGNoc3RydWN0KTsKKwlsaXN0X2FwcGVuZCgmaXA2dF9tYXRjaCwgJnVkcF9tYXRjaHN0cnVjdCk7CisJbGlzdF9hcHBlbmQoJmlwNnRfbWF0Y2gsICZpY21wNl9tYXRjaHN0cnVjdCk7CisJdXAoJmlwNnRfbXV0ZXgpOworCisJLyogUmVnaXN0ZXIgc2V0c29ja29wdCAqLworCXJldCA9IG5mX3JlZ2lzdGVyX3NvY2tvcHQoJmlwNnRfc29ja29wdHMpOworCWlmIChyZXQgPCAwKSB7CisJCWR1cHJpbnRmKCJVbmFibGUgdG8gcmVnaXN0ZXIgc29ja29wdHMuXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXsKKwkJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jOworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpcDZ0X3Byb2NfZW50cnlbaV0ubmFtZTsgaSsrKSB7CisJCQlwcm9jID0gcHJvY19uZXRfY3JlYXRlKGlwNnRfcHJvY19lbnRyeVtpXS5uYW1lLCAwLAorCQkJCQkgICAgICAgaXA2dF9wcm9jX2VudHJ5W2ldLmdldF9pbmZvKTsKKwkJCWlmICghcHJvYykgeworCQkJCXdoaWxlICgtLWkgPj0gMCkKKwkJCQkgICAgICAgcHJvY19uZXRfcmVtb3ZlKGlwNnRfcHJvY19lbnRyeVtpXS5uYW1lKTsKKwkJCQluZl91bnJlZ2lzdGVyX3NvY2tvcHQoJmlwNnRfc29ja29wdHMpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJcHJvYy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwkJfQorCX0KKyNlbmRpZgorCisJcHJpbnRrKCJpcDZfdGFibGVzOiAoQykgMjAwMC0yMDAyIE5ldGZpbHRlciBjb3JlIHRlYW1cbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCW5mX3VucmVnaXN0ZXJfc29ja29wdCgmaXA2dF9zb2Nrb3B0cyk7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwl7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpcDZ0X3Byb2NfZW50cnlbaV0ubmFtZTsgaSsrKQorCQkJcHJvY19uZXRfcmVtb3ZlKGlwNnRfcHJvY19lbnRyeVtpXS5uYW1lKTsKKwl9CisjZW5kaWYKK30KKworRVhQT1JUX1NZTUJPTChpcDZ0X3JlZ2lzdGVyX3RhYmxlKTsKK0VYUE9SVF9TWU1CT0woaXA2dF91bnJlZ2lzdGVyX3RhYmxlKTsKK0VYUE9SVF9TWU1CT0woaXA2dF9kb190YWJsZSk7CitFWFBPUlRfU1lNQk9MKGlwNnRfcmVnaXN0ZXJfbWF0Y2gpOworRVhQT1JUX1NZTUJPTChpcDZ0X3VucmVnaXN0ZXJfbWF0Y2gpOworRVhQT1JUX1NZTUJPTChpcDZ0X3JlZ2lzdGVyX3RhcmdldCk7CitFWFBPUlRfU1lNQk9MKGlwNnRfdW5yZWdpc3Rlcl90YXJnZXQpOworRVhQT1JUX1NZTUJPTChpcDZ0X2V4dF9oZHIpOworCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfTE9HLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9MT0cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmMzZDAxCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfTE9HLmMKQEAgLTAsMCArMSw1MDkgQEAKKy8qCisgKiBUaGlzIGlzIGEgbW9kdWxlIHdoaWNoIGlzIHVzZWQgZm9yIGxvZ2dpbmcgcGFja2V0cy4KKyAqLworCisvKiAoQykgMjAwMSBKYW4gUmVrb3JhanNraSA8YmFnZ2luc0BwbGQub3JnLnBsPgorICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ljbXB2Ni5oPgorI2luY2x1ZGUgPG5ldC91ZHAuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CisKK01PRFVMRV9BVVRIT1IoIkphbiBSZWtvcmFqc2tpIDxiYWdnaW5zQHBsZC5vcmcucGw+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklQNiB0YWJsZXMgTE9HIHRhcmdldCBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBuZmxvZyA9IDE7Cittb2R1bGVfcGFyYW0obmZsb2csIGludCwgMDQwMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5mbG9nLCAicmVnaXN0ZXIgYXMgaW50ZXJuYWwgbmV0ZmlsdGVyIGxvZ2dpbmcgbW9kdWxlIik7CisgCitzdHJ1Y3QgaW5fZGV2aWNlOworI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfTE9HLmg+CisKKyNpZiAwCisjZGVmaW5lIERFQlVHUCBwcmludGsKKyNlbHNlCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworLyogVXNlIGxvY2sgdG8gc2VyaWFsaXplLCBzbyBwcmludGtzIGRvbid0IG92ZXJsYXAgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9nX2xvY2spOworCisvKiBPbmUgbGV2ZWwgb2YgcmVjdXJzaW9uIHdvbid0IGtpbGwgdXMgKi8KK3N0YXRpYyB2b2lkIGR1bXBfcGFja2V0KGNvbnN0IHN0cnVjdCBpcDZ0X2xvZ19pbmZvICppbmZvLAorCQkJY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGlwNmhvZmYsCisJCQlpbnQgcmVjdXJzZSkKK3sKKwl1X2ludDhfdCBjdXJyZW50aGRyOworCWludCBmcmFnbWVudDsKKwlzdHJ1Y3QgaXB2NmhkciBfaXA2aCwgKmloOworCXVuc2lnbmVkIGludCBwdHI7CisJdW5zaWduZWQgaW50IGhkcmxlbiA9IDA7CisKKwlpaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlwNmhvZmYsIHNpemVvZihfaXA2aCksICZfaXA2aCk7CisJaWYgKGloID09IE5VTEwpIHsKKwkJcHJpbnRrKCJUUlVOQ0FURUQiKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE1heCBsZW5ndGg6IDg4ICJTUkM9MDAwMC4wMDAwLjAwMDAuMDAwMC4wMDAwLjAwMDAuMDAwMC4wMDAwIERTVD0wMDAwLjAwMDAuMDAwMC4wMDAwLjAwMDAuMDAwMC4wMDAwLjAwMDAiICovCisJcHJpbnRrKCJTUkM9JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4ICIsIE5JUDYoaWgtPnNhZGRyKSk7CisJcHJpbnRrKCJEU1Q9JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4ICIsIE5JUDYoaWgtPmRhZGRyKSk7CisKKwkvKiBNYXggbGVuZ3RoOiA0NCAiTEVOPTY1NTM1IFRDPTI1NSBIT1BMSU1JVD0yNTUgRkxPV0xCTD1GRkZGRiAiICovCisJcHJpbnRrKCJMRU49JVp1IFRDPSV1IEhPUExJTUlUPSV1IEZMT1dMQkw9JXUgIiwKKwkgICAgICAgbnRvaHMoaWgtPnBheWxvYWRfbGVuKSArIHNpemVvZihzdHJ1Y3QgaXB2NmhkciksCisJICAgICAgIChudG9obCgqKHVfaW50MzJfdCAqKWloKSAmIDB4MGZmMDAwMDApID4+IDIwLAorCSAgICAgICBpaC0+aG9wX2xpbWl0LAorCSAgICAgICAobnRvaGwoKih1X2ludDMyX3QgKilpaCkgJiAweDAwMGZmZmZmKSk7CisKKwlmcmFnbWVudCA9IDA7CisJcHRyID0gaXA2aG9mZiArIHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisJY3VycmVudGhkciA9IGloLT5uZXh0aGRyOworCXdoaWxlIChjdXJyZW50aGRyICE9IE5FWFRIRFJfTk9ORSAmJiBpcDZ0X2V4dF9oZHIoY3VycmVudGhkcikpIHsKKwkJc3RydWN0IGlwdjZfb3B0X2hkciBfaGRyLCAqaHA7CisKKwkJaHAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwdHIsIHNpemVvZihfaGRyKSwgJl9oZHIpOworCQlpZiAoaHAgPT0gTlVMTCkgeworCQkJcHJpbnRrKCJUUlVOQ0FURUQiKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIE1heCBsZW5ndGg6IDQ4ICJPUFQgKC4uLikgIiAqLworCQlpZiAoaW5mby0+bG9nZmxhZ3MgJiBJUDZUX0xPR19JUE9QVCkKKwkJCXByaW50aygiT1BUICggIik7CisKKwkJc3dpdGNoIChjdXJyZW50aGRyKSB7CisJCWNhc2UgSVBQUk9UT19GUkFHTUVOVDogeworCQkJc3RydWN0IGZyYWdfaGRyIF9maGRyLCAqZmg7CisKKwkJCXByaW50aygiRlJBRzoiKTsKKwkJCWZoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHRyLCBzaXplb2YoX2ZoZHIpLAorCQkJCQkJJl9maGRyKTsKKwkJCWlmIChmaCA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKCJUUlVOQ0FURUQgIik7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQkvKiBNYXggbGVuZ3RoOiA2ICI2NTUzNSAiICovCisJCQlwcmludGsoIiV1ICIsIG50b2hzKGZoLT5mcmFnX29mZikgJiAweEZGRjgpOworCisJCQkvKiBNYXggbGVuZ3RoOiAxMSAiSU5DT01QTEVURSAiICovCisJCQlpZiAoZmgtPmZyYWdfb2ZmICYgaHRvbnMoMHgwMDAxKSkKKwkJCQlwcmludGsoIklOQ09NUExFVEUgIik7CisKKwkJCXByaW50aygiSUQ6JTA4eCAiLCBudG9obChmaC0+aWRlbnRpZmljYXRpb24pKTsKKworCQkJaWYgKG50b2hzKGZoLT5mcmFnX29mZikgJiAweEZGRjgpCisJCQkJZnJhZ21lbnQgPSAxOworCisJCQloZHJsZW4gPSA4OworCisJCQlicmVhazsKKwkJfQorCQljYXNlIElQUFJPVE9fRFNUT1BUUzoKKwkJY2FzZSBJUFBST1RPX1JPVVRJTkc6CisJCWNhc2UgSVBQUk9UT19IT1BPUFRTOgorCQkJaWYgKGZyYWdtZW50KSB7CisJCQkJaWYgKGluZm8tPmxvZ2ZsYWdzICYgSVA2VF9MT0dfSVBPUFQpCisJCQkJCXByaW50aygiKSIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWhkcmxlbiA9IGlwdjZfb3B0bGVuKGhwKTsKKwkJCWJyZWFrOworCQkvKiBNYXggTGVuZ3RoICovCisJCWNhc2UgSVBQUk9UT19BSDoKKwkJCWlmIChpbmZvLT5sb2dmbGFncyAmIElQNlRfTE9HX0lQT1BUKSB7CisJCQkJc3RydWN0IGlwX2F1dGhfaGRyIF9haGRyLCAqYWg7CisKKwkJCQkvKiBNYXggbGVuZ3RoOiAzICJBSCAiICovCisJCQkJcHJpbnRrKCJBSCAiKTsKKworCQkJCWlmIChmcmFnbWVudCkgeworCQkJCQlwcmludGsoIikiKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCWFoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHRyLCBzaXplb2YoX2FoZHIpLAorCQkJCQkJCSZfYWhkcik7CisJCQkJaWYgKGFoID09IE5VTEwpIHsKKwkJCQkJLyoKKwkJCQkJICogTWF4IGxlbmd0aDogMjYgIklOQ09NUExFVEUgWzY1NTM1IAkKKwkJCQkJICogIGJ5dGVzXSApIgorCQkJCQkgKi8KKwkJCQkJcHJpbnRrKCJJTkNPTVBMRVRFIFsldSBieXRlc10gKSIsCisJCQkJCSAgICAgICBza2ItPmxlbiAtIHB0cik7CisJCQkJCXJldHVybjsKKwkJCQl9CisKKwkJCQkvKiBMZW5ndGg6IDE1ICJTUEk9MHhGMTIzNDU2NyAqLworCQkJCXByaW50aygiU1BJPTB4JXggIiwgbnRvaGwoYWgtPnNwaSkpOworCisJCQl9CisKKwkJCWhkcmxlbiA9IChocC0+aGRybGVuKzIpPDwyOworCQkJYnJlYWs7CisJCWNhc2UgSVBQUk9UT19FU1A6CisJCQlpZiAoaW5mby0+bG9nZmxhZ3MgJiBJUDZUX0xPR19JUE9QVCkgeworCQkJCXN0cnVjdCBpcF9lc3BfaGRyIF9lc3BoLCAqZWg7CisKKwkJCQkvKiBNYXggbGVuZ3RoOiA0ICJFU1AgIiAqLworCQkJCXByaW50aygiRVNQICIpOworCisJCQkJaWYgKGZyYWdtZW50KSB7CisJCQkJCXByaW50aygiKSIpOworCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBNYXggbGVuZ3RoOiAyNiAiSU5DT01QTEVURSBbNjU1MzUgYnl0ZXNdICkiCisJCQkJICovCisJCQkJZWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwdHIsIHNpemVvZihfZXNwaCksCisJCQkJCQkJJl9lc3BoKTsKKwkJCQlpZiAoZWggPT0gTlVMTCkgeworCQkJCQlwcmludGsoIklOQ09NUExFVEUgWyV1IGJ5dGVzXSApIiwKKwkJCQkJICAgICAgIHNrYi0+bGVuIC0gcHRyKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCS8qIExlbmd0aDogMTYgIlNQST0weEYxMjM0NTY3ICkiICovCisJCQkJcHJpbnRrKCJTUEk9MHgleCApIiwgbnRvaGwoZWgtPnNwaSkgKTsKKworCQkJfQorCQkJcmV0dXJuOworCQlkZWZhdWx0OgorCQkJLyogTWF4IGxlbmd0aDogMjAgIlVua25vd24gRXh0IEhkciAyNTUiICovCisJCQlwcmludGsoIlVua25vd24gRXh0IEhkciAldSIsIGN1cnJlbnRoZHIpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChpbmZvLT5sb2dmbGFncyAmIElQNlRfTE9HX0lQT1BUKQorCQkJcHJpbnRrKCIpICIpOworCisJCWN1cnJlbnRoZHIgPSBocC0+bmV4dGhkcjsKKwkJcHRyICs9IGhkcmxlbjsKKwl9CisKKwlzd2l0Y2ggKGN1cnJlbnRoZHIpIHsKKwljYXNlIElQUFJPVE9fVENQOiB7CisJCXN0cnVjdCB0Y3BoZHIgX3RjcGgsICp0aDsKKworCQkvKiBNYXggbGVuZ3RoOiAxMCAiUFJPVE89VENQICIgKi8KKwkJcHJpbnRrKCJQUk9UTz1UQ1AgIik7CisKKwkJaWYgKGZyYWdtZW50KQorCQkJYnJlYWs7CisKKwkJLyogTWF4IGxlbmd0aDogMjUgIklOQ09NUExFVEUgWzY1NTM1IGJ5dGVzXSAiICovCisJCXRoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHRyLCBzaXplb2YoX3RjcGgpLCAmX3RjcGgpOworCQlpZiAodGggPT0gTlVMTCkgeworCQkJcHJpbnRrKCJJTkNPTVBMRVRFIFsldSBieXRlc10gIiwgc2tiLT5sZW4gLSBwdHIpOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogTWF4IGxlbmd0aDogMjAgIlNQVD02NTUzNSBEUFQ9NjU1MzUgIiAqLworCQlwcmludGsoIlNQVD0ldSBEUFQ9JXUgIiwKKwkJICAgICAgIG50b2hzKHRoLT5zb3VyY2UpLCBudG9ocyh0aC0+ZGVzdCkpOworCQkvKiBNYXggbGVuZ3RoOiAzMCAiU0VRPTQyOTQ5NjcyOTUgQUNLPTQyOTQ5NjcyOTUgIiAqLworCQlpZiAoaW5mby0+bG9nZmxhZ3MgJiBJUDZUX0xPR19UQ1BTRVEpCisJCQlwcmludGsoIlNFUT0ldSBBQ0s9JXUgIiwKKwkJCSAgICAgICBudG9obCh0aC0+c2VxKSwgbnRvaGwodGgtPmFja19zZXEpKTsKKwkJLyogTWF4IGxlbmd0aDogMTMgIldJTkRPVz02NTUzNSAiICovCisJCXByaW50aygiV0lORE9XPSV1ICIsIG50b2hzKHRoLT53aW5kb3cpKTsKKwkJLyogTWF4IGxlbmd0aDogOSAiUkVTPTB4M0MgIiAqLworCQlwcmludGsoIlJFUz0weCUwMnggIiwgKHVfaW50OF90KShudG9obCh0Y3BfZmxhZ193b3JkKHRoKSAmIFRDUF9SRVNFUlZFRF9CSVRTKSA+PiAyMikpOworCQkvKiBNYXggbGVuZ3RoOiAzMiAiQ1dSIEVDRSBVUkcgQUNLIFBTSCBSU1QgU1lOIEZJTiAiICovCisJCWlmICh0aC0+Y3dyKQorCQkJcHJpbnRrKCJDV1IgIik7CisJCWlmICh0aC0+ZWNlKQorCQkJcHJpbnRrKCJFQ0UgIik7CisJCWlmICh0aC0+dXJnKQorCQkJcHJpbnRrKCJVUkcgIik7CisJCWlmICh0aC0+YWNrKQorCQkJcHJpbnRrKCJBQ0sgIik7CisJCWlmICh0aC0+cHNoKQorCQkJcHJpbnRrKCJQU0ggIik7CisJCWlmICh0aC0+cnN0KQorCQkJcHJpbnRrKCJSU1QgIik7CisJCWlmICh0aC0+c3luKQorCQkJcHJpbnRrKCJTWU4gIik7CisJCWlmICh0aC0+ZmluKQorCQkJcHJpbnRrKCJGSU4gIik7CisJCS8qIE1heCBsZW5ndGg6IDExICJVUkdQPTY1NTM1ICIgKi8KKwkJcHJpbnRrKCJVUkdQPSV1ICIsIG50b2hzKHRoLT51cmdfcHRyKSk7CisKKwkJaWYgKChpbmZvLT5sb2dmbGFncyAmIElQNlRfTE9HX1RDUE9QVCkKKwkJICAgICYmIHRoLT5kb2ZmICogNCA+IHNpemVvZihzdHJ1Y3QgdGNwaGRyKSkgeworCQkJdV9pbnQ4X3QgX29wdFs2MCAtIHNpemVvZihzdHJ1Y3QgdGNwaGRyKV0sICpvcDsKKwkJCXVuc2lnbmVkIGludCBpOworCQkJdW5zaWduZWQgaW50IG9wdHNpemUgPSB0aC0+ZG9mZiAqIDQKKwkJCQkJICAgICAgIC0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOworCisJCQlvcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsCisJCQkJCQlwdHIgKyBzaXplb2Yoc3RydWN0IHRjcGhkciksCisJCQkJCQlvcHRzaXplLCBfb3B0KTsKKwkJCWlmIChvcCA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKCJPUFQgKFRSVU5DQVRFRCkiKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8qIE1heCBsZW5ndGg6IDEyNyAiT1BUICgiIDE1KjQqMmNoYXJzICIpICIgKi8KKwkJCXByaW50aygiT1BUICgiKTsKKwkJCWZvciAoaSA9MDsgaSA8IG9wdHNpemU7IGkrKykKKwkJCQlwcmludGsoIiUwMlgiLCBvcFtpXSk7CisJCQlwcmludGsoIikgIik7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgSVBQUk9UT19VRFA6IHsKKwkJc3RydWN0IHVkcGhkciBfdWRwaCwgKnVoOworCisJCS8qIE1heCBsZW5ndGg6IDEwICJQUk9UTz1VRFAgIiAqLworCQlwcmludGsoIlBST1RPPVVEUCAiKTsKKworCQlpZiAoZnJhZ21lbnQpCisJCQlicmVhazsKKworCQkvKiBNYXggbGVuZ3RoOiAyNSAiSU5DT01QTEVURSBbNjU1MzUgYnl0ZXNdICIgKi8KKwkJdWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwdHIsIHNpemVvZihfdWRwaCksICZfdWRwaCk7CisJCWlmICh1aCA9PSBOVUxMKSB7CisJCQlwcmludGsoIklOQ09NUExFVEUgWyV1IGJ5dGVzXSAiLCBza2ItPmxlbiAtIHB0cik7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBNYXggbGVuZ3RoOiAyMCAiU1BUPTY1NTM1IERQVD02NTUzNSAiICovCisJCXByaW50aygiU1BUPSV1IERQVD0ldSBMRU49JXUgIiwKKwkJICAgICAgIG50b2hzKHVoLT5zb3VyY2UpLCBudG9ocyh1aC0+ZGVzdCksCisJCSAgICAgICBudG9ocyh1aC0+bGVuKSk7CisJCWJyZWFrOworCX0KKwljYXNlIElQUFJPVE9fSUNNUFY2OiB7CisJCXN0cnVjdCBpY21wNmhkciBfaWNtcDZoLCAqaWM7CisKKwkJLyogTWF4IGxlbmd0aDogMTMgIlBST1RPPUlDTVB2NiAiICovCisJCXByaW50aygiUFJPVE89SUNNUHY2ICIpOworCisJCWlmIChmcmFnbWVudCkKKwkJCWJyZWFrOworCisJCS8qIE1heCBsZW5ndGg6IDI1ICJJTkNPTVBMRVRFIFs2NTUzNSBieXRlc10gIiAqLworCQlpYyA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHB0ciwgc2l6ZW9mKF9pY21wNmgpLCAmX2ljbXA2aCk7CisJCWlmIChpYyA9PSBOVUxMKSB7CisJCQlwcmludGsoIklOQ09NUExFVEUgWyV1IGJ5dGVzXSAiLCBza2ItPmxlbiAtIHB0cik7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBNYXggbGVuZ3RoOiAxOCAiVFlQRT0yNTUgQ09ERT0yNTUgIiAqLworCQlwcmludGsoIlRZUEU9JXUgQ09ERT0ldSAiLCBpYy0+aWNtcDZfdHlwZSwgaWMtPmljbXA2X2NvZGUpOworCisJCXN3aXRjaCAoaWMtPmljbXA2X3R5cGUpIHsKKwkJY2FzZSBJQ01QVjZfRUNIT19SRVFVRVNUOgorCQljYXNlIElDTVBWNl9FQ0hPX1JFUExZOgorCQkJLyogTWF4IGxlbmd0aDogMTkgIklEPTY1NTM1IFNFUT02NTUzNSAiICovCisJCQlwcmludGsoIklEPSV1IFNFUT0ldSAiLAorCQkJCW50b2hzKGljLT5pY21wNl9pZGVudGlmaWVyKSwKKwkJCQludG9ocyhpYy0+aWNtcDZfc2VxdWVuY2UpKTsKKwkJCWJyZWFrOworCQljYXNlIElDTVBWNl9NR01fUVVFUlk6CisJCWNhc2UgSUNNUFY2X01HTV9SRVBPUlQ6CisJCWNhc2UgSUNNUFY2X01HTV9SRURVQ1RJT046CisJCQlicmVhazsKKworCQljYXNlIElDTVBWNl9QQVJBTVBST0I6CisJCQkvKiBNYXggbGVuZ3RoOiAxNyAiUE9JTlRFUj1mZmZmZmZmZiAiICovCisJCQlwcmludGsoIlBPSU5URVI9JTA4eCAiLCBudG9obChpYy0+aWNtcDZfcG9pbnRlcikpOworCQkJLyogRmFsbCB0aHJvdWdoICovCisJCWNhc2UgSUNNUFY2X0RFU1RfVU5SRUFDSDoKKwkJY2FzZSBJQ01QVjZfUEtUX1RPT0JJRzoKKwkJY2FzZSBJQ01QVjZfVElNRV9FWENFRUQ6CisJCQkvKiBNYXggbGVuZ3RoOiAzK21heGxlbiAqLworCQkJaWYgKHJlY3Vyc2UpIHsKKwkJCQlwcmludGsoIlsiKTsKKwkJCQlkdW1wX3BhY2tldChpbmZvLCBza2IsIHB0ciArIHNpemVvZihfaWNtcDZoKSwKKwkJCQkJICAgIDApOworCQkJCXByaW50aygiXSAiKTsKKwkJCX0KKworCQkJLyogTWF4IGxlbmd0aDogMTAgIk1UVT02NTUzNSAiICovCisJCQlpZiAoaWMtPmljbXA2X3R5cGUgPT0gSUNNUFY2X1BLVF9UT09CSUcpCisJCQkJcHJpbnRrKCJNVFU9JXUgIiwgbnRvaGwoaWMtPmljbXA2X210dSkpOworCQl9CisJCWJyZWFrOworCX0KKwkvKiBNYXggbGVuZ3RoOiAxMCAiUFJPVE89MjU1ICIgKi8KKwlkZWZhdWx0OgorCQlwcmludGsoIlBST1RPPSV1ICIsIGN1cnJlbnRoZHIpOworCX0KKworCS8qIE1heCBsZW5ndGg6IDE1ICJVSUQ9NDI5NDk2NzI5NSAiICovCisJaWYgKChpbmZvLT5sb2dmbGFncyAmIElQNlRfTE9HX1VJRCkgJiYgcmVjdXJzZSAmJiBza2ItPnNrKSB7CisJCXJlYWRfbG9ja19iaCgmc2tiLT5zay0+c2tfY2FsbGJhY2tfbG9jayk7CisJCWlmIChza2ItPnNrLT5za19zb2NrZXQgJiYgc2tiLT5zay0+c2tfc29ja2V0LT5maWxlKQorCQkJcHJpbnRrKCJVSUQ9JXUgIiwgc2tiLT5zay0+c2tfc29ja2V0LT5maWxlLT5mX3VpZCk7CisJCXJlYWRfdW5sb2NrX2JoKCZza2ItPnNrLT5za19jYWxsYmFja19sb2NrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitpcDZ0X2xvZ19wYWNrZXQodW5zaWduZWQgaW50IGhvb2tudW0sCisJCWNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJY29uc3Qgc3RydWN0IGlwNnRfbG9nX2luZm8gKmxvZ2luZm8sCisJCWNvbnN0IGNoYXIgKmxldmVsX3N0cmluZywKKwkJY29uc3QgY2hhciAqcHJlZml4KQoreworCXN0cnVjdCBpcHY2aGRyICppcHY2aCA9IHNrYi0+bmguaXB2Nmg7CisKKwlzcGluX2xvY2tfYmgoJmxvZ19sb2NrKTsKKwlwcmludGsobGV2ZWxfc3RyaW5nKTsKKwlwcmludGsoIiVzSU49JXMgT1VUPSVzICIsCisJCXByZWZpeCA9PSBOVUxMID8gbG9naW5mby0+cHJlZml4IDogcHJlZml4LAorCQlpbiA/IGluLT5uYW1lIDogIiIsCisJCW91dCA/IG91dC0+bmFtZSA6ICIiKTsKKwlpZiAoaW4gJiYgIW91dCkgeworCQkvKiBNQUMgbG9nZ2luZyBmb3IgaW5wdXQgY2hhaW4gb25seS4gKi8KKwkJcHJpbnRrKCJNQUM9Iik7CisJCWlmIChza2ItPmRldiAmJiBza2ItPmRldi0+aGFyZF9oZWFkZXJfbGVuICYmIHNrYi0+bWFjLnJhdyAhPSAodm9pZCopaXB2NmgpIHsKKwkJCWlmIChza2ItPmRldi0+dHlwZSAhPSBBUlBIUkRfU0lUKXsKKwkJCSAgaW50IGk7CisJCQkgIHVuc2lnbmVkIGNoYXIgKnAgPSBza2ItPm1hYy5yYXc7CisJCQkgIGZvciAoaSA9IDA7IGkgPCBza2ItPmRldi0+aGFyZF9oZWFkZXJfbGVuOyBpKysscCsrKQorCQkJCXByaW50aygiJTAyeCVjIiwgKnAsCisJCQkgICAgICAgCQlpPT1za2ItPmRldi0+aGFyZF9oZWFkZXJfbGVuIC0gMQorCQkJICAgICAgIAkJPyAnICc6JzonKTsKKwkJCX0gZWxzZSB7CisJCQkgIGludCBpOworCQkJICB1bnNpZ25lZCBjaGFyICpwID0gc2tiLT5tYWMucmF3OworCQkJICBpZiAoIHAgLSAoRVRIX0FMRU4qMisyKSA+IHNrYi0+aGVhZCApeworCQkJICAgIHAgLT0gKEVUSF9BTEVOKzIpOworCQkJICAgIGZvciAoaSA9IDA7IGkgPCAoRVRIX0FMRU4pOyBpKysscCsrKQorCQkJCXByaW50aygiJTAyeCVzIiwgKnAsCisJCQkJCWkgPT0gRVRIX0FMRU4tMSA/ICItPiIgOiAiOiIpOworCQkJICAgIHAgLT0gKEVUSF9BTEVOKjIpOworCQkJICAgIGZvciAoaSA9IDA7IGkgPCAoRVRIX0FMRU4pOyBpKysscCsrKQorCQkJCXByaW50aygiJTAyeCVjIiwgKnAsCisJCQkJCWkgPT0gRVRIX0FMRU4tMSA/ICcgJyA6ICc6Jyk7CisJCQkgIH0KKwkJCSAgCisJCQkgIGlmICgoc2tiLT5kZXYtPmFkZHJfbGVuID09IDQpICYmCisJCQkgICAgICBza2ItPmRldi0+aGFyZF9oZWFkZXJfbGVuID4gMjApeworCQkJICAgIHByaW50aygiVFVOTkVMPSIpOworCQkJICAgIHAgPSBza2ItPm1hYy5yYXcgKyAxMjsKKwkJCSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrLHArKykKKwkJCQlwcmludGsoIiUzZCVzIiwgKnAsCisJCQkJCWkgPT0gMyA/ICItPiIgOiAiLiIpOworCQkJICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKysscCsrKQorCQkJCXByaW50aygiJTNkJWMiLCAqcCwKKwkJCQkJaSA9PSAzID8gJyAnIDogJy4nKTsKKwkJCSAgfQorCQkJfQorCQl9IGVsc2UKKwkJCXByaW50aygiICIpOworCX0KKworCWR1bXBfcGFja2V0KGxvZ2luZm8sIHNrYiwgKHU4Kilza2ItPm5oLmlwdjZoIC0gc2tiLT5kYXRhLCAxKTsKKwlwcmludGsoIlxuIik7CisJc3Bpbl91bmxvY2tfYmgoJmxvZ19sb2NrKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAoraXA2dF9sb2dfdGFyZ2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQl1bnNpZ25lZCBpbnQgaG9va251bSwKKwkJY29uc3Qgdm9pZCAqdGFyZ2luZm8sCisJCXZvaWQgKnVzZXJpbmZvKQoreworCWNvbnN0IHN0cnVjdCBpcDZ0X2xvZ19pbmZvICpsb2dpbmZvID0gdGFyZ2luZm87CisJY2hhciBsZXZlbF9zdHJpbmdbNF0gPSAiPCA+IjsKKworCWxldmVsX3N0cmluZ1sxXSA9ICcwJyArIChsb2dpbmZvLT5sZXZlbCAlIDgpOworCWlwNnRfbG9nX3BhY2tldChob29rbnVtLCAqcHNrYiwgaW4sIG91dCwgbG9naW5mbywgbGV2ZWxfc3RyaW5nLCBOVUxMKTsKKworCXJldHVybiBJUDZUX0NPTlRJTlVFOworfQorCitzdGF0aWMgdm9pZAoraXA2dF9sb2dmbih1bnNpZ25lZCBpbnQgaG9va251bSwKKwkgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSAgIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgaXA2dF9sb2dfaW5mbyBsb2dpbmZvID0geworCQkubGV2ZWwgPSAwLAorCQkubG9nZmxhZ3MgPSBJUDZUX0xPR19NQVNLLAorCQkucHJlZml4ID0gIiIKKwl9OworCisJaXA2dF9sb2dfcGFja2V0KGhvb2tudW0sIHNrYiwgaW4sIG91dCwgJmxvZ2luZm8sIEtFUk5fV0FSTklORywgcHJlZml4KTsKK30KKworc3RhdGljIGludCBpcDZ0X2xvZ19jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9lbnRyeSAqZSwKKwkJCSAgICAgICB2b2lkICp0YXJnaW5mbywKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IGlwNnRfbG9nX2luZm8gKmxvZ2luZm8gPSB0YXJnaW5mbzsKKworCWlmICh0YXJnaW5mb3NpemUgIT0gSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfbG9nX2luZm8pKSkgeworCQlERUJVR1AoIkxPRzogdGFyZ2luZm9zaXplICV1ICE9ICV1XG4iLAorCQkgICAgICAgdGFyZ2luZm9zaXplLCBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9sb2dfaW5mbykpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGxvZ2luZm8tPmxldmVsID49IDgpIHsKKwkJREVCVUdQKCJMT0c6IGxldmVsICV1ID49IDhcbiIsIGxvZ2luZm8tPmxldmVsKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGxvZ2luZm8tPnByZWZpeFtzaXplb2YobG9naW5mby0+cHJlZml4KS0xXSAhPSAnXDAnKSB7CisJCURFQlVHUCgiTE9HOiBwcmVmaXggdGVybSAlaVxuIiwKKwkJICAgICAgIGxvZ2luZm8tPnByZWZpeFtzaXplb2YobG9naW5mby0+cHJlZml4KS0xXSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGlwNnRfdGFyZ2V0IGlwNnRfbG9nX3JlZyA9IHsKKwkubmFtZSAJCT0gIkxPRyIsCisJLnRhcmdldCAJPSBpcDZ0X2xvZ190YXJnZXQsIAorCS5jaGVja2VudHJ5CT0gaXA2dF9sb2dfY2hlY2tlbnRyeSwgCisJLm1lIAkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpZiAoaXA2dF9yZWdpc3Rlcl90YXJnZXQoJmlwNnRfbG9nX3JlZykpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChuZmxvZykKKwkJbmZfbG9nX3JlZ2lzdGVyKFBGX0lORVQ2LCAmaXA2dF9sb2dmbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlpZiAobmZsb2cpCisJCW5mX2xvZ191bnJlZ2lzdGVyKFBGX0lORVQ2LCAmaXA2dF9sb2dmbik7CisJaXA2dF91bnJlZ2lzdGVyX3RhcmdldCgmaXA2dF9sb2dfcmVnKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X01BUksuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X01BUksuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDljZWIwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfTUFSSy5jCkBAIC0wLDAgKzEsNzggQEAKKy8qIFRoaXMgaXMgYSBtb2R1bGUgd2hpY2ggaXMgdXNlZCBmb3Igc2V0dGluZyB0aGUgTkZNQVJLIGZpZWxkIG9mIGFuIHNrYi4gKi8KKworLyogKEMpIDE5OTktMjAwMSBNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfTUFSSy5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPiIpOworCitzdGF0aWMgdW5zaWduZWQgaW50Cit0YXJnZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgIHVuc2lnbmVkIGludCBob29rbnVtLAorICAgICAgIGNvbnN0IHZvaWQgKnRhcmdpbmZvLAorICAgICAgIHZvaWQgKnVzZXJpbmZvKQoreworCWNvbnN0IHN0cnVjdCBpcDZ0X21hcmtfdGFyZ2V0X2luZm8gKm1hcmtpbmZvID0gdGFyZ2luZm87CisKKwlpZigoKnBza2IpLT5uZm1hcmsgIT0gbWFya2luZm8tPm1hcmspIHsKKwkJKCpwc2tiKS0+bmZtYXJrID0gbWFya2luZm8tPm1hcms7CisJCSgqcHNrYiktPm5mY2FjaGUgfD0gTkZDX0FMVEVSRUQ7CisJfQorCXJldHVybiBJUDZUX0NPTlRJTlVFOworfQorCitzdGF0aWMgaW50CitjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkgICBjb25zdCBzdHJ1Y3QgaXA2dF9lbnRyeSAqZSwKKyAgICAgICAgICAgdm9pZCAqdGFyZ2luZm8sCisgICAgICAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCisgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJaWYgKHRhcmdpbmZvc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9tYXJrX3RhcmdldF9pbmZvKSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTUFSSzogdGFyZ2luZm9zaXplICV1ICE9ICVadVxuIiwKKwkJICAgICAgIHRhcmdpbmZvc2l6ZSwKKwkJICAgICAgIElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X21hcmtfdGFyZ2V0X2luZm8pKSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChzdHJjbXAodGFibGVuYW1lLCAibWFuZ2xlIikgIT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJNQVJLOiBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSBcIm1hbmdsZVwiIHRhYmxlLCBub3QgXCIlc1wiXG4iLCB0YWJsZW5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBpcDZ0X3RhcmdldCBpcDZ0X21hcmtfcmVnCis9IHsgeyBOVUxMLCBOVUxMIH0sICJNQVJLIiwgdGFyZ2V0LCBjaGVja2VudHJ5LCBOVUxMLCBUSElTX01PRFVMRSB9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgInJlZ2lzdGVyaW5nIGlwdjYgbWFyayB0YXJnZXRcbiIpOworCWlmIChpcDZ0X3JlZ2lzdGVyX3RhcmdldCgmaXA2dF9tYXJrX3JlZykpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaXA2dF91bnJlZ2lzdGVyX3RhcmdldCgmaXA2dF9tYXJrX3JlZyk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9haC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfYWguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWI5NGYxCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfYWguYwpAQCAtMCwwICsxLDIwOCBAQAorLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBBSCBwYXJhbWV0ZXJzLiAqLworCisvKiAoQykgMjAwMS0yMDAyIEFuZHJhcyBLaXMtU3phYm8gPGtpc3phQHNjaC5ibWUuaHU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2FoLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVB2NiBBSCBtYXRjaCIpOworTU9EVUxFX0FVVEhPUigiQW5kcmFzIEtpcy1TemFibyA8a2lzemFAc2NoLmJtZS5odT4iKTsKKworI2lmIDAKKyNkZWZpbmUgREVCVUdQIHByaW50aworI2Vsc2UKKyNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCisvKiBSZXR1cm5zIDEgaWYgdGhlIHNwaSBpcyBtYXRjaGVkIGJ5IHRoZSByYW5nZSwgMCBvdGhlcndpc2UgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitzcGlfbWF0Y2godV9pbnQzMl90IG1pbiwgdV9pbnQzMl90IG1heCwgdV9pbnQzMl90IHNwaSwgaW50IGludmVydCkKK3sKKwlpbnQgcj0wOworCURFQlVHUCgiYWggc3BpX21hdGNoOiVjIDB4JXggPD0gMHgleCA8PSAweCV4IixpbnZlcnQ/ICchJzonICcsCisJICAgICAgIG1pbixzcGksbWF4KTsKKwlyID0gKHNwaSA+PSBtaW4gJiYgc3BpIDw9IG1heCkgXiBpbnZlcnQ7CisJREVCVUdQKCIgcmVzdWx0ICVzXG4iLHI/ICJQQVNTXG4iIDogIkZBSUxFRFxuIik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorICAgICAgaW50ICpob3Rkcm9wKQoreworCXN0cnVjdCBpcF9hdXRoX2hkciAqYWggPSBOVUxMLCBfYWg7CisJY29uc3Qgc3RydWN0IGlwNnRfYWggKmFoaW5mbyA9IG1hdGNoaW5mbzsKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKwlpbnQgbGVuOworCXU4IG5leHRoZHI7CisJdW5zaWduZWQgaW50IHB0cjsKKwl1bnNpZ25lZCBpbnQgaGRybGVuID0gMDsKKworCS8qREVCVUdQKCJJUHY2IEFIIGVudGVyZWRcbiIpOyovCisJLyogaWYgKG9wdC0+YXV0aCA9PSAwKSByZXR1cm4gMDsKKwkqIEl0IGRvZXMgbm90IGZpbGxlZCBvbiBvdXRwdXQgKi8KKworCS8qIHR5cGUgb2YgdGhlIDFzdCBleHRoZHIgKi8KKwluZXh0aGRyID0gc2tiLT5uaC5pcHY2aC0+bmV4dGhkcjsKKwkvKiBwb2ludGVyIHRvIHRoZSAxc3QgZXh0aGRyICovCisJcHRyID0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKKwkvKiBhdmFpbGFibGUgbGVuZ3RoICovCisJbGVuID0gc2tiLT5sZW4gLSBwdHI7CisJdGVtcCA9IDA7CisKKwl3aGlsZSAoaXA2dF9leHRfaGRyKG5leHRoZHIpKSB7CisJCXN0cnVjdCBpcHY2X29wdF9oZHIgX2hkciwgKmhwOworCisJCURFQlVHUCgiaXB2Nl9haCBoZWFkZXIgaXRlcmF0aW9uIFxuIik7CisKKwkJLyogSXMgdGhlcmUgZW5vdWdoIHNwYWNlIGZvciB0aGUgbmV4dCBleHQgaGVhZGVyPyAqLworCQlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBpcHY2X29wdF9oZHIpKQorCQkJcmV0dXJuIDA7CisJCS8qIE5vIG1vcmUgZXh0aGRyIC0+IGV2YWx1YXRlICovCisJCWlmIChuZXh0aGRyID09IE5FWFRIRFJfTk9ORSkKKwkJCWJyZWFrOworCQkvKiBFU1AgLT4gZXZhbHVhdGUgKi8KKwkJaWYgKG5leHRoZHIgPT0gTkVYVEhEUl9FU1ApCisJCQlicmVhazsKKworCQlocCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHB0ciwgc2l6ZW9mKF9oZHIpLCAmX2hkcik7CisJCUJVR19PTihocCA9PSBOVUxMKTsKKworCQkvKiBDYWxjdWxhdGUgdGhlIGhlYWRlciBsZW5ndGggKi8KKwkJaWYgKG5leHRoZHIgPT0gTkVYVEhEUl9GUkFHTUVOVCkKKwkJCWhkcmxlbiA9IDg7CisJCWVsc2UgaWYgKG5leHRoZHIgPT0gTkVYVEhEUl9BVVRIKQorCQkJaGRybGVuID0gKGhwLT5oZHJsZW4rMik8PDI7CisJCWVsc2UKKwkJCWhkcmxlbiA9IGlwdjZfb3B0bGVuKGhwKTsKKworCQkvKiBBSCAtPiBldmFsdWF0ZSAqLworCQlpZiAobmV4dGhkciA9PSBORVhUSERSX0FVVEgpIHsKKwkJCXRlbXAgfD0gTUFTS19BSDsKKwkJCWJyZWFrOworCQl9CisKKwkJCisJCS8qIHNldCB0aGUgZmxhZyAqLworCQlzd2l0Y2ggKG5leHRoZHIpIHsKKwkJY2FzZSBORVhUSERSX0hPUDoKKwkJY2FzZSBORVhUSERSX1JPVVRJTkc6CisJCWNhc2UgTkVYVEhEUl9GUkFHTUVOVDoKKwkJY2FzZSBORVhUSERSX0FVVEg6CisJCWNhc2UgTkVYVEhEUl9ERVNUOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlERUJVR1AoImlwdjZfYWggbWF0Y2g6IHVua25vd24gbmV4dGhlYWRlciAldVxuIixuZXh0aGRyKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJbmV4dGhkciA9IGhwLT5uZXh0aGRyOworCQlsZW4gLT0gaGRybGVuOworCQlwdHIgKz0gaGRybGVuOworCQlpZiAocHRyID4gc2tiLT5sZW4pIHsKKwkJCURFQlVHUCgiaXB2Nl9haDogbmV3IHBvaW50ZXIgdG9vIGxhcmdlISBcbiIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBBSCBoZWFkZXIgbm90IGZvdW5kICovCisJaWYgKHRlbXAgIT0gTUFTS19BSCkKKwkJcmV0dXJuIDA7CisKKwlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBpcF9hdXRoX2hkcikpeworCQkqaG90ZHJvcCA9IDE7CisJCXJldHVybiAwOworCX0KKworCWFoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHRyLCBzaXplb2YoX2FoKSwgJl9haCk7CisJQlVHX09OKGFoID09IE5VTEwpOworCisJREVCVUdQKCJJUHY2IEFIIExFTiAldSAldSAiLCBoZHJsZW4sIGFoLT5oZHJsZW4pOworCURFQlVHUCgiUkVTICUwNFggIiwgYWgtPnJlc2VydmVkKTsKKwlERUJVR1AoIlNQSSAldSAlMDhYXG4iLCBudG9obChhaC0+c3BpKSwgbnRvaGwoYWgtPnNwaSkpOworCisJREVCVUdQKCJJUHY2IEFIIHNwaSAlMDJYICIsCisJICAgICAgIChzcGlfbWF0Y2goYWhpbmZvLT5zcGlzWzBdLCBhaGluZm8tPnNwaXNbMV0sCisJICAgICAgICAgICAgICAgICAgbnRvaGwoYWgtPnNwaSksCisJICAgICAgICAgICAgICAgICAgISEoYWhpbmZvLT5pbnZmbGFncyAmIElQNlRfQUhfSU5WX1NQSSkpKSk7CisJREVCVUdQKCJsZW4gJTAyWCAlMDRYICUwMlggIiwKKwkgICAgICAgYWhpbmZvLT5oZHJsZW4sIGhkcmxlbiwKKwkgICAgICAgKCFhaGluZm8tPmhkcmxlbiB8fAorCSAgICAgICAgKGFoaW5mby0+aGRybGVuID09IGhkcmxlbikgXgorCSAgICAgICAgISEoYWhpbmZvLT5pbnZmbGFncyAmIElQNlRfQUhfSU5WX0xFTikpKTsKKwlERUJVR1AoInJlcyAlMDJYICUwNFggJTAyWFxuIiwKKwkgICAgICAgYWhpbmZvLT5oZHJyZXMsIGFoLT5yZXNlcnZlZCwKKwkgICAgICAgIShhaGluZm8tPmhkcnJlcyAmJiBhaC0+cmVzZXJ2ZWQpKTsKKworCXJldHVybiAoYWggIT0gTlVMTCkKKwkgICAgICAgJiYKKwkgICAgICAgKHNwaV9tYXRjaChhaGluZm8tPnNwaXNbMF0sIGFoaW5mby0+c3Bpc1sxXSwKKwkgICAgICAgICAgICAgICAgICBudG9obChhaC0+c3BpKSwKKwkgICAgICAgICAgICAgICAgICAhIShhaGluZm8tPmludmZsYWdzICYgSVA2VF9BSF9JTlZfU1BJKSkpCisJICAgICAgICYmCisJICAgICAgICghYWhpbmZvLT5oZHJsZW4gfHwKKwkgICAgICAgIChhaGluZm8tPmhkcmxlbiA9PSBoZHJsZW4pIF4KKwkgICAgICAgICEhKGFoaW5mby0+aW52ZmxhZ3MgJiBJUDZUX0FIX0lOVl9MRU4pKQorCSAgICAgICAmJgorCSAgICAgICAhKGFoaW5mby0+aGRycmVzICYmIGFoLT5yZXNlcnZlZCk7Cit9CisKKy8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KK3N0YXRpYyBpbnQKK2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorICAgICAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAsCisgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplLAorICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IGlwNnRfYWggKmFoaW5mbyA9IG1hdGNoaW5mbzsKKworCWlmIChtYXRjaGluZm9zaXplICE9IElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X2FoKSkpIHsKKwkJREVCVUdQKCJpcDZ0X2FoOiBtYXRjaHNpemUgJXUgIT0gJXVcbiIsCisJCSAgICAgICBtYXRjaGluZm9zaXplLCBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9haCkpKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChhaGluZm8tPmludmZsYWdzICYgfklQNlRfQUhfSU5WX01BU0spIHsKKwkJREVCVUdQKCJpcDZ0X2FoOiB1bmtub3duIGZsYWdzICVYXG4iLCBhaGluZm8tPmludmZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggYWhfbWF0Y2ggPSB7CisJLm5hbWUJCT0gImFoIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCXJldHVybiBpcDZ0X3JlZ2lzdGVyX21hdGNoKCZhaF9tYXRjaCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwKHZvaWQpCit7CisJaXA2dF91bnJlZ2lzdGVyX21hdGNoKCZhaF9tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoY2xlYW51cCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9kc3QuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2RzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MDkyNWUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9kc3QuYwpAQCAtMCwwICsxLDI5OCBAQAorLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBIb3AtYnktSG9wIGFuZCBEZXN0aW5hdGlvbiBwYXJhbWV0ZXJzLiAqLworCisvKiAoQykgMjAwMS0yMDAyIEFuZHJhcyBLaXMtU3phYm8gPGtpc3phQHNjaC5ibWUuaHU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X29wdHMuaD4KKworI2RlZmluZSBIT1BCWUhPUAkwCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyNpZiBIT1BCWUhPUAorTU9EVUxFX0RFU0NSSVBUSU9OKCJJUHY2IEhiSCBtYXRjaCIpOworI2Vsc2UKK01PRFVMRV9ERVNDUklQVElPTigiSVB2NiBEU1QgbWF0Y2giKTsKKyNlbmRpZgorTU9EVUxFX0FVVEhPUigiQW5kcmFzIEtpcy1TemFibyA8a2lzemFAc2NoLmJtZS5odT4iKTsKKworI2lmIDAKKyNkZWZpbmUgREVCVUdQIHByaW50aworI2Vsc2UKKyNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCisvKgorICogKFR5cGUgJiAweEMwKSA+PiA2CisgKiAJMAktPiBpZ25vcmFibGUKKyAqIAkxCS0+IG11c3QgZHJvcCB0aGUgcGFja2V0CisgKiAJMgktPiBzZW5kIElDTVAgUEFSTSBQUk9CIHJlZ2FyZGxlc3MgYW5kIGRyb3AgcGFja2V0CisgKiAJMwktPiBTZW5kIElDTVAgaWYgbm90IGEgbXVsdGljYXN0IGFkZHJlc3MgYW5kIGRyb3AgcGFja2V0CisgKiAgKFR5cGUgJiAweDIwKSA+PiA1CisgKiAgCTAJLT4gaW52YXJpYW50CisgKiAgCTEJLT4gY2FuIGNoYW5nZSB0aGUgcm91dGluZworICogIChUeXBlICYgMHgxRikgVHlwZQorICogICAgICAwCS0+IFBhZDEgKG9ubHkgMSBieXRlISkKKyAqICAgICAgMQktPiBQYWROIExFTkdUSCBpbmZvICh0b3RhbCBsZW5ndGggPSBsZW5ndGggKyAyKQorICogICAgICBDMCB8IDIJLT4gSlVNQk8gNCB4IHggeCB4ICggeHh4eCA+IDY0ayApCisgKiAgICAgIDUJLT4gUlRBTEVSVCAyIHggeAorICovCisKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorICAgICAgaW50ICpob3Rkcm9wKQoreworICAgICAgIHN0cnVjdCBpcHY2X29wdF9oZHIgX29wdHNoLCAqb2g7CisgICAgICAgY29uc3Qgc3RydWN0IGlwNnRfb3B0cyAqb3B0aW5mbyA9IG1hdGNoaW5mbzsKKyAgICAgICB1bnNpZ25lZCBpbnQgdGVtcDsKKyAgICAgICB1bnNpZ25lZCBpbnQgbGVuOworICAgICAgIHU4IG5leHRoZHI7CisgICAgICAgdW5zaWduZWQgaW50IHB0cjsKKyAgICAgICB1bnNpZ25lZCBpbnQgaGRybGVuID0gMDsKKyAgICAgICB1bnNpZ25lZCBpbnQgcmV0ID0gMDsKKyAgICAgICB1OCBfb3B0dHlwZSwgKnRwID0gTlVMTDsKKyAgICAgICB1OCBfb3B0bGVuLCAqbHAgPSBOVUxMOworICAgICAgIHVuc2lnbmVkIGludCBvcHRsZW47CisgICAgICAgCisgICAgICAgLyogdHlwZSBvZiB0aGUgMXN0IGV4dGhkciAqLworICAgICAgIG5leHRoZHIgPSBza2ItPm5oLmlwdjZoLT5uZXh0aGRyOworICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIDFzdCBleHRoZHIgKi8KKyAgICAgICBwdHIgPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworICAgICAgIC8qIGF2YWlsYWJsZSBsZW5ndGggKi8KKyAgICAgICBsZW4gPSBza2ItPmxlbiAtIHB0cjsKKyAgICAgICB0ZW1wID0gMDsKKworICAgICAgICB3aGlsZSAoaXA2dF9leHRfaGRyKG5leHRoZHIpKSB7CisgICAgICAgICAgICAgICBzdHJ1Y3QgaXB2Nl9vcHRfaGRyIF9oZHIsICpocDsKKworICAgICAgICAgICAgICBERUJVR1AoImlwdjZfb3B0cyBoZWFkZXIgaXRlcmF0aW9uIFxuIik7CisKKyAgICAgICAgICAgICAgLyogSXMgdGhlcmUgZW5vdWdoIHNwYWNlIGZvciB0aGUgbmV4dCBleHQgaGVhZGVyPyAqLworICAgICAgICAgICAgICAgIGlmIChsZW4gPCAoaW50KXNpemVvZihzdHJ1Y3QgaXB2Nl9vcHRfaGRyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAvKiBObyBtb3JlIGV4dGhkciAtPiBldmFsdWF0ZSAqLworICAgICAgICAgICAgICAgIGlmIChuZXh0aGRyID09IE5FWFRIRFJfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgLyogRVNQIC0+IGV2YWx1YXRlICovCisgICAgICAgICAgICAgICAgaWYgKG5leHRoZHIgPT0gTkVYVEhEUl9FU1ApIHsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKwkgICAgICBocCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHB0ciwgc2l6ZW9mKF9oZHIpLCAmX2hkcik7CisJICAgICAgQlVHX09OKGhwID09IE5VTEwpOworCisgICAgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgaGVhZGVyIGxlbmd0aCAqLworICAgICAgICAgICAgICAgIGlmIChuZXh0aGRyID09IE5FWFRIRFJfRlJBR01FTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhkcmxlbiA9IDg7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0aGRyID09IE5FWFRIRFJfQVVUSCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGhkcmxlbiA9IChocC0+aGRybGVuKzIpPDwyOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGhkcmxlbiA9IGlwdjZfb3B0bGVuKGhwKTsKKworICAgICAgICAgICAgICAvKiBPUFRTIC0+IGV2YWx1YXRlICovCisjaWYgSE9QQllIT1AKKyAgICAgICAgICAgICAgICBpZiAobmV4dGhkciA9PSBORVhUSERSX0hPUCkgeworICAgICAgICAgICAgICAgICAgICAgdGVtcCB8PSBNQVNLX0hPUE9QVFM7CisjZWxzZQorICAgICAgICAgICAgICAgIGlmIChuZXh0aGRyID09IE5FWFRIRFJfREVTVCkgeworICAgICAgICAgICAgICAgICAgICAgdGVtcCB8PSBNQVNLX0RTVE9QVFM7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAvKiBzZXQgdGhlIGZsYWcgKi8KKyAgICAgICAgICAgICAgc3dpdGNoIChuZXh0aGRyKXsKKyAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVYVEhEUl9IT1A6CisgICAgICAgICAgICAgICAgICAgICBjYXNlIE5FWFRIRFJfUk9VVElORzoKKyAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVYVEhEUl9GUkFHTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVYVEhEUl9BVVRIOgorICAgICAgICAgICAgICAgICAgICAgY2FzZSBORVhUSERSX0RFU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHUCgiaXB2Nl9vcHRzIG1hdGNoOiB1bmtub3duIG5leHRoZWFkZXIgJXVcbiIsbmV4dGhkcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG5leHRoZHIgPSBocC0+bmV4dGhkcjsKKyAgICAgICAgICAgICAgICBsZW4gLT0gaGRybGVuOworICAgICAgICAgICAgICAgIHB0ciArPSBoZHJsZW47CisJCWlmICggcHRyID4gc2tiLT5sZW4gKSB7CisJCQlERUJVR1AoImlwdjZfb3B0czogbmV3IHBvaW50ZXIgaXMgdG9vIGxhcmdlISBcbiIpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgfQorCisgICAgICAgLyogT1BUSU9OUyBoZWFkZXIgbm90IGZvdW5kICovCisjaWYgSE9QQllIT1AKKyAgICAgICBpZiAoIHRlbXAgIT0gTUFTS19IT1BPUFRTICkgcmV0dXJuIDA7CisjZWxzZQorICAgICAgIGlmICggdGVtcCAhPSBNQVNLX0RTVE9QVFMgKSByZXR1cm4gMDsKKyNlbmRpZgorCisgICAgICAgaWYgKGxlbiA8IChpbnQpc2l6ZW9mKHN0cnVjdCBpcHY2X29wdF9oZHIpKXsKKwkgICAgICAgKmhvdGRyb3AgPSAxOworICAgICAgIAkJcmV0dXJuIDA7CisgICAgICAgfQorCisgICAgICAgaWYgKGxlbiA8IGhkcmxlbil7CisJICAgICAgIC8qIFBhY2tldCBzbWFsbGVyIHRoYW4gaXQncyBsZW5ndGggZmllbGQgKi8KKyAgICAgICAJCXJldHVybiAwOworICAgICAgIH0KKworICAgICAgIG9oID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHRyLCBzaXplb2YoX29wdHNoKSwgJl9vcHRzaCk7CisgICAgICAgQlVHX09OKG9oID09IE5VTEwpOworCisgICAgICAgREVCVUdQKCJJUHY2IE9QVFMgTEVOICV1ICV1ICIsIGhkcmxlbiwgb2gtPmhkcmxlbik7CisKKyAgICAgICBERUJVR1AoImxlbiAlMDJYICUwNFggJTAyWCAiLAorICAgICAgIAkJb3B0aW5mby0+aGRybGVuLCBoZHJsZW4sCisgICAgICAgCQkoIShvcHRpbmZvLT5mbGFncyAmIElQNlRfT1BUU19MRU4pIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG9wdGluZm8tPmhkcmxlbiA9PSBoZHJsZW4pIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICEhKG9wdGluZm8tPmludmZsYWdzICYgSVA2VF9PUFRTX0lOVl9MRU4pKSkpOworCisgICAgICAgcmV0ID0gKG9oICE9IE5VTEwpCisgICAgICAgCQkmJgorCSAgICAgIAkoIShvcHRpbmZvLT5mbGFncyAmIElQNlRfT1BUU19MRU4pIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG9wdGluZm8tPmhkcmxlbiA9PSBoZHJsZW4pIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICEhKG9wdGluZm8tPmludmZsYWdzICYgSVA2VF9PUFRTX0lOVl9MRU4pKSk7CisKKyAgICAgICBwdHIgKz0gMjsKKyAgICAgICBoZHJsZW4gLT0gMjsKKyAgICAgICBpZiAoICEob3B0aW5mby0+ZmxhZ3MgJiBJUDZUX09QVFNfT1BUUykgKXsKKwkgICAgICAgcmV0dXJuIHJldDsKKwl9IGVsc2UgaWYgKG9wdGluZm8tPmZsYWdzICYgSVA2VF9PUFRTX05TVFJJQ1QpIHsKKwkJREVCVUdQKCJOb3Qgc3RyaWN0IC0gbm90IGltcGxlbWVudGVkIik7CisJfSBlbHNlIHsKKwkJREVCVUdQKCJTdHJpY3QgIik7CisJCURFQlVHUCgiIyVkICIsb3B0aW5mby0+b3B0c25yKTsKKwkJZm9yKHRlbXA9MDsgdGVtcDxvcHRpbmZvLT5vcHRzbnI7IHRlbXArKyl7CisJCQkvKiB0eXBlIGZpZWxkIGV4aXN0cyA/ICovCisJCQlpZiAoaGRybGVuIDwgMSkKKwkJCQlicmVhazsKKwkJCXRwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHRyLCBzaXplb2YoX29wdHR5cGUpLAorCQkJCQkJJl9vcHR0eXBlKTsKKwkJCWlmICh0cCA9PSBOVUxMKQorCQkJCWJyZWFrOworCisJCQkvKiBUeXBlIGNoZWNrICovCisJCQlpZiAoKnRwICE9IChvcHRpbmZvLT5vcHRzW3RlbXBdICYgMHhGRjAwKT4+OCl7CisJCQkJREVCVUdQKCJUYmFkICUwMlggJTAyWFxuIiwKKwkJCQkgICAgICAgKnRwLAorCQkJCSAgICAgICAob3B0aW5mby0+b3B0c1t0ZW1wXSAmIDB4RkYwMCk+PjgpOworCQkJCXJldHVybiAwOworCQkJfSBlbHNlIHsKKwkJCQlERUJVR1AoIlRvayAiKTsKKwkJCX0KKwkJCS8qIExlbmd0aCBjaGVjayAqLworCQkJaWYgKCp0cCkgeworCQkJCXUxNiBzcGVjX2xlbjsKKworCQkJCS8qIGxlbmd0aCBmaWVsZCBleGlzdHMgPyAqLworCQkJCWlmIChoZHJsZW4gPCAyKQorCQkJCQlicmVhazsKKwkJCQlscCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHB0ciArIDEsCisJCQkJCQkJc2l6ZW9mKF9vcHRsZW4pLAorCQkJCQkJCSZfb3B0bGVuKTsKKwkJCQlpZiAobHAgPT0gTlVMTCkKKwkJCQkJYnJlYWs7CisJCQkJc3BlY19sZW4gPSBvcHRpbmZvLT5vcHRzW3RlbXBdICYgMHgwMEZGOworCisJCQkJaWYgKHNwZWNfbGVuICE9IDB4MDBGRiAmJiBzcGVjX2xlbiAhPSAqbHApIHsKKwkJCQkJREVCVUdQKCJMYmFkICUwMlggJTA0WFxuIiwgKmxwLAorCQkJCQkgICAgICAgc3BlY19sZW4pOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJREVCVUdQKCJMb2sgIik7CisJCQkJb3B0bGVuID0gKmxwICsgMjsKKwkJCX0gZWxzZSB7CisJCQkJREVCVUdQKCJQYWQxXG4iKTsKKwkJCQlvcHRsZW4gPSAxOworCQkJfQorCisJCQkvKiBTdGVwIHRvIHRoZSBuZXh0ICovCisJCQlERUJVR1AoImxlbiUwNFggXG4iLCBvcHRsZW4pOworCisJCQlpZiAoKHB0ciA+IHNrYi0+bGVuIC0gb3B0bGVuIHx8IGhkcmxlbiA8IG9wdGxlbikgJiYKKwkJCSAgICAodGVtcCA8IG9wdGluZm8tPm9wdHNuciAtIDEpKSB7CisJCQkJREVCVUdQKCJuZXcgcG9pbnRlciBpcyB0b28gbGFyZ2UhIFxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwdHIgKz0gb3B0bGVuOworCQkJaGRybGVuIC09IG9wdGxlbjsKKwkJfQorCQlpZiAodGVtcCA9PSBvcHRpbmZvLT5vcHRzbnIpCisJCQlyZXR1cm4gcmV0OworCQllbHNlIHJldHVybiAwOworCX0KKworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCitzdGF0aWMgaW50CitjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKyAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwLAorICAgICAgICAgIHZvaWQgKm1hdGNoaW5mbywKKyAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hpbmZvc2l6ZSwKKyAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworICAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X29wdHMgKm9wdHNpbmZvID0gbWF0Y2hpbmZvOworCisgICAgICAgaWYgKG1hdGNoaW5mb3NpemUgIT0gSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfb3B0cykpKSB7CisgICAgICAgICAgICAgIERFQlVHUCgiaXA2dF9vcHRzOiBtYXRjaHNpemUgJXUgIT0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmZvc2l6ZSwgSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfb3B0cykpKTsKKyAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgfQorICAgICAgIGlmIChvcHRzaW5mby0+aW52ZmxhZ3MgJiB+SVA2VF9PUFRTX0lOVl9NQVNLKSB7CisgICAgICAgICAgICAgIERFQlVHUCgiaXA2dF9vcHRzOiB1bmtub3duIGZsYWdzICVYXG4iLAorICAgICAgICAgICAgICAgICAgICAgIG9wdHNpbmZvLT5pbnZmbGFncyk7CisgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgIH0KKworICAgICAgIHJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggb3B0c19tYXRjaCA9IHsKKyNpZiBIT1BCWUhPUAorCS5uYW1lCQk9ICJoYmgiLAorI2Vsc2UKKwkubmFtZQkJPSAiZHN0IiwKKyNlbmRpZgorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisgICAgICAgcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJm9wdHNfbWF0Y2gpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cCh2b2lkKQoreworICAgICAgIGlwNnRfdW5yZWdpc3Rlcl9tYXRjaCgmb3B0c19tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoY2xlYW51cCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9lc3AuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2VzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOWRkMjMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9lc3AuYwpAQCAtMCwwICsxLDE4MSBAQAorLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBFU1AgcGFyYW1ldGVycy4gKi8KKy8qIChDKSAyMDAxLTIwMDIgQW5kcmFzIEtpcy1TemFibyA8a2lzemFAc2NoLmJtZS5odT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9lc3AuaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJUHY2IEVTUCBtYXRjaCIpOworTU9EVUxFX0FVVEhPUigiQW5kcmFzIEtpcy1TemFibyA8a2lzemFAc2NoLmJtZS5odT4iKTsKKworI2lmIDAKKyNkZWZpbmUgREVCVUdQIHByaW50aworI2Vsc2UKKyNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCisvKiBSZXR1cm5zIDEgaWYgdGhlIHNwaSBpcyBtYXRjaGVkIGJ5IHRoZSByYW5nZSwgMCBvdGhlcndpc2UgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitzcGlfbWF0Y2godV9pbnQzMl90IG1pbiwgdV9pbnQzMl90IG1heCwgdV9pbnQzMl90IHNwaSwgaW50IGludmVydCkKK3sKKwlpbnQgcj0wOworCURFQlVHUCgiZXNwIHNwaV9tYXRjaDolYyAweCV4IDw9IDB4JXggPD0gMHgleCIsaW52ZXJ0PyAnISc6JyAnLAorCSAgICAgICBtaW4sc3BpLG1heCk7CisJcj0oc3BpID49IG1pbiAmJiBzcGkgPD0gbWF4KSBeIGludmVydDsKKwlERUJVR1AoIiByZXN1bHQgJXNcbiIscj8gIlBBU1NcbiIgOiAiRkFJTEVEXG4iKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludAorbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCisgICAgICBpbnQgKmhvdGRyb3ApCit7CisJc3RydWN0IGlwX2VzcF9oZHIgX2VzcCwgKmVoID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgaXA2dF9lc3AgKmVzcGluZm8gPSBtYXRjaGluZm87CisJdW5zaWduZWQgaW50IHRlbXA7CisJaW50IGxlbjsKKwl1OCBuZXh0aGRyOworCXVuc2lnbmVkIGludCBwdHI7CisKKwkvKiBNYWtlIHN1cmUgdGhpcyBpc24ndCBhbiBldmlsIHBhY2tldCAqLworCS8qREVCVUdQKCJpcHY2X2VzcCBlbnRlcmVkIFxuIik7Ki8KKworCS8qIHR5cGUgb2YgdGhlIDFzdCBleHRoZHIgKi8KKwluZXh0aGRyID0gc2tiLT5uaC5pcHY2aC0+bmV4dGhkcjsKKwkvKiBwb2ludGVyIHRvIHRoZSAxc3QgZXh0aGRyICovCisJcHRyID0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKKwkvKiBhdmFpbGFibGUgbGVuZ3RoICovCisJbGVuID0gc2tiLT5sZW4gLSBwdHI7CisJdGVtcCA9IDA7CisKKwl3aGlsZSAoaXA2dF9leHRfaGRyKG5leHRoZHIpKSB7CisJCXN0cnVjdCBpcHY2X29wdF9oZHIgX2hkciwgKmhwOworCQlpbnQgaGRybGVuOworCisJCURFQlVHUCgiaXB2Nl9lc3AgaGVhZGVyIGl0ZXJhdGlvbiBcbiIpOworCisJCS8qIElzIHRoZXJlIGVub3VnaCBzcGFjZSBmb3IgdGhlIG5leHQgZXh0IGhlYWRlcj8gKi8KKwkJaWYgKGxlbiA8IHNpemVvZihzdHJ1Y3QgaXB2Nl9vcHRfaGRyKSkKKwkJCXJldHVybiAwOworCQkvKiBObyBtb3JlIGV4dGhkciAtPiBldmFsdWF0ZSAqLworCQlpZiAobmV4dGhkciA9PSBORVhUSERSX05PTkUpCisJCQlicmVhazsKKwkJLyogRVNQIC0+IGV2YWx1YXRlICovCisJCWlmIChuZXh0aGRyID09IE5FWFRIRFJfRVNQKSB7CisJCQl0ZW1wIHw9IE1BU0tfRVNQOworCQkJYnJlYWs7CisJCX0KKworCQlocCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHB0ciwgc2l6ZW9mKF9oZHIpLCAmX2hkcik7CisJCUJVR19PTihocCA9PSBOVUxMKTsKKworCQkvKiBDYWxjdWxhdGUgdGhlIGhlYWRlciBsZW5ndGggKi8KKwkJaWYgKG5leHRoZHIgPT0gTkVYVEhEUl9GUkFHTUVOVCkKKwkJCWhkcmxlbiA9IDg7CisJCWVsc2UgaWYgKG5leHRoZHIgPT0gTkVYVEhEUl9BVVRIKQorCQkJaGRybGVuID0gKGhwLT5oZHJsZW4rMik8PDI7CisJCWVsc2UKKwkJCWhkcmxlbiA9IGlwdjZfb3B0bGVuKGhwKTsKKworCQkvKiBzZXQgdGhlIGZsYWcgKi8KKwkJc3dpdGNoIChuZXh0aGRyKSB7CisJCWNhc2UgTkVYVEhEUl9IT1A6CisJCWNhc2UgTkVYVEhEUl9ST1VUSU5HOgorCQljYXNlIE5FWFRIRFJfRlJBR01FTlQ6CisJCWNhc2UgTkVYVEhEUl9BVVRIOgorCQljYXNlIE5FWFRIRFJfREVTVDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJREVCVUdQKCJpcHY2X2VzcCBtYXRjaDogdW5rbm93biBuZXh0aGVhZGVyICV1XG4iLG5leHRoZHIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQluZXh0aGRyID0gaHAtPm5leHRoZHI7CisJCWxlbiAtPSBoZHJsZW47CisJCXB0ciArPSBoZHJsZW47CisJCWlmIChwdHIgPiBza2ItPmxlbikgeworCQkJREVCVUdQKCJpcHY2X2VzcDogbmV3IHBvaW50ZXIgdG9vIGxhcmdlISBcbiIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBFU1AgaGVhZGVyIG5vdCBmb3VuZCAqLworCWlmICh0ZW1wICE9IE1BU0tfRVNQKQorCQlyZXR1cm4gMDsKKworCWlmIChsZW4gPCBzaXplb2Yoc3RydWN0IGlwX2VzcF9oZHIpKSB7CisJCSpob3Rkcm9wID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJZWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwdHIsIHNpemVvZihfZXNwKSwgJl9lc3ApOworCUJVR19PTihlaCA9PSBOVUxMKTsKKworCURFQlVHUCgiSVB2NiBFU1AgU1BJICV1ICUwOFhcbiIsIG50b2hsKGVoLT5zcGkpLCBudG9obChlaC0+c3BpKSk7CisKKwlyZXR1cm4gKGVoICE9IE5VTEwpCisJCSYmIHNwaV9tYXRjaChlc3BpbmZvLT5zcGlzWzBdLCBlc3BpbmZvLT5zcGlzWzFdLAorCQkJICAgICAgbnRvaGwoZWgtPnNwaSksCisJCQkgICAgICAhIShlc3BpbmZvLT5pbnZmbGFncyAmIElQNlRfRVNQX0lOVl9TUEkpKTsKK30KKworLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLworc3RhdGljIGludAorY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCwKKwkgICB2b2lkICptYXRjaGluZm8sCisJICAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCisJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgaXA2dF9lc3AgKmVzcGluZm8gPSBtYXRjaGluZm87CisKKwlpZiAobWF0Y2hpbmZvc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9lc3ApKSkgeworCQlERUJVR1AoImlwNnRfZXNwOiBtYXRjaHNpemUgJXUgIT0gJXVcbiIsCisJCQkgbWF0Y2hpbmZvc2l6ZSwgSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfZXNwKSkpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGVzcGluZm8tPmludmZsYWdzICYgfklQNlRfRVNQX0lOVl9NQVNLKSB7CisJCURFQlVHUCgiaXA2dF9lc3A6IHVua25vd24gZmxhZ3MgJVhcbiIsCisJCQkgZXNwaW5mby0+aW52ZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXA2dF9tYXRjaCBlc3BfbWF0Y2ggPSB7CisJLm5hbWUJCT0gImVzcCIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlyZXR1cm4gaXA2dF9yZWdpc3Rlcl9tYXRjaCgmZXNwX21hdGNoKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXAodm9pZCkKK3sKKwlpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goJmVzcF9tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoY2xlYW51cCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ldWk2NC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZXVpNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTZjMmNiCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZXVpNjQuYwpAQCAtMCwwICsxLDEwMSBAQAorLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBFVUk2NCBhZGRyZXNzIHBhcmFtZXRlcnMuICovCisKKy8qIChDKSAyMDAxLTIwMDIgQW5kcmFzIEtpcy1TemFibyA8a2lzemFAc2NoLmJtZS5odT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJJUHY2IEVVSTY0IGFkZHJlc3MgY2hlY2tpbmcgbWF0Y2giKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkFuZHJhcyBLaXMtU3phYm8gPGtpc3phQHNjaC5ibWUuaHU+Iik7CisKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorICAgICAgaW50ICpob3Rkcm9wKQoreworCisgICAgdW5zaWduZWQgY2hhciBldWk2NFs4XTsKKyAgICBpbnQgaT0wOworCisgICAgIGlmICggIShza2ItPm1hYy5yYXcgPj0gc2tiLT5oZWFkCisgICAgICAgICAgICAgICAgJiYgKHNrYi0+bWFjLnJhdyArIEVUSF9ITEVOKSA8PSBza2ItPmRhdGEpCisgICAgICAgICAgICAgICAgJiYgb2Zmc2V0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpob3Rkcm9wID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAKKyAgICBtZW1zZXQoZXVpNjQsIDAsIHNpemVvZihldWk2NCkpOworCisgICAgaWYgKGV0aF9oZHIoc2tiKS0+aF9wcm90byA9PSBudG9ocyhFVEhfUF9JUFY2KSkgeworICAgICAgaWYgKHNrYi0+bmguaXB2NmgtPnZlcnNpb24gPT0gMHg2KSB7IAorICAgICAgICAgbWVtY3B5KGV1aTY0LCBldGhfaGRyKHNrYiktPmhfc291cmNlLCAzKTsKKyAgICAgICAgIG1lbWNweShldWk2NCArIDUsIGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UgKyAzLCAzKTsKKwkgZXVpNjRbM109MHhmZjsKKwkgZXVpNjRbNF09MHhmZTsKKwkgZXVpNjRbMF0gfD0gMHgwMjsKKworCSBpPTA7CisJIHdoaWxlICgoc2tiLT5uaC5pcHY2aC0+c2FkZHIuczZfYWRkcls4K2ldID09CisJCQkgZXVpNjRbaV0pICYmIChpPDgpKSBpKys7CisKKwkgaWYgKCBpID09IDggKQorCSAJcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lwNnRfZXVpNjRfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJCSAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAsCisJCSAgIHZvaWQgKm1hdGNoaW5mbywKKwkJICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlpZiAoaG9va19tYXNrCisJICAgICYgfigoMSA8PCBORl9JUDZfUFJFX1JPVVRJTkcpIHwgKDEgPDwgTkZfSVA2X0xPQ0FMX0lOKSB8CisJCSgxIDw8IE5GX0lQNl9GT1JXQVJEKSkpIHsKKwkJcHJpbnRrKCJpcDZ0X2V1aTY0OiBvbmx5IHZhbGlkIGZvciBQUkVfUk9VVElORywgTE9DQUxfSU4gb3IgRk9SV0FSRC5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobWF0Y2hzaXplICE9IElQNlRfQUxJR04oc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggZXVpNjRfbWF0Y2ggPSB7CisJLm5hbWUJCT0gImV1aTY0IiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmlwNnRfZXVpNjRfY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJmV1aTY0X21hdGNoKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goJmV1aTY0X21hdGNoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2ZyYWcuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2ZyYWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmZhMzBhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZnJhZy5jCkBAIC0wLDAgKzEsMjI5IEBACisvKiBLZXJuZWwgbW9kdWxlIHRvIG1hdGNoIEZSQUcgcGFyYW1ldGVycy4gKi8KKworLyogKEMpIDIwMDEtMjAwMiBBbmRyYXMgS2lzLVN6YWJvIDxraXN6YUBzY2guYm1lLmh1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9mcmFnLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVB2NiBGUkFHIG1hdGNoIik7CitNT0RVTEVfQVVUSE9SKCJBbmRyYXMgS2lzLVN6YWJvIDxraXN6YUBzY2guYm1lLmh1PiIpOworCisjaWYgMAorI2RlZmluZSBERUJVR1AgcHJpbnRrCisjZWxzZQorI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKy8qIFJldHVybnMgMSBpZiB0aGUgaWQgaXMgbWF0Y2hlZCBieSB0aGUgcmFuZ2UsIDAgb3RoZXJ3aXNlICovCitzdGF0aWMgaW5saW5lIGludAoraWRfbWF0Y2godV9pbnQzMl90IG1pbiwgdV9pbnQzMl90IG1heCwgdV9pbnQzMl90IGlkLCBpbnQgaW52ZXJ0KQoreworICAgICAgIGludCByPTA7CisgICAgICAgREVCVUdQKCJmcmFnIGlkX21hdGNoOiVjIDB4JXggPD0gMHgleCA8PSAweCV4IixpbnZlcnQ/ICchJzonICcsCisgICAgICAgICAgICAgIG1pbixpZCxtYXgpOworICAgICAgIHI9KGlkID49IG1pbiAmJiBpZCA8PSBtYXgpIF4gaW52ZXJ0OworICAgICAgIERFQlVHUCgiIHJlc3VsdCAlc1xuIixyPyAiUEFTUyIgOiAiRkFJTEVEIik7CisgICAgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorICAgICAgaW50ICpob3Rkcm9wKQoreworICAgICAgIHN0cnVjdCBmcmFnX2hkciBfZnJhZywgKmZoID0gTlVMTDsKKyAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9mcmFnICpmcmFnaW5mbyA9IG1hdGNoaW5mbzsKKyAgICAgICB1bnNpZ25lZCBpbnQgdGVtcDsKKyAgICAgICBpbnQgbGVuOworICAgICAgIHU4IG5leHRoZHI7CisgICAgICAgdW5zaWduZWQgaW50IHB0cjsKKyAgICAgICB1bnNpZ25lZCBpbnQgaGRybGVuID0gMDsKKworICAgICAgIC8qIHR5cGUgb2YgdGhlIDFzdCBleHRoZHIgKi8KKyAgICAgICBuZXh0aGRyID0gc2tiLT5uaC5pcHY2aC0+bmV4dGhkcjsKKyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSAxc3QgZXh0aGRyICovCisgICAgICAgcHRyID0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKKyAgICAgICAvKiBhdmFpbGFibGUgbGVuZ3RoICovCisgICAgICAgbGVuID0gc2tiLT5sZW4gLSBwdHI7CisgICAgICAgdGVtcCA9IDA7CisKKyAgICAgICAgd2hpbGUgKGlwNnRfZXh0X2hkcihuZXh0aGRyKSkgeworICAgICAgICAgICAgICAgc3RydWN0IGlwdjZfb3B0X2hkciBfaGRyLCAqaHA7CisKKyAgICAgICAgICAgICAgREVCVUdQKCJpcHY2X2ZyYWcgaGVhZGVyIGl0ZXJhdGlvbiBcbiIpOworCisgICAgICAgICAgICAgIC8qIElzIHRoZXJlIGVub3VnaCBzcGFjZSBmb3IgdGhlIG5leHQgZXh0IGhlYWRlcj8gKi8KKyAgICAgICAgICAgICAgICBpZiAobGVuIDwgKGludClzaXplb2Yoc3RydWN0IGlwdjZfb3B0X2hkcikpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgLyogTm8gbW9yZSBleHRoZHIgLT4gZXZhbHVhdGUgKi8KKyAgICAgICAgICAgICAgICBpZiAobmV4dGhkciA9PSBORVhUSERSX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIC8qIEVTUCAtPiBldmFsdWF0ZSAqLworICAgICAgICAgICAgICAgIGlmIChuZXh0aGRyID09IE5FWFRIRFJfRVNQKSB7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorCisJICAgICAgaHAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwdHIsIHNpemVvZihfaGRyKSwgJl9oZHIpOworCSAgICAgIEJVR19PTihocCA9PSBOVUxMKTsKKworICAgICAgICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIGhlYWRlciBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICBpZiAobmV4dGhkciA9PSBORVhUSERSX0ZSQUdNRU5UKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZHJsZW4gPSA4OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dGhkciA9PSBORVhUSERSX0FVVEgpCisgICAgICAgICAgICAgICAgICAgICAgICBoZHJsZW4gPSAoaHAtPmhkcmxlbisyKTw8MjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBoZHJsZW4gPSBpcHY2X29wdGxlbihocCk7CisKKyAgICAgICAgICAgICAgLyogRlJBRyAtPiBldmFsdWF0ZSAqLworICAgICAgICAgICAgICAgIGlmIChuZXh0aGRyID09IE5FWFRIRFJfRlJBR01FTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgIHRlbXAgfD0gTUFTS19GUkFHTUVOVDsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAvKiBzZXQgdGhlIGZsYWcgKi8KKyAgICAgICAgICAgICAgc3dpdGNoIChuZXh0aGRyKXsKKyAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVYVEhEUl9IT1A6CisgICAgICAgICAgICAgICAgICAgICBjYXNlIE5FWFRIRFJfUk9VVElORzoKKyAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVYVEhEUl9GUkFHTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVYVEhEUl9BVVRIOgorICAgICAgICAgICAgICAgICAgICAgY2FzZSBORVhUSERSX0RFU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHUCgiaXB2Nl9mcmFnIG1hdGNoOiB1bmtub3duIG5leHRoZWFkZXIgJXVcbiIsbmV4dGhkcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG5leHRoZHIgPSBocC0+bmV4dGhkcjsKKyAgICAgICAgICAgICAgICBsZW4gLT0gaGRybGVuOworICAgICAgICAgICAgICAgIHB0ciArPSBoZHJsZW47CisJCWlmICggcHRyID4gc2tiLT5sZW4gKSB7CisJCQlERUJVR1AoImlwdjZfZnJhZzogbmV3IHBvaW50ZXIgdG9vIGxhcmdlISBcbiIpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgfQorCisgICAgICAgLyogRlJBRyBoZWFkZXIgbm90IGZvdW5kICovCisgICAgICAgaWYgKCB0ZW1wICE9IE1BU0tfRlJBR01FTlQgKSByZXR1cm4gMDsKKworICAgICAgIGlmIChsZW4gPCBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKSl7CisJICAgICAgICpob3Rkcm9wID0gMTsKKyAgICAgICAJCXJldHVybiAwOworICAgICAgIH0KKworICAgICAgIGZoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHRyLCBzaXplb2YoX2ZyYWcpLCAmX2ZyYWcpOworICAgICAgIEJVR19PTihmaCA9PSBOVUxMKTsKKworICAgICAgIERFQlVHUCgiSU5GTyAlMDRYICIsIGZoLT5mcmFnX29mZik7CisgICAgICAgREVCVUdQKCJPRkZTRVQgJTA0WCAiLCBudG9ocyhmaC0+ZnJhZ19vZmYpICYgfjB4Nyk7CisgICAgICAgREVCVUdQKCJSRVMgJTAyWCAlMDRYIiwgZmgtPnJlc2VydmVkLCBudG9ocyhmaC0+ZnJhZ19vZmYpICYgMHg2KTsKKyAgICAgICBERUJVR1AoIk1GICUwNFggIiwgZmgtPmZyYWdfb2ZmICYgaHRvbnMoSVA2X01GKSk7CisgICAgICAgREVCVUdQKCJJRCAldSAlMDhYXG4iLCBudG9obChmaC0+aWRlbnRpZmljYXRpb24pLAorCSAgICAgIG50b2hsKGZoLT5pZGVudGlmaWNhdGlvbikpOworCisgICAgICAgREVCVUdQKCJJUHY2IEZSQUcgaWQgJTAyWCAiLAorICAgICAgIAkJKGlkX21hdGNoKGZyYWdpbmZvLT5pZHNbMF0sIGZyYWdpbmZvLT5pZHNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBudG9obChmaC0+aWRlbnRpZmljYXRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgISEoZnJhZ2luZm8tPmludmZsYWdzICYgSVA2VF9GUkFHX0lOVl9JRFMpKSkpOworICAgICAgIERFQlVHUCgicmVzICUwMlggJTAyWCUwNFggJTAyWCAiLCAKKyAgICAgICAJCShmcmFnaW5mby0+ZmxhZ3MgJiBJUDZUX0ZSQUdfUkVTKSwgZmgtPnJlc2VydmVkLAorCQludG9ocyhmaC0+ZnJhZ19vZmYpICYgMHg2LAorICAgICAgIAkJISgoZnJhZ2luZm8tPmZsYWdzICYgSVA2VF9GUkFHX1JFUykKKwkJCSYmIChmaC0+cmVzZXJ2ZWQgfHwgKG50b2hzKGZoLT5mcmFnX29mZikgJiAweDA2KSkpKTsKKyAgICAgICBERUJVR1AoImZpcnN0ICUwMlggJTAyWCAlMDJYICIsIAorICAgICAgIAkJKGZyYWdpbmZvLT5mbGFncyAmIElQNlRfRlJBR19GU1QpLAorCQludG9ocyhmaC0+ZnJhZ19vZmYpICYgfjB4NywKKyAgICAgICAJCSEoKGZyYWdpbmZvLT5mbGFncyAmIElQNlRfRlJBR19GU1QpCisJCQkmJiAobnRvaHMoZmgtPmZyYWdfb2ZmKSAmIH4weDcpKSk7CisgICAgICAgREVCVUdQKCJtZiAlMDJYICUwMlggJTAyWCAiLCAKKyAgICAgICAJCShmcmFnaW5mby0+ZmxhZ3MgJiBJUDZUX0ZSQUdfTUYpLAorCQludG9ocyhmaC0+ZnJhZ19vZmYpICYgSVA2X01GLAorICAgICAgIAkJISgoZnJhZ2luZm8tPmZsYWdzICYgSVA2VF9GUkFHX01GKQorCQkJJiYgISgobnRvaHMoZmgtPmZyYWdfb2ZmKSAmIElQNl9NRikpKSk7CisgICAgICAgREVCVUdQKCJsYXN0ICUwMlggJTAyWCAlMDJYXG4iLCAKKyAgICAgICAJCShmcmFnaW5mby0+ZmxhZ3MgJiBJUDZUX0ZSQUdfTk1GKSwKKwkJbnRvaHMoZmgtPmZyYWdfb2ZmKSAmIElQNl9NRiwKKyAgICAgICAJCSEoKGZyYWdpbmZvLT5mbGFncyAmIElQNlRfRlJBR19OTUYpCisJCQkmJiAobnRvaHMoZmgtPmZyYWdfb2ZmKSAmIElQNl9NRikpKTsKKworICAgICAgIHJldHVybiAoZmggIT0gTlVMTCkKKyAgICAgICAJCSYmCisgICAgICAgCQkoaWRfbWF0Y2goZnJhZ2luZm8tPmlkc1swXSwgZnJhZ2luZm8tPmlkc1sxXSwKKwkJCSAgbnRvaGwoZmgtPmlkZW50aWZpY2F0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICEhKGZyYWdpbmZvLT5pbnZmbGFncyAmIElQNlRfRlJBR19JTlZfSURTKSkpCisJCSYmCisJCSEoKGZyYWdpbmZvLT5mbGFncyAmIElQNlRfRlJBR19SRVMpCisJCQkmJiAoZmgtPnJlc2VydmVkIHx8IChudG9ocyhmaC0+ZnJhZ19vZmYpICYgMHg2KSkpCisJCSYmCisJCSEoKGZyYWdpbmZvLT5mbGFncyAmIElQNlRfRlJBR19GU1QpCisJCQkmJiAobnRvaHMoZmgtPmZyYWdfb2ZmKSAmIH4weDcpKQorCQkmJgorCQkhKChmcmFnaW5mby0+ZmxhZ3MgJiBJUDZUX0ZSQUdfTUYpCisJCQkmJiAhKG50b2hzKGZoLT5mcmFnX29mZikgJiBJUDZfTUYpKQorCQkmJgorCQkhKChmcmFnaW5mby0+ZmxhZ3MgJiBJUDZUX0ZSQUdfTk1GKQorCQkJJiYgKG50b2hzKGZoLT5mcmFnX29mZikgJiBJUDZfTUYpKTsKK30KKworLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLworc3RhdGljIGludAorY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisgICAgICAgICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCwKKyAgICAgICAgICB2b2lkICptYXRjaGluZm8sCisgICAgICAgICAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCisgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKyAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9mcmFnICpmcmFnaW5mbyA9IG1hdGNoaW5mbzsKKworICAgICAgIGlmIChtYXRjaGluZm9zaXplICE9IElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X2ZyYWcpKSkgeworICAgICAgICAgICAgICBERUJVR1AoImlwNnRfZnJhZzogbWF0Y2hzaXplICV1ICE9ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIG1hdGNoaW5mb3NpemUsIElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X2ZyYWcpKSk7CisgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgIH0KKyAgICAgICBpZiAoZnJhZ2luZm8tPmludmZsYWdzICYgfklQNlRfRlJBR19JTlZfTUFTSykgeworICAgICAgICAgICAgICBERUJVR1AoImlwNnRfZnJhZzogdW5rbm93biBmbGFncyAlWFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBmcmFnaW5mby0+aW52ZmxhZ3MpOworICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICB9CisKKyAgICAgICByZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBpcDZ0X21hdGNoIGZyYWdfbWF0Y2ggPSB7CisJLm5hbWUJCT0gImZyYWciLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisgICAgICAgcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJmZyYWdfbWF0Y2gpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cCh2b2lkKQoreworICAgICAgIGlwNnRfdW5yZWdpc3Rlcl9tYXRjaCgmZnJhZ19tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoY2xlYW51cCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9oYmguYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hiaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZjM2NTAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9oYmguYwpAQCAtMCwwICsxLDI5OCBAQAorLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBIb3AtYnktSG9wIGFuZCBEZXN0aW5hdGlvbiBwYXJhbWV0ZXJzLiAqLworCisvKiAoQykgMjAwMS0yMDAyIEFuZHJhcyBLaXMtU3phYm8gPGtpc3phQHNjaC5ibWUuaHU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X29wdHMuaD4KKworI2RlZmluZSBIT1BCWUhPUAkxCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyNpZiBIT1BCWUhPUAorTU9EVUxFX0RFU0NSSVBUSU9OKCJJUHY2IEhiSCBtYXRjaCIpOworI2Vsc2UKK01PRFVMRV9ERVNDUklQVElPTigiSVB2NiBEU1QgbWF0Y2giKTsKKyNlbmRpZgorTU9EVUxFX0FVVEhPUigiQW5kcmFzIEtpcy1TemFibyA8a2lzemFAc2NoLmJtZS5odT4iKTsKKworI2lmIDAKKyNkZWZpbmUgREVCVUdQIHByaW50aworI2Vsc2UKKyNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCisvKgorICogKFR5cGUgJiAweEMwKSA+PiA2CisgKiAJMAktPiBpZ25vcmFibGUKKyAqIAkxCS0+IG11c3QgZHJvcCB0aGUgcGFja2V0CisgKiAJMgktPiBzZW5kIElDTVAgUEFSTSBQUk9CIHJlZ2FyZGxlc3MgYW5kIGRyb3AgcGFja2V0CisgKiAJMwktPiBTZW5kIElDTVAgaWYgbm90IGEgbXVsdGljYXN0IGFkZHJlc3MgYW5kIGRyb3AgcGFja2V0CisgKiAgKFR5cGUgJiAweDIwKSA+PiA1CisgKiAgCTAJLT4gaW52YXJpYW50CisgKiAgCTEJLT4gY2FuIGNoYW5nZSB0aGUgcm91dGluZworICogIChUeXBlICYgMHgxRikgVHlwZQorICogICAgICAwCS0+IFBhZDEgKG9ubHkgMSBieXRlISkKKyAqICAgICAgMQktPiBQYWROIExFTkdUSCBpbmZvICh0b3RhbCBsZW5ndGggPSBsZW5ndGggKyAyKQorICogICAgICBDMCB8IDIJLT4gSlVNQk8gNCB4IHggeCB4ICggeHh4eCA+IDY0ayApCisgKiAgICAgIDUJLT4gUlRBTEVSVCAyIHggeAorICovCisKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorICAgICAgaW50ICpob3Rkcm9wKQoreworICAgICAgIHN0cnVjdCBpcHY2X29wdF9oZHIgX29wdHNoLCAqb2g7CisgICAgICAgY29uc3Qgc3RydWN0IGlwNnRfb3B0cyAqb3B0aW5mbyA9IG1hdGNoaW5mbzsKKyAgICAgICB1bnNpZ25lZCBpbnQgdGVtcDsKKyAgICAgICB1bnNpZ25lZCBpbnQgbGVuOworICAgICAgIHU4IG5leHRoZHI7CisgICAgICAgdW5zaWduZWQgaW50IHB0cjsKKyAgICAgICB1bnNpZ25lZCBpbnQgaGRybGVuID0gMDsKKyAgICAgICB1bnNpZ25lZCBpbnQgcmV0ID0gMDsKKyAgICAgICB1OCBfb3B0dHlwZSwgKnRwID0gTlVMTDsKKyAgICAgICB1OCBfb3B0bGVuLCAqbHAgPSBOVUxMOworICAgICAgIHVuc2lnbmVkIGludCBvcHRsZW47CisgICAgICAgCisgICAgICAgLyogdHlwZSBvZiB0aGUgMXN0IGV4dGhkciAqLworICAgICAgIG5leHRoZHIgPSBza2ItPm5oLmlwdjZoLT5uZXh0aGRyOworICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIDFzdCBleHRoZHIgKi8KKyAgICAgICBwdHIgPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworICAgICAgIC8qIGF2YWlsYWJsZSBsZW5ndGggKi8KKyAgICAgICBsZW4gPSBza2ItPmxlbiAtIHB0cjsKKyAgICAgICB0ZW1wID0gMDsKKworICAgICAgICB3aGlsZSAoaXA2dF9leHRfaGRyKG5leHRoZHIpKSB7CisgICAgICAgICAgICAgICBzdHJ1Y3QgaXB2Nl9vcHRfaGRyIF9oZHIsICpocDsKKworICAgICAgICAgICAgICBERUJVR1AoImlwdjZfb3B0cyBoZWFkZXIgaXRlcmF0aW9uIFxuIik7CisKKyAgICAgICAgICAgICAgLyogSXMgdGhlcmUgZW5vdWdoIHNwYWNlIGZvciB0aGUgbmV4dCBleHQgaGVhZGVyPyAqLworICAgICAgICAgICAgICAgIGlmIChsZW4gPCAoaW50KXNpemVvZihzdHJ1Y3QgaXB2Nl9vcHRfaGRyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAvKiBObyBtb3JlIGV4dGhkciAtPiBldmFsdWF0ZSAqLworICAgICAgICAgICAgICAgIGlmIChuZXh0aGRyID09IE5FWFRIRFJfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgLyogRVNQIC0+IGV2YWx1YXRlICovCisgICAgICAgICAgICAgICAgaWYgKG5leHRoZHIgPT0gTkVYVEhEUl9FU1ApIHsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKwkgICAgICBocCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHB0ciwgc2l6ZW9mKF9oZHIpLCAmX2hkcik7CisJICAgICAgQlVHX09OKGhwID09IE5VTEwpOworCisgICAgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgaGVhZGVyIGxlbmd0aCAqLworICAgICAgICAgICAgICAgIGlmIChuZXh0aGRyID09IE5FWFRIRFJfRlJBR01FTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhkcmxlbiA9IDg7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0aGRyID09IE5FWFRIRFJfQVVUSCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGhkcmxlbiA9IChocC0+aGRybGVuKzIpPDwyOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGhkcmxlbiA9IGlwdjZfb3B0bGVuKGhwKTsKKworICAgICAgICAgICAgICAvKiBPUFRTIC0+IGV2YWx1YXRlICovCisjaWYgSE9QQllIT1AKKyAgICAgICAgICAgICAgICBpZiAobmV4dGhkciA9PSBORVhUSERSX0hPUCkgeworICAgICAgICAgICAgICAgICAgICAgdGVtcCB8PSBNQVNLX0hPUE9QVFM7CisjZWxzZQorICAgICAgICAgICAgICAgIGlmIChuZXh0aGRyID09IE5FWFRIRFJfREVTVCkgeworICAgICAgICAgICAgICAgICAgICAgdGVtcCB8PSBNQVNLX0RTVE9QVFM7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAvKiBzZXQgdGhlIGZsYWcgKi8KKyAgICAgICAgICAgICAgc3dpdGNoIChuZXh0aGRyKXsKKyAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVYVEhEUl9IT1A6CisgICAgICAgICAgICAgICAgICAgICBjYXNlIE5FWFRIRFJfUk9VVElORzoKKyAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVYVEhEUl9GUkFHTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVYVEhEUl9BVVRIOgorICAgICAgICAgICAgICAgICAgICAgY2FzZSBORVhUSERSX0RFU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHUCgiaXB2Nl9vcHRzIG1hdGNoOiB1bmtub3duIG5leHRoZWFkZXIgJXVcbiIsbmV4dGhkcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG5leHRoZHIgPSBocC0+bmV4dGhkcjsKKyAgICAgICAgICAgICAgICBsZW4gLT0gaGRybGVuOworICAgICAgICAgICAgICAgIHB0ciArPSBoZHJsZW47CisJCWlmICggcHRyID4gc2tiLT5sZW4gKSB7CisJCQlERUJVR1AoImlwdjZfb3B0czogbmV3IHBvaW50ZXIgaXMgdG9vIGxhcmdlISBcbiIpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgfQorCisgICAgICAgLyogT1BUSU9OUyBoZWFkZXIgbm90IGZvdW5kICovCisjaWYgSE9QQllIT1AKKyAgICAgICBpZiAoIHRlbXAgIT0gTUFTS19IT1BPUFRTICkgcmV0dXJuIDA7CisjZWxzZQorICAgICAgIGlmICggdGVtcCAhPSBNQVNLX0RTVE9QVFMgKSByZXR1cm4gMDsKKyNlbmRpZgorCisgICAgICAgaWYgKGxlbiA8IChpbnQpc2l6ZW9mKHN0cnVjdCBpcHY2X29wdF9oZHIpKXsKKwkgICAgICAgKmhvdGRyb3AgPSAxOworICAgICAgIAkJcmV0dXJuIDA7CisgICAgICAgfQorCisgICAgICAgaWYgKGxlbiA8IGhkcmxlbil7CisJICAgICAgIC8qIFBhY2tldCBzbWFsbGVyIHRoYW4gaXQncyBsZW5ndGggZmllbGQgKi8KKyAgICAgICAJCXJldHVybiAwOworICAgICAgIH0KKworICAgICAgIG9oID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHRyLCBzaXplb2YoX29wdHNoKSwgJl9vcHRzaCk7CisgICAgICAgQlVHX09OKG9oID09IE5VTEwpOworCisgICAgICAgREVCVUdQKCJJUHY2IE9QVFMgTEVOICV1ICV1ICIsIGhkcmxlbiwgb2gtPmhkcmxlbik7CisKKyAgICAgICBERUJVR1AoImxlbiAlMDJYICUwNFggJTAyWCAiLAorICAgICAgIAkJb3B0aW5mby0+aGRybGVuLCBoZHJsZW4sCisgICAgICAgCQkoIShvcHRpbmZvLT5mbGFncyAmIElQNlRfT1BUU19MRU4pIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG9wdGluZm8tPmhkcmxlbiA9PSBoZHJsZW4pIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICEhKG9wdGluZm8tPmludmZsYWdzICYgSVA2VF9PUFRTX0lOVl9MRU4pKSkpOworCisgICAgICAgcmV0ID0gKG9oICE9IE5VTEwpCisgICAgICAgCQkmJgorCSAgICAgIAkoIShvcHRpbmZvLT5mbGFncyAmIElQNlRfT1BUU19MRU4pIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG9wdGluZm8tPmhkcmxlbiA9PSBoZHJsZW4pIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICEhKG9wdGluZm8tPmludmZsYWdzICYgSVA2VF9PUFRTX0lOVl9MRU4pKSk7CisKKyAgICAgICBwdHIgKz0gMjsKKyAgICAgICBoZHJsZW4gLT0gMjsKKyAgICAgICBpZiAoICEob3B0aW5mby0+ZmxhZ3MgJiBJUDZUX09QVFNfT1BUUykgKXsKKwkgICAgICAgcmV0dXJuIHJldDsKKwl9IGVsc2UgaWYgKG9wdGluZm8tPmZsYWdzICYgSVA2VF9PUFRTX05TVFJJQ1QpIHsKKwkJREVCVUdQKCJOb3Qgc3RyaWN0IC0gbm90IGltcGxlbWVudGVkIik7CisJfSBlbHNlIHsKKwkJREVCVUdQKCJTdHJpY3QgIik7CisJCURFQlVHUCgiIyVkICIsb3B0aW5mby0+b3B0c25yKTsKKwkJZm9yKHRlbXA9MDsgdGVtcDxvcHRpbmZvLT5vcHRzbnI7IHRlbXArKyl7CisJCQkvKiB0eXBlIGZpZWxkIGV4aXN0cyA/ICovCisJCQlpZiAoaGRybGVuIDwgMSkKKwkJCQlicmVhazsKKwkJCXRwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHRyLCBzaXplb2YoX29wdHR5cGUpLAorCQkJCQkJJl9vcHR0eXBlKTsKKwkJCWlmICh0cCA9PSBOVUxMKQorCQkJCWJyZWFrOworCisJCQkvKiBUeXBlIGNoZWNrICovCisJCQlpZiAoKnRwICE9IChvcHRpbmZvLT5vcHRzW3RlbXBdICYgMHhGRjAwKT4+OCl7CisJCQkJREVCVUdQKCJUYmFkICUwMlggJTAyWFxuIiwKKwkJCQkgICAgICAgKnRwLAorCQkJCSAgICAgICAob3B0aW5mby0+b3B0c1t0ZW1wXSAmIDB4RkYwMCk+PjgpOworCQkJCXJldHVybiAwOworCQkJfSBlbHNlIHsKKwkJCQlERUJVR1AoIlRvayAiKTsKKwkJCX0KKwkJCS8qIExlbmd0aCBjaGVjayAqLworCQkJaWYgKCp0cCkgeworCQkJCXUxNiBzcGVjX2xlbjsKKworCQkJCS8qIGxlbmd0aCBmaWVsZCBleGlzdHMgPyAqLworCQkJCWlmIChoZHJsZW4gPCAyKQorCQkJCQlicmVhazsKKwkJCQlscCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHB0ciArIDEsCisJCQkJCQkJc2l6ZW9mKF9vcHRsZW4pLAorCQkJCQkJCSZfb3B0bGVuKTsKKwkJCQlpZiAobHAgPT0gTlVMTCkKKwkJCQkJYnJlYWs7CisJCQkJc3BlY19sZW4gPSBvcHRpbmZvLT5vcHRzW3RlbXBdICYgMHgwMEZGOworCisJCQkJaWYgKHNwZWNfbGVuICE9IDB4MDBGRiAmJiBzcGVjX2xlbiAhPSAqbHApIHsKKwkJCQkJREVCVUdQKCJMYmFkICUwMlggJTA0WFxuIiwgKmxwLAorCQkJCQkgICAgICAgc3BlY19sZW4pOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJREVCVUdQKCJMb2sgIik7CisJCQkJb3B0bGVuID0gKmxwICsgMjsKKwkJCX0gZWxzZSB7CisJCQkJREVCVUdQKCJQYWQxXG4iKTsKKwkJCQlvcHRsZW4gPSAxOworCQkJfQorCisJCQkvKiBTdGVwIHRvIHRoZSBuZXh0ICovCisJCQlERUJVR1AoImxlbiUwNFggXG4iLCBvcHRsZW4pOworCisJCQlpZiAoKHB0ciA+IHNrYi0+bGVuIC0gb3B0bGVuIHx8IGhkcmxlbiA8IG9wdGxlbikgJiYKKwkJCSAgICAodGVtcCA8IG9wdGluZm8tPm9wdHNuciAtIDEpKSB7CisJCQkJREVCVUdQKCJuZXcgcG9pbnRlciBpcyB0b28gbGFyZ2UhIFxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwdHIgKz0gb3B0bGVuOworCQkJaGRybGVuIC09IG9wdGxlbjsKKwkJfQorCQlpZiAodGVtcCA9PSBvcHRpbmZvLT5vcHRzbnIpCisJCQlyZXR1cm4gcmV0OworCQllbHNlIHJldHVybiAwOworCX0KKworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCitzdGF0aWMgaW50CitjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKyAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwLAorICAgICAgICAgIHZvaWQgKm1hdGNoaW5mbywKKyAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hpbmZvc2l6ZSwKKyAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworICAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X29wdHMgKm9wdHNpbmZvID0gbWF0Y2hpbmZvOworCisgICAgICAgaWYgKG1hdGNoaW5mb3NpemUgIT0gSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfb3B0cykpKSB7CisgICAgICAgICAgICAgIERFQlVHUCgiaXA2dF9vcHRzOiBtYXRjaHNpemUgJXUgIT0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmZvc2l6ZSwgSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfb3B0cykpKTsKKyAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgfQorICAgICAgIGlmIChvcHRzaW5mby0+aW52ZmxhZ3MgJiB+SVA2VF9PUFRTX0lOVl9NQVNLKSB7CisgICAgICAgICAgICAgIERFQlVHUCgiaXA2dF9vcHRzOiB1bmtub3duIGZsYWdzICVYXG4iLAorICAgICAgICAgICAgICAgICAgICAgIG9wdHNpbmZvLT5pbnZmbGFncyk7CisgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgIH0KKworICAgICAgIHJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggb3B0c19tYXRjaCA9IHsKKyNpZiBIT1BCWUhPUAorCS5uYW1lCQk9ICJoYmgiLAorI2Vsc2UKKwkubmFtZQkJPSAiZHN0IiwKKyNlbmRpZgorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisgICAgICAgcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJm9wdHNfbWF0Y2gpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cCh2b2lkKQoreworICAgICAgIGlwNnRfdW5yZWdpc3Rlcl9tYXRjaCgmb3B0c19tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoY2xlYW51cCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9obC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmVhZmY1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaGwuYwpAQCAtMCwwICsxLDgwIEBACisvKiBIb3AgTGltaXQgbWF0Y2hpbmcgbW9kdWxlICovCisKKy8qIChDKSAyMDAxLTIwMDIgTWFjaWVqIFNvbHR5c2lhayA8c29sdEBkbnMudG94aWNmaWxtcy50dj4KKyAqIEJhc2VkIG9uIEhXJ3MgdHRsIG1vZHVsZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9obC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKworTU9EVUxFX0FVVEhPUigiTWFjaWVqIFNvbHR5c2lhayA8c29sdEBkbnMudG94aWNmaWxtcy50dj4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVAgdGFibGVzIEhvcCBMaW1pdCBtYXRjaGluZyBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBtYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCB2b2lkICptYXRjaGluZm8sCisJCSBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKwkJIGludCAqaG90ZHJvcCkKK3sKKwljb25zdCBzdHJ1Y3QgaXA2dF9obF9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCBpcHY2aGRyICppcDZoID0gc2tiLT5uaC5pcHY2aDsKKworCXN3aXRjaCAoaW5mby0+bW9kZSkgeworCQljYXNlIElQNlRfSExfRVE6CisJCQlyZXR1cm4gKGlwNmgtPmhvcF9saW1pdCA9PSBpbmZvLT5ob3BfbGltaXQpOworCQkJYnJlYWs7CisJCWNhc2UgSVA2VF9ITF9ORToKKwkJCXJldHVybiAoIShpcDZoLT5ob3BfbGltaXQgPT0gaW5mby0+aG9wX2xpbWl0KSk7CisJCQlicmVhazsKKwkJY2FzZSBJUDZUX0hMX0xUOgorCQkJcmV0dXJuIChpcDZoLT5ob3BfbGltaXQgPCBpbmZvLT5ob3BfbGltaXQpOworCQkJYnJlYWs7CisJCWNhc2UgSVA2VF9ITF9HVDoKKwkJCXJldHVybiAoaXA2aC0+aG9wX2xpbWl0ID4gaW5mby0+aG9wX2xpbWl0KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaXA2dF9obDogdW5rbm93biBtb2RlICVkXG4iLCAKKwkJCQlpbmZvLT5tb2RlKTsKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwLAorCQkgICAgICB2b2lkICptYXRjaGluZm8sIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisJCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJaWYgKG1hdGNoc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9obF9pbmZvKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXA2dF9tYXRjaCBobF9tYXRjaCA9IHsKKwkubmFtZQkJPSAiaGwiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJmhsX21hdGNoKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goJmhsX21hdGNoKTsKKworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaXB2NmhlYWRlci5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaXB2NmhlYWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZTY3ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9pcHY2aGVhZGVyLmMKQEAgLTAsMCArMSwxNjcgQEAKKy8qIGlwdjZoZWFkZXIgbWF0Y2ggLSBtYXRjaGVzIElQdjYgcGFja2V0cyBiYXNlZAorICAgb24gd2hldGhlciB0aGV5IGNvbnRhaW4gY2VydGFpbiBoZWFkZXJzICovCisKKy8qIE9yaWdpbmFsIGlkZWE6IEJyYWQgQ2hhcG1hbiAKKyAqIFJld3JpdHRlbiBieTogQW5kcmFzIEtpcy1TemFibyA8a2lzemFAc2NoLmJtZS5odT4gKi8KKworLyogKEMpIDIwMDEtMjAwMiBBbmRyYXMgS2lzLVN6YWJvIDxraXN6YUBzY2guYm1lLmh1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9pcHY2aGVhZGVyLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVB2NiBoZWFkZXJzIG1hdGNoIik7CitNT0RVTEVfQVVUSE9SKCJBbmRyYXMgS2lzLVN6YWJvIDxraXN6YUBzY2guYm1lLmh1PiIpOworCitzdGF0aWMgaW50CitpcHY2aGVhZGVyX21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQkgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorCQkgaW50IG9mZnNldCwKKwkJIHVuc2lnbmVkIGludCBwcm90b2ZmLAorCQkgaW50ICpob3Rkcm9wKQoreworCWNvbnN0IHN0cnVjdCBpcDZ0X2lwdjZoZWFkZXJfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKwlpbnQgbGVuOworCXU4IG5leHRoZHI7CisJdW5zaWduZWQgaW50IHB0cjsKKworCS8qIE1ha2Ugc3VyZSB0aGlzIGlzbid0IGFuIGV2aWwgcGFja2V0ICovCisKKwkvKiB0eXBlIG9mIHRoZSAxc3QgZXh0aGRyICovCisJbmV4dGhkciA9IHNrYi0+bmguaXB2NmgtPm5leHRoZHI7CisJLyogcG9pbnRlciB0byB0aGUgMXN0IGV4dGhkciAqLworCXB0ciA9IHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisJLyogYXZhaWxhYmxlIGxlbmd0aCAqLworCWxlbiA9IHNrYi0+bGVuIC0gcHRyOworCXRlbXAgPSAwOworCisgICAgICAgIHdoaWxlIChpcDZ0X2V4dF9oZHIobmV4dGhkcikpIHsKKwkJc3RydWN0IGlwdjZfb3B0X2hkciBfaGRyLCAqaHA7CisgICAgICAgIAlpbnQgaGRybGVuOworCisJCS8qIElzIHRoZXJlIGVub3VnaCBzcGFjZSBmb3IgdGhlIG5leHQgZXh0IGhlYWRlcj8gKi8KKyAgICAgICAgICAgICAgICBpZiAobGVuIDwgKGludClzaXplb2Yoc3RydWN0IGlwdjZfb3B0X2hkcikpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwkJLyogTm8gbW9yZSBleHRoZHIgLT4gZXZhbHVhdGUgKi8KKyAgICAgICAgICAgICAgICBpZiAobmV4dGhkciA9PSBORVhUSERSX05PTkUpIHsKKwkJCXRlbXAgfD0gTUFTS19OT05FOworCQkJYnJlYWs7CisJCX0KKwkJLyogRVNQIC0+IGV2YWx1YXRlICovCisgICAgICAgICAgICAgICAgaWYgKG5leHRoZHIgPT0gTkVYVEhEUl9FU1ApIHsKKwkJCXRlbXAgfD0gTUFTS19FU1A7CisJCQlicmVhazsKKwkJfQorCisJCWhwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHRyLCBzaXplb2YoX2hkciksICZfaGRyKTsKKwkJQlVHX09OKGhwID09IE5VTEwpOworCisJCS8qIENhbGN1bGF0ZSB0aGUgaGVhZGVyIGxlbmd0aCAqLworICAgICAgICAgICAgICAgIGlmIChuZXh0aGRyID09IE5FWFRIRFJfRlJBR01FTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhkcmxlbiA9IDg7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0aGRyID09IE5FWFRIRFJfQVVUSCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGhkcmxlbiA9IChocC0+aGRybGVuKzIpPDwyOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGhkcmxlbiA9IGlwdjZfb3B0bGVuKGhwKTsKKworCQkvKiBzZXQgdGhlIGZsYWcgKi8KKwkJc3dpdGNoIChuZXh0aGRyKXsKKwkJCWNhc2UgTkVYVEhEUl9IT1A6CisJCQkJdGVtcCB8PSBNQVNLX0hPUE9QVFM7CisJCQkJYnJlYWs7CisJCQljYXNlIE5FWFRIRFJfUk9VVElORzoKKwkJCQl0ZW1wIHw9IE1BU0tfUk9VVElORzsKKwkJCQlicmVhazsKKwkJCWNhc2UgTkVYVEhEUl9GUkFHTUVOVDoKKwkJCQl0ZW1wIHw9IE1BU0tfRlJBR01FTlQ7CisJCQkJYnJlYWs7CisJCQljYXNlIE5FWFRIRFJfQVVUSDoKKwkJCQl0ZW1wIHw9IE1BU0tfQUg7CisJCQkJYnJlYWs7CisJCQljYXNlIE5FWFRIRFJfREVTVDoKKwkJCQl0ZW1wIHw9IE1BU0tfRFNUT1BUUzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIDA7CisJCQkJYnJlYWs7CisJCX0KKworICAgICAgICAgICAgICAgIG5leHRoZHIgPSBocC0+bmV4dGhkcjsKKyAgICAgICAgICAgICAgICBsZW4gLT0gaGRybGVuOworICAgICAgICAgICAgICAgIHB0ciArPSBoZHJsZW47CisJCWlmIChwdHIgPiBza2ItPmxlbikKKwkJCWJyZWFrOworICAgICAgICB9CisKKwlpZiAoIChuZXh0aGRyICE9IE5FWFRIRFJfTk9ORSApICYmIChuZXh0aGRyICE9IE5FWFRIRFJfRVNQKSApCisJCXRlbXAgfD0gTUFTS19QUk9UTzsKKworCWlmIChpbmZvLT5tb2RlZmxhZykKKwkJcmV0dXJuICEoKHRlbXAgXiBpbmZvLT5tYXRjaGZsYWdzIF4gaW5mby0+aW52ZmxhZ3MpCisJCQkgJiBpbmZvLT5tYXRjaGZsYWdzKTsKKwllbHNlIHsKKwkJaWYgKGluZm8tPmludmZsYWdzKQorCQkJcmV0dXJuIHRlbXAgIT0gaW5mby0+bWF0Y2hmbGFnczsKKwkJZWxzZQorCQkJcmV0dXJuIHRlbXAgPT0gaW5mby0+bWF0Y2hmbGFnczsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2lwdjZoZWFkZXJfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAsCisJCSAgICAgIHZvaWQgKm1hdGNoaW5mbywKKwkJICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkJICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgaXA2dF9pcHY2aGVhZGVyX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisKKwkvKiBDaGVjayBmb3Igb2J2aW91cyBlcnJvcnMgKi8KKwkvKiBUaGlzIG1hdGNoIGlzIHZhbGlkIGluIGFsbCBob29rcyEgKi8KKwlpZiAobWF0Y2hzaXplICE9IElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X2lwdjZoZWFkZXJfaW5mbykpKQorCQlyZXR1cm4gMDsKKworCS8qIGludmZsYWdzIGlzIDAgb3IgMHhmZiBpbiBoYXJkIG1vZGUgKi8KKwlpZiAoKCFpbmZvLT5tb2RlZmxhZykgJiYgaW5mby0+aW52ZmxhZ3MgIT0gMHgwMAorCQkJICAgICAgJiYgaW5mby0+aW52ZmxhZ3MgIT0gMHhGRikKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBpcDZ0X21hdGNoIGlwNnRfaXB2NmhlYWRlcl9tYXRjaCA9IHsKKwkubmFtZQkJPSAiaXB2NmhlYWRlciIsCisJLm1hdGNoCQk9ICZpcHY2aGVhZGVyX21hdGNoLAorCS5jaGVja2VudHJ5CT0gJmlwdjZoZWFkZXJfY2hlY2tlbnRyeSwKKwkuZGVzdHJveQk9IE5VTEwsCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCAgX19pbml0IGlwdjZoZWFkZXJfaW5pdCh2b2lkKQoreworCXJldHVybiBpcDZ0X3JlZ2lzdGVyX21hdGNoKCZpcDZ0X2lwdjZoZWFkZXJfbWF0Y2gpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXB2NmhlYWRlcl9leGl0KHZvaWQpCit7CisJaXA2dF91bnJlZ2lzdGVyX21hdGNoKCZpcDZ0X2lwdjZoZWFkZXJfbWF0Y2gpOworfQorCittb2R1bGVfaW5pdChpcHY2aGVhZGVyX2luaXQpOworbW9kdWxlX2V4aXQoaXB2NmhlYWRlcl9leGl0KTsKKwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfbGVuZ3RoLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9sZW5ndGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDUzN2QzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfbGVuZ3RoLmMKQEAgLTAsMCArMSw2NiBAQAorLyogTGVuZ3RoIE1hdGNoIC0gSVB2NiBQb3J0ICovCisKKy8qIChDKSAxOTk5LTIwMDEgSmFtZXMgTW9ycmlzIDxqbW9ycm9zQGludGVyY29kZS5jb20uYXU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2xlbmd0aC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklQdjYgcGFja2V0IGxlbmd0aCBtYXRjaCIpOworCitzdGF0aWMgaW50CittYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKyAgICAgIGludCAqaG90ZHJvcCkKK3sKKwljb25zdCBzdHJ1Y3QgaXA2dF9sZW5ndGhfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwl1X2ludDE2X3QgcGt0bGVuID0gbnRvaHMoc2tiLT5uaC5pcHY2aC0+cGF5bG9hZF9sZW4pICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKKwkKKwlyZXR1cm4gKHBrdGxlbiA+PSBpbmZvLT5taW4gJiYgcGt0bGVuIDw9IGluZm8tPm1heCkgXiBpbmZvLT5pbnZlcnQ7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwLAorICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCisgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJaWYgKG1hdGNoc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9sZW5ndGhfaW5mbykpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggbGVuZ3RoX21hdGNoID0geworCS5uYW1lCQk9ICJsZW5ndGgiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJmxlbmd0aF9tYXRjaCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaXA2dF91bnJlZ2lzdGVyX21hdGNoKCZsZW5ndGhfbWF0Y2gpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfbGltaXQuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2xpbWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI3ODJmNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2xpbWl0LmMKQEAgLTAsMCArMSwxNDcgQEAKKy8qIEtlcm5lbCBtb2R1bGUgdG8gY29udHJvbCB0aGUgcmF0ZQorICoKKyAqIDIgU2VwdGVtYmVyIDE5OTk6IENoYW5nZWQgZnJvbSB0aGUgdGFyZ2V0IFJBVEUgdG8gdGhlIG1hdGNoCisgKiAgICAgICAgICAgICAgICAgICBgbGltaXQnLCByZW1vdmVkIGxvZ2dpbmcuICBEaWQgSSBtZW50aW9uIHRoYXQKKyAqICAgICAgICAgICAgICAgICAgIEFsZXhleSBpcyBhIGZ1Y2tpbmcgZ2VuaXVzPworICogICAgICAgICAgICAgICAgICAgUnVzdHkgUnVzc2VsbCAocnVzdHlAcnVzdGNvcnAuY29tLmF1KS4gICovCisKKy8qIChDKSAxOTk5IErpcvRtZSBkZSBWaXZpZSA8ZGV2aXZpZUBpbmZvLmVuc2VyYi51LWJvcmRlYXV4LmZyPgorICogKEMpIDE5OTkgSGVydukgRXljaGVubmUgPGV5Y2hlbm5lQGluZm8uZW5zZXJiLnUtYm9yZGVhdXguZnI+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2xpbWl0Lmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkhlcnZlIEV5Y2hlbm5lIDxydkB3YWxsZmlyZS5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oInJhdGUgbGltaXRpbmcgd2l0aGluIGlwNnRhYmxlcyIpOworCisvKiBUaGUgYWxnb3JpdGhtIHVzZWQgaXMgdGhlIFNpbXBsZSBUb2tlbiBCdWNrZXQgRmlsdGVyIChUQkYpCisgKiBzZWUgbmV0L3NjaGVkL3NjaF90YmYuYyBpbiB0aGUgbGludXggc291cmNlIHRyZWUKKyAqLworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxpbWl0X2xvY2spOworCisvKiBSdXN0eTogVGhpcyBpcyBteSAobm9uLW1hdGhlbWF0aWNhbGx5LWluY2xpbmVkKSB1bmRlcnN0YW5kaW5nIG9mCisgICB0aGlzIGFsZ29yaXRobS4gIFRoZSBgYXZlcmFnZSByYXRlJyBpbiBqaWZmaWVzIGJlY29tZXMgeW91ciBpbml0aWFsCisgICBhbW91bnQgb2YgY3JlZGl0IGBjcmVkaXQnIGFuZCB0aGUgbW9zdCBjcmVkaXQgeW91IGNhbiBldmVyIGhhdmUKKyAgIGBjcmVkaXRfY2FwJy4gIFRoZSBgcGVhayByYXRlJyBiZWNvbWVzIHRoZSBjb3N0IG9mIHBhc3NpbmcgdGhlCisgICB0ZXN0LCBgY29zdCcuCisKKyAgIGBwcmV2JyB0cmFja3MgdGhlIGxhc3QgcGFja2V0IGhpdDogeW91IGdhaW4gb25lIGNyZWRpdCBwZXIgamlmZnkuCisgICBJZiB5b3UgZ2V0IGNyZWRpdCBiYWxhbmNlIG1vcmUgdGhhbiB0aGlzLCB0aGUgZXh0cmEgY3JlZGl0IGlzCisgICBkaXNjYXJkZWQuICBFdmVyeSB0aW1lIHRoZSBtYXRjaCBwYXNzZXMsIHlvdSBsb3NlIGBjb3N0JyBjcmVkaXRzOworICAgaWYgeW91IGRvbid0IGhhdmUgdGhhdCBtYW55LCB0aGUgdGVzdCBmYWlscy4KKworICAgU2VlIEFsZXhleSdzIGZvcm1hbCBleHBsYW5hdGlvbiBpbiBuZXQvc2NoZWQvc2NoX3RiZi5jLgorCisgICBUbyBhdm9pZCB1bmRlcmZsb3csIHdlIG11bHRpcGx5IGJ5IDEyOCAoaWUuIHlvdSBnZXQgMTI4IGNyZWRpdHMgcGVyCisgICBqaWZmeSkuICBIZW5jZSBhIGNvc3Qgb2YgMl4zMi0xLCBtZWFucyBvbmUgcGFzcyBwZXIgMzI3Njggc2Vjb25kcworICAgYXQgMTAyNEhaIChvciBvbmUgZXZlcnkgOSBob3VycykuICBBIGNvc3Qgb2YgMSBtZWFucyAxMjgwMCBwYXNzZXMKKyAgIHBlciBzZWNvbmQgYXQgMTAwSFouICAqLworCisjZGVmaW5lIENSRURJVFNfUEVSX0pJRkZZIDEyOAorCitzdGF0aWMgaW50CitpcDZ0X2xpbWl0X21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorCQlpbnQgb2Zmc2V0LAorCQl1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKwkJaW50ICpob3Rkcm9wKQoreworCXN0cnVjdCBpcDZ0X3JhdGVpbmZvICpyID0gKChzdHJ1Y3QgaXA2dF9yYXRlaW5mbyAqKW1hdGNoaW5mbyktPm1hc3RlcjsKKwl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisKKwlzcGluX2xvY2tfYmgoJmxpbWl0X2xvY2spOworCXItPmNyZWRpdCArPSAobm93IC0geGNoZygmci0+cHJldiwgbm93KSkgKiBDUkVESVRTX1BFUl9KSUZGWTsKKwlpZiAoci0+Y3JlZGl0ID4gci0+Y3JlZGl0X2NhcCkKKwkJci0+Y3JlZGl0ID0gci0+Y3JlZGl0X2NhcDsKKworCWlmIChyLT5jcmVkaXQgPj0gci0+Y29zdCkgeworCQkvKiBXZSdyZSBub3QgbGltaXRlZC4gKi8KKwkJci0+Y3JlZGl0IC09IHItPmNvc3Q7CisJCXNwaW5fdW5sb2NrX2JoKCZsaW1pdF9sb2NrKTsKKwkJcmV0dXJuIDE7CisJfQorCisgICAgICAgCXNwaW5fdW5sb2NrX2JoKCZsaW1pdF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyogUHJlY2lzaW9uIHNhdmVyLiAqLworc3RhdGljIHVfaW50MzJfdAordXNlcjJjcmVkaXRzKHVfaW50MzJfdCB1c2VyKQoreworCS8qIElmIG11bHRpcGx5aW5nIHdvdWxkIG92ZXJmbG93Li4uICovCisJaWYgKHVzZXIgPiAweEZGRkZGRkZGIC8gKEhaKkNSRURJVFNfUEVSX0pJRkZZKSkKKwkJLyogRGl2aWRlIGZpcnN0LiAqLworCQlyZXR1cm4gKHVzZXIgLyBJUDZUX0xJTUlUX1NDQUxFKSAqIEhaICogQ1JFRElUU19QRVJfSklGRlk7CisKKwlyZXR1cm4gKHVzZXIgKiBIWiAqIENSRURJVFNfUEVSX0pJRkZZKSAvIElQNlRfTElNSVRfU0NBTEU7Cit9CisKK3N0YXRpYyBpbnQKK2lwNnRfbGltaXRfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJCSAgICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCwKKwkJICAgICB2b2lkICptYXRjaGluZm8sCisJCSAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkJICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCXN0cnVjdCBpcDZ0X3JhdGVpbmZvICpyID0gbWF0Y2hpbmZvOworCisJaWYgKG1hdGNoc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9yYXRlaW5mbykpKQorCQlyZXR1cm4gMDsKKworCS8qIENoZWNrIGZvciBvdmVyZmxvdy4gKi8KKwlpZiAoci0+YnVyc3QgPT0gMAorCSAgICB8fCB1c2VyMmNyZWRpdHMoci0+YXZnICogci0+YnVyc3QpIDwgdXNlcjJjcmVkaXRzKHItPmF2ZykpIHsKKwkJcHJpbnRrKCJDYWxsIHJ1c3R5OiBvdmVyZmxvdyBpbiBpcDZ0X2xpbWl0OiAldS8ldVxuIiwKKwkJICAgICAgIHItPmF2Zywgci0+YnVyc3QpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBVc2VyIGF2ZyBpbiBzZWNvbmRzICogSVA2VF9MSU1JVF9TQ0FMRTogY29udmVydCB0byBqaWZmaWVzICoKKwkgICAxMjguICovCisJci0+cHJldiA9IGppZmZpZXM7CisJci0+Y3JlZGl0ID0gdXNlcjJjcmVkaXRzKHItPmF2ZyAqIHItPmJ1cnN0KTsJIC8qIENyZWRpdHMgZnVsbC4gKi8KKwlyLT5jcmVkaXRfY2FwID0gdXNlcjJjcmVkaXRzKHItPmF2ZyAqIHItPmJ1cnN0KTsgLyogQ3JlZGl0cyBmdWxsLiAqLworCXItPmNvc3QgPSB1c2VyMmNyZWRpdHMoci0+YXZnKTsKKworCS8qIEZvciBTTVAsIHdlIG9ubHkgd2FudCB0byB1c2Ugb25lIHNldCBvZiBjb3VudGVycy4gKi8KKwlyLT5tYXN0ZXIgPSByOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXA2dF9tYXRjaCBpcDZ0X2xpbWl0X3JlZyA9IHsKKwkubmFtZQkJPSAibGltaXQiLAorCS5tYXRjaAkJPSBpcDZ0X2xpbWl0X21hdGNoLAorCS5jaGVja2VudHJ5CT0gaXA2dF9saW1pdF9jaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpZiAoaXA2dF9yZWdpc3Rlcl9tYXRjaCgmaXA2dF9saW1pdF9yZWcpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goJmlwNnRfbGltaXRfcmVnKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X21hYy5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfbWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI2ZDQzZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X21hYy5jCkBAIC0wLDAgKzEsODAgQEAKKy8qIEtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggTUFDIGFkZHJlc3MgcGFyYW1ldGVycy4gKi8KKworLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAorICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X21hYy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNQUMgYWRkcmVzcyBtYXRjaGluZyBtb2R1bGUgZm9yIElQdjYiKTsKK01PRFVMRV9BVVRIT1IoIk5ldGZpbHRlciBDb3JlIFRlYWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPiIpOworCitzdGF0aWMgaW50CittYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKyAgICAgIGludCAqaG90ZHJvcCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgaXA2dF9tYWNfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKworICAgIC8qIElzIG1hYyBwb2ludGVyIHZhbGlkPyAqLworICAgIHJldHVybiAoc2tiLT5tYWMucmF3ID49IHNrYi0+aGVhZAorCSAgICAmJiAoc2tiLT5tYWMucmF3ICsgRVRIX0hMRU4pIDw9IHNrYi0+ZGF0YQorCSAgICAvKiBJZiBzbywgY29tcGFyZS4uLiAqLworCSAgICAmJiAoKG1lbWNtcChldGhfaGRyKHNrYiktPmhfc291cmNlLCBpbmZvLT5zcmNhZGRyLCBFVEhfQUxFTikKKwkJPT0gMCkgXiBpbmZvLT5pbnZlcnQpKTsKK30KKworc3RhdGljIGludAoraXA2dF9tYWNfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJCSAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAsCisJCSAgIHZvaWQgKm1hdGNoaW5mbywKKwkJICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlpZiAoaG9va19tYXNrCisJICAgICYgfigoMSA8PCBORl9JUDZfUFJFX1JPVVRJTkcpIHwgKDEgPDwgTkZfSVA2X0xPQ0FMX0lOKQorCQl8ICgxIDw8IE5GX0lQNl9GT1JXQVJEKSkpIHsKKwkJcHJpbnRrKCJpcDZ0X21hYzogb25seSB2YWxpZCBmb3IgUFJFX1JPVVRJTkcsIExPQ0FMX0lOIG9yIgorCQkgICAgICAgIiBGT1JXQVJEXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG1hdGNoc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9tYWNfaW5mbykpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggbWFjX21hdGNoID0geworCS5uYW1lCQk9ICJtYWMiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmaXA2dF9tYWNfY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJm1hY19tYXRjaCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaXA2dF91bnJlZ2lzdGVyX21hdGNoKCZtYWNfbWF0Y2gpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfbWFyay5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfbWFyay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZmMzZGUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9tYXJrLmMKQEAgLTAsMCArMSw2NiBAQAorLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBORk1BUksgdmFsdWVzLiAqLworCisvKiAoQykgMTk5OS0yMDAxIE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X21hcmsuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlwNnRhYmxlcyBtYXJrIG1hdGNoIik7CisKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorICAgICAgaW50ICpob3Rkcm9wKQoreworCWNvbnN0IHN0cnVjdCBpcDZ0X21hcmtfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKworCXJldHVybiAoKHNrYi0+bmZtYXJrICYgaW5mby0+bWFzaykgPT0gaW5mby0+bWFyaykgXiBpbmZvLT5pbnZlcnQ7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwLAorICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCisgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJaWYgKG1hdGNoc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9tYXJrX2luZm8pKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBpcDZ0X21hdGNoIG1hcmtfbWF0Y2ggPSB7CisJLm5hbWUJCT0gIm1hcmsiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJm1hcmtfbWF0Y2gpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCWlwNnRfdW5yZWdpc3Rlcl9tYXRjaCgmbWFya19tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9tdWx0aXBvcnQuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X211bHRpcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMzI0NjEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9tdWx0aXBvcnQuYwpAQCAtMCwwICsxLDEyNSBAQAorLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBvbmUgb2YgYSBsaXN0IG9mIFRDUC9VRFAgcG9ydHM6IHBvcnRzIGFyZSBpbgorICAgdGhlIHNhbWUgcGxhY2Ugc28gd2UgY2FuIHRyZWF0IHRoZW0gYXMgZXF1YWwuICovCisKKy8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKKyAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X211bHRpcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXA2dGFibGVzIG1hdGNoIGZvciBtdWx0aXBsZSBwb3J0cyIpOworCisjaWYgMAorI2RlZmluZSBkdXByaW50Zihmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgZHVwcmludGYoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKy8qIFJldHVybnMgMSBpZiB0aGUgcG9ydCBpcyBtYXRjaGVkIGJ5IHRoZSB0ZXN0LCAwIG90aGVyd2lzZS4gKi8KK3N0YXRpYyBpbmxpbmUgaW50Citwb3J0c19tYXRjaChjb25zdCB1X2ludDE2X3QgKnBvcnRsaXN0LCBlbnVtIGlwNnRfbXVsdGlwb3J0X2ZsYWdzIGZsYWdzLAorCSAgICB1X2ludDhfdCBjb3VudCwgdV9pbnQxNl90IHNyYywgdV9pbnQxNl90IGRzdCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGk9MDsgaTxjb3VudDsgaSsrKSB7CisJCWlmIChmbGFncyAhPSBJUDZUX01VTFRJUE9SVF9ERVNUSU5BVElPTgorCQkgICAgJiYgcG9ydGxpc3RbaV0gPT0gc3JjKQorCQkJcmV0dXJuIDE7CisKKwkJaWYgKGZsYWdzICE9IElQNlRfTVVMVElQT1JUX1NPVVJDRQorCQkgICAgJiYgcG9ydGxpc3RbaV0gPT0gZHN0KQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorICAgICAgaW50ICpob3Rkcm9wKQoreworCXUxNiBfcG9ydHNbMl0sICpwcHRyOworCWNvbnN0IHN0cnVjdCBpcDZ0X211bHRpcG9ydCAqbXVsdGlpbmZvID0gbWF0Y2hpbmZvOworCisJLyogTXVzdCBub3QgYmUgYSBmcmFnbWVudC4gKi8KKwlpZiAob2Zmc2V0KQorCQlyZXR1cm4gMDsKKworCS8qIE11c3QgYmUgYmlnIGVub3VnaCB0byByZWFkIHBvcnRzIChib3RoIFVEUCBhbmQgVENQIGhhdmUKKwkgICB0aGVtIGF0IHRoZSBzdGFydCkuICovCisJcHB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYsIHNpemVvZihfcG9ydHMpLCAmX3BvcnRzWzBdKTsKKwlpZiAocHB0ciA9PSBOVUxMKSB7CisJCS8qIFdlJ3ZlIGJlZW4gYXNrZWQgdG8gZXhhbWluZSB0aGlzIHBhY2tldCwgYW5kIHdlCisJCSAqIGNhbid0LiAgSGVuY2UsIG5vIGNob2ljZSBidXQgdG8gZHJvcC4KKwkJICovCisJCWR1cHJpbnRmKCJpcDZ0X211bHRpcG9ydDoiCisJCQkgIiBEcm9wcGluZyBldmlsIG9mZnNldD0wIHRpbnlncmFtLlxuIik7CisJCSpob3Rkcm9wID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHBvcnRzX21hdGNoKG11bHRpaW5mby0+cG9ydHMsCisJCQkgICBtdWx0aWluZm8tPmZsYWdzLCBtdWx0aWluZm8tPmNvdW50LAorCQkJICAgbnRvaHMocHB0clswXSksIG50b2hzKHBwdHJbMV0pKTsKK30KKworLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLworc3RhdGljIGludAorY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCwKKwkgICB2b2lkICptYXRjaGluZm8sCisJICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWNvbnN0IHN0cnVjdCBpcDZ0X211bHRpcG9ydCAqbXVsdGlpbmZvID0gbWF0Y2hpbmZvOworCisJaWYgKG1hdGNoc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9tdWx0aXBvcnQpKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBNdXN0IHNwZWNpZnkgcHJvdG8gPT0gVENQL1VEUCwgbm8gdW5rbm93biBmbGFncyBvciBiYWQgY291bnQgKi8KKwlyZXR1cm4gKGlwLT5wcm90byA9PSBJUFBST1RPX1RDUCB8fCBpcC0+cHJvdG8gPT0gSVBQUk9UT19VRFApCisJCSYmICEoaXAtPmludmZsYWdzICYgSVA2VF9JTlZfUFJPVE8pCisJCSYmIG1hdGNoc2l6ZSA9PSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9tdWx0aXBvcnQpKQorCQkmJiAobXVsdGlpbmZvLT5mbGFncyA9PSBJUDZUX01VTFRJUE9SVF9TT1VSQ0UKKwkJICAgIHx8IG11bHRpaW5mby0+ZmxhZ3MgPT0gSVA2VF9NVUxUSVBPUlRfREVTVElOQVRJT04KKwkJICAgIHx8IG11bHRpaW5mby0+ZmxhZ3MgPT0gSVA2VF9NVUxUSVBPUlRfRUlUSEVSKQorCQkmJiBtdWx0aWluZm8tPmNvdW50IDw9IElQNlRfTVVMVElfUE9SVFM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXA2dF9tYXRjaCBtdWx0aXBvcnRfbWF0Y2ggPSB7CisJLm5hbWUJCT0gIm11bHRpcG9ydCIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlyZXR1cm4gaXA2dF9yZWdpc3Rlcl9tYXRjaCgmbXVsdGlwb3J0X21hdGNoKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwlpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goJm11bHRpcG9ydF9tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9vd25lci5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfb3duZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjBlMzJkCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfb3duZXIuYwpAQCAtMCwwICsxLDE3NCBAQAorLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCB2YXJpb3VzIHRoaW5ncyB0aWVkIHRvIHNvY2tldHMgYXNzb2NpYXRlZCB3aXRoCisgICBsb2NhbGx5IGdlbmVyYXRlZCBvdXRnb2luZyBwYWNrZXRzLiAqLworCisvKiAoQykgMjAwMC0yMDAxIE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9vd25lci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKworTU9EVUxFX0FVVEhPUigiTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklQNiB0YWJsZXMgb3duZXIgbWF0Y2hpbmcgbW9kdWxlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQKK21hdGNoX3BpZChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBwaWRfdCBwaWQpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwOworCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzOworCWludCBpOworCisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlwID0gZmluZF90YXNrX2J5X3BpZChwaWQpOworCWlmICghcCkKKwkJZ290byBvdXQ7CisJdGFza19sb2NrKHApOworCWZpbGVzID0gcC0+ZmlsZXM7CisJaWYoZmlsZXMpIHsKKwkJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJZm9yIChpPTA7IGkgPCBmaWxlcy0+bWF4X2ZkczsgaSsrKSB7CisJCQlpZiAoZmNoZWNrX2ZpbGVzKGZpbGVzLCBpKSA9PSBza2ItPnNrLT5za19zb2NrZXQtPmZpbGUpIHsKKwkJCQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCQkJdGFza191bmxvY2socCk7CisJCQkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwl9CisJdGFza191bmxvY2socCk7CitvdXQ6CisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CittYXRjaF9zaWQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgcGlkX3Qgc2lkKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqZywgKnA7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBza2ItPnNrLT5za19zb2NrZXQtPmZpbGU7CisJaW50IGksIGZvdW5kPTA7CisKKwlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCWRvX2VhY2hfdGhyZWFkKGcsIHApIHsKKwkJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXM7CisJCWlmIChwLT5zaWduYWwtPnNlc3Npb24gIT0gc2lkKQorCQkJY29udGludWU7CisKKwkJdGFza19sb2NrKHApOworCQlmaWxlcyA9IHAtPmZpbGVzOworCQlpZiAoZmlsZXMpIHsKKwkJCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCQlmb3IgKGk9MDsgaSA8IGZpbGVzLT5tYXhfZmRzOyBpKyspIHsKKwkJCQlpZiAoZmNoZWNrX2ZpbGVzKGZpbGVzLCBpKSA9PSBmaWxlKSB7CisJCQkJCWZvdW5kID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCQl9CisJCXRhc2tfdW5sb2NrKHApOworCQlpZiAoZm91bmQpCisJCQlnb3RvIG91dDsKKwl9IHdoaWxlX2VhY2hfdGhyZWFkKGcsIHApOworb3V0OgorCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKworCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIGludAorbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCisgICAgICBpbnQgKmhvdGRyb3ApCit7CisJY29uc3Qgc3RydWN0IGlwNnRfb3duZXJfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKworCWlmICghc2tiLT5zayB8fCAhc2tiLT5zay0+c2tfc29ja2V0IHx8ICFza2ItPnNrLT5za19zb2NrZXQtPmZpbGUpCisJCXJldHVybiAwOworCisJaWYoaW5mby0+bWF0Y2ggJiBJUDZUX09XTkVSX1VJRCkgeworCQlpZigoc2tiLT5zay0+c2tfc29ja2V0LT5maWxlLT5mX3VpZCAhPSBpbmZvLT51aWQpIF4KKwkJICAgICEhKGluZm8tPmludmVydCAmIElQNlRfT1dORVJfVUlEKSkKKwkJCXJldHVybiAwOworCX0KKworCWlmKGluZm8tPm1hdGNoICYgSVA2VF9PV05FUl9HSUQpIHsKKwkJaWYoKHNrYi0+c2stPnNrX3NvY2tldC0+ZmlsZS0+Zl9naWQgIT0gaW5mby0+Z2lkKSBeCisJCSAgICAhIShpbmZvLT5pbnZlcnQgJiBJUDZUX09XTkVSX0dJRCkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZihpbmZvLT5tYXRjaCAmIElQNlRfT1dORVJfUElEKSB7CisJCWlmICghbWF0Y2hfcGlkKHNrYiwgaW5mby0+cGlkKSBeCisJCSAgICAhIShpbmZvLT5pbnZlcnQgJiBJUDZUX09XTkVSX1BJRCkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZihpbmZvLT5tYXRjaCAmIElQNlRfT1dORVJfU0lEKSB7CisJCWlmICghbWF0Y2hfc2lkKHNrYiwgaW5mby0+c2lkKSBeCisJCSAgICAhIShpbmZvLT5pbnZlcnQgJiBJUDZUX09XTkVSX1NJRCkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAsCisgICAgICAgICAgIHZvaWQgKm1hdGNoaW5mbywKKyAgICAgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKyAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKyAgICAgICAgaWYgKGhvb2tfbWFzaworICAgICAgICAgICAgJiB+KCgxIDw8IE5GX0lQNl9MT0NBTF9PVVQpIHwgKDEgPDwgTkZfSVA2X1BPU1RfUk9VVElORykpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJpcDZ0X293bmVyOiBvbmx5IHZhbGlkIGZvciBMT0NBTF9PVVQgb3IgUE9TVF9ST1VUSU5HLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworCWlmIChtYXRjaHNpemUgIT0gSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfb3duZXJfaW5mbykpKQorCQlyZXR1cm4gMDsKKyNpZmRlZiBDT05GSUdfU01QCisJLyogZmlsZXMtPmZpbGVfbG9jayBjYW4gbm90IGJlIHVzZWQgaW4gYSBCSCAqLworCWlmICgoKHN0cnVjdCBpcDZ0X293bmVyX2luZm8gKiltYXRjaGluZm8pLT5tYXRjaAorCSAgICAmIChJUDZUX09XTkVSX1BJRHxJUDZUX09XTkVSX1NJRCkpIHsKKwkJcHJpbnRrKCJpcDZ0X293bmVyOiBwaWQgYW5kIHNpZCBtYXRjaGluZyBpcyBicm9rZW4gb24gU01QLlxuIik7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggb3duZXJfbWF0Y2ggPSB7CisJLm5hbWUJCT0gIm93bmVyIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCXJldHVybiBpcDZ0X3JlZ2lzdGVyX21hdGNoKCZvd25lcl9tYXRjaCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJaXA2dF91bnJlZ2lzdGVyX21hdGNoKCZvd25lcl9tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9waHlzZGV2LmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9waHlzZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE1MTVjOAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X3BoeXNkZXYuYwpAQCAtMCwwICsxLDEzNSBAQAorLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCB0aGUgYnJpZGdlIHBvcnQgaW4gYW5kCisgKiBvdXQgZGV2aWNlIGZvciBJUCBwYWNrZXRzIGNvbWluZyBpbnRvIGNvbnRhY3Qgd2l0aCBhIGJyaWRnZS4gKi8KKworLyogKEMpIDIwMDEtMjAwMyBCYXJ0IERlIFNjaHV5bWVyIDxiZHNjaHV5bUBwYW5kb3JhLmJlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfcGh5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlLmg+CisjZGVmaW5lIE1BVENIICAgMQorI2RlZmluZSBOT01BVENIIDAKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQmFydCBEZSBTY2h1eW1lciA8YmRzY2h1eW1AcGFuZG9yYS5iZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgYnJpZGdlIHBoeXNpY2FsIGRldmljZSBtYXRjaCBtb2R1bGUiKTsKKworc3RhdGljIGludAorbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCisgICAgICBpbnQgKmhvdGRyb3ApCit7CisJaW50IGk7CisJc3RhdGljIGNvbnN0IGNoYXIgbnVsbGRldm5hbWVbSUZOQU1TSVpdOworCWNvbnN0IHN0cnVjdCBpcDZ0X3BoeXNkZXZfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwl1bnNpZ25lZCBpbnQgcmV0OworCWNvbnN0IGNoYXIgKmluZGV2LCAqb3V0ZGV2OworCXN0cnVjdCBuZl9icmlkZ2VfaW5mbyAqbmZfYnJpZGdlOworCisJLyogTm90IGEgYnJpZGdlZCBJUCBwYWNrZXQgb3Igbm8gaW5mbyBhdmFpbGFibGUgeWV0OgorCSAqIExPQ0FMX09VVC9tYW5nbGUgYW5kIExPQ0FMX09VVC9uYXQgZG9uJ3Qga25vdyBpZgorCSAqIHRoZSBkZXN0aW5hdGlvbiBkZXZpY2Ugd2lsbCBiZSBhIGJyaWRnZS4gKi8KKwlpZiAoIShuZl9icmlkZ2UgPSBza2ItPm5mX2JyaWRnZSkpIHsKKwkJLyogUmV0dXJuIE1BVENIIGlmIHRoZSBpbnZlcnQgZmxhZ3Mgb2YgdGhlIHVzZWQgb3B0aW9ucyBhcmUgb24gKi8KKwkJaWYgKChpbmZvLT5iaXRtYXNrICYgSVA2VF9QSFlTREVWX09QX0JSSURHRUQpICYmCisJCSAgICAhKGluZm8tPmludmVydCAmIElQNlRfUEhZU0RFVl9PUF9CUklER0VEKSkKKwkJCXJldHVybiBOT01BVENIOworCQlpZiAoKGluZm8tPmJpdG1hc2sgJiBJUDZUX1BIWVNERVZfT1BfSVNJTikgJiYKKwkJICAgICEoaW5mby0+aW52ZXJ0ICYgSVA2VF9QSFlTREVWX09QX0lTSU4pKQorCQkJcmV0dXJuIE5PTUFUQ0g7CisJCWlmICgoaW5mby0+Yml0bWFzayAmIElQNlRfUEhZU0RFVl9PUF9JU09VVCkgJiYKKwkJICAgICEoaW5mby0+aW52ZXJ0ICYgSVA2VF9QSFlTREVWX09QX0lTT1VUKSkKKwkJCXJldHVybiBOT01BVENIOworCQlpZiAoKGluZm8tPmJpdG1hc2sgJiBJUDZUX1BIWVNERVZfT1BfSU4pICYmCisJCSAgICAhKGluZm8tPmludmVydCAmIElQNlRfUEhZU0RFVl9PUF9JTikpCisJCQlyZXR1cm4gTk9NQVRDSDsKKwkJaWYgKChpbmZvLT5iaXRtYXNrICYgSVA2VF9QSFlTREVWX09QX09VVCkgJiYKKwkJICAgICEoaW5mby0+aW52ZXJ0ICYgSVA2VF9QSFlTREVWX09QX09VVCkpCisJCQlyZXR1cm4gTk9NQVRDSDsKKwkJcmV0dXJuIE1BVENIOworCX0KKworCS8qIFRoaXMgb25seSBtYWtlcyBzZW5zZSBpbiB0aGUgRk9SV0FSRCBhbmQgUE9TVFJPVVRJTkcgY2hhaW5zICovCisJaWYgKChpbmZvLT5iaXRtYXNrICYgSVA2VF9QSFlTREVWX09QX0JSSURHRUQpICYmCisJICAgICghIShuZl9icmlkZ2UtPm1hc2sgJiBCUk5GX0JSSURHRUQpIF4KKwkgICAgIShpbmZvLT5pbnZlcnQgJiBJUDZUX1BIWVNERVZfT1BfQlJJREdFRCkpKQorCQlyZXR1cm4gTk9NQVRDSDsKKworCWlmICgoaW5mby0+Yml0bWFzayAmIElQNlRfUEhZU0RFVl9PUF9JU0lOICYmCisJICAgICghbmZfYnJpZGdlLT5waHlzaW5kZXYgXiAhIShpbmZvLT5pbnZlcnQgJiBJUDZUX1BIWVNERVZfT1BfSVNJTikpKSB8fAorCSAgICAoaW5mby0+Yml0bWFzayAmIElQNlRfUEhZU0RFVl9PUF9JU09VVCAmJgorCSAgICAoIW5mX2JyaWRnZS0+cGh5c291dGRldiBeICEhKGluZm8tPmludmVydCAmIElQNlRfUEhZU0RFVl9PUF9JU09VVCkpKSkKKwkJcmV0dXJuIE5PTUFUQ0g7CisKKwlpZiAoIShpbmZvLT5iaXRtYXNrICYgSVA2VF9QSFlTREVWX09QX0lOKSkKKwkJZ290byBtYXRjaF9vdXRkZXY7CisJaW5kZXYgPSBuZl9icmlkZ2UtPnBoeXNpbmRldiA/IG5mX2JyaWRnZS0+cGh5c2luZGV2LT5uYW1lIDogbnVsbGRldm5hbWU7CisJZm9yIChpID0gMCwgcmV0ID0gMDsgaSA8IElGTkFNU0laL3NpemVvZih1bnNpZ25lZCBpbnQpOyBpKyspIHsKKwkJcmV0IHw9ICgoKGNvbnN0IHVuc2lnbmVkIGludCAqKWluZGV2KVtpXQorCQkJXiAoKGNvbnN0IHVuc2lnbmVkIGludCAqKWluZm8tPnBoeXNpbmRldilbaV0pCisJCQkmICgoY29uc3QgdW5zaWduZWQgaW50ICopaW5mby0+aW5fbWFzaylbaV07CisJfQorCisJaWYgKChyZXQgPT0gMCkgXiAhKGluZm8tPmludmVydCAmIElQNlRfUEhZU0RFVl9PUF9JTikpCisJCXJldHVybiBOT01BVENIOworCittYXRjaF9vdXRkZXY6CisJaWYgKCEoaW5mby0+Yml0bWFzayAmIElQNlRfUEhZU0RFVl9PUF9PVVQpKQorCQlyZXR1cm4gTUFUQ0g7CisJb3V0ZGV2ID0gbmZfYnJpZGdlLT5waHlzb3V0ZGV2ID8KKwkJIG5mX2JyaWRnZS0+cGh5c291dGRldi0+bmFtZSA6IG51bGxkZXZuYW1lOworCWZvciAoaSA9IDAsIHJldCA9IDA7IGkgPCBJRk5BTVNJWi9zaXplb2YodW5zaWduZWQgaW50KTsgaSsrKSB7CisJCXJldCB8PSAoKChjb25zdCB1bnNpZ25lZCBpbnQgKilvdXRkZXYpW2ldCisJCQleICgoY29uc3QgdW5zaWduZWQgaW50ICopaW5mby0+cGh5c291dGRldilbaV0pCisJCQkmICgoY29uc3QgdW5zaWduZWQgaW50ICopaW5mby0+b3V0X21hc2spW2ldOworCX0KKworCXJldHVybiAocmV0ICE9IDApIF4gIShpbmZvLT5pbnZlcnQgJiBJUDZUX1BIWVNERVZfT1BfT1VUKTsKK30KKworc3RhdGljIGludAorY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwLAorCQkgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAorCQkgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IGlwNnRfcGh5c2Rldl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCisJaWYgKG1hdGNoc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9waHlzZGV2X2luZm8pKSkKKwkJcmV0dXJuIDA7CisJaWYgKCEoaW5mby0+Yml0bWFzayAmIElQNlRfUEhZU0RFVl9PUF9NQVNLKSB8fAorCSAgICBpbmZvLT5iaXRtYXNrICYgfklQNlRfUEhZU0RFVl9PUF9NQVNLKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBpcDZ0X21hdGNoIHBoeXNkZXZfbWF0Y2ggPSB7CisJLm5hbWUJCT0gInBoeXNkZXYiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJnBoeXNkZXZfbWF0Y2gpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCWlwNnRfdW5yZWdpc3Rlcl9tYXRjaCgmcGh5c2Rldl9tYXRjaCk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ydC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTUyNmI3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfcnQuYwpAQCAtMCwwICsxLDMwMSBAQAorLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBST1VUSU5HIHBhcmFtZXRlcnMuICovCisKKy8qIChDKSAyMDAxLTIwMDIgQW5kcmFzIEtpcy1TemFibyA8a2lzemFAc2NoLmJtZS5odT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfcnQuaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJUHY2IFJUIG1hdGNoIik7CitNT0RVTEVfQVVUSE9SKCJBbmRyYXMgS2lzLVN6YWJvIDxraXN6YUBzY2guYm1lLmh1PiIpOworCisjaWYgMAorI2RlZmluZSBERUJVR1AgcHJpbnRrCisjZWxzZQorI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKy8qIFJldHVybnMgMSBpZiB0aGUgaWQgaXMgbWF0Y2hlZCBieSB0aGUgcmFuZ2UsIDAgb3RoZXJ3aXNlICovCitzdGF0aWMgaW5saW5lIGludAorc2Vnc2xlZnRfbWF0Y2godV9pbnQzMl90IG1pbiwgdV9pbnQzMl90IG1heCwgdV9pbnQzMl90IGlkLCBpbnQgaW52ZXJ0KQoreworICAgICAgIGludCByPTA7CisgICAgICAgREVCVUdQKCJydCBzZWdzbGVmdF9tYXRjaDolYyAweCV4IDw9IDB4JXggPD0gMHgleCIsaW52ZXJ0PyAnISc6JyAnLAorICAgICAgICAgICAgICBtaW4saWQsbWF4KTsKKyAgICAgICByPShpZCA+PSBtaW4gJiYgaWQgPD0gbWF4KSBeIGludmVydDsKKyAgICAgICBERUJVR1AoIiByZXN1bHQgJXNcbiIscj8gIlBBU1MiIDogIkZBSUxFRCIpOworICAgICAgIHJldHVybiByOworfQorCitzdGF0aWMgaW50CittYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKyAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKKyAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKyAgICAgIGludCAqaG90ZHJvcCkKK3sKKyAgICAgICBzdHJ1Y3QgaXB2Nl9ydF9oZHIgX3JvdXRlLCAqcmggPSBOVUxMOworICAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X3J0ICpydGluZm8gPSBtYXRjaGluZm87CisgICAgICAgdW5zaWduZWQgaW50IHRlbXA7CisgICAgICAgdW5zaWduZWQgaW50IGxlbjsKKyAgICAgICB1OCBuZXh0aGRyOworICAgICAgIHVuc2lnbmVkIGludCBwdHI7CisgICAgICAgdW5zaWduZWQgaW50IGhkcmxlbiA9IDA7CisgICAgICAgdW5zaWduZWQgaW50IHJldCA9IDA7CisgICAgICAgc3RydWN0IGluNl9hZGRyICphcCwgX2FkZHI7CisKKyAgICAgICAvKiB0eXBlIG9mIHRoZSAxc3QgZXh0aGRyICovCisgICAgICAgbmV4dGhkciA9IHNrYi0+bmguaXB2NmgtPm5leHRoZHI7CisgICAgICAgLyogcG9pbnRlciB0byB0aGUgMXN0IGV4dGhkciAqLworICAgICAgIHB0ciA9IHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisgICAgICAgLyogYXZhaWxhYmxlIGxlbmd0aCAqLworICAgICAgIGxlbiA9IHNrYi0+bGVuIC0gcHRyOworICAgICAgIHRlbXAgPSAwOworCisgICAgICAgIHdoaWxlIChpcDZ0X2V4dF9oZHIobmV4dGhkcikpIHsKKyAgICAgICAgICAgICAgIHN0cnVjdCBpcHY2X29wdF9oZHIgX2hkciwgKmhwOworCisgICAgICAgICAgICAgIERFQlVHUCgiaXB2Nl9ydCBoZWFkZXIgaXRlcmF0aW9uIFxuIik7CisKKyAgICAgICAgICAgICAgLyogSXMgdGhlcmUgZW5vdWdoIHNwYWNlIGZvciB0aGUgbmV4dCBleHQgaGVhZGVyPyAqLworICAgICAgICAgICAgICAgIGlmIChsZW4gPCAoaW50KXNpemVvZihzdHJ1Y3QgaXB2Nl9vcHRfaGRyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAvKiBObyBtb3JlIGV4dGhkciAtPiBldmFsdWF0ZSAqLworICAgICAgICAgICAgICAgIGlmIChuZXh0aGRyID09IE5FWFRIRFJfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgLyogRVNQIC0+IGV2YWx1YXRlICovCisgICAgICAgICAgICAgICAgaWYgKG5leHRoZHIgPT0gTkVYVEhEUl9FU1ApIHsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKwkgICAgICBocCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHB0ciwgc2l6ZW9mKF9oZHIpLCAmX2hkcik7CisJICAgICAgQlVHX09OKGhwID09IE5VTEwpOworCisgICAgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgaGVhZGVyIGxlbmd0aCAqLworICAgICAgICAgICAgICAgIGlmIChuZXh0aGRyID09IE5FWFRIRFJfRlJBR01FTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhkcmxlbiA9IDg7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0aGRyID09IE5FWFRIRFJfQVVUSCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGhkcmxlbiA9IChocC0+aGRybGVuKzIpPDwyOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGhkcmxlbiA9IGlwdjZfb3B0bGVuKGhwKTsKKworICAgICAgICAgICAgICAvKiBST1VUSU5HIC0+IGV2YWx1YXRlICovCisgICAgICAgICAgICAgICAgaWYgKG5leHRoZHIgPT0gTkVYVEhEUl9ST1VUSU5HKSB7CisgICAgICAgICAgICAgICAgICAgICB0ZW1wIHw9IE1BU0tfUk9VVElORzsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAvKiBzZXQgdGhlIGZsYWcgKi8KKyAgICAgICAgICAgICAgc3dpdGNoIChuZXh0aGRyKXsKKyAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVYVEhEUl9IT1A6CisgICAgICAgICAgICAgICAgICAgICBjYXNlIE5FWFRIRFJfUk9VVElORzoKKyAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVYVEhEUl9GUkFHTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVYVEhEUl9BVVRIOgorICAgICAgICAgICAgICAgICAgICAgY2FzZSBORVhUSERSX0RFU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHUCgiaXB2Nl9ydCBtYXRjaDogdW5rbm93biBuZXh0aGVhZGVyICV1XG4iLG5leHRoZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBuZXh0aGRyID0gaHAtPm5leHRoZHI7CisgICAgICAgICAgICAgICAgbGVuIC09IGhkcmxlbjsKKyAgICAgICAgICAgICAgICBwdHIgKz0gaGRybGVuOworCQlpZiAoIHB0ciA+IHNrYi0+bGVuICkgeworCQkJREVCVUdQKCJpcHY2X3J0OiBuZXcgcG9pbnRlciBpcyB0b28gbGFyZ2UhIFxuIik7CisJCQlicmVhazsKKwkJfQorICAgICAgICB9CisKKyAgICAgICAvKiBST1VUSU5HIGhlYWRlciBub3QgZm91bmQgKi8KKyAgICAgICBpZiAoIHRlbXAgIT0gTUFTS19ST1VUSU5HICkgcmV0dXJuIDA7CisKKyAgICAgICBpZiAobGVuIDwgKGludClzaXplb2Yoc3RydWN0IGlwdjZfcnRfaGRyKSl7CisJICAgICAgICpob3Rkcm9wID0gMTsKKyAgICAgICAJCXJldHVybiAwOworICAgICAgIH0KKworICAgICAgIGlmIChsZW4gPCBoZHJsZW4peworCSAgICAgICAvKiBQY2tldCBzbWFsbGVyIHRoYW4gaXRzIGxlbmd0aCBmaWVsZCAqLworICAgICAgIAkJcmV0dXJuIDA7CisgICAgICAgfQorCisgICAgICAgcmggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwdHIsIHNpemVvZihfcm91dGUpLCAmX3JvdXRlKTsKKyAgICAgICBCVUdfT04ocmggPT0gTlVMTCk7CisKKyAgICAgICBERUJVR1AoIklQdjYgUlQgTEVOICV1ICV1ICIsIGhkcmxlbiwgcmgtPmhkcmxlbik7CisgICAgICAgREVCVUdQKCJUWVBFICUwNFggIiwgcmgtPnR5cGUpOworICAgICAgIERFQlVHUCgiU0dTX0xFRlQgJXUgJTAyWFxuIiwgcmgtPnNlZ21lbnRzX2xlZnQsIHJoLT5zZWdtZW50c19sZWZ0KTsKKworICAgICAgIERFQlVHUCgiSVB2NiBSVCBzZWdzbGVmdCAlMDJYICIsCisgICAgICAgCQkoc2Vnc2xlZnRfbWF0Y2gocnRpbmZvLT5zZWdzbGVmdFswXSwgcnRpbmZvLT5zZWdzbGVmdFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJoLT5zZWdtZW50c19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgISEocnRpbmZvLT5pbnZmbGFncyAmIElQNlRfUlRfSU5WX1NHUykpKSk7CisgICAgICAgREVCVUdQKCJ0eXBlICUwMlggJTAyWCAlMDJYICIsCisgICAgICAgCQlydGluZm8tPnJ0X3R5cGUsIHJoLT50eXBlLCAKKyAgICAgICAJCSghKHJ0aW5mby0+ZmxhZ3MgJiBJUDZUX1JUX1RZUCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgocnRpbmZvLT5ydF90eXBlID09IHJoLT50eXBlKSBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAhIShydGluZm8tPmludmZsYWdzICYgSVA2VF9SVF9JTlZfVFlQKSkpKTsKKyAgICAgICBERUJVR1AoImxlbiAlMDJYICUwNFggJTAyWCAiLAorICAgICAgIAkJcnRpbmZvLT5oZHJsZW4sIGhkcmxlbiwKKyAgICAgICAJCSghKHJ0aW5mby0+ZmxhZ3MgJiBJUDZUX1JUX0xFTikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgocnRpbmZvLT5oZHJsZW4gPT0gaGRybGVuKSBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAhIShydGluZm8tPmludmZsYWdzICYgSVA2VF9SVF9JTlZfTEVOKSkpKTsKKyAgICAgICBERUJVR1AoInJlcyAlMDJYICUwMlggJTAyWCAiLCAKKyAgICAgICAJCShydGluZm8tPmZsYWdzICYgSVA2VF9SVF9SRVMpLCAoKHN0cnVjdCBydDBfaGRyICopcmgpLT5iaXRtYXAsCisgICAgICAgCQkhKChydGluZm8tPmZsYWdzICYgSVA2VF9SVF9SRVMpICYmICgoKHN0cnVjdCBydDBfaGRyICopcmgpLT5iaXRtYXApKSk7CisKKyAgICAgICByZXQgPSAocmggIT0gTlVMTCkKKyAgICAgICAJCSYmCisgICAgICAgCQkoc2Vnc2xlZnRfbWF0Y2gocnRpbmZvLT5zZWdzbGVmdFswXSwgcnRpbmZvLT5zZWdzbGVmdFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJoLT5zZWdtZW50c19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgISEocnRpbmZvLT5pbnZmbGFncyAmIElQNlRfUlRfSU5WX1NHUykpKQorCQkmJgorCSAgICAgIAkoIShydGluZm8tPmZsYWdzICYgSVA2VF9SVF9MRU4pIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHJ0aW5mby0+aGRybGVuID09IGhkcmxlbikgXgorICAgICAgICAgICAgICAgICAgICAgICAgICAgISEocnRpbmZvLT5pbnZmbGFncyAmIElQNlRfUlRfSU5WX0xFTikpKQorCQkmJgorICAgICAgIAkJKCEocnRpbmZvLT5mbGFncyAmIElQNlRfUlRfVFlQKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKChydGluZm8tPnJ0X3R5cGUgPT0gcmgtPnR5cGUpIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICEhKHJ0aW5mby0+aW52ZmxhZ3MgJiBJUDZUX1JUX0lOVl9UWVApKSk7CisKKwlpZiAocmV0ICYmIChydGluZm8tPmZsYWdzICYgSVA2VF9SVF9SRVMpKSB7CisJCXVfaW50MzJfdCAqYnAsIF9iaXRtYXA7CisJCWJwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwKKwkJCQkJcHRyICsgb2Zmc2V0b2Yoc3RydWN0IHJ0MF9oZHIsIGJpdG1hcCksCisJCQkJCXNpemVvZihfYml0bWFwKSwgJl9iaXRtYXApOworCisJCXJldCA9ICgqYnAgPT0gMCk7CisJfQorCisJREVCVUdQKCIjJWQgIixydGluZm8tPmFkZHJucik7CisgICAgICAgaWYgKCAhKHJ0aW5mby0+ZmxhZ3MgJiBJUDZUX1JUX0ZTVCkgKXsKKwkgICAgICAgcmV0dXJuIHJldDsKKwl9IGVsc2UgaWYgKHJ0aW5mby0+ZmxhZ3MgJiBJUDZUX1JUX0ZTVF9OU1RSSUNUKSB7CisJCURFQlVHUCgiTm90IHN0cmljdCAiKTsKKwkJaWYgKCBydGluZm8tPmFkZHJuciA+ICh1bnNpZ25lZCBpbnQpKChoZHJsZW4tOCkvMTYpICl7CisJCQlERUJVR1AoIlRoZXJlIGlzbid0IGVub3VnaCBzcGFjZVxuIik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXVuc2lnbmVkIGludCBpID0gMDsKKworCQkJREVCVUdQKCIjJWQgIixydGluZm8tPmFkZHJucik7CisJCQlmb3IodGVtcD0wOyB0ZW1wPCh1bnNpZ25lZCBpbnQpKChoZHJsZW4tOCkvMTYpOyB0ZW1wKyspeworCQkJCWFwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwKKwkJCQkJCQlwdHIKKwkJCQkJCQkrIHNpemVvZihzdHJ1Y3QgcnQwX2hkcikKKwkJCQkJCQkrIHRlbXAgKiBzaXplb2YoX2FkZHIpLAorCQkJCQkJCXNpemVvZihfYWRkciksCisJCQkJCQkJJl9hZGRyKTsKKworCQkJCUJVR19PTihhcCA9PSBOVUxMKTsKKworCQkJCWlmIChpcHY2X2FkZHJfZXF1YWwoYXAsICZydGluZm8tPmFkZHJzW2ldKSkgeworCQkJCQlERUJVR1AoImk9JWQgdGVtcD0lZDtcbiIsaSx0ZW1wKTsKKwkJCQkJaSsrOworCQkJCX0KKwkJCQlpZiAoaT09cnRpbmZvLT5hZGRybnIpIGJyZWFrOworCQkJfQorCQkJREVCVUdQKCJpPSVkICMlZFxuIiwgaSwgcnRpbmZvLT5hZGRybnIpOworCQkJaWYgKGkgPT0gcnRpbmZvLT5hZGRybnIpCisJCQkJcmV0dXJuIHJldDsKKwkJCWVsc2UgcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQlERUJVR1AoIlN0cmljdCAiKTsKKwkJaWYgKCBydGluZm8tPmFkZHJuciA+ICh1bnNpZ25lZCBpbnQpKChoZHJsZW4tOCkvMTYpICl7CisJCQlERUJVR1AoIlRoZXJlIGlzbid0IGVub3VnaCBzcGFjZVxuIik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCURFQlVHUCgiIyVkICIscnRpbmZvLT5hZGRybnIpOworCQkJZm9yKHRlbXA9MDsgdGVtcDxydGluZm8tPmFkZHJucjsgdGVtcCsrKXsKKwkJCQlhcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsCisJCQkJCQkJcHRyCisJCQkJCQkJKyBzaXplb2Yoc3RydWN0IHJ0MF9oZHIpCisJCQkJCQkJKyB0ZW1wICogc2l6ZW9mKF9hZGRyKSwKKwkJCQkJCQlzaXplb2YoX2FkZHIpLAorCQkJCQkJCSZfYWRkcik7CisJCQkJQlVHX09OKGFwID09IE5VTEwpOworCisJCQkJaWYgKCFpcHY2X2FkZHJfZXF1YWwoYXAsICZydGluZm8tPmFkZHJzW3RlbXBdKSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlERUJVR1AoInRlbXA9JWQgIyVkXG4iLCB0ZW1wLCBydGluZm8tPmFkZHJucik7CisJCQlpZiAoKHRlbXAgPT0gcnRpbmZvLT5hZGRybnIpICYmICh0ZW1wID09ICh1bnNpZ25lZCBpbnQpKChoZHJsZW4tOCkvMTYpKSkKKwkJCQlyZXR1cm4gcmV0OworCQkJZWxzZSByZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCitzdGF0aWMgaW50CitjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKyAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwLAorICAgICAgICAgIHZvaWQgKm1hdGNoaW5mbywKKyAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hpbmZvc2l6ZSwKKyAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworICAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X3J0ICpydGluZm8gPSBtYXRjaGluZm87CisKKyAgICAgICBpZiAobWF0Y2hpbmZvc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9ydCkpKSB7CisgICAgICAgICAgICAgIERFQlVHUCgiaXA2dF9ydDogbWF0Y2hzaXplICV1ICE9ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIG1hdGNoaW5mb3NpemUsIElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X3J0KSkpOworICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICB9CisgICAgICAgaWYgKHJ0aW5mby0+aW52ZmxhZ3MgJiB+SVA2VF9SVF9JTlZfTUFTSykgeworICAgICAgICAgICAgICBERUJVR1AoImlwNnRfcnQ6IHVua25vd24gZmxhZ3MgJVhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcnRpbmZvLT5pbnZmbGFncyk7CisgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgIH0KKyAgICAgICBpZiAoIChydGluZm8tPmZsYWdzICYgKElQNlRfUlRfUkVTfElQNlRfUlRfRlNUX01BU0spKSAmJiAKKwkJICAgICAgICghKHJ0aW5mby0+ZmxhZ3MgJiBJUDZUX1JUX1RZUCkgfHwgCisJCSAgICAgICAocnRpbmZvLT5ydF90eXBlICE9IDApIHx8IAorCQkgICAgICAgKHJ0aW5mby0+aW52ZmxhZ3MgJiBJUDZUX1JUX0lOVl9UWVApKSApIHsKKwkgICAgICBERUJVR1AoImAtLXJ0LXR5cGUgMCcgcmVxdWlyZWQgYmVmb3JlIGAtLXJ0LTAtKiciKTsKKyAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgfQorCisgICAgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXA2dF9tYXRjaCBydF9tYXRjaCA9IHsKKwkubmFtZQkJPSAicnQiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisgICAgICAgcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJnJ0X21hdGNoKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXAodm9pZCkKK3sKKyAgICAgICBpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goJnJ0X21hdGNoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChjbGVhbnVwKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9maWx0ZXIuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9maWx0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzAwMjg2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX2ZpbHRlci5jCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogVGhpcyBpcyB0aGUgMTk5OSByZXdyaXRlIG9mIElQIEZpcmV3YWxsaW5nLCBhaW1pbmcgZm9yIGtlcm5lbCAyLjMueC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgUGF1bCBgUnVzdHknIFJ1c3NlbGwgJiBNaWNoYWVsIEouIE5ldWxpbmcKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlwNnRhYmxlcyBmaWx0ZXIgdGFibGUiKTsKKworI2RlZmluZSBGSUxURVJfVkFMSURfSE9PS1MgKCgxIDw8IE5GX0lQNl9MT0NBTF9JTikgfCAoMSA8PCBORl9JUDZfRk9SV0FSRCkgfCAoMSA8PCBORl9JUDZfTE9DQUxfT1VUKSkKKworLyogU3RhbmRhcmQgZW50cnkuICovCitzdHJ1Y3QgaXA2dF9zdGFuZGFyZAoreworCXN0cnVjdCBpcDZ0X2VudHJ5IGVudHJ5OworCXN0cnVjdCBpcDZ0X3N0YW5kYXJkX3RhcmdldCB0YXJnZXQ7Cit9OworCitzdHJ1Y3QgaXA2dF9lcnJvcl90YXJnZXQKK3sKKwlzdHJ1Y3QgaXA2dF9lbnRyeV90YXJnZXQgdGFyZ2V0OworCWNoYXIgZXJyb3JuYW1lW0lQNlRfRlVOQ1RJT05fTUFYTkFNRUxFTl07Cit9OworCitzdHJ1Y3QgaXA2dF9lcnJvcgoreworCXN0cnVjdCBpcDZ0X2VudHJ5IGVudHJ5OworCXN0cnVjdCBpcDZ0X2Vycm9yX3RhcmdldCB0YXJnZXQ7Cit9OworCitzdGF0aWMgc3RydWN0Cit7CisJc3RydWN0IGlwNnRfcmVwbGFjZSByZXBsOworCXN0cnVjdCBpcDZ0X3N0YW5kYXJkIGVudHJpZXNbM107CisJc3RydWN0IGlwNnRfZXJyb3IgdGVybTsKK30gaW5pdGlhbF90YWJsZSBfX2luaXRkYXRhCis9IHsgeyAiZmlsdGVyIiwgRklMVEVSX1ZBTElEX0hPT0tTLCA0LAorICAgICAgc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSAqIDMgKyBzaXplb2Yoc3RydWN0IGlwNnRfZXJyb3IpLAorICAgICAgeyBbTkZfSVA2X0xPQ0FMX0lOXSA9IDAsCisJW05GX0lQNl9GT1JXQVJEXSA9IHNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZCksCisJW05GX0lQNl9MT0NBTF9PVVRdID0gc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSAqIDIgfSwKKyAgICAgIHsgW05GX0lQNl9MT0NBTF9JTl0gPSAwLAorCVtORl9JUDZfRk9SV0FSRF0gPSBzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmQpLAorCVtORl9JUDZfTE9DQUxfT1VUXSA9IHNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZCkgKiAyIH0sCisgICAgICAwLCBOVUxMLCB7IH0gfSwKKyAgICB7CisJICAgIC8qIExPQ0FMX0lOICovCisJICAgIHsgeyB7IHsgeyB7IDAgfSB9IH0sIHsgeyB7IDAgfSB9IH0sIHsgeyB7IDAgfSB9IH0sIHsgeyB7IDAgfSB9IH0sICIiLCAiIiwgeyAwIH0sIHsgMCB9LCAwLCAwLCAwIH0sCisJCTAsCisJCXNpemVvZihzdHJ1Y3QgaXA2dF9lbnRyeSksCisJCXNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZCksCisJCTAsIHsgMCwgMCB9LCB7IH0gfSwKKwkgICAgICB7IHsgeyB7IElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkX3RhcmdldCkpLCAiIiB9IH0sIHsgfSB9LAorCQktTkZfQUNDRVBUIC0gMSB9IH0sCisJICAgIC8qIEZPUldBUkQgKi8KKwkgICAgeyB7IHsgeyB7IHsgMCB9IH0gfSwgeyB7IHsgMCB9IH0gfSwgeyB7IHsgMCB9IH0gfSwgeyB7IHsgMCB9IH0gfSwgIiIsICIiLCB7IDAgfSwgeyAwIH0sIDAsIDAsIDAgfSwKKwkJMCwKKwkJc2l6ZW9mKHN0cnVjdCBpcDZ0X2VudHJ5KSwKKwkJc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSwKKwkJMCwgeyAwLCAwIH0sIHsgfSB9LAorCSAgICAgIHsgeyB7IHsgSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmRfdGFyZ2V0KSksICIiIH0gfSwgeyB9IH0sCisJCS1ORl9BQ0NFUFQgLSAxIH0gfSwKKwkgICAgLyogTE9DQUxfT1VUICovCisJICAgIHsgeyB7IHsgeyB7IDAgfSB9IH0sIHsgeyB7IDAgfSB9IH0sIHsgeyB7IDAgfSB9IH0sIHsgeyB7IDAgfSB9IH0sICIiLCAiIiwgeyAwIH0sIHsgMCB9LCAwLCAwLCAwIH0sCisJCTAsCisJCXNpemVvZihzdHJ1Y3QgaXA2dF9lbnRyeSksCisJCXNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZCksCisJCTAsIHsgMCwgMCB9LCB7IH0gfSwKKwkgICAgICB7IHsgeyB7IElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkX3RhcmdldCkpLCAiIiB9IH0sIHsgfSB9LAorCQktTkZfQUNDRVBUIC0gMSB9IH0KKyAgICB9LAorICAgIC8qIEVSUk9SICovCisgICAgeyB7IHsgeyB7IHsgMCB9IH0gfSwgeyB7IHsgMCB9IH0gfSwgeyB7IHsgMCB9IH0gfSwgeyB7IHsgMCB9IH0gfSwgIiIsICIiLCB7IDAgfSwgeyAwIH0sIDAsIDAsIDAgfSwKKwkwLAorCXNpemVvZihzdHJ1Y3QgaXA2dF9lbnRyeSksCisJc2l6ZW9mKHN0cnVjdCBpcDZ0X2Vycm9yKSwKKwkwLCB7IDAsIDAgfSwgeyB9IH0sCisgICAgICB7IHsgeyB7IElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X2Vycm9yX3RhcmdldCkpLCBJUDZUX0VSUk9SX1RBUkdFVCB9IH0sCisJICB7IH0gfSwKKwkiRVJST1IiCisgICAgICB9CisgICAgfQorfTsKKworc3RhdGljIHN0cnVjdCBpcDZ0X3RhYmxlIHBhY2tldF9maWx0ZXIgPSB7CisJLm5hbWUJCT0gImZpbHRlciIsCisJLnZhbGlkX2hvb2tzCT0gRklMVEVSX1ZBTElEX0hPT0tTLAorCS5sb2NrCQk9IFJXX0xPQ0tfVU5MT0NLRUQsCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworLyogVGhlIHdvcmsgY29tZXMgaW4gaGVyZSBmcm9tIG5ldGZpbHRlci5jLiAqLworc3RhdGljIHVuc2lnbmVkIGludAoraXA2dF9ob29rKHVuc2lnbmVkIGludCBob29rLAorCSBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCit7CisJcmV0dXJuIGlwNnRfZG9fdGFibGUocHNrYiwgaG9vaywgaW4sIG91dCwgJnBhY2tldF9maWx0ZXIsIE5VTEwpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitpcDZ0X2xvY2FsX291dF9ob29rKHVuc2lnbmVkIGludCBob29rLAorCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkJICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCit7CisjaWYgMAorCS8qIHJvb3QgaXMgcGxheWluZyB3aXRoIHJhdyBzb2NrZXRzLiAqLworCWlmICgoKnBza2IpLT5sZW4gPCBzaXplb2Yoc3RydWN0IGlwaGRyKQorCSAgICB8fCAoKnBza2IpLT5uaC5pcGgtPmlobCAqIDQgPCBzaXplb2Yoc3RydWN0IGlwaGRyKSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKCJpcDZ0X2hvb2s6IGhhcHB5IGNyYWNraW5nLlxuIik7CisJCXJldHVybiBORl9BQ0NFUFQ7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gaXA2dF9kb190YWJsZShwc2tiLCBob29rLCBpbiwgb3V0LCAmcGFja2V0X2ZpbHRlciwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZfaG9va19vcHMgaXA2dF9vcHNbXSA9IHsKKwl7CisJCS5ob29rCQk9IGlwNnRfaG9vaywKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkucGYJCT0gUEZfSU5FVDYsCisJCS5ob29rbnVtCT0gTkZfSVA2X0xPQ0FMX0lOLAorCQkucHJpb3JpdHkJPSBORl9JUDZfUFJJX0ZJTFRFUiwKKwl9LAorCXsKKwkJLmhvb2sJCT0gaXA2dF9ob29rLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5wZgkJPSBQRl9JTkVUNiwKKwkJLmhvb2tudW0JPSBORl9JUDZfRk9SV0FSRCwKKwkJLnByaW9yaXR5CT0gTkZfSVA2X1BSSV9GSUxURVIsCisJfSwKKwl7CisJCS5ob29rCQk9IGlwNnRfbG9jYWxfb3V0X2hvb2ssCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkJLnBmCQk9IFBGX0lORVQ2LAorCQkuaG9va251bQk9IE5GX0lQNl9MT0NBTF9PVVQsCisJCS5wcmlvcml0eQk9IE5GX0lQNl9QUklfRklMVEVSLAorCX0sCit9OworCisvKiBEZWZhdWx0IHRvIGZvcndhcmQgYmVjYXVzZSBJIGdvdCB0b28gbXVjaCBtYWlsIGFscmVhZHkuICovCitzdGF0aWMgaW50IGZvcndhcmQgPSBORl9BQ0NFUFQ7Cittb2R1bGVfcGFyYW0oZm9yd2FyZCwgYm9vbCwgMDAwMCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKGZvcndhcmQgPCAwIHx8IGZvcndhcmQgPiBORl9NQVhfVkVSRElDVCkgeworCQlwcmludGsoImlwdGFibGVzIGZvcndhcmQgbXVzdCBiZSAwIG9yIDFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBFbnRyeSAxIGlzIHRoZSBGT1JXQVJEIGhvb2sgKi8KKwlpbml0aWFsX3RhYmxlLmVudHJpZXNbMV0udGFyZ2V0LnZlcmRpY3QgPSAtZm9yd2FyZCAtIDE7CisKKwkvKiBSZWdpc3RlciB0YWJsZSAqLworCXJldCA9IGlwNnRfcmVnaXN0ZXJfdGFibGUoJnBhY2tldF9maWx0ZXIsICZpbml0aWFsX3RhYmxlLnJlcGwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogUmVnaXN0ZXIgaG9va3MgKi8KKwlyZXQgPSBuZl9yZWdpc3Rlcl9ob29rKCZpcDZ0X29wc1swXSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gY2xlYW51cF90YWJsZTsKKworCXJldCA9IG5mX3JlZ2lzdGVyX2hvb2soJmlwNnRfb3BzWzFdKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBjbGVhbnVwX2hvb2swOworCisJcmV0ID0gbmZfcmVnaXN0ZXJfaG9vaygmaXA2dF9vcHNbMl0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGNsZWFudXBfaG9vazE7CisKKwlyZXR1cm4gcmV0OworCisgY2xlYW51cF9ob29rMToKKwluZl91bnJlZ2lzdGVyX2hvb2soJmlwNnRfb3BzWzFdKTsKKyBjbGVhbnVwX2hvb2swOgorCW5mX3VucmVnaXN0ZXJfaG9vaygmaXA2dF9vcHNbMF0pOworIGNsZWFudXBfdGFibGU6CisJaXA2dF91bnJlZ2lzdGVyX3RhYmxlKCZwYWNrZXRfZmlsdGVyKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGlwNnRfb3BzKS9zaXplb2Yoc3RydWN0IG5mX2hvb2tfb3BzKTsgaSsrKQorCQluZl91bnJlZ2lzdGVyX2hvb2soJmlwNnRfb3BzW2ldKTsKKworCWlwNnRfdW5yZWdpc3Rlcl90YWJsZSgmcGFja2V0X2ZpbHRlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfbWFuZ2xlLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfbWFuZ2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVjMWU2ZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9tYW5nbGUuYwpAQCAtMCwwICsxLDI4NyBAQAorLyoKKyAqIElQdjYgcGFja2V0IG1hbmdsaW5nIHRhYmxlLCBhIHBvcnQgb2YgdGhlIElQdjQgbWFuZ2xlIHRhYmxlIHRvIElQdjYKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEV4dGVuZGVkIHRvIGFsbCBmaXZlIG5ldGZpbHRlciBob29rcyBieSBCcmFkIENoYXBtYW4gJiBIYXJhbGQgV2VsdGUKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXA2dGFibGVzIG1hbmdsZSB0YWJsZSIpOworCisjZGVmaW5lIE1BTkdMRV9WQUxJRF9IT09LUyAoKDEgPDwgTkZfSVA2X1BSRV9ST1VUSU5HKSB8IFwKKwkJCSAgICAoMSA8PCBORl9JUDZfTE9DQUxfSU4pIHwgXAorCQkJICAgICgxIDw8IE5GX0lQNl9GT1JXQVJEKSB8IFwKKwkJCSAgICAoMSA8PCBORl9JUDZfTE9DQUxfT1VUKSB8IFwKKwkJCSAgICAoMSA8PCBORl9JUDZfUE9TVF9ST1VUSU5HKSkKKworI2lmIDAKKyNkZWZpbmUgREVCVUdQKHgsIGFyZ3MuLi4pCXByaW50ayhLRVJOX0RFQlVHIHgsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBERUJVR1AoeCwgYXJncy4uLikKKyNlbmRpZgorCisvKiBTdGFuZGFyZCBlbnRyeS4gKi8KK3N0cnVjdCBpcDZ0X3N0YW5kYXJkCit7CisJc3RydWN0IGlwNnRfZW50cnkgZW50cnk7CisJc3RydWN0IGlwNnRfc3RhbmRhcmRfdGFyZ2V0IHRhcmdldDsKK307CisKK3N0cnVjdCBpcDZ0X2Vycm9yX3RhcmdldAoreworCXN0cnVjdCBpcDZ0X2VudHJ5X3RhcmdldCB0YXJnZXQ7CisJY2hhciBlcnJvcm5hbWVbSVA2VF9GVU5DVElPTl9NQVhOQU1FTEVOXTsKK307CisKK3N0cnVjdCBpcDZ0X2Vycm9yCit7CisJc3RydWN0IGlwNnRfZW50cnkgZW50cnk7CisJc3RydWN0IGlwNnRfZXJyb3JfdGFyZ2V0IHRhcmdldDsKK307CisKK3N0YXRpYyBzdHJ1Y3QKK3sKKwlzdHJ1Y3QgaXA2dF9yZXBsYWNlIHJlcGw7CisJc3RydWN0IGlwNnRfc3RhbmRhcmQgZW50cmllc1s1XTsKKwlzdHJ1Y3QgaXA2dF9lcnJvciB0ZXJtOworfSBpbml0aWFsX3RhYmxlIF9faW5pdGRhdGEKKz0geyB7ICJtYW5nbGUiLCBNQU5HTEVfVkFMSURfSE9PS1MsIDYsCisgICAgICBzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmQpICogNSArIHNpemVvZihzdHJ1Y3QgaXA2dF9lcnJvciksCisgICAgICB7IFtORl9JUDZfUFJFX1JPVVRJTkddIAk9IDAsCisJW05GX0lQNl9MT0NBTF9JTl0JPSBzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmQpLAorCVtORl9JUDZfRk9SV0FSRF0JPSBzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmQpICogMiwKKwlbTkZfSVA2X0xPQ0FMX09VVF0gCT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSAqIDMsCisJW05GX0lQNl9QT1NUX1JPVVRJTkddCT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSAqIDR9LAorICAgICAgeyBbTkZfSVA2X1BSRV9ST1VUSU5HXSAJPSAwLAorCVtORl9JUDZfTE9DQUxfSU5dCT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSwKKwlbTkZfSVA2X0ZPUldBUkRdCT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSAqIDIsCisJW05GX0lQNl9MT0NBTF9PVVRdIAk9IHNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZCkgKiAzLAorCVtORl9JUDZfUE9TVF9ST1VUSU5HXQk9IHNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZCkgKiA0fSwKKyAgICAgIDAsIE5VTEwsIHsgfSB9LAorICAgIHsKKwkgICAgLyogUFJFX1JPVVRJTkcgKi8KKyAgICAgICAgICAgIHsgeyB7IHsgeyB7IDAgfSB9IH0sIHsgeyB7IDAgfSB9IH0sIHsgeyB7IDAgfSB9IH0sIHsgeyB7IDAgfSB9IH0sICIiLCAiIiwgeyAwIH0sIHsgMCB9LCAwLCAwLCAwIH0sCisJCTAsCisJCXNpemVvZihzdHJ1Y3QgaXA2dF9lbnRyeSksCisJCXNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZCksCisJCTAsIHsgMCwgMCB9LCB7IH0gfSwKKwkgICAgICB7IHsgeyB7IElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkX3RhcmdldCkpLCAiIiB9IH0sIHsgfSB9LAorCQktTkZfQUNDRVBUIC0gMSB9IH0sCisJICAgIC8qIExPQ0FMX0lOICovCisgICAgICAgICAgICB7IHsgeyB7IHsgeyAwIH0gfSB9LCB7IHsgeyAwIH0gfSB9LCB7IHsgeyAwIH0gfSB9LCB7IHsgeyAwIH0gfSB9LCAiIiwgIiIsIHsgMCB9LCB7IDAgfSwgMCwgMCwgMCB9LAorCQkwLAorCQlzaXplb2Yoc3RydWN0IGlwNnRfZW50cnkpLAorCQlzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmQpLAorCQkwLCB7IDAsIDAgfSwgeyB9IH0sCisJICAgICAgeyB7IHsgeyBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZF90YXJnZXQpKSwgIiIgfSB9LCB7IH0gfSwKKwkJLU5GX0FDQ0VQVCAtIDEgfSB9LAorCSAgICAvKiBGT1JXQVJEICovCisgICAgICAgICAgICB7IHsgeyB7IHsgeyAwIH0gfSB9LCB7IHsgeyAwIH0gfSB9LCB7IHsgeyAwIH0gfSB9LCB7IHsgeyAwIH0gfSB9LCAiIiwgIiIsIHsgMCB9LCB7IDAgfSwgMCwgMCwgMCB9LAorCQkwLAorCQlzaXplb2Yoc3RydWN0IGlwNnRfZW50cnkpLAorCQlzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmQpLAorCQkwLCB7IDAsIDAgfSwgeyB9IH0sCisJICAgICAgeyB7IHsgeyBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZF90YXJnZXQpKSwgIiIgfSB9LCB7IH0gfSwKKwkJLU5GX0FDQ0VQVCAtIDEgfSB9LAorCSAgICAvKiBMT0NBTF9PVVQgKi8KKyAgICAgICAgICAgIHsgeyB7IHsgeyB7IDAgfSB9IH0sIHsgeyB7IDAgfSB9IH0sIHsgeyB7IDAgfSB9IH0sIHsgeyB7IDAgfSB9IH0sICIiLCAiIiwgeyAwIH0sIHsgMCB9LCAwLCAwLCAwIH0sCisJCTAsCisJCXNpemVvZihzdHJ1Y3QgaXA2dF9lbnRyeSksCisJCXNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZCksCisJCTAsIHsgMCwgMCB9LCB7IH0gfSwKKwkgICAgICB7IHsgeyB7IElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkX3RhcmdldCkpLCAiIiB9IH0sIHsgfSB9LAorCQktTkZfQUNDRVBUIC0gMSB9IH0sCisJICAgIC8qIFBPU1RfUk9VVElORyAqLworCSAgICB7IHsgeyB7IHsgeyAwIH0gfSB9LCB7IHsgeyAwIH0gfSB9LCB7IHsgeyAwIH0gfSB9LCB7IHsgeyAwIH0gfSB9LCAiIiwgIiIsIHsgMCB9LCB7IDAgfSwgMCwgMCwgMCB9LAorCQkwLAorCQlzaXplb2Yoc3RydWN0IGlwNnRfZW50cnkpLAorCQlzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmQpLAorCQkwLCB7IDAsIDAgfSwgeyB9IH0sCisJICAgICAgeyB7IHsgeyBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZF90YXJnZXQpKSwgIiIgfSB9LCB7IH0gfSwKKwkJLU5GX0FDQ0VQVCAtIDEgfSB9CisgICAgfSwKKyAgICAvKiBFUlJPUiAqLworICAgIHsgeyB7IHsgeyB7IDAgfSB9IH0sIHsgeyB7IDAgfSB9IH0sIHsgeyB7IDAgfSB9IH0sIHsgeyB7IDAgfSB9IH0sICIiLCAiIiwgeyAwIH0sIHsgMCB9LCAwLCAwLCAwIH0sCisJMCwKKwlzaXplb2Yoc3RydWN0IGlwNnRfZW50cnkpLAorCXNpemVvZihzdHJ1Y3QgaXA2dF9lcnJvciksCisJMCwgeyAwLCAwIH0sIHsgfSB9LAorICAgICAgeyB7IHsgeyBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9lcnJvcl90YXJnZXQpKSwgSVA2VF9FUlJPUl9UQVJHRVQgfSB9LAorCSAgeyB9IH0sCisJIkVSUk9SIgorICAgICAgfQorICAgIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaXA2dF90YWJsZSBwYWNrZXRfbWFuZ2xlciA9IHsKKwkubmFtZQkJPSAibWFuZ2xlIiwKKwkudmFsaWRfaG9va3MJPSBNQU5HTEVfVkFMSURfSE9PS1MsCisJLmxvY2sJCT0gUldfTE9DS19VTkxPQ0tFRCwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCisvKiBUaGUgd29yayBjb21lcyBpbiBoZXJlIGZyb20gbmV0ZmlsdGVyLmMuICovCitzdGF0aWMgdW5zaWduZWQgaW50CitpcDZ0X3JvdXRlX2hvb2sodW5zaWduZWQgaW50IGhvb2ssCisJIHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlyZXR1cm4gaXA2dF9kb190YWJsZShwc2tiLCBob29rLCBpbiwgb3V0LCAmcGFja2V0X21hbmdsZXIsIE5VTEwpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitpcDZ0X2xvY2FsX2hvb2sodW5zaWduZWQgaW50IGhvb2ssCisJCSAgIHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCQkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQkgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKworCXVuc2lnbmVkIGxvbmcgbmZtYXJrOworCXVuc2lnbmVkIGludCByZXQ7CisJc3RydWN0IGluNl9hZGRyIHNhZGRyLCBkYWRkcjsKKwl1X2ludDhfdCBob3BfbGltaXQ7CisJdV9pbnQzMl90IGZsb3dsYWJlbDsKKworI2lmIDAKKwkvKiByb290IGlzIHBsYXlpbmcgd2l0aCByYXcgc29ja2V0cy4gKi8KKwlpZiAoKCpwc2tiKS0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikKKwkgICAgfHwgKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0IDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50aygiaXA2dF9ob29rOiBoYXBweSBjcmFja2luZy5cbiIpOworCQlyZXR1cm4gTkZfQUNDRVBUOworCX0KKyNlbmRpZgorCisJLyogc2F2ZSBzb3VyY2UvZGVzdCBhZGRyZXNzLCBuZm1hcmssIGhvcGxpbWl0LCBmbG93bGFiZWwsIHByaW9yaXR5LCAgKi8KKwltZW1jcHkoJnNhZGRyLCAmKCpwc2tiKS0+bmguaXB2NmgtPnNhZGRyLCBzaXplb2Yoc2FkZHIpKTsKKwltZW1jcHkoJmRhZGRyLCAmKCpwc2tiKS0+bmguaXB2NmgtPmRhZGRyLCBzaXplb2YoZGFkZHIpKTsKKwluZm1hcmsgPSAoKnBza2IpLT5uZm1hcms7CisJaG9wX2xpbWl0ID0gKCpwc2tiKS0+bmguaXB2NmgtPmhvcF9saW1pdDsKKworCS8qIGZsb3dsYWJlbCBhbmQgcHJpbyAoaW5jbHVkZXMgdmVyc2lvbiwgd2hpY2ggc2hvdWxkbid0IGNoYW5nZSBlaXRoZXIgKi8KKwlmbG93bGFiZWwgPSAqKCh1X2ludDMyX3QgKikgKCpwc2tiKS0+bmguaXB2NmgpOworCisJcmV0ID0gaXA2dF9kb190YWJsZShwc2tiLCBob29rLCBpbiwgb3V0LCAmcGFja2V0X21hbmdsZXIsIE5VTEwpOworCisJaWYgKHJldCAhPSBORl9EUk9QICYmIHJldCAhPSBORl9TVE9MRU4gCisJCSYmIChtZW1jbXAoJigqcHNrYiktPm5oLmlwdjZoLT5zYWRkciwgJnNhZGRyLCBzaXplb2Yoc2FkZHIpKQorCQkgICAgfHwgbWVtY21wKCYoKnBza2IpLT5uaC5pcHY2aC0+ZGFkZHIsICZkYWRkciwgc2l6ZW9mKGRhZGRyKSkKKwkJICAgIHx8ICgqcHNrYiktPm5mbWFyayAhPSBuZm1hcmsKKwkJICAgIHx8ICgqcHNrYiktPm5oLmlwdjZoLT5ob3BfbGltaXQgIT0gaG9wX2xpbWl0KSkgeworCisJCS8qIHNvbWV0aGluZyB3aGljaCBjb3VsZCBhZmZlY3Qgcm91dGluZyBoYXMgY2hhbmdlZCAqLworCisJCURFQlVHUCgiaXA2dGFibGVfbWFuZ2xlOiB3ZSdkIG5lZWQgdG8gcmUtcm91dGUgYSBwYWNrZXRcbiIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZfaG9va19vcHMgaXA2dF9vcHNbXSA9IHsKKwl7CisJCS5ob29rCQk9IGlwNnRfcm91dGVfaG9vaywKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkucGYJCT0gUEZfSU5FVDYsCisJCS5ob29rbnVtCT0gTkZfSVA2X1BSRV9ST1VUSU5HLAorCQkucHJpb3JpdHkJPSBORl9JUDZfUFJJX01BTkdMRSwKKwl9LAorCXsKKwkJLmhvb2sJCT0gaXA2dF9sb2NhbF9ob29rLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5wZgkJPSBQRl9JTkVUNiwKKwkJLmhvb2tudW0JPSBORl9JUDZfTE9DQUxfSU4sCisJCS5wcmlvcml0eQk9IE5GX0lQNl9QUklfTUFOR0xFLAorCX0sCisJeworCQkuaG9vawkJPSBpcDZ0X3JvdXRlX2hvb2ssCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkJLnBmCQk9IFBGX0lORVQ2LAorCQkuaG9va251bQk9IE5GX0lQNl9GT1JXQVJELAorCQkucHJpb3JpdHkJPSBORl9JUDZfUFJJX01BTkdMRSwKKwl9LAorCXsKKwkJLmhvb2sJCT0gaXA2dF9sb2NhbF9ob29rLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5wZgkJPSBQRl9JTkVUNiwKKwkJLmhvb2tudW0JPSBORl9JUDZfTE9DQUxfT1VULAorCQkucHJpb3JpdHkJPSBORl9JUDZfUFJJX01BTkdMRSwKKwl9LAorCXsKKwkJLmhvb2sJCT0gaXA2dF9yb3V0ZV9ob29rLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5wZgkJPSBQRl9JTkVUNiwKKwkJLmhvb2tudW0JPSBORl9JUDZfUE9TVF9ST1VUSU5HLAorCQkucHJpb3JpdHkJPSBORl9JUDZfUFJJX01BTkdMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwkvKiBSZWdpc3RlciB0YWJsZSAqLworCXJldCA9IGlwNnRfcmVnaXN0ZXJfdGFibGUoJnBhY2tldF9tYW5nbGVyLCAmaW5pdGlhbF90YWJsZS5yZXBsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFJlZ2lzdGVyIGhvb2tzICovCisJcmV0ID0gbmZfcmVnaXN0ZXJfaG9vaygmaXA2dF9vcHNbMF0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGNsZWFudXBfdGFibGU7CisKKwlyZXQgPSBuZl9yZWdpc3Rlcl9ob29rKCZpcDZ0X29wc1sxXSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gY2xlYW51cF9ob29rMDsKKworCXJldCA9IG5mX3JlZ2lzdGVyX2hvb2soJmlwNnRfb3BzWzJdKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBjbGVhbnVwX2hvb2sxOworCisJcmV0ID0gbmZfcmVnaXN0ZXJfaG9vaygmaXA2dF9vcHNbM10pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGNsZWFudXBfaG9vazI7CisKKwlyZXQgPSBuZl9yZWdpc3Rlcl9ob29rKCZpcDZ0X29wc1s0XSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gY2xlYW51cF9ob29rMzsKKworCXJldHVybiByZXQ7CisKKyBjbGVhbnVwX2hvb2szOgorICAgICAgICBuZl91bnJlZ2lzdGVyX2hvb2soJmlwNnRfb3BzWzNdKTsKKyBjbGVhbnVwX2hvb2syOgorCW5mX3VucmVnaXN0ZXJfaG9vaygmaXA2dF9vcHNbMl0pOworIGNsZWFudXBfaG9vazE6CisJbmZfdW5yZWdpc3Rlcl9ob29rKCZpcDZ0X29wc1sxXSk7CisgY2xlYW51cF9ob29rMDoKKwluZl91bnJlZ2lzdGVyX2hvb2soJmlwNnRfb3BzWzBdKTsKKyBjbGVhbnVwX3RhYmxlOgorCWlwNnRfdW5yZWdpc3Rlcl90YWJsZSgmcGFja2V0X21hbmdsZXIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoaXA2dF9vcHMpL3NpemVvZihzdHJ1Y3QgbmZfaG9va19vcHMpOyBpKyspCisJCW5mX3VucmVnaXN0ZXJfaG9vaygmaXA2dF9vcHNbaV0pOworCisJaXA2dF91bnJlZ2lzdGVyX3RhYmxlKCZwYWNrZXRfbWFuZ2xlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfcmF3LmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfcmF3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE0MDdiZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9yYXcuYwpAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqIElQdjYgcmF3IHRhYmxlLCBhIHBvcnQgb2YgdGhlIElQdjQgcmF3IHRhYmxlIHRvIElQdjYKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgSm96c2VmIEthZGxlY3NpayA8a2FkbGVjQGJsYWNraG9sZS5rZmtpLmh1PgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oPgorCisjZGVmaW5lIFJBV19WQUxJRF9IT09LUyAoKDEgPDwgTkZfSVA2X1BSRV9ST1VUSU5HKSB8ICgxIDw8IE5GX0lQNl9MT0NBTF9PVVQpKQorCisjaWYgMAorI2RlZmluZSBERUJVR1AoeCwgYXJncy4uLikJcHJpbnRrKEtFUk5fREVCVUcgeCwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIERFQlVHUCh4LCBhcmdzLi4uKQorI2VuZGlmCisKKy8qIFN0YW5kYXJkIGVudHJ5LiAqLworc3RydWN0IGlwNnRfc3RhbmRhcmQKK3sKKwlzdHJ1Y3QgaXA2dF9lbnRyeSBlbnRyeTsKKwlzdHJ1Y3QgaXA2dF9zdGFuZGFyZF90YXJnZXQgdGFyZ2V0OworfTsKKworc3RydWN0IGlwNnRfZXJyb3JfdGFyZ2V0Cit7CisJc3RydWN0IGlwNnRfZW50cnlfdGFyZ2V0IHRhcmdldDsKKwljaGFyIGVycm9ybmFtZVtJUDZUX0ZVTkNUSU9OX01BWE5BTUVMRU5dOworfTsKKworc3RydWN0IGlwNnRfZXJyb3IKK3sKKwlzdHJ1Y3QgaXA2dF9lbnRyeSBlbnRyeTsKKwlzdHJ1Y3QgaXA2dF9lcnJvcl90YXJnZXQgdGFyZ2V0OworfTsKKworc3RhdGljIHN0cnVjdAoreworCXN0cnVjdCBpcDZ0X3JlcGxhY2UgcmVwbDsKKwlzdHJ1Y3QgaXA2dF9zdGFuZGFyZCBlbnRyaWVzWzJdOworCXN0cnVjdCBpcDZ0X2Vycm9yIHRlcm07Cit9IGluaXRpYWxfdGFibGUgX19pbml0ZGF0YSA9IHsKKwkucmVwbCA9IHsKKwkJLm5hbWUgPSAicmF3IiwKKwkJLnZhbGlkX2hvb2tzID0gUkFXX1ZBTElEX0hPT0tTLAorCQkubnVtX2VudHJpZXMgPSAzLAorCQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZCkgKiAyICsgc2l6ZW9mKHN0cnVjdCBpcDZ0X2Vycm9yKSwKKwkJLmhvb2tfZW50cnkgPSB7CisJCQlbTkZfSVA2X1BSRV9ST1VUSU5HXSA9IDAsCisJCQlbTkZfSVA2X0xPQ0FMX09VVF0gPSBzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmQpCisJCX0sCisJCS51bmRlcmZsb3cgPSB7CisJCQlbTkZfSVA2X1BSRV9ST1VUSU5HXSA9IDAsCisJCQlbTkZfSVA2X0xPQ0FMX09VVF0gPSBzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmQpCisJCX0sCisJfSwKKwkuZW50cmllcyA9IHsKKwkJLyogUFJFX1JPVVRJTkcgKi8KKwkJeworCQkJLmVudHJ5ID0geworCQkJCS50YXJnZXRfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBpcDZ0X2VudHJ5KSwKKwkJCQkubmV4dF9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmQpLAorCQkJfSwKKwkJCS50YXJnZXQgPSB7CisJCQkJLnRhcmdldCA9IHsKKwkJCQkJLnUgPSB7CisJCQkJCQkudGFyZ2V0X3NpemUgPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZF90YXJnZXQpKSwKKwkJCQkJfSwKKwkJCQl9LAorCQkJCS52ZXJkaWN0ID0gLU5GX0FDQ0VQVCAtIDEsCisJCQl9LAorCQl9LAorCisJCS8qIExPQ0FMX09VVCAqLworCQl7CisJCQkuZW50cnkgPSB7CisJCQkJLnRhcmdldF9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwNnRfZW50cnkpLAorCQkJCS5uZXh0X29mZnNldCA9IHNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZCksCisJCQl9LAorCQkJLnRhcmdldCA9IHsKKwkJCQkudGFyZ2V0ID0geworCQkJCQkudSA9IHsKKwkJCQkJCS50YXJnZXRfc2l6ZSA9IElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkX3RhcmdldCkpLAorCQkJCQl9LAorCQkJCX0sCisJCQkJLnZlcmRpY3QgPSAtTkZfQUNDRVBUIC0gMSwKKwkJCX0sCisJCX0sCisJfSwKKwkvKiBFUlJPUiAqLworCS50ZXJtID0geworCQkuZW50cnkgPSB7CisJCQkudGFyZ2V0X29mZnNldCA9IHNpemVvZihzdHJ1Y3QgaXA2dF9lbnRyeSksCisJCQkubmV4dF9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwNnRfZXJyb3IpLAorCQl9LAorCQkudGFyZ2V0ID0geworCQkJLnRhcmdldCA9IHsKKwkJCQkudSA9IHsKKwkJCQkJLnVzZXIgPSB7CisJCQkJCQkudGFyZ2V0X3NpemUgPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9lcnJvcl90YXJnZXQpKSwKKwkJCQkJCS5uYW1lID0gSVA2VF9FUlJPUl9UQVJHRVQsCisJCQkJCX0sCisJCQkJfSwKKwkJCX0sCisJCQkuZXJyb3JuYW1lID0gIkVSUk9SIiwKKwkJfSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGlwNnRfdGFibGUgcGFja2V0X3JhdyA9IHsgCisJLm5hbWUgPSAicmF3IiwgCisJLnZhbGlkX2hvb2tzID0gUkFXX1ZBTElEX0hPT0tTLCAKKwkubG9jayA9IFJXX0xPQ0tfVU5MT0NLRUQsIAorCS5tZSA9IFRISVNfTU9EVUxFCit9OworCisvKiBUaGUgd29yayBjb21lcyBpbiBoZXJlIGZyb20gbmV0ZmlsdGVyLmMuICovCitzdGF0aWMgdW5zaWduZWQgaW50CitpcDZ0X2hvb2sodW5zaWduZWQgaW50IGhvb2ssCisJIHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlyZXR1cm4gaXA2dF9kb190YWJsZShwc2tiLCBob29rLCBpbiwgb3V0LCAmcGFja2V0X3JhdywgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZfaG9va19vcHMgaXA2dF9vcHNbXSA9IHsgCisJeworCSAgLmhvb2sgPSBpcDZ0X2hvb2ssIAorCSAgLnBmID0gUEZfSU5FVDYsCisJICAuaG9va251bSA9IE5GX0lQNl9QUkVfUk9VVElORywKKwkgIC5wcmlvcml0eSA9IE5GX0lQNl9QUklfRklSU1QKKwl9LAorCXsKKwkgIC5ob29rID0gaXA2dF9ob29rLCAKKwkgIC5wZiA9IFBGX0lORVQ2LCAKKwkgIC5ob29rbnVtID0gTkZfSVA2X0xPQ0FMX09VVCwKKwkgIC5wcmlvcml0eSA9IE5GX0lQNl9QUklfRklSU1QKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwkvKiBSZWdpc3RlciB0YWJsZSAqLworCXJldCA9IGlwNnRfcmVnaXN0ZXJfdGFibGUoJnBhY2tldF9yYXcsICZpbml0aWFsX3RhYmxlLnJlcGwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogUmVnaXN0ZXIgaG9va3MgKi8KKwlyZXQgPSBuZl9yZWdpc3Rlcl9ob29rKCZpcDZ0X29wc1swXSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gY2xlYW51cF90YWJsZTsKKworCXJldCA9IG5mX3JlZ2lzdGVyX2hvb2soJmlwNnRfb3BzWzFdKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBjbGVhbnVwX2hvb2swOworCisJcmV0dXJuIHJldDsKKworIGNsZWFudXBfaG9vazA6CisJbmZfdW5yZWdpc3Rlcl9ob29rKCZpcDZ0X29wc1swXSk7CisgY2xlYW51cF90YWJsZToKKwlpcDZ0X3VucmVnaXN0ZXJfdGFibGUoJnBhY2tldF9yYXcpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoaXA2dF9vcHMpL3NpemVvZihzdHJ1Y3QgbmZfaG9va19vcHMpOyBpKyspCisJCW5mX3VucmVnaXN0ZXJfaG9vaygmaXA2dF9vcHNbaV0pOworCisJaXA2dF91bnJlZ2lzdGVyX3RhYmxlKCZwYWNrZXRfcmF3KTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3Byb2MuYyBiL25ldC9pcHY2L3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzRhNTk2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvcHJvYy5jCkBAIC0wLDAgKzEsMzAzIEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCVRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSB2YXJpb3VzIGFjY2VzcyBmdW5jdGlvbnMgZm9yIHRoZQorICoJCVBST0MgZmlsZSBzeXN0ZW0uICBUaGlzIGlzIHZlcnkgc2ltaWxhciB0byB0aGUgSVB2NCB2ZXJzaW9uLAorICoJCWV4Y2VwdCBpdCByZXBvcnRzIHRoZSBzb2NrZXRzIGluIHRoZSBJTkVUNiBhZGRyZXNzIGZhbWlseS4KKyAqCisgKiBWZXJzaW9uOgkkSWQ6IHByb2MuYyx2IDEuMTcgMjAwMi8wMi8wMSAyMjowMTowNCBkYXZlbSBFeHAgJAorICoKKyAqIEF1dGhvcnM6CURhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKKyAqIAkJWU9TSElGVUpJIEhpZGVha2kgPHlvc2hmdWppQGxpbnV4LWlwdjYub3JnPgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisjaW5jbHVkZSA8bmV0L3RyYW5zcF92Ni5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19uZXRfZGV2c25tcDY7CisKK3N0YXRpYyBpbnQgZm9sZF9wcm90X2ludXNlKHN0cnVjdCBwcm90byAqcHJvdG8pCit7CisJaW50IHJlcyA9IDA7CisJaW50IGNwdTsKKworCWZvciAoY3B1PTA7IGNwdTxOUl9DUFVTOyBjcHUrKykKKwkJcmVzICs9IHByb3RvLT5zdGF0c1tjcHVdLmludXNlOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBzb2Nrc3RhdDZfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc2VxX3ByaW50ZihzZXEsICJUQ1A2OiBpbnVzZSAlZFxuIiwKKwkJICAgICAgIGZvbGRfcHJvdF9pbnVzZSgmdGNwdjZfcHJvdCkpOworCXNlcV9wcmludGYoc2VxLCAiVURQNjogaW51c2UgJWRcbiIsCisJCSAgICAgICBmb2xkX3Byb3RfaW51c2UoJnVkcHY2X3Byb3QpKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlJBVzY6IGludXNlICVkXG4iLAorCQkgICAgICAgZm9sZF9wcm90X2ludXNlKCZyYXd2Nl9wcm90KSk7CisJc2VxX3ByaW50ZihzZXEsICJGUkFHNjogaW51c2UgJWQgbWVtb3J5ICVkXG4iLAorCQkgICAgICAgaXA2X2ZyYWdfbnF1ZXVlcywgYXRvbWljX3JlYWQoJmlwNl9mcmFnX21lbSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNubXBfbWliIHNubXA2X2lwc3RhdHNfbGlzdFtdID0geworLyogaXB2NiBtaWIgYWNjb3JkaW5nIHRvIFJGQyAyNDY1ICovCisJU05NUF9NSUJfSVRFTSgiSXA2SW5SZWNlaXZlcyIsIElQU1RBVFNfTUlCX0lOUkVDRUlWRVMpLAorCVNOTVBfTUlCX0lURU0oIklwNkluSGRyRXJyb3JzIiwgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpLAorCVNOTVBfTUlCX0lURU0oIklwNkluVG9vQmlnRXJyb3JzIiwgSVBTVEFUU19NSUJfSU5UT09CSUdFUlJPUlMpLAorCVNOTVBfTUlCX0lURU0oIklwNkluTm9Sb3V0ZXMiLCBJUFNUQVRTX01JQl9JTk5PUk9VVEVTKSwKKwlTTk1QX01JQl9JVEVNKCJJcDZJbkFkZHJFcnJvcnMiLCBJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMpLAorCVNOTVBfTUlCX0lURU0oIklwNkluVW5rbm93blByb3RvcyIsIElQU1RBVFNfTUlCX0lOVU5LTk9XTlBST1RPUyksCisJU05NUF9NSUJfSVRFTSgiSXA2SW5UcnVuY2F0ZWRQa3RzIiwgSVBTVEFUU19NSUJfSU5UUlVOQ0FURURQS1RTKSwKKwlTTk1QX01JQl9JVEVNKCJJcDZJbkRpc2NhcmRzIiwgSVBTVEFUU19NSUJfSU5ESVNDQVJEUyksCisJU05NUF9NSUJfSVRFTSgiSXA2SW5EZWxpdmVycyIsIElQU1RBVFNfTUlCX0lOREVMSVZFUlMpLAorCVNOTVBfTUlCX0lURU0oIklwNk91dEZvcndEYXRhZ3JhbXMiLCBJUFNUQVRTX01JQl9PVVRGT1JXREFUQUdSQU1TKSwKKwlTTk1QX01JQl9JVEVNKCJJcDZPdXRSZXF1ZXN0cyIsIElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKSwKKwlTTk1QX01JQl9JVEVNKCJJcDZPdXREaXNjYXJkcyIsIElQU1RBVFNfTUlCX09VVERJU0NBUkRTKSwKKwlTTk1QX01JQl9JVEVNKCJJcDZPdXROb1JvdXRlcyIsIElQU1RBVFNfTUlCX09VVE5PUk9VVEVTKSwKKwlTTk1QX01JQl9JVEVNKCJJcDZSZWFzbVRpbWVvdXQiLCBJUFNUQVRTX01JQl9SRUFTTVRJTUVPVVQpLAorCVNOTVBfTUlCX0lURU0oIklwNlJlYXNtUmVxZHMiLCBJUFNUQVRTX01JQl9SRUFTTVJFUURTKSwKKwlTTk1QX01JQl9JVEVNKCJJcDZSZWFzbU9LcyIsIElQU1RBVFNfTUlCX1JFQVNNT0tTKSwKKwlTTk1QX01JQl9JVEVNKCJJcDZSZWFzbUZhaWxzIiwgSVBTVEFUU19NSUJfUkVBU01GQUlMUyksCisJU05NUF9NSUJfSVRFTSgiSXA2RnJhZ09LcyIsIElQU1RBVFNfTUlCX0ZSQUdPS1MpLAorCVNOTVBfTUlCX0lURU0oIklwNkZyYWdGYWlscyIsIElQU1RBVFNfTUlCX0ZSQUdGQUlMUyksCisJU05NUF9NSUJfSVRFTSgiSXA2RnJhZ0NyZWF0ZXMiLCBJUFNUQVRTX01JQl9GUkFHQ1JFQVRFUyksCisJU05NUF9NSUJfSVRFTSgiSXA2SW5NY2FzdFBrdHMiLCBJUFNUQVRTX01JQl9JTk1DQVNUUEtUUyksCisJU05NUF9NSUJfSVRFTSgiSXA2T3V0TWNhc3RQa3RzIiwgSVBTVEFUU19NSUJfT1VUTUNBU1RQS1RTKSwKKwlTTk1QX01JQl9TRU5USU5FTAorfTsKKworc3RhdGljIHN0cnVjdCBzbm1wX21pYiBzbm1wNl9pY21wNl9saXN0W10gPSB7CisvKiBpY21wdjYgbWliIGFjY29yZGluZyB0byBSRkMgMjQ2NgorCisgICBFeGNlcHRpb25zOiAge0lufE91dH1BZG1pblByb2hpYnMgYXJlIHJlbW92ZWQsIGJlY2F1c2UgSSBzZWUKKyAgICAgICAgICAgICAgICBubyBnb29kIHJlYXNvbnMgdG8gYWNjb3VudCB0aGVtIHNlcGFyYXRlbHkKKwkJb2YgYW5vdGhlciBkZXN0LnVucmVhY2hzLgorCQlPdXRFcnJzIGlzIHplcm8gaWRlbnRpY2FsbHkuCisJCU91dEVjaG9zIHRvby4KKwkJT3V0Um91dGVyQWR2ZXJ0aXNlbWVudHMgdG9vLgorCQlPdXRHcm91cE1lbWJRdWVyaWVzIHRvby4KKyAqLworCVNOTVBfTUlCX0lURU0oIkljbXA2SW5Nc2dzIiwgSUNNUDZfTUlCX0lOTVNHUyksCisJU05NUF9NSUJfSVRFTSgiSWNtcDZJbkVycm9ycyIsIElDTVA2X01JQl9JTkVSUk9SUyksCisJU05NUF9NSUJfSVRFTSgiSWNtcDZJbkRlc3RVbnJlYWNocyIsIElDTVA2X01JQl9JTkRFU1RVTlJFQUNIUyksCisJU05NUF9NSUJfSVRFTSgiSWNtcDZJblBrdFRvb0JpZ3MiLCBJQ01QNl9NSUJfSU5QS1RUT09CSUdTKSwKKwlTTk1QX01JQl9JVEVNKCJJY21wNkluVGltZUV4Y2RzIiwgSUNNUDZfTUlCX0lOVElNRUVYQ0RTKSwKKwlTTk1QX01JQl9JVEVNKCJJY21wNkluUGFybVByb2JsZW1zIiwgSUNNUDZfTUlCX0lOUEFSTVBST0JMRU1TKSwKKwlTTk1QX01JQl9JVEVNKCJJY21wNkluRWNob3MiLCBJQ01QNl9NSUJfSU5FQ0hPUyksCisJU05NUF9NSUJfSVRFTSgiSWNtcDZJbkVjaG9SZXBsaWVzIiwgSUNNUDZfTUlCX0lORUNIT1JFUExJRVMpLAorCVNOTVBfTUlCX0lURU0oIkljbXA2SW5Hcm91cE1lbWJRdWVyaWVzIiwgSUNNUDZfTUlCX0lOR1JPVVBNRU1CUVVFUklFUyksCisJU05NUF9NSUJfSVRFTSgiSWNtcDZJbkdyb3VwTWVtYlJlc3BvbnNlcyIsIElDTVA2X01JQl9JTkdST1VQTUVNQlJFU1BPTlNFUyksCisJU05NUF9NSUJfSVRFTSgiSWNtcDZJbkdyb3VwTWVtYlJlZHVjdGlvbnMiLCBJQ01QNl9NSUJfSU5HUk9VUE1FTUJSRURVQ1RJT05TKSwKKwlTTk1QX01JQl9JVEVNKCJJY21wNkluUm91dGVyU29saWNpdHMiLCBJQ01QNl9NSUJfSU5ST1VURVJTT0xJQ0lUUyksCisJU05NUF9NSUJfSVRFTSgiSWNtcDZJblJvdXRlckFkdmVydGlzZW1lbnRzIiwgSUNNUDZfTUlCX0lOUk9VVEVSQURWRVJUSVNFTUVOVFMpLAorCVNOTVBfTUlCX0lURU0oIkljbXA2SW5OZWlnaGJvclNvbGljaXRzIiwgSUNNUDZfTUlCX0lOTkVJR0hCT1JTT0xJQ0lUUyksCisJU05NUF9NSUJfSVRFTSgiSWNtcDZJbk5laWdoYm9yQWR2ZXJ0aXNlbWVudHMiLCBJQ01QNl9NSUJfSU5ORUlHSEJPUkFEVkVSVElTRU1FTlRTKSwKKwlTTk1QX01JQl9JVEVNKCJJY21wNkluUmVkaXJlY3RzIiwgSUNNUDZfTUlCX0lOUkVESVJFQ1RTKSwKKwlTTk1QX01JQl9JVEVNKCJJY21wNk91dE1zZ3MiLCBJQ01QNl9NSUJfT1VUTVNHUyksCisJU05NUF9NSUJfSVRFTSgiSWNtcDZPdXREZXN0VW5yZWFjaHMiLCBJQ01QNl9NSUJfT1VUREVTVFVOUkVBQ0hTKSwKKwlTTk1QX01JQl9JVEVNKCJJY21wNk91dFBrdFRvb0JpZ3MiLCBJQ01QNl9NSUJfT1VUUEtUVE9PQklHUyksCisJU05NUF9NSUJfSVRFTSgiSWNtcDZPdXRUaW1lRXhjZHMiLCBJQ01QNl9NSUJfT1VUVElNRUVYQ0RTKSwKKwlTTk1QX01JQl9JVEVNKCJJY21wNk91dFBhcm1Qcm9ibGVtcyIsIElDTVA2X01JQl9PVVRQQVJNUFJPQkxFTVMpLAorCVNOTVBfTUlCX0lURU0oIkljbXA2T3V0RWNob1JlcGxpZXMiLCBJQ01QNl9NSUJfT1VURUNIT1JFUExJRVMpLAorCVNOTVBfTUlCX0lURU0oIkljbXA2T3V0Um91dGVyU29saWNpdHMiLCBJQ01QNl9NSUJfT1VUUk9VVEVSU09MSUNJVFMpLAorCVNOTVBfTUlCX0lURU0oIkljbXA2T3V0TmVpZ2hib3JTb2xpY2l0cyIsIElDTVA2X01JQl9PVVRORUlHSEJPUlNPTElDSVRTKSwKKwlTTk1QX01JQl9JVEVNKCJJY21wNk91dE5laWdoYm9yQWR2ZXJ0aXNlbWVudHMiLCBJQ01QNl9NSUJfT1VUTkVJR0hCT1JBRFZFUlRJU0VNRU5UUyksCisJU05NUF9NSUJfSVRFTSgiSWNtcDZPdXRSZWRpcmVjdHMiLCBJQ01QNl9NSUJfT1VUUkVESVJFQ1RTKSwKKwlTTk1QX01JQl9JVEVNKCJJY21wNk91dEdyb3VwTWVtYlJlc3BvbnNlcyIsIElDTVA2X01JQl9PVVRHUk9VUE1FTUJSRVNQT05TRVMpLAorCVNOTVBfTUlCX0lURU0oIkljbXA2T3V0R3JvdXBNZW1iUmVkdWN0aW9ucyIsIElDTVA2X01JQl9PVVRHUk9VUE1FTUJSRURVQ1RJT05TKSwKKwlTTk1QX01JQl9TRU5USU5FTAorfTsKKworc3RhdGljIHN0cnVjdCBzbm1wX21pYiBzbm1wNl91ZHA2X2xpc3RbXSA9IHsKKwlTTk1QX01JQl9JVEVNKCJVZHA2SW5EYXRhZ3JhbXMiLCBVRFBfTUlCX0lOREFUQUdSQU1TKSwKKwlTTk1QX01JQl9JVEVNKCJVZHA2Tm9Qb3J0cyIsIFVEUF9NSUJfTk9QT1JUUyksCisJU05NUF9NSUJfSVRFTSgiVWRwNkluRXJyb3JzIiwgVURQX01JQl9JTkVSUk9SUyksCisJU05NUF9NSUJfSVRFTSgiVWRwNk91dERhdGFncmFtcyIsIFVEUF9NSUJfT1VUREFUQUdSQU1TKSwKKwlTTk1QX01JQl9TRU5USU5FTAorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2ZvbGRfZmllbGQodm9pZCAqbWliW10sIGludCBvZmZ0KQoreworICAgICAgICB1bnNpZ25lZCBsb25nIHJlcyA9IDA7CisgICAgICAgIGludCBpOworIAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjcHVfcG9zc2libGUoaSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICByZXMgKz0gKigoKHVuc2lnbmVkIGxvbmcgKilwZXJfY3B1X3B0cihtaWJbMF0sIGkpKSArIG9mZnQpOworICAgICAgICAgICAgICAgIHJlcyArPSAqKCgodW5zaWduZWQgbG9uZyAqKXBlcl9jcHVfcHRyKG1pYlsxXSwgaSkpICsgb2ZmdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitzbm1wNl9zZXFfc2hvd19pdGVtKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICoqbWliLCBzdHJ1Y3Qgc25tcF9taWIgKml0ZW1saXN0KQoreworCWludCBpOworCWZvciAoaT0wOyBpdGVtbGlzdFtpXS5uYW1lOyBpKyspCisJCXNlcV9wcmludGYoc2VxLCAiJS0zMnNcdCVsdVxuIiwgaXRlbWxpc3RbaV0ubmFtZSwgCisJCQkJZm9sZF9maWVsZChtaWIsIGl0ZW1saXN0W2ldLmVudHJ5KSk7Cit9CisKK3N0YXRpYyBpbnQgc25tcDZfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IGluZXQ2X2RldiAqaWRldiA9IChzdHJ1Y3QgaW5ldDZfZGV2ICopc2VxLT5wcml2YXRlOworCisJaWYgKGlkZXYpIHsKKwkJc2VxX3ByaW50ZihzZXEsICIlLTMyc1x0JXVcbiIsICJpZkluZGV4IiwgaWRldi0+ZGV2LT5pZmluZGV4KTsKKwkJc25tcDZfc2VxX3Nob3dfaXRlbShzZXEsICh2b2lkICoqKWlkZXYtPnN0YXRzLmljbXB2Niwgc25tcDZfaWNtcDZfbGlzdCk7CisJfSBlbHNlIHsKKwkJc25tcDZfc2VxX3Nob3dfaXRlbShzZXEsICh2b2lkICoqKWlwdjZfc3RhdGlzdGljcywgc25tcDZfaXBzdGF0c19saXN0KTsKKwkJc25tcDZfc2VxX3Nob3dfaXRlbShzZXEsICh2b2lkICoqKWljbXB2Nl9zdGF0aXN0aWNzLCBzbm1wNl9pY21wNl9saXN0KTsKKwkJc25tcDZfc2VxX3Nob3dfaXRlbShzZXEsICh2b2lkICoqKXVkcF9zdGF0c19pbjYsIHNubXA2X3VkcDZfbGlzdCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvY2tzdGF0Nl9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgc29ja3N0YXQ2X3NlcV9zaG93LCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc29ja3N0YXQ2X3NlcV9mb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkub3BlbgkgPSBzb2Nrc3RhdDZfc2VxX29wZW4sCisJLnJlYWQJID0gc2VxX3JlYWQsCisJLmxsc2VlawkgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgc25tcDZfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNubXA2X3NlcV9zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc25tcDZfc2VxX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5vcGVuCSA9IHNubXA2X3NlcV9vcGVuLAorCS5yZWFkCSA9IHNlcV9yZWFkLAorCS5sbHNlZWsJID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitpbnQgc25tcDZfcmVnaXN0ZXJfZGV2KHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwOworCisJaWYgKCFpZGV2IHx8ICFpZGV2LT5kZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFwcm9jX25ldF9kZXZzbm1wNikKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlwID0gY3JlYXRlX3Byb2NfZW50cnkoaWRldi0+ZGV2LT5uYW1lLCBTX0lSVUdPLCBwcm9jX25ldF9kZXZzbm1wNik7CisJaWYgKCFwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXAtPmRhdGEgPSBpZGV2OworCXAtPnByb2NfZm9wcyA9ICZzbm1wNl9zZXFfZm9wczsKKworCWlkZXYtPnN0YXRzLnByb2NfZGlyX2VudHJ5ID0gcDsKKwlyZXR1cm4gMDsKK30KKworaW50IHNubXA2X3VucmVnaXN0ZXJfZGV2KHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpCit7CisJaWYgKCFwcm9jX25ldF9kZXZzbm1wNikKKwkJcmV0dXJuIC1FTk9FTlQ7CisJaWYgKCFpZGV2IHx8ICFpZGV2LT5zdGF0cy5wcm9jX2Rpcl9lbnRyeSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmVtb3ZlX3Byb2NfZW50cnkoaWRldi0+c3RhdHMucHJvY19kaXJfZW50cnktPm5hbWUsCisJCQkgIHByb2NfbmV0X2RldnNubXA2KTsKKwlyZXR1cm4gMDsKK30KKworaW50IF9faW5pdCBpcHY2X21pc2NfcHJvY19pbml0KHZvaWQpCit7CisJaW50IHJjID0gMDsKKworCWlmICghcHJvY19uZXRfZm9wc19jcmVhdGUoInNubXA2IiwgU19JUlVHTywgJnNubXA2X3NlcV9mb3BzKSkKKwkJZ290byBwcm9jX3NubXA2X2ZhaWw7CisKKwlwcm9jX25ldF9kZXZzbm1wNiA9IHByb2NfbWtkaXIoImRldl9zbm1wNiIsIHByb2NfbmV0KTsKKwlpZiAoIXByb2NfbmV0X2RldnNubXA2KQorCQlnb3RvIHByb2NfZGV2X3NubXA2X2ZhaWw7CisKKwlpZiAoIXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJzb2Nrc3RhdDYiLCBTX0lSVUdPLCAmc29ja3N0YXQ2X3NlcV9mb3BzKSkKKwkJZ290byBwcm9jX3NvY2tzdGF0Nl9mYWlsOworb3V0OgorCXJldHVybiByYzsKKworcHJvY19zb2Nrc3RhdDZfZmFpbDoKKwlwcm9jX25ldF9yZW1vdmUoImRldl9zbm1wNiIpOworcHJvY19kZXZfc25tcDZfZmFpbDoKKwlwcm9jX25ldF9yZW1vdmUoInNubXA2Iik7Citwcm9jX3NubXA2X2ZhaWw6CisJcmMgPSAtRU5PTUVNOworCWdvdG8gb3V0OworfQorCit2b2lkIGlwdjZfbWlzY19wcm9jX2V4aXQodm9pZCkKK3sKKwlwcm9jX25ldF9yZW1vdmUoInNvY2tzdGF0NiIpOworCXByb2NfbmV0X3JlbW92ZSgiZGV2X3NubXA2Iik7CisJcHJvY19uZXRfcmVtb3ZlKCJzbm1wNiIpOworfQorCisjZWxzZQkvKiBDT05GSUdfUFJPQ19GUyAqLworCisKK2ludCBzbm1wNl9yZWdpc3Rlcl9kZXYoc3RydWN0IGluZXQ2X2RldiAqaWRldikKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IHNubXA2X3VucmVnaXN0ZXJfZGV2KHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYJLyogQ09ORklHX1BST0NfRlMgKi8KKworaW50IHNubXA2X2FsbG9jX2RldihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KQoreworCWludCBlcnIgPSAtRU5PTUVNOworCisJaWYgKCFpZGV2IHx8ICFpZGV2LT5kZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHNubXA2X21pYl9pbml0KCh2b2lkICoqKWlkZXYtPnN0YXRzLmljbXB2Niwgc2l6ZW9mKHN0cnVjdCBpY21wdjZfbWliKSwKKwkJCSAgIF9fYWxpZ25vZl9fKHN0cnVjdCBpY21wdjZfbWliKSkgPCAwKQorCQlnb3RvIGVycl9pY21wOworCisJcmV0dXJuIDA7CisKK2Vycl9pY21wOgorCXJldHVybiBlcnI7Cit9CisKK2ludCBzbm1wNl9mcmVlX2RldihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KQoreworCXNubXA2X21pYl9mcmVlKCh2b2lkICoqKWlkZXYtPnN0YXRzLmljbXB2Nik7CisJcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcHJvdG9jb2wuYyBiL25ldC9pcHY2L3Byb3RvY29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJjMWQ1OAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY2L3Byb3RvY29sLmMKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlQRl9JTkVUNiBwcm90b2NvbCBkaXNwYXRjaCB0YWJsZXMuCisgKgorICogVmVyc2lvbjoJJElkOiBwcm90b2NvbC5jLHYgMS4xMCAyMDAxLzA1LzE4IDAyOjI1OjQ5IGRhdmVtIEV4cCAkCisgKgorICogQXV0aG9yczoJUGVkcm8gUm9xdWUJPHJvcXVlQGRpLmZjLnVsLnB0PgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKy8qCisgKiAgICAgIENoYW5nZXM6CisgKgorICogICAgICBWaW5jZSBMYXZpYW5vICh2aW5jZUBjcy5zdGFuZm9yZC5lZHUpICAgICAgIDE2IE1heSAyMDAxCisgKiAgICAgIC0gUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUgJ2luZXQ2X3Byb3RvY29sX2Jhc2UnCisgKiAgICAgIC0gTW9kaWZpZWQgaW5ldDZfZGVsX3Byb3RvY29sKCkgdG8gY29ycmVjdGx5IG1haW50YWluIGNvcHkgYml0LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisKKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9zbm1wLmg+CisKKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgorCitzdHJ1Y3QgaW5ldDZfcHJvdG9jb2wgKmluZXQ2X3Byb3Rvc1tNQVhfSU5FVF9QUk9UT1NdOworc3RhdGljIERFRklORV9TUElOTE9DSyhpbmV0Nl9wcm90b19sb2NrKTsKKworCitpbnQgaW5ldDZfYWRkX3Byb3RvY29sKHN0cnVjdCBpbmV0Nl9wcm90b2NvbCAqcHJvdCwgdW5zaWduZWQgY2hhciBwcm90b2NvbCkKK3sKKwlpbnQgcmV0LCBoYXNoID0gcHJvdG9jb2wgJiAoTUFYX0lORVRfUFJPVE9TIC0gMSk7CisKKwlzcGluX2xvY2tfYmgoJmluZXQ2X3Byb3RvX2xvY2spOworCisJaWYgKGluZXQ2X3Byb3Rvc1toYXNoXSkgeworCQlyZXQgPSAtMTsKKwl9IGVsc2UgeworCQlpbmV0Nl9wcm90b3NbaGFzaF0gPSBwcm90OworCQlyZXQgPSAwOworCX0KKworCXNwaW5fdW5sb2NrX2JoKCZpbmV0Nl9wcm90b19sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKglSZW1vdmUgYSBwcm90b2NvbCBmcm9tIHRoZSBoYXNoIHRhYmxlcy4KKyAqLworIAoraW50IGluZXQ2X2RlbF9wcm90b2NvbChzdHJ1Y3QgaW5ldDZfcHJvdG9jb2wgKnByb3QsIHVuc2lnbmVkIGNoYXIgcHJvdG9jb2wpCit7CisJaW50IHJldCwgaGFzaCA9IHByb3RvY29sICYgKE1BWF9JTkVUX1BST1RPUyAtIDEpOworCisJc3Bpbl9sb2NrX2JoKCZpbmV0Nl9wcm90b19sb2NrKTsKKworCWlmIChpbmV0Nl9wcm90b3NbaGFzaF0gIT0gcHJvdCkgeworCQlyZXQgPSAtMTsKKwl9IGVsc2UgeworCQlpbmV0Nl9wcm90b3NbaGFzaF0gPSBOVUxMOworCQlyZXQgPSAwOworCX0KKworCXNwaW5fdW5sb2NrX2JoKCZpbmV0Nl9wcm90b19sb2NrKTsKKworCXN5bmNocm9uaXplX25ldCgpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL25ldC9pcHY2L3Jhdy5jIGIvbmV0L2lwdjYvcmF3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4OGFkMAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY2L3Jhdy5jCkBAIC0wLDAgKzEsMTE1NyBAQAorLyoKKyAqCVJBVyBzb2NrZXRzIGZvciBJUHY2CisgKglMaW51eCBJTkVUNiBpbXBsZW1lbnRhdGlvbiAKKyAqCisgKglBdXRob3JzOgorICoJUGVkcm8gUm9xdWUJCTxyb3F1ZUBkaS5mYy51bC5wdD4JCisgKgorICoJQWRhcHRlZCBmcm9tIGxpbnV4L25ldC9pcHY0L3Jhdy5jCisgKgorICoJJElkOiByYXcuYyx2IDEuNTEgMjAwMi8wMi8wMSAyMjowMTowNCBkYXZlbSBFeHAgJAorICoKKyAqCUZpeGVzOgorICoJSGlkZWFraSBZT1NISUZVSkkJOglzaW42X3Njb3BlX2lkIHN1cHBvcnQKKyAqCVlPU0hJRlVKSSxILkBVU0FHSQk6CXJhdyBjaGVja3N1bSAoUkZDMjI5MihiaXMpIGNvbXBsaWFuY2UpIAorICoJS2F6dW5vcmkgTUlZQVpBV0EgQFVTQUdJOgljaGFuZ2UgcHJvY2VzcyBzdHlsZSB0byB1c2UgaXA2X2FwcGVuZF9kYXRhCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2ljbXB2Ni5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CisKKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9zbm1wLmg+CisKKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC9uZGlzYy5oPgorI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgorI2luY2x1ZGUgPG5ldC9pcDZfcm91dGUuaD4KKyNpbmNsdWRlIDxuZXQvaXA2X2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CisjaW5jbHVkZSA8bmV0L3RyYW5zcF92Ni5oPgorI2luY2x1ZGUgPG5ldC91ZHAuaD4KKyNpbmNsdWRlIDxuZXQvaW5ldF9jb21tb24uaD4KKworI2luY2x1ZGUgPG5ldC9yYXd2Ni5oPgorI2luY2x1ZGUgPG5ldC94ZnJtLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworc3RydWN0IGhsaXN0X2hlYWQgcmF3X3Y2X2h0YWJsZVtSQVdWNl9IVEFCTEVfU0laRV07CitERUZJTkVfUldMT0NLKHJhd192Nl9sb2NrKTsKKworc3RhdGljIHZvaWQgcmF3X3Y2X2hhc2goc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBobGlzdF9oZWFkICpsaXN0ID0gJnJhd192Nl9odGFibGVbaW5ldF9zayhzayktPm51bSAmCisJCQkJCQkgKFJBV1Y2X0hUQUJMRV9TSVpFIC0gMSldOworCisJd3JpdGVfbG9ja19iaCgmcmF3X3Y2X2xvY2spOworCXNrX2FkZF9ub2RlKHNrLCBsaXN0KTsKKwlzb2NrX3Byb3RfaW5jX3VzZShzay0+c2tfcHJvdCk7CisgCXdyaXRlX3VubG9ja19iaCgmcmF3X3Y2X2xvY2spOworfQorCitzdGF0aWMgdm9pZCByYXdfdjZfdW5oYXNoKHN0cnVjdCBzb2NrICpzaykKK3sKKyAJd3JpdGVfbG9ja19iaCgmcmF3X3Y2X2xvY2spOworCWlmIChza19kZWxfbm9kZV9pbml0KHNrKSkKKwkJc29ja19wcm90X2RlY191c2Uoc2stPnNrX3Byb3QpOworCXdyaXRlX3VubG9ja19iaCgmcmF3X3Y2X2xvY2spOworfQorCisKKy8qIEdydW1ibGUuLi4gaWNtcCBhbmQgaXBfaW5wdXQgd2FudCB0byBnZXQgYXQgdGhpcy4uLiAqLworc3RydWN0IHNvY2sgKl9fcmF3X3Y2X2xvb2t1cChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIHNob3J0IG51bSwKKwkJCSAgICAgc3RydWN0IGluNl9hZGRyICpsb2NfYWRkciwgc3RydWN0IGluNl9hZGRyICpybXRfYWRkcikKK3sKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlpbnQgaXNfbXVsdGljYXN0ID0gaXB2Nl9hZGRyX2lzX211bHRpY2FzdChsb2NfYWRkcik7CisKKwlza19mb3JfZWFjaF9mcm9tKHNrLCBub2RlKQorCQlpZiAoaW5ldF9zayhzayktPm51bSA9PSBudW0pIHsKKwkJCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKKworCQkJaWYgKCFpcHY2X2FkZHJfYW55KCZucC0+ZGFkZHIpICYmCisJCQkgICAgIWlwdjZfYWRkcl9lcXVhbCgmbnAtPmRhZGRyLCBybXRfYWRkcikpCisJCQkJY29udGludWU7CisKKwkJCWlmICghaXB2Nl9hZGRyX2FueSgmbnAtPnJjdl9zYWRkcikpIHsKKwkJCQlpZiAoaXB2Nl9hZGRyX2VxdWFsKCZucC0+cmN2X3NhZGRyLCBsb2NfYWRkcikpCisJCQkJCWdvdG8gZm91bmQ7CisJCQkJaWYgKGlzX211bHRpY2FzdCAmJgorCQkJCSAgICBpbmV0Nl9tY19jaGVjayhzaywgbG9jX2FkZHIsIHJtdF9hZGRyKSkKKwkJCQkJZ290byBmb3VuZDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWdvdG8gZm91bmQ7CisJCX0KKwlzayA9IE5VTEw7Citmb3VuZDoKKwlyZXR1cm4gc2s7Cit9CisKKy8qCisgKgkwIC0gZGVsaXZlcgorICoJMSAtIGJsb2NrCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCBpY21wdjZfZmlsdGVyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaWNtcDZoZHIgKmljbXBoOworCXN0cnVjdCByYXc2X3NvY2sgKnJwID0gcmF3Nl9zayhzayk7CisKKwlpZiAocHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpKSkgeworCQlfX3UzMiAqZGF0YSA9ICZycC0+ZmlsdGVyLmRhdGFbMF07CisJCWludCBiaXRfbnI7CisKKwkJaWNtcGggPSAoc3RydWN0IGljbXA2aGRyICopIHNrYi0+ZGF0YTsKKwkJYml0X25yID0gaWNtcGgtPmljbXA2X3R5cGU7CisKKwkJcmV0dXJuIChkYXRhW2JpdF9uciA+PiA1XSAmICgxIDw8IChiaXRfbnIgJiAzMSkpKSAhPSAwOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCWRlbXVsdGlwbGV4IHJhdyBzb2NrZXRzLgorICoJKHNob3VsZCBjb25zaWRlciBxdWV1ZWluZyB0aGUgc2tiIGluIHRoZSBzb2NrIHJlY2VpdmVfcXVldWUKKyAqCXdpdGhvdXQgY2FsbGluZyByYXd2Ni5jKQorICoKKyAqCUNhbGxlciBvd25zIFNLQiBzbyB3ZSBtdXN0IG1ha2UgY2xvbmVzLgorICovCit2b2lkIGlwdjZfcmF3X2RlbGl2ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG5leHRoZHIpCit7CisJc3RydWN0IGluNl9hZGRyICpzYWRkcjsKKwlzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyOworCXN0cnVjdCBzb2NrICpzazsKKwlfX3U4IGhhc2g7CisKKwlzYWRkciA9ICZza2ItPm5oLmlwdjZoLT5zYWRkcjsKKwlkYWRkciA9IHNhZGRyICsgMTsKKworCWhhc2ggPSBuZXh0aGRyICYgKE1BWF9JTkVUX1BST1RPUyAtIDEpOworCisJcmVhZF9sb2NrKCZyYXdfdjZfbG9jayk7CisJc2sgPSBza19oZWFkKCZyYXdfdjZfaHRhYmxlW2hhc2hdKTsKKworCS8qCisJICoJVGhlIGZpcnN0IHNvY2tldCBmb3VuZCB3aWxsIGJlIGRlbGl2ZXJlZCBhZnRlcgorCSAqCWRlbGl2ZXJ5IHRvIHRyYW5zcG9ydCBwcm90b2NvbHMuCisJICovCisKKwlpZiAoc2sgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlzayA9IF9fcmF3X3Y2X2xvb2t1cChzaywgbmV4dGhkciwgZGFkZHIsIHNhZGRyKTsKKworCXdoaWxlIChzaykgeworCQlpZiAobmV4dGhkciAhPSBJUFBST1RPX0lDTVBWNiB8fCAhaWNtcHY2X2ZpbHRlcihzaywgc2tiKSkgeworCQkJc3RydWN0IHNrX2J1ZmYgKmNsb25lID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisKKwkJCS8qIE5vdCByZWxlYXNpbmcgaGFzaCB0YWJsZSEgKi8KKwkJCWlmIChjbG9uZSkKKwkJCQlyYXd2Nl9yY3Yoc2ssIGNsb25lKTsKKwkJfQorCQlzayA9IF9fcmF3X3Y2X2xvb2t1cChza19uZXh0KHNrKSwgbmV4dGhkciwgZGFkZHIsIHNhZGRyKTsKKwl9CitvdXQ6CisJcmVhZF91bmxvY2soJnJhd192Nl9sb2NrKTsKK30KKworLyogVGhpcyBjbGVhbnMgdXAgYWZfaW5ldDYgYSBiaXQuIC1EYXZlTSAqLworc3RhdGljIGludCByYXd2Nl9iaW5kKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwgaW50IGFkZHJfbGVuKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CisJc3RydWN0IHNvY2thZGRyX2luNiAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIHVhZGRyOworCV9fdTMyIHY0YWRkciA9IDA7CisJaW50IGFkZHJfdHlwZTsKKwlpbnQgZXJyOworCisJaWYgKGFkZHJfbGVuIDwgU0lONl9MRU5fUkZDMjEzMykKKwkJcmV0dXJuIC1FSU5WQUw7CisJYWRkcl90eXBlID0gaXB2Nl9hZGRyX3R5cGUoJmFkZHItPnNpbjZfYWRkcik7CisKKwkvKiBSYXcgc29ja2V0cyBhcmUgSVB2NiBvbmx5ICovCisJaWYgKGFkZHJfdHlwZSA9PSBJUFY2X0FERFJfTUFQUEVEKQorCQlyZXR1cm4oLUVBRERSTk9UQVZBSUwpOworCisJbG9ja19zb2NrKHNrKTsKKworCWVyciA9IC1FSU5WQUw7CisJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfQ0xPU0UpCisJCWdvdG8gb3V0OworCisJLyogQ2hlY2sgaWYgdGhlIGFkZHJlc3MgYmVsb25ncyB0byB0aGUgaG9zdC4gKi8KKwlpZiAoYWRkcl90eXBlICE9IElQVjZfQUREUl9BTlkpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisKKwkJaWYgKGFkZHJfdHlwZSAmIElQVjZfQUREUl9MSU5LTE9DQUwpIHsKKwkJCWlmIChhZGRyX2xlbiA+PSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikgJiYKKwkJCSAgICBhZGRyLT5zaW42X3Njb3BlX2lkKSB7CisJCQkJLyogT3ZlcnJpZGUgYW55IGV4aXN0aW5nIGJpbmRpbmcsIGlmIGFub3RoZXIKKwkJCQkgKiBvbmUgaXMgc3VwcGxpZWQgYnkgdXNlci4KKwkJCQkgKi8KKwkJCQlzay0+c2tfYm91bmRfZGV2X2lmID0gYWRkci0+c2luNl9zY29wZV9pZDsKKwkJCX0KKwkJCQorCQkJLyogQmluZGluZyB0byBsaW5rLWxvY2FsIGFkZHJlc3MgcmVxdWlyZXMgYW4gaW50ZXJmYWNlICovCisJCQlpZiAoIXNrLT5za19ib3VuZF9kZXZfaWYpCisJCQkJZ290byBvdXQ7CisKKwkJCWRldiA9IGRldl9nZXRfYnlfaW5kZXgoc2stPnNrX2JvdW5kX2Rldl9pZik7CisJCQlpZiAoIWRldikgeworCQkJCWVyciA9IC1FTk9ERVY7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJCisJCS8qIGlwdjQgYWRkciBvZiB0aGUgc29ja2V0IGlzIGludmFsaWQuICBPbmx5IHRoZQorCQkgKiB1bnNwZWNpZmllZCBhbmQgbWFwcGVkIGFkZHJlc3MgaGF2ZSBhIHY0IGVxdWl2YWxlbnQuCisJCSAqLworCQl2NGFkZHIgPSBMT09QQkFDSzRfSVBWNjsKKwkJaWYgKCEoYWRkcl90eXBlICYgSVBWNl9BRERSX01VTFRJQ0FTVCkpCXsKKwkJCWVyciA9IC1FQUREUk5PVEFWQUlMOworCQkJaWYgKCFpcHY2X2Noa19hZGRyKCZhZGRyLT5zaW42X2FkZHIsIGRldiwgMCkpIHsKKwkJCQlpZiAoZGV2KQorCQkJCQlkZXZfcHV0KGRldik7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJaWYgKGRldikKKwkJCWRldl9wdXQoZGV2KTsKKwl9CisKKwlpbmV0LT5yY3Zfc2FkZHIgPSBpbmV0LT5zYWRkciA9IHY0YWRkcjsKKwlpcHY2X2FkZHJfY29weSgmbnAtPnJjdl9zYWRkciwgJmFkZHItPnNpbjZfYWRkcik7CisJaWYgKCEoYWRkcl90eXBlICYgSVBWNl9BRERSX01VTFRJQ0FTVCkpCisJCWlwdjZfYWRkcl9jb3B5KCZucC0+c2FkZHIsICZhZGRyLT5zaW42X2FkZHIpOworCWVyciA9IDA7CitvdXQ6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIHJhd3Y2X2VycihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCisJICAgICAgIHN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0LAorCSAgICAgICBpbnQgdHlwZSwgaW50IGNvZGUsIGludCBvZmZzZXQsIHUzMiBpbmZvKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CisJaW50IGVycjsKKwlpbnQgaGFyZGVycjsKKworCS8qIFJlcG9ydCBlcnJvciBvbiByYXcgc29ja2V0LCBpZjoKKwkgICAxLiBVc2VyIHJlcXVlc3RlZCByZWN2ZXJyLgorCSAgIDIuIFNvY2tldCBpcyBjb25uZWN0ZWQgKG90aGVyd2lzZSB0aGUgZXJyb3IgaW5kaWNhdGlvbgorCSAgICAgIGlzIHVzZWxlc3Mgd2l0aG91dCByZWN2ZXJyIGFuZCBlcnJvciBpcyBoYXJkLgorCSAqLworCWlmICghbnAtPnJlY3ZlcnIgJiYgc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkKKwkJcmV0dXJuOworCisJaGFyZGVyciA9IGljbXB2Nl9lcnJfY29udmVydCh0eXBlLCBjb2RlLCAmZXJyKTsKKwlpZiAodHlwZSA9PSBJQ01QVjZfUEtUX1RPT0JJRykKKwkJaGFyZGVyciA9IChucC0+cG10dWRpc2MgPT0gSVBWNl9QTVRVRElTQ19ETyk7CisKKwlpZiAobnAtPnJlY3ZlcnIpIHsKKwkJdTggKnBheWxvYWQgPSBza2ItPmRhdGE7CisJCWlmICghaW5ldC0+aGRyaW5jbCkKKwkJCXBheWxvYWQgKz0gb2Zmc2V0OworCQlpcHY2X2ljbXBfZXJyb3Ioc2ssIHNrYiwgZXJyLCAwLCBudG9obChpbmZvKSwgcGF5bG9hZCk7CisJfQorCisJaWYgKG5wLT5yZWN2ZXJyIHx8IGhhcmRlcnIpIHsKKwkJc2stPnNrX2VyciA9IGVycjsKKwkJc2stPnNrX2Vycm9yX3JlcG9ydChzayk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCByYXd2Nl9yY3Zfc2tiKHN0cnVjdCBzb2NrICogc2ssIHN0cnVjdCBza19idWZmICogc2tiKQoreworCWlmICgocmF3Nl9zayhzayktPmNoZWNrc3VtIHx8IHNrLT5za19maWx0ZXIpICYmIAorCSAgICBza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSkgeworCQlpZiAoKHVuc2lnbmVkIHNob3J0KWNzdW1fZm9sZChza2JfY2hlY2tzdW0oc2tiLCAwLCBza2ItPmxlbiwgc2tiLT5jc3VtKSkpIHsKKwkJCS8qIEZJWE1FOiBpbmNyZW1lbnQgYSByYXc2IGRyb3BzIGNvdW50ZXIgaGVyZSAqLworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCX0KKworCS8qIENoYXJnZSBpdCB0byB0aGUgc29ja2V0LiAqLworCWlmIChzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssc2tiKTwwKSB7CisJCS8qIEZJWE1FOiBpbmNyZW1lbnQgYSByYXc2IGRyb3BzIGNvdW50ZXIgaGVyZSAqLworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglUaGlzIGlzIG5leHQgdG8gdXNlbGVzcy4uLiAKKyAqCWlmIHdlIGRlbXVsdGlwbGV4IGluIG5ldHdvcmsgbGF5ZXIgd2UgZG9uJ3QgbmVlZCB0aGUgZXh0cmEgY2FsbAorICoJanVzdCB0byBxdWV1ZSB0aGUgc2tiLi4uIAorICoJbWF5YmUgd2UgY291bGQgaGF2ZSB0aGUgbmV0d29yayBkZWNpZGUgdXBvbiBhIGhpbnQgaWYgaXQgCisgKglzaG91bGQgY2FsbCByYXdfcmN2IGZvciBkZW11bHRpcGxleGluZworICovCitpbnQgcmF3djZfcmN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisJc3RydWN0IHJhdzZfc29jayAqcnAgPSByYXc2X3NrKHNrKTsKKworICAgICAgICBpZiAoIXhmcm02X3BvbGljeV9jaGVjayhzaywgWEZSTV9QT0xJQ1lfSU4sIHNrYikpIHsKKyAgICAgICAgICAgICAgICBrZnJlZV9za2Ioc2tiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkVUX1JYX0RST1A7CisgICAgICAgIH0KKworCWlmICghcnAtPmNoZWNrc3VtKQorCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCisJaWYgKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1VOTkVDRVNTQVJZKSB7CisJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykgeworCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJCWlmIChjc3VtX2lwdjZfbWFnaWMoJnNrYi0+bmguaXB2NmgtPnNhZGRyLAorCQkJCQkgICAgJnNrYi0+bmguaXB2NmgtPmRhZGRyLAorCQkJCQkgICAgc2tiLT5sZW4sIGluZXQtPm51bSwgc2tiLT5jc3VtKSkgeworCQkJCUxJTUlUX05FVERFQlVHKAorCQkJICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAicmF3IHY2IGh3IGNzdW0gZmFpbHVyZS5cbiIpKTsKKwkJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCQl9CisJCX0KKwkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX05PTkUpCisJCQlza2ItPmNzdW0gPSB+Y3N1bV9pcHY2X21hZ2ljKCZza2ItPm5oLmlwdjZoLT5zYWRkciwKKwkJCQkJCSAgICAgJnNrYi0+bmguaXB2NmgtPmRhZGRyLAorCQkJCQkJICAgICBza2ItPmxlbiwgaW5ldC0+bnVtLCAwKTsKKwl9CisKKwlpZiAoaW5ldC0+aGRyaW5jbCkgeworCQlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkgJiYKKwkJICAgICh1bnNpZ25lZCBzaG9ydCljc3VtX2ZvbGQoc2tiX2NoZWNrc3VtKHNrYiwgMCwgc2tiLT5sZW4sIHNrYi0+Y3N1bSkpKSB7CisJCQkvKiBGSVhNRTogaW5jcmVtZW50IGEgcmF3NiBkcm9wcyBjb3VudGVyIGhlcmUgKi8KKwkJCWtmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwl9CisKKwlyYXd2Nl9yY3Zfc2tiKHNrLCBza2IpOworCXJldHVybiAwOworfQorCisKKy8qCisgKglUaGlzIHNob3VsZCBiZSBlYXN5LCBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdGhlcmUKKyAqCXdlIHJldHVybiBpdCwgb3RoZXJ3aXNlIHdlIGJsb2NrLgorICovCisKK3N0YXRpYyBpbnQgcmF3djZfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywKKwkJICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sCisJCSAgaW50IG5vYmxvY2ssIGludCBmbGFncywgaW50ICphZGRyX2xlbikKK3sKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CisJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopbXNnLT5tc2dfbmFtZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXNpemVfdCBjb3BpZWQ7CisJaW50IGVycjsKKworCWlmIChmbGFncyAmIE1TR19PT0IpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJCisJaWYgKGFkZHJfbGVuKSAKKwkJKmFkZHJfbGVuPXNpemVvZigqc2luNik7CisKKwlpZiAoZmxhZ3MgJiBNU0dfRVJSUVVFVUUpCisJCXJldHVybiBpcHY2X3JlY3ZfZXJyb3Ioc2ssIG1zZywgbGVuKTsKKworCXNrYiA9IHNrYl9yZWN2X2RhdGFncmFtKHNrLCBmbGFncywgbm9ibG9jaywgJmVycik7CisJaWYgKCFza2IpCisJCWdvdG8gb3V0OworCisJY29waWVkID0gc2tiLT5sZW47CisgIAlpZiAoY29waWVkID4gbGVuKSB7CisgIAkJY29waWVkID0gbGVuOworICAJCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19UUlVOQzsKKyAgCX0KKworCWlmIChza2ItPmlwX3N1bW1lZD09Q0hFQ0tTVU1fVU5ORUNFU1NBUlkpIHsKKwkJZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCAwLCBtc2ctPm1zZ19pb3YsIGNvcGllZCk7CisJfSBlbHNlIGlmIChtc2ctPm1zZ19mbGFncyZNU0dfVFJVTkMpIHsKKwkJaWYgKCh1bnNpZ25lZCBzaG9ydCljc3VtX2ZvbGQoc2tiX2NoZWNrc3VtKHNrYiwgMCwgc2tiLT5sZW4sIHNrYi0+Y3N1bSkpKQorCQkJZ290byBjc3VtX2NvcHlfZXJyOworCQllcnIgPSBza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhza2IsIDAsIG1zZy0+bXNnX2lvdiwgY29waWVkKTsKKwl9IGVsc2UgeworCQllcnIgPSBza2JfY29weV9hbmRfY3N1bV9kYXRhZ3JhbV9pb3ZlYyhza2IsIDAsIG1zZy0+bXNnX2lvdik7CisJCWlmIChlcnIgPT0gLUVJTlZBTCkKKwkJCWdvdG8gY3N1bV9jb3B5X2VycjsKKwl9CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZTsKKworCS8qIENvcHkgdGhlIGFkZHJlc3MuICovCisJaWYgKHNpbjYpIHsKKwkJc2luNi0+c2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKwkJaXB2Nl9hZGRyX2NvcHkoJnNpbjYtPnNpbjZfYWRkciwgJnNrYi0+bmguaXB2NmgtPnNhZGRyKTsKKwkJc2luNi0+c2luNl9mbG93aW5mbyA9IDA7CisJCXNpbjYtPnNpbjZfc2NvcGVfaWQgPSAwOworCQlpZiAoaXB2Nl9hZGRyX3R5cGUoJnNpbjYtPnNpbjZfYWRkcikgJiBJUFY2X0FERFJfTElOS0xPQ0FMKQorCQkJc2luNi0+c2luNl9zY29wZV9pZCA9IElQNkNCKHNrYiktPmlpZjsKKwl9CisKKwlzb2NrX3JlY3ZfdGltZXN0YW1wKG1zZywgc2ssIHNrYik7CisKKwlpZiAobnAtPnJ4b3B0LmFsbCkKKwkJZGF0YWdyYW1fcmVjdl9jdGwoc2ssIG1zZywgc2tiKTsKKworCWVyciA9IGNvcGllZDsKKwlpZiAoZmxhZ3MgJiBNU0dfVFJVTkMpCisJCWVyciA9IHNrYi0+bGVuOworCitvdXRfZnJlZToKKwlza2JfZnJlZV9kYXRhZ3JhbShzaywgc2tiKTsKK291dDoKKwlyZXR1cm4gZXJyOworCitjc3VtX2NvcHlfZXJyOgorCS8qIENsZWFyIHF1ZXVlLiAqLworCWlmIChmbGFncyZNU0dfUEVFSykgeworCQlpbnQgY2xlYXIgPSAwOworCQlzcGluX2xvY2tfaXJxKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwkJaWYgKHNrYiA9PSBza2JfcGVlaygmc2stPnNrX3JlY2VpdmVfcXVldWUpKSB7CisJCQlfX3NrYl91bmxpbmsoc2tiLCAmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCQkJY2xlYXIgPSAxOworCQl9CisJCXNwaW5fdW5sb2NrX2lycSgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7CisJCWlmIChjbGVhcikKKwkJCWtmcmVlX3NrYihza2IpOworCX0KKworCS8qIEVycm9yIGZvciBibG9ja2luZyBjYXNlIGlzIGNob3NlbiB0byBtYXNxdWVyYWRlCisJICAgYXMgc29tZSBub3JtYWwgY29uZGl0aW9uLgorCSAqLworCWVyciA9IChmbGFncyZNU0dfRE9OVFdBSVQpID8gLUVBR0FJTiA6IC1FSE9TVFVOUkVBQ0g7CisJLyogRklYTUU6IGluY3JlbWVudCBhIHJhdzYgZHJvcHMgY291bnRlciBoZXJlICovCisJZ290byBvdXRfZnJlZTsKK30KKworc3RhdGljIGludCByYXd2Nl9wdXNoX3BlbmRpbmdfZnJhbWVzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGZsb3dpICpmbCwKKwkJCQkgICAgIHN0cnVjdCByYXc2X3NvY2sgKnJwLCBpbnQgbGVuKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGVyciA9IDA7CisJdTE2ICpjc3VtOworCXUzMiB0bXBfY3N1bTsKKworCWlmICghcnAtPmNoZWNrc3VtKQorCQlnb3RvIHNlbmQ7CisKKwlpZiAoKHNrYiA9IHNrYl9wZWVrKCZzay0+c2tfd3JpdGVfcXVldWUpKSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWlmIChycC0+b2Zmc2V0ICsgMSA8IGxlbikKKwkJY3N1bSA9ICh1MTYgKikoc2tiLT5oLnJhdyArIHJwLT5vZmZzZXQpOworCWVsc2UgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBzaG91bGQgYmUgY2hlY2sgSFcgY3N1bSBtaXlhemF3YSAqLworCWlmIChza2JfcXVldWVfbGVuKCZzay0+c2tfd3JpdGVfcXVldWUpID09IDEpIHsKKwkJLyoKKwkJICogT25seSBvbmUgZnJhZ21lbnQgb24gdGhlIHNvY2tldC4KKwkJICovCisJCXRtcF9jc3VtID0gc2tiLT5jc3VtOworCX0gZWxzZSB7CisJCXRtcF9jc3VtID0gMDsKKworCQlza2JfcXVldWVfd2Fsaygmc2stPnNrX3dyaXRlX3F1ZXVlLCBza2IpIHsKKwkJCXRtcF9jc3VtID0gY3N1bV9hZGQodG1wX2NzdW0sIHNrYi0+Y3N1bSk7CisJCX0KKwl9CisKKwkvKiBpbiBjYXNlIGNrc3VtIHdhcyBub3QgaW5pdGlhbGl6ZWQgKi8KKwlpZiAodW5saWtlbHkoKmNzdW0pKQorCQl0bXBfY3N1bSA9IGNzdW1fc3ViKHRtcF9jc3VtLCAqY3N1bSk7CisKKwkqY3N1bSA9IGNzdW1faXB2Nl9tYWdpYygmZmwtPmZsNl9zcmMsCisJCQkJJmZsLT5mbDZfZHN0LAorCQkJCWxlbiwgZmwtPnByb3RvLCB0bXBfY3N1bSk7CisKKwlpZiAoKmNzdW0gPT0gMCkKKwkJKmNzdW0gPSAtMTsKK3NlbmQ6CisJZXJyID0gaXA2X3B1c2hfcGVuZGluZ19mcmFtZXMoc2spOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmF3djZfc2VuZF9oZHJpbmMoc3RydWN0IHNvY2sgKnNrLCB2b2lkICpmcm9tLCBpbnQgbGVuZ3RoLAorCQkJc3RydWN0IGZsb3dpICpmbCwgc3RydWN0IHJ0Nl9pbmZvICpydCwgCisJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCXN0cnVjdCBpcHY2aGRyICppcGg7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBpbnQgaGhfbGVuOworCWludCBlcnI7CisKKwlpZiAobGVuZ3RoID4gcnQtPnUuZHN0LmRldi0+bXR1KSB7CisJCWlwdjZfbG9jYWxfZXJyb3Ioc2ssIEVNU0dTSVpFLCBmbCwgcnQtPnUuZHN0LmRldi0+bXR1KTsKKwkJcmV0dXJuIC1FTVNHU0laRTsKKwl9CisJaWYgKGZsYWdzJk1TR19QUk9CRSkKKwkJZ290byBvdXQ7CisKKwloaF9sZW4gPSBMTF9SRVNFUlZFRF9TUEFDRShydC0+dS5kc3QuZGV2KTsKKworCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssIGxlbmd0aCtoaF9sZW4rMTUsCisJCQkJICBmbGFncyZNU0dfRE9OVFdBSVQsICZlcnIpOworCWlmIChza2IgPT0gTlVMTCkKKwkJZ290byBlcnJvcjsgCisJc2tiX3Jlc2VydmUoc2tiLCBoaF9sZW4pOworCisJc2tiLT5wcmlvcml0eSA9IHNrLT5za19wcmlvcml0eTsKKwlza2ItPmRzdCA9IGRzdF9jbG9uZSgmcnQtPnUuZHN0KTsKKworCXNrYi0+bmguaXB2NmggPSBpcGggPSAoc3RydWN0IGlwdjZoZHIgKilza2JfcHV0KHNrYiwgbGVuZ3RoKTsKKworCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKworCXNrYi0+aC5yYXcgPSBza2ItPm5oLnJhdzsKKwllcnIgPSBtZW1jcHlfZnJvbWlvdmVjZW5kKCh2b2lkICopaXBoLCBmcm9tLCAwLCBsZW5ndGgpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3JfZmF1bHQ7CisKKwlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsJCQorCWVyciA9IE5GX0hPT0soUEZfSU5FVDYsIE5GX0lQNl9MT0NBTF9PVVQsIHNrYiwgTlVMTCwgcnQtPnUuZHN0LmRldiwKKwkJICAgICAgZHN0X291dHB1dCk7CisJaWYgKGVyciA+IDApCisJCWVyciA9IGluZXQtPnJlY3ZlcnIgPyBuZXRfeG1pdF9lcnJubyhlcnIpIDogMDsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yOworb3V0OgorCXJldHVybiAwOworCitlcnJvcl9mYXVsdDoKKwllcnIgPSAtRUZBVUxUOworCWtmcmVlX3NrYihza2IpOworZXJyb3I6CisJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CisJcmV0dXJuIGVycjsgCit9CisKK3N0YXRpYyB2b2lkIHJhd3Y2X3Byb2JlX3Byb3RvX29wdChzdHJ1Y3QgZmxvd2kgKmZsLCBzdHJ1Y3QgbXNnaGRyICptc2cpCit7CisJc3RydWN0IGlvdmVjICppb3Y7CisJdTggX191c2VyICp0eXBlID0gTlVMTDsKKwl1OCBfX3VzZXIgKmNvZGUgPSBOVUxMOworCWludCBwcm9iZWQgPSAwOworCWludCBpOworCisJaWYgKCFtc2ctPm1zZ19pb3YpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBtc2ctPm1zZ19pb3ZsZW47IGkrKykgeworCQlpb3YgPSAmbXNnLT5tc2dfaW92W2ldOworCQlpZiAoIWlvdikKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAoZmwtPnByb3RvKSB7CisJCWNhc2UgSVBQUk9UT19JQ01QVjY6CisJCQkvKiBjaGVjayBpZiBvbmUtYnl0ZSBmaWVsZCBpcyByZWFkYWJsZSBvciBub3QuICovCisJCQlpZiAoaW92LT5pb3ZfYmFzZSAmJiBpb3YtPmlvdl9sZW4gPCAxKQorCQkJCWJyZWFrOworCisJCQlpZiAoIXR5cGUpIHsKKwkJCQl0eXBlID0gaW92LT5pb3ZfYmFzZTsKKwkJCQkvKiBjaGVjayBpZiBjb2RlIGZpZWxkIGlzIHJlYWRhYmxlIG9yIG5vdC4gKi8KKwkJCQlpZiAoaW92LT5pb3ZfbGVuID4gMSkKKwkJCQkJY29kZSA9IHR5cGUgKyAxOworCQkJfSBlbHNlIGlmICghY29kZSkKKwkJCQljb2RlID0gaW92LT5pb3ZfYmFzZTsKKworCQkJaWYgKHR5cGUgJiYgY29kZSkgeworCQkJCWdldF91c2VyKGZsLT5mbF9pY21wX3R5cGUsIHR5cGUpOworCQkJCV9fZ2V0X3VzZXIoZmwtPmZsX2ljbXBfY29kZSwgY29kZSk7CisJCQkJcHJvYmVkID0gMTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJvYmVkID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChwcm9iZWQpCisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmF3djZfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywKKwkJICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBpcHY2X3R4b3B0aW9ucyBvcHRfc3BhY2U7CisJc3RydWN0IHNvY2thZGRyX2luNiAqIHNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSBtc2ctPm1zZ19uYW1lOworCXN0cnVjdCBpbjZfYWRkciAqZGFkZHIsICpmaW5hbF9wID0gTlVMTCwgZmluYWw7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKKwlzdHJ1Y3QgcmF3Nl9zb2NrICpycCA9IHJhdzZfc2soc2spOworCXN0cnVjdCBpcHY2X3R4b3B0aW9ucyAqb3B0ID0gTlVMTDsKKwlzdHJ1Y3QgaXA2X2Zsb3dsYWJlbCAqZmxvd2xhYmVsID0gTlVMTDsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBOVUxMOworCXN0cnVjdCBmbG93aSBmbDsKKwlpbnQgYWRkcl9sZW4gPSBtc2ctPm1zZ19uYW1lbGVuOworCWludCBobGltaXQgPSAtMTsKKwl1MTYgcHJvdG87CisJaW50IGVycjsKKworCS8qIFJvdWdoIGNoZWNrIG9uIGFyaXRobWV0aWMgb3ZlcmZsb3csCisJICAgYmV0dGVyIGNoZWNrIGlzIG1hZGUgaW4gaXA2X2J1aWxkX3htaXQKKwkgKi8KKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCS8qIE1pcnJvciBCU0QgZXJyb3IgbWVzc2FnZSBjb21wYXRpYmlsaXR5ICovCisJaWYgKG1zZy0+bXNnX2ZsYWdzICYgTVNHX09PQikJCQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkvKgorCSAqCUdldCBhbmQgdmVyaWZ5IHRoZSBhZGRyZXNzLiAKKwkgKi8KKwltZW1zZXQoJmZsLCAwLCBzaXplb2YoZmwpKTsKKworCWlmIChzaW42KSB7CisJCWlmIChhZGRyX2xlbiA8IFNJTjZfTEVOX1JGQzIxMzMpIAorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKHNpbjYtPnNpbjZfZmFtaWx5ICYmIHNpbjYtPnNpbjZfZmFtaWx5ICE9IEFGX0lORVQ2KSAKKwkJCXJldHVybigtRUFGTk9TVVBQT1JUKTsKKworCQkvKiBwb3J0IGlzIHRoZSBwcm90byB2YWx1ZSBbMC4uMjU1XSBjYXJyaWVkIGluIG5leHRoZHIgKi8KKwkJcHJvdG8gPSBudG9ocyhzaW42LT5zaW42X3BvcnQpOworCisJCWlmICghcHJvdG8pCisJCQlwcm90byA9IGluZXQtPm51bTsKKwkJZWxzZSBpZiAocHJvdG8gIT0gaW5ldC0+bnVtKQorCQkJcmV0dXJuKC1FSU5WQUwpOworCisJCWlmIChwcm90byA+IDI1NSkKKwkJCXJldHVybigtRUlOVkFMKTsKKworCQlkYWRkciA9ICZzaW42LT5zaW42X2FkZHI7CisJCWlmIChucC0+c25kZmxvdykgeworCQkJZmwuZmw2X2Zsb3dsYWJlbCA9IHNpbjYtPnNpbjZfZmxvd2luZm8mSVBWNl9GTE9XSU5GT19NQVNLOworCQkJaWYgKGZsLmZsNl9mbG93bGFiZWwmSVBWNl9GTE9XTEFCRUxfTUFTSykgeworCQkJCWZsb3dsYWJlbCA9IGZsNl9zb2NrX2xvb2t1cChzaywgZmwuZmw2X2Zsb3dsYWJlbCk7CisJCQkJaWYgKGZsb3dsYWJlbCA9PSBOVUxMKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlkYWRkciA9ICZmbG93bGFiZWwtPmRzdDsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIE90aGVyd2lzZSBpdCB3aWxsIGJlIGRpZmZpY3VsdCB0byBtYWludGFpbgorCQkgKiBzay0+c2tfZHN0X2NhY2hlLgorCQkgKi8KKwkJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfRVNUQUJMSVNIRUQgJiYKKwkJICAgIGlwdjZfYWRkcl9lcXVhbChkYWRkciwgJm5wLT5kYWRkcikpCisJCQlkYWRkciA9ICZucC0+ZGFkZHI7CisKKwkJaWYgKGFkZHJfbGVuID49IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSAmJgorCQkgICAgc2luNi0+c2luNl9zY29wZV9pZCAmJgorCQkgICAgaXB2Nl9hZGRyX3R5cGUoZGFkZHIpJklQVjZfQUREUl9MSU5LTE9DQUwpCisJCQlmbC5vaWYgPSBzaW42LT5zaW42X3Njb3BlX2lkOworCX0gZWxzZSB7CisJCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKSAKKwkJCXJldHVybiAtRURFU1RBRERSUkVROworCQkKKwkJcHJvdG8gPSBpbmV0LT5udW07CisJCWRhZGRyID0gJm5wLT5kYWRkcjsKKwkJZmwuZmw2X2Zsb3dsYWJlbCA9IG5wLT5mbG93X2xhYmVsOworCX0KKworCWlmIChpcHY2X2FkZHJfYW55KGRhZGRyKSkgeworCQkvKiAKKwkJICogdW5zcGVjaWZpZWQgZGVzdGluYXRpb24gYWRkcmVzcyAKKwkJICogdHJlYXRlZCBhcyBlcnJvci4uLiBpcyB0aGlzIGNvcnJlY3QgPworCQkgKi8KKwkJZmw2X3NvY2tfcmVsZWFzZShmbG93bGFiZWwpOworCQlyZXR1cm4oLUVJTlZBTCk7CisJfQorCisJaWYgKGZsLm9pZiA9PSAwKQorCQlmbC5vaWYgPSBzay0+c2tfYm91bmRfZGV2X2lmOworCisJaWYgKG1zZy0+bXNnX2NvbnRyb2xsZW4pIHsKKwkJb3B0ID0gJm9wdF9zcGFjZTsKKwkJbWVtc2V0KG9wdCwgMCwgc2l6ZW9mKHN0cnVjdCBpcHY2X3R4b3B0aW9ucykpOworCQlvcHQtPnRvdF9sZW4gPSBzaXplb2Yoc3RydWN0IGlwdjZfdHhvcHRpb25zKTsKKworCQllcnIgPSBkYXRhZ3JhbV9zZW5kX2N0bChtc2csICZmbCwgb3B0LCAmaGxpbWl0KTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWZsNl9zb2NrX3JlbGVhc2UoZmxvd2xhYmVsKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJaWYgKChmbC5mbDZfZmxvd2xhYmVsJklQVjZfRkxPV0xBQkVMX01BU0spICYmICFmbG93bGFiZWwpIHsKKwkJCWZsb3dsYWJlbCA9IGZsNl9zb2NrX2xvb2t1cChzaywgZmwuZmw2X2Zsb3dsYWJlbCk7CisJCQlpZiAoZmxvd2xhYmVsID09IE5VTEwpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKCEob3B0LT5vcHRfbmZsZW58b3B0LT5vcHRfZmxlbikpCisJCQlvcHQgPSBOVUxMOworCX0KKwlpZiAob3B0ID09IE5VTEwpCisJCW9wdCA9IG5wLT5vcHQ7CisJaWYgKGZsb3dsYWJlbCkKKwkJb3B0ID0gZmw2X21lcmdlX29wdGlvbnMoJm9wdF9zcGFjZSwgZmxvd2xhYmVsLCBvcHQpOworCisJZmwucHJvdG8gPSBwcm90bzsKKwlyYXd2Nl9wcm9iZV9wcm90b19vcHQoJmZsLCBtc2cpOworIAorCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCBkYWRkcik7CisJaWYgKGlwdjZfYWRkcl9hbnkoJmZsLmZsNl9zcmMpICYmICFpcHY2X2FkZHJfYW55KCZucC0+c2FkZHIpKQorCQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X3NyYywgJm5wLT5zYWRkcik7CisKKwkvKiBtZXJnZSBpcDZfYnVpbGRfeG1pdCBmcm9tIGlwNl9vdXRwdXQgKi8KKwlpZiAob3B0ICYmIG9wdC0+c3JjcnQpIHsKKwkJc3RydWN0IHJ0MF9oZHIgKnJ0MCA9IChzdHJ1Y3QgcnQwX2hkciAqKSBvcHQtPnNyY3J0OworCQlpcHY2X2FkZHJfY29weSgmZmluYWwsICZmbC5mbDZfZHN0KTsKKwkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsIHJ0MC0+YWRkcik7CisJCWZpbmFsX3AgPSAmZmluYWw7CisJfQorCisJaWYgKCFmbC5vaWYgJiYgaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmZmwuZmw2X2RzdCkpCisJCWZsLm9pZiA9IG5wLT5tY2FzdF9vaWY7CisKKwllcnIgPSBpcDZfZHN0X2xvb2t1cChzaywgJmRzdCwgJmZsKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlpZiAoZmluYWxfcCkKKwkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsIGZpbmFsX3ApOworCisJaWYgKChlcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIHNrLCAwKSkgPCAwKSB7CisJCWRzdF9yZWxlYXNlKGRzdCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChobGltaXQgPCAwKSB7CisJCWlmIChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZmbC5mbDZfZHN0KSkKKwkJCWhsaW1pdCA9IG5wLT5tY2FzdF9ob3BzOworCQllbHNlCisJCQlobGltaXQgPSBucC0+aG9wX2xpbWl0OworCQlpZiAoaGxpbWl0IDwgMCkKKwkJCWhsaW1pdCA9IGRzdF9tZXRyaWMoZHN0LCBSVEFYX0hPUExJTUlUKTsKKwkJaWYgKGhsaW1pdCA8IDApCisJCQlobGltaXQgPSBpcHY2X2dldF9ob3BsaW1pdChkc3QtPmRldik7CisJfQorCisJaWYgKG1zZy0+bXNnX2ZsYWdzJk1TR19DT05GSVJNKQorCQlnb3RvIGRvX2NvbmZpcm07CisKK2JhY2tfZnJvbV9jb25maXJtOgorCWlmIChpbmV0LT5oZHJpbmNsKSB7CisJCWVyciA9IHJhd3Y2X3NlbmRfaGRyaW5jKHNrLCBtc2ctPm1zZ19pb3YsIGxlbiwgJmZsLCAoc3RydWN0IHJ0Nl9pbmZvKilkc3QsIG1zZy0+bXNnX2ZsYWdzKTsKKwl9IGVsc2UgeworCQlsb2NrX3NvY2soc2spOworCQllcnIgPSBpcDZfYXBwZW5kX2RhdGEoc2ssIGlwX2dlbmVyaWNfZ2V0ZnJhZywgbXNnLT5tc2dfaW92LCBsZW4sIDAsCisJCQkJCWhsaW1pdCwgb3B0LCAmZmwsIChzdHJ1Y3QgcnQ2X2luZm8qKWRzdCwgbXNnLT5tc2dfZmxhZ3MpOworCisJCWlmIChlcnIpCisJCQlpcDZfZmx1c2hfcGVuZGluZ19mcmFtZXMoc2spOworCQllbHNlIGlmICghKG1zZy0+bXNnX2ZsYWdzICYgTVNHX01PUkUpKQorCQkJZXJyID0gcmF3djZfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzaywgJmZsLCBycCwgbGVuKTsKKwl9Citkb25lOgorCWlwNl9kc3Rfc3RvcmUoc2ssIGRzdCwKKwkJICAgICAgaXB2Nl9hZGRyX2VxdWFsKCZmbC5mbDZfZHN0LCAmbnAtPmRhZGRyKSA/CisJCSAgICAgICZucC0+ZGFkZHIgOiBOVUxMKTsKKwlpZiAoZXJyID4gMCkKKwkJZXJyID0gbnAtPnJlY3ZlcnIgPyBuZXRfeG1pdF9lcnJubyhlcnIpIDogMDsKKworCXJlbGVhc2Vfc29jayhzayk7CitvdXQ6CQorCWZsNl9zb2NrX3JlbGVhc2UoZmxvd2xhYmVsKTsKKwlyZXR1cm4gZXJyPDA/ZXJyOmxlbjsKK2RvX2NvbmZpcm06CisJZHN0X2NvbmZpcm0oZHN0KTsKKwlpZiAoIShtc2ctPm1zZ19mbGFncyAmIE1TR19QUk9CRSkgfHwgbGVuKQorCQlnb3RvIGJhY2tfZnJvbV9jb25maXJtOworCWVyciA9IDA7CisJZ290byBkb25lOworfQorCitzdGF0aWMgaW50IHJhd3Y2X3NldGljbXBmaWx0ZXIoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCAKKwkJCSAgICAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQoreworCXN3aXRjaCAob3B0bmFtZSkgeworCWNhc2UgSUNNUFY2X0ZJTFRFUjoKKwkJaWYgKG9wdGxlbiA+IHNpemVvZihzdHJ1Y3QgaWNtcDZfZmlsdGVyKSkKKwkJCW9wdGxlbiA9IHNpemVvZihzdHJ1Y3QgaWNtcDZfZmlsdGVyKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZyYXc2X3NrKHNrKS0+ZmlsdGVyLCBvcHR2YWwsIG9wdGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKwl9OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmF3djZfZ2V0aWNtcGZpbHRlcihzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIAorCQkJICAgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKK3sKKwlpbnQgbGVuOworCisJc3dpdGNoIChvcHRuYW1lKSB7CisJY2FzZSBJQ01QVjZfRklMVEVSOgorCQlpZiAoZ2V0X3VzZXIobGVuLCBvcHRsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChsZW4gPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChsZW4gPiBzaXplb2Yoc3RydWN0IGljbXA2X2ZpbHRlcikpCisJCQlsZW4gPSBzaXplb2Yoc3RydWN0IGljbXA2X2ZpbHRlcik7CisJCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsICZyYXc2X3NrKHNrKS0+ZmlsdGVyLCBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisJfTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcmF3djZfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIAorCQkJICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCit7CisJc3RydWN0IHJhdzZfc29jayAqcnAgPSByYXc2X3NrKHNrKTsKKwlpbnQgdmFsOworCisJc3dpdGNoKGxldmVsKSB7CisJCWNhc2UgU09MX1JBVzoKKwkJCWJyZWFrOworCisJCWNhc2UgU09MX0lDTVBWNjoKKwkJCWlmIChpbmV0X3NrKHNrKS0+bnVtICE9IElQUFJPVE9fSUNNUFY2KQorCQkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJCXJldHVybiByYXd2Nl9zZXRpY21wZmlsdGVyKHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLAorCQkJCQkJICAgb3B0bGVuKTsKKwkJY2FzZSBTT0xfSVBWNjoKKwkJCWlmIChvcHRuYW1lID09IElQVjZfQ0hFQ0tTVU0pCisJCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gaXB2Nl9zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLAorCQkJCQkgICAgICAgb3B0bGVuKTsKKwl9OworCisgIAlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKW9wdHZhbCkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3dpdGNoIChvcHRuYW1lKSB7CisJCWNhc2UgSVBWNl9DSEVDS1NVTToKKwkJCS8qIFlvdSBtYXkgZ2V0IHN0cmFuZ2UgcmVzdWx0IHdpdGggYSBwb3NpdGl2ZSBvZGQgb2Zmc2V0OworCQkJICAgUkZDMjI5MmJpcyBhZ3JlZXMgd2l0aCBtZS4gKi8KKwkJCWlmICh2YWwgPiAwICYmICh2YWwmMSkpCisJCQkJcmV0dXJuKC1FSU5WQUwpOworCQkJaWYgKHZhbCA8IDApIHsKKwkJCQlycC0+Y2hlY2tzdW0gPSAwOworCQkJfSBlbHNlIHsKKwkJCQlycC0+Y2hlY2tzdW0gPSAxOworCQkJCXJwLT5vZmZzZXQgPSB2YWw7CisJCQl9CisKKwkJCXJldHVybiAwOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybigtRU5PUFJPVE9PUFQpOworCX0KK30KKworc3RhdGljIGludCByYXd2Nl9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgCisJCQkgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoreworCXN0cnVjdCByYXc2X3NvY2sgKnJwID0gcmF3Nl9zayhzayk7CisJaW50IHZhbCwgbGVuOworCisJc3dpdGNoKGxldmVsKSB7CisJCWNhc2UgU09MX1JBVzoKKwkJCWJyZWFrOworCisJCWNhc2UgU09MX0lDTVBWNjoKKwkJCWlmIChpbmV0X3NrKHNrKS0+bnVtICE9IElQUFJPVE9fSUNNUFY2KQorCQkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJCXJldHVybiByYXd2Nl9nZXRpY21wZmlsdGVyKHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLAorCQkJCQkJICAgb3B0bGVuKTsKKwkJY2FzZSBTT0xfSVBWNjoKKwkJCWlmIChvcHRuYW1lID09IElQVjZfQ0hFQ0tTVU0pCisJCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gaXB2Nl9nZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLAorCQkJCQkgICAgICAgb3B0bGVuKTsKKwl9OworCisJaWYgKGdldF91c2VyKGxlbixvcHRsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaCAob3B0bmFtZSkgeworCWNhc2UgSVBWNl9DSEVDS1NVTToKKwkJaWYgKHJwLT5jaGVja3N1bSA9PSAwKQorCQkJdmFsID0gLTE7CisJCWVsc2UKKwkJCXZhbCA9IHJwLT5vZmZzZXQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKwl9CisKKwlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHNpemVvZihpbnQpLCBsZW4pOworCisJaWYgKHB1dF91c2VyKGxlbiwgb3B0bGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsJnZhbCxsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYXd2Nl9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN3aXRjaChjbWQpIHsKKwkJY2FzZSBTSU9DT1VUUToKKwkJeworCQkJaW50IGFtb3VudCA9IGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYyk7CisJCQlyZXR1cm4gcHV0X3VzZXIoYW1vdW50LCAoaW50IF9fdXNlciAqKWFyZyk7CisJCX0KKwkJY2FzZSBTSU9DSU5ROgorCQl7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJaW50IGFtb3VudCA9IDA7CisKKwkJCXNwaW5fbG9ja19pcnEoJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOworCQkJc2tiID0gc2tiX3BlZWsoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwkJCWlmIChza2IgIT0gTlVMTCkKKwkJCQlhbW91bnQgPSBza2ItPnRhaWwgLSBza2ItPmgucmF3OworCQkJc3Bpbl91bmxvY2tfaXJxKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwkJCXJldHVybiBwdXRfdXNlcihhbW91bnQsIChpbnQgX191c2VyICopYXJnKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KK30KKworc3RhdGljIHZvaWQgcmF3djZfY2xvc2Uoc3RydWN0IHNvY2sgKnNrLCBsb25nIHRpbWVvdXQpCit7CisJaWYgKGluZXRfc2soc2spLT5udW0gPT0gSVBQUk9UT19SQVcpCisJCWlwNl9yYV9jb250cm9sKHNrLCAtMSwgTlVMTCk7CisKKwlza19jb21tb25fcmVsZWFzZShzayk7Cit9CisKK3N0YXRpYyBpbnQgcmF3djZfaW5pdF9zayhzdHJ1Y3Qgc29jayAqc2spCit7CisJaWYgKGluZXRfc2soc2spLT5udW0gPT0gSVBQUk9UT19JQ01QVjYpIHsKKwkJc3RydWN0IHJhdzZfc29jayAqcnAgPSByYXc2X3NrKHNrKTsKKwkJcnAtPmNoZWNrc3VtID0gMTsKKwkJcnAtPm9mZnNldCAgID0gMjsKKwl9CisJcmV0dXJuKDApOworfQorCitzdHJ1Y3QgcHJvdG8gcmF3djZfcHJvdCA9IHsKKwkubmFtZSA9CQkiUkFXdjYiLAorCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5jbG9zZSA9CXJhd3Y2X2Nsb3NlLAorCS5jb25uZWN0ID0JaXA2X2RhdGFncmFtX2Nvbm5lY3QsCisJLmRpc2Nvbm5lY3QgPQl1ZHBfZGlzY29ubmVjdCwKKwkuaW9jdGwgPQlyYXd2Nl9pb2N0bCwKKwkuaW5pdCA9CQlyYXd2Nl9pbml0X3NrLAorCS5kZXN0cm95ID0JaW5ldDZfZGVzdHJveV9zb2NrLAorCS5zZXRzb2Nrb3B0ID0JcmF3djZfc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdCA9CXJhd3Y2X2dldHNvY2tvcHQsCisJLnNlbmRtc2cgPQlyYXd2Nl9zZW5kbXNnLAorCS5yZWN2bXNnID0JcmF3djZfcmVjdm1zZywKKwkuYmluZCA9CQlyYXd2Nl9iaW5kLAorCS5iYWNrbG9nX3JjdiA9CXJhd3Y2X3Jjdl9za2IsCisJLmhhc2ggPQkJcmF3X3Y2X2hhc2gsCisJLnVuaGFzaCA9CXJhd192Nl91bmhhc2gsCisJLm9ial9zaXplID0Jc2l6ZW9mKHN0cnVjdCByYXc2X3NvY2spLAorfTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdHJ1Y3QgcmF3Nl9pdGVyX3N0YXRlIHsKKwlpbnQgYnVja2V0OworfTsKKworI2RlZmluZSByYXc2X3NlcV9wcml2YXRlKHNlcSkgKChzdHJ1Y3QgcmF3Nl9pdGVyX3N0YXRlICopKHNlcSktPnByaXZhdGUpCisKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqcmF3Nl9nZXRfZmlyc3Qoc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc3RydWN0IHNvY2sgKnNrOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXN0cnVjdCByYXc2X2l0ZXJfc3RhdGUqIHN0YXRlID0gcmF3Nl9zZXFfcHJpdmF0ZShzZXEpOworCisJZm9yIChzdGF0ZS0+YnVja2V0ID0gMDsgc3RhdGUtPmJ1Y2tldCA8IFJBV1Y2X0hUQUJMRV9TSVpFOyArK3N0YXRlLT5idWNrZXQpCisJCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmcmF3X3Y2X2h0YWJsZVtzdGF0ZS0+YnVja2V0XSkKKwkJCWlmIChzay0+c2tfZmFtaWx5ID09IFBGX0lORVQ2KQorCQkJCWdvdG8gb3V0OworCXNrID0gTlVMTDsKK291dDoKKwlyZXR1cm4gc2s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqcmF3Nl9nZXRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCByYXc2X2l0ZXJfc3RhdGUqIHN0YXRlID0gcmF3Nl9zZXFfcHJpdmF0ZShzZXEpOworCisJZG8geworCQlzayA9IHNrX25leHQoc2spOwordHJ5X2FnYWluOgorCQk7CisJfSB3aGlsZSAoc2sgJiYgc2stPnNrX2ZhbWlseSAhPSBQRl9JTkVUNik7CisKKwlpZiAoIXNrICYmICsrc3RhdGUtPmJ1Y2tldCA8IFJBV1Y2X0hUQUJMRV9TSVpFKSB7CisJCXNrID0gc2tfaGVhZCgmcmF3X3Y2X2h0YWJsZVtzdGF0ZS0+YnVja2V0XSk7CisJCWdvdG8gdHJ5X2FnYWluOworCX0KKwlyZXR1cm4gc2s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqcmF3Nl9nZXRfaWR4KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBzb2NrICpzayA9IHJhdzZfZ2V0X2ZpcnN0KHNlcSk7CisJaWYgKHNrKQorCQl3aGlsZSAocG9zICYmIChzayA9IHJhdzZfZ2V0X25leHQoc2VxLCBzaykpICE9IE5VTEwpCisJCQktLXBvczsKKwlyZXR1cm4gcG9zID8gTlVMTCA6IHNrOworfQorCitzdGF0aWMgdm9pZCAqcmF3Nl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXJlYWRfbG9jaygmcmF3X3Y2X2xvY2spOworCXJldHVybiAqcG9zID8gcmF3Nl9nZXRfaWR4KHNlcSwgKnBvcyAtIDEpIDogU0VRX1NUQVJUX1RPS0VOOworfQorCitzdGF0aWMgdm9pZCAqcmF3Nl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHNvY2sgKnNrOworCisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlzayA9IHJhdzZfZ2V0X2ZpcnN0KHNlcSk7CisJZWxzZQorCQlzayA9IHJhdzZfZ2V0X25leHQoc2VxLCB2KTsKKwkrKypwb3M7CisJcmV0dXJuIHNrOworfQorCitzdGF0aWMgdm9pZCByYXc2X3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXJlYWRfdW5sb2NrKCZyYXdfdjZfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHJhdzZfc29ja19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IHNvY2sgKnNwLCBpbnQgaSkKK3sKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzcCk7CisJc3RydWN0IGluNl9hZGRyICpkZXN0LCAqc3JjOworCV9fdTE2IGRlc3RwLCBzcmNwOworCisJZGVzdCAgPSAmbnAtPmRhZGRyOworCXNyYyAgID0gJm5wLT5yY3Zfc2FkZHI7CisJZGVzdHAgPSAwOworCXNyY3AgID0gaW5ldF9zayhzcCktPm51bTsKKwlzZXFfcHJpbnRmKHNlcSwKKwkJICAgIiU0ZDogJTA4WCUwOFglMDhYJTA4WDolMDRYICUwOFglMDhYJTA4WCUwOFg6JTA0WCAiCisJCSAgICIlMDJYICUwOFg6JTA4WCAlMDJYOiUwOGxYICUwOFggJTVkICU4ZCAlbHUgJWQgJXBcbiIsCisJCSAgIGksCisJCSAgIHNyYy0+czZfYWRkcjMyWzBdLCBzcmMtPnM2X2FkZHIzMlsxXSwKKwkJICAgc3JjLT5zNl9hZGRyMzJbMl0sIHNyYy0+czZfYWRkcjMyWzNdLCBzcmNwLAorCQkgICBkZXN0LT5zNl9hZGRyMzJbMF0sIGRlc3QtPnM2X2FkZHIzMlsxXSwKKwkJICAgZGVzdC0+czZfYWRkcjMyWzJdLCBkZXN0LT5zNl9hZGRyMzJbM10sIGRlc3RwLAorCQkgICBzcC0+c2tfc3RhdGUsIAorCQkgICBhdG9taWNfcmVhZCgmc3AtPnNrX3dtZW1fYWxsb2MpLAorCQkgICBhdG9taWNfcmVhZCgmc3AtPnNrX3JtZW1fYWxsb2MpLAorCQkgICAwLCAwTCwgMCwKKwkJICAgc29ja19pX3VpZChzcCksIDAsCisJCSAgIHNvY2tfaV9pbm8oc3ApLAorCQkgICBhdG9taWNfcmVhZCgmc3AtPnNrX3JlZmNudCksIHNwKTsKK30KKworc3RhdGljIGludCByYXc2X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKKwkJc2VxX3ByaW50ZihzZXEsCisJCQkgICAiICBzbCAgIgorCQkJICAgImxvY2FsX2FkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgIgorCQkJICAgInJlbW90ZV9hZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgIgorCQkJICAgInN0IHR4X3F1ZXVlIHJ4X3F1ZXVlIHRyIHRtLT53aGVuIHJldHJuc210IgorCQkJICAgIiAgIHVpZCAgdGltZW91dCBpbm9kZVxuIik7CisJZWxzZQorCQlyYXc2X3NvY2tfc2VxX3Nob3coc2VxLCB2LCByYXc2X3NlcV9wcml2YXRlKHNlcSktPmJ1Y2tldCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcmF3Nl9zZXFfb3BzID0geworCS5zdGFydCA9CXJhdzZfc2VxX3N0YXJ0LAorCS5uZXh0ID0JCXJhdzZfc2VxX25leHQsCisJLnN0b3AgPQkJcmF3Nl9zZXFfc3RvcCwKKwkuc2hvdyA9CQlyYXc2X3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCByYXc2X3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzZXFfZmlsZSAqc2VxOworCWludCByYyA9IC1FTk9NRU07CisJc3RydWN0IHJhdzZfaXRlcl9zdGF0ZSAqcyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzKQorCQlnb3RvIG91dDsKKwlyYyA9IHNlcV9vcGVuKGZpbGUsICZyYXc2X3NlcV9vcHMpOworCWlmIChyYykKKwkJZ290byBvdXRfa2ZyZWU7CisJc2VxID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNlcS0+cHJpdmF0ZSA9IHM7CisJbWVtc2V0KHMsIDAsIHNpemVvZigqcykpOworb3V0OgorCXJldHVybiByYzsKK291dF9rZnJlZToKKwlrZnJlZShzKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmF3Nl9zZXFfZm9wcyA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkub3BlbiA9CQlyYXc2X3NlcV9vcGVuLAorCS5yZWFkID0JCXNlcV9yZWFkLAorCS5sbHNlZWsgPQlzZXFfbHNlZWssCisJLnJlbGVhc2UgPQlzZXFfcmVsZWFzZV9wcml2YXRlLAorfTsKKworaW50IF9faW5pdCByYXc2X3Byb2NfaW5pdCh2b2lkKQoreworCWlmICghcHJvY19uZXRfZm9wc19jcmVhdGUoInJhdzYiLCBTX0lSVUdPLCAmcmF3Nl9zZXFfZm9wcykpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCit2b2lkIHJhdzZfcHJvY19leGl0KHZvaWQpCit7CisJcHJvY19uZXRfcmVtb3ZlKCJyYXc2Iik7Cit9CisjZW5kaWYJLyogQ09ORklHX1BST0NfRlMgKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY2L3JlYXNzZW1ibHkuYyBiL25ldC9pcHY2L3JlYXNzZW1ibHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWU3YzYzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvcmVhc3NlbWJseS5jCkBAIC0wLDAgKzEsNzcxIEBACisvKgorICoJSVB2NiBmcmFnbWVudCByZWFzc2VtYmx5CisgKglMaW51eCBJTkVUNiBpbXBsZW1lbnRhdGlvbiAKKyAqCisgKglBdXRob3JzOgorICoJUGVkcm8gUm9xdWUJCTxyb3F1ZUBkaS5mYy51bC5wdD4JCisgKgorICoJJElkOiByZWFzc2VtYmx5LmMsdiAxLjI2IDIwMDEvMDMvMDcgMjI6MDA6NTcgZGF2ZW0gRXhwICQKKyAqCisgKglCYXNlZCBvbjogbmV0L2lwdjQvaXBfZnJhZ21lbnQuYworICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworLyogCisgKglGaXhlczoJCisgKglBbmRpIEtsZWVuCU1ha2UgaXQgd29yayB3aXRoIG11bHRpcGxlIGhvc3RzLgorICoJCQlNb3JlIFJGQyBjb21wbGlhbmNlLgorICoKKyAqICAgICAgSG9yc3Qgdm9uIEJyYW5kIEFkZCBtaXNzaW5nICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyAqCUFsZXhleSBLdXpuZXRzb3YJU01QIHJhY2VzLCB0aHJlYWRpbmcsIGNsZWFudXAuCisgKglQYXRyaWNrIE1jSGFyZHkJCUxSVSBxdWV1ZSBvZiBmcmFnIGhlYWRzIGZvciBldmljdG9yLgorICoJTWl0c3VydSBLQU5EQSBAVVNBR0kJUmVnaXN0ZXIgaW5ldDZfcHJvdG9jb2x7fS4KKyAqCURhdmlkIFN0ZXZlbnMgYW5kCisgKglZT1NISUZVSkksSC4gQFVTQUdJCUFsd2F5cyByZW1vdmUgZnJhZ21lbnQgaGVhZGVyIHRvCisgKgkJCQljYWxjdWxhdGUgSUNWIGNvcnJlY3RseS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvaWNtcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvamhhc2guaD4KKworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3NubXAuaD4KKworI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L3RyYW5zcF92Ni5oPgorI2luY2x1ZGUgPG5ldC9yYXd2Ni5oPgorI2luY2x1ZGUgPG5ldC9uZGlzYy5oPgorI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgorCitpbnQgc3lzY3RsX2lwNmZyYWdfaGlnaF90aHJlc2ggPSAyNTYqMTAyNDsKK2ludCBzeXNjdGxfaXA2ZnJhZ19sb3dfdGhyZXNoID0gMTkyKjEwMjQ7CisKK2ludCBzeXNjdGxfaXA2ZnJhZ190aW1lID0gSVBWNl9GUkFHX1RJTUVPVVQ7CisKK3N0cnVjdCBpcDZmcmFnX3NrYl9jYgoreworCXN0cnVjdCBpbmV0Nl9za2JfcGFybQloOworCWludAkJCW9mZnNldDsKK307CisKKyNkZWZpbmUgRlJBRzZfQ0Ioc2tiKQkoKHN0cnVjdCBpcDZmcmFnX3NrYl9jYiopKChza2IpLT5jYikpCisKKworLyoKKyAqCUVxdWl2YWxlbnQgb2YgaXB2NCBzdHJ1Y3QgaXBxCisgKi8KKworc3RydWN0IGZyYWdfcXVldWUKK3sKKwlzdHJ1Y3QgZnJhZ19xdWV1ZQkqbmV4dDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxydV9saXN0OwkJLyogbHJ1IGxpc3QgbWVtYmVyCSovCisKKwlfX3UzMgkJCWlkOwkJLyogZnJhZ21lbnQgaWQJCSovCisJc3RydWN0IGluNl9hZGRyCQlzYWRkcjsKKwlzdHJ1Y3QgaW42X2FkZHIJCWRhZGRyOworCisJc3BpbmxvY2tfdAkJbG9jazsKKwlhdG9taWNfdAkJcmVmY250OworCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOwkJLyogZXhwaXJlIHRpbWVyCQkqLworCXN0cnVjdCBza19idWZmCQkqZnJhZ21lbnRzOworCWludAkJCWxlbjsKKwlpbnQJCQltZWF0OworCWludAkJCWlpZjsKKwlzdHJ1Y3QgdGltZXZhbAkJc3RhbXA7CisJdW5zaWduZWQgaW50CQljc3VtOworCV9fdTgJCQlsYXN0X2luOwkvKiBoYXMgZmlyc3QvbGFzdCBzZWdtZW50IGFycml2ZWQ/ICovCisjZGVmaW5lIENPTVBMRVRFCQk0CisjZGVmaW5lIEZJUlNUX0lOCQkyCisjZGVmaW5lIExBU1RfSU4JCQkxCisJX191MTYJCQluaG9mZnNldDsKKwlzdHJ1Y3QgZnJhZ19xdWV1ZQkqKnBwcmV2OworfTsKKworLyogSGFzaCB0YWJsZS4gKi8KKworI2RlZmluZSBJUDZRX0hBU0hTWgk2NAorCitzdGF0aWMgc3RydWN0IGZyYWdfcXVldWUgKmlwNl9mcmFnX2hhc2hbSVA2UV9IQVNIU1pdOworc3RhdGljIERFRklORV9SV0xPQ0soaXA2X2ZyYWdfbG9jayk7CitzdGF0aWMgdTMyIGlwNl9mcmFnX2hhc2hfcm5kOworc3RhdGljIExJU1RfSEVBRChpcDZfZnJhZ19scnVfbGlzdCk7CitpbnQgaXA2X2ZyYWdfbnF1ZXVlcyA9IDA7CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19mcV91bmxpbmsoc3RydWN0IGZyYWdfcXVldWUgKmZxKQoreworCWlmKGZxLT5uZXh0KQorCQlmcS0+bmV4dC0+cHByZXYgPSBmcS0+cHByZXY7CisJKmZxLT5wcHJldiA9IGZxLT5uZXh0OworCWxpc3RfZGVsKCZmcS0+bHJ1X2xpc3QpOworCWlwNl9mcmFnX25xdWV1ZXMtLTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBmcV91bmxpbmsoc3RydWN0IGZyYWdfcXVldWUgKmZxKQoreworCXdyaXRlX2xvY2soJmlwNl9mcmFnX2xvY2spOworCV9fZnFfdW5saW5rKGZxKTsKKwl3cml0ZV91bmxvY2soJmlwNl9mcmFnX2xvY2spOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGlwNnFoYXNoZm4odTMyIGlkLCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAorCQkJICAgICAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIpCit7CisJdTMyIGEsIGIsIGM7CisKKwlhID0gc2FkZHItPnM2X2FkZHIzMlswXTsKKwliID0gc2FkZHItPnM2X2FkZHIzMlsxXTsKKwljID0gc2FkZHItPnM2X2FkZHIzMlsyXTsKKworCWEgKz0gSkhBU0hfR09MREVOX1JBVElPOworCWIgKz0gSkhBU0hfR09MREVOX1JBVElPOworCWMgKz0gaXA2X2ZyYWdfaGFzaF9ybmQ7CisJX19qaGFzaF9taXgoYSwgYiwgYyk7CisKKwlhICs9IHNhZGRyLT5zNl9hZGRyMzJbM107CisJYiArPSBkYWRkci0+czZfYWRkcjMyWzBdOworCWMgKz0gZGFkZHItPnM2X2FkZHIzMlsxXTsKKwlfX2poYXNoX21peChhLCBiLCBjKTsKKworCWEgKz0gZGFkZHItPnM2X2FkZHIzMlsyXTsKKwliICs9IGRhZGRyLT5zNl9hZGRyMzJbM107CisJYyArPSBpZDsKKwlfX2poYXNoX21peChhLCBiLCBjKTsKKworCXJldHVybiBjICYgKElQNlFfSEFTSFNaIC0gMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBpcDZfZnJhZ19zZWNyZXRfdGltZXI7CitpbnQgc3lzY3RsX2lwNmZyYWdfc2VjcmV0X2ludGVydmFsID0gMTAgKiA2MCAqIEhaOworCitzdGF0aWMgdm9pZCBpcDZfZnJhZ19zZWNyZXRfcmVidWlsZCh1bnNpZ25lZCBsb25nIGR1bW15KQoreworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKwlpbnQgaTsKKworCXdyaXRlX2xvY2soJmlwNl9mcmFnX2xvY2spOworCWdldF9yYW5kb21fYnl0ZXMoJmlwNl9mcmFnX2hhc2hfcm5kLCBzaXplb2YodTMyKSk7CisJZm9yIChpID0gMDsgaSA8IElQNlFfSEFTSFNaOyBpKyspIHsKKwkJc3RydWN0IGZyYWdfcXVldWUgKnE7CisKKwkJcSA9IGlwNl9mcmFnX2hhc2hbaV07CisJCXdoaWxlIChxKSB7CisJCQlzdHJ1Y3QgZnJhZ19xdWV1ZSAqbmV4dCA9IHEtPm5leHQ7CisJCQl1bnNpZ25lZCBpbnQgaHZhbCA9IGlwNnFoYXNoZm4ocS0+aWQsCisJCQkJCQkgICAgICAgJnEtPnNhZGRyLAorCQkJCQkJICAgICAgICZxLT5kYWRkcik7CisKKwkJCWlmIChodmFsICE9IGkpIHsKKwkJCQkvKiBVbmxpbmsuICovCisJCQkJaWYgKHEtPm5leHQpCisJCQkJCXEtPm5leHQtPnBwcmV2ID0gcS0+cHByZXY7CisJCQkJKnEtPnBwcmV2ID0gcS0+bmV4dDsKKworCQkJCS8qIFJlbGluayB0byBuZXcgaGFzaCBjaGFpbi4gKi8KKwkJCQlpZiAoKHEtPm5leHQgPSBpcDZfZnJhZ19oYXNoW2h2YWxdKSAhPSBOVUxMKQorCQkJCQlxLT5uZXh0LT5wcHJldiA9ICZxLT5uZXh0OworCQkJCWlwNl9mcmFnX2hhc2hbaHZhbF0gPSBxOworCQkJCXEtPnBwcmV2ID0gJmlwNl9mcmFnX2hhc2hbaHZhbF07CisJCQl9CisKKwkJCXEgPSBuZXh0OworCQl9CisJfQorCXdyaXRlX3VubG9jaygmaXA2X2ZyYWdfbG9jayk7CisKKwltb2RfdGltZXIoJmlwNl9mcmFnX3NlY3JldF90aW1lciwgbm93ICsgc3lzY3RsX2lwNmZyYWdfc2VjcmV0X2ludGVydmFsKTsKK30KKworYXRvbWljX3QgaXA2X2ZyYWdfbWVtID0gQVRPTUlDX0lOSVQoMCk7CisKKy8qIE1lbW9yeSBUcmFja2luZyBGdW5jdGlvbnMuICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnJhZ19rZnJlZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50ICp3b3JrKQoreworCWlmICh3b3JrKQorCQkqd29yayAtPSBza2ItPnRydWVzaXplOworCWF0b21pY19zdWIoc2tiLT50cnVlc2l6ZSwgJmlwNl9mcmFnX21lbSk7CisJa2ZyZWVfc2tiKHNrYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmFnX2ZyZWVfcXVldWUoc3RydWN0IGZyYWdfcXVldWUgKmZxLCBpbnQgKndvcmspCit7CisJaWYgKHdvcmspCisJCSp3b3JrIC09IHNpemVvZihzdHJ1Y3QgZnJhZ19xdWV1ZSk7CisJYXRvbWljX3N1YihzaXplb2Yoc3RydWN0IGZyYWdfcXVldWUpLCAmaXA2X2ZyYWdfbWVtKTsKKwlrZnJlZShmcSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGZyYWdfcXVldWUgKmZyYWdfYWxsb2NfcXVldWUodm9pZCkKK3sKKwlzdHJ1Y3QgZnJhZ19xdWV1ZSAqZnEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZnJhZ19xdWV1ZSksIEdGUF9BVE9NSUMpOworCisJaWYoIWZxKQorCQlyZXR1cm4gTlVMTDsKKwlhdG9taWNfYWRkKHNpemVvZihzdHJ1Y3QgZnJhZ19xdWV1ZSksICZpcDZfZnJhZ19tZW0pOworCXJldHVybiBmcTsKK30KKworLyogRGVzdHJ1Y3Rpb24gcHJpbWl0aXZlcy4gKi8KKworLyogQ29tcGxldGUgZGVzdHJ1Y3Rpb24gb2YgZnEuICovCitzdGF0aWMgdm9pZCBpcDZfZnJhZ19kZXN0cm95KHN0cnVjdCBmcmFnX3F1ZXVlICpmcSwgaW50ICp3b3JrKQoreworCXN0cnVjdCBza19idWZmICpmcDsKKworCUJVR19UUkFQKGZxLT5sYXN0X2luJkNPTVBMRVRFKTsKKwlCVUdfVFJBUChkZWxfdGltZXIoJmZxLT50aW1lcikgPT0gMCk7CisKKwkvKiBSZWxlYXNlIGFsbCBmcmFnbWVudCBkYXRhLiAqLworCWZwID0gZnEtPmZyYWdtZW50czsKKwl3aGlsZSAoZnApIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnhwID0gZnAtPm5leHQ7CisKKwkJZnJhZ19rZnJlZV9za2IoZnAsIHdvcmspOworCQlmcCA9IHhwOworCX0KKworCWZyYWdfZnJlZV9xdWV1ZShmcSwgd29yayk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgZnFfcHV0KHN0cnVjdCBmcmFnX3F1ZXVlICpmcSwgaW50ICp3b3JrKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZmcS0+cmVmY250KSkKKwkJaXA2X2ZyYWdfZGVzdHJveShmcSwgd29yayk7Cit9CisKKy8qIEtpbGwgZnEgZW50cnkuIEl0IGlzIG5vdCBkZXN0cm95ZWQgaW1tZWRpYXRlbHksCisgKiBiZWNhdXNlIGNhbGxlciAoYW5kIHNvbWVvbmUgbW9yZSkgaG9sZHMgcmVmZXJlbmNlIGNvdW50LgorICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGZxX2tpbGwoc3RydWN0IGZyYWdfcXVldWUgKmZxKQoreworCWlmIChkZWxfdGltZXIoJmZxLT50aW1lcikpCisJCWF0b21pY19kZWMoJmZxLT5yZWZjbnQpOworCisJaWYgKCEoZnEtPmxhc3RfaW4gJiBDT01QTEVURSkpIHsKKwkJZnFfdW5saW5rKGZxKTsKKwkJYXRvbWljX2RlYygmZnEtPnJlZmNudCk7CisJCWZxLT5sYXN0X2luIHw9IENPTVBMRVRFOworCX0KK30KKworc3RhdGljIHZvaWQgaXA2X2V2aWN0b3Iodm9pZCkKK3sKKwlzdHJ1Y3QgZnJhZ19xdWV1ZSAqZnE7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCWludCB3b3JrOworCisJd29yayA9IGF0b21pY19yZWFkKCZpcDZfZnJhZ19tZW0pIC0gc3lzY3RsX2lwNmZyYWdfbG93X3RocmVzaDsKKwlpZiAod29yayA8PSAwKQorCQlyZXR1cm47CisKKwl3aGlsZSh3b3JrID4gMCkgeworCQlyZWFkX2xvY2soJmlwNl9mcmFnX2xvY2spOworCQlpZiAobGlzdF9lbXB0eSgmaXA2X2ZyYWdfbHJ1X2xpc3QpKSB7CisJCQlyZWFkX3VubG9jaygmaXA2X2ZyYWdfbG9jayk7CisJCQlyZXR1cm47CisJCX0KKwkJdG1wID0gaXA2X2ZyYWdfbHJ1X2xpc3QubmV4dDsKKwkJZnEgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGZyYWdfcXVldWUsIGxydV9saXN0KTsKKwkJYXRvbWljX2luYygmZnEtPnJlZmNudCk7CisJCXJlYWRfdW5sb2NrKCZpcDZfZnJhZ19sb2NrKTsKKworCQlzcGluX2xvY2soJmZxLT5sb2NrKTsKKwkJaWYgKCEoZnEtPmxhc3RfaW4mQ09NUExFVEUpKQorCQkJZnFfa2lsbChmcSk7CisJCXNwaW5fdW5sb2NrKCZmcS0+bG9jayk7CisKKwkJZnFfcHV0KGZxLCAmd29yayk7CisJCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfUkVBU01GQUlMUyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpcDZfZnJhZ19leHBpcmUodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBmcmFnX3F1ZXVlICpmcSA9IChzdHJ1Y3QgZnJhZ19xdWV1ZSAqKSBkYXRhOworCisJc3Bpbl9sb2NrKCZmcS0+bG9jayk7CisKKwlpZiAoZnEtPmxhc3RfaW4gJiBDT01QTEVURSkKKwkJZ290byBvdXQ7CisKKwlmcV9raWxsKGZxKTsKKworCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfUkVBU01USU1FT1VUKTsKKwlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX1JFQVNNRkFJTFMpOworCisJLyogU2VuZCBlcnJvciBvbmx5IGlmIHRoZSBmaXJzdCBzZWdtZW50IGFycml2ZWQuICovCisJaWYgKGZxLT5sYXN0X2luJkZJUlNUX0lOICYmIGZxLT5mcmFnbWVudHMpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9nZXRfYnlfaW5kZXgoZnEtPmlpZik7CisKKwkJLyoKKwkJICAgQnV0IHVzZSBhcyBzb3VyY2UgZGV2aWNlIG9uIHdoaWNoIExBU1QgQVJSSVZFRAorCQkgICBzZWdtZW50IHdhcyByZWNlaXZlZC4gQW5kIGRvIG5vdCB1c2UgZnEtPmRldgorCQkgICBwb2ludGVyIGRpcmVjdGx5LCBkZXZpY2UgbWlnaHQgYWxyZWFkeSBkaXNhcHBlYXJlZC4KKwkJICovCisJCWlmIChkZXYpIHsKKwkJCWZxLT5mcmFnbWVudHMtPmRldiA9IGRldjsKKwkJCWljbXB2Nl9zZW5kKGZxLT5mcmFnbWVudHMsIElDTVBWNl9USU1FX0VYQ0VFRCwgSUNNUFY2X0VYQ19GUkFHVElNRSwgMCwKKwkJCQkgICAgZGV2KTsKKwkJCWRldl9wdXQoZGV2KTsKKwkJfQorCX0KK291dDoKKwlzcGluX3VubG9jaygmZnEtPmxvY2spOworCWZxX3B1dChmcSwgTlVMTCk7Cit9CisKKy8qIENyZWF0aW9uIHByaW1pdGl2ZXMuICovCisKKworc3RhdGljIHN0cnVjdCBmcmFnX3F1ZXVlICppcDZfZnJhZ19pbnRlcm4odW5zaWduZWQgaW50IGhhc2gsCisJCQkJCSAgc3RydWN0IGZyYWdfcXVldWUgKmZxX2luKQoreworCXN0cnVjdCBmcmFnX3F1ZXVlICpmcTsKKworCXdyaXRlX2xvY2soJmlwNl9mcmFnX2xvY2spOworI2lmZGVmIENPTkZJR19TTVAKKwlmb3IgKGZxID0gaXA2X2ZyYWdfaGFzaFtoYXNoXTsgZnE7IGZxID0gZnEtPm5leHQpIHsKKwkJaWYgKGZxLT5pZCA9PSBmcV9pbi0+aWQgJiYgCisJCSAgICBpcHY2X2FkZHJfZXF1YWwoJmZxX2luLT5zYWRkciwgJmZxLT5zYWRkcikgJiYKKwkJICAgIGlwdjZfYWRkcl9lcXVhbCgmZnFfaW4tPmRhZGRyLCAmZnEtPmRhZGRyKSkgeworCQkJYXRvbWljX2luYygmZnEtPnJlZmNudCk7CisJCQl3cml0ZV91bmxvY2soJmlwNl9mcmFnX2xvY2spOworCQkJZnFfaW4tPmxhc3RfaW4gfD0gQ09NUExFVEU7CisJCQlmcV9wdXQoZnFfaW4sIE5VTEwpOworCQkJcmV0dXJuIGZxOworCQl9CisJfQorI2VuZGlmCisJZnEgPSBmcV9pbjsKKworCWlmICghbW9kX3RpbWVyKCZmcS0+dGltZXIsIGppZmZpZXMgKyBzeXNjdGxfaXA2ZnJhZ190aW1lKSkKKwkJYXRvbWljX2luYygmZnEtPnJlZmNudCk7CisKKwlhdG9taWNfaW5jKCZmcS0+cmVmY250KTsKKwlpZigoZnEtPm5leHQgPSBpcDZfZnJhZ19oYXNoW2hhc2hdKSAhPSBOVUxMKQorCQlmcS0+bmV4dC0+cHByZXYgPSAmZnEtPm5leHQ7CisJaXA2X2ZyYWdfaGFzaFtoYXNoXSA9IGZxOworCWZxLT5wcHJldiA9ICZpcDZfZnJhZ19oYXNoW2hhc2hdOworCUlOSVRfTElTVF9IRUFEKCZmcS0+bHJ1X2xpc3QpOworCWxpc3RfYWRkX3RhaWwoJmZxLT5scnVfbGlzdCwgJmlwNl9mcmFnX2xydV9saXN0KTsKKwlpcDZfZnJhZ19ucXVldWVzKys7CisJd3JpdGVfdW5sb2NrKCZpcDZfZnJhZ19sb2NrKTsKKwlyZXR1cm4gZnE7Cit9CisKKworc3RhdGljIHN0cnVjdCBmcmFnX3F1ZXVlICoKK2lwNl9mcmFnX2NyZWF0ZSh1bnNpZ25lZCBpbnQgaGFzaCwgdTMyIGlkLCBzdHJ1Y3QgaW42X2FkZHIgKnNyYywgc3RydWN0IGluNl9hZGRyICpkc3QpCit7CisJc3RydWN0IGZyYWdfcXVldWUgKmZxOworCisJaWYgKChmcSA9IGZyYWdfYWxsb2NfcXVldWUoKSkgPT0gTlVMTCkKKwkJZ290byBvb207CisKKwltZW1zZXQoZnEsIDAsIHNpemVvZihzdHJ1Y3QgZnJhZ19xdWV1ZSkpOworCisJZnEtPmlkID0gaWQ7CisJaXB2Nl9hZGRyX2NvcHkoJmZxLT5zYWRkciwgc3JjKTsKKwlpcHY2X2FkZHJfY29weSgmZnEtPmRhZGRyLCBkc3QpOworCisJaW5pdF90aW1lcigmZnEtPnRpbWVyKTsKKwlmcS0+dGltZXIuZnVuY3Rpb24gPSBpcDZfZnJhZ19leHBpcmU7CisJZnEtPnRpbWVyLmRhdGEgPSAobG9uZykgZnE7CisJc3Bpbl9sb2NrX2luaXQoJmZxLT5sb2NrKTsKKwlhdG9taWNfc2V0KCZmcS0+cmVmY250LCAxKTsKKworCXJldHVybiBpcDZfZnJhZ19pbnRlcm4oaGFzaCwgZnEpOworCitvb206CisJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9SRUFTTUZBSUxTKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIF9faW5saW5lX18gc3RydWN0IGZyYWdfcXVldWUgKgorZnFfZmluZCh1MzIgaWQsIHN0cnVjdCBpbjZfYWRkciAqc3JjLCBzdHJ1Y3QgaW42X2FkZHIgKmRzdCkKK3sKKwlzdHJ1Y3QgZnJhZ19xdWV1ZSAqZnE7CisJdW5zaWduZWQgaW50IGhhc2ggPSBpcDZxaGFzaGZuKGlkLCBzcmMsIGRzdCk7CisKKwlyZWFkX2xvY2soJmlwNl9mcmFnX2xvY2spOworCWZvcihmcSA9IGlwNl9mcmFnX2hhc2hbaGFzaF07IGZxOyBmcSA9IGZxLT5uZXh0KSB7CisJCWlmIChmcS0+aWQgPT0gaWQgJiYgCisJCSAgICBpcHY2X2FkZHJfZXF1YWwoc3JjLCAmZnEtPnNhZGRyKSAmJgorCQkgICAgaXB2Nl9hZGRyX2VxdWFsKGRzdCwgJmZxLT5kYWRkcikpIHsKKwkJCWF0b21pY19pbmMoJmZxLT5yZWZjbnQpOworCQkJcmVhZF91bmxvY2soJmlwNl9mcmFnX2xvY2spOworCQkJcmV0dXJuIGZxOworCQl9CisJfQorCXJlYWRfdW5sb2NrKCZpcDZfZnJhZ19sb2NrKTsKKworCXJldHVybiBpcDZfZnJhZ19jcmVhdGUoaGFzaCwgaWQsIHNyYywgZHN0KTsKK30KKworCitzdGF0aWMgdm9pZCBpcDZfZnJhZ19xdWV1ZShzdHJ1Y3QgZnJhZ19xdWV1ZSAqZnEsIHN0cnVjdCBza19idWZmICpza2IsIAorCQkJICAgc3RydWN0IGZyYWdfaGRyICpmaGRyLCBpbnQgbmhvZmYpCit7CisJc3RydWN0IHNrX2J1ZmYgKnByZXYsICpuZXh0OworCWludCBvZmZzZXQsIGVuZDsKKworCWlmIChmcS0+bGFzdF9pbiAmIENPTVBMRVRFKQorCQlnb3RvIGVycjsKKworCW9mZnNldCA9IG50b2hzKGZoZHItPmZyYWdfb2ZmKSAmIH4weDc7CisJZW5kID0gb2Zmc2V0ICsgKG50b2hzKHNrYi0+bmguaXB2NmgtPnBheWxvYWRfbGVuKSAtCisJCQkoKHU4ICopIChmaGRyICsgMSkgLSAodTggKikgKHNrYi0+bmguaXB2NmggKyAxKSkpOworCisJaWYgKCh1bnNpZ25lZCBpbnQpZW5kID4gSVBWNl9NQVhQTEVOKSB7CisJCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworIAkJaWNtcHY2X3BhcmFtX3Byb2Ioc2tiLElDTVBWNl9IRFJfRklFTEQsICh1OCopJmZoZHItPmZyYWdfb2ZmIC0gc2tiLT5uaC5yYXcpOworIAkJcmV0dXJuOworCX0KKworIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpCisgCQlza2ItPmNzdW0gPSBjc3VtX3N1Yihza2ItPmNzdW0sCisgCQkJCSAgICAgY3N1bV9wYXJ0aWFsKHNrYi0+bmgucmF3LCAodTgqKShmaGRyKzEpLXNrYi0+bmgucmF3LCAwKSk7CisKKwkvKiBJcyB0aGlzIHRoZSBmaW5hbCBmcmFnbWVudD8gKi8KKwlpZiAoIShmaGRyLT5mcmFnX29mZiAmIGh0b25zKElQNl9NRikpKSB7CisJCS8qIElmIHdlIGFscmVhZHkgaGF2ZSBzb21lIGJpdHMgYmV5b25kIGVuZAorCQkgKiBvciBoYXZlIGRpZmZlcmVudCBlbmQsIHRoZSBzZWdtZW50IGlzIGNvcnJ1cHRlZC4KKwkJICovCisJCWlmIChlbmQgPCBmcS0+bGVuIHx8CisJCSAgICAoKGZxLT5sYXN0X2luICYgTEFTVF9JTikgJiYgZW5kICE9IGZxLT5sZW4pKQorCQkJZ290byBlcnI7CisJCWZxLT5sYXN0X2luIHw9IExBU1RfSU47CisJCWZxLT5sZW4gPSBlbmQ7CisJfSBlbHNlIHsKKwkJLyogQ2hlY2sgaWYgdGhlIGZyYWdtZW50IGlzIHJvdW5kZWQgdG8gOCBieXRlcy4KKwkJICogUmVxdWlyZWQgYnkgdGhlIFJGQy4KKwkJICovCisJCWlmIChlbmQgJiAweDcpIHsKKwkJCS8qIFJGQzI0NjAgc2F5cyBhbHdheXMgc2VuZCBwYXJhbWV0ZXIgcHJvYmxlbSBpbgorCQkJICogdGhpcyBjYXNlLiAtRGF2ZU0KKwkJCSAqLworCQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCQlpY21wdjZfcGFyYW1fcHJvYihza2IsIElDTVBWNl9IRFJfRklFTEQsIAorCQkJCQkgIG9mZnNldG9mKHN0cnVjdCBpcHY2aGRyLCBwYXlsb2FkX2xlbikpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChlbmQgPiBmcS0+bGVuKSB7CisJCQkvKiBTb21lIGJpdHMgYmV5b25kIGVuZCAtPiBjb3JydXB0aW9uLiAqLworCQkJaWYgKGZxLT5sYXN0X2luICYgTEFTVF9JTikKKwkJCQlnb3RvIGVycjsKKwkJCWZxLT5sZW4gPSBlbmQ7CisJCX0KKwl9CisKKwlpZiAoZW5kID09IG9mZnNldCkKKwkJZ290byBlcnI7CisKKwkvKiBQb2ludCBpbnRvIHRoZSBJUCBkYXRhZ3JhbSAnZGF0YScgcGFydC4gKi8KKwlpZiAoIXBza2JfcHVsbChza2IsICh1OCAqKSAoZmhkciArIDEpIC0gc2tiLT5kYXRhKSkKKwkJZ290byBlcnI7CisJaWYgKGVuZC1vZmZzZXQgPCBza2ItPmxlbikgeworCQlpZiAocHNrYl90cmltKHNrYiwgZW5kIC0gb2Zmc2V0KSkKKwkJCWdvdG8gZXJyOworCQlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpCisJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJfQorCisJLyogRmluZCBvdXQgd2hpY2ggZnJhZ21lbnRzIGFyZSBpbiBmcm9udCBhbmQgYXQgdGhlIGJhY2sgb2YgdXMKKwkgKiBpbiB0aGUgY2hhaW4gb2YgZnJhZ21lbnRzIHNvIGZhci4gIFdlIG11c3Qga25vdyB3aGVyZSB0byBwdXQKKwkgKiB0aGlzIGZyYWdtZW50LCByaWdodD8KKwkgKi8KKwlwcmV2ID0gTlVMTDsKKwlmb3IobmV4dCA9IGZxLT5mcmFnbWVudHM7IG5leHQgIT0gTlVMTDsgbmV4dCA9IG5leHQtPm5leHQpIHsKKwkJaWYgKEZSQUc2X0NCKG5leHQpLT5vZmZzZXQgPj0gb2Zmc2V0KQorCQkJYnJlYWs7CS8qIGJpbmdvISAqLworCQlwcmV2ID0gbmV4dDsKKwl9CisKKwkvKiBXZSBmb3VuZCB3aGVyZSB0byBwdXQgdGhpcyBvbmUuICBDaGVjayBmb3Igb3ZlcmxhcCB3aXRoCisJICogcHJlY2VkaW5nIGZyYWdtZW50LCBhbmQsIGlmIG5lZWRlZCwgYWxpZ24gdGhpbmdzIHNvIHRoYXQKKwkgKiBhbnkgb3ZlcmxhcHMgYXJlIGVsaW1pbmF0ZWQuCisJICovCisJaWYgKHByZXYpIHsKKwkJaW50IGkgPSAoRlJBRzZfQ0IocHJldiktPm9mZnNldCArIHByZXYtPmxlbikgLSBvZmZzZXQ7CisKKwkJaWYgKGkgPiAwKSB7CisJCQlvZmZzZXQgKz0gaTsKKwkJCWlmIChlbmQgPD0gb2Zmc2V0KQorCQkJCWdvdG8gZXJyOworCQkJaWYgKCFwc2tiX3B1bGwoc2tiLCBpKSkKKwkJCQlnb3RvIGVycjsKKwkJCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSkKKwkJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCX0KKwl9CisKKwkvKiBMb29rIGZvciBvdmVybGFwIHdpdGggc3VjY2VlZGluZyBzZWdtZW50cy4KKwkgKiBJZiB3ZSBjYW4gbWVyZ2UgZnJhZ21lbnRzLCBkbyBpdC4KKwkgKi8KKwl3aGlsZSAobmV4dCAmJiBGUkFHNl9DQihuZXh0KS0+b2Zmc2V0IDwgZW5kKSB7CisJCWludCBpID0gZW5kIC0gRlJBRzZfQ0IobmV4dCktPm9mZnNldDsgLyogb3ZlcmxhcCBpcyAnaScgYnl0ZXMgKi8KKworCQlpZiAoaSA8IG5leHQtPmxlbikgeworCQkJLyogRWF0IGhlYWQgb2YgdGhlIG5leHQgb3ZlcmxhcHBlZCBmcmFnbWVudAorCQkJICogYW5kIGxlYXZlIHRoZSBsb29wLiBUaGUgbmV4dCBvbmVzIGNhbm5vdCBvdmVybGFwLgorCQkJICovCisJCQlpZiAoIXBza2JfcHVsbChuZXh0LCBpKSkKKwkJCQlnb3RvIGVycjsKKwkJCUZSQUc2X0NCKG5leHQpLT5vZmZzZXQgKz0gaTsJLyogbmV4dCBmcmFnbWVudCAqLworCQkJZnEtPm1lYXQgLT0gaTsKKwkJCWlmIChuZXh0LT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpCisJCQkJbmV4dC0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJc3RydWN0IHNrX2J1ZmYgKmZyZWVfaXQgPSBuZXh0OworCisJCQkvKiBPbGQgZnJhZ21lbnQgaXMgY29tcGxldGVseSBvdmVycmlkZGVuIHdpdGgKKwkJCSAqIG5ldyBvbmUgZHJvcCBpdC4KKwkJCSAqLworCQkJbmV4dCA9IG5leHQtPm5leHQ7CisKKwkJCWlmIChwcmV2KQorCQkJCXByZXYtPm5leHQgPSBuZXh0OworCQkJZWxzZQorCQkJCWZxLT5mcmFnbWVudHMgPSBuZXh0OworCisJCQlmcS0+bWVhdCAtPSBmcmVlX2l0LT5sZW47CisJCQlmcmFnX2tmcmVlX3NrYihmcmVlX2l0LCBOVUxMKTsKKwkJfQorCX0KKworCUZSQUc2X0NCKHNrYiktPm9mZnNldCA9IG9mZnNldDsKKworCS8qIEluc2VydCB0aGlzIGZyYWdtZW50IGluIHRoZSBjaGFpbiBvZiBmcmFnbWVudHMuICovCisJc2tiLT5uZXh0ID0gbmV4dDsKKwlpZiAocHJldikKKwkJcHJldi0+bmV4dCA9IHNrYjsKKwllbHNlCisJCWZxLT5mcmFnbWVudHMgPSBza2I7CisKKwlpZiAoc2tiLT5kZXYpCisJCWZxLT5paWYgPSBza2ItPmRldi0+aWZpbmRleDsKKwlza2ItPmRldiA9IE5VTEw7CisJZnEtPnN0YW1wID0gc2tiLT5zdGFtcDsKKwlmcS0+bWVhdCArPSBza2ItPmxlbjsKKwlhdG9taWNfYWRkKHNrYi0+dHJ1ZXNpemUsICZpcDZfZnJhZ19tZW0pOworCisJLyogVGhlIGZpcnN0IGZyYWdtZW50LgorCSAqIG5ob2Zmc2V0IGlzIG9idGFpbmVkIGZyb20gdGhlIGZpcnN0IGZyYWdtZW50LCBvZiBjb3Vyc2UuCisJICovCisJaWYgKG9mZnNldCA9PSAwKSB7CisJCWZxLT5uaG9mZnNldCA9IG5ob2ZmOworCQlmcS0+bGFzdF9pbiB8PSBGSVJTVF9JTjsKKwl9CisJd3JpdGVfbG9jaygmaXA2X2ZyYWdfbG9jayk7CisJbGlzdF9tb3ZlX3RhaWwoJmZxLT5scnVfbGlzdCwgJmlwNl9mcmFnX2xydV9saXN0KTsKKwl3cml0ZV91bmxvY2soJmlwNl9mcmFnX2xvY2spOworCXJldHVybjsKKworZXJyOgorCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfUkVBU01GQUlMUyk7CisJa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qCisgKglDaGVjayBpZiB0aGlzIHBhY2tldCBpcyBjb21wbGV0ZS4KKyAqCVJldHVybnMgTlVMTCBvbiBmYWlsdXJlIGJ5IGFueSByZWFzb24sIGFuZCBwb2ludGVyCisgKgl0byBjdXJyZW50IG5leHRoZHIgZmllbGQgaW4gcmVhc3NlbWJsZWQgZnJhbWUuCisgKgorICoJSXQgaXMgY2FsbGVkIHdpdGggbG9ja2VkIGZxLCBhbmQgY2FsbGVyIG11c3QgY2hlY2sgdGhhdAorICoJcXVldWUgaXMgZWxpZ2libGUgZm9yIHJlYXNzZW1ibHkgaS5lLiBpdCBpcyBub3QgQ09NUExFVEUsCisgKgl0aGUgbGFzdCBhbmQgdGhlIGZpcnN0IGZyYW1lcyBhcnJpdmVkIGFuZCBhbGwgdGhlIGJpdHMgYXJlIGhlcmUuCisgKi8KK3N0YXRpYyBpbnQgaXA2X2ZyYWdfcmVhc20oc3RydWN0IGZyYWdfcXVldWUgKmZxLCBzdHJ1Y3Qgc2tfYnVmZiAqKnNrYl9pbiwKKwkJCSAgdW5zaWduZWQgaW50ICpuaG9mZnAsCisJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNrX2J1ZmYgKmZwLCAqaGVhZCA9IGZxLT5mcmFnbWVudHM7CisJaW50ICAgIHBheWxvYWRfbGVuOworCXVuc2lnbmVkIGludCBuaG9mZjsKKworCWZxX2tpbGwoZnEpOworCisJQlVHX1RSQVAoaGVhZCAhPSBOVUxMKTsKKwlCVUdfVFJBUChGUkFHNl9DQihoZWFkKS0+b2Zmc2V0ID09IDApOworCisJLyogVW5mcmFnbWVudGVkIHBhcnQgaXMgdGFrZW4gZnJvbSB0aGUgZmlyc3Qgc2VnbWVudC4gKi8KKwlwYXlsb2FkX2xlbiA9IChoZWFkLT5kYXRhIC0gaGVhZC0+bmgucmF3KSAtIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKyBmcS0+bGVuIC0gc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcik7CisJaWYgKHBheWxvYWRfbGVuID4gSVBWNl9NQVhQTEVOKQorCQlnb3RvIG91dF9vdmVyc2l6ZTsKKworCS8qIEhlYWQgb2YgbGlzdCBtdXN0IG5vdCBiZSBjbG9uZWQuICovCisJaWYgKHNrYl9jbG9uZWQoaGVhZCkgJiYgcHNrYl9leHBhbmRfaGVhZChoZWFkLCAwLCAwLCBHRlBfQVRPTUlDKSkKKwkJZ290byBvdXRfb29tOworCisJLyogSWYgdGhlIGZpcnN0IGZyYWdtZW50IGlzIGZyYWdtZW50ZWQgaXRzZWxmLCB3ZSBzcGxpdAorCSAqIGl0IHRvIHR3byBjaHVua3M6IHRoZSBmaXJzdCB3aXRoIGRhdGEgYW5kIHBhZ2VkIHBhcnQKKwkgKiBhbmQgdGhlIHNlY29uZCwgaG9sZGluZyBvbmx5IGZyYWdtZW50cy4gKi8KKwlpZiAoc2tiX3NoaW5mbyhoZWFkKS0+ZnJhZ19saXN0KSB7CisJCXN0cnVjdCBza19idWZmICpjbG9uZTsKKwkJaW50IGksIHBsZW4gPSAwOworCisJCWlmICgoY2xvbmUgPSBhbGxvY19za2IoMCwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJCQlnb3RvIG91dF9vb207CisJCWNsb25lLT5uZXh0ID0gaGVhZC0+bmV4dDsKKwkJaGVhZC0+bmV4dCA9IGNsb25lOworCQlza2Jfc2hpbmZvKGNsb25lKS0+ZnJhZ19saXN0ID0gc2tiX3NoaW5mbyhoZWFkKS0+ZnJhZ19saXN0OworCQlza2Jfc2hpbmZvKGhlYWQpLT5mcmFnX2xpc3QgPSBOVUxMOworCQlmb3IgKGk9MDsgaTxza2Jfc2hpbmZvKGhlYWQpLT5ucl9mcmFnczsgaSsrKQorCQkJcGxlbiArPSBza2Jfc2hpbmZvKGhlYWQpLT5mcmFnc1tpXS5zaXplOworCQljbG9uZS0+bGVuID0gY2xvbmUtPmRhdGFfbGVuID0gaGVhZC0+ZGF0YV9sZW4gLSBwbGVuOworCQloZWFkLT5kYXRhX2xlbiAtPSBjbG9uZS0+bGVuOworCQloZWFkLT5sZW4gLT0gY2xvbmUtPmxlbjsKKwkJY2xvbmUtPmNzdW0gPSAwOworCQljbG9uZS0+aXBfc3VtbWVkID0gaGVhZC0+aXBfc3VtbWVkOworCQlhdG9taWNfYWRkKGNsb25lLT50cnVlc2l6ZSwgJmlwNl9mcmFnX21lbSk7CisJfQorCisJLyogV2UgaGF2ZSB0byByZW1vdmUgZnJhZ21lbnQgaGVhZGVyIGZyb20gZGF0YWdyYW0gYW5kIHRvIHJlbG9jYXRlCisJICogaGVhZGVyIGluIG9yZGVyIHRvIGNhbGN1bGF0ZSBJQ1YgY29ycmVjdGx5LiAqLworCW5ob2ZmID0gZnEtPm5ob2Zmc2V0OworCWhlYWQtPm5oLnJhd1tuaG9mZl0gPSBoZWFkLT5oLnJhd1swXTsKKwltZW1tb3ZlKGhlYWQtPmhlYWQgKyBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKSwgaGVhZC0+aGVhZCwgCisJCShoZWFkLT5kYXRhIC0gaGVhZC0+aGVhZCkgLSBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKSk7CisJaGVhZC0+bWFjLnJhdyArPSBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKTsKKwloZWFkLT5uaC5yYXcgKz0gc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcik7CisKKwlza2Jfc2hpbmZvKGhlYWQpLT5mcmFnX2xpc3QgPSBoZWFkLT5uZXh0OworCWhlYWQtPmgucmF3ID0gaGVhZC0+ZGF0YTsKKwlza2JfcHVzaChoZWFkLCBoZWFkLT5kYXRhIC0gaGVhZC0+bmgucmF3KTsKKwlhdG9taWNfc3ViKGhlYWQtPnRydWVzaXplLCAmaXA2X2ZyYWdfbWVtKTsKKworCWZvciAoZnA9aGVhZC0+bmV4dDsgZnA7IGZwID0gZnAtPm5leHQpIHsKKwkJaGVhZC0+ZGF0YV9sZW4gKz0gZnAtPmxlbjsKKwkJaGVhZC0+bGVuICs9IGZwLT5sZW47CisJCWlmIChoZWFkLT5pcF9zdW1tZWQgIT0gZnAtPmlwX3N1bW1lZCkKKwkJCWhlYWQtPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCWVsc2UgaWYgKGhlYWQtPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykKKwkJCWhlYWQtPmNzdW0gPSBjc3VtX2FkZChoZWFkLT5jc3VtLCBmcC0+Y3N1bSk7CisJCWhlYWQtPnRydWVzaXplICs9IGZwLT50cnVlc2l6ZTsKKwkJYXRvbWljX3N1YihmcC0+dHJ1ZXNpemUsICZpcDZfZnJhZ19tZW0pOworCX0KKworCWhlYWQtPm5leHQgPSBOVUxMOworCWhlYWQtPmRldiA9IGRldjsKKwloZWFkLT5zdGFtcCA9IGZxLT5zdGFtcDsKKwloZWFkLT5uaC5pcHY2aC0+cGF5bG9hZF9sZW4gPSBodG9ucyhwYXlsb2FkX2xlbik7CisKKwkqc2tiX2luID0gaGVhZDsKKworCS8qIFllcywgYW5kIGZvbGQgcmVkdW5kYW50IGNoZWNrc3VtIGJhY2suIDgpICovCisJaWYgKGhlYWQtPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykKKwkJaGVhZC0+Y3N1bSA9IGNzdW1fcGFydGlhbChoZWFkLT5uaC5yYXcsIGhlYWQtPmgucmF3LWhlYWQtPm5oLnJhdywgaGVhZC0+Y3N1bSk7CisKKwlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX1JFQVNNT0tTKTsKKwlmcS0+ZnJhZ21lbnRzID0gTlVMTDsKKwkqbmhvZmZwID0gbmhvZmY7CisJcmV0dXJuIDE7CisKK291dF9vdmVyc2l6ZToKKwlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiaXA2X2ZyYWdfcmVhc206IHBheWxvYWQgbGVuID0gJWRcbiIsIHBheWxvYWRfbGVuKTsKKwlnb3RvIG91dF9mYWlsOworb3V0X29vbToKKwlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiaXA2X2ZyYWdfcmVhc206IG5vIG1lbW9yeSBmb3IgcmVhc3NlbWJseVxuIik7CitvdXRfZmFpbDoKKwlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX1JFQVNNRkFJTFMpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBpcHY2X2ZyYWdfcmN2KHN0cnVjdCBza19idWZmICoqc2ticCwgdW5zaWduZWQgaW50ICpuaG9mZnApCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpza2JwOyAKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CisJc3RydWN0IGZyYWdfaGRyICpmaGRyOworCXN0cnVjdCBmcmFnX3F1ZXVlICpmcTsKKwlzdHJ1Y3QgaXB2NmhkciAqaGRyOworCisJaGRyID0gc2tiLT5uaC5pcHY2aDsKKworCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfUkVBU01SRVFEUyk7CisKKwkvKiBKdW1ibyBwYXlsb2FkIGluaGliaXRzIGZyYWcuIGhlYWRlciAqLworCWlmIChoZHItPnBheWxvYWRfbGVuPT0wKSB7CisJCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCQlpY21wdjZfcGFyYW1fcHJvYihza2IsIElDTVBWNl9IRFJfRklFTEQsIHNrYi0+aC5yYXctc2tiLT5uaC5yYXcpOworCQlyZXR1cm4gLTE7CisJfQorCWlmICghcHNrYl9tYXlfcHVsbChza2IsIChza2ItPmgucmF3LXNrYi0+ZGF0YSkrc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcikpKSB7CisJCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCQlpY21wdjZfcGFyYW1fcHJvYihza2IsIElDTVBWNl9IRFJfRklFTEQsIHNrYi0+aC5yYXctc2tiLT5uaC5yYXcpOworCQlyZXR1cm4gLTE7CisJfQorCisJaGRyID0gc2tiLT5uaC5pcHY2aDsKKwlmaGRyID0gKHN0cnVjdCBmcmFnX2hkciAqKXNrYi0+aC5yYXc7CisKKwlpZiAoIShmaGRyLT5mcmFnX29mZiAmIGh0b25zKDB4RkZGOSkpKSB7CisJCS8qIEl0IGlzIG5vdCBhIGZyYWdtZW50ZWQgZnJhbWUgKi8KKwkJc2tiLT5oLnJhdyArPSBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKTsKKwkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9SRUFTTU9LUyk7CisKKwkJKm5ob2ZmcCA9ICh1OCopZmhkciAtIHNrYi0+bmgucmF3OworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoYXRvbWljX3JlYWQoJmlwNl9mcmFnX21lbSkgPiBzeXNjdGxfaXA2ZnJhZ19oaWdoX3RocmVzaCkKKwkJaXA2X2V2aWN0b3IoKTsKKworCWlmICgoZnEgPSBmcV9maW5kKGZoZHItPmlkZW50aWZpY2F0aW9uLCAmaGRyLT5zYWRkciwgJmhkci0+ZGFkZHIpKSAhPSBOVUxMKSB7CisJCWludCByZXQgPSAtMTsKKworCQlzcGluX2xvY2soJmZxLT5sb2NrKTsKKworCQlpcDZfZnJhZ19xdWV1ZShmcSwgc2tiLCBmaGRyLCAqbmhvZmZwKTsKKworCQlpZiAoZnEtPmxhc3RfaW4gPT0gKEZJUlNUX0lOfExBU1RfSU4pICYmCisJCSAgICBmcS0+bWVhdCA9PSBmcS0+bGVuKQorCQkJcmV0ID0gaXA2X2ZyYWdfcmVhc20oZnEsIHNrYnAsIG5ob2ZmcCwgZGV2KTsKKworCQlzcGluX3VubG9jaygmZnEtPmxvY2spOworCQlmcV9wdXQoZnEsIE5VTEwpOworCQlyZXR1cm4gcmV0OworCX0KKworCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfUkVBU01GQUlMUyk7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgc3RydWN0IGluZXQ2X3Byb3RvY29sIGZyYWdfcHJvdG9jb2wgPQoreworCS5oYW5kbGVyCT0JaXB2Nl9mcmFnX3JjdiwKKwkuZmxhZ3MJCT0JSU5FVDZfUFJPVE9fTk9QT0xJQ1ksCit9OworCit2b2lkIF9faW5pdCBpcHY2X2ZyYWdfaW5pdCh2b2lkKQoreworCWlmIChpbmV0Nl9hZGRfcHJvdG9jb2woJmZyYWdfcHJvdG9jb2wsIElQUFJPVE9fRlJBR01FTlQpIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJpcHY2X2ZyYWdfaW5pdDogQ291bGQgbm90IHJlZ2lzdGVyIHByb3RvY29sXG4iKTsKKworCWlwNl9mcmFnX2hhc2hfcm5kID0gKHUzMikgKChudW1fcGh5c3BhZ2VzIF4gKG51bV9waHlzcGFnZXM+PjcpKSBeCisJCQkJICAgKGppZmZpZXMgXiAoamlmZmllcyA+PiA2KSkpOworCisJaW5pdF90aW1lcigmaXA2X2ZyYWdfc2VjcmV0X3RpbWVyKTsKKwlpcDZfZnJhZ19zZWNyZXRfdGltZXIuZnVuY3Rpb24gPSBpcDZfZnJhZ19zZWNyZXRfcmVidWlsZDsKKwlpcDZfZnJhZ19zZWNyZXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBzeXNjdGxfaXA2ZnJhZ19zZWNyZXRfaW50ZXJ2YWw7CisJYWRkX3RpbWVyKCZpcDZfZnJhZ19zZWNyZXRfdGltZXIpOworfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcm91dGUuYyBiL25ldC9pcHY2L3JvdXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgzODAyOQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY2L3JvdXRlLmMKQEAgLTAsMCArMSwyMTMxIEBACisvKgorICoJTGludXggSU5FVDYgaW1wbGVtZW50YXRpb24KKyAqCUZJQiBmcm9udC1lbmQuCisgKgorICoJQXV0aG9yczoKKyAqCVBlZHJvIFJvcXVlCQk8cm9xdWVAZGkuZmMudWwucHQ+CQorICoKKyAqCSRJZDogcm91dGUuYyx2IDEuNTYgMjAwMS8xMC8zMSAyMTo1NTo1NSBkYXZlbSBFeHAgJAorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworLyoJQ2hhbmdlczoKKyAqCisgKglZT1NISUZVSkkgSGlkZWFraSBAVVNBR0kKKyAqCQlyZXdvcmtlZCBkZWZhdWx0IHJvdXRlciBzZWxlY3Rpb24uCisgKgkJLSByZXNwZWN0IG91dGdvaW5nIGludGVyZmFjZQorICoJCS0gc2VsZWN0IGZyb20gKHByb2JhYmx5KSByZWFjaGFibGUgcm91dGVycyAoaS5lLgorICoJCXJvdXRlcnMgaW4gUkVBQ0hBQkxFLCBTVEFMRSwgREVMQVkgb3IgUFJPQkUgc3RhdGVzKS4KKyAqCQktIGFsd2F5cyBzZWxlY3QgdGhlIHNhbWUgcm91dGVyIGlmIGl0IGlzIChwcm9iYWJseSkKKyAqCQlyZWFjaGFibGUuICBvdGhlcndpc2UsIHJvdW5kLXJvYmluIHRoZSBsaXN0LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorCisjaWZkZWYgCUNPTkZJR19QUk9DX0ZTCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPG5ldC9zbm1wLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvaXA2X2ZpYi5oPgorI2luY2x1ZGUgPG5ldC9pcDZfcm91dGUuaD4KKyNpbmNsdWRlIDxuZXQvbmRpc2MuaD4KKyNpbmNsdWRlIDxuZXQvYWRkcmNvbmYuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L2RzdC5oPgorI2luY2x1ZGUgPG5ldC94ZnJtLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaWZkZWYgQ09ORklHX1NZU0NUTAorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2VuZGlmCisKKy8qIFNldCB0byAzIHRvIGdldCB0cmFjaW5nLiAqLworI2RlZmluZSBSVDZfREVCVUcgMgorCisjaWYgUlQ2X0RFQlVHID49IDMKKyNkZWZpbmUgUkRCRyh4KSBwcmludGsgeAorI2RlZmluZSBSVDZfVFJBQ0UoeC4uLikgcHJpbnRrKEtFUk5fREVCVUcgeCkKKyNlbHNlCisjZGVmaW5lIFJEQkcoeCkKKyNkZWZpbmUgUlQ2X1RSQUNFKHguLi4pIGRvIHsgOyB9IHdoaWxlICgwKQorI2VuZGlmCisKKworc3RhdGljIGludCBpcDZfcnRfbWF4X3NpemUgPSA0MDk2Oworc3RhdGljIGludCBpcDZfcnRfZ2NfbWluX2ludGVydmFsID0gSFogLyAyOworc3RhdGljIGludCBpcDZfcnRfZ2NfdGltZW91dCA9IDYwKkhaOworaW50IGlwNl9ydF9nY19pbnRlcnZhbCA9IDMwKkhaOworc3RhdGljIGludCBpcDZfcnRfZ2NfZWxhc3RpY2l0eSA9IDk7CitzdGF0aWMgaW50IGlwNl9ydF9tdHVfZXhwaXJlcyA9IDEwKjYwKkhaOworc3RhdGljIGludCBpcDZfcnRfbWluX2Fkdm1zcyA9IElQVjZfTUlOX01UVSAtIDIwIC0gNDA7CisKK3N0YXRpYyBzdHJ1Y3QgcnQ2X2luZm8gKiBpcDZfcnRfY29weShzdHJ1Y3QgcnQ2X2luZm8gKm9ydCk7CitzdGF0aWMgc3RydWN0IGRzdF9lbnRyeQkqaXA2X2RzdF9jaGVjayhzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHUzMiBjb29raWUpOworc3RhdGljIHN0cnVjdCBkc3RfZW50cnkgKmlwNl9uZWdhdGl2ZV9hZHZpY2Uoc3RydWN0IGRzdF9lbnRyeSAqKTsKK3N0YXRpYyB2b2lkCQlpcDZfZHN0X2Rlc3Ryb3koc3RydWN0IGRzdF9lbnRyeSAqKTsKK3N0YXRpYyB2b2lkCQlpcDZfZHN0X2lmZG93bihzdHJ1Y3QgZHN0X2VudHJ5ICosCisJCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBob3cpOworc3RhdGljIGludAkJIGlwNl9kc3RfZ2Modm9pZCk7CisKK3N0YXRpYyBpbnQJCWlwNl9wa3RfZGlzY2FyZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQJCWlwNl9wa3RfZGlzY2FyZF9vdXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZAkJaXA2X2xpbmtfZmFpbHVyZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkCQlpcDZfcnRfdXBkYXRlX3BtdHUoc3RydWN0IGRzdF9lbnRyeSAqZHN0LCB1MzIgbXR1KTsKKworc3RhdGljIHN0cnVjdCBkc3Rfb3BzIGlwNl9kc3Rfb3BzID0geworCS5mYW1pbHkJCQk9CUFGX0lORVQ2LAorCS5wcm90b2NvbAkJPQlfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQVjYpLAorCS5nYwkJCT0JaXA2X2RzdF9nYywKKwkuZ2NfdGhyZXNoCQk9CTEwMjQsCisJLmNoZWNrCQkJPQlpcDZfZHN0X2NoZWNrLAorCS5kZXN0cm95CQk9CWlwNl9kc3RfZGVzdHJveSwKKwkuaWZkb3duCQkJPQlpcDZfZHN0X2lmZG93biwKKwkubmVnYXRpdmVfYWR2aWNlCT0JaXA2X25lZ2F0aXZlX2FkdmljZSwKKwkubGlua19mYWlsdXJlCQk9CWlwNl9saW5rX2ZhaWx1cmUsCisJLnVwZGF0ZV9wbXR1CQk9CWlwNl9ydF91cGRhdGVfcG10dSwKKwkuZW50cnlfc2l6ZQkJPQlzaXplb2Yoc3RydWN0IHJ0Nl9pbmZvKSwKK307CisKK3N0cnVjdCBydDZfaW5mbyBpcDZfbnVsbF9lbnRyeSA9IHsKKwkudSA9IHsKKwkJLmRzdCA9IHsKKwkJCS5fX3JlZmNudAk9IEFUT01JQ19JTklUKDEpLAorCQkJLl9fdXNlCQk9IDEsCisJCQkuZGV2CQk9ICZsb29wYmFja19kZXYsCisJCQkub2Jzb2xldGUJPSAtMSwKKwkJCS5lcnJvcgkJPSAtRU5FVFVOUkVBQ0gsCisJCQkubWV0cmljcwk9IHsgW1JUQVhfSE9QTElNSVQgLSAxXSA9IDI1NSwgfSwKKwkJCS5pbnB1dAkJPSBpcDZfcGt0X2Rpc2NhcmQsCisJCQkub3V0cHV0CQk9IGlwNl9wa3RfZGlzY2FyZF9vdXQsCisJCQkub3BzCQk9ICZpcDZfZHN0X29wcywKKwkJCS5wYXRoCQk9IChzdHJ1Y3QgZHN0X2VudHJ5KikmaXA2X251bGxfZW50cnksCisJCX0KKwl9LAorCS5ydDZpX2ZsYWdzCT0gKFJURl9SRUpFQ1QgfCBSVEZfTk9ORVhUSE9QKSwKKwkucnQ2aV9tZXRyaWMJPSB+KHUzMikgMCwKKwkucnQ2aV9yZWYJPSBBVE9NSUNfSU5JVCgxKSwKK307CisKK3N0cnVjdCBmaWI2X25vZGUgaXA2X3JvdXRpbmdfdGFibGUgPSB7CisJLmxlYWYJCT0gJmlwNl9udWxsX2VudHJ5LAorCS5mbl9mbGFncwk9IFJUTl9ST09UIHwgUlROX1RMX1JPT1QgfCBSVE5fUlRJTkZPLAorfTsKKworLyogUHJvdGVjdHMgYWxsIHRoZSBpcDYgZmliICovCisKK0RFRklORV9SV0xPQ0socnQ2X2xvY2spOworCisKKy8qIGFsbG9jYXRlIGRzdCB3aXRoIGlwNl9kc3Rfb3BzICovCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgcnQ2X2luZm8gKmlwNl9kc3RfYWxsb2Modm9pZCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBydDZfaW5mbyAqKWRzdF9hbGxvYygmaXA2X2RzdF9vcHMpOworfQorCitzdGF0aWMgdm9pZCBpcDZfZHN0X2Rlc3Ryb3koc3RydWN0IGRzdF9lbnRyeSAqZHN0KQoreworCXN0cnVjdCBydDZfaW5mbyAqcnQgPSAoc3RydWN0IHJ0Nl9pbmZvICopZHN0OworCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBydC0+cnQ2aV9pZGV2OworCisJaWYgKGlkZXYgIT0gTlVMTCkgeworCQlydC0+cnQ2aV9pZGV2ID0gTlVMTDsKKwkJaW42X2Rldl9wdXQoaWRldik7CisJfQkKK30KKworc3RhdGljIHZvaWQgaXA2X2RzdF9pZmRvd24oc3RydWN0IGRzdF9lbnRyeSAqZHN0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgaW50IGhvdykKK3sKKwlzdHJ1Y3QgcnQ2X2luZm8gKnJ0ID0gKHN0cnVjdCBydDZfaW5mbyAqKWRzdDsKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gcnQtPnJ0NmlfaWRldjsKKworCWlmIChkZXYgIT0gJmxvb3BiYWNrX2RldiAmJiBpZGV2ICE9IE5VTEwgJiYgaWRldi0+ZGV2ID09IGRldikgeworCQlzdHJ1Y3QgaW5ldDZfZGV2ICpsb29wYmFja19pZGV2ID0gaW42X2Rldl9nZXQoJmxvb3BiYWNrX2Rldik7CisJCWlmIChsb29wYmFja19pZGV2ICE9IE5VTEwpIHsKKwkJCXJ0LT5ydDZpX2lkZXYgPSBsb29wYmFja19pZGV2OworCQkJaW42X2Rldl9wdXQoaWRldik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBydDZfY2hlY2tfZXhwaXJlZChjb25zdCBzdHJ1Y3QgcnQ2X2luZm8gKnJ0KQoreworCXJldHVybiAocnQtPnJ0NmlfZmxhZ3MgJiBSVEZfRVhQSVJFUyAmJgorCQl0aW1lX2FmdGVyKGppZmZpZXMsIHJ0LT5ydDZpX2V4cGlyZXMpKTsKK30KKworLyoKKyAqCVJvdXRlIGxvb2t1cC4gQW55IHJ0Nl9sb2NrIGlzIGltcGxpZWQuCisgKi8KKworc3RhdGljIF9faW5saW5lX18gc3RydWN0IHJ0Nl9pbmZvICpydDZfZGV2aWNlX21hdGNoKHN0cnVjdCBydDZfaW5mbyAqcnQsCisJCQkJCQkgICAgaW50IG9pZiwKKwkJCQkJCSAgICBpbnQgc3RyaWN0KQoreworCXN0cnVjdCBydDZfaW5mbyAqbG9jYWwgPSBOVUxMOworCXN0cnVjdCBydDZfaW5mbyAqc3BydDsKKworCWlmIChvaWYpIHsKKwkJZm9yIChzcHJ0ID0gcnQ7IHNwcnQ7IHNwcnQgPSBzcHJ0LT51Lm5leHQpIHsKKwkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzcHJ0LT5ydDZpX2RldjsKKwkJCWlmIChkZXYtPmlmaW5kZXggPT0gb2lmKQorCQkJCXJldHVybiBzcHJ0OworCQkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spIHsKKwkJCQlpZiAoc3BydC0+cnQ2aV9pZGV2ID09IE5VTEwgfHwKKwkJCQkgICAgc3BydC0+cnQ2aV9pZGV2LT5kZXYtPmlmaW5kZXggIT0gb2lmKSB7CisJCQkJCWlmIChzdHJpY3QgJiYgb2lmKQorCQkJCQkJY29udGludWU7CisJCQkJCWlmIChsb2NhbCAmJiAoIW9pZiB8fCAKKwkJCQkJCSAgICAgIGxvY2FsLT5ydDZpX2lkZXYtPmRldi0+aWZpbmRleCA9PSBvaWYpKQorCQkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWxvY2FsID0gc3BydDsKKwkJCX0KKwkJfQorCisJCWlmIChsb2NhbCkKKwkJCXJldHVybiBsb2NhbDsKKworCQlpZiAoc3RyaWN0KQorCQkJcmV0dXJuICZpcDZfbnVsbF9lbnRyeTsKKwl9CisJcmV0dXJuIHJ0OworfQorCisvKgorICoJcG9pbnRlciB0byB0aGUgbGFzdCBkZWZhdWx0IHJvdXRlciBjaG9zZW4uIEJIIGlzIGRpc2FibGVkIGxvY2FsbHkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcnQ2X2luZm8gKnJ0Nl9kZmx0X3BvaW50ZXI7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJ0Nl9kZmx0X2xvY2spOworCit2b2lkIHJ0Nl9yZXNldF9kZmx0X3BvaW50ZXIoc3RydWN0IHJ0Nl9pbmZvICpydCkKK3sKKwlzcGluX2xvY2tfYmgoJnJ0Nl9kZmx0X2xvY2spOworCWlmIChydCA9PSBOVUxMIHx8IHJ0ID09IHJ0Nl9kZmx0X3BvaW50ZXIpIHsKKwkJUlQ2X1RSQUNFKCJyZXNldCBkZWZhdWx0IHJvdXRlcjogJXAtPk5VTExcbiIsIHJ0Nl9kZmx0X3BvaW50ZXIpOworCQlydDZfZGZsdF9wb2ludGVyID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnJ0Nl9kZmx0X2xvY2spOworfQorCisvKiBEZWZhdWx0IFJvdXRlciBTZWxlY3Rpb24gKFJGQyAyNDYxIDYuMy42KSAqLworc3RhdGljIHN0cnVjdCBydDZfaW5mbyAqcnQ2X2Jlc3RfZGZsdChzdHJ1Y3QgcnQ2X2luZm8gKnJ0LCBpbnQgb2lmKQoreworCXN0cnVjdCBydDZfaW5mbyAqbWF0Y2ggPSBOVUxMOworCXN0cnVjdCBydDZfaW5mbyAqc3BydDsKKwlpbnQgbXByaSA9IDA7CisKKwlmb3IgKHNwcnQgPSBydDsgc3BydDsgc3BydCA9IHNwcnQtPnUubmV4dCkgeworCQlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaDsKKwkJaW50IG0gPSAwOworCisJCWlmICghb2lmIHx8CisJCSAgICAoc3BydC0+cnQ2aV9kZXYgJiYKKwkJICAgICBzcHJ0LT5ydDZpX2Rldi0+aWZpbmRleCA9PSBvaWYpKQorCQkJbSArPSA4OworCisJCWlmIChydDZfY2hlY2tfZXhwaXJlZChzcHJ0KSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChzcHJ0ID09IHJ0Nl9kZmx0X3BvaW50ZXIpCisJCQltICs9IDQ7CisKKwkJaWYgKChuZWlnaCA9IHNwcnQtPnJ0NmlfbmV4dGhvcCkgIT0gTlVMTCkgeworCQkJcmVhZF9sb2NrX2JoKCZuZWlnaC0+bG9jayk7CisJCQlzd2l0Y2ggKG5laWdoLT5udWRfc3RhdGUpIHsKKwkJCWNhc2UgTlVEX1JFQUNIQUJMRToKKwkJCQltICs9IDM7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgTlVEX1NUQUxFOgorCQkJY2FzZSBOVURfREVMQVk6CisJCQljYXNlIE5VRF9QUk9CRToKKwkJCQltICs9IDI7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgTlVEX05PQVJQOgorCQkJY2FzZSBOVURfUEVSTUFORU5UOgorCQkJCW0gKz0gMTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBOVURfSU5DT01QTEVURToKKwkJCWRlZmF1bHQ6CisJCQkJcmVhZF91bmxvY2tfYmgoJm5laWdoLT5sb2NrKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXJlYWRfdW5sb2NrX2JoKCZuZWlnaC0+bG9jayk7CisJCX0gZWxzZSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChtID4gbXByaSB8fCBtID49IDEyKSB7CisJCQltYXRjaCA9IHNwcnQ7CisJCQltcHJpID0gbTsKKwkJCWlmIChtID49IDEyKSB7CisJCQkJLyogd2UgY2hvb3NlIHRoZSBsYXN0IGRlZmF1bHQgcm91dGVyIGlmIGl0CisJCQkJICogaXMgaW4gKHByb2JhYmx5KSByZWFjaGFibGUgc3RhdGUuCisJCQkJICogSWYgcm91dGUgY2hhbmdlZCwgd2Ugc2hvdWxkIGRvIHBtdHUKKwkJCQkgKiBkaXNjb3ZlcnkuIC0teW9zaGZ1amkKKwkJCQkgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXNwaW5fbG9jaygmcnQ2X2RmbHRfbG9jayk7CisJaWYgKCFtYXRjaCkgeworCQkvKgorCQkgKglObyBkZWZhdWx0IHJvdXRlcnMgYXJlIGtub3duIHRvIGJlIHJlYWNoYWJsZS4KKwkJICoJU0hPVUxEIHJvdW5kIHJvYmluCisJCSAqLworCQlpZiAocnQ2X2RmbHRfcG9pbnRlcikgeworCQkJZm9yIChzcHJ0ID0gcnQ2X2RmbHRfcG9pbnRlci0+dS5uZXh0OworCQkJICAgICBzcHJ0OyBzcHJ0ID0gc3BydC0+dS5uZXh0KSB7CisJCQkJaWYgKHNwcnQtPnUuZHN0Lm9ic29sZXRlIDw9IDAgJiYKKwkJCQkgICAgc3BydC0+dS5kc3QuZXJyb3IgPT0gMCAmJgorCQkJCSAgICAhcnQ2X2NoZWNrX2V4cGlyZWQoc3BydCkpIHsKKwkJCQkJbWF0Y2ggPSBzcHJ0OworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlmb3IgKHNwcnQgPSBydDsKKwkJCSAgICAgIW1hdGNoICYmIHNwcnQ7CisJCQkgICAgIHNwcnQgPSBzcHJ0LT51Lm5leHQpIHsKKwkJCQlpZiAoc3BydC0+dS5kc3Qub2Jzb2xldGUgPD0gMCAmJgorCQkJCSAgICBzcHJ0LT51LmRzdC5lcnJvciA9PSAwICYmCisJCQkJICAgICFydDZfY2hlY2tfZXhwaXJlZChzcHJ0KSkgeworCQkJCQltYXRjaCA9IHNwcnQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAoc3BydCA9PSBydDZfZGZsdF9wb2ludGVyKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmIChtYXRjaCkgeworCQlpZiAocnQ2X2RmbHRfcG9pbnRlciAhPSBtYXRjaCkKKwkJCVJUNl9UUkFDRSgiY2hhbmdlZCBkZWZhdWx0IHJvdXRlcjogJXAtPiVwXG4iLAorCQkJCSAgcnQ2X2RmbHRfcG9pbnRlciwgbWF0Y2gpOworCQlydDZfZGZsdF9wb2ludGVyID0gbWF0Y2g7CisJfQorCXNwaW5fdW5sb2NrKCZydDZfZGZsdF9sb2NrKTsKKworCWlmICghbWF0Y2gpIHsKKwkJLyoKKwkJICogTGFzdCBSZXNvcnQ6IGlmIG5vIGRlZmF1bHQgcm91dGVycyBmb3VuZCwgCisJCSAqIHVzZSBhZGRyY29uZiBkZWZhdWx0IHJvdXRlLgorCQkgKiBXZSBkb24ndCByZWNvcmQgdGhpcyByb3V0ZS4KKwkJICovCisJCWZvciAoc3BydCA9IGlwNl9yb3V0aW5nX3RhYmxlLmxlYWY7CisJCSAgICAgc3BydDsgc3BydCA9IHNwcnQtPnUubmV4dCkgeworCQkJaWYgKCFydDZfY2hlY2tfZXhwaXJlZChzcHJ0KSAmJgorCQkJICAgIChzcHJ0LT5ydDZpX2ZsYWdzICYgUlRGX0RFRkFVTFQpICYmCisJCQkgICAgKCFvaWYgfHwKKwkJCSAgICAgKHNwcnQtPnJ0NmlfZGV2ICYmCisJCQkgICAgICBzcHJ0LT5ydDZpX2Rldi0+aWZpbmRleCA9PSBvaWYpKSkgeworCQkJCW1hdGNoID0gc3BydDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIW1hdGNoKSB7CisJCQkvKiBubyBkZWZhdWx0IHJvdXRlLiAgZ2l2ZSB1cC4gKi8KKwkJCW1hdGNoID0gJmlwNl9udWxsX2VudHJ5OworCQl9CisJfQorCisJcmV0dXJuIG1hdGNoOworfQorCitzdHJ1Y3QgcnQ2X2luZm8gKnJ0Nl9sb29rdXAoc3RydWN0IGluNl9hZGRyICpkYWRkciwgc3RydWN0IGluNl9hZGRyICpzYWRkciwKKwkJCSAgICBpbnQgb2lmLCBpbnQgc3RyaWN0KQoreworCXN0cnVjdCBmaWI2X25vZGUgKmZuOworCXN0cnVjdCBydDZfaW5mbyAqcnQ7CisKKwlyZWFkX2xvY2tfYmgoJnJ0Nl9sb2NrKTsKKwlmbiA9IGZpYjZfbG9va3VwKCZpcDZfcm91dGluZ190YWJsZSwgZGFkZHIsIHNhZGRyKTsKKwlydCA9IHJ0Nl9kZXZpY2VfbWF0Y2goZm4tPmxlYWYsIG9pZiwgc3RyaWN0KTsKKwlkc3RfaG9sZCgmcnQtPnUuZHN0KTsKKwlydC0+dS5kc3QuX191c2UrKzsKKwlyZWFkX3VubG9ja19iaCgmcnQ2X2xvY2spOworCisJcnQtPnUuZHN0Lmxhc3R1c2UgPSBqaWZmaWVzOworCWlmIChydC0+dS5kc3QuZXJyb3IgPT0gMCkKKwkJcmV0dXJuIHJ0OworCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCXJldHVybiBOVUxMOworfQorCisvKiBpcDZfaW5zX3J0IGlzIGNhbGxlZCB3aXRoIEZSRUUgcnQ2X2xvY2suCisgICBJdCB0YWtlcyBuZXcgcm91dGUgZW50cnksIHRoZSBhZGRpdGlvbiBmYWlscyBieSBhbnkgcmVhc29uIHRoZQorICAgcm91dGUgaXMgZnJlZWQuIEluIGFueSBjYXNlLCBpZiBjYWxsZXIgZG9lcyBub3QgaG9sZCBpdCwgaXQgbWF5CisgICBiZSBkZXN0cm95ZWQuCisgKi8KKworaW50IGlwNl9pbnNfcnQoc3RydWN0IHJ0Nl9pbmZvICpydCwgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKl9ydGF0dHIpCit7CisJaW50IGVycjsKKworCXdyaXRlX2xvY2tfYmgoJnJ0Nl9sb2NrKTsKKwllcnIgPSBmaWI2X2FkZCgmaXA2X3JvdXRpbmdfdGFibGUsIHJ0LCBubGgsIF9ydGF0dHIpOworCXdyaXRlX3VubG9ja19iaCgmcnQ2X2xvY2spOworCisJcmV0dXJuIGVycjsKK30KKworLyogTm8gcnQ2X2xvY2shIElmIENPVyBmYWlsZWQsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGRlYWQgcm91dGUgZW50cnkKKyAgIHdpdGggZHN0LT5lcnJvciBzZXQgdG8gZXJybm8gdmFsdWUuCisgKi8KKworc3RhdGljIHN0cnVjdCBydDZfaW5mbyAqcnQ2X2NvdyhzdHJ1Y3QgcnQ2X2luZm8gKm9ydCwgc3RydWN0IGluNl9hZGRyICpkYWRkciwKKwkJCQlzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyKQoreworCWludCBlcnI7CisJc3RydWN0IHJ0Nl9pbmZvICpydDsKKworCS8qCisJICoJQ2xvbmUgdGhlIHJvdXRlLgorCSAqLworCisJcnQgPSBpcDZfcnRfY29weShvcnQpOworCisJaWYgKHJ0KSB7CisJCWlwdjZfYWRkcl9jb3B5KCZydC0+cnQ2aV9kc3QuYWRkciwgZGFkZHIpOworCisJCWlmICghKHJ0LT5ydDZpX2ZsYWdzJlJURl9HQVRFV0FZKSkKKwkJCWlwdjZfYWRkcl9jb3B5KCZydC0+cnQ2aV9nYXRld2F5LCBkYWRkcik7CisKKwkJcnQtPnJ0NmlfZHN0LnBsZW4gPSAxMjg7CisJCXJ0LT5ydDZpX2ZsYWdzIHw9IFJURl9DQUNIRTsKKwkJcnQtPnUuZHN0LmZsYWdzIHw9IERTVF9IT1NUOworCisjaWZkZWYgQ09ORklHX0lQVjZfU1VCVFJFRVMKKwkJaWYgKHJ0LT5ydDZpX3NyYy5wbGVuICYmIHNhZGRyKSB7CisJCQlpcHY2X2FkZHJfY29weSgmcnQtPnJ0Nmlfc3JjLmFkZHIsIHNhZGRyKTsKKwkJCXJ0LT5ydDZpX3NyYy5wbGVuID0gMTI4OworCQl9CisjZW5kaWYKKworCQlydC0+cnQ2aV9uZXh0aG9wID0gbmRpc2NfZ2V0X25laWdoKHJ0LT5ydDZpX2RldiwgJnJ0LT5ydDZpX2dhdGV3YXkpOworCisJCWRzdF9ob2xkKCZydC0+dS5kc3QpOworCisJCWVyciA9IGlwNl9pbnNfcnQocnQsIE5VTEwsIE5VTEwpOworCQlpZiAoZXJyID09IDApCisJCQlyZXR1cm4gcnQ7CisKKwkJcnQtPnUuZHN0LmVycm9yID0gZXJyOworCisJCXJldHVybiBydDsKKwl9CisJZHN0X2hvbGQoJmlwNl9udWxsX2VudHJ5LnUuZHN0KTsKKwlyZXR1cm4gJmlwNl9udWxsX2VudHJ5OworfQorCisjZGVmaW5lIEJBQ0tUUkFDSygpIFwKK2lmIChydCA9PSAmaXA2X251bGxfZW50cnkgJiYgc3RyaWN0KSB7IFwKKyAgICAgICB3aGlsZSAoKGZuID0gZm4tPnBhcmVudCkgIT0gTlVMTCkgeyBcCisJCWlmIChmbi0+Zm5fZmxhZ3MgJiBSVE5fUk9PVCkgeyBcCisJCQlkc3RfaG9sZCgmcnQtPnUuZHN0KTsgXAorCQkJZ290byBvdXQ7IFwKKwkJfSBcCisJCWlmIChmbi0+Zm5fZmxhZ3MgJiBSVE5fUlRJTkZPKSBcCisJCQlnb3RvIHJlc3RhcnQ7IFwKKwl9IFwKK30KKworCit2b2lkIGlwNl9yb3V0ZV9pbnB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBmaWI2X25vZGUgKmZuOworCXN0cnVjdCBydDZfaW5mbyAqcnQ7CisJaW50IHN0cmljdDsKKwlpbnQgYXR0ZW1wdHMgPSAzOworCisJc3RyaWN0ID0gaXB2Nl9hZGRyX3R5cGUoJnNrYi0+bmguaXB2NmgtPmRhZGRyKSAmIChJUFY2X0FERFJfTVVMVElDQVNUfElQVjZfQUREUl9MSU5LTE9DQUwpOworCityZWxvb2t1cDoKKwlyZWFkX2xvY2tfYmgoJnJ0Nl9sb2NrKTsKKworCWZuID0gZmliNl9sb29rdXAoJmlwNl9yb3V0aW5nX3RhYmxlLCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsCisJCQkgJnNrYi0+bmguaXB2NmgtPnNhZGRyKTsKKworcmVzdGFydDoKKwlydCA9IGZuLT5sZWFmOworCisJaWYgKChydC0+cnQ2aV9mbGFncyAmIFJURl9DQUNIRSkpIHsKKwkJcnQgPSBydDZfZGV2aWNlX21hdGNoKHJ0LCBza2ItPmRldi0+aWZpbmRleCwgc3RyaWN0KTsKKwkJQkFDS1RSQUNLKCk7CisJCWRzdF9ob2xkKCZydC0+dS5kc3QpOworCQlnb3RvIG91dDsKKwl9CisKKwlydCA9IHJ0Nl9kZXZpY2VfbWF0Y2gocnQsIHNrYi0+ZGV2LT5pZmluZGV4LCAwKTsKKwlCQUNLVFJBQ0soKTsKKworCWlmICghcnQtPnJ0NmlfbmV4dGhvcCAmJiAhKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX05PTkVYVEhPUCkpIHsKKwkJc3RydWN0IHJ0Nl9pbmZvICpucnQ7CisJCWRzdF9ob2xkKCZydC0+dS5kc3QpOworCQlyZWFkX3VubG9ja19iaCgmcnQ2X2xvY2spOworCisJCW5ydCA9IHJ0Nl9jb3cocnQsICZza2ItPm5oLmlwdjZoLT5kYWRkciwKKwkJCSAgICAgICZza2ItPm5oLmlwdjZoLT5zYWRkcik7CisKKwkJZHN0X3JlbGVhc2UoJnJ0LT51LmRzdCk7CisJCXJ0ID0gbnJ0OworCisJCWlmIChydC0+dS5kc3QuZXJyb3IgIT0gLUVFWElTVCB8fCAtLWF0dGVtcHRzIDw9IDApCisJCQlnb3RvIG91dDI7CisKKwkJLyogUmFjZSBjb25kaXRpb24hIEluIHRoZSBnYXAsIHdoZW4gcnQ2X2xvY2sgd2FzCisJCSAgIHJlbGVhc2VkIHNvbWVvbmUgY291bGQgaW5zZXJ0IHRoaXMgcm91dGUuICBSZWxvb2t1cC4KKwkJKi8KKwkJZHN0X3JlbGVhc2UoJnJ0LT51LmRzdCk7CisJCWdvdG8gcmVsb29rdXA7CisJfQorCWRzdF9ob2xkKCZydC0+dS5kc3QpOworCitvdXQ6CisJcmVhZF91bmxvY2tfYmgoJnJ0Nl9sb2NrKTsKK291dDI6CisJcnQtPnUuZHN0Lmxhc3R1c2UgPSBqaWZmaWVzOworCXJ0LT51LmRzdC5fX3VzZSsrOworCXNrYi0+ZHN0ID0gKHN0cnVjdCBkc3RfZW50cnkgKikgcnQ7Cit9CisKK3N0cnVjdCBkc3RfZW50cnkgKiBpcDZfcm91dGVfb3V0cHV0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGZsb3dpICpmbCkKK3sKKwlzdHJ1Y3QgZmliNl9ub2RlICpmbjsKKwlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OworCWludCBzdHJpY3Q7CisJaW50IGF0dGVtcHRzID0gMzsKKworCXN0cmljdCA9IGlwdjZfYWRkcl90eXBlKCZmbC0+Zmw2X2RzdCkgJiAoSVBWNl9BRERSX01VTFRJQ0FTVHxJUFY2X0FERFJfTElOS0xPQ0FMKTsKKworcmVsb29rdXA6CisJcmVhZF9sb2NrX2JoKCZydDZfbG9jayk7CisKKwlmbiA9IGZpYjZfbG9va3VwKCZpcDZfcm91dGluZ190YWJsZSwgJmZsLT5mbDZfZHN0LCAmZmwtPmZsNl9zcmMpOworCityZXN0YXJ0OgorCXJ0ID0gZm4tPmxlYWY7CisKKwlpZiAoKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX0NBQ0hFKSkgeworCQlydCA9IHJ0Nl9kZXZpY2VfbWF0Y2gocnQsIGZsLT5vaWYsIHN0cmljdCk7CisJCUJBQ0tUUkFDSygpOworCQlkc3RfaG9sZCgmcnQtPnUuZHN0KTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChydC0+cnQ2aV9mbGFncyAmIFJURl9ERUZBVUxUKSB7CisJCWlmIChydC0+cnQ2aV9tZXRyaWMgPj0gSVA2X1JUX1BSSU9fQUREUkNPTkYpCisJCQlydCA9IHJ0Nl9iZXN0X2RmbHQocnQsIGZsLT5vaWYpOworCX0gZWxzZSB7CisJCXJ0ID0gcnQ2X2RldmljZV9tYXRjaChydCwgZmwtPm9pZiwgc3RyaWN0KTsKKwkJQkFDS1RSQUNLKCk7CisJfQorCisJaWYgKCFydC0+cnQ2aV9uZXh0aG9wICYmICEocnQtPnJ0NmlfZmxhZ3MgJiBSVEZfTk9ORVhUSE9QKSkgeworCQlzdHJ1Y3QgcnQ2X2luZm8gKm5ydDsKKwkJZHN0X2hvbGQoJnJ0LT51LmRzdCk7CisJCXJlYWRfdW5sb2NrX2JoKCZydDZfbG9jayk7CisKKwkJbnJ0ID0gcnQ2X2NvdyhydCwgJmZsLT5mbDZfZHN0LCAmZmwtPmZsNl9zcmMpOworCisJCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCQlydCA9IG5ydDsKKworCQlpZiAocnQtPnUuZHN0LmVycm9yICE9IC1FRVhJU1QgfHwgLS1hdHRlbXB0cyA8PSAwKQorCQkJZ290byBvdXQyOworCisJCS8qIFJhY2UgY29uZGl0aW9uISBJbiB0aGUgZ2FwLCB3aGVuIHJ0Nl9sb2NrIHdhcworCQkgICByZWxlYXNlZCBzb21lb25lIGNvdWxkIGluc2VydCB0aGlzIHJvdXRlLiAgUmVsb29rdXAuCisJCSovCisJCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCQlnb3RvIHJlbG9va3VwOworCX0KKwlkc3RfaG9sZCgmcnQtPnUuZHN0KTsKKworb3V0OgorCXJlYWRfdW5sb2NrX2JoKCZydDZfbG9jayk7CitvdXQyOgorCXJ0LT51LmRzdC5sYXN0dXNlID0gamlmZmllczsKKwlydC0+dS5kc3QuX191c2UrKzsKKwlyZXR1cm4gJnJ0LT51LmRzdDsKK30KKworCisvKgorICoJRGVzdGluYXRpb24gY2FjaGUgc3VwcG9ydCBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgc3RydWN0IGRzdF9lbnRyeSAqaXA2X2RzdF9jaGVjayhzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHUzMiBjb29raWUpCit7CisJc3RydWN0IHJ0Nl9pbmZvICpydDsKKworCXJ0ID0gKHN0cnVjdCBydDZfaW5mbyAqKSBkc3Q7CisKKwlpZiAocnQgJiYgcnQtPnJ0Nmlfbm9kZSAmJiAocnQtPnJ0Nmlfbm9kZS0+Zm5fc2VybnVtID09IGNvb2tpZSkpCisJCXJldHVybiBkc3Q7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBkc3RfZW50cnkgKmlwNl9uZWdhdGl2ZV9hZHZpY2Uoc3RydWN0IGRzdF9lbnRyeSAqZHN0KQoreworCXN0cnVjdCBydDZfaW5mbyAqcnQgPSAoc3RydWN0IHJ0Nl9pbmZvICopIGRzdDsKKworCWlmIChydCkgeworCQlpZiAocnQtPnJ0NmlfZmxhZ3MgJiBSVEZfQ0FDSEUpCisJCQlpcDZfZGVsX3J0KHJ0LCBOVUxMLCBOVUxMKTsKKwkJZWxzZQorCQkJZHN0X3JlbGVhc2UoZHN0KTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGlwNl9saW5rX2ZhaWx1cmUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OworCisJaWNtcHY2X3NlbmQoc2tiLCBJQ01QVjZfREVTVF9VTlJFQUNILCBJQ01QVjZfQUREUl9VTlJFQUNILCAwLCBza2ItPmRldik7CisKKwlydCA9IChzdHJ1Y3QgcnQ2X2luZm8gKikgc2tiLT5kc3Q7CisJaWYgKHJ0KSB7CisJCWlmIChydC0+cnQ2aV9mbGFncyZSVEZfQ0FDSEUpIHsKKwkJCWRzdF9zZXRfZXhwaXJlcygmcnQtPnUuZHN0LCAwKTsKKwkJCXJ0LT5ydDZpX2ZsYWdzIHw9IFJURl9FWFBJUkVTOworCQl9IGVsc2UgaWYgKHJ0LT5ydDZpX25vZGUgJiYgKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX0RFRkFVTFQpKQorCQkJcnQtPnJ0Nmlfbm9kZS0+Zm5fc2VybnVtID0gLTE7CisJfQorfQorCitzdGF0aWMgdm9pZCBpcDZfcnRfdXBkYXRlX3BtdHUoc3RydWN0IGRzdF9lbnRyeSAqZHN0LCB1MzIgbXR1KQoreworCXN0cnVjdCBydDZfaW5mbyAqcnQ2ID0gKHN0cnVjdCBydDZfaW5mbyopZHN0OworCisJaWYgKG10dSA8IGRzdF9tdHUoZHN0KSAmJiBydDYtPnJ0NmlfZHN0LnBsZW4gPT0gMTI4KSB7CisJCXJ0Ni0+cnQ2aV9mbGFncyB8PSBSVEZfTU9ESUZJRUQ7CisJCWlmIChtdHUgPCBJUFY2X01JTl9NVFUpIHsKKwkJCW10dSA9IElQVjZfTUlOX01UVTsKKwkJCWRzdC0+bWV0cmljc1tSVEFYX0ZFQVRVUkVTLTFdIHw9IFJUQVhfRkVBVFVSRV9BTExGUkFHOworCQl9CisJCWRzdC0+bWV0cmljc1tSVEFYX01UVS0xXSA9IG10dTsKKwl9Cit9CisKKy8qIFByb3RlY3RlZCBieSBydDZfbG9jay4gICovCitzdGF0aWMgc3RydWN0IGRzdF9lbnRyeSAqbmRpc2NfZHN0X2djX2xpc3Q7CitzdGF0aWMgaW50IGlwdjZfZ2V0X210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaXB2Nl9hZHZtc3ModW5zaWduZWQgaW50IG10dSkKK3sKKwltdHUgLT0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKKworCWlmIChtdHUgPCBpcDZfcnRfbWluX2Fkdm1zcykKKwkJbXR1ID0gaXA2X3J0X21pbl9hZHZtc3M7CisKKwkvKgorCSAqIE1heGltYWwgbm9uLWp1bWJvIElQdjYgcGF5bG9hZCBpcyBJUFY2X01BWFBMRU4gYW5kIAorCSAqIGNvcnJlc3BvbmRpbmcgTVNTIGlzIElQVjZfTUFYUExFTiAtIHRjcF9oZWFkZXJfc2l6ZS4gCisJICogSVBWNl9NQVhQTEVOIGlzIGFsc28gdmFsaWQgYW5kIG1lYW5zOiAiYW55IE1TUywgCisJICogcmVseSBvbmx5IG9uIHBtdHUgZGlzY292ZXJ5IgorCSAqLworCWlmIChtdHUgPiBJUFY2X01BWFBMRU4gLSBzaXplb2Yoc3RydWN0IHRjcGhkcikpCisJCW10dSA9IElQVjZfTUFYUExFTjsKKwlyZXR1cm4gbXR1OworfQorCitzdHJ1Y3QgZHN0X2VudHJ5ICpuZGlzY19kc3RfYWxsb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgCisJCQkJICBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwKKwkJCQkgIHN0cnVjdCBpbjZfYWRkciAqYWRkciwKKwkJCQkgIGludCAoKm91dHB1dCkoc3RydWN0IHNrX2J1ZmYgKikpCit7CisJc3RydWN0IHJ0Nl9pbmZvICpydDsKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gaW42X2Rldl9nZXQoZGV2KTsKKworCWlmICh1bmxpa2VseShpZGV2ID09IE5VTEwpKQorCQlyZXR1cm4gTlVMTDsKKworCXJ0ID0gaXA2X2RzdF9hbGxvYygpOworCWlmICh1bmxpa2VseShydCA9PSBOVUxMKSkgeworCQlpbjZfZGV2X3B1dChpZGV2KTsKKwkJZ290byBvdXQ7CisJfQorCisJZGV2X2hvbGQoZGV2KTsKKwlpZiAobmVpZ2gpCisJCW5laWdoX2hvbGQobmVpZ2gpOworCWVsc2UKKwkJbmVpZ2ggPSBuZGlzY19nZXRfbmVpZ2goZGV2LCBhZGRyKTsKKworCXJ0LT5ydDZpX2RldgkgID0gZGV2OworCXJ0LT5ydDZpX2lkZXYgICAgID0gaWRldjsKKwlydC0+cnQ2aV9uZXh0aG9wICA9IG5laWdoOworCWF0b21pY19zZXQoJnJ0LT51LmRzdC5fX3JlZmNudCwgMSk7CisJcnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9IT1BMSU1JVC0xXSA9IDI1NTsKKwlydC0+dS5kc3QubWV0cmljc1tSVEFYX01UVS0xXSA9IGlwdjZfZ2V0X210dShydC0+cnQ2aV9kZXYpOworCXJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfQURWTVNTLTFdID0gaXB2Nl9hZHZtc3MoZHN0X210dSgmcnQtPnUuZHN0KSk7CisJcnQtPnUuZHN0Lm91dHB1dCAgPSBvdXRwdXQ7CisKKyNpZiAwCS8qIHRoZXJlJ3Mgbm8gY2hhbmNlIHRvIHVzZSB0aGVzZSBmb3IgbmRpc2MgKi8KKwlydC0+dS5kc3QuZmxhZ3MgICA9IGlwdjZfYWRkcl90eXBlKGFkZHIpICYgSVBWNl9BRERSX1VOSUNBU1QgCisJCQkJPyBEU1RfSE9TVCAKKwkJCQk6IDA7CisJaXB2Nl9hZGRyX2NvcHkoJnJ0LT5ydDZpX2RzdC5hZGRyLCBhZGRyKTsKKwlydC0+cnQ2aV9kc3QucGxlbiA9IDEyODsKKyNlbmRpZgorCisJd3JpdGVfbG9ja19iaCgmcnQ2X2xvY2spOworCXJ0LT51LmRzdC5uZXh0ID0gbmRpc2NfZHN0X2djX2xpc3Q7CisJbmRpc2NfZHN0X2djX2xpc3QgPSAmcnQtPnUuZHN0OworCXdyaXRlX3VubG9ja19iaCgmcnQ2X2xvY2spOworCisJZmliNl9mb3JjZV9zdGFydF9nYygpOworCitvdXQ6CisJcmV0dXJuIChzdHJ1Y3QgZHN0X2VudHJ5ICopcnQ7Cit9CisKK2ludCBuZGlzY19kc3RfZ2MoaW50ICptb3JlKQoreworCXN0cnVjdCBkc3RfZW50cnkgKmRzdCwgKm5leHQsICoqcHByZXY7CisJaW50IGZyZWVkOworCisJbmV4dCA9IE5VTEw7CisJcHByZXYgPSAmbmRpc2NfZHN0X2djX2xpc3Q7CisJZnJlZWQgPSAwOworCXdoaWxlICgoZHN0ID0gKnBwcmV2KSAhPSBOVUxMKSB7CisJCWlmICghYXRvbWljX3JlYWQoJmRzdC0+X19yZWZjbnQpKSB7CisJCQkqcHByZXYgPSBkc3QtPm5leHQ7CisJCQlkc3RfZnJlZShkc3QpOworCQkJZnJlZWQrKzsKKwkJfSBlbHNlIHsKKwkJCXBwcmV2ID0gJmRzdC0+bmV4dDsKKwkJCSgqbW9yZSkrKzsKKwkJfQorCX0KKworCXJldHVybiBmcmVlZDsKK30KKworc3RhdGljIGludCBpcDZfZHN0X2djKHZvaWQpCit7CisJc3RhdGljIHVuc2lnbmVkIGV4cGlyZSA9IDMwKkhaOworCXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfZ2M7CisJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOworCisJaWYgKHRpbWVfYWZ0ZXIobGFzdF9nYyArIGlwNl9ydF9nY19taW5faW50ZXJ2YWwsIG5vdykgJiYKKwkgICAgYXRvbWljX3JlYWQoJmlwNl9kc3Rfb3BzLmVudHJpZXMpIDw9IGlwNl9ydF9tYXhfc2l6ZSkKKwkJZ290byBvdXQ7CisKKwlleHBpcmUrKzsKKwlmaWI2X3J1bl9nYyhleHBpcmUpOworCWxhc3RfZ2MgPSBub3c7CisJaWYgKGF0b21pY19yZWFkKCZpcDZfZHN0X29wcy5lbnRyaWVzKSA8IGlwNl9kc3Rfb3BzLmdjX3RocmVzaCkKKwkJZXhwaXJlID0gaXA2X3J0X2djX3RpbWVvdXQ+PjE7CisKK291dDoKKwlleHBpcmUgLT0gZXhwaXJlPj5pcDZfcnRfZ2NfZWxhc3RpY2l0eTsKKwlyZXR1cm4gKGF0b21pY19yZWFkKCZpcDZfZHN0X29wcy5lbnRyaWVzKSA+IGlwNl9ydF9tYXhfc2l6ZSk7Cit9CisKKy8qIENsZWFuIGhvc3QgcGFydCBvZiBhIHByZWZpeC4gTm90IG5lY2Vzc2FyeSBpbiByYWRpeCB0cmVlLAorICAgYnV0IHJlc3VsdHMgaW4gY2xlYW5lciByb3V0aW5nIHRhYmxlcy4KKworICAgUmVtb3ZlIGl0IG9ubHkgd2hlbiBhbGwgdGhlIHRoaW5ncyB3aWxsIHdvcmshCisgKi8KKworc3RhdGljIGludCBpcHY2X2dldF9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgbXR1ID0gSVBWNl9NSU5fTVRVOworCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CisKKwlpZGV2ID0gaW42X2Rldl9nZXQoZGV2KTsKKwlpZiAoaWRldikgeworCQltdHUgPSBpZGV2LT5jbmYubXR1NjsKKwkJaW42X2Rldl9wdXQoaWRldik7CisJfQorCXJldHVybiBtdHU7Cit9CisKK2ludCBpcHY2X2dldF9ob3BsaW1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBob3BsaW1pdCA9IGlwdjZfZGV2Y29uZi5ob3BfbGltaXQ7CisJc3RydWN0IGluZXQ2X2RldiAqaWRldjsKKworCWlkZXYgPSBpbjZfZGV2X2dldChkZXYpOworCWlmIChpZGV2KSB7CisJCWhvcGxpbWl0ID0gaWRldi0+Y25mLmhvcF9saW1pdDsKKwkJaW42X2Rldl9wdXQoaWRldik7CisJfQorCXJldHVybiBob3BsaW1pdDsKK30KKworLyoKKyAqCisgKi8KKworaW50IGlwNl9yb3V0ZV9hZGQoc3RydWN0IGluNl9ydG1zZyAqcnRtc2csIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICpfcnRhdHRyKQoreworCWludCBlcnI7CisJc3RydWN0IHJ0bXNnICpyOworCXN0cnVjdCBydGF0dHIgKipydGE7CisJc3RydWN0IHJ0Nl9pbmZvICpydCA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IGluZXQ2X2RldiAqaWRldiA9IE5VTEw7CisJaW50IGFkZHJfdHlwZTsKKworCXJ0YSA9IChzdHJ1Y3QgcnRhdHRyICoqKSBfcnRhdHRyOworCisJaWYgKHJ0bXNnLT5ydG1zZ19kc3RfbGVuID4gMTI4IHx8IHJ0bXNnLT5ydG1zZ19zcmNfbGVuID4gMTI4KQorCQlyZXR1cm4gLUVJTlZBTDsKKyNpZm5kZWYgQ09ORklHX0lQVjZfU1VCVFJFRVMKKwlpZiAocnRtc2ctPnJ0bXNnX3NyY19sZW4pCisJCXJldHVybiAtRUlOVkFMOworI2VuZGlmCisJaWYgKHJ0bXNnLT5ydG1zZ19pZmluZGV4KSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWRldiA9IGRldl9nZXRfYnlfaW5kZXgocnRtc2ctPnJ0bXNnX2lmaW5kZXgpOworCQlpZiAoIWRldikKKwkJCWdvdG8gb3V0OworCQlpZGV2ID0gaW42X2Rldl9nZXQoZGV2KTsKKwkJaWYgKCFpZGV2KQorCQkJZ290byBvdXQ7CisJfQorCisJaWYgKHJ0bXNnLT5ydG1zZ19tZXRyaWMgPT0gMCkKKwkJcnRtc2ctPnJ0bXNnX21ldHJpYyA9IElQNl9SVF9QUklPX1VTRVI7CisKKwlydCA9IGlwNl9kc3RfYWxsb2MoKTsKKworCWlmIChydCA9PSBOVUxMKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXJ0LT51LmRzdC5vYnNvbGV0ZSA9IC0xOworCXJ0LT5ydDZpX2V4cGlyZXMgPSBjbG9ja190X3RvX2ppZmZpZXMocnRtc2ctPnJ0bXNnX2luZm8pOworCWlmIChubGggJiYgKHIgPSBOTE1TR19EQVRBKG5saCkpKSB7CisJCXJ0LT5ydDZpX3Byb3RvY29sID0gci0+cnRtX3Byb3RvY29sOworCX0gZWxzZSB7CisJCXJ0LT5ydDZpX3Byb3RvY29sID0gUlRQUk9UX0JPT1Q7CisJfQorCisJYWRkcl90eXBlID0gaXB2Nl9hZGRyX3R5cGUoJnJ0bXNnLT5ydG1zZ19kc3QpOworCisJaWYgKGFkZHJfdHlwZSAmIElQVjZfQUREUl9NVUxUSUNBU1QpCisJCXJ0LT51LmRzdC5pbnB1dCA9IGlwNl9tY19pbnB1dDsKKwllbHNlCisJCXJ0LT51LmRzdC5pbnB1dCA9IGlwNl9mb3J3YXJkOworCisJcnQtPnUuZHN0Lm91dHB1dCA9IGlwNl9vdXRwdXQ7CisKKwlpcHY2X2FkZHJfcHJlZml4KCZydC0+cnQ2aV9kc3QuYWRkciwgCisJCQkgJnJ0bXNnLT5ydG1zZ19kc3QsIHJ0bXNnLT5ydG1zZ19kc3RfbGVuKTsKKwlydC0+cnQ2aV9kc3QucGxlbiA9IHJ0bXNnLT5ydG1zZ19kc3RfbGVuOworCWlmIChydC0+cnQ2aV9kc3QucGxlbiA9PSAxMjgpCisJICAgICAgIHJ0LT51LmRzdC5mbGFncyA9IERTVF9IT1NUOworCisjaWZkZWYgQ09ORklHX0lQVjZfU1VCVFJFRVMKKwlpcHY2X2FkZHJfcHJlZml4KCZydC0+cnQ2aV9zcmMuYWRkciwgCisJCQkgJnJ0bXNnLT5ydG1zZ19zcmMsIHJ0bXNnLT5ydG1zZ19zcmNfbGVuKTsKKwlydC0+cnQ2aV9zcmMucGxlbiA9IHJ0bXNnLT5ydG1zZ19zcmNfbGVuOworI2VuZGlmCisKKwlydC0+cnQ2aV9tZXRyaWMgPSBydG1zZy0+cnRtc2dfbWV0cmljOworCisJLyogV2UgY2Fubm90IGFkZCB0cnVlIHJvdXRlcyB2aWEgbG9vcGJhY2sgaGVyZSwKKwkgICB0aGV5IHdvdWxkIHJlc3VsdCBpbiBrZXJuZWwgbG9vcGluZzsgcHJvbW90ZSB0aGVtIHRvIHJlamVjdCByb3V0ZXMKKwkgKi8KKwlpZiAoKHJ0bXNnLT5ydG1zZ19mbGFncyZSVEZfUkVKRUNUKSB8fAorCSAgICAoZGV2ICYmIChkZXYtPmZsYWdzJklGRl9MT09QQkFDSykgJiYgIShhZGRyX3R5cGUmSVBWNl9BRERSX0xPT1BCQUNLKSkpIHsKKwkJLyogaG9sZCBsb29wYmFjayBkZXYvaWRldiBpZiB3ZSBoYXZlbid0IGRvbmUgc28uICovCisJCWlmIChkZXYgIT0gJmxvb3BiYWNrX2RldikgeworCQkJaWYgKGRldikgeworCQkJCWRldl9wdXQoZGV2KTsKKwkJCQlpbjZfZGV2X3B1dChpZGV2KTsKKwkJCX0KKwkJCWRldiA9ICZsb29wYmFja19kZXY7CisJCQlkZXZfaG9sZChkZXYpOworCQkJaWRldiA9IGluNl9kZXZfZ2V0KGRldik7CisJCQlpZiAoIWlkZXYpIHsKKwkJCQllcnIgPSAtRU5PREVWOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJCXJ0LT51LmRzdC5vdXRwdXQgPSBpcDZfcGt0X2Rpc2NhcmRfb3V0OworCQlydC0+dS5kc3QuaW5wdXQgPSBpcDZfcGt0X2Rpc2NhcmQ7CisJCXJ0LT51LmRzdC5lcnJvciA9IC1FTkVUVU5SRUFDSDsKKwkJcnQtPnJ0NmlfZmxhZ3MgPSBSVEZfUkVKRUNUfFJURl9OT05FWFRIT1A7CisJCWdvdG8gaW5zdGFsbF9yb3V0ZTsKKwl9CisKKwlpZiAocnRtc2ctPnJ0bXNnX2ZsYWdzICYgUlRGX0dBVEVXQVkpIHsKKwkJc3RydWN0IGluNl9hZGRyICpnd19hZGRyOworCQlpbnQgZ3dhX3R5cGU7CisKKwkJZ3dfYWRkciA9ICZydG1zZy0+cnRtc2dfZ2F0ZXdheTsKKwkJaXB2Nl9hZGRyX2NvcHkoJnJ0LT5ydDZpX2dhdGV3YXksICZydG1zZy0+cnRtc2dfZ2F0ZXdheSk7CisJCWd3YV90eXBlID0gaXB2Nl9hZGRyX3R5cGUoZ3dfYWRkcik7CisKKwkJaWYgKGd3YV90eXBlICE9IChJUFY2X0FERFJfTElOS0xPQ0FMfElQVjZfQUREUl9VTklDQVNUKSkgeworCQkJc3RydWN0IHJ0Nl9pbmZvICpncnQ7CisKKwkJCS8qIElQdjYgc3RyaWN0bHkgaW5oaWJpdHMgdXNpbmcgbm90IGxpbmstbG9jYWwKKwkJCSAgIGFkZHJlc3NlcyBhcyBuZXh0aG9wIGFkZHJlc3MuCisJCQkgICBPdGhlcndpc2UsIHJvdXRlciB3aWxsIG5vdCBhYmxlIHRvIHNlbmQgcmVkaXJlY3RzLgorCQkJICAgSXQgaXMgdmVyeSBnb29kLCBidXQgaW4gc29tZSAocmFyZSEpIGNpcmN1bXN0YW5jZXMKKwkJCSAgIChTSVQsIFB0UCwgTkJNQSBOT0FSUCBsaW5rcykgaXQgaXMgaGFuZHkgdG8gYWxsb3cKKwkJCSAgIHNvbWUgZXhjZXB0aW9ucy4gLS1BTksKKwkJCSAqLworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWlmICghKGd3YV90eXBlJklQVjZfQUREUl9VTklDQVNUKSkKKwkJCQlnb3RvIG91dDsKKworCQkJZ3J0ID0gcnQ2X2xvb2t1cChnd19hZGRyLCBOVUxMLCBydG1zZy0+cnRtc2dfaWZpbmRleCwgMSk7CisKKwkJCWVyciA9IC1FSE9TVFVOUkVBQ0g7CisJCQlpZiAoZ3J0ID09IE5VTEwpCisJCQkJZ290byBvdXQ7CisJCQlpZiAoZGV2KSB7CisJCQkJaWYgKGRldiAhPSBncnQtPnJ0NmlfZGV2KSB7CisJCQkJCWRzdF9yZWxlYXNlKCZncnQtPnUuZHN0KTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlkZXYgPSBncnQtPnJ0NmlfZGV2OworCQkJCWlkZXYgPSBncnQtPnJ0NmlfaWRldjsKKwkJCQlkZXZfaG9sZChkZXYpOworCQkJCWluNl9kZXZfaG9sZChncnQtPnJ0NmlfaWRldik7CisJCQl9CisJCQlpZiAoIShncnQtPnJ0NmlfZmxhZ3MmUlRGX0dBVEVXQVkpKQorCQkJCWVyciA9IDA7CisJCQlkc3RfcmVsZWFzZSgmZ3J0LT51LmRzdCk7CisKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CisJCX0KKwkJZXJyID0gLUVJTlZBTDsKKwkJaWYgKGRldiA9PSBOVUxMIHx8IChkZXYtPmZsYWdzJklGRl9MT09QQkFDSykpCisJCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSAtRU5PREVWOworCWlmIChkZXYgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlpZiAocnRtc2ctPnJ0bXNnX2ZsYWdzICYgKFJURl9HQVRFV0FZfFJURl9OT05FWFRIT1ApKSB7CisJCXJ0LT5ydDZpX25leHRob3AgPSBfX25laWdoX2xvb2t1cF9lcnJubygmbmRfdGJsLCAmcnQtPnJ0NmlfZ2F0ZXdheSwgZGV2KTsKKwkJaWYgKElTX0VSUihydC0+cnQ2aV9uZXh0aG9wKSkgeworCQkJZXJyID0gUFRSX0VSUihydC0+cnQ2aV9uZXh0aG9wKTsKKwkJCXJ0LT5ydDZpX25leHRob3AgPSBOVUxMOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlydC0+cnQ2aV9mbGFncyA9IHJ0bXNnLT5ydG1zZ19mbGFnczsKKworaW5zdGFsbF9yb3V0ZToKKwlpZiAocnRhICYmIHJ0YVtSVEFfTUVUUklDUy0xXSkgeworCQlpbnQgYXR0cmxlbiA9IFJUQV9QQVlMT0FEKHJ0YVtSVEFfTUVUUklDUy0xXSk7CisJCXN0cnVjdCBydGF0dHIgKmF0dHIgPSBSVEFfREFUQShydGFbUlRBX01FVFJJQ1MtMV0pOworCisJCXdoaWxlIChSVEFfT0soYXR0ciwgYXR0cmxlbikpIHsKKwkJCXVuc2lnbmVkIGZsYXZvciA9IGF0dHItPnJ0YV90eXBlOworCQkJaWYgKGZsYXZvcikgeworCQkJCWlmIChmbGF2b3IgPiBSVEFYX01BWCkgeworCQkJCQllcnIgPSAtRUlOVkFMOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJcnQtPnUuZHN0Lm1ldHJpY3NbZmxhdm9yLTFdID0KKwkJCQkJKih1MzIgKilSVEFfREFUQShhdHRyKTsKKwkJCX0KKwkJCWF0dHIgPSBSVEFfTkVYVChhdHRyLCBhdHRybGVuKTsKKwkJfQorCX0KKworCWlmIChydC0+dS5kc3QubWV0cmljc1tSVEFYX0hPUExJTUlULTFdID09IDApCisJCXJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfSE9QTElNSVQtMV0gPSAtMTsKKwlpZiAoIXJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfTVRVLTFdKQorCQlydC0+dS5kc3QubWV0cmljc1tSVEFYX01UVS0xXSA9IGlwdjZfZ2V0X210dShkZXYpOworCWlmICghcnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9BRFZNU1MtMV0pCisJCXJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfQURWTVNTLTFdID0gaXB2Nl9hZHZtc3MoZHN0X210dSgmcnQtPnUuZHN0KSk7CisJcnQtPnUuZHN0LmRldiA9IGRldjsKKwlydC0+cnQ2aV9pZGV2ID0gaWRldjsKKwlyZXR1cm4gaXA2X2luc19ydChydCwgbmxoLCBfcnRhdHRyKTsKKworb3V0OgorCWlmIChkZXYpCisJCWRldl9wdXQoZGV2KTsKKwlpZiAoaWRldikKKwkJaW42X2Rldl9wdXQoaWRldik7CisJaWYgKHJ0KQorCQlkc3RfZnJlZSgoc3RydWN0IGRzdF9lbnRyeSAqKSBydCk7CisJcmV0dXJuIGVycjsKK30KKworaW50IGlwNl9kZWxfcnQoc3RydWN0IHJ0Nl9pbmZvICpydCwgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKl9ydGF0dHIpCit7CisJaW50IGVycjsKKworCXdyaXRlX2xvY2tfYmgoJnJ0Nl9sb2NrKTsKKworCXJ0Nl9yZXNldF9kZmx0X3BvaW50ZXIoTlVMTCk7CisKKwllcnIgPSBmaWI2X2RlbChydCwgbmxoLCBfcnRhdHRyKTsKKwlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKworCXdyaXRlX3VubG9ja19iaCgmcnQ2X2xvY2spOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpcDZfcm91dGVfZGVsKHN0cnVjdCBpbjZfcnRtc2cgKnJ0bXNnLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqX3J0YXR0cikKK3sKKwlzdHJ1Y3QgZmliNl9ub2RlICpmbjsKKwlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OworCWludCBlcnIgPSAtRVNSQ0g7CisKKwlyZWFkX2xvY2tfYmgoJnJ0Nl9sb2NrKTsKKworCWZuID0gZmliNl9sb2NhdGUoJmlwNl9yb3V0aW5nX3RhYmxlLAorCQkJICZydG1zZy0+cnRtc2dfZHN0LCBydG1zZy0+cnRtc2dfZHN0X2xlbiwKKwkJCSAmcnRtc2ctPnJ0bXNnX3NyYywgcnRtc2ctPnJ0bXNnX3NyY19sZW4pOworCQorCWlmIChmbikgeworCQlmb3IgKHJ0ID0gZm4tPmxlYWY7IHJ0OyBydCA9IHJ0LT51Lm5leHQpIHsKKwkJCWlmIChydG1zZy0+cnRtc2dfaWZpbmRleCAmJgorCQkJICAgIChydC0+cnQ2aV9kZXYgPT0gTlVMTCB8fAorCQkJICAgICBydC0+cnQ2aV9kZXYtPmlmaW5kZXggIT0gcnRtc2ctPnJ0bXNnX2lmaW5kZXgpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHJ0bXNnLT5ydG1zZ19mbGFncyZSVEZfR0FURVdBWSAmJgorCQkJICAgICFpcHY2X2FkZHJfZXF1YWwoJnJ0bXNnLT5ydG1zZ19nYXRld2F5LCAmcnQtPnJ0NmlfZ2F0ZXdheSkpCisJCQkJY29udGludWU7CisJCQlpZiAocnRtc2ctPnJ0bXNnX21ldHJpYyAmJgorCQkJICAgIHJ0bXNnLT5ydG1zZ19tZXRyaWMgIT0gcnQtPnJ0NmlfbWV0cmljKQorCQkJCWNvbnRpbnVlOworCQkJZHN0X2hvbGQoJnJ0LT51LmRzdCk7CisJCQlyZWFkX3VubG9ja19iaCgmcnQ2X2xvY2spOworCisJCQlyZXR1cm4gaXA2X2RlbF9ydChydCwgbmxoLCBfcnRhdHRyKTsKKwkJfQorCX0KKwlyZWFkX3VubG9ja19iaCgmcnQ2X2xvY2spOworCisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqCUhhbmRsZSByZWRpcmVjdHMKKyAqLwordm9pZCBydDZfcmVkaXJlY3Qoc3RydWN0IGluNl9hZGRyICpkZXN0LCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAorCQkgIHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCB1OCAqbGxhZGRyLCBpbnQgb25fbGluaykKK3sKKwlzdHJ1Y3QgcnQ2X2luZm8gKnJ0LCAqbnJ0OworCisJLyogTG9jYXRlIG9sZCByb3V0ZSB0byB0aGlzIGRlc3RpbmF0aW9uLiAqLworCXJ0ID0gcnQ2X2xvb2t1cChkZXN0LCBOVUxMLCBuZWlnaC0+ZGV2LT5pZmluZGV4LCAxKTsKKworCWlmIChydCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAobmVpZ2gtPmRldiAhPSBydC0+cnQ2aV9kZXYpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBDdXJyZW50IHJvdXRlIGlzIG9uLWxpbms7IHJlZGlyZWN0IGlzIGFsd2F5cyBpbnZhbGlkLgorCSAqIAorCSAqIFNlZW1zLCBwcmV2aW91cyBzdGF0ZW1lbnQgaXMgbm90IHRydWUuIEl0IGNvdWxkCisJICogYmUgbm9kZSwgd2hpY2ggbG9va3MgZm9yIHVzIGFzIG9uLWxpbmsgKGYuZS4gcHJveHkgbmRpc2MpCisJICogQnV0IHRoZW4gcm91dGVyIHNlcnZpbmcgaXQgbWlnaHQgZGVjaWRlLCB0aGF0IHdlIHNob3VsZAorCSAqIGtub3cgdHJ1dGggOCk4KSAtLUFOSyAoOTgwNzI2KS4KKwkgKi8KKwlpZiAoIShydC0+cnQ2aV9mbGFncyZSVEZfR0FURVdBWSkpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKglSRkMgMjQ2MSBzcGVjaWZpZXMgdGhhdCByZWRpcmVjdHMgc2hvdWxkIG9ubHkgYmUKKwkgKglhY2NlcHRlZCBpZiB0aGV5IGNvbWUgZnJvbSB0aGUgbmV4dGhvcCB0byB0aGUgdGFyZ2V0LgorCSAqCUR1ZSB0byB0aGUgd2F5IGRlZmF1bHQgcm91dGVycyBhcmUgY2hvc2VuLCB0aGlzIG5vdGlvbgorCSAqCWlzIGEgYml0IGZ1enp5IGFuZCBvbmUgbWlnaHQgbmVlZCB0byBjaGVjayBhbGwgZGVmYXVsdAorCSAqCXJvdXRlcnMuCisJICovCisJaWYgKCFpcHY2X2FkZHJfZXF1YWwoc2FkZHIsICZydC0+cnQ2aV9nYXRld2F5KSkgeworCQlpZiAocnQtPnJ0NmlfZmxhZ3MgJiBSVEZfREVGQVVMVCkgeworCQkJc3RydWN0IHJ0Nl9pbmZvICpydDE7CisKKwkJCXJlYWRfbG9jaygmcnQ2X2xvY2spOworCQkJZm9yIChydDEgPSBpcDZfcm91dGluZ190YWJsZS5sZWFmOyBydDE7IHJ0MSA9IHJ0MS0+dS5uZXh0KSB7CisJCQkJaWYgKGlwdjZfYWRkcl9lcXVhbChzYWRkciwgJnJ0MS0+cnQ2aV9nYXRld2F5KSkgeworCQkJCQlkc3RfaG9sZCgmcnQxLT51LmRzdCk7CisJCQkJCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCQkJCQlyZWFkX3VubG9jaygmcnQ2X2xvY2spOworCQkJCQlydCA9IHJ0MTsKKwkJCQkJZ290byBzb3VyY2Vfb2s7CisJCQkJfQorCQkJfQorCQkJcmVhZF91bmxvY2soJnJ0Nl9sb2NrKTsKKwkJfQorCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgInJ0Nl9yZWRpcmVjdDogc291cmNlIGlzbid0IGEgdmFsaWQgbmV4dGhvcCAiCisJCQkgICAgICAgImZvciByZWRpcmVjdCB0YXJnZXRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKK3NvdXJjZV9vazoKKworCS8qCisJICoJV2UgaGF2ZSBmaW5hbGx5IGRlY2lkZWQgdG8gYWNjZXB0IGl0LgorCSAqLworCisJbmVpZ2hfdXBkYXRlKG5laWdoLCBsbGFkZHIsIE5VRF9TVEFMRSwgCisJCSAgICAgTkVJR0hfVVBEQVRFX0ZfV0VBS19PVkVSUklERXwKKwkJICAgICBORUlHSF9VUERBVEVfRl9PVkVSUklERXwKKwkJICAgICAob25fbGluayA/IDAgOiAoTkVJR0hfVVBEQVRFX0ZfT1ZFUlJJREVfSVNST1VURVJ8CisJCQkJICAgICBORUlHSF9VUERBVEVfRl9JU1JPVVRFUikpCisJCSAgICAgKTsKKworCS8qCisJICogUmVkaXJlY3QgcmVjZWl2ZWQgLT4gcGF0aCB3YXMgdmFsaWQuCisJICogTG9vaywgcmVkaXJlY3RzIGFyZSBzZW50IG9ubHkgaW4gcmVzcG9uc2UgdG8gZGF0YSBwYWNrZXRzLAorCSAqIHNvIHRoYXQgdGhpcyBuZXh0aG9wIGFwcGFyZW50bHkgaXMgcmVhY2hhYmxlLiAtLUFOSworCSAqLworCWRzdF9jb25maXJtKCZydC0+dS5kc3QpOworCisJLyogRHVwbGljYXRlIHJlZGlyZWN0OiBzaWxlbnRseSBpZ25vcmUuICovCisJaWYgKG5laWdoID09IHJ0LT51LmRzdC5uZWlnaGJvdXIpCisJCWdvdG8gb3V0OworCisJbnJ0ID0gaXA2X3J0X2NvcHkocnQpOworCWlmIChucnQgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlucnQtPnJ0NmlfZmxhZ3MgPSBSVEZfR0FURVdBWXxSVEZfVVB8UlRGX0RZTkFNSUN8UlRGX0NBQ0hFOworCWlmIChvbl9saW5rKQorCQlucnQtPnJ0NmlfZmxhZ3MgJj0gflJURl9HQVRFV0FZOworCisJaXB2Nl9hZGRyX2NvcHkoJm5ydC0+cnQ2aV9kc3QuYWRkciwgZGVzdCk7CisJbnJ0LT5ydDZpX2RzdC5wbGVuID0gMTI4OworCW5ydC0+dS5kc3QuZmxhZ3MgfD0gRFNUX0hPU1Q7CisKKwlpcHY2X2FkZHJfY29weSgmbnJ0LT5ydDZpX2dhdGV3YXksIChzdHJ1Y3QgaW42X2FkZHIqKW5laWdoLT5wcmltYXJ5X2tleSk7CisJbnJ0LT5ydDZpX25leHRob3AgPSBuZWlnaF9jbG9uZShuZWlnaCk7CisJLyogUmVzZXQgcG10dSwgaXQgbWF5IGJlIGJldHRlciAqLworCW5ydC0+dS5kc3QubWV0cmljc1tSVEFYX01UVS0xXSA9IGlwdjZfZ2V0X210dShuZWlnaC0+ZGV2KTsKKwlucnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9BRFZNU1MtMV0gPSBpcHY2X2Fkdm1zcyhkc3RfbXR1KCZucnQtPnUuZHN0KSk7CisKKwlpZiAoaXA2X2luc19ydChucnQsIE5VTEwsIE5VTEwpKQorCQlnb3RvIG91dDsKKworCWlmIChydC0+cnQ2aV9mbGFncyZSVEZfQ0FDSEUpIHsKKwkJaXA2X2RlbF9ydChydCwgTlVMTCwgTlVMTCk7CisJCXJldHVybjsKKwl9CisKK291dDoKKyAgICAgICAgZHN0X3JlbGVhc2UoJnJ0LT51LmRzdCk7CisJcmV0dXJuOworfQorCisvKgorICoJSGFuZGxlIElDTVAgInBhY2tldCB0b28gYmlnIiBtZXNzYWdlcworICoJaS5lLiBQYXRoIE1UVSBkaXNjb3ZlcnkKKyAqLworCit2b2lkIHJ0Nl9wbXR1X2Rpc2NvdmVyeShzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAorCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHBtdHUpCit7CisJc3RydWN0IHJ0Nl9pbmZvICpydCwgKm5ydDsKKwlpbnQgYWxsZnJhZyA9IDA7CisKKwlydCA9IHJ0Nl9sb29rdXAoZGFkZHIsIHNhZGRyLCBkZXYtPmlmaW5kZXgsIDApOworCWlmIChydCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAocG10dSA+PSBkc3RfbXR1KCZydC0+dS5kc3QpKQorCQlnb3RvIG91dDsKKworCWlmIChwbXR1IDwgSVBWNl9NSU5fTVRVKSB7CisJCS8qCisJCSAqIEFjY29yZGluZyB0byBSRkMyNDYwLCBQTVRVIGlzIHNldCB0byB0aGUgSVB2NiBNaW5pbXVtIExpbmsgCisJCSAqIE1UVSAoMTI4MCkgYW5kIGEgZnJhZ21lbnQgaGVhZGVyIHNob3VsZCBhbHdheXMgYmUgaW5jbHVkZWQKKwkJICogYWZ0ZXIgYSBub2RlIHJlY2VpdmluZyBUb28gQmlnIG1lc3NhZ2UgcmVwb3J0aW5nIFBNVFUgaXMKKwkJICogbGVzcyB0aGFuIHRoZSBJUHY2IE1pbmltdW0gTGluayBNVFUuCisJCSAqLworCQlwbXR1ID0gSVBWNl9NSU5fTVRVOworCQlhbGxmcmFnID0gMTsKKwl9CisKKwkvKiBOZXcgbXR1IHJlY2VpdmVkIC0+IHBhdGggd2FzIHZhbGlkLgorCSAgIFRoZXkgYXJlIHNlbnQgb25seSBpbiByZXNwb25zZSB0byBkYXRhIHBhY2tldHMsCisJICAgc28gdGhhdCB0aGlzIG5leHRob3AgYXBwYXJlbnRseSBpcyByZWFjaGFibGUuIC0tQU5LCisJICovCisJZHN0X2NvbmZpcm0oJnJ0LT51LmRzdCk7CisKKwkvKiBIb3N0IHJvdXRlLiBJZiBpdCBpcyBzdGF0aWMsIGl0IHdvdWxkIGJlIGJldHRlcgorCSAgIG5vdCB0byBvdmVycmlkZSBpdCwgYnV0IGFkZCBuZXcgb25lLCBzbyB0aGF0CisJICAgd2hlbiBjYWNoZSBlbnRyeSB3aWxsIGV4cGlyZSBvbGQgcG10dQorCSAgIHdvdWxkIHJldHVybiBhdXRvbWF0aWNhbGx5LgorCSAqLworCWlmIChydC0+cnQ2aV9mbGFncyAmIFJURl9DQUNIRSkgeworCQlydC0+dS5kc3QubWV0cmljc1tSVEFYX01UVS0xXSA9IHBtdHU7CisJCWlmIChhbGxmcmFnKQorCQkJcnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9GRUFUVVJFUy0xXSB8PSBSVEFYX0ZFQVRVUkVfQUxMRlJBRzsKKwkJZHN0X3NldF9leHBpcmVzKCZydC0+dS5kc3QsIGlwNl9ydF9tdHVfZXhwaXJlcyk7CisJCXJ0LT5ydDZpX2ZsYWdzIHw9IFJURl9NT0RJRklFRHxSVEZfRVhQSVJFUzsKKwkJZ290byBvdXQ7CisJfQorCisJLyogTmV0d29yayByb3V0ZS4KKwkgICBUd28gY2FzZXMgYXJlIHBvc3NpYmxlOgorCSAgIDEuIEl0IGlzIGNvbm5lY3RlZCByb3V0ZS4gQWN0aW9uOiBDT1cKKwkgICAyLiBJdCBpcyBnYXRld2F5ZWQgcm91dGUgb3IgTk9ORVhUSE9QIHJvdXRlLiBBY3Rpb246IGNsb25lIGl0LgorCSAqLworCWlmICghcnQtPnJ0NmlfbmV4dGhvcCAmJiAhKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX05PTkVYVEhPUCkpIHsKKwkJbnJ0ID0gcnQ2X2NvdyhydCwgZGFkZHIsIHNhZGRyKTsKKwkJaWYgKCFucnQtPnUuZHN0LmVycm9yKSB7CisJCQlucnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9NVFUtMV0gPSBwbXR1OworCQkJaWYgKGFsbGZyYWcpCisJCQkJbnJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfRkVBVFVSRVMtMV0gfD0gUlRBWF9GRUFUVVJFX0FMTEZSQUc7CisJCQkvKiBBY2NvcmRpbmcgdG8gUkZDIDE5ODEsIGRldGVjdGluZyBQTVRVIGluY3JlYXNlIHNob3VsZG4ndCBiZQorCQkJICAgaGFwcGVuZWQgd2l0aGluIDUgbWlucywgdGhlIHJlY29tbWVuZGVkIHRpbWVyIGlzIDEwIG1pbnMuCisJCQkgICBIZXJlIHRoaXMgcm91dGUgZXhwaXJhdGlvbiB0aW1lIGlzIHNldCB0byBpcDZfcnRfbXR1X2V4cGlyZXMKKwkJCSAgIHdoaWNoIGlzIDEwIG1pbnMuIEFmdGVyIDEwIG1pbnMgdGhlIGRlY3JlYXNlZCBwbXR1IGlzIGV4cGlyZWQKKwkJCSAgIGFuZCBkZXRlY3RpbmcgUE1UVSBpbmNyZWFzZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaGFwcGVuZWQuCisJCQkgKi8KKwkJCWRzdF9zZXRfZXhwaXJlcygmbnJ0LT51LmRzdCwgaXA2X3J0X210dV9leHBpcmVzKTsKKwkJCW5ydC0+cnQ2aV9mbGFncyB8PSBSVEZfRFlOQU1JQ3xSVEZfRVhQSVJFUzsKKwkJfQorCQlkc3RfcmVsZWFzZSgmbnJ0LT51LmRzdCk7CisJfSBlbHNlIHsKKwkJbnJ0ID0gaXA2X3J0X2NvcHkocnQpOworCQlpZiAobnJ0ID09IE5VTEwpCisJCQlnb3RvIG91dDsKKwkJaXB2Nl9hZGRyX2NvcHkoJm5ydC0+cnQ2aV9kc3QuYWRkciwgZGFkZHIpOworCQlucnQtPnJ0NmlfZHN0LnBsZW4gPSAxMjg7CisJCW5ydC0+dS5kc3QuZmxhZ3MgfD0gRFNUX0hPU1Q7CisJCW5ydC0+cnQ2aV9uZXh0aG9wID0gbmVpZ2hfY2xvbmUocnQtPnJ0NmlfbmV4dGhvcCk7CisJCWRzdF9zZXRfZXhwaXJlcygmbnJ0LT51LmRzdCwgaXA2X3J0X210dV9leHBpcmVzKTsKKwkJbnJ0LT5ydDZpX2ZsYWdzIHw9IFJURl9EWU5BTUlDfFJURl9DQUNIRXxSVEZfRVhQSVJFUzsKKwkJbnJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfTVRVLTFdID0gcG10dTsKKwkJaWYgKGFsbGZyYWcpCisJCQlucnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9GRUFUVVJFUy0xXSB8PSBSVEFYX0ZFQVRVUkVfQUxMRlJBRzsKKwkJaXA2X2luc19ydChucnQsIE5VTEwsIE5VTEwpOworCX0KKworb3V0OgorCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworfQorCisvKgorICoJTWlzYyBzdXBwb3J0IGZ1bmN0aW9ucworICovCisKK3N0YXRpYyBzdHJ1Y3QgcnQ2X2luZm8gKiBpcDZfcnRfY29weShzdHJ1Y3QgcnQ2X2luZm8gKm9ydCkKK3sKKwlzdHJ1Y3QgcnQ2X2luZm8gKnJ0ID0gaXA2X2RzdF9hbGxvYygpOworCisJaWYgKHJ0KSB7CisJCXJ0LT51LmRzdC5pbnB1dCA9IG9ydC0+dS5kc3QuaW5wdXQ7CisJCXJ0LT51LmRzdC5vdXRwdXQgPSBvcnQtPnUuZHN0Lm91dHB1dDsKKworCQltZW1jcHkocnQtPnUuZHN0Lm1ldHJpY3MsIG9ydC0+dS5kc3QubWV0cmljcywgUlRBWF9NQVgqc2l6ZW9mKHUzMikpOworCQlydC0+dS5kc3QuZGV2ID0gb3J0LT51LmRzdC5kZXY7CisJCWlmIChydC0+dS5kc3QuZGV2KQorCQkJZGV2X2hvbGQocnQtPnUuZHN0LmRldik7CisJCXJ0LT5ydDZpX2lkZXYgPSBvcnQtPnJ0NmlfaWRldjsKKwkJaWYgKHJ0LT5ydDZpX2lkZXYpCisJCQlpbjZfZGV2X2hvbGQocnQtPnJ0NmlfaWRldik7CisJCXJ0LT51LmRzdC5sYXN0dXNlID0gamlmZmllczsKKwkJcnQtPnJ0NmlfZXhwaXJlcyA9IDA7CisKKwkJaXB2Nl9hZGRyX2NvcHkoJnJ0LT5ydDZpX2dhdGV3YXksICZvcnQtPnJ0NmlfZ2F0ZXdheSk7CisJCXJ0LT5ydDZpX2ZsYWdzID0gb3J0LT5ydDZpX2ZsYWdzICYgflJURl9FWFBJUkVTOworCQlydC0+cnQ2aV9tZXRyaWMgPSAwOworCisJCW1lbWNweSgmcnQtPnJ0NmlfZHN0LCAmb3J0LT5ydDZpX2RzdCwgc2l6ZW9mKHN0cnVjdCBydDZrZXkpKTsKKyNpZmRlZiBDT05GSUdfSVBWNl9TVUJUUkVFUworCQltZW1jcHkoJnJ0LT5ydDZpX3NyYywgJm9ydC0+cnQ2aV9zcmMsIHNpemVvZihzdHJ1Y3QgcnQ2a2V5KSk7CisjZW5kaWYKKwl9CisJcmV0dXJuIHJ0OworfQorCitzdHJ1Y3QgcnQ2X2luZm8gKnJ0Nl9nZXRfZGZsdF9yb3V0ZXIoc3RydWN0IGluNl9hZGRyICphZGRyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorewkKKwlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OworCXN0cnVjdCBmaWI2X25vZGUgKmZuOworCisJZm4gPSAmaXA2X3JvdXRpbmdfdGFibGU7CisKKwl3cml0ZV9sb2NrX2JoKCZydDZfbG9jayk7CisJZm9yIChydCA9IGZuLT5sZWFmOyBydDsgcnQ9cnQtPnUubmV4dCkgeworCQlpZiAoZGV2ID09IHJ0LT5ydDZpX2RldiAmJgorCQkgICAgaXB2Nl9hZGRyX2VxdWFsKCZydC0+cnQ2aV9nYXRld2F5LCBhZGRyKSkKKwkJCWJyZWFrOworCX0KKwlpZiAocnQpCisJCWRzdF9ob2xkKCZydC0+dS5kc3QpOworCXdyaXRlX3VubG9ja19iaCgmcnQ2X2xvY2spOworCXJldHVybiBydDsKK30KKworc3RydWN0IHJ0Nl9pbmZvICpydDZfYWRkX2RmbHRfcm91dGVyKHN0cnVjdCBpbjZfYWRkciAqZ3dhZGRyLAorCQkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW42X3J0bXNnIHJ0bXNnOworCisJbWVtc2V0KCZydG1zZywgMCwgc2l6ZW9mKHN0cnVjdCBpbjZfcnRtc2cpKTsKKwlydG1zZy5ydG1zZ190eXBlID0gUlRNU0dfTkVXUk9VVEU7CisJaXB2Nl9hZGRyX2NvcHkoJnJ0bXNnLnJ0bXNnX2dhdGV3YXksIGd3YWRkcik7CisJcnRtc2cucnRtc2dfbWV0cmljID0gMTAyNDsKKwlydG1zZy5ydG1zZ19mbGFncyA9IFJURl9HQVRFV0FZIHwgUlRGX0FERFJDT05GIHwgUlRGX0RFRkFVTFQgfCBSVEZfVVAgfCBSVEZfRVhQSVJFUzsKKworCXJ0bXNnLnJ0bXNnX2lmaW5kZXggPSBkZXYtPmlmaW5kZXg7CisKKwlpcDZfcm91dGVfYWRkKCZydG1zZywgTlVMTCwgTlVMTCk7CisJcmV0dXJuIHJ0Nl9nZXRfZGZsdF9yb3V0ZXIoZ3dhZGRyLCBkZXYpOworfQorCit2b2lkIHJ0Nl9wdXJnZV9kZmx0X3JvdXRlcnModm9pZCkKK3sKKwlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OworCityZXN0YXJ0OgorCXJlYWRfbG9ja19iaCgmcnQ2X2xvY2spOworCWZvciAocnQgPSBpcDZfcm91dGluZ190YWJsZS5sZWFmOyBydDsgcnQgPSBydC0+dS5uZXh0KSB7CisJCWlmIChydC0+cnQ2aV9mbGFncyAmIChSVEZfREVGQVVMVCB8IFJURl9BRERSQ09ORikpIHsKKwkJCWRzdF9ob2xkKCZydC0+dS5kc3QpOworCisJCQlydDZfcmVzZXRfZGZsdF9wb2ludGVyKE5VTEwpOworCisJCQlyZWFkX3VubG9ja19iaCgmcnQ2X2xvY2spOworCisJCQlpcDZfZGVsX3J0KHJ0LCBOVUxMLCBOVUxMKTsKKworCQkJZ290byByZXN0YXJ0OworCQl9CisJfQorCXJlYWRfdW5sb2NrX2JoKCZydDZfbG9jayk7Cit9CisKK2ludCBpcHY2X3JvdXRlX2lvY3RsKHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGluNl9ydG1zZyBydG1zZzsKKwlpbnQgZXJyOworCisJc3dpdGNoKGNtZCkgeworCWNhc2UgU0lPQ0FERFJUOgkJLyogQWRkIGEgcm91dGUgKi8KKwljYXNlIFNJT0NERUxSVDoJCS8qIERlbGV0ZSBhIHJvdXRlICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWVyciA9IGNvcHlfZnJvbV91c2VyKCZydG1zZywgYXJnLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfcnRtc2cpKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiAtRUZBVUxUOworCQkJCisJCXJ0bmxfbG9jaygpOworCQlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFNJT0NBRERSVDoKKwkJCWVyciA9IGlwNl9yb3V0ZV9hZGQoJnJ0bXNnLCBOVUxMLCBOVUxMKTsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NERUxSVDoKKwkJCWVyciA9IGlwNl9yb3V0ZV9kZWwoJnJ0bXNnLCBOVUxMLCBOVUxMKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyID0gLUVJTlZBTDsKKwkJfQorCQlydG5sX3VubG9jaygpOworCisJCXJldHVybiBlcnI7CisJfTsKKworCXJldHVybiAtRUlOVkFMOworfQorCisvKgorICoJRHJvcCB0aGUgcGFja2V0IG9uIHRoZSBmbG9vcgorICovCisKK2ludCBpcDZfcGt0X2Rpc2NhcmQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVE5PUk9VVEVTKTsKKwlpY21wdjZfc2VuZChza2IsIElDTVBWNl9ERVNUX1VOUkVBQ0gsIElDTVBWNl9OT1JPVVRFLCAwLCBza2ItPmRldik7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBpcDZfcGt0X2Rpc2NhcmRfb3V0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc2tiLT5kZXYgPSBza2ItPmRzdC0+ZGV2OworCXJldHVybiBpcDZfcGt0X2Rpc2NhcmQoc2tiKTsKK30KKworLyoKKyAqCUFsbG9jYXRlIGEgZHN0IGZvciBsb2NhbCAodW5pY2FzdCAvIGFueWNhc3QpIGFkZHJlc3MuCisgKi8KKworc3RydWN0IHJ0Nl9pbmZvICphZGRyY29uZl9kc3RfYWxsb2Moc3RydWN0IGluZXQ2X2RldiAqaWRldiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyLAorCQkJCSAgICBpbnQgYW55Y2FzdCkKK3sKKwlzdHJ1Y3QgcnQ2X2luZm8gKnJ0ID0gaXA2X2RzdF9hbGxvYygpOworCisJaWYgKHJ0ID09IE5VTEwpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZGV2X2hvbGQoJmxvb3BiYWNrX2Rldik7CisJaW42X2Rldl9ob2xkKGlkZXYpOworCisJcnQtPnUuZHN0LmZsYWdzID0gRFNUX0hPU1Q7CisJcnQtPnUuZHN0LmlucHV0ID0gaXA2X2lucHV0OworCXJ0LT51LmRzdC5vdXRwdXQgPSBpcDZfb3V0cHV0OworCXJ0LT5ydDZpX2RldiA9ICZsb29wYmFja19kZXY7CisJcnQtPnJ0NmlfaWRldiA9IGlkZXY7CisJcnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9NVFUtMV0gPSBpcHY2X2dldF9tdHUocnQtPnJ0NmlfZGV2KTsKKwlydC0+dS5kc3QubWV0cmljc1tSVEFYX0FEVk1TUy0xXSA9IGlwdjZfYWR2bXNzKGRzdF9tdHUoJnJ0LT51LmRzdCkpOworCXJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfSE9QTElNSVQtMV0gPSAtMTsKKwlydC0+dS5kc3Qub2Jzb2xldGUgPSAtMTsKKworCXJ0LT5ydDZpX2ZsYWdzID0gUlRGX1VQIHwgUlRGX05PTkVYVEhPUDsKKwlpZiAoIWFueWNhc3QpCisJCXJ0LT5ydDZpX2ZsYWdzIHw9IFJURl9MT0NBTDsKKwlydC0+cnQ2aV9uZXh0aG9wID0gbmRpc2NfZ2V0X25laWdoKHJ0LT5ydDZpX2RldiwgJnJ0LT5ydDZpX2dhdGV3YXkpOworCWlmIChydC0+cnQ2aV9uZXh0aG9wID09IE5VTEwpIHsKKwkJZHN0X2ZyZWUoKHN0cnVjdCBkc3RfZW50cnkgKikgcnQpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlpcHY2X2FkZHJfY29weSgmcnQtPnJ0NmlfZHN0LmFkZHIsIGFkZHIpOworCXJ0LT5ydDZpX2RzdC5wbGVuID0gMTI4OworCisJYXRvbWljX3NldCgmcnQtPnUuZHN0Ll9fcmVmY250LCAxKTsKKworCXJldHVybiBydDsKK30KKworc3RhdGljIGludCBmaWI2X2lmZG93bihzdHJ1Y3QgcnQ2X2luZm8gKnJ0LCB2b2lkICphcmcpCit7CisJaWYgKCgodm9pZCopcnQtPnJ0NmlfZGV2ID09IGFyZyB8fCBhcmcgPT0gTlVMTCkgJiYKKwkgICAgcnQgIT0gJmlwNl9udWxsX2VudHJ5KSB7CisJCVJUNl9UUkFDRSgiZGVsZXRlZCBieSBpZmRvd24gJXBcbiIsIHJ0KTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBydDZfaWZkb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd3JpdGVfbG9ja19iaCgmcnQ2X2xvY2spOworCWZpYjZfY2xlYW5fdHJlZSgmaXA2X3JvdXRpbmdfdGFibGUsIGZpYjZfaWZkb3duLCAwLCBkZXYpOworCXdyaXRlX3VubG9ja19iaCgmcnQ2X2xvY2spOworfQorCitzdHJ1Y3QgcnQ2X210dV9jaGFuZ2VfYXJnCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBtdHU7Cit9OworCitzdGF0aWMgaW50IHJ0Nl9tdHVfY2hhbmdlX3JvdXRlKHN0cnVjdCBydDZfaW5mbyAqcnQsIHZvaWQgKnBfYXJnKQoreworCXN0cnVjdCBydDZfbXR1X2NoYW5nZV9hcmcgKmFyZyA9IChzdHJ1Y3QgcnQ2X210dV9jaGFuZ2VfYXJnICopIHBfYXJnOworCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CisKKwkvKiBJbiBJUHY2IHBtdHUgZGlzY292ZXJ5IGlzIG5vdCBvcHRpb25hbCwKKwkgICBzbyB0aGF0IFJUQVhfTVRVIGxvY2sgY2Fubm90IGRpc2FibGUgaXQuCisJICAgV2Ugc3RpbGwgdXNlIHRoaXMgbG9jayB0byBibG9jayBjaGFuZ2VzCisJICAgY2F1c2VkIGJ5IGFkZHJjb25mL25kaXNjLgorCSovCisKKwlpZGV2ID0gX19pbjZfZGV2X2dldChhcmctPmRldik7CisJaWYgKGlkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwkvKiBGb3IgYWRtaW5pc3RyYXRpdmUgTVRVIGluY3JlYXNlLCB0aGVyZSBpcyBubyB3YXkgdG8gZGlzY292ZXIKKwkgICBJUHY2IFBNVFUgaW5jcmVhc2UsIHNvIFBNVFUgaW5jcmVhc2Ugc2hvdWxkIGJlIHVwZGF0ZWQgaGVyZS4KKwkgICBTaW5jZSBSRkMgMTk4MSBkb2Vzbid0IGluY2x1ZGUgYWRtaW5pc3RyYXRpdmUgTVRVIGluY3JlYXNlCisJICAgdXBkYXRlIFBNVFUgaW5jcmVhc2UgaXMgYSBNVVNULiAoaS5lLiBqdW1ibyBmcmFtZSkKKwkgKi8KKwkvKgorCSAgIElmIG5ldyBNVFUgaXMgbGVzcyB0aGFuIHJvdXRlIFBNVFUsIHRoaXMgbmV3IE1UVSB3aWxsIGJlIHRoZQorCSAgIGxvd2VzdCBNVFUgaW4gdGhlIHBhdGgsIHVwZGF0ZSB0aGUgcm91dGUgUE1UVSB0byByZWZsZWN0IFBNVFUKKwkgICBkZWNyZWFzZXM7IGlmIG5ldyBNVFUgaXMgZ3JlYXRlciB0aGFuIHJvdXRlIFBNVFUsIGFuZCB0aGUKKwkgICBvbGQgTVRVIGlzIHRoZSBsb3dlc3QgTVRVIGluIHRoZSBwYXRoLCB1cGRhdGUgdGhlIHJvdXRlIFBNVFUKKwkgICB0byByZWZsZWN0IHRoZSBpbmNyZWFzZS4gSW4gdGhpcyBjYXNlIGlmIHRoZSBvdGhlciBub2RlcycgTVRVCisJICAgYWxzbyBoYXZlIHRoZSBsb3dlc3QgTVRVLCBUT08gQklHIE1FU1NBR0Ugd2lsbCBiZSBsZWFkIHRvCisJICAgUE1UVSBkaXNjb3V2ZXJ5LgorCSAqLworCWlmIChydC0+cnQ2aV9kZXYgPT0gYXJnLT5kZXYgJiYKKwkgICAgIWRzdF9tZXRyaWNfbG9ja2VkKCZydC0+dS5kc3QsIFJUQVhfTVRVKSAmJgorICAgICAgICAgICAgKGRzdF9tdHUoJnJ0LT51LmRzdCkgPiBhcmctPm10dSB8fAorICAgICAgICAgICAgIChkc3RfbXR1KCZydC0+dS5kc3QpIDwgYXJnLT5tdHUgJiYKKwkgICAgICBkc3RfbXR1KCZydC0+dS5kc3QpID09IGlkZXYtPmNuZi5tdHU2KSkpCisJCXJ0LT51LmRzdC5tZXRyaWNzW1JUQVhfTVRVLTFdID0gYXJnLT5tdHU7CisJcnQtPnUuZHN0Lm1ldHJpY3NbUlRBWF9BRFZNU1MtMV0gPSBpcHY2X2Fkdm1zcyhhcmctPm10dSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcnQ2X210dV9jaGFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgbXR1KQoreworCXN0cnVjdCBydDZfbXR1X2NoYW5nZV9hcmcgYXJnOworCisJYXJnLmRldiA9IGRldjsKKwlhcmcubXR1ID0gbXR1OworCXJlYWRfbG9ja19iaCgmcnQ2X2xvY2spOworCWZpYjZfY2xlYW5fdHJlZSgmaXA2X3JvdXRpbmdfdGFibGUsIHJ0Nl9tdHVfY2hhbmdlX3JvdXRlLCAwLCAmYXJnKTsKKwlyZWFkX3VubG9ja19iaCgmcnQ2X2xvY2spOworfQorCitzdGF0aWMgaW50IGluZXQ2X3J0bV90b19ydG1zZyhzdHJ1Y3QgcnRtc2cgKnIsIHN0cnVjdCBydGF0dHIgKipydGEsCisJCQkgICAgICBzdHJ1Y3QgaW42X3J0bXNnICpydG1zZykKK3sKKwltZW1zZXQocnRtc2csIDAsIHNpemVvZigqcnRtc2cpKTsKKworCXJ0bXNnLT5ydG1zZ19kc3RfbGVuID0gci0+cnRtX2RzdF9sZW47CisJcnRtc2ctPnJ0bXNnX3NyY19sZW4gPSByLT5ydG1fc3JjX2xlbjsKKwlydG1zZy0+cnRtc2dfZmxhZ3MgPSBSVEZfVVA7CisJaWYgKHItPnJ0bV90eXBlID09IFJUTl9VTlJFQUNIQUJMRSkKKwkJcnRtc2ctPnJ0bXNnX2ZsYWdzIHw9IFJURl9SRUpFQ1Q7CisKKwlpZiAocnRhW1JUQV9HQVRFV0FZLTFdKSB7CisJCWlmIChydGFbUlRBX0dBVEVXQVktMV0tPnJ0YV9sZW4gIT0gUlRBX0xFTkdUSCgxNikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbWVtY3B5KCZydG1zZy0+cnRtc2dfZ2F0ZXdheSwgUlRBX0RBVEEocnRhW1JUQV9HQVRFV0FZLTFdKSwgMTYpOworCQlydG1zZy0+cnRtc2dfZmxhZ3MgfD0gUlRGX0dBVEVXQVk7CisJfQorCWlmIChydGFbUlRBX0RTVC0xXSkgeworCQlpZiAoUlRBX1BBWUxPQUQocnRhW1JUQV9EU1QtMV0pIDwgKChyLT5ydG1fZHN0X2xlbis3KT4+MykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbWVtY3B5KCZydG1zZy0+cnRtc2dfZHN0LCBSVEFfREFUQShydGFbUlRBX0RTVC0xXSksICgoci0+cnRtX2RzdF9sZW4rNyk+PjMpKTsKKwl9CisJaWYgKHJ0YVtSVEFfU1JDLTFdKSB7CisJCWlmIChSVEFfUEFZTE9BRChydGFbUlRBX1NSQy0xXSkgPCAoKHItPnJ0bV9zcmNfbGVuKzcpPj4zKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQltZW1jcHkoJnJ0bXNnLT5ydG1zZ19zcmMsIFJUQV9EQVRBKHJ0YVtSVEFfU1JDLTFdKSwgKChyLT5ydG1fc3JjX2xlbis3KT4+MykpOworCX0KKwlpZiAocnRhW1JUQV9PSUYtMV0pIHsKKwkJaWYgKHJ0YVtSVEFfT0lGLTFdLT5ydGFfbGVuICE9IFJUQV9MRU5HVEgoc2l6ZW9mKGludCkpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW1lbWNweSgmcnRtc2ctPnJ0bXNnX2lmaW5kZXgsIFJUQV9EQVRBKHJ0YVtSVEFfT0lGLTFdKSwgc2l6ZW9mKGludCkpOworCX0KKwlpZiAocnRhW1JUQV9QUklPUklUWS0xXSkgeworCQlpZiAocnRhW1JUQV9QUklPUklUWS0xXS0+cnRhX2xlbiAhPSBSVEFfTEVOR1RIKDQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW1lbWNweSgmcnRtc2ctPnJ0bXNnX21ldHJpYywgUlRBX0RBVEEocnRhW1JUQV9QUklPUklUWS0xXSksIDQpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGluZXQ2X3J0bV9kZWxyb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIqIG5saCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBydG1zZyAqciA9IE5MTVNHX0RBVEEobmxoKTsKKwlzdHJ1Y3QgaW42X3J0bXNnIHJ0bXNnOworCisJaWYgKGluZXQ2X3J0bV90b19ydG1zZyhyLCBhcmcsICZydG1zZykpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBpcDZfcm91dGVfZGVsKCZydG1zZywgbmxoLCBhcmcpOworfQorCitpbnQgaW5ldDZfcnRtX25ld3JvdXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciogbmxoLCB2b2lkICphcmcpCit7CisJc3RydWN0IHJ0bXNnICpyID0gTkxNU0dfREFUQShubGgpOworCXN0cnVjdCBpbjZfcnRtc2cgcnRtc2c7CisKKwlpZiAoaW5ldDZfcnRtX3RvX3J0bXNnKHIsIGFyZywgJnJ0bXNnKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGlwNl9yb3V0ZV9hZGQoJnJ0bXNnLCBubGgsIGFyZyk7Cit9CisKK3N0cnVjdCBydDZfcnRubF9kdW1wX2FyZworeworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiOworfTsKKworc3RhdGljIGludCBydDZfZmlsbF9ub2RlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBydDZfaW5mbyAqcnQsCisJCQkgc3RydWN0IGluNl9hZGRyICpkc3QsCisJCQkgc3RydWN0IGluNl9hZGRyICpzcmMsCisJCQkgaW50IGlpZiwKKwkJCSBpbnQgdHlwZSwgdTMyIHBpZCwgdTMyIHNlcSwKKwkJCSBzdHJ1Y3Qgbmxtc2doZHIgKmluX25saCwgaW50IHByZWZpeCkKK3sKKwlzdHJ1Y3QgcnRtc2cgKnJ0bTsKKwlzdHJ1Y3Qgbmxtc2doZHIgICpubGg7CisJdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJc3RydWN0IHJ0YV9jYWNoZWluZm8gY2k7CisKKwlpZiAocHJlZml4KSB7CS8qIHVzZXIgd2FudHMgcHJlZml4IHJvdXRlcyBvbmx5ICovCisJCWlmICghKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX1BSRUZJWF9SVCkpIHsKKwkJCS8qIHN1Y2Nlc3Mgc2luY2UgdGhpcyBpcyBub3QgYSBwcmVmaXggcm91dGUgKi8KKwkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKCFwaWQgJiYgaW5fbmxoKSB7CisJCXBpZCA9IGluX25saC0+bmxtc2dfcGlkOworCX0KKworCW5saCA9IE5MTVNHX1BVVChza2IsIHBpZCwgc2VxLCB0eXBlLCBzaXplb2YoKnJ0bSkpOworCXJ0bSA9IE5MTVNHX0RBVEEobmxoKTsKKwlydG0tPnJ0bV9mYW1pbHkgPSBBRl9JTkVUNjsKKwlydG0tPnJ0bV9kc3RfbGVuID0gcnQtPnJ0NmlfZHN0LnBsZW47CisJcnRtLT5ydG1fc3JjX2xlbiA9IHJ0LT5ydDZpX3NyYy5wbGVuOworCXJ0bS0+cnRtX3RvcyA9IDA7CisJcnRtLT5ydG1fdGFibGUgPSBSVF9UQUJMRV9NQUlOOworCWlmIChydC0+cnQ2aV9mbGFncyZSVEZfUkVKRUNUKQorCQlydG0tPnJ0bV90eXBlID0gUlROX1VOUkVBQ0hBQkxFOworCWVsc2UgaWYgKHJ0LT5ydDZpX2RldiAmJiAocnQtPnJ0NmlfZGV2LT5mbGFncyZJRkZfTE9PUEJBQ0spKQorCQlydG0tPnJ0bV90eXBlID0gUlROX0xPQ0FMOworCWVsc2UKKwkJcnRtLT5ydG1fdHlwZSA9IFJUTl9VTklDQVNUOworCXJ0bS0+cnRtX2ZsYWdzID0gMDsKKwlydG0tPnJ0bV9zY29wZSA9IFJUX1NDT1BFX1VOSVZFUlNFOworCXJ0bS0+cnRtX3Byb3RvY29sID0gcnQtPnJ0NmlfcHJvdG9jb2w7CisJaWYgKHJ0LT5ydDZpX2ZsYWdzJlJURl9EWU5BTUlDKQorCQlydG0tPnJ0bV9wcm90b2NvbCA9IFJUUFJPVF9SRURJUkVDVDsKKwllbHNlIGlmIChydC0+cnQ2aV9mbGFncyAmIFJURl9BRERSQ09ORikKKwkJcnRtLT5ydG1fcHJvdG9jb2wgPSBSVFBST1RfS0VSTkVMOworCWVsc2UgaWYgKHJ0LT5ydDZpX2ZsYWdzJlJURl9ERUZBVUxUKQorCQlydG0tPnJ0bV9wcm90b2NvbCA9IFJUUFJPVF9SQTsKKworCWlmIChydC0+cnQ2aV9mbGFncyZSVEZfQ0FDSEUpCisJCXJ0bS0+cnRtX2ZsYWdzIHw9IFJUTV9GX0NMT05FRDsKKworCWlmIChkc3QpIHsKKwkJUlRBX1BVVChza2IsIFJUQV9EU1QsIDE2LCBkc3QpOworCSAgICAgICAgcnRtLT5ydG1fZHN0X2xlbiA9IDEyODsKKwl9IGVsc2UgaWYgKHJ0bS0+cnRtX2RzdF9sZW4pCisJCVJUQV9QVVQoc2tiLCBSVEFfRFNULCAxNiwgJnJ0LT5ydDZpX2RzdC5hZGRyKTsKKyNpZmRlZiBDT05GSUdfSVBWNl9TVUJUUkVFUworCWlmIChzcmMpIHsKKwkJUlRBX1BVVChza2IsIFJUQV9TUkMsIDE2LCBzcmMpOworCSAgICAgICAgcnRtLT5ydG1fc3JjX2xlbiA9IDEyODsKKwl9IGVsc2UgaWYgKHJ0bS0+cnRtX3NyY19sZW4pCisJCVJUQV9QVVQoc2tiLCBSVEFfU1JDLCAxNiwgJnJ0LT5ydDZpX3NyYy5hZGRyKTsKKyNlbmRpZgorCWlmIChpaWYpCisJCVJUQV9QVVQoc2tiLCBSVEFfSUlGLCA0LCAmaWlmKTsKKwllbHNlIGlmIChkc3QpIHsKKwkJc3RydWN0IGluNl9hZGRyIHNhZGRyX2J1ZjsKKwkJaWYgKGlwdjZfZ2V0X3NhZGRyKCZydC0+dS5kc3QsIGRzdCwgJnNhZGRyX2J1ZikgPT0gMCkKKwkJCVJUQV9QVVQoc2tiLCBSVEFfUFJFRlNSQywgMTYsICZzYWRkcl9idWYpOworCX0KKwlpZiAocnRuZXRsaW5rX3B1dF9tZXRyaWNzKHNrYiwgcnQtPnUuZHN0Lm1ldHJpY3MpIDwgMCkKKwkJZ290byBydGF0dHJfZmFpbHVyZTsKKwlpZiAocnQtPnUuZHN0Lm5laWdoYm91cikKKwkJUlRBX1BVVChza2IsIFJUQV9HQVRFV0FZLCAxNiwgJnJ0LT51LmRzdC5uZWlnaGJvdXItPnByaW1hcnlfa2V5KTsKKwlpZiAocnQtPnUuZHN0LmRldikKKwkJUlRBX1BVVChza2IsIFJUQV9PSUYsIHNpemVvZihpbnQpLCAmcnQtPnJ0NmlfZGV2LT5pZmluZGV4KTsKKwlSVEFfUFVUKHNrYiwgUlRBX1BSSU9SSVRZLCA0LCAmcnQtPnJ0NmlfbWV0cmljKTsKKwljaS5ydGFfbGFzdHVzZSA9IGppZmZpZXNfdG9fY2xvY2tfdChqaWZmaWVzIC0gcnQtPnUuZHN0Lmxhc3R1c2UpOworCWlmIChydC0+cnQ2aV9leHBpcmVzKQorCQljaS5ydGFfZXhwaXJlcyA9IGppZmZpZXNfdG9fY2xvY2tfdChydC0+cnQ2aV9leHBpcmVzIC0gamlmZmllcyk7CisJZWxzZQorCQljaS5ydGFfZXhwaXJlcyA9IDA7CisJY2kucnRhX3VzZWQgPSBydC0+dS5kc3QuX191c2U7CisJY2kucnRhX2NsbnRyZWYgPSBhdG9taWNfcmVhZCgmcnQtPnUuZHN0Ll9fcmVmY250KTsKKwljaS5ydGFfZXJyb3IgPSBydC0+dS5kc3QuZXJyb3I7CisJY2kucnRhX2lkID0gMDsKKwljaS5ydGFfdHMgPSAwOworCWNpLnJ0YV90c2FnZSA9IDA7CisJUlRBX1BVVChza2IsIFJUQV9DQUNIRUlORk8sIHNpemVvZihjaSksICZjaSk7CisJbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCXJldHVybiBza2ItPmxlbjsKKworbmxtc2dfZmFpbHVyZToKK3J0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHJ0Nl9kdW1wX3JvdXRlKHN0cnVjdCBydDZfaW5mbyAqcnQsIHZvaWQgKnBfYXJnKQoreworCXN0cnVjdCBydDZfcnRubF9kdW1wX2FyZyAqYXJnID0gKHN0cnVjdCBydDZfcnRubF9kdW1wX2FyZyAqKSBwX2FyZzsKKwlpbnQgcHJlZml4OworCisJaWYgKGFyZy0+Y2ItPm5saC0+bmxtc2dfbGVuID49IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IHJ0bXNnKSkpIHsKKwkJc3RydWN0IHJ0bXNnICpydG0gPSBOTE1TR19EQVRBKGFyZy0+Y2ItPm5saCk7CisJCXByZWZpeCA9IChydG0tPnJ0bV9mbGFncyAmIFJUTV9GX1BSRUZJWCkgIT0gMDsKKwl9IGVsc2UKKwkJcHJlZml4ID0gMDsKKworCXJldHVybiBydDZfZmlsbF9ub2RlKGFyZy0+c2tiLCBydCwgTlVMTCwgTlVMTCwgMCwgUlRNX05FV1JPVVRFLAorCQkgICAgIE5FVExJTktfQ0IoYXJnLT5jYi0+c2tiKS5waWQsIGFyZy0+Y2ItPm5saC0+bmxtc2dfc2VxLAorCQkgICAgIE5VTEwsIHByZWZpeCk7Cit9CisKK3N0YXRpYyBpbnQgZmliNl9kdW1wX25vZGUoc3RydWN0IGZpYjZfd2Fsa2VyX3QgKncpCit7CisJaW50IHJlczsKKwlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OworCisJZm9yIChydCA9IHctPmxlYWY7IHJ0OyBydCA9IHJ0LT51Lm5leHQpIHsKKwkJcmVzID0gcnQ2X2R1bXBfcm91dGUocnQsIHctPmFyZ3MpOworCQlpZiAocmVzIDwgMCkgeworCQkJLyogRnJhbWUgaXMgZnVsbCwgc3VzcGVuZCB3YWxraW5nICovCisJCQl3LT5sZWFmID0gcnQ7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlCVUdfVFJBUChyZXMhPTApOworCX0KKwl3LT5sZWFmID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZmliNl9kdW1wX2VuZChzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJc3RydWN0IGZpYjZfd2Fsa2VyX3QgKncgPSAodm9pZCopY2ItPmFyZ3NbMF07CisKKwlpZiAodykgeworCQljYi0+YXJnc1swXSA9IDA7CisJCWZpYjZfd2Fsa2VyX3VubGluayh3KTsKKwkJa2ZyZWUodyk7CisJfQorCWlmIChjYi0+YXJnc1sxXSkgeworCQljYi0+ZG9uZSA9ICh2b2lkKiljYi0+YXJnc1sxXTsKKwkJY2ItPmFyZ3NbMV0gPSAwOworCX0KK30KKworc3RhdGljIGludCBmaWI2X2R1bXBfZG9uZShzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJZmliNl9kdW1wX2VuZChjYik7CisJcmV0dXJuIGNiLT5kb25lKGNiKTsKK30KKworaW50IGluZXQ2X2R1bXBfZmliKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlzdHJ1Y3QgcnQ2X3J0bmxfZHVtcF9hcmcgYXJnOworCXN0cnVjdCBmaWI2X3dhbGtlcl90ICp3OworCWludCByZXM7CisKKwlhcmcuc2tiID0gc2tiOworCWFyZy5jYiA9IGNiOworCisJdyA9ICh2b2lkKiljYi0+YXJnc1swXTsKKwlpZiAodyA9PSBOVUxMKSB7CisJCS8qIE5ldyBkdW1wOgorCQkgKiAKKwkJICogMS4gaG9vayBjYWxsYmFjayBkZXN0cnVjdG9yLgorCQkgKi8KKwkJY2ItPmFyZ3NbMV0gPSAobG9uZyljYi0+ZG9uZTsKKwkJY2ItPmRvbmUgPSBmaWI2X2R1bXBfZG9uZTsKKworCQkvKgorCQkgKiAyLiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB3YWxrZXIuCisJCSAqLworCQl3ID0ga21hbGxvYyhzaXplb2YoKncpLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHcgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlSVDZfVFJBQ0UoImR1bXA8JXAiLCB3KTsKKwkJbWVtc2V0KHcsIDAsIHNpemVvZigqdykpOworCQl3LT5yb290ID0gJmlwNl9yb3V0aW5nX3RhYmxlOworCQl3LT5mdW5jID0gZmliNl9kdW1wX25vZGU7CisJCXctPmFyZ3MgPSAmYXJnOworCQljYi0+YXJnc1swXSA9IChsb25nKXc7CisJCXJlYWRfbG9ja19iaCgmcnQ2X2xvY2spOworCQlyZXMgPSBmaWI2X3dhbGsodyk7CisJCXJlYWRfdW5sb2NrX2JoKCZydDZfbG9jayk7CisJfSBlbHNlIHsKKwkJdy0+YXJncyA9ICZhcmc7CisJCXJlYWRfbG9ja19iaCgmcnQ2X2xvY2spOworCQlyZXMgPSBmaWI2X3dhbGtfY29udGludWUodyk7CisJCXJlYWRfdW5sb2NrX2JoKCZydDZfbG9jayk7CisJfQorI2lmIFJUNl9ERUJVRyA+PSAzCisJaWYgKHJlcyA8PSAwICYmIHNrYi0+bGVuID09IDApCisJCVJUNl9UUkFDRSgiJXA+ZHVtcCBlbmRcbiIsIHcpOworI2VuZGlmCisJcmVzID0gcmVzIDwgMCA/IHJlcyA6IHNrYi0+bGVuOworCS8qIHJlcyA8IDAgaXMgYW4gZXJyb3IuIChyZWFsbHksIGltcG9zc2libGUpCisJICAgcmVzID09IDAgbWVhbnMgdGhhdCBkdW1wIGlzIGNvbXBsZXRlLCBidXQgc2tiIHN0aWxsIGNhbiBjb250YWluIGRhdGEuCisJICAgcmVzID4gMCBkdW1wIGlzIG5vdCBjb21wbGV0ZSwgYnV0IGZyYW1lIGlzIGZ1bGwuCisJICovCisJLyogRGVzdHJveSB3YWxrZXIsIGlmIGR1bXAgb2YgdGhpcyB0YWJsZSBpcyBjb21wbGV0ZS4gKi8KKwlpZiAocmVzIDw9IDApCisJCWZpYjZfZHVtcF9lbmQoY2IpOworCXJldHVybiByZXM7Cit9CisKK2ludCBpbmV0Nl9ydG1fZ2V0cm91dGUoc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwgc3RydWN0IG5sbXNnaGRyKiBubGgsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcnRhdHRyICoqcnRhID0gYXJnOworCWludCBpaWYgPSAwOworCWludCBlcnIgPSAtRU5PQlVGUzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBmbG93aSBmbDsKKwlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OworCisJc2tiID0gYWxsb2Nfc2tiKE5MTVNHX0dPT0RTSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2tiID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJLyogUmVzZXJ2ZSByb29tIGZvciBkdW1teSBoZWFkZXJzLCB0aGlzIHNrYiBjYW4gcGFzcworCSAgIHRocm91Z2ggZ29vZCBjaHVuayBvZiByb3V0aW5nIGVuZ2luZS4KKwkgKi8KKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2VydmUoc2tiLCBNQVhfSEVBREVSICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisKKwltZW1zZXQoJmZsLCAwLCBzaXplb2YoZmwpKTsKKwlpZiAocnRhW1JUQV9TUkMtMV0pCisJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfc3JjLAorCQkJICAgICAgIChzdHJ1Y3QgaW42X2FkZHIqKVJUQV9EQVRBKHJ0YVtSVEFfU1JDLTFdKSk7CisJaWYgKHJ0YVtSVEFfRFNULTFdKQorCQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwKKwkJCSAgICAgICAoc3RydWN0IGluNl9hZGRyKilSVEFfREFUQShydGFbUlRBX0RTVC0xXSkpOworCisJaWYgKHJ0YVtSVEFfSUlGLTFdKQorCQltZW1jcHkoJmlpZiwgUlRBX0RBVEEocnRhW1JUQV9JSUYtMV0pLCBzaXplb2YoaW50KSk7CisKKwlpZiAoaWlmKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJCWRldiA9IF9fZGV2X2dldF9ieV9pbmRleChpaWYpOworCQlpZiAoIWRldikgeworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwl9CisKKwlmbC5vaWYgPSAwOworCWlmIChydGFbUlRBX09JRi0xXSkKKwkJbWVtY3B5KCZmbC5vaWYsIFJUQV9EQVRBKHJ0YVtSVEFfT0lGLTFdKSwgc2l6ZW9mKGludCkpOworCisJcnQgPSAoc3RydWN0IHJ0Nl9pbmZvKilpcDZfcm91dGVfb3V0cHV0KE5VTEwsICZmbCk7CisKKwlza2ItPmRzdCA9ICZydC0+dS5kc3Q7CisKKwlORVRMSU5LX0NCKHNrYikuZHN0X3BpZCA9IE5FVExJTktfQ0IoaW5fc2tiKS5waWQ7CisJZXJyID0gcnQ2X2ZpbGxfbm9kZShza2IsIHJ0LCAKKwkJCSAgICAmZmwuZmw2X2RzdCwgJmZsLmZsNl9zcmMsCisJCQkgICAgaWlmLAorCQkJICAgIFJUTV9ORVdST1VURSwgTkVUTElOS19DQihpbl9za2IpLnBpZCwKKwkJCSAgICBubGgtPm5sbXNnX3NlcSwgbmxoLCAwKTsKKwlpZiAoZXJyIDwgMCkgeworCQllcnIgPSAtRU1TR1NJWkU7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJZXJyID0gbmV0bGlua191bmljYXN0KHJ0bmwsIHNrYiwgTkVUTElOS19DQihpbl9za2IpLnBpZCwgTVNHX0RPTlRXQUlUKTsKKwlpZiAoZXJyID4gMCkKKwkJZXJyID0gMDsKK291dDoKKwlyZXR1cm4gZXJyOworb3V0X2ZyZWU6CisJa2ZyZWVfc2tiKHNrYik7CisJZ290byBvdXQ7CQorfQorCit2b2lkIGluZXQ2X3J0X25vdGlmeShpbnQgZXZlbnQsIHN0cnVjdCBydDZfaW5mbyAqcnQsIHN0cnVjdCBubG1zZ2hkciAqbmxoKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHNpemUgPSBOTE1TR19TUEFDRShzaXplb2Yoc3RydWN0IHJ0bXNnKSsyNTYpOworCisJc2tiID0gYWxsb2Nfc2tiKHNpemUsIGdmcF9hbnkoKSk7CisJaWYgKCFza2IpIHsKKwkJbmV0bGlua19zZXRfZXJyKHJ0bmwsIDAsIFJUTUdSUF9JUFY2X1JPVVRFLCBFTk9CVUZTKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocnQ2X2ZpbGxfbm9kZShza2IsIHJ0LCBOVUxMLCBOVUxMLCAwLCBldmVudCwgMCwgMCwgbmxoLCAwKSA8IDApIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCW5ldGxpbmtfc2V0X2VycihydG5sLCAwLCBSVE1HUlBfSVBWNl9ST1VURSwgRUlOVkFMKTsKKwkJcmV0dXJuOworCX0KKwlORVRMSU5LX0NCKHNrYikuZHN0X2dyb3VwcyA9IFJUTUdSUF9JUFY2X1JPVVRFOworCW5ldGxpbmtfYnJvYWRjYXN0KHJ0bmwsIHNrYiwgMCwgUlRNR1JQX0lQVjZfUk9VVEUsIGdmcF9hbnkoKSk7Cit9CisKKy8qCisgKgkvcHJvYworICovCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCisjZGVmaW5lIFJUNl9JTkZPX0xFTiAoMzIgKyA0ICsgMzIgKyA0ICsgMzIgKyA0MCArIDUgKyAxKQorCitzdHJ1Y3QgcnQ2X3Byb2NfYXJnCit7CisJY2hhciAqYnVmZmVyOworCWludCBvZmZzZXQ7CisJaW50IGxlbmd0aDsKKwlpbnQgc2tpcDsKKwlpbnQgbGVuOworfTsKKworc3RhdGljIGludCBydDZfaW5mb19yb3V0ZShzdHJ1Y3QgcnQ2X2luZm8gKnJ0LCB2b2lkICpwX2FyZykKK3sKKwlzdHJ1Y3QgcnQ2X3Byb2NfYXJnICphcmcgPSAoc3RydWN0IHJ0Nl9wcm9jX2FyZyAqKSBwX2FyZzsKKwlpbnQgaTsKKworCWlmIChhcmctPnNraXAgPCBhcmctPm9mZnNldCAvIFJUNl9JTkZPX0xFTikgeworCQlhcmctPnNraXArKzsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGFyZy0+bGVuID49IGFyZy0+bGVuZ3RoKQorCQlyZXR1cm4gMDsKKworCWZvciAoaT0wOyBpPDE2OyBpKyspIHsKKwkJc3ByaW50ZihhcmctPmJ1ZmZlciArIGFyZy0+bGVuLCAiJTAyeCIsCisJCQlydC0+cnQ2aV9kc3QuYWRkci5zNl9hZGRyW2ldKTsKKwkJYXJnLT5sZW4gKz0gMjsKKwl9CisJYXJnLT5sZW4gKz0gc3ByaW50ZihhcmctPmJ1ZmZlciArIGFyZy0+bGVuLCAiICUwMnggIiwKKwkJCSAgICBydC0+cnQ2aV9kc3QucGxlbik7CisKKyNpZmRlZiBDT05GSUdfSVBWNl9TVUJUUkVFUworCWZvciAoaT0wOyBpPDE2OyBpKyspIHsKKwkJc3ByaW50ZihhcmctPmJ1ZmZlciArIGFyZy0+bGVuLCAiJTAyeCIsCisJCQlydC0+cnQ2aV9zcmMuYWRkci5zNl9hZGRyW2ldKTsKKwkJYXJnLT5sZW4gKz0gMjsKKwl9CisJYXJnLT5sZW4gKz0gc3ByaW50ZihhcmctPmJ1ZmZlciArIGFyZy0+bGVuLCAiICUwMnggIiwKKwkJCSAgICBydC0+cnQ2aV9zcmMucGxlbik7CisjZWxzZQorCXNwcmludGYoYXJnLT5idWZmZXIgKyBhcmctPmxlbiwKKwkJIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAwICIpOworCWFyZy0+bGVuICs9IDM2OworI2VuZGlmCisKKwlpZiAocnQtPnJ0NmlfbmV4dGhvcCkgeworCQlmb3IgKGk9MDsgaTwxNjsgaSsrKSB7CisJCQlzcHJpbnRmKGFyZy0+YnVmZmVyICsgYXJnLT5sZW4sICIlMDJ4IiwKKwkJCQlydC0+cnQ2aV9uZXh0aG9wLT5wcmltYXJ5X2tleVtpXSk7CisJCQlhcmctPmxlbiArPSAyOworCQl9CisJfSBlbHNlIHsKKwkJc3ByaW50ZihhcmctPmJ1ZmZlciArIGFyZy0+bGVuLAorCQkJIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIik7CisJCWFyZy0+bGVuICs9IDMyOworCX0KKwlhcmctPmxlbiArPSBzcHJpbnRmKGFyZy0+YnVmZmVyICsgYXJnLT5sZW4sCisJCQkgICAgIiAlMDh4ICUwOHggJTA4eCAlMDh4ICU4c1xuIiwKKwkJCSAgICBydC0+cnQ2aV9tZXRyaWMsIGF0b21pY19yZWFkKCZydC0+dS5kc3QuX19yZWZjbnQpLAorCQkJICAgIHJ0LT51LmRzdC5fX3VzZSwgcnQtPnJ0NmlfZmxhZ3MsIAorCQkJICAgIHJ0LT5ydDZpX2RldiA/IHJ0LT5ydDZpX2Rldi0+bmFtZSA6ICIiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDZfcHJvY19pbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgpCit7CisJc3RydWN0IHJ0Nl9wcm9jX2FyZyBhcmc7CisJYXJnLmJ1ZmZlciA9IGJ1ZmZlcjsKKwlhcmcub2Zmc2V0ID0gb2Zmc2V0OworCWFyZy5sZW5ndGggPSBsZW5ndGg7CisJYXJnLnNraXAgPSAwOworCWFyZy5sZW4gPSAwOworCisJcmVhZF9sb2NrX2JoKCZydDZfbG9jayk7CisJZmliNl9jbGVhbl90cmVlKCZpcDZfcm91dGluZ190YWJsZSwgcnQ2X2luZm9fcm91dGUsIDAsICZhcmcpOworCXJlYWRfdW5sb2NrX2JoKCZydDZfbG9jayk7CisKKwkqc3RhcnQgPSBidWZmZXI7CisJaWYgKG9mZnNldCkKKwkJKnN0YXJ0ICs9IG9mZnNldCAlIFJUNl9JTkZPX0xFTjsKKworCWFyZy5sZW4gLT0gb2Zmc2V0ICUgUlQ2X0lORk9fTEVOOworCisJaWYgKGFyZy5sZW4gPiBsZW5ndGgpCisJCWFyZy5sZW4gPSBsZW5ndGg7CisJaWYgKGFyZy5sZW4gPCAwKQorCQlhcmcubGVuID0gMDsKKworCXJldHVybiBhcmcubGVuOworfQorCitleHRlcm4gc3RydWN0IHJ0Nl9zdGF0aXN0aWNzIHJ0Nl9zdGF0czsKKworc3RhdGljIGludCBydDZfc3RhdHNfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc2VxX3ByaW50ZihzZXEsICIlMDR4ICUwNHggJTA0eCAlMDR4ICUwNHggJTA0eCAlMDR4XG4iLAorCQkgICAgICBydDZfc3RhdHMuZmliX25vZGVzLCBydDZfc3RhdHMuZmliX3JvdXRlX25vZGVzLAorCQkgICAgICBydDZfc3RhdHMuZmliX3J0X2FsbG9jLCBydDZfc3RhdHMuZmliX3J0X2VudHJpZXMsCisJCSAgICAgIHJ0Nl9zdGF0cy5maWJfcnRfY2FjaGUsCisJCSAgICAgIGF0b21pY19yZWFkKCZpcDZfZHN0X29wcy5lbnRyaWVzKSwKKwkJICAgICAgcnQ2X3N0YXRzLmZpYl9kaXNjYXJkZWRfcm91dGVzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0Nl9zdGF0c19zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcnQ2X3N0YXRzX3NlcV9zaG93LCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnQ2X3N0YXRzX3NlcV9mb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkub3BlbgkgPSBydDZfc3RhdHNfc2VxX29wZW4sCisJLnJlYWQJID0gc2VxX3JlYWQsCisJLmxsc2VlawkgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisjZW5kaWYJLyogQ09ORklHX1BST0NfRlMgKi8KKworI2lmZGVmIENPTkZJR19TWVNDVEwKKworc3RhdGljIGludCBmbHVzaF9kZWxheTsKKworc3RhdGljCitpbnQgaXB2Nl9zeXNjdGxfcnRjYWNoZV9mbHVzaChjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqIGZpbHAsCisJCQkgICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwlpZiAod3JpdGUpIHsKKwkJcHJvY19kb2ludHZlYyhjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCQlmaWI2X3J1bl9nYyhmbHVzaF9kZWxheSA8PSAwID8gfjBVTCA6ICh1bnNpZ25lZCBsb25nKWZsdXNoX2RlbGF5KTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOworfQorCitjdGxfdGFibGUgaXB2Nl9yb3V0ZV90YWJsZVtdID0geworICAgICAgICB7CisJCS5jdGxfbmFtZQk9CU5FVF9JUFY2X1JPVVRFX0ZMVVNILCAKKwkJLnByb2NuYW1lCT0JImZsdXNoIiwKKyAgICAgICAgIAkuZGF0YQkJPQkmZmx1c2hfZGVsYXksCisJCS5tYXhsZW4JCT0Jc2l6ZW9mKGludCksCisJCS5tb2RlCQk9CTA2NDQsCisgICAgICAgICAJLnByb2NfaGFuZGxlcgk9CSZpcHY2X3N5c2N0bF9ydGNhY2hlX2ZsdXNoCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9CU5FVF9JUFY2X1JPVVRFX0dDX1RIUkVTSCwKKwkJLnByb2NuYW1lCT0JImdjX3RocmVzaCIsCisgICAgICAgICAJLmRhdGEJCT0JJmlwNl9kc3Rfb3BzLmdjX3RocmVzaCwKKwkJLm1heGxlbgkJPQlzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0JMDY0NCwKKyAgICAgICAgIAkucHJvY19oYW5kbGVyCT0JJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9CU5FVF9JUFY2X1JPVVRFX01BWF9TSVpFLAorCQkucHJvY25hbWUJPQkibWF4X3NpemUiLAorICAgICAgICAgCS5kYXRhCQk9CSZpcDZfcnRfbWF4X3NpemUsCisJCS5tYXhsZW4JCT0Jc2l6ZW9mKGludCksCisJCS5tb2RlCQk9CTA2NDQsCisgICAgICAgICAJLnByb2NfaGFuZGxlcgk9CSZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPQlORVRfSVBWNl9ST1VURV9HQ19NSU5fSU5URVJWQUwsCisJCS5wcm9jbmFtZQk9CSJnY19taW5faW50ZXJ2YWwiLAorICAgICAgICAgCS5kYXRhCQk9CSZpcDZfcnRfZ2NfbWluX2ludGVydmFsLAorCQkubWF4bGVuCQk9CXNpemVvZihpbnQpLAorCQkubW9kZQkJPQkwNjQ0LAorICAgICAgICAgCS5wcm9jX2hhbmRsZXIJPQkmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCQkuc3RyYXRlZ3kJPQkmc3lzY3RsX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9CU5FVF9JUFY2X1JPVVRFX0dDX1RJTUVPVVQsCisJCS5wcm9jbmFtZQk9CSJnY190aW1lb3V0IiwKKyAgICAgICAgIAkuZGF0YQkJPQkmaXA2X3J0X2djX3RpbWVvdXQsCisJCS5tYXhsZW4JCT0Jc2l6ZW9mKGludCksCisJCS5tb2RlCQk9CTA2NDQsCisgICAgICAgICAJLnByb2NfaGFuZGxlcgk9CSZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJCS5zdHJhdGVneQk9CSZzeXNjdGxfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0JTkVUX0lQVjZfUk9VVEVfR0NfSU5URVJWQUwsCisJCS5wcm9jbmFtZQk9CSJnY19pbnRlcnZhbCIsCisgICAgICAgICAJLmRhdGEJCT0JJmlwNl9ydF9nY19pbnRlcnZhbCwKKwkJLm1heGxlbgkJPQlzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0JMDY0NCwKKyAgICAgICAgIAkucHJvY19oYW5kbGVyCT0JJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwkJLnN0cmF0ZWd5CT0JJnN5c2N0bF9qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPQlORVRfSVBWNl9ST1VURV9HQ19FTEFTVElDSVRZLAorCQkucHJvY25hbWUJPQkiZ2NfZWxhc3RpY2l0eSIsCisgICAgICAgICAJLmRhdGEJCT0JJmlwNl9ydF9nY19lbGFzdGljaXR5LAorCQkubWF4bGVuCQk9CXNpemVvZihpbnQpLAorCQkubW9kZQkJPQkwNjQ0LAorICAgICAgICAgCS5wcm9jX2hhbmRsZXIJPQkmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCQkuc3RyYXRlZ3kJPQkmc3lzY3RsX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9CU5FVF9JUFY2X1JPVVRFX01UVV9FWFBJUkVTLAorCQkucHJvY25hbWUJPQkibXR1X2V4cGlyZXMiLAorICAgICAgICAgCS5kYXRhCQk9CSZpcDZfcnRfbXR1X2V4cGlyZXMsCisJCS5tYXhsZW4JCT0Jc2l6ZW9mKGludCksCisJCS5tb2RlCQk9CTA2NDQsCisgICAgICAgICAJLnByb2NfaGFuZGxlcgk9CSZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJCS5zdHJhdGVneQk9CSZzeXNjdGxfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0JTkVUX0lQVjZfUk9VVEVfTUlOX0FEVk1TUywKKwkJLnByb2NuYW1lCT0JIm1pbl9hZHZfbXNzIiwKKyAgICAgICAgIAkuZGF0YQkJPQkmaXA2X3J0X21pbl9hZHZtc3MsCisJCS5tYXhsZW4JCT0Jc2l6ZW9mKGludCksCisJCS5tb2RlCQk9CTA2NDQsCisgICAgICAgICAJLnByb2NfaGFuZGxlcgk9CSZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJCS5zdHJhdGVneQk9CSZzeXNjdGxfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0JTkVUX0lQVjZfUk9VVEVfR0NfTUlOX0lOVEVSVkFMX01TLAorCQkucHJvY25hbWUJPQkiZ2NfbWluX2ludGVydmFsX21zIiwKKyAgICAgICAgIAkuZGF0YQkJPQkmaXA2X3J0X2djX21pbl9pbnRlcnZhbCwKKwkJLm1heGxlbgkJPQlzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0JMDY0NCwKKyAgICAgICAgIAkucHJvY19oYW5kbGVyCT0JJnByb2NfZG9pbnR2ZWNfbXNfamlmZmllcywKKwkJLnN0cmF0ZWd5CT0JJnN5c2N0bF9tc19qaWZmaWVzLAorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKKyNlbmRpZgorCit2b2lkIF9faW5pdCBpcDZfcm91dGVfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcDsKKworCWlwNl9kc3Rfb3BzLmttZW1fY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImlwNl9kc3RfY2FjaGUiLAorCQkJCQkJICAgICBzaXplb2Yoc3RydWN0IHJ0Nl9pbmZvKSwKKwkJCQkJCSAgICAgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOLAorCQkJCQkJICAgICBOVUxMLCBOVUxMKTsKKwlpZiAoIWlwNl9kc3Rfb3BzLmttZW1fY2FjaGVwKQorCQlwYW5pYygiY2Fubm90IGNyZWF0ZSBpcDZfZHN0X2NhY2hlIik7CisKKwlmaWI2X2luaXQoKTsKKyNpZmRlZiAJQ09ORklHX1BST0NfRlMKKwlwID0gcHJvY19uZXRfY3JlYXRlKCJpcHY2X3JvdXRlIiwgMCwgcnQ2X3Byb2NfaW5mbyk7CisJaWYgKHApCisJCXAtPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwlwcm9jX25ldF9mb3BzX2NyZWF0ZSgicnQ2X3N0YXRzIiwgU19JUlVHTywgJnJ0Nl9zdGF0c19zZXFfZm9wcyk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfWEZSTQorCXhmcm02X2luaXQoKTsKKyNlbmRpZgorfQorCit2b2lkIGlwNl9yb3V0ZV9jbGVhbnVwKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlwcm9jX25ldF9yZW1vdmUoImlwdjZfcm91dGUiKTsKKwlwcm9jX25ldF9yZW1vdmUoInJ0Nl9zdGF0cyIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1hGUk0KKwl4ZnJtNl9maW5pKCk7CisjZW5kaWYKKwlydDZfaWZkb3duKE5VTEwpOworCWZpYjZfZ2NfY2xlYW51cCgpOworCWttZW1fY2FjaGVfZGVzdHJveShpcDZfZHN0X29wcy5rbWVtX2NhY2hlcCk7Cit9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9zaXQuYyBiL25ldC9pcHY2L3NpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ODhmNTUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2Ni9zaXQuYwpAQCAtMCwwICsxLDgzMyBAQAorLyoKKyAqCUlQdjYgb3ZlciBJUHY0IHR1bm5lbCBkZXZpY2UgLSBTaW1wbGUgSW50ZXJuZXQgVHJhbnNpdGlvbiAoU0lUKQorICoJTGludXggSU5FVDYgaW1wbGVtZW50YXRpb24KKyAqCisgKglBdXRob3JzOgorICoJUGVkcm8gUm9xdWUJCTxyb3F1ZUBkaS5mYy51bC5wdD4JCisgKglBbGV4ZXkgS3V6bmV0c292CTxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKgkkSWQ6IHNpdC5jLHYgMS41MyAyMDAxLzA5LzI1IDA1OjA5OjUzIGRhdmVtIEV4cCAkCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglDaGFuZ2VzOgorICogUm9nZXIgVmVubmluZyA8ci52ZW5uaW5nQHRlbHN0cmEuY29tPjoJNnRvNCBzdXBwb3J0CisgKiBOYXRlIFRob21wc29uIDxuYXRlQHRoZWJvZy5uZXQ+OgkJNnRvNCBzdXBwb3J0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3NubXAuaD4KKworI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L3RyYW5zcF92Ni5oPgorI2luY2x1ZGUgPG5ldC9pcDZfZmliLmg+CisjaW5jbHVkZSA8bmV0L2lwNl9yb3V0ZS5oPgorI2luY2x1ZGUgPG5ldC9uZGlzYy5oPgorI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC91ZHAuaD4KKyNpbmNsdWRlIDxuZXQvaWNtcC5oPgorI2luY2x1ZGUgPG5ldC9pcGlwLmg+CisjaW5jbHVkZSA8bmV0L2luZXRfZWNuLmg+CisjaW5jbHVkZSA8bmV0L3hmcm0uaD4KKyNpbmNsdWRlIDxuZXQvZHNmaWVsZC5oPgorCisvKgorICAgVGhpcyB2ZXJzaW9uIG9mIG5ldC9pcHY2L3NpdC5jIGlzIGNsb25lZCBvZiBuZXQvaXB2NC9pcF9ncmUuYworCisgICBGb3IgY29tbWVudHMgbG9vayBhdCBuZXQvaXB2NC9pcF9ncmUuYyAtLUFOSworICovCisKKyNkZWZpbmUgSEFTSF9TSVpFICAxNgorI2RlZmluZSBIQVNIKGFkZHIpICgoYWRkcl4oYWRkcj4+NCkpJjB4RikKKworc3RhdGljIGludCBpcGlwNl9mYl90dW5uZWxfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaXBpcDZfdHVubmVsX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBpcGlwNl90dW5uZWxfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqaXBpcDZfZmJfdHVubmVsX2RldjsKKworc3RhdGljIHN0cnVjdCBpcF90dW5uZWwgKnR1bm5lbHNfcl9sW0hBU0hfU0laRV07CitzdGF0aWMgc3RydWN0IGlwX3R1bm5lbCAqdHVubmVsc19yW0hBU0hfU0laRV07CitzdGF0aWMgc3RydWN0IGlwX3R1bm5lbCAqdHVubmVsc19sW0hBU0hfU0laRV07CitzdGF0aWMgc3RydWN0IGlwX3R1bm5lbCAqdHVubmVsc193Y1sxXTsKK3N0YXRpYyBzdHJ1Y3QgaXBfdHVubmVsICoqdHVubmVsc1s0XSA9IHsgdHVubmVsc193YywgdHVubmVsc19sLCB0dW5uZWxzX3IsIHR1bm5lbHNfcl9sIH07CisKK3N0YXRpYyBERUZJTkVfUldMT0NLKGlwaXA2X2xvY2spOworCitzdGF0aWMgc3RydWN0IGlwX3R1bm5lbCAqIGlwaXA2X3R1bm5lbF9sb29rdXAodTMyIHJlbW90ZSwgdTMyIGxvY2FsKQoreworCXVuc2lnbmVkIGgwID0gSEFTSChyZW1vdGUpOworCXVuc2lnbmVkIGgxID0gSEFTSChsb2NhbCk7CisJc3RydWN0IGlwX3R1bm5lbCAqdDsKKworCWZvciAodCA9IHR1bm5lbHNfcl9sW2gwXmgxXTsgdDsgdCA9IHQtPm5leHQpIHsKKwkJaWYgKGxvY2FsID09IHQtPnBhcm1zLmlwaC5zYWRkciAmJgorCQkgICAgcmVtb3RlID09IHQtPnBhcm1zLmlwaC5kYWRkciAmJiAodC0+ZGV2LT5mbGFncyZJRkZfVVApKQorCQkJcmV0dXJuIHQ7CisJfQorCWZvciAodCA9IHR1bm5lbHNfcltoMF07IHQ7IHQgPSB0LT5uZXh0KSB7CisJCWlmIChyZW1vdGUgPT0gdC0+cGFybXMuaXBoLmRhZGRyICYmICh0LT5kZXYtPmZsYWdzJklGRl9VUCkpCisJCQlyZXR1cm4gdDsKKwl9CisJZm9yICh0ID0gdHVubmVsc19sW2gxXTsgdDsgdCA9IHQtPm5leHQpIHsKKwkJaWYgKGxvY2FsID09IHQtPnBhcm1zLmlwaC5zYWRkciAmJiAodC0+ZGV2LT5mbGFncyZJRkZfVVApKQorCQkJcmV0dXJuIHQ7CisJfQorCWlmICgodCA9IHR1bm5lbHNfd2NbMF0pICE9IE5VTEwgJiYgKHQtPmRldi0+ZmxhZ3MmSUZGX1VQKSkKKwkJcmV0dXJuIHQ7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXBfdHVubmVsICoqIGlwaXA2X2J1Y2tldChzdHJ1Y3QgaXBfdHVubmVsICp0KQoreworCXUzMiByZW1vdGUgPSB0LT5wYXJtcy5pcGguZGFkZHI7CisJdTMyIGxvY2FsID0gdC0+cGFybXMuaXBoLnNhZGRyOworCXVuc2lnbmVkIGggPSAwOworCWludCBwcmlvID0gMDsKKworCWlmIChyZW1vdGUpIHsKKwkJcHJpbyB8PSAyOworCQloIF49IEhBU0gocmVtb3RlKTsKKwl9CisJaWYgKGxvY2FsKSB7CisJCXByaW8gfD0gMTsKKwkJaCBePSBIQVNIKGxvY2FsKTsKKwl9CisJcmV0dXJuICZ0dW5uZWxzW3ByaW9dW2hdOworfQorCitzdGF0aWMgdm9pZCBpcGlwNl90dW5uZWxfdW5saW5rKHN0cnVjdCBpcF90dW5uZWwgKnQpCit7CisJc3RydWN0IGlwX3R1bm5lbCAqKnRwOworCisJZm9yICh0cCA9IGlwaXA2X2J1Y2tldCh0KTsgKnRwOyB0cCA9ICYoKnRwKS0+bmV4dCkgeworCQlpZiAodCA9PSAqdHApIHsKKwkJCXdyaXRlX2xvY2tfYmgoJmlwaXA2X2xvY2spOworCQkJKnRwID0gdC0+bmV4dDsKKwkJCXdyaXRlX3VubG9ja19iaCgmaXBpcDZfbG9jayk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgaXBpcDZfdHVubmVsX2xpbmsoc3RydWN0IGlwX3R1bm5lbCAqdCkKK3sKKwlzdHJ1Y3QgaXBfdHVubmVsICoqdHAgPSBpcGlwNl9idWNrZXQodCk7CisKKwl0LT5uZXh0ID0gKnRwOworCXdyaXRlX2xvY2tfYmgoJmlwaXA2X2xvY2spOworCSp0cCA9IHQ7CisJd3JpdGVfdW5sb2NrX2JoKCZpcGlwNl9sb2NrKTsKK30KKworc3RhdGljIHN0cnVjdCBpcF90dW5uZWwgKiBpcGlwNl90dW5uZWxfbG9jYXRlKHN0cnVjdCBpcF90dW5uZWxfcGFybSAqcGFybXMsIGludCBjcmVhdGUpCit7CisJdTMyIHJlbW90ZSA9IHBhcm1zLT5pcGguZGFkZHI7CisJdTMyIGxvY2FsID0gcGFybXMtPmlwaC5zYWRkcjsKKwlzdHJ1Y3QgaXBfdHVubmVsICp0LCAqKnRwLCAqbnQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBoID0gMDsKKwlpbnQgcHJpbyA9IDA7CisJY2hhciBuYW1lW0lGTkFNU0laXTsKKworCWlmIChyZW1vdGUpIHsKKwkJcHJpbyB8PSAyOworCQloIF49IEhBU0gocmVtb3RlKTsKKwl9CisJaWYgKGxvY2FsKSB7CisJCXByaW8gfD0gMTsKKwkJaCBePSBIQVNIKGxvY2FsKTsKKwl9CisJZm9yICh0cCA9ICZ0dW5uZWxzW3ByaW9dW2hdOyAodCA9ICp0cCkgIT0gTlVMTDsgdHAgPSAmdC0+bmV4dCkgeworCQlpZiAobG9jYWwgPT0gdC0+cGFybXMuaXBoLnNhZGRyICYmIHJlbW90ZSA9PSB0LT5wYXJtcy5pcGguZGFkZHIpCisJCQlyZXR1cm4gdDsKKwl9CisJaWYgKCFjcmVhdGUpCisJCWdvdG8gZmFpbGVkOworCisJaWYgKHBhcm1zLT5uYW1lWzBdKQorCQlzdHJsY3B5KG5hbWUsIHBhcm1zLT5uYW1lLCBJRk5BTVNJWik7CisJZWxzZSB7CisJCWludCBpOworCQlmb3IgKGk9MTsgaTwxMDA7IGkrKykgeworCQkJc3ByaW50ZihuYW1lLCAic2l0JWQiLCBpKTsKKwkJCWlmIChfX2Rldl9nZXRfYnlfbmFtZShuYW1lKSA9PSBOVUxMKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChpPT0xMDApCisJCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKCp0KSwgbmFtZSwgaXBpcDZfdHVubmVsX3NldHVwKTsKKwlpZiAoZGV2ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbnQgPSBkZXYtPnByaXY7CisJZGV2LT5pbml0ID0gaXBpcDZfdHVubmVsX2luaXQ7CisJbnQtPnBhcm1zID0gKnBhcm1zOworCisJaWYgKHJlZ2lzdGVyX25ldGRldmljZShkZXYpIDwgMCkgeworCQlmcmVlX25ldGRldihkZXYpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlkZXZfaG9sZChkZXYpOworCisJaXBpcDZfdHVubmVsX2xpbmsobnQpOworCS8qIERvIG5vdCBkZWNyZW1lbnQgTU9EX1VTRV9DT1VOVCBoZXJlLiAqLworCXJldHVybiBudDsKKworZmFpbGVkOgorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBpcGlwNl90dW5uZWxfdW5pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKGRldiA9PSBpcGlwNl9mYl90dW5uZWxfZGV2KSB7CisJCXdyaXRlX2xvY2tfYmgoJmlwaXA2X2xvY2spOworCQl0dW5uZWxzX3djWzBdID0gTlVMTDsKKwkJd3JpdGVfdW5sb2NrX2JoKCZpcGlwNl9sb2NrKTsKKwkJZGV2X3B1dChkZXYpOworCX0gZWxzZSB7CisJCWlwaXA2X3R1bm5lbF91bmxpbmsoKHN0cnVjdCBpcF90dW5uZWwqKWRldi0+cHJpdik7CisJCWRldl9wdXQoZGV2KTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgaXBpcDZfZXJyKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBpbmZvKQoreworI2lmbmRlZiBJX1dJU0hfV09STERfV0VSRV9QRVJGRUNUCisKKy8qIEl0IGlzIG5vdCA6LSggQWxsIHRoZSByb3V0ZXJzIChleGNlcHQgZm9yIExpbnV4KSByZXR1cm4gb25seQorICAgOCBieXRlcyBvZiBwYWNrZXQgcGF5bG9hZC4gSXQgbWVhbnMsIHRoYXQgcHJlY2lzZSByZWxheWluZyBvZgorICAgSUNNUCBpbiB0aGUgcmVhbCBJbnRlcm5ldCBpcyBhYnNvbHV0ZWx5IGluZmVhc2libGUuCisgKi8KKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IChzdHJ1Y3QgaXBoZHIqKXNrYi0+ZGF0YTsKKwlpbnQgdHlwZSA9IHNrYi0+aC5pY21waC0+dHlwZTsKKwlpbnQgY29kZSA9IHNrYi0+aC5pY21waC0+Y29kZTsKKwlzdHJ1Y3QgaXBfdHVubmVsICp0OworCisJc3dpdGNoICh0eXBlKSB7CisJZGVmYXVsdDoKKwljYXNlIElDTVBfUEFSQU1FVEVSUFJPQjoKKwkJcmV0dXJuOworCisJY2FzZSBJQ01QX0RFU1RfVU5SRUFDSDoKKwkJc3dpdGNoIChjb2RlKSB7CisJCWNhc2UgSUNNUF9TUl9GQUlMRUQ6CisJCWNhc2UgSUNNUF9QT1JUX1VOUkVBQ0g6CisJCQkvKiBJbXBvc3NpYmxlIGV2ZW50LiAqLworCQkJcmV0dXJuOworCQljYXNlIElDTVBfRlJBR19ORUVERUQ6CisJCQkvKiBTb2Z0IHN0YXRlIGZvciBwbXR1IGlzIG1haW50YWluZWQgYnkgSVAgY29yZS4gKi8KKwkJCXJldHVybjsKKwkJZGVmYXVsdDoKKwkJCS8qIEFsbCBvdGhlcnMgYXJlIHRyYW5zbGF0ZWQgdG8gSE9TVF9VTlJFQUNILgorCQkJICAgcmZjMjAwMyBjb250YWlucyAiZGVlcCB0aG91Z2h0cyIgYWJvdXQgTkVUX1VOUkVBQ0gsCisJCQkgICBJIGJlbGlldmUgdGhleSBhcmUganVzdCBldGhlciBwb2xsdXRpb24uIC0tQU5LCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgSUNNUF9USU1FX0VYQ0VFREVEOgorCQlpZiAoY29kZSAhPSBJQ01QX0VYQ19UVEwpCisJCQlyZXR1cm47CisJCWJyZWFrOworCX0KKworCXJlYWRfbG9jaygmaXBpcDZfbG9jayk7CisJdCA9IGlwaXA2X3R1bm5lbF9sb29rdXAoaXBoLT5kYWRkciwgaXBoLT5zYWRkcik7CisJaWYgKHQgPT0gTlVMTCB8fCB0LT5wYXJtcy5pcGguZGFkZHIgPT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKHQtPnBhcm1zLmlwaC50dGwgPT0gMCAmJiB0eXBlID09IElDTVBfVElNRV9FWENFRURFRCkKKwkJZ290byBvdXQ7CisKKwlpZiAoamlmZmllcyAtIHQtPmVycl90aW1lIDwgSVBUVU5ORUxfRVJSX1RJTUVPKQorCQl0LT5lcnJfY291bnQrKzsKKwllbHNlCisJCXQtPmVycl9jb3VudCA9IDE7CisJdC0+ZXJyX3RpbWUgPSBqaWZmaWVzOworb3V0OgorCXJlYWRfdW5sb2NrKCZpcGlwNl9sb2NrKTsKKwlyZXR1cm47CisjZWxzZQorCXN0cnVjdCBpcGhkciAqaXBoID0gKHN0cnVjdCBpcGhkciopZHA7CisJaW50IGhsZW4gPSBpcGgtPmlobDw8MjsKKwlzdHJ1Y3QgaXB2NmhkciAqaXBoNjsKKwlpbnQgdHlwZSA9IHNrYi0+aC5pY21waC0+dHlwZTsKKwlpbnQgY29kZSA9IHNrYi0+aC5pY21waC0+Y29kZTsKKwlpbnQgcmVsX3R5cGUgPSAwOworCWludCByZWxfY29kZSA9IDA7CisJaW50IHJlbF9pbmZvID0gMDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKKwlzdHJ1Y3QgcnQ2X2luZm8gKnJ0Nmk7CisKKwlpZiAobGVuIDwgaGxlbiArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpCisJCXJldHVybjsKKwlpcGg2ID0gKHN0cnVjdCBpcHY2aGRyKikoZHAgKyBobGVuKTsKKworCXN3aXRjaCAodHlwZSkgeworCWRlZmF1bHQ6CisJCXJldHVybjsKKwljYXNlIElDTVBfUEFSQU1FVEVSUFJPQjoKKwkJaWYgKHNrYi0+aC5pY21waC0+dW4uZ2F0ZXdheSA8IGhsZW4pCisJCQlyZXR1cm47CisKKwkJLyogU28uLi4gVGhpcyBndXkgZm91bmQgc29tZXRoaW5nIHN0cmFuZ2UgSU5TSURFIGVuY2Fwc3VsYXRlZAorCQkgICBwYWNrZXQuIFdlbGwsIGhlIGlzIGZvb2wsIGJ1dCB3aGF0IGNhbiB3ZSBkbyA/CisJCSAqLworCQlyZWxfdHlwZSA9IElDTVBWNl9QQVJBTVBST0I7CisJCXJlbF9pbmZvID0gc2tiLT5oLmljbXBoLT51bi5nYXRld2F5IC0gaGxlbjsKKwkJYnJlYWs7CisKKwljYXNlIElDTVBfREVTVF9VTlJFQUNIOgorCQlzd2l0Y2ggKGNvZGUpIHsKKwkJY2FzZSBJQ01QX1NSX0ZBSUxFRDoKKwkJY2FzZSBJQ01QX1BPUlRfVU5SRUFDSDoKKwkJCS8qIEltcG9zc2libGUgZXZlbnQuICovCisJCQlyZXR1cm47CisJCWNhc2UgSUNNUF9GUkFHX05FRURFRDoKKwkJCS8qIFRvbyBjb21wbGljYXRlZCBjYXNlIC4uLiAqLworCQkJcmV0dXJuOworCQlkZWZhdWx0OgorCQkJLyogQWxsIG90aGVycyBhcmUgdHJhbnNsYXRlZCB0byBIT1NUX1VOUkVBQ0guCisJCQkgICByZmMyMDAzIGNvbnRhaW5zICJkZWVwIHRob3VnaHRzIiBhYm91dCBORVRfVU5SRUFDSCwKKwkJCSAgIEkgYmVsaWV2ZSwgaXQgaXMganVzdCBldGhlciBwb2xsdXRpb24uIC0tQU5LCisJCQkgKi8KKwkJCXJlbF90eXBlID0gSUNNUFY2X0RFU1RfVU5SRUFDSDsKKwkJCXJlbF9jb2RlID0gSUNNUFY2X0FERFJfVU5SRUFDSDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgSUNNUF9USU1FX0VYQ0VFREVEOgorCQlpZiAoY29kZSAhPSBJQ01QX0VYQ19UVEwpCisJCQlyZXR1cm47CisJCXJlbF90eXBlID0gSUNNUFY2X1RJTUVfRVhDRUVEOworCQlyZWxfY29kZSA9IElDTVBWNl9FWENfSE9QTElNSVQ7CisJCWJyZWFrOworCX0KKworCS8qIFByZXBhcmUgZmFrZSBza2IgdG8gZmVlZCBpdCB0byBpY21wdjZfc2VuZCAqLworCXNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwlpZiAoc2tiMiA9PSBOVUxMKQorCQlyZXR1cm47CisJZHN0X3JlbGVhc2Uoc2tiMi0+ZHN0KTsKKwlza2IyLT5kc3QgPSBOVUxMOworCXNrYl9wdWxsKHNrYjIsIHNrYi0+ZGF0YSAtICh1OCopaXBoNik7CisJc2tiMi0+bmgucmF3ID0gc2tiMi0+ZGF0YTsKKworCS8qIFRyeSB0byBndWVzcyBpbmNvbWluZyBpbnRlcmZhY2UgKi8KKwlydDZpID0gcnQ2X2xvb2t1cCgmaXBoNi0+c2FkZHIsIE5VTEwsIE5VTEwsIDApOworCWlmIChydDZpICYmIHJ0NmktPnJ0NmlfZGV2KSB7CisJCXNrYjItPmRldiA9IHJ0NmktPnJ0NmlfZGV2OworCisJCXJ0NmkgPSBydDZfbG9va3VwKCZpcGg2LT5kYWRkciwgJmlwaDYtPnNhZGRyLCBOVUxMLCAwKTsKKworCQlpZiAocnQ2aSAmJiBydDZpLT5ydDZpX2RldiAmJiBydDZpLT5ydDZpX2Rldi0+dHlwZSA9PSBBUlBIUkRfU0lUKSB7CisJCQlzdHJ1Y3QgaXBfdHVubmVsICogdCA9IChzdHJ1Y3QgaXBfdHVubmVsKilydDZpLT5ydDZpX2Rldi0+cHJpdjsKKwkJCWlmIChyZWxfdHlwZSA9PSBJQ01QVjZfVElNRV9FWENFRUQgJiYgdC0+cGFybXMuaXBoLnR0bCkgeworCQkJCXJlbF90eXBlID0gSUNNUFY2X0RFU1RfVU5SRUFDSDsKKwkJCQlyZWxfY29kZSA9IElDTVBWNl9BRERSX1VOUkVBQ0g7CisJCQl9CisJCQlpY21wdjZfc2VuZChza2IyLCByZWxfdHlwZSwgcmVsX2NvZGUsIHJlbF9pbmZvLCBza2IyLT5kZXYpOworCQl9CisJfQorCWtmcmVlX3NrYihza2IyKTsKKwlyZXR1cm47CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlwaXA2X2Vjbl9kZWNhcHN1bGF0ZShzdHJ1Y3QgaXBoZHIgKmlwaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAoSU5FVF9FQ05faXNfY2UoaXBoLT50b3MpKQorCQlJUDZfRUNOX3NldF9jZShza2ItPm5oLmlwdjZoKTsKK30KKworc3RhdGljIGludCBpcGlwNl9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwlzdHJ1Y3QgaXBfdHVubmVsICp0dW5uZWw7CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKSkKKwkJZ290byBvdXQ7CisKKwlpcGggPSBza2ItPm5oLmlwaDsKKworCXJlYWRfbG9jaygmaXBpcDZfbG9jayk7CisJaWYgKCh0dW5uZWwgPSBpcGlwNl90dW5uZWxfbG9va3VwKGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIpKSAhPSBOVUxMKSB7CisJCXNlY3BhdGhfcmVzZXQoc2tiKTsKKwkJc2tiLT5tYWMucmF3ID0gc2tiLT5uaC5yYXc7CisJCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCQltZW1zZXQoJihJUENCKHNrYiktPm9wdCksIDAsIHNpemVvZihzdHJ1Y3QgaXBfb3B0aW9ucykpOworCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVBWNik7CisJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKKwkJdHVubmVsLT5zdGF0LnJ4X3BhY2tldHMrKzsKKwkJdHVubmVsLT5zdGF0LnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQlza2ItPmRldiA9IHR1bm5lbC0+ZGV2OworCQlkc3RfcmVsZWFzZShza2ItPmRzdCk7CisJCXNrYi0+ZHN0ID0gTlVMTDsKKwkJbmZfcmVzZXQoc2tiKTsKKwkJaXBpcDZfZWNuX2RlY2Fwc3VsYXRlKGlwaCwgc2tiKTsKKwkJbmV0aWZfcngoc2tiKTsKKwkJcmVhZF91bmxvY2soJmlwaXA2X2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisKKwlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCwgSUNNUF9QUk9UX1VOUkVBQ0gsIDApOworCWtmcmVlX3NrYihza2IpOworCXJlYWRfdW5sb2NrKCZpcGlwNl9sb2NrKTsKK291dDoKKwlyZXR1cm4gMDsKK30KKworLyogUmV0dXJucyB0aGUgZW1iZWRkZWQgSVB2NCBhZGRyZXNzIGlmIHRoZSBJUHY2IGFkZHJlc3MKKyAgIGNvbWVzIGZyb20gNnRvNCAoUkZDIDMwNTYpIGFkZHIgc3BhY2UgKi8KKworc3RhdGljIGlubGluZSB1MzIgdHJ5XzZ0bzQoc3RydWN0IGluNl9hZGRyICp2NmRzdCkKK3sKKwl1MzIgZHN0ID0gMDsKKworCWlmICh2NmRzdC0+czZfYWRkcjE2WzBdID09IGh0b25zKDB4MjAwMikpIHsKKwkgICAgICAgIC8qIDZ0bzQgdjYgYWRkciBoYXMgMTYgYml0cyBwcmVmaXgsIDMyIHY0YWRkciwgMTYgU0xBLCAuLi4gKi8KKwkJbWVtY3B5KCZkc3QsICZ2NmRzdC0+czZfYWRkcjE2WzFdLCA0KTsKKwl9CisJcmV0dXJuIGRzdDsKK30KKworLyoKKyAqCVRoaXMgZnVuY3Rpb24gYXNzdW1lcyBpdCBpcyBiZWluZyBjYWxsZWQgZnJvbSBkZXZfcXVldWVfeG1pdCgpCisgKglhbmQgdGhhdCBza2IgaXMgZmlsbGVkIHByb3Blcmx5IGJ5IHRoYXQgZnVuY3Rpb24uCisgKi8KKworc3RhdGljIGludCBpcGlwNl90dW5uZWxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpcF90dW5uZWwgKnR1bm5lbCA9IChzdHJ1Y3QgaXBfdHVubmVsKilkZXYtPnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnR1bm5lbC0+c3RhdDsKKwlzdHJ1Y3QgaXBoZHIgICp0aXBoID0gJnR1bm5lbC0+cGFybXMuaXBoOworCXN0cnVjdCBpcHY2aGRyICppcGg2ID0gc2tiLT5uaC5pcHY2aDsKKwl1OCAgICAgdG9zID0gdHVubmVsLT5wYXJtcy5pcGgudG9zOworCXN0cnVjdCBydGFibGUgKnJ0OyAgICAgCQkJLyogUm91dGUgdG8gdGhlIG90aGVyIGhvc3QgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqdGRldjsJCQkvKiBEZXZpY2UgdG8gb3RoZXIgaG9zdCAqLworCXN0cnVjdCBpcGhkciAgKmlwaDsJCQkvKiBPdXIgbmV3IElQIGhlYWRlciAqLworCWludCAgICBtYXhfaGVhZHJvb207CQkJLyogVGhlIGV4dHJhIGhlYWRlciBzcGFjZSBuZWVkZWQgKi8KKwl1MzIgICAgZHN0ID0gdGlwaC0+ZGFkZHI7CisJaW50ICAgIG10dTsKKwlzdHJ1Y3QgaW42X2FkZHIgKmFkZHI2OwkKKwlpbnQgYWRkcl90eXBlOworCisJaWYgKHR1bm5lbC0+cmVjdXJzaW9uKyspIHsKKwkJdHVubmVsLT5zdGF0LmNvbGxpc2lvbnMrKzsKKwkJZ290byB0eF9lcnJvcjsKKwl9CisKKwlpZiAoc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF9JUFY2KSkKKwkJZ290byB0eF9lcnJvcjsKKworCWlmICghZHN0KQorCQlkc3QgPSB0cnlfNnRvNCgmaXBoNi0+ZGFkZHIpOworCisJaWYgKCFkc3QpIHsKKwkJc3RydWN0IG5laWdoYm91ciAqbmVpZ2ggPSBOVUxMOworCisJCWlmIChza2ItPmRzdCkKKwkJCW5laWdoID0gc2tiLT5kc3QtPm5laWdoYm91cjsKKworCQlpZiAobmVpZ2ggPT0gTlVMTCkgeworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAic2l0OiBuZXh0aG9wID09IE5VTExcbiIpOworCQkJZ290byB0eF9lcnJvcjsKKwkJfQorCisJCWFkZHI2ID0gKHN0cnVjdCBpbjZfYWRkciopJm5laWdoLT5wcmltYXJ5X2tleTsKKwkJYWRkcl90eXBlID0gaXB2Nl9hZGRyX3R5cGUoYWRkcjYpOworCisJCWlmIChhZGRyX3R5cGUgPT0gSVBWNl9BRERSX0FOWSkgeworCQkJYWRkcjYgPSAmc2tiLT5uaC5pcHY2aC0+ZGFkZHI7CisJCQlhZGRyX3R5cGUgPSBpcHY2X2FkZHJfdHlwZShhZGRyNik7CisJCX0KKworCQlpZiAoKGFkZHJfdHlwZSAmIElQVjZfQUREUl9DT01QQVR2NCkgPT0gMCkKKwkJCWdvdG8gdHhfZXJyb3JfaWNtcDsKKworCQlkc3QgPSBhZGRyNi0+czZfYWRkcjMyWzNdOworCX0KKworCXsKKwkJc3RydWN0IGZsb3dpIGZsID0geyAubmxfdSA9IHsgLmlwNF91ID0KKwkJCQkJICAgICAgeyAuZGFkZHIgPSBkc3QsCisJCQkJCQkuc2FkZHIgPSB0aXBoLT5zYWRkciwKKwkJCQkJCS50b3MgPSBSVF9UT1ModG9zKSB9IH0sCisJCQkJICAgIC5vaWYgPSB0dW5uZWwtPnBhcm1zLmxpbmssCisJCQkJICAgIC5wcm90byA9IElQUFJPVE9fSVBWNiB9OworCQlpZiAoaXBfcm91dGVfb3V0cHV0X2tleSgmcnQsICZmbCkpIHsKKwkJCXR1bm5lbC0+c3RhdC50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJZ290byB0eF9lcnJvcl9pY21wOworCQl9CisJfQorCWlmIChydC0+cnRfdHlwZSAhPSBSVE5fVU5JQ0FTVCkgeworCQlpcF9ydF9wdXQocnQpOworCQl0dW5uZWwtPnN0YXQudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJZ290byB0eF9lcnJvcl9pY21wOworCX0KKwl0ZGV2ID0gcnQtPnUuZHN0LmRldjsKKworCWlmICh0ZGV2ID09IGRldikgeworCQlpcF9ydF9wdXQocnQpOworCQl0dW5uZWwtPnN0YXQuY29sbGlzaW9ucysrOworCQlnb3RvIHR4X2Vycm9yOworCX0KKworCWlmICh0aXBoLT5mcmFnX29mZikKKwkJbXR1ID0gZHN0X210dSgmcnQtPnUuZHN0KSAtIHNpemVvZihzdHJ1Y3QgaXBoZHIpOworCWVsc2UKKwkJbXR1ID0gc2tiLT5kc3QgPyBkc3RfbXR1KHNrYi0+ZHN0KSA6IGRldi0+bXR1OworCisJaWYgKG10dSA8IDY4KSB7CisJCXR1bm5lbC0+c3RhdC5jb2xsaXNpb25zKys7CisJCWlwX3J0X3B1dChydCk7CisJCWdvdG8gdHhfZXJyb3I7CisJfQorCWlmIChtdHUgPCBJUFY2X01JTl9NVFUpCisJCW10dSA9IElQVjZfTUlOX01UVTsKKwlpZiAodHVubmVsLT5wYXJtcy5pcGguZGFkZHIgJiYgc2tiLT5kc3QpCisJCXNrYi0+ZHN0LT5vcHMtPnVwZGF0ZV9wbXR1KHNrYi0+ZHN0LCBtdHUpOworCisJaWYgKHNrYi0+bGVuID4gbXR1KSB7CisJCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1BLVF9UT09CSUcsIDAsIG10dSwgZGV2KTsKKwkJaXBfcnRfcHV0KHJ0KTsKKwkJZ290byB0eF9lcnJvcjsKKwl9CisKKwlpZiAodHVubmVsLT5lcnJfY291bnQgPiAwKSB7CisJCWlmIChqaWZmaWVzIC0gdHVubmVsLT5lcnJfdGltZSA8IElQVFVOTkVMX0VSUl9USU1FTykgeworCQkJdHVubmVsLT5lcnJfY291bnQtLTsKKwkJCWRzdF9saW5rX2ZhaWx1cmUoc2tiKTsKKwkJfSBlbHNlCisJCQl0dW5uZWwtPmVycl9jb3VudCA9IDA7CisJfQorCisJLyoKKwkgKiBPa2F5LCBub3cgc2VlIGlmIHdlIGNhbiBzdHVmZiBpdCBpbiB0aGUgYnVmZmVyIGFzLWlzLgorCSAqLworCW1heF9oZWFkcm9vbSA9IExMX1JFU0VSVkVEX1NQQUNFKHRkZXYpK3NpemVvZihzdHJ1Y3QgaXBoZHIpOworCisJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgbWF4X2hlYWRyb29tIHx8IHNrYl9jbG9uZWQoc2tiKSB8fCBza2Jfc2hhcmVkKHNrYikpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2IgPSBza2JfcmVhbGxvY19oZWFkcm9vbShza2IsIG1heF9oZWFkcm9vbSk7CisJCWlmICghbmV3X3NrYikgeworCQkJaXBfcnRfcHV0KHJ0KTsKKyAgCQkJc3RhdHMtPnR4X2Ryb3BwZWQrKzsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXR1bm5lbC0+cmVjdXJzaW9uLS07CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoc2tiLT5zaykKKwkJCXNrYl9zZXRfb3duZXJfdyhuZXdfc2tiLCBza2ItPnNrKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlza2IgPSBuZXdfc2tiOworCQlpcGg2ID0gc2tiLT5uaC5pcHY2aDsKKwl9CisKKwlza2ItPmgucmF3ID0gc2tiLT5uaC5yYXc7CisJc2tiLT5uaC5yYXcgPSBza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKKwltZW1zZXQoJihJUENCKHNrYiktPm9wdCksIDAsIHNpemVvZihJUENCKHNrYiktPm9wdCkpOworCWRzdF9yZWxlYXNlKHNrYi0+ZHN0KTsKKwlza2ItPmRzdCA9ICZydC0+dS5kc3Q7CisKKwkvKgorCSAqCVB1c2ggZG93biBhbmQgaW5zdGFsbCB0aGUgSVBJUCBoZWFkZXIuCisJICovCisKKwlpcGggCQkJPQlza2ItPm5oLmlwaDsKKwlpcGgtPnZlcnNpb24JCT0JNDsKKwlpcGgtPmlobAkJPQlzaXplb2Yoc3RydWN0IGlwaGRyKT4+MjsKKwlpZiAobXR1ID4gSVBWNl9NSU5fTVRVKQorCQlpcGgtPmZyYWdfb2ZmCT0JaHRvbnMoSVBfREYpOworCWVsc2UKKwkJaXBoLT5mcmFnX29mZgk9CTA7CisKKwlpcGgtPnByb3RvY29sCQk9CUlQUFJPVE9fSVBWNjsKKwlpcGgtPnRvcwkJPQlJTkVUX0VDTl9lbmNhcHN1bGF0ZSh0b3MsIGlwdjZfZ2V0X2RzZmllbGQoaXBoNikpOworCWlwaC0+ZGFkZHIJCT0JcnQtPnJ0X2RzdDsKKwlpcGgtPnNhZGRyCQk9CXJ0LT5ydF9zcmM7CisKKwlpZiAoKGlwaC0+dHRsID0gdGlwaC0+dHRsKSA9PSAwKQorCQlpcGgtPnR0bAk9CWlwaDYtPmhvcF9saW1pdDsKKworCW5mX3Jlc2V0KHNrYik7CisKKwlJUFRVTk5FTF9YTUlUKCk7CisJdHVubmVsLT5yZWN1cnNpb24tLTsKKwlyZXR1cm4gMDsKKwordHhfZXJyb3JfaWNtcDoKKwlkc3RfbGlua19mYWlsdXJlKHNrYik7Cit0eF9lcnJvcjoKKwlzdGF0cy0+dHhfZXJyb3JzKys7CisJZGV2X2tmcmVlX3NrYihza2IpOworCXR1bm5lbC0+cmVjdXJzaW9uLS07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lwaXA2X3R1bm5lbF9pb2N0bCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGlwX3R1bm5lbF9wYXJtIHA7CisJc3RydWN0IGlwX3R1bm5lbCAqdDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR0VUVFVOTkVMOgorCQl0ID0gTlVMTDsKKwkJaWYgKGRldiA9PSBpcGlwNl9mYl90dW5uZWxfZGV2KSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnAsIGlmci0+aWZyX2lmcnUuaWZydV9kYXRhLCBzaXplb2YocCkpKSB7CisJCQkJZXJyID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXQgPSBpcGlwNl90dW5uZWxfbG9jYXRlKCZwLCAwKTsKKwkJfQorCQlpZiAodCA9PSBOVUxMKQorCQkJdCA9IChzdHJ1Y3QgaXBfdHVubmVsKilkZXYtPnByaXY7CisJCW1lbWNweSgmcCwgJnQtPnBhcm1zLCBzaXplb2YocCkpOworCQlpZiAoY29weV90b191c2VyKGlmci0+aWZyX2lmcnUuaWZydV9kYXRhLCAmcCwgc2l6ZW9mKHApKSkKKwkJCWVyciA9IC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBTSU9DQUREVFVOTkVMOgorCWNhc2UgU0lPQ0NIR1RVTk5FTDoKKwkJZXJyID0gLUVQRVJNOworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlnb3RvIGRvbmU7CisKKwkJZXJyID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLCBpZnItPmlmcl9pZnJ1LmlmcnVfZGF0YSwgc2l6ZW9mKHApKSkKKwkJCWdvdG8gZG9uZTsKKworCQllcnIgPSAtRUlOVkFMOworCQlpZiAocC5pcGgudmVyc2lvbiAhPSA0IHx8IHAuaXBoLnByb3RvY29sICE9IElQUFJPVE9fSVBWNiB8fAorCQkgICAgcC5pcGguaWhsICE9IDUgfHwgKHAuaXBoLmZyYWdfb2ZmJmh0b25zKH5JUF9ERikpKQorCQkJZ290byBkb25lOworCQlpZiAocC5pcGgudHRsKQorCQkJcC5pcGguZnJhZ19vZmYgfD0gaHRvbnMoSVBfREYpOworCisJCXQgPSBpcGlwNl90dW5uZWxfbG9jYXRlKCZwLCBjbWQgPT0gU0lPQ0FERFRVTk5FTCk7CisKKwkJaWYgKGRldiAhPSBpcGlwNl9mYl90dW5uZWxfZGV2ICYmIGNtZCA9PSBTSU9DQ0hHVFVOTkVMKSB7CisJCQlpZiAodCAhPSBOVUxMKSB7CisJCQkJaWYgKHQtPmRldiAhPSBkZXYpIHsKKwkJCQkJZXJyID0gLUVFWElTVDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoKChkZXYtPmZsYWdzJklGRl9QT0lOVE9QT0lOVCkgJiYgIXAuaXBoLmRhZGRyKSB8fAorCQkJCSAgICAoIShkZXYtPmZsYWdzJklGRl9QT0lOVE9QT0lOVCkgJiYgcC5pcGguZGFkZHIpKSB7CisJCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQl0ID0gKHN0cnVjdCBpcF90dW5uZWwqKWRldi0+cHJpdjsKKwkJCQlpcGlwNl90dW5uZWxfdW5saW5rKHQpOworCQkJCXQtPnBhcm1zLmlwaC5zYWRkciA9IHAuaXBoLnNhZGRyOworCQkJCXQtPnBhcm1zLmlwaC5kYWRkciA9IHAuaXBoLmRhZGRyOworCQkJCW1lbWNweShkZXYtPmRldl9hZGRyLCAmcC5pcGguc2FkZHIsIDQpOworCQkJCW1lbWNweShkZXYtPmJyb2FkY2FzdCwgJnAuaXBoLmRhZGRyLCA0KTsKKwkJCQlpcGlwNl90dW5uZWxfbGluayh0KTsKKwkJCQluZXRkZXZfc3RhdGVfY2hhbmdlKGRldik7CisJCQl9CisJCX0KKworCQlpZiAodCkgeworCQkJZXJyID0gMDsKKwkJCWlmIChjbWQgPT0gU0lPQ0NIR1RVTk5FTCkgeworCQkJCXQtPnBhcm1zLmlwaC50dGwgPSBwLmlwaC50dGw7CisJCQkJdC0+cGFybXMuaXBoLnRvcyA9IHAuaXBoLnRvczsKKwkJCX0KKwkJCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfaWZydS5pZnJ1X2RhdGEsICZ0LT5wYXJtcywgc2l6ZW9mKHApKSkKKwkJCQllcnIgPSAtRUZBVUxUOworCQl9IGVsc2UKKwkJCWVyciA9IChjbWQgPT0gU0lPQ0FERFRVTk5FTCA/IC1FTk9CVUZTIDogLUVOT0VOVCk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DREVMVFVOTkVMOgorCQllcnIgPSAtRVBFUk07CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCWdvdG8gZG9uZTsKKworCQlpZiAoZGV2ID09IGlwaXA2X2ZiX3R1bm5lbF9kZXYpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnAsIGlmci0+aWZyX2lmcnUuaWZydV9kYXRhLCBzaXplb2YocCkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCWVyciA9IC1FTk9FTlQ7CisJCQlpZiAoKHQgPSBpcGlwNl90dW5uZWxfbG9jYXRlKCZwLCAwKSkgPT0gTlVMTCkKKwkJCQlnb3RvIGRvbmU7CisJCQllcnIgPSAtRVBFUk07CisJCQlpZiAodCA9PSBpcGlwNl9mYl90dW5uZWxfZGV2LT5wcml2KQorCQkJCWdvdG8gZG9uZTsKKwkJCWRldiA9IHQtPmRldjsKKwkJfQorCQllcnIgPSB1bnJlZ2lzdGVyX25ldGRldmljZShkZXYpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FSU5WQUw7CisJfQorCitkb25lOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXBpcDZfdHVubmVsX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiAmKCgoc3RydWN0IGlwX3R1bm5lbCopZGV2LT5wcml2KS0+c3RhdCk7Cit9CisKK3N0YXRpYyBpbnQgaXBpcDZfdHVubmVsX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJaWYgKG5ld19tdHUgPCBJUFY2X01JTl9NVFUgfHwgbmV3X210dSA+IDB4RkZGOCAtIHNpemVvZihzdHJ1Y3QgaXBoZHIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZXYtPm10dSA9IG5ld19tdHU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlwaXA2X3R1bm5lbF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlkZXYtPnVuaW5pdAkJPSBpcGlwNl90dW5uZWxfdW5pbml0OworCWRldi0+ZGVzdHJ1Y3RvciAJPSBmcmVlX25ldGRldjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IGlwaXA2X3R1bm5lbF94bWl0OworCWRldi0+Z2V0X3N0YXRzCQk9IGlwaXA2X3R1bm5lbF9nZXRfc3RhdHM7CisJZGV2LT5kb19pb2N0bAkJPSBpcGlwNl90dW5uZWxfaW9jdGw7CisJZGV2LT5jaGFuZ2VfbXR1CQk9IGlwaXA2X3R1bm5lbF9jaGFuZ2VfbXR1OworCisJZGV2LT50eXBlCQk9IEFSUEhSRF9TSVQ7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4gCT0gTExfTUFYX0hFQURFUiArIHNpemVvZihzdHJ1Y3QgaXBoZHIpOworCWRldi0+bXR1CQk9IDE1MDAgLSBzaXplb2Yoc3RydWN0IGlwaGRyKTsKKwlkZXYtPmZsYWdzCQk9IElGRl9OT0FSUDsKKwlkZXYtPmlmbGluawkJPSAwOworCWRldi0+YWRkcl9sZW4JCT0gNDsKK30KKworc3RhdGljIGludCBpcGlwNl90dW5uZWxfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICp0ZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgaXBfdHVubmVsICp0dW5uZWw7CisJc3RydWN0IGlwaGRyICppcGg7CisKKwl0dW5uZWwgPSAoc3RydWN0IGlwX3R1bm5lbCopZGV2LT5wcml2OworCWlwaCA9ICZ0dW5uZWwtPnBhcm1zLmlwaDsKKworCXR1bm5lbC0+ZGV2ID0gZGV2OworCXN0cmNweSh0dW5uZWwtPnBhcm1zLm5hbWUsIGRldi0+bmFtZSk7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgJnR1bm5lbC0+cGFybXMuaXBoLnNhZGRyLCA0KTsKKwltZW1jcHkoZGV2LT5icm9hZGNhc3QsICZ0dW5uZWwtPnBhcm1zLmlwaC5kYWRkciwgNCk7CisKKwlpZiAoaXBoLT5kYWRkcikgeworCQlzdHJ1Y3QgZmxvd2kgZmwgPSB7IC5ubF91ID0geyAuaXA0X3UgPQorCQkJCQkgICAgICB7IC5kYWRkciA9IGlwaC0+ZGFkZHIsCisJCQkJCQkuc2FkZHIgPSBpcGgtPnNhZGRyLAorCQkJCQkJLnRvcyA9IFJUX1RPUyhpcGgtPnRvcykgfSB9LAorCQkJCSAgICAub2lmID0gdHVubmVsLT5wYXJtcy5saW5rLAorCQkJCSAgICAucHJvdG8gPSBJUFBST1RPX0lQVjYgfTsKKwkJc3RydWN0IHJ0YWJsZSAqcnQ7CisJCWlmICghaXBfcm91dGVfb3V0cHV0X2tleSgmcnQsICZmbCkpIHsKKwkJCXRkZXYgPSBydC0+dS5kc3QuZGV2OworCQkJaXBfcnRfcHV0KHJ0KTsKKwkJfQorCQlkZXYtPmZsYWdzIHw9IElGRl9QT0lOVE9QT0lOVDsKKwl9CisKKwlpZiAoIXRkZXYgJiYgdHVubmVsLT5wYXJtcy5saW5rKQorCQl0ZGV2ID0gX19kZXZfZ2V0X2J5X2luZGV4KHR1bm5lbC0+cGFybXMubGluayk7CisKKwlpZiAodGRldikgeworCQlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IHRkZXYtPmhhcmRfaGVhZGVyX2xlbiArIHNpemVvZihzdHJ1Y3QgaXBoZHIpOworCQlkZXYtPm10dSA9IHRkZXYtPm10dSAtIHNpemVvZihzdHJ1Y3QgaXBoZHIpOworCQlpZiAoZGV2LT5tdHUgPCBJUFY2X01JTl9NVFUpCisJCQlkZXYtPm10dSA9IElQVjZfTUlOX01UVTsKKwl9CisJZGV2LT5pZmxpbmsgPSB0dW5uZWwtPnBhcm1zLmxpbms7CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9faW5pdCBpcGlwNl9mYl90dW5uZWxfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpcF90dW5uZWwgKnR1bm5lbCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9ICZ0dW5uZWwtPnBhcm1zLmlwaDsKKworCXR1bm5lbC0+ZGV2ID0gZGV2OworCXN0cmNweSh0dW5uZWwtPnBhcm1zLm5hbWUsIGRldi0+bmFtZSk7CisKKwlpcGgtPnZlcnNpb24JCT0gNDsKKwlpcGgtPnByb3RvY29sCQk9IElQUFJPVE9fSVBWNjsKKwlpcGgtPmlobAkJPSA1OworCWlwaC0+dHRsCQk9IDY0OworCisJZGV2X2hvbGQoZGV2KTsKKwl0dW5uZWxzX3djWzBdCQk9IHR1bm5lbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9jb2wgc2l0X3Byb3RvY29sID0geworCS5oYW5kbGVyCT0JaXBpcDZfcmN2LAorCS5lcnJfaGFuZGxlcgk9CWlwaXA2X2VyciwKK307CisKK3ZvaWQgX19leGl0IHNpdF9jbGVhbnVwKHZvaWQpCit7CisJaW5ldF9kZWxfcHJvdG9jb2woJnNpdF9wcm90b2NvbCwgSVBQUk9UT19JUFY2KTsKKwl1bnJlZ2lzdGVyX25ldGRldihpcGlwNl9mYl90dW5uZWxfZGV2KTsKK30KKworaW50IF9faW5pdCBzaXRfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwlwcmludGsoS0VSTl9JTkZPICJJUHY2IG92ZXIgSVB2NCB0dW5uZWxpbmcgZHJpdmVyXG4iKTsKKworCWlmIChpbmV0X2FkZF9wcm90b2NvbCgmc2l0X3Byb3RvY29sLCBJUFBST1RPX0lQVjYpIDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJzaXQgaW5pdDogQ2FuJ3QgYWRkIHByb3RvY29sXG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJaXBpcDZfZmJfdHVubmVsX2RldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IGlwX3R1bm5lbCksICJzaXQwIiwgCisJCQkJCSAgIGlwaXA2X3R1bm5lbF9zZXR1cCk7CisJaWYgKCFpcGlwNl9mYl90dW5uZWxfZGV2KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyMTsKKwl9CisKKwlpcGlwNl9mYl90dW5uZWxfZGV2LT5pbml0ID0gaXBpcDZfZmJfdHVubmVsX2luaXQ7CisKKwlpZiAoKGVyciA9ICByZWdpc3Rlcl9uZXRkZXYoaXBpcDZfZmJfdHVubmVsX2RldikpKQorCQlnb3RvIGVycjI7CisKKyBvdXQ6CisJcmV0dXJuIGVycjsKKyBlcnIyOgorCWZyZWVfbmV0ZGV2KGlwaXA2X2ZiX3R1bm5lbF9kZXYpOworIGVycjE6CisJaW5ldF9kZWxfcHJvdG9jb2woJnNpdF9wcm90b2NvbCwgSVBQUk9UT19JUFY2KTsKKwlnb3RvIG91dDsKK30KZGlmZiAtLWdpdCBhL25ldC9pcHY2L3N5c2N0bF9uZXRfaXB2Ni5jIGIvbmV0L2lwdjYvc3lzY3RsX25ldF9pcHY2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ExOGUwZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY2L3N5c2N0bF9uZXRfaXB2Ni5jCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogc3lzY3RsX25ldF9pcHY2LmM6IHN5c2N0bCBpbnRlcmZhY2UgdG8gbmV0IElQVjYgc3Vic3lzdGVtLgorICoKKyAqIENoYW5nZXM6CisgKiBZT1NISUZVSkkgSGlkZWFraSBAVVNBR0k6CWFkZGVkIGljbXAgc3lzY3RsIHRhYmxlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvbmRpc2MuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgorCitleHRlcm4gY3RsX3RhYmxlIGlwdjZfcm91dGVfdGFibGVbXTsKK2V4dGVybiBjdGxfdGFibGUgaXB2Nl9pY21wX3RhYmxlW107CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisKK3N0YXRpYyBjdGxfdGFibGUgaXB2Nl90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjZfUk9VVEUsCisJCS5wcm9jbmFtZQk9ICJyb3V0ZSIsCisJCS5tYXhsZW4JCT0gMCwKKwkJLm1vZGUJCT0gMDU1NSwKKwkJLmNoaWxkCQk9IGlwdjZfcm91dGVfdGFibGUKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjZfSUNNUCwKKwkJLnByb2NuYW1lCT0gImljbXAiLAorCQkubWF4bGVuCQk9IDAsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSBpcHY2X2ljbXBfdGFibGUKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjZfQklORFY2T05MWSwKKwkJLnByb2NuYW1lCT0gImJpbmR2Nm9ubHkiLAorCQkuZGF0YQkJPSAmc3lzY3RsX2lwdjZfYmluZHY2b25seSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY2X0lQNkZSQUdfSElHSF9USFJFU0gsCisJCS5wcm9jbmFtZQk9ICJpcDZmcmFnX2hpZ2hfdGhyZXNoIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9pcDZmcmFnX2hpZ2hfdGhyZXNoLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjZfSVA2RlJBR19MT1dfVEhSRVNILAorCQkucHJvY25hbWUJPSAiaXA2ZnJhZ19sb3dfdGhyZXNoIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9pcDZmcmFnX2xvd190aHJlc2gsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNl9JUDZGUkFHX1RJTUUsCisJCS5wcm9jbmFtZQk9ICJpcDZmcmFnX3RpbWUiLAorCQkuZGF0YQkJPSAmc3lzY3RsX2lwNmZyYWdfdGltZSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjZfSVA2RlJBR19TRUNSRVRfSU5URVJWQUwsCisJCS5wcm9jbmFtZQk9ICJpcDZmcmFnX3NlY3JldF9pbnRlcnZhbCIsCisJCS5kYXRhCQk9ICZzeXNjdGxfaXA2ZnJhZ19zZWNyZXRfaW50ZXJ2YWwsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ppZmZpZXMKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjZfTUxEX01BWF9NU0YsCisJCS5wcm9jbmFtZQk9ICJtbGRfbWF4X21zZiIsCisJCS5kYXRhCQk9ICZzeXNjdGxfbWxkX21heF9tc2YsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqaXB2Nl9zeXNjdGxfaGVhZGVyOworCitzdGF0aWMgY3RsX3RhYmxlIGlwdjZfbmV0X3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNiwKKwkJLnByb2NuYW1lCT0gImlwdjYiLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gaXB2Nl90YWJsZQorCX0sCisgICAgICAgIHsgLmN0bF9uYW1lID0gMCB9Cit9OworCitzdGF0aWMgY3RsX3RhYmxlIGlwdjZfcm9vdF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX05FVCwKKwkJLnByb2NuYW1lCT0gIm5ldCIsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSBpcHY2X25ldF90YWJsZQorCX0sCisgICAgICAgIHsgLmN0bF9uYW1lID0gMCB9Cit9OworCit2b2lkIGlwdjZfc3lzY3RsX3JlZ2lzdGVyKHZvaWQpCit7CisJaXB2Nl9zeXNjdGxfaGVhZGVyID0gcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGlwdjZfcm9vdF90YWJsZSwgMCk7Cit9CisKK3ZvaWQgaXB2Nl9zeXNjdGxfdW5yZWdpc3Rlcih2b2lkKQoreworCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGlwdjZfc3lzY3RsX2hlYWRlcik7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCisKKworCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni90Y3BfaXB2Ni5jIGIvbmV0L2lwdjYvdGNwX2lwdjYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzYwYzg1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvdGNwX2lwdjYuYwpAQCAtMCwwICsxLDIyNjUgQEAKKy8qCisgKglUQ1Agb3ZlciBJUHY2CisgKglMaW51eCBJTkVUNiBpbXBsZW1lbnRhdGlvbiAKKyAqCisgKglBdXRob3JzOgorICoJUGVkcm8gUm9xdWUJCTxyb3F1ZUBkaS5mYy51bC5wdD4JCisgKgorICoJJElkOiB0Y3BfaXB2Ni5jLHYgMS4xNDQgMjAwMi8wMi8wMSAyMjowMTowNCBkYXZlbSBFeHAgJAorICoKKyAqCUJhc2VkIG9uOiAKKyAqCWxpbnV4L25ldC9pcHY0L3RjcC5jCisgKglsaW51eC9uZXQvaXB2NC90Y3BfaW5wdXQuYworICoJbGludXgvbmV0L2lwdjQvdGNwX291dHB1dC5jCisgKgorICoJRml4ZXM6CisgKglIaWRlYWtpIFlPU0hJRlVKSQk6CXNpbjZfc2NvcGVfaWQgc3VwcG9ydAorICoJWU9TSElGVUpJIEhpZGVha2kgQFVTQUdJIGFuZDoJU3VwcG9ydCBJUFY2X1Y2T05MWSBzb2NrZXQgb3B0aW9uLCB3aGljaAorICoJQWxleGV5IEt1em5ldHNvdgkJYWxsb3cgYm90aCBJUHY0IGFuZCBJUHY2IHNvY2tldHMgdG8gYmluZAorICoJCQkJCWEgc2luZ2xlIHBvcnQgYXQgdGhlIHNhbWUgdGltZS4KKyAqCVlPU0hJRlVKSSBIaWRlYWtpIEBVU0FHSToJY29udmVydCAvcHJvYy9uZXQvdGNwNiB0byBzZXFfZmlsZS4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwc2VjLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKworI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvbmRpc2MuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC90cmFuc3BfdjYuaD4KKyNpbmNsdWRlIDxuZXQvYWRkcmNvbmYuaD4KKyNpbmNsdWRlIDxuZXQvaXA2X3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L2lwNl9jaGVja3N1bS5oPgorI2luY2x1ZGUgPG5ldC9pbmV0X2Vjbi5oPgorI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgorI2luY2x1ZGUgPG5ldC94ZnJtLmg+CisjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CisjaW5jbHVkZSA8bmV0L3NubXAuaD4KKyNpbmNsdWRlIDxuZXQvZHNmaWVsZC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCitzdGF0aWMgdm9pZAl0Y3BfdjZfc2VuZF9yZXNldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkCXRjcF92Nl9vcl9zZW5kX2FjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgb3Blbl9yZXF1ZXN0ICpyZXEpOworc3RhdGljIHZvaWQJdGNwX3Y2X3NlbmRfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwaGRyICp0aCwgaW50IGxlbiwgCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworc3RhdGljIGludAl0Y3BfdjZfZG9fcmN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgaW50CXRjcF92Nl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIGludCBpcGZyYWdvayk7CisKK3N0YXRpYyBzdHJ1Y3QgdGNwX2Z1bmMgaXB2Nl9tYXBwZWQ7CitzdGF0aWMgc3RydWN0IHRjcF9mdW5jIGlwdjZfc3BlY2lmaWM7CisKKy8qIEkgaGF2ZSBubyBpZGVhIGlmIHRoaXMgaXMgYSBnb29kIGhhc2ggZm9yIHY2IG9yIG5vdC4gLURhdmVNICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdGNwX3Y2X2hhc2hmbihzdHJ1Y3QgaW42X2FkZHIgKmxhZGRyLCB1MTYgbHBvcnQsCisJCQkJICAgIHN0cnVjdCBpbjZfYWRkciAqZmFkZHIsIHUxNiBmcG9ydCkKK3sKKwlpbnQgaGFzaGVudCA9IChscG9ydCBeIGZwb3J0KTsKKworCWhhc2hlbnQgXj0gKGxhZGRyLT5zNl9hZGRyMzJbM10gXiBmYWRkci0+czZfYWRkcjMyWzNdKTsKKwloYXNoZW50IF49IGhhc2hlbnQ+PjE2OworCWhhc2hlbnQgXj0gaGFzaGVudD4+ODsKKwlyZXR1cm4gKGhhc2hlbnQgJiAodGNwX2VoYXNoX3NpemUgLSAxKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCB0Y3BfdjZfc2tfaGFzaGZuKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOworCXN0cnVjdCBpbjZfYWRkciAqbGFkZHIgPSAmbnAtPnJjdl9zYWRkcjsKKwlzdHJ1Y3QgaW42X2FkZHIgKmZhZGRyID0gJm5wLT5kYWRkcjsKKwlfX3UxNiBscG9ydCA9IGluZXQtPm51bTsKKwlfX3UxNiBmcG9ydCA9IGluZXQtPmRwb3J0OworCXJldHVybiB0Y3BfdjZfaGFzaGZuKGxhZGRyLCBscG9ydCwgZmFkZHIsIGZwb3J0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGNwX3Y2X2JpbmRfY29uZmxpY3Qoc3RydWN0IHNvY2sgKnNrLAorCQkJCSAgICAgICBzdHJ1Y3QgdGNwX2JpbmRfYnVja2V0ICp0YikKK3sKKwlzdHJ1Y3Qgc29jayAqc2syOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJLyogV2UgbXVzdCB3YWxrIHRoZSB3aG9sZSBwb3J0IG93bmVyIGxpc3QgaW4gdGhpcyBjYXNlLiAtRGF2ZU0gKi8KKwlza19mb3JfZWFjaF9ib3VuZChzazIsIG5vZGUsICZ0Yi0+b3duZXJzKSB7CisJCWlmIChzayAhPSBzazIgJiYKKwkJICAgICghc2stPnNrX2JvdW5kX2Rldl9pZiB8fAorCQkgICAgICFzazItPnNrX2JvdW5kX2Rldl9pZiB8fAorCQkgICAgIHNrLT5za19ib3VuZF9kZXZfaWYgPT0gc2syLT5za19ib3VuZF9kZXZfaWYpICYmCisJCSAgICAoIXNrLT5za19yZXVzZSB8fCAhc2syLT5za19yZXVzZSB8fAorCQkgICAgIHNrMi0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTikgJiYKKwkJICAgICBpcHY2X3Jjdl9zYWRkcl9lcXVhbChzaywgc2syKSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBub2RlICE9IE5VTEw7Cit9CisKKy8qIEdycnIsIGFkZHJfdHlwZSBhbHJlYWR5IGNhbGN1bGF0ZWQgYnkgY2FsbGVyLCBidXQgSSBkb24ndCB3YW50CisgKiB0byBhZGQgc29tZSBzaWxseSAiY29va2llIiBhcmd1bWVudCB0byB0aGlzIG1ldGhvZCBqdXN0IGZvciB0aGF0LgorICogQnV0IGl0IGRvZXNuJ3QgbWF0dGVyLCB0aGUgcmVjYWxjdWxhdGlvbiBpcyBpbiB0aGUgcmFyZXN0IHBhdGgKKyAqIHRoaXMgZnVuY3Rpb24gZXZlciB0YWtlcy4KKyAqLworc3RhdGljIGludCB0Y3BfdjZfZ2V0X3BvcnQoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBzaG9ydCBzbnVtKQoreworCXN0cnVjdCB0Y3BfYmluZF9oYXNoYnVja2V0ICpoZWFkOworCXN0cnVjdCB0Y3BfYmluZF9idWNrZXQgKnRiOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCWludCByZXQ7CisKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJaWYgKHNudW0gPT0gMCkgeworCQlpbnQgbG93ID0gc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMF07CisJCWludCBoaWdoID0gc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMV07CisJCWludCByZW1haW5pbmcgPSAoaGlnaCAtIGxvdykgKyAxOworCQlpbnQgcm92ZXI7CisKKwkJc3Bpbl9sb2NrKCZ0Y3BfcG9ydGFsbG9jX2xvY2spOworCQlyb3ZlciA9IHRjcF9wb3J0X3JvdmVyOworCQlkbyB7CXJvdmVyKys7CisJCQlpZiAoKHJvdmVyIDwgbG93KSB8fCAocm92ZXIgPiBoaWdoKSkKKwkJCQlyb3ZlciA9IGxvdzsKKwkJCWhlYWQgPSAmdGNwX2JoYXNoW3RjcF9iaGFzaGZuKHJvdmVyKV07CisJCQlzcGluX2xvY2soJmhlYWQtPmxvY2spOworCQkJdGJfZm9yX2VhY2godGIsIG5vZGUsICZoZWFkLT5jaGFpbikKKwkJCQlpZiAodGItPnBvcnQgPT0gcm92ZXIpCisJCQkJCWdvdG8gbmV4dDsKKwkJCWJyZWFrOworCQluZXh0OgorCQkJc3Bpbl91bmxvY2soJmhlYWQtPmxvY2spOworCQl9IHdoaWxlICgtLXJlbWFpbmluZyA+IDApOworCQl0Y3BfcG9ydF9yb3ZlciA9IHJvdmVyOworCQlzcGluX3VubG9jaygmdGNwX3BvcnRhbGxvY19sb2NrKTsKKworCQkvKiBFeGhhdXN0ZWQgbG9jYWwgcG9ydCByYW5nZSBkdXJpbmcgc2VhcmNoPyAqLworCQlyZXQgPSAxOworCQlpZiAocmVtYWluaW5nIDw9IDApCisJCQlnb3RvIGZhaWw7CisKKwkJLyogT0ssIGhlcmUgaXMgdGhlIG9uZSB3ZSB3aWxsIHVzZS4gKi8KKwkJc251bSA9IHJvdmVyOworCX0gZWxzZSB7CisJCWhlYWQgPSAmdGNwX2JoYXNoW3RjcF9iaGFzaGZuKHNudW0pXTsKKwkJc3Bpbl9sb2NrKCZoZWFkLT5sb2NrKTsKKwkJdGJfZm9yX2VhY2godGIsIG5vZGUsICZoZWFkLT5jaGFpbikKKwkJCWlmICh0Yi0+cG9ydCA9PSBzbnVtKQorCQkJCWdvdG8gdGJfZm91bmQ7CisJfQorCXRiID0gTlVMTDsKKwlnb3RvIHRiX25vdF9mb3VuZDsKK3RiX2ZvdW5kOgorCWlmICh0YiAmJiAhaGxpc3RfZW1wdHkoJnRiLT5vd25lcnMpKSB7CisJCWlmICh0Yi0+ZmFzdHJldXNlID4gMCAmJiBzay0+c2tfcmV1c2UgJiYKKwkJICAgIHNrLT5za19zdGF0ZSAhPSBUQ1BfTElTVEVOKSB7CisJCQlnb3RvIHN1Y2Nlc3M7CisJCX0gZWxzZSB7CisJCQlyZXQgPSAxOworCQkJaWYgKHRjcF92Nl9iaW5kX2NvbmZsaWN0KHNrLCB0YikpCisJCQkJZ290byBmYWlsX3VubG9jazsKKwkJfQorCX0KK3RiX25vdF9mb3VuZDoKKwlyZXQgPSAxOworCWlmICghdGIgJiYgKHRiID0gdGNwX2J1Y2tldF9jcmVhdGUoaGVhZCwgc251bSkpID09IE5VTEwpCisJCWdvdG8gZmFpbF91bmxvY2s7CisJaWYgKGhsaXN0X2VtcHR5KCZ0Yi0+b3duZXJzKSkgeworCQlpZiAoc2stPnNrX3JldXNlICYmIHNrLT5za19zdGF0ZSAhPSBUQ1BfTElTVEVOKQorCQkJdGItPmZhc3RyZXVzZSA9IDE7CisJCWVsc2UKKwkJCXRiLT5mYXN0cmV1c2UgPSAwOworCX0gZWxzZSBpZiAodGItPmZhc3RyZXVzZSAmJgorCQkgICAoIXNrLT5za19yZXVzZSB8fCBzay0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTikpCisJCXRiLT5mYXN0cmV1c2UgPSAwOworCitzdWNjZXNzOgorCWlmICghdGNwX3NrKHNrKS0+YmluZF9oYXNoKQorCQl0Y3BfYmluZF9oYXNoKHNrLCB0Yiwgc251bSk7CisJQlVHX1RSQVAodGNwX3NrKHNrKS0+YmluZF9oYXNoID09IHRiKTsKKwlyZXQgPSAwOworCitmYWlsX3VubG9jazoKKwlzcGluX3VubG9jaygmaGVhZC0+bG9jayk7CitmYWlsOgorCWxvY2FsX2JoX2VuYWJsZSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX190Y3BfdjZfaGFzaChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGhsaXN0X2hlYWQgKmxpc3Q7CisJcndsb2NrX3QgKmxvY2s7CisKKwlCVUdfVFJBUChza191bmhhc2hlZChzaykpOworCisJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOKSB7CisJCWxpc3QgPSAmdGNwX2xpc3RlbmluZ19oYXNoW3RjcF9za19saXN0ZW5faGFzaGZuKHNrKV07CisJCWxvY2sgPSAmdGNwX2xoYXNoX2xvY2s7CisJCXRjcF9saXN0ZW5fd2xvY2soKTsKKwl9IGVsc2UgeworCQlzay0+c2tfaGFzaGVudCA9IHRjcF92Nl9za19oYXNoZm4oc2spOworCQlsaXN0ID0gJnRjcF9laGFzaFtzay0+c2tfaGFzaGVudF0uY2hhaW47CisJCWxvY2sgPSAmdGNwX2VoYXNoW3NrLT5za19oYXNoZW50XS5sb2NrOworCQl3cml0ZV9sb2NrKGxvY2spOworCX0KKworCV9fc2tfYWRkX25vZGUoc2ssIGxpc3QpOworCXNvY2tfcHJvdF9pbmNfdXNlKHNrLT5za19wcm90KTsKKwl3cml0ZV91bmxvY2sobG9jayk7Cit9CisKKworc3RhdGljIHZvaWQgdGNwX3Y2X2hhc2goc3RydWN0IHNvY2sgKnNrKQoreworCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0NMT1NFKSB7CisJCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJCWlmICh0cC0+YWZfc3BlY2lmaWMgPT0gJmlwdjZfbWFwcGVkKSB7CisJCQl0Y3BfcHJvdC5oYXNoKHNrKTsKKwkJCXJldHVybjsKKwkJfQorCQlsb2NhbF9iaF9kaXNhYmxlKCk7CisJCV9fdGNwX3Y2X2hhc2goc2spOworCQlsb2NhbF9iaF9lbmFibGUoKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqdGNwX3Y2X2xvb2t1cF9saXN0ZW5lcihzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCB1bnNpZ25lZCBzaG9ydCBobnVtLCBpbnQgZGlmKQoreworCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlzdHJ1Y3Qgc29jayAqcmVzdWx0ID0gTlVMTDsKKwlpbnQgc2NvcmUsIGhpc2NvcmU7CisKKwloaXNjb3JlPTA7CisJcmVhZF9sb2NrKCZ0Y3BfbGhhc2hfbG9jayk7CisJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZ0Y3BfbGlzdGVuaW5nX2hhc2hbdGNwX2xoYXNoZm4oaG51bSldKSB7CisJCWlmIChpbmV0X3NrKHNrKS0+bnVtID09IGhudW0gJiYgc2stPnNrX2ZhbWlseSA9PSBQRl9JTkVUNikgeworCQkJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOworCQkJCisJCQlzY29yZSA9IDE7CisJCQlpZiAoIWlwdjZfYWRkcl9hbnkoJm5wLT5yY3Zfc2FkZHIpKSB7CisJCQkJaWYgKCFpcHY2X2FkZHJfZXF1YWwoJm5wLT5yY3Zfc2FkZHIsIGRhZGRyKSkKKwkJCQkJY29udGludWU7CisJCQkJc2NvcmUrKzsKKwkJCX0KKwkJCWlmIChzay0+c2tfYm91bmRfZGV2X2lmKSB7CisJCQkJaWYgKHNrLT5za19ib3VuZF9kZXZfaWYgIT0gZGlmKQorCQkJCQljb250aW51ZTsKKwkJCQlzY29yZSsrOworCQkJfQorCQkJaWYgKHNjb3JlID09IDMpIHsKKwkJCQlyZXN1bHQgPSBzazsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzY29yZSA+IGhpc2NvcmUpIHsKKwkJCQloaXNjb3JlID0gc2NvcmU7CisJCQkJcmVzdWx0ID0gc2s7CisJCQl9CisJCX0KKwl9CisJaWYgKHJlc3VsdCkKKwkJc29ja19ob2xkKHJlc3VsdCk7CisJcmVhZF91bmxvY2soJnRjcF9saGFzaF9sb2NrKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBTb2NrZXRzIGluIFRDUF9DTE9TRSBzdGF0ZSBhcmUgX2Fsd2F5c18gdGFrZW4gb3V0IG9mIHRoZSBoYXNoLCBzbworICogd2UgbmVlZCBub3QgY2hlY2sgaXQgZm9yIFRDUCBsb29rdXBzIGFueW1vcmUsIHRoYW5rcyBBbGV4ZXkuIC1EYXZlTQorICoKKyAqIFRoZSBzb2NraGFzaCBsb2NrIG11c3QgYmUgaGVsZCBhcyBhIHJlYWRlciBoZXJlLgorICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2sgKl9fdGNwX3Y2X2xvb2t1cF9lc3RhYmxpc2hlZChzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCB1MTYgc3BvcnQsCisJCQkJCQkgICAgICAgc3RydWN0IGluNl9hZGRyICpkYWRkciwgdTE2IGhudW0sCisJCQkJCQkgICAgICAgaW50IGRpZikKK3sKKwlzdHJ1Y3QgdGNwX2VoYXNoX2J1Y2tldCAqaGVhZDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJX191MzIgcG9ydHMgPSBUQ1BfQ09NQklORURfUE9SVFMoc3BvcnQsIGhudW0pOworCWludCBoYXNoOworCisJLyogT3B0aW1pemUgaGVyZSBmb3IgZGlyZWN0IGhpdCwgb25seSBsaXN0ZW5pbmcgY29ubmVjdGlvbnMgY2FuCisJICogaGF2ZSB3aWxkY2FyZHMgYW55d2F5cy4KKwkgKi8KKwloYXNoID0gdGNwX3Y2X2hhc2hmbihkYWRkciwgaG51bSwgc2FkZHIsIHNwb3J0KTsKKwloZWFkID0gJnRjcF9laGFzaFtoYXNoXTsKKwlyZWFkX2xvY2soJmhlYWQtPmxvY2spOworCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmaGVhZC0+Y2hhaW4pIHsKKwkJLyogRm9yIElQVjYgZG8gdGhlIGNoZWFwZXIgcG9ydCBhbmQgZmFtaWx5IHRlc3RzIGZpcnN0LiAqLworCQlpZihUQ1BfSVBWNl9NQVRDSChzaywgc2FkZHIsIGRhZGRyLCBwb3J0cywgZGlmKSkKKwkJCWdvdG8gaGl0OyAvKiBZb3Ugc3VuayBteSBiYXR0bGVzaGlwISAqLworCX0KKwkvKiBNdXN0IGNoZWNrIGZvciBhIFRJTUVfV0FJVCdlciBiZWZvcmUgZ29pbmcgdG8gbGlzdGVuZXIgaGFzaC4gKi8KKwlza19mb3JfZWFjaChzaywgbm9kZSwgJihoZWFkICsgdGNwX2VoYXNoX3NpemUpLT5jaGFpbikgeworCQkvKiBGSVhNRTogYWNtZTogY2hlY2sgdGhpcy4uLiAqLworCQlzdHJ1Y3QgdGNwX3R3X2J1Y2tldCAqdHcgPSAoc3RydWN0IHRjcF90d19idWNrZXQgKilzazsKKworCQlpZigqKChfX3UzMiAqKSYodHctPnR3X2Rwb3J0KSkJPT0gcG9ydHMJJiYKKwkJICAgc2stPnNrX2ZhbWlseQkJPT0gUEZfSU5FVDYpIHsKKwkJCWlmKGlwdjZfYWRkcl9lcXVhbCgmdHctPnR3X3Y2X2RhZGRyLCBzYWRkcikJJiYKKwkJCSAgIGlwdjZfYWRkcl9lcXVhbCgmdHctPnR3X3Y2X3Jjdl9zYWRkciwgZGFkZHIpCSYmCisJCQkgICAoIXNrLT5za19ib3VuZF9kZXZfaWYgfHwgc2stPnNrX2JvdW5kX2Rldl9pZiA9PSBkaWYpKQorCQkJCWdvdG8gaGl0OworCQl9CisJfQorCXJlYWRfdW5sb2NrKCZoZWFkLT5sb2NrKTsKKwlyZXR1cm4gTlVMTDsKKworaGl0OgorCXNvY2tfaG9sZChzayk7CisJcmVhZF91bmxvY2soJmhlYWQtPmxvY2spOworCXJldHVybiBzazsKK30KKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzb2NrICpfX3RjcF92Nl9sb29rdXAoc3RydWN0IGluNl9hZGRyICpzYWRkciwgdTE2IHNwb3J0LAorCQkJCQkgICBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCB1MTYgaG51bSwKKwkJCQkJICAgaW50IGRpZikKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlzayA9IF9fdGNwX3Y2X2xvb2t1cF9lc3RhYmxpc2hlZChzYWRkciwgc3BvcnQsIGRhZGRyLCBobnVtLCBkaWYpOworCisJaWYgKHNrKQorCQlyZXR1cm4gc2s7CisKKwlyZXR1cm4gdGNwX3Y2X2xvb2t1cF9saXN0ZW5lcihkYWRkciwgaG51bSwgZGlmKTsKK30KKworaW5saW5lIHN0cnVjdCBzb2NrICp0Y3BfdjZfbG9va3VwKHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsIHUxNiBzcG9ydCwKKwkJCQkgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsIHUxNiBkcG9ydCwKKwkJCQkgIGludCBkaWYpCit7CisJc3RydWN0IHNvY2sgKnNrOworCisJbG9jYWxfYmhfZGlzYWJsZSgpOworCXNrID0gX190Y3BfdjZfbG9va3VwKHNhZGRyLCBzcG9ydCwgZGFkZHIsIG50b2hzKGRwb3J0KSwgZGlmKTsKKwlsb2NhbF9iaF9lbmFibGUoKTsKKworCXJldHVybiBzazsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwodGNwX3Y2X2xvb2t1cCk7CisKKworLyoKKyAqIE9wZW4gcmVxdWVzdCBoYXNoIHRhYmxlcy4KKyAqLworCitzdGF0aWMgdTMyIHRjcF92Nl9zeW5xX2hhc2goc3RydWN0IGluNl9hZGRyICpyYWRkciwgdTE2IHJwb3J0LCB1MzIgcm5kKQoreworCXUzMiBhLCBiLCBjOworCisJYSA9IHJhZGRyLT5zNl9hZGRyMzJbMF07CisJYiA9IHJhZGRyLT5zNl9hZGRyMzJbMV07CisJYyA9IHJhZGRyLT5zNl9hZGRyMzJbMl07CisKKwlhICs9IEpIQVNIX0dPTERFTl9SQVRJTzsKKwliICs9IEpIQVNIX0dPTERFTl9SQVRJTzsKKwljICs9IHJuZDsKKwlfX2poYXNoX21peChhLCBiLCBjKTsKKworCWEgKz0gcmFkZHItPnM2X2FkZHIzMlszXTsKKwliICs9ICh1MzIpIHJwb3J0OworCV9famhhc2hfbWl4KGEsIGIsIGMpOworCisJcmV0dXJuIGMgJiAoVENQX1NZTlFfSFNJWkUgLSAxKTsKK30KKworc3RhdGljIHN0cnVjdCBvcGVuX3JlcXVlc3QgKnRjcF92Nl9zZWFyY2hfcmVxKHN0cnVjdCB0Y3Bfc29jayAqdHAsCisJCQkJCSAgICAgIHN0cnVjdCBvcGVuX3JlcXVlc3QgKioqcHJldnAsCisJCQkJCSAgICAgIF9fdTE2IHJwb3J0LAorCQkJCQkgICAgICBzdHJ1Y3QgaW42X2FkZHIgKnJhZGRyLAorCQkJCQkgICAgICBzdHJ1Y3QgaW42X2FkZHIgKmxhZGRyLAorCQkJCQkgICAgICBpbnQgaWlmKQoreworCXN0cnVjdCB0Y3BfbGlzdGVuX29wdCAqbG9wdCA9IHRwLT5saXN0ZW5fb3B0OworCXN0cnVjdCBvcGVuX3JlcXVlc3QgKnJlcSwgKipwcmV2OyAgCisKKwlmb3IgKHByZXYgPSAmbG9wdC0+c3luX3RhYmxlW3RjcF92Nl9zeW5xX2hhc2gocmFkZHIsIHJwb3J0LCBsb3B0LT5oYXNoX3JuZCldOworCSAgICAgKHJlcSA9ICpwcmV2KSAhPSBOVUxMOworCSAgICAgcHJldiA9ICZyZXEtPmRsX25leHQpIHsKKwkJaWYgKHJlcS0+cm10X3BvcnQgPT0gcnBvcnQgJiYKKwkJICAgIHJlcS0+Y2xhc3MtPmZhbWlseSA9PSBBRl9JTkVUNiAmJgorCQkgICAgaXB2Nl9hZGRyX2VxdWFsKCZyZXEtPmFmLnY2X3JlcS5ybXRfYWRkciwgcmFkZHIpICYmCisJCSAgICBpcHY2X2FkZHJfZXF1YWwoJnJlcS0+YWYudjZfcmVxLmxvY19hZGRyLCBsYWRkcikgJiYKKwkJICAgICghcmVxLT5hZi52Nl9yZXEuaWlmIHx8IHJlcS0+YWYudjZfcmVxLmlpZiA9PSBpaWYpKSB7CisJCQlCVUdfVFJBUChyZXEtPnNrID09IE5VTEwpOworCQkJKnByZXZwID0gcHJldjsKKwkJCXJldHVybiByZXE7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIF9faW5saW5lX18gdTE2IHRjcF92Nl9jaGVjayhzdHJ1Y3QgdGNwaGRyICp0aCwgaW50IGxlbiwKKwkJCQkgICBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCAKKwkJCQkgICBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCAKKwkJCQkgICB1bnNpZ25lZCBsb25nIGJhc2UpCit7CisJcmV0dXJuIGNzdW1faXB2Nl9tYWdpYyhzYWRkciwgZGFkZHIsIGxlbiwgSVBQUk9UT19UQ1AsIGJhc2UpOworfQorCitzdGF0aWMgX191MzIgdGNwX3Y2X2luaXRfc2VxdWVuY2Uoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQVjYpKSB7CisJCXJldHVybiBzZWN1cmVfdGNwdjZfc2VxdWVuY2VfbnVtYmVyKHNrYi0+bmguaXB2NmgtPmRhZGRyLnM2X2FkZHIzMiwKKwkJCQkJCSAgICBza2ItPm5oLmlwdjZoLT5zYWRkci5zNl9hZGRyMzIsCisJCQkJCQkgICAgc2tiLT5oLnRoLT5kZXN0LAorCQkJCQkJICAgIHNrYi0+aC50aC0+c291cmNlKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gc2VjdXJlX3RjcF9zZXF1ZW5jZV9udW1iZXIoc2tiLT5uaC5pcGgtPmRhZGRyLAorCQkJCQkJICBza2ItPm5oLmlwaC0+c2FkZHIsCisJCQkJCQkgIHNrYi0+aC50aC0+ZGVzdCwKKwkJCQkJCSAgc2tiLT5oLnRoLT5zb3VyY2UpOworCX0KK30KKworc3RhdGljIGludCBfX3RjcF92Nl9jaGVja19lc3RhYmxpc2hlZChzdHJ1Y3Qgc29jayAqc2ssIF9fdTE2IGxwb3J0LAorCQkJCSAgICAgIHN0cnVjdCB0Y3BfdHdfYnVja2V0ICoqdHdwKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CisJc3RydWN0IGluNl9hZGRyICpkYWRkciA9ICZucC0+cmN2X3NhZGRyOworCXN0cnVjdCBpbjZfYWRkciAqc2FkZHIgPSAmbnAtPmRhZGRyOworCWludCBkaWYgPSBzay0+c2tfYm91bmRfZGV2X2lmOworCXUzMiBwb3J0cyA9IFRDUF9DT01CSU5FRF9QT1JUUyhpbmV0LT5kcG9ydCwgbHBvcnQpOworCWludCBoYXNoID0gdGNwX3Y2X2hhc2hmbihkYWRkciwgaW5ldC0+bnVtLCBzYWRkciwgaW5ldC0+ZHBvcnQpOworCXN0cnVjdCB0Y3BfZWhhc2hfYnVja2V0ICpoZWFkID0gJnRjcF9laGFzaFtoYXNoXTsKKwlzdHJ1Y3Qgc29jayAqc2syOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXN0cnVjdCB0Y3BfdHdfYnVja2V0ICp0dzsKKworCXdyaXRlX2xvY2soJmhlYWQtPmxvY2spOworCisJLyogQ2hlY2sgVElNRS1XQUlUIHNvY2tldHMgZmlyc3QuICovCisJc2tfZm9yX2VhY2goc2syLCBub2RlLCAmKGhlYWQgKyB0Y3BfZWhhc2hfc2l6ZSktPmNoYWluKSB7CisJCXR3ID0gKHN0cnVjdCB0Y3BfdHdfYnVja2V0KilzazI7CisKKwkJaWYoKigoX191MzIgKikmKHR3LT50d19kcG9ydCkpCT09IHBvcnRzCSYmCisJCSAgIHNrMi0+c2tfZmFtaWx5CQk9PSBQRl9JTkVUNgkmJgorCQkgICBpcHY2X2FkZHJfZXF1YWwoJnR3LT50d192Nl9kYWRkciwgc2FkZHIpCSYmCisJCSAgIGlwdjZfYWRkcl9lcXVhbCgmdHctPnR3X3Y2X3Jjdl9zYWRkciwgZGFkZHIpCSYmCisJCSAgIHNrMi0+c2tfYm91bmRfZGV2X2lmID09IHNrLT5za19ib3VuZF9kZXZfaWYpIHsKKwkJCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJCQlpZiAodHctPnR3X3RzX3JlY2VudF9zdGFtcCAmJgorCQkJICAgICghdHdwIHx8IChzeXNjdGxfdGNwX3R3X3JldXNlICYmCisJCQkJICAgICAgeHRpbWUudHZfc2VjIC0gCisJCQkJICAgICAgdHctPnR3X3RzX3JlY2VudF9zdGFtcCA+IDEpKSkgeworCQkJCS8qIFNlZSBjb21tZW50IGluIHRjcF9pcHY0LmMgKi8KKwkJCQl0cC0+d3JpdGVfc2VxID0gdHctPnR3X3NuZF9ueHQgKyA2NTUzNSArIDI7CisJCQkJaWYgKCF0cC0+d3JpdGVfc2VxKQorCQkJCQl0cC0+d3JpdGVfc2VxID0gMTsKKwkJCQl0cC0+cnhfb3B0LnRzX3JlY2VudCA9IHR3LT50d190c19yZWNlbnQ7CisJCQkJdHAtPnJ4X29wdC50c19yZWNlbnRfc3RhbXAgPSB0dy0+dHdfdHNfcmVjZW50X3N0YW1wOworCQkJCXNvY2tfaG9sZChzazIpOworCQkJCWdvdG8gdW5pcXVlOworCQkJfSBlbHNlCisJCQkJZ290byBub3RfdW5pcXVlOworCQl9CisJfQorCXR3ID0gTlVMTDsKKworCS8qIEFuZCBlc3RhYmxpc2hlZCBwYXJ0Li4uICovCisJc2tfZm9yX2VhY2goc2syLCBub2RlLCAmaGVhZC0+Y2hhaW4pIHsKKwkJaWYoVENQX0lQVjZfTUFUQ0goc2syLCBzYWRkciwgZGFkZHIsIHBvcnRzLCBkaWYpKQorCQkJZ290byBub3RfdW5pcXVlOworCX0KKwordW5pcXVlOgorCUJVR19UUkFQKHNrX3VuaGFzaGVkKHNrKSk7CisJX19za19hZGRfbm9kZShzaywgJmhlYWQtPmNoYWluKTsKKwlzay0+c2tfaGFzaGVudCA9IGhhc2g7CisJc29ja19wcm90X2luY191c2Uoc2stPnNrX3Byb3QpOworCXdyaXRlX3VubG9jaygmaGVhZC0+bG9jayk7CisKKwlpZiAodHdwKSB7CisJCSp0d3AgPSB0dzsKKwkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfVElNRVdBSVRSRUNZQ0xFRCk7CisJfSBlbHNlIGlmICh0dykgeworCQkvKiBTaWxseS4gU2hvdWxkIGhhc2gtZGFuY2UgaW5zdGVhZC4uLiAqLworCQl0Y3BfdHdfZGVzY2hlZHVsZSh0dyk7CisJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RJTUVXQUlUUkVDWUNMRUQpOworCisJCXRjcF90d19wdXQodHcpOworCX0KKwlyZXR1cm4gMDsKKworbm90X3VuaXF1ZToKKwl3cml0ZV91bmxvY2soJmhlYWQtPmxvY2spOworCXJldHVybiAtRUFERFJOT1RBVkFJTDsKK30KKworc3RhdGljIGlubGluZSB1MzIgdGNwdjZfcG9ydF9vZmZzZXQoY29uc3Qgc3RydWN0IHNvY2sgKnNrKQoreworCWNvbnN0IHN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwljb25zdCBzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CisKKwlyZXR1cm4gc2VjdXJlX3RjcHY2X3BvcnRfZXBoZW1lcmFsKG5wLT5yY3Zfc2FkZHIuczZfYWRkcjMyLAorCQkJCQkgICBucC0+ZGFkZHIuczZfYWRkcjMyLAorCQkJCQkgICBpbmV0LT5kcG9ydCk7Cit9CisKK3N0YXRpYyBpbnQgdGNwX3Y2X2hhc2hfY29ubmVjdChzdHJ1Y3Qgc29jayAqc2spCit7CisJdW5zaWduZWQgc2hvcnQgc251bSA9IGluZXRfc2soc2spLT5udW07CisgCXN0cnVjdCB0Y3BfYmluZF9oYXNoYnVja2V0ICpoZWFkOworIAlzdHJ1Y3QgdGNwX2JpbmRfYnVja2V0ICp0YjsKKwlpbnQgcmV0OworCisgCWlmICghc251bSkgeworIAkJaW50IGxvdyA9IHN5c2N0bF9sb2NhbF9wb3J0X3JhbmdlWzBdOworIAkJaW50IGhpZ2ggPSBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVsxXTsKKwkJaW50IHJhbmdlID0gaGlnaCAtIGxvdzsKKyAJCWludCBpOworCQlpbnQgcG9ydDsKKwkJc3RhdGljIHUzMiBoaW50OworCQl1MzIgb2Zmc2V0ID0gaGludCArIHRjcHY2X3BvcnRfb2Zmc2V0KHNrKTsKKwkJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisgCQlzdHJ1Y3QgdGNwX3R3X2J1Y2tldCAqdHcgPSBOVUxMOworCisgCQlsb2NhbF9iaF9kaXNhYmxlKCk7CisJCWZvciAoaSA9IDE7IGkgPD0gcmFuZ2U7IGkrKykgeworCQkJcG9ydCA9IGxvdyArIChpICsgb2Zmc2V0KSAlIHJhbmdlOworIAkJCWhlYWQgPSAmdGNwX2JoYXNoW3RjcF9iaGFzaGZuKHBvcnQpXTsKKyAJCQlzcGluX2xvY2soJmhlYWQtPmxvY2spOworCisgCQkJLyogRG9lcyBub3QgYm90aGVyIHdpdGggcmN2X3NhZGRyIGNoZWNrcywKKyAJCQkgKiBiZWNhdXNlIHRoZSBlc3RhYmxpc2hlZCBjaGVjayBpcyBhbHJlYWR5CisgCQkJICogdW5pcXVlIGVub3VnaC4KKyAJCQkgKi8KKwkJCXRiX2Zvcl9lYWNoKHRiLCBub2RlLCAmaGVhZC0+Y2hhaW4pIHsKKyAJCQkJaWYgKHRiLT5wb3J0ID09IHBvcnQpIHsKKyAJCQkJCUJVR19UUkFQKCFobGlzdF9lbXB0eSgmdGItPm93bmVycykpOworIAkJCQkJaWYgKHRiLT5mYXN0cmV1c2UgPj0gMCkKKyAJCQkJCQlnb3RvIG5leHRfcG9ydDsKKyAJCQkJCWlmICghX190Y3BfdjZfY2hlY2tfZXN0YWJsaXNoZWQoc2ssCisJCQkJCQkJCQlwb3J0LAorCQkJCQkJCQkJJnR3KSkKKyAJCQkJCQlnb3RvIG9rOworIAkJCQkJZ290byBuZXh0X3BvcnQ7CisgCQkJCX0KKyAJCQl9CisKKyAJCQl0YiA9IHRjcF9idWNrZXRfY3JlYXRlKGhlYWQsIHBvcnQpOworIAkJCWlmICghdGIpIHsKKyAJCQkJc3Bpbl91bmxvY2soJmhlYWQtPmxvY2spOworIAkJCQlicmVhazsKKyAJCQl9CisgCQkJdGItPmZhc3RyZXVzZSA9IC0xOworIAkJCWdvdG8gb2s7CisKKyAJCW5leHRfcG9ydDoKKyAJCQlzcGluX3VubG9jaygmaGVhZC0+bG9jayk7CisgCQl9CisgCQlsb2NhbF9iaF9lbmFibGUoKTsKKworIAkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCitvazoKKwkJaGludCArPSBpOworCisgCQkvKiBIZWFkIGxvY2sgc3RpbGwgaGVsZCBhbmQgYmgncyBkaXNhYmxlZCAqLworIAkJdGNwX2JpbmRfaGFzaChzaywgdGIsIHBvcnQpOworCQlpZiAoc2tfdW5oYXNoZWQoc2spKSB7CisgCQkJaW5ldF9zayhzayktPnNwb3J0ID0gaHRvbnMocG9ydCk7CisgCQkJX190Y3BfdjZfaGFzaChzayk7CisgCQl9CisgCQlzcGluX3VubG9jaygmaGVhZC0+bG9jayk7CisKKyAJCWlmICh0dykgeworIAkJCXRjcF90d19kZXNjaGVkdWxlKHR3KTsKKyAJCQl0Y3BfdHdfcHV0KHR3KTsKKyAJCX0KKworCQlyZXQgPSAwOworCQlnb3RvIG91dDsKKyAJfQorCisgCWhlYWQgID0gJnRjcF9iaGFzaFt0Y3BfYmhhc2hmbihzbnVtKV07CisgCXRiICA9IHRjcF9zayhzayktPmJpbmRfaGFzaDsKKwlzcGluX2xvY2tfYmgoJmhlYWQtPmxvY2spOworCisJaWYgKHNrX2hlYWQoJnRiLT5vd25lcnMpID09IHNrICYmICFzay0+c2tfYmluZF9ub2RlLm5leHQpIHsKKwkJX190Y3BfdjZfaGFzaChzayk7CisJCXNwaW5fdW5sb2NrX2JoKCZoZWFkLT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2soJmhlYWQtPmxvY2spOworCQkvKiBObyBkZWZpbml0ZSBhbnN3ZXIuLi4gV2FsayB0byBlc3RhYmxpc2hlZCBoYXNoIHRhYmxlICovCisJCXJldCA9IF9fdGNwX3Y2X2NoZWNrX2VzdGFibGlzaGVkKHNrLCBzbnVtLCBOVUxMKTsKK291dDoKKwkJbG9jYWxfYmhfZW5hYmxlKCk7CisJCXJldHVybiByZXQ7CisJfQorfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdGNwX3Y2X2lpZihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBJUDZDQihza2IpLT5paWY7Cit9CisKK3N0YXRpYyBpbnQgdGNwX3Y2X2Nvbm5lY3Qoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLCAKKwkJCSAgaW50IGFkZHJfbGVuKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnVzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSB1YWRkcjsKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBpbjZfYWRkciAqc2FkZHIgPSBOVUxMLCAqZmluYWxfcCA9IE5VTEwsIGZpbmFsOworCXN0cnVjdCBmbG93aSBmbDsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CisJaW50IGFkZHJfdHlwZTsKKwlpbnQgZXJyOworCisJaWYgKGFkZHJfbGVuIDwgU0lONl9MRU5fUkZDMjEzMykgCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHVzaW4tPnNpbjZfZmFtaWx5ICE9IEFGX0lORVQ2KSAKKwkJcmV0dXJuKC1FQUZOT1NVUFBPUlQpOworCisJbWVtc2V0KCZmbCwgMCwgc2l6ZW9mKGZsKSk7CisKKwlpZiAobnAtPnNuZGZsb3cpIHsKKwkJZmwuZmw2X2Zsb3dsYWJlbCA9IHVzaW4tPnNpbjZfZmxvd2luZm8mSVBWNl9GTE9XSU5GT19NQVNLOworCQlJUDZfRUNOX2Zsb3dfaW5pdChmbC5mbDZfZmxvd2xhYmVsKTsKKwkJaWYgKGZsLmZsNl9mbG93bGFiZWwmSVBWNl9GTE9XTEFCRUxfTUFTSykgeworCQkJc3RydWN0IGlwNl9mbG93bGFiZWwgKmZsb3dsYWJlbDsKKwkJCWZsb3dsYWJlbCA9IGZsNl9zb2NrX2xvb2t1cChzaywgZmwuZmw2X2Zsb3dsYWJlbCk7CisJCQlpZiAoZmxvd2xhYmVsID09IE5VTEwpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpcHY2X2FkZHJfY29weSgmdXNpbi0+c2luNl9hZGRyLCAmZmxvd2xhYmVsLT5kc3QpOworCQkJZmw2X3NvY2tfcmVsZWFzZShmbG93bGFiZWwpOworCQl9CisJfQorCisJLyoKKyAgCSAqCWNvbm5lY3QoKSB0byBJTkFERFJfQU5ZIG1lYW5zIGxvb3BiYWNrIChCU0QnaXNtKS4KKyAgCSAqLworICAJCisgIAlpZihpcHY2X2FkZHJfYW55KCZ1c2luLT5zaW42X2FkZHIpKQorCQl1c2luLT5zaW42X2FkZHIuczZfYWRkclsxNV0gPSAweDE7IAorCisJYWRkcl90eXBlID0gaXB2Nl9hZGRyX3R5cGUoJnVzaW4tPnNpbjZfYWRkcik7CisKKwlpZihhZGRyX3R5cGUgJiBJUFY2X0FERFJfTVVMVElDQVNUKQorCQlyZXR1cm4gLUVORVRVTlJFQUNIOworCisJaWYgKGFkZHJfdHlwZSZJUFY2X0FERFJfTElOS0xPQ0FMKSB7CisJCWlmIChhZGRyX2xlbiA+PSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikgJiYKKwkJICAgIHVzaW4tPnNpbjZfc2NvcGVfaWQpIHsKKwkJCS8qIElmIGludGVyZmFjZSBpcyBzZXQgd2hpbGUgYmluZGluZywgaW5kaWNlcworCQkJICogbXVzdCBjb2luY2lkZS4KKwkJCSAqLworCQkJaWYgKHNrLT5za19ib3VuZF9kZXZfaWYgJiYKKwkJCSAgICBzay0+c2tfYm91bmRfZGV2X2lmICE9IHVzaW4tPnNpbjZfc2NvcGVfaWQpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXNrLT5za19ib3VuZF9kZXZfaWYgPSB1c2luLT5zaW42X3Njb3BlX2lkOworCQl9CisKKwkJLyogQ29ubmVjdCB0byBsaW5rLWxvY2FsIGFkZHJlc3MgcmVxdWlyZXMgYW4gaW50ZXJmYWNlICovCisJCWlmICghc2stPnNrX2JvdW5kX2Rldl9pZikKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh0cC0+cnhfb3B0LnRzX3JlY2VudF9zdGFtcCAmJgorCSAgICAhaXB2Nl9hZGRyX2VxdWFsKCZucC0+ZGFkZHIsICZ1c2luLT5zaW42X2FkZHIpKSB7CisJCXRwLT5yeF9vcHQudHNfcmVjZW50ID0gMDsKKwkJdHAtPnJ4X29wdC50c19yZWNlbnRfc3RhbXAgPSAwOworCQl0cC0+d3JpdGVfc2VxID0gMDsKKwl9CisKKwlpcHY2X2FkZHJfY29weSgmbnAtPmRhZGRyLCAmdXNpbi0+c2luNl9hZGRyKTsKKwlucC0+Zmxvd19sYWJlbCA9IGZsLmZsNl9mbG93bGFiZWw7CisKKwkvKgorCSAqCVRDUCBvdmVyIElQdjQKKwkgKi8KKworCWlmIChhZGRyX3R5cGUgPT0gSVBWNl9BRERSX01BUFBFRCkgeworCQl1MzIgZXh0aGRybGVuID0gdHAtPmV4dF9oZWFkZXJfbGVuOworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCisJCVNPQ0tfREVCVUcoc2ssICJjb25uZWN0OiBpcHY0IG1hcHBlZFxuIik7CisKKwkJaWYgKF9faXB2Nl9vbmx5X3NvY2soc2spKQorCQkJcmV0dXJuIC1FTkVUVU5SRUFDSDsKKworCQlzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCXNpbi5zaW5fcG9ydCA9IHVzaW4tPnNpbjZfcG9ydDsKKwkJc2luLnNpbl9hZGRyLnNfYWRkciA9IHVzaW4tPnNpbjZfYWRkci5zNl9hZGRyMzJbM107CisKKwkJdHAtPmFmX3NwZWNpZmljID0gJmlwdjZfbWFwcGVkOworCQlzay0+c2tfYmFja2xvZ19yY3YgPSB0Y3BfdjRfZG9fcmN2OworCisJCWVyciA9IHRjcF92NF9jb25uZWN0KHNrLCAoc3RydWN0IHNvY2thZGRyICopJnNpbiwgc2l6ZW9mKHNpbikpOworCisJCWlmIChlcnIpIHsKKwkJCXRwLT5leHRfaGVhZGVyX2xlbiA9IGV4dGhkcmxlbjsKKwkJCXRwLT5hZl9zcGVjaWZpYyA9ICZpcHY2X3NwZWNpZmljOworCQkJc2stPnNrX2JhY2tsb2dfcmN2ID0gdGNwX3Y2X2RvX3JjdjsKKwkJCWdvdG8gZmFpbHVyZTsKKwkJfSBlbHNlIHsKKwkJCWlwdjZfYWRkcl9zZXQoJm5wLT5zYWRkciwgMCwgMCwgaHRvbmwoMHgwMDAwRkZGRiksCisJCQkJICAgICAgaW5ldC0+c2FkZHIpOworCQkJaXB2Nl9hZGRyX3NldCgmbnAtPnJjdl9zYWRkciwgMCwgMCwgaHRvbmwoMHgwMDAwRkZGRiksCisJCQkJICAgICAgaW5ldC0+cmN2X3NhZGRyKTsKKwkJfQorCisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKCFpcHY2X2FkZHJfYW55KCZucC0+cmN2X3NhZGRyKSkKKwkJc2FkZHIgPSAmbnAtPnJjdl9zYWRkcjsKKworCWZsLnByb3RvID0gSVBQUk9UT19UQ1A7CisJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsICZucC0+ZGFkZHIpOworCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfc3JjLAorCQkgICAgICAgKHNhZGRyID8gc2FkZHIgOiAmbnAtPnNhZGRyKSk7CisJZmwub2lmID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKKwlmbC5mbF9pcF9kcG9ydCA9IHVzaW4tPnNpbjZfcG9ydDsKKwlmbC5mbF9pcF9zcG9ydCA9IGluZXQtPnNwb3J0OworCisJaWYgKG5wLT5vcHQgJiYgbnAtPm9wdC0+c3JjcnQpIHsKKwkJc3RydWN0IHJ0MF9oZHIgKnJ0MCA9IChzdHJ1Y3QgcnQwX2hkciAqKW5wLT5vcHQtPnNyY3J0OworCQlpcHY2X2FkZHJfY29weSgmZmluYWwsICZmbC5mbDZfZHN0KTsKKwkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsIHJ0MC0+YWRkcik7CisJCWZpbmFsX3AgPSAmZmluYWw7CisJfQorCisJZXJyID0gaXA2X2RzdF9sb29rdXAoc2ssICZkc3QsICZmbCk7CisJaWYgKGVycikKKwkJZ290byBmYWlsdXJlOworCWlmIChmaW5hbF9wKQorCQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgZmluYWxfcCk7CisKKwlpZiAoKGVyciA9IHhmcm1fbG9va3VwKCZkc3QsICZmbCwgc2ssIDApKSA8IDApIHsKKwkJZHN0X3JlbGVhc2UoZHN0KTsKKwkJZ290byBmYWlsdXJlOworCX0KKworCWlmIChzYWRkciA9PSBOVUxMKSB7CisJCXNhZGRyID0gJmZsLmZsNl9zcmM7CisJCWlwdjZfYWRkcl9jb3B5KCZucC0+cmN2X3NhZGRyLCBzYWRkcik7CisJfQorCisJLyogc2V0IHRoZSBzb3VyY2UgYWRkcmVzcyAqLworCWlwdjZfYWRkcl9jb3B5KCZucC0+c2FkZHIsIHNhZGRyKTsKKwlpbmV0LT5yY3Zfc2FkZHIgPSBMT09QQkFDSzRfSVBWNjsKKworCWlwNl9kc3Rfc3RvcmUoc2ssIGRzdCwgTlVMTCk7CisJc2stPnNrX3JvdXRlX2NhcHMgPSBkc3QtPmRldi0+ZmVhdHVyZXMgJgorCQl+KE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfVFNPKTsKKworCXRwLT5leHRfaGVhZGVyX2xlbiA9IDA7CisJaWYgKG5wLT5vcHQpCisJCXRwLT5leHRfaGVhZGVyX2xlbiA9IG5wLT5vcHQtPm9wdF9mbGVuICsgbnAtPm9wdC0+b3B0X25mbGVuOworCisJdHAtPnJ4X29wdC5tc3NfY2xhbXAgPSBJUFY2X01JTl9NVFUgLSBzaXplb2Yoc3RydWN0IHRjcGhkcikgLSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCisJaW5ldC0+ZHBvcnQgPSB1c2luLT5zaW42X3BvcnQ7CisKKwl0Y3Bfc2V0X3N0YXRlKHNrLCBUQ1BfU1lOX1NFTlQpOworCWVyciA9IHRjcF92Nl9oYXNoX2Nvbm5lY3Qoc2spOworCWlmIChlcnIpCisJCWdvdG8gbGF0ZV9mYWlsdXJlOworCisJaWYgKCF0cC0+d3JpdGVfc2VxKQorCQl0cC0+d3JpdGVfc2VxID0gc2VjdXJlX3RjcHY2X3NlcXVlbmNlX251bWJlcihucC0+c2FkZHIuczZfYWRkcjMyLAorCQkJCQkJCSAgICAgbnAtPmRhZGRyLnM2X2FkZHIzMiwKKwkJCQkJCQkgICAgIGluZXQtPnNwb3J0LAorCQkJCQkJCSAgICAgaW5ldC0+ZHBvcnQpOworCisJZXJyID0gdGNwX2Nvbm5lY3Qoc2spOworCWlmIChlcnIpCisJCWdvdG8gbGF0ZV9mYWlsdXJlOworCisJcmV0dXJuIDA7CisKK2xhdGVfZmFpbHVyZToKKwl0Y3Bfc2V0X3N0YXRlKHNrLCBUQ1BfQ0xPU0UpOworCV9fc2tfZHN0X3Jlc2V0KHNrKTsKK2ZhaWx1cmU6CisJaW5ldC0+ZHBvcnQgPSAwOworCXNrLT5za19yb3V0ZV9jYXBzID0gMDsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCB0Y3BfdjZfZXJyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0LAorCQlpbnQgdHlwZSwgaW50IGNvZGUsIGludCBvZmZzZXQsIF9fdTMyIGluZm8pCit7CisJc3RydWN0IGlwdjZoZHIgKmhkciA9IChzdHJ1Y3QgaXB2Nmhkciopc2tiLT5kYXRhOworCXN0cnVjdCB0Y3BoZHIgKnRoID0gKHN0cnVjdCB0Y3BoZHIgKikoc2tiLT5kYXRhK29mZnNldCk7CisJc3RydWN0IGlwdjZfcGluZm8gKm5wOworCXN0cnVjdCBzb2NrICpzazsKKwlpbnQgZXJyOworCXN0cnVjdCB0Y3Bfc29jayAqdHA7IAorCV9fdTMyIHNlcTsKKworCXNrID0gdGNwX3Y2X2xvb2t1cCgmaGRyLT5kYWRkciwgdGgtPmRlc3QsICZoZHItPnNhZGRyLCB0aC0+c291cmNlLCBza2ItPmRldi0+aWZpbmRleCk7CisKKwlpZiAoc2sgPT0gTlVMTCkgeworCQlJQ01QNl9JTkNfU1RBVFNfQkgoX19pbjZfZGV2X2dldChza2ItPmRldiksIElDTVA2X01JQl9JTkVSUk9SUyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9USU1FX1dBSVQpIHsKKwkJdGNwX3R3X3B1dCgoc3RydWN0IHRjcF90d19idWNrZXQqKXNrKTsKKwkJcmV0dXJuOworCX0KKworCWJoX2xvY2tfc29jayhzayk7CisJaWYgKHNvY2tfb3duZWRfYnlfdXNlcihzaykpCisJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX0xPQ0tEUk9QUEVESUNNUFMpOworCisJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfQ0xPU0UpCisJCWdvdG8gb3V0OworCisJdHAgPSB0Y3Bfc2soc2spOworCXNlcSA9IG50b2hsKHRoLT5zZXEpOyAKKwlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9MSVNURU4gJiYKKwkgICAgIWJldHdlZW4oc2VxLCB0cC0+c25kX3VuYSwgdHAtPnNuZF9ueHQpKSB7CisJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX09VVE9GV0lORE9XSUNNUFMpOworCQlnb3RvIG91dDsKKwl9CisKKwlucCA9IGluZXQ2X3NrKHNrKTsKKworCWlmICh0eXBlID09IElDTVBWNl9QS1RfVE9PQklHKSB7CisJCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IE5VTEw7CisKKwkJaWYgKHNvY2tfb3duZWRfYnlfdXNlcihzaykpCisJCQlnb3RvIG91dDsKKwkJaWYgKCgxIDw8IHNrLT5za19zdGF0ZSkgJiAoVENQRl9MSVNURU4gfCBUQ1BGX0NMT1NFKSkKKwkJCWdvdG8gb3V0OworCisJCS8qIGljbXAgc2hvdWxkIGhhdmUgdXBkYXRlZCB0aGUgZGVzdGluYXRpb24gY2FjaGUgZW50cnkgKi8KKwkJZHN0ID0gX19za19kc3RfY2hlY2soc2ssIG5wLT5kc3RfY29va2llKTsKKworCQlpZiAoZHN0ID09IE5VTEwpIHsKKwkJCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwkJCXN0cnVjdCBmbG93aSBmbDsKKworCQkJLyogQlVHR0dfRlVUVVJFOiBBZ2FpbiwgaXQgaXMgbm90IGNsZWFyIGhvdworCQkJICAgdG8gaGFuZGxlIHJ0aGRyIGNhc2UuIElnbm9yZSB0aGlzIGNvbXBsZXhpdHkKKwkJCSAgIGZvciBub3cuCisJCQkgKi8KKwkJCW1lbXNldCgmZmwsIDAsIHNpemVvZihmbCkpOworCQkJZmwucHJvdG8gPSBJUFBST1RPX1RDUDsKKwkJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCAmbnAtPmRhZGRyKTsKKwkJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfc3JjLCAmbnAtPnNhZGRyKTsKKwkJCWZsLm9pZiA9IHNrLT5za19ib3VuZF9kZXZfaWY7CisJCQlmbC5mbF9pcF9kcG9ydCA9IGluZXQtPmRwb3J0OworCQkJZmwuZmxfaXBfc3BvcnQgPSBpbmV0LT5zcG9ydDsKKworCQkJaWYgKChlcnIgPSBpcDZfZHN0X2xvb2t1cChzaywgJmRzdCwgJmZsKSkpIHsKKwkJCQlzay0+c2tfZXJyX3NvZnQgPSAtZXJyOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlpZiAoKGVyciA9IHhmcm1fbG9va3VwKCZkc3QsICZmbCwgc2ssIDApKSA8IDApIHsKKwkJCQlzay0+c2tfZXJyX3NvZnQgPSAtZXJyOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCX0gZWxzZQorCQkJZHN0X2hvbGQoZHN0KTsKKworCQlpZiAodHAtPnBtdHVfY29va2llID4gZHN0X210dShkc3QpKSB7CisJCQl0Y3Bfc3luY19tc3Moc2ssIGRzdF9tdHUoZHN0KSk7CisJCQl0Y3Bfc2ltcGxlX3JldHJhbnNtaXQoc2spOworCQl9IC8qIGVsc2UgbGV0IHRoZSB1c3VhbCByZXRyYW5zbWl0IHRpbWVyIGhhbmRsZSBpdCAqLworCQlkc3RfcmVsZWFzZShkc3QpOworCQlnb3RvIG91dDsKKwl9CisKKwlpY21wdjZfZXJyX2NvbnZlcnQodHlwZSwgY29kZSwgJmVycik7CisKKwkvKiBNaWdodCBiZSBmb3IgYW4gb3Blbl9yZXF1ZXN0ICovCisJc3dpdGNoIChzay0+c2tfc3RhdGUpIHsKKwkJc3RydWN0IG9wZW5fcmVxdWVzdCAqcmVxLCAqKnByZXY7CisJY2FzZSBUQ1BfTElTVEVOOgorCQlpZiAoc29ja19vd25lZF9ieV91c2VyKHNrKSkKKwkJCWdvdG8gb3V0OworCisJCXJlcSA9IHRjcF92Nl9zZWFyY2hfcmVxKHRwLCAmcHJldiwgdGgtPmRlc3QsICZoZHItPmRhZGRyLAorCQkJCQkmaGRyLT5zYWRkciwgdGNwX3Y2X2lpZihza2IpKTsKKwkJaWYgKCFyZXEpCisJCQlnb3RvIG91dDsKKworCQkvKiBJQ01QcyBhcmUgbm90IGJhY2tsb2dnZWQsIGhlbmNlIHdlIGNhbm5vdCBnZXQKKwkJICogYW4gZXN0YWJsaXNoZWQgc29ja2V0IGhlcmUuCisJCSAqLworCQlCVUdfVFJBUChyZXEtPnNrID09IE5VTEwpOworCisJCWlmIChzZXEgIT0gcmVxLT5zbnRfaXNuKSB7CisJCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9PVVRPRldJTkRPV0lDTVBTKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJdGNwX3N5bnFfZHJvcChzaywgcmVxLCBwcmV2KTsKKwkJZ290byBvdXQ7CisKKwljYXNlIFRDUF9TWU5fU0VOVDoKKwljYXNlIFRDUF9TWU5fUkVDVjogIC8qIENhbm5vdCBoYXBwZW4uCisJCQkgICAgICAgSXQgY2FuLCBpdCBTWU5zIGFyZSBjcm9zc2VkLiAtLUFOSyAqLyAKKwkJaWYgKCFzb2NrX293bmVkX2J5X3VzZXIoc2spKSB7CisJCQlUQ1BfSU5DX1NUQVRTX0JIKFRDUF9NSUJfQVRURU1QVEZBSUxTKTsKKwkJCXNrLT5za19lcnIgPSBlcnI7CisJCQlzay0+c2tfZXJyb3JfcmVwb3J0KHNrKTsJCS8qIFdha2UgcGVvcGxlIHVwIHRvIHNlZSB0aGUgZXJyb3IgKHNlZSBjb25uZWN0IGluIHNvY2suYykgKi8KKworCQkJdGNwX2RvbmUoc2spOworCQl9IGVsc2UKKwkJCXNrLT5za19lcnJfc29mdCA9IGVycjsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFzb2NrX293bmVkX2J5X3VzZXIoc2spICYmIG5wLT5yZWN2ZXJyKSB7CisJCXNrLT5za19lcnIgPSBlcnI7CisJCXNrLT5za19lcnJvcl9yZXBvcnQoc2spOworCX0gZWxzZQorCQlzay0+c2tfZXJyX3NvZnQgPSBlcnI7CisKK291dDoKKwliaF91bmxvY2tfc29jayhzayk7CisJc29ja19wdXQoc2spOworfQorCisKK3N0YXRpYyBpbnQgdGNwX3Y2X3NlbmRfc3luYWNrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG9wZW5fcmVxdWVzdCAqcmVxLAorCQkJICAgICAgc3RydWN0IGRzdF9lbnRyeSAqZHN0KQoreworCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqIHNrYjsKKwlzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdCA9IE5VTEw7CisJc3RydWN0IGluNl9hZGRyICogZmluYWxfcCA9IE5VTEwsIGZpbmFsOworCXN0cnVjdCBmbG93aSBmbDsKKwlpbnQgZXJyID0gLTE7CisKKwltZW1zZXQoJmZsLCAwLCBzaXplb2YoZmwpKTsKKwlmbC5wcm90byA9IElQUFJPVE9fVENQOworCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCAmcmVxLT5hZi52Nl9yZXEucm10X2FkZHIpOworCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfc3JjLCAmcmVxLT5hZi52Nl9yZXEubG9jX2FkZHIpOworCWZsLmZsNl9mbG93bGFiZWwgPSAwOworCWZsLm9pZiA9IHJlcS0+YWYudjZfcmVxLmlpZjsKKwlmbC5mbF9pcF9kcG9ydCA9IHJlcS0+cm10X3BvcnQ7CisJZmwuZmxfaXBfc3BvcnQgPSBpbmV0X3NrKHNrKS0+c3BvcnQ7CisKKwlpZiAoZHN0ID09IE5VTEwpIHsKKwkJb3B0ID0gbnAtPm9wdDsKKwkJaWYgKG9wdCA9PSBOVUxMICYmCisJCSAgICBucC0+cnhvcHQuYml0cy5zcmNydCA9PSAyICYmCisJCSAgICByZXEtPmFmLnY2X3JlcS5wa3RvcHRzKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqcGt0b3B0cyA9IHJlcS0+YWYudjZfcmVxLnBrdG9wdHM7CisJCQlzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKnJ4b3B0ID0gSVA2Q0IocGt0b3B0cyk7CisJCQlpZiAocnhvcHQtPnNyY3J0KQorCQkJCW9wdCA9IGlwdjZfaW52ZXJ0X3J0aGRyKHNrLCAoc3RydWN0IGlwdjZfcnRfaGRyKikocGt0b3B0cy0+bmgucmF3ICsgcnhvcHQtPnNyY3J0KSk7CisJCX0KKworCQlpZiAob3B0ICYmIG9wdC0+c3JjcnQpIHsKKwkJCXN0cnVjdCBydDBfaGRyICpydDAgPSAoc3RydWN0IHJ0MF9oZHIgKikgb3B0LT5zcmNydDsKKwkJCWlwdjZfYWRkcl9jb3B5KCZmaW5hbCwgJmZsLmZsNl9kc3QpOworCQkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsIHJ0MC0+YWRkcik7CisJCQlmaW5hbF9wID0gJmZpbmFsOworCQl9CisKKwkJZXJyID0gaXA2X2RzdF9sb29rdXAoc2ssICZkc3QsICZmbCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGRvbmU7CisJCWlmIChmaW5hbF9wKQorCQkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsIGZpbmFsX3ApOworCQlpZiAoKGVyciA9IHhmcm1fbG9va3VwKCZkc3QsICZmbCwgc2ssIDApKSA8IDApCisJCQlnb3RvIGRvbmU7CisJfQorCisJc2tiID0gdGNwX21ha2Vfc3luYWNrKHNrLCBkc3QsIHJlcSk7CisJaWYgKHNrYikgeworCQlzdHJ1Y3QgdGNwaGRyICp0aCA9IHNrYi0+aC50aDsKKworCQl0aC0+Y2hlY2sgPSB0Y3BfdjZfY2hlY2sodGgsIHNrYi0+bGVuLAorCQkJCQkgJnJlcS0+YWYudjZfcmVxLmxvY19hZGRyLCAmcmVxLT5hZi52Nl9yZXEucm10X2FkZHIsCisJCQkJCSBjc3VtX3BhcnRpYWwoKGNoYXIgKil0aCwgc2tiLT5sZW4sIHNrYi0+Y3N1bSkpOworCisJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCAmcmVxLT5hZi52Nl9yZXEucm10X2FkZHIpOworCQllcnIgPSBpcDZfeG1pdChzaywgc2tiLCAmZmwsIG9wdCwgMCk7CisJCWlmIChlcnIgPT0gTkVUX1hNSVRfQ04pCisJCQllcnIgPSAwOworCX0KKworZG9uZToKKwlkc3RfcmVsZWFzZShkc3QpOworICAgICAgICBpZiAob3B0ICYmIG9wdCAhPSBucC0+b3B0KQorCQlzb2NrX2tmcmVlX3Moc2ssIG9wdCwgb3B0LT50b3RfbGVuKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCB0Y3BfdjZfb3JfZnJlZShzdHJ1Y3Qgb3Blbl9yZXF1ZXN0ICpyZXEpCit7CisJaWYgKHJlcS0+YWYudjZfcmVxLnBrdG9wdHMpCisJCWtmcmVlX3NrYihyZXEtPmFmLnY2X3JlcS5wa3RvcHRzKTsKK30KKworc3RhdGljIHN0cnVjdCBvcl9jYWxsdGFibGUgb3JfaXB2NiA9IHsKKwkuZmFtaWx5CQk9CUFGX0lORVQ2LAorCS5ydHhfc3luX2Fjawk9CXRjcF92Nl9zZW5kX3N5bmFjaywKKwkuc2VuZF9hY2sJPQl0Y3BfdjZfb3Jfc2VuZF9hY2ssCisJLmRlc3RydWN0b3IJPQl0Y3BfdjZfb3JfZnJlZSwKKwkuc2VuZF9yZXNldAk9CXRjcF92Nl9zZW5kX3Jlc2V0Cit9OworCitzdGF0aWMgaW50IGlwdjZfb3B0X2FjY2VwdGVkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CisJc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQgPSBJUDZDQihza2IpOworCisJaWYgKG5wLT5yeG9wdC5hbGwpIHsKKwkJaWYgKChvcHQtPmhvcCAmJiBucC0+cnhvcHQuYml0cy5ob3BvcHRzKSB8fAorCQkgICAgKChJUFY2X0ZMT1dJTkZPX01BU0smKih1MzIqKXNrYi0+bmgucmF3KSAmJgorCQkgICAgIG5wLT5yeG9wdC5iaXRzLnJ4ZmxvdykgfHwKKwkJICAgIChvcHQtPnNyY3J0ICYmIG5wLT5yeG9wdC5iaXRzLnNyY3J0KSB8fAorCQkgICAgKChvcHQtPmRzdDEgfHwgb3B0LT5kc3QwKSAmJiBucC0+cnhvcHQuYml0cy5kc3RvcHRzKSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCB0Y3BfdjZfc2VuZF9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3BoZHIgKnRoLCBpbnQgbGVuLCAKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOworCisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSB7CisJCXRoLT5jaGVjayA9IH5jc3VtX2lwdjZfbWFnaWMoJm5wLT5zYWRkciwgJm5wLT5kYWRkciwgbGVuLCBJUFBST1RPX1RDUCwgIDApOworCQlza2ItPmNzdW0gPSBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBjaGVjayk7CisJfSBlbHNlIHsKKwkJdGgtPmNoZWNrID0gY3N1bV9pcHY2X21hZ2ljKCZucC0+c2FkZHIsICZucC0+ZGFkZHIsIGxlbiwgSVBQUk9UT19UQ1AsIAorCQkJCQkgICAgY3N1bV9wYXJ0aWFsKChjaGFyICopdGgsIHRoLT5kb2ZmPDwyLCAKKwkJCQkJCQkgc2tiLT5jc3VtKSk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHRjcF92Nl9zZW5kX3Jlc2V0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHRjcGhkciAqdGggPSBza2ItPmgudGgsICp0MTsgCisJc3RydWN0IHNrX2J1ZmYgKmJ1ZmY7CisJc3RydWN0IGZsb3dpIGZsOworCisJaWYgKHRoLT5yc3QpCisJCXJldHVybjsKKworCWlmICghaXB2Nl91bmljYXN0X2Rlc3RpbmF0aW9uKHNrYikpCisJCXJldHVybjsgCisKKwkvKgorCSAqIFdlIG5lZWQgdG8gZ3JhYiBzb21lIG1lbW9yeSwgYW5kIHB1dCB0b2dldGhlciBhbiBSU1QsCisJICogYW5kIHRoZW4gcHV0IGl0IGludG8gdGhlIHF1ZXVlIHRvIGJlIHNlbnQuCisJICovCisKKwlidWZmID0gYWxsb2Nfc2tiKE1BWF9IRUFERVIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpLAorCQkJIEdGUF9BVE9NSUMpOworCWlmIChidWZmID09IE5VTEwpIAorCSAgCXJldHVybjsKKworCXNrYl9yZXNlcnZlKGJ1ZmYsIE1BWF9IRUFERVIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKTsKKworCXQxID0gKHN0cnVjdCB0Y3BoZHIgKikgc2tiX3B1c2goYnVmZixzaXplb2Yoc3RydWN0IHRjcGhkcikpOworCisJLyogU3dhcCB0aGUgc2VuZCBhbmQgdGhlIHJlY2VpdmUuICovCisJbWVtc2V0KHQxLCAwLCBzaXplb2YoKnQxKSk7CisJdDEtPmRlc3QgPSB0aC0+c291cmNlOworCXQxLT5zb3VyY2UgPSB0aC0+ZGVzdDsKKwl0MS0+ZG9mZiA9IHNpemVvZigqdDEpLzQ7CisJdDEtPnJzdCA9IDE7CisgIAorCWlmKHRoLT5hY2spIHsKKwkgIAl0MS0+c2VxID0gdGgtPmFja19zZXE7CisJfSBlbHNlIHsKKwkJdDEtPmFjayA9IDE7CisJCXQxLT5hY2tfc2VxID0gaHRvbmwobnRvaGwodGgtPnNlcSkgKyB0aC0+c3luICsgdGgtPmZpbgorCQkJCSAgICArIHNrYi0+bGVuIC0gKHRoLT5kb2ZmPDwyKSk7CisJfQorCisJYnVmZi0+Y3N1bSA9IGNzdW1fcGFydGlhbCgoY2hhciAqKXQxLCBzaXplb2YoKnQxKSwgMCk7CisKKwltZW1zZXQoJmZsLCAwLCBzaXplb2YoZmwpKTsKKwlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgJnNrYi0+bmguaXB2NmgtPnNhZGRyKTsKKwlpcHY2X2FkZHJfY29weSgmZmwuZmw2X3NyYywgJnNrYi0+bmguaXB2NmgtPmRhZGRyKTsKKworCXQxLT5jaGVjayA9IGNzdW1faXB2Nl9tYWdpYygmZmwuZmw2X3NyYywgJmZsLmZsNl9kc3QsCisJCQkJICAgIHNpemVvZigqdDEpLCBJUFBST1RPX1RDUCwKKwkJCQkgICAgYnVmZi0+Y3N1bSk7CisKKwlmbC5wcm90byA9IElQUFJPVE9fVENQOworCWZsLm9pZiA9IHRjcF92Nl9paWYoc2tiKTsKKwlmbC5mbF9pcF9kcG9ydCA9IHQxLT5kZXN0OworCWZsLmZsX2lwX3Nwb3J0ID0gdDEtPnNvdXJjZTsKKworCS8qIHNrID0gTlVMTCwgYnV0IGl0IGlzIHNhZmUgZm9yIG5vdy4gUlNUIHNvY2tldCByZXF1aXJlZC4gKi8KKwlpZiAoIWlwNl9kc3RfbG9va3VwKE5VTEwsICZidWZmLT5kc3QsICZmbCkpIHsKKworCQlpZiAoKHhmcm1fbG9va3VwKCZidWZmLT5kc3QsICZmbCwgTlVMTCwgMCkpIDwgMCkgeworCQkJZHN0X3JlbGVhc2UoYnVmZi0+ZHN0KTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlwNl94bWl0KE5VTEwsIGJ1ZmYsICZmbCwgTlVMTCwgMCk7CisJCVRDUF9JTkNfU1RBVFNfQkgoVENQX01JQl9PVVRTRUdTKTsKKwkJVENQX0lOQ19TVEFUU19CSChUQ1BfTUlCX09VVFJTVFMpOworCQlyZXR1cm47CisJfQorCisJa2ZyZWVfc2tiKGJ1ZmYpOworfQorCitzdGF0aWMgdm9pZCB0Y3BfdjZfc2VuZF9hY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIHNlcSwgdTMyIGFjaywgdTMyIHdpbiwgdTMyIHRzKQoreworCXN0cnVjdCB0Y3BoZHIgKnRoID0gc2tiLT5oLnRoLCAqdDE7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZmY7CisJc3RydWN0IGZsb3dpIGZsOworCWludCB0b3RfbGVuID0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOworCisJaWYgKHRzKQorCQl0b3RfbGVuICs9IDMqNDsKKworCWJ1ZmYgPSBhbGxvY19za2IoTUFYX0hFQURFUiArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKyB0b3RfbGVuLAorCQkJIEdGUF9BVE9NSUMpOworCWlmIChidWZmID09IE5VTEwpCisJCXJldHVybjsKKworCXNrYl9yZXNlcnZlKGJ1ZmYsIE1BWF9IRUFERVIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsgdG90X2xlbik7CisKKwl0MSA9IChzdHJ1Y3QgdGNwaGRyICopIHNrYl9wdXNoKGJ1ZmYsdG90X2xlbik7CisKKwkvKiBTd2FwIHRoZSBzZW5kIGFuZCB0aGUgcmVjZWl2ZS4gKi8KKwltZW1zZXQodDEsIDAsIHNpemVvZigqdDEpKTsKKwl0MS0+ZGVzdCA9IHRoLT5zb3VyY2U7CisJdDEtPnNvdXJjZSA9IHRoLT5kZXN0OworCXQxLT5kb2ZmID0gdG90X2xlbi80OworCXQxLT5zZXEgPSBodG9ubChzZXEpOworCXQxLT5hY2tfc2VxID0gaHRvbmwoYWNrKTsKKwl0MS0+YWNrID0gMTsKKwl0MS0+d2luZG93ID0gaHRvbnMod2luKTsKKwkKKwlpZiAodHMpIHsKKwkJdTMyICpwdHIgPSAodTMyKikodDEgKyAxKTsKKwkJKnB0cisrID0gaHRvbmwoKFRDUE9QVF9OT1AgPDwgMjQpIHwgKFRDUE9QVF9OT1AgPDwgMTYpIHwKKwkJCSAgICAgICAoVENQT1BUX1RJTUVTVEFNUCA8PCA4KSB8IFRDUE9MRU5fVElNRVNUQU1QKTsKKwkJKnB0cisrID0gaHRvbmwodGNwX3RpbWVfc3RhbXApOworCQkqcHRyID0gaHRvbmwodHMpOworCX0KKworCWJ1ZmYtPmNzdW0gPSBjc3VtX3BhcnRpYWwoKGNoYXIgKil0MSwgdG90X2xlbiwgMCk7CisKKwltZW1zZXQoJmZsLCAwLCBzaXplb2YoZmwpKTsKKwlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgJnNrYi0+bmguaXB2NmgtPnNhZGRyKTsKKwlpcHY2X2FkZHJfY29weSgmZmwuZmw2X3NyYywgJnNrYi0+bmguaXB2NmgtPmRhZGRyKTsKKworCXQxLT5jaGVjayA9IGNzdW1faXB2Nl9tYWdpYygmZmwuZmw2X3NyYywgJmZsLmZsNl9kc3QsCisJCQkJICAgIHRvdF9sZW4sIElQUFJPVE9fVENQLAorCQkJCSAgICBidWZmLT5jc3VtKTsKKworCWZsLnByb3RvID0gSVBQUk9UT19UQ1A7CisJZmwub2lmID0gdGNwX3Y2X2lpZihza2IpOworCWZsLmZsX2lwX2Rwb3J0ID0gdDEtPmRlc3Q7CisJZmwuZmxfaXBfc3BvcnQgPSB0MS0+c291cmNlOworCisJaWYgKCFpcDZfZHN0X2xvb2t1cChOVUxMLCAmYnVmZi0+ZHN0LCAmZmwpKSB7CisJCWlmICgoeGZybV9sb29rdXAoJmJ1ZmYtPmRzdCwgJmZsLCBOVUxMLCAwKSkgPCAwKSB7CisJCQlkc3RfcmVsZWFzZShidWZmLT5kc3QpOworCQkJcmV0dXJuOworCQl9CisJCWlwNl94bWl0KE5VTEwsIGJ1ZmYsICZmbCwgTlVMTCwgMCk7CisJCVRDUF9JTkNfU1RBVFNfQkgoVENQX01JQl9PVVRTRUdTKTsKKwkJcmV0dXJuOworCX0KKworCWtmcmVlX3NrYihidWZmKTsKK30KKworc3RhdGljIHZvaWQgdGNwX3Y2X3RpbWV3YWl0X2FjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHRjcF90d19idWNrZXQgKnR3ID0gKHN0cnVjdCB0Y3BfdHdfYnVja2V0ICopc2s7CisKKwl0Y3BfdjZfc2VuZF9hY2soc2tiLCB0dy0+dHdfc25kX254dCwgdHctPnR3X3Jjdl9ueHQsCisJCQl0dy0+dHdfcmN2X3duZCA+PiB0dy0+dHdfcmN2X3dzY2FsZSwgdHctPnR3X3RzX3JlY2VudCk7CisKKwl0Y3BfdHdfcHV0KHR3KTsKK30KKworc3RhdGljIHZvaWQgdGNwX3Y2X29yX3NlbmRfYWNrKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBvcGVuX3JlcXVlc3QgKnJlcSkKK3sKKwl0Y3BfdjZfc2VuZF9hY2soc2tiLCByZXEtPnNudF9pc24rMSwgcmVxLT5yY3ZfaXNuKzEsIHJlcS0+cmN2X3duZCwgcmVxLT50c19yZWNlbnQpOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqdGNwX3Y2X2huZF9yZXEoc3RydWN0IHNvY2sgKnNrLHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG9wZW5fcmVxdWVzdCAqcmVxLCAqKnByZXY7CisJc3RydWN0IHRjcGhkciAqdGggPSBza2ItPmgudGg7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IHNvY2sgKm5zazsKKworCS8qIEZpbmQgcG9zc2libGUgY29ubmVjdGlvbiByZXF1ZXN0cy4gKi8KKwlyZXEgPSB0Y3BfdjZfc2VhcmNoX3JlcSh0cCwgJnByZXYsIHRoLT5zb3VyY2UsICZza2ItPm5oLmlwdjZoLT5zYWRkciwKKwkJCQkmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsIHRjcF92Nl9paWYoc2tiKSk7CisJaWYgKHJlcSkKKwkJcmV0dXJuIHRjcF9jaGVja19yZXEoc2ssIHNrYiwgcmVxLCBwcmV2KTsKKworCW5zayA9IF9fdGNwX3Y2X2xvb2t1cF9lc3RhYmxpc2hlZCgmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCisJCQkJCSAgdGgtPnNvdXJjZSwKKwkJCQkJICAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsCisJCQkJCSAgbnRvaHModGgtPmRlc3QpLAorCQkJCQkgIHRjcF92Nl9paWYoc2tiKSk7CisKKwlpZiAobnNrKSB7CisJCWlmIChuc2stPnNrX3N0YXRlICE9IFRDUF9USU1FX1dBSVQpIHsKKwkJCWJoX2xvY2tfc29jayhuc2spOworCQkJcmV0dXJuIG5zazsKKwkJfQorCQl0Y3BfdHdfcHV0KChzdHJ1Y3QgdGNwX3R3X2J1Y2tldCopbnNrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisjaWYgMCAvKmRlZiBDT05GSUdfU1lOX0NPT0tJRVMqLworCWlmICghdGgtPnJzdCAmJiAhdGgtPnN5biAmJiB0aC0+YWNrKQorCQlzayA9IGNvb2tpZV92Nl9jaGVjayhzaywgc2tiLCAmKElQQ0Ioc2tiKS0+b3B0KSk7CisjZW5kaWYKKwlyZXR1cm4gc2s7Cit9CisKK3N0YXRpYyB2b2lkIHRjcF92Nl9zeW5xX2FkZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBvcGVuX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgdGNwX2xpc3Rlbl9vcHQgKmxvcHQgPSB0cC0+bGlzdGVuX29wdDsKKwl1MzIgaCA9IHRjcF92Nl9zeW5xX2hhc2goJnJlcS0+YWYudjZfcmVxLnJtdF9hZGRyLCByZXEtPnJtdF9wb3J0LCBsb3B0LT5oYXNoX3JuZCk7CisKKwlyZXEtPnNrID0gTlVMTDsKKwlyZXEtPmV4cGlyZXMgPSBqaWZmaWVzICsgVENQX1RJTUVPVVRfSU5JVDsKKwlyZXEtPnJldHJhbnMgPSAwOworCXJlcS0+ZGxfbmV4dCA9IGxvcHQtPnN5bl90YWJsZVtoXTsKKworCXdyaXRlX2xvY2soJnRwLT5zeW5fd2FpdF9sb2NrKTsKKwlsb3B0LT5zeW5fdGFibGVbaF0gPSByZXE7CisJd3JpdGVfdW5sb2NrKCZ0cC0+c3luX3dhaXRfbG9jayk7CisKKwl0Y3Bfc3lucV9hZGRlZChzayk7Cit9CisKKworLyogRklYTUU6IHRoaXMgaXMgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSBpcHY0IGNvZGUuCisgKiBDYW4gc29tZSBraW5kIG9mIG1lcmdlIGJlIGRvbmU/IC0tIGVyaWNzCisgKi8KK3N0YXRpYyBpbnQgdGNwX3Y2X2Nvbm5fcmVxdWVzdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOworCXN0cnVjdCB0Y3Bfb3B0aW9uc19yZWNlaXZlZCB0bXBfb3B0OworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBvcGVuX3JlcXVlc3QgKnJlcSA9IE5VTEw7CisJX191MzIgaXNuID0gVENQX1NLQl9DQihza2IpLT53aGVuOworCisJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKQorCQlyZXR1cm4gdGNwX3Y0X2Nvbm5fcmVxdWVzdChzaywgc2tiKTsKKworCWlmICghaXB2Nl91bmljYXN0X2Rlc3RpbmF0aW9uKHNrYikpCisJCWdvdG8gZHJvcDsgCisKKwkvKgorCSAqCVRoZXJlIGFyZSBubyBTWU4gYXR0YWNrcyBvbiBJUHY2LCB5ZXQuLi4JCisJICovCisJaWYgKHRjcF9zeW5xX2lzX2Z1bGwoc2spICYmICFpc24pIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX0lORk8gIlRDUHY2OiBkcm9wcGluZyByZXF1ZXN0LCBzeW5mbG9vZCBpcyBwb3NzaWJsZVxuIik7CisJCWdvdG8gZHJvcDsJCQorCX0KKworCWlmIChza19hY2NlcHRxX2lzX2Z1bGwoc2spICYmIHRjcF9zeW5xX3lvdW5nKHNrKSA+IDEpCisJCWdvdG8gZHJvcDsKKworCXJlcSA9IHRjcF9vcGVucmVxX2FsbG9jKCk7CisJaWYgKHJlcSA9PSBOVUxMKQorCQlnb3RvIGRyb3A7CisKKwl0Y3BfY2xlYXJfb3B0aW9ucygmdG1wX29wdCk7CisJdG1wX29wdC5tc3NfY2xhbXAgPSBJUFY2X01JTl9NVFUgLSBzaXplb2Yoc3RydWN0IHRjcGhkcikgLSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCXRtcF9vcHQudXNlcl9tc3MgPSB0cC0+cnhfb3B0LnVzZXJfbXNzOworCisJdGNwX3BhcnNlX29wdGlvbnMoc2tiLCAmdG1wX29wdCwgMCk7CisKKwl0bXBfb3B0LnRzdGFtcF9vayA9IHRtcF9vcHQuc2F3X3RzdGFtcDsKKwl0Y3Bfb3BlbnJlcV9pbml0KHJlcSwgJnRtcF9vcHQsIHNrYik7CisKKwlyZXEtPmNsYXNzID0gJm9yX2lwdjY7CisJaXB2Nl9hZGRyX2NvcHkoJnJlcS0+YWYudjZfcmVxLnJtdF9hZGRyLCAmc2tiLT5uaC5pcHY2aC0+c2FkZHIpOworCWlwdjZfYWRkcl9jb3B5KCZyZXEtPmFmLnY2X3JlcS5sb2NfYWRkciwgJnNrYi0+bmguaXB2NmgtPmRhZGRyKTsKKwlUQ1BfRUNOX2NyZWF0ZV9yZXF1ZXN0KHJlcSwgc2tiLT5oLnRoKTsKKwlyZXEtPmFmLnY2X3JlcS5wa3RvcHRzID0gTlVMTDsKKwlpZiAoaXB2Nl9vcHRfYWNjZXB0ZWQoc2ssIHNrYikgfHwKKwkgICAgbnAtPnJ4b3B0LmJpdHMucnhpbmZvIHx8CisJICAgIG5wLT5yeG9wdC5iaXRzLnJ4aGxpbSkgeworCQlhdG9taWNfaW5jKCZza2ItPnVzZXJzKTsKKwkJcmVxLT5hZi52Nl9yZXEucGt0b3B0cyA9IHNrYjsKKwl9CisJcmVxLT5hZi52Nl9yZXEuaWlmID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKKworCS8qIFNvIHRoYXQgbGluayBsb2NhbHMgaGF2ZSBtZWFuaW5nICovCisJaWYgKCFzay0+c2tfYm91bmRfZGV2X2lmICYmCisJICAgIGlwdjZfYWRkcl90eXBlKCZyZXEtPmFmLnY2X3JlcS5ybXRfYWRkcikgJiBJUFY2X0FERFJfTElOS0xPQ0FMKQorCQlyZXEtPmFmLnY2X3JlcS5paWYgPSB0Y3BfdjZfaWlmKHNrYik7CisKKwlpZiAoaXNuID09IDApIAorCQlpc24gPSB0Y3BfdjZfaW5pdF9zZXF1ZW5jZShzayxza2IpOworCisJcmVxLT5zbnRfaXNuID0gaXNuOworCisJaWYgKHRjcF92Nl9zZW5kX3N5bmFjayhzaywgcmVxLCBOVUxMKSkKKwkJZ290byBkcm9wOworCisJdGNwX3Y2X3N5bnFfYWRkKHNrLCByZXEpOworCisJcmV0dXJuIDA7CisKK2Ryb3A6CisJaWYgKHJlcSkKKwkJdGNwX29wZW5yZXFfZnJlZShyZXEpOworCisJVENQX0lOQ19TVEFUU19CSChUQ1BfTUlCX0FUVEVNUFRGQUlMUyk7CisJcmV0dXJuIDA7IC8qIGRvbid0IHNlbmQgcmVzZXQgKi8KK30KKworc3RhdGljIHN0cnVjdCBzb2NrICogdGNwX3Y2X3N5bl9yZWN2X3NvY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgIHN0cnVjdCBvcGVuX3JlcXVlc3QgKnJlcSwKKwkJCQkJICBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCit7CisJc3RydWN0IGlwdjZfcGluZm8gKm5ld25wLCAqbnAgPSBpbmV0Nl9zayhzayk7CisJc3RydWN0IHRjcDZfc29jayAqbmV3dGNwNnNrOworCXN0cnVjdCBpbmV0X3NvY2sgKm5ld2luZXQ7CisJc3RydWN0IHRjcF9zb2NrICpuZXd0cDsKKwlzdHJ1Y3Qgc29jayAqbmV3c2s7CisJc3RydWN0IGlwdjZfdHhvcHRpb25zICpvcHQ7CisKKwlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpIHsKKwkJLyoKKwkJICoJdjYgbWFwcGVkCisJCSAqLworCisJCW5ld3NrID0gdGNwX3Y0X3N5bl9yZWN2X3NvY2soc2ssIHNrYiwgcmVxLCBkc3QpOworCisJCWlmIChuZXdzayA9PSBOVUxMKSAKKwkJCXJldHVybiBOVUxMOworCisJCW5ld3RjcDZzayA9IChzdHJ1Y3QgdGNwNl9zb2NrICopbmV3c2s7CisJCWluZXRfc2sobmV3c2spLT5waW5ldDYgPSAmbmV3dGNwNnNrLT5pbmV0NjsKKworCQluZXdpbmV0ID0gaW5ldF9zayhuZXdzayk7CisJCW5ld25wID0gaW5ldDZfc2sobmV3c2spOworCQluZXd0cCA9IHRjcF9zayhuZXdzayk7CisKKwkJbWVtY3B5KG5ld25wLCBucCwgc2l6ZW9mKHN0cnVjdCBpcHY2X3BpbmZvKSk7CisKKwkJaXB2Nl9hZGRyX3NldCgmbmV3bnAtPmRhZGRyLCAwLCAwLCBodG9ubCgweDAwMDBGRkZGKSwKKwkJCSAgICAgIG5ld2luZXQtPmRhZGRyKTsKKworCQlpcHY2X2FkZHJfc2V0KCZuZXducC0+c2FkZHIsIDAsIDAsIGh0b25sKDB4MDAwMEZGRkYpLAorCQkJICAgICAgbmV3aW5ldC0+c2FkZHIpOworCisJCWlwdjZfYWRkcl9jb3B5KCZuZXducC0+cmN2X3NhZGRyLCAmbmV3bnAtPnNhZGRyKTsKKworCQluZXd0cC0+YWZfc3BlY2lmaWMgPSAmaXB2Nl9tYXBwZWQ7CisJCW5ld3NrLT5za19iYWNrbG9nX3JjdiA9IHRjcF92NF9kb19yY3Y7CisJCW5ld25wLT5wa3RvcHRpb25zICA9IE5VTEw7CisJCW5ld25wLT5vcHQJICAgPSBOVUxMOworCQluZXducC0+bWNhc3Rfb2lmICAgPSB0Y3BfdjZfaWlmKHNrYik7CisJCW5ld25wLT5tY2FzdF9ob3BzICA9IHNrYi0+bmguaXB2NmgtPmhvcF9saW1pdDsKKworCQkvKiBDaGFyZ2UgbmV3bHkgYWxsb2NhdGVkIElQdjYgc29ja2V0LiBUaG91Z2ggaXQgaXMgbWFwcGVkLAorCQkgKiBpdCBpcyBJUHY2IHlldC4KKwkJICovCisjaWZkZWYgSU5FVF9SRUZDTlRfREVCVUcKKwkJYXRvbWljX2luYygmaW5ldDZfc29ja19ucik7CisjZW5kaWYKKworCQkvKiBJdCBpcyB0cmlja3kgcGxhY2UuIFVudGlsIHRoaXMgbW9tZW50IElQdjQgdGNwCisJCSAgIHdvcmtlZCB3aXRoIElQdjYgYWZfdGNwLmFmX3NwZWNpZmljLgorCQkgICBTeW5jIGl0IG5vdy4KKwkJICovCisJCXRjcF9zeW5jX21zcyhuZXdzaywgbmV3dHAtPnBtdHVfY29va2llKTsKKworCQlyZXR1cm4gbmV3c2s7CisJfQorCisJb3B0ID0gbnAtPm9wdDsKKworCWlmIChza19hY2NlcHRxX2lzX2Z1bGwoc2spKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKworCWlmIChucC0+cnhvcHQuYml0cy5zcmNydCA9PSAyICYmCisJICAgIG9wdCA9PSBOVUxMICYmIHJlcS0+YWYudjZfcmVxLnBrdG9wdHMpIHsKKwkJc3RydWN0IGluZXQ2X3NrYl9wYXJtICpyeG9wdCA9IElQNkNCKHJlcS0+YWYudjZfcmVxLnBrdG9wdHMpOworCQlpZiAocnhvcHQtPnNyY3J0KQorCQkJb3B0ID0gaXB2Nl9pbnZlcnRfcnRoZHIoc2ssIChzdHJ1Y3QgaXB2Nl9ydF9oZHIqKShyZXEtPmFmLnY2X3JlcS5wa3RvcHRzLT5uaC5yYXcrcnhvcHQtPnNyY3J0KSk7CisJfQorCisJaWYgKGRzdCA9PSBOVUxMKSB7CisJCXN0cnVjdCBpbjZfYWRkciAqZmluYWxfcCA9IE5VTEwsIGZpbmFsOworCQlzdHJ1Y3QgZmxvd2kgZmw7CisKKwkJbWVtc2V0KCZmbCwgMCwgc2l6ZW9mKGZsKSk7CisJCWZsLnByb3RvID0gSVBQUk9UT19UQ1A7CisJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCAmcmVxLT5hZi52Nl9yZXEucm10X2FkZHIpOworCQlpZiAob3B0ICYmIG9wdC0+c3JjcnQpIHsKKwkJCXN0cnVjdCBydDBfaGRyICpydDAgPSAoc3RydWN0IHJ0MF9oZHIgKikgb3B0LT5zcmNydDsKKwkJCWlwdjZfYWRkcl9jb3B5KCZmaW5hbCwgJmZsLmZsNl9kc3QpOworCQkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsIHJ0MC0+YWRkcik7CisJCQlmaW5hbF9wID0gJmZpbmFsOworCQl9CisJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfc3JjLCAmcmVxLT5hZi52Nl9yZXEubG9jX2FkZHIpOworCQlmbC5vaWYgPSBzay0+c2tfYm91bmRfZGV2X2lmOworCQlmbC5mbF9pcF9kcG9ydCA9IHJlcS0+cm10X3BvcnQ7CisJCWZsLmZsX2lwX3Nwb3J0ID0gaW5ldF9zayhzayktPnNwb3J0OworCisJCWlmIChpcDZfZHN0X2xvb2t1cChzaywgJmRzdCwgJmZsKSkKKwkJCWdvdG8gb3V0OworCisJCWlmIChmaW5hbF9wKQorCQkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsIGZpbmFsX3ApOworCisJCWlmICgoeGZybV9sb29rdXAoJmRzdCwgJmZsLCBzaywgMCkpIDwgMCkKKwkJCWdvdG8gb3V0OworCX0gCisKKwluZXdzayA9IHRjcF9jcmVhdGVfb3BlbnJlcV9jaGlsZChzaywgcmVxLCBza2IpOworCWlmIChuZXdzayA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCS8qIENoYXJnZSBuZXdseSBhbGxvY2F0ZWQgSVB2NiBzb2NrZXQgKi8KKyNpZmRlZiBJTkVUX1JFRkNOVF9ERUJVRworCWF0b21pY19pbmMoJmluZXQ2X3NvY2tfbnIpOworI2VuZGlmCisKKwlpcDZfZHN0X3N0b3JlKG5ld3NrLCBkc3QsIE5VTEwpOworCW5ld3NrLT5za19yb3V0ZV9jYXBzID0gZHN0LT5kZXYtPmZlYXR1cmVzICYKKwkJfihORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX1RTTyk7CisKKwluZXd0Y3A2c2sgPSAoc3RydWN0IHRjcDZfc29jayAqKW5ld3NrOworCWluZXRfc2sobmV3c2spLT5waW5ldDYgPSAmbmV3dGNwNnNrLT5pbmV0NjsKKworCW5ld3RwID0gdGNwX3NrKG5ld3NrKTsKKwluZXdpbmV0ID0gaW5ldF9zayhuZXdzayk7CisJbmV3bnAgPSBpbmV0Nl9zayhuZXdzayk7CisKKwltZW1jcHkobmV3bnAsIG5wLCBzaXplb2Yoc3RydWN0IGlwdjZfcGluZm8pKTsKKworCWlwdjZfYWRkcl9jb3B5KCZuZXducC0+ZGFkZHIsICZyZXEtPmFmLnY2X3JlcS5ybXRfYWRkcik7CisJaXB2Nl9hZGRyX2NvcHkoJm5ld25wLT5zYWRkciwgJnJlcS0+YWYudjZfcmVxLmxvY19hZGRyKTsKKwlpcHY2X2FkZHJfY29weSgmbmV3bnAtPnJjdl9zYWRkciwgJnJlcS0+YWYudjZfcmVxLmxvY19hZGRyKTsKKwluZXdzay0+c2tfYm91bmRfZGV2X2lmID0gcmVxLT5hZi52Nl9yZXEuaWlmOworCisJLyogTm93IElQdjYgb3B0aW9ucy4uLiAKKworCSAgIEZpcnN0OiBubyBJUHY0IG9wdGlvbnMuCisJICovCisJbmV3aW5ldC0+b3B0ID0gTlVMTDsKKworCS8qIENsb25lIFJYIGJpdHMgKi8KKwluZXducC0+cnhvcHQuYWxsID0gbnAtPnJ4b3B0LmFsbDsKKworCS8qIENsb25lIHBrdG9wdGlvbnMgcmVjZWl2ZWQgd2l0aCBTWU4gKi8KKwluZXducC0+cGt0b3B0aW9ucyA9IE5VTEw7CisJaWYgKHJlcS0+YWYudjZfcmVxLnBrdG9wdHMpIHsKKwkJbmV3bnAtPnBrdG9wdGlvbnMgPSBza2JfY2xvbmUocmVxLT5hZi52Nl9yZXEucGt0b3B0cywKKwkJCQkJICAgICAgR0ZQX0FUT01JQyk7CisJCWtmcmVlX3NrYihyZXEtPmFmLnY2X3JlcS5wa3RvcHRzKTsKKwkJcmVxLT5hZi52Nl9yZXEucGt0b3B0cyA9IE5VTEw7CisJCWlmIChuZXducC0+cGt0b3B0aW9ucykKKwkJCXNrYl9zZXRfb3duZXJfcihuZXducC0+cGt0b3B0aW9ucywgbmV3c2spOworCX0KKwluZXducC0+b3B0CSAgPSBOVUxMOworCW5ld25wLT5tY2FzdF9vaWYgID0gdGNwX3Y2X2lpZihza2IpOworCW5ld25wLT5tY2FzdF9ob3BzID0gc2tiLT5uaC5pcHY2aC0+aG9wX2xpbWl0OworCisJLyogQ2xvbmUgbmF0aXZlIElQdjYgb3B0aW9ucyBmcm9tIGxpc3RlbmluZyBzb2NrZXQgKGlmIGFueSkKKworCSAgIFllcywga2VlcGluZyByZWZlcmVuY2UgY291bnQgd291bGQgYmUgbXVjaCBtb3JlIGNsZXZlciwKKwkgICBidXQgd2UgbWFrZSBvbmUgbW9yZSBvbmUgdGhpbmcgdGhlcmU6IHJlYXR0YWNoIG9wdG1lbQorCSAgIHRvIG5ld3NrLgorCSAqLworCWlmIChvcHQpIHsKKwkJbmV3bnAtPm9wdCA9IGlwdjZfZHVwX29wdGlvbnMobmV3c2ssIG9wdCk7CisJCWlmIChvcHQgIT0gbnAtPm9wdCkKKwkJCXNvY2tfa2ZyZWVfcyhzaywgb3B0LCBvcHQtPnRvdF9sZW4pOworCX0KKworCW5ld3RwLT5leHRfaGVhZGVyX2xlbiA9IDA7CisJaWYgKG5ld25wLT5vcHQpCisJCW5ld3RwLT5leHRfaGVhZGVyX2xlbiA9IG5ld25wLT5vcHQtPm9wdF9uZmxlbiArCisJCQkJCW5ld25wLT5vcHQtPm9wdF9mbGVuOworCisJdGNwX3N5bmNfbXNzKG5ld3NrLCBkc3RfbXR1KGRzdCkpOworCW5ld3RwLT5hZHZtc3MgPSBkc3RfbWV0cmljKGRzdCwgUlRBWF9BRFZNU1MpOworCXRjcF9pbml0aWFsaXplX3Jjdl9tc3MobmV3c2spOworCisJbmV3aW5ldC0+ZGFkZHIgPSBuZXdpbmV0LT5zYWRkciA9IG5ld2luZXQtPnJjdl9zYWRkciA9IExPT1BCQUNLNF9JUFY2OworCisJX190Y3BfdjZfaGFzaChuZXdzayk7CisJdGNwX2luaGVyaXRfcG9ydChzaywgbmV3c2spOworCisJcmV0dXJuIG5ld3NrOworCitvdXRfb3ZlcmZsb3c6CisJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfTElTVEVOT1ZFUkZMT1dTKTsKK291dDoKKwlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9MSVNURU5EUk9QUyk7CisJaWYgKG9wdCAmJiBvcHQgIT0gbnAtPm9wdCkKKwkJc29ja19rZnJlZV9zKHNrLCBvcHQsIG9wdC0+dG90X2xlbik7CisJZHN0X3JlbGVhc2UoZHN0KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCB0Y3BfdjZfY2hlY2tzdW1faW5pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykgeworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCQlpZiAoIXRjcF92Nl9jaGVjayhza2ItPmgudGgsc2tiLT5sZW4sJnNrYi0+bmguaXB2NmgtPnNhZGRyLAorCQkJCSAgJnNrYi0+bmguaXB2NmgtPmRhZGRyLHNrYi0+Y3N1bSkpCisJCQlyZXR1cm4gMDsKKwkJTElNSVRfTkVUREVCVUcocHJpbnRrKEtFUk5fREVCVUcgImh3IHRjcCB2NiBjc3VtIGZhaWxlZFxuIikpOworCX0KKwlpZiAoc2tiLT5sZW4gPD0gNzYpIHsKKwkJaWYgKHRjcF92Nl9jaGVjayhza2ItPmgudGgsc2tiLT5sZW4sJnNrYi0+bmguaXB2NmgtPnNhZGRyLAorCQkJCSAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsc2tiX2NoZWNrc3VtKHNrYiwgMCwgc2tiLT5sZW4sIDApKSkKKwkJCXJldHVybiAtMTsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwl9IGVsc2UgeworCQlza2ItPmNzdW0gPSB+dGNwX3Y2X2NoZWNrKHNrYi0+aC50aCxza2ItPmxlbiwmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCisJCQkJCSAgJnNrYi0+bmguaXB2NmgtPmRhZGRyLDApOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogVGhlIHNvY2tldCBtdXN0IGhhdmUgaXQncyBzcGlubG9jayBoZWxkIHdoZW4gd2UgZ2V0CisgKiBoZXJlLgorICoKKyAqIFdlIGhhdmUgYSBwb3RlbnRpYWwgZG91YmxlLWxvY2sgY2FzZSBoZXJlLCBzbyBldmVuIHdoZW4KKyAqIGRvaW5nIGJhY2tsb2cgcHJvY2Vzc2luZyB3ZSB1c2UgdGhlIEJIIGxvY2tpbmcgc2NoZW1lLgorICogVGhpcyBpcyBiZWNhdXNlIHdlIGNhbm5vdCBzbGVlcCB3aXRoIHRoZSBvcmlnaW5hbCBzcGlubG9jaworICogaGVsZC4KKyAqLworc3RhdGljIGludCB0Y3BfdjZfZG9fcmN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CisJc3RydWN0IHRjcF9zb2NrICp0cDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqb3B0X3NrYiA9IE5VTEw7CisKKwkvKiBJbWFnaW5lOiBzb2NrZXQgaXMgSVB2Ni4gSVB2NCBwYWNrZXQgYXJyaXZlcywKKwkgICBnb2VzIHRvIElQdjQgcmVjZWl2ZSBoYW5kbGVyIGFuZCBiYWNrbG9nZ2VkLgorCSAgIEZyb20gYmFja2xvZyBpdCBhbHdheXMgZ29lcyBoZXJlLiBLZXJib29tLi4uCisJICAgRm9ydHVuYXRlbHksIHRjcF9yY3ZfZXN0YWJsaXNoZWQgYW5kIHJjdl9lc3RhYmxpc2hlZAorCSAgIGhhbmRsZSB0aGVtIGNvcnJlY3RseSwgYnV0IGl0IGlzIG5vdCBjYXNlIHdpdGgKKwkgICB0Y3BfdjZfaG5kX3JlcSBhbmQgdGNwX3Y2X3NlbmRfcmVzZXQoKS4gICAtLUFOSworCSAqLworCisJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKQorCQlyZXR1cm4gdGNwX3Y0X2RvX3Jjdihzaywgc2tiKTsKKworCWlmIChza19maWx0ZXIoc2ssIHNrYiwgMCkpCisJCWdvdG8gZGlzY2FyZDsKKworCS8qCisJICoJc29ja2V0IGxvY2tpbmcgaXMgaGVyZSBmb3IgU01QIHB1cnBvc2VzIGFzIGJhY2tsb2cgcmN2CisJICoJaXMgY3VycmVudGx5IGNhbGxlZCB3aXRoIGJoIHByb2Nlc3NpbmcgZGlzYWJsZWQuCisJICovCisKKwkvKiBEbyBTdGV2ZW5zJyBJUFY2X1BLVE9QVElPTlMuCisKKwkgICBZZXMsIGd1eXMsIGl0IGlzIHRoZSBvbmx5IHBsYWNlIGluIG91ciBjb2RlLCB3aGVyZSB3ZQorCSAgIG1heSBtYWtlIGl0IG5vdCBhZmZlY3RpbmcgSVB2NC4KKwkgICBUaGUgcmVzdCBvZiBjb2RlIGlzIHByb3RvY29sIGluZGVwZW5kZW50LAorCSAgIGFuZCBJIGRvIG5vdCBsaWtlIGlkZWEgdG8gdWdsaWZ5IElQdjQuCisKKwkgICBBY3R1YWxseSwgYWxsIHRoZSBpZGVhIGJlaGluZCBJUFY2X1BLVE9QVElPTlMKKwkgICBsb29rcyBub3QgdmVyeSB3ZWxsIHRob3VnaHQuIEZvciBub3cgd2UgbGF0Y2gKKwkgICBvcHRpb25zLCByZWNlaXZlZCBpbiB0aGUgbGFzdCBwYWNrZXQsIGVucXVldWVkCisJICAgYnkgdGNwLiBGZWVsIGZyZWUgdG8gcHJvcG9zZSBiZXR0ZXIgc29sdXRpb24uCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1BTksgKDk4MDcyOCkKKwkgKi8KKwlpZiAobnAtPnJ4b3B0LmFsbCkKKwkJb3B0X3NrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCisJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfRVNUQUJMSVNIRUQpIHsgLyogRmFzdCBwYXRoICovCisJCVRDUF9DSEVDS19USU1FUihzayk7CisJCWlmICh0Y3BfcmN2X2VzdGFibGlzaGVkKHNrLCBza2IsIHNrYi0+aC50aCwgc2tiLT5sZW4pKQorCQkJZ290byByZXNldDsKKwkJVENQX0NIRUNLX1RJTUVSKHNrKTsKKwkJaWYgKG9wdF9za2IpCisJCQlnb3RvIGlwdjZfcGt0b3B0aW9uczsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHNrYi0+bGVuIDwgKHNrYi0+aC50aC0+ZG9mZjw8MikgfHwgdGNwX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpCisJCWdvdG8gY3N1bV9lcnI7CisKKwlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9MSVNURU4pIHsgCisJCXN0cnVjdCBzb2NrICpuc2sgPSB0Y3BfdjZfaG5kX3JlcShzaywgc2tiKTsKKwkJaWYgKCFuc2spCisJCQlnb3RvIGRpc2NhcmQ7CisKKwkJLyoKKwkJICogUXVldWUgaXQgb24gdGhlIG5ldyBzb2NrZXQgaWYgdGhlIG5ldyBzb2NrZXQgaXMgYWN0aXZlLAorCQkgKiBvdGhlcndpc2Ugd2UganVzdCBzaG9ydGNpcmN1aXQgdGhpcyBhbmQgY29udGludWUgd2l0aAorCQkgKiB0aGUgbmV3IHNvY2tldC4uCisJCSAqLworIAkJaWYobnNrICE9IHNrKSB7CisJCQlpZiAodGNwX2NoaWxkX3Byb2Nlc3Moc2ssIG5zaywgc2tiKSkKKwkJCQlnb3RvIHJlc2V0OworCQkJaWYgKG9wdF9za2IpCisJCQkJX19rZnJlZV9za2Iob3B0X3NrYik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCVRDUF9DSEVDS19USU1FUihzayk7CisJaWYgKHRjcF9yY3Zfc3RhdGVfcHJvY2Vzcyhzaywgc2tiLCBza2ItPmgudGgsIHNrYi0+bGVuKSkKKwkJZ290byByZXNldDsKKwlUQ1BfQ0hFQ0tfVElNRVIoc2spOworCWlmIChvcHRfc2tiKQorCQlnb3RvIGlwdjZfcGt0b3B0aW9uczsKKwlyZXR1cm4gMDsKKworcmVzZXQ6CisJdGNwX3Y2X3NlbmRfcmVzZXQoc2tiKTsKK2Rpc2NhcmQ6CisJaWYgKG9wdF9za2IpCisJCV9fa2ZyZWVfc2tiKG9wdF9za2IpOworCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworY3N1bV9lcnI6CisJVENQX0lOQ19TVEFUU19CSChUQ1BfTUlCX0lORVJSUyk7CisJZ290byBkaXNjYXJkOworCisKK2lwdjZfcGt0b3B0aW9uczoKKwkvKiBEbyB5b3UgYXNrLCB3aGF0IGlzIGl0PworCisJICAgMS4gc2tiIHdhcyBlbnF1ZXVlZCBieSB0Y3AuCisJICAgMi4gc2tiIGlzIGFkZGVkIHRvIHRhaWwgb2YgcmVhZCBxdWV1ZSwgcmF0aGVyIHRoYW4gb3V0IG9mIG9yZGVyLgorCSAgIDMuIHNvY2tldCBpcyBub3QgaW4gcGFzc2l2ZSBzdGF0ZS4KKwkgICA0LiBGaW5hbGx5LCBpdCByZWFsbHkgY29udGFpbnMgb3B0aW9ucywgd2hpY2ggdXNlciB3YW50cyB0byByZWNlaXZlLgorCSAqLworCXRwID0gdGNwX3NrKHNrKTsKKwlpZiAoVENQX1NLQl9DQihvcHRfc2tiKS0+ZW5kX3NlcSA9PSB0cC0+cmN2X254dCAmJgorCSAgICAhKCgxIDw8IHNrLT5za19zdGF0ZSkgJiAoVENQRl9DTE9TRSB8IFRDUEZfTElTVEVOKSkpIHsKKwkJaWYgKG5wLT5yeG9wdC5iaXRzLnJ4aW5mbykKKwkJCW5wLT5tY2FzdF9vaWYgPSB0Y3BfdjZfaWlmKG9wdF9za2IpOworCQlpZiAobnAtPnJ4b3B0LmJpdHMucnhobGltKQorCQkJbnAtPm1jYXN0X2hvcHMgPSBvcHRfc2tiLT5uaC5pcHY2aC0+aG9wX2xpbWl0OworCQlpZiAoaXB2Nl9vcHRfYWNjZXB0ZWQoc2ssIG9wdF9za2IpKSB7CisJCQlza2Jfc2V0X293bmVyX3Iob3B0X3NrYiwgc2spOworCQkJb3B0X3NrYiA9IHhjaGcoJm5wLT5wa3RvcHRpb25zLCBvcHRfc2tiKTsKKwkJfSBlbHNlIHsKKwkJCV9fa2ZyZWVfc2tiKG9wdF9za2IpOworCQkJb3B0X3NrYiA9IHhjaGcoJm5wLT5wa3RvcHRpb25zLCBOVUxMKTsKKwkJfQorCX0KKworCWlmIChvcHRfc2tiKQorCQlrZnJlZV9za2Iob3B0X3NrYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGNwX3Y2X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGludCAqbmhvZmZwKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSAqcHNrYjsKKwlzdHJ1Y3QgdGNwaGRyICp0aDsJCisJc3RydWN0IHNvY2sgKnNrOworCWludCByZXQ7CisKKwlpZiAoc2tiLT5wa3RfdHlwZSAhPSBQQUNLRVRfSE9TVCkKKwkJZ290byBkaXNjYXJkX2l0OworCisJLyoKKwkgKglDb3VudCBpdCBldmVuIGlmIGl0J3MgYmFkLgorCSAqLworCVRDUF9JTkNfU1RBVFNfQkgoVENQX01JQl9JTlNFR1MpOworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKSkKKwkJZ290byBkaXNjYXJkX2l0OworCisJdGggPSBza2ItPmgudGg7CisKKwlpZiAodGgtPmRvZmYgPCBzaXplb2Yoc3RydWN0IHRjcGhkcikvNCkKKwkJZ290byBiYWRfcGFja2V0OworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHRoLT5kb2ZmKjQpKQorCQlnb3RvIGRpc2NhcmRfaXQ7CisKKwlpZiAoKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1VOTkVDRVNTQVJZICYmCisJICAgICB0Y3BfdjZfY2hlY2tzdW1faW5pdChza2IpIDwgMCkpCisJCWdvdG8gYmFkX3BhY2tldDsKKworCXRoID0gc2tiLT5oLnRoOworCVRDUF9TS0JfQ0Ioc2tiKS0+c2VxID0gbnRvaGwodGgtPnNlcSk7CisJVENQX1NLQl9DQihza2IpLT5lbmRfc2VxID0gKFRDUF9TS0JfQ0Ioc2tiKS0+c2VxICsgdGgtPnN5biArIHRoLT5maW4gKworCQkJCSAgICBza2ItPmxlbiAtIHRoLT5kb2ZmKjQpOworCVRDUF9TS0JfQ0Ioc2tiKS0+YWNrX3NlcSA9IG50b2hsKHRoLT5hY2tfc2VxKTsKKwlUQ1BfU0tCX0NCKHNrYiktPndoZW4gPSAwOworCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgPSBpcHY2X2dldF9kc2ZpZWxkKHNrYi0+bmguaXB2NmgpOworCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkID0gMDsKKworCXNrID0gX190Y3BfdjZfbG9va3VwKCZza2ItPm5oLmlwdjZoLT5zYWRkciwgdGgtPnNvdXJjZSwKKwkJCSAgICAgJnNrYi0+bmguaXB2NmgtPmRhZGRyLCBudG9ocyh0aC0+ZGVzdCksIHRjcF92Nl9paWYoc2tiKSk7CisKKwlpZiAoIXNrKQorCQlnb3RvIG5vX3RjcF9zb2NrZXQ7CisKK3Byb2Nlc3M6CisJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfVElNRV9XQUlUKQorCQlnb3RvIGRvX3RpbWVfd2FpdDsKKworCWlmICgheGZybTZfcG9saWN5X2NoZWNrKHNrLCBYRlJNX1BPTElDWV9JTiwgc2tiKSkKKwkJZ290byBkaXNjYXJkX2FuZF9yZWxzZTsKKworCWlmIChza19maWx0ZXIoc2ssIHNrYiwgMCkpCisJCWdvdG8gZGlzY2FyZF9hbmRfcmVsc2U7CisKKwlza2ItPmRldiA9IE5VTEw7CisKKwliaF9sb2NrX3NvY2soc2spOworCXJldCA9IDA7CisJaWYgKCFzb2NrX293bmVkX2J5X3VzZXIoc2spKSB7CisJCWlmICghdGNwX3ByZXF1ZXVlKHNrLCBza2IpKQorCQkJcmV0ID0gdGNwX3Y2X2RvX3Jjdihzaywgc2tiKTsKKwl9IGVsc2UKKwkJc2tfYWRkX2JhY2tsb2coc2ssIHNrYik7CisJYmhfdW5sb2NrX3NvY2soc2spOworCisJc29ja19wdXQoc2spOworCXJldHVybiByZXQgPyAtMSA6IDA7CisKK25vX3RjcF9zb2NrZXQ6CisJaWYgKCF4ZnJtNl9wb2xpY3lfY2hlY2soTlVMTCwgWEZSTV9QT0xJQ1lfSU4sIHNrYikpCisJCWdvdG8gZGlzY2FyZF9pdDsKKworCWlmIChza2ItPmxlbiA8ICh0aC0+ZG9mZjw8MikgfHwgdGNwX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpIHsKK2JhZF9wYWNrZXQ6CisJCVRDUF9JTkNfU1RBVFNfQkgoVENQX01JQl9JTkVSUlMpOworCX0gZWxzZSB7CisJCXRjcF92Nl9zZW5kX3Jlc2V0KHNrYik7CisJfQorCitkaXNjYXJkX2l0OgorCisJLyoKKwkgKglEaXNjYXJkIGZyYW1lCisJICovCisKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKKworZGlzY2FyZF9hbmRfcmVsc2U6CisJc29ja19wdXQoc2spOworCWdvdG8gZGlzY2FyZF9pdDsKKworZG9fdGltZV93YWl0OgorCWlmICgheGZybTZfcG9saWN5X2NoZWNrKE5VTEwsIFhGUk1fUE9MSUNZX0lOLCBza2IpKSB7CisJCXRjcF90d19wdXQoKHN0cnVjdCB0Y3BfdHdfYnVja2V0ICopIHNrKTsKKwkJZ290byBkaXNjYXJkX2l0OworCX0KKworCWlmIChza2ItPmxlbiA8ICh0aC0+ZG9mZjw8MikgfHwgdGNwX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpIHsKKwkJVENQX0lOQ19TVEFUU19CSChUQ1BfTUlCX0lORVJSUyk7CisJCXRjcF90d19wdXQoKHN0cnVjdCB0Y3BfdHdfYnVja2V0ICopIHNrKTsKKwkJZ290byBkaXNjYXJkX2l0OworCX0KKworCXN3aXRjaCh0Y3BfdGltZXdhaXRfc3RhdGVfcHJvY2Vzcygoc3RydWN0IHRjcF90d19idWNrZXQgKilzaywKKwkJCQkJICBza2IsIHRoLCBza2ItPmxlbikpIHsKKwljYXNlIFRDUF9UV19TWU46CisJeworCQlzdHJ1Y3Qgc29jayAqc2syOworCisJCXNrMiA9IHRjcF92Nl9sb29rdXBfbGlzdGVuZXIoJnNrYi0+bmguaXB2NmgtPmRhZGRyLCBudG9ocyh0aC0+ZGVzdCksIHRjcF92Nl9paWYoc2tiKSk7CisJCWlmIChzazIgIT0gTlVMTCkgeworCQkJdGNwX3R3X2Rlc2NoZWR1bGUoKHN0cnVjdCB0Y3BfdHdfYnVja2V0ICopc2spOworCQkJdGNwX3R3X3B1dCgoc3RydWN0IHRjcF90d19idWNrZXQgKilzayk7CisJCQlzayA9IHNrMjsKKwkJCWdvdG8gcHJvY2VzczsKKwkJfQorCQkvKiBGYWxsIHRocm91Z2ggdG8gQUNLICovCisJfQorCWNhc2UgVENQX1RXX0FDSzoKKwkJdGNwX3Y2X3RpbWV3YWl0X2Fjayhzaywgc2tiKTsKKwkJYnJlYWs7CisJY2FzZSBUQ1BfVFdfUlNUOgorCQlnb3RvIG5vX3RjcF9zb2NrZXQ7CisJY2FzZSBUQ1BfVFdfU1VDQ0VTUzo7CisJfQorCWdvdG8gZGlzY2FyZF9pdDsKK30KKworc3RhdGljIGludCB0Y3BfdjZfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNvY2sgKnNrKQoreworCWludCBlcnI7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0OworCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKKworCWRzdCA9IF9fc2tfZHN0X2NoZWNrKHNrLCBucC0+ZHN0X2Nvb2tpZSk7CisKKwlpZiAoZHN0ID09IE5VTEwpIHsKKwkJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCQlzdHJ1Y3QgaW42X2FkZHIgKmZpbmFsX3AgPSBOVUxMLCBmaW5hbDsKKwkJc3RydWN0IGZsb3dpIGZsOworCisJCW1lbXNldCgmZmwsIDAsIHNpemVvZihmbCkpOworCQlmbC5wcm90byA9IElQUFJPVE9fVENQOworCQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgJm5wLT5kYWRkcik7CisJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfc3JjLCAmbnAtPnNhZGRyKTsKKwkJZmwuZmw2X2Zsb3dsYWJlbCA9IG5wLT5mbG93X2xhYmVsOworCQlmbC5vaWYgPSBzay0+c2tfYm91bmRfZGV2X2lmOworCQlmbC5mbF9pcF9kcG9ydCA9IGluZXQtPmRwb3J0OworCQlmbC5mbF9pcF9zcG9ydCA9IGluZXQtPnNwb3J0OworCisJCWlmIChucC0+b3B0ICYmIG5wLT5vcHQtPnNyY3J0KSB7CisJCQlzdHJ1Y3QgcnQwX2hkciAqcnQwID0gKHN0cnVjdCBydDBfaGRyICopIG5wLT5vcHQtPnNyY3J0OworCQkJaXB2Nl9hZGRyX2NvcHkoJmZpbmFsLCAmZmwuZmw2X2RzdCk7CisJCQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgcnQwLT5hZGRyKTsKKwkJCWZpbmFsX3AgPSAmZmluYWw7CisJCX0KKworCQllcnIgPSBpcDZfZHN0X2xvb2t1cChzaywgJmRzdCwgJmZsKTsKKwkJaWYgKGVycikgeworCQkJc2stPnNrX3JvdXRlX2NhcHMgPSAwOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlpZiAoZmluYWxfcCkKKwkJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCBmaW5hbF9wKTsKKworCQlpZiAoKGVyciA9IHhmcm1fbG9va3VwKCZkc3QsICZmbCwgc2ssIDApKSA8IDApIHsKKwkJCXNrLT5za19lcnJfc29mdCA9IC1lcnI7CisJCQlkc3RfcmVsZWFzZShkc3QpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCWlwNl9kc3Rfc3RvcmUoc2ssIGRzdCwgTlVMTCk7CisJCXNrLT5za19yb3V0ZV9jYXBzID0gZHN0LT5kZXYtPmZlYXR1cmVzICYKKwkJCX4oTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9UU08pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRjcF92Nl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIGludCBpcGZyYWdvaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBza2ItPnNrOworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CisJc3RydWN0IGZsb3dpIGZsOworCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKKwlzdHJ1Y3QgaW42X2FkZHIgKmZpbmFsX3AgPSBOVUxMLCBmaW5hbDsKKworCW1lbXNldCgmZmwsIDAsIHNpemVvZihmbCkpOworCWZsLnByb3RvID0gSVBQUk9UT19UQ1A7CisJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsICZucC0+ZGFkZHIpOworCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfc3JjLCAmbnAtPnNhZGRyKTsKKwlmbC5mbDZfZmxvd2xhYmVsID0gbnAtPmZsb3dfbGFiZWw7CisJSVA2X0VDTl9mbG93X3htaXQoc2ssIGZsLmZsNl9mbG93bGFiZWwpOworCWZsLm9pZiA9IHNrLT5za19ib3VuZF9kZXZfaWY7CisJZmwuZmxfaXBfc3BvcnQgPSBpbmV0LT5zcG9ydDsKKwlmbC5mbF9pcF9kcG9ydCA9IGluZXQtPmRwb3J0OworCisJaWYgKG5wLT5vcHQgJiYgbnAtPm9wdC0+c3JjcnQpIHsKKwkJc3RydWN0IHJ0MF9oZHIgKnJ0MCA9IChzdHJ1Y3QgcnQwX2hkciAqKSBucC0+b3B0LT5zcmNydDsKKwkJaXB2Nl9hZGRyX2NvcHkoJmZpbmFsLCAmZmwuZmw2X2RzdCk7CisJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCBydDAtPmFkZHIpOworCQlmaW5hbF9wID0gJmZpbmFsOworCX0KKworCWRzdCA9IF9fc2tfZHN0X2NoZWNrKHNrLCBucC0+ZHN0X2Nvb2tpZSk7CisKKwlpZiAoZHN0ID09IE5VTEwpIHsKKwkJaW50IGVyciA9IGlwNl9kc3RfbG9va3VwKHNrLCAmZHN0LCAmZmwpOworCisJCWlmIChlcnIpIHsKKwkJCXNrLT5za19lcnJfc29mdCA9IC1lcnI7CisJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJaWYgKGZpbmFsX3ApCisJCQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgZmluYWxfcCk7CisKKwkJaWYgKChlcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIHNrLCAwKSkgPCAwKSB7CisJCQlzay0+c2tfcm91dGVfY2FwcyA9IDA7CisJCQlkc3RfcmVsZWFzZShkc3QpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCWlwNl9kc3Rfc3RvcmUoc2ssIGRzdCwgTlVMTCk7CisJCXNrLT5za19yb3V0ZV9jYXBzID0gZHN0LT5kZXYtPmZlYXR1cmVzICYKKwkJCX4oTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9UU08pOworCX0KKworCXNrYi0+ZHN0ID0gZHN0X2Nsb25lKGRzdCk7CisKKwkvKiBSZXN0b3JlIGZpbmFsIGRlc3RpbmF0aW9uIGJhY2sgYWZ0ZXIgcm91dGluZyBkb25lICovCisJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsICZucC0+ZGFkZHIpOworCisJcmV0dXJuIGlwNl94bWl0KHNrLCBza2IsICZmbCwgbnAtPm9wdCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHY2X2FkZHIyc29ja2FkZHIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29ja2FkZHIgKiB1YWRkcikKK3sKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CisJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIHVhZGRyOworCisJc2luNi0+c2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKwlpcHY2X2FkZHJfY29weSgmc2luNi0+c2luNl9hZGRyLCAmbnAtPmRhZGRyKTsKKwlzaW42LT5zaW42X3BvcnQJPSBpbmV0X3NrKHNrKS0+ZHBvcnQ7CisJLyogV2UgZG8gbm90IHN0b3JlIHJlY2VpdmVkIGZsb3dsYWJlbCBmb3IgVENQICovCisJc2luNi0+c2luNl9mbG93aW5mbyA9IDA7CisJc2luNi0+c2luNl9zY29wZV9pZCA9IDA7CisJaWYgKHNrLT5za19ib3VuZF9kZXZfaWYgJiYKKwkgICAgaXB2Nl9hZGRyX3R5cGUoJnNpbjYtPnNpbjZfYWRkcikgJiBJUFY2X0FERFJfTElOS0xPQ0FMKQorCQlzaW42LT5zaW42X3Njb3BlX2lkID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKK30KKworc3RhdGljIGludCB0Y3BfdjZfcmVtZW1iZXJfc3RhbXAoc3RydWN0IHNvY2sgKnNrKQoreworCS8qIEFsYXMsIG5vdCB5ZXQuLi4gKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB0Y3BfZnVuYyBpcHY2X3NwZWNpZmljID0geworCS5xdWV1ZV94bWl0CT0JdGNwX3Y2X3htaXQsCisJLnNlbmRfY2hlY2sJPQl0Y3BfdjZfc2VuZF9jaGVjaywKKwkucmVidWlsZF9oZWFkZXIJPQl0Y3BfdjZfcmVidWlsZF9oZWFkZXIsCisJLmNvbm5fcmVxdWVzdAk9CXRjcF92Nl9jb25uX3JlcXVlc3QsCisJLnN5bl9yZWN2X3NvY2sJPQl0Y3BfdjZfc3luX3JlY3Zfc29jaywKKwkucmVtZW1iZXJfc3RhbXAJPQl0Y3BfdjZfcmVtZW1iZXJfc3RhbXAsCisJLm5ldF9oZWFkZXJfbGVuCT0Jc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSwKKworCS5zZXRzb2Nrb3B0CT0JaXB2Nl9zZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0CT0JaXB2Nl9nZXRzb2Nrb3B0LAorCS5hZGRyMnNvY2thZGRyCT0JdjZfYWRkcjJzb2NrYWRkciwKKwkuc29ja2FkZHJfbGVuCT0Jc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpCit9OworCisvKgorICoJVENQIG92ZXIgSVB2NCB2aWEgSU5FVDYgQVBJCisgKi8KKworc3RhdGljIHN0cnVjdCB0Y3BfZnVuYyBpcHY2X21hcHBlZCA9IHsKKwkucXVldWVfeG1pdAk9CWlwX3F1ZXVlX3htaXQsCisJLnNlbmRfY2hlY2sJPQl0Y3BfdjRfc2VuZF9jaGVjaywKKwkucmVidWlsZF9oZWFkZXIJPQl0Y3BfdjRfcmVidWlsZF9oZWFkZXIsCisJLmNvbm5fcmVxdWVzdAk9CXRjcF92Nl9jb25uX3JlcXVlc3QsCisJLnN5bl9yZWN2X3NvY2sJPQl0Y3BfdjZfc3luX3JlY3Zfc29jaywKKwkucmVtZW1iZXJfc3RhbXAJPQl0Y3BfdjRfcmVtZW1iZXJfc3RhbXAsCisJLm5ldF9oZWFkZXJfbGVuCT0Jc2l6ZW9mKHN0cnVjdCBpcGhkciksCisKKwkuc2V0c29ja29wdAk9CWlwdjZfc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdAk9CWlwdjZfZ2V0c29ja29wdCwKKwkuYWRkcjJzb2NrYWRkcgk9CXY2X2FkZHIyc29ja2FkZHIsCisJLnNvY2thZGRyX2xlbgk9CXNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KQorfTsKKworCisKKy8qIE5PVEU6IEEgbG90IG9mIHRoaW5ncyBzZXQgdG8gemVybyBleHBsaWNpdGx5IGJ5IGNhbGwgdG8KKyAqICAgICAgIHNrX2FsbG9jKCkgc28gbmVlZCBub3QgYmUgZG9uZSBoZXJlLgorICovCitzdGF0aWMgaW50IHRjcF92Nl9pbml0X3NvY2soc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CisJdGNwX2luaXRfeG1pdF90aW1lcnMoc2spOworCXRjcF9wcmVxdWV1ZV9pbml0KHRwKTsKKworCXRwLT5ydG8gID0gVENQX1RJTUVPVVRfSU5JVDsKKwl0cC0+bWRldiA9IFRDUF9USU1FT1VUX0lOSVQ7CisKKwkvKiBTbyBtYW55IFRDUCBpbXBsZW1lbnRhdGlvbnMgb3V0IHRoZXJlIChpbmNvcnJlY3RseSkgY291bnQgdGhlCisJICogaW5pdGlhbCBTWU4gZnJhbWUgaW4gdGhlaXIgZGVsYXllZC1BQ0sgYW5kIGNvbmdlc3Rpb24gY29udHJvbAorCSAqIGFsZ29yaXRobXMgdGhhdCB3ZSBtdXN0IGhhdmUgdGhlIGZvbGxvd2luZyBiYW5kYWlkIHRvIHRhbGsKKwkgKiBlZmZpY2llbnRseSB0byB0aGVtLiAgLURhdmVNCisJICovCisJdHAtPnNuZF9jd25kID0gMjsKKworCS8qIFNlZSBkcmFmdC1zdGV2ZW5zLXRjcGNhLXNwZWMtMDEgZm9yIGRpc2N1c3Npb24gb2YgdGhlCisJICogaW5pdGlhbGl6YXRpb24gb2YgdGhlc2UgdmFsdWVzLgorCSAqLworCXRwLT5zbmRfc3N0aHJlc2ggPSAweDdmZmZmZmZmOworCXRwLT5zbmRfY3duZF9jbGFtcCA9IH4wOworCXRwLT5tc3NfY2FjaGVfc3RkID0gdHAtPm1zc19jYWNoZSA9IDUzNjsKKworCXRwLT5yZW9yZGVyaW5nID0gc3lzY3RsX3RjcF9yZW9yZGVyaW5nOworCisJc2stPnNrX3N0YXRlID0gVENQX0NMT1NFOworCisJdHAtPmFmX3NwZWNpZmljID0gJmlwdjZfc3BlY2lmaWM7CisKKwlzay0+c2tfd3JpdGVfc3BhY2UgPSBza19zdHJlYW1fd3JpdGVfc3BhY2U7CisJc29ja19zZXRfZmxhZyhzaywgU09DS19VU0VfV1JJVEVfUVVFVUUpOworCisJc2stPnNrX3NuZGJ1ZiA9IHN5c2N0bF90Y3Bfd21lbVsxXTsKKwlzay0+c2tfcmN2YnVmID0gc3lzY3RsX3RjcF9ybWVtWzFdOworCisJYXRvbWljX2luYygmdGNwX3NvY2tldHNfYWxsb2NhdGVkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRjcF92Nl9kZXN0cm95X3NvY2soc3RydWN0IHNvY2sgKnNrKQoreworCWV4dGVybiBpbnQgdGNwX3Y0X2Rlc3Ryb3lfc29jayhzdHJ1Y3Qgc29jayAqc2spOworCisJdGNwX3Y0X2Rlc3Ryb3lfc29jayhzayk7CisJcmV0dXJuIGluZXQ2X2Rlc3Ryb3lfc29jayhzayk7Cit9CisKKy8qIFByb2MgZmlsZXN5c3RlbSBUQ1B2NiBzb2NrIGxpc3QgZHVtcGluZy4gKi8KK3N0YXRpYyB2b2lkIGdldF9vcGVucmVxNihzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgCisJCQkgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgb3Blbl9yZXF1ZXN0ICpyZXEsIGludCBpLCBpbnQgdWlkKQoreworCXN0cnVjdCBpbjZfYWRkciAqZGVzdCwgKnNyYzsKKwlpbnQgdHRkID0gcmVxLT5leHBpcmVzIC0gamlmZmllczsKKworCWlmICh0dGQgPCAwKQorCQl0dGQgPSAwOworCisJc3JjID0gJnJlcS0+YWYudjZfcmVxLmxvY19hZGRyOworCWRlc3QgPSAmcmVxLT5hZi52Nl9yZXEucm10X2FkZHI7CisJc2VxX3ByaW50ZihzZXEsCisJCSAgICIlNGQ6ICUwOFglMDhYJTA4WCUwOFg6JTA0WCAlMDhYJTA4WCUwOFglMDhYOiUwNFggIgorCQkgICAiJTAyWCAlMDhYOiUwOFggJTAyWDolMDhsWCAlMDhYICU1ZCAlOGQgJWQgJWQgJXBcbiIsCisJCSAgIGksCisJCSAgIHNyYy0+czZfYWRkcjMyWzBdLCBzcmMtPnM2X2FkZHIzMlsxXSwKKwkJICAgc3JjLT5zNl9hZGRyMzJbMl0sIHNyYy0+czZfYWRkcjMyWzNdLAorCQkgICBudG9ocyhpbmV0X3NrKHNrKS0+c3BvcnQpLAorCQkgICBkZXN0LT5zNl9hZGRyMzJbMF0sIGRlc3QtPnM2X2FkZHIzMlsxXSwKKwkJICAgZGVzdC0+czZfYWRkcjMyWzJdLCBkZXN0LT5zNl9hZGRyMzJbM10sCisJCSAgIG50b2hzKHJlcS0+cm10X3BvcnQpLAorCQkgICBUQ1BfU1lOX1JFQ1YsCisJCSAgIDAsMCwgLyogY291bGQgcHJpbnQgb3B0aW9uIHNpemUsIGJ1dCB0aGF0IGlzIGFmIGRlcGVuZGVudC4gKi8KKwkJICAgMSwgICAvKiB0aW1lcnMgYWN0aXZlIChvbmx5IHRoZSBleHBpcmUgdGltZXIpICovICAKKwkJICAgamlmZmllc190b19jbG9ja190KHR0ZCksIAorCQkgICByZXEtPnJldHJhbnMsCisJCSAgIHVpZCwKKwkJICAgMCwgIC8qIG5vbiBzdGFuZGFyZCB0aW1lciAqLyAgCisJCSAgIDAsIC8qIG9wZW5fcmVxdWVzdHMgaGF2ZSBubyBpbm9kZSAqLworCQkgICAwLCByZXEpOworfQorCitzdGF0aWMgdm9pZCBnZXRfdGNwNl9zb2NrKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3Qgc29jayAqc3AsIGludCBpKQoreworCXN0cnVjdCBpbjZfYWRkciAqZGVzdCwgKnNyYzsKKwlfX3UxNiBkZXN0cCwgc3JjcDsKKwlpbnQgdGltZXJfYWN0aXZlOworCXVuc2lnbmVkIGxvbmcgdGltZXJfZXhwaXJlczsKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzcCk7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzcCk7CisJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc3ApOworCisJZGVzdCAgPSAmbnAtPmRhZGRyOworCXNyYyAgID0gJm5wLT5yY3Zfc2FkZHI7CisJZGVzdHAgPSBudG9ocyhpbmV0LT5kcG9ydCk7CisJc3JjcCAgPSBudG9ocyhpbmV0LT5zcG9ydCk7CisJaWYgKHRwLT5wZW5kaW5nID09IFRDUF9USU1FX1JFVFJBTlMpIHsKKwkJdGltZXJfYWN0aXZlCT0gMTsKKwkJdGltZXJfZXhwaXJlcwk9IHRwLT50aW1lb3V0OworCX0gZWxzZSBpZiAodHAtPnBlbmRpbmcgPT0gVENQX1RJTUVfUFJPQkUwKSB7CisJCXRpbWVyX2FjdGl2ZQk9IDQ7CisJCXRpbWVyX2V4cGlyZXMJPSB0cC0+dGltZW91dDsKKwl9IGVsc2UgaWYgKHRpbWVyX3BlbmRpbmcoJnNwLT5za190aW1lcikpIHsKKwkJdGltZXJfYWN0aXZlCT0gMjsKKwkJdGltZXJfZXhwaXJlcwk9IHNwLT5za190aW1lci5leHBpcmVzOworCX0gZWxzZSB7CisJCXRpbWVyX2FjdGl2ZQk9IDA7CisJCXRpbWVyX2V4cGlyZXMgPSBqaWZmaWVzOworCX0KKworCXNlcV9wcmludGYoc2VxLAorCQkgICAiJTRkOiAlMDhYJTA4WCUwOFglMDhYOiUwNFggJTA4WCUwOFglMDhYJTA4WDolMDRYICIKKwkJICAgIiUwMlggJTA4WDolMDhYICUwMlg6JTA4bFggJTA4WCAlNWQgJThkICVsdSAlZCAlcCAldSAldSAldSAldSAlZFxuIiwKKwkJICAgaSwKKwkJICAgc3JjLT5zNl9hZGRyMzJbMF0sIHNyYy0+czZfYWRkcjMyWzFdLAorCQkgICBzcmMtPnM2X2FkZHIzMlsyXSwgc3JjLT5zNl9hZGRyMzJbM10sIHNyY3AsCisJCSAgIGRlc3QtPnM2X2FkZHIzMlswXSwgZGVzdC0+czZfYWRkcjMyWzFdLAorCQkgICBkZXN0LT5zNl9hZGRyMzJbMl0sIGRlc3QtPnM2X2FkZHIzMlszXSwgZGVzdHAsCisJCSAgIHNwLT5za19zdGF0ZSwgCisJCSAgIHRwLT53cml0ZV9zZXEtdHAtPnNuZF91bmEsIHRwLT5yY3Zfbnh0LXRwLT5jb3BpZWRfc2VxLAorCQkgICB0aW1lcl9hY3RpdmUsCisJCSAgIGppZmZpZXNfdG9fY2xvY2tfdCh0aW1lcl9leHBpcmVzIC0gamlmZmllcyksCisJCSAgIHRwLT5yZXRyYW5zbWl0cywKKwkJICAgc29ja19pX3VpZChzcCksCisJCSAgIHRwLT5wcm9iZXNfb3V0LAorCQkgICBzb2NrX2lfaW5vKHNwKSwKKwkJICAgYXRvbWljX3JlYWQoJnNwLT5za19yZWZjbnQpLCBzcCwKKwkJICAgdHAtPnJ0bywgdHAtPmFjay5hdG8sICh0cC0+YWNrLnF1aWNrPDwxKXx0cC0+YWNrLnBpbmdwb25nLAorCQkgICB0cC0+c25kX2N3bmQsIHRwLT5zbmRfc3N0aHJlc2g+PTB4RkZGRj8tMTp0cC0+c25kX3NzdGhyZXNoCisJCSAgICk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF90aW1ld2FpdDZfc29jayhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgCisJCQkgICAgICAgc3RydWN0IHRjcF90d19idWNrZXQgKnR3LCBpbnQgaSkKK3sKKwlzdHJ1Y3QgaW42X2FkZHIgKmRlc3QsICpzcmM7CisJX191MTYgZGVzdHAsIHNyY3A7CisJaW50IHR0ZCA9IHR3LT50d190dGQgLSBqaWZmaWVzOworCisJaWYgKHR0ZCA8IDApCisJCXR0ZCA9IDA7CisKKwlkZXN0ICA9ICZ0dy0+dHdfdjZfZGFkZHI7CisJc3JjICAgPSAmdHctPnR3X3Y2X3Jjdl9zYWRkcjsKKwlkZXN0cCA9IG50b2hzKHR3LT50d19kcG9ydCk7CisJc3JjcCAgPSBudG9ocyh0dy0+dHdfc3BvcnQpOworCisJc2VxX3ByaW50ZihzZXEsCisJCSAgICIlNGQ6ICUwOFglMDhYJTA4WCUwOFg6JTA0WCAlMDhYJTA4WCUwOFglMDhYOiUwNFggIgorCQkgICAiJTAyWCAlMDhYOiUwOFggJTAyWDolMDhsWCAlMDhYICU1ZCAlOGQgJWQgJWQgJXBcbiIsCisJCSAgIGksCisJCSAgIHNyYy0+czZfYWRkcjMyWzBdLCBzcmMtPnM2X2FkZHIzMlsxXSwKKwkJICAgc3JjLT5zNl9hZGRyMzJbMl0sIHNyYy0+czZfYWRkcjMyWzNdLCBzcmNwLAorCQkgICBkZXN0LT5zNl9hZGRyMzJbMF0sIGRlc3QtPnM2X2FkZHIzMlsxXSwKKwkJICAgZGVzdC0+czZfYWRkcjMyWzJdLCBkZXN0LT5zNl9hZGRyMzJbM10sIGRlc3RwLAorCQkgICB0dy0+dHdfc3Vic3RhdGUsIDAsIDAsCisJCSAgIDMsIGppZmZpZXNfdG9fY2xvY2tfdCh0dGQpLCAwLCAwLCAwLCAwLAorCQkgICBhdG9taWNfcmVhZCgmdHctPnR3X3JlZmNudCksIHR3KTsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgaW50IHRjcDZfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IHRjcF9pdGVyX3N0YXRlICpzdDsKKworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlzZXFfcHV0cyhzZXEsCisJCQkgIiAgc2wgICIKKwkJCSAibG9jYWxfYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAiCisJCQkgInJlbW90ZV9hZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgIgorCQkJICJzdCB0eF9xdWV1ZSByeF9xdWV1ZSB0ciB0bS0+d2hlbiByZXRybnNtdCIKKwkJCSAiICAgdWlkICB0aW1lb3V0IGlub2RlXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCXN0ID0gc2VxLT5wcml2YXRlOworCisJc3dpdGNoIChzdC0+c3RhdGUpIHsKKwljYXNlIFRDUF9TRVFfU1RBVEVfTElTVEVOSU5HOgorCWNhc2UgVENQX1NFUV9TVEFURV9FU1RBQkxJU0hFRDoKKwkJZ2V0X3RjcDZfc29jayhzZXEsIHYsIHN0LT5udW0pOworCQlicmVhazsKKwljYXNlIFRDUF9TRVFfU1RBVEVfT1BFTlJFUToKKwkJZ2V0X29wZW5yZXE2KHNlcSwgc3QtPnN5bl93YWl0X3NrLCB2LCBzdC0+bnVtLCBzdC0+dWlkKTsKKwkJYnJlYWs7CisJY2FzZSBUQ1BfU0VRX1NUQVRFX1RJTUVfV0FJVDoKKwkJZ2V0X3RpbWV3YWl0Nl9zb2NrKHNlcSwgdiwgc3QtPm51bSk7CisJCWJyZWFrOworCX0KK291dDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdGNwNl9zZXFfZm9wczsKK3N0YXRpYyBzdHJ1Y3QgdGNwX3NlcV9hZmluZm8gdGNwNl9zZXFfYWZpbmZvID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAidGNwNiIsCisJLmZhbWlseQkJPSBBRl9JTkVUNiwKKwkuc2VxX3Nob3cJPSB0Y3A2X3NlcV9zaG93LAorCS5zZXFfZm9wcwk9ICZ0Y3A2X3NlcV9mb3BzLAorfTsKKworaW50IF9faW5pdCB0Y3A2X3Byb2NfaW5pdCh2b2lkKQoreworCXJldHVybiB0Y3BfcHJvY19yZWdpc3RlcigmdGNwNl9zZXFfYWZpbmZvKTsKK30KKwordm9pZCB0Y3A2X3Byb2NfZXhpdCh2b2lkKQoreworCXRjcF9wcm9jX3VucmVnaXN0ZXIoJnRjcDZfc2VxX2FmaW5mbyk7Cit9CisjZW5kaWYKKworc3RydWN0IHByb3RvIHRjcHY2X3Byb3QgPSB7CisJLm5hbWUJCQk9ICJUQ1B2NiIsCisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuY2xvc2UJCQk9IHRjcF9jbG9zZSwKKwkuY29ubmVjdAkJPSB0Y3BfdjZfY29ubmVjdCwKKwkuZGlzY29ubmVjdAkJPSB0Y3BfZGlzY29ubmVjdCwKKwkuYWNjZXB0CQkJPSB0Y3BfYWNjZXB0LAorCS5pb2N0bAkJCT0gdGNwX2lvY3RsLAorCS5pbml0CQkJPSB0Y3BfdjZfaW5pdF9zb2NrLAorCS5kZXN0cm95CQk9IHRjcF92Nl9kZXN0cm95X3NvY2ssCisJLnNodXRkb3duCQk9IHRjcF9zaHV0ZG93biwKKwkuc2V0c29ja29wdAkJPSB0Y3Bfc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdAkJPSB0Y3BfZ2V0c29ja29wdCwKKwkuc2VuZG1zZwkJPSB0Y3Bfc2VuZG1zZywKKwkucmVjdm1zZwkJPSB0Y3BfcmVjdm1zZywKKwkuYmFja2xvZ19yY3YJCT0gdGNwX3Y2X2RvX3JjdiwKKwkuaGFzaAkJCT0gdGNwX3Y2X2hhc2gsCisJLnVuaGFzaAkJCT0gdGNwX3VuaGFzaCwKKwkuZ2V0X3BvcnQJCT0gdGNwX3Y2X2dldF9wb3J0LAorCS5lbnRlcl9tZW1vcnlfcHJlc3N1cmUJPSB0Y3BfZW50ZXJfbWVtb3J5X3ByZXNzdXJlLAorCS5zb2NrZXRzX2FsbG9jYXRlZAk9ICZ0Y3Bfc29ja2V0c19hbGxvY2F0ZWQsCisJLm1lbW9yeV9hbGxvY2F0ZWQJPSAmdGNwX21lbW9yeV9hbGxvY2F0ZWQsCisJLm1lbW9yeV9wcmVzc3VyZQk9ICZ0Y3BfbWVtb3J5X3ByZXNzdXJlLAorCS5zeXNjdGxfbWVtCQk9IHN5c2N0bF90Y3BfbWVtLAorCS5zeXNjdGxfd21lbQkJPSBzeXNjdGxfdGNwX3dtZW0sCisJLnN5c2N0bF9ybWVtCQk9IHN5c2N0bF90Y3Bfcm1lbSwKKwkubWF4X2hlYWRlcgkJPSBNQVhfVENQX0hFQURFUiwKKwkub2JqX3NpemUJCT0gc2l6ZW9mKHN0cnVjdCB0Y3A2X3NvY2spLAorfTsKKworc3RhdGljIHN0cnVjdCBpbmV0Nl9wcm90b2NvbCB0Y3B2Nl9wcm90b2NvbCA9IHsKKwkuaGFuZGxlcgk9CXRjcF92Nl9yY3YsCisJLmVycl9oYW5kbGVyCT0JdGNwX3Y2X2VyciwKKwkuZmxhZ3MJCT0JSU5FVDZfUFJPVE9fTk9QT0xJQ1l8SU5FVDZfUFJPVE9fRklOQUwsCit9OworCitleHRlcm4gc3RydWN0IHByb3RvX29wcyBpbmV0Nl9zdHJlYW1fb3BzOworCitzdGF0aWMgc3RydWN0IGluZXRfcHJvdG9zdyB0Y3B2Nl9wcm90b3N3ID0geworCS50eXBlCQk9CVNPQ0tfU1RSRUFNLAorCS5wcm90b2NvbAk9CUlQUFJPVE9fVENQLAorCS5wcm90CQk9CSZ0Y3B2Nl9wcm90LAorCS5vcHMJCT0JJmluZXQ2X3N0cmVhbV9vcHMsCisJLmNhcGFiaWxpdHkJPQktMSwKKwkubm9fY2hlY2sJPQkwLAorCS5mbGFncwkJPQlJTkVUX1BST1RPU1dfUEVSTUFORU5ULAorfTsKKwordm9pZCBfX2luaXQgdGNwdjZfaW5pdCh2b2lkKQoreworCS8qIHJlZ2lzdGVyIGluZXQ2IHByb3RvY29sICovCisJaWYgKGluZXQ2X2FkZF9wcm90b2NvbCgmdGNwdjZfcHJvdG9jb2wsIElQUFJPVE9fVENQKSA8IDApCisJCXByaW50ayhLRVJOX0VSUiAidGNwdjZfaW5pdDogQ291bGQgbm90IHJlZ2lzdGVyIHByb3RvY29sXG4iKTsKKwlpbmV0Nl9yZWdpc3Rlcl9wcm90b3N3KCZ0Y3B2Nl9wcm90b3N3KTsKK30KZGlmZiAtLWdpdCBhL25ldC9pcHY2L3VkcC5jIGIvbmV0L2lwdjYvdWRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1MWQwYgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY2L3VkcC5jCkBAIC0wLDAgKzEsMTA3NSBAQAorLyoKKyAqCVVEUCBvdmVyIElQdjYKKyAqCUxpbnV4IElORVQ2IGltcGxlbWVudGF0aW9uIAorICoKKyAqCUF1dGhvcnM6CisgKglQZWRybyBSb3F1ZQkJPHJvcXVlQGRpLmZjLnVsLnB0PgkKKyAqCisgKglCYXNlZCBvbiBsaW51eC9pcHY0L3VkcC5jCisgKgorICoJJElkOiB1ZHAuYyx2IDEuNjUgMjAwMi8wMi8wMSAyMjowMTowNCBkYXZlbSBFeHAgJAorICoKKyAqCUZpeGVzOgorICoJSGlkZWFraSBZT1NISUZVSkkJOglzaW42X3Njb3BlX2lkIHN1cHBvcnQKKyAqCVlPU0hJRlVKSSBIaWRlYWtpIEBVU0FHSSBhbmQ6CVN1cHBvcnQgSVBWNl9WNk9OTFkgc29ja2V0IG9wdGlvbiwgd2hpY2gKKyAqCUFsZXhleSBLdXpuZXRzb3YJCWFsbG93IGJvdGggSVB2NCBhbmQgSVB2NiBzb2NrZXRzIHRvIGJpbmQKKyAqCQkJCQlhIHNpbmdsZSBwb3J0IGF0IHRoZSBzYW1lIHRpbWUuCisgKiAgICAgIEthenVub3JpIE1JWUFaQVdBIEBVU0FHSTogICAgICAgY2hhbmdlIHByb2Nlc3Mgc3R5bGUgdG8gdXNlIGlwNl9hcHBlbmRfZGF0YQorICogICAgICBZT1NISUZVSkkgSGlkZWFraSBAVVNBR0k6CWNvbnZlcnQgL3Byb2MvbmV0L3VkcDYgdG8gc2VxX2ZpbGUuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3NubXAuaD4KKworI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L25kaXNjLmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L3RyYW5zcF92Ni5oPgorI2luY2x1ZGUgPG5ldC9pcDZfcm91dGUuaD4KKyNpbmNsdWRlIDxuZXQvYWRkcmNvbmYuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvdWRwLmg+CisjaW5jbHVkZSA8bmV0L3Jhdy5oPgorI2luY2x1ZGUgPG5ldC9pbmV0X2NvbW1vbi5oPgorCisjaW5jbHVkZSA8bmV0L2lwNl9jaGVja3N1bS5oPgorI2luY2x1ZGUgPG5ldC94ZnJtLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworREVGSU5FX1NOTVBfU1RBVChzdHJ1Y3QgdWRwX21pYiwgdWRwX3N0YXRzX2luNik7CisKKy8qIEdycnIsIGFkZHJfdHlwZSBhbHJlYWR5IGNhbGN1bGF0ZWQgYnkgY2FsbGVyLCBidXQgSSBkb24ndCB3YW50CisgKiB0byBhZGQgc29tZSBzaWxseSAiY29va2llIiBhcmd1bWVudCB0byB0aGlzIG1ldGhvZCBqdXN0IGZvciB0aGF0LgorICovCitzdGF0aWMgaW50IHVkcF92Nl9nZXRfcG9ydChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIHNob3J0IHNudW0pCit7CisJc3RydWN0IHNvY2sgKnNrMjsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCXdyaXRlX2xvY2tfYmgoJnVkcF9oYXNoX2xvY2spOworCWlmIChzbnVtID09IDApIHsKKwkJaW50IGJlc3Rfc2l6ZV9zb19mYXIsIGJlc3QsIHJlc3VsdCwgaTsKKworCQlpZiAodWRwX3BvcnRfcm92ZXIgPiBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVsxXSB8fAorCQkgICAgdWRwX3BvcnRfcm92ZXIgPCBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVswXSkKKwkJCXVkcF9wb3J0X3JvdmVyID0gc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMF07CisJCWJlc3Rfc2l6ZV9zb19mYXIgPSAzMjc2NzsKKwkJYmVzdCA9IHJlc3VsdCA9IHVkcF9wb3J0X3JvdmVyOworCQlmb3IgKGkgPSAwOyBpIDwgVURQX0hUQUJMRV9TSVpFOyBpKyssIHJlc3VsdCsrKSB7CisJCQlpbnQgc2l6ZTsKKwkJCXN0cnVjdCBobGlzdF9oZWFkICpsaXN0OworCisJCQlsaXN0ID0gJnVkcF9oYXNoW3Jlc3VsdCAmIChVRFBfSFRBQkxFX1NJWkUgLSAxKV07CisJCQlpZiAoaGxpc3RfZW1wdHkobGlzdCkpIHsKKwkJCQlpZiAocmVzdWx0ID4gc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMV0pCisJCQkJCXJlc3VsdCA9IHN5c2N0bF9sb2NhbF9wb3J0X3JhbmdlWzBdICsKKwkJCQkJCSgocmVzdWx0IC0gc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMF0pICYKKwkJCQkJCSAoVURQX0hUQUJMRV9TSVpFIC0gMSkpOworCQkJCWdvdG8gZ290aXQ7CisJCQl9CisJCQlzaXplID0gMDsKKwkJCXNrX2Zvcl9lYWNoKHNrMiwgbm9kZSwgbGlzdCkKKwkJCQlpZiAoKytzaXplID49IGJlc3Rfc2l6ZV9zb19mYXIpCisJCQkJCWdvdG8gbmV4dDsKKwkJCWJlc3Rfc2l6ZV9zb19mYXIgPSBzaXplOworCQkJYmVzdCA9IHJlc3VsdDsKKwkJbmV4dDo7CisJCX0KKwkJcmVzdWx0ID0gYmVzdDsKKwkJZm9yKDs7IHJlc3VsdCArPSBVRFBfSFRBQkxFX1NJWkUpIHsKKwkJCWlmIChyZXN1bHQgPiBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVsxXSkKKwkJCQlyZXN1bHQgPSBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVswXQorCQkJCQkrICgocmVzdWx0IC0gc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMF0pICYKKwkJCQkJICAgKFVEUF9IVEFCTEVfU0laRSAtIDEpKTsKKwkJCWlmICghdWRwX2xwb3J0X2ludXNlKHJlc3VsdCkpCisJCQkJYnJlYWs7CisJCX0KK2dvdGl0OgorCQl1ZHBfcG9ydF9yb3ZlciA9IHNudW0gPSByZXN1bHQ7CisJfSBlbHNlIHsKKwkJc2tfZm9yX2VhY2goc2syLCBub2RlLAorCQkJICAgICZ1ZHBfaGFzaFtzbnVtICYgKFVEUF9IVEFCTEVfU0laRSAtIDEpXSkgeworCQkJaWYgKGluZXRfc2soc2syKS0+bnVtID09IHNudW0gJiYKKwkJCSAgICBzazIgIT0gc2sgJiYKKwkJCSAgICAoIXNrMi0+c2tfYm91bmRfZGV2X2lmIHx8CisJCQkgICAgICFzay0+c2tfYm91bmRfZGV2X2lmIHx8CisJCQkgICAgIHNrMi0+c2tfYm91bmRfZGV2X2lmID09IHNrLT5za19ib3VuZF9kZXZfaWYpICYmCisJCQkgICAgKCFzazItPnNrX3JldXNlIHx8ICFzay0+c2tfcmV1c2UpICYmCisJCQkgICAgaXB2Nl9yY3Zfc2FkZHJfZXF1YWwoc2ssIHNrMikpCisJCQkJZ290byBmYWlsOworCQl9CisJfQorCisJaW5ldF9zayhzayktPm51bSA9IHNudW07CisJaWYgKHNrX3VuaGFzaGVkKHNrKSkgeworCQlza19hZGRfbm9kZShzaywgJnVkcF9oYXNoW3NudW0gJiAoVURQX0hUQUJMRV9TSVpFIC0gMSldKTsKKwkJc29ja19wcm90X2luY191c2Uoc2stPnNrX3Byb3QpOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJnVkcF9oYXNoX2xvY2spOworCXJldHVybiAwOworCitmYWlsOgorCXdyaXRlX3VubG9ja19iaCgmdWRwX2hhc2hfbG9jayk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHVkcF92Nl9oYXNoKHN0cnVjdCBzb2NrICpzaykKK3sKKwlCVUcoKTsKK30KKworc3RhdGljIHZvaWQgdWRwX3Y2X3VuaGFzaChzdHJ1Y3Qgc29jayAqc2spCit7CisgCXdyaXRlX2xvY2tfYmgoJnVkcF9oYXNoX2xvY2spOworCWlmIChza19kZWxfbm9kZV9pbml0KHNrKSkgeworCQlpbmV0X3NrKHNrKS0+bnVtID0gMDsKKwkJc29ja19wcm90X2RlY191c2Uoc2stPnNrX3Byb3QpOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJnVkcF9oYXNoX2xvY2spOworfQorCitzdGF0aWMgc3RydWN0IHNvY2sgKnVkcF92Nl9sb29rdXAoc3RydWN0IGluNl9hZGRyICpzYWRkciwgdTE2IHNwb3J0LAorCQkJCSAgc3RydWN0IGluNl9hZGRyICpkYWRkciwgdTE2IGRwb3J0LCBpbnQgZGlmKQoreworCXN0cnVjdCBzb2NrICpzaywgKnJlc3VsdCA9IE5VTEw7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJdW5zaWduZWQgc2hvcnQgaG51bSA9IG50b2hzKGRwb3J0KTsKKwlpbnQgYmFkbmVzcyA9IC0xOworCisgCXJlYWRfbG9jaygmdWRwX2hhc2hfbG9jayk7CisJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZ1ZHBfaGFzaFtobnVtICYgKFVEUF9IVEFCTEVfU0laRSAtIDEpXSkgeworCQlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisKKwkJaWYgKGluZXQtPm51bSA9PSBobnVtICYmIHNrLT5za19mYW1pbHkgPT0gUEZfSU5FVDYpIHsKKwkJCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKKwkJCWludCBzY29yZSA9IDA7CisJCQlpZiAoaW5ldC0+ZHBvcnQpIHsKKwkJCQlpZiAoaW5ldC0+ZHBvcnQgIT0gc3BvcnQpCisJCQkJCWNvbnRpbnVlOworCQkJCXNjb3JlKys7CisJCQl9CisJCQlpZiAoIWlwdjZfYWRkcl9hbnkoJm5wLT5yY3Zfc2FkZHIpKSB7CisJCQkJaWYgKCFpcHY2X2FkZHJfZXF1YWwoJm5wLT5yY3Zfc2FkZHIsIGRhZGRyKSkKKwkJCQkJY29udGludWU7CisJCQkJc2NvcmUrKzsKKwkJCX0KKwkJCWlmICghaXB2Nl9hZGRyX2FueSgmbnAtPmRhZGRyKSkgeworCQkJCWlmICghaXB2Nl9hZGRyX2VxdWFsKCZucC0+ZGFkZHIsIHNhZGRyKSkKKwkJCQkJY29udGludWU7CisJCQkJc2NvcmUrKzsKKwkJCX0KKwkJCWlmIChzay0+c2tfYm91bmRfZGV2X2lmKSB7CisJCQkJaWYgKHNrLT5za19ib3VuZF9kZXZfaWYgIT0gZGlmKQorCQkJCQljb250aW51ZTsKKwkJCQlzY29yZSsrOworCQkJfQorCQkJaWYoc2NvcmUgPT0gNCkgeworCQkJCXJlc3VsdCA9IHNrOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmKHNjb3JlID4gYmFkbmVzcykgeworCQkJCXJlc3VsdCA9IHNrOworCQkJCWJhZG5lc3MgPSBzY29yZTsKKwkJCX0KKwkJfQorCX0KKwlpZiAocmVzdWx0KQorCQlzb2NrX2hvbGQocmVzdWx0KTsKKyAJcmVhZF91bmxvY2soJnVkcF9oYXNoX2xvY2spOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKgorICovCisKK3N0YXRpYyB2b2lkIHVkcHY2X2Nsb3NlKHN0cnVjdCBzb2NrICpzaywgbG9uZyB0aW1lb3V0KQoreworCXNrX2NvbW1vbl9yZWxlYXNlKHNrKTsKK30KKworLyoKKyAqIAlUaGlzIHNob3VsZCBiZSBlYXN5LCBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdGhlcmUgd2UKKyAqIAlyZXR1cm4gaXQsIG90aGVyd2lzZSB3ZSBibG9jay4KKyAqLworCitzdGF0aWMgaW50IHVkcHY2X3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssIAorCQkgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwKKwkJICBpbnQgbm9ibG9jaywgaW50IGZsYWdzLCBpbnQgKmFkZHJfbGVuKQoreworCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisgIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXNpemVfdCBjb3BpZWQ7CisgIAlpbnQgZXJyOworCisgIAlpZiAoYWRkcl9sZW4pCisgIAkJKmFkZHJfbGVuPXNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKyAgCisJaWYgKGZsYWdzICYgTVNHX0VSUlFVRVVFKQorCQlyZXR1cm4gaXB2Nl9yZWN2X2Vycm9yKHNrLCBtc2csIGxlbik7CisKK3RyeV9hZ2FpbjoKKwlza2IgPSBza2JfcmVjdl9kYXRhZ3JhbShzaywgZmxhZ3MsIG5vYmxvY2ssICZlcnIpOworCWlmICghc2tiKQorCQlnb3RvIG91dDsKKworIAljb3BpZWQgPSBza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKyAgCWlmIChjb3BpZWQgPiBsZW4pIHsKKyAgCQljb3BpZWQgPSBsZW47CisgIAkJbXNnLT5tc2dfZmxhZ3MgfD0gTVNHX1RSVU5DOworICAJfQorCisJaWYgKHNrYi0+aXBfc3VtbWVkPT1DSEVDS1NVTV9VTk5FQ0VTU0FSWSkgeworCQllcnIgPSBza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSwgbXNnLT5tc2dfaW92LAorCQkJCQkgICAgICBjb3BpZWQpOworCX0gZWxzZSBpZiAobXNnLT5tc2dfZmxhZ3MmTVNHX1RSVU5DKSB7CisJCWlmICgodW5zaWduZWQgc2hvcnQpY3N1bV9mb2xkKHNrYl9jaGVja3N1bShza2IsIDAsIHNrYi0+bGVuLCBza2ItPmNzdW0pKSkKKwkJCWdvdG8gY3N1bV9jb3B5X2VycjsKKwkJZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkciksIG1zZy0+bXNnX2lvdiwKKwkJCQkJICAgICAgY29waWVkKTsKKwl9IGVsc2UgeworCQllcnIgPSBza2JfY29weV9hbmRfY3N1bV9kYXRhZ3JhbV9pb3ZlYyhza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSwgbXNnLT5tc2dfaW92KTsKKwkJaWYgKGVyciA9PSAtRUlOVkFMKQorCQkJZ290byBjc3VtX2NvcHlfZXJyOworCX0KKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlOworCisJc29ja19yZWN2X3RpbWVzdGFtcChtc2csIHNrLCBza2IpOworCisJLyogQ29weSB0aGUgYWRkcmVzcy4gKi8KKwlpZiAobXNnLT5tc2dfbmFtZSkgeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42OworCSAgCisJCXNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSBtc2ctPm1zZ19uYW1lOworCQlzaW42LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQlzaW42LT5zaW42X3BvcnQgPSBza2ItPmgudWgtPnNvdXJjZTsKKwkJc2luNi0+c2luNl9mbG93aW5mbyA9IDA7CisJCXNpbjYtPnNpbjZfc2NvcGVfaWQgPSAwOworCisJCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkKKwkJCWlwdjZfYWRkcl9zZXQoJnNpbjYtPnNpbjZfYWRkciwgMCwgMCwKKwkJCQkgICAgICBodG9ubCgweGZmZmYpLCBza2ItPm5oLmlwaC0+c2FkZHIpOworCQllbHNlIHsKKwkJCWlwdjZfYWRkcl9jb3B5KCZzaW42LT5zaW42X2FkZHIsICZza2ItPm5oLmlwdjZoLT5zYWRkcik7CisJCQlpZiAoaXB2Nl9hZGRyX3R5cGUoJnNpbjYtPnNpbjZfYWRkcikgJiBJUFY2X0FERFJfTElOS0xPQ0FMKQorCQkJCXNpbjYtPnNpbjZfc2NvcGVfaWQgPSBJUDZDQihza2IpLT5paWY7CisJCX0KKworCX0KKwlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpIHsKKwkJaWYgKGluZXQtPmNtc2dfZmxhZ3MpCisJCQlpcF9jbXNnX3JlY3YobXNnLCBza2IpOworCX0gZWxzZSB7CisJCWlmIChucC0+cnhvcHQuYWxsKQorCQkJZGF0YWdyYW1fcmVjdl9jdGwoc2ssIG1zZywgc2tiKTsKKyAgCX0KKworCWVyciA9IGNvcGllZDsKKwlpZiAoZmxhZ3MgJiBNU0dfVFJVTkMpCisJCWVyciA9IHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCitvdXRfZnJlZToKKwlza2JfZnJlZV9kYXRhZ3JhbShzaywgc2tiKTsKK291dDoKKwlyZXR1cm4gZXJyOworCitjc3VtX2NvcHlfZXJyOgorCS8qIENsZWFyIHF1ZXVlLiAqLworCWlmIChmbGFncyZNU0dfUEVFSykgeworCQlpbnQgY2xlYXIgPSAwOworCQlzcGluX2xvY2tfaXJxKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwkJaWYgKHNrYiA9PSBza2JfcGVlaygmc2stPnNrX3JlY2VpdmVfcXVldWUpKSB7CisJCQlfX3NrYl91bmxpbmsoc2tiLCAmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCQkJY2xlYXIgPSAxOworCQl9CisJCXNwaW5fdW5sb2NrX2lycSgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7CisJCWlmIChjbGVhcikKKwkJCWtmcmVlX3NrYihza2IpOworCX0KKworCXNrYl9mcmVlX2RhdGFncmFtKHNrLCBza2IpOworCisJaWYgKGZsYWdzICYgTVNHX0RPTlRXQUlUKSB7CisJCVVEUDZfSU5DX1NUQVRTX1VTRVIoVURQX01JQl9JTkVSUk9SUyk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlnb3RvIHRyeV9hZ2FpbjsKK30KKworc3RhdGljIHZvaWQgdWRwdjZfZXJyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0LAorCSAgICAgICBpbnQgdHlwZSwgaW50IGNvZGUsIGludCBvZmZzZXQsIF9fdTMyIGluZm8pCit7CisJc3RydWN0IGlwdjZfcGluZm8gKm5wOworCXN0cnVjdCBpcHY2aGRyICpoZHIgPSAoc3RydWN0IGlwdjZoZHIqKXNrYi0+ZGF0YTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CisJc3RydWN0IGluNl9hZGRyICpzYWRkciA9ICZoZHItPnNhZGRyOworCXN0cnVjdCBpbjZfYWRkciAqZGFkZHIgPSAmaGRyLT5kYWRkcjsKKwlzdHJ1Y3QgdWRwaGRyICp1aCA9IChzdHJ1Y3QgdWRwaGRyKikoc2tiLT5kYXRhK29mZnNldCk7CisJc3RydWN0IHNvY2sgKnNrOworCWludCBlcnI7CisKKwlzayA9IHVkcF92Nl9sb29rdXAoZGFkZHIsIHVoLT5kZXN0LCBzYWRkciwgdWgtPnNvdXJjZSwgZGV2LT5pZmluZGV4KTsKKyAgIAorCWlmIChzayA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlucCA9IGluZXQ2X3NrKHNrKTsKKworCWlmICghaWNtcHY2X2Vycl9jb252ZXJ0KHR5cGUsIGNvZGUsICZlcnIpICYmICFucC0+cmVjdmVycikKKwkJZ290byBvdXQ7CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCAmJiAhbnAtPnJlY3ZlcnIpCisJCWdvdG8gb3V0OworCisJaWYgKG5wLT5yZWN2ZXJyKQorCQlpcHY2X2ljbXBfZXJyb3Ioc2ssIHNrYiwgZXJyLCB1aC0+ZGVzdCwgbnRvaGwoaW5mbyksICh1OCAqKSh1aCsxKSk7CisKKwlzay0+c2tfZXJyID0gZXJyOworCXNrLT5za19lcnJvcl9yZXBvcnQoc2spOworb3V0OgorCXNvY2tfcHV0KHNrKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdWRwdjZfcXVldWVfcmN2X3NrYihzdHJ1Y3Qgc29jayAqIHNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmICgheGZybTZfcG9saWN5X2NoZWNrKHNrLCBYRlJNX1BPTElDWV9JTiwgc2tiKSkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSkgeworCQlpZiAoKHVuc2lnbmVkIHNob3J0KWNzdW1fZm9sZChza2JfY2hlY2tzdW0oc2tiLCAwLCBza2ItPmxlbiwgc2tiLT5jc3VtKSkpIHsKKwkJCVVEUDZfSU5DX1NUQVRTX0JIKFVEUF9NSUJfSU5FUlJPUlMpOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCX0KKworCWlmIChzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssc2tiKTwwKSB7CisJCVVEUDZfSU5DX1NUQVRTX0JIKFVEUF9NSUJfSU5FUlJPUlMpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCVVEUDZfSU5DX1NUQVRTX0JIKFVEUF9NSUJfSU5EQVRBR1JBTVMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNvY2sgKnVkcF92Nl9tY2FzdF9uZXh0KHN0cnVjdCBzb2NrICpzaywKKwkJCQkgICAgICB1MTYgbG9jX3BvcnQsIHN0cnVjdCBpbjZfYWRkciAqbG9jX2FkZHIsCisJCQkJICAgICAgdTE2IHJtdF9wb3J0LCBzdHJ1Y3QgaW42X2FkZHIgKnJtdF9hZGRyLAorCQkJCSAgICAgIGludCBkaWYpCit7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJc3RydWN0IHNvY2sgKnMgPSBzazsKKwl1bnNpZ25lZCBzaG9ydCBudW0gPSBudG9ocyhsb2NfcG9ydCk7CisKKwlza19mb3JfZWFjaF9mcm9tKHMsIG5vZGUpIHsKKwkJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2socyk7CisKKwkJaWYgKGluZXQtPm51bSA9PSBudW0gJiYgcy0+c2tfZmFtaWx5ID09IFBGX0lORVQ2KSB7CisJCQlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzKTsKKwkJCWlmIChpbmV0LT5kcG9ydCkgeworCQkJCWlmIChpbmV0LT5kcG9ydCAhPSBybXRfcG9ydCkKKwkJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIWlwdjZfYWRkcl9hbnkoJm5wLT5kYWRkcikgJiYKKwkJCSAgICAhaXB2Nl9hZGRyX2VxdWFsKCZucC0+ZGFkZHIsIHJtdF9hZGRyKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHMtPnNrX2JvdW5kX2Rldl9pZiAmJiBzLT5za19ib3VuZF9kZXZfaWYgIT0gZGlmKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoIWlwdjZfYWRkcl9hbnkoJm5wLT5yY3Zfc2FkZHIpKSB7CisJCQkJaWYgKGlwdjZfYWRkcl9lcXVhbCgmbnAtPnJjdl9zYWRkciwgbG9jX2FkZHIpKQorCQkJCQlyZXR1cm4gczsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmKCFpbmV0Nl9tY19jaGVjayhzLCBsb2NfYWRkciwgcm10X2FkZHIpKQorCQkJCWNvbnRpbnVlOworCQkJcmV0dXJuIHM7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBOb3RlOiBjYWxsZWQgb25seSBmcm9tIHRoZSBCSCBoYW5kbGVyIGNvbnRleHQsCisgKiBzbyB3ZSBkb24ndCBuZWVkIHRvIGxvY2sgdGhlIGhhc2hlcy4KKyAqLworc3RhdGljIHZvaWQgdWRwdjZfbWNhc3RfZGVsaXZlcihzdHJ1Y3QgdWRwaGRyICp1aCwKKwkJCQlzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAorCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNvY2sgKnNrLCAqc2syOworCWludCBkaWY7CisKKwlyZWFkX2xvY2soJnVkcF9oYXNoX2xvY2spOworCXNrID0gc2tfaGVhZCgmdWRwX2hhc2hbbnRvaHModWgtPmRlc3QpICYgKFVEUF9IVEFCTEVfU0laRSAtIDEpXSk7CisJZGlmID0gc2tiLT5kZXYtPmlmaW5kZXg7CisJc2sgPSB1ZHBfdjZfbWNhc3RfbmV4dChzaywgdWgtPmRlc3QsIGRhZGRyLCB1aC0+c291cmNlLCBzYWRkciwgZGlmKTsKKwlpZiAoIXNrKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlnb3RvIG91dDsKKwl9CisKKwlzazIgPSBzazsKKwl3aGlsZSAoKHNrMiA9IHVkcF92Nl9tY2FzdF9uZXh0KHNrX25leHQoc2syKSwgdWgtPmRlc3QsIGRhZGRyLAorCQkJCQl1aC0+c291cmNlLCBzYWRkciwgZGlmKSkpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKmJ1ZmYgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGJ1ZmYpCisJCQl1ZHB2Nl9xdWV1ZV9yY3Zfc2tiKHNrMiwgYnVmZik7CisJfQorCXVkcHY2X3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYik7CitvdXQ6CisJcmVhZF91bmxvY2soJnVkcF9oYXNoX2xvY2spOworfQorCitzdGF0aWMgaW50IHVkcHY2X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGludCAqbmhvZmZwKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSAqcHNrYjsKKwlzdHJ1Y3Qgc29jayAqc2s7CisgIAlzdHJ1Y3QgdWRwaGRyICp1aDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CisJc3RydWN0IGluNl9hZGRyICpzYWRkciwgKmRhZGRyOworCXUzMiB1bGVuID0gMDsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSkpCisJCWdvdG8gc2hvcnRfcGFja2V0OworCisJc2FkZHIgPSAmc2tiLT5uaC5pcHY2aC0+c2FkZHI7CisJZGFkZHIgPSAmc2tiLT5uaC5pcHY2aC0+ZGFkZHI7CisJdWggPSBza2ItPmgudWg7CisKKwl1bGVuID0gbnRvaHModWgtPmxlbik7CisKKwkvKiBDaGVjayBmb3IganVtYm8gcGF5bG9hZCAqLworCWlmICh1bGVuID09IDApCisJCXVsZW4gPSBza2ItPmxlbjsKKworCWlmICh1bGVuID4gc2tiLT5sZW4gfHwgdWxlbiA8IHNpemVvZigqdWgpKQorCQlnb3RvIHNob3J0X3BhY2tldDsKKworCWlmICh1aC0+Y2hlY2sgPT0gMCkgeworCQkvKiBSRkMgMjQ2MCBzZWN0aW9uIDguMSBzYXlzIHRoYXQgd2UgU0hPVUxEIGxvZworCQkgICB0aGlzIGVycm9yLiBXZWxsLCBpdCBpcyByZWFzb25hYmxlLgorCQkgKi8KKwkJTElNSVRfTkVUREVCVUcoCisJCQlwcmludGsoS0VSTl9JTkZPICJJUHY2OiB1ZHAgY2hlY2tzdW0gaXMgMFxuIikpOworCQlnb3RvIGRpc2NhcmQ7CisJfQorCisJaWYgKHVsZW4gPCBza2ItPmxlbikgeworCQlpZiAoX19wc2tiX3RyaW0oc2tiLCB1bGVuKSkKKwkJCWdvdG8gZGlzY2FyZDsKKwkJc2FkZHIgPSAmc2tiLT5uaC5pcHY2aC0+c2FkZHI7CisJCWRhZGRyID0gJnNrYi0+bmguaXB2NmgtPmRhZGRyOworCQl1aCA9IHNrYi0+aC51aDsKKwl9CisKKwlpZiAoc2tiLT5pcF9zdW1tZWQ9PUNIRUNLU1VNX0hXKSB7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCWlmIChjc3VtX2lwdjZfbWFnaWMoc2FkZHIsIGRhZGRyLCB1bGVuLCBJUFBST1RPX1VEUCwgc2tiLT5jc3VtKSkgeworCQkJTElNSVRfTkVUREVCVUcocHJpbnRrKEtFUk5fREVCVUcgInVkcCB2NiBodyBjc3VtIGZhaWx1cmUuXG4iKSk7CisJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCX0KKwl9CisJaWYgKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1VOTkVDRVNTQVJZKQorCQlza2ItPmNzdW0gPSB+Y3N1bV9pcHY2X21hZ2ljKHNhZGRyLCBkYWRkciwgdWxlbiwgSVBQUk9UT19VRFAsIDApOworCisJLyogCisJICoJTXVsdGljYXN0IHJlY2VpdmUgY29kZSAKKwkgKi8KKwlpZiAoaXB2Nl9hZGRyX2lzX211bHRpY2FzdChkYWRkcikpIHsKKwkJdWRwdjZfbWNhc3RfZGVsaXZlcih1aCwgc2FkZHIsIGRhZGRyLCBza2IpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBVbmljYXN0ICovCisKKwkvKiAKKwkgKiBjaGVjayBzb2NrZXQgY2FjaGUgLi4uIG11c3QgdGFsayB0byBBbGFuIGFib3V0IGhpcyBwbGFucworCSAqIGZvciBzb2NrIGNhY2hlcy4uLiBpJ2xsIHNraXAgdGhpcyBmb3Igbm93LgorCSAqLworCXNrID0gdWRwX3Y2X2xvb2t1cChzYWRkciwgdWgtPnNvdXJjZSwgZGFkZHIsIHVoLT5kZXN0LCBkZXYtPmlmaW5kZXgpOworCisJaWYgKHNrID09IE5VTEwpIHsKKwkJaWYgKCF4ZnJtNl9wb2xpY3lfY2hlY2soTlVMTCwgWEZSTV9QT0xJQ1lfSU4sIHNrYikpCisJCQlnb3RvIGRpc2NhcmQ7CisKKwkJaWYgKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1VOTkVDRVNTQVJZICYmCisJCSAgICAodW5zaWduZWQgc2hvcnQpY3N1bV9mb2xkKHNrYl9jaGVja3N1bShza2IsIDAsIHNrYi0+bGVuLCBza2ItPmNzdW0pKSkKKwkJCWdvdG8gZGlzY2FyZDsKKwkJVURQNl9JTkNfU1RBVFNfQkgoVURQX01JQl9OT1BPUlRTKTsKKworCQlpY21wdjZfc2VuZChza2IsIElDTVBWNl9ERVNUX1VOUkVBQ0gsIElDTVBWNl9QT1JUX1VOUkVBQ0gsIDAsIGRldik7CisKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybigwKTsKKwl9CisJCisJLyogZGVsaXZlciAqLworCQorCXVkcHY2X3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYik7CisJc29ja19wdXQoc2spOworCXJldHVybigwKTsKKworc2hvcnRfcGFja2V0OgkKKwlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiVURQOiBzaG9ydCBwYWNrZXQ6ICVkLyV1XG4iLCB1bGVuLCBza2ItPmxlbik7CisKK2Rpc2NhcmQ6CisJVURQNl9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkVSUk9SUyk7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuKDApOwkKK30KKy8qCisgKiBUaHJvdyBhd2F5IGFsbCBwZW5kaW5nIGRhdGEgYW5kIGNhbmNlbCB0aGUgY29ya2luZy4gU29ja2V0IGlzIGxvY2tlZC4KKyAqLworc3RhdGljIHZvaWQgdWRwX3Y2X2ZsdXNoX3BlbmRpbmdfZnJhbWVzKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgdWRwX3NvY2sgKnVwID0gdWRwX3NrKHNrKTsKKworCWlmICh1cC0+cGVuZGluZykgeworCQl1cC0+bGVuID0gMDsKKwkJdXAtPnBlbmRpbmcgPSAwOworCQlpcDZfZmx1c2hfcGVuZGluZ19mcmFtZXMoc2spOworICAgICAgICB9Cit9CisKKy8qCisgKglTZW5kaW5nCisgKi8KKworc3RhdGljIGludCB1ZHBfdjZfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB1ZHBfc29jayAqdXApCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgdWRwaGRyICp1aDsKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisJc3RydWN0IGZsb3dpICpmbCA9ICZpbmV0LT5jb3JrLmZsOworCWludCBlcnIgPSAwOworCisJLyogR3JhYiB0aGUgc2tidWZmIHdoZXJlIFVEUCBoZWFkZXIgc3BhY2UgZXhpc3RzLiAqLworCWlmICgoc2tiID0gc2tiX3BlZWsoJnNrLT5za193cml0ZV9xdWV1ZSkpID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBDcmVhdGUgYSBVRFAgaGVhZGVyCisJICovCisJdWggPSBza2ItPmgudWg7CisJdWgtPnNvdXJjZSA9IGZsLT5mbF9pcF9zcG9ydDsKKwl1aC0+ZGVzdCA9IGZsLT5mbF9pcF9kcG9ydDsKKwl1aC0+bGVuID0gaHRvbnModXAtPmxlbik7CisJdWgtPmNoZWNrID0gMDsKKworCWlmIChzay0+c2tfbm9fY2hlY2sgPT0gVURQX0NTVU1fTk9YTUlUKSB7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJZ290byBzZW5kOworCX0KKworCWlmIChza2JfcXVldWVfbGVuKCZzay0+c2tfd3JpdGVfcXVldWUpID09IDEpIHsKKwkJc2tiLT5jc3VtID0gY3N1bV9wYXJ0aWFsKChjaGFyICopdWgsCisJCQkJc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLCBza2ItPmNzdW0pOworCQl1aC0+Y2hlY2sgPSBjc3VtX2lwdjZfbWFnaWMoJmZsLT5mbDZfc3JjLAorCQkJCQkgICAgJmZsLT5mbDZfZHN0LAorCQkJCQkgICAgdXAtPmxlbiwgZmwtPnByb3RvLCBza2ItPmNzdW0pOworCX0gZWxzZSB7CisJCXUzMiB0bXBfY3N1bSA9IDA7CisKKwkJc2tiX3F1ZXVlX3dhbGsoJnNrLT5za193cml0ZV9xdWV1ZSwgc2tiKSB7CisJCQl0bXBfY3N1bSA9IGNzdW1fYWRkKHRtcF9jc3VtLCBza2ItPmNzdW0pOworCQl9CisJCXRtcF9jc3VtID0gY3N1bV9wYXJ0aWFsKChjaGFyICopdWgsCisJCQkJc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLCB0bXBfY3N1bSk7CisgICAgICAgICAgICAgICAgdG1wX2NzdW0gPSBjc3VtX2lwdjZfbWFnaWMoJmZsLT5mbDZfc3JjLAorCQkJCQkgICAmZmwtPmZsNl9kc3QsCisJCQkJCSAgIHVwLT5sZW4sIGZsLT5wcm90bywgdG1wX2NzdW0pOworICAgICAgICAgICAgICAgIHVoLT5jaGVjayA9IHRtcF9jc3VtOworCisJfQorCWlmICh1aC0+Y2hlY2sgPT0gMCkKKwkJdWgtPmNoZWNrID0gLTE7CisKK3NlbmQ6CisJZXJyID0gaXA2X3B1c2hfcGVuZGluZ19mcmFtZXMoc2spOworb3V0OgorCXVwLT5sZW4gPSAwOworCXVwLT5wZW5kaW5nID0gMDsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHVkcHY2X3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssIAorCQkgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgb3B0X3NwYWNlOworCXN0cnVjdCB1ZHBfc29jayAqdXAgPSB1ZHBfc2soc2spOworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CisJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIG1zZy0+bXNnX25hbWU7CisJc3RydWN0IGluNl9hZGRyICpkYWRkciwgKmZpbmFsX3AgPSBOVUxMLCBmaW5hbDsKKwlzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdCA9IE5VTEw7CisJc3RydWN0IGlwNl9mbG93bGFiZWwgKmZsb3dsYWJlbCA9IE5VTEw7CisJc3RydWN0IGZsb3dpICpmbCA9ICZpbmV0LT5jb3JrLmZsOworCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKKwlpbnQgYWRkcl9sZW4gPSBtc2ctPm1zZ19uYW1lbGVuOworCWludCB1bGVuID0gbGVuOworCWludCBobGltaXQgPSAtMTsKKwlpbnQgY29ya3JlcSA9IHVwLT5jb3JrZmxhZyB8fCBtc2ctPm1zZ19mbGFncyZNU0dfTU9SRTsKKwlpbnQgZXJyOworCisJLyogZGVzdGluYXRpb24gYWRkcmVzcyBjaGVjayAqLworCWlmIChzaW42KSB7CisJCWlmIChhZGRyX2xlbiA8IG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkciwgc2FfZGF0YSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzd2l0Y2ggKHNpbjYtPnNpbjZfZmFtaWx5KSB7CisJCWNhc2UgQUZfSU5FVDY6CisJCQlpZiAoYWRkcl9sZW4gPCBTSU42X0xFTl9SRkMyMTMzKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJZGFkZHIgPSAmc2luNi0+c2luNl9hZGRyOworCQkJYnJlYWs7CisJCWNhc2UgQUZfSU5FVDoKKwkJCWdvdG8gZG9fdWRwX3NlbmRtc2c7CisJCWNhc2UgQUZfVU5TUEVDOgorCQkJbXNnLT5tc2dfbmFtZSA9IHNpbjYgPSBOVUxMOworCQkJbXNnLT5tc2dfbmFtZWxlbiA9IGFkZHJfbGVuID0gMDsKKwkJCWRhZGRyID0gTlVMTDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgaWYgKCF1cC0+cGVuZGluZykgeworCQlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkKKwkJCXJldHVybiAtRURFU1RBRERSUkVROworCQlkYWRkciA9ICZucC0+ZGFkZHI7CisJfSBlbHNlIAorCQlkYWRkciA9IE5VTEw7CisKKwlpZiAoZGFkZHIpIHsKKwkJaWYgKGlwdjZfYWRkcl90eXBlKGRhZGRyKSA9PSBJUFY2X0FERFJfTUFQUEVEKSB7CisJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCQkJc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQkJc2luLnNpbl9wb3J0ID0gc2luNiA/IHNpbjYtPnNpbjZfcG9ydCA6IGluZXQtPmRwb3J0OworCQkJc2luLnNpbl9hZGRyLnNfYWRkciA9IGRhZGRyLT5zNl9hZGRyMzJbM107CisJCQltc2ctPm1zZ19uYW1lID0gJnNpbjsKKwkJCW1zZy0+bXNnX25hbWVsZW4gPSBzaXplb2Yoc2luKTsKK2RvX3VkcF9zZW5kbXNnOgorCQkJaWYgKF9faXB2Nl9vbmx5X3NvY2soc2spKQorCQkJCXJldHVybiAtRU5FVFVOUkVBQ0g7CisJCQlyZXR1cm4gdWRwX3NlbmRtc2coaW9jYiwgc2ssIG1zZywgbGVuKTsKKwkJfQorCX0KKworCWlmICh1cC0+cGVuZGluZyA9PSBBRl9JTkVUKQorCQlyZXR1cm4gdWRwX3NlbmRtc2coaW9jYiwgc2ssIG1zZywgbGVuKTsKKworCS8qIFJvdWdoIGNoZWNrIG9uIGFyaXRobWV0aWMgb3ZlcmZsb3csCisJICAgYmV0dGVyIGNoZWNrIGlzIG1hZGUgaW4gaXA2X2J1aWxkX3htaXQKKwkgICAqLworCWlmIChsZW4gPiBJTlRfTUFYIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCQorCWlmICh1cC0+cGVuZGluZykgeworCQkvKgorCQkgKiBUaGVyZSBhcmUgcGVuZGluZyBmcmFtZXMuCisJCSAqIFRoZSBzb2NrZXQgbG9jayBtdXN0IGJlIGhlbGQgd2hpbGUgaXQncyBjb3JrZWQuCisJCSAqLworCQlsb2NrX3NvY2soc2spOworCQlpZiAobGlrZWx5KHVwLT5wZW5kaW5nKSkgeworCQkJaWYgKHVubGlrZWx5KHVwLT5wZW5kaW5nICE9IEFGX0lORVQ2KSkgeworCQkJCXJlbGVhc2Vfc29jayhzayk7CisJCQkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisJCQl9CisJCQlkc3QgPSBOVUxMOworCQkJZ290byBkb19hcHBlbmRfZGF0YTsKKwkJfQorCQlyZWxlYXNlX3NvY2soc2spOworCX0KKwl1bGVuICs9IHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKworCW1lbXNldChmbCwgMCwgc2l6ZW9mKCpmbCkpOworCisJaWYgKHNpbjYpIHsKKwkJaWYgKHNpbjYtPnNpbjZfcG9ydCA9PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJZmwtPmZsX2lwX2Rwb3J0ID0gc2luNi0+c2luNl9wb3J0OworCQlkYWRkciA9ICZzaW42LT5zaW42X2FkZHI7CisKKwkJaWYgKG5wLT5zbmRmbG93KSB7CisJCQlmbC0+Zmw2X2Zsb3dsYWJlbCA9IHNpbjYtPnNpbjZfZmxvd2luZm8mSVBWNl9GTE9XSU5GT19NQVNLOworCQkJaWYgKGZsLT5mbDZfZmxvd2xhYmVsJklQVjZfRkxPV0xBQkVMX01BU0spIHsKKwkJCQlmbG93bGFiZWwgPSBmbDZfc29ja19sb29rdXAoc2ssIGZsLT5mbDZfZmxvd2xhYmVsKTsKKwkJCQlpZiAoZmxvd2xhYmVsID09IE5VTEwpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWRhZGRyID0gJmZsb3dsYWJlbC0+ZHN0OworCQkJfQorCQl9CisKKwkJLyoKKwkJICogT3RoZXJ3aXNlIGl0IHdpbGwgYmUgZGlmZmljdWx0IHRvIG1haW50YWluCisJCSAqIHNrLT5za19kc3RfY2FjaGUuCisJCSAqLworCQlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9FU1RBQkxJU0hFRCAmJgorCQkgICAgaXB2Nl9hZGRyX2VxdWFsKGRhZGRyLCAmbnAtPmRhZGRyKSkKKwkJCWRhZGRyID0gJm5wLT5kYWRkcjsKKworCQlpZiAoYWRkcl9sZW4gPj0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpICYmCisJCSAgICBzaW42LT5zaW42X3Njb3BlX2lkICYmCisJCSAgICBpcHY2X2FkZHJfdHlwZShkYWRkcikmSVBWNl9BRERSX0xJTktMT0NBTCkKKwkJCWZsLT5vaWYgPSBzaW42LT5zaW42X3Njb3BlX2lkOworCX0gZWxzZSB7CisJCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKQorCQkJcmV0dXJuIC1FREVTVEFERFJSRVE7CisKKwkJZmwtPmZsX2lwX2Rwb3J0ID0gaW5ldC0+ZHBvcnQ7CisJCWRhZGRyID0gJm5wLT5kYWRkcjsKKwkJZmwtPmZsNl9mbG93bGFiZWwgPSBucC0+Zmxvd19sYWJlbDsKKwl9CisKKwlpZiAoIWZsLT5vaWYpCisJCWZsLT5vaWYgPSBzay0+c2tfYm91bmRfZGV2X2lmOworCisJaWYgKG1zZy0+bXNnX2NvbnRyb2xsZW4pIHsKKwkJb3B0ID0gJm9wdF9zcGFjZTsKKwkJbWVtc2V0KG9wdCwgMCwgc2l6ZW9mKHN0cnVjdCBpcHY2X3R4b3B0aW9ucykpOworCQlvcHQtPnRvdF9sZW4gPSBzaXplb2YoKm9wdCk7CisKKwkJZXJyID0gZGF0YWdyYW1fc2VuZF9jdGwobXNnLCBmbCwgb3B0LCAmaGxpbWl0KTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWZsNl9zb2NrX3JlbGVhc2UoZmxvd2xhYmVsKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJaWYgKChmbC0+Zmw2X2Zsb3dsYWJlbCZJUFY2X0ZMT1dMQUJFTF9NQVNLKSAmJiAhZmxvd2xhYmVsKSB7CisJCQlmbG93bGFiZWwgPSBmbDZfc29ja19sb29rdXAoc2ssIGZsLT5mbDZfZmxvd2xhYmVsKTsKKwkJCWlmIChmbG93bGFiZWwgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoIShvcHQtPm9wdF9uZmxlbnxvcHQtPm9wdF9mbGVuKSkKKwkJCW9wdCA9IE5VTEw7CisJfQorCWlmIChvcHQgPT0gTlVMTCkKKwkJb3B0ID0gbnAtPm9wdDsKKwlpZiAoZmxvd2xhYmVsKQorCQlvcHQgPSBmbDZfbWVyZ2Vfb3B0aW9ucygmb3B0X3NwYWNlLCBmbG93bGFiZWwsIG9wdCk7CisKKwlmbC0+cHJvdG8gPSBJUFBST1RPX1VEUDsKKwlpcHY2X2FkZHJfY29weSgmZmwtPmZsNl9kc3QsIGRhZGRyKTsKKwlpZiAoaXB2Nl9hZGRyX2FueSgmZmwtPmZsNl9zcmMpICYmICFpcHY2X2FkZHJfYW55KCZucC0+c2FkZHIpKQorCQlpcHY2X2FkZHJfY29weSgmZmwtPmZsNl9zcmMsICZucC0+c2FkZHIpOworCWZsLT5mbF9pcF9zcG9ydCA9IGluZXQtPnNwb3J0OworCQorCS8qIG1lcmdlIGlwNl9idWlsZF94bWl0IGZyb20gaXA2X291dHB1dCAqLworCWlmIChvcHQgJiYgb3B0LT5zcmNydCkgeworCQlzdHJ1Y3QgcnQwX2hkciAqcnQwID0gKHN0cnVjdCBydDBfaGRyICopIG9wdC0+c3JjcnQ7CisJCWlwdjZfYWRkcl9jb3B5KCZmaW5hbCwgJmZsLT5mbDZfZHN0KTsKKwkJaXB2Nl9hZGRyX2NvcHkoJmZsLT5mbDZfZHN0LCBydDAtPmFkZHIpOworCQlmaW5hbF9wID0gJmZpbmFsOworCX0KKworCWlmICghZmwtPm9pZiAmJiBpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZmbC0+Zmw2X2RzdCkpCisJCWZsLT5vaWYgPSBucC0+bWNhc3Rfb2lmOworCisJZXJyID0gaXA2X2RzdF9sb29rdXAoc2ssICZkc3QsIGZsKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlpZiAoZmluYWxfcCkKKwkJaXB2Nl9hZGRyX2NvcHkoJmZsLT5mbDZfZHN0LCBmaW5hbF9wKTsKKworCWlmICgoZXJyID0geGZybV9sb29rdXAoJmRzdCwgZmwsIHNrLCAwKSkgPCAwKSB7CisJCWRzdF9yZWxlYXNlKGRzdCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChobGltaXQgPCAwKSB7CisJCWlmIChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZmbC0+Zmw2X2RzdCkpCisJCQlobGltaXQgPSBucC0+bWNhc3RfaG9wczsKKwkJZWxzZQorCQkJaGxpbWl0ID0gbnAtPmhvcF9saW1pdDsKKwkJaWYgKGhsaW1pdCA8IDApCisJCQlobGltaXQgPSBkc3RfbWV0cmljKGRzdCwgUlRBWF9IT1BMSU1JVCk7CisJCWlmIChobGltaXQgPCAwKQorCQkJaGxpbWl0ID0gaXB2Nl9nZXRfaG9wbGltaXQoZHN0LT5kZXYpOworCX0KKworCWlmIChtc2ctPm1zZ19mbGFncyZNU0dfQ09ORklSTSkKKwkJZ290byBkb19jb25maXJtOworYmFja19mcm9tX2NvbmZpcm06CisKKwlsb2NrX3NvY2soc2spOworCWlmICh1bmxpa2VseSh1cC0+cGVuZGluZykpIHsKKwkJLyogVGhlIHNvY2tldCBpcyBhbHJlYWR5IGNvcmtlZCB3aGlsZSBwcmVwYXJpbmcgaXQuICovCisJCS8qIC4uLiB3aGljaCBpcyBhbiBldmlkZW50IGFwcGxpY2F0aW9uIGJ1Zy4gLS1BTksgKi8KKwkJcmVsZWFzZV9zb2NrKHNrKTsKKworCQlMSU1JVF9ORVRERUJVRyhwcmludGsoS0VSTl9ERUJVRyAidWRwIGNvcmsgYXBwIGJ1ZyAyXG4iKSk7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXVwLT5wZW5kaW5nID0gQUZfSU5FVDY7CisKK2RvX2FwcGVuZF9kYXRhOgorCXVwLT5sZW4gKz0gdWxlbjsKKwllcnIgPSBpcDZfYXBwZW5kX2RhdGEoc2ssIGlwX2dlbmVyaWNfZ2V0ZnJhZywgbXNnLT5tc2dfaW92LCB1bGVuLCBzaXplb2Yoc3RydWN0IHVkcGhkciksCisJCQkgICAgICBobGltaXQsIG9wdCwgZmwsIChzdHJ1Y3QgcnQ2X2luZm8qKWRzdCwKKwkJCSAgICAgIGNvcmtyZXEgPyBtc2ctPm1zZ19mbGFnc3xNU0dfTU9SRSA6IG1zZy0+bXNnX2ZsYWdzKTsKKwlpZiAoZXJyKQorCQl1ZHBfdjZfZmx1c2hfcGVuZGluZ19mcmFtZXMoc2spOworCWVsc2UgaWYgKCFjb3JrcmVxKQorCQllcnIgPSB1ZHBfdjZfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzaywgdXApOworCisJaWYgKGRzdCkKKwkJaXA2X2RzdF9zdG9yZShzaywgZHN0LAorCQkJICAgICAgaXB2Nl9hZGRyX2VxdWFsKCZmbC0+Zmw2X2RzdCwgJm5wLT5kYWRkcikgPworCQkJICAgICAgJm5wLT5kYWRkciA6IE5VTEwpOworCWlmIChlcnIgPiAwKQorCQllcnIgPSBucC0+cmVjdmVyciA/IG5ldF94bWl0X2Vycm5vKGVycikgOiAwOworCXJlbGVhc2Vfc29jayhzayk7CitvdXQ6CisJZmw2X3NvY2tfcmVsZWFzZShmbG93bGFiZWwpOworCWlmICghZXJyKSB7CisJCVVEUDZfSU5DX1NUQVRTX1VTRVIoVURQX01JQl9PVVREQVRBR1JBTVMpOworCQlyZXR1cm4gbGVuOworCX0KKwlyZXR1cm4gZXJyOworCitkb19jb25maXJtOgorCWRzdF9jb25maXJtKGRzdCk7CisJaWYgKCEobXNnLT5tc2dfZmxhZ3MmTVNHX1BST0JFKSB8fCBsZW4pCisJCWdvdG8gYmFja19mcm9tX2NvbmZpcm07CisJZXJyID0gMDsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIGludCB1ZHB2Nl9kZXN0cm95X3NvY2soc3RydWN0IHNvY2sgKnNrKQoreworCWxvY2tfc29jayhzayk7CisJdWRwX3Y2X2ZsdXNoX3BlbmRpbmdfZnJhbWVzKHNrKTsKKwlyZWxlYXNlX3NvY2soc2spOworCisJaW5ldDZfZGVzdHJveV9zb2NrKHNrKTsKKworCXJldHVybiAwOworfQorCisvKgorICoJU29ja2V0IG9wdGlvbiBjb2RlIGZvciBVRFAKKyAqLworc3RhdGljIGludCB1ZHB2Nl9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgCisJCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCit7CisJc3RydWN0IHVkcF9zb2NrICp1cCA9IHVkcF9zayhzayk7CisJaW50IHZhbDsKKwlpbnQgZXJyID0gMDsKKworCWlmIChsZXZlbCAhPSBTT0xfVURQKQorCQlyZXR1cm4gaXB2Nl9zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOworCisJaWYob3B0bGVuPHNpemVvZihpbnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopb3B0dmFsKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2gob3B0bmFtZSkgeworCWNhc2UgVURQX0NPUks6CisJCWlmICh2YWwgIT0gMCkgeworCQkJdXAtPmNvcmtmbGFnID0gMTsKKwkJfSBlbHNlIHsKKwkJCXVwLT5jb3JrZmxhZyA9IDA7CisJCQlsb2NrX3NvY2soc2spOworCQkJdWRwX3Y2X3B1c2hfcGVuZGluZ19mcmFtZXMoc2ssIHVwKTsKKwkJCXJlbGVhc2Vfc29jayhzayk7CisJCX0KKwkJYnJlYWs7CisJCQorCWNhc2UgVURQX0VOQ0FQOgorCQlzd2l0Y2ggKHZhbCkgeworCQljYXNlIDA6CisJCQl1cC0+ZW5jYXBfdHlwZSA9IHZhbDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyID0gLUVOT1BST1RPT1BUOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PUFJPVE9PUFQ7CisJCWJyZWFrOworCX07CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHVkcHY2X2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCAKKwkJCSAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoreworCXN0cnVjdCB1ZHBfc29jayAqdXAgPSB1ZHBfc2soc2spOworCWludCB2YWwsIGxlbjsKKworCWlmIChsZXZlbCAhPSBTT0xfVURQKQorCQlyZXR1cm4gaXB2Nl9nZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOworCisJaWYoZ2V0X3VzZXIobGVuLG9wdGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sIHNpemVvZihpbnQpKTsKKwkKKwlpZihsZW4gPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaChvcHRuYW1lKSB7CisJY2FzZSBVRFBfQ09SSzoKKwkJdmFsID0gdXAtPmNvcmtmbGFnOworCQlicmVhazsKKworCWNhc2UgVURQX0VOQ0FQOgorCQl2YWwgPSB1cC0+ZW5jYXBfdHlwZTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCX07CisKKyAgCWlmKHB1dF91c2VyKGxlbiwgb3B0bGVuKSkKKyAgCQlyZXR1cm4gLUVGQVVMVDsKKwlpZihjb3B5X3RvX3VzZXIob3B0dmFsLCAmdmFsLGxlbikpCisJCXJldHVybiAtRUZBVUxUOworICAJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5ldDZfcHJvdG9jb2wgdWRwdjZfcHJvdG9jb2wgPSB7CisJLmhhbmRsZXIJPQl1ZHB2Nl9yY3YsCisJLmVycl9oYW5kbGVyCT0JdWRwdjZfZXJyLAorCS5mbGFncwkJPQlJTkVUNl9QUk9UT19OT1BPTElDWXxJTkVUNl9QUk9UT19GSU5BTCwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKK3N0YXRpYyB2b2lkIHVkcDZfc29ja19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IHNvY2sgKnNwLCBpbnQgYnVja2V0KQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNwKTsKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzcCk7CisJc3RydWN0IGluNl9hZGRyICpkZXN0LCAqc3JjOworCV9fdTE2IGRlc3RwLCBzcmNwOworCisJZGVzdCAgPSAmbnAtPmRhZGRyOworCXNyYyAgID0gJm5wLT5yY3Zfc2FkZHI7CisJZGVzdHAgPSBudG9ocyhpbmV0LT5kcG9ydCk7CisJc3JjcCAgPSBudG9ocyhpbmV0LT5zcG9ydCk7CisJc2VxX3ByaW50ZihzZXEsCisJCSAgICIlNGQ6ICUwOFglMDhYJTA4WCUwOFg6JTA0WCAlMDhYJTA4WCUwOFglMDhYOiUwNFggIgorCQkgICAiJTAyWCAlMDhYOiUwOFggJTAyWDolMDhsWCAlMDhYICU1ZCAlOGQgJWx1ICVkICVwXG4iLAorCQkgICBidWNrZXQsCisJCSAgIHNyYy0+czZfYWRkcjMyWzBdLCBzcmMtPnM2X2FkZHIzMlsxXSwKKwkJICAgc3JjLT5zNl9hZGRyMzJbMl0sIHNyYy0+czZfYWRkcjMyWzNdLCBzcmNwLAorCQkgICBkZXN0LT5zNl9hZGRyMzJbMF0sIGRlc3QtPnM2X2FkZHIzMlsxXSwKKwkJICAgZGVzdC0+czZfYWRkcjMyWzJdLCBkZXN0LT5zNl9hZGRyMzJbM10sIGRlc3RwLAorCQkgICBzcC0+c2tfc3RhdGUsIAorCQkgICBhdG9taWNfcmVhZCgmc3AtPnNrX3dtZW1fYWxsb2MpLAorCQkgICBhdG9taWNfcmVhZCgmc3AtPnNrX3JtZW1fYWxsb2MpLAorCQkgICAwLCAwTCwgMCwKKwkJICAgc29ja19pX3VpZChzcCksIDAsCisJCSAgIHNvY2tfaV9pbm8oc3ApLAorCQkgICBhdG9taWNfcmVhZCgmc3AtPnNrX3JlZmNudCksIHNwKTsKK30KKworc3RhdGljIGludCB1ZHA2X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKKwkJc2VxX3ByaW50ZihzZXEsCisJCQkgICAiICBzbCAgIgorCQkJICAgImxvY2FsX2FkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgIgorCQkJICAgInJlbW90ZV9hZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgIgorCQkJICAgInN0IHR4X3F1ZXVlIHJ4X3F1ZXVlIHRyIHRtLT53aGVuIHJldHJuc210IgorCQkJICAgIiAgIHVpZCAgdGltZW91dCBpbm9kZVxuIik7CisJZWxzZQorCQl1ZHA2X3NvY2tfc2VxX3Nob3coc2VxLCB2LCAoKHN0cnVjdCB1ZHBfaXRlcl9zdGF0ZSAqKXNlcS0+cHJpdmF0ZSktPmJ1Y2tldCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVkcDZfc2VxX2ZvcHM7CitzdGF0aWMgc3RydWN0IHVkcF9zZXFfYWZpbmZvIHVkcDZfc2VxX2FmaW5mbyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gInVkcDYiLAorCS5mYW1pbHkJCT0gQUZfSU5FVDYsCisJLnNlcV9zaG93CT0gdWRwNl9zZXFfc2hvdywKKwkuc2VxX2ZvcHMJPSAmdWRwNl9zZXFfZm9wcywKK307CisKK2ludCBfX2luaXQgdWRwNl9wcm9jX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gdWRwX3Byb2NfcmVnaXN0ZXIoJnVkcDZfc2VxX2FmaW5mbyk7Cit9CisKK3ZvaWQgdWRwNl9wcm9jX2V4aXQodm9pZCkgeworCXVkcF9wcm9jX3VucmVnaXN0ZXIoJnVkcDZfc2VxX2FmaW5mbyk7Cit9CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBwcm90byB1ZHB2Nl9wcm90ID0geworCS5uYW1lID0JCSJVRFB2NiIsCisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLmNsb3NlID0JdWRwdjZfY2xvc2UsCisJLmNvbm5lY3QgPQlpcDZfZGF0YWdyYW1fY29ubmVjdCwKKwkuZGlzY29ubmVjdCA9CXVkcF9kaXNjb25uZWN0LAorCS5pb2N0bCA9CXVkcF9pb2N0bCwKKwkuZGVzdHJveSA9CXVkcHY2X2Rlc3Ryb3lfc29jaywKKwkuc2V0c29ja29wdCA9CXVkcHY2X3NldHNvY2tvcHQsCisJLmdldHNvY2tvcHQgPQl1ZHB2Nl9nZXRzb2Nrb3B0LAorCS5zZW5kbXNnID0JdWRwdjZfc2VuZG1zZywKKwkucmVjdm1zZyA9CXVkcHY2X3JlY3Ztc2csCisJLmJhY2tsb2dfcmN2ID0JdWRwdjZfcXVldWVfcmN2X3NrYiwKKwkuaGFzaCA9CQl1ZHBfdjZfaGFzaCwKKwkudW5oYXNoID0JdWRwX3Y2X3VuaGFzaCwKKwkuZ2V0X3BvcnQgPQl1ZHBfdjZfZ2V0X3BvcnQsCisJLm9ial9zaXplID0Jc2l6ZW9mKHN0cnVjdCB1ZHA2X3NvY2spLAorfTsKKworZXh0ZXJuIHN0cnVjdCBwcm90b19vcHMgaW5ldDZfZGdyYW1fb3BzOworCitzdGF0aWMgc3RydWN0IGluZXRfcHJvdG9zdyB1ZHB2Nl9wcm90b3N3ID0geworCS50eXBlID0gICAgICBTT0NLX0RHUkFNLAorCS5wcm90b2NvbCA9ICBJUFBST1RPX1VEUCwKKwkucHJvdCA9ICAgICAgJnVkcHY2X3Byb3QsCisJLm9wcyA9ICAgICAgICZpbmV0Nl9kZ3JhbV9vcHMsCisJLmNhcGFiaWxpdHkgPS0xLAorCS5ub19jaGVjayA9ICBVRFBfQ1NVTV9ERUZBVUxULAorCS5mbGFncyA9ICAgICBJTkVUX1BST1RPU1dfUEVSTUFORU5ULAorfTsKKworCit2b2lkIF9faW5pdCB1ZHB2Nl9pbml0KHZvaWQpCit7CisJaWYgKGluZXQ2X2FkZF9wcm90b2NvbCgmdWRwdjZfcHJvdG9jb2wsIElQUFJPVE9fVURQKSA8IDApCisJCXByaW50ayhLRVJOX0VSUiAidWRwdjZfaW5pdDogQ291bGQgbm90IHJlZ2lzdGVyIHByb3RvY29sXG4iKTsKKwlpbmV0Nl9yZWdpc3Rlcl9wcm90b3N3KCZ1ZHB2Nl9wcm90b3N3KTsKK30KZGlmZiAtLWdpdCBhL25ldC9pcHY2L3hmcm02X2lucHV0LmMgYi9uZXQvaXB2Ni94ZnJtNl9pbnB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YzI5ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2Ni94ZnJtNl9pbnB1dC5jCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogeGZybTZfaW5wdXQuYzogYmFzZWQgb24gbmV0L2lwdjQveGZybTRfaW5wdXQuYworICoKKyAqIEF1dGhvcnM6CisgKglNaXRzdXJ1IEtBTkRBIEBVU0FHSQorICogCUthenVub3JpIE1JWUFaQVdBIEBVU0FHSQorICogCUt1bmloaXJvIElzaGlndXJvIDxrdW5paGlyb0BpcGluZnVzaW9uLmNvbT4KKyAqCVlPU0hJRlVKSSBIaWRlYWtpIEBVU0FHSQorICoJCUlQdjYgc3VwcG9ydAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxuZXQvZHNmaWVsZC5oPgorI2luY2x1ZGUgPG5ldC9pbmV0X2Vjbi5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L3hmcm0uaD4KKworc3RhdGljIGlubGluZSB2b2lkIGlwaXA2X2Vjbl9kZWNhcHN1bGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcHY2aGRyICpvdXRlcl9pcGggPSBza2ItPm5oLmlwdjZoOworCXN0cnVjdCBpcHY2aGRyICppbm5lcl9pcGggPSBza2ItPmguaXB2Nmg7CisKKwlpZiAoSU5FVF9FQ05faXNfY2UoaXB2Nl9nZXRfZHNmaWVsZChvdXRlcl9pcGgpKSkKKwkJSVA2X0VDTl9zZXRfY2UoaW5uZXJfaXBoKTsKK30KKworaW50IHhmcm02X3Jjdl9zcGkoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCB1bnNpZ25lZCBpbnQgKm5ob2ZmcCwgdTMyIHNwaSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKnBza2I7CisJaW50IGVycjsKKwl1MzIgc2VxOworCXN0cnVjdCBzZWNfZGVjYXBfc3RhdGUgeGZybV92ZWNbWEZSTV9NQVhfREVQVEhdOworCXN0cnVjdCB4ZnJtX3N0YXRlICp4OworCWludCB4ZnJtX25yID0gMDsKKwlpbnQgZGVjYXBzID0gMDsKKwlpbnQgbmV4dGhkcjsKKwl1bnNpZ25lZCBpbnQgbmhvZmY7CisKKwluaG9mZiA9ICpuaG9mZnA7CisJbmV4dGhkciA9IHNrYi0+bmgucmF3W25ob2ZmXTsKKworCXNlcSA9IDA7CisJaWYgKCFzcGkgJiYgKGVyciA9IHhmcm1fcGFyc2Vfc3BpKHNrYiwgbmV4dGhkciwgJnNwaSwgJnNlcSkpICE9IDApCisJCWdvdG8gZHJvcDsKKwkKKwlkbyB7CisJCXN0cnVjdCBpcHY2aGRyICppcGggPSBza2ItPm5oLmlwdjZoOworCisJCWlmICh4ZnJtX25yID09IFhGUk1fTUFYX0RFUFRIKQorCQkJZ290byBkcm9wOworCisJCXggPSB4ZnJtX3N0YXRlX2xvb2t1cCgoeGZybV9hZGRyZXNzX3QgKikmaXBoLT5kYWRkciwgc3BpLCBuZXh0aGRyLCBBRl9JTkVUNik7CisJCWlmICh4ID09IE5VTEwpCisJCQlnb3RvIGRyb3A7CisJCXNwaW5fbG9jaygmeC0+bG9jayk7CisJCWlmICh1bmxpa2VseSh4LT5rbS5zdGF0ZSAhPSBYRlJNX1NUQVRFX1ZBTElEKSkKKwkJCWdvdG8gZHJvcF91bmxvY2s7CisKKwkJaWYgKHgtPnByb3BzLnJlcGxheV93aW5kb3cgJiYgeGZybV9yZXBsYXlfY2hlY2soeCwgc2VxKSkKKwkJCWdvdG8gZHJvcF91bmxvY2s7CisKKwkJaWYgKHhmcm1fc3RhdGVfY2hlY2tfZXhwaXJlKHgpKQorCQkJZ290byBkcm9wX3VubG9jazsKKworCQluZXh0aGRyID0geC0+dHlwZS0+aW5wdXQoeCwgJih4ZnJtX3ZlY1t4ZnJtX25yXS5kZWNhcCksIHNrYik7CisJCWlmIChuZXh0aGRyIDw9IDApCisJCQlnb3RvIGRyb3BfdW5sb2NrOworCisJCXNrYi0+bmgucmF3W25ob2ZmXSA9IG5leHRoZHI7CisKKwkJaWYgKHgtPnByb3BzLnJlcGxheV93aW5kb3cpCisJCQl4ZnJtX3JlcGxheV9hZHZhbmNlKHgsIHNlcSk7CisKKwkJeC0+Y3VybGZ0LmJ5dGVzICs9IHNrYi0+bGVuOworCQl4LT5jdXJsZnQucGFja2V0cysrOworCisJCXNwaW5fdW5sb2NrKCZ4LT5sb2NrKTsKKworCQl4ZnJtX3ZlY1t4ZnJtX25yKytdLnh2ZWMgPSB4OworCisJCWlmICh4LT5wcm9wcy5tb2RlKSB7IC8qIFhYWCAqLworCQkJaWYgKG5leHRoZHIgIT0gSVBQUk9UT19JUFY2KQorCQkJCWdvdG8gZHJvcDsKKwkJCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpKQorCQkJCWdvdG8gZHJvcDsKKwkJCWlmIChza2JfY2xvbmVkKHNrYikgJiYKKwkJCSAgICBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgMCwgR0ZQX0FUT01JQykpCisJCQkJZ290byBkcm9wOworCQkJaWYgKHgtPnByb3BzLmZsYWdzICYgWEZSTV9TVEFURV9ERUNBUF9EU0NQKQorCQkJCWlwdjZfY29weV9kc2NwKHNrYi0+bmguaXB2NmgsIHNrYi0+aC5pcHY2aCk7CisJCQlpZiAoISh4LT5wcm9wcy5mbGFncyAmIFhGUk1fU1RBVEVfTk9FQ04pKQorCQkJCWlwaXA2X2Vjbl9kZWNhcHN1bGF0ZShza2IpOworCQkJc2tiLT5tYWMucmF3ID0gbWVtbW92ZShza2ItPmRhdGEgLSBza2ItPm1hY19sZW4sCisJCQkJCSAgICAgICBza2ItPm1hYy5yYXcsIHNrYi0+bWFjX2xlbik7CisJCQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwkJCWRlY2FwcyA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCWlmICgoZXJyID0geGZybV9wYXJzZV9zcGkoc2tiLCBuZXh0aGRyLCAmc3BpLCAmc2VxKSkgPCAwKQorCQkJZ290byBkcm9wOworCX0gd2hpbGUgKCFlcnIpOworCisJLyogQWxsb2NhdGUgbmV3IHNlY3BhdGggb3IgQ09XIGV4aXN0aW5nIG9uZS4gKi8KKwlpZiAoIXNrYi0+c3AgfHwgYXRvbWljX3JlYWQoJnNrYi0+c3AtPnJlZmNudCkgIT0gMSkgeworCQlzdHJ1Y3Qgc2VjX3BhdGggKnNwOworCQlzcCA9IHNlY3BhdGhfZHVwKHNrYi0+c3ApOworCQlpZiAoIXNwKQorCQkJZ290byBkcm9wOworCQlpZiAoc2tiLT5zcCkKKwkJCXNlY3BhdGhfcHV0KHNrYi0+c3ApOworCQlza2ItPnNwID0gc3A7CisJfQorCisJaWYgKHhmcm1fbnIgKyBza2ItPnNwLT5sZW4gPiBYRlJNX01BWF9ERVBUSCkKKwkJZ290byBkcm9wOworCisJbWVtY3B5KHNrYi0+c3AtPngrc2tiLT5zcC0+bGVuLCB4ZnJtX3ZlYywgeGZybV9ucipzaXplb2Yoc3RydWN0IHNlY19kZWNhcF9zdGF0ZSkpOworCXNrYi0+c3AtPmxlbiArPSB4ZnJtX25yOworCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKworCWlmIChkZWNhcHMpIHsKKwkJaWYgKCEoc2tiLT5kZXYtPmZsYWdzJklGRl9MT09QQkFDSykpIHsKKwkJCWRzdF9yZWxlYXNlKHNrYi0+ZHN0KTsKKwkJCXNrYi0+ZHN0ID0gTlVMTDsKKwkJfQorCQluZXRpZl9yeChza2IpOworCQlyZXR1cm4gLTE7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDE7CisJfQorCitkcm9wX3VubG9jazoKKwlzcGluX3VubG9jaygmeC0+bG9jayk7CisJeGZybV9zdGF0ZV9wdXQoeCk7Citkcm9wOgorCXdoaWxlICgtLXhmcm1fbnIgPj0gMCkKKwkJeGZybV9zdGF0ZV9wdXQoeGZybV92ZWNbeGZybV9ucl0ueHZlYyk7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIC0xOworfQorCitFWFBPUlRfU1lNQk9MKHhmcm02X3Jjdl9zcGkpOworCitpbnQgeGZybTZfcmN2KHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgaW50ICpuaG9mZnApCit7CisJcmV0dXJuIHhmcm02X3Jjdl9zcGkocHNrYiwgbmhvZmZwLCAwKTsKK30KZGlmZiAtLWdpdCBhL25ldC9pcHY2L3hmcm02X291dHB1dC5jIGIvbmV0L2lwdjYveGZybTZfb3V0cHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxYTE0OAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY2L3hmcm02X291dHB1dC5jCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogeGZybTZfb3V0cHV0LmMgLSBDb21tb24gSVBzZWMgZW5jYXBzdWxhdGlvbiBjb2RlIGZvciBJUHY2LgorICogQ29weXJpZ2h0IChDKSAyMDAyIFVTQUdJL1dJREUgUHJvamVjdAorICogQ29weXJpZ2h0IChjKSAyMDA0IEhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wdjYuaD4KKyNpbmNsdWRlIDxuZXQvZHNmaWVsZC5oPgorI2luY2x1ZGUgPG5ldC9pbmV0X2Vjbi5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L3hmcm0uaD4KKworLyogQWRkIGVuY2Fwc3VsYXRpb24gaGVhZGVyLgorICoKKyAqIEluIHRyYW5zcG9ydCBtb2RlLCB0aGUgSVAgaGVhZGVyIGFuZCBtdXRhYmxlIGV4dGVuc2lvbiBoZWFkZXJzIHdpbGwgYmUgbW92ZWQKKyAqIGZvcndhcmQgdG8gbWFrZSBzcGFjZSBmb3IgdGhlIGVuY2Fwc3VsYXRpb24gaGVhZGVyLgorICoKKyAqIEluIHR1bm5lbCBtb2RlLCB0aGUgdG9wIElQIGhlYWRlciB3aWxsIGJlIGNvbnN0cnVjdGVkIHBlciBSRkMgMjQwMS4KKyAqIFRoZSBmb2xsb3dpbmcgZmllbGRzIGluIGl0IHNoYWxsIGJlIGZpbGxlZCBpbiBieSB4LT50eXBlLT5vdXRwdXQ6CisgKglwYXlsb2FkX2xlbgorICoKKyAqIE9uIGV4aXQsIHNrYi0+aCB3aWxsIGJlIHNldCB0byB0aGUgc3RhcnQgb2YgdGhlIGVuY2Fwc3VsYXRpb24gaGVhZGVyIHRvIGJlCisgKiBmaWxsZWQgaW4gYnkgeC0+dHlwZS0+b3V0cHV0IGFuZCBza2ItPm5oIHdpbGwgYmUgc2V0IHRvIHRoZSBuZXh0aGVhZGVyIGZpZWxkCisgKiBvZiB0aGUgZXh0ZW5zaW9uIGhlYWRlciBkaXJlY3RseSBwcmVjZWRpbmcgdGhlIGVuY2Fwc3VsYXRpb24gaGVhZGVyLCBvciBpbgorICogaXRzIGFic2VuY2UsIHRoYXQgb2YgdGhlIHRvcCBJUCBoZWFkZXIuICBUaGUgdmFsdWUgb2Ygc2tiLT5kYXRhIHdpbGwgYWx3YXlzCisgKiBwb2ludCB0byB0aGUgdG9wIElQIGhlYWRlci4KKyAqLworc3RhdGljIHZvaWQgeGZybTZfZW5jYXAoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2ItPmRzdDsKKwlzdHJ1Y3QgeGZybV9zdGF0ZSAqeCA9IGRzdC0+eGZybTsKKwlzdHJ1Y3QgaXB2NmhkciAqaXBoLCAqdG9wX2lwaDsKKwlpbnQgZHNmaWVsZDsKKworCXNrYl9wdXNoKHNrYiwgeC0+cHJvcHMuaGVhZGVyX2xlbik7CisJaXBoID0gc2tiLT5uaC5pcHY2aDsKKworCWlmICgheC0+cHJvcHMubW9kZSkgeworCQl1OCAqcHJldmhkcjsKKwkJaW50IGhkcl9sZW47CisKKwkJaGRyX2xlbiA9IGlwNl9maW5kXzFzdGZyYWdvcHQoc2tiLCAmcHJldmhkcik7CisJCXNrYi0+bmgucmF3ID0gcHJldmhkciAtIHgtPnByb3BzLmhlYWRlcl9sZW47CisJCXNrYi0+aC5yYXcgPSBza2ItPmRhdGEgKyBoZHJfbGVuOworCQltZW1tb3ZlKHNrYi0+ZGF0YSwgaXBoLCBoZHJfbGVuKTsKKwkJcmV0dXJuOworCX0KKworCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCXRvcF9pcGggPSBza2ItPm5oLmlwdjZoOworCXNrYi0+bmgucmF3ID0gJnRvcF9pcGgtPm5leHRoZHI7CisJc2tiLT5oLmlwdjZoID0gdG9wX2lwaCArIDE7CisKKwl0b3BfaXBoLT52ZXJzaW9uID0gNjsKKwl0b3BfaXBoLT5wcmlvcml0eSA9IGlwaC0+cHJpb3JpdHk7CisJdG9wX2lwaC0+Zmxvd19sYmxbMF0gPSBpcGgtPmZsb3dfbGJsWzBdOworCXRvcF9pcGgtPmZsb3dfbGJsWzFdID0gaXBoLT5mbG93X2xibFsxXTsKKwl0b3BfaXBoLT5mbG93X2xibFsyXSA9IGlwaC0+Zmxvd19sYmxbMl07CisJZHNmaWVsZCA9IGlwdjZfZ2V0X2RzZmllbGQodG9wX2lwaCk7CisJZHNmaWVsZCA9IElORVRfRUNOX2VuY2Fwc3VsYXRlKGRzZmllbGQsIGRzZmllbGQpOworCWlmICh4LT5wcm9wcy5mbGFncyAmIFhGUk1fU1RBVEVfTk9FQ04pCisJCWRzZmllbGQgJj0gfklORVRfRUNOX01BU0s7CisJaXB2Nl9jaGFuZ2VfZHNmaWVsZCh0b3BfaXBoLCAwLCBkc2ZpZWxkKTsKKwl0b3BfaXBoLT5uZXh0aGRyID0gSVBQUk9UT19JUFY2OyAKKwl0b3BfaXBoLT5ob3BfbGltaXQgPSBkc3RfbWV0cmljKGRzdC0+Y2hpbGQsIFJUQVhfSE9QTElNSVQpOworCWlwdjZfYWRkcl9jb3B5KCZ0b3BfaXBoLT5zYWRkciwgKHN0cnVjdCBpbjZfYWRkciAqKSZ4LT5wcm9wcy5zYWRkcik7CisJaXB2Nl9hZGRyX2NvcHkoJnRvcF9pcGgtPmRhZGRyLCAoc3RydWN0IGluNl9hZGRyICopJngtPmlkLmRhZGRyKTsKK30KKworc3RhdGljIGludCB4ZnJtNl90dW5uZWxfY2hlY2tfc2l6ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBtdHUsIHJldCA9IDA7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiLT5kc3Q7CisKKwltdHUgPSBkc3RfbXR1KGRzdCk7CisJaWYgKG10dSA8IElQVjZfTUlOX01UVSkKKwkJbXR1ID0gSVBWNl9NSU5fTVRVOworCisJaWYgKHNrYi0+bGVuID4gbXR1KSB7CisJCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1BLVF9UT09CSUcsIDAsIG10dSwgc2tiLT5kZXYpOworCQlyZXQgPSAtRU1TR1NJWkU7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworaW50IHhmcm02X291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYi0+ZHN0OworCXN0cnVjdCB4ZnJtX3N0YXRlICp4ID0gZHN0LT54ZnJtOworCWludCBlcnI7CisJCisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSB7CisJCWVyciA9IHNrYl9jaGVja3N1bV9oZWxwKHNrYiwgMCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycm9yX25vbG9jazsKKwl9CisKKwlpZiAoeC0+cHJvcHMubW9kZSkgeworCQllcnIgPSB4ZnJtNl90dW5uZWxfY2hlY2tfc2l6ZShza2IpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJvcl9ub2xvY2s7CisJfQorCisJc3Bpbl9sb2NrX2JoKCZ4LT5sb2NrKTsKKwllcnIgPSB4ZnJtX3N0YXRlX2NoZWNrKHgsIHNrYik7CisJaWYgKGVycikKKwkJZ290byBlcnJvcjsKKworCXhmcm02X2VuY2FwKHNrYik7CisKKwllcnIgPSB4LT50eXBlLT5vdXRwdXQoeCwgc2tiKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yOworCisJeC0+Y3VybGZ0LmJ5dGVzICs9IHNrYi0+bGVuOworCXgtPmN1cmxmdC5wYWNrZXRzKys7CisKKwlzcGluX3VubG9ja19iaCgmeC0+bG9jayk7CisKKwlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwkKKwlpZiAoIShza2ItPmRzdCA9IGRzdF9wb3AoZHN0KSkpIHsKKwkJZXJyID0gLUVIT1NUVU5SRUFDSDsKKwkJZ290byBlcnJvcl9ub2xvY2s7CisJfQorCWVyciA9IE5FVF9YTUlUX0JZUEFTUzsKKworb3V0X2V4aXQ6CisJcmV0dXJuIGVycjsKK2Vycm9yOgorCXNwaW5fdW5sb2NrX2JoKCZ4LT5sb2NrKTsKK2Vycm9yX25vbG9jazoKKwlrZnJlZV9za2Ioc2tiKTsKKwlnb3RvIG91dF9leGl0OworfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfcG9saWN5LmMgYi9uZXQvaXB2Ni94ZnJtNl9wb2xpY3kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTRmMzdkCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYveGZybTZfcG9saWN5LmMKQEAgLTAsMCArMSwyOTUgQEAKKy8qCisgKiB4ZnJtNl9wb2xpY3kuYzogYmFzZWQgb24geGZybTRfcG9saWN5LmMKKyAqCisgKiBBdXRob3JzOgorICoJTWl0c3VydSBLQU5EQSBAVVNBR0kKKyAqIAlLYXp1bm9yaSBNSVlBWkFXQSBAVVNBR0kKKyAqIAlLdW5paGlybyBJc2hpZ3VybyA8a3VuaWhpcm9AaXBpbmZ1c2lvbi5jb20+CisgKiAJCUlQdjYgc3VwcG9ydAorICogCVlPU0hJRlVKSSBIaWRlYWtpCisgKiAJCVNwbGl0IHVwIGFmLXNwZWNpZmljIHBvcnRpb24KKyAqIAorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxuZXQveGZybS5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L2lwNl9yb3V0ZS5oPgorCitzdGF0aWMgc3RydWN0IGRzdF9vcHMgeGZybTZfZHN0X29wczsKK3N0YXRpYyBzdHJ1Y3QgeGZybV9wb2xpY3lfYWZpbmZvIHhmcm02X3BvbGljeV9hZmluZm87CisKK3N0YXRpYyBzdHJ1Y3QgeGZybV90eXBlX21hcCB4ZnJtNl90eXBlX21hcCA9IHsgLmxvY2sgPSBSV19MT0NLX1VOTE9DS0VEIH07CisKK3N0YXRpYyBpbnQgeGZybTZfZHN0X2xvb2t1cChzdHJ1Y3QgeGZybV9kc3QgKipkc3QsIHN0cnVjdCBmbG93aSAqZmwpCit7CisJaW50IGVyciA9IDA7CisJKmRzdCA9IChzdHJ1Y3QgeGZybV9kc3QqKWlwNl9yb3V0ZV9vdXRwdXQoTlVMTCwgZmwpOworCWlmICghKmRzdCkKKwkJZXJyID0gLUVORVRVTlJFQUNIOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHN0X2VudHJ5ICoKK19feGZybTZfZmluZF9idW5kbGUoc3RydWN0IGZsb3dpICpmbCwgc3RydWN0IHhmcm1fcG9saWN5ICpwb2xpY3kpCit7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0OworCisJLyogU3RpbGwgbm90IGNsZWFyIGlmIHdlIHNob3VsZCBzZXQgZmwtPmZsNl97c3JjLGRzdH0uLi4gKi8KKwlyZWFkX2xvY2tfYmgoJnBvbGljeS0+bG9jayk7CisJZm9yIChkc3QgPSBwb2xpY3ktPmJ1bmRsZXM7IGRzdDsgZHN0ID0gZHN0LT5uZXh0KSB7CisJCXN0cnVjdCB4ZnJtX2RzdCAqeGRzdCA9IChzdHJ1Y3QgeGZybV9kc3QqKWRzdDsKKwkJc3RydWN0IGluNl9hZGRyIGZsX2RzdF9wcmVmaXgsIGZsX3NyY19wcmVmaXg7CisKKwkJaXB2Nl9hZGRyX3ByZWZpeCgmZmxfZHN0X3ByZWZpeCwKKwkJCQkgJmZsLT5mbDZfZHN0LAorCQkJCSB4ZHN0LT51LnJ0Ni5ydDZpX2RzdC5wbGVuKTsKKwkJaXB2Nl9hZGRyX3ByZWZpeCgmZmxfc3JjX3ByZWZpeCwKKwkJCQkgJmZsLT5mbDZfc3JjLAorCQkJCSB4ZHN0LT51LnJ0Ni5ydDZpX3NyYy5wbGVuKTsKKwkJaWYgKGlwdjZfYWRkcl9lcXVhbCgmeGRzdC0+dS5ydDYucnQ2aV9kc3QuYWRkciwgJmZsX2RzdF9wcmVmaXgpICYmCisJCSAgICBpcHY2X2FkZHJfZXF1YWwoJnhkc3QtPnUucnQ2LnJ0Nmlfc3JjLmFkZHIsICZmbF9zcmNfcHJlZml4KSAmJgorCQkgICAgeGZybV9idW5kbGVfb2soeGRzdCwgZmwsIEFGX0lORVQ2KSkgeworCQkJZHN0X2Nsb25lKGRzdCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZWFkX3VubG9ja19iaCgmcG9saWN5LT5sb2NrKTsKKwlyZXR1cm4gZHN0OworfQorCisvKiBBbGxvY2F0ZSBjaGFpbiBvZiBkc3RfZW50cnkncywgYXR0YWNoIGtub3duIHhmcm0ncywgY2FsY3VsYXRlCisgKiBhbGwgdGhlIG1ldHJpY3MuLi4gU2hvcnRseSwgYnVuZGxlIGEgYnVuZGxlLgorICovCisKK3N0YXRpYyBpbnQKK19feGZybTZfYnVuZGxlX2NyZWF0ZShzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbGljeSwgc3RydWN0IHhmcm1fc3RhdGUgKip4ZnJtLCBpbnQgbngsCisJCSAgICAgIHN0cnVjdCBmbG93aSAqZmwsIHN0cnVjdCBkc3RfZW50cnkgKipkc3RfcCkKK3sKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsICpkc3RfcHJldjsKKwlzdHJ1Y3QgcnQ2X2luZm8gKnJ0MCA9IChzdHJ1Y3QgcnQ2X2luZm8qKSgqZHN0X3ApOworCXN0cnVjdCBydDZfaW5mbyAqcnQgID0gcnQwOworCXN0cnVjdCBpbjZfYWRkciAqcmVtb3RlID0gJmZsLT5mbDZfZHN0OworCXN0cnVjdCBpbjZfYWRkciAqbG9jYWwgID0gJmZsLT5mbDZfc3JjOworCXN0cnVjdCBmbG93aSBmbF90dW5uZWwgPSB7CisJCS5ubF91ID0geworCQkJLmlwNl91ID0geworCQkJCS5zYWRkciA9ICpsb2NhbCwKKwkJCQkuZGFkZHIgPSAqcmVtb3RlCisJCQl9CisJCX0KKwl9OworCWludCBpOworCWludCBlcnIgPSAwOworCWludCBoZWFkZXJfbGVuID0gMDsKKwlpbnQgdHJhaWxlcl9sZW4gPSAwOworCisJZHN0ID0gZHN0X3ByZXYgPSBOVUxMOworCWRzdF9ob2xkKCZydC0+dS5kc3QpOworCisJZm9yIChpID0gMDsgaSA8IG54OyBpKyspIHsKKwkJc3RydWN0IGRzdF9lbnRyeSAqZHN0MSA9IGRzdF9hbGxvYygmeGZybTZfZHN0X29wcyk7CisJCXN0cnVjdCB4ZnJtX2RzdCAqeGRzdDsKKwkJaW50IHR1bm5lbCA9IDA7CisKKwkJaWYgKHVubGlrZWx5KGRzdDEgPT0gTlVMTCkpIHsKKwkJCWVyciA9IC1FTk9CVUZTOworCQkJZHN0X3JlbGVhc2UoJnJ0LT51LmRzdCk7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJaWYgKCFkc3QpCisJCQlkc3QgPSBkc3QxOworCQllbHNlIHsKKwkJCWRzdF9wcmV2LT5jaGlsZCA9IGRzdDE7CisJCQlkc3QxLT5mbGFncyB8PSBEU1RfTk9IQVNIOworCQkJZHN0X2Nsb25lKGRzdDEpOworCQl9CisKKwkJeGRzdCA9IChzdHJ1Y3QgeGZybV9kc3QgKilkc3QxOworCQl4ZHN0LT5yb3V0ZSA9ICZydC0+dS5kc3Q7CisKKwkJZHN0MS0+bmV4dCA9IGRzdF9wcmV2OworCQlkc3RfcHJldiA9IGRzdDE7CisJCWlmICh4ZnJtW2ldLT5wcm9wcy5tb2RlKSB7CisJCQlyZW1vdGUgPSAoc3RydWN0IGluNl9hZGRyKikmeGZybVtpXS0+aWQuZGFkZHI7CisJCQlsb2NhbCAgPSAoc3RydWN0IGluNl9hZGRyKikmeGZybVtpXS0+cHJvcHMuc2FkZHI7CisJCQl0dW5uZWwgPSAxOworCQl9CisJCWhlYWRlcl9sZW4gKz0geGZybVtpXS0+cHJvcHMuaGVhZGVyX2xlbjsKKwkJdHJhaWxlcl9sZW4gKz0geGZybVtpXS0+cHJvcHMudHJhaWxlcl9sZW47CisKKwkJaWYgKHR1bm5lbCkgeworCQkJaXB2Nl9hZGRyX2NvcHkoJmZsX3R1bm5lbC5mbDZfZHN0LCByZW1vdGUpOworCQkJaXB2Nl9hZGRyX2NvcHkoJmZsX3R1bm5lbC5mbDZfc3JjLCBsb2NhbCk7CisJCQllcnIgPSB4ZnJtX2RzdF9sb29rdXAoKHN0cnVjdCB4ZnJtX2RzdCAqKikgJnJ0LAorCQkJCQkgICAgICAmZmxfdHVubmVsLCBBRl9JTkVUNik7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gZXJyb3I7CisJCX0gZWxzZQorCQkJZHN0X2hvbGQoJnJ0LT51LmRzdCk7CisJfQorCisJZHN0X3ByZXYtPmNoaWxkID0gJnJ0LT51LmRzdDsKKwlkc3QtPnBhdGggPSAmcnQtPnUuZHN0OworCisJKmRzdF9wID0gZHN0OworCWRzdCA9IGRzdF9wcmV2OworCisJZHN0X3ByZXYgPSAqZHN0X3A7CisJaSA9IDA7CisJZm9yICg7IGRzdF9wcmV2ICE9ICZydC0+dS5kc3Q7IGRzdF9wcmV2ID0gZHN0X3ByZXYtPmNoaWxkKSB7CisJCXN0cnVjdCB4ZnJtX2RzdCAqeCA9IChzdHJ1Y3QgeGZybV9kc3QqKWRzdF9wcmV2OworCisJCWRzdF9wcmV2LT54ZnJtID0geGZybVtpKytdOworCQlkc3RfcHJldi0+ZGV2ID0gcnQtPnUuZHN0LmRldjsKKwkJaWYgKHJ0LT51LmRzdC5kZXYpCisJCQlkZXZfaG9sZChydC0+dS5kc3QuZGV2KTsKKwkJZHN0X3ByZXYtPm9ic29sZXRlCT0gLTE7CisJCWRzdF9wcmV2LT5mbGFncwkgICAgICAgfD0gRFNUX0hPU1Q7CisJCWRzdF9wcmV2LT5sYXN0dXNlCT0gamlmZmllczsKKwkJZHN0X3ByZXYtPmhlYWRlcl9sZW4JPSBoZWFkZXJfbGVuOworCQlkc3RfcHJldi0+dHJhaWxlcl9sZW4JPSB0cmFpbGVyX2xlbjsKKwkJbWVtY3B5KCZkc3RfcHJldi0+bWV0cmljcywgJngtPnJvdXRlLT5tZXRyaWNzLCBzaXplb2YoZHN0X3ByZXYtPm1ldHJpY3MpKTsKKworCQkvKiBDb3B5IG5laWdoYm91ciBmb3IgcmVhY2hhYmlsaXR5IGNvbmZpcm1hdGlvbiAqLworCQlkc3RfcHJldi0+bmVpZ2hib3VyCT0gbmVpZ2hfY2xvbmUocnQtPnUuZHN0Lm5laWdoYm91cik7CisJCWRzdF9wcmV2LT5pbnB1dAkJPSBydC0+dS5kc3QuaW5wdXQ7CisJCWRzdF9wcmV2LT5vdXRwdXQJPSB4ZnJtNl9vdXRwdXQ7CisJCS8qIFNoZWl0Li4uIEkgcmVtZW1iZXIgSSBkaWQgdGhpcyByaWdodC4gQXBwYXJlbnRseSwKKwkJICogaXQgd2FzIG1hZ2ljYWxseSBsb3N0LCBzbyB0aGlzIGNvZGUgbmVlZHMgYXVkaXQgKi8KKwkJeC0+dS5ydDYucnQ2aV9mbGFncyAgICA9IHJ0MC0+cnQ2aV9mbGFncyYoUlRDRl9CUk9BRENBU1R8UlRDRl9NVUxUSUNBU1R8UlRDRl9MT0NBTCk7CisJCXgtPnUucnQ2LnJ0NmlfbWV0cmljICAgPSBydDAtPnJ0NmlfbWV0cmljOworCQl4LT51LnJ0Ni5ydDZpX25vZGUgICAgID0gcnQwLT5ydDZpX25vZGU7CisJCXgtPnUucnQ2LnJ0NmlfZ2F0ZXdheSAgPSBydDAtPnJ0NmlfZ2F0ZXdheTsKKwkJbWVtY3B5KCZ4LT51LnJ0Ni5ydDZpX2dhdGV3YXksICZydDAtPnJ0NmlfZ2F0ZXdheSwgc2l6ZW9mKHgtPnUucnQ2LnJ0NmlfZ2F0ZXdheSkpOyAKKwkJeC0+dS5ydDYucnQ2aV9kc3QgICAgICA9IHJ0MC0+cnQ2aV9kc3Q7CisJCXgtPnUucnQ2LnJ0Nmlfc3JjICAgICAgPSBydDAtPnJ0Nmlfc3JjOwkKKwkJaGVhZGVyX2xlbiAtPSB4LT51LmRzdC54ZnJtLT5wcm9wcy5oZWFkZXJfbGVuOworCQl0cmFpbGVyX2xlbiAtPSB4LT51LmRzdC54ZnJtLT5wcm9wcy50cmFpbGVyX2xlbjsKKwl9CisKKwl4ZnJtX2luaXRfcG10dShkc3QpOworCXJldHVybiAwOworCitlcnJvcjoKKwlpZiAoZHN0KQorCQlkc3RfZnJlZShkc3QpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX2RlY29kZV9zZXNzaW9uNihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZmxvd2kgKmZsKQoreworCXUxNiBvZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCXN0cnVjdCBpcHY2aGRyICpoZHIgPSBza2ItPm5oLmlwdjZoOworCXN0cnVjdCBpcHY2X29wdF9oZHIgKmV4dGhkciA9IChzdHJ1Y3QgaXB2Nl9vcHRfaGRyKikoc2tiLT5uaC5yYXcgKyBvZmZzZXQpOworCXU4IG5leHRoZHIgPSBza2ItPm5oLmlwdjZoLT5uZXh0aGRyOworCisJbWVtc2V0KGZsLCAwLCBzaXplb2Yoc3RydWN0IGZsb3dpKSk7CisJaXB2Nl9hZGRyX2NvcHkoJmZsLT5mbDZfZHN0LCAmaGRyLT5kYWRkcik7CisJaXB2Nl9hZGRyX2NvcHkoJmZsLT5mbDZfc3JjLCAmaGRyLT5zYWRkcik7CisKKwl3aGlsZSAocHNrYl9tYXlfcHVsbChza2IsIHNrYi0+bmgucmF3ICsgb2Zmc2V0ICsgMSAtIHNrYi0+ZGF0YSkpIHsKKwkJc3dpdGNoIChuZXh0aGRyKSB7CisJCWNhc2UgTkVYVEhEUl9ST1VUSU5HOgorCQljYXNlIE5FWFRIRFJfSE9QOgorCQljYXNlIE5FWFRIRFJfREVTVDoKKwkJCW9mZnNldCArPSBpcHY2X29wdGxlbihleHRoZHIpOworCQkJbmV4dGhkciA9IGV4dGhkci0+bmV4dGhkcjsKKwkJCWV4dGhkciA9IChzdHJ1Y3QgaXB2Nl9vcHRfaGRyKikoc2tiLT5uaC5yYXcgKyBvZmZzZXQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJUFBST1RPX1VEUDoKKwkJY2FzZSBJUFBST1RPX1RDUDoKKwkJY2FzZSBJUFBST1RPX1NDVFA6CisJCQlpZiAocHNrYl9tYXlfcHVsbChza2IsIHNrYi0+bmgucmF3ICsgb2Zmc2V0ICsgNCAtIHNrYi0+ZGF0YSkpIHsKKwkJCQl1MTYgKnBvcnRzID0gKHUxNiAqKWV4dGhkcjsKKworCQkJCWZsLT5mbF9pcF9zcG9ydCA9IHBvcnRzWzBdOworCQkJCWZsLT5mbF9pcF9kcG9ydCA9IHBvcnRzWzFdOworCQkJfQorCQkJZmwtPnByb3RvID0gbmV4dGhkcjsKKwkJCXJldHVybjsKKworCQljYXNlIElQUFJPVE9fSUNNUFY2OgorCQkJaWYgKHBza2JfbWF5X3B1bGwoc2tiLCBza2ItPm5oLnJhdyArIG9mZnNldCArIDIgLSBza2ItPmRhdGEpKSB7CisJCQkJdTggKmljbXAgPSAodTggKilleHRoZHI7CisKKwkJCQlmbC0+ZmxfaWNtcF90eXBlID0gaWNtcFswXTsKKwkJCQlmbC0+ZmxfaWNtcF9jb2RlID0gaWNtcFsxXTsKKwkJCX0KKwkJCWZsLT5wcm90byA9IG5leHRoZHI7CisJCQlyZXR1cm47CisKKwkJLyogWFhYIFdoeSBhcmUgdGhlcmUgdGhlc2UgaGVhZGVycz8gKi8KKwkJY2FzZSBJUFBST1RPX0FIOgorCQljYXNlIElQUFJPVE9fRVNQOgorCQljYXNlIElQUFJPVE9fQ09NUDoKKwkJZGVmYXVsdDoKKwkJCWZsLT5mbF9pcHNlY19zcGkgPSAwOworCQkJZmwtPnByb3RvID0gbmV4dGhkcjsKKwkJCXJldHVybjsKKwkJfTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHhmcm02X2dhcmJhZ2VfY29sbGVjdCh2b2lkKQoreworCXJlYWRfbG9jaygmeGZybTZfcG9saWN5X2FmaW5mby5sb2NrKTsKKwl4ZnJtNl9wb2xpY3lfYWZpbmZvLmdhcmJhZ2VfY29sbGVjdCgpOworCXJlYWRfdW5sb2NrKCZ4ZnJtNl9wb2xpY3lfYWZpbmZvLmxvY2spOworCXJldHVybiAoYXRvbWljX3JlYWQoJnhmcm02X2RzdF9vcHMuZW50cmllcykgPiB4ZnJtNl9kc3Rfb3BzLmdjX3RocmVzaCoyKTsKK30KKworc3RhdGljIHZvaWQgeGZybTZfdXBkYXRlX3BtdHUoc3RydWN0IGRzdF9lbnRyeSAqZHN0LCB1MzIgbXR1KQoreworCXN0cnVjdCB4ZnJtX2RzdCAqeGRzdCA9IChzdHJ1Y3QgeGZybV9kc3QgKilkc3Q7CisJc3RydWN0IGRzdF9lbnRyeSAqcGF0aCA9IHhkc3QtPnJvdXRlOworCisJcGF0aC0+b3BzLT51cGRhdGVfcG10dShwYXRoLCBtdHUpOworfQorCitzdGF0aWMgc3RydWN0IGRzdF9vcHMgeGZybTZfZHN0X29wcyA9IHsKKwkuZmFtaWx5ID0JCUFGX0lORVQ2LAorCS5wcm90b2NvbCA9CQlfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQVjYpLAorCS5nYyA9CQkJeGZybTZfZ2FyYmFnZV9jb2xsZWN0LAorCS51cGRhdGVfcG10dSA9CQl4ZnJtNl91cGRhdGVfcG10dSwKKwkuZ2NfdGhyZXNoID0JCTEwMjQsCisJLmVudHJ5X3NpemUgPQkJc2l6ZW9mKHN0cnVjdCB4ZnJtX2RzdCksCit9OworCitzdGF0aWMgc3RydWN0IHhmcm1fcG9saWN5X2FmaW5mbyB4ZnJtNl9wb2xpY3lfYWZpbmZvID0geworCS5mYW1pbHkgPQkJQUZfSU5FVDYsCisJLmxvY2sgPSAJCVJXX0xPQ0tfVU5MT0NLRUQsCisJLnR5cGVfbWFwID0gCQkmeGZybTZfdHlwZV9tYXAsCisJLmRzdF9vcHMgPQkJJnhmcm02X2RzdF9vcHMsCisJLmRzdF9sb29rdXAgPQkJeGZybTZfZHN0X2xvb2t1cCwKKwkuZmluZF9idW5kbGUgPQkJX194ZnJtNl9maW5kX2J1bmRsZSwKKwkuYnVuZGxlX2NyZWF0ZSA9CV9feGZybTZfYnVuZGxlX2NyZWF0ZSwKKwkuZGVjb2RlX3Nlc3Npb24gPQlfZGVjb2RlX3Nlc3Npb242LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHhmcm02X3BvbGljeV9pbml0KHZvaWQpCit7CisJeGZybV9wb2xpY3lfcmVnaXN0ZXJfYWZpbmZvKCZ4ZnJtNl9wb2xpY3lfYWZpbmZvKTsKK30KKworc3RhdGljIHZvaWQgeGZybTZfcG9saWN5X2Zpbmkodm9pZCkKK3sKKwl4ZnJtX3BvbGljeV91bnJlZ2lzdGVyX2FmaW5mbygmeGZybTZfcG9saWN5X2FmaW5mbyk7Cit9CisKK3ZvaWQgX19pbml0IHhmcm02X2luaXQodm9pZCkKK3sKKwl4ZnJtNl9wb2xpY3lfaW5pdCgpOworCXhmcm02X3N0YXRlX2luaXQoKTsKK30KKwordm9pZCB4ZnJtNl9maW5pKHZvaWQpCit7CisJLy94ZnJtNl9pbnB1dF9maW5pKCk7CisJeGZybTZfcG9saWN5X2ZpbmkoKTsKKwl4ZnJtNl9zdGF0ZV9maW5pKCk7Cit9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni94ZnJtNl9zdGF0ZS5jIGIvbmV0L2lwdjYveGZybTZfc3RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjBkMGFiCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYveGZybTZfc3RhdGUuYwpAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIHhmcm02X3N0YXRlLmM6IGJhc2VkIG9uIHhmcm00X3N0YXRlLmMKKyAqCisgKiBBdXRob3JzOgorICoJTWl0c3VydSBLQU5EQSBAVVNBR0kKKyAqIAlLYXp1bm9yaSBNSVlBWkFXQSBAVVNBR0kKKyAqIAlLdW5paGlybyBJc2hpZ3VybyA8a3VuaWhpcm9AaXBpbmZ1c2lvbi5jb20+CisgKiAJCUlQdjYgc3VwcG9ydAorICogCVlPU0hJRlVKSSBIaWRlYWtpIEBVU0FHSQorICogCQlTcGxpdCB1cCBhZi1zcGVjaWZpYyBwb3J0aW9uCisgKiAJCisgKi8KKworI2luY2x1ZGUgPG5ldC94ZnJtLmg+CisjaW5jbHVkZSA8bGludXgvcGZrZXl2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwc2VjLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKworc3RhdGljIHN0cnVjdCB4ZnJtX3N0YXRlX2FmaW5mbyB4ZnJtNl9zdGF0ZV9hZmluZm87CisKK3N0YXRpYyB2b2lkCitfX3hmcm02X2luaXRfdGVtcHNlbChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IGZsb3dpICpmbCwKKwkJICAgICBzdHJ1Y3QgeGZybV90bXBsICp0bXBsLAorCQkgICAgIHhmcm1fYWRkcmVzc190ICpkYWRkciwgeGZybV9hZGRyZXNzX3QgKnNhZGRyKQoreworCS8qIEluaXRpYWxpemUgdGVtcG9yYXJ5IHNlbGVjdG9yIG1hdGNoaW5nIG9ubHkKKwkgKiB0byBjdXJyZW50IHNlc3Npb24uICovCisJaXB2Nl9hZGRyX2NvcHkoKHN0cnVjdCBpbjZfYWRkciAqKSZ4LT5zZWwuZGFkZHIsICZmbC0+Zmw2X2RzdCk7CisJaXB2Nl9hZGRyX2NvcHkoKHN0cnVjdCBpbjZfYWRkciAqKSZ4LT5zZWwuc2FkZHIsICZmbC0+Zmw2X3NyYyk7CisJeC0+c2VsLmRwb3J0ID0geGZybV9mbG93aV9kcG9ydChmbCk7CisJeC0+c2VsLmRwb3J0X21hc2sgPSB+MDsKKwl4LT5zZWwuc3BvcnQgPSB4ZnJtX2Zsb3dpX3Nwb3J0KGZsKTsKKwl4LT5zZWwuc3BvcnRfbWFzayA9IH4wOworCXgtPnNlbC5wcmVmaXhsZW5fZCA9IDEyODsKKwl4LT5zZWwucHJlZml4bGVuX3MgPSAxMjg7CisJeC0+c2VsLnByb3RvID0gZmwtPnByb3RvOworCXgtPnNlbC5pZmluZGV4ID0gZmwtPm9pZjsKKwl4LT5pZCA9IHRtcGwtPmlkOworCWlmIChpcHY2X2FkZHJfYW55KChzdHJ1Y3QgaW42X2FkZHIqKSZ4LT5pZC5kYWRkcikpCisJCW1lbWNweSgmeC0+aWQuZGFkZHIsIGRhZGRyLCBzaXplb2YoeC0+c2VsLmRhZGRyKSk7CisJbWVtY3B5KCZ4LT5wcm9wcy5zYWRkciwgJnRtcGwtPnNhZGRyLCBzaXplb2YoeC0+cHJvcHMuc2FkZHIpKTsKKwlpZiAoaXB2Nl9hZGRyX2FueSgoc3RydWN0IGluNl9hZGRyKikmeC0+cHJvcHMuc2FkZHIpKQorCQltZW1jcHkoJngtPnByb3BzLnNhZGRyLCBzYWRkciwgc2l6ZW9mKHgtPnByb3BzLnNhZGRyKSk7CisJeC0+cHJvcHMubW9kZSA9IHRtcGwtPm1vZGU7CisJeC0+cHJvcHMucmVxaWQgPSB0bXBsLT5yZXFpZDsKKwl4LT5wcm9wcy5mYW1pbHkgPSBBRl9JTkVUNjsKK30KKworc3RhdGljIHN0cnVjdCB4ZnJtX3N0YXRlICoKK19feGZybTZfc3RhdGVfbG9va3VwKHhmcm1fYWRkcmVzc190ICpkYWRkciwgdTMyIHNwaSwgdTggcHJvdG8pCit7CisJdW5zaWduZWQgaCA9IF9feGZybTZfc3BpX2hhc2goZGFkZHIsIHNwaSwgcHJvdG8pOworCXN0cnVjdCB4ZnJtX3N0YXRlICp4OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh4LCB4ZnJtNl9zdGF0ZV9hZmluZm8uc3RhdGVfYnlzcGkraCwgYnlzcGkpIHsKKwkJaWYgKHgtPnByb3BzLmZhbWlseSA9PSBBRl9JTkVUNiAmJgorCQkgICAgc3BpID09IHgtPmlkLnNwaSAmJgorCQkgICAgaXB2Nl9hZGRyX2VxdWFsKChzdHJ1Y3QgaW42X2FkZHIgKilkYWRkciwgKHN0cnVjdCBpbjZfYWRkciAqKXgtPmlkLmRhZGRyLmE2KSAmJgorCQkgICAgcHJvdG8gPT0geC0+aWQucHJvdG8pIHsKKwkJCXhmcm1fc3RhdGVfaG9sZCh4KTsKKwkJCXJldHVybiB4OworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHhmcm1fc3RhdGUgKgorX194ZnJtNl9maW5kX2FjcSh1OCBtb2RlLCB1MzIgcmVxaWQsIHU4IHByb3RvLCAKKwkJIHhmcm1fYWRkcmVzc190ICpkYWRkciwgeGZybV9hZGRyZXNzX3QgKnNhZGRyLCAKKwkJIGludCBjcmVhdGUpCit7CisJc3RydWN0IHhmcm1fc3RhdGUgKngsICp4MDsKKwl1bnNpZ25lZCBoID0gX194ZnJtNl9kc3RfaGFzaChkYWRkcik7CisKKwl4MCA9IE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHgsIHhmcm02X3N0YXRlX2FmaW5mby5zdGF0ZV9ieWRzdCtoLCBieWRzdCkgeworCQlpZiAoeC0+cHJvcHMuZmFtaWx5ID09IEFGX0lORVQ2ICYmCisJCSAgICBpcHY2X2FkZHJfZXF1YWwoKHN0cnVjdCBpbjZfYWRkciAqKWRhZGRyLCAoc3RydWN0IGluNl9hZGRyICopeC0+aWQuZGFkZHIuYTYpICYmCisJCSAgICBtb2RlID09IHgtPnByb3BzLm1vZGUgJiYKKwkJICAgIHByb3RvID09IHgtPmlkLnByb3RvICYmCisJCSAgICBpcHY2X2FkZHJfZXF1YWwoKHN0cnVjdCBpbjZfYWRkciAqKXNhZGRyLCAoc3RydWN0IGluNl9hZGRyICopeC0+cHJvcHMuc2FkZHIuYTYpICYmCisJCSAgICByZXFpZCA9PSB4LT5wcm9wcy5yZXFpZCAmJgorCQkgICAgeC0+a20uc3RhdGUgPT0gWEZSTV9TVEFURV9BQ1EgJiYKKwkJICAgICF4LT5pZC5zcGkpIHsKKwkJCSAgICB4MCA9IHg7CisJCQkgICAgYnJlYWs7CisJCSAgICB9CisJfQorCWlmICgheDAgJiYgY3JlYXRlICYmICh4MCA9IHhmcm1fc3RhdGVfYWxsb2MoKSkgIT0gTlVMTCkgeworCQlpcHY2X2FkZHJfY29weSgoc3RydWN0IGluNl9hZGRyICopeDAtPnNlbC5kYWRkci5hNiwKKwkJCSAgICAgICAoc3RydWN0IGluNl9hZGRyICopZGFkZHIpOworCQlpcHY2X2FkZHJfY29weSgoc3RydWN0IGluNl9hZGRyICopeDAtPnNlbC5zYWRkci5hNiwKKwkJCSAgICAgICAoc3RydWN0IGluNl9hZGRyICopc2FkZHIpOworCQl4MC0+c2VsLnByZWZpeGxlbl9kID0gMTI4OworCQl4MC0+c2VsLnByZWZpeGxlbl9zID0gMTI4OworCQlpcHY2X2FkZHJfY29weSgoc3RydWN0IGluNl9hZGRyICopeDAtPnByb3BzLnNhZGRyLmE2LAorCQkJICAgICAgIChzdHJ1Y3QgaW42X2FkZHIgKilzYWRkcik7CisJCXgwLT5rbS5zdGF0ZSA9IFhGUk1fU1RBVEVfQUNROworCQlpcHY2X2FkZHJfY29weSgoc3RydWN0IGluNl9hZGRyICopeDAtPmlkLmRhZGRyLmE2LAorCQkJICAgICAgIChzdHJ1Y3QgaW42X2FkZHIgKilkYWRkcik7CisJCXgwLT5pZC5wcm90byA9IHByb3RvOworCQl4MC0+cHJvcHMuZmFtaWx5ID0gQUZfSU5FVDY7CisJCXgwLT5wcm9wcy5tb2RlID0gbW9kZTsKKwkJeDAtPnByb3BzLnJlcWlkID0gcmVxaWQ7CisJCXgwLT5sZnQuaGFyZF9hZGRfZXhwaXJlc19zZWNvbmRzID0gWEZSTV9BQ1FfRVhQSVJFUzsKKwkJeGZybV9zdGF0ZV9ob2xkKHgwKTsKKwkJeDAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgWEZSTV9BQ1FfRVhQSVJFUypIWjsKKwkJYWRkX3RpbWVyKCZ4MC0+dGltZXIpOworCQl4ZnJtX3N0YXRlX2hvbGQoeDApOworCQlsaXN0X2FkZF90YWlsKCZ4MC0+Ynlkc3QsIHhmcm02X3N0YXRlX2FmaW5mby5zdGF0ZV9ieWRzdCtoKTsKKwkJd2FrZV91cCgma21fd2FpdHEpOworCX0KKwlpZiAoeDApCisJCXhmcm1fc3RhdGVfaG9sZCh4MCk7CisJcmV0dXJuIHgwOworfQorCitzdGF0aWMgc3RydWN0IHhmcm1fc3RhdGVfYWZpbmZvIHhmcm02X3N0YXRlX2FmaW5mbyA9IHsKKwkuZmFtaWx5CQkJPSBBRl9JTkVUNiwKKwkubG9jawkJCT0gUldfTE9DS19VTkxPQ0tFRCwKKwkuaW5pdF90ZW1wc2VsCQk9IF9feGZybTZfaW5pdF90ZW1wc2VsLAorCS5zdGF0ZV9sb29rdXAJCT0gX194ZnJtNl9zdGF0ZV9sb29rdXAsCisJLmZpbmRfYWNxCQk9IF9feGZybTZfZmluZF9hY3EsCit9OworCit2b2lkIF9faW5pdCB4ZnJtNl9zdGF0ZV9pbml0KHZvaWQpCit7CisJeGZybV9zdGF0ZV9yZWdpc3Rlcl9hZmluZm8oJnhmcm02X3N0YXRlX2FmaW5mbyk7Cit9CisKK3ZvaWQgeGZybTZfc3RhdGVfZmluaSh2b2lkKQoreworCXhmcm1fc3RhdGVfdW5yZWdpc3Rlcl9hZmluZm8oJnhmcm02X3N0YXRlX2FmaW5mbyk7Cit9CisKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3hmcm02X3R1bm5lbC5jIGIvbmV0L2lwdjYveGZybTZfdHVubmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZjYWRkNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY2L3hmcm02X3R1bm5lbC5jCkBAIC0wLDAgKzEsNTQzIEBACisvKgorICogQ29weXJpZ2h0IChDKTIwMDMsMjAwNCBVU0FHSS9XSURFIFByb2plY3QKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiBBdXRob3JzCU1pdHN1cnUgS0FOREEgIDxta0BsaW51eC1pcHY2Lm9yZz4KKyAqIAkJWU9TSElGVUpJIEhpZGVha2kgPHlvc2hmdWppQGxpbnV4LWlwdjYub3JnPgorICoKKyAqIEJhc2VkIG9uIG5ldC9pcHY0L3hmcm00X3R1bm5lbC5jCisgKgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgveGZybS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQveGZybS5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPGxpbnV4L2ljbXB2Ni5oPgorCisjaWZkZWYgQ09ORklHX0lQVjZfWEZSTTZfVFVOTkVMX0RFQlVHCisjIGRlZmluZSBYNlRERUJVRwkzCisjZWxzZQorIyBkZWZpbmUgWDZUREVCVUcJMQorI2VuZGlmCisKKyNkZWZpbmUgWDZUUFJJTlRLKGZtdCwgYXJncy4uLikJCXByaW50ayhmbXQsICMjIGFyZ3MpCisjZGVmaW5lIFg2VE5PUFJJTlRLKGZtdCwgYXJncy4uLikJZG8geyA7IH0gd2hpbGUoMCkKKworI2lmIFg2VERFQlVHID49IDEKKyMgZGVmaW5lIFg2VFBSSU5USzEJWDZUUFJJTlRLCisjZWxzZQorIyBkZWZpbmUgWDZUUFJJTlRLMQlYNlROT1BSSU5USworI2VuZGlmCisKKyNpZiBYNlRERUJVRyA+PSAzCisjIGRlZmluZSBYNlRQUklOVEszCVg2VFBSSU5USworI2Vsc2UKKyMgZGVmaW5lIFg2VFBSSU5USzMJWDZUTk9QUklOVEsKKyNlbmRpZgorCisvKgorICogeGZybV90dW5uZWxfc3BpIHRoaW5ncyBhcmUgZm9yIGFsbG9jYXRpbmcgdW5pcXVlIGlkICgic3BpIikgCisgKiBwZXIgeGZybV9hZGRyZXNzX3QuCisgKi8KK3N0cnVjdCB4ZnJtNl90dW5uZWxfc3BpIHsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBsaXN0X2J5YWRkcjsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBsaXN0X2J5c3BpOworCXhmcm1fYWRkcmVzc190IGFkZHI7CisJdTMyIHNwaTsKKwlhdG9taWNfdCByZWZjbnQ7CisjaWZkZWYgWEZSTTZfVFVOTkVMX1NQSV9NQUdJQworCXUzMiBtYWdpYzsKKyNlbmRpZgorfTsKKworI2lmZGVmIENPTkZJR19JUFY2X1hGUk02X1RVTk5FTF9ERUJVRworIyBkZWZpbmUgWEZSTTZfVFVOTkVMX1NQSV9NQUdJQyAweGRlYWRiZWVmCisjZW5kaWYKKworc3RhdGljIERFRklORV9SV0xPQ0soeGZybTZfdHVubmVsX3NwaV9sb2NrKTsKKworc3RhdGljIHUzMiB4ZnJtNl90dW5uZWxfc3BpOworCisjZGVmaW5lIFhGUk02X1RVTk5FTF9TUElfTUlOCTEKKyNkZWZpbmUgWEZSTTZfVFVOTkVMX1NQSV9NQVgJMHhmZmZmZmZmZgorCitzdGF0aWMga21lbV9jYWNoZV90ICp4ZnJtNl90dW5uZWxfc3BpX2ttZW07CisKKyNkZWZpbmUgWEZSTTZfVFVOTkVMX1NQSV9CWUFERFJfSFNJWkUgMjU2CisjZGVmaW5lIFhGUk02X1RVTk5FTF9TUElfQllTUElfSFNJWkUgMjU2CisKK3N0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCB4ZnJtNl90dW5uZWxfc3BpX2J5YWRkcltYRlJNNl9UVU5ORUxfU1BJX0JZQUREUl9IU0laRV07CitzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgeGZybTZfdHVubmVsX3NwaV9ieXNwaVtYRlJNNl9UVU5ORUxfU1BJX0JZU1BJX0hTSVpFXTsKKworI2lmZGVmIFhGUk02X1RVTk5FTF9TUElfTUFHSUMKK3N0YXRpYyBpbnQgeDZzcGlfY2hlY2tfbWFnaWMoY29uc3Qgc3RydWN0IHhmcm02X3R1bm5lbF9zcGkgKng2c3BpLAorCQkJICAgICBjb25zdCBjaGFyICpuYW1lKQoreworCWlmICh1bmxpa2VseSh4NnNwaS0+bWFnaWMgIT0gWEZSTTZfVFVOTkVMX1NQSV9NQUdJQykpIHsKKwkJWDZUUFJJTlRLMyhLRVJOX0RFQlVHICIlcygpOiB4NnNwaSBvYmplY3QgIgorCQkJCSAgICAgICJhdCAlcCBoYXMgY29ycnVwdGVkIG1hZ2ljICUwOHggIgorCQkJCSAgICAgICIoc2hvdWxkIGJlICUwOHgpXG4iLAorCQkJICAgbmFtZSwgeDZzcGksIHg2c3BpLT5tYWdpYywgWEZSTTZfVFVOTkVMX1NQSV9NQUdJQyk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisjZWxzZQorc3RhdGljIGludCBpbmxpbmUgeDZzcGlfY2hlY2tfbWFnaWMoY29uc3Qgc3RydWN0IHhmcm02X3R1bm5lbF9zcGkgKng2c3BpLAorCQkJCSAgICBjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNkZWZpbmUgWDZTUElfQ0hFQ0tfTUFHSUMoeDZzcGkpIHg2c3BpX2NoZWNrX21hZ2ljKCh4NnNwaSksIF9fRlVOQ1RJT05fXykKKworCitzdGF0aWMgdW5zaWduZWQgaW5saW5lIHhmcm02X3R1bm5lbF9zcGlfaGFzaF9ieWFkZHIoeGZybV9hZGRyZXNzX3QgKmFkZHIpCit7CisJdW5zaWduZWQgaDsKKworCVg2VFBSSU5USzMoS0VSTl9ERUJVRyAiJXMoYWRkcj0lcClcbiIsIF9fRlVOQ1RJT05fXywgYWRkcik7CisKKwloID0gYWRkci0+YTZbMF0gXiBhZGRyLT5hNlsxXSBeIGFkZHItPmE2WzJdIF4gYWRkci0+YTZbM107CisJaCBePSBoID4+IDE2OworCWggXj0gaCA+PiA4OworCWggJj0gWEZSTTZfVFVOTkVMX1NQSV9CWUFERFJfSFNJWkUgLSAxOworCisJWDZUUFJJTlRLMyhLRVJOX0RFQlVHICIlcygpID0gJXVcbiIsIF9fRlVOQ1RJT05fXywgaCk7CisKKwlyZXR1cm4gaDsKK30KKworc3RhdGljIHVuc2lnbmVkIGlubGluZSB4ZnJtNl90dW5uZWxfc3BpX2hhc2hfYnlzcGkodTMyIHNwaSkKK3sKKwlyZXR1cm4gc3BpICUgWEZSTTZfVFVOTkVMX1NQSV9CWVNQSV9IU0laRTsKK30KKworCitzdGF0aWMgaW50IHhmcm02X3R1bm5lbF9zcGlfaW5pdCh2b2lkKQoreworCWludCBpOworCisJWDZUUFJJTlRLMyhLRVJOX0RFQlVHICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJeGZybTZfdHVubmVsX3NwaSA9IDA7CisJeGZybTZfdHVubmVsX3NwaV9rbWVtID0ga21lbV9jYWNoZV9jcmVhdGUoInhmcm02X3R1bm5lbF9zcGkiLAorCQkJCQkJICBzaXplb2Yoc3RydWN0IHhmcm02X3R1bm5lbF9zcGkpLAorCQkJCQkJICAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sCisJCQkJCQkgIE5VTEwsIE5VTEwpOworCWlmICgheGZybTZfdHVubmVsX3NwaV9rbWVtKSB7CisJCVg2VFBSSU5USzEoS0VSTl9FUlIKKwkJCSAgICIlcygpOiBmYWlsZWQgdG8gYWxsb2NhdGUgeGZybTZfdHVubmVsX3NwaV9rbWVtXG4iLAorCQkgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBYRlJNNl9UVU5ORUxfU1BJX0JZQUREUl9IU0laRTsgaSsrKQorCQlJTklUX0hMSVNUX0hFQUQoJnhmcm02X3R1bm5lbF9zcGlfYnlhZGRyW2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgWEZSTTZfVFVOTkVMX1NQSV9CWVNQSV9IU0laRTsgaSsrKQorCQlJTklUX0hMSVNUX0hFQUQoJnhmcm02X3R1bm5lbF9zcGlfYnlzcGlbaV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB4ZnJtNl90dW5uZWxfc3BpX2Zpbmkodm9pZCkKK3sKKwlpbnQgaTsKKworCVg2VFBSSU5USzMoS0VSTl9ERUJVRyAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWZvciAoaSA9IDA7IGkgPCBYRlJNNl9UVU5ORUxfU1BJX0JZQUREUl9IU0laRTsgaSsrKSB7CisJCWlmICghaGxpc3RfZW1wdHkoJnhmcm02X3R1bm5lbF9zcGlfYnlhZGRyW2ldKSkKKwkJCWdvdG8gZXJyOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgWEZSTTZfVFVOTkVMX1NQSV9CWVNQSV9IU0laRTsgaSsrKSB7CisJCWlmICghaGxpc3RfZW1wdHkoJnhmcm02X3R1bm5lbF9zcGlfYnlzcGlbaV0pKQorCQkJZ290byBlcnI7CisJfQorCWttZW1fY2FjaGVfZGVzdHJveSh4ZnJtNl90dW5uZWxfc3BpX2ttZW0pOworCXhmcm02X3R1bm5lbF9zcGlfa21lbSA9IE5VTEw7CisJcmV0dXJuOworZXJyOgorCVg2VFBSSU5USzEoS0VSTl9FUlIgIiVzKCk6IHRhYmxlIGlzIG5vdCBlbXB0eVxuIiwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeGZybTZfdHVubmVsX3NwaSAqX194ZnJtNl90dW5uZWxfc3BpX2xvb2t1cCh4ZnJtX2FkZHJlc3NfdCAqc2FkZHIpCit7CisJc3RydWN0IHhmcm02X3R1bm5lbF9zcGkgKng2c3BpOworCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CisKKwlYNlRQUklOVEszKEtFUk5fREVCVUcgIiVzKHNhZGRyPSVwKVxuIiwgX19GVU5DVElPTl9fLCBzYWRkcik7CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeSh4NnNwaSwgcG9zLAorCQkJICAgICAmeGZybTZfdHVubmVsX3NwaV9ieWFkZHJbeGZybTZfdHVubmVsX3NwaV9oYXNoX2J5YWRkcihzYWRkcildLAorCQkJICAgICBsaXN0X2J5YWRkcikgeworCQlpZiAobWVtY21wKCZ4NnNwaS0+YWRkciwgc2FkZHIsIHNpemVvZih4NnNwaS0+YWRkcikpID09IDApIHsKKwkJCVg2U1BJX0NIRUNLX01BR0lDKHg2c3BpKTsKKwkJCVg2VFBSSU5USzMoS0VSTl9ERUJVRyAiJXMoKSA9ICVwKCV1KVxuIiwgX19GVU5DVElPTl9fLCB4NnNwaSwgeDZzcGktPnNwaSk7CisJCQlyZXR1cm4geDZzcGk7CisJCX0KKwl9CisKKwlYNlRQUklOVEszKEtFUk5fREVCVUcgIiVzKCkgPSBOVUxMKDApXG4iLCBfX0ZVTkNUSU9OX18pOworCXJldHVybiBOVUxMOworfQorCit1MzIgeGZybTZfdHVubmVsX3NwaV9sb29rdXAoeGZybV9hZGRyZXNzX3QgKnNhZGRyKQoreworCXN0cnVjdCB4ZnJtNl90dW5uZWxfc3BpICp4NnNwaTsKKwl1MzIgc3BpOworCisJWDZUUFJJTlRLMyhLRVJOX0RFQlVHICIlcyhzYWRkcj0lcClcbiIsIF9fRlVOQ1RJT05fXywgc2FkZHIpOworCisJcmVhZF9sb2NrX2JoKCZ4ZnJtNl90dW5uZWxfc3BpX2xvY2spOworCXg2c3BpID0gX194ZnJtNl90dW5uZWxfc3BpX2xvb2t1cChzYWRkcik7CisJc3BpID0geDZzcGkgPyB4NnNwaS0+c3BpIDogMDsKKwlyZWFkX3VubG9ja19iaCgmeGZybTZfdHVubmVsX3NwaV9sb2NrKTsKKwlyZXR1cm4gc3BpOworfQorCitFWFBPUlRfU1lNQk9MKHhmcm02X3R1bm5lbF9zcGlfbG9va3VwKTsKKworc3RhdGljIHUzMiBfX3hmcm02X3R1bm5lbF9hbGxvY19zcGkoeGZybV9hZGRyZXNzX3QgKnNhZGRyKQoreworCXUzMiBzcGk7CisJc3RydWN0IHhmcm02X3R1bm5lbF9zcGkgKng2c3BpOworCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CisJdW5zaWduZWQgaW5kZXg7CisKKwlYNlRQUklOVEszKEtFUk5fREVCVUcgIiVzKHNhZGRyPSVwKVxuIiwgX19GVU5DVElPTl9fLCBzYWRkcik7CisKKwlpZiAoeGZybTZfdHVubmVsX3NwaSA8IFhGUk02X1RVTk5FTF9TUElfTUlOIHx8CisJICAgIHhmcm02X3R1bm5lbF9zcGkgPj0gWEZSTTZfVFVOTkVMX1NQSV9NQVgpCisJCXhmcm02X3R1bm5lbF9zcGkgPSBYRlJNNl9UVU5ORUxfU1BJX01JTjsKKwllbHNlCisJCXhmcm02X3R1bm5lbF9zcGkrKzsKKworCWZvciAoc3BpID0geGZybTZfdHVubmVsX3NwaTsgc3BpIDw9IFhGUk02X1RVTk5FTF9TUElfTUFYOyBzcGkrKykgeworCQlpbmRleCA9IHhmcm02X3R1bm5lbF9zcGlfaGFzaF9ieXNwaShzcGkpOworCQlobGlzdF9mb3JfZWFjaF9lbnRyeSh4NnNwaSwgcG9zLCAKKwkJCQkgICAgICZ4ZnJtNl90dW5uZWxfc3BpX2J5c3BpW2luZGV4XSwgCisJCQkJICAgICBsaXN0X2J5c3BpKSB7CisJCQlpZiAoeDZzcGktPnNwaSA9PSBzcGkpCisJCQkJZ290byB0cnlfbmV4dF8xOworCQl9CisJCXhmcm02X3R1bm5lbF9zcGkgPSBzcGk7CisJCWdvdG8gYWxsb2Nfc3BpOwordHJ5X25leHRfMTo7CisJfQorCWZvciAoc3BpID0gWEZSTTZfVFVOTkVMX1NQSV9NSU47IHNwaSA8IHhmcm02X3R1bm5lbF9zcGk7IHNwaSsrKSB7CisJCWluZGV4ID0geGZybTZfdHVubmVsX3NwaV9oYXNoX2J5c3BpKHNwaSk7CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHg2c3BpLCBwb3MsIAorCQkJCSAgICAgJnhmcm02X3R1bm5lbF9zcGlfYnlzcGlbaW5kZXhdLCAKKwkJCQkgICAgIGxpc3RfYnlzcGkpIHsKKwkJCWlmICh4NnNwaS0+c3BpID09IHNwaSkKKwkJCQlnb3RvIHRyeV9uZXh0XzI7CisJCX0KKwkJeGZybTZfdHVubmVsX3NwaSA9IHNwaTsKKwkJZ290byBhbGxvY19zcGk7Cit0cnlfbmV4dF8yOjsKKwl9CisJc3BpID0gMDsKKwlnb3RvIG91dDsKK2FsbG9jX3NwaToKKwlYNlRQUklOVEszKEtFUk5fREVCVUcgIiVzKCk6IGFsbG9jYXRlIG5ldyBzcGkgZm9yICIKKwkJCSAgICAgICIlMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHhcbiIsIAorCQkJICAgICAgX19GVU5DVElPTl9fLCAKKwkJCSAgICAgIE5JUDYoKihzdHJ1Y3QgaW42X2FkZHIgKilzYWRkcikpOworCXg2c3BpID0ga21lbV9jYWNoZV9hbGxvYyh4ZnJtNl90dW5uZWxfc3BpX2ttZW0sIFNMQUJfQVRPTUlDKTsKKwlpZiAoIXg2c3BpKSB7CisJCVg2VFBSSU5USzEoS0VSTl9FUlIgIiVzKCk6IGttZW1fY2FjaGVfYWxsb2MoKSBmYWlsZWRcbiIsIAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJZ290byBvdXQ7CisJfQorI2lmZGVmIFhGUk02X1RVTk5FTF9TUElfTUFHSUMKKwl4NnNwaS0+bWFnaWMgPSBYRlJNNl9UVU5ORUxfU1BJX01BR0lDOworI2VuZGlmCisJbWVtY3B5KCZ4NnNwaS0+YWRkciwgc2FkZHIsIHNpemVvZih4NnNwaS0+YWRkcikpOworCXg2c3BpLT5zcGkgPSBzcGk7CisJYXRvbWljX3NldCgmeDZzcGktPnJlZmNudCwgMSk7CisKKwlobGlzdF9hZGRfaGVhZCgmeDZzcGktPmxpc3RfYnlzcGksICZ4ZnJtNl90dW5uZWxfc3BpX2J5c3BpW2luZGV4XSk7CisKKwlpbmRleCA9IHhmcm02X3R1bm5lbF9zcGlfaGFzaF9ieWFkZHIoc2FkZHIpOworCWhsaXN0X2FkZF9oZWFkKCZ4NnNwaS0+bGlzdF9ieWFkZHIsICZ4ZnJtNl90dW5uZWxfc3BpX2J5YWRkcltpbmRleF0pOworCVg2U1BJX0NIRUNLX01BR0lDKHg2c3BpKTsKK291dDoKKwlYNlRQUklOVEszKEtFUk5fREVCVUcgIiVzKCkgPSAldVxuIiwgX19GVU5DVElPTl9fLCBzcGkpOworCXJldHVybiBzcGk7Cit9CisKK3UzMiB4ZnJtNl90dW5uZWxfYWxsb2Nfc3BpKHhmcm1fYWRkcmVzc190ICpzYWRkcikKK3sKKwlzdHJ1Y3QgeGZybTZfdHVubmVsX3NwaSAqeDZzcGk7CisJdTMyIHNwaTsKKworCVg2VFBSSU5USzMoS0VSTl9ERUJVRyAiJXMoc2FkZHI9JXApXG4iLCBfX0ZVTkNUSU9OX18sIHNhZGRyKTsKKworCXdyaXRlX2xvY2tfYmgoJnhmcm02X3R1bm5lbF9zcGlfbG9jayk7CisJeDZzcGkgPSBfX3hmcm02X3R1bm5lbF9zcGlfbG9va3VwKHNhZGRyKTsKKwlpZiAoeDZzcGkpIHsKKwkJYXRvbWljX2luYygmeDZzcGktPnJlZmNudCk7CisJCXNwaSA9IHg2c3BpLT5zcGk7CisJfSBlbHNlCisJCXNwaSA9IF9feGZybTZfdHVubmVsX2FsbG9jX3NwaShzYWRkcik7CisJd3JpdGVfdW5sb2NrX2JoKCZ4ZnJtNl90dW5uZWxfc3BpX2xvY2spOworCisJWDZUUFJJTlRLMyhLRVJOX0RFQlVHICIlcygpID0gJXVcbiIsIF9fRlVOQ1RJT05fXywgc3BpKTsKKworCXJldHVybiBzcGk7Cit9CisKK0VYUE9SVF9TWU1CT0woeGZybTZfdHVubmVsX2FsbG9jX3NwaSk7CisKK3ZvaWQgeGZybTZfdHVubmVsX2ZyZWVfc3BpKHhmcm1fYWRkcmVzc190ICpzYWRkcikKK3sKKwlzdHJ1Y3QgeGZybTZfdHVubmVsX3NwaSAqeDZzcGk7CisJc3RydWN0IGhsaXN0X25vZGUgKnBvcywgKm47CisKKwlYNlRQUklOVEszKEtFUk5fREVCVUcgIiVzKHNhZGRyPSVwKVxuIiwgX19GVU5DVElPTl9fLCBzYWRkcik7CisKKwl3cml0ZV9sb2NrX2JoKCZ4ZnJtNl90dW5uZWxfc3BpX2xvY2spOworCisJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh4NnNwaSwgcG9zLCBuLCAKKwkJCQkgICZ4ZnJtNl90dW5uZWxfc3BpX2J5YWRkclt4ZnJtNl90dW5uZWxfc3BpX2hhc2hfYnlhZGRyKHNhZGRyKV0sCisJCQkJICBsaXN0X2J5YWRkcikKKwl7CisJCWlmIChtZW1jbXAoJng2c3BpLT5hZGRyLCBzYWRkciwgc2l6ZW9mKHg2c3BpLT5hZGRyKSkgPT0gMCkgeworCQkJWDZUUFJJTlRLMyhLRVJOX0RFQlVHICIlcygpOiB4NnNwaSBvYmplY3QgIgorCQkJCQkgICAgICAiZm9yICUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eCAiCisJCQkJCSAgICAgICJmb3VuZCBhdCAlcFxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18sIAorCQkJCSAgIE5JUDYoKihzdHJ1Y3QgaW42X2FkZHIgKilzYWRkciksCisJCQkJICAgeDZzcGkpOworCQkJWDZTUElfQ0hFQ0tfTUFHSUMoeDZzcGkpOworCQkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJng2c3BpLT5yZWZjbnQpKSB7CisJCQkJaGxpc3RfZGVsKCZ4NnNwaS0+bGlzdF9ieWFkZHIpOworCQkJCWhsaXN0X2RlbCgmeDZzcGktPmxpc3RfYnlzcGkpOworCQkJCWttZW1fY2FjaGVfZnJlZSh4ZnJtNl90dW5uZWxfc3BpX2ttZW0sIHg2c3BpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwl3cml0ZV91bmxvY2tfYmgoJnhmcm02X3R1bm5lbF9zcGlfbG9jayk7Cit9CisKK0VYUE9SVF9TWU1CT0woeGZybTZfdHVubmVsX2ZyZWVfc3BpKTsKKworc3RhdGljIGludCB4ZnJtNl90dW5uZWxfb3V0cHV0KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcHY2aGRyICp0b3BfaXBoOworCisJdG9wX2lwaCA9IChzdHJ1Y3QgaXB2NmhkciAqKXNrYi0+ZGF0YTsKKwl0b3BfaXBoLT5wYXlsb2FkX2xlbiA9IGh0b25zKHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4ZnJtNl90dW5uZWxfaW5wdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCB4ZnJtX2RlY2FwX3N0YXRlICpkZWNhcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB4ZnJtNl90dW5uZWwgKnhmcm02X3R1bm5lbF9oYW5kbGVyOworc3RhdGljIERFQ0xBUkVfTVVURVgoeGZybTZfdHVubmVsX3NlbSk7CisKK2ludCB4ZnJtNl90dW5uZWxfcmVnaXN0ZXIoc3RydWN0IHhmcm02X3R1bm5lbCAqaGFuZGxlcikKK3sKKwlpbnQgcmV0OworCisJZG93bigmeGZybTZfdHVubmVsX3NlbSk7CisJcmV0ID0gMDsKKwlpZiAoeGZybTZfdHVubmVsX2hhbmRsZXIgIT0gTlVMTCkKKwkJcmV0ID0gLUVJTlZBTDsKKwlpZiAoIXJldCkKKwkJeGZybTZfdHVubmVsX2hhbmRsZXIgPSBoYW5kbGVyOworCXVwKCZ4ZnJtNl90dW5uZWxfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKK0VYUE9SVF9TWU1CT0woeGZybTZfdHVubmVsX3JlZ2lzdGVyKTsKKworaW50IHhmcm02X3R1bm5lbF9kZXJlZ2lzdGVyKHN0cnVjdCB4ZnJtNl90dW5uZWwgKmhhbmRsZXIpCit7CisJaW50IHJldDsKKworCWRvd24oJnhmcm02X3R1bm5lbF9zZW0pOworCXJldCA9IDA7CisJaWYgKHhmcm02X3R1bm5lbF9oYW5kbGVyICE9IGhhbmRsZXIpCisJCXJldCA9IC1FSU5WQUw7CisJaWYgKCFyZXQpCisJCXhmcm02X3R1bm5lbF9oYW5kbGVyID0gTlVMTDsKKwl1cCgmeGZybTZfdHVubmVsX3NlbSk7CisKKwlzeW5jaHJvbml6ZV9uZXQoKTsKKworCXJldHVybiByZXQ7Cit9CisKK0VYUE9SVF9TWU1CT0woeGZybTZfdHVubmVsX2RlcmVnaXN0ZXIpOworCitzdGF0aWMgaW50IHhmcm02X3R1bm5lbF9yY3Yoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCB1bnNpZ25lZCBpbnQgKm5ob2ZmcCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKnBza2I7CisJc3RydWN0IHhmcm02X3R1bm5lbCAqaGFuZGxlciA9IHhmcm02X3R1bm5lbF9oYW5kbGVyOworCXN0cnVjdCBpcHY2aGRyICppcGggPSBza2ItPm5oLmlwdjZoOworCXUzMiBzcGk7CisKKwkvKiBkZXZpY2UtbGlrZV9pcDZpcDZfaGFuZGxlcigpICovCisJaWYgKGhhbmRsZXIgJiYgaGFuZGxlci0+aGFuZGxlcihwc2tiLCBuaG9mZnApID09IDApCisJCXJldHVybiAwOworCisJc3BpID0geGZybTZfdHVubmVsX3NwaV9sb29rdXAoKHhmcm1fYWRkcmVzc190ICopJmlwaC0+c2FkZHIpOworCXJldHVybiB4ZnJtNl9yY3Zfc3BpKHBza2IsIG5ob2ZmcCwgc3BpKTsKK30KKworc3RhdGljIHZvaWQgeGZybTZfdHVubmVsX2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCwKKwkJCSAgICAgaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX3UzMiBpbmZvKQoreworCXN0cnVjdCB4ZnJtNl90dW5uZWwgKmhhbmRsZXIgPSB4ZnJtNl90dW5uZWxfaGFuZGxlcjsKKworCS8qIGNhbGwgaGVyZSBmaXJzdCBmb3IgZGV2aWNlLWxpa2UgaXA2aXA2IGVyciBoYW5kbGluZyAqLworCWlmIChoYW5kbGVyKSB7CisJCWhhbmRsZXItPmVycl9oYW5kbGVyKHNrYiwgb3B0LCB0eXBlLCBjb2RlLCBvZmZzZXQsIGluZm8pOworCQlyZXR1cm47CisJfQorCisJLyogeGZybTZfdHVubmVsIG5hdGl2ZSBlcnIgaGFuZGxpbmcgKi8KKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElDTVBWNl9ERVNUX1VOUkVBQ0g6IAorCQlzd2l0Y2ggKGNvZGUpIHsKKwkJY2FzZSBJQ01QVjZfTk9ST1VURTogCisJCWNhc2UgSUNNUFY2X0FETV9QUk9ISUJJVEVEOgorCQljYXNlIElDTVBWNl9OT1RfTkVJR0hCT1VSOgorCQljYXNlIElDTVBWNl9BRERSX1VOUkVBQ0g6CisJCWNhc2UgSUNNUFY2X1BPUlRfVU5SRUFDSDoKKwkJZGVmYXVsdDoKKwkJCVg2VFBSSU5USzMoS0VSTl9ERUJVRworCQkJCSAgICJ4ZnJtNl90dW5uZWw6IERlc3RpbmF0aW9uIFVucmVhY2guXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgSUNNUFY2X1BLVF9UT09CSUc6CisJCQlYNlRQUklOVEszKEtFUk5fREVCVUcgCisJCQkJICAgInhmcm02X3R1bm5lbDogUGFja2V0IFRvbyBCaWcuXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBJQ01QVjZfVElNRV9FWENFRUQ6CisJCXN3aXRjaCAoY29kZSkgeworCQljYXNlIElDTVBWNl9FWENfSE9QTElNSVQ6CisJCQlYNlRQUklOVEszKEtFUk5fREVCVUcKKwkJCQkgICAieGZybTZfdHVubmVsOiBUb28gc21hbGwgSG9wbGltaXQuXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIElDTVBWNl9FWENfRlJBR1RJTUU6CisJCWRlZmF1bHQ6IAorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJQ01QVjZfUEFSQU1QUk9COgorCQlzd2l0Y2ggKGNvZGUpIHsKKwkJY2FzZSBJQ01QVjZfSERSX0ZJRUxEOiBicmVhazsKKwkJY2FzZSBJQ01QVjZfVU5LX05FWFRIRFI6IGJyZWFrOworCQljYXNlIElDTVBWNl9VTktfT1BUSU9OOiBicmVhazsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHhmcm02X3R1bm5lbF9pbml0X3N0YXRlKHN0cnVjdCB4ZnJtX3N0YXRlICp4LCB2b2lkICphcmdzKQoreworCWlmICgheC0+cHJvcHMubW9kZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoeC0+ZW5jYXApCisJCXJldHVybiAtRUlOVkFMOworCisJeC0+cHJvcHMuaGVhZGVyX2xlbiA9IHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgeGZybTZfdHVubmVsX2Rlc3Ryb3koc3RydWN0IHhmcm1fc3RhdGUgKngpCit7CisJeGZybTZfdHVubmVsX2ZyZWVfc3BpKCh4ZnJtX2FkZHJlc3NfdCAqKSZ4LT5wcm9wcy5zYWRkcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeGZybV90eXBlIHhmcm02X3R1bm5lbF90eXBlID0geworCS5kZXNjcmlwdGlvbgk9ICJJUDZJUDYiLAorCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5wcm90bwkJPSBJUFBST1RPX0lQVjYsCisJLmluaXRfc3RhdGUJPSB4ZnJtNl90dW5uZWxfaW5pdF9zdGF0ZSwKKwkuZGVzdHJ1Y3Rvcgk9IHhmcm02X3R1bm5lbF9kZXN0cm95LAorCS5pbnB1dAkJPSB4ZnJtNl90dW5uZWxfaW5wdXQsCisJLm91dHB1dAkJPSB4ZnJtNl90dW5uZWxfb3V0cHV0LAorfTsKKworc3RhdGljIHN0cnVjdCBpbmV0Nl9wcm90b2NvbCB4ZnJtNl90dW5uZWxfcHJvdG9jb2wgPSB7CisJLmhhbmRsZXIJPSB4ZnJtNl90dW5uZWxfcmN2LAorCS5lcnJfaGFuZGxlcgk9IHhmcm02X3R1bm5lbF9lcnIsIAorCS5mbGFncyAgICAgICAgICA9IElORVQ2X1BST1RPX05PUE9MSUNZfElORVQ2X1BST1RPX0ZJTkFMLAorfTsKKworc3RhdGljIGludCBfX2luaXQgeGZybTZfdHVubmVsX2luaXQodm9pZCkKK3sKKwlYNlRQUklOVEszKEtFUk5fREVCVUcgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAoeGZybV9yZWdpc3Rlcl90eXBlKCZ4ZnJtNl90dW5uZWxfdHlwZSwgQUZfSU5FVDYpIDwgMCkgeworCQlYNlRQUklOVEsxKEtFUk5fRVJSCisJCQkgICAieGZybTZfdHVubmVsIGluaXQ6IGNhbid0IGFkZCB4ZnJtIHR5cGVcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJaWYgKGluZXQ2X2FkZF9wcm90b2NvbCgmeGZybTZfdHVubmVsX3Byb3RvY29sLCBJUFBST1RPX0lQVjYpIDwgMCkgeworCQlYNlRQUklOVEsxKEtFUk5fRVJSCisJCQkgICAieGZybTZfdHVubmVsIGluaXQoKTogY2FuJ3QgYWRkIHByb3RvY29sXG4iKTsKKwkJeGZybV91bnJlZ2lzdGVyX3R5cGUoJnhmcm02X3R1bm5lbF90eXBlLCBBRl9JTkVUNik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlpZiAoeGZybTZfdHVubmVsX3NwaV9pbml0KCkgPCAwKSB7CisJCVg2VFBSSU5USzEoS0VSTl9FUlIKKwkJCSAgICJ4ZnJtNl90dW5uZWwgaW5pdDogZmFpbGVkIHRvIGluaXRpYWxpemUgc3BpXG4iKTsKKwkJaW5ldDZfZGVsX3Byb3RvY29sKCZ4ZnJtNl90dW5uZWxfcHJvdG9jb2wsIElQUFJPVE9fSVBWNik7CisJCXhmcm1fdW5yZWdpc3Rlcl90eXBlKCZ4ZnJtNl90dW5uZWxfdHlwZSwgQUZfSU5FVDYpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB4ZnJtNl90dW5uZWxfZmluaSh2b2lkKQoreworCVg2VFBSSU5USzMoS0VSTl9ERUJVRyAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXhmcm02X3R1bm5lbF9zcGlfZmluaSgpOworCWlmIChpbmV0Nl9kZWxfcHJvdG9jb2woJnhmcm02X3R1bm5lbF9wcm90b2NvbCwgSVBQUk9UT19JUFY2KSA8IDApCisJCVg2VFBSSU5USzEoS0VSTl9FUlIgCisJCQkgICAieGZybTZfdHVubmVsIGNsb3NlOiBjYW4ndCByZW1vdmUgcHJvdG9jb2xcbiIpOworCWlmICh4ZnJtX3VucmVnaXN0ZXJfdHlwZSgmeGZybTZfdHVubmVsX3R5cGUsIEFGX0lORVQ2KSA8IDApCisJCVg2VFBSSU5USzEoS0VSTl9FUlIKKwkJCSAgICJ4ZnJtNl90dW5uZWwgY2xvc2U6IGNhbid0IHJlbW92ZSB4ZnJtIHR5cGVcbiIpOworfQorCittb2R1bGVfaW5pdCh4ZnJtNl90dW5uZWxfaW5pdCk7Cittb2R1bGVfZXhpdCh4ZnJtNl90dW5uZWxfZmluaSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvaXB4L0NoYW5nZUxvZyBiL25ldC9pcHgvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMjk3NjMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB4L0NoYW5nZUxvZwpAQCAtMCwwICsxLDEwMSBAQAorIFJldmlzaW9uIDAuMjE6CVVzZXMgdGhlIG5ldyBnZW5lcmljIHNvY2tldCBvcHRpb24gY29kZS4KKworIFJldmlzaW9uIDAuMjI6CUdjYyBjbGVhbiB1cHMgYW5kIGRyb3Agb3V0IGRldmljZSByZWdpc3RyYXRpb24uIFVzZSB0aGUKKyAJCW5ldyBtdWx0aS1wcm90b2NvbCBlZGl0aW9uIG9mIGhhcmRfaGVhZGVyCisKKyBSZXZpc2lvbiAwLjIzOiBJUFggL3Byb2MgYnkgTWFyayBFdmFucy4gQWRkaW5nIGEgcm91dGUgd2lsbAorIAkJd2lsbCBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIHJvdXRlIHRvIHRoZSBzYW1lIG5ldHdvcmsuCisKKyBSZXZpc2lvbiAwLjI0OglTdXBwb3J0cyBuZXcgL3Byb2Mgd2l0aCBubyA0SyBsaW1pdAorCisgUmV2aXNpb24gMC4yNToJQWRkIGVwaGVtZXJhbCBzb2NrZXRzLCBwYXNzaXZlIGxvY2FsIG5ldHdvcmsKKyAJCWlkZW50aWZpY2F0aW9uLCBzdXBwb3J0IGZvciBsb2NhbCBuZXQgMCBhbmQKKyAJCW11bHRpcGxlIGRhdGFsaW5rcyA8R3JlZyBQYWdlPgorCisgUmV2aXNpb24gMC4yNjogRGV2aWNlIGRyb3Aga2lsbHMgSVBYIHJvdXRlcyB2aWEgaXQuIChuZWVkZWQgZm9yIG1vZHVsZSkKKworIFJldmlzaW9uIDAuMjc6IEF1dG9iaW5kIDxNYXJrIEV2YW5zPgorCisgUmV2aXNpb24gMC4yODogU21hbGwgZml4IGZvciBtdWx0aXBsZSBsb2NhbCBuZXR3b3JrcyA8VGhvbWFzIFdpbmRlcj4KKworIFJldmlzaW9uIDAuMjk6IEFzc29ydGVkIG1ham9yIGVycm9ycyByZW1vdmVkIDxNYXJrIEV2YW5zPgorIAkJU21hbGwgY29ycmVjdGlvbiB0byBwcm9taXNjIG1vZGUgZXJyb3IgZml4IDxBbGFuIENveD4KKyAJCUFzeW5jaHJvbm91cyBJL08gc3VwcG9ydC4gQ2hhbmdlZCB0byB1c2Ugbm90aWZpZXJzCisgCQlhbmQgdGhlIG5ld2VyIHBhY2tldF90eXBlIHN0dWZmLiBBc3NvcnRlZCBtYWpvcgorIAkJZml4ZXMgPEFsZWphbmRybyBMaXU+CisKKyBSZXZpc2lvbiAwLjMwOglNb3ZlZCB0byBuZXQvaXB4Ly4uLgk8QWxhbiBDb3g+CisgCQlEb24ndCBzZXQgYWRkcmVzcyBsZW5ndGggb24gcmVjdmZyb20gdGhhdCBlcnJvcnMuCisgCQlJbmNvcnJlY3QgdmVyaWZ5X2FyZWEuCisKKyBSZXZpc2lvbiAwLjMxOglOZXcgc2tfYnVmZnMuIFRoaXMgc3RpbGwgbmVlZHMgYSBsb3Qgb2YgCisgCQl0ZXN0aW5nLiA8QWxhbiBDb3g+CisKKyBSZXZpc2lvbiAwLjMyOiBVc2luZyBzb2NrX2FsbG9jX3NlbmRfc2tiLCBmaXJld2FsbCBob29rcy4gPEFsYW4gQ294PgorIAkJU3VwcG9ydHMgc2VuZG1zZy9yZWN2bXNnCisKKyBSZXZpc2lvbiAwLjMzOglJbnRlcm5hbCBuZXR3b3JrIHN1cHBvcnQsIHJvdXRpbmcgY2hhbmdlcywgdXNlcyBhCisgCQlwcm90b2NvbCBwcml2YXRlIGFyZWEgZm9yIGlweCBkYXRhLgorCisgUmV2aXNpb24gMC4zNDoJTW9kdWxlIHN1cHBvcnQuIDxKaW0gRnJlZW1hbj4KKworIFJldmlzaW9uIDAuMzU6IENoZWNrc3VtIHN1cHBvcnQuIDxOZWlsIFR1cnRvbj4sIGhvb2tlZCBpbiBieSA8QWxhbiBDb3g+CisgCQlIYW5kbGVzIFdJTjk1IGRpc2NvdmVyeSBwYWNrZXRzIDxWb2xrZXIgTGVuZGVja2U+CisKKyBSZXZpc2lvbiAwLjM2OglJbnRlcm5hbCBidW1wIHVwIGZvciAyLjEKKworIFJldmlzaW9uIDAuMzc6CUJlZ2FuIGFkZGluZyBQT1NJWGlzbXMuCisKKyBSZXZpc2lvbiAwLjM4OiBBc3luY2hyb25vdXMgc29ja2V0IHN0dWZmIG1hZGUgY3VycmVudC4KKworIFJldmlzaW9uIDAuMzk6IFNQWCBpbnRlcmZhY2VzCisKKyBSZXZpc2lvbiAwLjQwOiBUaW55IFNJT0NHU1RBTVAgZml4IChjaHJpc0BjeWJlcm5ldC5jby5ueikKKworIFJldmlzaW9uIDAuNDE6IDgwMi4yVFIgcmVtb3ZlZCAocC5ub3J0b25AY29tcHV0ZXIub3JnKQorIAkJRml4ZWQgY29ubmVjdGluZyB0byBwcmltYXJ5IG5ldCwKKyAJCUF1dG9tYXRpYyBiaW5kaW5nIG9uIHNlbmQgJiByZWNlaXZlLAorIAkJTWFydGlqbiB2YW4gT29zdGVyaG91dCA8a2xlcHRvZ2ltcEBnZW9jaXRpZXMuY29tPgorCisgUmV2aXNpb24gMDQyOiAgTXVsdGl0aHJlYWRpbmcgLSB1c2Ugc3BpbmxvY2tzIGFuZCByZWZjb3VudGluZyB0bworIAkJcHJvdGVjdCBzb21lIHN0cnVjdHVyZXM6IGlweF9pbnRlcmZhY2Ugc29jayBsaXN0LCBsaXN0CisgCQlvZiBpcHggaW50ZXJmYWNlcywgZXRjLiAKKyAJCUJ1Z2ZpeGVzIC0gZG8gcmVmY291bnRpbmcgb24gbmV0X2RldmljZXMsIGNoZWNrIGZ1bmN0aW9uCisgCQlyZXN1bHRzLCBldGMuIFRoYW5rcyB0byBkYXZlbSBhbmQgZnJlaXRhZyBmb3IKKyAJCXN1Z2dlc3Rpb25zIGFuZCBndWlkYW5jZS4KKyAJCUFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPiwKKyAJCU5vdmVtYmVyLCAyMDAwCisKKyBSZXZpc2lvbiAwNDM6CVNoYXJlZCBTS0JzLCBkb24ndCBtYW5nbGUgcGFja2V0cywgc29tZSBjbGVhbnVwcworIAkJQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+LAorIAkJRGVjZW1iZXIsIDIwMDAKKworIFJldmlzaW9uIDA0NDoJQ2FsbCBpcHhpdGZfaG9sZCBvbiBORVRERVZfVVAgLSBhY21lCisKKyBSZXZpc2lvbiAwNDU6CWZpeCBQUFJPUCByb3V0aW5nIGJ1ZyAtIGFjbWUKKworIFJldmlzaW9uIDA0NjoJRnVydGhlciBmaXhlcyB0byBQUFJPUCwgaXB4aXRmX2NyZWF0ZV9pbnRlcm5hbCB3YXMKKyAJCWRvaW5nIGFuIHVubmVlZGVkIE1PRF9JTkNfVVNFX0NPVU5ULCBpbXBsZW1lbnQKKyAJCXN5c2N0bCBmb3IgaXB4X3Bwcm9wX2Jyb2FjYXN0aW5nLCBmaXggdGhlIGlweCBzeXNjdGwKKyAJCWhhbmRsaW5nLCBtYWtpbmcgaXQgZHluYW1pYywgc29tZSBjbGVhbnVwcywgdGhhbmtzIHRvCisgCQlQZXRyIFZhbmRyb3ZlYyBmb3IgcmV2aWV3IGFuZCBnb29kIHN1Z2dlc3Rpb25zLiAoYWNtZSkKKworIFJldmlzaW9uIDA0NzoJQ2xlYW51cHMsIENvZGluZ1N0eWxlIGNoYW5nZXMsIG1vdmUgdGhlIG5jcCBjb25uZWN0aW9uCisgCQloYWNrIG91dCBvZiBsaW5lIC0gYWNtZQorCisgUmV2aXNpb24gMDQ4OglVc2Ugc2stPnByb3RpbmZvIHRvIHN0b3JlIHRoZSBwb2ludGVyIHRvIElQWCBwcml2YXRlCisgCQlhcmVhLCByZW1vdmUgYWZfaXB4IGZyb20gc2stPnByb3RpbmZvIGFuZCBtb3ZlIGlweF9vcHQKKyAJCXRvIGluY2x1ZGUvbmV0L2lweC5oLCB1c2UgSVBYX1NLIGxpa2UgRGVjTkVULCBldGMgLSBhY21lCisKKyBSZXZpc2lvbiAwNDk6CVNQWCBzdXBwb3J0IGRyb3BwZWQsIHNlZSBjb21tZW50IGluIGlweF9jcmVhdGUgLSBhY21lCisKKyBSZXZpc2lvbiAwNTA6CVVzZSBzZXFfZmlsZSBmb3IgcHJvYyBzdHVmZiwgbW92aW5nIGl0IHRvIGlweF9wcm9jLmMgLSBhY21lCisKK090aGVyIGZpeGVzOgorIAorIFByb3RlY3QgdGhlIG1vZHVsZSBieSBhIE1PRF9JTkNfVVNFX0NPVU5UL01PRF9ERUNfVVNFX0NPVU5UIHBhaXIuIEFsc28sIG5vdworIHVzYWdlIGNvdW50IGlzIG1hbmFnZWQgdGhpcyB3YXk6CisgLUNvdW50IG9uZSBpZiB0aGUgYXV0b19pbnRlcmZhY2UgbW9kZSBpcyBvbgorIC1Db3VudCBvbmUgcGVyIGNvbmZpZ3VyZWQgaW50ZXJmYWNlCisgCisgSmFjcXVlcyBHZWxpbmFzIChqYWNxdWVzQHNvbHVjb3JwLnFjLmNhKQpkaWZmIC0tZ2l0IGEvbmV0L2lweC9LY29uZmlnIGIvbmV0L2lweC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNjIzN2MKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB4L0tjb25maWcKQEAgLTAsMCArMSwzMSBAQAorIworIyBJUFggY29uZmlndXJhdGlvbgorIworY29uZmlnIElQWF9JTlRFUk4KKwlib29sICJJUFg6IEZ1bGwgaW50ZXJuYWwgSVBYIG5ldHdvcmsiCisJZGVwZW5kcyBvbiBJUFgKKwktLS1oZWxwLS0tCisJICBFdmVyeSBJUFggbmV0d29yayBoYXMgYW4gYWRkcmVzcyB0aGF0IGlkZW50aWZpZXMgaXQuIFNvbWV0aW1lcyBpdCBpcworCSAgdXNlZnVsIHRvIGdpdmUgYW4gSVBYICJuZXR3b3JrIiBhZGRyZXNzIHRvIHlvdXIgTGludXggYm94IGFzIHdlbGwKKwkgIChmb3IgZXhhbXBsZSBpZiB5b3VyIGJveCBpcyBhY3RpbmcgYXMgYSBmaWxlIHNlcnZlciBmb3IgZGlmZmVyZW50CisJICBJUFggbmV0d29ya3M6IGl0IHdpbGwgdGhlbiBiZSBhY2Nlc3NpYmxlIGZyb20gZXZlcnl3aGVyZSB1c2luZyB0aGUKKwkgIHNhbWUgYWRkcmVzcykuIFRoZSB3YXkgdGhpcyBpcyBkb25lIGlzIHRvIGNyZWF0ZSBhIHZpcnR1YWwgaW50ZXJuYWwKKwkgICJuZXR3b3JrIiBpbnNpZGUgeW91ciBib3ggYW5kIHRvIGFzc2lnbiBhbiBJUFggYWRkcmVzcyB0byB0aGlzCisJICBuZXR3b3JrLiBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGRvIHRoaXM7IHJlYWQgdGhlIElQWC1IT1dUTyBhdAorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPiBmb3IgZGV0YWlscy4KKworCSAgVGhlIGZ1bGwgaW50ZXJuYWwgSVBYIG5ldHdvcmsgZW5hYmxlcyB5b3UgdG8gYWxsb2NhdGUgc29ja2V0cyBvbgorCSAgZGlmZmVyZW50IHZpcnR1YWwgbm9kZXMgb2YgdGhlIGludGVybmFsIG5ldHdvcmsuIFRoaXMgaXMgZG9uZSBieQorCSAgZXZhbHVhdGluZyB0aGUgZmllbGQgc2lweF9ub2RlIG9mIHRoZSBzb2NrZXQgYWRkcmVzcyBnaXZlbiB0byB0aGUKKwkgIGJpbmQgY2FsbC4gU28gYXBwbGljYXRpb25zIHNob3VsZCBhbHdheXMgaW5pdGlhbGl6ZSB0aGUgbm9kZSBmaWVsZAorCSAgdG8gMCB3aGVuIGJpbmRpbmcgYSBzb2NrZXQgb24gdGhlIHByaW1hcnkgbmV0d29yay4gSW4gdGhpcyBjYXNlIHRoZQorCSAgc29ja2V0IGlzIGFzc2lnbmVkIHRoZSBkZWZhdWx0IG5vZGUgdGhhdCBoYXMgYmVlbiBnaXZlbiB0byB0aGUKKwkgIGtlcm5lbCB3aGVuIHRoZSBpbnRlcm5hbCBuZXR3b3JrIHdhcyBjcmVhdGVkLiBCeSBlbmFibGluZyB0aGUgZnVsbAorCSAgaW50ZXJuYWwgSVBYIG5ldHdvcmsgdGhlIGNyb3NzLWZvcndhcmRpbmcgb2YgcGFja2V0cyB0YXJnZXRlZCBhdAorCSAgJ3NwZWNpYWwnIHNvY2tldHMgdG8gc29ja2V0cyBsaXN0ZW5pbmcgb24gdGhlIHByaW1hcnkgbmV0d29yayBpcworCSAgZGlzYWJsZWQuIFRoaXMgbWlnaHQgYnJlYWsgZXhpc3RpbmcgYXBwbGljYXRpb25zLCBlc3BlY2lhbGx5IFJJUC9TQVAKKwkgIGRhZW1vbnMuIEEgUklQL1NBUCBkYWVtb24gdGhhdCB3b3JrcyB3ZWxsIHdpdGggdGhlIGZ1bGwgaW50ZXJuYWwgbmV0CisJICBjYW4gYmUgZm91bmQgb24gPGZ0cDovL2Z0cC5nd2RnLmRlL3B1Yi9saW51eC9taXNjL25jcGZzLz4uCisKKwkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgeW91IGFyZSBkb2luZywgc2F5IE4uCisKZGlmZiAtLWdpdCBhL25ldC9pcHgvTWFrZWZpbGUgYi9uZXQvaXB4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOTVlM2UKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB4L01ha2VmaWxlCkBAIC0wLDAgKzEsOCBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IElQWCBsYXllci4KKyMKKworb2JqLSQoQ09ORklHX0lQWCkgKz0gaXB4Lm8KKworaXB4LXkJCQk6PSBhZl9pcHgubyBpcHhfcm91dGUubyBpcHhfcHJvYy5vCitpcHgtJChDT05GSUdfU1lTQ1RMKQkrPSBzeXNjdGxfbmV0X2lweC5vCmRpZmYgLS1naXQgYS9uZXQvaXB4L2FmX2lweC5jIGIvbmV0L2lweC9hZl9pcHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTI3ZTVkCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lweC9hZl9pcHguYwpAQCAtMCwwICsxLDIwMjQgQEAKKy8qCisgKglJbXBsZW1lbnRzIGFuIElQWCBzb2NrZXQgbGF5ZXIuCisgKgorICoJVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSB3b3JrIGJ5CisgKgkJUm9zcyBCaXJvCTogCVdyaXRpbmcgdGhlIG9yaWdpbmFsIElQIHN0YWNrCisgKgkJRnJlZCBWYW4gS2VtcGVuIDoJVGlkeWluZyB1cCB0aGUgVENQL0lQCisgKgorICoJTWFueSB0aGFua3MgZ28gdG8gS2VpdGggQmFrZXIsIEluc3RpdHV0ZSBGb3IgSW5kdXN0cmlhbCBJbmZvcm1hdGlvbgorICoJVGVjaG5vbG9neSBMdGQsIFN3YW5zZWEgVW5pdmVyc2l0eSBmb3IgYWxsb3dpbmcgbWUgdG8gd29yayBvbiB0aGlzCisgKglpbiBteSBvd24gdGltZSBldmVuIHRob3VnaCBpdCB3YXMgaW4gc29tZSB3YXlzIHJlbGF0ZWQgdG8gY29tbWVyY2lhbAorICoJd29yayBJIGFtIGN1cnJlbnRseSBlbXBsb3llZCB0byBkbyB0aGVyZS4KKyAqCisgKglBbGwgdGhlIG1hdGVyaWFsIGluIHRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBHbnUgbGljZW5zZSB2ZXJzaW9uIDIuCisgKglOZWl0aGVyIEFsYW4gQ294IG5vciB0aGUgU3dhbnNlYSBVbml2ZXJzaXR5IENvbXB1dGVyIFNvY2lldHkgYWRtaXQgCisgKglsaWFiaWxpdHkgbm9yIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsCisgKglpcyBwcm92aWRlZCBhcyBpcyBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqCVBvcnRpb25zIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIENvbmVjdGl2YSwgSW5jLiA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorICoJTmVpdGhlciBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gbm9yIENvbmVjdGl2YSwgSW5jLiBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKglwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZAorICoJIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqIAlQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTUgQ2FsZGVyYSwgSW5jLiA8Z3JlZ0BjYWxkZXJhLmNvbT4KKyAqCU5laXRoZXIgR3JlZyBQYWdlIG5vciBDYWxkZXJhLCBJbmMuIGFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZQorICoJd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkCisgKgkiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoJU2VlIG5ldC9pcHgvQ2hhbmdlTG9nLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lweC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90ZXJtaW9zLmg+CisKKyNpbmNsdWRlIDxuZXQvaXB4Lmg+CisjaW5jbHVkZSA8bmV0L3A4MDIyLmg+CisjaW5jbHVkZSA8bmV0L3BzbmFwLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCitleHRlcm4gdm9pZCBpcHhfcmVnaXN0ZXJfc3lzY3RsKHZvaWQpOworZXh0ZXJuIHZvaWQgaXB4X3VucmVnaXN0ZXJfc3lzY3RsKHZvaWQpOworI2Vsc2UKKyNkZWZpbmUgaXB4X3JlZ2lzdGVyX3N5c2N0bCgpCisjZGVmaW5lIGlweF91bnJlZ2lzdGVyX3N5c2N0bCgpCisjZW5kaWYKKworLyogQ29uZmlndXJhdGlvbiBWYXJpYWJsZXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGlweGNmZ19tYXhfaG9wcyA9IDE2Oworc3RhdGljIGNoYXIgaXB4Y2ZnX2F1dG9fc2VsZWN0X3ByaW1hcnk7CitzdGF0aWMgY2hhciBpcHhjZmdfYXV0b19jcmVhdGVfaW50ZXJmYWNlczsKK2ludCBzeXNjdGxfaXB4X3Bwcm9wX2Jyb2FkY2FzdGluZyA9IDE7CisKKy8qIEdsb2JhbCBWYXJpYWJsZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgZGF0YWxpbmtfcHJvdG8gKnA4MDIyX2RhdGFsaW5rOworc3RhdGljIHN0cnVjdCBkYXRhbGlua19wcm90byAqcEVJSV9kYXRhbGluazsKK3N0YXRpYyBzdHJ1Y3QgZGF0YWxpbmtfcHJvdG8gKnA4MDIzX2RhdGFsaW5rOworc3RhdGljIHN0cnVjdCBkYXRhbGlua19wcm90byAqcFNOQVBfZGF0YWxpbms7CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIGlweF9kZ3JhbV9vcHM7CisKK0xJU1RfSEVBRChpcHhfaW50ZXJmYWNlcyk7CitERUZJTkVfU1BJTkxPQ0soaXB4X2ludGVyZmFjZXNfbG9jayk7CisKK3N0cnVjdCBpcHhfaW50ZXJmYWNlICppcHhfcHJpbWFyeV9uZXQ7CitzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaXB4X2ludGVybmFsX25ldDsKKworZXh0ZXJuIGludCBpcHhydHJfYWRkX3JvdXRlKF9fdTMyIG5ldHdvcmssIHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMsCisJCQkgICAgdW5zaWduZWQgY2hhciAqbm9kZSk7CitleHRlcm4gdm9pZCBpcHhydHJfZGVsX3JvdXRlcyhzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjKTsKK2V4dGVybiBpbnQgaXB4cnRyX3JvdXRlX3BhY2tldChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrYWRkcl9pcHggKnVzaXB4LAorCQkJICAgICAgIHN0cnVjdCBpb3ZlYyAqaW92LCBpbnQgbGVuLCBpbnQgbm9ibG9jayk7CitleHRlcm4gaW50IGlweHJ0cl9yb3V0ZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gc3RydWN0IGlweF9yb3V0ZSAqaXB4cnRyX2xvb2t1cChfX3UzMiBuZXQpOworZXh0ZXJuIGludCBpcHhydHJfaW9jdGwodW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZyk7CisKKyN1bmRlZiBJUFhfUkVGQ05UX0RFQlVHCisjaWZkZWYgSVBYX1JFRkNOVF9ERUJVRworYXRvbWljX3QgaXB4X3NvY2tfbnI7CisjZW5kaWYKKworc3RydWN0IGlweF9pbnRlcmZhY2UgKmlweF9pbnRlcmZhY2VzX2hlYWQodm9pZCkKK3sKKwlzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqcmMgPSBOVUxMOworCisJaWYgKCFsaXN0X2VtcHR5KCZpcHhfaW50ZXJmYWNlcykpCisJCXJjID0gbGlzdF9lbnRyeShpcHhfaW50ZXJmYWNlcy5uZXh0LAorCQkJCXN0cnVjdCBpcHhfaW50ZXJmYWNlLCBub2RlKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGlweGNmZ19zZXRfYXV0b19zZWxlY3QoY2hhciB2YWwpCit7CisJaXB4Y2ZnX2F1dG9fc2VsZWN0X3ByaW1hcnkgPSB2YWw7CisJaWYgKHZhbCAmJiAhaXB4X3ByaW1hcnlfbmV0KQorCQlpcHhfcHJpbWFyeV9uZXQgPSBpcHhfaW50ZXJmYWNlc19oZWFkKCk7Cit9CisKK3N0YXRpYyBpbnQgaXB4Y2ZnX2dldF9jb25maWdfZGF0YShzdHJ1Y3QgaXB4X2NvbmZpZ19kYXRhIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBpcHhfY29uZmlnX2RhdGEgdmFsczsKKworCXZhbHMuaXB4Y2ZnX2F1dG9fY3JlYXRlX2ludGVyZmFjZXMgPSBpcHhjZmdfYXV0b19jcmVhdGVfaW50ZXJmYWNlczsKKwl2YWxzLmlweGNmZ19hdXRvX3NlbGVjdF9wcmltYXJ5CSAgID0gaXB4Y2ZnX2F1dG9fc2VsZWN0X3ByaW1hcnk7CisKKwlyZXR1cm4gY29weV90b191c2VyKGFyZywgJnZhbHMsIHNpemVvZih2YWxzKSkgPyAtRUZBVUxUIDogMDsKK30KKworLyoKKyAqIE5vdGU6IFNvY2tldHMgbWF5IG5vdCBiZSByZW1vdmVkIF9kdXJpbmdfIGFuIGludGVycnVwdCBvciBpbmV0X2JoCisgKiBoYW5kbGVyIHVzaW5nIHRoaXMgdGVjaG5pcXVlLiBUaGV5IGNhbiBiZSBhZGRlZCBhbHRob3VnaCB3ZSBkbyBub3QKKyAqIHVzZSB0aGlzIGZhY2lsaXR5LgorICovCisKK3N0YXRpYyB2b2lkIGlweF9yZW1vdmVfc29ja2V0KHN0cnVjdCBzb2NrICpzaykKK3sKKwkvKiBEZXRlcm1pbmUgaW50ZXJmYWNlIHdpdGggd2hpY2ggc29ja2V0IGlzIGFzc29jaWF0ZWQgKi8KKwlzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjID0gaXB4X3NrKHNrKS0+aW50cmZjOworCisJaWYgKCFpbnRyZmMpCisJCWdvdG8gb3V0OworCisJaXB4aXRmX2hvbGQoaW50cmZjKTsKKwlzcGluX2xvY2tfYmgoJmludHJmYy0+aWZfc2tsaXN0X2xvY2spOworCXNrX2RlbF9ub2RlX2luaXQoc2spOworCXNwaW5fdW5sb2NrX2JoKCZpbnRyZmMtPmlmX3NrbGlzdF9sb2NrKTsKKwlpcHhpdGZfcHV0KGludHJmYyk7CitvdXQ6CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBpcHhfZGVzdHJveV9zb2NrZXQoc3RydWN0IHNvY2sgKnNrKQoreworCWlweF9yZW1vdmVfc29ja2V0KHNrKTsKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKyNpZmRlZiBJUFhfUkVGQ05UX0RFQlVHCisgICAgICAgIGF0b21pY19kZWMoJmlweF9zb2NrX25yKTsKKyAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIklQWCBzb2NrZXQgJXAgcmVsZWFzZWQsICVkIGFyZSBzdGlsbCBhbGl2ZVxuIiwgc2ssCisJCQlhdG9taWNfcmVhZCgmaXB4X3NvY2tfbnIpKTsKKwlpZiAoYXRvbWljX3JlYWQoJnNrLT5za19yZWZjbnQpICE9IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICJEZXN0cnVjdGlvbiBzb2NrIGlweCAlcCBkZWxheWVkLCBjbnQ9JWRcbiIsCisJCQkJc2ssIGF0b21pY19yZWFkKCZzay0+c2tfcmVmY250KSk7CisjZW5kaWYKKwlzb2NrX3B1dChzayk7Cit9CisKKy8qIAorICogVGhlIGZvbGxvd2luZyBjb2RlIGlzIHVzZWQgdG8gc3VwcG9ydCBJUFggSW50ZXJmYWNlcyAoSVBYSVRGKS4gIEFuCisgKiBJUFggaW50ZXJmYWNlIGlzIGRlZmluZWQgYnkgYSBwaHlzaWNhbCBkZXZpY2UgYW5kIGEgZnJhbWUgdHlwZS4KKyAqLworCisvKiBpcHhpdGZfY2xlYXJfcHJpbWFyeV9uZXQgaGFzIHRvIGJlIGNhbGxlZCB3aXRoIGlweF9pbnRlcmZhY2VzX2xvY2sgaGVsZCAqLworCitzdGF0aWMgdm9pZCBpcHhpdGZfY2xlYXJfcHJpbWFyeV9uZXQodm9pZCkKK3sKKwlpcHhfcHJpbWFyeV9uZXQgPSBOVUxMOworCWlmIChpcHhjZmdfYXV0b19zZWxlY3RfcHJpbWFyeSkKKwkJaXB4X3ByaW1hcnlfbmV0ID0gaXB4X2ludGVyZmFjZXNfaGVhZCgpOworfQorCitzdGF0aWMgc3RydWN0IGlweF9pbnRlcmZhY2UgKl9faXB4aXRmX2ZpbmRfdXNpbmdfcGh5cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkJICAgICAgdW5zaWduZWQgc2hvcnQgZGF0YWxpbmspCit7CisJc3RydWN0IGlweF9pbnRlcmZhY2UgKmk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZpcHhfaW50ZXJmYWNlcywgbm9kZSkKKwkJaWYgKGktPmlmX2RldiA9PSBkZXYgJiYgaS0+aWZfZGxpbmtfdHlwZSA9PSBkYXRhbGluaykKKwkJCWdvdG8gb3V0OworCWkgPSBOVUxMOworb3V0OgorCXJldHVybiBpOworfQorCitzdGF0aWMgc3RydWN0IGlweF9pbnRlcmZhY2UgKmlweGl0Zl9maW5kX3VzaW5nX3BoeXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCSAgICB1bnNpZ25lZCBzaG9ydCBkYXRhbGluaykKK3sKKwlzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaTsKKworCXNwaW5fbG9ja19iaCgmaXB4X2ludGVyZmFjZXNfbG9jayk7CisJaSA9IF9faXB4aXRmX2ZpbmRfdXNpbmdfcGh5cyhkZXYsIGRhdGFsaW5rKTsKKwlpZiAoaSkKKwkJaXB4aXRmX2hvbGQoaSk7CisJc3Bpbl91bmxvY2tfYmgoJmlweF9pbnRlcmZhY2VzX2xvY2spOworCXJldHVybiBpOworfQorCitzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaXB4aXRmX2ZpbmRfdXNpbmdfbmV0KF9fdTMyIG5ldCkKK3sKKwlzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaTsKKworCXNwaW5fbG9ja19iaCgmaXB4X2ludGVyZmFjZXNfbG9jayk7CisJaWYgKG5ldCkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZpcHhfaW50ZXJmYWNlcywgbm9kZSkKKwkJCWlmIChpLT5pZl9uZXRudW0gPT0gbmV0KQorCQkJCWdvdG8gaG9sZDsKKwkJaSA9IE5VTEw7CisJCWdvdG8gdW5sb2NrOworCX0KKworCWkgPSBpcHhfcHJpbWFyeV9uZXQ7CisJaWYgKGkpCitob2xkOgorCQlpcHhpdGZfaG9sZChpKTsKK3VubG9jazoKKwlzcGluX3VubG9ja19iaCgmaXB4X2ludGVyZmFjZXNfbG9jayk7CisJcmV0dXJuIGk7Cit9CisKKy8qIFNvY2tldHMgYXJlIGJvdW5kIHRvIGEgcGFydGljdWxhciBJUFggaW50ZXJmYWNlLiAqLworc3RhdGljIHZvaWQgaXB4aXRmX2luc2VydF9zb2NrZXQoc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYywgc3RydWN0IHNvY2sgKnNrKQoreworCWlweGl0Zl9ob2xkKGludHJmYyk7CisJc3Bpbl9sb2NrX2JoKCZpbnRyZmMtPmlmX3NrbGlzdF9sb2NrKTsKKwlpcHhfc2soc2spLT5pbnRyZmMgPSBpbnRyZmM7CisJc2tfYWRkX25vZGUoc2ssICZpbnRyZmMtPmlmX3NrbGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJmludHJmYy0+aWZfc2tsaXN0X2xvY2spOworCWlweGl0Zl9wdXQoaW50cmZjKTsKK30KKworLyogY2FsbGVyIG11c3QgaG9sZCBpbnRyZmMtPmlmX3NrbGlzdF9sb2NrICovCitzdGF0aWMgc3RydWN0IHNvY2sgKl9faXB4aXRmX2ZpbmRfc29ja2V0KHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMsCisJCQkJCSB1bnNpZ25lZCBzaG9ydCBwb3J0KQoreworCXN0cnVjdCBzb2NrICpzOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJc2tfZm9yX2VhY2gocywgbm9kZSwgJmludHJmYy0+aWZfc2tsaXN0KQorCQlpZiAoaXB4X3NrKHMpLT5wb3J0ID09IHBvcnQpCisJCQlnb3RvIGZvdW5kOworCXMgPSBOVUxMOworZm91bmQ6CisJcmV0dXJuIHM7Cit9CisKKy8qIGNhbGxlciBtdXN0IGhvbGQgYSByZWZlcmVuY2UgdG8gaW50cmZjICovCitzdGF0aWMgc3RydWN0IHNvY2sgKmlweGl0Zl9maW5kX3NvY2tldChzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjLAorCQkJCQl1bnNpZ25lZCBzaG9ydCBwb3J0KQoreworCXN0cnVjdCBzb2NrICpzOworCisJc3Bpbl9sb2NrX2JoKCZpbnRyZmMtPmlmX3NrbGlzdF9sb2NrKTsKKwlzID0gX19pcHhpdGZfZmluZF9zb2NrZXQoaW50cmZjLCBwb3J0KTsKKwlpZiAocykKKwkJc29ja19ob2xkKHMpOworCXNwaW5fdW5sb2NrX2JoKCZpbnRyZmMtPmlmX3NrbGlzdF9sb2NrKTsKKworCXJldHVybiBzOworfQorCisjaWZkZWYgQ09ORklHX0lQWF9JTlRFUk4KK3N0YXRpYyBzdHJ1Y3Qgc29jayAqaXB4aXRmX2ZpbmRfaW50ZXJuYWxfc29ja2V0KHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMsCisJCQkJCQl1bnNpZ25lZCBjaGFyICppcHhfbm9kZSwKKwkJCQkJCXVuc2lnbmVkIHNob3J0IHBvcnQpCit7CisJc3RydWN0IHNvY2sgKnM7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisKKwlpcHhpdGZfaG9sZChpbnRyZmMpOworCXNwaW5fbG9ja19iaCgmaW50cmZjLT5pZl9za2xpc3RfbG9jayk7CisKKwlza19mb3JfZWFjaChzLCBub2RlLCAmaW50cmZjLT5pZl9za2xpc3QpIHsKKwkJc3RydWN0IGlweF9zb2NrICppcHhzID0gaXB4X3NrKHMpOworCisJCWlmIChpcHhzLT5wb3J0ID09IHBvcnQgJiYKKwkJICAgICFtZW1jbXAoaXB4X25vZGUsIGlweHMtPm5vZGUsIElQWF9OT0RFX0xFTikpCisJCQlnb3RvIGZvdW5kOworCX0KKwlzID0gTlVMTDsKK2ZvdW5kOgorCXNwaW5fdW5sb2NrX2JoKCZpbnRyZmMtPmlmX3NrbGlzdF9sb2NrKTsKKwlpcHhpdGZfcHV0KGludHJmYyk7CisJcmV0dXJuIHM7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgX19pcHhpdGZfZG93bihzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjKQoreworCXN0cnVjdCBzb2NrICpzOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqdDsKKworCS8qIERlbGV0ZSBhbGwgcm91dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGludGVyZmFjZSAqLworCWlweHJ0cl9kZWxfcm91dGVzKGludHJmYyk7CisKKwlzcGluX2xvY2tfYmgoJmludHJmYy0+aWZfc2tsaXN0X2xvY2spOworCS8qIGVycm9yIHNvY2tldHMgKi8KKwlza19mb3JfZWFjaF9zYWZlKHMsIG5vZGUsIHQsICZpbnRyZmMtPmlmX3NrbGlzdCkgeworCQlzdHJ1Y3QgaXB4X3NvY2sgKmlweHMgPSBpcHhfc2socyk7CisKKwkJcy0+c2tfZXJyID0gRU5PTElOSzsKKwkJcy0+c2tfZXJyb3JfcmVwb3J0KHMpOworCQlpcHhzLT5pbnRyZmMgPSBOVUxMOworCQlpcHhzLT5wb3J0ICAgPSAwOworCQlzb2NrX3NldF9mbGFnKHMsIFNPQ0tfWkFQUEVEKTsgLyogSW5kaWNhdGVzIGl0IGlzIG5vIGxvbmdlciBib3VuZCAqLworCQlza19kZWxfbm9kZV9pbml0KHMpOworCX0KKwlJTklUX0hMSVNUX0hFQUQoJmludHJmYy0+aWZfc2tsaXN0KTsKKwlzcGluX3VubG9ja19iaCgmaW50cmZjLT5pZl9za2xpc3RfbG9jayk7CisKKwkvKiByZW1vdmUgdGhpcyBpbnRlcmZhY2UgZnJvbSBsaXN0ICovCisJbGlzdF9kZWwoJmludHJmYy0+bm9kZSk7CisKKwkvKiByZW1vdmUgdGhpcyBpbnRlcmZhY2UgZnJvbSAqc3BlY2lhbCogbmV0d29ya3MgKi8KKwlpZiAoaW50cmZjID09IGlweF9wcmltYXJ5X25ldCkKKwkJaXB4aXRmX2NsZWFyX3ByaW1hcnlfbmV0KCk7CisJaWYgKGludHJmYyA9PSBpcHhfaW50ZXJuYWxfbmV0KQorCQlpcHhfaW50ZXJuYWxfbmV0ID0gTlVMTDsKKworCWlmIChpbnRyZmMtPmlmX2RldikKKwkJZGV2X3B1dChpbnRyZmMtPmlmX2Rldik7CisJa2ZyZWUoaW50cmZjKTsKK30KKwordm9pZCBpcHhpdGZfZG93bihzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjKQoreworCXNwaW5fbG9ja19iaCgmaXB4X2ludGVyZmFjZXNfbG9jayk7CisJX19pcHhpdGZfZG93bihpbnRyZmMpOworCXNwaW5fdW5sb2NrX2JoKCZpcHhfaW50ZXJmYWNlc19sb2NrKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX2lweGl0Zl9wdXQoc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYykKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmaW50cmZjLT5yZWZjbnQpKQorCQlfX2lweGl0Zl9kb3duKGludHJmYyk7Cit9CisKK3N0YXRpYyBpbnQgaXB4aXRmX2RldmljZV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyLAorCQkJCXVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHRyOworCXN0cnVjdCBpcHhfaW50ZXJmYWNlICppLCAqdG1wOworCisJaWYgKGV2ZW50ICE9IE5FVERFVl9ET1dOICYmIGV2ZW50ICE9IE5FVERFVl9VUCkKKwkJZ290byBvdXQ7CisKKwlzcGluX2xvY2tfYmgoJmlweF9pbnRlcmZhY2VzX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpLCB0bXAsICZpcHhfaW50ZXJmYWNlcywgbm9kZSkKKwkJaWYgKGktPmlmX2RldiA9PSBkZXYpIHsKKwkJCWlmIChldmVudCA9PSBORVRERVZfVVApCisJCQkJaXB4aXRmX2hvbGQoaSk7CisJCQllbHNlCisJCQkJX19pcHhpdGZfcHV0KGkpOworCQl9CisJc3Bpbl91bmxvY2tfYmgoJmlweF9pbnRlcmZhY2VzX2xvY2spOworb3V0OgorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworCitzdGF0aWMgX19leGl0IHZvaWQgaXB4aXRmX2NsZWFudXAodm9pZCkKK3sKKwlzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaSwgKnRtcDsKKworCXNwaW5fbG9ja19iaCgmaXB4X2ludGVyZmFjZXNfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGksIHRtcCwgJmlweF9pbnRlcmZhY2VzLCBub2RlKSAKKwkJX19pcHhpdGZfcHV0KGkpOworCXNwaW5fdW5sb2NrX2JoKCZpcHhfaW50ZXJmYWNlc19sb2NrKTsKK30KKworc3RhdGljIHZvaWQgaXB4aXRmX2RlZl9za2JfaGFuZGxlcihzdHJ1Y3Qgc29jayAqc29jaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAoc29ja19xdWV1ZV9yY3Zfc2tiKHNvY2ssIHNrYikgPCAwKQorCQlrZnJlZV9za2Ioc2tiKTsKK30KKworLyoKKyAqIE9uIGlucHV0IHNrYi0+c2sgaXMgTlVMTC4gTm9ib2R5IGlzIGNoYXJnZWQgZm9yIHRoZSBtZW1vcnkuCisgKi8KKworLyogY2FsbGVyIG11c3QgaG9sZCBhIHJlZmVyZW5jZSB0byBpbnRyZmMgKi8KKworI2lmZGVmIENPTkZJR19JUFhfSU5URVJOCitzdGF0aWMgaW50IGlweGl0Zl9kZW11eF9zb2NrZXQoc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYywKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgY29weSkKK3sKKwlzdHJ1Y3QgaXB4aGRyICppcHggPSBpcHhfaGRyKHNrYik7CisJaW50IGlzX2Jyb2FkY2FzdCA9ICFtZW1jbXAoaXB4LT5pcHhfZGVzdC5ub2RlLCBpcHhfYnJvYWRjYXN0X25vZGUsCisJCQkJICAgSVBYX05PREVfTEVOKTsKKwlzdHJ1Y3Qgc29jayAqczsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2tfYmgoJmludHJmYy0+aWZfc2tsaXN0X2xvY2spOworCisJc2tfZm9yX2VhY2gocywgbm9kZSwgJmludHJmYy0+aWZfc2tsaXN0KSB7CisJCXN0cnVjdCBpcHhfc29jayAqaXB4cyA9IGlweF9zayhzKTsKKworCQlpZiAoaXB4cy0+cG9ydCA9PSBpcHgtPmlweF9kZXN0LnNvY2sgJiYKKwkJICAgIChpc19icm9hZGNhc3QgfHwgIW1lbWNtcChpcHgtPmlweF9kZXN0Lm5vZGUsCisJCQkJCSAgICAgaXB4cy0+bm9kZSwgSVBYX05PREVfTEVOKSkpIHsKKwkJCS8qIFdlIGZvdW5kIGEgc29ja2V0IHRvIHdoaWNoIHRvIHNlbmQgKi8KKwkJCXN0cnVjdCBza19idWZmICpza2IxOworCisJCQlpZiAoY29weSkgeworCQkJCXNrYjEgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJCQlyYyA9IC1FTk9NRU07CisJCQkJaWYgKCFza2IxKQorCQkJCQlnb3RvIG91dDsKKwkJCX0gZWxzZSB7CisJCQkJc2tiMSA9IHNrYjsKKwkJCQljb3B5ID0gMTsgLyogc2tiIG1heSBvbmx5IGJlIHVzZWQgb25jZSAqLworCQkJfQorCQkJaXB4aXRmX2RlZl9za2JfaGFuZGxlcihzLCBza2IxKTsKKworCQkJLyogT24gYW4gZXh0ZXJuYWwgaW50ZXJmYWNlLCBvbmUgc29ja2V0IGNhbiBsaXN0ZW4gKi8KKwkJCWlmIChpbnRyZmMgIT0gaXB4X2ludGVybmFsX25ldCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCS8qIHNrYiB3YXMgc29sZWx5IGZvciB1cywgYW5kIHdlIGRpZCBub3QgbWFrZSBhIGNvcHksIHNvIGZyZWUgaXQuICovCisJaWYgKCFjb3B5KQorCQlrZnJlZV9za2Ioc2tiKTsKKworCXJjID0gMDsKK291dDoKKwlzcGluX3VubG9ja19iaCgmaW50cmZjLT5pZl9za2xpc3RfbG9jayk7CisJcmV0dXJuIHJjOworfQorI2Vsc2UKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqbmNwX2Nvbm5lY3Rpb25faGFjayhzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjLAorCQkJCQlzdHJ1Y3QgaXB4aGRyICppcHgpCit7CisJLyogVGhlIHBhY2tldCdzIHRhcmdldCBpcyBhIE5DUCBjb25uZWN0aW9uIGhhbmRsZXIuIFdlIHdhbnQgdG8gaGFuZCBpdAorCSAqIHRvIHRoZSBjb3JyZWN0IHNvY2tldCBkaXJlY3RseSB3aXRoaW4gdGhlIGtlcm5lbCwgc28gdGhhdCB0aGUKKwkgKiBtYXJzX253ZSBwYWNrZXQgZGlzdHJpYnV0aW9uIHByb2Nlc3MgZG9lcyBub3QgaGF2ZSB0byBkbyBpdC4gSGVyZSB3ZQorCSAqIG9ubHkgY2FyZSBhYm91dCBOQ1AgYW5kIEJVUlNUIHBhY2tldHMuCisJICoKKwkgKiBZb3UgbWlnaHQgY2FsbCB0aGlzIGEgaGFjaywgYnV0IGJlbGlldmUgbWUsIHlvdSBkbyBub3Qgd2FudCBhCisJICogY29tcGxldGUgTkNQIGxheWVyIGluIHRoZSBrZXJuZWwsIGFuZCB0aGlzIGlzIFZFUlkgZmFzdCBhcyB3ZWxsLiAqLworCXN0cnVjdCBzb2NrICpzayA9IE5VTEw7CisgCWludCBjb25uZWN0aW9uID0gMDsKKwl1OCAqbmNwaGRyID0gKHU4ICopKGlweCArIDEpOworCisgCWlmICgqbmNwaGRyID09IDB4MjIgJiYgKihuY3BoZHIgKyAxKSA9PSAweDIyKSAvKiBOQ1AgcmVxdWVzdCAqLworCQljb25uZWN0aW9uID0gKCgoaW50KSAqKG5jcGhkciArIDUpKSA8PCA4KSB8IChpbnQpICoobmNwaGRyICsgMyk7CisJZWxzZSBpZiAoKm5jcGhkciA9PSAweDc3ICYmICoobmNwaGRyICsgMSkgPT0gMHg3NykgLyogQlVSU1QgcGFja2V0ICovCisJCWNvbm5lY3Rpb24gPSAoKChpbnQpICoobmNwaGRyICsgOSkpIDw8IDgpIHwgKGludCkgKihuY3BoZHIgKyA4KTsKKworCWlmIChjb25uZWN0aW9uKSB7CisJCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCQkvKiBOb3cgd2UgaGF2ZSB0byBsb29rIGZvciBhIHNwZWNpYWwgTkNQIGNvbm5lY3Rpb24gaGFuZGxpbmcKKwkJICogc29ja2V0LiBPbmx5IHRoZXNlIHNvY2tldHMgaGF2ZSBpcHhfbmNwX2Nvbm4gIT0gMCwgc2V0IGJ5CisJCSAqIFNJT0NJUFhOQ1BDT05OLiAqLworCQlzcGluX2xvY2tfYmgoJmludHJmYy0+aWZfc2tsaXN0X2xvY2spOworCQlza19mb3JfZWFjaChzaywgbm9kZSwgJmludHJmYy0+aWZfc2tsaXN0KQorCQkJaWYgKGlweF9zayhzayktPmlweF9uY3BfY29ubiA9PSBjb25uZWN0aW9uKSB7CisJCQkJc29ja19ob2xkKHNrKTsKKwkJCQlnb3RvIGZvdW5kOworCQkJfQorCQlzayA9IE5VTEw7CisJZm91bmQ6CisJCXNwaW5fdW5sb2NrX2JoKCZpbnRyZmMtPmlmX3NrbGlzdF9sb2NrKTsKKwl9CisJcmV0dXJuIHNrOworfQorCitzdGF0aWMgaW50IGlweGl0Zl9kZW11eF9zb2NrZXQoc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYywKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgY29weSkKK3sKKwlzdHJ1Y3QgaXB4aGRyICppcHggPSBpcHhfaGRyKHNrYik7CisJc3RydWN0IHNvY2sgKnNvY2sxID0gTlVMTCwgKnNvY2syID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMSA9IE5VTEwsICpza2IyID0gTlVMTDsKKwlpbnQgcmM7CisKKwlpZiAoaW50cmZjID09IGlweF9wcmltYXJ5X25ldCAmJiBudG9ocyhpcHgtPmlweF9kZXN0LnNvY2spID09IDB4NDUxKQorCQlzb2NrMSA9IG5jcF9jb25uZWN0aW9uX2hhY2soaW50cmZjLCBpcHgpOworICAgICAgICBpZiAoIXNvY2sxKQorCQkvKiBObyBzcGVjaWFsIHNvY2tldCBmb3VuZCwgZm9yd2FyZCB0aGUgcGFja2V0IHRoZSBub3JtYWwgd2F5ICovCisJCXNvY2sxID0gaXB4aXRmX2ZpbmRfc29ja2V0KGludHJmYywgaXB4LT5pcHhfZGVzdC5zb2NrKTsKKworCS8qCisJICogV2UgbmVlZCB0byBjaGVjayBpZiB0aGVyZSBpcyBhIHByaW1hcnkgbmV0IGFuZCBpZgorCSAqIHRoaXMgaXMgYWRkcmVzc2VkIHRvIG9uZSBvZiB0aGUgKlNQRUNJQUwqIHNvY2tldHMgYmVjYXVzZQorCSAqIHRoZXNlIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgcHJpbWFyeSBuZXQuCisJICogVGhlICpTUEVDSUFMKiBzb2NrZXQgbGlzdCBjb250YWluczogMHg0NTIoU0FQKSwgMHg0NTMoUklQKSBhbmQKKwkgKiAweDQ1NihEaWFnbm9zdGljKS4KKwkgKi8KKworCWlmIChpcHhfcHJpbWFyeV9uZXQgJiYgaW50cmZjICE9IGlweF9wcmltYXJ5X25ldCkgeworCQljb25zdCBpbnQgZHNvY2sgPSBudG9ocyhpcHgtPmlweF9kZXN0LnNvY2spOworCisJCWlmIChkc29jayA9PSAweDQ1MiB8fCBkc29jayA9PSAweDQ1MyB8fCBkc29jayA9PSAweDQ1NikKKwkJCS8qIFRoZSBhcHByb3ByaWF0ZSB0aGluZyB0byBkbyBoZXJlIGlzIHRvIGR1cCB0aGUKKwkJCSAqIHBhY2tldCBhbmQgcm91dGUgdG8gdGhlIHByaW1hcnkgbmV0IGludGVyZmFjZSB2aWEKKwkJCSAqIGlweGl0Zl9zZW5kOyBob3dldmVyLCB3ZSdsbCBjaGVhdCBhbmQganVzdCBkZW11eCBpdAorCQkJICogaGVyZS4gKi8KKwkJCXNvY2syID0gaXB4aXRmX2ZpbmRfc29ja2V0KGlweF9wcmltYXJ5X25ldCwKKwkJCQkJCQlpcHgtPmlweF9kZXN0LnNvY2spOworCX0KKworCS8qCisJICogSWYgdGhlcmUgaXMgbm90aGluZyB0byBkbyByZXR1cm4uIFRoZSBrZnJlZSB3aWxsIGNhbmNlbCBhbnkgY2hhcmdpbmcuCisJICovCisJcmMgPSAwOworCWlmICghc29jazEgJiYgIXNvY2syKSB7CisJCWlmICghY29weSkKKwkJCWtmcmVlX3NrYihza2IpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFRoaXMgbmV4dCBzZWdtZW50IG9mIGNvZGUgaXMgYSBsaXR0bGUgYXdrd2FyZCwgYnV0IGl0IHNldHMgaXQgdXAKKwkgKiBzbyB0aGF0IHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgY29waWVzIG9mIHRoZSBTS0IgYXJlIG1hZGUgYW5kCisJICogdGhhdCBza2IxIGFuZCBza2IyIHBvaW50IHRvIGl0ICh0aGVtKSBzbyB0aGF0IGl0ICh0aGV5KSBjYW4gYmUKKwkgKiBkZW11eGVkIHRvIHNvY2sxIGFuZC9vciBzb2NrMi4gIElmIHdlIGFyZSB1bmFibGUgdG8gbWFrZSBlbm91Z2gKKwkgKiBjb3BpZXMsIHdlIGRvIGFzIG11Y2ggYXMgaXMgcG9zc2libGUuCisJICovCisKKwlpZiAoY29weSkKKwkJc2tiMSA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCWVsc2UKKwkJc2tiMSA9IHNrYjsKKworCXJjID0gLUVOT01FTTsKKwlpZiAoIXNrYjEpCisJCWdvdG8gb3V0X3B1dDsKKworCS8qIERvIHdlIG5lZWQgMiBTS0JzPyAqLworCWlmIChzb2NrMSAmJiBzb2NrMikKKwkJc2tiMiA9IHNrYl9jbG9uZShza2IxLCBHRlBfQVRPTUlDKTsKKwllbHNlCisJCXNrYjIgPSBza2IxOworCisJaWYgKHNvY2sxKQorCQlpcHhpdGZfZGVmX3NrYl9oYW5kbGVyKHNvY2sxLCBza2IxKTsKKworCWlmICghc2tiMikKKwkJZ290byBvdXRfcHV0OworCisJaWYgKHNvY2syKQorCQlpcHhpdGZfZGVmX3NrYl9oYW5kbGVyKHNvY2syLCBza2IyKTsKKworCXJjID0gMDsKK291dF9wdXQ6CisJaWYgKHNvY2sxKQorCQlzb2NrX3B1dChzb2NrMSk7CisJaWYgKHNvY2syKQorCQlzb2NrX3B1dChzb2NrMik7CitvdXQ6CisJcmV0dXJuIHJjOworfQorI2VuZGlmCS8qIENPTkZJR19JUFhfSU5URVJOICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaXB4aXRmX2FkanVzdF9za2J1ZmYoc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYywKKwkJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjI7CisJaW50IGluX29mZnNldCA9ICh1bnNpZ25lZCBjaGFyICopaXB4X2hkcihza2IpIC0gc2tiLT5oZWFkOworCWludCBvdXRfb2Zmc2V0ID0gaW50cmZjLT5pZl9pcHhfb2Zmc2V0OworCWludCBsZW47CisKKwkvKiBIb3BlZnVsbHksIG1vc3QgY2FzZXMgKi8KKwlpZiAoaW5fb2Zmc2V0ID49IG91dF9vZmZzZXQpCisJCXJldHVybiBza2I7CisKKwkvKiBOZWVkIG5ldyBTS0IgKi8KKwlsZW4gID0gc2tiLT5sZW4gKyBvdXRfb2Zmc2V0OworCXNrYjIgPSBhbGxvY19za2IobGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAoc2tiMikgeworCQlza2JfcmVzZXJ2ZShza2IyLCBvdXRfb2Zmc2V0KTsKKwkJc2tiMi0+bmgucmF3ID0gc2tiMi0+aC5yYXcgPSBza2JfcHV0KHNrYjIsIHNrYi0+bGVuKTsKKwkJbWVtY3B5KGlweF9oZHIoc2tiMiksIGlweF9oZHIoc2tiKSwgc2tiLT5sZW4pOworCQltZW1jcHkoc2tiMi0+Y2IsIHNrYi0+Y2IsIHNpemVvZihza2ItPmNiKSk7CisJfQorCWtmcmVlX3NrYihza2IpOworCXJldHVybiBza2IyOworfQorCisvKiBjYWxsZXIgbXVzdCBob2xkIGEgcmVmZXJlbmNlIHRvIGludHJmYyBhbmQgdGhlIHNrYiBoYXMgdG8gYmUgdW5zaGFyZWQgKi8KK2ludCBpcHhpdGZfc2VuZChzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjaGFyICpub2RlKQoreworCXN0cnVjdCBpcHhoZHIgKmlweCA9IGlweF9oZHIoc2tiKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaW50cmZjLT5pZl9kZXY7CisJc3RydWN0IGRhdGFsaW5rX3Byb3RvICpkbCA9IGludHJmYy0+aWZfZGxpbms7CisJY2hhciBkZXN0X25vZGVbSVBYX05PREVfTEVOXTsKKwlpbnQgc2VuZF90b193aXJlID0gMTsKKwlpbnQgYWRkcl9sZW47CisKKwlpcHgtPmlweF90Y3RybCA9IElQWF9TS0JfQ0Ioc2tiKS0+aXB4X3RjdHJsOworCWlweC0+aXB4X2Rlc3QubmV0ID0gSVBYX1NLQl9DQihza2IpLT5pcHhfZGVzdF9uZXQ7CisJaXB4LT5pcHhfc291cmNlLm5ldCA9IElQWF9TS0JfQ0Ioc2tiKS0+aXB4X3NvdXJjZV9uZXQ7CisKKwkvKiBzZWUgaWYgd2UgbmVlZCB0byBpbmNsdWRlIHRoZSBuZXRudW0gaW4gdGhlIHJvdXRlIGxpc3QgKi8KKwlpZiAoSVBYX1NLQl9DQihza2IpLT5sYXN0X2hvcC5pbmRleCA+PSAwKSB7CisJCXUzMiAqbGFzdF9ob3AgPSAodTMyICopKCgodTggKikgc2tiLT5kYXRhKSArCisJCQkJc2l6ZW9mKHN0cnVjdCBpcHhoZHIpICsKKwkJCQlJUFhfU0tCX0NCKHNrYiktPmxhc3RfaG9wLmluZGV4ICoKKwkJCQlzaXplb2YodTMyKSk7CisJCSpsYXN0X2hvcCA9IElQWF9TS0JfQ0Ioc2tiKS0+bGFzdF9ob3AubmV0bnVtOworCQlJUFhfU0tCX0NCKHNrYiktPmxhc3RfaG9wLmluZGV4ID0gLTE7CisJfQorCQorCS8qIAorCSAqIFdlIG5lZWQgdG8ga25vdyBob3cgbWFueSBza2J1ZmZzIGl0IHdpbGwgdGFrZSB0byBzZW5kIG91dCB0aGlzCisJICogcGFja2V0IHRvIGF2b2lkIHVubmVjZXNzYXJ5IGNvcGllcy4KKwkgKi8KKwkgCisJaWYgKCFkbCB8fCAhZGV2IHx8IGRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spIAorCQlzZW5kX3RvX3dpcmUgPSAwOwkvKiBObyBub24gbG9vcGVkICovCisKKwkvKgorCSAqIFNlZSBpZiB0aGlzIHNob3VsZCBiZSBkZW11eGVkIHRvIHNvY2tldHMgb24gdGhpcyBpbnRlcmZhY2UgCisJICoKKwkgKiBXZSB3YW50IHRvIGVuc3VyZSB0aGUgb3JpZ2luYWwgd2FzIGVhdGVuIG9yIHRoYXQgd2Ugb25seSB1c2UKKwkgKiB1cCBjbG9uZXMuCisJICovCisJIAorCWlmIChpcHgtPmlweF9kZXN0Lm5ldCA9PSBpbnRyZmMtPmlmX25ldG51bSkgeworCQkvKgorCQkgKiBUbyBvdXIgb3duIG5vZGUsIGxvb3AgYW5kIGZyZWUgdGhlIG9yaWdpbmFsLgorCQkgKiBUaGUgaW50ZXJuYWwgbmV0IHdpbGwgcmVjZWl2ZSBvbiBhbGwgbm9kZSBhZGRyZXNzLgorCQkgKi8KKwkJaWYgKGludHJmYyA9PSBpcHhfaW50ZXJuYWxfbmV0IHx8CisJCSAgICAhbWVtY21wKGludHJmYy0+aWZfbm9kZSwgbm9kZSwgSVBYX05PREVfTEVOKSkgeworCQkJLyogRG9uJ3QgY2hhcmdlIHNlbmRlciAqLworCQkJc2tiX29ycGhhbihza2IpOworCisJCQkvKiBXaWxsIGNoYXJnZSByZWNlaXZlciAqLworCQkJcmV0dXJuIGlweGl0Zl9kZW11eF9zb2NrZXQoaW50cmZjLCBza2IsIDApOworCQl9CisKKwkJLyogQnJvYWRjYXN0LCBsb29wIGFuZCBwb3NzaWJseSBrZWVwIHRvIHNlbmQgb24uICovCisJCWlmICghbWVtY21wKGlweF9icm9hZGNhc3Rfbm9kZSwgbm9kZSwgSVBYX05PREVfTEVOKSkgeworCQkJaWYgKCFzZW5kX3RvX3dpcmUpCisJCQkJc2tiX29ycGhhbihza2IpOworCQkJaXB4aXRmX2RlbXV4X3NvY2tldChpbnRyZmMsIHNrYiwgc2VuZF90b193aXJlKTsKKwkJCWlmICghc2VuZF90b193aXJlKQorCQkJCWdvdG8gb3V0OworCQl9CisJfQorCisJLyoKKwkgKiBJZiB0aGUgb3JpZ2luYXRpbmcgbmV0IGlzIG5vdCBlcXVhbCB0byBvdXIgbmV0OyB0aGlzIGlzIHJvdXRlZAorCSAqIFdlIGFyZSBzdGlsbCBjaGFyZ2luZyB0aGUgc2VuZGVyLiBXaGljaCBpcyByaWdodCAtIHRoZSBkcml2ZXIKKwkgKiBmcmVlIHdpbGwgaGFuZGxlIHRoaXMgZmFpcmx5LgorCSAqLworCWlmIChpcHgtPmlweF9zb3VyY2UubmV0ICE9IGludHJmYy0+aWZfbmV0bnVtKSB7CisJCS8qCisJCSAqIFVuc2hhcmUgdGhlIGJ1ZmZlciBiZWZvcmUgbW9kaWZ5aW5nIHRoZSBjb3VudCBpbgorCQkgKiBjYXNlIGl0J3MgYSBmbG9vZCBvciB0Y3BkdW1wCisJCSAqLworCQlza2IgPSBza2JfdW5zaGFyZShza2IsIEdGUF9BVE9NSUMpOworCQlpZiAoIXNrYikKKwkJCWdvdG8gb3V0OworCQlpZiAoKytpcHgtPmlweF90Y3RybCA+IGlweGNmZ19tYXhfaG9wcykKKwkJCXNlbmRfdG9fd2lyZSA9IDA7CisJfQorCisJaWYgKCFzZW5kX3RvX3dpcmUpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWdvdG8gb3V0OworCX0KKworCS8qIERldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgaGFyZHdhcmUgYWRkcmVzcyAqLworCWFkZHJfbGVuID0gZGV2LT5hZGRyX2xlbjsKKwlpZiAoIW1lbWNtcChpcHhfYnJvYWRjYXN0X25vZGUsIG5vZGUsIElQWF9OT0RFX0xFTikpCisJCW1lbWNweShkZXN0X25vZGUsIGRldi0+YnJvYWRjYXN0LCBhZGRyX2xlbik7CisJZWxzZQorCQltZW1jcHkoZGVzdF9ub2RlLCAmKG5vZGVbSVBYX05PREVfTEVOLWFkZHJfbGVuXSksIGFkZHJfbGVuKTsKKworCS8qIE1ha2UgYW55IGNvbXBlbnNhdGlvbiBmb3IgZGlmZmVyaW5nIHBoeXNpY2FsL2RhdGEgbGluayBzaXplICovCisJc2tiID0gaXB4aXRmX2FkanVzdF9za2J1ZmYoaW50cmZjLCBza2IpOworCWlmICghc2tiKQorCQlnb3RvIG91dDsKKworCS8qIHNldCB1cCBkYXRhIGxpbmsgYW5kIHBoeXNpY2FsIGhlYWRlcnMgKi8KKwlza2ItPmRldgk9IGRldjsKKwlza2ItPnByb3RvY29sCT0gaHRvbnMoRVRIX1BfSVBYKTsKKworCS8qIFNlbmQgaXQgb3V0ICovCisJZGwtPnJlcXVlc3QoZGwsIHNrYiwgZGVzdF9ub2RlKTsKK291dDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHhpdGZfYWRkX2xvY2FsX3JvdXRlKHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMpCit7CisJcmV0dXJuIGlweHJ0cl9hZGRfcm91dGUoaW50cmZjLT5pZl9uZXRudW0sIGludHJmYywgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGlweGl0Zl9kaXNjb3Zlcl9uZXRudW0oc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYywKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXB4aXRmX3Bwcm9wKHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMsIHN0cnVjdCBza19idWZmICpza2IpOworCitzdGF0aWMgaW50IGlweGl0Zl9yY3Yoc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXB4aGRyICppcHggPSBpcHhfaGRyKHNrYik7CisJaW50IHJjID0gMDsKKworCWlweGl0Zl9ob2xkKGludHJmYyk7CisKKwkvKiBTZWUgaWYgd2Ugc2hvdWxkIHVwZGF0ZSBvdXIgbmV0d29yayBudW1iZXIgKi8KKwlpZiAoIWludHJmYy0+aWZfbmV0bnVtKSAvKiBuZXQgbnVtYmVyIG9mIGludHJmYyBub3Qga25vd24geWV0ICovCisgCQlpcHhpdGZfZGlzY292ZXJfbmV0bnVtKGludHJmYywgc2tiKTsKKwkKKwlJUFhfU0tCX0NCKHNrYiktPmxhc3RfaG9wLmluZGV4ID0gLTE7CisJaWYgKGlweC0+aXB4X3R5cGUgPT0gSVBYX1RZUEVfUFBST1ApIHsKKwkJcmMgPSBpcHhpdGZfcHByb3AoaW50cmZjLCBza2IpOworCQlpZiAocmMpCisJCQlnb3RvIG91dF9mcmVlX3NrYjsKKwl9CisKKwkvKiBsb2NhbCBwcm9jZXNzaW5nIGZvbGxvd3MgKi8KKwlpZiAoIUlQWF9TS0JfQ0Ioc2tiKS0+aXB4X2Rlc3RfbmV0KQorCQlJUFhfU0tCX0NCKHNrYiktPmlweF9kZXN0X25ldCA9IGludHJmYy0+aWZfbmV0bnVtOworCWlmICghSVBYX1NLQl9DQihza2IpLT5pcHhfc291cmNlX25ldCkKKwkJSVBYX1NLQl9DQihza2IpLT5pcHhfc291cmNlX25ldCA9IGludHJmYy0+aWZfbmV0bnVtOworCisJLyogaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIHJvdXRlIGEgcHByb3AgcGFja2V0LCB0aGVyZSdzIG5vIG1lYW5pbmcKKwkgKiBpbiB0aGUgaXB4X2Rlc3RfbmV0IGZvciBzdWNoIHBhY2tldHMgKi8KKwlpZiAoaXB4LT5pcHhfdHlwZSAhPSBJUFhfVFlQRV9QUFJPUCAmJgorCSAgICBpbnRyZmMtPmlmX25ldG51bSAhPSBJUFhfU0tCX0NCKHNrYiktPmlweF9kZXN0X25ldCkgeworCQkvKiBXZSBvbmx5IHJvdXRlIHBvaW50LXRvLXBvaW50IHBhY2tldHMuICovCisJCWlmIChza2ItPnBrdF90eXBlID09IFBBQ0tFVF9IT1NUKSB7CisJCQlza2IgPSBza2JfdW5zaGFyZShza2IsIEdGUF9BVE9NSUMpOworCQkJaWYgKHNrYikKKwkJCQlyYyA9IGlweHJ0cl9yb3V0ZV9za2Ioc2tiKTsKKwkJCWdvdG8gb3V0X2ludHJmYzsKKwkJfQorCisJCWdvdG8gb3V0X2ZyZWVfc2tiOworCX0KKworCS8qIHNlZSBpZiB3ZSBzaG91bGQga2VlcCBpdCAqLworCWlmICghbWVtY21wKGlweF9icm9hZGNhc3Rfbm9kZSwgaXB4LT5pcHhfZGVzdC5ub2RlLCBJUFhfTk9ERV9MRU4pIHx8CisJICAgICFtZW1jbXAoaW50cmZjLT5pZl9ub2RlLCBpcHgtPmlweF9kZXN0Lm5vZGUsIElQWF9OT0RFX0xFTikpIHsKKwkJcmMgPSBpcHhpdGZfZGVtdXhfc29ja2V0KGludHJmYywgc2tiLCAwKTsKKwkJZ290byBvdXRfaW50cmZjOworCX0KKworCS8qIHdlIGNvdWxkbid0IHBhd24gaXQgb2ZmIHNvIHVubG9hZCBpdCAqLworb3V0X2ZyZWVfc2tiOgorCWtmcmVlX3NrYihza2IpOworb3V0X2ludHJmYzoKKwlpcHhpdGZfcHV0KGludHJmYyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBpcHhpdGZfZGlzY292ZXJfbmV0bnVtKHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMsCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sgCisJY29uc3Qgc3RydWN0IGlweF9jYiAqY2IgPSBJUFhfU0tCX0NCKHNrYik7CisKKwkvKiBzZWUgaWYgdGhpcyBpcyBhbiBpbnRyYSBwYWNrZXQ6IHNvdXJjZV9uZXQgPT0gZGVzdF9uZXQgKi8KKwlpZiAoY2ItPmlweF9zb3VyY2VfbmV0ID09IGNiLT5pcHhfZGVzdF9uZXQgJiYgY2ItPmlweF9zb3VyY2VfbmV0KSB7CisJCXN0cnVjdCBpcHhfaW50ZXJmYWNlICppID0KKwkJCQlpcHhpdGZfZmluZF91c2luZ19uZXQoY2ItPmlweF9zb3VyY2VfbmV0KTsKKwkJLyogTkI6IE5ldFdhcmUgc2VydmVycyBsaWUgYWJvdXQgdGhlaXIgaG9wIGNvdW50IHNvIHdlCisJCSAqIGRyb3BwZWQgdGhlIHRlc3QgYmFzZWQgb24gaXQuIFRoaXMgaXMgdGhlIGJlc3Qgd2F5CisJCSAqIHRvIGRldGVybWluZSB0aGlzIGlzIGEgMCBob3AgY291bnQgcGFja2V0LiAqLworCQlpZiAoIWkpIHsKKwkJCWludHJmYy0+aWZfbmV0bnVtID0gY2ItPmlweF9zb3VyY2VfbmV0OworCQkJaXB4aXRmX2FkZF9sb2NhbF9yb3V0ZShpbnRyZmMpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSVBYOiBOZXR3b3JrIG51bWJlciBjb2xsaXNpb24gIgorCQkJCSIlbHhcbiAgICAgICAgJXMgJXMgYW5kICVzICVzXG4iLAorCQkJCSh1bnNpZ25lZCBsb25nKSBodG9ubChjYi0+aXB4X3NvdXJjZV9uZXQpLAorCQkJCWlweF9kZXZpY2VfbmFtZShpKSwKKwkJCQlpcHhfZnJhbWVfbmFtZShpLT5pZl9kbGlua190eXBlKSwKKwkJCQlpcHhfZGV2aWNlX25hbWUoaW50cmZjKSwKKwkJCQlpcHhfZnJhbWVfbmFtZShpbnRyZmMtPmlmX2RsaW5rX3R5cGUpKTsKKwkJCWlweGl0Zl9wdXQoaSk7CisJCX0KKwl9Cit9CisKKy8qKgorICogaXB4aXRmX3Bwcm9wIC0gUHJvY2VzcyBwYWNrZXQgcHJvcGFnYXRpb24gSVBYIHBhY2tldCB0eXBlIDB4MTQsIHVzZWQgZm9yCisgKiAJCSAgTmV0QklPUyBicm9hZGNhc3RzCisgKiBAaW50cmZjOiBJUFggaW50ZXJmYWNlIHJlY2VpdmluZyB0aGlzIHBhY2tldAorICogQHNrYjogUmVjZWl2ZWQgcGFja2V0CisgKgorICogQ2hlY2tzIGlmIHBhY2tldCBpcyB2YWxpZDogaWYgaXRzIG1vcmUgdGhhbiAlSVBYX01BWF9QUFJPUF9IT1BTIGhvcHMgb3IgaWYgaXQKKyAqIGlzIHNtYWxsZXIgdGhhbiBhIElQWCBoZWFkZXIgKyB0aGUgcm9vbSBmb3IgJUlQWF9NQVhfUFBST1BfSE9QUyBob3BzIHdlIGRyb3AKKyAqIGl0LCBub3QgZXZlbiBwcm9jZXNzaW5nIGl0IGxvY2FsbHksIGlmIGl0IGhhcyBleGFjdCAlSVBYX01BWF9QUFJPUF9IT1BTIHdlCisgKiBkb24ndCBicm9hZGNhc3QgaXQsIGJ1dCBwcm9jZXNzIGl0IGxvY2FsbHkuIFNlZSBjaGFwdGVyIDUgb2YgTm92ZWxsJ3MgIklQWAorICogUklQIGFuZCBTQVAgUm91dGVyIFNwZWNpZmljYXRpb24iLCBQYXJ0IE51bWJlciAxMDctMDAwMDI5LTAwMS4KKyAqIAorICogSWYgaXQgaXMgdmFsaWQsIGNoZWNrIGlmIHdlIGhhdmUgcHByb3AgYnJvYWRjYXN0aW5nIGVuYWJsZWQgYnkgdGhlIHVzZXIsCisgKiBpZiBub3QsIGp1c3QgcmV0dXJuIHplcm8gZm9yIGxvY2FsIHByb2Nlc3NpbmcuCisgKgorICogSWYgaXQgaXMgZW5hYmxlZCBjaGVjayB0aGUgcGFja2V0IGFuZCBkb24ndCBicm9hZGNhc3QgaXQgaWYgd2UgaGF2ZSBhbHJlYWR5CisgKiBzZWVuIHRoaXMgcGFja2V0LgorICoKKyAqIEJyb2FkY2FzdDogc2VuZCBpdCB0byB0aGUgaW50ZXJmYWNlcyB0aGF0IGFyZW4ndCBvbiB0aGUgcGFja2V0IHZpc2l0ZWQgbmV0cworICogYXJyYXksIGp1c3QgYWZ0ZXIgdGhlIElQWCBoZWFkZXIuCisgKgorICogUmV0dXJucyAtRUlOVkFMIGZvciBpbnZhbGlkIHBhY2tldHMsIHNvIHRoYXQgdGhlIGNhbGxpbmcgZnVuY3Rpb24gZHJvcHMKKyAqIHRoZSBwYWNrZXQgd2l0aG91dCBsb2NhbCBwcm9jZXNzaW5nLiAwIGlmIHBhY2tldCBpcyB0byBiZSBsb2NhbGx5IHByb2Nlc3NlZC4KKyAqLworc3RhdGljIGludCBpcHhpdGZfcHByb3Aoc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXB4aGRyICppcHggPSBpcHhfaGRyKHNrYik7CisJaW50IGksIHJjID0gLUVJTlZBTDsKKwlzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaWZjczsKKwljaGFyICpjOworCXUzMiAqbDsKKworCS8qIElsbGVnYWwgcGFja2V0IC0gdG9vIG1hbnkgaG9wcyBvciB0b28gc2hvcnQgKi8KKwkvKiBXZSBkZWNpZGUgdG8gdGhyb3cgaXQgYXdheTogbm8gYnJvYWRjYXN0aW5nLCBubyBsb2NhbCBwcm9jZXNzaW5nLgorCSAqIE5ldEJJT1MgdW5hd2FyZSBpbXBsZW1lbnRhdGlvbnMgcm91dGUgdGhlbSBhcyBub3JtYWwgcGFja2V0cyAtCisJICogdGN0cmwgPD0gMTUsIGFueSBkYXRhIHBheWxvYWQuLi4gKi8KKwlpZiAoSVBYX1NLQl9DQihza2IpLT5pcHhfdGN0cmwgPiBJUFhfTUFYX1BQUk9QX0hPUFMgfHwKKwkgICAgbnRvaHMoaXB4LT5pcHhfcGt0c2l6ZSkgPCBzaXplb2Yoc3RydWN0IGlweGhkcikgKworCSAgICAJCQkJSVBYX01BWF9QUFJPUF9IT1BTICogc2l6ZW9mKHUzMikpCisJCWdvdG8gb3V0OworCS8qIGFyZSB3ZSBicm9hZGNhc3RpbmcgdGhpcyBkYW1uIHRoaW5nPyAqLworCXJjID0gMDsKKwlpZiAoIXN5c2N0bF9pcHhfcHByb3BfYnJvYWRjYXN0aW5nKQorCQlnb3RvIG91dDsKKwkvKiBXZSBkbyBicm9hZGNhc3QgcGFja2V0IG9uIHRoZSBJUFhfTUFYX1BQUk9QX0hPUFMgaG9wLCBidXQgd2UKKwkgKiBwcm9jZXNzIGl0IGxvY2FsbHkuIEFsbCBwcmV2aW91cyBob3BzIGJyb2FkY2FzdGVkIGl0LCBhbmQgcHJvY2VzcyBpdAorCSAqIGxvY2FsbHkuICovCisJaWYgKElQWF9TS0JfQ0Ioc2tiKS0+aXB4X3RjdHJsID09IElQWF9NQVhfUFBST1BfSE9QUykKKwkJZ290byBvdXQ7CisJCisJYyA9ICgodTggKikgaXB4KSArIHNpemVvZihzdHJ1Y3QgaXB4aGRyKTsKKwlsID0gKHUzMiAqKSBjOworCisJLyogRG9uJ3QgYnJvYWRjYXN0IHBhY2tldCBpZiBhbHJlYWR5IHNlZW4gdGhpcyBuZXQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgSVBYX1NLQl9DQihza2IpLT5pcHhfdGN0cmw7IGkrKykKKwkJaWYgKCpsKysgPT0gaW50cmZjLT5pZl9uZXRudW0pCisJCQlnb3RvIG91dDsKKworCS8qIDwgSVBYX01BWF9QUFJPUF9IT1BTIGhvcHMgJiYgaW5wdXQgaW50ZXJmYWNlIG5vdCBpbiBsaXN0LiBTYXZlIHRoZQorCSAqIHBvc2l0aW9uIHdoZXJlIHdlIHdpbGwgaW5zZXJ0IHJlY3ZkIG5ldG51bSBpbnRvIGxpc3QsIGxhdGVyIG9uLAorCSAqIGluIGlweGl0Zl9zZW5kICovCisJSVBYX1NLQl9DQihza2IpLT5sYXN0X2hvcC5pbmRleCA9IGk7CisJSVBYX1NLQl9DQihza2IpLT5sYXN0X2hvcC5uZXRudW0gPSBpbnRyZmMtPmlmX25ldG51bTsKKwkvKiB4bWl0IG9uIGFsbCBvdGhlciBpbnRlcmZhY2VzLi4uICovCisJc3Bpbl9sb2NrX2JoKCZpcHhfaW50ZXJmYWNlc19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlmY3MsICZpcHhfaW50ZXJmYWNlcywgbm9kZSkgeworCQkvKiBFeGNlcHQgdW5jb25maWd1cmVkIGludGVyZmFjZXMgKi8KKwkJaWYgKCFpZmNzLT5pZl9uZXRudW0pCisJCQljb250aW51ZTsKKwkJCQkJCisJCS8qIFRoYXQgYXJlbid0IGluIHRoZSBsaXN0ICovCisJCWlmIChpZmNzID09IGludHJmYykKKwkJCWNvbnRpbnVlOworCQlsID0gKF9fdTMyICopIGM7CisJCS8qIGRvbid0IGNvbnNpZGVyIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBwYWNrZXQgbGlzdCwKKwkJICogaXQgaXMgb3VyIG5ldG51bSwgYW5kIGl0IGlzIG5vdCB0aGVyZSB5ZXQgKi8KKwkJZm9yIChpID0gMDsgaSA8IElQWF9TS0JfQ0Ioc2tiKS0+aXB4X3RjdHJsOyBpKyspCisJCQlpZiAoaWZjcy0+aWZfbmV0bnVtID09ICpsKyspCisJCQkJYnJlYWs7CisJCWlmIChpID09IElQWF9TS0JfQ0Ioc2tiKS0+aXB4X3RjdHJsKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqcyA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CisKKwkJCWlmIChzKSB7CisJCQkJSVBYX1NLQl9DQihzKS0+aXB4X2Rlc3RfbmV0ID0gaWZjcy0+aWZfbmV0bnVtOworCQkJCWlweHJ0cl9yb3V0ZV9za2Iocyk7CisJCQl9CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJmlweF9pbnRlcmZhY2VzX2xvY2spOworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgaXB4aXRmX2luc2VydChzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjKQoreworCXNwaW5fbG9ja19iaCgmaXB4X2ludGVyZmFjZXNfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmaW50cmZjLT5ub2RlLCAmaXB4X2ludGVyZmFjZXMpOworCXNwaW5fdW5sb2NrX2JoKCZpcHhfaW50ZXJmYWNlc19sb2NrKTsKKworCWlmIChpcHhjZmdfYXV0b19zZWxlY3RfcHJpbWFyeSAmJiAhaXB4X3ByaW1hcnlfbmV0KQorCQlpcHhfcHJpbWFyeV9uZXQgPSBpbnRyZmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaXB4aXRmX2FsbG9jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTMyIG5ldG51bSwKKwkJCQkJICB1bnNpZ25lZCBzaG9ydCBkbGlua190eXBlLAorCQkJCQkgIHN0cnVjdCBkYXRhbGlua19wcm90byAqZGxpbmssCisJCQkJCSAgdW5zaWduZWQgY2hhciBpbnRlcm5hbCwKKwkJCQkJICBpbnQgaXB4X29mZnNldCkKK3sKKwlzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjID0ga21hbGxvYyhzaXplb2YoKmludHJmYyksIEdGUF9BVE9NSUMpOworCisJaWYgKGludHJmYykgeworCQlpbnRyZmMtPmlmX2RldgkJPSBkZXY7CisJCWludHJmYy0+aWZfbmV0bnVtCT0gbmV0bnVtOworCQlpbnRyZmMtPmlmX2RsaW5rX3R5cGUgCT0gZGxpbmtfdHlwZTsKKwkJaW50cmZjLT5pZl9kbGluayAJPSBkbGluazsKKwkJaW50cmZjLT5pZl9pbnRlcm5hbCAJPSBpbnRlcm5hbDsKKwkJaW50cmZjLT5pZl9pcHhfb2Zmc2V0IAk9IGlweF9vZmZzZXQ7CisJCWludHJmYy0+aWZfc2tudW0gCT0gSVBYX01JTl9FUEhFTUVSQUxfU09DS0VUOworCQlJTklUX0hMSVNUX0hFQUQoJmludHJmYy0+aWZfc2tsaXN0KTsKKwkJYXRvbWljX3NldCgmaW50cmZjLT5yZWZjbnQsIDEpOworCQlzcGluX2xvY2tfaW5pdCgmaW50cmZjLT5pZl9za2xpc3RfbG9jayk7CisJfQorCisJcmV0dXJuIGludHJmYzsKK30KKworc3RhdGljIGludCBpcHhpdGZfY3JlYXRlX2ludGVybmFsKHN0cnVjdCBpcHhfaW50ZXJmYWNlX2RlZmluaXRpb24gKmlkZWYpCit7CisJc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYzsKKwlpbnQgcmMgPSAtRUVYSVNUOworCisJLyogT25seSBvbmUgcHJpbWFyeSBuZXR3b3JrIGFsbG93ZWQgKi8KKwlpZiAoaXB4X3ByaW1hcnlfbmV0KQorCQlnb3RvIG91dDsKKworCS8qIE11c3QgaGF2ZSBhIHZhbGlkIG5ldHdvcmsgbnVtYmVyICovCisJcmMgPSAtRUFERFJOT1RBVkFJTDsKKwlpZiAoIWlkZWYtPmlweF9uZXR3b3JrKQorCQlnb3RvIG91dDsKKwlpbnRyZmMgPSBpcHhpdGZfZmluZF91c2luZ19uZXQoaWRlZi0+aXB4X25ldHdvcmspOworCXJjID0gLUVBRERSSU5VU0U7CisJaWYgKGludHJmYykgeworCQlpcHhpdGZfcHV0KGludHJmYyk7CisJCWdvdG8gb3V0OworCX0KKwlpbnRyZmMgPSBpcHhpdGZfYWxsb2MoTlVMTCwgaWRlZi0+aXB4X25ldHdvcmssIDAsIE5VTEwsIDEsIDApOworCXJjID0gLUVBR0FJTjsKKwlpZiAoIWludHJmYykKKwkJZ290byBvdXQ7CisJbWVtY3B5KChjaGFyICopJihpbnRyZmMtPmlmX25vZGUpLCBpZGVmLT5pcHhfbm9kZSwgSVBYX05PREVfTEVOKTsKKwlpcHhfaW50ZXJuYWxfbmV0ID0gaXB4X3ByaW1hcnlfbmV0ID0gaW50cmZjOworCWlweGl0Zl9ob2xkKGludHJmYyk7CisJaXB4aXRmX2luc2VydChpbnRyZmMpOworCisJcmMgPSBpcHhpdGZfYWRkX2xvY2FsX3JvdXRlKGludHJmYyk7CisJaXB4aXRmX3B1dChpbnRyZmMpOworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBpcHhfbWFwX2ZyYW1lX3R5cGUodW5zaWduZWQgY2hhciB0eXBlKQoreworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElQWF9GUkFNRV9FVEhFUklJOglyYyA9IGh0b25zKEVUSF9QX0lQWCk7CQlicmVhazsKKwljYXNlIElQWF9GUkFNRV84MDIyOglyYyA9IGh0b25zKEVUSF9QXzgwMl8yKTsJYnJlYWs7CisJY2FzZSBJUFhfRlJBTUVfU05BUDoJcmMgPSBodG9ucyhFVEhfUF9TTkFQKTsJCWJyZWFrOworCWNhc2UgSVBYX0ZSQU1FXzgwMjM6CXJjID0gaHRvbnMoRVRIX1BfODAyXzMpOwlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgaXB4aXRmX2NyZWF0ZShzdHJ1Y3QgaXB4X2ludGVyZmFjZV9kZWZpbml0aW9uICppZGVmKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdW5zaWduZWQgc2hvcnQgZGxpbmtfdHlwZSA9IDA7CisJc3RydWN0IGRhdGFsaW5rX3Byb3RvICpkYXRhbGluayA9IE5VTEw7CisJc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYzsKKwlpbnQgcmM7CisKKwlpZiAoaWRlZi0+aXB4X3NwZWNpYWwgPT0gSVBYX0lOVEVSTkFMKSB7CisJCXJjID0gaXB4aXRmX2NyZWF0ZV9pbnRlcm5hbChpZGVmKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmMgPSAtRUVYSVNUOworCWlmIChpZGVmLT5pcHhfc3BlY2lhbCA9PSBJUFhfUFJJTUFSWSAmJiBpcHhfcHJpbWFyeV9uZXQpCisJCWdvdG8gb3V0OworCisJaW50cmZjID0gaXB4aXRmX2ZpbmRfdXNpbmdfbmV0KGlkZWYtPmlweF9uZXR3b3JrKTsKKwlyYyA9IC1FQUREUklOVVNFOworCWlmIChpZGVmLT5pcHhfbmV0d29yayAmJiBpbnRyZmMpIHsKKwkJaXB4aXRmX3B1dChpbnRyZmMpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoaW50cmZjKQorCQlpcHhpdGZfcHV0KGludHJmYyk7CisKKwlkZXYgPSBkZXZfZ2V0X2J5X25hbWUoaWRlZi0+aXB4X2RldmljZSk7CisJcmMgPSAtRU5PREVWOworCWlmICghZGV2KQorCQlnb3RvIG91dDsKKworCXN3aXRjaCAoaWRlZi0+aXB4X2RsaW5rX3R5cGUpIHsKKwljYXNlIElQWF9GUkFNRV9UUl84MDIyOgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJJUFggZnJhbWUgdHlwZSA4MDIuMlRSIGlzICIKKwkJCSJvYnNvbGV0ZSBVc2UgODAyLjIgaW5zdGVhZC5cbiIpOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIElQWF9GUkFNRV84MDIyOgorCQlkbGlua190eXBlIAk9IGh0b25zKEVUSF9QXzgwMl8yKTsKKwkJZGF0YWxpbmsgCT0gcDgwMjJfZGF0YWxpbms7CisJCWJyZWFrOworCWNhc2UgSVBYX0ZSQU1FX0VUSEVSSUk6CisJCWlmIChkZXYtPnR5cGUgIT0gQVJQSFJEX0lFRUU4MDIpIHsKKwkJCWRsaW5rX3R5cGUgCT0gaHRvbnMoRVRIX1BfSVBYKTsKKwkJCWRhdGFsaW5rIAk9IHBFSUlfZGF0YWxpbms7CisJCQlicmVhazsKKwkJfSBlbHNlIAorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSVBYIGZyYW1lIHR5cGUgRXRoZXJJSSBvdmVyICIKKwkJCQkJInRva2VuLXJpbmcgaXMgb2Jzb2xldGUuIFVzZSBTTkFQICIKKwkJCQkJImluc3RlYWQuXG4iKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBJUFhfRlJBTUVfU05BUDoKKwkJZGxpbmtfdHlwZSAJPSBodG9ucyhFVEhfUF9TTkFQKTsKKwkJZGF0YWxpbmsgCT0gcFNOQVBfZGF0YWxpbms7CisJCWJyZWFrOworCWNhc2UgSVBYX0ZSQU1FXzgwMjM6CisJCWRsaW5rX3R5cGUgCT0gaHRvbnMoRVRIX1BfODAyXzMpOworCQlkYXRhbGluayAJPSBwODAyM19kYXRhbGluazsKKwkJYnJlYWs7CisJY2FzZSBJUFhfRlJBTUVfTk9ORToKKwlkZWZhdWx0OgorCQlyYyA9IC1FUFJPVE9OT1NVUFBPUlQ7CisJCWdvdG8gb3V0X2RldjsKKwl9CisKKwlyYyA9IC1FTkVURE9XTjsKKwlpZiAoIShkZXYtPmZsYWdzICYgSUZGX1VQKSkKKwkJZ290byBvdXRfZGV2OworCisJLyogQ2hlY2sgYWRkcmVzc2VzIGFyZSBzdWl0YWJsZSAqLworCXJjID0gLUVJTlZBTDsKKwlpZiAoZGV2LT5hZGRyX2xlbiA+IElQWF9OT0RFX0xFTikKKwkJZ290byBvdXRfZGV2OworCisJaW50cmZjID0gaXB4aXRmX2ZpbmRfdXNpbmdfcGh5cyhkZXYsIGRsaW5rX3R5cGUpOworCWlmICghaW50cmZjKSB7CisJCS8qIE9rIG5vdyBjcmVhdGUgKi8KKwkJaW50cmZjID0gaXB4aXRmX2FsbG9jKGRldiwgaWRlZi0+aXB4X25ldHdvcmssIGRsaW5rX3R5cGUsCisJCQkJICAgICAgZGF0YWxpbmssIDAsIGRldi0+aGFyZF9oZWFkZXJfbGVuICsKKwkJCQkJZGF0YWxpbmstPmhlYWRlcl9sZW5ndGgpOworCQlyYyA9IC1FQUdBSU47CisJCWlmICghaW50cmZjKQorCQkJZ290byBvdXRfZGV2OworCQkvKiBTZXR1cCBwcmltYXJ5IGlmIG5lY2Vzc2FyeSAqLworCQlpZiAoaWRlZi0+aXB4X3NwZWNpYWwgPT0gSVBYX1BSSU1BUlkpCisJCQlpcHhfcHJpbWFyeV9uZXQgPSBpbnRyZmM7CisJCWlmICghbWVtY21wKGlkZWYtPmlweF9ub2RlLCAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIiwKKwkJCSAgICBJUFhfTk9ERV9MRU4pKSB7CisJCQltZW1zZXQoaW50cmZjLT5pZl9ub2RlLCAwLCBJUFhfTk9ERV9MRU4pOworCQkJbWVtY3B5KGludHJmYy0+aWZfbm9kZSArIElQWF9OT0RFX0xFTiAtIGRldi0+YWRkcl9sZW4sCisJCQkJZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbik7CisJCX0gZWxzZQorCQkJbWVtY3B5KGludHJmYy0+aWZfbm9kZSwgaWRlZi0+aXB4X25vZGUsIElQWF9OT0RFX0xFTik7CisJCWlweGl0Zl9ob2xkKGludHJmYyk7CisJCWlweGl0Zl9pbnNlcnQoaW50cmZjKTsKKwl9CisKKworCS8qIElmIHRoZSBuZXR3b3JrIG51bWJlciBpcyBrbm93biwgYWRkIGEgcm91dGUgKi8KKwlyYyA9IDA7CisJaWYgKCFpbnRyZmMtPmlmX25ldG51bSkKKwkJZ290byBvdXRfaW50cmZjOworCisJcmMgPSBpcHhpdGZfYWRkX2xvY2FsX3JvdXRlKGludHJmYyk7CitvdXRfaW50cmZjOgorCWlweGl0Zl9wdXQoaW50cmZjKTsKKwlnb3RvIG91dDsKK291dF9kZXY6CisJZGV2X3B1dChkZXYpOworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBpcHhpdGZfZGVsZXRlKHN0cnVjdCBpcHhfaW50ZXJmYWNlX2RlZmluaXRpb24gKmlkZWYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJdW5zaWduZWQgc2hvcnQgZGxpbmtfdHlwZSA9IDA7CisJc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYzsKKwlpbnQgcmMgPSAwOworCisJc3Bpbl9sb2NrX2JoKCZpcHhfaW50ZXJmYWNlc19sb2NrKTsKKwlpZiAoaWRlZi0+aXB4X3NwZWNpYWwgPT0gSVBYX0lOVEVSTkFMKSB7CisJCWlmIChpcHhfaW50ZXJuYWxfbmV0KSB7CisJCQlfX2lweGl0Zl9wdXQoaXB4X2ludGVybmFsX25ldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlyYyA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0OworCX0KKworCWRsaW5rX3R5cGUgPSBpcHhfbWFwX2ZyYW1lX3R5cGUoaWRlZi0+aXB4X2RsaW5rX3R5cGUpOworCXJjID0gLUVQUk9UT05PU1VQUE9SVDsKKwlpZiAoIWRsaW5rX3R5cGUpCisJCWdvdG8gb3V0OworCisJZGV2ID0gX19kZXZfZ2V0X2J5X25hbWUoaWRlZi0+aXB4X2RldmljZSk7CisJcmMgPSAtRU5PREVWOworCWlmICghZGV2KQorCQlnb3RvIG91dDsKKworCWludHJmYyA9IF9faXB4aXRmX2ZpbmRfdXNpbmdfcGh5cyhkZXYsIGRsaW5rX3R5cGUpOworCXJjID0gLUVJTlZBTDsKKwlpZiAoIWludHJmYykKKwkJZ290byBvdXQ7CisJX19pcHhpdGZfcHV0KGludHJmYyk7CisKKwlyYyA9IDA7CitvdXQ6CisJc3Bpbl91bmxvY2tfYmgoJmlweF9pbnRlcmZhY2VzX2xvY2spOworCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBpcHhfaW50ZXJmYWNlICppcHhpdGZfYXV0b19jcmVhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCXVuc2lnbmVkIHNob3J0IGRsaW5rX3R5cGUpCit7CisJc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYyA9IE5VTEw7CisJc3RydWN0IGRhdGFsaW5rX3Byb3RvICpkYXRhbGluazsKKworCWlmICghZGV2KQorCQlnb3RvIG91dDsKKworCS8qIENoZWNrIGFkZHJlc3NlcyBhcmUgc3VpdGFibGUgKi8KKwlpZiAoZGV2LT5hZGRyX2xlbiA+IElQWF9OT0RFX0xFTikKKwkJZ290byBvdXQ7CisKKwlzd2l0Y2ggKGh0b25zKGRsaW5rX3R5cGUpKSB7CisJY2FzZSBFVEhfUF9JUFg6CQlkYXRhbGluayA9IHBFSUlfZGF0YWxpbms7CWJyZWFrOworCWNhc2UgRVRIX1BfODAyXzI6CWRhdGFsaW5rID0gcDgwMjJfZGF0YWxpbms7CWJyZWFrOworCWNhc2UgRVRIX1BfU05BUDoJZGF0YWxpbmsgPSBwU05BUF9kYXRhbGluazsJYnJlYWs7CisJY2FzZSBFVEhfUF84MDJfMzoJZGF0YWxpbmsgPSBwODAyM19kYXRhbGluazsJYnJlYWs7CisJZGVmYXVsdDoJCWdvdG8gb3V0OworCX0KKworCWludHJmYyA9IGlweGl0Zl9hbGxvYyhkZXYsIDAsIGRsaW5rX3R5cGUsIGRhdGFsaW5rLCAwLAorCQkJCWRldi0+aGFyZF9oZWFkZXJfbGVuICsgZGF0YWxpbmstPmhlYWRlcl9sZW5ndGgpOworCisJaWYgKGludHJmYykgeworCQltZW1zZXQoaW50cmZjLT5pZl9ub2RlLCAwLCBJUFhfTk9ERV9MRU4pOworCQltZW1jcHkoKGNoYXIgKikmKGludHJmYy0+aWZfbm9kZVtJUFhfTk9ERV9MRU4tZGV2LT5hZGRyX2xlbl0pLAorCQkJZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbik7CisJCXNwaW5fbG9ja19pbml0KCZpbnRyZmMtPmlmX3NrbGlzdF9sb2NrKTsKKwkJYXRvbWljX3NldCgmaW50cmZjLT5yZWZjbnQsIDEpOworCQlpcHhpdGZfaW5zZXJ0KGludHJmYyk7CisJCWRldl9ob2xkKGRldik7CisJfQorCitvdXQ6CisJcmV0dXJuIGludHJmYzsKK30KKworc3RhdGljIGludCBpcHhpdGZfaW9jdGwodW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlpbnQgcmMgPSAtRUlOVkFMOworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IHZhbDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DU0lGQUREUjogeworCQlzdHJ1Y3Qgc29ja2FkZHJfaXB4ICpzaXB4OworCQlzdHJ1Y3QgaXB4X2ludGVyZmFjZV9kZWZpbml0aW9uIGY7CisKKwkJcmMgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmlmciwgYXJnLCBzaXplb2YoaWZyKSkpCisJCQlicmVhazsKKwkJc2lweCA9IChzdHJ1Y3Qgc29ja2FkZHJfaXB4ICopJmlmci5pZnJfYWRkcjsKKwkJcmMgPSAtRUlOVkFMOworCQlpZiAoc2lweC0+c2lweF9mYW1pbHkgIT0gQUZfSVBYKQorCQkJYnJlYWs7CisJCWYuaXB4X25ldHdvcmsgPSBzaXB4LT5zaXB4X25ldHdvcms7CisJCW1lbWNweShmLmlweF9kZXZpY2UsIGlmci5pZnJfbmFtZSwKKwkJCXNpemVvZihmLmlweF9kZXZpY2UpKTsKKwkJbWVtY3B5KGYuaXB4X25vZGUsIHNpcHgtPnNpcHhfbm9kZSwgSVBYX05PREVfTEVOKTsKKwkJZi5pcHhfZGxpbmtfdHlwZSA9IHNpcHgtPnNpcHhfdHlwZTsKKwkJZi5pcHhfc3BlY2lhbCA9IHNpcHgtPnNpcHhfc3BlY2lhbDsKKworCQlpZiAoc2lweC0+c2lweF9hY3Rpb24gPT0gSVBYX0RMVElURikKKwkJCXJjID0gaXB4aXRmX2RlbGV0ZSgmZik7CisJCWVsc2UKKwkJCXJjID0gaXB4aXRmX2NyZWF0ZSgmZik7CisJCWJyZWFrOworCX0KKwljYXNlIFNJT0NHSUZBRERSOiB7CisJCXN0cnVjdCBzb2NrYWRkcl9pcHggKnNpcHg7CisJCXN0cnVjdCBpcHhfaW50ZXJmYWNlICppcHhpZjsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCQlyYyA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmaWZyLCBhcmcsIHNpemVvZihpZnIpKSkKKwkJCWJyZWFrOworCQlzaXB4ID0gKHN0cnVjdCBzb2NrYWRkcl9pcHggKikmaWZyLmlmcl9hZGRyOworCQlkZXYgID0gX19kZXZfZ2V0X2J5X25hbWUoaWZyLmlmcl9uYW1lKTsKKwkJcmMgICA9IC1FTk9ERVY7CisJCWlmICghZGV2KQorCQkJYnJlYWs7CisJCWlweGlmID0gaXB4aXRmX2ZpbmRfdXNpbmdfcGh5cyhkZXYsCisJCQkJCSAgIGlweF9tYXBfZnJhbWVfdHlwZShzaXB4LT5zaXB4X3R5cGUpKTsKKwkJcmMgPSAtRUFERFJOT1RBVkFJTDsKKwkJaWYgKCFpcHhpZikKKwkJCWJyZWFrOworCisJCXNpcHgtPnNpcHhfZmFtaWx5CT0gQUZfSVBYOworCQlzaXB4LT5zaXB4X25ldHdvcmsJPSBpcHhpZi0+aWZfbmV0bnVtOworCQltZW1jcHkoc2lweC0+c2lweF9ub2RlLCBpcHhpZi0+aWZfbm9kZSwKKwkJCXNpemVvZihzaXB4LT5zaXB4X25vZGUpKTsKKwkJcmMgPSAtRUZBVUxUOworCQlpZiAoY29weV90b191c2VyKGFyZywgJmlmciwgc2l6ZW9mKGlmcikpKQorCQkJYnJlYWs7CisJCWlweGl0Zl9wdXQoaXB4aWYpOworCQlyYyA9IDA7CisJCWJyZWFrOworCX0KKwljYXNlIFNJT0NBSVBYSVRGQ1JUOiAKKwkJcmMgPSAtRUZBVUxUOworCQlpZiAoZ2V0X3VzZXIodmFsLCAodW5zaWduZWQgY2hhciBfX3VzZXIgKikgYXJnKSkKKwkJCWJyZWFrOworCQlyYyA9IDA7CisJCWlweGNmZ19hdXRvX2NyZWF0ZV9pbnRlcmZhY2VzID0gdmFsOworCQlicmVhazsKKwljYXNlIFNJT0NBSVBYUFJJU0xUOiAKKwkJcmMgPSAtRUZBVUxUOworCQlpZiAoZ2V0X3VzZXIodmFsLCAodW5zaWduZWQgY2hhciBfX3VzZXIgKikgYXJnKSkKKwkJCWJyZWFrOworCQlyYyA9IDA7CisJCWlweGNmZ19zZXRfYXV0b19zZWxlY3QodmFsKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKgorICoJQ2hlY2tzdW0gcm91dGluZSBmb3IgSVBYCisgKi8KKyAKKy8qIE5vdGU6IFdlIGFzc3VtZSBpcHhfdGN0cmw9PTAgYW5kIGh0b25zKGxlbmd0aCk9PWlweF9wa3RzaXplICovCisvKiBUaGlzIGZ1bmN0aW9ucyBzaG91bGQgKm5vdCogbWVzcyB3aXRoIHBhY2tldCBjb250ZW50cyAqLworCitfX3UxNiBpcHhfY2tzdW0oc3RydWN0IGlweGhkciAqcGFja2V0LCBpbnQgbGVuZ3RoKSAKK3sKKwkvKiAKKwkgKglOT1RFOiBzdW0gaXMgYSBuZXQgYnl0ZSBvcmRlciBxdWFudGl0eSwgd2hpY2ggb3B0aW1pemVzIHRoZSAKKwkgKglsb29wLiBUaGlzIG9ubHkgd29ya3Mgb24gYmlnIGFuZCBsaXR0bGUgZW5kaWFuIG1hY2hpbmVzLiAoSQorCSAqCWRvbid0IGtub3cgb2YgYSBtYWNoaW5lIHRoYXQgaXNuJ3QuKQorCSAqLworCS8qIHN0YXJ0IGF0IGlweF9kZXN0IC0gV2Ugc2tpcCB0aGUgY2hlY2tzdW0gZmllbGQgYW5kIHN0YXJ0IHdpdGgKKwkgKiBpcHhfdHlwZSBiZWZvcmUgdGhlIGxvb3AsIG5vdCBjb25zaWRlcmluZyBpcHhfdGN0cmwgaW4gdGhlIGNhbGMgKi8KKwlfX3UxNiAqcCA9IChfX3UxNiAqKSZwYWNrZXQtPmlweF9kZXN0OworCV9fdTMyIGkgPSAobGVuZ3RoID4+IDEpIC0gMTsgLyogTnVtYmVyIG9mIGNvbXBsZXRlIHdvcmRzICovCisJX191MzIgc3VtID0gcGFja2V0LT5pcHhfdHlwZSA8PCBzaXplb2YocGFja2V0LT5pcHhfdGN0cmwpOyAKKworCS8qIExvb3AgdGhyb3VnaCBhbGwgY29tcGxldGUgd29yZHMgZXhjZXB0IHRoZSBjaGVja3N1bSBmaWVsZCwKKwkgKiBpcHhfdHlwZSAoYWNjb3VudGVkIGFib3ZlKSBhbmQgaXB4X3RjdHJsIChub3QgdXNlZCBpbiB0aGUgY2tzdW0pICovCisJd2hpbGUgKC0taSkKKwkJc3VtICs9ICpwKys7CisKKwkvKiBBZGQgb24gdGhlIGxhc3QgcGFydCB3b3JkIGlmIGl0IGV4aXN0cyAqLworCWlmIChwYWNrZXQtPmlweF9wa3RzaXplICYgaHRvbnMoMSkpCisJCXN1bSArPSBudG9ocygweGZmMDApICYgKnA7CisKKwkvKiBEbyBmaW5hbCBmaXh1cCAqLworCXN1bSA9IChzdW0gJiAweGZmZmYpICsgKHN1bSA+PiAxNik7CisKKwkvKiBJdCdzIGEgcGl0eSB0aGVyZSdzIG5vIGNvbmNlcHQgb2YgY2FycnkgaW4gQyAqLworCWlmIChzdW0gPj0gMHgxMDAwMCkKKwkJc3VtKys7CisKKwlyZXR1cm4gfnN1bTsKK30KKworY29uc3QgY2hhciAqaXB4X2ZyYW1lX25hbWUodW5zaWduZWQgc2hvcnQgZnJhbWUpCit7CisJY2hhciogcmMgPSAiTm9uZSI7CisKKwlzd2l0Y2ggKG50b2hzKGZyYW1lKSkgeworCWNhc2UgRVRIX1BfSVBYOgkJcmMgPSAiRXRoZXJJSSI7CWJyZWFrOworCWNhc2UgRVRIX1BfODAyXzI6CXJjID0gIjgwMi4yIjsJYnJlYWs7CisJY2FzZSBFVEhfUF9TTkFQOglyYyA9ICJTTkFQIjsJYnJlYWs7CisJY2FzZSBFVEhfUF84MDJfMzoJcmMgPSAiODAyLjMiOwlicmVhazsKKwljYXNlIEVUSF9QX1RSXzgwMl8yOglyYyA9ICI4MDIuMlRSIjsJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCitjb25zdCBjaGFyICppcHhfZGV2aWNlX25hbWUoc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYykKK3sKKwlyZXR1cm4gaW50cmZjLT5pZl9pbnRlcm5hbCA/ICJJbnRlcm5hbCIgOgorCQlpbnRyZmMtPmlmX2RldiA/IGludHJmYy0+aWZfZGV2LT5uYW1lIDogIlVua25vd24iOworfQorCisvKiBIYW5kbGluZyBmb3Igc3lzdGVtIGNhbGxzIGFwcGxpZWQgdmlhIHRoZSB2YXJpb3VzIGludGVyZmFjZXMgdG8gYW4gSVBYCisgKiBzb2NrZXQgb2JqZWN0LiAqLworCitzdGF0aWMgaW50IGlweF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJaW50IG9wdDsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJaWYgKG9wdGxlbiAhPSBzaXplb2YoaW50KSkKKwkJZ290byBvdXQ7CisKKwlyYyA9IC1FRkFVTFQ7CisJaWYgKGdldF91c2VyKG9wdCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilvcHR2YWwpKQorCQlnb3RvIG91dDsKKworCXJjID0gLUVOT1BST1RPT1BUOworCWlmICghKGxldmVsID09IFNPTF9JUFggJiYgb3B0bmFtZSA9PSBJUFhfVFlQRSkpCisJCWdvdG8gb3V0OworCisJaXB4X3NrKHNrKS0+dHlwZSA9IG9wdDsKKwlyYyA9IDA7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGlweF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCB2YWwgPSAwOworCWludCBsZW47CisJaW50IHJjID0gLUVOT1BST1RPT1BUOworCisJaWYgKCEobGV2ZWwgPT0gU09MX0lQWCAmJiBvcHRuYW1lID09IElQWF9UWVBFKSkKKwkJZ290byBvdXQ7CisKKwl2YWwgPSBpcHhfc2soc2spLT50eXBlOworCisJcmMgPSAtRUZBVUxUOworCWlmIChnZXRfdXNlcihsZW4sIG9wdGxlbikpCisJCWdvdG8gb3V0OworCisJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sIHNpemVvZihpbnQpKTsKKwlyYyA9IC1FSU5WQUw7CisJaWYobGVuIDwgMCkKKwkJZ290byBvdXQ7CisJCQorCXJjID0gLUVGQVVMVDsKKwlpZiAocHV0X3VzZXIobGVuLCBvcHRsZW4pIHx8IGNvcHlfdG9fdXNlcihvcHR2YWwsICZ2YWwsIGxlbikpCisJCWdvdG8gb3V0OworCisJcmMgPSAwOworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBwcm90byBpcHhfcHJvdG8gPSB7CisJLm5hbWUJICA9ICJJUFgiLAorCS5vd25lcgkgID0gVEhJU19NT0RVTEUsCisJLm9ial9zaXplID0gc2l6ZW9mKHN0cnVjdCBpcHhfc29jayksCit9OworCitzdGF0aWMgaW50IGlweF9jcmVhdGUoc3RydWN0IHNvY2tldCAqc29jaywgaW50IHByb3RvY29sKQoreworCWludCByYyA9IC1FU09DS1ROT1NVUFBPUlQ7CisJc3RydWN0IHNvY2sgKnNrOworCisJLyoKKwkgKiBTUFggc3VwcG9ydCBpcyBub3QgYW55bW9yZSBpbiB0aGUga2VybmVsIHNvdXJjZXMuIElmIHlvdSB3YW50IHRvCisJICogcmVzc3VycmVjdCBpdCwgY29tcGxldGluZyBpdCBhbmQgbWFraW5nIGl0IHVuZGVyc3RhbmQgc2hhcmVkIHNrYnMsCisJICogYmUgZnVsbHkgbXVsdGl0aHJlYWRlZCwgZXRjLCBncmFiIHRoZSBzb3VyY2VzIGluIGFuIGVhcmx5IDIuNSBrZXJuZWwKKwkgKiB0cmVlLgorCSAqLworCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfREdSQU0pCisJCWdvdG8gb3V0OworCisgICAgICAgCXJjID0gLUVOT01FTTsKKwlzayA9IHNrX2FsbG9jKFBGX0lQWCwgR0ZQX0tFUk5FTCwgJmlweF9wcm90bywgMSk7CisJaWYgKCFzaykKKwkJZ290byBvdXQ7CisjaWZkZWYgSVBYX1JFRkNOVF9ERUJVRworICAgICAgICBhdG9taWNfaW5jKCZpcHhfc29ja19ucik7CisgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJJUFggc29ja2V0ICVwIGNyZWF0ZWQsIG5vdyB3ZSBoYXZlICVkIGFsaXZlXG4iLCBzaywKKwkJCWF0b21pY19yZWFkKCZpcHhfc29ja19ucikpOworI2VuZGlmCisJc29ja19pbml0X2RhdGEoc29jaywgc2spOworCXNrLT5za19ub19jaGVjayA9IDE7CQkvKiBDaGVja3N1bSBvZmYgYnkgZGVmYXVsdCAqLworCXNvY2stPm9wcyA9ICZpcHhfZGdyYW1fb3BzOworCXJjID0gMDsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgaXB4X3JlbGVhc2Uoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKworCWlmICghc2spCisJCWdvdG8gb3V0OworCisJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCisJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCisJc29ja19zZXRfZmxhZyhzaywgU09DS19ERUFEKTsKKwlzb2NrLT5zayA9IE5VTEw7CisJaXB4X2Rlc3Ryb3lfc29ja2V0KHNrKTsKK291dDoKKwlyZXR1cm4gMDsKK30KKworLyogY2FsbGVyIG11c3QgaG9sZCBhIHJlZmVyZW5jZSB0byBpbnRyZmMgKi8KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGlweF9maXJzdF9mcmVlX3NvY2tldG51bShzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjKQoreworCXVuc2lnbmVkIHNob3J0IHNvY2tldE51bSA9IGludHJmYy0+aWZfc2tudW07CisKKwlzcGluX2xvY2tfYmgoJmludHJmYy0+aWZfc2tsaXN0X2xvY2spOworCisJaWYgKHNvY2tldE51bSA8IElQWF9NSU5fRVBIRU1FUkFMX1NPQ0tFVCkKKwkJc29ja2V0TnVtID0gSVBYX01JTl9FUEhFTUVSQUxfU09DS0VUOworCisJd2hpbGUgKF9faXB4aXRmX2ZpbmRfc29ja2V0KGludHJmYywgbnRvaHMoc29ja2V0TnVtKSkpCisJCWlmIChzb2NrZXROdW0gPiBJUFhfTUFYX0VQSEVNRVJBTF9TT0NLRVQpCisJCQlzb2NrZXROdW0gPSBJUFhfTUlOX0VQSEVNRVJBTF9TT0NLRVQ7CisJCWVsc2UKKwkJCXNvY2tldE51bSsrOworCisJc3Bpbl91bmxvY2tfYmgoJmludHJmYy0+aWZfc2tsaXN0X2xvY2spOworCWludHJmYy0+aWZfc2tudW0gPSBzb2NrZXROdW07CisKKwlyZXR1cm4gbnRvaHMoc29ja2V0TnVtKTsKK30KKworc3RhdGljIGludCBpcHhfYmluZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLCBpbnQgYWRkcl9sZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGlweF9zb2NrICppcHhzID0gaXB4X3NrKHNrKTsKKwlzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjOworCXN0cnVjdCBzb2NrYWRkcl9pcHggKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2lweCAqKXVhZGRyOworCWludCByYyA9IC1FSU5WQUw7CisKKwlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19aQVBQRUQpIHx8IGFkZHJfbGVuICE9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaXB4KSkKKwkJZ290byBvdXQ7CisKKwlpbnRyZmMgPSBpcHhpdGZfZmluZF91c2luZ19uZXQoYWRkci0+c2lweF9uZXR3b3JrKTsKKwlyYyA9IC1FQUREUk5PVEFWQUlMOworCWlmICghaW50cmZjKQorCQlnb3RvIG91dDsKKworCWlmICghYWRkci0+c2lweF9wb3J0KSB7CisJCWFkZHItPnNpcHhfcG9ydCA9IGlweF9maXJzdF9mcmVlX3NvY2tldG51bShpbnRyZmMpOworCQlyYyA9IC1FSU5WQUw7CisJCWlmICghYWRkci0+c2lweF9wb3J0KQorCQkJZ290byBvdXRfcHV0OworCX0KKworCS8qIHByb3RlY3QgSVBYIHN5c3RlbSBzdHVmZiBsaWtlIHJvdXRpbmcvc2FwICovCisJcmMgPSAtRUFDQ0VTOworCWlmIChudG9ocyhhZGRyLT5zaXB4X3BvcnQpIDwgSVBYX01JTl9FUEhFTUVSQUxfU09DS0VUICYmCisJICAgICFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlnb3RvIG91dF9wdXQ7CisKKwlpcHhzLT5wb3J0ID0gYWRkci0+c2lweF9wb3J0OworCisjaWZkZWYgQ09ORklHX0lQWF9JTlRFUk4KKwlpZiAoaW50cmZjID09IGlweF9pbnRlcm5hbF9uZXQpIHsKKwkJLyogVGhlIHNvdXJjZSBhZGRyZXNzIGlzIHRvIGJlIHNldCBleHBsaWNpdGx5IGlmIHRoZQorCQkgKiBzb2NrZXQgaXMgdG8gYmUgYm91bmQgb24gdGhlIGludGVybmFsIG5ldHdvcmsuIElmIGEKKwkJICogbm9kZSBudW1iZXIgMCB3YXMgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBpcyB1c2VkLgorCQkgKi8KKworCQlyYyA9IC1FSU5WQUw7CisJCWlmICghbWVtY21wKGFkZHItPnNpcHhfbm9kZSwgaXB4X2Jyb2FkY2FzdF9ub2RlLCBJUFhfTk9ERV9MRU4pKQorCQkJZ290byBvdXRfcHV0OworCQlpZiAoIW1lbWNtcChhZGRyLT5zaXB4X25vZGUsIGlweF90aGlzX25vZGUsIElQWF9OT0RFX0xFTikpCisJCQltZW1jcHkoaXB4cy0+bm9kZSwgaW50cmZjLT5pZl9ub2RlLCBJUFhfTk9ERV9MRU4pOworCQllbHNlCisJCQltZW1jcHkoaXB4cy0+bm9kZSwgYWRkci0+c2lweF9ub2RlLCBJUFhfTk9ERV9MRU4pOworCisJCXJjID0gLUVBRERSSU5VU0U7CisJCWlmIChpcHhpdGZfZmluZF9pbnRlcm5hbF9zb2NrZXQoaW50cmZjLCBpcHhzLT5ub2RlLAorCQkJCQkJaXB4cy0+cG9ydCkpIHsKKwkJCVNPQ0tfREVCVUcoc2ssCisJCQkJIklQWDogYmluZCBmYWlsZWQgYmVjYXVzZSBwb3J0ICVYIGluIHVzZS5cbiIsCisJCQkJbnRvaHMoKGludClhZGRyLT5zaXB4X3BvcnQpKTsKKwkJCWdvdG8gb3V0X3B1dDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFNvdXJjZSBhZGRyZXNzZXMgYXJlIGVhc3kuIEl0IG11c3QgYmUgb3VyCisJCSAqIG5ldHdvcms6bm9kZSBwYWlyIGZvciBhbiBpbnRlcmZhY2Ugcm91dGVkIHRvIElQWAorCQkgKiB3aXRoIHRoZSBpcHggcm91dGluZyBpb2N0bCgpCisJCSAqLworCisJCW1lbWNweShpcHhzLT5ub2RlLCBpbnRyZmMtPmlmX25vZGUsIElQWF9OT0RFX0xFTik7CisKKwkJcmMgPSAtRUFERFJJTlVTRTsKKwkJaWYgKGlweGl0Zl9maW5kX3NvY2tldChpbnRyZmMsIGFkZHItPnNpcHhfcG9ydCkpIHsKKwkJCVNPQ0tfREVCVUcoc2ssCisJCQkJIklQWDogYmluZCBmYWlsZWQgYmVjYXVzZSBwb3J0ICVYIGluIHVzZS5cbiIsCisJCQkJbnRvaHMoKGludClhZGRyLT5zaXB4X3BvcnQpKTsKKwkJCWdvdG8gb3V0X3B1dDsKKwkJfQorCX0KKworI2Vsc2UJLyogIWRlZiBDT05GSUdfSVBYX0lOVEVSTiAqLworCisJLyogU291cmNlIGFkZHJlc3NlcyBhcmUgZWFzeS4gSXQgbXVzdCBiZSBvdXIgbmV0d29yazpub2RlIHBhaXIgZm9yCisJICAgYW4gaW50ZXJmYWNlIHJvdXRlZCB0byBJUFggd2l0aCB0aGUgaXB4IHJvdXRpbmcgaW9jdGwoKSAqLworCisJcmMgPSAtRUFERFJJTlVTRTsKKwlpZiAoaXB4aXRmX2ZpbmRfc29ja2V0KGludHJmYywgYWRkci0+c2lweF9wb3J0KSkgeworCQlTT0NLX0RFQlVHKHNrLCAiSVBYOiBiaW5kIGZhaWxlZCBiZWNhdXNlIHBvcnQgJVggaW4gdXNlLlxuIiwKKwkJCQludG9ocygoaW50KWFkZHItPnNpcHhfcG9ydCkpOworCQlnb3RvIG91dF9wdXQ7CisJfQorCisjZW5kaWYJLyogQ09ORklHX0lQWF9JTlRFUk4gKi8KKworCWlweGl0Zl9pbnNlcnRfc29ja2V0KGludHJmYywgc2spOworCXNvY2tfcmVzZXRfZmxhZyhzaywgU09DS19aQVBQRUQpOworCisJcmMgPSAwOworb3V0X3B1dDoKKwlpcHhpdGZfcHV0KGludHJmYyk7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGlweF9jb25uZWN0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsCisJaW50IGFkZHJfbGVuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGlweF9zb2NrICppcHhzID0gaXB4X3NrKHNrKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaXB4ICphZGRyOworCWludCByYyA9IC1FSU5WQUw7CisJc3RydWN0IGlweF9yb3V0ZSAqcnQ7CisKKwlzay0+c2tfc3RhdGUJPSBUQ1BfQ0xPU0U7CisJc29jay0+c3RhdGUgCT0gU1NfVU5DT05ORUNURUQ7CisKKwlpZiAoYWRkcl9sZW4gIT0gc2l6ZW9mKCphZGRyKSkKKwkJZ290byBvdXQ7CisJYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaXB4ICopdWFkZHI7CisKKwkvKiBwdXQgdGhlIGF1dG9iaW5kaW5nIGluICovCisJaWYgKCFpcHhzLT5wb3J0KSB7CisJCXN0cnVjdCBzb2NrYWRkcl9pcHggdWFkZHI7CisKKwkJdWFkZHIuc2lweF9wb3J0CQk9IDA7CisJCXVhZGRyLnNpcHhfbmV0d29yayAJPSAwOworCisjaWZkZWYgQ09ORklHX0lQWF9JTlRFUk4KKwkJcmMgPSAtRU5FVERPV047CisJCWlmICghaXB4cy0+aW50cmZjKQorCQkJZ290byBvdXQ7IC8qIFNvbWVvbmUgem9ua2VkIHRoZSBpZmFjZSAqLworCQltZW1jcHkodWFkZHIuc2lweF9ub2RlLCBpcHhzLT5pbnRyZmMtPmlmX25vZGUsCisJCQlJUFhfTk9ERV9MRU4pOworI2VuZGlmCS8qIENPTkZJR19JUFhfSU5URVJOICovCisKKwkJcmMgPSBpcHhfYmluZChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJnVhZGRyLAorCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pcHgpKTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXQ7CisJfQorCisgICAgICAgIC8qIFdlIGNhbiBlaXRoZXIgY29ubmVjdCB0byBwcmltYXJ5IG5ldHdvcmsgb3Igc29tZXdoZXJlCisJICogd2UgY2FuIHJvdXRlIHRvICovCisJcnQgPSBpcHhydHJfbG9va3VwKGFkZHItPnNpcHhfbmV0d29yayk7CisJcmMgPSAtRU5FVFVOUkVBQ0g7CisJaWYgKCFydCAmJiAhKCFhZGRyLT5zaXB4X25ldHdvcmsgJiYgaXB4X3ByaW1hcnlfbmV0KSkKKwkJZ290byBvdXQ7CisKKwlpcHhzLT5kZXN0X2FkZHIubmV0ICA9IGFkZHItPnNpcHhfbmV0d29yazsKKwlpcHhzLT5kZXN0X2FkZHIuc29jayA9IGFkZHItPnNpcHhfcG9ydDsKKwltZW1jcHkoaXB4cy0+ZGVzdF9hZGRyLm5vZGUsIGFkZHItPnNpcHhfbm9kZSwgSVBYX05PREVfTEVOKTsKKwlpcHhzLT50eXBlID0gYWRkci0+c2lweF90eXBlOworCisJaWYgKHNvY2stPnR5cGUgPT0gU09DS19ER1JBTSkgeworCQlzb2NrLT5zdGF0ZSAJPSBTU19DT05ORUNURUQ7CisJCXNrLT5za19zdGF0ZSAJPSBUQ1BfRVNUQUJMSVNIRUQ7CisJfQorCisJaWYgKHJ0KQorCQlpcHhydHJfcHV0KHJ0KTsKKwlyYyA9IDA7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBpbnQgaXB4X2dldG5hbWUoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwKKwkJCWludCAqdWFkZHJfbGVuLCBpbnQgcGVlcikKK3sKKwlzdHJ1Y3QgaXB4X2FkZHJlc3MgKmFkZHI7CisJc3RydWN0IHNvY2thZGRyX2lweCBzaXB4OworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBpcHhfc29jayAqaXB4cyA9IGlweF9zayhzayk7CisJaW50IHJjOworCisJKnVhZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaXB4KTsKKworCWlmIChwZWVyKSB7CisJCXJjID0gLUVOT1RDT05OOworCQlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkKKwkJCWdvdG8gb3V0OworCisJCWFkZHIgPSAmaXB4cy0+ZGVzdF9hZGRyOworCQlzaXB4LnNpcHhfbmV0d29yawk9IGFkZHItPm5ldDsKKwkJc2lweC5zaXB4X3BvcnQJCT0gYWRkci0+c29jazsKKwkJbWVtY3B5KHNpcHguc2lweF9ub2RlLCBhZGRyLT5ub2RlLCBJUFhfTk9ERV9MRU4pOworCX0gZWxzZSB7CisJCWlmIChpcHhzLT5pbnRyZmMpIHsKKwkJCXNpcHguc2lweF9uZXR3b3JrID0gaXB4cy0+aW50cmZjLT5pZl9uZXRudW07CisjaWZkZWYgQ09ORklHX0lQWF9JTlRFUk4KKwkJCW1lbWNweShzaXB4LnNpcHhfbm9kZSwgaXB4cy0+bm9kZSwgSVBYX05PREVfTEVOKTsKKyNlbHNlCisJCQltZW1jcHkoc2lweC5zaXB4X25vZGUsIGlweHMtPmludHJmYy0+aWZfbm9kZSwKKwkJCQlJUFhfTk9ERV9MRU4pOworI2VuZGlmCS8qIENPTkZJR19JUFhfSU5URVJOICovCisKKwkJfSBlbHNlIHsKKwkJCXNpcHguc2lweF9uZXR3b3JrID0gMDsKKwkJCW1lbXNldChzaXB4LnNpcHhfbm9kZSwgJ1wwJywgSVBYX05PREVfTEVOKTsKKwkJfQorCisJCXNpcHguc2lweF9wb3J0ID0gaXB4cy0+cG9ydDsKKwl9CisKKwlzaXB4LnNpcHhfZmFtaWx5ID0gQUZfSVBYOworCXNpcHguc2lweF90eXBlCSA9IGlweHMtPnR5cGU7CisJc2lweC5zaXB4X3plcm8JID0gMDsKKwltZW1jcHkodWFkZHIsICZzaXB4LCBzaXplb2Yoc2lweCkpOworCisJcmMgPSAwOworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBpcHhfcmN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBwYWNrZXRfdHlwZSAqcHQpCit7CisJLyogTlVMTCBoZXJlIGZvciBwdCBtZWFucyB0aGUgcGFja2V0IHdhcyBsb29wZWQgYmFjayAqLworCXN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmM7CisJc3RydWN0IGlweGhkciAqaXB4OworCXUxNiBpcHhfcGt0c2l6ZTsKKwlpbnQgcmMgPSAwOworCQkKKwkvKiBOb3Qgb3VycyAqLwkKKyAgICAgICAgaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09USEVSSE9TVCkKKyAgICAgICAgCWdvdG8gZHJvcDsKKworCWlmICgoc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJaXB4CQk9IGlweF9oZHIoc2tiKTsKKwlpcHhfcGt0c2l6ZQk9IG50b2hzKGlweC0+aXB4X3BrdHNpemUpOworCQorCS8qIFRvbyBzbWFsbCBvciBpbnZhbGlkIGhlYWRlcj8gKi8KKwlpZiAoaXB4X3BrdHNpemUgPCBzaXplb2Yoc3RydWN0IGlweGhkcikgfHwgaXB4X3BrdHNpemUgPiBza2ItPmxlbikKKwkJZ290byBkcm9wOworICAgICAgICAgICAgICAgICAgICAgICAgCisJaWYgKGlweC0+aXB4X2NoZWNrc3VtICE9IElQWF9OT19DSEVDS1NVTSAmJgorCSAgIGlweC0+aXB4X2NoZWNrc3VtICE9IGlweF9ja3N1bShpcHgsIGlweF9wa3RzaXplKSkKKwkJZ290byBkcm9wOworCisJSVBYX1NLQl9DQihza2IpLT5pcHhfdGN0cmwJPSBpcHgtPmlweF90Y3RybDsKKwlJUFhfU0tCX0NCKHNrYiktPmlweF9kZXN0X25ldAk9IGlweC0+aXB4X2Rlc3QubmV0OworCUlQWF9TS0JfQ0Ioc2tiKS0+aXB4X3NvdXJjZV9uZXQgPSBpcHgtPmlweF9zb3VyY2UubmV0OworCisJLyogRGV0ZXJtaW5lIHdoYXQgbG9jYWwgaXB4IGVuZHBvaW50IHRoaXMgaXMgKi8KKwlpbnRyZmMgPSBpcHhpdGZfZmluZF91c2luZ19waHlzKGRldiwgcHQtPnR5cGUpOworCWlmICghaW50cmZjKSB7CisJCWlmIChpcHhjZmdfYXV0b19jcmVhdGVfaW50ZXJmYWNlcyAmJgorCQkgICBudG9obChJUFhfU0tCX0NCKHNrYiktPmlweF9kZXN0X25ldCkpIHsKKwkJCWludHJmYyA9IGlweGl0Zl9hdXRvX2NyZWF0ZShkZXYsIHB0LT50eXBlKTsKKwkJCWlmIChpbnRyZmMpCisJCQkJaXB4aXRmX2hvbGQoaW50cmZjKTsKKwkJfQorCisJCWlmICghaW50cmZjKQkvKiBOb3Qgb25lIG9mIG91cnMgKi8KKwkJCQkvKiBvciBpbnZhbGlkIHBhY2tldCBmb3IgYXV0byBjcmVhdGlvbiAqLworCQkJZ290byBkcm9wOworCX0KKworCXJjID0gaXB4aXRmX3JjdihpbnRyZmMsIHNrYik7CisJaXB4aXRmX3B1dChpbnRyZmMpOworCWdvdG8gb3V0OworZHJvcDoKKwlrZnJlZV9za2Ioc2tiKTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgaXB4X3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCXN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgaXB4X3NvY2sgKmlweHMgPSBpcHhfc2soc2spOworCXN0cnVjdCBzb2NrYWRkcl9pcHggKnVzaXB4ID0gKHN0cnVjdCBzb2NrYWRkcl9pcHggKiltc2ctPm1zZ19uYW1lOworCXN0cnVjdCBzb2NrYWRkcl9pcHggbG9jYWxfc2lweDsKKwlpbnQgcmMgPSAtRUlOVkFMOworCWludCBmbGFncyA9IG1zZy0+bXNnX2ZsYWdzOworCisJLyogU29ja2V0IGdldHMgYm91bmQgYmVsb3cgYW55d2F5ICovCisvKglpZiAoc2stPnNrX3phcHBlZCkKKwkJcmV0dXJuIC1FSU87ICovCS8qIFNvY2tldCBub3QgYm91bmQgKi8KKwlpZiAoZmxhZ3MgJiB+KE1TR19ET05UV0FJVHxNU0dfQ01TR19DT01QQVQpKQorCQlnb3RvIG91dDsKKworCS8qIE1heCBwb3NzaWJsZSBwYWNrZXQgc2l6ZSBsaW1pdGVkIGJ5IDE2IGJpdCBwa3RzaXplIGluIGhlYWRlciAqLworCWlmIChsZW4gPj0gNjU1MzUgLSBzaXplb2Yoc3RydWN0IGlweGhkcikpCisJCWdvdG8gb3V0OworCisJaWYgKHVzaXB4KSB7CisJCWlmICghaXB4cy0+cG9ydCkgeworCQkJc3RydWN0IHNvY2thZGRyX2lweCB1YWRkcjsKKworCQkJdWFkZHIuc2lweF9wb3J0CQk9IDA7CisJCQl1YWRkci5zaXB4X25ldHdvcmsJPSAwOworI2lmZGVmIENPTkZJR19JUFhfSU5URVJOCisJCQlyYyA9IC1FTkVURE9XTjsKKwkJCWlmICghaXB4cy0+aW50cmZjKQorCQkJCWdvdG8gb3V0OyAvKiBTb21lb25lIHpvbmtlZCB0aGUgaWZhY2UgKi8KKwkJCW1lbWNweSh1YWRkci5zaXB4X25vZGUsIGlweHMtPmludHJmYy0+aWZfbm9kZSwKKwkJCQlJUFhfTk9ERV9MRU4pOworI2VuZGlmCisJCQlyYyA9IGlweF9iaW5kKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmdWFkZHIsCisJCQkJCXNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaXB4KSk7CisJCQlpZiAocmMpCisJCQkJZ290byBvdXQ7CisJCX0KKworCQlyYyA9IC1FSU5WQUw7CisJCWlmIChtc2ctPm1zZ19uYW1lbGVuIDwgc2l6ZW9mKCp1c2lweCkgfHwKKwkJICAgIHVzaXB4LT5zaXB4X2ZhbWlseSAhPSBBRl9JUFgpCisJCQlnb3RvIG91dDsKKwl9IGVsc2UgeworCQlyYyA9IC1FTk9UQ09OTjsKKwkJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfRVNUQUJMSVNIRUQpCisJCQlnb3RvIG91dDsKKworCQl1c2lweCA9ICZsb2NhbF9zaXB4OworCQl1c2lweC0+c2lweF9mYW1pbHkgCT0gQUZfSVBYOworCQl1c2lweC0+c2lweF90eXBlIAk9IGlweHMtPnR5cGU7CisJCXVzaXB4LT5zaXB4X3BvcnQgCT0gaXB4cy0+ZGVzdF9hZGRyLnNvY2s7CisJCXVzaXB4LT5zaXB4X25ldHdvcmsgCT0gaXB4cy0+ZGVzdF9hZGRyLm5ldDsKKwkJbWVtY3B5KHVzaXB4LT5zaXB4X25vZGUsIGlweHMtPmRlc3RfYWRkci5ub2RlLCBJUFhfTk9ERV9MRU4pOworCX0KKworCXJjID0gaXB4cnRyX3JvdXRlX3BhY2tldChzaywgdXNpcHgsIG1zZy0+bXNnX2lvdiwgbGVuLAorCQkJCSBmbGFncyAmIE1TR19ET05UV0FJVCk7CisJaWYgKHJjID49IDApCisJCXJjID0gbGVuOworb3V0OgorCXJldHVybiByYzsKK30KKworCitzdGF0aWMgaW50IGlweF9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBpcHhfc29jayAqaXB4cyA9IGlweF9zayhzayk7CisJc3RydWN0IHNvY2thZGRyX2lweCAqc2lweCA9IChzdHJ1Y3Qgc29ja2FkZHJfaXB4ICopbXNnLT5tc2dfbmFtZTsKKwlzdHJ1Y3QgaXB4aGRyICppcHggPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGNvcGllZCwgcmM7CisKKwkvKiBwdXQgdGhlIGF1dG9iaW5kaW5nIGluICovCisJaWYgKCFpcHhzLT5wb3J0KSB7CisJCXN0cnVjdCBzb2NrYWRkcl9pcHggdWFkZHI7CisKKwkJdWFkZHIuc2lweF9wb3J0CQk9IDA7CisJCXVhZGRyLnNpcHhfbmV0d29yayAJPSAwOworCisjaWZkZWYgQ09ORklHX0lQWF9JTlRFUk4KKwkJcmMgPSAtRU5FVERPV047CisJCWlmICghaXB4cy0+aW50cmZjKQorCQkJZ290byBvdXQ7IC8qIFNvbWVvbmUgem9ua2VkIHRoZSBpZmFjZSAqLworCQltZW1jcHkodWFkZHIuc2lweF9ub2RlLCBpcHhzLT5pbnRyZmMtPmlmX25vZGUsIElQWF9OT0RFX0xFTik7CisjZW5kaWYJLyogQ09ORklHX0lQWF9JTlRFUk4gKi8KKworCQlyYyA9IGlweF9iaW5kKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmdWFkZHIsCisJCQkgICAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2lweCkpOworCQlpZiAocmMpCisJCQlnb3RvIG91dDsKKwl9CisJCisJcmMgPSAtRU5PVENPTk47CisJaWYgKHNvY2tfZmxhZyhzaywgU09DS19aQVBQRUQpKQorCQlnb3RvIG91dDsKKworCXNrYiA9IHNrYl9yZWN2X2RhdGFncmFtKHNrLCBmbGFncyAmIH5NU0dfRE9OVFdBSVQsCisJCQkJZmxhZ3MgJiBNU0dfRE9OVFdBSVQsICZyYyk7CisJaWYgKCFza2IpCisJCWdvdG8gb3V0OworCisJaXB4IAk9IGlweF9oZHIoc2tiKTsKKwljb3BpZWQgCT0gbnRvaHMoaXB4LT5pcHhfcGt0c2l6ZSkgLSBzaXplb2Yoc3RydWN0IGlweGhkcik7CisJaWYgKGNvcGllZCA+IHNpemUpIHsKKwkJY29waWVkID0gc2l6ZTsKKwkJbXNnLT5tc2dfZmxhZ3MgfD0gTVNHX1RSVU5DOworCX0KKworCXJjID0gc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCBzaXplb2Yoc3RydWN0IGlweGhkciksIG1zZy0+bXNnX2lvdiwKKwkJCQkgICAgIGNvcGllZCk7CisJaWYgKHJjKQorCQlnb3RvIG91dF9mcmVlOworCWlmIChza2ItPnN0YW1wLnR2X3NlYykKKwkJc2stPnNrX3N0YW1wID0gc2tiLT5zdGFtcDsKKworCW1zZy0+bXNnX25hbWVsZW4gPSBzaXplb2YoKnNpcHgpOworCisJaWYgKHNpcHgpIHsKKwkJc2lweC0+c2lweF9mYW1pbHkJPSBBRl9JUFg7CisJCXNpcHgtPnNpcHhfcG9ydAkJPSBpcHgtPmlweF9zb3VyY2Uuc29jazsKKwkJbWVtY3B5KHNpcHgtPnNpcHhfbm9kZSwgaXB4LT5pcHhfc291cmNlLm5vZGUsIElQWF9OT0RFX0xFTik7CisJCXNpcHgtPnNpcHhfbmV0d29yawk9IElQWF9TS0JfQ0Ioc2tiKS0+aXB4X3NvdXJjZV9uZXQ7CisJCXNpcHgtPnNpcHhfdHlwZSAJPSBpcHgtPmlweF90eXBlOworCQlzaXB4LT5zaXB4X3plcm8JCT0gMDsKKwl9CisJcmMgPSBjb3BpZWQ7CisKK291dF9mcmVlOgorCXNrYl9mcmVlX2RhdGFncmFtKHNrLCBza2IpOworb3V0OgorCXJldHVybiByYzsKK30KKworCitzdGF0aWMgaW50IGlweF9pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmMgPSAwOworCWxvbmcgYW1vdW50ID0gMDsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUSU9DT1VUUToKKwkJYW1vdW50ID0gc2stPnNrX3NuZGJ1ZiAtIGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYyk7CisJCWlmIChhbW91bnQgPCAwKQorCQkJYW1vdW50ID0gMDsKKwkJcmMgPSBwdXRfdXNlcihhbW91bnQsIChpbnQgX191c2VyICopYXJncCk7CisJCWJyZWFrOworCWNhc2UgVElPQ0lOUTogeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2tiX3BlZWsoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwkJLyogVGhlc2UgdHdvIGFyZSBzYWZlIG9uIGEgc2luZ2xlIENQVSBzeXN0ZW0gYXMgb25seQorCQkgKiB1c2VyIHRhc2tzIGZpZGRsZSBoZXJlICovCisJCWlmIChza2IpCisJCQlhbW91bnQgPSBza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgaXB4aGRyKTsKKwkJcmMgPSBwdXRfdXNlcihhbW91bnQsIChpbnQgX191c2VyICopYXJncCk7CisJCWJyZWFrOworCX0KKwljYXNlIFNJT0NBRERSVDoKKwljYXNlIFNJT0NERUxSVDoKKwkJcmMgPSAtRVBFUk07CisJCWlmIChjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmMgPSBpcHhydHJfaW9jdGwoY21kLCBhcmdwKTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DU0lGQUREUjoKKwljYXNlIFNJT0NBSVBYSVRGQ1JUOgorCWNhc2UgU0lPQ0FJUFhQUklTTFQ6CisJCXJjID0gLUVQRVJNOworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlicmVhazsKKwljYXNlIFNJT0NHSUZBRERSOgorCQlyYyA9IGlweGl0Zl9pb2N0bChjbWQsIGFyZ3ApOworCQlicmVhazsKKwljYXNlIFNJT0NJUFhDRkdEQVRBOgorCQlyYyA9IGlweGNmZ19nZXRfY29uZmlnX2RhdGEoYXJncCk7CisJCWJyZWFrOworCWNhc2UgU0lPQ0lQWE5DUENPTk46CisJCS8qCisJCSAqIFRoaXMgc29ja2V0IHdhbnRzIHRvIHRha2UgY2FyZSBvZiB0aGUgTkNQIGNvbm5lY3Rpb24KKwkJICogaGFuZGVkIHRvIHVzIGluIGFyZy4KKwkJICovCisgICAgICAgIAlyYyA9IC1FUEVSTTsKKyAgICAgICAgCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCWJyZWFrOworCQlyYyA9IGdldF91c2VyKGlweF9zayhzayktPmlweF9uY3BfY29ubiwKKwkJCSAgICAgIChjb25zdCB1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKilhcmdwKTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DR1NUQU1QOgorCQlyYyA9IC1FSU5WQUw7CisJCWlmIChzaykgCisJCQlyYyA9IHNvY2tfZ2V0X3RpbWVzdGFtcChzaywgYXJncCk7CisJCWJyZWFrOworCWNhc2UgU0lPQ0dJRkRTVEFERFI6CisJY2FzZSBTSU9DU0lGRFNUQUREUjoKKwljYXNlIFNJT0NHSUZCUkRBRERSOgorCWNhc2UgU0lPQ1NJRkJSREFERFI6CisJY2FzZSBTSU9DR0lGTkVUTUFTSzoKKwljYXNlIFNJT0NTSUZORVRNQVNLOgorCQlyYyA9IC1FSU5WQUw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gZGV2X2lvY3RsKGNtZCwgYXJncCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworLyoKKyAqIFNvY2tldCBmYW1pbHkgZGVjbGFyYXRpb25zCisgKi8KKworc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5IGlweF9mYW1pbHlfb3BzID0geworCS5mYW1pbHkJCT0gUEZfSVBYLAorCS5jcmVhdGUJCT0gaXB4X2NyZWF0ZSwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBTT0NLT1BTX1dSQVBQRUQoaXB4X2RncmFtX29wcykgPSB7CisJLmZhbWlseQkJPSBQRl9JUFgsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWxlYXNlCT0gaXB4X3JlbGVhc2UsCisJLmJpbmQJCT0gaXB4X2JpbmQsCisJLmNvbm5lY3QJPSBpcHhfY29ubmVjdCwKKwkuc29ja2V0cGFpcgk9IHNvY2tfbm9fc29ja2V0cGFpciwKKwkuYWNjZXB0CQk9IHNvY2tfbm9fYWNjZXB0LAorCS5nZXRuYW1lCT0gaXB4X2dldG5hbWUsCisJLnBvbGwJCT0gZGF0YWdyYW1fcG9sbCwKKwkuaW9jdGwJCT0gaXB4X2lvY3RsLAorCS5saXN0ZW4JCT0gc29ja19ub19saXN0ZW4sCisJLnNodXRkb3duCT0gc29ja19ub19zaHV0ZG93biwgLyogRklYTUU6IHN1cHBvcnQgc2h1dGRvd24gKi8KKwkuc2V0c29ja29wdAk9IGlweF9zZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0CT0gaXB4X2dldHNvY2tvcHQsCisJLnNlbmRtc2cJPSBpcHhfc2VuZG1zZywKKwkucmVjdm1zZwk9IGlweF9yZWN2bXNnLAorCS5tbWFwCQk9IHNvY2tfbm9fbW1hcCwKKwkuc2VuZHBhZ2UJPSBzb2NrX25vX3NlbmRwYWdlLAorfTsKKworI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CitTT0NLT1BTX1dSQVAoaXB4X2RncmFtLCBQRl9JUFgpOworCitzdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIGlweF84MDIzX3BhY2tldF90eXBlID0geworCS50eXBlCQk9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyXzMpLAorCS5mdW5jCQk9IGlweF9yY3YsCit9OworCitzdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIGlweF9kaXhfcGFja2V0X3R5cGUgPSB7CisJLnR5cGUJCT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFgpLAorCS5mdW5jCQk9IGlweF9yY3YsCit9OworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGlweF9kZXZfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwJPSBpcHhpdGZfZGV2aWNlX2V2ZW50LAorfTsKKworZXh0ZXJuIHN0cnVjdCBkYXRhbGlua19wcm90byAqbWFrZV9FSUlfY2xpZW50KHZvaWQpOworZXh0ZXJuIHN0cnVjdCBkYXRhbGlua19wcm90byAqbWFrZV84MDIzX2NsaWVudCh2b2lkKTsKK2V4dGVybiB2b2lkIGRlc3Ryb3lfRUlJX2NsaWVudChzdHJ1Y3QgZGF0YWxpbmtfcHJvdG8gKik7CitleHRlcm4gdm9pZCBkZXN0cm95XzgwMjNfY2xpZW50KHN0cnVjdCBkYXRhbGlua19wcm90byAqKTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgaXB4XzgwMjJfdHlwZSA9IDB4RTA7CitzdGF0aWMgdW5zaWduZWQgY2hhciBpcHhfc25hcF9pZFs1XSA9IHsgMHgwLCAweDAsIDB4MCwgMHg4MSwgMHgzNyB9Oworc3RhdGljIGNoYXIgaXB4X0VJSV9lcnJfbXNnW10gX19pbml0ZGF0YSA9CisJS0VSTl9DUklUICJJUFg6IFVuYWJsZSB0byByZWdpc3RlciB3aXRoIEV0aGVybmV0IElJXG4iOworc3RhdGljIGNoYXIgaXB4XzgwMjNfZXJyX21zZ1tdIF9faW5pdGRhdGEgPQorCUtFUk5fQ1JJVCAiSVBYOiBVbmFibGUgdG8gcmVnaXN0ZXIgd2l0aCA4MDIuM1xuIjsKK3N0YXRpYyBjaGFyIGlweF9sbGNfZXJyX21zZ1tdIF9faW5pdGRhdGEgPQorCUtFUk5fQ1JJVCAiSVBYOiBVbmFibGUgdG8gcmVnaXN0ZXIgd2l0aCA4MDIuMlxuIjsKK3N0YXRpYyBjaGFyIGlweF9zbmFwX2Vycl9tc2dbXSBfX2luaXRkYXRhID0KKwlLRVJOX0NSSVQgIklQWDogVW5hYmxlIHRvIHJlZ2lzdGVyIHdpdGggU05BUFxuIjsKKworc3RhdGljIGludCBfX2luaXQgaXB4X2luaXQodm9pZCkKK3sKKwlpbnQgcmMgPSBwcm90b19yZWdpc3RlcigmaXB4X3Byb3RvLCAxKTsKKworCWlmIChyYyAhPSAwKQorCQlnb3RvIG91dDsKKworCXNvY2tfcmVnaXN0ZXIoJmlweF9mYW1pbHlfb3BzKTsKKworCXBFSUlfZGF0YWxpbmsgPSBtYWtlX0VJSV9jbGllbnQoKTsKKwlpZiAocEVJSV9kYXRhbGluaykKKwkJZGV2X2FkZF9wYWNrKCZpcHhfZGl4X3BhY2tldF90eXBlKTsKKwllbHNlCisJCXByaW50ayhpcHhfRUlJX2Vycl9tc2cpOworCisJcDgwMjNfZGF0YWxpbmsgPSBtYWtlXzgwMjNfY2xpZW50KCk7CisJaWYgKHA4MDIzX2RhdGFsaW5rKQorCQlkZXZfYWRkX3BhY2soJmlweF84MDIzX3BhY2tldF90eXBlKTsKKwllbHNlCisJCXByaW50ayhpcHhfODAyM19lcnJfbXNnKTsKKworCXA4MDIyX2RhdGFsaW5rID0gcmVnaXN0ZXJfODAyMl9jbGllbnQoaXB4XzgwMjJfdHlwZSwgaXB4X3Jjdik7CisJaWYgKCFwODAyMl9kYXRhbGluaykKKwkJcHJpbnRrKGlweF9sbGNfZXJyX21zZyk7CisKKwlwU05BUF9kYXRhbGluayA9IHJlZ2lzdGVyX3NuYXBfY2xpZW50KGlweF9zbmFwX2lkLCBpcHhfcmN2KTsKKwlpZiAoIXBTTkFQX2RhdGFsaW5rKQorCQlwcmludGsoaXB4X3NuYXBfZXJyX21zZyk7CisKKwlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmlweF9kZXZfbm90aWZpZXIpOworCWlweF9yZWdpc3Rlcl9zeXNjdGwoKTsKKwlpcHhfcHJvY19pbml0KCk7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXB4X3Byb3RvX2Zpbml0byh2b2lkKQoreworCWlweF9wcm9jX2V4aXQoKTsKKwlpcHhfdW5yZWdpc3Rlcl9zeXNjdGwoKTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZpcHhfZGV2X25vdGlmaWVyKTsKKworCWlweGl0Zl9jbGVhbnVwKCk7CisKKwl1bnJlZ2lzdGVyX3NuYXBfY2xpZW50KHBTTkFQX2RhdGFsaW5rKTsKKwlwU05BUF9kYXRhbGluayA9IE5VTEw7CisKKwl1bnJlZ2lzdGVyXzgwMjJfY2xpZW50KHA4MDIyX2RhdGFsaW5rKTsKKwlwODAyMl9kYXRhbGluayA9IE5VTEw7CisKKwlkZXZfcmVtb3ZlX3BhY2soJmlweF84MDIzX3BhY2tldF90eXBlKTsKKwlkZXN0cm95XzgwMjNfY2xpZW50KHA4MDIzX2RhdGFsaW5rKTsKKwlwODAyM19kYXRhbGluayA9IE5VTEw7CisKKwlkZXZfcmVtb3ZlX3BhY2soJmlweF9kaXhfcGFja2V0X3R5cGUpOworCWRlc3Ryb3lfRUlJX2NsaWVudChwRUlJX2RhdGFsaW5rKTsKKwlwRUlJX2RhdGFsaW5rID0gTlVMTDsKKworCXByb3RvX3VucmVnaXN0ZXIoJmlweF9wcm90byk7CisJc29ja191bnJlZ2lzdGVyKGlweF9mYW1pbHlfb3BzLmZhbWlseSk7Cit9CisKK21vZHVsZV9pbml0KGlweF9pbml0KTsKK21vZHVsZV9leGl0KGlweF9wcm90b19maW5pdG8pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX05FVFBST1RPKFBGX0lQWCk7CmRpZmYgLS1naXQgYS9uZXQvaXB4L2lweF9wcm9jLmMgYi9uZXQvaXB4L2lweF9wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY3NjE5MQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHgvaXB4X3Byb2MuYwpAQCAtMCwwICsxLDQwOCBAQAorLyoKKyAqCUlQWCBwcm9jIHJvdXRpbmVzCisgKgorICogCUNvcHlyaWdodChDKSBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4sIDIwMDIKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2lmZGVmIENPTkZJR19QUk9DX0ZTCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvaXB4Lmg+CisKK3N0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBpcHhfaW50ZXJmYWNlICppcHhfZ2V0X2ludGVyZmFjZV9pZHgobG9mZl90IHBvcykKK3sKKwlzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgJmlweF9pbnRlcmZhY2VzLCBub2RlKQorCQlpZiAoIXBvcy0tKQorCQkJZ290byBvdXQ7CisJaSA9IE5VTEw7CitvdXQ6CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaXB4X2ludGVyZmFjZXNfbmV4dChzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaSkKK3sKKwlzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqcmMgPSBOVUxMOworCisJaWYgKGktPm5vZGUubmV4dCAhPSAmaXB4X2ludGVyZmFjZXMpCisJCXJjID0gbGlzdF9lbnRyeShpLT5ub2RlLm5leHQsIHN0cnVjdCBpcHhfaW50ZXJmYWNlLCBub2RlKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkICppcHhfc2VxX2ludGVyZmFjZV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJbG9mZl90IGwgPSAqcG9zOworCisJc3Bpbl9sb2NrX2JoKCZpcHhfaW50ZXJmYWNlc19sb2NrKTsKKwlyZXR1cm4gbCA/IGlweF9nZXRfaW50ZXJmYWNlX2lkeCgtLWwpIDogU0VRX1NUQVJUX1RPS0VOOworfQorCitzdGF0aWMgdm9pZCAqaXB4X3NlcV9pbnRlcmZhY2VfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGlweF9pbnRlcmZhY2UgKmk7CisKKwkrKypwb3M7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlpID0gaXB4X2ludGVyZmFjZXNfaGVhZCgpOworCWVsc2UKKwkJaSA9IGlweF9pbnRlcmZhY2VzX25leHQodik7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB2b2lkIGlweF9zZXFfaW50ZXJmYWNlX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3Bpbl91bmxvY2tfYmgoJmlweF9pbnRlcmZhY2VzX2xvY2spOworfQorCitzdGF0aWMgaW50IGlweF9zZXFfaW50ZXJmYWNlX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IGlweF9pbnRlcmZhY2UgKmk7CisKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJc2VxX3B1dHMoc2VxLCAiTmV0d29yayAgICBOb2RlX0FkZHJlc3MgICBQcmltYXJ5ICBEZXZpY2UgICAgICIKKwkJCSAgICAgICJGcmFtZV9UeXBlIik7CisjaWZkZWYgSVBYX1JFRkNOVF9ERUJVRworCQlzZXFfcHV0cyhzZXEsICIgIHJlZmNudCIpOworI2VuZGlmCisJCXNlcV9wdXRzKHNlcSwgIlxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWkgPSB2OworCXNlcV9wcmludGYoc2VxLCAiJTA4bFggICAiLCAodW5zaWduZWQgbG9uZyBpbnQpbnRvaGwoaS0+aWZfbmV0bnVtKSk7CisJc2VxX3ByaW50ZihzZXEsICIlMDJYJTAyWCUwMlglMDJYJTAyWCUwMlggICAiLAorCQkJaS0+aWZfbm9kZVswXSwgaS0+aWZfbm9kZVsxXSwgaS0+aWZfbm9kZVsyXSwKKwkJCWktPmlmX25vZGVbM10sIGktPmlmX25vZGVbNF0sIGktPmlmX25vZGVbNV0pOworCXNlcV9wcmludGYoc2VxLCAiJS05cyIsIGkgPT0gaXB4X3ByaW1hcnlfbmV0ID8gIlllcyIgOiAiTm8iKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiUtMTFzIiwgaXB4X2RldmljZV9uYW1lKGkpKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiUtOXMiLCBpcHhfZnJhbWVfbmFtZShpLT5pZl9kbGlua190eXBlKSk7CisjaWZkZWYgSVBYX1JFRkNOVF9ERUJVRworCXNlcV9wcmludGYoc2VxLCAiJTZkIiwgYXRvbWljX3JlYWQoJmktPnJlZmNudCkpOworI2VuZGlmCisJc2VxX3B1dHMoc2VxLCAiXG4iKTsKK291dDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpcHhfcm91dGUgKmlweF9yb3V0ZXNfaGVhZCh2b2lkKQoreworCXN0cnVjdCBpcHhfcm91dGUgKnJjID0gTlVMTDsKKworCWlmICghbGlzdF9lbXB0eSgmaXB4X3JvdXRlcykpCisJCXJjID0gbGlzdF9lbnRyeShpcHhfcm91dGVzLm5leHQsIHN0cnVjdCBpcHhfcm91dGUsIG5vZGUpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBpcHhfcm91dGUgKmlweF9yb3V0ZXNfbmV4dChzdHJ1Y3QgaXB4X3JvdXRlICpyKQoreworCXN0cnVjdCBpcHhfcm91dGUgKnJjID0gTlVMTDsKKworCWlmIChyLT5ub2RlLm5leHQgIT0gJmlweF9yb3V0ZXMpCisJCXJjID0gbGlzdF9lbnRyeShyLT5ub2RlLm5leHQsIHN0cnVjdCBpcHhfcm91dGUsIG5vZGUpOworCXJldHVybiByYzsKK30KKworc3RhdGljIF9faW5saW5lX18gc3RydWN0IGlweF9yb3V0ZSAqaXB4X2dldF9yb3V0ZV9pZHgobG9mZl90IHBvcykKK3sKKwlzdHJ1Y3QgaXB4X3JvdXRlICpyOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyLCAmaXB4X3JvdXRlcywgbm9kZSkKKwkJaWYgKCFwb3MtLSkKKwkJCWdvdG8gb3V0OworCXIgPSBOVUxMOworb3V0OgorCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCAqaXB4X3NlcV9yb3V0ZV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJbG9mZl90IGwgPSAqcG9zOworCXJlYWRfbG9ja19iaCgmaXB4X3JvdXRlc19sb2NrKTsKKwlyZXR1cm4gbCA/IGlweF9nZXRfcm91dGVfaWR4KC0tbCkgOiBTRVFfU1RBUlRfVE9LRU47Cit9CisKK3N0YXRpYyB2b2lkICppcHhfc2VxX3JvdXRlX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBpcHhfcm91dGUgKnI7CisKKwkrKypwb3M7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlyID0gaXB4X3JvdXRlc19oZWFkKCk7CisJZWxzZQorCQlyID0gaXB4X3JvdXRlc19uZXh0KHYpOworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBpcHhfc2VxX3JvdXRlX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJcmVhZF91bmxvY2tfYmgoJmlweF9yb3V0ZXNfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgaXB4X3NlcV9yb3V0ZV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBpcHhfcm91dGUgKnJ0OworCisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CisJCXNlcV9wdXRzKHNlcSwgIk5ldHdvcmsgICAgUm91dGVyX05ldCAgIFJvdXRlcl9Ob2RlXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCXJ0ID0gdjsKKwlzZXFfcHJpbnRmKHNlcSwgIiUwOGxYICAgIiwgKHVuc2lnbmVkIGxvbmcgaW50KW50b2hsKHJ0LT5pcl9uZXQpKTsKKwlpZiAocnQtPmlyX3JvdXRlZCkKKwkJc2VxX3ByaW50ZihzZXEsICIlMDhsWCAgICAgJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYXG4iLAorCQkJICAgKGxvbmcgdW5zaWduZWQgaW50KW50b2hsKHJ0LT5pcl9pbnRyZmMtPmlmX25ldG51bSksCisJCQkgICBydC0+aXJfcm91dGVyX25vZGVbMF0sIHJ0LT5pcl9yb3V0ZXJfbm9kZVsxXSwKKwkJCSAgIHJ0LT5pcl9yb3V0ZXJfbm9kZVsyXSwgcnQtPmlyX3JvdXRlcl9ub2RlWzNdLAorCQkJICAgcnQtPmlyX3JvdXRlcl9ub2RlWzRdLCBydC0+aXJfcm91dGVyX25vZGVbNV0pOworCWVsc2UKKwkJc2VxX3B1dHMoc2VxLCAiRGlyZWN0bHkgICAgIENvbm5lY3RlZFxuIik7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBzb2NrICppcHhfZ2V0X3NvY2tldF9pZHgobG9mZl90IHBvcykKK3sKKwlzdHJ1Y3Qgc29jayAqcyA9IE5VTEw7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJc3RydWN0IGlweF9pbnRlcmZhY2UgKmk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZpcHhfaW50ZXJmYWNlcywgbm9kZSkgeworCQlzcGluX2xvY2tfYmgoJmktPmlmX3NrbGlzdF9sb2NrKTsKKwkJc2tfZm9yX2VhY2gocywgbm9kZSwgJmktPmlmX3NrbGlzdCkgeworCQkJaWYgKCFwb3MpCisJCQkJYnJlYWs7CisJCQktLXBvczsKKwkJfQorCQlzcGluX3VubG9ja19iaCgmaS0+aWZfc2tsaXN0X2xvY2spOworCQlpZiAoIXBvcykgeworCQkJaWYgKG5vZGUpCisJCQkJZ290byBmb3VuZDsKKwkJCWJyZWFrOworCQl9CisJfQorCXMgPSBOVUxMOworZm91bmQ6CisJcmV0dXJuIHM7Cit9CisKK3N0YXRpYyB2b2lkICppcHhfc2VxX3NvY2tldF9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJbG9mZl90IGwgPSAqcG9zOworCisJc3Bpbl9sb2NrX2JoKCZpcHhfaW50ZXJmYWNlc19sb2NrKTsKKwlyZXR1cm4gbCA/IGlweF9nZXRfc29ja2V0X2lkeCgtLWwpIDogU0VRX1NUQVJUX1RPS0VOOworfQorCitzdGF0aWMgdm9pZCAqaXB4X3NlcV9zb2NrZXRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHNvY2sqIHNrLCAqbmV4dDsKKwlzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaTsKKwlzdHJ1Y3QgaXB4X3NvY2sgKmlweHM7CisKKwkrKypwb3M7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CisJCXNrID0gTlVMTDsKKwkJaSA9IGlweF9pbnRlcmZhY2VzX2hlYWQoKTsKKwkJaWYgKCFpKQorCQkJZ290byBvdXQ7CisJCXNrID0gc2tfaGVhZCgmaS0+aWZfc2tsaXN0KTsKKwkJaWYgKHNrKQorCQkJc3Bpbl9sb2NrX2JoKCZpLT5pZl9za2xpc3RfbG9jayk7CisJCWdvdG8gb3V0OworCX0KKwlzayA9IHY7CisJbmV4dCA9IHNrX25leHQoc2spOworCWlmIChuZXh0KSB7CisJCXNrID0gbmV4dDsKKwkJZ290byBvdXQ7CisJfQorCWlweHMgPSBpcHhfc2soc2spOworCWkgPSBpcHhzLT5pbnRyZmM7CisJc3Bpbl91bmxvY2tfYmgoJmktPmlmX3NrbGlzdF9sb2NrKTsKKwlzayA9IE5VTEw7CisJZm9yICg7OykgeworCQlpID0gaXB4X2ludGVyZmFjZXNfbmV4dChpKTsKKwkJaWYgKCFpKQorCQkJYnJlYWs7CisJCXNwaW5fbG9ja19iaCgmaS0+aWZfc2tsaXN0X2xvY2spOworCQlpZiAoIWhsaXN0X2VtcHR5KCZpLT5pZl9za2xpc3QpKSB7CisJCQlzayA9IHNrX2hlYWQoJmktPmlmX3NrbGlzdCk7CisJCQlicmVhazsKKwkJfQorCQlzcGluX3VubG9ja19iaCgmaS0+aWZfc2tsaXN0X2xvY2spOworCX0KK291dDoKKwlyZXR1cm4gc2s7Cit9CisKK3N0YXRpYyBpbnQgaXB4X3NlcV9zb2NrZXRfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3Qgc29jayAqczsKKwlzdHJ1Y3QgaXB4X3NvY2sgKmlweHM7CisKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKyNpZmRlZiBDT05GSUdfSVBYX0lOVEVSTgorCQlzZXFfcHV0cyhzZXEsICJMb2NhbF9BZGRyZXNzICAgICAgICAgICAgICAgIgorCQkJICAgICAgIlJlbW90ZV9BZGRyZXNzICAgICAgICAgICAgICBUeF9RdWV1ZSAgIgorCQkJICAgICAgIlJ4X1F1ZXVlICBTdGF0ZSAgVWlkXG4iKTsKKyNlbHNlCisJCXNlcV9wdXRzKHNlcSwgIkxvY2FsX0FkZHJlc3MgIFJlbW90ZV9BZGRyZXNzICAgICAgICAgICAgICAiCisJCQkgICAgICAiVHhfUXVldWUgIFJ4X1F1ZXVlICBTdGF0ZSAgVWlkXG4iKTsKKyNlbmRpZgorCQlnb3RvIG91dDsKKwl9CisKKwlzID0gdjsKKwlpcHhzID0gaXB4X3NrKHMpOworI2lmZGVmIENPTkZJR19JUFhfSU5URVJOCisJc2VxX3ByaW50ZihzZXEsICIlMDhsWDolMDJYJTAyWCUwMlglMDJYJTAyWCUwMlg6JTA0WCAgIiwKKwkJICAgKHVuc2lnbmVkIGxvbmcpaHRvbmwoaXB4cy0+aW50cmZjLT5pZl9uZXRudW0pLAorCQkgICBpcHhzLT5ub2RlWzBdLCBpcHhzLT5ub2RlWzFdLCBpcHhzLT5ub2RlWzJdLCBpcHhzLT5ub2RlWzNdLAorCQkgICBpcHhzLT5ub2RlWzRdLCBpcHhzLT5ub2RlWzVdLCBodG9ucyhpcHhzLT5wb3J0KSk7CisjZWxzZQorCXNlcV9wcmludGYoc2VxLCAiJTA4bFg6JTA0WCAgIiwgKHVuc2lnbmVkIGxvbmcpIGh0b25sKGlweHMtPmludHJmYy0+aWZfbmV0bnVtKSwKKwkJICAgaHRvbnMoaXB4cy0+cG9ydCkpOworI2VuZGlmCS8qIENPTkZJR19JUFhfSU5URVJOICovCisJaWYgKHMtPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkKKwkJc2VxX3ByaW50ZihzZXEsICIlLTI4cyIsICJOb3RfQ29ubmVjdGVkIik7CisJZWxzZSB7CisJCXNlcV9wcmludGYoc2VxLCAiJTA4bFg6JTAyWCUwMlglMDJYJTAyWCUwMlglMDJYOiUwNFggICIsCisJCQkgICAodW5zaWduZWQgbG9uZylodG9ubChpcHhzLT5kZXN0X2FkZHIubmV0KSwKKwkJCSAgIGlweHMtPmRlc3RfYWRkci5ub2RlWzBdLCBpcHhzLT5kZXN0X2FkZHIubm9kZVsxXSwKKwkJCSAgIGlweHMtPmRlc3RfYWRkci5ub2RlWzJdLCBpcHhzLT5kZXN0X2FkZHIubm9kZVszXSwKKwkJCSAgIGlweHMtPmRlc3RfYWRkci5ub2RlWzRdLCBpcHhzLT5kZXN0X2FkZHIubm9kZVs1XSwKKwkJCSAgIGh0b25zKGlweHMtPmRlc3RfYWRkci5zb2NrKSk7CisJfQorCisJc2VxX3ByaW50ZihzZXEsICIlMDhYICAlMDhYICAlMDJYICAgICAlMDNkXG4iLAorCQkgICBhdG9taWNfcmVhZCgmcy0+c2tfd21lbV9hbGxvYyksCisJCSAgIGF0b21pY19yZWFkKCZzLT5za19ybWVtX2FsbG9jKSwKKwkJICAgcy0+c2tfc3RhdGUsIFNPQ0tfSU5PREUocy0+c2tfc29ja2V0KS0+aV91aWQpOworb3V0OgorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGlweF9zZXFfaW50ZXJmYWNlX29wcyA9IHsKKwkuc3RhcnQgID0gaXB4X3NlcV9pbnRlcmZhY2Vfc3RhcnQsCisJLm5leHQgICA9IGlweF9zZXFfaW50ZXJmYWNlX25leHQsCisJLnN0b3AgICA9IGlweF9zZXFfaW50ZXJmYWNlX3N0b3AsCisJLnNob3cgICA9IGlweF9zZXFfaW50ZXJmYWNlX3Nob3csCit9OworCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGlweF9zZXFfcm91dGVfb3BzID0geworCS5zdGFydCAgPSBpcHhfc2VxX3JvdXRlX3N0YXJ0LAorCS5uZXh0ICAgPSBpcHhfc2VxX3JvdXRlX25leHQsCisJLnN0b3AgICA9IGlweF9zZXFfcm91dGVfc3RvcCwKKwkuc2hvdyAgID0gaXB4X3NlcV9yb3V0ZV9zaG93LAorfTsKKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBpcHhfc2VxX3NvY2tldF9vcHMgPSB7CisJLnN0YXJ0ICA9IGlweF9zZXFfc29ja2V0X3N0YXJ0LAorCS5uZXh0ICAgPSBpcHhfc2VxX3NvY2tldF9uZXh0LAorCS5zdG9wICAgPSBpcHhfc2VxX2ludGVyZmFjZV9zdG9wLAorCS5zaG93ICAgPSBpcHhfc2VxX3NvY2tldF9zaG93LAorfTsKKworc3RhdGljIGludCBpcHhfc2VxX3JvdXRlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZpcHhfc2VxX3JvdXRlX29wcyk7Cit9CisKK3N0YXRpYyBpbnQgaXB4X3NlcV9pbnRlcmZhY2Vfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmlweF9zZXFfaW50ZXJmYWNlX29wcyk7Cit9CisKK3N0YXRpYyBpbnQgaXB4X3NlcV9zb2NrZXRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmlweF9zZXFfc29ja2V0X29wcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlweF9zZXFfaW50ZXJmYWNlX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgICAgICAgICA9IGlweF9zZXFfaW50ZXJmYWNlX29wZW4sCisJLnJlYWQgICAgICAgICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgICAgICAgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlICAgICAgICA9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXB4X3NlcV9yb3V0ZV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICAgICAgICAgPSBpcHhfc2VxX3JvdXRlX29wZW4sCisJLnJlYWQgICAgICAgICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgICAgICAgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlICAgICAgICA9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXB4X3NlcV9zb2NrZXRfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgICAgICAgID0gaXB4X3NlcV9zb2NrZXRfb3BlbiwKKwkucmVhZCAgICAgICAgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICAgICAgICAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgICAgICAgID0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICppcHhfcHJvY19kaXI7CisKK2ludCBfX2luaXQgaXB4X3Byb2NfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcDsKKwlpbnQgcmMgPSAtRU5PTUVNOworICAgICAgIAorCWlweF9wcm9jX2RpciA9IHByb2NfbWtkaXIoImlweCIsIHByb2NfbmV0KTsKKworCWlmICghaXB4X3Byb2NfZGlyKQorCQlnb3RvIG91dDsKKwlwID0gY3JlYXRlX3Byb2NfZW50cnkoImludGVyZmFjZSIsIFNfSVJVR08sIGlweF9wcm9jX2Rpcik7CisJaWYgKCFwKQorCQlnb3RvIG91dF9pbnRlcmZhY2U7CisKKwlwLT5wcm9jX2ZvcHMgPSAmaXB4X3NlcV9pbnRlcmZhY2VfZm9wczsKKwlwID0gY3JlYXRlX3Byb2NfZW50cnkoInJvdXRlIiwgU19JUlVHTywgaXB4X3Byb2NfZGlyKTsKKwlpZiAoIXApCisJCWdvdG8gb3V0X3JvdXRlOworCisJcC0+cHJvY19mb3BzID0gJmlweF9zZXFfcm91dGVfZm9wczsKKwlwID0gY3JlYXRlX3Byb2NfZW50cnkoInNvY2tldCIsIFNfSVJVR08sIGlweF9wcm9jX2Rpcik7CisJaWYgKCFwKQorCQlnb3RvIG91dF9zb2NrZXQ7CisKKwlwLT5wcm9jX2ZvcHMgPSAmaXB4X3NlcV9zb2NrZXRfZm9wczsKKworCXJjID0gMDsKK291dDoKKwlyZXR1cm4gcmM7CitvdXRfc29ja2V0OgorCXJlbW92ZV9wcm9jX2VudHJ5KCJyb3V0ZSIsIGlweF9wcm9jX2Rpcik7CitvdXRfcm91dGU6CisJcmVtb3ZlX3Byb2NfZW50cnkoImludGVyZmFjZSIsIGlweF9wcm9jX2Rpcik7CitvdXRfaW50ZXJmYWNlOgorCXJlbW92ZV9wcm9jX2VudHJ5KCJpcHgiLCBwcm9jX25ldCk7CisJZ290byBvdXQ7Cit9CisKK3ZvaWQgX19leGl0IGlweF9wcm9jX2V4aXQodm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeSgiaW50ZXJmYWNlIiwgaXB4X3Byb2NfZGlyKTsKKwlyZW1vdmVfcHJvY19lbnRyeSgicm91dGUiLCBpcHhfcHJvY19kaXIpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJzb2NrZXQiLCBpcHhfcHJvY19kaXIpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJpcHgiLCBwcm9jX25ldCk7Cit9CisKKyNlbHNlIC8qIENPTkZJR19QUk9DX0ZTICovCisKK2ludCBfX2luaXQgaXB4X3Byb2NfaW5pdCh2b2lkKQoreworCXJldHVybiAwOworfQorCit2b2lkIF9fZXhpdCBpcHhfcHJvY19leGl0KHZvaWQpCit7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lweC9pcHhfcm91dGUuYyBiL25ldC9pcHgvaXB4X3JvdXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc3NzQ0NAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHgvaXB4X3JvdXRlLmMKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgKglJbXBsZW1lbnRzIHRoZSBJUFggcm91dGluZyByb3V0aW5lcy4KKyAqCUNvZGUgbW92ZWQgZnJvbSBhZl9pcHguYy4KKyAqCisgKglBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4sIDIwMDMKKyAqCisgKglTZWUgbmV0L2lweC9DaGFuZ2VMb2cuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlIDxuZXQvaXB4Lmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworTElTVF9IRUFEKGlweF9yb3V0ZXMpOworREVGSU5FX1JXTE9DSyhpcHhfcm91dGVzX2xvY2spOworCitleHRlcm4gc3RydWN0IGlweF9pbnRlcmZhY2UgKmlweF9pbnRlcm5hbF9uZXQ7CisKK2V4dGVybiBfX3UxNiBpcHhfY2tzdW0oc3RydWN0IGlweGhkciAqcGFja2V0LCBpbnQgbGVuZ3RoKTsKK2V4dGVybiBzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaXB4aXRmX2ZpbmRfdXNpbmdfbmV0KF9fdTMyIG5ldCk7CitleHRlcm4gaW50IGlweGl0Zl9kZW11eF9zb2NrZXQoc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYywKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgY29weSk7CitleHRlcm4gaW50IGlweGl0Zl9kZW11eF9zb2NrZXQoc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYywKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgY29weSk7CitleHRlcm4gaW50IGlweGl0Zl9zZW5kKHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMsIHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICAgICBjaGFyICpub2RlKTsKK2V4dGVybiBzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaXB4aXRmX2ZpbmRfdXNpbmdfbmV0KF9fdTMyIG5ldCk7CisKK3N0cnVjdCBpcHhfcm91dGUgKmlweHJ0cl9sb29rdXAoX191MzIgbmV0KQoreworCXN0cnVjdCBpcHhfcm91dGUgKnI7CisKKwlyZWFkX2xvY2tfYmgoJmlweF9yb3V0ZXNfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyLCAmaXB4X3JvdXRlcywgbm9kZSkKKwkJaWYgKHItPmlyX25ldCA9PSBuZXQpIHsKKwkJCWlweHJ0cl9ob2xkKHIpOworCQkJZ290byB1bmxvY2s7CisJCX0KKwlyID0gTlVMTDsKK3VubG9jazoKKwlyZWFkX3VubG9ja19iaCgmaXB4X3JvdXRlc19sb2NrKTsKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIENhbGxlciBtdXN0IGhvbGQgYSByZWZlcmVuY2UgdG8gaW50cmZjCisgKi8KK2ludCBpcHhydHJfYWRkX3JvdXRlKF9fdTMyIG5ldHdvcmssIHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMsCisJCSAgICAgdW5zaWduZWQgY2hhciAqbm9kZSkKK3sKKwlzdHJ1Y3QgaXB4X3JvdXRlICpydDsKKwlpbnQgcmM7CisKKwkvKiBHZXQgYSByb3V0ZSBzdHJ1Y3R1cmU7IGVpdGhlciBleGlzdGluZyBvciBjcmVhdGUgKi8KKwlydCA9IGlweHJ0cl9sb29rdXAobmV0d29yayk7CisJaWYgKCFydCkgeworCQlydCA9IGttYWxsb2Moc2l6ZW9mKCpydCksIEdGUF9BVE9NSUMpOworCQlyYyA9IC1FQUdBSU47CisJCWlmICghcnQpCisJCQlnb3RvIG91dDsKKworCQlhdG9taWNfc2V0KCZydC0+cmVmY250LCAxKTsKKwkJaXB4cnRyX2hvbGQocnQpOworCQl3cml0ZV9sb2NrX2JoKCZpcHhfcm91dGVzX2xvY2spOworCQlsaXN0X2FkZCgmcnQtPm5vZGUsICZpcHhfcm91dGVzKTsKKwkJd3JpdGVfdW5sb2NrX2JoKCZpcHhfcm91dGVzX2xvY2spOworCX0gZWxzZSB7CisJCXJjID0gLUVFWElTVDsKKwkJaWYgKGludHJmYyA9PSBpcHhfaW50ZXJuYWxfbmV0KQorCQkJZ290byBvdXRfcHV0OworCX0KKworCXJ0LT5pcl9uZXQgCT0gbmV0d29yazsKKwlydC0+aXJfaW50cmZjIAk9IGludHJmYzsKKwlpZiAoIW5vZGUpIHsKKwkJbWVtc2V0KHJ0LT5pcl9yb3V0ZXJfbm9kZSwgJ1wwJywgSVBYX05PREVfTEVOKTsKKwkJcnQtPmlyX3JvdXRlZCA9IDA7CisJfSBlbHNlIHsKKwkJbWVtY3B5KHJ0LT5pcl9yb3V0ZXJfbm9kZSwgbm9kZSwgSVBYX05PREVfTEVOKTsKKwkJcnQtPmlyX3JvdXRlZCA9IDE7CisJfQorCisJcmMgPSAwOworb3V0X3B1dDoKKwlpcHhydHJfcHV0KHJ0KTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgaXB4cnRyX2RlbF9yb3V0ZXMoc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYykKK3sKKwlzdHJ1Y3QgaXB4X3JvdXRlICpyLCAqdG1wOworCisJd3JpdGVfbG9ja19iaCgmaXB4X3JvdXRlc19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUociwgdG1wLCAmaXB4X3JvdXRlcywgbm9kZSkKKwkJaWYgKHItPmlyX2ludHJmYyA9PSBpbnRyZmMpIHsKKwkJCWxpc3RfZGVsKCZyLT5ub2RlKTsKKwkJCWlweHJ0cl9wdXQocik7CisJCX0KKwl3cml0ZV91bmxvY2tfYmgoJmlweF9yb3V0ZXNfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgaXB4cnRyX2NyZWF0ZShzdHJ1Y3QgaXB4X3JvdXRlX2RlZmluaXRpb24gKnJkKQoreworCXN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmM7CisJaW50IHJjID0gLUVORVRVTlJFQUNIOworCisJLyogRmluZCB0aGUgYXBwcm9wcmlhdGUgaW50ZXJmYWNlICovCisJaW50cmZjID0gaXB4aXRmX2ZpbmRfdXNpbmdfbmV0KHJkLT5pcHhfcm91dGVyX25ldHdvcmspOworCWlmICghaW50cmZjKQorCQlnb3RvIG91dDsKKwlyYyA9IGlweHJ0cl9hZGRfcm91dGUocmQtPmlweF9uZXR3b3JrLCBpbnRyZmMsIHJkLT5pcHhfcm91dGVyX25vZGUpOworCWlweGl0Zl9wdXQoaW50cmZjKTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgaXB4cnRyX2RlbGV0ZShsb25nIG5ldCkKK3sKKwlzdHJ1Y3QgaXB4X3JvdXRlICpyLCAqdG1wOworCWludCByYzsKKworCXdyaXRlX2xvY2tfYmgoJmlweF9yb3V0ZXNfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHIsIHRtcCwgJmlweF9yb3V0ZXMsIG5vZGUpCisJCWlmIChyLT5pcl9uZXQgPT0gbmV0KSB7CisJCQkvKiBEaXJlY3RseSBjb25uZWN0ZWQ7IGNhbid0IGxvc2Ugcm91dGUgKi8KKwkJCXJjID0gLUVQRVJNOworCQkJaWYgKCFyLT5pcl9yb3V0ZWQpCisJCQkJZ290byBvdXQ7CisJCQlsaXN0X2RlbCgmci0+bm9kZSk7CisJCQlpcHhydHJfcHV0KHIpOworCQkJcmMgPSAwOworCQkJZ290byBvdXQ7CisJCX0KKwlyYyA9IC1FTk9FTlQ7CitvdXQ6CisJd3JpdGVfdW5sb2NrX2JoKCZpcHhfcm91dGVzX2xvY2spOworCXJldHVybiByYzsKK30KKworLyoKKyAqIFRoZSBza2IgaGFzIHRvIGJlIHVuc2hhcmVkLCB3ZSdsbCBlbmQgdXAgY2FsbGluZyBpcHhpdGZfc2VuZCwgdGhhdCdsbAorICogbW9kaWZ5IHRoZSBwYWNrZXQKKyAqLworaW50IGlweHJ0cl9yb3V0ZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXB4aGRyICppcHggPSBpcHhfaGRyKHNrYik7CisJc3RydWN0IGlweF9yb3V0ZSAqciA9IGlweHJ0cl9sb29rdXAoSVBYX1NLQl9DQihza2IpLT5pcHhfZGVzdF9uZXQpOworCisJaWYgKCFyKSB7CS8qIG5vIGtub3duIHJvdXRlICovCisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpcHhpdGZfaG9sZChyLT5pcl9pbnRyZmMpOworCWlweGl0Zl9zZW5kKHItPmlyX2ludHJmYywgc2tiLCByLT5pcl9yb3V0ZWQgPworCQkJci0+aXJfcm91dGVyX25vZGUgOiBpcHgtPmlweF9kZXN0Lm5vZGUpOworCWlweGl0Zl9wdXQoci0+aXJfaW50cmZjKTsKKwlpcHhydHJfcHV0KHIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSb3V0ZSBhbiBvdXRnb2luZyBmcmFtZSBmcm9tIGEgc29ja2V0LgorICovCitpbnQgaXB4cnRyX3JvdXRlX3BhY2tldChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrYWRkcl9pcHggKnVzaXB4LAorCQkJc3RydWN0IGlvdmVjICppb3YsIHNpemVfdCBsZW4sIGludCBub2Jsb2NrKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGlweF9zb2NrICppcHhzID0gaXB4X3NrKHNrKTsKKwlzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjOworCXN0cnVjdCBpcHhoZHIgKmlweDsKKwlzaXplX3Qgc2l6ZTsKKwlpbnQgaXB4X29mZnNldDsKKwlzdHJ1Y3QgaXB4X3JvdXRlICpydCA9IE5VTEw7CisJaW50IHJjOworCisJLyogRmluZCB0aGUgYXBwcm9wcmlhdGUgaW50ZXJmYWNlIG9uIHdoaWNoIHRvIHNlbmQgcGFja2V0ICovCisJaWYgKCF1c2lweC0+c2lweF9uZXR3b3JrICYmIGlweF9wcmltYXJ5X25ldCkgeworCQl1c2lweC0+c2lweF9uZXR3b3JrID0gaXB4X3ByaW1hcnlfbmV0LT5pZl9uZXRudW07CisJCWludHJmYyA9IGlweF9wcmltYXJ5X25ldDsKKwl9IGVsc2UgeworCQlydCA9IGlweHJ0cl9sb29rdXAodXNpcHgtPnNpcHhfbmV0d29yayk7CisJCXJjID0gLUVORVRVTlJFQUNIOworCQlpZiAoIXJ0KQorCQkJZ290byBvdXQ7CisJCWludHJmYyA9IHJ0LT5pcl9pbnRyZmM7CisJfQorCisJaXB4aXRmX2hvbGQoaW50cmZjKTsKKwlpcHhfb2Zmc2V0ID0gaW50cmZjLT5pZl9pcHhfb2Zmc2V0OworCXNpemUgPSBzaXplb2Yoc3RydWN0IGlweGhkcikgKyBsZW4gKyBpcHhfb2Zmc2V0OworCisJc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywgc2l6ZSwgbm9ibG9jaywgJnJjKTsKKwlpZiAoIXNrYikKKwkJZ290byBvdXRfcHV0OworCisJc2tiX3Jlc2VydmUoc2tiLCBpcHhfb2Zmc2V0KTsKKwlza2ItPnNrID0gc2s7CisKKwkvKiBGaWxsIGluIElQWCBoZWFkZXIgKi8KKwlza2ItPmgucmF3ID0gc2tiLT5uaC5yYXcgPSBza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHhoZHIpKTsKKwlpcHggPSBpcHhfaGRyKHNrYik7CisJaXB4LT5pcHhfcGt0c2l6ZSA9IGh0b25zKGxlbiArIHNpemVvZihzdHJ1Y3QgaXB4aGRyKSk7CisJSVBYX1NLQl9DQihza2IpLT5pcHhfdGN0cmwgPSAwOworCWlweC0+aXB4X3R5cGUgCSA9IHVzaXB4LT5zaXB4X3R5cGU7CisKKwlJUFhfU0tCX0NCKHNrYiktPmxhc3RfaG9wLmluZGV4ID0gLTE7CisjaWZkZWYgQ09ORklHX0lQWF9JTlRFUk4KKwlJUFhfU0tCX0NCKHNrYiktPmlweF9zb3VyY2VfbmV0ID0gaXB4cy0+aW50cmZjLT5pZl9uZXRudW07CisJbWVtY3B5KGlweC0+aXB4X3NvdXJjZS5ub2RlLCBpcHhzLT5ub2RlLCBJUFhfTk9ERV9MRU4pOworI2Vsc2UKKwlyYyA9IG50b2hzKGlweHMtPnBvcnQpOworCWlmIChyYyA9PSAweDQ1MyB8fCByYyA9PSAweDQ1MikgeworCQkvKiBSSVAvU0FQIHNwZWNpYWwgaGFuZGxpbmcgZm9yIG1hcnNfbndlICovCisJCUlQWF9TS0JfQ0Ioc2tiKS0+aXB4X3NvdXJjZV9uZXQgPSBpbnRyZmMtPmlmX25ldG51bTsKKwkJbWVtY3B5KGlweC0+aXB4X3NvdXJjZS5ub2RlLCBpbnRyZmMtPmlmX25vZGUsIElQWF9OT0RFX0xFTik7CisJfSBlbHNlIHsKKwkJSVBYX1NLQl9DQihza2IpLT5pcHhfc291cmNlX25ldCA9IGlweHMtPmludHJmYy0+aWZfbmV0bnVtOworCQltZW1jcHkoaXB4LT5pcHhfc291cmNlLm5vZGUsIGlweHMtPmludHJmYy0+aWZfbm9kZSwKKwkJCUlQWF9OT0RFX0xFTik7CisJfQorI2VuZGlmCS8qIENPTkZJR19JUFhfSU5URVJOICovCisJaXB4LT5pcHhfc291cmNlLnNvY2sJCT0gaXB4cy0+cG9ydDsKKwlJUFhfU0tCX0NCKHNrYiktPmlweF9kZXN0X25ldAk9IHVzaXB4LT5zaXB4X25ldHdvcms7CisJbWVtY3B5KGlweC0+aXB4X2Rlc3Qubm9kZSwgdXNpcHgtPnNpcHhfbm9kZSwgSVBYX05PREVfTEVOKTsKKwlpcHgtPmlweF9kZXN0LnNvY2sJCT0gdXNpcHgtPnNpcHhfcG9ydDsKKworCXJjID0gbWVtY3B5X2Zyb21pb3ZlYyhza2JfcHV0KHNrYiwgbGVuKSwgaW92LCBsZW4pOworCWlmIChyYykgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJZ290byBvdXRfcHV0OworCX0JCisKKwkvKiBBcHBseSBjaGVja3N1bS4gTm90IGFsbG93ZWQgb24gODAyLjMgbGlua3MuICovCisJaWYgKHNrLT5za19ub19jaGVjayB8fCBpbnRyZmMtPmlmX2RsaW5rX3R5cGUgPT0gSVBYX0ZSQU1FXzgwMjMpCisJCWlweC0+aXB4X2NoZWNrc3VtID0gMHhGRkZGOworCWVsc2UKKwkJaXB4LT5pcHhfY2hlY2tzdW0gPSBpcHhfY2tzdW0oaXB4LCBsZW4gKyBzaXplb2Yoc3RydWN0IGlweGhkcikpOworCisJcmMgPSBpcHhpdGZfc2VuZChpbnRyZmMsIHNrYiwgKHJ0ICYmIHJ0LT5pcl9yb3V0ZWQpID8gCisJCQkgcnQtPmlyX3JvdXRlcl9ub2RlIDogaXB4LT5pcHhfZGVzdC5ub2RlKTsKK291dF9wdXQ6CisJaXB4aXRmX3B1dChpbnRyZmMpOworCWlmIChydCkKKwkJaXB4cnRyX3B1dChydCk7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCisvKgorICogV2UgdXNlIGEgbm9ybWFsIHN0cnVjdCBydGVudHJ5IGZvciByb3V0ZSBoYW5kbGluZworICovCitpbnQgaXB4cnRyX2lvY3RsKHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IHJ0ZW50cnkgcnQ7CS8qIFVzZSB0aGVzZSB0byBiZWhhdmUgbGlrZSAnb3RoZXInIHN0YWNrcyAqLworCXN0cnVjdCBzb2NrYWRkcl9pcHggKnNnLCAqc3Q7CisJaW50IHJjID0gLUVGQVVMVDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcnQsIGFyZywgc2l6ZW9mKHJ0KSkpCisJCWdvdG8gb3V0OworCisJc2cgPSAoc3RydWN0IHNvY2thZGRyX2lweCAqKSZydC5ydF9nYXRld2F5OworCXN0ID0gKHN0cnVjdCBzb2NrYWRkcl9pcHggKikmcnQucnRfZHN0OworCisJcmMgPSAtRUlOVkFMOworCWlmICghKHJ0LnJ0X2ZsYWdzICYgUlRGX0dBVEVXQVkpIHx8IC8qIERpcmVjdCByb3V0ZXMgYXJlIGZpeGVkICovCisJICAgIHNnLT5zaXB4X2ZhbWlseSAhPSBBRl9JUFggfHwKKwkgICAgc3QtPnNpcHhfZmFtaWx5ICE9IEFGX0lQWCkKKwkJZ290byBvdXQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0RFTFJUOgorCQlyYyA9IGlweHJ0cl9kZWxldGUoc3QtPnNpcHhfbmV0d29yayk7CisJCWJyZWFrOworCWNhc2UgU0lPQ0FERFJUOiB7CisJCXN0cnVjdCBpcHhfcm91dGVfZGVmaW5pdGlvbiBmOworCQlmLmlweF9uZXR3b3JrCQk9IHN0LT5zaXB4X25ldHdvcms7CisJCWYuaXB4X3JvdXRlcl9uZXR3b3JrCT0gc2ctPnNpcHhfbmV0d29yazsKKwkJbWVtY3B5KGYuaXB4X3JvdXRlcl9ub2RlLCBzZy0+c2lweF9ub2RlLCBJUFhfTk9ERV9MRU4pOworCQlyYyA9IGlweHJ0cl9jcmVhdGUoJmYpOworCQlicmVhazsKKwl9CisJfQorCitvdXQ6CisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvbmV0L2lweC9zeXNjdGxfbmV0X2lweC5jIGIvbmV0L2lweC9zeXNjdGxfbmV0X2lweC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMGVkYTkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB4L3N5c2N0bF9uZXRfaXB4LmMKQEAgLTAsMCArMSw2MiBAQAorLyogLSotIGxpbnV4LWMgLSotCisgKiBzeXNjdGxfbmV0X2lweC5jOiBzeXNjdGwgaW50ZXJmYWNlIHRvIG5ldCBJUFggc3Vic3lzdGVtLgorICoKKyAqIEJlZ3VuIEFwcmlsIDEsIDE5OTYsIE1pa2UgU2hhdmVyLgorICogQWRkZWQgL3Byb2Mvc3lzL25ldC9pcHggZGlyZWN0b3J5IGVudHJ5IChlbXB0eSA9KSApLiBbTVNdCisgKiBBZGRlZCAvcHJvYy9zeXMvbmV0L2lweC9pcHhfcHByb3BfYnJvYWRjYXN0aW5nIC0gYWNtZSBNYXJjaCA0LCAyMDAxCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisKKyNpZm5kZWYgQ09ORklHX1NZU0NUTAorI2Vycm9yIFRoaXMgZmlsZSBzaG91bGQgbm90IGJlIGNvbXBpbGVkIHdpdGhvdXQgQ09ORklHX1NZU0NUTCBkZWZpbmVkCisjZW5kaWYKKworLyogRnJvbSBhZl9pcHguYyAqLworZXh0ZXJuIGludCBzeXNjdGxfaXB4X3Bwcm9wX2Jyb2FkY2FzdGluZzsKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgaXB4X3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBORVRfSVBYX1BQUk9QX0JST0FEQ0FTVElORywKKwkJLnByb2NuYW1lCT0gImlweF9wcHJvcF9icm9hZGNhc3RpbmciLAorCQkuZGF0YQkJPSAmc3lzY3RsX2lweF9wcHJvcF9icm9hZGNhc3RpbmcsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsgMCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgaXB4X2Rpcl90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQWCwKKwkJLnByb2NuYW1lCT0gImlweCIsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSBpcHhfdGFibGUsCisgICAgICAgCX0sCisJeyAwIH0sCit9OworCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZSBpcHhfcm9vdF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX05FVCwKKwkJLnByb2NuYW1lCT0gIm5ldCIsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSBpcHhfZGlyX3RhYmxlLAorCX0sCisJeyAwIH0sCit9OworCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmlweF90YWJsZV9oZWFkZXI7CisKK3ZvaWQgaXB4X3JlZ2lzdGVyX3N5c2N0bCh2b2lkKQoreworCWlweF90YWJsZV9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUoaXB4X3Jvb3RfdGFibGUsIDEpOworfQorCit2b2lkIGlweF91bnJlZ2lzdGVyX3N5c2N0bCh2b2lkKQoreworCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGlweF90YWJsZV9oZWFkZXIpOworfQpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvS2NvbmZpZyBiL25ldC9pcmRhL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVmYjE3YgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL0tjb25maWcKQEAgLTAsMCArMSw5NiBAQAorIworIyBJckRBIHByb3RvY29sIGNvbmZpZ3VyYXRpb24KKyMKKworbWVudWNvbmZpZyBJUkRBCisJZGVwZW5kcyBvbiBORVQKKwl0cmlzdGF0ZSAiSXJEQSAoaW5mcmFyZWQpIHN1YnN5c3RlbSBzdXBwb3J0IgorCXNlbGVjdCBDUkNfQ0NJVFQKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBJckRBIChUTSkgcHJvdG9jb2xzLgorCSAgVGhlIEluZnJhcmVkIERhdGEgQXNzb2NpYXRpb25zICh0bSkgc3BlY2lmaWVzIHN0YW5kYXJkcyBmb3Igd2lyZWxlc3MKKwkgIGluZnJhcmVkIGNvbW11bmljYXRpb24gYW5kIGlzIHN1cHBvcnRlZCBieSBtb3N0IGxhcHRvcHMgYW5kIFBEQSdzLgorCisJICBUbyB1c2UgTGludXggc3VwcG9ydCBmb3IgdGhlIElyREEgKHRtKSBwcm90b2NvbHMsIHlvdSB3aWxsIGFsc28gbmVlZAorCSAgc29tZSB1c2VyLXNwYWNlIHV0aWxpdGllcyBsaWtlIGlyYXR0YWNoLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQorCSAgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lyZGEudHh0Pi4gIFlvdSBhbHNvIHdhbnQgdG8KKwkgIHJlYWQgdGhlIElSLUhPV1RPLCBhdmFpbGFibGUgYXQKKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIElmIHlvdSB3YW50IHRvIGV4Y2hhbmdlIGJpdHMgb2YgZGF0YSAodkNhbCwgdkNhcmQpIHdpdGggYSBQREEsIHlvdQorCSAgd2lsbCBuZWVkIHRvIGluc3RhbGwgc29tZSBPQkVYIGFwcGxpY2F0aW9uLCBzdWNoIGFzIE9wZW5PYmV4IDoKKwkgIDxodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL29wZW5vYmV4Lz4KKworCSAgVG8gY29tcGlsZSB0aGlzIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIGlyZGEuCisKK2NvbW1lbnQgIklyREEgcHJvdG9jb2xzIgorCWRlcGVuZHMgb24gSVJEQQorCitzb3VyY2UgIm5ldC9pcmRhL2lybGFuL0tjb25maWciCisKK3NvdXJjZSAibmV0L2lyZGEvaXJuZXQvS2NvbmZpZyIKKworc291cmNlICJuZXQvaXJkYS9pcmNvbW0vS2NvbmZpZyIKKworY29uZmlnIElSREFfVUxUUkEKKwlib29sICJVbHRyYSAoY29ubmVjdGlvbmxlc3MpIHByb3RvY29sIgorCWRlcGVuZHMgb24gSVJEQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgY29ubmVjdGlvbmxlc3MgVWx0cmEgSVJEQSBwcm90b2NvbC4KKwkgIFVsdHJhIGFsbG93cyB0byBleGNoYW5nZSBkYXRhIG92ZXIgSXJEQSB3aXRoIHJlYWxseSBzaW1wbGUgZGV2aWNlcworCSAgKHdhdGNoLCBiZWFjb24pIHdpdGhvdXQgdGhlIG92ZXJoZWFkIG9mIHRoZSBJckRBIHByb3RvY29sIChubyBoYW5kc2hha2luZywKKwkgIG5vIG1hbmFnZW1lbnQgZnJhbWVzLCBzaW1wbGUgZml4ZWQgaGVhZGVyKS4KKwkgIFVsdHJhIGlzIGF2YWlsYWJsZSBhcyBhIHNwZWNpYWwgc29ja2V0IDogc29ja2V0KEFGX0lSREEsIFNPQ0tfREdSQU0sIDEpOworCitjb21tZW50ICJJckRBIG9wdGlvbnMiCisJZGVwZW5kcyBvbiBJUkRBCisKK2NvbmZpZyBJUkRBX0NBQ0hFX0xBU1RfTFNBUAorCWJvb2wgIkNhY2hlIGxhc3QgTFNBUCIKKwlkZXBlbmRzIG9uIElSREEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IElyTE1QIHRvIGNhY2hlIHRoZSBsYXN0IExTQVAgdXNlZC4gIFRoaXMKKwkgIG1ha2VzIHNlbnNlIHNpbmNlIG1vc3QgZnJhbWVzIHdpbGwgYmUgc2VudC9yZWNlaXZlZCBvbiB0aGUgc2FtZQorCSAgY29ubmVjdGlvbi4gIEVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgc2F2ZSBhIGhhc2gtbG9va3VwIHBlciBmcmFtZS4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIElSREFfRkFTVF9SUgorCWJvb2wgIkZhc3QgUlJzIChsb3cgbGF0ZW5jeSkiCisJZGVwZW5kcyBvbiBJUkRBCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpcyB5b3Ugd2FudCBJckxBUCB0byBzZW5kIGZhc3QgUlIgKFJlY2VpdmUgUmVhZHkpIGZyYW1lcworCSAgd2hlbiBhY3RpbmcgYXMgYSBwcmltYXJ5IHN0YXRpb24uCisJICBEaXNhYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBtYWtlIGxhdGVuY3kgb3ZlciBJckRBIHZlcnkgYmFkLiBFbmFibGluZworCSAgdGhpcyBvcHRpb24gd2lsbCBtYWtlIHRoZSBJckRBIHN0YWNrIHNlbmQgbW9yZSBwYWNrZXQgdGhhbiBzdHJpY3RseQorCSAgbmVjZXNzYXJ5LCB0aHVzIHJlZHVjZSB5b3VyIGJhdHRlcnkgbGlmZSAoYnV0IG5vdCB0aGF0IG11Y2gpLgorCisJICBGYXN0IFJSIHdpbGwgbWFrZSBJckxBUCBzZW5kIG91dCBhIFJSIGZyYW1lIGltbWVkaWF0ZWx5IHdoZW4KKwkgIHJlY2VpdmluZyBhIGZyYW1lIGlmIGl0cyBvd24gdHJhbnNtaXQgcXVldWUgaXMgY3VycmVudGx5IGVtcHR5LiBUaGlzCisJICB3aWxsIGdpdmUgYSBsb3Qgb2Ygc3BlZWQgaW1wcm92ZW1lbnQgd2hlbiByZWNlaXZpbmcgbXVjaCBkYXRhIHNpbmNlCisJICB0aGUgc2Vjb25kYXJ5IHN0YXRpb24gd2lsbCBub3QgaGF2ZSB0byB3YWl0IHRoZSBtYXguIHR1cm4gYXJvdW5kCisJICB0aW1lICh1c3VhbGx5IDUwMG1zKSBiZWZvcmUgaXQgaXMgYWxsb3dlZCB0byB0cmFuc21pdCB0aGUgbmV4dCB0aW1lLgorCSAgSWYgdGhlIHRyYW5zbWl0IHF1ZXVlIG9mIHRoZSBzZWNvbmRhcnkgaXMgYWxzbyBlbXB0eSwgdGhlIHByaW1hcnkgd2lsbAorCSAgc3RhcnQgYmFja2luZy1vZmYgYmVmb3JlIHNlbmRpbmcgYW5vdGhlciBSUiBmcmFtZSwgd2FpdGluZyBsb25nZXIKKwkgIGVhY2ggdGltZSB1bnRpbCB0aGUgYmFjay1vZmYgcmVhY2hlcyB0aGUgbWF4LiB0dXJuIGFyb3VuZCB0aW1lLgorCSAgVGhpcyBiYWNrLW9mZiBpbmNyZWFzZSBpbiBjb250cm9sbGVkIHZpYQorCSAgL3Byb2Mvc3lzL25ldC9pcmRhL2Zhc3RfcG9sbF9pbmNyZWFzZQorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgSVJEQV9ERUJVRworCWJvb2wgIkRlYnVnIGluZm9ybWF0aW9uIgorCWRlcGVuZHMgb24gSVJEQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdGhlIElyREEgc3Vic3lzdGVtIHRvIHdyaXRlIGRlYnVnIGluZm9ybWF0aW9uCisJICB0byB5b3VyIHN5c2xvZy4gWW91IGNhbiBjaGFuZ2UgdGhlIGRlYnVnIGxldmVsIGluCisJICAvcHJvYy9zeXMvbmV0L2lyZGEvZGVidWcgLgorCSAgV2hlbiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGUgSXJEQSBhbHNvIHBlcmZvcm0gbWFueSBleHRyYSBpbnRlcm5hbAorCSAgdmVyaWZpY2F0aW9ucyB3aGljaCB3aWxsIHVzdWFsbHkgcHJldmVudCB0aGUga2VybmVsIHRvIGNyYXNoIGluIGNhc2Ugb2YKKwkgIGJ1Z3MuCisKKwkgIElmIHVuc3VyZSwgc2F5IFkgKHNpbmNlIGl0IG1ha2VzIGl0IGVhc2llciB0byBmaW5kIHRoZSBidWdzKS4KKworc291cmNlICJkcml2ZXJzL25ldC9pcmRhL0tjb25maWciCisKZGlmZiAtLWdpdCBhL25ldC9pcmRhL01ha2VmaWxlIGIvbmV0L2lyZGEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEzNjZjMgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBJckRBIHByb3RvY29sIGxheWVyLgorIworCitvYmotJChDT05GSUdfSVJEQSkgKz0gaXJkYS5vCitvYmotJChDT05GSUdfSVJMQU4pICs9IGlybGFuLworb2JqLSQoQ09ORklHX0lSTkVUKSArPSBpcm5ldC8KK29iai0kKENPTkZJR19JUkNPTU0pICs9IGlyY29tbS8KKworaXJkYS15IDo9IGlyaWFwLm8gaXJpYXBfZXZlbnQubyBpcmxtcC5vIGlybG1wX2V2ZW50Lm8gaXJsbXBfZnJhbWUubyBcCisgICAgICAgICAgaXJsYXAubyBpcmxhcF9ldmVudC5vIGlybGFwX2ZyYW1lLm8gdGltZXIubyBxb3MubyBpcnF1ZXVlLm8gXAorICAgICAgICAgIGlydHRwLm8gaXJkYV9kZXZpY2UubyBpcmlhc19vYmplY3QubyB3cmFwcGVyLm8gYWZfaXJkYS5vIFwKKwkgIGRpc2NvdmVyeS5vIHBhcmFtZXRlcnMubyBpcm1vZC5vCitpcmRhLSQoQ09ORklHX1BST0NfRlMpICs9IGlycHJvYy5vCitpcmRhLSQoQ09ORklHX1NZU0NUTCkgKz0gaXJzeXNjdGwubwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvYWZfaXJkYS5jIGIvbmV0L2lyZGEvYWZfaXJkYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYzZlOGQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9hZl9pcmRhLmMKQEAgLTAsMCArMSwyNTg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRmlsZW5hbWU6ICAgICAgYWZfaXJkYS5jCisgKiBWZXJzaW9uOiAgICAgICAwLjkKKyAqIERlc2NyaXB0aW9uOiAgIElyREEgc29ja2V0cyBpbXBsZW1lbnRhdGlvbgorICogU3RhdHVzOiAgICAgICAgU3RhYmxlCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBTdW4gTWF5IDMxIDEwOjEyOjQzIDE5OTgKKyAqIE1vZGlmaWVkIGF0OiAgIFNhdCBEZWMgMjUgMjE6MTA6MjMgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ0BicmF0dGxpLm5ldD4KKyAqIFNvdXJjZXM6ICAgICAgIGFmX25ldHJvb20uYywgYWZfYXgyNS5jLCBhZl9yb3NlLmMsIGFmX3gyNS5jIGV0Yy4KKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5IERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMyBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgICBMaW51eC1JckRBIG5vdyBzdXBwb3J0cyBmb3VyIGRpZmZlcmVudCB0eXBlcyBvZiBJckRBIHNvY2tldHM6CisgKgorICogICAgIG8gU09DS19TVFJFQU06ICAgIFRpbnlUUCBjb25uZWN0aW9ucyB3aXRoIFNBUiBkaXNhYmxlZC4gVGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgbWF4IFNEVSBzaXplIGlzIDAgZm9yIGNvbm4uIG9mIHRoaXMgdHlwZQorICogICAgIG8gU09DS19TRVFQQUNLRVQ6IFRpbnlUUCBjb25uZWN0aW9ucyB3aXRoIFNBUiBlbmFibGVkLiBUVFAgbWF5CisgKiAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgdGhlIG1lc3NhZ2VzLCBidXQgd2lsbCBwcmVzZXJ2ZQorICogICAgICAgICAgICAgICAgICAgICAgIHRoZSBtZXNzYWdlIGJvdW5kYXJpZXMKKyAqICAgICBvIFNPQ0tfREdSQU06ICAgICBJUkRBUFJPVE9fVU5JVERBVEE6IFRpbnlUUCBjb25uZWN0aW9ucyB3aXRoIFVuaXRkYXRhCisgKiAgICAgICAgICAgICAgICAgICAgICAgKHVucmVsaWFibGUpIHRyYW5zZmVycworICogICAgICAgICAgICAgICAgICAgICAgIElSREFQUk9UT19VTFRSQTogQ29ubmVjdGlvbmxlc3MgYW5kIHVucmVsaWFibGUgZGF0YQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcmRhLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorCisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgkJLyogVElPQ09VVFEsIFRJT0NJTlEgKi8KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9hZl9pcmRhLmg+CisKK3N0YXRpYyBpbnQgaXJkYV9jcmVhdGUoc3RydWN0IHNvY2tldCAqc29jaywgaW50IHByb3RvY29sKTsKKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgaXJkYV9zdHJlYW1fb3BzOworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgaXJkYV9zZXFwYWNrZXRfb3BzOworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgaXJkYV9kZ3JhbV9vcHM7CisKKyNpZmRlZiBDT05GSUdfSVJEQV9VTFRSQQorc3RhdGljIHN0cnVjdCBwcm90b19vcHMgaXJkYV91bHRyYV9vcHM7CisjZGVmaW5lIFVMVFJBX01BWF9EQVRBIDM4MgorI2VuZGlmIC8qIENPTkZJR19JUkRBX1VMVFJBICovCisKKyNkZWZpbmUgSVJEQV9NQVhfSEVBREVSIChUVFBfTUFYX0hFQURFUikKKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfZGF0YV9pbmRpY2F0aW9uIChpbnN0YW5jZSwgc2FwLCBza2IpCisgKgorICogICAgUmVjZWl2ZWQgc29tZSBkYXRhIGZyb20gVGlueVRQLiBKdXN0IHF1ZXVlIGl0IG9uIHRoZSByZWNlaXZlIHF1ZXVlCisgKgorICovCitzdGF0aWMgaW50IGlyZGFfZGF0YV9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlyZGFfc29jayAqc2VsZjsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJaW50IGVycjsKKworCUlSREFfREVCVUcoMywgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzZWxmID0gaW5zdGFuY2U7CisJc2sgPSBpbnN0YW5jZTsKKwlJUkRBX0FTU0VSVChzayAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCWVyciA9IHNvY2tfcXVldWVfcmN2X3NrYihzaywgc2tiKTsKKwlpZiAoZXJyKSB7CisJCUlSREFfREVCVUcoMSwgIiVzKCksIGVycm9yOiBubyBtb3JlIG1lbSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXNlbGYtPnJ4X2Zsb3cgPSBGTE9XX1NUT1A7CisKKwkJLyogV2hlbiB3ZSByZXR1cm4gZXJyb3IsIFRUUCB3aWxsIG5lZWQgdG8gcmVxdWV1ZSB0aGUgc2tiICovCisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbiAoaW5zdGFuY2UsIHNhcCwgcmVhc29uLCBza2IpCisgKgorICogICAgQ29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQuIENoZWNrIHJlYXNvbiB0byBmaW5kIG91dCB3aHkKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlyZGFfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJICAgICAgIExNX1JFQVNPTiByZWFzb24sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlyZGFfc29jayAqc2VsZjsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlzZWxmID0gaW5zdGFuY2U7CisKKwlJUkRBX0RFQlVHKDIsICIlcyglcClcbiIsIF9fRlVOQ1RJT05fXywgc2VsZik7CisKKwkvKiBEb24ndCBjYXJlIGFib3V0IGl0LCBidXQgbGV0J3Mgbm90IGxlYWsgaXQgKi8KKwlpZihza2IpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXNrID0gaW5zdGFuY2U7CisJaWYgKHNrID09IE5VTEwpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoJXApIDogQlVHIDogc2sgaXMgTlVMTFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgc2VsZik7CisJCXJldHVybjsKKwl9CisKKwkvKiBQcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aXRoIGlyZGFfcmVsZWFzZSgpIGFuZCBpcmRhX3NodXRkb3duKCkgKi8KKwlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSAmJiBzay0+c2tfc3RhdGUgIT0gVENQX0NMT1NFKSB7CisJCXNrLT5za19zdGF0ZSAgICAgPSBUQ1BfQ0xPU0U7CisJCXNrLT5za19lcnIgICAgICAgPSBFQ09OTlJFU0VUOworCQlzay0+c2tfc2h1dGRvd24gfD0gU0VORF9TSFVURE9XTjsKKworCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKKwkJLyogVWgtb2guLi4gU2hvdWxkIHVzZSBzb2NrX29ycGhhbiA/ICovCisgICAgICAgICAgICAgICAgc29ja19zZXRfZmxhZyhzaywgU09DS19ERUFEKTsKKworCQkvKiBDbG9zZSBvdXIgVFNBUC4KKwkJICogSWYgd2UgbGVhdmUgaXQgb3BlbiwgSXJMTVAgcHV0IGl0IGJhY2sgaW50byB0aGUgbGlzdCBvZgorCQkgKiB1bmNvbm5lY3RlZCBMU0FQcy4gVGhlIHByb2JsZW0gaXMgdGhhdCBhbnkgaW5jb21pbmcgcmVxdWVzdAorCQkgKiBjYW4gdGhlbiBiZSBtYXRjaGVkIHRvIHRoaXMgc29ja2V0IChhbmQgaXQgd2lsbCBiZSwgYmVjYXVzZQorCQkgKiBpdCBpcyBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCkuIFRoaXMgd291bGQgcHJldmVudCBhbnkKKwkJICogbGlzdGVuaW5nIHNvY2tldCB3YWl0aW5nIG9uIHRoZSBzYW1lIFRTQVAgdG8gZ2V0IHRob3NlCisJCSAqIHJlcXVlc3RzLiBTb21lIGFwcHMgZm9yZ2V0IHRvIGNsb3NlIHNvY2tldHMsIG9yIGhhbmcgdG8gaXQKKwkJICogYSBiaXQgdG9vIGxvbmcsIHNvIHdlIG1heSBzdGF5IGluIHRoaXMgZGVhZCBzdGF0ZSBsb25nCisJCSAqIGVub3VnaCB0byBiZSBub3RpY2VkLi4uCisJCSAqIE5vdGUgOiBhbGwgc29ja2V0IGZ1bmN0aW9uIGRvIGNoZWNrIHNrLT5za19zdGF0ZSwgc28gd2UgYXJlCisJCSAqIHNhZmUuLi4KKwkJICogSmVhbiBJSQorCQkgKi8KKwkJaWYgKHNlbGYtPnRzYXApIHsKKwkJCWlydHRwX2Nsb3NlX3RzYXAoc2VsZi0+dHNhcCk7CisJCQlzZWxmLT50c2FwID0gTlVMTDsKKwkJfQorICAgICAgICB9CisKKwkvKiBOb3RlIDogb25jZSB3ZSBhcmUgdGhlcmUsIHRoZXJlIGlzIG5vdCBtdWNoIHlvdSB3YW50IHRvIGRvCisJICogd2l0aCB0aGUgc29ja2V0IGFueW1vcmUsIGFwYXJ0IGZyb20gY2xvc2luZyBpdC4KKwkgKiBGb3IgZXhhbXBsZSwgYmluZCgpIGFuZCBjb25uZWN0KCkgd29uJ3QgcmVzZXQgc2stPnNrX2VyciwKKwkgKiBzay0+c2tfc2h1dGRvd24gYW5kIHNrLT5za19mbGFncyB0byB2YWxpZCB2YWx1ZXMuLi4KKwkgKiBKZWFuIElJCisJICovCit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2Nvbm5lY3RfY29uZmlybSAoaW5zdGFuY2UsIHNhcCwgcW9zLCBtYXhfc2R1X3NpemUsIHNrYikKKyAqCisgKiAgICBDb25uZWN0aW9ucyBoYXMgYmVlbiBjb25maXJtZWQgYnkgdGhlIHJlbW90ZSBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlyZGFfY29ubmVjdF9jb25maXJtKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJIHN0cnVjdCBxb3NfaW5mbyAqcW9zLAorCQkJCSBfX3UzMiBtYXhfc2R1X3NpemUsIF9fdTggbWF4X2hlYWRlcl9zaXplLAorCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcmRhX3NvY2sgKnNlbGY7CisJc3RydWN0IHNvY2sgKnNrOworCisJc2VsZiA9IGluc3RhbmNlOworCisJSVJEQV9ERUJVRygyLCAiJXMoJXApXG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYpOworCisJc2sgPSBpbnN0YW5jZTsKKwlpZiAoc2sgPT0gTlVMTCkgeworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJLy8gU2hvdWxkIGJlID8/PyBza2JfcXVldWVfdGFpbCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisKKwkvKiBIb3cgbXVjaCBoZWFkZXIgc3BhY2UgZG8gd2UgbmVlZCB0byByZXNlcnZlICovCisJc2VsZi0+bWF4X2hlYWRlcl9zaXplID0gbWF4X2hlYWRlcl9zaXplOworCisJLyogSXJUVFAgbWF4IFNEVSBzaXplIGluIHRyYW5zbWl0IGRpcmVjdGlvbiAqLworCXNlbGYtPm1heF9zZHVfc2l6ZV90eCA9IG1heF9zZHVfc2l6ZTsKKworCS8qIEZpbmQgb3V0IHdoYXQgdGhlIGxhcmdlc3QgY2h1bmsgb2YgZGF0YSB0aGF0IHdlIGNhbiB0cmFuc21pdCBpcyAqLworCXN3aXRjaCAoc2stPnNrX3R5cGUpIHsKKwljYXNlIFNPQ0tfU1RSRUFNOgorCQlpZiAobWF4X3NkdV9zaXplICE9IDApIHsKKwkJCUlSREFfRVJST1IoIiVzOiBtYXhfc2R1X3NpemUgbXVzdCBiZSAwXG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm47CisJCX0KKwkJc2VsZi0+bWF4X2RhdGFfc2l6ZSA9IGlydHRwX2dldF9tYXhfc2VnX3NpemUoc2VsZi0+dHNhcCk7CisJCWJyZWFrOworCWNhc2UgU09DS19TRVFQQUNLRVQ6CisJCWlmIChtYXhfc2R1X3NpemUgPT0gMCkgeworCQkJSVJEQV9FUlJPUigiJXM6IG1heF9zZHVfc2l6ZSBjYW5ub3QgYmUgMFxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuOworCQl9CisJCXNlbGYtPm1heF9kYXRhX3NpemUgPSBtYXhfc2R1X3NpemU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNlbGYtPm1heF9kYXRhX3NpemUgPSBpcnR0cF9nZXRfbWF4X3NlZ19zaXplKHNlbGYtPnRzYXApOworCX07CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBtYXhfZGF0YV9zaXplPSVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCSAgIHNlbGYtPm1heF9kYXRhX3NpemUpOworCisJbWVtY3B5KCZzZWxmLT5xb3NfdHgsIHFvcywgc2l6ZW9mKHN0cnVjdCBxb3NfaW5mbykpOworCisJLyogV2UgYXJlIG5vdyBjb25uZWN0ZWQhICovCisJc2stPnNrX3N0YXRlID0gVENQX0VTVEFCTElTSEVEOworCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9jb25uZWN0X2luZGljYXRpb24oaW5zdGFuY2UsIHNhcCwgcW9zLCBtYXhfc2R1X3NpemUsIHVzZXJkYXRhKQorICoKKyAqICAgIEluY29taW5nIGNvbm5lY3Rpb24KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlyZGFfY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJICAgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLCBfX3UzMiBtYXhfc2R1X3NpemUsCisJCQkJICAgIF9fdTggbWF4X2hlYWRlcl9zaXplLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcmRhX3NvY2sgKnNlbGY7CisJc3RydWN0IHNvY2sgKnNrOworCisJc2VsZiA9IGluc3RhbmNlOworCisJSVJEQV9ERUJVRygyLCAiJXMoJXApXG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYpOworCisJc2sgPSBpbnN0YW5jZTsKKwlpZiAoc2sgPT0gTlVMTCkgeworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisKKwkvKiBIb3cgbXVjaCBoZWFkZXIgc3BhY2UgZG8gd2UgbmVlZCB0byByZXNlcnZlICovCisJc2VsZi0+bWF4X2hlYWRlcl9zaXplID0gbWF4X2hlYWRlcl9zaXplOworCisJLyogSXJUVFAgbWF4IFNEVSBzaXplIGluIHRyYW5zbWl0IGRpcmVjdGlvbiAqLworCXNlbGYtPm1heF9zZHVfc2l6ZV90eCA9IG1heF9zZHVfc2l6ZTsKKworCS8qIEZpbmQgb3V0IHdoYXQgdGhlIGxhcmdlc3QgY2h1bmsgb2YgZGF0YSB0aGF0IHdlIGNhbiB0cmFuc21pdCBpcyAqLworCXN3aXRjaCAoc2stPnNrX3R5cGUpIHsKKwljYXNlIFNPQ0tfU1RSRUFNOgorCQlpZiAobWF4X3NkdV9zaXplICE9IDApIHsKKwkJCUlSREFfRVJST1IoIiVzOiBtYXhfc2R1X3NpemUgbXVzdCBiZSAwXG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybjsKKwkJfQorCQlzZWxmLT5tYXhfZGF0YV9zaXplID0gaXJ0dHBfZ2V0X21heF9zZWdfc2l6ZShzZWxmLT50c2FwKTsKKwkJYnJlYWs7CisJY2FzZSBTT0NLX1NFUVBBQ0tFVDoKKwkJaWYgKG1heF9zZHVfc2l6ZSA9PSAwKSB7CisJCQlJUkRBX0VSUk9SKCIlczogbWF4X3NkdV9zaXplIGNhbm5vdCBiZSAwXG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybjsKKwkJfQorCQlzZWxmLT5tYXhfZGF0YV9zaXplID0gbWF4X3NkdV9zaXplOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzZWxmLT5tYXhfZGF0YV9zaXplID0gaXJ0dHBfZ2V0X21heF9zZWdfc2l6ZShzZWxmLT50c2FwKTsKKwl9OworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgbWF4X2RhdGFfc2l6ZT0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkgICBzZWxmLT5tYXhfZGF0YV9zaXplKTsKKworCW1lbWNweSgmc2VsZi0+cW9zX3R4LCBxb3MsIHNpemVvZihzdHJ1Y3QgcW9zX2luZm8pKTsKKworCXNrYl9xdWV1ZV90YWlsKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKKwlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfY29ubmVjdF9yZXNwb25zZSAoaGFuZGxlKQorICoKKyAqICAgIEFjY2VwdCBpbmNvbWluZyBjb25uZWN0aW9uCisgKgorICovCitzdGF0aWMgdm9pZCBpcmRhX2Nvbm5lY3RfcmVzcG9uc2Uoc3RydWN0IGlyZGFfc29jayAqc2VsZikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKDY0KTsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSBVbmFibGUgdG8gYWxsb2NhdGUgc2tfYnVmZiFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgTVVYX0NPTlRST0wgYW5kIExBUCBoZWFkZXIgKi8KKwlza2JfcmVzZXJ2ZShza2IsIElSREFfTUFYX0hFQURFUik7CisKKwlpcnR0cF9jb25uZWN0X3Jlc3BvbnNlKHNlbGYtPnRzYXAsIHNlbGYtPm1heF9zZHVfc2l6ZV9yeCwgc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfZmxvd19pbmRpY2F0aW9uIChpbnN0YW5jZSwgc2FwLCBmbG93KQorICoKKyAqICAgIFVzZWQgYnkgVGlueVRQIHRvIHRlbGwgdXMgaWYgaXQgY2FuIGFjY2VwdCBtb3JlIGRhdGEgb3Igbm90CisgKgorICovCitzdGF0aWMgdm9pZCBpcmRhX2Zsb3dfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCBMT0NBTF9GTE9XIGZsb3cpCit7CisJc3RydWN0IGlyZGFfc29jayAqc2VsZjsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc2VsZiA9IGluc3RhbmNlOworCXNrID0gaW5zdGFuY2U7CisJSVJEQV9BU1NFUlQoc2sgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlzd2l0Y2ggKGZsb3cpIHsKKwljYXNlIEZMT1dfU1RPUDoKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgSXJUVFAgd2FudHMgdXMgdG8gc2xvdyBkb3duXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJc2VsZi0+dHhfZmxvdyA9IGZsb3c7CisJCWJyZWFrOworCWNhc2UgRkxPV19TVEFSVDoKKwkJc2VsZi0+dHhfZmxvdyA9IGZsb3c7CisJCUlSREFfREVCVUcoMSwgIiVzKCksIElyVFRQIHdhbnRzIHVzIHRvIHN0YXJ0IGFnYWluXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHNrLT5za19zbGVlcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gZmxvdyBjb21tYW5kIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJLyogVW5rbm93biBmbG93IGNvbW1hbmQsIGJldHRlciBzdG9wICovCisJCXNlbGYtPnR4X2Zsb3cgPSBmbG93OworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2dldHZhbHVlX2NvbmZpcm0gKG9ial9pZCwgdmFsdWUsIHByaXYpCisgKgorICogICAgR290IGFuc3dlciBmcm9tIHJlbW90ZSBMTS1JQVMsIGp1c3QgcGFzcyBvYmplY3QgdG8gcmVxdWVzdGVyLi4uCisgKgorICogTm90ZSA6IGR1cGxpY2F0ZSBmcm9tIGFib3ZlLCBidXQgd2UgbmVlZCBvdXIgb3duIHZlcnNpb24gdGhhdAorICogZG9lc24ndCB0b3VjaCB0aGUgZHRzYXBfc2VsIGFuZCBzYXZlIHRoZSBmdWxsIHZhbHVlIHN0cnVjdHVyZS4uLgorICovCitzdGF0aWMgdm9pZCBpcmRhX2dldHZhbHVlX2NvbmZpcm0oaW50IHJlc3VsdCwgX191MTYgb2JqX2lkLAorCQkJCSAgc3RydWN0IGlhc192YWx1ZSAqdmFsdWUsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGlyZGFfc29jayAqc2VsZjsKKworCXNlbGYgPSAoc3RydWN0IGlyZGFfc29jayAqKSBwcml2OworCWlmICghc2VsZikgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBsb3N0IG15c2VsZiFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwlJUkRBX0RFQlVHKDIsICIlcyglcClcbiIsIF9fRlVOQ1RJT05fXywgc2VsZik7CisKKwkvKiBXZSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIG1ha2UgYW55IG1vcmUgcXVlcmllcyAqLworCWlyaWFwX2Nsb3NlKHNlbGYtPmlyaWFwKTsKKwlzZWxmLT5pcmlhcCA9IE5VTEw7CisKKwkvKiBDaGVjayBpZiByZXF1ZXN0IHN1Y2NlZWRlZCAqLworCWlmIChyZXN1bHQgIT0gSUFTX1NVQ0NFU1MpIHsKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgSUFTIHF1ZXJ5IGZhaWxlZCEgKCVkKVxuIiwgX19GVU5DVElPTl9fLAorCQkJICAgcmVzdWx0KTsKKworCQlzZWxmLT5lcnJubyA9IHJlc3VsdDsJLyogV2UgcmVhbGx5IG5lZWQgaXQgbGF0ZXIgKi8KKworCQkvKiBXYWtlIHVwIGFueSBwcm9jZXNzZXMgd2FpdGluZyBmb3IgcmVzdWx0ICovCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2VsZi0+cXVlcnlfd2FpdCk7CisKKwkJcmV0dXJuOworCX0KKworCS8qIFBhc3MgdGhlIG9iamVjdCB0byB0aGUgY2FsbGVyIChzbyB0aGUgY2FsbGVyIG11c3QgZGVsZXRlIGl0KSAqLworCXNlbGYtPmlhc19yZXN1bHQgPSB2YWx1ZTsKKwlzZWxmLT5lcnJubyA9IDA7CisKKwkvKiBXYWtlIHVwIGFueSBwcm9jZXNzZXMgd2FpdGluZyBmb3IgcmVzdWx0ICovCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZWxmLT5xdWVyeV93YWl0KTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfc2VsZWN0aXZlX2Rpc2NvdmVyeV9pbmRpY2F0aW9uIChkaXNjb3ZlcnkpCisgKgorICogICAgR290IGEgc2VsZWN0aXZlIGRpc2NvdmVyeSBpbmRpY2F0aW9uIGZyb20gSXJMTVAuCisgKgorICogSXJMTVAgaXMgdGVsbGluZyB1cyB0aGF0IHRoaXMgbm9kZSBpcyBuZXcgYW5kIG1hdGNoaW5nIG91ciBoaW50IGJpdAorICogZmlsdGVyLiBXYWtlIHVwIGFueSBwcm9jZXNzIHdhaXRpbmcgZm9yIGFuc3dlci4uLgorICovCitzdGF0aWMgdm9pZCBpcmRhX3NlbGVjdGl2ZV9kaXNjb3ZlcnlfaW5kaWNhdGlvbihkaXNjaW5mb190ICpkaXNjb3ZlcnksCisJCQkJCQlESVNDT1ZFUllfTU9ERSBtb2RlLAorCQkJCQkJdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaXJkYV9zb2NrICpzZWxmOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXNlbGYgPSAoc3RydWN0IGlyZGFfc29jayAqKSBwcml2OworCWlmICghc2VsZikgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBsb3N0IG15c2VsZiFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBQYXNzIHBhcmFtZXRlciB0byB0aGUgY2FsbGVyICovCisJc2VsZi0+Y2FjaGVkYWRkciA9IGRpc2NvdmVyeS0+ZGFkZHI7CisKKwkvKiBXYWtlIHVwIHByb2Nlc3MgaWYgaXRzIHdhaXRpbmcgZm9yIGRldmljZSB0byBiZSBkaXNjb3ZlcmVkICovCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZWxmLT5xdWVyeV93YWl0KTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfZGlzY292ZXJ5X3RpbWVvdXQgKHByaXYpCisgKgorICogICAgVGltZW91dCBpbiB0aGUgc2VsZWN0aXZlIGRpc2NvdmVyeSBwcm9jZXNzCisgKgorICogV2Ugd2VyZSB3YWl0aW5nIGZvciBhIG5vZGUgdG8gYmUgZGlzY292ZXJlZCwgYnV0IG5vdGhpbmcgaGFzIGNvbWUgdXAKKyAqIHNvIGZhci4gV2FrZSB1cCB0aGUgdXNlciBhbmQgdGVsbCBoaW0gdGhhdCB3ZSBmYWlsZWQuLi4KKyAqLworc3RhdGljIHZvaWQgaXJkYV9kaXNjb3ZlcnlfdGltZW91dCh1X2xvbmcgcHJpdikKK3sKKwlzdHJ1Y3QgaXJkYV9zb2NrICpzZWxmOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXNlbGYgPSAoc3RydWN0IGlyZGFfc29jayAqKSBwcml2OworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwkvKiBOb3RoaW5nIGZvciB0aGUgY2FsbGVyICovCisJc2VsZi0+Y2FjaGVsb2cgPSBOVUxMOworCXNlbGYtPmNhY2hlZGFkZHIgPSAwOworCXNlbGYtPmVycm5vID0gLUVUSU1FOworCisJLyogV2FrZSB1cCBwcm9jZXNzIGlmIGl0cyBzdGlsbCB3YWl0aW5nLi4uICovCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZWxmLT5xdWVyeV93YWl0KTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfb3Blbl90c2FwIChzZWxmKQorICoKKyAqICAgIE9wZW4gbG9jYWwgVHJhbnNwb3J0IFNlcnZpY2UgQWNjZXNzIFBvaW50IChUU0FQKQorICoKKyAqLworc3RhdGljIGludCBpcmRhX29wZW5fdHNhcChzdHJ1Y3QgaXJkYV9zb2NrICpzZWxmLCBfX3U4IHRzYXBfc2VsLCBjaGFyICpuYW1lKQoreworCW5vdGlmeV90IG5vdGlmeTsKKworCWlmIChzZWxmLT50c2FwKSB7CisJCUlSREFfV0FSTklORygiJXM6IGJ1c3khXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qIEluaXRpYWxpemUgY2FsbGJhY2tzIHRvIGJlIHVzZWQgYnkgdGhlIElyREEgc3RhY2sgKi8KKwlpcmRhX25vdGlmeV9pbml0KCZub3RpZnkpOworCW5vdGlmeS5jb25uZWN0X2NvbmZpcm0gICAgICAgPSBpcmRhX2Nvbm5lY3RfY29uZmlybTsKKwlub3RpZnkuY29ubmVjdF9pbmRpY2F0aW9uICAgID0gaXJkYV9jb25uZWN0X2luZGljYXRpb247CisJbm90aWZ5LmRpc2Nvbm5lY3RfaW5kaWNhdGlvbiA9IGlyZGFfZGlzY29ubmVjdF9pbmRpY2F0aW9uOworCW5vdGlmeS5kYXRhX2luZGljYXRpb24gICAgICAgPSBpcmRhX2RhdGFfaW5kaWNhdGlvbjsKKwlub3RpZnkudWRhdGFfaW5kaWNhdGlvbgkgICAgID0gaXJkYV9kYXRhX2luZGljYXRpb247CisJbm90aWZ5LmZsb3dfaW5kaWNhdGlvbiAgICAgICA9IGlyZGFfZmxvd19pbmRpY2F0aW9uOworCW5vdGlmeS5pbnN0YW5jZSA9IHNlbGY7CisJc3RybmNweShub3RpZnkubmFtZSwgbmFtZSwgTk9USUZZX01BWF9OQU1FKTsKKworCXNlbGYtPnRzYXAgPSBpcnR0cF9vcGVuX3RzYXAodHNhcF9zZWwsIERFRkFVTFRfSU5JVElBTF9DUkVESVQsCisJCQkJICAgICAmbm90aWZ5KTsKKwlpZiAoc2VsZi0+dHNhcCA9PSBOVUxMKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIFVuYWJsZSB0byBhbGxvY2F0ZSBUU0FQIVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKiBSZW1lbWJlciB3aGljaCBUU0FQIHNlbGVjdG9yIHdlIGFjdHVhbGx5IGdvdCAqLworCXNlbGYtPnN0c2FwX3NlbCA9IHNlbGYtPnRzYXAtPnN0c2FwX3NlbDsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9vcGVuX2xzYXAgKHNlbGYpCisgKgorICogICAgT3BlbiBsb2NhbCBMaW5rIFNlcnZpY2UgQWNjZXNzIFBvaW50IChMU0FQKS4gVXNlZCBmb3Igb3BlbmluZyBVbHRyYQorICogICAgc29ja2V0cworICovCisjaWZkZWYgQ09ORklHX0lSREFfVUxUUkEKK3N0YXRpYyBpbnQgaXJkYV9vcGVuX2xzYXAoc3RydWN0IGlyZGFfc29jayAqc2VsZiwgaW50IHBpZCkKK3sKKwlub3RpZnlfdCBub3RpZnk7CisKKwlpZiAoc2VsZi0+bHNhcCkgeworCQlJUkRBX1dBUk5JTkcoIiVzKCksIGJ1c3khXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qIEluaXRpYWxpemUgY2FsbGJhY2tzIHRvIGJlIHVzZWQgYnkgdGhlIElyREEgc3RhY2sgKi8KKwlpcmRhX25vdGlmeV9pbml0KCZub3RpZnkpOworCW5vdGlmeS51ZGF0YV9pbmRpY2F0aW9uCT0gaXJkYV9kYXRhX2luZGljYXRpb247CisJbm90aWZ5Lmluc3RhbmNlID0gc2VsZjsKKwlzdHJuY3B5KG5vdGlmeS5uYW1lLCAiVWx0cmEiLCBOT1RJRllfTUFYX05BTUUpOworCisJc2VsZi0+bHNhcCA9IGlybG1wX29wZW5fbHNhcChMU0FQX0NPTk5MRVNTLCAmbm90aWZ5LCBwaWQpOworCWlmIChzZWxmLT5sc2FwID09IE5VTEwpIHsKKwkJSVJEQV9ERUJVRyggMCwgIiVzKCksIFVuYWJsZSB0byBhbGxvY2F0ZSBMU0FQIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX0lSREFfVUxUUkEgKi8KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfZmluZF9sc2FwX3NlbCAoc2VsZiwgbmFtZSkKKyAqCisgKiAgICBUcnkgdG8gbG9va3VwIExTQVAgc2VsZWN0b3IgaW4gcmVtb3RlIExNLUlBUworICoKKyAqIEJhc2ljYWxseSwgd2Ugc3RhcnQgYSBJQVAgcXVlcnksIGFuZCB0aGVuIGdvIHRvIHNsZWVwLiBXaGVuIHRoZSBxdWVyeQorICogcmV0dXJuLCBpcmRhX2dldHZhbHVlX2NvbmZpcm0gd2lsbCB3YWtlIHVzIHVwLCBhbmQgd2UgY2FuIGV4YW1pbmUgdGhlCisgKiByZXN1bHQgb2YgdGhlIHF1ZXJ5Li4uCisgKiBOb3RlIHRoYXQgaW4gc29tZSBjYXNlLCB0aGUgcXVlcnkgZmFpbCBldmVuIGJlZm9yZSB3ZSBnbyB0byBzbGVlcCwKKyAqIGNyZWF0aW5nIHNvbWUgcmFjZXMuLi4KKyAqLworc3RhdGljIGludCBpcmRhX2ZpbmRfbHNhcF9zZWwoc3RydWN0IGlyZGFfc29jayAqc2VsZiwgY2hhciAqbmFtZSkKK3sKKwlJUkRBX0RFQlVHKDIsICIlcyglcCwgJXMpXG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYsIG5hbWUpOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCWlmIChzZWxmLT5pcmlhcCkgeworCQlJUkRBX1dBUk5JTkcoIiVzKCk6IGJ1c3kgd2l0aCBhIHByZXZpb3VzIHF1ZXJ5XG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXNlbGYtPmlyaWFwID0gaXJpYXBfb3BlbihMU0FQX0FOWSwgSUFTX0NMSUVOVCwgc2VsZiwKKwkJCQkgaXJkYV9nZXR2YWx1ZV9jb25maXJtKTsKKwlpZihzZWxmLT5pcmlhcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFRyZWF0IHVuZXhwZWN0ZWQgd2FrZXVwIGFzIGRpc2Nvbm5lY3QgKi8KKwlzZWxmLT5lcnJubyA9IC1FSE9TVFVOUkVBQ0g7CisKKwkvKiBRdWVyeSByZW1vdGUgTE0tSUFTICovCisJaXJpYXBfZ2V0dmFsdWVieWNsYXNzX3JlcXVlc3Qoc2VsZi0+aXJpYXAsIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkciwKKwkJCQkgICAgICBuYW1lLCAiSXJEQTpUaW55VFA6THNhcFNlbCIpOworCisJLyogV2FpdCBmb3IgYW5zd2VyLCBpZiBub3QgeWV0IGZpbmlzaGVkIChvciBmYWlsZWQpICovCisJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzZWxmLT5xdWVyeV93YWl0LCAoc2VsZi0+aXJpYXA9PU5VTEwpKSkKKwkJLyogVHJlYXQgc2lnbmFscyBhcyBkaXNjb25uZWN0ICovCisJCXJldHVybiAtRUhPU1RVTlJFQUNIOworCisJLyogQ2hlY2sgd2hhdCBoYXBwZW5lZCAqLworCWlmIChzZWxmLT5lcnJubykKKwl7CisJCS8qIFJlcXVlc3RlZCBvYmplY3QvYXR0cmlidXRlIGRvZXNuJ3QgZXhpc3QgKi8KKwkJaWYoKHNlbGYtPmVycm5vID09IElBU19DTEFTU19VTktOT1dOKSB8fAorCQkgICAoc2VsZi0+ZXJybm8gPT0gSUFTX0FUVFJJQl9VTktOT1dOKSkKKwkJCXJldHVybiAoLUVBRERSTk9UQVZBSUwpOworCQllbHNlCisJCQlyZXR1cm4gKC1FSE9TVFVOUkVBQ0gpOworCX0KKworCS8qIEdldCB0aGUgcmVtb3RlIFRTQVAgc2VsZWN0b3IgKi8KKwlzd2l0Y2ggKHNlbGYtPmlhc19yZXN1bHQtPnR5cGUpIHsKKwljYXNlIElBU19JTlRFR0VSOgorCQlJUkRBX0RFQlVHKDQsICIlcygpIGludD0lZFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgc2VsZi0+aWFzX3Jlc3VsdC0+dC5pbnRlZ2VyKTsKKworCQlpZiAoc2VsZi0+aWFzX3Jlc3VsdC0+dC5pbnRlZ2VyICE9IC0xKQorCQkJc2VsZi0+ZHRzYXBfc2VsID0gc2VsZi0+aWFzX3Jlc3VsdC0+dC5pbnRlZ2VyOworCQllbHNlCisJCQlzZWxmLT5kdHNhcF9zZWwgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzZWxmLT5kdHNhcF9zZWwgPSAwOworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBiYWQgdHlwZSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWJyZWFrOworCX0KKwlpZiAoc2VsZi0+aWFzX3Jlc3VsdCkKKwkJaXJpYXNfZGVsZXRlX3ZhbHVlKHNlbGYtPmlhc19yZXN1bHQpOworCisJaWYgKHNlbGYtPmR0c2FwX3NlbCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLUVBRERSTk9UQVZBSUw7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2Rpc2NvdmVyX2RhZGRyX2FuZF9sc2FwX3NlbCAoc2VsZiwgbmFtZSkKKyAqCisgKiAgICBUaGlzIHRyeSB0byBmaW5kIGEgZGV2aWNlIHdpdGggdGhlIHJlcXVlc3RlZCBzZXJ2aWNlLgorICoKKyAqIEl0IGJhc2ljYWxseSBsb29rIGludG8gdGhlIGRpc2NvdmVyeSBsb2cuIEZvciBlYWNoIGFkZHJlc3MgaW4gdGhlIGxpc3QsCisgKiBpdCBxdWVyaWVzIHRoZSBMTS1JQVMgb2YgdGhlIGRldmljZSB0byBmaW5kIGlmIHRoaXMgZGV2aWNlIG9mZmVyCisgKiB0aGUgcmVxdWVzdGVkIHNlcnZpY2UuCisgKiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIG5vZGUgc3VwcG9ydGluZyB0aGUgc2VydmljZSwgd2UgY29tcGxhaW4KKyAqIHRvIHRoZSB1c2VyIChpdCBzaG91bGQgbW92ZSBkZXZpY2VzIGFyb3VuZCkuCisgKiBUaGUsIHdlIHNldCBib3RoIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCB0aGUgbHNhcCBzZWxlY3RvciB0byBwb2ludAorICogb24gdGhlIHNlcnZpY2Ugb24gdGhlIHVuaXF1ZSBkZXZpY2Ugd2UgaGF2ZSBmb3VuZC4KKyAqCisgKiBOb3RlIDogdGhpcyBmdW5jdGlvbiBmYWlscyBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGRldmljZSBpbiByYW5nZSwKKyAqIGJlY2F1c2UgSXJMTVAgZG9lc24ndCBkaXNjb25uZWN0IHRoZSBMQVAgd2hlbiB0aGUgbGFzdCBMU0FQIGlzIGNsb3NlZC4KKyAqIE1vcmVvdmVyLCB3ZSB3b3VsZCBuZWVkIHRvIHdhaXQgdGhlIExBUCBkaXNjb25uZWN0aW9uLi4uCisgKi8KK3N0YXRpYyBpbnQgaXJkYV9kaXNjb3Zlcl9kYWRkcl9hbmRfbHNhcF9zZWwoc3RydWN0IGlyZGFfc29jayAqc2VsZiwgY2hhciAqbmFtZSkKK3sKKwlkaXNjaW5mb190ICpkaXNjb3ZlcmllczsJLyogQ29weSBvZiB0aGUgZGlzY292ZXJ5IGxvZyAqLworCWludAludW1iZXI7CQkJLyogTnVtYmVyIG9mIG5vZGVzIGluIHRoZSBsb2cgKi8KKwlpbnQJaTsKKwlpbnQJZXJyID0gLUVORVRVTlJFQUNIOworCV9fdTMyCWRhZGRyID0gREVWX0FERFJfQU5ZOwkvKiBBZGRyZXNzIHdlIGZvdW5kIHRoZSBzZXJ2aWNlIG9uICovCisJX191OAlkdHNhcF9zZWwgPSAweDA7CS8qIFRTQVAgYXNzb2NpYXRlZCB3aXRoIGl0ICovCisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBuYW1lPSVzXG4iLCBfX0ZVTkNUSU9OX18sIG5hbWUpOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCS8qIEFzayBsbXAgZm9yIHRoZSBjdXJyZW50IGRpc2NvdmVyeSBsb2cKKwkgKiBOb3RlIDogd2UgaGF2ZSB0byB1c2UgaXJsbXBfZ2V0X2Rpc2NvdmVyaWVzKCksIGFzIG9wcG9zZWQKKwkgKiB0byBwbGF5IHdpdGggdGhlIGNhY2hlbG9nIGRpcmVjdGx5LCBiZWNhdXNlIHdoaWxlIHdlIGFyZQorCSAqIG1ha2luZyBvdXIgaWFzIHF1ZXJ5LCBsZSBsb2cgbWlnaHQgY2hhbmdlLi4uICovCisJZGlzY292ZXJpZXMgPSBpcmxtcF9nZXRfZGlzY292ZXJpZXMoJm51bWJlciwgc2VsZi0+bWFzay53b3JkLAorCQkJCQkgICAgc2VsZi0+bnNsb3RzKTsKKwkvKiBDaGVjayBpZiB0aGUgd2UgZ290IHNvbWUgcmVzdWx0cyAqLworCWlmIChkaXNjb3ZlcmllcyA9PSBOVUxMKQorCQlyZXR1cm4gLUVORVRVTlJFQUNIOwkvKiBObyBub2RlcyBkaXNjb3ZlcmVkICovCisKKwkvKgorCSAqIE5vdywgY2hlY2sgYWxsIGRpc2NvdmVyZWQgZGV2aWNlcyAoaWYgYW55KSwgYW5kIGNvbm5lY3QKKwkgKiBjbGllbnQgb25seSBhYm91dCB0aGUgc2VydmljZXMgdGhhdCB0aGUgY2xpZW50IGlzCisJICogaW50ZXJlc3RlZCBpbi4uLgorCSAqLworCWZvcihpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7CisJCS8qIFRyeSB0aGUgYWRkcmVzcyBpbiB0aGUgbG9nICovCisJCXNlbGYtPmRhZGRyID0gZGlzY292ZXJpZXNbaV0uZGFkZHI7CisJCXNlbGYtPnNhZGRyID0gMHgwOworCQlJUkRBX0RFQlVHKDEsICIlcygpLCB0cnlpbmcgZGFkZHIgPSAlMDh4XG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBzZWxmLT5kYWRkcik7CisKKwkJLyogUXVlcnkgcmVtb3RlIExNLUlBUyBmb3IgdGhpcyBzZXJ2aWNlICovCisJCWVyciA9IGlyZGFfZmluZF9sc2FwX3NlbChzZWxmLCBuYW1lKTsKKwkJc3dpdGNoIChlcnIpIHsKKwkJY2FzZSAwOgorCQkJLyogV2UgZm91bmQgdGhlIHJlcXVlc3RlZCBzZXJ2aWNlICovCisJCQlpZihkYWRkciAhPSBERVZfQUREUl9BTlkpIHsKKwkJCQlJUkRBX0RFQlVHKDEsICIlcygpLCBkaXNjb3ZlcmVkIHNlcnZpY2UgJyclcycnIGluIHR3byBkaWZmZXJlbnQgZGV2aWNlcyAhISFcbiIsCisJCQkJCSAgIF9fRlVOQ1RJT05fXywgbmFtZSk7CisJCQkJc2VsZi0+ZGFkZHIgPSBERVZfQUREUl9BTlk7CisJCQkJa2ZyZWUoZGlzY292ZXJpZXMpOworCQkJCXJldHVybigtRU5PVFVOSVEpOworCQkJfQorCQkJLyogRmlyc3QgdGltZSB3ZSBmb3VuZCB0aGF0IG9uZSwgc2F2ZSBpdCAhICovCisJCQlkYWRkciA9IHNlbGYtPmRhZGRyOworCQkJZHRzYXBfc2VsID0gc2VsZi0+ZHRzYXBfc2VsOworCQkJYnJlYWs7CisJCWNhc2UgLUVBRERSTk9UQVZBSUw6CisJCQkvKiBSZXF1ZXN0ZWQgc2VydmljZSBzaW1wbHkgZG9lc24ndCBleGlzdCBvbiB0aGlzIG5vZGUgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogU29tZXRoaW5nIGJhZCBkaWQgaGFwcGVuIDotKCAqLworCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5leHBlY3RlZCBJQVMgcXVlcnkgZmFpbHVyZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXNlbGYtPmRhZGRyID0gREVWX0FERFJfQU5ZOworCQkJa2ZyZWUoZGlzY292ZXJpZXMpOworCQkJcmV0dXJuKC1FSE9TVFVOUkVBQ0gpOworCQkJYnJlYWs7CisJCX0KKwl9CisJLyogQ2xlYW51cCBvdXIgY29weSBvZiB0aGUgZGlzY292ZXJ5IGxvZyAqLworCWtmcmVlKGRpc2NvdmVyaWVzKTsKKworCS8qIENoZWNrIG91dCB3aGF0IHdlIGZvdW5kICovCisJaWYoZGFkZHIgPT0gREVWX0FERFJfQU5ZKSB7CisJCUlSREFfREVCVUcoMSwgIiVzKCksIGNhbm5vdCBkaXNjb3ZlciBzZXJ2aWNlICcnJXMnJyBpbiBhbnkgZGV2aWNlICEhIVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgbmFtZSk7CisJCXNlbGYtPmRhZGRyID0gREVWX0FERFJfQU5ZOworCQlyZXR1cm4oLUVBRERSTk9UQVZBSUwpOworCX0KKworCS8qIFJldmVydCBiYWNrIHRvIGRpc2NvdmVyZWQgZGV2aWNlICYgc2VydmljZSAqLworCXNlbGYtPmRhZGRyID0gZGFkZHI7CisJc2VsZi0+c2FkZHIgPSAweDA7CisJc2VsZi0+ZHRzYXBfc2VsID0gZHRzYXBfc2VsOworCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgZGlzY292ZXJlZCByZXF1ZXN0ZWQgc2VydmljZSAnJyVzJycgYXQgYWRkcmVzcyAlMDh4XG4iLAorCQkgICBfX0ZVTkNUSU9OX18sIG5hbWUsIHNlbGYtPmRhZGRyKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9nZXRuYW1lIChzb2NrLCB1YWRkciwgdWFkZHJfbGVuLCBwZWVyKQorICoKKyAqICAgIFJldHVybiB0aGUgb3VyIG93biwgb3IgcGVlcnMgc29ja2V0IGFkZHJlc3MgKHNvY2thZGRyX2lyZGEpCisgKgorICovCitzdGF0aWMgaW50IGlyZGFfZ2V0bmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLAorCQkJaW50ICp1YWRkcl9sZW4sIGludCBwZWVyKQoreworCXN0cnVjdCBzb2NrYWRkcl9pcmRhIHNhZGRyOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBpcmRhX3NvY2sgKnNlbGYgPSBpcmRhX3NrKHNrKTsKKworCWlmIChwZWVyKSB7CisJCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKQorCQkJcmV0dXJuIC1FTk9UQ09OTjsKKworCQlzYWRkci5zaXJfZmFtaWx5ID0gQUZfSVJEQTsKKwkJc2FkZHIuc2lyX2xzYXBfc2VsID0gc2VsZi0+ZHRzYXBfc2VsOworCQlzYWRkci5zaXJfYWRkciA9IHNlbGYtPmRhZGRyOworCX0gZWxzZSB7CisJCXNhZGRyLnNpcl9mYW1pbHkgPSBBRl9JUkRBOworCQlzYWRkci5zaXJfbHNhcF9zZWwgPSBzZWxmLT5zdHNhcF9zZWw7CisJCXNhZGRyLnNpcl9hZGRyID0gc2VsZi0+c2FkZHI7CisJfQorCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgdHNhcF9zZWwgPSAlI3hcbiIsIF9fRlVOQ1RJT05fXywgc2FkZHIuc2lyX2xzYXBfc2VsKTsKKwlJUkRBX0RFQlVHKDEsICIlcygpLCBhZGRyID0gJTA4eFxuIiwgX19GVU5DVElPTl9fLCBzYWRkci5zaXJfYWRkcik7CisKKwkvKiB1YWRkcl9sZW4gY29tZSB0byB1cyB1bmluaXRpYWxpc2VkICovCisJKnVhZGRyX2xlbiA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX2lyZGEpOworCW1lbWNweSh1YWRkciwgJnNhZGRyLCAqdWFkZHJfbGVuKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9saXN0ZW4gKHNvY2ssIGJhY2tsb2cpCisgKgorICogICAgSnVzdCBtb3ZlIHRvIHRoZSBsaXN0ZW4gc3RhdGUKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJkYV9saXN0ZW4oc3RydWN0IHNvY2tldCAqc29jaywgaW50IGJhY2tsb2cpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaWYgKChzay0+c2tfdHlwZSAhPSBTT0NLX1NUUkVBTSkgJiYgKHNrLT5za190eXBlICE9IFNPQ0tfU0VRUEFDS0VUKSAmJgorCSAgICAoc2stPnNrX3R5cGUgIT0gU09DS19ER1JBTSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0xJU1RFTikgeworCQlzay0+c2tfbWF4X2Fja19iYWNrbG9nID0gYmFja2xvZzsKKwkJc2stPnNrX3N0YXRlICAgICAgICAgICA9IFRDUF9MSVNURU47CisKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9iaW5kIChzb2NrLCB1YWRkciwgYWRkcl9sZW4pCisgKgorICogICAgVXNlZCBieSBzZXJ2ZXJzIHRvIHJlZ2lzdGVyIHRoZWlyIHdlbGwga25vd24gVFNBUAorICoKKyAqLworc3RhdGljIGludCBpcmRhX2JpbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwgaW50IGFkZHJfbGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBzb2NrYWRkcl9pcmRhICphZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pcmRhICopIHVhZGRyOworCXN0cnVjdCBpcmRhX3NvY2sgKnNlbGYgPSBpcmRhX3NrKHNrKTsKKwlpbnQgZXJyOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCUlSREFfREVCVUcoMiwgIiVzKCVwKVxuIiwgX19GVU5DVElPTl9fLCBzZWxmKTsKKworCWlmIChhZGRyX2xlbiAhPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2lyZGEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworI2lmZGVmIENPTkZJR19JUkRBX1VMVFJBCisJLyogU3BlY2lhbCBjYXJlIGZvciBVbHRyYSBzb2NrZXRzICovCisJaWYgKChzay0+c2tfdHlwZSA9PSBTT0NLX0RHUkFNKSAmJgorCSAgICAoc2stPnNrX3Byb3RvY29sID09IElSREFQUk9UT19VTFRSQSkpIHsKKwkJc2VsZi0+cGlkID0gYWRkci0+c2lyX2xzYXBfc2VsOworCQlpZiAoc2VsZi0+cGlkICYgMHg4MCkgeworCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgZXh0ZW5zaW9uIGluIFBJRCBub3Qgc3VwcCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCX0KKwkJZXJyID0gaXJkYV9vcGVuX2xzYXAoc2VsZiwgc2VsZi0+cGlkKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCisJCS8qIFByZXRlbmQgd2UgYXJlIGNvbm5lY3RlZCAqLworCQlzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKwkJc2stPnNrX3N0YXRlICAgPSBUQ1BfRVNUQUJMSVNIRUQ7CisKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmIC8qIENPTkZJR19JUkRBX1VMVFJBICovCisKKwllcnIgPSBpcmRhX29wZW5fdHNhcChzZWxmLCBhZGRyLT5zaXJfbHNhcF9zZWwsIGFkZHItPnNpcl9uYW1lKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCS8qICBSZWdpc3RlciB3aXRoIExNLUlBUyAqLworCXNlbGYtPmlhc19vYmogPSBpcmlhc19uZXdfb2JqZWN0KGFkZHItPnNpcl9uYW1lLCBqaWZmaWVzKTsKKwlpcmlhc19hZGRfaW50ZWdlcl9hdHRyaWIoc2VsZi0+aWFzX29iaiwgIklyREE6VGlueVRQOkxzYXBTZWwiLAorCQkJCSBzZWxmLT5zdHNhcF9zZWwsIElBU19LRVJORUxfQVRUUik7CisJaXJpYXNfaW5zZXJ0X29iamVjdChzZWxmLT5pYXNfb2JqKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9hY2NlcHQgKHNvY2ssIG5ld3NvY2ssIGZsYWdzKQorICoKKyAqICAgIFdhaXQgZm9yIGluY29taW5nIGNvbm5lY3Rpb24KKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJkYV9hY2NlcHQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2tldCAqbmV3c29jaywgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBpcmRhX3NvY2sgKm5ldywgKnNlbGYgPSBpcmRhX3NrKHNrKTsKKwlzdHJ1Y3Qgc29jayAqbmV3c2s7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgZXJyOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwllcnIgPSBpcmRhX2NyZWF0ZShuZXdzb2NrLCBzay0+c2tfcHJvdG9jb2wpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoc29jay0+c3RhdGUgIT0gU1NfVU5DT05ORUNURUQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChzayA9IHNvY2stPnNrKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgoc2stPnNrX3R5cGUgIT0gU09DS19TVFJFQU0pICYmIChzay0+c2tfdHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCkgJiYKKwkgICAgKHNrLT5za190eXBlICE9IFNPQ0tfREdSQU0pKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9MSVNURU4pCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKglUaGUgcmVhZCBxdWV1ZSB0aGlzIHRpbWUgaXMgaG9sZGluZyBzb2NrZXRzIHJlYWR5IHRvIHVzZQorCSAqCWhvb2tlZCBpbnRvIHRoZSBTQUJNIHdlIHNhdmVkCisJICovCisKKwkvKgorCSAqIFdlIGNhbiBwZXJmb3JtIHRoZSBhY2NlcHQgb25seSBpZiB0aGVyZSBpcyBpbmNvbWluZyBkYXRhCisJICogb24gdGhlIGxpc3RlbmluZyBzb2NrZXQuCisJICogU28sIHdlIHdpbGwgYmxvY2sgdGhlIGNhbGxlciB1bnRpbCB3ZSByZWNlaXZlIGFueSBkYXRhLgorCSAqIElmIHRoZSBjYWxsZXIgd2FzIHdhaXRpbmcgb24gc2VsZWN0KCkgb3IgcG9sbCgpIGJlZm9yZQorCSAqIGNhbGxpbmcgdXMsIHRoZSBkYXRhIGlzIHdhaXRpbmcgZm9yIHVzIDstKQorCSAqIEplYW4gSUkKKwkgKi8KKwlza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCWlmIChza2IgPT0gTlVMTCkgeworCQlpbnQgcmV0ID0gMDsKKwkJREVDTEFSRV9XQUlUUVVFVUUod2FpdHEsIGN1cnJlbnQpOworCisJCS8qIE5vbiBibG9ja2luZyBvcGVyYXRpb24gKi8KKwkJaWYgKGZsYWdzICYgT19OT05CTE9DSykKKwkJCXJldHVybiAtRVdPVUxEQkxPQ0s7CisKKwkJLyogVGhlIGZvbGxvd2luZyBjb2RlIGlzIGEgY3V0J24ncGFzdGUgb2YgdGhlCisJCSAqIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgpIG1hY3JvLgorCQkgKiBXZSBkb24ndCB1cyB0aGUgbWFjcm8gYmVjYXVzZSB0aGUgY29uZGl0aW9uIGhhcworCQkgKiBzaWRlIGVmZmVjdHMgOiB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IG9ubHkgb25lCisJCSAqIHNrYiBnZXQgZGVxdWV1ZWQgLSBKZWFuIElJICovCisJCWFkZF93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXRxKTsKKwkJZm9yICg7OykgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJCQlpZiAoc2tiICE9IE5VTEwpCisJCQkJYnJlYWs7CisJCQlpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJc2NoZWR1bGUoKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQlyZW1vdmVfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0cSk7CisJCWlmKHJldCkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCisJbmV3c2sgPSBuZXdzb2NrLT5zazsKKwluZXdzay0+c2tfc3RhdGUgPSBUQ1BfRVNUQUJMSVNIRUQ7CisKKwluZXcgPSBpcmRhX3NrKG5ld3NrKTsKKwlJUkRBX0FTU0VSVChuZXcgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwkvKiBOb3cgYXR0YWNoIHVwIHRoZSBuZXcgc29ja2V0ICovCisJbmV3LT50c2FwID0gaXJ0dHBfZHVwKHNlbGYtPnRzYXAsIG5ldyk7CisJaWYgKCFuZXctPnRzYXApIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgZHVwIGZhaWxlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLTE7CisJfQorCisJbmV3LT5zdHNhcF9zZWwgPSBuZXctPnRzYXAtPnN0c2FwX3NlbDsKKwluZXctPmR0c2FwX3NlbCA9IG5ldy0+dHNhcC0+ZHRzYXBfc2VsOworCW5ldy0+c2FkZHIgPSBpcnR0cF9nZXRfc2FkZHIobmV3LT50c2FwKTsKKwluZXctPmRhZGRyID0gaXJ0dHBfZ2V0X2RhZGRyKG5ldy0+dHNhcCk7CisKKwluZXctPm1heF9zZHVfc2l6ZV90eCA9IHNlbGYtPm1heF9zZHVfc2l6ZV90eDsKKwluZXctPm1heF9zZHVfc2l6ZV9yeCA9IHNlbGYtPm1heF9zZHVfc2l6ZV9yeDsKKwluZXctPm1heF9kYXRhX3NpemUgICA9IHNlbGYtPm1heF9kYXRhX3NpemU7CisJbmV3LT5tYXhfaGVhZGVyX3NpemUgPSBzZWxmLT5tYXhfaGVhZGVyX3NpemU7CisKKwltZW1jcHkoJm5ldy0+cW9zX3R4LCAmc2VsZi0+cW9zX3R4LCBzaXplb2Yoc3RydWN0IHFvc19pbmZvKSk7CisKKwkvKiBDbGVhbiB1cCB0aGUgb3JpZ2luYWwgb25lIHRvIGtlZXAgaXQgaW4gbGlzdGVuIHN0YXRlICovCisJaXJ0dHBfbGlzdGVuKHNlbGYtPnRzYXApOworCisJLyogV293ICEgV2hhdCBpcyB0aGF0ID8gSmVhbiBJSSAqLworCXNrYi0+c2sgPSBOVUxMOworCXNrYi0+ZGVzdHJ1Y3RvciA9IE5VTEw7CisJa2ZyZWVfc2tiKHNrYik7CisJc2stPnNrX2Fja19iYWNrbG9nLS07CisKKwluZXdzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKworCWlyZGFfY29ubmVjdF9yZXNwb25zZShuZXcpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2Nvbm5lY3QgKHNvY2ssIHVhZGRyLCBhZGRyX2xlbiwgZmxhZ3MpCisgKgorICogICAgQ29ubmVjdCB0byBhIElyREEgZGV2aWNlCisgKgorICogVGhlIG1haW4gZGlmZmVyZW5jZSB3aXRoIGEgInN0YW5kYXJkIiBjb25uZWN0IGlzIHRoYXQgd2l0aCBJckRBIHdlIG5lZWQKKyAqIHRvIHJlc29sdmUgdGhlIHNlcnZpY2UgbmFtZSBpbnRvIGEgVFNBUCBzZWxlY3RvciAoaW4gVENQLCBwb3J0IG51bWJlcgorICogZG9lc24ndCBoYXZlIHRvIGJlIHJlc29sdmVkKS4KKyAqIEJlY2F1c2Ugb2YgdGhpcyBzZXJ2aWNlIG5hbWUgcmVzb2x0aW9uLCB3ZSBjYW4gb2ZmZXIgImF1dG8tY29ubmVjdCIsCisgKiB3aGVyZSB3ZSBjb25uZWN0IHRvIGEgc2VydmljZSB3aXRob3V0IHNwZWNpZnlpbmcgYSBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICoKKyAqIE5vdGUgOiBieSBjb25zdWx0aW5nICJlcnJubyIsIHRoZSB1c2VyIHNwYWNlIGNhbGxlciBtYXkgbGVhcm4gdGhlIGNhdXNlCisgKiBvZiB0aGUgZmFpbHVyZS4gTW9zdCBvZiB0aGVtIGFyZSB2aXNpYmxlIGluIHRoZSBmdW5jdGlvbiwgb3RoZXJzIG1heSBjb21lCisgKiBmcm9tIHN1YnJvdXRpbmVzIGNhbGxlZCBhbmQgYXJlIGxpc3RlZCBoZXJlIDoKKyAqCW8gRUJVU1kgOiBhbHJlYWR5IHByb2Nlc3NpbmcgYSBjb25uZWN0CisgKglvIEVIT1NUVU5SRUFDSCA6IGJhZCBhZGRyLT5zaXJfYWRkciBhcmd1bWVudAorICoJbyBFQUREUk5PVEFWQUlMIDogYmFkIGFkZHItPnNpcl9uYW1lIGFyZ3VtZW50CisgKglvIEVOT1RVTklRIDogbW9yZSB0aGFuIG9uZSBub2RlIGhhcyBhZGRyLT5zaXJfbmFtZSAoYXV0by1jb25uZWN0KQorICoJbyBFTkVUVU5SRUFDSCA6IG5vIG5vZGUgZm91bmQgb24gdGhlIG5ldHdvcmsgKGF1dG8tY29ubmVjdCkKKyAqLworc3RhdGljIGludCBpcmRhX2Nvbm5lY3Qoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwKKwkJCWludCBhZGRyX2xlbiwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBzb2NrYWRkcl9pcmRhICphZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pcmRhICopIHVhZGRyOworCXN0cnVjdCBpcmRhX3NvY2sgKnNlbGYgPSBpcmRhX3NrKHNrKTsKKwlpbnQgZXJyOworCisJSVJEQV9ERUJVRygyLCAiJXMoJXApXG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYpOworCisJLyogRG9uJ3QgYWxsb3cgY29ubmVjdCBmb3IgVWx0cmEgc29ja2V0cyAqLworCWlmICgoc2stPnNrX3R5cGUgPT0gU09DS19ER1JBTSkgJiYgKHNrLT5za19wcm90b2NvbCA9PSBJUkRBUFJPVE9fVUxUUkEpKQorCQlyZXR1cm4gLUVTT0NLVE5PU1VQUE9SVDsKKworCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0VTVEFCTElTSEVEICYmIHNvY2stPnN0YXRlID09IFNTX0NPTk5FQ1RJTkcpIHsKKwkJc29jay0+c3RhdGUgPSBTU19DT05ORUNURUQ7CisJCXJldHVybiAwOyAgIC8qIENvbm5lY3QgY29tcGxldGVkIGR1cmluZyBhIEVSRVNUQVJUU1lTIGV2ZW50ICovCisJfQorCisJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfQ0xPU0UgJiYgc29jay0+c3RhdGUgPT0gU1NfQ09OTkVDVElORykgeworCQlzb2NrLT5zdGF0ZSA9IFNTX1VOQ09OTkVDVEVEOworCQlyZXR1cm4gLUVDT05OUkVGVVNFRDsKKwl9CisKKwlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9FU1RBQkxJU0hFRCkKKwkJcmV0dXJuIC1FSVNDT05OOyAgICAgIC8qIE5vIHJlY29ubmVjdCBvbiBhIHNlcXBhY2tldCBzb2NrZXQgKi8KKworCXNrLT5za19zdGF0ZSAgID0gVENQX0NMT1NFOworCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CisKKwlpZiAoYWRkcl9sZW4gIT0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pcmRhKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBDaGVjayBpZiB1c2VyIHN1cHBsaWVkIGFueSBkZXN0aW5hdGlvbiBkZXZpY2UgYWRkcmVzcyAqLworCWlmICgoIWFkZHItPnNpcl9hZGRyKSB8fCAoYWRkci0+c2lyX2FkZHIgPT0gREVWX0FERFJfQU5ZKSkgeworCQkvKiBUcnkgdG8gZmluZCBvbmUgc3VpdGFibGUgKi8KKwkJZXJyID0gaXJkYV9kaXNjb3Zlcl9kYWRkcl9hbmRfbHNhcF9zZWwoc2VsZiwgYWRkci0+c2lyX25hbWUpOworCQlpZiAoZXJyKSB7CisJCQlJUkRBX0RFQlVHKDAsICIlcygpLCBhdXRvLWNvbm5lY3QgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9IGVsc2UgeworCQkvKiBVc2UgdGhlIG9uZSBwcm92aWRlZCBieSB0aGUgdXNlciAqLworCQlzZWxmLT5kYWRkciA9IGFkZHItPnNpcl9hZGRyOworCQlJUkRBX0RFQlVHKDEsICIlcygpLCBkYWRkciA9ICUwOHhcbiIsIF9fRlVOQ1RJT05fXywgc2VsZi0+ZGFkZHIpOworCisJCS8qIElmIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBzZXJ2aWNlIG5hbWUsIHdlIGFzc3VtZSB0aGUKKwkJICogdXNlciB3YW50IHRvIGNvbm5lY3Qgb24gYSBzcGVjaWZpYyBMU0FQLiBQcmV2ZW50CisJCSAqIHRoZSB1c2Ugb2YgaW52YWxpZCBMU0FQcyAoSXJMTVAgMS4xIHAxMCkuIEplYW4gSUkgKi8KKwkJaWYoKGFkZHItPnNpcl9uYW1lWzBdICE9ICdcMCcpIHx8CisJCSAgIChhZGRyLT5zaXJfbHNhcF9zZWwgPj0gMHg3MCkpIHsKKwkJCS8qIFF1ZXJ5IHJlbW90ZSBMTS1JQVMgdXNpbmcgc2VydmljZSBuYW1lICovCisJCQllcnIgPSBpcmRhX2ZpbmRfbHNhcF9zZWwoc2VsZiwgYWRkci0+c2lyX25hbWUpOworCQkJaWYgKGVycikgeworCQkJCUlSREFfREVCVUcoMCwgIiVzKCksIGNvbm5lY3QgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogRGlyZWN0bHkgY29ubmVjdCB0byB0aGUgcmVtb3RlIExTQVAKKwkJCSAqIHNwZWNpZmllZCBieSB0aGUgc2lyX2xzYXAgZmllbGQuCisJCQkgKiBQbGVhc2UgdXNlIHdpdGggY2F1dGlvbiwgaW4gSXJEQSBMU0FQcyBhcmUKKwkJCSAqIGR5bmFtaWMgYW5kIHRoZXJlIGlzIG5vICJ3ZWxsLWtub3duIiBMU0FQLiAqLworCQkJc2VsZi0+ZHRzYXBfc2VsID0gYWRkci0+c2lyX2xzYXBfc2VsOworCQl9CisJfQorCisJLyogQ2hlY2sgaWYgd2UgaGF2ZSBvcGVuZWQgYSBsb2NhbCBUU0FQICovCisJaWYgKCFzZWxmLT50c2FwKQorCQlpcmRhX29wZW5fdHNhcChzZWxmLCBMU0FQX0FOWSwgYWRkci0+c2lyX25hbWUpOworCisJLyogTW92ZSB0byBjb25uZWN0aW5nIHNvY2tldCwgc3RhcnQgc2VuZGluZyBDb25uZWN0IFJlcXVlc3RzICovCisJc29jay0+c3RhdGUgPSBTU19DT05ORUNUSU5HOworCXNrLT5za19zdGF0ZSAgID0gVENQX1NZTl9TRU5UOworCisJLyogQ29ubmVjdCB0byByZW1vdGUgZGV2aWNlICovCisJZXJyID0gaXJ0dHBfY29ubmVjdF9yZXF1ZXN0KHNlbGYtPnRzYXAsIHNlbGYtPmR0c2FwX3NlbCwKKwkJCQkgICAgc2VsZi0+c2FkZHIsIHNlbGYtPmRhZGRyLCBOVUxMLAorCQkJCSAgICBzZWxmLT5tYXhfc2R1X3NpemVfcngsIE5VTEwpOworCWlmIChlcnIpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgY29ubmVjdCBmYWlsZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIE5vdyB0aGUgbG9vcCAqLworCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEICYmIChmbGFncyAmIE9fTk9OQkxPQ0spKQorCQlyZXR1cm4gLUVJTlBST0dSRVNTOworCisJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgqKHNrLT5za19zbGVlcCksCisJCQkJICAgICAoc2stPnNrX3N0YXRlICE9IFRDUF9TWU5fU0VOVCkpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfRVNUQUJMSVNIRUQpIHsKKwkJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKKwkJcmV0dXJuIHNvY2tfZXJyb3Ioc2spOwkvKiBBbHdheXMgc2V0IGF0IHRoaXMgcG9pbnQgKi8KKwl9CisKKwlzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKworCS8qIEF0IHRoaXMgcG9pbnQsIElyTE1QIGhhcyBhc3NpZ25lZCBvdXIgc291cmNlIGFkZHJlc3MgKi8KKwlzZWxmLT5zYWRkciA9IGlydHRwX2dldF9zYWRkcihzZWxmLT50c2FwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHByb3RvIGlyZGFfcHJvdG8gPSB7CisJLm5hbWUJICA9ICJJUkRBIiwKKwkub3duZXIJICA9IFRISVNfTU9EVUxFLAorCS5vYmpfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXJkYV9zb2NrKSwKK307CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2NyZWF0ZSAoc29jaywgcHJvdG9jb2wpCisgKgorICogICAgQ3JlYXRlIElyREEgc29ja2V0CisgKgorICovCitzdGF0aWMgaW50IGlyZGFfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IGlyZGFfc29jayAqc2VsZjsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBDaGVjayBmb3IgdmFsaWQgc29ja2V0IHR5cGUgKi8KKwlzd2l0Y2ggKHNvY2stPnR5cGUpIHsKKwljYXNlIFNPQ0tfU1RSRUFNOiAgICAgLyogRm9yIFRUUCBjb25uZWN0aW9ucyB3aXRoIFNBUiBkaXNhYmxlZCAqLworCWNhc2UgU09DS19TRVFQQUNLRVQ6ICAvKiBGb3IgVFRQIGNvbm5lY3Rpb25zIHdpdGggU0FSIGVuYWJsZWQgKi8KKwljYXNlIFNPQ0tfREdSQU06ICAgICAgLyogRm9yIFRUUCBVbml0ZGF0YSBvciBMTVAgVWx0cmEgdHJhbnNmZXJzICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRVNPQ0tUTk9TVVBQT1JUOworCX0KKworCS8qIEFsbG9jYXRlIG5ldHdvcmtpbmcgc29ja2V0ICovCisJc2sgPSBza19hbGxvYyhQRl9JUkRBLCBHRlBfQVRPTUlDLCAmaXJkYV9wcm90bywgMSk7CisJaWYgKHNrID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJc2VsZiA9IGlyZGFfc2soc2spOworCUlSREFfREVCVUcoMiwgIiVzKCkgOiBzZWxmIGlzICVwXG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYpOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmc2VsZi0+cXVlcnlfd2FpdCk7CisKKwkvKiBJbml0aWFsaXNlIG5ldHdvcmtpbmcgc29ja2V0IHN0cnVjdCAqLworCXNvY2tfaW5pdF9kYXRhKHNvY2ssIHNrKTsJLyogTm90ZSA6IHNldCBzay0+c2tfcmVmY250IHRvIDEgKi8KKwlzay0+c2tfZmFtaWx5ID0gUEZfSVJEQTsKKwlzay0+c2tfcHJvdG9jb2wgPSBwcm90b2NvbDsKKworCXN3aXRjaCAoc29jay0+dHlwZSkgeworCWNhc2UgU09DS19TVFJFQU06CisJCXNvY2stPm9wcyA9ICZpcmRhX3N0cmVhbV9vcHM7CisJCXNlbGYtPm1heF9zZHVfc2l6ZV9yeCA9IFRUUF9TQVJfRElTQUJMRTsKKwkJYnJlYWs7CisJY2FzZSBTT0NLX1NFUVBBQ0tFVDoKKwkJc29jay0+b3BzID0gJmlyZGFfc2VxcGFja2V0X29wczsKKwkJc2VsZi0+bWF4X3NkdV9zaXplX3J4ID0gVFRQX1NBUl9VTkJPVU5EOworCQlicmVhazsKKwljYXNlIFNPQ0tfREdSQU06CisJCXN3aXRjaCAocHJvdG9jb2wpIHsKKyNpZmRlZiBDT05GSUdfSVJEQV9VTFRSQQorCQljYXNlIElSREFQUk9UT19VTFRSQToKKwkJCXNvY2stPm9wcyA9ICZpcmRhX3VsdHJhX29wczsKKwkJCS8qIEluaXRpYWxpc2Ugbm93LCBiZWNhdXNlIHdlIG1heSBzZW5kIG9uIHVuYm91bmQKKwkJCSAqIHNvY2tldHMuIEplYW4gSUkgKi8KKwkJCXNlbGYtPm1heF9kYXRhX3NpemUgPSBVTFRSQV9NQVhfREFUQSAtIExNUF9QSURfSEVBREVSOworCQkJc2VsZi0+bWF4X2hlYWRlcl9zaXplID0gSVJEQV9NQVhfSEVBREVSICsgTE1QX1BJRF9IRUFERVI7CisJCQlicmVhazsKKyNlbmRpZiAvKiBDT05GSUdfSVJEQV9VTFRSQSAqLworCQljYXNlIElSREFQUk9UT19VTklUREFUQToKKwkJCXNvY2stPm9wcyA9ICZpcmRhX2RncmFtX29wczsKKwkJCS8qIFdlIGxldCBVbml0ZGF0YSBjb25uLiBiZSBsaWtlIHNlcXBhY2sgY29ubi4gKi8KKwkJCXNlbGYtPm1heF9zZHVfc2l6ZV9yeCA9IFRUUF9TQVJfVU5CT1VORDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJSVJEQV9FUlJPUigiJXM6IHByb3RvY29sIG5vdCBzdXBwb3J0ZWQhXG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLUVTT0NLVE5PU1VQUE9SVDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVTT0NLVE5PU1VQUE9SVDsKKwl9CisKKwkvKiBSZWdpc3RlciBhcyBhIGNsaWVudCB3aXRoIElyTE1QICovCisJc2VsZi0+Y2tleSA9IGlybG1wX3JlZ2lzdGVyX2NsaWVudCgwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlzZWxmLT5tYXNrLndvcmQgPSAweGZmZmY7CisJc2VsZi0+cnhfZmxvdyA9IHNlbGYtPnR4X2Zsb3cgPSBGTE9XX1NUQVJUOworCXNlbGYtPm5zbG90cyA9IERJU0NPVkVSWV9ERUZBVUxUX1NMT1RTOworCXNlbGYtPmRhZGRyID0gREVWX0FERFJfQU5ZOwkvKiBVbnRpbCB3ZSBnZXQgY29ubmVjdGVkICovCisJc2VsZi0+c2FkZHIgPSAweDA7CQkvKiBzbyBJckxNUCBhc3NpZ24gdXMgYW55IGxpbmsgKi8KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfZGVzdHJveV9zb2NrZXQgKHNlbGYpCisgKgorICogICAgRGVzdHJveSBzb2NrZXQKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlyZGFfZGVzdHJveV9zb2NrZXQoc3RydWN0IGlyZGFfc29jayAqc2VsZikKK3sKKwlJUkRBX0RFQlVHKDIsICIlcyglcClcbiIsIF9fRlVOQ1RJT05fXywgc2VsZik7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCisJLyogVW5yZWdpc3RlciB3aXRoIElyTE1QICovCisJaXJsbXBfdW5yZWdpc3Rlcl9jbGllbnQoc2VsZi0+Y2tleSk7CisJaXJsbXBfdW5yZWdpc3Rlcl9zZXJ2aWNlKHNlbGYtPnNrZXkpOworCisJLyogVW5yZWdpc3RlciB3aXRoIExNLUlBUyAqLworCWlmIChzZWxmLT5pYXNfb2JqKSB7CisJCWlyaWFzX2RlbGV0ZV9vYmplY3Qoc2VsZi0+aWFzX29iaik7CisJCXNlbGYtPmlhc19vYmogPSBOVUxMOworCX0KKworCWlmIChzZWxmLT5pcmlhcCkgeworCQlpcmlhcF9jbG9zZShzZWxmLT5pcmlhcCk7CisJCXNlbGYtPmlyaWFwID0gTlVMTDsKKwl9CisKKwlpZiAoc2VsZi0+dHNhcCkgeworCQlpcnR0cF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZi0+dHNhcCwgTlVMTCwgUF9OT1JNQUwpOworCQlpcnR0cF9jbG9zZV90c2FwKHNlbGYtPnRzYXApOworCQlzZWxmLT50c2FwID0gTlVMTDsKKwl9CisjaWZkZWYgQ09ORklHX0lSREFfVUxUUkEKKwlpZiAoc2VsZi0+bHNhcCkgeworCQlpcmxtcF9jbG9zZV9sc2FwKHNlbGYtPmxzYXApOworCQlzZWxmLT5sc2FwID0gTlVMTDsKKwl9CisjZW5kaWYgLyogQ09ORklHX0lSREFfVUxUUkEgKi8KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfcmVsZWFzZSAoc29jaykKKyAqLworc3RhdGljIGludCBpcmRhX3JlbGVhc2Uoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgaWYgKHNrID09IE5VTEwpCisJCXJldHVybiAwOworCisJc2stPnNrX3N0YXRlICAgICAgID0gVENQX0NMT1NFOworCXNrLT5za19zaHV0ZG93biAgIHw9IFNFTkRfU0hVVERPV047CisJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisKKwkvKiBEZXN0cm95IElyREEgc29ja2V0ICovCisJaXJkYV9kZXN0cm95X3NvY2tldChpcmRhX3NrKHNrKSk7CisKKwlzb2NrX29ycGhhbihzayk7CisJc29jay0+c2sgICA9IE5VTEw7CisKKwkvKiBQdXJnZSBxdWV1ZXMgKHNlZSBzb2NrX2luaXRfZGF0YSgpKSAqLworCXNrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCisJLyogRGVzdHJveSBuZXR3b3JraW5nIHNvY2tldCBpZiB3ZSBhcmUgdGhlIGxhc3QgcmVmZXJlbmNlIG9uIGl0LAorCSAqIGkuZS4gaWYoc2stPnNrX3JlZmNudCA9PSAwKSAtPiBza19mcmVlKHNrKSAqLworCXNvY2tfcHV0KHNrKTsKKworCS8qIE5vdGVzIG9uIHNvY2tldCBsb2NraW5nIGFuZCBkZWFsbG9jYXRpb24uLi4gLSBKZWFuIElJCisJICogSW4gdGhlb3J5IHdlIHNob3VsZCBwdXQgcGFpcnMgb2Ygc29ja19ob2xkKCkgLyBzb2NrX3B1dCgpIHRvCisJICogcHJldmVudCB0aGUgc29ja2V0IHRvIGJlIGRlc3Ryb3llZCB3aGVuZXZlciB0aGVyZSBpcyBhbgorCSAqIG91dHN0YW5kaW5nIHJlcXVlc3Qgb3Igb3V0c3RhbmRpbmcgaW5jb21pbmcgcGFja2V0IG9yIGV2ZW50LgorCSAqCisJICogMSkgVGhpcyBtYXkgaW5jbHVkZSBJQVMgcmVxdWVzdCwgYm90aCBpbiBjb25uZWN0IGFuZCBnZXRzb2Nrb3B0LgorCSAqIFVuZm9ydHVuYXRlbHksIHRoZSBzaXR1YXRpb24gaXMgYSBiaXQgbW9yZSBtZXNzeSB0aGFuIGl0IGxvb2tzLAorCSAqIGJlY2F1c2Ugd2UgY2xvc2UgaXJpYXAgYW5kIGtmcmVlKHNlbGYpIGFib3ZlLgorCSAqCisJICogMikgVGhpcyBtYXkgaW5jbHVkZSBzZWxlY3RpdmUgZGlzY292ZXJ5IGluIGdldHNvY2tvcHQuCisJICogU2FtZSBzdHVmZiBhcyBhYm92ZSwgaXJsbXAgcmVnaXN0cmF0aW9uIGFuZCBzZWxmIGFyZSBnb25lLgorCSAqCisJICogUHJvYmFibHkgMSBhbmQgMiBtYXkgbm90IG1hdHRlciwgYmVjYXVzZSBpdCdzIGFsbCB0cmlnZ2VyZWQKKwkgKiBieSBhIHByb2Nlc3MgYW5kIHRoZSBzb2NrZXQgbGF5ZXIgYWxyZWFkeSBwcmV2ZW50IHRoZQorCSAqIHNvY2tldCB0byBnbyBhd2F5IHdoaWxlIGEgcHJvY2VzcyBpcyBob2xkaW5nIGl0LCB0aHJvdWdoCisJICogc29ja2ZkX3B1dCgpIGFuZCBmcHV0KCkuLi4KKwkgKgorCSAqIDMpIFRoaXMgbWF5IGluY2x1ZGUgZGVmZXJyZWQgVFNBUCBjbG9zdXJlLiBJbiBwYXJ0aWN1bGFyLAorCSAqIHdlIG1heSByZWNlaXZlIGEgbGF0ZSBpcmRhX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbigpCisJICogRm9ydHVuYXRlbHksICh0c2FwX2NiICopLT5jbG9zZV9wZW5kIHNob3VsZCBwcm90ZWN0IHVzCisJICogZnJvbSB0aGF0LgorCSAqCisJICogSSBkaWQgc29tZSB0ZXN0aW5nIG9uIFNNUCwgYW5kIGl0IGxvb2tzIHNvbGlkLiBBbmQgdGhlIHNvY2tldAorCSAqIG1lbW9yeSBsZWFrIGlzIG5vdyBnb25lLi4uIC0gSmVhbiBJSQorCSAqLworCisgICAgICAgIHJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9zZW5kbXNnIChpb2NiLCBzb2NrLCBtc2csIGxlbikKKyAqCisgKiAgICBTZW5kIG1lc3NhZ2UgZG93biB0byBUaW55VFAuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgYm90aCBTVFJFQU0gYW5kCisgKiAgICBTRVFQQUNLIHNlcnZpY2VzLiBUaGlzIGlzIHBvc3NpYmxlIHNpbmNlIGl0IGZvcmNlcyB0aGUgY2xpZW50IHRvCisgKiAgICBmcmFnbWVudCB0aGUgbWVzc2FnZSBpZiBuZWNlc3NhcnkKKyAqLworc3RhdGljIGludCBpcmRhX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBpcmRhX3NvY2sgKnNlbGY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyICphc21wdHI7CisJaW50IGVycjsKKworCUlSREFfREVCVUcoNCwgIiVzKCksIGxlbj0lemRcbiIsIF9fRlVOQ1RJT05fXywgbGVuKTsKKworCS8qIE5vdGUgOiBzb2NrZXQuYyBzZXQgTVNHX0VPUiBvbiBTRVFQQUNLRVQgc29ja2V0cyAqLworCWlmIChtc2ctPm1zZ19mbGFncyAmIH4oTVNHX0RPTlRXQUlUfE1TR19FT1J8TVNHX0NNU0dfQ09NUEFUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc2stPnNrX3NodXRkb3duICYgU0VORF9TSFVURE9XTikgeworCQlzZW5kX3NpZyhTSUdQSVBFLCBjdXJyZW50LCAwKTsKKwkJcmV0dXJuIC1FUElQRTsKKwl9CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkKKwkJcmV0dXJuIC1FTk9UQ09OTjsKKworCXNlbGYgPSBpcmRhX3NrKHNrKTsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJLyogQ2hlY2sgaWYgSXJUVFAgaXMgd2FudHMgdXMgdG8gc2xvdyBkb3duICovCisKKwlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKCooc2stPnNrX3NsZWVwKSwKKwkgICAgKHNlbGYtPnR4X2Zsb3cgIT0gRkxPV19TVE9QICB8fCAgc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJLyogQ2hlY2sgaWYgd2UgYXJlIHN0aWxsIGNvbm5lY3RlZCAqLworCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKQorCQlyZXR1cm4gLUVOT1RDT05OOworCisJLyogQ2hlY2sgdGhhdCB3ZSBkb24ndCBzZW5kIG91dCB0byBiaWcgZnJhbWVzICovCisJaWYgKGxlbiA+IHNlbGYtPm1heF9kYXRhX3NpemUpIHsKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgQ2hvcHBpbmcgZnJhbWUgZnJvbSAlemQgdG8gJWQgYnl0ZXMhXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBsZW4sIHNlbGYtPm1heF9kYXRhX3NpemUpOworCQlsZW4gPSBzZWxmLT5tYXhfZGF0YV9zaXplOworCX0KKworCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssIGxlbiArIHNlbGYtPm1heF9oZWFkZXJfc2l6ZSArIDE2LCAKKwkJCQkgIG1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlULCAmZXJyKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJc2tiX3Jlc2VydmUoc2tiLCBzZWxmLT5tYXhfaGVhZGVyX3NpemUgKyAxNik7CisKKwlhc21wdHIgPSBza2ItPmgucmF3ID0gc2tiX3B1dChza2IsIGxlbik7CisJZXJyID0gbWVtY3B5X2Zyb21pb3ZlYyhhc21wdHIsIG1zZy0+bXNnX2lvdiwgbGVuKTsKKwlpZiAoZXJyKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qCisJICogSnVzdCBzZW5kIHRoZSBtZXNzYWdlIHRvIFRpbnlUUCwgYW5kIGxldCBpdCBkZWFsIHdpdGggcG9zc2libGUKKwkgKiBlcnJvcnMuIE5vIG5lZWQgdG8gZHVwbGljYXRlIGFsbCB0aGF0IGhlcmUKKwkgKi8KKwllcnIgPSBpcnR0cF9kYXRhX3JlcXVlc3Qoc2VsZi0+dHNhcCwgc2tiKTsKKwlpZiAoZXJyKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGVycj0lZFxuIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKwkvKiBUZWxsIGNsaWVudCBob3cgbXVjaCBkYXRhIHdlIGFjdHVhbGx5IHNlbnQgKi8KKwlyZXR1cm4gbGVuOworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9yZWN2bXNnX2RncmFtIChpb2NiLCBzb2NrLCBtc2csIHNpemUsIGZsYWdzKQorICoKKyAqICAgIFRyeSB0byByZWNlaXZlIG1lc3NhZ2UgYW5kIGNvcHkgaXQgdG8gdXNlci4gVGhlIGZyYW1lIGlzIGRpc2NhcmRlZAorICogICAgYWZ0ZXIgYmVpbmcgcmVhZCwgcmVnYXJkbGVzcyBvZiBob3cgbXVjaCB0aGUgdXNlciBhY3R1YWxseSByZWFkCisgKi8KK3N0YXRpYyBpbnQgaXJkYV9yZWN2bXNnX2RncmFtKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCSAgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgaXJkYV9zb2NrICpzZWxmID0gaXJkYV9zayhzayk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzaXplX3QgY29waWVkOworCWludCBlcnI7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCXNrYiA9IHNrYl9yZWN2X2RhdGFncmFtKHNrLCBmbGFncyAmIH5NU0dfRE9OVFdBSVQsCisJCQkJZmxhZ3MgJiBNU0dfRE9OVFdBSVQsICZlcnIpOworCWlmICghc2tiKQorCQlyZXR1cm4gZXJyOworCisJc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwljb3BpZWQgICAgID0gc2tiLT5sZW47CisKKwlpZiAoY29waWVkID4gc2l6ZSkgeworCQlJUkRBX0RFQlVHKDIsICIlcygpLCBSZWNlaXZlZCB0cnVuY2F0ZWQgZnJhbWUgKCV6ZCA8ICV6ZCkhXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBjb3BpZWQsIHNpemUpOworCQljb3BpZWQgPSBzaXplOworCQltc2ctPm1zZ19mbGFncyB8PSBNU0dfVFJVTkM7CisJfQorCXNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgMCwgbXNnLT5tc2dfaW92LCBjb3BpZWQpOworCisJc2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7CisKKwkvKgorCSAqICBDaGVjayBpZiB3ZSBoYXZlIHByZXZpb3VzbHkgc3RvcHBlZCBJclRUUCBhbmQgd2Uga25vdworCSAqICBoYXZlIG1vcmUgZnJlZSBzcGFjZSBpbiBvdXIgcnhfcXVldWUuIElmIHNvIHRlbGwgSXJUVFAKKwkgKiAgdG8gc3RhcnQgZGVsaXZlcmluZyBmcmFtZXMgYWdhaW4gYmVmb3JlIG91ciByeF9xdWV1ZSBnZXRzCisJICogIGVtcHR5CisJICovCisJaWYgKHNlbGYtPnJ4X2Zsb3cgPT0gRkxPV19TVE9QKSB7CisJCWlmICgoYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSA8PCAyKSA8PSBzay0+c2tfcmN2YnVmKSB7CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBTdGFydGluZyBJclRUUFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXNlbGYtPnJ4X2Zsb3cgPSBGTE9XX1NUQVJUOworCQkJaXJ0dHBfZmxvd19yZXF1ZXN0KHNlbGYtPnRzYXAsIEZMT1dfU1RBUlQpOworCQl9CisJfQorCisJcmV0dXJuIGNvcGllZDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfcmVjdm1zZ19zdHJlYW0gKGlvY2IsIHNvY2ssIG1zZywgc2l6ZSwgZmxhZ3MpCisgKi8KK3N0YXRpYyBpbnQgaXJkYV9yZWN2bXNnX3N0cmVhbShzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBpcmRhX3NvY2sgKnNlbGYgPSBpcmRhX3NrKHNrKTsKKwlpbnQgbm9ibG9jayA9IGZsYWdzICYgTVNHX0RPTlRXQUlUOworCXNpemVfdCBjb3BpZWQgPSAwOworCWludCB0YXJnZXQgPSAxOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXRxLCBjdXJyZW50KTsKKworCUlSREFfREVCVUcoMywgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJaWYgKHNvY2stPmZsYWdzICYgX19TT19BQ0NFUFRDT04pCisJCXJldHVybigtRUlOVkFMKTsKKworCWlmIChmbGFncyAmIE1TR19PT0IpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChmbGFncyAmIE1TR19XQUlUQUxMKQorCQl0YXJnZXQgPSBzaXplOworCisJbXNnLT5tc2dfbmFtZWxlbiA9IDA7CisKKwlkbyB7CisJCWludCBjaHVuazsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisKKwkJaWYgKHNrYj09TlVMTCkgeworCQkJaW50IHJldCA9IDA7CisKKwkJCWlmIChjb3BpZWQgPj0gdGFyZ2V0KQorCQkJCWJyZWFrOworCisJCQkvKiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgYSBjdXQnbidwYXN0ZSBvZiB0aGUKKwkJCSAqIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgpIG1hY3JvLgorCQkJICogV2UgZG9uJ3QgdXMgdGhlIG1hY3JvIGJlY2F1c2UgdGhlIHRlc3QgY29uZGl0aW9uCisJCQkgKiBpcyBtZXNzeS4gLSBKZWFuIElJICovCisJCQlzZXRfYml0KFNPQ0tfQVNZTkNfV0FJVERBVEEsICZzay0+c2tfc29ja2V0LT5mbGFncyk7CisJCQlhZGRfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0cSk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCQkvKgorCQkJICoJUE9TSVggMTAwMy4xZyBtYW5kYXRlcyB0aGlzIG9yZGVyLgorCQkJICovCisJCQlpZiAoc2stPnNrX2VycikKKwkJCQlyZXQgPSBzb2NrX2Vycm9yKHNrKTsKKwkJCWVsc2UgaWYgKHNrLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikKKwkJCQk7CisJCQllbHNlIGlmIChub2Jsb2NrKQorCQkJCXJldCA9IC1FQUdBSU47CisJCQllbHNlIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQllbHNlIGlmIChza2JfcGVlaygmc2stPnNrX3JlY2VpdmVfcXVldWUpID09IE5VTEwpCisJCQkJLyogV2FpdCBwcm9jZXNzIHVudGlsIGRhdGEgYXJyaXZlcyAqLworCQkJCXNjaGVkdWxlKCk7CisKKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQkJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdHEpOworCQkJY2xlYXJfYml0KFNPQ0tfQVNZTkNfV0FJVERBVEEsICZzay0+c2tfc29ja2V0LT5mbGFncyk7CisKKwkJCWlmKHJldCkKKwkJCQlyZXR1cm4ocmV0KTsKKwkJCWlmIChzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pCisJCQkJYnJlYWs7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJY2h1bmsgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHNrYi0+bGVuLCBzaXplKTsKKwkJaWYgKG1lbWNweV90b2lvdmVjKG1zZy0+bXNnX2lvdiwgc2tiLT5kYXRhLCBjaHVuaykpIHsKKwkJCXNrYl9xdWV1ZV9oZWFkKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKKwkJCWlmIChjb3BpZWQgPT0gMCkKKwkJCQljb3BpZWQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJY29waWVkICs9IGNodW5rOworCQlzaXplIC09IGNodW5rOworCisJCS8qIE1hcmsgcmVhZCBwYXJ0IG9mIHNrYiBhcyB1c2VkICovCisJCWlmICghKGZsYWdzICYgTVNHX1BFRUspKSB7CisJCQlza2JfcHVsbChza2IsIGNodW5rKTsKKworCQkJLyogcHV0IHRoZSBza2IgYmFjayBpZiB3ZSBkaWRuJ3QgdXNlIGl0IHVwLi4gKi8KKwkJCWlmIChza2ItPmxlbikgeworCQkJCUlSREFfREVCVUcoMSwgIiVzKCksIGJhY2sgb24gcSFcbiIsCisJCQkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCQkJc2tiX3F1ZXVlX2hlYWQoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJfSBlbHNlIHsKKwkJCUlSREFfREVCVUcoMCwgIiVzKCkgcXVlc3Rpb25hYmxlIT9cbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJCS8qIHB1dCBtZXNzYWdlIGJhY2sgYW5kIHJldHVybiAqLworCQkJc2tiX3F1ZXVlX2hlYWQoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChzaXplKTsKKworCS8qCisJICogIENoZWNrIGlmIHdlIGhhdmUgcHJldmlvdXNseSBzdG9wcGVkIElyVFRQIGFuZCB3ZSBrbm93CisJICogIGhhdmUgbW9yZSBmcmVlIHNwYWNlIGluIG91ciByeF9xdWV1ZS4gSWYgc28gdGVsbCBJclRUUAorCSAqICB0byBzdGFydCBkZWxpdmVyaW5nIGZyYW1lcyBhZ2FpbiBiZWZvcmUgb3VyIHJ4X3F1ZXVlIGdldHMKKwkgKiAgZW1wdHkKKwkgKi8KKwlpZiAoc2VsZi0+cnhfZmxvdyA9PSBGTE9XX1NUT1ApIHsKKwkJaWYgKChhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpIDw8IDIpIDw9IHNrLT5za19yY3ZidWYpIHsKKwkJCUlSREFfREVCVUcoMiwgIiVzKCksIFN0YXJ0aW5nIElyVFRQXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJc2VsZi0+cnhfZmxvdyA9IEZMT1dfU1RBUlQ7CisJCQlpcnR0cF9mbG93X3JlcXVlc3Qoc2VsZi0+dHNhcCwgRkxPV19TVEFSVCk7CisJCX0KKwl9CisKKwlyZXR1cm4gY29waWVkOworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9zZW5kbXNnX2RncmFtIChpb2NiLCBzb2NrLCBtc2csIGxlbikKKyAqCisgKiAgICBTZW5kIG1lc3NhZ2UgZG93biB0byBUaW55VFAgZm9yIHRoZSB1bnJlbGlhYmxlIHNlcXVlbmNlZAorICogICAgcGFja2V0IHNlcnZpY2UuLi4KKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJkYV9zZW5kbXNnX2RncmFtKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCSAgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgaXJkYV9zb2NrICpzZWxmOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgY2hhciAqYXNtcHRyOworCWludCBlcnI7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpLCBsZW49JXpkXG4iLCBfX0ZVTkNUSU9OX18sIGxlbik7CisKKwlpZiAobXNnLT5tc2dfZmxhZ3MgJiB+KE1TR19ET05UV0FJVHxNU0dfQ01TR19DT01QQVQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzay0+c2tfc2h1dGRvd24gJiBTRU5EX1NIVVRET1dOKSB7CisJCXNlbmRfc2lnKFNJR1BJUEUsIGN1cnJlbnQsIDApOworCQlyZXR1cm4gLUVQSVBFOworCX0KKworCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKQorCQlyZXR1cm4gLUVOT1RDT05OOworCisJc2VsZiA9IGlyZGFfc2soc2spOworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwkvKgorCSAqIENoZWNrIHRoYXQgd2UgZG9uJ3Qgc2VuZCBvdXQgdG8gYmlnIGZyYW1lcy4gVGhpcyBpcyBhbiB1bnJlbGlhYmxlCisJICogc2VydmljZSwgc28gd2UgaGF2ZSBubyBmcmFnbWVudGF0aW9uIGFuZCBubyBjb2FsZXNjZW5jZQorCSAqLworCWlmIChsZW4gPiBzZWxmLT5tYXhfZGF0YV9zaXplKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIFdhcm5pbmcgdG8gbXVjaCBkYXRhISAiCisJCQkgICAiQ2hvcHBpbmcgZnJhbWUgZnJvbSAlemQgdG8gJWQgYnl0ZXMhXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBsZW4sIHNlbGYtPm1heF9kYXRhX3NpemUpOworCQlsZW4gPSBzZWxmLT5tYXhfZGF0YV9zaXplOworCX0KKworCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssIGxlbiArIHNlbGYtPm1heF9oZWFkZXJfc2l6ZSwKKwkJCQkgIG1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlULCAmZXJyKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJc2tiX3Jlc2VydmUoc2tiLCBzZWxmLT5tYXhfaGVhZGVyX3NpemUpOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgYXBwZW5kaW5nIHVzZXIgZGF0YVxuIiwgX19GVU5DVElPTl9fKTsKKwlhc21wdHIgPSBza2ItPmgucmF3ID0gc2tiX3B1dChza2IsIGxlbik7CisJZXJyID0gbWVtY3B5X2Zyb21pb3ZlYyhhc21wdHIsIG1zZy0+bXNnX2lvdiwgbGVuKTsKKwlpZiAoZXJyKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qCisJICogSnVzdCBzZW5kIHRoZSBtZXNzYWdlIHRvIFRpbnlUUCwgYW5kIGxldCBpdCBkZWFsIHdpdGggcG9zc2libGUKKwkgKiBlcnJvcnMuIE5vIG5lZWQgdG8gZHVwbGljYXRlIGFsbCB0aGF0IGhlcmUKKwkgKi8KKwllcnIgPSBpcnR0cF91ZGF0YV9yZXF1ZXN0KHNlbGYtPnRzYXAsIHNrYik7CisJaWYgKGVycikgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBlcnI9JWRcbiIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfc2VuZG1zZ191bHRyYSAoaW9jYiwgc29jaywgbXNnLCBsZW4pCisgKgorICogICAgU2VuZCBtZXNzYWdlIGRvd24gdG8gSXJMTVAgZm9yIHRoZSB1bnJlbGlhYmxlIFVsdHJhCisgKiAgICBwYWNrZXQgc2VydmljZS4uLgorICovCisjaWZkZWYgQ09ORklHX0lSREFfVUxUUkEKK3N0YXRpYyBpbnQgaXJkYV9zZW5kbXNnX3VsdHJhKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCSAgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgaXJkYV9zb2NrICpzZWxmOworCV9fdTggcGlkID0gMDsKKwlpbnQgYm91bmQgPSAwOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgY2hhciAqYXNtcHRyOworCWludCBlcnI7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpLCBsZW49JXpkXG4iLCBfX0ZVTkNUSU9OX18sIGxlbik7CisKKwlpZiAobXNnLT5tc2dfZmxhZ3MgJiB+KE1TR19ET05UV0FJVHxNU0dfQ01TR19DT01QQVQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzay0+c2tfc2h1dGRvd24gJiBTRU5EX1NIVVRET1dOKSB7CisJCXNlbmRfc2lnKFNJR1BJUEUsIGN1cnJlbnQsIDApOworCQlyZXR1cm4gLUVQSVBFOworCX0KKworCXNlbGYgPSBpcmRhX3NrKHNrKTsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJLyogQ2hlY2sgaWYgYW4gYWRkcmVzcyB3YXMgc3BlY2lmaWVkIHdpdGggc2VuZHRvLiBKZWFuIElJICovCisJaWYgKG1zZy0+bXNnX25hbWUpIHsKKwkJc3RydWN0IHNvY2thZGRyX2lyZGEgKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2lyZGEgKikgbXNnLT5tc2dfbmFtZTsKKwkJLyogQ2hlY2sgYWRkcmVzcywgZXh0cmFjdCBwaWQuIEplYW4gSUkgKi8KKwkJaWYgKG1zZy0+bXNnX25hbWVsZW4gPCBzaXplb2YoKmFkZHIpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChhZGRyLT5zaXJfZmFtaWx5ICE9IEFGX0lSREEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlwaWQgPSBhZGRyLT5zaXJfbHNhcF9zZWw7CisJCWlmIChwaWQgJiAweDgwKSB7CisJCQlJUkRBX0RFQlVHKDAsICIlcygpLCBleHRlbnNpb24gaW4gUElEIG5vdCBzdXBwIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIENoZWNrIHRoYXQgdGhlIHNvY2tldCBpcyBwcm9wZXJseSBib3VuZCB0byBhbiBVbHRyYQorCQkgKiBwb3J0LiBKZWFuIElJICovCisJCWlmICgoc2VsZi0+bHNhcCA9PSBOVUxMKSB8fAorCQkgICAgKHNrLT5za19zdGF0ZSAhPSBUQ1BfRVNUQUJMSVNIRUQpKSB7CisJCQlJUkRBX0RFQlVHKDAsICIlcygpLCBzb2NrZXQgbm90IGJvdW5kIHRvIFVsdHJhIFBJRC5cbiIsCisJCQkJICAgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtRU5PVENPTk47CisJCX0KKwkJLyogVXNlIFBJRCBmcm9tIHNvY2tldCAqLworCQlib3VuZCA9IDE7CisJfQorCisJLyoKKwkgKiBDaGVjayB0aGF0IHdlIGRvbid0IHNlbmQgb3V0IHRvIGJpZyBmcmFtZXMuIFRoaXMgaXMgYW4gdW5yZWxpYWJsZQorCSAqIHNlcnZpY2UsIHNvIHdlIGhhdmUgbm8gZnJhZ21lbnRhdGlvbiBhbmQgbm8gY29hbGVzY2VuY2UKKwkgKi8KKwlpZiAobGVuID4gc2VsZi0+bWF4X2RhdGFfc2l6ZSkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBXYXJuaW5nIHRvIG11Y2ggZGF0YSEgIgorCQkJICAgIkNob3BwaW5nIGZyYW1lIGZyb20gJXpkIHRvICVkIGJ5dGVzIVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgbGVuLCBzZWxmLT5tYXhfZGF0YV9zaXplKTsKKwkJbGVuID0gc2VsZi0+bWF4X2RhdGFfc2l6ZTsKKwl9CisKKwlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCBsZW4gKyBzZWxmLT5tYXhfaGVhZGVyX3NpemUsCisJCQkJICBtc2ctPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVCwgJmVycik7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PQlVGUzsKKworCXNrYl9yZXNlcnZlKHNrYiwgc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKKworCUlSREFfREVCVUcoNCwgIiVzKCksIGFwcGVuZGluZyB1c2VyIGRhdGFcbiIsIF9fRlVOQ1RJT05fXyk7CisJYXNtcHRyID0gc2tiLT5oLnJhdyA9IHNrYl9wdXQoc2tiLCBsZW4pOworCWVyciA9IG1lbWNweV9mcm9taW92ZWMoYXNtcHRyLCBtc2ctPm1zZ19pb3YsIGxlbik7CisJaWYgKGVycikgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBpcmxtcF9jb25ubGVzc19kYXRhX3JlcXVlc3QoKGJvdW5kID8gc2VsZi0+bHNhcCA6IE5VTEwpLAorCQkJCQkgIHNrYiwgcGlkKTsKKwlpZiAoZXJyKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGVycj0lZFxuIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gbGVuOworfQorI2VuZGlmIC8qIENPTkZJR19JUkRBX1VMVFJBICovCisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX3NodXRkb3duIChzaywgaG93KQorICovCitzdGF0aWMgaW50IGlyZGFfc2h1dGRvd24oc3RydWN0IHNvY2tldCAqc29jaywgaW50IGhvdykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgaXJkYV9zb2NrICpzZWxmID0gaXJkYV9zayhzayk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJSVJEQV9ERUJVRygxLCAiJXMoJXApXG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYpOworCisJc2stPnNrX3N0YXRlICAgICAgID0gVENQX0NMT1NFOworCXNrLT5za19zaHV0ZG93biAgIHw9IFNFTkRfU0hVVERPV047CisJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisKKwlpZiAoc2VsZi0+aXJpYXApIHsKKwkJaXJpYXBfY2xvc2Uoc2VsZi0+aXJpYXApOworCQlzZWxmLT5pcmlhcCA9IE5VTEw7CisJfQorCisJaWYgKHNlbGYtPnRzYXApIHsKKwkJaXJ0dHBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYtPnRzYXAsIE5VTEwsIFBfTk9STUFMKTsKKwkJaXJ0dHBfY2xvc2VfdHNhcChzZWxmLT50c2FwKTsKKwkJc2VsZi0+dHNhcCA9IE5VTEw7CisJfQorCisJLyogQSBmZXcgY2xlYW51cCBzbyB0aGUgc29ja2V0IGxvb2sgYXMgZ29vZCBhcyBuZXcuLi4gKi8KKwlzZWxmLT5yeF9mbG93ID0gc2VsZi0+dHhfZmxvdyA9IEZMT1dfU1RBUlQ7CS8qIG5lZWRlZCA/Pz8gKi8KKwlzZWxmLT5kYWRkciA9IERFVl9BRERSX0FOWTsJLyogVW50aWwgd2UgZ2V0IHJlLWNvbm5lY3RlZCAqLworCXNlbGYtPnNhZGRyID0gMHgwOwkJLyogc28gSXJMTVAgYXNzaWduIHVzIGFueSBsaW5rICovCisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX3BvbGwgKGZpbGUsIHNvY2ssIHdhaXQpCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXJkYV9wb2xsKHN0cnVjdCBmaWxlICogZmlsZSwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCSAgICAgIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGlyZGFfc29jayAqc2VsZiA9IGlyZGFfc2soc2spOworCXVuc2lnbmVkIGludCBtYXNrOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXBvbGxfd2FpdChmaWxlLCBzay0+c2tfc2xlZXAsIHdhaXQpOworCW1hc2sgPSAwOworCisJLyogRXhjZXB0aW9uYWwgZXZlbnRzPyAqLworCWlmIChzay0+c2tfZXJyKQorCQltYXNrIHw9IFBPTExFUlI7CisJaWYgKHNrLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBQT0xMSFVQXG4iLCBfX0ZVTkNUSU9OX18pOworCQltYXNrIHw9IFBPTExIVVA7CisJfQorCisJLyogUmVhZGFibGU/ICovCisJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSkgeworCQlJUkRBX0RFQlVHKDQsICJTb2NrZXQgaXMgcmVhZGFibGVcbiIpOworCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCisJLyogQ29ubmVjdGlvbi1iYXNlZCBuZWVkIHRvIGNoZWNrIGZvciB0ZXJtaW5hdGlvbiBhbmQgc3RhcnR1cCAqLworCXN3aXRjaCAoc2stPnNrX3R5cGUpIHsKKwljYXNlIFNPQ0tfU1RSRUFNOgorCQlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9DTE9TRSkgeworCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgUE9MTEhVUFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCW1hc2sgfD0gUE9MTEhVUDsKKwkJfQorCisJCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0VTVEFCTElTSEVEKSB7CisJCQlpZiAoKHNlbGYtPnR4X2Zsb3cgPT0gRkxPV19TVEFSVCkgJiYKKwkJCSAgICBzb2NrX3dyaXRlYWJsZShzaykpCisJCQl7CisJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STSB8IFBPTExXUkJBTkQ7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTT0NLX1NFUVBBQ0tFVDoKKwkJaWYgKChzZWxmLT50eF9mbG93ID09IEZMT1dfU1RBUlQpICYmCisJCSAgICBzb2NrX3dyaXRlYWJsZShzaykpCisJCXsKKwkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk0gfCBQT0xMV1JCQU5EOworCQl9CisJCWJyZWFrOworCWNhc2UgU09DS19ER1JBTToKKwkJaWYgKHNvY2tfd3JpdGVhYmxlKHNrKSkKKwkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk0gfCBQT0xMV1JCQU5EOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIG1hc2s7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2lvY3RsIChzb2NrLCBjbWQsIGFyZykKKyAqLworc3RhdGljIGludCBpcmRhX2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgY21kPSUjeFxuIiwgX19GVU5DVElPTl9fLCBjbWQpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFRJT0NPVVRROiB7CisJCWxvbmcgYW1vdW50OworCQlhbW91bnQgPSBzay0+c2tfc25kYnVmIC0gYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKTsKKwkJaWYgKGFtb3VudCA8IDApCisJCQlhbW91bnQgPSAwOworCQlpZiAocHV0X3VzZXIoYW1vdW50LCAodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBUSU9DSU5ROiB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWxvbmcgYW1vdW50ID0gMEw7CisJCS8qIFRoZXNlIHR3byBhcmUgc2FmZSBvbiBhIHNpbmdsZSBDUFUgc3lzdGVtIGFzIG9ubHkgdXNlciB0YXNrcyBmaWRkbGUgaGVyZSAqLworCQlpZiAoKHNrYiA9IHNrYl9wZWVrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpICE9IE5VTEwpCisJCQlhbW91bnQgPSBza2ItPmxlbjsKKwkJaWYgKHB1dF91c2VyKGFtb3VudCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKworCWNhc2UgU0lPQ0dTVEFNUDoKKwkJaWYgKHNrICE9IE5VTEwpCisJCQlyZXR1cm4gc29ja19nZXRfdGltZXN0YW1wKHNrLCAoc3RydWN0IHRpbWV2YWwgX191c2VyICopYXJnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljYXNlIFNJT0NHSUZBRERSOgorCWNhc2UgU0lPQ1NJRkFERFI6CisJY2FzZSBTSU9DR0lGRFNUQUREUjoKKwljYXNlIFNJT0NTSUZEU1RBRERSOgorCWNhc2UgU0lPQ0dJRkJSREFERFI6CisJY2FzZSBTSU9DU0lGQlJEQUREUjoKKwljYXNlIFNJT0NHSUZORVRNQVNLOgorCWNhc2UgU0lPQ1NJRk5FVE1BU0s6CisJY2FzZSBTSU9DR0lGTUVUUklDOgorCWNhc2UgU0lPQ1NJRk1FVFJJQzoKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgZG9pbmcgZGV2aWNlIGlvY3RsIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIGRldl9pb2N0bChjbWQsICh2b2lkIF9fdXNlciAqKSBhcmcpOworCX0KKworCS8qTk9UUkVBQ0hFRCovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX3NldHNvY2tvcHQgKHNvY2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbikKKyAqCisgKiAgICBTZXQgc29tZSBvcHRpb25zIGZvciB0aGUgc29ja2V0CisgKgorICovCitzdGF0aWMgaW50IGlyZGFfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkJICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgaXJkYV9zb2NrICpzZWxmID0gaXJkYV9zayhzayk7CisJc3RydWN0IGlyZGFfaWFzX3NldCAgICAqaWFzX29wdDsKKwlzdHJ1Y3QgaWFzX29iamVjdCAgICAgICppYXNfb2JqOworCXN0cnVjdCBpYXNfYXR0cmliICoJaWFzX2F0dHI7CS8qIEF0dHJpYnV0ZSBpbiBJQVMgb2JqZWN0ICovCisJaW50IG9wdDsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlJUkRBX0RFQlVHKDIsICIlcyglcClcbiIsIF9fRlVOQ1RJT05fXywgc2VsZik7CisKKwlpZiAobGV2ZWwgIT0gU09MX0lSTE1QKQorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCisJc3dpdGNoIChvcHRuYW1lKSB7CisJY2FzZSBJUkxNUF9JQVNfU0VUOgorCQkvKiBUaGUgdXNlciB3YW50IHRvIGFkZCBhbiBhdHRyaWJ1dGUgdG8gYW4gZXhpc3RpbmcgSUFTIG9iamVjdAorCQkgKiAoaW4gdGhlIElBUyBkYXRhYmFzZSkgb3IgdG8gY3JlYXRlIGEgbmV3IG9iamVjdCB3aXRoIHRoaXMKKwkJICogYXR0cmlidXRlLgorCQkgKiBXZSBmaXJzdCBxdWVyeSBJQVMgdG8ga25vdyBpZiB0aGUgb2JqZWN0IGV4aXN0LCBhbmQgdGhlbgorCQkgKiBjcmVhdGUgdGhlIHJpZ2h0IGF0dHJpYnV0ZS4uLgorCQkgKi8KKworCQlpZiAob3B0bGVuICE9IHNpemVvZihzdHJ1Y3QgaXJkYV9pYXNfc2V0KSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlhc19vcHQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXJkYV9pYXNfc2V0KSwgR0ZQX0FUT01JQyk7CisJCWlmIChpYXNfb3B0ID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQkvKiBDb3B5IHF1ZXJ5IHRvIHRoZSBkcml2ZXIuICovCisJCWlmIChjb3B5X2Zyb21fdXNlcihpYXNfb3B0LCBvcHR2YWwsIG9wdGxlbikpIHsKKwkJCWtmcmVlKGlhc19vcHQpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQkvKiBGaW5kIHRoZSBvYmplY3Qgd2UgdGFyZ2V0LgorCQkgKiBJZiB0aGUgdXNlciBnaXZlcyB1cyBhbiBlbXB0eSBzdHJpbmcsIHdlIHVzZSB0aGUgb2JqZWN0CisJCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvY2tldC4gVGhpcyB3aWxsIHdvcmthcm91bmQKKwkJICogZHVwbGljYXRlZCBjbGFzcyBuYW1lIC0gSmVhbiBJSSAqLworCQlpZihpYXNfb3B0LT5pcmRhX2NsYXNzX25hbWVbMF0gPT0gJ1wwJykgeworCQkJaWYoc2VsZi0+aWFzX29iaiA9PSBOVUxMKSB7CisJCQkJa2ZyZWUoaWFzX29wdCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlpYXNfb2JqID0gc2VsZi0+aWFzX29iajsKKwkJfSBlbHNlCisJCQlpYXNfb2JqID0gaXJpYXNfZmluZF9vYmplY3QoaWFzX29wdC0+aXJkYV9jbGFzc19uYW1lKTsKKworCQkvKiBPbmx5IFJPT1QgY2FuIG1lc3Mgd2l0aCB0aGUgZ2xvYmFsIElBUyBkYXRhYmFzZS4KKwkJICogVXNlcnMgY2FuIG9ubHkgYWRkIGF0dHJpYnV0ZXMgdG8gdGhlIG9iamVjdCBhc3NvY2lhdGVkCisJCSAqIHdpdGggdGhlIHNvY2tldCB0aGV5IG93biAtIEplYW4gSUkgKi8KKwkJaWYoKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSAmJgorCQkgICAoKGlhc19vYmogPT0gTlVMTCkgfHwgKGlhc19vYmogIT0gc2VsZi0+aWFzX29iaikpKSB7CisJCQlrZnJlZShpYXNfb3B0KTsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKworCQkvKiBJZiB0aGUgb2JqZWN0IGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZSBpdCAqLworCQlpZihpYXNfb2JqID09IChzdHJ1Y3QgaWFzX29iamVjdCAqKSBOVUxMKSB7CisJCQkvKiBDcmVhdGUgYSBuZXcgb2JqZWN0ICovCisJCQlpYXNfb2JqID0gaXJpYXNfbmV3X29iamVjdChpYXNfb3B0LT5pcmRhX2NsYXNzX25hbWUsCisJCQkJCQkgICBqaWZmaWVzKTsKKwkJfQorCisJCS8qIERvIHdlIGhhdmUgdGhlIGF0dHJpYnV0ZSBhbHJlYWR5ID8gKi8KKwkJaWYoaXJpYXNfZmluZF9hdHRyaWIoaWFzX29iaiwgaWFzX29wdC0+aXJkYV9hdHRyaWJfbmFtZSkpIHsKKwkJCWtmcmVlKGlhc19vcHQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBMb29rIGF0IHRoZSB0eXBlICovCisJCXN3aXRjaChpYXNfb3B0LT5pcmRhX2F0dHJpYl90eXBlKSB7CisJCWNhc2UgSUFTX0lOVEVHRVI6CisJCQkvKiBBZGQgYW4gaW50ZWdlciBhdHRyaWJ1dGUgKi8KKwkJCWlyaWFzX2FkZF9pbnRlZ2VyX2F0dHJpYigKKwkJCQlpYXNfb2JqLAorCQkJCWlhc19vcHQtPmlyZGFfYXR0cmliX25hbWUsCisJCQkJaWFzX29wdC0+YXR0cmlidXRlLmlyZGFfYXR0cmliX2ludCwKKwkJCQlJQVNfVVNFUl9BVFRSKTsKKwkJCWJyZWFrOworCQljYXNlIElBU19PQ1RfU0VROgorCQkJLyogQ2hlY2sgbGVuZ3RoICovCisJCQlpZihpYXNfb3B0LT5hdHRyaWJ1dGUuaXJkYV9hdHRyaWJfb2N0ZXRfc2VxLmxlbiA+CisJCQkgICBJQVNfTUFYX09DVEVUX1NUUklORykgeworCQkJCWtmcmVlKGlhc19vcHQpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJLyogQWRkIGFuIG9jdGV0IHNlcXVlbmNlIGF0dHJpYnV0ZSAqLworCQkJaXJpYXNfYWRkX29jdHNlcV9hdHRyaWIoCisJCQkgICAgICBpYXNfb2JqLAorCQkJICAgICAgaWFzX29wdC0+aXJkYV9hdHRyaWJfbmFtZSwKKwkJCSAgICAgIGlhc19vcHQtPmF0dHJpYnV0ZS5pcmRhX2F0dHJpYl9vY3RldF9zZXEub2N0ZXRfc2VxLAorCQkJICAgICAgaWFzX29wdC0+YXR0cmlidXRlLmlyZGFfYXR0cmliX29jdGV0X3NlcS5sZW4sCisJCQkgICAgICBJQVNfVVNFUl9BVFRSKTsKKwkJCWJyZWFrOworCQljYXNlIElBU19TVFJJTkc6CisJCQkvKiBTaG91bGQgY2hlY2sgY2hhcnNldCAmIGNvICovCisJCQkvKiBDaGVjayBsZW5ndGggKi8KKwkJCS8qIFRoZSBsZW5ndGggaXMgZW5jb2RlZCBpbiBhIF9fdTgsIGFuZAorCQkJICogSUFTX01BWF9TVFJJTkcgPT0gMjU2LCBzbyB0aGVyZSBpcyBubyB3YXkKKwkJCSAqIHVzZXJzcGFjZSBjYW4gcGFzcyB1cyBhIHN0cmluZyB0b28gbGFyZ2UuCisJCQkgKiBKZWFuIElJICovCisJCQkvKiBOVUxMIHRlcm1pbmF0ZSB0aGUgc3RyaW5nIChhdm9pZCB0cm91YmxlcykgKi8KKwkJCWlhc19vcHQtPmF0dHJpYnV0ZS5pcmRhX2F0dHJpYl9zdHJpbmcuc3RyaW5nW2lhc19vcHQtPmF0dHJpYnV0ZS5pcmRhX2F0dHJpYl9zdHJpbmcubGVuXSA9ICdcMCc7CisJCQkvKiBBZGQgYSBzdHJpbmcgYXR0cmlidXRlICovCisJCQlpcmlhc19hZGRfc3RyaW5nX2F0dHJpYigKKwkJCQlpYXNfb2JqLAorCQkJCWlhc19vcHQtPmlyZGFfYXR0cmliX25hbWUsCisJCQkJaWFzX29wdC0+YXR0cmlidXRlLmlyZGFfYXR0cmliX3N0cmluZy5zdHJpbmcsCisJCQkJSUFTX1VTRVJfQVRUUik7CisJCQlicmVhazsKKwkJZGVmYXVsdCA6CisJCQlrZnJlZShpYXNfb3B0KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlyaWFzX2luc2VydF9vYmplY3QoaWFzX29iaik7CisJCWtmcmVlKGlhc19vcHQpOworCQlicmVhazsKKwljYXNlIElSTE1QX0lBU19ERUw6CisJCS8qIFRoZSB1c2VyIHdhbnQgdG8gZGVsZXRlIGFuIG9iamVjdCBmcm9tIG91ciBsb2NhbCBJQVMKKwkJICogZGF0YWJhc2UuIFdlIGp1c3QgbmVlZCB0byBxdWVyeSB0aGUgSUFTLCBjaGVjayBpcyB0aGUKKwkJICogb2JqZWN0IGlzIG5vdCBvd25lZCBieSB0aGUga2VybmVsIGFuZCBkZWxldGUgaXQuCisJCSAqLworCisJCWlmIChvcHRsZW4gIT0gc2l6ZW9mKHN0cnVjdCBpcmRhX2lhc19zZXQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWFzX29wdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcmRhX2lhc19zZXQpLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGlhc19vcHQgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCS8qIENvcHkgcXVlcnkgdG8gdGhlIGRyaXZlci4gKi8KKwkJaWYgKGNvcHlfZnJvbV91c2VyKGlhc19vcHQsIG9wdHZhbCwgb3B0bGVuKSkgeworCQkJa2ZyZWUoaWFzX29wdCk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCS8qIEZpbmQgdGhlIG9iamVjdCB3ZSB0YXJnZXQuCisJCSAqIElmIHRoZSB1c2VyIGdpdmVzIHVzIGFuIGVtcHR5IHN0cmluZywgd2UgdXNlIHRoZSBvYmplY3QKKwkJICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgc29ja2V0LiBUaGlzIHdpbGwgd29ya2Fyb3VuZAorCQkgKiBkdXBsaWNhdGVkIGNsYXNzIG5hbWUgLSBKZWFuIElJICovCisJCWlmKGlhc19vcHQtPmlyZGFfY2xhc3NfbmFtZVswXSA9PSAnXDAnKQorCQkJaWFzX29iaiA9IHNlbGYtPmlhc19vYmo7CisJCWVsc2UKKwkJCWlhc19vYmogPSBpcmlhc19maW5kX29iamVjdChpYXNfb3B0LT5pcmRhX2NsYXNzX25hbWUpOworCQlpZihpYXNfb2JqID09IChzdHJ1Y3QgaWFzX29iamVjdCAqKSBOVUxMKSB7CisJCQlrZnJlZShpYXNfb3B0KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogT25seSBST09UIGNhbiBtZXNzIHdpdGggdGhlIGdsb2JhbCBJQVMgZGF0YWJhc2UuCisJCSAqIFVzZXJzIGNhbiBvbmx5IGRlbCBhdHRyaWJ1dGVzIGZyb20gdGhlIG9iamVjdCBhc3NvY2lhdGVkCisJCSAqIHdpdGggdGhlIHNvY2tldCB0aGV5IG93biAtIEplYW4gSUkgKi8KKwkJaWYoKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSAmJgorCQkgICAoKGlhc19vYmogPT0gTlVMTCkgfHwgKGlhc19vYmogIT0gc2VsZi0+aWFzX29iaikpKSB7CisJCQlrZnJlZShpYXNfb3B0KTsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKworCQkvKiBGaW5kIHRoZSBhdHRyaWJ1dGUgKGluIHRoZSBvYmplY3QpIHdlIHRhcmdldCAqLworCQlpYXNfYXR0ciA9IGlyaWFzX2ZpbmRfYXR0cmliKGlhc19vYmosCisJCQkJCSAgICAgaWFzX29wdC0+aXJkYV9hdHRyaWJfbmFtZSk7CisJCWlmKGlhc19hdHRyID09IChzdHJ1Y3QgaWFzX2F0dHJpYiAqKSBOVUxMKSB7CisJCQlrZnJlZShpYXNfb3B0KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogQ2hlY2sgaXMgdGhlIHVzZXIgc3BhY2Ugb3duIHRoZSBvYmplY3QgKi8KKwkJaWYoaWFzX2F0dHItPnZhbHVlLT5vd25lciAhPSBJQVNfVVNFUl9BVFRSKSB7CisJCQlJUkRBX0RFQlVHKDEsICIlcygpLCBhdHRlbXB0aW5nIHRvIGRlbGV0ZSBhIGtlcm5lbCBhdHRyaWJ1dGVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlrZnJlZShpYXNfb3B0KTsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKworCQkvKiBSZW1vdmUgdGhlIGF0dHJpYnV0ZSAoYW5kIG1heWJlIHRoZSBvYmplY3QpICovCisJCWlyaWFzX2RlbGV0ZV9hdHRyaWIoaWFzX29iaiwgaWFzX2F0dHIsIDEpOworCQlrZnJlZShpYXNfb3B0KTsKKwkJYnJlYWs7CisJY2FzZSBJUkxNUF9NQVhfU0RVX1NJWkU6CisJCWlmIChvcHRsZW4gPCBzaXplb2YoaW50KSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChnZXRfdXNlcihvcHQsIChpbnQgX191c2VyICopb3B0dmFsKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCS8qIE9ubHkgcG9zc2libGUgZm9yIGEgc2VxcGFja2V0IHNlcnZpY2UgKFRUUCB3aXRoIFNBUikgKi8KKwkJaWYgKHNrLT5za190eXBlICE9IFNPQ0tfU0VRUEFDS0VUKSB7CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBzZXR0aW5nIG1heF9zZHVfc2l6ZSA9ICVkXG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXywgb3B0KTsKKwkJCXNlbGYtPm1heF9zZHVfc2l6ZV9yeCA9IG9wdDsKKwkJfSBlbHNlIHsKKwkJCUlSREFfV0FSTklORygiJXM6IG5vdCBhbGxvd2VkIHRvIHNldCBNQVhTRFVTSVpFIGZvciB0aGlzIHNvY2tldCB0eXBlIVxuIiwKKwkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCQl9CisJCWJyZWFrOworCWNhc2UgSVJMTVBfSElOVFNfU0VUOgorCQlpZiAob3B0bGVuIDwgc2l6ZW9mKGludCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkvKiBUaGUgaW5wdXQgaXMgcmVhbGx5IGEgKF9fdTggaGludHNbMl0pLCBlYXNpZXIgYXMgYW4gaW50ICovCisJCWlmIChnZXRfdXNlcihvcHQsIChpbnQgX191c2VyICopb3B0dmFsKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCS8qIFVucmVnaXN0ZXIgYW55IG9sZCByZWdpc3RyYXRpb24gKi8KKwkJaWYgKHNlbGYtPnNrZXkpCisJCQlpcmxtcF91bnJlZ2lzdGVyX3NlcnZpY2Uoc2VsZi0+c2tleSk7CisKKwkJc2VsZi0+c2tleSA9IGlybG1wX3JlZ2lzdGVyX3NlcnZpY2UoKF9fdTE2KSBvcHQpOworCQlicmVhazsKKwljYXNlIElSTE1QX0hJTlRfTUFTS19TRVQ6CisJCS8qIEFzIG9wcG9zZWQgdG8gdGhlIHByZXZpb3VzIGNhc2Ugd2hpY2ggc2V0IHRoZSBoaW50IGJpdHMKKwkJICogdGhhdCB3ZSBhZHZlcnRpc2UsIHRoaXMgb25lIHNldCB0aGUgZmlsdGVyIHdlIHVzZSB3aGVuCisJCSAqIG1ha2luZyBhIGRpc2NvdmVyeSAobm9kZXMgd2hpY2ggZG9uJ3QgbWF0Y2ggYW55IGhpbnQKKwkJICogYml0IGluIHRoZSBtYXNrIGFyZSBub3QgcmVwb3J0ZWQpLgorCQkgKi8KKwkJaWYgKG9wdGxlbiA8IHNpemVvZihpbnQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogVGhlIGlucHV0IGlzIHJlYWxseSBhIChfX3U4IGhpbnRzWzJdKSwgZWFzaWVyIGFzIGFuIGludCAqLworCQlpZiAoZ2V0X3VzZXIob3B0LCAoaW50IF9fdXNlciAqKW9wdHZhbCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkvKiBTZXQgdGhlIG5ldyBoaW50IG1hc2sgKi8KKwkJc2VsZi0+bWFzay53b3JkID0gKF9fdTE2KSBvcHQ7CisJCS8qIE1hc2sgb3V0IGV4dGVuc2lvbiBiaXRzICovCisJCXNlbGYtPm1hc2sud29yZCAmPSAweDdmN2Y7CisJCS8qIENoZWNrIGlmIG5vIGJpdHMgKi8KKwkJaWYoIXNlbGYtPm1hc2sud29yZCkKKwkJCXNlbGYtPm1hc2sud29yZCA9IDB4RkZGRjsKKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfZXh0cmFjdF9pYXNfdmFsdWUoaWFzX29wdCwgaWFzX3ZhbHVlKQorICoKKyAqICAgIFRyYW5zbGF0ZSBpbnRlcm5hbCBJQVMgdmFsdWUgc3RydWN0dXJlIHRvIHRoZSB1c2VyIHNwYWNlIHJlcHJlc2VudGF0aW9uCisgKgorICogVGhlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIElBUyB2YWx1ZXMsIGFzIHdlIGV4Y2hhbmdlIHRoZW0gd2l0aAorICogdXNlciBzcGFjZSBwcm9ncmFtIGlzIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiwKKyAqIGFzIHN0b3JlZCBpbiB0aGUgSUFTIGRhdGFiYXNlIChiZWNhdXNlIHdlIG5lZWQgYSBmbGF0IHN0cnVjdHVyZSBmb3IKKyAqIGNyb3NzaW5nIGtlcm5lbCBib3VuZGFyeSkuCisgKiBUaGlzIGZ1bmN0aW9uIHRyYW5zZm9ybSB0aGUgZm9ybWVyIGluIHRoZSBsYXR0ZXIuIFdlIGFsc28gY2hlY2sKKyAqIHRoYXQgdGhlIHZhbHVlIHR5cGUgaXMgdmFsaWQuCisgKi8KK3N0YXRpYyBpbnQgaXJkYV9leHRyYWN0X2lhc192YWx1ZShzdHJ1Y3QgaXJkYV9pYXNfc2V0ICppYXNfb3B0LAorCQkJCSAgc3RydWN0IGlhc192YWx1ZSAqaWFzX3ZhbHVlKQoreworCS8qIExvb2sgYXQgdGhlIHR5cGUgKi8KKwlzd2l0Y2ggKGlhc192YWx1ZS0+dHlwZSkgeworCWNhc2UgSUFTX0lOVEVHRVI6CisJCS8qIENvcHkgdGhlIGludGVnZXIgKi8KKwkJaWFzX29wdC0+YXR0cmlidXRlLmlyZGFfYXR0cmliX2ludCA9IGlhc192YWx1ZS0+dC5pbnRlZ2VyOworCQlicmVhazsKKwljYXNlIElBU19PQ1RfU0VROgorCQkvKiBTZXQgbGVuZ3RoICovCisJCWlhc19vcHQtPmF0dHJpYnV0ZS5pcmRhX2F0dHJpYl9vY3RldF9zZXEubGVuID0gaWFzX3ZhbHVlLT5sZW47CisJCS8qIENvcHkgb3ZlciAqLworCQltZW1jcHkoaWFzX29wdC0+YXR0cmlidXRlLmlyZGFfYXR0cmliX29jdGV0X3NlcS5vY3RldF9zZXEsCisJCSAgICAgICBpYXNfdmFsdWUtPnQub2N0X3NlcSwgaWFzX3ZhbHVlLT5sZW4pOworCQlicmVhazsKKwljYXNlIElBU19TVFJJTkc6CisJCS8qIFNldCBsZW5ndGggKi8KKwkJaWFzX29wdC0+YXR0cmlidXRlLmlyZGFfYXR0cmliX3N0cmluZy5sZW4gPSBpYXNfdmFsdWUtPmxlbjsKKwkJaWFzX29wdC0+YXR0cmlidXRlLmlyZGFfYXR0cmliX3N0cmluZy5jaGFyc2V0ID0gaWFzX3ZhbHVlLT5jaGFyc2V0OworCQkvKiBDb3B5IG92ZXIgKi8KKwkJbWVtY3B5KGlhc19vcHQtPmF0dHJpYnV0ZS5pcmRhX2F0dHJpYl9zdHJpbmcuc3RyaW5nLAorCQkgICAgICAgaWFzX3ZhbHVlLT50LnN0cmluZywgaWFzX3ZhbHVlLT5sZW4pOworCQkvKiBOVUxMIHRlcm1pbmF0ZSB0aGUgc3RyaW5nIChhdm9pZCB0cm91YmxlcykgKi8KKwkJaWFzX29wdC0+YXR0cmlidXRlLmlyZGFfYXR0cmliX3N0cmluZy5zdHJpbmdbaWFzX3ZhbHVlLT5sZW5dID0gJ1wwJzsKKwkJYnJlYWs7CisJY2FzZSBJQVNfTUlTU0lORzoKKwlkZWZhdWx0IDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ29weSB0eXBlIG92ZXIgKi8KKwlpYXNfb3B0LT5pcmRhX2F0dHJpYl90eXBlID0gaWFzX3ZhbHVlLT50eXBlOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2dldHNvY2tvcHQgKHNvY2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbikKKyAqLworc3RhdGljIGludCBpcmRhX2dldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJCSAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgaXJkYV9zb2NrICpzZWxmID0gaXJkYV9zayhzayk7CisJc3RydWN0IGlyZGFfZGV2aWNlX2xpc3QgbGlzdDsKKwlzdHJ1Y3QgaXJkYV9kZXZpY2VfaW5mbyAqZGlzY292ZXJpZXM7CisJc3RydWN0IGlyZGFfaWFzX3NldCAqCWlhc19vcHQ7CS8qIElBUyBnZXQvcXVlcnkgcGFyYW1zICovCisJc3RydWN0IGlhc19vYmplY3QgKglpYXNfb2JqOwkvKiBPYmplY3QgaW4gSUFTICovCisJc3RydWN0IGlhc19hdHRyaWIgKglpYXNfYXR0cjsJLyogQXR0cmlidXRlIGluIElBUyBvYmplY3QgKi8KKwlpbnQgZGFkZHIgPSBERVZfQUREUl9BTlk7CS8qIERlc3QgYWRkcmVzcyBmb3IgSUFTIHF1ZXJpZXMgKi8KKwlpbnQgdmFsID0gMDsKKwlpbnQgbGVuID0gMDsKKwlpbnQgZXJyOworCWludCBvZmZzZXQsIHRvdGFsOworCisJSVJEQV9ERUJVRygyLCAiJXMoJXApXG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYpOworCisJaWYgKGxldmVsICE9IFNPTF9JUkxNUCkKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKworCWlmIChnZXRfdXNlcihsZW4sIG9wdGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYobGVuIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKG9wdG5hbWUpIHsKKwljYXNlIElSTE1QX0VOVU1ERVZJQ0VTOgorCQkvKiBBc2sgbG1wIGZvciB0aGUgY3VycmVudCBkaXNjb3ZlcnkgbG9nICovCisJCWRpc2NvdmVyaWVzID0gaXJsbXBfZ2V0X2Rpc2NvdmVyaWVzKCZsaXN0Lmxlbiwgc2VsZi0+bWFzay53b3JkLAorCQkJCQkJICAgIHNlbGYtPm5zbG90cyk7CisJCS8qIENoZWNrIGlmIHRoZSB3ZSBnb3Qgc29tZSByZXN1bHRzICovCisJCWlmIChkaXNjb3ZlcmllcyA9PSBOVUxMKQorCQkJcmV0dXJuIC1FQUdBSU47CQkvKiBEaWRuJ3QgZmluZCBhbnkgZGV2aWNlcyAqLworCQllcnIgPSAwOworCisJCS8qIFdyaXRlIHRvdGFsIGxpc3QgbGVuZ3RoIGJhY2sgdG8gY2xpZW50ICovCisJCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAmbGlzdCwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBpcmRhX2RldmljZV9saXN0KSAtCisJCQkJIHNpemVvZihzdHJ1Y3QgaXJkYV9kZXZpY2VfaW5mbykpKQorCQkJZXJyID0gLUVGQVVMVDsKKworCQkvKiBPZmZzZXQgdG8gZmlyc3QgZGV2aWNlIGVudHJ5ICovCisJCW9mZnNldCA9IHNpemVvZihzdHJ1Y3QgaXJkYV9kZXZpY2VfbGlzdCkgLQorCQkJc2l6ZW9mKHN0cnVjdCBpcmRhX2RldmljZV9pbmZvKTsKKworCQkvKiBDb3B5IHRoZSBsaXN0IGl0c2VsZiAtIHdhdGNoIGZvciBvdmVyZmxvdyAqLworCQlpZihsaXN0LmxlbiA+IDIwNDgpCisJCXsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIGJlZDsKKwkJfQorCQl0b3RhbCA9IG9mZnNldCArIChsaXN0LmxlbiAqIHNpemVvZihzdHJ1Y3QgaXJkYV9kZXZpY2VfaW5mbykpOworCQlpZiAodG90YWwgPiBsZW4pCisJCQl0b3RhbCA9IGxlbjsKKwkJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwrb2Zmc2V0LCBkaXNjb3ZlcmllcywgdG90YWwgLSBvZmZzZXQpKQorCQkJZXJyID0gLUVGQVVMVDsKKworCQkvKiBXcml0ZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdXNlZCBiYWNrIHRvIGNsaWVudCAqLworCQlpZiAocHV0X3VzZXIodG90YWwsIG9wdGxlbikpCisJCQllcnIgPSAtRUZBVUxUOworYmVkOgorCQkvKiBGcmVlIHVwIG91ciBidWZmZXIgKi8KKwkJa2ZyZWUoZGlzY292ZXJpZXMpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJYnJlYWs7CisJY2FzZSBJUkxNUF9NQVhfU0RVX1NJWkU6CisJCXZhbCA9IHNlbGYtPm1heF9kYXRhX3NpemU7CisJCWxlbiA9IHNpemVvZihpbnQpOworCQlpZiAocHV0X3VzZXIobGVuLCBvcHRsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsICZ2YWwsIGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBJUkxNUF9JQVNfR0VUOgorCQkvKiBUaGUgdXNlciB3YW50IGFuIG9iamVjdCBmcm9tIG91ciBsb2NhbCBJQVMgZGF0YWJhc2UuCisJCSAqIFdlIGp1c3QgbmVlZCB0byBxdWVyeSB0aGUgSUFTIGFuZCByZXR1cm4gdGhlIHZhbHVlCisJCSAqIHRoYXQgd2UgZm91bmQgKi8KKworCQkvKiBDaGVjayB0aGF0IHRoZSB1c2VyIGhhcyBhbGxvY2F0ZWQgdGhlIHJpZ2h0IHNwYWNlIGZvciB1cyAqLworCQlpZiAobGVuICE9IHNpemVvZihzdHJ1Y3QgaXJkYV9pYXNfc2V0KSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlhc19vcHQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXJkYV9pYXNfc2V0KSwgR0ZQX0FUT01JQyk7CisJCWlmIChpYXNfb3B0ID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQkvKiBDb3B5IHF1ZXJ5IHRvIHRoZSBkcml2ZXIuICovCisJCWlmIChjb3B5X2Zyb21fdXNlcihpYXNfb3B0LCBvcHR2YWwsIGxlbikpIHsKKwkJCWtmcmVlKGlhc19vcHQpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQkvKiBGaW5kIHRoZSBvYmplY3Qgd2UgdGFyZ2V0LgorCQkgKiBJZiB0aGUgdXNlciBnaXZlcyB1cyBhbiBlbXB0eSBzdHJpbmcsIHdlIHVzZSB0aGUgb2JqZWN0CisJCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvY2tldC4gVGhpcyB3aWxsIHdvcmthcm91bmQKKwkJICogZHVwbGljYXRlZCBjbGFzcyBuYW1lIC0gSmVhbiBJSSAqLworCQlpZihpYXNfb3B0LT5pcmRhX2NsYXNzX25hbWVbMF0gPT0gJ1wwJykKKwkJCWlhc19vYmogPSBzZWxmLT5pYXNfb2JqOworCQllbHNlCisJCQlpYXNfb2JqID0gaXJpYXNfZmluZF9vYmplY3QoaWFzX29wdC0+aXJkYV9jbGFzc19uYW1lKTsKKwkJaWYoaWFzX29iaiA9PSAoc3RydWN0IGlhc19vYmplY3QgKikgTlVMTCkgeworCQkJa2ZyZWUoaWFzX29wdCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIEZpbmQgdGhlIGF0dHJpYnV0ZSAoaW4gdGhlIG9iamVjdCkgd2UgdGFyZ2V0ICovCisJCWlhc19hdHRyID0gaXJpYXNfZmluZF9hdHRyaWIoaWFzX29iaiwKKwkJCQkJICAgICBpYXNfb3B0LT5pcmRhX2F0dHJpYl9uYW1lKTsKKwkJaWYoaWFzX2F0dHIgPT0gKHN0cnVjdCBpYXNfYXR0cmliICopIE5VTEwpIHsKKwkJCWtmcmVlKGlhc19vcHQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBUcmFuc2xhdGUgZnJvbSBpbnRlcm5hbCB0byB1c2VyIHN0cnVjdHVyZSAqLworCQllcnIgPSBpcmRhX2V4dHJhY3RfaWFzX3ZhbHVlKGlhc19vcHQsIGlhc19hdHRyLT52YWx1ZSk7CisJCWlmKGVycikgeworCQkJa2ZyZWUoaWFzX29wdCk7CisJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJLyogQ29weSByZXBseSB0byB0aGUgdXNlciAqLworCQlpZiAoY29weV90b191c2VyKG9wdHZhbCwgaWFzX29wdCwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBpcmRhX2lhc19zZXQpKSkgeworCQkJa2ZyZWUoaWFzX29wdCk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQkvKiBOb3RlIDogZG9uJ3QgbmVlZCB0byBwdXQgb3B0bGVuLCB3ZSBjaGVja2VkIGl0ICovCisJCWtmcmVlKGlhc19vcHQpOworCQlicmVhazsKKwljYXNlIElSTE1QX0lBU19RVUVSWToKKwkJLyogVGhlIHVzZXIgd2FudCBhbiBvYmplY3QgZnJvbSBhIHJlbW90ZSBJQVMgZGF0YWJhc2UuCisJCSAqIFdlIG5lZWQgdG8gdXNlIElBUCB0byBxdWVyeSB0aGUgcmVtb3RlIGRhdGFiYXNlIGFuZAorCQkgKiB0aGVuIHdhaXQgZm9yIHRoZSBhbnN3ZXIgdG8gY29tZSBiYWNrLiAqLworCisJCS8qIENoZWNrIHRoYXQgdGhlIHVzZXIgaGFzIGFsbG9jYXRlZCB0aGUgcmlnaHQgc3BhY2UgZm9yIHVzICovCisJCWlmIChsZW4gIT0gc2l6ZW9mKHN0cnVjdCBpcmRhX2lhc19zZXQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWFzX29wdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcmRhX2lhc19zZXQpLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGlhc19vcHQgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCS8qIENvcHkgcXVlcnkgdG8gdGhlIGRyaXZlci4gKi8KKwkJaWYgKGNvcHlfZnJvbV91c2VyKGlhc19vcHQsIG9wdHZhbCwgbGVuKSkgeworCQkJa2ZyZWUoaWFzX29wdCk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCS8qIEF0IHRoaXMgcG9pbnQsIHRoZXJlIGFyZSB0d28gY2FzZXMuLi4KKwkJICogMSkgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgLSB0aGF0J3MgdGhlIGVhc3kgY2FzZSwgd2UKKwkJICoJanVzdCBxdWVyeSB0aGUgZGV2aWNlIHdlIGFyZSBjb25uZWN0ZWQgdG8uLi4KKwkJICogMikgdGhlIHNvY2tldCBpcyBub3QgY29ubmVjdGVkIC0gdGhlIHVzZXIgZG9lc24ndCB3YW50CisJCSAqCXRvIGNvbm5lY3QgYW5kL29yIG1heSBub3QgaGF2ZSBhIHZhbGlkIHNlcnZpY2UgbmFtZQorCQkgKgkoc28gY2FuJ3QgY3JlYXRlIGEgZmFrZSBjb25uZWN0aW9uKS4gSW4gdGhpcyBjYXNlLAorCQkgKgl3ZSBhc3N1bWUgdGhhdCB0aGUgdXNlciBwYXNzIHVzIGEgdmFsaWQgZGVzdGluYXRpb24KKwkJICoJYWRkcmVzcyBpbiB0aGUgcmVxdWVzdGluZyBzdHJ1Y3R1cmUuLi4KKwkJICovCisJCWlmKHNlbGYtPmRhZGRyICE9IERFVl9BRERSX0FOWSkgeworCQkJLyogV2UgYXJlIGNvbm5lY3RlZCAtIHJldXNlIGtub3duIGRhZGRyICovCisJCQlkYWRkciA9IHNlbGYtPmRhZGRyOworCQl9IGVsc2UgeworCQkJLyogV2UgYXJlIG5vdCBjb25uZWN0ZWQsIHdlIG11c3Qgc3BlY2lmeSBhIHZhbGlkCisJCQkgKiBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJCQlkYWRkciA9IGlhc19vcHQtPmRhZGRyOworCQkJaWYoKCFkYWRkcikgfHwgKGRhZGRyID09IERFVl9BRERSX0FOWSkpIHsKKwkJCQlrZnJlZShpYXNfb3B0KTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCisJCS8qIENoZWNrIHRoYXQgd2UgY2FuIHByb2NlZWQgd2l0aCBJQVAgKi8KKwkJaWYgKHNlbGYtPmlyaWFwKSB7CisJCQlJUkRBX1dBUk5JTkcoIiVzOiBidXN5IHdpdGggYSBwcmV2aW91cyBxdWVyeVxuIiwKKwkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQlrZnJlZShpYXNfb3B0KTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQlzZWxmLT5pcmlhcCA9IGlyaWFwX29wZW4oTFNBUF9BTlksIElBU19DTElFTlQsIHNlbGYsCisJCQkJCSBpcmRhX2dldHZhbHVlX2NvbmZpcm0pOworCisJCWlmIChzZWxmLT5pcmlhcCA9PSBOVUxMKSB7CisJCQlrZnJlZShpYXNfb3B0KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJLyogVHJlYXQgdW5leHBlY3RlZCB3YWtldXAgYXMgZGlzY29ubmVjdCAqLworCQlzZWxmLT5lcnJubyA9IC1FSE9TVFVOUkVBQ0g7CisKKwkJLyogUXVlcnkgcmVtb3RlIExNLUlBUyAqLworCQlpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVxdWVzdChzZWxmLT5pcmlhcCwKKwkJCQkJICAgICAgc2VsZi0+c2FkZHIsIGRhZGRyLAorCQkJCQkgICAgICBpYXNfb3B0LT5pcmRhX2NsYXNzX25hbWUsCisJCQkJCSAgICAgIGlhc19vcHQtPmlyZGFfYXR0cmliX25hbWUpOworCisJCS8qIFdhaXQgZm9yIGFuc3dlciwgaWYgbm90IHlldCBmaW5pc2hlZCAob3IgZmFpbGVkKSAqLworCQlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHNlbGYtPnF1ZXJ5X3dhaXQsCisJCQkJCSAgICAgKHNlbGYtPmlyaWFwID09IE5VTEwpKSkgeworCQkJLyogcGVuZGluZyByZXF1ZXN0IHVzZXMgY29weSBvZiBpYXNfb3B0LWNvbnRlbnQKKwkJCSAqIHdlIGNhbiBmcmVlIGl0IHJlZ2FyZGxlc3MhICovCisJCQlrZnJlZShpYXNfb3B0KTsKKwkJCS8qIFRyZWF0IHNpZ25hbHMgYXMgZGlzY29ubmVjdCAqLworCQkJcmV0dXJuIC1FSE9TVFVOUkVBQ0g7CisJCX0KKworCQkvKiBDaGVjayB3aGF0IGhhcHBlbmVkICovCisJCWlmIChzZWxmLT5lcnJubykKKwkJeworCQkJa2ZyZWUoaWFzX29wdCk7CisJCQkvKiBSZXF1ZXN0ZWQgb2JqZWN0L2F0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0ICovCisJCQlpZigoc2VsZi0+ZXJybm8gPT0gSUFTX0NMQVNTX1VOS05PV04pIHx8CisJCQkgICAoc2VsZi0+ZXJybm8gPT0gSUFTX0FUVFJJQl9VTktOT1dOKSkKKwkJCQlyZXR1cm4gKC1FQUREUk5PVEFWQUlMKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gKC1FSE9TVFVOUkVBQ0gpOworCQl9CisKKwkJLyogVHJhbnNsYXRlIGZyb20gaW50ZXJuYWwgdG8gdXNlciBzdHJ1Y3R1cmUgKi8KKwkJZXJyID0gaXJkYV9leHRyYWN0X2lhc192YWx1ZShpYXNfb3B0LCBzZWxmLT5pYXNfcmVzdWx0KTsKKwkJaWYgKHNlbGYtPmlhc19yZXN1bHQpCisJCQlpcmlhc19kZWxldGVfdmFsdWUoc2VsZi0+aWFzX3Jlc3VsdCk7CisJCWlmIChlcnIpIHsKKwkJCWtmcmVlKGlhc19vcHQpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCS8qIENvcHkgcmVwbHkgdG8gdGhlIHVzZXIgKi8KKwkJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsIGlhc19vcHQsCisJCQkJIHNpemVvZihzdHJ1Y3QgaXJkYV9pYXNfc2V0KSkpIHsKKwkJCWtmcmVlKGlhc19vcHQpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJLyogTm90ZSA6IGRvbid0IG5lZWQgdG8gcHV0IG9wdGxlbiwgd2UgY2hlY2tlZCBpdCAqLworCQlrZnJlZShpYXNfb3B0KTsKKwkJYnJlYWs7CisJY2FzZSBJUkxNUF9XQUlUREVWSUNFOgorCQkvKiBUaGlzIGZ1bmN0aW9uIGlzIGp1c3QgYW5vdGhlciB3YXkgb2Ygc2VlaW5nIGxpZmUgOy0pCisJCSAqIElSTE1QX0VOVU1ERVZJQ0VTIGFzc3VtZXMgdGhhdCB5b3UgaGF2ZSBhIHN0YXRpYyBuZXR3b3JrLAorCQkgKiBhbmQgdGhhdCB5b3UganVzdCB3YW50IHRvIHBpY2sgb25lIG9mIHRoZSBkZXZpY2VzIHByZXNlbnQuCisJCSAqIE9uIHRoZSBvdGhlciBoYW5kLCBpbiBoZXJlIHdlIGFzc3VtZSB0aGF0IG5vIGRldmljZSBpcworCQkgKiBwcmVzZW50IGFuZCB0aGF0IGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZSBhIGRldmljZSB3aWxsCisJCSAqIGNvbWUgaW50byByYW5nZS4gV2hlbiB0aGlzIGRldmljZSBhcnJpdmUsIHdlIGp1c3Qgd2FrZQorCQkgKiB1cCB0aGUgY2FsbGVyLCBzbyB0aGF0IGhlIGhhcyB0aW1lIHRvIGNvbm5lY3QgdG8gaXQgYmVmb3JlCisJCSAqIHRoZSBkZXZpY2UgZ29lcyBhd2F5Li4uCisJCSAqIE5vdGUgOiBvbmNlIHRoZSBub2RlIGhhcyBiZWVuIGRpc2NvdmVyZWQgZm9yIG1vcmUgdGhhbiBhCisJCSAqIGZldyBzZWNvbmQsIGl0IHdvbid0IHRyaWdnZXIgdGhpcyBmdW5jdGlvbiwgdW5sZXNzIGl0CisJCSAqIGdvZXMgYXdheSBhbmQgY29tZSBiYWNrIGNoYW5nZXMgaXRzIGhpbnQgYml0cyAoc28gd2UKKwkJICogbWlnaHQgY2FsbCBpdCBJUkxNUF9XQUlUTkVXREVWSUNFKS4KKwkJICovCisKKwkJLyogQ2hlY2sgdGhhdCB0aGUgdXNlciBpcyBwYXNzaW5nIHVzIGFuIGludCAqLworCQlpZiAobGVuICE9IHNpemVvZihpbnQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCS8qIEdldCB0aW1lb3V0IGluIG1zIChtYXggdGltZSB3ZSBibG9jayB0aGUgY2FsbGVyKSAqLworCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKW9wdHZhbCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkvKiBUZWxsIElyTE1QIHdlIHdhbnQgdG8gYmUgbm90aWZpZWQgKi8KKwkJaXJsbXBfdXBkYXRlX2NsaWVudChzZWxmLT5ja2V5LCBzZWxmLT5tYXNrLndvcmQsCisJCQkJICAgIGlyZGFfc2VsZWN0aXZlX2Rpc2NvdmVyeV9pbmRpY2F0aW9uLAorCQkJCSAgICBOVUxMLCAodm9pZCAqKSBzZWxmKTsKKworCQkvKiBEbyBzb21lIGRpc2NvdmVyeSAoYW5kIGFsc28gcmV0dXJuIGNhY2hlZCByZXN1bHRzKSAqLworCQlpcmxtcF9kaXNjb3ZlcnlfcmVxdWVzdChzZWxmLT5uc2xvdHMpOworCisJCS8qIFdhaXQgdW50aWwgYSBub2RlIGlzIGRpc2NvdmVyZWQgKi8KKwkJaWYgKCFzZWxmLT5jYWNoZWRhZGRyKSB7CisJCQlpbnQgcmV0ID0gMDsKKworCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgbm90aGluZyBkaXNjb3ZlcmVkIHlldCwgZ29pbmcgdG8gc2xlZXAuLi5cbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJCS8qIFNldCB3YXRjaGRvZyB0aW1lciB0byBleHBpcmUgaW4gPHZhbD4gbXMuICovCisJCQlzZWxmLT5lcnJubyA9IDA7CisJCQlpbml0X3RpbWVyKCZzZWxmLT53YXRjaGRvZyk7CisJCQlzZWxmLT53YXRjaGRvZy5mdW5jdGlvbiA9IGlyZGFfZGlzY292ZXJ5X3RpbWVvdXQ7CisJCQlzZWxmLT53YXRjaGRvZy5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHNlbGY7CisJCQlzZWxmLT53YXRjaGRvZy5leHBpcmVzID0gamlmZmllcyArICh2YWwgKiBIWi8xMDAwKTsKKwkJCWFkZF90aW1lcigmKHNlbGYtPndhdGNoZG9nKSk7CisKKwkJCS8qIFdhaXQgZm9yIElSLUxNUCB0byBjYWxsIHVzIGJhY2sgKi8KKwkJCV9fd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHNlbGYtPnF1ZXJ5X3dhaXQsCisJCQkgICAgICAoc2VsZi0+Y2FjaGVkYWRkciAhPSAwIHx8IHNlbGYtPmVycm5vID09IC1FVElNRSksCisJCQkJCQkgICByZXQpOworCisJCQkvKiBJZiB3YXRjaGRvZyBpcyBzdGlsbCBhY3RpdmF0ZWQsIGtpbGwgaXQhICovCisJCQlpZih0aW1lcl9wZW5kaW5nKCYoc2VsZi0+d2F0Y2hkb2cpKSkKKwkJCQlkZWxfdGltZXIoJihzZWxmLT53YXRjaGRvZykpOworCisJCQlJUkRBX0RFQlVHKDEsICIlcygpLCAuLi53YWtpbmcgdXAgIVxuIiwgX19GVU5DVElPTl9fKTsKKworCQkJaWYgKHJldCAhPSAwKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJZWxzZQorCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgZm91bmQgaW1tZWRpYXRlbHkgIVxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18pOworCisJCS8qIFRlbGwgSXJMTVAgdGhhdCB3ZSBoYXZlIGJlZW4gbm90aWZpZWQgKi8KKwkJaXJsbXBfdXBkYXRlX2NsaWVudChzZWxmLT5ja2V5LCBzZWxmLT5tYXNrLndvcmQsCisJCQkJICAgIE5VTEwsIE5VTEwsIE5VTEwpOworCisJCS8qIENoZWNrIGlmIHRoZSB3ZSBnb3Qgc29tZSByZXN1bHRzICovCisJCWlmICghc2VsZi0+Y2FjaGVkYWRkcikKKwkJCXJldHVybiAtRUFHQUlOOwkJLyogRGlkbid0IGZpbmQgYW55IGRldmljZXMgKi8KKwkJZGFkZHIgPSBzZWxmLT5jYWNoZWRhZGRyOworCQkvKiBDbGVhbnVwICovCisJCXNlbGYtPmNhY2hlZGFkZHIgPSAwOworCisJCS8qIFdlIHJldHVybiB0aGUgZGFkZHIgb2YgdGhlIGRldmljZSB0aGF0IHRyaWdnZXIgdGhlCisJCSAqIHdha2V1cC4gQXMgaXJsbXAgcGFzcyB1cyBvbmx5IHRoZSBuZXcgZGV2aWNlcywgd2UKKwkJICogYXJlIHN1cmUgdGhhdCBpdCdzIG5vdCBhbiBvbGQgZGV2aWNlLgorCQkgKiBJZiB0aGUgdXNlciB3YW50IG1vcmUgZGV0YWlscywgaGUgc2hvdWxkIHF1ZXJ5CisJCSAqIHRoZSB3aG9sZSBkaXNjb3ZlcnkgbG9nIGFuZCBwaWNrIG9uZSBkZXZpY2UuLi4KKwkJICovCisJCWlmIChwdXRfdXNlcihkYWRkciwgKGludCBfX3VzZXIgKilvcHR2YWwpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5IGlyZGFfZmFtaWx5X29wcyA9IHsKKwkuZmFtaWx5ID0gUEZfSVJEQSwKKwkuY3JlYXRlID0gaXJkYV9jcmVhdGUsCisJLm93bmVyCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBTT0NLT1BTX1dSQVBQRUQoaXJkYV9zdHJlYW1fb3BzKSA9IHsKKwkuZmFtaWx5ID0JUEZfSVJEQSwKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkucmVsZWFzZSA9CWlyZGFfcmVsZWFzZSwKKwkuYmluZCA9CQlpcmRhX2JpbmQsCisJLmNvbm5lY3QgPQlpcmRhX2Nvbm5lY3QsCisJLnNvY2tldHBhaXIgPQlzb2NrX25vX3NvY2tldHBhaXIsCisJLmFjY2VwdCA9CWlyZGFfYWNjZXB0LAorCS5nZXRuYW1lID0JaXJkYV9nZXRuYW1lLAorCS5wb2xsID0JCWlyZGFfcG9sbCwKKwkuaW9jdGwgPQlpcmRhX2lvY3RsLAorCS5saXN0ZW4gPQlpcmRhX2xpc3RlbiwKKwkuc2h1dGRvd24gPQlpcmRhX3NodXRkb3duLAorCS5zZXRzb2Nrb3B0ID0JaXJkYV9zZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0ID0JaXJkYV9nZXRzb2Nrb3B0LAorCS5zZW5kbXNnID0JaXJkYV9zZW5kbXNnLAorCS5yZWN2bXNnID0JaXJkYV9yZWN2bXNnX3N0cmVhbSwKKwkubW1hcCA9CQlzb2NrX25vX21tYXAsCisJLnNlbmRwYWdlID0Jc29ja19ub19zZW5kcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIFNPQ0tPUFNfV1JBUFBFRChpcmRhX3NlcXBhY2tldF9vcHMpID0geworCS5mYW1pbHkgPQlQRl9JUkRBLAorCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5yZWxlYXNlID0JaXJkYV9yZWxlYXNlLAorCS5iaW5kID0JCWlyZGFfYmluZCwKKwkuY29ubmVjdCA9CWlyZGFfY29ubmVjdCwKKwkuc29ja2V0cGFpciA9CXNvY2tfbm9fc29ja2V0cGFpciwKKwkuYWNjZXB0ID0JaXJkYV9hY2NlcHQsCisJLmdldG5hbWUgPQlpcmRhX2dldG5hbWUsCisJLnBvbGwgPQkJZGF0YWdyYW1fcG9sbCwKKwkuaW9jdGwgPQlpcmRhX2lvY3RsLAorCS5saXN0ZW4gPQlpcmRhX2xpc3RlbiwKKwkuc2h1dGRvd24gPQlpcmRhX3NodXRkb3duLAorCS5zZXRzb2Nrb3B0ID0JaXJkYV9zZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0ID0JaXJkYV9nZXRzb2Nrb3B0LAorCS5zZW5kbXNnID0JaXJkYV9zZW5kbXNnLAorCS5yZWN2bXNnID0JaXJkYV9yZWN2bXNnX2RncmFtLAorCS5tbWFwID0JCXNvY2tfbm9fbW1hcCwKKwkuc2VuZHBhZ2UgPQlzb2NrX25vX3NlbmRwYWdlLAorfTsKKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgU09DS09QU19XUkFQUEVEKGlyZGFfZGdyYW1fb3BzKSA9IHsKKwkuZmFtaWx5ID0JUEZfSVJEQSwKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkucmVsZWFzZSA9CWlyZGFfcmVsZWFzZSwKKwkuYmluZCA9CQlpcmRhX2JpbmQsCisJLmNvbm5lY3QgPQlpcmRhX2Nvbm5lY3QsCisJLnNvY2tldHBhaXIgPQlzb2NrX25vX3NvY2tldHBhaXIsCisJLmFjY2VwdCA9CWlyZGFfYWNjZXB0LAorCS5nZXRuYW1lID0JaXJkYV9nZXRuYW1lLAorCS5wb2xsID0JCWRhdGFncmFtX3BvbGwsCisJLmlvY3RsID0JaXJkYV9pb2N0bCwKKwkubGlzdGVuID0JaXJkYV9saXN0ZW4sCisJLnNodXRkb3duID0JaXJkYV9zaHV0ZG93biwKKwkuc2V0c29ja29wdCA9CWlyZGFfc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdCA9CWlyZGFfZ2V0c29ja29wdCwKKwkuc2VuZG1zZyA9CWlyZGFfc2VuZG1zZ19kZ3JhbSwKKwkucmVjdm1zZyA9CWlyZGFfcmVjdm1zZ19kZ3JhbSwKKwkubW1hcCA9CQlzb2NrX25vX21tYXAsCisJLnNlbmRwYWdlID0Jc29ja19ub19zZW5kcGFnZSwKK307CisKKyNpZmRlZiBDT05GSUdfSVJEQV9VTFRSQQorc3RhdGljIHN0cnVjdCBwcm90b19vcHMgU09DS09QU19XUkFQUEVEKGlyZGFfdWx0cmFfb3BzKSA9IHsKKwkuZmFtaWx5ID0JUEZfSVJEQSwKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkucmVsZWFzZSA9CWlyZGFfcmVsZWFzZSwKKwkuYmluZCA9CQlpcmRhX2JpbmQsCisJLmNvbm5lY3QgPQlzb2NrX25vX2Nvbm5lY3QsCisJLnNvY2tldHBhaXIgPQlzb2NrX25vX3NvY2tldHBhaXIsCisJLmFjY2VwdCA9CXNvY2tfbm9fYWNjZXB0LAorCS5nZXRuYW1lID0JaXJkYV9nZXRuYW1lLAorCS5wb2xsID0JCWRhdGFncmFtX3BvbGwsCisJLmlvY3RsID0JaXJkYV9pb2N0bCwKKwkubGlzdGVuID0Jc29ja19ub19saXN0ZW4sCisJLnNodXRkb3duID0JaXJkYV9zaHV0ZG93biwKKwkuc2V0c29ja29wdCA9CWlyZGFfc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdCA9CWlyZGFfZ2V0c29ja29wdCwKKwkuc2VuZG1zZyA9CWlyZGFfc2VuZG1zZ191bHRyYSwKKwkucmVjdm1zZyA9CWlyZGFfcmVjdm1zZ19kZ3JhbSwKKwkubW1hcCA9CQlzb2NrX25vX21tYXAsCisJLnNlbmRwYWdlID0Jc29ja19ub19zZW5kcGFnZSwKK307CisjZW5kaWYgLyogQ09ORklHX0lSREFfVUxUUkEgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CitTT0NLT1BTX1dSQVAoaXJkYV9zdHJlYW0sIFBGX0lSREEpOworU09DS09QU19XUkFQKGlyZGFfc2VxcGFja2V0LCBQRl9JUkRBKTsKK1NPQ0tPUFNfV1JBUChpcmRhX2RncmFtLCBQRl9JUkRBKTsKKyNpZmRlZiBDT05GSUdfSVJEQV9VTFRSQQorU09DS09QU19XUkFQKGlyZGFfdWx0cmEsIFBGX0lSREEpOworI2VuZGlmIC8qIENPTkZJR19JUkRBX1VMVFJBICovCisKKy8qCisgKiBGdW5jdGlvbiBpcnNvY2tfaW5pdCAocHJvKQorICoKKyAqICAgIEluaXRpYWxpemUgSXJEQSBwcm90b2NvbAorICoKKyAqLworaW50IF9faW5pdCBpcnNvY2tfaW5pdCh2b2lkKQoreworCWludCByYyA9IHByb3RvX3JlZ2lzdGVyKCZpcmRhX3Byb3RvLCAwKTsKKworCWlmIChyYyA9PSAwKQorCQlyYyA9IHNvY2tfcmVnaXN0ZXIoJmlyZGFfZmFtaWx5X29wcyk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnNvY2tfY2xlYW51cCAodm9pZCkKKyAqCisgKiAgICBSZW1vdmUgSXJEQSBwcm90b2NvbAorICoKKyAqLwordm9pZCBfX2V4aXQgaXJzb2NrX2NsZWFudXAodm9pZCkKK3sKKwlzb2NrX3VucmVnaXN0ZXIoUEZfSVJEQSk7CisJcHJvdG9fdW5yZWdpc3RlcigmaXJkYV9wcm90byk7Cit9CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9kaXNjb3ZlcnkuYyBiL25ldC9pcmRhL2Rpc2NvdmVyeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YmE1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9kaXNjb3ZlcnkuYwpAQCAtMCwwICsxLDQxOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBkaXNjb3ZlcnkuYworICogVmVyc2lvbjogICAgICAgMC4xCisgKiBEZXNjcmlwdGlvbjogICBSb3V0aW5lcyBmb3IgaGFuZGxpbmcgZGlzY292ZXJpZXMgYXQgdGhlIElyTE1QIGxheWVyCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBUdWUgQXByICA2IDE1OjMzOjUwIDE5OTkKKyAqIE1vZGlmaWVkIGF0OiAgIFNhdCBPY3QgIDkgMTc6MTE6MzEgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogTW9kaWZpZWQgYXQ6ICAgRnJpIE1heSAyOCAgMzoxMSBDU1QgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgSG9yc3Qgdm9uIEJyYW5kIDx2b25icmFuZEBzbGVpcG5pci52YWxwYXJhaXNvLmNsPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5IERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAqICAgICBNQSAwMjExMS0xMzA3IFVTQQorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvZGlzY292ZXJ5Lmg+CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9hZGRfZGlzY292ZXJ5IChjYWNoZWxvZywgZGlzY292ZXJ5KQorICoKKyAqICAgIEFkZCBhIG5ldyBkaXNjb3ZlcnkgdG8gdGhlIGNhY2hlbG9nLCBhbmQgcmVtb3ZlIGFueSBvbGQgZGlzY292ZXJpZXMKKyAqICAgIGZyb20gdGhlIHNhbWUgZGV2aWNlCisgKgorICogTm90ZSA6IHdlIHRyeSB0byBwcmVzZXJ2ZSB0aGUgdGltZSB0aGlzIGRldmljZSB3YXMgKmZpcnN0KiBkaXNjb3ZlcmVkCisgKiAoYXMgb3Bwb3NlZCB0byB0aGUgdGltZSBvZiBsYXN0IGRpc2NvdmVyeSB1c2VkIGZvciBjbGVhbnVwKS4gVGhpcyBpcworICogdXNlZCBieSBjbGllbnRzIHdhaXRpbmcgZm9yIGRpc2NvdmVyeSBldmVudHMgdG8gdGVsbCBpZiB0aGUgZGV2aWNlCisgKiBkaXNjb3ZlcmVkIGlzICJuZXciIG9yIGp1c3QgdGhlIHNhbWUgb2xkIG9uZS4gVGhleSBjYW4ndCByZWx5IHRoZXJlCisgKiBvbiBhIGJpbmFyeSBmbGFnIChuZXcvb2xkKSwgYmVjYXVzZSBub3QgYWxsIGRpc2NvdmVyeSBldmVudHMgYXJlCisgKiBwcm9wYWdhdGVkIHRvIHRoZW0sIGFuZCB0aGV5IG1pZ2h0IG5vdCBhbHdheXMgbGlzdGVuLCBzbyB0aGV5IHdvdWxkCisgKiBtaXNzIHNvbWUgbmV3IGRldmljZXMgcG9wcGluZyB1cC4uLgorICogSmVhbiBJSQorICovCit2b2lkIGlybG1wX2FkZF9kaXNjb3ZlcnkoaGFzaGJpbl90ICpjYWNoZWxvZywgZGlzY292ZXJ5X3QgKm5ldykKK3sKKwlkaXNjb3ZlcnlfdCAqZGlzY292ZXJ5LCAqbm9kZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogU2V0IHRpbWUgb2YgZmlyc3QgZGlzY292ZXJ5IGlmIG5vZGUgaXMgbmV3IChzZWUgYmVsb3cpICovCisJbmV3LT5maXJzdHN0YW1wID0gbmV3LT50aW1lc3RhbXA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FjaGVsb2ctPmhiX3NwaW5sb2NrLCBmbGFncyk7CisKKwkvKiAKKwkgKiBSZW1vdmUgYWxsIGRpc2NvdmVyaWVzIG9mIGRldmljZXMgdGhhdCBoYXMgcHJldmlvdXNseSBiZWVuIAorCSAqIGRpc2NvdmVyZWQgb24gdGhlIHNhbWUgbGluayB3aXRoIHRoZSBzYW1lIG5hbWUgKGluZm8pLCBvciB0aGUgCisJICogc2FtZSBkYWRkci4gV2UgZG8gdGhpcyBzaW5jZSBzb21lIGRldmljZXMgKG1vc3RseSBQREFzKSBjaGFuZ2UKKwkgKiB0aGVpciBkZXZpY2UgYWRkcmVzcyBiZXR3ZWVuIGV2ZXJ5IGRpc2NvdmVyeS4KKwkgKi8KKwlkaXNjb3ZlcnkgPSAoZGlzY292ZXJ5X3QgKikgaGFzaGJpbl9nZXRfZmlyc3QoY2FjaGVsb2cpOworCXdoaWxlIChkaXNjb3ZlcnkgIT0gTlVMTCApIHsKKwkJbm9kZSA9IGRpc2NvdmVyeTsKKworCQkvKiBCZSBzdXJlIHRvIHN0YXkgb25lIGl0ZW0gYWhlYWQgKi8KKwkJZGlzY292ZXJ5ID0gKGRpc2NvdmVyeV90ICopIGhhc2hiaW5fZ2V0X25leHQoY2FjaGVsb2cpOworCisJCWlmICgobm9kZS0+ZGF0YS5zYWRkciA9PSBuZXctPmRhdGEuc2FkZHIpICYmCisJCSAgICAoKG5vZGUtPmRhdGEuZGFkZHIgPT0gbmV3LT5kYXRhLmRhZGRyKSB8fCAKKwkJICAgICAoc3RyY21wKG5vZGUtPmRhdGEuaW5mbywgbmV3LT5kYXRhLmluZm8pID09IDApKSkKKwkJeworCQkJLyogVGhpcyBkaXNjb3ZlcnkgaXMgYSBwcmV2aW91cyBkaXNjb3ZlcnkgCisJCQkgKiBmcm9tIHRoZSBzYW1lIGRldmljZSwgc28ganVzdCByZW1vdmUgaXQKKwkJCSAqLworCQkJaGFzaGJpbl9yZW1vdmVfdGhpcyhjYWNoZWxvZywgKGlyZGFfcXVldWVfdCAqKSBub2RlKTsKKwkJCS8qIENoZWNrIGlmIGhpbnRzIGJpdHMgYXJlIHVuY2hhbmdlZCAqLworCQkJaWYodTE2aG8obm9kZS0+ZGF0YS5oaW50cykgPT0gdTE2aG8obmV3LT5kYXRhLmhpbnRzKSkKKwkJCQkvKiBTZXQgdGltZSBvZiBmaXJzdCBkaXNjb3ZlcnkgZm9yIHRoaXMgbm9kZSAqLworCQkJCW5ldy0+Zmlyc3RzdGFtcCA9IG5vZGUtPmZpcnN0c3RhbXA7CisJCQlrZnJlZShub2RlKTsKKwkJfQorCX0KKworCS8qIEluc2VydCB0aGUgbmV3IGFuZCB1cGRhdGVkIHZlcnNpb24gKi8KKwloYXNoYmluX2luc2VydChjYWNoZWxvZywgKGlyZGFfcXVldWVfdCAqKSBuZXcsIG5ldy0+ZGF0YS5kYWRkciwgTlVMTCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYWNoZWxvZy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX2FkZF9kaXNjb3ZlcnlfbG9nIChjYWNoZWxvZywgbG9nKQorICoKKyAqICAgIE1lcmdlIGEgZGlzb3ZlcnkgbG9nIGludG8gdGhlIGNhY2hlbG9nLgorICoKKyAqLwordm9pZCBpcmxtcF9hZGRfZGlzY292ZXJ5X2xvZyhoYXNoYmluX3QgKmNhY2hlbG9nLCBoYXNoYmluX3QgKmxvZykKK3sKKwlkaXNjb3ZlcnlfdCAqZGlzY292ZXJ5OworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qCisJICogIElmIGxvZyBpcyBtaXNzaW5nIHRoaXMgbWVhbnMgdGhhdCBJckxBUCB3YXMgdW5hYmxlIHRvIHBlcmZvcm0gdGhlCisJICogIGRpc2NvdmVyeSwgc28gcmVzdGFydCBkaXNjb3ZlcnkgYWdhaW4gd2l0aCBqdXN0IHRoZSBoYWxmIHRpbWVvdXQKKwkgKiAgb2YgdGhlIG5vcm1hbCBvbmUuCisJICovCisJLyogV2VsbC4uLiBJdCBtZWFucyB0aGF0IHRoZXJlIHdhcyBub2JvZHkgb3V0IHRoZXJlIC0gSmVhbiBJSSAqLworCWlmIChsb2cgPT0gTlVMTCkgeworCQkvKiBpcmxtcF9zdGFydF9kaXNjb3ZlcnlfdGltZXIoaXJsbXAsIDE1MCk7ICovCisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIExvY2tpbmcgOiB3ZSBhcmUgdGhlIG9ubHkgb3duZXIgb2YgdGhpcyBkaXNjb3ZlcnkgbG9nLCBzbworCSAqIG5vIG5lZWQgdG8gbG9jayBpdC4KKwkgKiBXZSBqdXN0IG5lZWQgdG8gbG9jayB0aGUgZ2xvYmFsIGxvZyBpbiBpcmxtcF9hZGRfZGlzY292ZXJ5KCkuCisJICovCisJZGlzY292ZXJ5ID0gKGRpc2NvdmVyeV90ICopIGhhc2hiaW5fcmVtb3ZlX2ZpcnN0KGxvZyk7CisJd2hpbGUgKGRpc2NvdmVyeSAhPSBOVUxMKSB7CisJCWlybG1wX2FkZF9kaXNjb3ZlcnkoY2FjaGVsb2csIGRpc2NvdmVyeSk7CisKKwkJZGlzY292ZXJ5ID0gKGRpc2NvdmVyeV90ICopIGhhc2hiaW5fcmVtb3ZlX2ZpcnN0KGxvZyk7CisJfQorCQorCS8qIERlbGV0ZSB0aGUgbm93IGVtcHR5IGxvZyAqLworCWhhc2hiaW5fZGVsZXRlKGxvZywgKEZSRUVfRlVOQykga2ZyZWUpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsbXBfZXhwaXJlX2Rpc2NvdmVyaWVzIChsb2csIHNhZGRyLCBmb3JjZSkKKyAqCisgKiAgICBHbyB0aHJvdWdoIGFsbCBkaXNjb3ZlcmllcyBhbmQgZXhwaXJlIGFsbCB0aGF0IGhhcyBzdGF5ZWQgdG9vIGxvbmcKKyAqCisgKiBOb3RlIDogdGhpcyBhc3N1bWUgdGhhdCBJckxBUCB3b24ndCBjaGFuZ2UgaXRzIHNhZGRyLCB3aGljaAorICogY3VycmVudGx5IGlzIGEgdmFsaWQgYXNzdW1wdGlvbi4uLgorICovCit2b2lkIGlybG1wX2V4cGlyZV9kaXNjb3ZlcmllcyhoYXNoYmluX3QgKmxvZywgX191MzIgc2FkZHIsIGludCBmb3JjZSkKK3sKKwlkaXNjb3ZlcnlfdCAqCQlkaXNjb3Zlcnk7CisJZGlzY292ZXJ5X3QgKgkJY3VycjsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwlkaXNjaW5mb190ICoJCWJ1ZmZlciA9IE5VTEw7CisJaW50CQkJbjsJCS8qIFNpemUgb2YgdGhlIGZ1bGwgbG9nICovCisJaW50CQkJaSA9IDA7CQkvKiBIb3cgbWFueSB3ZSBleHBpcmVkICovCisKKwlJUkRBX0FTU0VSVChsb2cgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2ctPmhiX3NwaW5sb2NrLCBmbGFncyk7CisKKwlkaXNjb3ZlcnkgPSAoZGlzY292ZXJ5X3QgKikgaGFzaGJpbl9nZXRfZmlyc3QobG9nKTsKKwl3aGlsZSAoZGlzY292ZXJ5ICE9IE5VTEwpIHsKKwkJLyogQmUgc3VyZSB0byBiZSBvbmUgaXRlbSBhaGVhZCAqLworCQljdXJyID0gZGlzY292ZXJ5OworCQlkaXNjb3ZlcnkgPSAoZGlzY292ZXJ5X3QgKikgaGFzaGJpbl9nZXRfbmV4dChsb2cpOworCisJCS8qIFRlc3QgaWYgaXQncyB0aW1lIHRvIGV4cGlyZSB0aGlzIGRpc2NvdmVyeSAqLworCQlpZiAoKGN1cnItPmRhdGEuc2FkZHIgPT0gc2FkZHIpICYmCisJCSAgICAoZm9yY2UgfHwKKwkJICAgICAoKGppZmZpZXMgLSBjdXJyLT50aW1lc3RhbXApID4gRElTQ09WRVJZX0VYUElSRV9USU1FT1VUKSkpCisJCXsKKwkJCS8qIENyZWF0ZSBidWZmZXIgYXMgbmVlZGVkLgorCQkJICogQXMgdGhpcyBmdW5jdGlvbiBnZXQgY2FsbGVkIGEgbG90IGFuZCBtb3N0IHRpbWUKKwkJCSAqIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgdG8gcHV0IGluIHRoZSBsb2cgKHdlIGFyZQorCQkJICogcXVpdGUgcGlja3kpLCB3ZSBjYW4gc2F2ZSBhIGxvdCBvZiBvdmVyaGVhZAorCQkJICogYnkgbm90IGNhbGxpbmcga21hbGxvYy4gSmVhbiBJSSAqLworCQkJaWYoYnVmZmVyID09IE5VTEwpIHsKKwkJCQkvKiBDcmVhdGUgdGhlIGNsaWVudCBzcGVjaWZpYyBidWZmZXIgKi8KKwkJCQluID0gSEFTSEJJTl9HRVRfU0laRShsb2cpOworCQkJCWJ1ZmZlciA9IGttYWxsb2MobiAqIHNpemVvZihzdHJ1Y3QgaXJkYV9kZXZpY2VfaW5mbyksIEdGUF9BVE9NSUMpOworCQkJCWlmIChidWZmZXIgPT0gTlVMTCkgeworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2ctPmhiX3NwaW5sb2NrLCBmbGFncyk7CisJCQkJCXJldHVybjsKKwkJCQl9CisKKwkJCX0KKworCQkJLyogQ29weSBkaXNjb3ZlcnkgaW5mb3JtYXRpb24gKi8KKwkJCW1lbWNweSgmKGJ1ZmZlcltpXSksICYoY3Vyci0+ZGF0YSksCisJCQkgICAgICAgc2l6ZW9mKGRpc2NpbmZvX3QpKTsKKwkJCWkrKzsKKworCQkJLyogUmVtb3ZlIGl0IGZyb20gdGhlIGxvZyAqLworCQkJY3VyciA9IGhhc2hiaW5fcmVtb3ZlX3RoaXMobG9nLCAoaXJkYV9xdWV1ZV90ICopIGN1cnIpOworCQkJaWYgKGN1cnIpCisJCQkJa2ZyZWUoY3Vycik7CisJCX0KKwl9CisKKwkvKiBEcm9wIHRoZSBzcGlubG9jayBiZWZvcmUgY2FsbGluZyB0aGUgaGlnaGVyIGxheWVycywgYXMKKwkgKiB3ZSBjYW4ndCBndWFyYW50ZWUgdGhleSB3b24ndCBjYWxsIHVzIGJhY2sgYW5kIGNyZWF0ZSBhCisJICogZGVhZGxvY2suIFdlIHdpbGwgd29yayBvbiBvdXIgb3duIHByaXZhdGUgZGF0YSwgc28gd2UKKwkgKiBkb24ndCBjYXJlIHRvIGJlIGludGVydXB0ZWQuIC0gSmVhbiBJSSAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvZy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKworCWlmKGJ1ZmZlciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBUZWxsIElyTE1QIGFuZCByZWdpc3RlcmVkIGNsaWVudHMgYWJvdXQgaXQgKi8KKwlpcmxtcF9kaXNjb3ZlcnlfZXhwaXJ5KGJ1ZmZlciwgaSk7CisKKwkvKiBGcmVlIHVwIG91ciBidWZmZXIgKi8KKwlrZnJlZShidWZmZXIpOworfQorCisjaWYgMAorLyoKKyAqIEZ1bmN0aW9uIGlybG1wX2R1bXBfZGlzY292ZXJpZXMgKGxvZykKKyAqCisgKiAgICBQcmludCBvdXQgYWxsIGRpc2NvdmVyaWVzIGluIGxvZworICoKKyAqLwordm9pZCBpcmxtcF9kdW1wX2Rpc2NvdmVyaWVzKGhhc2hiaW5fdCAqbG9nKQoreworCWRpc2NvdmVyeV90ICpkaXNjb3Zlcnk7CisKKwlJUkRBX0FTU0VSVChsb2cgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlkaXNjb3ZlcnkgPSAoZGlzY292ZXJ5X3QgKikgaGFzaGJpbl9nZXRfZmlyc3QobG9nKTsKKwl3aGlsZSAoZGlzY292ZXJ5ICE9IE5VTEwpIHsKKwkJSVJEQV9ERUJVRygwLCAiRGlzY292ZXJ5OlxuIik7CisJCUlSREFfREVCVUcoMCwgIiAgZGFkZHI9JTA4eFxuIiwgZGlzY292ZXJ5LT5kYXRhLmRhZGRyKTsKKwkJSVJEQV9ERUJVRygwLCAiICBzYWRkcj0lMDh4XG4iLCBkaXNjb3ZlcnktPmRhdGEuc2FkZHIpOyAKKwkJSVJEQV9ERUJVRygwLCAiICBuaWNrbmFtZT0lc1xuIiwgZGlzY292ZXJ5LT5kYXRhLmluZm8pOworCisJCWRpc2NvdmVyeSA9IChkaXNjb3ZlcnlfdCAqKSBoYXNoYmluX2dldF9uZXh0KGxvZyk7CisJfQorfQorI2VuZGlmCisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9jb3B5X2Rpc2NvdmVyaWVzIChsb2csIHBuLCBtYXNrKQorICoKKyAqICAgIENvcHkgYWxsIGRpc2NvdmVyaWVzIGluIGEgYnVmZmVyCisgKgorICogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnQgYSBzYWZlIHdheSBmb3IgbG1wIGNsaWVudHMgdG8gYWNjZXNzIHRoZQorICogZGlzY292ZXJ5IGxvZy4gVGhlIGJhc2ljIHByb2JsZW0gaXMgdGhhdCB3ZSBkb24ndCB3YW50IHRoZSBsb2cKKyAqIHRvIGNoYW5nZSAoYWRkL3JlbW92ZSkgd2hpbGUgdGhlIGNsaWVudCBpcyByZWFkaW5nIGl0LiBJZiB0aGUKKyAqIGxtcCBjbGllbnQgbWFuaXB1bGF0ZSBkaXJlY3RseSB0aGUgaGFzaGJpbiwgaGUgaXMgc3VyZSB0byBnZXQKKyAqIGludG8gdHJvdWJsZXMuLi4KKyAqIFRoZSBpZGVhIGlzIHRoYXQgd2UgY29weSBhbGwgdGhlIGN1cnJlbnQgZGlzY292ZXJ5IGxvZyBpbiBhIGJ1ZmZlcgorICogd2hpY2ggaXMgc3BlY2lmaWMgdG8gdGhlIGNsaWVudCBhbmQgcGFzcyB0aGlzIGNvcHkgdG8gaGltLiBBcyB3ZQorICogZG8gdGhpcyBvcGVyYXRpb24gd2l0aCB0aGUgc3BpbmxvY2sgZ3JhYmJlZCwgd2UgYXJlIHNhZmUuLi4KKyAqIE5vdGUgOiB3ZSBkb24ndCB3YW50IHRob3NlIGNsaWVudHMgdG8gZ3JhYiB0aGUgc3BpbmxvY2ssIGJlY2F1c2UKKyAqIHdlIGhhdmUgbm8gY29udHJvbCBvbiBob3cgbG9uZyB0aGV5IHdpbGwgaG9sZCBpdC4uLgorICogTm90ZSA6IHdlIGNob29zZSB0byBjb3B5IHRoZSBsb2cgaW4gInN0cnVjdCBpcmRhX2RldmljZV9pbmZvIiB0bworICogc2F2ZSBzcGFjZS4uLgorICogTm90ZSA6IHRoZSBjbGllbnQgbXVzdCBrZnJlZSBoaW1zZWxmKCkgdGhlIGxvZy4uLgorICogSmVhbiBJSQorICovCitzdHJ1Y3QgaXJkYV9kZXZpY2VfaW5mbyAqaXJsbXBfY29weV9kaXNjb3ZlcmllcyhoYXNoYmluX3QgKmxvZywgaW50ICpwbiwKKwkJCQkJCV9fdTE2IG1hc2ssIGludCBvbGRfZW50cmllcykKK3sKKwlkaXNjb3ZlcnlfdCAqCQlkaXNjb3Zlcnk7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJZGlzY2luZm9fdCAqCQlidWZmZXIgPSBOVUxMOworCWludAkJCWpfdGltZW91dCA9IChzeXNjdGxfZGlzY292ZXJ5X3RpbWVvdXQgKiBIWik7CisJaW50CQkJbjsJCS8qIFNpemUgb2YgdGhlIGZ1bGwgbG9nICovCisJaW50CQkJaSA9IDA7CQkvKiBIb3cgbWFueSB3ZSBwaWNrZWQgKi8KKworCUlSREFfQVNTRVJUKHBuICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CisJSVJEQV9BU1NFUlQobG9nICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CisKKwkvKiBTYXZlIHNwaW4gbG9jayAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2ctPmhiX3NwaW5sb2NrLCBmbGFncyk7CisKKwlkaXNjb3ZlcnkgPSAoZGlzY292ZXJ5X3QgKikgaGFzaGJpbl9nZXRfZmlyc3QobG9nKTsKKwl3aGlsZSAoZGlzY292ZXJ5ICE9IE5VTEwpIHsKKwkJLyogTWFzayBvdXQgdGhlIG9uZXMgd2UgZG9uJ3Qgd2FudCA6CisJCSAqIFdlIHdhbnQgdG8gbWF0Y2ggdGhlIGRpc2NvdmVyeSBtYXNrLCBhbmQgdG8gZ2V0IG9ubHkKKwkJICogdGhlIG1vc3QgcmVjZW50IG9uZSAodW5sZXNzIHdlIHdhbnQgb2xkIG9uZXMpICovCisJCWlmICgodTE2aG8oZGlzY292ZXJ5LT5kYXRhLmhpbnRzKSAmIG1hc2spICYmCisJCSAgICAoKG9sZF9lbnRyaWVzKSB8fAorCQkgICAgICgoamlmZmllcyAtIGRpc2NvdmVyeS0+Zmlyc3RzdGFtcCkgPCBqX3RpbWVvdXQpKSApIHsKKwkJCS8qIENyZWF0ZSBidWZmZXIgYXMgbmVlZGVkLgorCQkJICogQXMgdGhpcyBmdW5jdGlvbiBnZXQgY2FsbGVkIGEgbG90IGFuZCBtb3N0IHRpbWUKKwkJCSAqIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgdG8gcHV0IGluIHRoZSBsb2cgKHdlIGFyZQorCQkJICogcXVpdGUgcGlja3kpLCB3ZSBjYW4gc2F2ZSBhIGxvdCBvZiBvdmVyaGVhZAorCQkJICogYnkgbm90IGNhbGxpbmcga21hbGxvYy4gSmVhbiBJSSAqLworCQkJaWYoYnVmZmVyID09IE5VTEwpIHsKKwkJCQkvKiBDcmVhdGUgdGhlIGNsaWVudCBzcGVjaWZpYyBidWZmZXIgKi8KKwkJCQluID0gSEFTSEJJTl9HRVRfU0laRShsb2cpOworCQkJCWJ1ZmZlciA9IGttYWxsb2MobiAqIHNpemVvZihzdHJ1Y3QgaXJkYV9kZXZpY2VfaW5mbyksIEdGUF9BVE9NSUMpOworCQkJCWlmIChidWZmZXIgPT0gTlVMTCkgeworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2ctPmhiX3NwaW5sb2NrLCBmbGFncyk7CisJCQkJCXJldHVybiBOVUxMOworCQkJCX0KKworCQkJfQorCisJCQkvKiBDb3B5IGRpc2NvdmVyeSBpbmZvcm1hdGlvbiAqLworCQkJbWVtY3B5KCYoYnVmZmVyW2ldKSwgJihkaXNjb3ZlcnktPmRhdGEpLAorCQkJICAgICAgIHNpemVvZihkaXNjaW5mb190KSk7CisJCQlpKys7CisJCX0KKwkJZGlzY292ZXJ5ID0gKGRpc2NvdmVyeV90ICopIGhhc2hiaW5fZ2V0X25leHQobG9nKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2ctPmhiX3NwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBHZXQgdGhlIGFjdHVhbCBudW1iZXIgb2YgZGV2aWNlIGluIHRoZSBidWZmZXIgYW5kIHJldHVybiAqLworCSpwbiA9IGk7CisJcmV0dXJuKGJ1ZmZlcik7Cit9CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIGlubGluZSBkaXNjb3ZlcnlfdCAqZGlzY292ZXJ5X3NlcV9pZHgobG9mZl90IHBvcykKKworeworCWRpc2NvdmVyeV90ICpkaXNjb3Zlcnk7CisKKwlmb3IgKGRpc2NvdmVyeSA9IChkaXNjb3ZlcnlfdCAqKSBoYXNoYmluX2dldF9maXJzdChpcmxtcC0+Y2FjaGVsb2cpOyAKKwkgICAgIGRpc2NvdmVyeSAhPSBOVUxMOworCSAgICAgZGlzY292ZXJ5ID0gKGRpc2NvdmVyeV90ICopIGhhc2hiaW5fZ2V0X25leHQoaXJsbXAtPmNhY2hlbG9nKSkgeworCQlpZiAocG9zLS0gPT0gMCkKKwkJCWJyZWFrOworCX0KKwkJCisJcmV0dXJuIGRpc2NvdmVyeTsKK30KKworc3RhdGljIHZvaWQgKmRpc2NvdmVyeV9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXNwaW5fbG9ja19pcnEoJmlybG1wLT5jYWNoZWxvZy0+aGJfc3BpbmxvY2spOworICAgICAgICByZXR1cm4gKnBvcyA/IGRpc2NvdmVyeV9zZXFfaWR4KCpwb3MgLSAxKSA6IFNFUV9TVEFSVF9UT0tFTjsKK30KKworc3RhdGljIHZvaWQgKmRpc2NvdmVyeV9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJKysqcG9zOworCXJldHVybiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIAorCQk/ICh2b2lkICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGlybG1wLT5jYWNoZWxvZykKKwkJOiAodm9pZCAqKSBoYXNoYmluX2dldF9uZXh0KGlybG1wLT5jYWNoZWxvZyk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2NvdmVyeV9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzcGluX3VubG9ja19pcnEoJmlybG1wLT5jYWNoZWxvZy0+aGJfc3BpbmxvY2spOworfQorCitzdGF0aWMgaW50IGRpc2NvdmVyeV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXNlcV9wdXRzKHNlcSwgIklyTE1QOiBEaXNjb3ZlcnkgbG9nOlxuXG4iKTsKKwllbHNlIHsKKwkJY29uc3QgZGlzY292ZXJ5X3QgKmRpc2NvdmVyeSA9IHY7CisKKwkJc2VxX3ByaW50ZihzZXEsICJuaWNrbmFtZTogJXMsIGhpbnQ6IDB4JTAyeCUwMngiLCAKKwkJCSAgIGRpc2NvdmVyeS0+ZGF0YS5pbmZvLAorCQkJICAgZGlzY292ZXJ5LT5kYXRhLmhpbnRzWzBdLCAKKwkJCSAgIGRpc2NvdmVyeS0+ZGF0YS5oaW50c1sxXSk7CisjaWYgMAorCQlpZiAoIGRpc2NvdmVyeS0+ZGF0YS5oaW50c1swXSAmIEhJTlRfUE5QKQorCQkJc2VxX3B1dHMoc2VxLCAiUG5QIENvbXBhdGlibGUgIik7CisJCWlmICggZGlzY292ZXJ5LT5kYXRhLmhpbnRzWzBdICYgSElOVF9QREEpCisJCQlzZXFfcHV0cyhzZXEsICJQREEvUGFsbXRvcCAiKTsKKwkJaWYgKCBkaXNjb3ZlcnktPmRhdGEuaGludHNbMF0gJiBISU5UX0NPTVBVVEVSKQorCQkJc2VxX3B1dHMoc2VxLCAiQ29tcHV0ZXIgIik7CisJCWlmICggZGlzY292ZXJ5LT5kYXRhLmhpbnRzWzBdICYgSElOVF9QUklOVEVSKQorCQkJc2VxX3B1dHMoc2VxLCAiUHJpbnRlciAiKTsKKwkJaWYgKCBkaXNjb3ZlcnktPmRhdGEuaGludHNbMF0gJiBISU5UX01PREVNKQorCQkJc2VxX3B1dHMoc2VxLCAiTW9kZW0gIik7CisJCWlmICggZGlzY292ZXJ5LT5kYXRhLmhpbnRzWzBdICYgSElOVF9GQVgpCisJCQlzZXFfcHV0cyhzZXEsICJGYXggIik7CisJCWlmICggZGlzY292ZXJ5LT5kYXRhLmhpbnRzWzBdICYgSElOVF9MQU4pCisJCQlzZXFfcHV0cyhzZXEsICJMQU4gQWNjZXNzICIpOworCQkKKwkJaWYgKCBkaXNjb3ZlcnktPmRhdGEuaGludHNbMV0gJiBISU5UX1RFTEVQSE9OWSkKKwkJCXNlcV9wdXRzKHNlcSwgIlRlbGVwaG9ueSAiKTsKKwkJaWYgKCBkaXNjb3ZlcnktPmRhdGEuaGludHNbMV0gJiBISU5UX0ZJTEVfU0VSVkVSKQorCQkJc2VxX3B1dHMoc2VxLCAiRmlsZSBTZXJ2ZXIgIik7ICAgICAgIAorCQlpZiAoIGRpc2NvdmVyeS0+ZGF0YS5oaW50c1sxXSAmIEhJTlRfQ09NTSkKKwkJCXNlcV9wdXRzKHNlcSwgIklyQ09NTSAiKTsKKwkJaWYgKCBkaXNjb3ZlcnktPmRhdGEuaGludHNbMV0gJiBISU5UX09CRVgpCisJCQlzZXFfcHV0cyhzZXEsICJJck9CRVggIik7CisjZW5kaWYJCQorCQlzZXFfcHJpbnRmKHNlcSwiLCBzYWRkcjogMHglMDh4LCBkYWRkcjogMHglMDh4XG5cbiIsCisJCQkgICAgICAgZGlzY292ZXJ5LT5kYXRhLnNhZGRyLAorCQkJICAgICAgIGRpc2NvdmVyeS0+ZGF0YS5kYWRkcik7CisJCQorCQlzZXFfcHV0YyhzZXEsICdcbicpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBkaXNjb3Zlcnlfc2VxX29wcyA9IHsKKwkuc3RhcnQgID0gZGlzY292ZXJ5X3NlcV9zdGFydCwKKwkubmV4dCAgID0gZGlzY292ZXJ5X3NlcV9uZXh0LAorCS5zdG9wICAgPSBkaXNjb3Zlcnlfc2VxX3N0b3AsCisJLnNob3cgICA9IGRpc2NvdmVyeV9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgZGlzY292ZXJ5X3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCUlSREFfQVNTRVJUKGlybG1wICE9IE5VTEwsIHJldHVybiAtRUlOVkFMOyk7CisKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmRpc2NvdmVyeV9zZXFfb3BzKTsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkaXNjb3Zlcnlfc2VxX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgICAgICAgICA9IGRpc2NvdmVyeV9zZXFfb3BlbiwKKwkucmVhZCAgICAgICAgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICAgICAgICAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZSwKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lyY29tbS9LY29uZmlnIGIvbmV0L2lyZGEvaXJjb21tL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ0YzZiNAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lyY29tbS9LY29uZmlnCkBAIC0wLDAgKzEsMTIgQEAKK2NvbmZpZyBJUkNPTU0KKwl0cmlzdGF0ZSAiSXJDT01NIHByb3RvY29sIgorCWRlcGVuZHMgb24gSVJEQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIElyQ09NTSBwcm90b2NvbC4KKwkgIFRvIGNvbXBpbGUgaXQgYXMgbW9kdWxlcywgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZXMgd2lsbCBiZQorCSAgY2FsbGVkIGlyY29tbSBhbmQgaXJjb21tX3R0eS4KKwkgIElyQ09NTSBpbXBsZW1lbnRzIHNlcmlhbCBwb3J0IGVtdWxhdGlvbiwgYW5kIG1ha2VzIGl0IHBvc3NpYmxlIHRvCisJICB1c2UgYWxsIGV4aXN0aW5nIGFwcGxpY2F0aW9ucyB0aGF0IHVuZGVyc3RhbmRzIFRUWSdzIHdpdGggYW4KKwkgIGluZnJhcmVkIGxpbmsuICBUaHVzIHlvdSBzaG91bGQgYmUgYWJsZSB0byB1c2UgYXBwbGljYXRpb24gbGlrZSBQUFAsCisJICBtaW5pY29tIGFuZCBvdGhlcnMuCisKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lyY29tbS9NYWtlZmlsZSBiL25ldC9pcmRhL2lyY29tbS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODY4OTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJjb21tL01ha2VmaWxlCkBAIC0wLDAgKzEsOCBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IElyREEgSXJDT01NIHByb3RvY29sIGxheWVyLgorIworCitvYmotJChDT05GSUdfSVJDT01NKSArPSBpcmNvbW0ubyBpcmNvbW0tdHR5Lm8KKworaXJjb21tLW9ianMgOj0gaXJjb21tX2NvcmUubyBpcmNvbW1fZXZlbnQubyBpcmNvbW1fbG1wLm8gaXJjb21tX3R0cC5vCitpcmNvbW0tdHR5LW9ianMgOj0gaXJjb21tX3R0eS5vIGlyY29tbV90dHlfYXR0YWNoLm8gaXJjb21tX3R0eV9pb2N0bC5vIGlyY29tbV9wYXJhbS5vCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX2NvcmUuYyBiL25ldC9pcmRhL2lyY29tbS9pcmNvbW1fY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4Njg4MTkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX2NvcmUuYwpAQCAtMCwwICsxLDU4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBpcmNvbW1fY29yZS5jCisgKiBWZXJzaW9uOiAgICAgICAxLjAKKyAqIERlc2NyaXB0aW9uOiAgIElyQ09NTSBzZXJ2aWNlIGludGVyZmFjZQorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgU3VuIEp1biAgNiAyMDozNzozNCAxOTk5CisgKiBNb2RpZmllZCBhdDogICBUdWUgRGVjIDIxIDEzOjI2OjQxIDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OSBEYWcgQnJhdHRsaSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CisgKiAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIAorICogICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICogICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcm1vZC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcnR0cC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFzX29iamVjdC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJjb21tX2V2ZW50Lmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJjb21tX2xtcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyY29tbV90dHAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmNvbW1fcGFyYW0uaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmNvbW1fY29yZS5oPgorCitzdGF0aWMgaW50IF9faXJjb21tX2Nsb3NlKHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYpOworc3RhdGljIHZvaWQgaXJjb21tX2NvbnRyb2xfaW5kaWNhdGlvbihzdHJ1Y3QgaXJjb21tX2NiICpzZWxmLCAKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgY2xlbik7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworZXh0ZXJuIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19pcmRhOworc3RhdGljIGludCBpcmNvbW1fc2VxX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcmNvbW1fcHJvY19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICAgICAgICAgPSBpcmNvbW1fc2VxX29wZW4sCisJLnJlYWQgICAgICAgICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgICAgICAgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKK2hhc2hiaW5fdCAqaXJjb21tID0gTlVMTDsKKworc3RhdGljIGludCBfX2luaXQgaXJjb21tX2luaXQodm9pZCkKK3sKKwlpcmNvbW0gPSBoYXNoYmluX25ldyhIQl9MT0NLKTsgCisJaWYgKGlyY29tbSA9PSBOVUxMKSB7CisJCUlSREFfRVJST1IoIiVzKCksIGNhbid0IGFsbG9jYXRlIGhhc2hiaW4hXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwl7IHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50OworCWVudCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJpcmNvbW0iLCAwLCBwcm9jX2lyZGEpOworCWlmIChlbnQpIAorCQllbnQtPnByb2NfZm9wcyA9ICZpcmNvbW1fcHJvY19mb3BzOworCX0KKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCQorCUlSREFfTUVTU0FHRSgiSXJDT01NIHByb3RvY29sIChEYWcgQnJhdHRsaSlcbiIpOworCQkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGlyY29tbV9jbGVhbnVwKHZvaWQpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwloYXNoYmluX2RlbGV0ZShpcmNvbW0sIChGUkVFX0ZVTkMpIF9faXJjb21tX2Nsb3NlKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJcmVtb3ZlX3Byb2NfZW50cnkoImlyY29tbSIsIHByb2NfaXJkYSk7CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9vcGVuIChjbGllbnRfbm90aWZ5KQorICoKKyAqICAgIFN0YXJ0IGEgbmV3IElyQ09NTSBpbnN0YW5jZQorICoKKyAqLworc3RydWN0IGlyY29tbV9jYiAqaXJjb21tX29wZW4obm90aWZ5X3QgKm5vdGlmeSwgX191OCBzZXJ2aWNlX3R5cGUsIGludCBsaW5lKQoreworCXN0cnVjdCBpcmNvbW1fY2IgKnNlbGYgPSBOVUxMOworCWludCByZXQ7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBzZXJ2aWNlX3R5cGU9MHglMDJ4XG4iLCBfX0ZVTkNUSU9OX18gLAorCQkgICBzZXJ2aWNlX3R5cGUpOworCisJSVJEQV9BU1NFUlQoaXJjb21tICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CisKKwlzZWxmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlyY29tbV9jYiksIEdGUF9BVE9NSUMpOworCWlmIChzZWxmID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KHNlbGYsIDAsIHNpemVvZihzdHJ1Y3QgaXJjb21tX2NiKSk7CisKKwlzZWxmLT5ub3RpZnkgPSAqbm90aWZ5OworCXNlbGYtPm1hZ2ljID0gSVJDT01NX01BR0lDOworCisJLyogQ2hlY2sgaWYgd2Ugc2hvdWxkIHVzZSBJckxNUCBvciBJclRUUCAqLworCWlmIChzZXJ2aWNlX3R5cGUgJiBJUkNPTU1fM19XSVJFX1JBVykgeworCQlzZWxmLT5mbG93X3N0YXR1cyA9IEZMT1dfU1RBUlQ7CisJCXJldCA9IGlyY29tbV9vcGVuX2xzYXAoc2VsZik7CisJfSBlbHNlCisJCXJldCA9IGlyY29tbV9vcGVuX3RzYXAoc2VsZik7CisKKwlpZiAocmV0IDwgMCkgeworCQlrZnJlZShzZWxmKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2VsZi0+c2VydmljZV90eXBlID0gc2VydmljZV90eXBlOworCXNlbGYtPmxpbmUgPSBsaW5lOworCisJaGFzaGJpbl9pbnNlcnQoaXJjb21tLCAoaXJkYV9xdWV1ZV90ICopIHNlbGYsIGxpbmUsIE5VTEwpOworCisJaXJjb21tX25leHRfc3RhdGUoc2VsZiwgSVJDT01NX0lETEUpOwkKKworCXJldHVybiBzZWxmOworfQorCitFWFBPUlRfU1lNQk9MKGlyY29tbV9vcGVuKTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9jbG9zZV9pbnN0YW5jZSAoc2VsZikKKyAqCisgKiAgICBSZW1vdmUgSXJDT01NIGluc3RhbmNlCisgKgorICovCitzdGF0aWMgaW50IF9faXJjb21tX2Nsb3NlKHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwkvKiBEaXNjb25uZWN0IGxpbmsgaWYgYW55ICovCisJaXJjb21tX2RvX2V2ZW50KHNlbGYsIElSQ09NTV9ESVNDT05ORUNUX1JFUVVFU1QsIE5VTEwsIE5VTEwpOworCisJLyogUmVtb3ZlIFRTQVAgKi8KKwlpZiAoc2VsZi0+dHNhcCkgeworCQlpcnR0cF9jbG9zZV90c2FwKHNlbGYtPnRzYXApOworCQlzZWxmLT50c2FwID0gTlVMTDsKKwl9CisKKwkvKiBSZW1vdmUgTFNBUCAqLworCWlmIChzZWxmLT5sc2FwKSB7CisJCWlybG1wX2Nsb3NlX2xzYXAoc2VsZi0+bHNhcCk7CisJCXNlbGYtPmxzYXAgPSBOVUxMOworCX0KKwlzZWxmLT5tYWdpYyA9IDA7CisKKwlrZnJlZShzZWxmKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX2Nsb3NlIChzZWxmKQorICoKKyAqICAgIENsb3NlcyBhbmQgcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIElyQ09NTSBpbnN0YW5jZQorICoKKyAqLworaW50IGlyY29tbV9jbG9zZShzdHJ1Y3QgaXJjb21tX2NiICpzZWxmKQoreworCXN0cnVjdCBpcmNvbW1fY2IgKmVudHJ5OworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLUVJTzspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9NQUdJQywgcmV0dXJuIC1FSU87KTsKKworCUlSREFfREVCVUcoMCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJZW50cnkgPSBoYXNoYmluX3JlbW92ZShpcmNvbW0sIHNlbGYtPmxpbmUsIE5VTEwpOworCisJSVJEQV9BU1NFUlQoZW50cnkgPT0gc2VsZiwgcmV0dXJuIC0xOyk7CisJCisgICAgICAgIHJldHVybiBfX2lyY29tbV9jbG9zZShzZWxmKTsKK30KKworRVhQT1JUX1NZTUJPTChpcmNvbW1fY2xvc2UpOworCisvKgorICogRnVuY3Rpb24gaXJjb21tX2Nvbm5lY3RfcmVxdWVzdCAoc2VsZiwgc2VydmljZV90eXBlKQorICoKKyAqICAgIEltcGwuIG9mIHRoaXMgZnVuY3Rpb24gaXMgZGlmZmVyIGZyb20gb25lIG9mIHRoZSByZWZlcmVuY2UuIFRoaXMKKyAqICAgIGZ1bmN0aW9uIGRvZXMgZGlzY292ZXJ5IGFzIHdlbGwgYXMgc2VuZGluZyBjb25uZWN0IHJlcXVlc3QKKyAqIAorICovCitpbnQgaXJjb21tX2Nvbm5lY3RfcmVxdWVzdChzdHJ1Y3QgaXJjb21tX2NiICpzZWxmLCBfX3U4IGRsc2FwX3NlbCwgCisJCQkgICBfX3UzMiBzYWRkciwgX191MzIgZGFkZHIsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICBfX3U4IHNlcnZpY2VfdHlwZSkKK3sKKwlzdHJ1Y3QgaXJjb21tX2luZm8gaW5mbzsKKwlpbnQgcmV0OworCisJSVJEQV9ERUJVRygyICwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fTUFHSUMsIHJldHVybiAtMTspOworCisJc2VsZi0+c2VydmljZV90eXBlPSBzZXJ2aWNlX3R5cGU7CisKKwlpbmZvLmRsc2FwX3NlbCA9IGRsc2FwX3NlbDsKKwlpbmZvLnNhZGRyID0gc2FkZHI7CisJaW5mby5kYWRkciA9IGRhZGRyOworCisJcmV0ID0gaXJjb21tX2RvX2V2ZW50KHNlbGYsIElSQ09NTV9DT05ORUNUX1JFUVVFU1QsIHNrYiwgJmluZm8pOworCisJcmV0dXJuIHJldDsKK30KKworRVhQT1JUX1NZTUJPTChpcmNvbW1fY29ubmVjdF9yZXF1ZXN0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9jb25uZWN0X2luZGljYXRpb24gKHNlbGYsIHFvcywgc2tiKQorICoKKyAqICAgIE5vdGlmeSB1c2VyIGxheWVyIGFib3V0IHRoZSBpbmNvbWluZyBjb25uZWN0aW9uCisgKgorICovCit2b2lkIGlyY29tbV9jb25uZWN0X2luZGljYXRpb24oc3RydWN0IGlyY29tbV9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICBzdHJ1Y3QgaXJjb21tX2luZm8gKmluZm8pCit7CisJaW50IGNsZW4gPSAwOworCQorCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJLyogQ2hlY2sgaWYgdGhlIHBhY2tldCBjb250YWlucyBkYXRhIG9uIHRoZSBjb250cm9sIGNoYW5uZWwgKi8KKwlpZiAoc2tiLT5sZW4gPiAwKQorCQljbGVuID0gc2tiLT5kYXRhWzBdOworCQorCS8qIAorCSAqIElmIHRoZXJlIGFyZSBhbnkgZGF0YSBoaWRpbmcgaW4gdGhlIGNvbnRyb2wgY2hhbm5lbCwgd2UgbXVzdCAKKwkgKiBkZWxpdmVyIGl0IGZpcnN0LiBUaGUgc2lkZSBlZmZlY3QgaXMgdGhhdCB0aGUgY29udHJvbCBjaGFubmVsIAorCSAqIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBza2IKKwkgKi8KKwlpZiAoc2VsZi0+bm90aWZ5LmNvbm5lY3RfaW5kaWNhdGlvbikKKwkJc2VsZi0+bm90aWZ5LmNvbm5lY3RfaW5kaWNhdGlvbihzZWxmLT5ub3RpZnkuaW5zdGFuY2UsIHNlbGYsIAorCQkJCQkJaW5mby0+cW9zLCBpbmZvLT5tYXhfZGF0YV9zaXplLAorCQkJCQkJaW5mby0+bWF4X2hlYWRlcl9zaXplLCBza2IpOworCWVsc2UgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBtaXNzaW5nIGhhbmRsZXJcbiIsIF9fRlVOQ1RJT05fXyApOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9jb25uZWN0X3Jlc3BvbnNlIChzZWxmLCB1c2VyZGF0YSwgbWF4X3NkdV9zaXplKQorICoKKyAqICAgIFVzZXIgYWNjZXB0cyBjb25uZWN0aW9uCisgKgorICovCitpbnQgaXJjb21tX2Nvbm5lY3RfcmVzcG9uc2Uoc3RydWN0IGlyY29tbV9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnVzZXJkYXRhKQoreworCWludCByZXQ7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCXJldCA9IGlyY29tbV9kb19ldmVudChzZWxmLCBJUkNPTU1fQ09OTkVDVF9SRVNQT05TRSwgdXNlcmRhdGEsIE5VTEwpOworCisJcmV0dXJuIHJldDsKK30JCisKK0VYUE9SVF9TWU1CT0woaXJjb21tX2Nvbm5lY3RfcmVzcG9uc2UpOworCisvKgorICogRnVuY3Rpb24gY29ubmVjdF9jb25maXJtIChzZWxmLCBza2IpCisgKgorICogICAgTm90aWZ5IHVzZXIgbGF5ZXIgdGhhdCB0aGUgbGluayBpcyBub3cgY29ubmVjdGVkCisgKgorICovCit2b2lkIGlyY29tbV9jb25uZWN0X2NvbmZpcm0oc3RydWN0IGlyY29tbV9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICBzdHJ1Y3QgaXJjb21tX2luZm8gKmluZm8pCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlpZiAoc2VsZi0+bm90aWZ5LmNvbm5lY3RfY29uZmlybSApCisJCXNlbGYtPm5vdGlmeS5jb25uZWN0X2NvbmZpcm0oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLAorCQkJCQkgICAgIHNlbGYsIGluZm8tPnFvcywgCisJCQkJCSAgICAgaW5mby0+bWF4X2RhdGFfc2l6ZSwKKwkJCQkJICAgICBpbmZvLT5tYXhfaGVhZGVyX3NpemUsIHNrYik7CisJZWxzZSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIG1pc3NpbmcgaGFuZGxlclxuIiwgX19GVU5DVElPTl9fICk7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX2RhdGFfcmVxdWVzdCAoc2VsZiwgdXNlcmRhdGEpCisgKgorICogICAgU2VuZCBJckNPTU0gZGF0YSB0byBwZWVyIGRldmljZQorICoKKyAqLworaW50IGlyY29tbV9kYXRhX3JlcXVlc3Qoc3RydWN0IGlyY29tbV9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmV0OworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtRUZBVUxUOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX01BR0lDLCByZXR1cm4gLUVGQVVMVDspOworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm4gLUVGQVVMVDspOworCQorCXJldCA9IGlyY29tbV9kb19ldmVudChzZWxmLCBJUkNPTU1fREFUQV9SRVFVRVNULCBza2IsIE5VTEwpOworCisJcmV0dXJuIHJldDsKK30KKworRVhQT1JUX1NZTUJPTChpcmNvbW1fZGF0YV9yZXF1ZXN0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9kYXRhX2luZGljYXRpb24gKHNlbGYsIHNrYikKKyAqCisgKiAgICBEYXRhIGFycml2ZWQsIHNvIGRlbGl2ZXIgaXQgdG8gdXNlcgorICoKKyAqLwordm9pZCBpcmNvbW1fZGF0YV9pbmRpY2F0aW9uKHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCit7CQorCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2tiLT5sZW4gPiAwLCByZXR1cm47KTsKKworCWlmIChzZWxmLT5ub3RpZnkuZGF0YV9pbmRpY2F0aW9uKQorCQlzZWxmLT5ub3RpZnkuZGF0YV9pbmRpY2F0aW9uKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSwgc2VsZiwgc2tiKTsKKwllbHNlIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgbWlzc2luZyBoYW5kbGVyXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fcHJvY2Vzc19kYXRhIChzZWxmLCBza2IpCisgKgorICogICAgRGF0YSBhcnJpdmVkIHdoaWNoIG1heSBjb250YWluIGNvbnRyb2wgY2hhbm5lbCBkYXRhCisgKgorICovCit2b2lkIGlyY29tbV9wcm9jZXNzX2RhdGEoc3RydWN0IGlyY29tbV9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgY2xlbjsKKworCUlSREFfQVNTRVJUKHNrYi0+bGVuID4gMCwgcmV0dXJuOyk7CisKKwljbGVuID0gc2tiLT5kYXRhWzBdOworCisJLyogCisJICogSWYgdGhlcmUgYXJlIGFueSBkYXRhIGhpZGluZyBpbiB0aGUgY29udHJvbCBjaGFubmVsLCB3ZSBtdXN0IAorCSAqIGRlbGl2ZXIgaXQgZmlyc3QuIFRoZSBzaWRlIGVmZmVjdCBpcyB0aGF0IHRoZSBjb250cm9sIGNoYW5uZWwgCisJICogd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIHNrYgorCSAqLworCWlmIChjbGVuID4gMCkKKwkJaXJjb21tX2NvbnRyb2xfaW5kaWNhdGlvbihzZWxmLCBza2IsIGNsZW4pOworCisJLyogUmVtb3ZlIGNvbnRyb2wgY2hhbm5lbCBmcm9tIGRhdGEgY2hhbm5lbCAqLworCXNrYl9wdWxsKHNrYiwgY2xlbisxKTsKKworCWlmIChza2ItPmxlbikKKwkJaXJjb21tX2RhdGFfaW5kaWNhdGlvbihzZWxmLCBza2IpOwkJCisJZWxzZSB7CisJCUlSREFfREVCVUcoNCwgIiVzKCksIGRhdGEgd2FzIGNvbnRyb2wgaW5mbyBvbmx5IVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXyApOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9jb250cm9sX3JlcXVlc3QgKHNlbGYsIHBhcmFtcykKKyAqCisgKiAgICBTZW5kIGNvbnRyb2wgZGF0YSB0byBwZWVyIGRldmljZQorICoKKyAqLworaW50IGlyY29tbV9jb250cm9sX3JlcXVlc3Qoc3RydWN0IGlyY29tbV9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmV0OworCQorCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLUVGQVVMVDspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9NQUdJQywgcmV0dXJuIC1FRkFVTFQ7KTsKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIC1FRkFVTFQ7KTsKKwkKKwlyZXQgPSBpcmNvbW1fZG9fZXZlbnQoc2VsZiwgSVJDT01NX0NPTlRST0xfUkVRVUVTVCwgc2tiLCBOVUxMKTsKKworCXJldHVybiByZXQ7Cit9CisKK0VYUE9SVF9TWU1CT0woaXJjb21tX2NvbnRyb2xfcmVxdWVzdCk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fY29udHJvbF9pbmRpY2F0aW9uIChzZWxmLCBza2IpCisgKgorICogICAgRGF0YSBoYXMgYXJyaXZlZCBvbiB0aGUgY29udHJvbCBjaGFubmVsCisgKgorICovCitzdGF0aWMgdm9pZCBpcmNvbW1fY29udHJvbF9pbmRpY2F0aW9uKHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYsIAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGludCBjbGVuKQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwkKKworCS8qIFVzZSB1ZGF0YSBmb3IgZGVsaXZlcmluZyBkYXRhIG9uIHRoZSBjb250cm9sIGNoYW5uZWwgKi8KKwlpZiAoc2VsZi0+bm90aWZ5LnVkYXRhX2luZGljYXRpb24pIHsKKwkJc3RydWN0IHNrX2J1ZmYgKmN0cmxfc2tiOworCisJCS8qIFdlIGRvbid0IG93biB0aGUgc2tiLCBzbyBjbG9uZSBpdCAqLworCQljdHJsX3NrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCQlpZiAoIWN0cmxfc2tiKQorCQkJcmV0dXJuOworCisJCS8qIFJlbW92ZSBkYXRhIGNoYW5uZWwgZnJvbSBjb250cm9sIGNoYW5uZWwgKi8KKwkJc2tiX3RyaW0oY3RybF9za2IsIGNsZW4rMSk7CisJCisJCXNlbGYtPm5vdGlmeS51ZGF0YV9pbmRpY2F0aW9uKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSwgc2VsZiwgCisJCQkJCSAgICAgIGN0cmxfc2tiKTsKKworCQkvKiBEcm9wIHJlZmVyZW5jZSBjb3VudCAtCisJCSAqIHNlZSBpcmNvbW1fdHR5X2NvbnRyb2xfaW5kaWNhdGlvbigpLiAqLworCQlkZXZfa2ZyZWVfc2tiKGN0cmxfc2tiKTsKKwl9IGVsc2UgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBtaXNzaW5nIGhhbmRsZXJcbiIsIF9fRlVOQ1RJT05fXyApOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9kaXNjb25uZWN0X3JlcXVlc3QgKHNlbGYsIHVzZXJkYXRhLCBwcmlvcml0eSkKKyAqCisgKiAgICBVc2VyIGxheWVyIHdhbnRzIHRvIGRpc2Nvbm5lY3QgdGhlIElyQ09NTSBjb25uZWN0aW9uCisgKgorICovCitpbnQgaXJjb21tX2Rpc2Nvbm5lY3RfcmVxdWVzdChzdHJ1Y3QgaXJjb21tX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqdXNlcmRhdGEpCit7CisJc3RydWN0IGlyY29tbV9pbmZvIGluZm87CisJaW50IHJldDsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fTUFHSUMsIHJldHVybiAtMTspOworCisJcmV0ID0gaXJjb21tX2RvX2V2ZW50KHNlbGYsIElSQ09NTV9ESVNDT05ORUNUX1JFUVVFU1QsIHVzZXJkYXRhLCAKKwkJCSAgICAgICZpbmZvKTsKKwlyZXR1cm4gcmV0OworfQorCitFWFBPUlRfU1lNQk9MKGlyY29tbV9kaXNjb25uZWN0X3JlcXVlc3QpOworCisvKgorICogRnVuY3Rpb24gZGlzY29ubmVjdF9pbmRpY2F0aW9uIChzZWxmLCBza2IpCisgKgorICogICAgVGVsbCB1c2VyIHRoYXQgdGhlIGxpbmsgaGFzIGJlZW4gZGlzY29ubmVjdGVkCisgKgorICovCit2b2lkIGlyY29tbV9kaXNjb25uZWN0X2luZGljYXRpb24oc3RydWN0IGlyY29tbV9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgIHN0cnVjdCBpcmNvbW1faW5mbyAqaW5mbykKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKyAgICAgICAKKwlJUkRBX0FTU0VSVChpbmZvICE9IE5VTEwsIHJldHVybjspOworCisJaWYgKHNlbGYtPm5vdGlmeS5kaXNjb25uZWN0X2luZGljYXRpb24pIHsKKwkJc2VsZi0+bm90aWZ5LmRpc2Nvbm5lY3RfaW5kaWNhdGlvbihzZWxmLT5ub3RpZnkuaW5zdGFuY2UsIHNlbGYsCisJCQkJCQkgICBpbmZvLT5yZWFzb24sIHNrYik7CisJfSBlbHNlIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgbWlzc2luZyBoYW5kbGVyXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fZmxvd19yZXF1ZXN0IChzZWxmLCBmbG93KQorICoKKyAqICAgIAorICoKKyAqLwordm9pZCBpcmNvbW1fZmxvd19yZXF1ZXN0KHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYsIExPQ0FMX0ZMT1cgZmxvdykKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX01BR0lDLCByZXR1cm47KTsKKworCWlmIChzZWxmLT5zZXJ2aWNlX3R5cGUgPT0gSVJDT01NXzNfV0lSRV9SQVcpCisJCXJldHVybjsKKworCWlydHRwX2Zsb3dfcmVxdWVzdChzZWxmLT50c2FwLCBmbG93KTsKK30KKworRVhQT1JUX1NZTUJPTChpcmNvbW1fZmxvd19yZXF1ZXN0KTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgdm9pZCAqaXJjb21tX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGlyY29tbV9jYiAqc2VsZjsKKwlsb2ZmX3Qgb2ZmID0gMDsKKworCXNwaW5fbG9ja19pcnEoJmlyY29tbS0+aGJfc3BpbmxvY2spOworCisJZm9yIChzZWxmID0gKHN0cnVjdCBpcmNvbW1fY2IgKikgaGFzaGJpbl9nZXRfZmlyc3QoaXJjb21tKTsKKwkgICAgIHNlbGYgIT0gTlVMTDsKKwkgICAgIHNlbGYgPSAoc3RydWN0IGlyY29tbV9jYiAqKSBoYXNoYmluX2dldF9uZXh0KGlyY29tbSkpIHsKKwkJaWYgKG9mZisrID09ICpwb3MpCisJCQlicmVhazsKKwkJCisJfQorCXJldHVybiBzZWxmOworfQorCitzdGF0aWMgdm9pZCAqaXJjb21tX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwkrKypwb3M7CisKKwlyZXR1cm4gKHZvaWQgKikgaGFzaGJpbl9nZXRfbmV4dChpcmNvbW0pOworfQorCitzdGF0aWMgdm9pZCBpcmNvbW1fc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3Bpbl91bmxvY2tfaXJxKCZpcmNvbW0tPmhiX3NwaW5sb2NrKTsKK30KKworc3RhdGljIGludCBpcmNvbW1fc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7IAkKKwljb25zdCBzdHJ1Y3QgaXJjb21tX2NiICpzZWxmID0gdjsKKworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9NQUdJQywgcmV0dXJuIC1FSU5WQUw7ICk7CisKKwlpZihzZWxmLT5saW5lIDwgMHgxMCkKKwkJc2VxX3ByaW50ZihzZXEsICJpcmNvbW0lZCIsIHNlbGYtPmxpbmUpOworCWVsc2UKKwkJc2VxX3ByaW50ZihzZXEsICJpcmxwdCVkIiwgc2VsZi0+bGluZSAtIDB4MTApOworCisJc2VxX3ByaW50ZihzZXEsCisJCSAgICIgc3RhdGU6ICVzLCBzbHNhcF9zZWw6ICUjMDJ4LCBkbHNhcF9zZWw6ICUjMDJ4LCBtb2RlOiIsCisJCSAgIGlyY29tbV9zdGF0ZVsgc2VsZi0+c3RhdGVdLAorCQkgICBzZWxmLT5zbHNhcF9zZWwsIHNlbGYtPmRsc2FwX3NlbCk7IAorCisJaWYoc2VsZi0+c2VydmljZV90eXBlICYgSVJDT01NXzNfV0lSRV9SQVcpCisJCXNlcV9wcmludGYoc2VxLCAiIDMtd2lyZS1yYXciKTsKKwlpZihzZWxmLT5zZXJ2aWNlX3R5cGUgJiBJUkNPTU1fM19XSVJFKQorCQlzZXFfcHJpbnRmKHNlcSwgIiAzLXdpcmUiKTsKKwlpZihzZWxmLT5zZXJ2aWNlX3R5cGUgJiBJUkNPTU1fOV9XSVJFKQorCQlzZXFfcHJpbnRmKHNlcSwgIiA5LXdpcmUiKTsKKwlpZihzZWxmLT5zZXJ2aWNlX3R5cGUgJiBJUkNPTU1fQ0VOVFJPTklDUykKKwkJc2VxX3ByaW50ZihzZXEsICIgQ2VudHJvbmljcyIpOworCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBpcmNvbW1fc2VxX29wcyA9IHsKKwkuc3RhcnQgID0gaXJjb21tX3NlcV9zdGFydCwKKwkubmV4dCAgID0gaXJjb21tX3NlcV9uZXh0LAorCS5zdG9wICAgPSBpcmNvbW1fc2VxX3N0b3AsCisJLnNob3cgICA9IGlyY29tbV9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgaXJjb21tX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmaXJjb21tX3NlcV9vcHMpOworfQorI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKK01PRFVMRV9BVVRIT1IoIkRhZyBCcmF0dGxpIDxkYWdAYnJhdHRsaS5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklyQ09NTSBwcm90b2NvbCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChpcmNvbW1faW5pdCk7Cittb2R1bGVfZXhpdChpcmNvbW1fY2xlYW51cCk7CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX2V2ZW50LmMgYi9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX2V2ZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFmNGU4MAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lyY29tbS9pcmNvbW1fZXZlbnQuYwpAQCAtMCwwICsxLDI1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBpcmNvbW1fZXZlbnQuYworICogVmVyc2lvbjogICAgICAgMS4wCisgKiBEZXNjcmlwdGlvbjogICBJckNPTU0gbGF5ZXIgc3RhdGUgbWFjaGluZQorICogU3RhdHVzOiAgICAgICAgU3RhYmxlCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBTdW4gSnVuICA2IDIwOjMzOjExIDE5OTkKKyAqIE1vZGlmaWVkIGF0OiAgIFN1biBEZWMgMTIgMTM6NDQ6MzIgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5IERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAqICAgICBNQSAwMjExMS0xMzA3IFVTQQorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcnR0cC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFzX29iamVjdC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJjb21tX2NvcmUuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmNvbW1fZXZlbnQuaD4KKworc3RhdGljIGludCBpcmNvbW1fc3RhdGVfaWRsZShzdHJ1Y3QgaXJjb21tX2NiICpzZWxmLCBJUkNPTU1fRVZFTlQgZXZlbnQsIAorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJjb21tX2luZm8gKmluZm8pOworc3RhdGljIGludCBpcmNvbW1fc3RhdGVfd2FpdGkoc3RydWN0IGlyY29tbV9jYiAqc2VsZiwgSVJDT01NX0VWRU5UIGV2ZW50LCAKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmNvbW1faW5mbyAqaW5mbyk7CitzdGF0aWMgaW50IGlyY29tbV9zdGF0ZV93YWl0cihzdHJ1Y3QgaXJjb21tX2NiICpzZWxmLCBJUkNPTU1fRVZFTlQgZXZlbnQsIAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlyY29tbV9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgaXJjb21tX3N0YXRlX2Nvbm4oc3RydWN0IGlyY29tbV9jYiAqc2VsZiwgSVJDT01NX0VWRU5UIGV2ZW50LCAKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlyY29tbV9pbmZvICppbmZvKTsKKworY2hhciAqaXJjb21tX3N0YXRlW10gPSB7CisJIklSQ09NTV9JRExFIiwKKwkiSVJDT01NX1dBSVRJIiwKKwkiSVJDT01NX1dBSVRSIiwKKwkiSVJDT01NX0NPTk4iLAorfTsKKworI2lmZGVmIENPTkZJR19JUkRBX0RFQlVHCitzdGF0aWMgY2hhciAqaXJjb21tX2V2ZW50W10gPSB7CisJIklSQ09NTV9DT05ORUNUX1JFUVVFU1QiLAorICAgICAgICAiSVJDT01NX0NPTk5FQ1RfUkVTUE9OU0UiLAorICAgICAgICAiSVJDT01NX1RUUF9DT05ORUNUX0lORElDQVRJT04iLAorCSJJUkNPTU1fTE1QX0NPTk5FQ1RfSU5ESUNBVElPTiIsCisgICAgICAgICJJUkNPTU1fVFRQX0NPTk5FQ1RfQ09ORklSTSIsCisJIklSQ09NTV9MTVBfQ09OTkVDVF9DT05GSVJNIiwKKworICAgICAgICAiSVJDT01NX0xNUF9ESVNDT05ORUNUX0lORElDQVRJT04iLAorCSJJUkNPTU1fVFRQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTiIsCisgICAgICAgICJJUkNPTU1fRElTQ09OTkVDVF9SRVFVRVNUIiwKKworICAgICAgICAiSVJDT01NX1RUUF9EQVRBX0lORElDQVRJT04iLAorCSJJUkNPTU1fTE1QX0RBVEFfSU5ESUNBVElPTiIsCisgICAgICAgICJJUkNPTU1fREFUQV9SRVFVRVNUIiwKKyAgICAgICAgIklSQ09NTV9DT05UUk9MX1JFUVVFU1QiLAorICAgICAgICAiSVJDT01NX0NPTlRST0xfSU5ESUNBVElPTiIsCit9OworI2VuZGlmIC8qIENPTkZJR19JUkRBX0RFQlVHICovCisKK3N0YXRpYyBpbnQgKCpzdGF0ZVtdKShzdHJ1Y3QgaXJjb21tX2NiICpzZWxmLCBJUkNPTU1fRVZFTlQgZXZlbnQsCisJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmNvbW1faW5mbyAqaW5mbykgPSAKK3sKKwlpcmNvbW1fc3RhdGVfaWRsZSwKKwlpcmNvbW1fc3RhdGVfd2FpdGksCisJaXJjb21tX3N0YXRlX3dhaXRyLAorCWlyY29tbV9zdGF0ZV9jb25uLAorfTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9zdGF0ZV9pZGxlIChzZWxmLCBldmVudCwgc2tiKQorICoKKyAqICAgIElyQ09NTSBpcyBjdXJyZW50bHkgaWRsZQorICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fc3RhdGVfaWRsZShzdHJ1Y3QgaXJjb21tX2NiICpzZWxmLCBJUkNPTU1fRVZFTlQgZXZlbnQsIAorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJjb21tX2luZm8gKmluZm8pCit7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJUkNPTU1fQ09OTkVDVF9SRVFVRVNUOgorCQlpcmNvbW1fbmV4dF9zdGF0ZShzZWxmLCBJUkNPTU1fV0FJVEkpOwkJCisJCXJldCA9IHNlbGYtPmlzc3VlLmNvbm5lY3RfcmVxdWVzdChzZWxmLCBza2IsIGluZm8pOworCQlicmVhazsKKwljYXNlIElSQ09NTV9UVFBfQ09OTkVDVF9JTkRJQ0FUSU9OOgorCWNhc2UgSVJDT01NX0xNUF9DT05ORUNUX0lORElDQVRJT046CisJCWlyY29tbV9uZXh0X3N0YXRlKHNlbGYsIElSQ09NTV9XQUlUUik7CisJCWlyY29tbV9jb25uZWN0X2luZGljYXRpb24oc2VsZiwgc2tiLCBpbmZvKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgdW5rbm93biBldmVudDogJXNcbiIsIF9fRlVOQ1RJT05fXyAsCisJCQkgICBpcmNvbW1fZXZlbnRbZXZlbnRdKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9zdGF0ZV93YWl0aSAoc2VsZiwgZXZlbnQsIHNrYikKKyAqCisgKiAgICBUaGUgSXJDT01NIHVzZXIgaGFzIHJlcXVlc3RlZCBhbiBJckNPTU0gY29ubmVjdGlvbiB0byB0aGUgcmVtb3RlIAorICogICAgZGV2aWNlIGFuZCBpcyBhd2FpdGluZyBjb25maXJtYXRpb24KKyAqLworc3RhdGljIGludCBpcmNvbW1fc3RhdGVfd2FpdGkoc3RydWN0IGlyY29tbV9jYiAqc2VsZiwgSVJDT01NX0VWRU5UIGV2ZW50LCAKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmNvbW1faW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIElSQ09NTV9UVFBfQ09OTkVDVF9DT05GSVJNOgorCWNhc2UgSVJDT01NX0xNUF9DT05ORUNUX0NPTkZJUk06CisJCWlyY29tbV9uZXh0X3N0YXRlKHNlbGYsIElSQ09NTV9DT05OKTsKKwkJaXJjb21tX2Nvbm5lY3RfY29uZmlybShzZWxmLCBza2IsIGluZm8pOworCQlicmVhazsKKwljYXNlIElSQ09NTV9UVFBfRElTQ09OTkVDVF9JTkRJQ0FUSU9OOgorCWNhc2UgSVJDT01NX0xNUF9ESVNDT05ORUNUX0lORElDQVRJT046CisJCWlyY29tbV9uZXh0X3N0YXRlKHNlbGYsIElSQ09NTV9JRExFKTsKKwkJaXJjb21tX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzZWxmLCBza2IsIGluZm8pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDAsICIlcygpLCB1bmtub3duIGV2ZW50OiAlc1xuIiwgX19GVU5DVElPTl9fICwKKwkJCSAgIGlyY29tbV9ldmVudFtldmVudF0pOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3N0YXRlX3dhaXRyIChzZWxmLCBldmVudCwgc2tiKQorICoKKyAqICAgIElyQ09NTSBoYXMgcmVjZWl2ZWQgYW4gaW5jb21pbmcgY29ubmVjdGlvbiByZXF1ZXN0IGFuZCBpcyBhd2FpdGluZworICogICAgcmVzcG9uc2UgZnJvbSB0aGUgdXNlcgorICovCitzdGF0aWMgaW50IGlyY29tbV9zdGF0ZV93YWl0cihzdHJ1Y3QgaXJjb21tX2NiICpzZWxmLCBJUkNPTU1fRVZFTlQgZXZlbnQsIAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlyY29tbV9pbmZvICppbmZvKSAKK3sKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIElSQ09NTV9DT05ORUNUX1JFU1BPTlNFOgorCQlpcmNvbW1fbmV4dF9zdGF0ZShzZWxmLCBJUkNPTU1fQ09OTik7CisJCXJldCA9IHNlbGYtPmlzc3VlLmNvbm5lY3RfcmVzcG9uc2Uoc2VsZiwgc2tiKTsKKwkJYnJlYWs7CisJY2FzZSBJUkNPTU1fRElTQ09OTkVDVF9SRVFVRVNUOgorCQlpcmNvbW1fbmV4dF9zdGF0ZShzZWxmLCBJUkNPTU1fSURMRSk7CisJCXJldCA9IHNlbGYtPmlzc3VlLmRpc2Nvbm5lY3RfcmVxdWVzdChzZWxmLCBza2IsIGluZm8pOworCQlicmVhazsKKwljYXNlIElSQ09NTV9UVFBfRElTQ09OTkVDVF9JTkRJQ0FUSU9OOgorCWNhc2UgSVJDT01NX0xNUF9ESVNDT05ORUNUX0lORElDQVRJT046CisJCWlyY29tbV9uZXh0X3N0YXRlKHNlbGYsIElSQ09NTV9JRExFKTsKKwkJaXJjb21tX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzZWxmLCBza2IsIGluZm8pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDAsICIlcygpLCB1bmtub3duIGV2ZW50ID0gJXNcbiIsIF9fRlVOQ1RJT05fXyAsCisJCQkgICBpcmNvbW1fZXZlbnRbZXZlbnRdKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9zdGF0ZV9jb25uIChzZWxmLCBldmVudCwgc2tiKQorICoKKyAqICAgIElyQ09NTSBpcyBjb25uZWN0ZWQgdG8gdGhlIHBlZXIgSXJDT01NIGRldmljZQorICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fc3RhdGVfY29ubihzdHJ1Y3QgaXJjb21tX2NiICpzZWxmLCBJUkNPTU1fRVZFTlQgZXZlbnQsIAorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJjb21tX2luZm8gKmluZm8pCit7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJUkNPTU1fREFUQV9SRVFVRVNUOgorCQlyZXQgPSBzZWxmLT5pc3N1ZS5kYXRhX3JlcXVlc3Qoc2VsZiwgc2tiLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBJUkNPTU1fVFRQX0RBVEFfSU5ESUNBVElPTjoKKwkJaXJjb21tX3Byb2Nlc3NfZGF0YShzZWxmLCBza2IpOworCQlicmVhazsKKwljYXNlIElSQ09NTV9MTVBfREFUQV9JTkRJQ0FUSU9OOgorCQlpcmNvbW1fZGF0YV9pbmRpY2F0aW9uKHNlbGYsIHNrYik7CisJCWJyZWFrOworCWNhc2UgSVJDT01NX0NPTlRST0xfUkVRVUVTVDoKKwkJLyogSnVzdCBzZW5kIGEgc2VwYXJhdGUgZnJhbWUgZm9yIG5vdyAqLworCQlyZXQgPSBzZWxmLT5pc3N1ZS5kYXRhX3JlcXVlc3Qoc2VsZiwgc2tiLCBza2ItPmxlbik7CisJCWJyZWFrOworCWNhc2UgSVJDT01NX1RUUF9ESVNDT05ORUNUX0lORElDQVRJT046CisJY2FzZSBJUkNPTU1fTE1QX0RJU0NPTk5FQ1RfSU5ESUNBVElPTjoKKwkJaXJjb21tX25leHRfc3RhdGUoc2VsZiwgSVJDT01NX0lETEUpOworCQlpcmNvbW1fZGlzY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIHNrYiwgaW5mbyk7CisJCWJyZWFrOworCWNhc2UgSVJDT01NX0RJU0NPTk5FQ1RfUkVRVUVTVDoKKwkJaXJjb21tX25leHRfc3RhdGUoc2VsZiwgSVJDT01NX0lETEUpOworCQlyZXQgPSBzZWxmLT5pc3N1ZS5kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZiwgc2tiLCBpbmZvKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5rbm93biBldmVudCA9ICVzXG4iLCBfX0ZVTkNUSU9OX18gLAorCQkJICAgaXJjb21tX2V2ZW50W2V2ZW50XSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fZG9fZXZlbnQgKHNlbGYsIGV2ZW50LCBza2IpCisgKgorICogICAgUHJvY2VzcyBldmVudAorICoKKyAqLworaW50IGlyY29tbV9kb19ldmVudChzdHJ1Y3QgaXJjb21tX2NiICpzZWxmLCBJUkNPTU1fRVZFTlQgZXZlbnQsCisJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJjb21tX2luZm8gKmluZm8pIAoreworCUlSREFfREVCVUcoNCwgIiVzOiBzdGF0ZT0lcywgZXZlbnQ9JXNcbiIsIF9fRlVOQ1RJT05fXyAsCisJCSAgIGlyY29tbV9zdGF0ZVtzZWxmLT5zdGF0ZV0sIGlyY29tbV9ldmVudFtldmVudF0pOworCisJcmV0dXJuICgqc3RhdGVbc2VsZi0+c3RhdGVdKShzZWxmLCBldmVudCwgc2tiLCBpbmZvKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9uZXh0X3N0YXRlIChzZWxmLCBzdGF0ZSkKKyAqCisgKiAgICBTd2l0Y2ggc3RhdGUKKyAqCisgKi8KK3ZvaWQgaXJjb21tX25leHRfc3RhdGUoc3RydWN0IGlyY29tbV9jYiAqc2VsZiwgSVJDT01NX1NUQVRFIHN0YXRlKQoreworCXNlbGYtPnN0YXRlID0gc3RhdGU7CisJCisJSVJEQV9ERUJVRyg0LCAiJXM6IG5leHQgc3RhdGU9JXMsIHNlcnZpY2UgdHlwZT0lZFxuIiwgX19GVU5DVElPTl9fICwgCisJCSAgIGlyY29tbV9zdGF0ZVtzZWxmLT5zdGF0ZV0sIHNlbGYtPnNlcnZpY2VfdHlwZSk7Cit9CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX2xtcC5jIGIvbmV0L2lyZGEvaXJjb21tL2lyY29tbV9sbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTA5NzIwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJjb21tL2lyY29tbV9sbXAuYwpAQCAtMCwwICsxLDM3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBpcmNvbW1fbG1wLmMKKyAqIFZlcnNpb246ICAgICAgIDEuMAorICogRGVzY3JpcHRpb246ICAgSW50ZXJmYWNlIGJldHdlZW4gSXJDT01NIGFuZCBJckxNUAorICogU3RhdHVzOiAgICAgICAgU3RhYmxlCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBTdW4gSnVuICA2IDIwOjQ4OjI3IDE5OTkKKyAqIE1vZGlmaWVkIGF0OiAgIFN1biBEZWMgMTIgMTM6NDQ6MTcgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogU291cmNlczogICAgICAgUHJldmlvdXMgSXJMUFQgd29yayBieSBUaG9tYXMgRGF2aXMKKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OSBEYWcgQnJhdHRsaSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CisgKiAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIAorICogICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICogICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4JLyogc3RydWN0IGlyZGFfc2tiX2NiICovCisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmNvbW1fZXZlbnQuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmNvbW1fbG1wLmg+CisKKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9sbXBfY29ubmVjdF9yZXF1ZXN0IChzZWxmLCB1c2VyZGF0YSkKKyAqCisgKiAgICAKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJjb21tX2xtcF9jb25uZWN0X3JlcXVlc3Qoc3RydWN0IGlyY29tbV9jYiAqc2VsZiwgCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnVzZXJkYXRhLCAKKwkJCQkgICAgICBzdHJ1Y3QgaXJjb21tX2luZm8gKmluZm8pCit7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCS8qIERvbid0IGZvcmdldCB0byByZWZjb3VudCBpdCAtIHNob3VsZCBiZSBOVUxMIGFueXdheSAqLworCWlmKHVzZXJkYXRhKQorCQlza2JfZ2V0KHVzZXJkYXRhKTsKKworCXJldCA9IGlybG1wX2Nvbm5lY3RfcmVxdWVzdChzZWxmLT5sc2FwLCBpbmZvLT5kbHNhcF9zZWwsCisJCQkJICAgIGluZm8tPnNhZGRyLCBpbmZvLT5kYWRkciwgTlVMTCwgdXNlcmRhdGEpOyAKKwlyZXR1cm4gcmV0OworfQkKKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9sbXBfY29ubmVjdF9yZXNwb25zZSAoc2VsZiwgc2tiKQorICoKKyAqICAgIAorICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fbG1wX2Nvbm5lY3RfcmVzcG9uc2Uoc3RydWN0IGlyY29tbV9jYiAqc2VsZiwKKwkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnVzZXJkYXRhKQoreworCXN0cnVjdCBza19idWZmICp0eF9za2I7CisJaW50IHJldDsKKworCUlSREFfREVCVUcoMCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCQorCS8qIEFueSB1c2VyZGF0YSBzdXBwbGllZD8gKi8KKwlpZiAodXNlcmRhdGEgPT0gTlVMTCkgeworCQl0eF9za2IgPSBkZXZfYWxsb2Nfc2tiKDY0KTsKKwkJaWYgKCF0eF9za2IpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQkvKiBSZXNlcnZlIHNwYWNlIGZvciBNVVggYW5kIExBUCBoZWFkZXIgKi8KKwkJc2tiX3Jlc2VydmUodHhfc2tiLCBMTVBfTUFYX0hFQURFUik7CisJfSBlbHNlIHsKKwkJLyogIAorCQkgKiAgQ2hlY2sgdGhhdCB0aGUgY2xpZW50IGhhcyByZXNlcnZlZCBlbm91Z2ggc3BhY2UgZm9yIAorCQkgKiAgaGVhZGVycworCQkgKi8KKwkJSVJEQV9BU1NFUlQoc2tiX2hlYWRyb29tKHVzZXJkYXRhKSA+PSBMTVBfTUFYX0hFQURFUiwKKwkJCSAgICByZXR1cm4gLTE7KTsKKworCQkvKiBEb24ndCBmb3JnZXQgdG8gcmVmY291bnQgaXQgLSBzaG91bGQgYmUgTlVMTCBhbnl3YXkgKi8KKwkJc2tiX2dldCh1c2VyZGF0YSk7CisJCXR4X3NrYiA9IHVzZXJkYXRhOworCX0KKworCXJldCA9IGlybG1wX2Nvbm5lY3RfcmVzcG9uc2Uoc2VsZi0+bHNhcCwgdHhfc2tiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlyY29tbV9sbXBfZGlzY29ubmVjdF9yZXF1ZXN0KHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYsIAorCQkJCQkgc3RydWN0IHNrX2J1ZmYgKnVzZXJkYXRhLCAKKwkJCQkJIHN0cnVjdCBpcmNvbW1faW5mbyAqaW5mbykKK3sKKyAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKKwlpbnQgcmV0OworCisJSVJEQV9ERUJVRygwLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKyAgICAgICAgaWYgKCF1c2VyZGF0YSkgeworCQl0eF9za2IgPSBkZXZfYWxsb2Nfc2tiKDY0KTsKKwkJaWYgKCF0eF9za2IpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJCisJCS8qICBSZXNlcnZlIHNwYWNlIGZvciBNVVggYW5kIExBUCBoZWFkZXIgKi8KKwkJc2tiX3Jlc2VydmUodHhfc2tiLCBMTVBfTUFYX0hFQURFUik7CQkKKwkJdXNlcmRhdGEgPSB0eF9za2I7CisJfSBlbHNlIHsKKwkJLyogRG9uJ3QgZm9yZ2V0IHRvIHJlZmNvdW50IGl0IC0gc2hvdWxkIGJlIE5VTEwgYW55d2F5ICovCisJCXNrYl9nZXQodXNlcmRhdGEpOworCX0KKworCXJldCA9IGlybG1wX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmLT5sc2FwLCB1c2VyZGF0YSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX2xtcF9mbG93X2NvbnRyb2wgKHNrYikKKyAqCisgKiAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgZGF0YSBmcmFtZSB3ZSBoYXZlIHNlbnQgdG8gSXJMQVAgaGFzCisgKiAgICBiZWVuIGRlYWxsb2NhdGVkLiBXZSBkbyB0aGlzIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBmbG9vZCBJckxBUCB3aXRoIAorICogICAgZnJhbWVzLCBzaW5jZSB3ZSBhcmUgbm90IHVzaW5nIHRoZSBJclRUUCBmbG93IGNvbnRyb2wgbWVjaGFuaXNtCisgKi8KK3N0YXRpYyB2b2lkIGlyY29tbV9sbXBfZmxvd19jb250cm9sKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlyZGFfc2tiX2NiICpjYjsKKwlzdHJ1Y3QgaXJjb21tX2NiICpzZWxmOworCWludCBsaW5lOworCisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOworCisJY2IgPSAoc3RydWN0IGlyZGFfc2tiX2NiICopIHNrYi0+Y2I7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKyAKKyAgICAgICAgbGluZSA9IGNiLT5saW5lOworCisJc2VsZiA9IChzdHJ1Y3QgaXJjb21tX2NiICopIGhhc2hiaW5fbG9ja19maW5kKGlyY29tbSwgbGluZSwgTlVMTCk7CisgICAgICAgIGlmICghc2VsZikgeworCQlJUkRBX0RFQlVHKDIsICIlcygpLCBkaWRuJ3QgZmluZCBteXNlbGZcbiIsIF9fRlVOQ1RJT05fXyApOworICAgICAgICAgICAgICAgIHJldHVybjsKKwl9CisKKyAgICAgICAgSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fTUFHSUMsIHJldHVybjspOworCisJc2VsZi0+cGt0X2NvdW50LS07CisKKyAgICAgICAgaWYgKChzZWxmLT5wa3RfY291bnQgPCAyKSAmJiAoc2VsZi0+Zmxvd19zdGF0dXMgPT0gRkxPV19TVE9QKSkgeworICAgICAgICAgICAgICAgIElSREFfREVCVUcoMiwgIiVzKCksIGFza2luZyBUVFkgdG8gc3RhcnQgYWdhaW4hXG4iLCBfX0ZVTkNUSU9OX18gKTsKKyAgICAgICAgICAgICAgICBzZWxmLT5mbG93X3N0YXR1cyA9IEZMT1dfU1RBUlQ7CisgICAgICAgICAgICAgICAgaWYgKHNlbGYtPm5vdGlmeS5mbG93X2luZGljYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5ub3RpZnkuZmxvd19pbmRpY2F0aW9uKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSwgCisJCQkJCQkgICAgIHNlbGYsIEZMT1dfU1RBUlQpOworICAgICAgICB9Cit9CisgICAgCisvKgorICogRnVuY3Rpb24gaXJjb21tX2xtcF9kYXRhX3JlcXVlc3QgKHNlbGYsIHVzZXJkYXRhKQorICoKKyAqICAgIFNlbmQgZGF0YSBmcmFtZSB0byBwZWVyIGRldmljZQorICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fbG1wX2RhdGFfcmVxdWVzdChzdHJ1Y3QgaXJjb21tX2NiICpzZWxmLAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsIAorCQkJCSAgIGludCBub3RfdXNlZCkKK3sKKwlzdHJ1Y3QgaXJkYV9za2JfY2IgKmNiOworCWludCByZXQ7CisKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwljYiA9IChzdHJ1Y3QgaXJkYV9za2JfY2IgKikgc2tiLT5jYjsKKwkKKyAgICAgICAgY2ItPmxpbmUgPSBzZWxmLT5saW5lOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgc2VuZGluZyBmcmFtZVxuIiwgX19GVU5DVElPTl9fICk7CisKKwkvKiBEb24ndCBmb3JnZXQgdG8gcmVmY291bnQgaXQgLSBzZWUgaXJjb21tX3R0eV9kb19zb2Z0aW50KCkgKi8KKwlza2JfZ2V0KHNrYik7CisKKwlza2ItPmRlc3RydWN0b3IgPSBpcmNvbW1fbG1wX2Zsb3dfY29udHJvbDsKKworICAgICAgICBpZiAoKHNlbGYtPnBrdF9jb3VudCsrID4gNykgJiYgKHNlbGYtPmZsb3dfc3RhdHVzID09IEZMT1dfU1RBUlQpKSB7CisJCUlSREFfREVCVUcoMiwgIiVzKCksIGFza2luZyBUVFkgdG8gc2xvdyBkb3duIVxuIiwgX19GVU5DVElPTl9fICk7CisJICAgICAgICBzZWxmLT5mbG93X3N0YXR1cyA9IEZMT1dfU1RPUDsKKyAgICAgICAgICAgICAgICBpZiAoc2VsZi0+bm90aWZ5LmZsb3dfaW5kaWNhdGlvbikKKyAgICAgICAgICAgICAJICAgICAgICBzZWxmLT5ub3RpZnkuZmxvd19pbmRpY2F0aW9uKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSwgCisJCQkJICAgICAgICAgICAgICAgICAgICAgc2VsZiwgRkxPV19TVE9QKTsKKyAgICAgICAgfQorCXJldCA9IGlybG1wX2RhdGFfcmVxdWVzdChzZWxmLT5sc2FwLCBza2IpOworCWlmIChyZXQpIHsKKwkJSVJEQV9FUlJPUigiJXMoKSwgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQkvKiBpcmxtcF9kYXRhX3JlcXVlc3QgYWxyZWFkeSBmcmVlIHRoZSBwYWNrZXQgKi8KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX2xtcF9kYXRhX2luZGljYXRpb24gKGluc3RhbmNlLCBzYXAsIHNrYikKKyAqCisgKiAgICBJbmNvbWluZyBkYXRhIHdoaWNoIHdlIG11c3QgZGVsaXZlciB0byB0aGUgc3RhdGUgbWFjaGluZSwgdG8gY2hlY2sKKyAqICAgIHdlIGFyZSBzdGlsbCBjb25uZWN0ZWQuCisgKi8KK3N0YXRpYyBpbnQgaXJjb21tX2xtcF9kYXRhX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcmNvbW1fY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV9jYiAqKSBpbnN0YW5jZTsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX01BR0lDLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJCisJaXJjb21tX2RvX2V2ZW50KHNlbGYsIElSQ09NTV9MTVBfREFUQV9JTkRJQ0FUSU9OLCBza2IsIE5VTEwpOworCisJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgaXJjb21tX3R0eV9kYXRhX2luZGljYXRpb24oKS4gKi8KKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9sbXBfY29ubmVjdF9jb25maXJtIChpbnN0YW5jZSwgc2FwLCBxb3MsIG1heF9zZHVfc2l6ZSwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9oZWFkZXJfc2l6ZSwgc2tiKQorICoKKyAqICAgIENvbm5lY3Rpb24gaGFzIGJlZW4gY29uZmlybWVkIGJ5IHBlZXIgZGV2aWNlCisgKgorICovCitzdGF0aWMgdm9pZCBpcmNvbW1fbG1wX2Nvbm5lY3RfY29uZmlybSh2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAorCQkJCSAgICAgICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywgCisJCQkJICAgICAgIF9fdTMyIG1heF9zZWdfc2l6ZSwgCisJCQkJICAgICAgIF9fdTggbWF4X2hlYWRlcl9zaXplLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcmNvbW1fY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV9jYiAqKSBpbnN0YW5jZTsKKwlzdHJ1Y3QgaXJjb21tX2luZm8gaW5mbzsKKworCUlSREFfREVCVUcoMCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChxb3MgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlpbmZvLm1heF9kYXRhX3NpemUgPSBtYXhfc2VnX3NpemU7CisJaW5mby5tYXhfaGVhZGVyX3NpemUgPSBtYXhfaGVhZGVyX3NpemU7CisJaW5mby5xb3MgPSBxb3M7CisKKwlpcmNvbW1fZG9fZXZlbnQoc2VsZiwgSVJDT01NX0xNUF9DT05ORUNUX0NPTkZJUk0sIHNrYiwgJmluZm8pOworCisJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgaXJjb21tX3R0eV9jb25uZWN0X2NvbmZpcm0oKS4gKi8KKwlkZXZfa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fbG1wX2Nvbm5lY3RfaW5kaWNhdGlvbiAoaW5zdGFuY2UsIHNhcCwgcW9zLCBtYXhfc2R1X3NpemUsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2hlYWRlcl9zaXplLCBza2IpCisgKgorICogICAgUGVlciBkZXZpY2Ugd2FudHMgdG8gbWFrZSBhIGNvbm5lY3Rpb24gd2l0aCB1cworICoKKyAqLworc3RhdGljIHZvaWQgaXJjb21tX2xtcF9jb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKKwkJCQkJICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywKKwkJCQkJICBfX3UzMiBtYXhfc2VnX3NpemUsCisJCQkJCSAgX191OCBtYXhfaGVhZGVyX3NpemUsCisJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXJjb21tX2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fY2IgKilpbnN0YW5jZTsKKwlzdHJ1Y3QgaXJjb21tX2luZm8gaW5mbzsKKworCUlSREFfREVCVUcoMCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChxb3MgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlpbmZvLm1heF9kYXRhX3NpemUgPSBtYXhfc2VnX3NpemU7CisJaW5mby5tYXhfaGVhZGVyX3NpemUgPSBtYXhfaGVhZGVyX3NpemU7CisJaW5mby5xb3MgPSBxb3M7CisKKwlpcmNvbW1fZG9fZXZlbnQoc2VsZiwgSVJDT01NX0xNUF9DT05ORUNUX0lORElDQVRJT04sIHNrYiwgJmluZm8pOworCisJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgaXJjb21tX3R0eV9jb25uZWN0X2luZGljYXRpb24oKS4gKi8KKwlkZXZfa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fbG1wX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbiAoaW5zdGFuY2UsIHNhcCwgcmVhc29uLCBza2IpCisgKgorICogICAgUGVlciBkZXZpY2UgaGFzIGNsb3NlZCB0aGUgY29ubmVjdGlvbiwgb3IgdGhlIGxpbmsgd2VudCBkb3duIGZvciBzb21lCisgKiAgICBvdGhlciByZWFzb24KKyAqLworc3RhdGljIHZvaWQgaXJjb21tX2xtcF9kaXNjb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgCisJCQkJCSAgICAgTE1fUkVBU09OIHJlYXNvbiwKKwkJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcmNvbW1fY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV9jYiAqKSBpbnN0YW5jZTsKKwlzdHJ1Y3QgaXJjb21tX2luZm8gaW5mbzsKKworCUlSREFfREVCVUcoMCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fTUFHSUMsIHJldHVybjspOworCisJaW5mby5yZWFzb24gPSByZWFzb247CisKKwlpcmNvbW1fZG9fZXZlbnQoc2VsZiwgSVJDT01NX0xNUF9ESVNDT05ORUNUX0lORElDQVRJT04sIHNrYiwgJmluZm8pOworCisJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgaXJjb21tX3R0eV9kaXNjb25uZWN0X2luZGljYXRpb24oKS4gKi8KKwlpZihza2IpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKK30KKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fb3Blbl9sc2FwIChzZWxmKQorICoKKyAqICAgIE9wZW4gTFNBUC4gVGhpcyBmdW5jdGlvbiB3aWxsIG9ubHkgYmUgdXNlZCB3aGVuIHVzaW5nICJyYXciIHNlcnZpY2VzCisgKgorICovCitpbnQgaXJjb21tX29wZW5fbHNhcChzdHJ1Y3QgaXJjb21tX2NiICpzZWxmKQoreworCW5vdGlmeV90IG5vdGlmeTsKKworCUlSREFfREVCVUcoMCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJLyogUmVnaXN0ZXIgY2FsbGJhY2tzICovCisJaXJkYV9ub3RpZnlfaW5pdCgmbm90aWZ5KTsKKwlub3RpZnkuZGF0YV9pbmRpY2F0aW9uICAgICAgID0gaXJjb21tX2xtcF9kYXRhX2luZGljYXRpb247CisJbm90aWZ5LmNvbm5lY3RfY29uZmlybSAgICAgICA9IGlyY29tbV9sbXBfY29ubmVjdF9jb25maXJtOworCW5vdGlmeS5jb25uZWN0X2luZGljYXRpb24gICAgPSBpcmNvbW1fbG1wX2Nvbm5lY3RfaW5kaWNhdGlvbjsKKwlub3RpZnkuZGlzY29ubmVjdF9pbmRpY2F0aW9uID0gaXJjb21tX2xtcF9kaXNjb25uZWN0X2luZGljYXRpb247CisJbm90aWZ5Lmluc3RhbmNlID0gc2VsZjsKKwlzdHJsY3B5KG5vdGlmeS5uYW1lLCAiSXJDT01NIiwgc2l6ZW9mKG5vdGlmeS5uYW1lKSk7CisKKwlzZWxmLT5sc2FwID0gaXJsbXBfb3Blbl9sc2FwKExTQVBfQU5ZLCAmbm90aWZ5LCAwKTsKKwlpZiAoIXNlbGYtPmxzYXApIHsKKwkJSVJEQV9ERUJVRygwLCIlc2ZhaWxlZCB0byBhbGxvY2F0ZSB0c2FwXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzZWxmLT5zbHNhcF9zZWwgPSBzZWxmLT5sc2FwLT5zbHNhcF9zZWw7CisKKwkvKgorCSAqICBJbml0aWFsaXplIHRoZSBjYWxsLXRhYmxlIGZvciBpc3N1aW5nIGNvbW1hbmRzCisJICovCisJc2VsZi0+aXNzdWUuZGF0YV9yZXF1ZXN0ICAgICAgID0gaXJjb21tX2xtcF9kYXRhX3JlcXVlc3Q7CisJc2VsZi0+aXNzdWUuY29ubmVjdF9yZXF1ZXN0ICAgID0gaXJjb21tX2xtcF9jb25uZWN0X3JlcXVlc3Q7CisJc2VsZi0+aXNzdWUuY29ubmVjdF9yZXNwb25zZSAgID0gaXJjb21tX2xtcF9jb25uZWN0X3Jlc3BvbnNlOworCXNlbGYtPmlzc3VlLmRpc2Nvbm5lY3RfcmVxdWVzdCA9IGlyY29tbV9sbXBfZGlzY29ubmVjdF9yZXF1ZXN0OworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX3BhcmFtLmMgYi9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX3BhcmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAwOWJhYgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lyY29tbS9pcmNvbW1fcGFyYW0uYwpAQCAtMCwwICsxLDUxMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBpcmNvbW1fcGFyYW0uYworICogVmVyc2lvbjogICAgICAgMS4wCisgKiBEZXNjcmlwdGlvbjogICBQYXJhbWV0ZXIgaGFuZGxpbmcgZm9yIHRoZSBJckNPTU0gcHJvdG9jb2wKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIE1vbiBKdW4gIDcgMTA6MjU6MTEgMTk5OQorICogTW9kaWZpZWQgYXQ6ICAgU3VuIEphbiAzMCAxNDozMjowMyAyMDAwCisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMCBEYWcgQnJhdHRsaSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCisgKiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgKiAgICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvcGFyYW1ldGVycy5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJjb21tX2NvcmUuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmNvbW1fdHR5X2F0dGFjaC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyY29tbV90dHkuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyY29tbV9wYXJhbS5oPgorCitzdGF0aWMgaW50IGlyY29tbV9wYXJhbV9zZXJ2aWNlX3R5cGUodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIAorCQkJCSAgICAgaW50IGdldCk7CitzdGF0aWMgaW50IGlyY29tbV9wYXJhbV9wb3J0X3R5cGUodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIAorCQkJCSAgaW50IGdldCk7CitzdGF0aWMgaW50IGlyY29tbV9wYXJhbV9wb3J0X25hbWUodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIAorCQkJCSAgaW50IGdldCk7CitzdGF0aWMgaW50IGlyY29tbV9wYXJhbV9zZXJ2aWNlX3R5cGUodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIAorCQkJCSAgICAgaW50IGdldCk7CitzdGF0aWMgaW50IGlyY29tbV9wYXJhbV9kYXRhX3JhdGUodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIAorCQkJCSAgaW50IGdldCk7CitzdGF0aWMgaW50IGlyY29tbV9wYXJhbV9kYXRhX2Zvcm1hdCh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJhbSwgCisJCQkJICAgIGludCBnZXQpOworc3RhdGljIGludCBpcmNvbW1fcGFyYW1fZmxvd19jb250cm9sKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCAKKwkJCQkgICAgIGludCBnZXQpOworc3RhdGljIGludCBpcmNvbW1fcGFyYW1feG9uX3hvZmYodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIGludCBnZXQpOworc3RhdGljIGludCBpcmNvbW1fcGFyYW1fZW5xX2Fjayh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJhbSwgaW50IGdldCk7CitzdGF0aWMgaW50IGlyY29tbV9wYXJhbV9saW5lX3N0YXR1cyh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJhbSwgCisJCQkJICAgIGludCBnZXQpOworc3RhdGljIGludCBpcmNvbW1fcGFyYW1fZHRlKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCBpbnQgZ2V0KTsKK3N0YXRpYyBpbnQgaXJjb21tX3BhcmFtX2RjZSh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJhbSwgaW50IGdldCk7CitzdGF0aWMgaW50IGlyY29tbV9wYXJhbV9wb2xsKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCBpbnQgZ2V0KTsKKworc3RhdGljIHBpX21pbm9yX2luZm9fdCBwaV9taW5vcl9jYWxsX3RhYmxlX2NvbW1vbltdID0geworCXsgaXJjb21tX3BhcmFtX3NlcnZpY2VfdHlwZSwgUFZfSU5UXzhfQklUUyB9LAorCXsgaXJjb21tX3BhcmFtX3BvcnRfdHlwZSwgICAgUFZfSU5UXzhfQklUUyB9LAorCXsgaXJjb21tX3BhcmFtX3BvcnRfbmFtZSwgICAgUFZfU1RSSU5HIH0KK307CitzdGF0aWMgcGlfbWlub3JfaW5mb190IHBpX21pbm9yX2NhbGxfdGFibGVfbm9uX3Jhd1tdID0geworCXsgaXJjb21tX3BhcmFtX2RhdGFfcmF0ZSwgICAgUFZfSU5UXzMyX0JJVFMgfCBQVl9CSUdfRU5ESUFOIH0sCisJeyBpcmNvbW1fcGFyYW1fZGF0YV9mb3JtYXQsICBQVl9JTlRfOF9CSVRTIH0sCisJeyBpcmNvbW1fcGFyYW1fZmxvd19jb250cm9sLCBQVl9JTlRfOF9CSVRTIH0sCisJeyBpcmNvbW1fcGFyYW1feG9uX3hvZmYsICAgICBQVl9JTlRfMTZfQklUUyB9LAorCXsgaXJjb21tX3BhcmFtX2VucV9hY2ssICAgICAgUFZfSU5UXzE2X0JJVFMgfSwKKwl7IGlyY29tbV9wYXJhbV9saW5lX3N0YXR1cywgIFBWX0lOVF84X0JJVFMgfQorfTsKK3N0YXRpYyBwaV9taW5vcl9pbmZvX3QgcGlfbWlub3JfY2FsbF90YWJsZV85X3dpcmVbXSA9IHsKKwl7IGlyY29tbV9wYXJhbV9kdGUsICAgICAgICAgIFBWX0lOVF84X0JJVFMgfSwKKwl7IGlyY29tbV9wYXJhbV9kY2UsICAgICAgICAgIFBWX0lOVF84X0JJVFMgfSwKKwl7IGlyY29tbV9wYXJhbV9wb2xsLCAgICAgICAgIFBWX05PX1ZBTFVFIH0sCit9OworCitzdGF0aWMgcGlfbWFqb3JfaW5mb190IHBpX21ham9yX2NhbGxfdGFibGVbXSA9IHsKKwl7IHBpX21pbm9yX2NhbGxfdGFibGVfY29tbW9uLCAgMyB9LAorCXsgcGlfbWlub3JfY2FsbF90YWJsZV9ub25fcmF3LCA2IH0sCisgCXsgcGlfbWlub3JfY2FsbF90YWJsZV85X3dpcmUsICAzIH0KKy8qIAl7IHBpX21pbm9yX2NhbGxfdGFibGVfY2VudHJvbmljcyB9ICAqLworfTsKKworcGlfcGFyYW1faW5mb190IGlyY29tbV9wYXJhbV9pbmZvID0geyBwaV9tYWpvcl9jYWxsX3RhYmxlLCAzLCAweDBmLCA0IH07CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fcGFyYW1fcmVxdWVzdCAoc2VsZiwgcGksIGZsdXNoKQorICoKKyAqICAgIFF1ZXVlIGEgcGFyYW1ldGVyIGZvciB0aGUgY29udHJvbCBjaGFubmVsCisgKgorICovCitpbnQgaXJjb21tX3BhcmFtX3JlcXVlc3Qoc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYsIF9fdTggcGksIGludCBmbHVzaCkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgY291bnQ7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwl0dHkgPSBzZWxmLT50dHk7CisJaWYgKCF0dHkpCisJCXJldHVybiAwOworCisJLyogTWFrZSBzdXJlIHdlIGRvbid0IHNlbmQgcGFyYW1ldGVycyBmb3IgcmF3IG1vZGUgKi8KKwlpZiAoc2VsZi0+c2VydmljZV90eXBlID09IElSQ09NTV8zX1dJUkVfUkFXKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCisJc2tiID0gc2VsZi0+Y3RybF9za2I7CQorCWlmICghc2tiKSB7CisJCXNrYiA9IGRldl9hbGxvY19za2IoMjU2KTsKKwkJaWYgKCFza2IpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQkKKwkJc2tiX3Jlc2VydmUoc2tiLCBzZWxmLT5tYXhfaGVhZGVyX3NpemUpOworCQlzZWxmLT5jdHJsX3NrYiA9IHNrYjsKKwl9CisJLyogCisJICogSW5zZXJ0aW5nIGlzIGEgbGl0dGxlIGJpdCB0cmlja3kgc2luY2Ugd2UgZG9uJ3Qga25vdyBob3cgbXVjaAorCSAqIHJvb20gd2Ugd2lsbCBuZWVkLiBCdXQgdGhpcyBzaG91bGQgaG9wZWZ1bGx5IHdvcmsgT0sgCisJICovCisJY291bnQgPSBpcmRhX3BhcmFtX2luc2VydChzZWxmLCBwaSwgc2tiLT50YWlsLCBza2JfdGFpbHJvb20oc2tiKSwKKwkJCQkgICZpcmNvbW1fcGFyYW1faW5mbyk7CisJaWYgKGNvdW50IDwgMCkgeworCQlJUkRBX1dBUk5JTkcoIiVzKCksIG5vIHJvb20gZm9yIHBhcmFtZXRlciFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtMTsKKwl9CisJc2tiX3B1dChza2IsIGNvdW50KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBza2ItPmxlbj0lZFxuIiwgX19GVU5DVElPTl9fICwgc2tiLT5sZW4pOworCisJaWYgKGZsdXNoKSB7CisJCS8qIGlyY29tbV90dHlfZG9fc29mdGludCB3aWxsIHRha2UgY2FyZSBvZiB0aGUgcmVzdCAqLworCQlzY2hlZHVsZV93b3JrKCZzZWxmLT50cXVldWUpOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9wYXJhbV9zZXJ2aWNlX3R5cGUgKHNlbGYsIGJ1ZiwgbGVuKQorICoKKyAqICAgIEhhbmRsZSBzZXJ2aWNlIHR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBib3RoIGJlIGNhbGxlZCBhZnRlciB0aGUgTE0tSUFTCisgKiAgICBxdWVyeSBhbmQgdGhlbiB0aGUgcmVtb3RlIGRldmljZSBzZW5kcyBpdHMgaW5pdGlhbCBwYXJhbWV0ZXJzCisgKgorICovCitzdGF0aWMgaW50IGlyY29tbV9wYXJhbV9zZXJ2aWNlX3R5cGUodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIAorCQkJCSAgICAgaW50IGdldCkKK3sKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSBpbnN0YW5jZTsKKwlfX3U4IHNlcnZpY2VfdHlwZSA9IChfX3U4KSBwYXJhbS0+cHYuaTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlpZiAoZ2V0KSB7CisJCXBhcmFtLT5wdi5pID0gc2VsZi0+c2V0dGluZ3Muc2VydmljZV90eXBlOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBGaW5kIGFsbCBjb21tb24gc2VydmljZSB0eXBlcyAqLworCXNlcnZpY2VfdHlwZSAmPSBzZWxmLT5zZXJ2aWNlX3R5cGU7CisJaWYgKCFzZXJ2aWNlX3R5cGUpIHsKKwkJSVJEQV9ERUJVRygyLCAKKwkJCSAgICIlcygpLCBObyBjb21tb24gc2VydmljZSB0eXBlIHRvIHVzZSFcbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gLTE7CisJfQorCUlSREFfREVCVUcoMCwgIiVzKCksIHNlcnZpY2VzIGluIGNvbW1vbj0lMDJ4XG4iLCBfX0ZVTkNUSU9OX18gLAorCQkgICBzZXJ2aWNlX3R5cGUpOworCisJLyoKKwkgKiBOb3cgY2hvb3NlIGEgcHJlZmVycmVkIHNlcnZpY2UgdHlwZSBvZiB0aG9zZSBhdmFpbGFibGUKKwkgKi8KKwlpZiAoc2VydmljZV90eXBlICYgSVJDT01NX0NFTlRST05JQ1MpCisJCXNlbGYtPnNldHRpbmdzLnNlcnZpY2VfdHlwZSA9IElSQ09NTV9DRU5UUk9OSUNTOworCWVsc2UgaWYgKHNlcnZpY2VfdHlwZSAmIElSQ09NTV85X1dJUkUpCisJCXNlbGYtPnNldHRpbmdzLnNlcnZpY2VfdHlwZSA9IElSQ09NTV85X1dJUkU7CisJZWxzZSBpZiAoc2VydmljZV90eXBlICYgSVJDT01NXzNfV0lSRSkKKwkJc2VsZi0+c2V0dGluZ3Muc2VydmljZV90eXBlID0gSVJDT01NXzNfV0lSRTsKKwllbHNlIGlmIChzZXJ2aWNlX3R5cGUgJiBJUkNPTU1fM19XSVJFX1JBVykKKwkJc2VsZi0+c2V0dGluZ3Muc2VydmljZV90eXBlID0gSVJDT01NXzNfV0lSRV9SQVc7CisKKwlJUkRBX0RFQlVHKDAsICIlcygpLCByZXN1bHRpbmcgc2VydmljZSB0eXBlPTB4JTAyeFxuIiwgX19GVU5DVElPTl9fICwgCisJCSAgIHNlbGYtPnNldHRpbmdzLnNlcnZpY2VfdHlwZSk7CisKKwkvKiAKKwkgKiBOb3cgdGhlIGxpbmUgaXMgcmVhZHkgZm9yIHNvbWUgY29tbXVuaWNhdGlvbi4gQ2hlY2sgaWYgd2UgYXJlIGEKKyAgICAgICAgICogc2VydmVyLCBhbmQgc2VuZCBvdmVyIHNvbWUgaW5pdGlhbCBwYXJhbWV0ZXJzLgorCSAqIENsaWVudCBkbyBpdCBpbiBpcmNvbW1fdHR5X3N0YXRlX3NldHVwKCkuCisJICogTm90ZSA6IHdlIG1heSBnZXQgY2FsbGVkIGZyb20gaXJjb21tX3R0eV9nZXR2YWx1ZV9jb25maXJtKCksCisJICogdGhlcmVmb3JlIGJlZm9yZSB3ZSBldmVuIGhhdmUgb3BlbiBhbnkgc29ja2V0LiBBbmQgc2VsZi0+Y2xpZW50CisJICogaXMgaW5pdGlhbGlzZWQgdG8gVFJVRSBvbmx5IGxhdGVyLiBTbywgd2UgY2hlY2sgaWYgdGhlIGxpbmsgaXMKKwkgKiByZWFsbHkgaW5pdGlhbGlzZWQuIC0gSmVhbiBJSQorCSAqLworCWlmICgoc2VsZi0+bWF4X2hlYWRlcl9zaXplICE9IElSQ09NTV9UVFlfSERSX1VOSU5JVElBTElTRUQpICYmCisJICAgICghc2VsZi0+Y2xpZW50KSAmJgorCSAgICAoc2VsZi0+c2V0dGluZ3Muc2VydmljZV90eXBlICE9IElSQ09NTV8zX1dJUkVfUkFXKSkKKwl7CisJCS8qIEluaXQgY29ubmVjdGlvbiAqLworCQlpcmNvbW1fdHR5X3NlbmRfaW5pdGlhbF9wYXJhbWV0ZXJzKHNlbGYpOworCQlpcmNvbW1fdHR5X2xpbmtfZXN0YWJsaXNoZWQoc2VsZik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fcGFyYW1fcG9ydF90eXBlIChzZWxmLCBwYXJhbSkKKyAqCisgKiAgICBUaGUgcG9ydCB0eXBlIHBhcmFtZXRlciB0ZWxscyBpZiB0aGUgZGV2aWNlcyBhcmUgc2VyaWFsIG9yIHBhcmFsbGVsLgorICogICAgU2luY2Ugd2Ugb25seSBhZHZlcnRpc2Ugc2VyaWFsIHNlcnZpY2UsIHRoaXMgcGFyYW1ldGVyIHNob3VsZCBvbmx5CisgKiAgICBiZSBlcXVhbCB0byBJUkNPTU1fU0VSSUFMLgorICovCitzdGF0aWMgaW50IGlyY29tbV9wYXJhbV9wb3J0X3R5cGUodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIGludCBnZXQpCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgaW5zdGFuY2U7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybiAtMTspOworCQorCWlmIChnZXQpCisJCXBhcmFtLT5wdi5pID0gSVJDT01NX1NFUklBTDsKKwllbHNlIHsKKwkJc2VsZi0+c2V0dGluZ3MucG9ydF90eXBlID0gKF9fdTgpIHBhcmFtLT5wdi5pOworCisJCUlSREFfREVCVUcoMCwgIiVzKCksIHBvcnQgdHlwZT0lZFxuIiwgX19GVU5DVElPTl9fICwgCisJCQkgICBzZWxmLT5zZXR0aW5ncy5wb3J0X3R5cGUpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9wYXJhbV9wb3J0X25hbWUgKHNlbGYsIHBhcmFtKQorICoKKyAqICAgIEV4Y2hhbmdlIHBvcnQgbmFtZQorICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fcGFyYW1fcG9ydF9uYW1lKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCBpbnQgZ2V0KQoreworCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIGluc3RhbmNlOworCQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlpZiAoZ2V0KSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIG5vdCBpbXAhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwl9IGVsc2UgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBwb3J0LW5hbWU9JXNcbiIsIF9fRlVOQ1RJT05fXyAsIHBhcmFtLT5wdi5jKTsKKwkJc3RybmNweShzZWxmLT5zZXR0aW5ncy5wb3J0X25hbWUsIHBhcmFtLT5wdi5jLCAzMik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fcGFyYW1fZGF0YV9yYXRlIChzZWxmLCBwYXJhbSkKKyAqCisgKiAgICBFeGNoYW5nZSBkYXRhIHJhdGUgdG8gYmUgdXNlZCBpbiB0aGlzIHNldHRpbmdzCisgKgorICovCitzdGF0aWMgaW50IGlyY29tbV9wYXJhbV9kYXRhX3JhdGUodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIGludCBnZXQpCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgaW5zdGFuY2U7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm4gLTE7KTsKKworCWlmIChnZXQpCisJCXBhcmFtLT5wdi5pID0gc2VsZi0+c2V0dGluZ3MuZGF0YV9yYXRlOworCWVsc2UKKwkJc2VsZi0+c2V0dGluZ3MuZGF0YV9yYXRlID0gcGFyYW0tPnB2Lmk7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgZGF0YSByYXRlID0gJWRcbiIsIF9fRlVOQ1RJT05fXyAsIHBhcmFtLT5wdi5pKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3BhcmFtX2RhdGFfZm9ybWF0IChzZWxmLCBwYXJhbSkKKyAqCisgKiAgICBFeGNoYW5nZSBkYXRhIGZvcm1hdCB0byBiZSB1c2VkIGluIHRoaXMgc2V0dGluZ3MKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJjb21tX3BhcmFtX2RhdGFfZm9ybWF0KHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCAKKwkJCQkgICAgaW50IGdldCkKK3sKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSBpbnN0YW5jZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlpZiAoZ2V0KQorCQlwYXJhbS0+cHYuaSA9IHNlbGYtPnNldHRpbmdzLmRhdGFfZm9ybWF0OworCWVsc2UKKwkJc2VsZi0+c2V0dGluZ3MuZGF0YV9mb3JtYXQgPSAoX191OCkgcGFyYW0tPnB2Lmk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fcGFyYW1fZmxvd19jb250cm9sIChzZWxmLCBwYXJhbSkKKyAqCisgKiAgICBFeGNoYW5nZSBmbG93IGNvbnRyb2wgc2V0dGluZ3MgdG8gYmUgdXNlZCBpbiB0aGlzIHNldHRpbmdzCisgKgorICovCitzdGF0aWMgaW50IGlyY29tbV9wYXJhbV9mbG93X2NvbnRyb2wodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIAorCQkJCSAgICAgaW50IGdldCkKK3sKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSBpbnN0YW5jZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuIC0xOyk7CisJCisJaWYgKGdldCkKKwkJcGFyYW0tPnB2LmkgPSBzZWxmLT5zZXR0aW5ncy5mbG93X2NvbnRyb2w7CisJZWxzZQorCQlzZWxmLT5zZXR0aW5ncy5mbG93X2NvbnRyb2wgPSAoX191OCkgcGFyYW0tPnB2Lmk7CisKKwlJUkRBX0RFQlVHKDEsICIlcygpLCBmbG93IGNvbnRyb2wgPSAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXyAsIChfX3U4KSBwYXJhbS0+cHYuaSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9wYXJhbV94b25feG9mZiAoc2VsZiwgcGFyYW0pCisgKgorICogICAgRXhjaGFuZ2UgWE9OL1hPRkYgY2hhcmFjdGVycworICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fcGFyYW1feG9uX3hvZmYodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIGludCBnZXQpCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgaW5zdGFuY2U7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybiAtMTspOworCQorCWlmIChnZXQpIHsKKwkJcGFyYW0tPnB2LmkgPSBzZWxmLT5zZXR0aW5ncy54b254b2ZmWzBdOworCQlwYXJhbS0+cHYuaSB8PSBzZWxmLT5zZXR0aW5ncy54b254b2ZmWzFdIDw8IDg7CisJfSBlbHNlIHsKKwkJc2VsZi0+c2V0dGluZ3MueG9ueG9mZlswXSA9IChfX3UxNikgcGFyYW0tPnB2LmkgJiAweGZmOworCQlzZWxmLT5zZXR0aW5ncy54b254b2ZmWzFdID0gKF9fdTE2KSBwYXJhbS0+cHYuaSA+PiA4OworCX0KKworCUlSREFfREVCVUcoMCwgIiVzKCksIFhPTi9YT0ZGID0gMHglMDJ4LDB4JTAyeFxuIiwgX19GVU5DVElPTl9fICwgCisJCSAgIHBhcmFtLT5wdi5pICYgMHhmZiwgcGFyYW0tPnB2LmkgPj4gOCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9wYXJhbV9lbnFfYWNrIChzZWxmLCBwYXJhbSkKKyAqCisgKiAgICBFeGNoYW5nZSBFTlEvQUNLIGNoYXJhY3RlcnMKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJjb21tX3BhcmFtX2VucV9hY2sodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIGludCBnZXQpCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgaW5zdGFuY2U7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybiAtMTspOworCQorCWlmIChnZXQpIHsKKwkJcGFyYW0tPnB2LmkgPSBzZWxmLT5zZXR0aW5ncy5lbnFhY2tbMF07CisJCXBhcmFtLT5wdi5pIHw9IHNlbGYtPnNldHRpbmdzLmVucWFja1sxXSA8PCA4OworCX0gZWxzZSB7CisJCXNlbGYtPnNldHRpbmdzLmVucWFja1swXSA9IChfX3UxNikgcGFyYW0tPnB2LmkgJiAweGZmOworCQlzZWxmLT5zZXR0aW5ncy5lbnFhY2tbMV0gPSAoX191MTYpIHBhcmFtLT5wdi5pID4+IDg7CisJfQorCisJSVJEQV9ERUJVRygwLCAiJXMoKSwgRU5RL0FDSyA9IDB4JTAyeCwweCUwMnhcbiIsIF9fRlVOQ1RJT05fXyAsCisJCSAgIHBhcmFtLT5wdi5pICYgMHhmZiwgcGFyYW0tPnB2LmkgPj4gOCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9wYXJhbV9saW5lX3N0YXR1cyAoc2VsZiwgcGFyYW0pCisgKgorICogICAgCisgKgorICovCitzdGF0aWMgaW50IGlyY29tbV9wYXJhbV9saW5lX3N0YXR1cyh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJhbSwgCisJCQkJICAgIGludCBnZXQpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKSwgbm90IGltcGwuXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3BhcmFtX2R0ZSAoaW5zdGFuY2UsIHBhcmFtKQorICoKKyAqICAgIElmIHdlIGdldCBoZXJlLCB0aGVyZSBtdXN0IGJlIHNvbWUgc29ydCBvZiBudWxsLW1vZGVtIGNvbm5lY3Rpb24sIGFuZAorICogICAgd2UgYXJlIHByb2JhYmx5IHdvcmtpbmcgaW4gc2VydmVyIG1vZGUgYXMgd2VsbC4KKyAqLworc3RhdGljIGludCBpcmNvbW1fcGFyYW1fZHRlKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCBpbnQgZ2V0KQoreworCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIGluc3RhbmNlOworCV9fdTggZHRlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm4gLTE7KTsKKworCWlmIChnZXQpCisJCXBhcmFtLT5wdi5pID0gc2VsZi0+c2V0dGluZ3MuZHRlOworCWVsc2UgeworCQlkdGUgPSAoX191OCkgcGFyYW0tPnB2Lmk7CisKKwkJc2VsZi0+c2V0dGluZ3MuZGNlID0gMDsKKwkJCQkKKwkJaWYgKGR0ZSAmIElSQ09NTV9ERUxUQV9EVFIpCisJCQlzZWxmLT5zZXR0aW5ncy5kY2UgfD0gKElSQ09NTV9ERUxUQV9EU1J8CisJCQkJCSAgICAgIElSQ09NTV9ERUxUQV9SSSB8CisJCQkJCSAgICAgIElSQ09NTV9ERUxUQV9DRCk7CisJCWlmIChkdGUgJiBJUkNPTU1fRFRSKQorCQkJc2VsZi0+c2V0dGluZ3MuZGNlIHw9IChJUkNPTU1fRFNSfAorCQkJCQkgICAgICBJUkNPTU1fUkkgfAorCQkJCQkgICAgICBJUkNPTU1fQ0QpOworCQkKKwkJaWYgKGR0ZSAmIElSQ09NTV9ERUxUQV9SVFMpCisJCQlzZWxmLT5zZXR0aW5ncy5kY2UgfD0gSVJDT01NX0RFTFRBX0NUUzsKKwkJaWYgKGR0ZSAmIElSQ09NTV9SVFMpCisJCQlzZWxmLT5zZXR0aW5ncy5kY2UgfD0gSVJDT01NX0NUUzsKKworCQkvKiBUYWtlIGFwcHJvcHJpYXRlIGFjdGlvbnMgKi8KKwkJaXJjb21tX3R0eV9jaGVja19tb2RlbV9zdGF0dXMoc2VsZik7CisKKwkJLyogTnVsbCBtb2RlbSBjYWJsZSBlbXVsYXRvciAqLworCQlzZWxmLT5zZXR0aW5ncy5udWxsX21vZGVtID0gVFJVRTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9wYXJhbV9kY2UgKGluc3RhbmNlLCBwYXJhbSkKKyAqCisgKiAgICAKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJjb21tX3BhcmFtX2RjZSh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJhbSwgaW50IGdldCkKK3sKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSBpbnN0YW5jZTsKKwlfX3U4IGRjZTsKKworCUlSREFfREVCVUcoMSwgIiVzKCksIGRjZSA9IDB4JTAyeFxuIiwgX19GVU5DVElPTl9fICwgKF9fdTgpIHBhcmFtLT5wdi5pKTsKKworCWRjZSA9IChfX3U4KSBwYXJhbS0+cHYuaTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlzZWxmLT5zZXR0aW5ncy5kY2UgPSBkY2U7CisKKwkvKiBDaGVjayBpZiBhbnkgb2YgdGhlIHNldHRpbmdzIGhhdmUgY2hhbmdlZCAqLworCWlmIChkY2UgJiAweDBmKSB7CisJCWlmIChkY2UgJiBJUkNPTU1fREVMVEFfQ1RTKSB7CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBDVFMgXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJfQorCX0KKworCWlyY29tbV90dHlfY2hlY2tfbW9kZW1fc3RhdHVzKHNlbGYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fcGFyYW1fcG9sbCAoaW5zdGFuY2UsIHBhcmFtKQorICoKKyAqICAgIENhbGxlZCB3aGVuIHRoZSBwZWVyIGRldmljZSBpcyBwb2xsaW5nIGZvciB0aGUgbGluZSBzZXR0aW5ncworICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fcGFyYW1fcG9sbCh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJhbSwgaW50IGdldCkKK3sKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSBpbnN0YW5jZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwkvKiBQb2xsIHBhcmFtZXRlcnMgYXJlIGFsd2F5cyBvZiBsZW5naHQgMCAoanVzdCBhIHNpZ25hbCkgKi8KKwlpZiAoIWdldCkgeworCQkvKiBSZXNwb25kIHdpdGggRFRFIGxpbmUgc2V0dGluZ3MgKi8KKwkJaXJjb21tX3BhcmFtX3JlcXVlc3Qoc2VsZiwgSVJDT01NX0RURSwgVFJVRSk7CisJfQorCXJldHVybiAwOworfQorCisKKworCisKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lyY29tbS9pcmNvbW1fdHRwLmMgYi9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX3R0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OGJmMzUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX3R0cC5jCkBAIC0wLDAgKzEsMzY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGlyY29tbV90dHAuYworICogVmVyc2lvbjogICAgICAgMS4wCisgKiBEZXNjcmlwdGlvbjogICBJbnRlcmZhY2UgYmV0d2VlbiBJckNPTU0gYW5kIElyVFRQCisgKiBTdGF0dXM6ICAgICAgICBTdGFibGUKKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFN1biBKdW4gIDYgMjA6NDg6MjcgMTk5OQorICogTW9kaWZpZWQgYXQ6ICAgTW9uIERlYyAxMyAxMTozNToxMyAxOTk5CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgorICogICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAqICAgICBNQSAwMjExMS0xMzA3IFVTQQorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lydHRwLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmNvbW1fZXZlbnQuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmNvbW1fdHRwLmg+CisKK3N0YXRpYyBpbnQgaXJjb21tX3R0cF9kYXRhX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIGlyY29tbV90dHBfY29ubmVjdF9jb25maXJtKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJICAgICAgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLCAKKwkJCQkgICAgICAgX191MzIgbWF4X3NkdV9zaXplLCAKKwkJCQkgICAgICAgX191OCBtYXhfaGVhZGVyX3NpemUsCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgaXJjb21tX3R0cF9jb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKKwkJCQkJICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywKKwkJCQkJICBfX3UzMiBtYXhfc2R1X3NpemUsCisJCQkJCSAgX191OCBtYXhfaGVhZGVyX3NpemUsCisJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBpcmNvbW1fdHRwX2Zsb3dfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAorCQkJCSAgICAgICBMT0NBTF9GTE9XIGNtZCk7CitzdGF0aWMgdm9pZCBpcmNvbW1fdHRwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCAKKwkJCQkJICAgICBMTV9SRUFTT04gcmVhc29uLAorCQkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBpcmNvbW1fdHRwX2RhdGFfcmVxdWVzdChzdHJ1Y3QgaXJjb21tX2NiICpzZWxmLAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsIAorCQkJCSAgIGludCBjbGVuKTsKK3N0YXRpYyBpbnQgaXJjb21tX3R0cF9jb25uZWN0X3JlcXVlc3Qoc3RydWN0IGlyY29tbV9jYiAqc2VsZiwgCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnVzZXJkYXRhLCAKKwkJCQkgICAgICBzdHJ1Y3QgaXJjb21tX2luZm8gKmluZm8pOworc3RhdGljIGludCBpcmNvbW1fdHRwX2Nvbm5lY3RfcmVzcG9uc2Uoc3RydWN0IGlyY29tbV9jYiAqc2VsZiwKKwkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnVzZXJkYXRhKTsKK3N0YXRpYyBpbnQgaXJjb21tX3R0cF9kaXNjb25uZWN0X3JlcXVlc3Qoc3RydWN0IGlyY29tbV9jYiAqc2VsZiwgCisJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqdXNlcmRhdGEsIAorCQkJCQkgc3RydWN0IGlyY29tbV9pbmZvICppbmZvKTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9vcGVuX3RzYXAgKHNlbGYpCisgKgorICogICAgCisgKgorICovCitpbnQgaXJjb21tX29wZW5fdHNhcChzdHJ1Y3QgaXJjb21tX2NiICpzZWxmKQoreworCW5vdGlmeV90IG5vdGlmeTsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJLyogUmVnaXN0ZXIgY2FsbGJhY2tzICovCisJaXJkYV9ub3RpZnlfaW5pdCgmbm90aWZ5KTsKKwlub3RpZnkuZGF0YV9pbmRpY2F0aW9uICAgICAgID0gaXJjb21tX3R0cF9kYXRhX2luZGljYXRpb247CisJbm90aWZ5LmNvbm5lY3RfY29uZmlybSAgICAgICA9IGlyY29tbV90dHBfY29ubmVjdF9jb25maXJtOworCW5vdGlmeS5jb25uZWN0X2luZGljYXRpb24gICAgPSBpcmNvbW1fdHRwX2Nvbm5lY3RfaW5kaWNhdGlvbjsKKwlub3RpZnkuZmxvd19pbmRpY2F0aW9uICAgICAgID0gaXJjb21tX3R0cF9mbG93X2luZGljYXRpb247CisJbm90aWZ5LmRpc2Nvbm5lY3RfaW5kaWNhdGlvbiA9IGlyY29tbV90dHBfZGlzY29ubmVjdF9pbmRpY2F0aW9uOworCW5vdGlmeS5pbnN0YW5jZSA9IHNlbGY7CisJc3RybGNweShub3RpZnkubmFtZSwgIklyQ09NTSIsIHNpemVvZihub3RpZnkubmFtZSkpOworCisJc2VsZi0+dHNhcCA9IGlydHRwX29wZW5fdHNhcChMU0FQX0FOWSwgREVGQVVMVF9JTklUSUFMX0NSRURJVCwKKwkJCQkgICAgICZub3RpZnkpOworCWlmICghc2VsZi0+dHNhcCkgeworCQlJUkRBX0RFQlVHKDAsICIlc2ZhaWxlZCB0byBhbGxvY2F0ZSB0c2FwXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzZWxmLT5zbHNhcF9zZWwgPSBzZWxmLT50c2FwLT5zdHNhcF9zZWw7CisKKwkvKgorCSAqICBJbml0aWFsaXplIHRoZSBjYWxsLXRhYmxlIGZvciBpc3N1aW5nIGNvbW1hbmRzCisJICovCisJc2VsZi0+aXNzdWUuZGF0YV9yZXF1ZXN0ICAgICAgID0gaXJjb21tX3R0cF9kYXRhX3JlcXVlc3Q7CisJc2VsZi0+aXNzdWUuY29ubmVjdF9yZXF1ZXN0ICAgID0gaXJjb21tX3R0cF9jb25uZWN0X3JlcXVlc3Q7CisJc2VsZi0+aXNzdWUuY29ubmVjdF9yZXNwb25zZSAgID0gaXJjb21tX3R0cF9jb25uZWN0X3Jlc3BvbnNlOworCXNlbGYtPmlzc3VlLmRpc2Nvbm5lY3RfcmVxdWVzdCA9IGlyY29tbV90dHBfZGlzY29ubmVjdF9yZXF1ZXN0OworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHRwX2Nvbm5lY3RfcmVxdWVzdCAoc2VsZiwgdXNlcmRhdGEpCisgKgorICogICAgCisgKgorICovCitzdGF0aWMgaW50IGlyY29tbV90dHBfY29ubmVjdF9yZXF1ZXN0KHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYsIAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICp1c2VyZGF0YSwgCisJCQkJICAgICAgc3RydWN0IGlyY29tbV9pbmZvICppbmZvKQoreworCWludCByZXQgPSAwOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwkvKiBEb24ndCBmb3JnZXQgdG8gcmVmY291bnQgaXQgLSBzaG91bGQgYmUgTlVMTCBhbnl3YXkgKi8KKwlpZih1c2VyZGF0YSkKKwkJc2tiX2dldCh1c2VyZGF0YSk7CisKKwlyZXQgPSBpcnR0cF9jb25uZWN0X3JlcXVlc3Qoc2VsZi0+dHNhcCwgaW5mby0+ZGxzYXBfc2VsLAorCQkJCSAgICBpbmZvLT5zYWRkciwgaW5mby0+ZGFkZHIsIE5VTEwsIAorCQkJCSAgICBUVFBfU0FSX0RJU0FCTEUsIHVzZXJkYXRhKTsgCisKKwlyZXR1cm4gcmV0OworfQkKKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHBfY29ubmVjdF9yZXNwb25zZSAoc2VsZiwgc2tiKQorICoKKyAqICAgIAorICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fdHRwX2Nvbm5lY3RfcmVzcG9uc2Uoc3RydWN0IGlyY29tbV9jYiAqc2VsZiwKKwkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnVzZXJkYXRhKQoreworCWludCByZXQ7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwkvKiBEb24ndCBmb3JnZXQgdG8gcmVmY291bnQgaXQgLSBzaG91bGQgYmUgTlVMTCBhbnl3YXkgKi8KKwlpZih1c2VyZGF0YSkKKwkJc2tiX2dldCh1c2VyZGF0YSk7CisKKwlyZXQgPSBpcnR0cF9jb25uZWN0X3Jlc3BvbnNlKHNlbGYtPnRzYXAsIFRUUF9TQVJfRElTQUJMRSwgdXNlcmRhdGEpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHBfZGF0YV9yZXF1ZXN0IChzZWxmLCB1c2VyZGF0YSkKKyAqCisgKiAgICBTZW5kIElyQ09NTSBkYXRhIHRvIElyVFRQIGxheWVyLiBDdXJyZW50bHkgd2UgZG8gbm90IHRyeSB0byBjb21iaW5lIAorICogICAgY29udHJvbCBkYXRhIHdpdGggcHVyZSBkYXRhLCBzbyB0aGV5IHdpbGwgYmUgc2VudCBhcyBzZXBhcmF0ZSBmcmFtZXMuIAorICogICAgU2hvdWxkIG5vdCBiZSBhIGJpZyBwcm9ibGVtIHRob3VnaCwgc2luY2UgY29udHJvbCBmcmFtZXMgYXJlIHJhcmUuIEJ1dAorICogICAgc29tZSBvZiB0aGVtIGFyZSBzZW50IGFmdGVyIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudCwgc28gdGhpcyBjYW4gCisgKiAgICBpbmNyZWFzZSB0aGUgbGF0ZW5jeSBhIGJpdC4KKyAqLworc3RhdGljIGludCBpcmNvbW1fdHRwX2RhdGFfcmVxdWVzdChzdHJ1Y3QgaXJjb21tX2NiICpzZWxmLAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsIAorCQkJCSAgIGludCBjbGVuKQoreworCWludCByZXQ7CisKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBjbGVuPSVkXG4iLCBfX0ZVTkNUSU9OX18gLCBjbGVuKTsKKworCS8qIAorCSAqIEluc2VydCBjbGVuIGZpZWxkLCBjdXJyZW50bHkgd2UgZWl0aGVyIHNlbmQgZGF0YSBvbmx5LCBvciBjb250cm9sCisJICogb25seSBmcmFtZXMsIHRvIG1ha2UgdGhpbmdzIGVhc2llciBhbmQgYXZvaWQgcXVldWVpbmcKKwkgKi8KKwlJUkRBX0FTU0VSVChza2JfaGVhZHJvb20oc2tiKSA+PSBJUkNPTU1fSEVBREVSX1NJWkUsIHJldHVybiAtMTspOworCisJLyogRG9uJ3QgZm9yZ2V0IHRvIHJlZmNvdW50IGl0IC0gc2VlIGlyY29tbV90dHlfZG9fc29mdGludCgpICovCisJc2tiX2dldChza2IpOworCisJc2tiX3B1c2goc2tiLCBJUkNPTU1fSEVBREVSX1NJWkUpOworCisJc2tiLT5kYXRhWzBdID0gY2xlbjsKKworCXJldCA9IGlydHRwX2RhdGFfcmVxdWVzdChzZWxmLT50c2FwLCBza2IpOworCWlmIChyZXQpIHsKKwkJSVJEQV9FUlJPUigiJXMoKSwgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQkvKiBpcnR0cF9kYXRhX3JlcXVlc3QgYWxyZWFkeSBmcmVlIHRoZSBwYWNrZXQgKi8KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0cF9kYXRhX2luZGljYXRpb24gKGluc3RhbmNlLCBzYXAsIHNrYikKKyAqCisgKiAgICBJbmNvbWluZyBkYXRhCisgKgorICovCitzdGF0aWMgaW50IGlyY29tbV90dHBfZGF0YV9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXJjb21tX2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fY2IgKikgaW5zdGFuY2U7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9NQUdJQywgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybiAtMTspOworCisJaXJjb21tX2RvX2V2ZW50KHNlbGYsIElSQ09NTV9UVFBfREFUQV9JTkRJQ0FUSU9OLCBza2IsIE5VTEwpOworCisJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgaXJjb21tX3R0eV9kYXRhX2luZGljYXRpb24oKS4gKi8KKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXJjb21tX3R0cF9jb25uZWN0X2NvbmZpcm0odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKKwkJCQkgICAgICAgc3RydWN0IHFvc19pbmZvICpxb3MsIAorCQkJCSAgICAgICBfX3UzMiBtYXhfc2R1X3NpemUsIAorCQkJCSAgICAgICBfX3U4IG1heF9oZWFkZXJfc2l6ZSwKKwkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXJjb21tX2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fY2IgKikgaW5zdGFuY2U7CisJc3RydWN0IGlyY29tbV9pbmZvIGluZm87CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX01BR0lDLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQocW9zICE9IE5VTEwsIGdvdG8gb3V0Oyk7CisKKwlpZiAobWF4X3NkdV9zaXplICE9IFRUUF9TQVJfRElTQUJMRSkgeworCQlJUkRBX0VSUk9SKCIlcygpLCBTQVIgbm90IGFsbG93ZWQgZm9yIElyQ09NTSFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dDsKKwl9CisKKwlpbmZvLm1heF9kYXRhX3NpemUgPSBpcnR0cF9nZXRfbWF4X3NlZ19zaXplKHNlbGYtPnRzYXApCisJCS0gSVJDT01NX0hFQURFUl9TSVpFOworCWluZm8ubWF4X2hlYWRlcl9zaXplID0gbWF4X2hlYWRlcl9zaXplICsgSVJDT01NX0hFQURFUl9TSVpFOworCWluZm8ucW9zID0gcW9zOworCisJaXJjb21tX2RvX2V2ZW50KHNlbGYsIElSQ09NTV9UVFBfQ09OTkVDVF9DT05GSVJNLCBza2IsICZpbmZvKTsKKworb3V0OgorCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIGlyY29tbV90dHlfY29ubmVjdF9jb25maXJtKCkuICovCisJZGV2X2tmcmVlX3NrYihza2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0cF9jb25uZWN0X2luZGljYXRpb24gKGluc3RhbmNlLCBzYXAsIHFvcywgbWF4X3NkdV9zaXplLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9oZWFkZXJfc2l6ZSwgc2tiKQorICoKKyAqICAgIAorICoKKyAqLworc3RhdGljIHZvaWQgaXJjb21tX3R0cF9jb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKKwkJCQkJICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywKKwkJCQkJICBfX3UzMiBtYXhfc2R1X3NpemUsCisJCQkJCSAgX191OCBtYXhfaGVhZGVyX3NpemUsCisJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXJjb21tX2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fY2IgKilpbnN0YW5jZTsKKwlzdHJ1Y3QgaXJjb21tX2luZm8gaW5mbzsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChxb3MgIT0gTlVMTCwgZ290byBvdXQ7KTsKKworCWlmIChtYXhfc2R1X3NpemUgIT0gVFRQX1NBUl9ESVNBQkxFKSB7CisJCUlSREFfRVJST1IoIiVzKCksIFNBUiBub3QgYWxsb3dlZCBmb3IgSXJDT01NIVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0OworCX0KKworCWluZm8ubWF4X2RhdGFfc2l6ZSA9IGlydHRwX2dldF9tYXhfc2VnX3NpemUoc2VsZi0+dHNhcCkKKwkJLSBJUkNPTU1fSEVBREVSX1NJWkU7CisJaW5mby5tYXhfaGVhZGVyX3NpemUgPSBtYXhfaGVhZGVyX3NpemUgKyBJUkNPTU1fSEVBREVSX1NJWkU7CisJaW5mby5xb3MgPSBxb3M7CisKKwlpcmNvbW1fZG9fZXZlbnQoc2VsZiwgSVJDT01NX1RUUF9DT05ORUNUX0lORElDQVRJT04sIHNrYiwgJmluZm8pOworCitvdXQ6CisJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgaXJjb21tX3R0eV9jb25uZWN0X2luZGljYXRpb24oKS4gKi8KKwlkZXZfa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHRwX2Rpc2Nvbm5lY3RfcmVxdWVzdCAoc2VsZiwgdXNlcmRhdGEsIGluZm8pCisgKgorICogICAgCisgKgorICovCitzdGF0aWMgaW50IGlyY29tbV90dHBfZGlzY29ubmVjdF9yZXF1ZXN0KHN0cnVjdCBpcmNvbW1fY2IgKnNlbGYsIAorCQkJCQkgc3RydWN0IHNrX2J1ZmYgKnVzZXJkYXRhLCAKKwkJCQkJIHN0cnVjdCBpcmNvbW1faW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0OworCisJLyogRG9uJ3QgZm9yZ2V0IHRvIHJlZmNvdW50IGl0IC0gc2hvdWxkIGJlIE5VTEwgYW55d2F5ICovCisJaWYodXNlcmRhdGEpCisJCXNrYl9nZXQodXNlcmRhdGEpOworCisJcmV0ID0gaXJ0dHBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYtPnRzYXAsIHVzZXJkYXRhLCBQX05PUk1BTCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0cF9kaXNjb25uZWN0X2luZGljYXRpb24gKGluc3RhbmNlLCBzYXAsIHJlYXNvbiwgc2tiKQorICoKKyAqICAgIAorICoKKyAqLworc3RhdGljIHZvaWQgaXJjb21tX3R0cF9kaXNjb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgCisJCQkJCSAgICAgTE1fUkVBU09OIHJlYXNvbiwKKwkJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcmNvbW1fY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV9jYiAqKSBpbnN0YW5jZTsKKwlzdHJ1Y3QgaXJjb21tX2luZm8gaW5mbzsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fTUFHSUMsIHJldHVybjspOworCisJaW5mby5yZWFzb24gPSByZWFzb247CisKKwlpcmNvbW1fZG9fZXZlbnQoc2VsZiwgSVJDT01NX1RUUF9ESVNDT05ORUNUX0lORElDQVRJT04sIHNrYiwgJmluZm8pOworCisJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgaXJjb21tX3R0eV9kaXNjb25uZWN0X2luZGljYXRpb24oKS4gKi8KKwlpZihza2IpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHBfZmxvd19pbmRpY2F0aW9uIChpbnN0YW5jZSwgc2FwLCBjbWQpCisgKgorICogICAgTGF5ZXIgYmVsb3cgaXMgdGVsbGluZyB1cyB0byBzdGFydCBvciBzdG9wIHRoZSBmbG93IG9mIGRhdGEKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlyY29tbV90dHBfZmxvd19pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJICAgICAgIExPQ0FMX0ZMT1cgY21kKQoreworCXN0cnVjdCBpcmNvbW1fY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV9jYiAqKSBpbnN0YW5jZTsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fTUFHSUMsIHJldHVybjspOworCQorCWlmIChzZWxmLT5ub3RpZnkuZmxvd19pbmRpY2F0aW9uKQorCQlzZWxmLT5ub3RpZnkuZmxvd19pbmRpY2F0aW9uKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSwgc2VsZiwgY21kKTsKK30KKworCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX3R0eS5jIGIvbmV0L2lyZGEvaXJjb21tL2lyY29tbV90dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDFlNjExCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJjb21tL2lyY29tbV90dHkuYwpAQCAtMCwwICsxLDE0MDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgaXJjb21tX3R0eS5jCisgKiBWZXJzaW9uOiAgICAgICAxLjAKKyAqIERlc2NyaXB0aW9uOiAgIElyQ09NTSBzZXJpYWwgVFRZIGRyaXZlcgorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgU3VuIEp1biAgNiAyMTowMDo1NiAxOTk5CisgKiBNb2RpZmllZCBhdDogICBXZWQgRmViIDIzIDAwOjA5OjAyIDIwMDAKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIFNvdXJjZXM6ICAgICAgIHNlcmlhbC5jIGFuZCBwcmV2aW91cyBJckNPTU0gd29yayBieSBUYWthaGlkZSBIaWd1Y2hpCisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMCBEYWcgQnJhdHRsaSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CisgKiAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIAorICogICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICogICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4JCS8qIGZvciBNT0RVTEVfQUxJQVNfQ0hBUkRFVl9NQUpPUiAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcm1vZC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJjb21tX2NvcmUuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmNvbW1fcGFyYW0uaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmNvbW1fdHR5X2F0dGFjaC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyY29tbV90dHkuaD4KKworc3RhdGljIGludCAgaXJjb21tX3R0eV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKTsKK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICpmaWxwKTsKK3N0YXRpYyBpbnQgIGlyY29tbV90dHlfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksCisJCQkgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKK3N0YXRpYyBpbnQgIGlyY29tbV90dHlfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgaW50ICBpcmNvbW1fdHR5X2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgaXJjb21tX3R0eV9zZW5kX3hjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgY2gpOworc3RhdGljIHZvaWQgaXJjb21tX3R0eV93YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpOworc3RhdGljIHZvaWQgaXJjb21tX3R0eV9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X2RvX3NvZnRpbnQodm9pZCAqcHJpdmF0ZV8pOworc3RhdGljIHZvaWQgaXJjb21tX3R0eV9zaHV0ZG93bihzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZik7CitzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CisKK3N0YXRpYyBpbnQgaXJjb21tX3R0eV9kYXRhX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJjb21tX3R0eV9jb250cm9sX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKKwkJCQkJIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgaXJjb21tX3R0eV9mbG93X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgCisJCQkJICAgICAgIExPQ0FMX0ZMT1cgY21kKTsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIGludCBpcmNvbW1fdHR5X3JlYWRfcHJvYyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuLAorCQkJCWludCAqZW9mLCB2b2lkICp1bnVzZWQpOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlcjsKKworaGFzaGJpbl90ICppcmNvbW1fdHR5ID0gTlVMTDsKKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBvcHMgPSB7CisJLm9wZW4gICAgICAgICAgICA9IGlyY29tbV90dHlfb3BlbiwKKwkuY2xvc2UgICAgICAgICAgID0gaXJjb21tX3R0eV9jbG9zZSwKKwkud3JpdGUgICAgICAgICAgID0gaXJjb21tX3R0eV93cml0ZSwKKwkud3JpdGVfcm9vbSAgICAgID0gaXJjb21tX3R0eV93cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSBpcmNvbW1fdHR5X2NoYXJzX2luX2J1ZmZlciwKKwkuZmx1c2hfYnVmZmVyICAgID0gaXJjb21tX3R0eV9mbHVzaF9idWZmZXIsCisJLmlvY3RsICAgICAgICAgICA9IGlyY29tbV90dHlfaW9jdGwsCS8qIGlyY29tbV90dHlfaW9jdGwuYyAqLworCS50aW9jbWdldCAgICAgICAgPSBpcmNvbW1fdHR5X3Rpb2NtZ2V0LAkvKiBpcmNvbW1fdHR5X2lvY3RsLmMgKi8KKwkudGlvY21zZXQgICAgICAgID0gaXJjb21tX3R0eV90aW9jbXNldCwJLyogaXJjb21tX3R0eV9pb2N0bC5jICovCisJLnRocm90dGxlICAgICAgICA9IGlyY29tbV90dHlfdGhyb3R0bGUsCisJLnVudGhyb3R0bGUgICAgICA9IGlyY29tbV90dHlfdW50aHJvdHRsZSwKKwkuc2VuZF94Y2hhciAgICAgID0gaXJjb21tX3R0eV9zZW5kX3hjaGFyLAorCS5zZXRfdGVybWlvcyAgICAgPSBpcmNvbW1fdHR5X3NldF90ZXJtaW9zLAorCS5zdG9wICAgICAgICAgICAgPSBpcmNvbW1fdHR5X3N0b3AsCisJLnN0YXJ0ICAgICAgICAgICA9IGlyY29tbV90dHlfc3RhcnQsCisJLmhhbmd1cCAgICAgICAgICA9IGlyY29tbV90dHlfaGFuZ3VwLAorCS53YWl0X3VudGlsX3NlbnQgPSBpcmNvbW1fdHR5X3dhaXRfdW50aWxfc2VudCwKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCS5yZWFkX3Byb2MgICAgICAgPSBpcmNvbW1fdHR5X3JlYWRfcHJvYywKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworfTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfaW5pdCgpCisgKgorICogICAgSW5pdCBJckNPTU0gVFRZIGxheWVyL2RyaXZlcgorICoKKyAqLworc3RhdGljIGludCBfX2luaXQgaXJjb21tX3R0eV9pbml0KHZvaWQpCit7CisJZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihJUkNPTU1fVFRZX1BPUlRTKTsKKwlpZiAoIWRyaXZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisJaXJjb21tX3R0eSA9IGhhc2hiaW5fbmV3KEhCX0xPQ0spOyAKKwlpZiAoaXJjb21tX3R0eSA9PSBOVUxMKSB7CisJCUlSREFfRVJST1IoIiVzKCksIGNhbid0IGFsbG9jYXRlIGhhc2hiaW4hXG4iLCBfX0ZVTkNUSU9OX18pOworCQlwdXRfdHR5X2RyaXZlcihkcml2ZXIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkcml2ZXItPm93bmVyCQk9IFRISVNfTU9EVUxFOworCWRyaXZlci0+ZHJpdmVyX25hbWUgICAgID0gImlyY29tbSI7CisJZHJpdmVyLT5uYW1lICAgICAgICAgICAgPSAiaXJjb21tIjsKKwlkcml2ZXItPmRldmZzX25hbWUgICAgICA9ICJpcmNvbW0iOworCWRyaXZlci0+bWFqb3IgICAgICAgICAgID0gSVJDT01NX1RUWV9NQUpPUjsKKwlkcml2ZXItPm1pbm9yX3N0YXJ0ICAgICA9IElSQ09NTV9UVFlfTUlOT1I7CisJZHJpdmVyLT50eXBlICAgICAgICAgICAgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCWRyaXZlci0+c3VidHlwZSAgICAgICAgID0gU0VSSUFMX1RZUEVfTk9STUFMOworCWRyaXZlci0+aW5pdF90ZXJtaW9zICAgID0gdHR5X3N0ZF90ZXJtaW9zOworCWRyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPSBCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7CisJZHJpdmVyLT5mbGFncyAgICAgICAgICAgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOworCXR0eV9zZXRfb3BlcmF0aW9ucyhkcml2ZXIsICZvcHMpOworCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKGRyaXZlcikpIHsKKwkJSVJEQV9FUlJPUigiJXMoKTogQ291bGRuJ3QgcmVnaXN0ZXIgc2VyaWFsIGRyaXZlclxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCXB1dF90dHlfZHJpdmVyKGRyaXZlcik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBfX2lyY29tbV90dHlfY2xlYW51cChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZikKK3sKKwlJUkRBX0RFQlVHKDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuOyk7CisKKwlpcmNvbW1fdHR5X3NodXRkb3duKHNlbGYpOworCisJc2VsZi0+bWFnaWMgPSAwOworCWtmcmVlKHNlbGYpOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV9jbGVhbnVwICgpCisgKgorICogICAgUmVtb3ZlIElyQ09NTSBUVFkgbGF5ZXIvZHJpdmVyCisgKgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgaXJjb21tX3R0eV9jbGVhbnVwKHZvaWQpCit7CisJaW50IHJldDsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwkKKworCXJldCA9IHR0eV91bnJlZ2lzdGVyX2RyaXZlcihkcml2ZXIpOworICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgSVJEQV9FUlJPUigiJXMoKSwgZmFpbGVkIHRvIHVucmVnaXN0ZXIgZHJpdmVyXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCWhhc2hiaW5fZGVsZXRlKGlyY29tbV90dHksIChGUkVFX0ZVTkMpIF9faXJjb21tX3R0eV9jbGVhbnVwKTsKKwlwdXRfdHR5X2RyaXZlcihkcml2ZXIpOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3N0YXJ0dXAgKHNlbGYpCisgKgorICogICAgCisgKgorICovCitzdGF0aWMgaW50IGlyY29tbV90dHlfc3RhcnR1cChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZikKK3sKKwlub3RpZnlfdCBub3RpZnk7CisJaW50IHJldCA9IC1FTk9ERVY7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwkvKiBDaGVjayBpZiBhbHJlYWR5IG9wZW4gKi8KKwlpZiAodGVzdF9hbmRfc2V0X2JpdChBU1lOQ19CX0lOSVRJQUxJWkVELCAmc2VsZi0+ZmxhZ3MpKSB7CisJCUlSREFfREVCVUcoMiwgIiVzKCksIGFscmVhZHkgb3BlbiBzbyBicmVhayBvdXQhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogUmVnaXN0ZXIgd2l0aCBJckNPTU0gKi8KKwlpcmRhX25vdGlmeV9pbml0KCZub3RpZnkpOworCS8qIFRoZXNlIGNhbGxiYWNrcyB3ZSBtdXN0IGhhbmRsZSBvdXJzZWx2ZXMgKi8KKwlub3RpZnkuZGF0YV9pbmRpY2F0aW9uICAgICAgID0gaXJjb21tX3R0eV9kYXRhX2luZGljYXRpb247CisJbm90aWZ5LnVkYXRhX2luZGljYXRpb24gICAgICA9IGlyY29tbV90dHlfY29udHJvbF9pbmRpY2F0aW9uOworIAlub3RpZnkuZmxvd19pbmRpY2F0aW9uICAgICAgID0gaXJjb21tX3R0eV9mbG93X2luZGljYXRpb247CisKKwkvKiBVc2UgdGhlIGlyY29tbV90dHkgaW50ZXJmYWNlIGZvciB0aGVzZSBvbmVzICovCisgCW5vdGlmeS5kaXNjb25uZWN0X2luZGljYXRpb24gPSBpcmNvbW1fdHR5X2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbjsKKwlub3RpZnkuY29ubmVjdF9jb25maXJtICAgICAgID0gaXJjb21tX3R0eV9jb25uZWN0X2NvbmZpcm07CisgCW5vdGlmeS5jb25uZWN0X2luZGljYXRpb24gICAgPSBpcmNvbW1fdHR5X2Nvbm5lY3RfaW5kaWNhdGlvbjsKKwlzdHJsY3B5KG5vdGlmeS5uYW1lLCAiaXJjb21tX3R0eSIsIHNpemVvZihub3RpZnkubmFtZSkpOworCW5vdGlmeS5pbnN0YW5jZSA9IHNlbGY7CisKKwlpZiAoIXNlbGYtPmlyY29tbSkgeworCQlzZWxmLT5pcmNvbW0gPSBpcmNvbW1fb3Blbigmbm90aWZ5LCBzZWxmLT5zZXJ2aWNlX3R5cGUsIAorCQkJCQkgICBzZWxmLT5saW5lKTsKKwl9CisJaWYgKCFzZWxmLT5pcmNvbW0pCisJCWdvdG8gZXJyOworCisJc2VsZi0+c2xzYXBfc2VsID0gc2VsZi0+aXJjb21tLT5zbHNhcF9zZWw7CisKKwkvKiBDb25uZWN0IElyQ09NTSBsaW5rIHdpdGggcmVtb3RlIGRldmljZSAqLworCXJldCA9IGlyY29tbV90dHlfYXR0YWNoX2NhYmxlKHNlbGYpOworCWlmIChyZXQgPCAwKSB7CisJCUlSREFfRVJST1IoIiVzKCksIGVycm9yIGF0dGFjaGluZyBjYWJsZSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gZXJyOworCX0KKworCXJldHVybiAwOworZXJyOgorCWNsZWFyX2JpdChBU1lOQ19CX0lOSVRJQUxJWkVELCAmc2VsZi0+ZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fYmxvY2tfdGlsX3JlYWR5IChzZWxmLCBmaWxwKQorICoKKyAqICAgIAorICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fdHR5X2Jsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiwgCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbHApCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJaW50CQlyZXR2YWw7CisJaW50CQlkb19jbG9jYWwgPSAwLCBleHRyYV9jb3VudCA9IDA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCQorCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJdHR5ID0gc2VsZi0+dHR5OworCisJLyoKKwkgKiBJZiBub24tYmxvY2tpbmcgbW9kZSBpcyBzZXQsIG9yIHRoZSBwb3J0IGlzIG5vdCBlbmFibGVkLAorCSAqIHRoZW4gbWFrZSB0aGUgY2hlY2sgdXAgZnJvbnQgYW5kIHRoZW4gZXhpdC4KKwkgKi8JCisJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLIHx8IHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKXsKKwkJLyogbm9uYmxvY2sgbW9kZSBpcyBzZXQgb3IgcG9ydCBpcyBub3QgZW5hYmxlZCAqLworCQlzZWxmLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCQlJUkRBX0RFQlVHKDEsICIlcygpLCBPX05PTkJMT0NLIHJlcXVlc3RlZCFcbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKSB7CisJCUlSREFfREVCVUcoMSwgIiVzKCksIGRvaW5nIENMT0NBTCFcbiIsIF9fRlVOQ1RJT05fXyApOworCQlkb19jbG9jYWwgPSAxOworCX0KKwkKKwkvKiBXYWl0IGZvciBjYXJyaWVyIGRldGVjdCBhbmQgdGhlIGxpbmUgdG8gYmVjb21lCisJICogZnJlZSAoaS5lLiwgbm90IGluIHVzZSBieSB0aGUgY2FsbG91dCkuICBXaGlsZSB3ZSBhcmUgaW4KKwkgKiB0aGlzIGxvb3AsIHNlbGYtPm9wZW5fY291bnQgaXMgZHJvcHBlZCBieSBvbmUsIHNvIHRoYXQKKwkgKiBtZ3NsX2Nsb3NlKCkga25vd3Mgd2hlbiB0byBmcmVlIHRoaW5ncy4gIFdlIHJlc3RvcmUgaXQgdXBvbgorCSAqIGV4aXQsIGVpdGhlciBub3JtYWwgb3IgYWJub3JtYWwuCisJICovCisJIAorCXJldHZhbCA9IDA7CisJYWRkX3dhaXRfcXVldWUoJnNlbGYtPm9wZW5fd2FpdCwgJndhaXQpOworCQorCUlSREFfREVCVUcoMiwgIiVzKCVkKTpibG9ja190aWxfcmVhZHkgYmVmb3JlIGJsb2NrIG9uICVzIG9wZW5fY291bnQ9JWRcbiIsCisJICAgICAgX19GSUxFX18sX19MSU5FX18sIHR0eS0+ZHJpdmVyLT5uYW1lLCBzZWxmLT5vcGVuX2NvdW50ICk7CisKKwkvKiBBcyBmYXIgYXMgSSBjYW4gc2VlLCB3ZSBwcm90ZWN0IG9wZW5fY291bnQgLSBKZWFuIElJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisJaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKSB7CisJCWV4dHJhX2NvdW50ID0gMTsKKwkJc2VsZi0+b3Blbl9jb3VudC0tOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCXNlbGYtPmJsb2NrZWRfb3BlbisrOworCQorCXdoaWxlICgxKSB7CisJCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgeworCQkJLyogSGVyZSwgd2UgdXNlIHRvIGxvY2sgdGhvc2UgdHdvIGd1eXMsIGJ1dAorCQkJICogYXMgaXJjb21tX3BhcmFtX3JlcXVlc3QoKSBkb2VzIGl0IGl0c2VsZiwKKwkJCSAqIEkgZG9uJ3Qgc2VlIHRoZSBwb2ludCAoYW5kIEkgc2VlIHRoZSBkZWFkbG9jaykuCisJCQkgKiBKZWFuIElJICovCisJCQlzZWxmLT5zZXR0aW5ncy5kdGUgfD0gSVJDT01NX1JUUyArIElSQ09NTV9EVFI7CisJCSAJCisJCQlpcmNvbW1fcGFyYW1fcmVxdWVzdChzZWxmLCBJUkNPTU1fRFRFLCBUUlVFKTsKKwkJfQorCQkKKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCQorCQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fAorCQkgICAgIXRlc3RfYml0KEFTWU5DX0JfSU5JVElBTElaRUQsICZzZWxmLT5mbGFncykpIHsKKwkJCXJldHZhbCA9IChzZWxmLT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpID8KKwkJCQkJLUVBR0FJTiA6IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCQorCQkvKiAgCisJCSAqIENoZWNrIGlmIGxpbmsgaXMgcmVhZHkgbm93LiBFdmVuIGlmIENMT0NBTCBpcworCQkgKiBzcGVjaWZpZWQsIHdlIGNhbm5vdCByZXR1cm4gYmVmb3JlIHRoZSBJckNPTU0gbGluayBpcworCQkgKiByZWFkeSAKKwkJICovCisgCQlpZiAoIXRlc3RfYml0KEFTWU5DX0JfQ0xPU0lORywgJnNlbGYtPmZsYWdzKSAmJgorIAkJICAgIChkb19jbG9jYWwgfHwgKHNlbGYtPnNldHRpbmdzLmRjZSAmIElSQ09NTV9DRCkpICYmCisJCSAgICBzZWxmLT5zdGF0ZSA9PSBJUkNPTU1fVFRZX1JFQURZKQorCQl7CisgCQkJYnJlYWs7CisJCX0KKwkJCQorCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCQorCQlJUkRBX0RFQlVHKDEsICIlcyglZCk6YmxvY2tfdGlsX3JlYWR5IGJsb2NraW5nIG9uICVzIG9wZW5fY291bnQ9JWRcbiIsCisJCSAgICAgIF9fRklMRV9fLF9fTElORV9fLCB0dHktPmRyaXZlci0+bmFtZSwgc2VsZi0+b3Blbl9jb3VudCApOworCQkKKwkJc2NoZWR1bGUoKTsKKwl9CisJCisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZzZWxmLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkKKwlpZiAoZXh0cmFfY291bnQpIHsKKwkJLyogKysgaXMgbm90IGF0b21pYywgc28gdGhpcyBzaG91bGQgYmUgcHJvdGVjdGVkIC0gSmVhbiBJSSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJc2VsZi0+b3Blbl9jb3VudCsrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCX0KKwlzZWxmLT5ibG9ja2VkX29wZW4tLTsKKwkKKwlJUkRBX0RFQlVHKDEsICIlcyglZCk6YmxvY2tfdGlsX3JlYWR5IGFmdGVyIGJsb2NraW5nIG9uICVzIG9wZW5fY291bnQ9JWRcbiIsCisJICAgICAgX19GSUxFX18sX19MSU5FX18sIHR0eS0+ZHJpdmVyLT5uYW1lLCBzZWxmLT5vcGVuX2NvdW50KTsKKwkJCSAKKwlpZiAoIXJldHZhbCkKKwkJc2VsZi0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKwkJCisJcmV0dXJuIHJldHZhbDsJCit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X29wZW4gKHR0eSwgZmlscCkKKyAqCisgKiAgICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gYSBwYXJ0aWN1bGFyIHR0eSBkZXZpY2UgaXMgb3BlbmVkLiBUaGlzCisgKiAgICByb3V0aW5lIGlzIG1hbmRhdG9yeTsgaWYgdGhpcyByb3V0aW5lIGlzIG5vdCBmaWxsZWQgaW4sIHRoZSBhdHRlbXB0ZWQKKyAqICAgIG9wZW4gd2lsbCBmYWlsIHdpdGggRU5PREVWLgorICovCitzdGF0aWMgaW50IGlyY29tbV90dHlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZjsKKwl1bnNpZ25lZCBpbnQgbGluZTsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCWludCByZXQ7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCWxpbmUgPSB0dHktPmluZGV4OworCWlmICgobGluZSA8IDApIHx8IChsaW5lID49IElSQ09NTV9UVFlfUE9SVFMpKSB7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIENoZWNrIGlmIGluc3RhbmNlIGFscmVhZHkgZXhpc3RzICovCisJc2VsZiA9IGhhc2hiaW5fbG9ja19maW5kKGlyY29tbV90dHksIGxpbmUsIE5VTEwpOworCWlmICghc2VsZikgeworCQkvKiBObywgc28gbWFrZSBuZXcgaW5zdGFuY2UgKi8KKwkJc2VsZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcmNvbW1fdHR5X2NiKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChzZWxmID09IE5VTEwpIHsKKwkJCUlSREFfRVJST1IoIiVzKCksIGttYWxsb2MgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW1lbXNldChzZWxmLCAwLCBzaXplb2Yoc3RydWN0IGlyY29tbV90dHlfY2IpKTsKKwkJCisJCXNlbGYtPm1hZ2ljID0gSVJDT01NX1RUWV9NQUdJQzsKKwkJc2VsZi0+ZmxvdyA9IEZMT1dfU1RPUDsKKworCQlzZWxmLT5saW5lID0gbGluZTsKKwkJSU5JVF9XT1JLKCZzZWxmLT50cXVldWUsIGlyY29tbV90dHlfZG9fc29mdGludCwgc2VsZik7CisJCXNlbGYtPm1heF9oZWFkZXJfc2l6ZSA9IElSQ09NTV9UVFlfSERSX1VOSU5JVElBTElTRUQ7CisJCXNlbGYtPm1heF9kYXRhX3NpemUgPSBJUkNPTU1fVFRZX0RBVEFfVU5JTklUSUFMSVNFRDsKKwkJc2VsZi0+Y2xvc2VfZGVsYXkgPSA1KkhaLzEwOworCQlzZWxmLT5jbG9zaW5nX3dhaXQgPSAzMCpIWjsKKworCQkvKiBJbml0IHNvbWUgaW1wb3J0YW50IHN0dWZmICovCisJCWluaXRfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmc2VsZi0+b3Blbl93YWl0KTsKKyAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNlbGYtPmNsb3NlX3dhaXQpOworCQlzcGluX2xvY2tfaW5pdCgmc2VsZi0+c3BpbmxvY2spOworCisJCS8qIAorCQkgKiBGb3JjZSBUVFkgaW50byByYXcgbW9kZSBieSBkZWZhdWx0IHdoaWNoIGlzIHVzdWFsbHkgd2hhdAorCQkgKiB3ZSB3YW50IGZvciBJckNPTU0gYW5kIElyTFBULiBUaGlzIHdheSBhcHBsaWNhdGlvbnMgd2lsbAorCQkgKiBub3QgaGF2ZSB0byB0d2lkZGxlIHdpdGggcHJpbnRjYXAgZXRjLiAgCisJCSAqLworCQl0dHktPnRlcm1pb3MtPmNfaWZsYWcgPSAwOworCQl0dHktPnRlcm1pb3MtPmNfb2ZsYWcgPSAwOworCisJCS8qIEluc2VydCBpbnRvIGhhc2ggKi8KKwkJaGFzaGJpbl9pbnNlcnQoaXJjb21tX3R0eSwgKGlyZGFfcXVldWVfdCAqKSBzZWxmLCBsaW5lLCBOVUxMKTsKKwl9CisJLyogKysgaXMgbm90IGF0b21pYywgc28gdGhpcyBzaG91bGQgYmUgcHJvdGVjdGVkIC0gSmVhbiBJSSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCXNlbGYtPm9wZW5fY291bnQrKzsKKworCXR0eS0+ZHJpdmVyX2RhdGEgPSBzZWxmOworCXNlbGYtPnR0eSA9IHR0eTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgJXMlZCwgY291bnQgPSAlZFxuIiwgX19GVU5DVElPTl9fICwgdHR5LT5kcml2ZXItPm5hbWUsIAorCQkgICBzZWxmLT5saW5lLCBzZWxmLT5vcGVuX2NvdW50KTsKKworCS8qIE5vdCByZWFsbHkgdXNlZCBieSB1cywgYnV0IGxldHMgZG8gaXQgYW55d2F5ICovCisJc2VsZi0+dHR5LT5sb3dfbGF0ZW5jeSA9IChzZWxmLT5mbGFncyAmIEFTWU5DX0xPV19MQVRFTkNZKSA/IDEgOiAwOworCisJLyoKKwkgKiBJZiB0aGUgcG9ydCBpcyB0aGUgbWlkZGxlIG9mIGNsb3NpbmcsIGJhaWwgb3V0IG5vdworCSAqLworCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8CisJICAgIHRlc3RfYml0KEFTWU5DX0JfQ0xPU0lORywgJnNlbGYtPmZsYWdzKSkgeworCisJCS8qIEhtLCB3aHkgYXJlIHdlIGJsb2NraW5nIG9uIEFTWU5DX0NMT1NJTkcgaWYgd2UKKwkJICogZG8gcmV0dXJuIC1FQUdBSU4vLUVSRVNUQVJUU1lTIGJlbG93IGFueXdheT8KKwkJICogSU1ITyBpdCdzIGVpdGhlciBub3QgbmVlZGVkIGluIHRoZSBmaXJzdCBwbGFjZQorCQkgKiBvciBmb3Igc29tZSByZWFzb24gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGFzeW5jCisJCSAqIGNsb3NpbmcgaGFzIGJlZW4gZmluaXNoZWQgLSBpZiBzbywgd291bGRuJ3Qgd2UKKwkJICogcHJvYmFibHkgYmV0dGVyIHNsZWVwIHVuaW50ZXJydXB0aWJsZT8KKwkJICovCisKKwkJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzZWxmLT5jbG9zZV93YWl0LCAhdGVzdF9iaXQoQVNZTkNfQl9DTE9TSU5HLCAmc2VsZi0+ZmxhZ3MpKSkgeworCQkJSVJEQV9XQVJOSU5HKCIlcyAtIGdvdCBzaWduYWwgd2hpbGUgYmxvY2tpbmcgb24gQVNZTkNfQ0xPU0lORyFcbiIsCisJCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJfQorCisjaWZkZWYgU0VSSUFMX0RPX1JFU1RBUlQKKwkJcmV0dXJuICgoc2VsZi0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKSA/CisJCQktRUFHQUlOIDogLUVSRVNUQVJUU1lTKTsKKyNlbHNlCisJCXJldHVybiAtRUFHQUlOOworI2VuZGlmCisJfQorCisJLyogQ2hlY2sgaWYgdGhpcyBpcyBhICJub3JtYWwiIGlyY29tbSBkZXZpY2UsIG9yIGFuIGlybHB0IGRldmljZSAqLworCWlmIChsaW5lIDwgMHgxMCkgeworCQlzZWxmLT5zZXJ2aWNlX3R5cGUgPSBJUkNPTU1fM19XSVJFIHwgSVJDT01NXzlfV0lSRTsKKwkJc2VsZi0+c2V0dGluZ3Muc2VydmljZV90eXBlID0gSVJDT01NXzlfV0lSRTsgLyogOSB3aXJlIGFzIGRlZmF1bHQgKi8KKwkJLyogSmFuIEtpc3prYSAtPiBhZGQgRFNSL1JJIC0+IENvbmZvcm0gdG8gSXJDT01NIHNwZWMgKi8KKwkJc2VsZi0+c2V0dGluZ3MuZGNlID0gSVJDT01NX0NUUyB8IElSQ09NTV9DRCB8IElSQ09NTV9EU1IgfCBJUkNPTU1fUkk7IC8qIERlZmF1bHQgbGluZSBzZXR0aW5ncyAqLworCQlJUkRBX0RFQlVHKDIsICIlcygpLCBJckNPTU0gZGV2aWNlXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwl9IGVsc2UgeworCQlJUkRBX0RFQlVHKDIsICIlcygpLCBJckxQVCBkZXZpY2VcbiIsIF9fRlVOQ1RJT05fXyApOworCQlzZWxmLT5zZXJ2aWNlX3R5cGUgPSBJUkNPTU1fM19XSVJFX1JBVzsKKwkJc2VsZi0+c2V0dGluZ3Muc2VydmljZV90eXBlID0gSVJDT01NXzNfV0lSRV9SQVc7IC8qIERlZmF1bHQgKi8KKwl9CisKKwlyZXQgPSBpcmNvbW1fdHR5X3N0YXJ0dXAoc2VsZik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGlyY29tbV90dHlfYmxvY2tfdGlsX3JlYWR5KHNlbGYsIGZpbHApOworCWlmIChyZXQpIHsKKwkJSVJEQV9ERUJVRygyLCAKKwkJICAgICAgIiVzKCksIHJldHVybmluZyBhZnRlciBibG9ja190aWxfcmVhZHkgd2l0aCAlZFxuIiwgX19GVU5DVElPTl9fICwKKwkJICAgICAgcmV0KTsKKworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfY2xvc2UgKHR0eSwgZmlscCkKKyAqCisgKiAgICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gYSBwYXJ0aWN1bGFyIHR0eSBkZXZpY2UgaXMgY2xvc2VkLgorICoKKyAqLworc3RhdGljIHZvaWQgaXJjb21tX3R0eV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlJUkRBX0RFQlVHKDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCWlmICghdHR5KQorCQlyZXR1cm47CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybjspOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCisJCUlSREFfREVCVUcoMCwgIiVzKCksIHJldHVybmluZyAxXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgodHR5LT5jb3VudCA9PSAxKSAmJiAoc2VsZi0+b3Blbl9jb3VudCAhPSAxKSkgeworCQkvKgorCQkgKiBVaCwgb2guICB0dHktPmNvdW50IGlzIDEsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHR0eQorCQkgKiBzdHJ1Y3R1cmUgd2lsbCBiZSBmcmVlZC4gIHN0YXRlLT5jb3VudCBzaG91bGQgYWx3YXlzCisJCSAqIGJlIG9uZSBpbiB0aGVzZSBjb25kaXRpb25zLiAgSWYgaXQncyBncmVhdGVyIHRoYW4KKwkJICogb25lLCB3ZSd2ZSBnb3QgcmVhbCBwcm9ibGVtcywgc2luY2UgaXQgbWVhbnMgdGhlCisJCSAqIHNlcmlhbCBwb3J0IHdvbid0IGJlIHNodXRkb3duLgorCQkgKi8KKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgYmFkIHNlcmlhbCBwb3J0IGNvdW50OyAiCisJCQkgICAidHR5LT5jb3VudCBpcyAxLCBzdGF0ZS0+Y291bnQgaXMgJWRcbiIsIF9fRlVOQ1RJT05fXyAsIAorCQkJICAgc2VsZi0+b3Blbl9jb3VudCk7CisJCXNlbGYtPm9wZW5fY291bnQgPSAxOworCX0KKworCWlmICgtLXNlbGYtPm9wZW5fY291bnQgPCAwKSB7CisJCUlSREFfRVJST1IoIiVzKCksIGJhZCBzZXJpYWwgcG9ydCBjb3VudCBmb3IgdHR5cyVkOiAlZFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgc2VsZi0+bGluZSwgc2VsZi0+b3Blbl9jb3VudCk7CisJCXNlbGYtPm9wZW5fY291bnQgPSAwOworCX0KKwlpZiAoc2VsZi0+b3Blbl9jb3VudCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCisJCUlSREFfREVCVUcoMCwgIiVzKCksIG9wZW4gY291bnQgPiAwXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEh1bS4uLiBTaG91bGQgYmUgdGVzdF9hbmRfc2V0X2JpdCA/Pz8gLSBKZWFuIElJICovCisJc2V0X2JpdChBU1lOQ19CX0NMT1NJTkcsICZzZWxmLT5mbGFncyk7CisKKwkvKiBXZSBuZWVkIHRvIHVubG9jayBoZXJlICh3ZSB3ZXJlIHVubG9ja2luZyBhdCB0aGUgZW5kIG9mIHRoaXMKKwkgKiBmdW5jdGlvbiksIGJlY2F1c2UgdHR5X3dhaXRfdW50aWxfc2VudCgpIG1heSBzY2hlZHVsZS4KKwkgKiBJIGRvbid0IGtub3cgaWYgdGhlIHJlc3Qgc2hvdWxkIGJlIHByb3RlY3RlZCBzb21laG93LAorCSAqIHNvIHNvbWVvbmUgc2hvdWxkIGNoZWNrLiAtIEplYW4gSUkgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBOb3cgd2Ugd2FpdCBmb3IgdGhlIHRyYW5zbWl0IGJ1ZmZlciB0byBjbGVhcjsgYW5kIHdlIG5vdGlmeSAKKwkgKiB0aGUgbGluZSBkaXNjaXBsaW5lIHRvIG9ubHkgcHJvY2VzcyBYT04vWE9GRiBjaGFyYWN0ZXJzLgorCSAqLworCXR0eS0+Y2xvc2luZyA9IDE7CisJaWYgKHNlbGYtPmNsb3Npbmdfd2FpdCAhPSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSkKKwkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIHNlbGYtPmNsb3Npbmdfd2FpdCk7CisKKwlpcmNvbW1fdHR5X3NodXRkb3duKHNlbGYpOworCisJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisJCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKKwlpZiAodHR5LT5sZGlzYy5mbHVzaF9idWZmZXIpCisJCXR0eS0+bGRpc2MuZmx1c2hfYnVmZmVyKHR0eSk7CisKKwl0dHktPmNsb3NpbmcgPSAwOworCXNlbGYtPnR0eSA9IE5VTEw7CisKKwlpZiAoc2VsZi0+YmxvY2tlZF9vcGVuKSB7CisJCWlmIChzZWxmLT5jbG9zZV9kZWxheSkgeworCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCQlzY2hlZHVsZV90aW1lb3V0KHNlbGYtPmNsb3NlX2RlbGF5KTsKKwkJfQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNlbGYtPm9wZW5fd2FpdCk7CisJfQorCisJc2VsZi0+ZmxhZ3MgJj0gfihBU1lOQ19OT1JNQUxfQUNUSVZFfEFTWU5DX0NMT1NJTkcpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2VsZi0+Y2xvc2Vfd2FpdCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X2ZsdXNoX2J1ZmZlciAodHR5KQorICoKKyAqICAgIAorICoKKyAqLworc3RhdGljIHZvaWQgaXJjb21tX3R0eV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSB0dHktPmRyaXZlcl9kYXRhOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm47KTsKKworCS8qIAorCSAqIExldCBkb19zb2Z0aW50KCkgZG8gdGhpcyB0byBhdm9pZCByYWNlIGNvbmRpdGlvbiB3aXRoIAorCSAqIGRvX3NvZnRpbnQoKSA7LSkgCisJICovCisJc2NoZWR1bGVfd29yaygmc2VsZi0+dHF1ZXVlKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfZG9fc29mdGludCAocHJpdmF0ZV8pCisgKgorICogICAgV2UgdXNlIHRoaXMgcm91dGluZSB0byBnaXZlIHRoZSB3cml0ZSB3YWtldXAgdG8gdGhlIHVzZXIgYXQgYXQgYQorICogICAgc2FmZSB0aW1lIChhcyBmYXN0IGFzIHBvc3NpYmxlIGFmdGVyIHdyaXRlIGhhdmUgY29tcGxldGVkKS4gVGhpcyAKKyAqICAgIGNhbiBiZSBjb21wYXJlZCB0byB0aGUgVHggaW50ZXJydXB0LgorICovCitzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X2RvX3NvZnRpbnQodm9pZCAqcHJpdmF0ZV8pCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgcHJpdmF0ZV87CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBza19idWZmICpza2IsICpjdHJsX3NrYjsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJaWYgKCFzZWxmIHx8IHNlbGYtPm1hZ2ljICE9IElSQ09NTV9UVFlfTUFHSUMpCisJCXJldHVybjsKKworCXR0eSA9IHNlbGYtPnR0eTsKKwlpZiAoIXR0eSkKKwkJcmV0dXJuOworCisJLyogVW5saW5rIGNvbnRyb2wgYnVmZmVyICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisKKwljdHJsX3NrYiA9IHNlbGYtPmN0cmxfc2tiOworCXNlbGYtPmN0cmxfc2tiID0gTlVMTDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBGbHVzaCBjb250cm9sIGJ1ZmZlciBpZiBhbnkgKi8KKwlpZihjdHJsX3NrYikgeworCQlpZihzZWxmLT5mbG93ID09IEZMT1dfU1RBUlQpCisJCQlpcmNvbW1fY29udHJvbF9yZXF1ZXN0KHNlbGYtPmlyY29tbSwgY3RybF9za2IpOworCQkvKiBEcm9wIHJlZmVyZW5jZSBjb3VudCAtIHNlZSBpcmNvbW1fdHRwX2RhdGFfcmVxdWVzdCgpLiAqLworCQlkZXZfa2ZyZWVfc2tiKGN0cmxfc2tiKTsKKwl9CisKKwlpZiAodHR5LT5od19zdG9wcGVkKQorCQlyZXR1cm47CisKKwkvKiBVbmxpbmsgdHJhbnNtaXQgYnVmZmVyICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJc2tiID0gc2VsZi0+dHhfc2tiOworCXNlbGYtPnR4X3NrYiA9IE5VTEw7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCisJLyogRmx1c2ggdHJhbnNtaXQgYnVmZmVyIGlmIGFueSAqLworCWlmIChza2IpIHsKKwkJaXJjb21tX3R0eV9kb19ldmVudChzZWxmLCBJUkNPTU1fVFRZX0RBVEFfUkVRVUVTVCwgc2tiLCBOVUxMKTsKKwkJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgaXJjb21tX3R0cF9kYXRhX3JlcXVlc3QoKS4gKi8KKwkJZGV2X2tmcmVlX3NrYihza2IpOworCX0KKwkJCisJLyogQ2hlY2sgaWYgdXNlciAoc3RpbGwpIHdhbnRzIHRvIGJlIHdha2VuIHVwICovCisJaWYgKCh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCkpICYmIAorCSAgICB0dHktPmxkaXNjLndyaXRlX3dha2V1cCkKKwl7CisJCSh0dHktPmxkaXNjLndyaXRlX3dha2V1cCkodHR5KTsKKwl9CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV93cml0ZSAodHR5LCBidWYsIGNvdW50KQorICoKKyAqICAgIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIGtlcm5lbCB0byB3cml0ZSBhIHNlcmllcyBvZiBjaGFyYWN0ZXJzCisgKiAgICB0byB0aGUgdHR5IGRldmljZS4gVGhlIGNoYXJhY3RlcnMgbWF5IGNvbWUgZnJvbSB1c2VyIHNwYWNlIG9yIGtlcm5lbAorICogICAgc3BhY2UuIFRoaXMgcm91dGluZSB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWN0dWFsbHkKKyAqICAgIGFjY2VwdGVkIGZvciB3cml0aW5nLiBUaGlzIHJvdXRpbmUgaXMgbWFuZGF0b3J5LgorICovCitzdGF0aWMgaW50IGlyY29tbV90dHlfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgdGFpbHJvb20gPSAwOworCWludCBsZW4gPSAwOworCWludCBzaXplOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgY291bnQ9JWQsIGh3X3N0b3BwZWQ9JWRcbiIsIF9fRlVOQ1RJT05fXyAsIGNvdW50LAorCQkgICB0dHktPmh3X3N0b3BwZWQpOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm4gLTE7KTsKKworCS8qIFdlIG1heSByZWNlaXZlIHBhY2tldHMgZnJvbSB0aGUgVFRZIGV2ZW4gYmVmb3JlIHdlIGhhdmUgZmluaXNoZWQKKwkgKiBvdXIgc2V0dXAuIE5vdCBjb29sLgorCSAqIFRoZSBwcm9ibGVtIGlzIHRoYXQgd2UgZG9uJ3Qga25vdyB0aGUgZmluYWwgaGVhZGVyIGFuZCBkYXRhIHNpemUKKwkgKiB0byBjcmVhdGUgdGhlIHByb3BlciBza2IsIHNvIGFueSBza2Igd2Ugd291bGQgY3JlYXRlIHdvdWxkIGhhdmUKKwkgKiBib2d1cyBoZWFkZXIgYW5kIGRhdGEgc2l6ZSwgc28gbmVlZCBjYXJlLgorCSAqIFdlIHVzZSBhIGJvZ3VzIGhlYWRlciBzaXplIHRvIHNhZmVseSBkZXRlY3QgdGhpcyBjb25kaXRpb24uCisJICogQW5vdGhlciBwcm9ibGVtIGlzIHRoYXQgaHdfc3RvcHBlZCB3YXMgc2V0IHRvIDAgd2F5IGJlZm9yZSBpdAorCSAqIHNob3VsZCBiZSwgc28gd2Ugd291bGQgZHJvcCB0aGlzIHNrYi4gSXQgc2hvdWxkIG5vdyBiZSBmaXhlZC4KKwkgKiBPbmUgb3B0aW9uIGlzIHRvIG5vdCBhY2NlcHQgZGF0YSB1bnRpbCB3ZSBhcmUgcHJvcGVybHkgc2V0dXAuCisJICogQnV0LCBJIHN1c3BlY3QgdGhhdCB3aGVuIGl0IGhhcHBlbnMsIHRoZSBwcHAgbGluZSBkaXNjaXBsaW5lCisJICoganVzdCAiZHJvcHMiIHRoZSBkYXRhLCB3aGljaCBtaWdodCBzY3JldyB1cCBjb25uZWN0IHNjcmlwdHMuCisJICogVGhlIHNlY29uZCBvcHRpb24gaXMgdG8gY3JlYXRlIGEgInNhZmUgc2tiIiwgd2l0aCBsYXJnZSBoZWFkZXIKKwkgKiBhbmQgc21hbGwgc2l6ZSAoc2VlIGlyY29tbV90dHlfb3BlbigpIGZvciB2YWx1ZXMpLgorCSAqIFdlIGp1c3QgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB3aGVuIHRoZSByZWFsIHZhbHVlcyBnZXQgZmlsbGVkLAorCSAqIHdlIGRvbid0IG1lc3MgdXAgdGhlIG9yaWdpbmFsICJzYWZlIHNrYiIgKHNlZSB0eF9kYXRhX3NpemUpLgorCSAqIEplYW4gSUkgKi8KKwlpZiAoc2VsZi0+bWF4X2hlYWRlcl9zaXplID09IElSQ09NTV9UVFlfSERSX1VOSU5JVElBTElTRUQpIHsKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSA6IG5vdCBpbml0aWFsaXNlZFxuIiwgX19GVU5DVElPTl9fKTsKKyNpZmRlZiBJUkNPTU1fTk9fVFhfQkVGT1JFX0lOSVQKKwkJLyogV2UgZGlkbid0IGNvbnN1bWUgYW55dGhpbmcsIFRUWSB3aWxsIHJldHJ5ICovCisJCXJldHVybiAwOworI2VuZGlmCisJfQorCisJaWYgKGNvdW50IDwgMSkKKwkJcmV0dXJuIDA7CisKKwkvKiBQcm90ZWN0IG91ciBtYW5pcHVsYXRpb24gb2Ygc2VsZi0+dHhfc2tiIGFuZCByZWxhdGVkICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBGZXRjaCBjdXJyZW50IHRyYW5zbWl0IGJ1ZmZlciAqLworCXNrYiA9IHNlbGYtPnR4X3NrYjsKKworCS8qICAKKwkgKiBTZW5kIG91dCBhbGwgdGhlIGRhdGEgd2UgZ2V0LCBwb3NzaWJseSBhcyBtdWx0aXBsZSBmcmFnbWVudGVkCisJICogZnJhbWVzLCBidXQgdGhpcyB3aWxsIG9ubHkgaGFwcGVuIGlmIHRoZSBkYXRhIGlzIGxhcmdlciB0aGFuIHRoZQorCSAqIG1heCBkYXRhIHNpemUuIFRoZSBub3JtYWwgY2FzZSBob3dldmVyIGlzIGp1c3QgdGhlIG9wcG9zaXRlLCBhbmQKKwkgKiB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIGFuZCB3aWxsIHRoZW4gYWN0dWFsbHkKKwkgKiBkZWZyYWdtZW50IHRoZSBkYXRhIGFuZCBzZW5kIGl0IG91dCBhcyBvbmUgcGFja2V0IGFzIHNvb24gYXMgCisJICogcG9zc2libGUsIGJ1dCBhdCBhIHNhZmVyIHBvaW50IGluIHRpbWUKKwkgKi8KKwl3aGlsZSAoY291bnQpIHsKKwkJc2l6ZSA9IGNvdW50OworCisJCS8qIEFkanVzdCBkYXRhIHNpemUgdG8gdGhlIG1heCBkYXRhIHNpemUgKi8KKwkJaWYgKHNpemUgPiBzZWxmLT5tYXhfZGF0YV9zaXplKQorCQkJc2l6ZSA9IHNlbGYtPm1heF9kYXRhX3NpemU7CisJCQorCQkvKiAKKwkJICogRG8gd2UgYWxyZWFkeSBoYXZlIGEgYnVmZmVyIHJlYWR5IGZvciB0cmFuc21pdCwgb3IgZG8KKwkJICogd2UgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBmcmFtZSAKKwkJICovCisJCWlmIChza2IpIHsJCQkKKwkJCS8qIAorCQkJICogQW55IHJvb20gZm9yIG1vcmUgZGF0YSBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IAorCQkJICogdHJhbnNtaXQgYnVmZmVyPyBDYW5ub3QgdXNlIHNrYl90YWlscm9vbSwgc2luY2UKKwkJCSAqIGRldl9hbGxvY19za2IgZ2l2ZXMgdXMgYSBsYXJnZXIgc2tiIHRoYW4gd2UgCisJCQkgKiByZXF1ZXN0ZWQKKwkJCSAqIE5vdGUgOiB1c2UgdHhfZGF0YV9zaXplLCBiZWNhdXNlIG1heF9kYXRhX3NpemUKKwkJCSAqIG1heSBoYXZlIGNoYW5nZWQgYW5kIHdlIGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlCisJCQkgKiB0aGUgc2tiLiAtIEplYW4gSUkKKwkJCSAqLworCQkJaWYgKCh0YWlscm9vbSA9IChzZWxmLT50eF9kYXRhX3NpemUgLSBza2ItPmxlbikpID4gMCkgeworCQkJCS8qIEFkanVzdCBkYXRhIHRvIHRhaWxyb29tICovCisJCQkJaWYgKHNpemUgPiB0YWlscm9vbSkKKwkJCQkJc2l6ZSA9IHRhaWxyb29tOworCQkJfSBlbHNlIHsKKwkJCQkvKiAKKwkJCQkgKiBDdXJyZW50IHRyYW5zbWl0IGZyYW1lIGlzIGZ1bGwsIHNvIGJyZWFrIAorCQkJCSAqIG91dCwgc28gd2UgY2FuIHNlbmQgaXQgYXMgc29vbiBhcyBwb3NzaWJsZQorCQkJCSAqLworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogUHJlcGFyZSBhIGZ1bGwgc2l6ZWQgZnJhbWUgKi8KKwkJCXNrYiA9IGRldl9hbGxvY19za2Ioc2VsZi0+bWF4X2RhdGFfc2l6ZSsKKwkJCQkJICAgIHNlbGYtPm1heF9oZWFkZXJfc2l6ZSk7CisJCQlpZiAoIXNrYikgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisJCQkJcmV0dXJuIC1FTk9CVUZTOworCQkJfQorCQkJc2tiX3Jlc2VydmUoc2tiLCBzZWxmLT5tYXhfaGVhZGVyX3NpemUpOworCQkJc2VsZi0+dHhfc2tiID0gc2tiOworCQkJLyogUmVtZW1iZXIgc2tiIHNpemUgYmVjYXVzZSBtYXhfZGF0YV9zaXplIG1heQorCQkJICogY2hhbmdlIGxhdGVyIG9uIC0gSmVhbiBJSSAqLworCQkJc2VsZi0+dHhfZGF0YV9zaXplID0gc2VsZi0+bWF4X2RhdGFfc2l6ZTsKKwkJfQorCisJCS8qIENvcHkgZGF0YSAqLworCQltZW1jcHkoc2tiX3B1dChza2Isc2l6ZSksIGJ1ZiArIGxlbiwgc2l6ZSk7CisKKwkJY291bnQgLT0gc2l6ZTsKKwkJbGVuICs9IHNpemU7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKworCS8qICAgICAKKwkgKiBTY2hlZHVsZSBhIG5ldyB0aHJlYWQgd2hpY2ggd2lsbCB0cmFuc21pdCB0aGUgZnJhbWUgYXMgc29vbgorCSAqIGFzIHBvc3NpYmxlLCBidXQgYXQgYSBzYWZlIHBvaW50IGluIHRpbWUuIFdlIGRvIHRoaXMgc28gdGhlCisJICogInVzZXIiIGNhbiBnaXZlIHVzIGRhdGEgbXVsdGlwbGUgdGltZXMsIGFzIFBQUCBkb2VzIChiZWNhdXNlIG9mCisJICogaXRzIDI1NiBieXRlIHR4IGJ1ZmZlcikuIFdlIHdpbGwgdGhlbiBkZWZyYWdtZW50IGFuZCBzZW5kIG91dAorCSAqIGFsbCB0aGlzIGRhdGEgYXMgb25lIHNpbmdsZSBwYWNrZXQuICAKKwkgKi8KKwlzY2hlZHVsZV93b3JrKCZzZWxmLT50cXVldWUpOworCQorCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X3dyaXRlX3Jvb20gKHR0eSkKKyAqCisgKiAgICBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgbnVtYmVycyBvZiBjaGFyYWN0ZXJzIHRoZSB0dHkgZHJpdmVyIHdpbGwKKyAqICAgIGFjY2VwdCBmb3IgcXVldWluZyB0byBiZSB3cml0dGVuLiBUaGlzIG51bWJlciBpcyBzdWJqZWN0IHRvIGNoYW5nZSBhcworICogICAgb3V0cHV0IGJ1ZmZlcnMgZ2V0IGVtcHRpZWQsIG9yIGlmIHRoZSBvdXRwdXQgZmxvdyBjb250cm9sIGlzIGFjdGVkLgorICovCitzdGF0aWMgaW50IGlyY29tbV90dHlfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm4gLTE7KTsKKworI2lmZGVmIElSQ09NTV9OT19UWF9CRUZPUkVfSU5JVAorCS8qIG1heF9oZWFkZXJfc2l6ZSB0ZWxscyB1cyBpZiB0aGUgY2hhbm5lbCBpcyBpbml0aWFsaXNlZCBvciBub3QuICovCisJaWYgKHNlbGYtPm1heF9oZWFkZXJfc2l6ZSA9PSBJUkNPTU1fVFRZX0hEUl9VTklOSVRJQUxJU0VEKQorCQkvKiBEb24ndCBib3RoZXIgdXMgeWV0ICovCisJCXJldHVybiAwOworI2VuZGlmCisKKwkvKiBDaGVjayBpZiB3ZSBhcmUgYWxsb3dlZCB0byB0cmFuc21pdCBhbnkgZGF0YS4KKwkgKiBod19zdG9wcGVkIGlzIHRoZSByZWd1bGFyIGZsb3cgY29udHJvbC4KKwkgKiBKZWFuIElJICovCisJaWYgKHR0eS0+aHdfc3RvcHBlZCkKKwkJcmV0ID0gMDsKKwllbHNlIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisJCWlmIChzZWxmLT50eF9za2IpCisJCQlyZXQgPSBzZWxmLT50eF9kYXRhX3NpemUgLSBzZWxmLT50eF9za2ItPmxlbjsKKwkJZWxzZQorCQkJcmV0ID0gc2VsZi0+bWF4X2RhdGFfc2l6ZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKwl9CisJSVJEQV9ERUJVRygyLCAiJXMoKSwgcmV0PSVkXG4iLCBfX0ZVTkNUSU9OX18gLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfd2FpdF91bnRpbF9zZW50ICh0dHksIHRpbWVvdXQpCisgKgorICogICAgVGhpcyByb3V0aW5lIHdhaXRzIHVudGlsIHRoZSBkZXZpY2UgaGFzIHdyaXR0ZW4gb3V0IGFsbCBvZiB0aGUKKyAqICAgIGNoYXJhY3RlcnMgaW4gaXRzIHRyYW5zbWl0dGVyIEZJRk8uCisgKi8KK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQoreworCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBvcmlnX2ppZmZpZXMsIHBvbGxfdGltZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm47KTsKKworCW9yaWdfamlmZmllcyA9IGppZmZpZXM7CisKKwkvKiBTZXQgcG9sbCB0aW1lIHRvIDIwMCBtcyAqLworCXBvbGxfdGltZSA9IElSREFfTUlOKHRpbWVvdXQsIG1zZWNzX3RvX2ppZmZpZXMoMjAwKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKwl3aGlsZSAoc2VsZi0+dHhfc2tiICYmIHNlbGYtPnR4X3NrYi0+bGVuKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQlzY2hlZHVsZV90aW1lb3V0KHBvbGxfdGltZSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJaWYgKHRpbWVvdXQgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBvcmlnX2ppZmZpZXMgKyB0aW1lb3V0KSkKKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV90aHJvdHRsZSAodHR5KQorICoKKyAqICAgIFRoaXMgcm91dGluZSBub3RpZmllcyB0aGUgdHR5IGRyaXZlciB0aGF0IGlucHV0IGJ1ZmZlcnMgZm9yIHRoZSBsaW5lCisgKiAgICBkaXNjaXBsaW5lIGFyZSBjbG9zZSB0byBmdWxsLCBhbmQgaXQgc2hvdWxkIHNvbWVob3cgc2lnbmFsIHRoYXQgbm8KKyAqICAgIG1vcmUgY2hhcmFjdGVycyBzaG91bGQgYmUgc2VudCB0byB0aGUgdHR5LiAgCisgKi8KK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSB0dHktPmRyaXZlcl9kYXRhOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybjspOworCisJLyogU29mdHdhcmUgZmxvdyBjb250cm9sPyAqLworCWlmIChJX0lYT0ZGKHR0eSkpCisJCWlyY29tbV90dHlfc2VuZF94Y2hhcih0dHksIFNUT1BfQ0hBUih0dHkpKTsKKwkKKwkvKiBIYXJkd2FyZSBmbG93IGNvbnRyb2w/ICovCisJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKKwkJc2VsZi0+c2V0dGluZ3MuZHRlICY9IH5JUkNPTU1fUlRTOworCQlzZWxmLT5zZXR0aW5ncy5kdGUgfD0gSVJDT01NX0RFTFRBX1JUUzsKKwkKKwkJaXJjb21tX3BhcmFtX3JlcXVlc3Qoc2VsZiwgSVJDT01NX0RURSwgVFJVRSk7CisJfQorCisgICAgICAgIGlyY29tbV9mbG93X3JlcXVlc3Qoc2VsZi0+aXJjb21tLCBGTE9XX1NUT1ApOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV91bnRocm90dGxlICh0dHkpCisgKgorICogICAgVGhpcyByb3V0aW5lIG5vdGlmaWVzIHRoZSB0dHkgZHJpdmVycyB0aGF0IGl0IHNob3VsZCBzaWduYWxzIHRoYXQKKyAqICAgIGNoYXJhY3RlcnMgY2FuIG5vdyBiZSBzZW50IHRvIHRoZSB0dHkgd2l0aG91dCBmZWFyIG9mIG92ZXJydW5uaW5nIHRoZQorICogICAgaW5wdXQgYnVmZmVycyBvZiB0aGUgbGluZSBkaXNjaXBsaW5lcy4KKyAqLworc3RhdGljIHZvaWQgaXJjb21tX3R0eV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm47KTsKKworCS8qIFVzaW5nIHNvZnR3YXJlIGZsb3cgY29udHJvbD8gKi8KKwlpZiAoSV9JWE9GRih0dHkpKSB7CisJCWlyY29tbV90dHlfc2VuZF94Y2hhcih0dHksIFNUQVJUX0NIQVIodHR5KSk7CisJfQorCisJLyogVXNpbmcgaGFyZHdhcmUgZmxvdyBjb250cm9sPyAqLworCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCXNlbGYtPnNldHRpbmdzLmR0ZSB8PSAoSVJDT01NX1JUU3xJUkNPTU1fREVMVEFfUlRTKTsKKworCQlpcmNvbW1fcGFyYW1fcmVxdWVzdChzZWxmLCBJUkNPTU1fRFRFLCBUUlVFKTsKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgRkxPV19TVEFSVFxuIiwgX19GVU5DVElPTl9fICk7CisJfQorICAgICAgICBpcmNvbW1fZmxvd19yZXF1ZXN0KHNlbGYtPmlyY29tbSwgRkxPV19TVEFSVCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X2NoYXJzX2luX2J1ZmZlciAodHR5KQorICoKKyAqICAgIEluZGljYXRlcyBpZiB0aGVyZSBhcmUgYW55IGRhdGEgaW4gdGhlIGJ1ZmZlcgorICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fdHR5X2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbGVuID0gMDsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKworCWlmIChzZWxmLT50eF9za2IpCisJCWxlbiA9IHNlbGYtPnR4X3NrYi0+bGVuOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfc2h1dGRvd24oc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuOyk7CisKKwlJUkRBX0RFQlVHKDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KEFTWU5DX0JfSU5JVElBTElaRUQsICZzZWxmLT5mbGFncykpCisJCXJldHVybjsKKworCWlyY29tbV90dHlfZGV0YWNoX2NhYmxlKHNlbGYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKKwkKKwkvKiBGcmVlIHBhcmFtZXRlciBidWZmZXIgKi8KKwlpZiAoc2VsZi0+Y3RybF9za2IpIHsKKwkJZGV2X2tmcmVlX3NrYihzZWxmLT5jdHJsX3NrYik7CisJCXNlbGYtPmN0cmxfc2tiID0gTlVMTDsKKwl9CisKKwkvKiBGcmVlIHRyYW5zbWl0IGJ1ZmZlciAqLworCWlmIChzZWxmLT50eF9za2IpIHsKKwkJZGV2X2tmcmVlX3NrYihzZWxmLT50eF9za2IpOworCQlzZWxmLT50eF9za2IgPSBOVUxMOworCX0KKworCWlmIChzZWxmLT5pcmNvbW0pIHsKKwkJaXJjb21tX2Nsb3NlKHNlbGYtPmlyY29tbSk7CisJCXNlbGYtPmlyY29tbSA9IE5VTEw7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfaGFuZ3VwICh0dHkpCisgKgorICogICAgVGhpcyByb3V0aW5lIG5vdGlmaWVzIHRoZSB0dHkgZHJpdmVyIHRoYXQgaXQgc2hvdWxkIGhhbmd1cCB0aGUgdHR5CisgKiAgICBkZXZpY2UuCisgKiAKKyAqLworc3RhdGljIHZvaWQgaXJjb21tX3R0eV9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlJUkRBX0RFQlVHKDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuOyk7CisKKwlpZiAoIXR0eSkKKwkJcmV0dXJuOworCisJLyogaXJjb21tX3R0eV9mbHVzaF9idWZmZXIodHR5KTsgKi8KKwlpcmNvbW1fdHR5X3NodXRkb3duKHNlbGYpOworCisJLyogSSBndWVzcyB3ZSBuZWVkIHRvIGxvY2sgaGVyZSAtIEplYW4gSUkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKwlzZWxmLT5mbGFncyAmPSB+QVNZTkNfTk9STUFMX0FDVElWRTsKKwlzZWxmLT50dHkgPSBOVUxMOworCXNlbGYtPm9wZW5fY291bnQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNlbGYtPm9wZW5fd2FpdCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X3NlbmRfeGNoYXIgKHR0eSwgY2gpCisgKgorICogICAgVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gc2VuZCBhIGhpZ2gtcHJpb3JpdHkgWE9OL1hPRkYgY2hhcmFjdGVyIHRvCisgKiAgICB0aGUgZGV2aWNlLgorICovCitzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X3NlbmRfeGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCkKK3sKKwlJUkRBX0RFQlVHKDAsICIlcygpLCBub3QgaW1wbFxuIiwgX19GVU5DVElPTl9fICk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X3N0YXJ0ICh0dHkpCisgKgorICogICAgVGhpcyByb3V0aW5lIG5vdGlmaWVzIHRoZSB0dHkgZHJpdmVyIHRoYXQgaXQgcmVzdW1lIHNlbmRpbmcKKyAqICAgIGNoYXJhY3RlcnMgdG8gdGhlIHR0eSBkZXZpY2UuICAKKyAqLwordm9pZCBpcmNvbW1fdHR5X3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCWlyY29tbV9mbG93X3JlcXVlc3Qoc2VsZi0+aXJjb21tLCBGTE9XX1NUQVJUKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfc3RvcCAodHR5KQorICoKKyAqICAgICBUaGlzIHJvdXRpbmUgbm90aWZpZXMgdGhlIHR0eSBkcml2ZXIgdGhhdCBpdCBzaG91bGQgc3RvcCBvdXRwdXR0aW5nCisgKiAgICAgY2hhcmFjdGVycyB0byB0aGUgdHR5IGRldmljZS4gCisgKi8KK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KSAKK3sKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSB0dHktPmRyaXZlcl9kYXRhOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm47KTsKKworCWlyY29tbV9mbG93X3JlcXVlc3Qoc2VsZi0+aXJjb21tLCBGTE9XX1NUT1ApOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX2NoZWNrX21vZGVtX3N0YXR1cyAoc2VsZikKKyAqCisgKiAgICBDaGVjayBmb3IgYW55IGNoYW5nZXMgaW4gdGhlIERDRSdzIGxpbmUgc2V0dGluZ3MuIFRoaXMgZnVuY3Rpb24gc2hvdWxkCisgKiAgICBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlIGRjZSBwYXJhbWV0ZXIgc2V0dGluZ3MgY2hhbmdlcywgdG8gdXBkYXRlIHRoZQorICogICAgZmxvdyBjb250cm9sIHNldHRpbmdzIGFuZCBvdGhlciB0aGluZ3MKKyAqLwordm9pZCBpcmNvbW1fdHR5X2NoZWNrX21vZGVtX3N0YXR1cyhzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZikKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCWludCBzdGF0dXM7CisKKwlJUkRBX0RFQlVHKDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuOyk7CisKKwl0dHkgPSBzZWxmLT50dHk7CisKKwlzdGF0dXMgPSBzZWxmLT5zZXR0aW5ncy5kY2U7CisKKwlpZiAoc3RhdHVzICYgSVJDT01NX0RDRV9ERUxUQV9BTlkpIHsKKwkJLyp3YWtlX3VwX2ludGVycnVwdGlibGUoJnNlbGYtPmRlbHRhX21zcl93YWl0KTsqLworCX0KKwlpZiAoKHNlbGYtPmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpICYmIChzdGF0dXMgJiBJUkNPTU1fREVMVEFfQ0QpKSB7CisJCUlSREFfREVCVUcoMiwgCisJCQkgICAiJXMoKSwgaXJjb21tJWQgQ0Qgbm93ICVzLi4uXG4iLCBfX0ZVTkNUSU9OX18gLCBzZWxmLT5saW5lLAorCQkJICAgKHN0YXR1cyAmIElSQ09NTV9DRCkgPyAib24iIDogIm9mZiIpOworCisJCWlmIChzdGF0dXMgJiBJUkNPTU1fQ0QpIHsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2VsZi0+b3Blbl93YWl0KTsKKwkJfSBlbHNlIHsKKwkJCUlSREFfREVCVUcoMiwgCisJCQkJICAgIiVzKCksIERvaW5nIHNlcmlhbCBoYW5ndXAuLlxuIiwgX19GVU5DVElPTl9fICk7CisJCQlpZiAodHR5KQorCQkJCXR0eV9oYW5ndXAodHR5KTsKKworCQkJLyogSGFuZ3VwIHdpbGwgcmVtb3RlIHRoZSB0dHksIHNvIGJldHRlciBicmVhayBvdXQgKi8KKwkJCXJldHVybjsKKwkJfQorCX0KKwlpZiAoc2VsZi0+ZmxhZ3MgJiBBU1lOQ19DVFNfRkxPVykgeworCQlpZiAodHR5LT5od19zdG9wcGVkKSB7CisJCQlpZiAoc3RhdHVzICYgSVJDT01NX0NUUykgeworCQkJCUlSREFfREVCVUcoMiwgCisJCQkJCSAgICIlcygpLCBDVFMgdHggc3RhcnQuLi5cbiIsIF9fRlVOQ1RJT05fXyApOworCQkJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCQkJCisJCQkJLyogV2FrZSB1cCBwcm9jZXNzZXMgYmxvY2tlZCBvbiBvcGVuICovCisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZWxmLT5vcGVuX3dhaXQpOworCisJCQkJc2NoZWR1bGVfd29yaygmc2VsZi0+dHF1ZXVlKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoIShzdGF0dXMgJiBJUkNPTU1fQ1RTKSkgeworCQkJCUlSREFfREVCVUcoMiwgCisJCQkJCSAgICIlcygpLCBDVFMgdHggc3RvcC4uLlxuIiwgX19GVU5DVElPTl9fICk7CisJCQkJdHR5LT5od19zdG9wcGVkID0gMTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfZGF0YV9pbmRpY2F0aW9uIChpbnN0YW5jZSwgc2FwLCBza2IpCisgKgorICogICAgSGFuZGxlIGluY29taW5nIGRhdGEsIGFuZCBkZWxpdmVyIGl0IHRvIHRoZSBsaW5lIGRpc2NpcGxpbmUKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJjb21tX3R0eV9kYXRhX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIGluc3RhbmNlOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlpZiAoIXNlbGYtPnR0eSkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBubyB0dHkhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogCisJICogSWYgd2UgcmVjZWl2ZSBkYXRhIHdoZW4gaGFyZHdhcmUgaXMgc3RvcHBlZCB0aGVuIHNvbWV0aGluZyBpcyB3cm9uZy4KKwkgKiBXZSB0cnkgdG8gcG9sbCB0aGUgcGVlcnMgbGluZSBzZXR0aW5ncyB0byBjaGVjayBpZiB3ZSBhcmUgdXAgdG9kYXRlLgorCSAqIERldmljZXMgbGlrZSBXaW5DRSBjYW4gZG8gdGhpcywgYW5kIHNpbmNlIHRoZXkgZG9uJ3Qgc2VuZCBhbnkgCisJICogcGFyYW1zLCB3ZSBjYW4ganVzdCBhcyB3ZWxsIGRlY2xhcmUgdGhlIGhhcmR3YXJlIGZvciBydW5uaW5nLgorCSAqLworCWlmIChzZWxmLT50dHktPmh3X3N0b3BwZWQgJiYgKHNlbGYtPmZsb3cgPT0gRkxPV19TVEFSVCkpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgcG9sbGluZyBmb3IgbGluZSBzZXR0aW5ncyFcbiIsIF9fRlVOQ1RJT05fXyApOworCQlpcmNvbW1fcGFyYW1fcmVxdWVzdChzZWxmLCBJUkNPTU1fUE9MTCwgVFJVRSk7CisKKwkJLyogV2UgY2FuIGp1c3QgYXMgd2VsbCBkZWNsYXJlIHRoZSBoYXJkd2FyZSBmb3IgcnVubmluZyAqLworCQlpcmNvbW1fdHR5X3NlbmRfaW5pdGlhbF9wYXJhbWV0ZXJzKHNlbGYpOworCQlpcmNvbW1fdHR5X2xpbmtfZXN0YWJsaXNoZWQoc2VsZik7CisJfQorCisJLyogCisJICogSnVzdCBnaXZlIGl0IG92ZXIgdG8gdGhlIGxpbmUgZGlzY2lwbGluZS4gVGhlcmUgaXMgbm8gbmVlZCB0bworCSAqIGludm9sdmUgdGhlIGZsaXAgYnVmZmVycywgc2luY2Ugd2UgYXJlIG5vdCBydW5uaW5nIGluIGFuIGludGVycnVwdCAKKwkgKiBoYW5kbGVyCisJICovCisJc2VsZi0+dHR5LT5sZGlzYy5yZWNlaXZlX2J1ZihzZWxmLT50dHksIHNrYi0+ZGF0YSwgTlVMTCwgc2tiLT5sZW4pOworCisJLyogTm8gbmVlZCB0byBrZnJlZV9za2IgLSBzZWUgaXJjb21tX3R0cF9kYXRhX2luZGljYXRpb24oKSAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X2NvbnRyb2xfaW5kaWNhdGlvbiAoaW5zdGFuY2UsIHNhcCwgc2tiKQorICoKKyAqICAgIFBhcnNlIGFsbCBpbmNvbWluZyBwYXJhbWV0ZXJzIChlYXN5ISkKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJjb21tX3R0eV9jb250cm9sX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKKwkJCQkJIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgaW5zdGFuY2U7CisJaW50IGNsZW47CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCWNsZW4gPSBza2ItPmRhdGFbMF07CisKKwlpcmRhX3BhcmFtX2V4dHJhY3RfYWxsKHNlbGYsIHNrYi0+ZGF0YSsxLCBJUkRBX01JTihza2ItPmxlbi0xLCBjbGVuKSwgCisJCQkgICAgICAgJmlyY29tbV9wYXJhbV9pbmZvKTsKKworCS8qIE5vIG5lZWQgdG8ga2ZyZWVfc2tiIC0gc2VlIGlyY29tbV9jb250cm9sX2luZGljYXRpb24oKSAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X2Zsb3dfaW5kaWNhdGlvbiAoaW5zdGFuY2UsIHNhcCwgY21kKQorICoKKyAqICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IElyVFRQIHdoZW4gaXQgd2FudHMgdXMgdG8gc2xvdyBkb3duIHRoZQorICogICAgdHJhbnNtaXNzaW9uIG9mIGRhdGEuIFdlIGp1c3QgbWFyayB0aGUgaGFyZHdhcmUgYXMgc3RvcHBlZCwgYW5kIHdhaXQKKyAqICAgIGZvciBJclRUUCB0byBub3RpZnkgdXMgdGhhdCB0aGluZ3MgYXJlIE9LIGFnYWluLgorICovCitzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X2Zsb3dfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCAKKwkJCQkgICAgICAgTE9DQUxfRkxPVyBjbWQpCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgaW5zdGFuY2U7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuOyk7CisKKwl0dHkgPSBzZWxmLT50dHk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRkxPV19TVEFSVDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgaHcgc3RhcnQhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJdHR5LT5od19zdG9wcGVkID0gMDsKKworCQkvKiBpcmNvbW1fdHR5X2RvX3NvZnRpbnQgd2lsbCB0YWtlIGNhcmUgb2YgdGhlIHJlc3QgKi8KKwkJc2NoZWR1bGVfd29yaygmc2VsZi0+dHF1ZXVlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDogIC8qIElmIHdlIGdldCBoZXJlLCBzb21ldGhpbmcgaXMgdmVyeSB3cm9uZywgYmV0dGVyIHN0b3AgKi8KKwljYXNlIEZMT1dfU1RPUDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgaHcgc3RvcHBlZCFcbiIsIF9fRlVOQ1RJT05fXyApOworCQl0dHktPmh3X3N0b3BwZWQgPSAxOworCQlicmVhazsKKwl9CisJc2VsZi0+ZmxvdyA9IGNtZDsKK30KKworc3RhdGljIGludCBpcmNvbW1fdHR5X2xpbmVfaW5mbyhzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiwgY2hhciAqYnVmKQoreworICAgICAgICBpbnQgIHJldD0wOworCisJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIlN0YXRlOiAlc1xuIiwgaXJjb21tX3R0eV9zdGF0ZVtzZWxmLT5zdGF0ZV0pOworCisJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIlNlcnZpY2UgdHlwZTogIik7CisJaWYgKHNlbGYtPnNlcnZpY2VfdHlwZSAmIElSQ09NTV85X1dJUkUpCisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICI5X1dJUkUiKTsKKwllbHNlIGlmIChzZWxmLT5zZXJ2aWNlX3R5cGUgJiBJUkNPTU1fM19XSVJFKQorCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiM19XSVJFIik7CisJZWxzZSBpZiAoc2VsZi0+c2VydmljZV90eXBlICYgSVJDT01NXzNfV0lSRV9SQVcpCisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICIzX1dJUkVfUkFXIik7CisJZWxzZQorCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiTm8gY29tbW9uIHNlcnZpY2UgdHlwZSFcbiIpOworICAgICAgICByZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiXG4iKTsKKworCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJQb3J0IG5hbWU6ICVzXG4iLCBzZWxmLT5zZXR0aW5ncy5wb3J0X25hbWUpOworCisJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIkRURSBzdGF0dXM6ICIpOwkKKyAgICAgICAgaWYgKHNlbGYtPnNldHRpbmdzLmR0ZSAmIElSQ09NTV9SVFMpCisgICAgICAgICAgICAgICAgcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIlJUU3wiKTsKKyAgICAgICAgaWYgKHNlbGYtPnNldHRpbmdzLmR0ZSAmIElSQ09NTV9EVFIpCisgICAgICAgICAgICAgICAgcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIkRUUnwiKTsKKwlpZiAoc2VsZi0+c2V0dGluZ3MuZHRlKQorCQlyZXQtLTsgLyogcmVtb3ZlIHRoZSBsYXN0IHwgKi8KKyAgICAgICAgcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIlxuIik7CisKKwlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiRENFIHN0YXR1czogIik7CisgICAgICAgIGlmIChzZWxmLT5zZXR0aW5ncy5kY2UgJiBJUkNPTU1fQ1RTKQorICAgICAgICAgICAgICAgIHJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJDVFN8Iik7CisgICAgICAgIGlmIChzZWxmLT5zZXR0aW5ncy5kY2UgJiBJUkNPTU1fRFNSKQorICAgICAgICAgICAgICAgIHJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJEU1J8Iik7CisgICAgICAgIGlmIChzZWxmLT5zZXR0aW5ncy5kY2UgJiBJUkNPTU1fQ0QpCisgICAgICAgICAgICAgICAgcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIkNEfCIpOworICAgICAgICBpZiAoc2VsZi0+c2V0dGluZ3MuZGNlICYgSVJDT01NX1JJKSAKKyAgICAgICAgICAgICAgICByZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiUkl8Iik7CisJaWYgKHNlbGYtPnNldHRpbmdzLmRjZSkKKwkJcmV0LS07IC8qIHJlbW92ZSB0aGUgbGFzdCB8ICovCisgICAgICAgIHJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJcbiIpOworCisJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIkNvbmZpZ3VyYXRpb246ICIpOworCWlmICghc2VsZi0+c2V0dGluZ3MubnVsbF9tb2RlbSkKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIkRURSA8LT4gRENFXG4iKTsKKwllbHNlCisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsIAorCQkJICAgICAgICJEVEUgPC0+IERURSAobnVsbCBtb2RlbSBlbXVsYXRpb24pXG4iKTsKKworCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJEYXRhIHJhdGU6ICVkXG4iLCBzZWxmLT5zZXR0aW5ncy5kYXRhX3JhdGUpOworCisJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIkZsb3cgY29udHJvbDogIik7CisJaWYgKHNlbGYtPnNldHRpbmdzLmZsb3dfY29udHJvbCAmIElSQ09NTV9YT05fWE9GRl9JTikKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIlhPTl9YT0ZGX0lOfCIpOworCWlmIChzZWxmLT5zZXR0aW5ncy5mbG93X2NvbnRyb2wgJiBJUkNPTU1fWE9OX1hPRkZfT1VUKQorCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiWE9OX1hPRkZfT1VUfCIpOworCWlmIChzZWxmLT5zZXR0aW5ncy5mbG93X2NvbnRyb2wgJiBJUkNPTU1fUlRTX0NUU19JTikKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIlJUU19DVFNfSU58Iik7CisJaWYgKHNlbGYtPnNldHRpbmdzLmZsb3dfY29udHJvbCAmIElSQ09NTV9SVFNfQ1RTX09VVCkKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIlJUU19DVFNfT1VUfCIpOworCWlmIChzZWxmLT5zZXR0aW5ncy5mbG93X2NvbnRyb2wgJiBJUkNPTU1fRFNSX0RUUl9JTikKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIkRTUl9EVFJfSU58Iik7CisJaWYgKHNlbGYtPnNldHRpbmdzLmZsb3dfY29udHJvbCAmIElSQ09NTV9EU1JfRFRSX09VVCkKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIkRTUl9EVFJfT1VUfCIpOworCWlmIChzZWxmLT5zZXR0aW5ncy5mbG93X2NvbnRyb2wgJiBJUkNPTU1fRU5RX0FDS19JTikKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIkVOUV9BQ0tfSU58Iik7CisJaWYgKHNlbGYtPnNldHRpbmdzLmZsb3dfY29udHJvbCAmIElSQ09NTV9FTlFfQUNLX09VVCkKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIkVOUV9BQ0tfT1VUfCIpOworCWlmIChzZWxmLT5zZXR0aW5ncy5mbG93X2NvbnRyb2wpCisJCXJldC0tOyAvKiByZW1vdmUgdGhlIGxhc3QgfCAqLworICAgICAgICByZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiXG4iKTsKKworCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJGbGFnczogIik7CisJaWYgKHNlbGYtPmZsYWdzICYgQVNZTkNfQ1RTX0ZMT1cpCisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJBU1lOQ19DVFNfRkxPV3wiKTsKKwlpZiAoc2VsZi0+ZmxhZ3MgJiBBU1lOQ19DSEVDS19DRCkKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIkFTWU5DX0NIRUNLX0NEfCIpOworCWlmIChzZWxmLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKQorCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiQVNZTkNfSU5JVElBTElaRUR8Iik7CisJaWYgKHNlbGYtPmZsYWdzICYgQVNZTkNfTE9XX0xBVEVOQ1kpCisJCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJBU1lOQ19MT1dfTEFURU5DWXwiKTsKKwlpZiAoc2VsZi0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKQorCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiQVNZTkNfQ0xPU0lOR3wiKTsKKwlpZiAoc2VsZi0+ZmxhZ3MgJiBBU1lOQ19OT1JNQUxfQUNUSVZFKQorCQlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiQVNZTkNfTk9STUFMX0FDVElWRXwiKTsKKwlpZiAoc2VsZi0+ZmxhZ3MpCisJCXJldC0tOyAvKiByZW1vdmUgdGhlIGxhc3QgfCAqLworCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJcbiIpOworCisJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIlJvbGU6ICVzXG4iLCBzZWxmLT5jbGllbnQgPyAKKwkJICAgICAgICJjbGllbnQiIDogInNlcnZlciIpOworCXJldCArPSBzcHJpbnRmKGJ1ZityZXQsICJPcGVuIGNvdW50OiAlZFxuIiwgc2VsZi0+b3Blbl9jb3VudCk7CisJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIk1heCBkYXRhIHNpemU6ICVkXG4iLCBzZWxmLT5tYXhfZGF0YV9zaXplKTsKKwlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiTWF4IGhlYWRlciBzaXplOiAlZFxuIiwgc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKKwkJCisJaWYgKHNlbGYtPnR0eSkKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIkhhcmR3YXJlOiAlc1xuIiwgCisJCQkgICAgICAgc2VsZi0+dHR5LT5od19zdG9wcGVkID8gIlN0b3BwZWQiIDogIlJ1bm5pbmciKTsKKworICAgICAgICByZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKK30KKworCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV9yZWFkX3Byb2MgKGJ1Ziwgc3RhcnQsIG9mZnNldCwgbGVuLCBlb2YsIHVudXNlZCkKKyAqCisgKiAgICAKKyAqCisgKi8KKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIGludCBpcmNvbW1fdHR5X3JlYWRfcHJvYyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuLAorCQkJCWludCAqZW9mLCB2b2lkICp1bnVzZWQpCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGY7CisgICAgICAgIGludCBjb3VudCA9IDAsIGw7CisgICAgICAgIG9mZl90IGJlZ2luID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlyY29tbV90dHktPmhiX3NwaW5sb2NrLCBmbGFncyk7CisKKwlzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGlyY29tbV90dHkpOworCXdoaWxlICgoc2VsZiAhPSBOVUxMKSAmJiAoY291bnQgPCA0MDAwKSkgeworCQlpZiAoc2VsZi0+bWFnaWMgIT0gSVJDT01NX1RUWV9NQUdJQykKKwkJCWJyZWFrOworCisgICAgICAgICAgICAgICAgbCA9IGlyY29tbV90dHlfbGluZV9pbmZvKHNlbGYsIGJ1ZiArIGNvdW50KTsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBsOworICAgICAgICAgICAgICAgIGlmIChjb3VudCtiZWdpbiA+IG9mZnNldCtsZW4pCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50K2JlZ2luIDwgb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbiArPSBjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB9CisJCQkJCisJCXNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgaGFzaGJpbl9nZXRfbmV4dChpcmNvbW1fdHR5KTsKKyAgICAgICAgfQorICAgICAgICAqZW9mID0gMTsKK2RvbmU6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJjb21tX3R0eS0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKworICAgICAgICBpZiAob2Zmc2V0ID49IGNvdW50K2JlZ2luKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAqc3RhcnQgPSBidWYgKyAob2Zmc2V0LWJlZ2luKTsKKyAgICAgICAgcmV0dXJuICgobGVuIDwgYmVnaW4rY291bnQtb2Zmc2V0KSA/IGxlbiA6IGJlZ2luK2NvdW50LW9mZnNldCk7Cit9CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJckNPTU0gc2VyaWFsIFRUWSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19DSEFSREVWX01BSk9SKElSQ09NTV9UVFlfTUFKT1IpOworCittb2R1bGVfaW5pdChpcmNvbW1fdHR5X2luaXQpOworbW9kdWxlX2V4aXQoaXJjb21tX3R0eV9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lyY29tbS9pcmNvbW1fdHR5X2F0dGFjaC5jIGIvbmV0L2lyZGEvaXJjb21tL2lyY29tbV90dHlfYXR0YWNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmNWVkZAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lyY29tbS9pcmNvbW1fdHR5X2F0dGFjaC5jCkBAIC0wLDAgKzEsMTAwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBpcmNvbW1fdHR5X2F0dGFjaC5jCisgKiBWZXJzaW9uOiAgICAgICAKKyAqIERlc2NyaXB0aW9uOiAgIENvZGUgZm9yIGF0dGFjaGluZyB0aGUgc2VyaWFsIGRyaXZlciB0byBJckNPTU0KKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFNhdCBKdW4gIDUgMTc6NDI6MDAgMTk5OQorICogTW9kaWZpZWQgYXQ6ICAgVHVlIEphbiAgNCAxNDoyMDo0OSAyMDAwCisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMCBEYWcgQnJhdHRsaSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CisgKiAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIAorICogICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICogICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJ0dHAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhc19vYmplY3QuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9wYXJhbWV0ZXJzLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmNvbW1fY29yZS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyY29tbV9wYXJhbS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyY29tbV9ldmVudC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJjb21tX3R0eS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyY29tbV90dHlfYXR0YWNoLmg+CisKK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfaWFzX3JlZ2lzdGVyKHN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmKTsKK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfZGlzY292ZXJ5X2luZGljYXRpb24oZGlzY2luZm9fdCAqZGlzY292ZXJ5LAorCQkJCQkgICAgRElTQ09WRVJZX01PREUgbW9kZSwKKwkJCQkJICAgIHZvaWQgKnByaXYpOworc3RhdGljIHZvaWQgaXJjb21tX3R0eV9nZXR2YWx1ZV9jb25maXJtKGludCByZXN1bHQsIF9fdTE2IG9ial9pZCwgCisJCQkJCXN0cnVjdCBpYXNfdmFsdWUgKnZhbHVlLCB2b2lkICpwcml2KTsKK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfc3RhcnRfd2F0Y2hkb2dfdGltZXIoc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYsCisJCQkJCSAgICBpbnQgdGltZW91dCk7CitzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X3dhdGNoZG9nX3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSk7CisKK3N0YXRpYyBpbnQgaXJjb21tX3R0eV9zdGF0ZV9pZGxlKHN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmLCAKKwkJCQkgSVJDT01NX1RUWV9FVkVOVCBldmVudCwgCisJCQkJIHN0cnVjdCBza19idWZmICpza2IsIAorCQkJCSBzdHJ1Y3QgaXJjb21tX3R0eV9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgaXJjb21tX3R0eV9zdGF0ZV9zZWFyY2goc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYsIAorCQkJCSAgIElSQ09NTV9UVFlfRVZFTlQgZXZlbnQsIAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsIAorCQkJCSAgIHN0cnVjdCBpcmNvbW1fdHR5X2luZm8gKmluZm8pOworc3RhdGljIGludCBpcmNvbW1fdHR5X3N0YXRlX3F1ZXJ5X3BhcmFtZXRlcnMoc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYsIAorCQkJCQkgICAgIElSQ09NTV9UVFlfRVZFTlQgZXZlbnQsIAorCQkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsIAorCQkJCQkgICAgIHN0cnVjdCBpcmNvbW1fdHR5X2luZm8gKmluZm8pOworc3RhdGljIGludCBpcmNvbW1fdHR5X3N0YXRlX3F1ZXJ5X2xzYXBfc2VsKHN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmLCAKKwkJCQkJICAgSVJDT01NX1RUWV9FVkVOVCBldmVudCwgCisJCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsIAorCQkJCQkgICBzdHJ1Y3QgaXJjb21tX3R0eV9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgaXJjb21tX3R0eV9zdGF0ZV9zZXR1cChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiwgCisJCQkJICBJUkNPTU1fVFRZX0VWRU5UIGV2ZW50LCAKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IsIAorCQkJCSAgc3RydWN0IGlyY29tbV90dHlfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50IGlyY29tbV90dHlfc3RhdGVfcmVhZHkoc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYsIAorCQkJCSAgSVJDT01NX1RUWV9FVkVOVCBldmVudCwgCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAKKwkJCQkgIHN0cnVjdCBpcmNvbW1fdHR5X2luZm8gKmluZm8pOworCitjaGFyICppcmNvbW1fdHR5X3N0YXRlW10gPSB7CisJIklSQ09NTV9UVFlfSURMRSIsCisJIklSQ09NTV9UVFlfU0VBUkNIIiwKKwkiSVJDT01NX1RUWV9RVUVSWV9QQVJBTUVURVJTIiwKKwkiSVJDT01NX1RUWV9RVUVSWV9MU0FQX1NFTCIsCisJIklSQ09NTV9UVFlfU0VUVVAiLAorCSJJUkNPTU1fVFRZX1JFQURZIiwKKwkiKioqIEVSUk9SICoqKiAiLAorfTsKKworI2lmZGVmIENPTkZJR19JUkRBX0RFQlVHCitzdGF0aWMgY2hhciAqaXJjb21tX3R0eV9ldmVudFtdID0geworCSJJUkNPTU1fVFRZX0FUVEFDSF9DQUJMRSIsCisJIklSQ09NTV9UVFlfREVUQUNIX0NBQkxFIiwKKwkiSVJDT01NX1RUWV9EQVRBX1JFUVVFU1QiLAorCSJJUkNPTU1fVFRZX0RBVEFfSU5ESUNBVElPTiIsCisJIklSQ09NTV9UVFlfRElTQ09WRVJZX1JFUVVFU1QiLAorCSJJUkNPTU1fVFRZX0RJU0NPVkVSWV9JTkRJQ0FUSU9OIiwKKwkiSVJDT01NX1RUWV9DT05ORUNUX0NPTkZJUk0iLAorCSJJUkNPTU1fVFRZX0NPTk5FQ1RfSU5ESUNBVElPTiIsCisJIklSQ09NTV9UVFlfRElTQ09OTkVDVF9SRVFVRVNUIiwKKwkiSVJDT01NX1RUWV9ESVNDT05ORUNUX0lORElDQVRJT04iLAorCSJJUkNPTU1fVFRZX1dEX1RJTUVSX0VYUElSRUQiLAorCSJJUkNPTU1fVFRZX0dPVF9QQVJBTUVURVJTIiwKKwkiSVJDT01NX1RUWV9HT1RfTFNBUFNFTCIsCisJIioqKiBFUlJPUiAqKioqIiwKK307CisjZW5kaWYgLyogQ09ORklHX0lSREFfREVCVUcgKi8KKworc3RhdGljIGludCAoKnN0YXRlW10pKHN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmLCBJUkNPTU1fVFRZX0VWRU5UIGV2ZW50LAorCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJjb21tX3R0eV9pbmZvICppbmZvKSA9IAoreworCWlyY29tbV90dHlfc3RhdGVfaWRsZSwKKwlpcmNvbW1fdHR5X3N0YXRlX3NlYXJjaCwKKwlpcmNvbW1fdHR5X3N0YXRlX3F1ZXJ5X3BhcmFtZXRlcnMsCisJaXJjb21tX3R0eV9zdGF0ZV9xdWVyeV9sc2FwX3NlbCwKKwlpcmNvbW1fdHR5X3N0YXRlX3NldHVwLAorCWlyY29tbV90dHlfc3RhdGVfcmVhZHksCit9OworCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV9hdHRhY2hfY2FibGUgKGRyaXZlcikKKyAqCisgKiAgICBUcnkgdG8gYXR0YWNoIGNhYmxlIChJckNPTU0gbGluaykuIFRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IHJldHVybgorICogICAgd2hlbiB0aGUgbGluayBoYXMgYmVlbiBjb25uZWN0ZWQsIG9yIGlmIGFuIGVycm9yIGNvbmRpdGlvbiBvY2N1cnMuIAorICogICAgSWYgc3VjY2VzcywgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgcmVzdWx0aW5nIHNlcnZpY2UgdHlwZS4KKyAqLworaW50IGlyY29tbV90dHlfYXR0YWNoX2NhYmxlKHN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmKQoreworCUlSREFfREVCVUcoMCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm4gLTE7KTsKKworICAgICAgIAkvKiBDaGVjayBpZiBzb21lYm9keSBoYXMgYWxyZWFkeSBjb25uZWN0ZWQgdG8gdXMgKi8KKwlpZiAoaXJjb21tX2lzX2Nvbm5lY3RlZChzZWxmLT5pcmNvbW0pKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGFscmVhZHkgY29ubmVjdGVkIVxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiAwOworCX0KKworCS8qIE1ha2Ugc3VyZSBub2JvZHkgdHJpZXMgdG8gd3JpdGUgYmVmb3JlIHRoZSBsaW5rIGlzIHVwICovCisJc2VsZi0+dHR5LT5od19zdG9wcGVkID0gMTsKKworCWlyY29tbV90dHlfaWFzX3JlZ2lzdGVyKHNlbGYpOworCisJaXJjb21tX3R0eV9kb19ldmVudChzZWxmLCBJUkNPTU1fVFRZX0FUVEFDSF9DQUJMRSwgTlVMTCwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV9kZXRhY2hfY2FibGUgKGRyaXZlcikKKyAqCisgKiAgICBEZXRhY2ggY2FibGUsIG9yIGNhYmxlIGhhcyBiZWVuIGRldGFjaGVkIGJ5IHBlZXIKKyAqCisgKi8KK3ZvaWQgaXJjb21tX3R0eV9kZXRhY2hfY2FibGUoc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYpCit7CisJSVJEQV9ERUJVRygwLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybjspOworCisJZGVsX3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CisKKwkvKiBSZW1vdmUgZGlzY292ZXJ5IGhhbmRsZXIgKi8KKwlpZiAoc2VsZi0+Y2tleSkgeworCQlpcmxtcF91bnJlZ2lzdGVyX2NsaWVudChzZWxmLT5ja2V5KTsKKwkJc2VsZi0+Y2tleSA9IE5VTEw7CisJfQorCS8qIFJlbW92ZSBJckNPTU0gaGludCBiaXRzICovCisJaWYgKHNlbGYtPnNrZXkpIHsKKwkJaXJsbXBfdW5yZWdpc3Rlcl9zZXJ2aWNlKHNlbGYtPnNrZXkpOworCQlzZWxmLT5za2V5ID0gTlVMTDsKKwl9CisKKwlpZiAoc2VsZi0+aXJpYXApIHsgCisJCWlyaWFwX2Nsb3NlKHNlbGYtPmlyaWFwKTsKKwkJc2VsZi0+aXJpYXAgPSBOVUxMOworCX0KKworCS8qIFJlbW92ZSBMTS1JQVMgb2JqZWN0ICovCisJaWYgKHNlbGYtPm9iaikgeworCQlpcmlhc19kZWxldGVfb2JqZWN0KHNlbGYtPm9iaik7CisJCXNlbGYtPm9iaiA9IE5VTEw7CisJfQorCisJaXJjb21tX3R0eV9kb19ldmVudChzZWxmLCBJUkNPTU1fVFRZX0RFVEFDSF9DQUJMRSwgTlVMTCwgTlVMTCk7CisKKwkvKiBSZXNldCBzb21lIHZhbHVlcyAqLworCXNlbGYtPmRhZGRyID0gc2VsZi0+c2FkZHIgPSAwOworCXNlbGYtPmRsc2FwX3NlbCA9IHNlbGYtPnNsc2FwX3NlbCA9IDA7CisKKwltZW1zZXQoJnNlbGYtPnNldHRpbmdzLCAwLCBzaXplb2Yoc3RydWN0IGlyY29tbV9wYXJhbXMpKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfaWFzX3JlZ2lzdGVyIChzZWxmKQorICoKKyAqICAgIFJlZ2lzdGVyIHdpdGggTE0tSUFTIGRlcGVuZGluZyBvbiB3aGljaCBzZXJ2aWNlIHR5cGUgd2UgYXJlCisgKgorICovCitzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X2lhc19yZWdpc3RlcihzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZikKK3sKKwlfX3U4IG9jdF9zZXFbNl07CisJX191MTYgaGludHM7CisKKwlJUkRBX0RFQlVHKDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuOyk7CisJCisJLyogQ29tcHV0ZSBoaW50IGJpdHMgYmFzZWQgb24gc2VydmljZSAqLworCWhpbnRzID0gaXJsbXBfc2VydmljZV90b19oaW50KFNfQ09NTSk7CisJaWYgKHNlbGYtPnNlcnZpY2VfdHlwZSAmIElSQ09NTV8zX1dJUkVfUkFXKQorCQloaW50cyB8PSBpcmxtcF9zZXJ2aWNlX3RvX2hpbnQoU19QUklOVEVSKTsKKworCS8qIEFkdmVydGlzZSBJckNPTU0gaGludCBiaXQgaW4gZGlzY292ZXJ5ICovCisJaWYgKCFzZWxmLT5za2V5KQorCQlzZWxmLT5za2V5ID0gaXJsbXBfcmVnaXN0ZXJfc2VydmljZShoaW50cyk7CisJLyogU2V0IHVwIGEgZGlzY292ZXJ5IGhhbmRsZXIgKi8KKwlpZiAoIXNlbGYtPmNrZXkpCisJCXNlbGYtPmNrZXkgPSBpcmxtcF9yZWdpc3Rlcl9jbGllbnQoaGludHMsCisJCQkJCQkgICBpcmNvbW1fdHR5X2Rpc2NvdmVyeV9pbmRpY2F0aW9uLAorCQkJCQkJICAgTlVMTCwgKHZvaWQgKikgc2VsZik7CisKKwkvKiBJZiBhbHJlYWR5IGRvbmUsIG5vIG5lZWQgdG8gZG8gaXQgYWdhaW4gKi8KKwlpZiAoc2VsZi0+b2JqKQorCQlyZXR1cm47CisKKwlpZiAoc2VsZi0+c2VydmljZV90eXBlICYgSVJDT01NXzNfV0lSRV9SQVcpIHsKKwkJLyogUmVnaXN0ZXIgSXJMUFQgd2l0aCBMTS1JQVMgKi8KKwkJc2VsZi0+b2JqID0gaXJpYXNfbmV3X29iamVjdCgiSXJMUFQiLCBJQVNfSVJMUFRfSUQpOworCQlpcmlhc19hZGRfaW50ZWdlcl9hdHRyaWIoc2VsZi0+b2JqLCAiSXJEQTpJckxNUDpMc2FwU2VsIiwgCisJCQkJCSBzZWxmLT5zbHNhcF9zZWwsIElBU19LRVJORUxfQVRUUik7CisJfSBlbHNlIHsKKwkJLyogUmVnaXN0ZXIgSXJDT01NIHdpdGggTE0tSUFTICovCisJCXNlbGYtPm9iaiA9IGlyaWFzX25ld19vYmplY3QoIklyREE6SXJDT01NIiwgSUFTX0lSQ09NTV9JRCk7CisJCWlyaWFzX2FkZF9pbnRlZ2VyX2F0dHJpYihzZWxmLT5vYmosICJJckRBOlRpbnlUUDpMc2FwU2VsIiwgCisJCQkJCSBzZWxmLT5zbHNhcF9zZWwsIElBU19LRVJORUxfQVRUUik7CisJCQorCQkvKiBDb2RlIHRoZSBwYXJhbWV0ZXJzIGludG8gdGhlIGJ1ZmZlciAqLworCQlpcmRhX3BhcmFtX3BhY2sob2N0X3NlcSwgImJiYmJiYiIsIAorCQkJCUlSQ09NTV9TRVJWSUNFX1RZUEUsIDEsIHNlbGYtPnNlcnZpY2VfdHlwZSwKKwkJCQlJUkNPTU1fUE9SVF9UWVBFLCAgICAxLCBJUkNPTU1fU0VSSUFMKTsKKwkJCisJCS8qIFJlZ2lzdGVyIHBhcmFtZXRlcnMgd2l0aCBMTS1JQVMgKi8KKwkJaXJpYXNfYWRkX29jdHNlcV9hdHRyaWIoc2VsZi0+b2JqLCAiUGFyYW1ldGVycyIsIG9jdF9zZXEsIDYsCisJCQkJCUlBU19LRVJORUxfQVRUUik7CisJfQorCWlyaWFzX2luc2VydF9vYmplY3Qoc2VsZi0+b2JqKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfaWFzX3VucmVnaXN0ZXIgKHNlbGYpCisgKgorICogICAgUmVtb3ZlIG91ciBJQVMgb2JqZWN0IGFuZCBjbGllbnQgaG9vayB3aGlsZSBjb25uZWN0ZWQuCisgKgorICovCitzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X2lhc191bnJlZ2lzdGVyKHN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmKQoreworCS8qIFJlbW92ZSBMTS1JQVMgb2JqZWN0IG5vdyBzbyBpdCBpcyBub3QgcmV1c2VkLgorCSAqIElyQ09NTSBkZWFscyB2ZXJ5IHBvb3JseSB3aXRoIG11bHRpcGxlIGluY29taW5nIGNvbm5lY3Rpb25zLgorCSAqIEl0IHNob3VsZCBsb29rcyBhIGxvdCBtb3JlIGxpa2UgSXJORVQsIGFuZCAiZHVwIiBhIHNlcnZlciBUU0FQCisJICogdG8gdGhlIGFwcGxpY2F0aW9uIFRTQVAgKGJhc2VkIG9uIHZhcmlvdXMgcnVsZXMpLgorCSAqIFRoaXMgaXMgYSBjaGVhcCB3b3JrYXJvdW5kIGFsbG93aW5nIG11bHRpcGxlIGNsaWVudHMgdG8KKwkgKiBjb25uZWN0IHRvIHVzLiBJdCB3aWxsIG5vdCBhbHdheXMgd29yay4KKwkgKiBFYWNoIElyQ09NTSBzb2NrZXQgaGFzIGFuIElBUyBlbnRyeS4gSW5jb21pbmcgY29ubmVjdGlvbiB3aWxsCisJICogcGljayB0aGUgZmlyc3Qgb25lIGZvdW5kLiBTbywgd2hlbiB3ZSBhcmUgZnVsbHkgY29ubmVjdGVkLAorCSAqIHdlIHJlbW92ZSBvdXIgSUFTIGVudHJpZXMgc28gdGhhdCB0aGUgbmV4dCBJQVMgZW50cnkgaXMgdXNlZC4KKwkgKiBXZSBkbyB0aGF0IGZvciAqYm90aCogY2xpZW50IGFuZCBzZXJ2ZXIsIGJlY2F1c2UgYSBzZXJ2ZXIKKwkgKiBjYW4gYWxzbyBjcmVhdGUgY2xpZW50IGluc3RhbmNlcy4KKwkgKiBKZWFuIElJICovCisJaWYgKHNlbGYtPm9iaikgeworCQlpcmlhc19kZWxldGVfb2JqZWN0KHNlbGYtPm9iaik7CisJCXNlbGYtPm9iaiA9IE5VTEw7CisJfQorCisjaWYgMAorCS8qIFJlbW92ZSBkaXNjb3ZlcnkgaGFuZGxlci4KKwkgKiBXaGlsZSB3ZSBhcmUgY29ubmVjdGVkLCB3ZSBubyBsb25nZXIgbmVlZCB0byByZWNlaXZlCisJICogZGlzY292ZXJ5IGV2ZW50cy4gVGhpcyB3b3VsZCBiZSB0aGUgY2FzZSBpZiB0aGVyZSBpcworCSAqIG11bHRpcGxlIElyTEFQIGludGVyZmFjZXMuIEplYW4gSUkgKi8KKwlpZiAoc2VsZi0+Y2tleSkgeworCQlpcmxtcF91bnJlZ2lzdGVyX2NsaWVudChzZWxmLT5ja2V5KTsKKwkJc2VsZi0+Y2tleSA9IE5VTEw7CisJfQorI2VuZGlmCit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fc2VuZF9pbml0aWFsX3BhcmFtZXRlcnMgKHNlbGYpCisgKgorICogICAgU2VuZCBpbml0aWFsIHBhcmFtZXRlcnMgdG8gdGhlIHJlbW90ZSBJckNPTU0gZGV2aWNlLiBUaGVzZSBwYXJhbWV0ZXJzCisgKiAgICBtdXN0IGJlIHNlbnQgYmVmb3JlIGFueSBkYXRhLgorICovCitpbnQgaXJjb21tX3R0eV9zZW5kX2luaXRpYWxfcGFyYW1ldGVycyhzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZikKK3sKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybiAtMTspOworCisJaWYgKHNlbGYtPnNlcnZpY2VfdHlwZSAmIElSQ09NTV8zX1dJUkVfUkFXKSAKKwkJcmV0dXJuIDA7CisKKwkvKiAKKwkgKiBTZXQgZGVmYXVsdCB2YWx1ZXMsIGJ1dCBvbmx5IGlmIHRoZSBhcHBsaWNhdGlvbiBmb3Igc29tZSByZWFzb24gCisJICogaGF2ZW4ndCBzZXQgdGhlbSBhbHJlYWR5CisJICovCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgZGF0YS1yYXRlID0gJWRcbiIsIF9fRlVOQ1RJT05fXyAsIAorCQkgICBzZWxmLT5zZXR0aW5ncy5kYXRhX3JhdGUpOworCWlmICghc2VsZi0+c2V0dGluZ3MuZGF0YV9yYXRlKQorCQlzZWxmLT5zZXR0aW5ncy5kYXRhX3JhdGUgPSA5NjAwOworCUlSREFfREVCVUcoMiwgIiVzKCksIGRhdGEtZm9ybWF0ID0gJWRcbiIsIF9fRlVOQ1RJT05fXyAsIAorCQkgICBzZWxmLT5zZXR0aW5ncy5kYXRhX2Zvcm1hdCk7CisJaWYgKCFzZWxmLT5zZXR0aW5ncy5kYXRhX2Zvcm1hdCkKKwkJc2VsZi0+c2V0dGluZ3MuZGF0YV9mb3JtYXQgPSBJUkNPTU1fV1NJWkVfODsgIC8qIDhOMSAqLworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgZmxvdy1jb250cm9sID0gJWRcbiIsIF9fRlVOQ1RJT05fXyAsIAorCQkgICBzZWxmLT5zZXR0aW5ncy5mbG93X2NvbnRyb2wpOworCS8qc2VsZi0+c2V0dGluZ3MuZmxvd19jb250cm9sID0gSVJDT01NX1JUU19DVFNfSU58SVJDT01NX1JUU19DVFNfT1VUOyovCisKKwkvKiBEbyBub3Qgc2V0IGRlbHRhIHZhbHVlcyBmb3IgdGhlIGluaXRpYWwgcGFyYW1ldGVycyAqLworCXNlbGYtPnNldHRpbmdzLmR0ZSA9IElSQ09NTV9EVFIgfCBJUkNPTU1fUlRTOworCisJLyogT25seSBzZW5kIHNlcnZpY2UgdHlwZSBwYXJhbWV0ZXIgd2hlbiB3ZSBhcmUgdGhlIGNsaWVudCAqLworCWlmIChzZWxmLT5jbGllbnQpCisJCWlyY29tbV9wYXJhbV9yZXF1ZXN0KHNlbGYsIElSQ09NTV9TRVJWSUNFX1RZUEUsIEZBTFNFKTsKKwlpcmNvbW1fcGFyYW1fcmVxdWVzdChzZWxmLCBJUkNPTU1fREFUQV9SQVRFLCBGQUxTRSk7CisJaXJjb21tX3BhcmFtX3JlcXVlc3Qoc2VsZiwgSVJDT01NX0RBVEFfRk9STUFULCBGQUxTRSk7CisJCisJLyogRm9yIGEgMyB3aXJlIHNlcnZpY2UsIHdlIGp1c3QgZmx1c2ggdGhlIGxhc3QgcGFyYW1ldGVyIGFuZCByZXR1cm4gKi8KKwlpZiAoc2VsZi0+c2V0dGluZ3Muc2VydmljZV90eXBlID09IElSQ09NTV8zX1dJUkUpIHsKKwkJaXJjb21tX3BhcmFtX3JlcXVlc3Qoc2VsZiwgSVJDT01NX0ZMT1dfQ09OVFJPTCwgVFJVRSk7CisJCXJldHVybiAwOworCX0KKworCS8qIE9ubHkgOS13aXJlIHNlcnZpY2UgdHlwZXMgY29udGludWUgaGVyZSAqLworCWlyY29tbV9wYXJhbV9yZXF1ZXN0KHNlbGYsIElSQ09NTV9GTE9XX0NPTlRST0wsIEZBTFNFKTsKKyNpZiAwCisJaXJjb21tX3BhcmFtX3JlcXVlc3Qoc2VsZiwgSVJDT01NX1hPTl9YT0ZGLCBGQUxTRSk7CisJaXJjb21tX3BhcmFtX3JlcXVlc3Qoc2VsZiwgSVJDT01NX0VOUV9BQ0ssIEZBTFNFKTsKKyNlbmRpZgkKKwkvKiBOb3RpZnkgcGVlciB0aGF0IHdlIGFyZSByZWFkeSB0byByZWNlaXZlIGRhdGEgKi8KKwlpcmNvbW1fcGFyYW1fcmVxdWVzdChzZWxmLCBJUkNPTU1fRFRFLCBUUlVFKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfZGlzY292ZXJ5X2luZGljYXRpb24gKGRpc2NvdmVyeSkKKyAqCisgKiAgICBSZW1vdGUgZGV2aWNlIGlzIGRpc2NvdmVyZWQsIHRyeSBxdWVyeSB0aGUgcmVtb3RlIElBUyB0byBzZWUgd2hpY2gKKyAqICAgIGRldmljZSBpdCBpcywgYW5kIHdoaWNoIHNlcnZpY2VzIGl0IGhhcy4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfZGlzY292ZXJ5X2luZGljYXRpb24oZGlzY2luZm9fdCAqZGlzY292ZXJ5LAorCQkJCQkgICAgRElTQ09WRVJZX01PREUgbW9kZSwKKwkJCQkJICAgIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGY7CisJc3RydWN0IGlyY29tbV90dHlfaW5mbyBpbmZvOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwkvKiBJbXBvcnRhbnQgbm90ZSA6CisJICogV2UgbmVlZCB0byBkcm9wIGFsbCBwYXNzaXZlIGRpc2NvdmVyaWVzLgorCSAqIFRoZSBMU0FQIG1hbmFnZW1lbnQgb2YgSXJDb21tIGlzIGRlZmljaWVudCBhbmQgZG9lc24ndCBkZWFsCisJICogd2l0aCB0aGUgY2FzZSBvZiB0d28gaW5zdGFuY2UgY29ubmVjdGluZyB0byBlYWNoIG90aGVyCisJICogc2ltdWx0YW5lb3VzbHkgKGl0IHdpbGwgZGVhZGxvY2sgaW4gTE1QKS4KKwkgKiBUaGUgcHJvcGVyIGZpeCB3b3VsZCBiZSB0byB1c2UgdGhlIHNhbWUgdGVjaG5pcXVlIGFzIGluIElyTkVULAorCSAqIHRvIGhhdmUgb25lIHNlcnZlciBzb2NrZXQgYW5kIHNlcGFyYXRlIGluc3RhbmNlcyBmb3IgdGhlCisJICogY29ubmVjdGluZy9jb25uZWN0ZWQgc29ja2V0LgorCSAqIFRoZSB3b3JrYXJvdW5kIGlzIHRvIGRyb3AgcGFzc2l2ZSBkaXNjb3ZlcnksIHdoaWNoIGRyYXN0aWNhbGx5CisJICogcmVkdWNlIHRoZSBwcm9iYWJpbGl0eSBvZiB0aGlzIGhhcHBlbmluZy4KKwkgKiBKZWFuIElJICovCisJaWYobW9kZSA9PSBESVNDT1ZFUllfUEFTU0lWRSkKKwkJcmV0dXJuOworCisJaW5mby5kYWRkciA9IGRpc2NvdmVyeS0+ZGFkZHI7CisJaW5mby5zYWRkciA9IGRpc2NvdmVyeS0+c2FkZHI7CisKKwkvKiBGSVhNRS4gV2UgaGF2ZSBhIGxvY2tpbmcgcHJvYmxlbSBvbiB0aGUgaGFzaGJpbiBoZXJlLgorCSAqIFdlIHByb2JhYmx5IG5lZWQgdG8gdXNlIGhhc2hiaW5fZmluZF9uZXh0KCksIGJ1dCB3ZSBmaXJzdAorCSAqIG5lZWQgdG8gZW5zdXJlIHRoYXQgImxpbmUiIGlzIHVuaXF1ZS4gLSBKZWFuIElJICovCisJc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSBoYXNoYmluX2dldF9maXJzdChpcmNvbW1fdHR5KTsKKwl3aGlsZSAoc2VsZiAhPSBOVUxMKSB7CisJCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybjspOworCQkKKwkJaXJjb21tX3R0eV9kb19ldmVudChzZWxmLCBJUkNPTU1fVFRZX0RJU0NPVkVSWV9JTkRJQ0FUSU9OLCAKKwkJCQkgICAgTlVMTCwgJmluZm8pOworCisJCXNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgaGFzaGJpbl9nZXRfbmV4dChpcmNvbW1fdHR5KTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbiAoaW5zdGFuY2UsIHNhcCwgcmVhc29uLCBza2IpCisgKgorICogICAgTGluayBkaXNjb25uZWN0ZWQKKyAqCisgKi8KK3ZvaWQgaXJjb21tX3R0eV9kaXNjb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgCisJCQkJICAgICAgTE1fUkVBU09OIHJlYXNvbiwKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIGluc3RhbmNlOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybjspOworCisJaWYgKCFzZWxmLT50dHkpCisJCXJldHVybjsKKworCS8qIFRoaXMgd2lsbCBzdG9wIGNvbnRyb2wgZGF0YSB0cmFuc2ZlcnMgKi8KKwlzZWxmLT5mbG93ID0gRkxPV19TVE9QOworCisJLyogU3RvcCBkYXRhIHRyYW5zZmVycyAqLworCXNlbGYtPnR0eS0+aHdfc3RvcHBlZCA9IDE7CisKKwlpcmNvbW1fdHR5X2RvX2V2ZW50KHNlbGYsIElSQ09NTV9UVFlfRElTQ09OTkVDVF9JTkRJQ0FUSU9OLCBOVUxMLCAKKwkJCSAgICBOVUxMKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfZ2V0dmFsdWVfY29uZmlybSAocmVzdWx0LCBvYmpfaWQsIHZhbHVlLCBwcml2KQorICoKKyAqICAgIEdvdCByZXN1bHQgZnJvbSB0aGUgSUFTIHF1ZXJ5IHdlIG1ha2UKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfZ2V0dmFsdWVfY29uZmlybShpbnQgcmVzdWx0LCBfX3UxNiBvYmpfaWQsIAorCQkJCQlzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZSwgCisJCQkJCXZvaWQgKnByaXYpCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgcHJpdjsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm47KTsKKworCS8qIFdlIHByb2JhYmx5IGRvbid0IG5lZWQgdG8gbWFrZSBhbnkgbW9yZSBxdWVyaWVzICovCisJaXJpYXBfY2xvc2Uoc2VsZi0+aXJpYXApOworCXNlbGYtPmlyaWFwID0gTlVMTDsKKworCS8qIENoZWNrIGlmIHJlcXVlc3Qgc3VjY2VlZGVkICovCisJaWYgKHJlc3VsdCAhPSBJQVNfU1VDQ0VTUykgeworCQlJUkRBX0RFQlVHKDQsICIlcygpLCBnb3QgTlVMTCB2YWx1ZSFcbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoICh2YWx1ZS0+dHlwZSkgeworIAljYXNlIElBU19PQ1RfU0VROgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBnb3Qgb2N0ZXQgc2VxdWVuY2VcbiIsIF9fRlVOQ1RJT05fXyApOworCisJCWlyZGFfcGFyYW1fZXh0cmFjdF9hbGwoc2VsZiwgdmFsdWUtPnQub2N0X3NlcSwgdmFsdWUtPmxlbiwKKwkJCQkgICAgICAgJmlyY29tbV9wYXJhbV9pbmZvKTsKKworCQlpcmNvbW1fdHR5X2RvX2V2ZW50KHNlbGYsIElSQ09NTV9UVFlfR09UX1BBUkFNRVRFUlMsIE5VTEwsIAorCQkJCSAgICBOVUxMKTsKKwkJYnJlYWs7CisJY2FzZSBJQVNfSU5URUdFUjoKKwkJLyogR290IExTQVAgc2VsZWN0b3IgKi8JCisJCUlSREFfREVCVUcoMiwgIiVzKCksIGdvdCBsc2Fwc2VsID0gJWRcbiIsIF9fRlVOQ1RJT05fXyAsIAorCQkJICAgdmFsdWUtPnQuaW50ZWdlcik7CisKKwkJaWYgKHZhbHVlLT50LmludGVnZXIgPT0gLTEpIHsKKwkJCUlSREFfREVCVUcoMCwgIiVzKCksIGludmFsaWQgdmFsdWUhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJfSBlbHNlCisJCQlzZWxmLT5kbHNhcF9zZWwgPSB2YWx1ZS0+dC5pbnRlZ2VyOworCisJCWlyY29tbV90dHlfZG9fZXZlbnQoc2VsZiwgSVJDT01NX1RUWV9HT1RfTFNBUFNFTCwgTlVMTCwgTlVMTCk7CisJCWJyZWFrOworCWNhc2UgSUFTX01JU1NJTkc6CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGdvdCBJQVNfTUlTU0lOR1xuIiwgX19GVU5DVElPTl9fICk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGdvdCB1bmtub3duIHR5cGUhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJYnJlYWs7CisJfQorCWlyaWFzX2RlbGV0ZV92YWx1ZSh2YWx1ZSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X2Nvbm5lY3RfY29uZmlybSAoaW5zdGFuY2UsIHNhcCwgcW9zLCBtYXhfc2R1X3NpemUsIHNrYikKKyAqCisgKiAgICBDb25uZWN0aW9uIGNvbmZpcm1lZAorICoKKyAqLwordm9pZCBpcmNvbW1fdHR5X2Nvbm5lY3RfY29uZmlybSh2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCAKKwkJCQlzdHJ1Y3QgcW9zX2luZm8gKnFvcywgCisJCQkJX191MzIgbWF4X2RhdGFfc2l6ZSwgCisJCQkJX191OCBtYXhfaGVhZGVyX3NpemUsIAorCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgaW5zdGFuY2U7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuOyk7CisKKwlzZWxmLT5jbGllbnQgPSBUUlVFOworCXNlbGYtPm1heF9kYXRhX3NpemUgPSBtYXhfZGF0YV9zaXplOworCXNlbGYtPm1heF9oZWFkZXJfc2l6ZSA9IG1heF9oZWFkZXJfc2l6ZTsKKwlzZWxmLT5mbG93ID0gRkxPV19TVEFSVDsKKworCWlyY29tbV90dHlfZG9fZXZlbnQoc2VsZiwgSVJDT01NX1RUWV9DT05ORUNUX0NPTkZJUk0sIE5VTEwsIE5VTEwpOworCisJLyogTm8gbmVlZCB0byBrZnJlZV9za2IgLSBzZWUgaXJjb21tX3R0cF9jb25uZWN0X2NvbmZpcm0oKSAqLworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV9jb25uZWN0X2luZGljYXRpb24gKGluc3RhbmNlLCBzYXAsIHFvcywgbWF4X3NkdV9zaXplLCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2IpCisgKgorICogICAgd2UgYXJlIGRpc2NvdmVyZWQgYW5kIGJlaW5nIHJlcXVlc3RlZCB0byBjb25uZWN0IGJ5IHJlbW90ZSBkZXZpY2UgIQorICoKKyAqLwordm9pZCBpcmNvbW1fdHR5X2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCAKKwkJCQkgICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywgCisJCQkJICAgX191MzIgbWF4X2RhdGFfc2l6ZSwKKwkJCQkgICBfX3U4IG1heF9oZWFkZXJfc2l6ZSwgCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSBpbnN0YW5jZTsKKwlpbnQgY2xlbjsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm47KTsKKworCXNlbGYtPmNsaWVudCA9IEZBTFNFOworCXNlbGYtPm1heF9kYXRhX3NpemUgPSBtYXhfZGF0YV9zaXplOworCXNlbGYtPm1heF9oZWFkZXJfc2l6ZSA9IG1heF9oZWFkZXJfc2l6ZTsKKwlzZWxmLT5mbG93ID0gRkxPV19TVEFSVDsKKworCWNsZW4gPSBza2ItPmRhdGFbMF07CisJaWYgKGNsZW4pCisJCWlyZGFfcGFyYW1fZXh0cmFjdF9hbGwoc2VsZiwgc2tiLT5kYXRhKzEsIAorCQkJCSAgICAgICBJUkRBX01JTihza2ItPmxlbiwgY2xlbiksIAorCQkJCSAgICAgICAmaXJjb21tX3BhcmFtX2luZm8pOworCisJaXJjb21tX3R0eV9kb19ldmVudChzZWxmLCBJUkNPTU1fVFRZX0NPTk5FQ1RfSU5ESUNBVElPTiwgTlVMTCwgTlVMTCk7CisKKwkvKiBObyBuZWVkIHRvIGtmcmVlX3NrYiAtIHNlZSBpcmNvbW1fdHRwX2Nvbm5lY3RfaW5kaWNhdGlvbigpICovCit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X2xpbmtfZXN0YWJsaXNoZWQgKHNlbGYpCisgKgorICogICAgQ2FsbGVkIHdoZW4gdGhlIElyQ09NTSBsaW5rIGlzIGVzdGFibGlzaGVkCisgKgorICovCit2b2lkIGlyY29tbV90dHlfbGlua19lc3RhYmxpc2hlZChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZikKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuOyk7CisKKwlpZiAoIXNlbGYtPnR0eSkKKwkJcmV0dXJuOworCQorCWRlbF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOworCisJLyogCisJICogSXJDT01NIGxpbmsgaXMgbm93IHVwLCBhbmQgaWYgd2UgYXJlIG5vdCB1c2luZyBoYXJkd2FyZQorCSAqIGZsb3ctY29udHJvbCwgdGhlbiBkZWNsYXJlIHRoZSBoYXJkd2FyZSBhcyBydW5uaW5nLiBPdGhlcndpc2Ugd2UKKwkgKiB3aWxsIGhhdmUgdG8gd2FpdCBmb3IgdGhlIHBlZXIgZGV2aWNlIChEQ0UpIHRvIHJhaXNlIHRoZSBDVFMKKwkgKiBsaW5lLiAgCisJICovCisJaWYgKChzZWxmLT5mbGFncyAmIEFTWU5DX0NUU19GTE9XKSAmJiAoKHNlbGYtPnNldHRpbmdzLmRjZSAmIElSQ09NTV9DVFMpID09IDApKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIHdhaXRpbmcgZm9yIENUUyAuLi5cbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm47CisJfSBlbHNlIHsKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgc3RhcnRpbmcgaGFyZHdhcmUhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCQlzZWxmLT50dHktPmh3X3N0b3BwZWQgPSAwOworCQorCQkvKiBXYWtlIHVwIHByb2Nlc3NlcyBibG9ja2VkIG9uIG9wZW4gKi8KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZWxmLT5vcGVuX3dhaXQpOworCX0KKworCXNjaGVkdWxlX3dvcmsoJnNlbGYtPnRxdWV1ZSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X3N0YXJ0X3dhdGNoZG9nX3RpbWVyIChzZWxmLCB0aW1lb3V0KQorICoKKyAqICAgIFN0YXJ0IHRoZSB3YXRjaGRvZyB0aW1lci4gVGhpcyB0aW1lciBpcyB1c2VkIHRvIG1ha2Ugc3VyZSB0aGF0IGFueSAKKyAqICAgIGNvbm5lY3Rpb24gYXR0ZW1wdCBpcyBzdWNjZXNzZnVsLCBhbmQgaWYgbm90LCB3ZSB3aWxsIHJldHJ5IGFmdGVyIAorICogICAgdGhlIHRpbWVvdXQKKyAqLworc3RhdGljIHZvaWQgaXJjb21tX3R0eV9zdGFydF93YXRjaGRvZ190aW1lcihzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiwKKwkJCQkJICAgIGludCB0aW1lb3V0KQoreworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuOyk7CisKKwlpcmRhX3N0YXJ0X3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lciwgdGltZW91dCwgKHZvaWQgKikgc2VsZiwKKwkJCSBpcmNvbW1fdHR5X3dhdGNoZG9nX3RpbWVyX2V4cGlyZWQpOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV93YXRjaGRvZ190aW1lcl9leHBpcmVkIChkYXRhKQorICoKKyAqICAgIENhbGxlZCB3aGVuIHRoZSBjb25uZWN0IHByb2NlZHVyZSBoYXZlIHRha2VuIHRvIG11Y2ggdGltZS4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfd2F0Y2hkb2dfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIGRhdGE7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSQ09NTV9UVFlfTUFHSUMsIHJldHVybjspOworCisJaXJjb21tX3R0eV9kb19ldmVudChzZWxmLCBJUkNPTU1fVFRZX1dEX1RJTUVSX0VYUElSRUQsIE5VTEwsIE5VTEwpOworfQorCisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X2RvX2V2ZW50IChzZWxmLCBldmVudCwgc2tiKQorICoKKyAqICAgIFByb2Nlc3MgZXZlbnQKKyAqCisgKi8KK2ludCBpcmNvbW1fdHR5X2RvX2V2ZW50KHN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmLCBJUkNPTU1fVFRZX0VWRU5UIGV2ZW50LAorCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlyY29tbV90dHlfaW5mbyAqaW5mbykgCit7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm4gLTE7KTsKKworCUlSREFfREVCVUcoMiwgIiVzOiBzdGF0ZT0lcywgZXZlbnQ9JXNcbiIsIF9fRlVOQ1RJT05fXyAsCisJCSAgIGlyY29tbV90dHlfc3RhdGVbc2VsZi0+c3RhdGVdLCBpcmNvbW1fdHR5X2V2ZW50W2V2ZW50XSk7CisJCisJcmV0dXJuICgqc3RhdGVbc2VsZi0+c3RhdGVdKShzZWxmLCBldmVudCwgc2tiLCBpbmZvKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfbmV4dF9zdGF0ZSAoc2VsZiwgc3RhdGUpCisgKgorICogICAgU3dpdGNoIHN0YXRlCisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXJjb21tX3R0eV9uZXh0X3N0YXRlKHN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmLCBJUkNPTU1fVFRZX1NUQVRFIHN0YXRlKQoreworCS8qCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkNPTU1fVFRZX01BR0lDLCByZXR1cm47KTsKKworCUlSREFfREVCVUcoMiwgIiVzOiBuZXh0IHN0YXRlPSVzLCBzZXJ2aWNlIHR5cGU9JWRcbiIsIF9fRlVOQ1RJT05fXyAsIAorCQkgICBpcmNvbW1fdHR5X3N0YXRlW3NlbGYtPnN0YXRlXSwgc2VsZi0+c2VydmljZV90eXBlKTsKKwkqLworCXNlbGYtPnN0YXRlID0gc3RhdGU7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X3N0YXRlX2lkbGUgKHNlbGYsIGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgSnVzdCBoYW5naW5nIGFyb3VuZAorICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fdHR5X3N0YXRlX2lkbGUoc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYsIAorCQkJCSBJUkNPTU1fVFRZX0VWRU5UIGV2ZW50LCAKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwgCisJCQkJIHN0cnVjdCBpcmNvbW1fdHR5X2luZm8gKmluZm8pCit7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDIsICIlczogc3RhdGU9JXMsIGV2ZW50PSVzXG4iLCBfX0ZVTkNUSU9OX18gLAorCQkgICBpcmNvbW1fdHR5X3N0YXRlW3NlbGYtPnN0YXRlXSwgaXJjb21tX3R0eV9ldmVudFtldmVudF0pOworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIElSQ09NTV9UVFlfQVRUQUNIX0NBQkxFOgorCQkvKiBUcnkgdG8gZGlzY292ZXIgYW55IHJlbW90ZSBkZXZpY2VzICovCQkKKwkJaXJjb21tX3R0eV9zdGFydF93YXRjaGRvZ190aW1lcihzZWxmLCAzKkhaKTsKKwkJaXJjb21tX3R0eV9uZXh0X3N0YXRlKHNlbGYsIElSQ09NTV9UVFlfU0VBUkNIKTsKKwkJCisJCWlybG1wX2Rpc2NvdmVyeV9yZXF1ZXN0KERJU0NPVkVSWV9ERUZBVUxUX1NMT1RTKTsKKwkJYnJlYWs7CisJY2FzZSBJUkNPTU1fVFRZX0RJU0NPVkVSWV9JTkRJQ0FUSU9OOgorCQlzZWxmLT5kYWRkciA9IGluZm8tPmRhZGRyOworCQlzZWxmLT5zYWRkciA9IGluZm8tPnNhZGRyOworCisJCWlmIChzZWxmLT5pcmlhcCkgeworCQkJSVJEQV9XQVJOSU5HKCIlcygpLCBidXN5IHdpdGggYSBwcmV2aW91cyBxdWVyeVxuIiwKKwkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJc2VsZi0+aXJpYXAgPSBpcmlhcF9vcGVuKExTQVBfQU5ZLCBJQVNfQ0xJRU5ULCBzZWxmLAorCQkJCQkgaXJjb21tX3R0eV9nZXR2YWx1ZV9jb25maXJtKTsKKworCQlpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVxdWVzdChzZWxmLT5pcmlhcCwKKwkJCQkJICAgICAgc2VsZi0+c2FkZHIsIHNlbGYtPmRhZGRyLAorCQkJCQkgICAgICAiSXJEQTpJckNPTU0iLCAiUGFyYW1ldGVycyIpOworCQkKKwkJaXJjb21tX3R0eV9zdGFydF93YXRjaGRvZ190aW1lcihzZWxmLCAzKkhaKTsKKwkJaXJjb21tX3R0eV9uZXh0X3N0YXRlKHNlbGYsIElSQ09NTV9UVFlfUVVFUllfUEFSQU1FVEVSUyk7CisJCWJyZWFrOworCWNhc2UgSVJDT01NX1RUWV9DT05ORUNUX0lORElDQVRJT046CisJCWRlbF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOworCisJCS8qIEFjY2VwdCBjb25uZWN0aW9uICovCisJCWlyY29tbV9jb25uZWN0X3Jlc3BvbnNlKHNlbGYtPmlyY29tbSwgTlVMTCk7CisJCWlyY29tbV90dHlfbmV4dF9zdGF0ZShzZWxmLCBJUkNPTU1fVFRZX1JFQURZKTsKKwkJYnJlYWs7CisJY2FzZSBJUkNPTU1fVFRZX1dEX1RJTUVSX0VYUElSRUQ6CisJCS8qIEp1c3Qgc3RheSBpZGxlICovCisJCWJyZWFrOworCWNhc2UgSVJDT01NX1RUWV9ERVRBQ0hfQ0FCTEU6CisJCWlyY29tbV90dHlfbmV4dF9zdGF0ZShzZWxmLCBJUkNPTU1fVFRZX0lETEUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCB1bmtub3duIGV2ZW50OiAlc1xuIiwgX19GVU5DVElPTl9fICwKKwkJCSAgIGlyY29tbV90dHlfZXZlbnRbZXZlbnRdKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfc3RhdGVfc2VhcmNoIChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIFRyeWluZyB0byBkaXNjb3ZlciBhbiBJckNPTU0gZGV2aWNlCisgKgorICovCitzdGF0aWMgaW50IGlyY29tbV90dHlfc3RhdGVfc2VhcmNoKHN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmLCAKKwkJCQkgICBJUkNPTU1fVFRZX0VWRU5UIGV2ZW50LCAKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAKKwkJCQkgICBzdHJ1Y3QgaXJjb21tX3R0eV9pbmZvICppbmZvKQoreworCWludCByZXQgPSAwOworCisJSVJEQV9ERUJVRygyLCAiJXM6IHN0YXRlPSVzLCBldmVudD0lc1xuIiwgX19GVU5DVElPTl9fICwKKwkJICAgaXJjb21tX3R0eV9zdGF0ZVtzZWxmLT5zdGF0ZV0sIGlyY29tbV90dHlfZXZlbnRbZXZlbnRdKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIElSQ09NTV9UVFlfRElTQ09WRVJZX0lORElDQVRJT046CisJCXNlbGYtPmRhZGRyID0gaW5mby0+ZGFkZHI7CisJCXNlbGYtPnNhZGRyID0gaW5mby0+c2FkZHI7CisKKwkJaWYgKHNlbGYtPmlyaWFwKSB7CisJCQlJUkRBX1dBUk5JTkcoIiVzKCksIGJ1c3kgd2l0aCBhIHByZXZpb3VzIHF1ZXJ5XG4iLAorCQkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJCisJCXNlbGYtPmlyaWFwID0gaXJpYXBfb3BlbihMU0FQX0FOWSwgSUFTX0NMSUVOVCwgc2VsZiwKKwkJCQkJIGlyY29tbV90dHlfZ2V0dmFsdWVfY29uZmlybSk7CisJCQorCQlpZiAoc2VsZi0+c2VydmljZV90eXBlID09IElSQ09NTV8zX1dJUkVfUkFXKSB7CisJCQlpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVxdWVzdChzZWxmLT5pcmlhcCwgc2VsZi0+c2FkZHIsCisJCQkJCQkgICAgICBzZWxmLT5kYWRkciwgIklyTFBUIiwgCisJCQkJCQkgICAgICAiSXJEQTpJckxNUDpMc2FwU2VsIik7CisJCQlpcmNvbW1fdHR5X25leHRfc3RhdGUoc2VsZiwgSVJDT01NX1RUWV9RVUVSWV9MU0FQX1NFTCk7CisJCX0gZWxzZSB7CisJCQlpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVxdWVzdChzZWxmLT5pcmlhcCwgc2VsZi0+c2FkZHIsCisJCQkJCQkgICAgICBzZWxmLT5kYWRkciwgCisJCQkJCQkgICAgICAiSXJEQTpJckNPTU0iLCAKKwkJCQkJCSAgICAgICJQYXJhbWV0ZXJzIik7CisKKwkJCWlyY29tbV90dHlfbmV4dF9zdGF0ZShzZWxmLCBJUkNPTU1fVFRZX1FVRVJZX1BBUkFNRVRFUlMpOworCQl9CisJCWlyY29tbV90dHlfc3RhcnRfd2F0Y2hkb2dfdGltZXIoc2VsZiwgMypIWik7CisJCWJyZWFrOworCWNhc2UgSVJDT01NX1RUWV9DT05ORUNUX0lORElDQVRJT046CisJCWRlbF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOworCQlpcmNvbW1fdHR5X2lhc191bnJlZ2lzdGVyKHNlbGYpOworCisJCS8qIEFjY2VwdCBjb25uZWN0aW9uICovCisJCWlyY29tbV9jb25uZWN0X3Jlc3BvbnNlKHNlbGYtPmlyY29tbSwgTlVMTCk7CisJCWlyY29tbV90dHlfbmV4dF9zdGF0ZShzZWxmLCBJUkNPTU1fVFRZX1JFQURZKTsKKwkJYnJlYWs7CisJY2FzZSBJUkNPTU1fVFRZX1dEX1RJTUVSX0VYUElSRUQ6CisjaWYgMQorCQkvKiBHaXZlIHVwICovCisjZWxzZQorCQkvKiBUcnkgdG8gZGlzY292ZXIgYW55IHJlbW90ZSBkZXZpY2VzICovCQkKKwkJaXJjb21tX3R0eV9zdGFydF93YXRjaGRvZ190aW1lcihzZWxmLCAzKkhaKTsKKwkJaXJsbXBfZGlzY292ZXJ5X3JlcXVlc3QoRElTQ09WRVJZX0RFRkFVTFRfU0xPVFMpOworI2VuZGlmCisJCWJyZWFrOworCWNhc2UgSVJDT01NX1RUWV9ERVRBQ0hfQ0FCTEU6CisJCWlyY29tbV90dHlfbmV4dF9zdGF0ZShzZWxmLCBJUkNPTU1fVFRZX0lETEUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCB1bmtub3duIGV2ZW50OiAlc1xuIiwgX19GVU5DVElPTl9fICwKKwkJCSAgIGlyY29tbV90dHlfZXZlbnRbZXZlbnRdKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfc3RhdGVfcXVlcnkgKHNlbGYsIGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgUXVlcnlpbmcgdGhlIHJlbW90ZSBMTS1JQVMgZm9yIElyQ09NTSBwYXJhbWV0ZXJzCisgKgorICovCitzdGF0aWMgaW50IGlyY29tbV90dHlfc3RhdGVfcXVlcnlfcGFyYW1ldGVycyhzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiwgCisJCQkJCSAgICAgSVJDT01NX1RUWV9FVkVOVCBldmVudCwgCisJCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgCisJCQkJCSAgICAgc3RydWN0IGlyY29tbV90dHlfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoMiwgIiVzOiBzdGF0ZT0lcywgZXZlbnQ9JXNcbiIsIF9fRlVOQ1RJT05fXyAsCisJCSAgIGlyY29tbV90dHlfc3RhdGVbc2VsZi0+c3RhdGVdLCBpcmNvbW1fdHR5X2V2ZW50W2V2ZW50XSk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJUkNPTU1fVFRZX0dPVF9QQVJBTUVURVJTOgorCQlpZiAoc2VsZi0+aXJpYXApIHsKKwkJCUlSREFfV0FSTklORygiJXMoKSwgYnVzeSB3aXRoIGEgcHJldmlvdXMgcXVlcnlcbiIsCisJCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQkKKwkJc2VsZi0+aXJpYXAgPSBpcmlhcF9vcGVuKExTQVBfQU5ZLCBJQVNfQ0xJRU5ULCBzZWxmLAorCQkJCQkgaXJjb21tX3R0eV9nZXR2YWx1ZV9jb25maXJtKTsKKworCQlpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVxdWVzdChzZWxmLT5pcmlhcCwgc2VsZi0+c2FkZHIsIAorCQkJCQkgICAgICBzZWxmLT5kYWRkciwgIklyREE6SXJDT01NIiwgCisJCQkJCSAgICAgICJJckRBOlRpbnlUUDpMc2FwU2VsIik7CisKKwkJaXJjb21tX3R0eV9zdGFydF93YXRjaGRvZ190aW1lcihzZWxmLCAzKkhaKTsKKwkJaXJjb21tX3R0eV9uZXh0X3N0YXRlKHNlbGYsIElSQ09NTV9UVFlfUVVFUllfTFNBUF9TRUwpOworCQlicmVhazsKKwljYXNlIElSQ09NTV9UVFlfV0RfVElNRVJfRVhQSVJFRDoKKwkJLyogR28gYmFjayB0byBzZWFyY2ggbW9kZSAqLworCQlpcmNvbW1fdHR5X25leHRfc3RhdGUoc2VsZiwgSVJDT01NX1RUWV9TRUFSQ0gpOworCQlpcmNvbW1fdHR5X3N0YXJ0X3dhdGNoZG9nX3RpbWVyKHNlbGYsIDMqSFopOyAKKwkJYnJlYWs7CisJY2FzZSBJUkNPTU1fVFRZX0NPTk5FQ1RfSU5ESUNBVElPTjoKKwkJZGVsX3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CisJCWlyY29tbV90dHlfaWFzX3VucmVnaXN0ZXIoc2VsZik7CisKKwkJLyogQWNjZXB0IGNvbm5lY3Rpb24gKi8KKwkJaXJjb21tX2Nvbm5lY3RfcmVzcG9uc2Uoc2VsZi0+aXJjb21tLCBOVUxMKTsKKwkJaXJjb21tX3R0eV9uZXh0X3N0YXRlKHNlbGYsIElSQ09NTV9UVFlfUkVBRFkpOworCQlicmVhazsKKwljYXNlIElSQ09NTV9UVFlfREVUQUNIX0NBQkxFOgorCQlpcmNvbW1fdHR5X25leHRfc3RhdGUoc2VsZiwgSVJDT01NX1RUWV9JRExFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgdW5rbm93biBldmVudDogJXNcbiIsIF9fRlVOQ1RJT05fXyAsCisJCQkgICBpcmNvbW1fdHR5X2V2ZW50W2V2ZW50XSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X3N0YXRlX3F1ZXJ5X2xzYXBfc2VsIChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIFF1ZXJ5IHJlbW90ZSBMTS1JQVMgZm9yIHRoZSBMU0FQIHNlbGVjdG9yIHdoaWNoIHdlIGNhbiBjb25uZWN0IHRvCisgKgorICovCitzdGF0aWMgaW50IGlyY29tbV90dHlfc3RhdGVfcXVlcnlfbHNhcF9zZWwoc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYsIAorCQkJCQkgICBJUkNPTU1fVFRZX0VWRU5UIGV2ZW50LCAKKwkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgCisJCQkJCSAgIHN0cnVjdCBpcmNvbW1fdHR5X2luZm8gKmluZm8pCit7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDIsICIlczogc3RhdGU9JXMsIGV2ZW50PSVzXG4iLCBfX0ZVTkNUSU9OX18gLAorCQkgICBpcmNvbW1fdHR5X3N0YXRlW3NlbGYtPnN0YXRlXSwgaXJjb21tX3R0eV9ldmVudFtldmVudF0pOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgSVJDT01NX1RUWV9HT1RfTFNBUFNFTDoKKwkJLyogQ29ubmVjdCB0byByZW1vdGUgZGV2aWNlICovCisJCXJldCA9IGlyY29tbV9jb25uZWN0X3JlcXVlc3Qoc2VsZi0+aXJjb21tLCBzZWxmLT5kbHNhcF9zZWwsCisJCQkJCSAgICAgc2VsZi0+c2FkZHIsIHNlbGYtPmRhZGRyLCAKKwkJCQkJICAgICBOVUxMLCBzZWxmLT5zZXJ2aWNlX3R5cGUpOworCQlpcmNvbW1fdHR5X3N0YXJ0X3dhdGNoZG9nX3RpbWVyKHNlbGYsIDMqSFopOworCQlpcmNvbW1fdHR5X25leHRfc3RhdGUoc2VsZiwgSVJDT01NX1RUWV9TRVRVUCk7CisJCWJyZWFrOworCWNhc2UgSVJDT01NX1RUWV9XRF9USU1FUl9FWFBJUkVEOgorCQkvKiBHbyBiYWNrIHRvIHNlYXJjaCBtb2RlICovCisJCWlyY29tbV90dHlfbmV4dF9zdGF0ZShzZWxmLCBJUkNPTU1fVFRZX1NFQVJDSCk7CisJCWlyY29tbV90dHlfc3RhcnRfd2F0Y2hkb2dfdGltZXIoc2VsZiwgMypIWik7CisJCWJyZWFrOworCWNhc2UgSVJDT01NX1RUWV9DT05ORUNUX0lORElDQVRJT046CisJCWRlbF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOworCQlpcmNvbW1fdHR5X2lhc191bnJlZ2lzdGVyKHNlbGYpOworCisJCS8qIEFjY2VwdCBjb25uZWN0aW9uICovCisJCWlyY29tbV9jb25uZWN0X3Jlc3BvbnNlKHNlbGYtPmlyY29tbSwgTlVMTCk7CisJCWlyY29tbV90dHlfbmV4dF9zdGF0ZShzZWxmLCBJUkNPTU1fVFRZX1JFQURZKTsKKwkJYnJlYWs7CisJY2FzZSBJUkNPTU1fVFRZX0RFVEFDSF9DQUJMRToKKwkJaXJjb21tX3R0eV9uZXh0X3N0YXRlKHNlbGYsIElSQ09NTV9UVFlfSURMRSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIHVua25vd24gZXZlbnQ6ICVzXG4iLCBfX0ZVTkNUSU9OX18gLAorCQkJICAgaXJjb21tX3R0eV9ldmVudFtldmVudF0pOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV9zdGF0ZV9zZXR1cCAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICBUcnlpbmcgdG8gY29ubmVjdAorICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fdHR5X3N0YXRlX3NldHVwKHN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmLCAKKwkJCQkgIElSQ09NTV9UVFlfRVZFTlQgZXZlbnQsIAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgCisJCQkJICBzdHJ1Y3QgaXJjb21tX3R0eV9pbmZvICppbmZvKQoreworCWludCByZXQgPSAwOworCisJSVJEQV9ERUJVRygyLCAiJXM6IHN0YXRlPSVzLCBldmVudD0lc1xuIiwgX19GVU5DVElPTl9fICwKKwkJICAgaXJjb21tX3R0eV9zdGF0ZVtzZWxmLT5zdGF0ZV0sIGlyY29tbV90dHlfZXZlbnRbZXZlbnRdKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIElSQ09NTV9UVFlfQ09OTkVDVF9DT05GSVJNOgorCQlkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKKwkJaXJjb21tX3R0eV9pYXNfdW5yZWdpc3RlcihzZWxmKTsKKwkJCisJCS8qIAorCQkgKiBTZW5kIGluaXRpYWwgcGFyYW1ldGVycy4gVGhpcyB3aWxsIGFsc28gc2VuZCBvdXQgcXVldWVkCisJCSAqIHBhcmFtZXRlcnMgd2FpdGluZyBmb3IgdGhlIGNvbm5lY3Rpb24gdG8gY29tZSB1cCAKKwkJICovCisJCWlyY29tbV90dHlfc2VuZF9pbml0aWFsX3BhcmFtZXRlcnMoc2VsZik7CisJCWlyY29tbV90dHlfbGlua19lc3RhYmxpc2hlZChzZWxmKTsKKwkJaXJjb21tX3R0eV9uZXh0X3N0YXRlKHNlbGYsIElSQ09NTV9UVFlfUkVBRFkpOworCQlicmVhazsKKwljYXNlIElSQ09NTV9UVFlfQ09OTkVDVF9JTkRJQ0FUSU9OOgorCQlkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKKwkJaXJjb21tX3R0eV9pYXNfdW5yZWdpc3RlcihzZWxmKTsKKwkJCisJCS8qIEFjY2VwdCBjb25uZWN0aW9uICovCisJCWlyY29tbV9jb25uZWN0X3Jlc3BvbnNlKHNlbGYtPmlyY29tbSwgTlVMTCk7CisJCWlyY29tbV90dHlfbmV4dF9zdGF0ZShzZWxmLCBJUkNPTU1fVFRZX1JFQURZKTsKKwkJYnJlYWs7CisJY2FzZSBJUkNPTU1fVFRZX1dEX1RJTUVSX0VYUElSRUQ6CisJCS8qIEdvIGJhY2sgdG8gc2VhcmNoIG1vZGUgKi8KKwkJaXJjb21tX3R0eV9uZXh0X3N0YXRlKHNlbGYsIElSQ09NTV9UVFlfU0VBUkNIKTsKKwkJaXJjb21tX3R0eV9zdGFydF93YXRjaGRvZ190aW1lcihzZWxmLCAzKkhaKTsKKwkJYnJlYWs7CisJY2FzZSBJUkNPTU1fVFRZX0RFVEFDSF9DQUJMRToKKwkJLyogaXJjb21tX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmLT5pcmNvbW0sIE5VTEwpOyAqLworCQlpcmNvbW1fdHR5X25leHRfc3RhdGUoc2VsZiwgSVJDT01NX1RUWV9JRExFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgdW5rbm93biBldmVudDogJXNcbiIsIF9fRlVOQ1RJT05fXyAsCisJCQkgICBpcmNvbW1fdHR5X2V2ZW50W2V2ZW50XSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X3N0YXRlX3JlYWR5IChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIElyQ09NTSBpcyBub3cgY29ubmVjdGVkCisgKgorICovCitzdGF0aWMgaW50IGlyY29tbV90dHlfc3RhdGVfcmVhZHkoc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYsIAorCQkJCSAgSVJDT01NX1RUWV9FVkVOVCBldmVudCwgCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAKKwkJCQkgIHN0cnVjdCBpcmNvbW1fdHR5X2luZm8gKmluZm8pCit7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJUkNPTU1fVFRZX0RBVEFfUkVRVUVTVDoKKwkJcmV0ID0gaXJjb21tX2RhdGFfcmVxdWVzdChzZWxmLT5pcmNvbW0sIHNrYik7CisJCWJyZWFrOwkJCisJY2FzZSBJUkNPTU1fVFRZX0RFVEFDSF9DQUJMRToKKwkJaXJjb21tX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmLT5pcmNvbW0sIE5VTEwpOworCQlpcmNvbW1fdHR5X25leHRfc3RhdGUoc2VsZiwgSVJDT01NX1RUWV9JRExFKTsKKwkJYnJlYWs7CisJY2FzZSBJUkNPTU1fVFRZX0RJU0NPTk5FQ1RfSU5ESUNBVElPTjoKKwkJaXJjb21tX3R0eV9pYXNfcmVnaXN0ZXIoc2VsZik7CisJCWlyY29tbV90dHlfbmV4dF9zdGF0ZShzZWxmLCBJUkNPTU1fVFRZX1NFQVJDSCk7CisJCWlyY29tbV90dHlfc3RhcnRfd2F0Y2hkb2dfdGltZXIoc2VsZiwgMypIWik7CisKKwkJaWYgKHNlbGYtPmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpIHsKKwkJCS8qIERyb3AgY2FycmllciAqLworCQkJc2VsZi0+c2V0dGluZ3MuZGNlID0gSVJDT01NX0RFTFRBX0NEOworCQkJaXJjb21tX3R0eV9jaGVja19tb2RlbV9zdGF0dXMoc2VsZik7CisJCX0gZWxzZSB7CisJCQlJUkRBX0RFQlVHKDAsICIlcygpLCBoYW5naW5nIHVwIVxuIiwgX19GVU5DVElPTl9fICk7CisJCQlpZiAoc2VsZi0+dHR5KQorCQkJCXR0eV9oYW5ndXAoc2VsZi0+dHR5KTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCB1bmtub3duIGV2ZW50OiAlc1xuIiwgX19GVU5DVElPTl9fICwKKwkJCSAgIGlyY29tbV90dHlfZXZlbnRbZXZlbnRdKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJldDsKK30KKwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJjb21tL2lyY29tbV90dHlfaW9jdGwuYyBiL25ldC9pcmRhL2lyY29tbS9pcmNvbW1fdHR5X2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk3ZTNlNwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lyY29tbS9pcmNvbW1fdHR5X2lvY3RsLmMKQEAgLTAsMCArMSw0MjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgaXJjb21tX3R0eV9pb2N0bC5jCisgKiBWZXJzaW9uOiAgICAgICAKKyAqIERlc2NyaXB0aW9uOiAgIAorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgVGh1IEp1biAxMCAxNDozOTowOSAxOTk5CisgKiBNb2RpZmllZCBhdDogICBXZWQgSmFuICA1IDE0OjQ1OjQzIDIwMDAKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OS0yMDAwIERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAqICAgICBNQSAwMjExMS0xMzA3IFVTQQorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90ZXJtaW9zLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybW9kLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmNvbW1fY29yZS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyY29tbV9wYXJhbS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyY29tbV90dHlfYXR0YWNoLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJjb21tX3R0eS5oPgorCisjZGVmaW5lIFJFTEVWQU5UX0lGTEFHKGlmbGFnKSAoaWZsYWcgJiAoSUdOQlJLfEJSS0lOVHxJR05QQVJ8UEFSTVJLfElOUENLKSkKKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfY2hhbmdlX3NwZWVkIChkcml2ZXIpCisgKgorICogICAgQ2hhbmdlIHNwZWVkIG9mIHRoZSBkcml2ZXIuIElmIHRoZSByZW1vdGUgZGV2aWNlIGlzIGEgRENFLCB0aGVuIHRoaXMKKyAqICAgIHNob3VsZCBtYWtlIGl0IGNoYW5nZSB0aGUgc3BlZWQgb2YgaXRzIHNlcmlhbCBwb3J0CisgKi8KK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmKQoreworCXVuc2lnbmVkIGNmbGFnLCBjdmFsOworCWludCBiYXVkOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlpZiAoIXNlbGYtPnR0eSB8fCAhc2VsZi0+dHR5LT50ZXJtaW9zIHx8ICFzZWxmLT5pcmNvbW0pCisJCXJldHVybjsKKworCWNmbGFnID0gc2VsZi0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCisJLyogIGJ5dGUgc2l6ZSBhbmQgcGFyaXR5ICovCisJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7CisJY2FzZSBDUzU6IGN2YWwgPSBJUkNPTU1fV1NJWkVfNTsgYnJlYWs7CisJY2FzZSBDUzY6IGN2YWwgPSBJUkNPTU1fV1NJWkVfNjsgYnJlYWs7CisJY2FzZSBDUzc6IGN2YWwgPSBJUkNPTU1fV1NJWkVfNzsgYnJlYWs7CisJY2FzZSBDUzg6IGN2YWwgPSBJUkNPTU1fV1NJWkVfODsgYnJlYWs7CisJZGVmYXVsdDogIGN2YWwgPSBJUkNPTU1fV1NJWkVfNTsgYnJlYWs7CisJfQorCWlmIChjZmxhZyAmIENTVE9QQikKKwkJY3ZhbCB8PSBJUkNPTU1fMl9TVE9QX0JJVDsKKwkKKwlpZiAoY2ZsYWcgJiBQQVJFTkIpCisJCWN2YWwgfD0gSVJDT01NX1BBUklUWV9FTkFCTEU7CisJaWYgKCEoY2ZsYWcgJiBQQVJPREQpKQorCQljdmFsIHw9IElSQ09NTV9QQVJJVFlfRVZFTjsKKworCS8qIERldGVybWluZSBkaXZpc29yIGJhc2VkIG9uIGJhdWQgcmF0ZSAqLworCWJhdWQgPSB0dHlfZ2V0X2JhdWRfcmF0ZShzZWxmLT50dHkpOworCWlmICghYmF1ZCkKKwkJYmF1ZCA9IDk2MDA7CS8qIEIwIHRyYW5zaXRpb24gaGFuZGxlZCBpbiByc19zZXRfdGVybWlvcyAqLworCisJc2VsZi0+c2V0dGluZ3MuZGF0YV9yYXRlID0gYmF1ZDsKKwlpcmNvbW1fcGFyYW1fcmVxdWVzdChzZWxmLCBJUkNPTU1fREFUQV9SQVRFLCBGQUxTRSk7CisJCisJLyogQ1RTIGZsb3cgY29udHJvbCBmbGFnIGFuZCBtb2RlbSBzdGF0dXMgaW50ZXJydXB0cyAqLworCWlmIChjZmxhZyAmIENSVFNDVFMpIHsKKwkJc2VsZi0+ZmxhZ3MgfD0gQVNZTkNfQ1RTX0ZMT1c7CisJCXNlbGYtPnNldHRpbmdzLmZsb3dfY29udHJvbCB8PSBJUkNPTU1fUlRTX0NUU19JTjsKKwkJLyogVGhpcyBnb3QgbWUuIEJ1bW1lci4gSmVhbiBJSSAqLworCQlpZiAoc2VsZi0+c2VydmljZV90eXBlID09IElSQ09NTV8zX1dJUkVfUkFXKQorCQkJSVJEQV9XQVJOSU5HKCIlcygpLCBlbmFibGluZyBSVFMvQ1RTIG9uIGxpbmsgdGhhdCBkb2Vzbid0IHN1cHBvcnQgaXQgKDMtd2lyZS1yYXcpXG4iLCBfX0ZVTkNUSU9OX18pOworCX0gZWxzZSB7CisJCXNlbGYtPmZsYWdzICY9IH5BU1lOQ19DVFNfRkxPVzsKKwkJc2VsZi0+c2V0dGluZ3MuZmxvd19jb250cm9sICY9IH5JUkNPTU1fUlRTX0NUU19JTjsKKwl9CisJaWYgKGNmbGFnICYgQ0xPQ0FMKQorCQlzZWxmLT5mbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7CisJZWxzZQorCQlzZWxmLT5mbGFncyB8PSBBU1lOQ19DSEVDS19DRDsKKyNpZiAwCQorCS8qCisJICogU2V0IHVwIHBhcml0eSBjaGVjayBmbGFnCisJICovCisKKwlpZiAoSV9JTlBDSyhzZWxmLT50dHkpKQorCQlkcml2ZXItPnJlYWRfc3RhdHVzX21hc2sgfD0gTFNSX0ZFIHwgTFNSX1BFOworCWlmIChJX0JSS0lOVChkcml2ZXItPnR0eSkgfHwgSV9QQVJNUksoZHJpdmVyLT50dHkpKQorCQlkcml2ZXItPnJlYWRfc3RhdHVzX21hc2sgfD0gTFNSX0JJOworCQorCS8qCisJICogQ2hhcmFjdGVycyB0byBpZ25vcmUKKwkgKi8KKwlkcml2ZXItPmlnbm9yZV9zdGF0dXNfbWFzayA9IDA7CisJaWYgKElfSUdOUEFSKGRyaXZlci0+dHR5KSkKKwkJZHJpdmVyLT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gTFNSX1BFIHwgTFNSX0ZFOworCisJaWYgKElfSUdOQlJLKHNlbGYtPnR0eSkpIHsKKwkJc2VsZi0+aWdub3JlX3N0YXR1c19tYXNrIHw9IExTUl9CSTsKKwkJLyoKKwkJICogSWYgd2UncmUgaWdub3JlIHBhcml0eSBhbmQgYnJlYWsgaW5kaWNhdG9ycywgaWdub3JlIAorCQkgKiBvdmVycnVucyB0b28uIChGb3IgcmVhbCByYXcgc3VwcG9ydCkuCisJCSAqLworCQlpZiAoSV9JR05QQVIoc2VsZi0+dHR5KSkgCisJCQlzZWxmLT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gTFNSX09FOworCX0KKyNlbmRpZgorCXNlbGYtPnNldHRpbmdzLmRhdGFfZm9ybWF0ID0gY3ZhbDsKKworCWlyY29tbV9wYXJhbV9yZXF1ZXN0KHNlbGYsIElSQ09NTV9EQVRBX0ZPUk1BVCwgRkFMU0UpOworIAlpcmNvbW1fcGFyYW1fcmVxdWVzdChzZWxmLCBJUkNPTU1fRkxPV19DT05UUk9MLCBUUlVFKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyY29tbV90dHlfc2V0X3Rlcm1pb3MgKHR0eSwgb2xkX3Rlcm1pb3MpCisgKgorICogICAgVGhpcyByb3V0aW5lIGFsbG93cyB0aGUgdHR5IGRyaXZlciB0byBiZSBub3RpZmllZCB3aGVuIGRldmljZSdzCisgKiAgICB0ZXJtaW9zIHNldHRpbmdzIGhhdmUgY2hhbmdlZC4gIE5vdGUgdGhhdCBhIHdlbGwtZGVzaWduZWQgdHR5IGRyaXZlcgorICogICAgc2hvdWxkIGJlIHByZXBhcmVkIHRvIGFjY2VwdCB0aGUgY2FzZSB3aGVyZSBvbGQgPT0gTlVMTCwgYW5kIHRyeSB0bworICogICAgZG8gc29tZXRoaW5nIHJhdGlvbmFsLgorICovCit2b2lkIGlyY29tbV90dHlfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgCisJCQkgICAgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQoreworCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgaW50IGNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlpZiAoKGNmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnKSAmJiAKKwkgICAgKFJFTEVWQU5UX0lGTEFHKHR0eS0+dGVybWlvcy0+Y19pZmxhZykgPT0gCisJICAgICBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpKQorCXsKKwkJcmV0dXJuOworCX0KKworCWlyY29tbV90dHlfY2hhbmdlX3NwZWVkKHNlbGYpOworCisJLyogSGFuZGxlIHRyYW5zaXRpb24gdG8gQjAgc3RhdHVzICovCisJaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSAmJgorCSAgICAhKGNmbGFnICYgQ0JBVUQpKSB7CisJCXNlbGYtPnNldHRpbmdzLmR0ZSAmPSB+KElSQ09NTV9EVFJ8SVJDT01NX1JUUyk7CisJCWlyY29tbV9wYXJhbV9yZXF1ZXN0KHNlbGYsIElSQ09NTV9EVEUsIFRSVUUpOworCX0KKwkKKwkvKiBIYW5kbGUgdHJhbnNpdGlvbiBhd2F5IGZyb20gQjAgc3RhdHVzICovCisJaWYgKCEob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgJiYKKwkgICAgKGNmbGFnICYgQ0JBVUQpKSB7CisJCXNlbGYtPnNldHRpbmdzLmR0ZSB8PSBJUkNPTU1fRFRSOworCQlpZiAoISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB8fCAKKwkJICAgICF0ZXN0X2JpdChUVFlfVEhST1RUTEVELCAmdHR5LT5mbGFncykpIHsKKwkJCXNlbGYtPnNldHRpbmdzLmR0ZSB8PSBJUkNPTU1fUlRTOworCQl9CisJCWlyY29tbV9wYXJhbV9yZXF1ZXN0KHNlbGYsIElSQ09NTV9EVEUsIFRSVUUpOworCX0KKwkKKwkvKiBIYW5kbGUgdHVybmluZyBvZmYgQ1JUU0NUUyAqLworCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJgorCSAgICAhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSAKKwl7CisJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCWlyY29tbV90dHlfc3RhcnQodHR5KTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X3Rpb2NtZ2V0ICh0dHksIGZpbGUpCisgKgorICogICAgCisgKgorICovCitpbnQgaXJjb21tX3R0eV90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGludCByZXN1bHQ7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXN1bHQgPSAgKChzZWxmLT5zZXR0aW5ncy5kdGUgJiBJUkNPTU1fUlRTKSA/IFRJT0NNX1JUUyA6IDApCisJCXwgKChzZWxmLT5zZXR0aW5ncy5kdGUgJiBJUkNPTU1fRFRSKSA/IFRJT0NNX0RUUiA6IDApCisJCXwgKChzZWxmLT5zZXR0aW5ncy5kY2UgJiBJUkNPTU1fQ0QpICA/IFRJT0NNX0NBUiA6IDApCisJCXwgKChzZWxmLT5zZXR0aW5ncy5kY2UgJiBJUkNPTU1fUkkpICA/IFRJT0NNX1JORyA6IDApCisJCXwgKChzZWxmLT5zZXR0aW5ncy5kY2UgJiBJUkNPTU1fRFNSKSA/IFRJT0NNX0RTUiA6IDApCisJCXwgKChzZWxmLT5zZXR0aW5ncy5kY2UgJiBJUkNPTU1fQ1RTKSA/IFRJT0NNX0NUUyA6IDApOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X3Rpb2Ntc2V0ICh0dHksIGZpbGUsIHNldCwgY2xlYXIpCisgKgorICogICAgCisgKgorICovCitpbnQgaXJjb21tX3R0eV90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sgCisJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQorCQlyZXR1cm4gLUVJTzsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJDT01NX1RUWV9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlpZiAoc2V0ICYgVElPQ01fUlRTKQorCQlzZWxmLT5zZXR0aW5ncy5kdGUgfD0gSVJDT01NX1JUUzsKKwlpZiAoc2V0ICYgVElPQ01fRFRSKQorCQlzZWxmLT5zZXR0aW5ncy5kdGUgfD0gSVJDT01NX0RUUjsKKworCWlmIChjbGVhciAmIFRJT0NNX1JUUykKKwkJc2VsZi0+c2V0dGluZ3MuZHRlICY9IH5JUkNPTU1fUlRTOworCWlmIChjbGVhciAmIFRJT0NNX0RUUikKKwkJc2VsZi0+c2V0dGluZ3MuZHRlICY9IH5JUkNPTU1fRFRSOworCisJaWYgKChzZXR8Y2xlYXIpICYgVElPQ01fUlRTKQorCQlzZWxmLT5zZXR0aW5ncy5kdGUgfD0gSVJDT01NX0RFTFRBX1JUUzsKKwlpZiAoKHNldHxjbGVhcikgJiBUSU9DTV9EVFIpCisJCXNlbGYtPnNldHRpbmdzLmR0ZSB8PSBJUkNPTU1fREVMVEFfRFRSOworCisJaXJjb21tX3BhcmFtX3JlcXVlc3Qoc2VsZiwgSVJDT01NX0RURSwgVFJVRSk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBnZXRfc2VyaWFsX2luZm8gKGRyaXZlciwgcmV0aW5mbykKKyAqCisgKiAgICAKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJjb21tX3R0eV9nZXRfc2VyaWFsX2luZm8oc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYsCisJCQkJICAgICAgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpyZXRpbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IGluZm87CisgICAKKwlpZiAoIXJldGluZm8pCisJCXJldHVybiAtRUZBVUxUOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisJaW5mby5saW5lID0gc2VsZi0+bGluZTsKKwlpbmZvLmZsYWdzID0gc2VsZi0+ZmxhZ3M7CisJaW5mby5iYXVkX2Jhc2UgPSBzZWxmLT5zZXR0aW5ncy5kYXRhX3JhdGU7CisJaW5mby5jbG9zZV9kZWxheSA9IHNlbGYtPmNsb3NlX2RlbGF5OworCWluZm8uY2xvc2luZ193YWl0ID0gc2VsZi0+Y2xvc2luZ193YWl0OworCisJLyogRm9yIGNvbXBhdGliaWxpdHkgICovCisgCWluZm8udHlwZSA9IFBPUlRfMTY1NTBBOworIAlpbmZvLnBvcnQgPSAwOworIAlpbmZvLmlycSA9IDA7CisJaW5mby54bWl0X2ZpZm9fc2l6ZSA9IDA7CisJaW5mby5odWI2ID0gMDsgICAKKwlpbmZvLmN1c3RvbV9kaXZpc29yID0gMDsKKworCWlmIChjb3B5X3RvX3VzZXIocmV0aW5mbywgJmluZm8sIHNpemVvZigqcmV0aW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gc2V0X3NlcmlhbF9pbmZvIChkcml2ZXIsIG5ld19pbmZvKQorICoKKyAqICAgIAorICoKKyAqLworc3RhdGljIGludCBpcmNvbW1fdHR5X3NldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiwKKwkJCQkgICAgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKm5ld19pbmZvKQoreworI2lmIDAKKwlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBuZXdfc2VyaWFsOworCXN0cnVjdCBpcmNvbW1fdHR5X2NiIG9sZF9zdGF0ZSwgKnN0YXRlOworCisJSVJEQV9ERUJVRygwLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19zZXJpYWwsbmV3X2luZm8sc2l6ZW9mKG5ld19zZXJpYWwpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKworCXN0YXRlID0gc2VsZgorCW9sZF9zdGF0ZSA9ICpzZWxmOworICAKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJaWYgKChuZXdfc2VyaWFsLmJhdWRfYmFzZSAhPSBzdGF0ZS0+c2V0dGluZ3MuZGF0YV9yYXRlKSB8fAorCQkgICAgKG5ld19zZXJpYWwuY2xvc2VfZGVsYXkgIT0gc3RhdGUtPmNsb3NlX2RlbGF5KSB8fAorCQkgICAgKChuZXdfc2VyaWFsLmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSAhPQorCQkgICAgIChzZWxmLT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykpKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJc3RhdGUtPmZsYWdzID0gKChzdGF0ZS0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spIHwKKwkJCQkgKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19VU1JfTUFTSykpOworCQlzZWxmLT5mbGFncyA9ICgoc2VsZi0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spIHwKKwkJCSAgICAgICAobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX1VTUl9NQVNLKSk7CisJCS8qIHNlbGYtPmN1c3RvbV9kaXZpc29yID0gbmV3X3NlcmlhbC5jdXN0b21fZGl2aXNvcjsgKi8KKwkJZ290byBjaGVja19hbmRfZXhpdDsKKwl9CisKKwkvKgorCSAqIE9LLCBwYXN0IHRoaXMgcG9pbnQsIGFsbCB0aGUgZXJyb3IgY2hlY2tpbmcgaGFzIGJlZW4gZG9uZS4KKwkgKiBBdCB0aGlzIHBvaW50LCB3ZSBzdGFydCBtYWtpbmcgY2hhbmdlcy4uLi4uCisJICovCisKKwlpZiAoc2VsZi0+c2V0dGluZ3MuZGF0YV9yYXRlICE9IG5ld19zZXJpYWwuYmF1ZF9iYXNlKSB7CisJCXNlbGYtPnNldHRpbmdzLmRhdGFfcmF0ZSA9IG5ld19zZXJpYWwuYmF1ZF9iYXNlOworCQlpcmNvbW1fcGFyYW1fcmVxdWVzdChzZWxmLCBJUkNPTU1fREFUQV9SQVRFLCBUUlVFKTsKKwl9CisKKwlzZWxmLT5jbG9zZV9kZWxheSA9IG5ld19zZXJpYWwuY2xvc2VfZGVsYXkgKiBIWi8xMDA7CisJc2VsZi0+Y2xvc2luZ193YWl0ID0gbmV3X3NlcmlhbC5jbG9zaW5nX3dhaXQgKiBIWi8xMDA7CisJLyogc2VsZi0+Y3VzdG9tX2Rpdmlzb3IgPSBuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yOyAqLworCisJc2VsZi0+ZmxhZ3MgPSAoKHNlbGYtPmZsYWdzICYgfkFTWU5DX0ZMQUdTKSB8CisJCSAgICAgICAobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX0ZMQUdTKSk7CisJc2VsZi0+dHR5LT5sb3dfbGF0ZW5jeSA9IChzZWxmLT5mbGFncyAmIEFTWU5DX0xPV19MQVRFTkNZKSA/IDEgOiAwOworCisgY2hlY2tfYW5kX2V4aXQ6CisKKwlpZiAoc2VsZi0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgeworCQlpZiAoKChvbGRfc3RhdGUuZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgIT0KKwkJICAgICAoc2VsZi0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykpIHx8CisJCSAgICAob2xkX2RyaXZlci5jdXN0b21fZGl2aXNvciAhPSBkcml2ZXItPmN1c3RvbV9kaXZpc29yKSkgeworCQkJaWYgKChkcml2ZXItPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9ISSkKKwkJCQlkcml2ZXItPnR0eS0+YWx0X3NwZWVkID0gNTc2MDA7CisJCQlpZiAoKGRyaXZlci0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1ZISSkKKwkJCQlkcml2ZXItPnR0eS0+YWx0X3NwZWVkID0gMTE1MjAwOworCQkJaWYgKChkcml2ZXItPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9TSEkpCisJCQkJZHJpdmVyLT50dHktPmFsdF9zcGVlZCA9IDIzMDQwMDsKKwkJCWlmICgoZHJpdmVyLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfV0FSUCkKKwkJCQlkcml2ZXItPnR0eS0+YWx0X3NwZWVkID0gNDYwODAwOworCQkJaXJjb21tX3R0eV9jaGFuZ2Vfc3BlZWQoZHJpdmVyKTsKKwkJfQorCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJjb21tX3R0eV9pb2N0bCAodHR5LCBmaWxlLCBjbWQsIGFyZykKKyAqCisgKiAgICAKKyAqCisgKi8KK2ludCBpcmNvbW1fdHR5X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLCAKKwkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqKSB0dHktPmRyaXZlcl9kYXRhOworCWludCByZXQgPSAwOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlpZiAoKGNtZCAhPSBUSU9DR1NFUklBTCkgJiYgKGNtZCAhPSBUSU9DU1NFUklBTCkgJiYKKwkgICAgKGNtZCAhPSBUSU9DU0VSQ09ORklHKSAmJiAoY21kICE9IFRJT0NTRVJHU1RSVUNUKSAmJgorCSAgICAoY21kICE9IFRJT0NNSVdBSVQpICYmIChjbWQgIT0gVElPQ0dJQ09VTlQpKSB7CisJCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKKwkJICAgIHJldHVybiAtRUlPOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUSU9DR1NFUklBTDoKKwkJcmV0ID0gaXJjb21tX3R0eV9nZXRfc2VyaWFsX2luZm8oc2VsZiwgKHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqKSBhcmcpOworCQlicmVhazsKKwljYXNlIFRJT0NTU0VSSUFMOgorCQlyZXQgPSBpcmNvbW1fdHR5X3NldF9zZXJpYWxfaW5mbyhzZWxmLCAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICopIGFyZyk7CisJCWJyZWFrOworCWNhc2UgVElPQ01JV0FJVDoKKwkJSVJEQV9ERUJVRygwLCAiKCksIFRJT0NNSVdBSVQsIG5vdCBpbXBsIVxuIik7CisJCWJyZWFrOworCisJY2FzZSBUSU9DR0lDT1VOVDoKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVElPQ0dJQ09VTlQgbm90IGltcGwhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKyNpZiAwCisJCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKKwkJY25vdyA9IGRyaXZlci0+aWNvdW50OworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJcF9jdXNlciA9IChzdHJ1Y3Qgc2VyaWFsX2ljb3VudGVyX3N0cnVjdCBfX3VzZXIgKikgYXJnOworCQlpZiAocHV0X3VzZXIoY25vdy5jdHMsICZwX2N1c2VyLT5jdHMpIHx8CisJCSAgICBwdXRfdXNlcihjbm93LmRzciwgJnBfY3VzZXItPmRzcikgfHwKKwkJICAgIHB1dF91c2VyKGNub3cucm5nLCAmcF9jdXNlci0+cm5nKSB8fAorCQkgICAgcHV0X3VzZXIoY25vdy5kY2QsICZwX2N1c2VyLT5kY2QpIHx8CisJCSAgICBwdXRfdXNlcihjbm93LnJ4LCAmcF9jdXNlci0+cngpIHx8CisJCSAgICBwdXRfdXNlcihjbm93LnR4LCAmcF9jdXNlci0+dHgpIHx8CisJCSAgICBwdXRfdXNlcihjbm93LmZyYW1lLCAmcF9jdXNlci0+ZnJhbWUpIHx8CisJCSAgICBwdXRfdXNlcihjbm93Lm92ZXJydW4sICZwX2N1c2VyLT5vdmVycnVuKSB8fAorCQkgICAgcHV0X3VzZXIoY25vdy5wYXJpdHksICZwX2N1c2VyLT5wYXJpdHkpIHx8CisJCSAgICBwdXRfdXNlcihjbm93LmJyaywgJnBfY3VzZXItPmJyaykgfHwKKwkJICAgIHB1dF91c2VyKGNub3cuYnVmX292ZXJydW4sICZwX2N1c2VyLT5idWZfb3ZlcnJ1bikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKyNlbmRpZgkJCisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9JT0NUTENNRDsgIC8qIGlvY3RscyB3aGljaCB3ZSBtdXN0IGlnbm9yZSAqLworCX0KKwlyZXR1cm4gcmV0OworfQorCisKKwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJkYV9kZXZpY2UuYyBiL25ldC9pcmRhL2lyZGFfZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRhMjk5ZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lyZGFfZGV2aWNlLmMKQEAgLTAsMCArMSw0ODkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGaWxlbmFtZTogICAgICBpcmRhX2RldmljZS5jCisgKiBWZXJzaW9uOiAgICAgICAwLjkKKyAqIERlc2NyaXB0aW9uOiAgIFV0aWxpdHkgZnVuY3Rpb25zIHVzZWQgYnkgdGhlIGRldmljZSBkcml2ZXJzCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBTYXQgT2N0ICA5IDA5OjIyOjI3IDE5OTkKKyAqIE1vZGlmaWVkIGF0OiAgIFN1biBKYW4gMjMgMTc6NDE6MjQgMjAwMAorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICoKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMCBEYWcgQnJhdHRsaSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS90aW1lci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL3dyYXBwZXIuaD4KKworc3RhdGljIHZvaWQgX19pcmRhX3Rhc2tfZGVsZXRlKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spOworCitzdGF0aWMgaGFzaGJpbl90ICpkb25nbGVzID0gTlVMTDsKK3N0YXRpYyBoYXNoYmluX3QgKnRhc2tzID0gTlVMTDsKKworI2lmZGVmIENPTkZJR19JUkRBX0RFQlVHCitzdGF0aWMgY29uc3QgY2hhciAqdGFza19zdGF0ZVtdID0geworCSJJUkRBX1RBU0tfSU5JVCIsCisJIklSREFfVEFTS19ET05FIiwKKwkiSVJEQV9UQVNLX1dBSVQiLAorCSJJUkRBX1RBU0tfV0FJVDEiLAorCSJJUkRBX1RBU0tfV0FJVDIiLAorCSJJUkRBX1RBU0tfV0FJVDMiLAorCSJJUkRBX1RBU0tfQ0hJTERfSU5JVCIsCisJIklSREFfVEFTS19DSElMRF9XQUlUIiwKKwkiSVJEQV9UQVNLX0NISUxEX0RPTkUiLAorfTsKKyNlbmRpZgkvKiBDT05GSUdfSVJEQV9ERUJVRyAqLworCitzdGF0aWMgdm9pZCBpcmRhX3Rhc2tfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKTsKKworaW50IF9faW5pdCBpcmRhX2RldmljZV9pbml0KCB2b2lkKQoreworCWRvbmdsZXMgPSBoYXNoYmluX25ldyhIQl9OT0xPQ0spOworCWlmIChkb25nbGVzID09IE5VTEwpIHsKKwkJSVJEQV9XQVJOSU5HKCJJckRBOiBDYW4ndCBhbGxvY2F0ZSBkb25nbGVzIGhhc2hiaW4hXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXNwaW5fbG9ja19pbml0KCZkb25nbGVzLT5oYl9zcGlubG9jayk7CisKKwl0YXNrcyA9IGhhc2hiaW5fbmV3KEhCX0xPQ0spOworCWlmICh0YXNrcyA9PSBOVUxMKSB7CisJCUlSREFfV0FSTklORygiSXJEQTogQ2FuJ3QgYWxsb2NhdGUgdGFza3MgaGFzaGJpbiFcbiIpOworCQloYXNoYmluX2RlbGV0ZShkb25nbGVzLCBOVUxMKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogV2Ugbm8gbG9uZ2VyIGluaXRpYWxpc2UgdGhlIGRyaXZlciBvdXJzZWx2ZXMgaGVyZSwgd2UgbGV0CisJICogdGhlIHN5c3RlbSBkbyBpdCBmb3IgdXMuLi4gLSBKZWFuIElJICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGxlZnRvdmVyX2RvbmdsZSh2b2lkICphcmcpCit7CisJc3RydWN0IGRvbmdsZV9yZWcgKnJlZyA9IGFyZzsKKwlJUkRBX1dBUk5JTkcoIklyREE6IERvbmdsZSB0eXBlICV4IG5vdCB1bnJlZ2lzdGVyZWRcbiIsCisJCSAgICAgcmVnLT50eXBlKTsKK30KKwordm9pZCBfX2V4aXQgaXJkYV9kZXZpY2VfY2xlYW51cCh2b2lkKQoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwloYXNoYmluX2RlbGV0ZSh0YXNrcywgKEZSRUVfRlVOQykgX19pcmRhX3Rhc2tfZGVsZXRlKTsKKworCWhhc2hiaW5fZGVsZXRlKGRvbmdsZXMsIGxlZnRvdmVyX2RvbmdsZSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeSAoc2VsZiwgc3RhdHVzKQorICoKKyAqICAgIENhbGxlZCB3aGVuIHdlIGhhdmUgZGV0ZWN0ZWQgdGhhdCBhbm90aGVyIHN0YXRpb24gaXMgdHJhbnNtaXR0aW5nCisgKiAgICBpbiBjb250ZW50aW9uIG1vZGUuCisgKi8KK3ZvaWQgaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3koc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHN0YXR1cykKK3sKKwlzdHJ1Y3QgaXJsYXBfY2IgKnNlbGY7CisKKwlJUkRBX0RFQlVHKDQsICIlcyglcylcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzID8gIlRSVUUiIDogIkZBTFNFIik7CisKKwlzZWxmID0gKHN0cnVjdCBpcmxhcF9jYiAqKSBkZXYtPmF0YWxrX3B0cjsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKworCWlmIChzdGF0dXMpIHsKKwkJc2VsZi0+bWVkaWFfYnVzeSA9IFRSVUU7CisJCWlmIChzdGF0dXMgPT0gU01BTEwpCisJCQlpcmxhcF9zdGFydF9tYnVzeV90aW1lcihzZWxmLCBTTUFMTEJVU1lfVElNRU9VVCk7CisJCWVsc2UKKwkJCWlybGFwX3N0YXJ0X21idXN5X3RpbWVyKHNlbGYsIE1FRElBQlVTWV9USU1FT1VUKTsKKwkJSVJEQV9ERUJVRyggNCwgIk1lZGlhIGJ1c3khXG4iKTsKKwl9IGVsc2UgeworCQlzZWxmLT5tZWRpYV9idXN5ID0gRkFMU0U7CisJCWlybGFwX3N0b3BfbWJ1c3lfdGltZXIoc2VsZik7CisJfQorfQorRVhQT1JUX1NZTUJPTChpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeSk7CisKKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfZGV2aWNlX2lzX3JlY2VpdmluZyAoZGV2KQorICoKKyAqICAgIENoZWNrIGlmIHRoZSBkZXZpY2UgZHJpdmVyIGlzIGN1cnJlbnRseSByZWNlaXZpbmcgZGF0YQorICoKKyAqLworaW50IGlyZGFfZGV2aWNlX2lzX3JlY2VpdmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpZl9pcmRhX3JlcSByZXE7CisJaW50IHJldDsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAoIWRldi0+ZG9faW9jdGwpIHsKKwkJSVJEQV9FUlJPUigiJXM6IGRvX2lvY3RsIG5vdCBpbXBsLiBieSBkZXZpY2UgZHJpdmVyXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldCA9IGRldi0+ZG9faW9jdGwoZGV2LCAoc3RydWN0IGlmcmVxICopICZyZXEsIFNJT0NHUkVDRUlWSU5HKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiByZXEuaWZyX3JlY2VpdmluZzsKK30KKwordm9pZCBpcmRhX3Rhc2tfbmV4dF9zdGF0ZShzdHJ1Y3QgaXJkYV90YXNrICp0YXNrLCBJUkRBX1RBU0tfU1RBVEUgc3RhdGUpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKSwgc3RhdGUgPSAlc1xuIiwgX19GVU5DVElPTl9fLCB0YXNrX3N0YXRlW3N0YXRlXSk7CisKKwl0YXNrLT5zdGF0ZSA9IHN0YXRlOworfQorRVhQT1JUX1NZTUJPTChpcmRhX3Rhc2tfbmV4dF9zdGF0ZSk7CisKK3N0YXRpYyB2b2lkIF9faXJkYV90YXNrX2RlbGV0ZShzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQoreworCWRlbF90aW1lcigmdGFzay0+dGltZXIpOworCisJa2ZyZWUodGFzayk7Cit9CisKK3ZvaWQgaXJkYV90YXNrX2RlbGV0ZShzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQoreworCS8qIFVucmVnaXN0ZXIgdGFzayAqLworCWhhc2hiaW5fcmVtb3ZlKHRhc2tzLCAobG9uZykgdGFzaywgTlVMTCk7CisKKwlfX2lyZGFfdGFza19kZWxldGUodGFzayk7Cit9CitFWFBPUlRfU1lNQk9MKGlyZGFfdGFza19kZWxldGUpOworCisvKgorICogRnVuY3Rpb24gaXJkYV90YXNrX2tpY2sgKHRhc2spCisgKgorICogICAgVHJpZXMgdG8gZXhlY3V0ZSBhIHRhc2sgcG9zc2libGUgbXVsdGlwbGUgdGltZXMgdW50aWwgdGhlIHRhc2sgaXMgZWl0aGVyCisgKiAgICBmaW5pc2hlZCwgb3IgYXNrZXMgZm9yIGEgdGltZW91dC4gV2hlbiBhIHRhc2sgaXMgZmluaXNoZWQsIHdlIGRvIHBvc3QKKyAqICAgIHByb2Nlc3NpbmcsIGFuZCBub3RpZnkgdGhlIHBhcmVudCB0YXNrLCB0aGF0IGlzIHdhaXRpbmcgZm9yIHRoaXMgdGFzaworICogICAgdG8gY29tcGxldGUuCisgKi8KK3N0YXRpYyBpbnQgaXJkYV90YXNrX2tpY2soc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlpbnQgZmluaXNoZWQgPSBUUlVFOworCWludCBjb3VudCA9IDA7CisJaW50IHRpbWVvdXQ7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQodGFzayAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVCh0YXNrLT5tYWdpYyA9PSBJUkRBX1RBU0tfTUFHSUMsIHJldHVybiAtMTspOworCisJLyogRXhlY3V0ZSB0YXNrIHVudGlsIGl0J3MgZmluaXNoZWQsIG9yIGFza2VzIGZvciBhIHRpbWVvdXQgKi8KKwlkbyB7CisJCXRpbWVvdXQgPSB0YXNrLT5mdW5jdGlvbih0YXNrKTsKKwkJaWYgKGNvdW50KysgPiAxMDApIHsKKwkJCUlSREFfRVJST1IoIiVzOiBlcnJvciBpbiB0YXNrIGhhbmRsZXIhXG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCQlpcmRhX3Rhc2tfZGVsZXRlKHRhc2spOworCQkJcmV0dXJuIFRSVUU7CisJCX0KKwl9IHdoaWxlICgodGltZW91dCA9PSAwKSAmJiAodGFzay0+c3RhdGUgIT0gSVJEQV9UQVNLX0RPTkUpKTsKKworCWlmICh0aW1lb3V0IDwgMCkgeworCQlJUkRBX0VSUk9SKCIlczogRXJyb3IgZXhlY3V0aW5nIHRhc2shXG4iLCBfX0ZVTkNUSU9OX18pOworCQlpcmRhX3Rhc2tfZGVsZXRlKHRhc2spOworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwkvKiBDaGVjayBpZiB3ZSBhcmUgZmluaXNoZWQgKi8KKwlpZiAodGFzay0+c3RhdGUgPT0gSVJEQV9UQVNLX0RPTkUpIHsKKwkJZGVsX3RpbWVyKCZ0YXNrLT50aW1lcik7CisKKwkJLyogRG8gcG9zdCBwcm9jZXNzaW5nICovCisJCWlmICh0YXNrLT5maW5pc2hlZCkKKwkJCXRhc2stPmZpbmlzaGVkKHRhc2spOworCisJCS8qIE5vdGlmeSBwYXJlbnQgKi8KKwkJaWYgKHRhc2stPnBhcmVudCkgeworCQkJLyogQ2hlY2sgaWYgcGFyZW50IGlzIHdhaXRpbmcgZm9yIHVzIHRvIGNvbXBsZXRlICovCisJCQlpZiAodGFzay0+cGFyZW50LT5zdGF0ZSA9PSBJUkRBX1RBU0tfQ0hJTERfV0FJVCkgeworCQkJCXRhc2stPnBhcmVudC0+c3RhdGUgPSBJUkRBX1RBU0tfQ0hJTERfRE9ORTsKKworCQkJCS8qIFN0b3AgdGltZXIgbm93IHRoYXQgd2UgYXJlIGhlcmUgKi8KKwkJCQlkZWxfdGltZXIoJnRhc2stPnBhcmVudC0+dGltZXIpOworCisJCQkJLyogS2ljayBwYXJlbnQgdGFzayAqLworCQkJCWlyZGFfdGFza19raWNrKHRhc2stPnBhcmVudCk7CisJCQl9CisJCX0KKwkJaXJkYV90YXNrX2RlbGV0ZSh0YXNrKTsKKwl9IGVsc2UgaWYgKHRpbWVvdXQgPiAwKSB7CisJCWlyZGFfc3RhcnRfdGltZXIoJnRhc2stPnRpbWVyLCB0aW1lb3V0LCAodm9pZCAqKSB0YXNrLAorCQkJCSBpcmRhX3Rhc2tfdGltZXJfZXhwaXJlZCk7CisJCWZpbmlzaGVkID0gRkFMU0U7CisJfSBlbHNlIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgbm90IGZpbmlzaGVkLCBhbmQgbm8gdGltZW91dCFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlmaW5pc2hlZCA9IEZBTFNFOworCX0KKworCXJldHVybiBmaW5pc2hlZDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfdGFza19leGVjdXRlIChpbnN0YW5jZSwgZnVuY3Rpb24sIGZpbmlzaGVkKQorICoKKyAqICAgIFRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIGFuZCB0cmllcyB0byBleGVjdXRlIHRhc2tzIHRoYXQgbWF5IHRha2Ugc29tZQorICogICAgdGltZSB0byBjb21wbGV0ZS4gV2UgZG8gaXQgdGhpcyBoYWlyeSB3YXkgc2luY2Ugd2UgbWF5IGhhdmUgYmVlbgorICogICAgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQsIHNvIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZQorICogICAgc2NoZWR1bGVfdGltZW91dCgpCisgKiBUd28gaW1wb3J0YW50IG5vdGVzIDoKKyAqCW8gTWFrZSBzdXJlIHlvdSBpcmRhX3Rhc2tfZGVsZXRlKHRhc2spOyBpbiBjYXNlIHlvdSBkZWxldGUgdGhlCisgKgkgIGNhbGxpbmcgaW5zdGFuY2UuCisgKglvIE5vIHJlYWwgbmVlZCB0byBsb2NrIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCBidXQgeW91IG1heQorICoJICB3YW50IHRvIGxvY2sgd2l0aGluIHRoZSB0YXNrIGhhbmRsZXIuCisgKiBKZWFuIElJCisgKi8KK3N0cnVjdCBpcmRhX3Rhc2sgKmlyZGFfdGFza19leGVjdXRlKHZvaWQgKmluc3RhbmNlLAorCQkJCSAgICBJUkRBX1RBU0tfQ0FMTEJBQ0sgZnVuY3Rpb24sCisJCQkJICAgIElSREFfVEFTS19DQUxMQkFDSyBmaW5pc2hlZCwKKwkJCQkgICAgc3RydWN0IGlyZGFfdGFzayAqcGFyZW50LCB2b2lkICpwYXJhbSkKK3sKKwlzdHJ1Y3QgaXJkYV90YXNrICp0YXNrOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXRhc2sgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXJkYV90YXNrKSwgR0ZQX0FUT01JQyk7CisJaWYgKCF0YXNrKQorCQlyZXR1cm4gTlVMTDsKKworCXRhc2stPnN0YXRlICAgID0gSVJEQV9UQVNLX0lOSVQ7CisJdGFzay0+aW5zdGFuY2UgPSBpbnN0YW5jZTsKKwl0YXNrLT5mdW5jdGlvbiA9IGZ1bmN0aW9uOworCXRhc2stPmZpbmlzaGVkID0gZmluaXNoZWQ7CisJdGFzay0+cGFyZW50ICAgPSBwYXJlbnQ7CisJdGFzay0+cGFyYW0gICAgPSBwYXJhbTsKKwl0YXNrLT5tYWdpYyAgICA9IElSREFfVEFTS19NQUdJQzsKKworCWluaXRfdGltZXIoJnRhc2stPnRpbWVyKTsKKworCS8qIFJlZ2lzdGVyIHRhc2sgKi8KKwloYXNoYmluX2luc2VydCh0YXNrcywgKGlyZGFfcXVldWVfdCAqKSB0YXNrLCAobG9uZykgdGFzaywgTlVMTCk7CisKKwkvKiBObyB0aW1lIHRvIHdhc3RlLCBzbyBsZXRzIGdldCBnb2luZyEgKi8KKwlyZXR1cm4gaXJkYV90YXNrX2tpY2sodGFzaykgPyBOVUxMIDogdGFzazsKK30KK0VYUE9SVF9TWU1CT0woaXJkYV90YXNrX2V4ZWN1dGUpOworCisvKgorICogRnVuY3Rpb24gaXJkYV90YXNrX3RpbWVyX2V4cGlyZWQgKGRhdGEpCisgKgorICogICAgVGFzayB0aW1lIGhhcyBleHBpcmVkLiBXZSBub3cgdHJ5IHRvIGV4ZWN1dGUgdGFzayAoYWdhaW4pLCBhbmQgcmVzdGFydAorICogICAgdGhlIHRpbWVyIGlmIHRoZSB0YXNrIGhhcyBub3QgZmluaXNoZWQgeWV0CisgKi8KK3N0YXRpYyB2b2lkIGlyZGFfdGFza190aW1lcl9leHBpcmVkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlyZGFfdGFzayAqdGFzazsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwl0YXNrID0gKHN0cnVjdCBpcmRhX3Rhc2sgKikgZGF0YTsKKworCWlyZGFfdGFza19raWNrKHRhc2spOworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9kZXZpY2Vfc2V0dXAgKGRldikKKyAqCisgKiAgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIGJ5IGxvdyBsZXZlbCBkZXZpY2UgZHJpdmVycyBpbiBhIHNpbWlsYXIgd2F5CisgKiAgICBhcyBldGhlcl9zZXR1cCgpIGlzIHVzZWQgYnkgbm9ybWFsIG5ldHdvcmsgZGV2aWNlIGRyaXZlcnMKKyAqLworc3RhdGljIHZvaWQgaXJkYV9kZXZpY2Vfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSAwOworICAgICAgICBkZXYtPmFkZHJfbGVuICAgICAgICA9IDA7CisKKyAgICAgICAgZGV2LT50eXBlICAgICAgICAgICAgPSBBUlBIUkRfSVJEQTsKKyAgICAgICAgZGV2LT50eF9xdWV1ZV9sZW4gICAgPSA4OyAvKiBXaW5kb3cgc2l6ZSArIDEgcy1mcmFtZSAqLworCisJbWVtc2V0KGRldi0+YnJvYWRjYXN0LCAweGZmLCA0KTsKKworCWRldi0+bXR1ID0gMjA0ODsKKwlkZXYtPmZsYWdzID0gSUZGX05PQVJQOworfQorCisvKgorICogRnVuY2l0b24gIGFsbG9jX2lyZGFkZXYgCisgKiAJQWxsb2NhdGVzIGFuZCBzZXRzIHVwIGFuIElSREEgZGV2aWNlIGluIGEgbWFubmVyIHNpbWlsYXIgdG8KKyAqIAlhbGxvY19ldGhlcmRldi4KKyAqLworc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX2lyZGFkZXYoaW50IHNpemVvZl9wcml2KQoreworCXJldHVybiBhbGxvY19uZXRkZXYoc2l6ZW9mX3ByaXYsICJpcmRhJWQiLCBpcmRhX2RldmljZV9zZXR1cCk7Cit9CitFWFBPUlRfU1lNQk9MKGFsbG9jX2lyZGFkZXYpOworCisvKgorICogRnVuY3Rpb24gaXJkYV9kZXZpY2VfaW5pdF9kb25nbGUgKHNlbGYsIHR5cGUsIHFvcykKKyAqCisgKiAgICBJbml0aWFsaXplIGF0dGFjaGVkIGRvbmdsZS4KKyAqCisgKiBJbXBvcnRhbnQgOiByZXF1ZXN0X21vZHVsZSByZXF1aXJlIHVzIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoCisgKiBhIHByb2Nlc3MgY29udGV4dCBhbmQgaXJxIGVuYWJsZWQuIC0gSmVhbiBJSQorICovCitkb25nbGVfdCAqaXJkYV9kZXZpY2VfZG9uZ2xlX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHR5cGUpCit7CisJc3RydWN0IGRvbmdsZV9yZWcgKnJlZzsKKwlkb25nbGVfdCAqZG9uZ2xlID0gTlVMTDsKKworCW1pZ2h0X3NsZWVwKCk7CisKKwlzcGluX2xvY2soJmRvbmdsZXMtPmhiX3NwaW5sb2NrKTsKKwlyZWcgPSBoYXNoYmluX2ZpbmQoZG9uZ2xlcywgdHlwZSwgTlVMTCk7CisKKyNpZmRlZiBDT05GSUdfS01PRAorCS8qIFRyeSB0byBsb2FkIHRoZSBtb2R1bGUgbmVlZGVkICovCisJaWYgKCFyZWcgJiYgY2FwYWJsZShDQVBfU1lTX01PRFVMRSkpIHsKKwkJc3Bpbl91bmxvY2soJmRvbmdsZXMtPmhiX3NwaW5sb2NrKTsKKwkKKwkJcmVxdWVzdF9tb2R1bGUoImlyZGEtZG9uZ2xlLSVkIiwgdHlwZSk7CisJCQorCQlzcGluX2xvY2soJmRvbmdsZXMtPmhiX3NwaW5sb2NrKTsKKwkJcmVnID0gaGFzaGJpbl9maW5kKGRvbmdsZXMsIHR5cGUsIE5VTEwpOworCX0KKyNlbmRpZgorCisJaWYgKCFyZWcgfHwgIXRyeV9tb2R1bGVfZ2V0KHJlZy0+b3duZXIpICkgeworCQlJUkRBX0VSUk9SKCJJckRBOiBVbmFibGUgdG8gZmluZCByZXF1ZXN0ZWQgZG9uZ2xlIHR5cGUgJXhcbiIsCisJCQkgICB0eXBlKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQWxsb2NhdGUgZG9uZ2xlIGluZm8gZm9yIHRoaXMgaW5zdGFuY2UgKi8KKwlkb25nbGUgPSBrbWFsbG9jKHNpemVvZihkb25nbGVfdCksIEdGUF9LRVJORUwpOworCWlmICghZG9uZ2xlKQorCQlnb3RvIG91dDsKKworCW1lbXNldChkb25nbGUsIDAsIHNpemVvZihkb25nbGVfdCkpOworCisJLyogQmluZCB0aGUgcmVnaXN0cmF0aW9uIGluZm8gdG8gdGhpcyBwYXJ0aWN1bGFyIGluc3RhbmNlICovCisJZG9uZ2xlLT5pc3N1ZSA9IHJlZzsKKwlkb25nbGUtPmRldiA9IGRldjsKKworIG91dDoKKwlzcGluX3VubG9jaygmZG9uZ2xlcy0+aGJfc3BpbmxvY2spOworCXJldHVybiBkb25nbGU7Cit9CitFWFBPUlRfU1lNQk9MKGlyZGFfZGV2aWNlX2RvbmdsZV9pbml0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfZGV2aWNlX2RvbmdsZV9jbGVhbnVwIChkb25nbGUpCisgKi8KK2ludCBpcmRhX2RldmljZV9kb25nbGVfY2xlYW51cChkb25nbGVfdCAqZG9uZ2xlKQoreworCUlSREFfQVNTRVJUKGRvbmdsZSAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCWRvbmdsZS0+aXNzdWUtPmNsb3NlKGRvbmdsZSk7CisJbW9kdWxlX3B1dChkb25nbGUtPmlzc3VlLT5vd25lcik7CisJa2ZyZWUoZG9uZ2xlKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpcmRhX2RldmljZV9kb25nbGVfY2xlYW51cCk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2RldmljZV9yZWdpc3Rlcl9kb25nbGUgKGRvbmdsZSkKKyAqLworaW50IGlyZGFfZGV2aWNlX3JlZ2lzdGVyX2RvbmdsZShzdHJ1Y3QgZG9uZ2xlX3JlZyAqbmV3KQoreworCXNwaW5fbG9jaygmZG9uZ2xlcy0+aGJfc3BpbmxvY2spOworCS8qIENoZWNrIGlmIHRoaXMgZG9uZ2xlIGhhcyBiZWVuIHJlZ2lzdGVyZWQgYmVmb3JlICovCisJaWYgKGhhc2hiaW5fZmluZChkb25nbGVzLCBuZXctPnR5cGUsIE5VTEwpKSB7CisJCUlSREFfTUVTU0FHRSgiJXM6IERvbmdsZSB0eXBlICV4IGFscmVhZHkgcmVnaXN0ZXJlZFxuIiwgCisJCQkgICAgIF9fRlVOQ1RJT05fXywgbmV3LT50eXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKwkJLyogSW5zZXJ0IElyREEgZG9uZ2xlIGludG8gaGFzaGJpbiAqLworCQloYXNoYmluX2luc2VydChkb25nbGVzLCAoaXJkYV9xdWV1ZV90ICopIG5ldywgbmV3LT50eXBlLCBOVUxMKTsKKwl9CisJc3Bpbl91bmxvY2soJmRvbmdsZXMtPmhiX3NwaW5sb2NrKTsKKworICAgICAgICByZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaXJkYV9kZXZpY2VfcmVnaXN0ZXJfZG9uZ2xlKTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfZGV2aWNlX3VucmVnaXN0ZXJfZG9uZ2xlIChkb25nbGUpCisgKgorICogICAgVW5yZWdpc3RlciBkb25nbGUsIGFuZCByZW1vdmUgZG9uZ2xlIGZyb20gbGlzdCBvZiByZWdpc3RlcmVkIGRvbmdsZXMKKyAqCisgKi8KK3ZvaWQgaXJkYV9kZXZpY2VfdW5yZWdpc3Rlcl9kb25nbGUoc3RydWN0IGRvbmdsZV9yZWcgKmRvbmdsZSkKK3sKKwlzdHJ1Y3QgZG9uZ2xlICpub2RlOworCisJc3Bpbl9sb2NrKCZkb25nbGVzLT5oYl9zcGlubG9jayk7CisJbm9kZSA9IGhhc2hiaW5fcmVtb3ZlKGRvbmdsZXMsIGRvbmdsZS0+dHlwZSwgTlVMTCk7CisJaWYgKCFub2RlKSAKKwkJSVJEQV9FUlJPUigiJXM6IGRvbmdsZSBub3QgZm91bmQhXG4iLCBfX0ZVTkNUSU9OX18pOworCXNwaW5fdW5sb2NrKCZkb25nbGVzLT5oYl9zcGlubG9jayk7Cit9CitFWFBPUlRfU1lNQk9MKGlyZGFfZGV2aWNlX3VucmVnaXN0ZXJfZG9uZ2xlKTsKKworI2lmZGVmIENPTkZJR19JU0EKKy8qCisgKiBGdW5jdGlvbiBzZXR1cF9kbWEgKGlkZXYsIGJ1ZmZlciwgY291bnQsIG1vZGUpCisgKgorICogICAgU2V0dXAgdGhlIERNQSBjaGFubmVsLiBDb21tb25seSB1c2VkIGJ5IElTQSBGSVIgZHJpdmVycworICoKKyAqLwordm9pZCBpcmRhX3NldHVwX2RtYShpbnQgY2hhbm5lbCwgZG1hX2FkZHJfdCBidWZmZXIsIGludCBjb3VudCwgaW50IG1vZGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKKworCWRpc2FibGVfZG1hKGNoYW5uZWwpOworCWNsZWFyX2RtYV9mZihjaGFubmVsKTsKKwlzZXRfZG1hX21vZGUoY2hhbm5lbCwgbW9kZSk7CisJc2V0X2RtYV9hZGRyKGNoYW5uZWwsIGJ1ZmZlcik7CisJc2V0X2RtYV9jb3VudChjaGFubmVsLCBjb3VudCk7CisJZW5hYmxlX2RtYShjaGFubmVsKTsKKworCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChpcmRhX3NldHVwX2RtYSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lyaWFwLmMgYi9uZXQvaXJkYS9pcmlhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YmI3OGEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcmlhcC5jCkBAIC0wLDAgKzEsMTA4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZpbGVuYW1lOiAgICAgIGlyaWFwLmMKKyAqIFZlcnNpb246ICAgICAgIDAuOAorICogRGVzY3JpcHRpb246ICAgSW5mb3JtYXRpb24gQWNjZXNzIFByb3RvY29sIChJQVApCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBUaHUgQXVnIDIxIDAwOjAyOjA3IDE5OTcKKyAqIE1vZGlmaWVkIGF0OiAgIFNhdCBEZWMgMjUgMTY6NDI6NDIgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICoKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+LAorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJ0dHAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFzX29iamVjdC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFwX2V2ZW50Lmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXAuaD4KKworI2lmZGVmIENPTkZJR19JUkRBX0RFQlVHCisvKiBGSVhNRTogVGhpcyBvbmUgc2hvdWxkIGdvIGluIGlybG1wLmMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICppYXNfY2hhcnNldF90eXBlc1tdID0geworCSJDU19BU0NJSSIsCisJIkNTX0lTT184ODU5XzEiLAorCSJDU19JU09fODg1OV8yIiwKKwkiQ1NfSVNPXzg4NTlfMyIsCisJIkNTX0lTT184ODU5XzQiLAorCSJDU19JU09fODg1OV81IiwKKwkiQ1NfSVNPXzg4NTlfNiIsCisJIkNTX0lTT184ODU5XzciLAorCSJDU19JU09fODg1OV84IiwKKwkiQ1NfSVNPXzg4NTlfOSIsCisJIkNTX1VOSUNPREUiCit9OworI2VuZGlmCS8qIENPTkZJR19JUkRBX0RFQlVHICovCisKK3N0YXRpYyBoYXNoYmluX3QgKmlyaWFwID0gTlVMTDsKK3N0YXRpYyB2b2lkICpzZXJ2aWNlX2hhbmRsZTsKKworc3RhdGljIHZvaWQgX19pcmlhcF9jbG9zZShzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYpOworc3RhdGljIGludCBpcmlhcF9yZWdpc3Rlcl9sc2FwKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgX191OCBzbHNhcF9zZWwsIGludCBtb2RlKTsKK3N0YXRpYyB2b2lkIGlyaWFwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAorCQkJCQlMTV9SRUFTT04gcmVhc29uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIGlyaWFwX2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAorCQkJCSAgICAgc3RydWN0IHFvc19pbmZvICpxb3MsIF9fdTMyIG1heF9zZHVfc2l6ZSwKKwkJCQkgICAgIF9fdTggbWF4X2hlYWRlcl9zaXplLAorCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBpcmlhcF9jb25uZWN0X2NvbmZpcm0odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKKwkJCQkgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLAorCQkJCSAgX191MzIgbWF4X3NkdV9zaXplLCBfX3U4IG1heF9oZWFkZXJfc2l6ZSwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBpcmlhcF9kYXRhX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKK3N0YXRpYyB2b2lkIGlyaWFwX3dhdGNoZG9nX3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcmlhcF9zdGFydF93YXRjaGRvZ190aW1lcihzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIAorCQkJCQkgICAgICBpbnQgdGltZW91dCkgCit7CisJaXJkYV9zdGFydF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIsIHRpbWVvdXQsIHNlbGYsIAorCQkJIGlyaWFwX3dhdGNoZG9nX3RpbWVyX2V4cGlyZWQpOworfQorCisvKgorICogRnVuY3Rpb24gaXJpYXBfaW5pdCAodm9pZCkKKyAqCisgKiAgICBJbml0aWFsaXplcyB0aGUgSXJJQVAgbGF5ZXIsIGNhbGxlZCBieSB0aGUgbW9kdWxlIGluaXRpYWxpemF0aW9uIGNvZGUKKyAqICAgIGluIGlybW9kLmMKKyAqLworaW50IF9faW5pdCBpcmlhcF9pbml0KHZvaWQpCit7CisJc3RydWN0IGlhc19vYmplY3QgKm9iajsKKwlzdHJ1Y3QgaXJpYXBfY2IgKnNlcnZlcjsKKwlfX3U4IG9jdF9zZXFbNl07CisJX191MTYgaGludHM7CisKKwkvKiBBbGxvY2F0ZSBtYXN0ZXIgYXJyYXkgKi8KKwlpcmlhcCA9IGhhc2hiaW5fbmV3KEhCX0xPQ0spOworCWlmICghaXJpYXApCisJCXJldHVybiAtRU5PTUVNOworCisJLyogT2JqZWN0IHJlcG9zaXRvcnkgLSBkZWZpbmVkIGluIGlyaWFzX29iamVjdC5jICovCisJaXJpYXNfb2JqZWN0cyA9IGhhc2hiaW5fbmV3KEhCX0xPQ0spOworCWlmICghaXJpYXNfb2JqZWN0cykgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBDYW4ndCBhbGxvY2F0ZSBpcmlhc19vYmplY3RzIGhhc2hiaW4hXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQloYXNoYmluX2RlbGV0ZShpcmlhcCwgTlVMTCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qCisJICogIFJlZ2lzdGVyIHNvbWUgZGVmYXVsdCBzZXJ2aWNlcyBmb3IgSXJMTVAKKwkgKi8KKwloaW50cyAgPSBpcmxtcF9zZXJ2aWNlX3RvX2hpbnQoU19DT01QVVRFUik7CisJc2VydmljZV9oYW5kbGUgPSBpcmxtcF9yZWdpc3Rlcl9zZXJ2aWNlKGhpbnRzKTsKKworCS8qIFJlZ2lzdGVyIHRoZSBEZXZpY2Ugb2JqZWN0IHdpdGggTE0tSUFTICovCisJb2JqID0gaXJpYXNfbmV3X29iamVjdCgiRGV2aWNlIiwgSUFTX0RFVklDRV9JRCk7CisJaXJpYXNfYWRkX3N0cmluZ19hdHRyaWIob2JqLCAiRGV2aWNlTmFtZSIsICJMaW51eCIsIElBU19LRVJORUxfQVRUUik7CisKKwlvY3Rfc2VxWzBdID0gMHgwMTsgIC8qIFZlcnNpb24gMSAqLworCW9jdF9zZXFbMV0gPSAweDAwOyAgLyogSUFTIHN1cHBvcnQgYml0cyAqLworCW9jdF9zZXFbMl0gPSAweDAwOyAgLyogTE0tTVVYIHN1cHBvcnQgYml0cyAqLworI2lmZGVmIENPTkZJR19JUkRBX1VMVFJBCisJb2N0X3NlcVsyXSB8PSAweDA0OyAvKiBDb25uZWN0aW9ubGVzcyBEYXRhIHN1cHBvcnQgKi8KKyNlbmRpZgorCWlyaWFzX2FkZF9vY3RzZXFfYXR0cmliKG9iaiwgIklyTE1QU3VwcG9ydCIsIG9jdF9zZXEsIDMsCisJCQkJSUFTX0tFUk5FTF9BVFRSKTsKKwlpcmlhc19pbnNlcnRfb2JqZWN0KG9iaik7CisKKwkvKgorCSAqICBSZWdpc3RlciBzZXJ2ZXIgc3VwcG9ydCB3aXRoIElyTE1QIHNvIHdlIGNhbiBhY2NlcHQgaW5jb21pbmcKKwkgKiAgY29ubmVjdGlvbnMKKwkgKi8KKwlzZXJ2ZXIgPSBpcmlhcF9vcGVuKExTQVBfSUFTLCBJQVNfU0VSVkVSLCBOVUxMLCBOVUxMKTsKKwlpZiAoIXNlcnZlcikgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCB1bmFibGUgdG8gb3BlbiBzZXJ2ZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtMTsKKwl9CisJaXJpYXBfcmVnaXN0ZXJfbHNhcChzZXJ2ZXIsIExTQVBfSUFTLCBJQVNfU0VSVkVSKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJpYXBfY2xlYW51cCAodm9pZCkKKyAqCisgKiAgICBJbml0aWFsaXplcyB0aGUgSXJJQVAgbGF5ZXIsIGNhbGxlZCBieSB0aGUgbW9kdWxlIGNsZWFudXAgY29kZSBpbgorICogICAgaXJtb2QuYworICovCit2b2lkIF9fZXhpdCBpcmlhcF9jbGVhbnVwKHZvaWQpCit7CisJaXJsbXBfdW5yZWdpc3Rlcl9zZXJ2aWNlKHNlcnZpY2VfaGFuZGxlKTsKKworCWhhc2hiaW5fZGVsZXRlKGlyaWFwLCAoRlJFRV9GVU5DKSBfX2lyaWFwX2Nsb3NlKTsKKwloYXNoYmluX2RlbGV0ZShpcmlhc19vYmplY3RzLCAoRlJFRV9GVU5DKSBfX2lyaWFzX2RlbGV0ZV9vYmplY3QpOworfQorCisvKgorICogRnVuY3Rpb24gaXJpYXBfb3BlbiAodm9pZCkKKyAqCisgKiAgICBPcGVucyBhbiBpbnN0YW5jZSBvZiB0aGUgSXJJQVAgbGF5ZXIsIGFuZCByZWdpc3RlcnMgd2l0aCBJckxNUAorICovCitzdHJ1Y3QgaXJpYXBfY2IgKmlyaWFwX29wZW4oX191OCBzbHNhcF9zZWwsIGludCBtb2RlLCB2b2lkICpwcml2LAorCQkJICAgIENPTkZJUk1fQ0FMTEJBQ0sgY2FsbGJhY2spCit7CisJc3RydWN0IGlyaWFwX2NiICpzZWxmOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXNlbGYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXJpYXBfY2IpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNlbGYpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGttYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKgorCSAqICBJbml0aWFsaXplIGluc3RhbmNlCisJICovCisJbWVtc2V0KHNlbGYsIDAsIHNpemVvZihzdHJ1Y3QgaXJpYXBfY2IpKTsKKworCXNlbGYtPm1hZ2ljID0gSUFTX01BR0lDOworCXNlbGYtPm1vZGUgPSBtb2RlOworCWlmIChtb2RlID09IElBU19DTElFTlQpCisJCWlyaWFwX3JlZ2lzdGVyX2xzYXAoc2VsZiwgc2xzYXBfc2VsLCBtb2RlKTsKKworCXNlbGYtPmNvbmZpcm0gPSBjYWxsYmFjazsKKwlzZWxmLT5wcml2ID0gcHJpdjsKKworCS8qIGlyaWFwX2dldHZhbHVlYnljbGFzc19yZXF1ZXN0KCkgd2lsbCBjb25zdHJ1Y3QgcGFja2V0cyBiZWZvcmUKKwkgKiB3ZSBjb25uZWN0LCBzbyB0aGlzIG11c3QgaGF2ZSBhIHNhbmUgdmFsdWUuLi4gSmVhbiBJSSAqLworCXNlbGYtPm1heF9oZWFkZXJfc2l6ZSA9IExNUF9NQVhfSEVBREVSOworCisJaW5pdF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOworCisJaGFzaGJpbl9pbnNlcnQoaXJpYXAsIChpcmRhX3F1ZXVlX3QgKikgc2VsZiwgKGxvbmcpIHNlbGYsIE5VTEwpOworCisJLyogSW5pdGlhbGl6ZSBzdGF0ZSBtYWNoaW5lcyAqLworCWlyaWFwX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIFNfRElTQ09OTkVDVCk7CisJaXJpYXBfbmV4dF9jYWxsX3N0YXRlKHNlbGYsIFNfTUFLRV9DQUxMKTsKKwlpcmlhcF9uZXh0X3NlcnZlcl9zdGF0ZShzZWxmLCBSX0RJU0NPTk5FQ1QpOworCWlyaWFwX25leHRfcl9jb25uZWN0X3N0YXRlKHNlbGYsIFJfV0FJVElORyk7CisKKwlyZXR1cm4gc2VsZjsKK30KK0VYUE9SVF9TWU1CT0woaXJpYXBfb3Blbik7CisKKy8qCisgKiBGdW5jdGlvbiBfX2lyaWFwX2Nsb3NlIChzZWxmKQorICoKKyAqICAgIFJlbW92ZXMgKGRlYWxsb2NhdGVzKSB0aGUgSXJJQVAgaW5zdGFuY2UKKyAqCisgKi8KK3N0YXRpYyB2b2lkIF9faXJpYXBfY2xvc2Uoc3RydWN0IGlyaWFwX2NiICpzZWxmKQoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CisKKwlkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKKworCWlmIChzZWxmLT5yZXF1ZXN0X3NrYikKKwkJZGV2X2tmcmVlX3NrYihzZWxmLT5yZXF1ZXN0X3NrYik7CisKKwlzZWxmLT5tYWdpYyA9IDA7CisKKwlrZnJlZShzZWxmKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFwX2Nsb3NlICh2b2lkKQorICoKKyAqICAgIENsb3NlcyBJcklBUCBhbmQgZGVyZWdpc3RlcnMgd2l0aCBJckxNUAorICovCit2b2lkIGlyaWFwX2Nsb3NlKHN0cnVjdCBpcmlhcF9jYiAqc2VsZikKK3sKKwlzdHJ1Y3QgaXJpYXBfY2IgKmVudHJ5OworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKKworCWlmIChzZWxmLT5sc2FwKSB7CisJCWlybG1wX2Nsb3NlX2xzYXAoc2VsZi0+bHNhcCk7CisJCXNlbGYtPmxzYXAgPSBOVUxMOworCX0KKworCWVudHJ5ID0gKHN0cnVjdCBpcmlhcF9jYiAqKSBoYXNoYmluX3JlbW92ZShpcmlhcCwgKGxvbmcpIHNlbGYsIE5VTEwpOworCUlSREFfQVNTRVJUKGVudHJ5ID09IHNlbGYsIHJldHVybjspOworCisJX19pcmlhcF9jbG9zZShzZWxmKTsKK30KK0VYUE9SVF9TWU1CT0woaXJpYXBfY2xvc2UpOworCitzdGF0aWMgaW50IGlyaWFwX3JlZ2lzdGVyX2xzYXAoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBfX3U4IHNsc2FwX3NlbCwgaW50IG1vZGUpCit7CisJbm90aWZ5X3Qgbm90aWZ5OworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWlyZGFfbm90aWZ5X2luaXQoJm5vdGlmeSk7CisJbm90aWZ5LmNvbm5lY3RfY29uZmlybSAgICAgICA9IGlyaWFwX2Nvbm5lY3RfY29uZmlybTsKKwlub3RpZnkuY29ubmVjdF9pbmRpY2F0aW9uICAgID0gaXJpYXBfY29ubmVjdF9pbmRpY2F0aW9uOworCW5vdGlmeS5kaXNjb25uZWN0X2luZGljYXRpb24gPSBpcmlhcF9kaXNjb25uZWN0X2luZGljYXRpb247CisJbm90aWZ5LmRhdGFfaW5kaWNhdGlvbiAgICAgICA9IGlyaWFwX2RhdGFfaW5kaWNhdGlvbjsKKwlub3RpZnkuaW5zdGFuY2UgPSBzZWxmOworCWlmIChtb2RlID09IElBU19DTElFTlQpCisJCXN0cmNweShub3RpZnkubmFtZSwgIklySUFTIGNsaSIpOworCWVsc2UKKwkJc3RyY3B5KG5vdGlmeS5uYW1lLCAiSXJJQVMgc3J2Iik7CisKKwlzZWxmLT5sc2FwID0gaXJsbXBfb3Blbl9sc2FwKHNsc2FwX3NlbCwgJm5vdGlmeSwgMCk7CisJaWYgKHNlbGYtPmxzYXAgPT0gTlVMTCkgeworCQlJUkRBX0VSUk9SKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlZCBMU0FQIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzZWxmLT5zbHNhcF9zZWwgPSBzZWxmLT5sc2FwLT5zbHNhcF9zZWw7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbiAoaGFuZGxlLCByZWFzb24pCisgKgorICogICAgR290IGRpc2Nvbm5lY3QsIHNvIGNsZWFuIHVwIGV2ZXJ5dGhpbmcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29ubmVjdGlvbgorICoKKyAqLworc3RhdGljIHZvaWQgaXJpYXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJCUxNX1JFQVNPTiByZWFzb24sCisJCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlyaWFwX2NiICpzZWxmOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgcmVhc29uPSVzXG4iLCBfX0ZVTkNUSU9OX18sIGlybG1wX3JlYXNvbnNbcmVhc29uXSk7CisKKwlzZWxmID0gKHN0cnVjdCBpcmlhcF9jYiAqKSBpbnN0YW5jZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKKworCUlSREFfQVNTRVJUKGlyaWFwICE9IE5VTEwsIHJldHVybjspOworCisJZGVsX3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CisKKwkvKiBOb3QgbmVlZGVkICovCisJaWYgKHNrYikKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCisJaWYgKHNlbGYtPm1vZGUgPT0gSUFTX0NMSUVOVCkgeworCQlJUkRBX0RFQlVHKDQsICIlcygpLCBkaXNjb25uZWN0IGFzIGNsaWVudFxuIiwgX19GVU5DVElPTl9fKTsKKworCisJCWlyaWFwX2RvX2NsaWVudF9ldmVudChzZWxmLCBJQVBfTE1fRElTQ09OTkVDVF9JTkRJQ0FUSU9OLAorCQkJCSAgICAgIE5VTEwpOworCQkvKgorCQkgKiBJbmZvcm0gc2VydmljZSB1c2VyIHRoYXQgdGhlIHJlcXVlc3QgZmFpbGVkIGJ5IHNlbmRpbmcKKwkJICogaXQgYSBOVUxMIHZhbHVlLiBXYXJuaW5nLCB0aGUgY2xpZW50IG1pZ2h0IGNsb3NlIHVzLCBzbworCQkgKiByZW1lbWJlciBubyB0byB1c2Ugc2VsZiBhbnltb3JlIGFmdGVyIGNhbGxpbmcgY29uZmlybQorCQkgKi8KKwkJaWYgKHNlbGYtPmNvbmZpcm0pCisJCQlzZWxmLT5jb25maXJtKElBU19ESVNDT05ORUNULCAwLCBOVUxMLCBzZWxmLT5wcml2KTsKKwl9IGVsc2UgeworCQlJUkRBX0RFQlVHKDQsICIlcygpLCBkaXNjb25uZWN0IGFzIHNlcnZlclxuIiwgX19GVU5DVElPTl9fKTsKKwkJaXJpYXBfZG9fc2VydmVyX2V2ZW50KHNlbGYsIElBUF9MTV9ESVNDT05ORUNUX0lORElDQVRJT04sCisJCQkJICAgICAgTlVMTCk7CisJCWlyaWFwX2Nsb3NlKHNlbGYpOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFwX2Rpc2Nvbm5lY3RfcmVxdWVzdCAoaGFuZGxlKQorICovCitzdGF0aWMgdm9pZCBpcmlhcF9kaXNjb25uZWN0X3JlcXVlc3Qoc3RydWN0IGlyaWFwX2NiICpzZWxmKQoreworCXN0cnVjdCBza19idWZmICp0eF9za2I7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOworCisJdHhfc2tiID0gZGV2X2FsbG9jX3NrYig2NCk7CisJaWYgKHR4X3NrYiA9PSBOVUxMKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIENvdWxkIG5vdCBhbGxvY2F0ZSBhbiBza19idWZmIG9mIGxlbmd0aCAlZFxuIiwgCisJCQlfX0ZVTkNUSU9OX18sIDY0KTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogIFJlc2VydmUgc3BhY2UgZm9yIE1VWCBjb250cm9sIGFuZCBMQVAgaGVhZGVyCisJICovCisJc2tiX3Jlc2VydmUodHhfc2tiLCBMTVBfTUFYX0hFQURFUik7CisKKwlpcmxtcF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZi0+bHNhcCwgdHhfc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFwX2dldHZhbHVlYnljbGFzcyAoYWRkciwgbmFtZSwgYXR0cikKKyAqCisgKiAgICBSZXRyZWl2ZSBhbGwgdmFsdWVzIGZyb20gYXR0cmlidXRlIGluIGFsbCBvYmplY3RzIHdpdGggZ2l2ZW4gY2xhc3MKKyAqICAgIG5hbWUKKyAqLworaW50IGlyaWFwX2dldHZhbHVlYnljbGFzc19yZXF1ZXN0KHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwKKwkJCQkgIF9fdTMyIHNhZGRyLCBfX3UzMiBkYWRkciwKKwkJCQkgIGNoYXIgKm5hbWUsIGNoYXIgKmF0dHIpCit7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKKwlpbnQgbmFtZV9sZW4sIGF0dHJfbGVuLCBza2JfbGVuOworCV9fdTggKmZyYW1lOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybiAtMTspOworCisJLyogQ2xpZW50IG11c3Qgc3VwcGx5IHRoZSBkZXN0aW5hdGlvbiBkZXZpY2UgYWRkcmVzcyAqLworCWlmICghZGFkZHIpCisJCXJldHVybiAtMTsKKworCXNlbGYtPmRhZGRyID0gZGFkZHI7CisJc2VsZi0+c2FkZHIgPSBzYWRkcjsKKworCS8qCisJICogIFNhdmUgb3BlcmF0aW9uLCBzbyB3ZSBrbm93IHdoYXQgdGhlIGxhdGVyIGluZGljYXRpb24gaXMgYWJvdXQKKwkgKi8KKwlzZWxmLT5vcGVyYXRpb24gPSBHRVRfVkFMVUVfQllfQ0xBU1M7CisKKwkvKiBHaXZlIG91cnNlbHZlcyAxMCBzZWNzIHRvIGZpbmlzaCB0aGlzIG9wZXJhdGlvbiAqLworCWlyaWFwX3N0YXJ0X3dhdGNoZG9nX3RpbWVyKHNlbGYsIDEwKkhaKTsKKworCW5hbWVfbGVuID0gc3RybGVuKG5hbWUpOwkvKiBVcCB0byBJQVNfTUFYX0NMQVNTTkFNRSA9IDYwICovCisJYXR0cl9sZW4gPSBzdHJsZW4oYXR0cik7CS8qIFVwIHRvIElBU19NQVhfQVRUUklCTkFNRSA9IDYwICovCisKKwlza2JfbGVuID0gc2VsZi0+bWF4X2hlYWRlcl9zaXplKzIrbmFtZV9sZW4rMSthdHRyX2xlbis0OworCXR4X3NrYiA9IGRldl9hbGxvY19za2Ioc2tiX2xlbik7CisJaWYgKCF0eF9za2IpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgTVVYIGFuZCBMQVAgaGVhZGVyICovCisJc2tiX3Jlc2VydmUodHhfc2tiLCBzZWxmLT5tYXhfaGVhZGVyX3NpemUpOworCXNrYl9wdXQodHhfc2tiLCAzK25hbWVfbGVuK2F0dHJfbGVuKTsKKwlmcmFtZSA9IHR4X3NrYi0+ZGF0YTsKKworCS8qIEJ1aWxkIGZyYW1lICovCisJZnJhbWVbMF0gPSBJQVBfTFNUIHwgR0VUX1ZBTFVFX0JZX0NMQVNTOworCWZyYW1lWzFdID0gbmFtZV9sZW47ICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnNlcnQgbGVuZ3RoIG9mIG5hbWUgKi8KKwltZW1jcHkoZnJhbWUrMiwgbmFtZSwgbmFtZV9sZW4pOyAgICAgICAgICAgLyogSW5zZXJ0IG5hbWUgKi8KKwlmcmFtZVsyK25hbWVfbGVuXSA9IGF0dHJfbGVuOyAgICAgICAgICAgICAgLyogSW5zZXJ0IGxlbmd0aCBvZiBhdHRyICovCisJbWVtY3B5KGZyYW1lKzMrbmFtZV9sZW4sIGF0dHIsIGF0dHJfbGVuKTsgIC8qIEluc2VydCBhdHRyICovCisKKwlpcmlhcF9kb19jbGllbnRfZXZlbnQoc2VsZiwgSUFQX0NBTExfUkVRVUVTVF9HVkJDLCB0eF9za2IpOworCisJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgc3RhdGVfc19kaXNjb25uZWN0KCkuICovCisJZGV2X2tmcmVlX3NrYih0eF9za2IpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlyaWFwX2dldHZhbHVlYnljbGFzc19yZXF1ZXN0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFwX2dldHZhbHVlYnljbGFzc19jb25maXJtIChzZWxmLCBza2IpCisgKgorICogICAgR290IHJlc3VsdCBmcm9tIEdldFZhbHVlQnlDbGFzcyBjb21tYW5kLiBQYXJzZSBpdCBhbmQgcmV0dXJuIHJlc3VsdAorICogICAgdG8gc2VydmljZSB1c2VyLgorICoKKyAqLworc3RhdGljIHZvaWQgaXJpYXBfZ2V0dmFsdWVieWNsYXNzX2NvbmZpcm0oc3RydWN0IGlyaWFwX2NiICpzZWxmLAorCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlhc192YWx1ZSAqdmFsdWU7CisJaW50IGNoYXJzZXQ7CisJX191MzIgdmFsdWVfbGVuOworCV9fdTMyIHRtcF9jcHUzMjsKKwlfX3UxNiBvYmpfaWQ7CisJX191MTYgbGVuOworCV9fdTggIHR5cGU7CisJX191OCAqZnA7CisJaW50IG47CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOworCisJLyogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KKwlmcCA9IHNrYi0+ZGF0YTsKKwluID0gMjsKKworCS8qIEdldCBsZW5ndGgsIE1TQiBmaXJzdCAqLworCWxlbiA9IGJlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fdTE2ICopKGZwK24pKSk7IG4gKz0gMjsKKworCUlSREFfREVCVUcoNCwgIiVzKCksIGxlbj0lZFxuIiwgX19GVU5DVElPTl9fLCBsZW4pOworCisJLyogR2V0IG9iamVjdCBJRCwgTVNCIGZpcnN0ICovCisJb2JqX2lkID0gYmUxNl90b19jcHUoZ2V0X3VuYWxpZ25lZCgoX191MTYgKikoZnArbikpKTsgbiArPSAyOworCisJdHlwZSA9IGZwW24rK107CisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgVmFsdWUgdHlwZSA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHR5cGUpOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJQVNfSU5URUdFUjoKKwkJbWVtY3B5KCZ0bXBfY3B1MzIsIGZwK24sIDQpOyBuICs9IDQ7CisJCWJlMzJfdG9fY3B1cygmdG1wX2NwdTMyKTsKKwkJdmFsdWUgPSBpcmlhc19uZXdfaW50ZWdlcl92YWx1ZSh0bXBfY3B1MzIpOworCisJCS8qICBMZWdhbCB2YWx1ZXMgcmVzdHJpY3RlZCB0byAweDAxLTB4NmYsIHBhZ2UgMTUgaXJ0dHAgKi8KKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgbHNhcD0lZFxuIiwgX19GVU5DVElPTl9fLCB2YWx1ZS0+dC5pbnRlZ2VyKTsKKwkJYnJlYWs7CisJY2FzZSBJQVNfU1RSSU5HOgorCQljaGFyc2V0ID0gZnBbbisrXTsKKworCQlzd2l0Y2ggKGNoYXJzZXQpIHsKKwkJY2FzZSBDU19BU0NJSToKKwkJCWJyZWFrOworLyoJCWNhc2UgQ1NfSVNPXzg4NTlfMTogKi8KKy8qCQljYXNlIENTX0lTT184ODU5XzI6ICovCisvKgkJY2FzZSBDU19JU09fODg1OV8zOiAqLworLyoJCWNhc2UgQ1NfSVNPXzg4NTlfNDogKi8KKy8qCQljYXNlIENTX0lTT184ODU5XzU6ICovCisvKgkJY2FzZSBDU19JU09fODg1OV82OiAqLworLyoJCWNhc2UgQ1NfSVNPXzg4NTlfNzogKi8KKy8qCQljYXNlIENTX0lTT184ODU5Xzg6ICovCisvKgkJY2FzZSBDU19JU09fODg1OV85OiAqLworLyoJCWNhc2UgQ1NfVU5JQ09ERTogKi8KKwkJZGVmYXVsdDoKKwkJCUlSREFfREVCVUcoMCwgIiVzKCksIGNoYXJzZXQgJXMsIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkJICAgX19GVU5DVElPTl9fLCBpYXNfY2hhcnNldF90eXBlc1tjaGFyc2V0XSk7CisKKwkJCS8qIEFib3J0aW5nLCBjbG9zZSBjb25uZWN0aW9uISAqLworCQkJaXJpYXBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYpOworCQkJcmV0dXJuOworCQkJLyogYnJlYWs7ICovCisJCX0KKwkJdmFsdWVfbGVuID0gZnBbbisrXTsKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgc3RybGVuPSVkXG4iLCBfX0ZVTkNUSU9OX18sIHZhbHVlX2xlbik7CisKKwkJLyogTWFrZSBzdXJlIHRoZSBzdHJpbmcgaXMgbnVsbC10ZXJtaW5hdGVkICovCisJCWZwW24rdmFsdWVfbGVuXSA9IDB4MDA7CisJCUlSREFfREVCVUcoNCwgIkdvdCBzdHJpbmcgJXNcbiIsIGZwK24pOworCisJCS8qIFdpbGwgdHJ1bmNhdGUgdG8gSUFTX01BWF9TVFJJTkcgYnl0ZXMgKi8KKwkJdmFsdWUgPSBpcmlhc19uZXdfc3RyaW5nX3ZhbHVlKGZwK24pOworCQlicmVhazsKKwljYXNlIElBU19PQ1RfU0VROgorCQl2YWx1ZV9sZW4gPSBiZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX3UxNiAqKShmcCtuKSkpOworCQluICs9IDI7CisKKwkJLyogV2lsbCB0cnVuY2F0ZSB0byBJQVNfTUFYX09DVEVUX1NUUklORyBieXRlcyAqLworCQl2YWx1ZSA9IGlyaWFzX25ld19vY3RzZXFfdmFsdWUoZnArbiwgdmFsdWVfbGVuKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdmFsdWUgPSBpcmlhc19uZXdfbWlzc2luZ192YWx1ZSgpOworCQlicmVhazsKKwl9CisKKwkvKiBGaW5pc2hlZCwgY2xvc2UgY29ubmVjdGlvbiEgKi8KKwlpcmlhcF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZik7CisKKwkvKiBXYXJuaW5nLCB0aGUgY2xpZW50IG1pZ2h0IGNsb3NlIHVzLCBzbyByZW1lbWJlciBubyB0byB1c2Ugc2VsZgorCSAqIGFueW1vcmUgYWZ0ZXIgY2FsbGluZyBjb25maXJtCisJICovCisJaWYgKHNlbGYtPmNvbmZpcm0pCisJCXNlbGYtPmNvbmZpcm0oSUFTX1NVQ0NFU1MsIG9ial9pZCwgdmFsdWUsIHNlbGYtPnByaXYpOworCWVsc2UgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBtaXNzaW5nIGhhbmRsZXIhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlpcmlhc19kZWxldGVfdmFsdWUodmFsdWUpOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFwX2dldHZhbHVlYnljbGFzc19yZXNwb25zZSAoKQorICoKKyAqICAgIFNlbmQgYW5zd2VyIGJhY2sgdG8gcmVtb3RlIExNLUlBUworICoKKyAqLworc3RhdGljIHZvaWQgaXJpYXBfZ2V0dmFsdWVieWNsYXNzX3Jlc3BvbnNlKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwKKwkJCQkJICAgX191MTYgb2JqX2lkLAorCQkJCQkgICBfX3U4IHJldF9jb2RlLAorCQkJCQkgICBzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOworCWludCBuOworCV9fdTMyIHRtcF9iZTMyLCB0bXBfYmUxNjsKKwlfX3U4ICpmcDsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQodmFsdWUgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQodmFsdWUtPmxlbiA8PSAxMDI0LCByZXR1cm47KTsKKworCS8qIEluaXRpYWxpemUgdmFyaWFibGVzICovCisJbiA9IDA7CisKKwkvKgorCSAqICBXZSBtdXN0IGFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgcmVzcG9uc2UgYWZ0ZXIgdGhlIGxlbmd0aCBvZiB0aGUKKwkgKiAgdmFsdWUuIFdlIGFkZCAzMiBieXRlcyBiZWNhdXNlIG9mIHRoZSA2IGJ5dGVzIGZvciB0aGUgZnJhbWUgYW5kCisJICogIG1heCA1IGJ5dGVzIGZvciB0aGUgdmFsdWUgY29kaW5nLgorCSAqLworCXR4X3NrYiA9IGRldl9hbGxvY19za2IodmFsdWUtPmxlbiArIHNlbGYtPm1heF9oZWFkZXJfc2l6ZSArIDMyKTsKKwlpZiAoIXR4X3NrYikKKwkJcmV0dXJuOworCisJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgTVVYIGFuZCBMQVAgaGVhZGVyICovCisJc2tiX3Jlc2VydmUodHhfc2tiLCBzZWxmLT5tYXhfaGVhZGVyX3NpemUpOworCXNrYl9wdXQodHhfc2tiLCA2KTsKKworCWZwID0gdHhfc2tiLT5kYXRhOworCisJLyogQnVpbGQgZnJhbWUgKi8KKwlmcFtuKytdID0gR0VUX1ZBTFVFX0JZX0NMQVNTIHwgSUFQX0xTVDsKKwlmcFtuKytdID0gcmV0X2NvZGU7CisKKwkvKiBJbnNlcnQgbGlzdCBsZW5ndGggKE1TQiBmaXJzdCkgKi8KKwl0bXBfYmUxNiA9IF9fY29uc3RhbnRfaHRvbnMoMHgwMDAxKTsKKwltZW1jcHkoZnArbiwgJnRtcF9iZTE2LCAyKTsgIG4gKz0gMjsKKworCS8qIEluc2VydCBvYmplY3QgaWRlbnRpZmllciAoIE1TQiBmaXJzdCkgKi8KKwl0bXBfYmUxNiA9IGNwdV90b19iZTE2KG9ial9pZCk7CisJbWVtY3B5KGZwK24sICZ0bXBfYmUxNiwgMik7IG4gKz0gMjsKKworCXN3aXRjaCAodmFsdWUtPnR5cGUpIHsKKwljYXNlIElBU19TVFJJTkc6CisJCXNrYl9wdXQodHhfc2tiLCAzICsgdmFsdWUtPmxlbik7CisJCWZwW24rK10gPSB2YWx1ZS0+dHlwZTsKKwkJZnBbbisrXSA9IDA7IC8qIEFTQ0lJICovCisJCWZwW24rK10gPSAoX191OCkgdmFsdWUtPmxlbjsKKwkJbWVtY3B5KGZwK24sIHZhbHVlLT50LnN0cmluZywgdmFsdWUtPmxlbik7IG4rPXZhbHVlLT5sZW47CisJCWJyZWFrOworCWNhc2UgSUFTX0lOVEVHRVI6CisJCXNrYl9wdXQodHhfc2tiLCA1KTsKKwkJZnBbbisrXSA9IHZhbHVlLT50eXBlOworCisJCXRtcF9iZTMyID0gY3B1X3RvX2JlMzIodmFsdWUtPnQuaW50ZWdlcik7CisJCW1lbWNweShmcCtuLCAmdG1wX2JlMzIsIDQpOyBuICs9IDQ7CisJCWJyZWFrOworCWNhc2UgSUFTX09DVF9TRVE6CisJCXNrYl9wdXQodHhfc2tiLCAzICsgdmFsdWUtPmxlbik7CisJCWZwW24rK10gPSB2YWx1ZS0+dHlwZTsKKworCQl0bXBfYmUxNiA9IGNwdV90b19iZTE2KHZhbHVlLT5sZW4pOworCQltZW1jcHkoZnArbiwgJnRtcF9iZTE2LCAyKTsgbiArPSAyOworCQltZW1jcHkoZnArbiwgdmFsdWUtPnQub2N0X3NlcSwgdmFsdWUtPmxlbik7IG4rPXZhbHVlLT5sZW47CisJCWJyZWFrOworCWNhc2UgSUFTX01JU1NJTkc6CisJCUlSREFfREVCVUcoIDMsICIlczogc2VuZGluZyBJQVNfTUlTU0lOR1xuIiwgX19GVU5DVElPTl9fKTsKKwkJc2tiX3B1dCh0eF9za2IsIDEpOworCQlmcFtuKytdID0gdmFsdWUtPnR5cGU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMCwgIiVzKCksIHR5cGUgbm90IGltcGxlbWVudGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJYnJlYWs7CisJfQorCWlyaWFwX2RvX3JfY29ubmVjdF9ldmVudChzZWxmLCBJQVBfQ0FMTF9SRVNQT05TRSwgdHhfc2tiKTsKKworCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIHN0YXRlX3JfZXhlY3V0ZSgpLiAqLworCWRldl9rZnJlZV9za2IodHhfc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFwX2dldHZhbHVlYnljbGFzc19pbmRpY2F0aW9uIChzZWxmLCBza2IpCisgKgorICogICAgZ2V0dmFsdWVieWNsYXNzIGlzIHJlcXVlc3RlZCBmcm9tIHBlZXIgTE0tSUFTCisgKgorICovCitzdGF0aWMgdm9pZCBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfaW5kaWNhdGlvbihzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsCisJCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaWFzX29iamVjdCAqb2JqOworCXN0cnVjdCBpYXNfYXR0cmliICphdHRyaWI7CisJaW50IG5hbWVfbGVuOworCWludCBhdHRyX2xlbjsKKwljaGFyIG5hbWVbSUFTX01BWF9DTEFTU05BTUUgKyAxXTsJLyogNjAgYnl0ZXMgKi8KKwljaGFyIGF0dHJbSUFTX01BWF9BVFRSSUJOQU1FICsgMV07CS8qIDYwIGJ5dGVzICovCisJX191OCAqZnA7CisJaW50IG47CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKKworCWZwID0gc2tiLT5kYXRhOworCW4gPSAxOworCisJbmFtZV9sZW4gPSBmcFtuKytdOworCW1lbWNweShuYW1lLCBmcCtuLCBuYW1lX2xlbik7IG4rPW5hbWVfbGVuOworCW5hbWVbbmFtZV9sZW5dID0gJ1wwJzsKKworCWF0dHJfbGVuID0gZnBbbisrXTsKKwltZW1jcHkoYXR0ciwgZnArbiwgYXR0cl9sZW4pOyBuKz1hdHRyX2xlbjsKKwlhdHRyW2F0dHJfbGVuXSA9ICdcMCc7CisKKwlJUkRBX0RFQlVHKDQsICJMTS1JQVM6IExvb2tpbmcgdXAgJXM6ICVzXG4iLCBuYW1lLCBhdHRyKTsKKwlvYmogPSBpcmlhc19maW5kX29iamVjdChuYW1lKTsKKworCWlmIChvYmogPT0gTlVMTCkgeworCQlJUkRBX0RFQlVHKDIsICJMTS1JQVM6IE9iamVjdCAlcyBub3QgZm91bmRcbiIsIG5hbWUpOworCQlpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVzcG9uc2Uoc2VsZiwgMHgxMjM1LCBJQVNfQ0xBU1NfVU5LTk9XTiwKKwkJCQkJICAgICAgICZpcmlhc19taXNzaW5nKTsKKwkJcmV0dXJuOworCX0KKwlJUkRBX0RFQlVHKDQsICJMTS1JQVM6IGZvdW5kICVzLCBpZD0lZFxuIiwgb2JqLT5uYW1lLCBvYmotPmlkKTsKKworCWF0dHJpYiA9IGlyaWFzX2ZpbmRfYXR0cmliKG9iaiwgYXR0cik7CisJaWYgKGF0dHJpYiA9PSBOVUxMKSB7CisJCUlSREFfREVCVUcoMiwgIkxNLUlBUzogQXR0cmlidXRlICVzIG5vdCBmb3VuZFxuIiwgYXR0cik7CisJCWlyaWFwX2dldHZhbHVlYnljbGFzc19yZXNwb25zZShzZWxmLCBvYmotPmlkLAorCQkJCQkgICAgICAgSUFTX0FUVFJJQl9VTktOT1dOLCAKKwkJCQkJICAgICAgICZpcmlhc19taXNzaW5nKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFdlIGhhdmUgYSBtYXRjaDsgc2VuZCB0aGUgdmFsdWUuICAqLworCWlyaWFwX2dldHZhbHVlYnljbGFzc19yZXNwb25zZShzZWxmLCBvYmotPmlkLCBJQVNfU1VDQ0VTUywKKwkJCQkgICAgICAgYXR0cmliLT52YWx1ZSk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmlhcF9zZW5kX2FjayAodm9pZCkKKyAqCisgKiAgICBDdXJyZW50bHkgbm90IHVzZWQKKyAqCisgKi8KK3ZvaWQgaXJpYXBfc2VuZF9hY2soc3RydWN0IGlyaWFwX2NiICpzZWxmKQoreworCXN0cnVjdCBza19idWZmICp0eF9za2I7CisJX191OCAqZnJhbWU7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOworCisJdHhfc2tiID0gZGV2X2FsbG9jX3NrYig2NCk7CisJaWYgKCF0eF9za2IpCisJCXJldHVybjsKKworCS8qIFJlc2VydmUgc3BhY2UgZm9yIE1VWCBhbmQgTEFQIGhlYWRlciAqLworCXNrYl9yZXNlcnZlKHR4X3NrYiwgc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKKwlza2JfcHV0KHR4X3NrYiwgMSk7CisJZnJhbWUgPSB0eF9za2ItPmRhdGE7CisKKwkvKiBCdWlsZCBmcmFtZSAqLworCWZyYW1lWzBdID0gSUFQX0xTVCB8IElBUF9BQ0sgfCBzZWxmLT5vcGVyYXRpb247CisKKwlpcmxtcF9kYXRhX3JlcXVlc3Qoc2VsZi0+bHNhcCwgdHhfc2tiKTsKK30KKwordm9pZCBpcmlhcF9jb25uZWN0X3JlcXVlc3Qoc3RydWN0IGlyaWFwX2NiICpzZWxmKQoreworCWludCByZXQ7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CisKKwlyZXQgPSBpcmxtcF9jb25uZWN0X3JlcXVlc3Qoc2VsZi0+bHNhcCwgTFNBUF9JQVMsCisJCQkJICAgIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkciwKKwkJCQkgICAgTlVMTCwgTlVMTCk7CisJaWYgKHJldCA8IDApIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgY29ubmVjdCBmYWlsZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzZWxmLT5jb25maXJtKElBU19ESVNDT05ORUNULCAwLCBOVUxMLCBzZWxmLT5wcml2KTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmlhcF9jb25uZWN0X2NvbmZpcm0gKGhhbmRsZSwgc2tiKQorICoKKyAqICAgIExTQVAgY29ubmVjdGlvbiBjb25maXJtZWQhCisgKgorICovCitzdGF0aWMgdm9pZCBpcmlhcF9jb25uZWN0X2NvbmZpcm0odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKKwkJCQkgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLCBfX3UzMiBtYXhfc2VnX3NpemUsCisJCQkJICBfX3U4IG1heF9oZWFkZXJfc2l6ZSwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlyaWFwX2NiICpzZWxmOworCisJc2VsZiA9IChzdHJ1Y3QgaXJpYXBfY2IgKikgaW5zdGFuY2U7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOworCisJc2VsZi0+bWF4X2RhdGFfc2l6ZSA9IG1heF9zZWdfc2l6ZTsKKwlzZWxmLT5tYXhfaGVhZGVyX3NpemUgPSBtYXhfaGVhZGVyX3NpemU7CisKKwlkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKKworCWlyaWFwX2RvX2NsaWVudF9ldmVudChzZWxmLCBJQVBfTE1fQ09OTkVDVF9DT05GSVJNLCBza2IpOworCisJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgc3RhdGVfc19tYWtlX2NhbGwoKS4gKi8KKwlkZXZfa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmlhcF9jb25uZWN0X2luZGljYXRpb24gKCBoYW5kbGUsIHNrYikKKyAqCisgKiAgICBSZW1vdGUgTE0tSUFTIGlzIHJlcXVlc3RpbmcgY29ubmVjdGlvbgorICoKKyAqLworc3RhdGljIHZvaWQgaXJpYXBfY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJICAgICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywgX191MzIgbWF4X3NlZ19zaXplLAorCQkJCSAgICAgX191OCBtYXhfaGVhZGVyX3NpemUsCisJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgKm5ldzsKKworCUlSREFfREVCVUcoMSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzZWxmID0gKHN0cnVjdCBpcmlhcF9jYiAqKSBpbnN0YW5jZTsKKworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIGdvdG8gb3V0Oyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCBnb3RvIG91dDspOworCisJLyogU3RhcnQgbmV3IHNlcnZlciAqLworCW5ldyA9IGlyaWFwX29wZW4oTFNBUF9JQVMsIElBU19TRVJWRVIsIE5VTEwsIE5VTEwpOworCWlmICghbmV3KSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIG9wZW4gZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBOb3cgYXR0YWNoIHVwIHRoZSBuZXcgInNvY2tldCIgKi8KKwluZXctPmxzYXAgPSBpcmxtcF9kdXAoc2VsZi0+bHNhcCwgbmV3KTsKKwlpZiAoIW5ldy0+bHNhcCkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBkdXAgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBvdXQ7CisJfQorCisJbmV3LT5tYXhfZGF0YV9zaXplID0gbWF4X3NlZ19zaXplOworCW5ldy0+bWF4X2hlYWRlcl9zaXplID0gbWF4X2hlYWRlcl9zaXplOworCisJLyogQ2xlYW4gdXAgdGhlIG9yaWdpbmFsIG9uZSB0byBrZWVwIGl0IGluIGxpc3RlbiBzdGF0ZSAqLworCWlybG1wX2xpc3RlbihzZWxmLT5sc2FwKTsKKworCWlyaWFwX2RvX3NlcnZlcl9ldmVudChuZXcsIElBUF9MTV9DT05ORUNUX0lORElDQVRJT04sIHNrYik7CisKK291dDoKKwkvKiBEcm9wIHJlZmVyZW5jZSBjb3VudCAtIHNlZSBzdGF0ZV9yX2Rpc2Nvbm5lY3QoKS4gKi8KKwlkZXZfa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmlhcF9kYXRhX2luZGljYXRpb24gKGhhbmRsZSwgc2tiKQorICoKKyAqICAgIFJlY2VpdmVzIGRhdGEgZnJvbSBjb25uZWN0aW9uIGlkZW50aWZpZWQgYnkgaGFuZGxlIGZyb20gSXJMTVAKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJpYXBfZGF0YV9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlyaWFwX2NiICpzZWxmOworCV9fdTggICpmcmFtZTsKKwlfX3U4ICBvcGNvZGU7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc2VsZiA9IChzdHJ1Y3QgaXJpYXBfY2IgKikgaW5zdGFuY2U7CisKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIGdvdG8gb3V0Oyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCBnb3RvIG91dDspOworCisJZnJhbWUgPSBza2ItPmRhdGE7CisKKwlpZiAoc2VsZi0+bW9kZSA9PSBJQVNfU0VSVkVSKSB7CisJCS8qIENhbGwgc2VydmVyICovCisJCUlSREFfREVCVUcoNCwgIiVzKCksIENhbGxpbmcgc2VydmVyIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJaXJpYXBfZG9fcl9jb25uZWN0X2V2ZW50KHNlbGYsIElBUF9SRUNWX0ZfTFNULCBza2IpOworCQlnb3RvIG91dDsKKwl9CisJb3Bjb2RlID0gZnJhbWVbMF07CisJaWYgKH5vcGNvZGUgJiBJQVBfTFNUKSB7CisJCUlSREFfV0FSTklORygiJXM6LCBJcklBUyBtdWx0aWZyYW1lIGNvbW1hbmRzIG9yICIKKwkJCSAgICAgInJlc3VsdHMgaXMgbm90IGltcGxlbWVudGVkIHlldCFcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIENoZWNrIGZvciBhY2sgZnJhbWVzIHNpbmNlIHRoZXkgZG9uJ3QgY29udGFpbiBhbnkgZGF0YSAqLworCWlmIChvcGNvZGUgJiBJQVBfQUNLKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCkgR290IGFjayBmcmFtZSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0OworCX0KKworCW9wY29kZSAmPSB+SUFQX0xTVDsgLyogTWFzayBhd2F5IExTVCBiaXQgKi8KKworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBHRVRfSU5GT19CQVNFOgorCQlJUkRBX0RFQlVHKDAsICJJckxNUCBHZXRJbmZvQmFzZURldGFpbHMgbm90IGltcGxlbWVudGVkIVxuIik7CisJCWJyZWFrOworCWNhc2UgR0VUX1ZBTFVFX0JZX0NMQVNTOgorCQlpcmlhcF9kb19jYWxsX2V2ZW50KHNlbGYsIElBUF9SRUNWX0ZfTFNULCBOVUxMKTsKKworCQlzd2l0Y2ggKGZyYW1lWzFdKSB7CisJCWNhc2UgSUFTX1NVQ0NFU1M6CisJCQlpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfY29uZmlybShzZWxmLCBza2IpOworCQkJYnJlYWs7CisJCWNhc2UgSUFTX0NMQVNTX1VOS05PV046CisJCQlJUkRBX0RFQlVHKDEsICIlcygpLCBObyBzdWNoIGNsYXNzIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCS8qIEZpbmlzaGVkLCBjbG9zZSBjb25uZWN0aW9uISAqLworCQkJaXJpYXBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYpOworCisJCQkvKgorCQkJICogV2FybmluZywgdGhlIGNsaWVudCBtaWdodCBjbG9zZSB1cywgc28gcmVtZW1iZXIKKwkJCSAqIG5vIHRvIHVzZSBzZWxmIGFueW1vcmUgYWZ0ZXIgY2FsbGluZyBjb25maXJtCisJCQkgKi8KKwkJCWlmIChzZWxmLT5jb25maXJtKQorCQkJCXNlbGYtPmNvbmZpcm0oSUFTX0NMQVNTX1VOS05PV04sIDAsIE5VTEwsCisJCQkJCSAgICAgIHNlbGYtPnByaXYpOworCQkJYnJlYWs7CisJCWNhc2UgSUFTX0FUVFJJQl9VTktOT1dOOgorCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgTm8gc3VjaCBhdHRyaWJ1dGUhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJLyogRmluaXNoZWQsIGNsb3NlIGNvbm5lY3Rpb24hICovCisJCQlpcmlhcF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZik7CisKKwkJCS8qCisJCQkgKiBXYXJuaW5nLCB0aGUgY2xpZW50IG1pZ2h0IGNsb3NlIHVzLCBzbyByZW1lbWJlcgorCQkJICogbm8gdG8gdXNlIHNlbGYgYW55bW9yZSBhZnRlciBjYWxsaW5nIGNvbmZpcm0KKwkJCSAqLworCQkJaWYgKHNlbGYtPmNvbmZpcm0pCisJCQkJc2VsZi0+Y29uZmlybShJQVNfQVRUUklCX1VOS05PV04sIDAsIE5VTEwsCisJCQkJCSAgICAgIHNlbGYtPnByaXYpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVW5rbm93biBvcC1jb2RlOiAlMDJ4XG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgICBvcGNvZGUpOworCQlicmVhazsKKwl9CisKK291dDoKKwkvKiBDbGVhbnVwIC0gc3ViLWNhbGxzIHdpbGwgaGF2ZSBkb25lIHNrYl9nZXQoKSBhcyBuZWVkZWQuICovCisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJpYXBfY2FsbF9pbmRpY2F0aW9uIChzZWxmLCBza2IpCisgKgorICogICAgUmVjZWl2ZWQgY2FsbCB0byBzZXJ2ZXIgZnJvbSBwZWVyIExNLUlBUworICoKKyAqLwordm9pZCBpcmlhcF9jYWxsX2luZGljYXRpb24oc3RydWN0IGlyaWFwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCV9fdTggKmZwOworCV9fdTggb3Bjb2RlOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlmcCA9IHNrYi0+ZGF0YTsKKworCW9wY29kZSA9IGZwWzBdOworCWlmICh+b3Bjb2RlICYgMHg4MCkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBJcklBUyBtdWx0aWZyYW1lIGNvbW1hbmRzIG9yIHJlc3VsdHMiCisJCQkgICAgICJpcyBub3QgaW1wbGVtZW50ZWQgeWV0IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKwlvcGNvZGUgJj0gMHg3ZjsgLyogTWFzayBhd2F5IExTVCBiaXQgKi8KKworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBHRVRfSU5GT19CQVNFOgorCQlJUkRBX1dBUk5JTkcoIiVzOiBHZXRJbmZvQmFzZURldGFpbHMgbm90IGltcGxlbWVudGVkIHlldCFcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCWJyZWFrOworCWNhc2UgR0VUX1ZBTFVFX0JZX0NMQVNTOgorCQlpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfaW5kaWNhdGlvbihzZWxmLCBza2IpOworCQlicmVhazsKKwl9CisJLyogc2tiIHdpbGwgYmUgY2xlYW5lZCB1cCBpbiBpcmlhcF9kYXRhX2luZGljYXRpb24gKi8KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFwX3dhdGNoZG9nX3RpbWVyX2V4cGlyZWQgKGRhdGEpCisgKgorICogICAgUXVlcnkgaGFzIHRha2VuIHRvbyBsb25nIHRpbWUsIHNvIGFib3J0CisgKgorICovCitzdGF0aWMgdm9pZCBpcmlhcF93YXRjaGRvZ190aW1lcl9leHBpcmVkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlyaWFwX2NiICpzZWxmID0gKHN0cnVjdCBpcmlhcF9jYiAqKSBkYXRhOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOworCisJLyogaXJpYXBfY2xvc2Uoc2VsZik7ICovCit9CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCitzdGF0aWMgY29uc3QgY2hhciAqaWFzX3ZhbHVlX3R5cGVzW10gPSB7CisJIklBU19NSVNTSU5HIiwKKwkiSUFTX0lOVEVHRVIiLAorCSJJQVNfT0NUX1NFUSIsCisJIklBU19TVFJJTkciCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpYXNfb2JqZWN0ICppcmlhc19zZXFfaWR4KGxvZmZfdCBwb3MpIAoreworCXN0cnVjdCBpYXNfb2JqZWN0ICpvYmo7CisKKwlmb3IgKG9iaiA9IChzdHJ1Y3QgaWFzX29iamVjdCAqKSBoYXNoYmluX2dldF9maXJzdChpcmlhc19vYmplY3RzKTsKKwkgICAgIG9iajsgb2JqID0gKHN0cnVjdCBpYXNfb2JqZWN0ICopIGhhc2hiaW5fZ2V0X25leHQoaXJpYXNfb2JqZWN0cykpIHsKKwkJaWYgKHBvcy0tID09IDApCisJCQlicmVhazsKKwl9CisJCQorCXJldHVybiBvYmo7Cit9CisKK3N0YXRpYyB2b2lkICppcmlhc19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXNwaW5fbG9ja19pcnEoJmlyaWFzX29iamVjdHMtPmhiX3NwaW5sb2NrKTsKKworCXJldHVybiAqcG9zID8gaXJpYXNfc2VxX2lkeCgqcG9zIC0gMSkgOiBTRVFfU1RBUlRfVE9LRU47Cit9CisKK3N0YXRpYyB2b2lkICppcmlhc19zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJKysqcG9zOworCisJcmV0dXJuICh2ID09IFNFUV9TVEFSVF9UT0tFTikgCisJCT8gKHZvaWQgKikgaGFzaGJpbl9nZXRfZmlyc3QoaXJpYXNfb2JqZWN0cykKKwkJOiAodm9pZCAqKSBoYXNoYmluX2dldF9uZXh0KGlyaWFzX29iamVjdHMpOworfQorCitzdGF0aWMgdm9pZCBpcmlhc19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzcGluX3VubG9ja19pcnEoJmlyaWFzX29iamVjdHMtPmhiX3NwaW5sb2NrKTsKK30KKworc3RhdGljIGludCBpcmlhc19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXNlcV9wdXRzKHNlcSwgIkxNLUlBUyBPYmplY3RzOlxuIik7CisJZWxzZSB7CisJCXN0cnVjdCBpYXNfb2JqZWN0ICpvYmogPSB2OworCQlzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliOworCisJCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuIC1FSU5WQUw7KTsKKworCQlzZXFfcHJpbnRmKHNlcSwgIm5hbWU6ICVzLCBpZD0lZFxuIiwKKwkJCSAgIG9iai0+bmFtZSwgb2JqLT5pZCk7CisKKwkJLyogQ2FyZWZ1bCBmb3IgcHJpb3JpdHkgaW52ZXJzaW9ucyBoZXJlICEKKwkJICogQWxsIG90aGVyIHVzZXMgb2YgYXR0cmliIHNwaW5sb2NrIGFyZSBpbmRlcGVuZGVudCBvZgorCQkgKiB0aGUgb2JqZWN0IHNwaW5sb2NrLCBzbyB3ZSBhcmUgc2FmZS4gSmVhbiBJSSAqLworCQlzcGluX2xvY2soJm9iai0+YXR0cmlicy0+aGJfc3BpbmxvY2spOworCisJCS8qIExpc3QgYWxsIGF0dHJpYnV0ZXMgZm9yIHRoaXMgb2JqZWN0ICovCisJCWZvciAoYXR0cmliID0gKHN0cnVjdCBpYXNfYXR0cmliICopIGhhc2hiaW5fZ2V0X2ZpcnN0KG9iai0+YXR0cmlicyk7CisJCSAgICAgYXR0cmliICE9IE5VTEw7CisJCSAgICAgYXR0cmliID0gKHN0cnVjdCBpYXNfYXR0cmliICopIGhhc2hiaW5fZ2V0X25leHQob2JqLT5hdHRyaWJzKSkgeworCQkgICAgIAorCQkJSVJEQV9BU1NFUlQoYXR0cmliLT5tYWdpYyA9PSBJQVNfQVRUUklCX01BR0lDLAorCQkJCSAgICBnb3RvIG91dGxvb3A7ICk7CisKKwkJCXNlcV9wcmludGYoc2VxLCAiIC0gQXR0cmlidXRlIG5hbWU6IFwiJXNcIiwgIiwKKwkJCQkgICBhdHRyaWItPm5hbWUpOworCQkJc2VxX3ByaW50ZihzZXEsICJ2YWx1ZVslc106ICIsCisJCQkJICAgaWFzX3ZhbHVlX3R5cGVzW2F0dHJpYi0+dmFsdWUtPnR5cGVdKTsKKworCQkJc3dpdGNoIChhdHRyaWItPnZhbHVlLT50eXBlKSB7CisJCQljYXNlIElBU19JTlRFR0VSOgorCQkJCXNlcV9wcmludGYoc2VxLCAiJWRcbiIsCisJCQkJCSAgIGF0dHJpYi0+dmFsdWUtPnQuaW50ZWdlcik7CisJCQkJYnJlYWs7CisJCQljYXNlIElBU19TVFJJTkc6CisJCQkJc2VxX3ByaW50ZihzZXEsICJcIiVzXCJcbiIsCisJCQkJCSAgIGF0dHJpYi0+dmFsdWUtPnQuc3RyaW5nKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUFTX09DVF9TRVE6CisJCQkJc2VxX3ByaW50ZihzZXEsICJvY3RldCBzZXF1ZW5jZSAoJWQgYnl0ZXMpXG4iLCAKKwkJCQkJICAgYXR0cmliLT52YWx1ZS0+bGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUFTX01JU1NJTkc6CisJCQkJc2VxX3B1dHMoc2VxLCAibWlzc2luZ1xuIik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXNlcV9wcmludGYoc2VxLCAidHlwZSAlZD9cbiIsIAorCQkJCQkgICBhdHRyaWItPnZhbHVlLT50eXBlKTsKKwkJCX0KKwkJCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CisKKwkJfQorCUlSREFfQVNTRVJUX0xBQkVMKG91dGxvb3A6KQorCQlzcGluX3VubG9jaygmb2JqLT5hdHRyaWJzLT5oYl9zcGlubG9jayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaXJpYXNfc2VxX29wcyA9IHsKKwkuc3RhcnQgID0gaXJpYXNfc2VxX3N0YXJ0LAorCS5uZXh0ICAgPSBpcmlhc19zZXFfbmV4dCwKKwkuc3RvcCAgID0gaXJpYXNfc2VxX3N0b3AsCisJLnNob3cgICA9IGlyaWFzX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBpcmlhc19zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlJUkRBX0FTU0VSVCggaXJpYXNfb2JqZWN0cyAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTDspOworCisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZpcmlhc19zZXFfb3BzKTsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcmlhc19zZXFfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgICAgICAgID0gaXJpYXNfc2VxX29wZW4sCisJLnJlYWQgICAgICAgICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgICAgICAgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCisjZW5kaWYgLyogUFJPQ19GUyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJpYXBfZXZlbnQuYyBiL25ldC9pcmRhL2lyaWFwX2V2ZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTczNjA3NAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lyaWFwX2V2ZW50LmMKQEAgLTAsMCArMSw1MDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGaWxlbmFtZTogICAgICBpcmlhcF9ldmVudC5jCisgKiBWZXJzaW9uOiAgICAgICAwLjEKKyAqIERlc2NyaXB0aW9uOiAgIElBUCBGaW5pdGUgU3RhdGUgTWFjaGluZQorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgVGh1IEF1ZyAyMSAwMDowMjowNyAxOTk3CisgKiBNb2RpZmllZCBhdDogICBXZWQgTWFyICAxIDExOjI4OjM0IDIwMDAKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk3LCAxOTk5LTIwMDAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwKKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXBfZXZlbnQuaD4KKworc3RhdGljIHZvaWQgc3RhdGVfc19kaXNjb25uZWN0ICAgKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIHN0YXRlX3NfY29ubmVjdGluZyAgIChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBzdGF0ZV9zX2NhbGwgICAgICAgICAoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOworCitzdGF0aWMgdm9pZCBzdGF0ZV9zX21ha2VfY2FsbCAgICAoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgc3RhdGVfc19jYWxsaW5nICAgICAgKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIHN0YXRlX3Nfb3V0c3RhbmRpbmcgIChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBzdGF0ZV9zX3JlcGx5aW5nICAgICAoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgc3RhdGVfc193YWl0X2Zvcl9jYWxsKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIHN0YXRlX3Nfd2FpdF9hY3RpdmUgIChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKK3N0YXRpYyB2b2lkIHN0YXRlX3JfZGlzY29ubmVjdCAgIChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBzdGF0ZV9yX2NhbGwgICAgICAgICAoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgc3RhdGVfcl93YWl0aW5nICAgICAgKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIHN0YXRlX3Jfd2FpdF9hY3RpdmUgIChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBzdGF0ZV9yX3JlY2VpdmluZyAgICAoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgc3RhdGVfcl9leGVjdXRlICAgICAgKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIHN0YXRlX3JfcmV0dXJuaW5nICAgIChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKK3N0YXRpYyB2b2lkICgqaXJpYXBfc3RhdGVbXSkoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgPSB7CisJLyogQ2xpZW50IEZTTSAqLworCXN0YXRlX3NfZGlzY29ubmVjdCwKKwlzdGF0ZV9zX2Nvbm5lY3RpbmcsCisJc3RhdGVfc19jYWxsLAorCisJLyogUy1DYWxsIEZTTSAqLworCXN0YXRlX3NfbWFrZV9jYWxsLAorCXN0YXRlX3NfY2FsbGluZywKKwlzdGF0ZV9zX291dHN0YW5kaW5nLAorCXN0YXRlX3NfcmVwbHlpbmcsCisJc3RhdGVfc193YWl0X2Zvcl9jYWxsLAorCXN0YXRlX3Nfd2FpdF9hY3RpdmUsCisKKwkvKiBTZXJ2ZXIgRlNNICovCisJc3RhdGVfcl9kaXNjb25uZWN0LAorCXN0YXRlX3JfY2FsbCwKKworCS8qIFItQ29ubmVjdCBGU00gKi8KKwlzdGF0ZV9yX3dhaXRpbmcsCisJc3RhdGVfcl93YWl0X2FjdGl2ZSwKKwlzdGF0ZV9yX3JlY2VpdmluZywKKwlzdGF0ZV9yX2V4ZWN1dGUsCisJc3RhdGVfcl9yZXR1cm5pbmcsCit9OworCit2b2lkIGlyaWFwX25leHRfY2xpZW50X3N0YXRlKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfU1RBVEUgc3RhdGUpCit7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOworCisJc2VsZi0+Y2xpZW50X3N0YXRlID0gc3RhdGU7Cit9CisKK3ZvaWQgaXJpYXBfbmV4dF9jYWxsX3N0YXRlKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfU1RBVEUgc3RhdGUpCit7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOworCisJc2VsZi0+Y2FsbF9zdGF0ZSA9IHN0YXRlOworfQorCit2b2lkIGlyaWFwX25leHRfc2VydmVyX3N0YXRlKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfU1RBVEUgc3RhdGUpCit7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOworCisJc2VsZi0+c2VydmVyX3N0YXRlID0gc3RhdGU7Cit9CisKK3ZvaWQgaXJpYXBfbmV4dF9yX2Nvbm5lY3Rfc3RhdGUoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9TVEFURSBzdGF0ZSkKK3sKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CisKKwlzZWxmLT5yX2Nvbm5lY3Rfc3RhdGUgPSBzdGF0ZTsKK30KKwordm9pZCBpcmlhcF9kb19jbGllbnRfZXZlbnQoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCSAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOworCisJKCppcmlhcF9zdGF0ZVsgc2VsZi0+Y2xpZW50X3N0YXRlXSkgKHNlbGYsIGV2ZW50LCBza2IpOworfQorCit2b2lkIGlyaWFwX2RvX2NhbGxfZXZlbnQoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKKworCSgqaXJpYXBfc3RhdGVbIHNlbGYtPmNhbGxfc3RhdGVdKSAoc2VsZiwgZXZlbnQsIHNrYik7Cit9CisKK3ZvaWQgaXJpYXBfZG9fc2VydmVyX2V2ZW50KHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCisJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKKworCSgqaXJpYXBfc3RhdGVbIHNlbGYtPnNlcnZlcl9zdGF0ZV0pIChzZWxmLCBldmVudCwgc2tiKTsKK30KKwordm9pZCBpcmlhcF9kb19yX2Nvbm5lY3RfZXZlbnQoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOworCisJKCppcmlhcF9zdGF0ZVsgc2VsZi0+cl9jb25uZWN0X3N0YXRlXSkgKHNlbGYsIGV2ZW50LCBza2IpOworfQorCisKKy8qCisgKiBGdW5jdGlvbiBzdGF0ZV9zX2Rpc2Nvbm5lY3QgKGV2ZW50LCBza2IpCisgKgorICogICAgUy1EaXNjb25uZWN0LCBUaGUgZGV2aWNlIGhhcyBubyBMU0FQIGNvbm5lY3Rpb24gdG8gYSBwYXJ0aWN1bGFyCisgKiAgICByZW1vdGUgZGV2aWNlLgorICovCitzdGF0aWMgdm9pZCBzdGF0ZV9zX2Rpc2Nvbm5lY3Qoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIElBUF9DQUxMX1JFUVVFU1RfR1ZCQzoKKwkJaXJpYXBfbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgU19DT05ORUNUSU5HKTsKKwkJSVJEQV9BU1NFUlQoc2VsZi0+cmVxdWVzdF9za2IgPT0gTlVMTCwgcmV0dXJuOyk7CisJCS8qIERvbid0IGZvcmdldCB0byByZWZjb3VudCBpdCAtCisJCSAqIHNlZSBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVxdWVzdCgpLiAqLworCQlza2JfZ2V0KHNrYik7CisJCXNlbGYtPnJlcXVlc3Rfc2tiID0gc2tiOworCQlpcmlhcF9jb25uZWN0X3JlcXVlc3Qoc2VsZik7CisJCWJyZWFrOworCWNhc2UgSUFQX0xNX0RJU0NPTk5FQ1RfSU5ESUNBVElPTjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fLCBldmVudCk7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIHN0YXRlX3NfY29ubmVjdGluZyAoc2VsZiwgZXZlbnQsIHNrYikKKyAqCisgKiAgICBTLUNvbm5lY3RpbmcKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHN0YXRlX3NfY29ubmVjdGluZyhzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgSUFQX0xNX0NPTk5FQ1RfQ09ORklSTToKKwkJLyoKKwkJICogIEp1bXAgdG8gUy1DYWxsIEZTTQorCQkgKi8KKwkJaXJpYXBfZG9fY2FsbF9ldmVudChzZWxmLCBJQVBfQ0FMTF9SRVFVRVNULCBza2IpOworCQkvKiBpcmlhcF9jYWxsX3JlcXVlc3Qoc2VsZiwgMCwwLDApOyAqLworCQlpcmlhcF9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBTX0NBTEwpOworCQlicmVhazsKKwljYXNlIElBUF9MTV9ESVNDT05ORUNUX0lORElDQVRJT046CisJCS8qIEFib3J0IGNhbGxzICovCisJCWlyaWFwX25leHRfY2FsbF9zdGF0ZShzZWxmLCBTX01BS0VfQ0FMTCk7CisJCWlyaWFwX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIFNfRElTQ09OTkVDVCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXywgZXZlbnQpOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzdGF0ZV9zX2NhbGwgKHNlbGYsIGV2ZW50LCBza2IpCisgKgorICogICAgUy1DYWxsLCBUaGUgZGV2aWNlIGNhbiBwcm9jZXNzIGNhbGxzIHRvIGEgc3BlY2lmaWMgcmVtb3RlCisgKiAgICBkZXZpY2UuIFdoZW5ldmVyIHRoZSBMU0FQIGNvbm5lY3Rpb24gaXMgZGlzY29ubmVjdGVkLCB0aGlzIHN0YXRlCisgKiAgICBjYXRjaGVzIHRoYXQgZXZlbnQgYW5kIGNsZWFycyB1cAorICovCitzdGF0aWMgdm9pZCBzdGF0ZV9zX2NhbGwoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJQVBfTE1fRElTQ09OTkVDVF9JTkRJQ0FUSU9OOgorCQkvKiBBYm9ydCBjYWxscyAqLworCQlpcmlhcF9uZXh0X2NhbGxfc3RhdGUoc2VsZiwgU19NQUtFX0NBTEwpOworCQlpcmlhcF9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBTX0RJU0NPTk5FQ1QpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDAsICJzdGF0ZV9zX2NhbGw6IFVua25vd24gZXZlbnQgJWRcbiIsIGV2ZW50KTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gc3RhdGVfc19tYWtlX2NhbGwgKGV2ZW50LCBza2IpCisgKgorICogICAgUy1NYWtlLUNhbGwKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHN0YXRlX3NfbWFrZV9jYWxsKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmICp0eF9za2I7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgSUFQX0NBTExfUkVRVUVTVDoKKwkJLyogQWxyZWFkeSByZWZjb3VudGVkIC0gc2VlIHN0YXRlX3NfZGlzY29ubmVjdCgpICovCisJCXR4X3NrYiA9IHNlbGYtPnJlcXVlc3Rfc2tiOworCQlzZWxmLT5yZXF1ZXN0X3NrYiA9IE5VTEw7CisKKwkJaXJsbXBfZGF0YV9yZXF1ZXN0KHNlbGYtPmxzYXAsIHR4X3NrYik7CisJCWlyaWFwX25leHRfY2FsbF9zdGF0ZShzZWxmLCBTX09VVFNUQU5ESU5HKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fLCBldmVudCk7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIHN0YXRlX3NfY2FsbGluZyAoZXZlbnQsIHNrYikKKyAqCisgKiAgICBTLUNhbGxpbmcKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHN0YXRlX3NfY2FsbGluZyhzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJSVJEQV9ERUJVRygwLCAiJXMoKSwgTm90IGltcGxlbWVudGVkXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCisvKgorICogRnVuY3Rpb24gc3RhdGVfc19vdXRzdGFuZGluZyAoZXZlbnQsIHNrYikKKyAqCisgKiAgICBTLU91dHN0YW5kaW5nLCBUaGUgZGV2aWNlIGlzIHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgdG8gYSBjb21tYW5kCisgKgorICovCitzdGF0aWMgdm9pZCBzdGF0ZV9zX291dHN0YW5kaW5nKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgSUFQX1JFQ1ZfRl9MU1Q6CisJCS8qaXJpYXBfc2VuZF9hY2soc2VsZik7Ki8KKwkJLypMTV9JZGxlX3JlcXVlc3QoaWRsZSk7ICovCisKKwkJaXJpYXBfbmV4dF9jYWxsX3N0YXRlKHNlbGYsIFNfV0FJVF9GT1JfQ0FMTCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXywgZXZlbnQpOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzdGF0ZV9zX3JlcGx5aW5nIChldmVudCwgc2tiKQorICoKKyAqICAgIFMtUmVwbHlpbmcsIFRoZSBkZXZpY2UgaXMgY29sbGVjdGluZyBhIG11bHRpcGxlIHBhcnQgcmVzcG9uc2UKKyAqLworc3RhdGljIHZvaWQgc3RhdGVfc19yZXBseWluZyhzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfREVCVUcoMCwgIiVzKCksIE5vdCBpbXBsZW1lbnRlZFxuIiwgX19GVU5DVElPTl9fKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHN0YXRlX3Nfd2FpdF9mb3JfY2FsbCAoZXZlbnQsIHNrYikKKyAqCisgKiAgICBTLVdhaXQtZm9yLUNhbGwKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHN0YXRlX3Nfd2FpdF9mb3JfY2FsbChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0RFQlVHKDAsICIlcygpLCBOb3QgaW1wbGVtZW50ZWRcbiIsIF9fRlVOQ1RJT05fXyk7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIHN0YXRlX3Nfd2FpdF9hY3RpdmUgKGV2ZW50LCBza2IpCisgKgorICogICAgUy1XYWl0LUFjdGl2ZQorICoKKyAqLworc3RhdGljIHZvaWQgc3RhdGVfc193YWl0X2FjdGl2ZShzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJSVJEQV9ERUJVRygwLCAiJXMoKSwgTm90IGltcGxlbWVudGVkXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgU2VydmVyIEZTTQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEZ1bmN0aW9uIHN0YXRlX3JfZGlzY29ubmVjdCAoc2VsZiwgZXZlbnQsIHNrYikKKyAqCisgKiAgICBMTS1JQVMgc2VydmVyIGlzIGRpc2Nvbm5lY3RlZCAobm90IHByb2Nlc3NpbmcgYW55IHJlcXVlc3RzISkKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHN0YXRlX3JfZGlzY29ubmVjdChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIElBUF9MTV9DT05ORUNUX0lORElDQVRJT046CisJCXR4X3NrYiA9IGRldl9hbGxvY19za2IoNjQpOworCQlpZiAodHhfc2tiID09IE5VTEwpIHsKKwkJCUlSREFfV0FSTklORygiJXM6IHVuYWJsZSB0byBtYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgTVVYX0NPTlRST0wgYW5kIExBUCBoZWFkZXIgKi8KKwkJc2tiX3Jlc2VydmUodHhfc2tiLCBMTVBfTUFYX0hFQURFUik7CisKKwkJaXJsbXBfY29ubmVjdF9yZXNwb25zZShzZWxmLT5sc2FwLCB0eF9za2IpOworCQkvKkxNX0lkbGVfcmVxdWVzdChpZGxlKTsgKi8KKworCQlpcmlhcF9uZXh0X3NlcnZlcl9zdGF0ZShzZWxmLCBSX0NBTEwpOworCisJCS8qCisJCSAqICBKdW1wIHRvIFItQ29ubmVjdCBGU00sIHdlIHNraXAgUi1XYWl0aW5nIHNpbmNlIHdlIGRvIG5vdAorCQkgKiAgY2FyZSBhYm91dCBMTV9JZGxlX3JlcXVlc3QoKSEKKwkJICovCisJCWlyaWFwX25leHRfcl9jb25uZWN0X3N0YXRlKHNlbGYsIFJfUkVDRUlWSU5HKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fLCBldmVudCk7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIHN0YXRlX3JfY2FsbCAoc2VsZiwgZXZlbnQsIHNrYikKKyAqLworc3RhdGljIHZvaWQgc3RhdGVfcl9jYWxsKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCisJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgSUFQX0xNX0RJU0NPTk5FQ1RfSU5ESUNBVElPTjoKKwkJLyogQWJvcnQgY2FsbCAqLworCQlpcmlhcF9uZXh0X3NlcnZlcl9zdGF0ZShzZWxmLCBSX0RJU0NPTk5FQ1QpOworCQlpcmlhcF9uZXh0X3JfY29ubmVjdF9zdGF0ZShzZWxmLCBSX1dBSVRJTkcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDAsICIlcygpLCB1bmtub3duIGV2ZW50IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogIFItQ29ubmVjdCBGU00KKyAqLworCisvKgorICogRnVuY3Rpb24gc3RhdGVfcl93YWl0aW5nIChzZWxmLCBldmVudCwgc2tiKQorICovCitzdGF0aWMgdm9pZCBzdGF0ZV9yX3dhaXRpbmcoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBJUklBUF9FVkVOVCBldmVudCwKKwkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfREVCVUcoMCwgIiVzKCksIE5vdCBpbXBsZW1lbnRlZFxuIiwgX19GVU5DVElPTl9fKTsKK30KKworc3RhdGljIHZvaWQgc3RhdGVfcl93YWl0X2FjdGl2ZShzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJSVJEQV9ERUJVRygwLCAiJXMoKSwgTm90IGltcGxlbWVudGVkXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCisvKgorICogRnVuY3Rpb24gc3RhdGVfcl9yZWNlaXZpbmcgKHNlbGYsIGV2ZW50LCBza2IpCisgKgorICogICAgV2UgYXJlIHJlY2VpdmluZyBhIGNvbW1hbmQKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHN0YXRlX3JfcmVjZWl2aW5nKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJQVBfUkVDVl9GX0xTVDoKKwkJaXJpYXBfbmV4dF9yX2Nvbm5lY3Rfc3RhdGUoc2VsZiwgUl9FWEVDVVRFKTsKKworCQlpcmlhcF9jYWxsX2luZGljYXRpb24oc2VsZiwgc2tiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5rbm93biBldmVudCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIHN0YXRlX3JfZXhlY3V0ZSAoc2VsZiwgZXZlbnQsIHNrYikKKyAqCisgKiAgICBUaGUgc2VydmVyIGlzIHByb2Nlc3NpbmcgdGhlIHJlcXVlc3QKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHN0YXRlX3JfZXhlY3V0ZShzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIElSSUFQX0VWRU5UIGV2ZW50LAorCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJQVBfQ0FMTF9SRVNQT05TRToKKwkJLyoKKwkJICogIFNpbmNlIHdlIGRvbid0IGltcGxlbWVudCB0aGUgV2FpdGluZyBzdGF0ZSwgd2UgcmV0dXJuCisJCSAqICB0byBzdGF0ZSBSZWNlaXZpbmcgaW5zdGVhZCwgREIuCisJCSAqLworCQlpcmlhcF9uZXh0X3JfY29ubmVjdF9zdGF0ZShzZWxmLCBSX1JFQ0VJVklORyk7CisKKwkJLyogRG9uJ3QgZm9yZ2V0IHRvIHJlZmNvdW50IGl0IC0gc2VlCisJCSAqIGlyaWFwX2dldHZhbHVlYnljbGFzc19yZXNwb25zZSgpLiAqLworCQlza2JfZ2V0KHNrYik7CisKKwkJaXJsbXBfZGF0YV9yZXF1ZXN0KHNlbGYtPmxzYXAsIHNrYik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMCwgIiVzKCksIHVua25vd24gZXZlbnQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN0YXRlX3JfcmV0dXJuaW5nKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgSVJJQVBfRVZFTlQgZXZlbnQsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfREVCVUcoMCwgIiVzKCksIGV2ZW50PSVkXG4iLCBfX0ZVTkNUSU9OX18sIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIElBUF9SRUNWX0ZfTFNUOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmlhc19vYmplY3QuYyBiL25ldC9pcmRhL2lyaWFzX29iamVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZWM0MjgKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcmlhc19vYmplY3QuYwpAQCAtMCwwICsxLDU4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZpbGVuYW1lOiAgICAgIGlyaWFzX29iamVjdC5jCisgKiBWZXJzaW9uOiAgICAgICAwLjMKKyAqIERlc2NyaXB0aW9uOiAgIElBUyBvYmplY3QgZGF0YWJhc2UgYW5kIGZ1bmN0aW9ucworICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgVGh1IE9jdCAgMSAyMjo1MDowNCAxOTk4CisgKiBNb2RpZmllZCBhdDogICBXZWQgRGVjIDE1IDExOjIzOjE2IDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcworICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhc19vYmplY3QuaD4KKworaGFzaGJpbl90ICppcmlhc19vYmplY3RzOworCisvKgorICogIFVzZWQgd2hlbiBhIG1pc3NpbmcgdmFsdWUgbmVlZHMgdG8gYmUgcmV0dXJuZWQKKyAqLworc3RydWN0IGlhc192YWx1ZSBpcmlhc19taXNzaW5nID0geyBJQVNfTUlTU0lORywgMCwgMCwgMCwgezB9fTsKKworLyoKKyAqIEZ1bmN0aW9uIHN0cm5kdXAgKHN0ciwgbWF4KQorICoKKyAqICAgIE15IG93biBrZXJuZWwgdmVyc2lvbiBvZiBzdHJuZHVwIQorICoKKyAqIEZhc3RlciwgY2hlY2sgYm91bmRhcnkuLi4gSmVhbiBJSQorICovCitzdGF0aWMgY2hhciAqc3RybmR1cChjaGFyICpzdHIsIGludCBtYXgpCit7CisJY2hhciAqbmV3X3N0cjsKKwlpbnQgbGVuOworCisJLyogQ2hlY2sgc3RyaW5nICovCisJaWYgKHN0ciA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwkvKiBDaGVjayBsZW5ndGgsIHRydW5jYXRlICovCisJbGVuID0gc3RybGVuKHN0cik7CisJaWYobGVuID4gbWF4KQorCQlsZW4gPSBtYXg7CisKKwkvKiBBbGxvY2F0ZSBuZXcgc3RyaW5nICovCisgICAgICAgIG5ld19zdHIgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9BVE9NSUMpOworICAgICAgICBpZiAobmV3X3N0ciA9PSBOVUxMKSB7CisJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogQ29weSBhbmQgdHJ1bmNhdGUgKi8KKwltZW1jcHkobmV3X3N0ciwgc3RyLCBsZW4pOworCW5ld19zdHJbbGVuXSA9ICdcMCc7CisKKwlyZXR1cm4gbmV3X3N0cjsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlhc19uZXdfb2JqZWN0IChuYW1lLCBpZCkKKyAqCisgKiAgICBDcmVhdGUgYSBuZXcgSUFTIG9iamVjdAorICoKKyAqLworc3RydWN0IGlhc19vYmplY3QgKmlyaWFzX25ld19vYmplY3QoIGNoYXIgKm5hbWUsIGludCBpZCkKK3sKKyAgICAgICAgc3RydWN0IGlhc19vYmplY3QgKm9iajsKKworCUlSREFfREVCVUcoIDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJb2JqID0gKHN0cnVjdCBpYXNfb2JqZWN0ICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpYXNfb2JqZWN0KSwKKwkJCQkJICAgIEdGUF9BVE9NSUMpOworCWlmIChvYmogPT0gTlVMTCkgeworCQlJUkRBX1dBUk5JTkcoIiVzKCksIFVuYWJsZSB0byBhbGxvY2F0ZSBvYmplY3QhXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KG9iaiwgMCwgc2l6ZW9mKCBzdHJ1Y3QgaWFzX29iamVjdCkpOworCisJb2JqLT5tYWdpYyA9IElBU19PQkpFQ1RfTUFHSUM7CisJb2JqLT5uYW1lID0gc3RybmR1cChuYW1lLCBJQVNfTUFYX0NMQVNTTkFNRSk7CisJb2JqLT5pZCA9IGlkOworCisJLyogTG9ja2luZyBub3RlcyA6IHRoZSBhdHRyaWIgc3BpbmxvY2sgaGFzIGxvd2VyIHByZWNlbmRlbmNlCisJICogdGhhbiB0aGUgb2JqZWN0cyBzcGlubG9jay4gTmV2ZXIgZ3JhcCB0aGUgb2JqZWN0cyBzcGlubG9jaworCSAqIHdoaWxlIGhvbGRpbmcgYW55IGF0dHJpYiBzcGlubG9jayAocmlzayBvZiBkZWFkbG9jaykuIEplYW4gSUkgKi8KKwlvYmotPmF0dHJpYnMgPSBoYXNoYmluX25ldyhIQl9MT0NLKTsKKworCWlmIChvYmotPmF0dHJpYnMgPT0gTlVMTCkgeworCQlJUkRBX1dBUk5JTkcoIiVzKCksIFVuYWJsZSB0byBhbGxvY2F0ZSBhdHRyaWJzIVxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJa2ZyZWUob2JqKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIG9iajsKK30KK0VYUE9SVF9TWU1CT0woaXJpYXNfbmV3X29iamVjdCk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmlhc19kZWxldGVfYXR0cmliIChhdHRyaWIpCisgKgorICogICAgRGVsZXRlIGdpdmVuIGF0dHJpYnV0ZSBhbmQgZGVhbGxvY2F0ZSBhbGwgaXRzIG1lbW9yeQorICoKKyAqLworc3RhdGljIHZvaWQgX19pcmlhc19kZWxldGVfYXR0cmliKHN0cnVjdCBpYXNfYXR0cmliICphdHRyaWIpCit7CisJSVJEQV9BU1NFUlQoYXR0cmliICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKGF0dHJpYi0+bWFnaWMgPT0gSUFTX0FUVFJJQl9NQUdJQywgcmV0dXJuOyk7CisKKwlpZiAoYXR0cmliLT5uYW1lKQorCQlrZnJlZShhdHRyaWItPm5hbWUpOworCisJaXJpYXNfZGVsZXRlX3ZhbHVlKGF0dHJpYi0+dmFsdWUpOworCWF0dHJpYi0+bWFnaWMgPSB+SUFTX0FUVFJJQl9NQUdJQzsKKworCWtmcmVlKGF0dHJpYik7Cit9CisKK3ZvaWQgX19pcmlhc19kZWxldGVfb2JqZWN0KHN0cnVjdCBpYXNfb2JqZWN0ICpvYmopCit7CisJSVJEQV9BU1NFUlQob2JqICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuOyk7CisKKwlpZiAob2JqLT5uYW1lKQorCQlrZnJlZShvYmotPm5hbWUpOworCisJaGFzaGJpbl9kZWxldGUob2JqLT5hdHRyaWJzLCAoRlJFRV9GVU5DKSBfX2lyaWFzX2RlbGV0ZV9hdHRyaWIpOworCisJb2JqLT5tYWdpYyA9IH5JQVNfT0JKRUNUX01BR0lDOworCisJa2ZyZWUob2JqKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFzX2RlbGV0ZV9vYmplY3QgKG9iaikKKyAqCisgKiAgICBSZW1vdmUgb2JqZWN0IGZyb20gaGFzaGJpbiBhbmQgZGVhbGxvY2F0ZSBhbGwgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGgKKyAqICAgIHdpdGggdGhpcyBvYmplY3QgYW5kIHRoZSBvYmplY3QgaXRzZWxmCisgKgorICovCitpbnQgaXJpYXNfZGVsZXRlX29iamVjdChzdHJ1Y3QgaWFzX29iamVjdCAqb2JqKQoreworCXN0cnVjdCBpYXNfb2JqZWN0ICpub2RlOworCisJSVJEQV9BU1NFUlQob2JqICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwkvKiBSZW1vdmUgZnJvbSBsaXN0ICovCisJbm9kZSA9IGhhc2hiaW5fcmVtb3ZlX3RoaXMoaXJpYXNfb2JqZWN0cywgKGlyZGFfcXVldWVfdCAqKSBvYmopOworCWlmICghbm9kZSkKKwkJSVJEQV9ERUJVRyggMCwgIiVzKCksIG9iamVjdCBhbHJlYWR5IHJlbW92ZWQhXG4iLAorCQkJICAgIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBEZXN0cm95ICovCisJX19pcmlhc19kZWxldGVfb2JqZWN0KG9iaik7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaXJpYXNfZGVsZXRlX29iamVjdCk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmlhc19kZWxldGVfYXR0cmliIChvYmopCisgKgorICogICAgUmVtb3ZlIGF0dHJpYnV0ZSBmcm9tIGhhc2hiaW4gYW5kLCBpZiBpdCB3YXMgdGhlIGxhc3QgYXR0cmlidXRlIG9mCisgKiAgICB0aGUgb2JqZWN0LCByZW1vdmUgdGhlIG9iamVjdCBhcyB3ZWxsLgorICoKKyAqLworaW50IGlyaWFzX2RlbGV0ZV9hdHRyaWIoc3RydWN0IGlhc19vYmplY3QgKm9iaiwgc3RydWN0IGlhc19hdHRyaWIgKmF0dHJpYiwKKwkJCWludCBjbGVhbm9iamVjdCkKK3sKKwlzdHJ1Y3QgaWFzX2F0dHJpYiAqbm9kZTsKKworCUlSREFfQVNTRVJUKG9iaiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKGF0dHJpYiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCS8qIFJlbW92ZSBhdHRyaWJ1dGUgZnJvbSBvYmplY3QgKi8KKwlub2RlID0gaGFzaGJpbl9yZW1vdmVfdGhpcyhvYmotPmF0dHJpYnMsIChpcmRhX3F1ZXVlX3QgKikgYXR0cmliKTsKKwlpZiAoIW5vZGUpCisJCXJldHVybiAwOyAvKiBBbHJlYWR5IHJlbW92ZWQgb3Igbm9uLWV4aXN0ZW50ICovCisKKwkvKiBEZWFsbG9jYXRlIGF0dHJpYnV0ZSAqLworCV9faXJpYXNfZGVsZXRlX2F0dHJpYihub2RlKTsKKworCS8qIENoZWNrIGlmIG9iamVjdCBoYXMgc3RpbGwgc29tZSBhdHRyaWJ1dGVzLCBkZXN0cm95IGl0IGlmIG5vbmUuCisJICogQXQgZmlyc3QgZ2xhbmNlLCB0aGlzIGxvb2sgZGFuZ2Vyb3VzLCBhcyB0aGUga2VybmVsIHJlZmVyZW5jZQorCSAqIHZhcmlvdXMgSUFTIG9iamVjdHMuIEhvd2V2ZXIsIHdlIG9ubHkgdXNlIHRoaXMgZnVuY3Rpb24gb24KKwkgKiB1c2VyIGF0dHJpYnV0ZXMsIG5vdCBrZXJuZWwgYXR0cmlidXRlcywgc28gdGhlcmUgaXMgbm8gcmlzaworCSAqIG9mIGRlbGV0aW5nIGEga2VybmVsIG9iamVjdCB0aGlzIHdheS4gSmVhbiBJSSAqLworCW5vZGUgPSAoc3RydWN0IGlhc19hdHRyaWIgKikgaGFzaGJpbl9nZXRfZmlyc3Qob2JqLT5hdHRyaWJzKTsKKwlpZiAoY2xlYW5vYmplY3QgJiYgIW5vZGUpCisJCWlyaWFzX2RlbGV0ZV9vYmplY3Qob2JqKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJpYXNfaW5zZXJ0X29iamVjdCAob2JqKQorICoKKyAqICAgIEluc2VydCBhbiBvYmplY3QgaW50byB0aGUgTE0tSUFTIGRhdGFiYXNlCisgKgorICovCit2b2lkIGlyaWFzX2luc2VydF9vYmplY3Qoc3RydWN0IGlhc19vYmplY3QgKm9iaikKK3sKKwlJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm47KTsKKworCWhhc2hiaW5faW5zZXJ0KGlyaWFzX29iamVjdHMsIChpcmRhX3F1ZXVlX3QgKikgb2JqLCAwLCBvYmotPm5hbWUpOworfQorRVhQT1JUX1NZTUJPTChpcmlhc19pbnNlcnRfb2JqZWN0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFzX2ZpbmRfb2JqZWN0IChuYW1lKQorICoKKyAqICAgIEZpbmQgb2JqZWN0IHdpdGggZ2l2ZW4gbmFtZQorICoKKyAqLworc3RydWN0IGlhc19vYmplY3QgKmlyaWFzX2ZpbmRfb2JqZWN0KGNoYXIgKm5hbWUpCit7CisJSVJEQV9BU1NFUlQobmFtZSAhPSBOVUxMLCByZXR1cm4gTlVMTDspOworCisJLyogVW5zYWZlIChsb2NraW5nKSwgb2JqZWN0IG1pZ2h0IGNoYW5nZSAqLworCXJldHVybiBoYXNoYmluX2xvY2tfZmluZChpcmlhc19vYmplY3RzLCAwLCBuYW1lKTsKK30KK0VYUE9SVF9TWU1CT0woaXJpYXNfZmluZF9vYmplY3QpOworCisvKgorICogRnVuY3Rpb24gaXJpYXNfZmluZF9hdHRyaWIgKG9iaiwgbmFtZSkKKyAqCisgKiAgICBGaW5kIG5hbWVkIGF0dHJpYnV0ZSBpbiBvYmplY3QKKyAqCisgKi8KK3N0cnVjdCBpYXNfYXR0cmliICppcmlhc19maW5kX2F0dHJpYihzdHJ1Y3QgaWFzX29iamVjdCAqb2JqLCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBpYXNfYXR0cmliICphdHRyaWI7CisKKwlJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKKwlJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybiBOVUxMOyk7CisJSVJEQV9BU1NFUlQobmFtZSAhPSBOVUxMLCByZXR1cm4gTlVMTDspOworCisJYXR0cmliID0gaGFzaGJpbl9sb2NrX2ZpbmQob2JqLT5hdHRyaWJzLCAwLCBuYW1lKTsKKwlpZiAoYXR0cmliID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJLyogVW5zYWZlIChsb2NraW5nKSwgYXR0cmliIG1pZ2h0IGNoYW5nZSAqLworCXJldHVybiBhdHRyaWI7Cit9CitFWFBPUlRfU1lNQk9MKGlyaWFzX2ZpbmRfYXR0cmliKTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFzX2FkZF9hdHRyaWJ1dGUgKG9iaiwgYXR0cmliKQorICoKKyAqICAgIEFkZCBhdHRyaWJ1dGUgdG8gb2JqZWN0CisgKgorICovCitzdGF0aWMgdm9pZCBpcmlhc19hZGRfYXR0cmliKHN0cnVjdCBpYXNfb2JqZWN0ICpvYmosIHN0cnVjdCBpYXNfYXR0cmliICphdHRyaWIsCisJCQkgICAgIGludCBvd25lcikKK3sKKwlJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm47KTsKKworCUlSREFfQVNTRVJUKGF0dHJpYiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChhdHRyaWItPm1hZ2ljID09IElBU19BVFRSSUJfTUFHSUMsIHJldHVybjspOworCisJLyogU2V0IGlmIGF0dHJpYiBpcyBvd25lZCBieSBrZXJuZWwgb3IgdXNlciBzcGFjZSAqLworCWF0dHJpYi0+dmFsdWUtPm93bmVyID0gb3duZXI7CisKKwloYXNoYmluX2luc2VydChvYmotPmF0dHJpYnMsIChpcmRhX3F1ZXVlX3QgKikgYXR0cmliLCAwLCBhdHRyaWItPm5hbWUpOworfQorCisvKgorICogRnVuY3Rpb24gaXJpYXNfb2JqZWN0X2NoYW5nZV9hdHRyaWJ1dGUgKG9ial9uYW1lLCBhdHRyaWJfbmFtZSwgbmV3X3ZhbHVlKQorICoKKyAqICAgIENoYW5nZSB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0cyBhdHRyaWJ1dGUuCisgKgorICovCitpbnQgaXJpYXNfb2JqZWN0X2NoYW5nZV9hdHRyaWJ1dGUoY2hhciAqb2JqX25hbWUsIGNoYXIgKmF0dHJpYl9uYW1lLAorCQkJCSAgc3RydWN0IGlhc192YWx1ZSAqbmV3X3ZhbHVlKQoreworCXN0cnVjdCBpYXNfb2JqZWN0ICpvYmo7CisJc3RydWN0IGlhc19hdHRyaWIgKmF0dHJpYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogRmluZCBvYmplY3QgKi8KKwlvYmogPSBoYXNoYmluX2xvY2tfZmluZChpcmlhc19vYmplY3RzLCAwLCBvYmpfbmFtZSk7CisJaWYgKG9iaiA9PSBOVUxMKSB7CisJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBmaW5kIG9iamVjdDogJXNcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgb2JqX25hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogU2xpZ2h0bHkgdW5zYWZlIChvYmogbWlnaHQgZ2V0IHJlbW92ZWQgdW5kZXIgdXMpICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9iai0+YXR0cmlicy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKworCS8qIEZpbmQgYXR0cmlidXRlICovCisJYXR0cmliID0gaGFzaGJpbl9maW5kKG9iai0+YXR0cmlicywgMCwgYXR0cmliX25hbWUpOworCWlmIChhdHRyaWIgPT0gTlVMTCkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8gZmluZCBhdHRyaWJ1dGU6ICVzXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18sIGF0dHJpYl9uYW1lKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2JqLT5hdHRyaWJzLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCBhdHRyaWItPnZhbHVlLT50eXBlICE9IG5ld192YWx1ZS0+dHlwZSkgeworCQlJUkRBX0RFQlVHKCAwLCAiJXMoKSwgY2hhbmdpbmcgdmFsdWUgdHlwZSBub3QgYWxsb3dlZCFcbiIsCisJCQkgICAgX19GVU5DVElPTl9fKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2JqLT5hdHRyaWJzLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogRGVsZXRlIG9sZCB2YWx1ZSAqLworCWlyaWFzX2RlbGV0ZV92YWx1ZShhdHRyaWItPnZhbHVlKTsKKworCS8qIEluc2VydCBuZXcgdmFsdWUgKi8KKwlhdHRyaWItPnZhbHVlID0gbmV3X3ZhbHVlOworCisJLyogU3VjY2VzcyAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9iai0+YXR0cmlicy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaXJpYXNfb2JqZWN0X2NoYW5nZV9hdHRyaWJ1dGUpOworCisvKgorICogRnVuY3Rpb24gaXJpYXNfb2JqZWN0X2FkZF9pbnRlZ2VyX2F0dHJpYiAob2JqLCBuYW1lLCB2YWx1ZSkKKyAqCisgKiAgICBBZGQgYW4gaW50ZWdlciBhdHRyaWJ1dGUgdG8gYW4gTE0tSUFTIG9iamVjdAorICoKKyAqLwordm9pZCBpcmlhc19hZGRfaW50ZWdlcl9hdHRyaWIoc3RydWN0IGlhc19vYmplY3QgKm9iaiwgY2hhciAqbmFtZSwgaW50IHZhbHVlLAorCQkJICAgICAgaW50IG93bmVyKQoreworCXN0cnVjdCBpYXNfYXR0cmliICphdHRyaWI7CisKKwlJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChuYW1lICE9IE5VTEwsIHJldHVybjspOworCisJYXR0cmliID0gKHN0cnVjdCBpYXNfYXR0cmliICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpYXNfYXR0cmliKSwKKwkJCQkJICAgICAgIEdGUF9BVE9NSUMpOworCWlmIChhdHRyaWIgPT0gTlVMTCkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgYXR0cmlidXRlIVxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKwltZW1zZXQoYXR0cmliLCAwLCBzaXplb2YoIHN0cnVjdCBpYXNfYXR0cmliKSk7CisKKwlhdHRyaWItPm1hZ2ljID0gSUFTX0FUVFJJQl9NQUdJQzsKKwlhdHRyaWItPm5hbWUgPSBzdHJuZHVwKG5hbWUsIElBU19NQVhfQVRUUklCTkFNRSk7CisKKwkvKiBJbnNlcnQgdmFsdWUgKi8KKwlhdHRyaWItPnZhbHVlID0gaXJpYXNfbmV3X2ludGVnZXJfdmFsdWUodmFsdWUpOworCisJaXJpYXNfYWRkX2F0dHJpYihvYmosIGF0dHJpYiwgb3duZXIpOworfQorRVhQT1JUX1NZTUJPTChpcmlhc19hZGRfaW50ZWdlcl9hdHRyaWIpOworCisgLyoKKyAqIEZ1bmN0aW9uIGlyaWFzX2FkZF9vY3RzZXFfYXR0cmliIChvYmosIG5hbWUsIG9jdGV0X3NlcSwgbGVuKQorICoKKyAqICAgIEFkZCBhIG9jdGV0IHNlcXVlbmNlIGF0dHJpYnV0ZSB0byBhbiBMTS1JQVMgb2JqZWN0CisgKgorICovCisKK3ZvaWQgaXJpYXNfYWRkX29jdHNlcV9hdHRyaWIoc3RydWN0IGlhc19vYmplY3QgKm9iaiwgY2hhciAqbmFtZSwgX191OCAqb2N0ZXRzLAorCQkJICAgICBpbnQgbGVuLCBpbnQgb3duZXIpCit7CisJc3RydWN0IGlhc19hdHRyaWIgKmF0dHJpYjsKKworCUlSREFfQVNTRVJUKG9iaiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybjspOworCisJSVJEQV9BU1NFUlQobmFtZSAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChvY3RldHMgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlhdHRyaWIgPSAoc3RydWN0IGlhc19hdHRyaWIgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGlhc19hdHRyaWIpLAorCQkJCQkgICAgICAgR0ZQX0FUT01JQyk7CisJaWYgKGF0dHJpYiA9PSBOVUxMKSB7CisJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBhdHRyaWJ1dGUhXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCW1lbXNldChhdHRyaWIsIDAsIHNpemVvZiggc3RydWN0IGlhc19hdHRyaWIpKTsKKworCWF0dHJpYi0+bWFnaWMgPSBJQVNfQVRUUklCX01BR0lDOworCWF0dHJpYi0+bmFtZSA9IHN0cm5kdXAobmFtZSwgSUFTX01BWF9BVFRSSUJOQU1FKTsKKworCWF0dHJpYi0+dmFsdWUgPSBpcmlhc19uZXdfb2N0c2VxX3ZhbHVlKCBvY3RldHMsIGxlbik7CisKKwlpcmlhc19hZGRfYXR0cmliKG9iaiwgYXR0cmliLCBvd25lcik7Cit9CitFWFBPUlRfU1lNQk9MKGlyaWFzX2FkZF9vY3RzZXFfYXR0cmliKTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFzX29iamVjdF9hZGRfc3RyaW5nX2F0dHJpYiAob2JqLCBzdHJpbmcpCisgKgorICogICAgQWRkIGEgc3RyaW5nIGF0dHJpYnV0ZSB0byBhbiBMTS1JQVMgb2JqZWN0CisgKgorICovCit2b2lkIGlyaWFzX2FkZF9zdHJpbmdfYXR0cmliKHN0cnVjdCBpYXNfb2JqZWN0ICpvYmosIGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlLAorCQkJICAgICBpbnQgb3duZXIpCit7CisJc3RydWN0IGlhc19hdHRyaWIgKmF0dHJpYjsKKworCUlSREFfQVNTRVJUKG9iaiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybjspOworCisJSVJEQV9BU1NFUlQobmFtZSAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVCh2YWx1ZSAhPSBOVUxMLCByZXR1cm47KTsKKworCWF0dHJpYiA9IChzdHJ1Y3QgaWFzX2F0dHJpYiAqKSBrbWFsbG9jKHNpemVvZiggc3RydWN0IGlhc19hdHRyaWIpLAorCQkJCQkgICAgICAgR0ZQX0FUT01JQyk7CisJaWYgKGF0dHJpYiA9PSBOVUxMKSB7CisJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBhdHRyaWJ1dGUhXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCW1lbXNldChhdHRyaWIsIDAsIHNpemVvZiggc3RydWN0IGlhc19hdHRyaWIpKTsKKworCWF0dHJpYi0+bWFnaWMgPSBJQVNfQVRUUklCX01BR0lDOworCWF0dHJpYi0+bmFtZSA9IHN0cm5kdXAobmFtZSwgSUFTX01BWF9BVFRSSUJOQU1FKTsKKworCWF0dHJpYi0+dmFsdWUgPSBpcmlhc19uZXdfc3RyaW5nX3ZhbHVlKHZhbHVlKTsKKworCWlyaWFzX2FkZF9hdHRyaWIob2JqLCBhdHRyaWIsIG93bmVyKTsKK30KK0VYUE9SVF9TWU1CT0woaXJpYXNfYWRkX3N0cmluZ19hdHRyaWIpOworCisvKgorICogRnVuY3Rpb24gaXJpYXNfbmV3X2ludGVnZXJfdmFsdWUgKGludGVnZXIpCisgKgorICogICAgQ3JlYXRlIG5ldyBJQVMgaW50ZWdlciB2YWx1ZQorICoKKyAqLworc3RydWN0IGlhc192YWx1ZSAqaXJpYXNfbmV3X2ludGVnZXJfdmFsdWUoaW50IGludGVnZXIpCit7CisJc3RydWN0IGlhc192YWx1ZSAqdmFsdWU7CisKKwl2YWx1ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpYXNfdmFsdWUpLCBHRlBfQVRPTUlDKTsKKwlpZiAodmFsdWUgPT0gTlVMTCkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8ga21hbGxvYyFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQodmFsdWUsIDAsIHNpemVvZihzdHJ1Y3QgaWFzX3ZhbHVlKSk7CisKKwl2YWx1ZS0+dHlwZSA9IElBU19JTlRFR0VSOworCXZhbHVlLT5sZW4gPSA0OworCXZhbHVlLT50LmludGVnZXIgPSBpbnRlZ2VyOworCisJcmV0dXJuIHZhbHVlOworfQorRVhQT1JUX1NZTUJPTChpcmlhc19uZXdfaW50ZWdlcl92YWx1ZSk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmlhc19uZXdfc3RyaW5nX3ZhbHVlIChzdHJpbmcpCisgKgorICogICAgQ3JlYXRlIG5ldyBJQVMgc3RyaW5nIHZhbHVlCisgKgorICogUGVyIElyTE1QIDEuMSwgNC4zLjMuMiwgc3RyaW5ncyBhcmUgdXAgdG8gMjU2IGNoYXJzIC0gSmVhbiBJSQorICovCitzdHJ1Y3QgaWFzX3ZhbHVlICppcmlhc19uZXdfc3RyaW5nX3ZhbHVlKGNoYXIgKnN0cmluZykKK3sKKwlzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZTsKKworCXZhbHVlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlhc192YWx1ZSksIEdGUF9BVE9NSUMpOworCWlmICh2YWx1ZSA9PSBOVUxMKSB7CisJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldCggdmFsdWUsIDAsIHNpemVvZiggc3RydWN0IGlhc192YWx1ZSkpOworCisJdmFsdWUtPnR5cGUgPSBJQVNfU1RSSU5HOworCXZhbHVlLT5jaGFyc2V0ID0gQ1NfQVNDSUk7CisJdmFsdWUtPnQuc3RyaW5nID0gc3RybmR1cChzdHJpbmcsIElBU19NQVhfU1RSSU5HKTsKKwl2YWx1ZS0+bGVuID0gc3RybGVuKHZhbHVlLT50LnN0cmluZyk7CisKKwlyZXR1cm4gdmFsdWU7Cit9CitFWFBPUlRfU1lNQk9MKGlyaWFzX25ld19zdHJpbmdfdmFsdWUpOworCisvKgorICogRnVuY3Rpb24gaXJpYXNfbmV3X29jdHNlcV92YWx1ZSAob2N0ZXRzLCBsZW4pCisgKgorICogICAgQ3JlYXRlIG5ldyBJQVMgb2N0ZXQtc2VxdWVuY2UgdmFsdWUKKyAqCisgKiBQZXIgSXJMTVAgMS4xLCA0LjMuMy4yLCBvY3RldC1zZXF1ZW5jZSBhcmUgdXAgdG8gMTAyNCBieXRlcyAtIEplYW4gSUkKKyAqLworc3RydWN0IGlhc192YWx1ZSAqaXJpYXNfbmV3X29jdHNlcV92YWx1ZShfX3U4ICpvY3RzZXEgLCBpbnQgbGVuKQoreworCXN0cnVjdCBpYXNfdmFsdWUgKnZhbHVlOworCisJdmFsdWUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWFzX3ZhbHVlKSwgR0ZQX0FUT01JQyk7CisJaWYgKHZhbHVlID09IE5VTEwpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGttYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KHZhbHVlLCAwLCBzaXplb2Yoc3RydWN0IGlhc192YWx1ZSkpOworCisJdmFsdWUtPnR5cGUgPSBJQVNfT0NUX1NFUTsKKwkvKiBDaGVjayBsZW5ndGggKi8KKwlpZihsZW4gPiBJQVNfTUFYX09DVEVUX1NUUklORykKKwkJbGVuID0gSUFTX01BWF9PQ1RFVF9TVFJJTkc7CisJdmFsdWUtPmxlbiA9IGxlbjsKKworCXZhbHVlLT50Lm9jdF9zZXEgPSBrbWFsbG9jKGxlbiwgR0ZQX0FUT01JQyk7CisJaWYgKHZhbHVlLT50Lm9jdF9zZXEgPT0gTlVMTCl7CisJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJa2ZyZWUodmFsdWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtY3B5KHZhbHVlLT50Lm9jdF9zZXEsIG9jdHNlcSAsIGxlbik7CisJcmV0dXJuIHZhbHVlOworfQorRVhQT1JUX1NZTUJPTChpcmlhc19uZXdfb2N0c2VxX3ZhbHVlKTsKKworc3RydWN0IGlhc192YWx1ZSAqaXJpYXNfbmV3X21pc3NpbmdfdmFsdWUodm9pZCkKK3sKKwlzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZTsKKworCXZhbHVlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlhc192YWx1ZSksIEdGUF9BVE9NSUMpOworCWlmICh2YWx1ZSA9PSBOVUxMKSB7CisJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldCh2YWx1ZSwgMCwgc2l6ZW9mKHN0cnVjdCBpYXNfdmFsdWUpKTsKKworCXZhbHVlLT50eXBlID0gSUFTX01JU1NJTkc7CisJdmFsdWUtPmxlbiA9IDA7CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmlhc19kZWxldGVfdmFsdWUgKHZhbHVlKQorICoKKyAqICAgIERlbGV0ZSBJQVMgdmFsdWUKKyAqCisgKi8KK3ZvaWQgaXJpYXNfZGVsZXRlX3ZhbHVlKHN0cnVjdCBpYXNfdmFsdWUgKnZhbHVlKQoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVCh2YWx1ZSAhPSBOVUxMLCByZXR1cm47KTsKKworCXN3aXRjaCAodmFsdWUtPnR5cGUpIHsKKwljYXNlIElBU19JTlRFR0VSOiAvKiBGYWxsdGhyb3VnaCAqLworCWNhc2UgSUFTX01JU1NJTkc6CisJCS8qIE5vIG5lZWQgdG8gZGVhbGxvY2F0ZSAqLworCQlicmVhazsKKwljYXNlIElBU19TVFJJTkc6CisJCS8qIElmIHN0cmluZywgZGVhbGxvY2F0ZSBzdHJpbmcgKi8KKwkJaWYgKHZhbHVlLT50LnN0cmluZyAhPSBOVUxMKQorCQkJa2ZyZWUodmFsdWUtPnQuc3RyaW5nKTsKKwkJYnJlYWs7CisJY2FzZSBJQVNfT0NUX1NFUToKKwkJLyogSWYgYnl0ZSBzdHJlYW0sIGRlYWxsb2NhdGUgYnl0ZSBzdHJlYW0gKi8KKwkJIGlmICh2YWx1ZS0+dC5vY3Rfc2VxICE9IE5VTEwpCisJCQkga2ZyZWUodmFsdWUtPnQub2N0X3NlcSk7CisJCSBicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVbmtub3duIHZhbHVlIHR5cGUhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlicmVhazsKKwl9CisJa2ZyZWUodmFsdWUpOworfQorRVhQT1JUX1NZTUJPTChpcmlhc19kZWxldGVfdmFsdWUpOwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsYW4vS2NvbmZpZyBiL25ldC9pcmRhL2lybGFuL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUxYWJjMgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lybGFuL0tjb25maWcKQEAgLTAsMCArMSwxNCBAQAorY29uZmlnIElSTEFOCisJdHJpc3RhdGUgIklyTEFOIHByb3RvY29sIgorCWRlcGVuZHMgb24gSVJEQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIElyTEFOIHByb3RvY29sLgorCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgaXJsYW4uICBJckxBTiBlbXVsYXRlcyBhbiBFdGhlcm5ldCBhbmQgbWFrZXMgaXQgcG9zc2libGUgdG8gcHV0IHVwCisJICBhIHdpcmVsZXNzIExBTiB1c2luZyBpbmZyYXJlZCBiZWFtcy4KKworCSAgVGhlIElyTEFOIHByb3RvY29sIGNhbiBiZSB1c2VkIHRvIHRhbGsgd2l0aCBpbmZyYXJlZCBhY2Nlc3MgcG9pbnRzCisJICBsaWtlIHRoZSBIUCBOZXRiZWFtSVIsIG9yIHRoZSBFU0kgSmV0RXllIE5FVC4gIFlvdSBjYW4gYWxzbyBjb25uZWN0CisJICB0byBhbm90aGVyIExpbnV4IG1hY2hpbmUgcnVubmluZyB0aGUgSXJMQU4gcHJvdG9jb2wgZm9yIGFkLWhvYworCSAgbmV0d29ya2luZyEKKwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsYW4vTWFrZWZpbGUgYi9uZXQvaXJkYS9pcmxhbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzU0OWJjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJsYW4vTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggSXJEQSBJckxBTiBwcm90b2NvbCBsYXllci4KKyMKKworb2JqLSQoQ09ORklHX0lSTEFOKSArPSBpcmxhbi5vCisKK2lybGFuLW9ianMgOj0gaXJsYW5fY29tbW9uLm8gaXJsYW5fZXRoLm8gaXJsYW5fZXZlbnQubyBpcmxhbl9jbGllbnQubyBpcmxhbl9wcm92aWRlci5vIGlybGFuX2ZpbHRlci5vIGlybGFuX3Byb3ZpZGVyX2V2ZW50Lm8gaXJsYW5fY2xpZW50X2V2ZW50Lm8KZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lybGFuL2lybGFuX2NsaWVudC5jIGIvbmV0L2lyZGEvaXJsYW4vaXJsYW5fY2xpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhlNmNiMAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lybGFuL2lybGFuX2NsaWVudC5jCkBAIC0wLDAgKzEsNTc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGlybGFuX2NsaWVudC5jCisgKiBWZXJzaW9uOiAgICAgICAwLjkKKyAqIERlc2NyaXB0aW9uOiAgIElyREEgTEFOIEFjY2VzcyBQcm90b2NvbCAoSXJMQU4pIENsaWVudAorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgU3VuIEF1ZyAzMSAyMDoxNDozNyAxOTk3CisgKiBNb2RpZmllZCBhdDogICBUdWUgRGVjIDE0IDE1OjQ3OjAyIDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIFNvdXJjZXM6ICAgICAgIHNrZWxldG9uLmMgYnkgRG9uYWxkIEJlY2tlciA8YmVja2VyQENFU0RJUy5nc2ZjLm5hc2EuZ292PgorICogICAgICAgICAgICAgICAgc2xpcC5jIGJ5IExhdXJlbmNlIEN1bGhhbmUsIDxsb3pAaG9sbWVzLmRlbW9uLmNvLnVrPgorICogICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1d2FsdC5ubC5tdWduZXQub3JnPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwgCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcnR0cC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXNfb2JqZWN0Lmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS90aW1lci5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fY29tbW9uLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fZXZlbnQuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9ldGguaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9wcm92aWRlci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NsaWVudC5oPgorCisjdW5kZWYgQ09ORklHX0lSTEFOX0dSQVRVSVRPVVNfQVJQCisKK3N0YXRpYyB2b2lkIGlybGFuX2NsaWVudF9jdHJsX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCAKKwkJCQkJCSAgICBMTV9SRUFTT04gcmVhc29uLCAKKwkJCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqKTsKK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X2N0cmxfZGF0YV9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIAorCQkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgaXJsYW5fY2xpZW50X2N0cmxfY29ubmVjdF9jb25maXJtKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIAorCQkJCQkgICAgICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywgCisJCQkJCSAgICAgIF9fdTMyIG1heF9zZHVfc2l6ZSwKKwkJCQkJICAgICAgX191OCBtYXhfaGVhZGVyX3NpemUsCisJCQkJCSAgICAgIHN0cnVjdCBza19idWZmICopOworc3RhdGljIHZvaWQgaXJsYW5fY2hlY2tfcmVzcG9uc2VfcGFyYW0oc3RydWN0IGlybGFuX2NiICpzZWxmLCBjaGFyICpwYXJhbSwgCisJCQkJICAgICAgIGNoYXIgKnZhbHVlLCBpbnQgdmFsX2xlbik7CitzdGF0aWMgdm9pZCBpcmxhbl9jbGllbnRfb3Blbl9jdHJsX3RzYXAoc3RydWN0IGlybGFuX2NiICpzZWxmKTsKKworc3RhdGljIHZvaWQgaXJsYW5fY2xpZW50X2tpY2tfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBpcmxhbl9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJsYW5fY2IgKikgZGF0YTsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOworCQorCS8qICAKKwkgKiBJZiB3ZSBhcmUgaW4gcGVlciBtb2RlLCB0aGUgY2xpZW50IG1heSBub3QgaGF2ZSBnb3QgdGhlIGRpc2NvdmVyeQorCSAqIGluZGljYXRpb24gaXQgbmVlZHMgdG8gbWFrZSBwcm9ncmVzcy4gSWYgdGhlIGNsaWVudCBpcyBzdGlsbCBpbiAKKwkgKiBJRExFIHN0YXRlLCB3ZSBtdXN0IGtpY2sgaXQgdG8sIGJ1dCBvbmx5IGlmIHRoZSBwcm92aWRlciBpcyBub3QgSURMRQorIAkgKi8KKwlpZiAoKHNlbGYtPnByb3ZpZGVyLmFjY2Vzc190eXBlID09IEFDQ0VTU19QRUVSKSAmJiAKKwkgICAgKHNlbGYtPmNsaWVudC5zdGF0ZSA9PSBJUkxBTl9JRExFKSAmJgorCSAgICAoc2VsZi0+cHJvdmlkZXIuc3RhdGUgIT0gSVJMQU5fSURMRSkpIHsKKwkJaXJsYW5fY2xpZW50X3dha2V1cChzZWxmLCBzZWxmLT5zYWRkciwgc2VsZi0+ZGFkZHIpOworCX0KK30KKworc3RhdGljIHZvaWQgaXJsYW5fY2xpZW50X3N0YXJ0X2tpY2tfdGltZXIoc3RydWN0IGlybGFuX2NiICpzZWxmLCBpbnQgdGltZW91dCkKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwlpcmRhX3N0YXJ0X3RpbWVyKCZzZWxmLT5jbGllbnQua2lja190aW1lciwgdGltZW91dCwgKHZvaWQgKikgc2VsZiwgCisJCQkgaXJsYW5fY2xpZW50X2tpY2tfdGltZXJfZXhwaXJlZCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfd2FrZXVwIChzZWxmLCBzYWRkciwgZGFkZHIpCisgKgorICogICAgV2FrZSB1cCBjbGllbnQKKyAqCisgKi8KK3ZvaWQgaXJsYW5fY2xpZW50X3dha2V1cChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIF9fdTMyIHNhZGRyLCBfX3UzMiBkYWRkcikKK3sKKwlJUkRBX0RFQlVHKDEsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOworCisJLyogCisJICogQ2hlY2sgaWYgd2UgYXJlIGFscmVhZHkgYXdha2UsIG9yIGlmIHdlIGFyZSBhIHByb3ZpZGVyIGluIGRpcmVjdAorCSAqIG1vZGUgKGluIHRoYXQgY2FzZSB3ZSBtdXN0IGxlYXZlIHRoZSBjbGllbnQgaWRsZQorCSAqLworCWlmICgoc2VsZi0+Y2xpZW50LnN0YXRlICE9IElSTEFOX0lETEUpIHx8IAorCSAgICAoc2VsZi0+cHJvdmlkZXIuYWNjZXNzX3R5cGUgPT0gQUNDRVNTX0RJUkVDVCkpCisJeworCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgYWxyZWFkeSBhd2FrZSFcbiIsIF9fRlVOQ1RJT05fXyApOworCQkJcmV0dXJuOworCX0KKworCS8qIEFkZHJlc3NlcyBtYXkgaGF2ZSBjaGFuZ2VkISAqLworCXNlbGYtPnNhZGRyID0gc2FkZHI7CisJc2VsZi0+ZGFkZHIgPSBkYWRkcjsKKworCWlmIChzZWxmLT5kaXNjb25uZWN0X3JlYXNvbiA9PSBMTV9VU0VSX1JFUVVFU1QpIHsKKwkJCUlSREFfREVCVUcoMCwgIiVzKCksIHN0aWxsIHN0b3BwZWQgYnkgdXNlclxuIiwgX19GVU5DVElPTl9fICk7CisJCQlyZXR1cm47CisJfQorCisJLyogT3BlbiBUU0FQcyAqLworCWlybGFuX2NsaWVudF9vcGVuX2N0cmxfdHNhcChzZWxmKTsKKwlpcmxhbl9vcGVuX2RhdGFfdHNhcChzZWxmKTsKKworCWlybGFuX2RvX2NsaWVudF9ldmVudChzZWxmLCBJUkxBTl9ESVNDT1ZFUllfSU5ESUNBVElPTiwgTlVMTCk7CisJCisJLyogU3RhcnQga2ljayB0aW1lciAqLworCWlybGFuX2NsaWVudF9zdGFydF9raWNrX3RpbWVyKHNlbGYsIDIqSFopOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fZGlzY292ZXJ5X2luZGljYXRpb24gKGRhZGRyKQorICoKKyAqICAgIFJlbW90ZSBkZXZpY2Ugd2l0aCBJckxBTiBzZXJ2ZXIgc3VwcG9ydCBkaXNjb3ZlcmVkCisgKgorICovCit2b2lkIGlybGFuX2NsaWVudF9kaXNjb3ZlcnlfaW5kaWNhdGlvbihkaXNjaW5mb190ICpkaXNjb3ZlcnksCisJCQkJICAgICAgIERJU0NPVkVSWV9NT0RFIG1vZGUsCisJCQkJICAgICAgIHZvaWQgKnByaXYpIAoreworCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKKwlfX3UzMiBzYWRkciwgZGFkZHI7CisJCisJSVJEQV9ERUJVRygxLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChkaXNjb3ZlcnkgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwkvKgorCSAqIEkgZGlkbid0IGNoZWNrIGl0LCBidXQgSSBiZXQgdGhhdCBJckxBTiBzdWZmZXIgZnJvbSB0aGUgc2FtZQorCSAqIGRlZmljaWVuY3kgYXMgSXJDb21tIGFuZCBkb2Vzbid0IGhhbmRsZSB0d28gaW5zdGFuY2VzCisJICogc2ltdWx0YW5lb3VzbHkgY29ubmVjdGluZyB0byBlYWNoIG90aGVyLgorCSAqIFNhbWUgd29ya2Fyb3VuZCwgZHJvcCBwYXNzaXZlIGRpc2NvdmVyaWVzLgorCSAqIEplYW4gSUkgKi8KKwlpZihtb2RlID09IERJU0NPVkVSWV9QQVNTSVZFKQorCQlyZXR1cm47CisKKwlzYWRkciA9IGRpc2NvdmVyeS0+c2FkZHI7CisJZGFkZHIgPSBkaXNjb3ZlcnktPmRhZGRyOworCisJLyogRmluZCBpbnN0YW5jZSAqLworCXJjdV9yZWFkX2xvY2soKTsKKwlzZWxmID0gaXJsYW5fZ2V0X2FueSgpOworCWlmIChzZWxmKSB7CisJCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKKworCQlJUkRBX0RFQlVHKDEsICIlcygpLCBGb3VuZCBpbnN0YW5jZSAoJTA4eCkhXG4iLCBfX0ZVTkNUSU9OX18gLAorCQkgICAgICBkYWRkcik7CisJCQorCQlpcmxhbl9jbGllbnRfd2FrZXVwKHNlbGYsIHNhZGRyLCBkYWRkcik7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworfQorCQorLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2NsaWVudF9kYXRhX2luZGljYXRpb24gKGhhbmRsZSwgc2tiKQorICoKKyAqICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgZGF0YSB0aGF0IGlzIHJlY2VpdmVkIG9uIHRoZSBjb250cm9sIGNoYW5uZWwKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X2N0cmxfZGF0YV9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIAorCQkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlybGFuX2NiICpzZWxmOworCQorCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCQorCXNlbGYgPSAoc3RydWN0IGlybGFuX2NiICopIGluc3RhbmNlOworCQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwkKKwlpcmxhbl9kb19jbGllbnRfZXZlbnQoc2VsZiwgSVJMQU5fREFUQV9JTkRJQ0FUSU9OLCBza2IpOyAKKworCS8qIFJlYWR5IGZvciBhIG5ldyBjb21tYW5kICovCQorCUlSREFfREVCVUcoMiwgIiVzKCksIGNsZWFyaW5nIHR4X2J1c3lcbiIsIF9fRlVOQ1RJT05fXyApOworCXNlbGYtPmNsaWVudC50eF9idXN5ID0gRkFMU0U7CisKKwkvKiBDaGVjayBpZiB3ZSBoYXZlIHNvbWUgcXVldWVkIGNvbW1hbmRzIHdhaXRpbmcgdG8gYmUgc2VudCAqLworCWlybGFuX3J1bl9jdHJsX3R4X3F1ZXVlKHNlbGYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlybGFuX2NsaWVudF9jdHJsX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCAKKwkJCQkJCSAgICBMTV9SRUFTT04gcmVhc29uLCAKKwkJCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqdXNlcmRhdGEpIAoreworCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKKwlzdHJ1Y3QgdHNhcF9jYiAqdHNhcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgcmVhc29uPSVkXG4iLCBfX0ZVTkNUSU9OX18gLCByZWFzb24pOworCQorCXNlbGYgPSAoc3RydWN0IGlybGFuX2NiICopIGluc3RhbmNlOworCXRzYXAgPSAoc3RydWN0IHRzYXBfY2IgKikgc2FwOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CQorCUlSREFfQVNTRVJUKHRzYXAgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQodHNhcC0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybjspOworCQorCUlSREFfQVNTRVJUKHRzYXAgPT0gc2VsZi0+Y2xpZW50LnRzYXBfY3RybCwgcmV0dXJuOyk7CisKKyAgICAgICAJLyogUmVtb3ZlIGZyYW1lcyBxdWV1ZWQgb24gdGhlIGNvbnRyb2wgY2hhbm5lbCAqLworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnNlbGYtPmNsaWVudC50eHEpKSAhPSBOVUxMKSB7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl9CisJc2VsZi0+Y2xpZW50LnR4X2J1c3kgPSBGQUxTRTsKKworCWlybGFuX2RvX2NsaWVudF9ldmVudChzZWxmLCBJUkxBTl9MTVBfRElTQ09OTkVDVCwgTlVMTCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfb3Blbl90c2FwcyAoc2VsZikKKyAqCisgKiAgICBJbml0aWFsaXplIGNhbGxiYWNrcyBhbmQgb3BlbiBJclRUUCBUU0FQcworICoKKyAqLworc3RhdGljIHZvaWQgaXJsYW5fY2xpZW50X29wZW5fY3RybF90c2FwKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikKK3sKKwlzdHJ1Y3QgdHNhcF9jYiAqdHNhcDsKKwlub3RpZnlfdCBub3RpZnk7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOworCisJLyogQ2hlY2sgaWYgYWxyZWFkeSBvcGVuICovCisJaWYgKHNlbGYtPmNsaWVudC50c2FwX2N0cmwpCisJCXJldHVybjsKKworCWlyZGFfbm90aWZ5X2luaXQoJm5vdGlmeSk7CisKKwkvKiBTZXQgdXAgY2FsbGJhY2tzICovCisJbm90aWZ5LmRhdGFfaW5kaWNhdGlvbiAgICAgICA9IGlybGFuX2NsaWVudF9jdHJsX2RhdGFfaW5kaWNhdGlvbjsKKwlub3RpZnkuY29ubmVjdF9jb25maXJtICAgICAgID0gaXJsYW5fY2xpZW50X2N0cmxfY29ubmVjdF9jb25maXJtOworCW5vdGlmeS5kaXNjb25uZWN0X2luZGljYXRpb24gPSBpcmxhbl9jbGllbnRfY3RybF9kaXNjb25uZWN0X2luZGljYXRpb247CisJbm90aWZ5Lmluc3RhbmNlID0gc2VsZjsKKwlzdHJsY3B5KG5vdGlmeS5uYW1lLCAiSXJMQU4gY3RybCAoYykiLCBzaXplb2Yobm90aWZ5Lm5hbWUpKTsKKwkKKwl0c2FwID0gaXJ0dHBfb3Blbl90c2FwKExTQVBfQU5ZLCBERUZBVUxUX0lOSVRJQUxfQ1JFRElULCAmbm90aWZ5KTsKKwlpZiAoIXRzYXApIHsKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgR290IG5vIHRzYXAhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuOworCX0KKwlzZWxmLT5jbGllbnQudHNhcF9jdHJsID0gdHNhcDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2NsaWVudF9jb25uZWN0X2NvbmZpcm0gKGhhbmRsZSwgc2tiKQorICoKKyAqICAgIENvbm5lY3Rpb24gdG8gcGVlciBJckxBTiBsYXllIGNvbmZpcm1lZAorICoKKyAqLworc3RhdGljIHZvaWQgaXJsYW5fY2xpZW50X2N0cmxfY29ubmVjdF9jb25maXJtKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIAorCQkJCQkgICAgICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywgCisJCQkJCSAgICAgIF9fdTMyIG1heF9zZHVfc2l6ZSwKKwkJCQkJICAgICAgX191OCBtYXhfaGVhZGVyX3NpemUsCisJCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpIAoreworCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJc2VsZiA9IChzdHJ1Y3QgaXJsYW5fY2IgKikgaW5zdGFuY2U7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKKworCXNlbGYtPmNsaWVudC5tYXhfc2R1X3NpemUgPSBtYXhfc2R1X3NpemU7CisJc2VsZi0+Y2xpZW50Lm1heF9oZWFkZXJfc2l6ZSA9IG1heF9oZWFkZXJfc2l6ZTsKKworCS8qIFRPRE86IHdlIGNvdWxkIHNldCB0aGUgTVRVIGRlcGVuZGluZyBvbiB0aGUgbWF4X3NkdV9zaXplICovCisKKwlpcmxhbl9kb19jbGllbnRfZXZlbnQoc2VsZiwgSVJMQU5fQ09OTkVDVF9DT01QTEVURSwgTlVMTCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBwcmludF9yZXRfY29kZSAoY29kZSkKKyAqCisgKiAgICBQcmludCByZXR1cm4gY29kZSBvZiByZXF1ZXN0IHRvIHBlZXIgSXJMQU4gbGF5ZXIuCisgKgorICovCitzdGF0aWMgdm9pZCBwcmludF9yZXRfY29kZShfX3U4IGNvZGUpIAoreworCXN3aXRjaChjb2RlKSB7CisJY2FzZSAwOgorCQlwcmludGsoS0VSTl9JTkZPICJTdWNjZXNzXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlJUkRBX1dBUk5JTkcoIklyTEFOOiBJbnN1ZmZpY2llbnQgcmVzb3VyY2VzXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlJUkRBX1dBUk5JTkcoIklyTEFOOiBJbnZhbGlkIGNvbW1hbmQgZm9ybWF0XG4iKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlJUkRBX1dBUk5JTkcoIklyTEFOOiBDb21tYW5kIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlicmVhazsKKwljYXNlIDQ6CisJCUlSREFfV0FSTklORygiSXJMQU46IFBhcmFtZXRlciBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlJUkRBX1dBUk5JTkcoIklyTEFOOiBWYWx1ZSBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlJUkRBX1dBUk5JTkcoIklyTEFOOiBOb3Qgb3BlblxuIik7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJSVJEQV9XQVJOSU5HKCJJckxBTjogQXV0aGVudGljYXRpb24gcmVxdWlyZWRcbiIpOworCQlicmVhazsKKwljYXNlIDg6CisJCUlSREFfV0FSTklORygiSXJMQU46IEludmFsaWQgcGFzc3dvcmRcbiIpOworCQlicmVhazsKKwljYXNlIDk6CisJCUlSREFfV0FSTklORygiSXJMQU46IFByb3RvY29sIGVycm9yXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAyNTU6CisJCUlSREFfV0FSTklORygiSXJMQU46IEFzeW5jaHJvbm91cyBzdGF0dXNcbiIpOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfcGFyc2VfcmVzcG9uc2UgKHNlbGYsIHNrYikKKyAqCisgKiAgICBFeHRyYWN0IGFsbCBwYXJhbWV0ZXJzIGZyb20gcmVjZWl2ZWQgYnVmZmVyLCB0aGVuIGZlZWQgdGhlbSB0byAKKyAqICAgIGNoZWNrX3BhcmFtcyBmb3IgcGFyc2luZworICovCit2b2lkIGlybGFuX2NsaWVudF9wYXJzZV9yZXNwb25zZShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJX191OCAqZnJhbWU7CisJX191OCAqcHRyOworCWludCBjb3VudDsKKwlpbnQgcmV0OworCV9fdTE2IHZhbF9sZW47CisJaW50IGk7CisgICAgICAgIGNoYXIgKm5hbWU7CisgICAgICAgIGNoYXIgKnZhbHVlOworCisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOwkKKwkKKwlJUkRBX0RFQlVHKDQsICIlcygpIHNrYi0+bGVuPSVkXG4iLCBfX0ZVTkNUSU9OX18gLCAoaW50KSBza2ItPmxlbik7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CisJCisJaWYgKCFza2IpIHsKKwkJSVJEQV9FUlJPUigiJXMoKSwgR290IE5VTEwgc2tiIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKwlmcmFtZSA9IHNrYi0+ZGF0YTsKKwkKKwkvKiAKKwkgKiAgQ2hlY2sgcmV0dXJuIGNvZGUgYW5kIHByaW50IGl0IGlmIG5vdCBzdWNjZXNzIAorCSAqLworCWlmIChmcmFtZVswXSkgeworCQlwcmludF9yZXRfY29kZShmcmFtZVswXSk7CisJCXJldHVybjsKKwl9CisJCisJbmFtZSA9IGttYWxsb2MoMjU1LCBHRlBfQVRPTUlDKTsKKwlpZiAoIW5hbWUpCisJCXJldHVybjsKKwl2YWx1ZSA9IGttYWxsb2MoMTAxNiwgR0ZQX0FUT01JQyk7CisJaWYgKCF2YWx1ZSkgeworCQlrZnJlZShuYW1lKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEhvdyBtYW55IHBhcmFtZXRlcnM/ICovCisJY291bnQgPSBmcmFtZVsxXTsKKworCUlSREFfREVCVUcoNCwgIiVzKCksIGdvdCAlZCBwYXJhbWV0ZXJzXG4iLCBfX0ZVTkNUSU9OX18gLCBjb3VudCk7CisJCisJcHRyID0gZnJhbWUrMjsKKworCS8qIEZvciBhbGwgcGFyYW1ldGVycyAqLworIAlmb3IgKGk9MDsgaTxjb3VudDtpKyspIHsKKwkJcmV0ID0gaXJsYW5fZXh0cmFjdF9wYXJhbShwdHIsIG5hbWUsIHZhbHVlLCAmdmFsX2xlbik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBJckxBTiwgRXJyb3IhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCWJyZWFrOworCQl9CisJCXB0ciArPSByZXQ7CisJCWlybGFuX2NoZWNrX3Jlc3BvbnNlX3BhcmFtKHNlbGYsIG5hbWUsIHZhbHVlLCB2YWxfbGVuKTsKKyAJfQorCS8qIENsZWFudXAgKi8KKwlrZnJlZShuYW1lKTsKKwlrZnJlZSh2YWx1ZSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9jaGVja19yZXNwb25zZV9wYXJhbSAoc2VsZiwgcGFyYW0sIHZhbHVlLCB2YWxfbGVuKQorICoKKyAqICAgICBDaGVjayB3aGljaCBwYXJhbWV0ZXIgaXMgcmVjZWl2ZWQgYW5kIHVwZGF0ZSBsb2NhbCB2YXJpYWJsZXMKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlybGFuX2NoZWNrX3Jlc3BvbnNlX3BhcmFtKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgY2hhciAqcGFyYW0sIAorCQkJCSAgICAgICBjaGFyICp2YWx1ZSwgaW50IHZhbF9sZW4pIAoreworCV9fdTE2IHRtcF9jcHU7IC8qIFRlbXBvcmFyeSB2YWx1ZSBpbiBob3N0IG9yZGVyICovCisJX191OCAqYnl0ZXM7CisJaW50IGk7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpLCBwYXJtPSVzXG4iLCBfX0ZVTkNUSU9OX18gLCBwYXJhbSk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKKworCS8qIE1lZGlhIHR5cGUgKi8KKwlpZiAoc3RyY21wKHBhcmFtLCAiTUVESUEiKSA9PSAwKSB7CisJCWlmIChzdHJjbXAodmFsdWUsICI4MDIuMyIpID09IDApCisJCQlzZWxmLT5tZWRpYSA9IE1FRElBXzgwMl8zOworCQllbHNlCisJCQlzZWxmLT5tZWRpYSA9IE1FRElBXzgwMl81OworCQlyZXR1cm47CisJfQorCWlmIChzdHJjbXAocGFyYW0sICJGSUxURVJfVFlQRSIpID09IDApIHsKKwkJaWYgKHN0cmNtcCh2YWx1ZSwgIkRJUkVDVEVEIikgPT0gMCkKKwkJCXNlbGYtPmNsaWVudC5maWx0ZXJfdHlwZSB8PSBJUkxBTl9ESVJFQ1RFRDsKKwkJZWxzZSBpZiAoc3RyY21wKHZhbHVlLCAiRlVOQ1RJT05BTCIpID09IDApCisJCQlzZWxmLT5jbGllbnQuZmlsdGVyX3R5cGUgfD0gSVJMQU5fRlVOQ1RJT05BTDsKKwkJZWxzZSBpZiAoc3RyY21wKHZhbHVlLCAiR1JPVVAiKSA9PSAwKQorCQkJc2VsZi0+Y2xpZW50LmZpbHRlcl90eXBlIHw9IElSTEFOX0dST1VQOworCQllbHNlIGlmIChzdHJjbXAodmFsdWUsICJNQUNfRlJBTUUiKSA9PSAwKQorCQkJc2VsZi0+Y2xpZW50LmZpbHRlcl90eXBlIHw9IElSTEFOX01BQ19GUkFNRTsKKwkJZWxzZSBpZiAoc3RyY21wKHZhbHVlLCAiTVVMVElDQVNUIikgPT0gMCkKKwkJCXNlbGYtPmNsaWVudC5maWx0ZXJfdHlwZSB8PSBJUkxBTl9NVUxUSUNBU1Q7CisJCWVsc2UgaWYgKHN0cmNtcCh2YWx1ZSwgIkJST0FEQ0FTVCIpID09IDApCisJCQlzZWxmLT5jbGllbnQuZmlsdGVyX3R5cGUgfD0gSVJMQU5fQlJPQURDQVNUOworCQllbHNlIGlmIChzdHJjbXAodmFsdWUsICJJUFhfU09DS0VUIikgPT0gMCkKKwkJCXNlbGYtPmNsaWVudC5maWx0ZXJfdHlwZSB8PSBJUkxBTl9JUFhfU09DS0VUOworCQkKKwl9CisJaWYgKHN0cmNtcChwYXJhbSwgIkFDQ0VTU19UWVBFIikgPT0gMCkgeworCQlpZiAoc3RyY21wKHZhbHVlLCAiRElSRUNUIikgPT0gMCkKKwkJCXNlbGYtPmNsaWVudC5hY2Nlc3NfdHlwZSA9IEFDQ0VTU19ESVJFQ1Q7CisJCWVsc2UgaWYgKHN0cmNtcCh2YWx1ZSwgIlBFRVIiKSA9PSAwKQorCQkJc2VsZi0+Y2xpZW50LmFjY2Vzc190eXBlID0gQUNDRVNTX1BFRVI7CisJCWVsc2UgaWYgKHN0cmNtcCh2YWx1ZSwgIkhPU1RFRCIpID09IDApCisJCQlzZWxmLT5jbGllbnQuYWNjZXNzX3R5cGUgPSBBQ0NFU1NfSE9TVEVEOworCQllbHNlIHsKKwkJCUlSREFfREVCVUcoMiwgIiVzKCksIHVua25vd24gYWNjZXNzIHR5cGUhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJfQorCX0KKwkvKiBJUkxBTiB2ZXJzaW9uICovCisJaWYgKHN0cmNtcChwYXJhbSwgIklSTEFOX1ZFUiIpID09IDApIHsKKwkJSVJEQV9ERUJVRyg0LCAiSXJMQU4gdmVyc2lvbiAlZC4lZFxuIiwgKF9fdTgpIHZhbHVlWzBdLCAKKwkJICAgICAgKF9fdTgpIHZhbHVlWzFdKTsKKworCQlzZWxmLT52ZXJzaW9uWzBdID0gdmFsdWVbMF07CisJCXNlbGYtPnZlcnNpb25bMV0gPSB2YWx1ZVsxXTsKKwkJcmV0dXJuOworCX0KKwkvKiBXaGljaCByZW1vdGUgVFNBUCB0byB1c2UgZm9yIGRhdGEgY2hhbm5lbCAqLworCWlmIChzdHJjbXAocGFyYW0sICJEQVRBX0NIQU4iKSA9PSAwKSB7CisJCXNlbGYtPmR0c2FwX3NlbF9kYXRhID0gdmFsdWVbMF07CisJCUlSREFfREVCVUcoNCwgIkRhdGEgVFNBUCA9ICUwMnhcbiIsIHNlbGYtPmR0c2FwX3NlbF9kYXRhKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoc3RyY21wKHBhcmFtLCAiQ09OX0FSQiIpID09IDApIHsKKwkJbWVtY3B5KCZ0bXBfY3B1LCB2YWx1ZSwgMik7IC8qIEFsaWduIHZhbHVlICovCisJCWxlMTZfdG9fY3B1cygmdG1wX2NwdSk7ICAgICAvKiBDb252ZXJ0IHRvIGhvc3Qgb3JkZXIgKi8KKwkJc2VsZi0+Y2xpZW50LnJlY3ZfYXJiX3ZhbCA9IHRtcF9jcHU7CisJCUlSREFfREVCVUcoMiwgIiVzKCksIHJlY2VpdmUgYXJiIHZhbD0lZFxuIiwgX19GVU5DVElPTl9fICwgCisJCQkgICBzZWxmLT5jbGllbnQucmVjdl9hcmJfdmFsKTsKKwl9CisJaWYgKHN0cmNtcChwYXJhbSwgIk1BWF9GUkFNRSIpID09IDApIHsKKwkJbWVtY3B5KCZ0bXBfY3B1LCB2YWx1ZSwgMik7IC8qIEFsaWduIHZhbHVlICovCisJCWxlMTZfdG9fY3B1cygmdG1wX2NwdSk7ICAgICAvKiBDb252ZXJ0IHRvIGhvc3Qgb3JkZXIgKi8KKwkJc2VsZi0+Y2xpZW50Lm1heF9mcmFtZSA9IHRtcF9jcHU7CisJCUlSREFfREVCVUcoNCwgIiVzKCksIG1heCBmcmFtZT0lZFxuIiwgX19GVU5DVElPTl9fICwgCisJCQkgICBzZWxmLT5jbGllbnQubWF4X2ZyYW1lKTsKKwl9CisJIAorCS8qIFJFQ09OTkVDVF9LRVksIGluIGNhc2UgdGhlIGxpbmsgZ29lcyBkb3duISAqLworCWlmIChzdHJjbXAocGFyYW0sICJSRUNPTk5FQ1RfS0VZIikgPT0gMCkgeworCQlJUkRBX0RFQlVHKDQsICJHb3QgcmVjb25uZWN0IGtleTogIik7CisJCS8qIGZvciAoaSA9IDA7IGkgPCB2YWxfbGVuOyBpKyspICovCisvKiAJCQlwcmludGsoIiUwMngiLCB2YWx1ZVtpXSk7ICovCisJCW1lbWNweShzZWxmLT5jbGllbnQucmVjb25uZWN0X2tleSwgdmFsdWUsIHZhbF9sZW4pOworCQlzZWxmLT5jbGllbnQua2V5X2xlbiA9IHZhbF9sZW47CisJCUlSREFfREVCVUcoNCwgIlxuIik7CisJfQorCS8qIEZJTFRFUl9FTlRSWSwgaGF2ZSB3ZSBnb3QgYW4gZXRoZXJuZXQgYWRkcmVzcz8gKi8KKwlpZiAoc3RyY21wKHBhcmFtLCAiRklMVEVSX0VOVFJZIikgPT0gMCkgeworCQlieXRlcyA9IHZhbHVlOworCQlJUkRBX0RFQlVHKDQsICJFdGhlcm5ldCBhZGRyZXNzID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCSAgICAgIGJ5dGVzWzBdLCBieXRlc1sxXSwgYnl0ZXNbMl0sIGJ5dGVzWzNdLCBieXRlc1s0XSwgCisJCSAgICAgIGJ5dGVzWzVdKTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgCisJCQlzZWxmLT5kZXYtPmRldl9hZGRyW2ldID0gYnl0ZXNbaV07CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X2dldF92YWx1ZV9jb25maXJtIChvYmpfaWQsIHZhbHVlKQorICoKKyAqICAgIEdvdCByZXN1bHRzIGZyb20gcmVtb3RlIExNLUlBUworICoKKyAqLwordm9pZCBpcmxhbl9jbGllbnRfZ2V0X3ZhbHVlX2NvbmZpcm0oaW50IHJlc3VsdCwgX191MTYgb2JqX2lkLCAKKwkJCQkgICAgc3RydWN0IGlhc192YWx1ZSAqdmFsdWUsIHZvaWQgKnByaXYpIAoreworCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKKwkKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHByaXYgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlzZWxmID0gKHN0cnVjdCBpcmxhbl9jYiAqKSBwcml2OworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKKworCS8qIFdlIHByb2JhYmx5IGRvbid0IG5lZWQgdG8gbWFrZSBhbnkgbW9yZSBxdWVyaWVzICovCisJaXJpYXBfY2xvc2Uoc2VsZi0+Y2xpZW50LmlyaWFwKTsKKwlzZWxmLT5jbGllbnQuaXJpYXAgPSBOVUxMOworCisJLyogQ2hlY2sgaWYgcmVxdWVzdCBzdWNjZWVkZWQgKi8KKwlpZiAocmVzdWx0ICE9IElBU19TVUNDRVNTKSB7CisJCUlSREFfREVCVUcoMiwgIiVzKCksIGdvdCBOVUxMIHZhbHVlIVxuIiwgX19GVU5DVElPTl9fICk7CisJCWlybGFuX2RvX2NsaWVudF9ldmVudChzZWxmLCBJUkxBTl9JQVNfUFJPVklERVJfTk9UX0FWQUlMLCAKKwkJCQkgICAgICBOVUxMKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAodmFsdWUtPnR5cGUpIHsKKwljYXNlIElBU19JTlRFR0VSOgorCQlzZWxmLT5kdHNhcF9zZWxfY3RybCA9IHZhbHVlLT50LmludGVnZXI7CisKKwkJaWYgKHZhbHVlLT50LmludGVnZXIgIT0gLTEpIHsKKwkJCWlybGFuX2RvX2NsaWVudF9ldmVudChzZWxmLCBJUkxBTl9JQVNfUFJPVklERVJfQVZBSUwsCisJCQkJCSAgICAgIE5VTEwpOworCQkJcmV0dXJuOworCQl9CisJCWlyaWFzX2RlbGV0ZV92YWx1ZSh2YWx1ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIHVua25vd24gdHlwZSFcbiIsIF9fRlVOQ1RJT05fXyApOworCQlicmVhazsKKwl9CisJaXJsYW5fZG9fY2xpZW50X2V2ZW50KHNlbGYsIElSTEFOX0lBU19QUk9WSURFUl9OT1RfQVZBSUwsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsYW4vaXJsYW5fY2xpZW50X2V2ZW50LmMgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9jbGllbnRfZXZlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTk0M2I2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJsYW4vaXJsYW5fY2xpZW50X2V2ZW50LmMKQEAgLTAsMCArMSw1MzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgaXJsYW5fY2xpZW50X2V2ZW50LmMKKyAqIFZlcnNpb246ICAgICAgIDAuOQorICogRGVzY3JpcHRpb246ICAgSXJMQU4gY2xpZW50IHN0YXRlIG1hY2hpbmUKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFN1biBBdWcgMzEgMjA6MTQ6MzcgMTk5NworICogTW9kaWZpZWQgYXQ6ICAgU3VuIERlYyAyNiAyMTo1MjoyNCAxOTk5CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+LCAKKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvdGltZXIuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcm1vZC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcnR0cC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fY29tbW9uLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fY2xpZW50Lmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fZXZlbnQuaD4KKworc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfaWRsZSAoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfcXVlcnkoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfY29ubiAoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfaW5mbyAoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfbWVkaWEoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfb3BlbiAoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfd2FpdCAoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfYXJiICAoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfZGF0YSAoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfY2xvc2Uoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfc3luYyAoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpOworCitzdGF0aWMgaW50ICgqc3RhdGVbXSkoc3RydWN0IGlybGFuX2NiICosIElSTEFOX0VWRU5UIGV2ZW50LCBzdHJ1Y3Qgc2tfYnVmZiAqKSA9Cit7IAorCWlybGFuX2NsaWVudF9zdGF0ZV9pZGxlLAorCWlybGFuX2NsaWVudF9zdGF0ZV9xdWVyeSwKKwlpcmxhbl9jbGllbnRfc3RhdGVfY29ubiwKKwlpcmxhbl9jbGllbnRfc3RhdGVfaW5mbywKKwlpcmxhbl9jbGllbnRfc3RhdGVfbWVkaWEsCisJaXJsYW5fY2xpZW50X3N0YXRlX29wZW4sCisJaXJsYW5fY2xpZW50X3N0YXRlX3dhaXQsCisJaXJsYW5fY2xpZW50X3N0YXRlX2FyYiwKKwlpcmxhbl9jbGllbnRfc3RhdGVfZGF0YSwKKwlpcmxhbl9jbGllbnRfc3RhdGVfY2xvc2UsCisJaXJsYW5fY2xpZW50X3N0YXRlX3N5bmMKK307CisKK3ZvaWQgaXJsYW5fZG9fY2xpZW50X2V2ZW50KHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCit7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CisKKwkoKnN0YXRlWyBzZWxmLT5jbGllbnQuc3RhdGVdKSAoc2VsZiwgZXZlbnQsIHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfc3RhdGVfaWRsZSAoZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICBJRExFLCBXZSBhcmUgd2FpdGluZyBmb3IgYW4gaW5kaWNhdGlvbiB0aGF0IHRoZXJlIGlzIGEgcHJvdmlkZXIKKyAqICAgIGF2YWlsYWJsZS4KKyAqLworc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfaWRsZShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybiAtMTspOworCQorCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIElSTEFOX0RJU0NPVkVSWV9JTkRJQ0FUSU9OOgorCQlpZiAoc2VsZi0+Y2xpZW50LmlyaWFwKSB7CisJCQlJUkRBX1dBUk5JTkcoIiVzKCksIGJ1c3kgd2l0aCBhIHByZXZpb3VzIHF1ZXJ5XG4iLAorCQkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJCisJCXNlbGYtPmNsaWVudC5pcmlhcCA9IGlyaWFwX29wZW4oTFNBUF9BTlksIElBU19DTElFTlQsIHNlbGYsCisJCQkJCQlpcmxhbl9jbGllbnRfZ2V0X3ZhbHVlX2NvbmZpcm0pOworCQkvKiBHZXQgc29tZSB2YWx1ZXMgZnJvbSBwZWVyIElBUyAqLworCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9RVUVSWSk7CisJCWlyaWFwX2dldHZhbHVlYnljbGFzc19yZXF1ZXN0KHNlbGYtPmNsaWVudC5pcmlhcCwKKwkJCQkJICAgICAgc2VsZi0+c2FkZHIsIHNlbGYtPmRhZGRyLAorCQkJCQkgICAgICAiSXJMQU4iLCAiSXJEQTpUaW55VFA6THNhcFNlbCIpOworCQlicmVhazsKKwljYXNlIElSTEFOX1dBVENIRE9HX1RJTUVPVVQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIElSTEFOX1dBVENIRE9HX1RJTUVPVVRcbiIsIF9fRlVOQ1RJT05fXyApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDQsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBldmVudCk7CisJCWJyZWFrOworCX0KKwlpZiAoc2tiKSAKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfc3RhdGVfcXVlcnkgKGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgUVVFUlksIFdlIGhhdmUgcXVlcnllZCB0aGUgcmVtb3RlIElBUyBhbmQgaXMgcmVhZHkgdG8gY29ubmVjdAorICogICAgdG8gcHJvdmlkZXIsIGp1c3Qgd2FpdGluZyBmb3IgdGhlIGNvbmZpcm0uCisgKgorICovCitzdGF0aWMgaW50IGlybGFuX2NsaWVudF9zdGF0ZV9xdWVyeShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm4gLTE7KTsKKwkKKwlzd2l0Y2goZXZlbnQpIHsKKwljYXNlIElSTEFOX0lBU19QUk9WSURFUl9BVkFJTDoKKwkJSVJEQV9BU1NFUlQoc2VsZi0+ZHRzYXBfc2VsX2N0cmwgIT0gMCwgcmV0dXJuIC0xOyk7CisKKwkJc2VsZi0+Y2xpZW50Lm9wZW5fcmV0cmllcyA9IDA7CisJCQorCQlpcnR0cF9jb25uZWN0X3JlcXVlc3Qoc2VsZi0+Y2xpZW50LnRzYXBfY3RybCwgCisJCQkJICAgICAgc2VsZi0+ZHRzYXBfc2VsX2N0cmwsIAorCQkJCSAgICAgIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkciwgTlVMTCwgCisJCQkJICAgICAgSVJMQU5fTVRVLCBOVUxMKTsKKwkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fQ09OTik7CisJCWJyZWFrOworCWNhc2UgSVJMQU5fSUFTX1BST1ZJREVSX05PVF9BVkFJTDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgSUFTX1BST1ZJREVSX05PVF9BVkFJTFxuIiwgX19GVU5DVElPTl9fICk7CisJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOworCisJCS8qIEdpdmUgdGhlIGNsaWVudCBhIGtpY2shICovCisJCWlmICgoc2VsZi0+cHJvdmlkZXIuYWNjZXNzX3R5cGUgPT0gQUNDRVNTX1BFRVIpICYmIAorCQkgICAgKHNlbGYtPnByb3ZpZGVyLnN0YXRlICE9IElSTEFOX0lETEUpKQorCQkJaXJsYW5fY2xpZW50X3dha2V1cChzZWxmLCBzZWxmLT5zYWRkciwgc2VsZi0+ZGFkZHIpOworCQlicmVhazsKKwljYXNlIElSTEFOX0xNUF9ESVNDT05ORUNUOgorCWNhc2UgSVJMQU5fTEFQX0RJU0NPTk5FQ1Q6CisJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOworCQlicmVhazsKKwljYXNlIElSTEFOX1dBVENIRE9HX1RJTUVPVVQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIElSTEFOX1dBVENIRE9HX1RJTUVPVVRcbiIsIF9fRlVOQ1RJT05fXyApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBldmVudCk7CisJCWJyZWFrOworCX0KKwlpZiAoc2tiKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfc3RhdGVfY29ubiAoZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICBDT05OLCBXZSBoYXZlIGNvbm5lY3RlZCB0byBhIHByb3ZpZGVyIGJ1dCBoYXMgbm90IGlzc3VlZCBhbnkKKyAqICAgIGNvbW1hbmRzIHlldC4KKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2Nvbm4oc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwkKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBJUkxBTl9DT05ORUNUX0NPTVBMRVRFOgorCQkvKiBTZW5kIGdldGluZm8gY21kICovCisJCWlybGFuX2dldF9wcm92aWRlcl9pbmZvKHNlbGYpOworCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9JTkZPKTsKKwkJYnJlYWs7CisJY2FzZSBJUkxBTl9MTVBfRElTQ09OTkVDVDoKKwljYXNlIElSTEFOX0xBUF9ESVNDT05ORUNUOgorCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9JRExFKTsKKwkJYnJlYWs7CisJY2FzZSBJUkxBTl9XQVRDSERPR19USU1FT1VUOgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBJUkxBTl9XQVRDSERPR19USU1FT1VUXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fICwgZXZlbnQpOworCQlicmVhazsKKwl9CisJaWYgKHNrYikKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X3N0YXRlX2luZm8gKHNlbGYsIGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgSU5GTywgV2UgaGF2ZSBpc3N1ZWQgYSBHZXRJbmZvIGNvbW1hbmQgYW5kIGlzIGF3YWl0aW5nIGEgcmVwbHkuCisgKi8KK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX2luZm8oc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCQorCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIElSTEFOX0RBVEFfSU5ESUNBVElPTjoKKwkJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybiAtMTspOworCQorCQlpcmxhbl9jbGllbnRfcGFyc2VfcmVzcG9uc2Uoc2VsZiwgc2tiKTsKKwkJCisJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX01FRElBKTsKKwkJCisJCWlybGFuX2dldF9tZWRpYV9jaGFyKHNlbGYpOworCQlicmVhazsKKwkJCisJY2FzZSBJUkxBTl9MTVBfRElTQ09OTkVDVDoKKwljYXNlIElSTEFOX0xBUF9ESVNDT05ORUNUOgorCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9JRExFKTsKKwkJYnJlYWs7CisJY2FzZSBJUkxBTl9XQVRDSERPR19USU1FT1VUOgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBJUkxBTl9XQVRDSERPR19USU1FT1VUXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fICwgZXZlbnQpOworCQlicmVhazsKKwl9CisJaWYgKHNrYikKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X3N0YXRlX21lZGlhIChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIE1FRElBLCBUaGUgaXJsYW5fY2xpZW50IGhhcyBpc3N1ZWQgYSBHZXRNZWRpYSBjb21tYW5kIGFuZCBpcyBhd2FpdGluZyBhCisgKiAgICByZXBseS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX21lZGlhKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJc3dpdGNoKGV2ZW50KSB7CisJY2FzZSBJUkxBTl9EQVRBX0lORElDQVRJT046CisJCWlybGFuX2NsaWVudF9wYXJzZV9yZXNwb25zZShzZWxmLCBza2IpOworCQlpcmxhbl9vcGVuX2RhdGFfY2hhbm5lbChzZWxmKTsKKwkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fT1BFTik7CisJCWJyZWFrOworCWNhc2UgSVJMQU5fTE1QX0RJU0NPTk5FQ1Q6CisJY2FzZSBJUkxBTl9MQVBfRElTQ09OTkVDVDoKKwkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fSURMRSk7CisJCWJyZWFrOworCWNhc2UgSVJMQU5fV0FUQ0hET0dfVElNRU9VVDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgSVJMQU5fV0FUQ0hET0dfVElNRU9VVFxuIiwgX19GVU5DVElPTl9fICk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIFVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXyAsIGV2ZW50KTsKKwkJYnJlYWs7CisJfQorCWlmIChza2IpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2NsaWVudF9zdGF0ZV9vcGVuIChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIE9QRU4sIFRoZSBpcmxhbl9jbGllbnQgaGFzIGlzc3VlZCBhIE9wZW5EYXRhIGNvbW1hbmQgYW5kIGlzIGF3YWl0aW5nIGEKKyAqICAgIHJlcGx5CisgKgorICovCitzdGF0aWMgaW50IGlybGFuX2NsaWVudF9zdGF0ZV9vcGVuKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpIAoreworCXN0cnVjdCBxb3NfaW5mbyBxb3M7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJc3dpdGNoKGV2ZW50KSB7CisJY2FzZSBJUkxBTl9EQVRBX0lORElDQVRJT046CisJCWlybGFuX2NsaWVudF9wYXJzZV9yZXNwb25zZShzZWxmLCBza2IpOworCQkKKwkJLyoKKwkJICogIENoZWNrIGlmIHdlIGhhdmUgZ290IHRoZSByZW1vdGUgVFNBUCBmb3IgZGF0YSAKKwkJICogIGNvbW11bmljYXRpb25zCisJCSAqLworCSAgCUlSREFfQVNTRVJUKHNlbGYtPmR0c2FwX3NlbF9kYXRhICE9IDAsIHJldHVybiAtMTspOworCisJCS8qIENoZWNrIHdoaWNoIGFjY2VzcyB0eXBlIHdlIGFyZSBkZWFsaW5nIHdpdGggKi8KKwkJc3dpdGNoIChzZWxmLT5jbGllbnQuYWNjZXNzX3R5cGUpIHsKKwkJY2FzZSBBQ0NFU1NfUEVFUjoKKwkJICAgIGlmIChzZWxmLT5wcm92aWRlci5zdGF0ZSA9PSBJUkxBTl9PUEVOKSB7CisJCQkgICAgCisJCQkgICAgaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fQVJCKTsKKwkJCSAgICBpcmxhbl9kb19jbGllbnRfZXZlbnQoc2VsZiwgSVJMQU5fQ0hFQ0tfQ09OX0FSQiwgCisJCQkJCQkgIE5VTEwpOworCQkgICAgfSBlbHNlIHsKKwkJCQorCQkJICAgIGlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX1dBSVQpOworCQkgICAgfQorCQkgICAgYnJlYWs7CisJCWNhc2UgQUNDRVNTX0RJUkVDVDoKKwkJY2FzZSBBQ0NFU1NfSE9TVEVEOgorCQkJcW9zLmxpbmtfZGlzY190aW1lLmJpdHMgPSAweDAxOyAvKiAzIHNlY3MgKi8KKwkJCQorCQkJaXJ0dHBfY29ubmVjdF9yZXF1ZXN0KHNlbGYtPnRzYXBfZGF0YSwgCisJCQkJCSAgICAgIHNlbGYtPmR0c2FwX3NlbF9kYXRhLCAKKwkJCQkJICAgICAgc2VsZi0+c2FkZHIsIHNlbGYtPmRhZGRyLCAmcW9zLCAKKwkJCQkJICAgICAgSVJMQU5fTVRVLCBOVUxMKTsKKwkJCQorCQkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fREFUQSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUlSREFfREVCVUcoMiwgIiVzKCksIHVua25vd24gYWNjZXNzIHR5cGUhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgSVJMQU5fTE1QX0RJU0NPTk5FQ1Q6CisJY2FzZSBJUkxBTl9MQVBfRElTQ09OTkVDVDoKKwkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fSURMRSk7CisJCWJyZWFrOworCWNhc2UgSVJMQU5fV0FUQ0hET0dfVElNRU9VVDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgSVJMQU5fV0FUQ0hET0dfVElNRU9VVFxuIiwgX19GVU5DVElPTl9fICk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIFVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXyAsIGV2ZW50KTsKKwkJYnJlYWs7CisJfQorCQorCWlmIChza2IpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X3N0YXRlX3dhaXQgKHNlbGYsIGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgV0FJVCwgVGhlIGlybGFuX2NsaWVudCBpcyB3YWl0aW5nIGZvciB0aGUgbG9jYWwgcHJvdmlkZXIgdG8gZW50ZXIgdGhlCisgKiAgICBwcm92aWRlciBPUEVOIHN0YXRlLgorICoKKyAqLworc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfd2FpdChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCQorCXN3aXRjaChldmVudCkgeworCWNhc2UgSVJMQU5fUFJPVklERVJfU0lHTkFMOgorCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9BUkIpOworCQlpcmxhbl9kb19jbGllbnRfZXZlbnQoc2VsZiwgSVJMQU5fQ0hFQ0tfQ09OX0FSQiwgTlVMTCk7CisJCWJyZWFrOworCWNhc2UgSVJMQU5fTE1QX0RJU0NPTk5FQ1Q6CisJY2FzZSBJUkxBTl9MQVBfRElTQ09OTkVDVDoKKwkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fSURMRSk7CisJCWJyZWFrOworCWNhc2UgSVJMQU5fV0FUQ0hET0dfVElNRU9VVDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgSVJMQU5fV0FUQ0hET0dfVElNRU9VVFxuIiwgX19GVU5DVElPTl9fICk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIFVua25vd24gZXZlbnQgJWRcbiIsIF9fRlVOQ1RJT05fXyAsIGV2ZW50KTsKKwkJYnJlYWs7CisJfQorCWlmIChza2IpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfYXJiKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCit7CisJc3RydWN0IHFvc19pbmZvIHFvczsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwkKKwlzd2l0Y2goZXZlbnQpIHsKKwljYXNlIElSTEFOX0NIRUNLX0NPTl9BUkI6CisJCWlmIChzZWxmLT5jbGllbnQucmVjdl9hcmJfdmFsID09IHNlbGYtPnByb3ZpZGVyLnNlbmRfYXJiX3ZhbCkgeworCQkJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fQ0xPU0UpOworCQkJaXJsYW5fY2xvc2VfZGF0YV9jaGFubmVsKHNlbGYpOworCQl9IGVsc2UgaWYgKHNlbGYtPmNsaWVudC5yZWN2X2FyYl92YWwgPCAKKwkJCSAgIHNlbGYtPnByb3ZpZGVyLnNlbmRfYXJiX3ZhbCkgCisJCXsKKwkJCXFvcy5saW5rX2Rpc2NfdGltZS5iaXRzID0gMHgwMTsgLyogMyBzZWNzICovCisKKwkJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0RBVEEpOworCQkJaXJ0dHBfY29ubmVjdF9yZXF1ZXN0KHNlbGYtPnRzYXBfZGF0YSwgCisJCQkJCSAgICAgIHNlbGYtPmR0c2FwX3NlbF9kYXRhLCAKKwkJCQkJICAgICAgc2VsZi0+c2FkZHIsIHNlbGYtPmRhZGRyLCAmcW9zLCAKKwkJCQkJICAgICAgSVJMQU5fTVRVLCBOVUxMKTsKKwkJfSBlbHNlIGlmIChzZWxmLT5jbGllbnQucmVjdl9hcmJfdmFsID4KKwkJCSAgIHNlbGYtPnByb3ZpZGVyLnNlbmRfYXJiX3ZhbCkgCisJCXsKKwkJCUlSREFfREVCVUcoMiwgIiVzKCksIGxvc3QgdGhlIGJhdHRsZSA6LShcbiIsIF9fRlVOQ1RJT05fXyApOworCQl9CisJCWJyZWFrOworCWNhc2UgSVJMQU5fREFUQV9DT05ORUNUX0lORElDQVRJT046CisJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0RBVEEpOworCQlicmVhazsKKwljYXNlIElSTEFOX0xNUF9ESVNDT05ORUNUOgorCWNhc2UgSVJMQU5fTEFQX0RJU0NPTk5FQ1Q6CisJCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOworCQlicmVhazsKKwljYXNlIElSTEFOX1dBVENIRE9HX1RJTUVPVVQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIElSTEFOX1dBVENIRE9HX1RJTUVPVVRcbiIsIF9fRlVOQ1RJT05fXyApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBldmVudCk7CisJCWJyZWFrOworCX0KKwlpZiAoc2tiKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfc3RhdGVfZGF0YSAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICBEQVRBLCBUaGUgZGF0YSBjaGFubmVsIGlzIGNvbm5lY3RlZCwgYWxsb3dpbmcgZGF0YSB0cmFuc2ZlcnMgYmV0d2VlbgorICogICAgdGhlIGxvY2FsIGFuZCByZW1vdGUgbWFjaGluZXMuCisgKgorICovCitzdGF0aWMgaW50IGlybGFuX2NsaWVudF9zdGF0ZV9kYXRhKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpIAoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlzd2l0Y2goZXZlbnQpIHsKKwljYXNlIElSTEFOX0RBVEFfSU5ESUNBVElPTjoKKwkJaXJsYW5fY2xpZW50X3BhcnNlX3Jlc3BvbnNlKHNlbGYsIHNrYik7CisJCWJyZWFrOwkJCisJY2FzZSBJUkxBTl9MTVBfRElTQ09OTkVDVDogLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIElSTEFOX0xBUF9ESVNDT05ORUNUOgorCQlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9JRExFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fICwgZXZlbnQpOworCQlicmVhazsKKwl9CisJaWYgKHNrYikKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X3N0YXRlX2Nsb3NlIChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIAorICoKKyAqLworc3RhdGljIGludCBpcmxhbl9jbGllbnRfc3RhdGVfY2xvc2Uoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpIAoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJaWYgKHNrYikKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfc3RhdGVfc3luYyAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICAKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJsYW5fY2xpZW50X3N0YXRlX3N5bmMoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJaWYgKHNrYikKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQorCXJldHVybiAwOworfQorCisKKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmxhbi9pcmxhbl9jb21tb24uYyBiL25ldC9pcmRhL2lybGFuL2lybGFuX2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1N2QxMjIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9jb21tb24uYwpAQCAtMCwwICsxLDEyMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgaXJsYW5fY29tbW9uLmMKKyAqIFZlcnNpb246ICAgICAgIDAuOQorICogRGVzY3JpcHRpb246ICAgSXJEQSBMQU4gQWNjZXNzIFByb3RvY29sIEltcGxlbWVudGF0aW9uCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBTdW4gQXVnIDMxIDIwOjE0OjM3IDE5OTcKKyAqIE1vZGlmaWVkIGF0OiAgIFN1biBEZWMgMjYgMjE6NTM6MTAgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk3LCAxOTk5IERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4sIAorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAorICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJ0dHAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvdGltZXIuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NvbW1vbi5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NsaWVudC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX3Byb3ZpZGVyLmg+IAorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2V0aC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2ZpbHRlci5oPgorCisKKy8qIAorICogU2VuZCBncmF0dWl0b3VzIEFSUCB3aGVuIGNvbm5lY3RlZCB0byBhIG5ldyBBUCBvciBub3QuIE1heSBiZSBhIGNsZXZlcgorICogdGhpbmcgdG8gZG8sIGJ1dCBmb3Igc29tZSByZWFzb24gdGhlIG1hY2hpbmUgY3Jhc2hlcyBpZiB5b3UgdXNlIERIQ1AuIFNvCisgKiBsZXRzIG5vdCB1c2UgaXQgYnkgZGVmYXVsdC4KKyAqLworI3VuZGVmIENPTkZJR19JUkxBTl9TRU5EX0dSQVRVSVRPVVNfQVJQCisKKy8qIGV4dGVybiBjaGFyIHN5c2N0bF9kZXZuYW1lW107ICovCisKKy8qCisgKiAgTWFzdGVyIHN0cnVjdHVyZQorICovCitzdGF0aWMgTElTVF9IRUFEKGlybGFucyk7CisKK3N0YXRpYyB2b2lkICpja2V5Oworc3RhdGljIHZvaWQgKnNrZXk7CisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCitzdGF0aWMgaW50IGV0aDsgICAvKiBVc2UgImV0aCIgb3IgImlybGFuIiBuYW1lIGZvciBkZXZpY2VzICovCitzdGF0aWMgaW50IGFjY2VzcyA9IEFDQ0VTU19QRUVSOyAvKiBQRUVSLCBESVJFQ1Qgb3IgSE9TVEVEICovCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIGNvbnN0IGNoYXIgKmlybGFuX2FjY2Vzc1tdID0geworCSJVTktOT1dOIiwKKwkiRElSRUNUIiwKKwkiUEVFUiIsCisJIkhPU1RFRCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICppcmxhbl9tZWRpYVtdID0geworCSJVTktOT1dOIiwKKwkiODAyLjMiLAorCSI4MDIuNSIKK307CisKK2V4dGVybiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfaXJkYTsKKworc3RhdGljIGludCBpcmxhbl9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlybGFuX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gaXJsYW5fc2VxX29wZW4sCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKworZXh0ZXJuIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19pcmRhOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKK3N0YXRpYyBzdHJ1Y3QgaXJsYW5fY2IgKmlybGFuX29wZW4oX191MzIgc2FkZHIsIF9fdTMyIGRhZGRyKTsKK3N0YXRpYyB2b2lkIF9faXJsYW5fY2xvc2Uoc3RydWN0IGlybGFuX2NiICpzZWxmKTsKK3N0YXRpYyBpbnQgX19pcmxhbl9pbnNlcnRfcGFyYW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgY2hhciAqcGFyYW0sIGludCB0eXBlLCAKKwkJCQlfX3U4IHZhbHVlX2J5dGUsIF9fdTE2IHZhbHVlX3Nob3J0LCAKKwkJCQlfX3U4ICp2YWx1ZV9hcnJheSwgX191MTYgdmFsdWVfbGVuKTsKK3N0YXRpYyB2b2lkIGlybGFuX29wZW5fdW5pY2FzdF9hZGRyKHN0cnVjdCBpcmxhbl9jYiAqc2VsZik7CitzdGF0aWMgdm9pZCBpcmxhbl9nZXRfdW5pY2FzdF9hZGRyKHN0cnVjdCBpcmxhbl9jYiAqc2VsZik7Cit2b2lkIGlybGFuX2Nsb3NlX3RzYXBzKHN0cnVjdCBpcmxhbl9jYiAqc2VsZik7CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9pbml0ICh2b2lkKQorICoKKyAqICAgIEluaXRpYWxpemUgSXJMQU4gbGF5ZXIKKyAqCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGlybGFuX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgaXJsYW5fY2IgKm5ldzsKKwlfX3UxNiBoaW50czsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwl7IHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvYzsKKwlwcm9jID0gY3JlYXRlX3Byb2NfZW50cnkoImlybGFuIiwgMCwgcHJvY19pcmRhKTsKKwlpZiAoIXByb2MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpcmxhbl9pbml0OiBjYW4ndCBjcmVhdGUgL3Byb2MgZW50cnkhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcHJvYy0+cHJvY19mb3BzID0gJmlybGFuX2ZvcHM7CisJfQorI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwloaW50cyA9IGlybG1wX3NlcnZpY2VfdG9faGludChTX0xBTik7CisKKwkvKiBSZWdpc3RlciB3aXRoIElyTE1QIGFzIGEgY2xpZW50ICovCisJY2tleSA9IGlybG1wX3JlZ2lzdGVyX2NsaWVudChoaW50cywgJmlybGFuX2NsaWVudF9kaXNjb3ZlcnlfaW5kaWNhdGlvbiwKKwkJCQkgICAgIE5VTEwsIE5VTEwpOworCQorCS8qIFJlZ2lzdGVyIHdpdGggSXJMTVAgYXMgYSBzZXJ2aWNlICovCisgCXNrZXkgPSBpcmxtcF9yZWdpc3Rlcl9zZXJ2aWNlKGhpbnRzKTsKKworCS8qIFN0YXJ0IHRoZSBtYXN0ZXIgSXJMQU4gaW5zdGFuY2UgKHRoZSBvbmx5IG9uZSBmb3Igbm93KSAqLworIAluZXcgPSBpcmxhbl9vcGVuKERFVl9BRERSX0FOWSwgREVWX0FERFJfQU5ZKTsKKworCS8qIFRoZSBtYXN0ZXIgd2lsbCBvbmx5IG9wZW4gaXRzIChsaXN0ZW4pIGNvbnRyb2wgVFNBUCAqLworCWlybGFuX3Byb3ZpZGVyX29wZW5fY3RybF90c2FwKG5ldyk7CisKKwkvKiBEbyBzb21lIGZhc3QgZGlzY292ZXJ5ISAqLworCWlybG1wX2Rpc2NvdmVyeV9yZXF1ZXN0KERJU0NPVkVSWV9ERUZBVUxUX1NMT1RTKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXJsYW5fY2xlYW51cCh2b2lkKSAKK3sKKwlzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsICpuZXh0OworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlpcmxtcF91bnJlZ2lzdGVyX2NsaWVudChja2V5KTsKKwlpcmxtcF91bnJlZ2lzdGVyX3NlcnZpY2Uoc2tleSk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXJlbW92ZV9wcm9jX2VudHJ5KCJpcmxhbiIsIHByb2NfaXJkYSk7CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworCS8qIENsZWFudXAgYW55IGxlZnRvdmVyIG5ldHdvcmsgZGV2aWNlcyAqLworCXJ0bmxfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzZWxmLCBuZXh0LCAmaXJsYW5zLCBkZXZfbGlzdCkgeworCQlfX2lybGFuX2Nsb3NlKHNlbGYpOworCX0KKwlydG5sX3VubG9jaygpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fb3BlbiAodm9pZCkKKyAqCisgKiAgICBPcGVuIG5ldyBpbnN0YW5jZSBvZiBhIGNsaWVudC9wcm92aWRlciwgd2Ugc2hvdWxkIG9ubHkgcmVnaXN0ZXIgdGhlIAorICogICAgbmV0d29yayBkZXZpY2UgaWYgdGhpcyBpbnN0YW5jZSBpcyBtZW50IGZvciBhIHBhcnRpY3VsYXIgY2xpZW50L3Byb3ZpZGVyCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXJsYW5fY2IgKmlybGFuX29wZW4oX191MzIgc2FkZHIsIF9fdTMyIGRhZGRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGlybGFuX2NiICpzZWxmOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwkvKiBDcmVhdGUgbmV0d29yayBkZXZpY2Ugd2l0aCBpcmxhbiAqLworCWRldiA9IGFsbG9jX2lybGFuZGV2KGV0aCA/ICJldGglZCIgOiAiaXJsYW4lZCIpOworCWlmICghZGV2KQorCQlyZXR1cm4gTlVMTDsKKworCXNlbGYgPSBkZXYtPnByaXY7CisJc2VsZi0+ZGV2ID0gZGV2OworCisJLyoKKwkgKiAgSW5pdGlhbGl6ZSBsb2NhbCBkZXZpY2Ugc3RydWN0dXJlCisJICovCisJc2VsZi0+bWFnaWMgPSBJUkxBTl9NQUdJQzsKKwlzZWxmLT5zYWRkciA9IHNhZGRyOworCXNlbGYtPmRhZGRyID0gZGFkZHI7CisKKwkvKiBQcm92aWRlciBhY2Nlc3MgY2FuIG9ubHkgYmUgUEVFUiwgRElSRUNULCBvciBIT1NURUQgKi8KKwlzZWxmLT5wcm92aWRlci5hY2Nlc3NfdHlwZSA9IGFjY2VzczsKKwlpZiAoYWNjZXNzID09IEFDQ0VTU19ESVJFQ1QpIHsKKwkJLyogIAorCQkgKiBTaW5jZSB3ZSBhcmUgZW11bGF0aW5nIGFuIElyTEFOIHNldmVyIHdlIHdpbGwgaGF2ZSB0bworCQkgKiBnaXZlIG91cnNlbGYgYW4gZXRoZXJuZXQgYWRkcmVzcyEgIAorCQkgKi8KKwkJZGV2LT5kZXZfYWRkclswXSA9IDB4NDA7CisJCWRldi0+ZGV2X2FkZHJbMV0gPSAweDAwOworCQlkZXYtPmRldl9hZGRyWzJdID0gMHgwMDsKKwkJZGV2LT5kZXZfYWRkclszXSA9IDB4MDA7CisJCWdldF9yYW5kb21fYnl0ZXMoZGV2LT5kZXZfYWRkcis0LCAxKTsKKwkJZ2V0X3JhbmRvbV9ieXRlcyhkZXYtPmRldl9hZGRyKzUsIDEpOworCX0KKworCXNlbGYtPm1lZGlhID0gTUVESUFfODAyXzM7CisJc2VsZi0+ZGlzY29ubmVjdF9yZWFzb24gPSBMTV9VU0VSX1JFUVVFU1Q7CisJaW5pdF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOworCWluaXRfdGltZXIoJnNlbGYtPmNsaWVudC5raWNrX3RpbWVyKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZWxmLT5vcGVuX3dhaXQpOwkKKwkKKwlza2JfcXVldWVfaGVhZF9pbml0KCZzZWxmLT5jbGllbnQudHhxKTsKKwkKKwlpcmxhbl9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBJUkxBTl9JRExFKTsKKwlpcmxhbl9uZXh0X3Byb3ZpZGVyX3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOworCisJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CisJCUlSREFfREVCVUcoMiwgIiVzKCksIHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZCFcbiIsIAorCQkJICAgX19GVU5DVElPTl9fICk7CisJCXNlbGYgPSBOVUxMOworCQlmcmVlX25ldGRldihkZXYpOworCX0gZWxzZSB7CisJCXJ0bmxfbG9jaygpOworCQlsaXN0X2FkZF9yY3UoJnNlbGYtPmRldl9saXN0LCAmaXJsYW5zKTsKKwkJcnRubF91bmxvY2soKTsKKwl9CisKKwlyZXR1cm4gc2VsZjsKK30KKy8qCisgKiBGdW5jdGlvbiBfX2lybGFuX2Nsb3NlIChzZWxmKQorICoKKyAqICAgIFRoaXMgZnVuY3Rpb24gY2xvc2VzIGFuZCBkZWFsbG9jYXRlcyB0aGUgSXJMQU4gY2xpZW50IGluc3RhbmNlcy4gQmUgCisgKiAgICBhd2FyZSB0aGF0IG90aGVyIGZ1bmN0aW9ucyB3aGljaCBjYWxscyBjbGllbnRfY2xvc2UoKSBtdXN0CisgKiAgICByZW1vdmUgc2VsZiBmcm9tIGlybGFucyBsaXN0IGZpcnN0LgorICovCitzdGF0aWMgdm9pZCBfX2lybGFuX2Nsb3NlKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwlBU1NFUlRfUlROTCgpOworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOworCisJZGVsX3RpbWVyX3N5bmMoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmc2VsZi0+Y2xpZW50LmtpY2tfdGltZXIpOworCisJLyogQ2xvc2UgYWxsIG9wZW4gY29ubmVjdGlvbnMgYW5kIHJlbW92ZSBUU0FQcyAqLworCWlybGFuX2Nsb3NlX3RzYXBzKHNlbGYpOworCQorCWlmIChzZWxmLT5jbGllbnQuaXJpYXApIAorCQlpcmlhcF9jbG9zZShzZWxmLT5jbGllbnQuaXJpYXApOworCisJLyogUmVtb3ZlIGZyYW1lcyBxdWV1ZWQgb24gdGhlIGNvbnRyb2wgY2hhbm5lbCAqLworCXNrYl9xdWV1ZV9wdXJnZSgmc2VsZi0+Y2xpZW50LnR4cSk7CisKKwkvKiBVbnJlZ2lzdGVyIGFuZCBmcmVlIHNlbGYgdmlhIGRlc3RydWN0b3IgKi8KKwl1bnJlZ2lzdGVyX25ldGRldmljZShzZWxmLT5kZXYpOworfQorCisvKiBGaW5kIGFueSBpbnN0YW5jZSBvZiBpcmxhbiwgdXNlZCBmb3IgY2xpZW50IGRpc2NvdmVyeSB3YWtldXAgKi8KK3N0cnVjdCBpcmxhbl9jYiAqaXJsYW5fZ2V0X2FueSh2b2lkKQoreworCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHNlbGYsICZpcmxhbnMsIGRldl9saXN0KSB7CisJCXJldHVybiBzZWxmOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2Nvbm5lY3RfaW5kaWNhdGlvbiAoaW5zdGFuY2UsIHNhcCwgcW9zLCBtYXhfc2R1X3NpemUsIHNrYikKKyAqCisgKiAgICBIZXJlIHdlIHJlY2VpdmUgdGhlIGNvbm5lY3QgaW5kaWNhdGlvbiBmb3IgdGhlIGRhdGEgY2hhbm5lbAorICoKKyAqLworc3RhdGljIHZvaWQgaXJsYW5fY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJICAgICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywKKwkJCQkgICAgIF9fdTMyIG1heF9zZHVfc2l6ZSwKKwkJCQkgICAgIF9fdTggbWF4X2hlYWRlcl9zaXplLCAKKwkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlybGFuX2NiICpzZWxmOworCXN0cnVjdCB0c2FwX2NiICp0c2FwOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJc2VsZiA9IChzdHJ1Y3QgaXJsYW5fY2IgKikgaW5zdGFuY2U7CisJdHNhcCA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBzYXA7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQodHNhcCA9PSBzZWxmLT50c2FwX2RhdGEscmV0dXJuOyk7CisKKwlzZWxmLT5tYXhfc2R1X3NpemUgPSBtYXhfc2R1X3NpemU7CisJc2VsZi0+bWF4X2hlYWRlcl9zaXplID0gbWF4X2hlYWRlcl9zaXplOworCisJSVJEQV9ERUJVRygwLCAiJXM6IFdlIGFyZSBub3cgY29ubmVjdGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKworCWRlbF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOworCisJLyogSWYgeW91IHdhbnQgdG8gcGFzcyB0aGUgc2tiIHRvICpib3RoKiBzdGF0ZSBtYWNoaW5lcywgeW91IHdpbGwKKwkgKiBuZWVkIHRvIHNrYl9jbG9uZSgpIGl0LCBzbyB0aGF0IHlvdSBkb24ndCBmcmVlIGl0IHR3aWNlLgorCSAqIEFzIHRoZSBzdGF0ZSBtYWNoaW5lcyBkb24ndCBuZWVkIGl0LCBnaXQgcmlkIG9mIGl0IGhlcmUuLi4KKwkgKiBKZWFuIElJICovCisJaWYgKHNrYikKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCisJaXJsYW5fZG9fcHJvdmlkZXJfZXZlbnQoc2VsZiwgSVJMQU5fREFUQV9DT05ORUNUX0lORElDQVRJT04sIE5VTEwpOworCWlybGFuX2RvX2NsaWVudF9ldmVudChzZWxmLCBJUkxBTl9EQVRBX0NPTk5FQ1RfSU5ESUNBVElPTiwgTlVMTCk7CisKKwlpZiAoc2VsZi0+cHJvdmlkZXIuYWNjZXNzX3R5cGUgPT0gQUNDRVNTX1BFRVIpIHsKKwkJLyogCisJCSAqIERhdGEgY2hhbm5lbCBpcyBvcGVuLCBzbyB3ZSBhcmUgbm93IGFsbG93ZWQgdG8KKwkJICogY29uZmlndXJlIHRoZSByZW1vdGUgZmlsdGVyIAorCQkgKi8KKwkJaXJsYW5fZ2V0X3VuaWNhc3RfYWRkcihzZWxmKTsKKwkJaXJsYW5fb3Blbl91bmljYXN0X2FkZHIoc2VsZik7CisJfQorCS8qIFJlYWR5IHRvIHRyYW5zZmVyIEV0aGVybmV0IGZyYW1lcyAoYXQgbGFzdCkgKi8KKwluZXRpZl9zdGFydF9xdWV1ZShzZWxmLT5kZXYpOyAvKiBDbGVhciByZWFzb24gKi8KK30KKworc3RhdGljIHZvaWQgaXJsYW5fY29ubmVjdF9jb25maXJtKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywgCisJCQkJICBfX3UzMiBtYXhfc2R1X3NpemUsCisJCQkJICBfX3U4IG1heF9oZWFkZXJfc2l6ZSwgCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAKK3sKKwlzdHJ1Y3QgaXJsYW5fY2IgKnNlbGY7CisKKwlzZWxmID0gKHN0cnVjdCBpcmxhbl9jYiAqKSBpbnN0YW5jZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOworCisJc2VsZi0+bWF4X3NkdV9zaXplID0gbWF4X3NkdV9zaXplOworCXNlbGYtPm1heF9oZWFkZXJfc2l6ZSA9IG1heF9oZWFkZXJfc2l6ZTsKKworCS8qIFRPRE86IHdlIGNvdWxkIHNldCB0aGUgTVRVIGRlcGVuZGluZyBvbiB0aGUgbWF4X3NkdV9zaXplICovCisKKwlJUkRBX0RFQlVHKDAsICIlczogV2UgYXJlIG5vdyBjb25uZWN0ZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCWRlbF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOworCisJLyogCisJICogRGF0YSBjaGFubmVsIGlzIG9wZW4sIHNvIHdlIGFyZSBub3cgYWxsb3dlZCB0byBjb25maWd1cmUgdGhlIHJlbW90ZQorCSAqIGZpbHRlciAKKwkgKi8KKwlpcmxhbl9nZXRfdW5pY2FzdF9hZGRyKHNlbGYpOworCWlybGFuX29wZW5fdW5pY2FzdF9hZGRyKHNlbGYpOworCQorCS8qIE9wZW4gYnJvYWRjYXN0IGFuZCBtdWx0aWNhc3QgZmlsdGVyIGJ5IGRlZmF1bHQgKi8KKyAJaXJsYW5fc2V0X2Jyb2FkY2FzdF9maWx0ZXIoc2VsZiwgVFJVRSk7CisgCWlybGFuX3NldF9tdWx0aWNhc3RfZmlsdGVyKHNlbGYsIFRSVUUpOworCisJLyogUmVhZHkgdG8gdHJhbnNmZXIgRXRoZXJuZXQgZnJhbWVzICovCisJbmV0aWZfc3RhcnRfcXVldWUoc2VsZi0+ZGV2KTsKKwlzZWxmLT5kaXNjb25uZWN0X3JlYXNvbiA9IDA7IC8qIENsZWFyIHJlYXNvbiAqLworI2lmZGVmIENPTkZJR19JUkxBTl9TRU5EX0dSQVRVSVRPVVNfQVJQCisJaXJsYW5fZXRoX3NlbmRfZ3JhdHVpdG91c19hcnAoJnNlbGYtPmRldik7CisjZW5kaWYKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNlbGYtPm9wZW5fd2FpdCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9jbGllbnRfZGlzY29ubmVjdF9pbmRpY2F0aW9uIChoYW5kbGUpCisgKgorICogICAgQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoZSBJclRUUCBsYXllci4gSW5kaWNhdGVzIGEgZGlzY29ubmVjdGlvbiBvZgorICogICAgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIChoYW5kbGUpCisgKi8KK3N0YXRpYyB2b2lkIGlybGFuX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwKKwkJCQkJdm9pZCAqc2FwLCBMTV9SRUFTT04gcmVhc29uLCAKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnVzZXJkYXRhKSAKK3sKKwlzdHJ1Y3QgaXJsYW5fY2IgKnNlbGY7CisJc3RydWN0IHRzYXBfY2IgKnRzYXA7CisKKwlJUkRBX0RFQlVHKDAsICIlcygpLCByZWFzb249JWRcbiIsIF9fRlVOQ1RJT05fXyAsIHJlYXNvbik7CisJCisJc2VsZiA9IChzdHJ1Y3QgaXJsYW5fY2IgKikgaW5zdGFuY2U7CisJdHNhcCA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBzYXA7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsJCisJSVJEQV9BU1NFUlQodHNhcCAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVCh0c2FwLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuOyk7CisJCisJSVJEQV9BU1NFUlQodHNhcCA9PSBzZWxmLT50c2FwX2RhdGEsIHJldHVybjspOworCisJSVJEQV9ERUJVRygyLCAiSXJMQU4sIGRhdGEgY2hhbm5lbCBkaXNjb25uZWN0ZWQgYnkgcGVlciFcbiIpOworCisJLyogU2F2ZSByZWFzb24gc28gd2Uga25vdyBpZiB3ZSBzaG91bGQgdHJ5IHRvIHJlY29ubmVjdCBvciBub3QgKi8KKwlzZWxmLT5kaXNjb25uZWN0X3JlYXNvbiA9IHJlYXNvbjsKKwkKKwlzd2l0Y2ggKHJlYXNvbikgeworCWNhc2UgTE1fVVNFUl9SRVFVRVNUOiAvKiBVc2VyIHJlcXVlc3QgKi8KKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVXNlciByZXF1ZXN0ZWRcbiIsIF9fRlVOQ1RJT05fXyApOworCQlicmVhazsKKwljYXNlIExNX0xBUF9ESVNDT05ORUNUOiAvKiBVbmV4cGVjdGVkIElyTEFQIGRpc2Nvbm5lY3QgKi8KKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5leHBlY3RlZCBJckxBUCBkaXNjb25uZWN0XG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJYnJlYWs7CisJY2FzZSBMTV9DT05ORUNUX0ZBSUxVUkU6IC8qIEZhaWxlZCB0byBlc3RhYmxpc2ggSXJMQVAgY29ubmVjdGlvbiAqLworCQlJUkRBX0RFQlVHKDIsICIlcygpLCBJckxBUCBjb25uZWN0IGZhaWxlZFxuIiwgX19GVU5DVElPTl9fICk7CisJCWJyZWFrOworCWNhc2UgTE1fTEFQX1JFU0VUOiAgLyogSXJMQVAgcmVzZXQgKi8KKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgSXJMQVAgcmVzZXRcbiIsIF9fRlVOQ1RJT05fXyApOworCQlicmVhazsKKwljYXNlIExNX0lOSVRfRElTQ09OTkVDVDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgSXJMTVAgY29ubmVjdCBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0VSUk9SKCIlcygpLCBVbmtub3duIGRpc2Nvbm5lY3QgcmVhc29uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlicmVhazsKKwl9CisJCisJLyogSWYgeW91IHdhbnQgdG8gcGFzcyB0aGUgc2tiIHRvICpib3RoKiBzdGF0ZSBtYWNoaW5lcywgeW91IHdpbGwKKwkgKiBuZWVkIHRvIHNrYl9jbG9uZSgpIGl0LCBzbyB0aGF0IHlvdSBkb24ndCBmcmVlIGl0IHR3aWNlLgorCSAqIEFzIHRoZSBzdGF0ZSBtYWNoaW5lcyBkb24ndCBuZWVkIGl0LCBnaXQgcmlkIG9mIGl0IGhlcmUuLi4KKwkgKiBKZWFuIElJICovCisJaWYgKHVzZXJkYXRhKQorCQlkZXZfa2ZyZWVfc2tiKHVzZXJkYXRhKTsKKworCWlybGFuX2RvX2NsaWVudF9ldmVudChzZWxmLCBJUkxBTl9MTVBfRElTQ09OTkVDVCwgTlVMTCk7CisJaXJsYW5fZG9fcHJvdmlkZXJfZXZlbnQoc2VsZiwgSVJMQU5fTE1QX0RJU0NPTk5FQ1QsIE5VTEwpOworCQorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2VsZi0+b3Blbl93YWl0KTsKK30KKwordm9pZCBpcmxhbl9vcGVuX2RhdGFfdHNhcChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpCit7CisJc3RydWN0IHRzYXBfY2IgKnRzYXA7CisJbm90aWZ5X3Qgbm90aWZ5OworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKKworCS8qIENoZWNrIGlmIGFscmVhZHkgb3BlbiAqLworCWlmIChzZWxmLT50c2FwX2RhdGEpCisJCXJldHVybjsKKworCWlyZGFfbm90aWZ5X2luaXQoJm5vdGlmeSk7CisJCisJbm90aWZ5LmRhdGFfaW5kaWNhdGlvbiAgICAgICA9IGlybGFuX2V0aF9yZWNlaXZlOworCW5vdGlmeS51ZGF0YV9pbmRpY2F0aW9uICAgICAgPSBpcmxhbl9ldGhfcmVjZWl2ZTsKKwlub3RpZnkuY29ubmVjdF9pbmRpY2F0aW9uICAgID0gaXJsYW5fY29ubmVjdF9pbmRpY2F0aW9uOworCW5vdGlmeS5jb25uZWN0X2NvbmZpcm0gICAgICAgPSBpcmxhbl9jb25uZWN0X2NvbmZpcm07CisgCW5vdGlmeS5mbG93X2luZGljYXRpb24gICAgICAgPSBpcmxhbl9ldGhfZmxvd19pbmRpY2F0aW9uOworCW5vdGlmeS5kaXNjb25uZWN0X2luZGljYXRpb24gPSBpcmxhbl9kaXNjb25uZWN0X2luZGljYXRpb247CisJbm90aWZ5Lmluc3RhbmNlICAgICAgICAgICAgICA9IHNlbGY7CisJc3RybGNweShub3RpZnkubmFtZSwgIklyTEFOIGRhdGEiLCBzaXplb2Yobm90aWZ5Lm5hbWUpKTsKKworCXRzYXAgPSBpcnR0cF9vcGVuX3RzYXAoTFNBUF9BTlksIERFRkFVTFRfSU5JVElBTF9DUkVESVQsICZub3RpZnkpOworCWlmICghdHNhcCkgeworCQlJUkRBX0RFQlVHKDIsICIlcygpLCBHb3Qgbm8gdHNhcCFcbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm47CisJfQorCXNlbGYtPnRzYXBfZGF0YSA9IHRzYXA7CisKKwkvKiAKKwkgKiAgVGhpcyBpcyB0aGUgZGF0YSBUU0FQIHNlbGVjdG9yIHdoaWNoIHdlIHdpbGwgcGFzcyB0byB0aGUgY2xpZW50CisJICogIHdoZW4gdGhlIGNsaWVudCBhc2sgZm9yIGl0LgorCSAqLworCXNlbGYtPnN0c2FwX3NlbF9kYXRhID0gc2VsZi0+dHNhcF9kYXRhLT5zdHNhcF9zZWw7Cit9CisKK3ZvaWQgaXJsYW5fY2xvc2VfdHNhcHMoc3RydWN0IGlybGFuX2NiICpzZWxmKQoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CisKKwkvKiBEaXNjb25uZWN0IGFuZCBjbG9zZSBhbGwgb3BlbiBUU0FQIGNvbm5lY3Rpb25zICovCisJaWYgKHNlbGYtPnRzYXBfZGF0YSkgeworCQlpcnR0cF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZi0+dHNhcF9kYXRhLCBOVUxMLCBQX05PUk1BTCk7CisJCWlydHRwX2Nsb3NlX3RzYXAoc2VsZi0+dHNhcF9kYXRhKTsKKwkJc2VsZi0+dHNhcF9kYXRhID0gTlVMTDsKKwl9CisJaWYgKHNlbGYtPmNsaWVudC50c2FwX2N0cmwpIHsKKwkJaXJ0dHBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYtPmNsaWVudC50c2FwX2N0cmwsIE5VTEwsIAorCQkJCQkgUF9OT1JNQUwpOworCQlpcnR0cF9jbG9zZV90c2FwKHNlbGYtPmNsaWVudC50c2FwX2N0cmwpOworCQlzZWxmLT5jbGllbnQudHNhcF9jdHJsID0gTlVMTDsKKwl9CisJaWYgKHNlbGYtPnByb3ZpZGVyLnRzYXBfY3RybCkgeworCQlpcnR0cF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZi0+cHJvdmlkZXIudHNhcF9jdHJsLCBOVUxMLCAKKwkJCQkJIFBfTk9STUFMKTsKKwkJaXJ0dHBfY2xvc2VfdHNhcChzZWxmLT5wcm92aWRlci50c2FwX2N0cmwpOworCQlzZWxmLT5wcm92aWRlci50c2FwX2N0cmwgPSBOVUxMOworCX0KKwlzZWxmLT5kaXNjb25uZWN0X3JlYXNvbiA9IExNX1VTRVJfUkVRVUVTVDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2lhc19yZWdpc3RlciAoc2VsZiwgdHNhcF9zZWwpCisgKgorICogICAgUmVnaXN0ZXIgd2l0aCBMTS1JQVMKKyAqCisgKi8KK3ZvaWQgaXJsYW5faWFzX3JlZ2lzdGVyKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgX191OCB0c2FwX3NlbCkKK3sKKwlzdHJ1Y3QgaWFzX29iamVjdCAqb2JqOworCXN0cnVjdCBpYXNfdmFsdWUgKm5ld192YWx1ZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOworCQorCS8qIAorCSAqIENoZWNrIGlmIG9iamVjdCBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgYnkgYSBwcmV2aW91cyBwcm92aWRlci4KKwkgKiBJZiB0aGF0IGlzIHRoZSBjYXNlLCB3ZSBqdXN0IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZQorCSAqLworCWlmICghaXJpYXNfZmluZF9vYmplY3QoIklyTEFOIikpIHsKKwkJb2JqID0gaXJpYXNfbmV3X29iamVjdCgiSXJMQU4iLCBJQVNfSVJMQU5fSUQpOworCQlpcmlhc19hZGRfaW50ZWdlcl9hdHRyaWIob2JqLCAiSXJEQTpUaW55VFA6THNhcFNlbCIsIHRzYXBfc2VsLAorCQkJCQkgSUFTX0tFUk5FTF9BVFRSKTsKKwkJaXJpYXNfaW5zZXJ0X29iamVjdChvYmopOworCX0gZWxzZSB7CisJCW5ld192YWx1ZSA9IGlyaWFzX25ld19pbnRlZ2VyX3ZhbHVlKHRzYXBfc2VsKTsKKwkJaXJpYXNfb2JqZWN0X2NoYW5nZV9hdHRyaWJ1dGUoIklyTEFOIiwgIklyREE6VGlueVRQOkxzYXBTZWwiLAorCQkJCQkgICAgICBuZXdfdmFsdWUpOworCX0KKwkKKyAgICAgICAgLyogUmVnaXN0ZXIgUG5QIG9iamVjdCBvbmx5IGlmIG5vdCByZWdpc3RlcmVkIGJlZm9yZSAqLworICAgICAgICBpZiAoIWlyaWFzX2ZpbmRfb2JqZWN0KCJQblAiKSkgeworCQlvYmogPSBpcmlhc19uZXdfb2JqZWN0KCJQblAiLCBJQVNfUE5QX0lEKTsKKyNpZiAwCisJCWlyaWFzX2FkZF9zdHJpbmdfYXR0cmliKG9iaiwgIk5hbWUiLCBzeXNjdGxfZGV2bmFtZSwKKwkJCQkJSUFTX0tFUk5FTF9BVFRSKTsKKyNlbHNlCisJCWlyaWFzX2FkZF9zdHJpbmdfYXR0cmliKG9iaiwgIk5hbWUiLCAiTGludXgiLCBJQVNfS0VSTkVMX0FUVFIpOworI2VuZGlmCisJCWlyaWFzX2FkZF9zdHJpbmdfYXR0cmliKG9iaiwgIkRldmljZUlEIiwgIkhXUDE5RjAiLAorCQkJCQlJQVNfS0VSTkVMX0FUVFIpOworCQlpcmlhc19hZGRfaW50ZWdlcl9hdHRyaWIob2JqLCAiQ29tcENudCIsIDEsIElBU19LRVJORUxfQVRUUik7CisJCWlmIChzZWxmLT5wcm92aWRlci5hY2Nlc3NfdHlwZSA9PSBBQ0NFU1NfUEVFUikKKwkJCWlyaWFzX2FkZF9zdHJpbmdfYXR0cmliKG9iaiwgIkNvbXAjMDEiLCAiUE5QODM4OSIsCisJCQkJCQlJQVNfS0VSTkVMX0FUVFIpOworCQllbHNlCisJCQlpcmlhc19hZGRfc3RyaW5nX2F0dHJpYihvYmosICJDb21wIzAxIiwgIlBOUDgyOTQiLAorCQkJCQkJSUFTX0tFUk5FTF9BVFRSKTsKKworCQlpcmlhc19hZGRfc3RyaW5nX2F0dHJpYihvYmosICJNYW51ZmFjdHVyZXIiLAorCQkJCQkiTGludXgtSXJEQSBQcm9qZWN0IiwgSUFTX0tFUk5FTF9BVFRSKTsKKwkJaXJpYXNfaW5zZXJ0X29iamVjdChvYmopOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX3J1bl9jdHJsX3R4X3F1ZXVlIChzZWxmKQorICoKKyAqICAgIFRyeSB0byBzZW5kIHRoZSBuZXh0IGNvbW1hbmQgaW4gdGhlIGNvbnRyb2wgdHJhbnNtaXQgcXVldWUKKyAqCisgKi8KK2ludCBpcmxhbl9ydW5fY3RybF90eF9xdWV1ZShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJaWYgKGlyZGFfbG9jaygmc2VsZi0+Y2xpZW50LnR4X2J1c3kpID09IEZBTFNFKQorCQlyZXR1cm4gLUVCVVNZOworCisJc2tiID0gc2tiX2RlcXVldWUoJnNlbGYtPmNsaWVudC50eHEpOworCWlmICghc2tiKSB7CisJCXNlbGYtPmNsaWVudC50eF9idXN5ID0gRkFMU0U7CisJCXJldHVybiAwOworCX0KKwkKKwkvKiBDaGVjayB0aGF0IGl0J3MgcmVhbGx5IHBvc3NpYmxlIHRvIHNlbmQgY29tbWFuZHMgKi8KKwlpZiAoKHNlbGYtPmNsaWVudC50c2FwX2N0cmwgPT0gTlVMTCkgfHwgCisJICAgIChzZWxmLT5jbGllbnQuc3RhdGUgPT0gSVJMQU5fSURMRSkpIAorCXsKKwkJc2VsZi0+Y2xpZW50LnR4X2J1c3kgPSBGQUxTRTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLTE7CisJfQorCUlSREFfREVCVUcoMiwgIiVzKCksIHNlbmRpbmcgLi4uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCXJldHVybiBpcnR0cF9kYXRhX3JlcXVlc3Qoc2VsZi0+Y2xpZW50LnRzYXBfY3RybCwgc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2N0cmxfZGF0YV9yZXF1ZXN0IChzZWxmLCBza2IpCisgKgorICogICAgVGhpcyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoYXQgY29tbWFuZHMgb24gdGhlIGNvbnRyb2wgY2hhbm5lbCBpcyBiZWluZworICogICAgc2VudCBpbiBhIGNvbW1hbmQvcmVzcG9uc2UgZmFzaGlvbgorICovCitzdGF0aWMgdm9pZCBpcmxhbl9jdHJsX2RhdGFfcmVxdWVzdChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwkvKiBRdWV1ZSBjb21tYW5kICovCisJc2tiX3F1ZXVlX3RhaWwoJnNlbGYtPmNsaWVudC50eHEsIHNrYik7CisKKwkvKiBUcnkgdG8gc2VuZCBjb21tYW5kICovCisJaXJsYW5fcnVuX2N0cmxfdHhfcXVldWUoc2VsZik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9nZXRfcHJvdmlkZXJfaW5mbyAoc2VsZikKKyAqCisgKiAgICBTZW5kIEdldCBQcm92aWRlciBJbmZvcm1hdGlvbiBjb21tYW5kIHRvIHBlZXIgSXJMQU4gbGF5ZXIKKyAqCisgKi8KK3ZvaWQgaXJsYW5fZ2V0X3Byb3ZpZGVyX2luZm8oc3RydWN0IGlybGFuX2NiICpzZWxmKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJX191OCAqZnJhbWU7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKKworCXNrYiA9IGRldl9hbGxvY19za2IoNjQpOworCWlmICghc2tiKQorCQlyZXR1cm47CisKKwkvKiBSZXNlcnZlIHNwYWNlIGZvciBUVFAsIExNUCwgYW5kIExBUCBoZWFkZXIgKi8KKwlza2JfcmVzZXJ2ZShza2IsIHNlbGYtPmNsaWVudC5tYXhfaGVhZGVyX3NpemUpOworCXNrYl9wdXQoc2tiLCAyKTsKKwkKKwlmcmFtZSA9IHNrYi0+ZGF0YTsKKwkKKyAJZnJhbWVbMF0gPSBDTURfR0VUX1BST1ZJREVSX0lORk87CisJZnJhbWVbMV0gPSAweDAwOyAgICAgICAgICAgICAgICAgLyogWmVybyBwYXJhbWV0ZXJzICovCisJCisJaXJsYW5fY3RybF9kYXRhX3JlcXVlc3Qoc2VsZiwgc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX29wZW5fZGF0YV9jaGFubmVsIChzZWxmKQorICoKKyAqICAgIFNlbmQgYW4gT3BlbiBEYXRhIENvbW1hbmQgdG8gcHJvdmlkZXIKKyAqCisgKi8KK3ZvaWQgaXJsYW5fb3Blbl9kYXRhX2NoYW5uZWwoc3RydWN0IGlybGFuX2NiICpzZWxmKSAKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCV9fdTggKmZyYW1lOworCQorCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CisJCisJc2tiID0gZGV2X2FsbG9jX3NrYig2NCk7CisJaWYgKCFza2IpCisJCXJldHVybjsKKworCXNrYl9yZXNlcnZlKHNrYiwgc2VsZi0+Y2xpZW50Lm1heF9oZWFkZXJfc2l6ZSk7CisJc2tiX3B1dChza2IsIDIpOworCQorCWZyYW1lID0gc2tiLT5kYXRhOworCQorCS8qIEJ1aWxkIGZyYW1lICovCisgCWZyYW1lWzBdID0gQ01EX09QRU5fREFUQV9DSEFOTkVMOworCWZyYW1lWzFdID0gMHgwMjsgLyogVHdvIHBhcmFtZXRlcnMgKi8KKworCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiTUVESUEiLCAiODAyLjMiKTsKKwlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkFDQ0VTU19UWVBFIiwgIkRJUkVDVCIpOworCS8qIGlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiTU9ERSIsICJVTlJFTElBQkxFIik7ICovCisKKy8qIAlzZWxmLT51c2VfdWRhdGEgPSBUUlVFOyAqLworCisJaXJsYW5fY3RybF9kYXRhX3JlcXVlc3Qoc2VsZiwgc2tiKTsKK30KKwordm9pZCBpcmxhbl9jbG9zZV9kYXRhX2NoYW5uZWwoc3RydWN0IGlybGFuX2NiICpzZWxmKSAKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCV9fdTggKmZyYW1lOworCQorCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CisKKwkvKiBDaGVjayBpZiB0aGUgVFNBUCBpcyBzdGlsbCB0aGVyZSAqLworCWlmIChzZWxmLT5jbGllbnQudHNhcF9jdHJsID09IE5VTEwpCisJCXJldHVybjsKKworCXNrYiA9IGRldl9hbGxvY19za2IoNjQpOworCWlmICghc2tiKQorCQlyZXR1cm47CisKKwlza2JfcmVzZXJ2ZShza2IsIHNlbGYtPmNsaWVudC5tYXhfaGVhZGVyX3NpemUpOworCXNrYl9wdXQoc2tiLCAyKTsKKwkKKwlmcmFtZSA9IHNrYi0+ZGF0YTsKKwkKKwkvKiBCdWlsZCBmcmFtZSAqLworIAlmcmFtZVswXSA9IENNRF9DTE9TRV9EQVRBX0NIQU47CisJZnJhbWVbMV0gPSAweDAxOyAvKiBUd28gcGFyYW1ldGVycyAqLworCisJaXJsYW5faW5zZXJ0X2J5dGVfcGFyYW0oc2tiLCAiREFUQV9DSEFOIiwgc2VsZi0+ZHRzYXBfc2VsX2RhdGEpOworCisJaXJsYW5fY3RybF9kYXRhX3JlcXVlc3Qoc2VsZiwgc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX29wZW5fdW5pY2FzdF9hZGRyIChzZWxmKQorICoKKyAqICAgIE1ha2UgSXJMQU4gcHJvdmlkZXIgYWNjZXB0IGV0aGVybmV0IGZyYW1lcyBhZGRyZXNzZWQgdG8gdGhlIHVuaWNhc3QgCisgKiAgICBhZGRyZXNzLgorICoKKyAqLworc3RhdGljIHZvaWQgaXJsYW5fb3Blbl91bmljYXN0X2FkZHIoc3RydWN0IGlybGFuX2NiICpzZWxmKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJX191OCAqZnJhbWU7CisJCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsJCisJCisJc2tiID0gZGV2X2FsbG9jX3NrYigxMjgpOworCWlmICghc2tiKQorCQlyZXR1cm47CisKKwkvKiBSZXNlcnZlIHNwYWNlIGZvciBUVFAsIExNUCwgYW5kIExBUCBoZWFkZXIgKi8KKwlza2JfcmVzZXJ2ZShza2IsIHNlbGYtPm1heF9oZWFkZXJfc2l6ZSk7CisJc2tiX3B1dChza2IsIDIpOworCQorCWZyYW1lID0gc2tiLT5kYXRhOworCQorIAlmcmFtZVswXSA9IENNRF9GSUxURVJfT1BFUkFUSU9OOworCWZyYW1lWzFdID0gMHgwMzsgICAgICAgICAgICAgICAgIC8qIFRocmVlIHBhcmFtZXRlcnMgKi8KKyAJaXJsYW5faW5zZXJ0X2J5dGVfcGFyYW0oc2tiLCAiREFUQV9DSEFOIiAsIHNlbGYtPmR0c2FwX3NlbF9kYXRhKTsKKyAJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfVFlQRSIsICJESVJFQ1RFRCIpOworIAlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkZJTFRFUl9NT0RFIiwgIkZJTFRFUiIpOyAKKwkKKwlpcmxhbl9jdHJsX2RhdGFfcmVxdWVzdChzZWxmLCBza2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fc2V0X2Jyb2FkY2FzdF9maWx0ZXIgKHNlbGYsIHN0YXR1cykKKyAqCisgKiAgICBNYWtlIElyTEFOIHByb3ZpZGVyIGFjY2VwdCBldGhlcm5ldCBmcmFtZXMgYWRkcmVzc2VkIHRvIHRoZSBicm9hZGNhc3QKKyAqICAgIGFkZHJlc3MuIEJlIGNhcmVmdWwgd2l0aCB0aGUgdXNlIG9mIHRoaXMgb25lLCBzaW5jZSB0aGVyZSBtYXkgYmUgYSBsb3QKKyAqICAgIG9mIGJyb2FkY2FzdCB0cmFmZmljIG91dCB0aGVyZS4gV2UgY2FuIHN0aWxsIGZ1bmN0aW9uIHdpdGhvdXQgdGhpcworICogICAgb25lIGJ1dCB0aGVuIF93ZV8gaGF2ZSB0byBpbml0aWF0ZSBhbGwgY29tbXVuaWNhdGlvbiB3aXRoIG90aGVyCisgKiAgICBob3N0cywgc2luY2UgQVJQIHJlcXVlc3QgZm9yIHRoaXMgaG9zdCB3aWxsIG5vdCBiZSBhbnN3ZXJlZC4KKyAqLwordm9pZCBpcmxhbl9zZXRfYnJvYWRjYXN0X2ZpbHRlcihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIGludCBzdGF0dXMpIAoreworCXN0cnVjdCBza19idWZmICpza2I7CisJX191OCAqZnJhbWU7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKKwkKKyAJc2tiID0gZGV2X2FsbG9jX3NrYigxMjgpOworCWlmICghc2tiKQorCQlyZXR1cm47CisKKwkvKiBSZXNlcnZlIHNwYWNlIGZvciBUVFAsIExNUCwgYW5kIExBUCBoZWFkZXIgKi8KKwlza2JfcmVzZXJ2ZShza2IsIHNlbGYtPmNsaWVudC5tYXhfaGVhZGVyX3NpemUpOworCXNrYl9wdXQoc2tiLCAyKTsKKwkKKwlmcmFtZSA9IHNrYi0+ZGF0YTsKKwkKKyAJZnJhbWVbMF0gPSBDTURfRklMVEVSX09QRVJBVElPTjsKKwlmcmFtZVsxXSA9IDB4MDM7ICAgICAgICAgICAgICAgICAvKiBUaHJlZSBwYXJhbWV0ZXJzICovCisgCWlybGFuX2luc2VydF9ieXRlX3BhcmFtKHNrYiwgIkRBVEFfQ0hBTiIsIHNlbGYtPmR0c2FwX3NlbF9kYXRhKTsKKyAJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfVFlQRSIsICJCUk9BRENBU1QiKTsKKwlpZiAoc3RhdHVzKQorCQlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkZJTFRFUl9NT0RFIiwgIkZJTFRFUiIpOyAKKwllbHNlCisJCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX01PREUiLCAiTk9ORSIpOyAKKworCWlybGFuX2N0cmxfZGF0YV9yZXF1ZXN0KHNlbGYsIHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9zZXRfbXVsdGljYXN0X2ZpbHRlciAoc2VsZiwgc3RhdHVzKQorICoKKyAqICAgIE1ha2UgSXJMQU4gcHJvdmlkZXIgYWNjZXB0IGV0aGVybmV0IGZyYW1lcyBhZGRyZXNzZWQgdG8gdGhlIG11bHRpY2FzdAorICogICAgYWRkcmVzcy4gCisgKgorICovCit2b2lkIGlybGFuX3NldF9tdWx0aWNhc3RfZmlsdGVyKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgaW50IHN0YXR1cykgCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlfX3U4ICpmcmFtZTsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOworCisgCXNrYiA9IGRldl9hbGxvY19za2IoMTI4KTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuOworCQorCS8qIFJlc2VydmUgc3BhY2UgZm9yIFRUUCwgTE1QLCBhbmQgTEFQIGhlYWRlciAqLworCXNrYl9yZXNlcnZlKHNrYiwgc2VsZi0+Y2xpZW50Lm1heF9oZWFkZXJfc2l6ZSk7CisJc2tiX3B1dChza2IsIDIpOworCQorCWZyYW1lID0gc2tiLT5kYXRhOworCQorIAlmcmFtZVswXSA9IENNRF9GSUxURVJfT1BFUkFUSU9OOworCWZyYW1lWzFdID0gMHgwMzsgICAgICAgICAgICAgICAgIC8qIFRocmVlIHBhcmFtZXRlcnMgKi8KKyAJaXJsYW5faW5zZXJ0X2J5dGVfcGFyYW0oc2tiLCAiREFUQV9DSEFOIiwgc2VsZi0+ZHRzYXBfc2VsX2RhdGEpOworIAlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkZJTFRFUl9UWVBFIiwgIk1VTFRJQ0FTVCIpOworCWlmIChzdGF0dXMpCisJCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX01PREUiLCAiQUxMIik7IAorCWVsc2UKKwkJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfTU9ERSIsICJOT05FIik7IAorCisJaXJsYW5fY3RybF9kYXRhX3JlcXVlc3Qoc2VsZiwgc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2dldF91bmljYXN0X2FkZHIgKHNlbGYpCisgKgorICogICAgUmV0cmlldmVzIHRoZSB1bmljYXN0IGFkZHJlc3MgZnJvbSB0aGUgSXJMQU4gcHJvdmlkZXIuIFRoaXMgYWRkcmVzcworICogICAgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBkZXZpY2VzIHN0cnVjdHVyZSwgc28gdGhlIGV0aGVybmV0IGxheWVyCisgKiAgICBjYW4gY29uc3RydWN0IGl0cyBwYWNrZXRzLgorICoKKyAqLworc3RhdGljIHZvaWQgaXJsYW5fZ2V0X3VuaWNhc3RfYWRkcihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlfX3U4ICpmcmFtZTsKKwkJCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKKwkKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKDEyOCk7CisJaWYgKCFza2IpCisJCXJldHVybjsKKworCS8qIFJlc2VydmUgc3BhY2UgZm9yIFRUUCwgTE1QLCBhbmQgTEFQIGhlYWRlciAqLworCXNrYl9yZXNlcnZlKHNrYiwgc2VsZi0+Y2xpZW50Lm1heF9oZWFkZXJfc2l6ZSk7CisJc2tiX3B1dChza2IsIDIpOworCQorCWZyYW1lID0gc2tiLT5kYXRhOworCQorIAlmcmFtZVswXSA9IENNRF9GSUxURVJfT1BFUkFUSU9OOworCWZyYW1lWzFdID0gMHgwMzsgICAgICAgICAgICAgICAgIC8qIFRocmVlIHBhcmFtZXRlcnMgKi8KKyAJaXJsYW5faW5zZXJ0X2J5dGVfcGFyYW0oc2tiLCAiREFUQV9DSEFOIiwgc2VsZi0+ZHRzYXBfc2VsX2RhdGEpOworIAlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkZJTFRFUl9UWVBFIiwgIkRJUkVDVEVEIik7CisgCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX09QRVJBVElPTiIsICJEWU5BTUlDIik7IAorCQorCWlybGFuX2N0cmxfZGF0YV9yZXF1ZXN0KHNlbGYsIHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9nZXRfbWVkaWFfY2hhciAoc2VsZikKKyAqCisgKiAgICAKKyAqCisgKi8KK3ZvaWQgaXJsYW5fZ2V0X21lZGlhX2NoYXIoc3RydWN0IGlybGFuX2NiICpzZWxmKSAKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCV9fdTggKmZyYW1lOworCQorCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CisJCisJc2tiID0gZGV2X2FsbG9jX3NrYig2NCk7CisJaWYgKCFza2IpCisJCXJldHVybjsKKworCS8qIFJlc2VydmUgc3BhY2UgZm9yIFRUUCwgTE1QLCBhbmQgTEFQIGhlYWRlciAqLworCXNrYl9yZXNlcnZlKHNrYiwgc2VsZi0+Y2xpZW50Lm1heF9oZWFkZXJfc2l6ZSk7CisJc2tiX3B1dChza2IsIDIpOworCQorCWZyYW1lID0gc2tiLT5kYXRhOworCQorCS8qIEJ1aWxkIGZyYW1lICovCisgCWZyYW1lWzBdID0gQ01EX0dFVF9NRURJQV9DSEFSOworCWZyYW1lWzFdID0gMHgwMTsgLyogT25lIHBhcmFtZXRlciAqLworCQorCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiTUVESUEiLCAiODAyLjMiKTsKKwlpcmxhbl9jdHJsX2RhdGFfcmVxdWVzdChzZWxmLCBza2IpOworfQorCisvKgorICogRnVuY3Rpb24gaW5zZXJ0X2J5dGVfcGFyYW0gKHNrYiwgcGFyYW0sIHZhbHVlKQorICoKKyAqICAgIEluc2VydCBieXRlIHBhcmFtZXRlciBpbnRvIGZyYW1lCisgKgorICovCitpbnQgaXJsYW5faW5zZXJ0X2J5dGVfcGFyYW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgY2hhciAqcGFyYW0sIF9fdTggdmFsdWUpCit7CisJcmV0dXJuIF9faXJsYW5faW5zZXJ0X3BhcmFtKHNrYiwgcGFyYW0sIElSTEFOX0JZVEUsIHZhbHVlLCAwLCBOVUxMLCAwKTsKK30KKworaW50IGlybGFuX2luc2VydF9zaG9ydF9wYXJhbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjaGFyICpwYXJhbSwgX191MTYgdmFsdWUpCit7CisJcmV0dXJuIF9faXJsYW5faW5zZXJ0X3BhcmFtKHNrYiwgcGFyYW0sIElSTEFOX1NIT1JULCAwLCB2YWx1ZSwgTlVMTCwgMCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpbnNlcnRfc3RyaW5nIChza2IsIHBhcmFtLCB2YWx1ZSkKKyAqCisgKiAgICBJbnNlcnQgc3RyaW5nIHBhcmFtZXRlciBpbnRvIGZyYW1lCisgKgorICovCitpbnQgaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjaGFyICpwYXJhbSwgY2hhciAqc3RyaW5nKQoreworCWludCBzdHJpbmdfbGVuID0gc3RybGVuKHN0cmluZyk7CisKKwlyZXR1cm4gX19pcmxhbl9pbnNlcnRfcGFyYW0oc2tiLCBwYXJhbSwgSVJMQU5fQVJSQVksIDAsIDAsIHN0cmluZywgCisJCQkJICAgIHN0cmluZ19sZW4pOworfQorCisvKgorICogRnVuY3Rpb24gaW5zZXJ0X2FycmF5X3BhcmFtKHNrYiwgcGFyYW0sIHZhbHVlLCBsZW5fdmFsdWUpCisgKgorICogICAgSW5zZXJ0IGFycmF5IHBhcmFtZXRlciBpbnRvIGZyYW1lCisgKgorICovCitpbnQgaXJsYW5faW5zZXJ0X2FycmF5X3BhcmFtKHN0cnVjdCBza19idWZmICpza2IsIGNoYXIgKm5hbWUsIF9fdTggKmFycmF5LAorCQkJICAgICBfX3UxNiBhcnJheV9sZW4pCit7CisJcmV0dXJuIF9faXJsYW5faW5zZXJ0X3BhcmFtKHNrYiwgbmFtZSwgSVJMQU5fQVJSQVksIDAsIDAsIGFycmF5LCAKKwkJCQkgICAgYXJyYXlfbGVuKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGluc2VydF9wYXJhbSAoc2tiLCBwYXJhbSwgdmFsdWUsIGJ5dGUpCisgKgorICogICAgSW5zZXJ0IHBhcmFtZXRlciBhdCBlbmQgb2YgYnVmZmVyLCBzdHJ1Y3R1cmUgb2YgYSBwYXJhbWV0ZXIgaXM6CisgKgorICogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgIHwgTmFtZSBMZW5ndGhbMV0gfCBQYXJhbSBOYW1lWzEuLjI1NV0gfCBWYWwgTGVuZ3RoWzJdIHwgVmFsdWVbMC4uMTAxNl18CisgKiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50IF9faXJsYW5faW5zZXJ0X3BhcmFtKHN0cnVjdCBza19idWZmICpza2IsIGNoYXIgKnBhcmFtLCBpbnQgdHlwZSwgCisJCQkJX191OCB2YWx1ZV9ieXRlLCBfX3UxNiB2YWx1ZV9zaG9ydCwgCisJCQkJX191OCAqdmFsdWVfYXJyYXksIF9fdTE2IHZhbHVlX2xlbikKK3sKKwlfX3U4ICpmcmFtZTsKKwlfX3U4IHBhcmFtX2xlbjsKKwlfX3UxNiB0bXBfbGU7IC8qIFRlbXBvcmFyeSB2YWx1ZSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCAqLworCWludCBuPTA7CisJCisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCUlSREFfREVCVUcoMiwgIiVzKCksIEdvdCBOVUxMIHNrYlxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiAwOworCX0JCisKKwlwYXJhbV9sZW4gPSBzdHJsZW4ocGFyYW0pOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSVJMQU5fQllURToKKwkJdmFsdWVfbGVuID0gMTsKKwkJYnJlYWs7CisJY2FzZSBJUkxBTl9TSE9SVDoKKwkJdmFsdWVfbGVuID0gMjsKKwkJYnJlYWs7CisJY2FzZSBJUkxBTl9BUlJBWToKKwkJSVJEQV9BU1NFUlQodmFsdWVfYXJyYXkgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKwkJSVJEQV9BU1NFUlQodmFsdWVfbGVuID4gMCwgcmV0dXJuIDA7KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5rbm93biBwYXJhbWV0ZXIgdHlwZSFcbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJfQorCQorCS8qIEluc2VydCBhdCBlbmQgb2Ygc2stYnVmZmVyICovCisJZnJhbWUgPSBza2ItPnRhaWw7CisKKwkvKiBNYWtlIHNwYWNlIGZvciBkYXRhICovCisJaWYgKHNrYl90YWlscm9vbShza2IpIDwgKHBhcmFtX2xlbit2YWx1ZV9sZW4rMykpIHsKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgTm8gbW9yZSBzcGFjZSBhdCBlbmQgb2Ygc2tiXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIDA7CisJfQkKKwlza2JfcHV0KHNrYiwgcGFyYW1fbGVuK3ZhbHVlX2xlbiszKTsKKwkKKwkvKiBJbnNlcnQgcGFyYW1ldGVyIGxlbmd0aCAqLworCWZyYW1lW24rK10gPSBwYXJhbV9sZW47CisJCisJLyogSW5zZXJ0IHBhcmFtZXRlciAqLworCW1lbWNweShmcmFtZStuLCBwYXJhbSwgcGFyYW1fbGVuKTsgbiArPSBwYXJhbV9sZW47CisJCisJLyogSW5zZXJ0IHZhbHVlIGxlbmd0aCAoMiBieXRlIGxpdHRsZSBlbmRpYW4gZm9ybWF0LCBMU0IgZmlyc3QpICovCisJdG1wX2xlID0gY3B1X3RvX2xlMTYodmFsdWVfbGVuKTsKKwltZW1jcHkoZnJhbWUrbiwgJnRtcF9sZSwgMik7IG4gKz0gMjsgLyogVG8gYXZvaWQgYWxpZ25tZW50IHByb2JsZW1zICovCisKKwkvKiBJbnNlcnQgdmFsdWUgKi8KKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElSTEFOX0JZVEU6CisJCWZyYW1lW24rK10gPSB2YWx1ZV9ieXRlOworCQlicmVhazsKKwljYXNlIElSTEFOX1NIT1JUOgorCQl0bXBfbGUgPSBjcHVfdG9fbGUxNih2YWx1ZV9zaG9ydCk7CisJCW1lbWNweShmcmFtZStuLCAmdG1wX2xlLCAyKTsgbiArPSAyOworCQlicmVhazsKKwljYXNlIElSTEFOX0FSUkFZOgorCQltZW1jcHkoZnJhbWUrbiwgdmFsdWVfYXJyYXksIHZhbHVlX2xlbik7IG4rPXZhbHVlX2xlbjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCUlSREFfQVNTRVJUKG4gPT0gKHBhcmFtX2xlbit2YWx1ZV9sZW4rMyksIHJldHVybiAwOyk7CisKKwlyZXR1cm4gcGFyYW1fbGVuK3ZhbHVlX2xlbiszOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fZXh0cmFjdF9wYXJhbSAoYnVmLCBuYW1lLCB2YWx1ZSwgbGVuKQorICoKKyAqICAgIEV4dHJhY3RzIGEgc2luZ2xlIHBhcmFtZXRlciBuYW1lL3ZhbHVlIHBhaXIgZnJvbSBidWZmZXIgYW5kIHVwZGF0ZXMKKyAqICAgIHRoZSBidWZmZXIgcG9pbnRlciB0byBwb2ludCB0byB0aGUgbmV4dCBuYW1lL3ZhbHVlIHBhaXIuIAorICovCitpbnQgaXJsYW5fZXh0cmFjdF9wYXJhbShfX3U4ICpidWYsIGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlLCBfX3UxNiAqbGVuKQoreworCV9fdTggbmFtZV9sZW47CisJX191MTYgdmFsX2xlbjsKKwlpbnQgbj0wOworCQorCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCQorCS8qIGdldCBsZW5ndGggb2YgcGFyYW1ldGVyIG5hbWUgKDEgYnl0ZSkgKi8KKwluYW1lX2xlbiA9IGJ1ZltuKytdOworCQorCWlmIChuYW1lX2xlbiA+IDI1NCkgeworCQlJUkRBX0RFQlVHKDIsICIlcygpLCBuYW1lX2xlbiA+IDI1NFxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiAtUlNQX0lOVkFMSURfQ09NTUFORF9GT1JNQVQ7CisJfQorCQorCS8qIGdldCBwYXJhbWV0ZXIgbmFtZSAqLworCW1lbWNweShuYW1lLCBidWYrbiwgbmFtZV9sZW4pOworCW5hbWVbbmFtZV9sZW5dID0gJ1wwJzsKKwluKz1uYW1lX2xlbjsKKwkKKwkvKiAgCisJICogIEdldCBsZW5ndGggb2YgcGFyYW1ldGVyIHZhbHVlICgyIGJ5dGVzIGluIGxpdHRsZSBlbmRpYW4gCisJICogIGZvcm1hdCkgCisJICovCisJbWVtY3B5KCZ2YWxfbGVuLCBidWYrbiwgMik7IC8qIFRvIGF2b2lkIGFsaWdubWVudCBwcm9ibGVtcyAqLworCWxlMTZfdG9fY3B1cygmdmFsX2xlbik7IG4rPTI7CisJCisJaWYgKHZhbF9sZW4gPiAxMDE2KSB7CisJCUlSREFfREVCVUcoMiwgIiVzKCksIHBhcmFtZXRlciBsZW5ndGggdG8gbG9uZ1xuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiAtUlNQX0lOVkFMSURfQ09NTUFORF9GT1JNQVQ7CisJfQorCSpsZW4gPSB2YWxfbGVuOworCisJLyogZ2V0IHBhcmFtZXRlciB2YWx1ZSAqLworCW1lbWNweSh2YWx1ZSwgYnVmK24sIHZhbF9sZW4pOworCXZhbHVlW3ZhbF9sZW5dID0gJ1wwJzsKKwluKz12YWxfbGVuOworCQorCUlSREFfREVCVUcoNCwgIlBhcmFtZXRlcjogJXMgIiwgbmFtZSk7IAorCUlSREFfREVCVUcoNCwgIlZhbHVlOiAlc1xuIiwgdmFsdWUpOyAKKworCXJldHVybiBuOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworLyoKKyAqIFN0YXJ0IG9mIHJlYWRpbmcgL3Byb2MgZW50cmllcy4KKyAqIFJldHVybiBlbnRyeSBhdCBwb3MsIAorICoJb3Igc3RhcnRfdG9rZW4gdG8gaW5kaWNhdGUgcHJpbnQgaGVhZGVyIGxpbmUKKyAqCW9yIE5VTEwgaWYgZW5kIG9mIGZpbGUKKyAqLworc3RhdGljIHZvaWQgKmlybGFuX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJaW50IGkgPSAxOworCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlpZiAoKnBvcyA9PSAwKQorCQlyZXR1cm4gU0VRX1NUQVJUX1RPS0VOOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZWxmLCAmaXJsYW5zLCBkZXZfbGlzdCkgeworCQlpZiAoKnBvcyA9PSBpKSAKKwkJCXJldHVybiBzZWxmOworCQkrK2k7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBSZXR1cm4gZW50cnkgYWZ0ZXIgdiwgYW5kIGluY3JlbWVudCBwb3MgKi8KK3N0YXRpYyB2b2lkICppcmxhbl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbnh0OworCisJKysqcG9zOworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgCisJCW54dCA9IGlybGFucy5uZXh0OworCWVsc2UKKwkJbnh0ID0gKChzdHJ1Y3QgaXJsYW5fY2IgKil2KS0+ZGV2X2xpc3QubmV4dDsKKworCXJldHVybiAobnh0ID09ICZpcmxhbnMpID8gTlVMTCAKKwkJOiBsaXN0X2VudHJ5KG54dCwgc3RydWN0IGlybGFuX2NiLCBkZXZfbGlzdCk7Cit9CisKKy8qIEVuZCBvZiByZWFkaW5nIC9wcm9jIGZpbGUgKi8KK3N0YXRpYyB2b2lkIGlybGFuX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXJjdV9yZWFkX3VubG9jaygpOworfQorCisKKy8qCisgKiBTaG93IG9uZSBlbnRyeSBpbiAvcHJvYyBmaWxlLgorICovCitzdGF0aWMgaW50IGlybGFuX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKKwkJc2VxX3B1dHMoc2VxLCAiSXJMQU4gaW5zdGFuY2VzOlxuIik7CisJZWxzZSB7CisJCXN0cnVjdCBpcmxhbl9jYiAqc2VsZiA9IHY7CisJCQorCQlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCQlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwkJc2VxX3ByaW50ZihzZXEsImlmbmFtZTogJXMsXG4iLAorCQkJICAgICAgIHNlbGYtPmRldi0+bmFtZSk7CisJCXNlcV9wcmludGYoc2VxLCJjbGllbnQgc3RhdGU6ICVzLCAiLAorCQkJICAgICAgIGlybGFuX3N0YXRlWyBzZWxmLT5jbGllbnQuc3RhdGVdKTsKKwkJc2VxX3ByaW50ZihzZXEsInByb3ZpZGVyIHN0YXRlOiAlcyxcbiIsCisJCQkgICAgICAgaXJsYW5fc3RhdGVbIHNlbGYtPnByb3ZpZGVyLnN0YXRlXSk7CisJCXNlcV9wcmludGYoc2VxLCJzYWRkcjogJSMwOHgsICIsCisJCQkgICAgICAgc2VsZi0+c2FkZHIpOworCQlzZXFfcHJpbnRmKHNlcSwiZGFkZHI6ICUjMDh4XG4iLAorCQkJICAgICAgIHNlbGYtPmRhZGRyKTsKKwkJc2VxX3ByaW50ZihzZXEsInZlcnNpb246ICVkLiVkLFxuIiwKKwkJCSAgICAgICBzZWxmLT52ZXJzaW9uWzFdLCBzZWxmLT52ZXJzaW9uWzBdKTsKKwkJc2VxX3ByaW50ZihzZXEsImFjY2VzcyB0eXBlOiAlc1xuIiwgCisJCQkgICAgICAgaXJsYW5fYWNjZXNzW3NlbGYtPmNsaWVudC5hY2Nlc3NfdHlwZV0pOworCQlzZXFfcHJpbnRmKHNlcSwibWVkaWE6ICVzXG4iLCAKKwkJCSAgICAgICBpcmxhbl9tZWRpYVtzZWxmLT5tZWRpYV0pOworCQkKKwkJc2VxX3ByaW50ZihzZXEsImxvY2FsIGZpbHRlcjpcbiIpOworCQlzZXFfcHJpbnRmKHNlcSwicmVtb3RlIGZpbHRlcjogIik7CisJCWlybGFuX3ByaW50X2ZpbHRlcihzZXEsIHNlbGYtPmNsaWVudC5maWx0ZXJfdHlwZSk7CisJCXNlcV9wcmludGYoc2VxLCJ0eCBidXN5OiAlc1xuIiwgCisJCQkgICAgICAgbmV0aWZfcXVldWVfc3RvcHBlZChzZWxmLT5kZXYpID8gIlRSVUUiIDogIkZBTFNFIik7CisJCQkKKwkJc2VxX3B1dGMoc2VxLCdcbicpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBpcmxhbl9zZXFfb3BzID0geworCS5zdGFydCA9IGlybGFuX3NlcV9zdGFydCwKKwkubmV4dCAgPSBpcmxhbl9zZXFfbmV4dCwKKwkuc3RvcCAgPSBpcmxhbl9zZXFfc3RvcCwKKwkuc2hvdyAgPSBpcmxhbl9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgaXJsYW5fc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZpcmxhbl9zZXFfb3BzKTsKK30KKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SKCJEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRoZSBMaW51eCBJckRBIExBTiBwcm90b2NvbCIpOyAKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKGV0aCwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGV0aCwgIk5hbWUgZGV2aWNlcyBldGhYICgwKSBvciBpcmxhblggKDEpIik7Cittb2R1bGVfcGFyYW0oYWNjZXNzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhhY2Nlc3MsICJBY2Nlc3MgdHlwZSBESVJFQ1Q9MSwgUEVFUj0yLCBIT1NURUQ9MyIpOworCittb2R1bGVfaW5pdChpcmxhbl9pbml0KTsKK21vZHVsZV9leGl0KGlybGFuX2NsZWFudXApOworCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmxhbi9pcmxhbl9ldGguYyBiL25ldC9pcmRhL2lybGFuL2lybGFuX2V0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MWNkMmMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9ldGguYwpAQCAtMCwwICsxLDM4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBpcmxhbl9ldGguYworICogVmVyc2lvbjogICAgICAgCisgKiBEZXNjcmlwdGlvbjogICAKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFRodSBPY3QgMTUgMDg6Mzc6NTggMTk5OAorICogTW9kaWZpZWQgYXQ6ICAgVHVlIE1hciAyMSAwOTowNjo0MSAyMDAwCisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBTb3VyY2VzOiAgICAgICBza2VsZXRvbi5jIGJ5IERvbmFsZCBCZWNrZXIgPGJlY2tlckBDRVNESVMuZ3NmYy5uYXNhLmdvdj4KKyAqICAgICAgICAgICAgICAgIHNsaXAuYyBieSBMYXVyZW5jZSBDdWxoYW5lLCAgIDxsb3pAaG9sbWVzLmRlbW9uLmNvLnVrPgorICogICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1d2FsdC5ubC5tdWduZXQub3JnPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgCisgKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAorICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcm1vZC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NvbW1vbi5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NsaWVudC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2V2ZW50Lmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fZXRoLmg+CisKK3N0YXRpYyBpbnQgIGlybGFuX2V0aF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgaXJsYW5fZXRoX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgaXJsYW5fZXRoX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBpcmxhbl9ldGhfc2V0X211bHRpY2FzdF9saXN0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXJsYW5fZXRoX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2V0aF9zZXR1cCAoZGV2KQorICoKKyAqICAgIFRoZSBuZXR3b3JrIGRldmljZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlybGFuX2V0aF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRldi0+b3BlbiAgICAgICAgICAgICAgID0gaXJsYW5fZXRoX29wZW47CisJZGV2LT5zdG9wICAgICAgICAgICAgICAgPSBpcmxhbl9ldGhfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgICAgPSBpcmxhbl9ldGhfeG1pdDsgCisJZGV2LT5nZXRfc3RhdHMJICAgICAgICA9IGlybGFuX2V0aF9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBpcmxhbl9ldGhfc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+ZGVzdHJ1Y3RvcgkJPSBmcmVlX25ldGRldjsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWV0aGVyX3NldHVwKGRldik7CisJCisJLyogCisJICogTGV0cyBkbyBhbGwgcXVldWVpbmcgaW4gSXJUVFAgaW5zdGVhZCBvZiB0aGlzIGRldmljZSBkcml2ZXIuCisJICogUXVldWVpbmcgaGVyZSBhcyB3ZWxsIGNhbiBpbnRyb2R1Y2Ugc29tZSBzdHJhbmdlIGxhdGVuY3kKKwkgKiBwcm9ibGVtcywgd2hpY2ggd2Ugd2lsbCBhdm9pZCBieSBzZXR0aW5nIHRoZSBxdWV1ZSBzaXplIHRvIDAuCisJICovCisJLyoKKwkgKiBUaGUgYnVncyBpbiBJclRUUCBhbmQgSXJMQU4gdGhhdCBjcmVhdGVkIHRoaXMgbGF0ZW5jeSBpc3N1ZQorCSAqIGhhdmUgbm93IGJlZW4gZml4ZWQsIGFuZCB3ZSBjYW4gcHJvcGFnYXRlIGZsb3cgY29udHJvbCBwcm9wZXJseQorCSAqIHRvIHRoZSBuZXR3b3JrIGxheWVyLiBIb3dldmVyLCB0aGlzIHJlcXVpcmVzIGEgbWluaW1hbCBxdWV1ZSBvZgorCSAqIHBhY2tldHMgZm9yIHRoZSBkZXZpY2UuCisJICogV2l0aG91dCBmbG93IGNvbnRyb2wsIHRoZSBUeCBRdWV1ZSBpcyAxNCAodHRwKSArIDAgKGRldikgPSAxNAorCSAqIFdpdGggZmxvdyBjb250cm9sLCB0aGUgVHggUXVldWUgaXMgNyAodHRwKSArIDQgKGRldikgPSAxMQorCSAqIFNlZSBpcmxhbl9ldGhfZmxvd19pbmRpY2F0aW9uKCkuLi4KKwkgKiBOb3RlIDogdGhpcyBudW1iZXIgd2FzIHJhbmRvbWx5IHNlbGVjdGVkIGFuZCB3b3VsZCBuZWVkIHRvCisJICogYmUgYWRqdXN0ZWQuCisJICogSmVhbiBJSSAqLworCWRldi0+dHhfcXVldWVfbGVuID0gNDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFsbG9jX2lybGFuZGV2CisgKgorICogICAgQWxsb2NhdGUgbmV0d29yayBkZXZpY2UgYW5kIGNvbnRyb2wgYmxvY2sKKyAqCisgKi8KK3N0cnVjdCBuZXRfZGV2aWNlICphbGxvY19pcmxhbmRldihjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBpcmxhbl9jYiksIG5hbWUsCisJCQkgICAgaXJsYW5fZXRoX3NldHVwKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2V0aF9vcGVuIChkZXYpCisgKgorICogICAgTmV0d29yayBkZXZpY2UgaGFzIGJlZW4gb3BlbmVkIGJ5IHVzZXIKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJsYW5fZXRoX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJLyogUmVhZHkgdG8gcGxheSEgKi8KKyAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOyAvKiBXYWl0IHVudGlsIGRhdGEgbGluayBpcyByZWFkeSAqLworCisJLyogV2UgYXJlIG5vdyBvcGVuLCBzbyB0aW1lIHRvIGRvIHNvbWUgd29yayAqLworCXNlbGYtPmRpc2Nvbm5lY3RfcmVhc29uID0gMDsKKwlpcmxhbl9jbGllbnRfd2FrZXVwKHNlbGYsIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkcik7CisKKwkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIGhhcmR3YXJlIGFkZHJlc3MgYmVmb3JlIHdlIHJldHVybiwgCisJICAgc28gREhDUCBjbGllbnRzIGdldHMgaGFwcHkgKi8KKwlyZXR1cm4gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHNlbGYtPm9wZW5fd2FpdCwKKwkJCQkJIXNlbGYtPnRzYXBfZGF0YS0+Y29ubmVjdGVkKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2V0aF9jbG9zZSAoZGV2KQorICoKKyAqICAgIFN0b3AgdGhlIGV0aGVyIG5ldHdvcmsgZGV2aWNlLCBoaXMgZnVuY3Rpb24gd2lsbCB1c3VhbGx5IGJlIGNhbGxlZCBieQorICogICAgaWZjb25maWcgZG93bi4gV2Ugc2hvdWxkIG5vdyBkaXNjb25uZWN0IHRoZSBsaW5rLCBXZSBzdGFydCB0aGUgCisgKiAgICBjbG9zZSB0aW1lciwgc28gdGhhdCB0aGUgaW5zdGFuY2Ugd2lsbCBiZSByZW1vdmVkIGlmIHdlIGFyZSB1bmFibGUKKyAqICAgIHRvIGRpc2NvdmVyIHRoZSByZW1vdGUgZGV2aWNlIGFmdGVyIHRoZSBkaXNjb25uZWN0LgorICovCitzdGF0aWMgaW50IGlybGFuX2V0aF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpcmxhbl9jYiAqc2VsZiA9IG5ldGRldl9wcml2KGRldik7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJLyogU3RvcCBkZXZpY2UgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJaXJsYW5fY2xvc2VfZGF0YV9jaGFubmVsKHNlbGYpOworCWlybGFuX2Nsb3NlX3RzYXBzKHNlbGYpOworCisJaXJsYW5fZG9fY2xpZW50X2V2ZW50KHNlbGYsIElSTEFOX0xNUF9ESVNDT05ORUNULCBOVUxMKTsKKwlpcmxhbl9kb19wcm92aWRlcl9ldmVudChzZWxmLCBJUkxBTl9MTVBfRElTQ09OTkVDVCwgTlVMTCk7CQorCQorCS8qIFJlbW92ZSBmcmFtZXMgcXVldWVkIG9uIHRoZSBjb250cm9sIGNoYW5uZWwgKi8KKwlza2JfcXVldWVfcHVyZ2UoJnNlbGYtPmNsaWVudC50eHEpOworCisJc2VsZi0+Y2xpZW50LnR4X2J1c3kgPSAwOworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fZXRoX3R4IChza2IpCisgKgorICogICAgVHJhbnNtaXRzIGV0aGVybmV0IGZyYW1lcyBvdmVyIElyREEgbGluay4KKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJsYW5fZXRoX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXQ7CisKKwkvKiBza2IgaGVhZHJvb20gbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4gYWxsIElyREEtaGVhZGVycz8gKi8KKwlpZiAoKHNrYl9oZWFkcm9vbShza2IpIDwgc2VsZi0+bWF4X2hlYWRlcl9zaXplKSB8fCAoc2tiX3NoYXJlZChza2IpKSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYiA9IAorCQkJc2tiX3JlYWxsb2NfaGVhZHJvb20oc2tiLCBzZWxmLT5tYXhfaGVhZGVyX3NpemUpOworCisJCS8qICBXZSBoYXZlIHRvIGZyZWUgdGhlIG9yaWdpbmFsIHNrYiBhbnl3YXkgKi8KKwkJZGV2X2tmcmVlX3NrYihza2IpOworCisJCS8qIERpZCB0aGUgcmVhbGxvYyBzdWNjZWVkPyAqLworCQlpZiAobmV3X3NrYiA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisKKwkJLyogVXNlIHRoZSBuZXcgc2tiIGluc3RlYWQgKi8KKwkJc2tiID0gbmV3X3NrYjsKKwl9IAorCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwkvKiBOb3cgcXVldWUgdGhlIHBhY2tldCBpbiB0aGUgdHJhbnNwb3J0IGxheWVyICovCisJaWYgKHNlbGYtPnVzZV91ZGF0YSkKKwkJcmV0ID0gaXJ0dHBfdWRhdGFfcmVxdWVzdChzZWxmLT50c2FwX2RhdGEsIHNrYik7CisJZWxzZQorCQlyZXQgPSBpcnR0cF9kYXRhX3JlcXVlc3Qoc2VsZi0+dHNhcF9kYXRhLCBza2IpOworCisJaWYgKHJldCA8IDApIHsKKwkJLyogICAKKwkJICogSXJUVFBzIHR4IHF1ZXVlIGlzIGZ1bGwsIHNvIHdlIGp1c3QgaGF2ZSB0bworCQkgKiBkcm9wIHRoZSBmcmFtZSEgWW91IG1pZ2h0IHRoaW5rIHRoYXQgd2Ugc2hvdWxkCisJCSAqIGp1c3QgcmV0dXJuIC0xIGFuZCBkb24ndCBkZWFsbG9jYXRlIHRoZSBmcmFtZSwKKwkJICogYnV0IHRoYXQgaXMgZGFuZ2Vyb3VzIHNpbmNlIGl0J3MgcG9zc2libGUgdGhhdAorCQkgKiB3ZSBoYXZlIHJlcGxhY2VkIHRoZSBvcmlnaW5hbCBza2Igd2l0aCBhIG5ldworCQkgKiBvbmUgd2l0aCBsYXJnZXIgaGVhZHJvb20sIGFuZCB0aGF0IHdvdWxkIHJlYWxseQorCQkgKiBjb25mdXNlIGRvX2Rldl9xdWV1ZV94bWl0KCkgaW4gZGV2LmMhIEkgaGF2ZQorCQkgKiB0cmllZCA6LSkgREIgCisJCSAqLworCQkvKiBpcnR0cF9kYXRhX3JlcXVlc3QgYWxyZWFkeSBmcmVlIHRoZSBwYWNrZXQgKi8KKwkJc2VsZi0+c3RhdHMudHhfZHJvcHBlZCsrOworCX0gZWxzZSB7CisJCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47IAorCX0KKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX2V0aF9yZWNlaXZlIChoYW5kbGUsIHNrYikKKyAqCisgKiAgICBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIGRhdGEgdGhhdCBpcyByZWNlaXZlZCBvbiB0aGUgZGF0YSBjaGFubmVsCisgKgorICovCitpbnQgaXJsYW5fZXRoX3JlY2VpdmUodm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYgPSBpbnN0YW5jZTsKKworCWlmIChza2IgPT0gTlVMTCkgeworCQkrK3NlbGYtPnN0YXRzLnJ4X2Ryb3BwZWQ7IAorCQlyZXR1cm4gMDsKKwl9CisJaWYgKHNrYi0+bGVuIDwgRVRIX0hMRU4pIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSA6IElyTEFOIGZyYW1lIHRvbyBzaG9ydCAoJWQpXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBza2ItPmxlbik7CisJCSsrc2VsZi0+c3RhdHMucnhfZHJvcHBlZDsgCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCQkKKwkvKiAKKwkgKiBBZG9wdCB0aGlzIGZyYW1lISBJbXBvcnRhbnQgdG8gc2V0IGFsbCB0aGVzZSBmaWVsZHMgc2luY2UgdGhleSAKKwkgKiBtaWdodCBoYXZlIGJlZW4gcHJldmlvdXNseSBzZXQgYnkgdGhlIGxvdyBsZXZlbCBJckRBIG5ldHdvcmsKKwkgKiBkZXZpY2UgZHJpdmVyIAorCSAqLworCXNrYi0+ZGV2ID0gc2VsZi0+ZGV2OworCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLCBza2ItPmRldik7IC8qIFJlbW92ZSBldGggaGVhZGVyICovCisJCisJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOworCXNlbGYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOyAKKworCW5ldGlmX3J4KHNrYik7ICAgLyogRWF0IGl0ISAqLworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fZXRoX2Zsb3cgKHN0YXR1cykKKyAqCisgKiAgICBEbyBmbG93IGNvbnRyb2wgYmV0d2VlbiBJUC9FdGhlcm5ldCBhbmQgSXJMQU4vSXJUVFAuIFRoaXMgaXMgZG9uZSBieSAKKyAqICAgIGNvbnRyb2xsaW5nIHRoZSBxdWV1ZSBzdG9wL3N0YXJ0LgorICoKKyAqIFRoZSBJckRBIGxpbmsgbGF5ZXIgaGFzIHRoZSBhZHZhbnRhZ2UgdG8gaGF2ZSBmbG93IGNvbnRyb2wsIGFuZAorICogSXJUVFAgbm93IHByb3Blcmx5IGhhbmRsZXMgdGhhdC4gRmxvdyBjb250cm9sbGluZyB0aGUgaGlnaGVyIGxheWVycworICogcHJldmVudCB1cyB0byBkcm9wIFR4IHBhY2tldHMgaW4gaGVyZSAodXAgdG8gMTUlIGZvciBhIFRDUCBzb2NrZXQsCisgKiBtb3JlIGZvciBVRFAgc29ja2V0KS4KKyAqIEFsc28sIHRoaXMgYWxsb3cgdXMgdG8gcmVkdWNlIHRoZSBvdmVyYWxsIHRyYW5zbWl0IHF1ZXVlLCB3aGljaCBtZWFucworICogbGVzcyBsYXRlbmN5IGluIGNhc2Ugb2YgbWl4ZWQgdHJhZmZpYy4KKyAqIEplYW4gSUkKKyAqLwordm9pZCBpcmxhbl9ldGhfZmxvd19pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIExPQ0FMX0ZMT1cgZmxvdykKK3sKKwlzdHJ1Y3QgaXJsYW5fY2IgKnNlbGY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCXNlbGYgPSAoc3RydWN0IGlybGFuX2NiICopIGluc3RhbmNlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CisJCisJZGV2ID0gc2VsZi0+ZGV2OworCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybjspOworCQorCUlSREFfREVCVUcoMCwgIiVzKCkgOiBmbG93ICVzIDsgcnVubmluZyAlZFxuIiwgX19GVU5DVElPTl9fLAorCQkgICBmbG93ID09IEZMT1dfU1RPUCA/ICJGTE9XX1NUT1AiIDogIkZMT1dfU1RBUlQiLAorCQkgICBuZXRpZl9ydW5uaW5nKGRldikpOworCisJc3dpdGNoIChmbG93KSB7CisJY2FzZSBGTE9XX1NUT1A6CisJCS8qIElyVFRQIGlzIGZ1bGwsIHN0b3AgaGlnaGVyIGxheWVycyAqLworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCWJyZWFrOworCWNhc2UgRkxPV19TVEFSVDoKKwlkZWZhdWx0OgorCQkvKiBUZWxsIHVwcGVyIGxheWVycyB0aGF0IGl0cyB0aW1lIHRvIHRyYW5zbWl0IGZyYW1lcyBhZ2FpbiAqLworCQkvKiBTY2hlZHVsZSBuZXR3b3JrIGxheWVyICovCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fZXRjX3NlbmRfZ3JhdHVpdG91c19hcnAgKGRldikKKyAqCisgKiAgICBTZW5kIGdyYXR1aXRvdXMgQVJQIHRvIGFubm91bmNlIHRoYXQgd2UgaGF2ZSBjaGFuZ2VkCisgKiAgICBoYXJkd2FyZSBhZGRyZXNzLCBzbyB0aGF0IGFsbCBwZWVycyB1cGRhdGVzIHRoZWlyIEFSUCB0YWJsZXMKKyAqLwordm9pZCBpcmxhbl9ldGhfc2VuZF9ncmF0dWl0b3VzX2FycChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKworCS8qIAorCSAqIFdoZW4gd2UgZ2V0IGEgbmV3IE1BQyBhZGRyZXNzIGRvIGEgZ3JhdHVpdG91cyBBUlAuIFRoaXMKKwkgKiBpcyB1c2VmdWwgaWYgd2UgaGF2ZSBjaGFuZ2VkIGFjY2VzcyBwb2ludHMgb24gdGhlIHNhbWUKKwkgKiBzdWJuZXQuICAKKwkgKi8KKyNpZmRlZiBDT05GSUdfSU5FVAorCUlSREFfREVCVUcoNCwgIklyTEFOOiBTZW5kaW5nIGdyYXR1aXRvdXMgQVJQXG4iKTsKKwlyY3VfcmVhZF9sb2NrKCk7CisJaW5fZGV2ID0gX19pbl9kZXZfZ2V0KGRldik7CisJaWYgKGluX2RldiA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlpZiAoaW5fZGV2LT5pZmFfbGlzdCkKKwkJCisJYXJwX3NlbmQoQVJQT1BfUkVRVUVTVCwgRVRIX1BfQVJQLCAKKwkJIGluX2Rldi0+aWZhX2xpc3QtPmlmYV9hZGRyZXNzLAorCQkgZGV2LCAKKwkJIGluX2Rldi0+aWZhX2xpc3QtPmlmYV9hZGRyZXNzLAorCQkgTlVMTCwgZGV2LT5kZXZfYWRkciwgTlVMTCk7CitvdXQ6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisjZW5kaWYgLyogQ09ORklHX0lORVQgKi8KK30KKworLyoKKyAqIEZ1bmN0aW9uIHNldF9tdWx0aWNhc3RfbGlzdCAoZGV2KQorICoKKyAqICAgIENvbmZpZ3VyZSB0aGUgZmlsdGVyaW5nIG9mIHRoZSBkZXZpY2UKKyAqCisgKi8KKyNkZWZpbmUgSFdfTUFYX0FERFJTIDQgLyogTXVzdCBxdWVyeSB0byBnZXQgaXQhICovCitzdGF0aWMgdm9pZCBpcmxhbl9ldGhfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIAoreworIAlzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwkvKiBDaGVjayBpZiBkYXRhIGNoYW5uZWwgaGFzIGJlZW4gY29ubmVjdGVkIHlldCAqLworCWlmIChzZWxmLT5jbGllbnQuc3RhdGUgIT0gSVJMQU5fREFUQSkgeworCQlJUkRBX0RFQlVHKDEsICIlcygpLCBkZWxheWluZyFcbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm47CisJfQorCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQkvKiBFbmFibGUgcHJvbWlzY3VvdXMgbW9kZSAqLworCQlJUkRBX1dBUk5JTkcoIlByb21pc2NvdXMgbW9kZSBub3QgaW1wbGVtZW50ZWQgYnkgSXJMQU4hXG4iKTsKKwl9IAorCWVsc2UgaWYgKChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB8fCBkZXYtPm1jX2NvdW50ID4gSFdfTUFYX0FERFJTKSB7CisJCS8qIERpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSwgdXNlIG5vcm1hbCBtb2RlLiAqLworCQlJUkRBX0RFQlVHKDQsICIlcygpLCBTZXR0aW5nIG11bHRpY2FzdCBmaWx0ZXJcbiIsIF9fRlVOQ1RJT05fXyApOworCQkvKiBoYXJkd2FyZV9zZXRfZmlsdGVyKE5VTEwpOyAqLworCisJCWlybGFuX3NldF9tdWx0aWNhc3RfZmlsdGVyKHNlbGYsIFRSVUUpOworCX0KKwllbHNlIGlmIChkZXYtPm1jX2NvdW50KSB7CisJCUlSREFfREVCVUcoNCwgIiVzKCksIFNldHRpbmcgbXVsdGljYXN0IGZpbHRlclxuIiwgX19GVU5DVElPTl9fICk7CisJCS8qIFdhbGsgdGhlIGFkZHJlc3MgbGlzdCwgYW5kIGxvYWQgdGhlIGZpbHRlciAqLworCQkvKiBoYXJkd2FyZV9zZXRfZmlsdGVyKGRldi0+bWNfbGlzdCk7ICovCisKKwkJaXJsYW5fc2V0X211bHRpY2FzdF9maWx0ZXIoc2VsZiwgVFJVRSk7CisJfQorCWVsc2UgeworCQlJUkRBX0RFQlVHKDQsICIlcygpLCBDbGVhcmluZyBtdWx0aWNhc3QgZmlsdGVyXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJaXJsYW5fc2V0X211bHRpY2FzdF9maWx0ZXIoc2VsZiwgRkFMU0UpOworCX0KKworCWlmIChkZXYtPmZsYWdzICYgSUZGX0JST0FEQ0FTVCkKKwkJaXJsYW5fc2V0X2Jyb2FkY2FzdF9maWx0ZXIoc2VsZiwgVFJVRSk7CisJZWxzZQorCQlpcmxhbl9zZXRfYnJvYWRjYXN0X2ZpbHRlcihzZWxmLCBGQUxTRSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9nZXRfc3RhdHMgKGRldikKKyAqCisgKiAgICBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcyBmb3IgdGhpcyBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXJsYW5fZXRoX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuICZzZWxmLT5zdGF0czsKK30KZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lybGFuL2lybGFuX2V2ZW50LmMgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9ldmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NzhkOGMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9ldmVudC5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgaXJsYW5fZXZlbnQuYworICogVmVyc2lvbjogICAgICAgCisgKiBEZXNjcmlwdGlvbjogICAKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFR1ZSBPY3QgMjAgMDk6MTA6MTYgMTk5OAorICogTW9kaWZpZWQgYXQ6ICAgU2F0IE9jdCAzMCAxMjo1OTowMSAxOTk5CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBEYWcgQnJhdHRsaSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fZXZlbnQuaD4KKworY2hhciAqaXJsYW5fc3RhdGVbXSA9IHsKKwkiSVJMQU5fSURMRSIsCisJIklSTEFOX1FVRVJZIiwKKwkiSVJMQU5fQ09OTiIsCisJIklSTEFOX0lORk8iLAorCSJJUkxBTl9NRURJQSIsCisJIklSTEFOX09QRU4iLAorCSJJUkxBTl9XQUlUIiwKKwkiSVJMQU5fQVJCIiwKKwkiSVJMQU5fREFUQSIsCisJIklSTEFOX0NMT1NFIiwKKwkiSVJMQU5fU1lOQyIsCit9OworCit2b2lkIGlybGFuX25leHRfY2xpZW50X3N0YXRlKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fU1RBVEUgc3RhdGUpIAoreworCUlSREFfREVCVUcoMiwgIiVzKCksICVzXG4iLCBfX0ZVTkNUSU9OX18gLCBpcmxhbl9zdGF0ZVtzdGF0ZV0pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CisKKwlzZWxmLT5jbGllbnQuc3RhdGUgPSBzdGF0ZTsKK30KKwordm9pZCBpcmxhbl9uZXh0X3Byb3ZpZGVyX3N0YXRlKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fU1RBVEUgc3RhdGUpIAoreworCUlSREFfREVCVUcoMiwgIiVzKCksICVzXG4iLCBfX0ZVTkNUSU9OX18gLCBpcmxhbl9zdGF0ZVtzdGF0ZV0pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CisKKwlzZWxmLT5wcm92aWRlci5zdGF0ZSA9IHN0YXRlOworfQorCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmxhbi9pcmxhbl9maWx0ZXIuYyBiL25ldC9pcmRhL2lybGFuL2lybGFuX2ZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0M2M1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9maWx0ZXIuYwpAQCAtMCwwICsxLDI0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBpcmxhbl9maWx0ZXIuYworICogVmVyc2lvbjogICAgICAgCisgKiBEZXNjcmlwdGlvbjogICAKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIEZyaSBKYW4gMjkgMTE6MTY6MzggMTk5OQorICogTW9kaWZpZWQgYXQ6ICAgU2F0IE9jdCAzMCAxMjo1ODo0NSAxOTk5CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBEYWcgQnJhdHRsaSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NvbW1vbi5oPgorCisvKgorICogRnVuY3Rpb24gaXJsYW5fZmlsdGVyX3JlcXVlc3QgKHNlbGYsIHNrYikKKyAqCisgKiAgICBIYW5kbGUgZmlsdGVyIHJlcXVlc3QgZnJvbSBjbGllbnQgcGVlciBkZXZpY2UKKyAqCisgKi8KK3ZvaWQgaXJsYW5fZmlsdGVyX3JlcXVlc3Qoc3RydWN0IGlybGFuX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOworCisJaWYgKChzZWxmLT5wcm92aWRlci5maWx0ZXJfdHlwZSA9PSBJUkxBTl9ESVJFQ1RFRCkgJiYgCisJICAgIChzZWxmLT5wcm92aWRlci5maWx0ZXJfb3BlcmF0aW9uID09IERZTkFNSUMpKQorCXsKKwkJSVJEQV9ERUJVRygwLCAiR2l2aW5nIHBlZXIgYSBkeW5hbWljIEV0aGVybmV0IGFkZHJlc3NcbiIpOworCQlzZWxmLT5wcm92aWRlci5tYWNfYWRkcmVzc1swXSA9IDB4NDA7CisJCXNlbGYtPnByb3ZpZGVyLm1hY19hZGRyZXNzWzFdID0gMHgwMDsKKwkJc2VsZi0+cHJvdmlkZXIubWFjX2FkZHJlc3NbMl0gPSAweDAwOworCQlzZWxmLT5wcm92aWRlci5tYWNfYWRkcmVzc1szXSA9IDB4MDA7CisJCQorCQkvKiBVc2UgYXJiaXRyYXRpb24gdmFsdWUgdG8gZ2VuZXJhdGUgTUFDIGFkZHJlc3MgKi8KKwkJaWYgKHNlbGYtPnByb3ZpZGVyLmFjY2Vzc190eXBlID09IEFDQ0VTU19QRUVSKSB7CisJCQlzZWxmLT5wcm92aWRlci5tYWNfYWRkcmVzc1s0XSA9IAorCQkJCXNlbGYtPnByb3ZpZGVyLnNlbmRfYXJiX3ZhbCAmIDB4ZmY7CisJCQlzZWxmLT5wcm92aWRlci5tYWNfYWRkcmVzc1s1XSA9IAorCQkJCShzZWxmLT5wcm92aWRlci5zZW5kX2FyYl92YWwgPj4gOCkgJiAweGZmOworCQl9IGVsc2UgeworCQkJLyogSnVzdCBnZW5lcmF0ZSBzb21ldGhpbmcgZm9yIG5vdyAqLworCQkJZ2V0X3JhbmRvbV9ieXRlcyhzZWxmLT5wcm92aWRlci5tYWNfYWRkcmVzcys0LCAxKTsKKwkJCWdldF9yYW5kb21fYnl0ZXMoc2VsZi0+cHJvdmlkZXIubWFjX2FkZHJlc3MrNSwgMSk7CisJCX0KKworCQlza2ItPmRhdGFbMF0gPSAweDAwOyAvKiBTdWNjZXNzICovCisJCXNrYi0+ZGF0YVsxXSA9IDB4MDM7CisJCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX01PREUiLCAiTk9ORSIpOworCQlpcmxhbl9pbnNlcnRfc2hvcnRfcGFyYW0oc2tiLCAiTUFYX0VOVFJZIiwgMHgwMDAxKTsKKwkJaXJsYW5faW5zZXJ0X2FycmF5X3BhcmFtKHNrYiwgIkZJTFRFUl9FTlRSWSIsIAorCQkJCQkgc2VsZi0+cHJvdmlkZXIubWFjX2FkZHJlc3MsIDYpOworCQlyZXR1cm47CisJfQorCQorCWlmICgoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX3R5cGUgPT0gSVJMQU5fRElSRUNURUQpICYmIAorCSAgICAoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX21vZGUgPT0gRklMVEVSKSkKKwl7CisJCUlSREFfREVCVUcoMCwgIkRpcmVjdGVkIGZpbHRlciBvblxuIik7CisJCXNrYi0+ZGF0YVswXSA9IDB4MDA7IC8qIFN1Y2Nlc3MgKi8KKwkJc2tiLT5kYXRhWzFdID0gMHgwMDsKKwkJcmV0dXJuOworCX0KKwlpZiAoKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl90eXBlID09IElSTEFOX0RJUkVDVEVEKSAmJiAKKwkgICAgKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl9tb2RlID09IE5PTkUpKQorCXsKKwkJSVJEQV9ERUJVRygwLCAiRGlyZWN0ZWQgZmlsdGVyIG9mZlxuIik7CisJCXNrYi0+ZGF0YVswXSA9IDB4MDA7IC8qIFN1Y2Nlc3MgKi8KKwkJc2tiLT5kYXRhWzFdID0gMHgwMDsKKwkJcmV0dXJuOworCX0KKworCWlmICgoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX3R5cGUgPT0gSVJMQU5fQlJPQURDQVNUKSAmJiAKKwkgICAgKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl9tb2RlID09IEZJTFRFUikpCisJeworCQlJUkRBX0RFQlVHKDAsICJCcm9hZGNhc3QgZmlsdGVyIG9uXG4iKTsKKwkJc2tiLT5kYXRhWzBdID0gMHgwMDsgLyogU3VjY2VzcyAqLworCQlza2ItPmRhdGFbMV0gPSAweDAwOworCQlyZXR1cm47CisJfQorCWlmICgoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX3R5cGUgPT0gSVJMQU5fQlJPQURDQVNUKSAmJiAKKwkgICAgKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl9tb2RlID09IE5PTkUpKQorCXsKKwkJSVJEQV9ERUJVRygwLCAiQnJvYWRjYXN0IGZpbHRlciBvZmZcbiIpOworCQlza2ItPmRhdGFbMF0gPSAweDAwOyAvKiBTdWNjZXNzICovCisJCXNrYi0+ZGF0YVsxXSA9IDB4MDA7CisJCXJldHVybjsKKwl9CisJaWYgKChzZWxmLT5wcm92aWRlci5maWx0ZXJfdHlwZSA9PSBJUkxBTl9NVUxUSUNBU1QpICYmIAorCSAgICAoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX21vZGUgPT0gRklMVEVSKSkKKwl7CisJCUlSREFfREVCVUcoMCwgIk11bHRpY2FzdCBmaWx0ZXIgb25cbiIpOworCQlza2ItPmRhdGFbMF0gPSAweDAwOyAvKiBTdWNjZXNzICovCisJCXNrYi0+ZGF0YVsxXSA9IDB4MDA7CisJCXJldHVybjsKKwl9CisJaWYgKChzZWxmLT5wcm92aWRlci5maWx0ZXJfdHlwZSA9PSBJUkxBTl9NVUxUSUNBU1QpICYmIAorCSAgICAoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX21vZGUgPT0gTk9ORSkpCisJeworCQlJUkRBX0RFQlVHKDAsICJNdWx0aWNhc3QgZmlsdGVyIG9mZlxuIik7CisJCXNrYi0+ZGF0YVswXSA9IDB4MDA7IC8qIFN1Y2Nlc3MgKi8KKwkJc2tiLT5kYXRhWzFdID0gMHgwMDsKKwkJcmV0dXJuOworCX0KKwlpZiAoKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl90eXBlID09IElSTEFOX01VTFRJQ0FTVCkgJiYgCisJICAgIChzZWxmLT5wcm92aWRlci5maWx0ZXJfb3BlcmF0aW9uID09IEdFVCkpCisJeworCQlJUkRBX0RFQlVHKDAsICJNdWx0aWNhc3QgZmlsdGVyIGdldFxuIik7CisJCXNrYi0+ZGF0YVswXSA9IDB4MDA7IC8qIFN1Y2Nlc3M/ICovCisJCXNrYi0+ZGF0YVsxXSA9IDB4MDI7CisJCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX01PREUiLCAiTk9ORSIpOworCQlpcmxhbl9pbnNlcnRfc2hvcnRfcGFyYW0oc2tiLCAiTUFYX0VOVFJZIiwgMTYpOworCQlyZXR1cm47CisJfQorCXNrYi0+ZGF0YVswXSA9IDB4MDA7IC8qIENvbW1hbmQgbm90IHN1cHBvcnRlZCAqLworCXNrYi0+ZGF0YVsxXSA9IDB4MDA7CisKKwlJUkRBX0RFQlVHKDAsICJOb3QgaW1wbGVtZW50ZWQhXG4iKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGNoZWNrX3JlcXVlc3RfcGFyYW0gKHNlbGYsIHBhcmFtLCB2YWx1ZSkKKyAqCisgKiAgICBDaGVjayBwYXJhbWV0ZXJzIGluIHJlcXVlc3QgZnJvbSBwZWVyIGRldmljZQorICoKKyAqLwordm9pZCBpcmxhbl9jaGVja19jb21tYW5kX3BhcmFtKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgY2hhciAqcGFyYW0sIGNoYXIgKnZhbHVlKQoreworCV9fdTggKmJ5dGVzOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlieXRlcyA9IHZhbHVlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CisKKwlJUkRBX0RFQlVHKDQsICIlcywgJXNcbiIsIHBhcmFtLCB2YWx1ZSk7CisKKwkvKgorCSAqICBUaGlzIGlzIGV4cGVyaW1lbnRhbCEhIERCLgorCSAqLworCSBpZiAoc3RyY21wKHBhcmFtLCAiTU9ERSIpID09IDApIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisJCXNlbGYtPnVzZV91ZGF0YSA9IFRSVUU7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqICBGSUxURVJfVFlQRQorCSAqLworCWlmIChzdHJjbXAocGFyYW0sICJGSUxURVJfVFlQRSIpID09IDApIHsKKwkJaWYgKHN0cmNtcCh2YWx1ZSwgIkRJUkVDVEVEIikgPT0gMCkgeworCQkJc2VsZi0+cHJvdmlkZXIuZmlsdGVyX3R5cGUgPSBJUkxBTl9ESVJFQ1RFRDsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoc3RyY21wKHZhbHVlLCAiTVVMVElDQVNUIikgPT0gMCkgeworCQkJc2VsZi0+cHJvdmlkZXIuZmlsdGVyX3R5cGUgPSBJUkxBTl9NVUxUSUNBU1Q7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHN0cmNtcCh2YWx1ZSwgIkJST0FEQ0FTVCIpID09IDApIHsKKwkJCXNlbGYtPnByb3ZpZGVyLmZpbHRlcl90eXBlID0gSVJMQU5fQlJPQURDQVNUOworCQkJcmV0dXJuOworCQl9CisJfQorCS8qCisJICogIEZJTFRFUl9NT0RFCisJICovCisJaWYgKHN0cmNtcChwYXJhbSwgIkZJTFRFUl9NT0RFIikgPT0gMCkgeworCQlpZiAoc3RyY21wKHZhbHVlLCAiQUxMIikgPT0gMCkgeworCQkJc2VsZi0+cHJvdmlkZXIuZmlsdGVyX21vZGUgPSBBTEw7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHN0cmNtcCh2YWx1ZSwgIkZJTFRFUiIpID09IDApIHsKKwkJCXNlbGYtPnByb3ZpZGVyLmZpbHRlcl9tb2RlID0gRklMVEVSOworCQkJcmV0dXJuOworCQl9CisJCWlmIChzdHJjbXAodmFsdWUsICJOT05FIikgPT0gMCkgeworCQkJc2VsZi0+cHJvdmlkZXIuZmlsdGVyX21vZGUgPSBGSUxURVI7CisJCQlyZXR1cm47CisJCX0KKwl9CisJLyoKKwkgKiAgRklMVEVSX09QRVJBVElPTgorCSAqLworCWlmIChzdHJjbXAocGFyYW0sICJGSUxURVJfT1BFUkFUSU9OIikgPT0gMCkgeworCQlpZiAoc3RyY21wKHZhbHVlLCAiRFlOQU1JQyIpID09IDApIHsKKwkJCXNlbGYtPnByb3ZpZGVyLmZpbHRlcl9vcGVyYXRpb24gPSBEWU5BTUlDOworCQkJcmV0dXJuOworCQl9CisJCWlmIChzdHJjbXAodmFsdWUsICJHRVQiKSA9PSAwKSB7CisJCQlzZWxmLT5wcm92aWRlci5maWx0ZXJfb3BlcmF0aW9uID0gR0VUOworCQkJcmV0dXJuOworCQl9CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fcHJpbnRfZmlsdGVyIChmaWx0ZXJfdHlwZSwgYnVmKQorICoKKyAqICAgIFByaW50IHN0YXR1cyBvZiBmaWx0ZXIuIFVzZWQgYnkgL3Byb2MgZmlsZSBzeXN0ZW0KKyAqCisgKi8KKyNpZmRlZiBDT05GSUdfUFJPQ19GUworI2RlZmluZSBNQVNLMlNUUihtLHMpCXsgLm1hc2sgPSBtLCAuc3RyID0gcyB9CisKK3ZvaWQgaXJsYW5fcHJpbnRfZmlsdGVyKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBpbnQgZmlsdGVyX3R5cGUpCit7CisJc3RhdGljIHN0cnVjdCB7CisJCWludCBtYXNrOworCQljb25zdCBjaGFyICpzdHI7CisJfSBmaWx0ZXJfbWFzazJzdHJbXSA9IHsKKwkJTUFTSzJTVFIoSVJMQU5fRElSRUNURUQsCSJESVJFQ1RFRCIpLAorCQlNQVNLMlNUUihJUkxBTl9GVU5DVElPTkFMLAkiRlVOQ1RJT05BTCIpLAorCQlNQVNLMlNUUihJUkxBTl9HUk9VUCwJCSJHUk9VUCIpLAorCQlNQVNLMlNUUihJUkxBTl9NQUNfRlJBTUUsCSJNQUNfRlJBTUUiKSwKKwkJTUFTSzJTVFIoSVJMQU5fTVVMVElDQVNULAkiTVVMVElDQVNUIiksCisJCU1BU0syU1RSKElSTEFOX0JST0FEQ0FTVCwJIkJST0FEQ0FTVCIpLAorCQlNQVNLMlNUUihJUkxBTl9JUFhfU09DS0VULAkiSVBYX1NPQ0tFVCIpLAorCQlNQVNLMlNUUigwLAkJCU5VTEwpCisJfSwgKnA7CisKKwlmb3IgKHAgPSBmaWx0ZXJfbWFzazJzdHI7IHAtPnN0cjsgcCsrKSB7CisJCWlmIChmaWx0ZXJfdHlwZSAmIHAtPm1hc2spCisJCQlzZXFfcHJpbnRmKHNlcSwgIiVzICIsIHAtPnN0cik7CisJfQorCXNlcV9wdXRjKHNlcSwgJ1xuJyk7Cit9CisjdW5kZWYgTUFTSzJTVFIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsYW4vaXJsYW5fcHJvdmlkZXIuYyBiL25ldC9pcmRhL2lybGFuL2lybGFuX3Byb3ZpZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzljMjAyZAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lybGFuL2lybGFuX3Byb3ZpZGVyLmMKQEAgLTAsMCArMSw0MTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgaXJsYW5fcHJvdmlkZXIuYworICogVmVyc2lvbjogICAgICAgMC45CisgKiBEZXNjcmlwdGlvbjogICBJckRBIExBTiBBY2Nlc3MgUHJvdG9jb2wgSW1wbGVtZW50YXRpb24KKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFN1biBBdWcgMzEgMjA6MTQ6MzcgMTk5NworICogTW9kaWZpZWQgYXQ6ICAgU2F0IE9jdCAzMCAxMjo1MjoxMCAxOTk5CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBTb3VyY2VzOiAgICAgICBza2VsZXRvbi5jIGJ5IERvbmFsZCBCZWNrZXIgPGJlY2tlckBDRVNESVMuZ3NmYy5uYXNhLmdvdj4KKyAqICAgICAgICAgICAgICAgIHNsaXAuYyBieSBMYXVyZW5jZSBDdWxoYW5lLCAgIDxsb3pAaG9sbWVzLmRlbW9uLmNvLnVrPgorICogICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1d2FsdC5ubC5tdWduZXQub3JnPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwgCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lydHRwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhc19vYmplY3QuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL3RpbWVyLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9jb21tb24uaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9ldGguaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9ldmVudC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fZmlsdGVyLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fY2xpZW50Lmg+CisKK3N0YXRpYyB2b2lkIGlybGFuX3Byb3ZpZGVyX2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCAKKwkJCQkJICAgICAgc3RydWN0IHFvc19pbmZvICpxb3MsIAorCQkJCQkgICAgICBfX3UzMiBtYXhfc2R1X3NpemUsCisJCQkJCSAgICAgIF9fdTggbWF4X2hlYWRlcl9zaXplLAorCQkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX3Byb3ZpZGVyX2NvbnRyb2xfZGF0YV9pbmRpY2F0aW9uIChoYW5kbGUsIHNrYikKKyAqCisgKiAgICBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIGRhdGEgdGhhdCBpcyByZWNlaXZlZCBvbiB0aGUgY29udHJvbCBjaGFubmVsCisgKgorICovCitzdGF0aWMgaW50IGlybGFuX3Byb3ZpZGVyX2RhdGFfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCAKKwkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAKK3sKKwlzdHJ1Y3QgaXJsYW5fY2IgKnNlbGY7CisJX191OCBjb2RlOworCQorCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCQorCXNlbGYgPSAoc3RydWN0IGlybGFuX2NiICopIGluc3RhbmNlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwljb2RlID0gc2tiLT5kYXRhWzBdOworCXN3aXRjaChjb2RlKSB7CisJY2FzZSBDTURfR0VUX1BST1ZJREVSX0lORk86CisJCUlSREFfREVCVUcoNCwgIkdvdCBHRVRfUFJPVklERVJfSU5GTyBjb21tYW5kIVxuIik7CisJCWlybGFuX2RvX3Byb3ZpZGVyX2V2ZW50KHNlbGYsIElSTEFOX0dFVF9JTkZPX0NNRCwgc2tiKTsgCisJCWJyZWFrOworCisJY2FzZSBDTURfR0VUX01FRElBX0NIQVI6CisJCUlSREFfREVCVUcoNCwgIkdvdCBHRVRfTUVESUFfQ0hBUiBjb21tYW5kIVxuIik7CisJCWlybGFuX2RvX3Byb3ZpZGVyX2V2ZW50KHNlbGYsIElSTEFOX0dFVF9NRURJQV9DTUQsIHNrYik7IAorCQlicmVhazsKKwljYXNlIENNRF9PUEVOX0RBVEFfQ0hBTk5FTDoKKwkJSVJEQV9ERUJVRyg0LCAiR290IE9QRU5fREFUQV9DSEFOTkVMIGNvbW1hbmQhXG4iKTsKKwkJaXJsYW5fZG9fcHJvdmlkZXJfZXZlbnQoc2VsZiwgSVJMQU5fT1BFTl9EQVRBX0NNRCwgc2tiKTsgCisJCWJyZWFrOworCWNhc2UgQ01EX0ZJTFRFUl9PUEVSQVRJT046CisJCUlSREFfREVCVUcoNCwgIkdvdCBGSUxURVJfT1BFUkFUSU9OIGNvbW1hbmQhXG4iKTsKKwkJaXJsYW5fZG9fcHJvdmlkZXJfZXZlbnQoc2VsZiwgSVJMQU5fRklMVEVSX0NPTkZJR19DTUQsIHNrYik7CisJCWJyZWFrOworCWNhc2UgQ01EX1JFQ09OTkVDVF9EQVRBX0NIQU46CisJCUlSREFfREVCVUcoMiwgIiVzKCksIEdvdCBSRUNPTk5FQ1RfREFUQV9DSEFOIGNvbW1hbmRcbiIsIF9fRlVOQ1RJT05fXyApOworCQlJUkRBX0RFQlVHKDIsICIlcygpLCBOT1QgSU1QTEVNRU5URURcbiIsIF9fRlVOQ1RJT05fXyApOworCQlicmVhazsKKwljYXNlIENNRF9DTE9TRV9EQVRBX0NIQU46CisJCUlSREFfREVCVUcoMiwgIkdvdCBDTE9TRV9EQVRBX0NIQU4gY29tbWFuZCFcbiIpOworCQlJUkRBX0RFQlVHKDIsICIlcygpLCBOT1QgSU1QTEVNRU5URURcbiIsIF9fRlVOQ1RJT05fXyApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGNvbW1hbmQhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fcHJvdmlkZXJfY29ubmVjdF9pbmRpY2F0aW9uIChoYW5kbGUsIHNrYiwgcHJpdikKKyAqCisgKiAgICBHb3QgY29ubmVjdGlvbiBmcm9tIHBlZXIgSXJMQU4gY2xpZW50CisgKgorICovCitzdGF0aWMgdm9pZCBpcmxhbl9wcm92aWRlcl9jb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgCisJCQkJCSAgICAgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLAorCQkJCQkgICAgICBfX3UzMiBtYXhfc2R1X3NpemUsIAorCQkJCQkgICAgICBfX3U4IG1heF9oZWFkZXJfc2l6ZSwKKwkJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXJsYW5fY2IgKnNlbGY7CisJc3RydWN0IHRzYXBfY2IgKnRzYXA7CisJX191MzIgc2FkZHIsIGRhZGRyOworCisJSVJEQV9ERUJVRygwLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJc2VsZiA9IChzdHJ1Y3QgaXJsYW5fY2IgKikgaW5zdGFuY2U7CisJdHNhcCA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBzYXA7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CisJCisJSVJEQV9BU1NFUlQodHNhcCA9PSBzZWxmLT5wcm92aWRlci50c2FwX2N0cmwscmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+cHJvdmlkZXIuc3RhdGUgPT0gSVJMQU5fSURMRSwgcmV0dXJuOyk7CisKKwlkYWRkciA9IGlydHRwX2dldF9kYWRkcih0c2FwKTsKKwlzYWRkciA9IGlydHRwX2dldF9zYWRkcih0c2FwKTsKKwlzZWxmLT5wcm92aWRlci5tYXhfc2R1X3NpemUgPSBtYXhfc2R1X3NpemU7CisJc2VsZi0+cHJvdmlkZXIubWF4X2hlYWRlcl9zaXplID0gbWF4X2hlYWRlcl9zaXplOworCisJaXJsYW5fZG9fcHJvdmlkZXJfZXZlbnQoc2VsZiwgSVJMQU5fQ09OTkVDVF9JTkRJQ0FUSU9OLCBOVUxMKTsKKworCS8qICAKKwkgKiBJZiB3ZSBhcmUgaW4gcGVlciBtb2RlLCB0aGUgY2xpZW50IG1heSBub3QgaGF2ZSBnb3QgdGhlIGRpc2NvdmVyeQorCSAqIGluZGljYXRpb24gaXQgbmVlZHMgdG8gbWFrZSBwcm9ncmVzcy4gSWYgdGhlIGNsaWVudCBpcyBzdGlsbCBpbiAKKwkgKiBJRExFIHN0YXRlLCB3ZSBtdXN0IGtpY2sgaXQuIAorCSAqLworCWlmICgoc2VsZi0+cHJvdmlkZXIuYWNjZXNzX3R5cGUgPT0gQUNDRVNTX1BFRVIpICYmIAorCSAgICAoc2VsZi0+Y2xpZW50LnN0YXRlID09IElSTEFOX0lETEUpKSAKKwl7CisJCWlybGFuX2NsaWVudF93YWtldXAoc2VsZiwgc2VsZi0+c2FkZHIsIHNlbGYtPmRhZGRyKTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9wcm92aWRlcl9jb25uZWN0X3Jlc3BvbnNlIChoYW5kbGUpCisgKgorICogICAgQWNjZXB0IGluY29taW5nIGNvbm5lY3Rpb24KKyAqCisgKi8KK3ZvaWQgaXJsYW5fcHJvdmlkZXJfY29ubmVjdF9yZXNwb25zZShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsCisJCQkJICAgICBzdHJ1Y3QgdHNhcF9jYiAqdHNhcCkKK3sKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKKworCS8qIEp1c3QgYWNjZXB0ICovCisJaXJ0dHBfY29ubmVjdF9yZXNwb25zZSh0c2FwLCBJUkxBTl9NVFUsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBpcmxhbl9wcm92aWRlcl9kaXNjb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgCisJCQkJCQkgTE1fUkVBU09OIHJlYXNvbiwgCisJCQkJCQkgc3RydWN0IHNrX2J1ZmYgKnVzZXJkYXRhKSAKK3sKKwlzdHJ1Y3QgaXJsYW5fY2IgKnNlbGY7CisJc3RydWN0IHRzYXBfY2IgKnRzYXA7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpLCByZWFzb249JWRcbiIsIF9fRlVOQ1RJT05fXyAsIHJlYXNvbik7CisJCisJc2VsZiA9IChzdHJ1Y3QgaXJsYW5fY2IgKikgaW5zdGFuY2U7CisJdHNhcCA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBzYXA7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsJCisJSVJEQV9BU1NFUlQodHNhcCAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVCh0c2FwLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuOyk7CisJCisJSVJEQV9BU1NFUlQodHNhcCA9PSBzZWxmLT5wcm92aWRlci50c2FwX2N0cmwsIHJldHVybjspOworCQorCWlybGFuX2RvX3Byb3ZpZGVyX2V2ZW50KHNlbGYsIElSTEFOX0xNUF9ESVNDT05ORUNULCBOVUxMKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX3BhcnNlX29wZW5fZGF0YV9jbWQgKHNlbGYsIHNrYikKKyAqCisgKiAgICAKKyAqCisgKi8KK2ludCBpcmxhbl9wYXJzZV9vcGVuX2RhdGFfY21kKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmV0OworCQorCXJldCA9IGlybGFuX3Byb3ZpZGVyX3BhcnNlX2NvbW1hbmQoc2VsZiwgQ01EX09QRU5fREFUQV9DSEFOTkVMLCBza2IpOworCisJLyogT3BlbiBkYXRhIGNoYW5uZWwgKi8KKwlpcmxhbl9vcGVuX2RhdGFfdHNhcChzZWxmKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBwYXJzZV9jb21tYW5kIChza2IpCisgKgorICogICAgRXh0cmFjdCBhbGwgcGFyYW1ldGVycyBmcm9tIHJlY2VpdmVkIGJ1ZmZlciwgdGhlbiBmZWVkIHRoZW0gdG8gCisgKiAgICBjaGVja19wYXJhbXMgZm9yIHBhcnNpbmcKKyAqCisgKi8KK2ludCBpcmxhbl9wcm92aWRlcl9wYXJzZV9jb21tYW5kKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgaW50IGNtZCwKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikgCit7CisJX191OCAqZnJhbWU7CisJX191OCAqcHRyOworCWludCBjb3VudDsKKwlfX3UxNiB2YWxfbGVuOworCWludCBpOworCWNoYXIgKm5hbWU7CisgICAgICAgIGNoYXIgKnZhbHVlOworCWludCByZXQgPSBSU1BfU1VDQ0VTUzsKKwkKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIC1SU1BfUFJPVE9DT0xfRVJST1I7KTsKKwkKKwlJUkRBX0RFQlVHKDQsICIlcygpLCBza2ItPmxlbj0lZFxuIiwgX19GVU5DVElPTl9fICwgKGludClza2ItPmxlbik7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtUlNQX1BST1RPQ09MX0VSUk9SOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybiAtUlNQX1BST1RPQ09MX0VSUk9SOyk7CisJCisJaWYgKCFza2IpCisJCXJldHVybiAtUlNQX1BST1RPQ09MX0VSUk9SOworCisJZnJhbWUgPSBza2ItPmRhdGE7CisKKwluYW1lID0ga21hbGxvYygyNTUsIEdGUF9BVE9NSUMpOworCWlmICghbmFtZSkKKwkJcmV0dXJuIC1SU1BfSU5TVUZGSUNJRU5UX1JFU09VUkNFUzsKKwl2YWx1ZSA9IGttYWxsb2MoMTAxNiwgR0ZQX0FUT01JQyk7CisJaWYgKCF2YWx1ZSkgeworCQlrZnJlZShuYW1lKTsKKwkJcmV0dXJuIC1SU1BfSU5TVUZGSUNJRU5UX1JFU09VUkNFUzsKKwl9CisKKwkvKiBIb3cgbWFueSBwYXJhbWV0ZXJzPyAqLworCWNvdW50ID0gZnJhbWVbMV07CisKKwlJUkRBX0RFQlVHKDQsICJHb3QgJWQgcGFyYW1ldGVyc1xuIiwgY291bnQpOworCQorCXB0ciA9IGZyYW1lKzI7CisJCisJLyogRm9yIGFsbCBwYXJhbWV0ZXJzICovCisgCWZvciAoaT0wOyBpPGNvdW50O2krKykgeworCQlyZXQgPSBpcmxhbl9leHRyYWN0X3BhcmFtKHB0ciwgbmFtZSwgdmFsdWUsICZ2YWxfbGVuKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCUlSREFfREVCVUcoMiwgIiVzKCksIElyTEFOLCBFcnJvciFcbiIsIF9fRlVOQ1RJT05fXyApOworCQkJYnJlYWs7CisJCX0KKwkJcHRyKz1yZXQ7CisJCXJldCA9IFJTUF9TVUNDRVNTOworCQlpcmxhbl9jaGVja19jb21tYW5kX3BhcmFtKHNlbGYsIG5hbWUsIHZhbHVlKTsKKwl9CisJLyogQ2xlYW51cCAqLworCWtmcmVlKG5hbWUpOworCWtmcmVlKHZhbHVlKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9wcm92aWRlcl9zZW5kX3JlcGx5IChzZWxmLCBpbmZvKQorICoKKyAqICAgIFNlbmQgcmVwbHkgdG8gcXVlcnkgdG8gcGVlciBJckxBTiBsYXllcgorICoKKyAqLwordm9pZCBpcmxhbl9wcm92aWRlcl9zZW5kX3JlcGx5KHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgaW50IGNvbW1hbmQsIAorCQkJICAgICAgIGludCByZXRfY29kZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKKworCXNrYiA9IGRldl9hbGxvY19za2IoMTI4KTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuOworCisJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgVFRQLCBMTVAsIGFuZCBMQVAgaGVhZGVyICovCisJc2tiX3Jlc2VydmUoc2tiLCBzZWxmLT5wcm92aWRlci5tYXhfaGVhZGVyX3NpemUpOworCXNrYl9wdXQoc2tiLCAyKTsKKyAgICAgICAKKwlzd2l0Y2ggKGNvbW1hbmQpIHsKKwljYXNlIENNRF9HRVRfUFJPVklERVJfSU5GTzoKKwkJc2tiLT5kYXRhWzBdID0gMHgwMDsgLyogU3VjY2VzcyAqLworCQlza2ItPmRhdGFbMV0gPSAweDAyOyAvKiAyIHBhcmFtZXRlcnMgKi8KKwkJc3dpdGNoIChzZWxmLT5tZWRpYSkgeworCQljYXNlIE1FRElBXzgwMl8zOgorCQkJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJNRURJQSIsICI4MDIuMyIpOworCQkJYnJlYWs7CisJCWNhc2UgTUVESUFfODAyXzU6CisJCQlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIk1FRElBIiwgIjgwMi41Iik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUlSREFfREVCVUcoMiwgIiVzKCksIHVua25vd24gbWVkaWEgdHlwZSFcbiIsIF9fRlVOQ1RJT05fXyApOworCQkJYnJlYWs7CisJCX0KKwkJaXJsYW5faW5zZXJ0X3Nob3J0X3BhcmFtKHNrYiwgIklSTEFOX1ZFUiIsIDB4MDEwMSk7CisJCWJyZWFrOworCisJY2FzZSBDTURfR0VUX01FRElBX0NIQVI6CisJCXNrYi0+ZGF0YVswXSA9IDB4MDA7IC8qIFN1Y2Nlc3MgKi8KKwkJc2tiLT5kYXRhWzFdID0gMHgwNTsgLyogNSBwYXJhbWV0ZXJzICovCisJCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX1RZUEUiLCAiRElSRUNURUQiKTsKKwkJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfVFlQRSIsICJCUk9BRENBU1QiKTsKKwkJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfVFlQRSIsICJNVUxUSUNBU1QiKTsKKworCQlzd2l0Y2ggKHNlbGYtPnByb3ZpZGVyLmFjY2Vzc190eXBlKSB7CisJCWNhc2UgQUNDRVNTX0RJUkVDVDoKKwkJCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiQUNDRVNTX1RZUEUiLCAiRElSRUNUIik7CisJCQlicmVhazsKKwkJY2FzZSBBQ0NFU1NfUEVFUjoKKwkJCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiQUNDRVNTX1RZUEUiLCAiUEVFUiIpOworCQkJYnJlYWs7CisJCWNhc2UgQUNDRVNTX0hPU1RFRDoKKwkJCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiQUNDRVNTX1RZUEUiLCAiSE9TVEVEIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUlSREFfREVCVUcoMiwgIiVzKCksIFVua25vd24gYWNjZXNzIHR5cGVcbiIsIF9fRlVOQ1RJT05fXyApOworCQkJYnJlYWs7CisJCX0KKwkJaXJsYW5faW5zZXJ0X3Nob3J0X3BhcmFtKHNrYiwgIk1BWF9GUkFNRSIsIDB4MDVlZSk7CisJCWJyZWFrOworCWNhc2UgQ01EX09QRU5fREFUQV9DSEFOTkVMOgorCQlza2ItPmRhdGFbMF0gPSAweDAwOyAvKiBTdWNjZXNzICovCisJCWlmIChzZWxmLT5wcm92aWRlci5zZW5kX2FyYl92YWwpIHsKKwkJCXNrYi0+ZGF0YVsxXSA9IDB4MDM7IC8qIDMgcGFyYW1ldGVycyAqLworCQkJaXJsYW5faW5zZXJ0X3Nob3J0X3BhcmFtKHNrYiwgIkNPTl9BUkIiLCAKKwkJCQkJCSBzZWxmLT5wcm92aWRlci5zZW5kX2FyYl92YWwpOworCQl9IGVsc2UKKwkJCXNrYi0+ZGF0YVsxXSA9IDB4MDI7IC8qIDIgcGFyYW1ldGVycyAqLworCQlpcmxhbl9pbnNlcnRfYnl0ZV9wYXJhbShza2IsICJEQVRBX0NIQU4iLCBzZWxmLT5zdHNhcF9zZWxfZGF0YSk7CisJCWlybGFuX2luc2VydF9hcnJheV9wYXJhbShza2IsICJSRUNPTk5FQ1RfS0VZIiwgIkxJTlVYIFJVTEVTISIsCisJCQkJCSAxMik7CisJCWJyZWFrOworCWNhc2UgQ01EX0ZJTFRFUl9PUEVSQVRJT046CisJCWlybGFuX2ZpbHRlcl9yZXF1ZXN0KHNlbGYsIHNrYik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMiwgIiVzKCksIFVua25vd24gY29tbWFuZCFcbiIsIF9fRlVOQ1RJT05fXyApOworCQlicmVhazsKKwl9CisKKwlpcnR0cF9kYXRhX3JlcXVlc3Qoc2VsZi0+cHJvdmlkZXIudHNhcF9jdHJsLCBza2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fcHJvdmlkZXJfcmVnaXN0ZXIodm9pZCkKKyAqCisgKiAgICBSZWdpc3RlciBwcm92aWRlciBzdXBwb3J0IHNvIHdlIGNhbiBhY2NlcHQgaW5jb21pbmcgY29ubmVjdGlvbnMuCisgKiAKKyAqLworaW50IGlybGFuX3Byb3ZpZGVyX29wZW5fY3RybF90c2FwKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikKK3sKKwlzdHJ1Y3QgdHNhcF9jYiAqdHNhcDsKKwlub3RpZnlfdCBub3RpZnk7CisJCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm4gLTE7KTsKKworCS8qIENoZWNrIGlmIGFscmVhZHkgb3BlbiAqLworCWlmIChzZWxmLT5wcm92aWRlci50c2FwX2N0cmwpCisJCXJldHVybiAtMTsKKwkKKwkvKgorCSAqICBGaXJzdCByZWdpc3RlciB3ZWxsIGtub3duIGNvbnRyb2wgVFNBUAorCSAqLworCWlyZGFfbm90aWZ5X2luaXQoJm5vdGlmeSk7CisJbm90aWZ5LmRhdGFfaW5kaWNhdGlvbiAgICAgICA9IGlybGFuX3Byb3ZpZGVyX2RhdGFfaW5kaWNhdGlvbjsKKwlub3RpZnkuY29ubmVjdF9pbmRpY2F0aW9uICAgID0gaXJsYW5fcHJvdmlkZXJfY29ubmVjdF9pbmRpY2F0aW9uOworCW5vdGlmeS5kaXNjb25uZWN0X2luZGljYXRpb24gPSBpcmxhbl9wcm92aWRlcl9kaXNjb25uZWN0X2luZGljYXRpb247CisJbm90aWZ5Lmluc3RhbmNlID0gc2VsZjsKKwlzdHJsY3B5KG5vdGlmeS5uYW1lLCAiSXJMQU4gY3RybCAocCkiLCBzaXplb2Yobm90aWZ5Lm5hbWUpKTsKKworCXRzYXAgPSBpcnR0cF9vcGVuX3RzYXAoTFNBUF9BTlksIDEsICZub3RpZnkpOworCWlmICghdHNhcCkgeworCQlJUkRBX0RFQlVHKDIsICIlcygpLCBHb3Qgbm8gdHNhcCFcbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gLTE7CisJfQorCXNlbGYtPnByb3ZpZGVyLnRzYXBfY3RybCA9IHRzYXA7CisKKwkvKiBSZWdpc3RlciB3aXRoIExNLUlBUyAqLworCWlybGFuX2lhc19yZWdpc3RlcihzZWxmLCB0c2FwLT5zdHNhcF9zZWwpOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lybGFuL2lybGFuX3Byb3ZpZGVyX2V2ZW50LmMgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9wcm92aWRlcl9ldmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMDg2ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9wcm92aWRlcl9ldmVudC5jCkBAIC0wLDAgKzEsMjQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGlybGFuX3Byb3ZpZGVyX2V2ZW50LmMKKyAqIFZlcnNpb246ICAgICAgIDAuOQorICogRGVzY3JpcHRpb246ICAgSXJMQU4gcHJvdmlkZXIgc3RhdGUgbWFjaGluZSkKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFN1biBBdWcgMzEgMjA6MTQ6MzcgMTk5NworICogTW9kaWZpZWQgYXQ6ICAgU2F0IE9jdCAzMCAxMjo1Mjo0MSAxOTk5CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+LCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcnR0cC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9ldmVudC5oPgorCitzdGF0aWMgaW50IGlybGFuX3Byb3ZpZGVyX3N0YXRlX2lkbGUoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgaXJsYW5fcHJvdmlkZXJfc3RhdGVfaW5mbyhzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKKwkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBpcmxhbl9wcm92aWRlcl9zdGF0ZV9vcGVuKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgaW50IGlybGFuX3Byb3ZpZGVyX3N0YXRlX2RhdGEoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworc3RhdGljIGludCAoKnN0YXRlW10pKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSA9IAoreyAKKwlpcmxhbl9wcm92aWRlcl9zdGF0ZV9pZGxlLAorCU5VTEwsIC8qIFF1ZXJ5ICovCisJTlVMTCwgLyogSW5mbyAqLworCWlybGFuX3Byb3ZpZGVyX3N0YXRlX2luZm8sCisJTlVMTCwgLyogTWVkaWEgKi8KKwlpcmxhbl9wcm92aWRlcl9zdGF0ZV9vcGVuLAorCU5VTEwsIC8qIFdhaXQgKi8KKwlOVUxMLCAvKiBBcmIgKi8KKwlpcmxhbl9wcm92aWRlcl9zdGF0ZV9kYXRhLAorCU5VTEwsIC8qIENsb3NlICovCisJTlVMTCwgLyogU3luYyAqLworfTsKKwordm9pZCBpcmxhbl9kb19wcm92aWRlcl9ldmVudChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCit7CisJSVJEQV9BU1NFUlQoKnN0YXRlWyBzZWxmLT5wcm92aWRlci5zdGF0ZV0gIT0gTlVMTCwgcmV0dXJuOyk7CisKKwkoKnN0YXRlW3NlbGYtPnByb3ZpZGVyLnN0YXRlXSkgKHNlbGYsIGV2ZW50LCBza2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYW5fcHJvdmlkZXJfc3RhdGVfaWRsZSAoZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICBJRExFLCBXZSBhcmUgd2FpdGluZyBmb3IgYW4gaW5kaWNhdGlvbiB0aGF0IHRoZXJlIGlzIGEgcHJvdmlkZXIKKyAqICAgIGF2YWlsYWJsZS4KKyAqLworc3RhdGljIGludCBpcmxhbl9wcm92aWRlcl9zdGF0ZV9pZGxlKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsCisJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJCisJc3dpdGNoKGV2ZW50KSB7CisJY2FzZSBJUkxBTl9DT05ORUNUX0lORElDQVRJT046CisJICAgICBpcmxhbl9wcm92aWRlcl9jb25uZWN0X3Jlc3BvbnNlKCBzZWxmLCBzZWxmLT5wcm92aWRlci50c2FwX2N0cmwpOworCSAgICAgaXJsYW5fbmV4dF9wcm92aWRlcl9zdGF0ZSggc2VsZiwgSVJMQU5fSU5GTyk7CisJICAgICBicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDQsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBldmVudCk7CisJCWJyZWFrOworCX0KKwlpZiAoc2tiKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX3Byb3ZpZGVyX3N0YXRlX2luZm8gKHNlbGYsIGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgSU5GTywgV2UgaGF2ZSBpc3N1ZWQgYSBHZXRJbmZvIGNvbW1hbmQgYW5kIGlzIGF3YWl0aW5nIGEgcmVwbHkuCisgKi8KK3N0YXRpYyBpbnQgaXJsYW5fcHJvdmlkZXJfc3RhdGVfaW5mbyhzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIElSTEFOX0VWRU5UIGV2ZW50LCAKKwkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpIAoreworCWludCByZXQ7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJc3dpdGNoKGV2ZW50KSB7CisJY2FzZSBJUkxBTl9HRVRfSU5GT19DTUQ6CisJCS8qIEJlIHN1cmUgdG8gdXNlIDgwMi4zIGluIGNhc2Ugb2YgcGVlciBtb2RlICovCisJCWlmIChzZWxmLT5wcm92aWRlci5hY2Nlc3NfdHlwZSA9PSBBQ0NFU1NfUEVFUikgeworCQkJc2VsZi0+bWVkaWEgPSBNRURJQV84MDJfMzsKKwkJCQorCQkJLyogQ2hlY2sgaWYgY2xpZW50IGhhcyBzdGFydGVkIHlldCAqLworCQkJaWYgKHNlbGYtPmNsaWVudC5zdGF0ZSA9PSBJUkxBTl9JRExFKSB7CisJCQkJLyogVGhpcyBzaG91bGQgZ2V0IHRoZSBjbGllbnQgZ29pbmcgKi8KKwkJCQlpcmxtcF9kaXNjb3ZlcnlfcmVxdWVzdCg4KTsKKwkJCX0KKwkJfQorCisJCWlybGFuX3Byb3ZpZGVyX3NlbmRfcmVwbHkoc2VsZiwgQ01EX0dFVF9QUk9WSURFUl9JTkZPLCAKKwkJCQkJICBSU1BfU1VDQ0VTUyk7CisJCS8qIEtlZXAgc3RhdGUgKi8KKwkJYnJlYWs7CisJY2FzZSBJUkxBTl9HRVRfTUVESUFfQ01EOiAKKwkJaXJsYW5fcHJvdmlkZXJfc2VuZF9yZXBseShzZWxmLCBDTURfR0VUX01FRElBX0NIQVIsIAorCQkJCQkgIFJTUF9TVUNDRVNTKTsKKwkJLyogS2VlcCBzdGF0ZSAqLworCQlicmVhazsJCQorCWNhc2UgSVJMQU5fT1BFTl9EQVRBX0NNRDoKKwkJcmV0ID0gaXJsYW5fcGFyc2Vfb3Blbl9kYXRhX2NtZChzZWxmLCBza2IpOworCQlpZiAoc2VsZi0+cHJvdmlkZXIuYWNjZXNzX3R5cGUgPT0gQUNDRVNTX1BFRVIpIHsKKwkJCS8qIEZJWE1FOiBtYWtlIHVzZSBvZiByYW5kb20gZnVuY3Rpb25zISAqLworCQkJc2VsZi0+cHJvdmlkZXIuc2VuZF9hcmJfdmFsID0gKGppZmZpZXMgJiAweGZmZmYpOworCQl9CisJCWlybGFuX3Byb3ZpZGVyX3NlbmRfcmVwbHkoc2VsZiwgQ01EX09QRU5fREFUQV9DSEFOTkVMLCByZXQpOworCisJCWlmIChyZXQgPT0gUlNQX1NVQ0NFU1MpIHsKKwkJCWlybGFuX25leHRfcHJvdmlkZXJfc3RhdGUoc2VsZiwgSVJMQU5fT1BFTik7CisKKwkJCS8qIFNpZ25hbCBjbGllbnQgdGhhdCB3ZSBhcmUgbm93IG9wZW4gKi8KKwkJCWlybGFuX2RvX2NsaWVudF9ldmVudChzZWxmLCBJUkxBTl9QUk9WSURFUl9TSUdOQUwsIE5VTEwpOworCQl9CisJCWJyZWFrOworCWNhc2UgSVJMQU5fTE1QX0RJU0NPTk5FQ1Q6ICAvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgSVJMQU5fTEFQX0RJU0NPTk5FQ1Q6CisJCWlybGFuX25leHRfcHJvdmlkZXJfc3RhdGUoc2VsZiwgSVJMQU5fSURMRSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoIDAsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBldmVudCk7CisJCWJyZWFrOworCX0KKwlpZiAoc2tiKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhbl9wcm92aWRlcl9zdGF0ZV9vcGVuIChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIE9QRU4sIFRoZSBjbGllbnQgaGFzIGlzc3VlZCBhIE9wZW5EYXRhIGNvbW1hbmQgYW5kIGlzIGF3YWl0aW5nIGEKKyAqICAgIHJlcGx5CisgKgorICovCitzdGF0aWMgaW50IGlybGFuX3Byb3ZpZGVyX3N0YXRlX29wZW4oc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9FVkVOVCBldmVudCwgCisJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCXN3aXRjaChldmVudCkgeworCWNhc2UgSVJMQU5fRklMVEVSX0NPTkZJR19DTUQ6CisJCWlybGFuX3Byb3ZpZGVyX3BhcnNlX2NvbW1hbmQoc2VsZiwgQ01EX0ZJTFRFUl9PUEVSQVRJT04sIHNrYik7CisJCWlybGFuX3Byb3ZpZGVyX3NlbmRfcmVwbHkoc2VsZiwgQ01EX0ZJTFRFUl9PUEVSQVRJT04sIAorCQkJCQkgIFJTUF9TVUNDRVNTKTsKKwkJLyogS2VlcCBzdGF0ZSAqLworCQlicmVhazsKKwljYXNlIElSTEFOX0RBVEFfQ09OTkVDVF9JTkRJQ0FUSU9OOiAKKwkJaXJsYW5fbmV4dF9wcm92aWRlcl9zdGF0ZShzZWxmLCBJUkxBTl9EQVRBKTsKKwkJaXJsYW5fcHJvdmlkZXJfY29ubmVjdF9yZXNwb25zZShzZWxmLCBzZWxmLT50c2FwX2RhdGEpOworCQlicmVhazsKKwljYXNlIElSTEFOX0xNUF9ESVNDT05ORUNUOiAgLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIElSTEFOX0xBUF9ESVNDT05ORUNUOgorCQlpcmxhbl9uZXh0X3Byb3ZpZGVyX3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBldmVudCk7CisJCWJyZWFrOworCX0KKwlpZiAoc2tiKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFuX3Byb3ZpZGVyX3N0YXRlX2RhdGEgKHNlbGYsIGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgREFUQSwgVGhlIGRhdGEgY2hhbm5lbCBpcyBjb25uZWN0ZWQsIGFsbG93aW5nIGRhdGEgdHJhbnNmZXJzIGJldHdlZW4KKyAqICAgIHRoZSBsb2NhbCBhbmQgcmVtb3RlIG1hY2hpbmVzLgorICoKKyAqLworc3RhdGljIGludCBpcmxhbl9wcm92aWRlcl9zdGF0ZV9kYXRhKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fRVZFTlQgZXZlbnQsIAorCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm4gLTE7KTsKKworCXN3aXRjaChldmVudCkgeworCWNhc2UgSVJMQU5fRklMVEVSX0NPTkZJR19DTUQ6CisJCWlybGFuX3Byb3ZpZGVyX3BhcnNlX2NvbW1hbmQoc2VsZiwgQ01EX0ZJTFRFUl9PUEVSQVRJT04sIHNrYik7CisJCWlybGFuX3Byb3ZpZGVyX3NlbmRfcmVwbHkoc2VsZiwgQ01EX0ZJTFRFUl9PUEVSQVRJT04sIAorCQkJCQkgIFJTUF9TVUNDRVNTKTsKKwkJYnJlYWs7CisJY2FzZSBJUkxBTl9MTVBfRElTQ09OTkVDVDogLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIElSTEFOX0xBUF9ESVNDT05ORUNUOgorCQlpcmxhbl9uZXh0X3Byb3ZpZGVyX3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKCAwLCAiJXMoKSwgVW5rbm93biBldmVudCAlZFxuIiwgX19GVU5DVElPTl9fICwgZXZlbnQpOworCQlicmVhazsKKwl9CisJaWYgKHNrYikKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQorCXJldHVybiAwOworfQorCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmxhcC5jIGIvbmV0L2lyZGEvaXJsYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDZhZDA3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJsYXAuYwpAQCAtMCwwICsxLDEyNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGaWxlbmFtZTogICAgICBpcmxhcC5jCisgKiBWZXJzaW9uOiAgICAgICAxLjAKKyAqIERlc2NyaXB0aW9uOiAgIElyTEFQIGltcGxlbWVudGF0aW9uIGZvciBMaW51eAorICogU3RhdHVzOiAgICAgICAgU3RhYmxlCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBNb24gQXVnICA0IDIwOjQwOjUzIDE5OTcKKyAqIE1vZGlmaWVkIGF0OiAgIFR1ZSBEZWMgMTQgMDk6MjY6NDQgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICoKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBEYWcgQnJhdHRsaSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcnF1ZXVlLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcF9mcmFtZS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFwX2ZyYW1lLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS90aW1lci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL3Fvcy5oPgorCitzdGF0aWMgaGFzaGJpbl90ICppcmxhcCA9IE5VTEw7CitpbnQgc3lzY3RsX3Nsb3RfdGltZW91dCA9IFNMT1RfVElNRU9VVCAqIDEwMDAgLyBIWjsKKworLyogVGhpcyBpcyB0aGUgZGVsYXkgb2YgbWlzc2VkIHBmIHBlcmlvZCBiZWZvcmUgZ2VuZXJhdGluZyBhbiBldmVudAorICogdG8gdGhlIGFwcGxpY2F0aW9uLiBUaGUgc3BlYyBtYW5kYXRlIDMgc2Vjb25kcywgYnV0IGluIHNvbWUgY2FzZXMKKyAqIGl0J3Mgd2F5IHRvbyBsb25nLiAtIEplYW4gSUkgKi8KK2ludCBzeXNjdGxfd2Fybl9ub3JlcGx5X3RpbWUgPSAzOworCitleHRlcm4gdm9pZCBpcmxhcF9xdWV1ZV94bWl0KHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBfX2lybGFwX2Nsb3NlKHN0cnVjdCBpcmxhcF9jYiAqc2VsZik7CitzdGF0aWMgdm9pZCBpcmxhcF9pbml0X3Fvc19jYXBhYmlsaXRpZXMoc3RydWN0IGlybGFwX2NiICpzZWxmLAorCQkJCQlzdHJ1Y3QgcW9zX2luZm8gKnFvc191c2VyKTsKKworI2lmZGVmIENPTkZJR19JUkRBX0RFQlVHCitzdGF0aWMgY2hhciAqbGFwX3JlYXNvbnNbXSA9IHsKKwkiRVJST1IsIE5PVCBVU0VEIiwKKwkiTEFQX0RJU0NfSU5ESUNBVElPTiIsCisJIkxBUF9OT19SRVNQT05TRSIsCisJIkxBUF9SRVNFVF9JTkRJQ0FUSU9OIiwKKwkiTEFQX0ZPVU5EX05PTkUiLAorCSJMQVBfTUVESUFfQlVTWSIsCisJIkxBUF9QUklNQVJZX0NPTkZMSUNUIiwKKwkiRVJST1IsIE5PVCBVU0VEIiwKK307CisjZW5kaWYJLyogQ09ORklHX0lSREFfREVCVUcgKi8KKworaW50IF9faW5pdCBpcmxhcF9pbml0KHZvaWQpCit7CisJLyogQ2hlY2sgaWYgdGhlIGNvbXBpbGVyIGRpZCBpdHMgam9iIHByb3Blcmx5LgorCSAqIE1heSBoYXBwZW4gb24gc29tZSBBUk0gY29uZmlndXJhdGlvbiwgY2hlY2sgd2l0aCBSdXNzZWxsIEtpbmcuICovCisJSVJEQV9BU1NFUlQoc2l6ZW9mKHN0cnVjdCB4aWRfZnJhbWUpID09IDE0LCA7KTsKKwlJUkRBX0FTU0VSVChzaXplb2Yoc3RydWN0IHRlc3RfZnJhbWUpID09IDEwLCA7KTsKKwlJUkRBX0FTU0VSVChzaXplb2Yoc3RydWN0IHVhX2ZyYW1lKSA9PSAxMCwgOyk7CisJSVJEQV9BU1NFUlQoc2l6ZW9mKHN0cnVjdCBzbnJtX2ZyYW1lKSA9PSAxMSwgOyk7CisKKwkvKiBBbGxvY2F0ZSBtYXN0ZXIgYXJyYXkgKi8KKwlpcmxhcCA9IGhhc2hiaW5fbmV3KEhCX0xPQ0spOworCWlmIChpcmxhcCA9PSBOVUxMKSB7CisJICAgICAgICBJUkRBX0VSUk9SKCIlczogY2FuJ3QgYWxsb2NhdGUgaXJsYXAgaGFzaGJpbiFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBfX2V4aXQgaXJsYXBfY2xlYW51cCh2b2lkKQoreworCUlSREFfQVNTRVJUKGlybGFwICE9IE5VTEwsIHJldHVybjspOworCisJaGFzaGJpbl9kZWxldGUoaXJsYXAsIChGUkVFX0ZVTkMpIF9faXJsYXBfY2xvc2UpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfb3BlbiAoZHJpdmVyKQorICoKKyAqICAgIEluaXRpYWxpemUgSXJMQVAgbGF5ZXIKKyAqCisgKi8KK3N0cnVjdCBpcmxhcF9jYiAqaXJsYXBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcW9zX2luZm8gKnFvcywKKwkJCSAgICBjb25zdCBjaGFyICpod19uYW1lKQoreworCXN0cnVjdCBpcmxhcF9jYiAqc2VsZjsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBpcmxhcCBzdHJ1Y3R1cmUuICovCisJc2VsZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcmxhcF9jYiksIEdGUF9LRVJORUwpOworCWlmIChzZWxmID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KHNlbGYsIDAsIHNpemVvZihzdHJ1Y3QgaXJsYXBfY2IpKTsKKwlzZWxmLT5tYWdpYyA9IExBUF9NQUdJQzsKKworCS8qIE1ha2UgYSBiaW5kaW5nIGJldHdlZW4gdGhlIGxheWVycyAqLworCXNlbGYtPm5ldGRldiA9IGRldjsKKwlzZWxmLT5xb3NfZGV2ID0gcW9zOworCS8qIENvcHkgaGFyZHdhcmUgbmFtZSAqLworCWlmKGh3X25hbWUgIT0gTlVMTCkgeworCQlzdHJsY3B5KHNlbGYtPmh3X25hbWUsIGh3X25hbWUsIHNpemVvZihzZWxmLT5od19uYW1lKSk7CisJfSBlbHNlIHsKKwkJc2VsZi0+aHdfbmFtZVswXSA9ICdcMCc7CisJfQorCisJLyogRklYTUU6IHNob3VsZCB3ZSBnZXQgb3VyIG93biBmaWVsZD8gKi8KKwlkZXYtPmF0YWxrX3B0ciA9IHNlbGY7CisKKwlzZWxmLT5zdGF0ZSA9IExBUF9PRkZMSU5FOworCisJLyogSW5pdGlhbGl6ZSB0cmFuc21pdCBxdWV1ZSAqLworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnNlbGYtPnR4cSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2VsZi0+dHhxX3VsdHJhKTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZzZWxmLT53eF9saXN0KTsKKworCS8qIE15IHVuaXF1ZSBJckxBUCBkZXZpY2UgYWRkcmVzcyEgKi8KKwkvKiBXZSBkb24ndCB3YW50IHRoZSBicm9hZGNhc3QgYWRkcmVzcywgbmVpdGhlciB0aGUgTlVMTCBhZGRyZXNzCisJICogKG1vc3Qgb2Z0ZW4gdXNlZCB0byBzaWduaWZ5ICJpbnZhbGlkIiksIGFuZCB3ZSBkb24ndCB3YW50IGFuCisJICogYWRkcmVzcyBhbHJlYWR5IGluIHVzZSAob3RoZXJ3aXNlIGNvbm5lY3Qgd29uJ3QgYmUgYWJsZQorCSAqIHRvIHNlbGVjdCB0aGUgcHJvcGVyIGxpbmspLiAtIEplYW4gSUkgKi8KKwlkbyB7CisJCWdldF9yYW5kb21fYnl0ZXMoJnNlbGYtPnNhZGRyLCBzaXplb2Yoc2VsZi0+c2FkZHIpKTsKKwl9IHdoaWxlICgoc2VsZi0+c2FkZHIgPT0gMHgwKSB8fCAoc2VsZi0+c2FkZHIgPT0gQlJPQURDQVNUKSB8fAorCQkgKGhhc2hiaW5fbG9ja19maW5kKGlybGFwLCBzZWxmLT5zYWRkciwgTlVMTCkpICk7CisJLyogQ29weSB0byB0aGUgZHJpdmVyICovCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsICZzZWxmLT5zYWRkciwgNCk7CisKKwlpbml0X3RpbWVyKCZzZWxmLT5zbG90X3RpbWVyKTsKKwlpbml0X3RpbWVyKCZzZWxmLT5xdWVyeV90aW1lcik7CisJaW5pdF90aW1lcigmc2VsZi0+ZGlzY292ZXJ5X3RpbWVyKTsKKwlpbml0X3RpbWVyKCZzZWxmLT5maW5hbF90aW1lcik7CisJaW5pdF90aW1lcigmc2VsZi0+cG9sbF90aW1lcik7CisJaW5pdF90aW1lcigmc2VsZi0+d2RfdGltZXIpOworCWluaXRfdGltZXIoJnNlbGYtPmJhY2tvZmZfdGltZXIpOworCWluaXRfdGltZXIoJnNlbGYtPm1lZGlhX2J1c3lfdGltZXIpOworCisJaXJsYXBfYXBwbHlfZGVmYXVsdF9jb25uZWN0aW9uX3BhcmFtZXRlcnMoc2VsZik7CisKKwlzZWxmLT5OMyA9IDM7IC8qICMgY29ubmVjdGlvbnMgYXR0ZW10cyB0byB0cnkgYmVmb3JlIGdpdmluZyB1cCAqLworCisJc2VsZi0+c3RhdGUgPSBMQVBfTkRNOworCisJaGFzaGJpbl9pbnNlcnQoaXJsYXAsIChpcmRhX3F1ZXVlX3QgKikgc2VsZiwgc2VsZi0+c2FkZHIsIE5VTEwpOworCisJaXJsbXBfcmVnaXN0ZXJfbGluayhzZWxmLCBzZWxmLT5zYWRkciwgJnNlbGYtPm5vdGlmeSk7CisKKwlyZXR1cm4gc2VsZjsKK30KK0VYUE9SVF9TWU1CT0woaXJsYXBfb3Blbik7CisKKy8qCisgKiBGdW5jdGlvbiBfX2lybGFwX2Nsb3NlIChzZWxmKQorICoKKyAqICAgIFJlbW92ZSBJckxBUCBhbmQgYWxsIGFsbG9jYXRlZCBtZW1vcnkuIFN0b3AgYW55IHBlbmRpbmcgdGltZXJzLgorICoKKyAqLworc3RhdGljIHZvaWQgX19pcmxhcF9jbG9zZShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYpCit7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCisJLyogU3RvcCB0aW1lcnMgKi8KKwlkZWxfdGltZXIoJnNlbGYtPnNsb3RfdGltZXIpOworCWRlbF90aW1lcigmc2VsZi0+cXVlcnlfdGltZXIpOworCWRlbF90aW1lcigmc2VsZi0+ZGlzY292ZXJ5X3RpbWVyKTsKKwlkZWxfdGltZXIoJnNlbGYtPmZpbmFsX3RpbWVyKTsKKwlkZWxfdGltZXIoJnNlbGYtPnBvbGxfdGltZXIpOworCWRlbF90aW1lcigmc2VsZi0+d2RfdGltZXIpOworCWRlbF90aW1lcigmc2VsZi0+YmFja29mZl90aW1lcik7CisJZGVsX3RpbWVyKCZzZWxmLT5tZWRpYV9idXN5X3RpbWVyKTsKKworCWlybGFwX2ZsdXNoX2FsbF9xdWV1ZXMoc2VsZik7CisKKwlzZWxmLT5tYWdpYyA9IDA7CisKKwlrZnJlZShzZWxmKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX2Nsb3NlIChzZWxmKQorICoKKyAqICAgIFJlbW92ZSBJckxBUCBpbnN0YW5jZQorICoKKyAqLwordm9pZCBpcmxhcF9jbG9zZShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYpCit7CisJc3RydWN0IGlybGFwX2NiICpsYXA7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCisJLyogV2UgdXNlZCB0byBzZW5kIGEgTEFQX0RJU0NfSU5ESUNBVElPTiBoZXJlLCBidXQgdGhpcyB3YXMKKwkgKiByYWN5LiBUaGlzIGhhcyBiZWVuIG1vdmUgd2l0aGluIGlybG1wX3VucmVnaXN0ZXJfbGluaygpCisJICogaXRzZWxmLiBKZWFuIElJICovCisKKwkvKiBLaWxsIHRoZSBMQVAgYW5kIGFsbCBMU0FQcyBvbiB0b3Agb2YgaXQgKi8KKwlpcmxtcF91bnJlZ2lzdGVyX2xpbmsoc2VsZi0+c2FkZHIpOworCXNlbGYtPm5vdGlmeS5pbnN0YW5jZSA9IE5VTEw7CisKKwkvKiBCZSBzdXJlIHRoYXQgd2UgbWFuYWdlIHRvIHJlbW92ZSBvdXJzZWxmIGZyb20gdGhlIGhhc2ggKi8KKwlsYXAgPSBoYXNoYmluX3JlbW92ZShpcmxhcCwgc2VsZi0+c2FkZHIsIE5VTEwpOworCWlmICghbGFwKSB7CisJCUlSREFfREVCVUcoMSwgIiVzKCksIERpZG4ndCBmaW5kIG15c2VsZiFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisJX19pcmxhcF9jbG9zZShsYXApOworfQorRVhQT1JUX1NZTUJPTChpcmxhcF9jbG9zZSk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9jb25uZWN0X2luZGljYXRpb24gKHNlbGYsIHNrYikKKyAqCisgKiAgICBBbm90aGVyIGRldmljZSBpcyBhdHRlbXB0aW5nIHRvIG1ha2UgYSBjb25uZWN0aW9uCisgKgorICovCit2b2lkIGlybGFwX2Nvbm5lY3RfaW5kaWNhdGlvbihzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKworCWlybGFwX2luaXRfcW9zX2NhcGFiaWxpdGllcyhzZWxmLCBOVUxMKTsgLyogTm8gdXNlciBRb1MhICovCisKKwlpcmxtcF9saW5rX2Nvbm5lY3RfaW5kaWNhdGlvbihzZWxmLT5ub3RpZnkuaW5zdGFuY2UsIHNlbGYtPnNhZGRyLAorCQkJCSAgICAgIHNlbGYtPmRhZGRyLCAmc2VsZi0+cW9zX3R4LCBza2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfY29ubmVjdF9yZXNwb25zZSAoc2VsZiwgc2tiKQorICoKKyAqICAgIFNlcnZpY2UgdXNlciBoYXMgYWNjZXB0ZWQgaW5jb21pbmcgY29ubmVjdGlvbgorICoKKyAqLwordm9pZCBpcmxhcF9jb25uZWN0X3Jlc3BvbnNlKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnVzZXJkYXRhKQoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpcmxhcF9kb19ldmVudChzZWxmLCBDT05ORUNUX1JFU1BPTlNFLCB1c2VyZGF0YSwgTlVMTCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9jb25uZWN0X3JlcXVlc3QgKHNlbGYsIGRhZGRyLCBxb3NfdXNlciwgc25pZmYpCisgKgorICogICAgUmVxdWVzdCBjb25uZWN0aW9uIHdpdGggYW5vdGhlciBkZXZpY2UsIHNuaWZmaW5nIGlzIG5vdCBpbXBsZW1lbnRlZAorICogICAgeWV0LgorICoKKyAqLwordm9pZCBpcmxhcF9jb25uZWN0X3JlcXVlc3Qoc3RydWN0IGlybGFwX2NiICpzZWxmLCBfX3UzMiBkYWRkciwKKwkJCSAgIHN0cnVjdCBxb3NfaW5mbyAqcW9zX3VzZXIsIGludCBzbmlmZikKK3sKKwlJUkRBX0RFQlVHKDMsICIlcygpLCBkYWRkcj0weCUwOHhcbiIsIF9fRlVOQ1RJT05fXywgZGFkZHIpOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCisJc2VsZi0+ZGFkZHIgPSBkYWRkcjsKKworCS8qCisJICogIElmIHRoZSBzZXJ2aWNlIHVzZXIgc3BlY2lmaWVzIFFvUyB2YWx1ZXMgZm9yIHRoaXMgY29ubmVjdGlvbiwKKwkgKiAgdGhlbiB1c2UgdGhlbQorCSAqLworCWlybGFwX2luaXRfcW9zX2NhcGFiaWxpdGllcyhzZWxmLCBxb3NfdXNlcik7CisKKwlpZiAoKHNlbGYtPnN0YXRlID09IExBUF9ORE0pICYmICFzZWxmLT5tZWRpYV9idXN5KQorCQlpcmxhcF9kb19ldmVudChzZWxmLCBDT05ORUNUX1JFUVVFU1QsIE5VTEwsIE5VTEwpOworCWVsc2UKKwkJc2VsZi0+Y29ubmVjdF9wZW5kaW5nID0gVFJVRTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX2Nvbm5lY3RfY29uZmlybSAoc2VsZiwgc2tiKQorICoKKyAqICAgIENvbm5lY3Rpb24gcmVxdWVzdCBoYXMgYmVlbiBhY2NlcHRlZAorICoKKyAqLwordm9pZCBpcmxhcF9jb25uZWN0X2NvbmZpcm0oc3RydWN0IGlybGFwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CisKKwlpcmxtcF9saW5rX2Nvbm5lY3RfY29uZmlybShzZWxmLT5ub3RpZnkuaW5zdGFuY2UsICZzZWxmLT5xb3NfdHgsIHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9kYXRhX2luZGljYXRpb24gKHNlbGYsIHNrYikKKyAqCisgKiAgICBSZWNlaXZlZCBkYXRhIGZyYW1lcyBmcm9tIElSLXBvcnQsIHNvIHdlIGp1c3QgcGFzcyB0aGVtIHVwIHRvCisgKiAgICBJckxNUCBmb3IgZnVydGhlciBwcm9jZXNzaW5nCisgKgorICovCit2b2lkIGlybGFwX2RhdGFfaW5kaWNhdGlvbihzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICBpbnQgdW5yZWxpYWJsZSkKK3sKKwkvKiBIaWRlIExBUCBoZWFkZXIgZnJvbSBJckxNUCBsYXllciAqLworCXNrYl9wdWxsKHNrYiwgTEFQX0FERFJfSEVBREVSK0xBUF9DVFJMX0hFQURFUik7CisKKwlpcmxtcF9saW5rX2RhdGFfaW5kaWNhdGlvbihzZWxmLT5ub3RpZnkuaW5zdGFuY2UsIHNrYiwgdW5yZWxpYWJsZSk7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX2RhdGFfcmVxdWVzdCAoc2VsZiwgc2tiKQorICoKKyAqICAgIFF1ZXVlIGRhdGEgZm9yIHRyYW5zbWlzc2lvbiwgbXVzdCB3YWl0IHVudGlsIFhNSVQgc3RhdGUKKyAqCisgKi8KK3ZvaWQgaXJsYXBfZGF0YV9yZXF1ZXN0KHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCWludCB1bnJlbGlhYmxlKQoreworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKworCUlSREFfREVCVUcoMywgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChza2JfaGVhZHJvb20oc2tiKSA+PSAoTEFQX0FERFJfSEVBREVSK0xBUF9DVFJMX0hFQURFUiksCisJCSAgICByZXR1cm47KTsKKwlza2JfcHVzaChza2IsIExBUF9BRERSX0hFQURFUitMQVBfQ1RSTF9IRUFERVIpOworCisJLyoKKwkgKiAgTXVzdCBzZXQgZnJhbWUgZm9ybWF0IG5vdyBzbyB0aGF0IHRoZSByZXN0IG9mIHRoZSBjb2RlIGtub3dzCisJICogIGlmIGl0cyBkZWFsaW5nIHdpdGggYW4gSSBvciBhbiBVSSBmcmFtZQorCSAqLworCWlmICh1bnJlbGlhYmxlKQorCQlza2ItPmRhdGFbMV0gPSBVSV9GUkFNRTsKKwllbHNlCisJCXNrYi0+ZGF0YVsxXSA9IElfRlJBTUU7CisKKwkvKiBEb24ndCBmb3JnZXQgdG8gcmVmY291bnQgaXQgLSBzZWUgaXJsbXBfY29ubmVjdF9yZXF1ZXN0KCkuICovCisJc2tiX2dldChza2IpOworCisJLyogQWRkIGF0IHRoZSBlbmQgb2YgdGhlIHF1ZXVlIChrZWVwIG9yZGVyaW5nKSAtIEplYW4gSUkgKi8KKwlza2JfcXVldWVfdGFpbCgmc2VsZi0+dHhxLCBza2IpOworCisJLyoKKwkgKiAgU2VuZCBldmVudCBpZiB0aGlzIGZyYW1lIG9ubHkgaWYgd2UgYXJlIGluIHRoZSByaWdodCBzdGF0ZQorCSAqICBGSVhNRTogdWRhdGEgc2hvdWxkIGJlIHNlbnQgZmlyc3QhIChza2JfcXVldWVfaGVhZD8pCisJICovCisJaWYgKChzZWxmLT5zdGF0ZSA9PSBMQVBfWE1JVF9QKSB8fCAoc2VsZi0+c3RhdGUgPT0gTEFQX1hNSVRfUykpIHsKKwkJLyogSWYgd2UgYXJlIG5vdCBhbHJlYWR5IHByb2Nlc3NpbmcgdGhlIFR4IHF1ZXVlLCB0cmlnZ2VyCisJCSAqIHRyYW5zbWlzc2lvbiBpbW1lZGlhdGVseSAtIEplYW4gSUkgKi8KKwkJaWYoKHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4cSkgPD0gMSkgJiYgKCFzZWxmLT5sb2NhbF9idXN5KSkKKwkJCWlybGFwX2RvX2V2ZW50KHNlbGYsIERBVEFfUkVRVUVTVCwgc2tiLCBOVUxMKTsKKwkJLyogT3RoZXJ3aXNlLCB0aGUgcGFja2V0cyB3aWxsIGJlIHNlbnQgbm9ybWFsbHkgYXQgdGhlCisJCSAqIG5leHQgcGYtcG9sbCAtIEplYW4gSUkgKi8KKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF91bml0ZGF0YV9yZXF1ZXN0IChzZWxmLCBza2IpCisgKgorICogICAgU2VuZCBVbHRyYSBkYXRhLiBUaGlzIGlzIGRhdGEgdGhhdCBtdXN0IGJlIHNlbnQgb3V0c2lkZSBhbnkgY29ubmVjdGlvbgorICoKKyAqLworI2lmZGVmIENPTkZJR19JUkRBX1VMVFJBCit2b2lkIGlybGFwX3VuaXRkYXRhX3JlcXVlc3Qoc3RydWN0IGlybGFwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKworCUlSREFfREVCVUcoMywgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChza2JfaGVhZHJvb20oc2tiKSA+PSAoTEFQX0FERFJfSEVBREVSK0xBUF9DVFJMX0hFQURFUiksCisJICAgICAgIHJldHVybjspOworCXNrYl9wdXNoKHNrYiwgTEFQX0FERFJfSEVBREVSK0xBUF9DVFJMX0hFQURFUik7CisKKwlza2ItPmRhdGFbMF0gPSBDQlJPQURDQVNUOworCXNrYi0+ZGF0YVsxXSA9IFVJX0ZSQU1FOworCisJLyogRG9uJ3QgbmVlZCB0byByZWZjb3VudCwgc2VlIGlybG1wX2Nvbm5sZXNzX2RhdGFfcmVxdWVzdCgpICovCisKKwlza2JfcXVldWVfdGFpbCgmc2VsZi0+dHhxX3VsdHJhLCBza2IpOworCisJaXJsYXBfZG9fZXZlbnQoc2VsZiwgU0VORF9VSV9GUkFNRSwgTlVMTCwgTlVMTCk7Cit9CisjZW5kaWYgLypDT05GSUdfSVJEQV9VTFRSQSAqLworCisvKgorICogRnVuY3Rpb24gaXJsYXBfdWRhdGFfaW5kaWNhdGlvbiAoc2VsZiwgc2tiKQorICoKKyAqICAgIFJlY2VpdmUgVWx0cmEgZGF0YS4gVGhpcyBpcyBkYXRhIHRoYXQgaXMgcmVjZWl2ZWQgb3V0c2lkZSBhbnkgY29ubmVjdGlvbgorICoKKyAqLworI2lmZGVmIENPTkZJR19JUkRBX1VMVFJBCit2b2lkIGlybGFwX3VuaXRkYXRhX2luZGljYXRpb24oc3RydWN0IGlybGFwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfREVCVUcoMSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOworCisJLyogSGlkZSBMQVAgaGVhZGVyIGZyb20gSXJMTVAgbGF5ZXIgKi8KKwlza2JfcHVsbChza2IsIExBUF9BRERSX0hFQURFUitMQVBfQ1RSTF9IRUFERVIpOworCisJaXJsbXBfbGlua191bml0ZGF0YV9pbmRpY2F0aW9uKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSwgc2tiKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfSVJEQV9VTFRSQSAqLworCisvKgorICogRnVuY3Rpb24gaXJsYXBfZGlzY29ubmVjdF9yZXF1ZXN0ICh2b2lkKQorICoKKyAqICAgIFJlcXVlc3QgdG8gZGlzY29ubmVjdCBjb25uZWN0aW9uIGJ5IHNlcnZpY2UgdXNlcgorICovCit2b2lkIGlybGFwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYpCit7CisJSVJEQV9ERUJVRygzLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKworCS8qIERvbid0IGRpc2Nvbm5lY3QgdW50aWwgYWxsIGRhdGEgZnJhbWVzIGFyZSBzdWNjZXNzZnVsbHkgc2VudCAqLworCWlmIChza2JfcXVldWVfbGVuKCZzZWxmLT50eHEpID4gMCkgeworCQlzZWxmLT5kaXNjb25uZWN0X3BlbmRpbmcgPSBUUlVFOworCisJCXJldHVybjsKKwl9CisKKwkvKiBDaGVjayBpZiB3ZSBhcmUgaW4gdGhlIHJpZ2h0IHN0YXRlIGZvciBkaXNjb25uZWN0aW5nICovCisJc3dpdGNoIChzZWxmLT5zdGF0ZSkgeworCWNhc2UgTEFQX1hNSVRfUDogICAgICAgIC8qIEZBTExUUk9VR0ggKi8KKwljYXNlIExBUF9YTUlUX1M6ICAgICAgICAvKiBGQUxMVFJPVUdIICovCisJY2FzZSBMQVBfQ09OTjogICAgICAgICAgLyogRkFMTFRST1VHSCAqLworCWNhc2UgTEFQX1JFU0VUX1dBSVQ6ICAgIC8qIEZBTExUUk9VR0ggKi8KKwljYXNlIExBUF9SRVNFVF9DSEVDSzoKKwkJaXJsYXBfZG9fZXZlbnQoc2VsZiwgRElTQ09OTkVDVF9SRVFVRVNULCBOVUxMLCBOVUxMKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgZGlzY29ubmVjdCBwZW5kaW5nIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJc2VsZi0+ZGlzY29ubmVjdF9wZW5kaW5nID0gVFJVRTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uICh2b2lkKQorICoKKyAqICAgIERpc2Nvbm5lY3QgcmVxdWVzdCBmcm9tIG90aGVyIGRldmljZQorICoKKyAqLwordm9pZCBpcmxhcF9kaXNjb25uZWN0X2luZGljYXRpb24oc3RydWN0IGlybGFwX2NiICpzZWxmLCBMQVBfUkVBU09OIHJlYXNvbikKK3sKKwlJUkRBX0RFQlVHKDEsICIlcygpLCByZWFzb249JXNcbiIsIF9fRlVOQ1RJT05fXywgbGFwX3JlYXNvbnNbcmVhc29uXSk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CisKKwkvKiBGbHVzaCBxdWV1ZXMgKi8KKwlpcmxhcF9mbHVzaF9hbGxfcXVldWVzKHNlbGYpOworCisJc3dpdGNoIChyZWFzb24pIHsKKwljYXNlIExBUF9SRVNFVF9JTkRJQ0FUSU9OOgorCQlJUkRBX0RFQlVHKDEsICIlcygpLCBTZW5kaW5nIHJlc2V0IHJlcXVlc3QhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlpcmxhcF9kb19ldmVudChzZWxmLCBSRVNFVF9SRVFVRVNULCBOVUxMLCBOVUxMKTsKKwkJYnJlYWs7CisJY2FzZSBMQVBfTk9fUkVTUE9OU0U6CSAgIC8qIEZBTExUUk9VR0ggKi8KKwljYXNlIExBUF9ESVNDX0lORElDQVRJT046ICAvKiBGQUxMVFJPVUdIICovCisJY2FzZSBMQVBfRk9VTkRfTk9ORTogICAgICAgLyogRkFMTFRST1VHSCAqLworCWNhc2UgTEFQX01FRElBX0JVU1k6CisJCWlybG1wX2xpbmtfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSwgc2VsZiwKKwkJCQkJCSByZWFzb24sIE5VTEwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0VSUk9SKCIlczogVW5rbm93biByZWFzb24gJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVhc29uKTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9kaXNjb3ZlcnlfcmVxdWVzdCAoZ2VuX2FkZHJfYml0KQorICoKKyAqICAgIFN0YXJ0IG9uZSBzaW5nbGUgZGlzY292ZXJ5IG9wZXJhdGlvbi4KKyAqCisgKi8KK3ZvaWQgaXJsYXBfZGlzY292ZXJ5X3JlcXVlc3Qoc3RydWN0IGlybGFwX2NiICpzZWxmLCBkaXNjb3ZlcnlfdCAqZGlzY292ZXJ5KQoreworCXN0cnVjdCBpcmxhcF9pbmZvIGluZm87CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoZGlzY292ZXJ5ICE9IE5VTEwsIHJldHVybjspOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgbnNsb3RzID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgZGlzY292ZXJ5LT5uc2xvdHMpOworCisJSVJEQV9BU1NFUlQoKGRpc2NvdmVyeS0+bnNsb3RzID09IDEpIHx8IChkaXNjb3ZlcnktPm5zbG90cyA9PSA2KSB8fAorCQkgICAgKGRpc2NvdmVyeS0+bnNsb3RzID09IDgpIHx8IChkaXNjb3ZlcnktPm5zbG90cyA9PSAxNiksCisJCSAgICByZXR1cm47KTsKKworCS8qIERpc2NvdmVyeSBpcyBvbmx5IHBvc3NpYmxlIGluIE5ETSBtb2RlICovCisJaWYgKHNlbGYtPnN0YXRlICE9IExBUF9ORE0pIHsKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgZGlzY292ZXJ5IG9ubHkgcG9zc2libGUgaW4gTkRNIG1vZGVcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlpcmxhcF9kaXNjb3ZlcnlfY29uZmlybShzZWxmLCBOVUxMKTsKKwkJLyogTm90ZSA6IGluIHRoZW9yeSwgaWYgd2UgYXJlIG5vdCBpbiBORE0sIHdlIGNvdWxkIHBvc3Rwb25lCisJCSAqIHRoZSBkaXNjb3ZlcnkgbGlrZSB3ZSBkbyBmb3IgY29ubmVjdGlvbiByZXF1ZXN0LgorCQkgKiBJbiBwcmFjdGljZSwgaXQncyBub3Qgd29ydGggaXQuIElmIHRoZSBtZWRpYSB3YXMgYnVzeSwKKwkJICogaXQncyBsaWtlbHkgbmV4dCB0aW1lIGFyb3VuZCBpdCB3b24ndCBiZSBidXN5LiBJZiB3ZSBhcmUKKwkJICogaW4gUkVQTFkgc3RhdGUsIHdlIHdpbGwgZ2V0IHBhc3NpdmUgZGlzY292ZXJ5IGluZm8gJiBldmVudC4KKwkJICogSmVhbiBJSSAqLworCQlyZXR1cm47CisJfQorCisJLyogQ2hlY2sgaWYgbGFzdCBkaXNjb3ZlcnkgcmVxdWVzdCBmaW5pc2hlZCBpbiB0aW1lLCBvciBpZgorCSAqIGl0IHdhcyBhYm9ydGVkIGR1ZSB0byB0aGUgbWVkaWEgYnVzeSBmbGFnLiAqLworCWlmIChzZWxmLT5kaXNjb3ZlcnlfbG9nICE9IE5VTEwpIHsKKwkJaGFzaGJpbl9kZWxldGUoc2VsZi0+ZGlzY292ZXJ5X2xvZywgKEZSRUVfRlVOQykga2ZyZWUpOworCQlzZWxmLT5kaXNjb3ZlcnlfbG9nID0gTlVMTDsKKwl9CisKKwkvKiBBbGwgb3BlcmF0aW9ucyB3aWxsIG9jY3VyIGF0IHByZWRpY3RhYmxlIHRpbWUsIG5vIG5lZWQgdG8gbG9jayAqLworCXNlbGYtPmRpc2NvdmVyeV9sb2cgPSBoYXNoYmluX25ldyhIQl9OT0xPQ0spOworCisJaWYgKHNlbGYtPmRpc2NvdmVyeV9sb2cgPT0gTlVMTCkgeworCQlJUkRBX1dBUk5JTkcoIiVzKCksIFVuYWJsZSB0byBhbGxvY2F0ZSBkaXNjb3ZlcnkgbG9nIVxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCWluZm8uUyA9IGRpc2NvdmVyeS0+bnNsb3RzOyAvKiBOdW1iZXIgb2Ygc2xvdHMgKi8KKwlpbmZvLnMgPSAwOyAvKiBDdXJyZW50IHNsb3QgKi8KKworCXNlbGYtPmRpc2NvdmVyeV9jbWQgPSBkaXNjb3Zlcnk7CisJaW5mby5kaXNjb3ZlcnkgPSBkaXNjb3Zlcnk7CisKKwkvKiBzeXNjdGxfc2xvdF90aW1lb3V0IGJvdW5kcyBhcmUgY2hlY2tlZCBpbiBpcnN5c2N0bC5jIC0gSmVhbiBJSSAqLworCXNlbGYtPnNsb3RfdGltZW91dCA9IHN5c2N0bF9zbG90X3RpbWVvdXQgKiBIWiAvIDEwMDA7CisKKwlpcmxhcF9kb19ldmVudChzZWxmLCBESVNDT1ZFUllfUkVRVUVTVCwgTlVMTCwgJmluZm8pOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfZGlzY292ZXJ5X2NvbmZpcm0gKGxvZykKKyAqCisgKiAgICBBIGRldmljZSBoYXMgYmVlbiBkaXNjb3ZlcmVkIGluIGZyb250IG9mIHRoaXMgc3RhdGlvbiwgd2UKKyAqICAgIHJlcG9ydCBkaXJlY3RseSB0byBMTVAuCisgKi8KK3ZvaWQgaXJsYXBfZGlzY292ZXJ5X2NvbmZpcm0oc3RydWN0IGlybGFwX2NiICpzZWxmLCBoYXNoYmluX3QgKmRpc2NvdmVyeV9sb2cpCit7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCisJSVJEQV9BU1NFUlQoc2VsZi0+bm90aWZ5Lmluc3RhbmNlICE9IE5VTEwsIHJldHVybjspOworCisJLyoKKwkgKiBDaGVjayBmb3Igc3VjY2Vzc2Z1bCBkaXNjb3ZlcnksIHNpbmNlIHdlIGFyZSB0aGVuIGFsbG93ZWQgdG8gY2xlYXIKKwkgKiB0aGUgbWVkaWEgYnVzeSBjb25kaXRpb24gKElyTEFQIDYuMTMuNCAtIHAuOTQpLiBUaGlzIHNob3VsZCBhbGxvdworCSAqIHVzIHRvIG1ha2UgY29ubmVjdGlvbiBhdHRlbXB0cyBtdWNoIGZhc3RlciBhbmQgZWFzaWVyIChpLmUuIG5vCisJICogY29sbGlzaW9ucykuCisJICogU2V0dGluZyBtZWRpYSBidXN5IHRvIGZhbHNlIHdpbGwgYWxzbyBnZW5lcmF0ZSBhbiBldmVudCBhbGxvd2luZworCSAqIHRvIHByb2Nlc3MgcGVuZGluZyBldmVudHMgaW4gTkRNIHN0YXRlIG1hY2hpbmUuCisJICogTm90ZSA6IHRoZSBzcGVjIGRvZXNuJ3QgZGVmaW5lIHdoYXQncyBhIHN1Y2Nlc3NmdWwgZGlzY292ZXJ5IGlzLgorCSAqIElmIHdlIHdhbnQgVWx0cmEgdG8gd29yaywgaXQncyBzdWNjZXNzZnVsIGV2ZW4gaWYgdGhlcmUgaXMKKwkgKiBub2JvZHkgZGlzY292ZXJlZCAtIEplYW4gSUkKKwkgKi8KKwlpZiAoZGlzY292ZXJ5X2xvZykKKwkJaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3koc2VsZi0+bmV0ZGV2LCBGQUxTRSk7CisKKwkvKiBJbmZvcm0gSXJMTVAgKi8KKwlpcmxtcF9saW5rX2Rpc2NvdmVyeV9jb25maXJtKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSwgZGlzY292ZXJ5X2xvZyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9kaXNjb3ZlcnlfaW5kaWNhdGlvbiAobG9nKQorICoKKyAqICAgIFNvbWVib2R5IGlzIHRyeWluZyB0byBkaXNjb3ZlciB1cyEKKyAqCisgKi8KK3ZvaWQgaXJsYXBfZGlzY292ZXJ5X2luZGljYXRpb24oc3RydWN0IGlybGFwX2NiICpzZWxmLCBkaXNjb3ZlcnlfdCAqZGlzY292ZXJ5KQoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoZGlzY292ZXJ5ICE9IE5VTEwsIHJldHVybjspOworCisJSVJEQV9BU1NFUlQoc2VsZi0+bm90aWZ5Lmluc3RhbmNlICE9IE5VTEwsIHJldHVybjspOworCisJLyogQSBkZXZpY2UgaXMgdmVyeSBsaWtlbHkgdG8gY29ubmVjdCBpbW1lZGlhdGVseSBhZnRlciBpdCBwZXJmb3JtcworCSAqIGEgc3VjY2Vzc2Z1bCBkaXNjb3ZlcnkuIFRoaXMgbWVhbnMgdGhhdCBpbiBvdXIgY2FzZSwgd2UgYXJlIG11Y2gKKwkgKiBtb3JlIGxpa2VseSB0byByZWNlaXZlIGEgY29ubmVjdGlvbiByZXF1ZXN0IG92ZXIgdGhlIG1lZGl1bS4KKwkgKiBTbywgd2UgYmFja29mZiB0byBhdm9pZCBjb2xsaXNpb25zLgorCSAqIElyTEFQIHNwZWMgNi4xMy40IHN1Z2dlc3QgMTAwbXMuLi4KKwkgKiBOb3RlIDogdGhpcyBsaXR0bGUgdHJpY2sgYWN0dWFsbHkgbWFrZSBhICpCSUcqIGRpZmZlcmVuY2UuIElmIEkgc2V0CisJICogbXkgTGludXggYm94IHdpdGggZGlzY292ZXJ5IGVuYWJsZWQgYW5kIG9uZSBVbHRyYSBmcmFtZSBzZW50IGV2ZXJ5CisJICogc2Vjb25kLCBteSBQYWxtIGhhcyBubyB0cm91YmxlIGNvbm5lY3RpbmcgdG8gaXQgZXZlcnkgdGltZSAhCisJICogSmVhbiBJSSAqLworCWlyZGFfZGV2aWNlX3NldF9tZWRpYV9idXN5KHNlbGYtPm5ldGRldiwgU01BTEwpOworCisJaXJsbXBfbGlua19kaXNjb3ZlcnlfaW5kaWNhdGlvbihzZWxmLT5ub3RpZnkuaW5zdGFuY2UsIGRpc2NvdmVyeSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9zdGF0dXNfaW5kaWNhdGlvbiAocXVhbGl0eV9vZl9saW5rKQorICovCit2b2lkIGlybGFwX3N0YXR1c19pbmRpY2F0aW9uKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgaW50IHF1YWxpdHlfb2ZfbGluaykKK3sKKwlzd2l0Y2ggKHF1YWxpdHlfb2ZfbGluaykgeworCWNhc2UgU1RBVFVTX05PX0FDVElWSVRZOgorCQlJUkRBX01FU1NBR0UoIklyTEFQLCBubyBhY3Rpdml0eSBvbiBsaW5rIVxuIik7CisJCWJyZWFrOworCWNhc2UgU1RBVFVTX05PSVNZOgorCQlJUkRBX01FU1NBR0UoIklyTEFQLCBub2lzeSBsaW5rIVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlpcmxtcF9zdGF0dXNfaW5kaWNhdGlvbihzZWxmLT5ub3RpZnkuaW5zdGFuY2UsCisJCQkJcXVhbGl0eV9vZl9saW5rLCBMT0NLX05PX0NIQU5HRSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9yZXNldF9pbmRpY2F0aW9uICh2b2lkKQorICovCit2b2lkIGlybGFwX3Jlc2V0X2luZGljYXRpb24oc3RydWN0IGlybGFwX2NiICpzZWxmKQoreworCUlSREFfREVCVUcoMSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CisKKwlpZiAoc2VsZi0+c3RhdGUgPT0gTEFQX1JFU0VUX1dBSVQpCisJCWlybGFwX2RvX2V2ZW50KHNlbGYsIFJFU0VUX1JFUVVFU1QsIE5VTEwsIE5VTEwpOworCWVsc2UKKwkJaXJsYXBfZG9fZXZlbnQoc2VsZiwgUkVTRVRfUkVTUE9OU0UsIE5VTEwsIE5VTEwpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfcmVzZXRfY29uZmlybSAodm9pZCkKKyAqLwordm9pZCBpcmxhcF9yZXNldF9jb25maXJtKHZvaWQpCit7CisJSVJEQV9ERUJVRygxLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX2dlbmVyYXRlX3JhbmRfdGltZV9zbG90IChTLCBzKQorICoKKyAqICAgIEdlbmVyYXRlIGEgcmFuZG9tIHRpbWUgc2xvdCBiZXR3ZWVuIHMgYW5kIFMtMSB3aGVyZQorICogICAgUyA9IE51bWJlciBvZiBzbG90cyAoMCAtPiBTLTEpCisgKiAgICBzID0gQ3VycmVudCBzbG90CisgKi8KK2ludCBpcmxhcF9nZW5lcmF0ZV9yYW5kX3RpbWVfc2xvdChpbnQgUywgaW50IHMpCit7CisJc3RhdGljIGludCByYW5kOworCWludCBzbG90OworCisJSVJEQV9BU1NFUlQoKFMgLSBzKSA+IDAsIHJldHVybiAwOyk7CisKKwlyYW5kICs9IGppZmZpZXM7CisJcmFuZCBePSAocmFuZCA8PCAxMik7CisJcmFuZCBePSAocmFuZCA+PiAyMCk7CisKKwlzbG90ID0gcyArIHJhbmQgJSAoUy1zKTsKKworCUlSREFfQVNTRVJUKChzbG90ID49IHMpIHx8IChzbG90IDwgUyksIHJldHVybiAwOyk7CisKKwlyZXR1cm4gc2xvdDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3VwZGF0ZV9ucl9yZWNlaXZlZCAobnIpCisgKgorICogICAgUmVtb3ZlIGFsbCBhY2tub3dsZWRnZWQgZnJhbWVzIGluIGN1cnJlbnQgd2luZG93IHF1ZXVlLiBUaGlzIGNvZGUgaXMKKyAqICAgIG5vdCBpbnR1aXRpdmUgYW5kIHlvdSBzaG91bGQgbm90IHRyeSB0byBjaGFuZ2UgaXQuIElmIHlvdSB0aGluayBpdAorICogICAgY29udGFpbnMgYnVncywgcGxlYXNlIG1haWwgYSBwYXRjaCB0byB0aGUgYXV0aG9yIGluc3RlYWQuCisgKi8KK3ZvaWQgaXJsYXBfdXBkYXRlX25yX3JlY2VpdmVkKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgaW50IG5yKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCWludCBjb3VudCA9IDA7CisKKwkvKgorICAgICAgICAgKiBSZW1vdmUgYWxsIHRoZSBhY2stZWQgZnJhbWVzIGZyb20gdGhlIHdpbmRvdyBxdWV1ZS4KKyAgICAgICAgICovCisKKwkvKgorCSAqICBPcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiBjYXNlLiBJdCBpcyBtb3N0IGxpa2VseSB0aGF0IHRoZSByZWNlaXZlcgorCSAqICB3aWxsIGFja25vd2xlZGdlIGFsbCB0aGUgZnJhbWVzIHdlIGhhdmUgc2VudCEgU28gaW4gdGhhdCBjYXNlIHdlCisJICogIGRlbGV0ZSBhbGwgZnJhbWVzIHN0b3JlZCBpbiB3aW5kb3cuCisJICovCisJaWYgKG5yID09IHNlbGYtPnZzKSB7CisJCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnNlbGYtPnd4X2xpc3QpKSAhPSBOVUxMKSB7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCX0KKwkJLyogVGhlIGxhc3QgYWNrZWQgZnJhbWUgaXMgdGhlIG5leHQgdG8gc2VuZCBtaW51cyBvbmUgKi8KKwkJc2VsZi0+dmEgPSBuciAtIDE7CisJfSBlbHNlIHsKKwkJLyogUmVtb3ZlIGFsbCBhY2tub3dsZWRnZWQgZnJhbWVzIGluIGN1cnJlbnQgd2luZG93ICovCisJCXdoaWxlICgoc2tiX3BlZWsoJnNlbGYtPnd4X2xpc3QpICE9IE5VTEwpICYmCisJCSAgICAgICAoKChzZWxmLT52YSsxKSAlIDgpICE9IG5yKSkKKwkJeworCQkJc2tiID0gc2tiX2RlcXVldWUoJnNlbGYtPnd4X2xpc3QpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCisJCQlzZWxmLT52YSA9IChzZWxmLT52YSArIDEpICUgODsKKwkJCWNvdW50Kys7CisJCX0KKwl9CisKKwkvKiBBZHZhbmNlIHdpbmRvdyAqLworCXNlbGYtPndpbmRvdyA9IHNlbGYtPndpbmRvd19zaXplIC0gc2tiX3F1ZXVlX2xlbigmc2VsZi0+d3hfbGlzdCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF92YWxpZGF0ZV9uc19yZWNlaXZlZCAobnMpCisgKgorICogICAgVmFsaWRhdGUgdGhlIG5leHQgdG8gc2VuZCAobnMpIGZpZWxkIGZyb20gcmVjZWl2ZWQgZnJhbWUuCisgKi8KK2ludCBpcmxhcF92YWxpZGF0ZV9uc19yZWNlaXZlZChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIGludCBucykKK3sKKwkvKiAgbnMgYXMgZXhwZWN0ZWQ/ICAqLworCWlmIChucyA9PSBzZWxmLT52cikKKwkJcmV0dXJuIE5TX0VYUEVDVEVEOworCS8qCisJICogIFN0YXRpb25zIGFyZSBhbGxvd2VkIHRvIHRyZWF0IGludmFsaWQgTlMgYXMgdW5leHBlY3RlZCBOUworCSAqICBJckxBUCwgUmVjdiAuLi4gd2l0aC1pbnZhbGlkLU5zLiBwLiA4NAorCSAqLworCXJldHVybiBOU19VTkVYUEVDVEVEOworCisJLyogcmV0dXJuIE5SX0lOVkFMSUQ7ICovCit9CisvKgorICogRnVuY3Rpb24gaXJsYXBfdmFsaWRhdGVfbnJfcmVjZWl2ZWQgKG5yKQorICoKKyAqICAgIFZhbGlkYXRlIHRoZSBuZXh0IHRvIHJlY2VpdmUgKG5yKSBmaWVsZCBmcm9tIHJlY2VpdmVkIGZyYW1lLgorICoKKyAqLworaW50IGlybGFwX3ZhbGlkYXRlX25yX3JlY2VpdmVkKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgaW50IG5yKQoreworCS8qICBuciBhcyBleHBlY3RlZD8gICovCisJaWYgKG5yID09IHNlbGYtPnZzKSB7CisJCUlSREFfREVCVUcoNCwgIiVzKCksIGV4cGVjdGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIE5SX0VYUEVDVEVEOworCX0KKworCS8qCisJICogIHVuZXhwZWN0ZWQgbnI/IChidXQgd2l0aGluIGN1cnJlbnQgd2luZG93KSwgZmlyc3Qgd2UgY2hlY2sgaWYgdGhlCisJICogIG5zIG51bWJlcnMgb2YgdGhlIGZyYW1lcyBpbiB0aGUgY3VycmVudCB3aW5kb3cgd3JhcC4KKwkgKi8KKwlpZiAoc2VsZi0+dmEgPCBzZWxmLT52cykgeworCQlpZiAoKG5yID49IHNlbGYtPnZhKSAmJiAobnIgPD0gc2VsZi0+dnMpKQorCQkJcmV0dXJuIE5SX1VORVhQRUNURUQ7CisJfSBlbHNlIHsKKwkJaWYgKChuciA+PSBzZWxmLT52YSkgfHwgKG5yIDw9IHNlbGYtPnZzKSkKKwkJCXJldHVybiBOUl9VTkVYUEVDVEVEOworCX0KKworCS8qIEludmFsaWQgbnIhICAqLworCXJldHVybiBOUl9JTlZBTElEOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfaW5pdGlhdGVfY29ubmVjdGlvbl9zdGF0ZSAoKQorICoKKyAqICAgIEluaXRpYWxpemUgdGhlIGNvbm5lY3Rpb24gc3RhdGUgcGFyYW1ldGVycworICoKKyAqLwordm9pZCBpcmxhcF9pbml0aWF0ZV9jb25uZWN0aW9uX3N0YXRlKHN0cnVjdCBpcmxhcF9jYiAqc2VsZikKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCisJLyogTmV4dCB0byBzZW5kIGFuZCBuZXh0IHRvIHJlY2VpdmUgKi8KKwlzZWxmLT52cyA9IHNlbGYtPnZyID0gMDsKKworCS8qIExhc3QgZnJhbWUgd2hpY2ggZ290IGFja2VkICgwIC0gMSkgJSA4ICovCisJc2VsZi0+dmEgPSA3OworCisJc2VsZi0+d2luZG93ID0gMTsKKworCXNlbGYtPnJlbW90ZV9idXN5ID0gRkFMU0U7CisJc2VsZi0+cmV0cnlfY291bnQgPSAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfd2FpdF9taW5fdHVybl9hcm91bmQgKHNlbGYsIHFvcykKKyAqCisgKiAgICBXYWl0IG5lZ290aWF0ZWQgbWluaW11bSB0dXJuIGFyb3VuZCB0aW1lLCB0aGlzIGZ1bmN0aW9uIGFjdHVhbGx5IHNldHMKKyAqICAgIHRoZSBudW1iZXIgb2YgQk9TJ3MgdGhhdCBtdXN0IGJlIHNlbnQgYmVmb3JlIHRoZSBuZXh0IHRyYW5zbWl0dGVkCisgKiAgICBmcmFtZSBpbiBvcmRlciB0byBkZWxheSBmb3IgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZS4gVGhpcyBpcworICogICAgZG9uZSB0byBhdm9pZCB1c2luZyB0aW1lcnMsIGFuZCB0aGUgZm9yYmlkZGVuIHVkZWxheSEKKyAqLwordm9pZCBpcmxhcF93YWl0X21pbl90dXJuX2Fyb3VuZChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zKQoreworCV9fdTMyIG1pbl90dXJuX3RpbWU7CisJX191MzIgc3BlZWQ7CisKKwkvKiBHZXQgUW9TIHZhbHVlcy4gICovCisJc3BlZWQgPSBxb3MtPmJhdWRfcmF0ZS52YWx1ZTsKKwltaW5fdHVybl90aW1lID0gcW9zLT5taW5fdHVybl90aW1lLnZhbHVlOworCisJLyogTm8gbmVlZCB0byBjYWxjdWxhdGUgWEJPRnMgZm9yIHNwZWVkcyBvdmVyIDExNTIwMCBicHMgKi8KKwlpZiAoc3BlZWQgPiAxMTUyMDApIHsKKwkJc2VsZi0+bXR0X3JlcXVpcmVkID0gbWluX3R1cm5fdGltZTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogIFNlbmQgYWRkaXRpb25hbCBCT0YncyBmb3IgdGhlIG5leHQgZnJhbWUgZm9yIHRoZSByZXF1ZXN0ZWQKKwkgKiAgbWluIHR1cm4gdGltZSwgc28gbm93IHdlIG11c3QgY2FsY3VsYXRlIGhvdyBtYW55IGNoYXJzIChYQk9GJ3MpIHdlCisJICogIG11c3Qgc2VuZCBmb3IgdGhlIHJlcXVlc3RlZCB0aW1lIHBlcmlvZCAobWluIHR1cm4gdGltZSkKKwkgKi8KKwlzZWxmLT54Ym9mc19kZWxheSA9IGlybGFwX21pbl90dXJuX3RpbWVfaW5fYnl0ZXMoc3BlZWQsIG1pbl90dXJuX3RpbWUpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfZmx1c2hfYWxsX3F1ZXVlcyAodm9pZCkKKyAqCisgKiAgICBGbHVzaCBhbGwgcXVldWVzCisgKgorICovCit2b2lkIGlybGFwX2ZsdXNoX2FsbF9xdWV1ZXMoc3RydWN0IGlybGFwX2NiICpzZWxmKQoreworCXN0cnVjdCBza19idWZmKiBza2I7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CisKKwkvKiBGcmVlIHRyYW5zbWlzc2lvbiBxdWV1ZSAqLworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnNlbGYtPnR4cSkpICE9IE5VTEwpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnNlbGYtPnR4cV91bHRyYSkpICE9IE5VTEwpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCS8qIEZyZWUgc2xpZGluZyB3aW5kb3cgYnVmZmVyZWQgcGFja2V0cyAqLworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnNlbGYtPnd4X2xpc3QpKSAhPSBOVUxMKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9zZXRzcGVlZCAoc2VsZiwgc3BlZWQpCisgKgorICogICAgQ2hhbmdlIHRoZSBzcGVlZCBvZiB0aGUgSXJEQSBwb3J0CisgKgorICovCitzdGF0aWMgdm9pZCBpcmxhcF9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlybGFwX2NiICpzZWxmLCBfX3UzMiBzcGVlZCwgaW50IG5vdykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJSVJEQV9ERUJVRygwLCAiJXMoKSwgc2V0dGluZyBzcGVlZCB0byAlZFxuIiwgX19GVU5DVElPTl9fLCBzcGVlZCk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CisKKwlzZWxmLT5zcGVlZCA9IHNwZWVkOworCisJLyogQ2hhbmdlIHNwZWVkIG5vdywgb3IganVzdCBwaWdneWJhY2sgc3BlZWQgb24gZnJhbWVzICovCisJaWYgKG5vdykgeworCQkvKiBTZW5kIGRvd24gZW1wdHkgZnJhbWUgdG8gdHJpZ2dlciBzcGVlZCBjaGFuZ2UgKi8KKwkJc2tiID0gZGV2X2FsbG9jX3NrYigwKTsKKwkJaXJsYXBfcXVldWVfeG1pdChzZWxmLCBza2IpOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX2luaXRfcW9zX2NhcGFiaWxpdGllcyAoc2VsZiwgcW9zKQorICoKKyAqICAgIEluaXRpYWxpemUgUW9TIGZvciB0aGlzIElyTEFQIHNlc3Npb24sIFdoYXQgd2UgZG8gaXMgdG8gY29tcHV0ZSB0aGUKKyAqICAgIGludGVyc2VjdGlvbiBvZiB0aGUgUW9TIGNhcGFiaWxpdGllcyBmb3IgdGhlIHVzZXIsIGRyaXZlciBhbmQgZm9yCisgKiAgICBJckxBUCBpdHNlbGYuIE5vcm1hbGx5LCBJckxBUCB3aWxsIG5vdCBzcGVjaWZ5IGFueSB2YWx1ZXMsIGJ1dCBpdCBjYW4KKyAqICAgIGJlIHVzZWQgdG8gcmVzdHJpY3QgY2VydGFpbiB2YWx1ZXMuCisgKi8KK3N0YXRpYyB2b2lkIGlybGFwX2luaXRfcW9zX2NhcGFiaWxpdGllcyhzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsCisJCQkJCXN0cnVjdCBxb3NfaW5mbyAqcW9zX3VzZXIpCit7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm5ldGRldiAhPSBOVUxMLCByZXR1cm47KTsKKworCS8qIFN0YXJ0IG91dCB3aXRoIHRoZSBtYXhpbXVtIFFvUyBzdXBwb3J0IHBvc3NpYmxlICovCisJaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcygmc2VsZi0+cW9zX3J4KTsKKworCS8qIEFwcGx5IGRyaXZlcnMgUW9TIGNhcGFiaWxpdGllcyAqLworCWlyZGFfcW9zX2NvbXB1dGVfaW50ZXJzZWN0aW9uKCZzZWxmLT5xb3NfcngsIHNlbGYtPnFvc19kZXYpOworCisJLyoKKwkgKiAgQ2hlY2sgZm9yIHVzZXIgc3VwcGxpZWQgUW9TIHBhcmFtZXRlcnMuIFRoZSBzZXJ2aWNlIHVzZXIgaXMgb25seQorCSAqICBhbGxvd2VkIHRvIHN1cHBseSB0aGVzZSB2YWx1ZXMuIFdlIGNoZWNrIGVhY2ggcGFyYW1ldGVyIHNpbmNlIHRoZQorCSAqICB1c2VyIG1heSBub3QgaGF2ZSBzZXQgYWxsIG9mIHRoZW0uCisJICovCisJaWYgKHFvc191c2VyKSB7CisJCUlSREFfREVCVUcoMSwgIiVzKCksIEZvdW5kIHVzZXIgc3BlY2lmaWVkIFFvUyFcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJaWYgKHFvc191c2VyLT5iYXVkX3JhdGUuYml0cykKKwkJCXNlbGYtPnFvc19yeC5iYXVkX3JhdGUuYml0cyAmPSBxb3NfdXNlci0+YmF1ZF9yYXRlLmJpdHM7CisKKwkJaWYgKHFvc191c2VyLT5tYXhfdHVybl90aW1lLmJpdHMpCisJCQlzZWxmLT5xb3NfcngubWF4X3R1cm5fdGltZS5iaXRzICY9IHFvc191c2VyLT5tYXhfdHVybl90aW1lLmJpdHM7CisJCWlmIChxb3NfdXNlci0+ZGF0YV9zaXplLmJpdHMpCisJCQlzZWxmLT5xb3NfcnguZGF0YV9zaXplLmJpdHMgJj0gcW9zX3VzZXItPmRhdGFfc2l6ZS5iaXRzOworCisJCWlmIChxb3NfdXNlci0+bGlua19kaXNjX3RpbWUuYml0cykKKwkJCXNlbGYtPnFvc19yeC5saW5rX2Rpc2NfdGltZS5iaXRzICY9IHFvc191c2VyLT5saW5rX2Rpc2NfdGltZS5iaXRzOworCX0KKworCS8qIFVzZSA1MDBtcyBpbiBJckxBUCBmb3Igbm93ICovCisJc2VsZi0+cW9zX3J4Lm1heF90dXJuX3RpbWUuYml0cyAmPSAweDAxOworCisJLyogU2V0IGRhdGEgc2l6ZSAqLworCS8qc2VsZi0+cW9zX3J4LmRhdGFfc2l6ZS5iaXRzICY9IDB4MDM7Ki8KKworCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUoJnNlbGYtPnFvc19yeCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9hcHBseV9kZWZhdWx0X2Nvbm5lY3Rpb25fcGFyYW1ldGVycyAodm9pZCwgbm93KQorICoKKyAqICAgIFVzZSB0aGUgZGVmYXVsdCBjb25uZWN0aW9uIGFuZCB0cmFuc21pc3Npb24gcGFyYW1ldGVycworICovCit2b2lkIGlybGFwX2FwcGx5X2RlZmF1bHRfY29ubmVjdGlvbl9wYXJhbWV0ZXJzKHN0cnVjdCBpcmxhcF9jYiAqc2VsZikKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCisJLyogeGJvZnMgOiBEZWZhdWx0IHZhbHVlIGluIE5ETSAqLworCXNlbGYtPm5leHRfYm9mcyAgID0gMTI7CisJc2VsZi0+Ym9mc19jb3VudCAgPSAxMjsKKworCS8qIE5ETSBTcGVlZCBpcyA5NjAwICovCisJaXJsYXBfY2hhbmdlX3NwZWVkKHNlbGYsIDk2MDAsIFRSVUUpOworCisJLyogU2V0IG1idXN5IHdoZW4gZ29pbmcgdG8gTkRNIHN0YXRlICovCisJaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3koc2VsZi0+bmV0ZGV2LCBUUlVFKTsKKworCS8qCisJICogR2VuZXJhdGUgcmFuZG9tIGNvbm5lY3Rpb24gYWRkcmVzcyBmb3IgdGhpcyBzZXNzaW9uLCB3aGljaCBtdXN0CisJICogYmUgNyBiaXRzIHdpZGUgYW5kIGRpZmZlcmVudCBmcm9tIDB4MDAgYW5kIDB4ZmUKKwkgKi8KKwl3aGlsZSAoKHNlbGYtPmNhZGRyID09IDB4MDApIHx8IChzZWxmLT5jYWRkciA9PSAweGZlKSkgeworCQlnZXRfcmFuZG9tX2J5dGVzKCZzZWxmLT5jYWRkciwgc2l6ZW9mKHNlbGYtPmNhZGRyKSk7CisJCXNlbGYtPmNhZGRyICY9IDB4ZmU7CisJfQorCisJLyogVXNlIGRlZmF1bHQgdmFsdWVzIHVudGlsIGNvbm5lY3Rpb24gaGFzIGJlZW4gbmVnaXRpYXRlZCAqLworCXNlbGYtPnNsb3RfdGltZW91dCA9IHN5c2N0bF9zbG90X3RpbWVvdXQ7CisJc2VsZi0+ZmluYWxfdGltZW91dCA9IEZJTkFMX1RJTUVPVVQ7CisJc2VsZi0+cG9sbF90aW1lb3V0ID0gUE9MTF9USU1FT1VUOworCXNlbGYtPndkX3RpbWVvdXQgPSBXRF9USU1FT1VUOworCisJLyogU2V0IHNvbWUgZGVmYXVsdCB2YWx1ZXMgKi8KKwlzZWxmLT5xb3NfdHguYmF1ZF9yYXRlLnZhbHVlID0gOTYwMDsKKwlzZWxmLT5xb3NfcnguYmF1ZF9yYXRlLnZhbHVlID0gOTYwMDsKKwlzZWxmLT5xb3NfdHgubWF4X3R1cm5fdGltZS52YWx1ZSA9IDA7CisJc2VsZi0+cW9zX3J4Lm1heF90dXJuX3RpbWUudmFsdWUgPSAwOworCXNlbGYtPnFvc190eC5taW5fdHVybl90aW1lLnZhbHVlID0gMDsKKwlzZWxmLT5xb3NfcngubWluX3R1cm5fdGltZS52YWx1ZSA9IDA7CisJc2VsZi0+cW9zX3R4LmRhdGFfc2l6ZS52YWx1ZSA9IDY0OworCXNlbGYtPnFvc19yeC5kYXRhX3NpemUudmFsdWUgPSA2NDsKKwlzZWxmLT5xb3NfdHgud2luZG93X3NpemUudmFsdWUgPSAxOworCXNlbGYtPnFvc19yeC53aW5kb3dfc2l6ZS52YWx1ZSA9IDE7CisJc2VsZi0+cW9zX3R4LmFkZGl0aW9uYWxfYm9mcy52YWx1ZSA9IDEyOworCXNlbGYtPnFvc19yeC5hZGRpdGlvbmFsX2JvZnMudmFsdWUgPSAxMjsKKwlzZWxmLT5xb3NfdHgubGlua19kaXNjX3RpbWUudmFsdWUgPSAwOworCXNlbGYtPnFvc19yeC5saW5rX2Rpc2NfdGltZS52YWx1ZSA9IDA7CisKKwlpcmxhcF9mbHVzaF9hbGxfcXVldWVzKHNlbGYpOworCisJc2VsZi0+ZGlzY29ubmVjdF9wZW5kaW5nID0gRkFMU0U7CisJc2VsZi0+Y29ubmVjdF9wZW5kaW5nID0gRkFMU0U7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9hcHBseV9jb25uZWN0aW9uX3BhcmFtZXRlcnMgKHFvcywgbm93KQorICoKKyAqICAgIEluaXRpYWxpemUgSXJMQVAgd2l0aCB0aGUgbmVnb3RpYXRlZCBRb1MgdmFsdWVzCisgKgorICogSWYgJ25vdycgaXMgZmFsc2UsIHRoZSBzcGVlZCBhbmQgeGJvZnMgd2lsbCBiZSBjaGFuZ2VkIGFmdGVyIHRoZSBuZXh0CisgKiBmcmFtZSBpcyBzZW50LgorICogSWYgJ25vdycgaXMgdHJ1ZSwgdGhlIHNwZWVkIGFuZCB4Ym9mcyBpcyBjaGFuZ2VkIGltbWVkaWF0ZWx5CisgKi8KK3ZvaWQgaXJsYXBfYXBwbHlfY29ubmVjdGlvbl9wYXJhbWV0ZXJzKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgaW50IG5vdykKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCisJLyogU2V0IHRoZSBuZWdvdGlhdGVkIHhib2ZzIHZhbHVlICovCisJc2VsZi0+bmV4dF9ib2ZzICAgPSBzZWxmLT5xb3NfdHguYWRkaXRpb25hbF9ib2ZzLnZhbHVlOworCWlmIChub3cpCisJCXNlbGYtPmJvZnNfY291bnQgPSBzZWxmLT5uZXh0X2JvZnM7CisKKwkvKiBTZXQgdGhlIG5lZ290aWF0ZWQgbGluayBzcGVlZCAobWF5IG5lZWQgdGhlIG5ldyB4Ym9mcyB2YWx1ZSkgKi8KKwlpcmxhcF9jaGFuZ2Vfc3BlZWQoc2VsZiwgc2VsZi0+cW9zX3R4LmJhdWRfcmF0ZS52YWx1ZSwgbm93KTsKKworCXNlbGYtPndpbmRvd19zaXplID0gc2VsZi0+cW9zX3R4LndpbmRvd19zaXplLnZhbHVlOworCXNlbGYtPndpbmRvdyAgICAgID0gc2VsZi0+cW9zX3R4LndpbmRvd19zaXplLnZhbHVlOworCisjaWZkZWYgQ09ORklHX0lSREFfRFlOQU1JQ19XSU5ET1cKKwkvKgorCSAqICBDYWxjdWxhdGUgaG93IG1hbnkgYnl0ZXMgaXQgaXMgcG9zc2libGUgdG8gdHJhbnNtaXQgYmVmb3JlIHRoZQorCSAqICBsaW5rIG11c3QgYmUgdHVybmVkIGFyb3VuZAorCSAqLworCXNlbGYtPmxpbmVfY2FwYWNpdHkgPQorCQlpcmxhcF9tYXhfbGluZV9jYXBhY2l0eShzZWxmLT5xb3NfdHguYmF1ZF9yYXRlLnZhbHVlLAorCQkJCQlzZWxmLT5xb3NfdHgubWF4X3R1cm5fdGltZS52YWx1ZSk7CisJc2VsZi0+Ynl0ZXNfbGVmdCA9IHNlbGYtPmxpbmVfY2FwYWNpdHk7CisjZW5kaWYgLyogQ09ORklHX0lSREFfRFlOQU1JQ19XSU5ET1cgKi8KKworCisJLyoKKwkgKiAgSW5pdGlhbGl6ZSB0aW1lb3V0IHZhbHVlcywgc29tZSBvZiB0aGUgcnVsZXMgYXJlIGxpc3RlZCBvbgorCSAqICBwYWdlIDkyIGluIElyTEFQLgorCSAqLworCUlSREFfQVNTRVJUKHNlbGYtPnFvc190eC5tYXhfdHVybl90aW1lLnZhbHVlICE9IDAsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPnFvc19yeC5tYXhfdHVybl90aW1lLnZhbHVlICE9IDAsIHJldHVybjspOworCS8qIFRoZSBwb2xsIHRpbWVvdXQgYXBwbGllcyBvbmx5IHRvIHRoZSBwcmltYXJ5IHN0YXRpb24uCisJICogSXQgZGVmaW5lcyB0aGUgbWF4aW11bSB0aW1lIHRoZSBwcmltYXJ5IHN0YXkgaW4gWE1JVCBtb2RlCisJICogYmVmb3JlIHRpbWVvdXQgYW5kIHR1cm5pbmcgdGhlIGxpbmsgYXJvdW5kIChzZW5kaW5nIGEgUlIpLgorCSAqIE9yLCB0aGlzIGlzIGhvdyBtdWNoIHdlIGNhbiBrZWVwIHRoZSBwZiBiaXQgaW4gcHJpbWFyeSBtb2RlLgorCSAqIFRoZXJlZm9yZSwgaXQgbXVzdCBiZSBsb3dlciBvciBlcXVhbCB0aGFuIG91ciAqT1dOKiBtYXggdHVybiBhcm91bmQuCisJICogSmVhbiBJSSAqLworCXNlbGYtPnBvbGxfdGltZW91dCA9IHNlbGYtPnFvc190eC5tYXhfdHVybl90aW1lLnZhbHVlICogSFogLyAxMDAwOworCS8qIFRoZSBGaW5hbCB0aW1lb3V0IGFwcGxpZXMgb25seSB0byB0aGUgcHJpbWFyeSBzdGF0aW9uLgorCSAqIEl0IGRlZmluZXMgdGhlIG1heGltdW0gdGltZSB0aGUgcHJpbWFyeSB3YWl0IChtb3N0bHkgaW4gUkVDViBtb2RlKQorCSAqIGZvciBhbiBhbnN3ZXIgZnJvbSB0aGUgc2Vjb25kYXJ5IHN0YXRpb24gYmVmb3JlIHBvbGxpbmcgaXQgYWdhaW4uCisJICogVGhlcmVmb3JlLCBpdCBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiBvdXIgKlBBUlRORVIqCisJICogbWF4IHR1cm4gYXJvdW5kIHRpbWUgLSBKZWFuIElJICovCisJc2VsZi0+ZmluYWxfdGltZW91dCA9IHNlbGYtPnFvc19yeC5tYXhfdHVybl90aW1lLnZhbHVlICogSFogLyAxMDAwOworCS8qIFRoZSBXYXRjaGRvZyBCaXQgdGltZW91dCBhcHBsaWVzIG9ubHkgdG8gdGhlIHNlY29uZGFyeSBzdGF0aW9uLgorCSAqIEl0IGRlZmluZXMgdGhlIG1heGltdW0gdGltZSB0aGUgc2Vjb25kYXJ5IHdhaXQgKG1vc3RseSBpbiBSRUNWIG1vZGUpCisJICogZm9yIHBvbGwgZnJvbSB0aGUgcHJpbWFyeSBzdGF0aW9uIGJlZm9yZSBnZXR0aW5nIGFubm95ZWQuCisJICogVGhlcmVmb3JlLCBpdCBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiBvdXIgKlBBUlRORVIqCisJICogbWF4IHR1cm4gYXJvdW5kIHRpbWUgLSBKZWFuIElJICovCisJc2VsZi0+d2RfdGltZW91dCA9IHNlbGYtPmZpbmFsX3RpbWVvdXQgKiAyOworCisJLyoKKwkgKiBOMSBhbmQgTjIgYXJlIG1heGltdW0gcmV0cnkgY291bnQgZm9yICpib3RoKiB0aGUgZmluYWwgdGltZXIKKwkgKiBhbmQgdGhlIHdkIHRpbWVyICh3aXRoIGEgZmFjdG9yIDIpIGFzIGRlZmluZWQgYWJvdmUuCisJICogQWZ0ZXIgTjEgcmV0cnkgb2YgYSB0aW1lciwgd2UgZ2l2ZSBhIHdhcm5pbmcgdG8gdGhlIHVzZXIuCisJICogQWZ0ZXIgTjIgcmV0cnksIHdlIGNvbnNpZGVyIHRoZSBsaW5rIGRlYWQgYW5kIGRpc2Nvbm5lY3QgaXQuCisJICogSmVhbiBJSQorCSAqLworCisJLyoKKwkgKiAgU2V0IE4xIHRvIDAgaWYgTGluayBEaXNjb25uZWN0L1RocmVzaG9sZCBUaW1lID0gMyBhbmQgc2V0IGl0IHRvCisJICogIDMgc2Vjb25kcyBvdGhlcndpc2UuIFNlZSBwYWdlIDcxIGluIElyTEFQIGZvciBtb3JlIGRldGFpbHMuCisJICogIEFjdHVhbGx5LCBpdCdzIG5vdCBhbHdheXMgMyBzZWNvbmRzLCBhcyB3ZSBhbGxvdyB0byBzZXQKKwkgKiAgaXQgdmlhIHN5c2N0bC4uLiBNYXggbWF4dHQgaXMgNTAwbXMsIGFuZCBOMSBuZWVkIHRvIGJlIG11bHRpcGxlCisJICogIG9mIDIsIHNvIDEgc2Vjb25kIGlzIG1pbmltdW0gd2UgY2FuIGFsbG93LiAtIEplYW4gSUkKKwkgKi8KKwlpZiAoc2VsZi0+cW9zX3R4LmxpbmtfZGlzY190aW1lLnZhbHVlID09IHN5c2N0bF93YXJuX25vcmVwbHlfdGltZSkKKwkJLyoKKwkJICogSWYgd2Ugc2V0IE4xIHRvIDAsIGl0IHdpbGwgdHJpZ2dlciBpbW1lZGlhdGVseSwgd2hpY2ggaXMKKwkJICogbm90IHdoYXQgd2Ugd2FudC4gV2hhdCB3ZSByZWFsbHkgd2FudCBpcyB0byBkaXNhYmxlIGl0LAorCQkgKiBKZWFuIElJCisJCSAqLworCQlzZWxmLT5OMSA9IC0yOyAvKiBEaXNhYmxlIC0gTmVlZCB0byBiZSBtdWx0aXBsZSBvZiAyKi8KKwllbHNlCisJCXNlbGYtPk4xID0gc3lzY3RsX3dhcm5fbm9yZXBseV90aW1lICogMTAwMCAvCisJCSAgc2VsZi0+cW9zX3J4Lm1heF90dXJuX3RpbWUudmFsdWU7CisKKwlJUkRBX0RFQlVHKDQsICJTZXR0aW5nIE4xID0gJWRcbiIsIHNlbGYtPk4xKTsKKworCS8qIFNldCBOMiB0byBtYXRjaCBvdXIgb3duIGRpc2Nvbm5lY3QgdGltZSAqLworCXNlbGYtPk4yID0gc2VsZi0+cW9zX3R4LmxpbmtfZGlzY190aW1lLnZhbHVlICogMTAwMCAvCisJCXNlbGYtPnFvc19yeC5tYXhfdHVybl90aW1lLnZhbHVlOworCUlSREFfREVCVUcoNCwgIlNldHRpbmcgTjIgPSAlZFxuIiwgc2VsZi0+TjIpOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0cnVjdCBpcmxhcF9pdGVyX3N0YXRlIHsKKwlpbnQgaWQ7Cit9OworCitzdGF0aWMgdm9pZCAqaXJsYXBfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaXJsYXBfaXRlcl9zdGF0ZSAqaXRlciA9IHNlcS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgaXJsYXBfY2IgKnNlbGY7CisKKwkvKiBQcm90ZWN0IG91ciBhY2Nlc3MgdG8gdGhlIHRzYXAgbGlzdCAqLworCXNwaW5fbG9ja19pcnEoJmlybGFwLT5oYl9zcGlubG9jayk7CisJaXRlci0+aWQgPSAwOworCisJZm9yIChzZWxmID0gKHN0cnVjdCBpcmxhcF9jYiAqKSBoYXNoYmluX2dldF9maXJzdChpcmxhcCk7IAorCSAgICAgc2VsZjsgc2VsZiA9IChzdHJ1Y3QgaXJsYXBfY2IgKikgaGFzaGJpbl9nZXRfbmV4dChpcmxhcCkpIHsKKwkJaWYgKGl0ZXItPmlkID09ICpwb3MpCisJCQlicmVhazsKKwkJKytpdGVyLT5pZDsKKwl9CisJCQorCXJldHVybiBzZWxmOworfQorCitzdGF0aWMgdm9pZCAqaXJsYXBfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBpcmxhcF9pdGVyX3N0YXRlICppdGVyID0gc2VxLT5wcml2YXRlOworCisJKysqcG9zOworCSsraXRlci0+aWQ7CisJcmV0dXJuICh2b2lkICopIGhhc2hiaW5fZ2V0X25leHQoaXJsYXApOworfQorCitzdGF0aWMgdm9pZCBpcmxhcF9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzcGluX3VubG9ja19pcnEoJmlybGFwLT5oYl9zcGlubG9jayk7Cit9CisKK3N0YXRpYyBpbnQgaXJsYXBfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJY29uc3Qgc3RydWN0IGlybGFwX2l0ZXJfc3RhdGUgKml0ZXIgPSBzZXEtPnByaXZhdGU7CisJY29uc3Qgc3RydWN0IGlybGFwX2NiICpzZWxmID0gdjsKKwkKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybiAtRUlOVkFMOyk7CisKKwlzZXFfcHJpbnRmKHNlcSwgImlybGFwJWQgIiwgaXRlci0+aWQpOworCXNlcV9wcmludGYoc2VxLCAic3RhdGU6ICVzXG4iLAorCQkgICBpcmxhcF9zdGF0ZVtzZWxmLT5zdGF0ZV0pOworCisJc2VxX3ByaW50ZihzZXEsICIgIGRldmljZSBuYW1lOiAlcywgIiwKKwkJICAgKHNlbGYtPm5ldGRldikgPyBzZWxmLT5uZXRkZXYtPm5hbWUgOiAiYnVnIik7CisJc2VxX3ByaW50ZihzZXEsICJoYXJkd2FyZSBuYW1lOiAlc1xuIiwgc2VsZi0+aHdfbmFtZSk7CisKKwlzZXFfcHJpbnRmKHNlcSwgIiAgY2FkZHI6ICUjMDJ4LCAiLCBzZWxmLT5jYWRkcik7CisJc2VxX3ByaW50ZihzZXEsICJzYWRkcjogJSMwOHgsICIsIHNlbGYtPnNhZGRyKTsKKwlzZXFfcHJpbnRmKHNlcSwgImRhZGRyOiAlIzA4eFxuIiwgc2VsZi0+ZGFkZHIpOworCisJc2VxX3ByaW50ZihzZXEsICIgIHdpbiBzaXplOiAlZCwgIiwKKwkJICAgc2VsZi0+d2luZG93X3NpemUpOworCXNlcV9wcmludGYoc2VxLCAid2luOiAlZCwgIiwgc2VsZi0+d2luZG93KTsKKyNpZmRlZiBDT05GSUdfSVJEQV9EWU5BTUlDX1dJTkRPVworCXNlcV9wcmludGYoc2VxLCAibGluZSBjYXBhY2l0eTogJWQsICIsCisJCSAgIHNlbGYtPmxpbmVfY2FwYWNpdHkpOworCXNlcV9wcmludGYoc2VxLCAiYnl0ZXMgbGVmdDogJWRcbiIsIHNlbGYtPmJ5dGVzX2xlZnQpOworI2VuZGlmIC8qIENPTkZJR19JUkRBX0RZTkFNSUNfV0lORE9XICovCisJc2VxX3ByaW50ZihzZXEsICIgIHR4IHF1ZXVlIGxlbjogJWQgIiwKKwkJICAgc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhxKSk7CisJc2VxX3ByaW50ZihzZXEsICJ3aW4gcXVldWUgbGVuOiAlZCAiLAorCQkgICBza2JfcXVldWVfbGVuKCZzZWxmLT53eF9saXN0KSk7CisJc2VxX3ByaW50ZihzZXEsICJyYnVzeTogJXMiLCBzZWxmLT5yZW1vdGVfYnVzeSA/CisJCSAgICJUUlVFIiA6ICJGQUxTRSIpOworCXNlcV9wcmludGYoc2VxLCAiIG1idXN5OiAlc1xuIiwgc2VsZi0+bWVkaWFfYnVzeSA/CisJCSAgICJUUlVFIiA6ICJGQUxTRSIpOworCisJc2VxX3ByaW50ZihzZXEsICIgIHJldHJhbnM6ICVkICIsIHNlbGYtPnJldHJ5X2NvdW50KTsKKwlzZXFfcHJpbnRmKHNlcSwgInZzOiAlZCAiLCBzZWxmLT52cyk7CisJc2VxX3ByaW50ZihzZXEsICJ2cjogJWQgIiwgc2VsZi0+dnIpOworCXNlcV9wcmludGYoc2VxLCAidmE6ICVkXG4iLCBzZWxmLT52YSk7CisKKwlzZXFfcHJpbnRmKHNlcSwgIiAgcW9zXHRicHNcdG1heHR0XHRkc2l6ZVx0d2luc2l6ZVx0YWRkYm9mc1x0bWludHRcdGxkaXNjXHRjb21wXG4iKTsKKworCXNlcV9wcmludGYoc2VxLCAiICB0eFx0JWRcdCIsCisJCSAgIHNlbGYtPnFvc190eC5iYXVkX3JhdGUudmFsdWUpOworCXNlcV9wcmludGYoc2VxLCAiJWRcdCIsCisJCSAgIHNlbGYtPnFvc190eC5tYXhfdHVybl90aW1lLnZhbHVlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiVkXHQiLAorCQkgICBzZWxmLT5xb3NfdHguZGF0YV9zaXplLnZhbHVlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiVkXHQiLAorCQkgICBzZWxmLT5xb3NfdHgud2luZG93X3NpemUudmFsdWUpOworCXNlcV9wcmludGYoc2VxLCAiJWRcdCIsCisJCSAgIHNlbGYtPnFvc190eC5hZGRpdGlvbmFsX2JvZnMudmFsdWUpOworCXNlcV9wcmludGYoc2VxLCAiJWRcdCIsCisJCSAgIHNlbGYtPnFvc190eC5taW5fdHVybl90aW1lLnZhbHVlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiVkXHQiLAorCQkgICBzZWxmLT5xb3NfdHgubGlua19kaXNjX3RpbWUudmFsdWUpOworCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKKworCXNlcV9wcmludGYoc2VxLCAiICByeFx0JWRcdCIsCisJCSAgIHNlbGYtPnFvc19yeC5iYXVkX3JhdGUudmFsdWUpOworCXNlcV9wcmludGYoc2VxLCAiJWRcdCIsCisJCSAgIHNlbGYtPnFvc19yeC5tYXhfdHVybl90aW1lLnZhbHVlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiVkXHQiLAorCQkgICBzZWxmLT5xb3NfcnguZGF0YV9zaXplLnZhbHVlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiVkXHQiLAorCQkgICBzZWxmLT5xb3Nfcngud2luZG93X3NpemUudmFsdWUpOworCXNlcV9wcmludGYoc2VxLCAiJWRcdCIsCisJCSAgIHNlbGYtPnFvc19yeC5hZGRpdGlvbmFsX2JvZnMudmFsdWUpOworCXNlcV9wcmludGYoc2VxLCAiJWRcdCIsCisJCSAgIHNlbGYtPnFvc19yeC5taW5fdHVybl90aW1lLnZhbHVlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiVkXG4iLAorCQkgICBzZWxmLT5xb3NfcngubGlua19kaXNjX3RpbWUudmFsdWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaXJsYXBfc2VxX29wcyA9IHsKKwkuc3RhcnQgID0gaXJsYXBfc2VxX3N0YXJ0LAorCS5uZXh0ICAgPSBpcmxhcF9zZXFfbmV4dCwKKwkuc3RvcCAgID0gaXJsYXBfc2VxX3N0b3AsCisJLnNob3cgICA9IGlybGFwX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBpcmxhcF9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKKwlpbnQgcmMgPSAtRU5PTUVNOworCXN0cnVjdCBpcmxhcF9pdGVyX3N0YXRlICpzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKyAgICAgICAKKwlpZiAoIXMpCisJCWdvdG8gb3V0OworCisJaWYgKGlybGFwID09IE5VTEwpIHsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dF9rZnJlZTsKKwl9CisKKwlyYyA9IHNlcV9vcGVuKGZpbGUsICZpcmxhcF9zZXFfb3BzKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0X2tmcmVlOworCisJc2VxCSAgICAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc2VxLT5wcml2YXRlID0gczsKKwltZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7CitvdXQ6CisJcmV0dXJuIHJjOworb3V0X2tmcmVlOgorCWtmcmVlKHMpOworCWdvdG8gb3V0OworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlybGFwX3NlcV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICAgICAgICAgPSBpcmxhcF9zZXFfb3BlbiwKKwkucmVhZCAgICAgICAgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICAgICAgICAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZV9wcml2YXRlLAorfTsKKworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmxhcF9ldmVudC5jIGIvbmV0L2lyZGEvaXJsYXBfZXZlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2Q4OWY1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJsYXBfZXZlbnQuYwpAQCAtMCwwICsxLDIzMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGaWxlbmFtZTogICAgICBpcmxhcF9ldmVudC5jCisgKiBWZXJzaW9uOiAgICAgICAwLjkKKyAqIERlc2NyaXB0aW9uOiAgIElyTEFQIHN0YXRlIG1hY2hpbmUgaW1wbGVtZW50YXRpb24KKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdAYnJhdHRsaS5uZXQ+CisgKiBDcmVhdGVkIGF0OiAgICBTYXQgQXVnIDE2IDAwOjU5OjI5IDE5OTcKKyAqIE1vZGlmaWVkIGF0OiAgIFNhdCBEZWMgMjUgMjE6MDc6NTcgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ0BicmF0dGxpLm5ldD4KKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgRGFnIEJyYXR0bGkgPGRhZ0BicmF0dGxpLm5ldD4sCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4ICAgICAgVGhvbWFzIERhdmlzIDxyYXRiZXJ0QHJhZGlrcy5uZXQ+CisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcworICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFwX2V2ZW50Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS90aW1lci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYXBfZnJhbWUuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9xb3MuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9wYXJhbWV0ZXJzLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4JCS8qIGlybG1wX2Zsb3dfaW5kaWNhdGlvbigpLCAuLi4gKi8KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisKKyNpZmRlZiBDT05GSUdfSVJEQV9GQVNUX1JSCitpbnQgc3lzY3RsX2Zhc3RfcG9sbF9pbmNyZWFzZSA9IDUwOworI2VuZGlmCisKK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfbmRtICAgIChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfcXVlcnkgIChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfcmVwbHkgIChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfY29ubiAgIChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfc2V0dXAgIChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfb2ZmbGluZShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfeG1pdF9wIChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfcGNsb3NlIChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfbnJtX3AgIChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKTsKK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfcmVzZXRfd2FpdChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlybGFwX2luZm8gKmluZm8pOworc3RhdGljIGludCBpcmxhcF9zdGF0ZV9yZXNldCAgKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgSVJMQVBfRVZFTlQgZXZlbnQsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlybGFwX2luZm8gKmluZm8pOworc3RhdGljIGludCBpcmxhcF9zdGF0ZV9ucm1fcyAgKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgSVJMQVBfRVZFTlQgZXZlbnQsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlybGFwX2luZm8gKmluZm8pOworc3RhdGljIGludCBpcmxhcF9zdGF0ZV94bWl0X3MgKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgSVJMQVBfRVZFTlQgZXZlbnQsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlybGFwX2luZm8gKmluZm8pOworc3RhdGljIGludCBpcmxhcF9zdGF0ZV9zY2xvc2UgKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgSVJMQVBfRVZFTlQgZXZlbnQsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlybGFwX2luZm8gKmluZm8pOworc3RhdGljIGludCBpcmxhcF9zdGF0ZV9yZXNldF9jaGVjayhzdHJ1Y3QgaXJsYXBfY2IgKiwgSVJMQVBfRVZFTlQgZXZlbnQsCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IGlybGFwX2luZm8gKik7CisKKyNpZmRlZiBDT05GSUdfSVJEQV9ERUJVRworc3RhdGljIGNvbnN0IGNoYXIgKmlybGFwX2V2ZW50W10gPSB7CisJIkRJU0NPVkVSWV9SRVFVRVNUIiwKKwkiQ09OTkVDVF9SRVFVRVNUIiwKKwkiQ09OTkVDVF9SRVNQT05TRSIsCisJIkRJU0NPTk5FQ1RfUkVRVUVTVCIsCisJIkRBVEFfUkVRVUVTVCIsCisJIlJFU0VUX1JFUVVFU1QiLAorCSJSRVNFVF9SRVNQT05TRSIsCisJIlNFTkRfSV9DTUQiLAorCSJTRU5EX1VJX0ZSQU1FIiwKKwkiUkVDVl9ESVNDT1ZFUllfWElEX0NNRCIsCisJIlJFQ1ZfRElTQ09WRVJZX1hJRF9SU1AiLAorCSJSRUNWX1NOUk1fQ01EIiwKKwkiUkVDVl9URVNUX0NNRCIsCisJIlJFQ1ZfVEVTVF9SU1AiLAorCSJSRUNWX1VBX1JTUCIsCisJIlJFQ1ZfRE1fUlNQIiwKKwkiUkVDVl9SRF9SU1AiLAorCSJSRUNWX0lfQ01EIiwKKwkiUkVDVl9JX1JTUCIsCisJIlJFQ1ZfVUlfRlJBTUUiLAorCSJSRUNWX0ZSTVJfUlNQIiwKKwkiUkVDVl9SUl9DTUQiLAorCSJSRUNWX1JSX1JTUCIsCisJIlJFQ1ZfUk5SX0NNRCIsCisJIlJFQ1ZfUk5SX1JTUCIsCisJIlJFQ1ZfUkVKX0NNRCIsCisJIlJFQ1ZfUkVKX1JTUCIsCisJIlJFQ1ZfU1JFSl9DTUQiLAorCSJSRUNWX1NSRUpfUlNQIiwKKwkiUkVDVl9ESVNDX0NNRCIsCisJIlNMT1RfVElNRVJfRVhQSVJFRCIsCisJIlFVRVJZX1RJTUVSX0VYUElSRUQiLAorCSJGSU5BTF9USU1FUl9FWFBJUkVEIiwKKwkiUE9MTF9USU1FUl9FWFBJUkVEIiwKKwkiRElTQ09WRVJZX1RJTUVSX0VYUElSRUQiLAorCSJXRF9USU1FUl9FWFBJUkVEIiwKKwkiQkFDS09GRl9USU1FUl9FWFBJUkVEIiwKKwkiTUVESUFfQlVTWV9USU1FUl9FWFBJUkVEIiwKK307CisjZW5kaWYJLyogQ09ORklHX0lSREFfREVCVUcgKi8KKworY29uc3QgY2hhciAqaXJsYXBfc3RhdGVbXSA9IHsKKwkiTEFQX05ETSIsCisJIkxBUF9RVUVSWSIsCisJIkxBUF9SRVBMWSIsCisJIkxBUF9DT05OIiwKKwkiTEFQX1NFVFVQIiwKKwkiTEFQX09GRkxJTkUiLAorCSJMQVBfWE1JVF9QIiwKKwkiTEFQX1BDTE9TRSIsCisJIkxBUF9OUk1fUCIsCisJIkxBUF9SRVNFVF9XQUlUIiwKKwkiTEFQX1JFU0VUIiwKKwkiTEFQX05STV9TIiwKKwkiTEFQX1hNSVRfUyIsCisJIkxBUF9TQ0xPU0UiLAorCSJMQVBfUkVTRVRfQ0hFQ0siLAorfTsKKworc3RhdGljIGludCAoKnN0YXRlW10pKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgSVJMQVBfRVZFTlQgZXZlbnQsCisJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKSA9Cit7CisJaXJsYXBfc3RhdGVfbmRtLAorCWlybGFwX3N0YXRlX3F1ZXJ5LAorCWlybGFwX3N0YXRlX3JlcGx5LAorCWlybGFwX3N0YXRlX2Nvbm4sCisJaXJsYXBfc3RhdGVfc2V0dXAsCisJaXJsYXBfc3RhdGVfb2ZmbGluZSwKKwlpcmxhcF9zdGF0ZV94bWl0X3AsCisJaXJsYXBfc3RhdGVfcGNsb3NlLAorCWlybGFwX3N0YXRlX25ybV9wLAorCWlybGFwX3N0YXRlX3Jlc2V0X3dhaXQsCisJaXJsYXBfc3RhdGVfcmVzZXQsCisJaXJsYXBfc3RhdGVfbnJtX3MsCisJaXJsYXBfc3RhdGVfeG1pdF9zLAorCWlybGFwX3N0YXRlX3NjbG9zZSwKKwlpcmxhcF9zdGF0ZV9yZXNldF9jaGVjaywKK307CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX3BvbGxfdGltZXJfZXhwaXJlZCAoZGF0YSkKKyAqCisgKiAgICBQb2xsIHRpbWVyIGhhcyBleHBpcmVkLiBOb3JtYWxseSB3ZSBtdXN0IG5vdyBzZW5kIGEgUlIgZnJhbWUgdG8gdGhlCisgKiAgICByZW1vdGUgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIGlybGFwX3BvbGxfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBpcmxhcF9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJsYXBfY2IgKikgZGF0YTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKworCWlybGFwX2RvX2V2ZW50KHNlbGYsIFBPTExfVElNRVJfRVhQSVJFRCwgTlVMTCwgTlVMTCk7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgYW5kIHNldCB0aW1lIGJlZm9yZSB3ZSB3aWxsIGhhdmUgdG8gc2VuZCBiYWNrIHRoZSBwZiBiaXQKKyAqIHRvIHRoZSBwZWVyLiBVc2UgaW4gcHJpbWFyeS4KKyAqIE1ha2Ugc3VyZSB0aGF0IHN0YXRlIGlzIFhNSVRfUC9YTUlUX1Mgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KKyAqIChhbmQgdGhhdCBub2JvZHkgbWVzc2VkIHVwIHdpdGggdGhlIHN0YXRlKS4gLSBKZWFuIElJCisgKi8KK3N0YXRpYyB2b2lkIGlybGFwX3N0YXJ0X3BvbGxfdGltZXIoc3RydWN0IGlybGFwX2NiICpzZWxmLCBpbnQgdGltZW91dCkKK3sKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CisKKyNpZmRlZiBDT05GSUdfSVJEQV9GQVNUX1JSCisJLyoKKwkgKiBTZW5kIG91dCB0aGUgUlIgZnJhbWVzIGZhc3RlciBpZiBvdXIgb3duIHRyYW5zbWl0IHF1ZXVlIGlzIGVtcHR5LCBvcgorCSAqIGlmIHRoZSBwZWVyIGlzIGJ1c3kuIFRoZSBlZmZlY3QgaXMgYSBtdWNoIGZhc3RlciBjb252ZXJzYXRpb24KKwkgKi8KKwlpZiAoKHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4cSkgPT0gMCkgfHwgKHNlbGYtPnJlbW90ZV9idXN5KSkgeworCQlpZiAoc2VsZi0+ZmFzdF9SUiA9PSBUUlVFKSB7CisJCQkvKgorCQkJICogIEFzc2VydCB0aGF0IHRoZSBmYXN0IHBvbGwgdGltZXIgaGFzIG5vdCByZWFjaGVkIHRoZQorCQkJICogIG5vcm1hbCBwb2xsIHRpbWVyIHlldAorCQkJICovCisJCQlpZiAoc2VsZi0+ZmFzdF9SUl90aW1lb3V0IDwgdGltZW91dCkgeworCQkJCS8qCisJCQkJICogIEZJWE1FOiB0aGlzIHNob3VsZCBiZSBhIG1vcmUgY29uZmlndXJhYmxlCisJCQkJICogICAgICAgICBmdW5jdGlvbgorCQkJCSAqLworCQkJCXNlbGYtPmZhc3RfUlJfdGltZW91dCArPQorCQkJCQkoc3lzY3RsX2Zhc3RfcG9sbF9pbmNyZWFzZSAqIEhaLzEwMDApOworCisJCQkJLyogVXNlIHRoaXMgZmFzdChlcikgdGltZW91dCBpbnN0ZWFkICovCisJCQkJdGltZW91dCA9IHNlbGYtPmZhc3RfUlJfdGltZW91dDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXNlbGYtPmZhc3RfUlIgPSBUUlVFOworCisJCQkvKiBTdGFydCB3aXRoIGp1c3QgMCBtcyAqLworCQkJc2VsZi0+ZmFzdF9SUl90aW1lb3V0ID0gMDsKKwkJCXRpbWVvdXQgPSAwOworCQl9CisJfSBlbHNlCisJCXNlbGYtPmZhc3RfUlIgPSBGQUxTRTsKKworCUlSREFfREVCVUcoMywgIiVzKCksIHRpbWVvdXQ9JWQgKCVsZClcbiIsIF9fRlVOQ1RJT05fXywgdGltZW91dCwgamlmZmllcyk7CisjZW5kaWYgLyogQ09ORklHX0lSREFfRkFTVF9SUiAqLworCisJaWYgKHRpbWVvdXQgPT0gMCkKKwkJaXJsYXBfZG9fZXZlbnQoc2VsZiwgUE9MTF9USU1FUl9FWFBJUkVELCBOVUxMLCBOVUxMKTsKKwllbHNlCisJCWlyZGFfc3RhcnRfdGltZXIoJnNlbGYtPnBvbGxfdGltZXIsIHRpbWVvdXQsIHNlbGYsCisJCQkJIGlybGFwX3BvbGxfdGltZXJfZXhwaXJlZCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9kb19ldmVudCAoZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICBSdXNoZXMgdGhyb3VnaCB0aGUgc3RhdGUgbWFjaGluZSB3aXRob3V0IGFueSBkZWxheS4gSWYgc3RhdGUgPT0gWE1JVAorICogICAgdGhlbiBzZW5kIHF1ZXVlZCBkYXRhIGZyYW1lcy4KKyAqLwordm9pZCBpcmxhcF9kb19ldmVudChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlybGFwX2luZm8gKmluZm8pCit7CisJaW50IHJldDsKKworCWlmICghc2VsZiB8fCBzZWxmLT5tYWdpYyAhPSBMQVBfTUFHSUMpCisJCXJldHVybjsKKworCUlSREFfREVCVUcoMywgIiVzKCksIGV2ZW50ID0gJXMsIHN0YXRlID0gJXNcbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgaXJsYXBfZXZlbnRbZXZlbnRdLCBpcmxhcF9zdGF0ZVtzZWxmLT5zdGF0ZV0pOworCisJcmV0ID0gKCpzdGF0ZVtzZWxmLT5zdGF0ZV0pKHNlbGYsIGV2ZW50LCBza2IsIGluZm8pOworCisJLyoKKwkgKiAgQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBwZW5kaW5nIGV2ZW50cyB0aGF0IG5lZWRzIHRvIGJlIGV4ZWN1dGVkCisJICovCisJc3dpdGNoIChzZWxmLT5zdGF0ZSkgeworCWNhc2UgTEFQX1hNSVRfUDogLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIExBUF9YTUlUX1M6CisJCS8qCisJCSAqIFdlIGp1c3QgcmVjZWl2ZWQgdGhlIHBmIGJpdCBhbmQgYXJlIGF0IHRoZSBiZWdpbm5pbmcKKwkJICogb2YgYSBuZXcgTEFQIHRyYW5zbWl0IHdpbmRvdy4KKwkJICogQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBxdWV1ZWQgZGF0YSBmcmFtZXMsIGFuZCBkbyBub3QKKwkJICogdHJ5IHRvIGRpc2Nvbm5lY3QgbGluayBpZiB3ZSBzZW5kIGFueSBkYXRhIGZyYW1lcywgc2luY2UKKwkJICogdGhhdCB3aWxsIGNoYW5nZSB0aGUgc3RhdGUgYXdheSBmb3JtIFhNSVQKKwkJICovCisJCUlSREFfREVCVUcoMiwgIiVzKCkgOiBxdWV1ZSBsZW4gPSAlZFxuIiwgX19GVU5DVElPTl9fLAorCQkJICAgc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhxKSk7CisKKwkJaWYgKHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4cSkpIHsKKwkJCS8qIFByZXZlbnQgcmFjZSBjb25kaXRpb25zIHdpdGggaXJsYXBfZGF0YV9yZXF1ZXN0KCkgKi8KKwkJCXNlbGYtPmxvY2FsX2J1c3kgPSBUUlVFOworCisJCQkvKiBUaGVvcnkgb2Ygb3BlcmF0aW9uLgorCQkJICogV2Ugc2VuZCBmcmFtZXMgdXAgdG8gd2hlbiB3ZSBmaWxsIHRoZSB3aW5kb3cgb3IKKwkJCSAqIHJlYWNoIGxpbmUgY2FwYWNpdHkuIFRob3NlIGZyYW1lcyB3aWxsIHF1ZXVlIHVwCisJCQkgKiBpbiB0aGUgZGV2aWNlIHF1ZXVlLCBhbmQgdGhlIGRyaXZlciB3aWxsIHNsb3dseQorCQkJICogc2VuZCB0aGVtLgorCQkJICogQWZ0ZXIgZWFjaCBmcmFtZSB0aGF0IHdlIHNlbmQsIHdlIHBvbGwgdGhlIGhpZ2hlcgorCQkJICogbGF5ZXIgZm9yIG1vcmUgZGF0YS4gSXQncyB0aGUgcmlnaHQgdGltZSB0byBkbworCQkJICogdGhhdCBiZWNhdXNlIHRoZSBsaW5rIGxheWVyIG5lZWQgdG8gcGVyZm9ybSB0aGUgbXR0CisJCQkgKiBhbmQgdGhlbiBzZW5kIHRoZSBmaXJzdCBmcmFtZSwgc28gd2UgY2FuIGFmZm9yZAorCQkJICogdG8gc2VuZCBhIGJpdCBvZiB0aW1lIGluIGtlcm5lbCBzcGFjZS4KKwkJCSAqIFRoZSBleHBsaWNpdCBmbG93IGluZGljYXRpb24gYWxsb3cgdG8gbWluaW1pc2UKKwkJCSAqIGJ1ZmZlcnMgKD09IGxvd2VyIGxhdGVuY3kpLCB0byBhdm9pZCBoaWdoZXIgbGF5ZXIKKwkJCSAqIHBvbGxpbmcgdmlhIHRpbWVycyAoPT0gbGVzcyBjb250ZXh0IHN3aXRjaGVzKSBhbmQKKwkJCSAqIHRvIGltcGxlbWVudCBhIGNydWRlIHNjaGVkdWxlciAtIEplYW4gSUkgKi8KKworCQkJLyogVHJ5IHRvIHNlbmQgYXdheSBhbGwgcXVldWVkIGRhdGEgZnJhbWVzICovCisJCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzZWxmLT50eHEpKSAhPSBOVUxMKSB7CisJCQkJLyogU2VuZCBvbmUgZnJhbWUgKi8KKwkJCQlyZXQgPSAoKnN0YXRlW3NlbGYtPnN0YXRlXSkoc2VsZiwgU0VORF9JX0NNRCwKKwkJCQkJCQkgICAgc2tiLCBOVUxMKTsKKwkJCQkvKiBEcm9wIHJlZmVyZW5jZSBjb3VudC4KKwkJCQkgKiBJdCB3aWxsIGJlIGluY3JlYXNlIGFzIG5lZWRlZCBpbgorCQkJCSAqIGlybGFwX3NlbmRfZGF0YV94eHgoKSAqLworCQkJCWtmcmVlX3NrYihza2IpOworCisJCQkJLyogUG9sbCB0aGUgaGlnaGVyIGxheWVycyBmb3Igb25lIG1vcmUgZnJhbWUgKi8KKwkJCQlpcmxtcF9mbG93X2luZGljYXRpb24oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLAorCQkJCQkJICAgICAgRkxPV19TVEFSVCk7CisKKwkJCQlpZiAocmV0ID09IC1FUFJPVE8pCisJCQkJCWJyZWFrOyAvKiBUcnkgYWdhaW4gbGF0ZXIhICovCisJCQl9CisJCQkvKiBGaW5pc2hlZCB0cmFuc21pdHRpbmcgKi8KKwkJCXNlbGYtPmxvY2FsX2J1c3kgPSBGQUxTRTsKKwkJfSBlbHNlIGlmIChzZWxmLT5kaXNjb25uZWN0X3BlbmRpbmcpIHsKKwkJCXNlbGYtPmRpc2Nvbm5lY3RfcGVuZGluZyA9IEZBTFNFOworCisJCQlyZXQgPSAoKnN0YXRlW3NlbGYtPnN0YXRlXSkoc2VsZiwgRElTQ09OTkVDVF9SRVFVRVNULAorCQkJCQkJICAgIE5VTEwsIE5VTEwpOworCQl9CisJCWJyZWFrOworLyoJY2FzZSBMQVBfTkRNOiAqLworLyoJY2FzZSBMQVBfQ09OTjogKi8KKy8qCWNhc2UgTEFQX1JFU0VUX1dBSVQ6ICovCisvKgljYXNlIExBUF9SRVNFVF9DSEVDSzogKi8KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9uZXh0X3N0YXRlIChzZWxmLCBzdGF0ZSkKKyAqCisgKiAgICBTd2l0Y2hlcyBzdGF0ZSBhbmQgcHJvdmlkZXMgZGVidWcgaW5mb3JtYXRpb24KKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpcmxhcF9uZXh0X3N0YXRlKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgSVJMQVBfU1RBVEUgc3RhdGUpCit7CisJLyoKKwlpZiAoIXNlbGYgfHwgc2VsZi0+bWFnaWMgIT0gTEFQX01BR0lDKQorCQlyZXR1cm47CisKKwlJUkRBX0RFQlVHKDQsICJuZXh0IExBUCBzdGF0ZSA9ICVzXG4iLCBpcmxhcF9zdGF0ZVtzdGF0ZV0pOworCSovCisJc2VsZi0+c3RhdGUgPSBzdGF0ZTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3N0YXRlX25kbSAoZXZlbnQsIHNrYiwgZnJhbWUpCisgKgorICogICAgTkRNIChOb3JtYWwgRGlzY29ubmVjdGVkIE1vZGUpIHN0YXRlCisgKgorICovCitzdGF0aWMgaW50IGlybGFwX3N0YXRlX25kbShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlybGFwX2luZm8gKmluZm8pCit7CisJZGlzY292ZXJ5X3QgKmRpc2NvdmVyeV9yc3A7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBDT05ORUNUX1JFUVVFU1Q6CisJCUlSREFfQVNTRVJUKHNlbGYtPm5ldGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCQlpZiAoc2VsZi0+bWVkaWFfYnVzeSkgeworCQkJLyogTm90ZSA6IHRoaXMgd2lsbCBuZXZlciBoYXBwZW4sIGJlY2F1c2Ugd2UgdGVzdAorCQkJICogbWVkaWEgYnVzeSBpbiBpcmxhcF9jb25uZWN0X3JlcXVlc3QoKSBhbmQKKwkJCSAqIHBvc3Rwb25lIHRoZSBldmVudC4uLiAtIEplYW4gSUkgKi8KKwkJCUlSREFfREVCVUcoMCwgIiVzKCksIENPTk5FQ1RfUkVRVUVTVDogbWVkaWEgYnVzeSFcbiIsCisJCQkJICAgX19GVU5DVElPTl9fKTsKKworCQkJLyogQWx3YXlzIHN3aXRjaCBzdGF0ZSBiZWZvcmUgY2FsbGluZyB1cHBlciBsYXllcnMgKi8KKwkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05ETSk7CisKKwkJCWlybGFwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzZWxmLCBMQVBfTUVESUFfQlVTWSk7CisJCX0gZWxzZSB7CisJCQlpcmxhcF9zZW5kX3Nucm1fZnJhbWUoc2VsZiwgJnNlbGYtPnFvc19yeCk7CisKKwkJCS8qIFN0YXJ0IEZpbmFsLWJpdCB0aW1lciAqLworCQkJaXJsYXBfc3RhcnRfZmluYWxfdGltZXIoc2VsZiwgc2VsZi0+ZmluYWxfdGltZW91dCk7CisKKwkJCXNlbGYtPnJldHJ5X2NvdW50ID0gMDsKKwkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX1NFVFVQKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFJFQ1ZfU05STV9DTUQ6CisJCS8qIENoZWNrIGlmIHRoZSBmcmFtZSBjb250YWlucyBhbmQgSSBmaWVsZCAqLworCQlpZiAoaW5mbykgeworCQkJc2VsZi0+ZGFkZHIgPSBpbmZvLT5kYWRkcjsKKwkJCXNlbGYtPmNhZGRyID0gaW5mby0+Y2FkZHI7CisKKwkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX0NPTk4pOworCisJCQlpcmxhcF9jb25uZWN0X2luZGljYXRpb24oc2VsZiwgc2tiKTsKKwkJfSBlbHNlIHsKKwkJCUlSREFfREVCVUcoMCwgIiVzKCksIFNOUk0gZnJhbWUgZG9lcyBub3QgIgorCQkJCSAgICJjb250YWluIGFuIEkgZmllbGQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQl9CisJCWJyZWFrOworCWNhc2UgRElTQ09WRVJZX1JFUVVFU1Q6CisJCUlSREFfQVNTRVJUKGluZm8gIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwkJaWYgKHNlbGYtPm1lZGlhX2J1c3kpIHsKKwkJCUlSREFfREVCVUcoMSwgIiVzKCksIERJU0NPVkVSWV9SRVFVRVNUOiBtZWRpYSBidXN5IVxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18pOworCQkJLyogaXJsYXAtPmxvZy5jb25kaXRpb24gPSBNRURJQV9CVVNZOyAqLworCisJCQkvKiBUaGlzIHdpbGwgbWFrZSBJckxNUCB0cnkgYWdhaW4gKi8KKwkJCWlybGFwX2Rpc2NvdmVyeV9jb25maXJtKHNlbGYsIE5VTEwpOworCQkJLyogTm90ZSA6IHRoZSBkaXNjb3ZlcnkgbG9nIGlzIG5vdCBjbGVhbmVkIHVwIGhlcmUsCisJCQkgKiBpdCB3aWxsIGJlIGRvbmUgaW4gaXJsYXBfZGlzY292ZXJ5X3JlcXVlc3QoKQorCQkJICogSmVhbiBJSSAqLworCQkJcmV0dXJuIDA7CisJCX0KKworCQlzZWxmLT5TID0gaW5mby0+UzsKKwkJc2VsZi0+cyA9IGluZm8tPnM7CisJCWlybGFwX3NlbmRfZGlzY292ZXJ5X3hpZF9mcmFtZShzZWxmLCBpbmZvLT5TLCBpbmZvLT5zLCBUUlVFLAorCQkJCQkgICAgICAgaW5mby0+ZGlzY292ZXJ5KTsKKwkJc2VsZi0+ZnJhbWVfc2VudCA9IEZBTFNFOworCQlzZWxmLT5zKys7CisKKwkJaXJsYXBfc3RhcnRfc2xvdF90aW1lcihzZWxmLCBzZWxmLT5zbG90X3RpbWVvdXQpOworCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9RVUVSWSk7CisJCWJyZWFrOworCWNhc2UgUkVDVl9ESVNDT1ZFUllfWElEX0NNRDoKKwkJSVJEQV9BU1NFUlQoaW5mbyAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCQkvKiBBc3NlcnQgdGhhdCB0aGlzIGlzIG5vdCB0aGUgZmluYWwgc2xvdCAqLworCQlpZiAoaW5mby0+cyA8PSBpbmZvLT5TKSB7CisJCQlzZWxmLT5zbG90ID0gaXJsYXBfZ2VuZXJhdGVfcmFuZF90aW1lX3Nsb3QoaW5mby0+UywKKwkJCQkJCQkJICAgaW5mby0+cyk7CisJCQlpZiAoc2VsZi0+c2xvdCA9PSBpbmZvLT5zKSB7CisJCQkJZGlzY292ZXJ5X3JzcCA9IGlybG1wX2dldF9kaXNjb3ZlcnlfcmVzcG9uc2UoKTsKKwkJCQlkaXNjb3ZlcnlfcnNwLT5kYXRhLmRhZGRyID0gaW5mby0+ZGFkZHI7CisKKwkJCQlpcmxhcF9zZW5kX2Rpc2NvdmVyeV94aWRfZnJhbWUoc2VsZiwgaW5mby0+UywKKwkJCQkJCQkgICAgICAgc2VsZi0+c2xvdCwKKwkJCQkJCQkgICAgICAgRkFMU0UsCisJCQkJCQkJICAgICAgIGRpc2NvdmVyeV9yc3ApOworCQkJCXNlbGYtPmZyYW1lX3NlbnQgPSBUUlVFOworCQkJfSBlbHNlCisJCQkJc2VsZi0+ZnJhbWVfc2VudCA9IEZBTFNFOworCisJCQkvKgorCQkJICogR28gdG8gcmVwbHkgc3RhdGUgdW50aWwgZW5kIG9mIGRpc2NvdmVyeSB0bworCQkJICogaW5oaWJpdCBvdXIgb3duIHRyYW5zbWlzc2lvbnMuIFNldCB0aGUgdGltZXIKKwkJCSAqIHRvIG5vdCBzdGF5IGZvcmV2ZXIgdGhlcmUuLi4gSmVhbiBJSQorCQkJICovCisJCQlpcmxhcF9zdGFydF9xdWVyeV90aW1lcihzZWxmLCBpbmZvLT5TLCBpbmZvLT5zKTsKKwkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX1JFUExZKTsKKwkJfSBlbHNlIHsKKwkJLyogVGhpcyBpcyB0aGUgZmluYWwgc2xvdC4gSG93IGlzIGl0IHBvc3NpYmxlID8KKwkJICogVGhpcyB3b3VsZCBoYXBwZW4gaXMgYm90aCBkaXNjb3ZlcmllcyBhcmUganVzdCBzbGlnaHRseQorCQkgKiBvZmZzZXQgKGlmIHRoZXkgYXJlIGluIHN5bmMsIGFsbCBwYWNrZXRzIGFyZSBsb3N0KS4KKwkJICogTW9zdCBvZnRlbiwgYWxsIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdHMgd2lsbCBiZSByZWNlaXZlZAorCQkgKiBpbiBRVUVSWSBzdGF0ZSAoc2VlIG15IGNvbW1lbnQgdGhlcmUpLCBleGNlcHQgZm9yIHRoZQorCQkgKiBsYXN0IGZyYW1lIHRoYXQgd2lsbCBjb21lIGhlcmUuCisJCSAqIFRoZSBiaWcgdHJvdWJsZSB3aGVuIGl0IGhhcHBlbiBpcyB0aGF0IGFjdGl2ZSBkaXNjb3ZlcnkKKwkJICogZG9lc24ndCBoYXBwZW4sIGJlY2F1c2Ugbm9ib2R5IGFuc3dlciB0aGUgZGlzY292ZXJpZXMKKwkJICogZnJhbWUgb2YgdGhlIG90aGVyIGd1eSwgc28gdGhlIGxvZyBzaG93cyB1cCBlbXB0eS4KKwkJICogV2hhdCBzaG91bGQgd2UgZG8gPworCQkgKiBOb3QgbXVjaC4gSXQncyB0b28gbGF0ZSB0byBhbnN3ZXIgdGhvc2UgZGlzY292ZXJ5IGZyYW1lcywKKwkJICogc28gd2UganVzdCBwYXNzIHRoZSBpbmZvIHRvIElyTE1QIHdobyB3aWxsIHB1dCBpdCBpbiB0aGUKKwkJICogbG9nIChhbmQgcG9zdCBhbiBldmVudCkuCisJCSAqIEFub3RoZXIgY2F1c2Ugd291bGQgYmUgZGV2aWNlcyB0aGF0IGRvIGRpc2NvdmVyeSBtdWNoCisJCSAqIHNsb3dlciB0aGFuIHVzLCBob3dldmVyIHRoZSBsYXRlc3QgZml4ZXMgc2hvdWxkIG1pbmltaXNlCisJCSAqIHRob3NlIGNhc2VzLi4uCisJCSAqIEplYW4gSUkKKwkJICovCisJCQlJUkRBX0RFQlVHKDEsICIlcygpLCBSZWNlaXZpbmcgZmluYWwgZGlzY292ZXJ5IHJlcXVlc3QsIG1pc3NlZCB0aGUgZGlzY292ZXJ5IHNsb3RzIDotKFxuIiwgX19GVU5DVElPTl9fKTsKKworCQkJLyogTGFzdCBkaXNjb3ZlcnkgcmVxdWVzdCAtPiBpbiB0aGUgbG9nICovCisJCQlpcmxhcF9kaXNjb3ZlcnlfaW5kaWNhdGlvbihzZWxmLCBpbmZvLT5kaXNjb3ZlcnkpOworCQl9CisJCWJyZWFrOworCWNhc2UgTUVESUFfQlVTWV9USU1FUl9FWFBJUkVEOgorCQkvKiBBIGJ1bmNoIG9mIGV2ZW50cyBtYXkgYmUgcG9zdHBvbmVkIGJlY2F1c2UgdGhlIG1lZGlhIGlzCisJCSAqIGJ1c3kgKHVzdWFsbHkgaW1tZWRpYXRlbHkgYWZ0ZXIgd2UgY2xvc2UgYSBjb25uZWN0aW9uKSwKKwkJICogb3Igd2hpbGUgd2UgYXJlIGRvaW5nIGRpc2NvdmVyeSAoc3RhdGUgcXVlcnkvcmVwbHkpLgorCQkgKiBJbiBhbGwgdGhvc2UgY2FzZXMsIHRoZSBtZWRpYSBidXN5IGZsYWcgd2lsbCBiZSBjbGVhcmVkCisJCSAqIHdoZW4gaXQncyBPSyBmb3IgdXMgdG8gcHJvY2VzcyB0aG9zZSBwb3N0cG9uZWQgZXZlbnRzLgorCQkgKiBUaGlzIGV2ZW50IGlzIG5vdCBtZW50aW9uZWQgaW4gdGhlIHN0YXRlIG1hY2hpbmVzIGluIHRoZQorCQkgKiBJckxBUCBzcGVjLiBJdCdzIGJlY2F1c2UgdGhleSBkaWRuJ3QgY29uc2lkZXIgVWx0cmEgYW5kCisJCSAqIHBvc3Rwb25pbmcgY29ubmVjdGlvbiByZXF1ZXN0IGlzIG9wdGlvbmFsLgorCQkgKiBKZWFuIElJICovCisjaWZkZWYgQ09ORklHX0lSREFfVUxUUkEKKwkJLyogU2VuZCBhbnkgcGVuZGluZyBVbHRyYSBmcmFtZXMgaWYgYW55ICovCisJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzZWxmLT50eHFfdWx0cmEpKSB7CisJCQkvKiBXZSBkb24ndCBzZW5kIHRoZSBmcmFtZSwganVzdCBwb3N0IGFuIGV2ZW50LgorCQkJICogQWxzbywgcHJldmlvdXNseSB0aGlzIGNvZGUgd2FzIGluIHRpbWVyLmMuLi4KKwkJCSAqIEplYW4gSUkgKi8KKwkJCXJldCA9ICgqc3RhdGVbc2VsZi0+c3RhdGVdKShzZWxmLCBTRU5EX1VJX0ZSQU1FLAorCQkJCQkJICAgIE5VTEwsIE5VTEwpOworCQl9CisjZW5kaWYgLyogQ09ORklHX0lSREFfVUxUUkEgKi8KKwkJLyogQ2hlY2sgaWYgd2Ugc2hvdWxkIHRyeSB0byBjb25uZWN0LgorCQkgKiBUaGlzIGNvZGUgd2FzIHByZXZpb3VzbHkgaW4gaXJsYXBfZG9fZXZlbnQoKSAqLworCQlpZiAoc2VsZi0+Y29ubmVjdF9wZW5kaW5nKSB7CisJCQlzZWxmLT5jb25uZWN0X3BlbmRpbmcgPSBGQUxTRTsKKworCQkJLyogVGhpcyBvbmUgKnNob3VsZCogbm90IHBlbmQgaW4gdGhpcyBzdGF0ZSwgZXhjZXB0CisJCQkgKiBpZiBhIHNvY2tldCB0cnkgdG8gY29ubmVjdCBhbmQgaW1tZWRpYXRlbHkKKwkJCSAqIGRpc2Nvbm5lY3QuIC0gY2xlYXIgLSBKZWFuIElJICovCisJCQlpZiAoc2VsZi0+ZGlzY29ubmVjdF9wZW5kaW5nKQorCQkJCWlybGFwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzZWxmLCBMQVBfRElTQ19JTkRJQ0FUSU9OKTsKKwkJCWVsc2UKKwkJCQlyZXQgPSAoKnN0YXRlW3NlbGYtPnN0YXRlXSkoc2VsZiwKKwkJCQkJCQkgICAgQ09OTkVDVF9SRVFVRVNULAorCQkJCQkJCSAgICBOVUxMLCBOVUxMKTsKKwkJCXNlbGYtPmRpc2Nvbm5lY3RfcGVuZGluZyA9IEZBTFNFOworCQl9CisJCS8qIE5vdGUgOiBvbmUgd2F5IHRvIHRlc3QgaWYgdGhpcyBjb2RlIHdvcmtzIHdlbGwgKGluY2x1ZGluZworCQkgKiBtZWRpYSBidXN5IGFuZCBzbWFsbCBidXN5KSBpcyB0byBjcmVhdGUgYSB1c2VyIHNwYWNlCisJCSAqIGFwcGxpY2F0aW9uIGdlbmVyYXRpbmcgYW4gVWx0cmEgcGFja2V0IGV2ZXJ5IDMuMDUgc2VjIChvcgorCQkgKiAyLjk1IHNlYykgYW5kIHRvIHNlZSBob3cgaXQgaW50ZXJhY3Qgd2l0aCBkaXNjb3ZlcnkuCisJCSAqIEl0J3MgZmFpcmx5IGVhc3kgdG8gY2hlY2sgdGhhdCBubyBwYWNrZXQgaXMgbG9zdCwgdGhhdCB0aGUKKwkJICogcGFja2V0cyBhcmUgcG9zdHBvbmVkIGR1cmluZyBkaXNjb3ZlcnkgYW5kIHRoYXQgYWZ0ZXIKKwkJICogZGlzY292ZXJ5IGluZGljYXRpb24geW91IGhhdmUgYSAxMDBtcyAiZ2FwIi4KKwkJICogQXMgY29ubmVjdGlvbiByZXF1ZXN0IGFuZCBVbHRyYSBhcmUgbm93IHByb2Nlc3NlZCB0aGUgc2FtZQorCQkgKiB3YXksIHRoaXMgYXZvaWQgdGhlIHRlZGlvdXMgam9iIG9mIHRyeWluZyBJckxBUCBjb25uZWN0aW9uCisJCSAqIGluIGFsbCB0aG9zZSBjYXNlcy4uLgorCQkgKiBKZWFuIElJICovCisJCWJyZWFrOworI2lmZGVmIENPTkZJR19JUkRBX1VMVFJBCisJY2FzZSBTRU5EX1VJX0ZSQU1FOgorCXsKKwkJaW50IGk7CisJCS8qIE9ubHkgYWxsb3dlZCB0byByZXBlYXQgYW4gb3BlcmF0aW9uIHR3aWNlICovCisJCWZvciAoaT0wOyAoKGk8MikgJiYgKHNlbGYtPm1lZGlhX2J1c3kgPT0gRkFMU0UpKTsgaSsrKSB7CisJCQlza2IgPSBza2JfZGVxdWV1ZSgmc2VsZi0+dHhxX3VsdHJhKTsKKwkJCWlmIChza2IpCisJCQkJaXJsYXBfc2VuZF91aV9mcmFtZShzZWxmLCBza2IsIENCUk9BRENBU1QsCisJCQkJCQkgICAgQ01EX0ZSQU1FKTsKKwkJCWVsc2UKKwkJCQlicmVhazsKKwkJCS8qIGlybGFwX3NlbmRfdWlfZnJhbWUoKSB3b24ndCBpbmNyZWFzZSBza2IgcmVmZXJlbmNlCisJCQkgKiBjb3VudCwgc28gbm8gZGV2X2tmcmVlX3NrYigpIC0gSmVhbiBJSSAqLworCQl9CisJCWlmIChpID09IDIpIHsKKwkJCS8qIEZvcmNlIHVzIHRvIGxpc3RlbiA1MDAgbXMgYWdhaW4gKi8KKwkJCWlyZGFfZGV2aWNlX3NldF9tZWRpYV9idXN5KHNlbGYtPm5ldGRldiwgVFJVRSk7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgUkVDVl9VSV9GUkFNRToKKwkJLyogT25seSBhY2NlcHQgYnJvYWRjYXN0IGZyYW1lcyBpbiBORE0gbW9kZSAqLworCQlpZiAoaW5mby0+Y2FkZHIgIT0gQ0JST0FEQ0FTVCkgeworCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgbm90IGEgYnJvYWRjYXN0IGZyYW1lIVxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18pOworCQl9IGVsc2UKKwkJCWlybGFwX3VuaXRkYXRhX2luZGljYXRpb24oc2VsZiwgc2tiKTsKKwkJYnJlYWs7CisjZW5kaWYgLyogQ09ORklHX0lSREFfVUxUUkEgKi8KKwljYXNlIFJFQ1ZfVEVTVF9DTUQ6CisJCS8qIFJlbW92ZSB0ZXN0IGZyYW1lIGhlYWRlciAqLworCQlza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgdGVzdF9mcmFtZSkpOworCisJCS8qCisJCSAqIFNlbmQgcmVzcG9uc2UuIFRoaXMgc2tiIHdpbGwgbm90IGJlIHNlbnQgb3V0IGFnYWluLCBhbmQKKwkJICogd2lsbCBvbmx5IGJlIHVzZWQgdG8gc2VuZCBvdXQgdGhlIHNhbWUgaW5mbyBhcyB0aGUgY21kCisJCSAqLworCQlpcmxhcF9zZW5kX3Rlc3RfZnJhbWUoc2VsZiwgQ0JST0FEQ0FTVCwgaW5mby0+ZGFkZHIsIHNrYik7CisJCWJyZWFrOworCWNhc2UgUkVDVl9URVNUX1JTUDoKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSBub3QgaW1wbGVtZW50ZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGV2ZW50ICVzXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgICBpcmxhcF9ldmVudFtldmVudF0pOworCisJCXJldCA9IC0xOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3N0YXRlX3F1ZXJ5IChldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIFFVRVJZIHN0YXRlCisgKgorICovCitzdGF0aWMgaW50IGlybGFwX3N0YXRlX3F1ZXJ5KHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgSVJMQVBfRVZFTlQgZXZlbnQsCisJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKQoreworCWludCByZXQgPSAwOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybiAtMTspOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgUkVDVl9ESVNDT1ZFUllfWElEX1JTUDoKKwkJSVJEQV9BU1NFUlQoaW5mbyAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwkJSVJEQV9BU1NFUlQoaW5mby0+ZGlzY292ZXJ5ICE9IE5VTEwsIHJldHVybiAtMTspOworCisJCUlSREFfREVCVUcoNCwgIiVzKCksIGRhZGRyPSUwOHhcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgIGluZm8tPmRpc2NvdmVyeS0+ZGF0YS5kYWRkcik7CisKKwkJaWYgKCFzZWxmLT5kaXNjb3ZlcnlfbG9nKSB7CisJCQlJUkRBX1dBUk5JTkcoIiVzOiBkaXNjb3ZlcnkgbG9nIGlzIGdvbmUhICIKKwkJCQkgICAgICJtYXliZSB0aGUgZGlzY292ZXJ5IHRpbWVvdXQgaGFzIGJlZW4gc2V0IgorCQkJCSAgICAgIiB0byBzaG9ydD9cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlicmVhazsKKwkJfQorCQloYXNoYmluX2luc2VydChzZWxmLT5kaXNjb3ZlcnlfbG9nLAorCQkJICAgICAgIChpcmRhX3F1ZXVlX3QgKikgaW5mby0+ZGlzY292ZXJ5LAorCQkJICAgICAgIGluZm8tPmRpc2NvdmVyeS0+ZGF0YS5kYWRkciwgTlVMTCk7CisKKwkJLyogS2VlcCBzdGF0ZSAqLworCQkvKiBpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9RVUVSWSk7ICAqLworCisJCWJyZWFrOworCWNhc2UgUkVDVl9ESVNDT1ZFUllfWElEX0NNRDoKKwkJLyogWWVzLCBpdCBpcyBwb3NzaWJsZSB0byByZWNlaXZlIHRob3NlIGZyYW1lcyBpbiB0aGlzIG1vZGUuCisJCSAqIE5vdGUgdGhhdCBtb3N0IG9mdGVuIHRoZSBsYXN0IGRpc2NvdmVyeSByZXF1ZXN0IHdvbid0CisJCSAqIG9jY3VyIGhlcmUgYnV0IGluIE5ETSBzdGF0ZSAoc2VlIG15IGNvbW1lbnQgdGhlcmUpLgorCQkgKiBXaGF0IHNob3VsZCB3ZSBkbyA/CisJCSAqIE5vdCBtdWNoLiBXZSBhcmUgY3VycmVudGx5IHBlcmZvcm1pbmcgb3VyIG93biBkaXNjb3ZlcnksCisJCSAqIHRoZXJlZm9yZSB3ZSBjYW4ndCBhbnN3ZXIgdGhvc2UgZnJhbWVzLiBXZSBkb24ndCB3YW50CisJCSAqIHRvIGNoYW5nZSBzdGF0ZSBlaXRoZXIuIFdlIGp1c3QgcGFzcyB0aGUgaW5mbyB0bworCQkgKiBJckxNUCB3aG8gd2lsbCBwdXQgaXQgaW4gdGhlIGxvZyAoYW5kIHBvc3QgYW4gZXZlbnQpLgorCQkgKiBKZWFuIElJCisJCSAqLworCisJCUlSREFfQVNTRVJUKGluZm8gIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgUmVjZWl2aW5nIGRpc2NvdmVyeSByZXF1ZXN0IChzID0gJWQpIHdoaWxlIHBlcmZvcm1pbmcgZGlzY292ZXJ5IDotKFxuIiwgX19GVU5DVElPTl9fLCBpbmZvLT5zKTsKKworCQkvKiBMYXN0IGRpc2NvdmVyeSByZXF1ZXN0ID8gKi8KKwkJaWYgKGluZm8tPnMgPT0gMHhmZikKKwkJCWlybGFwX2Rpc2NvdmVyeV9pbmRpY2F0aW9uKHNlbGYsIGluZm8tPmRpc2NvdmVyeSk7CisJCWJyZWFrOworCWNhc2UgU0xPVF9USU1FUl9FWFBJUkVEOgorCQkvKgorCQkgKiBXYWl0IGEgbGl0dGxlIGxvbmdlciBpZiB3ZSBkZXRlY3QgYW4gaW5jb21pbmcgZnJhbWUuIFRoaXMKKwkJICogaXMgbm90IG1lbnRpb25lZCBpbiB0aGUgc3BlYywgYnV0IGlzIGEgZ29vZCB0aGluZyB0byBkbywKKwkJICogc2luY2Ugd2Ugd2FudCB0byB3b3JrIGV2ZW4gd2l0aCBkZXZpY2VzIHRoYXQgdmlvbGF0ZSB0aGUKKwkJICogdGltaW5nIHJlcXVpcmVtZW50cy4KKwkJICovCisJCWlmIChpcmRhX2RldmljZV9pc19yZWNlaXZpbmcoc2VsZi0+bmV0ZGV2KSAmJiAhc2VsZi0+YWRkX3dhaXQpIHsKKwkJCUlSREFfREVCVUcoMiwgIiVzKCksIGRldmljZSBpcyBzbG93IHRvIGFuc3dlciwgIgorCQkJCSAgICJ3YWl0aW5nIHNvbWUgbW9yZSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlpcmxhcF9zdGFydF9zbG90X3RpbWVyKHNlbGYsIG1zZWNzX3RvX2ppZmZpZXMoMTApKTsKKwkJCXNlbGYtPmFkZF93YWl0ID0gVFJVRTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJc2VsZi0+YWRkX3dhaXQgPSBGQUxTRTsKKworCQlpZiAoc2VsZi0+cyA8IHNlbGYtPlMpIHsKKwkJCWlybGFwX3NlbmRfZGlzY292ZXJ5X3hpZF9mcmFtZShzZWxmLCBzZWxmLT5TLAorCQkJCQkJICAgICAgIHNlbGYtPnMsIFRSVUUsCisJCQkJCQkgICAgICAgc2VsZi0+ZGlzY292ZXJ5X2NtZCk7CisJCQlzZWxmLT5zKys7CisJCQlpcmxhcF9zdGFydF9zbG90X3RpbWVyKHNlbGYsIHNlbGYtPnNsb3RfdGltZW91dCk7CisKKwkJCS8qIEtlZXAgc3RhdGUgKi8KKwkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX1FVRVJZKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFRoaXMgaXMgdGhlIGZpbmFsIHNsb3QhICovCisJCQlpcmxhcF9zZW5kX2Rpc2NvdmVyeV94aWRfZnJhbWUoc2VsZiwgc2VsZi0+UywgMHhmZiwKKwkJCQkJCSAgICAgICBUUlVFLAorCQkJCQkJICAgICAgIHNlbGYtPmRpc2NvdmVyeV9jbWQpOworCisJCQkvKiBBbHdheXMgc3dpdGNoIHN0YXRlIGJlZm9yZSBjYWxsaW5nIHVwcGVyIGxheWVycyAqLworCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfTkRNKTsKKworCQkJLyoKKwkJCSAqICBXZSBhcmUgbm93IGZpbmlzaGVkIHdpdGggdGhlIGRpc2NvdmVyeSBwcm9jZWR1cmUsCisJCQkgKiAgc28gbm93IHdlIG11c3QgcmV0dXJuIHRoZSByZXN1bHRzCisJCQkgKi8KKwkJCWlybGFwX2Rpc2NvdmVyeV9jb25maXJtKHNlbGYsIHNlbGYtPmRpc2NvdmVyeV9sb2cpOworCisJCQkvKiBJckxNUCBzaG91bGQgbm93IGhhdmUgdGFrZW4gY2FyZSBvZiB0aGUgbG9nICovCisJCQlzZWxmLT5kaXNjb3ZlcnlfbG9nID0gTlVMTDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGV2ZW50ICVzXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgICBpcmxhcF9ldmVudFtldmVudF0pOworCisJCXJldCA9IC0xOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3N0YXRlX3JlcGx5IChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIFJFUExZLCB3ZSBoYXZlIHJlY2VpdmVkIGEgWElEIGRpc2NvdmVyeSBmcmFtZSBmcm9tIGEgZGV2aWNlIGFuZCB3ZQorICogICAgYXJlIHdhaXRpbmcgZm9yIHRoZSByaWdodCB0aW1lIHNsb3QgdG8gc2VuZCBhIHJlc3BvbnNlIFhJRCBmcmFtZQorICoKKyAqLworc3RhdGljIGludCBpcmxhcF9zdGF0ZV9yZXBseShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbykKK3sKKwlkaXNjb3ZlcnlfdCAqZGlzY292ZXJ5X3JzcDsKKwlpbnQgcmV0PTA7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybiAtMTspOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgUVVFUllfVElNRVJfRVhQSVJFRDoKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgUVVFUllfVElNRVJfRVhQSVJFRCA8JWxkPlxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgamlmZmllcyk7CisJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05ETSk7CisJCWJyZWFrOworCWNhc2UgUkVDVl9ESVNDT1ZFUllfWElEX0NNRDoKKwkJSVJEQV9BU1NFUlQoaW5mbyAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwkJLyogTGFzdCBmcmFtZT8gKi8KKwkJaWYgKGluZm8tPnMgPT0gMHhmZikgeworCQkJZGVsX3RpbWVyKCZzZWxmLT5xdWVyeV90aW1lcik7CisKKwkJCS8qIGluZm8tPmxvZy5jb25kaXRpb24gPSBSRU1PVEU7ICovCisKKwkJCS8qIEFsd2F5cyBzd2l0Y2ggc3RhdGUgYmVmb3JlIGNhbGxpbmcgdXBwZXIgbGF5ZXJzICovCisJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9ORE0pOworCisJCQlpcmxhcF9kaXNjb3ZlcnlfaW5kaWNhdGlvbihzZWxmLCBpbmZvLT5kaXNjb3ZlcnkpOworCQl9IGVsc2UgeworCQkJLyogSWYgaXQncyBvdXIgc2xvdCwgc2VuZCBvdXIgcmVwbHkgKi8KKwkJCWlmICgoaW5mby0+cyA+PSBzZWxmLT5zbG90KSAmJiAoIXNlbGYtPmZyYW1lX3NlbnQpKSB7CisJCQkJZGlzY292ZXJ5X3JzcCA9IGlybG1wX2dldF9kaXNjb3ZlcnlfcmVzcG9uc2UoKTsKKwkJCQlkaXNjb3ZlcnlfcnNwLT5kYXRhLmRhZGRyID0gaW5mby0+ZGFkZHI7CisKKwkJCQlpcmxhcF9zZW5kX2Rpc2NvdmVyeV94aWRfZnJhbWUoc2VsZiwgaW5mby0+UywKKwkJCQkJCQkgICAgICAgc2VsZi0+c2xvdCwKKwkJCQkJCQkgICAgICAgRkFMU0UsCisJCQkJCQkJICAgICAgIGRpc2NvdmVyeV9yc3ApOworCisJCQkJc2VsZi0+ZnJhbWVfc2VudCA9IFRSVUU7CisJCQl9CisJCQkvKiBSZWFkanVzdCBvdXIgdGltZXIgdG8gYWNjb21vZGF0ZSBkZXZpY2VzCisJCQkgKiBkb2luZyBmYXN0ZXIgb3Igc2xvd2VyIGRpc2NvdmVyeSB0aGFuIHVzLi4uCisJCQkgKiBKZWFuIElJICovCisJCQlpcmxhcF9zdGFydF9xdWVyeV90aW1lcihzZWxmLCBpbmZvLT5TLCBpbmZvLT5zKTsKKworCQkJLyogS2VlcCBzdGF0ZSAqLworCQkJLy9pcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9SRVBMWSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgVW5rbm93biBldmVudCAlZCwgJXNcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgIGV2ZW50LCBpcmxhcF9ldmVudFtldmVudF0pOworCisJCXJldCA9IC0xOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3N0YXRlX2Nvbm4gKGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgQ09OTiwgd2UgaGF2ZSByZWNlaXZlZCBhIFNOUk0gY29tbWFuZCBhbmQgaXMgd2FpdGluZyBmb3IgdGhlIHVwcGVyCisgKiAgICBsYXllciB0byBhY2NlcHQgb3IgcmVmdXNlIGNvbm5lY3Rpb24KKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfY29ubihzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKQoreworCWludCByZXQgPSAwOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgZXZlbnQ9JXNcbiIsIF9fRlVOQ1RJT05fXywgaXJsYXBfZXZlbnRbIGV2ZW50XSk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBDT05ORUNUX1JFU1BPTlNFOgorCQlza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3Qgc25ybV9mcmFtZSkpOworCisJCUlSREFfQVNTRVJUKHNlbGYtPm5ldGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCQlpcmxhcF9xb3NfbmVnb3RpYXRlKHNlbGYsIHNrYik7CisKKwkJaXJsYXBfaW5pdGlhdGVfY29ubmVjdGlvbl9zdGF0ZShzZWxmKTsKKworCQkvKgorCQkgKiBBcHBseWluZyB0aGUgcGFyYW1ldGVycyBub3cgd2lsbCBtYWtlIHN1cmUgd2UgY2hhbmdlIHNwZWVkCisJCSAqICphZnRlciogd2UgaGF2ZSBzZW50IHRoZSBuZXh0IGZyYW1lCisJCSAqLworCQlpcmxhcF9hcHBseV9jb25uZWN0aW9uX3BhcmFtZXRlcnMoc2VsZiwgRkFMU0UpOworCisJCS8qCisJCSAqIFNlbmRpbmcgdGhpcyBmcmFtZSB3aWxsIGZvcmNlIGEgc3BlZWQgY2hhbmdlIGFmdGVyIGl0IGhhcworCQkgKiBiZWVuIHNlbnQgKGkuZS4gdGhlIGZyYW1lIHdpbGwgYmUgc2VudCBhdCA5NjAwKS4KKwkJICovCisJCWlybGFwX3NlbmRfdWFfcmVzcG9uc2VfZnJhbWUoc2VsZiwgJnNlbGYtPnFvc19yeCk7CisKKyNpZiAwCisJCS8qCisJCSAqIFdlIGFyZSBhbGxvd2VkIHRvIHNlbmQgdHdvIGZyYW1lcywgYnV0IHRoaXMgbWF5IGluY3JlYXNlCisJCSAqIHRoZSBjb25uZWN0IGxhdGVuY3ksIHNvIGxldHMgbm90IGRvIGl0IGZvciBub3cuCisJCSAqLworCQkvKiBUaGlzIGlzIGZ1bGwgb2YgZ29vZCBpbnRlbnRpb25zLCBidXQgZG9lc24ndCB3b3JrIGluCisJCSAqIHByYWN0aWNlLgorCQkgKiBBZnRlciBzZW5kaW5nIHRoZSBmaXJzdCBVQSByZXNwb25zZSwgd2Ugc3dpdGNoIHRoZQorCQkgKiBkb25nbGUgdG8gdGhlIG5lZ290aWF0ZWQgc3BlZWQsIHdoaWNoIGlzIHVzdWFsbHkKKwkJICogZGlmZmVyZW50IHRoYW4gOTYwMCBrYi9zLgorCQkgKiBGcm9tIHRoZXJlLCB0aGVyZSBpcyB0d28gc29sdXRpb25zIDoKKwkJICogMSkgVGhlIG90aGVyIGVuZCBoYXMgcmVjZWl2ZWQgdGhlIGZpcnN0IFVBIHJlc3BvbnNlIDoKKwkJICogaXQgd2lsbCBzZXQgdXAgdGhlIGNvbm5lY3Rpb24sIG1vdmUgdG8gc3RhdGUgTEFQX05STV9QLAorCQkgKiBhbmQgd2lsbCBpZ25vcmUgYW5kIGRyb3AgdGhlIHNlY29uZCBVQSByZXNwb25zZS4KKwkJICogQWN0dWFsbHksIGl0J3MgZXZlbiB3b3JzZSA6IHRoZSBvdGhlciBzaWRlIHdpbGwgYWxtb3N0CisJCSAqIGltbWVkaWF0ZWx5IHNlbmQgYSBSUiB0aGF0IHdpbGwgbGlrZWx5IGNvbGxpZGUgd2l0aCB0aGUKKwkJICogVUEgcmVzcG9uc2UgKGRlcGVuZGluZyBvbiBuZWdvdGlhdGVkIHR1cm5hcm91bmQpLgorCQkgKiAyKSBUaGUgb3RoZXIgZW5kIGhhcyBub3QgcmVjZWl2ZWQgdGhlIGZpcnN0IFVBIHJlc3BvbnNlLAorCQkgKiB3aWxsIHN0YXkgYXQgOTYwMCBhbmQgd2lsbCBuZXZlciBzZWUgdGhlIHNlY29uZCBVQSByZXNwb25zZS4KKwkJICogSmVhbiBJSSAqLworCQlpcmxhcF9zZW5kX3VhX3Jlc3BvbnNlX2ZyYW1lKHNlbGYsICZzZWxmLT5xb3NfcngpOworI2VuZGlmCisKKwkJLyoKKwkJICogIFRoZSBXRC10aW1lciBjb3VsZCBiZSBzZXQgdG8gdGhlIGR1cmF0aW9uIG9mIHRoZSBQLXRpbWVyCisJCSAqICBmb3IgdGhpcyBjYXNlLCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHR3aWNlIHRoZQorCQkgKiAgdmFsdWUgKG5vdGUgMyBJckxBUCBwLiA2MCkuCisJCSAqLworCQlpcmxhcF9zdGFydF93ZF90aW1lcihzZWxmLCBzZWxmLT53ZF90aW1lb3V0KTsKKwkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfTlJNX1MpOworCisJCWJyZWFrOworCWNhc2UgUkVDVl9ESVNDT1ZFUllfWElEX0NNRDoKKwkJSVJEQV9ERUJVRygzLCAiJXMoKSwgZXZlbnQgUkVDVl9ESVNDT1ZFUl9YSURfQ01EIVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05ETSk7CisKKwkJYnJlYWs7CisJY2FzZSBESVNDT05ORUNUX1JFUVVFU1Q6CisJCUlSREFfREVCVUcoMCwgIiVzKCksIERpc2Nvbm5lY3QgcmVxdWVzdCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWlybGFwX3NlbmRfZG1fZnJhbWUoc2VsZik7CisJCWlybGFwX25leHRfc3RhdGUoIHNlbGYsIExBUF9ORE0pOworCQlpcmxhcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgTEFQX0RJU0NfSU5ESUNBVElPTik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMSwgIiVzKCksIFVua25vd24gZXZlbnQgJWQsICVzXG4iLCBfX0ZVTkNUSU9OX18sIAorCQkJICAgZXZlbnQsIGlybGFwX2V2ZW50W2V2ZW50XSk7CisKKwkJcmV0ID0gLTE7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9zdGF0ZV9zZXR1cCAoZXZlbnQsIHNrYiwgZnJhbWUpCisgKgorICogICAgU0VUVVAgc3RhdGUsIFRoZSBsb2NhbCBsYXllciBoYXMgdHJhbnNtaXR0ZWQgYSBTTlJNIGNvbW1hbmQgZnJhbWUgdG8KKyAqICAgIGEgcmVtb3RlIHBlZXIgbGF5ZXIgYW5kIGlzIGF3YWl0aW5nIGEgcmVwbHkgLgorICoKKyAqLworc3RhdGljIGludCBpcmxhcF9zdGF0ZV9zZXR1cChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBGSU5BTF9USU1FUl9FWFBJUkVEOgorCQlpZiAoc2VsZi0+cmV0cnlfY291bnQgPCBzZWxmLT5OMykgeworLyoKKyAqICBQZXJmb3JtIHJhbmRvbSBiYWNrb2ZmLCBXYWl0IGEgcmFuZG9tIG51bWJlciBvZiB0aW1lIHVuaXRzLCBtaW5pbXVtCisgKiAgZHVyYXRpb24gaGFsZiB0aGUgdGltZSB0YWtlbiB0byB0cmFuc21pdHQgYSBTTlJNIGZyYW1lLCBtYXhpbXVtIGR1cmF0aW9uCisgKiAgMS41IHRpbWVzIHRoZSB0aW1lIHRha2VuIHRvIHRyYW5zbWl0IGEgU05STSBmcmFtZS4gU28gdGhpcyB0aW1lIHNob3VsZAorICogIGJldHdlZW4gMTUgbXNlY3MgYW5kIDQ1IG1zZWNzLgorICovCisJCQlpcmxhcF9zdGFydF9iYWNrb2ZmX3RpbWVyKHNlbGYsIG1zZWNzX3RvX2ppZmZpZXMoMjAgKworCQkJCQkJICAgICAgICAoamlmZmllcyAlIDMwKSkpOworCQl9IGVsc2UgeworCQkJLyogQWx3YXlzIHN3aXRjaCBzdGF0ZSBiZWZvcmUgY2FsbGluZyB1cHBlciBsYXllcnMgKi8KKwkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05ETSk7CisKKwkJCWlybGFwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzZWxmLCBMQVBfRk9VTkRfTk9ORSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCQUNLT0ZGX1RJTUVSX0VYUElSRUQ6CisJCWlybGFwX3NlbmRfc25ybV9mcmFtZShzZWxmLCAmc2VsZi0+cW9zX3J4KTsKKwkJaXJsYXBfc3RhcnRfZmluYWxfdGltZXIoc2VsZiwgc2VsZi0+ZmluYWxfdGltZW91dCk7CisJCXNlbGYtPnJldHJ5X2NvdW50Kys7CisJCWJyZWFrOworCWNhc2UgUkVDVl9TTlJNX0NNRDoKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgU05STSBiYXR0bGUhXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm4gMDspOworCQlJUkRBX0FTU0VSVChpbmZvICE9IE5VTEwsIHJldHVybiAwOyk7CisKKwkJLyoKKwkJICogIFRoZSBkZXZpY2Ugd2l0aCB0aGUgbGFyZ2VzdCBkZXZpY2UgYWRkcmVzcyB3aW5zIHRoZSBiYXR0bGUKKwkJICogIChib3RoIGhhdmUgc2VudCBhIFNOUk0gY29tbWFuZCEpCisJCSAqLworCQlpZiAoaW5mbyAmJihpbmZvLT5kYWRkciA+IHNlbGYtPnNhZGRyKSkgeworCQkJZGVsX3RpbWVyKCZzZWxmLT5maW5hbF90aW1lcik7CisJCQlpcmxhcF9pbml0aWF0ZV9jb25uZWN0aW9uX3N0YXRlKHNlbGYpOworCisJCQlJUkRBX0FTU0VSVChzZWxmLT5uZXRkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwkJCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBzbnJtX2ZyYW1lKSk7CisKKwkJCWlybGFwX3Fvc19uZWdvdGlhdGUoc2VsZiwgc2tiKTsKKworCQkJLyogU2VuZCBVQSBmcmFtZSBhbmQgdGhlbiBjaGFuZ2UgbGluayBzZXR0aW5ncyAqLworCQkJaXJsYXBfYXBwbHlfY29ubmVjdGlvbl9wYXJhbWV0ZXJzKHNlbGYsIEZBTFNFKTsKKwkJCWlybGFwX3NlbmRfdWFfcmVzcG9uc2VfZnJhbWUoc2VsZiwgJnNlbGYtPnFvc19yeCk7CisKKwkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05STV9TKTsKKwkJCWlybGFwX2Nvbm5lY3RfY29uZmlybShzZWxmLCBza2IpOworCisJCQkvKgorCQkJICogIFRoZSBXRC10aW1lciBjb3VsZCBiZSBzZXQgdG8gdGhlIGR1cmF0aW9uIG9mIHRoZQorCQkJICogIFAtdGltZXIgZm9yIHRoaXMgY2FzZSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkCisJCQkgKiAgdG8gdXNlIHR3aWNlIHRoZSB2YWx1ZSAobm90ZSAzIElyTEFQIHAuIDYwKS4KKwkJCSAqLworCQkJaXJsYXBfc3RhcnRfd2RfdGltZXIoc2VsZiwgc2VsZi0+d2RfdGltZW91dCk7CisJCX0gZWxzZSB7CisJCQkvKiBXZSBqdXN0IGlnbm9yZSB0aGUgb3RoZXIgZGV2aWNlISAqLworCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfU0VUVVApOworCQl9CisJCWJyZWFrOworCWNhc2UgUkVDVl9VQV9SU1A6CisJCS8qIFN0b3AgRi10aW1lciAqLworCQlkZWxfdGltZXIoJnNlbGYtPmZpbmFsX3RpbWVyKTsKKworCQkvKiBJbml0aWF0ZSBjb25uZWN0aW9uIHN0YXRlICovCisJCWlybGFwX2luaXRpYXRlX2Nvbm5lY3Rpb25fc3RhdGUoc2VsZik7CisKKwkJLyogTmVnb3RpYXRlIGNvbm5lY3Rpb24gcGFyYW1ldGVycyAqLworCQlJUkRBX0FTU0VSVChza2ItPmxlbiA+IDEwLCByZXR1cm4gLTE7KTsKKworCQlza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgdWFfZnJhbWUpKTsKKworCQlJUkRBX0FTU0VSVChzZWxmLT5uZXRkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwkJaXJsYXBfcW9zX25lZ290aWF0ZShzZWxmLCBza2IpOworCisJCS8qIFNldCB0aGUgbmV3IGxpbmsgc2V0dGluZyAqbm93KiAoYmVmb3JlIHRoZSByciBmcmFtZSkgKi8KKwkJaXJsYXBfYXBwbHlfY29ubmVjdGlvbl9wYXJhbWV0ZXJzKHNlbGYsIFRSVUUpOworCQlzZWxmLT5yZXRyeV9jb3VudCA9IDA7CisKKwkJLyogV2FpdCBmb3IgdHVybmFyb3VuZCB0aW1lIHRvIGdpdmUgYSBjaGFuY2UgdG8gdGhlIG90aGVyCisJCSAqIGRldmljZSB0byBiZSByZWFkeSB0byByZWNlaXZlIHVzLgorCQkgKiBOb3RlIDogdGhlIHRpbWUgdG8gc3dpdGNoIHNwZWVkIGlzIHR5cGljYWxseSBsYXJnZXIKKwkJICogdGhhbiB0aGUgdHVybmFyb3VuZCB0aW1lLCBidXQgYXMgd2UgZG9uJ3QgaGF2ZSB0aGUgb3RoZXIKKwkJICogc2lkZSBzcGVlZCBzd2l0Y2ggdGltZSwgdGhhdCdzIG91ciBiZXN0IGd1ZXNzLi4uCisJCSAqIEplYW4gSUkgKi8KKwkJaXJsYXBfd2FpdF9taW5fdHVybl9hcm91bmQoc2VsZiwgJnNlbGYtPnFvc190eCk7CisKKwkJLyogVGhpcyBmcmFtZSB3aWxsIGFjdHVhbGx5IGJlIHNlbnQgYXQgdGhlIG5ldyBzcGVlZCAqLworCQlpcmxhcF9zZW5kX3JyX2ZyYW1lKHNlbGYsIENNRF9GUkFNRSk7CisKKwkJLyogVGhlIHRpbWVyIGlzIHNldCB0byBoYWxmIHRoZSBub3JtYWwgdGltZXIgdG8gcXVpY2tseQorCQkgKiBkZXRlY3QgYSBmYWlsdXJlIHRvIG5lZ29jaWF0ZSB0aGUgbmV3IGNvbm5lY3Rpb24KKwkJICogcGFyYW1ldGVycy4gSXJMQVAgNi4xMS4zLjIsIG5vdGUgMy4KKwkJICogTm90ZSB0aGF0IGN1cnJlbnRseSB3ZSBkb24ndCBwcm9jZXNzIHRoaXMgZmFpbHVyZQorCQkgKiBwcm9wZXJseSwgYXMgd2Ugc2hvdWxkIGRvIGEgcXVpY2sgZGlzY29ubmVjdC4KKwkJICogSmVhbiBJSSAqLworCQlpcmxhcF9zdGFydF9maW5hbF90aW1lcihzZWxmLCBzZWxmLT5maW5hbF90aW1lb3V0LzIpOworCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9OUk1fUCk7CisKKwkJaXJsYXBfY29ubmVjdF9jb25maXJtKHNlbGYsIHNrYik7CisJCWJyZWFrOworCWNhc2UgUkVDVl9ETV9SU1A6ICAgICAvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgUkVDVl9ESVNDX0NNRDoKKwkJZGVsX3RpbWVyKCZzZWxmLT5maW5hbF90aW1lcik7CisJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05ETSk7CisKKwkJaXJsYXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIExBUF9ESVNDX0lORElDQVRJT04pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDEsICIlcygpLCBVbmtub3duIGV2ZW50ICVkLCAlc1xuIiwgX19GVU5DVElPTl9fLAorCQkJICAgZXZlbnQsIGlybGFwX2V2ZW50W2V2ZW50XSk7CisKKwkJcmV0ID0gLTE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfc3RhdGVfb2ZmbGluZSAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICBPRkZMSU5FIHN0YXRlLCBub3QgdXNlZCBmb3Igbm93IQorICoKKyAqLworc3RhdGljIGludCBpcmxhcF9zdGF0ZV9vZmZsaW5lKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgSVJMQVBfRVZFTlQgZXZlbnQsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlybGFwX2luZm8gKmluZm8pCit7CisJSVJEQV9ERUJVRyggMCwgIiVzKCksIFVua25vd24gZXZlbnRcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9zdGF0ZV94bWl0X3AgKHNlbGYsIGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgWE1JVCwgT25seSB0aGUgcHJpbWFyeSBzdGF0aW9uIGhhcyByaWdodCB0byB0cmFuc21pdCwgYW5kIHdlCisgKiAgICB0aGVyZWZvcmUgZG8gbm90IGV4cGVjdCB0byByZWNlaXZlIGFueSB0cmFuc21pc3Npb25zIGZyb20gb3RoZXIKKyAqICAgIHN0YXRpb25zLgorICoKKyAqLworc3RhdGljIGludCBpcmxhcF9zdGF0ZV94bWl0X3Aoc3RydWN0IGlybGFwX2NiICpzZWxmLCBJUkxBUF9FVkVOVCBldmVudCwKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKQoreworCWludCByZXQgPSAwOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU0VORF9JX0NNRDoKKwkJLyoKKwkJICogIE9ubHkgc2VuZCBmcmFtZSBpZiBzZW5kLXdpbmRvdyA+IDAuCisJCSAqLworCQlpZiAoKHNlbGYtPndpbmRvdyA+IDApICYmICghc2VsZi0+cmVtb3RlX2J1c3kpKSB7CisJCQlpbnQgbmV4dGZpdDsKKyNpZmRlZiBDT05GSUdfSVJEQV9EWU5BTUlDX1dJTkRPVworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYl9uZXh0OworCisJCQkvKiBXaXRoIERZTkFNSUNfV0lORE9XLCB3ZSBrZWVwIHRoZSB3aW5kb3cgc2l6ZQorCQkJICogbWF4aW11bSwgYW5kIGFkYXB0IG9uIHRoZSBwYWNrZXRzIHdlIGFyZSBzZW5kaW5nLgorCQkJICogQXQgMTE1aywgd2UgY2FuIHNlbmQgb25seSAyIHBhY2tldHMgb2YgMjA0OCBieXRlcworCQkJICogaW4gYSA1MDAgbXMgdHVybmFyb3VuZC4gV2l0aG91dCB0aGlzIG9wdGlvbiwgd2UKKwkJCSAqIHdvdWxkIGFsd2F5cyBsaW1pdCB0aGUgd2luZG93IHRvIDIuIFdpdGggdGhpcworCQkJICogb3B0aW9uLCBpZiB3ZSBzZW5kIHNtYWxsZXIgcGFja2V0cywgd2UgY2FuIHNlbmQKKwkJCSAqIHVwIHRvIDcgb2YgdGhlbSAoYWx3YXlzIGRlcGVuZGluZyBvbiBRb1MpLgorCQkJICogSmVhbiBJSSAqLworCisJCQkvKiBMb29rIGF0IHRoZSBuZXh0IHNrYi4gVGhpcyBpcyBzYWZlLCBhcyB3ZSBhcmUKKwkJCSAqIHRoZSBvbmx5IGNvbnN1bWVyIG9mIHRoZSBUeCBxdWV1ZSAoaWYgd2UgYXJlIG5vdCwKKwkJCSAqIHdlIGhhdmUgb3RoZXIgcHJvYmxlbXMpIC0gSmVhbiBJSSAqLworCQkJc2tiX25leHQgPSBza2JfcGVlaygmc2VsZi0+dHhxKTsKKworCQkJLyogQ2hlY2sgaWYgYSBzdWJzZXF1ZW50IHNrYiBleGlzdCBhbmQgd291bGQgZml0IGluCisJCQkgKiB0aGUgY3VycmVudCB3aW5kb3cgKHdpdGggcmVzcGVjdCB0byB0dXJuYXJvdW5kCisJCQkgKiB0aW1lKS4KKwkJCSAqIFRoaXMgYWxsb3cgdXMgdG8gcHJvcGVybHkgbWFyayB0aGUgY3VycmVudCBwYWNrZXQKKwkJCSAqIHdpdGggdGhlIHBmIGJpdCwgdG8gYXZvaWQgZmFsbGluZyBiYWNrIG9uIHRoZQorCQkJICogc2Vjb25kIHRlc3QgYmVsb3csIGFuZCBhdm9pZCB3YWl0aW5nIHRoZQorCQkJICogZW5kIG9mIHRoZSB3aW5kb3cgYW5kIHNlbmRpbmcgYSBleHRyYSBSUi4KKwkJCSAqIE5vdGUgOiAoc2tiX25leHQgIT0gTlVMTCkgPD0+IChza2JfcXVldWVfbGVuKCkgPiAwKQorCQkJICogSmVhbiBJSSAqLworCQkJbmV4dGZpdCA9ICgoc2tiX25leHQgIT0gTlVMTCkgJiYKKwkJCQkgICAoKHNrYl9uZXh0LT5sZW4gKyBza2ItPmxlbikgPD0KKwkJCQkgICAgc2VsZi0+Ynl0ZXNfbGVmdCkpOworCisJCQkvKgorCQkJICogVGhlIGN1cnJlbnQgcGFja2V0IG1heSBub3QgZml0ICEgQmVjYXVzZSBvZiB0ZXN0CisJCQkgKiBhYm92ZSwgdGhpcyBzaG91bGQgbm90IGhhcHBlbiBhbnkgbW9yZSAhISEKKwkJCSAqICBUZXN0IGlmIHdlIGhhdmUgdHJhbnNtaXR0ZWQgbW9yZSBieXRlcyBvdmVyIHRoZQorCQkJICogIGxpbmsgdGhhbiBpdHMgcG9zc2libGUgdG8gZG8gd2l0aCB0aGUgY3VycmVudAorCQkJICogIHNwZWVkIGFuZCB0dXJuLWFyb3VuZC10aW1lLgorCQkJICovCisJCQlpZigoIW5leHRmaXQpICYmIChza2ItPmxlbiA+IHNlbGYtPmJ5dGVzX2xlZnQpKSB7CisJCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgTm90IGFsbG93ZWQgdG8gdHJhbnNtaXQiCisJCQkJCSAgICIgbW9yZSBieXRlcyFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJLyogUmVxdWV1ZSB0aGUgc2tiICovCisJCQkJc2tiX3F1ZXVlX2hlYWQoJnNlbGYtPnR4cSwgc2tiX2dldChza2IpKTsKKwkJCQkvKgorCQkJCSAqICBXZSBzaG91bGQgc3dpdGNoIHN0YXRlIHRvIExBUF9OUk1fUCwgYnV0CisJCQkJICogIHRoYXQgaXMgbm90IHBvc3NpYmxlIHNpbmNlIHdlIG11c3QgYmUgc3VyZQorCQkJCSAqICB0aGF0IHdlIHBvbGwgdGhlIG90aGVyIHNpZGUuIFNpbmNlIHdlIGhhdmUKKwkJCQkgKiAgdXNlZCB1cCBvdXIgdGltZSwgdGhlIHBvbGwgdGltZXIgc2hvdWxkCisJCQkJICogIHRyaWdnZXIgYW55d2F5IG5vdywgc28gd2UganVzdCB3YWl0IGZvciBpdAorCQkJCSAqICBEQgorCQkJCSAqLworCQkJCS8qCisJCQkJICogU29ycnksIGJ1dCB0aGF0J3Mgbm90IHRvdGFsbHkgdHJ1ZS4gSWYKKwkJCQkgKiB3ZSBzZW5kIDIwMDBCIHBhY2tldHMsIHdlIG1heSB3YWl0IGFub3RoZXIKKwkJCQkgKiAxMDAwQiB1bnRpbCBvdXIgdHVybmFyb3VuZCBleHBpcmUuIFRoYXQncworCQkJCSAqIHdoeSB3ZSBuZWVkIHRvIGJlIHByb2FjdGl2ZSBpbiBhdm9pZGluZworCQkJCSAqIGNvbWluZyBoZXJlLiAtIEplYW4gSUkKKwkJCQkgKi8KKwkJCQlyZXR1cm4gLUVQUk9UTzsKKwkJCX0KKworCQkJLyogU3Vic3RyYWN0IHNwYWNlIHVzZWQgYnkgdGhpcyBza2IgKi8KKwkJCXNlbGYtPmJ5dGVzX2xlZnQgLT0gc2tiLT5sZW47CisjZWxzZQkvKiBDT05GSUdfSVJEQV9EWU5BTUlDX1dJTkRPVyAqLworCQkJLyogV2luZG93IGhhcyBiZWVuIGFkanVzdGVkIGZvciB0aGUgbWF4IHBhY2tldAorCQkJICogc2l6ZSwgc28gbXVjaCBzaW1wbGVyLi4uIC0gSmVhbiBJSSAqLworCQkJbmV4dGZpdCA9IChza2JfcXVldWVfbGVuKCZzZWxmLT50eHEpID4gMCk7CisjZW5kaWYJLyogQ09ORklHX0lSREFfRFlOQU1JQ19XSU5ET1cgKi8KKwkJCS8qCisJCQkgKiAgU2VuZCBkYXRhIHdpdGggcG9sbCBiaXQgY2xlYXJlZCBvbmx5IGlmIHdpbmRvdyA+IDEKKwkJCSAqICBhbmQgdGhlcmUgaXMgbW9yZSBmcmFtZXMgYWZ0ZXIgdGhpcyBvbmUgdG8gYmUgc2VudAorCQkJICovCisJCQlpZiAoKHNlbGYtPndpbmRvdyA+IDEpICYmIChuZXh0Zml0KSkgeworCQkJCS8qIE1vcmUgcGFja2V0IHRvIHNlbmQgaW4gY3VycmVudCB3aW5kb3cgKi8KKwkJCQlpcmxhcF9zZW5kX2RhdGFfcHJpbWFyeShzZWxmLCBza2IpOworCQkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX1hNSVRfUCk7CisJCQl9IGVsc2UgeworCQkJCS8qIEZpbmFsIHBhY2tldCBvZiB3aW5kb3cgKi8KKwkJCQlpcmxhcF9zZW5kX2RhdGFfcHJpbWFyeV9wb2xsKHNlbGYsIHNrYik7CisJCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfTlJNX1ApOworCisJCQkJLyoKKwkJCQkgKiBNYWtlIHN1cmUgc3RhdGUgbWFjaGluZSBkb2VzIG5vdCB0cnkgdG8gc2VuZAorCQkJCSAqIGFueSBtb3JlIGZyYW1lcworCQkJCSAqLworCQkJCXJldCA9IC1FUFJPVE87CisJCQl9CisjaWZkZWYgQ09ORklHX0lSREFfRkFTVF9SUgorCQkJLyogUGVlciBtYXkgd2FudCB0byByZXBseSBpbW1lZGlhdGVseSAqLworCQkJc2VsZi0+ZmFzdF9SUiA9IEZBTFNFOworI2VuZGlmIC8qIENPTkZJR19JUkRBX0ZBU1RfUlIgKi8KKwkJfSBlbHNlIHsKKwkJCUlSREFfREVCVUcoNCwgIiVzKCksIFVuYWJsZSB0byBzZW5kISByZW1vdGUgYnVzeT9cbiIsCisJCQkJICAgX19GVU5DVElPTl9fKTsKKwkJCXNrYl9xdWV1ZV9oZWFkKCZzZWxmLT50eHEsIHNrYl9nZXQoc2tiKSk7CisKKwkJCS8qCisJCQkgKiAgVGhlIG5leHQgcmV0IGlzIGltcG9ydGFudCwgYmVjYXVzZSBpdCB0ZWxscworCQkJICogIGlybGFwX25leHRfc3RhdGUgX25vdF8gdG8gZGVsaXZlciBtb3JlIGZyYW1lcworCQkJICovCisJCQlyZXQgPSAtRVBST1RPOworCQl9CisJCWJyZWFrOworCWNhc2UgUE9MTF9USU1FUl9FWFBJUkVEOgorCQlJUkRBX0RFQlVHKDMsICIlcygpLCBQT0xMX1RJTUVSX0VYUElSRUQgPCVsZD5cbiIsCisJCQkgICAgX19GVU5DVElPTl9fLCBqaWZmaWVzKTsKKwkJaXJsYXBfc2VuZF9ycl9mcmFtZShzZWxmLCBDTURfRlJBTUUpOworCQkvKiBSZXR1cm4gdG8gTlJNIHByb3Blcmx5IC0gSmVhbiBJSSAgKi8KKwkJc2VsZi0+d2luZG93ID0gc2VsZi0+d2luZG93X3NpemU7CisjaWZkZWYgQ09ORklHX0lSREFfRFlOQU1JQ19XSU5ET1cKKwkJLyogQWxsb3dlZCB0byB0cmFuc21pdCBhIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGFnYWluLiAqLworCQlzZWxmLT5ieXRlc19sZWZ0ID0gc2VsZi0+bGluZV9jYXBhY2l0eTsKKyNlbmRpZiAvKiBDT05GSUdfSVJEQV9EWU5BTUlDX1dJTkRPVyAqLworCQlpcmxhcF9zdGFydF9maW5hbF90aW1lcihzZWxmLCBzZWxmLT5maW5hbF90aW1lb3V0KTsKKwkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfTlJNX1ApOworCQlicmVhazsKKwljYXNlIERJU0NPTk5FQ1RfUkVRVUVTVDoKKwkJZGVsX3RpbWVyKCZzZWxmLT5wb2xsX3RpbWVyKTsKKwkJaXJsYXBfd2FpdF9taW5fdHVybl9hcm91bmQoc2VsZiwgJnNlbGYtPnFvc190eCk7CisJCWlybGFwX3NlbmRfZGlzY19mcmFtZShzZWxmKTsKKwkJaXJsYXBfZmx1c2hfYWxsX3F1ZXVlcyhzZWxmKTsKKwkJaXJsYXBfc3RhcnRfZmluYWxfdGltZXIoc2VsZiwgc2VsZi0+ZmluYWxfdGltZW91dCk7CisJCXNlbGYtPnJldHJ5X2NvdW50ID0gMDsKKwkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfUENMT1NFKTsKKwkJYnJlYWs7CisJY2FzZSBEQVRBX1JFUVVFU1Q6CisJCS8qIE5vdGhpbmcgdG8gZG8sIGlybGFwX2RvX2V2ZW50KCkgd2lsbCBzZW5kIHRoZSBwYWNrZXQKKwkJICogd2hlbiB3ZSByZXR1cm4uLi4gLSBKZWFuIElJICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gZXZlbnQgJXNcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGlybGFwX2V2ZW50W2V2ZW50XSk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9zdGF0ZV9wY2xvc2UgKGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgUENMT1NFIHN0YXRlCisgKi8KK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfcGNsb3NlKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgSVJMQVBfRVZFTlQgZXZlbnQsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoMSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBSRUNWX1VBX1JTUDogLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIFJFQ1ZfRE1fUlNQOgorCQlkZWxfdGltZXIoJnNlbGYtPmZpbmFsX3RpbWVyKTsKKworCQkvKiBTZXQgbmV3IGxpbmsgcGFyYW1ldGVycyAqLworCQlpcmxhcF9hcHBseV9kZWZhdWx0X2Nvbm5lY3Rpb25fcGFyYW1ldGVycyhzZWxmKTsKKworCQkvKiBBbHdheXMgc3dpdGNoIHN0YXRlIGJlZm9yZSBjYWxsaW5nIHVwcGVyIGxheWVycyAqLworCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9ORE0pOworCisJCWlybGFwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzZWxmLCBMQVBfRElTQ19JTkRJQ0FUSU9OKTsKKwkJYnJlYWs7CisJY2FzZSBGSU5BTF9USU1FUl9FWFBJUkVEOgorCQlpZiAoc2VsZi0+cmV0cnlfY291bnQgPCBzZWxmLT5OMykgeworCQkJaXJsYXBfd2FpdF9taW5fdHVybl9hcm91bmQoc2VsZiwgJnNlbGYtPnFvc190eCk7CisJCQlpcmxhcF9zZW5kX2Rpc2NfZnJhbWUoc2VsZik7CisJCQlpcmxhcF9zdGFydF9maW5hbF90aW1lcihzZWxmLCBzZWxmLT5maW5hbF90aW1lb3V0KTsKKwkJCXNlbGYtPnJldHJ5X2NvdW50Kys7CisJCQkvKiBLZWVwIHN0YXRlICovCisJCX0gZWxzZSB7CisJCQlpcmxhcF9hcHBseV9kZWZhdWx0X2Nvbm5lY3Rpb25fcGFyYW1ldGVycyhzZWxmKTsKKworCQkJLyogIEFsd2F5cyBzd2l0Y2ggc3RhdGUgYmVmb3JlIGNhbGxpbmcgdXBwZXIgbGF5ZXJzICovCisJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9ORE0pOworCisJCQlpcmxhcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgTEFQX05PX1JFU1BPTlNFKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDEsICIlcygpLCBVbmtub3duIGV2ZW50ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGV2ZW50KTsKKworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9zdGF0ZV9ucm1fcCAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgIE5STV9QIChOb3JtYWwgUmVzcG9uc2UgTW9kZSBhcyBQcmltYXJ5KSwgVGhlIHByaW1hcnkgc3RhdGlvbiBoYXMgZ2l2ZW4KKyAqICAgcGVybWlzc2lvbnMgdG8gYSBzZWNvbmRhcnkgc3RhdGlvbiB0byB0cmFuc21pdCBJckxBUCByZXNvbnNlIGZyYW1lcworICogICAoYnkgc2VuZGluZyBhIGZyYW1lIHdpdGggdGhlIFAgYml0IHNldCkuIFRoZSBwcmltYXJ5IHN0YXRpb24gd2lsbCBub3QKKyAqICAgdHJhbnNtaXQgYW55IGZyYW1lcyBhbmQgaXMgZXhwZWN0aW5nIHRvIHJlY2VpdmUgZnJhbWVzIG9ubHkgZnJvbSB0aGUKKyAqICAgc2Vjb25kYXJ5IHRvIHdoaWNoIHRyYW5zbWlzc2lvbiBwZXJtaXNzaW9ucyBoYXMgYmVlbiBnaXZlbi4KKyAqLworc3RhdGljIGludCBpcmxhcF9zdGF0ZV9ucm1fcChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgbnNfc3RhdHVzOworCWludCBucl9zdGF0dXM7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBSRUNWX0lfUlNQOiAvKiBPcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiBjYXNlICovCisJCS8qIEZJWE1FOiBtdXN0IGNoZWNrIGZvciByZW1vdGVfYnVzeSBiZWxvdyAqLworI2lmZGVmIENPTkZJR19JUkRBX0ZBU1RfUlIKKwkJLyoKKwkJICogIFJlc2V0IHRoZSBmYXN0X1JSIHNvIHdlIGNhbiB1c2UgdGhlIGZhc3QgUlIgY29kZSB3aXRoCisJCSAqICBmdWxsIHNwZWVkIHRoZSBuZXh0IHRpbWUgc2luY2UgcGVlciBtYXkgaGF2ZSBtb3JlIGZyYW1lcworCQkgKiAgdG8gdHJhbnNtaXR0CisJCSAqLworCQlzZWxmLT5mYXN0X1JSID0gRkFMU0U7CisjZW5kaWYgLyogQ09ORklHX0lSREFfRkFTVF9SUiAqLworCQlJUkRBX0FTU0VSVCggaW5mbyAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCQluc19zdGF0dXMgPSBpcmxhcF92YWxpZGF0ZV9uc19yZWNlaXZlZChzZWxmLCBpbmZvLT5ucyk7CisJCW5yX3N0YXR1cyA9IGlybGFwX3ZhbGlkYXRlX25yX3JlY2VpdmVkKHNlbGYsIGluZm8tPm5yKTsKKworCQkvKgorCQkgKiAgQ2hlY2sgZm9yIGV4cGVjdGVkIEkobmZvcm1hdGlvbikgZnJhbWUKKwkJICovCisJCWlmICgobnNfc3RhdHVzID09IE5TX0VYUEVDVEVEKSAmJiAobnJfc3RhdHVzID09IE5SX0VYUEVDVEVEKSkgeworCisJCQkvKiBVcGRhdGUgVnIgKG5leHQgZnJhbWUgZm9yIHVzIHRvIHJlY2VpdmUpICovCisJCQlzZWxmLT52ciA9IChzZWxmLT52ciArIDEpICUgODsKKworCQkJLyogVXBkYXRlIE5yIHJlY2VpdmVkLCBjbGVhbnVwIG91ciByZXRyeSBxdWV1ZSAqLworCQkJaXJsYXBfdXBkYXRlX25yX3JlY2VpdmVkKHNlbGYsIGluZm8tPm5yKTsKKworCQkJLyoKKwkJCSAqICBHb3QgZXhwZWN0ZWQgTlIsIHNvIHJlc2V0IHRoZQorCQkJICogIHJldHJ5X2NvdW50LiBUaGlzIGlzIG5vdCBkb25lIGJ5IElyTEFQIHNwZWMsCisJCQkgKiAgd2hpY2ggaXMgc3RyYW5nZSEKKwkJCSAqLworCQkJc2VsZi0+cmV0cnlfY291bnQgPSAwOworCQkJc2VsZi0+YWNrX3JlcXVpcmVkID0gVFJVRTsKKworCQkJLyogIHBvbGwgYml0IGNsZWFyZWQ/ICAqLworCQkJaWYgKCFpbmZvLT5wZikgeworCQkJCS8qIEtlZXAgc3RhdGUsIGRvIG5vdCBtb3ZlIHRoaXMgbGluZSAqLworCQkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05STV9QKTsKKworCQkJCWlybGFwX2RhdGFfaW5kaWNhdGlvbihzZWxmLCBza2IsIEZBTFNFKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogTm8gbG9uZ2VyIHdhaXRpbmcgZm9yIHBmICovCisJCQkJZGVsX3RpbWVyKCZzZWxmLT5maW5hbF90aW1lcik7CisKKwkJCQlpcmxhcF93YWl0X21pbl90dXJuX2Fyb3VuZChzZWxmLCAmc2VsZi0+cW9zX3R4KTsKKworCQkJCS8qIENhbGwgaGlnaGVyIGxheWVyICpiZWZvcmUqIGNoYW5naW5nIHN0YXRlCisJCQkJICogdG8gZ2l2ZSB0aGVtIGEgY2hhbmNlIHRvIHNlbmQgZGF0YSBpbiB0aGUKKwkJCQkgKiBuZXh0IExBUCBmcmFtZS4KKwkJCQkgKiBKZWFuIElJICovCisJCQkJaXJsYXBfZGF0YV9pbmRpY2F0aW9uKHNlbGYsIHNrYiwgRkFMU0UpOworCisJCQkJLyogWE1JVCBzdGF0ZXMgYXJlIHRoZSBtb3N0IGRhbmdlcm91cyBzdGF0ZQorCQkJCSAqIHRvIGJlIGluLCBiZWNhdXNlIHVzZXIgcmVxdWVzdHMgYXJlCisJCQkJICogcHJvY2Vzc2VkIGRpcmVjdGx5IGFuZCBtYXkgY2hhbmdlIHN0YXRlLgorCQkJCSAqIE9uIHRoZSBvdGhlciBoYW5kLCBpbiBORE1fUCwgdGhvc2UKKwkJCQkgKiByZXF1ZXN0cyBhcmUgcXVldWVkIGFuZCB3ZSB3aWxsIHByb2Nlc3MKKwkJCQkgKiB0aGVtIHdoZW4gd2UgcmV0dXJuIHRvIGlybGFwX2RvX2V2ZW50KCkuCisJCQkJICogSmVhbiBJSQorCQkJCSAqLworCQkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX1hNSVRfUCk7CisKKwkJCQkvKiBUaGlzIGlzIHRoZSBsYXN0IGZyYW1lLgorCQkJCSAqIE1ha2Ugc3VyZSBpdCdzIGFsd2F5cyBjYWxsZWQgaW4gWE1JVCBzdGF0ZS4KKwkJCQkgKiAtIEplYW4gSUkgKi8KKwkJCQlpcmxhcF9zdGFydF9wb2xsX3RpbWVyKHNlbGYsIHNlbGYtPnBvbGxfdGltZW91dCk7CisJCQl9CisJCQlicmVhazsKKworCQl9CisJCS8qIFVuZXhwZWN0ZWQgbmV4dCB0byBzZW5kIChOcykgKi8KKwkJaWYgKChuc19zdGF0dXMgPT0gTlNfVU5FWFBFQ1RFRCkgJiYgKG5yX3N0YXR1cyA9PSBOUl9FWFBFQ1RFRCkpCisJCXsKKwkJCWlmICghaW5mby0+cGYpIHsKKwkJCQlpcmxhcF91cGRhdGVfbnJfcmVjZWl2ZWQoc2VsZiwgaW5mby0+bnIpOworCisJCQkJLyoKKwkJCQkgKiAgV2FpdCB1bnRpbCB0aGUgbGFzdCBmcmFtZSBiZWZvcmUgZG9pbmcKKwkJCQkgKiAgYW55dGhpbmcKKwkJCQkgKi8KKworCQkJCS8qIEtlZXAgc3RhdGUgKi8KKwkJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9OUk1fUCk7CisJCQl9IGVsc2UgeworCQkJCUlSREFfREVCVUcoNCwKKwkJCQkgICAgICAgIiVzKCksIG1pc3Npbmcgb3IgZHVwbGljYXRlIGZyYW1lIVxuIiwKKwkJCQkJICAgX19GVU5DVElPTl9fKTsKKworCQkJCS8qIFVwZGF0ZSBOciByZWNlaXZlZCAqLworCQkJCWlybGFwX3VwZGF0ZV9ucl9yZWNlaXZlZChzZWxmLCBpbmZvLT5ucik7CisKKwkJCQlpcmxhcF93YWl0X21pbl90dXJuX2Fyb3VuZChzZWxmLCAmc2VsZi0+cW9zX3R4KTsKKwkJCQlpcmxhcF9zZW5kX3JyX2ZyYW1lKHNlbGYsIENNRF9GUkFNRSk7CisKKwkJCQlzZWxmLT5hY2tfcmVxdWlyZWQgPSBGQUxTRTsKKworCQkJCWlybGFwX3N0YXJ0X2ZpbmFsX3RpbWVyKHNlbGYsIHNlbGYtPmZpbmFsX3RpbWVvdXQpOworCQkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05STV9QKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCS8qCisJCSAqICBVbmV4cGVjdGVkIG5leHQgdG8gcmVjZWl2ZSAoTnIpCisJCSAqLworCQlpZiAoKG5zX3N0YXR1cyA9PSBOU19FWFBFQ1RFRCkgJiYgKG5yX3N0YXR1cyA9PSBOUl9VTkVYUEVDVEVEKSkKKwkJeworCQkJaWYgKGluZm8tPnBmKSB7CisJCQkJc2VsZi0+dnIgPSAoc2VsZi0+dnIgKyAxKSAlIDg7CisKKwkJCQkvKiBVcGRhdGUgTnIgcmVjZWl2ZWQgKi8KKwkJCQlpcmxhcF91cGRhdGVfbnJfcmVjZWl2ZWQoc2VsZiwgaW5mby0+bnIpOworCisJCQkJLyogUmVzZW5kIHJlamVjdGVkIGZyYW1lcyAqLworCQkJCWlybGFwX3Jlc2VuZF9yZWplY3RlZF9mcmFtZXMoc2VsZiwgQ01EX0ZSQU1FKTsKKworCQkJCXNlbGYtPmFja19yZXF1aXJlZCA9IEZBTFNFOworCisJCQkJLyogTWFrZSBzdXJlIHdlIGFjY291bnQgZm9yIHRoZSB0aW1lCisJCQkJICogdG8gdHJhbnNtaXQgb3VyIGZyYW1lcy4gU2VlIGNvbWVtbnRzCisJCQkJICogaW4gaXJsYXBfc2VuZF9kYXRhX3ByaW1hcnlfcG9sbCgpLgorCQkJCSAqIEplYW4gSUkgKi8KKwkJCQlpcmxhcF9zdGFydF9maW5hbF90aW1lcihzZWxmLCAyICogc2VsZi0+ZmluYWxfdGltZW91dCk7CisKKwkJCQkvKiBLZWVwIHN0YXRlLCBkbyBub3QgbW92ZSB0aGlzIGxpbmUgKi8KKwkJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9OUk1fUCk7CisKKwkJCQlpcmxhcF9kYXRhX2luZGljYXRpb24oc2VsZiwgc2tiLCBGQUxTRSk7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogIERvIG5vdCByZXNlbmQgZnJhbWVzIHVudGlsIHRoZSBsYXN0CisJCQkJICogIGZyYW1lIGhhcyBhcnJpdmVkIGZyb20gdGhlIG90aGVyCisJCQkJICogIGRldmljZS4gVGhpcyBpcyBub3QgZG9jdW1lbnRlZCBpbgorCQkJCSAqICBJckxBUCEhCisJCQkJICovCisJCQkJc2VsZi0+dnIgPSAoc2VsZi0+dnIgKyAxKSAlIDg7CisKKwkJCQkvKiBVcGRhdGUgTnIgcmVjZWl2ZWQgKi8KKwkJCQlpcmxhcF91cGRhdGVfbnJfcmVjZWl2ZWQoc2VsZiwgaW5mby0+bnIpOworCisJCQkJc2VsZi0+YWNrX3JlcXVpcmVkID0gRkFMU0U7CisKKwkJCQkvKiBLZWVwIHN0YXRlLCBkbyBub3QgbW92ZSB0aGlzIGxpbmUhKi8KKwkJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9OUk1fUCk7CisKKwkJCQlpcmxhcF9kYXRhX2luZGljYXRpb24oc2VsZiwgc2tiLCBGQUxTRSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQkvKgorCQkgKiAgVW5leHBlY3RlZCBuZXh0IHRvIHNlbmQgKE5zKSBhbmQgbmV4dCB0byByZWNlaXZlIChOcikKKwkJICogIE5vdCBkb2N1bWVudGVkIGJ5IElyTEFQIQorCQkgKi8KKwkJaWYgKChuc19zdGF0dXMgPT0gTlNfVU5FWFBFQ1RFRCkgJiYKKwkJICAgIChucl9zdGF0dXMgPT0gTlJfVU5FWFBFQ1RFRCkpCisJCXsKKwkJCUlSREFfREVCVUcoNCwgIiVzKCksIHVuZXhwZWN0ZWQgbnIgYW5kIG5zIVxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18pOworCQkJaWYgKGluZm8tPnBmKSB7CisJCQkJLyogUmVzZW5kIHJlamVjdGVkIGZyYW1lcyAqLworCQkJCWlybGFwX3Jlc2VuZF9yZWplY3RlZF9mcmFtZXMoc2VsZiwgQ01EX0ZSQU1FKTsKKworCQkJCS8qIEdpdmUgcGVlciBzb21lIHRpbWUgdG8gcmV0cmFuc21pdCEgCisJCQkJICogQnV0IGFjY291bnQgZm9yIG91ciBvd24gVHguICovCisJCQkJaXJsYXBfc3RhcnRfZmluYWxfdGltZXIoc2VsZiwgMiAqIHNlbGYtPmZpbmFsX3RpbWVvdXQpOworCisJCQkJLyogS2VlcCBzdGF0ZSwgZG8gbm90IG1vdmUgdGhpcyBsaW5lICovCisJCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfTlJNX1ApOworCQkJfSBlbHNlIHsKKwkJCQkvKiBVcGRhdGUgTnIgcmVjZWl2ZWQgKi8KKwkJCQkvKiBpcmxhcF91cGRhdGVfbnJfcmVjZWl2ZWQoIGluZm8tPm5yKTsgKi8KKworCQkJCXNlbGYtPmFja19yZXF1aXJlZCA9IEZBTFNFOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiAgSW52YWxpZCBOUiBvciBOUworCQkgKi8KKwkJaWYgKChucl9zdGF0dXMgPT0gTlJfSU5WQUxJRCkgfHwgKG5zX3N0YXR1cyA9PSBOU19JTlZBTElEKSkgeworCQkJaWYgKGluZm8tPnBmKSB7CisJCQkJZGVsX3RpbWVyKCZzZWxmLT5maW5hbF90aW1lcik7CisKKwkJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9SRVNFVF9XQUlUKTsKKworCQkJCWlybGFwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzZWxmLCBMQVBfUkVTRVRfSU5ESUNBVElPTik7CisJCQkJc2VsZi0+eG1pdGZsYWcgPSBUUlVFOworCQkJfSBlbHNlIHsKKwkJCQlkZWxfdGltZXIoJnNlbGYtPmZpbmFsX3RpbWVyKTsKKworCQkJCWlybGFwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzZWxmLCBMQVBfUkVTRVRfSU5ESUNBVElPTik7CisKKwkJCQlzZWxmLT54bWl0ZmxhZyA9IEZBTFNFOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgTm90IGltcGxlbWVudGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgZXZlbnQ9JXMsIG5zX3N0YXR1cz0lZCwgbnJfc3RhdHVzPSVkXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLCBpcmxhcF9ldmVudFtldmVudF0sIG5zX3N0YXR1cywgbnJfc3RhdHVzKTsKKwkJYnJlYWs7CisJY2FzZSBSRUNWX1VJX0ZSQU1FOgorCQkvKiBQb2xsIGJpdCBjbGVhcmVkPyAqLworCQlpZiAoIWluZm8tPnBmKSB7CisJCQlpcmxhcF9kYXRhX2luZGljYXRpb24oc2VsZiwgc2tiLCBUUlVFKTsKKwkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05STV9QKTsKKwkJfSBlbHNlIHsKKwkJCWRlbF90aW1lcigmc2VsZi0+ZmluYWxfdGltZXIpOworCQkJaXJsYXBfZGF0YV9pbmRpY2F0aW9uKHNlbGYsIHNrYiwgVFJVRSk7CisJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9YTUlUX1ApOworCQkJSVJEQV9ERUJVRygxLCAiJXM6IFJFQ1ZfVUlfRlJBTUU6IG5leHQgc3RhdGUgJXNcbiIsIF9fRlVOQ1RJT05fXywgaXJsYXBfc3RhdGVbc2VsZi0+c3RhdGVdKTsKKwkJCWlybGFwX3N0YXJ0X3BvbGxfdGltZXIoc2VsZiwgc2VsZi0+cG9sbF90aW1lb3V0KTsKKwkJfQorCQlicmVhazsKKwljYXNlIFJFQ1ZfUlJfUlNQOgorCQkvKgorCQkgKiAgSWYgeW91IGdldCBhIFJSLCB0aGUgcmVtb3RlIGlzbid0IGJ1c3kgYW55bW9yZSwKKwkJICogIG5vIG1hdHRlciB3aGF0IHRoZSBOUgorCQkgKi8KKwkJc2VsZi0+cmVtb3RlX2J1c3kgPSBGQUxTRTsKKworCQkvKgorCQkgKiAgTnIgYXMgZXhwZWN0ZWQ/CisJCSAqLworCQlyZXQgPSBpcmxhcF92YWxpZGF0ZV9ucl9yZWNlaXZlZChzZWxmLCBpbmZvLT5ucik7CisJCWlmIChyZXQgPT0gTlJfRVhQRUNURUQpIHsKKwkJCS8qIFN0b3AgZmluYWwgdGltZXIgKi8KKwkJCWRlbF90aW1lcigmc2VsZi0+ZmluYWxfdGltZXIpOworCisJCQkvKiBVcGRhdGUgTnIgcmVjZWl2ZWQgKi8KKwkJCWlybGFwX3VwZGF0ZV9ucl9yZWNlaXZlZChzZWxmLCBpbmZvLT5ucik7CisKKwkJCS8qCisJCQkgKiAgR290IGV4cGVjdGVkIE5SLCBzbyByZXNldCB0aGUgcmV0cnlfY291bnQuIFRoaXMKKwkJCSAqICBpcyBub3QgZG9uZSBieSB0aGUgSXJMQVAgc3RhbmRhcmQgLCB3aGljaCBpcworCQkJICogIHN0cmFuZ2UhIERCLgorCQkJICovCisJCQlzZWxmLT5yZXRyeV9jb3VudCA9IDA7CisJCQlpcmxhcF93YWl0X21pbl90dXJuX2Fyb3VuZChzZWxmLCAmc2VsZi0+cW9zX3R4KTsKKworCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfWE1JVF9QKTsKKworCQkJLyogU3RhcnQgcG9sbCB0aW1lciAqLworCQkJaXJsYXBfc3RhcnRfcG9sbF90aW1lcihzZWxmLCBzZWxmLT5wb2xsX3RpbWVvdXQpOworCQl9IGVsc2UgaWYgKHJldCA9PSBOUl9VTkVYUEVDVEVEKSB7CisJCQlJUkRBX0FTU0VSVChpbmZvICE9IE5VTEwsIHJldHVybiAtMTspOworCQkJLyoKKwkJCSAqICBVbmV4cGVjdGVkIG5yIQorCQkJICovCisKKwkJCS8qIFVwZGF0ZSBOciByZWNlaXZlZCAqLworCQkJaXJsYXBfdXBkYXRlX25yX3JlY2VpdmVkKHNlbGYsIGluZm8tPm5yKTsKKworCQkJSVJEQV9ERUJVRyg0LCAiUkVDVl9SUl9GUkFNRTogUmV0cmFuczolZCwgbnI9JWQsIHZhPSVkLCAiCisJCQkgICAgICAidnM9JWQsIHZyPSVkXG4iLAorCQkJICAgICAgc2VsZi0+cmV0cnlfY291bnQsIGluZm8tPm5yLCBzZWxmLT52YSwKKwkJCSAgICAgIHNlbGYtPnZzLCBzZWxmLT52cik7CisKKwkJCS8qIFJlc2VuZCByZWplY3RlZCBmcmFtZXMgKi8KKwkJCWlybGFwX3Jlc2VuZF9yZWplY3RlZF9mcmFtZXMoc2VsZiwgQ01EX0ZSQU1FKTsKKworCQkJLyogRmluYWwgdGltZXIgPz8/IEplYW4gSUkgKi8KKworCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfTlJNX1ApOworCQl9IGVsc2UgaWYgKHJldCA9PSBOUl9JTlZBTElEKSB7CisJCQlJUkRBX0RFQlVHKDEsICIlcygpLCBSZWNlaXZlZCBSUiB3aXRoICIKKwkJCQkgICAiaW52YWxpZCBuciAhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJZGVsX3RpbWVyKCZzZWxmLT5maW5hbF90aW1lcik7CisKKwkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX1JFU0VUX1dBSVQpOworCisJCQlpcmxhcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgTEFQX1JFU0VUX0lORElDQVRJT04pOworCQkJc2VsZi0+eG1pdGZsYWcgPSBUUlVFOworCQl9CisJCWJyZWFrOworCWNhc2UgUkVDVl9STlJfUlNQOgorCQlJUkRBX0FTU0VSVChpbmZvICE9IE5VTEwsIHJldHVybiAtMTspOworCisJCS8qIFN0b3AgZmluYWwgdGltZXIgKi8KKwkJZGVsX3RpbWVyKCZzZWxmLT5maW5hbF90aW1lcik7CisJCXNlbGYtPnJlbW90ZV9idXN5ID0gVFJVRTsKKworCQkvKiBVcGRhdGUgTnIgcmVjZWl2ZWQgKi8KKwkJaXJsYXBfdXBkYXRlX25yX3JlY2VpdmVkKHNlbGYsIGluZm8tPm5yKTsKKwkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfWE1JVF9QKTsKKworCQkvKiBTdGFydCBwb2xsIHRpbWVyICovCisJCWlybGFwX3N0YXJ0X3BvbGxfdGltZXIoc2VsZiwgc2VsZi0+cG9sbF90aW1lb3V0KTsKKwkJYnJlYWs7CisJY2FzZSBSRUNWX0ZSTVJfUlNQOgorCQlkZWxfdGltZXIoJnNlbGYtPmZpbmFsX3RpbWVyKTsKKwkJc2VsZi0+eG1pdGZsYWcgPSBUUlVFOworCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9SRVNFVF9XQUlUKTsKKwkJaXJsYXBfcmVzZXRfaW5kaWNhdGlvbihzZWxmKTsKKwkJYnJlYWs7CisJY2FzZSBGSU5BTF9USU1FUl9FWFBJUkVEOgorCQkvKgorCQkgKiAgV2UgYXJlIGFsbG93ZWQgdG8gd2FpdCBmb3IgYWRkaXRpb25hbCAzMDAgbXMgaWYKKwkJICogIGZpbmFsIHRpbWVyIGV4cGlyZXMgd2hlbiB3ZSBhcmUgaW4gdGhlIG1pZGRsZQorCQkgKiAgb2YgcmVjZWl2aW5nIGEgZnJhbWUgKHBhZ2UgNDUsIElyTEFQKS4gQ2hlY2sgdGhhdAorCQkgKiAgd2Ugb25seSBkbyB0aGlzIG9uY2UgZm9yIGVhY2ggZnJhbWUuCisJCSAqLworCQlpZiAoaXJkYV9kZXZpY2VfaXNfcmVjZWl2aW5nKHNlbGYtPm5ldGRldikgJiYgIXNlbGYtPmFkZF93YWl0KSB7CisJCQlJUkRBX0RFQlVHKDEsICJGSU5BTF9USU1FUl9FWFBJUkVEIHdoZW4gcmVjZWl2aW5nIGEgIgorCQkJICAgICAgImZyYW1lISBXYWl0aW5nIGEgbGl0dGxlIGJpdCBtb3JlIVxuIik7CisJCQlpcmxhcF9zdGFydF9maW5hbF90aW1lcihzZWxmLCBtc2Vjc190b19qaWZmaWVzKDMwMCkpOworCisJCQkvKgorCQkJICogIERvbid0IGFsbG93IHRoaXMgdG8gaGFwcGVuIG9uZSBtb3JlIHRpbWUgaW4gYSByb3csCisJCQkgKiAgb3IgZWxzZSB3ZSBjYW4gZ2V0IGEgcHJldHR5IHRpZ2h0IGxvb3AgaGVyZSBpZgorCQkJICogIGlmIHdlIG9ubHkgcmVjZWl2ZSBoYWxmIGEgZnJhbWUuIERCLgorCQkJICovCisJCQlzZWxmLT5hZGRfd2FpdCA9IFRSVUU7CisJCQlicmVhazsKKwkJfQorCQlzZWxmLT5hZGRfd2FpdCA9IEZBTFNFOworCisJCS8qIE4yIGlzIHRoZSBkaXNjb25uZWN0IHRpbWVyLiBVbnRpbCB3ZSByZWFjaCBpdCwgd2UgcmV0cnkgKi8KKwkJaWYgKHNlbGYtPnJldHJ5X2NvdW50IDwgc2VsZi0+TjIpIHsKKwkJCS8qIFJldHJ5IHNlbmRpbmcgdGhlIHBmIGJpdCB0byB0aGUgc2Vjb25kYXJ5ICovCisJCQlpcmxhcF93YWl0X21pbl90dXJuX2Fyb3VuZChzZWxmLCAmc2VsZi0+cW9zX3R4KTsKKwkJCWlybGFwX3NlbmRfcnJfZnJhbWUoc2VsZiwgQ01EX0ZSQU1FKTsKKworCQkJaXJsYXBfc3RhcnRfZmluYWxfdGltZXIoc2VsZiwgc2VsZi0+ZmluYWxfdGltZW91dCk7CisJCQlzZWxmLT5yZXRyeV9jb3VudCsrOworCQkJSVJEQV9ERUJVRyg0LCAiaXJsYXBfc3RhdGVfbnJtX3A6IEZJTkFMX1RJTUVSX0VYUElSRUQ6IgorCQkJCSAgICIgcmV0cnlfY291bnQ9JWRcbiIsIHNlbGYtPnJldHJ5X2NvdW50KTsKKworCQkJLyogRWFybHkgd2FybmluZyBldmVudC4gSSdtIHVzaW5nIGEgcHJldHR5IGxpYmVyYWwKKwkJCSAqIGludGVycHJldGF0aW9uIG9mIHRoZSBzcGVjIGFuZCBnZW5lcmF0ZSBhbiBldmVudAorCQkJICogZXZlcnkgdGltZSB0aGUgdGltZXIgaXMgbXVsdGlwbGUgb2YgTjEgKGFuZCBub3QKKwkJCSAqIG9ubHkgdGhlIGZpcnN0IHRpbWUpLiBUaGlzIGFsbG93IGFwcGxpY2F0aW9uCisJCQkgKiB0byBrbm93IHByZWNpc2VseSBpZiBjb25uZWN0aXZpdHkgcmVzdGFydC4uLgorCQkJICogSmVhbiBJSSAqLworCQkJaWYoKHNlbGYtPnJldHJ5X2NvdW50ICUgc2VsZi0+TjEpID09IDApCisJCQkJaXJsYXBfc3RhdHVzX2luZGljYXRpb24oc2VsZiwKKwkJCQkJCQlTVEFUVVNfTk9fQUNUSVZJVFkpOworCisJCQkvKiBLZWVwIHN0YXRlICovCisJCX0gZWxzZSB7CisJCQlpcmxhcF9hcHBseV9kZWZhdWx0X2Nvbm5lY3Rpb25fcGFyYW1ldGVycyhzZWxmKTsKKworCQkJLyogQWx3YXlzIHN3aXRjaCBzdGF0ZSBiZWZvcmUgY2FsbGluZyB1cHBlciBsYXllcnMgKi8KKwkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05ETSk7CisJCQlpcmxhcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgTEFQX05PX1JFU1BPTlNFKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFJFQ1ZfUkVKX1JTUDoKKwkJaXJsYXBfdXBkYXRlX25yX3JlY2VpdmVkKHNlbGYsIGluZm8tPm5yKTsKKwkJaWYgKHNlbGYtPnJlbW90ZV9idXN5KSB7CisJCQlpcmxhcF93YWl0X21pbl90dXJuX2Fyb3VuZChzZWxmLCAmc2VsZi0+cW9zX3R4KTsKKwkJCWlybGFwX3NlbmRfcnJfZnJhbWUoc2VsZiwgQ01EX0ZSQU1FKTsKKwkJfSBlbHNlCisJCQlpcmxhcF9yZXNlbmRfcmVqZWN0ZWRfZnJhbWVzKHNlbGYsIENNRF9GUkFNRSk7CisJCWlybGFwX3N0YXJ0X2ZpbmFsX3RpbWVyKHNlbGYsIDIgKiBzZWxmLT5maW5hbF90aW1lb3V0KTsKKwkJYnJlYWs7CisJY2FzZSBSRUNWX1NSRUpfUlNQOgorCQlpcmxhcF91cGRhdGVfbnJfcmVjZWl2ZWQoc2VsZiwgaW5mby0+bnIpOworCQlpZiAoc2VsZi0+cmVtb3RlX2J1c3kpIHsKKwkJCWlybGFwX3dhaXRfbWluX3R1cm5fYXJvdW5kKHNlbGYsICZzZWxmLT5xb3NfdHgpOworCQkJaXJsYXBfc2VuZF9ycl9mcmFtZShzZWxmLCBDTURfRlJBTUUpOworCQl9IGVsc2UKKwkJCWlybGFwX3Jlc2VuZF9yZWplY3RlZF9mcmFtZShzZWxmLCBDTURfRlJBTUUpOworCQlpcmxhcF9zdGFydF9maW5hbF90aW1lcihzZWxmLCAyICogc2VsZi0+ZmluYWxfdGltZW91dCk7CisJCWJyZWFrOworCWNhc2UgUkVDVl9SRF9SU1A6CisJCUlSREFfREVCVUcoMSwgIiVzKCksIFJFQ1ZfUkRfUlNQXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCWlybGFwX2ZsdXNoX2FsbF9xdWV1ZXMoc2VsZik7CisJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX1hNSVRfUCk7CisJCS8qIENhbGwgYmFjayB0aGUgTEFQIHN0YXRlIG1hY2hpbmUgdG8gZG8gYSBwcm9wZXIgZGlzY29ubmVjdCAqLworCQlpcmxhcF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMSwgIiVzKCksIFVua25vd24gZXZlbnQgJXNcbiIsCisJCQkgICAgX19GVU5DVElPTl9fLCBpcmxhcF9ldmVudFtldmVudF0pOworCisJCXJldCA9IC0xOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3N0YXRlX3Jlc2V0X3dhaXQgKGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgV2UgaGF2ZSBpbmZvcm1lZCB0aGUgc2VydmljZSB1c2VyIG9mIGEgcmVzZXQgY29uZGl0aW9uLCBhbmQgaXMKKyAqICAgIGF3YWl0aW5nIHJlc2V0IG9mIGRpc2Nvbm5lY3QgcmVxdWVzdC4KKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfcmVzZXRfd2FpdChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlybGFwX2luZm8gKmluZm8pCit7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpLCBldmVudCA9ICVzXG4iLCBfX0ZVTkNUSU9OX18sIGlybGFwX2V2ZW50W2V2ZW50XSk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBSRVNFVF9SRVFVRVNUOgorCQlpZiAoc2VsZi0+eG1pdGZsYWcpIHsKKwkJCWlybGFwX3dhaXRfbWluX3R1cm5fYXJvdW5kKHNlbGYsICZzZWxmLT5xb3NfdHgpOworCQkJaXJsYXBfc2VuZF9zbnJtX2ZyYW1lKHNlbGYsIE5VTEwpOworCQkJaXJsYXBfc3RhcnRfZmluYWxfdGltZXIoc2VsZiwgc2VsZi0+ZmluYWxfdGltZW91dCk7CisJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9SRVNFVCk7CisJCX0gZWxzZSB7CisJCQlpcmxhcF9zdGFydF9maW5hbF90aW1lcihzZWxmLCBzZWxmLT5maW5hbF90aW1lb3V0KTsKKwkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX1JFU0VUKTsKKwkJfQorCQlicmVhazsKKwljYXNlIERJU0NPTk5FQ1RfUkVRVUVTVDoKKwkJaXJsYXBfd2FpdF9taW5fdHVybl9hcm91bmQoIHNlbGYsICZzZWxmLT5xb3NfdHgpOworCQlpcmxhcF9zZW5kX2Rpc2NfZnJhbWUoIHNlbGYpOworCQlpcmxhcF9mbHVzaF9hbGxfcXVldWVzKCBzZWxmKTsKKwkJaXJsYXBfc3RhcnRfZmluYWxfdGltZXIoIHNlbGYsIHNlbGYtPmZpbmFsX3RpbWVvdXQpOworCQlzZWxmLT5yZXRyeV9jb3VudCA9IDA7CisJCWlybGFwX25leHRfc3RhdGUoIHNlbGYsIExBUF9QQ0xPU0UpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGV2ZW50ICVzXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgICBpcmxhcF9ldmVudFtldmVudF0pOworCisJCXJldCA9IC0xOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3N0YXRlX3Jlc2V0IChzZWxmLCBldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIFdlIGhhdmUgc2VudCBhIFNOUk0gcmVzZXQgY29tbWFuZCB0byB0aGUgcGVlciBsYXllciwgYW5kIGlzIGF3YWl0aW5nCisgKiAgICByZXBseS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJsYXBfc3RhdGVfcmVzZXQoc3RydWN0IGlybGFwX2NiICpzZWxmLCBJUkxBUF9FVkVOVCBldmVudCwKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlybGFwX2luZm8gKmluZm8pCit7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpLCBldmVudCA9ICVzXG4iLCBfX0ZVTkNUSU9OX18sIGlybGFwX2V2ZW50W2V2ZW50XSk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBSRUNWX0RJU0NfQ01EOgorCQlkZWxfdGltZXIoJnNlbGYtPmZpbmFsX3RpbWVyKTsKKworCQlpcmxhcF9hcHBseV9kZWZhdWx0X2Nvbm5lY3Rpb25fcGFyYW1ldGVycyhzZWxmKTsKKworCQkvKiBBbHdheXMgc3dpdGNoIHN0YXRlIGJlZm9yZSBjYWxsaW5nIHVwcGVyIGxheWVycyAqLworCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9ORE0pOworCisJCWlybGFwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzZWxmLCBMQVBfTk9fUkVTUE9OU0UpOworCisJCWJyZWFrOworCWNhc2UgUkVDVl9VQV9SU1A6CisJCWRlbF90aW1lcigmc2VsZi0+ZmluYWxfdGltZXIpOworCisJCS8qIEluaXRpYXRlIGNvbm5lY3Rpb24gc3RhdGUgKi8KKwkJaXJsYXBfaW5pdGlhdGVfY29ubmVjdGlvbl9zdGF0ZShzZWxmKTsKKworCQlpcmxhcF9yZXNldF9jb25maXJtKCk7CisKKwkJc2VsZi0+cmVtb3RlX2J1c3kgPSBGQUxTRTsKKworCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9YTUlUX1ApOworCisJCWlybGFwX3N0YXJ0X3BvbGxfdGltZXIoc2VsZiwgc2VsZi0+cG9sbF90aW1lb3V0KTsKKworCQlicmVhazsKKwljYXNlIEZJTkFMX1RJTUVSX0VYUElSRUQ6CisJCWlmIChzZWxmLT5yZXRyeV9jb3VudCA8IDMpIHsKKwkJCWlybGFwX3dhaXRfbWluX3R1cm5fYXJvdW5kKHNlbGYsICZzZWxmLT5xb3NfdHgpOworCisJCQlJUkRBX0FTU0VSVChzZWxmLT5uZXRkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJCQlpcmxhcF9zZW5kX3Nucm1fZnJhbWUoc2VsZiwgc2VsZi0+cW9zX2Rldik7CisKKwkJCXNlbGYtPnJldHJ5X2NvdW50Kys7IC8qIEV4cGVyaW1lbnRhbCEhICovCisKKwkJCWlybGFwX3N0YXJ0X2ZpbmFsX3RpbWVyKHNlbGYsIHNlbGYtPmZpbmFsX3RpbWVvdXQpOworCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfUkVTRVQpOworCQl9IGVsc2UgaWYgKHNlbGYtPnJldHJ5X2NvdW50ID49IHNlbGYtPk4zKSB7CisJCQlpcmxhcF9hcHBseV9kZWZhdWx0X2Nvbm5lY3Rpb25fcGFyYW1ldGVycyhzZWxmKTsKKworCQkJLyogQWx3YXlzIHN3aXRjaCBzdGF0ZSBiZWZvcmUgY2FsbGluZyB1cHBlciBsYXllcnMgKi8KKwkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05ETSk7CisKKwkJCWlybGFwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzZWxmLCBMQVBfTk9fUkVTUE9OU0UpOworCQl9CisJCWJyZWFrOworCWNhc2UgUkVDVl9TTlJNX0NNRDoKKwkJLyoKKwkJICogU05STSBmcmFtZSBpcyBub3QgYWxsb3dlZCB0byBjb250YWluIGFuIEktZmllbGQgaW4gdGhpcworCQkgKiBzdGF0ZQorCQkgKi8KKwkJaWYgKCFpbmZvKSB7CisJCQlJUkRBX0RFQlVHKDMsICIlcygpLCBSRUNWX1NOUk1fQ01EXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJaXJsYXBfaW5pdGlhdGVfY29ubmVjdGlvbl9zdGF0ZShzZWxmKTsKKwkJCWlybGFwX3dhaXRfbWluX3R1cm5fYXJvdW5kKHNlbGYsICZzZWxmLT5xb3NfdHgpOworCQkJaXJsYXBfc2VuZF91YV9yZXNwb25zZV9mcmFtZShzZWxmLCAmc2VsZi0+cW9zX3J4KTsKKwkJCWlybGFwX3Jlc2V0X2NvbmZpcm0oKTsKKwkJCWlybGFwX3N0YXJ0X3dkX3RpbWVyKHNlbGYsIHNlbGYtPndkX3RpbWVvdXQpOworCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfTkRNKTsKKwkJfSBlbHNlIHsKKwkJCUlSREFfREVCVUcoMCwKKwkJCQkgICAiJXMoKSwgU05STSBmcmFtZSBjb250YWluZWQgYW4gSSBmaWVsZCFcbiIsCisJCQkJICAgX19GVU5DVElPTl9fKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDEsICIlcygpLCBVbmtub3duIGV2ZW50ICVzXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBpcmxhcF9ldmVudFtldmVudF0pOworCisJCXJldCA9IC0xOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3N0YXRlX3htaXRfcyAoZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgIFhNSVRfUywgVGhlIHNlY29uZGFyeSBzdGF0aW9uIGhhcyBiZWVuIGdpdmVuIHRoZSByaWdodCB0byB0cmFuc21pdCwKKyAqICAgYW5kIHdlIHRoZXJlZm9yIGRvIG5vdCBleHBlY3QgdG8gcmVjZWl2ZSBhbnkgdHJhbnNtaXNzaW9ucyBmcm9tIG90aGVyCisgKiAgIHN0YXRpb25zLgorICovCitzdGF0aWMgaW50IGlybGFwX3N0YXRlX3htaXRfcyhzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlybGFwX2luZm8gKmluZm8pCit7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpLCBldmVudD0lc1xuIiwgX19GVU5DVElPTl9fLCBpcmxhcF9ldmVudFtldmVudF0pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLUVOT0RFVjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuIC1FQkFEUjspOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU0VORF9JX0NNRDoKKwkJLyoKKwkJICogIFNlbmQgZnJhbWUgb25seSBpZiBzZW5kIHdpbmRvdyA+IDAKKwkJICovCisJCWlmICgoc2VsZi0+d2luZG93ID4gMCkgJiYgKCFzZWxmLT5yZW1vdGVfYnVzeSkpIHsKKwkJCWludCBuZXh0Zml0OworI2lmZGVmIENPTkZJR19JUkRBX0RZTkFNSUNfV0lORE9XCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiX25leHQ7CisKKwkJCS8qCisJCQkgKiBTYW1lIGRlYWwgYXMgaW4gaXJsYXBfc3RhdGVfeG1pdF9wKCksIHNvIHNlZQorCQkJICogdGhlIGNvbW1lbnRzIGF0IHRoYXQgcG9pbnQuCisJCQkgKiBXZSBhcmUgdGhlIHNlY29uZGFyeSwgc28gdGhlcmUgYXJlIG9ubHkgc3VidGxlCisJCQkgKiBkaWZmZXJlbmNlcy4gLSBKZWFuIElJCisJCQkgKi8KKworCQkJLyogQ2hlY2sgaWYgYSBzdWJzZXF1ZW50IHNrYiBleGlzdCBhbmQgd291bGQgZml0IGluCisJCQkgKiB0aGUgY3VycmVudCB3aW5kb3cgKHdpdGggcmVzcGVjdCB0byB0dXJuYXJvdW5kCisJCQkgKiB0aW1lKS4gLSBKZWFuIElJICovCisJCQlza2JfbmV4dCA9IHNrYl9wZWVrKCZzZWxmLT50eHEpOworCQkJbmV4dGZpdCA9ICgoc2tiX25leHQgIT0gTlVMTCkgJiYKKwkJCQkgICAoKHNrYl9uZXh0LT5sZW4gKyBza2ItPmxlbikgPD0KKwkJCQkgICAgc2VsZi0+Ynl0ZXNfbGVmdCkpOworCisJCQkvKgorCQkJICogIFRlc3QgaWYgd2UgaGF2ZSB0cmFuc21pdHRlZCBtb3JlIGJ5dGVzIG92ZXIgdGhlCisJCQkgKiAgbGluayB0aGFuIGl0cyBwb3NzaWJsZSB0byBkbyB3aXRoIHRoZSBjdXJyZW50CisJCQkgKiAgc3BlZWQgYW5kIHR1cm4tYXJvdW5kLXRpbWUuCisJCQkgKi8KKwkJCWlmKCghbmV4dGZpdCkgJiYgKHNrYi0+bGVuID4gc2VsZi0+Ynl0ZXNfbGVmdCkpIHsKKwkJCQlJUkRBX0RFQlVHKDAsICIlcygpLCBOb3QgYWxsb3dlZCB0byB0cmFuc21pdCIKKwkJCQkJICAgIiBtb3JlIGJ5dGVzIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQkvKiBSZXF1ZXVlIHRoZSBza2IgKi8KKwkJCQlza2JfcXVldWVfaGVhZCgmc2VsZi0+dHhxLCBza2JfZ2V0KHNrYikpOworCisJCQkJLyoKKwkJCQkgKiAgU3dpdGNoIHRvIE5STV9TLCB0aGlzIGlzIG9ubHkgcG9zc2libGUKKwkJCQkgKiAgd2hlbiB3ZSBhcmUgaW4gc2Vjb25kYXJ5IG1vZGUsIHNpbmNlIHdlCisJCQkJICogIG11c3QgYmUgc3VyZSB0aGF0IHdlIGRvbid0IG1pc3MgYW55IFJSCisJCQkJICogIGZyYW1lcworCQkJCSAqLworCQkJCXNlbGYtPndpbmRvdyA9IHNlbGYtPndpbmRvd19zaXplOworCQkJCXNlbGYtPmJ5dGVzX2xlZnQgPSBzZWxmLT5saW5lX2NhcGFjaXR5OworCQkJCWlybGFwX3N0YXJ0X3dkX3RpbWVyKHNlbGYsIHNlbGYtPndkX3RpbWVvdXQpOworCisJCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfTlJNX1MpOworCQkJCS8qIFNsaWdodCBkaWZmZXJlbmNlIHdpdGggcHJpbWFyeSA6CisJCQkJICogaGVyZSB3ZSB3b3VsZCB3YWl0IGZvciB0aGUgb3RoZXIgc2lkZSB0bworCQkJCSAqIGV4cGlyZSB0aGUgdHVybmFyb3VuZC4gLSBKZWFuIElJICovCisKKwkJCQlyZXR1cm4gLUVQUk9UTzsgLyogVHJ5IGFnYWluIGxhdGVyICovCisJCQl9CisJCQkvKiBTdWJzdHJhY3Qgc3BhY2UgdXNlZCBieSB0aGlzIHNrYiAqLworCQkJc2VsZi0+Ynl0ZXNfbGVmdCAtPSBza2ItPmxlbjsKKyNlbHNlCS8qIENPTkZJR19JUkRBX0RZTkFNSUNfV0lORE9XICovCisJCQkvKiBXaW5kb3cgaGFzIGJlZW4gYWRqdXN0ZWQgZm9yIHRoZSBtYXggcGFja2V0CisJCQkgKiBzaXplLCBzbyBtdWNoIHNpbXBsZXIuLi4gLSBKZWFuIElJICovCisJCQluZXh0Zml0ID0gKHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4cSkgPiAwKTsKKyNlbmRpZiAvKiBDT05GSUdfSVJEQV9EWU5BTUlDX1dJTkRPVyAqLworCQkJLyoKKwkJCSAqICBTZW5kIGRhdGEgd2l0aCBmaW5hbCBiaXQgY2xlYXJlZCBvbmx5IGlmIHdpbmRvdyA+IDEKKwkJCSAqICBhbmQgdGhlcmUgaXMgbW9yZSBmcmFtZXMgdG8gYmUgc2VudAorCQkJICovCisJCQlpZiAoKHNlbGYtPndpbmRvdyA+IDEpICYmIChuZXh0Zml0KSkgeworCQkJCWlybGFwX3NlbmRfZGF0YV9zZWNvbmRhcnkoc2VsZiwgc2tiKTsKKwkJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9YTUlUX1MpOworCQkJfSBlbHNlIHsKKwkJCQlpcmxhcF9zZW5kX2RhdGFfc2Vjb25kYXJ5X2ZpbmFsKHNlbGYsIHNrYik7CisJCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfTlJNX1MpOworCisJCQkJLyoKKwkJCQkgKiBNYWtlIHN1cmUgc3RhdGUgbWFjaGluZSBkb2VzIG5vdCB0cnkgdG8gc2VuZAorCQkJCSAqIGFueSBtb3JlIGZyYW1lcworCQkJCSAqLworCQkJCXJldCA9IC1FUFJPVE87CisJCQl9CisJCX0gZWxzZSB7CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmFibGUgdG8gc2VuZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlza2JfcXVldWVfaGVhZCgmc2VsZi0+dHhxLCBza2JfZ2V0KHNrYikpOworCQkJcmV0ID0gLUVQUk9UTzsKKwkJfQorCQlicmVhazsKKwljYXNlIERJU0NPTk5FQ1RfUkVRVUVTVDoKKwkJaXJsYXBfc2VuZF9yZF9mcmFtZShzZWxmKTsKKwkJaXJsYXBfZmx1c2hfYWxsX3F1ZXVlcyhzZWxmKTsKKwkJaXJsYXBfc3RhcnRfd2RfdGltZXIoc2VsZiwgc2VsZi0+d2RfdGltZW91dCk7CisJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX1NDTE9TRSk7CisJCWJyZWFrOworCWNhc2UgREFUQV9SRVFVRVNUOgorCQkvKiBOb3RoaW5nIHRvIGRvLCBpcmxhcF9kb19ldmVudCgpIHdpbGwgc2VuZCB0aGUgcGFja2V0CisJCSAqIHdoZW4gd2UgcmV0dXJuLi4uIC0gSmVhbiBJSSAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIGV2ZW50ICVzXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgICBpcmxhcF9ldmVudFtldmVudF0pOworCisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfc3RhdGVfbnJtX3MgKGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgTlJNX1MgKE5vcm1hbCBSZXNwb25zZSBNb2RlIGFzIFNlY29uZGFyeSkgc3RhdGUsIGluIHRoaXMgc3RhdGUgd2UgYXJlCisgKiAgICBleHBlY3RpbmcgdG8gcmVjZWl2ZSBmcmFtZXMgZnJvbSB0aGUgcHJpbWFyeSBzdGF0aW9uCisgKgorICovCitzdGF0aWMgaW50IGlybGFwX3N0YXRlX25ybV9zKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgSVJMQVBfRVZFTlQgZXZlbnQsCisJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKQoreworCWludCBuc19zdGF0dXM7CisJaW50IG5yX3N0YXR1czsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoNCwgIiVzKCksIGV2ZW50PSVzXG4iLCBfX0ZVTkNUSU9OX18sIGlybGFwX2V2ZW50WyBldmVudF0pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybiAtMTspOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgUkVDVl9JX0NNRDogLyogT3B0aW1pemUgZm9yIHRoZSBjb21tb24gY2FzZSAqLworCQkvKiBGSVhNRTogbXVzdCBjaGVjayBmb3IgcmVtb3RlX2J1c3kgYmVsb3cgKi8KKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgZXZlbnQ9JXMgbnI9JWQsIHZzPSVkLCBucz0lZCwgIgorCQkJICAgInZyPSVkLCBwZj0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkJICAgaXJsYXBfZXZlbnRbZXZlbnRdLCBpbmZvLT5uciwKKwkJCSAgIHNlbGYtPnZzLCBpbmZvLT5ucywgc2VsZi0+dnIsIGluZm8tPnBmKTsKKworCQlzZWxmLT5yZXRyeV9jb3VudCA9IDA7CisKKwkJbnNfc3RhdHVzID0gaXJsYXBfdmFsaWRhdGVfbnNfcmVjZWl2ZWQoc2VsZiwgaW5mby0+bnMpOworCQlucl9zdGF0dXMgPSBpcmxhcF92YWxpZGF0ZV9ucl9yZWNlaXZlZChzZWxmLCBpbmZvLT5ucik7CisJCS8qCisJCSAqICBDaGVjayBmb3IgZXhwZWN0ZWQgSShuZm9ybWF0aW9uKSBmcmFtZQorCQkgKi8KKwkJaWYgKChuc19zdGF0dXMgPT0gTlNfRVhQRUNURUQpICYmIChucl9zdGF0dXMgPT0gTlJfRVhQRUNURUQpKSB7CisKKwkJCS8qIFVwZGF0ZSBWciAobmV4dCBmcmFtZSBmb3IgdXMgdG8gcmVjZWl2ZSkgKi8KKwkJCXNlbGYtPnZyID0gKHNlbGYtPnZyICsgMSkgJSA4OworCisJCQkvKiBVcGRhdGUgTnIgcmVjZWl2ZWQgKi8KKwkJCWlybGFwX3VwZGF0ZV9ucl9yZWNlaXZlZChzZWxmLCBpbmZvLT5ucik7CisKKwkJCS8qCisJCQkgKiAgcG9sbCBiaXQgY2xlYXJlZD8KKwkJCSAqLworCQkJaWYgKCFpbmZvLT5wZikgeworCisJCQkJc2VsZi0+YWNrX3JlcXVpcmVkID0gVFJVRTsKKworCQkJCS8qCisJCQkJICogIFN0YXJ0aW5nIFdELXRpbWVyIGhlcmUgaXMgb3B0aW9uYWwsIGJ1dAorCQkJCSAqICBub3QgcmVjb21tZW5kZWQuIE5vdGUgNiBJckxBUCBwLiA4MworCQkJCSAqLworI2lmIDAKKwkJCQlpcmRhX3N0YXJ0X3RpbWVyKFdEX1RJTUVSLCBzZWxmLT53ZF90aW1lb3V0KTsKKyNlbmRpZgorCQkJCS8qIEtlZXAgc3RhdGUsIGRvIG5vdCBtb3ZlIHRoaXMgbGluZSAqLworCQkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05STV9TKTsKKworCQkJCWlybGFwX2RhdGFfaW5kaWNhdGlvbihzZWxmLCBza2IsIEZBTFNFKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiAgV2Ugc2hvdWxkIHdhaXQgYmVmb3JlIHNlbmRpbmcgUlIsIGFuZAorCQkJCSAqICBhbHNvIGJlZm9yZSBjaGFuZ2luZyB0byBYTUlUX1MKKwkJCQkgKiAgc3RhdGUuIChub3RlIDEsIElyTEFQIHAuIDgyKQorCQkJCSAqLworCQkJCWlybGFwX3dhaXRfbWluX3R1cm5fYXJvdW5kKHNlbGYsICZzZWxmLT5xb3NfdHgpOworCisJCQkJLyoKKwkJCQkgKiBHaXZlIGhpZ2hlciBsYXllcnMgYSBjaGFuY2UgdG8KKwkJCQkgKiBpbW1lZGlhdGVseSByZXBseSB3aXRoIHNvbWUgZGF0YSBiZWZvcmUKKwkJCQkgKiB3ZSBkZWNpZGUgaWYgd2Ugc2hvdWxkIHNlbmQgYSBSUiBmcmFtZQorCQkJCSAqIG9yIG5vdAorCQkJCSAqLworCQkJCWlybGFwX2RhdGFfaW5kaWNhdGlvbihzZWxmLCBza2IsIEZBTFNFKTsKKworCQkJCS8qIEFueSBwZW5kaW5nIGRhdGEgcmVxdWVzdHM/ICAqLworCQkJCWlmICgoc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhxKSA+IDApICYmCisJCQkJICAgIChzZWxmLT53aW5kb3cgPiAwKSkKKwkJCQl7CisJCQkJCXNlbGYtPmFja19yZXF1aXJlZCA9IFRSVUU7CisKKwkJCQkJZGVsX3RpbWVyKCZzZWxmLT53ZF90aW1lcik7CisKKwkJCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfWE1JVF9TKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpcmxhcF9zZW5kX3JyX2ZyYW1lKHNlbGYsIFJTUF9GUkFNRSk7CisJCQkJCWlybGFwX3N0YXJ0X3dkX3RpbWVyKHNlbGYsCisJCQkJCQkJICAgICBzZWxmLT53ZF90aW1lb3V0KTsKKworCQkJCQkvKiBLZWVwIHRoZSBzdGF0ZSAqLworCQkJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9OUk1fUyk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8qCisJCSAqICBDaGVjayBmb3IgVW5leHBlY3RlZCBuZXh0IHRvIHNlbmQgKE5zKQorCQkgKi8KKwkJaWYgKChuc19zdGF0dXMgPT0gTlNfVU5FWFBFQ1RFRCkgJiYgKG5yX3N0YXR1cyA9PSBOUl9FWFBFQ1RFRCkpCisJCXsKKwkJCS8qIFVuZXhwZWN0ZWQgbmV4dCB0byBzZW5kLCB3aXRoIGZpbmFsIGJpdCBjbGVhcmVkICovCisJCQlpZiAoIWluZm8tPnBmKSB7CisJCQkJaXJsYXBfdXBkYXRlX25yX3JlY2VpdmVkKHNlbGYsIGluZm8tPm5yKTsKKworCQkJCWlybGFwX3N0YXJ0X3dkX3RpbWVyKHNlbGYsIHNlbGYtPndkX3RpbWVvdXQpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBVcGRhdGUgTnIgcmVjZWl2ZWQgKi8KKwkJCQlpcmxhcF91cGRhdGVfbnJfcmVjZWl2ZWQoc2VsZiwgaW5mby0+bnIpOworCisJCQkJaXJsYXBfd2FpdF9taW5fdHVybl9hcm91bmQoc2VsZiwgJnNlbGYtPnFvc190eCk7CisJCQkJaXJsYXBfc2VuZF9ycl9mcmFtZShzZWxmLCBSU1BfRlJBTUUpOworCisJCQkJaXJsYXBfc3RhcnRfd2RfdGltZXIoc2VsZiwgc2VsZi0+d2RfdGltZW91dCk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqICBVbmV4cGVjdGVkIE5leHQgdG8gUmVjZWl2ZShOUikgPworCQkgKi8KKwkJaWYgKChuc19zdGF0dXMgPT0gTlNfRVhQRUNURUQpICYmIChucl9zdGF0dXMgPT0gTlJfVU5FWFBFQ1RFRCkpCisJCXsKKwkJCWlmIChpbmZvLT5wZikgeworCQkJCUlSREFfREVCVUcoNCwgIlJFQ1ZfSV9SU1A6IGZyYW1lKHMpIGxvc3RcbiIpOworCisJCQkJc2VsZi0+dnIgPSAoc2VsZi0+dnIgKyAxKSAlIDg7CisKKwkJCQkvKiBVcGRhdGUgTnIgcmVjZWl2ZWQgKi8KKwkJCQlpcmxhcF91cGRhdGVfbnJfcmVjZWl2ZWQoc2VsZiwgaW5mby0+bnIpOworCisJCQkJLyogUmVzZW5kIHJlamVjdGVkIGZyYW1lcyAqLworCQkJCWlybGFwX3Jlc2VuZF9yZWplY3RlZF9mcmFtZXMoc2VsZiwgUlNQX0ZSQU1FKTsKKworCQkJCS8qIEtlZXAgc3RhdGUsIGRvIG5vdCBtb3ZlIHRoaXMgbGluZSAqLworCQkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05STV9TKTsKKworCQkJCWlybGFwX2RhdGFfaW5kaWNhdGlvbihzZWxmLCBza2IsIEZBTFNFKTsKKwkJCQlpcmxhcF9zdGFydF93ZF90aW1lcihzZWxmLCBzZWxmLT53ZF90aW1lb3V0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qCisJCQkgKiAgVGhpcyBpcyBub3QgZG9jdW1lbnRlZCBpbiBJckxBUCEhIFVuZXhwZWN0ZWQgTlIKKwkJCSAqICB3aXRoIHBvbGwgYml0IGNsZWFyZWQKKwkJCSAqLworCQkJaWYgKCFpbmZvLT5wZikgeworCQkJCXNlbGYtPnZyID0gKHNlbGYtPnZyICsgMSkgJSA4OworCisJCQkJLyogVXBkYXRlIE5yIHJlY2VpdmVkICovCisJCQkJaXJsYXBfdXBkYXRlX25yX3JlY2VpdmVkKHNlbGYsIGluZm8tPm5yKTsKKworCQkJCS8qIEtlZXAgc3RhdGUsIGRvIG5vdCBtb3ZlIHRoaXMgbGluZSAqLworCQkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05STV9TKTsKKworCQkJCWlybGFwX2RhdGFfaW5kaWNhdGlvbihzZWxmLCBza2IsIEZBTFNFKTsKKwkJCQlpcmxhcF9zdGFydF93ZF90aW1lcihzZWxmLCBzZWxmLT53ZF90aW1lb3V0KTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHJldCA9PSBOUl9JTlZBTElEKSB7CisJCQlJUkRBX0RFQlVHKDAsICJOUk1fUywgTlJfSU5WQUxJRCBub3QgaW1wbGVtZW50ZWQhXG4iKTsKKwkJfQorCQlpZiAocmV0ID09IE5TX0lOVkFMSUQpIHsKKwkJCUlSREFfREVCVUcoMCwgIk5STV9TLCBOU19JTlZBTElEIG5vdCBpbXBsZW1lbnRlZCFcbiIpOworCQl9CisJCWJyZWFrOworCWNhc2UgUkVDVl9VSV9GUkFNRToKKwkJLyoKKwkJICogIHBvbGwgYml0IGNsZWFyZWQ/CisJCSAqLworCQlpZiAoIWluZm8tPnBmKSB7CisJCQlpcmxhcF9kYXRhX2luZGljYXRpb24oc2VsZiwgc2tiLCBUUlVFKTsKKwkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05STV9TKTsgLyogS2VlcCBzdGF0ZSAqLworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqICBBbnkgcGVuZGluZyBkYXRhIHJlcXVlc3RzPworCQkJICovCisJCQlpZiAoKHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4cSkgPiAwKSAmJgorCQkJICAgIChzZWxmLT53aW5kb3cgPiAwKSAmJiAhc2VsZi0+cmVtb3RlX2J1c3kpCisJCQl7CisJCQkJaXJsYXBfZGF0YV9pbmRpY2F0aW9uKHNlbGYsIHNrYiwgVFJVRSk7CisKKwkJCQlkZWxfdGltZXIoJnNlbGYtPndkX3RpbWVyKTsKKworCQkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX1hNSVRfUyk7CisJCQl9IGVsc2UgeworCQkJCWlybGFwX2RhdGFfaW5kaWNhdGlvbihzZWxmLCBza2IsIFRSVUUpOworCisJCQkJaXJsYXBfd2FpdF9taW5fdHVybl9hcm91bmQoc2VsZiwgJnNlbGYtPnFvc190eCk7CisKKwkJCQlpcmxhcF9zZW5kX3JyX2ZyYW1lKHNlbGYsIFJTUF9GUkFNRSk7CisJCQkJc2VsZi0+YWNrX3JlcXVpcmVkID0gRkFMU0U7CisKKwkJCQlpcmxhcF9zdGFydF93ZF90aW1lcihzZWxmLCBzZWxmLT53ZF90aW1lb3V0KTsKKworCQkJCS8qIEtlZXAgdGhlIHN0YXRlICovCisJCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfTlJNX1MpOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgUkVDVl9SUl9DTUQ6CisJCXNlbGYtPnJldHJ5X2NvdW50ID0gMDsKKworCQkvKgorCQkgKiAgTnIgYXMgZXhwZWN0ZWQ/CisJCSAqLworCQlucl9zdGF0dXMgPSBpcmxhcF92YWxpZGF0ZV9ucl9yZWNlaXZlZChzZWxmLCBpbmZvLT5ucik7CisJCWlmIChucl9zdGF0dXMgPT0gTlJfRVhQRUNURUQpIHsKKwkJCWlmICgoc2tiX3F1ZXVlX2xlbiggJnNlbGYtPnR4cSkgPiAwKSAmJgorCQkJICAgIChzZWxmLT53aW5kb3cgPiAwKSkgeworCQkJCXNlbGYtPnJlbW90ZV9idXN5ID0gRkFMU0U7CisKKwkJCQkvKiBVcGRhdGUgTnIgcmVjZWl2ZWQgKi8KKwkJCQlpcmxhcF91cGRhdGVfbnJfcmVjZWl2ZWQoc2VsZiwgaW5mby0+bnIpOworCQkJCWRlbF90aW1lcigmc2VsZi0+d2RfdGltZXIpOworCisJCQkJaXJsYXBfd2FpdF9taW5fdHVybl9hcm91bmQoc2VsZiwgJnNlbGYtPnFvc190eCk7CisJCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfWE1JVF9TKTsKKwkJCX0gZWxzZSB7CisJCQkJc2VsZi0+cmVtb3RlX2J1c3kgPSBGQUxTRTsKKwkJCQkvKiBVcGRhdGUgTnIgcmVjZWl2ZWQgKi8KKwkJCQlpcmxhcF91cGRhdGVfbnJfcmVjZWl2ZWQoc2VsZiwgaW5mby0+bnIpOworCQkJCWlybGFwX3dhaXRfbWluX3R1cm5fYXJvdW5kKHNlbGYsICZzZWxmLT5xb3NfdHgpOworCQkJCWlybGFwX3N0YXJ0X3dkX3RpbWVyKHNlbGYsIHNlbGYtPndkX3RpbWVvdXQpOworCisJCQkJLyogTm90ZSA6IGlmIHRoZSBsaW5rIGlzIGlkbGUgKHRoaXMgY2FzZSksCisJCQkJICogd2UgbmV2ZXIgZ28gaW4gWE1JVF9TLCBzbyB3ZSBuZXZlciBnZXQgYQorCQkJCSAqIGNoYW5jZSB0byBwcm9jZXNzIGFueSBESVNDT05ORUNUX1JFUVVFU1QuCisJCQkJICogRG8gaXQgbm93ICEgLSBKZWFuIElJICovCisJCQkJaWYgKHNlbGYtPmRpc2Nvbm5lY3RfcGVuZGluZykgeworCQkJCQkvKiBEaXNjb25uZWN0ICovCisJCQkJCWlybGFwX3NlbmRfcmRfZnJhbWUoc2VsZik7CisJCQkJCWlybGFwX2ZsdXNoX2FsbF9xdWV1ZXMoc2VsZik7CisKKwkJCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfU0NMT1NFKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBKdXN0IHNlbmQgYmFjayBwZiBiaXQgKi8KKwkJCQkJaXJsYXBfc2VuZF9ycl9mcmFtZShzZWxmLCBSU1BfRlJBTUUpOworCisJCQkJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05STV9TKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAobnJfc3RhdHVzID09IE5SX1VORVhQRUNURUQpIHsKKwkJCXNlbGYtPnJlbW90ZV9idXN5ID0gRkFMU0U7CisJCQlpcmxhcF91cGRhdGVfbnJfcmVjZWl2ZWQoc2VsZiwgaW5mby0+bnIpOworCQkJaXJsYXBfcmVzZW5kX3JlamVjdGVkX2ZyYW1lcyhzZWxmLCBSU1BfRlJBTUUpOworCisJCQlpcmxhcF9zdGFydF93ZF90aW1lcihzZWxmLCBzZWxmLT53ZF90aW1lb3V0KTsKKworCQkJLyogS2VlcCBzdGF0ZSAqLworCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfTlJNX1MpOworCQl9IGVsc2UgeworCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgaW52YWxpZCBuciBub3QgaW1wbGVtZW50ZWQhXG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBSRUNWX1NOUk1fQ01EOgorCQkvKiBTTlJNIGZyYW1lIGlzIG5vdCBhbGxvd2VkIHRvIGNvbnRhaW4gYW4gSS1maWVsZCAqLworCQlpZiAoIWluZm8pIHsKKwkJCWRlbF90aW1lcigmc2VsZi0+d2RfdGltZXIpOworCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgcmVjZWl2ZWQgU05STSBjbWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9SRVNFVF9DSEVDSyk7CisKKwkJCWlybGFwX3Jlc2V0X2luZGljYXRpb24oc2VsZik7CisJCX0gZWxzZSB7CisJCQlJUkRBX0RFQlVHKDAsCisJCQkJICAgIiVzKCksIFNOUk0gZnJhbWUgY29udGFpbmVkIGFuIEktZmllbGQhXG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXyk7CisKKwkJfQorCQlicmVhazsKKwljYXNlIFJFQ1ZfUkVKX0NNRDoKKwkJaXJsYXBfdXBkYXRlX25yX3JlY2VpdmVkKHNlbGYsIGluZm8tPm5yKTsKKwkJaWYgKHNlbGYtPnJlbW90ZV9idXN5KSB7CisJCQlpcmxhcF93YWl0X21pbl90dXJuX2Fyb3VuZChzZWxmLCAmc2VsZi0+cW9zX3R4KTsKKwkJCWlybGFwX3NlbmRfcnJfZnJhbWUoc2VsZiwgUlNQX0ZSQU1FKTsKKwkJfSBlbHNlCisJCQlpcmxhcF9yZXNlbmRfcmVqZWN0ZWRfZnJhbWVzKHNlbGYsIFJTUF9GUkFNRSk7CisJCWlybGFwX3N0YXJ0X3dkX3RpbWVyKHNlbGYsIHNlbGYtPndkX3RpbWVvdXQpOworCQlicmVhazsKKwljYXNlIFJFQ1ZfU1JFSl9DTUQ6CisJCWlybGFwX3VwZGF0ZV9ucl9yZWNlaXZlZChzZWxmLCBpbmZvLT5ucik7CisJCWlmIChzZWxmLT5yZW1vdGVfYnVzeSkgeworCQkJaXJsYXBfd2FpdF9taW5fdHVybl9hcm91bmQoc2VsZiwgJnNlbGYtPnFvc190eCk7CisJCQlpcmxhcF9zZW5kX3JyX2ZyYW1lKHNlbGYsIFJTUF9GUkFNRSk7CisJCX0gZWxzZQorCQkJaXJsYXBfcmVzZW5kX3JlamVjdGVkX2ZyYW1lKHNlbGYsIFJTUF9GUkFNRSk7CisJCWlybGFwX3N0YXJ0X3dkX3RpbWVyKHNlbGYsIHNlbGYtPndkX3RpbWVvdXQpOworCQlicmVhazsKKwljYXNlIFdEX1RJTUVSX0VYUElSRUQ6CisJCS8qCisJCSAqICBXYWl0IHVudGlsIHJldHJ5X2NvdW50ICogbiBtYXRjaGVzIG5lZ290aWF0ZWQgdGhyZXNob2xkLworCQkgKiAgZGlzY29ubmVjdCB0aW1lIChub3RlIDIgaW4gSXJMQVAgcC4gODIpCisJCSAqCisJCSAqIFNpbWlsYXIgdG8gaXJsYXBfc3RhdGVfbnJtX3AoKSAtPiBGSU5BTF9USU1FUl9FWFBJUkVECisJCSAqIE5vdGUgOiBzZWxmLT53ZF90aW1lb3V0ID0gKHNlbGYtPmZpbmFsX3RpbWVvdXQgKiAyKSwKKwkJICogICB3aGljaCBleHBsYWluIHdoeSB3ZSB1c2UgKHNlbGYtPk4yIC8gMikgaGVyZSAhISEKKwkJICogSmVhbiBJSQorCQkgKi8KKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgcmV0cnlfY291bnQgPSAlZFxuIiwgX19GVU5DVElPTl9fLAorCQkJICAgc2VsZi0+cmV0cnlfY291bnQpOworCisJCWlmIChzZWxmLT5yZXRyeV9jb3VudCA8IChzZWxmLT5OMiAvIDIpKSB7CisJCQkvKiBObyByZXRyeSwganVzdCB3YWl0IGZvciBwcmltYXJ5ICovCisJCQlpcmxhcF9zdGFydF93ZF90aW1lcihzZWxmLCBzZWxmLT53ZF90aW1lb3V0KTsKKwkJCXNlbGYtPnJldHJ5X2NvdW50Kys7CisKKwkJCWlmKChzZWxmLT5yZXRyeV9jb3VudCAlIChzZWxmLT5OMSAvIDIpKSA9PSAwKQorCQkJCWlybGFwX3N0YXR1c19pbmRpY2F0aW9uKHNlbGYsCisJCQkJCQkJU1RBVFVTX05PX0FDVElWSVRZKTsKKwkJfSBlbHNlIHsKKwkJCWlybGFwX2FwcGx5X2RlZmF1bHRfY29ubmVjdGlvbl9wYXJhbWV0ZXJzKHNlbGYpOworCisJCQkvKiBBbHdheXMgc3dpdGNoIHN0YXRlIGJlZm9yZSBjYWxsaW5nIHVwcGVyIGxheWVycyAqLworCQkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfTkRNKTsKKwkJCWlybGFwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzZWxmLCBMQVBfTk9fUkVTUE9OU0UpOworCQl9CisJCWJyZWFrOworCWNhc2UgUkVDVl9ESVNDX0NNRDoKKwkJLyogQWx3YXlzIHN3aXRjaCBzdGF0ZSBiZWZvcmUgY2FsbGluZyB1cHBlciBsYXllcnMgKi8KKwkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfTkRNKTsKKworCQkvKiBTZW5kIGRpc2Nvbm5lY3QgcmVzcG9uc2UgKi8KKwkJaXJsYXBfd2FpdF9taW5fdHVybl9hcm91bmQoc2VsZiwgJnNlbGYtPnFvc190eCk7CisJCWlybGFwX3NlbmRfdWFfcmVzcG9uc2VfZnJhbWUoc2VsZiwgTlVMTCk7CisKKwkJZGVsX3RpbWVyKCZzZWxmLT53ZF90aW1lcik7CisJCWlybGFwX2ZsdXNoX2FsbF9xdWV1ZXMoc2VsZik7CisJCS8qIFNldCBkZWZhdWx0IGxpbmsgcGFyYW1ldGVycyAqLworCQlpcmxhcF9hcHBseV9kZWZhdWx0X2Nvbm5lY3Rpb25fcGFyYW1ldGVycyhzZWxmKTsKKworCQlpcmxhcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgTEFQX0RJU0NfSU5ESUNBVElPTik7CisJCWJyZWFrOworCWNhc2UgUkVDVl9ESVNDT1ZFUllfWElEX0NNRDoKKwkJaXJsYXBfd2FpdF9taW5fdHVybl9hcm91bmQoc2VsZiwgJnNlbGYtPnFvc190eCk7CisJCWlybGFwX3NlbmRfcnJfZnJhbWUoc2VsZiwgUlNQX0ZSQU1FKTsKKwkJc2VsZi0+YWNrX3JlcXVpcmVkID0gVFJVRTsKKwkJaXJsYXBfc3RhcnRfd2RfdGltZXIoc2VsZiwgc2VsZi0+d2RfdGltZW91dCk7CisJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05STV9TKTsKKworCQlicmVhazsKKwljYXNlIFJFQ1ZfVEVTVF9DTUQ6CisJCS8qIFJlbW92ZSB0ZXN0IGZyYW1lIGhlYWRlciAob25seSBMQVAgaGVhZGVyIGluIE5STSkgKi8KKwkJc2tiX3B1bGwoc2tiLCBMQVBfQUREUl9IRUFERVIgKyBMQVBfQ1RSTF9IRUFERVIpOworCisJCWlybGFwX3dhaXRfbWluX3R1cm5fYXJvdW5kKHNlbGYsICZzZWxmLT5xb3NfdHgpOworCQlpcmxhcF9zdGFydF93ZF90aW1lcihzZWxmLCBzZWxmLT53ZF90aW1lb3V0KTsKKworCQkvKiBTZW5kIHJlc3BvbnNlIChpbmZvIHdpbGwgYmUgY29waWVkKSAqLworCQlpcmxhcF9zZW5kX3Rlc3RfZnJhbWUoc2VsZiwgc2VsZi0+Y2FkZHIsIGluZm8tPmRhZGRyLCBza2IpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDEsICIlcygpLCBVbmtub3duIGV2ZW50ICVkLCAoJXMpXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgICBldmVudCwgaXJsYXBfZXZlbnRbZXZlbnRdKTsKKworCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3N0YXRlX3NjbG9zZSAoc2VsZiwgZXZlbnQsIHNrYiwgaW5mbykKKyAqLworc3RhdGljIGludCBpcmxhcF9zdGF0ZV9zY2xvc2Uoc3RydWN0IGlybGFwX2NiICpzZWxmLCBJUkxBUF9FVkVOVCBldmVudCwKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKQoreworCWludCByZXQgPSAwOworCisJSVJEQV9ERUJVRygxLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC1FTk9ERVY7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybiAtRUJBRFI7KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFJFQ1ZfRElTQ19DTUQ6CisJCS8qIEFsd2F5cyBzd2l0Y2ggc3RhdGUgYmVmb3JlIGNhbGxpbmcgdXBwZXIgbGF5ZXJzICovCisJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05ETSk7CisKKwkJLyogU2VuZCBkaXNjb25uZWN0IHJlc3BvbnNlICovCisJCWlybGFwX3dhaXRfbWluX3R1cm5fYXJvdW5kKHNlbGYsICZzZWxmLT5xb3NfdHgpOworCQlpcmxhcF9zZW5kX3VhX3Jlc3BvbnNlX2ZyYW1lKHNlbGYsIE5VTEwpOworCisJCWRlbF90aW1lcigmc2VsZi0+d2RfdGltZXIpOworCQkvKiBTZXQgZGVmYXVsdCBsaW5rIHBhcmFtZXRlcnMgKi8KKwkJaXJsYXBfYXBwbHlfZGVmYXVsdF9jb25uZWN0aW9uX3BhcmFtZXRlcnMoc2VsZik7CisKKwkJaXJsYXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIExBUF9ESVNDX0lORElDQVRJT04pOworCQlicmVhazsKKwljYXNlIFJFQ1ZfRE1fUlNQOgorCQkvKiBJckxBUC0xLjEgcC44MjogaW4gU0NMT1NFLCBTIGFuZCBJIHR5cGUgUlNQIGZyYW1lcworCQkgKiBzaGFsbCB0YWtlIHVzIGRvd24gaW50byBkZWZhdWx0IE5ETSBzdGF0ZSwgbGlrZSBETV9SU1AKKwkJICovCisJY2FzZSBSRUNWX1JSX1JTUDoKKwljYXNlIFJFQ1ZfUk5SX1JTUDoKKwljYXNlIFJFQ1ZfUkVKX1JTUDoKKwljYXNlIFJFQ1ZfU1JFSl9SU1A6CisJY2FzZSBSRUNWX0lfUlNQOgorCQkvKiBBbHdheXMgc3dpdGNoIHN0YXRlIGJlZm9yZSBjYWxsaW5nIHVwcGVyIGxheWVycyAqLworCQlpcmxhcF9uZXh0X3N0YXRlKHNlbGYsIExBUF9ORE0pOworCisJCWRlbF90aW1lcigmc2VsZi0+d2RfdGltZXIpOworCQlpcmxhcF9hcHBseV9kZWZhdWx0X2Nvbm5lY3Rpb25fcGFyYW1ldGVycyhzZWxmKTsKKworCQlpcmxhcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgTEFQX0RJU0NfSU5ESUNBVElPTik7CisJCWJyZWFrOworCWNhc2UgV0RfVElNRVJfRVhQSVJFRDoKKwkJLyogQWx3YXlzIHN3aXRjaCBzdGF0ZSBiZWZvcmUgY2FsbGluZyB1cHBlciBsYXllcnMgKi8KKwkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfTkRNKTsKKworCQlpcmxhcF9hcHBseV9kZWZhdWx0X2Nvbm5lY3Rpb25fcGFyYW1ldGVycyhzZWxmKTsKKworCQlpcmxhcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgTEFQX0RJU0NfSU5ESUNBVElPTik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIElyTEFQLTEuMSBwLjgyOiBpbiBTQ0xPU0UsIGJhc2ljYWxseSBhbnkgcmVjZWl2ZWQgZnJhbWUKKwkJICogd2l0aCBwZj0xIHNoYWxsIHJlc3RhcnQgdGhlIHdkLXRpbWVyIGFuZCByZXNlbmQgdGhlIHJkOnJzcAorCQkgKi8KKwkJaWYgKGluZm8gIT0gTlVMTCAgJiYgIGluZm8tPnBmKSB7CisJCQlkZWxfdGltZXIoJnNlbGYtPndkX3RpbWVyKTsKKwkJCWlybGFwX3dhaXRfbWluX3R1cm5fYXJvdW5kKHNlbGYsICZzZWxmLT5xb3NfdHgpOworCQkJaXJsYXBfc2VuZF9yZF9mcmFtZShzZWxmKTsKKwkJCWlybGFwX3N0YXJ0X3dkX3RpbWVyKHNlbGYsIHNlbGYtPndkX3RpbWVvdXQpOworCQkJYnJlYWs7CQkvKiBzdGF5IGluIFNDTE9TRSAqLworCQl9CisKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgVW5rbm93biBldmVudCAlZCwgKCVzKVxuIiwgX19GVU5DVElPTl9fLAorCQkJICAgZXZlbnQsIGlybGFwX2V2ZW50W2V2ZW50XSk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGlybGFwX3N0YXRlX3Jlc2V0X2NoZWNrKCBzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIElSTEFQX0VWRU5UIGV2ZW50LAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgc3RydWN0IGlybGFwX2luZm8gKmluZm8pCit7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDEsICIlcygpLCBldmVudD0lc1xuIiwgX19GVU5DVElPTl9fLCBpcmxhcF9ldmVudFtldmVudF0pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLUVOT0RFVjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuIC1FQkFEUjspOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgUkVTRVRfUkVTUE9OU0U6CisJCWlybGFwX3NlbmRfdWFfcmVzcG9uc2VfZnJhbWUoc2VsZiwgJnNlbGYtPnFvc19yeCk7CisJCWlybGFwX2luaXRpYXRlX2Nvbm5lY3Rpb25fc3RhdGUoc2VsZik7CisJCWlybGFwX3N0YXJ0X3dkX3RpbWVyKHNlbGYsIFdEX1RJTUVPVVQpOworCQlpcmxhcF9mbHVzaF9hbGxfcXVldWVzKHNlbGYpOworCisJCWlybGFwX25leHRfc3RhdGUoc2VsZiwgTEFQX05STV9TKTsKKwkJYnJlYWs7CisJY2FzZSBESVNDT05ORUNUX1JFUVVFU1Q6CisJCWlybGFwX3dhaXRfbWluX3R1cm5fYXJvdW5kKHNlbGYsICZzZWxmLT5xb3NfdHgpOworCQlpcmxhcF9zZW5kX3JkX2ZyYW1lKHNlbGYpOworCQlpcmxhcF9zdGFydF93ZF90aW1lcihzZWxmLCBXRF9USU1FT1VUKTsKKwkJaXJsYXBfbmV4dF9zdGF0ZShzZWxmLCBMQVBfU0NMT1NFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgVW5rbm93biBldmVudCAlZCwgKCVzKVxuIiwgX19GVU5DVElPTl9fLAorCQkJICAgZXZlbnQsIGlybGFwX2V2ZW50W2V2ZW50XSk7CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmxhcF9mcmFtZS5jIGIvbmV0L2lyZGEvaXJsYXBfZnJhbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDBhYmU3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJsYXBfZnJhbWUuYwpAQCAtMCwwICsxLDE0MzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGaWxlbmFtZTogICAgICBpcmxhcF9mcmFtZS5jCisgKiBWZXJzaW9uOiAgICAgICAxLjAKKyAqIERlc2NyaXB0aW9uOiAgIEJ1aWxkIGFuZCB0cmFuc21pdCBJckxBUCBmcmFtZXMKKyAqIFN0YXR1czogICAgICAgIFN0YWJsZQorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgVHVlIEF1ZyAxOSAxMDoyNzoyNiAxOTk3CisgKiBNb2RpZmllZCBhdDogICBXZWQgSmFuICA1IDA4OjU5OjA0IDIwMDAKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwKKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pcmRhLmg+CisKKyNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvd3JhcHBlci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL3RpbWVyLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYXBfZnJhbWUuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9xb3MuaD4KKworc3RhdGljIHZvaWQgaXJsYXBfc2VuZF9pX2ZyYW1lKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICBpbnQgY29tbWFuZCk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9pbnNlcnRfaW5mbyAoc2VsZiwgc2tiKQorICoKKyAqICAgIEluc2VydCBtaW5pbXVtIHR1cm5hcm91bmQgdGltZSBhbmQgc3BlZWQgaW5mb3JtYXRpb24gaW50byB0aGUgc2tiLiBXZQorICogICAgbmVlZCB0byBkbyB0aGlzIHNpbmNlIGl0J3MgcGVyIHBhY2tldCByZWxldmFudCBpbmZvcm1hdGlvbi4gU2FmZSB0bworICogICAgaGF2ZSB0aGlzIGZ1bmN0aW9uIGlubGluZWQgc2luY2UgaXQncyBvbmx5IGNhbGxlZCBmcm9tIG9uZSBwbGFjZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXJsYXBfaW5zZXJ0X2luZm8oc3RydWN0IGlybGFwX2NiICpzZWxmLAorCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXJkYV9za2JfY2IgKmNiID0gKHN0cnVjdCBpcmRhX3NrYl9jYiAqKSBza2ItPmNiOworCisJLyoKKwkgKiBJbnNlcnQgTVRUIChtaW4uIHR1cm4gdGltZSkgYW5kIHNwZWVkIGludG8gc2tiLCBzbyB0aGF0IHRoZQorCSAqIGRldmljZSBkcml2ZXIga25vd3Mgd2hpY2ggc2V0dGluZ3MgdG8gdXNlCisJICovCisJY2ItPm1hZ2ljID0gTEFQX01BR0lDOworCWNiLT5tdHQgPSBzZWxmLT5tdHRfcmVxdWlyZWQ7CisJY2ItPm5leHRfc3BlZWQgPSBzZWxmLT5zcGVlZDsKKworCS8qIFJlc2V0ICovCisJc2VsZi0+bXR0X3JlcXVpcmVkID0gMDsKKworCS8qCisJICogRGVsYXkgZXF1YWxzIG5lZ290aWF0ZWQgQk9GcyBjb3VudCwgcGx1cyB0aGUgbnVtYmVyIG9mIEJPRnMgdG8KKwkgKiBmb3JjZSB0aGUgbmVnb3RpYXRlZCBtaW5pbXVtIHR1cm5hcm91bmQgdGltZQorCSAqLworCWNiLT54Ym9mcyA9IHNlbGYtPmJvZnNfY291bnQ7CisJY2ItPm5leHRfeGJvZnMgPSBzZWxmLT5uZXh0X2JvZnM7CisJY2ItPnhib2ZzX2RlbGF5ID0gc2VsZi0+eGJvZnNfZGVsYXk7CisKKwkvKiBSZXNldCBYQk9GJ3MgZGVsYXkgKHVzZWQgb25seSBmb3IgZ2V0dGluZyBtaW4gdHVybiB0aW1lKSAqLworCXNlbGYtPnhib2ZzX2RlbGF5ID0gMDsKKwkvKiBQdXQgdGhlIGNvcnJlY3QgeGJvZnMgdmFsdWUgZm9yIHRoZSBuZXh0IHBhY2tldCAqLworCXNlbGYtPmJvZnNfY291bnQgPSBzZWxmLT5uZXh0X2JvZnM7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9xdWV1ZV94bWl0IChzZWxmLCBza2IpCisgKgorICogICAgQSBsaXR0bGUgd3JhcHBlciBmb3IgZGV2X3F1ZXVlX3htaXQsIHNvIHdlIGNhbiBpbnNlcnQgc29tZSBjb21tb24KKyAqICAgIGNvZGUgaW50byBpdC4KKyAqLwordm9pZCBpcmxhcF9xdWV1ZV94bWl0KHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKiBTb21lIGNvbW1vbiBpbml0IHN0dWZmICovCisJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7CisJc2tiLT5oLnJhdyA9IHNrYi0+bmgucmF3ID0gc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKKwlza2ItPnByaW9yaXR5ID0gVENfUFJJT19CRVNURUZGT1JUOworCisJaXJsYXBfaW5zZXJ0X2luZm8oc2VsZiwgc2tiKTsKKworCWRldl9xdWV1ZV94bWl0KHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9zZW5kX3Nucm1fY21kICh2b2lkKQorICoKKyAqICAgIFRyYW5zbWl0cyBhIGNvbm5lY3QgU05STSBjb21tYW5kIGZyYW1lCisgKi8KK3ZvaWQgaXJsYXBfc2VuZF9zbnJtX2ZyYW1lKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpCit7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKKwlzdHJ1Y3Qgc25ybV9mcmFtZSAqZnJhbWU7CisJaW50IHJldDsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKworCS8qIEFsbG9jYXRlIGZyYW1lICovCisJdHhfc2tiID0gZGV2X2FsbG9jX3NrYig2NCk7CisJaWYgKCF0eF9za2IpCisJCXJldHVybjsKKworCWZyYW1lID0gKHN0cnVjdCBzbnJtX2ZyYW1lICopIHNrYl9wdXQodHhfc2tiLCAyKTsKKworCS8qIEluc2VydCBjb25uZWN0aW9uIGFkZHJlc3MgZmllbGQgKi8KKwlpZiAocW9zKQorCQlmcmFtZS0+Y2FkZHIgPSBDTURfRlJBTUUgfCBDQlJPQURDQVNUOworCWVsc2UKKwkJZnJhbWUtPmNhZGRyID0gQ01EX0ZSQU1FIHwgc2VsZi0+Y2FkZHI7CisKKwkvKiBJbnNlcnQgY29udHJvbCBmaWVsZCAqLworCWZyYW1lLT5jb250cm9sID0gU05STV9DTUQgfCBQRl9CSVQ7CisKKwkvKgorCSAqICBJZiB3ZSBhcmUgZXN0YWJsaXNoaW5nIGEgY29ubmVjdGlvbiB0aGVuIGluc2VydCBRb1MgcGFyYW1lcnRlcnMKKwkgKi8KKwlpZiAocW9zKSB7CisJCXNrYl9wdXQodHhfc2tiLCA5KTsgLyogMjEgbGVmdCAqLworCQlmcmFtZS0+c2FkZHIgPSBjcHVfdG9fbGUzMihzZWxmLT5zYWRkcik7CisJCWZyYW1lLT5kYWRkciA9IGNwdV90b19sZTMyKHNlbGYtPmRhZGRyKTsKKworCQlmcmFtZS0+bmNhZGRyID0gc2VsZi0+Y2FkZHI7CisKKwkJcmV0ID0gaXJsYXBfaW5zZXJ0X3Fvc19uZWdvdGlhdGlvbl9wYXJhbXMoc2VsZiwgdHhfc2tiKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9rZnJlZV9za2IodHhfc2tiKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlpcmxhcF9xdWV1ZV94bWl0KHNlbGYsIHR4X3NrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9yZWN2X3Nucm1fY21kIChza2IsIGluZm8pCisgKgorICogICAgUmVjZWl2ZWQgU05STSAoU2V0IE5vcm1hbCBSZXNwb25zZSBNb2RlKSBjb21tYW5kIGZyYW1lCisgKgorICovCitzdGF0aWMgdm9pZCBpcmxhcF9yZWN2X3Nucm1fY21kKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQlzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3Qgc25ybV9mcmFtZSAqZnJhbWU7CisKKwlpZiAocHNrYl9tYXlfcHVsbChza2Isc2l6ZW9mKHN0cnVjdCBzbnJtX2ZyYW1lKSkpIHsKKwkJZnJhbWUgPSAoc3RydWN0IHNucm1fZnJhbWUgKikgc2tiLT5kYXRhOworCisJCS8qIENvcHkgdGhlIG5ldyBjb25uZWN0aW9uIGFkZHJlc3MgaWdub3JpbmcgdGhlIEMvUiBiaXQgKi8KKwkJaW5mby0+Y2FkZHIgPSBmcmFtZS0+bmNhZGRyICYgMHhGRTsKKworCQkvKiBDaGVjayBpZiB0aGUgbmV3IGNvbm5lY3Rpb24gYWRkcmVzcyBpcyB2YWxpZCAqLworCQlpZiAoKGluZm8tPmNhZGRyID09IDB4MDApIHx8IChpbmZvLT5jYWRkciA9PSAweGZlKSkgeworCQkJSVJEQV9ERUJVRygzLCAiJXMoKSwgaW52YWxpZCBjb25uZWN0aW9uIGFkZHJlc3MhXG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBDb3B5IHBlZXIgZGV2aWNlIGFkZHJlc3MgKi8KKwkJaW5mby0+ZGFkZHIgPSBsZTMyX3RvX2NwdShmcmFtZS0+c2FkZHIpOworCQlpbmZvLT5zYWRkciA9IGxlMzJfdG9fY3B1KGZyYW1lLT5kYWRkcik7CisKKwkJLyogT25seSBhY2NlcHQgaWYgYWRkcmVzc2VkIGRpcmVjdGx5IHRvIHVzICovCisJCWlmIChpbmZvLT5zYWRkciAhPSBzZWxmLT5zYWRkcikgeworCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgbm90IGFkZHJlc3NlZCB0byB1cyFcbiIsCisJCQkJICAgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybjsKKwkJfQorCQlpcmxhcF9kb19ldmVudChzZWxmLCBSRUNWX1NOUk1fQ01ELCBza2IsIGluZm8pOworCX0gZWxzZSB7CisJCS8qIFNpZ25hbCB0aGF0IHRoaXMgU05STSBmcmFtZSBkb2VzIG5vdCBjb250YWluIGFuZCBJLWZpZWxkICovCisJCWlybGFwX2RvX2V2ZW50KHNlbGYsIFJFQ1ZfU05STV9DTUQsIHNrYiwgTlVMTCk7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfc2VuZF91YV9yZXNwb25zZV9mcmFtZSAocW9zKQorICoKKyAqICAgIFNlbmQgVUEgKFVubnVtYmVyZWQgQWNrbm93bGVkZ2VtZW50KSBmcmFtZQorICoKKyAqLwordm9pZCBpcmxhcF9zZW5kX3VhX3Jlc3BvbnNlX2ZyYW1lKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpCit7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKKwlzdHJ1Y3QgdWFfZnJhbWUgKmZyYW1lOworCWludCByZXQ7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpIDwlbGQ+XG4iLCBfX0ZVTkNUSU9OX18sIGppZmZpZXMpOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCisJLyogQWxsb2NhdGUgZnJhbWUgKi8KKwl0eF9za2IgPSBkZXZfYWxsb2Nfc2tiKDY0KTsKKwlpZiAoIXR4X3NrYikKKwkJcmV0dXJuOworCisJZnJhbWUgPSAoc3RydWN0IHVhX2ZyYW1lICopIHNrYl9wdXQodHhfc2tiLCAxMCk7CisKKwkvKiBCdWlsZCBVQSByZXNwb25zZSAqLworCWZyYW1lLT5jYWRkciA9IHNlbGYtPmNhZGRyOworCWZyYW1lLT5jb250cm9sID0gVUFfUlNQIHwgUEZfQklUOworCisJZnJhbWUtPnNhZGRyID0gY3B1X3RvX2xlMzIoc2VsZi0+c2FkZHIpOworCWZyYW1lLT5kYWRkciA9IGNwdV90b19sZTMyKHNlbGYtPmRhZGRyKTsKKworCS8qIFNob3VsZCB3ZSBzZW5kIFFvUyBuZWdvdGlhdGlvbiBwYXJhbWV0ZXJzPyAqLworCWlmIChxb3MpIHsKKwkJcmV0ID0gaXJsYXBfaW5zZXJ0X3Fvc19uZWdvdGlhdGlvbl9wYXJhbXMoc2VsZiwgdHhfc2tiKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9rZnJlZV9za2IodHhfc2tiKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWlybGFwX3F1ZXVlX3htaXQoc2VsZiwgdHhfc2tiKTsKK30KKworCisvKgorICogRnVuY3Rpb24gaXJsYXBfc2VuZF9kbV9mcmFtZSAodm9pZCkKKyAqCisgKiAgICBTZW5kIGRpc2Nvbm5lY3RlZCBtb2RlIChETSkgZnJhbWUKKyAqCisgKi8KK3ZvaWQgaXJsYXBfc2VuZF9kbV9mcmFtZSggc3RydWN0IGlybGFwX2NiICpzZWxmKQoreworCXN0cnVjdCBza19idWZmICp0eF9za2IgPSBOVUxMOworCV9fdTggKmZyYW1lOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCisJdHhfc2tiID0gZGV2X2FsbG9jX3NrYigzMik7CisJaWYgKCF0eF9za2IpCisJCXJldHVybjsKKworCWZyYW1lID0gc2tiX3B1dCh0eF9za2IsIDIpOworCisJaWYgKHNlbGYtPnN0YXRlID09IExBUF9ORE0pCisJCWZyYW1lWzBdID0gQ0JST0FEQ0FTVDsKKwllbHNlCisJCWZyYW1lWzBdID0gc2VsZi0+Y2FkZHI7CisKKwlmcmFtZVsxXSA9IERNX1JTUCB8IFBGX0JJVDsKKworCWlybGFwX3F1ZXVlX3htaXQoc2VsZiwgdHhfc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3NlbmRfZGlzY19mcmFtZSAodm9pZCkKKyAqCisgKiAgICBTZW5kIGRpc2Nvbm5lY3QgKERJU0MpIGZyYW1lCisgKgorICovCit2b2lkIGlybGFwX3NlbmRfZGlzY19mcmFtZShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYpCit7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYiA9IE5VTEw7CisJX191OCAqZnJhbWU7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCisJdHhfc2tiID0gZGV2X2FsbG9jX3NrYigxNik7CisJaWYgKCF0eF9za2IpCisJCXJldHVybjsKKworCWZyYW1lID0gc2tiX3B1dCh0eF9za2IsIDIpOworCisJZnJhbWVbMF0gPSBzZWxmLT5jYWRkciB8IENNRF9GUkFNRTsKKwlmcmFtZVsxXSA9IERJU0NfQ01EIHwgUEZfQklUOworCisJaXJsYXBfcXVldWVfeG1pdChzZWxmLCB0eF9za2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfc2VuZF9kaXNjb3ZlcnlfeGlkX2ZyYW1lIChTLCBzLCBjb21tYW5kKQorICoKKyAqICAgIEJ1aWxkIGFuZCB0cmFuc21pdCBhIFhJRCAoZVhjaGFuZ2Ugc3RhdGlvbiBJRGVudGlmaWVyKSBkaXNjb3ZlcnkKKyAqICAgIGZyYW1lLgorICovCit2b2lkIGlybGFwX3NlbmRfZGlzY292ZXJ5X3hpZF9mcmFtZShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIGludCBTLCBfX3U4IHMsCisJCQkJICAgIF9fdTggY29tbWFuZCwgZGlzY292ZXJ5X3QgKmRpc2NvdmVyeSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiID0gTlVMTDsKKwlzdHJ1Y3QgeGlkX2ZyYW1lICpmcmFtZTsKKwlfX3UzMiBiY2FzdCA9IEJST0FEQ0FTVDsKKwlfX3U4ICppbmZvOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgcz0lZCwgUz0lZCwgY29tbWFuZD0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkgICBzLCBTLCBjb21tYW5kKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChkaXNjb3ZlcnkgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwl0eF9za2IgPSBkZXZfYWxsb2Nfc2tiKDY0KTsKKwlpZiAoIXR4X3NrYikKKwkJcmV0dXJuOworCisJc2tiX3B1dCh0eF9za2IsIDE0KTsKKwlmcmFtZSA9IChzdHJ1Y3QgeGlkX2ZyYW1lICopIHR4X3NrYi0+ZGF0YTsKKworCWlmIChjb21tYW5kKSB7CisJCWZyYW1lLT5jYWRkciA9IENCUk9BRENBU1QgfCBDTURfRlJBTUU7CisJCWZyYW1lLT5jb250cm9sID0gIFhJRF9DTUQgfCBQRl9CSVQ7CisJfSBlbHNlIHsKKwkJZnJhbWUtPmNhZGRyID0gQ0JST0FEQ0FTVDsKKwkJZnJhbWUtPmNvbnRyb2wgPSAgWElEX1JTUCB8IFBGX0JJVDsKKwl9CisJZnJhbWUtPmlkZW50ID0gWElEX0ZPUk1BVDsKKworCWZyYW1lLT5zYWRkciA9IGNwdV90b19sZTMyKHNlbGYtPnNhZGRyKTsKKworCWlmIChjb21tYW5kKQorCQlmcmFtZS0+ZGFkZHIgPSBjcHVfdG9fbGUzMihiY2FzdCk7CisJZWxzZQorCQlmcmFtZS0+ZGFkZHIgPSBjcHVfdG9fbGUzMihkaXNjb3ZlcnktPmRhdGEuZGFkZHIpOworCisJc3dpdGNoIChTKSB7CisJY2FzZSAxOgorCQlmcmFtZS0+ZmxhZ3MgPSAweDAwOworCQlicmVhazsKKwljYXNlIDY6CisJCWZyYW1lLT5mbGFncyA9IDB4MDE7CisJCWJyZWFrOworCWNhc2UgODoKKwkJZnJhbWUtPmZsYWdzID0gMHgwMjsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJZnJhbWUtPmZsYWdzID0gMHgwMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnJhbWUtPmZsYWdzID0gMHgwMjsKKwkJYnJlYWs7CisJfQorCisJZnJhbWUtPnNsb3RuciA9IHM7CisJZnJhbWUtPnZlcnNpb24gPSAweDAwOworCisJLyoKKwkgKiAgUHJvdmlkZSBpbmZvIGZvciBmaW5hbCBzbG90IG9ubHkgaW4gY29tbWFuZHMsIGFuZCBmb3IgYWxsCisJICogIHJlc3BvbnNlcy4gU2VuZCB0aGUgc2Vjb25kIGJ5dGUgb2YgdGhlIGhpbnQgb25seSBpZiB0aGUKKwkgKiAgRVhURU5TSU9OIGJpdCBpcyBzZXQgaW4gdGhlIGZpcnN0IGJ5dGUuCisJICovCisJaWYgKCFjb21tYW5kIHx8IChmcmFtZS0+c2xvdG5yID09IDB4ZmYpKSB7CisJCWludCBsZW47CisKKwkJaWYgKGRpc2NvdmVyeS0+ZGF0YS5oaW50c1swXSAmIEhJTlRfRVhURU5TSU9OKSB7CisJCQlpbmZvID0gc2tiX3B1dCh0eF9za2IsIDIpOworCQkJaW5mb1swXSA9IGRpc2NvdmVyeS0+ZGF0YS5oaW50c1swXTsKKwkJCWluZm9bMV0gPSBkaXNjb3ZlcnktPmRhdGEuaGludHNbMV07CisJCX0gZWxzZSB7CisJCQlpbmZvID0gc2tiX3B1dCh0eF9za2IsIDEpOworCQkJaW5mb1swXSA9IGRpc2NvdmVyeS0+ZGF0YS5oaW50c1swXTsKKwkJfQorCQlpbmZvID0gc2tiX3B1dCh0eF9za2IsIDEpOworCQlpbmZvWzBdID0gZGlzY292ZXJ5LT5kYXRhLmNoYXJzZXQ7CisKKwkJbGVuID0gSVJEQV9NSU4oZGlzY292ZXJ5LT5uYW1lX2xlbiwgc2tiX3RhaWxyb29tKHR4X3NrYikpOworCQlpbmZvID0gc2tiX3B1dCh0eF9za2IsIGxlbik7CisJCW1lbWNweShpbmZvLCBkaXNjb3ZlcnktPmRhdGEuaW5mbywgbGVuKTsKKwl9CisJaXJsYXBfcXVldWVfeG1pdChzZWxmLCB0eF9za2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfcmVjdl9kaXNjb3ZlcnlfeGlkX3JzcCAoc2tiLCBpbmZvKQorICoKKyAqICAgIFJlY2VpdmVkIGEgWElEIGRpc2NvdmVyeSByZXNwb25zZQorICoKKyAqLworc3RhdGljIHZvaWQgaXJsYXBfcmVjdl9kaXNjb3ZlcnlfeGlkX3JzcChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsCisJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgc3RydWN0IGlybGFwX2luZm8gKmluZm8pCit7CisJc3RydWN0IHhpZF9mcmFtZSAqeGlkOworCWRpc2NvdmVyeV90ICpkaXNjb3ZlcnkgPSBOVUxMOworCV9fdTggKmRpc2NvdmVyeV9pbmZvOworCWNoYXIgKnRleHQ7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCB4aWRfZnJhbWUpKSkgeworCQlJUkRBX0VSUk9SKCIlczogZnJhbWUgdG8gc2hvcnQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCQkKKwl4aWQgPSAoc3RydWN0IHhpZF9mcmFtZSAqKSBza2ItPmRhdGE7CisKKwlpbmZvLT5kYWRkciA9IGxlMzJfdG9fY3B1KHhpZC0+c2FkZHIpOworCWluZm8tPnNhZGRyID0gbGUzMl90b19jcHUoeGlkLT5kYWRkcik7CisKKwkvKiBNYWtlIHN1cmUgZnJhbWUgaXMgYWRkcmVzc2VkIHRvIHVzICovCisJaWYgKChpbmZvLT5zYWRkciAhPSBzZWxmLT5zYWRkcikgJiYgKGluZm8tPnNhZGRyICE9IEJST0FEQ0FTVCkpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgZnJhbWUgaXMgbm90IGFkZHJlc3NlZCB0byB1cyFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKChkaXNjb3ZlcnkgPSBrbWFsbG9jKHNpemVvZihkaXNjb3ZlcnlfdCksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCUlSREFfV0FSTklORygiJXM6IGttYWxsb2MgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKwltZW1zZXQoZGlzY292ZXJ5LCAwLCBzaXplb2YoZGlzY292ZXJ5X3QpKTsKKworCWRpc2NvdmVyeS0+ZGF0YS5kYWRkciA9IGluZm8tPmRhZGRyOworCWRpc2NvdmVyeS0+ZGF0YS5zYWRkciA9IHNlbGYtPnNhZGRyOworCWRpc2NvdmVyeS0+dGltZXN0YW1wID0gamlmZmllczsKKworCUlSREFfREVCVUcoNCwgIiVzKCksIGRhZGRyPSUwOHhcbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgZGlzY292ZXJ5LT5kYXRhLmRhZGRyKTsKKworCWRpc2NvdmVyeV9pbmZvID0gc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHhpZF9mcmFtZSkpOworCisJLyogR2V0IGluZm8gcmV0dXJuZWQgZnJvbSBwZWVyICovCisJZGlzY292ZXJ5LT5kYXRhLmhpbnRzWzBdID0gZGlzY292ZXJ5X2luZm9bMF07CisJaWYgKGRpc2NvdmVyeV9pbmZvWzBdICYgSElOVF9FWFRFTlNJT04pIHsKKwkJSVJEQV9ERUJVRyg0LCAiRVhURU5TSU9OXG4iKTsKKwkJZGlzY292ZXJ5LT5kYXRhLmhpbnRzWzFdID0gZGlzY292ZXJ5X2luZm9bMV07CisJCWRpc2NvdmVyeS0+ZGF0YS5jaGFyc2V0ID0gZGlzY292ZXJ5X2luZm9bMl07CisJCXRleHQgPSAoY2hhciAqKSAmZGlzY292ZXJ5X2luZm9bM107CisJfSBlbHNlIHsKKwkJZGlzY292ZXJ5LT5kYXRhLmhpbnRzWzFdID0gMDsKKwkJZGlzY292ZXJ5LT5kYXRhLmNoYXJzZXQgPSBkaXNjb3ZlcnlfaW5mb1sxXTsKKwkJdGV4dCA9IChjaGFyICopICZkaXNjb3ZlcnlfaW5mb1syXTsKKwl9CisJLyoKKwkgKiAgVGVybWluYXRlIGluZm8gc3RyaW5nLCBzaG91bGQgYmUgc2FmZSBzaW5jZSB0aGlzIGlzIHdoZXJlIHRoZQorCSAqICBGQ1MgYnl0ZXMgcmVzaWRlcy4KKwkgKi8KKwlza2ItPmRhdGFbc2tiLT5sZW5dID0gJ1wwJzsKKwlzdHJuY3B5KGRpc2NvdmVyeS0+ZGF0YS5pbmZvLCB0ZXh0LCBOSUNLTkFNRV9NQVhfTEVOKTsKKwlkaXNjb3ZlcnktPm5hbWVfbGVuID0gc3RybGVuKGRpc2NvdmVyeS0+ZGF0YS5pbmZvKTsKKworCWluZm8tPmRpc2NvdmVyeSA9IGRpc2NvdmVyeTsKKworCWlybGFwX2RvX2V2ZW50KHNlbGYsIFJFQ1ZfRElTQ09WRVJZX1hJRF9SU1AsIHNrYiwgaW5mbyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9yZWN2X2Rpc2NvdmVyeV94aWRfY21kIChza2IsIGluZm8pCisgKgorICogICAgUmVjZWl2ZWQgYSBYSUQgZGlzY292ZXJ5IGNvbW1hbmQKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlybGFwX3JlY3ZfZGlzY292ZXJ5X3hpZF9jbWQoc3RydWN0IGlybGFwX2NiICpzZWxmLAorCQkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvKQoreworCXN0cnVjdCB4aWRfZnJhbWUgKnhpZDsKKwlkaXNjb3ZlcnlfdCAqZGlzY292ZXJ5ID0gTlVMTDsKKwlfX3U4ICpkaXNjb3ZlcnlfaW5mbzsKKwljaGFyICp0ZXh0OworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCB4aWRfZnJhbWUpKSkgeworCQlJUkRBX0VSUk9SKCIlczogZnJhbWUgdG8gc2hvcnQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCQorCXhpZCA9IChzdHJ1Y3QgeGlkX2ZyYW1lICopIHNrYi0+ZGF0YTsKKworCWluZm8tPmRhZGRyID0gbGUzMl90b19jcHUoeGlkLT5zYWRkcik7CisJaW5mby0+c2FkZHIgPSBsZTMyX3RvX2NwdSh4aWQtPmRhZGRyKTsKKworCS8qIE1ha2Ugc3VyZSBmcmFtZSBpcyBhZGRyZXNzZWQgdG8gdXMgKi8KKwlpZiAoKGluZm8tPnNhZGRyICE9IHNlbGYtPnNhZGRyKSAmJiAoaW5mby0+c2FkZHIgIT0gQlJPQURDQVNUKSkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBmcmFtZSBpcyBub3QgYWRkcmVzc2VkIHRvIHVzIVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKHhpZC0+ZmxhZ3MgJiAweDAzKSB7CisJY2FzZSAweDAwOgorCQlpbmZvLT5TID0gMTsKKwkJYnJlYWs7CisJY2FzZSAweDAxOgorCQlpbmZvLT5TID0gNjsKKwkJYnJlYWs7CisJY2FzZSAweDAyOgorCQlpbmZvLT5TID0gODsKKwkJYnJlYWs7CisJY2FzZSAweDAzOgorCQlpbmZvLT5TID0gMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIEVycm9yISEgKi8KKwkJcmV0dXJuOworCX0KKwlpbmZvLT5zID0geGlkLT5zbG90bnI7CisKKwlkaXNjb3ZlcnlfaW5mbyA9IHNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCB4aWRfZnJhbWUpKTsKKworCS8qCisJICogIENoZWNrIGlmIGxhc3QgZnJhbWUKKwkgKi8KKwlpZiAoaW5mby0+cyA9PSAweGZmKSB7CisJCS8qIENoZWNrIGlmIHRoaW5ncyBhcmUgc2FuZSBhdCB0aGlzIHBvaW50Li4uICovCisJCWlmKChkaXNjb3ZlcnlfaW5mbyA9PSBOVUxMKSB8fCAKKwkJICAgIXBza2JfbWF5X3B1bGwoc2tiLCAzKSkgeworCQkJSVJEQV9FUlJPUigiJXM6IGRpc2NvdmVyeSBmcmFtZSB0byBzaG9ydCFcbiIsCisJCQkJICAgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qCisJCSAqICBXZSBub3cgaGF2ZSBzb21lIGRpc2NvdmVyeSBpbmZvIHRvIGRlbGl2ZXIhCisJCSAqLworCQlkaXNjb3ZlcnkgPSBrbWFsbG9jKHNpemVvZihkaXNjb3ZlcnlfdCksIEdGUF9BVE9NSUMpOworCQlpZiAoIWRpc2NvdmVyeSkgeworCQkJSVJEQV9XQVJOSU5HKCIlczogdW5hYmxlIHRvIG1hbGxvYyFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm47CisJCX0KKworCQlkaXNjb3ZlcnktPmRhdGEuZGFkZHIgPSBpbmZvLT5kYWRkcjsKKwkJZGlzY292ZXJ5LT5kYXRhLnNhZGRyID0gc2VsZi0+c2FkZHI7CisJCWRpc2NvdmVyeS0+dGltZXN0YW1wID0gamlmZmllczsKKworCQlkaXNjb3ZlcnktPmRhdGEuaGludHNbMF0gPSBkaXNjb3ZlcnlfaW5mb1swXTsKKwkJaWYgKGRpc2NvdmVyeV9pbmZvWzBdICYgSElOVF9FWFRFTlNJT04pIHsKKwkJCWRpc2NvdmVyeS0+ZGF0YS5oaW50c1sxXSA9IGRpc2NvdmVyeV9pbmZvWzFdOworCQkJZGlzY292ZXJ5LT5kYXRhLmNoYXJzZXQgPSBkaXNjb3ZlcnlfaW5mb1syXTsKKwkJCXRleHQgPSAoY2hhciAqKSAmZGlzY292ZXJ5X2luZm9bM107CisJCX0gZWxzZSB7CisJCQlkaXNjb3ZlcnktPmRhdGEuaGludHNbMV0gPSAwOworCQkJZGlzY292ZXJ5LT5kYXRhLmNoYXJzZXQgPSBkaXNjb3ZlcnlfaW5mb1sxXTsKKwkJCXRleHQgPSAoY2hhciAqKSAmZGlzY292ZXJ5X2luZm9bMl07CisJCX0KKwkJLyoKKwkJICogIFRlcm1pbmF0ZSBzdHJpbmcsIHNob3VsZCBiZSBzYWZlIHNpbmNlIHRoaXMgaXMgd2hlcmUgdGhlCisJCSAqICBGQ1MgYnl0ZXMgcmVzaWRlcy4KKwkJICovCisJCXNrYi0+ZGF0YVtza2ItPmxlbl0gPSAnXDAnOworCQlzdHJuY3B5KGRpc2NvdmVyeS0+ZGF0YS5pbmZvLCB0ZXh0LCBOSUNLTkFNRV9NQVhfTEVOKTsKKwkJZGlzY292ZXJ5LT5uYW1lX2xlbiA9IHN0cmxlbihkaXNjb3ZlcnktPmRhdGEuaW5mbyk7CisKKwkJaW5mby0+ZGlzY292ZXJ5ID0gZGlzY292ZXJ5OworCX0gZWxzZQorCQlpbmZvLT5kaXNjb3ZlcnkgPSBOVUxMOworCisJaXJsYXBfZG9fZXZlbnQoc2VsZiwgUkVDVl9ESVNDT1ZFUllfWElEX0NNRCwgc2tiLCBpbmZvKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3NlbmRfcnJfZnJhbWUgKHNlbGYsIGNvbW1hbmQpCisgKgorICogICAgQnVpbGQgYW5kIHRyYW5zbWl0IFJSIChSZWNlaXZlIFJlYWR5KSBmcmFtZS4gTm90aWNlIHRoYXQgaXQgaXMgY3VycmVudGx5CisgKiAgICBvbmx5IHBvc3NpYmxlIHRvIHNlbmQgUlIgZnJhbWVzIHdpdGggdGhlIHBvbGwgYml0IHNldC4KKyAqLwordm9pZCBpcmxhcF9zZW5kX3JyX2ZyYW1lKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgaW50IGNvbW1hbmQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKKwlfX3U4ICpmcmFtZTsKKworCXR4X3NrYiA9IGRldl9hbGxvY19za2IoMTYpOworCWlmICghdHhfc2tiKQorCQlyZXR1cm47CisKKwlmcmFtZSA9IHNrYl9wdXQodHhfc2tiLCAyKTsKKworCWZyYW1lWzBdID0gc2VsZi0+Y2FkZHI7CisJZnJhbWVbMF0gfD0gKGNvbW1hbmQpID8gQ01EX0ZSQU1FIDogMDsKKworCWZyYW1lWzFdID0gUlIgfCBQRl9CSVQgfCAoc2VsZi0+dnIgPDwgNSk7CisKKwlpcmxhcF9xdWV1ZV94bWl0KHNlbGYsIHR4X3NrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9zZW5kX3JkX2ZyYW1lIChzZWxmKQorICoKKyAqICAgIFJlcXVlc3QgZGlzY29ubmVjdC4gVXNlZCBieSBhIHNlY29uZGFyeSBzdGF0aW9uIHRvIHJlcXVlc3QgdGhlCisgKiAgICBkaXNjb25uZWN0aW9uIG9mIHRoZSBsaW5rLgorICovCit2b2lkIGlybGFwX3NlbmRfcmRfZnJhbWUoc3RydWN0IGlybGFwX2NiICpzZWxmKQoreworCXN0cnVjdCBza19idWZmICp0eF9za2I7CisJX191OCAqZnJhbWU7CisKKwl0eF9za2IgPSBkZXZfYWxsb2Nfc2tiKDE2KTsKKwlpZiAoIXR4X3NrYikKKwkJcmV0dXJuOworCisJZnJhbWUgPSBza2JfcHV0KHR4X3NrYiwgMik7CisKKwlmcmFtZVswXSA9IHNlbGYtPmNhZGRyOworCWZyYW1lWzFdID0gUkRfUlNQIHwgUEZfQklUOworCisJaXJsYXBfcXVldWVfeG1pdChzZWxmLCB0eF9za2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfcmVjdl9ycl9mcmFtZSAoc2tiLCBpbmZvKQorICoKKyAqICAgIFJlY2VpdmVkIFJSIChSZWNlaXZlIFJlYWR5KSBmcmFtZSBmcm9tIHBlZXIgc3RhdGlvbiwgbm8gaGFybSBpbgorICogICAgbWFraW5nIGl0IGlubGluZSBzaW5jZSBpdHMgY2FsbGVkIG9ubHkgZnJvbSBvbmUgc2luZ2xlIHBsYWNlCisgKiAgICAoaXJsYXBfZHJpdmVyX3JjdikuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpcmxhcF9yZWN2X3JyX2ZyYW1lKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwKKwkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgICAgc3RydWN0IGlybGFwX2luZm8gKmluZm8sIGludCBjb21tYW5kKQoreworCWluZm8tPm5yID0gc2tiLT5kYXRhWzFdID4+IDU7CisKKwkvKiBDaGVjayBpZiB0aGlzIGlzIGEgY29tbWFuZCBvciBhIHJlc3BvbnNlIGZyYW1lICovCisJaWYgKGNvbW1hbmQpCisJCWlybGFwX2RvX2V2ZW50KHNlbGYsIFJFQ1ZfUlJfQ01ELCBza2IsIGluZm8pOworCWVsc2UKKwkJaXJsYXBfZG9fZXZlbnQoc2VsZiwgUkVDVl9SUl9SU1AsIHNrYiwgaW5mbyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9yZWN2X3Jucl9mcmFtZSAoc2VsZiwgc2tiLCBpbmZvKQorICoKKyAqICAgIFJlY2VpdmVkIFJOUiAoUmVjZWl2ZSBOb3QgUmVhZHkpIGZyYW1lIGZyb20gcGVlciBzdGF0aW9uCisgKgorICovCitzdGF0aWMgdm9pZCBpcmxhcF9yZWN2X3Jucl9mcmFtZShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvLCBpbnQgY29tbWFuZCkKK3sKKwlpbmZvLT5uciA9IHNrYi0+ZGF0YVsxXSA+PiA1OworCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgbnI9JWQsICVsZFxuIiwgX19GVU5DVElPTl9fLCBpbmZvLT5uciwgamlmZmllcyk7CisKKwlpZiAoY29tbWFuZCkKKwkJaXJsYXBfZG9fZXZlbnQoc2VsZiwgUkVDVl9STlJfQ01ELCBza2IsIGluZm8pOworCWVsc2UKKwkJaXJsYXBfZG9fZXZlbnQoc2VsZiwgUkVDVl9STlJfUlNQLCBza2IsIGluZm8pOworfQorCitzdGF0aWMgdm9pZCBpcmxhcF9yZWN2X3Jlal9mcmFtZShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvLCBpbnQgY29tbWFuZCkKK3sKKwlJUkRBX0RFQlVHKDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaW5mby0+bnIgPSBza2ItPmRhdGFbMV0gPj4gNTsKKworCS8qIENoZWNrIGlmIHRoaXMgaXMgYSBjb21tYW5kIG9yIGEgcmVzcG9uc2UgZnJhbWUgKi8KKwlpZiAoY29tbWFuZCkKKwkJaXJsYXBfZG9fZXZlbnQoc2VsZiwgUkVDVl9SRUpfQ01ELCBza2IsIGluZm8pOworCWVsc2UKKwkJaXJsYXBfZG9fZXZlbnQoc2VsZiwgUkVDVl9SRUpfUlNQLCBza2IsIGluZm8pOworfQorCitzdGF0aWMgdm9pZCBpcmxhcF9yZWN2X3NyZWpfZnJhbWUoc3RydWN0IGlybGFwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgc3RydWN0IGlybGFwX2luZm8gKmluZm8sIGludCBjb21tYW5kKQoreworCUlSREFfREVCVUcoMCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpbmZvLT5uciA9IHNrYi0+ZGF0YVsxXSA+PiA1OworCisJLyogQ2hlY2sgaWYgdGhpcyBpcyBhIGNvbW1hbmQgb3IgYSByZXNwb25zZSBmcmFtZSAqLworCWlmIChjb21tYW5kKQorCQlpcmxhcF9kb19ldmVudChzZWxmLCBSRUNWX1NSRUpfQ01ELCBza2IsIGluZm8pOworCWVsc2UKKwkJaXJsYXBfZG9fZXZlbnQoc2VsZiwgUkVDVl9TUkVKX1JTUCwgc2tiLCBpbmZvKTsKK30KKworc3RhdGljIHZvaWQgaXJsYXBfcmVjdl9kaXNjX2ZyYW1lKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvLCBpbnQgY29tbWFuZCkKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogQ2hlY2sgaWYgdGhpcyBpcyBhIGNvbW1hbmQgb3IgYSByZXNwb25zZSBmcmFtZSAqLworCWlmIChjb21tYW5kKQorCQlpcmxhcF9kb19ldmVudChzZWxmLCBSRUNWX0RJU0NfQ01ELCBza2IsIGluZm8pOworCWVsc2UKKwkJaXJsYXBfZG9fZXZlbnQoc2VsZiwgUkVDVl9SRF9SU1AsIHNrYiwgaW5mbyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9yZWN2X3VhX2ZyYW1lIChza2IsIGZyYW1lKQorICoKKyAqICAgIFJlY2VpdmVkIFVBIChVbm51bWJlcmVkIEFja25vd2xlZGdlbWVudCkgZnJhbWUKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpcmxhcF9yZWN2X3VhX2ZyYW1lKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwKKwkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgICAgc3RydWN0IGlybGFwX2luZm8gKmluZm8pCit7CisJaXJsYXBfZG9fZXZlbnQoc2VsZiwgUkVDVl9VQV9SU1AsIHNrYiwgaW5mbyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9zZW5kX2RhdGFfcHJpbWFyeShzZWxmLCBza2IpCisgKgorICogICAgU2VuZCBJLWZyYW1lcyBhcyB0aGUgcHJpbWFyeSBzdGF0aW9uIGJ1dCB3aXRob3V0IHRoZSBwb2xsIGJpdCBzZXQKKyAqCisgKi8KK3ZvaWQgaXJsYXBfc2VuZF9kYXRhX3ByaW1hcnkoc3RydWN0IGlybGFwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmICp0eF9za2I7CisKKwlpZiAoc2tiLT5kYXRhWzFdID09IElfRlJBTUUpIHsKKworCQkvKgorCQkgKiAgSW5zZXJ0IGZyYW1lIHNlcXVlbmNlIG51bWJlciAoVnMpIGluIGNvbnRyb2wgZmllbGQgYmVmb3JlCisJCSAqICBpbnNlcnRpbmcgaW50byB0cmFuc21pdCB3aW5kb3cgcXVldWUuCisJCSAqLworCQlza2ItPmRhdGFbMV0gPSBJX0ZSQU1FIHwgKHNlbGYtPnZzIDw8IDEpOworCisJCS8qCisJCSAqICBJbnNlcnQgZnJhbWUgaW4gc3RvcmUsIGluIGNhc2Ugb2YgcmV0cmFuc21pc3Npb25zCisJCSAqICBJbmNyZWFzZSBza2IgcmVmZXJlbmNlIGNvdW50LCBzZWUgaXJsYXBfZG9fZXZlbnQoKQorCQkgKi8KKwkJc2tiX2dldChza2IpOworCQlza2JfcXVldWVfdGFpbCgmc2VsZi0+d3hfbGlzdCwgc2tiKTsKKworCQkvKiBDb3B5IGJ1ZmZlciAqLworCQl0eF9za2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHR4X3NrYiA9PSBOVUxMKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlzZWxmLT52cyA9IChzZWxmLT52cyArIDEpICUgODsKKwkJc2VsZi0+YWNrX3JlcXVpcmVkID0gRkFMU0U7CisJCXNlbGYtPndpbmRvdyAtPSAxOworCisJCWlybGFwX3NlbmRfaV9mcmFtZSggc2VsZiwgdHhfc2tiLCBDTURfRlJBTUUpOworCX0gZWxzZSB7CisJCUlSREFfREVCVUcoNCwgIiVzKCksIHNlbmRpbmcgdW5yZWxpYWJsZSBmcmFtZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJaXJsYXBfc2VuZF91aV9mcmFtZShzZWxmLCBza2JfZ2V0KHNrYiksIHNlbGYtPmNhZGRyLCBDTURfRlJBTUUpOworCQlzZWxmLT53aW5kb3cgLT0gMTsKKwl9Cit9CisvKgorICogRnVuY3Rpb24gaXJsYXBfc2VuZF9kYXRhX3ByaW1hcnlfcG9sbCAoc2VsZiwgc2tiKQorICoKKyAqICAgIFNlbmQgSShuZm9ybWF0aW9uKSBmcmFtZSBhcyBwcmltYXJ5IHdpdGggcG9sbCBiaXQgc2V0CisgKi8KK3ZvaWQgaXJsYXBfc2VuZF9kYXRhX3ByaW1hcnlfcG9sbChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKKwlpbnQgdHJhbnNtaXNzaW9uX3RpbWU7CisKKwkvKiBTdG9wIFAgdGltZXIgKi8KKwlkZWxfdGltZXIoJnNlbGYtPnBvbGxfdGltZXIpOworCisJLyogSXMgdGhpcyByZWxpYWJsZSBvciB1bnJlbGlhYmxlIGRhdGE/ICovCisJaWYgKHNrYi0+ZGF0YVsxXSA9PSBJX0ZSQU1FKSB7CisKKwkJLyoKKwkJICogIEluc2VydCBmcmFtZSBzZXF1ZW5jZSBudW1iZXIgKFZzKSBpbiBjb250cm9sIGZpZWxkIGJlZm9yZQorCQkgKiAgaW5zZXJ0aW5nIGludG8gdHJhbnNtaXQgd2luZG93IHF1ZXVlLgorCQkgKi8KKwkJc2tiLT5kYXRhWzFdID0gSV9GUkFNRSB8IChzZWxmLT52cyA8PCAxKTsKKworCQkvKgorCQkgKiAgSW5zZXJ0IGZyYW1lIGluIHN0b3JlLCBpbiBjYXNlIG9mIHJldHJhbnNtaXNzaW9ucworCQkgKiAgSW5jcmVhc2Ugc2tiIHJlZmVyZW5jZSBjb3VudCwgc2VlIGlybGFwX2RvX2V2ZW50KCkKKwkJICovCisJCXNrYl9nZXQoc2tiKTsKKwkJc2tiX3F1ZXVlX3RhaWwoJnNlbGYtPnd4X2xpc3QsIHNrYik7CisKKwkJLyogQ29weSBidWZmZXIgKi8KKwkJdHhfc2tiID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJCWlmICh0eF9za2IgPT0gTlVMTCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJLyoKKwkJICogIFNldCBwb2xsIGJpdCBpZiBuZWNlc3NhcnkuIFdlIGRvIHRoaXMgdG8gdGhlIGNvcGllZAorCQkgKiAgc2tiLCBzaW5jZSByZXRyYW5zbWl0dGVkIG5lZWQgdG8gc2V0IG9yIGNsZWFyIHRoZSBwb2xsCisJCSAqICBiaXQgZGVwZW5kaW5nIG9uIHdoZW4gdGhleSBhcmUgc2VudC4KKwkJICovCisJCXR4X3NrYi0+ZGF0YVsxXSB8PSBQRl9CSVQ7CisKKwkJc2VsZi0+dnMgPSAoc2VsZi0+dnMgKyAxKSAlIDg7CisJCXNlbGYtPmFja19yZXF1aXJlZCA9IEZBTFNFOworCisJCWlybGFwX3NlbmRfaV9mcmFtZShzZWxmLCB0eF9za2IsIENNRF9GUkFNRSk7CisJfSBlbHNlIHsKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgc2VuZGluZyB1bnJlbGlhYmxlIGZyYW1lXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCWlmIChzZWxmLT5hY2tfcmVxdWlyZWQpIHsKKwkJCWlybGFwX3NlbmRfdWlfZnJhbWUoc2VsZiwgc2tiX2dldChza2IpLCBzZWxmLT5jYWRkciwgQ01EX0ZSQU1FKTsKKwkJCWlybGFwX3NlbmRfcnJfZnJhbWUoc2VsZiwgQ01EX0ZSQU1FKTsKKwkJCXNlbGYtPmFja19yZXF1aXJlZCA9IEZBTFNFOworCQl9IGVsc2UgeworCQkJc2tiLT5kYXRhWzFdIHw9IFBGX0JJVDsKKwkJCWlybGFwX3NlbmRfdWlfZnJhbWUoc2VsZiwgc2tiX2dldChza2IpLCBzZWxmLT5jYWRkciwgQ01EX0ZSQU1FKTsKKwkJfQorCX0KKworCS8qIEhvdyBtdWNoIHRpbWUgd2UgdG9vayBmb3IgdHJhbnNtaXNzaW9uIG9mIGFsbCBmcmFtZXMuCisJICogV2UgZG9uJ3Qga25vdywgc28gbGV0IGFzc3VtZSB3ZSB1c2VkIHRoZSBmdWxsIHdpbmRvdy4gSmVhbiBJSSAqLworCXRyYW5zbWlzc2lvbl90aW1lID0gc2VsZi0+ZmluYWxfdGltZW91dDsKKworCS8qIFJlc2V0IHBhcmFtZXRlciBzbyB0aGF0IHdlIGNhbiBmaWxsIG5leHQgd2luZG93ICovCisJc2VsZi0+d2luZG93ID0gc2VsZi0+d2luZG93X3NpemU7CisKKyNpZmRlZiBDT05GSUdfSVJEQV9EWU5BTUlDX1dJTkRPVworCS8qIFJlbW92ZSB3aGF0IHdlIGhhdmUgbm90IHVzZWQuIEp1c3QgZG8gYSBwcm9yYXRhIG9mIHRoZQorCSAqIGJ5dGVzIGxlZnQgaW4gd2luZG93IHRvIHdpbmRvdyBjYXBhY2l0eS4KKwkgKiBTZWUgbWF4X2xpbmVfY2FwYWNpdGllc1tdW10gaW4gcW9zLmMgZm9yIGRldGFpbHMuIEplYW4gSUkgKi8KKwl0cmFuc21pc3Npb25fdGltZSAtPSAoc2VsZi0+ZmluYWxfdGltZW91dCAqIHNlbGYtPmJ5dGVzX2xlZnQKKwkJCSAgICAgIC8gc2VsZi0+bGluZV9jYXBhY2l0eSk7CisJSVJEQV9ERUJVRyg0LCAiJXMoKSBhZGp1c3RpbmcgdHJhbnNtaXNzaW9uX3RpbWUgOiBmdD0lZCwgYmw9JWQsIGxjPSVkIC0+IHR0PSVkXG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYtPmZpbmFsX3RpbWVvdXQsIHNlbGYtPmJ5dGVzX2xlZnQsIHNlbGYtPmxpbmVfY2FwYWNpdHksIHRyYW5zbWlzc2lvbl90aW1lKTsKKworCS8qIFdlIGFyZSBhbGxvd2VkIHRvIHRyYW5zbWl0IGEgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgYWdhaW4uICovCisJc2VsZi0+Ynl0ZXNfbGVmdCA9IHNlbGYtPmxpbmVfY2FwYWNpdHk7CisjZW5kaWYgLyogQ09ORklHX0lSREFfRFlOQU1JQ19XSU5ET1cgKi8KKworCS8qCisJICogVGhlIG5ldHdvcmsgbGF5ZXIgaGFzIGEgaW50ZXJtZWRpYXRlIGJ1ZmZlciBiZXR3ZWVuIElyTEFQCisJICogYW5kIHRoZSBJckRBIGRyaXZlciB3aGljaCBjYW4gY29udGFpbiA4IGZyYW1lcy4gU28sIGV2ZW4KKwkgKiB0aG91Z2ggSXJMQVAgaXMgY3VycmVudGx5IHNlbmRpbmcgdGhlICpsYXN0KiBmcmFtZSBvZiB0aGUKKwkgKiB0eC13aW5kb3csIHRoZSBkcml2ZXIgbW9zdCBsaWtlbHkgaGFzIG9ubHkganVzdCBzdGFydGVkCisJICogc2VuZGluZyB0aGUgKmZpcnN0KiBmcmFtZSBvZiB0aGUgc2FtZSB0eC13aW5kb3cuCisJICogSS5lLiB3ZSBhcmUgYWx3YXlzIGF0IHRoZSB2ZXJ5IGJlZ2luaW5nIG9mIG9yIFR4IHdpbmRvdy4KKwkgKiBOb3csIHdlIGFyZSBzdXBwb3NlZCB0byBzZXQgdGhlIGZpbmFsIHRpbWVyIGZyb20gdGhlIGVuZAorCSAqIG9mIG91ciB0eC13aW5kb3cgdG8gbGV0IHRoZSBvdGhlciBwZWVyIHJlcGx5LiBTbywgd2UgbmVlZAorCSAqIHRvIGFkZCBleHRyYSB0aW1lIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBmYWN0IHRoYXQgd2UKKwkgKiBhcmUgcmVhbGx5IGF0IHRoZSBzdGFydCBvZiB0eC13aW5kb3csIG90aGVyd2lzZSB0aGUgZmluYWwgdGltZXIKKwkgKiBtaWdodCBleHBpcmUgYmVmb3JlIGhlIGNhbiBhbnN3ZXIuLi4KKwkgKiBKZWFuIElJCisJICovCisJaXJsYXBfc3RhcnRfZmluYWxfdGltZXIoc2VsZiwgc2VsZi0+ZmluYWxfdGltZW91dCArIHRyYW5zbWlzc2lvbl90aW1lKTsKKworCS8qCisJICogVGhlIGNsZXZlciBhbW9uZ3N0IHlvdSBtaWdodCBhc2sgd2h5IHdlIGRvIHRoaXMgYWRqdXN0ZW1lbnQKKwkgKiBvbmx5IGhlcmUsIGFuZCBub3QgaW4gYWxsIHRoZSBvdGhlciBjYXNlcyBpbiBpcmxhcF9ldmVudC5jLgorCSAqIEluIGFsbCB0aG9zZSBvdGhlciBjYXNlLCB3ZSBvbmx5IHNlbmQgYSB2ZXJ5IHNob3J0IG1hbmFnZW1lbnQKKwkgKiBmcmFtZSAoZmV3IGJ5dGVzKSwgc28gdGhlIGFkanVzdGVtZW50IHdvdWxkIGJlIGxvc3QgaW4gdGhlCisJICogbm9pc2UuLi4KKwkgKiBUaGUgZXhjZXB0aW9uIG9mIGNvdXJzZSBpcyBpcmxhcF9yZXNlbmRfcmVqZWN0ZWRfZnJhbWUoKS4KKwkgKiBKZWFuIElJICovCit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9zZW5kX2RhdGFfc2Vjb25kYXJ5X2ZpbmFsIChzZWxmLCBza2IpCisgKgorICogICAgU2VuZCBJKG5mb3JtYXRpb24pIGZyYW1lIGFzIHNlY29uZGFyeSB3aXRoIGZpbmFsIGJpdCBzZXQKKyAqCisgKi8KK3ZvaWQgaXJsYXBfc2VuZF9kYXRhX3NlY29uZGFyeV9maW5hbChzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsCisJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmICp0eF9za2IgPSBOVUxMOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKKworCS8qIElzIHRoaXMgcmVsaWFibGUgb3IgdW5yZWxpYWJsZSBkYXRhPyAqLworCWlmIChza2ItPmRhdGFbMV0gPT0gSV9GUkFNRSkgeworCisJCS8qCisJCSAqICBJbnNlcnQgZnJhbWUgc2VxdWVuY2UgbnVtYmVyIChWcykgaW4gY29udHJvbCBmaWVsZCBiZWZvcmUKKwkJICogIGluc2VydGluZyBpbnRvIHRyYW5zbWl0IHdpbmRvdyBxdWV1ZS4KKwkJICovCisJCXNrYi0+ZGF0YVsxXSA9IElfRlJBTUUgfCAoc2VsZi0+dnMgPDwgMSk7CisKKwkJLyoKKwkJICogIEluc2VydCBmcmFtZSBpbiBzdG9yZSwgaW4gY2FzZSBvZiByZXRyYW5zbWlzc2lvbnMKKwkJICogIEluY3JlYXNlIHNrYiByZWZlcmVuY2UgY291bnQsIHNlZSBpcmxhcF9kb19ldmVudCgpCisJCSAqLworCQlza2JfZ2V0KHNrYik7CisJCXNrYl9xdWV1ZV90YWlsKCZzZWxmLT53eF9saXN0LCBza2IpOworCisJCXR4X3NrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCQlpZiAodHhfc2tiID09IE5VTEwpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCXR4X3NrYi0+ZGF0YVsxXSB8PSBQRl9CSVQ7CisKKwkJc2VsZi0+dnMgPSAoc2VsZi0+dnMgKyAxKSAlIDg7CisJCXNlbGYtPmFja19yZXF1aXJlZCA9IEZBTFNFOworCisJCWlybGFwX3NlbmRfaV9mcmFtZShzZWxmLCB0eF9za2IsIFJTUF9GUkFNRSk7CisJfSBlbHNlIHsKKwkJaWYgKHNlbGYtPmFja19yZXF1aXJlZCkgeworCQkJaXJsYXBfc2VuZF91aV9mcmFtZShzZWxmLCBza2JfZ2V0KHNrYiksIHNlbGYtPmNhZGRyLCBSU1BfRlJBTUUpOworCQkJaXJsYXBfc2VuZF9ycl9mcmFtZShzZWxmLCBSU1BfRlJBTUUpOworCQkJc2VsZi0+YWNrX3JlcXVpcmVkID0gRkFMU0U7CisJCX0gZWxzZSB7CisJCQlza2ItPmRhdGFbMV0gfD0gUEZfQklUOworCQkJaXJsYXBfc2VuZF91aV9mcmFtZShzZWxmLCBza2JfZ2V0KHNrYiksIHNlbGYtPmNhZGRyLCBSU1BfRlJBTUUpOworCQl9CisJfQorCisJc2VsZi0+d2luZG93ID0gc2VsZi0+d2luZG93X3NpemU7CisjaWZkZWYgQ09ORklHX0lSREFfRFlOQU1JQ19XSU5ET1cKKwkvKiBXZSBhcmUgYWxsb3dlZCB0byB0cmFuc21pdCBhIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGFnYWluLiAqLworCXNlbGYtPmJ5dGVzX2xlZnQgPSBzZWxmLT5saW5lX2NhcGFjaXR5OworI2VuZGlmIC8qIENPTkZJR19JUkRBX0RZTkFNSUNfV0lORE9XICovCisKKwlpcmxhcF9zdGFydF93ZF90aW1lcihzZWxmLCBzZWxmLT53ZF90aW1lb3V0KTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3NlbmRfZGF0YV9zZWNvbmRhcnkgKHNlbGYsIHNrYikKKyAqCisgKiAgICBTZW5kIEkobmZvcm1hdGlvbikgZnJhbWUgYXMgc2Vjb25kYXJ5IHdpdGhvdXQgZmluYWwgYml0IHNldAorICoKKyAqLwordm9pZCBpcmxhcF9zZW5kX2RhdGFfc2Vjb25kYXJ5KHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiID0gTlVMTDsKKworCS8qIElzIHRoaXMgcmVsaWFibGUgb3IgdW5yZWxpYWJsZSBkYXRhPyAqLworCWlmIChza2ItPmRhdGFbMV0gPT0gSV9GUkFNRSkgeworCisJCS8qCisJCSAqICBJbnNlcnQgZnJhbWUgc2VxdWVuY2UgbnVtYmVyIChWcykgaW4gY29udHJvbCBmaWVsZCBiZWZvcmUKKwkJICogIGluc2VydGluZyBpbnRvIHRyYW5zbWl0IHdpbmRvdyBxdWV1ZS4KKwkJICovCisJCXNrYi0+ZGF0YVsxXSA9IElfRlJBTUUgfCAoc2VsZi0+dnMgPDwgMSk7CisKKwkJLyoKKwkJICogIEluc2VydCBmcmFtZSBpbiBzdG9yZSwgaW4gY2FzZSBvZiByZXRyYW5zbWlzc2lvbnMKKwkJICogIEluY3JlYXNlIHNrYiByZWZlcmVuY2UgY291bnQsIHNlZSBpcmxhcF9kb19ldmVudCgpCisJCSAqLworCQlza2JfZ2V0KHNrYik7CisJCXNrYl9xdWV1ZV90YWlsKCZzZWxmLT53eF9saXN0LCBza2IpOworCisJCXR4X3NrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCQlpZiAodHhfc2tiID09IE5VTEwpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCXNlbGYtPnZzID0gKHNlbGYtPnZzICsgMSkgJSA4OworCQlzZWxmLT5hY2tfcmVxdWlyZWQgPSBGQUxTRTsKKwkJc2VsZi0+d2luZG93IC09IDE7CisKKwkJaXJsYXBfc2VuZF9pX2ZyYW1lKHNlbGYsIHR4X3NrYiwgUlNQX0ZSQU1FKTsKKwl9IGVsc2UgeworCQlpcmxhcF9zZW5kX3VpX2ZyYW1lKHNlbGYsIHNrYl9nZXQoc2tiKSwgc2VsZi0+Y2FkZHIsIFJTUF9GUkFNRSk7CisJCXNlbGYtPndpbmRvdyAtPSAxOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3Jlc2VuZF9yZWplY3RlZF9mcmFtZXMgKG5yKQorICoKKyAqICAgIFJlc2VuZCBmcmFtZXMgd2hpY2ggaGFzIG5vdCBiZWVuIGFja25vd2xlZGdlZC4gU2hvdWxkIGJlIHNhZmUgdG8KKyAqICAgIHRyYXZlcnNlIHRoZSBsaXN0IHdpdGhvdXQgbG9ja2luZyBpdCBzaW5jZSB0aGlzIGZ1bmN0aW9uIHdpbGwgb25seSBiZQorICogICAgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQgKEJIKQorICovCit2b2lkIGlybGFwX3Jlc2VuZF9yZWplY3RlZF9mcmFtZXMoc3RydWN0IGlybGFwX2NiICpzZWxmLCBpbnQgY29tbWFuZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGNvdW50OworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCisJLyogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KKwljb3VudCA9IHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnd4X2xpc3QpOworCisJLyogIFJlc2VuZCB1bmFja25vd2xlZGdlZCBmcmFtZShzKSAqLworCXNrYiA9IHNrYl9wZWVrKCZzZWxmLT53eF9saXN0KTsKKwl3aGlsZSAoc2tiICE9IE5VTEwpIHsKKwkJaXJsYXBfd2FpdF9taW5fdHVybl9hcm91bmQoc2VsZiwgJnNlbGYtPnFvc190eCk7CisKKwkJLyogV2UgY29weSB0aGUgc2tiIHRvIGJlIHJldHJhbnNtaXR0ZWQgc2luY2Ugd2Ugd2lsbCBoYXZlIHRvCisJCSAqIG1vZGlmeSBpdC4gQ2xvbmluZyB3aWxsIGNvbmZ1c2UgcGFja2V0IHNuaWZmZXJzCisJCSAqLworCQkvKiB0eF9za2IgPSBza2JfY2xvbmUoIHNrYiwgR0ZQX0FUT01JQyk7ICovCisJCXR4X3NrYiA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CisJCWlmICghdHhfc2tiKSB7CisJCQlJUkRBX0RFQlVHKDAsICIlcygpLCB1bmFibGUgdG8gY29weVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybjsKKwkJfQorCQkvKiBVbmxpbmsgdHhfc2tiIGZyb20gbGlzdCAqLworCQl0eF9za2ItPm5leHQgPSB0eF9za2ItPnByZXYgPSBOVUxMOworCQl0eF9za2ItPmxpc3QgPSBOVUxMOworCisJCS8qIENsZWFyIG9sZCBOciBmaWVsZCArIHBvbGwgYml0ICovCisJCXR4X3NrYi0+ZGF0YVsxXSAmPSAweDBmOworCisJCS8qCisJCSAqICBTZXQgcG9sbCBiaXQgb24gdGhlIGxhc3QgZnJhbWUgcmV0cmFuc21pdHRlZAorCQkgKi8KKwkJaWYgKGNvdW50LS0gPT0gMSkKKwkJCXR4X3NrYi0+ZGF0YVsxXSB8PSBQRl9CSVQ7IC8qIFNldCBwL2YgYml0ICovCisJCWVsc2UKKwkJCXR4X3NrYi0+ZGF0YVsxXSAmPSB+UEZfQklUOyAvKiBDbGVhciBwL2YgYml0ICovCisKKwkJaXJsYXBfc2VuZF9pX2ZyYW1lKHNlbGYsIHR4X3NrYiwgY29tbWFuZCk7CisKKwkJLyoKKwkJICogIElmIG91ciBza2IgaXMgdGhlIGxhc3QgYnVmZmVyIGluIHRoZSBsaXN0LCB0aGVuCisJCSAqICB3ZSBhcmUgZmluaXNoZWQsIGlmIG5vdCwgbW92ZSB0byB0aGUgbmV4dCBzay1idWZmZXIKKwkJICovCisJCWlmIChza2IgPT0gc2tiX3BlZWtfdGFpbCgmc2VsZi0+d3hfbGlzdCkpCisJCQlza2IgPSBOVUxMOworCQllbHNlCisJCQlza2IgPSBza2ItPm5leHQ7CisJfQorI2lmIDAgLyogTm90IHlldCAqLworCS8qCisJICogIFdlIGNhbiBub3cgZmlsbCB0aGUgd2luZG93IHdpdGggYWRkaXRpb25hbCBkYXRhIGZyYW1lcworCSAqLworCXdoaWxlIChza2JfcXVldWVfbGVuKCAmc2VsZi0+dHhxKSA+IDApIHsKKworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBzZW5kaW5nIGFkZGl0aW9uYWwgZnJhbWVzIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJaWYgKChza2JfcXVldWVfbGVuKCAmc2VsZi0+dHhxKSA+IDApICYmCisJCSAgICAoc2VsZi0+d2luZG93ID4gMCkpIHsKKwkJCXNrYiA9IHNrYl9kZXF1ZXVlKCAmc2VsZi0+dHhxKTsKKwkJCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKKworCQkJLyoKKwkJCSAqICBJZiBzZW5kIHdpbmRvdyA+IDEgdGhlbiBzZW5kIGZyYW1lIHdpdGggcGYKKwkJCSAqICBiaXQgY2xlYXJlZAorCQkJICovCisJCQlpZiAoKHNlbGYtPndpbmRvdyA+IDEpICYmCisJCQkgICAgc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhxKSA+IDApCisJCQl7CisJCQkJaXJsYXBfc2VuZF9kYXRhX3ByaW1hcnkoc2VsZiwgc2tiKTsKKwkJCX0gZWxzZSB7CisJCQkJaXJsYXBfc2VuZF9kYXRhX3ByaW1hcnlfcG9sbChzZWxmLCBza2IpOworCQkJfQorCQkJa2ZyZWVfc2tiKHNrYik7CisJCX0KKwl9CisjZW5kaWYKK30KKwordm9pZCBpcmxhcF9yZXNlbmRfcmVqZWN0ZWRfZnJhbWUoc3RydWN0IGlybGFwX2NiICpzZWxmLCBpbnQgY29tbWFuZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CisKKwkvKiAgUmVzZW5kIHVuYWNrbm93bGVkZ2VkIGZyYW1lKHMpICovCisJc2tiID0gc2tiX3BlZWsoJnNlbGYtPnd4X2xpc3QpOworCWlmIChza2IgIT0gTlVMTCkgeworCQlpcmxhcF93YWl0X21pbl90dXJuX2Fyb3VuZChzZWxmLCAmc2VsZi0+cW9zX3R4KTsKKworCQkvKiBXZSBjb3B5IHRoZSBza2IgdG8gYmUgcmV0cmFuc21pdHRlZCBzaW5jZSB3ZSB3aWxsIGhhdmUgdG8KKwkJICogbW9kaWZ5IGl0LiBDbG9uaW5nIHdpbGwgY29uZnVzZSBwYWNrZXQgc25pZmZlcnMKKwkJICovCisJCS8qIHR4X3NrYiA9IHNrYl9jbG9uZSggc2tiLCBHRlBfQVRPTUlDKTsgKi8KKwkJdHhfc2tiID0gc2tiX2NvcHkoc2tiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCF0eF9za2IpIHsKKwkJCUlSREFfREVCVUcoMCwgIiVzKCksIHVuYWJsZSB0byBjb3B5XG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuOworCQl9CisJCS8qIFVubGluayB0eF9za2IgZnJvbSBsaXN0ICovCisJCXR4X3NrYi0+bmV4dCA9IHR4X3NrYi0+cHJldiA9IE5VTEw7CisJCXR4X3NrYi0+bGlzdCA9IE5VTEw7CisKKwkJLyogQ2xlYXIgb2xkIE5yIGZpZWxkICsgcG9sbCBiaXQgKi8KKwkJdHhfc2tiLT5kYXRhWzFdICY9IDB4MGY7CisKKwkJLyogIFNldCBwb2xsL2ZpbmFsIGJpdCAqLworCQl0eF9za2ItPmRhdGFbMV0gfD0gUEZfQklUOyAvKiBTZXQgcC9mIGJpdCAqLworCisJCWlybGFwX3NlbmRfaV9mcmFtZShzZWxmLCB0eF9za2IsIGNvbW1hbmQpOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3NlbmRfdWlfZnJhbWUgKHNlbGYsIHNrYiwgY29tbWFuZCkKKyAqCisgKiAgICBDb250cnVjdCBhbmQgdHJhbnNtaXQgYW4gVW5udW1iZXJlZCBJbmZvcm1hdGlvbiAoVUkpIGZyYW1lCisgKgorICovCit2b2lkIGlybGFwX3NlbmRfdWlfZnJhbWUoc3RydWN0IGlybGFwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJIF9fdTggY2FkZHIsIGludCBjb21tYW5kKQoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOworCisJLyogSW5zZXJ0IGNvbm5lY3Rpb24gYWRkcmVzcyAqLworCXNrYi0+ZGF0YVswXSA9IGNhZGRyIHwgKChjb21tYW5kKSA/IENNRF9GUkFNRSA6IDApOworCisJaXJsYXBfcXVldWVfeG1pdChzZWxmLCBza2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfc2VuZF9pX2ZyYW1lIChza2IpCisgKgorICogICAgQ29udHJ1Y3QgYW5kIHRyYW5zbWl0IEluZm9ybWF0aW9uIChJKSBmcmFtZQorICovCitzdGF0aWMgdm9pZCBpcmxhcF9zZW5kX2lfZnJhbWUoc3RydWN0IGlybGFwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIGludCBjb21tYW5kKQoreworCS8qIEluc2VydCBjb25uZWN0aW9uIGFkZHJlc3MgKi8KKwlza2ItPmRhdGFbMF0gPSBzZWxmLT5jYWRkcjsKKwlza2ItPmRhdGFbMF0gfD0gKGNvbW1hbmQpID8gQ01EX0ZSQU1FIDogMDsKKworCS8qIEluc2VydCBuZXh0IHRvIHJlY2VpdmUgKFZyKSAqLworCXNrYi0+ZGF0YVsxXSB8PSAoc2VsZi0+dnIgPDwgNSk7ICAvKiBpbnNlcnQgbnIgKi8KKworCWlybGFwX3F1ZXVlX3htaXQoc2VsZiwgc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3JlY3ZfaV9mcmFtZSAoc2tiLCBmcmFtZSkKKyAqCisgKiAgICBSZWNlaXZlIGFuZCBwYXJzZSBhbiBJIChJbmZvcm1hdGlvbikgZnJhbWUsIG5vIGhhcm0gaW4gbWFraW5nIGl0IGlubGluZQorICogICAgc2luY2UgaXQncyBjYWxsZWQgb25seSBmcm9tIG9uZSBzaW5nbGUgcGxhY2UgKGlybGFwX2RyaXZlcl9yY3YpLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXJsYXBfcmVjdl9pX2ZyYW1lKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgIHN0cnVjdCBpcmxhcF9pbmZvICppbmZvLCBpbnQgY29tbWFuZCkKK3sKKwlpbmZvLT5uciA9IHNrYi0+ZGF0YVsxXSA+PiA1OyAgICAgICAgICAvKiBOZXh0IHRvIHJlY2VpdmUgKi8KKwlpbmZvLT5wZiA9IHNrYi0+ZGF0YVsxXSAmIFBGX0JJVDsgICAgICAvKiBGaW5hbCBiaXQgKi8KKwlpbmZvLT5ucyA9IChza2ItPmRhdGFbMV0gPj4gMSkgJiAweDA3OyAvKiBOZXh0IHRvIHNlbmQgKi8KKworCS8qIENoZWNrIGlmIHRoaXMgaXMgYSBjb21tYW5kIG9yIGEgcmVzcG9uc2UgZnJhbWUgKi8KKwlpZiAoY29tbWFuZCkKKwkJaXJsYXBfZG9fZXZlbnQoc2VsZiwgUkVDVl9JX0NNRCwgc2tiLCBpbmZvKTsKKwllbHNlCisJCWlybGFwX2RvX2V2ZW50KHNlbGYsIFJFQ1ZfSV9SU1AsIHNrYiwgaW5mbyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9yZWN2X3VpX2ZyYW1lIChzZWxmLCBza2IsIGluZm8pCisgKgorICogICAgUmVjZWl2ZSBhbmQgcGFyc2UgYW4gVW5udW1iZXJlZCBJbmZvcm1hdGlvbiAoVUkpIGZyYW1lCisgKgorICovCitzdGF0aWMgdm9pZCBpcmxhcF9yZWN2X3VpX2ZyYW1lKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQlzdHJ1Y3QgaXJsYXBfaW5mbyAqaW5mbykKK3sKKwlJUkRBX0RFQlVHKCA0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWluZm8tPnBmID0gc2tiLT5kYXRhWzFdICYgUEZfQklUOyAgICAgIC8qIEZpbmFsIGJpdCAqLworCisJaXJsYXBfZG9fZXZlbnQoc2VsZiwgUkVDVl9VSV9GUkFNRSwgc2tiLCBpbmZvKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3JlY3ZfZnJtcl9mcmFtZSAoc2tiLCBmcmFtZSkKKyAqCisgKiAgICBSZWNlaXZlZCBGcmFtZSBSZWplY3QgcmVzcG9uc2UuCisgKgorICovCitzdGF0aWMgdm9pZCBpcmxhcF9yZWN2X2ZybXJfZnJhbWUoc3RydWN0IGlybGFwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgc3RydWN0IGlybGFwX2luZm8gKmluZm8pCit7CisJX191OCAqZnJhbWU7CisJaW50IHcsIHgsIHksIHo7CisKKwlJUkRBX0RFQlVHKDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChpbmZvICE9IE5VTEwsIHJldHVybjspOworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgNCkpIHsKKwkJSVJEQV9FUlJPUigiJXM6IGZyYW1lIHRvIHNob3J0IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCWZyYW1lID0gc2tiLT5kYXRhOworCisJaW5mby0+bnIgPSBmcmFtZVsyXSA+PiA1OyAgICAgICAgICAvKiBOZXh0IHRvIHJlY2VpdmUgKi8KKwlpbmZvLT5wZiA9IGZyYW1lWzJdICYgUEZfQklUOyAgICAgIC8qIEZpbmFsIGJpdCAqLworCWluZm8tPm5zID0gKGZyYW1lWzJdID4+IDEpICYgMHgwNzsgLyogTmV4dCB0byBzZW5kICovCisKKwl3ID0gZnJhbWVbM10gJiAweDAxOworCXggPSBmcmFtZVszXSAmIDB4MDI7CisJeSA9IGZyYW1lWzNdICYgMHgwNDsKKwl6ID0gZnJhbWVbM10gJiAweDA4OworCisJaWYgKHcpIHsKKwkJSVJEQV9ERUJVRygwLCAiUmVqZWN0ZWQgY29udHJvbCBmaWVsZCBpcyB1bmRlZmluZWQgb3Igbm90ICIKKwkJICAgICAgImltcGxlbWVudGVkLlxuIik7CisJfQorCWlmICh4KSB7CisJCUlSREFfREVCVUcoMCwgIlJlamVjdGVkIGNvbnRyb2wgZmllbGQgd2FzIGludmFsaWQgYmVjYXVzZSBpdCAiCisJCSAgICAgICJjb250YWluZWQgYSBub24gcGVybWl0dGVkIEkgZmllbGQuXG4iKTsKKwl9CisJaWYgKHkpIHsKKwkJSVJEQV9ERUJVRygwLCAiUmVjZWl2ZWQgSSBmaWVsZCBleGNlZWRlZCB0aGUgbWF4aW11bSBuZWdvdGlhdGVkICIKKwkJICAgICAgImZvciB0aGUgZXhpc3RpbmcgY29ubmVjdGlvbiBvciBleGNlZWRlZCB0aGUgbWF4aW11bSAiCisJCSAgICAgICJ0aGlzIHN0YXRpb24gc3VwcG9ydHMgaWYgbm8gY29ubmVjdGlvbiBleGlzdHMuXG4iKTsKKwl9CisJaWYgKHopIHsKKwkJSVJEQV9ERUJVRygwLCAiUmVqZWN0ZWQgY29udHJvbCBmaWVsZCBjb250cm9sIGZpZWxkIGNvbnRhaW5lZCBhbiAiCisJCSAgICAgICJpbnZhbGlkIE5yIGNvdW50LlxuIik7CisJfQorCWlybGFwX2RvX2V2ZW50KHNlbGYsIFJFQ1ZfRlJNUl9SU1AsIHNrYiwgaW5mbyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9zZW5kX3Rlc3RfZnJhbWUgKHNlbGYsIGRhZGRyKQorICoKKyAqICAgIFNlbmQgYSB0ZXN0IGZyYW1lIHJlc3BvbnNlCisgKgorICovCit2b2lkIGlybGFwX3NlbmRfdGVzdF9mcmFtZShzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIF9fdTggY2FkZHIsIF9fdTMyIGRhZGRyLAorCQkJICAgc3RydWN0IHNrX2J1ZmYgKmNtZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOworCXN0cnVjdCB0ZXN0X2ZyYW1lICpmcmFtZTsKKwlfX3U4ICppbmZvOworCisJdHhfc2tiID0gZGV2X2FsbG9jX3NrYihjbWQtPmxlbitzaXplb2Yoc3RydWN0IHRlc3RfZnJhbWUpKTsKKwlpZiAoIXR4X3NrYikKKwkJcmV0dXJuOworCisJLyogQnJvYWRjYXN0IGZyYW1lcyBtdXN0IGluY2x1ZGUgc2FkZHIgYW5kIGRhZGRyIGZpZWxkcyAqLworCWlmIChjYWRkciA9PSBDQlJPQURDQVNUKSB7CisJCWZyYW1lID0gKHN0cnVjdCB0ZXN0X2ZyYW1lICopCisJCQlza2JfcHV0KHR4X3NrYiwgc2l6ZW9mKHN0cnVjdCB0ZXN0X2ZyYW1lKSk7CisKKwkJLyogSW5zZXJ0IHRoZSBzd2FwcGVkIGFkZHJlc3NlcyAqLworCQlmcmFtZS0+c2FkZHIgPSBjcHVfdG9fbGUzMihzZWxmLT5zYWRkcik7CisJCWZyYW1lLT5kYWRkciA9IGNwdV90b19sZTMyKGRhZGRyKTsKKwl9IGVsc2UKKwkJZnJhbWUgPSAoc3RydWN0IHRlc3RfZnJhbWUgKikgc2tiX3B1dCh0eF9za2IsIExBUF9BRERSX0hFQURFUiArIExBUF9DVFJMX0hFQURFUik7CisKKwlmcmFtZS0+Y2FkZHIgPSBjYWRkcjsKKwlmcmFtZS0+Y29udHJvbCA9IFRFU1RfUlNQIHwgUEZfQklUOworCisJLyogQ29weSBpbmZvICovCisJaW5mbyA9IHNrYl9wdXQodHhfc2tiLCBjbWQtPmxlbik7CisJbWVtY3B5KGluZm8sIGNtZC0+ZGF0YSwgY21kLT5sZW4pOworCisJLyogUmV0dXJuIHRvIHNlbmRlciAqLworCWlybGFwX3dhaXRfbWluX3R1cm5fYXJvdW5kKHNlbGYsICZzZWxmLT5xb3NfdHgpOworCWlybGFwX3F1ZXVlX3htaXQoc2VsZiwgdHhfc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX3JlY3ZfdGVzdF9mcmFtZSAoc2VsZiwgc2tiKQorICoKKyAqICAgIFJlY2VpdmUgYSB0ZXN0IGZyYW1lCisgKgorICovCitzdGF0aWMgdm9pZCBpcmxhcF9yZWN2X3Rlc3RfZnJhbWUoc3RydWN0IGlybGFwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgc3RydWN0IGlybGFwX2luZm8gKmluZm8sIGludCBjb21tYW5kKQoreworCXN0cnVjdCB0ZXN0X2ZyYW1lICpmcmFtZTsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2YoKmZyYW1lKSkpIHsKKwkJSVJEQV9FUlJPUigiJXM6IGZyYW1lIHRvIHNob3J0IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKwlmcmFtZSA9IChzdHJ1Y3QgdGVzdF9mcmFtZSAqKSBza2ItPmRhdGE7CisKKwkvKiBCcm9hZGNhc3QgZnJhbWVzIG11c3QgY2Fycnkgc2FkZHIgYW5kIGRhZGRyIGZpZWxkcyAqLworCWlmIChpbmZvLT5jYWRkciA9PSBDQlJPQURDQVNUKSB7CisJCWlmIChza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgdGVzdF9mcmFtZSkpIHsKKwkJCUlSREFfREVCVUcoMCwgIiVzKCkgdGVzdCBmcmFtZSB0byBzaG9ydCFcbiIsCisJCQkJICAgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIFJlYWQgYW5kIHN3YXAgYWRkcmVzc2VzICovCisJCWluZm8tPmRhZGRyID0gbGUzMl90b19jcHUoZnJhbWUtPnNhZGRyKTsKKwkJaW5mby0+c2FkZHIgPSBsZTMyX3RvX2NwdShmcmFtZS0+ZGFkZHIpOworCisJCS8qIE1ha2Ugc3VyZSBmcmFtZSBpcyBhZGRyZXNzZWQgdG8gdXMgKi8KKwkJaWYgKChpbmZvLT5zYWRkciAhPSBzZWxmLT5zYWRkcikgJiYKKwkJICAgIChpbmZvLT5zYWRkciAhPSBCUk9BRENBU1QpKSB7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlpZiAoY29tbWFuZCkKKwkJaXJsYXBfZG9fZXZlbnQoc2VsZiwgUkVDVl9URVNUX0NNRCwgc2tiLCBpbmZvKTsKKwllbHNlCisJCWlybGFwX2RvX2V2ZW50KHNlbGYsIFJFQ1ZfVEVTVF9SU1AsIHNrYiwgaW5mbyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9kcml2ZXJfcmN2IChza2IsIG5ldGRldiwgcHR5cGUpCisgKgorICogICAgQ2FsbGVkIHdoZW4gYSBmcmFtZSBpcyByZWNlaXZlZC4gRGlzcGF0Y2hlcyB0aGUgcmlnaHQgcmVjZWl2ZSBmdW5jdGlvbgorICogICAgZm9yIHByb2Nlc3Npbmcgb2YgdGhlIGZyYW1lLgorICoKKyAqIE5vdGUgb24gc2tiIG1hbmFnZW1lbnQgOgorICogQWZ0ZXIgY2FsbGluZyB0aGUgaGlnaGVyIGxheWVycyBvZiB0aGUgSXJEQSBzdGFjaywgd2UgYWx3YXlzCisgKiBrZnJlZSgpIHRoZSBza2IsIHdoaWNoIGRyb3AgdGhlIHJlZmVyZW5jZSBjb3VudCAoYW5kIHBvdGVudGlhbGx5CisgKiBkZXN0cm95IGl0KS4KKyAqIElmIGEgaGlnaGVyIGxheWVyIG9mIHRoZSBzdGFjayB3YW50IHRvIGtlZXAgdGhlIHNrYiBhcm91bmQgKHRvIHB1dAorICogaW4gYSBxdWV1ZSBvciBwYXNzIGl0IHRvIHRoZSBoaWdoZXIgbGF5ZXIpLCBpdCB3aWxsIG5lZWQgdG8gdXNlCisgKiBza2JfZ2V0KCkgdG8ga2VlcCBhIHJlZmVyZW5jZSBvbiBpdC4gVGhpcyBpcyB1c3VhbGx5IGRvbmUgYXQgdGhlCisgKiBMTVAgbGV2ZWwgaW4gaXJsbXAuYy4KKyAqIEplYW4gSUkKKyAqLworaW50IGlybGFwX2RyaXZlcl9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0eXBlKQoreworCXN0cnVjdCBpcmxhcF9pbmZvIGluZm87CisJc3RydWN0IGlybGFwX2NiICpzZWxmOworCWludCBjb21tYW5kOworCV9fdTggY29udHJvbDsKKworCS8qIEZJWE1FOiBzaG91bGQgd2UgZ2V0IG91ciBvd24gZmllbGQ/ICovCisJc2VsZiA9IChzdHJ1Y3QgaXJsYXBfY2IgKikgZGV2LT5hdGFsa19wdHI7CisKKwkvKiBJZiB0aGUgbmV0IGRldmljZSBpcyBkb3duLCB0aGVuIElyTEFQIGlzIGdvbmUhICovCisJaWYgKCFzZWxmIHx8IHNlbGYtPm1hZ2ljICE9IExBUF9NQUdJQykgeworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBXZSBhcmUgbm8gbG9uZ2VyIGFuICJvbGQiIHByb3RvY29sLCBzbyB3ZSBuZWVkIHRvIGhhbmRsZQorCSAqIHNoYXJlIGFuZCBub24gbGluZWFyIHNrYnMuIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgc28KKwkgKiB3ZSBkb24ndCBuZWVkIHRvIGJlIGNsZXZlciBhYm91dCBpdC4gSmVhbiBJSSAqLworCWlmICgoc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwkJSVJEQV9FUlJPUigiJXM6IGNhbid0IGNsb25lIHNoYXJlZCBza2IhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBDaGVjayBpZiBmcmFtZSBpcyBsYXJnZSBlbm91Z2ggZm9yIHBhcnNpbmcgKi8KKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCAyKSkgeworCQlJUkRBX0VSUk9SKCIlczogZnJhbWUgdG8gc2hvcnQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAtMTsKKwl9CisKKwljb21tYW5kICAgID0gc2tiLT5kYXRhWzBdICYgQ01EX0ZSQU1FOworCWluZm8uY2FkZHIgPSBza2ItPmRhdGFbMF0gJiBDQlJPQURDQVNUOworCisJaW5mby5wZiAgICAgID0gc2tiLT5kYXRhWzFdICYgIFBGX0JJVDsKKwlpbmZvLmNvbnRyb2wgPSBza2ItPmRhdGFbMV0gJiB+UEZfQklUOyAvKiBNYXNrIGF3YXkgcG9sbC9maW5hbCBiaXQgKi8KKworCWNvbnRyb2wgPSBpbmZvLmNvbnRyb2w7CisKKwkvKiAgRmlyc3Qgd2UgY2hlY2sgaWYgdGhpcyBmcmFtZSBoYXMgYSB2YWxpZCBjb25uZWN0aW9uIGFkZHJlc3MgKi8KKwlpZiAoKGluZm8uY2FkZHIgIT0gc2VsZi0+Y2FkZHIpICYmIChpbmZvLmNhZGRyICE9IENCUk9BRENBU1QpKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIHdyb25nIGNvbm5lY3Rpb24gYWRkcmVzcyFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dDsKKwl9CisJLyoKKwkgKiAgT3B0aW1pemUgZm9yIHRoZSBjb21tb24gY2FzZSBhbmQgY2hlY2sgaWYgdGhlIGZyYW1lIGlzIGFuCisJICogIEkobmZvcm1hdGlvbikgZnJhbWUuIE9ubHkgSS1mcmFtZXMgaGF2ZSBiaXQgMCBzZXQgdG8gMAorCSAqLworCWlmICh+Y29udHJvbCAmIDB4MDEpIHsKKwkJaXJsYXBfcmVjdl9pX2ZyYW1lKHNlbGYsIHNrYiwgJmluZm8sIGNvbW1hbmQpOworCQlnb3RvIG91dDsKKwl9CisJLyoKKwkgKiAgV2Ugbm93IGNoZWNrIGlzIHRoZSBmcmFtZSBpcyBhbiBTKHVwZXJ2aXNvcnkpIGZyYW1lLiBPbmx5CisJICogIFMtZnJhbWVzIGhhdmUgYml0IDAgc2V0IHRvIDEgYW5kIGJpdCAxIHNldCB0byAwCisJICovCisJaWYgKH5jb250cm9sICYgMHgwMikgeworCQkvKgorCQkgKiAgUmVjZWl2ZWQgUyh1cGVydmlzb3J5KSBmcmFtZSwgY2hlY2sgd2hpY2ggZnJhbWUgdHlwZSBpdCBpcworCQkgKiAgb25seSB0aGUgZmlyc3QgbmliYmxlIGlzIG9mIGludGVyZXN0CisJCSAqLworCQlzd2l0Y2ggKGNvbnRyb2wgJiAweDBmKSB7CisJCWNhc2UgUlI6CisJCQlpcmxhcF9yZWN2X3JyX2ZyYW1lKHNlbGYsIHNrYiwgJmluZm8sIGNvbW1hbmQpOworCQkJYnJlYWs7CisJCWNhc2UgUk5SOgorCQkJaXJsYXBfcmVjdl9ybnJfZnJhbWUoc2VsZiwgc2tiLCAmaW5mbywgY29tbWFuZCk7CisJCQlicmVhazsKKwkJY2FzZSBSRUo6CisJCQlpcmxhcF9yZWN2X3Jlal9mcmFtZShzZWxmLCBza2IsICZpbmZvLCBjb21tYW5kKTsKKwkJCWJyZWFrOworCQljYXNlIFNSRUo6CisJCQlpcmxhcF9yZWN2X3NyZWpfZnJhbWUoc2VsZiwgc2tiLCAmaW5mbywgY29tbWFuZCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUlSREFfV0FSTklORygiJXM6IFVua25vd24gUy1mcmFtZSAlMDJ4IHJlY2VpdmVkIVxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGluZm8uY29udHJvbCk7CisJCQlicmVhazsKKwkJfQorCQlnb3RvIG91dDsKKwl9CisJLyoKKwkgKiAgVGhpcyBtdXN0IGJlIGEgQyhvbnRyb2wpIGZyYW1lCisJICovCisJc3dpdGNoIChjb250cm9sKSB7CisJY2FzZSBYSURfUlNQOgorCQlpcmxhcF9yZWN2X2Rpc2NvdmVyeV94aWRfcnNwKHNlbGYsIHNrYiwgJmluZm8pOworCQlicmVhazsKKwljYXNlIFhJRF9DTUQ6CisJCWlybGFwX3JlY3ZfZGlzY292ZXJ5X3hpZF9jbWQoc2VsZiwgc2tiLCAmaW5mbyk7CisJCWJyZWFrOworCWNhc2UgU05STV9DTUQ6CisJCWlybGFwX3JlY3Zfc25ybV9jbWQoc2VsZiwgc2tiLCAmaW5mbyk7CisJCWJyZWFrOworCWNhc2UgRE1fUlNQOgorCQlpcmxhcF9kb19ldmVudChzZWxmLCBSRUNWX0RNX1JTUCwgc2tiLCAmaW5mbyk7CisJCWJyZWFrOworCWNhc2UgRElTQ19DTUQ6IC8qIEFuZCBSRF9SU1Agc2luY2UgdGhleSBoYXZlIHRoZSBzYW1lIHZhbHVlICovCisJCWlybGFwX3JlY3ZfZGlzY19mcmFtZShzZWxmLCBza2IsICZpbmZvLCBjb21tYW5kKTsKKwkJYnJlYWs7CisJY2FzZSBURVNUX0NNRDoKKwkJaXJsYXBfcmVjdl90ZXN0X2ZyYW1lKHNlbGYsIHNrYiwgJmluZm8sIGNvbW1hbmQpOworCQlicmVhazsKKwljYXNlIFVBX1JTUDoKKwkJaXJsYXBfcmVjdl91YV9mcmFtZShzZWxmLCBza2IsICZpbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBGUk1SX1JTUDoKKwkJaXJsYXBfcmVjdl9mcm1yX2ZyYW1lKHNlbGYsIHNrYiwgJmluZm8pOworCQlicmVhazsKKwljYXNlIFVJX0ZSQU1FOgorCQlpcmxhcF9yZWN2X3VpX2ZyYW1lKHNlbGYsIHNrYiwgJmluZm8pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmtub3duIGZyYW1lICUwMnggcmVjZWl2ZWQhXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgaW5mby5jb250cm9sKTsKKwkJYnJlYWs7CisJfQorb3V0OgorCS8qIEFsd2F5cyBkcm9wIG91ciByZWZlcmVuY2Ugb24gdGhlIHNrYiAqLworCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lybG1wLmMgYi9uZXQvaXJkYS9pcmxtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNGE0ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcmxtcC5jCkBAIC0wLDAgKzEsMjA0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZpbGVuYW1lOiAgICAgIGlybG1wLmMKKyAqIFZlcnNpb246ICAgICAgIDEuMAorICogRGVzY3JpcHRpb246ICAgSXJEQSBMaW5rIE1hbmFnZW1lbnQgUHJvdG9jb2wgKExNUCkgbGF5ZXIKKyAqIFN0YXR1czogICAgICAgIFN0YWJsZS4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFN1biBBdWcgMTcgMjA6NTQ6MzIgMTk5NworICogTW9kaWZpZWQgYXQ6ICAgV2VkIEphbiAgNSAxMToyNjowMyAyMDAwCisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKgorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4sCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcworICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL3RpbWVyLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvcW9zLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXBfZnJhbWUuaD4KKworc3RhdGljIF9fdTggaXJsbXBfZmluZF9mcmVlX3Nsc2FwKHZvaWQpOworc3RhdGljIGludCBpcmxtcF9zbHNhcF9pbnVzZShfX3U4IHNsc2FwX3NlbCk7CisKKy8qIE1hc3RlciBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBpcmxtcF9jYiAqaXJsbXAgPSBOVUxMOworCisvKiBUaGVzZSBjYW4gYmUgYWx0ZXJlZCBieSB0aGUgc3lzY3RsIGludGVyZmFjZSAqLworaW50ICBzeXNjdGxfZGlzY292ZXJ5ICAgICAgICAgPSAwOworaW50ICBzeXNjdGxfZGlzY292ZXJ5X3RpbWVvdXQgPSAzOyAvKiAzIHNlY29uZHMgYnkgZGVmYXVsdCAqLworRVhQT1JUX1NZTUJPTChzeXNjdGxfZGlzY292ZXJ5X3RpbWVvdXQpOworaW50ICBzeXNjdGxfZGlzY292ZXJ5X3Nsb3RzICAgPSA2OyAvKiA2IHNsb3RzIGJ5IGRlZmF1bHQgKi8KK2ludCAgc3lzY3RsX2xhcF9rZWVwYWxpdmVfdGltZSA9IExNX0lETEVfVElNRU9VVCAqIDEwMDAgLyBIWjsKK2NoYXIgc3lzY3RsX2Rldm5hbWVbNjVdOworCitjb25zdCBjaGFyICppcmxtcF9yZWFzb25zW10gPSB7CisJIkVSUk9SLCBOT1QgVVNFRCIsCisJIkxNX1VTRVJfUkVRVUVTVCIsCisJIkxNX0xBUF9ESVNDT05ORUNUIiwKKwkiTE1fQ09OTkVDVF9GQUlMVVJFIiwKKwkiTE1fTEFQX1JFU0VUIiwKKwkiTE1fSU5JVF9ESVNDT05ORUNUIiwKKwkiRVJST1IsIE5PVCBVU0VEIiwKK307CitFWFBPUlRfU1lNQk9MKGlybG1wX3JlYXNvbnMpOworCisvKgorICogRnVuY3Rpb24gaXJsbXBfaW5pdCAodm9pZCkKKyAqCisgKiAgICBDcmVhdGUgKGFsbG9jYXRlKSB0aGUgbWFpbiBJckxNUCBzdHJ1Y3R1cmUKKyAqCisgKi8KK2ludCBfX2luaXQgaXJsbXBfaW5pdCh2b2lkKQoreworCUlSREFfREVCVUcoMSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJLyogSW5pdGlhbGl6ZSB0aGUgaXJsbXAgc3RydWN0dXJlLiAqLworCWlybG1wID0ga21hbGxvYyggc2l6ZW9mKHN0cnVjdCBpcmxtcF9jYiksIEdGUF9LRVJORUwpOworCWlmIChpcmxtcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoaXJsbXAsIDAsIHNpemVvZihzdHJ1Y3QgaXJsbXBfY2IpKTsKKworCWlybG1wLT5tYWdpYyA9IExNUF9NQUdJQzsKKworCWlybG1wLT5jbGllbnRzID0gaGFzaGJpbl9uZXcoSEJfTE9DSyk7CisJaXJsbXAtPnNlcnZpY2VzID0gaGFzaGJpbl9uZXcoSEJfTE9DSyk7CisJaXJsbXAtPmxpbmtzID0gaGFzaGJpbl9uZXcoSEJfTE9DSyk7CisJaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzID0gaGFzaGJpbl9uZXcoSEJfTE9DSyk7CisJaXJsbXAtPmNhY2hlbG9nID0gaGFzaGJpbl9uZXcoSEJfTk9MT0NLKTsKKworCWlmICgoaXJsbXAtPmNsaWVudHMgPT0gTlVMTCkgfHwKKwkgICAgKGlybG1wLT5zZXJ2aWNlcyA9PSBOVUxMKSB8fAorCSAgICAoaXJsbXAtPmxpbmtzID09IE5VTEwpIHx8CisJICAgIChpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMgPT0gTlVMTCkgfHwKKwkgICAgKGlybG1wLT5jYWNoZWxvZyA9PSBOVUxMKSkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmaXJsbXAtPmNhY2hlbG9nLT5oYl9zcGlubG9jayk7CisKKwlpcmxtcC0+bGFzdF9sc2FwX3NlbCA9IDB4MGY7IC8qIFJlc2VydmVkIDB4MDAtMHgwZiAqLworCXN0cmNweShzeXNjdGxfZGV2bmFtZSwgIkxpbnV4Iik7CisKKwkvKiBEbyBkaXNjb3ZlcnkgZXZlcnkgMyBzZWNvbmRzICovCisJaW5pdF90aW1lcigmaXJsbXAtPmRpc2NvdmVyeV90aW1lcik7CisJaXJsbXBfc3RhcnRfZGlzY292ZXJ5X3RpbWVyKGlybG1wLCBzeXNjdGxfZGlzY292ZXJ5X3RpbWVvdXQqSFopOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9jbGVhbnVwICh2b2lkKQorICoKKyAqICAgIFJlbW92ZSBJckxNUCBsYXllcgorICoKKyAqLwordm9pZCBfX2V4aXQgaXJsbXBfY2xlYW51cCh2b2lkKSAKK3sKKwkvKiBDaGVjayBmb3IgbWFpbiBzdHJ1Y3R1cmUgKi8KKwlJUkRBX0FTU0VSVChpcmxtcCAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChpcmxtcC0+bWFnaWMgPT0gTE1QX01BR0lDLCByZXR1cm47KTsKKworCWRlbF90aW1lcigmaXJsbXAtPmRpc2NvdmVyeV90aW1lcik7CisKKwloYXNoYmluX2RlbGV0ZShpcmxtcC0+bGlua3MsIChGUkVFX0ZVTkMpIGtmcmVlKTsKKwloYXNoYmluX2RlbGV0ZShpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMsIChGUkVFX0ZVTkMpIGtmcmVlKTsKKwloYXNoYmluX2RlbGV0ZShpcmxtcC0+Y2xpZW50cywgKEZSRUVfRlVOQykga2ZyZWUpOworCWhhc2hiaW5fZGVsZXRlKGlybG1wLT5zZXJ2aWNlcywgKEZSRUVfRlVOQykga2ZyZWUpOworCWhhc2hiaW5fZGVsZXRlKGlybG1wLT5jYWNoZWxvZywgKEZSRUVfRlVOQykga2ZyZWUpOworCisJLyogRGUtYWxsb2NhdGUgbWFpbiBzdHJ1Y3R1cmUgKi8KKwlrZnJlZShpcmxtcCk7CisJaXJsbXAgPSBOVUxMOworfQorCisvKgorICogRnVuY3Rpb24gaXJsbXBfb3Blbl9sc2FwIChzbHNhcCwgbm90aWZ5KQorICoKKyAqICAgUmVnaXN0ZXIgd2l0aCBJckxNUCBhbmQgY3JlYXRlIGEgbG9jYWwgTFNBUCwKKyAqICAgcmV0dXJucyBoYW5kbGUgdG8gTFNBUC4KKyAqLworc3RydWN0IGxzYXBfY2IgKmlybG1wX29wZW5fbHNhcChfX3U4IHNsc2FwX3NlbCwgbm90aWZ5X3QgKm5vdGlmeSwgX191OCBwaWQpCit7CisJc3RydWN0IGxzYXBfY2IgKnNlbGY7CisKKwlJUkRBX0FTU0VSVChub3RpZnkgIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKKwlJUkRBX0FTU0VSVChpcmxtcCAhPSBOVUxMLCByZXR1cm4gTlVMTDspOworCUlSREFfQVNTRVJUKGlybG1wLT5tYWdpYyA9PSBMTVBfTUFHSUMsIHJldHVybiBOVUxMOyk7CisJSVJEQV9BU1NFUlQobm90aWZ5LT5pbnN0YW5jZSAhPSBOVUxMLCByZXR1cm4gTlVMTDspOworCisJLyogIERvZXMgdGhlIGNsaWVudCBjYXJlIHdoaWNoIFNvdXJjZSBMU0FQIHNlbGVjdG9yIGl0IGdldHM/ICAqLworCWlmIChzbHNhcF9zZWwgPT0gTFNBUF9BTlkpIHsKKwkJc2xzYXBfc2VsID0gaXJsbXBfZmluZF9mcmVlX3Nsc2FwKCk7CisJCWlmICghc2xzYXBfc2VsKQorCQkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIGlmIChpcmxtcF9zbHNhcF9pbnVzZShzbHNhcF9zZWwpKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIEFsbG9jYXRlIG5ldyBpbnN0YW5jZSBvZiBhIExTQVAgY29ubmVjdGlvbiAqLworCXNlbGYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbHNhcF9jYiksIEdGUF9BVE9NSUMpOworCWlmIChzZWxmID09IE5VTEwpIHsKKwkJSVJEQV9FUlJPUigiJXM6IGNhbid0IGFsbG9jYXRlIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldChzZWxmLCAwLCBzaXplb2Yoc3RydWN0IGxzYXBfY2IpKTsKKworCXNlbGYtPm1hZ2ljID0gTE1QX0xTQVBfTUFHSUM7CisJc2VsZi0+c2xzYXBfc2VsID0gc2xzYXBfc2VsOworCisJLyogRml4IGNvbm5lY3Rpb25sZXNzIExTQVAncyAqLworCWlmIChzbHNhcF9zZWwgPT0gTFNBUF9DT05OTEVTUykgeworI2lmZGVmIENPTkZJR19JUkRBX1VMVFJBCisJCXNlbGYtPmRsc2FwX3NlbCA9IExTQVBfQ09OTkxFU1M7CisJCXNlbGYtPnBpZCA9IHBpZDsKKyNlbmRpZiAvKiBDT05GSUdfSVJEQV9VTFRSQSAqLworCX0gZWxzZQorCQlzZWxmLT5kbHNhcF9zZWwgPSBMU0FQX0FOWTsKKwkvKiBzZWxmLT5jb25uZWN0ZWQgPSBGQUxTRTsgLT4gYWxyZWFkeSBOVUxMIHZpYSBtZW1zZXQoKSAqLworCisJaW5pdF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOworCisJc2VsZi0+bm90aWZ5ID0gKm5vdGlmeTsKKworCXNlbGYtPmxzYXBfc3RhdGUgPSBMU0FQX0RJU0NPTk5FQ1RFRDsKKworCS8qIEluc2VydCBpbnRvIHF1ZXVlIG9mIHVuY29ubmVjdGVkIExTQVBzICovCisJaGFzaGJpbl9pbnNlcnQoaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzLCAoaXJkYV9xdWV1ZV90ICopIHNlbGYsCisJCSAgICAgICAobG9uZykgc2VsZiwgTlVMTCk7CisKKwlyZXR1cm4gc2VsZjsKK30KK0VYUE9SVF9TWU1CT0woaXJsbXBfb3Blbl9sc2FwKTsKKworLyoKKyAqIEZ1bmN0aW9uIF9faXJsbXBfY2xvc2VfbHNhcCAoc2VsZikKKyAqCisgKiAgICBSZW1vdmUgYW4gaW5zdGFuY2Ugb2YgTFNBUAorICovCitzdGF0aWMgdm9pZCBfX2lybG1wX2Nsb3NlX2xzYXAoc3RydWN0IGxzYXBfY2IgKnNlbGYpCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xTQVBfTUFHSUMsIHJldHVybjspOworCisJLyoKKwkgKiAgU2V0IHNvbWUgb2YgdGhlIHZhcmlhYmxlcyB0byBwcmVzZXQgdmFsdWVzCisJICovCisJc2VsZi0+bWFnaWMgPSAwOworCWRlbF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOyAvKiBJbXBvcnRhbnQhICovCisKKwlpZiAoc2VsZi0+Y29ubl9za2IpCisJCWRldl9rZnJlZV9za2Ioc2VsZi0+Y29ubl9za2IpOworCisJa2ZyZWUoc2VsZik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9jbG9zZV9sc2FwIChzZWxmKQorICoKKyAqICAgIENsb3NlIGFuZCByZW1vdmUgTFNBUAorICoKKyAqLwordm9pZCBpcmxtcF9jbG9zZV9sc2FwKHN0cnVjdCBsc2FwX2NiICpzZWxmKQoreworCXN0cnVjdCBsYXBfY2IgKmxhcDsKKwlzdHJ1Y3QgbHNhcF9jYiAqbHNhcCA9IE5VTEw7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MU0FQX01BR0lDLCByZXR1cm47KTsKKworCS8qCisJICogIEZpbmQgb3V0IGlmIHdlIHNob3VsZCByZW1vdmUgdGhpcyBMU0FQIGZyb20gYSBsaW5rIG9yIGZyb20gdGhlCisJICogIGxpc3Qgb2YgdW5jb25uZWN0ZWQgbHNhcHMgKG5vdCBhc3NvY2lhdGVkIHdpdGggYSBsaW5rKQorCSAqLworCWxhcCA9IHNlbGYtPmxhcDsKKwlpZiAobGFwKSB7CisJCUlSREFfQVNTRVJUKGxhcC0+bWFnaWMgPT0gTE1QX0xBUF9NQUdJQywgcmV0dXJuOyk7CisJCS8qIFdlIG1pZ2h0IGNsb3NlIGEgTFNBUCBiZWZvcmUgaXQgaGFzIGNvbXBsZXRlZCB0aGUKKwkJICogY29ubmVjdGlvbiBzZXR1cC4gSW4gdGhvc2UgY2FzZSwgaGlnaGVyIGxheWVycyB3b24ndAorCQkgKiBzZW5kIGEgcHJvcGVyIGRpc2Nvbm5lY3QgcmVxdWVzdC4gSGFybWxlc3MsIGV4Y2VwdAorCQkgKiB0aGF0IHdlIHdpbGwgZm9yZ2V0IHRvIGNsb3NlIExBUC4uLiAtIEplYW4gSUkgKi8KKwkJaWYoc2VsZi0+bHNhcF9zdGF0ZSAhPSBMU0FQX0RJU0NPTk5FQ1RFRCkgeworCQkJc2VsZi0+bHNhcF9zdGF0ZSA9IExTQVBfRElTQ09OTkVDVEVEOworCQkJaXJsbXBfZG9fbGFwX2V2ZW50KHNlbGYtPmxhcCwKKwkJCQkJICAgTE1fTEFQX0RJU0NPTk5FQ1RfUkVRVUVTVCwgTlVMTCk7CisJCX0KKwkJLyogTm93LCByZW1vdmUgZnJvbSB0aGUgbGluayAqLworCQlsc2FwID0gaGFzaGJpbl9yZW1vdmUobGFwLT5sc2FwcywgKGxvbmcpIHNlbGYsIE5VTEwpOworI2lmZGVmIENPTkZJR19JUkRBX0NBQ0hFX0xBU1RfTFNBUAorCQlsYXAtPmNhY2hlLnZhbGlkID0gRkFMU0U7CisjZW5kaWYKKwl9CisJc2VsZi0+bGFwID0gTlVMTDsKKwkvKiBDaGVjayBpZiB3ZSBmb3VuZCB0aGUgTFNBUCEgSWYgbm90IHRoZW4gdHJ5IHRoZSB1bmNvbm5lY3RlZCBsc2FwcyAqLworCWlmICghbHNhcCkgeworCQlsc2FwID0gaGFzaGJpbl9yZW1vdmUoaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzLCAobG9uZykgc2VsZiwKKwkJCQkgICAgICBOVUxMKTsKKwl9CisJaWYgKCFsc2FwKSB7CisJCUlSREFfREVCVUcoMCwKKwkJICAgICAiJXMoKSwgTG9va3MgbGlrZSBzb21lYm9keSBoYXMgcmVtb3ZlZCBtZSBhbHJlYWR5IVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisJX19pcmxtcF9jbG9zZV9sc2FwKHNlbGYpOworfQorRVhQT1JUX1NZTUJPTChpcmxtcF9jbG9zZV9sc2FwKTsKKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX3JlZ2lzdGVyX2lybGFwIChzYWRkciwgbm90aWZ5KQorICoKKyAqICAgIFJlZ2lzdGVyIElyTEFQIGxheWVyIHdpdGggSXJMTVAuIFRoZXJlIGlzIHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUKKyAqICAgIGluc3RhbmNlcyBvZiB0aGUgSXJMQVAgbGF5ZXIsIGVhY2ggY29ubmVjdGVkIHRvIGRpZmZlcmVudCBJckRBIHBvcnRzCisgKgorICovCit2b2lkIGlybG1wX3JlZ2lzdGVyX2xpbmsoc3RydWN0IGlybGFwX2NiICppcmxhcCwgX191MzIgc2FkZHIsIG5vdGlmeV90ICpub3RpZnkpCit7CisJc3RydWN0IGxhcF9jYiAqbGFwOworCisJSVJEQV9BU1NFUlQoaXJsbXAgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoaXJsbXAtPm1hZ2ljID09IExNUF9NQUdJQywgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQobm90aWZ5ICE9IE5VTEwsIHJldHVybjspOworCisJLyoKKwkgKiAgQWxsb2NhdGUgbmV3IGluc3RhbmNlIG9mIGEgTFNBUCBjb25uZWN0aW9uCisJICovCisJbGFwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxhcF9jYiksIEdGUF9LRVJORUwpOworCWlmIChsYXAgPT0gTlVMTCkgeworCQlJUkRBX0VSUk9SKCIlczogdW5hYmxlIHRvIGttYWxsb2NcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisJbWVtc2V0KGxhcCwgMCwgc2l6ZW9mKHN0cnVjdCBsYXBfY2IpKTsKKworCWxhcC0+aXJsYXAgPSBpcmxhcDsKKwlsYXAtPm1hZ2ljID0gTE1QX0xBUF9NQUdJQzsKKwlsYXAtPnNhZGRyID0gc2FkZHI7CisJbGFwLT5kYWRkciA9IERFVl9BRERSX0FOWTsKKyNpZmRlZiBDT05GSUdfSVJEQV9DQUNIRV9MQVNUX0xTQVAKKwlsYXAtPmNhY2hlLnZhbGlkID0gRkFMU0U7CisjZW5kaWYKKwlsYXAtPmxzYXBzID0gaGFzaGJpbl9uZXcoSEJfTE9DSyk7CisJaWYgKGxhcC0+bHNhcHMgPT0gTlVMTCkgeworCQlJUkRBX1dBUk5JTkcoIiVzKCksIHVuYWJsZSB0byBrbWFsbG9jIGxzYXBzXG4iLCBfX0ZVTkNUSU9OX18pOworCQlrZnJlZShsYXApOworCQlyZXR1cm47CisJfQorCisJbGFwLT5sYXBfc3RhdGUgPSBMQVBfU1RBTkRCWTsKKworCWluaXRfdGltZXIoJmxhcC0+aWRsZV90aW1lcik7CisKKwkvKgorCSAqICBJbnNlcnQgaW50byBxdWV1ZSBvZiBMTVAgbGlua3MKKwkgKi8KKwloYXNoYmluX2luc2VydChpcmxtcC0+bGlua3MsIChpcmRhX3F1ZXVlX3QgKikgbGFwLCBsYXAtPnNhZGRyLCBOVUxMKTsKKworCS8qCisJICogIFdlIHNldCBvbmx5IHRoaXMgdmFyaWFibGUgc28gSXJMQVAgY2FuIHRlbGwgdXMgb24gd2hpY2ggbGluayB0aGUKKwkgKiAgZGlmZmVyZW50IGV2ZW50cyBoYXBwZW5lZCBvbgorCSAqLworCWlyZGFfbm90aWZ5X2luaXQobm90aWZ5KTsKKwlub3RpZnktPmluc3RhbmNlID0gbGFwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsbXBfdW5yZWdpc3Rlcl9pcmxhcCAoc2FkZHIpCisgKgorICogICAgSXJMQVAgbGF5ZXIgaGFzIGJlZW4gcmVtb3ZlZCEKKyAqCisgKi8KK3ZvaWQgaXJsbXBfdW5yZWdpc3Rlcl9saW5rKF9fdTMyIHNhZGRyKQoreworCXN0cnVjdCBsYXBfY2IgKmxpbms7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogV2UgbXVzdCByZW1vdmUgb3Vyc2VsdmVzIGZyb20gdGhlIGhhc2hiaW4gKmZpcnN0Ki4gVGhpcyBlbnN1cmUKKwkgKiB0aGF0IG5vIG1vcmUgTFNBUHMgd2lsbCBiZSBvcGVuIG9uIHRoaXMgbGluayBhbmQgbm8gZGlzY292ZXJ5CisJICogd2lsbCBiZSB0cmlnZ2VyZWQgYW55bW9yZS4gSmVhbiBJSSAqLworCWxpbmsgPSBoYXNoYmluX3JlbW92ZShpcmxtcC0+bGlua3MsIHNhZGRyLCBOVUxMKTsKKwlpZiAobGluaykgeworCQlJUkRBX0FTU0VSVChsaW5rLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm47KTsKKworCQkvKiBLaWxsIGFsbCB0aGUgTFNBUHMgb24gdGhpcyBsaW5rLiBKZWFuIElJICovCisJCWxpbmstPnJlYXNvbiA9IExBUF9ESVNDX0lORElDQVRJT047CisJCWxpbmstPmRhZGRyID0gREVWX0FERFJfQU5ZOworCQlpcmxtcF9kb19sYXBfZXZlbnQobGluaywgTE1fTEFQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTiwgTlVMTCk7CisKKwkJLyogUmVtb3ZlIGFsbCBkaXNjb3ZlcmllcyBkaXNjb3ZlcmVkIGF0IHRoaXMgbGluayAqLworCQlpcmxtcF9leHBpcmVfZGlzY292ZXJpZXMoaXJsbXAtPmNhY2hlbG9nLCBsaW5rLT5zYWRkciwgVFJVRSk7CisKKwkJLyogRmluYWwgY2xlYW51cCAqLworCQlkZWxfdGltZXIoJmxpbmstPmlkbGVfdGltZXIpOworCQlsaW5rLT5tYWdpYyA9IDA7CisJCWtmcmVlKGxpbmspOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX2Nvbm5lY3RfcmVxdWVzdCAoaGFuZGxlLCBkbHNhcCwgdXNlcmRhdGEpCisgKgorICogICAgQ29ubmVjdCB3aXRoIGEgcGVlciBMU0FQCisgKgorICovCitpbnQgaXJsbXBfY29ubmVjdF9yZXF1ZXN0KHN0cnVjdCBsc2FwX2NiICpzZWxmLCBfX3U4IGRsc2FwX3NlbCwKKwkJCSAgX191MzIgc2FkZHIsIF9fdTMyIGRhZGRyLAorCQkJICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywgc3RydWN0IHNrX2J1ZmYgKnVzZXJkYXRhKQoreworCXN0cnVjdCBza19idWZmICp0eF9za2IgPSB1c2VyZGF0YTsKKwlzdHJ1Y3QgbGFwX2NiICpsYXA7CisJc3RydWN0IGxzYXBfY2IgKmxzYXA7CisJaW50IHJldDsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC1FQkFEUjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MU0FQX01BR0lDLCByZXR1cm4gLUVCQURSOyk7CisKKwlJUkRBX0RFQlVHKDIsCisJICAgICAgIiVzKCksIHNsc2FwX3NlbD0lMDJ4LCBkbHNhcF9zZWw9JTAyeCwgc2FkZHI9JTA4eCwgZGFkZHI9JTA4eFxuIiwKKwkgICAgICBfX0ZVTkNUSU9OX18sIHNlbGYtPnNsc2FwX3NlbCwgZGxzYXBfc2VsLCBzYWRkciwgZGFkZHIpOworCisJaWYgKHRlc3RfYml0KDAsICZzZWxmLT5jb25uZWN0ZWQpKSB7CisJCXJldCA9IC1FSVNDT05OOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBDbGllbnQgbXVzdCBzdXBwbHkgZGVzdGluYXRpb24gZGV2aWNlIGFkZHJlc3MgKi8KKwlpZiAoIWRhZGRyKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCS8qIEFueSB1c2VyZGF0YT8gKi8KKwlpZiAodHhfc2tiID09IE5VTEwpIHsKKwkJdHhfc2tiID0gZGV2X2FsbG9jX3NrYig2NCk7CisJCWlmICghdHhfc2tiKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJc2tiX3Jlc2VydmUodHhfc2tiLCBMTVBfTUFYX0hFQURFUik7CisJfQorCisJLyogTWFrZSByb29tIGZvciBNVVggY29udHJvbCBoZWFkZXIgKDMgYnl0ZXMpICovCisJSVJEQV9BU1NFUlQoc2tiX2hlYWRyb29tKHR4X3NrYikgPj0gTE1QX0NPTlRST0xfSEVBREVSLCByZXR1cm4gLTE7KTsKKwlza2JfcHVzaCh0eF9za2IsIExNUF9DT05UUk9MX0hFQURFUik7CisKKwlzZWxmLT5kbHNhcF9zZWwgPSBkbHNhcF9zZWw7CisKKwkvKgorCSAqIEZpbmQgdGhlIGxpbmsgdG8gd2hlcmUgd2Ugc2hvdWxkIHRyeSB0byBjb25uZWN0IHNpbmNlIHRoZXJlIG1heQorCSAqIGJlIG1vcmUgdGhhbiBvbmUgSXJEQSBwb3J0IG9uIHRoaXMgbWFjaGluZS4gSWYgdGhlIGNsaWVudCBoYXMKKwkgKiBwYXNzZWQgdXMgdGhlIHNhZGRyIChhbmQgYWxyZWFkeSBrbm93cyB3aGljaCBsaW5rIHRvIHVzZSksIHRoZW4KKwkgKiB3ZSB1c2UgdGhhdCB0byBmaW5kIHRoZSBsaW5rLCBpZiBub3QgdGhlbiB3ZSBoYXZlIHRvIGxvb2sgaW4gdGhlCisJICogZGlzY292ZXJ5IGxvZyBhbmQgY2hlY2sgaWYgYW55IG9mIHRoZSBsaW5rcyBoYXMgZGlzY292ZXJlZCBhCisJICogZGV2aWNlIHdpdGggdGhlIGdpdmVuIGRhZGRyCisJICovCisJaWYgKCghc2FkZHIpIHx8IChzYWRkciA9PSBERVZfQUREUl9BTlkpKSB7CisJCWRpc2NvdmVyeV90ICpkaXNjb3Zlcnk7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlybG1wLT5jYWNoZWxvZy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKwkJaWYgKGRhZGRyICE9IERFVl9BRERSX0FOWSkKKwkJCWRpc2NvdmVyeSA9IGhhc2hiaW5fZmluZChpcmxtcC0+Y2FjaGVsb2csIGRhZGRyLCBOVUxMKTsKKwkJZWxzZSB7CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBubyBkYWRkclxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWRpc2NvdmVyeSA9IChkaXNjb3ZlcnlfdCAqKQorCQkJCWhhc2hiaW5fZ2V0X2ZpcnN0KGlybG1wLT5jYWNoZWxvZyk7CisJCX0KKworCQlpZiAoZGlzY292ZXJ5KSB7CisJCQlzYWRkciA9IGRpc2NvdmVyeS0+ZGF0YS5zYWRkcjsKKwkJCWRhZGRyID0gZGlzY292ZXJ5LT5kYXRhLmRhZGRyOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlybG1wLT5jYWNoZWxvZy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKwl9CisJbGFwID0gaGFzaGJpbl9sb2NrX2ZpbmQoaXJsbXAtPmxpbmtzLCBzYWRkciwgTlVMTCk7CisJaWYgKGxhcCA9PSBOVUxMKSB7CisJCUlSREFfREVCVUcoMSwgIiVzKCksIFVuYWJsZSB0byBmaW5kIGEgdXNhYmxlIGxpbmshXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXQgPSAtRUhPU1RVTlJFQUNIOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBDaGVjayBpZiBMQVAgaXMgZGlzY29ubmVjdGVkIG9yIGFscmVhZHkgY29ubmVjdGVkICovCisJaWYgKGxhcC0+ZGFkZHIgPT0gREVWX0FERFJfQU5ZKQorCQlsYXAtPmRhZGRyID0gZGFkZHI7CisJZWxzZSBpZiAobGFwLT5kYWRkciAhPSBkYWRkcikgeworCQkvKiBDaGVjayBpZiBzb21lIExTQVBzIGFyZSBhY3RpdmUgb24gdGhpcyBMQVAgKi8KKwkJaWYgKEhBU0hCSU5fR0VUX1NJWkUobGFwLT5sc2FwcykgPT0gMCkgeworCQkJLyogTm8gYWN0aXZlIGNvbm5lY3Rpb24sIGJ1dCBMQVAgaGFzbid0IGJlZW4KKwkJCSAqIGRpc2Nvbm5lY3RlZCB5ZXQgKHdhaXRpbmcgZm9yIHRpbWVvdXQgaW4gTEFQKS4KKwkJCSAqIE1heWJlIHdlIGNvdWxkIGdpdmUgTEFQIGEgYml0IG9mIGhlbHAgaW4gdGhpcyBjYXNlLgorCQkJICovCisJCQlJUkRBX0RFQlVHKDAsICIlcygpLCBzb3JyeSwgYnV0IEknbSB3YWl0aW5nIGZvciBMQVAgdG8gdGltZW91dCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXQgPSAtRUFHQUlOOworCQkJZ290byBlcnI7CisJCX0KKworCQkvKiBMQVAgaXMgYWxyZWFkeSBjb25uZWN0ZWQgdG8gYSBkaWZmZXJlbnQgbm9kZSwgYW5kIExBUAorCQkgKiBjYW4gb25seSB0YWxrIHRvIG9uZSBub2RlIGF0IGEgdGltZSAqLworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBzb3JyeSwgYnV0IGxpbmsgaXMgYnVzeSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnI7CisJfQorCisJc2VsZi0+bGFwID0gbGFwOworCisJLyoKKwkgKiAgUmVtb3ZlIExTQVAgZnJvbSBsaXN0IG9mIHVuY29ubmVjdGVkIExTQVBzIGFuZCBpbnNlcnQgaXQgaW50byB0aGUKKwkgKiAgbGlzdCBvZiBjb25uZWN0ZWQgTFNBUHMgZm9yIHRoZSBwYXJ0aWN1bGFyIGxpbmsKKwkgKi8KKwlsc2FwID0gaGFzaGJpbl9yZW1vdmUoaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzLCAobG9uZykgc2VsZiwgTlVMTCk7CisKKwlJUkRBX0FTU0VSVChsc2FwICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKGxzYXAtPm1hZ2ljID09IExNUF9MU0FQX01BR0lDLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChsc2FwLT5sYXAgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQobHNhcC0+bGFwLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm4gLTE7KTsKKworCWhhc2hiaW5faW5zZXJ0KHNlbGYtPmxhcC0+bHNhcHMsIChpcmRhX3F1ZXVlX3QgKikgc2VsZiwgKGxvbmcpIHNlbGYsCisJCSAgICAgICBOVUxMKTsKKworCXNldF9iaXQoMCwgJnNlbGYtPmNvbm5lY3RlZCk7CS8qIFRSVUUgKi8KKworCS8qCisJICogIFVzZXIgc3VwcGxpZWQgcW9zIHNwZWNpZmljYXRpb25zPworCSAqLworCWlmIChxb3MpCisJCXNlbGYtPnFvcyA9ICpxb3M7CisKKwlpcmxtcF9kb19sc2FwX2V2ZW50KHNlbGYsIExNX0NPTk5FQ1RfUkVRVUVTVCwgdHhfc2tiKTsKKworCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIGlybGFwX2RhdGFfcmVxdWVzdCgpLiAqLworCWRldl9rZnJlZV9za2IodHhfc2tiKTsKKworCXJldHVybiAwOworCitlcnI6CisJLyogQ2xlYW51cCAqLworCWlmKHR4X3NrYikKKwkJZGV2X2tmcmVlX3NrYih0eF9za2IpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGlybG1wX2Nvbm5lY3RfcmVxdWVzdCk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9jb25uZWN0X2luZGljYXRpb24gKHNlbGYpCisgKgorICogICAgSW5jb21pbmcgY29ubmVjdGlvbgorICoKKyAqLwordm9pZCBpcmxtcF9jb25uZWN0X2luZGljYXRpb24oc3RydWN0IGxzYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IG1heF9zZWdfc2l6ZTsKKwlpbnQgbGFwX2hlYWRlcl9zaXplOworCWludCBtYXhfaGVhZGVyX3NpemU7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MU0FQX01BR0lDLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bGFwICE9IE5VTEwsIHJldHVybjspOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgc2xzYXBfc2VsPSUwMngsIGRsc2FwX3NlbD0lMDJ4XG4iLAorCQkgICBfX0ZVTkNUSU9OX18sIHNlbGYtPnNsc2FwX3NlbCwgc2VsZi0+ZGxzYXBfc2VsKTsKKworCS8qIE5vdGUgOiBzZWxmLT5sYXAgaXMgc2V0IGluIGlybG1wX2xpbmtfZGF0YV9pbmRpY2F0aW9uKCksCisJICogKGNhc2UgQ09OTkVDVF9DTUQ6KSBiZWNhdXNlIHdlIGhhdmUgbm8gd2F5IHRvIHNldCBpdCBoZXJlLgorCSAqIFNpbWlsYXJseSwgc2VsZi0+ZGxzYXBfc2VsIGlzIHVzdWFsbHkgc2V0IGluIGlybG1wX2ZpbmRfbHNhcCgpLgorCSAqIEplYW4gSUkgKi8KKworCXNlbGYtPnFvcyA9ICpzZWxmLT5sYXAtPnFvczsKKworCW1heF9zZWdfc2l6ZSA9IHNlbGYtPmxhcC0+cW9zLT5kYXRhX3NpemUudmFsdWUtTE1QX0hFQURFUjsKKwlsYXBfaGVhZGVyX3NpemUgPSBJUkxBUF9HRVRfSEVBREVSX1NJWkUoc2VsZi0+bGFwLT5pcmxhcCk7CisJbWF4X2hlYWRlcl9zaXplID0gTE1QX0hFQURFUiArIGxhcF9oZWFkZXJfc2l6ZTsKKworCS8qIEhpZGUgTE1QX0NPTlRST0xfSEVBREVSIGhlYWRlciBmcm9tIGxheWVyIGFib3ZlICovCisJc2tiX3B1bGwoc2tiLCBMTVBfQ09OVFJPTF9IRUFERVIpOworCisJaWYgKHNlbGYtPm5vdGlmeS5jb25uZWN0X2luZGljYXRpb24pIHsKKwkJLyogRG9uJ3QgZm9yZ2V0IHRvIHJlZmNvdW50IGl0IC0gc2VlIGlybGFwX2RyaXZlcl9yY3YoKS4gKi8KKwkJc2tiX2dldChza2IpOworCQlzZWxmLT5ub3RpZnkuY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSwgc2VsZiwKKwkJCQkJCSZzZWxmLT5xb3MsIG1heF9zZWdfc2l6ZSwKKwkJCQkJCW1heF9oZWFkZXJfc2l6ZSwgc2tiKTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9jb25uZWN0X3Jlc3BvbnNlIChoYW5kbGUsIHVzZXJkYXRhKQorICoKKyAqICAgIFNlcnZpY2UgdXNlciBpcyBhY2NlcHRpbmcgY29ubmVjdGlvbgorICoKKyAqLworaW50IGlybG1wX2Nvbm5lY3RfcmVzcG9uc2Uoc3RydWN0IGxzYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICp1c2VyZGF0YSkKK3sKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MU0FQX01BR0lDLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVCh1c2VyZGF0YSAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCS8qIFdlIHNldCB0aGUgY29ubmVjdGVkIGJpdCBhbmQgbW92ZSB0aGUgbHNhcCB0byB0aGUgY29ubmVjdGVkIGxpc3QKKwkgKiBpbiB0aGUgc3RhdGUgbWFjaGluZSBpdHNlbGYuIEplYW4gSUkgKi8KKworCUlSREFfREVCVUcoMiwgIiVzKCksIHNsc2FwX3NlbD0lMDJ4LCBkbHNhcF9zZWw9JTAyeFxuIiwKKwkJICAgX19GVU5DVElPTl9fLCBzZWxmLT5zbHNhcF9zZWwsIHNlbGYtPmRsc2FwX3NlbCk7CisKKwkvKiBNYWtlIHJvb20gZm9yIE1VWCBjb250cm9sIGhlYWRlciAoMyBieXRlcykgKi8KKwlJUkRBX0FTU0VSVChza2JfaGVhZHJvb20odXNlcmRhdGEpID49IExNUF9DT05UUk9MX0hFQURFUiwgcmV0dXJuIC0xOyk7CisJc2tiX3B1c2godXNlcmRhdGEsIExNUF9DT05UUk9MX0hFQURFUik7CisKKwlpcmxtcF9kb19sc2FwX2V2ZW50KHNlbGYsIExNX0NPTk5FQ1RfUkVTUE9OU0UsIHVzZXJkYXRhKTsKKworCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIGlybGFwX2RhdGFfcmVxdWVzdCgpLiAqLworCWRldl9rZnJlZV9za2IodXNlcmRhdGEpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlybG1wX2Nvbm5lY3RfcmVzcG9uc2UpOworCisvKgorICogRnVuY3Rpb24gaXJsbXBfY29ubmVjdF9jb25maXJtIChoYW5kbGUsIHNrYikKKyAqCisgKiAgICBMU0FQIGNvbm5lY3Rpb24gY29uZmlybWVkIHBlZXIgZGV2aWNlIQorICovCit2b2lkIGlybG1wX2Nvbm5lY3RfY29uZmlybShzdHJ1Y3QgbHNhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgbWF4X2hlYWRlcl9zaXplOworCWludCBsYXBfaGVhZGVyX3NpemU7CisJaW50IG1heF9zZWdfc2l6ZTsKKworCUlSREFfREVCVUcoMywgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bGFwICE9IE5VTEwsIHJldHVybjspOworCisJc2VsZi0+cW9zID0gKnNlbGYtPmxhcC0+cW9zOworCisJbWF4X3NlZ19zaXplICAgID0gc2VsZi0+bGFwLT5xb3MtPmRhdGFfc2l6ZS52YWx1ZS1MTVBfSEVBREVSOworCWxhcF9oZWFkZXJfc2l6ZSA9IElSTEFQX0dFVF9IRUFERVJfU0laRShzZWxmLT5sYXAtPmlybGFwKTsKKwltYXhfaGVhZGVyX3NpemUgPSBMTVBfSEVBREVSICsgbGFwX2hlYWRlcl9zaXplOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgbWF4X2hlYWRlcl9zaXplPSVkXG4iLAorCQkgICBfX0ZVTkNUSU9OX18sIG1heF9oZWFkZXJfc2l6ZSk7CisKKwkvKiBIaWRlIExNUF9DT05UUk9MX0hFQURFUiBoZWFkZXIgZnJvbSBsYXllciBhYm92ZSAqLworCXNrYl9wdWxsKHNrYiwgTE1QX0NPTlRST0xfSEVBREVSKTsKKworCWlmIChzZWxmLT5ub3RpZnkuY29ubmVjdF9jb25maXJtKSB7CisJCS8qIERvbid0IGZvcmdldCB0byByZWZjb3VudCBpdCAtIHNlZSBpcmxhcF9kcml2ZXJfcmN2KCkgKi8KKwkJc2tiX2dldChza2IpOworCQlzZWxmLT5ub3RpZnkuY29ubmVjdF9jb25maXJtKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSwgc2VsZiwKKwkJCQkJICAgICAmc2VsZi0+cW9zLCBtYXhfc2VnX3NpemUsCisJCQkJCSAgICAgbWF4X2hlYWRlcl9zaXplLCBza2IpOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX2R1cCAob3JpZywgaW5zdGFuY2UpCisgKgorICogICAgRHVwbGljYXRlIExTQVAsIGNhbiBiZSB1c2VkIGJ5IHNlcnZlcnMgdG8gY29uZmlybSBhIGNvbm5lY3Rpb24gb24gYQorICogICAgbmV3IExTQVAgc28gaXQgY2FuIGtlZXAgbGlzdGVuaW5nIG9uIHRoZSBvbGQgb25lLgorICoKKyAqLworc3RydWN0IGxzYXBfY2IgKmlybG1wX2R1cChzdHJ1Y3QgbHNhcF9jYiAqb3JpZywgdm9pZCAqaW5zdGFuY2UpCit7CisJc3RydWN0IGxzYXBfY2IgKm5ldzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJSVJEQV9ERUJVRygxLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMtPmhiX3NwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBPbmx5IGFsbG93ZWQgdG8gZHVwbGljYXRlIHVuY29ubmVjdGVkIExTQVAncywgYW5kIG9ubHkgTFNBUHMKKwkgKiB0aGF0IGhhdmUgcmVjZWl2ZWQgYSBjb25uZWN0IGluZGljYXRpb24uIEplYW4gSUkgKi8KKwlpZiAoKCFoYXNoYmluX2ZpbmQoaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzLCAobG9uZykgb3JpZywgTlVMTCkpIHx8CisJICAgIChvcmlnLT5sYXAgPT0gTlVMTCkpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgaW52YWxpZCBMU0FQICh3cm9uZyBzdGF0ZSlcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMtPmhiX3NwaW5sb2NrLAorCQkJCSAgICAgICBmbGFncyk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIEFsbG9jYXRlIGEgbmV3IGluc3RhbmNlICovCisJbmV3ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxzYXBfY2IpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIW5ldykgIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5hYmxlIHRvIGttYWxsb2NcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlybG1wLT51bmNvbm5lY3RlZF9sc2Fwcy0+aGJfc3BpbmxvY2ssCisJCQkJICAgICAgIGZsYWdzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8qIER1cCAqLworCW1lbWNweShuZXcsIG9yaWcsIHNpemVvZihzdHJ1Y3QgbHNhcF9jYikpOworCS8qIG5ldy0+bGFwID0gb3JpZy0+bGFwOyA9PiBkb25lIGluIHRoZSBtZW1jcHkoKSAqLworCS8qIG5ldy0+c2xzYXBfc2VsID0gb3JpZy0+c2xzYXBfc2VsOyA9PiBkb25lIGluIHRoZSBtZW1jcHkoKSAqLworCW5ldy0+Y29ubl9za2IgPSBOVUxMOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCisJLyogTm90IGV2ZXJ5dGhpbmcgaXMgdGhlIHNhbWUgKi8KKwluZXctPm5vdGlmeS5pbnN0YW5jZSA9IGluc3RhbmNlOworCisJaW5pdF90aW1lcigmbmV3LT53YXRjaGRvZ190aW1lcik7CisKKwloYXNoYmluX2luc2VydChpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMsIChpcmRhX3F1ZXVlX3QgKikgbmV3LAorCQkgICAgICAgKGxvbmcpIG5ldywgTlVMTCk7CisKKyNpZmRlZiBDT05GSUdfSVJEQV9DQUNIRV9MQVNUX0xTQVAKKwkvKiBNYWtlIHN1cmUgdGhhdCB3ZSBpbnZhbGlkYXRlIHRoZSBMU0FQIGNhY2hlICovCisJbmV3LT5sYXAtPmNhY2hlLnZhbGlkID0gRkFMU0U7CisjZW5kaWYgLyogQ09ORklHX0lSREFfQ0FDSEVfTEFTVF9MU0FQICovCisKKwlyZXR1cm4gbmV3OworfQorRVhQT1JUX1NZTUJPTChpcmxtcF9kdXApOworCisvKgorICogRnVuY3Rpb24gaXJsbXBfZGlzY29ubmVjdF9yZXF1ZXN0IChoYW5kbGUsIHVzZXJkYXRhKQorICoKKyAqICAgIFRoZSBzZXJ2aWNlIHVzZXIgaXMgcmVxdWVzdGluZyBkaXNjb25uZWN0aW9uLCB0aGlzIHdpbGwgbm90IHJlbW92ZSB0aGUKKyAqICAgIExTQVAsIGJ1dCBvbmx5IG1hcmsgaXQgYXMgZGlzY29ubmVjdGVkCisgKi8KK2ludCBpcmxtcF9kaXNjb25uZWN0X3JlcXVlc3Qoc3RydWN0IGxzYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICp1c2VyZGF0YSkKK3sKKwlzdHJ1Y3QgbHNhcF9jYiAqbHNhcDsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xTQVBfTUFHSUMsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHVzZXJkYXRhICE9IE5VTEwsIHJldHVybiAtMTspOworCisJLyogQWxyZWFkeSBkaXNjb25uZWN0ZWQgPworCSAqIFRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb24gYmV0d2VlbiBpcmxtcF9kaXNjb25uZWN0X2luZGljYXRpb24oKQorCSAqIGFuZCB1cyB0aGF0IG1pZ2h0IG1lc3MgdXAgdGhlIGhhc2hiaW5zIGJlbG93LiBUaGlzIGZpeGVzIGl0LgorCSAqIEplYW4gSUkgKi8KKwlpZiAoISB0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgJnNlbGYtPmNvbm5lY3RlZCkpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgYWxyZWFkeSBkaXNjb25uZWN0ZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkZXZfa2ZyZWVfc2tiKHVzZXJkYXRhKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNrYl9wdXNoKHVzZXJkYXRhLCBMTVBfQ09OVFJPTF9IRUFERVIpOworCisJLyoKKwkgKiAgRG8gdGhlIGV2ZW50IGJlZm9yZSB0aGUgb3RoZXIgc3R1ZmYgc2luY2Ugd2UgbXVzdCBrbm93CisJICogIHdoaWNoIGxhcCBsYXllciB0aGF0IHRoZSBmcmFtZSBzaG91bGQgYmUgdHJhbnNtaXR0ZWQgb24KKwkgKi8KKwlpcmxtcF9kb19sc2FwX2V2ZW50KHNlbGYsIExNX0RJU0NPTk5FQ1RfUkVRVUVTVCwgdXNlcmRhdGEpOworCisJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgaXJsYXBfZGF0YV9yZXF1ZXN0KCkuICovCisJZGV2X2tmcmVlX3NrYih1c2VyZGF0YSk7CisKKwkvKgorCSAqICBSZW1vdmUgTFNBUCBmcm9tIGxpc3Qgb2YgY29ubmVjdGVkIExTQVBzIGZvciB0aGUgcGFydGljdWxhciBsaW5rCisJICogIGFuZCBpbnNlcnQgaXQgaW50byB0aGUgbGlzdCBvZiB1bmNvbm5lY3RlZCBMU0FQcworCSAqLworCUlSREFfQVNTRVJUKHNlbGYtPmxhcCAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5sYXAtPm1hZ2ljID09IExNUF9MQVBfTUFHSUMsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPmxhcC0+bHNhcHMgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlsc2FwID0gaGFzaGJpbl9yZW1vdmUoc2VsZi0+bGFwLT5sc2FwcywgKGxvbmcpIHNlbGYsIE5VTEwpOworI2lmZGVmIENPTkZJR19JUkRBX0NBQ0hFX0xBU1RfTFNBUAorCXNlbGYtPmxhcC0+Y2FjaGUudmFsaWQgPSBGQUxTRTsKKyNlbmRpZgorCisJSVJEQV9BU1NFUlQobHNhcCAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChsc2FwLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQobHNhcCA9PSBzZWxmLCByZXR1cm4gLTE7KTsKKworCWhhc2hiaW5faW5zZXJ0KGlybG1wLT51bmNvbm5lY3RlZF9sc2FwcywgKGlyZGFfcXVldWVfdCAqKSBzZWxmLAorCQkgICAgICAgKGxvbmcpIHNlbGYsIE5VTEwpOworCisJLyogUmVzZXQgc29tZSB2YWx1ZXMgKi8KKwlzZWxmLT5kbHNhcF9zZWwgPSBMU0FQX0FOWTsKKwlzZWxmLT5sYXAgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlybG1wX2Rpc2Nvbm5lY3RfcmVxdWVzdCk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9kaXNjb25uZWN0X2luZGljYXRpb24gKHJlYXNvbiwgdXNlcmRhdGEpCisgKgorICogICAgTFNBUCBpcyBiZWluZyBjbG9zZWQhCisgKi8KK3ZvaWQgaXJsbXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHN0cnVjdCBsc2FwX2NiICpzZWxmLCBMTV9SRUFTT04gcmVhc29uLAorCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsc2FwX2NiICpsc2FwOworCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgcmVhc29uPSVzXG4iLCBfX0ZVTkNUSU9OX18sIGlybG1wX3JlYXNvbnNbcmVhc29uXSk7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywgcmV0dXJuOyk7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpLCBzbHNhcF9zZWw9JTAyeCwgZGxzYXBfc2VsPSUwMnhcbiIsCisJCSAgIF9fRlVOQ1RJT05fXywgc2VsZi0+c2xzYXBfc2VsLCBzZWxmLT5kbHNhcF9zZWwpOworCisJLyogQWxyZWFkeSBkaXNjb25uZWN0ZWQgPworCSAqIFRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb24gYmV0d2VlbiBpcmxtcF9kaXNjb25uZWN0X3JlcXVlc3QoKQorCSAqIGFuZCB1cyB0aGF0IG1pZ2h0IG1lc3MgdXAgdGhlIGhhc2hiaW5zIGJlbG93LiBUaGlzIGZpeGVzIGl0LgorCSAqIEplYW4gSUkgKi8KKwlpZiAoISB0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgJnNlbGYtPmNvbm5lY3RlZCkpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgYWxyZWFkeSBkaXNjb25uZWN0ZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiAgUmVtb3ZlIGFzc29jaWF0aW9uIGJldHdlZW4gdGhpcyBMU0FQIGFuZCB0aGUgbGluayBpdCB1c2VkCisJICovCisJSVJEQV9BU1NFUlQoc2VsZi0+bGFwICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPmxhcC0+bHNhcHMgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlsc2FwID0gaGFzaGJpbl9yZW1vdmUoc2VsZi0+bGFwLT5sc2FwcywgKGxvbmcpIHNlbGYsIE5VTEwpOworI2lmZGVmIENPTkZJR19JUkRBX0NBQ0hFX0xBU1RfTFNBUAorCXNlbGYtPmxhcC0+Y2FjaGUudmFsaWQgPSBGQUxTRTsKKyNlbmRpZgorCisJSVJEQV9BU1NFUlQobHNhcCAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChsc2FwID09IHNlbGYsIHJldHVybjspOworCWhhc2hiaW5faW5zZXJ0KGlybG1wLT51bmNvbm5lY3RlZF9sc2FwcywgKGlyZGFfcXVldWVfdCAqKSBsc2FwLAorCQkgICAgICAgKGxvbmcpIGxzYXAsIE5VTEwpOworCisJc2VsZi0+ZGxzYXBfc2VsID0gTFNBUF9BTlk7CisJc2VsZi0+bGFwID0gTlVMTDsKKworCS8qCisJICogIEluZm9ybSBzZXJ2aWNlIHVzZXIKKwkgKi8KKwlpZiAoc2VsZi0+bm90aWZ5LmRpc2Nvbm5lY3RfaW5kaWNhdGlvbikgeworCQkvKiBEb24ndCBmb3JnZXQgdG8gcmVmY291bnQgaXQgLSBzZWUgaXJsYXBfZHJpdmVyX3JjdigpLiAqLworCQlpZihza2IpCisJCQlza2JfZ2V0KHNrYik7CisJCXNlbGYtPm5vdGlmeS5kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLAorCQkJCQkJICAgc2VsZiwgcmVhc29uLCBza2IpOworCX0gZWxzZSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIG5vIGhhbmRsZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJsbXBfZG9fZXhwaXJ5ICh2b2lkKQorICoKKyAqICAgIERvIGEgY2xlYW51cCBvZiB0aGUgZGlzY292ZXJ5IGxvZyAocmVtb3ZlIG9sZCBlbnRyaWVzKQorICoKKyAqIE5vdGUgOiBzZXBhcmF0ZSBmcm9tIGlybG1wX2RvX2Rpc2NvdmVyeSgpIHNvIHRoYXQgd2UgY2FuIGhhbmRsZQorICogcGFzc2l2ZSBkaXNjb3ZlcnkgcHJvcGVybHkuCisgKi8KK3ZvaWQgaXJsbXBfZG9fZXhwaXJ5KHZvaWQpCit7CisJc3RydWN0IGxhcF9jYiAqbGFwOworCisJLyoKKwkgKiBFeHBpcmUgZGlzY292ZXJ5IG9uIGFsbCBsaW5rcyB3aGljaCBhcmUgKm5vdCogY29ubmVjdGVkLgorCSAqIE9uIGxpbmtzIHdoaWNoIGFyZSBjb25uZWN0ZWQsIHdlIGNhbid0IGRvIGRpc2NvdmVyeQorCSAqIGFueW1vcmUgYW5kIGNhbid0IHJlZnJlc2ggdGhlIGxvZywgc28gd2UgZnJlZXplIHRoZQorCSAqIGRpc2NvdmVyeSBsb2cgdG8ga2VlcCBpbmZvIGFib3V0IHRoZSBkZXZpY2Ugd2UgYXJlCisJICogY29ubmVjdGVkIHRvLgorCSAqIFRoaXMgaW5mbyBpcyBtYW5kYXRvcnkgaWYgd2Ugd2FudCBpcmxtcF9jb25uZWN0X3JlcXVlc3QoKQorCSAqIHRvIHdvcmsgcHJvcGVybHkuIC0gSmVhbiBJSQorCSAqLworCWxhcCA9IChzdHJ1Y3QgbGFwX2NiICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGlybG1wLT5saW5rcyk7CisJd2hpbGUgKGxhcCAhPSBOVUxMKSB7CisJCUlSREFfQVNTRVJUKGxhcC0+bWFnaWMgPT0gTE1QX0xBUF9NQUdJQywgcmV0dXJuOyk7CisKKwkJaWYgKGxhcC0+bGFwX3N0YXRlID09IExBUF9TVEFOREJZKSB7CisJCQkvKiBFeHBpcmUgZGlzY292ZXJpZXMgZGlzY292ZXJlZCBvbiB0aGlzIGxpbmsgKi8KKwkJCWlybG1wX2V4cGlyZV9kaXNjb3ZlcmllcyhpcmxtcC0+Y2FjaGVsb2csIGxhcC0+c2FkZHIsCisJCQkJCQkgRkFMU0UpOworCQl9CisJCWxhcCA9IChzdHJ1Y3QgbGFwX2NiICopIGhhc2hiaW5fZ2V0X25leHQoaXJsbXAtPmxpbmtzKTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9kb19kaXNjb3ZlcnkgKG5zbG90cykKKyAqCisgKiAgICBEbyBzb21lIGRpc2NvdmVyeSBvbiBhbGwgbGlua3MKKyAqCisgKiBOb3RlIDogbG9nIGV4cGlyeSBpcyBkb25lIGFib3ZlLgorICovCit2b2lkIGlybG1wX2RvX2Rpc2NvdmVyeShpbnQgbnNsb3RzKQoreworCXN0cnVjdCBsYXBfY2IgKmxhcDsKKworCS8qIE1ha2Ugc3VyZSB0aGUgdmFsdWUgaXMgc2FuZSAqLworCWlmICgobnNsb3RzICE9IDEpICYmIChuc2xvdHMgIT0gNikgJiYgKG5zbG90cyAhPSA4KSAmJiAobnNsb3RzICE9IDE2KSl7CisJCUlSREFfV0FSTklORygiJXM6IGludmFsaWQgdmFsdWUgZm9yIG51bWJlciBvZiBzbG90cyFcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCW5zbG90cyA9IHN5c2N0bF9kaXNjb3Zlcnlfc2xvdHMgPSA4OworCX0KKworCS8qIENvbnN0cnVjdCBuZXcgZGlzY292ZXJ5IGluZm8gdG8gYmUgdXNlZCBieSBJckxBUCwgKi8KKwl1MTZobyhpcmxtcC0+ZGlzY292ZXJ5X2NtZC5kYXRhLmhpbnRzKSA9IGlybG1wLT5oaW50cy53b3JkOworCisJLyoKKwkgKiAgU2V0IGNoYXJhY3RlciBzZXQgZm9yIGRldmljZSBuYW1lICh3ZSB1c2UgQVNDSUkpLCBhbmQKKwkgKiAgY29weSBkZXZpY2UgbmFtZS4gUmVtZW1iZXIgdG8gbWFrZSByb29tIGZvciBhIFwwIGF0IHRoZQorCSAqICBlbmQKKwkgKi8KKwlpcmxtcC0+ZGlzY292ZXJ5X2NtZC5kYXRhLmNoYXJzZXQgPSBDU19BU0NJSTsKKwlzdHJuY3B5KGlybG1wLT5kaXNjb3ZlcnlfY21kLmRhdGEuaW5mbywgc3lzY3RsX2Rldm5hbWUsCisJCU5JQ0tOQU1FX01BWF9MRU4pOworCWlybG1wLT5kaXNjb3ZlcnlfY21kLm5hbWVfbGVuID0gc3RybGVuKGlybG1wLT5kaXNjb3ZlcnlfY21kLmRhdGEuaW5mbyk7CisJaXJsbXAtPmRpc2NvdmVyeV9jbWQubnNsb3RzID0gbnNsb3RzOworCisJLyoKKwkgKiBUcnkgdG8gc2VuZCBkaXNjb3ZlcnkgcGFja2V0cyBvbiBhbGwgbGlua3MKKwkgKi8KKwlsYXAgPSAoc3RydWN0IGxhcF9jYiAqKSBoYXNoYmluX2dldF9maXJzdChpcmxtcC0+bGlua3MpOworCXdoaWxlIChsYXAgIT0gTlVMTCkgeworCQlJUkRBX0FTU0VSVChsYXAtPm1hZ2ljID09IExNUF9MQVBfTUFHSUMsIHJldHVybjspOworCisJCWlmIChsYXAtPmxhcF9zdGF0ZSA9PSBMQVBfU1RBTkRCWSkgeworCQkJLyogVHJ5IHRvIGRpc2NvdmVyICovCisJCQlpcmxtcF9kb19sYXBfZXZlbnQobGFwLCBMTV9MQVBfRElTQ09WRVJZX1JFUVVFU1QsCisJCQkJCSAgIE5VTEwpOworCQl9CisJCWxhcCA9IChzdHJ1Y3QgbGFwX2NiICopIGhhc2hiaW5fZ2V0X25leHQoaXJsbXAtPmxpbmtzKTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9kaXNjb3ZlcnlfcmVxdWVzdCAobnNsb3RzKQorICoKKyAqICAgIERvIGEgZGlzY292ZXJ5IG9mIGRldmljZXMgaW4gZnJvbnQgb2YgdGhlIGNvbXB1dGVyCisgKgorICogSWYgdGhlIGNhbGxlciBoYXMgcmVnaXN0ZXJlZCBhIGNsaWVudCBkaXNjb3ZlcnkgY2FsbGJhY2ssIHRoaXMKKyAqIGFsbG93IGhpbSB0byByZWNlaXZlIHRoZSBmdWxsIGNvbnRlbnQgb2YgdGhlIGRpc2NvdmVyeSBsb2cgdGhyb3VnaAorICogdGhpcyBjYWxsYmFjayAoYXMgbm9ybWFsbHkgaGUgd2lsbCByZWNlaXZlIG9ubHkgbmV3IGRpc2NvdmVyaWVzKS4KKyAqLwordm9pZCBpcmxtcF9kaXNjb3ZlcnlfcmVxdWVzdChpbnQgbnNsb3RzKQoreworCS8qIFJldHVybiBjdXJyZW50IGNhY2hlZCBkaXNjb3ZlcnkgbG9nIChpbiBmdWxsKSAqLworCWlybG1wX2Rpc2NvdmVyeV9jb25maXJtKGlybG1wLT5jYWNoZWxvZywgRElTQ09WRVJZX0xPRyk7CisKKwkvKgorCSAqIFN0YXJ0IGEgc2luZ2xlIGRpc2NvdmVyeSBvcGVyYXRpb24gaWYgZGlzY292ZXJ5IGlzIG5vdCBhbHJlYWR5CisgICAgICAgICAqIHJ1bm5pbmcKKwkgKi8KKwlpZiAoIXN5c2N0bF9kaXNjb3ZlcnkpIHsKKwkJLyogQ2hlY2sgaWYgdXNlciB3YW50cyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCAqLworCQlpZiAobnNsb3RzID09IERJU0NPVkVSWV9ERUZBVUxUX1NMT1RTKQorCQkJbnNsb3RzID0gc3lzY3RsX2Rpc2NvdmVyeV9zbG90czsKKworCQlpcmxtcF9kb19kaXNjb3ZlcnkobnNsb3RzKTsKKwkJLyogTm90ZSA6IHdlIG5ldmVyIGRvIGV4cGlyeSBoZXJlLiBFeHBpcnkgd2lsbCBydW4gb24gdGhlCisJCSAqIGRpc2NvdmVyeSB0aW1lciByZWdhcmRsZXNzIG9mIHRoZSBzdGF0ZSBvZiBzeXNjdGxfZGlzY292ZXJ5CisJCSAqIEplYW4gSUkgKi8KKwl9Cit9CitFWFBPUlRfU1lNQk9MKGlybG1wX2Rpc2NvdmVyeV9yZXF1ZXN0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX2dldF9kaXNjb3ZlcmllcyAocG4sIG1hc2ssIHNsb3RzKQorICoKKyAqICAgIFJldHVybiB0aGUgY3VycmVudCBkaXNjb3ZlcnkgbG9nCisgKgorICogSWYgZGlzY292ZXJ5IGlzIG5vdCBlbmFibGVkLCB5b3Ugc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBhZ2FpbgorICogYWZ0ZXIgMSBvciAyIHNlY29uZHMgKGkuZS4gYWZ0ZXIgZGlzY292ZXJ5IGhhcyBiZWVuIGRvbmUpLgorICovCitzdHJ1Y3QgaXJkYV9kZXZpY2VfaW5mbyAqaXJsbXBfZ2V0X2Rpc2NvdmVyaWVzKGludCAqcG4sIF9fdTE2IG1hc2ssIGludCBuc2xvdHMpCit7CisJLyogSWYgZGlzY292ZXJ5IGlzIG5vdCBlbmFibGVkLCBpdCdzIGxpa2VseSB0aGF0IHRoZSBkaXNjb3ZlcnkgbG9nCisJICogd2lsbCBiZSBlbXB0eS4gU28sIHdlIHRyaWdnZXIgYSBzaW5nbGUgZGlzY292ZXJ5LCBzbyB0aGF0IG5leHQKKwkgKiB0aW1lIHRoZSB1c2VyIGNhbGwgdXMgdGhlcmUgbWlnaHQgYmUgc29tZSByZXN1bHRzIGluIHRoZSBsb2cuCisJICogSmVhbiBJSQorCSAqLworCWlmICghc3lzY3RsX2Rpc2NvdmVyeSkgeworCQkvKiBDaGVjayBpZiB1c2VyIHdhbnRzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0ICovCisJCWlmIChuc2xvdHMgPT0gRElTQ09WRVJZX0RFRkFVTFRfU0xPVFMpCisJCQluc2xvdHMgPSBzeXNjdGxfZGlzY292ZXJ5X3Nsb3RzOworCisJCS8qIFN0YXJ0IGRpc2NvdmVyeSAtIHdpbGwgY29tcGxldGUgc29tZXRpbWUgbGF0ZXIgKi8KKwkJaXJsbXBfZG9fZGlzY292ZXJ5KG5zbG90cyk7CisJCS8qIE5vdGUgOiB3ZSBuZXZlciBkbyBleHBpcnkgaGVyZS4gRXhwaXJ5IHdpbGwgcnVuIG9uIHRoZQorCQkgKiBkaXNjb3ZlcnkgdGltZXIgcmVnYXJkbGVzcyBvZiB0aGUgc3RhdGUgb2Ygc3lzY3RsX2Rpc2NvdmVyeQorCQkgKiBKZWFuIElJICovCisJfQorCisJLyogUmV0dXJuIGN1cnJlbnQgY2FjaGVkIGRpc2NvdmVyeSBsb2cgKi8KKwlyZXR1cm4oaXJsbXBfY29weV9kaXNjb3ZlcmllcyhpcmxtcC0+Y2FjaGVsb2csIHBuLCBtYXNrLCBUUlVFKSk7Cit9CitFWFBPUlRfU1lNQk9MKGlybG1wX2dldF9kaXNjb3Zlcmllcyk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9ub3RpZnlfY2xpZW50IChsb2cpCisgKgorICogICAgTm90aWZ5IGFsbCBhYm91dCBkaXNjb3ZlcmVkIGRldmljZXMKKyAqCisgKiBDbGllbnRzIHJlZ2lzdGVyZWQgd2l0aCBJckxNUCBhcmUgOgorICoJbyBJckNvbW0KKyAqCW8gSXJMQU4KKyAqCW8gQW55IHNvY2tldCAoaW4gYW55IHN0YXRlIC0gb3VjaCwgdGhhdCBtYXkgYmUgYSBsb3QgISkKKyAqIFRoZSBjbGllbnQgbWF5IGhhdmUgZGVmaW5lZCBhIGNhbGxiYWNrIHRvIGJlIG5vdGlmaWVkIGluIGNhc2Ugb2YKKyAqIHBhcnRpYWwvc2VsZWN0aXZlIGRpc2NvdmVyeSBiYXNlZCBvbiB0aGUgaGludHMgdGhhdCBpdCBwYXNzZWQgdG8gSXJMTVAuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAoraXJsbXBfbm90aWZ5X2NsaWVudChpcmxtcF9jbGllbnRfdCAqY2xpZW50LAorCQkgICAgaGFzaGJpbl90ICpsb2csIERJU0NPVkVSWV9NT0RFIG1vZGUpCit7CisJZGlzY2luZm9fdCAqZGlzY292ZXJpZXM7CS8qIENvcHkgb2YgdGhlIGRpc2NvdmVyeSBsb2cgKi8KKwlpbnQJbnVtYmVyOwkJCS8qIE51bWJlciBvZiBub2RlcyBpbiB0aGUgbG9nICovCisJaW50CWk7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogQ2hlY2sgaWYgY2xpZW50IHdhbnRzIG9yIG5vdCBwYXJ0aWFsL3NlbGVjdGl2ZSBsb2cgKG9wdGltaXNhdGlvbikgKi8KKwlpZiAoIWNsaWVudC0+ZGlzY29fY2FsbGJhY2spCisJCXJldHVybjsKKworCS8qCisJICogTG9ja2luZyBub3RlcyA6CisJICogdGhlIG9sZCBjb2RlIHdhcyBtYW5pcHVsYXRpbmcgdGhlIGxvZyBkaXJlY3RseSwgd2hpY2ggd2FzCisJICogdmVyeSByYWN5LiBOb3csIHdlIHVzZSBjb3B5X2Rpc2NvdmVyaWVzLCB0aGF0IHByb3RlY3RzCisJICogaXRzZWxmIHdoaWxlIGR1bXBpbmcgdGhlIGxvZyBmb3IgdXMuCisJICogVGhlIG92ZXJoZWFkIG9mIHRoZSBjb3B5IGlzIGNvbXBlbnNhdGVkIGJ5IHRoZSBmYWN0IHRoYXQKKwkgKiB3ZSBvbmx5IHBhc3MgbmV3IGRpc2NvdmVyaWVzIGluIG5vcm1hbCBtb2RlIGFuZCBkb24ndAorCSAqIHBhc3MgdGhlIHNhbWUgb2xkIGVudHJ5IGV2ZXJ5IDNzIHRvIHRoZSBjYWxsZXIgYXMgd2UgdXNlZAorCSAqIHRvIGRvICh2aXJ0dWFsIGZ1bmN0aW9uIGNhbGxpbmcgaXMgZXhwZW5zaXZlKS4KKwkgKiBKZWFuIElJCisJICovCisKKwkvKgorCSAqIE5vdywgY2hlY2sgYWxsIGRpc2NvdmVyZWQgZGV2aWNlcyAoaWYgYW55KSwgYW5kIG5vdGlmeSBjbGllbnQKKwkgKiBvbmx5IGFib3V0IHRoZSBzZXJ2aWNlcyB0aGF0IHRoZSBjbGllbnQgaXMgaW50ZXJlc3RlZCBpbgorCSAqIFdlIGFsc28gbm90aWZ5IG9ubHkgYWJvdXQgdGhlIG5ldyBkZXZpY2VzIHVubGVzcyB0aGUgY2FsbGVyCisJICogZXhwbGljaXRseSByZXF1ZXN0IGEgZHVtcCBvZiB0aGUgbG9nLiBKZWFuIElJCisJICovCisJZGlzY292ZXJpZXMgPSBpcmxtcF9jb3B5X2Rpc2NvdmVyaWVzKGxvZywgJm51bWJlciwKKwkJCQkJICAgICBjbGllbnQtPmhpbnRfbWFzay53b3JkLAorCQkJCQkgICAgIChtb2RlID09IERJU0NPVkVSWV9MT0cpKTsKKwkvKiBDaGVjayBpZiB0aGUgd2UgZ290IHNvbWUgcmVzdWx0cyAqLworCWlmIChkaXNjb3ZlcmllcyA9PSBOVUxMKQorCQlyZXR1cm47CS8qIE5vIG5vZGVzIGRpc2NvdmVyZWQgKi8KKworCS8qIFBhc3MgYWxsIGVudHJpZXMgdG8gdGhlIGxpc3RlbmVyICovCisJZm9yKGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCisJCWNsaWVudC0+ZGlzY29fY2FsbGJhY2soJihkaXNjb3Zlcmllc1tpXSksIG1vZGUsIGNsaWVudC0+cHJpdik7CisKKwkvKiBGcmVlIHVwIG91ciBidWZmZXIgKi8KKwlrZnJlZShkaXNjb3Zlcmllcyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9kaXNjb3ZlcnlfY29uZmlybSAoIHNlbGYsIGxvZykKKyAqCisgKiAgICBTb21lIGRldmljZShzKSBhbnN3ZXJlZCB0byBvdXIgZGlzY292ZXJ5IHJlcXVlc3QhIENoZWNrIHRvIHNlZSB3aGljaAorICogICAgZGV2aWNlIGl0IGlzLCBhbmQgZ2l2ZSBpbmRpY2F0aW9uIHRvIHRoZSBjbGllbnQocykKKyAqCisgKi8KK3ZvaWQgaXJsbXBfZGlzY292ZXJ5X2NvbmZpcm0oaGFzaGJpbl90ICpsb2csIERJU0NPVkVSWV9NT0RFIG1vZGUpCit7CisJaXJsbXBfY2xpZW50X3QgKmNsaWVudDsKKwlpcmxtcF9jbGllbnRfdCAqY2xpZW50X25leHQ7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQobG9nICE9IE5VTEwsIHJldHVybjspOworCisJaWYgKCEoSEFTSEJJTl9HRVRfU0laRShsb2cpKSkKKwkJcmV0dXJuOworCisJLyogRm9yIGVhY2ggY2xpZW50IC0gbm90aWZ5IGNhbGxiYWNrIG1heSB0b3VjaCBjbGllbnQgbGlzdCAqLworCWNsaWVudCA9IChpcmxtcF9jbGllbnRfdCAqKSBoYXNoYmluX2dldF9maXJzdChpcmxtcC0+Y2xpZW50cyk7CisJd2hpbGUgKE5VTEwgIT0gaGFzaGJpbl9maW5kX25leHQoaXJsbXAtPmNsaWVudHMsIChsb25nKSBjbGllbnQsIE5VTEwsCisJCQkJCSAodm9pZCAqKSAmY2xpZW50X25leHQpICkgeworCQkvKiBDaGVjayBpZiB3ZSBzaG91bGQgbm90aWZ5IGNsaWVudCAqLworCQlpcmxtcF9ub3RpZnlfY2xpZW50KGNsaWVudCwgbG9nLCBtb2RlKTsKKworCQljbGllbnQgPSBjbGllbnRfbmV4dDsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9kaXNjb3ZlcnlfZXhwaXJ5IChleHBpcnkpCisgKgorICoJVGhpcyBkZXZpY2UgaXMgbm8gbG9uZ2VyIGJlZW4gZGlzY292ZXJlZCwgYW5kIHRoZXJlZm9yZSBpdCBpcyBiZWluZworICoJcHVyZ2VkIGZyb20gdGhlIGRpc2NvdmVyeSBsb2cuIEluZm9ybSBhbGwgY2xpZW50cyB3aG8gaGF2ZQorICoJcmVnaXN0ZXJlZCBmb3IgdGhpcyBldmVudC4uLgorICoKKyAqCU5vdGUgOiBjYWxsZWQgZXhjbHVzaXZlbHkgZnJvbSBkaXNjb3ZlcnkuYworICoJTm90ZSA6IHRoaXMgaXMgbm8gbG9uZ2VyIGNhbGxlZCB1bmRlciBkaXNjb3Zlcnkgc3BpbmxvY2ssIHNvIHRoZQorICoJCWNsaWVudCBjYW4gZG8gd2hhdGV2ZXIgaGUgd2FudHMgaW4gdGhlIGNhbGxiYWNrLgorICovCit2b2lkIGlybG1wX2Rpc2NvdmVyeV9leHBpcnkoZGlzY2luZm9fdCAqZXhwaXJpZXMsIGludCBudW1iZXIpCit7CisJaXJsbXBfY2xpZW50X3QgKmNsaWVudDsKKwlpcmxtcF9jbGllbnRfdCAqY2xpZW50X25leHQ7CisJaW50CQlpOworCisJSVJEQV9ERUJVRygzLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKGV4cGlyaWVzICE9IE5VTEwsIHJldHVybjspOworCisJLyogRm9yIGVhY2ggY2xpZW50IC0gbm90aWZ5IGNhbGxiYWNrIG1heSB0b3VjaCBjbGllbnQgbGlzdCAqLworCWNsaWVudCA9IChpcmxtcF9jbGllbnRfdCAqKSBoYXNoYmluX2dldF9maXJzdChpcmxtcC0+Y2xpZW50cyk7CisJd2hpbGUgKE5VTEwgIT0gaGFzaGJpbl9maW5kX25leHQoaXJsbXAtPmNsaWVudHMsIChsb25nKSBjbGllbnQsIE5VTEwsCisJCQkJCSAodm9pZCAqKSAmY2xpZW50X25leHQpICkgeworCisJCS8qIFBhc3MgYWxsIGVudHJpZXMgdG8gdGhlIGxpc3RlbmVyICovCisJCWZvcihpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7CisJCQkvKiBDaGVjayBpZiB3ZSBzaG91bGQgbm90aWZ5IGNsaWVudCAqLworCQkJaWYgKChjbGllbnQtPmV4cGlyX2NhbGxiYWNrKSAmJgorCQkJICAgIChjbGllbnQtPmhpbnRfbWFzay53b3JkICYgdTE2aG8oZXhwaXJpZXNbaV0uaGludHMpCisJCQkgICAgICYgMHg3ZjdmKSApCisJCQkJY2xpZW50LT5leHBpcl9jYWxsYmFjaygmKGV4cGlyaWVzW2ldKSwKKwkJCQkJCSAgICAgICBFWFBJUllfVElNRU9VVCwKKwkJCQkJCSAgICAgICBjbGllbnQtPnByaXYpOworCQl9CisKKwkJLyogTmV4dCBjbGllbnQgKi8KKwkJY2xpZW50ID0gY2xpZW50X25leHQ7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJsbXBfZ2V0X2Rpc2NvdmVyeV9yZXNwb25zZSAoKQorICoKKyAqICAgIFVzZWQgYnkgSXJMQVAgdG8gZ2V0IHRoZSBkaXNjb3ZlcnkgaW5mbyBpdCBuZWVkcyB3aGVuIGFuc3dlcmluZworICogICAgZGlzY292ZXJ5IHJlcXVlc3RzIGJ5IG90aGVyIGRldmljZXMuCisgKi8KK2Rpc2NvdmVyeV90ICppcmxtcF9nZXRfZGlzY292ZXJ5X3Jlc3BvbnNlKHZvaWQpCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKGlybG1wICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CisKKwl1MTZobyhpcmxtcC0+ZGlzY292ZXJ5X3JzcC5kYXRhLmhpbnRzKSA9IGlybG1wLT5oaW50cy53b3JkOworCisJLyoKKwkgKiAgU2V0IGNoYXJhY3RlciBzZXQgZm9yIGRldmljZSBuYW1lICh3ZSB1c2UgQVNDSUkpLCBhbmQKKwkgKiAgY29weSBkZXZpY2UgbmFtZS4gUmVtZW1iZXIgdG8gbWFrZSByb29tIGZvciBhIFwwIGF0IHRoZQorCSAqICBlbmQKKwkgKi8KKwlpcmxtcC0+ZGlzY292ZXJ5X3JzcC5kYXRhLmNoYXJzZXQgPSBDU19BU0NJSTsKKworCXN0cm5jcHkoaXJsbXAtPmRpc2NvdmVyeV9yc3AuZGF0YS5pbmZvLCBzeXNjdGxfZGV2bmFtZSwKKwkJTklDS05BTUVfTUFYX0xFTik7CisJaXJsbXAtPmRpc2NvdmVyeV9yc3AubmFtZV9sZW4gPSBzdHJsZW4oaXJsbXAtPmRpc2NvdmVyeV9yc3AuZGF0YS5pbmZvKTsKKworCXJldHVybiAmaXJsbXAtPmRpc2NvdmVyeV9yc3A7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9kYXRhX3JlcXVlc3QgKHNlbGYsIHNrYikKKyAqCisgKiAgICBTZW5kIHNvbWUgZGF0YSB0byBwZWVyIGRldmljZQorICoKKyAqIE5vdGUgb24gc2tiIG1hbmFnZW1lbnQgOgorICogQWZ0ZXIgY2FsbGluZyB0aGUgbG93ZXIgbGF5ZXJzIG9mIHRoZSBJckRBIHN0YWNrLCB3ZSBhbHdheXMKKyAqIGtmcmVlKCkgdGhlIHNrYiwgd2hpY2ggZHJvcCB0aGUgcmVmZXJlbmNlIGNvdW50IChhbmQgcG90ZW50aWFsbHkKKyAqIGRlc3Ryb3kgaXQpLgorICogSXJMTVAgYW5kIElyTEFQIG1heSBxdWV1ZSB0aGUgcGFja2V0LCBhbmQgaW4gdGhvc2UgY2FzZXMgd2lsbCBuZWVkCisgKiB0byB1c2Ugc2tiX2dldCgpIHRvIGtlZXAgaXQgYXJvdW5kLgorICogSmVhbiBJSQorICovCitpbnQgaXJsbXBfZGF0YV9yZXF1ZXN0KHN0cnVjdCBsc2FwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqdXNlcmRhdGEpCit7CisJaW50CXJldDsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xTQVBfTUFHSUMsIHJldHVybiAtMTspOworCisJLyogTWFrZSByb29tIGZvciBNVVggaGVhZGVyICovCisJSVJEQV9BU1NFUlQoc2tiX2hlYWRyb29tKHVzZXJkYXRhKSA+PSBMTVBfSEVBREVSLCByZXR1cm4gLTE7KTsKKwlza2JfcHVzaCh1c2VyZGF0YSwgTE1QX0hFQURFUik7CisKKwlyZXQgPSBpcmxtcF9kb19sc2FwX2V2ZW50KHNlbGYsIExNX0RBVEFfUkVRVUVTVCwgdXNlcmRhdGEpOworCisJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgaXJsYXBfZGF0YV9yZXF1ZXN0KCkuICovCisJZGV2X2tmcmVlX3NrYih1c2VyZGF0YSk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpcmxtcF9kYXRhX3JlcXVlc3QpOworCisvKgorICogRnVuY3Rpb24gaXJsbXBfZGF0YV9pbmRpY2F0aW9uIChoYW5kbGUsIHNrYikKKyAqCisgKiAgICBHb3QgZGF0YSBmcm9tIExBUCBsYXllciBzbyBwYXNzIGl0IHVwIHRvIHVwcGVyIGxheWVyCisgKgorICovCit2b2lkIGlybG1wX2RhdGFfaW5kaWNhdGlvbihzdHJ1Y3QgbHNhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKiBIaWRlIExNUCBoZWFkZXIgZnJvbSBsYXllciBhYm92ZSAqLworCXNrYl9wdWxsKHNrYiwgTE1QX0hFQURFUik7CisKKwlpZiAoc2VsZi0+bm90aWZ5LmRhdGFfaW5kaWNhdGlvbikgeworCQkvKiBEb24ndCBmb3JnZXQgdG8gcmVmY291bnQgaXQgLSBzZWUgaXJsYXBfZHJpdmVyX3JjdigpLiAqLworCQlza2JfZ2V0KHNrYik7CisJCXNlbGYtPm5vdGlmeS5kYXRhX2luZGljYXRpb24oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLCBzZWxmLCBza2IpOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX3VkYXRhX3JlcXVlc3QgKHNlbGYsIHNrYikKKyAqLworaW50IGlybG1wX3VkYXRhX3JlcXVlc3Qoc3RydWN0IGxzYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICp1c2VyZGF0YSkKK3sKKwlpbnQJcmV0OworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHVzZXJkYXRhICE9IE5VTEwsIHJldHVybiAtMTspOworCisJLyogTWFrZSByb29tIGZvciBNVVggaGVhZGVyICovCisJSVJEQV9BU1NFUlQoc2tiX2hlYWRyb29tKHVzZXJkYXRhKSA+PSBMTVBfSEVBREVSLCByZXR1cm4gLTE7KTsKKwlza2JfcHVzaCh1c2VyZGF0YSwgTE1QX0hFQURFUik7CisKKwlyZXQgPSBpcmxtcF9kb19sc2FwX2V2ZW50KHNlbGYsIExNX1VEQVRBX1JFUVVFU1QsIHVzZXJkYXRhKTsKKworCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIGlybGFwX2RhdGFfcmVxdWVzdCgpLiAqLworCWRldl9rZnJlZV9za2IodXNlcmRhdGEpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX3VkYXRhX2luZGljYXRpb24gKHNlbGYsIHNrYikKKyAqCisgKiAgICBTZW5kIHVucmVsaWFibGUgZGF0YSAoYnV0IHN0aWxsIHdpdGhpbiB0aGUgY29ubmVjdGlvbikKKyAqCisgKi8KK3ZvaWQgaXJsbXBfdWRhdGFfaW5kaWNhdGlvbihzdHJ1Y3QgbHNhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOworCisJLyogSGlkZSBMTVAgaGVhZGVyIGZyb20gbGF5ZXIgYWJvdmUgKi8KKwlza2JfcHVsbChza2IsIExNUF9IRUFERVIpOworCisJaWYgKHNlbGYtPm5vdGlmeS51ZGF0YV9pbmRpY2F0aW9uKSB7CisJCS8qIERvbid0IGZvcmdldCB0byByZWZjb3VudCBpdCAtIHNlZSBpcmxhcF9kcml2ZXJfcmN2KCkuICovCisJCXNrYl9nZXQoc2tiKTsKKwkJc2VsZi0+bm90aWZ5LnVkYXRhX2luZGljYXRpb24oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLCBzZWxmLAorCQkJCQkgICAgICBza2IpOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX2Nvbm5sZXNzX2RhdGFfcmVxdWVzdCAoc2VsZiwgc2tiKQorICovCisjaWZkZWYgQ09ORklHX0lSREFfVUxUUkEKK2ludCBpcmxtcF9jb25ubGVzc19kYXRhX3JlcXVlc3Qoc3RydWN0IGxzYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICp1c2VyZGF0YSwKKwkJCQlfX3U4IHBpZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqY2xvbmVfc2tiOworCXN0cnVjdCBsYXBfY2IgKmxhcDsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVCh1c2VyZGF0YSAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCS8qIE1ha2Ugcm9vbSBmb3IgTVVYIGFuZCBQSUQgaGVhZGVyICovCisJSVJEQV9BU1NFUlQoc2tiX2hlYWRyb29tKHVzZXJkYXRhKSA+PSBMTVBfSEVBREVSK0xNUF9QSURfSEVBREVSLAorCQkgICAgcmV0dXJuIC0xOyk7CisKKwkvKiBJbnNlcnQgcHJvdG9jb2wgaWRlbnRpZmllciAqLworCXNrYl9wdXNoKHVzZXJkYXRhLCBMTVBfUElEX0hFQURFUik7CisJaWYoc2VsZiAhPSBOVUxMKQorCSAgdXNlcmRhdGEtPmRhdGFbMF0gPSBzZWxmLT5waWQ7CisJZWxzZQorCSAgdXNlcmRhdGEtPmRhdGFbMF0gPSBwaWQ7CisKKwkvKiBDb25uZWN0aW9ubGVzcyBzb2NrZXRzIG11c3QgdXNlIDB4NzAgKi8KKwlza2JfcHVzaCh1c2VyZGF0YSwgTE1QX0hFQURFUik7CisJdXNlcmRhdGEtPmRhdGFbMF0gPSB1c2VyZGF0YS0+ZGF0YVsxXSA9IExTQVBfQ09OTkxFU1M7CisKKwkvKiBUcnkgdG8gc2VuZCBDb25uZWN0aW9ubGVzcyAgcGFja2V0cyBvdXQgb24gYWxsIGxpbmtzICovCisJbGFwID0gKHN0cnVjdCBsYXBfY2IgKikgaGFzaGJpbl9nZXRfZmlyc3QoaXJsbXAtPmxpbmtzKTsKKwl3aGlsZSAobGFwICE9IE5VTEwpIHsKKwkJSVJEQV9BU1NFUlQobGFwLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm4gLTE7KTsKKworCQljbG9uZV9za2IgPSBza2JfY2xvbmUodXNlcmRhdGEsIEdGUF9BVE9NSUMpOworCQlpZiAoIWNsb25lX3NrYikgeworCQkJZGV2X2tmcmVlX3NrYih1c2VyZGF0YSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWlybGFwX3VuaXRkYXRhX3JlcXVlc3QobGFwLT5pcmxhcCwgY2xvbmVfc2tiKTsKKwkJLyogaXJsYXBfdW5pdGRhdGFfcmVxdWVzdCgpIGRvbid0IGluY3JlYXNlIHJlZmNvdW50LAorCQkgKiBzbyBubyBkZXZfa2ZyZWVfc2tiKCkgLSBKZWFuIElJICovCisKKwkJbGFwID0gKHN0cnVjdCBsYXBfY2IgKikgaGFzaGJpbl9nZXRfbmV4dChpcmxtcC0+bGlua3MpOworCX0KKwlkZXZfa2ZyZWVfc2tiKHVzZXJkYXRhKTsKKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19JUkRBX1VMVFJBICovCisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9jb25ubGVzc19kYXRhX2luZGljYXRpb24gKHNlbGYsIHNrYikKKyAqCisgKiAgICBSZWNlaXZlIHVucmVsaWFibGUgZGF0YSBvdXRzaWRlIGFueSBjb25uZWN0aW9uLiBNb3N0bHkgdXNlZCBieSBVbHRyYQorICoKKyAqLworI2lmZGVmIENPTkZJR19JUkRBX1VMVFJBCit2b2lkIGlybG1wX2Nvbm5sZXNzX2RhdGFfaW5kaWNhdGlvbihzdHJ1Y3QgbHNhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOworCisJLyogSGlkZSBMTVAgYW5kIFBJRCBoZWFkZXIgZnJvbSBsYXllciBhYm92ZSAqLworCXNrYl9wdWxsKHNrYiwgTE1QX0hFQURFUitMTVBfUElEX0hFQURFUik7CisKKwlpZiAoc2VsZi0+bm90aWZ5LnVkYXRhX2luZGljYXRpb24pIHsKKwkJLyogRG9uJ3QgZm9yZ2V0IHRvIHJlZmNvdW50IGl0IC0gc2VlIGlybGFwX2RyaXZlcl9yY3YoKS4gKi8KKwkJc2tiX2dldChza2IpOworCQlzZWxmLT5ub3RpZnkudWRhdGFfaW5kaWNhdGlvbihzZWxmLT5ub3RpZnkuaW5zdGFuY2UsIHNlbGYsCisJCQkJCSAgICAgIHNrYik7CisJfQorfQorI2VuZGlmIC8qIENPTkZJR19JUkRBX1VMVFJBICovCisKKy8qCisgKiBQcm9wYWdhdGUgc3RhdHVzIGluZGljYXRpb24gZnJvbSBMQVAgdG8gTFNBUHMgKHZpYSBMTVApCisgKiBUaGlzIGRvbid0IHRyaWdnZXIgYW55IGNoYW5nZSBvZiBzdGF0ZSBpbiBsYXBfY2IsIGxtcF9jYiBvciBsc2FwX2NiLAorICogYW5kIHRoZSBldmVudCBpcyBzdGF0ZWxlc3MsIHRoZXJlZm9yZSB3ZSBjYW4gYnlwYXNzIGJvdGggc3RhdGUgbWFjaGluZXMKKyAqIGFuZCBzZW5kIHRoZSBldmVudCBkaXJlY3QgdG8gdGhlIExTQVAgdXNlci4KKyAqIEplYW4gSUkKKyAqLwordm9pZCBpcmxtcF9zdGF0dXNfaW5kaWNhdGlvbihzdHJ1Y3QgbGFwX2NiICpzZWxmLAorCQkJICAgICBMSU5LX1NUQVRVUyBsaW5rLCBMT0NLX1NUQVRVUyBsb2NrKQoreworCXN0cnVjdCBsc2FwX2NiICpuZXh0OworCXN0cnVjdCBsc2FwX2NiICpjdXJyOworCisJLyogU2VuZCBzdGF0dXNfaW5kaWNhdGlvbiB0byBhbGwgTFNBUHMgdXNpbmcgdGhpcyBsaW5rICovCisJY3VyciA9IChzdHJ1Y3QgbHNhcF9jYiAqKSBoYXNoYmluX2dldF9maXJzdCggc2VsZi0+bHNhcHMpOworCXdoaWxlIChOVUxMICE9IGhhc2hiaW5fZmluZF9uZXh0KHNlbGYtPmxzYXBzLCAobG9uZykgY3VyciwgTlVMTCwKKwkJCQkJICh2b2lkICopICZuZXh0KSApIHsKKwkJSVJEQV9BU1NFUlQoY3Vyci0+bWFnaWMgPT0gTE1QX0xTQVBfTUFHSUMsIHJldHVybjspOworCQkvKgorCQkgKiAgSW5mb3JtIHNlcnZpY2UgdXNlciBpZiBoZSBoYXMgcmVxdWVzdGVkIGl0CisJCSAqLworCQlpZiAoY3Vyci0+bm90aWZ5LnN0YXR1c19pbmRpY2F0aW9uICE9IE5VTEwpCisJCQljdXJyLT5ub3RpZnkuc3RhdHVzX2luZGljYXRpb24oY3Vyci0+bm90aWZ5Lmluc3RhbmNlLAorCQkJCQkJICAgICAgIGxpbmssIGxvY2spOworCQllbHNlCisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBubyBoYW5kbGVyXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCWN1cnIgPSBuZXh0OworCX0KK30KKworLyoKKyAqIFJlY2VpdmUgZmxvdyBjb250cm9sIGluZGljYXRpb24gZnJvbSBMQVAuCisgKiBMQVAgd2FudCB1cyB0byBzZW5kIGl0IG9uZSBtb3JlIGZyYW1lLiBXZSBpbXBsZW1lbnQgYSBzaW1wbGUgcm91bmQKKyAqIHJvYmluIHNjaGVkdWxlciBiZXR3ZWVuIHRoZSBhY3RpdmUgc29ja2V0cyBzbyB0aGF0IHdlIGdldCBhIGJpdCBvZgorICogZmFpcm5lc3MuIE5vdGUgdGhhdCB0aGUgcm91bmQgcm9iaW4gaXMgZmFyIGZyb20gcGVyZmVjdCwgYnV0IGl0J3MKKyAqIGJldHRlciB0aGFuIG5vdGhpbmcuCisgKiBXZSB0aGVuIHBvbGwgdGhlIHNlbGVjdGVkIHNvY2tldCBzbyB0aGF0IHdlIGNhbiBkbyBzeW5jaHJvbm91cworICogcmVmaWxsaW5nIG9mIElyTEFQICh3aGljaCBhbGxvdyB0byBtaW5pbWlzZSB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMpLgorICogSmVhbiBJSQorICovCit2b2lkIGlybG1wX2Zsb3dfaW5kaWNhdGlvbihzdHJ1Y3QgbGFwX2NiICpzZWxmLCBMT0NBTF9GTE9XIGZsb3cpCit7CisJc3RydWN0IGxzYXBfY2IgKm5leHQ7CisJc3RydWN0IGxzYXBfY2IgKmN1cnI7CisJaW50CWxzYXBfdG9kbzsKKworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MQVBfTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKGZsb3cgPT0gRkxPV19TVEFSVCwgcmV0dXJuOyk7CisKKwkvKiBHZXQgdGhlIG51bWJlciBvZiBsc2FwLiBUaGF0J3MgdGhlIG9ubHkgc2FmZSB3YXkgdG8ga25vdworCSAqIHRoYXQgd2UgaGF2ZSBsb29wZWQgYXJvdW5kLi4uIC0gSmVhbiBJSSAqLworCWxzYXBfdG9kbyA9IEhBU0hCSU5fR0VUX1NJWkUoc2VsZi0+bHNhcHMpOworCUlSREFfREVCVUcoNCwgIiVzKCkgOiAlZCBsc2FwcyB0byBzY2FuXG4iLCBfX0ZVTkNUSU9OX18sIGxzYXBfdG9kbyk7CisKKwkvKiBQb2xsIGxzYXAgaW4gb3JkZXIgdW50aWwgdGhlIHF1ZXVlIGlzIGZ1bGwgb3IgdW50aWwgd2UKKwkgKiB0cmllZCB0aGVtIGFsbC4KKwkgKiBNb3N0IG9mdGVuLCB0aGUgY3VycmVudCBMU0FQIHdpbGwgaGF2ZSBzb21ldGhpbmcgdG8gc2VuZCwKKwkgKiBzbyB3ZSB3aWxsIGdvIHRocm91Z2ggdGhpcyBsb29wIG9ubHkgb25jZS4gLSBKZWFuIElJICovCisJd2hpbGUoKGxzYXBfdG9kby0tKSAmJgorCSAgICAgIChJUkxBUF9HRVRfVFhfUVVFVUVfTEVOKHNlbGYtPmlybGFwKSA8IExBUF9ISUdIX1RIUkVTSE9MRCkpIHsKKwkJLyogVHJ5IHRvIGZpbmQgdGhlIG5leHQgbHNhcCB3ZSBzaG91bGQgcG9sbC4gKi8KKwkJbmV4dCA9IHNlbGYtPmZsb3dfbmV4dDsKKwkJLyogSWYgd2UgaGF2ZSBubyBsc2FwLCByZXN0YXJ0IGZyb20gZmlyc3Qgb25lICovCisJCWlmKG5leHQgPT0gTlVMTCkKKwkJCW5leHQgPSAoc3RydWN0IGxzYXBfY2IgKikgaGFzaGJpbl9nZXRfZmlyc3Qoc2VsZi0+bHNhcHMpOworCQkvKiBWZXJpZnkgY3VycmVudCBvbmUgYW5kIGZpbmQgdGhlIG5leHQgb25lICovCisJCWN1cnIgPSBoYXNoYmluX2ZpbmRfbmV4dChzZWxmLT5sc2FwcywgKGxvbmcpIG5leHQsIE5VTEwsCisJCQkJCSAodm9pZCAqKSAmc2VsZi0+Zmxvd19uZXh0KTsKKwkJLyogVWgtb2guLi4gUGFyYW5vaWEgKi8KKwkJaWYoY3VyciA9PSBOVUxMKQorCQkJYnJlYWs7CisJCUlSREFfREVCVUcoNCwgIiVzKCkgOiBjdXJyIGlzICVwLCBuZXh0IHdhcyAlcCBhbmQgaXMgbm93ICVwLCBzdGlsbCAlZCB0byBnbyAtIHF1ZXVlIGxlbiA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGN1cnIsIG5leHQsIHNlbGYtPmZsb3dfbmV4dCwgbHNhcF90b2RvLCBJUkxBUF9HRVRfVFhfUVVFVUVfTEVOKHNlbGYtPmlybGFwKSk7CisKKwkJLyogSW5mb3JtIGxzYXAgdXNlciB0aGF0IGl0IGNhbiBzZW5kIG9uZSBtb3JlIHBhY2tldC4gKi8KKwkJaWYgKGN1cnItPm5vdGlmeS5mbG93X2luZGljYXRpb24gIT0gTlVMTCkKKwkJCWN1cnItPm5vdGlmeS5mbG93X2luZGljYXRpb24oY3Vyci0+bm90aWZ5Lmluc3RhbmNlLAorCQkJCQkJICAgICBjdXJyLCBmbG93KTsKKwkJZWxzZQorCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgbm8gaGFuZGxlclxuIiwgX19GVU5DVElPTl9fKTsKKwl9Cit9CisKKyNpZiAwCisvKgorICogRnVuY3Rpb24gaXJsbXBfaGludF90b19zZXJ2aWNlIChoaW50KQorICoKKyAqICAgIFJldHVybnMgYSBsaXN0IG9mIGFsbCBzZXJ2aWNzIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gaGludCBiaXRzLiBUaGlzCisgKiAgICBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgdGhlIGhpbnQgYml0cyBoYXZlIHRoZSBzaXplIG9mIHR3byBieXRlcyBvbmx5CisgKi8KK19fdTggKmlybG1wX2hpbnRfdG9fc2VydmljZShfX3U4ICpoaW50KQoreworCV9fdTggKnNlcnZpY2U7CisJaW50IGkgPSAwOworCisJLyoKKwkgKiBBbGxvY2F0ZSBhcnJheSB0byBzdG9yZSBzZXJ2aWNlcyBpbi4gMTYgZW50cmllcyBzaG91bGQgYmUgc2FmZQorCSAqIHNpbmNlIHdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgMiBoaW50IGJ5dGVzCisJICovCisJc2VydmljZSA9IGttYWxsb2MoMTYsIEdGUF9BVE9NSUMpOworCWlmICghc2VydmljZSkgeworCQlJUkRBX0RFQlVHKDEsICIlcygpLCBVbmFibGUgdG8ga21hbGxvYyFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghaGludFswXSkgeworCQlJUkRBX0RFQlVHKDEsICI8Tm9uZT5cbiIpOworCQlrZnJlZShzZXJ2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChoaW50WzBdICYgSElOVF9QTlApCisJCUlSREFfREVCVUcoMSwgIlBuUCBDb21wYXRpYmxlICIpOworCWlmIChoaW50WzBdICYgSElOVF9QREEpCisJCUlSREFfREVCVUcoMSwgIlBEQS9QYWxtdG9wICIpOworCWlmIChoaW50WzBdICYgSElOVF9DT01QVVRFUikKKwkJSVJEQV9ERUJVRygxLCAiQ29tcHV0ZXIgIik7CisJaWYgKGhpbnRbMF0gJiBISU5UX1BSSU5URVIpIHsKKwkJSVJEQV9ERUJVRygxLCAiUHJpbnRlciAiKTsKKwkJc2VydmljZVtpKytdID0gU19QUklOVEVSOworCX0KKwlpZiAoaGludFswXSAmIEhJTlRfTU9ERU0pCisJCUlSREFfREVCVUcoMSwgIk1vZGVtICIpOworCWlmIChoaW50WzBdICYgSElOVF9GQVgpCisJCUlSREFfREVCVUcoMSwgIkZheCAiKTsKKwlpZiAoaGludFswXSAmIEhJTlRfTEFOKSB7CisJCUlSREFfREVCVUcoMSwgIkxBTiBBY2Nlc3MgIik7CisJCXNlcnZpY2VbaSsrXSA9IFNfTEFOOworCX0KKwkvKgorCSAqICBUZXN0IGlmIGV4dGVuc2lvbiBieXRlIGV4aXN0cy4gVGhpcyBieXRlIHdpbGwgdXN1YWxseSBiZQorCSAqICB0aGVyZSwgYnV0IHRoaXMgaXMgbm90IHJlYWxseSByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQuCisJICogIChJckxNUCBwLiAyOSkKKwkgKi8KKwlpZiAoaGludFswXSAmIEhJTlRfRVhURU5TSU9OKSB7CisJCWlmIChoaW50WzFdICYgSElOVF9URUxFUEhPTlkpIHsKKwkJCUlSREFfREVCVUcoMSwgIlRlbGVwaG9ueSAiKTsKKwkJCXNlcnZpY2VbaSsrXSA9IFNfVEVMRVBIT05ZOworCQl9IGlmIChoaW50WzFdICYgSElOVF9GSUxFX1NFUlZFUikKKwkJCUlSREFfREVCVUcoMSwgIkZpbGUgU2VydmVyICIpOworCisJCWlmIChoaW50WzFdICYgSElOVF9DT01NKSB7CisJCQlJUkRBX0RFQlVHKDEsICJJckNPTU0gIik7CisJCQlzZXJ2aWNlW2krK10gPSBTX0NPTU07CisJCX0KKwkJaWYgKGhpbnRbMV0gJiBISU5UX09CRVgpIHsKKwkJCUlSREFfREVCVUcoMSwgIklyT0JFWCAiKTsKKwkJCXNlcnZpY2VbaSsrXSA9IFNfT0JFWDsKKwkJfQorCX0KKwlJUkRBX0RFQlVHKDEsICJcbiIpOworCisJLyogU28gdGhhdCBjbGllbnQgY2FuIGJlIG5vdGlmaWVkIGFib3V0IGFueSBkaXNjb3ZlcnkgKi8KKwlzZXJ2aWNlW2krK10gPSBTX0FOWTsKKworCXNlcnZpY2VbaV0gPSBTX0VORDsKKworCXJldHVybiBzZXJ2aWNlOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBfX3UxNiBzZXJ2aWNlX2hpbnRfbWFwcGluZ1tTX0VORF1bMl0gPSB7CisJeyBISU5UX1BOUCwJCTAgfSwJCQkvKiBTX1BOUCAqLworCXsgSElOVF9QREEsCQkwIH0sCQkJLyogU19QREEgKi8KKwl7IEhJTlRfQ09NUFVURVIsCTAgfSwJCQkvKiBTX0NPTVBVVEVSICovCisJeyBISU5UX1BSSU5URVIsCQkwIH0sCQkJLyogU19QUklOVEVSICovCisJeyBISU5UX01PREVNLAkJMCB9LAkJCS8qIFNfTU9ERU0gKi8KKwl7IEhJTlRfRkFYLAkJMCB9LAkJCS8qIFNfRkFYICovCisJeyBISU5UX0xBTiwJCTAgfSwJCQkvKiBTX0xBTiAqLworCXsgSElOVF9FWFRFTlNJT04sCUhJTlRfVEVMRVBIT05ZIH0sCS8qIFNfVEVMRVBIT05ZICovCisJeyBISU5UX0VYVEVOU0lPTiwJSElOVF9DT01NIH0sCQkvKiBTX0NPTU0gKi8KKwl7IEhJTlRfRVhURU5TSU9OLAlISU5UX09CRVggfSwJCS8qIFNfT0JFWCAqLworCXsgMHhGRiwJCQkweEZGIH0sCQkJLyogU19BTlkgKi8KK307CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9zZXJ2aWNlX3RvX2hpbnQgKHNlcnZpY2UpCisgKgorICogICAgQ29udmVydHMgYSBzZXJ2aWNlIHR5cGUsIHRvIGEgaGludCBiaXQKKyAqCisgKiAgICBSZXR1cm5zOiBhIDE2IGJpdCBoaW50IHZhbHVlLCB3aXRoIHRoZSBzZXJ2aWNlIGJpdCBzZXQKKyAqLworX191MTYgaXJsbXBfc2VydmljZV90b19oaW50KGludCBzZXJ2aWNlKQoreworCV9fdTE2X2hvc3Rfb3JkZXIgaGludDsKKworCWhpbnQuYnl0ZVswXSA9IHNlcnZpY2VfaGludF9tYXBwaW5nW3NlcnZpY2VdWzBdOworCWhpbnQuYnl0ZVsxXSA9IHNlcnZpY2VfaGludF9tYXBwaW5nW3NlcnZpY2VdWzFdOworCisJcmV0dXJuIGhpbnQud29yZDsKK30KK0VYUE9SVF9TWU1CT0woaXJsbXBfc2VydmljZV90b19oaW50KTsKKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX3JlZ2lzdGVyX3NlcnZpY2UgKHNlcnZpY2UpCisgKgorICogICAgUmVnaXN0ZXIgbG9jYWwgc2VydmljZSB3aXRoIElyTE1QCisgKgorICovCit2b2lkICppcmxtcF9yZWdpc3Rlcl9zZXJ2aWNlKF9fdTE2IGhpbnRzKQoreworCWlybG1wX3NlcnZpY2VfdCAqc2VydmljZTsKKworCUlSREFfREVCVUcoNCwgIiVzKCksIGhpbnRzID0gJTA0eFxuIiwgX19GVU5DVElPTl9fLCBoaW50cyk7CisKKwkvKiBNYWtlIGEgbmV3IHJlZ2lzdHJhdGlvbiAqLworCXNlcnZpY2UgPSBrbWFsbG9jKHNpemVvZihpcmxtcF9zZXJ2aWNlX3QpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNlcnZpY2UpIHsKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgVW5hYmxlIHRvIGttYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc2VydmljZS0+aGludHMud29yZCA9IGhpbnRzOworCWhhc2hiaW5faW5zZXJ0KGlybG1wLT5zZXJ2aWNlcywgKGlyZGFfcXVldWVfdCAqKSBzZXJ2aWNlLAorCQkgICAgICAgKGxvbmcpIHNlcnZpY2UsIE5VTEwpOworCisJaXJsbXAtPmhpbnRzLndvcmQgfD0gaGludHM7CisKKwlyZXR1cm4gKHZvaWQgKilzZXJ2aWNlOworfQorRVhQT1JUX1NZTUJPTChpcmxtcF9yZWdpc3Rlcl9zZXJ2aWNlKTsKKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX3VucmVnaXN0ZXJfc2VydmljZSAoaGFuZGxlKQorICoKKyAqICAgIFVucmVnaXN0ZXIgc2VydmljZSB3aXRoIElyTE1QLgorICoKKyAqICAgIFJldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKKyAqLworaW50IGlybG1wX3VucmVnaXN0ZXJfc2VydmljZSh2b2lkICpoYW5kbGUpCit7CisJaXJsbXBfc2VydmljZV90ICpzZXJ2aWNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaWYgKCFoYW5kbGUpCisJCXJldHVybiAtMTsKKworCS8qIENhbGxlciBtYXkgY2FsbCB3aXRoIGludmFsaWQgaGFuZGxlIChpdCdzIGxlZ2FsKSAtIEplYW4gSUkgKi8KKwlzZXJ2aWNlID0gaGFzaGJpbl9sb2NrX2ZpbmQoaXJsbXAtPnNlcnZpY2VzLCAobG9uZykgaGFuZGxlLCBOVUxMKTsKKwlpZiAoIXNlcnZpY2UpIHsKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgVW5rbm93biBzZXJ2aWNlIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWhhc2hiaW5fcmVtb3ZlX3RoaXMoaXJsbXAtPnNlcnZpY2VzLCAoaXJkYV9xdWV1ZV90ICopIHNlcnZpY2UpOworCWtmcmVlKHNlcnZpY2UpOworCisJLyogUmVtb3ZlIG9sZCBoaW50IGJpdHMgKi8KKwlpcmxtcC0+aGludHMud29yZCA9IDA7CisKKwkvKiBSZWZyZXNoIGN1cnJlbnQgaGludCBiaXRzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlybG1wLT5zZXJ2aWNlcy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKyAgICAgICAgc2VydmljZSA9IChpcmxtcF9zZXJ2aWNlX3QgKikgaGFzaGJpbl9nZXRfZmlyc3QoaXJsbXAtPnNlcnZpY2VzKTsKKyAgICAgICAgd2hpbGUgKHNlcnZpY2UpIHsKKwkJaXJsbXAtPmhpbnRzLndvcmQgfD0gc2VydmljZS0+aGludHMud29yZDsKKworICAgICAgICAgICAgICAgIHNlcnZpY2UgPSAoaXJsbXBfc2VydmljZV90ICopaGFzaGJpbl9nZXRfbmV4dChpcmxtcC0+c2VydmljZXMpOworICAgICAgICB9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJsbXAtPnNlcnZpY2VzLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpcmxtcF91bnJlZ2lzdGVyX3NlcnZpY2UpOworCisvKgorICogRnVuY3Rpb24gaXJsbXBfcmVnaXN0ZXJfY2xpZW50IChoaW50X21hc2ssIGNhbGxiYWNrMSwgY2FsbGJhY2syKQorICoKKyAqICAgIFJlZ2lzdGVyIGEgbG9jYWwgY2xpZW50IHdpdGggSXJMTVAKKyAqCUZpcnN0IGNhbGxiYWNrIGlzIHNlbGVjdGl2ZSBkaXNjb3ZlcnkgKGJhc2VkIG9uIGhpbnRzKQorICoJU2Vjb25kIGNhbGxiYWNrIGlzIGZvciBzZWxlY3RpdmUgZGlzY292ZXJ5IGV4cGlyaWVzCisgKgorICogICAgUmV0dXJuczogaGFuZGxlID4gMCBvbiBzdWNjZXNzLCAwIG9uIGVycm9yCisgKi8KK3ZvaWQgKmlybG1wX3JlZ2lzdGVyX2NsaWVudChfX3UxNiBoaW50X21hc2ssIERJU0NPVkVSWV9DQUxMQkFDSzEgZGlzY29fY2xiLAorCQkJICAgIERJU0NPVkVSWV9DQUxMQkFDSzIgZXhwaXJfY2xiLCB2b2lkICpwcml2KQoreworCWlybG1wX2NsaWVudF90ICpjbGllbnQ7CisKKwlJUkRBX0RFQlVHKDEsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCUlSREFfQVNTRVJUKGlybG1wICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CisKKwkvKiBNYWtlIGEgbmV3IHJlZ2lzdHJhdGlvbiAqLworCWNsaWVudCA9IGttYWxsb2Moc2l6ZW9mKGlybG1wX2NsaWVudF90KSwgR0ZQX0FUT01JQyk7CisJaWYgKCFjbGllbnQpIHsKKwkJSVJEQV9ERUJVRyggMSwgIiVzKCksIFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogUmVnaXN0ZXIgdGhlIGRldGFpbHMgKi8KKwljbGllbnQtPmhpbnRfbWFzay53b3JkID0gaGludF9tYXNrOworCWNsaWVudC0+ZGlzY29fY2FsbGJhY2sgPSBkaXNjb19jbGI7CisJY2xpZW50LT5leHBpcl9jYWxsYmFjayA9IGV4cGlyX2NsYjsKKwljbGllbnQtPnByaXYgPSBwcml2OworCisJaGFzaGJpbl9pbnNlcnQoaXJsbXAtPmNsaWVudHMsIChpcmRhX3F1ZXVlX3QgKikgY2xpZW50LAorCQkgICAgICAgKGxvbmcpIGNsaWVudCwgTlVMTCk7CisKKwlyZXR1cm4gKHZvaWQgKikgY2xpZW50OworfQorRVhQT1JUX1NZTUJPTChpcmxtcF9yZWdpc3Rlcl9jbGllbnQpOworCisvKgorICogRnVuY3Rpb24gaXJsbXBfdXBkYXRlX2NsaWVudCAoaGFuZGxlLCBoaW50X21hc2ssIGNhbGxiYWNrMSwgY2FsbGJhY2syKQorICoKKyAqICAgIFVwZGF0ZXMgc3BlY2lmaWVkIGNsaWVudCAoaGFuZGxlKSB3aXRoIHBvc3NpYmx5IG5ldyBoaW50X21hc2sgYW5kCisgKiAgICBjYWxsYmFjaworICoKKyAqICAgIFJldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKKyAqLworaW50IGlybG1wX3VwZGF0ZV9jbGllbnQodm9pZCAqaGFuZGxlLCBfX3UxNiBoaW50X21hc2ssCisJCQlESVNDT1ZFUllfQ0FMTEJBQ0sxIGRpc2NvX2NsYiwKKwkJCURJU0NPVkVSWV9DQUxMQkFDSzIgZXhwaXJfY2xiLCB2b2lkICpwcml2KQoreworCWlybG1wX2NsaWVudF90ICpjbGllbnQ7CisKKwlpZiAoIWhhbmRsZSkKKwkJcmV0dXJuIC0xOworCisJY2xpZW50ID0gaGFzaGJpbl9sb2NrX2ZpbmQoaXJsbXAtPmNsaWVudHMsIChsb25nKSBoYW5kbGUsIE5VTEwpOworCWlmICghY2xpZW50KSB7CisJCUlSREFfREVCVUcoMSwgIiVzKCksIFVua25vd24gY2xpZW50IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNsaWVudC0+aGludF9tYXNrLndvcmQgPSBoaW50X21hc2s7CisJY2xpZW50LT5kaXNjb19jYWxsYmFjayA9IGRpc2NvX2NsYjsKKwljbGllbnQtPmV4cGlyX2NhbGxiYWNrID0gZXhwaXJfY2xiOworCWNsaWVudC0+cHJpdiA9IHByaXY7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaXJsbXBfdXBkYXRlX2NsaWVudCk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF91bnJlZ2lzdGVyX2NsaWVudCAoaGFuZGxlKQorICoKKyAqICAgIFJldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKKyAqCisgKi8KK2ludCBpcmxtcF91bnJlZ2lzdGVyX2NsaWVudCh2b2lkICpoYW5kbGUpCit7CisJc3RydWN0IGlybG1wX2NsaWVudCAqY2xpZW50OworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWlmICghaGFuZGxlKQorCQlyZXR1cm4gLTE7CisKKwkvKiBDYWxsZXIgbWF5IGNhbGwgd2l0aCBpbnZhbGlkIGhhbmRsZSAoaXQncyBsZWdhbCkgLSBKZWFuIElJICovCisJY2xpZW50ID0gaGFzaGJpbl9sb2NrX2ZpbmQoaXJsbXAtPmNsaWVudHMsIChsb25nKSBoYW5kbGUsIE5VTEwpOworCWlmICghY2xpZW50KSB7CisJCUlSREFfREVCVUcoMSwgIiVzKCksIFVua25vd24gY2xpZW50IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC0xOworCX0KKworCUlSREFfREVCVUcoNCwgIiVzKCksIHJlbW92aW5nIGNsaWVudCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJaGFzaGJpbl9yZW1vdmVfdGhpcyhpcmxtcC0+Y2xpZW50cywgKGlyZGFfcXVldWVfdCAqKSBjbGllbnQpOworCWtmcmVlKGNsaWVudCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaXJsbXBfdW5yZWdpc3Rlcl9jbGllbnQpOworCisvKgorICogRnVuY3Rpb24gaXJsbXBfc2xzYXBfaW51c2UgKHNsc2FwKQorICoKKyAqICAgIENoZWNrIGlmIHRoZSBnaXZlbiBzb3VyY2UgTFNBUCBzZWxlY3RvciBpcyBpbiB1c2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNsZWFybHkgbm90IHZlcnkgZWZmaWNpZW50LiBPbiB0aGUgbWl0aWdhdGluZyBzaWRlLCB0aGUKKyAqIHN0YWNrIG1ha2Ugc3VyZSB0aGF0IGluIDk5JSBvZiB0aGUgY2FzZXMsIHdlIGFyZSBjYWxsZWQgb25seSBvbmNlCisgKiBmb3IgZWFjaCBzb2NrZXQgYWxsb2NhdGlvbi4gV2UgY291bGQgcHJvYmFibHkga2VlcCBhIGJpdG1hcAorICogb2YgdGhlIGFsbG9jYXRlZCBMU0FQLCBidXQgSSdtIG5vdCBzdXJlIHRoZSBjb21wbGV4aXR5IGlzIHdvcnRoIGl0LgorICogSmVhbiBJSQorICovCitzdGF0aWMgaW50IGlybG1wX3Nsc2FwX2ludXNlKF9fdTggc2xzYXBfc2VsKQoreworCXN0cnVjdCBsc2FwX2NiICpzZWxmOworCXN0cnVjdCBsYXBfY2IgKmxhcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJSVJEQV9BU1NFUlQoaXJsbXAgIT0gTlVMTCwgcmV0dXJuIFRSVUU7KTsKKwlJUkRBX0FTU0VSVChpcmxtcC0+bWFnaWMgPT0gTE1QX01BR0lDLCByZXR1cm4gVFJVRTspOworCUlSREFfQVNTRVJUKHNsc2FwX3NlbCAhPSBMU0FQX0FOWSwgcmV0dXJuIFRSVUU7KTsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyNpZmRlZiBDT05GSUdfSVJEQV9VTFRSQQorCS8qIEFjY2VwdCBhbGwgYmluZGluZ3MgdG8gdGhlIGNvbm5lY3Rpb25sZXNzIExTQVAgKi8KKwlpZiAoc2xzYXBfc2VsID09IExTQVBfQ09OTkxFU1MpCisJCXJldHVybiBGQUxTRTsKKyNlbmRpZiAvKiBDT05GSUdfSVJEQV9VTFRSQSAqLworCisJLyogVmFsaWQgdmFsdWVzIGFyZSBiZXR3ZWVuIDAgYW5kIDEyNyAoMHgwLTB4NkYpICovCisJaWYgKHNsc2FwX3NlbCA+IExTQVBfTUFYKQorCQlyZXR1cm4gVFJVRTsKKworCS8qCisJICogIENoZWNrIGlmIHNsc2FwIGlzIGFscmVhZHkgaW4gdXNlLiBUbyBkbyB0aGlzIHdlIGhhdmUgdG8gbG9vcCBvdmVyCisJICogIGV2ZXJ5IElyTEFQIGNvbm5lY3Rpb24gYW5kIGNoZWNrIGV2ZXJ5IExTQVAgYXNzb2NpYXRlZCB3aXRoIGVhY2gKKwkgKiAgdGhlIGNvbm5lY3Rpb24uCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlybG1wLT5saW5rcy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKwlsYXAgPSAoc3RydWN0IGxhcF9jYiAqKSBoYXNoYmluX2dldF9maXJzdChpcmxtcC0+bGlua3MpOworCXdoaWxlIChsYXAgIT0gTlVMTCkgeworCQlJUkRBX0FTU0VSVChsYXAtPm1hZ2ljID09IExNUF9MQVBfTUFHSUMsIGdvdG8gZXJybGFwOyk7CisKKwkJLyogQ2FyZWZ1bCBmb3IgcHJpb3JpdHkgaW52ZXJzaW9ucyBoZXJlICEKKwkJICogaXJsbXAtPmxpbmtzIGlzIG5ldmVyIHRha2VuIHdoaWxlIGFub3RoZXIgSXJEQQorCQkgKiBzcGlubG9jayBpcyBoZWxkLCBzbyB3ZSBhcmUgc2FmZS4gSmVhbiBJSSAqLworCQlzcGluX2xvY2soJmxhcC0+bHNhcHMtPmhiX3NwaW5sb2NrKTsKKworCQkvKiBGb3IgdGhpcyBJckxBUCwgY2hlY2sgYWxsIHRoZSBMU0FQcyAqLworCQlzZWxmID0gKHN0cnVjdCBsc2FwX2NiICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGxhcC0+bHNhcHMpOworCQl3aGlsZSAoc2VsZiAhPSBOVUxMKSB7CisJCQlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywKKwkJCQkgICAgZ290byBlcnJsc2FwOyk7CisKKwkJCWlmICgoc2VsZi0+c2xzYXBfc2VsID09IHNsc2FwX3NlbCkpIHsKKwkJCQlJUkRBX0RFQlVHKDQsICJTb3VyY2UgTFNBUCBzZWxlY3Rvcj0lMDJ4IGluIHVzZVxuIiwKKwkJCQkJICAgc2VsZi0+c2xzYXBfc2VsKTsKKwkJCQlnb3RvIGVycmxzYXA7CisJCQl9CisJCQlzZWxmID0gKHN0cnVjdCBsc2FwX2NiKikgaGFzaGJpbl9nZXRfbmV4dChsYXAtPmxzYXBzKTsKKwkJfQorCQlzcGluX3VubG9jaygmbGFwLT5sc2Fwcy0+aGJfc3BpbmxvY2spOworCisJCS8qIE5leHQgTEFQICovCisJCWxhcCA9IChzdHJ1Y3QgbGFwX2NiICopIGhhc2hiaW5fZ2V0X25leHQoaXJsbXAtPmxpbmtzKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJsbXAtPmxpbmtzLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBTZXJ2ZXIgc29ja2V0cyBhcmUgdHlwaWNhbGx5IHdhaXRpbmcgZm9yIGNvbm5lY3Rpb25zIGFuZAorCSAqIHRoZXJlZm9yZSByZXNpZGUgaW4gdGhlIHVuY29ubmVjdGVkIGxpc3QuIFdlIGRvbid0IHdhbnQKKwkgKiB0byBnaXZlIG91dCB0aGVpciBMU0FQcyBmb3Igb2J2aW91cyByZWFzb25zLi4uCisJICogSmVhbiBJSQorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMtPmhiX3NwaW5sb2NrLCBmbGFncyk7CisKKwlzZWxmID0gKHN0cnVjdCBsc2FwX2NiICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGlybG1wLT51bmNvbm5lY3RlZF9sc2Fwcyk7CisJd2hpbGUgKHNlbGYgIT0gTlVMTCkgeworCQlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywgZ290byBlcnJ1bmNvbjspOworCQlpZiAoKHNlbGYtPnNsc2FwX3NlbCA9PSBzbHNhcF9zZWwpKSB7CisJCQlJUkRBX0RFQlVHKDQsICJTb3VyY2UgTFNBUCBzZWxlY3Rvcj0lMDJ4IGluIHVzZSAodW5jb25uZWN0ZWQpXG4iLAorCQkJCSAgIHNlbGYtPnNsc2FwX3NlbCk7CisJCQlnb3RvIGVycnVuY29uOworCQl9CisJCXNlbGYgPSAoc3RydWN0IGxzYXBfY2IqKSBoYXNoYmluX2dldF9uZXh0KGlybG1wLT51bmNvbm5lY3RlZF9sc2Fwcyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlybG1wLT51bmNvbm5lY3RlZF9sc2Fwcy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBGQUxTRTsKKworCS8qIEVycm9yIGV4aXQgZnJvbSB3aXRoaW4gb25lIG9mIHRoZSB0d28gbmVzdGVkIGxvb3BzLgorCSAqIE1ha2Ugc3VyZSB3ZSByZWxlYXNlIHRoZSByaWdodCBzcGlubG9jayBpbiB0aGUgcmlnaCBvcmRlci4KKwkgKiBKZWFuIElJICovCitlcnJsc2FwOgorCXNwaW5fdW5sb2NrKCZsYXAtPmxzYXBzLT5oYl9zcGlubG9jayk7CitJUkRBX0FTU0VSVF9MQUJFTChlcnJsYXA6KQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlybG1wLT5saW5rcy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gVFJVRTsKKworCS8qIEVycm9yIGV4aXQgZnJvbSB3aXRoaW4gdGhlIHVuY29ubmVjdGVkIGxvb3AuCisJICogSnVzdCBvbmUgc3BpbmxvY2sgdG8gcmVsZWFzZS4uLiBKZWFuIElJICovCitlcnJ1bmNvbjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMtPmhiX3NwaW5sb2NrLCBmbGFncyk7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9maW5kX2ZyZWVfc2xzYXAgKCkKKyAqCisgKiAgICBGaW5kIGEgZnJlZSBzb3VyY2UgTFNBUCB0byB1c2UuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGlmIHRoZSBzZXJ2aWNlCisgKiAgICB1c2VyIGhhcyByZXF1ZXN0ZWQgYSBzb3VyY2UgTFNBUCBlcXVhbCB0byBMTV9BTlkKKyAqLworc3RhdGljIF9fdTggaXJsbXBfZmluZF9mcmVlX3Nsc2FwKHZvaWQpCit7CisJX191OCBsc2FwX3NlbDsKKwlpbnQgd3JhcHBlZCA9IDA7CisKKwlJUkRBX0FTU0VSVChpcmxtcCAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChpcmxtcC0+bWFnaWMgPT0gTE1QX01BR0lDLCByZXR1cm4gLTE7KTsKKworCS8qIE1vc3QgdXNlcnMgZG9uJ3QgcmVhbGx5IGNhcmUgd2hpY2ggTFNBUHMgdGhleSBhcmUgZ2l2ZW4sCisJICogYW5kIHRoZXJlZm9yZSB3ZSBhdXRvbWF0aWNhbGx5IGdpdmUgdGhlbSBhIGZyZWUgTFNBUC4KKwkgKiBUaGlzIGZ1bmN0aW9uIHRyeSB0byBmaW5kIGEgc3VpdGFibGUgTFNBUCwgaS5lLiB3aGljaCBpcworCSAqIG5vdCBpbiB1c2UgYW5kIGlzIHdpdGhpbiB0aGUgYWNjZXB0YWJsZSByYW5nZS4gSmVhbiBJSSAqLworCisJZG8geworCQkvKiBBbHdheXMgaW5jcmVtZW50IHRvIExTQVAgbnVtYmVyIGJlZm9yZSB1c2luZyBpdC4KKwkJICogSW4gdGhlb3J5LCB3ZSBjb3VsZCByZXVzZSB0aGUgbGFzdCBMU0FQIG51bWJlciwgYXMgbG9uZworCQkgKiBhcyBpdCBpcyBubyBsb25nZXIgaW4gdXNlLiBTb21lIElyREEgc3RhY2sgZG8gdGhhdC4KKwkJICogSG93ZXZlciwgdGhlIHByZXZpb3VzIHNvY2tldCBtYXkgYmUgaGFsZiBjbG9zZWQsIGkuZS4KKwkJICogd2UgY2xvc2VkIGl0LCB3ZSB0aGluayBpdCdzIG5vIGxvbmdlciBpbiB1c2UsIGJ1dCB0aGUKKwkJICogb3RoZXIgc2lkZSBkaWQgbm90IHJlY2VpdmUgb3VyIGNsb3NlIGFuZCB0aGluayBpdCdzCisJCSAqIGFjdGl2ZSBhbmQgc3RpbGwgc2VuZCBkYXRhIG9uIGl0LgorCQkgKiBUaGlzIGlzIHNpbWlsYXIgdG8gd2hhdCBpcyBkb25lIHdpdGggUElEcyBhbmQgVENQIHBvcnRzLgorCQkgKiBBbHNvLCB0aGlzIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvIGlybG1wX3Nsc2FwX2ludXNlKCkKKwkJICogd2hpY2ggaXMgYW4gZXhwZW5zaXZlIGZ1bmN0aW9uIHRvIGNhbGwuCisJCSAqIEplYW4gSUkgKi8KKwkJaXJsbXAtPmxhc3RfbHNhcF9zZWwrKzsKKworCQkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIHdyYXBhcm91bmQgKDB4NzAtMHg3ZiBhcmUgcmVzZXJ2ZWQpICovCisJCWlmIChpcmxtcC0+bGFzdF9sc2FwX3NlbCA+IExTQVBfTUFYKSB7CisJCQkvKiAweDAwLTB4MTAgYXJlIGFsc28gcmVzZXJ2ZWQgZm9yIHdlbGwga25vdyBwb3J0cyAqLworCQkJaXJsbXAtPmxhc3RfbHNhcF9zZWwgPSAweDEwOworCisJCQkvKiBNYWtlIHN1cmUgd2UgdGVybWluYXRlIHRoZSBsb29wICovCisJCQlpZiAod3JhcHBlZCsrKSB7CisJCQkJSVJEQV9FUlJPUigiJXM6IG5vIG1vcmUgZnJlZSBMU0FQcyAhXG4iLAorCQkJCQkgICBfX0ZVTkNUSU9OX18pOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisKKwkJLyogSWYgdGhlIExTQVAgaXMgaW4gdXNlLCB0cnkgdGhlIG5leHQgb25lLgorCQkgKiBEZXNwaXRlIHRoZSBhdXRvaW5jcmVtZW50LCB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBsc2FwCisJCSAqIGlzIHJlYWxseSBpbiB1c2Ugb3Igbm90LCBmaXJzdCBiZWNhdXNlIExTQVAgbWF5IGJlCisJCSAqIGRpcmVjdGx5IGFsbG9jYXRlZCBpbiBpcmxtcF9vcGVuX2xzYXAoKSwgYW5kIGFsc28gYmVjYXVzZQorCQkgKiB3ZSBtYXkgd3JhcGFyb3VuZCBvbiBvbGQgc29ja2V0cy4gSmVhbiBJSSAqLworCX0gd2hpbGUgKGlybG1wX3Nsc2FwX2ludXNlKGlybG1wLT5sYXN0X2xzYXBfc2VsKSk7CisKKwkvKiBHb3QgaXQgISAqLworCWxzYXBfc2VsID0gaXJsbXAtPmxhc3RfbHNhcF9zZWw7CisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgZm91bmQgZnJlZSBsc2FwX3NlbD0lMDJ4XG4iLAorCQkgICBfX0ZVTkNUSU9OX18sIGxzYXBfc2VsKTsKKworCXJldHVybiBsc2FwX3NlbDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX2NvbnZlcnRfbGFwX3JlYXNvbiAobGFwX3JlYXNvbikKKyAqCisgKiAgICBDb252ZXJ0cyBJckxBUCBkaXNjb25uZWN0IHJlYXNvbiBjb2RlcyB0byBJckxNUCBkaXNjb25uZWN0IHJlYXNvbgorICogICAgY29kZXMKKyAqCisgKi8KK0xNX1JFQVNPTiBpcmxtcF9jb252ZXJ0X2xhcF9yZWFzb24oIExBUF9SRUFTT04gbGFwX3JlYXNvbikKK3sKKwlpbnQgcmVhc29uID0gTE1fTEFQX0RJU0NPTk5FQ1Q7CisKKwlzd2l0Y2ggKGxhcF9yZWFzb24pIHsKKwljYXNlIExBUF9ESVNDX0lORElDQVRJT046IC8qIFJlY2VpdmVkIGEgZGlzY29ubmVjdCByZXF1ZXN0IGZyb20gcGVlciAqLworCQlJUkRBX0RFQlVHKCAxLCAiJXMoKSwgTEFQX0RJU0NfSU5ESUNBVElPTlxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmVhc29uID0gTE1fVVNFUl9SRVFVRVNUOworCQlicmVhazsKKwljYXNlIExBUF9OT19SRVNQT05TRTogICAgLyogVG8gbWFueSByZXRyYW5zbWl0cyB3aXRob3V0IHJlc3BvbnNlICovCisJCUlSREFfREVCVUcoIDEsICIlcygpLCBMQVBfTk9fUkVTUE9OU0VcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJlYXNvbiA9IExNX0xBUF9ESVNDT05ORUNUOworCQlicmVhazsKKwljYXNlIExBUF9SRVNFVF9JTkRJQ0FUSU9OOgorCQlJUkRBX0RFQlVHKCAxLCAiJXMoKSwgTEFQX1JFU0VUX0lORElDQVRJT05cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJlYXNvbiA9IExNX0xBUF9SRVNFVDsKKwkJYnJlYWs7CisJY2FzZSBMQVBfRk9VTkRfTk9ORToKKwljYXNlIExBUF9NRURJQV9CVVNZOgorCWNhc2UgTEFQX1BSSU1BUllfQ09ORkxJQ1Q6CisJCUlSREFfREVCVUcoMSwgIiVzKCksIExBUF9GT1VORF9OT05FLCBMQVBfTUVESUFfQlVTWSBvciBMQVBfUFJJTUFSWV9DT05GTElDVFxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmVhc29uID0gTE1fQ09OTkVDVF9GQUlMVVJFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDEsICIlcygpLCBVbmtub3cgSXJMQVAgZGlzY29ubmVjdCByZWFzb24gJWQhXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBsYXBfcmVhc29uKTsKKwkJcmVhc29uID0gTE1fTEFQX0RJU0NPTk5FQ1Q7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZWFzb247Cit9CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCitzdHJ1Y3QgaXJsbXBfaXRlcl9zdGF0ZSB7CisJaGFzaGJpbl90ICpoYXNoYmluOworfTsKKworI2RlZmluZSBMU0FQX1NUQVJUX1RPS0VOCSgodm9pZCAqKTEpCisjZGVmaW5lIExJTktfU1RBUlRfVE9LRU4JKCh2b2lkICopMikKKworc3RhdGljIHZvaWQgKmlybG1wX3NlcV9oYl9pZHgoc3RydWN0IGlybG1wX2l0ZXJfc3RhdGUgKml0ZXIsIGxvZmZfdCAqb2ZmKQoreworCXZvaWQgKmVsZW1lbnQ7CisKKwlzcGluX2xvY2tfaXJxKCZpdGVyLT5oYXNoYmluLT5oYl9zcGlubG9jayk7CisJZm9yIChlbGVtZW50ID0gaGFzaGJpbl9nZXRfZmlyc3QoaXRlci0+aGFzaGJpbik7CisJICAgICBlbGVtZW50ICE9IE5VTEw7IAorCSAgICAgZWxlbWVudCA9IGhhc2hiaW5fZ2V0X25leHQoaXRlci0+aGFzaGJpbikpIHsKKwkJaWYgKCFvZmYgfHwgKm9mZi0tID09IDApIHsKKwkJCS8qIE5COiBoYXNoYmluIGxlZnQgbG9ja2VkICovCisJCQlyZXR1cm4gZWxlbWVudDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnEoJml0ZXItPmhhc2hiaW4tPmhiX3NwaW5sb2NrKTsKKwlpdGVyLT5oYXNoYmluID0gTlVMTDsKKwlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZCAqaXJsbXBfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaXJsbXBfaXRlcl9zdGF0ZSAqaXRlciA9IHNlcS0+cHJpdmF0ZTsKKwl2b2lkICp2OworCWxvZmZfdCBvZmYgPSAqcG9zOworCisJaXRlci0+aGFzaGJpbiA9IE5VTEw7CisJaWYgKG9mZi0tID09IDApCisJCXJldHVybiBMU0FQX1NUQVJUX1RPS0VOOworCisJaXRlci0+aGFzaGJpbiA9IGlybG1wLT51bmNvbm5lY3RlZF9sc2FwczsKKwl2ID0gaXJsbXBfc2VxX2hiX2lkeChpdGVyLCAmb2ZmKTsKKwlpZiAodikKKwkJcmV0dXJuIHY7CisKKwlpZiAob2ZmLS0gPT0gMCkKKwkJcmV0dXJuIExJTktfU1RBUlRfVE9LRU47CisKKwlpdGVyLT5oYXNoYmluID0gaXJsbXAtPmxpbmtzOworCXJldHVybiBpcmxtcF9zZXFfaGJfaWR4KGl0ZXIsICZvZmYpOworfQorCitzdGF0aWMgdm9pZCAqaXJsbXBfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBpcmxtcF9pdGVyX3N0YXRlICppdGVyID0gc2VxLT5wcml2YXRlOworCisJKysqcG9zOworCisJaWYgKHYgPT0gTFNBUF9TVEFSVF9UT0tFTikgewkJLyogc3RhcnQgb2YgbGlzdCBvZiBsc2FwcyAqLworCQlpdGVyLT5oYXNoYmluID0gaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzOworCQl2ID0gaXJsbXBfc2VxX2hiX2lkeChpdGVyLCBOVUxMKTsKKwkJcmV0dXJuIHYgPyB2IDogTElOS19TVEFSVF9UT0tFTjsKKwl9CisKKwlpZiAodiA9PSBMSU5LX1NUQVJUX1RPS0VOKSB7CQkvKiBzdGFydCBvZiBsaXN0IG9mIGxpbmtzICovCisJCWl0ZXItPmhhc2hiaW4gPSBpcmxtcC0+bGlua3M7CisJCXJldHVybiBpcmxtcF9zZXFfaGJfaWR4KGl0ZXIsIE5VTEwpOworCX0KKworCXYgPSBoYXNoYmluX2dldF9uZXh0KGl0ZXItPmhhc2hiaW4pOworCisJaWYgKHYgPT0gTlVMTCkgewkJCS8qIG5vIG1vcmUgaW4gdGhpcyBoYXNoIGJpbiAqLworCQlzcGluX3VubG9ja19pcnEoJml0ZXItPmhhc2hiaW4tPmhiX3NwaW5sb2NrKTsKKworCQlpZiAoaXRlci0+aGFzaGJpbiA9PSBpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMpIAorCQkJdiA9ICBMSU5LX1NUQVJUX1RPS0VOOworCisJCWl0ZXItPmhhc2hiaW4gPSBOVUxMOworCX0KKwlyZXR1cm4gdjsKK30KKworc3RhdGljIHZvaWQgaXJsbXBfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IGlybG1wX2l0ZXJfc3RhdGUgKml0ZXIgPSBzZXEtPnByaXZhdGU7CisKKwlpZiAoaXRlci0+aGFzaGJpbikKKwkJc3Bpbl91bmxvY2tfaXJxKCZpdGVyLT5oYXNoYmluLT5oYl9zcGlubG9jayk7Cit9CisKK3N0YXRpYyBpbnQgaXJsbXBfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJY29uc3Qgc3RydWN0IGlybG1wX2l0ZXJfc3RhdGUgKml0ZXIgPSBzZXEtPnByaXZhdGU7CisJc3RydWN0IGxzYXBfY2IgKnNlbGYgPSB2OworCisJaWYgKHYgPT0gTFNBUF9TVEFSVF9UT0tFTikKKwkJc2VxX3B1dHMoc2VxLCAiVW5jb25uZWN0ZWQgTFNBUHM6XG4iKTsKKwllbHNlIGlmICh2ID09IExJTktfU1RBUlRfVE9LRU4pCisJCXNlcV9wdXRzKHNlcSwgIlxuUmVnaXN0ZXJlZCBMaW5rIExheWVyczpcbiIpOworCWVsc2UgaWYgKGl0ZXItPmhhc2hiaW4gPT0gaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzKSB7CisJCXNlbGYgPSB2OworCQlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywgcmV0dXJuIC1FSU5WQUw7ICk7CisJCXNlcV9wcmludGYoc2VxLCAibHNhcCBzdGF0ZTogJXMsICIsCisJCQkgICBpcmxzYXBfc3RhdGVbIHNlbGYtPmxzYXBfc3RhdGVdKTsKKwkJc2VxX3ByaW50ZihzZXEsCisJCQkgICAic2xzYXBfc2VsOiAlIzAyeCwgZGxzYXBfc2VsOiAlIzAyeCwgIiwKKwkJCSAgIHNlbGYtPnNsc2FwX3NlbCwgc2VsZi0+ZGxzYXBfc2VsKTsKKwkJc2VxX3ByaW50ZihzZXEsICIoJXMpIiwgc2VsZi0+bm90aWZ5Lm5hbWUpOworCQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CisJfSBlbHNlIGlmIChpdGVyLT5oYXNoYmluID09IGlybG1wLT5saW5rcykgeworCQlzdHJ1Y3QgbGFwX2NiICpsYXAgPSB2OworCisJCXNlcV9wcmludGYoc2VxLCAibGFwIHN0YXRlOiAlcywgIiwKKwkJCSAgIGlybG1wX3N0YXRlW2xhcC0+bGFwX3N0YXRlXSk7CisKKwkJc2VxX3ByaW50ZihzZXEsICJzYWRkcjogJSMwOHgsIGRhZGRyOiAlIzA4eCwgIiwKKwkJCSAgIGxhcC0+c2FkZHIsIGxhcC0+ZGFkZHIpOworCQlzZXFfcHJpbnRmKHNlcSwgIm51bSBsc2FwczogJWQiLAorCQkJICAgSEFTSEJJTl9HRVRfU0laRShsYXAtPmxzYXBzKSk7CisJCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKKworCQkvKiBDYXJlZnVsIGZvciBwcmlvcml0eSBpbnZlcnNpb25zIGhlcmUgIQorCQkgKiBBbGwgb3RoZXIgdXNlcyBvZiBhdHRyaWIgc3BpbmxvY2sgYXJlIGluZGVwZW5kZW50IG9mCisJCSAqIHRoZSBvYmplY3Qgc3BpbmxvY2ssIHNvIHdlIGFyZSBzYWZlLiBKZWFuIElJICovCisJCXNwaW5fbG9jaygmbGFwLT5sc2Fwcy0+aGJfc3BpbmxvY2spOworCisJCXNlcV9wcmludGYoc2VxLCAiXG4gIENvbm5lY3RlZCBMU0FQczpcbiIpOworCQlmb3IgKHNlbGYgPSAoc3RydWN0IGxzYXBfY2IgKikgaGFzaGJpbl9nZXRfZmlyc3QobGFwLT5sc2Fwcyk7CisJCSAgICAgc2VsZiAhPSBOVUxMOworCQkgICAgIHNlbGYgPSAoc3RydWN0IGxzYXBfY2IgKiloYXNoYmluX2dldF9uZXh0KGxhcC0+bHNhcHMpKSB7CisJCQlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywKKwkJCQkgICAgZ290byBvdXRsb29wOyk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgbHNhcCBzdGF0ZTogJXMsICIsCisJCQkJICAgaXJsc2FwX3N0YXRlWyBzZWxmLT5sc2FwX3N0YXRlXSk7CisJCQlzZXFfcHJpbnRmKHNlcSwKKwkJCQkgICAic2xzYXBfc2VsOiAlIzAyeCwgZGxzYXBfc2VsOiAlIzAyeCwgIiwKKwkJCQkgICBzZWxmLT5zbHNhcF9zZWwsIHNlbGYtPmRsc2FwX3NlbCk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiglcykiLCBzZWxmLT5ub3RpZnkubmFtZSk7CisJCQlzZXFfcHV0YyhzZXEsICdcbicpOworCisJCX0KKwlJUkRBX0FTU0VSVF9MQUJFTChvdXRsb29wOikKKwkJc3Bpbl91bmxvY2soJmxhcC0+bHNhcHMtPmhiX3NwaW5sb2NrKTsKKwkJc2VxX3B1dGMoc2VxLCAnXG4nKTsKKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBpcmxtcF9zZXFfb3BzID0geworCS5zdGFydCAgPSBpcmxtcF9zZXFfc3RhcnQsCisJLm5leHQgICA9IGlybG1wX3NlcV9uZXh0LAorCS5zdG9wICAgPSBpcmxtcF9zZXFfc3RvcCwKKwkuc2hvdyAgID0gaXJsbXBfc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IGlybG1wX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzZXFfZmlsZSAqc2VxOworCWludCByYyA9IC1FTk9NRU07CisJc3RydWN0IGlybG1wX2l0ZXJfc3RhdGUgKnM7CisKKwlJUkRBX0FTU0VSVChpcmxtcCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTDspOworCisJcyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzKQorCQlnb3RvIG91dDsKKworCXJjID0gc2VxX29wZW4oZmlsZSwgJmlybG1wX3NlcV9vcHMpOworCWlmIChyYykKKwkJZ290byBvdXRfa2ZyZWU7CisKKwlzZXEJICAgICA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzZXEtPnByaXZhdGUgPSBzOworb3V0OgorCXJldHVybiByYzsKK291dF9rZnJlZToKKwlrZnJlZShzKTsKKwlnb3RvIG91dDsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcmxtcF9zZXFfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgICAgICAgID0gaXJsbXBfc2VxX29wZW4sCisJLnJlYWQgICAgICAgICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgICAgICAgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2VfcHJpdmF0ZSwKK307CisKKyNlbmRpZiAvKiBQUk9DX0ZTICovCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmxtcF9ldmVudC5jIGIvbmV0L2lyZGEvaXJsbXBfZXZlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjY0OWY2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJsbXBfZXZlbnQuYwpAQCAtMCwwICsxLDkxMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZpbGVuYW1lOiAgICAgIGlybG1wX2V2ZW50LmMKKyAqIFZlcnNpb246ICAgICAgIDAuOAorICogRGVzY3JpcHRpb246ICAgQW4gSXJEQSBMTVAgZXZlbnQgZHJpdmVyIGZvciBMaW51eAorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgTW9uIEF1ZyAgNCAyMDo0MDo1MyAxOTk3CisgKiBNb2RpZmllZCBhdDogICBUdWUgRGVjIDE0IDIzOjA0OjE2IDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwKKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL3RpbWVyLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wX2ZyYW1lLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXBfZXZlbnQuaD4KKworY29uc3QgY2hhciAqaXJsbXBfc3RhdGVbXSA9IHsKKwkiTEFQX1NUQU5EQlkiLAorCSJMQVBfVV9DT05ORUNUIiwKKwkiTEFQX0FDVElWRSIsCit9OworCitjb25zdCBjaGFyICppcmxzYXBfc3RhdGVbXSA9IHsKKwkiTFNBUF9ESVNDT05ORUNURUQiLAorCSJMU0FQX0NPTk5FQ1QiLAorCSJMU0FQX0NPTk5FQ1RfUEVORCIsCisJIkxTQVBfREFUQV9UUkFOU0ZFUl9SRUFEWSIsCisJIkxTQVBfU0VUVVAiLAorCSJMU0FQX1NFVFVQX1BFTkQiLAorfTsKKworI2lmZGVmIENPTkZJR19JUkRBX0RFQlVHCitzdGF0aWMgY29uc3QgY2hhciAqaXJsbXBfZXZlbnRbXSA9IHsKKwkiTE1fQ09OTkVDVF9SRVFVRVNUIiwKKwkiTE1fQ09OTkVDVF9DT05GSVJNIiwKKwkiTE1fQ09OTkVDVF9SRVNQT05TRSIsCisJIkxNX0NPTk5FQ1RfSU5ESUNBVElPTiIsCisKKwkiTE1fRElTQ09OTkVDVF9JTkRJQ0FUSU9OIiwKKwkiTE1fRElTQ09OTkVDVF9SRVFVRVNUIiwKKworCSJMTV9EQVRBX1JFUVVFU1QiLAorCSJMTV9VREFUQV9SRVFVRVNUIiwKKwkiTE1fREFUQV9JTkRJQ0FUSU9OIiwKKwkiTE1fVURBVEFfSU5ESUNBVElPTiIsCisKKwkiTE1fV0FUQ0hET0dfVElNRU9VVCIsCisKKwkvKiBJckxBUCBldmVudHMgKi8KKwkiTE1fTEFQX0NPTk5FQ1RfUkVRVUVTVCIsCisJIkxNX0xBUF9DT05ORUNUX0lORElDQVRJT04iLAorCSJMTV9MQVBfQ09OTkVDVF9DT05GSVJNIiwKKwkiTE1fTEFQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTiIsCisJIkxNX0xBUF9ESVNDT05ORUNUX1JFUVVFU1QiLAorCSJMTV9MQVBfRElTQ09WRVJZX1JFUVVFU1QiLAorCSJMTV9MQVBfRElTQ09WRVJZX0NPTkZJUk0iLAorCSJMTV9MQVBfSURMRV9USU1FT1VUIiwKK307CisjZW5kaWYJLyogQ09ORklHX0lSREFfREVCVUcgKi8KKworLyogTEFQIENvbm5lY3Rpb24gY29udHJvbCBwcm90byBkZWNsYXJhdGlvbnMgKi8KK3N0YXRpYyB2b2lkIGlybG1wX3N0YXRlX3N0YW5kYnkgIChzdHJ1Y3QgbGFwX2NiICosIElSTE1QX0VWRU5ULAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKik7CitzdGF0aWMgdm9pZCBpcmxtcF9zdGF0ZV91X2Nvbm5lY3Qoc3RydWN0IGxhcF9jYiAqLCBJUkxNUF9FVkVOVCwKKwkJCQkgIHN0cnVjdCBza19idWZmICopOworc3RhdGljIHZvaWQgaXJsbXBfc3RhdGVfYWN0aXZlICAgKHN0cnVjdCBsYXBfY2IgKiwgSVJMTVBfRVZFTlQsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqKTsKKworLyogTFNBUCBDb25uZWN0aW9uIGNvbnRyb2wgcHJvdG8gZGVjbGFyYXRpb25zICovCitzdGF0aWMgaW50IGlybG1wX3N0YXRlX2Rpc2Nvbm5lY3RlZChzdHJ1Y3QgbHNhcF9jYiAqLCBJUkxNUF9FVkVOVCwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKik7CitzdGF0aWMgaW50IGlybG1wX3N0YXRlX2Nvbm5lY3QgICAgIChzdHJ1Y3QgbHNhcF9jYiAqLCBJUkxNUF9FVkVOVCwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKik7CitzdGF0aWMgaW50IGlybG1wX3N0YXRlX2Nvbm5lY3RfcGVuZChzdHJ1Y3QgbHNhcF9jYiAqLCBJUkxNUF9FVkVOVCwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKik7CitzdGF0aWMgaW50IGlybG1wX3N0YXRlX2R0ciAgICAgICAgIChzdHJ1Y3QgbHNhcF9jYiAqLCBJUkxNUF9FVkVOVCwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKik7CitzdGF0aWMgaW50IGlybG1wX3N0YXRlX3NldHVwICAgICAgIChzdHJ1Y3QgbHNhcF9jYiAqLCBJUkxNUF9FVkVOVCwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKik7CitzdGF0aWMgaW50IGlybG1wX3N0YXRlX3NldHVwX3BlbmQgIChzdHJ1Y3QgbHNhcF9jYiAqLCBJUkxNUF9FVkVOVCwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKik7CisKK3N0YXRpYyB2b2lkICgqbGFwX3N0YXRlW10pIChzdHJ1Y3QgbGFwX2NiICosIElSTE1QX0VWRU5ULCBzdHJ1Y3Qgc2tfYnVmZiAqKSA9Cit7CisJaXJsbXBfc3RhdGVfc3RhbmRieSwKKwlpcmxtcF9zdGF0ZV91X2Nvbm5lY3QsCisJaXJsbXBfc3RhdGVfYWN0aXZlLAorfTsKKworc3RhdGljIGludCAoKmxzYXBfc3RhdGVbXSkoIHN0cnVjdCBsc2FwX2NiICosIElSTE1QX0VWRU5ULCBzdHJ1Y3Qgc2tfYnVmZiAqKSA9Cit7CisJaXJsbXBfc3RhdGVfZGlzY29ubmVjdGVkLAorCWlybG1wX3N0YXRlX2Nvbm5lY3QsCisJaXJsbXBfc3RhdGVfY29ubmVjdF9wZW5kLAorCWlybG1wX3N0YXRlX2R0ciwKKwlpcmxtcF9zdGF0ZV9zZXR1cCwKKwlpcmxtcF9zdGF0ZV9zZXR1cF9wZW5kCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgaXJsbXBfbmV4dF9sYXBfc3RhdGUoc3RydWN0IGxhcF9jYiAqc2VsZiwKKwkJCQkJSVJMTVBfU1RBVEUgc3RhdGUpCit7CisJLyoKKwlJUkRBX0RFQlVHKDQsICIlcygpLCBMTVAgTEFQID0gJXNcbiIsIF9fRlVOQ1RJT05fXywgaXJsbXBfc3RhdGVbc3RhdGVdKTsKKwkqLworCXNlbGYtPmxhcF9zdGF0ZSA9IHN0YXRlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXJsbXBfbmV4dF9sc2FwX3N0YXRlKHN0cnVjdCBsc2FwX2NiICpzZWxmLAorCQkJCQkgTFNBUF9TVEFURSBzdGF0ZSkKK3sKKwkvKgorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgTE1QIExTQVAgPSAlc1xuIiwgX19GVU5DVElPTl9fLCBpcmxzYXBfc3RhdGVbc3RhdGVdKTsKKwkqLworCXNlbGYtPmxzYXBfc3RhdGUgPSBzdGF0ZTsKK30KKworLyogRG8gY29ubmVjdGlvbiBjb250cm9sIGV2ZW50cyAqLworaW50IGlybG1wX2RvX2xzYXBfZXZlbnQoc3RydWN0IGxzYXBfY2IgKnNlbGYsIElSTE1QX0VWRU5UIGV2ZW50LAorCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MU0FQX01BR0lDLCByZXR1cm4gLTE7KTsKKworCUlSREFfREVCVUcoNCwgIiVzKCksIEVWRU5UID0gJXMsIFNUQVRFID0gJXNcbiIsCisJCV9fRlVOQ1RJT05fXywgaXJsbXBfZXZlbnRbZXZlbnRdLCBpcmxzYXBfc3RhdGVbIHNlbGYtPmxzYXBfc3RhdGVdKTsKKworCXJldHVybiAoKmxzYXBfc3RhdGVbc2VsZi0+bHNhcF9zdGF0ZV0pIChzZWxmLCBldmVudCwgc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGRvX2xhcF9ldmVudCAoZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICBEbyBJckxBUCBjb250cm9sIGV2ZW50cworICoKKyAqLwordm9pZCBpcmxtcF9kb19sYXBfZXZlbnQoc3RydWN0IGxhcF9jYiAqc2VsZiwgSVJMTVBfRVZFTlQgZXZlbnQsCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xBUF9NQUdJQywgcmV0dXJuOyk7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpLCBFVkVOVCA9ICVzLCBTVEFURSA9ICVzXG4iLCBfX0ZVTkNUSU9OX18sCisJCSAgIGlybG1wX2V2ZW50W2V2ZW50XSwKKwkJICAgaXJsbXBfc3RhdGVbc2VsZi0+bGFwX3N0YXRlXSk7CisKKwkoKmxhcF9zdGF0ZVtzZWxmLT5sYXBfc3RhdGVdKSAoc2VsZiwgZXZlbnQsIHNrYik7Cit9CisKK3ZvaWQgaXJsbXBfZGlzY292ZXJ5X3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSkKK3sKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogV2UgYWx3YXlzIGNsZWFudXAgdGhlIGxvZyAoYWN0aXZlICYgcGFzc2l2ZSBkaXNjb3ZlcnkpICovCisJaXJsbXBfZG9fZXhwaXJ5KCk7CisKKwkvKiBBY3RpdmUgZGlzY292ZXJ5IGlzIGNvbmRpdGlvbmFsICovCisJaWYgKHN5c2N0bF9kaXNjb3ZlcnkpCisJCWlybG1wX2RvX2Rpc2NvdmVyeShzeXNjdGxfZGlzY292ZXJ5X3Nsb3RzKTsKKworCS8qIFJlc3RhcnQgdGltZXIgKi8KKwlpcmxtcF9zdGFydF9kaXNjb3ZlcnlfdGltZXIoaXJsbXAsIHN5c2N0bF9kaXNjb3ZlcnlfdGltZW91dCAqIEhaKTsKK30KKwordm9pZCBpcmxtcF93YXRjaGRvZ190aW1lcl9leHBpcmVkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGxzYXBfY2IgKnNlbGYgPSAoc3RydWN0IGxzYXBfY2IgKikgZGF0YTsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MU0FQX01BR0lDLCByZXR1cm47KTsKKworCWlybG1wX2RvX2xzYXBfZXZlbnQoc2VsZiwgTE1fV0FUQ0hET0dfVElNRU9VVCwgTlVMTCk7Cit9CisKK3ZvaWQgaXJsbXBfaWRsZV90aW1lcl9leHBpcmVkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGxhcF9jYiAqc2VsZiA9IChzdHJ1Y3QgbGFwX2NiICopIGRhdGE7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm47KTsKKworCWlybG1wX2RvX2xhcF9ldmVudChzZWxmLCBMTV9MQVBfSURMRV9USU1FT1VULCBOVUxMKTsKK30KKworLyoKKyAqIFNlbmQgYW4gZXZlbnQgb24gYWxsIExTQVBzIGF0dGFjaGVkIHRvIHRoaXMgTEFQLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2lybG1wX2RvX2FsbF9sc2FwX2V2ZW50KGhhc2hiaW5fdCAqCWxzYXBfaGFzaGJpbiwKKwkJCUlSTE1QX0VWRU5UCWV2ZW50KQoreworCXN0cnVjdCBsc2FwX2NiICpsc2FwOworCXN0cnVjdCBsc2FwX2NiICpsc2FwX25leHQ7CisKKwkvKiBOb3RlIDogdGhpcyBmdW5jdGlvbiB1c2UgdGhlIG5ldyBoYXNoYmluX2ZpbmRfbmV4dCgpCisJICogZnVuY3Rpb24sIGluc3RlYWQgb2YgdGhlIG9sZCBoYXNoYmluX2dldF9uZXh0KCkuCisJICogVGhpcyBtYWtlIHN1cmUgdGhhdCB3ZSBhcmUgYWx3YXlzIHBvaW50aW5nIG9uZSBsc2FwCisJICogYWhlYWQsIHNvIHRoYXQgaWYgdGhlIGN1cnJlbnQgbHNhcCBpcyByZW1vdmVkIGFzIHRoZQorCSAqIHJlc3VsdCBvZiBzZW5kaW5nIHRoZSBldmVudCwgd2UgZG9uJ3QgY2FyZS4KKwkgKiBBbHNvLCBhcyB3ZSBzdG9yZSB0aGUgY29udGV4dCBvdXJzZWx2ZXMsIGlmIGFuIGVudW1lcmF0aW9uCisJICogb2YgdGhlIHNhbWUgbHNhcCBoYXNoYmluIGhhcHBlbnMgYXMgdGhlIHJlc3VsdCBvZiBzZW5kaW5nIHRoZQorCSAqIGV2ZW50LCB3ZSBkb24ndCBjYXJlLgorCSAqIFRoZSBvbmx5IHByb2JsZW0gaXMgaWYgdGhlIG5leHQgbHNhcCBpcyByZW1vdmVkLiBJbiB0aGF0IGNhc2UsCisJICogaGFzaGJpbl9maW5kX25leHQoKSB3aWxsIHJldHVybiBOVUxMIGFuZCB3ZSB3aWxsIGFib3J0IHRoZQorCSAqIGVudW1lcmF0aW9uLiAtIEplYW4gSUkgKi8KKworCS8qIEFsc28gOiB3ZSBkb24ndCBhY2NlcHQgYW55IHNrYiBpbiBpbnB1dC4gV2UgY2FuICpOT1QqIHBhc3MKKwkgKiB0aGUgc2FtZSBza2IgdG8gbXVsdGlwbGUgY2xpZW50cyBzYWZlbHksIHdlIHdvdWxkIG5lZWQgdG8KKwkgKiBza2JfY2xvbmUoKSBpdC4gLSBKZWFuIElJICovCisKKwlsc2FwID0gKHN0cnVjdCBsc2FwX2NiICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGxzYXBfaGFzaGJpbik7CisKKwl3aGlsZSAoTlVMTCAhPSBoYXNoYmluX2ZpbmRfbmV4dChsc2FwX2hhc2hiaW4sCisJCQkJCSAobG9uZykgbHNhcCwKKwkJCQkJIE5VTEwsCisJCQkJCSAodm9pZCAqKSAmbHNhcF9uZXh0KSApIHsKKwkJaXJsbXBfZG9fbHNhcF9ldmVudChsc2FwLCBldmVudCwgTlVMTCk7CisJCWxzYXAgPSBsc2FwX25leHQ7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgTEFQIGNvbm5lY3Rpb24gY29udHJvbCBzdGF0ZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9zdGF0ZV9zdGFuZGJ5IChldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIFNUQU5EQlksIFRoZSBJckxBUCBjb25uZWN0aW9uIGRvZXMgbm90IGV4aXN0LgorICoKKyAqLworc3RhdGljIHZvaWQgaXJsbXBfc3RhdGVfc3RhbmRieShzdHJ1Y3QgbGFwX2NiICpzZWxmLCBJUkxNUF9FVkVOVCBldmVudCwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+aXJsYXAgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBMTV9MQVBfRElTQ09WRVJZX1JFUVVFU1Q6CisJCS8qIGlybG1wX25leHRfc3RhdGlvbl9zdGF0ZSggTE1QX0RJU0NPVkVSKTsgKi8KKworCQlpcmxhcF9kaXNjb3ZlcnlfcmVxdWVzdChzZWxmLT5pcmxhcCwgJmlybG1wLT5kaXNjb3ZlcnlfY21kKTsKKwkJYnJlYWs7CisJY2FzZSBMTV9MQVBfQ09OTkVDVF9JTkRJQ0FUSU9OOgorCQkvKiAgSXQncyBpbXBvcnRhbnQgdG8gc3dpdGNoIHN0YXRlIGZpcnN0LCB0byBhdm9pZCBJckxNUCB0bworCQkgKiAgdGhpbmsgdGhhdCB0aGUgbGluayBpcyBmcmVlIHNpbmNlIElyTE1QIG1heSB0aGVuIHN0YXJ0CisJCSAqICBkaXNjb3ZlcnkgYmVmb3JlIHRoZSBjb25uZWN0aW9uIGlzIHByb3Blcmx5IHNldCB1cC4gREIuCisJCSAqLworCQlpcmxtcF9uZXh0X2xhcF9zdGF0ZShzZWxmLCBMQVBfQUNUSVZFKTsKKworCQkvKiBKdXN0IGFjY2VwdCBjb25uZWN0aW9uIFRPRE8sIHRoaXMgc2hvdWxkIGJlIGZpeGVkICovCisJCWlybGFwX2Nvbm5lY3RfcmVzcG9uc2Uoc2VsZi0+aXJsYXAsIHNrYik7CisJCWJyZWFrOworCWNhc2UgTE1fTEFQX0NPTk5FQ1RfUkVRVUVTVDoKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSBMU19DT05ORUNUX1JFUVVFU1RcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJaXJsbXBfbmV4dF9sYXBfc3RhdGUoc2VsZiwgTEFQX1VfQ09OTkVDVCk7CisKKwkJLyogRklYTUU6IG5lZWQgdG8gc2V0IHVzZXJzIHJlcXVlc3RlZCBRb1MgKi8KKwkJaXJsYXBfY29ubmVjdF9yZXF1ZXN0KHNlbGYtPmlybGFwLCBzZWxmLT5kYWRkciwgTlVMTCwgMCk7CisJCWJyZWFrOworCWNhc2UgTE1fTEFQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTjoKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgRXJyb3IgTE1fTEFQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTlxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXyk7CisKKwkJaXJsbXBfbmV4dF9sYXBfc3RhdGUoc2VsZiwgTEFQX1NUQU5EQlkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVbmtub3duIGV2ZW50ICVzXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBpcmxtcF9ldmVudFtldmVudF0pOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9zdGF0ZV91X2Nvbm5lY3QgKGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgVV9DT05ORUNULCBUaGUgbGF5ZXIgYWJvdmUgaGFzIHRyaWVkIHRvIG9wZW4gYW4gTFNBUCBjb25uZWN0aW9uIGJ1dAorICogICAgc2luY2UgdGhlIElyTEFQIGNvbm5lY3Rpb24gZG9lcyBub3QgZXhpc3QsIHdlIG11c3QgZmlyc3Qgc3RhcnQgYW4KKyAqICAgIElyTEFQIGNvbm5lY3Rpb24uIFdlIGFyZSBub3cgd2FpdGluZyByZXNwb25zZSBmcm9tIElyTEFQLgorICogKi8KK3N0YXRpYyB2b2lkIGlybG1wX3N0YXRlX3VfY29ubmVjdChzdHJ1Y3QgbGFwX2NiICpzZWxmLCBJUkxNUF9FVkVOVCBldmVudCwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKSwgZXZlbnQ9JXNcbiIsIF9fRlVOQ1RJT05fXywgaXJsbXBfZXZlbnRbZXZlbnRdKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIExNX0xBUF9DT05ORUNUX0lORElDQVRJT046CisJCS8qICBJdCdzIGltcG9ydGFudCB0byBzd2l0Y2ggc3RhdGUgZmlyc3QsIHRvIGF2b2lkIElyTE1QIHRvCisJCSAqICB0aGluayB0aGF0IHRoZSBsaW5rIGlzIGZyZWUgc2luY2UgSXJMTVAgbWF5IHRoZW4gc3RhcnQKKwkJICogIGRpc2NvdmVyeSBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gaXMgcHJvcGVybHkgc2V0IHVwLiBEQi4KKwkJICovCisJCWlybG1wX25leHRfbGFwX3N0YXRlKHNlbGYsIExBUF9BQ1RJVkUpOworCisJCS8qIEp1c3QgYWNjZXB0IGNvbm5lY3Rpb24gVE9ETywgdGhpcyBzaG91bGQgYmUgZml4ZWQgKi8KKwkJaXJsYXBfY29ubmVjdF9yZXNwb25zZShzZWxmLT5pcmxhcCwgc2tiKTsKKworCQkvKiBUZWxsIExTQVBzIHRoYXQgdGhleSBjYW4gc3RhcnQgc2VuZGluZyBkYXRhICovCisJCWlybG1wX2RvX2FsbF9sc2FwX2V2ZW50KHNlbGYtPmxzYXBzLCBMTV9MQVBfQ09OTkVDVF9DT05GSVJNKTsKKworCQkvKiBOb3RlIDogYnkgdGhlIHRpbWUgd2UgZ2V0IHRoZXJlIChMQVAgcmV0cmllcyBhbmQgY28pLAorCQkgKiB0aGUgbHNhcHMgbWF5IGFscmVhZHkgaGF2ZSBnb25lLiBUaGlzIGF2b2lkIGdldHRpbmcgc3R1Y2sKKwkJICogZm9yZXZlciBpbiBMQVBfQUNUSVZFIHN0YXRlIC0gSmVhbiBJSSAqLworCQlpZiAoSEFTSEJJTl9HRVRfU0laRShzZWxmLT5sc2FwcykgPT0gMCkgeworCQkJSVJEQV9ERUJVRygwLCAiJXMoKSBOTyBMU0FQcyAhXG4iLCAgX19GVU5DVElPTl9fKTsKKwkJCWlybG1wX3N0YXJ0X2lkbGVfdGltZXIoc2VsZiwgTE1fSURMRV9USU1FT1VUKTsKKwkJfQorCQlicmVhazsKKwljYXNlIExNX0xBUF9DT05ORUNUX1JFUVVFU1Q6CisJCS8qIEFscmVhZHkgdHJ5aW5nIHRvIGNvbm5lY3QgKi8KKwkJYnJlYWs7CisJY2FzZSBMTV9MQVBfQ09OTkVDVF9DT05GSVJNOgorCQkvKiBGb3IgYWxsIGxzYXBfY2UgRSBBc3NvY2lhdGVkIGRvIExTX0Nvbm5lY3RfY29uZmlybSAqLworCQlpcmxtcF9uZXh0X2xhcF9zdGF0ZShzZWxmLCBMQVBfQUNUSVZFKTsKKworCQkvKiBUZWxsIExTQVBzIHRoYXQgdGhleSBjYW4gc3RhcnQgc2VuZGluZyBkYXRhICovCisJCWlybG1wX2RvX2FsbF9sc2FwX2V2ZW50KHNlbGYtPmxzYXBzLCBMTV9MQVBfQ09OTkVDVF9DT05GSVJNKTsKKworCQkvKiBOb3RlIDogYnkgdGhlIHRpbWUgd2UgZ2V0IHRoZXJlIChMQVAgcmV0cmllcyBhbmQgY28pLAorCQkgKiB0aGUgbHNhcHMgbWF5IGFscmVhZHkgaGF2ZSBnb25lLiBUaGlzIGF2b2lkIGdldHRpbmcgc3R1Y2sKKwkJICogZm9yZXZlciBpbiBMQVBfQUNUSVZFIHN0YXRlIC0gSmVhbiBJSSAqLworCQlpZiAoSEFTSEJJTl9HRVRfU0laRShzZWxmLT5sc2FwcykgPT0gMCkgeworCQkJSVJEQV9ERUJVRygwLCAiJXMoKSBOTyBMU0FQcyAhXG4iLCAgX19GVU5DVElPTl9fKTsKKwkJCWlybG1wX3N0YXJ0X2lkbGVfdGltZXIoc2VsZiwgTE1fSURMRV9USU1FT1VUKTsKKwkJfQorCQlicmVhazsKKwljYXNlIExNX0xBUF9ESVNDT05ORUNUX0lORElDQVRJT046CisJCUlSREFfREVCVUcoNCwgIiVzKCksIExNX0xBUF9ESVNDT05ORUNUX0lORElDQVRJT05cbiIsICBfX0ZVTkNUSU9OX18pOworCQlpcmxtcF9uZXh0X2xhcF9zdGF0ZShzZWxmLCBMQVBfU1RBTkRCWSk7CisKKwkJLyogU2VuZCBkaXNjb25uZWN0IGV2ZW50IHRvIGFsbCBMU0FQcyB1c2luZyB0aGlzIGxpbmsgKi8KKwkJaXJsbXBfZG9fYWxsX2xzYXBfZXZlbnQoc2VsZi0+bHNhcHMsCisJCQkJCUxNX0xBUF9ESVNDT05ORUNUX0lORElDQVRJT04pOworCQlicmVhazsKKwljYXNlIExNX0xBUF9ESVNDT05ORUNUX1JFUVVFU1Q6CisJCUlSREFfREVCVUcoNCwgIiVzKCksIExNX0xBUF9ESVNDT05ORUNUX1JFUVVFU1RcbiIsICBfX0ZVTkNUSU9OX18pOworCisJCS8qIE9uZSBvZiB0aGUgTFNBUCBkaWQgdGltZW91dCBvciB3YXMgY2xvc2VkLCBpZiBpdCB3YXMKKwkJICogdGhlIGxhc3Qgb25lLCB0cnkgdG8gZ2V0IG91dCBvZiBoZXJlIC0gSmVhbiBJSSAqLworCQlpZiAoSEFTSEJJTl9HRVRfU0laRShzZWxmLT5sc2FwcykgPD0gMSkgeworCQkJaXJsYXBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYtPmlybGFwKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVbmtub3duIGV2ZW50ICVzXG4iLAorCQkJIF9fRlVOQ1RJT05fXywgaXJsbXBfZXZlbnRbZXZlbnRdKTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJsbXBfc3RhdGVfYWN0aXZlIChldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIEFDVElWRSwgSXJMQVAgY29ubmVjdGlvbiBpcyBhY3RpdmUKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlybG1wX3N0YXRlX2FjdGl2ZShzdHJ1Y3QgbGFwX2NiICpzZWxmLCBJUkxNUF9FVkVOVCBldmVudCwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBMTV9MQVBfQ09OTkVDVF9SRVFVRVNUOgorCQlJUkRBX0RFQlVHKDQsICIlcygpLCBMU19DT05ORUNUX1JFUVVFU1RcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJLyoKKwkJICogSXJMQVAgbWF5IGhhdmUgYSBwZW5kaW5nIGRpc2Nvbm5lY3QuIFdlIHRyaWVkIHRvIGNsb3NlCisJCSAqIElyTEFQLCBidXQgaXQgd2FzIHBvc3Rwb25lZCBiZWNhdXNlIHRoZSBsaW5rIHdhcworCQkgKiBidXN5IG9yIHdlIHdlcmUgc3RpbGwgc2VuZGluZyBwYWNrZXRzLiBBcyB3ZSBub3cKKwkJICogbmVlZCBpdCwgbWFrZSBzdXJlIGl0IHN0YXlzIG9uLiBKZWFuIElJCisJCSAqLworCQlpcmxhcF9jbGVhcl9kaXNjb25uZWN0KHNlbGYtPmlybGFwKTsKKworCQkvKgorCQkgKiAgTEFQIGNvbm5lY3Rpb24gYWxyZWFkeSBhY3RpdmUsIGp1c3QgYm91bmNlIGJhY2shIFNpbmNlIHdlCisJCSAqICBkb24ndCBrbm93IHdoaWNoIExTQVAgdGhhdCB0cmllZCB0byBkbyB0aGlzLCB3ZSBoYXZlIHRvCisJCSAqICBub3RpZnkgYWxsIExTQVBzIHVzaW5nIHRoaXMgTEFQLCBidXQgdGhhdCBzaG91bGQgYmUgc2FmZSB0bworCQkgKiAgZG8gYW55d2F5LgorCQkgKi8KKwkJaXJsbXBfZG9fYWxsX2xzYXBfZXZlbnQoc2VsZi0+bHNhcHMsIExNX0xBUF9DT05ORUNUX0NPTkZJUk0pOworCisJCS8qIE5lZWRlZCBieSBjb25uZWN0IGluZGljYXRpb24gKi8KKwkJaXJsbXBfZG9fYWxsX2xzYXBfZXZlbnQoaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzLAorCQkJCQlMTV9MQVBfQ09OTkVDVF9DT05GSVJNKTsKKwkJLyogS2VlcCBzdGF0ZSAqLworCQlicmVhazsKKwljYXNlIExNX0xBUF9ESVNDT05ORUNUX1JFUVVFU1Q6CisJCS8qCisJCSAqICBOZWVkIHRvIGZpbmQgb3V0IGlmIHdlIHNob3VsZCBjbG9zZSBJckxBUCBvciBub3QuIElmIHRoZXJlCisJCSAqICBpcyBvbmx5IG9uZSBMU0FQIGNvbm5lY3Rpb24gbGVmdCBvbiB0aGlzIGxpbmssIHRoYXQgTFNBUAorCQkgKiAgbXVzdCBiZSB0aGUgb25lIHRoYXQgdHJpZXMgdG8gY2xvc2UgSXJMQVAuIEl0IHdpbGwgYmUKKwkJICogIHJlbW92ZWQgbGF0ZXIgYW5kIG1vdmVkIHRvIHRoZSBsaXN0IG9mIHVuY29ubmVjdGVkIExTQVBzCisJCSAqLworCQlpZiAoSEFTSEJJTl9HRVRfU0laRShzZWxmLT5sc2FwcykgPiAwKSB7CisJCQkvKiBUaW1lciB2YWx1ZSBpcyBjaGVja2VkIGluIGlyc3lzY3RsIC0gSmVhbiBJSSAqLworCQkJaXJsbXBfc3RhcnRfaWRsZV90aW1lcihzZWxmLCBzeXNjdGxfbGFwX2tlZXBhbGl2ZV90aW1lICogSFogLyAxMDAwKTsKKwkJfSBlbHNlIHsKKwkJCS8qIE5vIG1vcmUgY29ubmVjdGlvbnMsIHNvIGNsb3NlIElyTEFQICovCisKKwkJCS8qIFdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIHN0YXRlIGp1c3QgeWV0LCBiZWNhdXNlCisJCQkgKiB3ZSB3YW50IHRvIHJlZmxlY3QgYWNjdXJhdGVseSB0aGUgcmVhbCBzdGF0ZSBvZgorCQkJICogdGhlIExBUCwgbm90IHRoZSBzdGF0ZSB3ZSB3aXNoIGl0IHdhcyBpbiwKKwkJCSAqIHNvIHRoYXQgd2UgZG9uJ3QgbG9zZSBMTV9MQVBfQ09OTkVDVF9SRVFVRVNULgorCQkJICogSW4gc29tZSBjYXNlcywgSXJMQVAgd29uJ3QgY2xvc2UgdGhlIExBUAorCQkJICogaW1tZWRpYXRlbHkuIEZvciBleGFtcGxlLCBpdCBtaWdodCBzdGlsbCBiZQorCQkJICogcmV0cnlpbmcgcGFja2V0cyBvciB3YWl0aW5nIGZvciB0aGUgcGYgYml0LgorCQkJICogQXMgdGhlIExBUCBhbHdheXMgc2VuZCBhIERJU0NPTk5FQ1RfSU5ESUNBVElPTgorCQkJICogaW4gUENMT1NFIG9yIFNDTE9TRSwganVzdCBjaGFuZ2Ugc3RhdGUgb24gdGhhdC4KKwkJCSAqIEplYW4gSUkgKi8KKwkJCWlybGFwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmLT5pcmxhcCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBMTV9MQVBfSURMRV9USU1FT1VUOgorCQlpZiAoSEFTSEJJTl9HRVRfU0laRShzZWxmLT5sc2FwcykgPT0gMCkgeworCQkJLyogU2FtZSByZWFzb25pbmcgYXMgYWJvdmUgLSBrZWVwIHN0YXRlICovCisJCQlpcmxhcF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZi0+aXJsYXApOworCQl9CisJCWJyZWFrOworCWNhc2UgTE1fTEFQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTjoKKwkJaXJsbXBfbmV4dF9sYXBfc3RhdGUoc2VsZiwgTEFQX1NUQU5EQlkpOworCisJCS8qIEluIHNvbWUgY2FzZSwgYXQgdGhpcyBwb2ludCBvdXIgc2lkZSBoYXMgYWxyZWFkeSBjbG9zZWQKKwkJICogYWxsIGxzYXBzLCBhbmQgd2UgYXJlIHdhaXRpbmcgZm9yIHRoZSBpZGxlX3RpbWVyIHRvCisJCSAqIGV4cGlyZS4gSWYgYW5vdGhlciBkZXZpY2UgcmVjb25uZWN0IGltbWVkaWF0ZWx5LCB0aGUKKwkJICogaWRsZSB0aW1lciB3aWxsIGV4cGlyZSBpbiB0aGUgbWlkbGUgb2YgdGhlIGNvbm5lY3Rpb24KKwkJICogaW5pdGlhbGlzYXRpb24sIHNjcmV3aW5nIHVwIHRoaW5ncyBhIGxvdC4uLgorCQkgKiBUaGVyZWZvcmUsIHdlIG11c3Qgc3RvcCB0aGUgdGltZXIuLi4gKi8KKwkJaXJsbXBfc3RvcF9pZGxlX3RpbWVyKHNlbGYpOworCisJCS8qCisJCSAqICBJbmZvcm0gYWxsIGNvbm5lY3RlZCBMU0FQJ3MgdXNpbmcgdGhpcyBsaW5rCisJCSAqLworCQlpcmxtcF9kb19hbGxfbHNhcF9ldmVudChzZWxmLT5sc2FwcywKKwkJCQkJTE1fTEFQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTik7CisKKwkJLyogRm9yY2UgYW4gZXhwaXJ5IG9mIHRoZSBkaXNjb3ZlcnkgbG9nLgorCQkgKiBOb3cgdGhhdCB0aGUgTEFQIGlzIGZyZWUsIHRoZSBzeXN0ZW0gbWF5IGF0dGVtcHQgdG8KKwkJICogY29ubmVjdCB0byBhbm90aGVyIGRldmljZS4gVW5mb3J0dW5hdGVseSwgb3VyIGVudHJpZXMKKwkJICogYXJlIHN0YWxlLiBUaGVyZSBpcyBhIHNtYWxsIHdpbmRvdyAoPDNzKSBiZWZvcmUgdGhlCisJCSAqIG5vcm1hbCBkaXNjb3Zlcnkgd2lsbCBydW4gYW5kIHdoZXJlIGlybG1wX2Nvbm5lY3RfcmVxdWVzdCgpCisJCSAqIGNhbiBnZXQgdGhlIHdyb25nIGluZm8sIHNvIG1ha2Ugc3VyZSB0aGluZ3MgZ2V0CisJCSAqIGNsZWFuZWQgKk5PVyogOy0pIC0gSmVhbiBJSSAqLworCQlpcmxtcF9kb19leHBpcnkoKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVW5rbm93biBldmVudCAlc1xuIiwKKwkJCSBfX0ZVTkNUSU9OX18sIGlybG1wX2V2ZW50W2V2ZW50XSk7CisJCWJyZWFrOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgIExTQVAgY29ubmVjdGlvbiBjb250cm9sIHN0YXRlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX3N0YXRlX2Rpc2Nvbm5lY3RlZCAoZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICBESVNDT05ORUNURUQKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJsbXBfc3RhdGVfZGlzY29ubmVjdGVkKHN0cnVjdCBsc2FwX2NiICpzZWxmLCBJUkxNUF9FVkVOVCBldmVudCwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MU0FQX01BR0lDLCByZXR1cm4gLTE7KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKyNpZmRlZiBDT05GSUdfSVJEQV9VTFRSQQorCWNhc2UgTE1fVURBVEFfSU5ESUNBVElPTjoKKwkJLyogVGhpcyBpcyBtb3N0IGJpenphcmUuIFRob3NlIHBhY2tldHMgYXJlICBha2EgdW5yZWxpYWJsZQorCQkgKiBjb25uZWN0ZWQsIGFrYSBJckxQVCBvciBTT0NLX0RHUkFNL0lSREFQUk9UT19VTklUREFUQS4KKwkJICogV2h5IGRvIHdlIHBhc3MgdGhlbSBhcyBVbHRyYSA/Pz8gSmVhbiBJSSAqLworCQlpcmxtcF9jb25ubGVzc19kYXRhX2luZGljYXRpb24oc2VsZiwgc2tiKTsKKwkJYnJlYWs7CisjZW5kaWYgLyogQ09ORklHX0lSREFfVUxUUkEgKi8KKwljYXNlIExNX0NPTk5FQ1RfUkVRVUVTVDoKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgTE1fQ09OTkVDVF9SRVFVRVNUXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCWlmIChzZWxmLT5jb25uX3NrYikgeworCQkJSVJEQV9XQVJOSU5HKCIlczogYnVzeSB3aXRoIGFub3RoZXIgcmVxdWVzdCFcbiIsCisJCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQkvKiBEb24ndCBmb3JnZXQgdG8gcmVmY291bnQgaXQgKHNlZSBpcmxtcF9jb25uZWN0X3JlcXVlc3QoKSkgKi8KKwkJc2tiX2dldChza2IpOworCQlzZWxmLT5jb25uX3NrYiA9IHNrYjsKKworCQlpcmxtcF9uZXh0X2xzYXBfc3RhdGUoc2VsZiwgTFNBUF9TRVRVUF9QRU5EKTsKKworCQkvKiBTdGFydCB3YXRjaGRvZyB0aW1lciAoNSBzZWNzIGZvciBub3cpICovCisJCWlybG1wX3N0YXJ0X3dhdGNoZG9nX3RpbWVyKHNlbGYsIDUqSFopOworCisJCWlybG1wX2RvX2xhcF9ldmVudChzZWxmLT5sYXAsIExNX0xBUF9DT05ORUNUX1JFUVVFU1QsIE5VTEwpOworCQlicmVhazsKKwljYXNlIExNX0NPTk5FQ1RfSU5ESUNBVElPTjoKKwkJaWYgKHNlbGYtPmNvbm5fc2tiKSB7CisJCQlJUkRBX1dBUk5JTkcoIiVzOiBidXN5IHdpdGggYW5vdGhlciByZXF1ZXN0IVxuIiwKKwkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCS8qIERvbid0IGZvcmdldCB0byByZWZjb3VudCBpdCAoc2VlIGlybGFwX2RyaXZlcl9yY3YoKSkgKi8KKwkJc2tiX2dldChza2IpOworCQlzZWxmLT5jb25uX3NrYiA9IHNrYjsKKworCQlpcmxtcF9uZXh0X2xzYXBfc3RhdGUoc2VsZiwgTFNBUF9DT05ORUNUX1BFTkQpOworCisJCS8qIFN0YXJ0IHdhdGNoZG9nIHRpbWVyCisJCSAqIFRoaXMgaXMgbm90IG1lbnRpb25uZWQgaW4gdGhlIHNwZWMsIGJ1dCB0aGVyZSBpcyBhIHJhcmUKKwkJICogcmFjZSBjb25kaXRpb24gdGhhdCBjYW4gZ2V0IHRoZSBzb2NrZXQgc3R1Y2suCisJCSAqIElmIHdlIHJlY2VpdmUgdGhpcyBldmVudCB3aGlsZSBvdXIgTEFQIGlzIGNsb3NpbmcgZG93biwKKwkJICogdGhlIExNX0xBUF9DT05ORUNUX1JFUVVFU1QgZ2V0IGxvc3QgYW5kIHdlIGdldCBzdHVjayBpbgorCQkgKiBDT05ORUNUX1BFTkQgc3RhdGUgZm9yZXZlci4KKwkJICogVGhlIG90aGVyIGNhdXNlIG9mIGdldHRpbmcgc3R1Y2sgZG93biB0aGVyZSBpcyBpZiB0aGUKKwkJICogaGlnaGVyIGxheWVyIG5ldmVyIHJlcGx5IHRvIHRoZSBDT05ORUNUX0lORElDQVRJT04uCisJCSAqIEFueXdheSwgaXQgbWFrZSBzZW5zZSB0byBtYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZQorCQkgKiBhIGJhY2t1cCBwbGFuLiAxIHNlY29uZCBpcyBwbGVudHkgKHNob3VsZCBiZSBpbW1lZGlhdGUpLgorCQkgKiBKZWFuIElJICovCisJCWlybG1wX3N0YXJ0X3dhdGNoZG9nX3RpbWVyKHNlbGYsIDEqSFopOworCisJCWlybG1wX2RvX2xhcF9ldmVudChzZWxmLT5sYXAsIExNX0xBUF9DT05ORUNUX1JFUVVFU1QsIE5VTEwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0RFQlVHKDEsICIlcygpLCBVbmtub3duIGV2ZW50ICVzIG9uIExTQVAgJSMwMnhcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGlybG1wX2V2ZW50W2V2ZW50XSwgc2VsZi0+c2xzYXBfc2VsKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9zdGF0ZV9jb25uZWN0IChzZWxmLCBldmVudCwgc2tiKQorICoKKyAqICAgIENPTk5FQ1QKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJsbXBfc3RhdGVfY29ubmVjdChzdHJ1Y3QgbHNhcF9jYiAqc2VsZiwgSVJMTVBfRVZFTlQgZXZlbnQsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbHNhcF9jYiAqbHNhcDsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MU0FQX01BR0lDLCByZXR1cm4gLTE7KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIExNX0NPTk5FQ1RfUkVTUE9OU0U6CisJCS8qCisJCSAqICBCaW5kIHRoaXMgTFNBUCB0byB0aGUgSXJMQVAgbGluayB3aGVyZSB0aGUgY29ubmVjdCB3YXMKKwkJICogIHJlY2VpdmVkCisJCSAqLworCQlsc2FwID0gaGFzaGJpbl9yZW1vdmUoaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzLCAobG9uZykgc2VsZiwKKwkJCQkgICAgICBOVUxMKTsKKworCQlJUkRBX0FTU0VSVChsc2FwID09IHNlbGYsIHJldHVybiAtMTspOworCQlJUkRBX0FTU0VSVChzZWxmLT5sYXAgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJCUlSREFfQVNTRVJUKHNlbGYtPmxhcC0+bHNhcHMgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwkJaGFzaGJpbl9pbnNlcnQoc2VsZi0+bGFwLT5sc2FwcywgKGlyZGFfcXVldWVfdCAqKSBzZWxmLAorCQkJICAgICAgIChsb25nKSBzZWxmLCBOVUxMKTsKKworCQlzZXRfYml0KDAsICZzZWxmLT5jb25uZWN0ZWQpOwkvKiBUUlVFICovCisKKwkJaXJsbXBfc2VuZF9sY2ZfcGR1KHNlbGYtPmxhcCwgc2VsZi0+ZGxzYXBfc2VsLAorCQkJCSAgIHNlbGYtPnNsc2FwX3NlbCwgQ09OTkVDVF9DTkYsIHNrYik7CisKKwkJZGVsX3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CisKKwkJaXJsbXBfbmV4dF9sc2FwX3N0YXRlKHNlbGYsIExTQVBfREFUQV9UUkFOU0ZFUl9SRUFEWSk7CisJCWJyZWFrOworCWNhc2UgTE1fV0FUQ0hET0dfVElNRU9VVDoKKwkJLyogTWF5IGhhcHBlbiwgd2hvIGtub3dzLi4uCisJCSAqIEplYW4gSUkgKi8KKwkJSVJEQV9ERUJVRygwLCAiJXMoKSBXQVRDSERPR19USU1FT1VUIVxuIiwgIF9fRlVOQ1RJT05fXyk7CisKKwkJLyogRGlzY29ubmVjdCwgZ2V0IG91dC4uLiAtIEplYW4gSUkgKi8KKwkJc2VsZi0+bGFwID0gTlVMTDsKKwkJc2VsZi0+ZGxzYXBfc2VsID0gTFNBUF9BTlk7CisJCWlybG1wX25leHRfbHNhcF9zdGF0ZShzZWxmLCBMU0FQX0RJU0NPTk5FQ1RFRCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIExNX0xBUF9ESVNDT05ORUNUX0lORElDQVRJT04gOiBTaG91bGQgbmV2ZXIgaGFwcGVuLCB3ZQorCQkgKiBhcmUgKm5vdCogeWV0IGJvdW5kIHRvIHRoZSBJckxBUCBsaW5rLiBKZWFuIElJICovCisJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gZXZlbnQgJXMgb24gTFNBUCAlIzAyeFxuIiwgCisJCQkgICBfX0ZVTkNUSU9OX18sIGlybG1wX2V2ZW50W2V2ZW50XSwgc2VsZi0+c2xzYXBfc2VsKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9zdGF0ZV9jb25uZWN0X3BlbmQgKGV2ZW50LCBza2IsIGluZm8pCisgKgorICogICAgQ09OTkVDVF9QRU5ECisgKgorICovCitzdGF0aWMgaW50IGlybG1wX3N0YXRlX2Nvbm5lY3RfcGVuZChzdHJ1Y3QgbHNhcF9jYiAqc2VsZiwgSVJMTVBfRVZFTlQgZXZlbnQsCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MU0FQX01BR0lDLCByZXR1cm4gLTE7KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIExNX0NPTk5FQ1RfUkVRVUVTVDoKKwkJLyogS2VlcCBzdGF0ZSAqLworCQlicmVhazsKKwljYXNlIExNX0NPTk5FQ1RfUkVTUE9OU0U6CisJCUlSREFfREVCVUcoMCwgIiVzKCksIExNX0NPTk5FQ1RfUkVTUE9OU0UsICIKKwkJCSAgICJubyBpbmRpY2F0aW9uIGlzc3VlZCB5ZXRcbiIsICBfX0ZVTkNUSU9OX18pOworCQkvKiBLZWVwIHN0YXRlICovCisJCWJyZWFrOworCWNhc2UgTE1fRElTQ09OTkVDVF9SRVFVRVNUOgorCQlJUkRBX0RFQlVHKDAsICIlcygpLCBMTV9ESVNDT05ORUNUX1JFUVVFU1QsICIKKwkJCSAgICJub3QgeWV0IGJvdW5kIHRvIElyTEFQIGNvbm5lY3Rpb25cbiIsICBfX0ZVTkNUSU9OX18pOworCQkvKiBLZWVwIHN0YXRlICovCisJCWJyZWFrOworCWNhc2UgTE1fTEFQX0NPTk5FQ1RfQ09ORklSTToKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgTFNfQ09OTkVDVF9DT05GSVJNXG4iLCAgX19GVU5DVElPTl9fKTsKKwkJaXJsbXBfbmV4dF9sc2FwX3N0YXRlKHNlbGYsIExTQVBfQ09OTkVDVCk7CisKKwkJdHhfc2tiID0gc2VsZi0+Y29ubl9za2I7CisJCXNlbGYtPmNvbm5fc2tiID0gTlVMTDsKKworCQlpcmxtcF9jb25uZWN0X2luZGljYXRpb24oc2VsZiwgdHhfc2tiKTsKKwkJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgaXJsbXBfY29ubmVjdF9pbmRpY2F0aW9uKCkuICovCisJCWRldl9rZnJlZV9za2IodHhfc2tiKTsKKwkJYnJlYWs7CisJY2FzZSBMTV9XQVRDSERPR19USU1FT1VUOgorCQkvKiBXaWxsIGhhcHBlbiBpbiBzb21lIHJhcmUgY2FzZXMgYmVjYXVzZSBvZiBhIHJhY2UgY29uZGl0aW9uLgorCQkgKiBKdXN0IG1ha2Ugc3VyZSB3ZSBkb24ndCBzdGF5IHRoZXJlIGZvcmV2ZXIuLi4KKwkJICogSmVhbiBJSSAqLworCQlJUkRBX0RFQlVHKDAsICIlcygpIFdBVENIRE9HX1RJTUVPVVQhXG4iLCAgX19GVU5DVElPTl9fKTsKKworCQkvKiBHbyBiYWNrIHRvIGRpc2Nvbm5lY3RlZCBtb2RlLCBrZWVwIHRoZSBzb2NrZXQgd2FpdGluZyAqLworCQlzZWxmLT5sYXAgPSBOVUxMOworCQlzZWxmLT5kbHNhcF9zZWwgPSBMU0FQX0FOWTsKKwkJaWYoc2VsZi0+Y29ubl9za2IpCisJCQlkZXZfa2ZyZWVfc2tiKHNlbGYtPmNvbm5fc2tiKTsKKwkJc2VsZi0+Y29ubl9za2IgPSBOVUxMOworCQlpcmxtcF9uZXh0X2xzYXBfc3RhdGUoc2VsZiwgTFNBUF9ESVNDT05ORUNURUQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBMTV9MQVBfRElTQ09OTkVDVF9JTkRJQ0FUSU9OIDogU2hvdWxkIG5ldmVyIGhhcHBlbiwgd2UKKwkJICogYXJlICpub3QqIHlldCBib3VuZCB0byB0aGUgSXJMQVAgbGluay4gSmVhbiBJSSAqLworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVbmtub3duIGV2ZW50ICVzIG9uIExTQVAgJSMwMnhcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGlybG1wX2V2ZW50W2V2ZW50XSwgc2VsZi0+c2xzYXBfc2VsKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9zdGF0ZV9kdHIgKHNlbGYsIGV2ZW50LCBza2IpCisgKgorICogICAgREFUQV9UUkFOU0ZFUl9SRUFEWQorICoKKyAqLworc3RhdGljIGludCBpcmxtcF9zdGF0ZV9kdHIoc3RydWN0IGxzYXBfY2IgKnNlbGYsIElSTE1QX0VWRU5UIGV2ZW50LAorCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlMTV9SRUFTT04gcmVhc29uOworCWludCByZXQgPSAwOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xTQVBfTUFHSUMsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPmxhcCAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIExNX0RBVEFfUkVRVUVTVDogLyogT3B0aW1pemUgZm9yIHRoZSBjb21tb24gY2FzZSAqLworCQlpcmxtcF9zZW5kX2RhdGFfcGR1KHNlbGYtPmxhcCwgc2VsZi0+ZGxzYXBfc2VsLAorCQkJCSAgICBzZWxmLT5zbHNhcF9zZWwsIEZBTFNFLCBza2IpOworCQlicmVhazsKKwljYXNlIExNX0RBVEFfSU5ESUNBVElPTjogLyogT3B0aW1pemUgZm9yIHRoZSBjb21tb24gY2FzZSAqLworCQlpcmxtcF9kYXRhX2luZGljYXRpb24oc2VsZiwgc2tiKTsKKwkJYnJlYWs7CisJY2FzZSBMTV9VREFUQV9SRVFVRVNUOgorCQlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJCWlybG1wX3NlbmRfZGF0YV9wZHUoc2VsZi0+bGFwLCBzZWxmLT5kbHNhcF9zZWwsCisJCQkJICAgIHNlbGYtPnNsc2FwX3NlbCwgVFJVRSwgc2tiKTsKKwkJYnJlYWs7CisJY2FzZSBMTV9VREFUQV9JTkRJQ0FUSU9OOgorCQlpcmxtcF91ZGF0YV9pbmRpY2F0aW9uKHNlbGYsIHNrYik7CisJCWJyZWFrOworCWNhc2UgTE1fQ09OTkVDVF9SRVFVRVNUOgorCQlJUkRBX0RFQlVHKDAsICIlcygpLCBMTV9DT05ORUNUX1JFUVVFU1QsICIKKwkJCSAgICJlcnJvciwgTFNBUCBhbHJlYWR5IGNvbm5lY3RlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJLyogS2VlcCBzdGF0ZSAqLworCQlicmVhazsKKwljYXNlIExNX0NPTk5FQ1RfUkVTUE9OU0U6CisJCUlSREFfREVCVUcoMCwgIiVzKCksIExNX0NPTk5FQ1RfUkVTUE9OU0UsICIKKwkJCSAgICJlcnJvciwgTFNBUCBhbHJlYWR5IGNvbm5lY3RlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJLyogS2VlcCBzdGF0ZSAqLworCQlicmVhazsKKwljYXNlIExNX0RJU0NPTk5FQ1RfUkVRVUVTVDoKKwkJaXJsbXBfc2VuZF9sY2ZfcGR1KHNlbGYtPmxhcCwgc2VsZi0+ZGxzYXBfc2VsLCBzZWxmLT5zbHNhcF9zZWwsCisJCQkJICAgRElTQ09OTkVDVCwgc2tiKTsKKwkJaXJsbXBfbmV4dF9sc2FwX3N0YXRlKHNlbGYsIExTQVBfRElTQ09OTkVDVEVEKTsKKwkJLyogQ2FsbGVkIG9ubHkgZnJvbSBpcmxtcF9kaXNjb25uZWN0X3JlcXVlc3QoKSwgd2lsbAorCQkgKiB1bmJpbmQgZnJvbSBMQVAgb3ZlciB0aGVyZS4gSmVhbiBJSSAqLworCisJCS8qIFRyeSB0byBjbG9zZSB0aGUgTEFQIGNvbm5lY3Rpb24gaWYgaXRzIHN0aWxsIHRoZXJlICovCisJCWlmIChzZWxmLT5sYXApIHsKKwkJCUlSREFfREVCVUcoNCwgIiVzKCksIHRyeWluZyB0byBjbG9zZSBJckxBUFxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18pOworCQkJaXJsbXBfZG9fbGFwX2V2ZW50KHNlbGYtPmxhcCwKKwkJCQkJICAgTE1fTEFQX0RJU0NPTk5FQ1RfUkVRVUVTVCwKKwkJCQkJICAgTlVMTCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBMTV9MQVBfRElTQ09OTkVDVF9JTkRJQ0FUSU9OOgorCQlpcmxtcF9uZXh0X2xzYXBfc3RhdGUoc2VsZiwgTFNBUF9ESVNDT05ORUNURUQpOworCisJCXJlYXNvbiA9IGlybG1wX2NvbnZlcnRfbGFwX3JlYXNvbihzZWxmLT5sYXAtPnJlYXNvbik7CisKKwkJaXJsbXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYsIHJlYXNvbiwgTlVMTCk7CisJCWJyZWFrOworCWNhc2UgTE1fRElTQ09OTkVDVF9JTkRJQ0FUSU9OOgorCQlpcmxtcF9uZXh0X2xzYXBfc3RhdGUoc2VsZiwgTFNBUF9ESVNDT05ORUNURUQpOworCisJCUlSREFfQVNTRVJUKHNlbGYtPmxhcCAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwkJSVJEQV9BU1NFUlQoc2VsZi0+bGFwLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm4gLTE7KTsKKworCQlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJCUlSREFfQVNTRVJUKHNrYi0+bGVuID4gMywgcmV0dXJuIC0xOyk7CisJCXJlYXNvbiA9IHNrYi0+ZGF0YVszXTsKKworCQkgLyogVHJ5IHRvIGNsb3NlIHRoZSBMQVAgY29ubmVjdGlvbiAqLworCQlJUkRBX0RFQlVHKDQsICIlcygpLCB0cnlpbmcgdG8gY2xvc2UgSXJMQVBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWlybG1wX2RvX2xhcF9ldmVudChzZWxmLT5sYXAsIExNX0xBUF9ESVNDT05ORUNUX1JFUVVFU1QsIE5VTEwpOworCisJCWlybG1wX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzZWxmLCByZWFzb24sIHNrYik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gZXZlbnQgJXMgb24gTFNBUCAlIzAyeFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgaXJsbXBfZXZlbnRbZXZlbnRdLCBzZWxmLT5zbHNhcF9zZWwpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX3N0YXRlX3NldHVwIChldmVudCwgc2tiLCBpbmZvKQorICoKKyAqICAgIFNFVFVQLCBTdGF0aW9uIENvbnRyb2wgaGFzIHNldCB1cCB0aGUgdW5kZXJseWluZyBJckxBUCBjb25uZWN0aW9uLgorICogICAgQW4gTFNBUCBjb25uZWN0aW9uIHJlcXVlc3QgaGFzIGJlZW4gdHJhbnNtaXR0ZWQgdG8gdGhlIHBlZXIKKyAqICAgIExTQVAtQ29ubmVjdGlvbiBDb250cm9sIEZTTSBhbmQgd2UgYXJlIGF3YWl0aW5nIHJlcGx5LgorICovCitzdGF0aWMgaW50IGlybG1wX3N0YXRlX3NldHVwKHN0cnVjdCBsc2FwX2NiICpzZWxmLCBJUkxNUF9FVkVOVCBldmVudCwKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlMTV9SRUFTT04gcmVhc29uOworCWludCByZXQgPSAwOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTE1fQ09OTkVDVF9DT05GSVJNOgorCQlpcmxtcF9uZXh0X2xzYXBfc3RhdGUoc2VsZiwgTFNBUF9EQVRBX1RSQU5TRkVSX1JFQURZKTsKKworCQlkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKKworCQlpcmxtcF9jb25uZWN0X2NvbmZpcm0oc2VsZiwgc2tiKTsKKwkJYnJlYWs7CisJY2FzZSBMTV9ESVNDT05ORUNUX0lORElDQVRJT046CisJCWlybG1wX25leHRfbHNhcF9zdGF0ZShzZWxmLCBMU0FQX0RJU0NPTk5FQ1RFRCk7CisKKwkJSVJEQV9BU1NFUlQoc2VsZi0+bGFwICE9IE5VTEwsIHJldHVybiAtMTspOworCQlJUkRBX0FTU0VSVChzZWxmLT5sYXAtPm1hZ2ljID09IExNUF9MQVBfTUFHSUMsIHJldHVybiAtMTspOworCisJCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwkJSVJEQV9BU1NFUlQoc2tiLT5sZW4gPiAzLCByZXR1cm4gLTE7KTsKKwkJcmVhc29uID0gc2tiLT5kYXRhWzNdOworCisJCSAvKiBUcnkgdG8gY2xvc2UgdGhlIExBUCBjb25uZWN0aW9uICovCisJCUlSREFfREVCVUcoNCwgIiVzKCksIHRyeWluZyB0byBjbG9zZSBJckxBUFxuIiwgIF9fRlVOQ1RJT05fXyk7CisJCWlybG1wX2RvX2xhcF9ldmVudChzZWxmLT5sYXAsIExNX0xBUF9ESVNDT05ORUNUX1JFUVVFU1QsIE5VTEwpOworCisJCWlybG1wX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihzZWxmLCByZWFzb24sIHNrYik7CisJCWJyZWFrOworCWNhc2UgTE1fTEFQX0RJU0NPTk5FQ1RfSU5ESUNBVElPTjoKKwkJaXJsbXBfbmV4dF9sc2FwX3N0YXRlKHNlbGYsIExTQVBfRElTQ09OTkVDVEVEKTsKKworCQlkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKKworCQlJUkRBX0FTU0VSVChzZWxmLT5sYXAgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJCUlSREFfQVNTRVJUKHNlbGYtPmxhcC0+bWFnaWMgPT0gTE1QX0xBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwkJcmVhc29uID0gaXJsbXBfY29udmVydF9sYXBfcmVhc29uKHNlbGYtPmxhcC0+cmVhc29uKTsKKworCQlpcmxtcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgcmVhc29uLCBza2IpOworCQlicmVhazsKKwljYXNlIExNX1dBVENIRE9HX1RJTUVPVVQ6CisJCUlSREFfREVCVUcoMCwgIiVzKCkgV0FUQ0hET0dfVElNRU9VVCFcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJSVJEQV9BU1NFUlQoc2VsZi0+bGFwICE9IE5VTEwsIHJldHVybiAtMTspOworCQlpcmxtcF9kb19sYXBfZXZlbnQoc2VsZi0+bGFwLCBMTV9MQVBfRElTQ09OTkVDVF9SRVFVRVNULCBOVUxMKTsKKwkJaXJsbXBfbmV4dF9sc2FwX3N0YXRlKHNlbGYsIExTQVBfRElTQ09OTkVDVEVEKTsKKworCQlpcmxtcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgTE1fQ09OTkVDVF9GQUlMVVJFLCBOVUxMKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVW5rbm93biBldmVudCAlcyBvbiBMU0FQICUjMDJ4XG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBpcmxtcF9ldmVudFtldmVudF0sIHNlbGYtPnNsc2FwX3NlbCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gaXJsbXBfc3RhdGVfc2V0dXBfcGVuZCAoZXZlbnQsIHNrYiwgaW5mbykKKyAqCisgKiAgICBTRVRVUF9QRU5ELCBBbiBMTV9DT05ORUNUX1JFUVVFU1QgaGFzIGJlZW4gcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmljZQorICogICAgdXNlciB0byBzZXQgdXAgYW4gTFNBUCBjb25uZWN0aW9uLiBBIHJlcXVlc3QgaGFzIGJlZW4gc2VudCB0byB0aGUKKyAqICAgIExBUCBGU00gdG8gc2V0IHVwIHRoZSB1bmRlcmx5aW5nIElyTEFQIGNvbm5lY3Rpb24sIGFuZCB3ZQorICogICAgYXJlIGF3YWl0aW5nIGNvbmZpcm0uCisgKi8KK3N0YXRpYyBpbnQgaXJsbXBfc3RhdGVfc2V0dXBfcGVuZChzdHJ1Y3QgbHNhcF9jYiAqc2VsZiwgSVJMTVBfRVZFTlQgZXZlbnQsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmICp0eF9za2I7CisJTE1fUkVBU09OIHJlYXNvbjsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKGlybG1wICE9IE5VTEwsIHJldHVybiAtMTspOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTE1fTEFQX0NPTk5FQ1RfQ09ORklSTToKKwkJSVJEQV9BU1NFUlQoc2VsZi0+Y29ubl9za2IgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwkJdHhfc2tiID0gc2VsZi0+Y29ubl9za2I7CisJCXNlbGYtPmNvbm5fc2tiID0gTlVMTDsKKworCQlpcmxtcF9zZW5kX2xjZl9wZHUoc2VsZi0+bGFwLCBzZWxmLT5kbHNhcF9zZWwsCisJCQkJICAgc2VsZi0+c2xzYXBfc2VsLCBDT05ORUNUX0NNRCwgdHhfc2tiKTsKKwkJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgaXJsYXBfZGF0YV9yZXF1ZXN0KCkuICovCisJCWRldl9rZnJlZV9za2IodHhfc2tiKTsKKworCQlpcmxtcF9uZXh0X2xzYXBfc3RhdGUoc2VsZiwgTFNBUF9TRVRVUCk7CisJCWJyZWFrOworCWNhc2UgTE1fV0FUQ0hET0dfVElNRU9VVDoKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSA6IFdBVENIRE9HX1RJTUVPVVQgIVxuIiwgIF9fRlVOQ1RJT05fXyk7CisKKwkJSVJEQV9BU1NFUlQoc2VsZi0+bGFwICE9IE5VTEwsIHJldHVybiAtMTspOworCQlpcmxtcF9kb19sYXBfZXZlbnQoc2VsZi0+bGFwLCBMTV9MQVBfRElTQ09OTkVDVF9SRVFVRVNULCBOVUxMKTsKKwkJaXJsbXBfbmV4dF9sc2FwX3N0YXRlKHNlbGYsIExTQVBfRElTQ09OTkVDVEVEKTsKKworCQlpcmxtcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgTE1fQ09OTkVDVF9GQUlMVVJFLCBOVUxMKTsKKwkJYnJlYWs7CisJY2FzZSBMTV9MQVBfRElTQ09OTkVDVF9JTkRJQ0FUSU9OOiAvKiBMU19EaXNjb25uZWN0LmluZGljYXRpb24gKi8KKwkJZGVsX3RpbWVyKCAmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOworCisJCWlybG1wX25leHRfbHNhcF9zdGF0ZShzZWxmLCBMU0FQX0RJU0NPTk5FQ1RFRCk7CisKKwkJcmVhc29uID0gaXJsbXBfY29udmVydF9sYXBfcmVhc29uKHNlbGYtPmxhcC0+cmVhc29uKTsKKworCQlpcmxtcF9kaXNjb25uZWN0X2luZGljYXRpb24oc2VsZiwgcmVhc29uLCBOVUxMKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVW5rbm93biBldmVudCAlcyBvbiBMU0FQICUjMDJ4XG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBpcmxtcF9ldmVudFtldmVudF0sIHNlbGYtPnNsc2FwX3NlbCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsbXBfZnJhbWUuYyBiL25ldC9pcmRhL2lybG1wX2ZyYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFjZDI2OAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lybG1wX2ZyYW1lLmMKQEAgLTAsMCArMSw0OTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgaXJsbXBfZnJhbWUuYworICogVmVyc2lvbjogICAgICAgMC45CisgKiBEZXNjcmlwdGlvbjogICBJckxNUCBmcmFtZSBpbXBsZW1lbnRhdGlvbgorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgVHVlIEF1ZyAxOSAwMjowOTo1OSAxOTk3CisgKiBNb2RpZmllZCBhdDogICBNb24gRGVjIDEzIDEzOjQxOjEyIDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4KKyAqICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvdGltZXIuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wX2ZyYW1lLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvZGlzY292ZXJ5Lmg+CisKK3N0YXRpYyBzdHJ1Y3QgbHNhcF9jYiAqaXJsbXBfZmluZF9sc2FwKHN0cnVjdCBsYXBfY2IgKnNlbGYsIF9fdTggZGxzYXAsIAorCQkJCSAgICAgICBfX3U4IHNsc2FwLCBpbnQgc3RhdHVzLCBoYXNoYmluX3QgKik7CisKK2lubGluZSB2b2lkIGlybG1wX3NlbmRfZGF0YV9wZHUoc3RydWN0IGxhcF9jYiAqc2VsZiwgX191OCBkbHNhcCwgX191OCBzbHNhcCwKKwkJCQlpbnQgZXhwZWRpdGVkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNrYi0+ZGF0YVswXSA9IGRsc2FwOworCXNrYi0+ZGF0YVsxXSA9IHNsc2FwOworCisJaWYgKGV4cGVkaXRlZCkgeworCQlJUkRBX0RFQlVHKDQsICIlcygpLCBzZW5kaW5nIGV4cGVkaXRlZCBkYXRhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlpcmxhcF9kYXRhX3JlcXVlc3Qoc2VsZi0+aXJsYXAsIHNrYiwgVFJVRSk7CisJfSBlbHNlCisJCWlybGFwX2RhdGFfcmVxdWVzdChzZWxmLT5pcmxhcCwgc2tiLCBGQUxTRSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9zZW5kX2xjZl9wZHUgKGRsc2FwLCBzbHNhcCwgb3Bjb2RlLHNrYikKKyAqCisgKiAgICBTZW5kIExpbmsgQ29udHJvbCBGcmFtZSB0byBJckxBUAorICovCit2b2lkIGlybG1wX3NlbmRfbGNmX3BkdShzdHJ1Y3QgbGFwX2NiICpzZWxmLCBfX3U4IGRsc2FwLCBfX3U4IHNsc2FwLAorCQkJX191OCBvcGNvZGUsIHN0cnVjdCBza19idWZmICpza2IpIAoreworCV9fdTggKmZyYW1lOworCQorCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MQVBfTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKKwkKKwlmcmFtZSA9IHNrYi0+ZGF0YTsKKwkKKwlmcmFtZVswXSA9IGRsc2FwIHwgQ09OVFJPTF9CSVQ7CisJZnJhbWVbMV0gPSBzbHNhcDsKKworCWZyYW1lWzJdID0gb3Bjb2RlOworCisJaWYgKG9wY29kZSA9PSBESVNDT05ORUNUKQorCQlmcmFtZVszXSA9IDB4MDE7IC8qIFNlcnZpY2UgdXNlciByZXF1ZXN0ICovCisJZWxzZQorCQlmcmFtZVszXSA9IDB4MDA7IC8qIHJzdmQgKi8KKworCWlybGFwX2RhdGFfcmVxdWVzdChzZWxmLT5pcmxhcCwgc2tiLCBGQUxTRSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9pbnB1dCAoc2tiKQorICoKKyAqICAgIFVzZWQgYnkgSXJMQVAgdG8gcGFzcyByZWNlaXZlZCBkYXRhIGZyYW1lcyB0byBJckxNUCBsYXllcgorICoKKyAqLwordm9pZCBpcmxtcF9saW5rX2RhdGFfaW5kaWNhdGlvbihzdHJ1Y3QgbGFwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAKKwkJCQlpbnQgdW5yZWxpYWJsZSkKK3sKKwlzdHJ1Y3QgbHNhcF9jYiAqbHNhcDsKKwlfX3U4ICAgc2xzYXBfc2VsOyAgIC8qIFNvdXJjZSAodGhpcykgTFNBUCBhZGRyZXNzICovCisJX191OCAgIGRsc2FwX3NlbDsgICAvKiBEZXN0aW5hdGlvbiBMU0FQIGFkZHJlc3MgKi8KKwlfX3U4ICAgKmZwOworCQorCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MQVBfTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNrYi0+bGVuID4gMiwgcmV0dXJuOyk7CisKKwlmcCA9IHNrYi0+ZGF0YTsKKworCS8qCisJICogIFRoZSBuZXh0IHN0YXRlbWVudHMgbWF5IGJlIGNvbmZ1c2luZywgYnV0IHdlIGRvIHRoaXMgc28gdGhhdCAKKwkgKiAgZGVzdGluYXRpb24gTFNBUCBvZiByZWNlaXZlZCBmcmFtZSBpcyBzb3VyY2UgTFNBUCBpbiBvdXIgdmlldworCSAqLworCXNsc2FwX3NlbCA9IGZwWzBdICYgTFNBUF9NQVNLOyAKKwlkbHNhcF9zZWwgPSBmcFsxXTsJCisKKwkvKgorCSAqICBDaGVjayBpZiB0aGlzIGlzIGFuIGluY29taW5nIGNvbm5lY3Rpb24sIHNpbmNlIHdlIG11c3QgZGVhbCB3aXRoCisJICogIGl0IGluIGEgZGlmZmVyZW50IHdheSB0aGFuIG90aGVyIGVzdGFibGlzaGVkIGNvbm5lY3Rpb25zLgorCSAqLworCWlmICgoZnBbMF0gJiBDT05UUk9MX0JJVCkgJiYgKGZwWzJdID09IENPTk5FQ1RfQ01EKSkgeworCQlJUkRBX0RFQlVHKDMsICIlcygpLCBpbmNvbWluZyBjb25uZWN0aW9uLCAiCisJCQkgICAic291cmNlIExTQVA9JWQsIGRlc3QgTFNBUD0lZFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgc2xzYXBfc2VsLCBkbHNhcF9zZWwpOworCQkKKwkJLyogVHJ5IHRvIGZpbmQgTFNBUCBhbW9uZyB0aGUgdW5jb25uZWN0ZWQgTFNBUHMgKi8KKwkJbHNhcCA9IGlybG1wX2ZpbmRfbHNhcChzZWxmLCBkbHNhcF9zZWwsIHNsc2FwX3NlbCwgQ09OTkVDVF9DTUQsCisJCQkJICAgICAgIGlybG1wLT51bmNvbm5lY3RlZF9sc2Fwcyk7CisJCQorCQkvKiBNYXliZSBMU0FQIHdhcyBhbHJlYWR5IGNvbm5lY3RlZCwgc28gdHJ5IG9uZSBtb3JlIHRpbWUgKi8KKwkJaWYgKCFsc2FwKSB7CisJCQlJUkRBX0RFQlVHKDEsICIlcygpLCBpbmNvbWluZyBjb25uZWN0aW9uIGZvciBMU0FQIGFscmVhZHkgY29ubmVjdGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJbHNhcCA9IGlybG1wX2ZpbmRfbHNhcChzZWxmLCBkbHNhcF9zZWwsIHNsc2FwX3NlbCwgMCwKKwkJCQkJICAgICAgIHNlbGYtPmxzYXBzKTsKKwkJfQorCX0gZWxzZQorCQlsc2FwID0gaXJsbXBfZmluZF9sc2FwKHNlbGYsIGRsc2FwX3NlbCwgc2xzYXBfc2VsLCAwLCAKKwkJCQkgICAgICAgc2VsZi0+bHNhcHMpOworCQorCWlmIChsc2FwID09IE5VTEwpIHsKKwkJSVJEQV9ERUJVRygyLCAiSXJMTVAsIFNvcnJ5LCBubyBMU0FQIGZvciByZWNlaXZlZCBmcmFtZSFcbiIpOworCQlJUkRBX0RFQlVHKDIsICIlcygpLCBzbHNhcF9zZWwgPSAlMDJ4LCBkbHNhcF9zZWwgPSAlMDJ4XG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBzbHNhcF9zZWwsIGRsc2FwX3NlbCk7CisJCWlmIChmcFswXSAmIENPTlRST0xfQklUKSB7CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCByZWNlaXZlZCBjb250cm9sIGZyYW1lICUwMnhcbiIsCisJCQkJICAgX19GVU5DVElPTl9fLCBmcFsyXSk7CisJCX0gZWxzZSB7CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCByZWNlaXZlZCBkYXRhIGZyYW1lXG4iLCBfX0ZVTkNUSU9OX18pOworCQl9CisJCXJldHVybjsKKwl9CisKKwkvKiAKKwkgKiAgQ2hlY2sgaWYgd2UgcmVjZWl2ZWQgYSBjb250cm9sIGZyYW1lPyAKKwkgKi8KKwlpZiAoZnBbMF0gJiBDT05UUk9MX0JJVCkgeworCQlzd2l0Y2ggKGZwWzJdKSB7CisJCWNhc2UgQ09OTkVDVF9DTUQ6CisJCQlsc2FwLT5sYXAgPSBzZWxmOworCQkJaXJsbXBfZG9fbHNhcF9ldmVudChsc2FwLCBMTV9DT05ORUNUX0lORElDQVRJT04sIHNrYik7CisJCQlicmVhazsKKwkJY2FzZSBDT05ORUNUX0NORjoKKwkJCWlybG1wX2RvX2xzYXBfZXZlbnQobHNhcCwgTE1fQ09OTkVDVF9DT05GSVJNLCBza2IpOworCQkJYnJlYWs7CisJCWNhc2UgRElTQ09OTkVDVDoKKwkJCUlSREFfREVCVUcoNCwgIiVzKCksIERpc2Nvbm5lY3QgaW5kaWNhdGlvbiFcbiIsCisJCQkJICAgX19GVU5DVElPTl9fKTsKKwkJCWlybG1wX2RvX2xzYXBfZXZlbnQobHNhcCwgTE1fRElTQ09OTkVDVF9JTkRJQ0FUSU9OLCAKKwkJCQkJICAgIHNrYik7CisJCQlicmVhazsKKwkJY2FzZSBBQ0NFU1NNT0RFX0NNRDoKKwkJCUlSREFfREVCVUcoMCwgIkFjY2VzcyBtb2RlIGNtZCBub3QgaW1wbGVtZW50ZWQhXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIEFDQ0VTU01PREVfQ05GOgorCQkJSVJEQV9ERUJVRygwLCAiQWNjZXNzIG1vZGUgY25mIG5vdCBpbXBsZW1lbnRlZCFcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVbmtub3duIGNvbnRyb2wgZnJhbWUgJTAyeFxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18sIGZwWzJdKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmICh1bnJlbGlhYmxlKSB7CisJCS8qIE9wdGltaXplIGFuZCBieXBhc3MgdGhlIHN0YXRlIG1hY2hpbmUgaWYgcG9zc2libGUgKi8KKwkJaWYgKGxzYXAtPmxzYXBfc3RhdGUgPT0gTFNBUF9EQVRBX1RSQU5TRkVSX1JFQURZKQorCQkJaXJsbXBfdWRhdGFfaW5kaWNhdGlvbihsc2FwLCBza2IpOworCQllbHNlCisJCQlpcmxtcF9kb19sc2FwX2V2ZW50KGxzYXAsIExNX1VEQVRBX0lORElDQVRJT04sIHNrYik7CisJfSBlbHNlIHsJCisJCS8qIE9wdGltaXplIGFuZCBieXBhc3MgdGhlIHN0YXRlIG1hY2hpbmUgaWYgcG9zc2libGUgKi8KKwkJaWYgKGxzYXAtPmxzYXBfc3RhdGUgPT0gTFNBUF9EQVRBX1RSQU5TRkVSX1JFQURZKQorCQkJaXJsbXBfZGF0YV9pbmRpY2F0aW9uKGxzYXAsIHNrYik7CisJCWVsc2UKKwkJCWlybG1wX2RvX2xzYXBfZXZlbnQobHNhcCwgTE1fREFUQV9JTkRJQ0FUSU9OLCBza2IpOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX2xpbmtfdW5pdGRhdGFfaW5kaWNhdGlvbiAoc2VsZiwgc2tiKQorICoKKyAqICAgIAorICoKKyAqLworI2lmZGVmIENPTkZJR19JUkRBX1VMVFJBCit2b2lkIGlybG1wX2xpbmtfdW5pdGRhdGFfaW5kaWNhdGlvbihzdHJ1Y3QgbGFwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsc2FwX2NiICpsc2FwOworCV9fdTggICBzbHNhcF9zZWw7ICAgLyogU291cmNlICh0aGlzKSBMU0FQIGFkZHJlc3MgKi8KKwlfX3U4ICAgZGxzYXBfc2VsOyAgIC8qIERlc3RpbmF0aW9uIExTQVAgYWRkcmVzcyAqLworCV9fdTggICBwaWQ7ICAgICAgICAgLyogUHJvdG9jb2wgaWRlbnRpZmllciAqLworCV9fdTggICAqZnA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMTVBfTEFQX01BR0lDLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChza2ItPmxlbiA+IDIsIHJldHVybjspOworCisJZnAgPSBza2ItPmRhdGE7CisKKwkvKgorCSAqICBUaGUgbmV4dCBzdGF0ZW1lbnRzIG1heSBiZSBjb25mdXNpbmcsIGJ1dCB3ZSBkbyB0aGlzIHNvIHRoYXQgCisJICogIGRlc3RpbmF0aW9uIExTQVAgb2YgcmVjZWl2ZWQgZnJhbWUgaXMgc291cmNlIExTQVAgaW4gb3VyIHZpZXcKKwkgKi8KKwlzbHNhcF9zZWwgPSBmcFswXSAmIExTQVBfTUFTSzsgCisJZGxzYXBfc2VsID0gZnBbMV07CisJcGlkICAgICAgID0gZnBbMl07CisJCisJaWYgKHBpZCAmIDB4ODApIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgZXh0ZW5zaW9uIGluIFBJRCBub3Qgc3VwcCFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJLyogQ2hlY2sgaWYgZnJhbWUgaXMgYWRkcmVzc2VkIHRvIHRoZSBjb25uZWN0aW9ubGVzcyBMU0FQICovCisJaWYgKChzbHNhcF9zZWwgIT0gTFNBUF9DT05OTEVTUykgfHwgKGRsc2FwX3NlbCAhPSBMU0FQX0NPTk5MRVNTKSkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBkcm9wcGluZyBmcmFtZSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisJCisJLyogU2VhcmNoIHRoZSBjb25uZWN0aW9ubGVzcyBMU0FQICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlybG1wLT51bmNvbm5lY3RlZF9sc2Fwcy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKwlsc2FwID0gKHN0cnVjdCBsc2FwX2NiICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGlybG1wLT51bmNvbm5lY3RlZF9sc2Fwcyk7CisJd2hpbGUgKGxzYXAgIT0gTlVMTCkgeworCQkvKgorCQkgKiAgQ2hlY2sgaWYgc291cmNlIExTQVAgYW5kIGRlc3QgTFNBUCBzZWxlY3RvcnMgYW5kIFBJRCBtYXRjaC4KKwkJICovCisJCWlmICgobHNhcC0+c2xzYXBfc2VsID09IHNsc2FwX3NlbCkgJiYgCisJCSAgICAobHNhcC0+ZGxzYXBfc2VsID09IGRsc2FwX3NlbCkgJiYgCisJCSAgICAobHNhcC0+cGlkID09IHBpZCkpIAorCQl7CQkJCisJCQlicmVhazsKKwkJfQorCQlsc2FwID0gKHN0cnVjdCBsc2FwX2NiICopIGhhc2hiaW5fZ2V0X25leHQoaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJsbXAtPnVuY29ubmVjdGVkX2xzYXBzLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCisJaWYgKGxzYXApCisJCWlybG1wX2Nvbm5sZXNzX2RhdGFfaW5kaWNhdGlvbihsc2FwLCBza2IpOworCWVsc2UgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBmb3VuZCBubyBtYXRjaGluZyBMU0FQIVxuIiwgX19GVU5DVElPTl9fKTsKKwl9Cit9CisjZW5kaWYgLyogQ09ORklHX0lSREFfVUxUUkEgKi8KKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX2xpbmtfZGlzY29ubmVjdF9pbmRpY2F0aW9uIChyZWFzb24sIHVzZXJkYXRhKQorICoKKyAqICAgIElyTEFQIGhhcyBkaXNjb25uZWN0ZWQgCisgKgorICovCit2b2lkIGlybG1wX2xpbmtfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHN0cnVjdCBsYXBfY2IgKmxhcCwgCisJCQkJICAgICAgc3RydWN0IGlybGFwX2NiICppcmxhcCwgCisJCQkJICAgICAgTEFQX1JFQVNPTiByZWFzb24sIAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKGxhcCAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChsYXAtPm1hZ2ljID09IExNUF9MQVBfTUFHSUMsIHJldHVybjspOworCisJbGFwLT5yZWFzb24gPSByZWFzb247CisJbGFwLT5kYWRkciA9IERFVl9BRERSX0FOWTsKKworICAgICAgICAvKiBGSVhNRTogbXVzdCBkbyBzb21ldGhpbmcgd2l0aCB0aGUgc2tiIGlmIGFueSAqLworCQorCS8qCisJICogIEluZm9ybSBzdGF0aW9uIHN0YXRlIG1hY2hpbmUKKwkgKi8KKwlpcmxtcF9kb19sYXBfZXZlbnQobGFwLCBMTV9MQVBfRElTQ09OTkVDVF9JTkRJQ0FUSU9OLCBOVUxMKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX2xpbmtfY29ubmVjdF9pbmRpY2F0aW9uIChxb3MpCisgKgorICogICAgSW5jb21pbmcgTEFQIGNvbm5lY3Rpb24hCisgKgorICovCit2b2lkIGlybG1wX2xpbmtfY29ubmVjdF9pbmRpY2F0aW9uKHN0cnVjdCBsYXBfY2IgKnNlbGYsIF9fdTMyIHNhZGRyLCAKKwkJCQkgICBfX3UzMiBkYWRkciwgc3RydWN0IHFvc19pbmZvICpxb3MsCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIENvcHkgUW9TIHNldHRpbmdzIGZvciB0aGlzIHNlc3Npb24gKi8KKwlzZWxmLT5xb3MgPSBxb3M7CisKKwkvKiBVcGRhdGUgZGVzdGluYXRpb24gZGV2aWNlIGFkZHJlc3MgKi8KKwlzZWxmLT5kYWRkciA9IGRhZGRyOworCUlSREFfQVNTRVJUKHNlbGYtPnNhZGRyID09IHNhZGRyLCByZXR1cm47KTsKKworCWlybG1wX2RvX2xhcF9ldmVudChzZWxmLCBMTV9MQVBfQ09OTkVDVF9JTkRJQ0FUSU9OLCBza2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJsbXBfbGlua19jb25uZWN0X2NvbmZpcm0gKHFvcykKKyAqCisgKiAgICBMQVAgY29ubmVjdGlvbiBjb25maXJtZWQhCisgKgorICovCit2b2lkIGlybG1wX2xpbmtfY29ubmVjdF9jb25maXJtKHN0cnVjdCBsYXBfY2IgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zLCAKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MQVBfTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKHFvcyAhPSBOVUxMLCByZXR1cm47KTsKKworCS8qIERvbid0IG5lZWQgdXNlIHRoZSBza2IgZm9yIG5vdyAqLworCisJLyogQ29weSBRb1Mgc2V0dGluZ3MgZm9yIHRoaXMgc2Vzc2lvbiAqLworCXNlbGYtPnFvcyA9IHFvczsKKworCWlybG1wX2RvX2xhcF9ldmVudChzZWxmLCBMTV9MQVBfQ09OTkVDVF9DT05GSVJNLCBOVUxMKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX2xpbmtfZGlzY292ZXJ5X2luZGljYXRpb24gKHNlbGYsIGxvZykKKyAqCisgKiAgICBEZXZpY2UgaXMgZGlzY292ZXJpbmcgdXMKKyAqCisgKiBJdCdzIG5vdCBhbiBhbnN3ZXIgdG8gb3VyIG93biBkaXNjb3ZlcmllcywganVzdCBhbm90aGVyIGRldmljZSB0cnlpbmcKKyAqIHRvIHBlcmZvcm0gZGlzY292ZXJ5LCBidXQgd2UgZG9uJ3Qgd2FudCB0byBtaXNzIHRoZSBvcHBvcnR1bml0eQorICogdG8gZXhwbG9pdCB0aGlzIGluZm9ybWF0aW9uLCBiZWNhdXNlIDoKKyAqCW8gV2UgbWF5IG5vdCBhY3RpdmVseSBwZXJmb3JtIGRpc2NvdmVyeSAoanVzdCBwYXNzaXZlIGRpc2NvdmVyeSkKKyAqCW8gVGhpcyB0eXBlIG9mIGRpc2NvdmVyeSBpcyBtdWNoIG1vcmUgcmVsaWFibGUuIEluIHNvbWUgY2FzZXMsIGl0CisgKgkgIHNlZW0gdGhhdCBsZXNzIHRoYW4gNTAlIG9mIG91ciBkaXNjb3ZlcmllcyBnZXQgYW4gYW5zd2VyLCB3aGlsZQorICoJICB3ZSBhbHdheXMgZ2V0IH4xMDAlIG9mIHRoZXNlLgorICoJbyBNYWtlIGZhc3RlciBkaXNjb3ZlcnksIHN0YXRpc3RpY2FsbHkgZGl2aWRlIHRpbWUgb2YgZGlzY292ZXJ5CisgKgkgIGV2ZW50cyBieSAyIChpbXBvcnRhbnQgZm9yIHRoZSBsYXRlbmN5IGFzcGVjdCBhbmQgdXNlciBmZWVsKQorICoJbyBFdmVuIGlzIHdlIGRvIGFjdGl2ZSBkaXNjb3ZlcnksIHRoZSBvdGhlciBub2RlIG1pZ2h0IG5vdAorICoJICBhbnN3ZXIgb3VyIGRpc2NvdmVyaWVzIChleDogUGFsbSkuIFRoZSBQYWxtIHdpbGwganVzdCBwZXJmb3JtCisgKgkgIG9uZSBhY3RpdmUgZGlzY292ZXJ5IGFuZCBjb25uZWN0IGRpcmVjdGx5IHRvIHVzLgorICoKKyAqIEhvd2V2ZXIsIHdoZW4gYm90aCBkZXZpY2VzIGRpc2NvdmVyIGVhY2ggb3RoZXIsIHRoZXkgbWlnaHQgYXR0ZW1wdCB0bworICogY29ubmVjdCB0byBlYWNoIG90aGVyIGZvbGxvd2luZyB0aGUgZGlzY292ZXJ5IGV2ZW50LCBhbmQgaXQgd291bGQgY3JlYXRlCisgKiBjb2xsaXNpb25zIG9uIHRoZSBtZWRpdW0gKFNOUk0gYmF0dGxlKS4KKyAqIFRoZSAiZml4IiBmb3IgdGhhdCBpcyB0byBkaXNhYmxlIGFsbCBjb25uZWN0aW9uIHJlcXVlc3RzIGluIElyTEFQCisgKiBmb3IgMTAwbXMgYWZ0ZXIgYSBkaXNjb3ZlcnkgaW5kaWNhdGlvbiBieSBzZXR0aW5nIHRoZSBtZWRpYV9idXN5IGZsYWcuCisgKiBQcmV2aW91c2x5LCB3ZSB1c2VkIHRvIHBvc3Rwb25lIHRoZSBldmVudCB3aGljaCB3YXMgcXVpdGUgdWdseS4gTm93CisgKiB0aGF0IElyTEFQIHRha2VzIGNhcmUgb2YgdGhpcyBwcm9ibGVtLCBqdXN0IHBhc3MgdGhlIGV2ZW50IHVwLi4uCisgKgorICogSmVhbiBJSQorICovCit2b2lkIGlybG1wX2xpbmtfZGlzY292ZXJ5X2luZGljYXRpb24oc3RydWN0IGxhcF9jYiAqc2VsZiwgCisJCQkJICAgICBkaXNjb3ZlcnlfdCAqZGlzY292ZXJ5KQoreworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTE1QX0xBUF9NQUdJQywgcmV0dXJuOyk7CisKKwkvKiBBZGQgdG8gbWFpbiBsb2csIGNsZWFudXAgKi8KKwlpcmxtcF9hZGRfZGlzY292ZXJ5KGlybG1wLT5jYWNoZWxvZywgZGlzY292ZXJ5KTsKKwkKKwkvKiBKdXN0IGhhbmRsZSBpdCB0aGUgc2FtZSB3YXkgYXMgYSBkaXNjb3ZlcnkgY29uZmlybSwKKwkgKiBieXBhc3MgdGhlIExNX0xBUCBzdGF0ZSBtYWNoaW5lIChzZWUgYmVsb3cpICovCisJaXJsbXBfZGlzY292ZXJ5X2NvbmZpcm0oaXJsbXAtPmNhY2hlbG9nLCBESVNDT1ZFUllfUEFTU0lWRSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxtcF9saW5rX2Rpc2NvdmVyeV9jb25maXJtIChzZWxmLCBsb2cpCisgKgorICogICAgQ2FsbGVkIGJ5IElyTEFQIHdpdGggYSBsaXN0IG9mIGRpc2NvdmVyaWVzIGFmdGVyIHRoZSBkaXNjb3ZlcnkKKyAqICAgIHJlcXVlc3QgaGFzIGJlZW4gY2FycmllZCBvdXQuIEEgTlVMTCBsb2cgaXMgcmVjZWl2ZWQgaWYgSXJMQVAKKyAqICAgIHdhcyB1bmFibGUgdG8gY2Fycnkgb3V0IHRoZSBkaXNjb3ZlcnkgcmVxdWVzdAorICoKKyAqLwordm9pZCBpcmxtcF9saW5rX2Rpc2NvdmVyeV9jb25maXJtKHN0cnVjdCBsYXBfY2IgKnNlbGYsIGhhc2hiaW5fdCAqbG9nKQoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExNUF9MQVBfTUFHSUMsIHJldHVybjspOworCQorCS8qIEFkZCB0byBtYWluIGxvZywgY2xlYW51cCAqLworCWlybG1wX2FkZF9kaXNjb3ZlcnlfbG9nKGlybG1wLT5jYWNoZWxvZywgbG9nKTsKKworCS8qIFByb3BhZ2F0ZSBldmVudCB0byB2YXJpb3VzIExTQVBzIHJlZ2lzdGVyZWQgZm9yIGl0LgorCSAqIFdlIGJ5cGFzcyB0aGUgTE1fTEFQIHN0YXRlIG1hY2hpbmUgYmVjYXVzZQorCSAqCTEpIFdlIGRvIGl0IHJlZ2FyZGxlc3Mgb2YgdGhlIExNX0xBUCBzdGF0ZQorCSAqCTIpIEl0IGRvZXNuJ3QgYWZmZWN0IHRoZSBMTV9MQVAgc3RhdGUKKwkgKgkzKSBGYXN0ZXIsIHNsaW1lciwgc2ltcGxlciwgLi4uCisJICogSmVhbiBJSSAqLworCWlybG1wX2Rpc2NvdmVyeV9jb25maXJtKGlybG1wLT5jYWNoZWxvZywgRElTQ09WRVJZX0FDVElWRSk7Cit9CisKKyNpZmRlZiBDT05GSUdfSVJEQV9DQUNIRV9MQVNUX0xTQVAKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcmxtcF91cGRhdGVfY2FjaGUoc3RydWN0IGxhcF9jYiAqbGFwLAorCQkJCSAgICAgIHN0cnVjdCBsc2FwX2NiICpsc2FwKQoreworCS8qIFByZXZlbnQgY29uY3VycmVudCByZWFkIHRvIGdldCBnYXJiYWdlICovCisJbGFwLT5jYWNoZS52YWxpZCA9IEZBTFNFOworCS8qIFVwZGF0ZSBjYWNoZSBlbnRyeSAqLworCWxhcC0+Y2FjaGUuZGxzYXBfc2VsID0gbHNhcC0+ZGxzYXBfc2VsOworCWxhcC0+Y2FjaGUuc2xzYXBfc2VsID0gbHNhcC0+c2xzYXBfc2VsOworCWxhcC0+Y2FjaGUubHNhcCA9IGxzYXA7CisJbGFwLT5jYWNoZS52YWxpZCA9IFRSVUU7Cit9CisjZW5kaWYKKworLyoKKyAqIEZ1bmN0aW9uIGlybG1wX2ZpbmRfaGFuZGxlIChzZWxmLCBkbHNhcF9zZWwsIHNsc2FwX3NlbCwgc3RhdHVzLCBxdWV1ZSkKKyAqCisgKiAgICBGaW5kIGhhbmRsZSBhc3NvY2lhdGVkIHdpdGggZGVzdGluYXRpb24gYW5kIHNvdXJjZSBMU0FQCisgKgorICogQW55IElyREEgY29ubmVjdGlvbiAoTFNBUC9UU0FQKSBpcyB1bmlxdWVseSBpZGVudGlmaWVkIGJ5CisgKiAzIHBhcmFtZXRlcnMsIHRoZSBsb2NhbCBsc2FwLCB0aGUgcmVtb3RlIGxzYXAgYW5kIHRoZSByZW1vdGUgYWRkcmVzcy4gCisgKiBXZSBtYXkgaW5pdGlhdGUgbXVsdGlwbGUgY29ubmVjdGlvbnMgdG8gdGhlIHNhbWUgcmVtb3RlIHNlcnZpY2UKKyAqICh0aGV5IHdpbGwgaGF2ZSBkaWZmZXJlbnQgbG9jYWwgbHNhcCksIGEgcmVtb3RlIGRldmljZSBtYXkgaW5pdGlhdGUKKyAqIG11bHRpcGxlIGNvbm5lY3Rpb25zIHRvIHRoZSBzYW1lIGxvY2FsIHNlcnZpY2UgKHRoZXkgd2lsbCBoYXZlCisgKiBkaWZmZXJlbnQgcmVtb3RlIGxzYXApLCBvciBtdWx0aXBsZSBkZXZpY2VzIG1heSBjb25uZWN0IHRvIHRoZSBzYW1lCisgKiBzZXJ2aWNlIGFuZCBtYXkgdXNlIHRoZSBzYW1lIHJlbW90ZSBsc2FwIChhbmQgdGhleSB3aWxsIGhhdmUKKyAqIGRpZmZlcmVudCByZW1vdGUgYWRkcmVzcykuCisgKiBTbywgd2hlcmUgaXMgdGhlIHJlbW90ZSBhZGRyZXNzID8gRWFjaCBMQVAgY29ubmVjdGlvbiBpcyBtYWRlIHdpdGgKKyAqIGEgc2luZ2xlIHJlbW90ZSBkZXZpY2UsIHNvIGltcGx5IGEgc3BlY2lmaWMgcmVtb3RlIGFkZHJlc3MuCisgKiBKZWFuIElJCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbHNhcF9jYiAqaXJsbXBfZmluZF9sc2FwKHN0cnVjdCBsYXBfY2IgKnNlbGYsIF9fdTggZGxzYXBfc2VsLAorCQkJCSAgICAgICBfX3U4IHNsc2FwX3NlbCwgaW50IHN0YXR1cywKKwkJCQkgICAgICAgaGFzaGJpbl90ICpxdWV1ZSkgCit7CisJc3RydWN0IGxzYXBfY2IgKmxzYXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwkvKiAKKwkgKiAgT3B0aW1pemUgZm9yIHRoZSBjb21tb24gY2FzZS4gV2UgYXNzdW1lIHRoYXQgdGhlIGxhc3QgZnJhbWUKKwkgKiAgcmVjZWl2ZWQgaXMgaW4gdGhlIHNhbWUgY29ubmVjdGlvbiBhcyB0aGUgbGFzdCBvbmUsIHNvIGNoZWNrIGluCisJICogIGNhY2hlIGZpcnN0IHRvIGF2b2lkIHRoZSBsaW5lYXIgc2VhcmNoCisJICovCisjaWZkZWYgQ09ORklHX0lSREFfQ0FDSEVfTEFTVF9MU0FQCisJaWYgKChzZWxmLT5jYWNoZS52YWxpZCkgJiYgCisJICAgIChzZWxmLT5jYWNoZS5zbHNhcF9zZWwgPT0gc2xzYXBfc2VsKSAmJiAKKwkgICAgKHNlbGYtPmNhY2hlLmRsc2FwX3NlbCA9PSBkbHNhcF9zZWwpKSAKKwl7CisJCXJldHVybiAoc2VsZi0+Y2FjaGUubHNhcCk7CisJfQorI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWUtPmhiX3NwaW5sb2NrLCBmbGFncyk7CisKKwlsc2FwID0gKHN0cnVjdCBsc2FwX2NiICopIGhhc2hiaW5fZ2V0X2ZpcnN0KHF1ZXVlKTsKKwl3aGlsZSAobHNhcCAhPSBOVUxMKSB7CisJCS8qIAorCQkgKiAgSWYgdGhpcyBpcyBhbiBpbmNvbWluZyBjb25uZWN0aW9uLCB0aGVuIHRoZSBkZXN0aW5hdGlvbiAKKwkJICogIExTQVAgc2VsZWN0b3IgbWF5IGhhdmUgYmVlbiBzcGVjaWZpZWQgYXMgTE1fQU5ZIHNvIHRoYXQgCisJCSAqICBhbnkgY2xpZW50IGNhbiBjb25uZWN0LiBJbiB0aGF0IGNhc2Ugd2Ugb25seSBuZWVkIHRvIGNoZWNrCisJCSAqICBpZiB0aGUgc291cmNlIExTQVAgKGluIG91ciB2aWV3ISkgbWF0Y2ghCisJCSAqLworCQlpZiAoKHN0YXR1cyA9PSBDT05ORUNUX0NNRCkgJiYgCisJCSAgICAobHNhcC0+c2xzYXBfc2VsID09IHNsc2FwX3NlbCkgJiYgICAgICAKKwkJICAgIChsc2FwLT5kbHNhcF9zZWwgPT0gTFNBUF9BTlkpKSB7CisJCQkvKiBUaGlzIGlzIHdoZXJlIHRoZSBkZXN0IGxzYXAgc2VsIGlzIHNldCBvbiBpbmNvbWluZworCQkJICogbHNhcHMgKi8KKwkJCWxzYXAtPmRsc2FwX3NlbCA9IGRsc2FwX3NlbDsKKwkJCWJyZWFrOworCQl9CisJCS8qCisJCSAqICBDaGVjayBpZiBzb3VyY2UgTFNBUCBhbmQgZGVzdCBMU0FQIHNlbGVjdG9ycyBtYXRjaC4KKwkJICovCisJCWlmICgobHNhcC0+c2xzYXBfc2VsID09IHNsc2FwX3NlbCkgJiYgCisJCSAgICAobHNhcC0+ZGxzYXBfc2VsID09IGRsc2FwX3NlbCkpIAorCQkJYnJlYWs7CisKKwkJbHNhcCA9IChzdHJ1Y3QgbHNhcF9jYiAqKSBoYXNoYmluX2dldF9uZXh0KHF1ZXVlKTsKKwl9CisjaWZkZWYgQ09ORklHX0lSREFfQ0FDSEVfTEFTVF9MU0FQCisJaWYobHNhcCkKKwkJaXJsbXBfdXBkYXRlX2NhY2hlKHNlbGYsIGxzYXApOworI2VuZGlmCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUtPmhiX3NwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBSZXR1cm4gd2hhdCB3ZSd2ZSBmb3VuZCBvciBOVUxMICovCisJcmV0dXJuIGxzYXA7Cit9CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcm1vZC5jIGIvbmV0L2lyZGEvaXJtb2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmZhZWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJtb2QuYwpAQCAtMCwwICsxLDE4NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBpcm1vZC5jCisgKiBWZXJzaW9uOiAgICAgICAwLjkKKyAqIERlc2NyaXB0aW9uOiAgIElyREEgc3RhY2sgbWFpbiBlbnRyeSBwb2ludHMKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIE1vbiBEZWMgMTUgMTM6NTU6MzkgMTk5NworICogTW9kaWZpZWQgYXQ6ICAgV2VkIEphbiAgNSAxNToxMjo0MSAyMDAwCisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTcsIDE5OTktMjAwMCBEYWcgQnJhdHRsaSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CisgKiAgICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgCisgKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAorICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFpbiBlbnRyeSBwb2ludHMgb2YgdGhlIElyREEgc3RhY2suCisgKiBUaGV5IGFyZSBpbiB0aGlzIGZpbGUgYW5kIG5vdCBhZl9pcmRhLmMgYmVjYXVzZSBzb21lIGRldmVsb3BwZXJzCisgKiBhcmUgdXNpbmcgdGhlIElyREEgc3RhY2sgd2l0aG91dCB0aGUgc29ja2V0IEFQSSAoY29tcGlsaW5nIG91dAorICogYWZfaXJkYS5jKS4KKyAqIEplYW4gSUkKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcm1vZC5oPgkJLyogbm90aWZ5X3QgKi8KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhcC5oPgkJLyogaXJsYXBfaW5pdCAqLworI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CQkvKiBpcmxtcF9pbml0ICovCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXAuaD4JCS8qIGlyaWFwX2luaXQgKi8KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcnR0cC5oPgkJLyogaXJ0dHBfaW5pdCAqLworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CS8qIGlyZGFfZGV2aWNlX2luaXQgKi8KKworLyogaXJwcm9jLmMgKi8KK2V4dGVybiB2b2lkIGlyZGFfcHJvY19yZWdpc3Rlcih2b2lkKTsKK2V4dGVybiB2b2lkIGlyZGFfcHJvY191bnJlZ2lzdGVyKHZvaWQpOworLyogaXJzeXNjdGwuYyAqLworZXh0ZXJuIGludCAgaXJkYV9zeXNjdGxfcmVnaXN0ZXIodm9pZCk7CitleHRlcm4gdm9pZCBpcmRhX3N5c2N0bF91bnJlZ2lzdGVyKHZvaWQpOworLyogYWZfaXJkYS5jICovCitleHRlcm4gaW50ICBpcnNvY2tfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGlyc29ja19jbGVhbnVwKHZvaWQpOworLyogaXJsYXBfZnJhbWUuYyAqLworZXh0ZXJuIGludCAgaXJsYXBfZHJpdmVyX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqLCAKKwkJCSAgICAgc3RydWN0IHBhY2tldF90eXBlICopOworCisvKgorICogTW9kdWxlIHBhcmFtZXRlcnMKKyAqLworI2lmZGVmIENPTkZJR19JUkRBX0RFQlVHCit1bnNpZ25lZCBpbnQgaXJkYV9kZWJ1ZyA9IElSREFfREVCVUdfTEVWRUw7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGlyZGFfZGVidWcsIHVpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIklSREEgZGVidWdnaW5nIGxldmVsIik7CitFWFBPUlRfU1lNQk9MKGlyZGFfZGVidWcpOworI2VuZGlmCisKKy8qIFBhY2tldCB0eXBlIGhhbmRsZXIuCisgKiBUZWxsIHRoZSBrZXJuZWwgaG93IElyREEgcGFja2V0cyBzaG91bGQgYmUgaGFuZGxlZC4KKyAqLworc3RhdGljIHN0cnVjdCBwYWNrZXRfdHlwZSBpcmRhX3BhY2tldF90eXBlID0geworCS50eXBlCT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUkRBKSwKKwkuZnVuYwk9IGlybGFwX2RyaXZlcl9yY3YsCS8qIFBhY2tldCB0eXBlIGhhbmRsZXIgaXJsYXBfZnJhbWUuYyAqLworfTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfbm90aWZ5X2luaXQgKG5vdGlmeSkKKyAqCisgKiAgICBVc2VkIGZvciBpbml0aWFsaXppbmcgdGhlIG5vdGlmeSBzdHJ1Y3R1cmUKKyAqCisgKi8KK3ZvaWQgaXJkYV9ub3RpZnlfaW5pdChub3RpZnlfdCAqbm90aWZ5KQoreworCW5vdGlmeS0+ZGF0YV9pbmRpY2F0aW9uID0gTlVMTDsKKwlub3RpZnktPnVkYXRhX2luZGljYXRpb24gPSBOVUxMOworCW5vdGlmeS0+Y29ubmVjdF9jb25maXJtID0gTlVMTDsKKwlub3RpZnktPmNvbm5lY3RfaW5kaWNhdGlvbiA9IE5VTEw7CisJbm90aWZ5LT5kaXNjb25uZWN0X2luZGljYXRpb24gPSBOVUxMOworCW5vdGlmeS0+Zmxvd19pbmRpY2F0aW9uID0gTlVMTDsKKwlub3RpZnktPnN0YXR1c19pbmRpY2F0aW9uID0gTlVMTDsKKwlub3RpZnktPmluc3RhbmNlID0gTlVMTDsKKwlzdHJsY3B5KG5vdGlmeS0+bmFtZSwgIlVua25vd24iLCBzaXplb2Yobm90aWZ5LT5uYW1lKSk7Cit9CitFWFBPUlRfU1lNQk9MKGlyZGFfbm90aWZ5X2luaXQpOworCisvKgorICogRnVuY3Rpb24gaXJkYV9pbml0ICh2b2lkKQorICoKKyAqICBQcm90b2NvbCBzdGFjayBpbml0aWFsaXNhdGlvbiBlbnRyeSBwb2ludC4KKyAqICBJbml0aWFsaXNlIHRoZSB2YXJpb3VzIGNvbXBvbmVudHMgb2YgdGhlIElyREEgc3RhY2sKKyAqLworc3RhdGljIGludCBfX2luaXQgaXJkYV9pbml0KHZvaWQpCit7CisJSVJEQV9ERUJVRygwLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIExvd2VyIGxheWVyIG9mIHRoZSBzdGFjayAqLworIAlpcmxtcF9pbml0KCk7CisJaXJsYXBfaW5pdCgpOworCQorCS8qIEhpZ2hlciBsYXllcnMgb2YgdGhlIHN0YWNrICovCisJaXJpYXBfaW5pdCgpOworIAlpcnR0cF9pbml0KCk7CisJaXJzb2NrX2luaXQoKTsKKwkKKwkvKiBBZGQgSXJEQSBwYWNrZXQgdHlwZSAoU3RhcnQgcmVjZWl2aW5nIHBhY2tldHMpICovCisgICAgICAgIGRldl9hZGRfcGFjaygmaXJkYV9wYWNrZXRfdHlwZSk7CisKKwkvKiBFeHRlcm5hbCBBUElzICovCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlpcmRhX3Byb2NfcmVnaXN0ZXIoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNDVEwKKwlpcmRhX3N5c2N0bF9yZWdpc3RlcigpOworI2VuZGlmCisKKwkvKiBEcml2ZXIvZG9uZ2xlIHN1cHBvcnQgKi8KKyAJaXJkYV9kZXZpY2VfaW5pdCgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2NsZWFudXAgKHZvaWQpCisgKgorICogIFByb3RvY29sIHN0YWNrIGNsZWFudXAvcmVtb3ZhbCBlbnRyeSBwb2ludC4KKyAqICBDbGVhbnVwIHRoZSB2YXJpb3VzIGNvbXBvbmVudHMgb2YgdGhlIElyREEgc3RhY2sKKyAqLworc3RhdGljIHZvaWQgX19leGl0IGlyZGFfY2xlYW51cCh2b2lkKQoreworCS8qIFJlbW92ZSBFeHRlcm5hbCBBUElzICovCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCWlyZGFfc3lzY3RsX3VucmVnaXN0ZXIoKTsKKyNlbmRpZgkKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCWlyZGFfcHJvY191bnJlZ2lzdGVyKCk7CisjZW5kaWYKKworCS8qIFJlbW92ZSBJckRBIHBhY2tldCB0eXBlIChzdG9wIHJlY2VpdmluZyBwYWNrZXRzKSAqLworICAgICAgICBkZXZfcmVtb3ZlX3BhY2soJmlyZGFfcGFja2V0X3R5cGUpOworCQorCS8qIFJlbW92ZSBoaWdoZXIgbGF5ZXJzICovCisJaXJzb2NrX2NsZWFudXAoKTsKKwlpcnR0cF9jbGVhbnVwKCk7CisJaXJpYXBfY2xlYW51cCgpOworCisJLyogUmVtb3ZlIGxvd2VyIGxheWVycyAqLworCWlyZGFfZGV2aWNlX2NsZWFudXAoKTsKKwlpcmxhcF9jbGVhbnVwKCk7IC8qIE11c3QgYmUgZG9uZSBiZWZvcmUgaXJsbXBfY2xlYW51cCgpISBEQiAqLworCisJLyogUmVtb3ZlIG1pZGRsZSBsYXllciAqLworCWlybG1wX2NsZWFudXAoKTsKK30KKworLyoKKyAqIFRoZSBJckRBIHN0YWNrIG11c3QgYmUgaW5pdGlhbGlzZWQgKmJlZm9yZSogZHJpdmVycyBnZXQgaW5pdGlhbGlzZWQsCisgKiBhbmQgKmJlZm9yZSogaGlnaGVyIHByb3RvY29scyAoSXJMQU4vSXJDT01NL0lyTkVUKSBnZXQgaW5pdGlhbGlzZWQsCisgKiBvdGhlcndpc2UgYmFkIHRoaW5ncyB3aWxsIGhhcHBlbiAoaGFzaGJpbnMgd2lsbCBiZSBOVUxMIGZvciBleGFtcGxlKS4KKyAqIFRob3NlIG1vZHVsZXMgYXJlIGF0IG1vZHVsZV9pbml0KCkvZGV2aWNlX2luaXRjYWxsKCkgbGV2ZWwuCisgKgorICogT24gdGhlIG90aGVyIGhhbmQsIGl0IG5lZWRzIHRvIGJlIGluaXRpYWxpc2VkICphZnRlciogdGhlIGJhc2ljCisgKiBuZXR3b3JraW5nLCB0aGUgL3Byb2MvbmV0IGZpbGVzeXN0ZW0gYW5kIHN5c2N0bCBtb2R1bGUuIFRob3NlIGFyZQorICogY3VycmVudGx5IGluaXRpYWxpc2VkIGluIC4uLi9pbml0L21haW4uYyAoYmVmb3JlIGluaXRjYWxscykuCisgKiBBbHNvLCBJckRBIGRyaXZlcnMgbmVlZHMgdG8gYmUgaW5pdGlhbGlzZWQgKmFmdGVyKiB0aGUgcmFuZG9tIG51bWJlcgorICogZ2VuZXJhdG9yIChtYWluIHN0YWNrIGFuZCBoaWdoZXIgbGF5ZXIgaW5pdCBkb24ndCBuZWVkIGl0IGFueW1vcmUpLgorICoKKyAqIEplYW4gSUkKKyAqLworc3Vic3lzX2luaXRjYWxsKGlyZGFfaW5pdCk7Cittb2R1bGVfZXhpdChpcmRhX2NsZWFudXApOworIAorTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiAmIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVGhlIExpbnV4IElyREEgUHJvdG9jb2wgU3RhY2siKTsgCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTkVUUFJPVE8oUEZfSVJEQSk7CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcm5ldC9LY29uZmlnIGIvbmV0L2lyZGEvaXJuZXQvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGM1NTdmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJuZXQvS2NvbmZpZwpAQCAtMCwwICsxLDEzIEBACitjb25maWcgSVJORVQKKwl0cmlzdGF0ZSAiSXJORVQgcHJvdG9jb2wiCisJZGVwZW5kcyBvbiBJUkRBICYmIFBQUAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIElyTkVUIHByb3RvY29sLgorCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgaXJuZXQuICBJck5FVCBpcyBhIFBQUCBkcml2ZXIsIHNvIHlvdSB3aWxsIGFsc28gbmVlZCBhCisJICB3b3JraW5nIFBQUCBzdWJzeXN0ZW0gKGRyaXZlciwgZGFlbW9uIGFuZCBjb25maWcpLi4uCisKKwkgIElyTkVUIGlzIGFuIGFsdGVybmF0ZSB3YXkgdG8gdHJhbnNmZXIgVENQL0lQIHRyYWZmaWMgb3ZlciBJckRBLiAgSXQKKwkgIHVzZXMgc3luY2hyb25vdXMgUFBQIG92ZXIgYSBzZXQgb2YgcG9pbnQgdG8gcG9pbnQgSXJEQSBzb2NrZXRzLiAgWW91CisJICBjYW4gdXNlIGl0IGJldHdlZW4gTGludXggbWFjaGluZSBvciB3aXRoIFcyay4KKwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJuZXQvTWFrZWZpbGUgYi9uZXQvaXJkYS9pcm5ldC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2VlMDFlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJuZXQvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggSXJEQSBJck5FVCBwcm90b2NvbCBsYXllci4KKyMKKworb2JqLSQoQ09ORklHX0lSTkVUKSArPSBpcm5ldC5vCisKK2lybmV0LW9ianMgOj0gaXJuZXRfcHBwLm8gaXJuZXRfaXJkYS5vCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcm5ldC9pcm5ldC5oIGIvbmV0L2lyZGEvaXJuZXQvaXJuZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDA0ZjczCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJuZXQvaXJuZXQuaApAQCAtMCwwICsxLDUyOSBAQAorLyoKKyAqCUlyTkVUIHByb3RvY29sIG1vZHVsZSA6IFN5bmNocm9ub3VzIFBQUCBvdmVyIGFuIElyREEgc29ja2V0LgorICoKKyAqCQlKZWFuIElJIC0gSFBMIGAwMCAtIDxqdEBocGwuaHAuY29tPgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGdsb2JhbCB0byB0aGUgSXJORVQgbW9kdWxlLAorICogYWxsIGdyb3VwZWQgaW4gb25lIHBsYWNlLi4uCisgKiBUaGlzIGZpbGUgaXMgYSAqcHJpdmF0ZSogaGVhZGVyLCBzbyBvdGhlciBtb2R1bGVzIGRvbid0IHdhbnQgdG8ga25vdworICogd2hhdCdzIGluIHRoZXJlLi4uCisgKgorICogTm90ZSA6IGFzIG1vc3QgcGFydCBvZiB0aGUgTGludXgga2VybmVsLCB0aGlzIG1vZHVsZSBpcyBhdmFpbGFibGUKKyAqIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKS4KKyAqLworCisjaWZuZGVmIElSTkVUX0gKKyNkZWZpbmUgSVJORVRfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogRE9DVU1FTlRBVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogV2hhdCBpcyBJck5FVAorICogLS0tLS0tLS0tLS0tLQorICogSXJORVQgaXMgYSBwcm90b2NvbCBhbGxvd2luZyB0byBjYXJyeSBUQ1AvSVAgdHJhZmZpYyBiZXR3ZWVuIHR3bworICogSXJEQSBwZWVycyBpbiBhbiBlZmZpY2llbnQgZmFzaGlvbi4gSXQgaXMgYSB0aGluIGxheWVyLCBwYXNzaW5nIFBQUAorICogcGFja2V0cyB0byBJclRUUCBhbmQgdmljZSB2ZXJzYS4gSXQgdXNlcyBQUFAgaW4gc3luY2hyb25vdXMgbW9kZSwKKyAqIGJlY2F1c2UgSXJUVFAgb2ZmZXIgYSByZWxpYWJsZSBzZXF1ZW5jZWQgcGFja2V0IHNlcnZpY2UgKGFzIG9wcG9zZWQKKyAqIHRvIGEgYnl0ZSBzdHJlYW0pLiBJbiBmYWN0LCB5b3UgY291bGQgc2VlIElyTkVUIGFzIGNhcnJ5aW5nIFRDUC9JUAorICogaW4gYSBJckRBIHNvY2tldCwgdXNpbmcgUFBQIHRvIHByb3ZpZGUgdGhlIGdsdWUuCisgKgorICogVGhlIG1haW4gZGlmZmVyZW5jZSB3aXRoIHRyYWRpdGlvbmFsIFBQUCBvdmVyIElyQ09NTSBpcyB0aGF0IHdlCisgKiBhdm9pZCB0aGUgZnJhbWluZyBhbmQgc2VyaWFsIGVtdWxhdGlvbiB3aGljaCBhcmUgYSBwZXJmb3JtYW5jZQorICogYm90dGxlbmVjay4gSXQgYWxzbyBhbGxvd3MgbXVsdGlwb2ludCBjb21tdW5pY2F0aW9ucyBpbiBhIHNlbnNpYmxlCisgKiBmYXNoaW9uLgorICoKKyAqIFRoZSBtYWluIGRpZmZlcmVuY2Ugd2l0aCBJckxBTiBpcyB0aGF0IHdlIHVzZSBQUFAgZm9yIHRoZSBsaW5rCisgKiBtYW5hZ2VtZW50LCB3aGljaCBpcyBtb3JlIHN0YW5kYXJkLCBpbnRlcm9wZXJhYmxlIGFuZCBmbGV4aWJsZSB0aGFuCisgKiB0aGUgSXJMQU4gcHJvdG9jb2wuIEZvciBleGFtcGxlLCBQUFAgYWRkcyBhdXRoZW50aWNhdGlvbiwKKyAqIGVuY3J5cHRpb24sIGNvbXByZXNzaW9uLCBoZWFkZXIgY29tcHJlc3Npb24gYW5kIGF1dG9tYXRlZCByb3V0aW5nCisgKiBzZXR1cC4gQW5kLCBhcyBJck5FVCBsZXQgUFBQIGRvIHRoZSBoYXJkIHdvcmssIHRoZSBpbXBsZW1lbnRhdGlvbgorICogaXMgbXVjaCBzaW1wbGVyIHRoYW4gSXJMQU4uCisgKgorICogVGhlIExpbnV4IGltcGxlbWVudGF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIElyTkVUIGlzIHdyaXR0ZW4gb24gdG9wIG9mIHRoZSBMaW51eC1JckRBIHN0YWNrLCBhbmQgaW50ZXJmYWNlIHdpdGgKKyAqIHRoZSBnZW5lcmljIExpbnV4IFBQUCBkcml2ZXIuIEJlY2F1c2UgSXJORVQgZGVwZW5kIG9uIHJlY2VudAorICogY2hhbmdlcyBvZiB0aGUgUFBQIGRyaXZlciBpbnRlcmZhY2UsIElyTkVUIHdpbGwgd29yayBvbmx5IHdpdGggdmVyeQorICogcmVjZW50IGtlcm5lbCAoMi4zLjk5LXByZTYgYW5kIHVwKS4KKyAqIAorICogVGhlIHByZXNlbnQgaW1wbGVtZW50YXRpb24gb2ZmZXIgdGhlIGZvbGxvd2luZyBmZWF0dXJlcyA6CisgKglvIHNpbXBsZSB1c2VyIGludGVyZmFjZSB1c2luZyBwcHBkCisgKglvIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiAoaW50ZXJmYWNlIGRpcmVjdGx5IHRvIFBQUCBhbmQgSXJUVFApCisgKglvIGFkZHJlc3NpbmcgKHlvdSBjYW4gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgSXJORVQgcmVjaXBpZW50KQorICoJbyBtdWx0aXBvaW50IG9wZXJhdGlvbiAobGltaXRlZCBieSBJckxBUCBzcGVjaWZpY2F0aW9uKQorICoJbyBpbmZvcm1hdGlvbiBpbiAvcHJvYy9uZXQvaXJkYS9pcm5ldAorICoJbyBJck5FVCBldmVudHMgb24gL2Rldi9pcm5ldCAoZm9yIHVzZXIgc3BhY2UgZGFlbW9uKQorICoJbyBJck5FVCBkYWVtb24gKGlybmV0ZCkgdG8gYXV0b21hdGljYWxseSBoYW5kbGUgaW5jb21pbmcgcmVxdWVzdHMKKyAqCW8gV2luZG93cyAyMDAwIGNvbXBhdGliaWxpdHkgKHRlc3RlZCwgYnV0IG5lZWQgbW9yZSB3b3JrKQorICogQ3VycmVudGx5IG1pc3NpbmcgOgorICoJbyBMb3QncyBvZiB0ZXN0aW5nICh0aGF0J3MgeW91ciBqb2IpCisgKglvIENvbm5lY3Rpb24gcmV0cmllcyAobWF5IGJlIHRvbyBoYXJkIHRvIGRvKQorICoJbyBDaGVjayBwcHBkIHBlcnNpc3QgbW9kZQorICoJbyBVc2VyIHNwYWNlIGRhZW1vbiAodG8gYXV0b21hdGljYWxseSBoYW5kbGUgaW5jb21pbmcgcmVxdWVzdHMpCisgKgorICogVGhlIHNldHVwIGlzIG5vdCBjdXJyZW50bHkgdGhlIG1vc3QgZWFzeSwgYnV0IHRoaXMgc2hvdWxkIGdldCBtdWNoCisgKiBiZXR0ZXIgd2hlbiBldmVyeXRoaW5nIHdpbGwgZ2V0IGludGVncmF0ZWQuLi4KKyAqCisgKiBBY2tub3dsZWRnZW1lbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tCisgKiBUaGlzIG1vZHVsZSBpcyBiYXNlZCBvbiA6CisgKglvIFRoZSBQUFAgZHJpdmVyIChwcHBfc3luY3R0eS9wcHBfZ2VuZXJpYykgYnkgUGF1bCBNYWNrZXJyYXMKKyAqCW8gVGhlIElyTEFOIHByb3RvY29sIChpcmxhbl9jb21tb24vWFhYKSBieSBEYWcgQnJhdHRsaQorICoJbyBUaGUgSXJTb2NrIGludGVyZmFjZSAoYWZfaXJkYSkgYnkgRGFnIEJyYXR0bGkKKyAqCW8gU29tZSBvdGhlciBiaXRzIGZyb20gdGhlIGtlcm5lbCBhbmQgbXkgZHJpdmVycy4uLgorICogSW5maW5pdGUgdGhhbmtzIHRvIHRob3NlIGJyYXZlIHNvdWxzIGZvciBwcm92aWRpbmcgdGhlIGluZnJhc3RydWN0dXJlCisgKiB1cG9uIHdoaWNoIElyTkVUIGlzIGJ1aWx0LgorICoKKyAqIFRoYW5rcyB0byBhbGwgbXkgY29sbGVndWVzIGluIEhQIGZvciBoZWxwaW5nIG1lLiBJbiBwYXJ0aWN1bGFyLAorICogdGhhbmtzIHRvIFNhbGlsIFByYWRoYW4gYW5kIEJpbGwgU2VycmEgZm9yIFcyayB0ZXN0aW5nLi4uCisgKiBUaGFua3MgdG8gTHVpeiBNYWdhbGhhZXMgZm9yIGlybmV0ZCBhbmQgbXVjaCB0ZXN0aW5nLi4uCisgKgorICogVGhhbmtzIHRvIEFsYW4gQ294IGZvciBhbnN3ZXJpbmcgbG90J3Mgb2YgbXkgc3R1cGlkIHF1ZXN0aW9ucywgYW5kCisgKiB0byBQYXVsIE1hY2tlcnJhcyBhbnN3ZXJpbmcgbXkgcXVlc3Rpb25zIG9uIGhvdyB0byBiZXN0IGludGVncmF0ZQorICogSXJORVQgYW5kIHBwcGQuCisgKgorICogSmVhbiBJSQorICoKKyAqIE5vdGUgb24gc29tZSBpbXBsZW1lbnRhdGlvbnMgY2hvaWNlcy4uLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgkxKSBEaXJlY3QgaW50ZXJmYWNlIHZzIHR0eS9zb2NrZXQKKyAqIEkgY291bGQgaGF2ZSB1c2VkIGEgdHR5IGludGVyZmFjZSB0byBob29rIHRvIHBwcCBhbmQgdXNlIHRoZSBmdWxsCisgKiBzb2NrZXQgQVBJIHRvIGNvbm5lY3QgdG8gSXJEQS4gVGhlIGNvZGUgd291bGQgaGF2ZSBiZWVuIGVhc2llciB0bworICogbWFpbnRhaW4sIGFuZCBtYXliZSB0aGUgY29kZSB3b3VsZCBoYXZlIGJlZW4gc21hbGxlci4uLgorICogSW5zdGVhZCwgd2UgaG9vayBkaXJlY3RseSB0byBwcHBfZ2VuZXJpYyBhbmQgdG8gSXJUVFAsIHdoaWNoIG1ha2UKKyAqIHRoaW5ncyBtb3JlIGNvbXBsaWNhdGVkLi4uCisgKgorICogVGhlIGZpcnN0IHJlYXNvbiBpcyBmbGV4aWJpbGl0eSA6IHRoaXMgYWxsb3cgdXMgdG8gY3JlYXRlIElyTkVUCisgKiBpbnN0YW5jZXMgb24gZGVtYW5kIChubyAvZGV2L2lyY29tbVggY3JhcCkgYW5kIHRvIGFsbG93IGxpbmtuYW1lCisgKiBzcGVjaWZpY2F0aW9uIG9uIHBwcGQgY29tbWFuZCBsaW5lLi4uCisgKgorICogU2Vjb25kIHJlYXNvbiBpcyBzcGVlZCBvcHRpbWlzYXRpb24uIElmIHlvdSBsb29rIGNsb3NlbHkgYXQgdGhlCisgKiB0cmFuc21pdCBhbmQgcmVjZWl2ZSBwYXRocywgeW91IHdpbGwgbm90aWNlIHRoYXQgdGhleSBhcmUgInN1cGVyIGxlYW4iCisgKiAodGhhdCdzIHdoeSB0aGV5IGxvb2sgdWdseSksIHdpdGggbm8gZnVuY3Rpb24gY2FsbHMgYW5kIGFzIGxpdHRsZSBkYXRhCisgKiBjb3B5IGFuZCBtb2RpZmljYXRpb24gYXMgSSBjb3VsZC4uLgorICoKKyAqCTIpIGlybmV0ZCBpbiB1c2VyIHNwYWNlCisgKiBpcm5ldGQgaXMgaW1wbGVtZW50ZWQgaW4gdXNlciBzcGFjZSwgd2hpY2ggaXMgbmVjZXNzYXJ5IHRvIGNhbGwgcHBwZC4KKyAqIFRoaXMgYWxzbyBnaXZlIG1heGltdW0gYmVuZWZpdHMgaW4gdGVybSBvZiBmbGV4aWJpbGl0eSBhbmQgY3VzdG9tYWJpbGl0eSwKKyAqIGFuZCBhbGxvdyB0byBvZmZlciB0aGUgZXZlbnQgY2hhbm5lbCwgdXNlZnVsIGZvciBvdGhlciBzdHVmZiBsaWtlIGRlYnVnLgorICoKKyAqIE9uIHRoZSBvdGhlciBoYW5kLCB0aGlzIHJlcXVpcmUgYSBsb29zZSBjb29yZGluYXRpb24gYmV0d2VlbiB0aGUKKyAqIHByZXNlbnQgbW9kdWxlIGFuZCBpcm5ldGQuIE9uZSBjcml0aWNhbCBhcmVhIGlzIGhvdyBpbmNvbWluZyByZXF1ZXN0CisgKiBhcmUgaGFuZGxlZC4KKyAqIFdoZW4gaXJuZXQgcmVjZWl2ZSBhbiBpbmNvbWluZyByZXF1ZXN0LCBpdCBzZW5kIGFuIGV2ZW50IHRvIGlybmV0ZCBhbmQKKyAqIGRyb3AgdGhlIGluY29taW5nIElyTkVUIHNvY2tldC4KKyAqIGlybmV0ZCBzdGFydCBhIHBwcGQgaW5zdGFuY2UsIHdoaWNoIGNyZWF0ZSBhIG5ldyBJck5FVCBzb2NrZXQuIFRoaXMgbmV3CisgKiBzb2NrZXQgaXMgdGhlbiBjb25uZWN0ZWQgaW4gdGhlIG9yaWdpbmF0aW5nIG5vZGUgdG8gdGhlIHBwcGQgaW5zdGFuY2UuCisgKiBBdCB0aGlzIHBvaW50LCBpbiB0aGUgb3JpZ2luYXRpbmcgbm9kZSwgdGhlIGZpcnN0IHNvY2tldCBpcyBjbG9zZWQuCisgKgorICogSSBhZG1pdCwgdGhpcyBpcyBhIGJpdCBtZXNzeSBhbmQgd2FzdGUgc29tZSByZXNvdXJjZXMuIFRoZSBhbHRlcm5hdGl2ZQorICogaXMgY2FjaGluZyBpbmNvbWluZyBzb2NrZXQsIGFuZCB0aGF0J3MgYWxzbyBxdWl0ZSBtZXNzeSBhbmQgd2FzdGUKKyAqIHJlc291cmNlcy4KKyAqIFdlIGFsc28gbWFrZSBjb25uZWN0aW9uIHRpbWUgc2xvd2VyLiBGb3IgZXhhbXBsZSwgb24gYSAxMTUga2IvcyBsaW5rIGl0CisgKiBhZGRzIDYwbXMgdG8gdGhlIGNvbm5lY3Rpb24gdGltZSAoNzcwIG1zKS4gSG93ZXZlciwgdGhpcyBpcyBzbG93ZXIgdGhhbgorICogdGhlIHRpbWUgaXQgdGFrZXMgdG8gZmlyZSB1cCBwcHBkIG9uIG15IFAxMzMuLi4KKyAqCisgKgorICogSGlzdG9yeSA6CisgKiAtLS0tLS0tCisgKgorICogdjEgLSAxNS41LjAwIC0gSmVhbiBJSQorICoJbyBCYXNpYyBJck5FVCAoaG9vayB0byBwcHBfZ2VuZXJpYyAmIElyVFRQIC0gaW5jbC4gbXVsdGlwb2ludCkKKyAqCW8gY29udHJvbCBjaGFubmVsIG9uIC9kZXYvaXJuZXQgKHNldCBuYW1lL2FkZHJlc3MpCisgKglvIGV2ZW50IGNoYW5uZWwgb24gL2Rldi9pcm5ldCAoZm9yIHVzZXIgc3BhY2UgZGFlbW9uKQorICoKKyAqIHYyIC0gNS42LjAwIC0gSmVhbiBJSQorICoJbyBFbmFibGUgRFJPUF9OT1RfUkVBRFkgdG8gYXZvaWQgUFBQIHRpbWVvdXRzICYgb3RoZXIgd2VpcmRuZXNzLi4uCisgKglvIEFkZCBESVNDT05ORUNUX1RPIGV2ZW50IGFuZCByZW5hbWUgRElTQ09OTkVDVF9GUk9NLgorICoJbyBTZXQgb2ZmaWNpYWwgZGV2aWNlIG51bWJlciBhbGxvYWN0aW9uIG9uIC9kZXYvaXJuZXQKKyAqCisgKiB2MyAtIDMwLjguMDAgLSBKZWFuIElJCisgKglvIFVwZGF0ZSB0byBsYXRlc3QgTGludXgtSXJEQSBjaGFuZ2VzIDoKKyAqCQktIHF1ZXVlX3QgPT4gaXJkYV9xdWV1ZV90CisgKglvIFVwZGF0ZSB0byBwcHAtMi40LjAgOgorICoJCS0gbW92ZSBpcmRhX2lybmV0X2Nvbm5lY3QgZnJvbSBQUFBJT0NBVFRBQ0ggdG8gVElPQ1NFVEQKKyAqCW8gQWRkIEVYUElSRSBldmVudCAoZGVwZW5kIG9uIG5ldyBJckRBLUxpbnV4IHBhdGNoKQorICoJbyBTd2l0Y2ggZnJvbSBgaGFzaGJpbl9yZW1vdmUnIHRvIGBoYXNoYmluX3JlbW92ZV90aGlzJyB0byBmaXgKKyAqCSAgYSBtdWx0aWxpbmsgYnVnLi4uIChkZXBlbmQgb24gbmV3IElyREEtTGludXggcGF0Y2gpCisgKglvIGZpeCBhIHNlbGYtPmRhZGRyIHRvIHNlbGYtPnJhZGRyIGluIGlyZGFfaXJuZXRfY29ubmVjdCB0byBmaXgKKyAqCSAgYW5vdGhlciBtdWx0aWxpbmsgYnVnIChkYXJuICEpCisgKglvIFJlbW92ZSBMSU5LTkFNRV9JT0NUTCBjcnVmdAorICoKKyAqIHYzYiAtIDMxLjguMDAgLSBKZWFuIElJCisgKglvIER1bXAgZGlzY292ZXJ5IGxvZyBhdCBldmVudCBjaGFubmVsIHN0YXJ0dXAKKyAqCisgKiB2NCAtIDI4LjkuMDAgLSBKZWFuIElJCisgKglvIEZpeCBpbnRlcmFjdGlvbiBiZXR3ZWVuIHBvbGwvc2VsZWN0IGFuZCBkdW1wIGRpc2NvdmVyeSBsb2cKKyAqCW8gQWRkIElSTkVUX0JMT0NLRURfTElOSyBldmVudCAoZGVwZW5kIG9uIG5ldyBJckRBLUxpbnV4IHBhdGNoKQorICoJbyBBZGQgSVJORVRfTk9BTlNXRVJfRlJPTSBldmVudCAobW9zdGx5IHRvIGhlbHAgc3VwcG9ydCkKKyAqCW8gUmVsZWFzZSBmbG93IGNvbnRyb2wgaW4gZGlzY29ubmVjdF9pbmRpY2F0aW9uCisgKglvIEJsb2NrIHBhY2tldHMgd2hpbGUgY29ubmVjdGluZyAoc3BlZWQgdXAgY29ubmVjdGlvbnMpCisgKgorICogdjUgLSAxMS4wMS4wMSAtIEplYW4gSUkKKyAqCW8gSW5pdCBzZWxmLT5tYXhfaGVhZGVyX3NpemUsIGp1c3QgaW4gY2FzZS4uLgorICoJbyBTZXQgdXAgYXAtPmNoYW4uaGRybGVuLCB0byBnZXQgemVybyBjb3B5IG9uIHR4IHNpZGUgd29ya2luZy4KKyAqCW8gYXZvaWQgdHgtPnR0cC0+Zmxvdy0+cHBwLT50eC0+Li4uIGxvb3AsIGJ5IGNoZWNraW5nIGZsb3cgc3RhdGUKKyAqCQlUaGFua3MgdG8gQ2hyaXN0aWFuIEdlbm5lcmF0IGZvciBmaW5kaW5nIHRoaXMgYnVnICEKKyAqCS0tLQorICoJbyBEZWNsYXJlIHRoZSBwcm9wZXIgTVRVL01SVSB0aGF0IHdlIGNhbiBzdXBwb3J0CisgKgkJKGJ1dCBQUFAgZG9lc24ndCByZWFkIHRoZSBNVFUgdmFsdWUgOi0oKQorICoJbyBEZWNsYXJlIGhhc2hiaW4gSEJfTk9MT0NLIGluc3RlYWQgb2YgSEJfTE9DQUwgdG8gYXZvaWQKKyAqCQlkaXNhYmxpbmcgYW5kIGVuYWJsaW5nIGlycSB0d2ljZQorICoKKyAqIHY2IC0gMzEuMDUuMDEgLSBKZWFuIElJCisgKglvIFByaW50IHNvdXJjZSBhZGRyZXNzIGluIEZvdW5kLCBEaXNjb3ZlcnksIEV4cGlyeSAmIFJlcXVlc3QgZXZlbnRzCisgKglvIFByaW50IHJlcXVlc3RlZCBzb3VyY2UgYWRkcmVzcyBpbiAvcHJvYy9uZXQvaXJuZXQKKyAqCW8gQ2hhbmdlIGNvbnRyb2wgY2hhbm5lbCBpbnB1dC4gQWxsb3cgbXVsdGlwbGUgY29tbWFuZHMgaW4gb25lIGxpbmUuCisgKglvIEFkZCBzYWRkciBjb21tYW5kIHRvIGNoYW5nZSBhcC0+cnNhZGRyIChhbmQgdXNlIHRoYXQgaW4gSXJEQSkKKyAqCS0tLQorICoJbyBNYWtlIHRoZSBJckRBIGNvbm5lY3Rpb24gcHJvY2VkdXJlIHRvdGFsbHkgYXN5bmNocm9ub3VzLgorICoJICBIZWF2eSByZXdyaXRlIG9mIHRoZSBJQVMgcXVlcnkgY29kZSBhbmQgdGhlIHdob2xlIGNvbm5lY3Rpb24KKyAqCSAgcHJvY2VkdXJlLiBOb3csIGlybmV0X2Nvbm5lY3QoKSBubyBsb25nZXIgbmVlZCB0byBiZSBjYWxsZWQgZnJvbQorICoJICBhIHByb2Nlc3MgY29udGV4dC4uLgorICoJbyBFbmFibGUgSXJEQSBjb25uZWN0IHJldHJpZXMgaW4gcHBwX2lybmV0X3NlbmQoKS4gVGhlIGdvb2QgdGhpbmcKKyAqCSAgaXMgdGhhdCBJckRBIGNvbm5lY3QgcmV0cmllcyBhcmUgZGlyZWN0bHkgZHJpdmVuIGJ5IFBQUCBMQ1AKKyAqCSAgcmV0cmllcyAod2UgcmV0cnkgZm9yIGVhY2ggTENQIHBhY2tldCksIHNvIHRoYXQgZXZlcnl0aGluZworICoJICBpcyB0cmFuc3BhcmVudGx5IGNvbnRyb2xsZWQgZnJvbSBwcHBkIGxjcC1tYXgtY29uZmlndXJlLgorICoJbyBBZGQgdHRwX2Nvbm5lY3QgZmxhZyB0byBwcmV2ZW50IHJlbnRyeSBvbiB0aGUgY29ubmVjdCBwcm9jZWR1cmUKKyAqCW8gVGVzdCBhbmQgZml4dXBzIHRvIGVsaW1pbmF0ZSBzaWRlIGVmZmVjdHMgb2YgcmV0cmllcworICoKKyAqIHY3IC0gMjIuMDguMDEgLSBKZWFuIElJCisgKglvIENsZWFudXAgOiBDaGFuZ2UgInNhZGRyID0gMHgwIiB0byAic2FkZHIgPSBERVZfQUREUl9BTlkiCisgKglvIEZpeCBidWcgaW4gQkxPQ0tfV0hFTl9DT05ORUNUIGludHJvZHVjZWQgaW4gdjYgOiBkdWUgdG8gdGhlCisgKgkgIGFzeW5jaHJvbm91cyBJQVMgcXVlcnksIHNlbGYtPnRzYXAgaXMgTlVMTCB3aGVuIFBQUCBzZW5kIHRoZQorICoJICBmaXJzdCBwYWNrZXQuICBUaGlzIHdhcyBwcmV2ZW50aW5nICJjb25uZWN0LWRlbGF5IDAiIHRvIHdvcmsuCisgKgkgIENoYW5nZSB0aGUgdGVzdCBpbiBwcHBfaXJuZXRfc2VuZCgpIHRvIHNlbGYtPnR0cF9jb25uZWN0LgorICoKKyAqIHY4IC0gMS4xMS4wMSAtIEplYW4gSUkKKyAqCW8gVGlnaHRlbiB0aGUgdXNlIG9mIHNlbGYtPnR0cF9jb25uZWN0IGFuZCBzZWxmLT50dHBfb3BlbiB0bworICoJICBwcmV2ZW50IHZhcmlvdXMgcmFjZSBjb25kaXRpb25zLgorICoJbyBBdm9pZCBsZWFraW5nIGRpc2NvdmVyeSBsb2cgYW5kIHNrYgorICoJbyBSZXBsYWNlICJzZWxmIiB3aXRoICJzZXJ2ZXIiIGluIGlybmV0X2Nvbm5lY3RfaW5kaWNhdGlvbigpIHRvCisgKgkgIGJldHRlciBkZXRlY3QgY3V0J24ncGFzdGUgZXJyb3IgOy0pCisgKgorICogdjkgLSAyOS4xMS4wMSAtIEplYW4gSUkKKyAqCW8gRml4IGV2ZW50IGdlbmVyYXRpb24gaW4gZGlzY29ubmVjdCBpbmRpY2F0aW9uIHRoYXQgSSBicm9rZSBpbiB2OAorICoJICBJdCB3YXMgYWx3YXlzIGdlbmVyYXRpb24gIk5vLUFuc3dlciIgYmVjYXVzZSBJIHdhcyB0ZXN0aW5nIHR0cF9vcGVuCisgKgkgIGp1c3QgYWZ0ZXIgY2xlYXJpbmcgaXQuICpibHVzaCouCisgKglvIFVzZSBuZXdseSBjcmVhdGVkIGlydHRwX2xpc3RlbigpIHRvIGZpeCBwb3RlbnRpYWwgY3Jhc2ggd2hlbiBMQVAKKyAqCSAgZGVzdHJveWVkIGJlZm9yZSBpcm5ldCBtb2R1bGUgcmVtb3ZlZC4KKyAqCisgKiB2MTAgLSA0LjMuMiAtIEplYW4gSUkKKyAqCW8gV2hlbiByZWNlaXZpbmcgYSBkaXNjb25uZWN0IGluZGljYXRpb24sIGRvbid0IHJlZW5hYmxlIHRoZQorICoJICBQUFAgVHggcXVldWUsIHRoaXMgd2lsbCB0cmlnZ2VyIGEgcmVjb25uZWN0LiBJbnN0ZWFkLCBjbG9zZQorICoJICB0aGUgY2hhbm5lbCwgd2hpY2ggd2lsbCBraWxsIHBwcGQuLi4KKyAqCisgKiB2MTEgLSAyMC4zLjAyIC0gSmVhbiBJSQorICoJbyBPb3BzICEgdjEwIGZpeCBkaXNhYmxlZCBJck5FVCByZXRyaWVzIGFuZCBwYXNzaXZlIGJlaGF2aW91ci4KKyAqCSAgQmV0dGVyIGZpeCBpbiBpcm5ldF9kaXNjb25uZWN0X2luZGljYXRpb24oKSA6CisgKgkgIC0gaWYgY29ubmVjdGVkLCBraWxsIHBwcGQgdmlhIGhhbmd1cC4KKyAqCSAgLSBpZiBub3QgY29ubmVjdGVkLCByZWVuYWJsZSBwcHAgVHgsIHdoaWNoIHRyaWdnZXIgSXJORVQgcmV0cnkuCisgKgorICogdjEyIC0gMTAuNC4wMiAtIEplYW4gSUkKKyAqCW8gRml4IHJhY2UgY29uZGl0aW9uIGluIGlybmV0X2Nvbm5lY3RfaW5kaWNhdGlvbigpLgorICoJICBJZiB0aGUgc29ja2V0IHdhcyBhbHJlYWR5IHRyeWluZyB0byBjb25uZWN0LCBkcm9wIG9sZCBjb25uZWN0aW9uCisgKgkgIGFuZCB1c2UgbmV3IG9uZSBvbmx5IGlmIGFjdGluZyBhcyBwcmltYXJ5LiBTZWUgY29tbWVudHMuCisgKgorICogdjEzIC0gMzAuNS4wMiAtIEplYW4gSUkKKyAqCW8gVXBkYXRlIG1vZHVsZSBpbml0IGNvZGUKKyAqCisgKiB2MTQgLSAyMC4yLjAzIC0gSmVhbiBJSQorICoJbyBBZGQgZGlzY292ZXJ5IGhpbnQgYml0cyBpbiB0aGUgY29udHJvbCBjaGFubmVsLgorICoJbyBSZW1vdmUgb2Jzb2xldGUgTU9EX0lOQy9ERUNfVVNFX0NPVU5UIGluIGZhdm9yIG9mIC5vd25lcgorICoKKyAqIHYxNSAtIDcuNC4wMyAtIEplYW4gSUkKKyAqCW8gUmVwbGFjZSBzcGluX2xvY2tfaXJxc2F2ZSgpIHdpdGggc3Bpbl9sb2NrX2JoKCkgc28gdGhhdCB3ZSBjYW4KKyAqCSAgdXNlIHBwcF91bml0X251bWJlcigpLiBJdCdzIHByb2JhYmx5IGFsc28gYmV0dGVyIG92ZXJhbGwuLi4KKyAqCW8gRGlzYWJsZSBjYWxsIHRvIHBwcF91bnJlZ2lzdGVyX2NoYW5uZWwoKSwgYmVjYXVzZSB3ZSBjYW4ndCBkbyBpdC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5DTFVERVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CS8qIGlzc3BhY2UoKSAqLworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgvcHBwX2RlZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9wcHAuaD4KKyNpbmNsdWRlIDxsaW51eC9wcHBfY2hhbm5lbC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXNfb2JqZWN0Lmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcnR0cC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2Rpc2NvdmVyeS5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogT1BUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBEZWZpbmUgb3IgdW5kZWZpbmUgdG8gY29tcGlsZSBvciBub3Qgc29tZSBvcHRpb25hbCBwYXJ0IG9mIHRoZQorICogSXJORVQgZHJpdmVyLi4uCisgKiBOb3RlIDogdGhlIHByZXNlbnQgZGVmYXVsdHMgbWFrZSBzZW5zZSwgcGxheSB3aXRoIHRoYXQgYXQgeW91cgorICogb3duIHJpc2suLi4KKyAqLworLyogSXJEQSBzaWRlIG9mIHRoZSBidXNpbmVzcy4uLiAqLworI2RlZmluZSBESVNDT1ZFUllfTk9NQVNLCS8qIFRvIGVuYWJsZSBXMmsgY29tcGF0aWJpbGl0eS4uLiAqLworI2RlZmluZSBBRFZFUlRJU0VfSElOVAkJLyogQWR2ZXJ0aXNlIElyTEFOIGhpbnQgYml0ICovCisjZGVmaW5lIEFMTE9XX1NJTVVMVF9DT05ORUNUCS8qIFRoaXMgc2VlbSB0byB3b3JrLCBjcm9zcyBmaW5nZXJzLi4uICovCisjZGVmaW5lIERJU0NPVkVSWV9FVkVOVFMJLyogUXVlcnkgdGhlIGRpc2NvdmVyeSBsb2cgdG8gcG9zdCBldmVudHMgKi8KKyNkZWZpbmUgSU5JVElBTF9ESVNDT1ZFUlkJLyogRHVtcCBjdXJyZW50IGRpc2NvdmVyeSBsb2cgYXMgZXZlbnRzICovCisjdW5kZWYgU1RSRUFNX0NPTVBBVAkJLyogTm90IG5lZWRlZCAtIHBvdGVudGlhbGx5IG1lc3N5ICovCisjdW5kZWYgQ09OTkVDVF9JTkRJQ19LSUNLCS8qIE1pZ2h0IG1lc3MgSXJEQSwgbm90IG5lZWRlZCAqLworI3VuZGVmIEZBSUxfU0VORF9ESVNDT05ORUNUCS8qIE1pZ2h0IG1lc3MgSXJEQSwgbm90IG5lZWRlZCAqLworI3VuZGVmIFBBU1NfQ09OTkVDVF9QQUNLRVRTCS8qIE5vdCBuZWVkZWQgPyBTYWZlICovCisjdW5kZWYgTUlTU0lOR19QUFBfQVBJCQkvKiBTdHVmZiBJIHdpc2ggSSBjb3VsZCBkbyAqLworCisvKiBQUFAgc2lkZSBvZiB0aGUgYnVzaW5lc3MgKi8KKyNkZWZpbmUgQkxPQ0tfV0hFTl9DT05ORUNUCS8qIEJsb2NrIHBhY2tldHMgd2hlbiBjb25uZWN0aW5nICovCisjZGVmaW5lIENPTk5FQ1RfSU5fU0VORAkJLyogUmV0cnkgSXJEQSBjb25uZWN0aW9uIHByb2NlZHVyZSAqLworI3VuZGVmIEZMVVNIX1RPX1BQUAkJLyogTm90IHN1cmUgYWJvdXQgdGhpcyBvbmUsIGxldCdzIHBsYXkgc2FmZSAqLworI3VuZGVmIFNFQ1VSRV9ERVZJUk5FVAkJLyogQmFoLi4uICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogREVCVUcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhpcyBzZXQgb2YgZmxhZ3MgZW5hYmxlIGFuZCBkaXNhYmxlIGFsbCB0aGUgdmFyaW91cyB3YXJuaW5nLAorICogZXJyb3IgYW5kIGRlYnVnIG1lc3NhZ2Ugb2YgdGhpcyBkcml2ZXIuCisgKiBFYWNoIHNlY3Rpb24gY2FuIGJlIGVuYWJsZWQgYW5kIGRpc2FibGVkIGluZGVwZW5kZW50bHkKKyAqLworLyogSW4gdGhlIFBQUCBwYXJ0ICovCisjZGVmaW5lIERFQlVHX0NUUkxfVFJBQ0UJMAkvKiBDb250cm9sIGNoYW5uZWwgKi8KKyNkZWZpbmUgREVCVUdfQ1RSTF9JTkZPCQkwCS8qIHZhcmlvdXMgaW5mbyAqLworI2RlZmluZSBERUJVR19DVFJMX0VSUk9SCTEJLyogcHJvYmxlbXMgKi8KKyNkZWZpbmUgREVCVUdfRlNfVFJBQ0UJCTAJLyogZmlsZXN5c3RlbSBjYWxsYmFja3MgKi8KKyNkZWZpbmUgREVCVUdfRlNfSU5GTwkJMAkvKiB2YXJpb3VzIGluZm8gKi8KKyNkZWZpbmUgREVCVUdfRlNfRVJST1IJCTEJLyogcHJvYmxlbXMgKi8KKyNkZWZpbmUgREVCVUdfUFBQX1RSQUNFCQkwCS8qIFBQUCByZWxhdGVkIGZ1bmN0aW9ucyAqLworI2RlZmluZSBERUJVR19QUFBfSU5GTwkJMAkvKiB2YXJpb3VzIGluZm8gKi8KKyNkZWZpbmUgREVCVUdfUFBQX0VSUk9SCQkxCS8qIHByb2JsZW1zICovCisjZGVmaW5lIERFQlVHX01PRFVMRV9UUkFDRQkwCS8qIG1vZHVsZSBpbnNlcnRpb24vcmVtb3ZhbCAqLworI2RlZmluZSBERUJVR19NT0RVTEVfRVJST1IJMQkvKiBwcm9ibGVtcyAqLworCisvKiBJbiB0aGUgSXJEQSBwYXJ0ICovCisjZGVmaW5lIERFQlVHX0lSREFfU1JfVFJBQ0UJMAkvKiBJUkRBIHN1YnJvdXRpbmVzICovCisjZGVmaW5lIERFQlVHX0lSREFfU1JfSU5GTwkwCS8qIHZhcmlvdXMgaW5mbyAqLworI2RlZmluZSBERUJVR19JUkRBX1NSX0VSUk9SCTEJLyogcHJvYmxlbXMgKi8KKyNkZWZpbmUgREVCVUdfSVJEQV9TT0NLX1RSQUNFCTAJLyogSVJEQSBtYWluIHNvY2tldCBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgREVCVUdfSVJEQV9TT0NLX0lORk8JMAkvKiB2YXJpb3VzIGluZm8gKi8KKyNkZWZpbmUgREVCVUdfSVJEQV9TT0NLX0VSUk9SCTEJLyogcHJvYmxlbXMgKi8KKyNkZWZpbmUgREVCVUdfSVJEQV9TRVJWX1RSQUNFCTAJLyogVGhlIElyTkVUIHNlcnZlciAqLworI2RlZmluZSBERUJVR19JUkRBX1NFUlZfSU5GTwkwCS8qIHZhcmlvdXMgaW5mbyAqLworI2RlZmluZSBERUJVR19JUkRBX1NFUlZfRVJST1IJMQkvKiBwcm9ibGVtcyAqLworI2RlZmluZSBERUJVR19JUkRBX1RDQl9UUkFDRQkwCS8qIElSREEgSXJUVFAgY2FsbGJhY2tzICovCisjZGVmaW5lIERFQlVHX0lSREFfQ0JfSU5GTwkwCS8qIHZhcmlvdXMgaW5mbyAqLworI2RlZmluZSBERUJVR19JUkRBX0NCX0VSUk9SCTEJLyogcHJvYmxlbXMgKi8KKyNkZWZpbmUgREVCVUdfSVJEQV9PQ0JfVFJBQ0UJMAkvKiBJUkRBIG90aGVyIGNhbGxiYWNrcyAqLworI2RlZmluZSBERUJVR19JUkRBX09DQl9JTkZPCTAJLyogdmFyaW91cyBpbmZvICovCisjZGVmaW5lIERFQlVHX0lSREFfT0NCX0VSUk9SCTEJLyogcHJvYmxlbXMgKi8KKworI2RlZmluZSBERUJVR19BU1NFUlQJCTAJLyogVmVyaWZ5IGFsbCBhc3NlcnRpb25zICovCisKKy8qIAorICogVGhlc2UgYXJlIHRoZSBtYWNyb3Mgd2UgYXJlIHVzaW5nIHRvIGFjdHVhbGx5IHByaW50IHRoZSBkZWJ1ZworICogc3RhdGVtZW50cy4gRG9uJ3QgbG9vayBhdCBpdCwgaXQncyB1Z2x5Li4uCisgKgorICogT25lIG9mIHRoZSB0cmljayBpcyB0aGF0LCBhcyB0aGUgREVCVUdfWFhYIGFyZSBjb25zdGFudCwgdGhlCisgKiBjb21waWxlciB3aWxsIG9wdGltaXNlIGF3YXkgdGhlIGlmKCkgaW4gYWxsIGNhc2VzLgorICovCisvKiBBbGwgZXJyb3IgbWVzc2FnZXMgKHdpbGwgc2hvdyB1cCBpbiB0aGUgbm9ybWFsIGxvZ3MpICovCisjZGVmaW5lIERFUlJPUihkYmcsIGZvcm1hdCwgYXJncy4uLikgXAorCXtpZihERUJVR18jI2RiZykgXAorCQlwcmludGsoS0VSTl9JTkZPICJpcm5ldDogJXMoKTogIiBmb3JtYXQsIF9fRlVOQ1RJT05fXyAsICMjYXJncyk7fQorCisvKiBOb3JtYWwgZGVidWcgbWVzc2FnZSAod2lsbCBzaG93IHVwIGluIC92YXIvbG9nL2RlYnVnKSAqLworI2RlZmluZSBERUJVRyhkYmcsIGZvcm1hdCwgYXJncy4uLikgXAorCXtpZihERUJVR18jI2RiZykgXAorCQlwcmludGsoS0VSTl9ERUJVRyAiaXJuZXQ6ICVzKCk6ICIgZm9ybWF0LCBfX0ZVTkNUSU9OX18gLCAjI2FyZ3MpO30KKworLyogRW50ZXJpbmcgYSBmdW5jdGlvbiAodHJhY2UpICovCisjZGVmaW5lIERFTlRFUihkYmcsIGZvcm1hdCwgYXJncy4uLikgXAorCXtpZihERUJVR18jI2RiZykgXAorCQlwcmludGsoS0VSTl9ERUJVRyAiaXJuZXQ6IC0+ICVzIiBmb3JtYXQsIF9fRlVOQ1RJT05fXyAsICMjYXJncyk7fQorCisvKiBFbnRlcmluZyBhbmQgZXhpdGluZyBhIGZ1bmN0aW9uIGluIG9uZSBnbyAodHJhY2UpICovCisjZGVmaW5lIERQQVNTKGRiZywgZm9ybWF0LCBhcmdzLi4uKSBcCisJe2lmKERFQlVHXyMjZGJnKSBcCisJCXByaW50ayhLRVJOX0RFQlVHICJpcm5ldDogPD4lcyIgZm9ybWF0LCBfX0ZVTkNUSU9OX18gLCAjI2FyZ3MpO30KKworLyogRXhpdGluZyBhIGZ1bmN0aW9uICh0cmFjZSkgKi8KKyNkZWZpbmUgREVYSVQoZGJnLCBmb3JtYXQsIGFyZ3MuLi4pIFwKKwl7aWYoREVCVUdfIyNkYmcpIFwKKwkJcHJpbnRrKEtFUk5fREVCVUcgImlybmV0OiA8LSVzKCkiIGZvcm1hdCwgX19GVU5DVElPTl9fICwgIyNhcmdzKTt9CisKKy8qIEV4aXQgYSBmdW5jdGlvbiB3aXRoIGRlYnVnICovCisjZGVmaW5lIERSRVRVUk4ocmV0LCBkYmcsIGFyZ3MuLi4pIFwKKwl7REVYSVQoZGJnLCAiOiAiIGFyZ3MpO1wKKwlyZXR1cm4gcmV0OyB9CisKKy8qIEV4aXQgYSBmdW5jdGlvbiBvbiBmYWlsZWQgY29uZGl0aW9uICovCisjZGVmaW5lIERBQk9SVChjb25kLCByZXQsIGRiZywgYXJncy4uLikgXAorCXtpZihjb25kKSB7XAorCQlERVJST1IoZGJnLCBhcmdzKTtcCisJCXJldHVybiByZXQ7IH19CisKKy8qIEludmFsaWQgYXNzZXJ0aW9uLCBwcmludCBvdXQgYW4gZXJyb3IgYW5kIGV4aXQuLi4gKi8KKyNkZWZpbmUgREFTU0VSVChjb25kLCByZXQsIGRiZywgYXJncy4uLikgXAorCXtpZigoREVCVUdfQVNTRVJUKSAmJiAhKGNvbmQpKSB7XAorCQlERVJST1IoZGJnLCAiSW52YWxpZCBhc3NlcnRpb246ICIgYXJncyk7XAorCQlyZXR1cm4gcmV0OyB9fQorCisvKioqKioqKioqKioqKioqKioqKioqKioqIENPTlNUQU5UUyAmIE1BQ1JPUyAqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFBhcmFub2lhICovCisjZGVmaW5lIElSTkVUX01BR0lDCTB4QjAwNzU0CisKKy8qIE51bWJlciBvZiBjb250cm9sIGV2ZW50cyBpbiB0aGUgY29udHJvbCBjaGFubmVsIGJ1ZmZlci4uLiAqLworI2RlZmluZSBJUk5FVF9NQVhfRVZFTlRTCTgJLyogU2hvdWxkIGJlIG1vcmUgdGhhbiBlbm91Z2guLi4gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBUWVBFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGlzIGlzIHRoZSBtYWluIHN0cnVjdHVyZSB3aGVyZSB3ZSBzdG9yZSBhbGwgdGhlIGRhdGEgcGVydGFpbmluZyB0bworICogb25lIGluc3RhbmNlIG9mIGlybmV0LgorICogTm90ZSA6IGluIGlybmV0IGZ1bmN0aW9ucywgYSBwb2ludGVyIHRoaXMgc3RydWN0dXJlIGlzIHVzdWFsbHkgY2FsbGVkCisgKiAiYXAiIG9yICJzZWxmIi4gSWYgdGhlIGNvZGUgaXMgYm9ycm93ZWQgZnJvbSB0aGUgSXJEQSBzdGFjaywgaXQgdGVuZAorICogdG8gYmUgY2FsbGVkICJzZWxmIiwgYW5kIGlmIGl0IGlzIGJvcnJvd2VkIGZyb20gdGhlIFBQUCBkcml2ZXIgaXQgaXMKKyAqICJhcCIuIEFwYXJ0IGZyb20gdGhhdCwgaXQncyBleGFjdGx5IHRoZSBzYW1lIHN0cnVjdHVyZSA7LSkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgaXJuZXRfc29ja2V0Cit7CisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgbWFuYWdlbWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIC8qIFdlIG1hbmFnZSBhIGxpbmtlZCBsaXN0IG9mIElyTkVUIHNvY2tldCBpbnN0YW5jZXMgKi8KKyAgaXJkYV9xdWV1ZV90CQlxOwkJLyogTXVzdCBiZSBmaXJzdCAtIGZvciBoYXNiaW4gKi8KKyAgaW50CQkJbWFnaWM7CQkvKiBQYXJhbm9pYSAqLworCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaWxlU3lzdGVtIHBhcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIC8qICJwcHBkIiBpbnRlcmFjdCBkaXJlY3RseSB3aXRoIHVzIG9uIGEgL2Rldi8gZmlsZSAqLworICBzdHJ1Y3QgZmlsZSAqCQlmaWxlOwkJLyogRmlsZSBkZXNjcmlwdG9yIG9mIHRoaXMgaW5zdGFuY2UgKi8KKyAgLyogVFRZIHN0dWZmIC0gdG8ga2VlcCAicHBwZCIgaGFwcHkgKi8KKyAgc3RydWN0IHRlcm1pb3MJdGVybWlvczsJLyogVmFyaW91cyB0dHkgZmxhZ3MgKi8KKyAgLyogU3R1ZmYgZm9yIHRoZSBjb250cm9sIGNoYW5uZWwgKi8KKyAgaW50CQkJZXZlbnRfaW5kZXg7CS8qIExhc3QgcmVhZCBpbiB0aGUgZXZlbnQgbG9nICovCisKKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQUFAgcGFydCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIC8qIFdlIGludGVyZmFjZSBkaXJlY3RseSB0byB0aGUgcHBwX2dlbmVyaWMgZHJpdmVyIGluIHRoZSBrZXJuZWwgKi8KKyAgaW50CQkJcHBwX29wZW47CS8qIHJlZ2lzdGVyZWQgd2l0aCBwcHBfZ2VuZXJpYyAqLworICBzdHJ1Y3QgcHBwX2NoYW5uZWwJY2hhbjsJCS8qIEludGVyZmFjZSB0byBnZW5lcmljIHBwcCBsYXllciAqLworCisgIGludAkJCW1ydTsJCS8qIE1heCBzaXplIG9mIFBQUCBwYXlsb2FkICovCisgIHUzMgkJCXhhY2NtWzhdOwkvKiBBc3luY2hyb25vdXMgY2hhcmFjdGVyIG1hcCAoanVzdCAqLworICB1MzIJCQlyYWNjbTsJCS8qIHRvIHBsZWFzZSBwcHBkIC0gZHVtbXkpICovCisgIHVuc2lnbmVkIGludAkJZmxhZ3M7CQkvKiBQUFAgZmxhZ3MgKGNvbXByZXNzaW9uLCAuLi4pICovCisgIHVuc2lnbmVkIGludAkJcmJpdHM7CQkvKiBVbnVzZWQgcmVjZWl2ZSBmbGFncyA/Pz8gKi8KKworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSXJUVFAgcGFydCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgLyogV2UgY3JlYXRlIGEgcHNldWRvICJzb2NrZXQiIG92ZXIgdGhlIElyREEgdHJhbnBvcnQgKi8KKyAgdW5zaWduZWQgbG9uZwkJdHRwX29wZW47CS8qIFNldCB3aGVuIElyVFRQIGlzIHJlYWR5ICovCisgIHVuc2lnbmVkIGxvbmcJCXR0cF9jb25uZWN0OwkvKiBTZXQgd2hlbiBJclRUUCBpcyBjb25uZWN0aW5nICovCisgIHN0cnVjdCB0c2FwX2NiICoJdHNhcDsJCS8qIElyVFRQIGluc3RhbmNlICh0aGUgY29ubmVjdGlvbikgKi8KKworICBjaGFyCQkJcm5hbWVbTklDS05BTUVfTUFYX0xFTiArIDFdOworCQkJCQkvKiBJckRBIG5pY2tuYW1lIG9mIGRlc3RpbmF0aW9uICovCisgIF9fdTMyCQkJcmRhZGRyOwkJLyogUmVxdWVzdGVkIHBlZXIgSXJEQSBhZGRyZXNzICovCisgIF9fdTMyCQkJcnNhZGRyOwkJLyogUmVxdWVzdGVkIGxvY2FsIElyREEgYWRkcmVzcyAqLworICBfX3UzMgkJCWRhZGRyOwkJLyogYWN0dWFsIHBlZXIgSXJEQSBhZGRyZXNzICovCisgIF9fdTMyCQkJc2FkZHI7CQkvKiBteSBsb2NhbCBJckRBIGFkZHJlc3MgKi8KKyAgX191OAkJCWR0c2FwX3NlbDsJLyogUmVtb3RlIFRTQVAgc2VsZWN0b3IgKi8KKyAgX191OAkJCXN0c2FwX3NlbDsJLyogTG9jYWwgVFNBUCBzZWxlY3RvciAqLworCisgIF9fdTMyCQkJbWF4X3NkdV9zaXplX3J4Oy8qIFNvY2tldCBwYXJhbWV0ZXJzIHVzZWQgZm9yIElyVFRQICovCisgIF9fdTMyCQkJbWF4X3NkdV9zaXplX3R4OworICBfX3UzMgkJCW1heF9kYXRhX3NpemU7CisgIF9fdTgJCQltYXhfaGVhZGVyX3NpemU7CisgIExPQ0FMX0ZMT1cJCXR4X2Zsb3c7CS8qIFN0YXRlIG9mIHRoZSBUeCBwYXRoIGluIElyVFRQICovCisKKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBJckxNUCBhbmQgSXJJQVMgcGFydCAtLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIC8qIFVzZWQgZm9yIElyREEgRGlzY292ZXJ5IGFuZCBzb2NrZXQgbmFtZSByZXNvbHV0aW9uICovCisgIHZvaWQgKgkJY2tleTsJCS8qIElyTE1QIGNsaWVudCBoYW5kbGUgKi8KKyAgX191MTYJCQltYXNrOwkJLyogSGludCBiaXRzIG1hc2sgKGZpbHRlciBkaXNjb3YuKSovCisgIGludAkJCW5zbG90czsJCS8qIE51bWJlciBvZiBzbG90cyBmb3IgZGlzY292ZXJ5ICovCisKKyAgc3RydWN0IGlyaWFwX2NiICoJaXJpYXA7CQkvKiBVc2VkIHRvIHF1ZXJ5IHJlbW90ZSBJQVMgKi8KKyAgaW50CQkJZXJybm87CQkvKiBzdGF0dXMgb2YgdGhlIElBUyBxdWVyeSAqLworCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIERpc2NvdmVyeSBsb2cgcGFydCAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAvKiBVc2VkIGJ5IGluaXRpYWwgZGlzY292ZXJ5IG9uIHRoZSBjb250cm9sIGNoYW5uZWwKKyAgICogYW5kIGJ5IGlybmV0X2Rpc2NvdmVyX2RhZGRyX2FuZF9sc2FwX3NlbCgpICovCisgIHN0cnVjdCBpcmRhX2RldmljZV9pbmZvICpkaXNjb3ZlcmllczsJLyogQ29weSBvZiB0aGUgZGlzY292ZXJ5IGxvZyAqLworICBpbnQJCQlkaXNjb19pbmRleDsJLyogTGFzdCByZWFkIGluIHRoZSBkaXNjb3ZlcnkgbG9nICovCisgIGludAkJCWRpc2NvX251bWJlcjsJLyogU2l6ZSBvZiB0aGUgZGlzY292ZXJ5IGxvZyAqLworCit9IGlybmV0X3NvY2tldDsKKworLyoKKyAqIFRoaXMgaXMgdGhlIHZhcmlvdXMgZXZlbnQgdGhhdCB3ZSB3aWxsIGdlbmVyYXRlIG9uIHRoZSBjb250cm9sIGNoYW5uZWwKKyAqLwordHlwZWRlZiBlbnVtIGlybmV0X2V2ZW50Cit7CisgIElSTkVUX0RJU0NPVkVSLAkJLyogTmV3IElyTkVUIG5vZGUgZGlzY292ZXJlZCAqLworICBJUk5FVF9FWFBJUkUsCQkJLyogSXJORVQgbm9kZSBleHBpcmVkICovCisgIElSTkVUX0NPTk5FQ1RfVE8sCQkvKiBJck5FVCBzb2NrZXQgaGFzIGNvbm5lY3RlZCB0byBvdGhlciBub2RlICovCisgIElSTkVUX0NPTk5FQ1RfRlJPTSwJCS8qIE90aGVyIG5vZGUgaGFzIGNvbm5lY3RlZCB0byBJck5FVCBzb2NrZXQgKi8KKyAgSVJORVRfUkVRVUVTVF9GUk9NLAkJLyogTm9uIHNhdGlzZmllZCBjb25uZWN0aW9uIHJlcXVlc3QgKi8KKyAgSVJORVRfTk9BTlNXRVJfRlJPTSwJCS8qIEZhaWxlZCBjb25uZWN0aW9uIHJlcXVlc3QgKi8KKyAgSVJORVRfQkxPQ0tFRF9MSU5LLAkJLyogTGluayAoSXJMQVApIGlzIGJsb2NrZWQgZm9yID4gM3MgKi8KKyAgSVJORVRfRElTQ09OTkVDVF9GUk9NLAkvKiBJck5FVCBzb2NrZXQgaGFzIGRpc2Nvbm5lY3RlZCAqLworICBJUk5FVF9ESVNDT05ORUNUX1RPCQkvKiBDbG9zaW5nIElyTkVUIHNvY2tldCAqLworfSBpcm5ldF9ldmVudDsKKworLyoKKyAqIFRoaXMgaXMgdGhlIHN0b3JhZ2UgZm9yIGFuIGV2ZW50IGFuZCBpdHMgYXJndW1lbnRzCisgKi8KK3R5cGVkZWYgc3RydWN0IGlybmV0X2xvZworeworICBpcm5ldF9ldmVudAlldmVudDsKKyAgaW50CQl1bml0OworICBfX3UzMgkJc2FkZHI7CisgIF9fdTMyCQlkYWRkcjsKKyAgY2hhcgkJbmFtZVtOSUNLTkFNRV9NQVhfTEVOICsgMV07CS8qIDIxICsgMSAqLworICBfX3UxNl9ob3N0X29yZGVyIGhpbnRzOwkJCS8qIERpc2NvdmVyeSBoaW50IGJpdHMgKi8KK30gaXJuZXRfbG9nOworCisvKgorICogVGhpcyBpcyB0aGUgc3RvcmFnZSBmb3IgYWxsIGV2ZW50cyBhbmQgcmVsYXRlZCBzdHVmZi4uLgorICovCit0eXBlZGVmIHN0cnVjdCBpcm5ldF9jdHJsX2NoYW5uZWwKK3sKKyAgaXJuZXRfbG9nCWxvZ1tJUk5FVF9NQVhfRVZFTlRTXTsJLyogRXZlbnQgbG9nICovCisgIGludAkJaW5kZXg7CQkvKiBDdXJyZW50IGluZGV4IGluIGxvZyAqLworICBzcGlubG9ja190CXNwaW5sb2NrOwkvKiBTZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBldmVudCBsb2cgKi8KKyAgd2FpdF9xdWV1ZV9oZWFkX3QJcndhaXQ7CS8qIHByb2Nlc3NlcyBibG9ja2VkIG9uIHJlYWQgKG9yIHBvbGwpICovCit9IGlybmV0X2N0cmxfY2hhbm5lbDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogUFJPVE9UWVBFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEdsb2JhbCBmdW5jdGlvbnMgb2YgdGhlIElyTkVUIG1vZHVsZQorICogTm90ZSA6IHdlIGxpc3QgaGVyZSBhbHNvIGZ1bmN0aW9ucyBjYWxsZWQgZnJvbSBvbmUgZmlsZSB0byB0aGUgb3RoZXIuCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSVJEQSBQQVJUIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitleHRlcm4gaW50CisJaXJkYV9pcm5ldF9jcmVhdGUoaXJuZXRfc29ja2V0ICopOwkvKiBJbml0aWFsaXNlIGEgSXJORVQgc29ja2V0ICovCitleHRlcm4gaW50CisJaXJkYV9pcm5ldF9jb25uZWN0KGlybmV0X3NvY2tldCAqKTsJLyogVHJ5IHRvIGNvbm5lY3Qgb3ZlciBJckRBICovCitleHRlcm4gdm9pZAorCWlyZGFfaXJuZXRfZGVzdHJveShpcm5ldF9zb2NrZXQgKik7CS8qIFRlYXJkb3duICBhIElyTkVUIHNvY2tldCAqLworZXh0ZXJuIGludAorCWlyZGFfaXJuZXRfaW5pdCh2b2lkKTsJCS8qIEluaXRpYWxpc2UgSXJEQSBwYXJ0IG9mIElyTkVUICovCitleHRlcm4gdm9pZAorCWlyZGFfaXJuZXRfY2xlYW51cCh2b2lkKTsJLyogVGVhcmRvd24gSXJEQSBwYXJ0IG9mIElyTkVUICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1PRFVMRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitleHRlcm4gaW50CisJaXJuZXRfaW5pdCh2b2lkKTsJCS8qIEluaXRpYWxpc2UgSXJORVQgbW9kdWxlICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFZBUklBQkxFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb250cm9sIGNoYW5uZWwgc3R1ZmYgLSBhbGxvY2F0ZWQgaW4gaXJuZXRfaXJkYS5oICovCitleHRlcm4gc3RydWN0IGlybmV0X2N0cmxfY2hhbm5lbAlpcm5ldF9ldmVudHM7CisKKyNlbmRpZiAvKiBJUk5FVF9IICovCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcm5ldC9pcm5ldF9pcmRhLmMgYi9uZXQvaXJkYS9pcm5ldC9pcm5ldF9pcmRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdlYzMyNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL2lybmV0L2lybmV0X2lyZGEuYwpAQCAtMCwwICsxLDE4NjYgQEAKKy8qCisgKglJck5FVCBwcm90b2NvbCBtb2R1bGUgOiBTeW5jaHJvbm91cyBQUFAgb3ZlciBhbiBJckRBIHNvY2tldC4KKyAqCisgKgkJSmVhbiBJSSAtIEhQTCBgMDAgLSA8anRAaHBsLmhwLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaW1wbGVtZW50IHRoZSBJUkRBIGludGVyZmFjZSBvZiBJck5FVC4KKyAqIEJhc2ljYWxseSwgd2Ugc2l0IG9uIHRvcCBvZiBJclRUUC4gV2Ugc2V0IHVwIElyVFRQLCBJcklBUyBwcm9wZXJseSwKKyAqIGFuZCBleGNoYW5nZSBmcmFtZXMgd2l0aCBJclRUUC4KKyAqLworCisjaW5jbHVkZSAiaXJuZXRfaXJkYS5oIgkJLyogUHJpdmF0ZSBoZWFkZXIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogQ09OVFJPTCBDSEFOTkVMICoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogV2hlbiBwcHAgaXMgbm90IGFjdGl2ZSwgL2Rldi9pcm5ldCBhY3QgYXMgYSBjb250cm9sIGNoYW5uZWwuCisgKiBXcml0aW5nIGFsbG93IHRvIHNldCB1cCB0aGUgSXJEQSBkZXN0aW5hdGlvbiBvZiB0aGUgSXJORVQgY2hhbm5lbCwKKyAqIGFuZCBhbnkgYXBwbGljYXRpb24gbWF5IGJlIHJlYWQgZXZlbnRzIGhhcHBlbmluZyBvbiBJck5FVC4uLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBQb3N0IGFuIGV2ZW50IHRvIHRoZSBjb250cm9sIGNoYW5uZWwuLi4KKyAqIFB1dCB0aGUgZXZlbnQgaW4gdGhlIGxvZywgYW5kIHRoZW4gd2FpdCBhbGwgcHJvY2VzcyBibG9ja2VkIG9uIHJlYWQKKyAqIHNvIHRoZXkgY2FuIHJlYWQgdGhlIGxvZy4uLgorICovCitzdGF0aWMgdm9pZAoraXJuZXRfcG9zdF9ldmVudChpcm5ldF9zb2NrZXQgKglhcCwKKwkJIGlybmV0X2V2ZW50CWV2ZW50LAorCQkgX191MzIJCXNhZGRyLAorCQkgX191MzIJCWRhZGRyLAorCQkgY2hhciAqCQluYW1lLAorCQkgX191MTYJCWhpbnRzKQoreworICBpbnQJCQlpbmRleDsJCS8qIEluIHRoZSBsb2cgKi8KKworICBERU5URVIoQ1RSTF9UUkFDRSwgIihhcD0weCVwLCBldmVudD0lZCwgZGFkZHI9JTA4eCwgbmFtZT1gYCVzJycpXG4iLAorCSBhcCwgZXZlbnQsIGRhZGRyLCBuYW1lKTsKKworICAvKiBQcm90ZWN0IHRoaXMgc2VjdGlvbiB2aWEgc3BpbmxvY2suCisgICAqIE5vdGUgOiBhcyB3ZSBhcmUgdGhlIG9ubHkgZXZlbnQgcHJvZHVjZXIsIHdlIG9ubHkgbmVlZCB0byBleGNsdWRlCisgICAqIG91cnNlbGYgd2hlbiB0b3VjaGluZyB0aGUgbG9nLCB3aGljaCBpcyBuaWNlIGFuZCBlYXN5LgorICAgKi8KKyAgc3Bpbl9sb2NrX2JoKCZpcm5ldF9ldmVudHMuc3BpbmxvY2spOworCisgIC8qIENvcHkgdGhlIGV2ZW50IGluIHRoZSBsb2cgKi8KKyAgaW5kZXggPSBpcm5ldF9ldmVudHMuaW5kZXg7CisgIGlybmV0X2V2ZW50cy5sb2dbaW5kZXhdLmV2ZW50ID0gZXZlbnQ7CisgIGlybmV0X2V2ZW50cy5sb2dbaW5kZXhdLmRhZGRyID0gZGFkZHI7CisgIGlybmV0X2V2ZW50cy5sb2dbaW5kZXhdLnNhZGRyID0gc2FkZHI7CisgIC8qIFRyeSB0byBjb3B5IElyREEgbmlja25hbWUgKi8KKyAgaWYobmFtZSkKKyAgICBzdHJjcHkoaXJuZXRfZXZlbnRzLmxvZ1tpbmRleF0ubmFtZSwgbmFtZSk7CisgIGVsc2UKKyAgICBpcm5ldF9ldmVudHMubG9nW2luZGV4XS5uYW1lWzBdID0gJ1wwJzsKKyAgLyogQ29weSBoaW50cyAqLworICBpcm5ldF9ldmVudHMubG9nW2luZGV4XS5oaW50cy53b3JkID0gaGludHM7CisgIC8qIFRyeSB0byBnZXQgcHBwIHVuaXQgbnVtYmVyICovCisgIGlmKChhcCAhPSAoaXJuZXRfc29ja2V0ICopIE5VTEwpICYmIChhcC0+cHBwX29wZW4pKQorICAgIGlybmV0X2V2ZW50cy5sb2dbaW5kZXhdLnVuaXQgPSBwcHBfdW5pdF9udW1iZXIoJmFwLT5jaGFuKTsKKyAgZWxzZQorICAgIGlybmV0X2V2ZW50cy5sb2dbaW5kZXhdLnVuaXQgPSAtMTsKKworICAvKiBJbmNyZW1lbnQgdGhlIGluZGV4CisgICAqIE5vdGUgdGhhdCB3ZSBpbmNyZW1lbnQgdGhlIGluZGV4IG9ubHkgYWZ0ZXIgdGhlIGV2ZW50IGlzIHdyaXR0ZW4sCisgICAqIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSByZWFkZXJzIGRvbid0IGdldCBnYXJiYWdlLi4uICovCisgIGlybmV0X2V2ZW50cy5pbmRleCA9IChpbmRleCArIDEpICUgSVJORVRfTUFYX0VWRU5UUzsKKworICBERUJVRyhDVFJMX0lORk8sICJOZXcgZXZlbnQgaW5kZXggaXMgJWRcbiIsIGlybmV0X2V2ZW50cy5pbmRleCk7CisKKyAgLyogU3BpbiBsb2NrIGVuZCAqLworICBzcGluX3VubG9ja19iaCgmaXJuZXRfZXZlbnRzLnNwaW5sb2NrKTsKKworICAvKiBOb3cgOiB3YWtlIHVwIGV2ZXJ5Ym9keSB3YWl0aW5nIGZvciBldmVudHMuLi4gKi8KKyAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaXJuZXRfZXZlbnRzLnJ3YWl0KTsKKworICBERVhJVChDVFJMX1RSQUNFLCAiXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogSVJEQSBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFRoZXNlIGFyZSBhIGJ1bmNoIG9mIHN1YnJvdXRpbmVzIGNhbGxlZCBmcm9tIG90aGVyIGZ1bmN0aW9ucworICogZG93biB0aGVyZSwgbW9zdGx5IGNvbW1vbiBjb2RlIG9yIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuLi4KKyAqCisgKiBOb3RlIDogd2UgZHVwbGljYXRlIHF1aXRlIGhlYXZpbHkgc29tZSByb3V0aW5lcyBvZiBhZl9pcmRhLmMsCisgKiBiZWNhdXNlIG91ciBpbnB1dCBzdHJ1Y3R1cmUgKHNlbGYpIGlzIHF1aXRlIGRpZmZlcmVudAorICogKHN0cnVjdCBpcm5ldCBpbnN0ZWFkIG9mIHN0cnVjdCBpcmRhX3NvY2spLCB3aGljaCBtYWtlIHNoYXJpbmcKKyAqIHRoZSBzYW1lIGNvZGUgaW1wb3NzaWJsZSAoYXQgbGVhc3QsIHdpdGhvdXQgdGVtcGxhdGVzKS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJkYV9vcGVuX3RzYXAgKHNlbGYpCisgKgorICogICAgT3BlbiBsb2NhbCBUcmFuc3BvcnQgU2VydmljZSBBY2Nlc3MgUG9pbnQgKFRTQVApCisgKgorICogQ3JlYXRlIGEgSXJUVFAgaW5zdGFuY2UgZm9yIHVzIGFuZCBzZXQgYWxsIHRoZSBJclRUUCBjYWxsYmFja3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citpcm5ldF9vcGVuX3RzYXAoaXJuZXRfc29ja2V0ICoJc2VsZikKK3sKKyAgbm90aWZ5X3QJbm90aWZ5OwkJLyogQ2FsbGJhY2sgc3RydWN0dXJlICovCisKKyAgREVOVEVSKElSREFfU1JfVFJBQ0UsICIoc2VsZj0weCVwKVxuIiwgc2VsZik7CisKKyAgREFCT1JUKHNlbGYtPnRzYXAgIT0gTlVMTCwgLUVCVVNZLCBJUkRBX1NSX0VSUk9SLCAiQWxyZWFkeSBidXN5ICFcbiIpOworCisgIC8qIEluaXRpYWxpemUgSXJUVFAgY2FsbGJhY2tzIHRvIGJlIHVzZWQgYnkgdGhlIElyREEgc3RhY2sgKi8KKyAgaXJkYV9ub3RpZnlfaW5pdCgmbm90aWZ5KTsKKyAgbm90aWZ5LmNvbm5lY3RfY29uZmlybQk9IGlybmV0X2Nvbm5lY3RfY29uZmlybTsKKyAgbm90aWZ5LmNvbm5lY3RfaW5kaWNhdGlvbgk9IGlybmV0X2Nvbm5lY3RfaW5kaWNhdGlvbjsKKyAgbm90aWZ5LmRpc2Nvbm5lY3RfaW5kaWNhdGlvbgk9IGlybmV0X2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbjsKKyAgbm90aWZ5LmRhdGFfaW5kaWNhdGlvbgk9IGlybmV0X2RhdGFfaW5kaWNhdGlvbjsKKyAgLypub3RpZnkudWRhdGFfaW5kaWNhdGlvbgk9IE5VTEw7Ki8KKyAgbm90aWZ5LmZsb3dfaW5kaWNhdGlvbgk9IGlybmV0X2Zsb3dfaW5kaWNhdGlvbjsKKyAgbm90aWZ5LnN0YXR1c19pbmRpY2F0aW9uCT0gaXJuZXRfc3RhdHVzX2luZGljYXRpb247CisgIG5vdGlmeS5pbnN0YW5jZQkJPSBzZWxmOworICBzdHJsY3B5KG5vdGlmeS5uYW1lLCBJUk5FVF9OT1RJRllfTkFNRSwgc2l6ZW9mKG5vdGlmeS5uYW1lKSk7CisKKyAgLyogT3BlbiBhbiBJclRUUCBpbnN0YW5jZSAqLworICBzZWxmLT50c2FwID0gaXJ0dHBfb3Blbl90c2FwKExTQVBfQU5ZLCBERUZBVUxUX0lOSVRJQUxfQ1JFRElULAorCQkJICAgICAgICZub3RpZnkpOwkKKyAgREFCT1JUKHNlbGYtPnRzYXAgPT0gTlVMTCwgLUVOT01FTSwKKwkgSVJEQV9TUl9FUlJPUiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBUU0FQICFcbiIpOworCisgIC8qIFJlbWVtYmVyIHdoaWNoIFRTQVAgc2VsZWN0b3Igd2UgYWN0dWFsbHkgZ290ICovCisgIHNlbGYtPnN0c2FwX3NlbCA9IHNlbGYtPnRzYXAtPnN0c2FwX3NlbDsKKworICBERVhJVChJUkRBX1NSX1RSQUNFLCAiIC0gdHNhcD0weCVwLCBzZWw9MHglWFxuIiwKKwlzZWxmLT50c2FwLCBzZWxmLT5zdHNhcF9zZWwpOworICByZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZ1bmN0aW9uIGlybmV0X2lhc190b190c2FwIChzZWxmLCByZXN1bHQsIHZhbHVlKQorICoKKyAqICAgIEV4YW1pbmUgYW4gSUFTIG9iamVjdCBhbmQgZXh0cmFjdCBUU0FQCisgKgorICogV2UgZG8gYW4gSUFQIHF1ZXJ5IHRvIGZpbmQgdGhlIFRTQVAgYXNzb2NpYXRlZCB3aXRoIHRoZSBJck5FVCBzZXJ2aWNlLgorICogV2hlbiBJcklBUCBwYXNzIHVzIHRoZSByZXN1bHQgb2YgdGhlIHF1ZXJ5LCB0aGlzIGZ1bmN0aW9uIGxvb2sgYXQKKyAqIHRoZSByZXR1cm4gdmFsdWVzIHRvIGNoZWNrIGZvciBmYWlsdXJlcyBhbmQgZXh0cmFjdCB0aGUgVFNBUCBpZgorICogcG9zc2libGUuCisgKiBBbHNvIGRlYWxsb2NhdGUgdmFsdWUKKyAqIFRoZSBmYWlsdXJlIGlzIGluIHNlbGYtPmVycm5vCisgKiBSZXR1cm4gVFNBUCBvciAtMQorICovCitzdGF0aWMgaW5saW5lIF9fdTgKK2lybmV0X2lhc190b190c2FwKGlybmV0X3NvY2tldCAqCXNlbGYsCisJCSAgaW50CQkJcmVzdWx0LAorCQkgIHN0cnVjdCBpYXNfdmFsdWUgKgl2YWx1ZSkKK3sKKyAgX191OAlkdHNhcF9zZWwgPSAwOwkJLyogVFNBUCB3ZSBhcmUgbG9va2luZyBmb3IgKi8KKworICBERU5URVIoSVJEQV9TUl9UUkFDRSwgIihzZWxmPTB4JXApXG4iLCBzZWxmKTsKKworICAvKiBCeSBkZWZhdWx0LCBubyBlcnJvciAqLworICBzZWxmLT5lcnJubyA9IDA7CisKKyAgLyogQ2hlY2sgaWYgcmVxdWVzdCBzdWNjZWVkZWQgKi8KKyAgc3dpdGNoKHJlc3VsdCkKKyAgICB7CisgICAgICAvKiBTdGFuZGFyZCBlcnJvcnMgOiBzZXJ2aWNlIG5vdCBhdmFpbGFibGUgKi8KKyAgICBjYXNlIElBU19DTEFTU19VTktOT1dOOgorICAgIGNhc2UgSUFTX0FUVFJJQl9VTktOT1dOOgorICAgICAgREVCVUcoSVJEQV9TUl9JTkZPLCAiSUFTIG9iamVjdCBkb2Vzbid0IGV4aXN0ICEgKCVkKVxuIiwgcmVzdWx0KTsKKyAgICAgIHNlbGYtPmVycm5vID0gLUVBRERSTk9UQVZBSUw7CisgICAgICBicmVhazsKKworICAgICAgLyogT3RoZXIgZXJyb3JzLCBtb3N0IGxpa2VseSBJckRBIHN0YWNrIGZhaWx1cmUgKi8KKyAgICBkZWZhdWx0IDoKKyAgICAgIERFQlVHKElSREFfU1JfSU5GTywgIklBUyBxdWVyeSBmYWlsZWQgISAoJWQpXG4iLCByZXN1bHQpOworICAgICAgc2VsZi0+ZXJybm8gPSAtRUhPU1RVTlJFQUNIOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFN1Y2Nlc3MgOiB3ZSBnb3Qgd2hhdCB3ZSB3YW50ZWQgKi8KKyAgICBjYXNlIElBU19TVUNDRVNTOgorICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIENoZWNrIHdoYXQgd2FzIHJldHVybmVkIHRvIHVzICovCisgIGlmKHZhbHVlICE9IE5VTEwpCisgICAgeworICAgICAgLyogV2hhdCB0eXBlIG9mIGFyZ3VtZW50IGhhdmUgd2UgZ290ID8gKi8KKyAgICAgIHN3aXRjaCh2YWx1ZS0+dHlwZSkKKwl7CisJY2FzZSBJQVNfSU5URUdFUjoKKwkgIERFQlVHKElSREFfU1JfSU5GTywgInJlc3VsdD0lZFxuIiwgdmFsdWUtPnQuaW50ZWdlcik7CisJICBpZih2YWx1ZS0+dC5pbnRlZ2VyICE9IC0xKQorCSAgICAvKiBHZXQgdGhlIHJlbW90ZSBUU0FQIHNlbGVjdG9yICovCisJICAgIGR0c2FwX3NlbCA9IHZhbHVlLT50LmludGVnZXI7CisJICBlbHNlIAorCSAgICBzZWxmLT5lcnJubyA9IC1FQUREUk5PVEFWQUlMOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHNlbGYtPmVycm5vID0gLUVBRERSTk9UQVZBSUw7CisJICBERVJST1IoSVJEQV9TUl9FUlJPUiwgImJhZCB0eXBlICEgKDB4JVgpXG4iLCB2YWx1ZS0+dHlwZSk7CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qIENsZWFudXAgKi8KKyAgICAgIGlyaWFzX2RlbGV0ZV92YWx1ZSh2YWx1ZSk7CisgICAgfQorICBlbHNlCS8qIHZhbHVlID09IE5VTEwgKi8KKyAgICB7CisgICAgICAvKiBOb3RoaW5nIHJldHVybmVkIHRvIHVzIC0gdXN1YWxseSByZXN1bHQgIT0gU1VDQ0VTUyAqLworICAgICAgaWYoIShzZWxmLT5lcnJubykpCisJeworCSAgREVSUk9SKElSREFfU1JfRVJST1IsCisJCSAiSXJEQSBidWcgOiByZXN1bHQgPT0gU1VDQ0VTUyAmJiB2YWx1ZSA9PSBOVUxMXG4iKTsKKwkgIHNlbGYtPmVycm5vID0gLUVIT1NUVU5SRUFDSDsKKwl9CisgICAgfQorICBERVhJVChJUkRBX1NSX1RSQUNFLCAiXG4iKTsKKworICAvKiBSZXR1cm4gdGhlIFRTQVAgKi8KKyAgcmV0dXJuKGR0c2FwX3NlbCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiBpcm5ldF9maW5kX2xzYXBfc2VsIChzZWxmKQorICoKKyAqICAgIFRyeSB0byBsb29rdXAgTFNBUCBzZWxlY3RvciBpbiByZW1vdGUgTE0tSUFTCisgKgorICogQmFzaWNhbGx5LCB3ZSBzdGFydCBhIElBUCBxdWVyeSwgYW5kIHRoZW4gZ28gdG8gc2xlZXAuIFdoZW4gdGhlIHF1ZXJ5CisgKiByZXR1cm4sIGlybmV0X2dldHZhbHVlX2NvbmZpcm0gd2lsbCB3YWtlIHVzIHVwLCBhbmQgd2UgY2FuIGV4YW1pbmUgdGhlCisgKiByZXN1bHQgb2YgdGhlIHF1ZXJ5Li4uCisgKiBOb3RlIHRoYXQgaW4gc29tZSBjYXNlLCB0aGUgcXVlcnkgZmFpbCBldmVuIGJlZm9yZSB3ZSBnbyB0byBzbGVlcCwKKyAqIGNyZWF0aW5nIHNvbWUgcmFjZXMuLi4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2lybmV0X2ZpbmRfbHNhcF9zZWwoaXJuZXRfc29ja2V0ICoJc2VsZikKK3sKKyAgREVOVEVSKElSREFfU1JfVFJBQ0UsICIoc2VsZj0weCVwKVxuIiwgc2VsZik7CisKKyAgLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbiAqLworICBEQUJPUlQoc2VsZi0+aXJpYXAsIC1FQlVTWSwgSVJEQV9TUl9FUlJPUiwgImJ1c3kgd2l0aCBhIHByZXZpb3VzIHF1ZXJ5LlxuIik7CisKKyAgLyogQ3JlYXRlIGFuIElBUCBpbnN0YW5jZSwgd2lsbCBiZSBjbG9zZWQgaW4gaXJuZXRfZ2V0dmFsdWVfY29uZmlybSgpICovCisgIHNlbGYtPmlyaWFwID0gaXJpYXBfb3BlbihMU0FQX0FOWSwgSUFTX0NMSUVOVCwgc2VsZiwKKwkJCSAgIGlybmV0X2dldHZhbHVlX2NvbmZpcm0pOworCisgIC8qIFRyZWF0IHVuZXhwZWN0ZWQgc2lnbmFscyBhcyBkaXNjb25uZWN0ICovCisgIHNlbGYtPmVycm5vID0gLUVIT1NUVU5SRUFDSDsKKworICAvKiBRdWVyeSByZW1vdGUgTE0tSUFTICovCisgIGlyaWFwX2dldHZhbHVlYnljbGFzc19yZXF1ZXN0KHNlbGYtPmlyaWFwLCBzZWxmLT5yc2FkZHIsIHNlbGYtPmRhZGRyLAorCQkJCUlSTkVUX1NFUlZJQ0VfTkFNRSwgSVJORVRfSUFTX1ZBTFVFKTsKKworICAvKiBUaGUgYWJvdmUgcmVxdWVzdCBpcyBub24tYmxvY2tpbmcuCisgICAqIEFmdGVyIGEgd2hpbGUsIElyREEgd2lsbCBjYWxsIHVzIGJhY2sgaW4gaXJuZXRfZ2V0dmFsdWVfY29uZmlybSgpCisgICAqIFdlIHdpbGwgdGhlbiBjYWxsIGlybmV0X2lhc190b190c2FwKCkgYW5kIGZpbmlzaCB0aGUKKyAgICogY29ubmVjdGlvbiBwcm9jZWR1cmUgKi8KKworICBERVhJVChJUkRBX1NSX1RSQUNFLCAiXG4iKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiBpcm5ldF9jb25uZWN0X3RzYXAgKHNlbGYpCisgKgorICogICAgSW5pdGlhbGlzZSB0aGUgVFRQIHNvY2tldCBhbmQgaW5pdGlhdGUgVFRQIGNvbm5lY3Rpb24KKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citpcm5ldF9jb25uZWN0X3RzYXAoaXJuZXRfc29ja2V0ICoJc2VsZikKK3sKKyAgaW50CQllcnI7CisKKyAgREVOVEVSKElSREFfU1JfVFJBQ0UsICIoc2VsZj0weCVwKVxuIiwgc2VsZik7CisKKyAgLyogT3BlbiBhIGxvY2FsIFRTQVAgKGFuIElyVFRQIGluc3RhbmNlKSAqLworICBlcnIgPSBpcm5ldF9vcGVuX3RzYXAoc2VsZik7CisgIGlmKGVyciAhPSAwKQorICAgIHsKKyAgICAgIGNsZWFyX2JpdCgwLCAmc2VsZi0+dHRwX2Nvbm5lY3QpOworICAgICAgREVSUk9SKElSREFfU1JfRVJST1IsICJjb25uZWN0IGFib3J0ZWQhXG4iKTsKKyAgICAgIHJldHVybihlcnIpOworICAgIH0KKworICAvKiBDb25uZWN0IHRvIHJlbW90ZSBkZXZpY2UgKi8KKyAgZXJyID0gaXJ0dHBfY29ubmVjdF9yZXF1ZXN0KHNlbGYtPnRzYXAsIHNlbGYtPmR0c2FwX3NlbCwgCisJCQkgICAgICBzZWxmLT5yc2FkZHIsIHNlbGYtPmRhZGRyLCBOVUxMLCAKKwkJCSAgICAgIHNlbGYtPm1heF9zZHVfc2l6ZV9yeCwgTlVMTCk7CisgIGlmKGVyciAhPSAwKQorICAgIHsKKyAgICAgIGNsZWFyX2JpdCgwLCAmc2VsZi0+dHRwX2Nvbm5lY3QpOworICAgICAgREVSUk9SKElSREFfU1JfRVJST1IsICJjb25uZWN0IGFib3J0ZWQhXG4iKTsKKyAgICAgIHJldHVybihlcnIpOworICAgIH0KKworICAvKiBUaGUgYWJvdmUgY2FsbCBpcyBub24tYmxvY2tpbmcuCisgICAqIEFmdGVyIGEgd2hpbGUsIHRoZSBJckRBIHN0YWNrIHdpbGwgZWl0aGVyIGNhbGwgdXMgYmFjayBpbgorICAgKiBpcm5ldF9jb25uZWN0X2NvbmZpcm0oKSBvciBpcm5ldF9kaXNjb25uZWN0X2luZGljYXRpb24oKQorICAgKiBTZWUgeW91IHRoZXJlIDstKSAqLworCisgIERFWElUKElSREFfU1JfVFJBQ0UsICJcbiIpOworICByZXR1cm4oZXJyKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZ1bmN0aW9uIGlybmV0X2Rpc2NvdmVyX25leHRfZGFkZHIgKHNlbGYpCisgKgorICogICAgUXVlcnkgdGhlIElyTkVUIFRTQVAgb2YgdGhlIG5leHQgZGV2aWNlIGluIHRoZSBsb2cuCisgKgorICogVXNlZCBpbiB0aGUgVFNBUCBkaXNjb3ZlcnkgcHJvY2VkdXJlLgorICovCitzdGF0aWMgaW5saW5lIGludAoraXJuZXRfZGlzY292ZXJfbmV4dF9kYWRkcihpcm5ldF9zb2NrZXQgKglzZWxmKQoreworICAvKiBDbG9zZSB0aGUgbGFzdCBpbnN0YW5jZSBvZiBJcklBUCwgYW5kIG9wZW4gYSBuZXcgb25lLgorICAgKiBXZSBjYW4ndCByZXVzZSB0aGUgSXJJQVAgaW5zdGFuY2UgaW4gdGhlIElySUFQIGNhbGxiYWNrICovCisgIGlmKHNlbGYtPmlyaWFwKQorICAgIHsKKyAgICAgIGlyaWFwX2Nsb3NlKHNlbGYtPmlyaWFwKTsKKyAgICAgIHNlbGYtPmlyaWFwID0gTlVMTDsKKyAgICB9CisgIC8qIENyZWF0ZSBhIG5ldyBJQVAgaW5zdGFuY2UgKi8KKyAgc2VsZi0+aXJpYXAgPSBpcmlhcF9vcGVuKExTQVBfQU5ZLCBJQVNfQ0xJRU5ULCBzZWxmLAorCQkJICAgaXJuZXRfZGlzY292ZXJ2YWx1ZV9jb25maXJtKTsKKyAgaWYoc2VsZi0+aXJpYXAgPT0gTlVMTCkKKyAgICByZXR1cm4gLUVOT01FTTsKKworICAvKiBOZXh0IGRpc2NvdmVyeSAtIGJlZm9yZSB0aGUgY2FsbCB0byBhdm9pZCByYWNlcyAqLworICBzZWxmLT5kaXNjb19pbmRleCsrOworCisgIC8qIENoZWNrIGlmIHdlIGhhdmUgb25lIG1vcmUgYWRkcmVzcyB0byB0cnkgKi8KKyAgaWYoc2VsZi0+ZGlzY29faW5kZXggPCBzZWxmLT5kaXNjb19udW1iZXIpCisgICAgeworICAgICAgLyogUXVlcnkgcmVtb3RlIExNLUlBUyAqLworICAgICAgaXJpYXBfZ2V0dmFsdWVieWNsYXNzX3JlcXVlc3Qoc2VsZi0+aXJpYXAsCisJCQkJICAgIHNlbGYtPmRpc2NvdmVyaWVzW3NlbGYtPmRpc2NvX2luZGV4XS5zYWRkciwKKwkJCQkgICAgc2VsZi0+ZGlzY292ZXJpZXNbc2VsZi0+ZGlzY29faW5kZXhdLmRhZGRyLAorCQkJCSAgICBJUk5FVF9TRVJWSUNFX05BTUUsIElSTkVUX0lBU19WQUxVRSk7CisgICAgICAvKiBUaGUgYWJvdmUgcmVxdWVzdCBpcyBub24tYmxvY2tpbmcuCisgICAgICAgKiBBZnRlciBhIHdoaWxlLCBJckRBIHdpbGwgY2FsbCB1cyBiYWNrIGluIGlybmV0X2Rpc2NvdmVydmFsdWVfY29uZmlybSgpCisgICAgICAgKiBXZSB3aWxsIHRoZW4gY2FsbCBpcm5ldF9pYXNfdG9fdHNhcCgpIGFuZCBjb21lIGJhY2sgaGVyZSBhZ2Fpbi4uLiAqLworICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybigxKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZ1bmN0aW9uIGlybmV0X2Rpc2NvdmVyX2RhZGRyX2FuZF9sc2FwX3NlbCAoc2VsZikKKyAqCisgKiAgICBUaGlzIHRyeSB0byBmaW5kIGEgZGV2aWNlIHdpdGggdGhlIHJlcXVlc3RlZCBzZXJ2aWNlLgorICoKKyAqIEluaXRpYXRlIGEgVFNBUCBkaXNjb3ZlcnkgcHJvY2VkdXJlLgorICogSXQgYmFzaWNhbGx5IGxvb2sgaW50byB0aGUgZGlzY292ZXJ5IGxvZy4gRm9yIGVhY2ggYWRkcmVzcyBpbiB0aGUgbGlzdCwKKyAqIGl0IHF1ZXJpZXMgdGhlIExNLUlBUyBvZiB0aGUgZGV2aWNlIHRvIGZpbmQgaWYgdGhpcyBkZXZpY2Ugb2ZmZXIKKyAqIHRoZSByZXF1ZXN0ZWQgc2VydmljZS4KKyAqIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgbm9kZSBzdXBwb3J0aW5nIHRoZSBzZXJ2aWNlLCB3ZSBjb21wbGFpbgorICogdG8gdGhlIHVzZXIgKGl0IHNob3VsZCBtb3ZlIGRldmljZXMgYXJvdW5kKS4KKyAqIElmIHdlIGZpbmQgb25lIG5vZGUgd2hpY2ggaGF2ZSB0aGUgcmVxdWVzdGVkIFRTQVAsIHdlIGNvbm5lY3QgdG8gaXQuCisgKgorICogVGhpcyBmdW5jdGlvbiBqdXN0IHN0YXJ0IHRoZSB3aG9sZSBwcm9jZWR1cmUuIEl0IHJlcXVlc3QgdGhlIGRpc2NvdmVyeQorICogbG9nIGFuZCBzdWJtaXQgdGhlIGZpcnN0IElBUyBxdWVyeS4KKyAqIFRoZSBidWxrIG9mIHRoZSBqb2IgaXMgaGFuZGxlZCBpbiBpcm5ldF9kaXNjb3ZlcnZhbHVlX2NvbmZpcm0oKQorICoKKyAqIE5vdGUgOiB0aGlzIHByb2NlZHVyZSBmYWlscyBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGRldmljZSBpbiByYW5nZQorICogb24gdGhlIHNhbWUgZG9uZ2xlLCBiZWNhdXNlIElyTE1QIGRvZXNuJ3QgZGlzY29ubmVjdCB0aGUgTEFQIHdoZW4gdGhlCisgKiBsYXN0IExTQVAgaXMgY2xvc2VkLiBNb3Jlb3Zlciwgd2Ugd291bGQgbmVlZCB0byB3YWl0IHRoZSBMQVAKKyAqIGRpc2Nvbm5lY3Rpb24uLi4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2lybmV0X2Rpc2NvdmVyX2RhZGRyX2FuZF9sc2FwX3NlbChpcm5ldF9zb2NrZXQgKglzZWxmKQoreworICBpbnQJcmV0OworCisgIERFTlRFUihJUkRBX1NSX1RSQUNFLCAiKHNlbGY9MHglcClcbiIsIHNlbGYpOworCisgIC8qIEFzayBsbXAgZm9yIHRoZSBjdXJyZW50IGRpc2NvdmVyeSBsb2cgKi8KKyAgc2VsZi0+ZGlzY292ZXJpZXMgPSBpcmxtcF9nZXRfZGlzY292ZXJpZXMoJnNlbGYtPmRpc2NvX251bWJlciwgc2VsZi0+bWFzaywKKwkJCQkJICAgIERJU0NPVkVSWV9ERUZBVUxUX1NMT1RTKTsKKworICAvKiBDaGVjayBpZiB0aGUgd2UgZ290IHNvbWUgcmVzdWx0cyAqLworICBpZihzZWxmLT5kaXNjb3ZlcmllcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIHNlbGYtPmRpc2NvX251bWJlciA9IC0xOworICAgICAgY2xlYXJfYml0KDAsICZzZWxmLT50dHBfY29ubmVjdCk7CisgICAgICBEUkVUVVJOKC1FTkVUVU5SRUFDSCwgSVJEQV9TUl9JTkZPLCAiTm8gQ2FjaGVsb2cuLi5cbiIpOworICAgIH0KKyAgREVCVUcoSVJEQV9TUl9JTkZPLCAiR290IHRoZSBsb2cgKDB4JXApLCBzaXplIGlzICVkXG4iLAorCXNlbGYtPmRpc2NvdmVyaWVzLCBzZWxmLT5kaXNjb19udW1iZXIpOworCisgIC8qIFN0YXJ0IHdpdGggdGhlIGZpcnN0IGRpc2NvdmVyeSAqLworICBzZWxmLT5kaXNjb19pbmRleCA9IC0xOworICBzZWxmLT5kYWRkciA9IERFVl9BRERSX0FOWTsKKworICAvKiBUaGlzIHdpbGwgZmFpbCBpZiB0aGUgbG9nIGlzIGVtcHR5IC0gdGhpcyBpcyBub24tYmxvY2tpbmcgKi8KKyAgcmV0ID0gaXJuZXRfZGlzY292ZXJfbmV4dF9kYWRkcihzZWxmKTsKKyAgaWYocmV0KQorICAgIHsKKyAgICAgIC8qIENsb3NlIElBUCAqLworICAgICAgaWYoc2VsZi0+aXJpYXApCisJaXJpYXBfY2xvc2Uoc2VsZi0+aXJpYXApOworICAgICAgc2VsZi0+aXJpYXAgPSBOVUxMOworCisgICAgICAvKiBDbGVhbnVwIG91ciBjb3B5IG9mIHRoZSBkaXNjb3ZlcnkgbG9nICovCisgICAgICBrZnJlZShzZWxmLT5kaXNjb3Zlcmllcyk7CisgICAgICBzZWxmLT5kaXNjb3ZlcmllcyA9IE5VTEw7CisKKyAgICAgIGNsZWFyX2JpdCgwLCAmc2VsZi0+dHRwX2Nvbm5lY3QpOworICAgICAgRFJFVFVSTigtRU5FVFVOUkVBQ0gsIElSREFfU1JfSU5GTywgIkNhY2hlbG9nIGVtcHR5Li4uXG4iKTsKKyAgICB9CisKKyAgLyogRm9sbG93IG1lIGluIGlybmV0X2Rpc2NvdmVydmFsdWVfY29uZmlybSgpICovCisKKyAgREVYSVQoSVJEQV9TUl9UUkFDRSwgIlxuIik7CisgIHJldHVybigwKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZ1bmN0aW9uIGlybmV0X2RuYW1lX3RvX2RhZGRyIChzZWxmKQorICoKKyAqICAgIENvbnZlcnQgYW4gSXJEQSBuaWNrbmFtZSB0byBhIHZhbGlkIElyREEgYWRkcmVzcworICoKKyAqIEl0IGJhc2ljYWxseSBsb29rIGludG8gdGhlIGRpc2NvdmVyeSBsb2cgdW50aWwgdGhlcmUgaXMgYSBtYXRjaC4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2lybmV0X2RuYW1lX3RvX2RhZGRyKGlybmV0X3NvY2tldCAqCXNlbGYpCit7CisgIHN0cnVjdCBpcmRhX2RldmljZV9pbmZvICpkaXNjb3ZlcmllczsJLyogQ29weSBvZiB0aGUgZGlzY292ZXJ5IGxvZyAqLworICBpbnQJbnVtYmVyOwkJCS8qIE51bWJlciBvZiBub2RlcyBpbiB0aGUgbG9nICovCisgIGludAlpOworCisgIERFTlRFUihJUkRBX1NSX1RSQUNFLCAiKHNlbGY9MHglcClcbiIsIHNlbGYpOworCisgIC8qIEFzayBsbXAgZm9yIHRoZSBjdXJyZW50IGRpc2NvdmVyeSBsb2cgKi8KKyAgZGlzY292ZXJpZXMgPSBpcmxtcF9nZXRfZGlzY292ZXJpZXMoJm51bWJlciwgMHhmZmZmLAorCQkJCSAgICAgIERJU0NPVkVSWV9ERUZBVUxUX1NMT1RTKTsKKyAgLyogQ2hlY2sgaWYgdGhlIHdlIGdvdCBzb21lIHJlc3VsdHMgKi8KKyAgaWYoZGlzY292ZXJpZXMgPT0gTlVMTCkKKyAgICBEUkVUVVJOKC1FTkVUVU5SRUFDSCwgSVJEQV9TUl9JTkZPLCAiQ2FjaGVsb2cgZW1wdHkuLi5cbiIpOworCisgIC8qIAorICAgKiBOb3csIGNoZWNrIGFsbCBkaXNjb3ZlcmVkIGRldmljZXMgKGlmIGFueSksIGFuZCBjb25uZWN0CisgICAqIGNsaWVudCBvbmx5IGFib3V0IHRoZSBzZXJ2aWNlcyB0aGF0IHRoZSBjbGllbnQgaXMKKyAgICogaW50ZXJlc3RlZCBpbi4uLgorICAgKi8KKyAgZm9yKGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCisgICAgeworICAgICAgLyogRG9lcyB0aGUgbmFtZSBtYXRjaCA/ICovCisgICAgICBpZighc3RybmNtcChkaXNjb3Zlcmllc1tpXS5pbmZvLCBzZWxmLT5ybmFtZSwgTklDS05BTUVfTUFYX0xFTikpCisJeworCSAgLyogWWVzICEhISBHZXQgaXQuLiAqLworCSAgc2VsZi0+ZGFkZHIgPSBkaXNjb3Zlcmllc1tpXS5kYWRkcjsKKwkgIERFQlVHKElSREFfU1JfSU5GTywgImRpc2NvdmVyZWQgZGV2aWNlIGBgJXMnJyBhdCBhZGRyZXNzIDB4JTA4eC5cbiIsCisJCXNlbGYtPnJuYW1lLCBzZWxmLT5kYWRkcik7CisJICBrZnJlZShkaXNjb3Zlcmllcyk7CisJICBERVhJVChJUkRBX1NSX1RSQUNFLCAiXG4iKTsKKwkgIHJldHVybiAwOworCX0KKyAgICB9CisgIC8qIE5vIGx1Y2sgISAqLworICBERUJVRyhJUkRBX1NSX0lORk8sICJjYW5ub3QgZGlzY292ZXIgZGV2aWNlIGBgJXMnJyAhISFcbiIsIHNlbGYtPnJuYW1lKTsKKyAga2ZyZWUoZGlzY292ZXJpZXMpOworICByZXR1cm4oLUVBRERSTk9UQVZBSUwpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIFNPQ0tFVCBST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFRoaXMgYXJlIHRoZSBtYWluIG9wZXJhdGlvbnMgb24gSXJORVQgc29ja2V0cywgYmFzaWNhbGx5IHRvIGNyZWF0ZQorICogYW5kIGRlc3Ryb3kgSXJORVQgc29ja2V0cy4gVGhlc2UgYXJlIGNhbGxlZCBmcm9tIHRoZSBQUFAgcGFydC4uLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBDcmVhdGUgYSBJck5FVCBpbnN0YW5jZSA6IGp1c3QgaW5pdGlhbGlzZSBzb21lIHBhcmFtZXRlcnMuLi4KKyAqLworaW50CitpcmRhX2lybmV0X2NyZWF0ZShpcm5ldF9zb2NrZXQgKglzZWxmKQoreworICBERU5URVIoSVJEQV9TT0NLX1RSQUNFLCAiKHNlbGY9MHglcClcbiIsIHNlbGYpOworCisgIHNlbGYtPm1hZ2ljID0gSVJORVRfTUFHSUM7CS8qIFBhcmFub2lhICovCisKKyAgc2VsZi0+dHRwX29wZW4gPSAwOwkJLyogUHJldmVudCBoaWdoZXIgbGF5ZXIgZnJvbSBhY2Nlc3NpbmcgSXJUVFAgKi8KKyAgc2VsZi0+dHRwX2Nvbm5lY3QgPSAwOwkvKiBOb3QgY29ubmVjdGluZyB5ZXQgKi8KKyAgc2VsZi0+cm5hbWVbMF0gPSAnXDAnOwkvKiBNYXkgYmUgc2V0IHZpYSBjb250cm9sIGNoYW5uZWwgKi8KKyAgc2VsZi0+cmRhZGRyID0gREVWX0FERFJfQU5ZOwkvKiBNYXkgYmUgc2V0IHZpYSBjb250cm9sIGNoYW5uZWwgKi8KKyAgc2VsZi0+cnNhZGRyID0gREVWX0FERFJfQU5ZOwkvKiBNYXkgYmUgc2V0IHZpYSBjb250cm9sIGNoYW5uZWwgKi8KKyAgc2VsZi0+ZGFkZHIgPSBERVZfQUREUl9BTlk7CS8qIFVudGlsIHdlIGdldCBjb25uZWN0ZWQgKi8KKyAgc2VsZi0+c2FkZHIgPSBERVZfQUREUl9BTlk7CS8qIFVudGlsIHdlIGdldCBjb25uZWN0ZWQgKi8KKyAgc2VsZi0+bWF4X3NkdV9zaXplX3J4ID0gVFRQX1NBUl9VTkJPVU5EOworCisgIC8qIFJlZ2lzdGVyIGFzIGEgY2xpZW50IHdpdGggSXJMTVAgKi8KKyAgc2VsZi0+Y2tleSA9IGlybG1wX3JlZ2lzdGVyX2NsaWVudCgwLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyNpZmRlZiBESVNDT1ZFUllfTk9NQVNLCisgIHNlbGYtPm1hc2sgPSAweGZmZmY7CQkvKiBGb3IgVzJrIGNvbXBhdGliaWxpdHkgKi8KKyNlbHNlIC8qIERJU0NPVkVSWV9OT01BU0sgKi8KKyAgc2VsZi0+bWFzayA9IGlybG1wX3NlcnZpY2VfdG9faGludChTX0xBTik7CisjZW5kaWYgLyogRElTQ09WRVJZX05PTUFTSyAqLworICBzZWxmLT50eF9mbG93ID0gRkxPV19TVEFSVDsJLyogRmxvdyBjb250cm9sIGZyb20gSXJUVFAgKi8KKworICBERVhJVChJUkRBX1NPQ0tfVFJBQ0UsICJcbiIpOworICByZXR1cm4oMCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBDb25uZWN0IHRvIHRoZSBvdGhlciBzaWRlIDoKKyAqCW8gY29udmVydCBkZXZpY2UgbmFtZSB0byBhbiBhZGRyZXNzCisgKglvIGZpbmQgdGhlIHNvY2tldCBudW1iZXIgKGRsc2FwKQorICoJbyBFc3RhYmxpc2ggdGhlIGNvbm5lY3Rpb24KKyAqCisgKiBOb3RlIDogV2Ugbm8gbG9uZ2VyIG1pbWljIGFmX2lyZGEuIFRoZSBJQVMgcXVlcnkgZm9yIGZpbmRpbmcgdGhlIFRTQVAKKyAqIGlzIGRvbmUgYXN5bmNocm9ub3VzbHksIGxpa2UgdGhlIFRUUCBjb25uZWN0aW9uLiBUaGlzIGFsbG93IHVzIHRvCisgKiBjYWxsIHRoaXMgZnVuY3Rpb24gZnJvbSBhbnkgY29udGV4dCAobm90IG9ubHkgcHJvY2VzcykuCisgKiBUaGUgZG93bnNpZGUgaXMgdGhhdCBmb2xsb3dpbmcgd2hhdCdzIGhhcHBlbmluZyBpbiB0aGVyZSBpcyB0cmlja3kKKyAqIGJlY2F1c2UgaXQgaW52b2x2ZSB2YXJpb3VzIGZ1bmN0aW9ucyBhbGwgb3ZlciB0aGUgcGxhY2UuLi4KKyAqLworaW50CitpcmRhX2lybmV0X2Nvbm5lY3QoaXJuZXRfc29ja2V0ICoJc2VsZikKK3sKKyAgaW50CQllcnI7CisKKyAgREVOVEVSKElSREFfU09DS19UUkFDRSwgIihzZWxmPTB4JXApXG4iLCBzZWxmKTsKKworICAvKiBDaGVjayBpZiB3ZSBhcmUgYWxyZWFkeSB0cnlpbmcgdG8gY29ubmVjdC4KKyAgICogQmVjYXVzZSBpcmRhX2lybmV0X2Nvbm5lY3QoKSBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IHBwcGQgcGx1cworICAgKiBwYWNrZXQgcmV0cmllcyBpbiBwcHBfZ2VuZXJpYyBhbmQgY29ubmVjdCBtYXkgdGFrZSB0aW1lLCBwbHVzIHdlIG1heQorICAgKiByYWNlIHdpdGggaXJuZXRfY29ubmVjdF9pbmRpY2F0aW9uKCksIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCB0aGVyZS4uLiAqLworICBpZih0ZXN0X2FuZF9zZXRfYml0KDAsICZzZWxmLT50dHBfY29ubmVjdCkpCisgICAgRFJFVFVSTigtRUJVU1ksIElSREFfU09DS19JTkZPLCAiQWxyZWFkeSBjb25uZWN0aW5nLi4uXG4iKTsKKyAgaWYoKHNlbGYtPmlyaWFwICE9IE5VTEwpIHx8IChzZWxmLT50c2FwICE9IE5VTEwpKQorICAgIERFUlJPUihJUkRBX1NPQ0tfRVJST1IsICJTb2NrZXQgbm90IGNsZWFuZWQgdXAuLi5cbiIpOworCisgIC8qIEluc2VydCBvdXJzZWx2ZXMgaW4gdGhlIGhhc2hiaW4gc28gdGhhdCB0aGUgSXJORVQgc2VydmVyIGNhbiBmaW5kIHVzLgorICAgKiBOb3RlcyA6IDR0aCBhcmcgaXMgc3RyaW5nIG9mIDMyIGNoYXIgbWF4IGFuZCBtdXN0IGJlIG51bGwgdGVybWluYXRlZAorICAgKgkgICAgIFdoZW4gNHRoIGFyZyBpcyB1c2VkIChzdHJpbmcpLCAzcmQgYXJnIGlzbid0IChpbnQpCisgICAqCSAgICAgQ2FuJ3QgcmUtaW5zZXJ0IChNVVNUIHJlbW92ZSBmaXJzdCkgc28gY2hlY2sgZm9yIHRoYXQuLi4gKi8KKyAgaWYoKGlybmV0X3NlcnZlci5ydW5uaW5nKSAmJiAoc2VsZi0+cS5xX25leHQgPT0gTlVMTCkpCisgICAgeworICAgICAgc3Bpbl9sb2NrX2JoKCZpcm5ldF9zZXJ2ZXIuc3BpbmxvY2spOworICAgICAgaGFzaGJpbl9pbnNlcnQoaXJuZXRfc2VydmVyLmxpc3QsIChpcmRhX3F1ZXVlX3QgKikgc2VsZiwgMCwgc2VsZi0+cm5hbWUpOworICAgICAgc3Bpbl91bmxvY2tfYmgoJmlybmV0X3NlcnZlci5zcGlubG9jayk7CisgICAgICBERUJVRyhJUkRBX1NPQ0tfSU5GTywgIkluc2VydGVkIGBgJXMnJyBpbiBoYXNoYmluLi4uXG4iLCBzZWxmLT5ybmFtZSk7CisgICAgfQorCisgIC8qIElmIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgKG5vIGFkZHJlc3MsIG5vIG5hbWUpICovCisgIGlmKChzZWxmLT5yZGFkZHIgPT0gREVWX0FERFJfQU5ZKSAmJiAoc2VsZi0+cm5hbWVbMF0gPT0gJ1wwJykpCisgICAgeworICAgICAgLyogVHJ5IHRvIGZpbmQgYSBzdWl0YWJsZSBhZGRyZXNzICovCisgICAgICBpZigoZXJyID0gaXJuZXRfZGlzY292ZXJfZGFkZHJfYW5kX2xzYXBfc2VsKHNlbGYpKSAhPSAwKQorCURSRVRVUk4oZXJyLCBJUkRBX1NPQ0tfSU5GTywgImF1dG8tY29ubmVjdCBmYWlsZWQhXG4iKTsKKyAgICAgIC8qIEluIG1vc3QgY2FzZXMsIHRoZSBjYWxsIGFib3ZlIGlzIG5vbi1ibG9ja2luZyAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIElmIHdlIGhhdmUgb25seSB0aGUgbmFtZSAobm8gYWRkcmVzcyksIHRyeSB0byBnZXQgYW4gYWRkcmVzcyAqLworICAgICAgaWYoc2VsZi0+cmRhZGRyID09IERFVl9BRERSX0FOWSkKKwl7CisJICBpZigoZXJyID0gaXJuZXRfZG5hbWVfdG9fZGFkZHIoc2VsZikpICE9IDApCisJICAgIERSRVRVUk4oZXJyLCBJUkRBX1NPQ0tfSU5GTywgIm5hbWUgY29ubmVjdCBmYWlsZWQhXG4iKTsKKwl9CisgICAgICBlbHNlCisJLyogVXNlIHRoZSByZXF1ZXN0ZWQgZGVzdGluYXRpb24gYWRkcmVzcyAqLworCXNlbGYtPmRhZGRyID0gc2VsZi0+cmRhZGRyOworCisgICAgICAvKiBRdWVyeSByZW1vdGUgTE0tSUFTIHRvIGZpbmQgTFNBUCBzZWxlY3RvciAqLworICAgICAgaXJuZXRfZmluZF9sc2FwX3NlbChzZWxmKTsKKyAgICAgIC8qIFRoZSBhYm92ZSBjYWxsIGlzIG5vbiBibG9ja2luZyAqLworICAgIH0KKworICAvKiBBdCB0aGlzIHBvaW50LCB3ZSBhcmUgd2FpdGluZyBmb3IgdGhlIElyREEgc3RhY2sgdG8gY2FsbCB1cyBiYWNrLAorICAgKiBvciB3ZSBoYXZlIGFscmVhZHkgZmFpbGVkLgorICAgKiBXZSB3aWxsIGZpbmlzaCB0aGUgY29ubmVjdGlvbiBwcm9jZWR1cmUgaW4gaXJuZXRfY29ubmVjdF90c2FwKCkuCisgICAqLworICBERVhJVChJUkRBX1NPQ0tfVFJBQ0UsICJcbiIpOworICByZXR1cm4oMCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiBpcmRhX2lybmV0X2Rlc3Ryb3koc2VsZikKKyAqCisgKiAgICBEZXN0cm95IGlybmV0IGluc3RhbmNlCisgKgorICogTm90ZSA6IHRoaXMgbmVlZCB0byBiZSBjYWxsZWQgZnJvbSBhIHByb2Nlc3MgY29udGV4dC4KKyAqLwordm9pZAoraXJkYV9pcm5ldF9kZXN0cm95KGlybmV0X3NvY2tldCAqCXNlbGYpCit7CisgIERFTlRFUihJUkRBX1NPQ0tfVFJBQ0UsICIoc2VsZj0weCVwKVxuIiwgc2VsZik7CisgIGlmKHNlbGYgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgLyogUmVtb3ZlIG91cnNlbHZlcyBmcm9tIGhhc2hiaW4gKGlmIHdlIGFyZSBxdWV1ZWQgaW4gaGFzaGJpbikKKyAgICogTm90ZSA6IGBpcm5ldF9zZXJ2ZXIucnVubmluZycgcHJvdGVjdCB1cyBmcm9tIGNhbGxzIGluIGhhc2hiaW5fZGVsZXRlKCkgKi8KKyAgaWYoKGlybmV0X3NlcnZlci5ydW5uaW5nKSAmJiAoc2VsZi0+cS5xX25leHQgIT0gTlVMTCkpCisgICAgeworICAgICAgc3RydWN0IGlybmV0X3NvY2tldCAqCWVudHJ5OworICAgICAgREVCVUcoSVJEQV9TT0NLX0lORk8sICJSZW1vdmluZyBmcm9tIGhhc2guLlxuIik7CisgICAgICBzcGluX2xvY2tfYmgoJmlybmV0X3NlcnZlci5zcGlubG9jayk7CisgICAgICBlbnRyeSA9IGhhc2hiaW5fcmVtb3ZlX3RoaXMoaXJuZXRfc2VydmVyLmxpc3QsIChpcmRhX3F1ZXVlX3QgKikgc2VsZik7CisgICAgICBzZWxmLT5xLnFfbmV4dCA9IE5VTEw7CisgICAgICBzcGluX3VubG9ja19iaCgmaXJuZXRfc2VydmVyLnNwaW5sb2NrKTsKKyAgICAgIERBU1NFUlQoZW50cnkgPT0gc2VsZiwgLCBJUkRBX1NPQ0tfRVJST1IsICJDYW4ndCByZW1vdmUgZnJvbSBoYXNoLlxuIik7CisgICAgfQorCisgIC8qIElmIHdlIHdlcmUgY29ubmVjdGVkLCBwb3N0IGEgbWVzc2FnZSAqLworICBpZih0ZXN0X2JpdCgwLCAmc2VsZi0+dHRwX29wZW4pKQorICAgIHsKKyAgICAgIC8qIE5vdGUgOiBhcyB0aGUgZGlzY29ubmVjdCBjb21lcyBmcm9tIHBwcF9nZW5lcmljLCB0aGUgdW5pdCBudW1iZXIKKyAgICAgICAqIGRvZXNuJ3QgZXhpc3QgYW55bW9yZSB3aGVuIHdlIHBvc3QgdGhlIGV2ZW50LCBzbyB3ZSBuZWVkIHRvIHBhc3MKKyAgICAgICAqIE5VTEwgYXMgdGhlIGZpcnN0IGFyZy4uLiAqLworICAgICAgaXJuZXRfcG9zdF9ldmVudChOVUxMLCBJUk5FVF9ESVNDT05ORUNUX1RPLAorCQkgICAgICAgc2VsZi0+c2FkZHIsIHNlbGYtPmRhZGRyLCBzZWxmLT5ybmFtZSwgMCk7CisgICAgfQorCisgIC8qIFByZXZlbnQgdmFyaW91cyBJckRBIGNhbGxiYWNrcyBmcm9tIG1lc3NpbmcgdXAgdGhpbmdzCisgICAqIE5lZWQgdG8gYmUgZmlyc3QgKi8KKyAgY2xlYXJfYml0KDAsICZzZWxmLT50dHBfY29ubmVjdCk7CisKKyAgLyogUHJldmVudCBoaWdoZXIgbGF5ZXIgZnJvbSBhY2Nlc3NpbmcgSXJUVFAgKi8KKyAgY2xlYXJfYml0KDAsICZzZWxmLT50dHBfb3Blbik7CisKKyAgLyogVW5yZWdpc3RlciB3aXRoIElyTE1QICovCisgIGlybG1wX3VucmVnaXN0ZXJfY2xpZW50KHNlbGYtPmNrZXkpOworCisgIC8qIFVucmVnaXN0ZXIgd2l0aCBMTS1JQVMgKi8KKyAgaWYoc2VsZi0+aXJpYXApCisgICAgeyAKKyAgICAgIGlyaWFwX2Nsb3NlKHNlbGYtPmlyaWFwKTsKKyAgICAgIHNlbGYtPmlyaWFwID0gTlVMTDsKKyAgICB9CisKKyAgLyogQ2xlYW51cCBldmVudHVhbCBkaXNjb3ZlcmllcyBmcm9tIGNvbm5lY3Rpb24gYXR0ZW1wdCBvciBjb250cm9sIGNoYW5uZWwgKi8KKyAgaWYoc2VsZi0+ZGlzY292ZXJpZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBDbGVhbnVwIG91ciBjb3B5IG9mIHRoZSBkaXNjb3ZlcnkgbG9nICovCisgICAgICBrZnJlZShzZWxmLT5kaXNjb3Zlcmllcyk7CisgICAgICBzZWxmLT5kaXNjb3ZlcmllcyA9IE5VTEw7CisgICAgfQorCisgIC8qIENsb3NlIG91ciBJclRUUCBjb25uZWN0aW9uICovCisgIGlmKHNlbGYtPnRzYXApCisgICAgeworICAgICAgREVCVUcoSVJEQV9TT0NLX0lORk8sICJDbG9zaW5nIG91ciBUVFAgY29ubmVjdGlvbi5cbiIpOworICAgICAgaXJ0dHBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYtPnRzYXAsIE5VTEwsIFBfTk9STUFMKTsKKyAgICAgIGlydHRwX2Nsb3NlX3RzYXAoc2VsZi0+dHNhcCk7CisgICAgICBzZWxmLT50c2FwID0gTlVMTDsKKyAgICB9CisgIHNlbGYtPnN0c2FwX3NlbCA9IDA7CisKKyAgREVYSVQoSVJEQV9TT0NLX1RSQUNFLCAiXG4iKTsKKyAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBTRVJWRVIgU09DS0VUICoqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFRoZSBJck5FVCBzZXJ2aWNlIGlzIGNvbXBvc2VkIG9mIG9uZSBzZXJ2ZXIgc29ja2V0IGFuZCBhIHZhcmlhYmxlCisgKiBudW1iZXIgb2YgcmVndWxhciBJck5FVCBzb2NrZXRzLiBUaGUgc2VydmVyIHNvY2tldCBpcyBzdXBwb3NlZCB0bworICogaGFuZGxlIGluY29taW5nIGNvbm5lY3Rpb25zIGFuZCByZWRpcmVjdCB0aGVtIHRvIG9uZSBJck5FVCBzb2NrZXRzLgorICogSXQncyBhIHN1cGVyc2V0IG9mIHRoZSByZWd1bGFyIElyTkVUIHNvY2tldCwgYnV0IGhhcyBhIHZlcnkgZGlzdGluY3QKKyAqIGJlaGF2aW91ci4uLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiBpcm5ldF9kYWRkcl90b19kbmFtZSAoc2VsZikKKyAqCisgKiAgICBDb252ZXJ0IGFuIElyREEgYWRkcmVzcyB0byBhIElyREEgbmlja25hbWUKKyAqCisgKiBJdCBiYXNpY2FsbHkgbG9vayBpbnRvIHRoZSBkaXNjb3ZlcnkgbG9nIHVudGlsIHRoZXJlIGlzIGEgbWF0Y2guCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citpcm5ldF9kYWRkcl90b19kbmFtZShpcm5ldF9zb2NrZXQgKglzZWxmKQoreworICBzdHJ1Y3QgaXJkYV9kZXZpY2VfaW5mbyAqZGlzY292ZXJpZXM7CS8qIENvcHkgb2YgdGhlIGRpc2NvdmVyeSBsb2cgKi8KKyAgaW50CW51bWJlcjsJCQkvKiBOdW1iZXIgb2Ygbm9kZXMgaW4gdGhlIGxvZyAqLworICBpbnQJaTsKKworICBERU5URVIoSVJEQV9TRVJWX1RSQUNFLCAiKHNlbGY9MHglcClcbiIsIHNlbGYpOworCisgIC8qIEFzayBsbXAgZm9yIHRoZSBjdXJyZW50IGRpc2NvdmVyeSBsb2cgKi8KKyAgZGlzY292ZXJpZXMgPSBpcmxtcF9nZXRfZGlzY292ZXJpZXMoJm51bWJlciwgMHhmZmZmLAorCQkJCSAgICAgIERJU0NPVkVSWV9ERUZBVUxUX1NMT1RTKTsKKyAgLyogQ2hlY2sgaWYgdGhlIHdlIGdvdCBzb21lIHJlc3VsdHMgKi8KKyAgaWYgKGRpc2NvdmVyaWVzID09IE5VTEwpCisgICAgRFJFVFVSTigtRU5FVFVOUkVBQ0gsIElSREFfU0VSVl9JTkZPLCAiQ2FjaGVsb2cgZW1wdHkuLi5cbiIpOworCisgIC8qIE5vdywgY2hlY2sgYWxsIGRpc2NvdmVyZWQgZGV2aWNlcyAoaWYgYW55KSAqLworICBmb3IoaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKKyAgICB7CisgICAgICAvKiBEb2VzIHRoZSBuYW1lIG1hdGNoID8gKi8KKyAgICAgIGlmKGRpc2NvdmVyaWVzW2ldLmRhZGRyID09IHNlbGYtPmRhZGRyKQorCXsKKwkgIC8qIFllcyAhISEgR2V0IGl0Li4gKi8KKwkgIHN0cmxjcHkoc2VsZi0+cm5hbWUsIGRpc2NvdmVyaWVzW2ldLmluZm8sIHNpemVvZihzZWxmLT5ybmFtZSkpOworCSAgc2VsZi0+cm5hbWVbTklDS05BTUVfTUFYX0xFTiArIDFdID0gJ1wwJzsKKwkgIERFQlVHKElSREFfU0VSVl9JTkZPLCAiRGV2aWNlIDB4JTA4eCBpcyBpbiBmYWN0IGBgJXMnJy5cbiIsCisJCXNlbGYtPmRhZGRyLCBzZWxmLT5ybmFtZSk7CisJICBrZnJlZShkaXNjb3Zlcmllcyk7CisJICBERVhJVChJUkRBX1NFUlZfVFJBQ0UsICJcbiIpOworCSAgcmV0dXJuIDA7CisJfQorICAgIH0KKyAgLyogTm8gbHVjayAhICovCisgIERFWElUKElSREFfU0VSVl9JTkZPLCAiOiBjYW5ub3QgZGlzY292ZXIgZGV2aWNlIDB4JTA4eCAhISFcbiIsIHNlbGYtPmRhZGRyKTsKKyAga2ZyZWUoZGlzY292ZXJpZXMpOworICByZXR1cm4oLUVBRERSTk9UQVZBSUwpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJkYV9maW5kX3NvY2tldCAoc2VsZikKKyAqCisgKiAgICBGaW5kIHRoZSBjb3JyZWN0IElyTkVUIHNvY2tldAorICoKKyAqIExvb2sgaW50byB0aGUgbGlzdCBvZiBJck5FVCBzb2NrZXRzIGFuZCBmaW5kcyBvbmUgd2l0aCB0aGUgcmlnaHQKKyAqIHByb3BlcnRpZXMuLi4KKyAqLworc3RhdGljIGlubGluZSBpcm5ldF9zb2NrZXQgKgoraXJuZXRfZmluZF9zb2NrZXQoaXJuZXRfc29ja2V0ICoJc2VsZikKK3sKKyAgaXJuZXRfc29ja2V0ICoJbmV3ID0gKGlybmV0X3NvY2tldCAqKSBOVUxMOworICBpbnQJCQllcnI7CisKKyAgREVOVEVSKElSREFfU0VSVl9UUkFDRSwgIihzZWxmPTB4JXApXG4iLCBzZWxmKTsKKworICAvKiBHZXQgdGhlIGFkZHJlc3NlcyBvZiB0aGUgcmVxdWVzdGVyICovCisgIHNlbGYtPmRhZGRyID0gaXJ0dHBfZ2V0X2RhZGRyKHNlbGYtPnRzYXApOworICBzZWxmLT5zYWRkciA9IGlydHRwX2dldF9zYWRkcihzZWxmLT50c2FwKTsKKworICAvKiBUcnkgdG8gZ2V0IHRoZSBJckRBIG5pY2tuYW1lIG9mIHRoZSByZXF1ZXN0ZXIgKi8KKyAgZXJyID0gaXJuZXRfZGFkZHJfdG9fZG5hbWUoc2VsZik7CisKKyAgLyogUHJvdGVjdCBhY2Nlc3MgdG8gdGhlIGluc3RhbmNlIGxpc3QgKi8KKyAgc3Bpbl9sb2NrX2JoKCZpcm5ldF9zZXJ2ZXIuc3BpbmxvY2spOworCisgIC8qIFNvIG5vdywgdHJ5IHRvIGdldCBhbiBzb2NrZXQgaGF2aW5nIHNwZWNpZmljYWxseQorICAgKiByZXF1ZXN0ZWQgdGhhdCBuaWNrbmFtZSAqLworICBpZihlcnIgPT0gMCkKKyAgICB7CisgICAgICBuZXcgPSAoaXJuZXRfc29ja2V0ICopIGhhc2hiaW5fZmluZChpcm5ldF9zZXJ2ZXIubGlzdCwKKwkJCQkJICAwLCBzZWxmLT5ybmFtZSk7CisgICAgICBpZihuZXcpCisJREVCVUcoSVJEQV9TRVJWX0lORk8sICJTb2NrZXQgMHglcCBtYXRjaGVzIHJuYW1lIGBgJXMnJy5cbiIsCisJICAgICAgbmV3LCBuZXctPnJuYW1lKTsKKyAgICB9CisKKyAgLyogSWYgbm8gbmFtZSBtYXRjaGVzLCB0cnkgdG8gZmluZCBhbiBzb2NrZXQgYnkgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKyAgLyogSXQgY2FuIGJlIGVpdGhlciB0aGUgcmVxdWVzdGVkIGRlc3RpbmF0aW9uIGFkZHJlc3MgKHNldCB2aWEgdGhlCisgICAqIGNvbnRyb2wgY2hhbm5lbCksIG9yIHRoZSBjdXJyZW50IGRlc3RpbmF0aW9uIGFkZHJlc3MgaWYgdGhlCisgICAqIHNvY2tldCBpcyBpbiB0aGUgbWlkZGxlIG9mIGEgY29ubmVjdGlvbiByZXF1ZXN0ICovCisgIGlmKG5ldyA9PSAoaXJuZXRfc29ja2V0ICopIE5VTEwpCisgICAgeworICAgICAgbmV3ID0gKGlybmV0X3NvY2tldCAqKSBoYXNoYmluX2dldF9maXJzdChpcm5ldF9zZXJ2ZXIubGlzdCk7CisgICAgICB3aGlsZShuZXcgIT0oaXJuZXRfc29ja2V0ICopIE5VTEwpCisJeworCSAgLyogRG9lcyBpdCBoYXZlIHRoZSBzYW1lIGFkZHJlc3MgPyAqLworCSAgaWYoKG5ldy0+cmRhZGRyID09IHNlbGYtPmRhZGRyKSB8fCAobmV3LT5kYWRkciA9PSBzZWxmLT5kYWRkcikpCisJICAgIHsKKwkgICAgICAvKiBZZXMgISEhIEdldCBpdC4uICovCisJICAgICAgREVCVUcoSVJEQV9TRVJWX0lORk8sICJTb2NrZXQgMHglcCBtYXRjaGVzIGRhZGRyICUjMDh4LlxuIiwKKwkJICAgIG5ldywgc2VsZi0+ZGFkZHIpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBuZXcgPSAoaXJuZXRfc29ja2V0ICopIGhhc2hiaW5fZ2V0X25leHQoaXJuZXRfc2VydmVyLmxpc3QpOworCX0KKyAgICB9CisKKyAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgc29ja2V0LCBnZXQgdGhlIGZpcnN0IHVuY29ubmVjdGVkIHNvY2tldCAqLworICBpZihuZXcgPT0gKGlybmV0X3NvY2tldCAqKSBOVUxMKQorICAgIHsKKyAgICAgIG5ldyA9IChpcm5ldF9zb2NrZXQgKikgaGFzaGJpbl9nZXRfZmlyc3QoaXJuZXRfc2VydmVyLmxpc3QpOworICAgICAgd2hpbGUobmV3ICE9KGlybmV0X3NvY2tldCAqKSBOVUxMKQorCXsKKwkgIC8qIElzIGl0IGF2YWlsYWJsZSA/ICovCisJICBpZighKHRlc3RfYml0KDAsICZuZXctPnR0cF9vcGVuKSkgJiYgKG5ldy0+cmRhZGRyID09IERFVl9BRERSX0FOWSkgJiYKKwkgICAgIChuZXctPnJuYW1lWzBdID09ICdcMCcpICYmIChuZXctPnBwcF9vcGVuKSkKKwkgICAgeworCSAgICAgIC8qIFllcyAhISEgR2V0IGl0Li4gKi8KKwkgICAgICBERUJVRyhJUkRBX1NFUlZfSU5GTywgIlNvY2tldCAweCVwIGlzIGZyZWUuXG4iLAorCQkgICAgbmV3KTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgbmV3ID0gKGlybmV0X3NvY2tldCAqKSBoYXNoYmluX2dldF9uZXh0KGlybmV0X3NlcnZlci5saXN0KTsKKwl9CisgICAgfQorCisgIC8qIFNwaW4gbG9jayBlbmQgKi8KKyAgc3Bpbl91bmxvY2tfYmgoJmlybmV0X3NlcnZlci5zcGlubG9jayk7CisKKyAgREVYSVQoSVJEQV9TRVJWX1RSQUNFLCAiIC0gbmV3ID0gMHglcFxuIiwgbmV3KTsKKyAgcmV0dXJuIG5ldzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfY29ubmVjdF9zb2NrZXQgKHNlbGYpCisgKgorICogICAgQ29ubmVjdCBhbiBpbmNvbWluZyBjb25uZWN0aW9uIHRvIHRoZSBzb2NrZXQKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citpcm5ldF9jb25uZWN0X3NvY2tldChpcm5ldF9zb2NrZXQgKglzZXJ2ZXIsCisJCSAgICAgaXJuZXRfc29ja2V0ICoJbmV3LAorCQkgICAgIHN0cnVjdCBxb3NfaW5mbyAqCXFvcywKKwkJICAgICBfX3UzMgkJbWF4X3NkdV9zaXplLAorCQkgICAgIF9fdTgJCW1heF9oZWFkZXJfc2l6ZSkKK3sKKyAgREVOVEVSKElSREFfU0VSVl9UUkFDRSwgIihzZXJ2ZXI9MHglcCwgbmV3PTB4JXApXG4iLAorCSBzZXJ2ZXIsIG5ldyk7CisKKyAgLyogTm93IGF0dGFjaCB1cCB0aGUgbmV3IHNvY2tldCAqLworICBuZXctPnRzYXAgPSBpcnR0cF9kdXAoc2VydmVyLT50c2FwLCBuZXcpOworICBEQUJPUlQobmV3LT50c2FwID09IE5VTEwsIC0xLCBJUkRBX1NFUlZfRVJST1IsICJkdXAgZmFpbGVkIVxuIik7CisKKyAgLyogU2V0IHVwIGFsbCB0aGUgcmVsZXZhbnQgcGFyYW1ldGVycyBvbiB0aGUgbmV3IHNvY2tldCAqLworICBuZXctPnN0c2FwX3NlbCA9IG5ldy0+dHNhcC0+c3RzYXBfc2VsOworICBuZXctPmR0c2FwX3NlbCA9IG5ldy0+dHNhcC0+ZHRzYXBfc2VsOworICBuZXctPnNhZGRyID0gaXJ0dHBfZ2V0X3NhZGRyKG5ldy0+dHNhcCk7CisgIG5ldy0+ZGFkZHIgPSBpcnR0cF9nZXRfZGFkZHIobmV3LT50c2FwKTsKKworICBuZXctPm1heF9oZWFkZXJfc2l6ZSA9IG1heF9oZWFkZXJfc2l6ZTsKKyAgbmV3LT5tYXhfc2R1X3NpemVfdHggPSBtYXhfc2R1X3NpemU7CisgIG5ldy0+bWF4X2RhdGFfc2l6ZSAgID0gbWF4X3NkdV9zaXplOworI2lmZGVmIFNUUkVBTV9DT01QQVQKKyAgLyogSWYgd2Ugd2FudCB0byByZWNlaXZlICJzdHJlYW0gc29ja2V0cyIgKi8KKyAgaWYobWF4X3NkdV9zaXplID09IDApCisgICAgbmV3LT5tYXhfZGF0YV9zaXplID0gaXJ0dHBfZ2V0X21heF9zZWdfc2l6ZShuZXctPnRzYXApOworI2VuZGlmIC8qIFNUUkVBTV9DT01QQVQgKi8KKworICAvKiBDbGVhbiB1cCB0aGUgb3JpZ2luYWwgb25lIHRvIGtlZXAgaXQgaW4gbGlzdGVuIHN0YXRlICovCisgIGlydHRwX2xpc3RlbihzZXJ2ZXItPnRzYXApOworCisgIC8qIFNlbmQgYSBjb25uZWN0aW9uIHJlc3BvbnNlIG9uIHRoZSBuZXcgc29ja2V0ICovCisgIGlydHRwX2Nvbm5lY3RfcmVzcG9uc2UobmV3LT50c2FwLCBuZXctPm1heF9zZHVfc2l6ZV9yeCwgTlVMTCk7CisKKyAgLyogQWxsb3cgUFBQIHRvIHNlbmQgaXRzIGp1bmsgb3ZlciB0aGUgbmV3IHNvY2tldC4uLiAqLworICBzZXRfYml0KDAsICZuZXctPnR0cF9vcGVuKTsKKworICAvKiBOb3QgY29ubmVjdGluZyBhbnltb3JlLCBhbmQgY2xlYW4gdXAgbGFzdCBwb3NzaWJsZSByZW1haW5zCisgICAqIG9mIGNvbm5lY3Rpb24gYXR0ZW1wdHMgb24gdGhlIHNvY2tldCAqLworICBjbGVhcl9iaXQoMCwgJm5ldy0+dHRwX2Nvbm5lY3QpOworICBpZihuZXctPmlyaWFwKQorICAgIHsKKyAgICAgIGlyaWFwX2Nsb3NlKG5ldy0+aXJpYXApOworICAgICAgbmV3LT5pcmlhcCA9IE5VTEw7CisgICAgfQorICBpZihuZXctPmRpc2NvdmVyaWVzICE9IE5VTEwpCisgICAgeworICAgICAga2ZyZWUobmV3LT5kaXNjb3Zlcmllcyk7CisgICAgICBuZXctPmRpc2NvdmVyaWVzID0gTlVMTDsKKyAgICB9CisKKyNpZmRlZiBDT05ORUNUX0lORElDX0tJQ0sKKyAgLyogQXMgY3VycmVudGx5IHdlIGRvbid0IGJsb2NrIHBhY2tldHMgaW4gcHBwX2lybmV0X3NlbmQoKSB3aGlsZSBwYXNzaXZlLAorICAgKiB0aGlzIGlzIG5vdCByZWFsbHkgbmVlZGVkLi4uCisgICAqIEFsc28sIG5vdCBkb2luZyBpdCBnaXZlIElyREEgYSBjaGFuY2UgdG8gZmluaXNoIHRoZSBzZXR1cCBwcm9wZXJseQorICAgKiBiZWZvcmUgYmVpbmcgc3dhbXBlZCB3aXRoIHBhY2tldHMuLi4gKi8KKyAgcHBwX291dHB1dF93YWtldXAoJm5ldy0+Y2hhbik7CisjZW5kaWYgLyogQ09OTkVDVF9JTkRJQ19LSUNLICovCisKKyAgLyogTm90aWZ5IHRoZSBjb250cm9sIGNoYW5uZWwgKi8KKyAgaXJuZXRfcG9zdF9ldmVudChuZXcsIElSTkVUX0NPTk5FQ1RfRlJPTSwKKwkJICAgbmV3LT5zYWRkciwgbmV3LT5kYWRkciwgc2VydmVyLT5ybmFtZSwgMCk7CisKKyAgREVYSVQoSVJEQV9TRVJWX1RSQUNFLCAiXG4iKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiBpcmRhX2Rpc2Nvbm5lY3Rfc2VydmVyIChzZWxmKQorICoKKyAqICAgIENsZWFudXAgdGhlIHNlcnZlciBzb2NrZXQgd2hlbiB0aGUgaW5jb21pbmcgY29ubmVjdGlvbiBhYm9ydAorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitpcm5ldF9kaXNjb25uZWN0X3NlcnZlcihpcm5ldF9zb2NrZXQgKglzZWxmLAorCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyAgREVOVEVSKElSREFfU0VSVl9UUkFDRSwgIihzZWxmPTB4JXApXG4iLCBzZWxmKTsKKworICAvKiBQdXQgdGhlIHJlY2VpdmVkIHBhY2tldCBpbiB0aGUgYmxhY2sgaG9sZSAqLworICBrZnJlZV9za2Ioc2tiKTsKKworI2lmZGVmIEZBSUxfU0VORF9ESVNDT05ORUNUCisgIC8qIFRlbGwgdGhlIG90aGVyIHBhcnR5IHdlIGRvbid0IHdhbnQgdG8gYmUgY29ubmVjdGVkICovCisgIC8qIEh1bS4uLiBJcyBpdCB0aGUgcmlnaHQgdGhpbmcgdG8gZG8gPyBBbmQgZG8gd2UgbmVlZCB0byBzZW5kCisgICAqIGEgY29ubmVjdCByZXNwb25zZSBiZWZvcmUgPyBJdCBsb29rcyBvayB3aXRob3V0IHRoaXMuLi4gKi8KKyAgaXJ0dHBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYtPnRzYXAsIE5VTEwsIFBfTk9STUFMKTsKKyNlbmRpZiAvKiBGQUlMX1NFTkRfRElTQ09OTkVDVCAqLworCisgIC8qIE5vdGlmeSB0aGUgY29udHJvbCBjaGFubmVsIChzZWUgaXJuZXRfZmluZF9zb2NrZXQoKSkgKi8KKyAgaXJuZXRfcG9zdF9ldmVudChOVUxMLCBJUk5FVF9SRVFVRVNUX0ZST00sCisJCSAgIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkciwgc2VsZi0+cm5hbWUsIDApOworCisgIC8qIENsZWFuIHVwIHRoZSBzZXJ2ZXIgdG8ga2VlcCBpdCBpbiBsaXN0ZW4gc3RhdGUgKi8KKyAgaXJ0dHBfbGlzdGVuKHNlbGYtPnRzYXApOworCisgIERFWElUKElSREFfU0VSVl9UUkFDRSwgIlxuIik7CisgIHJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfc2V0dXBfc2VydmVyIChzZWxmKQorICoKKyAqICAgIENyZWF0ZSBhIElyVFRQIHNlcnZlciBhbmQgc2V0IGl0IHVwLi4uCisgKgorICogUmVnaXN0ZXIgdGhlIElyTEFOIGhpbnQgYml0LCBjcmVhdGUgYSBJclRUUCBpbnN0YW5jZSBmb3IgdXMsCisgKiBzZXQgYWxsIHRoZSBJclRUUCBjYWxsYmFja3MgYW5kIGNyZWF0ZSBhbiBJcklBUyBlbnRyeS4uLgorICovCitzdGF0aWMgaW5saW5lIGludAoraXJuZXRfc2V0dXBfc2VydmVyKHZvaWQpCit7CisgIF9fdTE2CQloaW50czsKKworICBERU5URVIoSVJEQV9TRVJWX1RSQUNFLCAiKClcbiIpOworCisgIC8qIEluaXRpYWxpc2UgdGhlIHJlZ3VsYXIgc29ja2V0IHBhcnQgb2YgdGhlIHNlcnZlciAqLworICBpcmRhX2lybmV0X2NyZWF0ZSgmaXJuZXRfc2VydmVyLnMpOworCisgIC8qIE9wZW4gYSBsb2NhbCBUU0FQIChhbiBJclRUUCBpbnN0YW5jZSkgZm9yIHRoZSBzZXJ2ZXIgKi8KKyAgaXJuZXRfb3Blbl90c2FwKCZpcm5ldF9zZXJ2ZXIucyk7CisKKyAgLyogUFBQIHBhcnQgc2V0dXAgKi8KKyAgaXJuZXRfc2VydmVyLnMucHBwX29wZW4gPSAwOworICBpcm5ldF9zZXJ2ZXIucy5jaGFuLnByaXZhdGUgPSBOVUxMOworICBpcm5ldF9zZXJ2ZXIucy5maWxlID0gTlVMTDsKKworICAvKiBHZXQgdGhlIGhpbnQgYml0IGNvcnJlc3BvbmRpbmcgdG8gSXJMQU4gKi8KKyAgLyogTm90ZSA6IHdlIG92ZXJsb2FkIHRoZSBJckxBTiBoaW50IGJpdC4gQXMgaXQgaXMgb25seSBhICJoaW50IiwgYW5kIGFzCisgICAqIHdlIHByb3ZpZGUgcm91Z2hseSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIElyTEFOLCB0aGlzIGlzIG9rLgorICAgKiBJbiBmYWN0LCB0aGUgc2l0dWF0aW9uIGlzIHNpbWlsYXIgYXMgSmV0U2VuZCBvdmVybG9hZGluZyB0aGUgT2JleCBoaW50CisgICAqLworICBoaW50cyA9IGlybG1wX3NlcnZpY2VfdG9faGludChTX0xBTik7CisKKyNpZmRlZiBBRFZFUlRJU0VfSElOVAorICAvKiBSZWdpc3RlciB3aXRoIElyTE1QIGFzIGEgc2VydmljZSAoYWR2ZXJ0aXNlIG91ciBoaW50IGJpdCkgKi8KKyAgaXJuZXRfc2VydmVyLnNrZXkgPSBpcmxtcF9yZWdpc3Rlcl9zZXJ2aWNlKGhpbnRzKTsKKyNlbmRpZiAvKiBBRFZFUlRJU0VfSElOVCAqLworCisgIC8qIFJlZ2lzdGVyIHdpdGggTE0tSUFTIChzbyB0aGF0IHBlb3BsZSBjYW4gY29ubmVjdCB0byB1cykgKi8KKyAgaXJuZXRfc2VydmVyLmlhc19vYmogPSBpcmlhc19uZXdfb2JqZWN0KElSTkVUX1NFUlZJQ0VfTkFNRSwgamlmZmllcyk7CisgIGlyaWFzX2FkZF9pbnRlZ2VyX2F0dHJpYihpcm5ldF9zZXJ2ZXIuaWFzX29iaiwgSVJORVRfSUFTX1ZBTFVFLCAKKwkJCSAgIGlybmV0X3NlcnZlci5zLnN0c2FwX3NlbCwgSUFTX0tFUk5FTF9BVFRSKTsKKyAgaXJpYXNfaW5zZXJ0X29iamVjdChpcm5ldF9zZXJ2ZXIuaWFzX29iaik7CisKKyNpZmRlZiBESVNDT1ZFUllfRVZFTlRTCisgIC8qIFRlbGwgSXJMTVAgd2Ugd2FudCB0byBiZSBub3RpZmllZCBvZiBuZXdseSBkaXNjb3ZlcmVkIG5vZGVzICovCisgIGlybG1wX3VwZGF0ZV9jbGllbnQoaXJuZXRfc2VydmVyLnMuY2tleSwgaGludHMsCisJCSAgICAgIGlybmV0X2Rpc2NvdmVyeV9pbmRpY2F0aW9uLCBpcm5ldF9leHBpcnlfaW5kaWNhdGlvbiwKKwkJICAgICAgKHZvaWQgKikgJmlybmV0X3NlcnZlci5zKTsKKyNlbmRpZgorCisgIERFWElUKElSREFfU0VSVl9UUkFDRSwgIiAtIHNlbGY9MHglcFxuIiwgJmlybmV0X3NlcnZlci5zKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiBpcmRhX2Rlc3Ryb3lfc2VydmVyIChzZWxmKQorICoKKyAqICAgIERlc3Ryb3kgdGhlIElyVFRQIHNlcnZlci4uLgorICoKKyAqIFJldmVyc2Ugb2YgdGhlIHByZXZpb3VzIGZ1bmN0aW9uLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAoraXJuZXRfZGVzdHJveV9zZXJ2ZXIodm9pZCkKK3sKKyAgREVOVEVSKElSREFfU0VSVl9UUkFDRSwgIigpXG4iKTsKKworI2lmZGVmIEFEVkVSVElTRV9ISU5UCisgIC8qIFVucmVnaXN0ZXIgd2l0aCBJckxNUCAqLworICBpcmxtcF91bnJlZ2lzdGVyX3NlcnZpY2UoaXJuZXRfc2VydmVyLnNrZXkpOworI2VuZGlmIC8qIEFEVkVSVElTRV9ISU5UICovCisKKyAgLyogVW5yZWdpc3RlciB3aXRoIExNLUlBUyAqLworICBpZihpcm5ldF9zZXJ2ZXIuaWFzX29iaikKKyAgICBpcmlhc19kZWxldGVfb2JqZWN0KGlybmV0X3NlcnZlci5pYXNfb2JqKTsKKworICAvKiBDbGVhbnVwIHRoZSBzb2NrZXQgcGFydCAqLworICBpcmRhX2lybmV0X2Rlc3Ryb3koJmlybmV0X3NlcnZlci5zKTsKKworICBERVhJVChJUkRBX1NFUlZfVFJBQ0UsICJcbiIpOworICByZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBJUkRBLVRUUCBDQUxMQkFDS1MgKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFdoZW4gd2UgY3JlYXRlIGEgSXJUVFAgaW5zdGFuY2UsIHdlIHBhc3MgdG8gaXQgYSBzZXQgb2YgY2FsbGJhY2tzCisgKiB0aGF0IElyVFRQIHdpbGwgY2FsbCBpbiBjYXNlIG9mIHZhcmlvdXMgZXZlbnRzLgorICogV2UgdGFrZSBjYXJlIG9mIHRob3NlIGV2ZW50cyBoZXJlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiBpcm5ldF9kYXRhX2luZGljYXRpb24gKGluc3RhbmNlLCBzYXAsIHNrYikKKyAqCisgKiAgICBSZWNlaXZlZCBzb21lIGRhdGEgZnJvbSBUaW55VFAuIEp1c3QgcXVldWUgaXQgb24gdGhlIHJlY2VpdmUgcXVldWUKKyAqCisgKi8KK3N0YXRpYyBpbnQKK2lybmV0X2RhdGFfaW5kaWNhdGlvbih2b2lkICoJaW5zdGFuY2UsCisJCSAgICAgIHZvaWQgKglzYXAsCisJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisgIGlybmV0X3NvY2tldCAqCWFwID0gKGlybmV0X3NvY2tldCAqKSBpbnN0YW5jZTsKKyAgdW5zaWduZWQgY2hhciAqCXA7CisgIGludAkJCWNvZGUgPSAwOworCisgIERFTlRFUihJUkRBX1RDQl9UUkFDRSwgIihzZWxmL2FwPTB4JXAsIHNrYj0weCVwKVxuIiwKKwkgYXAsIHNrYik7CisgIERBU1NFUlQoc2tiICE9IE5VTEwsIDAsIElSREFfQ0JfRVJST1IsICJza2IgaXMgTlVMTCAhISFcbiIpOworCisgIC8qIENoZWNrIGlzIHBwcCBpcyByZWFkeSB0byByZWNlaXZlIG91ciBwYWNrZXQgKi8KKyAgaWYoIWFwLT5wcHBfb3BlbikKKyAgICB7CisgICAgICBERVJST1IoSVJEQV9DQl9FUlJPUiwgIlBQUCBub3QgcmVhZHksIGRyb3BwaW5nIHBhY2tldC4uLlxuIik7CisgICAgICAvKiBXaGVuIHdlIHJldHVybiBlcnJvciwgVFRQIHdpbGwgbmVlZCB0byByZXF1ZXVlIHRoZSBza2IgYW5kCisgICAgICAgKiB3aWxsIHN0b3AgdGhlIHNlbmRlci4gSXJUVFAgd2lsbCBzdGFsbCB1bnRpbCB3ZSBzZW5kIGl0IGEKKyAgICAgICAqIGZsb3cgY29udHJvbCByZXF1ZXN0Li4uICovCisgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICB9CisKKyAgLyogc3RyaXAgYWRkcmVzcy9jb250cm9sIGZpZWxkIGlmIHByZXNlbnQgKi8KKyAgcCA9IHNrYi0+ZGF0YTsKKyAgaWYoKHBbMF0gPT0gUFBQX0FMTFNUQVRJT05TKSAmJiAocFsxXSA9PSBQUFBfVUkpKQorICAgIHsKKyAgICAgIC8qIGNob3Agb2ZmIGFkZHJlc3MvY29udHJvbCAqLworICAgICAgaWYoc2tiLT5sZW4gPCAzKQorCWdvdG8gZXJyX2V4aXQ7CisgICAgICBwID0gc2tiX3B1bGwoc2tiLCAyKTsKKyAgICB9CisKKyAgLyogZGVjb21wcmVzcyBwcm90b2NvbCBmaWVsZCBpZiBjb21wcmVzc2VkICovCisgIGlmKHBbMF0gJiAxKQorICAgIHsKKyAgICAgIC8qIHByb3RvY29sIGlzIGNvbXByZXNzZWQgKi8KKyAgICAgIHNrYl9wdXNoKHNrYiwgMSlbMF0gPSAwOworICAgIH0KKyAgZWxzZQorICAgIGlmKHNrYi0+bGVuIDwgMikKKyAgICAgIGdvdG8gZXJyX2V4aXQ7CisKKyAgLyogcGFzcyB0byBnZW5lcmljIHBwcCBsYXllciAqLworICAvKiBOb3RlIDogaG93IGRvIEkga25vdyBpZiBwcHAgY2FuIGFjY2VwdCBvciBub3QgdGhlIHBhY2tldCA/IFRoaXMgaXMKKyAgICogZXNzZW50aWFsIGlmIEkgd2FudCB0byBtYW5hZ2UgZmxvdyBjb250cm9sIHNtb290aGx5Li4uICovCisgIHBwcF9pbnB1dCgmYXAtPmNoYW4sIHNrYik7CisKKyAgREVYSVQoSVJEQV9UQ0JfVFJBQ0UsICJcbiIpOworICByZXR1cm4gMDsKKworIGVycl9leGl0OgorICBERVJST1IoSVJEQV9DQl9FUlJPUiwgIlBhY2tldCB0b28gc21hbGwsIGRyb3BwaW5nLi4uXG4iKTsKKyAga2ZyZWVfc2tiKHNrYik7CisgIHBwcF9pbnB1dF9lcnJvcigmYXAtPmNoYW4sIGNvZGUpOworICByZXR1cm4gMDsJLyogRG9uJ3QgcmV0dXJuIGFuIGVycm9yIGNvZGUsIG9ubHkgZm9yIGZsb3cgY29udHJvbC4uLiAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJuZXRfZGlzY29ubmVjdF9pbmRpY2F0aW9uIChpbnN0YW5jZSwgc2FwLCByZWFzb24sIHNrYikKKyAqCisgKiAgICBDb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZC4gQ2hlY2ggcmVhc29uIHRvIGZpbmQgb3V0IHdoeQorICoKKyAqIE5vdGUgOiB0aGVyZSBhcmUgbWFueSBjYXNlcyB3aGVyZSB3ZSBjb21lIGhlcmUgOgorICoJbyBhdHRlbXB0ZWQgdG8gY29ubmVjdCwgdGltZW91dAorICoJbyBjb25uZWN0ZWQsIGxpbmsgaXMgYnJva2VuLCBMQVAgaGFzIHRpbWVvdXQKKyAqCW8gY29ubmVjdGVkLCBvdGhlciBzaWRlIGNsb3NlIHRoZSBsaW5rCisgKglvIGNvbm5lY3Rpb24gcmVxdWVzdCBvbiB0aGUgc2VydmVyIG5vdCBoYW5kbGVkCisgKi8KK3N0YXRpYyB2b2lkCitpcm5ldF9kaXNjb25uZWN0X2luZGljYXRpb24odm9pZCAqCWluc3RhbmNlLAorCQkJICAgIHZvaWQgKglzYXAsIAorCQkJICAgIExNX1JFQVNPTglyZWFzb24sCisJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyAgaXJuZXRfc29ja2V0ICoJc2VsZiA9IChpcm5ldF9zb2NrZXQgKikgaW5zdGFuY2U7CisgIGludAkJCXRlc3Rfb3BlbjsKKyAgaW50CQkJdGVzdF9jb25uZWN0OworCisgIERFTlRFUihJUkRBX1RDQl9UUkFDRSwgIihzZWxmPTB4JXApXG4iLCBzZWxmKTsKKyAgREFTU0VSVChzZWxmICE9IE5VTEwsICwgSVJEQV9DQl9FUlJPUiwgIlNlbGYgaXMgTlVMTCAhISFcbiIpOworCisgIC8qIERvbid0IGNhcmUgYWJvdXQgaXQsIGJ1dCBsZXQncyBub3QgbGVhayBpdCAqLworICBpZihza2IpCisgICAgZGV2X2tmcmVlX3NrYihza2IpOworCisgIC8qIFByZXZlbnQgaGlnaGVyIGxheWVyIGZyb20gYWNjZXNzaW5nIElyVFRQICovCisgIHRlc3Rfb3BlbiA9IHRlc3RfYW5kX2NsZWFyX2JpdCgwLCAmc2VsZi0+dHRwX29wZW4pOworICAvKiBOb3QgY29ubmVjdGluZyBhbnltb3JlLi4uCisgICAqIChub3RlIDogVFNBUCBpcyBvcGVuLCBzbyBJQVAgY2FsbGJhY2tzIGFyZSBubyBsb25nZXIgcGVuZGluZy4uLikgKi8KKyAgdGVzdF9jb25uZWN0ID0gdGVzdF9hbmRfY2xlYXJfYml0KDAsICZzZWxmLT50dHBfY29ubmVjdCk7CisKKyAgLyogSWYgYm90aCBzZWxmLT50dHBfb3BlbiBhbmQgc2VsZi0+dHRwX2Nvbm5lY3QgYXJlIE5VTEwsIGl0IG1lYW4gdGhhdCB3ZQorICAgKiBoYXZlIGEgcmFjZSBjb25kaXRpb24gd2l0aCBpcmRhX2lybmV0X2Rlc3Ryb3koKSBvcgorICAgKiBpcm5ldF9jb25uZWN0X2luZGljYXRpb24oKSwgc28gZG9uJ3QgbWVzcyB1cCB0c2FwLi4uCisgICAqLworICBpZighKHRlc3Rfb3BlbiB8fCB0ZXN0X2Nvbm5lY3QpKQorICAgIHsKKyAgICAgIERFUlJPUihJUkRBX0NCX0VSUk9SLCAiUmFjZSBjb25kaXRpb24gZGV0ZWN0ZWQuLi5cbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBJZiB3ZSB3ZXJlIGFjdGl2ZSwgbm90aWZ5IHRoZSBjb250cm9sIGNoYW5uZWwgKi8KKyAgaWYodGVzdF9vcGVuKQorICAgIGlybmV0X3Bvc3RfZXZlbnQoc2VsZiwgSVJORVRfRElTQ09OTkVDVF9GUk9NLAorCQkgICAgIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkciwgc2VsZi0+cm5hbWUsIDApOworICBlbHNlCisgICAgLyogSWYgd2Ugd2VyZSB0cnlpbmcgdG8gY29ubmVjdCwgbm90aWZ5IHRoZSBjb250cm9sIGNoYW5uZWwgKi8KKyAgICBpZigoc2VsZi0+dHNhcCkgJiYgKHNlbGYgIT0gJmlybmV0X3NlcnZlci5zKSkKKyAgICAgIGlybmV0X3Bvc3RfZXZlbnQoc2VsZiwgSVJORVRfTk9BTlNXRVJfRlJPTSwKKwkJICAgICAgIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkciwgc2VsZi0+cm5hbWUsIDApOworCisgIC8qIENsb3NlIG91ciBJclRUUCBjb25uZWN0aW9uLCBjbGVhbnVwIHRzYXAgKi8KKyAgaWYoKHNlbGYtPnRzYXApICYmIChzZWxmICE9ICZpcm5ldF9zZXJ2ZXIucykpCisgICAgeworICAgICAgREVCVUcoSVJEQV9DQl9JTkZPLCAiQ2xvc2luZyBvdXIgVFRQIGNvbm5lY3Rpb24uXG4iKTsKKyAgICAgIGlydHRwX2Nsb3NlX3RzYXAoc2VsZi0+dHNhcCk7CisgICAgICBzZWxmLT50c2FwID0gTlVMTDsKKyAgICB9CisgIC8qIENsZWFudXAgdGhlIHNvY2tldCBpbiBjYXNlIHdlIHdhbnQgdG8gcmVjb25uZWN0IGluIHBwcF9vdXRwdXRfd2FrZXVwKCkgKi8KKyAgc2VsZi0+c3RzYXBfc2VsID0gMDsKKyAgc2VsZi0+ZGFkZHIgPSBERVZfQUREUl9BTlk7CisgIHNlbGYtPnR4X2Zsb3cgPSBGTE9XX1NUQVJUOworCisgIC8qIERlYWwgd2l0aCB0aGUgcHBwIGluc3RhbmNlIGlmIGl0J3Mgc3RpbGwgYWxpdmUgKi8KKyAgaWYoc2VsZi0+cHBwX29wZW4pCisgICAgeworICAgICAgaWYodGVzdF9vcGVuKQorCXsKKyNpZmRlZiBNSVNTSU5HX1BQUF9BUEkKKwkgIC8qIHBwcF91bnJlZ2lzdGVyX2NoYW5uZWwoKSB3YW50cyBhIHVzZXIgY29udGV4dCwgd2hpY2ggd2UKKwkgICAqIGFyZSBndWFyYW50ZWVkIHRvIE5PVCBoYXZlIGhlcmUuIFdoYXQgYXJlIHdlIHN1cHBvc2VkCisJICAgKiB0byBkbyBoZXJlID8gSmVhbiBJSSAqLworCSAgLyogSWYgd2Ugd2VyZSBjb25uZWN0ZWQsIGNsZWFudXAgJiBjbG9zZSB0aGUgUFBQIGNoYW5uZWwsCisJICAgKiB3aGljaCB3aWxsIGtpbGwgcHBwZCAoaGFuZ3VwKSBhbmQgdGhlIHJlc3QgKi8KKwkgIHBwcF91bnJlZ2lzdGVyX2NoYW5uZWwoJnNlbGYtPmNoYW4pOworCSAgc2VsZi0+cHBwX29wZW4gPSAwOworI2VuZGlmCisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIElmIHdlIHdlcmUgdHJ5aW5nIHRvIGNvbm5lY3QsIGZsdXNoIChkcmFpbikgcHBwX2dlbmVyaWMKKwkgICAqIFR4IHF1ZXVlIChtb3N0IG9mdGVuIHdlIGhhdmUgYmxvY2tlZCBpdCksIHdoaWNoIHdpbGwKKwkgICAqIHRyaWdnZXIgYW4gb3RoZXIgYXR0ZW1wdCB0byBjb25uZWN0LiBJZiB3ZSBhcmUgcGFzc2l2ZSwKKwkgICAqIHRoaXMgd2lsbCBlbXB0eSB0aGUgVHggcXVldWUgYWZ0ZXIgbGFzdCB0cnkuICovCisJICBwcHBfb3V0cHV0X3dha2V1cCgmc2VsZi0+Y2hhbik7CisJfQorICAgIH0KKworICBERVhJVChJUkRBX1RDQl9UUkFDRSwgIlxuIik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiBpcm5ldF9jb25uZWN0X2NvbmZpcm0gKGluc3RhbmNlLCBzYXAsIHFvcywgbWF4X3NkdV9zaXplLCBza2IpCisgKgorICogICAgQ29ubmVjdGlvbnMgaGFzIGJlZW4gY29uZmlybWVkIGJ5IHRoZSByZW1vdGUgZGV2aWNlCisgKgorICovCitzdGF0aWMgdm9pZAoraXJuZXRfY29ubmVjdF9jb25maXJtKHZvaWQgKglpbnN0YW5jZSwKKwkJICAgICAgdm9pZCAqCXNhcCwgCisJCSAgICAgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLAorCQkgICAgICBfX3UzMgltYXhfc2R1X3NpemUsCisJCSAgICAgIF9fdTgJbWF4X2hlYWRlcl9zaXplLCAKKwkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyAgaXJuZXRfc29ja2V0ICoJc2VsZiA9IChpcm5ldF9zb2NrZXQgKikgaW5zdGFuY2U7CisKKyAgREVOVEVSKElSREFfVENCX1RSQUNFLCAiKHNlbGY9MHglcClcbiIsIHNlbGYpOworCisgIC8qIENoZWNrIGlmIHNvY2tldCBpcyBjbG9zaW5nIGRvd24gKHZpYSBpcmRhX2lybmV0X2Rlc3Ryb3koKSkgKi8KKyAgaWYoISB0ZXN0X2JpdCgwLCAmc2VsZi0+dHRwX2Nvbm5lY3QpKQorICAgIHsKKyAgICAgIERFUlJPUihJUkRBX0NCX0VSUk9SLCAiU29ja2V0IG5vIGxvbmdlciBjb25uZWN0aW5nLiBPdWNoICFcbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBIb3cgbXVjaCBoZWFkZXIgc3BhY2UgZG8gd2UgbmVlZCB0byByZXNlcnZlICovCisgIHNlbGYtPm1heF9oZWFkZXJfc2l6ZSA9IG1heF9oZWFkZXJfc2l6ZTsKKworICAvKiBJclRUUCBtYXggU0RVIHNpemUgaW4gdHJhbnNtaXQgZGlyZWN0aW9uICovCisgIHNlbGYtPm1heF9zZHVfc2l6ZV90eCA9IG1heF9zZHVfc2l6ZTsKKyAgc2VsZi0+bWF4X2RhdGFfc2l6ZSA9IG1heF9zZHVfc2l6ZTsKKyNpZmRlZiBTVFJFQU1fQ09NUEFUCisgIGlmKG1heF9zZHVfc2l6ZSA9PSAwKQorICAgIHNlbGYtPm1heF9kYXRhX3NpemUgPSBpcnR0cF9nZXRfbWF4X3NlZ19zaXplKHNlbGYtPnRzYXApOworI2VuZGlmIC8qIFNUUkVBTV9DT01QQVQgKi8KKworICAvKiBBdCB0aGlzIHBvaW50LCBJckxNUCBoYXMgYXNzaWduZWQgb3VyIHNvdXJjZSBhZGRyZXNzICovCisgIHNlbGYtPnNhZGRyID0gaXJ0dHBfZ2V0X3NhZGRyKHNlbGYtPnRzYXApOworCisgIC8qIEFsbG93IGhpZ2hlciBsYXllciB0byBhY2Nlc3MgSXJUVFAgKi8KKyAgc2V0X2JpdCgwLCAmc2VsZi0+dHRwX29wZW4pOworICBjbGVhcl9iaXQoMCwgJnNlbGYtPnR0cF9jb25uZWN0KTsJLyogTm90IHJhY3ksIElyREEgdHJhZmZpYyBpcyBzZXJpYWwgKi8KKyAgLyogR2l2ZSBhIGtpY2sgaW4gdGhlIGFzcyBvZiBwcHBfZ2VuZXJpYyBzbyB0aGF0IGhlIHNlbmRzIHVzIHNvbWUgZGF0YSAqLworICBwcHBfb3V0cHV0X3dha2V1cCgmc2VsZi0+Y2hhbik7CisKKyAgLyogQ2hlY2sgc2l6ZSBvZiByZWNlaXZlZCBwYWNrZXQgKi8KKyAgaWYoc2tiLT5sZW4gPiAwKQorICAgIHsKKyNpZmRlZiBQQVNTX0NPTk5FQ1RfUEFDS0VUUworICAgICAgREVCVUcoSVJEQV9DQl9JTkZPLCAiUGFzc2luZyBjb25uZWN0IHBhY2tldCB0byBQUFAuXG4iKTsKKyAgICAgIC8qIFRyeSB0byBwYXNzIGl0IHRvIFBQUCAqLworICAgICAgaXJuZXRfZGF0YV9pbmRpY2F0aW9uKGluc3RhbmNlLCBzYXAsIHNrYik7CisjZWxzZSAvKiBQQVNTX0NPTk5FQ1RfUEFDS0VUUyAqLworICAgICAgREVSUk9SKElSREFfQ0JfRVJST1IsICJEcm9wcGluZyBub24gZW1wdHkgcGFja2V0LlxuIik7CisgICAgICBrZnJlZV9za2Ioc2tiKTsJLyogTm90ZSA6IHdpbGwgYmUgb3B0aW1pc2VkIHdpdGggb3RoZXIga2ZyZWUuLi4gKi8KKyNlbmRpZiAvKiBQQVNTX0NPTk5FQ1RfUEFDS0VUUyAqLworICAgIH0KKyAgZWxzZQorICAgIGtmcmVlX3NrYihza2IpOworCisgIC8qIE5vdGlmeSB0aGUgY29udHJvbCBjaGFubmVsICovCisgIGlybmV0X3Bvc3RfZXZlbnQoc2VsZiwgSVJORVRfQ09OTkVDVF9UTywKKwkJICAgc2VsZi0+c2FkZHIsIHNlbGYtPmRhZGRyLCBzZWxmLT5ybmFtZSwgMCk7CisKKyAgREVYSVQoSVJEQV9UQ0JfVFJBQ0UsICJcbiIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJuZXRfZmxvd19pbmRpY2F0aW9uIChpbnN0YW5jZSwgc2FwLCBmbG93KQorICoKKyAqICAgIFVzZWQgYnkgVGlueVRQIHRvIHRlbGwgdXMgaWYgaXQgY2FuIGFjY2VwdCBtb3JlIGRhdGEgb3Igbm90CisgKgorICovCitzdGF0aWMgdm9pZAoraXJuZXRfZmxvd19pbmRpY2F0aW9uKHZvaWQgKglpbnN0YW5jZSwKKwkJICAgICAgdm9pZCAqCXNhcCwKKwkJICAgICAgTE9DQUxfRkxPVyBmbG93KSAKK3sKKyAgaXJuZXRfc29ja2V0ICoJc2VsZiA9IChpcm5ldF9zb2NrZXQgKikgaW5zdGFuY2U7CisgIExPQ0FMX0ZMT1cJCW9sZGZsb3cgPSBzZWxmLT50eF9mbG93OworCisgIERFTlRFUihJUkRBX1RDQl9UUkFDRSwgIihzZWxmPTB4JXAsIGZsb3c9JWQpXG4iLCBzZWxmLCBmbG93KTsKKworICAvKiBVcGRhdGUgb3VyIHN0YXRlICovCisgIHNlbGYtPnR4X2Zsb3cgPSBmbG93OworCisgIC8qIENoZWNrIHdoYXQgSXJUVFAgd2FudCB1cyB0byBkby4uLiAqLworICBzd2l0Y2goZmxvdykKKyAgICB7CisgICAgY2FzZSBGTE9XX1NUQVJUOgorICAgICAgREVCVUcoSVJEQV9DQl9JTkZPLCAiSXJUVFAgd2FudHMgdXMgdG8gc3RhcnQgYWdhaW5cbiIpOworICAgICAgLyogQ2hlY2sgaWYgd2UgcmVhbGx5IG5lZWQgdG8gd2FrZSB1cCBQUFAgKi8KKyAgICAgIGlmKG9sZGZsb3cgPT0gRkxPV19TVE9QKQorCXBwcF9vdXRwdXRfd2FrZXVwKCZzZWxmLT5jaGFuKTsKKyAgICAgIGVsc2UKKwlERUJVRyhJUkRBX0NCX0lORk8sICJCdXQgd2Ugd2VyZSBhbHJlYWR5IHRyYW5zbWl0dGluZyAhISFcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGTE9XX1NUT1A6CisgICAgICBERUJVRyhJUkRBX0NCX0lORk8sICJJclRUUCB3YW50cyB1cyB0byBzbG93IGRvd25cbiIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIERFQlVHKElSREFfQ0JfSU5GTywgIlVua25vd24gZmxvdyBjb21tYW5kIVxuIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgREVYSVQoSVJEQV9UQ0JfVFJBQ0UsICJcbiIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJuZXRfc3RhdHVzX2luZGljYXRpb24gKGluc3RhbmNlLCBzYXAsIHJlYXNvbiwgc2tiKQorICoKKyAqICAgIExpbmsgKElyTEFQKSBzdGF0dXMgcmVwb3J0LgorICoKKyAqLworc3RhdGljIHZvaWQKK2lybmV0X3N0YXR1c19pbmRpY2F0aW9uKHZvaWQgKglpbnN0YW5jZSwKKwkJCUxJTktfU1RBVFVTIGxpbmssCisJCQlMT0NLX1NUQVRVUyBsb2NrKQoreworICBpcm5ldF9zb2NrZXQgKglzZWxmID0gKGlybmV0X3NvY2tldCAqKSBpbnN0YW5jZTsKKworICBERU5URVIoSVJEQV9UQ0JfVFJBQ0UsICIoc2VsZj0weCVwKVxuIiwgc2VsZik7CisgIERBU1NFUlQoc2VsZiAhPSBOVUxMLCAsIElSREFfQ0JfRVJST1IsICJTZWxmIGlzIE5VTEwgISEhXG4iKTsKKworICAvKiBXZSBjYW4gb25seSBnZXQgdGhpcyBldmVudCBpZiB3ZSBhcmUgY29ubmVjdGVkICovCisgIHN3aXRjaChsaW5rKQorICAgIHsKKyAgICBjYXNlIFNUQVRVU19OT19BQ1RJVklUWToKKyAgICAgIGlybmV0X3Bvc3RfZXZlbnQoc2VsZiwgSVJORVRfQkxPQ0tFRF9MSU5LLAorCQkgICAgICAgc2VsZi0+c2FkZHIsIHNlbGYtPmRhZGRyLCBzZWxmLT5ybmFtZSwgMCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgREVCVUcoSVJEQV9DQl9JTkZPLCAiVW5rbm93biBzdGF0dXMuLi5cbiIpOworICAgIH0KKworICBERVhJVChJUkRBX1RDQl9UUkFDRSwgIlxuIik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiBpcm5ldF9jb25uZWN0X2luZGljYXRpb24oaW5zdGFuY2UsIHNhcCwgcW9zLCBtYXhfc2R1X3NpemUsIHVzZXJkYXRhKQorICoKKyAqICAgIEluY29taW5nIGNvbm5lY3Rpb24KKyAqCisgKiBJbiB0aGVvcnksIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9ubHkgb24gdGhlIHNlcnZlciBzb2NrZXQuCisgKiBTb21lIG90aGVyIG5vZGUgaXMgYXR0ZW1wdGluZyB0byBjb25uZWN0IHRvIHRoZSBJck5FVCBzZXJ2aWNlLCBhbmQgaGFzCisgKiBzZW50IGEgY29ubmVjdGlvbiByZXF1ZXN0IG9uIG91ciBzZXJ2ZXIgc29ja2V0LgorICogV2UganVzdCByZWRpcmVjdCB0aGUgY29ubmVjdGlvbiB0byB0aGUgcmVsZXZhbnQgSXJORVQgc29ja2V0LgorICogCisgKiBOb3RlIDogd2UgYWxzbyBtYWtlIHN1cmUgdGhhdCBiZXR3ZWVuIDIgaXJuZXQgbm9kZXMsIHRoZXJlIGNhbgorICogZXhpc3Qgb25seSBvbmUgaXJuZXQgY29ubmVjdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK2lybmV0X2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICoJCWluc3RhbmNlLAorCQkJIHZvaWQgKgkJc2FwLCAKKwkJCSBzdHJ1Y3QgcW9zX2luZm8gKnFvcywKKwkJCSBfX3UzMgkJbWF4X3NkdV9zaXplLAorCQkJIF9fdTgJCW1heF9oZWFkZXJfc2l6ZSwKKwkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworICBpcm5ldF9zb2NrZXQgKglzZXJ2ZXIgPSAmaXJuZXRfc2VydmVyLnM7CisgIGlybmV0X3NvY2tldCAqCW5ldyA9IChpcm5ldF9zb2NrZXQgKikgTlVMTDsKKworICBERU5URVIoSVJEQV9UQ0JfVFJBQ0UsICIoc2VydmVyPTB4JXApXG4iLCBzZXJ2ZXIpOworICBEQVNTRVJUKGluc3RhbmNlID09ICZpcm5ldF9zZXJ2ZXIsICwgSVJEQV9DQl9FUlJPUiwKKwkgICJJbnZhbGlkIGluc3RhbmNlICgweCVwKSAhISFcbiIsIGluc3RhbmNlKTsKKyAgREFTU0VSVChzYXAgPT0gaXJuZXRfc2VydmVyLnMudHNhcCwgLCBJUkRBX0NCX0VSUk9SLCAiSW52YWxpZCBzYXAgISEhXG4iKTsKKworICAvKiBUcnkgdG8gZmluZCB0aGUgbW9zdCBhcHByb3ByaWF0ZSBJck5FVCBzb2NrZXQgKi8KKyAgbmV3ID0gaXJuZXRfZmluZF9zb2NrZXQoc2VydmVyKTsKKworICAvKiBBZnRlciBhbGwgdGhpcyBoYXJkIHdvcmssIGRvIHdlIGhhdmUgYW4gc29ja2V0ID8gKi8KKyAgaWYobmV3ID09IChpcm5ldF9zb2NrZXQgKikgTlVMTCkKKyAgICB7CisgICAgICBERVhJVChJUkRBX0NCX0lORk8sICI6IE5vIHNvY2tldCB3YWl0aW5nIGZvciB0aGlzIGNvbm5lY3Rpb24uXG4iKTsKKyAgICAgIGlybmV0X2Rpc2Nvbm5lY3Rfc2VydmVyKHNlcnZlciwgc2tiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogSXMgdGhlIHNvY2tldCBhbHJlYWR5IGJ1c3kgPyAqLworICBpZih0ZXN0X2JpdCgwLCAmbmV3LT50dHBfb3BlbikpCisgICAgeworICAgICAgREVYSVQoSVJEQV9DQl9JTkZPLCAiOiBTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQuXG4iKTsKKyAgICAgIGlybmV0X2Rpc2Nvbm5lY3Rfc2VydmVyKHNlcnZlciwgc2tiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogVGhlIGZvbGxvd2luZyBjb2RlIGlzIGEgYml0IHRyaWNreSwgc28gbmVlZCBjb21tZW50cyA7LSkKKyAgICovCisgIC8qIElmIHR0cF9jb25uZWN0IGlzIHNldCwgdGhlIHNvY2tldCBpcyB0cnlpbmcgdG8gY29ubmVjdCB0byB0aGUgb3RoZXIKKyAgICogZW5kIGFuZCBtYXkgaGF2ZSBzZW50IGEgSXJUVFAgY29ubmVjdGlvbiByZXF1ZXN0IGFuZCBpcyB3YWl0aW5nIGZvcgorICAgKiBhIGNvbm5lY3Rpb24gcmVzcG9uc2UgKHRoYXQgbWF5IG5ldmVyIGNvbWUpLgorICAgKiBOb3csIHRoZSBwYWluIGlzIHRoYXQgdGhlIHNvY2tldCBtYXkgaGF2ZSBvcGVuZWQgYSB0c2FwIGFuZCBpcworICAgKiB3YWl0aW5nIG9uIGl0LCB3aGlsZSB0aGUgb3RoZXIgZW5kIGlzIHRyeWluZyB0byBjb25uZWN0IHRvIGl0IG9uCisgICAqIGFub3RoZXIgdHNhcC4KKyAgICogQmVjYXVzZSBJck5FVCBjYW4gYmUgcGVlciB0byBwZWVyLCB3ZSBuZWVkIHRvIHdvcmthcm91bmQgdGhpcy4KKyAgICogRnVydGhlcm1vcmUsIHRoZSB3YXkgdGhlIGlybmV0ZCBzY3JpcHQgaXMgaW1wbGVtZW50ZWQsIHRoZQorICAgKiB0YXJnZXQgd2lsbCBjcmVhdGUgYSBzZWNvbmQgSXJORVQgY29ubmVjdGlvbiBiYWNrIHRvIHRoZQorICAgKiBvcmlnaW5hdG9yIGFuZCBleHBlY3QgdGhlIG9yaWdpbmF0b3IgdG8gYmluZCB0aGlzIG5ldyBjb25uZWN0aW9uCisgICAqIHRvIHRoZSBvcmlnaW5hbCBQUFBEIGluc3RhbmNlLgorICAgKiBBbmQgb2YgY291cnNlLCBpZiB3ZSBkb24ndCB1c2UgaXJuZXRkLCB3ZSBjYW4gaGF2ZSBhIHJhY2Ugd2hlbgorICAgKiBib3RoIHNpZGUgdHJ5IHRvIGNvbm5lY3Qgc2ltdWx0YW5lb3VzbHksIHdoaWNoIGNvdWxkIGxlYXZlIGJvdGgKKyAgICogY29ubmVjdGlvbnMgaGFsZiBjbG9zZWQgKHl1Y2spLgorICAgKiBDb25jbHVzaW9ucyA6CisgICAqCTEpIFRoZSAib3JpZ2luYXRvciIgbXVzdCBhY2NlcHQgdGhlIG5ldyBjb25uZWN0aW9uIGFuZCBnZXQgcmlkCisgICAqCSAgIG9mIHRoZSBvbGQgb25lIHNvIHRoYXQgaXJuZXRkIHdvcmtzCisgICAqCTIpIE9uZSBzaWRlIG11c3QgZGVueSB0aGUgbmV3IGNvbm5lY3Rpb24gdG8gYXZvaWQgcmFjZXMsCisgICAqCSAgIGJ1dCBib3RoIHNpZGUgbXVzdCBhZ3JlZSBvbiB3aGljaCBzaWRlIGl0IGlzLi4uCisgICAqIE1vc3Qgb2Z0ZW4sIHRoZSBvcmlnaW5hdG9yIGlzIHByaW1hcnkgYXQgdGhlIExBUCBsYXllci4KKyAgICogSmVhbiBJSQorICAgKi8KKyAgLyogTm93LCBsZXQncyBsb29rIGF0IHRoZSB3YXkgSSB3cm90ZSB0aGUgdGVzdC4uLgorICAgKiBXZSBuZWVkIHRvIGNsZWFyIHVwIHRoZSB0dHBfY29ubmVjdCBmbGFnIGF0b21pY2FsbHkgdG8gcHJldmVudAorICAgKiBpcm5ldF9kaXNjb25uZWN0X2luZGljYXRpb24oKSB0byBtZXNzIHVwIHRoZSB0c2FwIHdlIGFyZSBnb2luZyB0byBjbG9zZS4KKyAgICogV2Ugd2FudCB0byBjbGVhciB0aGUgdHRwX2Nvbm5lY3QgZmxhZyBvbmx5IGlmIHdlIGNsb3NlIHRoZSB0c2FwLAorICAgKiBvdGhlcndpc2Ugd2Ugd2lsbCBuZXZlciBjbG9zZSBpdCwgc28gd2UgbmVlZCB0byBjaGVjayBmb3IgcHJpbWFyeQorICAgKiAqYmVmb3JlKiBkb2luZyB0aGUgdGVzdCBvbiB0aGUgZmxhZy4KKyAgICogQW5kIG9mIGNvdXJzZSwgQUxMT1dfU0lNVUxUX0NPTk5FQ1QgY2FuIGRpc2FibGUgdGhpcyBlbnRpcmVseS4uLgorICAgKiBKZWFuIElJCisgICAqLworCisgIC8qIFNvY2tldCBhbHJlYWR5IGNvbm5lY3RpbmcgPyBPbiBwcmltYXJ5ID8gKi8KKyAgaWYoMAorI2lmZGVmIEFMTE9XX1NJTVVMVF9DT05ORUNUCisgICAgIHx8ICgoaXJ0dHBfaXNfcHJpbWFyeShzZXJ2ZXItPnRzYXApID09IDEpCS8qIHByaW1hcnkgKi8KKwkgJiYgKHRlc3RfYW5kX2NsZWFyX2JpdCgwLCAmbmV3LT50dHBfY29ubmVjdCkpKQorI2VuZGlmIC8qIEFMTE9XX1NJTVVMVF9DT05ORUNUICovCisgICAgICkKKyAgICB7CisgICAgICBERVJST1IoSVJEQV9DQl9FUlJPUiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RpbmcsIGJ1dCBnb2luZyB0byByZXVzZSBpdCAhXG4iKTsKKworICAgICAgLyogQ2xlYW51cCB0aGUgb2xkIFRTQVAgaWYgbmVjZXNzYXJ5IC0gSXJJQVAgd2lsbCBiZSBjbGVhbmVkIHVwIGxhdGVyICovCisgICAgICBpZihuZXctPnRzYXAgIT0gTlVMTCkKKwl7CisJICAvKiBDbG9zZSB0aGUgb2xkIGNvbm5lY3Rpb24gdGhlIG5ldyBzb2NrZXQgd2FzIGF0dGVtcHRpbmcsCisJICAgKiBzbyB0aGF0IHdlIGNhbiBob29rIGl0IHVwIHRvIHRoZSBuZXcgY29ubmVjdGlvbi4KKwkgICAqIEl0J3Mgbm93IHNhZmUgdG8gZG8gaXQuLi4gKi8KKwkgIGlydHRwX2Nsb3NlX3RzYXAobmV3LT50c2FwKTsKKwkgIG5ldy0+dHNhcCA9IE5VTEw7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFRocmVlIG9wdGlvbnMgOgorICAgICAgICogMSkgc29ja2V0IHdhcyBub3QgY29ubmVjdGluZyBvciBjb25uZWN0ZWQgOiB0dHBfY29ubmVjdCBzaG91bGQgYmUgMC4KKyAgICAgICAqIDIpIHdlIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0aGUgc29ja2V0IGJlY2F1c2Ugd2UgYXJlIHNlY29uZGFyeSBvcgorICAgICAgICogQUxMT1dfU0lNVUxUX0NPTk5FQ1QgaXMgdW5kZWZpbmVkLiB0dHBfY29ubmVjdCBzaG91bGQgYmUgMS4KKyAgICAgICAqIDMpIHdlIGFyZSBoYWxmIHdheSBpbiBpcm5ldF9kaXNjb25uZWN0X2luZGljYXRpb24oKSwgYW5kIGl0J3MgYQorICAgICAgICogbmljZSByYWNlIGNvbmRpdGlvbi4uLiBGb3J0dW5hdGVseSwgd2UgY2FuIGRldGVjdCB0aGF0IGJ5IGNoZWNraW5nCisgICAgICAgKiBpZiB0c2FwIGlzIHN0aWxsIGFsaXZlLiBPbiB0aGUgb3RoZXIgaGFuZCwgd2UgY2FuJ3QgYmUgaW4KKyAgICAgICAqIGlyZGFfaXJuZXRfZGVzdHJveSgpIG90aGVyd2lzZSB3ZSB3b3VsZCBub3QgaGF2ZSBmb3VuZCB0aGlzCisgICAgICAgKiBzb2NrZXQgaW4gdGhlIGhhc2hiaW4uCisgICAgICAgKiBKZWFuIElJICovCisgICAgICBpZigodGVzdF9iaXQoMCwgJm5ldy0+dHRwX2Nvbm5lY3QpKSB8fCAobmV3LT50c2FwICE9IE5VTEwpKQorCXsKKwkgIC8qIERvbid0IG1lc3MgdGhpcyBzb2NrZXQsIHNvbWVib2R5IGVsc2UgaW4gaW4gY2hhcmdlLi4uICovCisJICBERVJST1IoSVJEQV9DQl9FUlJPUiwgIlJhY2UgY29uZGl0aW9uIGRldGVjdGVkLCBzb2NrZXQgaW4gdXNlLCBhYm9ydCBjb25uZWN0Li4uXG4iKTsKKwkgIGlybmV0X2Rpc2Nvbm5lY3Rfc2VydmVyKHNlcnZlciwgc2tiKTsKKwkgIHJldHVybjsKKwl9CisgICAgfQorCisgIC8qIFNvIDogYXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBhIHNvY2tldCwgYW5kIGl0IGlzIGlkbGUuIEdvb2QgISAqLworICBpcm5ldF9jb25uZWN0X3NvY2tldChzZXJ2ZXIsIG5ldywgcW9zLCBtYXhfc2R1X3NpemUsIG1heF9oZWFkZXJfc2l6ZSk7CisKKyAgLyogQ2hlY2sgc2l6ZSBvZiByZWNlaXZlZCBwYWNrZXQgKi8KKyAgaWYoc2tiLT5sZW4gPiAwKQorICAgIHsKKyNpZmRlZiBQQVNTX0NPTk5FQ1RfUEFDS0VUUworICAgICAgREVCVUcoSVJEQV9DQl9JTkZPLCAiUGFzc2luZyBjb25uZWN0IHBhY2tldCB0byBQUFAuXG4iKTsKKyAgICAgIC8qIFRyeSB0byBwYXNzIGl0IHRvIFBQUCAqLworICAgICAgaXJuZXRfZGF0YV9pbmRpY2F0aW9uKG5ldywgbmV3LT50c2FwLCBza2IpOworI2Vsc2UgLyogUEFTU19DT05ORUNUX1BBQ0tFVFMgKi8KKyAgICAgIERFUlJPUihJUkRBX0NCX0VSUk9SLCAiRHJvcHBpbmcgbm9uIGVtcHR5IHBhY2tldC5cbiIpOworICAgICAga2ZyZWVfc2tiKHNrYik7CS8qIE5vdGUgOiB3aWxsIGJlIG9wdGltaXNlZCB3aXRoIG90aGVyIGtmcmVlLi4uICovCisjZW5kaWYgLyogUEFTU19DT05ORUNUX1BBQ0tFVFMgKi8KKyAgICB9CisgIGVsc2UKKyAgICBrZnJlZV9za2Ioc2tiKTsKKworICBERVhJVChJUkRBX1RDQl9UUkFDRSwgIlxuIik7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKiogSVJEQS1JQVMvTE1QIENBTExCQUNLUyAqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFRoZXNlIGFyZSB0aGUgY2FsbGJhY2tzIGNhbGxlZCBieSBvdGhlciBsYXllcnMgb2YgdGhlIElyREEgc3RhY2ssCisgKiBtYWlubHkgTE1QIGZvciBkaXNjb3ZlcnkgYW5kIElBUyBmb3IgbmFtZSBxdWVyaWVzLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiBpcm5ldF9nZXR2YWx1ZV9jb25maXJtIChyZXN1bHQsIG9ial9pZCwgdmFsdWUsIHByaXYpCisgKgorICogICAgR290IGFuc3dlciBmcm9tIHJlbW90ZSBMTS1JQVMsIGp1c3QgY29ubmVjdAorICoKKyAqIFRoaXMgaXMgdGhlIHJlcGx5IHRvIGEgSUFTIHF1ZXJ5IHdlIHdlcmUgZG9pbmcgdG8gZmluZCB0aGUgVFNBUCBvZgorICogdGhlIGRldmljZSB3ZSB3YW50IHRvIGNvbm5lY3QgdG8uCisgKiBJZiB3ZSBoYXZlIGZvdW5kIGEgdmFsaWQgVFNBUCwganVzdCBpbml0aWF0ZSB0aGUgVFRQIGNvbm5lY3Rpb24KKyAqIG9uIHRoaXMgVFNBUC4KKyAqLworc3RhdGljIHZvaWQKK2lybmV0X2dldHZhbHVlX2NvbmZpcm0oaW50CXJlc3VsdCwKKwkJICAgICAgIF9fdTE2CW9ial9pZCwgCisJCSAgICAgICBzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZSwKKwkJICAgICAgIHZvaWQgKglwcml2KQoreworICBpcm5ldF9zb2NrZXQgKglzZWxmID0gKGlybmV0X3NvY2tldCAqKSBwcml2OworCisgIERFTlRFUihJUkRBX09DQl9UUkFDRSwgIihzZWxmPTB4JXApXG4iLCBzZWxmKTsKKyAgREFTU0VSVChzZWxmICE9IE5VTEwsICwgSVJEQV9PQ0JfRVJST1IsICJTZWxmIGlzIE5VTEwgISEhXG4iKTsKKworICAvKiBDaGVjayBpZiBhbHJlYWR5IGNvbm5lY3RlZCAodmlhIGlybmV0X2Nvbm5lY3Rfc29ja2V0KCkpCisgICAqIG9yIHNvY2tldCBpcyBjbG9zaW5nIGRvd24gKHZpYSBpcmRhX2lybmV0X2Rlc3Ryb3koKSkgKi8KKyAgaWYoISB0ZXN0X2JpdCgwLCAmc2VsZi0+dHRwX2Nvbm5lY3QpKQorICAgIHsKKyAgICAgIERFUlJPUihJUkRBX09DQl9FUlJPUiwgIlNvY2tldCBubyBsb25nZXIgY29ubmVjdGluZy4gT3VjaCAhXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogV2UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byBtYWtlIGFueSBtb3JlIHF1ZXJpZXMgKi8KKyAgaXJpYXBfY2xvc2Uoc2VsZi0+aXJpYXApOworICBzZWxmLT5pcmlhcCA9IE5VTEw7CisKKyAgLyogUG9zdCBwcm9jZXNzIHRoZSBJQVMgcmVwbHkgKi8KKyAgc2VsZi0+ZHRzYXBfc2VsID0gaXJuZXRfaWFzX3RvX3RzYXAoc2VsZiwgcmVzdWx0LCB2YWx1ZSk7CisKKyAgLyogSWYgZXJyb3IsIGp1c3QgZ28gb3V0ICovCisgIGlmKHNlbGYtPmVycm5vKQorICAgIHsKKyAgICAgIGNsZWFyX2JpdCgwLCAmc2VsZi0+dHRwX2Nvbm5lY3QpOworICAgICAgREVSUk9SKElSREFfT0NCX0VSUk9SLCAiSUFTIGNvbm5lY3QgZmFpbGVkICEgKDB4JVgpXG4iLCBzZWxmLT5lcnJubyk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIERFQlVHKElSREFfT0NCX0lORk8sICJkYWRkciA9ICUwOHgsIGxzYXAgPSAlZCwgc3RhcnRpbmcgSXJUVFAgY29ubmVjdGlvblxuIiwKKwlzZWxmLT5kYWRkciwgc2VsZi0+ZHRzYXBfc2VsKTsKKworICAvKiBTdGFydCB1cCBUVFAgLSBub24gYmxvY2tpbmcgKi8KKyAgaXJuZXRfY29ubmVjdF90c2FwKHNlbGYpOworCisgIERFWElUKElSREFfT0NCX1RSQUNFLCAiXG4iKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZ1bmN0aW9uIGlybmV0X2Rpc2NvdmVydmFsdWVfY29uZmlybSAocmVzdWx0LCBvYmpfaWQsIHZhbHVlLCBwcml2KQorICoKKyAqICAgIEhhbmRsZSB0aGUgVFNBUCBkaXNjb3ZlcnkgcHJvY2VkdXJlIHN0YXRlIG1hY2hpbmUuCisgKiAgICBHb3QgYW5zd2VyIGZyb20gcmVtb3RlIExNLUlBUywgdHJ5IG5leHQgZGV2aWNlCisgKgorICogV2UgYXJlIGRvaW5nIGEgIFRTQVAgZGlzY292ZXJ5IHByb2NlZHVyZSwgYW5kIHdlIGdvdCBhbiBhbnN3ZXIgdG8KKyAqIGEgSUFTIHF1ZXJ5IHdlIHdlcmUgZG9pbmcgdG8gZmluZCB0aGUgVFNBUCBvbiBvbmUgb2YgdGhlIGFkZHJlc3MKKyAqIGluIHRoZSBkaXNjb3ZlcnkgbG9nLgorICoKKyAqIElmIHdlIGhhdmUgZm91bmQgYSB2YWxpZCBUU0FQIGZvciB0aGUgZmlyc3QgdGltZSwgc2F2ZSBpdC4gSWYgaXQncworICogbm90IHRoZSBmaXJzdCB0aW1lIHdlIGZvdW5kIG9uZSwgY29tcGxhaW4uCisgKgorICogSWYgd2UgaGF2ZSBtb3JlIGFkZHJlc3NlcyBpbiB0aGUgbG9nLCBqdXN0IGluaXRpYXRlIGEgbmV3IHF1ZXJ5LgorICogTm90ZSB0aGF0IHRob3NlIHF1ZXJ5IG1heSBmYWlsIChzZWUgaXJuZXRfZGlzY292ZXJfZGFkZHJfYW5kX2xzYXBfc2VsKCkpCisgKgorICogT3RoZXJ3aXNlLCB3cmFwIHVwIHRoZSBwcm9jZWR1cmUgKGNsZWFudXApLCBjaGVjayBpZiB3ZSBoYXZlIGZvdW5kCisgKiBhbnkgZGV2aWNlIGFuZCBjb25uZWN0IHRvIGl0LgorICovCitzdGF0aWMgdm9pZAoraXJuZXRfZGlzY292ZXJ2YWx1ZV9jb25maXJtKGludAkJcmVzdWx0LAorCQkJICAgIF9fdTE2CW9ial9pZCwgCisJCQkgICAgc3RydWN0IGlhc192YWx1ZSAqdmFsdWUsCisJCQkgICAgdm9pZCAqCXByaXYpCit7CisgIGlybmV0X3NvY2tldCAqCXNlbGYgPSAoaXJuZXRfc29ja2V0ICopIHByaXY7CisgIF9fdTgJCQlkdHNhcF9zZWw7CQkvKiBUU0FQIHdlIGFyZSBsb29raW5nIGZvciAqLworCisgIERFTlRFUihJUkRBX09DQl9UUkFDRSwgIihzZWxmPTB4JXApXG4iLCBzZWxmKTsKKyAgREFTU0VSVChzZWxmICE9IE5VTEwsICwgSVJEQV9PQ0JfRVJST1IsICJTZWxmIGlzIE5VTEwgISEhXG4iKTsKKworICAvKiBDaGVjayBpZiBhbHJlYWR5IGNvbm5lY3RlZCAodmlhIGlybmV0X2Nvbm5lY3Rfc29ja2V0KCkpCisgICAqIG9yIHNvY2tldCBpcyBjbG9zaW5nIGRvd24gKHZpYSBpcmRhX2lybmV0X2Rlc3Ryb3koKSkgKi8KKyAgaWYoISB0ZXN0X2JpdCgwLCAmc2VsZi0+dHRwX2Nvbm5lY3QpKQorICAgIHsKKyAgICAgIERFUlJPUihJUkRBX09DQl9FUlJPUiwgIlNvY2tldCBubyBsb25nZXIgY29ubmVjdGluZy4gT3VjaCAhXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogUG9zdCBwcm9jZXNzIHRoZSBJQVMgcmVwbHkgKi8KKyAgZHRzYXBfc2VsID0gaXJuZXRfaWFzX3RvX3RzYXAoc2VsZiwgcmVzdWx0LCB2YWx1ZSk7CisKKyAgLyogSGF2ZSB3ZSBnb3Qgc29tZXRoaW5nID8gKi8KKyAgaWYoc2VsZi0+ZXJybm8gPT0gMCkKKyAgICB7CisgICAgICAvKiBXZSBmb3VuZCB0aGUgcmVxdWVzdGVkIHNlcnZpY2UgKi8KKyAgICAgIGlmKHNlbGYtPmRhZGRyICE9IERFVl9BRERSX0FOWSkKKwl7CisJICBERVJST1IoSVJEQV9PQ0JfRVJST1IsICJNb3JlIHRoYW4gb25lIGRldmljZSBpbiByYW5nZSBzdXBwb3J0cyBJck5FVC4uLlxuIik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIEZpcnN0IHRpbWUgd2UgZm91bmQgdGhhdCBvbmUsIHNhdmUgaXQgISAqLworCSAgc2VsZi0+ZGFkZHIgPSBzZWxmLT5kaXNjb3Zlcmllc1tzZWxmLT5kaXNjb19pbmRleF0uZGFkZHI7CisJICBzZWxmLT5kdHNhcF9zZWwgPSBkdHNhcF9zZWw7CisJfQorICAgIH0KKworICAvKiBJZiBubyBmYWlsdXJlICovCisgIGlmKChzZWxmLT5lcnJubyA9PSAtRUFERFJOT1RBVkFJTCkgfHwgKHNlbGYtPmVycm5vID09IDApKQorICAgIHsKKyAgICAgIGludAlyZXQ7CisKKyAgICAgIC8qIFNlYXJjaCB0aGUgbmV4dCBub2RlICovCisgICAgICByZXQgPSBpcm5ldF9kaXNjb3Zlcl9uZXh0X2RhZGRyKHNlbGYpOworICAgICAgaWYoIXJldCkKKwl7CisJICAvKiBJbiB0aGlzIGNhc2UsIHRoZSBhYm92ZSByZXF1ZXN0IHdhcyBub24tYmxvY2tpbmcuCisJICAgKiBXZSB3aWxsIHJldHVybiBoZXJlIGFmdGVyIGEgd2hpbGUuLi4gKi8KKwkgIHJldHVybjsKKwl9CisgICAgICAvKiBJbiB0aGlzIGNhc2UsIHdlIGhhdmUgcHJvY2Vzc2VkIHRoZSBsYXN0IGRpc2NvdmVyeSBpdGVtICovCisgICAgfQorCisgIC8qIE5vIG1vcmUgcXVlcmllcyB0byBiZSBkb25lIChmYWlsdXJlIG9yIGxhc3Qgb25lKSAqLworCisgIC8qIFdlIHByb2JhYmx5IGRvbid0IG5lZWQgdG8gbWFrZSBhbnkgbW9yZSBxdWVyaWVzICovCisgIGlyaWFwX2Nsb3NlKHNlbGYtPmlyaWFwKTsKKyAgc2VsZi0+aXJpYXAgPSBOVUxMOworCisgIC8qIE5vIG1vcmUgaXRlbXMgOiByZW1vdmUgdGhlIGxvZyBhbmQgc2lnbmFsIHRlcm1pbmF0aW9uICovCisgIERFQlVHKElSREFfT0NCX0lORk8sICJDbGVhbmluZyB1cCBsb2cgKDB4JXApXG4iLAorCXNlbGYtPmRpc2NvdmVyaWVzKTsKKyAgaWYoc2VsZi0+ZGlzY292ZXJpZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBDbGVhbnVwIG91ciBjb3B5IG9mIHRoZSBkaXNjb3ZlcnkgbG9nICovCisgICAgICBrZnJlZShzZWxmLT5kaXNjb3Zlcmllcyk7CisgICAgICBzZWxmLT5kaXNjb3ZlcmllcyA9IE5VTEw7CisgICAgfQorICBzZWxmLT5kaXNjb19udW1iZXIgPSAtMTsKKworICAvKiBDaGVjayBvdXQgd2hhdCB3ZSBmb3VuZCAqLworICBpZihzZWxmLT5kYWRkciA9PSBERVZfQUREUl9BTlkpCisgICAgeworICAgICAgc2VsZi0+ZGFkZHIgPSBERVZfQUREUl9BTlk7CisgICAgICBjbGVhcl9iaXQoMCwgJnNlbGYtPnR0cF9jb25uZWN0KTsKKyAgICAgIERFWElUKElSREFfT0NCX1RSQUNFLCAiOiBjYW5ub3QgZGlzY292ZXIgSXJORVQgaW4gYW55IGRldmljZSAhISFcbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBXZSBoYXZlIGEgdmFsaWQgYWRkcmVzcyAtIGp1c3QgY29ubmVjdCAqLworCisgIERFQlVHKElSREFfT0NCX0lORk8sICJkYWRkciA9ICUwOHgsIGxzYXAgPSAlZCwgc3RhcnRpbmcgSXJUVFAgY29ubmVjdGlvblxuIiwKKwlzZWxmLT5kYWRkciwgc2VsZi0+ZHRzYXBfc2VsKTsKKworICAvKiBTdGFydCB1cCBUVFAgLSBub24gYmxvY2tpbmcgKi8KKyAgaXJuZXRfY29ubmVjdF90c2FwKHNlbGYpOworCisgIERFWElUKElSREFfT0NCX1RSQUNFLCAiXG4iKTsKK30KKworI2lmZGVmIERJU0NPVkVSWV9FVkVOVFMKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiBpcm5ldF9kaXNjb3ZlcnlfaW5kaWNhdGlvbiAoZGlzY292ZXJ5KQorICoKKyAqICAgIEdvdCBhIGRpc2NvdmVyeSBpbmRpY2F0aW9uIGZyb20gSXJMTVAsIHBvc3QgYW4gZXZlbnQKKyAqCisgKiBOb3RlIDogSXJMTVAgdGFrZSBjYXJlIG9mIG1hdGNoaW5nIHRoZSBoaW50IG1hc2sgZm9yIHVzLCBhbmQgYWxzbworICogY2hlY2sgaWYgaXQgaXMgYSAibmV3IiBub2RlIGZvciB1cy4uLgorICoKKyAqIEFzIElyTE1QIGZpbHRlciBvbiB0aGUgSXJMQU4gaGludCBiaXQsIHdlIGdldCBib3RoIElyTEFOIGFuZCBJck5FVAorICogbm9kZXMsIHNvIGl0J3Mgb25seSBhdCBjb25uZWN0aW9uIHRpbWUgdGhhdCB3ZSB3aWxsIGtub3cgaWYgdGhlCisgKiBub2RlIHN1cHBvcnQgSXJORVQsIElyTEFOIG9yIGJvdGguIFRoZSBvdGhlciBzb2x1dGlvbiBpcyB0byBjaGVjaworICogaW4gSUFTIHRoZSBQTlAgaWRzIGFuZCBzZXJ2aWNlIG5hbWUuCisgKiBOb3RlIDogZXZlbiBpZiBhIG5vZGUgc3VwcG9ydCBJck5FVCAob3IgSXJMQU4pLCBpdCdzIG5vIGd1YXJhbnRlZQorICogdGhhdCB3ZSB3aWxsIGJlIGFibGUgdG8gY29ubmVjdCB0byBpdCwgdGhlIG5vZGUgbWlnaHQgYWxyZWFkeSBiZQorICogYnVzeS4uLgorICoKKyAqIE9uZSBsYXN0IHRoaW5nIDogaW4gc29tZSBjYXNlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgdHJpZ2dlciBkdXBsaWNhdGUKKyAqIGRpc2NvdmVyeSBldmVudHMuIE9uIHRoZSBvdGhlciBoYW5kLCB3ZSBzaG91bGQgY2F0Y2ggYWxsCisgKiBkaXNjb3ZlcmllcyBwcm9wZXJseSAoaS5lLiBub3QgbWlzcyBvbmUpLiBGaWx0ZXJpbmcgZHVwbGljYXRlIGhlcmUKKyAqIGlzIHRvIG1lc3N5LCBzbyB3ZSBsZWF2ZSB0aGF0IHRvIHVzZXIgc3BhY2UuLi4KKyAqLworc3RhdGljIHZvaWQKK2lybmV0X2Rpc2NvdmVyeV9pbmRpY2F0aW9uKGRpc2NpbmZvX3QgKgkJZGlzY292ZXJ5LAorCQkJICAgRElTQ09WRVJZX01PREUJbW9kZSwKKwkJCSAgIHZvaWQgKgkJcHJpdikKK3sKKyAgaXJuZXRfc29ja2V0ICoJc2VsZiA9ICZpcm5ldF9zZXJ2ZXIuczsKKwkKKyAgREVOVEVSKElSREFfT0NCX1RSQUNFLCAiKHNlbGY9MHglcClcbiIsIHNlbGYpOworICBEQVNTRVJUKHByaXYgPT0gJmlybmV0X3NlcnZlciwgLCBJUkRBX09DQl9FUlJPUiwKKwkgICJJbnZhbGlkIGluc3RhbmNlICgweCVwKSAhISFcbiIsIHByaXYpOworCisgIERFQlVHKElSREFfT0NCX0lORk8sICJEaXNjb3ZlcmVkIG5ldyBJck5FVC9JckxBTiBub2RlICVzLi4uXG4iLAorCWRpc2NvdmVyeS0+aW5mbyk7CisKKyAgLyogTm90aWZ5IHRoZSBjb250cm9sIGNoYW5uZWwgKi8KKyAgaXJuZXRfcG9zdF9ldmVudChOVUxMLCBJUk5FVF9ESVNDT1ZFUiwKKwkJICAgZGlzY292ZXJ5LT5zYWRkciwgZGlzY292ZXJ5LT5kYWRkciwgZGlzY292ZXJ5LT5pbmZvLAorCQkgICB1MTZobyhkaXNjb3ZlcnktPmhpbnRzKSk7CisKKyAgREVYSVQoSVJEQV9PQ0JfVFJBQ0UsICJcbiIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJuZXRfZXhwaXJ5X2luZGljYXRpb24gKGV4cGlyeSkKKyAqCisgKiAgICBHb3QgYSBleHBpcnkgaW5kaWNhdGlvbiBmcm9tIElyTE1QLCBwb3N0IGFuIGV2ZW50CisgKgorICogTm90ZSA6IElyTE1QIHRha2UgY2FyZSBvZiBtYXRjaGluZyB0aGUgaGludCBtYXNrIGZvciB1cywgd2Ugb25seQorICogY2hlY2sgaWYgaXQgaXMgYSAibmV3IiBub2RlLi4uCisgKi8KK3N0YXRpYyB2b2lkCitpcm5ldF9leHBpcnlfaW5kaWNhdGlvbihkaXNjaW5mb190ICoJZXhwaXJ5LAorCQkJRElTQ09WRVJZX01PREUJbW9kZSwKKwkJCXZvaWQgKgkJcHJpdikKK3sKKyAgaXJuZXRfc29ja2V0ICoJc2VsZiA9ICZpcm5ldF9zZXJ2ZXIuczsKKwkKKyAgREVOVEVSKElSREFfT0NCX1RSQUNFLCAiKHNlbGY9MHglcClcbiIsIHNlbGYpOworICBEQVNTRVJUKHByaXYgPT0gJmlybmV0X3NlcnZlciwgLCBJUkRBX09DQl9FUlJPUiwKKwkgICJJbnZhbGlkIGluc3RhbmNlICgweCVwKSAhISFcbiIsIHByaXYpOworCisgIERFQlVHKElSREFfT0NCX0lORk8sICJJck5FVC9JckxBTiBub2RlICVzIGV4cGlyZWQuLi5cbiIsCisJZXhwaXJ5LT5pbmZvKTsKKworICAvKiBOb3RpZnkgdGhlIGNvbnRyb2wgY2hhbm5lbCAqLworICBpcm5ldF9wb3N0X2V2ZW50KE5VTEwsIElSTkVUX0VYUElSRSwKKwkJICAgZXhwaXJ5LT5zYWRkciwgZXhwaXJ5LT5kYWRkciwgZXhwaXJ5LT5pbmZvLAorCQkgICB1MTZobyhleHBpcnktPmhpbnRzKSk7CisKKyAgREVYSVQoSVJEQV9PQ0JfVFJBQ0UsICJcbiIpOworfQorI2VuZGlmIC8qIERJU0NPVkVSWV9FVkVOVFMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKiogUFJPQyBFTlRSWSBDQUxMQkFDS1MgKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogV2UgY3JlYXRlIGEgaW5zdGFuY2UgaW4gdGhlIC9wcm9jIGZpbGVzeXN0ZW0sIGFuZCBoZXJlIHdlIHRha2UgY2FyZQorICogb2YgdGhhdC4uLgorICovCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZ1bmN0aW9uIGlybmV0X3Byb2NfcmVhZCAoYnVmLCBzdGFydCwgb2Zmc2V0LCBsZW4sIHVudXNlZCkKKyAqCisgKiAgICBHaXZlIHNvbWUgaW5mbyB0byB0aGUgL3Byb2MgZmlsZSBzeXN0ZW0KKyAqLworc3RhdGljIGludAoraXJuZXRfcHJvY19yZWFkKGNoYXIgKglidWYsCisJCWNoYXIgKioJc3RhcnQsCisJCW9mZl90CW9mZnNldCwKKwkJaW50CWxlbikKK3sKKyAgaXJuZXRfc29ja2V0ICoJc2VsZjsKKyAgY2hhciAqCQlzdGF0ZTsKKyAgaW50CQkJaSA9IDA7CisKKyAgbGVuID0gMDsKKwkKKyAgLyogR2V0IHRoZSBJck5FVCBzZXJ2ZXIgaW5mb3JtYXRpb24uLi4gKi8KKyAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIklyTkVUIHNlcnZlciAtICIpOworICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiSXJEQSBzdGF0ZTogJXMsICIsCisJCSAoaXJuZXRfc2VydmVyLnJ1bm5pbmcgPyAicnVubmluZyIgOiAiZGVhZCIpKTsKKyAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwgInN0c2FwX3NlbDogJTAyeCwgIiwgaXJuZXRfc2VydmVyLnMuc3RzYXBfc2VsKTsKKyAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwgImR0c2FwX3NlbDogJTAyeFxuIiwgaXJuZXRfc2VydmVyLnMuZHRzYXBfc2VsKTsKKworICAvKiBEbyB3ZSBuZWVkIHRvIGNvbnRpbnVlID8gKi8KKyAgaWYoIWlybmV0X3NlcnZlci5ydW5uaW5nKQorICAgIHJldHVybiBsZW47CisKKyAgLyogUHJvdGVjdCBhY2Nlc3MgdG8gdGhlIGluc3RhbmNlIGxpc3QgKi8KKyAgc3Bpbl9sb2NrX2JoKCZpcm5ldF9zZXJ2ZXIuc3BpbmxvY2spOworCisgIC8qIEdldCB0aGUgc29ja2V0cyBvbmUgYnkgb25lLi4uICovCisgIHNlbGYgPSAoaXJuZXRfc29ja2V0ICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGlybmV0X3NlcnZlci5saXN0KTsKKyAgd2hpbGUoc2VsZiAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFN0YXJ0IHByaW50aW5nIGluZm8gYWJvdXQgdGhlIHNvY2tldC4gKi8KKyAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJcbklyTkVUIHNvY2tldCAlZCAtICIsIGkrKyk7CisKKyAgICAgIC8qIEZpcnN0LCBnZXQgdGhlIHJlcXVlc3RlZCBjb25maWd1cmF0aW9uICovCisgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiUmVxdWVzdGVkIElyREEgbmFtZTogXCIlc1wiLCAiLCBzZWxmLT5ybmFtZSk7CisgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiZGFkZHI6ICUwOHgsICIsIHNlbGYtPnJkYWRkcik7CisgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAic2FkZHI6ICUwOHhcbiIsIHNlbGYtPnJzYWRkcik7CisKKyAgICAgIC8qIFNlY29uZCwgZ2V0IGFsbCB0aGUgUFBQIGluZm8gKi8KKyAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICIJUFBQIHN0YXRlOiAlcyIsCisJCSAoc2VsZi0+cHBwX29wZW4gPyAicmVnaXN0ZXJlZCIgOiAidW5yZWdpc3RlcmVkIikpOworICAgICAgaWYoc2VsZi0+cHBwX29wZW4pCisJeworCSAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIiwgdW5pdDogcHBwJWQiLAorCQkJIHBwcF91bml0X251bWJlcigmc2VsZi0+Y2hhbikpOworCSAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIiwgY2hhbm5lbDogJWQiLAorCQkJIHBwcF9jaGFubmVsX2luZGV4KCZzZWxmLT5jaGFuKSk7CisJICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiLCBtcnU6ICVkIiwKKwkJCSBzZWxmLT5tcnUpOworCSAgLyogTWF5YmUgYWRkIHNlbGYtPmZsYWdzID8gTGF0ZXIuLi4gKi8KKwl9CisKKyAgICAgIC8qIFRoZW4sIGdldCBhbGwgdGhlIElyREEgc3BlY2lmaWMgaW5mby4uLiAqLworICAgICAgaWYoc2VsZi0+dHRwX29wZW4pCisJc3RhdGUgPSAiY29ubmVjdGVkIjsKKyAgICAgIGVsc2UKKwlpZihzZWxmLT50c2FwICE9IE5VTEwpCisJICBzdGF0ZSA9ICJjb25uZWN0aW5nIjsKKwllbHNlCisJICBpZihzZWxmLT5pcmlhcCAhPSBOVUxMKQorCSAgICBzdGF0ZSA9ICJzZWFyY2hpbmciOworCSAgZWxzZQorCSAgICBpZihzZWxmLT50dHBfY29ubmVjdCkKKwkgICAgICBzdGF0ZSA9ICJ3ZWlyZCI7CisJICAgIGVsc2UKKwkgICAgICBzdGF0ZSA9ICJpZGxlIjsKKyAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJcbglJckRBIHN0YXRlOiAlcywgIiwgc3RhdGUpOworICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwgImRhZGRyOiAlMDh4LCAiLCBzZWxmLT5kYWRkcik7CisgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAic3RzYXBfc2VsOiAlMDJ4LCAiLCBzZWxmLT5zdHNhcF9zZWwpOworICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwgImR0c2FwX3NlbDogJTAyeFxuIiwgc2VsZi0+ZHRzYXBfc2VsKTsKKworICAgICAgLyogTmV4dCBzb2NrZXQsIHBsZWFzZS4uLiAqLworICAgICAgc2VsZiA9IChpcm5ldF9zb2NrZXQgKikgaGFzaGJpbl9nZXRfbmV4dChpcm5ldF9zZXJ2ZXIubGlzdCk7CisgICAgfQorCisgIC8qIFNwaW4gbG9jayBlbmQgKi8KKyAgc3Bpbl91bmxvY2tfYmgoJmlybmV0X3NlcnZlci5zcGlubG9jayk7CisKKyAgcmV0dXJuIGxlbjsKK30KKyNlbmRpZiAvKiBQUk9DX0ZTICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKiogQ09ORklHVVJBVElPTi9DTEVBTlVQICoqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogSW5pdGlhbGlzYXRpb24gYW5kIHRlYXJkb3duIG9mIHRoZSBJckRBIHBhcnQsIGNhbGxlZCBhdCBtb2R1bGUKKyAqIGluc2VydGlvbiBhbmQgcmVtb3ZhbC4uLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBQcmVwYXJlIHRoZSBJck5FVCBsYXllciBmb3Igb3BlcmF0aW9uLi4uCisgKi8KK2ludCBfX2luaXQKK2lyZGFfaXJuZXRfaW5pdCh2b2lkKQoreworICBpbnQJCWVyciA9IDA7CisKKyAgREVOVEVSKE1PRFVMRV9UUkFDRSwgIigpXG4iKTsKKworICAvKiBQdXJlIHBhcmFub2lhIC0gc2hvdWxkIGJlIHJlZHVuZGFudCAqLworICBtZW1zZXQoJmlybmV0X3NlcnZlciwgMCwgc2l6ZW9mKHN0cnVjdCBpcm5ldF9yb290KSk7CisKKyAgLyogU2V0dXAgc3RhcnQgb2YgaXJuZXQgaW5zdGFuY2UgbGlzdCAqLworICBpcm5ldF9zZXJ2ZXIubGlzdCA9IGhhc2hiaW5fbmV3KEhCX05PTE9DSyk7IAorICBEQUJPUlQoaXJuZXRfc2VydmVyLmxpc3QgPT0gTlVMTCwgLUVOT01FTSwKKwkgTU9EVUxFX0VSUk9SLCAiQ2FuJ3QgYWxsb2NhdGUgaGFzaGJpbiFcbiIpOworICAvKiBJbml0IHNwaW5sb2NrIGZvciBpbnN0YW5jZSBsaXN0ICovCisgIHNwaW5fbG9ja19pbml0KCZpcm5ldF9zZXJ2ZXIuc3BpbmxvY2spOworCisgIC8qIEluaXRpYWxpc2UgY29udHJvbCBjaGFubmVsICovCisgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJmlybmV0X2V2ZW50cy5yd2FpdCk7CisgIGlybmV0X2V2ZW50cy5pbmRleCA9IDA7CisgIC8qIEluaXQgc3BpbmxvY2sgZm9yIGV2ZW50IGxvZ2dpbmcgKi8KKyAgc3Bpbl9sb2NrX2luaXQoJmlybmV0X2V2ZW50cy5zcGlubG9jayk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworICAvKiBBZGQgYSAvcHJvYyBmaWxlIGZvciBpcm5ldCBpbmZvcyAqLworICBjcmVhdGVfcHJvY19pbmZvX2VudHJ5KCJpcm5ldCIsIDAsIHByb2NfaXJkYSwgaXJuZXRfcHJvY19yZWFkKTsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCisgIC8qIFNldHVwIHRoZSBJck5FVCBzZXJ2ZXIgKi8KKyAgZXJyID0gaXJuZXRfc2V0dXBfc2VydmVyKCk7CisKKyAgaWYoIWVycikKKyAgICAvKiBXZSBhcmUgbm8gbG9uZ2VyIGZ1bmN0aW9uYWwuLi4gKi8KKyAgICBpcm5ldF9zZXJ2ZXIucnVubmluZyA9IDE7CisKKyAgREVYSVQoTU9EVUxFX1RSQUNFLCAiXG4iKTsKKyAgcmV0dXJuIGVycjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIENsZWFudXAgYXQgZXhpdC4uLgorICovCit2b2lkIF9fZXhpdAoraXJkYV9pcm5ldF9jbGVhbnVwKHZvaWQpCit7CisgIERFTlRFUihNT0RVTEVfVFJBQ0UsICIoKVxuIik7CisKKyAgLyogV2UgYXJlIG5vIGxvbmdlciB0aGVyZS4uLiAqLworICBpcm5ldF9zZXJ2ZXIucnVubmluZyA9IDA7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworICAvKiBSZW1vdmUgb3VyIC9wcm9jIGZpbGUgKi8KKyAgcmVtb3ZlX3Byb2NfZW50cnkoImlybmV0IiwgcHJvY19pcmRhKTsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCisgIC8qIFJlbW92ZSBvdXIgSXJORVQgc2VydmVyIGZyb20gZXhpc3RlbmNlICovCisgIGlybmV0X2Rlc3Ryb3lfc2VydmVyKCk7CisKKyAgLyogUmVtb3ZlIGFsbCBpbnN0YW5jZXMgb2YgSXJORVQgc29ja2V0IHN0aWxsIHByZXNlbnQgKi8KKyAgaGFzaGJpbl9kZWxldGUoaXJuZXRfc2VydmVyLmxpc3QsIChGUkVFX0ZVTkMpIGlyZGFfaXJuZXRfZGVzdHJveSk7CisKKyAgREVYSVQoTU9EVUxFX1RSQUNFLCAiXG4iKTsKK30KZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lybmV0L2lybmV0X2lyZGEuaCBiL25ldC9pcmRhL2lybmV0L2lybmV0X2lyZGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmZlY2QzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJuZXQvaXJuZXRfaXJkYS5oCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICoJSXJORVQgcHJvdG9jb2wgbW9kdWxlIDogU3luY2hyb25vdXMgUFBQIG92ZXIgYW4gSXJEQSBzb2NrZXQuCisgKgorICoJCUplYW4gSUkgLSBIUEwgYDAwIC0gPGp0QGhwbC5ocC5jb20+CisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIG5lY2Vzc2FyeSBmb3IgdGhlCisgKiBJUkRBIHBhcnQgb2YgdGhlIElyTkVUIG1vZHVsZSAoZGVhbGluZyB3aXRoIElyVFRQLCBJcklBUyBhbmQgY28pLgorICogVGhpcyBmaWxlIGlzIGEgcHJpdmF0ZSBoZWFkZXIsIHNvIG90aGVyIG1vZHVsZXMgZG9uJ3Qgd2FudCB0byBrbm93CisgKiB3aGF0J3MgaW4gdGhlcmUuLi4KKyAqLworCisjaWZuZGVmIElSTkVUX0lSREFfSAorI2RlZmluZSBJUk5FVF9JUkRBX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOQ0xVREVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUGxlYXNlIGFkZCBvdGhlciBoZWFkZXJzIGluIGlybmV0LmggKi8KKworI2luY2x1ZGUgImlybmV0LmgiCQkvKiBNb2R1bGUgZ2xvYmFsIGluY2x1ZGUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBDT05TVEFOVFMgJiBNQUNST1MgKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogTmFtZSBvZiB0aGUgc2VydmljZSAoc29ja2V0IG5hbWUpIHVzZWQgYnkgSXJORVQKKyAqLworLyogSUFTIG9iamVjdCBuYW1lIChvciBwYXJ0IG9mIGl0KSAqLworI2RlZmluZSBJUk5FVF9TRVJWSUNFX05BTUUJIklyTmV0djEiCisvKiBJQVMgYXR0cmlidXRlICovCisjZGVmaW5lIElSTkVUX0lBU19WQUxVRQkJIklyREE6VGlueVRQOkxzYXBTZWwiCisvKiBMTVAgbm90aWZ5IG5hbWUgZm9yIGNsaWVudCAob25seSBmb3IgL3Byb2MvbmV0L2lyZGEvaXJsbXApICovCisjZGVmaW5lIElSTkVUX05PVElGWV9OQU1FCSJJck5FVCBzb2NrZXQiCisvKiBMTVAgbm90aWZ5IG5hbWUgZm9yIHNlcnZlciAob25seSBmb3IgL3Byb2MvbmV0L2lyZGEvaXJsbXApICovCisjZGVmaW5lIElSTkVUX05PVElGWV9OQU1FX1NFUlYJIklyTkVUIHNlcnZlciIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBUWVBFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGlzIGlzIHRoZSBtYWluIHN0cnVjdHVyZSB3aGVyZSB3ZSBzdG9yZSBhbGwgdGhlIGRhdGEgcGVydGFpbmluZyB0bworICogdGhlIElyTkVUIHNlcnZlciAobGlzdGVuIGZvciBjb25uZWN0aW9uIHJlcXVlc3RzKSBhbmQgdGhlIHJvb3QKKyAqIG9mIHRoZSBJck5FVCBzb2NrZXQgbGlzdAorICovCit0eXBlZGVmIHN0cnVjdCBpcm5ldF9yb290Cit7CisgIGlybmV0X3NvY2tldAkJczsJCS8qIFRvIHByZXRlbmQgd2UgYXJlIGEgY2xpZW50Li4uICovCisKKyAgLyogR2VuZXJpYyBzdHVmZiAqLworICBpbnQJCQltYWdpYzsJCS8qIFBhcmFub2lhICovCisgIGludAkJCXJ1bm5pbmc7CS8qIEFyZSB3ZSBvcGVyYXRpb25hbCA/ICovCisKKyAgLyogTGluayBsaXN0IG9mIGFsbCBJck5FVCBpbnN0YW5jZXMgb3BlbmVkICovCisgIGhhc2hiaW5fdCAqCQlsaXN0OworICBzcGlubG9ja190CQlzcGlubG9jazsJLyogU2VyaWFsaXplIGFjY2VzcyB0byB0aGUgbGlzdCAqLworICAvKiBOb3RlIDogdGhlIHdheSBoYXNoYmluIGhhcyBiZWVuIGRlc2lnbmVkIGlzIGFic29sdXRlbHkgbm90CisgICAqIHJlZW50cmFudCwgYmV3YXJlLi4uIFNvLCB3ZSBibGluZGx5IHByb3RlY3QgYWxsIHdpdGggc3BpbmxvY2sgKi8KKworICAvKiBIYW5kbGUgZm9yIHRoZSBoaW50IGJpdCBhZHZlcnRpc2VkIGluIElyTE1QICovCisgIHZvaWQgKgkJc2tleTsKKworICAvKiBTZXJ2ZXIgc29ja2V0IHBhcnQgKi8KKyAgc3RydWN0IGlhc19vYmplY3QgKglpYXNfb2JqOwkvKiBPdXIgc2VydmljZSBuYW1lICsgbHNhcCBpbiBJQVMgKi8KKworfSBpcm5ldF9yb290OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBST1RPVFlQRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ09OVFJPTCBDSEFOTkVMIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgdm9pZAorCWlybmV0X3Bvc3RfZXZlbnQoaXJuZXRfc29ja2V0ICosCisJCQkgaXJuZXRfZXZlbnQsCisJCQkgX191MzIsCisJCQkgX191MzIsCisJCQkgY2hhciAqLAorCQkJIF9fdTE2KTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElSREEgU1VCUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbmxpbmUgaW50CisJaXJuZXRfb3Blbl90c2FwKGlybmV0X3NvY2tldCAqKTsKK3N0YXRpYyBpbmxpbmUgX191OAorCWlybmV0X2lhc190b190c2FwKGlybmV0X3NvY2tldCAqLAorCQkJICBpbnQsCisJCQkgIHN0cnVjdCBpYXNfdmFsdWUgKik7CitzdGF0aWMgaW5saW5lIGludAorCWlybmV0X2ZpbmRfbHNhcF9zZWwoaXJuZXRfc29ja2V0ICopOworc3RhdGljIGlubGluZSBpbnQKKwlpcm5ldF9jb25uZWN0X3RzYXAoaXJuZXRfc29ja2V0ICopOworc3RhdGljIGlubGluZSBpbnQKKwlpcm5ldF9kaXNjb3Zlcl9uZXh0X2RhZGRyKGlybmV0X3NvY2tldCAqKTsKK3N0YXRpYyBpbmxpbmUgaW50CisJaXJuZXRfZGlzY292ZXJfZGFkZHJfYW5kX2xzYXBfc2VsKGlybmV0X3NvY2tldCAqKTsKK3N0YXRpYyBpbmxpbmUgaW50CisJaXJuZXRfZG5hbWVfdG9fZGFkZHIoaXJuZXRfc29ja2V0ICopOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNFUlZFUiBTT0NLRVQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW5saW5lIGludAorCWlybmV0X2RhZGRyX3RvX2RuYW1lKGlybmV0X3NvY2tldCAqKTsKK3N0YXRpYyBpbmxpbmUgaXJuZXRfc29ja2V0ICoKKwlpcm5ldF9maW5kX3NvY2tldChpcm5ldF9zb2NrZXQgKik7CitzdGF0aWMgaW5saW5lIGludAorCWlybmV0X2Nvbm5lY3Rfc29ja2V0KGlybmV0X3NvY2tldCAqLAorCQkJICAgICBpcm5ldF9zb2NrZXQgKiwKKwkJCSAgICAgc3RydWN0IHFvc19pbmZvICosCisJCQkgICAgIF9fdTMyLAorCQkJICAgICBfX3U4KTsKK3N0YXRpYyBpbmxpbmUgdm9pZAorCWlybmV0X2Rpc2Nvbm5lY3Rfc2VydmVyKGlybmV0X3NvY2tldCAqLAorCQkJCXN0cnVjdCBza19idWZmICopOworc3RhdGljIGlubGluZSBpbnQKKwlpcm5ldF9zZXR1cF9zZXJ2ZXIodm9pZCk7CitzdGF0aWMgaW5saW5lIHZvaWQKKwlpcm5ldF9kZXN0cm95X3NlcnZlcih2b2lkKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSVJEQS1UVFAgQ0FMTEJBQ0tTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbnQKKwlpcm5ldF9kYXRhX2luZGljYXRpb24odm9pZCAqLAkJLyogaW5zdGFuY2UgKi8KKwkJCSAgICAgIHZvaWQgKiwJCS8qIHNhcCAqLworCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKik7CitzdGF0aWMgdm9pZAorCWlybmV0X2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICosCisJCQkJICAgIHZvaWQgKiwKKwkJCQkgICAgTE1fUkVBU09OLAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqKTsKK3N0YXRpYyB2b2lkCisJaXJuZXRfY29ubmVjdF9jb25maXJtKHZvaWQgKiwKKwkJCSAgICAgIHZvaWQgKiwKKwkJCSAgICAgIHN0cnVjdCBxb3NfaW5mbyAqLAorCQkJICAgICAgX191MzIsCisJCQkgICAgICBfX3U4LAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKik7CitzdGF0aWMgdm9pZAorCWlybmV0X2Zsb3dfaW5kaWNhdGlvbih2b2lkICosCisJCQkgICAgICB2b2lkICosCisJCQkgICAgICBMT0NBTF9GTE9XKTsKK3N0YXRpYyB2b2lkCisJaXJuZXRfc3RhdHVzX2luZGljYXRpb24odm9pZCAqLAorCQkJCUxJTktfU1RBVFVTLAorCQkJCUxPQ0tfU1RBVFVTKTsKK3N0YXRpYyB2b2lkCisJaXJuZXRfY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKiwKKwkJCQkgdm9pZCAqLAorCQkJCSBzdHJ1Y3QgcW9zX2luZm8gKiwKKwkJCQkgX191MzIsCisJCQkJIF9fdTgsCisJCQkJIHN0cnVjdCBza19idWZmICopOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gSVJEQS1JQVMvTE1QIENBTExCQUNLUyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHZvaWQKKwlpcm5ldF9nZXR2YWx1ZV9jb25maXJtKGludCwKKwkJCSAgICAgICBfX3UxNiwKKwkJCSAgICAgICBzdHJ1Y3QgaWFzX3ZhbHVlICosCisJCQkgICAgICAgdm9pZCAqKTsKK3N0YXRpYyB2b2lkCisJaXJuZXRfZGlzY292ZXJ2YWx1ZV9jb25maXJtKGludCwKKwkJCQkgICAgX191MTYsIAorCQkJCSAgICBzdHJ1Y3QgaWFzX3ZhbHVlICosCisJCQkJICAgIHZvaWQgKik7CisjaWZkZWYgRElTQ09WRVJZX0VWRU5UUworc3RhdGljIHZvaWQKKwlpcm5ldF9kaXNjb3ZlcnlfaW5kaWNhdGlvbihkaXNjaW5mb190ICosCisJCQkJICAgRElTQ09WRVJZX01PREUsCisJCQkJICAgdm9pZCAqKTsKK3N0YXRpYyB2b2lkCisJaXJuZXRfZXhwaXJ5X2luZGljYXRpb24oZGlzY2luZm9fdCAqLAorCQkJCURJU0NPVkVSWV9NT0RFLAorCQkJCXZvaWQgKik7CisjZW5kaWYKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBST0MgRU5UUlkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIGludAorCWlybmV0X3Byb2NfcmVhZChjaGFyICosCisJCQljaGFyICoqLAorCQkJb2ZmX3QsCisJCQlpbnQpOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFZBUklBQkxFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhlIElyTkVUIHNlcnZlci4gTGlzdGVuIHRvIGNvbm5lY3Rpb24gcmVxdWVzdHMgYW5kIGNvLi4uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXJuZXRfcm9vdAlpcm5ldF9zZXJ2ZXI7CisKKy8qIENvbnRyb2wgY2hhbm5lbCBzdHVmZiAobm90ZSA6IGV4dGVybikgKi8KK3N0cnVjdCBpcm5ldF9jdHJsX2NoYW5uZWwJaXJuZXRfZXZlbnRzOworCisvKiBUaGUgL3Byb2MvbmV0L2lyZGEgZGlyZWN0b3J5LCBkZWZpbmVkIGVsc2V3aGVyZS4uLiAqLworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2lyZGE7CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworI2VuZGlmIC8qIElSTkVUX0lSREFfSCAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJuZXQvaXJuZXRfcHBwLmMgYi9uZXQvaXJkYS9pcm5ldC9pcm5ldF9wcHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGY5ODRiCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJuZXQvaXJuZXRfcHBwLmMKQEAgLTAsMCArMSwxMTQyIEBACisvKgorICoJSXJORVQgcHJvdG9jb2wgbW9kdWxlIDogU3luY2hyb25vdXMgUFBQIG92ZXIgYW4gSXJEQSBzb2NrZXQuCisgKgorICoJCUplYW4gSUkgLSBIUEwgYDAwIC0gPGp0QGhwbC5ocC5jb20+CisgKgorICogVGhpcyBmaWxlIGltcGxlbWVudCB0aGUgUFBQIGludGVyZmFjZSBhbmQgL2Rldi9pcm5ldCBjaGFyYWN0ZXIgZGV2aWNlLgorICogVGhlIFBQUCBpbnRlcmZhY2UgaG9vayB0byB0aGUgcHBwX2dlbmVyaWMgbW9kdWxlLCBoYW5kbGUgYWxsIG91cgorICoJcmVsYXRpb25zaGlwIHRvIHRoZSBQUFAgY29kZSBpbiB0aGUga2VybmVsIChhbmQgYnkgZXh0ZW5zaW9uIHRvIHBwcGQpLAorICoJYW5kIGV4Y2hhbmdlIFBQUCBmcmFtZXMgd2l0aCB0aGlzIG1vZHVsZSAoc2VuZC9yZWNlaXZlKS4KKyAqIFRoZSAvZGV2L2lybmV0IGRldmljZSBpcyB1c2VkIHByaW1hcmlseSBmb3IgMiBmdW5jdGlvbnMgOgorICoJMSkgYXMgYSBzdHViIGZvciBwcHBkICh0aGUgcHBwIGRhZW1vbiksIHNvIHRoYXQgd2UgY2FuIGFwcHJvcHJpYXRlbHkKKyAqCWdlbmVyYXRlIFBQUCBzZXNzaW9ucyAod2UgcHJldGVuZCB3ZSBhcmUgYSB0dHkpLgorICoJMikgYXMgYSBjb250cm9sIGNoYW5uZWwgKHdyaXRlIGNvbW1hbmRzLCByZWFkIGV2ZW50cykKKyAqLworCisjaW5jbHVkZSAiaXJuZXRfcHBwLmgiCQkvKiBQcml2YXRlIGhlYWRlciAqLworLyogUGxlYXNlIHB1dCBvdGhlciBoZWFkZXJzIGluIGlybmV0LmggLSBUaGFua3MgKi8KKworLyogR2VuZXJpYyBQUFAgY2FsbGJhY2tzICh0byBjYWxsIHVzKSAqLworc3RhdGljIHN0cnVjdCBwcHBfY2hhbm5lbF9vcHMgaXJuZXRfcHBwX29wcyA9IHsKKwkuc3RhcnRfeG1pdCA9IHBwcF9pcm5ldF9zZW5kLAorCS5pb2N0bCA9IHBwcF9pcm5ldF9pb2N0bAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogQ09OVFJPTCBDSEFOTkVMICoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogV2hlbiBhIHBwcGQgaW5zdGFuY2UgaXMgbm90IGFjdGl2ZSBvbiAvZGV2L2lybmV0LCBpdCBhY3RzIGFzIGEgY29udHJvbAorICogY2hhbm5lbC4KKyAqIFdyaXRpbmcgYWxsb3cgdG8gc2V0IHVwIHRoZSBJckRBIGRlc3RpbmF0aW9uIG9mIHRoZSBJck5FVCBjaGFubmVsLAorICogYW5kIGFueSBhcHBsaWNhdGlvbiBtYXkgYmUgcmVhZCBldmVudHMgaGFwcGVuaW5nIGluIElyTkVULi4uCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdyaXRlIGlzIHVzZWQgdG8gc2VuZCBhIGNvbW1hbmQgdG8gY29uZmlndXJlIGEgSXJORVQgY2hhbm5lbAorICogYmVmb3JlIGl0IGlzIG9wZW4gYnkgcHBwZC4gVGhlIHN5bnRheCBpcyA6ICJjb21tYW5kIGFyZ3VtZW50IgorICogQ3VycmVudGx5IHRoZXJlIGlzIG9ubHkgdHdvIGRlZmluZWQgY29tbWFuZHMgOgorICoJbyBuYW1lIDogc2V0IHRoZSByZXF1ZXN0ZWQgSXJEQSBuaWNrbmFtZSBvZiB0aGUgSXJORVQgcGVlci4KKyAqCW8gYWRkciA6IHNldCB0aGUgcmVxdWVzdGVkIElyREEgYWRkcmVzcyBvZiB0aGUgSXJORVQgcGVlci4KKyAqIE5vdGUgOiB0aGUgY29kZSBpcyBjcnVkZSwgYnV0IGVmZmVjdGl2ZS4uLgorICovCitzdGF0aWMgaW5saW5lIHNzaXplX3QKK2lybmV0X2N0cmxfd3JpdGUoaXJuZXRfc29ja2V0ICoJYXAsCisJCSBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkgc2l6ZV90CQljb3VudCkKK3sKKyAgY2hhcgkJY29tbWFuZFtJUk5FVF9NQVhfQ09NTUFORF07CisgIGNoYXIgKglzdGFydDsJCS8qIEN1cnJlbnQgY29tbWFuZCBiZWluZyBwcm9jZXNzZWQgKi8KKyAgY2hhciAqCW5leHQ7CQkvKiBOZXh0IGNvbW1hbmQgdG8gcHJvY2VzcyAqLworICBpbnQJCWxlbmd0aDsJCS8qIExlbmd0aCBvZiBjdXJyZW50IGNvbW1hbmQgKi8KKworICBERU5URVIoQ1RSTF9UUkFDRSwgIihhcD0weCVwLCBjb3VudD0lWmQpXG4iLCBhcCwgY291bnQpOworCisgIC8qIENoZWNrIGZvciBvdmVyZmxvdy4uLiAqLworICBEQUJPUlQoY291bnQgPj0gSVJORVRfTUFYX0NPTU1BTkQsIC1FTk9NRU0sCisJIENUUkxfRVJST1IsICJUb28gbXVjaCBkYXRhICEhIVxuIik7CisKKyAgLyogR2V0IHRoZSBkYXRhIGluIHRoZSBkcml2ZXIgKi8KKyAgaWYoY29weV9mcm9tX3VzZXIoY29tbWFuZCwgYnVmLCBjb3VudCkpCisgICAgeworICAgICAgREVSUk9SKENUUkxfRVJST1IsICJJbnZhbGlkIHVzZXIgc3BhY2UgcG9pbnRlci5cbiIpOworICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgfQorCisgIC8qIFNhZmUgdGVybWluYXRlIHRoZSBzdHJpbmcgKi8KKyAgY29tbWFuZFtjb3VudF0gPSAnXDAnOworICBERUJVRyhDVFJMX0lORk8sICJDb21tYW5kIGxpbmUgcmVjZWl2ZWQgaXMgYGAlcycnICglWmQpLlxuIiwKKwljb21tYW5kLCBjb3VudCk7CisKKyAgLyogQ2hlY2sgZXZlcnkgY29tbWFuZHMgaW4gdGhlIGNvbW1hbmQgbGluZSAqLworICBuZXh0ID0gY29tbWFuZDsKKyAgd2hpbGUobmV4dCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIExvb2sgYXQgdGhlIG5leHQgY29tbWFuZCAqLworICAgICAgc3RhcnQgPSBuZXh0OworCisgICAgICAvKiBTY3JhcCB3aGl0ZXNwYWNlcyBiZWZvcmUgdGhlIGNvbW1hbmQgKi8KKyAgICAgIHdoaWxlKGlzc3BhY2UoKnN0YXJ0KSkKKwlzdGFydCsrOworCisgICAgICAvKiAnLCcgaXMgb3VyIGNvbW1hbmQgc2VwYXJhdG9yICovCisgICAgICBuZXh0ID0gc3RyY2hyKHN0YXJ0LCAnLCcpOworICAgICAgaWYobmV4dCkKKwl7CisJICAqbmV4dCA9ICdcMCc7CQkJLyogVGVybWluYXRlIGNvbW1hbmQgKi8KKwkgIGxlbmd0aCA9IG5leHQgLSBzdGFydDsJLyogTGVuZ3RoICovCisJICBuZXh0Kys7CQkJLyogU2tpcCB0aGUgJ1wwJyAqLworCX0KKyAgICAgIGVsc2UKKwlsZW5ndGggPSBzdHJsZW4oc3RhcnQpOworCisgICAgICBERUJVRyhDVFJMX0lORk8sICJGb3VuZCBjb21tYW5kIGBgJXMnJyAoJWQpLlxuIiwgc3RhcnQsIGxlbmd0aCk7CisKKyAgICAgIC8qIENoZWNrIGlmIHdlIHJlY29nbmlzZWQgb25lIG9mIHRoZSBrbm93biBjb21tYW5kCisgICAgICAgKiBXZSBjYW4ndCB1c2UgInN3aXRjaCIgd2l0aCBzdHJpbmdzLCBzbyBoYWNrIHdpdGggImNvbnRpbnVlIiAqLworICAgICAgCisgICAgICAvKiBGaXJzdCBjb21tYW5kIDogbmFtZSAtPiBSZXF1ZXN0ZWQgSXJEQSBuaWNrbmFtZSAqLworICAgICAgaWYoIXN0cm5jbXAoc3RhcnQsICJuYW1lIiwgNCkpCisJeworCSAgLyogQ29weSB0aGUgbmFtZSBvbmx5IGlmIGlzIGluY2x1ZGVkIGFuZCBub3QgImFueSIgKi8KKwkgIGlmKChsZW5ndGggPiA1KSAmJiAoc3RyY21wKHN0YXJ0ICsgNSwgImFueSIpKSkKKwkgICAgeworCSAgICAgIC8qIFN0cmlwIG91dCB0cmFpbGluZyB3aGl0ZXNwYWNlcyAqLworCSAgICAgIHdoaWxlKGlzc3BhY2Uoc3RhcnRbbGVuZ3RoIC0gMV0pKQorCQlsZW5ndGgtLTsKKworCSAgICAgIC8qIENvcHkgdGhlIG5hbWUgZm9yIGxhdGVyIHJldXNlICovCisJICAgICAgbWVtY3B5KGFwLT5ybmFtZSwgc3RhcnQgKyA1LCBsZW5ndGggLSA1KTsKKwkgICAgICBhcC0+cm5hbWVbbGVuZ3RoIC0gNV0gPSAnXDAnOworCSAgICB9CisJICBlbHNlCisJICAgIGFwLT5ybmFtZVswXSA9ICdcMCc7CisJICBERUJVRyhDVFJMX0lORk8sICJHb3Qgcm5hbWUgPSBgYCVzJydcbiIsIGFwLT5ybmFtZSk7CisKKwkgIC8qIFJlc3RhcnQgdGhlIGxvb3AgKi8KKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogU2Vjb25kIGNvbW1hbmQgOiBhZGRyLCBkYWRkciAtPiBSZXF1ZXN0ZWQgSXJEQSBkZXN0aW5hdGlvbiBhZGRyZXNzCisgICAgICAgKiBBbHNvIHByb2Nlc3MgOiBzYWRkciAtPiBSZXF1ZXN0ZWQgSXJEQSBzb3VyY2UgYWRkcmVzcyAqLworICAgICAgaWYoKCFzdHJuY21wKHN0YXJ0LCAiYWRkciIsIDQpKSB8fAorCSAoIXN0cm5jbXAoc3RhcnQsICJkYWRkciIsIDUpKSB8fAorCSAoIXN0cm5jbXAoc3RhcnQsICJzYWRkciIsIDUpKSkKKwl7CisJICBfX3UzMgkJYWRkciA9IERFVl9BRERSX0FOWTsKKworCSAgLyogQ29weSB0aGUgYWRkcmVzcyBvbmx5IGlmIGlzIGluY2x1ZGVkIGFuZCBub3QgImFueSIgKi8KKwkgIGlmKChsZW5ndGggPiA1KSAmJiAoc3RyY21wKHN0YXJ0ICsgNSwgImFueSIpKSkKKwkgICAgeworCSAgICAgIGNoYXIgKgliZWdwID0gc3RhcnQgKyA1OworCSAgICAgIGNoYXIgKgllbmRwOworCisJICAgICAgLyogU2NyYXAgd2hpdGVzcGFjZXMgYmVmb3JlIHRoZSBjb21tYW5kICovCisJICAgICAgd2hpbGUoaXNzcGFjZSgqYmVncCkpCisJCWJlZ3ArKzsKKworCSAgICAgIC8qIENvbnZlcnQgYXJndW1lbnQgdG8gYSBudW1iZXIgKGxhc3QgYXJnIGlzIHRoZSBiYXNlKSAqLworCSAgICAgIGFkZHIgPSBzaW1wbGVfc3RydG91bChiZWdwLCAmZW5kcCwgMTYpOworCSAgICAgIC8qIEhhcyBpdCB3b3JrZWQgID8gKGVuZHAgc2hvdWxkIGJlIHN0YXJ0ICsgbGVuZ3RoKSAqLworCSAgICAgIERBQk9SVChlbmRwIDw9IChzdGFydCArIDUpLCAtRUlOVkFMLAorCQkgICAgIENUUkxfRVJST1IsICJJbnZhbGlkIGFkZHJlc3MuXG4iKTsKKwkgICAgfQorCSAgLyogV2hpY2ggdHlwZSBvZiBhZGRyZXNzID8gKi8KKwkgIGlmKHN0YXJ0WzBdID09ICdzJykKKwkgICAgeworCSAgICAgIC8qIFNhdmUgaXQgKi8KKwkgICAgICBhcC0+cnNhZGRyID0gYWRkcjsKKwkgICAgICBERUJVRyhDVFJMX0lORk8sICJHb3QgcnNhZGRyID0gJTA4eFxuIiwgYXAtPnJzYWRkcik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIFNhdmUgaXQgKi8KKwkgICAgICBhcC0+cmRhZGRyID0gYWRkcjsKKwkgICAgICBERUJVRyhDVFJMX0lORk8sICJHb3QgcmRhZGRyID0gJTA4eFxuIiwgYXAtPnJkYWRkcik7CisJICAgIH0KKworCSAgLyogUmVzdGFydCB0aGUgbG9vcCAqLworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBPdGhlciBwb3NzaWJsZSBjb21tYW5kIDogY29ubmVjdCBOIChudW1iZXIgb2YgcmV0cmllcykgKi8KKworICAgICAgLyogTm8gY29tbWFuZCBtYXRjaGVkIC0+IEZhaWxlZC4uLiAqLworICAgICAgREFCT1JUKDEsIC1FSU5WQUwsIENUUkxfRVJST1IsICJOb3QgYSByZWNvZ25pc2VkIElyTkVUIGNvbW1hbmQuXG4iKTsKKyAgICB9CisKKyAgLyogU3VjY2VzcyA6IHdlIGhhdmUgcGFyc2VkIGFsbCBjb21tYW5kcyBzdWNjZXNzZnVsbHkgKi8KKyAgcmV0dXJuKGNvdW50KTsKK30KKworI2lmZGVmIElOSVRJQUxfRElTQ09WRVJZCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJuZXRfZ2V0X2Rpc2NvdmVyeV9sb2cgKHNlbGYpCisgKgorICogICAgUXVlcnkgdGhlIGNvbnRlbnQgb24gdGhlIGRpc2NvdmVyeSBsb2cgaWYgbm90IGRvbmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHF1ZXJ5IHRoZSBjdXJyZW50IGNvbnRlbnQgb2YgdGhlIGRpc2NvdmVyeSBsb2cKKyAqIGF0IHRoZSBzdGFydHVwIG9mIHRoZSBldmVudCBjaGFubmVsIGFuZCBzYXZlIGl0IGluIHRoZSBpbnRlcm5hbCBzdHJ1Y3QuCisgKi8KK3N0YXRpYyB2b2lkCitpcm5ldF9nZXRfZGlzY292ZXJ5X2xvZyhpcm5ldF9zb2NrZXQgKglhcCkKK3sKKyAgX191MTYJCW1hc2sgPSBpcmxtcF9zZXJ2aWNlX3RvX2hpbnQoU19MQU4pOworCisgIC8qIEFzayBJckxNUCBmb3IgdGhlIGN1cnJlbnQgZGlzY292ZXJ5IGxvZyAqLworICBhcC0+ZGlzY292ZXJpZXMgPSBpcmxtcF9nZXRfZGlzY292ZXJpZXMoJmFwLT5kaXNjb19udW1iZXIsIG1hc2ssCisJCQkJCSAgRElTQ09WRVJZX0RFRkFVTFRfU0xPVFMpOworCisgIC8qIENoZWNrIGlmIHRoZSB3ZSBnb3Qgc29tZSByZXN1bHRzICovCisgIGlmKGFwLT5kaXNjb3ZlcmllcyA9PSBOVUxMKQorICAgIGFwLT5kaXNjb19udW1iZXIgPSAtMTsKKworICBERUJVRyhDVFJMX0lORk8sICJHb3QgdGhlIGxvZyAoMHglcCksIHNpemUgaXMgJWRcbiIsCisJYXAtPmRpc2NvdmVyaWVzLCBhcC0+ZGlzY29fbnVtYmVyKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZ1bmN0aW9uIGlybmV0X3JlYWRfZGlzY292ZXJ5X2xvZyAoc2VsZiwgZXZlbnQpCisgKgorICogICAgUmVhZCB0aGUgY29udGVudCBvbiB0aGUgZGlzY292ZXJ5IGxvZworICoKKyAqIFRoaXMgZnVuY3Rpb24gZHVtcCB0aGUgY3VycmVudCBjb250ZW50IG9mIHRoZSBkaXNjb3ZlcnkgbG9nCisgKiBhdCB0aGUgc3RhcnR1cCBvZiB0aGUgZXZlbnQgY2hhbm5lbC4KKyAqIFJldHVybiAxIGlmIHdyb3RlIGFuIGV2ZW50IG9uIHRoZSBjb250cm9sIGNoYW5uZWwuLi4KKyAqCisgKiBTdGF0ZSBvZiB0aGUgYXAtPmRpc2NvX1hYWCB2YXJpYWJsZXMgOgorICogU29ja2V0IGNyZWF0aW9uIDogIGRpc2NvdmVyaWVzID0gTlVMTCA7IGRpc2NvX2luZGV4ID0gMCA7IGRpc2NvX251bWJlciA9IDAKKyAqIFdoaWxlIHJlYWRpbmcgOiAgICBkaXNjb3ZlcmllcyA9IHB0ciAgOyBkaXNjb19pbmRleCA9IFggOyBkaXNjb19udW1iZXIgPSBZCisgKiBBZnRlciByZWFkaW5nIDogICAgZGlzY292ZXJpZXMgPSBOVUxMIDsgZGlzY29faW5kZXggPSBZIDsgZGlzY29fbnVtYmVyID0gLTEKKyAqLworc3RhdGljIGlubGluZSBpbnQKK2lybmV0X3JlYWRfZGlzY292ZXJ5X2xvZyhpcm5ldF9zb2NrZXQgKglhcCwKKwkJCSBjaGFyICoJCWV2ZW50KQoreworICBpbnQJCWRvbmVfZXZlbnQgPSAwOworCisgIERFTlRFUihDVFJMX1RSQUNFLCAiKGFwPTB4JXAsIGV2ZW50PTB4JXApXG4iLAorCSBhcCwgZXZlbnQpOworCisgIC8qIFRlc3QgaWYgd2UgaGF2ZSBzb21lIHdvcmsgdG8gZG8gb3Igd2UgaGF2ZSBhbHJlYWR5IGZpbmlzaGVkICovCisgIGlmKGFwLT5kaXNjb19udW1iZXIgPT0gLTEpCisgICAgeworICAgICAgREVCVUcoQ1RSTF9JTkZPLCAiQWxyZWFkeSBkb25lXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBUZXN0IGlmIGl0J3MgdGhlIGZpcnN0IHRpbWUgYW5kIHRoZXJlZm9yZSB3ZSBuZWVkIHRvIGdldCB0aGUgbG9nICovCisgIGlmKGFwLT5kaXNjb3ZlcmllcyA9PSBOVUxMKQorICAgIGlybmV0X2dldF9kaXNjb3ZlcnlfbG9nKGFwKTsKKworICAvKiBDaGVjayBpZiB3ZSBoYXZlIG1vcmUgaXRlbSB0byBkdW1wICovCisgIGlmKGFwLT5kaXNjb19pbmRleCA8IGFwLT5kaXNjb19udW1iZXIpCisgICAgeworICAgICAgLyogV3JpdGUgYW4gZXZlbnQgKi8KKyAgICAgIHNwcmludGYoZXZlbnQsICJGb3VuZCAlMDh4ICglcykgYmVoaW5kICUwOHgge2hpbnRzICUwMlgtJTAyWH1cbiIsCisJICAgICAgYXAtPmRpc2NvdmVyaWVzW2FwLT5kaXNjb19pbmRleF0uZGFkZHIsCisJICAgICAgYXAtPmRpc2NvdmVyaWVzW2FwLT5kaXNjb19pbmRleF0uaW5mbywKKwkgICAgICBhcC0+ZGlzY292ZXJpZXNbYXAtPmRpc2NvX2luZGV4XS5zYWRkciwKKwkgICAgICBhcC0+ZGlzY292ZXJpZXNbYXAtPmRpc2NvX2luZGV4XS5oaW50c1swXSwKKwkgICAgICBhcC0+ZGlzY292ZXJpZXNbYXAtPmRpc2NvX2luZGV4XS5oaW50c1sxXSk7CisgICAgICBERUJVRyhDVFJMX0lORk8sICJXcml0aW5nIGRpc2NvdmVyeSAlZCA6ICVzXG4iLAorCSAgICBhcC0+ZGlzY29faW5kZXgsIGFwLT5kaXNjb3Zlcmllc1thcC0+ZGlzY29faW5kZXhdLmluZm8pOworCisgICAgICAvKiBXZSBoYXZlIGFuIGV2ZW50ICovCisgICAgICBkb25lX2V2ZW50ID0gMTsKKyAgICAgIC8qIE5leHQgZGlzY292ZXJ5ICovCisgICAgICBhcC0+ZGlzY29faW5kZXgrKzsKKyAgICB9CisKKyAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBkb25lIHRoZSBsYXN0IGl0ZW0gKi8KKyAgaWYoYXAtPmRpc2NvX2luZGV4ID49IGFwLT5kaXNjb19udW1iZXIpCisgICAgeworICAgICAgLyogTm8gbW9yZSBpdGVtcyA6IHJlbW92ZSB0aGUgbG9nIGFuZCBzaWduYWwgdGVybWluYXRpb24gKi8KKyAgICAgIERFQlVHKENUUkxfSU5GTywgIkNsZWFuaW5nIHVwIGxvZyAoMHglcClcbiIsCisJICAgIGFwLT5kaXNjb3Zlcmllcyk7CisgICAgICBpZihhcC0+ZGlzY292ZXJpZXMgIT0gTlVMTCkKKwl7CisJICAvKiBDbGVhbnVwIG91ciBjb3B5IG9mIHRoZSBkaXNjb3ZlcnkgbG9nICovCisJICBrZnJlZShhcC0+ZGlzY292ZXJpZXMpOworCSAgYXAtPmRpc2NvdmVyaWVzID0gTlVMTDsKKwl9CisgICAgICBhcC0+ZGlzY29fbnVtYmVyID0gLTE7CisgICAgfQorCisgIHJldHVybiBkb25lX2V2ZW50OworfQorI2VuZGlmIC8qIElOSVRJQUxfRElTQ09WRVJZICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSZWFkIGlzIHVzZWQgdG8gZ2V0IElyTkVUIGV2ZW50cworICovCitzdGF0aWMgaW5saW5lIHNzaXplX3QKK2lybmV0X2N0cmxfcmVhZChpcm5ldF9zb2NrZXQgKglhcCwKKwkJc3RydWN0IGZpbGUgKglmaWxlLAorCQljaGFyIF9fdXNlciAqCWJ1ZiwKKwkJc2l6ZV90CQljb3VudCkKK3sKKyAgREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisgIGNoYXIJCWV2ZW50WzY0XTsJLyogTWF4IGV2ZW50IGlzIDYxIGNoYXIgKi8KKyAgc3NpemVfdAlyZXQgPSAwOworCisgIERFTlRFUihDVFJMX1RSQUNFLCAiKGFwPTB4JXAsIGNvdW50PSVaZClcbiIsIGFwLCBjb3VudCk7CisKKyAgLyogQ2hlY2sgaWYgd2UgY2FuIHdyaXRlIGFuIGV2ZW50IG91dCBpbiBvbmUgZ28gKi8KKyAgREFCT1JUKGNvdW50IDwgc2l6ZW9mKGV2ZW50KSwgLUVPVkVSRkxPVywgQ1RSTF9FUlJPUiwgIkJ1ZmZlciB0byBzbWFsbC5cbiIpOworCisjaWZkZWYgSU5JVElBTF9ESVNDT1ZFUlkKKyAgLyogQ2hlY2sgaWYgd2UgaGF2ZSByZWFkIHRoZSBsb2cgKi8KKyAgaWYoaXJuZXRfcmVhZF9kaXNjb3ZlcnlfbG9nKGFwLCBldmVudCkpCisgICAgeworICAgICAgLyogV2UgaGF2ZSBhbiBldmVudCAhISEgQ29weSBpdCB0byB0aGUgdXNlciAqLworICAgICAgaWYoY29weV90b191c2VyKGJ1ZiwgZXZlbnQsIHN0cmxlbihldmVudCkpKQorCXsKKwkgIERFUlJPUihDVFJMX0VSUk9SLCAiSW52YWxpZCB1c2VyIHNwYWNlIHBvaW50ZXIuXG4iKTsKKwkgIHJldHVybiAtRUZBVUxUOworCX0KKworICAgICAgREVYSVQoQ1RSTF9UUkFDRSwgIlxuIik7CisgICAgICByZXR1cm4oc3RybGVuKGV2ZW50KSk7CisgICAgfQorI2VuZGlmIC8qIElOSVRJQUxfRElTQ09WRVJZICovCisKKyAgLyogUHV0IG91cnNlbHZlcyBvbiB0aGUgd2FpdCBxdWV1ZSB0byBiZSB3b2tlbiB1cCAqLworICBhZGRfd2FpdF9xdWV1ZSgmaXJuZXRfZXZlbnRzLnJ3YWl0LCAmd2FpdCk7CisgIGN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworICBmb3IoOzspCisgICAgeworICAgICAgLyogSWYgdGhlcmUgaXMgdW5yZWFkIGV2ZW50cyAqLworICAgICAgcmV0ID0gMDsKKyAgICAgIGlmKGFwLT5ldmVudF9pbmRleCAhPSBpcm5ldF9ldmVudHMuaW5kZXgpCisJYnJlYWs7CisgICAgICByZXQgPSAtRUFHQUlOOworICAgICAgaWYoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJYnJlYWs7CisgICAgICByZXQgPSAtRVJFU1RBUlRTWVM7CisgICAgICBpZihzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwlicmVhazsKKyAgICAgIC8qIFlpZWxkIGFuZCB3YWl0IHRvIGJlIHdva2VuIHVwICovCisgICAgICBzY2hlZHVsZSgpOworICAgIH0KKyAgY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisgIHJlbW92ZV93YWl0X3F1ZXVlKCZpcm5ldF9ldmVudHMucndhaXQsICZ3YWl0KTsKKworICAvKiBEaWQgd2UgZ290IGl0ID8gKi8KKyAgaWYocmV0ICE9IDApCisgICAgeworICAgICAgLyogTm8sIHJldHVybiB0aGUgZXJyb3IgY29kZSAqLworICAgICAgREVYSVQoQ1RSTF9UUkFDRSwgIiAtIHJldCAlWmRcbiIsIHJldCk7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAvKiBXaGljaCBldmVudCBpcyBpdCA/ICovCisgIHN3aXRjaChpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0uZXZlbnQpCisgICAgeworICAgIGNhc2UgSVJORVRfRElTQ09WRVI6CisgICAgICBzcHJpbnRmKGV2ZW50LCAiRGlzY292ZXJlZCAlMDh4ICglcykgYmVoaW5kICUwOHgge2hpbnRzICUwMlgtJTAyWH1cbiIsCisJICAgICAgaXJuZXRfZXZlbnRzLmxvZ1thcC0+ZXZlbnRfaW5kZXhdLmRhZGRyLAorCSAgICAgIGlybmV0X2V2ZW50cy5sb2dbYXAtPmV2ZW50X2luZGV4XS5uYW1lLAorCSAgICAgIGlybmV0X2V2ZW50cy5sb2dbYXAtPmV2ZW50X2luZGV4XS5zYWRkciwKKwkgICAgICBpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0uaGludHMuYnl0ZVswXSwKKwkgICAgICBpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0uaGludHMuYnl0ZVsxXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElSTkVUX0VYUElSRToKKyAgICAgIHNwcmludGYoZXZlbnQsICJFeHBpcmVkICUwOHggKCVzKSBiZWhpbmQgJTA4eCB7aGludHMgJTAyWC0lMDJYfVxuIiwKKwkgICAgICBpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0uZGFkZHIsCisJICAgICAgaXJuZXRfZXZlbnRzLmxvZ1thcC0+ZXZlbnRfaW5kZXhdLm5hbWUsCisJICAgICAgaXJuZXRfZXZlbnRzLmxvZ1thcC0+ZXZlbnRfaW5kZXhdLnNhZGRyLAorCSAgICAgIGlybmV0X2V2ZW50cy5sb2dbYXAtPmV2ZW50X2luZGV4XS5oaW50cy5ieXRlWzBdLAorCSAgICAgIGlybmV0X2V2ZW50cy5sb2dbYXAtPmV2ZW50X2luZGV4XS5oaW50cy5ieXRlWzFdKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVJORVRfQ09OTkVDVF9UTzoKKyAgICAgIHNwcmludGYoZXZlbnQsICJDb25uZWN0ZWQgdG8gJTA4eCAoJXMpIG9uIHBwcCVkXG4iLAorCSAgICAgIGlybmV0X2V2ZW50cy5sb2dbYXAtPmV2ZW50X2luZGV4XS5kYWRkciwKKwkgICAgICBpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0ubmFtZSwKKwkgICAgICBpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0udW5pdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElSTkVUX0NPTk5FQ1RfRlJPTToKKyAgICAgIHNwcmludGYoZXZlbnQsICJDb25uZWN0aW9uIGZyb20gJTA4eCAoJXMpIG9uIHBwcCVkXG4iLAorCSAgICAgIGlybmV0X2V2ZW50cy5sb2dbYXAtPmV2ZW50X2luZGV4XS5kYWRkciwKKwkgICAgICBpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0ubmFtZSwKKwkgICAgICBpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0udW5pdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElSTkVUX1JFUVVFU1RfRlJPTToKKyAgICAgIHNwcmludGYoZXZlbnQsICJSZXF1ZXN0IGZyb20gJTA4eCAoJXMpIGJlaGluZCAlMDh4XG4iLAorCSAgICAgIGlybmV0X2V2ZW50cy5sb2dbYXAtPmV2ZW50X2luZGV4XS5kYWRkciwKKwkgICAgICBpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0ubmFtZSwKKwkgICAgICBpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0uc2FkZHIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJUk5FVF9OT0FOU1dFUl9GUk9NOgorICAgICAgc3ByaW50ZihldmVudCwgIk5vLWFuc3dlciBmcm9tICUwOHggKCVzKSBvbiBwcHAlZFxuIiwKKwkgICAgICBpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0uZGFkZHIsCisJICAgICAgaXJuZXRfZXZlbnRzLmxvZ1thcC0+ZXZlbnRfaW5kZXhdLm5hbWUsCisJICAgICAgaXJuZXRfZXZlbnRzLmxvZ1thcC0+ZXZlbnRfaW5kZXhdLnVuaXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJUk5FVF9CTE9DS0VEX0xJTks6CisgICAgICBzcHJpbnRmKGV2ZW50LCAiQmxvY2tlZCBsaW5rIHdpdGggJTA4eCAoJXMpIG9uIHBwcCVkXG4iLAorCSAgICAgIGlybmV0X2V2ZW50cy5sb2dbYXAtPmV2ZW50X2luZGV4XS5kYWRkciwKKwkgICAgICBpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0ubmFtZSwKKwkgICAgICBpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0udW5pdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElSTkVUX0RJU0NPTk5FQ1RfRlJPTToKKyAgICAgIHNwcmludGYoZXZlbnQsICJEaXNjb25uZWN0aW9uIGZyb20gJTA4eCAoJXMpIG9uIHBwcCVkXG4iLAorCSAgICAgIGlybmV0X2V2ZW50cy5sb2dbYXAtPmV2ZW50X2luZGV4XS5kYWRkciwKKwkgICAgICBpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0ubmFtZSwKKwkgICAgICBpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0udW5pdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIElSTkVUX0RJU0NPTk5FQ1RfVE86CisgICAgICBzcHJpbnRmKGV2ZW50LCAiRGlzY29ubmVjdGVkIHRvICUwOHggKCVzKVxuIiwKKwkgICAgICBpcm5ldF9ldmVudHMubG9nW2FwLT5ldmVudF9pbmRleF0uZGFkZHIsCisJICAgICAgaXJuZXRfZXZlbnRzLmxvZ1thcC0+ZXZlbnRfaW5kZXhdLm5hbWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHNwcmludGYoZXZlbnQsICJCdWdcbiIpOworICAgIH0KKyAgLyogSW5jcmVtZW50IG91ciBldmVudCBpbmRleCAqLworICBhcC0+ZXZlbnRfaW5kZXggPSAoYXAtPmV2ZW50X2luZGV4ICsgMSkgJSBJUk5FVF9NQVhfRVZFTlRTOworCisgIERFQlVHKENUUkxfSU5GTywgIkV2ZW50IGlzIDolcyIsIGV2ZW50KTsKKworICAvKiBDb3B5IGl0IHRvIHRoZSB1c2VyICovCisgIGlmKGNvcHlfdG9fdXNlcihidWYsIGV2ZW50LCBzdHJsZW4oZXZlbnQpKSkKKyAgICB7CisgICAgICBERVJST1IoQ1RSTF9FUlJPUiwgIkludmFsaWQgdXNlciBzcGFjZSBwb2ludGVyLlxuIik7CisgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICB9CisKKyAgREVYSVQoQ1RSTF9UUkFDRSwgIlxuIik7CisgIHJldHVybihzdHJsZW4oZXZlbnQpKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFBvbGwgOiBjYWxsZWQgd2hlbiBzb21lb25lIGRvIGEgc2VsZWN0IG9uIC9kZXYvaXJuZXQuCisgKiBKdXN0IGNoZWNrIGlmIHRoZXJlIGFyZSBuZXcgZXZlbnRzLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Citpcm5ldF9jdHJsX3BvbGwoaXJuZXRfc29ja2V0ICoJYXAsCisJCXN0cnVjdCBmaWxlICoJZmlsZSwKKwkJcG9sbF90YWJsZSAqCXdhaXQpCit7CisgIHVuc2lnbmVkIGludCBtYXNrOworCisgIERFTlRFUihDVFJMX1RSQUNFLCAiKGFwPTB4JXApXG4iLCBhcCk7CisKKyAgcG9sbF93YWl0KGZpbGUsICZpcm5ldF9ldmVudHMucndhaXQsIHdhaXQpOworICBtYXNrID0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisgIC8qIElmIHRoZXJlIGlzIHVucmVhZCBldmVudHMgKi8KKyAgaWYoYXAtPmV2ZW50X2luZGV4ICE9IGlybmV0X2V2ZW50cy5pbmRleCkKKyAgICBtYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisjaWZkZWYgSU5JVElBTF9ESVNDT1ZFUlkKKyAgaWYoYXAtPmRpc2NvX251bWJlciAhPSAtMSkKKyAgICB7CisgICAgICAvKiBUZXN0IGlmIGl0J3MgdGhlIGZpcnN0IHRpbWUgYW5kIHRoZXJlZm9yZSB3ZSBuZWVkIHRvIGdldCB0aGUgbG9nICovCisgICAgICBpZihhcC0+ZGlzY292ZXJpZXMgPT0gTlVMTCkKKwlpcm5ldF9nZXRfZGlzY292ZXJ5X2xvZyhhcCk7CisgICAgICAvKiBSZWNoZWNrICovCisgICAgICBpZihhcC0+ZGlzY29fbnVtYmVyICE9IC0xKQorCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKyAgICB9CisjZW5kaWYgLyogSU5JVElBTF9ESVNDT1ZFUlkgKi8KKworICBERVhJVChDVFJMX1RSQUNFLCAiIC0gbWFzaz0weCVYXG4iLCBtYXNrKTsKKyAgcmV0dXJuIG1hc2s7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqIEZJTEVTWVNURU0gQ0FMTEJBQ0tTICoqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEltcGxlbWVudCB0aGUgdXN1YWwgb3BlbiwgcmVhZCwgd3JpdGUgZnVuY3Rpb25zIHRoYXQgd2lsbCBiZSBjYWxsZWQKKyAqIGJ5IHRoZSBmaWxlIHN5c3RlbSB3aGVuIHNvbWUgYWN0aW9uIGlzIHBlcmZvcm1lZCBvbiAvZGV2L2lybmV0LgorICogTW9zdCBvZiB0aG9zZSBhY3Rpb25zIHdpbGwgaW4gZmFjdCBiZSBwZXJmb3JtZWQgYnkgInBwcGQiIG9yCisgKiB0aGUgY29udHJvbCBjaGFubmVsLCB3ZSBqdXN0IGFjdCBhcyBhIHJlZGlyZWN0b3IuLi4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogT3BlbiA6IHdoZW4gc29tZWJvZHkgb3BlbiAvZGV2L2lybmV0CisgKiBXZSBiYXNpY2FsbHkgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGlybmV0IGFuZCBpbml0aWFsaXNlIGl0LgorICovCitzdGF0aWMgaW50CitkZXZfaXJuZXRfb3BlbihzdHJ1Y3QgaW5vZGUgKglpbm9kZSwKKwkgICAgICAgc3RydWN0IGZpbGUgKglmaWxlKQoreworICBzdHJ1Y3QgaXJuZXRfc29ja2V0ICoJYXA7CisgIGludAkJCWVycjsKKworICBERU5URVIoRlNfVFJBQ0UsICIoZmlsZT0weCVwKVxuIiwgZmlsZSk7CisKKyNpZmRlZiBTRUNVUkVfREVWSVJORVQKKyAgLyogVGhpcyBjb3VsZCAoc2hvdWxkPykgYmUgZW5mb3JjZWQgYnkgdGhlIHBlcm1pc3Npb25zIG9uIC9kZXYvaXJuZXQuICovCisgIGlmKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorICAgIHJldHVybiAtRVBFUk07CisjZW5kaWYgLyogU0VDVVJFX0RFVklSTkVUICovCisKKyAgLyogQWxsb2NhdGUgYSBwcml2YXRlIHN0cnVjdHVyZSBmb3IgdGhpcyBJck5FVCBpbnN0YW5jZSAqLworICBhcCA9IGttYWxsb2Moc2l6ZW9mKCphcCksIEdGUF9LRVJORUwpOworICBEQUJPUlQoYXAgPT0gTlVMTCwgLUVOT01FTSwgRlNfRVJST1IsICJDYW4ndCBhbGxvY2F0ZSBzdHJ1Y3QgaXJuZXQuLi5cbiIpOworCisgIC8qIGluaXRpYWxpemUgdGhlIGlybmV0IHN0cnVjdHVyZSAqLworICBtZW1zZXQoYXAsIDAsIHNpemVvZigqYXApKTsKKyAgYXAtPmZpbGUgPSBmaWxlOworCisgIC8qIFBQUCBjaGFubmVsIHNldHVwICovCisgIGFwLT5wcHBfb3BlbiA9IDA7CisgIGFwLT5jaGFuLnByaXZhdGUgPSBhcDsKKyAgYXAtPmNoYW4ub3BzID0gJmlybmV0X3BwcF9vcHM7CisgIGFwLT5jaGFuLm10dSA9ICgyMDQ4IC0gVFRQX01BWF9IRUFERVIgLSAyIC0gUFBQX0hEUkxFTik7CisgIGFwLT5jaGFuLmhkcmxlbiA9IDIgKyBUVFBfTUFYX0hFQURFUjsJCS8qIGZvciBBL0MgKyBNYXggSXJEQSBoZHIgKi8KKyAgLyogUFBQIHBhcmFtZXRlcnMgKi8KKyAgYXAtPm1ydSA9ICgyMDQ4IC0gVFRQX01BWF9IRUFERVIgLSAyIC0gUFBQX0hEUkxFTik7CisgIGFwLT54YWNjbVswXSA9IH4wVTsKKyAgYXAtPnhhY2NtWzNdID0gMHg2MDAwMDAwMFU7CisgIGFwLT5yYWNjbSA9IH4wVTsKKworICAvKiBTZXR1cCB0aGUgSXJEQSBwYXJ0Li4uICovCisgIGVyciA9IGlyZGFfaXJuZXRfY3JlYXRlKGFwKTsKKyAgaWYoZXJyKQorICAgIHsKKyAgICAgIERFUlJPUihGU19FUlJPUiwgIkNhbid0IHNldHVwIElyREEgbGluay4uLlxuIik7CisgICAgICBrZnJlZShhcCk7CisgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAvKiBGb3IgdGhlIGNvbnRyb2wgY2hhbm5lbCAqLworICBhcC0+ZXZlbnRfaW5kZXggPSBpcm5ldF9ldmVudHMuaW5kZXg7CS8qIENhbmNlbCBhbGwgcGFzdCBldmVudHMgKi8KKworICAvKiBQdXQgb3VyIHN0dWZmIHdoZXJlIHdlIHdpbGwgYmUgYWJsZSB0byBmaW5kIGl0IGxhdGVyICovCisgIGZpbGUtPnByaXZhdGVfZGF0YSA9IGFwOworCisgIERFWElUKEZTX1RSQUNFLCAiIC0gYXA9MHglcFxuIiwgYXApOworICByZXR1cm4gMDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ2xvc2UgOiB3aGVuIHNvbWVib2R5IGNsb3NlIC9kZXYvaXJuZXQKKyAqIERlc3Ryb3kgdGhlIGluc3RhbmNlIG9mIC9kZXYvaXJuZXQKKyAqLworc3RhdGljIGludAorZGV2X2lybmV0X2Nsb3NlKHN0cnVjdCBpbm9kZSAqCWlub2RlLAorCQlzdHJ1Y3QgZmlsZSAqCWZpbGUpCit7CisgIGlybmV0X3NvY2tldCAqCWFwID0gKHN0cnVjdCBpcm5ldF9zb2NrZXQgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCisgIERFTlRFUihGU19UUkFDRSwgIihmaWxlPTB4JXAsIGFwPTB4JXApXG4iLAorCSBmaWxlLCBhcCk7CisgIERBQk9SVChhcCA9PSBOVUxMLCAwLCBGU19FUlJPUiwgImFwIGlzIE5VTEwgISEhXG4iKTsKKworICAvKiBEZXRhY2ggb3Vyc2VsdmVzICovCisgIGZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisKKyAgLyogQ2xvc2UgSXJEQSBzdHVmZiAqLworICBpcmRhX2lybmV0X2Rlc3Ryb3koYXApOworCisgIC8qIERpc2Nvbm5lY3QgZnJvbSB0aGUgZ2VuZXJpYyBQUFAgbGF5ZXIgaWYgbm90IGFscmVhZHkgZG9uZSAqLworICBpZihhcC0+cHBwX29wZW4pCisgICAgeworICAgICAgREVSUk9SKEZTX0VSUk9SLCAiQ2hhbm5lbCBzdGlsbCByZWdpc3RlcmVkIC0gZGVyZWdpc3RlcmluZyAhXG4iKTsKKyAgICAgIGFwLT5wcHBfb3BlbiA9IDA7CisgICAgICBwcHBfdW5yZWdpc3Rlcl9jaGFubmVsKCZhcC0+Y2hhbik7CisgICAgfQorCisgIGtmcmVlKGFwKTsKKworICBERVhJVChGU19UUkFDRSwgIlxuIik7CisgIHJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV3JpdGUgZG9lcyBub3RoaW5nLgorICogKHdlIHJlY2VpdmUgcGFja2V0IGZyb20gcHBwX2dlbmVyaWMgdGhyb3VnaCBwcHBfaXJuZXRfc2VuZCgpKQorICovCitzdGF0aWMgc3NpemVfdAorZGV2X2lybmV0X3dyaXRlKHN0cnVjdCBmaWxlICoJZmlsZSwKKwkJY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJc2l6ZV90CQljb3VudCwKKwkJbG9mZl90ICoJcHBvcykKK3sKKyAgaXJuZXRfc29ja2V0ICoJYXAgPSAoc3RydWN0IGlybmV0X3NvY2tldCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKyAgRFBBU1MoRlNfVFJBQ0UsICIoZmlsZT0weCVwLCBhcD0weCVwLCBjb3VudD0lWmQpXG4iLAorCWZpbGUsIGFwLCBjb3VudCk7CisgIERBQk9SVChhcCA9PSBOVUxMLCAtRU5YSU8sIEZTX0VSUk9SLCAiYXAgaXMgTlVMTCAhISFcbiIpOworCisgIC8qIElmIHdlIGFyZSBjb25uZWN0ZWQgdG8gcHBwX2dlbmVyaWMsIGxldCBpdCBoYW5kbGUgdGhlIGpvYiAqLworICBpZihhcC0+cHBwX29wZW4pCisgICAgcmV0dXJuIC1FQUdBSU47CisgIGVsc2UKKyAgICByZXR1cm4gaXJuZXRfY3RybF93cml0ZShhcCwgYnVmLCBjb3VudCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSZWFkIGRvZXNuJ3QgZG8gbXVjaCBlaXRoZXIuCisgKiAocHBwZCBwb2xsIHVzLCBidXQgdWx0aW1hdGVseSByZWFkcyB0aHJvdWdoIC9kZXYvcHBwKQorICovCitzdGF0aWMgc3NpemVfdAorZGV2X2lybmV0X3JlYWQoc3RydWN0IGZpbGUgKglmaWxlLAorCSAgICAgICBjaGFyIF9fdXNlciAqCWJ1ZiwKKwkgICAgICAgc2l6ZV90CQljb3VudCwKKwkgICAgICAgbG9mZl90ICoJCXBwb3MpCit7CisgIGlybmV0X3NvY2tldCAqCWFwID0gKHN0cnVjdCBpcm5ldF9zb2NrZXQgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCisgIERQQVNTKEZTX1RSQUNFLCAiKGZpbGU9MHglcCwgYXA9MHglcCwgY291bnQ9JVpkKVxuIiwKKwlmaWxlLCBhcCwgY291bnQpOworICBEQUJPUlQoYXAgPT0gTlVMTCwgLUVOWElPLCBGU19FUlJPUiwgImFwIGlzIE5VTEwgISEhXG4iKTsKKworICAvKiBJZiB3ZSBhcmUgY29ubmVjdGVkIHRvIHBwcF9nZW5lcmljLCBsZXQgaXQgaGFuZGxlIHRoZSBqb2IgKi8KKyAgaWYoYXAtPnBwcF9vcGVuKQorICAgIHJldHVybiAtRUFHQUlOOworICBlbHNlCisgICAgcmV0dXJuIGlybmV0X2N0cmxfcmVhZChhcCwgZmlsZSwgYnVmLCBjb3VudCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBQb2xsIDogY2FsbGVkIHdoZW4gc29tZW9uZSBkbyBhIHNlbGVjdCBvbiAvZGV2L2lybmV0CisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2Rldl9pcm5ldF9wb2xsKHN0cnVjdCBmaWxlICoJZmlsZSwKKwkgICAgICAgcG9sbF90YWJsZSAqCXdhaXQpCit7CisgIGlybmV0X3NvY2tldCAqCWFwID0gKHN0cnVjdCBpcm5ldF9zb2NrZXQgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworICB1bnNpZ25lZCBpbnQJCW1hc2s7CisKKyAgREVOVEVSKEZTX1RSQUNFLCAiKGZpbGU9MHglcCwgYXA9MHglcClcbiIsCisJIGZpbGUsIGFwKTsKKworICBtYXNrID0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisgIERBQk9SVChhcCA9PSBOVUxMLCBtYXNrLCBGU19FUlJPUiwgImFwIGlzIE5VTEwgISEhXG4iKTsKKworICAvKiBJZiB3ZSBhcmUgY29ubmVjdGVkIHRvIHBwcF9nZW5lcmljLCBsZXQgaXQgaGFuZGxlIHRoZSBqb2IgKi8KKyAgaWYoIWFwLT5wcHBfb3BlbikKKyAgICBtYXNrIHw9IGlybmV0X2N0cmxfcG9sbChhcCwgZmlsZSwgd2FpdCk7CisKKyAgREVYSVQoRlNfVFJBQ0UsICIgLSBtYXNrPTB4JVhcbiIsIG1hc2spOworICByZXR1cm4obWFzayk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBJT0N0bCA6IENhbGxlZCB3aGVuIHNvbWVvbmUgZG9lcyBzb21lIGlvY3RscyBvbiAvZGV2L2lybmV0CisgKiBUaGlzIGlzIHRoZSB3YXkgcHBwZCBjb25maWd1cmUgdXMgYW5kIGNvbnRyb2wgdXMgd2hpbGUgdGhlIFBQUAorICogaW5zdGFuY2UgaXMgYWN0aXZlLgorICovCitzdGF0aWMgaW50CitkZXZfaXJuZXRfaW9jdGwoc3RydWN0IGlub2RlICoJaW5vZGUsCisJCXN0cnVjdCBmaWxlICoJZmlsZSwKKwkJdW5zaWduZWQgaW50CWNtZCwKKwkJdW5zaWduZWQgbG9uZwlhcmcpCit7CisgIGlybmV0X3NvY2tldCAqCWFwID0gKHN0cnVjdCBpcm5ldF9zb2NrZXQgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworICBpbnQJCQllcnI7CisgIGludAkJCXZhbDsKKyAgdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKyAgREVOVEVSKEZTX1RSQUNFLCAiKGZpbGU9MHglcCwgYXA9MHglcCwgY21kPTB4JVgpXG4iLAorCSBmaWxlLCBhcCwgY21kKTsKKworICAvKiBCYXNpYyBjaGVja3MuLi4gKi8KKyAgREFTU0VSVChhcCAhPSBOVUxMLCAtRU5YSU8sIFBQUF9FUlJPUiwgImFwIGlzIE5VTEwuLi5cbiIpOworI2lmZGVmIFNFQ1VSRV9ERVZJUk5FVAorICBpZighY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKyAgICByZXR1cm4gLUVQRVJNOworI2VuZGlmIC8qIFNFQ1VSRV9ERVZJUk5FVCAqLworCisgIGVyciA9IC1FRkFVTFQ7CisgIHN3aXRjaChjbWQpCisgICAgeworICAgICAgLyogU2V0IGRpc2NpcGxpbmUgKHNob3VsZCBiZSBOX1NZTkNfUFBQIG9yIE5fVFRZKSAqLworICAgIGNhc2UgVElPQ1NFVEQ6CisgICAgICBpZihnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopYXJncCkpCisJYnJlYWs7CisgICAgICBpZigodmFsID09IE5fU1lOQ19QUFApIHx8ICh2YWwgPT0gTl9QUFApKQorCXsKKwkgIERFQlVHKEZTX0lORk8sICJFbnRlcmluZyBQUFAgZGlzY2lwbGluZS5cbiIpOworCSAgLyogUFBQIGNoYW5uZWwgc2V0dXAgKGFwLT5jaGFuIGluIGNvbmZpZ3VlZCBpbiBkZXZfaXJuZXRfb3BlbigpKSovCisJICBlcnIgPSBwcHBfcmVnaXN0ZXJfY2hhbm5lbCgmYXAtPmNoYW4pOworCSAgaWYoZXJyID09IDApCisJICAgIHsKKwkgICAgICAvKiBPdXIgcHBwIHNpZGUgaXMgYWN0aXZlICovCisJICAgICAgYXAtPnBwcF9vcGVuID0gMTsKKworCSAgICAgIERFQlVHKEZTX0lORk8sICJUcnlpbmcgdG8gZXN0YWJsaXNoIGEgY29ubmVjdGlvbi5cbiIpOworCSAgICAgIC8qIFNldHVwIHRoZSBJckRBIGxpbmsgbm93IC0gbWF5IGZhaWwuLi4gKi8KKwkgICAgICBpcmRhX2lybmV0X2Nvbm5lY3QoYXApOworCSAgICB9CisJICBlbHNlCisJICAgIERFUlJPUihGU19FUlJPUiwgIkNhbid0IHNldHVwIFBQUCBjaGFubmVsLi4uXG4iKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogSW4gdGhlb3J5LCBzaG91bGQgYmUgTl9UVFkgKi8KKwkgIERFQlVHKEZTX0lORk8sICJFeGl0aW5nIFBQUCBkaXNjaXBsaW5lLlxuIik7CisJICAvKiBEaXNjb25uZWN0IGZyb20gdGhlIGdlbmVyaWMgUFBQIGxheWVyICovCisJICBpZihhcC0+cHBwX29wZW4pCisJICAgIHsKKwkgICAgICBhcC0+cHBwX29wZW4gPSAwOworCSAgICAgIHBwcF91bnJlZ2lzdGVyX2NoYW5uZWwoJmFwLT5jaGFuKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBERVJST1IoRlNfRVJST1IsICJDaGFubmVsIG5vdCByZWdpc3RlcmVkICFcbiIpOworCSAgZXJyID0gMDsKKwl9CisgICAgICBicmVhazsKKworICAgICAgLyogUXVlcnkgUFBQIGNoYW5uZWwgYW5kIHVuaXQgbnVtYmVyICovCisgICAgY2FzZSBQUFBJT0NHQ0hBTjoKKyAgICAgIGlmKCFhcC0+cHBwX29wZW4pCisJYnJlYWs7CisgICAgICBpZihwdXRfdXNlcihwcHBfY2hhbm5lbF9pbmRleCgmYXAtPmNoYW4pLCAoaW50IF9fdXNlciAqKWFyZ3ApKQorCWJyZWFrOworICAgICAgREVCVUcoRlNfSU5GTywgIlF1ZXJ5IGNoYW5uZWwuXG4iKTsKKyAgICAgIGVyciA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBQUElPQ0dVTklUOgorICAgICAgaWYoIWFwLT5wcHBfb3BlbikKKwlicmVhazsKKyAgICAgIGlmKHB1dF91c2VyKHBwcF91bml0X251bWJlcigmYXAtPmNoYW4pLCAoaW50IF9fdXNlciAqKWFyZ3ApKQorCWJyZWFrOworICAgICAgREVCVUcoRlNfSU5GTywgIlF1ZXJ5IHVuaXQgbnVtYmVyLlxuIik7CisgICAgICBlcnIgPSAwOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIEFsbCB0aGVzZSBpb2N0bHMgY2FuIGJlIHBhc3NlZCBib3RoIGRpcmVjdGx5IGFuZCBmcm9tIHBwcF9nZW5lcmljLAorICAgICAgICogc28gd2UganVzdCBkZWFsIHdpdGggdGhlbSBpbiBvbmUgcGxhY2UuLi4KKyAgICAgICAqLworICAgIGNhc2UgUFBQSU9DR0ZMQUdTOgorICAgIGNhc2UgUFBQSU9DU0ZMQUdTOgorICAgIGNhc2UgUFBQSU9DR0FTWU5DTUFQOgorICAgIGNhc2UgUFBQSU9DU0FTWU5DTUFQOgorICAgIGNhc2UgUFBQSU9DR1JBU1lOQ01BUDoKKyAgICBjYXNlIFBQUElPQ1NSQVNZTkNNQVA6CisgICAgY2FzZSBQUFBJT0NHWEFTWU5DTUFQOgorICAgIGNhc2UgUFBQSU9DU1hBU1lOQ01BUDoKKyAgICBjYXNlIFBQUElPQ0dNUlU6CisgICAgY2FzZSBQUFBJT0NTTVJVOgorICAgICAgREVCVUcoRlNfSU5GTywgIlN0YW5kYXJkIFBQUCBpb2N0bC5cbiIpOworICAgICAgaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJZXJyID0gLUVQRVJNOworICAgICAgZWxzZQorCWVyciA9IHBwcF9pcm5ldF9pb2N0bCgmYXAtPmNoYW4sIGNtZCwgYXJnKTsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBUVFkgSU9DVExzIDogUHJldGVuZCB0aGF0IHdlIGFyZSBhIHR0eSwgdG8ga2VlcCBwcHBkIGhhcHB5ICovCisgICAgICAvKiBHZXQgdGVybWlvcyAqLworICAgIGNhc2UgVENHRVRTOgorICAgICAgREVCVUcoRlNfSU5GTywgIkdldCB0ZXJtaW9zLlxuIik7CisgICAgICBpZihrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3MoKHN0cnVjdCB0ZXJtaW9zIF9fdXNlciAqKWFyZ3AsICZhcC0+dGVybWlvcykpCisJYnJlYWs7CisgICAgICBlcnIgPSAwOworICAgICAgYnJlYWs7CisgICAgICAvKiBTZXQgdGVybWlvcyAqLworICAgIGNhc2UgVENTRVRTRjoKKyAgICAgIERFQlVHKEZTX0lORk8sICJTZXQgdGVybWlvcy5cbiIpOworICAgICAgaWYodXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKCZhcC0+dGVybWlvcywgKHN0cnVjdCB0ZXJtaW9zIF9fdXNlciAqKWFyZ3ApKQorCWJyZWFrOworICAgICAgZXJyID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBTZXQgRFRSL1JUUyAqLworICAgIGNhc2UgVElPQ01CSVM6IAorICAgIGNhc2UgVElPQ01CSUM6CisgICAgICAvKiBTZXQgZXhjbHVzaXZlL25vbi1leGNsdXNpdmUgbW9kZSAqLworICAgIGNhc2UgVElPQ0VYQ0w6CisgICAgY2FzZSBUSU9DTlhDTDoKKyAgICAgIERFQlVHKEZTX0lORk8sICJUVFkgY29tcGF0aWJpbGl0eS5cbiIpOworICAgICAgZXJyID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUQ0dFVEE6CisgICAgICBERUJVRyhGU19JTkZPLCAiVENHRVRBXG4iKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUQ0ZMU0g6CisgICAgICBERUJVRyhGU19JTkZPLCAiVENGTFNIXG4iKTsKKyAgICAgIC8qIE5vdGUgOiB0aGlzIHdpbGwgZmx1c2ggYnVmZmVycyBpbiBQUFAsIHNvIGl0ICptdXN0KiBiZSBkb25lCisgICAgICAgKiBXZSBzaG91bGQgYWxzbyB3b3JyeSB0aGF0IHdlIGRvbid0IGFjY2VwdCBqdW5rIGhlcmUgYW5kIHRoYXQKKyAgICAgICAqIHdlIGdldCByaWQgb2Ygb3VyIG93biBidWZmZXJzICovCisjaWZkZWYgRkxVU0hfVE9fUFBQCisgICAgICBwcHBfb3V0cHV0X3dha2V1cCgmYXAtPmNoYW4pOworI2VuZGlmIC8qIEZMVVNIX1RPX1BQUCAqLworICAgICAgZXJyID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGSU9OUkVBRDoKKyAgICAgIERFQlVHKEZTX0lORk8sICJGSU9OUkVBRFxuIik7CisgICAgICB2YWwgPSAwOworICAgICAgaWYocHV0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZ3ApKQorCWJyZWFrOworICAgICAgZXJyID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIERFUlJPUihGU19FUlJPUiwgIlVuc3VwcG9ydGVkIGlvY3RsICgweCVYKVxuIiwgY21kKTsKKyAgICAgIGVyciA9IC1FTk9JT0NUTENNRDsKKyAgICB9CisKKyAgREVYSVQoRlNfVFJBQ0UsICIgLSBlcnIgPSAweCVYXG4iLCBlcnIpOworICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogUFBQIENBTExCQUNLUyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGlzIGFyZSB0aGUgZnVuY3Rpb25zIHRoYXQgdGhlIGdlbmVyaWMgUFBQIGRyaXZlciBpbiB0aGUga2VybmVsCisgKiB3aWxsIGNhbGwgdG8gY29tbXVuaWNhdGUgdG8gdXMuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByZXBhcmUgdGhlIHBwcCBmcmFtZSBmb3IgdHJhbnNtaXNzaW9uIG92ZXIgdGhlIElyREEgc29ja2V0LgorICogV2UgbWFrZSBzdXJlIHRoYXQgdGhlIGhlYWRlciBzcGFjZSBpcyBlbm91Z2gsIGFuZCB3ZSBjaGFuZ2UgcHBwIGhlYWRlcgorICogYWNjb3JkaW5nIHRvIGZsYWdzIHBhc3NlZCBieSBwcHBkLgorICogVGhpcyBpcyBub3QgYSBjYWxsYmFjaywgYnV0IGp1c3QgYSBoZWxwZXIgZnVuY3Rpb24gdXNlZCBpbiBwcHBfaXJuZXRfc2VuZCgpCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKgoraXJuZXRfcHJlcGFyZV9za2IoaXJuZXRfc29ja2V0ICoJYXAsCisJCSAgc3RydWN0IHNrX2J1ZmYgKglza2IpCit7CisgIHVuc2lnbmVkIGNoYXIgKglkYXRhOworICBpbnQJCQlwcm90bzsJCS8qIFBQUCBwcm90b2NvbCAqLworICBpbnQJCQlpc2xjcDsJCS8qIFByb3RvY29sID09IExDUCAqLworICBpbnQJCQluZWVkYWRkcjsJLyogTmVlZCBQUFAgYWRkcmVzcyAqLworCisgIERFTlRFUihQUFBfVFJBQ0UsICIoYXA9MHglcCwgc2tiPTB4JXApXG4iLAorCSBhcCwgc2tiKTsKKworICAvKiBFeHRyYWN0IFBQUCBwcm90b2NvbCBmcm9tIHRoZSBmcmFtZSAqLworICBkYXRhICA9IHNrYi0+ZGF0YTsKKyAgcHJvdG8gPSAoZGF0YVswXSA8PCA4KSArIGRhdGFbMV07CisKKyAgLyogTENQIHBhY2tldHMgd2l0aCBjb2RlcyBiZXR3ZWVuIDEgKGNvbmZpZ3VyZS1yZXF1ZXN0KQorICAgKiBhbmQgNyAoY29kZS1yZWplY3QpIG11c3QgYmUgc2VudCBhcyB0aG91Z2ggbm8gb3B0aW9ucworICAgKiBoYXZlIGJlZW4gbmVnb3RpYXRlZC4gKi8KKyAgaXNsY3AgPSAocHJvdG8gPT0gUFBQX0xDUCkgJiYgKDEgPD0gZGF0YVsyXSkgJiYgKGRhdGFbMl0gPD0gNyk7CisKKyAgLyogY29tcHJlc3MgcHJvdG9jb2wgZmllbGQgaWYgb3B0aW9uIGVuYWJsZWQgKi8KKyAgaWYoKGRhdGFbMF0gPT0gMCkgJiYgKGFwLT5mbGFncyAmIFNDX0NPTVBfUFJPVCkgJiYgKCFpc2xjcCkpCisgICAgc2tiX3B1bGwoc2tiLDEpOworCisgIC8qIENoZWNrIGlmIHdlIG5lZWQgYWRkcmVzcy9jb250cm9sIGZpZWxkcyAqLworICBuZWVkYWRkciA9IDIqKChhcC0+ZmxhZ3MgJiBTQ19DT01QX0FDKSA9PSAwIHx8IGlzbGNwKTsKKworICAvKiBJcyB0aGUgc2tiIGhlYWRyb29tIGxhcmdlIGVub3VnaCB0byBjb250YWluIGFsbCBJckRBLWhlYWRlcnM/ICovCisgIGlmKChza2JfaGVhZHJvb20oc2tiKSA8IChhcC0+bWF4X2hlYWRlcl9zaXplICsgbmVlZGFkZHIpKSB8fAorICAgICAgKHNrYl9zaGFyZWQoc2tiKSkpCisgICAgeworICAgICAgc3RydWN0IHNrX2J1ZmYgKgluZXdfc2tiOworCisgICAgICBERUJVRyhQUFBfSU5GTywgIlJlYWxsb2NhdGluZyBza2JcbiIpOworCisgICAgICAvKiBDcmVhdGUgYSBuZXcgc2tiICovCisgICAgICBuZXdfc2tiID0gc2tiX3JlYWxsb2NfaGVhZHJvb20oc2tiLCBhcC0+bWF4X2hlYWRlcl9zaXplICsgbmVlZGFkZHIpOworCisgICAgICAvKiBXZSBoYXZlIHRvIGZyZWUgdGhlIG9yaWdpbmFsIHNrYiBhbnl3YXkgKi8KKyAgICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKKworICAgICAgLyogRGlkIHRoZSByZWFsbG9jIHN1Y2NlZWQgPyAqLworICAgICAgREFCT1JUKG5ld19za2IgPT0gTlVMTCwgTlVMTCwgUFBQX0VSUk9SLCAiQ291bGQgbm90IHJlYWxsb2Mgc2tiXG4iKTsKKworICAgICAgLyogVXNlIHRoZSBuZXcgc2tiIGluc3RlYWQgKi8KKyAgICAgIHNrYiA9IG5ld19za2I7CisgICAgfQorCisgIC8qIHByZXBlbmQgYWRkcmVzcy9jb250cm9sIGZpZWxkcyBpZiBuZWNlc3NhcnkgKi8KKyAgaWYobmVlZGFkZHIpCisgICAgeworICAgICAgc2tiX3B1c2goc2tiLCAyKTsKKyAgICAgIHNrYi0+ZGF0YVswXSA9IFBQUF9BTExTVEFUSU9OUzsKKyAgICAgIHNrYi0+ZGF0YVsxXSA9IFBQUF9VSTsKKyAgICB9CisKKyAgREVYSVQoUFBQX1RSQUNFLCAiXG4iKTsKKworICByZXR1cm4gc2tiOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU2VuZCBhIHBhY2tldCB0byB0aGUgcGVlciBvdmVyIHRoZSBJclRUUCBjb25uZWN0aW9uLgorICogUmV0dXJucyAxIGlmZiB0aGUgcGFja2V0IHdhcyBhY2NlcHRlZC4KKyAqIFJldHVybnMgMCBpZmYgcGFja2V0IHdhcyBub3QgY29uc3VtZWQuCisgKiBJZiB0aGUgcGFja2V0IHdhcyBub3QgYWNjZXB0ZWQsIHdlIHdpbGwgY2FsbCBwcHBfb3V0cHV0X3dha2V1cAorICogYXQgc29tZSBsYXRlciB0aW1lIHRvIHJlYWN0aXZhdGUgZmxvdyBjb250cm9sIGluIHBwcF9nZW5lcmljLgorICovCitzdGF0aWMgaW50CitwcHBfaXJuZXRfc2VuZChzdHJ1Y3QgcHBwX2NoYW5uZWwgKgljaGFuLAorCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqCQlza2IpCit7CisgIGlybmV0X3NvY2tldCAqCXNlbGYgPSAoc3RydWN0IGlybmV0X3NvY2tldCAqKSBjaGFuLT5wcml2YXRlOworICBpbnQJCQlyZXQ7CisKKyAgREVOVEVSKFBQUF9UUkFDRSwgIihjaGFubmVsPTB4JXAsIGFwL3NlbGY9MHglcClcbiIsCisJIGNoYW4sIHNlbGYpOworCisgIC8qIENoZWNrIGlmIHRoaW5ncyBhcmUgc29tZXdoYXQgdmFsaWQuLi4gKi8KKyAgREFTU0VSVChzZWxmICE9IE5VTEwsIDAsIFBQUF9FUlJPUiwgIlNlbGYgaXMgTlVMTCAhISFcbiIpOworCisgIC8qIENoZWNrIGlmIHdlIGFyZSBjb25uZWN0ZWQgKi8KKyAgaWYoISh0ZXN0X2JpdCgwLCAmc2VsZi0+dHRwX29wZW4pKSkKKyAgICB7CisjaWZkZWYgQ09OTkVDVF9JTl9TRU5ECisgICAgICAvKiBMZXQncyB0cnkgdG8gY29ubmVjdCBvbmUgbW9yZSB0aW1lLi4uICovCisgICAgICAvKiBOb3RlIDogd2Ugd29uJ3QgYmUgY29ubmVjdGVkIGFmdGVyIHRoaXMgY2FsbCwgYnV0IHdlIHNob3VsZCBiZQorICAgICAgICogcmVhZHkgZm9yIG5leHQgcGFja2V0Li4uICovCisgICAgICAvKiBJZiB3ZSBhcmUgYWxyZWFkeSBjb25uZWN0aW5nLCB0aGlzIHdpbGwgZmFpbCAqLworICAgICAgaXJkYV9pcm5ldF9jb25uZWN0KHNlbGYpOworI2VuZGlmIC8qIENPTk5FQ1RfSU5fU0VORCAqLworCisgICAgICBERUJVRyhQUFBfSU5GTywgIklyVFRQIG5vdCByZWFkeSAhICglbGQtJWxkKVxuIiwKKwkgICAgc2VsZi0+dHRwX29wZW4sIHNlbGYtPnR0cF9jb25uZWN0KTsKKworICAgICAgLyogTm90ZSA6IHdlIGNhbiBlaXRoZXIgZHJvcCB0aGUgcGFja2V0IG9yIGJsb2NrIHRoZSBwYWNrZXQuCisgICAgICAgKgorICAgICAgICogQmxvY2tpbmcgdGhlIHBhY2tldCBhbGxvdyB1cyBhIGJldHRlciBjb25uZWN0aW9uIHRpbWUsCisgICAgICAgKiBiZWNhdXNlIGJ5IGNhbGxpbmcgcHBwX291dHB1dF93YWtldXAoKSB3ZSBjYW4gaGF2ZQorICAgICAgICogcHBwX2dlbmVyaWMgcmVzZW5kaW5nIHRoZSBMQ1AgcmVxdWVzdCBpbW1lZGlhdGVseSB0byB1cywKKyAgICAgICAqIHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIG9uZSBvZiBwcHBkIHBlcmlvZGljIHRyYW5zbWlzc2lvbiBvZgorICAgICAgICogTENQIHJlcXVlc3QuCisgICAgICAgKgorICAgICAgICogT24gdGhlIG90aGVyIGhhbmQsIGlmIHdlIGJsb2NrIGFsbCBwYWNrZXQsIGFsbCB0aG9zZSBwZXJpb2RpYworICAgICAgICogdHJhbnNtaXNzaW9ucyBvZiBwcHBkIGFjY3VtdWxhdGUgaW4gcHBwX2dlbmVyaWMsIGNyZWF0aW5nIGEKKyAgICAgICAqIGJhY2tsb2cgb2YgTENQIHJlcXVlc3QuIFdoZW4gd2UgZXZlbnR1YWxseSBjb25uZWN0IGxhdGVyIG9uLAorICAgICAgICogd2UgaGF2ZSB0byB0cmFuc21pdCBhbGwgdGhpcyBiYWNrbG9nIGJlZm9yZSB3ZSBjYW4gY29ubmVjdAorICAgICAgICogcHJvcGVyIChpZiB3ZSBkb24ndCB0aW1lb3V0IGJlZm9yZSkuCisgICAgICAgKgorICAgICAgICogVGhlIGN1cnJlbnQgc3RyYXRlZ3kgaXMgYXMgZm9sbG93IDoKKyAgICAgICAqIFdoaWxlIHdlIGFyZSBhdHRlbXB0aW5nIHRvIGNvbm5lY3QsIHdlIGJsb2NrIHBhY2tldHMgdG8gZ2V0CisgICAgICAgKiBhIGJldHRlciBjb25uZWN0aW9uIHRpbWUuCisgICAgICAgKiBJZiB3ZSBmYWlsIHRvIGNvbm5lY3QsIHdlIGRyYWluIHRoZSBxdWV1ZSBhbmQgc3RhcnQgZHJvcHBpbmcgcGFja2V0cworICAgICAgICovCisjaWZkZWYgQkxPQ0tfV0hFTl9DT05ORUNUCisgICAgICAvKiBJZiB3ZSBhcmUgYXR0ZW1wdGluZyB0byBjb25uZWN0ICovCisgICAgICBpZih0ZXN0X2JpdCgwLCAmc2VsZi0+dHRwX2Nvbm5lY3QpKQorCXsKKwkgIC8qIEJsb2NraW5nIHBhY2tldCwgcHBwX2dlbmVyaWMgd2lsbCByZXRyeSBsYXRlciAqLworCSAgcmV0dXJuIDA7CisJfQorI2VuZGlmIC8qIEJMT0NLX1dIRU5fQ09OTkVDVCAqLworCisgICAgICAvKiBEcm9wcGluZyBwYWNrZXQsIHBwcGQgd2lsbCByZXRyeSBsYXRlciAqLworICAgICAgZGV2X2tmcmVlX3NrYihza2IpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIC8qIENoZWNrIGlmIHRoZSBxdWV1ZSBjYW4gYWNjZXB0IGFueSBwYWNrZXQsIG90aGVyd2lzZSBibG9jayAqLworICBpZihzZWxmLT50eF9mbG93ICE9IEZMT1dfU1RBUlQpCisgICAgRFJFVFVSTigwLCBQUFBfSU5GTywgIklyVFRQIHF1ZXVlIGZ1bGwgKCVkIHNrYnMpLi4uXG4iLAorCSAgICBza2JfcXVldWVfbGVuKCZzZWxmLT50c2FwLT50eF9xdWV1ZSkpOworCisgIC8qIFByZXBhcmUgcHBwIGZyYW1lIGZvciB0cmFuc21pc3Npb24gKi8KKyAgc2tiID0gaXJuZXRfcHJlcGFyZV9za2Ioc2VsZiwgc2tiKTsKKyAgREFCT1JUKHNrYiA9PSBOVUxMLCAxLCBQUFBfRVJST1IsICJQcmVwYXJlIHNrYiBmb3IgVHggZmFpbGVkLlxuIik7CisKKyAgLyogU2VuZCB0aGUgcGFja2V0IHRvIElyVFRQICovCisgIHJldCA9IGlydHRwX2RhdGFfcmVxdWVzdChzZWxmLT50c2FwLCBza2IpOworICBpZihyZXQgPCAwKQorICAgIHsKKyAgICAgIC8qICAgCisgICAgICAgKiA+IElyVFRQcyB0eCBxdWV1ZSBpcyBmdWxsLCBzbyB3ZSBqdXN0IGhhdmUgdG8KKyAgICAgICAqID4gZHJvcCB0aGUgZnJhbWUhIFlvdSBtaWdodCB0aGluayB0aGF0IHdlIHNob3VsZAorICAgICAgICogPiBqdXN0IHJldHVybiAtMSBhbmQgZG9uJ3QgZGVhbGxvY2F0ZSB0aGUgZnJhbWUsCisgICAgICAgKiA+IGJ1dCB0aGF0IGlzIGRhbmdlcm91cyBzaW5jZSBpdCdzIHBvc3NpYmxlIHRoYXQKKyAgICAgICAqID4gd2UgaGF2ZSByZXBsYWNlZCB0aGUgb3JpZ2luYWwgc2tiIHdpdGggYSBuZXcKKyAgICAgICAqID4gb25lIHdpdGggbGFyZ2VyIGhlYWRyb29tLCBhbmQgdGhhdCB3b3VsZCByZWFsbHkKKyAgICAgICAqID4gY29uZnVzZSBkb19kZXZfcXVldWVfeG1pdCgpIGluIGRldi5jISBJIGhhdmUKKyAgICAgICAqID4gdHJpZWQgOi0pIERCIAorICAgICAgICogQ29ycmVjdGlvbiA6IHdlIHZlcmlmeSB0aGUgZmxvdyBjb250cm9sIGFib3ZlIChzZWxmLT50eF9mbG93KSwKKyAgICAgICAqIHNvIHdlIGNvbWUgaGVyZSBvbmx5IGlmIElyVFRQIGRvZXNuJ3QgbGlrZSB0aGUgcGFja2V0IChlbXB0eSwKKyAgICAgICAqIHRvbyBsYXJnZSwgSXJUVFAgbm90IGNvbm5lY3RlZCkuIEluIHRob3NlIHJhcmUgY2FzZXMsIGl0J3Mgb2sKKyAgICAgICAqIHRvIGRyb3AgaXQsIHdlIGRvbid0IHdhbnQgdG8gc2VlIGl0IGhlcmUgYWdhaW4uLi4KKyAgICAgICAqIEplYW4gSUkKKyAgICAgICAqLworICAgICAgREVSUk9SKFBQUF9FUlJPUiwgIklyVFRQIGRvZXNuJ3QgbGlrZSB0aGlzIHBhY2tldCAhISEgKDB4JVgpXG4iLCByZXQpOworICAgICAgLyogaXJ0dHBfZGF0YV9yZXF1ZXN0IGFscmVhZHkgZnJlZSB0aGUgcGFja2V0ICovCisgICAgfQorCisgIERFWElUKFBQUF9UUkFDRSwgIlxuIik7CisgIHJldHVybiAxOwkvKiBQYWNrZXQgaGFzIGJlZW4gY29uc3VtZWQgKi8KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRha2UgY2FyZSBvZiB0aGUgaW9jdGxzIHRoYXQgcHBwX2dlbmVyaWMgZG9lc24ndCB3YW50IHRvIGRlYWwgd2l0aC4uLgorICogTm90ZSA6IHdlIGFyZSBhbHNvIGNhbGxlZCBmcm9tIGRldl9pcm5ldF9pb2N0bCgpLgorICovCitzdGF0aWMgaW50CitwcHBfaXJuZXRfaW9jdGwoc3RydWN0IHBwcF9jaGFubmVsICoJY2hhbiwKKwkJdW5zaWduZWQgaW50CQljbWQsCisJCXVuc2lnbmVkIGxvbmcJCWFyZykKK3sKKyAgaXJuZXRfc29ja2V0ICoJYXAgPSAoc3RydWN0IGlybmV0X3NvY2tldCAqKSBjaGFuLT5wcml2YXRlOworICBpbnQJCQllcnI7CisgIGludAkJCXZhbDsKKyAgdTMyCQkJYWNjbVs4XTsKKyAgdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKyAgREVOVEVSKFBQUF9UUkFDRSwgIihjaGFubmVsPTB4JXAsIGFwPTB4JXAsIGNtZD0weCVYKVxuIiwKKwkgY2hhbiwgYXAsIGNtZCk7CisKKyAgLyogQmFzaWMgY2hlY2tzLi4uICovCisgIERBU1NFUlQoYXAgIT0gTlVMTCwgLUVOWElPLCBQUFBfRVJST1IsICJhcCBpcyBOVUxMLi4uXG4iKTsKKworICBlcnIgPSAtRUZBVUxUOworICBzd2l0Y2goY21kKQorICAgIHsKKyAgICAgIC8qIFBQUCBmbGFncyAqLworICAgIGNhc2UgUFBQSU9DR0ZMQUdTOgorICAgICAgdmFsID0gYXAtPmZsYWdzIHwgYXAtPnJiaXRzOworICAgICAgaWYocHV0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKSBhcmdwKSkKKwlicmVhazsKKyAgICAgIGVyciA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBQUElPQ1NGTEFHUzoKKyAgICAgIGlmKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKikgYXJncCkpCisJYnJlYWs7CisgICAgICBhcC0+ZmxhZ3MgPSB2YWwgJiB+U0NfUkNWX0JJVFM7CisgICAgICBhcC0+cmJpdHMgPSB2YWwgJiBTQ19SQ1ZfQklUUzsKKyAgICAgIGVyciA9IDA7CisgICAgICBicmVhazsKKworICAgICAgLyogQXN5bmMgbWFwIHN0dWZmIC0gYWxsIGR1bW15IHRvIHBsZWFzZSBwcHBkICovCisgICAgY2FzZSBQUFBJT0NHQVNZTkNNQVA6CisgICAgICBpZihwdXRfdXNlcihhcC0+eGFjY21bMF0sICh1MzIgX191c2VyICopIGFyZ3ApKQorCWJyZWFrOworICAgICAgZXJyID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFBQSU9DU0FTWU5DTUFQOgorICAgICAgaWYoZ2V0X3VzZXIoYXAtPnhhY2NtWzBdLCAodTMyIF9fdXNlciAqKSBhcmdwKSkKKwlicmVhazsKKyAgICAgIGVyciA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBQUElPQ0dSQVNZTkNNQVA6CisgICAgICBpZihwdXRfdXNlcihhcC0+cmFjY20sICh1MzIgX191c2VyICopIGFyZ3ApKQorCWJyZWFrOworICAgICAgZXJyID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFBQSU9DU1JBU1lOQ01BUDoKKyAgICAgIGlmKGdldF91c2VyKGFwLT5yYWNjbSwgKHUzMiBfX3VzZXIgKikgYXJncCkpCisJYnJlYWs7CisgICAgICBlcnIgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUFBJT0NHWEFTWU5DTUFQOgorICAgICAgaWYoY29weV90b191c2VyKGFyZ3AsIGFwLT54YWNjbSwgc2l6ZW9mKGFwLT54YWNjbSkpKQorCWJyZWFrOworICAgICAgZXJyID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFBQSU9DU1hBU1lOQ01BUDoKKyAgICAgIGlmKGNvcHlfZnJvbV91c2VyKGFjY20sIGFyZ3AsIHNpemVvZihhY2NtKSkpCisJYnJlYWs7CisgICAgICBhY2NtWzJdICY9IH4weDQwMDAwMDAwVTsJCS8qIGNhbid0IGVzY2FwZSAweDVlICovCisgICAgICBhY2NtWzNdIHw9IDB4NjAwMDAwMDBVOwkJLyogbXVzdCBlc2NhcGUgMHg3ZCwgMHg3ZSAqLworICAgICAgbWVtY3B5KGFwLT54YWNjbSwgYWNjbSwgc2l6ZW9mKGFwLT54YWNjbSkpOworICAgICAgZXJyID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBNYXggUFBQIGZyYW1lIHNpemUgKi8KKyAgICBjYXNlIFBQUElPQ0dNUlU6CisgICAgICBpZihwdXRfdXNlcihhcC0+bXJ1LCAoaW50IF9fdXNlciAqKSBhcmdwKSkKKwlicmVhazsKKyAgICAgIGVyciA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBQUElPQ1NNUlU6CisgICAgICBpZihnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopIGFyZ3ApKQorCWJyZWFrOworICAgICAgaWYodmFsIDwgUFBQX01SVSkKKwl2YWwgPSBQUFBfTVJVOworICAgICAgYXAtPm1ydSA9IHZhbDsKKyAgICAgIGVyciA9IDA7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBERUJVRyhQUFBfSU5GTywgIlVuc3VwcG9ydGVkIGlvY3RsICgweCVYKVxuIiwgY21kKTsKKyAgICAgIGVyciA9IC1FTk9JT0NUTENNRDsKKyAgICB9CisKKyAgREVYSVQoUFBQX1RSQUNFLCAiIC0gZXJyID0gMHglWFxuIiwgZXJyKTsKKyAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIElOSVRJQUxJU0FUSU9OICoqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIE1vZHVsZSBpbml0aWFsaXNhdGlvbiBhbmQgYWxsIHRoYXQgamF6ei4uLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBIb29rIG91ciBkZXZpY2UgY2FsbGJhY2tzIGluIHRoZSBmaWxlc3lzdGVtLCB0byBjb25uZWN0IG91ciBjb2RlCisgKiB0byAvZGV2L2lybmV0CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9faW5pdAorcHBwX2lybmV0X2luaXQodm9pZCkKK3sKKyAgaW50IGVyciA9IDA7CisKKyAgREVOVEVSKE1PRFVMRV9UUkFDRSwgIigpXG4iKTsKKworICAvKiBBbGxvY2F0ZSBvdXJzZWx2ZXMgYXMgYSBtaW5vciBpbiB0aGUgbWlzYyByYW5nZSAqLworICBlcnIgPSBtaXNjX3JlZ2lzdGVyKCZpcm5ldF9taXNjX2RldmljZSk7CisKKyAgREVYSVQoTU9EVUxFX1RSQUNFLCAiXG4iKTsKKyAgcmV0dXJuIGVycjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIENsZWFudXAgYXQgZXhpdC4uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19leGl0CitwcHBfaXJuZXRfY2xlYW51cCh2b2lkKQoreworICBERU5URVIoTU9EVUxFX1RSQUNFLCAiKClcbiIpOworCisgIC8qIERlLWFsbG9jYXRlIC9kZXYvaXJuZXQgbWlub3IgaW4gbWlzYyByYW5nZSAqLworICBtaXNjX2RlcmVnaXN0ZXIoJmlybmV0X21pc2NfZGV2aWNlKTsKKworICBERVhJVChNT0RVTEVfVFJBQ0UsICJcbiIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogTW9kdWxlIG1haW4gZW50cnkgcG9pbnQKKyAqLworaW50IF9faW5pdAoraXJuZXRfaW5pdCh2b2lkKQoreworICBpbnQgZXJyOworCisgIC8qIEluaXRpYWxpc2UgYm90aCBwYXJ0cy4uLiAqLworICBlcnIgPSBpcmRhX2lybmV0X2luaXQoKTsKKyAgaWYoIWVycikKKyAgICBlcnIgPSBwcHBfaXJuZXRfaW5pdCgpOworICByZXR1cm4gZXJyOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogTW9kdWxlIGV4aXQKKyAqLworc3RhdGljIHZvaWQgX19leGl0Citpcm5ldF9jbGVhbnVwKHZvaWQpCit7CisgIGlyZGFfaXJuZXRfY2xlYW51cCgpOworICBwcHBfaXJuZXRfY2xlYW51cCgpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogTW9kdWxlIG1hZ2ljCisgKi8KK21vZHVsZV9pbml0KGlybmV0X2luaXQpOworbW9kdWxlX2V4aXQoaXJuZXRfY2xlYW51cCk7CitNT0RVTEVfQVVUSE9SKCJKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklyTkVUIDogU3luY2hyb25vdXMgUFBQIG92ZXIgSXJEQSIpOyAKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19DSEFSREVWKDEwLCAxODcpOwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJuZXQvaXJuZXRfcHBwLmggYi9uZXQvaXJkYS9pcm5ldC9pcm5ldF9wcHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmJlYjdkCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJuZXQvaXJuZXRfcHBwLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKglJck5FVCBwcm90b2NvbCBtb2R1bGUgOiBTeW5jaHJvbm91cyBQUFAgb3ZlciBhbiBJckRBIHNvY2tldC4KKyAqCisgKgkJSmVhbiBJSSAtIEhQTCBgMDAgLSA8anRAaHBsLmhwLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYWxsIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgbmVjZXNzYXJ5IGZvciB0aGUKKyAqIFBQUCBwYXJ0IG9mIHRoZSBJck5FVCBtb2R1bGUuCisgKiBUaGlzIGZpbGUgaXMgYSBwcml2YXRlIGhlYWRlciwgc28gb3RoZXIgbW9kdWxlcyBkb24ndCB3YW50IHRvIGtub3cKKyAqIHdoYXQncyBpbiB0aGVyZS4uLgorICovCisKKyNpZm5kZWYgSVJORVRfUFBQX0gKKyNkZWZpbmUgSVJORVRfUFBQX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOQ0xVREVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiaXJuZXQuaCIJCS8qIE1vZHVsZSBnbG9iYWwgaW5jbHVkZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIENPTlNUQU5UUyAmIE1BQ1JPUyAqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIC9kZXYvaXJuZXQgZmlsZSBjb25zdGFudHMgKi8KKyNkZWZpbmUgSVJORVRfTUFKT1IJMTAJLyogTWlzYyByYW5nZSAqLworI2RlZmluZSBJUk5FVF9NSU5PUgkxODcJLyogT2ZmaWNpYWwgYWxsb2NhdGlvbiAqLworCisvKiBJck5FVCBjb250cm9sIGNoYW5uZWwgc3R1ZmYgKi8KKyNkZWZpbmUgSVJORVRfTUFYX0NPTU1BTkQJMjU2CS8qIE1heCBsZW5ndGggb2YgYSBjb21tYW5kIGxpbmUgKi8KKworLyogUFBQIGhhcmRjb3JlIHN0dWZmICovCisKKy8qIEJpdHMgaW4gcmJpdHMgKFBQUCBmbGFncyBpbiBpcm5ldCBzdHJ1Y3QpICovCisjZGVmaW5lIFNDX1JDVl9CSVRTCShTQ19SQ1ZfQjdfMXxTQ19SQ1ZfQjdfMHxTQ19SQ1ZfT0REUHxTQ19SQ1ZfRVZOUCkKKworLyogQml0IG51bWJlcnMgaW4gYnVzeSAqLworI2RlZmluZSBYTUlUX0JVU1kJMAorI2RlZmluZSBSRUNWX0JVU1kJMQorI2RlZmluZSBYTUlUX1dBS0VVUAkyCisjZGVmaW5lIFhNSVRfRlVMTAkzCisKKy8qIFF1ZXVlIG1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgUFBQU1lOQ19NQVhfUlFMRU4JMzIJLyogYXJiaXRyYXJ5ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVFlQRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBST1RPVFlQRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ09OVFJPTCBDSEFOTkVMIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW5saW5lIHNzaXplX3QKKwlpcm5ldF9jdHJsX3dyaXRlKGlybmV0X3NvY2tldCAqLAorCQkJIGNvbnN0IGNoYXIgKiwKKwkJCSBzaXplX3QpOworc3RhdGljIGlubGluZSBzc2l6ZV90CisJaXJuZXRfY3RybF9yZWFkKGlybmV0X3NvY2tldCAqLAorCQkJc3RydWN0IGZpbGUgKiwKKwkJCWNoYXIgKiwKKwkJCXNpemVfdCk7CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAorCWlybmV0X2N0cmxfcG9sbChpcm5ldF9zb2NrZXQgKiwKKwkJCXN0cnVjdCBmaWxlICosCisJCQlwb2xsX3RhYmxlICopOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0hBUkFDVEVSIERFVklDRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludAorCWRldl9pcm5ldF9vcGVuKHN0cnVjdCBpbm9kZSAqLAkvKiBmcyBjYWxsYmFjayA6IG9wZW4gKi8KKwkJICAgICAgIHN0cnVjdCBmaWxlICopLAorCWRldl9pcm5ldF9jbG9zZShzdHJ1Y3QgaW5vZGUgKiwKKwkJCXN0cnVjdCBmaWxlICopOworc3RhdGljIHNzaXplX3QKKwlkZXZfaXJuZXRfd3JpdGUoc3RydWN0IGZpbGUgKiwKKwkJCWNvbnN0IGNoYXIgX191c2VyICosCisJCQlzaXplX3QsCisJCQlsb2ZmX3QgKiksCisJZGV2X2lybmV0X3JlYWQoc3RydWN0IGZpbGUgKiwKKwkJICAgICAgIGNoYXIgX191c2VyICosCisJCSAgICAgICBzaXplX3QsCisJCSAgICAgICBsb2ZmX3QgKik7CitzdGF0aWMgdW5zaWduZWQgaW50CisJZGV2X2lybmV0X3BvbGwoc3RydWN0IGZpbGUgKiwKKwkJICAgICAgIHBvbGxfdGFibGUgKik7CitzdGF0aWMgaW50CisJZGV2X2lybmV0X2lvY3RsKHN0cnVjdCBpbm9kZSAqLAorCQkJc3RydWN0IGZpbGUgKiwKKwkJCXVuc2lnbmVkIGludCwKKwkJCXVuc2lnbmVkIGxvbmcpOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBQUCBJTlRFUkZBQ0UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICoKKwlpcm5ldF9wcmVwYXJlX3NrYihpcm5ldF9zb2NrZXQgKiwKKwkJCSAgc3RydWN0IHNrX2J1ZmYgKik7CitzdGF0aWMgaW50CisJcHBwX2lybmV0X3NlbmQoc3RydWN0IHBwcF9jaGFubmVsICosCisJCSAgICAgIHN0cnVjdCBza19idWZmICopOworc3RhdGljIGludAorCXBwcF9pcm5ldF9pb2N0bChzdHJ1Y3QgcHBwX2NoYW5uZWwgKiwKKwkJCXVuc2lnbmVkIGludCwKKwkJCXVuc2lnbmVkIGxvbmcpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBWQVJJQUJMRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRmlsZXN5c3RlbSBjYWxsYmFja3MgKHRvIGNhbGwgdXMpICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcm5ldF9kZXZpY2VfZm9wcyA9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWFkCQk9IGRldl9pcm5ldF9yZWFkLAorCS53cml0ZQkJPSBkZXZfaXJuZXRfd3JpdGUsCisJLnBvbGwJCT0gZGV2X2lybmV0X3BvbGwsCisJLmlvY3RsCQk9IGRldl9pcm5ldF9pb2N0bCwKKwkub3BlbgkJPSBkZXZfaXJuZXRfb3BlbiwKKwkucmVsZWFzZQk9IGRldl9pcm5ldF9jbG9zZQorICAvKiBBbHNvIDogbGxzZWVrLCByZWFkZGlyLCBtbWFwLCBmbHVzaCwgZnN5bmMsIGZhc3luYywgbG9jaywgcmVhZHYsIHdyaXRldiAqLworfTsKKworLyogU3RydWN0dXJlIHNvIHRoYXQgdGhlIG1pc2MgbWFqb3IgKGRyaXZlcnMvY2hhci9taXNjLmMpIHRha2UgY2FyZSBvZiB1cy4uLiAqLworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGlybmV0X21pc2NfZGV2aWNlID0KK3sKKwlJUk5FVF9NSU5PUiwKKwkiaXJuZXQiLAorCSZpcm5ldF9kZXZpY2VfZm9wcworfTsKKworI2VuZGlmIC8qIElSTkVUX1BQUF9IICovCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcnByb2MuYyBiL25ldC9pcmRhL2lycHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YjljNDMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcnByb2MuYwpAQCAtMCwwICsxLDEwMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBpcnByb2MuYworICogVmVyc2lvbjogICAgICAgMS4wCisgKiBEZXNjcmlwdGlvbjogICBWYXJpb3VzIGVudHJpZXMgaW4gdGhlIC9wcm9jIGZpbGUgc3lzdGVtCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBUaG9tYXMgRGF2aXMsIDxyYXRiZXJ0QHJhZGlrcy5uZXQ+CisgKiBDcmVhdGVkIGF0OiAgICBTYXQgRmViIDIxIDIxOjMzOjI0IDE5OTgKKyAqIE1vZGlmaWVkIGF0OiAgIFN1biBOb3YgMTQgMDg6NTQ6NTQgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICoKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSwgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogICAgIENvcHlyaWdodCAoYykgMTk5OCwgVGhvbWFzIERhdmlzLCA8cmF0YmVydEByYWRpa3MubmV0PiwgCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAKKyAqICAgICBJLCBUaG9tYXMgRGF2aXMsIHByb3ZpZGUgbm8gd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiAKKyAqICAgICBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4gCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4KKworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGlzY292ZXJ5X3NlcV9mb3BzOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXJsYXBfc2VxX2ZvcHM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcmxtcF9zZXFfZm9wczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlydHRwX3NlcV9mb3BzOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXJpYXNfc2VxX2ZvcHM7CisKK3N0cnVjdCBpcmRhX2VudHJ5IHsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHM7Cit9OworCitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfaXJkYTsKK0VYUE9SVF9TWU1CT0wocHJvY19pcmRhKTsKKyAKK3N0YXRpYyBzdHJ1Y3QgaXJkYV9lbnRyeSBpcmRhX2RpcnNbXSA9IHsKKwl7ImRpc2NvdmVyeSIsCSZkaXNjb3Zlcnlfc2VxX2ZvcHN9LAorCXsiaXJ0dHAiLAkmaXJ0dHBfc2VxX2ZvcHN9LAorCXsiaXJsbXAiLAkmaXJsbXBfc2VxX2ZvcHN9LAorCXsiaXJsYXAiLAkmaXJsYXBfc2VxX2ZvcHN9LAorCXsiaXJpYXMiLAkmaXJpYXNfc2VxX2ZvcHN9LAorfTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfcHJvY19yZWdpc3RlciAodm9pZCkKKyAqCisgKiAgICBSZWdpc3RlciBpcmRhIGVudHJ5IGluIC9wcm9jIGZpbGUgc3lzdGVtCisgKgorICovCit2b2lkIF9faW5pdCBpcmRhX3Byb2NfcmVnaXN0ZXIodm9pZCkgCit7CisJaW50IGk7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkOworCisJcHJvY19pcmRhID0gcHJvY19ta2RpcigiaXJkYSIsIHByb2NfbmV0KTsKKwlpZiAocHJvY19pcmRhID09IE5VTEwpCisJCXJldHVybjsKKwlwcm9jX2lyZGEtPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwlmb3IgKGk9MDsgaTxBUlJBWV9TSVpFKGlyZGFfZGlycyk7IGkrKykgeworCQlkID0gY3JlYXRlX3Byb2NfZW50cnkoaXJkYV9kaXJzW2ldLm5hbWUsIDAsIHByb2NfaXJkYSk7CisJCWlmIChkKSAKKwkJCWQtPnByb2NfZm9wcyA9IGlyZGFfZGlyc1tpXS5mb3BzOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfcHJvY191bnJlZ2lzdGVyICh2b2lkKQorICoKKyAqICAgIFVucmVnaXN0ZXIgaXJkYSBlbnRyeSBpbiAvcHJvYyBmaWxlIHN5c3RlbQorICoKKyAqLwordm9pZCBfX2V4aXQgaXJkYV9wcm9jX3VucmVnaXN0ZXIodm9pZCkgCit7CisJaW50IGk7CisKKyAgICAgICAgaWYgKHByb2NfaXJkYSkgeworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPEFSUkFZX1NJWkUoaXJkYV9kaXJzKTsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX3Byb2NfZW50cnkoaXJkYV9kaXJzW2ldLm5hbWUsIHByb2NfaXJkYSk7CisKKyAgICAgICAgICAgICAgICByZW1vdmVfcHJvY19lbnRyeSgiaXJkYSIsIHByb2NfbmV0KTsKKyAgICAgICAgICAgICAgICBwcm9jX2lyZGEgPSBOVUxMOworICAgICAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJxdWV1ZS5jIGIvbmV0L2lyZGEvaXJxdWV1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZGQzZWEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcnF1ZXVlLmMKQEAgLTAsMCArMSw5MTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgaXJxdWV1ZS5jCisgKiBWZXJzaW9uOiAgICAgICAwLjMKKyAqIERlc2NyaXB0aW9uOiAgIEdlbmVyYWwgcXVldWUgaW1wbGVtZW50YXRpb24KKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFR1ZSBKdW4gIDkgMTM6Mjk6MzEgMTk5OAorICogTW9kaWZpZWQgYXQ6ICAgU3VuIERlYyAxMiAxMzo0ODoyMiAxOTk5CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBNb2RpZmllZCBhdDogICBUaHUgSmFuICA0IDE0OjI5OjEwIENFVCAyMDAxCisgKiBNb2RpZmllZCBieTogICBNYXJjIFp5bmdpZXIgPG16eW5naWVyQGZyZWVzdXJmLmZyPgorICogCisgKiAgICAgQ29weXJpZ2h0IChDKSAxOTk4LTE5OTksIEFhZ2UgS3ZhbG5lcyA8YWFnZUBjcy51aXQubm8+CisgKiAgICAgQ29weXJpZ2h0IChDKSAxOTk4LCBEYWcgQnJhdHRsaSwgCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgICAgVGhpcyBjb2RlIGlzIHRha2VuIGZyb20gdGhlIFZvcnRleCBPcGVyYXRpbmcgU3lzdGVtIHdyaXR0ZW4gYnkgQWFnZQorICogICAgIEt2YWxuZXMuIEFhZ2UgaGFzIGFncmVlZCB0aGF0IHRoaXMgY29kZSBjYW4gdXNlIHRoZSBHUEwgbGljZW5jZSwKKyAqICAgICBhbHRob3VnaCBoZSBkb2VzIG5vdCB1c2UgdGhhdCBsaWNlbmNlIGluIGhpcyBvd24gY29kZS4KKyAqICAgICAKKyAqICAgICBUaGlzIGNvcHlyaWdodCBkb2VzIGhvd2V2ZXIgX25vdF8gaW5jbHVkZSB0aGUgRUxGIGhhc2goKSBmdW5jdGlvbgorICogICAgIHdoaWNoIEkgY3VycmVudGx5IGRvbid0IGtub3cgd2hpY2ggbGljZW5jZSBvciBjb3B5cmlnaHQgaXQKKyAqICAgICBoYXMuIFBsZWFzZSBpbmZvcm0gbWUgaWYgeW91IGtub3cuCisgKiAgICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgCisgKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAorICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIE5PVEUgOgorICogVGhlcmUgYXJlIHZhcmlvdXMgcHJvYmxlbXMgd2l0aCB0aGlzIHBhY2thZ2UgOgorICoJbyB0aGUgaGFzaCBmdW5jdGlvbiBmb3IgaW50cyBpcyBwYXRoZXRpYyAoYnV0IGNvdWxkIGJlIGNoYW5nZWQpCisgKglvIGxvY2tpbmcgaXMgc29tZXRpbWUgc3VzcGljaW91cyAoZXNwZWNpYWxseSBkdXJpbmcgZW51bWVyYXRpb24pCisgKglvIG1vc3QgdXNlcnMgaGF2ZSBvbmx5IGEgZmV3IGVsZW1lbnRzICg9PSBvdmVyaGVhZCkKKyAqCW8gbW9zdCB1c2VycyBuZXZlciB1c2Ugc2VhY2gsIHNvIGRvbid0IGJlbmVmaXQgZnJvbSBoYXNoaW5nCisgKiBQcm9ibGVtIGFscmVhZHkgZml4ZWQgOgorICoJbyBub3QgNjQgYml0IGNvbXBsaWFudCAobW9zdCB1c2VycyBkbyBoYXNodiA9IChpbnQpIHNlbGYpCisgKglvIGhhc2hiaW5fcmVtb3ZlKCkgaXMgYnJva2VuID0+IHVzZSBoYXNoYmluX3JlbW92ZV90aGlzKCkKKyAqIEkgdGhpbmsgbW9zdCB1c2VycyB3b3VsZCBiZSBiZXR0ZXIgc2VydmVkIGJ5IGEgc2ltcGxlIGxpbmtlZCBsaXN0CisgKiAobGlrZSBpbmNsdWRlL2xpbnV4L2xpc3QuaCkgd2l0aCBhIGdsb2JhbCBzcGlubG9jayBwZXIgbGlzdC4KKyAqIEplYW4gSUkKKyAqLworCisvKgorICogTm90ZXMgb24gdGhlIGNvbmN1cnJlbnQgYWNjZXNzIHRvIGhhc2hiaW4gYW5kIG90aGVyIFNNUCBpc3N1ZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCUhhc2hiaW5zIGFyZSB2ZXJ5IG9mdGVuIGluIHRoZSBJckRBIHN0YWNrIGEgZ2xvYmFsIHJlcG9zaXRvcnkgb2YKKyAqIGluZm9ybWF0aW9uLCBhbmQgdGhlcmVmb3JlIHVzZWQgaW4gYSB2ZXJ5IGFzeW5jaHJvbm91cyBtYW5uZXIgZm9sbG93aW5nCisgKiB2YXJpb3VzIGV2ZW50cyAoZHJpdmVyIGNhbGxzLCB0aW1lcnMsIHVzZXIgY2FsbHMuLi4pLgorICoJVGhlcmVmb3JlLCB2ZXJ5IG9mdGVuIGl0IGlzIGhpZ2hseSBpbXBvcnRhbnQgdG8gY29uc2lkZXIgdGhlCisgKiBtYW5hZ2VtZW50IG9mIGNvbmN1cnJlbnQgYWNjZXNzIHRvIHRoZSBoYXNoYmluIGFuZCBob3cgdG8gZ3VhcmFudGVlIHRoZQorICogY29uc2lzdGVuY3kgb2YgdGhlIG9wZXJhdGlvbnMgb24gaXQuCisgKgorICoJRmlyc3QsIHdlIG5lZWQgdG8gZGVmaW5lIHRoZSBvYmplY3RpdmUgb2YgbG9ja2luZyA6CisgKgkJMSkgUHJvdGVjdCB1c2VyIGRhdGEgKGNvbnRlbnQgcG9pbnRlZCBieSB0aGUgaGFzaGJpbikKKyAqCQkyKSBQcm90ZWN0IGhhc2hiaW4gc3RydWN0dXJlIGl0c2VsZiAobGlua2VkIGxpc3QgaW4gZWFjaCBiaW4pCisgKgorICoJCQkgICAgIE9MRCBMT0NLSU5HCisgKgkJCSAgICAgLS0tLS0tLS0tLS0KKyAqCisgKglUaGUgcHJldmlvdXMgbG9ja2luZyBzdHJhdGVneSwgZWl0aGVyIEhCX0xPQ0FMIG9yIEhCX0dMT0JBTCB3ZXJlCisgKiBib3RoIGluYWRlcXVhdGUgaW4gKmJvdGgqIGFzcGVjdC4KKyAqCQlvIEhCX0dMT0JBTCB3YXMgdXNpbmcgYSBzcGlubG9jayBmb3IgZWFjaCBiaW4gKGxvY2FsIGxvY2tpbmcpLgorICoJCW8gSEJfTE9DQUwgd2FzIGRpc2FibGluZyBpcnEgb24gKmFsbCogQ1BVcywgc28gdXNlIGEgc2luZ2xlCisgKgkJICBnbG9iYWwgc2VtYXBob3JlLgorICoJVGhlIHByb2JsZW1zIHdlcmUgOgorICoJCUEpIEdsb2JhbCBpcnEgZGlzYWJsaW5nIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbAorICoJCUIpIE5vIHByb3RlY3Rpb24gZm9yIHRoZSBoYXNoYmluIHN0cnVjdCBnbG9iYWwgZGF0YQorICoJCQlvIGhhc2hiaW5fZGVsZXRlKCkKKyAqCQkJbyBoYl9jdXJyZW50CisgKgkJQykgTm8gcHJvdGVjdGlvbiBmb3IgdXNlciBkYXRhIGluIHNvbWUgY2FzZXMKKyAqCisgKglBKSBIQl9MT0NBTCB1c2UgZ2xvYmFsIGlycSBkaXNhYmxpbmcsIHNvIGRvZXNuJ3Qgd29yayBvbiBrZXJuZWwKKyAqIDIuNS5YLiBFdmVuIHdoZW4gaXQgaXMgc3VwcG9ydGVkIChrZXJuZWwgMi40LlggYW5kIGVhcmxpZXIpLCBpdHMKKyAqIHBlcmZvcm1hbmNlIGlzIG5vdCBzYXRpc2ZhY3Rvcnkgb24gU01QIHNldHVwcy4gTW9zdCBoYXNoYmlucyB3ZXJlCisgKiBIQl9MT0NBTCwgc28gKEEpIGRlZmluaXRlbHkgbmVlZCBmaXhpbmcuCisgKglCKSBIQl9MT0NBTCBjb3VsZCBiZSBtb2RpZmllZCB0byBmaXggKEIpLiBIb3dldmVyLCBiZWNhdXNlIEhCX0dMT0JBTAorICogbG9jayBvbmx5IHRoZSBpbmRpdmlkdWFsIGJpbnMsIGl0IHdpbGwgbmV2ZXIgYmUgYWJsZSB0byBsb2NrIHRoZQorICogZ2xvYmFsIGRhdGEsIHNvIGNhbid0IGRvIChCKS4KKyAqCUMpIFNvbWUgZnVuY3Rpb25zIHJldHVybiBwb2ludGVyIHRvIGRhdGEgdGhhdCBpcyBzdGlsbCBpbiB0aGUKKyAqIGhhc2hiaW4gOgorICoJCW8gaGFzaGJpbl9maW5kKCkKKyAqCQlvIGhhc2hiaW5fZ2V0X2ZpcnN0KCkKKyAqCQlvIGhhc2hiaW5fZ2V0X25leHQoKQorICoJQXMgdGhlIGRhdGEgaXMgc3RpbGwgaW4gdGhlIGhhc2hiaW4sIGl0IG1heSBiZSBjaGFuZ2VkIG9yIGZyZWUnZAorICogd2hpbGUgdGhlIGNhbGxlciBpcyBleGFtaW5pbWcgdGhlIGRhdGEuIEluIHRob3NlIGNhc2UsIGxvY2tpbmcgY2FuJ3QKKyAqIGJlIGRvbmUgd2l0aGluIHRoZSBoYXNoYmluLCBidXQgbXVzdCBpbmNsdWRlIHVzZSBvZiB0aGUgZGF0YSB3aXRoaW4KKyAqIHRoZSBjYWxsZXIuCisgKglUaGUgY2FsbGVyIGNhbiBlYXNpbHkgZG8gdGhpcyB3aXRoIEhCX0xPQ0FMIChqdXN0IGRpc2FibGUgaXJxcykuCisgKiBIb3dldmVyLCB0aGlzIGlzIGltcG9zc2libGUgd2l0aCBIQl9HTE9CQUwgYmVjYXVzZSB0aGUgY2FsbGVyIGhhcyBubworICogd2F5IHRvIGtub3cgdGhlIHByb3BlciBiaW4sIHNvIGRvbid0IGtub3cgd2hpY2ggc3BpbmxvY2sgdG8gdXNlLgorICoKKyAqCVF1aWNrIHN1bW1hcnkgOiBjYW4gbm8gbG9uZ2VyIHVzZSBIQl9MT0NBTCwgYW5kIEhCX0dMT0JBTCBpcworICogZnVuZGFtZW50YWxseSBicm9rZW4gYW5kIHdpbGwgbmV2ZXIgd29yay4KKyAqCisgKgkJCSAgICAgTkVXIExPQ0tJTkcKKyAqCQkJICAgICAtLS0tLS0tLS0tLQorICoKKyAqCVRvIGZpeCB0aG9zZSBwcm9ibGVtcywgSSd2ZSBpbnRyb2R1Y2UgYSBmZXcgY2hhbmdlcyBpbiB0aGUKKyAqIGhhc2hiaW4gbG9ja2luZyA6CisgKgkJMSkgTmV3IEhCX0xPQ0sgc2NoZW1lCisgKgkJMikgaGFzaGJpbi0+aGJfc3BpbmxvY2sKKyAqCQkzKSBOZXcgaGFzaGJpbiB1c2FnZSBwb2xpY3kKKyAqCisgKiBIQl9MT0NLIDoKKyAqIC0tLS0tLS0KKyAqCUhCX0xPQ0sgaXMgYSBsb2NraW5nIHNjaGVtZSBpbnRlcm1lZGlhdGUgYmV0d2VlbiB0aGUgb2xkIEhCX0xPQ0FMCisgKiBhbmQgSEJfR0xPQkFMLiBJdCB1c2VzIGEgc2luZ2xlIHNwaW5sb2NrIHRvIHByb3RlY3QgdGhlIHdob2xlIGNvbnRlbnQKKyAqIG9mIHRoZSBoYXNoYmluLiBBcyBpdCBpcyBhIHNpbmdsZSBzcGlubG9jaywgaXQgY2FuIHByb3RlY3QgdGhlIGdsb2JhbAorICogZGF0YSBvZiB0aGUgaGFzaGJpbiBhbmQgbm90IG9ubHkgdGhlIGJpbnMgdGhlbXNlbHZlcy4KKyAqCUhCX0xPQ0sgY2FuIG9ubHkgcHJvdGVjdCBzb21lIG9mIHRoZSBoYXNoYmluIGNhbGxzLCBzbyBpdCBvbmx5IGxvY2sKKyAqIGNhbGwgdGhhdCBjYW4gYmUgbWFkZSAxMDAlIHNhZmUgYW5kIGxlYXZlIG90aGVyIGNhbGwgdW5wcm90ZWN0ZWQuCisgKglIQl9MT0NLIGluIHRoZW9yeSBpcyBzbG93ZXIgdGhhbiBIQl9HTE9CQUwsIGJ1dCBhcyB0aGUgaGFzaGJpbgorICogY29udGVudCBpcyBhbHdheXMgc21hbGwgY29udGVudGlvbiBpcyBub3QgaGlnaCwgc28gaXQgZG9lc24ndCBtYXR0ZXIKKyAqIG11Y2guIEhCX0xPQ0sgaXMgcHJvYmFibHkgZmFzdGVyIHRoYW4gSEJfTE9DQUwuCisgKgorICogaGFzaGJpbi0+aGJfc3BpbmxvY2sgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCVRoZSBzcGlubG9jayB0aGF0IEhCX0xPQ0sgdXNlcyBpcyBhdmFpbGFibGUgZm9yIGNhbGxlciwgc28gdGhhdAorICogdGhlIGNhbGxlciBjYW4gcHJvdGVjdCB1bnByb3RlY3RlZCBjYWxscyAoc2VlIGJlbG93KS4KKyAqCUlmIHRoZSBjYWxsZXIgd2FudCB0byBkbyBlbnRpcmVseSBpdHMgb3duIGxvY2tpbmcgKEhCX05PTE9DSyksIGhlCisgKiBjYW4gZG8gc28gYW5kIG1heSB1c2Ugc2FmZWx5IHRoaXMgc3BpbmxvY2suCisgKglMb2NraW5nIGlzIGRvbmUgbGlrZSB0aGlzIDoKKyAqCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKyAqCVJlbGVhc2luZyB0aGUgbG9jayA6CisgKgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKyAqCisgKiBTYWZlICYgUHJvdGVjdGVkIGNhbGxzIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCVRoZSBmb2xsb3dpbmcgY2FsbHMgYXJlIHNhZmUgb3IgcHJvdGVjdGVkIHZpYSBIQl9MT0NLIDoKKyAqCQlvIGhhc2hiaW5fbmV3KCkJCS0+IHNhZmUKKyAqCQlvIGhhc2hiaW5fZGVsZXRlKCkKKyAqCQlvIGhhc2hiaW5faW5zZXJ0KCkKKyAqCQlvIGhhc2hiaW5fcmVtb3ZlX2ZpcnN0KCkKKyAqCQlvIGhhc2hiaW5fcmVtb3ZlKCkKKyAqCQlvIGhhc2hiaW5fcmVtb3ZlX3RoaXMoKQorICoJCW8gSEFTSEJJTl9HRVRfU0laRSgpCS0+IGF0b21pYworICoKKyAqCVRoZSBmb2xsb3dpbmcgY2FsbHMgb25seSBwcm90ZWN0IHRoZSBoYXNoYmluIGl0c2VsZiA6CisgKgkJbyBoYXNoYmluX2xvY2tfZmluZCgpCisgKgkJbyBoYXNoYmluX2ZpbmRfbmV4dCgpCisgKgorICogVW5wcm90ZWN0ZWQgY2FsbHMgOgorICogLS0tLS0tLS0tLS0tLS0tLS0KKyAqCVRoZSBmb2xsb3dpbmcgY2FsbHMgbmVlZCB0byBiZSBwcm90ZWN0ZWQgYnkgdGhlIGNhbGxlciA6CisgKgkJbyBoYXNoYmluX2ZpbmQoKQorICoJCW8gaGFzaGJpbl9nZXRfZmlyc3QoKQorICoJCW8gaGFzaGJpbl9nZXRfbmV4dCgpCisgKgorICogTG9ja2luZyBQb2xpY3kgOgorICogLS0tLS0tLS0tLS0tLS0KKyAqCUlmIHRoZSBoYXNoYmluIGlzIHVzZWQgb25seSBpbiBhIHNpbmdsZSB0aHJlYWQgb2YgZXhlY3V0aW9uCisgKiAoZXhwbGljaXRseSBvciBpbXBsaWNpdGVseSksIHlvdSBjYW4gdXNlIEhCX05PTE9DSworICoJSWYgdGhlIGNhbGxpbmcgbW9kdWxlIGFscmVhZHkgcHJvdmlkZSBjb25jdXJyZW50IGFjY2VzcyBwcm90ZWN0aW9uLAorICogeW91IG1heSB1c2UgSEJfTk9MT0NLLgorICoKKyAqCUluIGFsbCBvdGhlciBjYXNlcywgeW91IG5lZWQgdG8gdXNlIEhCX0xPQ0sgYW5kIGxvY2sgdGhlIGhhc2hiaW4KKyAqIGV2ZXJ5IHRpbWUgYmVmb3JlIGNhbGxpbmcgb25lIG9mIHRoZSB1bnByb3RlY3RlZCBjYWxscy4gWW91IGFsc28gbXVzdAorICogdXNlIHRoZSBwb2ludGVyIHJldHVybmVkIGJ5IHRoZSB1bnByb3RlY3RlZCBjYWxsIHdpdGhpbiB0aGUgbG9ja2VkCisgKiByZWdpb24uCisgKgorICogRXh0cmEgY2FyZSBmb3IgZW51bWVyYXRpb24gOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCWhhc2hiaW5fZ2V0X2ZpcnN0KCkgYW5kIGhhc2hiaW5fZ2V0X25leHQoKSB1c2UgdGhlIGhhc2hiaW4gdG8KKyAqIHN0b3JlIHRoZSBjdXJyZW50IHBvc2l0aW9uLCBpbiBoYl9jdXJyZW50LgorICoJQXMgbG9uZyBhcyB0aGUgaGFzaGJpbiByZW1haW5zIGxvY2tlZCwgdGhpcyBpcyBzYWZlLiBJZiB5b3UgdW5sb2NrCisgKiB0aGUgaGFzaGJpbiwgdGhlIGN1cnJlbnQgcG9zaXRpb24gbWF5IGNoYW5nZSBpZiBhbnlib2R5IGVsc2UgbW9kaWZ5CisgKiBvciBlbnVtZXJhdGUgdGhlIGhhc2hiaW4uCisgKglTdW1tYXJ5IDogZG8gdGhlIGZ1bGwgZW51bWVyYXRpb24gd2hpbGUgbG9ja2VkLgorICoKKyAqCUFsdGVybmF0aXZlbHksIHlvdSBtYXkgdXNlIGhhc2hiaW5fZmluZF9uZXh0KCkuIEJ1dCwgdGhpcyB3aWxsCisgKiBiZSBzbG93ZXIsIGlzIG1vcmUgY29tcGxleCB0byB1c2UgYW5kIGRvZXNuJ3QgcHJvdGVjdCB0aGUgaGFzaGJpbgorICogY29udGVudC4gU28sIGNhcmUgaXMgbmVlZGVkIGhlcmUgYXMgd2VsbC4KKyAqCisgKiBPdGhlciBpc3N1ZXMgOgorICogLS0tLS0tLS0tLS0tCisgKglJIGJlbGlldmUgdGhhdCB3ZSBhcmUgb3ZlcmRvaW5nIGl0IGJ5IHVzaW5nIHNwaW5fbG9ja19pcnFzYXZlKCkKKyAqIGFuZCB3ZSBzaG91bGQgdXNlIG9ubHkgc3Bpbl9sb2NrX2JoKCkgb3Igc2ltaWxhci4gQnV0LCBJIGRvbid0IGhhdmUKKyAqIHRoZSBiYWxscyB0byB0cnkgaXQgb3V0LgorICoJRG9uJ3QgYmVsaWV2ZSB0aGF0IGJlY2F1c2UgaGFzaGJpbiBhcmUgbm93IChzb21ld2hhdCkgU01QIHNhZmUKKyAqIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgaXMuIEhpZ2hlciBsYXllcnMgdGVuZCB0byBiZSBzYWZlc3QsCisgKiBidXQgTEFQIGFuZCBMTVAgd291bGQgbmVlZCBzb21lIHNlcmlvdXMgZGVkaWNhdGVkIGxvdmUuCisgKgorICogSmVhbiBJSQorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJxdWV1ZS5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqIFFVRVVFIFNVQlJPVVRJTkVTICoqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEhhc2hiaW4KKyAqLworI2RlZmluZSBHRVRfSEFTSEJJTih4KSAoIHggJiBIQVNIQklOX01BU0sgKQorCisvKgorICogRnVuY3Rpb24gaGFzaCAobmFtZSkKKyAqCisgKiAgICBUaGlzIGZ1bmN0aW9uIGhhc2ggdGhlIGlucHV0IHN0cmluZyAnbmFtZScgdXNpbmcgdGhlIEVMRiBoYXNoCisgKiAgICBmdW5jdGlvbiBmb3Igc3RyaW5ncy4KKyAqLworc3RhdGljIF9fdTMyIGhhc2goIGNvbnN0IGNoYXIqIG5hbWUpCit7CisJX191MzIgaCA9IDA7CisJX191MzIgZzsKKwkKKwl3aGlsZSgqbmFtZSkgeworCQloID0gKGg8PDQpICsgKm5hbWUrKzsKKwkJaWYgKChnID0gKGggJiAweGYwMDAwMDAwKSkpCisJCQloIF49Zz4+MjQ7CisJCWggJj1+ZzsKKwl9CisJcmV0dXJuIGg7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBlbnF1ZXVlX2ZpcnN0IChxdWV1ZSwgcHJvYykKKyAqCisgKiAgICBJbnNlcnQgaXRlbSBmaXJzdCBpbiBxdWV1ZS4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGVucXVldWVfZmlyc3QoaXJkYV9xdWV1ZV90ICoqcXVldWUsIGlyZGFfcXVldWVfdCogZWxlbWVudCkKK3sKKwkKKwlJUkRBX0RFQlVHKCA0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qCisJICogQ2hlY2sgaWYgcXVldWUgaXMgZW1wdHkuCisJICovCisJaWYgKCAqcXVldWUgPT0gTlVMTCApIHsKKwkJLyoKKwkJICogUXVldWUgaXMgZW1wdHkuICBJbnNlcnQgb25lIGVsZW1lbnQgaW50byB0aGUgcXVldWUuCisJCSAqLworCQllbGVtZW50LT5xX25leHQgPSBlbGVtZW50LT5xX3ByZXYgPSAqcXVldWUgPSBlbGVtZW50OworCQkKKwl9IGVsc2UgeworCQkvKgorCQkgKiBRdWV1ZSBpcyBub3QgZW1wdHkuICBJbnNlcnQgZWxlbWVudCBpbnRvIGZyb250IG9mIHF1ZXVlLgorCQkgKi8KKwkJZWxlbWVudC0+cV9uZXh0ICAgICAgICAgID0gKCpxdWV1ZSk7CisJCSgqcXVldWUpLT5xX3ByZXYtPnFfbmV4dCA9IGVsZW1lbnQ7CisJCWVsZW1lbnQtPnFfcHJldiAgICAgICAgICA9ICgqcXVldWUpLT5xX3ByZXY7CisJCSgqcXVldWUpLT5xX3ByZXYgICAgICAgICA9IGVsZW1lbnQ7CisJCSgqcXVldWUpICAgICAgICAgICAgICAgICA9IGVsZW1lbnQ7CisJfQorfQorCisKKy8qCisgKiBGdW5jdGlvbiBkZXF1ZXVlIChxdWV1ZSkKKyAqCisgKiAgICBSZW1vdmUgZmlyc3QgZW50cnkgaW4gcXVldWUKKyAqCisgKi8KK3N0YXRpYyBpcmRhX3F1ZXVlX3QgKmRlcXVldWVfZmlyc3QoaXJkYV9xdWV1ZV90ICoqcXVldWUpCit7CisJaXJkYV9xdWV1ZV90ICpyZXQ7CisKKwlJUkRBX0RFQlVHKCA0LCAiZGVxdWV1ZV9maXJzdCgpXG4iKTsKKwkKKwkvKgorCSAqIFNldCByZXR1cm4gdmFsdWUKKwkgKi8KKwlyZXQgPSAgKnF1ZXVlOworCQorCWlmICggKnF1ZXVlID09IE5VTEwgKSB7CisJCS8qCisJCSAqIFF1ZXVlIHdhcyBlbXB0eS4KKwkJICovCisJfSBlbHNlIGlmICggKCpxdWV1ZSktPnFfbmV4dCA9PSAqcXVldWUgKSB7CisJCS8qIAorCQkgKiAgUXVldWUgb25seSBjb250YWluZWQgYSBzaW5nbGUgZWxlbWVudC4gSXQgd2lsbCBub3cgYmUKKwkJICogIGVtcHR5LiAgCisJCSAqLworCQkqcXVldWUgPSBOVUxMOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFF1ZXVlIGNvbnRhaW5lZCBzZXZlcmFsIGVsZW1lbnQuICBSZW1vdmUgdGhlIGZpcnN0IG9uZS4KKwkJICovCisJCSgqcXVldWUpLT5xX3ByZXYtPnFfbmV4dCA9ICgqcXVldWUpLT5xX25leHQ7CisJCSgqcXVldWUpLT5xX25leHQtPnFfcHJldiA9ICgqcXVldWUpLT5xX3ByZXY7CisJCSpxdWV1ZSA9ICgqcXVldWUpLT5xX25leHQ7CisJfQorCQorCS8qCisJICogUmV0dXJuIHRoZSByZW1vdmVkIGVudHJ5IChvciBOVUxMIG9mIHF1ZXVlIHdhcyBlbXB0eSkuCisJICovCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGRlcXVldWVfZ2VuZXJhbCAocXVldWUsIGVsZW1lbnQpCisgKgorICoKKyAqLworc3RhdGljIGlyZGFfcXVldWVfdCAqZGVxdWV1ZV9nZW5lcmFsKGlyZGFfcXVldWVfdCAqKnF1ZXVlLCBpcmRhX3F1ZXVlX3QqIGVsZW1lbnQpCit7CisJaXJkYV9xdWV1ZV90ICpyZXQ7CisJCisJSVJEQV9ERUJVRyggNCwgImRlcXVldWVfZ2VuZXJhbCgpXG4iKTsKKwkKKwkvKgorCSAqIFNldCByZXR1cm4gdmFsdWUKKwkgKi8KKwlyZXQgPSAgKnF1ZXVlOworCQkKKwlpZiAoICpxdWV1ZSA9PSBOVUxMICkgeworCQkvKgorCQkgKiBRdWV1ZSB3YXMgZW1wdHkuCisJCSAqLworCX0gZWxzZSBpZiAoICgqcXVldWUpLT5xX25leHQgPT0gKnF1ZXVlICkgeworCQkvKiAKKwkJICogIFF1ZXVlIG9ubHkgY29udGFpbmVkIGEgc2luZ2xlIGVsZW1lbnQuIEl0IHdpbGwgbm93IGJlCisJCSAqICBlbXB0eS4gIAorCQkgKi8KKwkJKnF1ZXVlID0gTlVMTDsKKwkJCisJfSBlbHNlIHsKKwkJLyoKKwkJICogIFJlbW92ZSBzcGVjaWZpYyBlbGVtZW50LgorCQkgKi8KKwkJZWxlbWVudC0+cV9wcmV2LT5xX25leHQgPSBlbGVtZW50LT5xX25leHQ7CisJCWVsZW1lbnQtPnFfbmV4dC0+cV9wcmV2ID0gZWxlbWVudC0+cV9wcmV2OworCQlpZiAoICgqcXVldWUpID09IGVsZW1lbnQpCisJCQkoKnF1ZXVlKSA9IGVsZW1lbnQtPnFfbmV4dDsKKwl9CisJCisJLyoKKwkgKiBSZXR1cm4gdGhlIHJlbW92ZWQgZW50cnkgKG9yIE5VTEwgb2YgcXVldWUgd2FzIGVtcHR5KS4KKwkgKi8KKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqIEhBU0hCSU4gTUFOQUdFTUVOVCAqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBGdW5jdGlvbiBoYXNoYmluX2NyZWF0ZSAoIHR5cGUsIG5hbWUgKQorICoKKyAqICAgIENyZWF0ZSBoYXNoYmluIQorICoKKyAqLworaGFzaGJpbl90ICpoYXNoYmluX25ldyhpbnQgdHlwZSkKK3sKKwloYXNoYmluX3QqIGhhc2hiaW47CisJCisJLyoKKwkgKiBBbGxvY2F0ZSBuZXcgaGFzaGJpbgorCSAqLworCWhhc2hiaW4gPSBrbWFsbG9jKCBzaXplb2YoaGFzaGJpbl90KSwgR0ZQX0FUT01JQyk7CisJaWYgKCFoYXNoYmluKQorCQlyZXR1cm4gTlVMTDsKKworCS8qCisJICogSW5pdGlhbGl6ZSBzdHJ1Y3R1cmUKKwkgKi8KKwltZW1zZXQoaGFzaGJpbiwgMCwgc2l6ZW9mKGhhc2hiaW5fdCkpOworCWhhc2hiaW4tPmhiX3R5cGUgPSB0eXBlOworCWhhc2hiaW4tPm1hZ2ljID0gSEJfTUFHSUM7CisJLy9oYXNoYmluLT5oYl9jdXJyZW50ID0gTlVMTDsKKworCS8qIE1ha2Ugc3VyZSBhbGwgc3BpbmxvY2sncyBhcmUgdW5sb2NrZWQgKi8KKwlpZiAoIGhhc2hiaW4tPmhiX3R5cGUgJiBIQl9MT0NLICkgeworCQlzcGluX2xvY2tfaW5pdCgmaGFzaGJpbi0+aGJfc3BpbmxvY2spOworCX0KKworCXJldHVybiBoYXNoYmluOworfQorRVhQT1JUX1NZTUJPTChoYXNoYmluX25ldyk7CisKKworLyoKKyAqIEZ1bmN0aW9uIGhhc2hiaW5fZGVsZXRlIChoYXNoYmluLCBmcmVlX2Z1bmMpCisgKgorICogICAgRGVzdHJveSBoYXNoYmluLCB0aGUgZnJlZV9mdW5jIGNhbiBiZSBhIHVzZXIgc3VwcGxpZWQgc3BlY2lhbCByb3V0aW5lIAorICogICAgZm9yIGRlYWxsb2NhdGluZyB0aGlzIHN0cnVjdHVyZSBpZiBpdCdzIGNvbXBsZXguIElmIG5vdCB0aGUgdXNlciBjYW4gCisgKiAgICBqdXN0IHN1cHBseSBrZnJlZSwgd2hpY2ggc2hvdWxkIHRha2UgY2FyZSBvZiB0aGUgam9iLgorICovCitpbnQgaGFzaGJpbl9kZWxldGUoIGhhc2hiaW5fdCogaGFzaGJpbiwgRlJFRV9GVU5DIGZyZWVfZnVuYykKK3sKKwlpcmRhX3F1ZXVlX3QqIHF1ZXVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCWludCBpOworCisJSVJEQV9BU1NFUlQoaGFzaGJpbiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChoYXNoYmluLT5tYWdpYyA9PSBIQl9NQUdJQywgcmV0dXJuIC0xOyk7CisJCisJLyogU3luY2hyb25pemUgKi8KKwlpZiAoIGhhc2hiaW4tPmhiX3R5cGUgJiBIQl9MT0NLICkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKwl9CisKKwkvKgorCSAqICBGcmVlIHRoZSBlbnRyaWVzIGluIHRoZSBoYXNoYmluLCBUT0RPOiB1c2UgaGFzaGJpbl9jbGVhciB3aGVuCisJICogIGl0IGhhcyBiZWVuIHNob3duIHRvIHdvcmsKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgSEFTSEJJTl9TSVpFOyBpICsrICkgeworCQlxdWV1ZSA9IGRlcXVldWVfZmlyc3QoKGlyZGFfcXVldWVfdCoqKSAmaGFzaGJpbi0+aGJfcXVldWVbaV0pOworCQl3aGlsZSAocXVldWUgKSB7CisJCQlpZiAoZnJlZV9mdW5jKQorCQkJCSgqZnJlZV9mdW5jKShxdWV1ZSk7CisJCQlxdWV1ZSA9IGRlcXVldWVfZmlyc3QoIAorCQkJCShpcmRhX3F1ZXVlX3QqKikgJmhhc2hiaW4tPmhiX3F1ZXVlW2ldKTsKKwkJfQorCX0KKwkKKwkvKiBDbGVhbnVwIGxvY2FsIGRhdGEgKi8KKwloYXNoYmluLT5oYl9jdXJyZW50ID0gTlVMTDsKKwloYXNoYmluLT5tYWdpYyA9IH5IQl9NQUdJQzsKKworCS8qIFJlbGVhc2UgbG9jayAqLworCWlmICggaGFzaGJpbi0+aGJfdHlwZSAmIEhCX0xPQ0spIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKwl9CisKKwkvKgorCSAqICBGcmVlIHRoZSBoYXNoYmluIHN0cnVjdHVyZQorCSAqLworCWtmcmVlKGhhc2hiaW4pOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGhhc2hiaW5fZGVsZXRlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKiBIQVNIQklOIExJU1QgT1BFUkFUSU9OUyAqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBGdW5jdGlvbiBoYXNoYmluX2luc2VydCAoaGFzaGJpbiwgZW50cnksIG5hbWUpCisgKgorICogICAgSW5zZXJ0IGFuIGVudHJ5IGludG8gdGhlIGhhc2hiaW4KKyAqCisgKi8KK3ZvaWQgaGFzaGJpbl9pbnNlcnQoaGFzaGJpbl90KiBoYXNoYmluLCBpcmRhX3F1ZXVlX3QqIGVudHJ5LCBsb25nIGhhc2h2LCAKKwkJICAgIGNvbnN0IGNoYXIqIG5hbWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJaW50IGJpbjsKKworCUlSREFfREVCVUcoIDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoIGhhc2hiaW4gIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoIGhhc2hiaW4tPm1hZ2ljID09IEhCX01BR0lDLCByZXR1cm47KTsKKworCS8qCisJICogTG9jYXRlIGhhc2hiaW4KKwkgKi8KKwlpZiAoIG5hbWUgKQorCQloYXNodiA9IGhhc2goIG5hbWUgKTsKKwliaW4gPSBHRVRfSEFTSEJJTiggaGFzaHYgKTsKKworCS8qIFN5bmNocm9uaXplICovCisJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSyApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CisJfSAvKiBEZWZhdWx0IGlzIG5vLWxvY2sgICovCisJCisJLyoKKwkgKiBTdG9yZSBuYW1lIGFuZCBrZXkKKwkgKi8KKwllbnRyeS0+cV9oYXNoID0gaGFzaHY7CisJaWYgKCBuYW1lICkKKwkJc3RybGNweSggZW50cnktPnFfbmFtZSwgbmFtZSwgc2l6ZW9mKGVudHJ5LT5xX25hbWUpKTsKKwkKKwkvKgorCSAqIEluc2VydCBuZXcgZW50cnkgZmlyc3QKKwkgKi8KKwllbnF1ZXVlX2ZpcnN0KCAoaXJkYV9xdWV1ZV90KiopICZoYXNoYmluLT5oYl9xdWV1ZVsgYmluIF0sCisJCSAgICAgICBlbnRyeSk7CisJaGFzaGJpbi0+aGJfc2l6ZSsrOworCisJLyogUmVsZWFzZSBsb2NrICovCisJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSyApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKwl9IC8qIERlZmF1bHQgaXMgbm8tbG9jayAgKi8KK30KK0VYUE9SVF9TWU1CT0woaGFzaGJpbl9pbnNlcnQpOworCisvKiAKKyAqICBGdW5jdGlvbiBoYXNoYmluX3JlbW92ZV9maXJzdCAoaGFzaGJpbikKKyAqCisgKiAgICBSZW1vdmUgZmlyc3QgZW50cnkgb2YgdGhlIGhhc2hiaW4KKyAqCisgKiBOb3RlIDogdGhpcyBmdW5jdGlvbiBubyBsb25nZXIgdXNlIGhhc2hiaW5fcmVtb3ZlKCksIGJ1dCBkb2VzIHRoaW5ncworICogc2ltaWxhciB0byBoYXNoYmluX3JlbW92ZV90aGlzKCksIHNvIGNhbiBiZSBjb25zaWRlcmVkIHNhZmUuCisgKiBKZWFuIElJCisgKi8KK3ZvaWQgKmhhc2hiaW5fcmVtb3ZlX2ZpcnN0KCBoYXNoYmluX3QgKmhhc2hiaW4pCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJaXJkYV9xdWV1ZV90ICplbnRyeSA9IE5VTEw7CisKKwkvKiBTeW5jaHJvbml6ZSAqLworCWlmICggaGFzaGJpbi0+aGJfdHlwZSAmIEhCX0xPQ0sgKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCX0gLyogRGVmYXVsdCBpcyBuby1sb2NrICAqLworCisJZW50cnkgPSBoYXNoYmluX2dldF9maXJzdCggaGFzaGJpbik7CisJaWYgKCBlbnRyeSAhPSBOVUxMKSB7CisJCWludAliaW47CisJCWxvbmcJaGFzaHY7CisJCS8qCisJCSAqIExvY2F0ZSBoYXNoYmluCisJCSAqLworCQloYXNodiA9IGVudHJ5LT5xX2hhc2g7CisJCWJpbiA9IEdFVF9IQVNIQklOKCBoYXNodiApOworCisJCS8qCisJCSAqIERlcXVldWUgdGhlIGVudHJ5Li4uCisJCSAqLworCQlkZXF1ZXVlX2dlbmVyYWwoIChpcmRhX3F1ZXVlX3QqKikgJmhhc2hiaW4tPmhiX3F1ZXVlWyBiaW4gXSwKKwkJCQkgKGlyZGFfcXVldWVfdCopIGVudHJ5ICk7CisJCWhhc2hiaW4tPmhiX3NpemUtLTsKKwkJZW50cnktPnFfbmV4dCA9IE5VTEw7CisJCWVudHJ5LT5xX3ByZXYgPSBOVUxMOworCisJCS8qCisJCSAqICBDaGVjayBpZiB0aGlzIGl0ZW0gaXMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtLCBhbmQgaW4KKwkJICogIHRoYXQgY2FzZSB3ZSBtdXN0IHJlc2V0IGhiX2N1cnJlbnQKKwkJICovCisJCWlmICggZW50cnkgPT0gaGFzaGJpbi0+aGJfY3VycmVudCkKKwkJCWhhc2hiaW4tPmhiX2N1cnJlbnQgPSBOVUxMOworCX0KKworCS8qIFJlbGVhc2UgbG9jayAqLworCWlmICggaGFzaGJpbi0+aGJfdHlwZSAmIEhCX0xPQ0sgKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CisJfSAvKiBEZWZhdWx0IGlzIG5vLWxvY2sgICovCisKKwlyZXR1cm4gZW50cnk7Cit9CisKKworLyogCisgKiAgRnVuY3Rpb24gaGFzaGJpbl9yZW1vdmUgKGhhc2hiaW4sIGhhc2h2LCBuYW1lKQorICoKKyAqICAgIFJlbW92ZSBlbnRyeSB3aXRoIHRoZSBnaXZlbiBuYW1lCisgKgorICogIFRoZSB1c2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyBoaWdobHkgZGlzY291cmFnZWQsIGJlY2F1c2UgdGhlIHdob2xlCisgKiAgY29uY2VwdCBiZWhpbmQgaGFzaGJpbl9yZW1vdmUoKSBpcyBicm9rZW4uIEluIG1hbnkgY2FzZXMsIGl0J3Mgbm90CisgKiAgcG9zc2libGUgdG8gZ3VhcmFudGVlIHRoZSB1bmljaXR5IG9mIHRoZSBpbmRleCAoZWl0aGVyIGhhc2h2IG9yIG5hbWUpLAorICogIGxlYWRpbmcgdG8gcmVtb3ZpbmcgdGhlIFdST05HIGVudHJ5LgorICogIFRoZSBvbmx5IHNpbXBsZSBzYWZlIHVzZSBpcyA6CisgKgkJaGFzaGJpbl9yZW1vdmUoaGFzYmluLCAoaW50KSBzZWxmLCBOVUxMKTsKKyAqICBJbiBvdGhlciBjYXNlLCB5b3UgbXVzdCB0aGluayBoYXJkIHRvIGd1YXJhbnRlZSB1bmljaXR5IG9mIHRoZSBpbmRleC4KKyAqICBKZWFuIElJCisgKi8KK3ZvaWQqIGhhc2hiaW5fcmVtb3ZlKCBoYXNoYmluX3QqIGhhc2hiaW4sIGxvbmcgaGFzaHYsIGNvbnN0IGNoYXIqIG5hbWUpCit7CisJaW50IGJpbiwgZm91bmQgPSBGQUxTRTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlpcmRhX3F1ZXVlX3QqIGVudHJ5OworCisJSVJEQV9ERUJVRyggNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVCggaGFzaGJpbiAhPSBOVUxMLCByZXR1cm4gTlVMTDspOworCUlSREFfQVNTRVJUKCBoYXNoYmluLT5tYWdpYyA9PSBIQl9NQUdJQywgcmV0dXJuIE5VTEw7KTsKKwkKKwkvKgorCSAqIExvY2F0ZSBoYXNoYmluCisJICovCisJaWYgKCBuYW1lICkKKwkJaGFzaHYgPSBoYXNoKCBuYW1lICk7CisJYmluID0gR0VUX0hBU0hCSU4oIGhhc2h2ICk7CisKKwkvKiBTeW5jaHJvbml6ZSAqLworCWlmICggaGFzaGJpbi0+aGJfdHlwZSAmIEhCX0xPQ0sgKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCX0gLyogRGVmYXVsdCBpcyBuby1sb2NrICAqLworCisJLyoKKwkgKiBTZWFyY2ggZm9yIGVudHJ5CisJICovCisJZW50cnkgPSBoYXNoYmluLT5oYl9xdWV1ZVsgYmluIF07CisJaWYgKCBlbnRyeSApIHsKKwkJZG8geworCQkJLyoKKwkJCSAqIENoZWNrIGZvciBrZXkKKwkJCSAqLworCQkJaWYgKCBlbnRyeS0+cV9oYXNoID09IGhhc2h2ICkgeworCQkJCS8qCisJCQkJICogTmFtZSBjb21wYXJlIHRvbz8KKwkJCQkgKi8KKwkJCQlpZiAoIG5hbWUgKSB7CisJCQkJCWlmICggc3RyY21wKCBlbnRyeS0+cV9uYW1lLCBuYW1lKSA9PSAwKQorCQkJCQl7CisJCQkJCQlmb3VuZCA9IFRSVUU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWZvdW5kID0gVFJVRTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJZW50cnkgPSBlbnRyeS0+cV9uZXh0OworCQl9IHdoaWxlICggZW50cnkgIT0gaGFzaGJpbi0+aGJfcXVldWVbIGJpbiBdICk7CisJfQorCQorCS8qCisJICogSWYgZW50cnkgd2FzIGZvdW5kLCBkZXF1ZXVlIGl0CisJICovCisJaWYgKCBmb3VuZCApIHsKKwkJZGVxdWV1ZV9nZW5lcmFsKCAoaXJkYV9xdWV1ZV90KiopICZoYXNoYmluLT5oYl9xdWV1ZVsgYmluIF0sCisJCQkJIChpcmRhX3F1ZXVlX3QqKSBlbnRyeSApOworCQloYXNoYmluLT5oYl9zaXplLS07CisKKwkJLyoKKwkJICogIENoZWNrIGlmIHRoaXMgaXRlbSBpcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0sIGFuZCBpbgorCQkgKiAgdGhhdCBjYXNlIHdlIG11c3QgcmVzZXQgaGJfY3VycmVudAorCQkgKi8KKwkJaWYgKCBlbnRyeSA9PSBoYXNoYmluLT5oYl9jdXJyZW50KQorCQkJaGFzaGJpbi0+aGJfY3VycmVudCA9IE5VTEw7CisJfQorCisJLyogUmVsZWFzZSBsb2NrICovCisJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSyApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKwl9IC8qIERlZmF1bHQgaXMgbm8tbG9jayAgKi8KKyAgICAgICAKKwkKKwkvKiBSZXR1cm4gKi8KKwlpZiAoIGZvdW5kICkgCisJCXJldHVybiBlbnRyeTsKKwllbHNlCisJCXJldHVybiBOVUxMOworCQorfQorRVhQT1JUX1NZTUJPTChoYXNoYmluX3JlbW92ZSk7CisKKy8qIAorICogIEZ1bmN0aW9uIGhhc2hiaW5fcmVtb3ZlX3RoaXMgKGhhc2hiaW4sIGVudHJ5KQorICoKKyAqICAgIFJlbW92ZSBlbnRyeSB3aXRoIHRoZSBnaXZlbiBuYW1lCisgKgorICogSW4gc29tZSBjYXNlcywgdGhlIHVzZXIgb2YgaGFzaGJpbiBjYW4ndCBndWFyYW50ZWUgdGhlIHVuaWNpdHkKKyAqIG9mIGVpdGhlciB0aGUgaGFzaHYgb3IgbmFtZS4KKyAqIEluIHRob3NlIGNhc2VzLCB1c2luZyB0aGUgYWJvdmUgZnVuY3Rpb24gaXMgZ3VhcmFudGVlZCB0byBjYXVzZSB0cm91YmxlcywKKyAqIHNvIHdlIHVzZSB0aGlzIG9uZSBpbnN0ZWFkLi4uCisgKiBBbmQgYnkgdGhlIHdheSwgaXQncyBhbHNvIGZhc3RlciwgYmVjYXVzZSB3ZSBza2lwIHRoZSBzZWFyY2ggcGhhc2UgOy0pCisgKi8KK3ZvaWQqIGhhc2hiaW5fcmVtb3ZlX3RoaXMoIGhhc2hiaW5fdCogaGFzaGJpbiwgaXJkYV9xdWV1ZV90KiBlbnRyeSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlpbnQJYmluOworCWxvbmcJaGFzaHY7CisKKwlJUkRBX0RFQlVHKCA0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKCBoYXNoYmluICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CisJSVJEQV9BU1NFUlQoIGhhc2hiaW4tPm1hZ2ljID09IEhCX01BR0lDLCByZXR1cm4gTlVMTDspOworCUlSREFfQVNTRVJUKCBlbnRyeSAhPSBOVUxMLCByZXR1cm4gTlVMTDspOworCQorCS8qIFN5bmNocm9uaXplICovCisJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSyApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CisJfSAvKiBEZWZhdWx0IGlzIG5vLWxvY2sgICovCisKKwkvKiBDaGVjayBpZiB2YWxpZCBhbmQgbm90IGFscmVhZHkgcmVtb3ZlZC4uLiAqLworCWlmKChlbnRyeS0+cV9uZXh0ID09IE5VTEwpIHx8IChlbnRyeS0+cV9wcmV2ID09IE5VTEwpKSB7CisJCWVudHJ5ID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBMb2NhdGUgaGFzaGJpbgorCSAqLworCWhhc2h2ID0gZW50cnktPnFfaGFzaDsKKwliaW4gPSBHRVRfSEFTSEJJTiggaGFzaHYgKTsKKworCS8qCisJICogRGVxdWV1ZSB0aGUgZW50cnkuLi4KKwkgKi8KKwlkZXF1ZXVlX2dlbmVyYWwoIChpcmRhX3F1ZXVlX3QqKikgJmhhc2hiaW4tPmhiX3F1ZXVlWyBiaW4gXSwKKwkJCSAoaXJkYV9xdWV1ZV90KikgZW50cnkgKTsKKwloYXNoYmluLT5oYl9zaXplLS07CisJZW50cnktPnFfbmV4dCA9IE5VTEw7CisJZW50cnktPnFfcHJldiA9IE5VTEw7CisKKwkvKgorCSAqICBDaGVjayBpZiB0aGlzIGl0ZW0gaXMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtLCBhbmQgaW4KKwkgKiAgdGhhdCBjYXNlIHdlIG11c3QgcmVzZXQgaGJfY3VycmVudAorCSAqLworCWlmICggZW50cnkgPT0gaGFzaGJpbi0+aGJfY3VycmVudCkKKwkJaGFzaGJpbi0+aGJfY3VycmVudCA9IE5VTEw7CitvdXQ6CisJLyogUmVsZWFzZSBsb2NrICovCisJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSyApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKwl9IC8qIERlZmF1bHQgaXMgbm8tbG9jayAgKi8KKworCXJldHVybiBlbnRyeTsKK30KK0VYUE9SVF9TWU1CT0woaGFzaGJpbl9yZW1vdmVfdGhpcyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBIQVNIQklOIEVOVU1FUkFUSU9OICoqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRnVuY3Rpb24gaGFzaGJpbl9jb21tb25fZmluZCAoaGFzaGJpbiwgaGFzaHYsIG5hbWUpCisgKgorICogICAgRmluZCBpdGVtIHdpdGggdGhlIGdpdmVuIGhhc2h2IG9yIG5hbWUKKyAqCisgKi8KK3ZvaWQqIGhhc2hiaW5fZmluZCggaGFzaGJpbl90KiBoYXNoYmluLCBsb25nIGhhc2h2LCBjb25zdCBjaGFyKiBuYW1lICkKK3sKKwlpbnQgYmluOworCWlyZGFfcXVldWVfdCogZW50cnk7CisKKwlJUkRBX0RFQlVHKCA0LCAiaGFzaGJpbl9maW5kKClcbiIpOworCisJSVJEQV9BU1NFUlQoIGhhc2hiaW4gIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKKwlJUkRBX0FTU0VSVCggaGFzaGJpbi0+bWFnaWMgPT0gSEJfTUFHSUMsIHJldHVybiBOVUxMOyk7CisKKwkvKgorCSAqIExvY2F0ZSBoYXNoYmluCisJICovCisJaWYgKCBuYW1lICkKKwkJaGFzaHYgPSBoYXNoKCBuYW1lICk7CisJYmluID0gR0VUX0hBU0hCSU4oIGhhc2h2ICk7CisJCisJLyoKKwkgKiBTZWFyY2ggZm9yIGVudHJ5CisJICovCisJZW50cnkgPSBoYXNoYmluLT5oYl9xdWV1ZVsgYmluXTsKKwlpZiAoIGVudHJ5ICkgeworCQlkbyB7CisJCQkvKgorCQkJICogQ2hlY2sgZm9yIGtleQorCQkJICovCisJCQlpZiAoIGVudHJ5LT5xX2hhc2ggPT0gaGFzaHYgKSB7CisJCQkJLyoKKwkJCQkgKiBOYW1lIGNvbXBhcmUgdG9vPworCQkJCSAqLworCQkJCWlmICggbmFtZSApIHsKKwkJCQkJaWYgKCBzdHJjbXAoIGVudHJ5LT5xX25hbWUsIG5hbWUgKSA9PSAwICkgeworCQkJCQkJcmV0dXJuIGVudHJ5OworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIGVudHJ5OworCQkJCX0KKwkJCX0KKwkJCWVudHJ5ID0gZW50cnktPnFfbmV4dDsKKwkJfSB3aGlsZSAoIGVudHJ5ICE9IGhhc2hiaW4tPmhiX3F1ZXVlWyBiaW4gXSApOworCX0KKworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChoYXNoYmluX2ZpbmQpOworCisvKgorICogRnVuY3Rpb24gaGFzaGJpbl9sb2NrX2ZpbmQgKGhhc2hiaW4sIGhhc2h2LCBuYW1lKQorICoKKyAqICAgIEZpbmQgaXRlbSB3aXRoIHRoZSBnaXZlbiBoYXNodiBvciBuYW1lCisgKgorICogU2FtZSwgYnV0IHdpdGggc3BpbmxvY2sgcHJvdGVjdGlvbi4uLgorICogSSBjYWxsIGl0IHNhZmUsIGJ1dCBpdCdzIG9ubHkgc2FmZSB3aXRoIHJlc3BlY3QgdG8gdGhlIGhhc2hiaW4sIG5vdCBpdHMKKyAqIGNvbnRlbnQuIC0gSmVhbiBJSQorICovCit2b2lkKiBoYXNoYmluX2xvY2tfZmluZCggaGFzaGJpbl90KiBoYXNoYmluLCBsb25nIGhhc2h2LCBjb25zdCBjaGFyKiBuYW1lICkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlpcmRhX3F1ZXVlX3QqIGVudHJ5OworCisJLyogU3luY2hyb25pemUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogU2VhcmNoIGZvciBlbnRyeQorCSAqLworCWVudHJ5ID0gKGlyZGFfcXVldWVfdCogKSBoYXNoYmluX2ZpbmQoIGhhc2hiaW4sIGhhc2h2LCBuYW1lICk7CisKKwkvKiBSZWxlYXNlIGxvY2sgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGVudHJ5OworfQorRVhQT1JUX1NZTUJPTChoYXNoYmluX2xvY2tfZmluZCk7CisKKy8qCisgKiBGdW5jdGlvbiBoYXNoYmluX2ZpbmQgKGhhc2hiaW4sIGhhc2h2LCBuYW1lLCBwbmV4dCkKKyAqCisgKiAgICBGaW5kIGFuIGl0ZW0gd2l0aCB0aGUgZ2l2ZW4gaGFzaHYgb3IgbmFtZSwgYW5kIGl0cyBzdWNjZXNzb3IKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG93IHRvIGRvIGNvbmN1cnJlbnQgZW51bWVyYXRpb25zIHdpdGhvdXQgdGhlCisgKiBuZWVkIHRvIGxvY2sgb3ZlciB0aGUgd2hvbGUgc2Vzc2lvbiwgYmVjYXVzZSB0aGUgY2FsbGVyIGtlZXAgdGhlCisgKiBjb250ZXh0IG9mIHRoZSBzZWFyY2guIE9uIHRoZSBvdGhlciBoYW5kLCBpdCBtaWdodCBmYWlsIGFuZCByZXR1cm4KKyAqIE5VTEwgaWYgdGhlIGVudHJ5IGlzIHJlbW92ZWQuIC0gSmVhbiBJSQorICovCit2b2lkKiBoYXNoYmluX2ZpbmRfbmV4dCggaGFzaGJpbl90KiBoYXNoYmluLCBsb25nIGhhc2h2LCBjb25zdCBjaGFyKiBuYW1lLAorCQkJIHZvaWQgKiogcG5leHQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJaXJkYV9xdWV1ZV90KiBlbnRyeTsKKworCS8qIFN5bmNocm9uaXplICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIFNlYXJjaCBmb3IgY3VycmVudCBlbnRyeQorCSAqIFRoaXMgYWxsb3cgdG8gY2hlY2sgaWYgdGhlIGN1cnJlbnQgaXRlbSBpcyBzdGlsbCBpbiB0aGUKKwkgKiBoYXNoYmluIG9yIGhhcyBiZWVuIHJlbW92ZWQuCisJICovCisJZW50cnkgPSAoaXJkYV9xdWV1ZV90KiApIGhhc2hiaW5fZmluZCggaGFzaGJpbiwgaGFzaHYsIG5hbWUgKTsKKworCS8qCisJICogVHJpY2sgaGFzaGJpbl9nZXRfbmV4dCgpIHRvIHJldHVybiB3aGF0IHdlIHdhbnQKKwkgKi8KKwlpZihlbnRyeSkgeworCQloYXNoYmluLT5oYl9jdXJyZW50ID0gZW50cnk7CisJCSpwbmV4dCA9IGhhc2hiaW5fZ2V0X25leHQoIGhhc2hiaW4gKTsKKwl9IGVsc2UKKwkJKnBuZXh0ID0gTlVMTDsKKworCS8qIFJlbGVhc2UgbG9jayAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZW50cnk7Cit9CitFWFBPUlRfU1lNQk9MKGhhc2hiaW5fZmluZF9uZXh0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGhhc2hiaW5fZ2V0X2ZpcnN0IChoYXNoYmluKQorICoKKyAqICAgIEdldCBhIHBvaW50ZXIgdG8gZmlyc3QgZWxlbWVudCBpbiBoYXNoYmluLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUKKyAqICAgIGNhbGxlZCBiZWZvcmUgYW55IGNhbGxzIHRvIGhhc2hiaW5fZ2V0X25leHQoKSEKKyAqCisgKi8KK2lyZGFfcXVldWVfdCAqaGFzaGJpbl9nZXRfZmlyc3QoIGhhc2hiaW5fdCogaGFzaGJpbikgCit7CisJaXJkYV9xdWV1ZV90ICplbnRyeTsKKwlpbnQgaTsKKworCUlSREFfQVNTRVJUKCBoYXNoYmluICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CisJSVJEQV9BU1NFUlQoIGhhc2hiaW4tPm1hZ2ljID09IEhCX01BR0lDLCByZXR1cm4gTlVMTDspOworCisJaWYgKCBoYXNoYmluID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJZm9yICggaSA9IDA7IGkgPCBIQVNIQklOX1NJWkU7IGkgKysgKSB7CisJCWVudHJ5ID0gaGFzaGJpbi0+aGJfcXVldWVbIGldOworCQlpZiAoIGVudHJ5KSB7CisJCQloYXNoYmluLT5oYl9jdXJyZW50ID0gZW50cnk7CisJCQlyZXR1cm4gZW50cnk7CisJCX0KKwl9CisJLyoKKwkgKiAgRGlkIG5vdCBmaW5kIGFueSBpdGVtIGluIGhhc2hiaW4KKwkgKi8KKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woaGFzaGJpbl9nZXRfZmlyc3QpOworCisvKgorICogRnVuY3Rpb24gaGFzaGJpbl9nZXRfbmV4dCAoaGFzaGJpbikKKyAqCisgKiAgICBHZXQgbmV4dCBpdGVtIGluIGhhc2hiaW4uIEEgc2VyaWVzIG9mIGhhc2hiaW5fZ2V0X25leHQoKSBjYWxscyBtdXN0CisgKiAgICBiZSBzdGFydGVkIGJ5IGEgY2FsbCB0byBoYXNoYmluX2dldF9maXJzdCgpLiBUaGUgZnVuY3Rpb24gcmV0dXJucworICogICAgTlVMTCB3aGVuIGFsbCBpdGVtcyBoYXZlIGJlZW4gdHJhdmVyc2VkCisgKiAKKyAqIFRoZSBjb250ZXh0IG9mIHRoZSBzZWFyY2ggaXMgc3RvcmVkIHdpdGhpbiB0aGUgaGFzaGJpbiwgc28geW91IG11c3QKKyAqIHByb3RlY3QgeW91cnNlbGYgZnJvbSBjb25jdXJyZW50IGVudW1lcmF0aW9ucy4gLSBKZWFuIElJCisgKi8KK2lyZGFfcXVldWVfdCAqaGFzaGJpbl9nZXRfbmV4dCggaGFzaGJpbl90ICpoYXNoYmluKQoreworCWlyZGFfcXVldWVfdCogZW50cnk7CisJaW50IGJpbjsKKwlpbnQgaTsKKworCUlSREFfQVNTRVJUKCBoYXNoYmluICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CisJSVJEQV9BU1NFUlQoIGhhc2hiaW4tPm1hZ2ljID09IEhCX01BR0lDLCByZXR1cm4gTlVMTDspOworCisJaWYgKCBoYXNoYmluLT5oYl9jdXJyZW50ID09IE5VTEwpIHsKKwkJSVJEQV9BU1NFUlQoIGhhc2hiaW4tPmhiX2N1cnJlbnQgIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKKwkJcmV0dXJuIE5VTEw7CisJfQkKKwllbnRyeSA9IGhhc2hiaW4tPmhiX2N1cnJlbnQtPnFfbmV4dDsKKwliaW4gPSBHRVRfSEFTSEJJTiggZW50cnktPnFfaGFzaCk7CisKKwkvKiAgCisJICogIE1ha2Ugc3VyZSB0aGF0IHdlIGFyZSBub3QgYmFjayBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBxdWV1ZQorCSAqICBhZ2FpbiAKKwkgKi8KKwlpZiAoIGVudHJ5ICE9IGhhc2hiaW4tPmhiX3F1ZXVlWyBiaW4gXSkgeworCQloYXNoYmluLT5oYl9jdXJyZW50ID0gZW50cnk7CisKKwkJcmV0dXJuIGVudHJ5OworCX0KKworCS8qCisJICogIENoZWNrIHRoYXQgdGhpcyBpcyBub3QgdGhlIGxhc3QgcXVldWUgaW4gaGFzaGJpbgorCSAqLworCWlmICggYmluID49IEhBU0hCSU5fU0laRSkKKwkJcmV0dXJuIE5VTEw7CisJCisJLyoKKwkgKiAgTW92ZSB0byBuZXh0IHF1ZXVlIGluIGhhc2hiaW4KKwkgKi8KKwliaW4rKzsKKwlmb3IgKCBpID0gYmluOyBpIDwgSEFTSEJJTl9TSVpFOyBpKysgKSB7CisJCWVudHJ5ID0gaGFzaGJpbi0+aGJfcXVldWVbIGldOworCQlpZiAoIGVudHJ5KSB7CisJCQloYXNoYmluLT5oYl9jdXJyZW50ID0gZW50cnk7CisJCQkKKwkJCXJldHVybiBlbnRyeTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woaGFzaGJpbl9nZXRfbmV4dCk7CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcnN5c2N0bC5jIGIvbmV0L2lyZGEvaXJzeXNjdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjFjNDE5Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvaXJzeXNjdGwuYwpAQCAtMCwwICsxLDI5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBpcnN5c2N0bC5jCisgKiBWZXJzaW9uOiAgICAgICAxLjAKKyAqIERlc2NyaXB0aW9uOiAgIFN5c2N0bCBpbnRlcmZhY2UgZm9yIElyREEKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFN1biBNYXkgMjQgMjI6MTI6MDYgMTk5OAorICogTW9kaWZpZWQgYXQ6ICAgRnJpIEp1biAgNCAwMjo1MDoxNSAxOTk5CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTcsIDE5OTkgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgkJLyogaXJkYV9kZWJ1ZyAqLworI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFzX29iamVjdC5oPgorCisjZGVmaW5lIE5FVF9JUkRBIDQxMiAvKiBSYW5kb20gbnVtYmVyICovCitlbnVtIHsgRElTQ09WRVJZPTEsIERFVk5BTUUsIERFQlVHLCBGQVNUX1BPTEwsIERJU0NPVkVSWV9TTE9UUywKKyAgICAgICBESVNDT1ZFUllfVElNRU9VVCwgU0xPVF9USU1FT1VULCBNQVhfQkFVRF9SQVRFLCBNSU5fVFhfVFVSTl9USU1FLAorICAgICAgIE1BWF9UWF9EQVRBX1NJWkUsIE1BWF9UWF9XSU5ET1csIE1BWF9OT1JFUExZX1RJTUUsIFdBUk5fTk9SRVBMWV9USU1FLAorICAgICAgIExBUF9LRUVQQUxJVkVfVElNRSB9OworCitleHRlcm4gaW50ICBzeXNjdGxfZGlzY292ZXJ5OworZXh0ZXJuIGludCAgc3lzY3RsX2Rpc2NvdmVyeV9zbG90czsKK2V4dGVybiBpbnQgIHN5c2N0bF9kaXNjb3ZlcnlfdGltZW91dDsKK2V4dGVybiBpbnQgIHN5c2N0bF9zbG90X3RpbWVvdXQ7CitleHRlcm4gaW50ICBzeXNjdGxfZmFzdF9wb2xsX2luY3JlYXNlOworZXh0ZXJuIGNoYXIgc3lzY3RsX2Rldm5hbWVbXTsKK2V4dGVybiBpbnQgIHN5c2N0bF9tYXhfYmF1ZF9yYXRlOworZXh0ZXJuIGludCAgc3lzY3RsX21pbl90eF90dXJuX3RpbWU7CitleHRlcm4gaW50ICBzeXNjdGxfbWF4X3R4X2RhdGFfc2l6ZTsKK2V4dGVybiBpbnQgIHN5c2N0bF9tYXhfdHhfd2luZG93OworZXh0ZXJuIGludCAgc3lzY3RsX21heF9ub3JlcGx5X3RpbWU7CitleHRlcm4gaW50ICBzeXNjdGxfd2Fybl9ub3JlcGx5X3RpbWU7CitleHRlcm4gaW50ICBzeXNjdGxfbGFwX2tlZXBhbGl2ZV90aW1lOworCisvKiB0aGlzIGlzIG5lZWRlZCBmb3IgdGhlIHByb2NfZG9pbnR2ZWNfbWlubWF4IC0gSmVhbiBJSSAqLworc3RhdGljIGludCBtYXhfZGlzY292ZXJ5X3Nsb3RzID0gMTY7CQkvKiA/Pz8gKi8KK3N0YXRpYyBpbnQgbWluX2Rpc2NvdmVyeV9zbG90cyA9IDE7CisvKiBJckxBUCA2LjEzLjIgc2F5cyAyNW1zIHRvIDEwKzcwbXMgLSBhbGxvdyBoaWdoZXIgc2luY2Ugc29tZSBkZXZpY2VzCisgKiBzZWVtcyB0byByZXF1aXJlIGl0LiAoZnJvbSBEYWcncyBjb21tZW50KSAqLworc3RhdGljIGludCBtYXhfc2xvdF90aW1lb3V0ID0gMTYwOworc3RhdGljIGludCBtaW5fc2xvdF90aW1lb3V0ID0gMjA7CitzdGF0aWMgaW50IG1heF9tYXhfYmF1ZF9yYXRlID0gMTYwMDAwMDA7CS8qIFNlZSBxb3MuYyAtIElyTEFQIHNwZWMgKi8KK3N0YXRpYyBpbnQgbWluX21heF9iYXVkX3JhdGUgPSAyNDAwOworc3RhdGljIGludCBtYXhfbWluX3R4X3R1cm5fdGltZSA9IDEwMDAwOwkvKiBTZWUgcW9zLmMgLSBJckxBUCBzcGVjICovCitzdGF0aWMgaW50IG1pbl9taW5fdHhfdHVybl90aW1lOworc3RhdGljIGludCBtYXhfbWF4X3R4X2RhdGFfc2l6ZSA9IDIwNDg7CQkvKiBTZWUgcW9zLmMgLSBJckxBUCBzcGVjICovCitzdGF0aWMgaW50IG1pbl9tYXhfdHhfZGF0YV9zaXplID0gNjQ7CitzdGF0aWMgaW50IG1heF9tYXhfdHhfd2luZG93ID0gNzsJCS8qIFNlZSBxb3MuYyAtIElyTEFQIHNwZWMgKi8KK3N0YXRpYyBpbnQgbWluX21heF90eF93aW5kb3cgPSAxOworc3RhdGljIGludCBtYXhfbWF4X25vcmVwbHlfdGltZSA9IDQwOwkJLyogU2VlIHFvcy5jIC0gSXJMQVAgc3BlYyAqLworc3RhdGljIGludCBtaW5fbWF4X25vcmVwbHlfdGltZSA9IDM7CitzdGF0aWMgaW50IG1heF93YXJuX25vcmVwbHlfdGltZSA9IDM7CQkvKiAzcyA9PSBzdGFuZGFyZCAqLworc3RhdGljIGludCBtaW5fd2Fybl9ub3JlcGx5X3RpbWUgPSAxOwkJLyogMXMgPT0gbWluIFdEX1RJTUVSICovCitzdGF0aWMgaW50IG1heF9sYXBfa2VlcGFsaXZlX3RpbWUgPSAxMDAwMDsJLyogMTBzICovCitzdGF0aWMgaW50IG1pbl9sYXBfa2VlcGFsaXZlX3RpbWUgPSAxMDA7CS8qIDEwMHVzICovCisvKiBGb3Igb3RoZXIgc3lzY3RsLCBJJ3ZlIG5vIGlkZWEgb2YgdGhlIHJhbmdlLiBNYXliZSBEYWcgY291bGQgaGVscAorICogdXMgb24gdGhhdCAtIEplYW4gSUkgKi8KKworc3RhdGljIGludCBkb19kZXZuYW1lKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQoreworCWludCByZXQ7CisKKwlyZXQgPSBwcm9jX2Rvc3RyaW5nKHRhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlpZiAocmV0ID09IDAgJiYgd3JpdGUpIHsKKwkJc3RydWN0IGlhc192YWx1ZSAqdmFsOworCisJCXZhbCA9IGlyaWFzX25ld19zdHJpbmdfdmFsdWUoc3lzY3RsX2Rldm5hbWUpOworCQlpZiAodmFsKQorCQkJaXJpYXNfb2JqZWN0X2NoYW5nZV9hdHRyaWJ1dGUoIkRldmljZSIsICJEZXZpY2VOYW1lIiwgdmFsKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogT25lIGZpbGUgKi8KK3N0YXRpYyBjdGxfdGFibGUgaXJkYV90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gRElTQ09WRVJZLAorCQkucHJvY25hbWUJPSAiZGlzY292ZXJ5IiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9kaXNjb3ZlcnksCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBERVZOQU1FLAorCQkucHJvY25hbWUJPSAiZGV2bmFtZSIsCisJCS5kYXRhCQk9IHN5c2N0bF9kZXZuYW1lLAorCQkubWF4bGVuCQk9IDY1LAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJmRvX2Rldm5hbWUsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfc3RyaW5nCisJfSwKKyNpZmRlZiBDT05GSUdfSVJEQV9ERUJVRworICAgICAgICB7CisJCS5jdGxfbmFtZQk9IERFQlVHLAorCQkucHJvY25hbWUJPSAiZGVidWciLAorCQkuZGF0YQkJPSAmaXJkYV9kZWJ1ZywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19JUkRBX0ZBU1RfUlIKKyAgICAgICAgeworCQkuY3RsX25hbWUJPSBGQVNUX1BPTEwsCisJCS5wcm9jbmFtZQk9ICJmYXN0X3BvbGxfaW5jcmVhc2UiLAorCQkuZGF0YQkJPSAmc3lzY3RsX2Zhc3RfcG9sbF9pbmNyZWFzZSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKyNlbmRpZgorCXsKKwkJLmN0bF9uYW1lCT0gRElTQ09WRVJZX1NMT1RTLAorCQkucHJvY25hbWUJPSAiZGlzY292ZXJ5X3Nsb3RzIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9kaXNjb3Zlcnlfc2xvdHMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZtaW5fZGlzY292ZXJ5X3Nsb3RzLAorCQkuZXh0cmEyCQk9ICZtYXhfZGlzY292ZXJ5X3Nsb3RzCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IERJU0NPVkVSWV9USU1FT1VULAorCQkucHJvY25hbWUJPSAiZGlzY292ZXJ5X3RpbWVvdXQiLAorCQkuZGF0YQkJPSAmc3lzY3RsX2Rpc2NvdmVyeV90aW1lb3V0LAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gU0xPVF9USU1FT1VULAorCQkucHJvY25hbWUJPSAic2xvdF90aW1lb3V0IiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9zbG90X3RpbWVvdXQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZtaW5fc2xvdF90aW1lb3V0LAorCQkuZXh0cmEyCQk9ICZtYXhfc2xvdF90aW1lb3V0CisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE1BWF9CQVVEX1JBVEUsCisJCS5wcm9jbmFtZQk9ICJtYXhfYmF1ZF9yYXRlIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9tYXhfYmF1ZF9yYXRlLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmbWluX21heF9iYXVkX3JhdGUsCisJCS5leHRyYTIJCT0gJm1heF9tYXhfYmF1ZF9yYXRlCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE1JTl9UWF9UVVJOX1RJTUUsCisJCS5wcm9jbmFtZQk9ICJtaW5fdHhfdHVybl90aW1lIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9taW5fdHhfdHVybl90aW1lLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmbWluX21pbl90eF90dXJuX3RpbWUsCisJCS5leHRyYTIJCT0gJm1heF9taW5fdHhfdHVybl90aW1lCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE1BWF9UWF9EQVRBX1NJWkUsCisJCS5wcm9jbmFtZQk9ICJtYXhfdHhfZGF0YV9zaXplIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9tYXhfdHhfZGF0YV9zaXplLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmbWluX21heF90eF9kYXRhX3NpemUsCisJCS5leHRyYTIJCT0gJm1heF9tYXhfdHhfZGF0YV9zaXplCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE1BWF9UWF9XSU5ET1csCisJCS5wcm9jbmFtZQk9ICJtYXhfdHhfd2luZG93IiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9tYXhfdHhfd2luZG93LAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmbWluX21heF90eF93aW5kb3csCisJCS5leHRyYTIJCT0gJm1heF9tYXhfdHhfd2luZG93CisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE1BWF9OT1JFUExZX1RJTUUsCisJCS5wcm9jbmFtZQk9ICJtYXhfbm9yZXBseV90aW1lIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9tYXhfbm9yZXBseV90aW1lLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmbWluX21heF9ub3JlcGx5X3RpbWUsCisJCS5leHRyYTIJCT0gJm1heF9tYXhfbm9yZXBseV90aW1lCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IFdBUk5fTk9SRVBMWV9USU1FLAorCQkucHJvY25hbWUJPSAid2Fybl9ub3JlcGx5X3RpbWUiLAorCQkuZGF0YQkJPSAmc3lzY3RsX3dhcm5fbm9yZXBseV90aW1lLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmbWluX3dhcm5fbm9yZXBseV90aW1lLAorCQkuZXh0cmEyCQk9ICZtYXhfd2Fybl9ub3JlcGx5X3RpbWUKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTEFQX0tFRVBBTElWRV9USU1FLAorCQkucHJvY25hbWUJPSAibGFwX2tlZXBhbGl2ZV90aW1lIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9sYXBfa2VlcGFsaXZlX3RpbWUsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZtaW5fbGFwX2tlZXBhbGl2ZV90aW1lLAorCQkuZXh0cmEyCQk9ICZtYXhfbGFwX2tlZXBhbGl2ZV90aW1lCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworLyogT25lIGRpcmVjdG9yeSAqLworc3RhdGljIGN0bF90YWJsZSBpcmRhX25ldF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lSREEsCisJCS5wcm9jbmFtZQk9ICJpcmRhIiwKKwkJLm1heGxlbgkJPSAwLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gaXJkYV90YWJsZQorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKKy8qIFRoZSBwYXJlbnQgZGlyZWN0b3J5ICovCitzdGF0aWMgY3RsX3RhYmxlIGlyZGFfcm9vdF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX05FVCwKKwkJLnByb2NuYW1lCT0gIm5ldCIsCisJCS5tYXhsZW4JCT0gMCwKKwkJLm1vZGUJCT0gMDU1NSwKKwkJLmNoaWxkCQk9IGlyZGFfbmV0X3RhYmxlCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICppcmRhX3RhYmxlX2hlYWRlcjsKKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfc3lzY3RsX3JlZ2lzdGVyICh2b2lkKQorICoKKyAqICAgIFJlZ2lzdGVyIG91ciBzeXNjdGwgaW50ZXJmYWNlCisgKgorICovCitpbnQgX19pbml0IGlyZGFfc3lzY3RsX3JlZ2lzdGVyKHZvaWQpCit7CisJaXJkYV90YWJsZV9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUoaXJkYV9yb290X3RhYmxlLCAwKTsKKwlpZiAoIWlyZGFfdGFibGVfaGVhZGVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9zeXNjdGxfdW5yZWdpc3RlciAodm9pZCkKKyAqCisgKiAgICBVbnJlZ2lzdGVyIG91ciBzeXNjdGwgaW50ZXJmYWNlCisgKgorICovCit2b2lkIF9fZXhpdCBpcmRhX3N5c2N0bF91bnJlZ2lzdGVyKHZvaWQpIAoreworCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGlyZGFfdGFibGVfaGVhZGVyKTsKK30KKworCisKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lydHRwLmMgYi9uZXQvaXJkYS9pcnR0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOTFjY2YKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcnR0cC5jCkBAIC0wLDAgKzEsMTkxMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBpcnR0cC5jCisgKiBWZXJzaW9uOiAgICAgICAxLjIKKyAqIERlc2NyaXB0aW9uOiAgIFRpbnkgVHJhbnNwb3J0IFByb3RvY29sIChUVFApIGltcGxlbWVudGF0aW9uCisgKiBTdGF0dXM6ICAgICAgICBTdGFibGUKKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFN1biBBdWcgMzEgMjA6MTQ6MzEgMTk5NworICogTW9kaWZpZWQgYXQ6ICAgV2VkIEphbiAgNSAxMTozMToyNyAyMDAwCisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+LCAKKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4KKyAqICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvcGFyYW1ldGVycy5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lydHRwLmg+CisKK3N0YXRpYyBzdHJ1Y3QgaXJ0dHBfY2IgKmlydHRwID0gTlVMTDsKKworc3RhdGljIHZvaWQgX19pcnR0cF9jbG9zZV90c2FwKHN0cnVjdCB0c2FwX2NiICpzZWxmKTsKKworc3RhdGljIGludCBpcnR0cF9kYXRhX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgCisJCQkJIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBpcnR0cF91ZGF0YV9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBpcnR0cF9kaXNjb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgIAorCQkJCQlMTV9SRUFTT04gcmVhc29uLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKK3N0YXRpYyB2b2lkIGlydHRwX2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCAKKwkJCQkgICAgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLCBfX3UzMiBtYXhfc2R1X3NpemUsCisJCQkJICAgICBfX3U4IGhlYWRlcl9zaXplLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIGlydHRwX2Nvbm5lY3RfY29uZmlybSh2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCAKKwkJCQkgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLCBfX3UzMiBtYXhfc2R1X3NpemUsIAorCQkJCSAgX191OCBoZWFkZXJfc2l6ZSwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBpcnR0cF9ydW5fdHhfcXVldWUoc3RydWN0IHRzYXBfY2IgKnNlbGYpOworc3RhdGljIHZvaWQgaXJ0dHBfcnVuX3J4X3F1ZXVlKHN0cnVjdCB0c2FwX2NiICpzZWxmKTsKKworc3RhdGljIHZvaWQgaXJ0dHBfZmx1c2hfcXVldWVzKHN0cnVjdCB0c2FwX2NiICpzZWxmKTsKK3N0YXRpYyB2b2lkIGlydHRwX2ZyYWdtZW50X3NrYihzdHJ1Y3QgdHNhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmlydHRwX3JlYXNzZW1ibGVfc2tiKHN0cnVjdCB0c2FwX2NiICpzZWxmKTsKK3N0YXRpYyB2b2lkIGlydHRwX3RvZG9fZXhwaXJlZCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIGludCBpcnR0cF9wYXJhbV9tYXhfc2R1X3NpemUodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIAorCQkJCSAgICBpbnQgZ2V0KTsKKworc3RhdGljIHZvaWQgaXJ0dHBfZmxvd19pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIExPQ0FMX0ZMT1cgZmxvdyk7CitzdGF0aWMgdm9pZCBpcnR0cF9zdGF0dXNfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwKKwkJCQkgICAgTElOS19TVEFUVVMgbGluaywgTE9DS19TVEFUVVMgbG9jayk7CisKKy8qIEluZm9ybWF0aW9uIGZvciBwYXJzaW5nIHBhcmFtZXRlcnMgaW4gSXJUVFAgKi8KK3N0YXRpYyBwaV9taW5vcl9pbmZvX3QgcGlfbWlub3JfY2FsbF90YWJsZVtdID0geworCXsgTlVMTCwgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDAgKi8KKwl7IGlydHRwX3BhcmFtX21heF9zZHVfc2l6ZSwgUFZfSU5URUdFUiB8IFBWX0JJR19FTkRJQU4gfSAvKiAweDAxICovCit9Oworc3RhdGljIHBpX21ham9yX2luZm9fdCBwaV9tYWpvcl9jYWxsX3RhYmxlW10gPSB7eyBwaV9taW5vcl9jYWxsX3RhYmxlLCAyIH19Oworc3RhdGljIHBpX3BhcmFtX2luZm9fdCBwYXJhbV9pbmZvID0geyBwaV9tYWpvcl9jYWxsX3RhYmxlLCAxLCAweDBmLCA0IH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogR0xPQkFMIFBST0NFRFVSRVMgKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRnVuY3Rpb24gaXJ0dHBfaW5pdCAodm9pZCkKKyAqCisgKiAgICBJbml0aWFsaXplIHRoZSBJclRUUCBsYXllci4gQ2FsbGVkIGJ5IG1vZHVsZSBpbml0aWFsaXphdGlvbiBjb2RlCisgKgorICovCitpbnQgX19pbml0IGlydHRwX2luaXQodm9pZCkKK3sKKwkvKiBJbml0aWFsaXplIHRoZSBpcnR0cCBzdHJ1Y3R1cmUuICovCisJaWYgKGlydHRwID09IE5VTEwpIHsKKwkJaXJ0dHAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXJ0dHBfY2IpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGlydHRwID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGlydHRwLCAwLCBzaXplb2Yoc3RydWN0IGlydHRwX2NiKSk7CisKKwlpcnR0cC0+bWFnaWMgPSBUVFBfTUFHSUM7CisKKwlpcnR0cC0+dHNhcHMgPSBoYXNoYmluX25ldyhIQl9MT0NLKTsKKwlpZiAoIWlydHRwLT50c2FwcykgeworCQlJUkRBX0VSUk9SKCIlczogY2FuJ3QgYWxsb2NhdGUgSXJUVFAgaGFzaGJpbiFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlydHRwX2NsZWFudXAgKHZvaWQpCisgKgorICogICAgQ2FsbGVkIGJ5IG1vZHVsZSBkZXN0cnVjdGlvbi9jbGVhbnVwIGNvZGUKKyAqCisgKi8KK3ZvaWQgX19leGl0IGlydHRwX2NsZWFudXAodm9pZCkgCit7CisJLyogQ2hlY2sgZm9yIG1haW4gc3RydWN0dXJlICovCisJSVJEQV9BU1NFUlQoaXJ0dHAgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoaXJ0dHAtPm1hZ2ljID09IFRUUF9NQUdJQywgcmV0dXJuOyk7CisKKwkvKgorCSAqICBEZWxldGUgaGFzaGJpbiBhbmQgY2xvc2UgYWxsIFRTQVAgaW5zdGFuY2VzIGluIGl0CisJICovCisJaGFzaGJpbl9kZWxldGUoaXJ0dHAtPnRzYXBzLCAoRlJFRV9GVU5DKSBfX2lydHRwX2Nsb3NlX3RzYXApOworCisJaXJ0dHAtPm1hZ2ljID0gMDsKKworCS8qIERlLWFsbG9jYXRlIG1haW4gc3RydWN0dXJlICovCisJa2ZyZWUoaXJ0dHApOworCisJaXJ0dHAgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNVQlJPVVRJTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEZ1bmN0aW9uIGlydHRwX3N0YXJ0X3RvZG9fdGltZXIgKHNlbGYsIHRpbWVvdXQpCisgKgorICogICAgU3RhcnQgdG9kbyB0aW1lci4KKyAqCisgKiBNYWRlIGl0IG1vcmUgZWZmaWVudCBhbmQgdW5zZW5zaXRpdmUgdG8gcmFjZSBjb25kaXRpb25zIC0gSmVhbiBJSQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXJ0dHBfc3RhcnRfdG9kb190aW1lcihzdHJ1Y3QgdHNhcF9jYiAqc2VsZiwgaW50IHRpbWVvdXQpCit7CisJLyogU2V0IG5ldyB2YWx1ZSBmb3IgdGltZXIgKi8KKwltb2RfdGltZXIoJnNlbGYtPnRvZG9fdGltZXIsIGppZmZpZXMgKyB0aW1lb3V0KTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlydHRwX3RvZG9fZXhwaXJlZCAoZGF0YSkKKyAqCisgKiAgICBUb2RvIHRpbWVyIGhhcyBleHBpcmVkIQorICoKKyAqIE9uZSBvZiB0aGUgcmVzdHJpY3Rpb24gb2YgdGhlIHRpbWVyIGlzIHRoYXQgaXQgaXMgcnVuIG9ubHkgb24gdGhlIHRpbWVyCisgKiBpbnRlcnJ1cHQgd2hpY2ggcnVuIGV2ZXJ5IDEwbXMuIFRoaXMgbWVhbiB0aGF0IGV2ZW4gaWYgeW91IHNldCB0aGUgdGltZXIKKyAqIHdpdGggYSBkZWxheSBvZiAwLCBpdCBtYXkgdGFrZSB1cCB0byAxMG1zIGJlZm9yZSBpdCdzIHJ1bi4KKyAqIFNvLCB0byBtaW5pbWlzZSBsYXRlbmN5IGFuZCBrZWVwIGNhY2hlIGZyZXNoLCB3ZSB0cnkgdG8gYXZvaWQgdXNpbmcKKyAqIGl0IGFzIG11Y2ggYXMgcG9zc2libGUuCisgKiBOb3RlIDogd2UgY2FuJ3QgdXNlIHRhc2tsZXRzLCBiZWNhdXNlIHRoZXkgY2FuJ3QgYmUgYXN5bmNocm9ub3VzbHkKKyAqIGtpbGxlZCAobmVlZCB1c2VyIGNvbnRleHQpLCBhbmQgd2UgY2FuJ3QgZ3VhcmFudGVlIHRoYXQgaGVyZS4uLgorICogSmVhbiBJSQorICovCitzdGF0aWMgdm9pZCBpcnR0cF90b2RvX2V4cGlyZWQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCB0c2FwX2NiICpzZWxmID0gKHN0cnVjdCB0c2FwX2NiICopIGRhdGE7CisKKwkvKiBDaGVjayB0aGF0IHdlIHN0aWxsIGV4aXN0ICovCisJaWYgKCFzZWxmIHx8IHNlbGYtPm1hZ2ljICE9IFRUUF9UU0FQX01BR0lDKQorCQlyZXR1cm47CisKKwlJUkRBX0RFQlVHKDQsICIlcyhpbnN0YW5jZT0lcClcbiIsIF9fRlVOQ1RJT05fXywgc2VsZik7CisKKwkvKiBUcnkgdG8gbWFrZSBzb21lIHByb2dyZXNzLCBlc3BlY2lhbGx5IG9uIFR4IHNpZGUgLSBKZWFuIElJICovCisJaXJ0dHBfcnVuX3J4X3F1ZXVlKHNlbGYpOworCWlydHRwX3J1bl90eF9xdWV1ZShzZWxmKTsKKworCS8qIENoZWNrIGlmIHRpbWUgZm9yIGRpc2Nvbm5lY3QgKi8KKwlpZiAodGVzdF9iaXQoMCwgJnNlbGYtPmRpc2Nvbm5lY3RfcGVuZCkpIHsKKwkJLyogQ2hlY2sgaWYgaXQncyBwb3NzaWJsZSB0byBkaXNjb25uZWN0IHlldCAqLworCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZzZWxmLT50eF9xdWV1ZSkpIHsKKwkJCS8qIE1ha2Ugc3VyZSBkaXNjb25uZWN0IGlzIG5vdCBwZW5kaW5nIGFueW1vcmUgKi8KKwkJCWNsZWFyX2JpdCgwLCAmc2VsZi0+ZGlzY29ubmVjdF9wZW5kKTsJLyogRkFMU0UgKi8KKworCQkJLyogTm90ZSA6IHNlbGYtPmRpc2Nvbm5lY3Rfc2tiIG1heSBiZSBOVUxMICovCisJCQlpcnR0cF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZiwgc2VsZi0+ZGlzY29ubmVjdF9za2IsCisJCQkJCQkgUF9OT1JNQUwpOworCQkJc2VsZi0+ZGlzY29ubmVjdF9za2IgPSBOVUxMOworCQl9IGVsc2UgeworCQkJLyogVHJ5IGFnYWluIGxhdGVyICovCisJCQlpcnR0cF9zdGFydF90b2RvX3RpbWVyKHNlbGYsIEhaLzEwKTsKKworCQkJLyogTm8gcmVhc29uIHRvIHRyeSBhbmQgY2xvc2Ugbm93ICovCisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBDaGVjayBpZiBpdCdzIGNsb3NpbmcgdGltZSAqLworCWlmIChzZWxmLT5jbG9zZV9wZW5kKQorCQkvKiBGaW5pc2ggY2xlYW51cCAqLworCQlpcnR0cF9jbG9zZV90c2FwKHNlbGYpOworfQorCisvKgorICogRnVuY3Rpb24gaXJ0dHBfZmx1c2hfcXVldWVzIChzZWxmKQorICoKKyAqICAgICBGbHVzaGVzIChyZW1vdmVzIGFsbCBmcmFtZXMpIGluIHRyYW5zaXR0LWJ1ZmZlciAodHhfbGlzdCkKKyAqLwordm9pZCBpcnR0cF9mbHVzaF9xdWV1ZXMoc3RydWN0IHRzYXBfY2IgKnNlbGYpCit7CisJc3RydWN0IHNrX2J1ZmYqIHNrYjsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm47KTsKKworCS8qIERlYWxsb2NhdGUgZnJhbWVzIHdhaXRpbmcgdG8gYmUgc2VudCAqLworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnNlbGYtPnR4X3F1ZXVlKSkgIT0gTlVMTCkKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCisJLyogRGVhbGxvY2F0ZSByZWNlaXZlZCBmcmFtZXMgKi8KKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzZWxmLT5yeF9xdWV1ZSkpICE9IE5VTEwpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCS8qIERlYWxsb2NhdGUgcmVjZWl2ZWQgZnJhZ21lbnRzICovCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2VsZi0+cnhfZnJhZ21lbnRzKSkgIT0gTlVMTCkKKwkJZGV2X2tmcmVlX3NrYihza2IpOworfQorCisvKgorICogRnVuY3Rpb24gaXJ0dHBfcmVhc3NlbWJsZSAoc2VsZikKKyAqCisgKiAgICBNYWtlcyBhIG5ldyAoY29udGludW91cykgc2tiIG9mIGFsbCB0aGUgZnJhZ21lbnRzIGluIHRoZSBmcmFnbWVudAorICogICAgcXVldWUKKyAqCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaXJ0dHBfcmVhc3NlbWJsZV9za2Ioc3RydWN0IHRzYXBfY2IgKnNlbGYpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKmZyYWc7CisJaW50IG4gPSAwOyAgLyogRnJhZ21lbnQgaW5kZXggKi8KKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuIE5VTEw7KTsKKworCUlSREFfREVCVUcoMiwgIiVzKCksIHNlbGYtPnJ4X3NkdV9zaXplPSVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCSAgIHNlbGYtPnJ4X3NkdV9zaXplKTsKKworCXNrYiA9IGRldl9hbGxvY19za2IoVFRQX0hFQURFUiArIHNlbGYtPnJ4X3NkdV9zaXplKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqIE5lZWQgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgVFRQIGhlYWRlciBpbiBjYXNlIHRoaXMgc2tiIG5lZWRzIHRvCisJICogYmUgcmVxdWV1ZWQgaW4gY2FzZSBkZWxpdmVyeSBmYWlsZXMKKwkgKi8KKwlza2JfcmVzZXJ2ZShza2IsIFRUUF9IRUFERVIpOworCXNrYl9wdXQoc2tiLCBzZWxmLT5yeF9zZHVfc2l6ZSk7CisKKwkvKgorCSAqICBDb3B5IGFsbCBmcmFnbWVudHMgdG8gYSBuZXcgYnVmZmVyCisJICovCisJd2hpbGUgKChmcmFnID0gc2tiX2RlcXVldWUoJnNlbGYtPnJ4X2ZyYWdtZW50cykpICE9IE5VTEwpIHsKKwkJbWVtY3B5KHNrYi0+ZGF0YStuLCBmcmFnLT5kYXRhLCBmcmFnLT5sZW4pOworCQluICs9IGZyYWctPmxlbjsKKworCQlkZXZfa2ZyZWVfc2tiKGZyYWcpOworCX0KKworCUlSREFfREVCVUcoMiwKKwkJICAgIiVzKCksIGZyYW1lIGxlbj0lZCwgcnhfc2R1X3NpemU9JWQsIHJ4X21heF9zZHVfc2l6ZT0lZFxuIiwKKwkJICAgX19GVU5DVElPTl9fLCBuLCBzZWxmLT5yeF9zZHVfc2l6ZSwgc2VsZi0+cnhfbWF4X3NkdV9zaXplKTsKKwkvKiBOb3RlIDogaXJ0dHBfcnVuX3J4X3F1ZXVlKCkgY2FsY3VsYXRlIHNlbGYtPnJ4X3NkdV9zaXplCisJICogYnkgc3VtbWluZyB0aGUgc2l6ZSBvZiBhbGwgZnJhZ21lbnRzLCBzbyB3ZSBzaG91bGQgYWx3YXlzCisJICogaGF2ZSBuID09IHNlbGYtPnJ4X3NkdV9zaXplLCBleGNlcHQgaW4gY2FzZXMgd2hlcmUgd2UKKwkgKiBkcm9wZWQgdGhlIGxhc3QgZnJhZ21lbnQgKHdoZW4gc2VsZi0+cnhfc2R1X3NpemUgZXhjZWVkCisJICogc2VsZi0+cnhfbWF4X3NkdV9zaXplKSwgd2hlcmUgbiA8IHNlbGYtPnJ4X3NkdV9zaXplLgorCSAqIEplYW4gSUkgKi8KKwlJUkRBX0FTU0VSVChuIDw9IHNlbGYtPnJ4X3NkdV9zaXplLCBuID0gc2VsZi0+cnhfc2R1X3NpemU7KTsKKworCS8qIFNldCB0aGUgbmV3IGxlbmd0aCAqLworCXNrYl90cmltKHNrYiwgbik7CisKKwlzZWxmLT5yeF9zZHVfc2l6ZSA9IDA7CisKKwlyZXR1cm4gc2tiOworfQorCisvKgorICogRnVuY3Rpb24gaXJ0dHBfZnJhZ21lbnRfc2tiIChza2IpCisgKgorICogICAgRnJhZ21lbnRzIGEgZnJhbWUgYW5kIHF1ZXVlcyBhbGwgdGhlIGZyYWdtZW50cyBmb3IgdHJhbnNtaXNzaW9uCisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXJ0dHBfZnJhZ21lbnRfc2tiKHN0cnVjdCB0c2FwX2NiICpzZWxmLAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKmZyYWc7CisJX191OCAqZnJhbWU7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOworCisJLyoKKwkgKiAgU3BsaXQgZnJhbWUgaW50byBhIG51bWJlciBvZiBzZWdtZW50cworCSAqLworCXdoaWxlIChza2ItPmxlbiA+IHNlbGYtPm1heF9zZWdfc2l6ZSkgeworCQlJUkRBX0RFQlVHKDIsICIlcygpLCBmcmFnbWVudGluZyAuLi5cbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJLyogTWFrZSBuZXcgc2VnbWVudCAqLworCQlmcmFnID0gZGV2X2FsbG9jX3NrYihzZWxmLT5tYXhfc2VnX3NpemUrc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKKwkJaWYgKCFmcmFnKQorCQkJcmV0dXJuOworCisJCXNrYl9yZXNlcnZlKGZyYWcsIHNlbGYtPm1heF9oZWFkZXJfc2l6ZSk7CisKKwkJLyogQ29weSBkYXRhIGZyb20gdGhlIG9yaWdpbmFsIHNrYiBpbnRvIHRoaXMgZnJhZ21lbnQuICovCisJCW1lbWNweShza2JfcHV0KGZyYWcsIHNlbGYtPm1heF9zZWdfc2l6ZSksIHNrYi0+ZGF0YSwKKwkJICAgICAgIHNlbGYtPm1heF9zZWdfc2l6ZSk7CisKKwkJLyogSW5zZXJ0IFRUUCBoZWFkZXIsIHdpdGggdGhlIG1vcmUgYml0IHNldCAqLworCQlmcmFtZSA9IHNrYl9wdXNoKGZyYWcsIFRUUF9IRUFERVIpOworCQlmcmFtZVswXSA9IFRUUF9NT1JFOworCisJCS8qIEhpZGUgdGhlIGNvcGllZCBkYXRhIGZyb20gdGhlIG9yaWdpbmFsIHNrYiAqLworCQlza2JfcHVsbChza2IsIHNlbGYtPm1heF9zZWdfc2l6ZSk7CisKKwkJLyogUXVldWUgZnJhZ21lbnQgKi8KKwkJc2tiX3F1ZXVlX3RhaWwoJnNlbGYtPnR4X3F1ZXVlLCBmcmFnKTsKKwl9CisJLyogUXVldWUgd2hhdCBpcyBsZWZ0IG9mIHRoZSBvcmlnaW5hbCBza2IgKi8KKwlJUkRBX0RFQlVHKDIsICIlcygpLCBxdWV1aW5nIGxhc3Qgc2VnbWVudFxuIiwgX19GVU5DVElPTl9fKTsKKworCWZyYW1lID0gc2tiX3B1c2goc2tiLCBUVFBfSEVBREVSKTsKKwlmcmFtZVswXSA9IDB4MDA7IC8qIENsZWFyIG1vcmUgYml0ICovCisKKwkvKiBRdWV1ZSBmcmFnbWVudCAqLworCXNrYl9xdWV1ZV90YWlsKCZzZWxmLT50eF9xdWV1ZSwgc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlydHRwX3BhcmFtX21heF9zZHVfc2l6ZSAoc2VsZiwgcGFyYW0pCisgKgorICogICAgSGFuZGxlIHRoZSBNYXhTZHVTaXplIHBhcmFtZXRlciBpbiB0aGUgY29ubmVjdCBmcmFtZXMsIHRoaXMgZnVuY3Rpb24KKyAqICAgIHdpbGwgYmUgY2FsbGVkIGJvdGggd2hlbiB0aGlzIHBhcmFtZXRlciBuZWVkcyB0byBiZSBpbnNlcnRlZCBpbnRvLCBhbmQKKyAqICAgIGV4dHJhY3RlZCBmcm9tIHRoZSBjb25uZWN0IGZyYW1lcworICovCitzdGF0aWMgaW50IGlydHRwX3BhcmFtX21heF9zZHVfc2l6ZSh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJhbSwKKwkJCQkgICAgaW50IGdldCkKK3sKKwlzdHJ1Y3QgdHNhcF9jYiAqc2VsZjsKKworCXNlbGYgPSAoc3RydWN0IHRzYXBfY2IgKikgaW5zdGFuY2U7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm4gLTE7KTsKKworCWlmIChnZXQpCisJCXBhcmFtLT5wdi5pID0gc2VsZi0+dHhfbWF4X3NkdV9zaXplOworCWVsc2UKKwkJc2VsZi0+dHhfbWF4X3NkdV9zaXplID0gcGFyYW0tPnB2Lmk7CisKKwlJUkRBX0RFQlVHKDEsICIlcygpLCBNYXhTZHVTaXplPSVkXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT5wdi5pKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqIENMSUVOVCBDQUxMUyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogTE1QIENBTExCQUNLUyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEV2ZXJ5dGhpbmcgaXMgaGFwcGlseSBtaXhlZCB1cC4gV2FpdGluZyBmb3IgbmV4dCBjbGVhbiB1cCAtIEplYW4gSUkgKi8KKworLyoKKyAqIEZ1bmN0aW9uIGlydHRwX29wZW5fdHNhcCAoc3RzYXAsIG5vdGlmeSkKKyAqCisgKiAgICBDcmVhdGUgVFNBUCBjb25uZWN0aW9uIGVuZHBvaW50LAorICovCitzdHJ1Y3QgdHNhcF9jYiAqaXJ0dHBfb3Blbl90c2FwKF9fdTggc3RzYXBfc2VsLCBpbnQgY3JlZGl0LCBub3RpZnlfdCAqbm90aWZ5KQoreworCXN0cnVjdCB0c2FwX2NiICpzZWxmOworCXN0cnVjdCBsc2FwX2NiICpsc2FwOworCW5vdGlmeV90IHR0cF9ub3RpZnk7CisKKwlJUkRBX0FTU0VSVChpcnR0cCAhPSBOVUxMLCByZXR1cm4gTlVMTDspOworCUlSREFfQVNTRVJUKGlydHRwLT5tYWdpYyA9PSBUVFBfTUFHSUMsIHJldHVybiBOVUxMOyk7CisKKwkvKiBUaGUgSXJMTVAgc3BlYyAoSXJMTVAgMS4xIHAxMCkgc2F5cyB0aGF0IHdlIGhhdmUgdGhlIHJpZ2h0IHRvCisJICogdXNlIG9ubHkgMHgwMS0weDZGLiBPZiBjb3Vyc2UsIHdlIGNhbiB1c2UgTFNBUF9BTlkgYXMgd2VsbC4KKwkgKiBKZWFuSUkgKi8KKwlpZigoc3RzYXBfc2VsICE9IExTQVBfQU5ZKSAmJgorCSAgICgoc3RzYXBfc2VsIDwgMHgwMSkgfHwgKHN0c2FwX3NlbCA+PSAweDcwKSkpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgaW52YWxpZCB0c2FwIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2VsZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0c2FwX2NiKSwgR0ZQX0FUT01JQyk7CisJaWYgKHNlbGYgPT0gTlVMTCkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCB1bmFibGUgdG8ga21hbGxvYyFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQoc2VsZiwgMCwgc2l6ZW9mKHN0cnVjdCB0c2FwX2NiKSk7CisJc3Bpbl9sb2NrX2luaXQoJnNlbGYtPmxvY2spOworCisJLyogSW5pdGlhbGlzZSB0b2RvIHRpbWVyICovCisJaW5pdF90aW1lcigmc2VsZi0+dG9kb190aW1lcik7CisJc2VsZi0+dG9kb190aW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKSBzZWxmOworCXNlbGYtPnRvZG9fdGltZXIuZnVuY3Rpb24gPSAmaXJ0dHBfdG9kb19leHBpcmVkOworCisJLyogSW5pdGlhbGl6ZSBjYWxsYmFja3MgZm9yIElyTE1QIHRvIHVzZSAqLworCWlyZGFfbm90aWZ5X2luaXQoJnR0cF9ub3RpZnkpOworCXR0cF9ub3RpZnkuY29ubmVjdF9jb25maXJtID0gaXJ0dHBfY29ubmVjdF9jb25maXJtOworCXR0cF9ub3RpZnkuY29ubmVjdF9pbmRpY2F0aW9uID0gaXJ0dHBfY29ubmVjdF9pbmRpY2F0aW9uOworCXR0cF9ub3RpZnkuZGlzY29ubmVjdF9pbmRpY2F0aW9uID0gaXJ0dHBfZGlzY29ubmVjdF9pbmRpY2F0aW9uOworCXR0cF9ub3RpZnkuZGF0YV9pbmRpY2F0aW9uID0gaXJ0dHBfZGF0YV9pbmRpY2F0aW9uOworCXR0cF9ub3RpZnkudWRhdGFfaW5kaWNhdGlvbiA9IGlydHRwX3VkYXRhX2luZGljYXRpb247CisJdHRwX25vdGlmeS5mbG93X2luZGljYXRpb24gPSBpcnR0cF9mbG93X2luZGljYXRpb247CisJaWYobm90aWZ5LT5zdGF0dXNfaW5kaWNhdGlvbiAhPSBOVUxMKQorCQl0dHBfbm90aWZ5LnN0YXR1c19pbmRpY2F0aW9uID0gaXJ0dHBfc3RhdHVzX2luZGljYXRpb247CisJdHRwX25vdGlmeS5pbnN0YW5jZSA9IHNlbGY7CisJc3RybmNweSh0dHBfbm90aWZ5Lm5hbWUsIG5vdGlmeS0+bmFtZSwgTk9USUZZX01BWF9OQU1FKTsKKworCXNlbGYtPm1hZ2ljID0gVFRQX1RTQVBfTUFHSUM7CisJc2VsZi0+Y29ubmVjdGVkID0gRkFMU0U7CisKKwlza2JfcXVldWVfaGVhZF9pbml0KCZzZWxmLT5yeF9xdWV1ZSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2VsZi0+dHhfcXVldWUpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnNlbGYtPnJ4X2ZyYWdtZW50cyk7CisJLyoKKwkgKiAgQ3JlYXRlIExTQVAgYXQgSXJMTVAgbGF5ZXIKKwkgKi8KKwlsc2FwID0gaXJsbXBfb3Blbl9sc2FwKHN0c2FwX3NlbCwgJnR0cF9ub3RpZnksIDApOworCWlmIChsc2FwID09IE5VTEwpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogdW5hYmxlIHRvIGFsbG9jYXRlIExTQVAhIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyoKKwkgKiAgSWYgdXNlciBzcGVjaWZpZWQgTFNBUF9BTlkgYXMgc291cmNlIFRTQVAgc2VsZWN0b3IsIHRoZW4gSXJMTVAKKwkgKiAgd2lsbCByZXBsYWNlIGl0IHdpdGggd2hhdGV2ZXIgc291cmNlIHNlbGVjdG9yIHdoaWNoIGlzIGZyZWUsIHNvCisJICogIHRoZSBzdHNhcF9zZWwgd2UgaGF2ZSBtaWdodCBub3QgYmUgdmFsaWQgYW55bW9yZQorCSAqLworCXNlbGYtPnN0c2FwX3NlbCA9IGxzYXAtPnNsc2FwX3NlbDsKKwlJUkRBX0RFQlVHKDQsICIlcygpLCBzdHNhcF9zZWw9JTAyeFxuIiwgX19GVU5DVElPTl9fLCBzZWxmLT5zdHNhcF9zZWwpOworCisJc2VsZi0+bm90aWZ5ID0gKm5vdGlmeTsKKwlzZWxmLT5sc2FwID0gbHNhcDsKKworCWhhc2hiaW5faW5zZXJ0KGlydHRwLT50c2FwcywgKGlyZGFfcXVldWVfdCAqKSBzZWxmLCAobG9uZykgc2VsZiwgTlVMTCk7CisKKwlpZiAoY3JlZGl0ID4gVFRQX1JYX01BWF9DUkVESVQpCisJCXNlbGYtPmluaXRpYWxfY3JlZGl0ID0gVFRQX1JYX01BWF9DUkVESVQ7CisJZWxzZQorCQlzZWxmLT5pbml0aWFsX2NyZWRpdCA9IGNyZWRpdDsKKworCXJldHVybiBzZWxmOworfQorRVhQT1JUX1NZTUJPTChpcnR0cF9vcGVuX3RzYXApOworCisvKgorICogRnVuY3Rpb24gaXJ0dHBfY2xvc2UgKGhhbmRsZSkKKyAqCisgKiAgICBSZW1vdmUgYW4gaW5zdGFuY2Ugb2YgYSBUU0FQLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGRlYWwgd2l0aCB0aGUKKyAqICAgIGRlYWxsb2NhdGlvbiBvZiB0aGUgVFNBUCwgYW5kIHJlc2V0dGluZyBvZiB0aGUgVFNBUHMgdmFsdWVzOworICoKKyAqLworc3RhdGljIHZvaWQgX19pcnR0cF9jbG9zZV90c2FwKHN0cnVjdCB0c2FwX2NiICpzZWxmKQoreworCS8qIEZpcnN0IG1ha2Ugc3VyZSB3ZSdyZSBjb25uZWN0ZWQuICovCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuOyk7CisKKwlpcnR0cF9mbHVzaF9xdWV1ZXMoc2VsZik7CisKKwlkZWxfdGltZXIoJnNlbGYtPnRvZG9fdGltZXIpOworCisJLyogVGhpcyBvbmUgd29uJ3QgYmUgY2xlYW5lZCB1cCBpZiB3ZSBhcmUgZGlzY29ubmVjdF9wZW5kICsgY2xvc2VfcGVuZAorCSAqIGFuZCB3ZSByZWNlaXZlIGEgZGlzY29ubmVjdF9pbmRpY2F0aW9uICovCisJaWYgKHNlbGYtPmRpc2Nvbm5lY3Rfc2tiKQorCQlkZXZfa2ZyZWVfc2tiKHNlbGYtPmRpc2Nvbm5lY3Rfc2tiKTsKKworCXNlbGYtPmNvbm5lY3RlZCA9IEZBTFNFOworCXNlbGYtPm1hZ2ljID0gflRUUF9UU0FQX01BR0lDOworCisJa2ZyZWUoc2VsZik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnR0cF9jbG9zZSAoc2VsZikKKyAqCisgKiAgICBSZW1vdmUgVFNBUCBmcm9tIGxpc3Qgb2YgYWxsIFRTQVBzIGFuZCB0aGVuIGRlYWxsb2NhdGUgYWxsIHJlc291cmNlcworICogICAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVFNBUAorICoKKyAqIE5vdGUgOiBiZWNhdXNlIHdlICpmcmVlKiB0aGUgdHNhcCBzdHJ1Y3R1cmUsIGl0IGlzIHRoZSByZXNwb25zaWJpbGl0eQorICogb2YgdGhlIGNhbGxlciB0byBtYWtlIHN1cmUgd2UgYXJlIGNhbGxlZCBvbmx5IG9uY2UgYW5kIHRvIGRlYWwgd2l0aAorICogcG9zc2libGUgcmFjZSBjb25kaXRpb25zLiAtIEplYW4gSUkKKyAqLworaW50IGlydHRwX2Nsb3NlX3RzYXAoc3RydWN0IHRzYXBfY2IgKnNlbGYpCit7CisJc3RydWN0IHRzYXBfY2IgKnRzYXA7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwkvKiBNYWtlIHN1cmUgdHNhcCBoYXMgYmVlbiBkaXNjb25uZWN0ZWQgKi8KKwlpZiAoc2VsZi0+Y29ubmVjdGVkKSB7CisJCS8qIENoZWNrIGlmIGRpc2Nvbm5lY3QgaXMgbm90IHBlbmRpbmcgKi8KKwkJaWYgKCF0ZXN0X2JpdCgwLCAmc2VsZi0+ZGlzY29ubmVjdF9wZW5kKSkgeworCQkJSVJEQV9XQVJOSU5HKCIlczogVFNBUCBzdGlsbCBjb25uZWN0ZWQhXG4iLAorCQkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJCWlydHRwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmLCBOVUxMLCBQX05PUk1BTCk7CisJCX0KKwkJc2VsZi0+Y2xvc2VfcGVuZCA9IFRSVUU7CisJCWlydHRwX3N0YXJ0X3RvZG9fdGltZXIoc2VsZiwgSFovMTApOworCisJCXJldHVybiAwOyAvKiBXaWxsIGJlIGJhY2shICovCisJfQorCisJdHNhcCA9IGhhc2hiaW5fcmVtb3ZlKGlydHRwLT50c2FwcywgKGxvbmcpIHNlbGYsIE5VTEwpOworCisJSVJEQV9BU1NFUlQodHNhcCA9PSBzZWxmLCByZXR1cm4gLTE7KTsKKworCS8qIENsb3NlIGNvcnJlc3BvbmRpbmcgTFNBUCAqLworCWlmIChzZWxmLT5sc2FwKSB7CisJCWlybG1wX2Nsb3NlX2xzYXAoc2VsZi0+bHNhcCk7CisJCXNlbGYtPmxzYXAgPSBOVUxMOworCX0KKworCV9faXJ0dHBfY2xvc2VfdHNhcChzZWxmKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpcnR0cF9jbG9zZV90c2FwKTsKKworLyoKKyAqIEZ1bmN0aW9uIGlydHRwX3VkYXRhX3JlcXVlc3QgKHNlbGYsIHNrYikKKyAqCisgKiAgICBTZW5kIHVucmVsaWFibGUgZGF0YSBvbiB0aGlzIFRTQVAKKyAqCisgKi8KK2ludCBpcnR0cF91ZGF0YV9yZXF1ZXN0KHN0cnVjdCB0c2FwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBDaGVjayB0aGF0IG5vdGhpbmcgYmFkIGhhcHBlbnMgKi8KKwlpZiAoKHNrYi0+bGVuID09IDApIHx8ICghc2VsZi0+Y29ubmVjdGVkKSkgeworCQlJUkRBX0RFQlVHKDEsICIlcygpLCBObyBkYXRhLCBvciBub3QgY29ubmVjdGVkXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKHNrYi0+bGVuID4gc2VsZi0+bWF4X3NlZ19zaXplKSB7CisJCUlSREFfREVCVUcoMSwgIiVzKCksIFVEYXRhIGlzIHRvIGxhcmdlIGZvciBJckxBUCFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlnb3RvIGVycjsKKwl9CisKKwlpcmxtcF91ZGF0YV9yZXF1ZXN0KHNlbGYtPmxzYXAsIHNrYik7CisJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOworCisJcmV0dXJuIDA7CisKK2VycjoKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIC0xOworfQorRVhQT1JUX1NZTUJPTChpcnR0cF91ZGF0YV9yZXF1ZXN0KTsKKworCisvKgorICogRnVuY3Rpb24gaXJ0dHBfZGF0YV9yZXF1ZXN0IChoYW5kbGUsIHNrYikKKyAqCisgKiAgICBRdWV1ZSBmcmFtZSBmb3IgdHJhbnNtaXNzaW9uLiBJZiBTQVIgaXMgZW5hYmxlZCwgZnJhZ2VtZW50IHRoZSBmcmFtZQorICogICAgYW5kIHF1ZXVlIHRoZSBmcmFnbWVudHMgZm9yIHRyYW5zbWlzc2lvbgorICovCitpbnQgaXJ0dHBfZGF0YV9yZXF1ZXN0KHN0cnVjdCB0c2FwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCV9fdTggKmZyYW1lOworCWludCByZXQ7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpIDogcXVldWUgbGVuID0gJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhfcXVldWUpKTsKKworCS8qIENoZWNrIHRoYXQgbm90aGluZyBiYWQgaGFwcGVucyAqLworCWlmICgoc2tiLT5sZW4gPT0gMCkgfHwgKCFzZWxmLT5jb25uZWN0ZWQpKSB7CisJCUlSREFfV0FSTklORygiJXM6IE5vIGRhdGEsIG9yIG5vdCBjb25uZWN0ZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldCA9IC1FTk9UQ09OTjsKKwkJZ290byBlcnI7CisJfQorCisJLyoKKwkgKiAgQ2hlY2sgaWYgU0FSIGlzIGRpc2FibGVkLCBhbmQgdGhlIGZyYW1lIGlzIGxhcmdlciB0aGFuIHdoYXQgZml0cworCSAqICBpbnNpZGUgYW4gSXJMQVAgZnJhbWUKKwkgKi8KKwlpZiAoKHNlbGYtPnR4X21heF9zZHVfc2l6ZSA9PSAwKSAmJiAoc2tiLT5sZW4gPiBzZWxmLT5tYXhfc2VnX3NpemUpKSB7CisJCUlSREFfRVJST1IoIiVzOiBTQVIgZGlzYWJsZWQsIGFuZCBkYXRhIGlzIHRvIGxhcmdlIGZvciBJckxBUCFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlyZXQgPSAtRU1TR1NJWkU7CisJCWdvdG8gZXJyOworCX0KKworCS8qCisJICogIENoZWNrIGlmIFNBUiBpcyBlbmFibGVkLCBhbmQgdGhlIGZyYW1lIGlzIGxhcmdlciB0aGFuIHRoZQorCSAqICBUeE1heFNkdVNpemUKKwkgKi8KKwlpZiAoKHNlbGYtPnR4X21heF9zZHVfc2l6ZSAhPSAwKSAmJgorCSAgICAoc2VsZi0+dHhfbWF4X3NkdV9zaXplICE9IFRUUF9TQVJfVU5CT1VORCkgJiYKKwkgICAgKHNrYi0+bGVuID4gc2VsZi0+dHhfbWF4X3NkdV9zaXplKSkKKwl7CisJCUlSREFfRVJST1IoIiVzOiBTQVIgZW5hYmxlZCwgYnV0IGRhdGEgaXMgbGFyZ2VyIHRoYW4gVHhNYXhTZHVTaXplIVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCXJldCA9IC1FTVNHU0laRTsKKwkJZ290byBlcnI7CisJfQorCS8qCisJICogIENoZWNrIGlmIHRyYW5zbWl0IHF1ZXVlIGlzIGZ1bGwKKwkgKi8KKwlpZiAoc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhfcXVldWUpID49IFRUUF9UWF9NQVhfUVVFVUUpIHsKKwkJLyoKKwkJICogIEdpdmUgaXQgYSBjaGFuY2UgdG8gZW1wdHkgaXRzZWxmCisJCSAqLworCQlpcnR0cF9ydW5fdHhfcXVldWUoc2VsZik7CisKKwkJLyogRHJvcCBwYWNrZXQuIFRoaXMgZXJyb3IgY29kZSBzaG91bGQgdHJpZ2dlciB0aGUgY2FsbGVyCisJCSAqIHRvIHJlc2VuZCB0aGUgZGF0YSBpbiB0aGUgY2xpZW50IGNvZGUgLSBKZWFuIElJICovCisJCXJldCA9IC1FTk9CVUZTOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBRdWV1ZSBmcmFtZSwgb3IgcXVldWUgZnJhbWUgc2VnbWVudHMgKi8KKwlpZiAoKHNlbGYtPnR4X21heF9zZHVfc2l6ZSA9PSAwKSB8fCAoc2tiLT5sZW4gPCBzZWxmLT5tYXhfc2VnX3NpemUpKSB7CisJCS8qIFF1ZXVlIGZyYW1lICovCisJCUlSREFfQVNTRVJUKHNrYl9oZWFkcm9vbShza2IpID49IFRUUF9IRUFERVIsIHJldHVybiAtMTspOworCQlmcmFtZSA9IHNrYl9wdXNoKHNrYiwgVFRQX0hFQURFUik7CisJCWZyYW1lWzBdID0gMHgwMDsgLyogQ2xlYXIgbW9yZSBiaXQgKi8KKworCQlza2JfcXVldWVfdGFpbCgmc2VsZi0+dHhfcXVldWUsIHNrYik7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogIEZyYWdtZW50IHRoZSBmcmFtZSwgdGhpcyBmdW5jdGlvbiB3aWxsIGFsc28gcXVldWUgdGhlCisJCSAqICBmcmFnbWVudHMsIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIGZhY3QgdGhlIHRyYW5zbWl0CisJCSAqICBxdWV1ZSBtYXkgYmUgb3ZlcmZpbGxlZCBieSBhbGwgdGhlIHNlZ21lbnRzIGZvciBhIGxpdHRsZQorCQkgKiAgd2hpbGUKKwkJICovCisJCWlydHRwX2ZyYWdtZW50X3NrYihzZWxmLCBza2IpOworCX0KKworCS8qIENoZWNrIGlmIHdlIGNhbiBhY2NlcHQgbW9yZSBkYXRhIGZyb20gY2xpZW50ICovCisJaWYgKCghc2VsZi0+dHhfc2R1X2J1c3kpICYmCisJICAgIChza2JfcXVldWVfbGVuKCZzZWxmLT50eF9xdWV1ZSkgPiBUVFBfVFhfSElHSF9USFJFU0hPTEQpKSB7CisJCS8qIFR4IHF1ZXVlIGZpbGxpbmcgdXAsIHNvIHN0b3AgY2xpZW50LiAqLworCQlpZiAoc2VsZi0+bm90aWZ5LmZsb3dfaW5kaWNhdGlvbikgeworCQkJc2VsZi0+bm90aWZ5LmZsb3dfaW5kaWNhdGlvbihzZWxmLT5ub3RpZnkuaW5zdGFuY2UsCisJCQkJCQkgICAgIHNlbGYsIEZMT1dfU1RPUCk7CisJCX0KKwkJLyogc2VsZi0+dHhfc2R1X2J1c3kgaXMgdGhlIHN0YXRlIG9mIHRoZSBjbGllbnQuCisJCSAqIFVwZGF0ZSBzdGF0ZSBhZnRlciBub3RpZnlpbmcgY2xpZW50IHRvIGF2b2lkCisJCSAqIHJhY2UgY29uZGl0aW9uIHdpdGggaXJ0dHBfZmxvd19pbmRpY2F0aW9uKCkuCisJCSAqIElmIHRoZSBxdWV1ZSBlbXB0eSBpdHNlbGYgYWZ0ZXIgb3VyIHRlc3QgYnV0IGJlZm9yZQorCQkgKiB3ZSBzZXQgdGhlIGZsYWcsIHdlIHdpbGwgZml4IG91cnNlbHZlcyBiZWxvdyBpbgorCQkgKiBpcnR0cF9ydW5fdHhfcXVldWUoKS4KKwkJICogSmVhbiBJSSAqLworCQlzZWxmLT50eF9zZHVfYnVzeSA9IFRSVUU7CisJfQorCisJLyogVHJ5IHRvIG1ha2Ugc29tZSBwcm9ncmVzcyAqLworCWlydHRwX3J1bl90eF9xdWV1ZShzZWxmKTsKKworCXJldHVybiAwOworCitlcnI6CisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGlydHRwX2RhdGFfcmVxdWVzdCk7CisKKy8qCisgKiBGdW5jdGlvbiBpcnR0cF9ydW5fdHhfcXVldWUgKHNlbGYpCisgKgorICogICAgVHJhbnNtaXQgcGFja2V0cyBxdWV1ZWQgZm9yIHRyYW5zbWlzc2lvbiAoaWYgcG9zc2libGUpCisgKgorICovCitzdGF0aWMgdm9pZCBpcnR0cF9ydW5fdHhfcXVldWUoc3RydWN0IHRzYXBfY2IgKnNlbGYpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBuOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSA6IHNlbmRfY3JlZGl0ID0gJWQsIHF1ZXVlX2xlbiA9ICVkXG4iLAorCQkgICBfX0ZVTkNUSU9OX18sCisJCSAgIHNlbGYtPnNlbmRfY3JlZGl0LCBza2JfcXVldWVfbGVuKCZzZWxmLT50eF9xdWV1ZSkpOworCisJLyogR2V0IGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIHR4IHF1ZXVlLCBvdGhlcndpc2UgZG9uJ3QgdG91Y2ggaXQgKi8KKwlpZiAoaXJkYV9sb2NrKCZzZWxmLT50eF9xdWV1ZV9sb2NrKSA9PSBGQUxTRSkKKwkJcmV0dXJuOworCisJLyogVHJ5IHRvIHNlbmQgb3V0IGZyYW1lcyBhcyBsb25nIGFzIHdlIGhhdmUgY3JlZGl0cworCSAqIGFuZCBhcyBsb25nIGFzIExBUCBpcyBub3QgZnVsbC4gSWYgTEFQIGlzIGZ1bGwsIGl0IHdpbGwKKwkgKiBwb2xsIHVzIHRocm91Z2ggaXJ0dHBfZmxvd19pbmRpY2F0aW9uKCkgLSBKZWFuIElJICovCisJd2hpbGUgKChzZWxmLT5zZW5kX2NyZWRpdCA+IDApICYmCisJICAgICAgICghaXJsbXBfbGFwX3R4X3F1ZXVlX2Z1bGwoc2VsZi0+bHNhcCkpICYmCisJICAgICAgIChza2IgPSBza2JfZGVxdWV1ZSgmc2VsZi0+dHhfcXVldWUpKSkKKwl7CisJCS8qCisJCSAqICBTaW5jZSB3ZSBjYW4gdHJhbnNtaXQgYW5kIHJlY2VpdmUgZnJhbWVzIGNvbmN1cnJlbnRseSwKKwkJICogIHRoZSBjb2RlIGJlbG93IGlzIGEgY3JpdGljYWwgcmVnaW9uIGFuZCB3ZSBtdXN0IGFzc3VyZSB0aGF0CisJCSAqICBub2JvZHkgbWVzc2VzIHdpdGggdGhlIGNyZWRpdHMgd2hpbGUgd2UgdXBkYXRlIHRoZW0uCisJCSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJCW4gPSBzZWxmLT5hdmFpbF9jcmVkaXQ7CisJCXNlbGYtPmF2YWlsX2NyZWRpdCA9IDA7CisKKwkJLyogT25seSByb29tIGZvciAxMjcgY3JlZGl0cyBpbiBmcmFtZSAqLworCQlpZiAobiA+IDEyNykgeworCQkJc2VsZi0+YXZhaWxfY3JlZGl0ID0gbi0xMjc7CisJCQluID0gMTI3OworCQl9CisJCXNlbGYtPnJlbW90ZV9jcmVkaXQgKz0gbjsKKwkJc2VsZi0+c2VuZF9jcmVkaXQtLTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisKKwkJLyoKKwkJICogIE1vcmUgYml0IG11c3QgYmUgc2V0IGJ5IHRoZSBkYXRhX3JlcXVlc3QoKSBvciBmcmFnbWVudCgpCisJCSAqICBmdW5jdGlvbnMKKwkJICovCisJCXNrYi0+ZGF0YVswXSB8PSAobiAmIDB4N2YpOworCisJCS8qIERldGFjaCBmcm9tIHNvY2tldC4KKwkJICogVGhlIGN1cnJlbnQgc2tiIGhhcyBhIHJlZmVyZW5jZSB0byB0aGUgc29ja2V0IHRoYXQgc2VudAorCQkgKiBpdCAoc2tiLT5zaykuIFdoZW4gd2UgcGFzcyBpdCB0byBJckxNUCwgdGhlIHNrYiB3aWxsIGJlCisJCSAqIHN0b3JlZCBpbiBpbiBJckxBUCAoc2VsZi0+d3hfbGlzdCkuIFdoZW4gd2UgYXJlIHdpdGhpbgorCQkgKiBJckxBUCwgd2UgbG9zZSB0aGUgbm90aW9uIG9mIHNvY2tldCwgc28gd2Ugc2hvdWxkIG5vdAorCQkgKiBoYXZlIGEgcmVmZXJlbmNlIHRvIGEgc29ja2V0LiBTbywgd2UgZHJvcCBpdCBoZXJlLgorCQkgKgorCQkgKiBXaHkgZG9lcyBpdCBtYXR0ZXIgPworCQkgKiBXaGVuIHRoZSBza2IgaXMgZnJlZWQgKGtmcmVlX3NrYiksIGlmIGl0IGlzIGFzc29jaWF0ZWQKKwkJICogd2l0aCBhIHNvY2tldCwgaXQgcmVsZWFzZSBidWZmZXIgc3BhY2Ugb24gdGhlIHNvY2tldAorCQkgKiAodGhyb3VnaCBzb2NrX3dmcmVlKCkgYW5kIHNvY2tfZGVmX3dyaXRlX3NwYWNlKCkpLgorCQkgKiBJZiB0aGUgc29ja2V0IG5vIGxvbmdlciBleGlzdCwgd2UgbWF5IGNyYXNoLiBIYXJkLgorCQkgKiBXaGVuIHdlIGNsb3NlIGEgc29ja2V0LCB3ZSBtYWtlIHN1cmUgdGhhdCBhc3NvY2lhdGVkIHBhY2tldHMKKwkJICogaW4gSXJUVFAgYXJlIGZyZWVkLiBIb3dldmVyLCB3ZSBoYXZlIG5vIHdheSB0byBjYW5jZWwKKwkJICogdGhlIHBhY2tldCB0aGF0IHdlIGhhdmUgcGFzc2VkIHRvIElyTEFQLiBTbywgaWYgYSBwYWNrZXQKKwkJICogcmVtYWlucyBpbiBJckxBUCAocmV0cnkgb24gdGhlIGxpbmsgb3IgZWxzZSkgYWZ0ZXIgd2UKKwkJICogY2xvc2UgdGhlIHNvY2tldCwgd2UgYXJlIGRlYWQgIQorCQkgKiBKZWFuIElJICovCisJCWlmIChza2ItPnNrICE9IE5VTEwpIHsKKwkJCS8qIElyU09DSyBhcHBsaWNhdGlvbiwgSXJPQkVYLCAuLi4gKi8KKwkJCXNrYl9vcnBoYW4oc2tiKTsKKwkJfQorCQkJLyogSXJDT01NIG92ZXIgSXJUVFAsIElyTEFOLCAuLi4gKi8KKworCQkvKiBQYXNzIHRoZSBza2IgdG8gSXJMTVAgLSBkb25lICovCisJCWlybG1wX2RhdGFfcmVxdWVzdChzZWxmLT5sc2FwLCBza2IpOworCQlzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7CisJfQorCisJLyogQ2hlY2sgaWYgd2UgY2FuIGFjY2VwdCBtb3JlIGZyYW1lcyBmcm9tIGNsaWVudC4KKwkgKiBXZSBkb24ndCB3YW50IHRvIHdhaXQgdW50aWwgdGhlIHRvZG8gdGltZXIgdG8gZG8gdGhhdCwgYW5kIHdlCisJICogY2FuJ3QgdXNlIHRhc2tsZXRzIChncnIuLi4pLCBzbyB3ZSBhcmUgb2JsaWdlZCB0byBnaXZlIGNvbnRyb2wKKwkgKiB0byBjbGllbnQuIFRoYXQncyBvaywgdGhpcyB0ZXN0IHdpbGwgYmUgdHJ1ZSBub3QgdG9vIG9mdGVuCisJICogKG1heCBvbmNlIHBlciBMQVAgd2luZG93KSBhbmQgd2UgYXJlIGNhbGxlZCBmcm9tIHBsYWNlcworCSAqIHdoZXJlIHdlIGNhbiBzcGVuZCBhIGJpdCBvZiB0aW1lIGRvaW5nIHN0dWZmLiAtIEplYW4gSUkgKi8KKwlpZiAoKHNlbGYtPnR4X3NkdV9idXN5KSAmJgorCSAgICAoc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhfcXVldWUpIDwgVFRQX1RYX0xPV19USFJFU0hPTEQpICYmCisJICAgICghc2VsZi0+Y2xvc2VfcGVuZCkpCisJeworCQlpZiAoc2VsZi0+bm90aWZ5LmZsb3dfaW5kaWNhdGlvbikKKwkJCXNlbGYtPm5vdGlmeS5mbG93X2luZGljYXRpb24oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLAorCQkJCQkJICAgICBzZWxmLCBGTE9XX1NUQVJUKTsKKworCQkvKiBzZWxmLT50eF9zZHVfYnVzeSBpcyB0aGUgc3RhdGUgb2YgdGhlIGNsaWVudC4KKwkJICogV2UgZG9uJ3QgcmVhbGx5IGhhdmUgYSByYWNlIGhlcmUsIGJ1dCBpdCdzIGFsd2F5cyBzYWZlcgorCQkgKiB0byB1cGRhdGUgb3VyIHN0YXRlIGFmdGVyIHRoZSBjbGllbnQgLSBKZWFuIElJICovCisJCXNlbGYtPnR4X3NkdV9idXN5ID0gRkFMU0U7CisJfQorCisJLyogUmVzZXQgbG9jayAqLworCXNlbGYtPnR4X3F1ZXVlX2xvY2sgPSAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJ0dHBfZ2l2ZV9jcmVkaXQgKHNlbGYpCisgKgorICogICAgU2VuZCBhIGRhdGFsZXNzIGZsb3dkYXRhIFRUUC1QRFUgYW5kIGdpdmUgYXZhaWxhYmxlIGNyZWRpdCB0byBwZWVyCisgKiAgICBUU0FQCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpcnR0cF9naXZlX2NyZWRpdChzdHJ1Y3QgdHNhcF9jYiAqc2VsZikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBuOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuOyk7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpIHNlbmQ9JWQsYXZhaWw9JWQscmVtb3RlPSVkXG4iLAorCQkgICBfX0ZVTkNUSU9OX18sCisJCSAgIHNlbGYtPnNlbmRfY3JlZGl0LCBzZWxmLT5hdmFpbF9jcmVkaXQsIHNlbGYtPnJlbW90ZV9jcmVkaXQpOworCisJLyogR2l2ZSBjcmVkaXQgdG8gcGVlciAqLworCXR4X3NrYiA9IGRldl9hbGxvY19za2IoNjQpOworCWlmICghdHhfc2tiKQorCQlyZXR1cm47CisKKwkvKiBSZXNlcnZlIHNwYWNlIGZvciBMTVAsIGFuZCBMQVAgaGVhZGVyICovCisJc2tiX3Jlc2VydmUodHhfc2tiLCBzZWxmLT5tYXhfaGVhZGVyX3NpemUpOworCisJLyoKKwkgKiAgU2luY2Ugd2UgY2FuIHRyYW5zbWl0IGFuZCByZWNlaXZlIGZyYW1lcyBjb25jdXJyZW50bHksCisJICogIHRoZSBjb2RlIGJlbG93IGlzIGEgY3JpdGljYWwgcmVnaW9uIGFuZCB3ZSBtdXN0IGFzc3VyZSB0aGF0CisJICogIG5vYm9keSBtZXNzZXMgd2l0aCB0aGUgY3JlZGl0cyB3aGlsZSB3ZSB1cGRhdGUgdGhlbS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJbiA9IHNlbGYtPmF2YWlsX2NyZWRpdDsKKwlzZWxmLT5hdmFpbF9jcmVkaXQgPSAwOworCisJLyogT25seSBzcGFjZSBmb3IgMTI3IGNyZWRpdHMgaW4gZnJhbWUgKi8KKwlpZiAobiA+IDEyNykgeworCQlzZWxmLT5hdmFpbF9jcmVkaXQgPSBuIC0gMTI3OworCQluID0gMTI3OworCX0KKwlzZWxmLT5yZW1vdGVfY3JlZGl0ICs9IG47CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisKKwlza2JfcHV0KHR4X3NrYiwgMSk7CisJdHhfc2tiLT5kYXRhWzBdID0gKF9fdTgpIChuICYgMHg3Zik7CisKKwlpcmxtcF9kYXRhX3JlcXVlc3Qoc2VsZi0+bHNhcCwgdHhfc2tiKTsKKwlzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnR0cF91ZGF0YV9pbmRpY2F0aW9uIChpbnN0YW5jZSwgc2FwLCBza2IpCisgKgorICogICAgUmVjZWl2ZWQgc29tZSB1bml0LWRhdGEgKHVucmVsaWFibGUpCisgKgorICovCitzdGF0aWMgaW50IGlydHRwX3VkYXRhX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHRzYXBfY2IgKnNlbGY7CisJaW50IGVycjsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzZWxmID0gKHN0cnVjdCB0c2FwX2NiICopIGluc3RhbmNlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybiAtMTspOworCisJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOworCisJLyogSnVzdCBwYXNzIGRhdGEgdG8gbGF5ZXIgYWJvdmUgKi8KKwlpZiAoc2VsZi0+bm90aWZ5LnVkYXRhX2luZGljYXRpb24pIHsKKwkJZXJyID0gc2VsZi0+bm90aWZ5LnVkYXRhX2luZGljYXRpb24oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLAorCQkJCQkJICAgIHNlbGYsc2tiKTsKKwkJLyogU2FtZSBjb21tZW50IGFzIGluIGlydHRwX2RvX2RhdGFfaW5kaWNhdGlvbigpICovCisJCWlmICghZXJyKSAKKwkJCXJldHVybiAwOworCX0KKwkvKiBFaXRoZXIgbm8gaGFuZGxlciwgb3IgaGFuZGxlciByZXR1cm5zIGFuIGVycm9yICovCisJZGV2X2tmcmVlX3NrYihza2IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnR0cF9kYXRhX2luZGljYXRpb24gKGluc3RhbmNlLCBzYXAsIHNrYikKKyAqCisgKiAgICBSZWNlaXZlIHNlZ21lbnQgZnJvbSBJckxNUC4KKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJ0dHBfZGF0YV9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHRzYXBfY2IgKnNlbGY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbjsKKworCXNlbGYgPSAoc3RydWN0IHRzYXBfY2IgKikgaW5zdGFuY2U7CisKKwluID0gc2tiLT5kYXRhWzBdICYgMHg3ZjsgICAgIC8qIEV4dHJhY3QgdGhlIGNyZWRpdHMgKi8KKworCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKworCS8qICBEZWFsIHdpdGggaW5ib3VuZCBjcmVkaXQKKwkgKiAgU2luY2Ugd2UgY2FuIHRyYW5zbWl0IGFuZCByZWNlaXZlIGZyYW1lcyBjb25jdXJyZW50bHksCisJICogIHRoZSBjb2RlIGJlbG93IGlzIGEgY3JpdGljYWwgcmVnaW9uIGFuZCB3ZSBtdXN0IGFzc3VyZSB0aGF0CisJICogIG5vYm9keSBtZXNzZXMgd2l0aCB0aGUgY3JlZGl0cyB3aGlsZSB3ZSB1cGRhdGUgdGhlbS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCXNlbGYtPnNlbmRfY3JlZGl0ICs9IG47CisJaWYgKHNrYi0+bGVuID4gMSkKKwkJc2VsZi0+cmVtb3RlX2NyZWRpdC0tOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogIERhdGEgb3IgZGF0YWxlc3MgcGFja2V0PyBEYXRhbGVzcyBmcmFtZXMgY29udGFpbnMgb25seSB0aGUKKwkgKiAgVFRQX0hFQURFUi4KKwkgKi8KKwlpZiAoc2tiLT5sZW4gPiAxKSB7CisJCS8qCisJCSAqICBXZSBkb24ndCByZW1vdmUgdGhlIFRUUCBoZWFkZXIsIHNpbmNlIHdlIG11c3QgcHJlc2VydmUgdGhlCisJCSAqICBtb3JlIGJpdCwgc28gdGhlIGRlZnJhZ21lbnQgcm91dGluZyBrbm93cyB3aGF0IHRvIGRvCisJCSAqLworCQlza2JfcXVldWVfdGFpbCgmc2VsZi0+cnhfcXVldWUsIHNrYik7CisJfSBlbHNlIHsKKwkJLyogRGF0YWxlc3MgZmxvd2RhdGEgVFRQLVBEVSAqLworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJfQorCisKKwkvKiBQdXNoIGRhdGEgdG8gdGhlIGhpZ2hlciBsYXllci4KKwkgKiBXZSBkbyBpdCBzeW5jaHJvbm91c2x5IGJlY2F1c2UgcnVubmluZyB0aGUgdG9kbyB0aW1lciBmb3IgZWFjaAorCSAqIHJlY2VpdmUgcGFja2V0IHdvdWxkIGJlIHRvbyBtdWNoIG92ZXJoZWFkIGFuZCBsYXRlbmN5LgorCSAqIEJ5IHBhc3NpbmcgY29udHJvbCB0byB0aGUgaGlnaGVyIGxheWVyLCB3ZSBydW4gdGhlIHJpc2sgdGhhdAorCSAqIGl0IG1heSB0YWtlIHRpbWUgb3IgZ3JhYiBhIGxvY2suIE1vc3Qgb2Z0ZW4sIHRoZSBoaWdoZXIgbGF5ZXIKKwkgKiB3aWxsIG9ubHkgcHV0IHBhY2tldCBpbiBhIHF1ZXVlLgorCSAqIEFueXdheSwgcGFja2V0cyBhcmUgb25seSBkcmlwcGluZyB0aHJvdWdoIHRoZSBJckRBLCBzbyB3ZSBjYW4KKwkgKiBoYXZlIHRpbWUgYmVmb3JlIHRoZSBuZXh0IHBhY2tldC4KKwkgKiBGdXJ0aGVyLCB3ZSBhcmUgcnVuIGZyb20gTkVUX0JILCBzbyB0aGUgd29yc2UgdGhhdCBjYW4gaGFwcGVuIGlzCisJICogdXMgbWlzc2luZyB0aGUgb3B0aW1hbCB0aW1lIHRvIHNlbmQgYmFjayB0aGUgUEYgYml0IGluIExBUC4KKwkgKiBKZWFuIElJICovCisJaXJ0dHBfcnVuX3J4X3F1ZXVlKHNlbGYpOworCisJLyogV2Ugbm93IGdpdmUgY3JlZGl0cyB0byBwZWVyIGluIGlydHRwX3J1bl9yeF9xdWV1ZSgpLgorCSAqIFdlIG5lZWQgdG8gc2VuZCBjcmVkaXQgKk5PVyosIG90aGVyd2lzZSB3ZSBhcmUgZ29pbmcKKwkgKiB0byBtaXNzIHRoZSBuZXh0IFR4IHdpbmRvdy4gVGhlIHRvZG8gdGltZXIgbWF5IHRha2UKKwkgKiBhIHdoaWxlIGJlZm9yZSBpdCdzIHJ1bi4uLiAtIEplYW4gSUkgKi8KKworCS8qCisJICogSWYgdGhlIHBlZXIgZGV2aWNlIGhhcyBnaXZlbiB1cyBzb21lIGNyZWRpdHMgYW5kIHdlIGRpZG4ndCBoYXZlCisgICAgICAgICAqIGFueW9uZSBmcm9tIGJlZm9yZSwgdGhlbiB3ZSBuZWVkIHRvIHNoZWR1bGUgdGhlIHR4IHF1ZXVlLgorCSAqIFdlIG5lZWQgdG8gZG8gdGhhdCBiZWNhdXNlIG91ciBUeCBoYXZlIHN0b3BwZWQgKHNvIHdlIG1heSBub3QKKwkgKiBnZXQgYW55IExBUCBmbG93IGluZGljYXRpb24pIGFuZCB0aGUgdXNlciBtYXkgYmUgc3RvcHBlZCBhcworCSAqIHdlbGwuIC0gSmVhbiBJSQorCSAqLworCWlmIChzZWxmLT5zZW5kX2NyZWRpdCA9PSBuKSB7CisJCS8qIFJlc3RhcnQgcHVzaGluZyBzdHVmZiB0byBMQVAgKi8KKwkJaXJ0dHBfcnVuX3R4X3F1ZXVlKHNlbGYpOworCQkvKiBOb3RlIDogd2UgZG9uJ3Qgd2FudCB0byBzY2hlZHVsZSB0aGUgdG9kbyB0aW1lcgorCQkgKiBiZWNhdXNlIGl0IGhhcyBob3JyaWJsZSBsYXRlbmN5LiBObyB0YXNrbGV0cworCQkgKiBiZWNhdXNlIHRoZSB0YXNrbGV0IEFQSSBpcyBicm9rZW4uIC0gSmVhbiBJSSAqLworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJ0dHBfc3RhdHVzX2luZGljYXRpb24gKHNlbGYsIHJlYXNvbikKKyAqCisgKiAgICBTdGF0dXNfaW5kaWNhdGlvbiwganVzdCBwYXNzIHRvIHRoZSBoaWdoZXIgbGF5ZXIuLi4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlydHRwX3N0YXR1c19pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLAorCQkJCSAgICBMSU5LX1NUQVRVUyBsaW5rLCBMT0NLX1NUQVRVUyBsb2NrKQoreworCXN0cnVjdCB0c2FwX2NiICpzZWxmOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXNlbGYgPSAoc3RydWN0IHRzYXBfY2IgKikgaW5zdGFuY2U7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm47KTsKKworCS8qIENoZWNrIGlmIGNsaWVudCBoYXMgYWxyZWFkeSBjbG9zZWQgdGhlIFRTQVAgYW5kIGdvbmUgYXdheSAqLworCWlmIChzZWxmLT5jbG9zZV9wZW5kKQorCQlyZXR1cm47CisKKwkvKgorCSAqICBJbmZvcm0gc2VydmljZSB1c2VyIGlmIGhlIGhhcyByZXF1ZXN0ZWQgaXQKKwkgKi8KKwlpZiAoc2VsZi0+bm90aWZ5LnN0YXR1c19pbmRpY2F0aW9uICE9IE5VTEwpCisJCXNlbGYtPm5vdGlmeS5zdGF0dXNfaW5kaWNhdGlvbihzZWxmLT5ub3RpZnkuaW5zdGFuY2UsCisJCQkJCSAgICAgICBsaW5rLCBsb2NrKTsKKwllbHNlCisJCUlSREFfREVCVUcoMiwgIiVzKCksIG5vIGhhbmRsZXJcbiIsIF9fRlVOQ1RJT05fXyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnR0cF9mbG93X2luZGljYXRpb24gKHNlbGYsIHJlYXNvbikKKyAqCisgKiAgICBGbG93X2luZGljYXRpb24gOiBJckxBUCB0ZWxscyB1cyB0byBzZW5kIG1vcmUgZGF0YS4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlydHRwX2Zsb3dfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCBMT0NBTF9GTE9XIGZsb3cpCit7CisJc3RydWN0IHRzYXBfY2IgKnNlbGY7CisKKwlzZWxmID0gKHN0cnVjdCB0c2FwX2NiICopIGluc3RhbmNlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuOyk7CisKKwlJUkRBX0RFQlVHKDQsICIlcyhpbnN0YW5jZT0lcClcbiIsIF9fRlVOQ1RJT05fXywgc2VsZik7CisKKwkvKiBXZSBhcmUgInBvbGxlZCIgZGlyZWN0bHkgZnJvbSBMQVAsIGFuZCB0aGUgTEFQIHdhbnQgdG8gZmlsbAorCSAqIGl0cyBUeCB3aW5kb3cuIFdlIHdhbnQgdG8gZG8gb3VyIGJlc3QgdG8gc2VuZCBpdCBkYXRhLCBzbyB0aGF0CisJICogd2UgbWF4aW1pc2UgdGhlIHdpbmRvdy4gT24gdGhlIG90aGVyIGhhbmQsIHdlIHdhbnQgdG8gbGltaXQgdGhlCisJICogYW1vdW50IG9mIHdvcmsgaGVyZSBzbyB0aGF0IExBUCBkb2Vzbid0IGhhbmcgZm9yZXZlciB3YWl0aW5nCisJICogZm9yIHBhY2tldHMuIC0gSmVhbiBJSSAqLworCisJLyogVHJ5IHRvIHNlbmQgc29tZSBwYWNrZXRzLiBDdXJyZW50bHksIExBUCBjYWxscyB1cyBldmVyeSB0aW1lCisJICogdGhlcmUgaXMgb25lIGZyZWUgc2xvdCwgc28gd2Ugd2lsbCBzZW5kIG9ubHkgb25lIHBhY2tldC4KKwkgKiBUaGlzIGFsbG93IHRoZSBzY2hlZHVsZXIgdG8gZG8gaXRzIHJvdW5kIHJvYmluIC0gSmVhbiBJSSAqLworCWlydHRwX3J1bl90eF9xdWV1ZShzZWxmKTsKKworCS8qIE5vdGUgcmVnYXJkaW5nIHRoZSBpbnRlcnJhY3Rpb24gd2l0aCBoaWdoZXIgbGF5ZXIuCisJICogaXJ0dHBfcnVuX3R4X3F1ZXVlKCkgbWF5IGNhbGwgdGhlIGNsaWVudCB3aGVuIGl0cyBxdWV1ZQorCSAqIHN0YXJ0IHRvIGVtcHR5LCB2aWEgbm90aWZ5LmZsb3dfaW5kaWNhdGlvbigpLiBJbml0aWFsbHkuCisJICogSSB3YW50ZWQgdGhpcyB0byBoYXBwZW4gaW4gYSB0YXNrbGV0LCB0byBhdm9pZCBjbGllbnQKKwkgKiBncmFiYmluZyB0aGUgQ1BVLCBidXQgd2UgY2FuJ3QgdXNlIHRhc2tsZXRzIHNhZmVseS4gQW5kIHRpbWVyCisJICogaXMgZGVmaW5pdGVseSB0b28gc2xvdy4KKwkgKiBUaGlzIHdpbGwgaGFwcGVuIG9ubHkgb25jZSBwZXIgTEFQIHdpbmRvdywgYW5kIHVzdWFsbHkgYXQKKwkgKiB0aGUgdGhpcmQgcGFja2V0ICh1bmxlc3Mgd2luZG93IGlzIHNtYWxsZXIpLiBMQVAgaXMgc3RpbGwKKwkgKiBkb2luZyBtdHQgYW5kIHNlbmRpbmcgZmlyc3QgcGFja2V0IHNvIGl0J3Mgc29ydCBvZiBPSworCSAqIHRvIGRvIHRoYXQuIEplYW4gSUkgKi8KKworCS8qIElmIHdlIG5lZWQgdG8gc2VuZCBkaXNjb25uZWN0LiB0cnkgdG8gZG8gaXQgbm93ICovCisJaWYoc2VsZi0+ZGlzY29ubmVjdF9wZW5kKQorCQlpcnR0cF9zdGFydF90b2RvX3RpbWVyKHNlbGYsIDApOworfQorCisvKgorICogRnVuY3Rpb24gaXJ0dHBfZmxvd19yZXF1ZXN0IChzZWxmLCBjb21tYW5kKQorICoKKyAqICAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgdXNlZCBieSB0aGUgdXBwZXIgbGF5ZXJzIHRvIHRlbGwgSXJUVFAgdG8gc3RvcAorICogICAgZGVsaXZlcmluZyBmcmFtZXMgaWYgdGhlIHJlY2VpdmUgcXVldWVzIGFyZSBzdGFydGluZyB0byBnZXQgZnVsbCwgb3IKKyAqICAgIHRvIHRlbGwgSXJUVFAgdG8gc3RhcnQgZGVsaXZlcmluZyBmcmFtZXMgYWdhaW4uCisgKi8KK3ZvaWQgaXJ0dHBfZmxvd19yZXF1ZXN0KHN0cnVjdCB0c2FwX2NiICpzZWxmLCBMT0NBTF9GTE9XIGZsb3cpCit7CisJSVJEQV9ERUJVRygxLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybjspOworCisJc3dpdGNoIChmbG93KSB7CisJY2FzZSBGTE9XX1NUT1A6CisJCUlSREFfREVCVUcoMSwgIiVzKCksIGZsb3cgc3RvcFxuIiwgX19GVU5DVElPTl9fKTsKKwkJc2VsZi0+cnhfc2R1X2J1c3kgPSBUUlVFOworCQlicmVhazsKKwljYXNlIEZMT1dfU1RBUlQ6CisJCUlSREFfREVCVUcoMSwgIiVzKCksIGZsb3cgc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXNlbGYtPnJ4X3NkdV9idXN5ID0gRkFMU0U7CisKKwkJLyogQ2xpZW50IHNheSBoZSBjYW4gYWNjZXB0IG1vcmUgZGF0YSwgdHJ5IHRvIGZyZWUgb3VyCisJCSAqIHF1ZXVlcyBBU0FQIC0gSmVhbiBJSSAqLworCQlpcnR0cF9ydW5fcnhfcXVldWUoc2VsZik7CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgVW5rbm93biBmbG93IGNvbW1hbmQhXG4iLCBfX0ZVTkNUSU9OX18pOworCX0KK30KK0VYUE9SVF9TWU1CT0woaXJ0dHBfZmxvd19yZXF1ZXN0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGlydHRwX2Nvbm5lY3RfcmVxdWVzdCAoc2VsZiwgZHRzYXBfc2VsLCBkYWRkciwgcW9zKQorICoKKyAqICAgIFRyeSB0byBjb25uZWN0IHRvIHJlbW90ZSBkZXN0aW5hdGlvbiBUU0FQIHNlbGVjdG9yCisgKgorICovCitpbnQgaXJ0dHBfY29ubmVjdF9yZXF1ZXN0KHN0cnVjdCB0c2FwX2NiICpzZWxmLCBfX3U4IGR0c2FwX3NlbCwKKwkJCSAgX191MzIgc2FkZHIsIF9fdTMyIGRhZGRyLAorCQkJICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywgX191MzIgbWF4X3NkdV9zaXplLAorCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqdXNlcmRhdGEpCit7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKKwlfX3U4ICpmcmFtZTsKKwlfX3U4IG47CisKKwlJUkRBX0RFQlVHKDQsICIlcygpLCBtYXhfc2R1X3NpemU9JWRcbiIsIF9fRlVOQ1RJT05fXywgbWF4X3NkdV9zaXplKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC1FQkFEUjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm4gLUVCQURSOyk7CisKKwlpZiAoc2VsZi0+Y29ubmVjdGVkKSB7CisJCWlmKHVzZXJkYXRhKQorCQkJZGV2X2tmcmVlX3NrYih1c2VyZGF0YSk7CisJCXJldHVybiAtRUlTQ09OTjsKKwl9CisKKwkvKiBBbnkgdXNlcmRhdGEgc3VwcGxpZWQ/ICovCisJaWYgKHVzZXJkYXRhID09IE5VTEwpIHsKKwkJdHhfc2tiID0gZGV2X2FsbG9jX3NrYig2NCk7CisJCWlmICghdHhfc2tiKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgTVVYX0NPTlRST0wgYW5kIExBUCBoZWFkZXIgKi8KKwkJc2tiX3Jlc2VydmUodHhfc2tiLCBUVFBfTUFYX0hFQURFUik7CisJfSBlbHNlIHsKKwkJdHhfc2tiID0gdXNlcmRhdGE7CisJCS8qCisJCSAqICBDaGVjayB0aGF0IHRoZSBjbGllbnQgaGFzIHJlc2VydmVkIGVub3VnaCBzcGFjZSBmb3IKKwkJICogIGhlYWRlcnMKKwkJICovCisJCUlSREFfQVNTRVJUKHNrYl9oZWFkcm9vbSh1c2VyZGF0YSkgPj0gVFRQX01BWF9IRUFERVIsCisJCQl7IGRldl9rZnJlZV9za2IodXNlcmRhdGEpOyByZXR1cm4gLTE7IH0gKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIGNvbm5lY3Rpb24gcGFyYW1ldGVycyAqLworCXNlbGYtPmNvbm5lY3RlZCA9IEZBTFNFOworCXNlbGYtPmF2YWlsX2NyZWRpdCA9IDA7CisJc2VsZi0+cnhfbWF4X3NkdV9zaXplID0gbWF4X3NkdV9zaXplOworCXNlbGYtPnJ4X3NkdV9zaXplID0gMDsKKwlzZWxmLT5yeF9zZHVfYnVzeSA9IEZBTFNFOworCXNlbGYtPmR0c2FwX3NlbCA9IGR0c2FwX3NlbDsKKworCW4gPSBzZWxmLT5pbml0aWFsX2NyZWRpdDsKKworCXNlbGYtPnJlbW90ZV9jcmVkaXQgPSAwOworCXNlbGYtPnNlbmRfY3JlZGl0ID0gMDsKKworCS8qCisJICogIEdpdmUgYXdheSBtYXggMTI3IGNyZWRpdHMgZm9yIG5vdworCSAqLworCWlmIChuID4gMTI3KSB7CisJCXNlbGYtPmF2YWlsX2NyZWRpdD1uLTEyNzsKKwkJbiA9IDEyNzsKKwl9CisKKwlzZWxmLT5yZW1vdGVfY3JlZGl0ID0gbjsKKworCS8qIFNBUiBlbmFibGVkPyAqLworCWlmIChtYXhfc2R1X3NpemUgPiAwKSB7CisJCUlSREFfQVNTRVJUKHNrYl9oZWFkcm9vbSh0eF9za2IpID49IChUVFBfTUFYX0hFQURFUiArIFRUUF9TQVJfSEVBREVSKSwKKwkJCXsgZGV2X2tmcmVlX3NrYih0eF9za2IpOyByZXR1cm4gLTE7IH0gKTsKKworCQkvKiBJbnNlcnQgU0FSIHBhcmFtZXRlcnMgKi8KKwkJZnJhbWUgPSBza2JfcHVzaCh0eF9za2IsIFRUUF9IRUFERVIrVFRQX1NBUl9IRUFERVIpOworCisJCWZyYW1lWzBdID0gVFRQX1BBUkFNRVRFUlMgfCBuOworCQlmcmFtZVsxXSA9IDB4MDQ7IC8qIExlbmd0aCAqLworCQlmcmFtZVsyXSA9IDB4MDE7IC8qIE1heFNkdVNpemUgKi8KKwkJZnJhbWVbM10gPSAweDAyOyAvKiBWYWx1ZSBsZW5ndGggKi8KKworCQlwdXRfdW5hbGlnbmVkKGNwdV90b19iZTE2KChfX3UxNikgbWF4X3NkdV9zaXplKSwKKwkJCSAgICAgIChfX3UxNiAqKShmcmFtZSs0KSk7CisJfSBlbHNlIHsKKwkJLyogSW5zZXJ0IHBsYWluIFRUUCBoZWFkZXIgKi8KKwkJZnJhbWUgPSBza2JfcHVzaCh0eF9za2IsIFRUUF9IRUFERVIpOworCisJCS8qIEluc2VydCBpbml0aWFsIGNyZWRpdCBpbiBmcmFtZSAqLworCQlmcmFtZVswXSA9IG4gJiAweDdmOworCX0KKworCS8qIENvbm5lY3Qgd2l0aCBJckxNUC4gTm8gUW9TIHBhcmFtZXRlcnMgZm9yIG5vdyAqLworCXJldHVybiBpcmxtcF9jb25uZWN0X3JlcXVlc3Qoc2VsZi0+bHNhcCwgZHRzYXBfc2VsLCBzYWRkciwgZGFkZHIsIHFvcywKKwkJCQkgICAgIHR4X3NrYik7Cit9CitFWFBPUlRfU1lNQk9MKGlydHRwX2Nvbm5lY3RfcmVxdWVzdCk7CisKKy8qCisgKiBGdW5jdGlvbiBpcnR0cF9jb25uZWN0X2NvbmZpcm0gKGhhbmRsZSwgcW9zLCBza2IpCisgKgorICogICAgU2V2aWNlIHVzZXIgY29uZmlybXMgVFNBUCBjb25uZWN0aW9uIHdpdGggcGVlci4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlydHRwX2Nvbm5lY3RfY29uZmlybSh2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAorCQkJCSAgc3RydWN0IHFvc19pbmZvICpxb3MsIF9fdTMyIG1heF9zZWdfc2l6ZSwKKwkJCQkgIF9fdTggbWF4X2hlYWRlcl9zaXplLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB0c2FwX2NiICpzZWxmOworCWludCBwYXJhbWV0ZXJzOworCWludCByZXQ7CisJX191OCBwbGVuOworCV9fdTggbjsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzZWxmID0gKHN0cnVjdCB0c2FwX2NiICopIGluc3RhbmNlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOworCisJc2VsZi0+bWF4X3NlZ19zaXplID0gbWF4X3NlZ19zaXplIC0gVFRQX0hFQURFUjsKKwlzZWxmLT5tYXhfaGVhZGVyX3NpemUgPSBtYXhfaGVhZGVyX3NpemUgKyBUVFBfSEVBREVSOworCisJLyoKKwkgKiAgQ2hlY2sgaWYgd2UgaGF2ZSBnb3Qgc29tZSBRb1MgcGFyYW1ldGVycyBiYWNrISBUaGlzIHNob3VsZCBiZSB0aGUKKwkgKiAgbmVnb3RpYXRlZCBRb1MgZm9yIHRoZSBsaW5rLgorCSAqLworCWlmIChxb3MpIHsKKwkJSVJEQV9ERUJVRyg0LCAiSXJUVFAsIE5lZ290aWF0ZWQgQkFVRF9SQVRFOiAlMDJ4XG4iLAorCQkgICAgICAgcW9zLT5iYXVkX3JhdGUuYml0cyk7CisJCUlSREFfREVCVUcoNCwgIklyVFRQLCBOZWdvdGlhdGVkIEJBVURfUkFURTogJWQgYnBzLlxuIiwKKwkJICAgICAgIHFvcy0+YmF1ZF9yYXRlLnZhbHVlKTsKKwl9CisKKwluID0gc2tiLT5kYXRhWzBdICYgMHg3ZjsKKworCUlSREFfREVCVUcoNCwgIiVzKCksIEluaXRpYWwgc2VuZF9jcmVkaXQ9JWRcbiIsIF9fRlVOQ1RJT05fXywgbik7CisKKwlzZWxmLT5zZW5kX2NyZWRpdCA9IG47CisJc2VsZi0+dHhfbWF4X3NkdV9zaXplID0gMDsKKwlzZWxmLT5jb25uZWN0ZWQgPSBUUlVFOworCisJcGFyYW1ldGVycyA9IHNrYi0+ZGF0YVswXSAmIDB4ODA7CisKKwlJUkRBX0FTU0VSVChza2ItPmxlbiA+PSBUVFBfSEVBREVSLCByZXR1cm47KTsKKwlza2JfcHVsbChza2IsIFRUUF9IRUFERVIpOworCisJaWYgKHBhcmFtZXRlcnMpIHsKKwkJcGxlbiA9IHNrYi0+ZGF0YVswXTsKKworCQlyZXQgPSBpcmRhX3BhcmFtX2V4dHJhY3RfYWxsKHNlbGYsIHNrYi0+ZGF0YSsxLAorCQkJCQkgICAgIElSREFfTUlOKHNrYi0+bGVuLTEsIHBsZW4pLAorCQkJCQkgICAgICZwYXJhbV9pbmZvKTsKKworCQkvKiBBbnkgZXJyb3JzIGluIHRoZSBwYXJhbWV0ZXIgbGlzdD8gKi8KKwkJaWYgKHJldCA8IDApIHsKKwkJCUlSREFfV0FSTklORygiJXM6IGVycm9yIGV4dHJhY3RpbmcgcGFyYW1ldGVyc1xuIiwKKwkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwkJCS8qIERvIG5vdCBhY2NlcHQgdGhpcyBjb25uZWN0aW9uIGF0dGVtcHQgKi8KKwkJCXJldHVybjsKKwkJfQorCQkvKiBSZW1vdmUgcGFyYW1ldGVycyAqLworCQlza2JfcHVsbChza2IsIElSREFfTUlOKHNrYi0+bGVuLCBwbGVuKzEpKTsKKwl9CisKKwlJUkRBX0RFQlVHKDQsICIlcygpIHNlbmQ9JWQsYXZhaWw9JWQscmVtb3RlPSVkXG4iLCBfX0ZVTkNUSU9OX18sCisJICAgICAgc2VsZi0+c2VuZF9jcmVkaXQsIHNlbGYtPmF2YWlsX2NyZWRpdCwgc2VsZi0+cmVtb3RlX2NyZWRpdCk7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBNYXhTZHVTaXplPSVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCSAgIHNlbGYtPnR4X21heF9zZHVfc2l6ZSk7CisKKwlpZiAoc2VsZi0+bm90aWZ5LmNvbm5lY3RfY29uZmlybSkgeworCQlzZWxmLT5ub3RpZnkuY29ubmVjdF9jb25maXJtKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSwgc2VsZiwgcW9zLAorCQkJCQkgICAgIHNlbGYtPnR4X21heF9zZHVfc2l6ZSwKKwkJCQkJICAgICBzZWxmLT5tYXhfaGVhZGVyX3NpemUsIHNrYik7CisJfSBlbHNlCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlydHRwX2Nvbm5lY3RfaW5kaWNhdGlvbiAoaGFuZGxlLCBza2IpCisgKgorICogICAgU29tZSBvdGhlciBkZXZpY2UgaXMgY29ubmVjdGluZyB0byB0aGlzIFRTQVAKKyAqCisgKi8KK3ZvaWQgaXJ0dHBfY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIHN0cnVjdCBxb3NfaW5mbyAqcW9zLAorCQkJICAgICAgX191MzIgbWF4X3NlZ19zaXplLCBfX3U4IG1heF9oZWFkZXJfc2l6ZSwKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHRzYXBfY2IgKnNlbGY7CisJc3RydWN0IGxzYXBfY2IgKmxzYXA7CisJaW50IHBhcmFtZXRlcnM7CisJaW50IHJldDsKKwlfX3U4IHBsZW47CisJX191OCBuOworCisJc2VsZiA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBpbnN0YW5jZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gVFRQX1RTQVBfTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKKworCWxzYXAgPSAoc3RydWN0IGxzYXBfY2IgKikgc2FwOworCisJc2VsZi0+bWF4X3NlZ19zaXplID0gbWF4X3NlZ19zaXplIC0gVFRQX0hFQURFUjsKKwlzZWxmLT5tYXhfaGVhZGVyX3NpemUgPSBtYXhfaGVhZGVyX3NpemUrVFRQX0hFQURFUjsKKworCUlSREFfREVCVUcoNCwgIiVzKCksIFRTQVAgc2VsPSUwMnhcbiIsIF9fRlVOQ1RJT05fXywgc2VsZi0+c3RzYXBfc2VsKTsKKworCS8qIE5lZWQgdG8gdXBkYXRlIGR0c2FwX3NlbCBpZiBpdHMgZXF1YWwgdG8gTFNBUF9BTlkgKi8KKwlzZWxmLT5kdHNhcF9zZWwgPSBsc2FwLT5kbHNhcF9zZWw7CisKKwluID0gc2tiLT5kYXRhWzBdICYgMHg3ZjsKKworCXNlbGYtPnNlbmRfY3JlZGl0ID0gbjsKKwlzZWxmLT50eF9tYXhfc2R1X3NpemUgPSAwOworCisJcGFyYW1ldGVycyA9IHNrYi0+ZGF0YVswXSAmIDB4ODA7CisKKwlJUkRBX0FTU0VSVChza2ItPmxlbiA+PSBUVFBfSEVBREVSLCByZXR1cm47KTsKKwlza2JfcHVsbChza2IsIFRUUF9IRUFERVIpOworCisJaWYgKHBhcmFtZXRlcnMpIHsKKwkJcGxlbiA9IHNrYi0+ZGF0YVswXTsKKworCQlyZXQgPSBpcmRhX3BhcmFtX2V4dHJhY3RfYWxsKHNlbGYsIHNrYi0+ZGF0YSsxLAorCQkJCQkgICAgIElSREFfTUlOKHNrYi0+bGVuLTEsIHBsZW4pLAorCQkJCQkgICAgICZwYXJhbV9pbmZvKTsKKworCQkvKiBBbnkgZXJyb3JzIGluIHRoZSBwYXJhbWV0ZXIgbGlzdD8gKi8KKwkJaWYgKHJldCA8IDApIHsKKwkJCUlSREFfV0FSTklORygiJXM6IGVycm9yIGV4dHJhY3RpbmcgcGFyYW1ldGVyc1xuIiwKKwkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwkJCS8qIERvIG5vdCBhY2NlcHQgdGhpcyBjb25uZWN0aW9uIGF0dGVtcHQgKi8KKwkJCXJldHVybjsKKwkJfQorCisJCS8qIFJlbW92ZSBwYXJhbWV0ZXJzICovCisJCXNrYl9wdWxsKHNrYiwgSVJEQV9NSU4oc2tiLT5sZW4sIHBsZW4rMSkpOworCX0KKworCWlmIChzZWxmLT5ub3RpZnkuY29ubmVjdF9pbmRpY2F0aW9uKSB7CisJCXNlbGYtPm5vdGlmeS5jb25uZWN0X2luZGljYXRpb24oc2VsZi0+bm90aWZ5Lmluc3RhbmNlLCBzZWxmLAorCQkJCQkJcW9zLCBzZWxmLT50eF9tYXhfc2R1X3NpemUsCisJCQkJCQlzZWxmLT5tYXhfaGVhZGVyX3NpemUsIHNrYik7CisJfSBlbHNlCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlydHRwX2Nvbm5lY3RfcmVzcG9uc2UgKGhhbmRsZSwgdXNlcmRhdGEpCisgKgorICogICAgU2VydmljZSB1c2VyIGlzIGFjY2VwdGluZyB0aGUgY29ubmVjdGlvbiwganVzdCBwYXNzIGl0IGRvd24gdG8KKyAqICAgIElyTE1QIQorICoKKyAqLworaW50IGlydHRwX2Nvbm5lY3RfcmVzcG9uc2Uoc3RydWN0IHRzYXBfY2IgKnNlbGYsIF9fdTMyIG1heF9zZHVfc2l6ZSwKKwkJCSAgIHN0cnVjdCBza19idWZmICp1c2VyZGF0YSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOworCV9fdTggKmZyYW1lOworCWludCByZXQ7CisJX191OCBuOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpLCBTb3VyY2UgVFNBUCBzZWxlY3Rvcj0lMDJ4XG4iLCBfX0ZVTkNUSU9OX18sCisJCSAgIHNlbGYtPnN0c2FwX3NlbCk7CisKKwkvKiBBbnkgdXNlcmRhdGEgc3VwcGxpZWQ/ICovCisJaWYgKHVzZXJkYXRhID09IE5VTEwpIHsKKwkJdHhfc2tiID0gZGV2X2FsbG9jX3NrYig2NCk7CisJCWlmICghdHhfc2tiKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgTVVYX0NPTlRST0wgYW5kIExBUCBoZWFkZXIgKi8KKwkJc2tiX3Jlc2VydmUodHhfc2tiLCBUVFBfTUFYX0hFQURFUik7CisJfSBlbHNlIHsKKwkJdHhfc2tiID0gdXNlcmRhdGE7CisJCS8qCisJCSAqICBDaGVjayB0aGF0IHRoZSBjbGllbnQgaGFzIHJlc2VydmVkIGVub3VnaCBzcGFjZSBmb3IKKwkJICogIGhlYWRlcnMKKwkJICovCisJCUlSREFfQVNTRVJUKHNrYl9oZWFkcm9vbSh1c2VyZGF0YSkgPj0gVFRQX01BWF9IRUFERVIsCisJCQl7IGRldl9rZnJlZV9za2IodXNlcmRhdGEpOyByZXR1cm4gLTE7IH0gKTsKKwl9CisKKwlzZWxmLT5hdmFpbF9jcmVkaXQgPSAwOworCXNlbGYtPnJlbW90ZV9jcmVkaXQgPSAwOworCXNlbGYtPnJ4X21heF9zZHVfc2l6ZSA9IG1heF9zZHVfc2l6ZTsKKwlzZWxmLT5yeF9zZHVfc2l6ZSA9IDA7CisJc2VsZi0+cnhfc2R1X2J1c3kgPSBGQUxTRTsKKworCW4gPSBzZWxmLT5pbml0aWFsX2NyZWRpdDsKKworCS8qIEZyYW1lIGhhcyBvbmx5IHNwYWNlIGZvciBtYXggMTI3IGNyZWRpdHMgKDcgYml0cykgKi8KKwlpZiAobiA+IDEyNykgeworCQlzZWxmLT5hdmFpbF9jcmVkaXQgPSBuIC0gMTI3OworCQluID0gMTI3OworCX0KKworCXNlbGYtPnJlbW90ZV9jcmVkaXQgPSBuOworCXNlbGYtPmNvbm5lY3RlZCA9IFRSVUU7CisKKwkvKiBTQVIgZW5hYmxlZD8gKi8KKwlpZiAobWF4X3NkdV9zaXplID4gMCkgeworCQlJUkRBX0FTU0VSVChza2JfaGVhZHJvb20odHhfc2tiKSA+PSAoVFRQX01BWF9IRUFERVIgKyBUVFBfU0FSX0hFQURFUiksCisJCQl7IGRldl9rZnJlZV9za2IodHhfc2tiKTsgcmV0dXJuIC0xOyB9ICk7CisKKwkJLyogSW5zZXJ0IFRUUCBoZWFkZXIgd2l0aCBTQVIgcGFyYW1ldGVycyAqLworCQlmcmFtZSA9IHNrYl9wdXNoKHR4X3NrYiwgVFRQX0hFQURFUitUVFBfU0FSX0hFQURFUik7CisKKwkJZnJhbWVbMF0gPSBUVFBfUEFSQU1FVEVSUyB8IG47CisJCWZyYW1lWzFdID0gMHgwNDsgLyogTGVuZ3RoICovCisKKwkJLyogaXJkYV9wYXJhbV9pbnNlcnQoc2VsZiwgSVJUVFBfTUFYX1NEVV9TSVpFLCBmcmFtZSsxLCAgKi8KKy8qCQkJCSAgVFRQX1NBUl9IRUFERVIsICZwYXJhbV9pbmZvKSAqLworCisJCWZyYW1lWzJdID0gMHgwMTsgLyogTWF4U2R1U2l6ZSAqLworCQlmcmFtZVszXSA9IDB4MDI7IC8qIFZhbHVlIGxlbmd0aCAqLworCisJCXB1dF91bmFsaWduZWQoY3B1X3RvX2JlMTYoKF9fdTE2KSBtYXhfc2R1X3NpemUpLAorCQkJICAgICAgKF9fdTE2ICopKGZyYW1lKzQpKTsKKwl9IGVsc2UgeworCQkvKiBJbnNlcnQgVFRQIGhlYWRlciAqLworCQlmcmFtZSA9IHNrYl9wdXNoKHR4X3NrYiwgVFRQX0hFQURFUik7CisKKwkJZnJhbWVbMF0gPSBuICYgMHg3ZjsKKwl9CisKKwlyZXQgPSBpcmxtcF9jb25uZWN0X3Jlc3BvbnNlKHNlbGYtPmxzYXAsIHR4X3NrYik7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpcnR0cF9jb25uZWN0X3Jlc3BvbnNlKTsKKworLyoKKyAqIEZ1bmN0aW9uIGlydHRwX2R1cCAoc2VsZiwgaW5zdGFuY2UpCisgKgorICogICAgRHVwbGljYXRlIFRTQVAsIGNhbiBiZSB1c2VkIGJ5IHNlcnZlcnMgdG8gY29uZmlybSBhIGNvbm5lY3Rpb24gb24gYQorICogICAgbmV3IFRTQVAgc28gaXQgY2FuIGtlZXAgbGlzdGVuaW5nIG9uIHRoZSBvbGQgb25lLgorICovCitzdHJ1Y3QgdHNhcF9jYiAqaXJ0dHBfZHVwKHN0cnVjdCB0c2FwX2NiICpvcmlnLCB2b2lkICppbnN0YW5jZSkKK3sKKwlzdHJ1Y3QgdHNhcF9jYiAqbmV3OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlJUkRBX0RFQlVHKDEsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogUHJvdGVjdCBvdXIgYWNjZXNzIHRvIHRoZSBvbGQgdHNhcCBpbnN0YW5jZSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpcnR0cC0+dHNhcHMtPmhiX3NwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBGaW5kIHRoZSBvbGQgaW5zdGFuY2UgKi8KKwlpZiAoIWhhc2hiaW5fZmluZChpcnR0cC0+dHNhcHMsIChsb25nKSBvcmlnLCBOVUxMKSkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCB1bmFibGUgdG8gZmluZCBUU0FQXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnR0cC0+dHNhcHMtPmhiX3NwaW5sb2NrLCBmbGFncyk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIEFsbG9jYXRlIGEgbmV3IGluc3RhbmNlICovCisJbmV3ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHRzYXBfY2IpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIW5ldykgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCB1bmFibGUgdG8ga21hbGxvY1xuIiwgX19GVU5DVElPTl9fKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJ0dHAtPnRzYXBzLT5oYl9zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLyogRHVwICovCisJbWVtY3B5KG5ldywgb3JpZywgc2l6ZW9mKHN0cnVjdCB0c2FwX2NiKSk7CisKKwkvKiBXZSBkb24ndCBuZWVkIHRoZSBvbGQgaW5zdGFuY2UgYW55IG1vcmUgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnR0cC0+dHNhcHMtPmhiX3NwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBUcnkgdG8gZHVwIHRoZSBMU0FQIChtYXkgZmFpbCBpZiB3ZSB3ZXJlIHRvbyBzbG93KSAqLworCW5ldy0+bHNhcCA9IGlybG1wX2R1cChvcmlnLT5sc2FwLCBuZXcpOworCWlmICghbmV3LT5sc2FwKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGR1cCBmYWlsZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlrZnJlZShuZXcpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBOb3QgZXZlcnl0aGluZyBzaG91bGQgYmUgY29waWVkICovCisJbmV3LT5ub3RpZnkuaW5zdGFuY2UgPSBpbnN0YW5jZTsKKwlpbml0X3RpbWVyKCZuZXctPnRvZG9fdGltZXIpOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbmV3LT5yeF9xdWV1ZSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbmV3LT50eF9xdWV1ZSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbmV3LT5yeF9mcmFnbWVudHMpOworCisJLyogVGhpcyBpcyBsb2NrZWQgKi8KKwloYXNoYmluX2luc2VydChpcnR0cC0+dHNhcHMsIChpcmRhX3F1ZXVlX3QgKikgbmV3LCAobG9uZykgbmV3LCBOVUxMKTsKKworCXJldHVybiBuZXc7Cit9CitFWFBPUlRfU1lNQk9MKGlydHRwX2R1cCk7CisKKy8qCisgKiBGdW5jdGlvbiBpcnR0cF9kaXNjb25uZWN0X3JlcXVlc3QgKHNlbGYpCisgKgorICogICAgQ2xvc2UgdGhpcyBjb25uZWN0aW9uIHBsZWFzZSEgSWYgcHJpb3JpdHkgaXMgaGlnaCwgdGhlIHF1ZXVlZCBkYXRhCisgKiAgICBzZWdtZW50cywgaWYgYW55LCB3aWxsIGJlIGRlYWxsb2NhdGVkIGZpcnN0CisgKgorICovCitpbnQgaXJ0dHBfZGlzY29ubmVjdF9yZXF1ZXN0KHN0cnVjdCB0c2FwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqdXNlcmRhdGEsCisJCQkgICAgIGludCBwcmlvcml0eSkKK3sKKwlpbnQgcmV0OworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwkvKiBBbHJlYWR5IGRpc2Nvbm5lY3RlZD8gKi8KKwlpZiAoIXNlbGYtPmNvbm5lY3RlZCkgeworCQlJUkRBX0RFQlVHKDQsICIlcygpLCBhbHJlYWR5IGRpc2Nvbm5lY3RlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWlmICh1c2VyZGF0YSkKKwkJCWRldl9rZnJlZV9za2IodXNlcmRhdGEpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogRGlzY29ubmVjdCBhbHJlYWR5IHBlbmRpbmcgPworCSAqIFdlIG5lZWQgdG8gdXNlIGFuIGF0b21pYyBvcGVyYXRpb24gdG8gcHJldmVudCByZWVudHJ5LiBUaGlzCisJICogZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBmcm9tIHZhcmlvdXMgY29udGV4dCwgbGlrZSB1c2VyLCB0aW1lcgorCSAqIGZvciBmb2xsb3dpbmcgYSBkaXNjb25uZWN0X2luZGljYXRpb24oKSAoaS5lLiBuZXRfYmgpLgorCSAqIEplYW4gSUkgKi8KKwlpZih0ZXN0X2FuZF9zZXRfYml0KDAsICZzZWxmLT5kaXNjb25uZWN0X3BlbmQpKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGRpc2Nvbm5lY3QgYWxyZWFkeSBwZW5kaW5nXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJaWYgKHVzZXJkYXRhKQorCQkJZGV2X2tmcmVlX3NrYih1c2VyZGF0YSk7CisKKwkJLyogVHJ5IHRvIG1ha2Ugc29tZSBwcm9ncmVzcyAqLworCQlpcnR0cF9ydW5fdHhfcXVldWUoc2VsZik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqICBDaGVjayBpZiB0aGVyZSBpcyBzdGlsbCBkYXRhIHNlZ21lbnRzIGluIHRoZSB0cmFuc21pdCBxdWV1ZQorCSAqLworCWlmIChza2JfcXVldWVfbGVuKCZzZWxmLT50eF9xdWV1ZSkgPiAwKSB7CisJCWlmIChwcmlvcml0eSA9PSBQX0hJR0gpIHsKKwkJCS8qCisJCQkgKiAgTm8gbmVlZCB0byBzZW5kIHRoZSBxdWV1ZWQgZGF0YSwgaWYgd2UgYXJlCisJCQkgKiAgZGlzY29ubmVjdGluZyByaWdodCBub3cgc2luY2UgdGhlIGRhdGEgd2lsbAorCQkJICogIG5vdCBoYXZlIGFueSB1c2FibGUgY29ubmVjdGlvbiB0byBiZSBzZW50IG9uCisJCQkgKi8KKwkJCUlSREFfREVCVUcoMSwgIiVzKCk6IEhpZ2ggcHJpb3JpdHkhISgpXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJaXJ0dHBfZmx1c2hfcXVldWVzKHNlbGYpOworCQl9IGVsc2UgaWYgKHByaW9yaXR5ID09IFBfTk9STUFMKSB7CisJCQkvKgorCQkJICogIE11c3QgZGVsYXkgZGlzY29ubmVjdCB1bnRpbCBhZnRlciBhbGwgZGF0YSBzZWdtZW50cworCQkJICogIGhhdmUgYmVlbiBzZW50IGFuZCB0aGUgdHhfcXVldWUgaXMgZW1wdHkKKwkJCSAqLworCQkJLyogV2UnbGwgcmV1c2UgdGhpcyBvbmUgbGF0ZXIgZm9yIHRoZSBkaXNjb25uZWN0ICovCisJCQlzZWxmLT5kaXNjb25uZWN0X3NrYiA9IHVzZXJkYXRhOyAgLyogTWF5IGJlIE5VTEwgKi8KKworCQkJaXJ0dHBfcnVuX3R4X3F1ZXVlKHNlbGYpOworCisJCQlpcnR0cF9zdGFydF90b2RvX3RpbWVyKHNlbGYsIEhaLzEwKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwkvKiBOb3RlIDogd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBpZiBzZWxmLT5yeF9xdWV1ZSBpcyBmdWxsIGFuZCB0aGUKKwkgKiBzdGF0ZSBvZiBzZWxmLT5yeF9zZHVfYnVzeSBiZWNhdXNlIHRoZSBkaXNjb25uZWN0IHJlc3BvbnNlIHdpbGwKKwkgKiBiZSBzZW50IGF0IHRoZSBMTVAgbGV2ZWwgKHNvIGV2ZW4gaWYgdGhlIHBlZXIgaGFzIGl0cyBUeCBxdWV1ZQorCSAqIGZ1bGwgb2YgZGF0YSkuIC0gSmVhbiBJSSAqLworCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgRGlzY29ubmVjdGluZyAuLi5cbiIsIF9fRlVOQ1RJT05fXyk7CisJc2VsZi0+Y29ubmVjdGVkID0gRkFMU0U7CisKKwlpZiAoIXVzZXJkYXRhKSB7CisJCXN0cnVjdCBza19idWZmICp0eF9za2I7CisJCXR4X3NrYiA9IGRldl9hbGxvY19za2IoNjQpOworCQlpZiAoIXR4X3NrYikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCS8qCisJCSAqICBSZXNlcnZlIHNwYWNlIGZvciBNVVggYW5kIExBUCBoZWFkZXIKKwkJICovCisJCXNrYl9yZXNlcnZlKHR4X3NrYiwgVFRQX01BWF9IRUFERVIpOworCisJCXVzZXJkYXRhID0gdHhfc2tiOworCX0KKwlyZXQgPSBpcmxtcF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZi0+bHNhcCwgdXNlcmRhdGEpOworCisJLyogVGhlIGRpc2Nvbm5lY3QgaXMgbm8gbG9uZ2VyIHBlbmRpbmcgKi8KKwljbGVhcl9iaXQoMCwgJnNlbGYtPmRpc2Nvbm5lY3RfcGVuZCk7CS8qIEZBTFNFICovCisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpcnR0cF9kaXNjb25uZWN0X3JlcXVlc3QpOworCisvKgorICogRnVuY3Rpb24gaXJ0dHBfZGlzY29ubmVjdF9pbmRpY2F0aW9uIChzZWxmLCByZWFzb24pCisgKgorICogICAgRGlzY29ubmVjdCBpbmRpY2F0aW9uLCBUU0FQIGRpc2Nvbm5lY3RlZCBieSBwZWVyPworICoKKyAqLwordm9pZCBpcnR0cF9kaXNjb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgTE1fUkVBU09OIHJlYXNvbiwKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgdHNhcF9jYiAqc2VsZjsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzZWxmID0gKHN0cnVjdCB0c2FwX2NiICopIGluc3RhbmNlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuOyk7CisKKwkvKiBQcmV2ZW50IGhpZ2hlciBsYXllciB0byBzZW5kIG1vcmUgZGF0YSAqLworCXNlbGYtPmNvbm5lY3RlZCA9IEZBTFNFOworCisJLyogQ2hlY2sgaWYgY2xpZW50IGhhcyBhbHJlYWR5IHRyaWVkIHRvIGNsb3NlIHRoZSBUU0FQICovCisJaWYgKHNlbGYtPmNsb3NlX3BlbmQpIHsKKwkJLyogSW4gdGhpcyBjYXNlLCB0aGUgaGlnaGVyIGxheWVyIGlzIHByb2JhYmx5IGdvbmUuIERvbid0CisJCSAqIGJvdGhlciBpdCBhbmQgY2xlYW4gdXAgdGhlIHJlbWFpbnMgLSBKZWFuIElJICovCisJCWlmIChza2IpCisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCWlydHRwX2Nsb3NlX3RzYXAoc2VsZik7CisJCXJldHVybjsKKwl9CisKKwkvKiBJZiB3ZSBhcmUgaGVyZSwgd2UgYXNzdW1lIHRoYXQgaXMgdGhlIGhpZ2hlciBsYXllciBpcyBzdGlsbAorCSAqIHdhaXRpbmcgZm9yIHRoZSBkaXNjb25uZWN0IG5vdGlmaWNhdGlvbiBhbmQgYWJsZSB0byBwcm9jZXNzIGl0LAorCSAqIGV2ZW4gaWYgaGUgdHJpZWQgdG8gZGlzY29ubmVjdC4gT3RoZXJ3aXNlLCBpdCB3b3VsZCBoYXZlIGFscmVhZHkKKwkgKiBhdHRlbXB0ZWQgdG8gY2xvc2UgdGhlIHRzYXAgYW5kIHNlbGYtPmNsb3NlX3BlbmQgd291bGQgYmUgVFJVRS4KKwkgKiBKZWFuIElJICovCisKKwkvKiBObyBuZWVkIHRvIG5vdGlmeSB0aGUgY2xpZW50IGlmIGhhcyBhbHJlYWR5IHRyaWVkIHRvIGRpc2Nvbm5lY3QgKi8KKwlpZihzZWxmLT5ub3RpZnkuZGlzY29ubmVjdF9pbmRpY2F0aW9uKQorCQlzZWxmLT5ub3RpZnkuZGlzY29ubmVjdF9pbmRpY2F0aW9uKHNlbGYtPm5vdGlmeS5pbnN0YW5jZSwgc2VsZiwKKwkJCQkJCSAgIHJlYXNvbiwgc2tiKTsKKwllbHNlCisJCWlmIChza2IpCisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnR0cF9kb19kYXRhX2luZGljYXRpb24gKHNlbGYsIHNrYikKKyAqCisgKiAgICBUcnkgdG8gZGVsaXZlciByZWFzc2VtYmxlZCBza2IgdG8gbGF5ZXIgYWJvdmUsIGFuZCByZXF1ZXVlIGl0IGlmIHRoYXQKKyAqICAgIGZvciBzb21lIHJlYXNvbiBzaG91bGQgZmFpbC4gV2UgbWFyayByeCBzZHUgYXMgYnVzeSB0byBhcHBseSBiYWNrCisgKiAgICBwcmVzc3VyZSBpcyBuZWNlc3NhcnkuCisgKi8KK3N0YXRpYyB2b2lkIGlydHRwX2RvX2RhdGFfaW5kaWNhdGlvbihzdHJ1Y3QgdHNhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgZXJyOworCisJLyogQ2hlY2sgaWYgY2xpZW50IGhhcyBhbHJlYWR5IGNsb3NlZCB0aGUgVFNBUCBhbmQgZ29uZSBhd2F5ICovCisJaWYgKHNlbGYtPmNsb3NlX3BlbmQpIHsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorCisJZXJyID0gc2VsZi0+bm90aWZ5LmRhdGFfaW5kaWNhdGlvbihzZWxmLT5ub3RpZnkuaW5zdGFuY2UsIHNlbGYsIHNrYik7CisKKwkvKiBVc3VhbGx5IHRoZSBsYXllciBhYm92ZSB3aWxsIG5vdGlmeSB0aGF0IGl0J3MgaW5wdXQgcXVldWUgaXMKKwkgKiBzdGFydGluZyB0byBnZXQgZmlsbGVkIGJ5IHVzaW5nIHRoZSBmbG93IHJlcXVlc3QsIGJ1dCB0aGlzIG1heQorCSAqIGJlIGRpZmZpY3VsdCwgc28gaXQgY2FuIGluc3RlYWQganVzdCByZWZ1c2UgdG8gZWF0IGl0IGFuZCBqdXN0CisJICogZ2l2ZSBhbiBlcnJvciBiYWNrCisJICovCisJaWYgKGVycikgeworCQlJUkRBX0RFQlVHKDAsICIlcygpIHJlcXVldWVpbmcgc2tiIVxuIiwgX19GVU5DVElPTl9fKTsKKworCQkvKiBNYWtlIHN1cmUgd2UgdGFrZSBhIGJyZWFrICovCisJCXNlbGYtPnJ4X3NkdV9idXN5ID0gVFJVRTsKKworCQkvKiBOZWVkIHRvIHB1c2ggdGhlIGhlYWRlciBpbiBhZ2FpbiAqLworCQlza2JfcHVzaChza2IsIFRUUF9IRUFERVIpOworCQlza2ItPmRhdGFbMF0gPSAweDAwOyAvKiBNYWtlIHN1cmUgTU9SRSBiaXQgaXMgY2xlYXJlZCAqLworCisJCS8qIFB1dCBza2IgYmFjayBvbiBxdWV1ZSAqLworCQlza2JfcXVldWVfaGVhZCgmc2VsZi0+cnhfcXVldWUsIHNrYik7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJ0dHBfcnVuX3J4X3F1ZXVlIChzZWxmKQorICoKKyAqICAgICBDaGVjayBpZiB3ZSBoYXZlIGFueSBmcmFtZXMgdG8gYmUgdHJhbnNtaXR0ZWQsIG9yIGlmIHdlIGhhdmUgYW55CisgKiAgICAgYXZhaWxhYmxlIGNyZWRpdCB0byBnaXZlIGF3YXkuCisgKi8KK3ZvaWQgaXJ0dHBfcnVuX3J4X3F1ZXVlKHN0cnVjdCB0c2FwX2NiICpzZWxmKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IG1vcmUgPSAwOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSBzZW5kPSVkLGF2YWlsPSVkLHJlbW90ZT0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkgICBzZWxmLT5zZW5kX2NyZWRpdCwgc2VsZi0+YXZhaWxfY3JlZGl0LCBzZWxmLT5yZW1vdGVfY3JlZGl0KTsKKworCS8qIEdldCBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSByeCBxdWV1ZSwgb3RoZXJ3aXNlIGRvbid0IHRvdWNoIGl0ICovCisJaWYgKGlyZGFfbG9jaygmc2VsZi0+cnhfcXVldWVfbG9jaykgPT0gRkFMU0UpCisJCXJldHVybjsKKworCS8qCisJICogIFJlYXNzZW1ibGUgYWxsIGZyYW1lcyBpbiByZWNlaXZlIHF1ZXVlIGFuZCBkZWxpdmVyIHRoZW0KKwkgKi8KKwl3aGlsZSAoIXNlbGYtPnJ4X3NkdV9idXN5ICYmIChza2IgPSBza2JfZGVxdWV1ZSgmc2VsZi0+cnhfcXVldWUpKSkgeworCQkvKiBUaGlzIGJpdCB3aWxsIHRlbGwgdXMgaWYgaXQncyB0aGUgbGFzdCBmcmFnbWVudCBvciBub3QgKi8KKwkJbW9yZSA9IHNrYi0+ZGF0YVswXSAmIDB4ODA7CisKKwkJLyogUmVtb3ZlIFRUUCBoZWFkZXIgKi8KKwkJc2tiX3B1bGwoc2tiLCBUVFBfSEVBREVSKTsKKworCQkvKiBBZGQgdGhlIGxlbmd0aCBvZiB0aGUgcmVtYWluaW5nIGRhdGEgKi8KKwkJc2VsZi0+cnhfc2R1X3NpemUgKz0gc2tiLT5sZW47CisKKwkJLyoKKwkJICogSWYgU0FSIGlzIGRpc2FibGVkLCBvciB1c2VyIGhhcyByZXF1ZXN0ZWQgbm8gcmVhc3NlbWJseQorCQkgKiBvZiByZWNlaXZlZCBmcmFnbWVudHMgdGhlbiB3ZSBqdXN0IGRlbGl2ZXIgdGhlbQorCQkgKiBpbW1lZGlhdGVseS4gVGhpcyBjYW4gYmUgcmVxdWVzdGVkIGJ5IGNsaWVudHMgdGhhdAorCQkgKiBpbXBsZW1lbnRzIGJ5dGUgc3RyZWFtcyB3aXRob3V0IGFueSBtZXNzYWdlIGJvdW5kYXJpZXMKKwkJICovCisJCWlmIChzZWxmLT5yeF9tYXhfc2R1X3NpemUgPT0gVFRQX1NBUl9ESVNBQkxFKSB7CisJCQlpcnR0cF9kb19kYXRhX2luZGljYXRpb24oc2VsZiwgc2tiKTsKKwkJCXNlbGYtPnJ4X3NkdV9zaXplID0gMDsKKworCQkJY29udGludWU7CisJCX0KKworCQkvKiBDaGVjayBpZiB0aGlzIGlzIGEgZnJhZ21lbnQsIGFuZCBub3QgdGhlIGxhc3QgZnJhZ21lbnQgKi8KKwkJaWYgKG1vcmUpIHsKKwkJCS8qCisJCQkgKiAgUXVldWUgdGhlIGZyYWdtZW50IGlmIHdlIHN0aWxsIGFyZSB3aXRoaW4gdGhlCisJCQkgKiAgbGltaXRzIG9mIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHJ4X3NkdQorCQkJICovCisJCQlpZiAoc2VsZi0+cnhfc2R1X3NpemUgPD0gc2VsZi0+cnhfbWF4X3NkdV9zaXplKSB7CisJCQkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgcXVldWVpbmcgZnJhZ1xuIiwKKwkJCQkJICAgX19GVU5DVElPTl9fKTsKKwkJCQlza2JfcXVldWVfdGFpbCgmc2VsZi0+cnhfZnJhZ21lbnRzLCBza2IpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBGcmVlIHRoZSBwYXJ0IG9mIHRoZSBTRFUgdGhhdCBpcyB0b28gYmlnICovCisJCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJLyoKKwkJICogIFRoaXMgaXMgdGhlIGxhc3QgZnJhZ21lbnQsIHNvIHRpbWUgdG8gcmVhc3NlbWJsZSEKKwkJICovCisJCWlmICgoc2VsZi0+cnhfc2R1X3NpemUgPD0gc2VsZi0+cnhfbWF4X3NkdV9zaXplKSB8fAorCQkgICAgKHNlbGYtPnJ4X21heF9zZHVfc2l6ZSA9PSBUVFBfU0FSX1VOQk9VTkQpKQorCQl7CisJCQkvKgorCQkJICogQSBsaXR0bGUgb3B0aW1pemluZy4gT25seSBxdWV1ZSB0aGUgZnJhZ21lbnQgaWYKKwkJCSAqIHRoZXJlIGFyZSBvdGhlciBmcmFnbWVudHMuIFNpbmNlIGlmIHRoaXMgaXMgdGhlCisJCQkgKiBsYXN0IGFuZCBvbmx5IGZyYWdtZW50LCB0aGVyZSBpcyBubyBuZWVkIHRvCisJCQkgKiByZWFzc2VtYmxlIDotKQorCQkJICovCisJCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2VsZi0+cnhfZnJhZ21lbnRzKSkgeworCQkJCXNrYl9xdWV1ZV90YWlsKCZzZWxmLT5yeF9mcmFnbWVudHMsCisJCQkJCSAgICAgICBza2IpOworCisJCQkJc2tiID0gaXJ0dHBfcmVhc3NlbWJsZV9za2Ioc2VsZik7CisJCQl9CisKKwkJCS8qIE5vdyB3ZSBjYW4gZGVsaXZlciB0aGUgcmVhc3NlbWJsZWQgc2tiICovCisJCQlpcnR0cF9kb19kYXRhX2luZGljYXRpb24oc2VsZiwgc2tiKTsKKwkJfSBlbHNlIHsKKwkJCUlSREFfREVCVUcoMSwgIiVzKCksIFRydW5jYXRlZCBmcmFtZVxuIiwgX19GVU5DVElPTl9fKTsKKworCQkJLyogRnJlZSB0aGUgcGFydCBvZiB0aGUgU0RVIHRoYXQgaXMgdG9vIGJpZyAqLworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCisJCQkvKiBEZWxpdmVyIG9ubHkgdGhlIHZhbGlkIGJ1dCB0cnVuY2F0ZWQgcGFydCBvZiBTRFUgKi8KKwkJCXNrYiA9IGlydHRwX3JlYXNzZW1ibGVfc2tiKHNlbGYpOworCisJCQlpcnR0cF9kb19kYXRhX2luZGljYXRpb24oc2VsZiwgc2tiKTsKKwkJfQorCQlzZWxmLT5yeF9zZHVfc2l6ZSA9IDA7CisJfQorCisJLyoKKwkgKiBJdCdzIG5vdCB0cml2aWFsIHRvIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgY3JlZGl0cyBhcmUgYXZhaWxhYmxlCisJICogYnkgaW5jcmVtZW50aW5nIGF0IGVhY2ggcGFja2V0LCBiZWNhdXNlIGRlbGl2ZXJ5IG1heSBmYWlsCisJICogKGlydHRwX2RvX2RhdGFfaW5kaWNhdGlvbigpIG1heSByZXF1ZXVlIHRoZSBmcmFtZSkgYW5kIGJlY2F1c2UKKwkgKiB3ZSBuZWVkIHRvIHRha2UgY2FyZSBvZiBmcmFnbWVudGF0aW9uLgorCSAqIFdlIHdhbnQgdGhlIG90aGVyIHNpZGUgdG8gc2VuZCB1cCB0byBpbml0aWFsX2NyZWRpdCBwYWNrZXRzLgorCSAqIFdlIGhhdmUgc29tZSBmcmFtZXMgaW4gb3VyIHF1ZXVlcywgYW5kIHdlIGhhdmUgYWxyZWFkeSBhbGxvd2VkIGl0CisJICogdG8gc2VuZCByZW1vdGVfY3JlZGl0LgorCSAqIE5vIG5lZWQgdG8gc3BpbmxvY2ssIHdyaXRlIGlzIGF0b21pYyBhbmQgc2VsZiBjb3JyZWN0aW5nLi4uCisJICogSmVhbiBJSQorCSAqLworCXNlbGYtPmF2YWlsX2NyZWRpdCA9IChzZWxmLT5pbml0aWFsX2NyZWRpdCAtCisJCQkgICAgICAoc2VsZi0+cmVtb3RlX2NyZWRpdCArCisJCQkgICAgICAgc2tiX3F1ZXVlX2xlbigmc2VsZi0+cnhfcXVldWUpICsKKwkJCSAgICAgICBza2JfcXVldWVfbGVuKCZzZWxmLT5yeF9mcmFnbWVudHMpKSk7CisKKwkvKiBEbyB3ZSBoYXZlIHRvbyBtdWNoIGNyZWRpdHMgdG8gc2VuZCB0byBwZWVyID8gKi8KKwlpZiAoKHNlbGYtPnJlbW90ZV9jcmVkaXQgPD0gVFRQX1JYX01JTl9DUkVESVQpICYmCisJICAgIChzZWxmLT5hdmFpbF9jcmVkaXQgPiAwKSkgeworCQkvKiBTZW5kIGV4cGxpY2l0IGNyZWRpdCBmcmFtZSAqLworCQlpcnR0cF9naXZlX2NyZWRpdChzZWxmKTsKKwkJLyogTm90ZSA6IGRvICpOT1QqIGNoZWNrIGlmIHR4X3F1ZXVlIGlzIG5vbi1lbXB0eSwgdGhhdAorCQkgKiB3aWxsIHByb2R1Y2UgZGVhZGxvY2tzLiBJIHJlcGVhdCA6IHNlbmQgYSBjcmVkaXQgZnJhbWUKKwkJICogZXZlbiBpZiB3ZSBoYXZlIHNvbWV0aGluZyB0byBzZW5kIGluIG91ciBUeCBxdWV1ZS4KKwkJICogSWYgd2UgaGF2ZSBjcmVkaXRzLCBpdCBtZWFucyB0aGF0IG91ciBUeCBxdWV1ZSBpcyBibG9ja2VkLgorCQkgKgorCQkgKiBMZXQncyBzdXBwb3NlIHRoZSBwZWVyIGNhbid0IGtlZXAgdXAgd2l0aCBvdXIgVHguIEhlIHdpbGwKKwkJICogZmxvdyBjb250cm9sIHVzIGJ5IG5vdCBzZW5kaW5nIHVzIGFueSBjcmVkaXRzLCBhbmQgd2UKKwkJICogd2lsbCBzdG9wIFR4IGFuZCBzdGFydCBhY2N1bXVsYXRpbmcgY3JlZGl0cyBoZXJlLgorCQkgKiBVcCB0byB0aGUgcG9pbnQgd2hlcmUgdGhlIHBlZXIgd2lsbCBzdG9wIGl0cyBUeCBxdWV1ZSwKKwkJICogZm9yIGxhY2sgb2YgY3JlZGl0cy4KKwkJICogTGV0J3MgYXNzdW1lIHRoZSBwZWVyIGFwcGxpY2F0aW9uIGlzIHNpbmdsZSB0aHJlYWRlZC4KKwkJICogSXQgd2lsbCBibG9jayBvbiBUeCBhbmQgbmV2ZXIgY29uc3VtZSBhbnkgUnggYnVmZmVyLgorCQkgKiBEZWFkbG9jay4gR3VhcmFudGVlZC4gLSBKZWFuIElJCisJCSAqLworCX0KKworCS8qIFJlc2V0IGxvY2sgKi8KKwlzZWxmLT5yeF9xdWV1ZV9sb2NrID0gMDsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdHJ1Y3QgaXJ0dHBfaXRlcl9zdGF0ZSB7CisJaW50IGlkOworfTsKKworc3RhdGljIHZvaWQgKmlydHRwX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGlydHRwX2l0ZXJfc3RhdGUgKml0ZXIgPSBzZXEtPnByaXZhdGU7CisJc3RydWN0IHRzYXBfY2IgKnNlbGY7CisKKwkvKiBQcm90ZWN0IG91ciBhY2Nlc3MgdG8gdGhlIHRzYXAgbGlzdCAqLworCXNwaW5fbG9ja19pcnEoJmlydHRwLT50c2Fwcy0+aGJfc3BpbmxvY2spOworCWl0ZXItPmlkID0gMDsKKworCWZvciAoc2VsZiA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBoYXNoYmluX2dldF9maXJzdChpcnR0cC0+dHNhcHMpOyAKKwkgICAgIHNlbGYgIT0gTlVMTDsKKwkgICAgIHNlbGYgPSAoc3RydWN0IHRzYXBfY2IgKikgaGFzaGJpbl9nZXRfbmV4dChpcnR0cC0+dHNhcHMpKSB7CisJCWlmIChpdGVyLT5pZCA9PSAqcG9zKQorCQkJYnJlYWs7CisJCSsraXRlci0+aWQ7CisJfQorCQkKKwlyZXR1cm4gc2VsZjsKK30KKworc3RhdGljIHZvaWQgKmlydHRwX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaXJ0dHBfaXRlcl9zdGF0ZSAqaXRlciA9IHNlcS0+cHJpdmF0ZTsKKworCSsrKnBvczsKKwkrK2l0ZXItPmlkOworCXJldHVybiAodm9pZCAqKSBoYXNoYmluX2dldF9uZXh0KGlydHRwLT50c2Fwcyk7Cit9CisKK3N0YXRpYyB2b2lkIGlydHRwX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXNwaW5fdW5sb2NrX2lycSgmaXJ0dHAtPnRzYXBzLT5oYl9zcGlubG9jayk7Cit9CisKK3N0YXRpYyBpbnQgaXJ0dHBfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJY29uc3Qgc3RydWN0IGlydHRwX2l0ZXJfc3RhdGUgKml0ZXIgPSBzZXEtPnByaXZhdGU7CisJY29uc3Qgc3RydWN0IHRzYXBfY2IgKnNlbGYgPSB2OworCisJc2VxX3ByaW50ZihzZXEsICJUU0FQICVkLCAiLCBpdGVyLT5pZCk7CisJc2VxX3ByaW50ZihzZXEsICJzdHNhcF9zZWw6ICUwMngsICIsCisJCSAgIHNlbGYtPnN0c2FwX3NlbCk7CisJc2VxX3ByaW50ZihzZXEsICJkdHNhcF9zZWw6ICUwMnhcbiIsCisJCSAgIHNlbGYtPmR0c2FwX3NlbCk7CisJc2VxX3ByaW50ZihzZXEsICIgIGNvbm5lY3RlZDogJXMsICIsCisJCSAgIHNlbGYtPmNvbm5lY3RlZD8gIlRSVUUiOiJGQUxTRSIpOworCXNlcV9wcmludGYoc2VxLCAiYXZhaWwgY3JlZGl0OiAlZCwgIiwKKwkJICAgc2VsZi0+YXZhaWxfY3JlZGl0KTsKKwlzZXFfcHJpbnRmKHNlcSwgInJlbW90ZSBjcmVkaXQ6ICVkLCAiLAorCQkgICBzZWxmLT5yZW1vdGVfY3JlZGl0KTsKKwlzZXFfcHJpbnRmKHNlcSwgInNlbmQgY3JlZGl0OiAlZFxuIiwKKwkJICAgc2VsZi0+c2VuZF9jcmVkaXQpOworCXNlcV9wcmludGYoc2VxLCAiICB0eCBwYWNrZXRzOiAlbGQsICIsCisJCSAgIHNlbGYtPnN0YXRzLnR4X3BhY2tldHMpOworCXNlcV9wcmludGYoc2VxLCAicnggcGFja2V0czogJWxkLCAiLAorCQkgICBzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKTsKKwlzZXFfcHJpbnRmKHNlcSwgInR4X3F1ZXVlIGxlbjogJWQgIiwKKwkJICAgc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhfcXVldWUpKTsKKwlzZXFfcHJpbnRmKHNlcSwgInJ4X3F1ZXVlIGxlbjogJWRcbiIsCisJCSAgIHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnJ4X3F1ZXVlKSk7CisJc2VxX3ByaW50ZihzZXEsICIgIHR4X3NkdV9idXN5OiAlcywgIiwKKwkJICAgc2VsZi0+dHhfc2R1X2J1c3k/ICJUUlVFIjoiRkFMU0UiKTsKKwlzZXFfcHJpbnRmKHNlcSwgInJ4X3NkdV9idXN5OiAlc1xuIiwKKwkJICAgc2VsZi0+cnhfc2R1X2J1c3k/ICJUUlVFIjoiRkFMU0UiKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgbWF4X3NlZ19zaXplOiAlZCwgIiwKKwkJICAgc2VsZi0+bWF4X3NlZ19zaXplKTsKKwlzZXFfcHJpbnRmKHNlcSwgInR4X21heF9zZHVfc2l6ZTogJWQsICIsCisJCSAgIHNlbGYtPnR4X21heF9zZHVfc2l6ZSk7CisJc2VxX3ByaW50ZihzZXEsICJyeF9tYXhfc2R1X3NpemU6ICVkXG4iLAorCQkgICBzZWxmLT5yeF9tYXhfc2R1X3NpemUpOworCisJc2VxX3ByaW50ZihzZXEsICIgIFVzZWQgYnkgKCVzKVxuXG4iLAorCQkgICBzZWxmLT5ub3RpZnkubmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaXJ0dHBfc2VxX29wcyA9IHsKKwkuc3RhcnQgID0gaXJ0dHBfc2VxX3N0YXJ0LAorCS5uZXh0ICAgPSBpcnR0cF9zZXFfbmV4dCwKKwkuc3RvcCAgID0gaXJ0dHBfc2VxX3N0b3AsCisJLnNob3cgICA9IGlydHRwX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBpcnR0cF9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKKwlpbnQgcmMgPSAtRU5PTUVNOworCXN0cnVjdCBpcnR0cF9pdGVyX3N0YXRlICpzOworICAgICAgIAorCUlSREFfQVNTRVJUKGlydHRwICE9IE5VTEwsIHJldHVybiAtRUlOVkFMOyk7CisKKwlzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXMpCisJCWdvdG8gb3V0OworCisJcmMgPSBzZXFfb3BlbihmaWxlLCAmaXJ0dHBfc2VxX29wcyk7CisJaWYgKHJjKQorCQlnb3RvIG91dF9rZnJlZTsKKworCXNlcQkgICAgID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNlcS0+cHJpdmF0ZSA9IHM7CisJbWVtc2V0KHMsIDAsIHNpemVvZigqcykpOworb3V0OgorCXJldHVybiByYzsKK291dF9rZnJlZToKKwlrZnJlZShzKTsKKwlnb3RvIG91dDsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcnR0cF9zZXFfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgICAgICAgID0gaXJ0dHBfc2VxX29wZW4sCisJLnJlYWQgICAgICAgICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgICAgICAgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2VfcHJpdmF0ZSwKK307CisKKyNlbmRpZiAvKiBQUk9DX0ZTICovCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9wYXJhbWV0ZXJzLmMgYi9uZXQvaXJkYS9wYXJhbWV0ZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMyNDk0MgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL3BhcmFtZXRlcnMuYwpAQCAtMCwwICsxLDU4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZpbGVuYW1lOiAgICAgIHBhcmFtZXRlcnMuYworICogVmVyc2lvbjogICAgICAgMS4wCisgKiBEZXNjcmlwdGlvbjogICBBIG1vcmUgZ2VuZXJhbCB3YXkgdG8gaGFuZGxlIChwaSxwbCxwdikgcGFyYW1ldGVycworICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgTW9uIEp1biAgNyAxMDoyNToxMSAxOTk5CisgKiBNb2RpZmllZCBhdDogICBTdW4gSmFuIDMwIDE0OjA4OjM5IDIwMDAKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9wYXJhbWV0ZXJzLmg+CisKK3N0YXRpYyBpbnQgaXJkYV9leHRyYWN0X2ludGVnZXIodm9pZCAqc2VsZiwgX191OCAqYnVmLCBpbnQgbGVuLCBfX3U4IHBpLAorCQkJCVBWX1RZUEUgdHlwZSwgUElfSEFORExFUiBmdW5jKTsKK3N0YXRpYyBpbnQgaXJkYV9leHRyYWN0X3N0cmluZyh2b2lkICpzZWxmLCBfX3U4ICpidWYsIGludCBsZW4sIF9fdTggcGksCisJCQkgICAgICAgUFZfVFlQRSB0eXBlLCBQSV9IQU5ETEVSIGZ1bmMpOworc3RhdGljIGludCBpcmRhX2V4dHJhY3Rfb2N0c2VxKHZvaWQgKnNlbGYsIF9fdTggKmJ1ZiwgaW50IGxlbiwgX191OCBwaSwKKwkJCSAgICAgICBQVl9UWVBFIHR5cGUsIFBJX0hBTkRMRVIgZnVuYyk7CitzdGF0aWMgaW50IGlyZGFfZXh0cmFjdF9ub192YWx1ZSh2b2lkICpzZWxmLCBfX3U4ICpidWYsIGludCBsZW4sIF9fdTggcGksCisJCQkJIFBWX1RZUEUgdHlwZSwgUElfSEFORExFUiBmdW5jKTsKKworc3RhdGljIGludCBpcmRhX2luc2VydF9pbnRlZ2VyKHZvaWQgKnNlbGYsIF9fdTggKmJ1ZiwgaW50IGxlbiwgX191OCBwaSwKKwkJCSAgICAgICBQVl9UWVBFIHR5cGUsIFBJX0hBTkRMRVIgZnVuYyk7CitzdGF0aWMgaW50IGlyZGFfaW5zZXJ0X25vX3ZhbHVlKHZvaWQgKnNlbGYsIF9fdTggKmJ1ZiwgaW50IGxlbiwgX191OCBwaSwKKwkJCQlQVl9UWVBFIHR5cGUsIFBJX0hBTkRMRVIgZnVuYyk7CisKK3N0YXRpYyBpbnQgaXJkYV9wYXJhbV91bnBhY2soX191OCAqYnVmLCBjaGFyICpmbXQsIC4uLik7CisKKy8qIFBhcmFtZXRlciB2YWx1ZSBjYWxsIHRhYmxlLiBNdXN0IG1hdGNoIFBWX1RZUEUgKi8KK3N0YXRpYyBQVl9IQU5ETEVSIHB2X2V4dHJhY3RfdGFibGVbXSA9IHsKKwlpcmRhX2V4dHJhY3RfaW50ZWdlciwgLyogSGFuZGxlciBmb3IgYW55IGxlbmd0aCBpbnRlZ2VycyAqLworCWlyZGFfZXh0cmFjdF9pbnRlZ2VyLCAvKiBIYW5kbGVyIGZvciA4ICBiaXRzIGludGVnZXJzICovCisJaXJkYV9leHRyYWN0X2ludGVnZXIsIC8qIEhhbmRsZXIgZm9yIDE2IGJpdHMgaW50ZWdlcnMgKi8KKwlpcmRhX2V4dHJhY3Rfc3RyaW5nLCAgLyogSGFuZGxlciBmb3Igc3RyaW5ncyAqLworCWlyZGFfZXh0cmFjdF9pbnRlZ2VyLCAvKiBIYW5kbGVyIGZvciAzMiBiaXRzIGludGVnZXJzICovCisJaXJkYV9leHRyYWN0X29jdHNlcSwgIC8qIEhhbmRsZXIgZm9yIG9jdGV0IHNlcXVlbmNlcyAqLworCWlyZGFfZXh0cmFjdF9ub192YWx1ZSAvKiBIYW5kbGVyIGZvciBubyB2YWx1ZSBwYXJhbWV0ZXJzICovCit9OworCitzdGF0aWMgUFZfSEFORExFUiBwdl9pbnNlcnRfdGFibGVbXSA9IHsKKwlpcmRhX2luc2VydF9pbnRlZ2VyLCAvKiBIYW5kbGVyIGZvciBhbnkgbGVuZ3RoIGludGVnZXJzICovCisJaXJkYV9pbnNlcnRfaW50ZWdlciwgLyogSGFuZGxlciBmb3IgOCAgYml0cyBpbnRlZ2VycyAqLworCWlyZGFfaW5zZXJ0X2ludGVnZXIsIC8qIEhhbmRsZXIgZm9yIDE2IGJpdHMgaW50ZWdlcnMgKi8KKwlOVUxMLCAgICAgICAgICAgICAgICAvKiBIYW5kbGVyIGZvciBzdHJpbmdzICovCisJaXJkYV9pbnNlcnRfaW50ZWdlciwgLyogSGFuZGxlciBmb3IgMzIgYml0cyBpbnRlZ2VycyAqLworCU5VTEwsICAgICAgICAgICAgICAgIC8qIEhhbmRsZXIgZm9yIG9jdGV0IHNlcXVlbmNlcyAqLworCWlyZGFfaW5zZXJ0X25vX3ZhbHVlIC8qIEhhbmRsZXIgZm9yIG5vIHZhbHVlIHBhcmFtZXRlcnMgKi8KK307CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2luc2VydF9ub192YWx1ZSAoc2VsZiwgYnVmLCBsZW4sIHBpLCB0eXBlLCBmdW5jKQorICovCitzdGF0aWMgaW50IGlyZGFfaW5zZXJ0X25vX3ZhbHVlKHZvaWQgKnNlbGYsIF9fdTggKmJ1ZiwgaW50IGxlbiwgX191OCBwaSwKKwkJCQlQVl9UWVBFIHR5cGUsIFBJX0hBTkRMRVIgZnVuYykKK3sKKwlpcmRhX3BhcmFtX3QgcDsKKwlpbnQgcmV0OworCisJcC5waSA9IHBpOworCXAucGwgPSAwOworCisJLyogQ2FsbCBoYW5kbGVyIGZvciB0aGlzIHBhcmFtZXRlciAqLworCXJldCA9ICgqZnVuYykoc2VsZiwgJnAsIFBWX0dFVCk7CisKKwkvKiBFeHRyYWN0IHZhbHVlcyBhbnl3YXksIHNpbmNlIGhhbmRsZXIgbWF5IG5lZWQgdGhlbSAqLworCWlyZGFfcGFyYW1fcGFjayhidWYsICJiYiIsIHAucGksIHAucGwpOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMjsgLyogSW5zZXJ0ZWQgcGwrMiBieXRlcyAqLworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9leHRyYWN0X25vX3ZhbHVlIChzZWxmLCBidWYsIGxlbiwgdHlwZSwgZnVuYykKKyAqCisgKiAgICBFeHRyYWN0cyBhIHBhcmFtZXRlciB3aXRob3V0IGEgcHYgZmllbGQgKHBsPTApCisgKgorICovCitzdGF0aWMgaW50IGlyZGFfZXh0cmFjdF9ub192YWx1ZSh2b2lkICpzZWxmLCBfX3U4ICpidWYsIGludCBsZW4sIF9fdTggcGksCisJCQkJIFBWX1RZUEUgdHlwZSwgUElfSEFORExFUiBmdW5jKQoreworCWlyZGFfcGFyYW1fdCBwOworCWludCByZXQ7CisKKwkvKiBFeHRyYWN0IHZhbHVlcyBhbnl3YXksIHNpbmNlIGhhbmRsZXIgbWF5IG5lZWQgdGhlbSAqLworCWlyZGFfcGFyYW1fdW5wYWNrKGJ1ZiwgImJiIiwgJnAucGksICZwLnBsKTsKKworCS8qIENhbGwgaGFuZGxlciBmb3IgdGhpcyBwYXJhbWV0ZXIgKi8KKwlyZXQgPSAoKmZ1bmMpKHNlbGYsICZwLCBQVl9QVVQpOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMjsgLyogRXh0cmFjdGVkIHBsKzIgYnl0ZXMgKi8KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfaW5zZXJ0X2ludGVnZXIgKHNlbGYsIGJ1ZiwgbGVuLCBwaSwgdHlwZSwgZnVuYykKKyAqLworc3RhdGljIGludCBpcmRhX2luc2VydF9pbnRlZ2VyKHZvaWQgKnNlbGYsIF9fdTggKmJ1ZiwgaW50IGxlbiwgX191OCBwaSwKKwkJCSAgICAgICBQVl9UWVBFIHR5cGUsIFBJX0hBTkRMRVIgZnVuYykKK3sKKwlpcmRhX3BhcmFtX3QgcDsKKwlpbnQgbiA9IDA7CisJaW50IGVycjsKKworCXAucGkgPSBwaTsgICAgICAgICAgICAgLyogSW4gY2FzZSBoYW5kbGVyIG5lZWRzIHRvIGtub3cgKi8KKwlwLnBsID0gdHlwZSAmIFBWX01BU0s7IC8qIFRoZSBpbnRlZ2VyIHR5cGUgY29kZXMgdGhlIGxlbmdodCBhcyB3ZWxsICovCisJcC5wdi5pID0gMDsgICAgICAgICAgICAvKiBDbGVhciB2YWx1ZSAqLworCisJLyogQ2FsbCBoYW5kbGVyIGZvciB0aGlzIHBhcmFtZXRlciAqLworCWVyciA9ICgqZnVuYykoc2VsZiwgJnAsIFBWX0dFVCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKgorCSAqIElmIHBhcmFtZXRlciBsZW5naHQgaXMgc3RpbGwgMCwgdGhlbiAoMSkgdGhpcyBpcyBhbiBhbnkgbGVuZ3RoCisJICogaW50ZWdlciwgYW5kICgyKSB0aGUgaGFuZGxlciBmdW5jdGlvbiBkb2VzIG5vdCBjYXJlIHdoaWNoIGxlbmd0aAorCSAqIHdlIGNob29zZSB0byB1c2UsIHNvIHdlIHBpY2sgdGhlIG9uZSB0aGUgZ2l2ZXMgdGhlIGZld2VzdCBieXRlcy4KKwkgKi8KKwlpZiAocC5wbCA9PSAwKSB7CisJCWlmIChwLnB2LmkgPCAweGZmKSB7CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCB1c2luZyAxIGJ5dGVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlwLnBsID0gMTsKKwkJfSBlbHNlIGlmIChwLnB2LmkgPCAweGZmZmYpIHsKKwkJCUlSREFfREVCVUcoMiwgIiVzKCksIHVzaW5nIDIgYnl0ZXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlwLnBsID0gMjsKKwkJfSBlbHNlIHsKKwkJCUlSREFfREVCVUcoMiwgIiVzKCksIHVzaW5nIDQgYnl0ZXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlwLnBsID0gNDsgLyogRGVmYXVsdCBsZW5ndGggKi8KKwkJfQorCX0KKwkvKiBDaGVjayBpZiBidWZmZXIgaXMgbG9uZyBlbm91Z2ggZm9yIGluc2VydGlvbiAqLworCWlmIChsZW4gPCAoMitwLnBsKSkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBidWZmZXIgdG8gc2hvcnQgZm9yIGluc2VydGlvbiFcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtMTsKKwl9CisJSVJEQV9ERUJVRygyLCAiJXMoKSwgcGk9JSN4LCBwbD0lZCwgcGk9JWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgcC5waSwgcC5wbCwgcC5wdi5pKTsKKwlzd2l0Y2ggKHAucGwpIHsKKwljYXNlIDE6CisJCW4gKz0gaXJkYV9wYXJhbV9wYWNrKGJ1ZiwgImJiYiIsIHAucGksIHAucGwsIChfX3U4KSBwLnB2LmkpOworCQlicmVhazsKKwljYXNlIDI6CisJCWlmICh0eXBlICYgUFZfQklHX0VORElBTikKKwkJCXAucHYuaSA9IGNwdV90b19iZTE2KChfX3UxNikgcC5wdi5pKTsKKwkJZWxzZQorCQkJcC5wdi5pID0gY3B1X3RvX2xlMTYoKF9fdTE2KSBwLnB2LmkpOworCQluICs9IGlyZGFfcGFyYW1fcGFjayhidWYsICJiYnMiLCBwLnBpLCBwLnBsLCAoX191MTYpIHAucHYuaSk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJaWYgKHR5cGUgJiBQVl9CSUdfRU5ESUFOKQorCQkJY3B1X3RvX2JlMzJzKCZwLnB2LmkpOworCQllbHNlCisJCQljcHVfdG9fbGUzMnMoJnAucHYuaSk7CisJCW4gKz0gaXJkYV9wYXJhbV9wYWNrKGJ1ZiwgImJiaSIsIHAucGksIHAucGwsIHAucHYuaSk7CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9XQVJOSU5HKCIlczogbGVuZ3RoICVkIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXywgcC5wbCk7CisJCS8qIFNraXAgcGFyYW1ldGVyICovCisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gcC5wbCsyOyAvKiBJbnNlcnRlZCBwbCsyIGJ5dGVzICovCit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2V4dHJhY3QgaW50ZWdlciAoc2VsZiwgYnVmLCBsZW4sIHBpLCB0eXBlLCBmdW5jKQorICoKKyAqICAgIEV4dHJhY3QgYSBwb3NzaWJseSB2YXJpYWJsZSBsZW5ndGggaW50ZWdlciBmcm9tIGJ1ZmZlciwgYW5kIGNhbGwKKyAqICAgIGhhbmRsZXIgZm9yIHByb2Nlc3Npbmcgb2YgdGhlIHBhcmFtZXRlcgorICovCitzdGF0aWMgaW50IGlyZGFfZXh0cmFjdF9pbnRlZ2VyKHZvaWQgKnNlbGYsIF9fdTggKmJ1ZiwgaW50IGxlbiwgX191OCBwaSwKKwkJCQlQVl9UWVBFIHR5cGUsIFBJX0hBTkRMRVIgZnVuYykKK3sKKwlpcmRhX3BhcmFtX3QgcDsKKwlpbnQgbiA9IDA7CisJaW50IGV4dHJhY3RfbGVuOwkvKiBSZWFsIGxlbmdodCB3ZSBleHRyYWN0ICovCisJaW50IGVycjsKKworCXAucGkgPSBwaTsgICAgIC8qIEluIGNhc2UgaGFuZGxlciBuZWVkcyB0byBrbm93ICovCisJcC5wbCA9IGJ1ZlsxXTsgLyogRXh0cmFjdCBsZW5naHQgb2YgdmFsdWUgKi8KKwlwLnB2LmkgPSAwOyAgICAvKiBDbGVhciB2YWx1ZSAqLworCWV4dHJhY3RfbGVuID0gcC5wbDsJLyogRGVmYXVsdCA6IGV4dHJhY3QgYWxsICovCisKKwkvKiBDaGVjayBpZiBidWZmZXIgaXMgbG9uZyBlbm91Z2ggZm9yIHBhcnNpbmcgKi8KKwlpZiAobGVuIDwgKDIrcC5wbCkpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogYnVmZmVyIHRvIHNob3J0IGZvciBwYXJzaW5nISAiCisJCQkgICAgICJOZWVkICVkIGJ5dGVzLCBidXQgbGVuIGlzIG9ubHkgJWRcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXywgcC5wbCwgbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogQ2hlY2sgdGhhdCB0aGUgaW50ZWdlciBsZW5ndGggaXMgd2hhdCB3ZSBleHBlY3QgaXQgdG8gYmUuIElmIHRoZQorCSAqIGhhbmRsZXIgd2FudCBhIDE2IGJpdHMgaW50ZWdlciB0aGVuIGEgMzIgYml0cyBpcyBub3QgZ29vZCBlbm91Z2gKKwkgKiBQVl9JTlRFR0VSIG1lYW5zIHRoYXQgdGhlIGhhbmRsZXIgaXMgZmxleGlibGUuCisJICovCisJaWYgKCgodHlwZSAmIFBWX01BU0spICE9IFBWX0lOVEVHRVIpICYmICgodHlwZSAmIFBWX01BU0spICE9IHAucGwpKSB7CisJCUlSREFfRVJST1IoIiVzOiBpbnZhbGlkIHBhcmFtZXRlciBsZW5ndGghICIKKwkJCSAgICJFeHBlY3RlZCAlZCBieXRlcywgYnV0IHZhbHVlIGhhZCAlZCBieXRlcyFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHR5cGUgJiBQVl9NQVNLLCBwLnBsKTsKKworCQkvKiBNb3N0IHBhcmFtZXRlcnMgYXJlIGJpdC9ieXRlIGZpZWxkcyBvciBsaXR0bGUgZW5kaWFuLAorCQkgKiBzbyBpdCdzIG9rIHRvIG9ubHkgZXh0cmFjdCBhIHN1YnNldCBvZiBpdCAodGhlIHN1YnNldAorCQkgKiB0aGF0IHRoZSBoYW5kbGVyIGV4cGVjdCkuIFRoaXMgaXMgbmVjZXNzYXJ5LCBhcyBzb21lCisJCSAqIGJyb2tlbiBpbXBsZW1lbnRhdGlvbnMgc2VlbXMgdG8gYWRkIGV4dHJhIHVuZGVmaW5lZCBiaXRzLgorCQkgKiBJZiB0aGUgcGFyYW1ldGVyIGlzIHNob3J0ZXIgdGhhbiB3ZSBleHBlY3Qgb3IgaXMgYmlnCisJCSAqIGVuZGlhbiwgd2UgY2FuJ3QgcGxheSB0aG9zZSB0cmlja3MuIEplYW4gSUkgKi8KKwkJaWYoKHAucGwgPCAodHlwZSAmIFBWX01BU0spKSB8fCAodHlwZSAmIFBWX0JJR19FTkRJQU4pKSB7CisJCQkvKiBTa2lwIHBhcmFtZXRlciAqLworCQkJcmV0dXJuIHAucGwrMjsKKwkJfSBlbHNlIHsKKwkJCS8qIEV4dHJhY3Qgc3Vic2V0IG9mIGl0LCBmYWxsdGhyb3VnaCAqLworCQkJZXh0cmFjdF9sZW4gPSB0eXBlICYgUFZfTUFTSzsKKwkJfQorCX0KKworCisJc3dpdGNoIChleHRyYWN0X2xlbikgeworCWNhc2UgMToKKwkJbiArPSBpcmRhX3BhcmFtX3VucGFjayhidWYrMiwgImIiLCAmcC5wdi5pKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQluICs9IGlyZGFfcGFyYW1fdW5wYWNrKGJ1ZisyLCAicyIsICZwLnB2LmkpOworCQlpZiAodHlwZSAmIFBWX0JJR19FTkRJQU4pCisJCQlwLnB2LmkgPSBiZTE2X3RvX2NwdSgoX191MTYpIHAucHYuaSk7CisJCWVsc2UKKwkJCXAucHYuaSA9IGxlMTZfdG9fY3B1KChfX3UxNikgcC5wdi5pKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQluICs9IGlyZGFfcGFyYW1fdW5wYWNrKGJ1ZisyLCAiaSIsICZwLnB2LmkpOworCQlpZiAodHlwZSAmIFBWX0JJR19FTkRJQU4pCisJCQliZTMyX3RvX2NwdXMoJnAucHYuaSk7CisJCWVsc2UKKwkJCWxlMzJfdG9fY3B1cygmcC5wdi5pKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9XQVJOSU5HKCIlczogbGVuZ3RoICVkIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXywgcC5wbCk7CisKKwkJLyogU2tpcCBwYXJhbWV0ZXIgKi8KKwkJcmV0dXJuIHAucGwrMjsKKwl9CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBwaT0lI3gsIHBsPSVkLCBwaT0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkgICBwLnBpLCBwLnBsLCBwLnB2LmkpOworCS8qIENhbGwgaGFuZGxlciBmb3IgdGhpcyBwYXJhbWV0ZXIgKi8KKwllcnIgPSAoKmZ1bmMpKHNlbGYsICZwLCBQVl9QVVQpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIHAucGwrMjsgLyogRXh0cmFjdGVkIHBsKzIgYnl0ZXMgKi8KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfZXh0cmFjdF9zdHJpbmcgKHNlbGYsIGJ1ZiwgbGVuLCB0eXBlLCBmdW5jKQorICovCitzdGF0aWMgaW50IGlyZGFfZXh0cmFjdF9zdHJpbmcodm9pZCAqc2VsZiwgX191OCAqYnVmLCBpbnQgbGVuLCBfX3U4IHBpLAorCQkJICAgICAgIFBWX1RZUEUgdHlwZSwgUElfSEFORExFUiBmdW5jKQoreworCWNoYXIgc3RyWzMzXTsKKwlpcmRhX3BhcmFtX3QgcDsKKwlpbnQgZXJyOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXAucGkgPSBwaTsgICAgIC8qIEluIGNhc2UgaGFuZGxlciBuZWVkcyB0byBrbm93ICovCisJcC5wbCA9IGJ1ZlsxXTsgLyogRXh0cmFjdCBsZW5naHQgb2YgdmFsdWUgKi8KKworCUlSREFfREVCVUcoMiwgIiVzKCksIHBpPSUjeCwgcGw9JWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgcC5waSwgcC5wbCk7CisKKwkvKiBDaGVjayBpZiBidWZmZXIgaXMgbG9uZyBlbm91Z2ggZm9yIHBhcnNpbmcgKi8KKwlpZiAobGVuIDwgKDIrcC5wbCkpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogYnVmZmVyIHRvIHNob3J0IGZvciBwYXJzaW5nISAiCisJCQkgICAgICJOZWVkICVkIGJ5dGVzLCBidXQgbGVuIGlzIG9ubHkgJWRcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXywgcC5wbCwgbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFNob3VsZCBiZSBzYWZlIHRvIGNvcHkgc3RyaW5nIGxpa2UgdGhpcyBzaW5jZSB3ZSBoYXZlIGFscmVhZHkKKwkgKiBjaGVja2VkIHRoYXQgdGhlIGJ1ZmZlciBpcyBsb25nIGVub3VnaCAqLworCXN0cm5jcHkoc3RyLCBidWYrMiwgcC5wbCk7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBzdHI9MHglMDJ4IDB4JTAyeFxuIiwgX19GVU5DVElPTl9fLAorCQkgICAoX191OCkgc3RyWzBdLCAoX191OCkgc3RyWzFdKTsKKworCS8qIE51bGwgdGVybWluYXRlIHN0cmluZyAqLworCXN0cltwLnBsKzFdID0gJ1wwJzsKKworCXAucHYuYyA9IHN0cjsgLyogSGFuZGxlciB3aWxsIG5lZWQgdG8gdGFrZSBhIGNvcHkgKi8KKworCS8qIENhbGwgaGFuZGxlciBmb3IgdGhpcyBwYXJhbWV0ZXIgKi8KKwllcnIgPSAoKmZ1bmMpKHNlbGYsICZwLCBQVl9QVVQpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIHAucGwrMjsgLyogRXh0cmFjdGVkIHBsKzIgYnl0ZXMgKi8KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfZXh0cmFjdF9vY3RzZXEgKHNlbGYsIGJ1ZiwgbGVuLCB0eXBlLCBmdW5jKQorICovCitzdGF0aWMgaW50IGlyZGFfZXh0cmFjdF9vY3RzZXEodm9pZCAqc2VsZiwgX191OCAqYnVmLCBpbnQgbGVuLCBfX3U4IHBpLAorCQkJICAgICAgIFBWX1RZUEUgdHlwZSwgUElfSEFORExFUiBmdW5jKQoreworCWlyZGFfcGFyYW1fdCBwOworCisJcC5waSA9IHBpOyAgICAgLyogSW4gY2FzZSBoYW5kbGVyIG5lZWRzIHRvIGtub3cgKi8KKwlwLnBsID0gYnVmWzFdOyAvKiBFeHRyYWN0IGxlbmdodCBvZiB2YWx1ZSAqLworCisJLyogQ2hlY2sgaWYgYnVmZmVyIGlzIGxvbmcgZW5vdWdoIGZvciBwYXJzaW5nICovCisJaWYgKGxlbiA8ICgyK3AucGwpKSB7CisJCUlSREFfV0FSTklORygiJXM6IGJ1ZmZlciB0byBzaG9ydCBmb3IgcGFyc2luZyEgIgorCQkJICAgICAiTmVlZCAlZCBieXRlcywgYnV0IGxlbiBpcyBvbmx5ICVkXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18sIHAucGwsIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlJUkRBX0RFQlVHKDAsICIlcygpLCBub3QgaW1wbFxuIiwgX19GVU5DVElPTl9fKTsKKworCXJldHVybiBwLnBsKzI7IC8qIEV4dHJhY3RlZCBwbCsyIGJ5dGVzICovCit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX3BhcmFtX3BhY2sgKHNrYiwgZm10LCAuLi4pCisgKgorICogICAgRm9ybWF0OgorICogICAgICAgICdpJyA9IDMyIGJpdHMgaW50ZWdlcgorICogICAgICAgICdzJyA9IHN0cmluZworICoKKyAqLworaW50IGlyZGFfcGFyYW1fcGFjayhfX3U4ICpidWYsIGNoYXIgKmZtdCwgLi4uKQoreworCWlyZGFfcHZfdCBhcmc7CisJdmFfbGlzdCBhcmdzOworCWNoYXIgKnA7CisJaW50IG4gPSAwOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKworCWZvciAocCA9IGZtdDsgKnAgIT0gJ1wwJzsgcCsrKSB7CisJCXN3aXRjaCAoKnApIHsKKwkJY2FzZSAnYic6ICAvKiA4IGJpdHMgdW5zaWduZWQgYnl0ZSAqLworCQkJYnVmW24rK10gPSAoX191OCl2YV9hcmcoYXJncywgaW50KTsKKwkJCWJyZWFrOworCQljYXNlICdzJzogIC8qIDE2IGJpdHMgdW5zaWduZWQgc2hvcnQgKi8KKwkJCWFyZy5pID0gKF9fdTE2KXZhX2FyZyhhcmdzLCBpbnQpOworCQkJcHV0X3VuYWxpZ25lZCgoX191MTYpYXJnLmksIChfX3UxNiAqKShidWYrbikpOyBuKz0yOworCQkJYnJlYWs7CisJCWNhc2UgJ2knOiAgLyogMzIgYml0cyB1bnNpZ25lZCBpbnRlZ2VyICovCisJCQlhcmcuaSA9IHZhX2FyZyhhcmdzLCBfX3UzMik7CisJCQlwdXRfdW5hbGlnbmVkKGFyZy5pLCAoX191MzIgKikoYnVmK24pKTsgbis9NDsKKwkJCWJyZWFrOworI2lmIDAKKwkJY2FzZSAnYyc6IC8qIFwwIHRlcm1pbmF0ZWQgc3RyaW5nICovCisJCQlhcmcuYyA9IHZhX2FyZyhhcmdzLCBjaGFyICopOworCQkJc3RyY3B5KGJ1ZituLCBhcmcuYyk7CisJCQluICs9IHN0cmxlbihhcmcuYykgKyAxOworCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCXZhX2VuZChhcmdzKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwl2YV9lbmQoYXJncyk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaXJkYV9wYXJhbV9wYWNrKTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfcGFyYW1fdW5wYWNrIChza2IsIGZtdCwgLi4uKQorICovCitzdGF0aWMgaW50IGlyZGFfcGFyYW1fdW5wYWNrKF9fdTggKmJ1ZiwgY2hhciAqZm10LCAuLi4pCit7CisJaXJkYV9wdl90IGFyZzsKKwl2YV9saXN0IGFyZ3M7CisJY2hhciAqcDsKKwlpbnQgbiA9IDA7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCisJZm9yIChwID0gZm10OyAqcCAhPSAnXDAnOyBwKyspIHsKKwkJc3dpdGNoICgqcCkgeworCQljYXNlICdiJzogIC8qIDggYml0cyBieXRlICovCisJCQlhcmcuaXAgPSB2YV9hcmcoYXJncywgX191MzIgKik7CisJCQkqYXJnLmlwID0gYnVmW24rK107CisJCQlicmVhazsKKwkJY2FzZSAncyc6ICAvKiAxNiBiaXRzIHNob3J0ICovCisJCQlhcmcuaXAgPSB2YV9hcmcoYXJncywgX191MzIgKik7CisJCQkqYXJnLmlwID0gZ2V0X3VuYWxpZ25lZCgoX191MTYgKikoYnVmK24pKTsgbis9MjsKKwkJCWJyZWFrOworCQljYXNlICdpJzogIC8qIDMyIGJpdHMgdW5zaWduZWQgaW50ZWdlciAqLworCQkJYXJnLmlwID0gdmFfYXJnKGFyZ3MsIF9fdTMyICopOworCQkJKmFyZy5pcCA9IGdldF91bmFsaWduZWQoKF9fdTMyICopKGJ1ZituKSk7IG4rPTQ7CisJCQlicmVhazsKKyNpZiAwCisJCWNhc2UgJ2MnOiAgIC8qIFwwIHRlcm1pbmF0ZWQgc3RyaW5nICovCisJCQlhcmcuYyA9IHZhX2FyZyhhcmdzLCBjaGFyICopOworCQkJc3RyY3B5KGFyZy5jLCBidWYrbik7CisJCQluICs9IHN0cmxlbihhcmcuYykgKyAxOworCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCXZhX2VuZChhcmdzKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJfQorCXZhX2VuZChhcmdzKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9wYXJhbV9pbnNlcnQgKHNlbGYsIHBpLCBidWYsIGxlbiwgaW5mbykKKyAqCisgKiAgICBJbnNlcnQgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgKHBpKSBpbnRvIGJ1ZmZlci4gUmV0dXJucyBudW1iZXIgb2YKKyAqICAgIGJ5dGVzIGluc2VydGVkCisgKi8KK2ludCBpcmRhX3BhcmFtX2luc2VydCh2b2lkICpzZWxmLCBfX3U4IHBpLCBfX3U4ICpidWYsIGludCBsZW4sCisJCSAgICAgIHBpX3BhcmFtX2luZm9fdCAqaW5mbykKK3sKKwlwaV9taW5vcl9pbmZvX3QgKnBpX21pbm9yX2luZm87CisJX191OCBwaV9taW5vcjsKKwlfX3U4IHBpX21ham9yOworCWludCB0eXBlOworCWludCByZXQgPSAtMTsKKwlpbnQgbiA9IDA7CisKKwlJUkRBX0FTU0VSVChidWYgIT0gTlVMTCwgcmV0dXJuIHJldDspOworCUlSREFfQVNTRVJUKGluZm8gIT0gMCwgcmV0dXJuIHJldDspOworCisJcGlfbWlub3IgPSBwaSAmIGluZm8tPnBpX21hc2s7CisJcGlfbWFqb3IgPSBwaSA+PiBpbmZvLT5waV9tYWpvcl9vZmZzZXQ7CisKKwkvKiBDaGVjayBpZiB0aGUgaWRlbnRpZmllciB2YWx1ZSAocGkpIGlzIHZhbGlkICovCisJaWYgKChwaV9tYWpvciA+IGluZm8tPmxlbi0xKSB8fAorCSAgICAocGlfbWlub3IgPiBpbmZvLT50YWJsZXNbcGlfbWFqb3JdLmxlbi0xKSkKKwl7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIG5vIGhhbmRsZXIgZm9yIHBhcmFtZXRlcj0weCUwMnhcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHBpKTsKKworCQkvKiBTa2lwIHRoaXMgcGFyYW1ldGVyICovCisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBMb29rdXAgdGhlIGluZm8gb24gaG93IHRvIHBhcnNlIHRoaXMgcGFyYW1ldGVyICovCisJcGlfbWlub3JfaW5mbyA9ICZpbmZvLT50YWJsZXNbcGlfbWFqb3JdLnBpX21pbm9yX2NhbGxfdGFibGVbcGlfbWlub3JdOworCisJLyogRmluZCBleHBlY3RlZCBkYXRhIHR5cGUgZm9yIHRoaXMgcGFyYW1ldGVyIGlkZW50aWZpZXIgKHBpKSovCisJdHlwZSA9IHBpX21pbm9yX2luZm8tPnR5cGU7CisKKwkvKiAgQ2hlY2sgaWYgaGFuZGxlciBoYXMgYmVlbiBpbXBsZW1lbnRlZCAqLworCWlmICghcGlfbWlub3JfaW5mby0+ZnVuYykgeworCQlJUkRBX01FU1NBR0UoIiVzOiBubyBoYW5kbGVyIGZvciBwaT0lI3hcbiIsIF9fRlVOQ1RJT05fXywgcGkpOworCQkvKiBTa2lwIHRoaXMgcGFyYW1ldGVyICovCisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBJbnNlcnQgcGFyYW1ldGVyIHZhbHVlICovCisJcmV0ID0gKCpwdl9pbnNlcnRfdGFibGVbdHlwZSAmIFBWX01BU0tdKShzZWxmLCBidWYrbiwgbGVuLCBwaSwgdHlwZSwKKwkJCQkJCSBwaV9taW5vcl9pbmZvLT5mdW5jKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpcmRhX3BhcmFtX2luc2VydCk7CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX3BhcmFtX2V4dHJhY3QgKHNlbGYsIGJ1ZiwgbGVuLCBpbmZvKQorICoKKyAqICAgIFBhcnNlIGFsbCBwYXJhbWV0ZXJzLiBJZiBsZW4gaXMgY29ycmVjdCwgdGhlbiBldmVyeXRoaW5nIHNob3VsZCBiZQorICogICAgc2FmZS4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2FzIHBhcnNlZAorICoKKyAqLworc3RhdGljIGludCBpcmRhX3BhcmFtX2V4dHJhY3Qodm9pZCAqc2VsZiwgX191OCAqYnVmLCBpbnQgbGVuLAorCQkJICAgICAgcGlfcGFyYW1faW5mb190ICppbmZvKQoreworCXBpX21pbm9yX2luZm9fdCAqcGlfbWlub3JfaW5mbzsKKwlfX3U4IHBpX21pbm9yOworCV9fdTggcGlfbWFqb3I7CisJaW50IHR5cGU7CisJaW50IHJldCA9IC0xOworCWludCBuID0gMDsKKworCUlSREFfQVNTRVJUKGJ1ZiAhPSBOVUxMLCByZXR1cm4gcmV0Oyk7CisJSVJEQV9BU1NFUlQoaW5mbyAhPSAwLCByZXR1cm4gcmV0Oyk7CisKKwlwaV9taW5vciA9IGJ1ZltuXSAmIGluZm8tPnBpX21hc2s7CisJcGlfbWFqb3IgPSBidWZbbl0gPj4gaW5mby0+cGlfbWFqb3Jfb2Zmc2V0OworCisJLyogQ2hlY2sgaWYgdGhlIGlkZW50aWZpZXIgdmFsdWUgKHBpKSBpcyB2YWxpZCAqLworCWlmICgocGlfbWFqb3IgPiBpbmZvLT5sZW4tMSkgfHwKKwkgICAgKHBpX21pbm9yID4gaW5mby0+dGFibGVzW3BpX21ham9yXS5sZW4tMSkpCisJeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBubyBoYW5kbGVyIGZvciBwYXJhbWV0ZXI9MHglMDJ4XG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBidWZbMF0pOworCisJCS8qIFNraXAgdGhpcyBwYXJhbWV0ZXIgKi8KKwkJcmV0dXJuIDIgKyBidWZbbiArIDFdOyAgLyogQ29udGludWUgKi8KKwl9CisKKwkvKiBMb29rdXAgdGhlIGluZm8gb24gaG93IHRvIHBhcnNlIHRoaXMgcGFyYW1ldGVyICovCisJcGlfbWlub3JfaW5mbyA9ICZpbmZvLT50YWJsZXNbcGlfbWFqb3JdLnBpX21pbm9yX2NhbGxfdGFibGVbcGlfbWlub3JdOworCisJLyogRmluZCBleHBlY3RlZCBkYXRhIHR5cGUgZm9yIHRoaXMgcGFyYW1ldGVyIGlkZW50aWZpZXIgKHBpKSovCisJdHlwZSA9IHBpX21pbm9yX2luZm8tPnR5cGU7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpLCBwaT1bJWQsJWRdLCB0eXBlPSVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCSAgIHBpX21ham9yLCBwaV9taW5vciwgdHlwZSk7CisKKwkvKiAgQ2hlY2sgaWYgaGFuZGxlciBoYXMgYmVlbiBpbXBsZW1lbnRlZCAqLworCWlmICghcGlfbWlub3JfaW5mby0+ZnVuYykgeworCQlJUkRBX01FU1NBR0UoIiVzOiBubyBoYW5kbGVyIGZvciBwaT0lI3hcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXywgYnVmW25dKTsKKwkJLyogU2tpcCB0aGlzIHBhcmFtZXRlciAqLworCQlyZXR1cm4gMiArIGJ1ZltuICsgMV07IC8qIENvbnRpbnVlICovCisJfQorCisJLyogUGFyc2UgcGFyYW1ldGVyIHZhbHVlICovCisJcmV0ID0gKCpwdl9leHRyYWN0X3RhYmxlW3R5cGUgJiBQVl9NQVNLXSkoc2VsZiwgYnVmK24sIGxlbiwgYnVmW25dLAorCQkJCQkJICB0eXBlLCBwaV9taW5vcl9pbmZvLT5mdW5jKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9wYXJhbV9leHRyYWN0X2FsbCAoc2VsZiwgYnVmLCBsZW4sIGluZm8pCisgKgorICogICAgUGFyc2UgYWxsIHBhcmFtZXRlcnMuIElmIGxlbiBpcyBjb3JyZWN0LCB0aGVuIGV2ZXJ5dGhpbmcgc2hvdWxkIGJlCisgKiAgICBzYWZlLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3YXMgcGFyc2VkCisgKgorICovCitpbnQgaXJkYV9wYXJhbV9leHRyYWN0X2FsbCh2b2lkICpzZWxmLCBfX3U4ICpidWYsIGludCBsZW4sIAorCQkJICAgcGlfcGFyYW1faW5mb190ICppbmZvKQoreworCWludCByZXQgPSAtMTsKKwlpbnQgbiA9IDA7CisKKwlJUkRBX0FTU0VSVChidWYgIT0gTlVMTCwgcmV0dXJuIHJldDspOworCUlSREFfQVNTRVJUKGluZm8gIT0gMCwgcmV0dXJuIHJldDspOworCisJLyoKKwkgKiBQYXJzZSBhbGwgcGFyYW1ldGVycy4gRWFjaCBwYXJhbWV0ZXIgbXVzdCBiZSBhdCBsZWFzdCB0d28gYnl0ZXMKKwkgKiBsb25nIG9yIGVsc2UgdGhlcmUgaXMgbm8gcG9pbnQgaW4gdHJ5aW5nIHRvIHBhcnNlIGl0CisJICovCisJd2hpbGUgKGxlbiA+IDIpIHsKKwkJcmV0ID0gaXJkYV9wYXJhbV9leHRyYWN0KHNlbGYsIGJ1ZituLCBsZW4sIGluZm8pOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJbiArPSByZXQ7CisJCWxlbiAtPSByZXQ7CisJfQorCXJldHVybiBuOworfQorRVhQT1JUX1NZTUJPTChpcmRhX3BhcmFtX2V4dHJhY3RfYWxsKTsKZGlmZiAtLWdpdCBhL25ldC9pcmRhL3Fvcy5jIGIvbmV0L2lyZGEvcW9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY3MzJkNQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcmRhL3Fvcy5jCkBAIC0wLDAgKzEsNzc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBxb3MuYworICogVmVyc2lvbjogICAgICAgMS4wCisgKiBEZXNjcmlwdGlvbjogICBJckxBUCBRb1MgcGFyYW1ldGVyIG5lZ290aWF0aW9uCisgKiBTdGF0dXM6ICAgICAgICBTdGFibGUKKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFR1ZSBTZXAgIDkgMDA6MDA6MjYgMTk5NworICogTW9kaWZpZWQgYXQ6ICAgU3VuIEphbiAzMCAxNDoyOToxNiAyMDAwCisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+LCAKKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4KKyAqICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCisgKiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgKiAgICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9wYXJhbWV0ZXJzLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvcW9zLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYXAuaD4KKworLyoKKyAqIE1heGltdW0gdmFsdWVzIG9mIHRoZSBiYXVkIHJhdGUgd2UgbmVnb2NpYXRlIHdpdGggdGhlIG90aGVyIGVuZC4KKyAqIE1vc3Qgb2Z0ZW4sIHlvdSBkb24ndCBoYXZlIHRvIGNoYW5nZSB0aGF0LCBiZWNhdXNlIExpbnV4LUlyREEgd2lsbAorICogdXNlIHRoZSBtYXhpbXVtIG9mZmVyZWQgYnkgdGhlIGxpbmsgbGF5ZXIsIHdoaWNoIHVzdWFsbHkgd29ya3MgZmluZS4KKyAqIEluIHNvbWUgdmVyeSByYXJlIGNhc2VzLCB5b3UgbWF5IHdhbnQgdG8gbGltaXQgaXQgdG8gbG93ZXIgc3BlZWRzLi4uCisgKi8KK2ludCBzeXNjdGxfbWF4X2JhdWRfcmF0ZSA9IDE2MDAwMDAwOworLyoKKyAqIE1heGltdW0gdmFsdWUgb2YgdGhlIGxhcCBkaXNjb25uZWN0IHRpbWVyIHdlIG5lZ29jaWF0ZSB3aXRoIHRoZSBvdGhlciBlbmQuCisgKiBNb3N0IG9mdGVuLCB0aGUgdmFsdWUgYmVsb3cgcmVwcmVzZW50IHRoZSBiZXN0IGNvbXByb21pc2UsIGJ1dCBzb21lIHVzZXIKKyAqIG1heSB3YW50IHRvIGtlZXAgdGhlIExBUCBhbGl2ZSBsb25ndWVyIG9yIHNob3J0ZXIgaW4gY2FzZSBvZiBsaW5rIGZhaWx1cmUuCisgKiBSZW1lbWJlciB0aGF0IHRoZSB0aHJlc2hvbGQgdGltZSAoZWFybHkgd2FybmluZykgaXMgZml4ZWQgdG8gM3MuLi4KKyAqLworaW50IHN5c2N0bF9tYXhfbm9yZXBseV90aW1lID0gMTI7CisvKgorICogTWluaW11bSB0dXJuIHRpbWUgdG8gYmUgYXBwbGllZCBiZWZvcmUgdHJhbnNtaXR0aW5nIHRvIHRoZSBwZWVyLgorICogTm9uemVybyB2YWx1ZXMgKHVzZWMpIGFyZSB1c2VkIGFzIGxvd2VyIGxpbWl0IHRvIHRoZSBwZXItY29ubmVjdGlvbgorICogbXR0IHZhbHVlIHdoaWNoIHdhcyBhbm5vdW5jZWQgYnkgdGhlIG90aGVyIGVuZCBkdXJpbmcgbmVnb3RpYXRpb24uCisgKiBNaWdodCBiZSBoZWxwZnVsIGlmIHRoZSBwZWVyIGRldmljZSBwcm92aWRlcyB0b28gc2hvcnQgbXR0LgorICogRGVmYXVsdCBpcyAxMHVzIHdoaWNoIG1lYW5zIHVzaW5nIHRoZSB1bm1vZGlmaWVkIHZhbHVlIGdpdmVuIGJ5IHRoZQorICogcGVlciBleGNlcHQgaWYgaXQncyAwICgwIGlzIGxpa2VseSBhIGJ1ZyBpbiB0aGUgb3RoZXIgc3RhY2spLgorICovCit1bnNpZ25lZCBzeXNjdGxfbWluX3R4X3R1cm5fdGltZSA9IDEwOworLyoKKyAqIE1heGltdW0gZGF0YSBzaXplIHRvIGJlIHVzZWQgaW4gdHJhbnNtaXNzaW9uIGluIHBheWxvYWQgb2YgTEFQIGZyYW1lLgorICogVGhlcmUgaXMgYSBiaXQgb2YgY29uZnVzaW9uIGluIHRoZSBJckRBIHNwZWMgOgorICogVGhlIExBUCBzcGVjIGRlZmluZXMgdGhlIHBheWxvYWQgb2YgYSBMQVAgZnJhbWUgKEkgZmllbGQpIHRvIGJlCisgKiAyMDQ4IGJ5dGVzIG1heCAoSXJMQVAgMS4xLCBjaGFwdCA2LjYuNSwgcDQwKS4KKyAqIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgUEhZIG1lbnRpb24gZnJhbWVzIG9mIDIwNDggYnl0ZXMgbWF4IChJclBIWQorICogMS4yLCBjaGFwdCA1LjMuMi4xLCBwNDEpLiBCdXQsIHRoaXMgbnVtYmVyIGluY2x1ZGVzIHRoZSBMQVAgaGVhZGVyCisgKiAoMiBieXRlcyksIGFuZCBDUkMgKDMyIGJpdHMgYXQgNCBNYi9zKS4gU28sIGZvciB0aGUgSSBmaWVsZCAoTEFQCisgKiBwYXlsb2FkKSwgdGhhdCdzIG9ubHkgMjA0MiBieXRlcy4gT3VwcyAhCisgKiBNeSBuc2MtaXJjYyBoYXJkd2FyZSBoYXMgdHJvdWJsZXMgcmVjZWl2aW5nIDIwNDggYnl0ZXMgZnJhbWVzIGF0IDQgTWIvcywKKyAqIHNvIGFkanVzdCB0byAyMDQyLi4uIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGJ1ZyBhcHBsaWVzIG9ubHkgZm9yIDIwNDgKKyAqIGJ5dGVzIGZyYW1lcyBvciBhbGwgbmVnb3RpYXRlZCBmcmFtZSBzaXplcywgYnV0IHlvdSBjYW4gdXNlIHRoZSBzeXNjdGwKKyAqIHRvIHBsYXkgd2l0aCB0aGlzIHZhbHVlIGFueXdheS4KKyAqIEplYW4gSUkgKi8KK3Vuc2lnbmVkIHN5c2N0bF9tYXhfdHhfZGF0YV9zaXplID0gMjA0MjsKKy8qCisgKiBNYXhpbXVtIHRyYW5zbWl0IHdpbmRvdywgaS5lLiBudW1iZXIgb2YgTEFQIGZyYW1lcyBiZXR3ZWVuIHR1cm4tYXJvdW5kLgorICogVGhpcyBhbGxvdyB0byBvdmVycmlkZSB3aGF0IHRoZSBwZWVyIHRvbGQgdXMuIFNvbWUgcGVlcnMgYXJlIGJ1Z2d5IGFuZAorICogZG9uJ3QgYWx3YXlzIHN1cHBvcnQgd2hhdCB0aGV5IHRlbGwgdXMuCisgKiBKZWFuIElJICovCit1bnNpZ25lZCBzeXNjdGxfbWF4X3R4X3dpbmRvdyA9IDc7CisKK3N0YXRpYyBpbnQgaXJsYXBfcGFyYW1fYmF1ZF9yYXRlKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCBpbnQgZ2V0KTsKK3N0YXRpYyBpbnQgaXJsYXBfcGFyYW1fbGlua19kaXNjb25uZWN0KHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcm0sIAorCQkJCSAgICAgICBpbnQgZ2V0KTsKK3N0YXRpYyBpbnQgaXJsYXBfcGFyYW1fbWF4X3R1cm5fdGltZSh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJhbSwgCisJCQkJICAgICBpbnQgZ2V0KTsKK3N0YXRpYyBpbnQgaXJsYXBfcGFyYW1fZGF0YV9zaXplKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCBpbnQgZ2V0KTsKK3N0YXRpYyBpbnQgaXJsYXBfcGFyYW1fd2luZG93X3NpemUodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIAorCQkJCSAgIGludCBnZXQpOworc3RhdGljIGludCBpcmxhcF9wYXJhbV9hZGRpdGlvbmFsX2JvZnModm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFybSwgCisJCQkJICAgICAgIGludCBnZXQpOworc3RhdGljIGludCBpcmxhcF9wYXJhbV9taW5fdHVybl90aW1lKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCAKKwkJCQkgICAgIGludCBnZXQpOworCisjaWZuZGVmIENPTkZJR19JUkRBX0RZTkFNSUNfV0lORE9XCitzdGF0aWMgX191MzIgaXJsYXBfcmVxdWVzdGVkX2xpbmVfY2FwYWNpdHkoc3RydWN0IHFvc19pbmZvICpxb3MpOworI2VuZGlmCisKK3N0YXRpYyBfX3UzMiBtaW5fdHVybl90aW1lc1tdICA9IHsgMTAwMDAsIDUwMDAsIDEwMDAsIDUwMCwgMTAwLCA1MCwgMTAsIDAgfTsgLyogdXMgKi8KK3N0YXRpYyBfX3UzMiBiYXVkX3JhdGVzW10gICAgICA9IHsgMjQwMCwgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwLCA1NzYwMDAsIAorCQkJCSAgIDExNTIwMDAsIDQwMDAwMDAsIDE2MDAwMDAwIH07ICAgICAgICAgICAvKiBicHMgKi8KK3N0YXRpYyBfX3UzMiBkYXRhX3NpemVzW10gICAgICA9IHsgNjQsIDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDggfTsgICAgICAgIC8qIGJ5dGVzICovCitzdGF0aWMgX191MzIgYWRkX2JvZnNbXSAgICAgICAgPSB7IDQ4LCAyNCwgMTIsIDUsIDMsIDIsIDEsIDAgfTsgICAgICAgICAgICAvKiBieXRlcyAqLworc3RhdGljIF9fdTMyIG1heF90dXJuX3RpbWVzW10gID0geyA1MDAsIDI1MCwgMTAwLCA1MCB9OyAgICAgICAgICAgICAgICAgICAgLyogbXMgKi8KK3N0YXRpYyBfX3UzMiBsaW5rX2Rpc2NfdGltZXNbXSA9IHsgMywgOCwgMTIsIDE2LCAyMCwgMjUsIDMwLCA0MCB9OyAgICAgICAgIC8qIHNlY3MgKi8KKworc3RhdGljIF9fdTMyIG1heF9saW5lX2NhcGFjaXRpZXNbMTBdWzRdID0geworICAgICAgIC8qIDUwMCBtcyAgICAgMjUwIG1zICAxMDAgbXMgIDUwIG1zIChtYXggdHVybiB0aW1lKSAqLworCXsgICAgMTAwLCAgICAgIDAsICAgICAgMCwgICAgIDAgfSwgLyogICAgIDI0MDAgYnBzICovCisJeyAgICA0MDAsICAgICAgMCwgICAgICAwLCAgICAgMCB9LCAvKiAgICAgOTYwMCBicHMgKi8KKwl7ICAgIDgwMCwgICAgICAwLCAgICAgIDAsICAgICAwIH0sIC8qICAgIDE5MjAwIGJwcyAqLworCXsgICAxNjAwLCAgICAgIDAsICAgICAgMCwgICAgIDAgfSwgLyogICAgMzg0MDAgYnBzICovCisJeyAgIDIzNjAsICAgICAgMCwgICAgICAwLCAgICAgMCB9LCAvKiAgICA1NzYwMCBicHMgKi8KKwl7ICAgNDgwMCwgICAyNDAwLCAgICA5NjAsICAgNDgwIH0sIC8qICAgMTE1MjAwIGJwcyAqLworCXsgIDI4ODAwLCAgMTE1MjAsICAgNTc2MCwgIDI4ODAgfSwgLyogICA1NzYwMDAgYnBzICovCisJeyAgNTc2MDAsICAyODgwMCwgIDExNTIwLCAgNTc2MCB9LCAvKiAgMTE1MjAwMCBicHMgKi8KKwl7IDIwMDAwMCwgMTAwMDAwLCAgNDAwMDAsIDIwMDAwIH0sIC8qICA0MDAwMDAwIGJwcyAqLworCXsgODAwMDAwLCA0MDAwMDAsIDE2MDAwMCwgODAwMDAgfSwgLyogMTYwMDAwMDAgYnBzICovCit9OworCitzdGF0aWMgcGlfbWlub3JfaW5mb190IHBpX21pbm9yX2NhbGxfdGFibGVfdHlwZV8wW10gPSB7CisJeyBOVUxMLCAwIH0sCisvKiAwMSAqL3sgaXJsYXBfcGFyYW1fYmF1ZF9yYXRlLCAgICAgICBQVl9JTlRFR0VSIHwgUFZfTElUVExFX0VORElBTiB9LAorCXsgTlVMTCwgMCB9LAorCXsgTlVMTCwgMCB9LAorCXsgTlVMTCwgMCB9LAorCXsgTlVMTCwgMCB9LAorCXsgTlVMTCwgMCB9LAorCXsgTlVMTCwgMCB9LAorLyogMDggKi97IGlybGFwX3BhcmFtX2xpbmtfZGlzY29ubmVjdCwgUFZfSU5UXzhfQklUUyB9Cit9OworCitzdGF0aWMgcGlfbWlub3JfaW5mb190IHBpX21pbm9yX2NhbGxfdGFibGVfdHlwZV8xW10gPSB7CisJeyBOVUxMLCAwIH0sCisJeyBOVUxMLCAwIH0sCisvKiA4MiAqL3sgaXJsYXBfcGFyYW1fbWF4X3R1cm5fdGltZSwgICBQVl9JTlRfOF9CSVRTIH0sCisvKiA4MyAqL3sgaXJsYXBfcGFyYW1fZGF0YV9zaXplLCAgICAgICBQVl9JTlRfOF9CSVRTIH0sCisvKiA4NCAqL3sgaXJsYXBfcGFyYW1fd2luZG93X3NpemUsICAgICBQVl9JTlRfOF9CSVRTIH0sCisvKiA4NSAqL3sgaXJsYXBfcGFyYW1fYWRkaXRpb25hbF9ib2ZzLCBQVl9JTlRfOF9CSVRTIH0sCisvKiA4NiAqL3sgaXJsYXBfcGFyYW1fbWluX3R1cm5fdGltZSwgICBQVl9JTlRfOF9CSVRTIH0sCit9OworCitzdGF0aWMgcGlfbWFqb3JfaW5mb190IHBpX21ham9yX2NhbGxfdGFibGVbXSA9IHsKKwl7IHBpX21pbm9yX2NhbGxfdGFibGVfdHlwZV8wLCA5IH0sCisJeyBwaV9taW5vcl9jYWxsX3RhYmxlX3R5cGVfMSwgNyB9LAorfTsKKworc3RhdGljIHBpX3BhcmFtX2luZm9fdCBpcmxhcF9wYXJhbV9pbmZvID0geyBwaV9tYWpvcl9jYWxsX3RhYmxlLCAyLCAweDdmLCA3IH07CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTE9DQUwgU1VCUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogTm90ZSA6IHdlIHN0YXJ0IHdpdGggYSBidW5jaCBvZiBsb2NhbCBzdWJyb3V0aW5lcy4KKyAqIEFzIHRoZSBjb21waWxlciBpcyAib25lIHBhc3MiLCB0aGlzIGlzIHRoZSBvbmx5IHdheSB0byBnZXQgdGhlbSB0bworICogaW5saW5lIHByb3Blcmx5Li4uCisgKiBKZWFuIElJCisgKi8KKy8qCisgKiBGdW5jdGlvbiB2YWx1ZV9pbmRleCAodmFsdWUsIGFycmF5LCBzaXplKQorICoKKyAqICAgIFJldHVybnMgdGhlIGluZGV4IHRvIHRoZSB2YWx1ZSBpbiB0aGUgc3BlY2lmaWVkIGFycmF5CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHZhbHVlX2luZGV4KF9fdTMyIHZhbHVlLCBfX3UzMiAqYXJyYXksIGludCBzaXplKQoreworCWludCBpOworCQorCWZvciAoaT0wOyBpIDwgc2l6ZTsgaSsrKQorCQlpZiAoYXJyYXlbaV0gPT0gdmFsdWUpCisJCQlicmVhazsKKwlyZXR1cm4gaTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGluZGV4X3ZhbHVlIChpbmRleCwgYXJyYXkpCisgKgorICogICAgUmV0dXJucyB2YWx1ZSB0byBpbmRleCBpbiBhcnJheSwgZWFzeSEKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgX191MzIgaW5kZXhfdmFsdWUoaW50IGluZGV4LCBfX3UzMiAqYXJyYXkpIAoreworCXJldHVybiBhcnJheVtpbmRleF07Cit9CisKKy8qCisgKiBGdW5jdGlvbiBtc2JfaW5kZXggKHdvcmQpCisgKgorICogICAgUmV0dXJucyBpbmRleCB0byBtb3N0IHNpZ25pZmljYW50IGJpdCAoTVNCKSBpbiB3b3JkCisgKgorICovCitzdGF0aWMgaW50IG1zYl9pbmRleCAoX191MTYgd29yZCkgCit7CisJX191MTYgbXNiID0gMHg4MDAwOworCWludCBpbmRleCA9IDE1OyAgIC8qIEN1cnJlbnQgTVNCICovCisKKwkvKiBDaGVjayBmb3IgYnVnZ3kgcGVlcnMuCisJICogTm90ZSA6IHRoZXJlIGlzIGEgc21hbGwgcHJvYmFiaWxpdHkgdGhhdCBpdCBjb3VsZCBiZSB1cywgYnV0IEkKKwkgKiB3b3VsZCBleHBlY3QgZHJpdmVyIGF1dGhvcnMgdG8gY2F0Y2ggdGhhdCBwcmV0dHkgZWFybHkgYW5kIGJlCisJICogYWJsZSB0byBjaGVjayBwcmVjaXNlbHkgd2hhdCdzIGdvaW5nIG9uLiBJZiBhIGVuZCB1c2VyIHNlZXMgdGhpcywKKwkgKiBpdCdzIHZlcnkgbGlrZWx5IHRoZSBwZWVyLiAtIEplYW4gSUkgKi8KKwlpZiAod29yZCA9PSAwKSB7CisJCUlSREFfV0FSTklORygiJXMoKSwgRGV0ZWN0ZWQgYnVnZ3kgcGVlciwgYWRqdXN0IG51bGwgUFYgdG8gMHgxIVxuIiwKKwkJCSBfX0ZVTkNUSU9OX18pOworCQkvKiBUaGUgb25seSBzYWZlIGNob2ljZSAod2UgZG9uJ3Qga25vdyB0aGUgYXJyYXkgc2l6ZSkgKi8KKwkJd29yZCA9IDB4MTsKKwl9CisKKwl3aGlsZSAobXNiKSB7CisJCWlmICh3b3JkICYgbXNiKQorCQkJYnJlYWs7ICAgLyogRm91bmQgaXQhICovCisJCW1zYiA+Pj0xOworCQlpbmRleC0tOworCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB2YWx1ZV9sb3dlcl9iaXRzICh2YWx1ZSwgYXJyYXkpCisgKgorICogICAgUmV0dXJucyBhIGJpdCBmaWVsZCBtYXJraW5nIGFsbCBwb3NzaWJpbGl0eSBsb3dlciB0aGFuIHZhbHVlLgorICovCitzdGF0aWMgaW5saW5lIGludCB2YWx1ZV9sb3dlcl9iaXRzKF9fdTMyIHZhbHVlLCBfX3UzMiAqYXJyYXksIGludCBzaXplLCBfX3UxNiAqZmllbGQpCit7CisJaW50CWk7CisJX191MTYJbWFzayA9IDB4MTsKKwlfX3UxNglyZXN1bHQgPSAweDA7CisKKwlmb3IgKGk9MDsgaSA8IHNpemU7IGkrKykgeworCQkvKiBBZGQgdGhlIGN1cnJlbnQgdmFsdWUgdG8gdGhlIGJpdCBmaWVsZCwgc2hpZnQgbWFzayAqLworCQlyZXN1bHQgfD0gbWFzazsKKwkJbWFzayA8PD0gMTsKKwkJLyogRmluaXNoZWQgPyAqLworCQlpZiAoYXJyYXlbaV0gPj0gdmFsdWUpCisJCQlicmVhazsKKwl9CisJLyogU2VuZCBiYWNrIGEgdmFsaWQgaW5kZXggKi8KKwlpZihpID49IHNpemUpCisJICBpID0gc2l6ZSAtIDE7CS8qIExhc3QgaXRlbSAqLworCSpmaWVsZCA9IHJlc3VsdDsKKwlyZXR1cm4gaTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHZhbHVlX2hpZ2hlc3RfYml0ICh2YWx1ZSwgYXJyYXkpCisgKgorICogICAgUmV0dXJucyBhIGJpdCBmaWVsZCBtYXJraW5nIHRoZSBoaWdoZXN0IHBvc3NpYmlsaXR5IGxvd2VyIHRoYW4gdmFsdWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHZhbHVlX2hpZ2hlc3RfYml0KF9fdTMyIHZhbHVlLCBfX3UzMiAqYXJyYXksIGludCBzaXplLCBfX3UxNiAqZmllbGQpCit7CisJaW50CWk7CisJX191MTYJbWFzayA9IDB4MTsKKwlfX3UxNglyZXN1bHQgPSAweDA7CisKKwlmb3IgKGk9MDsgaSA8IHNpemU7IGkrKykgeworCQkvKiBGaW5pc2hlZCA/ICovCisJCWlmIChhcnJheVtpXSA8PSB2YWx1ZSkKKwkJCWJyZWFrOworCQkvKiBTaGlmdCBtYXNrICovCisJCW1hc2sgPDw9IDE7CisJfQorCS8qIFNldCB0aGUgY3VycmVudCB2YWx1ZSB0byB0aGUgYml0IGZpZWxkICovCisJcmVzdWx0IHw9IG1hc2s7CisJLyogU2VuZCBiYWNrIGEgdmFsaWQgaW5kZXggKi8KKwlpZihpID49IHNpemUpCisJICBpID0gc2l6ZSAtIDE7CS8qIExhc3QgaXRlbSAqLworCSpmaWVsZCA9IHJlc3VsdDsKKwlyZXR1cm4gaTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTUFJTiBDQUxMUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogRnVuY3Rpb24gaXJkYV9xb3NfY29tcHV0ZV9pbnRlcnNlY3Rpb24gKHFvcywgbmV3KQorICoKKyAqICAgIENvbXB1dGUgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgb2xkIFFvUyBjYXBhYmlsaXRpZXMgd2l0aCBuZXcgb25lcworICoKKyAqLwordm9pZCBpcmRhX3Fvc19jb21wdXRlX2ludGVyc2VjdGlvbihzdHJ1Y3QgcW9zX2luZm8gKnFvcywgc3RydWN0IHFvc19pbmZvICpuZXcpCit7CisJSVJEQV9BU1NFUlQocW9zICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKG5ldyAhPSBOVUxMLCByZXR1cm47KTsKKworCS8qIEFwcGx5ICovCisJcW9zLT5iYXVkX3JhdGUuYml0cyAgICAgICAmPSBuZXctPmJhdWRfcmF0ZS5iaXRzOworCXFvcy0+d2luZG93X3NpemUuYml0cyAgICAgJj0gbmV3LT53aW5kb3dfc2l6ZS5iaXRzOworCXFvcy0+bWluX3R1cm5fdGltZS5iaXRzICAgJj0gbmV3LT5taW5fdHVybl90aW1lLmJpdHM7CisJcW9zLT5tYXhfdHVybl90aW1lLmJpdHMgICAmPSBuZXctPm1heF90dXJuX3RpbWUuYml0czsKKwlxb3MtPmRhdGFfc2l6ZS5iaXRzICAgICAgICY9IG5ldy0+ZGF0YV9zaXplLmJpdHM7CisJcW9zLT5saW5rX2Rpc2NfdGltZS5iaXRzICAmPSBuZXctPmxpbmtfZGlzY190aW1lLmJpdHM7CisJcW9zLT5hZGRpdGlvbmFsX2JvZnMuYml0cyAmPSBuZXctPmFkZGl0aW9uYWxfYm9mcy5iaXRzOworCisJaXJkYV9xb3NfYml0c190b192YWx1ZShxb3MpOworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcyAocW9zKQorICoKKyAqICAgIFRoZSBwdXJwb3NlIG9mIHRoaXMgZnVuY3Rpb24gaXMgZm9yIGxheWVycyBhbmQgZHJpdmVycyB0byBiZSBhYmxlIHRvCisgKiAgICBzZXQgdGhlIG1heGltdW0gUW9TIHBvc3NpYmxlIGFuZCB0aGVuICJhbmQgaW4iIHRoZWlyIG93biBsaW1pdGF0aW9ucworICogCisgKi8KK3ZvaWQgaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcyhzdHJ1Y3QgcW9zX2luZm8gKnFvcykKK3sKKwlpbnQgaTsKKwkvKiAKKwkgKiAgVGhlc2UgYXJlIHRoZSBtYXhpbXVtIHN1cHBvcnRlZCB2YWx1ZXMgYXMgc3BlY2lmaWVkIG9uIHBhZ2VzCisJICogIDM5LTQzIGluIElyTEFQCisJICovCisKKwkvKiBVc2Ugc3lzY3RsIHRvIHNldCBzb21lIGNvbmZpZ3VyYWJsZSB2YWx1ZXMuLi4gKi8KKwkvKiBTZXQgY29uZmlndXJlZCBtYXggc3BlZWQgKi8KKwlpID0gdmFsdWVfbG93ZXJfYml0cyhzeXNjdGxfbWF4X2JhdWRfcmF0ZSwgYmF1ZF9yYXRlcywgMTAsCisJCQkgICAgICZxb3MtPmJhdWRfcmF0ZS5iaXRzKTsKKwlzeXNjdGxfbWF4X2JhdWRfcmF0ZSA9IGluZGV4X3ZhbHVlKGksIGJhdWRfcmF0ZXMpOworCisJLyogU2V0IGNvbmZpZ3VyZWQgbWF4IGRpc2MgdGltZSAqLworCWkgPSB2YWx1ZV9sb3dlcl9iaXRzKHN5c2N0bF9tYXhfbm9yZXBseV90aW1lLCBsaW5rX2Rpc2NfdGltZXMsIDgsCisJCQkgICAgICZxb3MtPmxpbmtfZGlzY190aW1lLmJpdHMpOworCXN5c2N0bF9tYXhfbm9yZXBseV90aW1lID0gaW5kZXhfdmFsdWUoaSwgbGlua19kaXNjX3RpbWVzKTsKKworCS8qIExTQiBpcyBmaXJzdCBieXRlLCBNU0IgaXMgc2Vjb25kIGJ5dGUgKi8KKwlxb3MtPmJhdWRfcmF0ZS5iaXRzICAgICY9IDB4MDNmZjsKKworCXFvcy0+d2luZG93X3NpemUuYml0cyAgICAgPSAweDdmOworCXFvcy0+bWluX3R1cm5fdGltZS5iaXRzICAgPSAweGZmOworCXFvcy0+bWF4X3R1cm5fdGltZS5iaXRzICAgPSAweDBmOworCXFvcy0+ZGF0YV9zaXplLmJpdHMgICAgICAgPSAweDNmOworCXFvcy0+bGlua19kaXNjX3RpbWUuYml0cyAmPSAweGZmOworCXFvcy0+YWRkaXRpb25hbF9ib2ZzLmJpdHMgPSAweGZmOworfQorRVhQT1JUX1NZTUJPTChpcmRhX2luaXRfbWF4X3Fvc19jYXBhYmlsaWVzKTsKKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX2FkanVzdF9xb3Nfc2V0dGluZ3MgKHFvcykKKyAqCisgKiAgICAgQWRqdXN0IFFvUyBzZXR0aW5ncyBpbiBjYXNlIHNvbWUgdmFsdWVzIGFyZSBub3QgcG9zc2libGUgdG8gdXNlIGJlY2F1c2UKKyAqICAgICBvZiBvdGhlciBzZXR0aW5ncworICovCitzdGF0aWMgdm9pZCBpcmxhcF9hZGp1c3RfcW9zX3NldHRpbmdzKHN0cnVjdCBxb3NfaW5mbyAqcW9zKQoreworCV9fdTMyIGxpbmVfY2FwYWNpdHk7CisJaW50IGluZGV4OworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qCisJICogTWFrZSBzdXJlIHRoZSBtaW50dCBpcyBzZW5zaWJsZS4KKwkgKiBNYWluIGN1bHByaXQgOiBFcmljc3NvbiBUMzkuIC0gSmVhbiBJSQorCSAqLworCWlmIChzeXNjdGxfbWluX3R4X3R1cm5fdGltZSA+IHFvcy0+bWluX3R1cm5fdGltZS52YWx1ZSkgeworCQlpbnQgaTsKKworCQlJUkRBX1dBUk5JTkcoIiVzKCksIERldGVjdGVkIGJ1Z2d5IHBlZXIsIGFkanVzdCBtdHQgdG8gJWR1cyFcbiIsCisJCQkgX19GVU5DVElPTl9fLCBzeXNjdGxfbWluX3R4X3R1cm5fdGltZSk7CisKKwkJLyogV2UgZG9uJ3QgcmVhbGx5IG5lZWQgYml0cywgYnV0IGVhc2llciB0aGlzIHdheSAqLworCQlpID0gdmFsdWVfaGlnaGVzdF9iaXQoc3lzY3RsX21pbl90eF90dXJuX3RpbWUsIG1pbl90dXJuX3RpbWVzLAorCQkJCSAgICAgIDgsICZxb3MtPm1pbl90dXJuX3RpbWUuYml0cyk7CisJCXN5c2N0bF9taW5fdHhfdHVybl90aW1lID0gaW5kZXhfdmFsdWUoaSwgbWluX3R1cm5fdGltZXMpOworCQlxb3MtPm1pbl90dXJuX3RpbWUudmFsdWUgPSBzeXNjdGxfbWluX3R4X3R1cm5fdGltZTsKKwl9CisKKwkvKiAKKwkgKiBOb3QgYWxsb3dlZCB0byB1c2UgYSBtYXggdHVybiB0aW1lIGxlc3MgdGhhbiA1MDAgbXMgaWYgdGhlIGJhdWRyYXRlCisJICogaXMgbGVzcyB0aGFuIDExNTIwMAorCSAqLworCWlmICgocW9zLT5iYXVkX3JhdGUudmFsdWUgPCAxMTUyMDApICYmIAorCSAgICAocW9zLT5tYXhfdHVybl90aW1lLnZhbHVlIDwgNTAwKSkKKwl7CisJCUlSREFfREVCVUcoMCwgCisJCQkgICAiJXMoKSwgYWRqdXN0aW5nIG1heCB0dXJuIHRpbWUgZnJvbSAlZCB0byA1MDAgbXNcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHFvcy0+bWF4X3R1cm5fdGltZS52YWx1ZSk7CisJCXFvcy0+bWF4X3R1cm5fdGltZS52YWx1ZSA9IDUwMDsKKwl9CisJCisJLyoKKwkgKiBUaGUgZGF0YSBzaXplIG11c3QgYmUgYWRqdXN0ZWQgYWNjb3JkaW5nIHRvIHRoZSBiYXVkIHJhdGUgYW5kIG1heCAKKwkgKiB0dXJuIHRpbWUKKwkgKi8KKwlpbmRleCA9IHZhbHVlX2luZGV4KHFvcy0+ZGF0YV9zaXplLnZhbHVlLCBkYXRhX3NpemVzLCA2KTsKKwlsaW5lX2NhcGFjaXR5ID0gaXJsYXBfbWF4X2xpbmVfY2FwYWNpdHkocW9zLT5iYXVkX3JhdGUudmFsdWUsIAorCQkJCQkJcW9zLT5tYXhfdHVybl90aW1lLnZhbHVlKTsKKworI2lmZGVmIENPTkZJR19JUkRBX0RZTkFNSUNfV0lORE9XCisJd2hpbGUgKChxb3MtPmRhdGFfc2l6ZS52YWx1ZSA+IGxpbmVfY2FwYWNpdHkpICYmIChpbmRleCA+IDApKSB7CisJCXFvcy0+ZGF0YV9zaXplLnZhbHVlID0gZGF0YV9zaXplc1tpbmRleC0tXTsKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgcmVkdWNpbmcgZGF0YSBzaXplIHRvICVkXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBxb3MtPmRhdGFfc2l6ZS52YWx1ZSk7CisJfQorI2Vsc2UgLyogVXNlIG1ldGhvZCBkZXNjcmliZWQgaW4gc2VjdGlvbiA2LjYuMTEgb2YgSXJMQVAgKi8KKwl3aGlsZSAoaXJsYXBfcmVxdWVzdGVkX2xpbmVfY2FwYWNpdHkocW9zKSA+IGxpbmVfY2FwYWNpdHkpIHsKKwkJSVJEQV9BU1NFUlQoaW5kZXggIT0gMCwgcmV0dXJuOyk7CisKKwkJLyogTXVzdCBiZSBhYmxlIHRvIHNlbmQgYXQgbGVhc3Qgb25lIGZyYW1lICovCisJCWlmIChxb3MtPndpbmRvd19zaXplLnZhbHVlID4gMSkgeworCQkJcW9zLT53aW5kb3dfc2l6ZS52YWx1ZS0tOworCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgcmVkdWNpbmcgd2luZG93IHNpemUgdG8gJWRcbiIsCisJCQkJICAgX19GVU5DVElPTl9fLCBxb3MtPndpbmRvd19zaXplLnZhbHVlKTsKKwkJfSBlbHNlIGlmIChpbmRleCA+IDEpIHsKKwkJCXFvcy0+ZGF0YV9zaXplLnZhbHVlID0gZGF0YV9zaXplc1tpbmRleC0tXTsKKwkJCUlSREFfREVCVUcoMiwgIiVzKCksIHJlZHVjaW5nIGRhdGEgc2l6ZSB0byAlZFxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18sIHFvcy0+ZGF0YV9zaXplLnZhbHVlKTsKKwkJfSBlbHNlIHsKKwkJCUlSREFfV0FSTklORygiJXMoKSwgbm90aGluZyBtb3JlIHdlIGNhbiBkbyFcbiIsCisJCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQl9CisJfQorI2VuZGlmIC8qIENPTkZJR19JUkRBX0RZTkFNSUNfV0lORE9XICovCisJLyoKKwkgKiBGaXggdHggZGF0YSBzaXplIGFjY29yZGluZyB0byB1c2VyIGxpbWl0cyAtIEplYW4gSUkKKwkgKi8KKwlpZiAocW9zLT5kYXRhX3NpemUudmFsdWUgPiBzeXNjdGxfbWF4X3R4X2RhdGFfc2l6ZSkKKwkJLyogQWxsb3cgbm9uIGRpc2NyZXRlIGFkanVzdGVtZW50IHRvIGF2b2lkIGxvb3NpbmcgY2FwYWNpdHkgKi8KKwkJcW9zLT5kYXRhX3NpemUudmFsdWUgPSBzeXNjdGxfbWF4X3R4X2RhdGFfc2l6ZTsKKwkvKgorCSAqIE92ZXJyaWRlIFR4IHdpbmRvdyBpZiB1c2VyIHJlcXVlc3QgaXQuIC0gSmVhbiBJSQorCSAqLworCWlmIChxb3MtPndpbmRvd19zaXplLnZhbHVlID4gc3lzY3RsX21heF90eF93aW5kb3cpCisJCXFvcy0+d2luZG93X3NpemUudmFsdWUgPSBzeXNjdGxfbWF4X3R4X3dpbmRvdzsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlybGFwX25lZ290aWF0ZSAocW9zX2RldmljZSwgcW9zX3Nlc3Npb24sIHNrYikKKyAqCisgKiAgICBOZWdvdGlhdGUgUW9TIHZhbHVlcywgbm90IHJlYWxseSB0aGF0IG11Y2ggbmVnb3RpYXRpb24gOi0pCisgKiAgICBXZSBqdXN0IHNldCB0aGUgUW9TIGNhcGFiaWxpdGllcyBmb3IgdGhlIHBlZXIgc3RhdGlvbgorICoKKyAqLworaW50IGlybGFwX3Fvc19uZWdvdGlhdGUoc3RydWN0IGlybGFwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAKK3sKKwlpbnQgcmV0OworCQorCXJldCA9IGlyZGFfcGFyYW1fZXh0cmFjdF9hbGwoc2VsZiwgc2tiLT5kYXRhLCBza2ItPmxlbiwgCisJCQkJICAgICAmaXJsYXBfcGFyYW1faW5mbyk7CisJCisJLyogQ29udmVydCB0aGUgbmVnb3RpYXRlZCBiaXRzIHRvIHZhbHVlcyAqLworCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUoJnNlbGYtPnFvc190eCk7CisJaXJkYV9xb3NfYml0c190b192YWx1ZSgmc2VsZi0+cW9zX3J4KTsKKworCWlybGFwX2FkanVzdF9xb3Nfc2V0dGluZ3MoJnNlbGYtPnFvc190eCk7CisKKwlJUkRBX0RFQlVHKDIsICJTZXR0aW5nIEJBVURfUkFURSB0byAlZCBicHMuXG4iLCAKKwkJICAgc2VsZi0+cW9zX3R4LmJhdWRfcmF0ZS52YWx1ZSk7CisJSVJEQV9ERUJVRygyLCAiU2V0dGluZyBEQVRBX1NJWkUgdG8gJWQgYnl0ZXNcbiIsCisJCSAgIHNlbGYtPnFvc190eC5kYXRhX3NpemUudmFsdWUpOworCUlSREFfREVCVUcoMiwgIlNldHRpbmcgV0lORE9XX1NJWkUgdG8gJWRcbiIsIAorCQkgICBzZWxmLT5xb3NfdHgud2luZG93X3NpemUudmFsdWUpOworCUlSREFfREVCVUcoMiwgIlNldHRpbmcgWEJPRlMgdG8gJWRcbiIsIAorCQkgICBzZWxmLT5xb3NfdHguYWRkaXRpb25hbF9ib2ZzLnZhbHVlKTsKKwlJUkRBX0RFQlVHKDIsICJTZXR0aW5nIE1BWF9UVVJOX1RJTUUgdG8gJWQgbXMuXG4iLAorCQkgICBzZWxmLT5xb3NfdHgubWF4X3R1cm5fdGltZS52YWx1ZSk7CisJSVJEQV9ERUJVRygyLCAiU2V0dGluZyBNSU5fVFVSTl9USU1FIHRvICVkIHVzZWNzLlxuIiwKKwkJICAgc2VsZi0+cW9zX3R4Lm1pbl90dXJuX3RpbWUudmFsdWUpOworCUlSREFfREVCVUcoMiwgIlNldHRpbmcgTElOS19ESVNDIHRvICVkIHNlY3MuXG4iLCAKKwkJICAgc2VsZi0+cW9zX3R4LmxpbmtfZGlzY190aW1lLnZhbHVlKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfaW5zZXJ0X25lZ290aWF0aW9uX3BhcmFtcyAocW9zLCBmcCkKKyAqCisgKiAgICBJbnNlcnQgUW9TIG5lZ290aWFpb24gcGFyYXJhbWV0ZXJzIGludG8gZnJhbWUKKyAqCisgKi8KK2ludCBpcmxhcF9pbnNlcnRfcW9zX25lZ290aWF0aW9uX3BhcmFtcyhzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIAorCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCByZXQ7CisKKwkvKiBJbnNlcnQgZGF0YSByYXRlICovCisJcmV0ID0gaXJkYV9wYXJhbV9pbnNlcnQoc2VsZiwgUElfQkFVRF9SQVRFLCBza2ItPnRhaWwsIAorCQkJCXNrYl90YWlscm9vbShza2IpLCAmaXJsYXBfcGFyYW1faW5mbyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJc2tiX3B1dChza2IsIHJldCk7CisKKwkvKiBJbnNlcnQgbWF4IHR1cm5hcm91bmQgdGltZSAqLworCXJldCA9IGlyZGFfcGFyYW1faW5zZXJ0KHNlbGYsIFBJX01BWF9UVVJOX1RJTUUsIHNrYi0+dGFpbCwgCisJCQkJc2tiX3RhaWxyb29tKHNrYiksICZpcmxhcF9wYXJhbV9pbmZvKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlza2JfcHV0KHNrYiwgcmV0KTsKKworCS8qIEluc2VydCBkYXRhIHNpemUgKi8KKwlyZXQgPSBpcmRhX3BhcmFtX2luc2VydChzZWxmLCBQSV9EQVRBX1NJWkUsIHNrYi0+dGFpbCwgCisJCQkJc2tiX3RhaWxyb29tKHNrYiksICZpcmxhcF9wYXJhbV9pbmZvKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlza2JfcHV0KHNrYiwgcmV0KTsKKworCS8qIEluc2VydCB3aW5kb3cgc2l6ZSAqLworCXJldCA9IGlyZGFfcGFyYW1faW5zZXJ0KHNlbGYsIFBJX1dJTkRPV19TSVpFLCBza2ItPnRhaWwsIAorCQkJCXNrYl90YWlscm9vbShza2IpLCAmaXJsYXBfcGFyYW1faW5mbyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJc2tiX3B1dChza2IsIHJldCk7CisKKwkvKiBJbnNlcnQgYWRkaXRpb25hbCBCT0ZzICovCisJcmV0ID0gaXJkYV9wYXJhbV9pbnNlcnQoc2VsZiwgUElfQUREX0JPRlMsIHNrYi0+dGFpbCwgCisJCQkJc2tiX3RhaWxyb29tKHNrYiksICZpcmxhcF9wYXJhbV9pbmZvKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlza2JfcHV0KHNrYiwgcmV0KTsKKworCS8qIEluc2VydCBtaW5pbXVtIHR1cm5hcm91bmQgdGltZSAqLworCXJldCA9IGlyZGFfcGFyYW1faW5zZXJ0KHNlbGYsIFBJX01JTl9UVVJOX1RJTUUsIHNrYi0+dGFpbCwgCisJCQkJc2tiX3RhaWxyb29tKHNrYiksICZpcmxhcF9wYXJhbV9pbmZvKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlza2JfcHV0KHNrYiwgcmV0KTsKKworCS8qIEluc2VydCBsaW5rIGRpc2Nvbm5lY3QvdGhyZXNob2xkIHRpbWUgKi8KKwlyZXQgPSBpcmRhX3BhcmFtX2luc2VydChzZWxmLCBQSV9MSU5LX0RJU0MsIHNrYi0+dGFpbCwgCisJCQkJc2tiX3RhaWxyb29tKHNrYiksICZpcmxhcF9wYXJhbV9pbmZvKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlza2JfcHV0KHNrYiwgcmV0KTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfcGFyYW1fYmF1ZF9yYXRlIChpbnN0YW5jZSwgcGFyYW0sIGdldCkKKyAqCisgKiAgICBOZWdvdGlhdGUgZGF0YS1yYXRlCisgKgorICovCitzdGF0aWMgaW50IGlybGFwX3BhcmFtX2JhdWRfcmF0ZSh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJhbSwgaW50IGdldCkKK3sKKwlfX3UxNiBmaW5hbDsKKworCXN0cnVjdCBpcmxhcF9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJsYXBfY2IgKikgaW5zdGFuY2U7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlpZiAoZ2V0KSB7CisJCXBhcmFtLT5wdi5pID0gc2VsZi0+cW9zX3J4LmJhdWRfcmF0ZS5iaXRzOworCQlJUkRBX0RFQlVHKDIsICIlcygpLCBiYXVkIHJhdGUgPSAweCUwMnhcbiIsIAorCQkJICAgX19GVU5DVElPTl9fLCBwYXJhbS0+cHYuaSk7CQkKKwl9IGVsc2UgeworCQkvKiAKKwkJICogIFN0YXRpb25zIG11c3QgYWdyZWUgb24gYmF1ZCByYXRlLCBzbyBjYWxjdWxhdGUKKwkJICogIGludGVyc2VjdGlvbiAKKwkJICovCisJCUlSREFfREVCVUcoMiwgIlJlcXVlc3RlZCBCQVVEX1JBVEU6IDB4JTA0eFxuIiwgKF9fdTE2KSBwYXJhbS0+cHYuaSk7CisJCWZpbmFsID0gKF9fdTE2KSBwYXJhbS0+cHYuaSAmIHNlbGYtPnFvc19yeC5iYXVkX3JhdGUuYml0czsKKworCQlJUkRBX0RFQlVHKDIsICJGaW5hbCBCQVVEX1JBVEU6IDB4JTA0eFxuIiwgZmluYWwpOworCQlzZWxmLT5xb3NfdHguYmF1ZF9yYXRlLmJpdHMgPSBmaW5hbDsKKwkJc2VsZi0+cW9zX3J4LmJhdWRfcmF0ZS5iaXRzID0gZmluYWw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9wYXJhbV9saW5rX2Rpc2Nvbm5lY3QgKGluc3RhbmNlLCBwYXJhbSwgZ2V0KQorICoKKyAqICAgIE5lZ290aWF0ZSBsaW5rIGRpc2Nvbm5lY3QvdGhyZXNob2xkIHRpbWUuIAorICoKKyAqLworc3RhdGljIGludCBpcmxhcF9wYXJhbV9saW5rX2Rpc2Nvbm5lY3Qodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIAorCQkJCSAgICAgICBpbnQgZ2V0KQoreworCV9fdTE2IGZpbmFsOworCQorCXN0cnVjdCBpcmxhcF9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJsYXBfY2IgKikgaW5zdGFuY2U7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybiAtMTspOworCQorCWlmIChnZXQpCisJCXBhcmFtLT5wdi5pID0gc2VsZi0+cW9zX3J4LmxpbmtfZGlzY190aW1lLmJpdHM7CisJZWxzZSB7CisJCS8qICAKKwkJICogIFN0YXRpb25zIG11c3QgYWdyZWUgb24gbGluayBkaXNjb25uZWN0L3RocmVzaG9sZCAKKwkJICogIHRpbWUuCisJCSAqLworCQlJUkRBX0RFQlVHKDIsICJMSU5LX0RJU0M6ICUwMnhcbiIsIChfX3U4KSBwYXJhbS0+cHYuaSk7CisJCWZpbmFsID0gKF9fdTgpIHBhcmFtLT5wdi5pICYgc2VsZi0+cW9zX3J4LmxpbmtfZGlzY190aW1lLmJpdHM7CisKKwkJSVJEQV9ERUJVRygyLCAiRmluYWwgTElOS19ESVNDOiAlMDJ4XG4iLCBmaW5hbCk7CisJCXNlbGYtPnFvc190eC5saW5rX2Rpc2NfdGltZS5iaXRzID0gZmluYWw7CisJCXNlbGYtPnFvc19yeC5saW5rX2Rpc2NfdGltZS5iaXRzID0gZmluYWw7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfcGFyYW1fbWF4X3R1cm5fdGltZSAoaW5zdGFuY2UsIHBhcmFtLCBnZXQpCisgKgorICogICAgTmVnb3RpYXRlIHRoZSBtYXhpbXVtIHR1cm5hcm91bmQgdGltZS4gVGhpcyBpcyBhIHR5cGUgMSBwYXJhbWV0ZXIgYW5kCisgKiAgICB3aWxsIGJlIG5lZ290aWF0ZWQgaW5kZXBlbmRlbnRseSBmb3IgZWFjaCBzdGF0aW9uCisgKgorICovCitzdGF0aWMgaW50IGlybGFwX3BhcmFtX21heF90dXJuX3RpbWUodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIAorCQkJCSAgICAgaW50IGdldCkKK3sKKwlzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYgPSAoc3RydWN0IGlybGFwX2NiICopIGluc3RhbmNlOworCQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm4gLTE7KTsKKwkKKwlpZiAoZ2V0KQorCQlwYXJhbS0+cHYuaSA9IHNlbGYtPnFvc19yeC5tYXhfdHVybl90aW1lLmJpdHM7CisJZWxzZQorCQlzZWxmLT5xb3NfdHgubWF4X3R1cm5fdGltZS5iaXRzID0gKF9fdTgpIHBhcmFtLT5wdi5pOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9wYXJhbV9kYXRhX3NpemUgKGluc3RhbmNlLCBwYXJhbSwgZ2V0KQorICoKKyAqICAgIE5lZ290aWF0ZSB0aGUgZGF0YSBzaXplLiBUaGlzIGlzIGEgdHlwZSAxIHBhcmFtZXRlciBhbmQKKyAqICAgIHdpbGwgYmUgbmVnb3RpYXRlZCBpbmRlcGVuZGVudGx5IGZvciBlYWNoIHN0YXRpb24KKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJsYXBfcGFyYW1fZGF0YV9zaXplKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCBpbnQgZ2V0KQoreworCXN0cnVjdCBpcmxhcF9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJsYXBfY2IgKikgaW5zdGFuY2U7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybiAtMTspOworCQorCWlmIChnZXQpCisJCXBhcmFtLT5wdi5pID0gc2VsZi0+cW9zX3J4LmRhdGFfc2l6ZS5iaXRzOworCWVsc2UKKwkJc2VsZi0+cW9zX3R4LmRhdGFfc2l6ZS5iaXRzID0gKF9fdTgpIHBhcmFtLT5wdi5pOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9wYXJhbV93aW5kb3dfc2l6ZSAoaW5zdGFuY2UsIHBhcmFtLCBnZXQpCisgKgorICogICAgTmVnb3RpYXRlIHRoZSB3aW5kb3cgc2l6ZS4gVGhpcyBpcyBhIHR5cGUgMSBwYXJhbWV0ZXIgYW5kCisgKiAgICB3aWxsIGJlIG5lZ290aWF0ZWQgaW5kZXBlbmRlbnRseSBmb3IgZWFjaCBzdGF0aW9uCisgKgorICovCitzdGF0aWMgaW50IGlybGFwX3BhcmFtX3dpbmRvd19zaXplKHZvaWQgKmluc3RhbmNlLCBpcmRhX3BhcmFtX3QgKnBhcmFtLCAKKwkJCQkgICBpbnQgZ2V0KQoreworCXN0cnVjdCBpcmxhcF9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJsYXBfY2IgKikgaW5zdGFuY2U7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybiAtMTspOworCQorCWlmIChnZXQpCisJCXBhcmFtLT5wdi5pID0gc2VsZi0+cW9zX3J4LndpbmRvd19zaXplLmJpdHM7CisJZWxzZQorCQlzZWxmLT5xb3NfdHgud2luZG93X3NpemUuYml0cyA9IChfX3U4KSBwYXJhbS0+cHYuaTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfcGFyYW1fYWRkaXRpb25hbF9ib2ZzIChpbnN0YW5jZSwgcGFyYW0sIGdldCkKKyAqCisgKiAgICBOZWdvdGlhdGUgYWRkaXRpb25hbCBCT0YgY2hhcmFjdGVycy4gVGhpcyBpcyBhIHR5cGUgMSBwYXJhbWV0ZXIgYW5kCisgKiAgICB3aWxsIGJlIG5lZ290aWF0ZWQgaW5kZXBlbmRlbnRseSBmb3IgZWFjaCBzdGF0aW9uLgorICovCitzdGF0aWMgaW50IGlybGFwX3BhcmFtX2FkZGl0aW9uYWxfYm9mcyh2b2lkICppbnN0YW5jZSwgaXJkYV9wYXJhbV90ICpwYXJhbSwgaW50IGdldCkKK3sKKwlzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYgPSAoc3RydWN0IGlybGFwX2NiICopIGluc3RhbmNlOworCQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm4gLTE7KTsKKwkKKwlpZiAoZ2V0KQorCQlwYXJhbS0+cHYuaSA9IHNlbGYtPnFvc19yeC5hZGRpdGlvbmFsX2JvZnMuYml0czsKKwllbHNlCisJCXNlbGYtPnFvc190eC5hZGRpdGlvbmFsX2JvZnMuYml0cyA9IChfX3U4KSBwYXJhbS0+cHYuaTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJsYXBfcGFyYW1fbWluX3R1cm5fdGltZSAoaW5zdGFuY2UsIHBhcmFtLCBnZXQpCisgKgorICogICAgTmVnb3RpYXRlIHRoZSBtaW5pbXVtIHR1cm4gYXJvdW5kIHRpbWUuIFRoaXMgaXMgYSB0eXBlIDEgcGFyYW1ldGVyIGFuZAorICogICAgd2lsbCBiZSBuZWdvdGlhdGVkIGluZGVwZW5kZW50bHkgZm9yIGVhY2ggc3RhdGlvbgorICovCitzdGF0aWMgaW50IGlybGFwX3BhcmFtX21pbl90dXJuX3RpbWUodm9pZCAqaW5zdGFuY2UsIGlyZGFfcGFyYW1fdCAqcGFyYW0sIAorCQkJCSAgICAgaW50IGdldCkKK3sKKwlzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYgPSAoc3RydWN0IGlybGFwX2NiICopIGluc3RhbmNlOworCQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm4gLTE7KTsKKwkKKwlpZiAoZ2V0KQorCQlwYXJhbS0+cHYuaSA9IHNlbGYtPnFvc19yeC5taW5fdHVybl90aW1lLmJpdHM7CisJZWxzZQorCQlzZWxmLT5xb3NfdHgubWluX3R1cm5fdGltZS5iaXRzID0gKF9fdTgpIHBhcmFtLT5wdi5pOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9tYXhfbGluZV9jYXBhY2l0eSAoc3BlZWQsIG1heF90dXJuX3RpbWUsIG1pbl90dXJuX3RpbWUpCisgKgorICogICAgQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIGxpbmUgY2FwYWNpdHkKKyAqCisgKi8KK19fdTMyIGlybGFwX21heF9saW5lX2NhcGFjaXR5KF9fdTMyIHNwZWVkLCBfX3UzMiBtYXhfdHVybl90aW1lKQoreworCV9fdTMyIGxpbmVfY2FwYWNpdHk7CisJaW50IGksajsKKworCUlSREFfREVCVUcoMiwgIiVzKCksIHNwZWVkPSVkLCBtYXhfdHVybl90aW1lPSVkXG4iLAorCQkgICBfX0ZVTkNUSU9OX18sIHNwZWVkLCBtYXhfdHVybl90aW1lKTsKKworCWkgPSB2YWx1ZV9pbmRleChzcGVlZCwgYmF1ZF9yYXRlcywgMTApOworCWogPSB2YWx1ZV9pbmRleChtYXhfdHVybl90aW1lLCBtYXhfdHVybl90aW1lcywgNCk7CisKKwlJUkRBX0FTU0VSVCgoKGkgPj0wKSAmJiAoaSA8MTApKSwgcmV0dXJuIDA7KTsKKwlJUkRBX0FTU0VSVCgoKGogPj0wKSAmJiAoaiA8NCkpLCByZXR1cm4gMDspOworCisJbGluZV9jYXBhY2l0eSA9IG1heF9saW5lX2NhcGFjaXRpZXNbaV1bal07CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBsaW5lIGNhcGFjaXR5PSVkIGJ5dGVzXG4iLCAKKwkJICAgX19GVU5DVElPTl9fLCBsaW5lX2NhcGFjaXR5KTsKKwkKKwlyZXR1cm4gbGluZV9jYXBhY2l0eTsKK30KKworI2lmbmRlZiBDT05GSUdfSVJEQV9EWU5BTUlDX1dJTkRPVworc3RhdGljIF9fdTMyIGlybGFwX3JlcXVlc3RlZF9saW5lX2NhcGFjaXR5KHN0cnVjdCBxb3NfaW5mbyAqcW9zKQoreworCV9fdTMyIGxpbmVfY2FwYWNpdHk7CisKKwlsaW5lX2NhcGFjaXR5ID0gcW9zLT53aW5kb3dfc2l6ZS52YWx1ZSAqCisJCShxb3MtPmRhdGFfc2l6ZS52YWx1ZSArIDYgKyBxb3MtPmFkZGl0aW9uYWxfYm9mcy52YWx1ZSkgKworCQlpcmxhcF9taW5fdHVybl90aW1lX2luX2J5dGVzKHFvcy0+YmF1ZF9yYXRlLnZhbHVlLAorCQkJCQkgICAgIHFvcy0+bWluX3R1cm5fdGltZS52YWx1ZSk7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCByZXF1ZXN0ZWQgbGluZSBjYXBhY2l0eT0lZFxuIiwKKwkJICAgX19GVU5DVElPTl9fLCBsaW5lX2NhcGFjaXR5KTsKKworCXJldHVybiBsaW5lX2NhcGFjaXR5OworfQorI2VuZGlmCisKK3ZvaWQgaXJkYV9xb3NfYml0c190b192YWx1ZShzdHJ1Y3QgcW9zX2luZm8gKnFvcykKK3sKKwlpbnQgaW5kZXg7CisKKwlJUkRBX0FTU0VSVChxb3MgIT0gTlVMTCwgcmV0dXJuOyk7CisJCisJaW5kZXggPSBtc2JfaW5kZXgocW9zLT5iYXVkX3JhdGUuYml0cyk7CisJcW9zLT5iYXVkX3JhdGUudmFsdWUgPSBiYXVkX3JhdGVzW2luZGV4XTsKKworCWluZGV4ID0gbXNiX2luZGV4KHFvcy0+ZGF0YV9zaXplLmJpdHMpOworCXFvcy0+ZGF0YV9zaXplLnZhbHVlID0gZGF0YV9zaXplc1tpbmRleF07CisKKwlpbmRleCA9IG1zYl9pbmRleChxb3MtPndpbmRvd19zaXplLmJpdHMpOworCXFvcy0+d2luZG93X3NpemUudmFsdWUgPSBpbmRleCsxOworCisJaW5kZXggPSBtc2JfaW5kZXgocW9zLT5taW5fdHVybl90aW1lLmJpdHMpOworCXFvcy0+bWluX3R1cm5fdGltZS52YWx1ZSA9IG1pbl90dXJuX3RpbWVzW2luZGV4XTsKKwkKKwlpbmRleCA9IG1zYl9pbmRleChxb3MtPm1heF90dXJuX3RpbWUuYml0cyk7CisJcW9zLT5tYXhfdHVybl90aW1lLnZhbHVlID0gbWF4X3R1cm5fdGltZXNbaW5kZXhdOworCisJaW5kZXggPSBtc2JfaW5kZXgocW9zLT5saW5rX2Rpc2NfdGltZS5iaXRzKTsKKwlxb3MtPmxpbmtfZGlzY190aW1lLnZhbHVlID0gbGlua19kaXNjX3RpbWVzW2luZGV4XTsKKwkKKwlpbmRleCA9IG1zYl9pbmRleChxb3MtPmFkZGl0aW9uYWxfYm9mcy5iaXRzKTsKKwlxb3MtPmFkZGl0aW9uYWxfYm9mcy52YWx1ZSA9IGFkZF9ib2ZzW2luZGV4XTsKK30KK0VYUE9SVF9TWU1CT0woaXJkYV9xb3NfYml0c190b192YWx1ZSk7CmRpZmYgLS1naXQgYS9uZXQvaXJkYS90aW1lci5jIGIvbmV0L2lyZGEvdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTE3Zjk3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvdGltZXIuYwpAQCAtMCwwICsxLDIzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICB0aW1lci5jCisgKiBWZXJzaW9uOiAgICAgICAKKyAqIERlc2NyaXB0aW9uOiAgIAorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgU2F0IEF1ZyAxNiAwMDo1OToyOSAxOTk3CisgKiBNb2RpZmllZCBhdDogICBXZWQgRGVjICA4IDEyOjUwOjM0IDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5NywgMTk5OSBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+LCAKKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4KKyAqICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvdGltZXIuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CisKK2V4dGVybiBpbnQgIHN5c2N0bF9zbG90X3RpbWVvdXQ7CisKK3N0YXRpYyB2b2lkIGlybGFwX3Nsb3RfdGltZXJfZXhwaXJlZCh2b2lkKiBkYXRhKTsKK3N0YXRpYyB2b2lkIGlybGFwX3F1ZXJ5X3RpbWVyX2V4cGlyZWQodm9pZCogZGF0YSk7CitzdGF0aWMgdm9pZCBpcmxhcF9maW5hbF90aW1lcl9leHBpcmVkKHZvaWQqIGRhdGEpOworc3RhdGljIHZvaWQgaXJsYXBfd2RfdGltZXJfZXhwaXJlZCh2b2lkKiBkYXRhKTsKK3N0YXRpYyB2b2lkIGlybGFwX2JhY2tvZmZfdGltZXJfZXhwaXJlZCh2b2lkKiBkYXRhKTsKK3N0YXRpYyB2b2lkIGlybGFwX21lZGlhX2J1c3lfZXhwaXJlZCh2b2lkKiBkYXRhKTsgCisKK3ZvaWQgaXJsYXBfc3RhcnRfc2xvdF90aW1lcihzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIGludCB0aW1lb3V0KQoreworCWlyZGFfc3RhcnRfdGltZXIoJnNlbGYtPnNsb3RfdGltZXIsIHRpbWVvdXQsICh2b2lkICopIHNlbGYsIAorCQkJIGlybGFwX3Nsb3RfdGltZXJfZXhwaXJlZCk7Cit9CisKK3ZvaWQgaXJsYXBfc3RhcnRfcXVlcnlfdGltZXIoc3RydWN0IGlybGFwX2NiICpzZWxmLCBpbnQgUywgaW50IHMpCit7CisJaW50IHRpbWVvdXQ7CisKKwkvKiBDYWxjdWxhdGUgd2hlbiB0aGUgcGVlciBkaXNjb3Zlcnkgc2hvdWxkIGVuZC4gTm9ybWFsbHksIHdlCisJICogZ2V0IHRoZSBlbmQtb2YtZGlzY292ZXJ5IGZyYW1lLCBzbyB0aGlzIGlzIGp1c3QgaW4gY2FzZQorCSAqIHdlIG1pc3MgaXQuCisJICogQmFzaWNhbGx5LCB3ZSBtdWx0aXBseSB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBzbG90cyBieSBvdXIKKwkgKiBzbG90IHRpbWUsIHBsdXMgYWRkIHNvbWUgZXh0cmEgdGltZSB0byBwcm9wZXJseSByZWNlaXZlIHRoZSBsYXN0CisJICogZGlzY292ZXJ5IHBhY2tldCAod2hpY2ggaXMgbG9uZ2VyIGR1ZSB0byBleHRyYSBkaXNjb3ZlcnkgaW5mbyksCisJICogdG8gYXZvaWQgbWVzc2luZyB3aXRoIGZvciBpbmNvbW1pbmcgY29ubmVjdGlvbnMgcmVxdWVzdHMgYW5kCisJICogdG8gYWNjb21vZGF0ZSBkZXZpY2VzIHRoYXQgcGVyZm9ybSBkaXNjb3Zlcnkgc2xvd2VyIHRoYW4gdXMuCisJICogSmVhbiBJSSAqLworCXRpbWVvdXQgPSAoKHN5c2N0bF9zbG90X3RpbWVvdXQgKiBIWiAvIDEwMDApICogKFMgLSBzKQorCQkgICArIFhJREVYVFJBX1RJTUVPVVQgKyBTTUFMTEJVU1lfVElNRU9VVCk7CisKKwkvKiBTZXQgb3IgcmUtc2V0IHRoZSB0aW1lci4gV2UgcmVzZXQgdGhlIHRpbWVyIGZvciBlYWNoIHJlY2VpdmVkCisJICogZGlzY292ZXJ5IHF1ZXJ5LCB3aGljaCBhbGxvdyB1cyB0byBhdXRvbWF0aWNhbGx5IGFkanVzdCB0bworCSAqIHRoZSBzcGVlZCBvZiB0aGUgcGVlciBkaXNjb3ZlcnkgKGZhc3RlciBvciBzbG93ZXIpLiBKZWFuIElJICovCisJaXJkYV9zdGFydF90aW1lciggJnNlbGYtPnF1ZXJ5X3RpbWVyLCB0aW1lb3V0LCAodm9pZCAqKSBzZWxmLCAKKwkJCSAgaXJsYXBfcXVlcnlfdGltZXJfZXhwaXJlZCk7Cit9CisKK3ZvaWQgaXJsYXBfc3RhcnRfZmluYWxfdGltZXIoc3RydWN0IGlybGFwX2NiICpzZWxmLCBpbnQgdGltZW91dCkKK3sKKwlpcmRhX3N0YXJ0X3RpbWVyKCZzZWxmLT5maW5hbF90aW1lciwgdGltZW91dCwgKHZvaWQgKikgc2VsZiwgCisJCQkgaXJsYXBfZmluYWxfdGltZXJfZXhwaXJlZCk7Cit9CisKK3ZvaWQgaXJsYXBfc3RhcnRfd2RfdGltZXIoc3RydWN0IGlybGFwX2NiICpzZWxmLCBpbnQgdGltZW91dCkKK3sKKwlpcmRhX3N0YXJ0X3RpbWVyKCZzZWxmLT53ZF90aW1lciwgdGltZW91dCwgKHZvaWQgKikgc2VsZiwgCisJCQkgaXJsYXBfd2RfdGltZXJfZXhwaXJlZCk7Cit9CisKK3ZvaWQgaXJsYXBfc3RhcnRfYmFja29mZl90aW1lcihzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIGludCB0aW1lb3V0KQoreworCWlyZGFfc3RhcnRfdGltZXIoJnNlbGYtPmJhY2tvZmZfdGltZXIsIHRpbWVvdXQsICh2b2lkICopIHNlbGYsIAorCQkJIGlybGFwX2JhY2tvZmZfdGltZXJfZXhwaXJlZCk7Cit9CisKK3ZvaWQgaXJsYXBfc3RhcnRfbWJ1c3lfdGltZXIoc3RydWN0IGlybGFwX2NiICpzZWxmLCBpbnQgdGltZW91dCkKK3sKKwlpcmRhX3N0YXJ0X3RpbWVyKCZzZWxmLT5tZWRpYV9idXN5X3RpbWVyLCB0aW1lb3V0LCAKKwkJCSAodm9pZCAqKSBzZWxmLCBpcmxhcF9tZWRpYV9idXN5X2V4cGlyZWQpOworfQorCit2b2lkIGlybGFwX3N0b3BfbWJ1c3lfdGltZXIoc3RydWN0IGlybGFwX2NiICpzZWxmKQoreworCS8qIElmIHRpbWVyIGlzIGFjdGl2YXRlZCwga2lsbCBpdCEgKi8KKwlkZWxfdGltZXIoJnNlbGYtPm1lZGlhX2J1c3lfdGltZXIpOworCisJLyogSWYgd2UgYXJlIGluIE5ETSwgdGhlcmUgaXMgYSBidW5jaCBvZiBldmVudHMgaW4gTEFQIHRoYXQKKwkgKiB0aGF0IGJlIHBlbmRpbmcgZHVlIHRvIHRoZSBtZWRpYV9idXN5IGNvbmRpdGlvbiwgc3VjaCBhcworCSAqIENPTk5FQ1RfUkVRVUVTVCBhbmQgU0VORF9VSV9GUkFNRS4gSWYgd2UgZG9uJ3QgZ2VuZXJhdGUKKwkgKiBhbiBldmVudCwgdGhleSB3aWxsIHdhaXQgZm9yZXZlci4uLgorCSAqIEplYW4gSUkgKi8KKwlpZiAoc2VsZi0+c3RhdGUgPT0gTEFQX05ETSkKKwkJaXJsYXBfZG9fZXZlbnQoc2VsZiwgTUVESUFfQlVTWV9USU1FUl9FWFBJUkVELCBOVUxMLCBOVUxMKTsKK30KKwordm9pZCBpcmxtcF9zdGFydF93YXRjaGRvZ190aW1lcihzdHJ1Y3QgbHNhcF9jYiAqc2VsZiwgaW50IHRpbWVvdXQpIAoreworCWlyZGFfc3RhcnRfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyLCB0aW1lb3V0LCAodm9pZCAqKSBzZWxmLAorCQkJIGlybG1wX3dhdGNoZG9nX3RpbWVyX2V4cGlyZWQpOworfQorCit2b2lkIGlybG1wX3N0YXJ0X2Rpc2NvdmVyeV90aW1lcihzdHJ1Y3QgaXJsbXBfY2IgKnNlbGYsIGludCB0aW1lb3V0KSAKK3sKKwlpcmRhX3N0YXJ0X3RpbWVyKCZzZWxmLT5kaXNjb3ZlcnlfdGltZXIsIHRpbWVvdXQsICh2b2lkICopIHNlbGYsCisJCQkgaXJsbXBfZGlzY292ZXJ5X3RpbWVyX2V4cGlyZWQpOworfQorCit2b2lkIGlybG1wX3N0YXJ0X2lkbGVfdGltZXIoc3RydWN0IGxhcF9jYiAqc2VsZiwgaW50IHRpbWVvdXQpIAoreworCWlyZGFfc3RhcnRfdGltZXIoJnNlbGYtPmlkbGVfdGltZXIsIHRpbWVvdXQsICh2b2lkICopIHNlbGYsCisJCQkgaXJsbXBfaWRsZV90aW1lcl9leHBpcmVkKTsKK30KKwordm9pZCBpcmxtcF9zdG9wX2lkbGVfdGltZXIoc3RydWN0IGxhcF9jYiAqc2VsZikgCit7CisJLyogSWYgdGltZXIgaXMgYWN0aXZhdGVkLCBraWxsIGl0ISAqLworCWRlbF90aW1lcigmc2VsZi0+aWRsZV90aW1lcik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9zbG90X3RpbWVyX2V4cGlyZWQgKGRhdGEpCisgKgorICogICAgSXJMQVAgc2xvdCB0aW1lciBoYXMgZXhwaXJlZAorICoKKyAqLworc3RhdGljIHZvaWQgaXJsYXBfc2xvdF90aW1lcl9leHBpcmVkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlybGFwX2NiICpzZWxmID0gKHN0cnVjdCBpcmxhcF9jYiAqKSBkYXRhOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCisJaXJsYXBfZG9fZXZlbnQoc2VsZiwgU0xPVF9USU1FUl9FWFBJUkVELCBOVUxMLCBOVUxMKTsKK30gCisKKy8qCisgKiBGdW5jdGlvbiBpcmxhcF9xdWVyeV90aW1lcl9leHBpcmVkIChkYXRhKQorICoKKyAqICAgIElyTEFQIHF1ZXJ5IHRpbWVyIGhhcyBleHBpcmVkCisgKgorICovCitzdGF0aWMgdm9pZCBpcmxhcF9xdWVyeV90aW1lcl9leHBpcmVkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlybGFwX2NiICpzZWxmID0gKHN0cnVjdCBpcmxhcF9jYiAqKSBkYXRhOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOworCisJaXJsYXBfZG9fZXZlbnQoc2VsZiwgUVVFUllfVElNRVJfRVhQSVJFRCwgTlVMTCwgTlVMTCk7Cit9IAorCisvKgorICogRnVuY3Rpb24gaXJkYV9maW5hbF90aW1lcl9leHBpcmVkIChkYXRhKQorICoKKyAqICAgIAorICoKKyAqLworc3RhdGljIHZvaWQgaXJsYXBfZmluYWxfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBpcmxhcF9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJsYXBfY2IgKikgZGF0YTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKKworCWlybGFwX2RvX2V2ZW50KHNlbGYsIEZJTkFMX1RJTUVSX0VYUElSRUQsIE5VTEwsIE5VTEwpOworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV93ZF90aW1lcl9leHBpcmVkIChkYXRhKQorICoKKyAqICAgIAorICoKKyAqLworc3RhdGljIHZvaWQgaXJsYXBfd2RfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBpcmxhcF9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJsYXBfY2IgKikgZGF0YTsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CisJCisJaXJsYXBfZG9fZXZlbnQoc2VsZiwgV0RfVElNRVJfRVhQSVJFRCwgTlVMTCwgTlVMTCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2JhY2tvZmZfdGltZXJfZXhwaXJlZCAoZGF0YSkKKyAqCisgKiAgICAKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlybGFwX2JhY2tvZmZfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBpcmxhcF9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJsYXBfY2IgKikgZGF0YTsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CisJCisJaXJsYXBfZG9fZXZlbnQoc2VsZiwgQkFDS09GRl9USU1FUl9FWFBJUkVELCBOVUxMLCBOVUxMKTsKK30KKworCisvKgorICogRnVuY3Rpb24gaXJ0dHlfbWVkaWFfYnVzeV9leHBpcmVkIChkYXRhKQorICoKKyAqICAgIAorICovCit2b2lkIGlybGFwX21lZGlhX2J1c3lfZXhwaXJlZCh2b2lkKiBkYXRhKQoreworCXN0cnVjdCBpcmxhcF9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJsYXBfY2IgKikgZGF0YTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShzZWxmLT5uZXRkZXYsIEZBTFNFKTsKKwkvKiBOb3RlIDogdGhlIExBUCBldmVudCB3aWxsIGJlIHNlbmQgaW4gaXJsYXBfc3RvcF9tYnVzeV90aW1lcigpLAorCSogdG8gY2F0Y2ggb3RoZXIgY2FzZXMgd2hlcmUgdGhlIGZsYWcgaXMgY2xlYXJlZCAoZm9yIGV4YW1wbGUKKwkqIGFmdGVyIGEgZGlzY292ZXJ5KSAtIEplYW4gSUkgKi8KK30KZGlmZiAtLWdpdCBhL25ldC9pcmRhL3dyYXBwZXIuYyBiL25ldC9pcmRhL3dyYXBwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzEzMGMxCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvd3JhcHBlci5jCkBAIC0wLDAgKzEsNDkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRmlsZW5hbWU6ICAgICAgd3JhcHBlci5jCisgKiBWZXJzaW9uOiAgICAgICAxLjIKKyAqIERlc2NyaXB0aW9uOiAgIElyREEgU0lSIGFzeW5jIHdyYXBwZXIgbGF5ZXIKKyAqIFN0YXR1czogICAgICAgIFN0YWJsZQorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgTW9uIEF1ZyAgNCAyMDo0MDo1MyAxOTk3CisgKiBNb2RpZmllZCBhdDogICBGcmkgSmFuIDI4IDEzOjIxOjA5IDIwMDAKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIE1vZGlmaWVkIGF0OiAgIEZyaSBNYXkgMjggIDM6MTEgQ1NUIDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIEhvcnN0IHZvbiBCcmFuZCA8dm9uYnJhbmRAc2xlaXBuaXIudmFscGFyYWlzby5jbD4KKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwKKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS93cmFwcGVyLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvY3JjLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhcF9mcmFtZS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBGUkFNRSBXUkFQUElORyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBVbndyYXAgYW5kIHVuc3R1ZmYgU0lSIGZyYW1lcworICoKKyAqIE5vdGUgOiBhdCBGSVIgYW5kIE1JUiwgSERMQyBmcmFtaW5nIGlzIHVzZWQgYW5kIHVzdWFsbHkgaGFuZGxlZAorICogYnkgdGhlIGNvbnRyb2xsZXIsIHNvIHdlIGNvbWUgaGVyZSBvbmx5IGZvciBTSVIuLi4gSmVhbiBJSQorICovCisKKy8qCisgKiBGdW5jdGlvbiBzdHVmZl9ieXRlIChieXRlLCBidWYpCisgKgorICogICAgQnl0ZSBzdHVmZiBvbmUgc2luZ2xlIGJ5dGUgYW5kIHB1dCB0aGUgcmVzdWx0IGluIGJ1ZmZlciBwb2ludGVkIHRvIGJ5CisgKiAgICBidWYuIFRoZSBidWZmZXIgbXVzdCBhdCBhbGwgdGltZXMgYmUgYWJsZSB0byBoYXZlIHR3byBieXRlcyBpbnNlcnRlZC4KKyAqCisgKiBUaGlzIGlzIGluIGEgdGlnaHQgbG9vcCwgYmV0dGVyIGlubGluZSBpdCwgc28gbmVlZCB0byBiZSBwcmlvciB0byBjYWxsZXJzLgorICogKDIwMDAgYnl0ZXMgb24gUDYgMjAwTUh6LCBub24taW5saW5lZCB+MzcwdXMsIGlubGluZSB+MTcwdXMpIC0gSmVhbiBJSQorICovCitzdGF0aWMgaW5saW5lIGludCBzdHVmZl9ieXRlKF9fdTggYnl0ZSwgX191OCAqYnVmKQoreworCXN3aXRjaCAoYnl0ZSkgeworCWNhc2UgQk9GOiAvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgRU9GOiAvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgQ0U6CisJCS8qIEluc2VydCB0cmFuc3BhcmVudGx5IGNvZGVkICovCisJCWJ1ZlswXSA9IENFOyAgICAgICAgICAgICAgIC8qIFNlbmQgbGluayBlc2NhcGUgKi8KKwkJYnVmWzFdID0gYnl0ZV5JUkRBX1RSQU5TOyAgICAvKiBDb21wbGVtZW50IGJpdCA1ICovCisJCXJldHVybiAyOworCQkvKiBicmVhazsgKi8KKwlkZWZhdWx0OgorCQkgLyogTm9uLXNwZWNpYWwgdmFsdWUsIG5vIHRyYW5zcGFyZW5jeSByZXF1aXJlZCAqLworCQlidWZbMF0gPSBieXRlOworCQlyZXR1cm4gMTsKKwkJLyogYnJlYWs7ICovCisJfQorfQorCisvKgorICogRnVuY3Rpb24gYXN5bmNfd3JhcCAoc2tiLCAqdHhfYnVmZiwgYnVmZnNpemUpCisgKgorICogICAgTWFrZXMgYSBuZXcgYnVmZmVyIHdpdGggd3JhcHBpbmcgYW5kIHN0dWZmaW5nLCBzaG91bGQgY2hlY2sgdGhhdAorICogICAgd2UgZG9uJ3QgZ2V0IHR4IGJ1ZmZlciBvdmVyZmxvdy4KKyAqLworaW50IGFzeW5jX3dyYXBfc2tiKHN0cnVjdCBza19idWZmICpza2IsIF9fdTggKnR4X2J1ZmYsIGludCBidWZmc2l6ZSkKK3sKKwlzdHJ1Y3QgaXJkYV9za2JfY2IgKmNiID0gKHN0cnVjdCBpcmRhX3NrYl9jYiAqKSBza2ItPmNiOworCWludCB4Ym9mczsKKwlpbnQgaTsKKwlpbnQgbjsKKwl1bmlvbiB7CisJCV9fdTE2IHZhbHVlOworCQlfX3U4IGJ5dGVzWzJdOworCX0gZmNzOworCisJLyogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KKwlmY3MudmFsdWUgPSBJTklUX0ZDUzsKKwluID0gMDsKKworCS8qCisJICogIFNlbmQgIFhCT0YncyBmb3IgcmVxdWlyZWQgbWluLiB0dXJuIHRpbWUgYW5kIGZvciB0aGUgbmVnb3RpYXRlZAorCSAqICBhZGRpdGlvbmFsIFhCT0ZTCisJICovCisKKwlpZiAoY2ItPm1hZ2ljICE9IExBUF9NQUdJQykgeworCQkvKgorCQkgKiBUaGlzIHdpbGwgaGFwcGVuIGZvciBhbGwgZnJhbWVzIHNlbnQgZnJvbSB1c2VyLXNwYWNlLgorCQkgKiBOb3RoaW5nIHRvIHdvcnJ5IGFib3V0LCBidXQgd2Ugc2V0IHRoZSBkZWZhdWx0IG51bWJlciBvZgorCQkgKiBCT0YncworCQkgKi8KKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgd3JvbmcgbWFnaWMgaW4gc2tiIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJeGJvZnMgPSAxMDsKKwl9IGVsc2UKKwkJeGJvZnMgPSBjYi0+eGJvZnMgKyBjYi0+eGJvZnNfZGVsYXk7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpLCB4Ym9mcz0lZFxuIiwgX19GVU5DVElPTl9fLCB4Ym9mcyk7CisKKwkvKiBDaGVjayB0aGF0IHdlIG5ldmVyIHVzZSBtb3JlIHRoYW4gMTE1ICsgNDggeGJvZnMgKi8KKwlpZiAoeGJvZnMgPiAxNjMpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdG9vIG1hbnkgeGJvZnMgKCVkKVxuIiwgX19GVU5DVElPTl9fLAorCQkJICAgeGJvZnMpOworCQl4Ym9mcyA9IDE2MzsKKwl9CisKKwltZW1zZXQodHhfYnVmZiArIG4sIFhCT0YsIHhib2ZzKTsKKwluICs9IHhib2ZzOworCisJLyogU3RhcnQgb2YgcGFja2V0IGNoYXJhY3RlciBCT0YgKi8KKwl0eF9idWZmW24rK10gPSBCT0Y7CisKKwkvKiBJbnNlcnQgZnJhbWUgYW5kIGNhbGMgQ1JDICovCisJZm9yIChpPTA7IGkgPCBza2ItPmxlbjsgaSsrKSB7CisJCS8qCisJCSAqICBDaGVjayBmb3IgdGhlIHBvc3NpYmlsaXR5IG9mIHR4IGJ1ZmZlciBvdmVyZmxvdy4gV2UgdXNlCisJCSAqICBidWZzaXplLTUgc2luY2UgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlCisJCSAqICB0cmFuc21pdHRlZCBhZnRlciB0aGlzIHBvaW50IGlzIDUuCisJCSAqLworCQlpZihuID49IChidWZmc2l6ZS01KSkgeworCQkJSVJEQV9FUlJPUigiJXMoKSwgdHggYnVmZmVyIG92ZXJmbG93IChuPSVkKVxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18sIG4pOworCQkJcmV0dXJuIG47CisJCX0KKworCQluICs9IHN0dWZmX2J5dGUoc2tiLT5kYXRhW2ldLCB0eF9idWZmK24pOworCQlmY3MudmFsdWUgPSBpcmRhX2ZjcyhmY3MudmFsdWUsIHNrYi0+ZGF0YVtpXSk7CisJfQorCisJLyogSW5zZXJ0IENSQyBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCAoTFNCIGZpcnN0KSAqLworCWZjcy52YWx1ZSA9IH5mY3MudmFsdWU7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisJbiArPSBzdHVmZl9ieXRlKGZjcy5ieXRlc1swXSwgdHhfYnVmZituKTsKKwluICs9IHN0dWZmX2J5dGUoZmNzLmJ5dGVzWzFdLCB0eF9idWZmK24pOworI2Vsc2UgLyogaWZkZWYgX19CSUdfRU5ESUFOICovCisJbiArPSBzdHVmZl9ieXRlKGZjcy5ieXRlc1sxXSwgdHhfYnVmZituKTsKKwluICs9IHN0dWZmX2J5dGUoZmNzLmJ5dGVzWzBdLCB0eF9idWZmK24pOworI2VuZGlmCisJdHhfYnVmZltuKytdID0gRU9GOworCisJcmV0dXJuIG47Cit9CitFWFBPUlRfU1lNQk9MKGFzeW5jX3dyYXBfc2tiKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogRlJBTUUgVU5XUkFQUElORyAqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFVud3JhcCBhbmQgdW5zdHVmZiBTSVIgZnJhbWVzCisgKgorICogQ29tcGxldGUgcmV3cml0ZSBieSBKZWFuIElJIDoKKyAqIE1vcmUgaW5saW5lLCBmYXN0ZXIsIG1vcmUgY29tcGFjdCwgbW9yZSBsb2dpY2FsLiBKZWFuIElJCisgKiAoMTYgYnl0ZXMgb24gUDYgMjAwTUh6LCBvbGQgNSB0byA3IHVzLCBuZXcgNCB0byA2IHVzKQorICogKDI0IGJ5dGVzIG9uIFA2IDIwME1Ieiwgb2xkIDkgdG8gMTAgdXMsIG5ldyA3IHRvIDggdXMpCisgKiAoZm9yIHJlZmVyZW5jZSwgMTE1MjAwIGIvcyBpcyAxIGJ5dGUgZXZlcnkgNjkgdXMpCisgKiBBbmQgcmVkdWNlIHdyYXBwZXIubyBieSB+OTAwQiBpbiB0aGUgcHJvY2VzcyA7LSkKKyAqCisgKiBUaGVuLCB3ZSBoYXZlIHRoZSBhZGRpdGlvbiBvZiBaZXJvQ29weSwgd2hpY2ggaXMgb3B0aW9uYWwKKyAqIChpLmUuIHRoZSBkcml2ZXIgbXVzdCBpbml0aWF0ZSBpdCkgYW5kIGltcHJvdmUgZmluYWwgcHJvY2Vzc2luZy4KKyAqICgyMDA1IEIgZnJhbWUgKyBFT0Ygb24gUDYgMjAwTUh6LCB3aXRob3V0IDMwIHRvIDUwIHVzLCB3aXRoIDEwIHRvIDI1IHVzKQorICoKKyAqIE5vdGUgOiBhdCBGSVIgYW5kIE1JUiwgSERMQyBmcmFtaW5nIGlzIHVzZWQgYW5kIHVzdWFsbHkgaGFuZGxlZAorICogYnkgdGhlIGNvbnRyb2xsZXIsIHNvIHdlIGNvbWUgaGVyZSBvbmx5IGZvciBTSVIuLi4gSmVhbiBJSQorICovCisKKy8qCisgKiBXZSBjYW4gYWxzbyBjaG9vc2Ugd2hlcmUgd2Ugd2FudCB0byBkbyB0aGUgQ1JDIGNhbGN1bGF0aW9uLiBXZSBjYW4KKyAqIGRvIGl0ICJpbmxpbmUiLCBhcyB3ZSByZWNlaXZlIHRoZSBieXRlcywgb3IgInBvc3Rwb25lZCIsIHdoZW4KKyAqIHJlY2VpdmluZyB0aGUgRW5kLU9mLUZyYW1lLgorICogKDE2IGJ5dGVzIG9uIFA2IDIwME1IeiwgaW5saW5lZCA0IHRvIDYgdXMsIHBvc3Rwb25lZCA0IHRvIDUgdXMpCisgKiAoMjQgYnl0ZXMgb24gUDYgMjAwTUh6LCBpbmxpbmVkIDcgdG8gOCB1cywgcG9zdHBvbmVkIDUgdG8gNyB1cykKKyAqIFdpdGggWmVyb0NvcHkgOgorICogKDIwMDUgQiBmcmFtZSBvbiBQNiAyMDBNSHosIGlubGluZWQgMTAgdG8gMjUgdXMsIHBvc3Rwb25lZCAxNDAgdG8gMTgwIHVzKQorICogV2l0aG91dCBaZXJvQ29weSA6CisgKiAoMjAwNSBCIGZyYW1lIG9uIFA2IDIwME1IeiwgaW5saW5lZCAzMCB0byA1MCB1cywgcG9zdHBvbmVkIDE1MCB0byAxODAgdXMpCisgKiAoTm90ZSA6IG51bWJlcnMgdGFrZW4gd2l0aCBpcnEgZGlzYWJsZWQpCisgKgorICogRnJvbSB0aG9zZSBudW1iZXJzLCBpdCdzIG5vdCBjbGVhciB3aGljaCBpcyB0aGUgYmVzdCBzdHJhdGVneSwgYmVjYXVzZQorICogd2UgZW5kIHVwIHJ1bm5pbmcgdGhyb3VnaCBhIGxvdCBvZiBkYXRhIG9uZSB3YXkgb3IgYW5vdGhlciAoaS5lLiBjYWNoZQorICogbWlzc2VzKS4gSSBwZXJzb25hbGx5IHByZWZlciB0byBhdm9pZCB0aGUgaHVnZSBsYXRlbmN5IHNwaWtlIG9mIHRoZQorICogInBvc3Rwb25lZCIgc29sdXRpb24sIGJlY2F1c2UgaXQgY29tZSBqdXN0IGF0IHRoZSB0aW1lIHdoZW4gd2UgaGF2ZQorICogbG90J3Mgb2YgcHJvdG9jb2wgcHJvY2Vzc2luZyB0byBkbyBhbmQgaXQgd2lsbCBodXJ0IG91ciBhYmlsaXR5IHRvCisgKiByZWFjaCBsb3cgbGluayB0dXJuYXJvdW5kIHRpbWVzLi4uIEplYW4gSUkKKyAqLworLy8jZGVmaW5lIFBPU1RQT05FX1JYX0NSQworCisvKgorICogRnVuY3Rpb24gYXN5bmNfYnVtcCAoYnVmLCBsZW4sIHN0YXRzKQorICoKKyAqICAgIEdvdCBhIGZyYW1lLCBtYWtlIGEgY29weSBvZiBpdCwgYW5kIHBhc3MgaXQgdXAgdGhlIHN0YWNrISBXZSBjYW4gdHJ5CisgKiAgICB0byBpbmxpbmUgaXQgc2luY2UgaXQncyBvbmx5IGNhbGxlZCBmcm9tIHN0YXRlX2luc2lkZV9mcmFtZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2FzeW5jX2J1bXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMsCisJICAgaW9idWZmX3QgKnJ4X2J1ZmYpCit7CisJc3RydWN0IHNrX2J1ZmYgKm5ld3NrYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqZGF0YXNrYjsKKwlpbnQJCWRvY29weTsKKworCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gY29weSB0aGUgZGF0YSB0byBhIG5ldyBza2Igb3Igbm90LgorCSAqIElmIHRoZSBkcml2ZXIgZG9lc24ndCB1c2UgWmVyb0NvcHkgUngsIHdlIGhhdmUgdG8gZG8gaXQuCisJICogV2l0aCBaZXJvQ29weSBSeCwgdGhlIHJ4X2J1ZmYgYWxyZWFkeSBwb2ludCB0byBhIHZhbGlkCisJICogc2tiLiBCdXQsIGlmIHRoZSBmcmFtZSBpcyBzbWFsbCwgaXQgaXMgbW9yZSBlZmZpY2llbnQgdG8KKwkgKiBjb3B5IGl0IHRvIHNhdmUgbWVtb3J5IChjb3B5IHdpbGwgYmUgZmFzdCBhbnl3YXkgLSB0aGF0J3MKKwkgKiBjYWxsZWQgUngtY29weS1icmVhaykuIEplYW4gSUkgKi8KKwlkb2NvcHkgPSAoKHJ4X2J1ZmYtPnNrYiA9PSBOVUxMKSB8fAorCQkgIChyeF9idWZmLT5sZW4gPCBJUkRBX1JYX0NPUFlfVEhSRVNIT0xEKSk7CisKKwkvKiBBbGxvY2F0ZSBhIG5ldyBza2IgKi8KKwluZXdza2IgPSBkZXZfYWxsb2Nfc2tiKGRvY29weSA/IHJ4X2J1ZmYtPmxlbiArIDEgOiByeF9idWZmLT50cnVlc2l6ZSk7CisJaWYgKCFuZXdza2IpICB7CisJCXN0YXRzLT5yeF9kcm9wcGVkKys7CisJCS8qIFdlIGNvdWxkIGRlbGl2ZXIgdGhlIGN1cnJlbnQgc2tiIGlmIGRvaW5nIFplcm9Db3B5IFJ4LAorCQkgKiBidXQgdGhpcyB3b3VsZCBzdGFsbCB0aGUgUnggcGF0aC4gQmV0dGVyIGRyb3AgdGhlCisJCSAqIHBhY2tldC4uLiBKZWFuIElJICovCisJCXJldHVybjsKKwl9CisKKwkvKiBBbGlnbiBJUCBoZWFkZXIgdG8gMjAgYnl0ZXMgKGkuZS4gaW5jcmVhc2Ugc2tiLT5kYXRhKQorCSAqIE5vdGUgdGhpcyBpcyBvbmx5IHVzZWZ1bCB3aXRoIElyTEFOLCBhcyBQUFAgaGFzIGEgdmFyaWFibGUKKwkgKiBoZWFkZXIgc2l6ZSAoMiBvciAxIGJ5dGVzKSAtIEplYW4gSUkgKi8KKwlza2JfcmVzZXJ2ZShuZXdza2IsIDEpOworCisJaWYoZG9jb3B5KSB7CisJCS8qIENvcHkgZGF0YSB3aXRob3V0IENSQyAobGVuZ2h0IGFscmVhZHkgY2hlY2tlZCkgKi8KKwkJbWVtY3B5KG5ld3NrYi0+ZGF0YSwgcnhfYnVmZi0+ZGF0YSwgcnhfYnVmZi0+bGVuIC0gMik7CisJCS8qIERlbGl2ZXIgdGhpcyBza2IgKi8KKwkJZGF0YXNrYiA9IG5ld3NrYjsKKwl9IGVsc2UgeworCQkvKiBXZSBhcmUgdXNpbmcgWmVyb0NvcHkuIERlbGl2ZXIgb2xkIHNrYiAqLworCQlkYXRhc2tiID0gcnhfYnVmZi0+c2tiOworCQkvKiBBbmQgaG9vayB0aGUgbmV3IHNrYiB0byB0aGUgcnhfYnVmZiAqLworCQlyeF9idWZmLT5za2IgPSBuZXdza2I7CisJCXJ4X2J1ZmYtPmhlYWQgPSBuZXdza2ItPmRhdGE7CS8qIE5PVCBuZXdza2ItPmhlYWQgKi8KKwkJLy9wcmludGsoS0VSTl9ERUJVRyAiWmVyb0NvcHkgOiBsZW4gPSAlZCwgZGF0YXNrYiA9ICVwLCBuZXdza2IgPSAlcFxuIiwgcnhfYnVmZi0+bGVuLCBkYXRhc2tiLCBuZXdza2IpOworCX0KKworCS8qIFNldCBwcm9wZXIgbGVuZ3RoIG9uIHNrYiAod2l0aG91dCBDUkMpICovCisJc2tiX3B1dChkYXRhc2tiLCByeF9idWZmLT5sZW4gLSAyKTsKKworCS8qIEZlZWQgaXQgdG8gSXJMQVAgbGF5ZXIgKi8KKwlkYXRhc2tiLT5kZXYgPSBkZXY7CisJZGF0YXNrYi0+bWFjLnJhdyAgPSBkYXRhc2tiLT5kYXRhOworCWRhdGFza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CisKKwluZXRpZl9yeChkYXRhc2tiKTsKKworCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJc3RhdHMtPnJ4X2J5dGVzICs9IHJ4X2J1ZmYtPmxlbjsKKworCS8qIENsZWFuIHVwIHJ4X2J1ZmYgKHJlZHVuZGFudCB3aXRoIGFzeW5jX3Vud3JhcF9ib2YoKSA/Pz8pICovCisJcnhfYnVmZi0+ZGF0YSA9IHJ4X2J1ZmYtPmhlYWQ7CisJcnhfYnVmZi0+bGVuID0gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFzeW5jX3Vud3JhcF9ib2YoZGV2LCBieXRlKQorICoKKyAqICAgIEhhbmRsZSBCZWdpbm5pbmcgT2YgRnJhbWUgY2hhcmFjdGVyIHJlY2VpdmVkIHdpdGhpbiBhIGZyYW1lCisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2FzeW5jX3Vud3JhcF9ib2Yoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cywKKwkJIGlvYnVmZl90ICpyeF9idWZmLCBfX3U4IGJ5dGUpCit7CisJc3dpdGNoKHJ4X2J1ZmYtPnN0YXRlKSB7CisJY2FzZSBMSU5LX0VTQ0FQRToKKwljYXNlIElOU0lERV9GUkFNRToKKwkJLyogTm90IHN1cHBvc2VkIHRvIGhhcHBlbiwgdGhlIHByZXZpb3VzIGZyYW1lIGlzIG5vdAorCQkgKiBmaW5pc2hlZCAtIEplYW4gSUkgKi8KKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgRGlzY2FyZGluZyBpbmNvbXBsZXRlIGZyYW1lXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJc3RhdHMtPnJ4X2Vycm9ycysrOworCQlzdGF0cy0+cnhfbWlzc2VkX2Vycm9ycysrOworCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShkZXYsIFRSVUUpOworCQlicmVhazsKKworCWNhc2UgT1VUU0lERV9GUkFNRToKKwljYXNlIEJFR0lOX0ZSQU1FOgorCWRlZmF1bHQ6CisJCS8qIFdlIG1heSByZWNlaXZlIG11bHRpcGxlIEJPRiBhdCB0aGUgc3RhcnQgb2YgZnJhbWUgKi8gCisJCWJyZWFrOworCX0KKworCS8qIE5vdyByZWNlaXZpbmcgZnJhbWUgKi8KKwlyeF9idWZmLT5zdGF0ZSA9IEJFR0lOX0ZSQU1FOworCXJ4X2J1ZmYtPmluX2ZyYW1lID0gVFJVRTsKKworCS8qIFRpbWUgdG8gaW5pdGlhbGl6ZSByZWNlaXZlIGJ1ZmZlciAqLworCXJ4X2J1ZmYtPmRhdGEgPSByeF9idWZmLT5oZWFkOworCXJ4X2J1ZmYtPmxlbiA9IDA7CisJcnhfYnVmZi0+ZmNzID0gSU5JVF9GQ1M7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhc3luY191bndyYXBfZW9mKGRldiwgYnl0ZSkKKyAqCisgKiAgICBIYW5kbGUgRW5kIE9mIEZyYW1lIGNoYXJhY3RlciByZWNlaXZlZCB3aXRoaW4gYSBmcmFtZQorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkCithc3luY191bndyYXBfZW9mKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMsCisJCSBpb2J1ZmZfdCAqcnhfYnVmZiwgX191OCBieXRlKQoreworI2lmZGVmIFBPU1RQT05FX1JYX0NSQworCWludAlpOworI2VuZGlmCisKKwlzd2l0Y2gocnhfYnVmZi0+c3RhdGUpIHsKKwljYXNlIE9VVFNJREVfRlJBTUU6CisJCS8qIFByb2JhYmx5IG1pc3NlZCB0aGUgQk9GICovCisJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwkJc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnMrKzsKKwkJaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3koZGV2LCBUUlVFKTsKKwkJYnJlYWs7CisKKwljYXNlIEJFR0lOX0ZSQU1FOgorCWNhc2UgTElOS19FU0NBUEU6CisJY2FzZSBJTlNJREVfRlJBTUU6CisJZGVmYXVsdDoKKwkJLyogTm90ZSA6IGluIHRoZSBjYXNlIG9mIEJFR0lOX0ZSQU1FIGFuZCBMSU5LX0VTQ0FQRSwKKwkJICogdGhlIGZjcyB3aWxsIG1vc3QgbGlrZWx5IG5vdCBtYXRjaCBhbmQgZ2VuZXJhdGUgYW4KKwkJICogZXJyb3IsIGFzIGV4cGVjdGVkIC0gSmVhbiBJSSAqLworCQlyeF9idWZmLT5zdGF0ZSA9IE9VVFNJREVfRlJBTUU7CisJCXJ4X2J1ZmYtPmluX2ZyYW1lID0gRkFMU0U7CisKKyNpZmRlZiBQT1NUUE9ORV9SWF9DUkMKKwkJLyogSWYgd2UgaGF2ZW4ndCBkb25lIHRoZSBDUkMgYXMgd2UgcmVjZWl2ZSBieXRlcywgd2UKKwkJICogbXVzdCBkbyBpdCBub3cuLi4gSmVhbiBJSSAqLworCQlmb3IoaSA9IDA7IGkgPCByeF9idWZmLT5sZW47IGkrKykKKwkJCXJ4X2J1ZmYtPmZjcyA9IGlyZGFfZmNzKHJ4X2J1ZmYtPmZjcywKKwkJCQkJCXJ4X2J1ZmYtPmRhdGFbaV0pOworI2VuZGlmCisKKwkJLyogVGVzdCBGQ1MgYW5kIHNpZ25hbCBzdWNjZXNzIGlmIHRoZSBmcmFtZSBpcyBnb29kICovCisJCWlmIChyeF9idWZmLT5mY3MgPT0gR09PRF9GQ1MpIHsKKwkJCS8qIERlbGl2ZXIgZnJhbWUgKi8KKwkJCWFzeW5jX2J1bXAoZGV2LCBzdGF0cywgcnhfYnVmZik7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCS8qIFdyb25nIENSQywgZGlzY2FyZCBmcmFtZSEgICovCisJCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShkZXYsIFRSVUUpOworCisJCQlJUkRBX0RFQlVHKDEsICIlcygpLCBjcmMgZXJyb3JcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCQlzdGF0cy0+cnhfY3JjX2Vycm9ycysrOworCQl9CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGFzeW5jX3Vud3JhcF9jZShkZXYsIGJ5dGUpCisgKgorICogICAgSGFuZGxlIENoYXJhY3RlciBFc2NhcGUgY2hhcmFjdGVyIHJlY2VpdmVkIHdpdGhpbiBhIGZyYW1lCisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2FzeW5jX3Vud3JhcF9jZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzLAorCQkgaW9idWZmX3QgKnJ4X2J1ZmYsIF9fdTggYnl0ZSkKK3sKKwlzd2l0Y2gocnhfYnVmZi0+c3RhdGUpIHsKKwljYXNlIE9VVFNJREVfRlJBTUU6CisJCS8qIEFjdGl2YXRlIGNhcnJpZXIgc2Vuc2UgKi8KKwkJaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3koZGV2LCBUUlVFKTsKKwkJYnJlYWs7CisKKwljYXNlIExJTktfRVNDQVBFOgorCQlJUkRBX1dBUk5JTkcoIiVzOiBzdGF0ZSBub3QgZGVmaW5lZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJYnJlYWs7CisKKwljYXNlIEJFR0lOX0ZSQU1FOgorCWNhc2UgSU5TSURFX0ZSQU1FOgorCWRlZmF1bHQ6CisJCS8qIFN0dWZmZWQgYnl0ZSBjb21pbmcgKi8KKwkJcnhfYnVmZi0+c3RhdGUgPSBMSU5LX0VTQ0FQRTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gYXN5bmNfdW53cmFwX290aGVyKGRldiwgYnl0ZSkKKyAqCisgKiAgICBIYW5kbGUgb3RoZXIgY2hhcmFjdGVycyByZWNlaXZlZCB3aXRoaW4gYSBmcmFtZQorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkCithc3luY191bndyYXBfb3RoZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzLAorCQkgICBpb2J1ZmZfdCAqcnhfYnVmZiwgX191OCBieXRlKQoreworCXN3aXRjaChyeF9idWZmLT5zdGF0ZSkgeworCQkvKiBUaGlzIGlzIG9uIHRoZSBjcml0aWNhbCBwYXRoLCBjYXNlIGFyZSBvcmRlcmVkIGJ5CisJCSAqIHByb2JhYmlsaXR5IChtb3N0IGZyZXF1ZW50IGZpcnN0KSAtIEplYW4gSUkgKi8KKwljYXNlIElOU0lERV9GUkFNRToKKwkJLyogTXVzdCBiZSB0aGUgbmV4dCBieXRlIG9mIHRoZSBmcmFtZSAqLworCQlpZiAocnhfYnVmZi0+bGVuIDwgcnhfYnVmZi0+dHJ1ZXNpemUpICB7CisJCQlyeF9idWZmLT5kYXRhW3J4X2J1ZmYtPmxlbisrXSA9IGJ5dGU7CisjaWZuZGVmIFBPU1RQT05FX1JYX0NSQworCQkJcnhfYnVmZi0+ZmNzID0gaXJkYV9mY3MocnhfYnVmZi0+ZmNzLCBieXRlKTsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgUnggYnVmZmVyIG92ZXJmbG93LCBhYm9ydGluZ1xuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18pOworCQkJcnhfYnVmZi0+c3RhdGUgPSBPVVRTSURFX0ZSQU1FOworCQl9CisJCWJyZWFrOworCisJY2FzZSBMSU5LX0VTQ0FQRToKKwkJLyoKKwkJICogIFN0dWZmZWQgY2hhciwgY29tcGxlbWVudCBiaXQgNSBvZiBieXRlCisJCSAqICBmb2xsb3dpbmcgQ0UsIElyTEFQIHAuMTE0CisJCSAqLworCQlieXRlIF49IElSREFfVFJBTlM7CisJCWlmIChyeF9idWZmLT5sZW4gPCByeF9idWZmLT50cnVlc2l6ZSkgIHsKKwkJCXJ4X2J1ZmYtPmRhdGFbcnhfYnVmZi0+bGVuKytdID0gYnl0ZTsKKyNpZm5kZWYgUE9TVFBPTkVfUlhfQ1JDCisJCQlyeF9idWZmLT5mY3MgPSBpcmRhX2ZjcyhyeF9idWZmLT5mY3MsIGJ5dGUpOworI2VuZGlmCisJCQlyeF9idWZmLT5zdGF0ZSA9IElOU0lERV9GUkFNRTsKKwkJfSBlbHNlIHsKKwkJCUlSREFfREVCVUcoMSwgIiVzKCksIFJ4IGJ1ZmZlciBvdmVyZmxvdywgYWJvcnRpbmdcbiIsCisJCQkJICAgX19GVU5DVElPTl9fKTsKKwkJCXJ4X2J1ZmYtPnN0YXRlID0gT1VUU0lERV9GUkFNRTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgT1VUU0lERV9GUkFNRToKKwkJLyogQWN0aXZhdGUgY2FycmllciBzZW5zZSAqLworCQlpZihieXRlICE9IFhCT0YpCisJCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShkZXYsIFRSVUUpOworCQlicmVhazsKKworCWNhc2UgQkVHSU5fRlJBTUU6CisJZGVmYXVsdDoKKwkJcnhfYnVmZi0+ZGF0YVtyeF9idWZmLT5sZW4rK10gPSBieXRlOworI2lmbmRlZiBQT1NUUE9ORV9SWF9DUkMKKwkJcnhfYnVmZi0+ZmNzID0gaXJkYV9mY3MocnhfYnVmZi0+ZmNzLCBieXRlKTsKKyNlbmRpZgorCQlyeF9idWZmLT5zdGF0ZSA9IElOU0lERV9GUkFNRTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gYXN5bmNfdW53cmFwX2NoYXIgKGRldiwgcnhfYnVmZiwgYnl0ZSkKKyAqCisgKiAgICBQYXJzZSBhbmQgZGUtc3R1ZmYgZnJhbWUgcmVjZWl2ZWQgZnJvbSB0aGUgSXJEQS1wb3J0CisgKgorICogVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgU0lSIGRyaXZlcnMuCisgKi8KK3ZvaWQgYXN5bmNfdW53cmFwX2NoYXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cywKKwkJICAgICAgIGlvYnVmZl90ICpyeF9idWZmLCBfX3U4IGJ5dGUpCit7CisJc3dpdGNoKGJ5dGUpIHsKKwljYXNlIENFOgorCQlhc3luY191bndyYXBfY2UoZGV2LCBzdGF0cywgcnhfYnVmZiwgYnl0ZSk7CisJCWJyZWFrOworCWNhc2UgQk9GOgorCQlhc3luY191bndyYXBfYm9mKGRldiwgc3RhdHMsIHJ4X2J1ZmYsIGJ5dGUpOworCQlicmVhazsKKwljYXNlIEVPRjoKKwkJYXN5bmNfdW53cmFwX2VvZihkZXYsIHN0YXRzLCByeF9idWZmLCBieXRlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYXN5bmNfdW53cmFwX290aGVyKGRldiwgc3RhdHMsIHJ4X2J1ZmYsIGJ5dGUpOworCQlicmVhazsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGFzeW5jX3Vud3JhcF9jaGFyKTsKKwpkaWZmIC0tZ2l0IGEvbmV0L2tleS9NYWtlZmlsZSBiL25ldC9rZXkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU3NjA4MAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9rZXkvTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUga2V5IEFGLgorIworCitvYmotJChDT05GSUdfTkVUX0tFWSkgKz0gYWZfa2V5Lm8KZGlmZiAtLWdpdCBhL25ldC9rZXkvYWZfa2V5LmMgYi9uZXQva2V5L2FmX2tleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOTgwYWEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQva2V5L2FmX2tleS5jCkBAIC0wLDAgKzEsMjkwMyBAQAorLyoKKyAqIG5ldC9rZXkvYWZfa2V5LmMJQW4gaW1wbGVtZW50YXRpb24gb2YgUEZfS0VZdjIgc29ja2V0cy4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglNYXhpbSBHaXJ5YWV2CTxnZW1AYXNwbGludXgucnU+CisgKgkJRGF2aWQgUy4gTWlsbGVyCTxkYXZlbUByZWRoYXQuY29tPgorICoJCUFsZXhleSBLdXpuZXRzb3YgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoJCUt1bmloaXJvIElzaGlndXJvIDxrdW5paGlyb0BpcGluZnVzaW9uLmNvbT4KKyAqCQlLYXp1bm9yaSBNSVlBWkFXQSAvIFVTQUdJIFByb2plY3QgPG1peWF6YXdhQGxpbnV4LWlwdjYub3JnPgorICoJCURlcmVrIEF0a2lucyA8ZGVyZWtAaWh0ZnAuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wZmtleXYyLmg+CisjaW5jbHVkZSA8bGludXgvaXBzZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bmV0L3hmcm0uaD4KKworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNkZWZpbmUgX1gyS0VZKHgpICgoeCkgPT0gWEZSTV9JTkYgPyAwIDogKHgpKQorI2RlZmluZSBfS0VZMlgoeCkgKCh4KSA9PSAwID8gWEZSTV9JTkYgOiAoeCkpCisKKworLyogTGlzdCBvZiBhbGwgcGZrZXkgc29ja2V0cy4gKi8KK3N0YXRpYyBITElTVF9IRUFEKHBma2V5X3RhYmxlKTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChwZmtleV90YWJsZV93YWl0KTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKHBma2V5X3RhYmxlX2xvY2spOworc3RhdGljIGF0b21pY190IHBma2V5X3RhYmxlX3VzZXJzID0gQVRPTUlDX0lOSVQoMCk7CisKK3N0YXRpYyBhdG9taWNfdCBwZmtleV9zb2Nrc19uciA9IEFUT01JQ19JTklUKDApOworCitzdHJ1Y3QgcGZrZXlfc29jayB7CisJLyogc3RydWN0IHNvY2sgbXVzdCBiZSB0aGUgZmlyc3QgbWVtYmVyIG9mIHN0cnVjdCBwZmtleV9zb2NrICovCisJc3RydWN0IHNvY2sJc2s7CisJaW50CQlyZWdpc3RlcmVkOworCWludAkJcHJvbWlzYzsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBma2V5X3NvY2sgKnBma2V5X3NrKHN0cnVjdCBzb2NrICpzaykKK3sKKwlyZXR1cm4gKHN0cnVjdCBwZmtleV9zb2NrICopc2s7Cit9CisKK3N0YXRpYyB2b2lkIHBma2V5X3NvY2tfZGVzdHJ1Y3Qoc3RydWN0IHNvY2sgKnNrKQoreworCXNrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCisJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpIHsKKwkJcHJpbnRrKCJBdHRlbXB0IHRvIHJlbGVhc2UgYWxpdmUgcGZrZXkgc29ja2V0OiAlcFxuIiwgc2spOworCQlyZXR1cm47CisJfQorCisJQlVHX1RSQVAoIWF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykpOworCUJVR19UUkFQKCFhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpKTsKKworCWF0b21pY19kZWMoJnBma2V5X3NvY2tzX25yKTsKK30KKworc3RhdGljIHZvaWQgcGZrZXlfdGFibGVfZ3JhYih2b2lkKQoreworCXdyaXRlX2xvY2tfYmgoJnBma2V5X3RhYmxlX2xvY2spOworCisJaWYgKGF0b21pY19yZWFkKCZwZmtleV90YWJsZV91c2VycykpIHsKKwkJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwkJYWRkX3dhaXRfcXVldWVfZXhjbHVzaXZlKCZwZmtleV90YWJsZV93YWl0LCAmd2FpdCk7CisJCWZvcig7OykgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJaWYgKGF0b21pY19yZWFkKCZwZmtleV90YWJsZV91c2VycykgPT0gMCkKKwkJCQlicmVhazsKKwkJCXdyaXRlX3VubG9ja19iaCgmcGZrZXlfdGFibGVfbG9jayk7CisJCQlzY2hlZHVsZSgpOworCQkJd3JpdGVfbG9ja19iaCgmcGZrZXlfdGFibGVfbG9jayk7CisJCX0KKworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZwZmtleV90YWJsZV93YWl0LCAmd2FpdCk7CisJfQorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHBma2V5X3RhYmxlX3VuZ3JhYih2b2lkKQoreworCXdyaXRlX3VubG9ja19iaCgmcGZrZXlfdGFibGVfbG9jayk7CisJd2FrZV91cCgmcGZrZXlfdGFibGVfd2FpdCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcGZrZXlfbG9ja190YWJsZSh2b2lkKQoreworCS8qIHJlYWRfbG9jaygpIHN5bmNocm9uaXplcyB1cyB0byBwZmtleV90YWJsZV9ncmFiICovCisKKwlyZWFkX2xvY2soJnBma2V5X3RhYmxlX2xvY2spOworCWF0b21pY19pbmMoJnBma2V5X3RhYmxlX3VzZXJzKTsKKwlyZWFkX3VubG9jaygmcGZrZXlfdGFibGVfbG9jayk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcGZrZXlfdW5sb2NrX3RhYmxlKHZvaWQpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnBma2V5X3RhYmxlX3VzZXJzKSkKKwkJd2FrZV91cCgmcGZrZXlfdGFibGVfd2FpdCk7Cit9CisKKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgcGZrZXlfb3BzOworCitzdGF0aWMgdm9pZCBwZmtleV9pbnNlcnQoc3RydWN0IHNvY2sgKnNrKQoreworCXBma2V5X3RhYmxlX2dyYWIoKTsKKwlza19hZGRfbm9kZShzaywgJnBma2V5X3RhYmxlKTsKKwlwZmtleV90YWJsZV91bmdyYWIoKTsKK30KKworc3RhdGljIHZvaWQgcGZrZXlfcmVtb3ZlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlwZmtleV90YWJsZV9ncmFiKCk7CisJc2tfZGVsX25vZGVfaW5pdChzayk7CisJcGZrZXlfdGFibGVfdW5ncmFiKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG8ga2V5X3Byb3RvID0geworCS5uYW1lCSAgPSAiS0VZIiwKKwkub3duZXIJICA9IFRISVNfTU9EVUxFLAorCS5vYmpfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcGZrZXlfc29jayksCit9OworCitzdGF0aWMgaW50IHBma2V5X2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgcHJvdG9jb2wpCit7CisJc3RydWN0IHNvY2sgKnNrOworCWludCBlcnI7CisKKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJaWYgKHNvY2stPnR5cGUgIT0gU09DS19SQVcpCisJCXJldHVybiAtRVNPQ0tUTk9TVVBQT1JUOworCWlmIChwcm90b2NvbCAhPSBQRl9LRVlfVjIpCisJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOworCisJZXJyID0gLUVOT01FTTsKKwlzayA9IHNrX2FsbG9jKFBGX0tFWSwgR0ZQX0tFUk5FTCwgJmtleV9wcm90bywgMSk7CisJaWYgKHNrID09IE5VTEwpCisJCWdvdG8gb3V0OworCQorCXNvY2stPm9wcyA9ICZwZmtleV9vcHM7CisJc29ja19pbml0X2RhdGEoc29jaywgc2spOworCisJc2stPnNrX2ZhbWlseSA9IFBGX0tFWTsKKwlzay0+c2tfZGVzdHJ1Y3QgPSBwZmtleV9zb2NrX2Rlc3RydWN0OworCisJYXRvbWljX2luYygmcGZrZXlfc29ja3NfbnIpOworCisJcGZrZXlfaW5zZXJ0KHNrKTsKKworCXJldHVybiAwOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcGZrZXlfcmVsZWFzZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCisJaWYgKCFzaykKKwkJcmV0dXJuIDA7CisKKwlwZmtleV9yZW1vdmUoc2spOworCisJc29ja19vcnBoYW4oc2spOworCXNvY2stPnNrID0gTlVMTDsKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za193cml0ZV9xdWV1ZSk7CisJc29ja19wdXQoc2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGZrZXlfYnJvYWRjYXN0X29uZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc2tfYnVmZiAqKnNrYjIsCisJCQkgICAgICAgaW50IGFsbG9jYXRpb24sIHN0cnVjdCBzb2NrICpzaykKK3sKKwlpbnQgZXJyID0gLUVOT0JVRlM7CisKKwlzb2NrX2hvbGQoc2spOworCWlmICgqc2tiMiA9PSBOVUxMKSB7CisJCWlmIChhdG9taWNfcmVhZCgmc2tiLT51c2VycykgIT0gMSkgeworCQkJKnNrYjIgPSBza2JfY2xvbmUoc2tiLCBhbGxvY2F0aW9uKTsKKwkJfSBlbHNlIHsKKwkJCSpza2IyID0gc2tiOworCQkJYXRvbWljX2luYygmc2tiLT51c2Vycyk7CisJCX0KKwl9CisJaWYgKCpza2IyICE9IE5VTEwpIHsKKwkJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPD0gc2stPnNrX3JjdmJ1ZikgeworCQkJc2tiX29ycGhhbigqc2tiMik7CisJCQlza2Jfc2V0X293bmVyX3IoKnNrYjIsIHNrKTsKKwkJCXNrYl9xdWV1ZV90YWlsKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgKnNrYjIpOworCQkJc2stPnNrX2RhdGFfcmVhZHkoc2ssICgqc2tiMiktPmxlbik7CisJCQkqc2tiMiA9IE5VTEw7CisJCQllcnIgPSAwOworCQl9CisJfQorCXNvY2tfcHV0KHNrKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiBTZW5kIFNLQiB0byBhbGwgcGZrZXkgc29ja2V0cyBtYXRjaGluZyBzZWxlY3RlZCBjcml0ZXJpYS4gICovCisjZGVmaW5lIEJST0FEQ0FTVF9BTEwJCTAKKyNkZWZpbmUgQlJPQURDQVNUX09ORQkJMQorI2RlZmluZSBCUk9BRENBU1RfUkVHSVNURVJFRAkyCisjZGVmaW5lIEJST0FEQ0FTVF9QUk9NSVNDX09OTFkJNAorc3RhdGljIGludCBwZmtleV9icm9hZGNhc3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGFsbG9jYXRpb24sCisJCQkgICBpbnQgYnJvYWRjYXN0X2ZsYWdzLCBzdHJ1Y3Qgc29jayAqb25lX3NrKQoreworCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IE5VTEw7CisJaW50IGVyciA9IC1FU1JDSDsKKworCS8qIFhYWCBEbyB3ZSBuZWVkIHNvbWV0aGluZyBsaWtlIG5ldGxpbmtfb3ZlcnJ1bj8gIEkgdGhpbmsKKwkgKiBYWFggUEZfS0VZIHNvY2tldCBhcHBzIHdpbGwgbm90IG1pbmQgY3VycmVudCBiZWhhdmlvci4KKwkgKi8KKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwZmtleV9sb2NrX3RhYmxlKCk7CisJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZwZmtleV90YWJsZSkgeworCQlzdHJ1Y3QgcGZrZXlfc29jayAqcGZrID0gcGZrZXlfc2soc2spOworCQlpbnQgZXJyMjsKKworCQkvKiBZZXMsIGl0IG1lYW5zIHRoYXQgaWYgeW91IGFyZSBtZWFudCB0byByZWNlaXZlIHRoaXMKKwkJICogcGZrZXkgbWVzc2FnZSB5b3UgcmVjZWl2ZSBpdCB0d2ljZSBhcyBwcm9taXNjdW91cworCQkgKiBzb2NrZXQuCisJCSAqLworCQlpZiAocGZrLT5wcm9taXNjKQorCQkJcGZrZXlfYnJvYWRjYXN0X29uZShza2IsICZza2IyLCBhbGxvY2F0aW9uLCBzayk7CisKKwkJLyogdGhlIGV4YWN0IHRhcmdldCB3aWxsIGJlIHByb2Nlc3NlZCBsYXRlciAqLworCQlpZiAoc2sgPT0gb25lX3NrKQorCQkJY29udGludWU7CisJCWlmIChicm9hZGNhc3RfZmxhZ3MgIT0gQlJPQURDQVNUX0FMTCkgeworCQkJaWYgKGJyb2FkY2FzdF9mbGFncyAmIEJST0FEQ0FTVF9QUk9NSVNDX09OTFkpCisJCQkJY29udGludWU7CisJCQlpZiAoKGJyb2FkY2FzdF9mbGFncyAmIEJST0FEQ0FTVF9SRUdJU1RFUkVEKSAmJgorCQkJICAgICFwZmstPnJlZ2lzdGVyZWQpCisJCQkJY29udGludWU7CisJCQlpZiAoYnJvYWRjYXN0X2ZsYWdzICYgQlJPQURDQVNUX09ORSkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWVycjIgPSBwZmtleV9icm9hZGNhc3Rfb25lKHNrYiwgJnNrYjIsIGFsbG9jYXRpb24sIHNrKTsKKworCQkvKiBFcnJvciBpcyBjbGVhcmUgYWZ0ZXIgc3VjY2VjZnVsIHNlbmRpbmcgdG8gYXQgbGVhc3Qgb25lCisJCSAqIHJlZ2lzdGVyZWQgS00gKi8KKwkJaWYgKChicm9hZGNhc3RfZmxhZ3MgJiBCUk9BRENBU1RfUkVHSVNURVJFRCkgJiYgZXJyKQorCQkJZXJyID0gZXJyMjsKKwl9CisJcGZrZXlfdW5sb2NrX3RhYmxlKCk7CisKKwlpZiAob25lX3NrICE9IE5VTEwpCisJCWVyciA9IHBma2V5X2Jyb2FkY2FzdF9vbmUoc2tiLCAmc2tiMiwgYWxsb2NhdGlvbiwgb25lX3NrKTsKKworCWlmIChza2IyKQorCQlrZnJlZV9za2Ioc2tiMik7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBma2V5X2hkcl9kdXAoc3RydWN0IHNhZGJfbXNnICpuZXcsIHN0cnVjdCBzYWRiX21zZyAqb3JpZykKK3sKKwkqbmV3ID0gKm9yaWc7Cit9CisKK3N0YXRpYyBpbnQgcGZrZXlfZXJyb3Ioc3RydWN0IHNhZGJfbXNnICpvcmlnLCBpbnQgZXJyLCBzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFsbG9jX3NrYihzaXplb2Yoc3RydWN0IHNhZGJfbXNnKSArIDE2LCBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3Qgc2FkYl9tc2cgKmhkcjsKKworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwkvKiBXb2UgYmUgdG8gdGhlIHBsYXRmb3JtIHRyeWluZyB0byBzdXBwb3J0IFBGS0VZIHlldAorCSAqIGhhdmluZyBub3JtYWwgZXJybm9zIG91dHNpZGUgdGhlIDEtMjU1IHJhbmdlLCBpbmNsdXNpdmUuCisJICovCisJZXJyID0gLWVycjsKKwlpZiAoZXJyID09IEVSRVNUQVJUU1lTIHx8CisJICAgIGVyciA9PSBFUkVTVEFSVE5PSEFORCB8fAorCSAgICBlcnIgPT0gRVJFU1RBUlROT0lOVFIpCisJCWVyciA9IEVJTlRSOworCWlmIChlcnIgPj0gNTEyKQorCQllcnIgPSBFSU5WQUw7CisJaWYgKGVyciA8PSAwIHx8IGVyciA+PSAyNTYpCisJCUJVRygpOworCisJaGRyID0gKHN0cnVjdCBzYWRiX21zZyAqKSBza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBzYWRiX21zZykpOworCXBma2V5X2hkcl9kdXAoaGRyLCBvcmlnKTsKKwloZHItPnNhZGJfbXNnX2Vycm5vID0gKHVpbnQ4X3QpIGVycjsKKwloZHItPnNhZGJfbXNnX2xlbiA9IChzaXplb2Yoc3RydWN0IHNhZGJfbXNnKSAvCisJCQkgICAgIHNpemVvZih1aW50NjRfdCkpOworCisJcGZrZXlfYnJvYWRjYXN0KHNrYiwgR0ZQX0tFUk5FTCwgQlJPQURDQVNUX09ORSwgc2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1OCBzYWRiX2V4dF9taW5fbGVuW10gPSB7CisJW1NBREJfRVhUX1JFU0VSVkVEXQkJPSAodTgpIDAsCisJW1NBREJfRVhUX1NBXQkJCT0gKHU4KSBzaXplb2Yoc3RydWN0IHNhZGJfc2EpLAorCVtTQURCX0VYVF9MSUZFVElNRV9DVVJSRU5UXQk9ICh1OCkgc2l6ZW9mKHN0cnVjdCBzYWRiX2xpZmV0aW1lKSwKKwlbU0FEQl9FWFRfTElGRVRJTUVfSEFSRF0JPSAodTgpIHNpemVvZihzdHJ1Y3Qgc2FkYl9saWZldGltZSksCisJW1NBREJfRVhUX0xJRkVUSU1FX1NPRlRdCT0gKHU4KSBzaXplb2Yoc3RydWN0IHNhZGJfbGlmZXRpbWUpLAorCVtTQURCX0VYVF9BRERSRVNTX1NSQ10JCT0gKHU4KSBzaXplb2Yoc3RydWN0IHNhZGJfYWRkcmVzcyksCisJW1NBREJfRVhUX0FERFJFU1NfRFNUXQkJPSAodTgpIHNpemVvZihzdHJ1Y3Qgc2FkYl9hZGRyZXNzKSwKKwlbU0FEQl9FWFRfQUREUkVTU19QUk9YWV0JPSAodTgpIHNpemVvZihzdHJ1Y3Qgc2FkYl9hZGRyZXNzKSwKKwlbU0FEQl9FWFRfS0VZX0FVVEhdCQk9ICh1OCkgc2l6ZW9mKHN0cnVjdCBzYWRiX2tleSksCisJW1NBREJfRVhUX0tFWV9FTkNSWVBUXQkJPSAodTgpIHNpemVvZihzdHJ1Y3Qgc2FkYl9rZXkpLAorCVtTQURCX0VYVF9JREVOVElUWV9TUkNdCQk9ICh1OCkgc2l6ZW9mKHN0cnVjdCBzYWRiX2lkZW50KSwKKwlbU0FEQl9FWFRfSURFTlRJVFlfRFNUXQkJPSAodTgpIHNpemVvZihzdHJ1Y3Qgc2FkYl9pZGVudCksCisJW1NBREJfRVhUX1NFTlNJVElWSVRZXQkJPSAodTgpIHNpemVvZihzdHJ1Y3Qgc2FkYl9zZW5zKSwKKwlbU0FEQl9FWFRfUFJPUE9TQUxdCQk9ICh1OCkgc2l6ZW9mKHN0cnVjdCBzYWRiX3Byb3ApLAorCVtTQURCX0VYVF9TVVBQT1JURURfQVVUSF0JPSAodTgpIHNpemVvZihzdHJ1Y3Qgc2FkYl9zdXBwb3J0ZWQpLAorCVtTQURCX0VYVF9TVVBQT1JURURfRU5DUllQVF0JPSAodTgpIHNpemVvZihzdHJ1Y3Qgc2FkYl9zdXBwb3J0ZWQpLAorCVtTQURCX0VYVF9TUElSQU5HRV0JCT0gKHU4KSBzaXplb2Yoc3RydWN0IHNhZGJfc3BpcmFuZ2UpLAorCVtTQURCX1hfRVhUX0tNUFJJVkFURV0JCT0gKHU4KSBzaXplb2Yoc3RydWN0IHNhZGJfeF9rbXByaXZhdGUpLAorCVtTQURCX1hfRVhUX1BPTElDWV0JCT0gKHU4KSBzaXplb2Yoc3RydWN0IHNhZGJfeF9wb2xpY3kpLAorCVtTQURCX1hfRVhUX1NBMl0JCT0gKHU4KSBzaXplb2Yoc3RydWN0IHNhZGJfeF9zYTIpLAorCVtTQURCX1hfRVhUX05BVF9UX1RZUEVdCQk9ICh1OCkgc2l6ZW9mKHN0cnVjdCBzYWRiX3hfbmF0X3RfdHlwZSksCisJW1NBREJfWF9FWFRfTkFUX1RfU1BPUlRdCT0gKHU4KSBzaXplb2Yoc3RydWN0IHNhZGJfeF9uYXRfdF9wb3J0KSwKKwlbU0FEQl9YX0VYVF9OQVRfVF9EUE9SVF0JPSAodTgpIHNpemVvZihzdHJ1Y3Qgc2FkYl94X25hdF90X3BvcnQpLAorCVtTQURCX1hfRVhUX05BVF9UX09BXQkJPSAodTgpIHNpemVvZihzdHJ1Y3Qgc2FkYl9hZGRyZXNzKSwKK307CisKKy8qIFZlcmlmeSBzYWRiX2FkZHJlc3Nfe2xlbixwcmVmaXhsZW59IGFnYWluc3Qgc2FfZmFtaWx5LiAgKi8KK3N0YXRpYyBpbnQgdmVyaWZ5X2FkZHJlc3NfbGVuKHZvaWQgKnApCit7CisJc3RydWN0IHNhZGJfYWRkcmVzcyAqc3AgPSBwOworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikoc3AgKyAxKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42OworI2VuZGlmCisJaW50IGxlbjsKKworCXN3aXRjaCAoYWRkci0+c2FfZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlsZW4gID0gc2l6ZW9mKCpzcCkgKyBzaXplb2YoKnNpbikgKyAoc2l6ZW9mKHVpbnQ2NF90KSAtIDEpOworCQlsZW4gLz0gc2l6ZW9mKHVpbnQ2NF90KTsKKwkJaWYgKHNwLT5zYWRiX2FkZHJlc3NfbGVuICE9IGxlbiB8fAorCQkgICAgc3AtPnNhZGJfYWRkcmVzc19wcmVmaXhsZW4gPiAzMikKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwljYXNlIEFGX0lORVQ2OgorCQlsZW4gID0gc2l6ZW9mKCpzcCkgKyBzaXplb2YoKnNpbjYpICsgKHNpemVvZih1aW50NjRfdCkgLSAxKTsKKwkJbGVuIC89IHNpemVvZih1aW50NjRfdCk7CisJCWlmIChzcC0+c2FkYl9hZGRyZXNzX2xlbiAhPSBsZW4gfHwKKwkJICAgIHNwLT5zYWRiX2FkZHJlc3NfcHJlZml4bGVuID4gMTI4KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJLyogSXQgaXMgdXNlciB1c2luZyBrZXJuZWwgdG8ga2VlcCB0cmFjayBvZiBzZWN1cml0eQorCQkgKiBhc3NvY2lhdGlvbnMgZm9yIGFub3RoZXIgcHJvdG9jb2wsIHN1Y2ggYXMKKwkJICogT1NQRi9SU1ZQL1JJUFYyL01JUC4gIEl0IGlzIHVzZXIncyBqb2IgdG8gdmVyaWZ5CisJCSAqIGxlbmd0aHMuCisJCSAqCisJCSAqIFhYWCBBY3R1YWxseSwgYXNzb2NpYXRpb24vcG9saWN5IGRhdGFiYXNlIGlzIG5vdCB5ZXQKKwkJICogWFhYIGFibGUgdG8gY29wZSB3aXRoIGFyYml0cmFyeSBzb2NrYWRkciBmYW1pbGllcy4KKwkJICogWFhYIFdoZW4gaXQgY2FuLCByZW1vdmUgdGhpcyAtRUlOVkFMLiAgLURhdmVNCisJCSAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJfTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByZXNlbnRfYW5kX3NhbWVfZmFtaWx5KHN0cnVjdCBzYWRiX2FkZHJlc3MgKnNyYywKKwkJCQkgICBzdHJ1Y3Qgc2FkYl9hZGRyZXNzICpkc3QpCit7CisJc3RydWN0IHNvY2thZGRyICpzX2FkZHIsICpkX2FkZHI7CisKKwlpZiAoIXNyYyB8fCAhZHN0KQorCQlyZXR1cm4gMDsKKworCXNfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikoc3JjICsgMSk7CisJZF9hZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKShkc3QgKyAxKTsKKwlpZiAoc19hZGRyLT5zYV9mYW1pbHkgIT0gZF9hZGRyLT5zYV9mYW1pbHkpCisJCXJldHVybiAwOworCWlmIChzX2FkZHItPnNhX2ZhbWlseSAhPSBBRl9JTkVUCisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJICAgICYmIHNfYWRkci0+c2FfZmFtaWx5ICE9IEFGX0lORVQ2CisjZW5kaWYKKwkJKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBhcnNlX2V4dGhkcnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNhZGJfbXNnICpoZHIsIHZvaWQgKipleHRfaGRycykKK3sKKwljaGFyICpwID0gKGNoYXIgKikgaGRyOworCWludCBsZW4gPSBza2ItPmxlbjsKKworCWxlbiAtPSBzaXplb2YoKmhkcik7CisJcCArPSBzaXplb2YoKmhkcik7CisJd2hpbGUgKGxlbiA+IDApIHsKKwkJc3RydWN0IHNhZGJfZXh0ICplaGRyID0gKHN0cnVjdCBzYWRiX2V4dCAqKSBwOworCQl1aW50MTZfdCBleHRfdHlwZTsKKwkJaW50IGV4dF9sZW47CisKKwkJZXh0X2xlbiAgPSBlaGRyLT5zYWRiX2V4dF9sZW47CisJCWV4dF9sZW4gKj0gc2l6ZW9mKHVpbnQ2NF90KTsKKwkJZXh0X3R5cGUgPSBlaGRyLT5zYWRiX2V4dF90eXBlOworCQlpZiAoZXh0X2xlbiA8IHNpemVvZih1aW50NjRfdCkgfHwKKwkJICAgIGV4dF9sZW4gPiBsZW4gfHwKKwkJICAgIGV4dF90eXBlID09IFNBREJfRVhUX1JFU0VSVkVEKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGV4dF90eXBlIDw9IFNBREJfRVhUX01BWCkgeworCQkJaW50IG1pbiA9IChpbnQpIHNhZGJfZXh0X21pbl9sZW5bZXh0X3R5cGVdOworCQkJaWYgKGV4dF9sZW4gPCBtaW4pCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoZXh0X2hkcnNbZXh0X3R5cGUtMV0gIT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChleHRfdHlwZSA9PSBTQURCX0VYVF9BRERSRVNTX1NSQyB8fAorCQkJICAgIGV4dF90eXBlID09IFNBREJfRVhUX0FERFJFU1NfRFNUIHx8CisJCQkgICAgZXh0X3R5cGUgPT0gU0FEQl9FWFRfQUREUkVTU19QUk9YWSB8fAorCQkJICAgIGV4dF90eXBlID09IFNBREJfWF9FWFRfTkFUX1RfT0EpIHsKKwkJCQlpZiAodmVyaWZ5X2FkZHJlc3NfbGVuKHApKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0JCQkJCisJCQlleHRfaGRyc1tleHRfdHlwZS0xXSA9IHA7CisJCX0KKwkJcCAgICs9IGV4dF9sZW47CisJCWxlbiAtPSBleHRfbGVuOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdWludDE2X3QKK3Bma2V5X3NhdHlwZTJwcm90byh1aW50OF90IHNhdHlwZSkKK3sKKwlzd2l0Y2ggKHNhdHlwZSkgeworCWNhc2UgU0FEQl9TQVRZUEVfVU5TUEVDOgorCQlyZXR1cm4gSVBTRUNfUFJPVE9fQU5ZOworCWNhc2UgU0FEQl9TQVRZUEVfQUg6CisJCXJldHVybiBJUFBST1RPX0FIOworCWNhc2UgU0FEQl9TQVRZUEVfRVNQOgorCQlyZXR1cm4gSVBQUk9UT19FU1A7CisJY2FzZSBTQURCX1hfU0FUWVBFX0lQQ09NUDoKKwkJcmV0dXJuIElQUFJPVE9fQ09NUDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCS8qIE5PVFJFQUNIRUQgKi8KK30KKworc3RhdGljIHVpbnQ4X3QKK3Bma2V5X3Byb3RvMnNhdHlwZSh1aW50MTZfdCBwcm90bykKK3sKKwlzd2l0Y2ggKHByb3RvKSB7CisJY2FzZSBJUFBST1RPX0FIOgorCQlyZXR1cm4gU0FEQl9TQVRZUEVfQUg7CisJY2FzZSBJUFBST1RPX0VTUDoKKwkJcmV0dXJuIFNBREJfU0FUWVBFX0VTUDsKKwljYXNlIElQUFJPVE9fQ09NUDoKKwkJcmV0dXJuIFNBREJfWF9TQVRZUEVfSVBDT01QOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisJLyogTk9UUkVBQ0hFRCAqLworfQorCisvKiBCVFcsIHRoaXMgc2NoZW1lIG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gd2F5IHdpdGggUEZLRVkyIHNvY2tldHMgdG8KKyAqIHNheSBzcGVjaWZpY2FsbHkgJ2p1c3QgcmF3IHNvY2tldHMnIGFzIHdlIGVuY29kZSB0aGVtIGFzIDI1NS4KKyAqLworCitzdGF0aWMgdWludDhfdCBwZmtleV9wcm90b190b194ZnJtKHVpbnQ4X3QgcHJvdG8pCit7CisJcmV0dXJuIChwcm90byA9PSBJUFNFQ19QUk9UT19BTlkgPyAwIDogcHJvdG8pOworfQorCitzdGF0aWMgdWludDhfdCBwZmtleV9wcm90b19mcm9tX3hmcm0odWludDhfdCBwcm90bykKK3sKKwlyZXR1cm4gKHByb3RvID8gcHJvdG8gOiBJUFNFQ19QUk9UT19BTlkpOworfQorCitzdGF0aWMgaW50IHBma2V5X3NhZGJfYWRkcjJ4ZnJtX2FkZHIoc3RydWN0IHNhZGJfYWRkcmVzcyAqYWRkciwKKwkJCQkgICAgIHhmcm1fYWRkcmVzc190ICp4YWRkcikKK3sKKwlzd2l0Y2ggKCgoc3RydWN0IHNvY2thZGRyKikoYWRkciArIDEpKS0+c2FfZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQl4YWRkci0+YTQgPSAKKwkJCSgoc3RydWN0IHNvY2thZGRyX2luICopKGFkZHIgKyAxKSktPnNpbl9hZGRyLnNfYWRkcjsKKwkJcmV0dXJuIEFGX0lORVQ7CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJY2FzZSBBRl9JTkVUNjoKKwkJbWVtY3B5KHhhZGRyLT5hNiwgCisJCSAgICAgICAmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopKGFkZHIgKyAxKSktPnNpbjZfYWRkciwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJcmV0dXJuIEFGX0lORVQ2OworI2VuZGlmCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCS8qIE5PVFJFQUNIRUQgKi8KK30KKworc3RhdGljIHN0cnVjdCAgeGZybV9zdGF0ZSAqcGZrZXlfeGZybV9zdGF0ZV9sb29rdXAoc3RydWN0IHNhZGJfbXNnICpoZHIsIHZvaWQgKipleHRfaGRycykKK3sKKwlzdHJ1Y3Qgc2FkYl9zYSAqc2E7CisJc3RydWN0IHNhZGJfYWRkcmVzcyAqYWRkcjsKKwl1aW50MTZfdCBwcm90bzsKKwl1bnNpZ25lZCBzaG9ydCBmYW1pbHk7CisJeGZybV9hZGRyZXNzX3QgKnhhZGRyOworCisJc2EgPSAoc3RydWN0IHNhZGJfc2EgKikgZXh0X2hkcnNbU0FEQl9FWFRfU0EtMV07CisJaWYgKHNhID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcHJvdG8gPSBwZmtleV9zYXR5cGUycHJvdG8oaGRyLT5zYWRiX21zZ19zYXR5cGUpOworCWlmIChwcm90byA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIHNhZGJfYWRkcmVzc19sZW4gc2hvdWxkIGJlIGNoZWNrZWQgYnkgY2FsbGVyICovCisJYWRkciA9IChzdHJ1Y3Qgc2FkYl9hZGRyZXNzICopIGV4dF9oZHJzW1NBREJfRVhUX0FERFJFU1NfRFNULTFdOworCWlmIChhZGRyID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJZmFtaWx5ID0gKChzdHJ1Y3Qgc29ja2FkZHIgKikoYWRkciArIDEpKS0+c2FfZmFtaWx5OworCXN3aXRjaCAoZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQl4YWRkciA9ICh4ZnJtX2FkZHJlc3NfdCAqKSYoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKShhZGRyICsgMSkpLT5zaW5fYWRkcjsKKwkJYnJlYWs7CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJY2FzZSBBRl9JTkVUNjoKKwkJeGFkZHIgPSAoeGZybV9hZGRyZXNzX3QgKikmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopKGFkZHIgKyAxKSktPnNpbjZfYWRkcjsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQl4YWRkciA9IE5VTEw7CisJfQorCisJaWYgKCF4YWRkcikKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4geGZybV9zdGF0ZV9sb29rdXAoeGFkZHIsIHNhLT5zYWRiX3NhX3NwaSwgcHJvdG8sIGZhbWlseSk7Cit9CisKKyNkZWZpbmUgUEZLRVlfQUxJR044KGEpICgxICsgKCgoYSkgLSAxKSB8ICg4IC0gMSkpKQorc3RhdGljIGludAorcGZrZXlfc29ja2FkZHJfc2l6ZShzYV9mYW1pbHlfdCBmYW1pbHkpCit7CisJc3dpdGNoIChmYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCXJldHVybiBQRktFWV9BTElHTjgoc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOworI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCWNhc2UgQUZfSU5FVDY6CisJCXJldHVybiBQRktFWV9BTElHTjgoc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpKTsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwkvKiBOT1RSRUFDSEVEICovCit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqIHBma2V5X3hmcm1fc3RhdGUybXNnKHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBpbnQgYWRkX2tleXMsIGludCBoc2MpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgc2FkYl9tc2cgKmhkcjsKKwlzdHJ1Y3Qgc2FkYl9zYSAqc2E7CisJc3RydWN0IHNhZGJfbGlmZXRpbWUgKmxpZmV0aW1lOworCXN0cnVjdCBzYWRiX2FkZHJlc3MgKmFkZHI7CisJc3RydWN0IHNhZGJfa2V5ICprZXk7CisJc3RydWN0IHNhZGJfeF9zYTIgKnNhMjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42OworI2VuZGlmCisJaW50IHNpemU7CisJaW50IGF1dGhfa2V5X3NpemUgPSAwOworCWludCBlbmNyeXB0X2tleV9zaXplID0gMDsKKwlpbnQgc29ja2FkZHJfc2l6ZTsKKwlzdHJ1Y3QgeGZybV9lbmNhcF90bXBsICpuYXR0ID0gTlVMTDsKKworCS8qIGFkZHJlc3MgZmFtaWx5IGNoZWNrICovCisJc29ja2FkZHJfc2l6ZSA9IHBma2V5X3NvY2thZGRyX3NpemUoeC0+cHJvcHMuZmFtaWx5KTsKKwlpZiAoIXNvY2thZGRyX3NpemUpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJLyogYmFzZSwgU0EsIChsaWZldGltZSAoSFNDKSwpIGFkZHJlc3MoU0QpLCAoYWRkcmVzcyhQKSwpCisJICAga2V5KEFFKSwgKGlkZW50aXR5KFNEKSwpIChzZW5zaXRpdml0eSk+ICovCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2FkYl9tc2cpICtzaXplb2Yoc3RydWN0IHNhZGJfc2EpICsgCisJCXNpemVvZihzdHJ1Y3Qgc2FkYl9saWZldGltZSkgKworCQkoKGhzYyAmIDEpID8gc2l6ZW9mKHN0cnVjdCBzYWRiX2xpZmV0aW1lKSA6IDApICsKKwkJKChoc2MgJiAyKSA/IHNpemVvZihzdHJ1Y3Qgc2FkYl9saWZldGltZSkgOiAwKSArCisJCQlzaXplb2Yoc3RydWN0IHNhZGJfYWRkcmVzcykqMiArIAorCQkJCXNvY2thZGRyX3NpemUqMiArCisJCQkJCXNpemVvZihzdHJ1Y3Qgc2FkYl94X3NhMik7CisJLyogaWRlbnRpdHkgJiBzZW5zaXRpdml0eSAqLworCisJaWYgKCh4LT5wcm9wcy5mYW1pbHkgPT0gQUZfSU5FVCAmJgorCSAgICAgeC0+c2VsLnNhZGRyLmE0ICE9IHgtPnByb3BzLnNhZGRyLmE0KQorI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCSAgICB8fCAoeC0+cHJvcHMuZmFtaWx5ID09IEFGX0lORVQ2ICYmCisJCW1lbWNtcCAoeC0+c2VsLnNhZGRyLmE2LCB4LT5wcm9wcy5zYWRkci5hNiwgc2l6ZW9mIChzdHJ1Y3QgaW42X2FkZHIpKSkKKyNlbmRpZgorCQkpCisJCXNpemUgKz0gc2l6ZW9mKHN0cnVjdCBzYWRiX2FkZHJlc3MpICsgc29ja2FkZHJfc2l6ZTsKKworCWlmIChhZGRfa2V5cykgeworCQlpZiAoeC0+YWFsZyAmJiB4LT5hYWxnLT5hbGdfa2V5X2xlbikgeworCQkJYXV0aF9rZXlfc2l6ZSA9IAorCQkJCVBGS0VZX0FMSUdOOCgoeC0+YWFsZy0+YWxnX2tleV9sZW4gKyA3KSAvIDgpOyAKKwkJCXNpemUgKz0gc2l6ZW9mKHN0cnVjdCBzYWRiX2tleSkgKyBhdXRoX2tleV9zaXplOworCQl9CisJCWlmICh4LT5lYWxnICYmIHgtPmVhbGctPmFsZ19rZXlfbGVuKSB7CisJCQllbmNyeXB0X2tleV9zaXplID0gCisJCQkJUEZLRVlfQUxJR044KCh4LT5lYWxnLT5hbGdfa2V5X2xlbis3KSAvIDgpOyAKKwkJCXNpemUgKz0gc2l6ZW9mKHN0cnVjdCBzYWRiX2tleSkgKyBlbmNyeXB0X2tleV9zaXplOworCQl9CisJfQorCWlmICh4LT5lbmNhcCkKKwkJbmF0dCA9IHgtPmVuY2FwOworCisJaWYgKG5hdHQgJiYgbmF0dC0+ZW5jYXBfdHlwZSkgeworCQlzaXplICs9IHNpemVvZihzdHJ1Y3Qgc2FkYl94X25hdF90X3R5cGUpOworCQlzaXplICs9IHNpemVvZihzdHJ1Y3Qgc2FkYl94X25hdF90X3BvcnQpOworCQlzaXplICs9IHNpemVvZihzdHJ1Y3Qgc2FkYl94X25hdF90X3BvcnQpOworCX0KKworCXNrYiA9ICBhbGxvY19za2Ioc2l6ZSArIDE2LCBHRlBfQVRPTUlDKTsKKwlpZiAoc2tiID09IE5VTEwpCisJCXJldHVybiBFUlJfUFRSKC1FTk9CVUZTKTsKKworCS8qIGNhbGwgc2hvdWxkIGZpbGwgaGVhZGVyIGxhdGVyICovCisJaGRyID0gKHN0cnVjdCBzYWRiX21zZyAqKSBza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBzYWRiX21zZykpOworCW1lbXNldChoZHIsIDAsIHNpemUpOwkvKiBYWFggZG8gd2UgbmVlZCB0aGlzID8gKi8KKwloZHItPnNhZGJfbXNnX2xlbiA9IHNpemUgLyBzaXplb2YodWludDY0X3QpOworCisJLyogc2EgKi8KKwlzYSA9IChzdHJ1Y3Qgc2FkYl9zYSAqKSAgc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3Qgc2FkYl9zYSkpOworCXNhLT5zYWRiX3NhX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc2FkYl9zYSkvc2l6ZW9mKHVpbnQ2NF90KTsKKwlzYS0+c2FkYl9zYV9leHR0eXBlID0gU0FEQl9FWFRfU0E7CisJc2EtPnNhZGJfc2Ffc3BpID0geC0+aWQuc3BpOworCXNhLT5zYWRiX3NhX3JlcGxheSA9IHgtPnByb3BzLnJlcGxheV93aW5kb3c7CisJc2EtPnNhZGJfc2Ffc3RhdGUgPSBTQURCX1NBU1RBVEVfRFlJTkc7CisJaWYgKHgtPmttLnN0YXRlID09IFhGUk1fU1RBVEVfVkFMSUQgJiYgIXgtPmttLmR5aW5nKQorCQlzYS0+c2FkYl9zYV9zdGF0ZSA9IFNBREJfU0FTVEFURV9NQVRVUkU7CisJZWxzZSBpZiAoeC0+a20uc3RhdGUgPT0gWEZSTV9TVEFURV9BQ1EpCisJCXNhLT5zYWRiX3NhX3N0YXRlID0gU0FEQl9TQVNUQVRFX0xBUlZBTDsKKwllbHNlIGlmICh4LT5rbS5zdGF0ZSA9PSBYRlJNX1NUQVRFX0VYUElSRUQpCisJCXNhLT5zYWRiX3NhX3N0YXRlID0gU0FEQl9TQVNUQVRFX0RFQUQ7CisJc2EtPnNhZGJfc2FfYXV0aCA9IDA7CisJaWYgKHgtPmFhbGcpIHsKKwkJc3RydWN0IHhmcm1fYWxnb19kZXNjICphID0geGZybV9hYWxnX2dldF9ieW5hbWUoeC0+YWFsZy0+YWxnX25hbWUsIDApOworCQlzYS0+c2FkYl9zYV9hdXRoID0gYSA/IGEtPmRlc2Muc2FkYl9hbGdfaWQgOiAwOworCX0KKwlzYS0+c2FkYl9zYV9lbmNyeXB0ID0gMDsKKwlCVUdfT04oeC0+ZWFsZyAmJiB4LT5jYWxnKTsKKwlpZiAoeC0+ZWFsZykgeworCQlzdHJ1Y3QgeGZybV9hbGdvX2Rlc2MgKmEgPSB4ZnJtX2VhbGdfZ2V0X2J5bmFtZSh4LT5lYWxnLT5hbGdfbmFtZSwgMCk7CisJCXNhLT5zYWRiX3NhX2VuY3J5cHQgPSBhID8gYS0+ZGVzYy5zYWRiX2FsZ19pZCA6IDA7CisJfQorCS8qIEtBTUUgY29tcGF0aWJsZTogc2FkYl9zYV9lbmNyeXB0IGlzIG92ZXJsb2FkZWQgd2l0aCBjYWxnIGlkICovCisJaWYgKHgtPmNhbGcpIHsKKwkJc3RydWN0IHhmcm1fYWxnb19kZXNjICphID0geGZybV9jYWxnX2dldF9ieW5hbWUoeC0+Y2FsZy0+YWxnX25hbWUsIDApOworCQlzYS0+c2FkYl9zYV9lbmNyeXB0ID0gYSA/IGEtPmRlc2Muc2FkYl9hbGdfaWQgOiAwOworCX0KKworCXNhLT5zYWRiX3NhX2ZsYWdzID0gMDsKKwlpZiAoeC0+cHJvcHMuZmxhZ3MgJiBYRlJNX1NUQVRFX05PRUNOKQorCQlzYS0+c2FkYl9zYV9mbGFncyB8PSBTQURCX1NBRkxBR1NfTk9FQ047CisJaWYgKHgtPnByb3BzLmZsYWdzICYgWEZSTV9TVEFURV9ERUNBUF9EU0NQKQorCQlzYS0+c2FkYl9zYV9mbGFncyB8PSBTQURCX1NBRkxBR1NfREVDQVBfRFNDUDsKKworCS8qIGhhcmQgdGltZSAqLworCWlmIChoc2MgJiAyKSB7CisJCWxpZmV0aW1lID0gKHN0cnVjdCBzYWRiX2xpZmV0aW1lICopICBza2JfcHV0KHNrYiwgCisJCQkJCQkJICAgICBzaXplb2Yoc3RydWN0IHNhZGJfbGlmZXRpbWUpKTsKKwkJbGlmZXRpbWUtPnNhZGJfbGlmZXRpbWVfbGVuID0KKwkJCXNpemVvZihzdHJ1Y3Qgc2FkYl9saWZldGltZSkvc2l6ZW9mKHVpbnQ2NF90KTsKKwkJbGlmZXRpbWUtPnNhZGJfbGlmZXRpbWVfZXh0dHlwZSA9IFNBREJfRVhUX0xJRkVUSU1FX0hBUkQ7CisJCWxpZmV0aW1lLT5zYWRiX2xpZmV0aW1lX2FsbG9jYXRpb25zID0gIF9YMktFWSh4LT5sZnQuaGFyZF9wYWNrZXRfbGltaXQpOworCQlsaWZldGltZS0+c2FkYl9saWZldGltZV9ieXRlcyA9IF9YMktFWSh4LT5sZnQuaGFyZF9ieXRlX2xpbWl0KTsKKwkJbGlmZXRpbWUtPnNhZGJfbGlmZXRpbWVfYWRkdGltZSA9IHgtPmxmdC5oYXJkX2FkZF9leHBpcmVzX3NlY29uZHM7CisJCWxpZmV0aW1lLT5zYWRiX2xpZmV0aW1lX3VzZXRpbWUgPSB4LT5sZnQuaGFyZF91c2VfZXhwaXJlc19zZWNvbmRzOworCX0KKwkvKiBzb2Z0IHRpbWUgKi8KKwlpZiAoaHNjICYgMSkgeworCQlsaWZldGltZSA9IChzdHJ1Y3Qgc2FkYl9saWZldGltZSAqKSAgc2tiX3B1dChza2IsIAorCQkJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBzYWRiX2xpZmV0aW1lKSk7CisJCWxpZmV0aW1lLT5zYWRiX2xpZmV0aW1lX2xlbiA9CisJCQlzaXplb2Yoc3RydWN0IHNhZGJfbGlmZXRpbWUpL3NpemVvZih1aW50NjRfdCk7CisJCWxpZmV0aW1lLT5zYWRiX2xpZmV0aW1lX2V4dHR5cGUgPSBTQURCX0VYVF9MSUZFVElNRV9TT0ZUOworCQlsaWZldGltZS0+c2FkYl9saWZldGltZV9hbGxvY2F0aW9ucyA9ICBfWDJLRVkoeC0+bGZ0LnNvZnRfcGFja2V0X2xpbWl0KTsKKwkJbGlmZXRpbWUtPnNhZGJfbGlmZXRpbWVfYnl0ZXMgPSBfWDJLRVkoeC0+bGZ0LnNvZnRfYnl0ZV9saW1pdCk7CisJCWxpZmV0aW1lLT5zYWRiX2xpZmV0aW1lX2FkZHRpbWUgPSB4LT5sZnQuc29mdF9hZGRfZXhwaXJlc19zZWNvbmRzOworCQlsaWZldGltZS0+c2FkYl9saWZldGltZV91c2V0aW1lID0geC0+bGZ0LnNvZnRfdXNlX2V4cGlyZXNfc2Vjb25kczsKKwl9CisJLyogY3VycmVudCB0aW1lICovCisJbGlmZXRpbWUgPSAoc3RydWN0IHNhZGJfbGlmZXRpbWUgKikgIHNrYl9wdXQoc2tiLAorCQkJCQkJICAgICBzaXplb2Yoc3RydWN0IHNhZGJfbGlmZXRpbWUpKTsKKwlsaWZldGltZS0+c2FkYl9saWZldGltZV9sZW4gPQorCQlzaXplb2Yoc3RydWN0IHNhZGJfbGlmZXRpbWUpL3NpemVvZih1aW50NjRfdCk7CisJbGlmZXRpbWUtPnNhZGJfbGlmZXRpbWVfZXh0dHlwZSA9IFNBREJfRVhUX0xJRkVUSU1FX0NVUlJFTlQ7CisJbGlmZXRpbWUtPnNhZGJfbGlmZXRpbWVfYWxsb2NhdGlvbnMgPSB4LT5jdXJsZnQucGFja2V0czsKKwlsaWZldGltZS0+c2FkYl9saWZldGltZV9ieXRlcyA9IHgtPmN1cmxmdC5ieXRlczsKKwlsaWZldGltZS0+c2FkYl9saWZldGltZV9hZGR0aW1lID0geC0+Y3VybGZ0LmFkZF90aW1lOworCWxpZmV0aW1lLT5zYWRiX2xpZmV0aW1lX3VzZXRpbWUgPSB4LT5jdXJsZnQudXNlX3RpbWU7CisJLyogc3JjIGFkZHJlc3MgKi8KKwlhZGRyID0gKHN0cnVjdCBzYWRiX2FkZHJlc3MqKSBza2JfcHV0KHNrYiwgCisJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc2FkYl9hZGRyZXNzKStzb2NrYWRkcl9zaXplKTsKKwlhZGRyLT5zYWRiX2FkZHJlc3NfbGVuID0gCisJCShzaXplb2Yoc3RydWN0IHNhZGJfYWRkcmVzcykrc29ja2FkZHJfc2l6ZSkvCisJCQlzaXplb2YodWludDY0X3QpOworCWFkZHItPnNhZGJfYWRkcmVzc19leHR0eXBlID0gU0FEQl9FWFRfQUREUkVTU19TUkM7CisJLyogImlmIHRoZSBwb3J0cyBhcmUgbm9uLXplcm8sIHRoZW4gdGhlIHNhZGJfYWRkcmVzc19wcm90byBmaWVsZCwgCisJICAgbm9ybWFsbHkgemVybywgTVVTVCBiZSBmaWxsZWQgaW4gd2l0aCB0aGUgdHJhbnNwb3J0IAorCSAgIHByb3RvY29sJ3MgbnVtYmVyLiIgLSBSRkMyMzY3ICovCisJYWRkci0+c2FkYl9hZGRyZXNzX3Byb3RvID0gMDsgCisJYWRkci0+c2FkYl9hZGRyZXNzX3Jlc2VydmVkID0gMDsKKwlpZiAoeC0+cHJvcHMuZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJYWRkci0+c2FkYl9hZGRyZXNzX3ByZWZpeGxlbiA9IDMyOworCisJCXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgKGFkZHIgKyAxKTsKKwkJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSB4LT5wcm9wcy5zYWRkci5hNDsKKwkJc2luLT5zaW5fcG9ydCA9IDA7CisJCW1lbXNldChzaW4tPnNpbl96ZXJvLCAwLCBzaXplb2Yoc2luLT5zaW5femVybykpOworCX0KKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwllbHNlIGlmICh4LT5wcm9wcy5mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKyAJCWFkZHItPnNhZGJfYWRkcmVzc19wcmVmaXhsZW4gPSAxMjg7CisKKwkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIChhZGRyICsgMSk7CisJCXNpbjYtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJCXNpbjYtPnNpbjZfcG9ydCA9IDA7CisJCXNpbjYtPnNpbjZfZmxvd2luZm8gPSAwOworIAkJbWVtY3B5KCZzaW42LT5zaW42X2FkZHIsIHgtPnByb3BzLnNhZGRyLmE2LAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQlzaW42LT5zaW42X3Njb3BlX2lkID0gMDsKKyAJfQorI2VuZGlmCisJZWxzZQorCQlCVUcoKTsKKworCS8qIGRzdCBhZGRyZXNzICovCisJYWRkciA9IChzdHJ1Y3Qgc2FkYl9hZGRyZXNzKikgc2tiX3B1dChza2IsIAorCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHNhZGJfYWRkcmVzcykrc29ja2FkZHJfc2l6ZSk7CisJYWRkci0+c2FkYl9hZGRyZXNzX2xlbiA9IAorCQkoc2l6ZW9mKHN0cnVjdCBzYWRiX2FkZHJlc3MpK3NvY2thZGRyX3NpemUpLworCQkJc2l6ZW9mKHVpbnQ2NF90KTsKKwlhZGRyLT5zYWRiX2FkZHJlc3NfZXh0dHlwZSA9IFNBREJfRVhUX0FERFJFU1NfRFNUOworCWFkZHItPnNhZGJfYWRkcmVzc19wcm90byA9IDA7IAorCWFkZHItPnNhZGJfYWRkcmVzc19wcmVmaXhsZW4gPSAzMjsgLyogWFhYICovIAorCWFkZHItPnNhZGJfYWRkcmVzc19yZXNlcnZlZCA9IDA7CisJaWYgKHgtPnByb3BzLmZhbWlseSA9PSBBRl9JTkVUKSB7CisJCXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgKGFkZHIgKyAxKTsKKwkJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSB4LT5pZC5kYWRkci5hNDsKKwkJc2luLT5zaW5fcG9ydCA9IDA7CisJCW1lbXNldChzaW4tPnNpbl96ZXJvLCAwLCBzaXplb2Yoc2luLT5zaW5femVybykpOworCisJCWlmICh4LT5zZWwuc2FkZHIuYTQgIT0geC0+cHJvcHMuc2FkZHIuYTQpIHsKKwkJCWFkZHIgPSAoc3RydWN0IHNhZGJfYWRkcmVzcyopIHNrYl9wdXQoc2tiLCAKKwkJCQlzaXplb2Yoc3RydWN0IHNhZGJfYWRkcmVzcykrc29ja2FkZHJfc2l6ZSk7CisJCQlhZGRyLT5zYWRiX2FkZHJlc3NfbGVuID0gCisJCQkJKHNpemVvZihzdHJ1Y3Qgc2FkYl9hZGRyZXNzKStzb2NrYWRkcl9zaXplKS8KKwkJCQlzaXplb2YodWludDY0X3QpOworCQkJYWRkci0+c2FkYl9hZGRyZXNzX2V4dHR5cGUgPSBTQURCX0VYVF9BRERSRVNTX1BST1hZOworCQkJYWRkci0+c2FkYl9hZGRyZXNzX3Byb3RvID0KKwkJCQlwZmtleV9wcm90b19mcm9tX3hmcm0oeC0+c2VsLnByb3RvKTsKKwkJCWFkZHItPnNhZGJfYWRkcmVzc19wcmVmaXhsZW4gPSB4LT5zZWwucHJlZml4bGVuX3M7CisJCQlhZGRyLT5zYWRiX2FkZHJlc3NfcmVzZXJ2ZWQgPSAwOworCisJCQlzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopIChhZGRyICsgMSk7CisJCQlzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSB4LT5zZWwuc2FkZHIuYTQ7CisJCQlzaW4tPnNpbl9wb3J0ID0geC0+c2VsLnNwb3J0OworCQkJbWVtc2V0KHNpbi0+c2luX3plcm8sIDAsIHNpemVvZihzaW4tPnNpbl96ZXJvKSk7CisJCX0KKwl9CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJZWxzZSBpZiAoeC0+cHJvcHMuZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCWFkZHItPnNhZGJfYWRkcmVzc19wcmVmaXhsZW4gPSAxMjg7CisKKwkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIChhZGRyICsgMSk7CisJCXNpbjYtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJCXNpbjYtPnNpbjZfcG9ydCA9IDA7CisJCXNpbjYtPnNpbjZfZmxvd2luZm8gPSAwOworCQltZW1jcHkoJnNpbjYtPnNpbjZfYWRkciwgeC0+aWQuZGFkZHIuYTYsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJc2luNi0+c2luNl9zY29wZV9pZCA9IDA7CisKKwkJaWYgKG1lbWNtcCAoeC0+c2VsLnNhZGRyLmE2LCB4LT5wcm9wcy5zYWRkci5hNiwKKwkJCSAgICBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSkpIHsKKwkJCWFkZHIgPSAoc3RydWN0IHNhZGJfYWRkcmVzcyAqKSBza2JfcHV0KHNrYiwgCisJCQkJc2l6ZW9mKHN0cnVjdCBzYWRiX2FkZHJlc3MpK3NvY2thZGRyX3NpemUpOworCQkJYWRkci0+c2FkYl9hZGRyZXNzX2xlbiA9IAorCQkJCShzaXplb2Yoc3RydWN0IHNhZGJfYWRkcmVzcykrc29ja2FkZHJfc2l6ZSkvCisJCQkJc2l6ZW9mKHVpbnQ2NF90KTsKKwkJCWFkZHItPnNhZGJfYWRkcmVzc19leHR0eXBlID0gU0FEQl9FWFRfQUREUkVTU19QUk9YWTsKKwkJCWFkZHItPnNhZGJfYWRkcmVzc19wcm90byA9CisJCQkJcGZrZXlfcHJvdG9fZnJvbV94ZnJtKHgtPnNlbC5wcm90byk7CisJCQlhZGRyLT5zYWRiX2FkZHJlc3NfcHJlZml4bGVuID0geC0+c2VsLnByZWZpeGxlbl9zOworCQkJYWRkci0+c2FkYl9hZGRyZXNzX3Jlc2VydmVkID0gMDsKKworCQkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIChhZGRyICsgMSk7CisJCQlzaW42LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQkJc2luNi0+c2luNl9wb3J0ID0geC0+c2VsLnNwb3J0OworCQkJc2luNi0+c2luNl9mbG93aW5mbyA9IDA7CisJCQltZW1jcHkoJnNpbjYtPnNpbjZfYWRkciwgeC0+c2VsLnNhZGRyLmE2LAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJCXNpbjYtPnNpbjZfc2NvcGVfaWQgPSAwOworCQl9CisJfQorI2VuZGlmCisJZWxzZQorCQlCVUcoKTsKKworCS8qIGF1dGgga2V5ICovCisJaWYgKGFkZF9rZXlzICYmIGF1dGhfa2V5X3NpemUpIHsKKwkJa2V5ID0gKHN0cnVjdCBzYWRiX2tleSAqKSBza2JfcHV0KHNrYiwgCisJCQkJCQkgIHNpemVvZihzdHJ1Y3Qgc2FkYl9rZXkpK2F1dGhfa2V5X3NpemUpOworCQlrZXktPnNhZGJfa2V5X2xlbiA9IChzaXplb2Yoc3RydWN0IHNhZGJfa2V5KSArIGF1dGhfa2V5X3NpemUpIC8KKwkJCXNpemVvZih1aW50NjRfdCk7CisJCWtleS0+c2FkYl9rZXlfZXh0dHlwZSA9IFNBREJfRVhUX0tFWV9BVVRIOworCQlrZXktPnNhZGJfa2V5X2JpdHMgPSB4LT5hYWxnLT5hbGdfa2V5X2xlbjsKKwkJa2V5LT5zYWRiX2tleV9yZXNlcnZlZCA9IDA7CisJCW1lbWNweShrZXkgKyAxLCB4LT5hYWxnLT5hbGdfa2V5LCAoeC0+YWFsZy0+YWxnX2tleV9sZW4rNykvOCk7CisJfQorCS8qIGVuY3J5cHQga2V5ICovCisJaWYgKGFkZF9rZXlzICYmIGVuY3J5cHRfa2V5X3NpemUpIHsKKwkJa2V5ID0gKHN0cnVjdCBzYWRiX2tleSAqKSBza2JfcHV0KHNrYiwgCisJCQkJCQkgIHNpemVvZihzdHJ1Y3Qgc2FkYl9rZXkpK2VuY3J5cHRfa2V5X3NpemUpOworCQlrZXktPnNhZGJfa2V5X2xlbiA9IChzaXplb2Yoc3RydWN0IHNhZGJfa2V5KSArIAorCQkJCSAgICAgZW5jcnlwdF9rZXlfc2l6ZSkgLyBzaXplb2YodWludDY0X3QpOworCQlrZXktPnNhZGJfa2V5X2V4dHR5cGUgPSBTQURCX0VYVF9LRVlfRU5DUllQVDsKKwkJa2V5LT5zYWRiX2tleV9iaXRzID0geC0+ZWFsZy0+YWxnX2tleV9sZW47CisJCWtleS0+c2FkYl9rZXlfcmVzZXJ2ZWQgPSAwOworCQltZW1jcHkoa2V5ICsgMSwgeC0+ZWFsZy0+YWxnX2tleSwgCisJCSAgICAgICAoeC0+ZWFsZy0+YWxnX2tleV9sZW4rNykvOCk7CisJfQorCisJLyogc2EgKi8KKwlzYTIgPSAoc3RydWN0IHNhZGJfeF9zYTIgKikgIHNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IHNhZGJfeF9zYTIpKTsKKwlzYTItPnNhZGJfeF9zYTJfbGVuID0gc2l6ZW9mKHN0cnVjdCBzYWRiX3hfc2EyKS9zaXplb2YodWludDY0X3QpOworCXNhMi0+c2FkYl94X3NhMl9leHR0eXBlID0gU0FEQl9YX0VYVF9TQTI7CisJc2EyLT5zYWRiX3hfc2EyX21vZGUgPSB4LT5wcm9wcy5tb2RlICsgMTsKKwlzYTItPnNhZGJfeF9zYTJfcmVzZXJ2ZWQxID0gMDsKKwlzYTItPnNhZGJfeF9zYTJfcmVzZXJ2ZWQyID0gMDsKKwlzYTItPnNhZGJfeF9zYTJfc2VxdWVuY2UgPSAwOworCXNhMi0+c2FkYl94X3NhMl9yZXFpZCA9IHgtPnByb3BzLnJlcWlkOworCisJaWYgKG5hdHQgJiYgbmF0dC0+ZW5jYXBfdHlwZSkgeworCQlzdHJ1Y3Qgc2FkYl94X25hdF90X3R5cGUgKm5fdHlwZTsKKwkJc3RydWN0IHNhZGJfeF9uYXRfdF9wb3J0ICpuX3BvcnQ7CisKKwkJLyogdHlwZSAqLworCQluX3R5cGUgPSAoc3RydWN0IHNhZGJfeF9uYXRfdF90eXBlKikgc2tiX3B1dChza2IsIHNpemVvZigqbl90eXBlKSk7CisJCW5fdHlwZS0+c2FkYl94X25hdF90X3R5cGVfbGVuID0gc2l6ZW9mKCpuX3R5cGUpL3NpemVvZih1aW50NjRfdCk7CisJCW5fdHlwZS0+c2FkYl94X25hdF90X3R5cGVfZXh0dHlwZSA9IFNBREJfWF9FWFRfTkFUX1RfVFlQRTsKKwkJbl90eXBlLT5zYWRiX3hfbmF0X3RfdHlwZV90eXBlID0gbmF0dC0+ZW5jYXBfdHlwZTsKKwkJbl90eXBlLT5zYWRiX3hfbmF0X3RfdHlwZV9yZXNlcnZlZFswXSA9IDA7CisJCW5fdHlwZS0+c2FkYl94X25hdF90X3R5cGVfcmVzZXJ2ZWRbMV0gPSAwOworCQluX3R5cGUtPnNhZGJfeF9uYXRfdF90eXBlX3Jlc2VydmVkWzJdID0gMDsKKworCQkvKiBzb3VyY2UgcG9ydCAqLworCQluX3BvcnQgPSAoc3RydWN0IHNhZGJfeF9uYXRfdF9wb3J0Kikgc2tiX3B1dChza2IsIHNpemVvZiAoKm5fcG9ydCkpOworCQluX3BvcnQtPnNhZGJfeF9uYXRfdF9wb3J0X2xlbiA9IHNpemVvZigqbl9wb3J0KS9zaXplb2YodWludDY0X3QpOworCQluX3BvcnQtPnNhZGJfeF9uYXRfdF9wb3J0X2V4dHR5cGUgPSBTQURCX1hfRVhUX05BVF9UX1NQT1JUOworCQluX3BvcnQtPnNhZGJfeF9uYXRfdF9wb3J0X3BvcnQgPSBuYXR0LT5lbmNhcF9zcG9ydDsKKwkJbl9wb3J0LT5zYWRiX3hfbmF0X3RfcG9ydF9yZXNlcnZlZCA9IDA7CisKKwkJLyogZGVzdCBwb3J0ICovCisJCW5fcG9ydCA9IChzdHJ1Y3Qgc2FkYl94X25hdF90X3BvcnQqKSBza2JfcHV0KHNrYiwgc2l6ZW9mICgqbl9wb3J0KSk7CisJCW5fcG9ydC0+c2FkYl94X25hdF90X3BvcnRfbGVuID0gc2l6ZW9mKCpuX3BvcnQpL3NpemVvZih1aW50NjRfdCk7CisJCW5fcG9ydC0+c2FkYl94X25hdF90X3BvcnRfZXh0dHlwZSA9IFNBREJfWF9FWFRfTkFUX1RfRFBPUlQ7CisJCW5fcG9ydC0+c2FkYl94X25hdF90X3BvcnRfcG9ydCA9IG5hdHQtPmVuY2FwX2Rwb3J0OworCQluX3BvcnQtPnNhZGJfeF9uYXRfdF9wb3J0X3Jlc2VydmVkID0gMDsKKwl9CisKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgc3RydWN0IHhmcm1fc3RhdGUgKiBwZmtleV9tc2cyeGZybV9zdGF0ZShzdHJ1Y3Qgc2FkYl9tc2cgKmhkciwgCisJCQkJCQl2b2lkICoqZXh0X2hkcnMpCit7CisJc3RydWN0IHhmcm1fc3RhdGUgKng7IAorCXN0cnVjdCBzYWRiX2xpZmV0aW1lICpsaWZldGltZTsKKwlzdHJ1Y3Qgc2FkYl9zYSAqc2E7CisJc3RydWN0IHNhZGJfa2V5ICprZXk7CisJdWludDE2X3QgcHJvdG87CisJaW50IGVycjsKKwkKKworCXNhID0gKHN0cnVjdCBzYWRiX3NhICopIGV4dF9oZHJzW1NBREJfRVhUX1NBLTFdOworCWlmICghc2EgfHwKKwkgICAgIXByZXNlbnRfYW5kX3NhbWVfZmFtaWx5KGV4dF9oZHJzW1NBREJfRVhUX0FERFJFU1NfU1JDLTFdLAorCQkJCSAgICAgZXh0X2hkcnNbU0FEQl9FWFRfQUREUkVTU19EU1QtMV0pKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwlpZiAoaGRyLT5zYWRiX21zZ19zYXR5cGUgPT0gU0FEQl9TQVRZUEVfRVNQICYmCisJICAgICFleHRfaGRyc1tTQURCX0VYVF9LRVlfRU5DUllQVC0xXSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJaWYgKGhkci0+c2FkYl9tc2dfc2F0eXBlID09IFNBREJfU0FUWVBFX0FIICYmCisJICAgICFleHRfaGRyc1tTQURCX0VYVF9LRVlfQVVUSC0xXSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJaWYgKCEhZXh0X2hkcnNbU0FEQl9FWFRfTElGRVRJTUVfSEFSRC0xXSAhPQorCSAgICAhIWV4dF9oZHJzW1NBREJfRVhUX0xJRkVUSU1FX1NPRlQtMV0pCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJcHJvdG8gPSBwZmtleV9zYXR5cGUycHJvdG8oaGRyLT5zYWRiX21zZ19zYXR5cGUpOworCWlmIChwcm90byA9PSAwKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCS8qIGRlZmF1bHQgZXJyb3IgaXMgbm8gYnVmZmVyIHNwYWNlICovCisJZXJyID0gLUVOT0JVRlM7CisKKwkvKiBSRkMyMzY3OgorCisgICBPbmx5IFNBREJfU0FTVEFURV9NQVRVUkUgU0FzIG1heSBiZSBzdWJtaXR0ZWQgaW4gYW4gU0FEQl9BREQgbWVzc2FnZS4KKyAgIFNBREJfU0FTVEFURV9MQVJWQUwgU0FzIGFyZSBjcmVhdGVkIGJ5IFNBREJfR0VUU1BJIGFuZCBpdCBpcyBub3QKKyAgIHNlbnNpYmxlIHRvIGFkZCBhIG5ldyBTQSBpbiB0aGUgRFlJTkcgb3IgU0FEQl9TQVNUQVRFX0RFQUQgc3RhdGUuCisgICBUaGVyZWZvcmUsIHRoZSBzYWRiX3NhX3N0YXRlIGZpZWxkIG9mIGFsbCBzdWJtaXR0ZWQgU0FzIE1VU1QgYmUKKyAgIFNBREJfU0FTVEFURV9NQVRVUkUgYW5kIHRoZSBrZXJuZWwgTVVTVCByZXR1cm4gYW4gZXJyb3IgaWYgdGhpcyBpcworICAgbm90IHRydWUuCisKKyAgICAgICAgICAgSG93ZXZlciwgS0FNRSBzZXRrZXkgYWx3YXlzIHVzZXMgU0FEQl9TQVNUQVRFX0xBUlZBTC4KKwkgICBIZW5jZSwgd2UgaGF2ZSB0byBfaWdub3JlXyBzYWRiX3NhX3N0YXRlLCB3aGljaCBpcyBhbHNvIHJlYXNvbmFibGUuCisJICovCisJaWYgKHNhLT5zYWRiX3NhX2F1dGggPiBTQURCX0FBTEdfTUFYIHx8CisJICAgIChoZHItPnNhZGJfbXNnX3NhdHlwZSA9PSBTQURCX1hfU0FUWVBFX0lQQ09NUCAmJgorCSAgICAgc2EtPnNhZGJfc2FfZW5jcnlwdCA+IFNBREJfWF9DQUxHX01BWCkgfHwKKwkgICAgc2EtPnNhZGJfc2FfZW5jcnlwdCA+IFNBREJfRUFMR19NQVgpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCWtleSA9IChzdHJ1Y3Qgc2FkYl9rZXkqKSBleHRfaGRyc1tTQURCX0VYVF9LRVlfQVVUSC0xXTsKKwlpZiAoa2V5ICE9IE5VTEwgJiYKKwkgICAgc2EtPnNhZGJfc2FfYXV0aCAhPSBTQURCX1hfQUFMR19OVUxMICYmCisJICAgICgoa2V5LT5zYWRiX2tleV9iaXRzKzcpIC8gOCA9PSAwIHx8CisJICAgICAoa2V5LT5zYWRiX2tleV9iaXRzKzcpIC8gOCA+IGtleS0+c2FkYl9rZXlfbGVuICogc2l6ZW9mKHVpbnQ2NF90KSkpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCWtleSA9IGV4dF9oZHJzW1NBREJfRVhUX0tFWV9FTkNSWVBULTFdOworCWlmIChrZXkgIT0gTlVMTCAmJgorCSAgICBzYS0+c2FkYl9zYV9lbmNyeXB0ICE9IFNBREJfRUFMR19OVUxMICYmCisJICAgICgoa2V5LT5zYWRiX2tleV9iaXRzKzcpIC8gOCA9PSAwIHx8CisJICAgICAoa2V5LT5zYWRiX2tleV9iaXRzKzcpIC8gOCA+IGtleS0+c2FkYl9rZXlfbGVuICogc2l6ZW9mKHVpbnQ2NF90KSkpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJeCA9IHhmcm1fc3RhdGVfYWxsb2MoKTsKKwlpZiAoeCA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PQlVGUyk7CisKKwl4LT5pZC5wcm90byA9IHByb3RvOworCXgtPmlkLnNwaSA9IHNhLT5zYWRiX3NhX3NwaTsKKwl4LT5wcm9wcy5yZXBsYXlfd2luZG93ID0gc2EtPnNhZGJfc2FfcmVwbGF5OworCWlmIChzYS0+c2FkYl9zYV9mbGFncyAmIFNBREJfU0FGTEFHU19OT0VDTikKKwkJeC0+cHJvcHMuZmxhZ3MgfD0gWEZSTV9TVEFURV9OT0VDTjsKKwlpZiAoc2EtPnNhZGJfc2FfZmxhZ3MgJiBTQURCX1NBRkxBR1NfREVDQVBfRFNDUCkKKwkJeC0+cHJvcHMuZmxhZ3MgfD0gWEZSTV9TVEFURV9ERUNBUF9EU0NQOworCisJbGlmZXRpbWUgPSAoc3RydWN0IHNhZGJfbGlmZXRpbWUqKSBleHRfaGRyc1tTQURCX0VYVF9MSUZFVElNRV9IQVJELTFdOworCWlmIChsaWZldGltZSAhPSBOVUxMKSB7CisJCXgtPmxmdC5oYXJkX3BhY2tldF9saW1pdCA9IF9LRVkyWChsaWZldGltZS0+c2FkYl9saWZldGltZV9hbGxvY2F0aW9ucyk7CisJCXgtPmxmdC5oYXJkX2J5dGVfbGltaXQgPSBfS0VZMlgobGlmZXRpbWUtPnNhZGJfbGlmZXRpbWVfYnl0ZXMpOworCQl4LT5sZnQuaGFyZF9hZGRfZXhwaXJlc19zZWNvbmRzID0gbGlmZXRpbWUtPnNhZGJfbGlmZXRpbWVfYWRkdGltZTsKKwkJeC0+bGZ0LmhhcmRfdXNlX2V4cGlyZXNfc2Vjb25kcyA9IGxpZmV0aW1lLT5zYWRiX2xpZmV0aW1lX3VzZXRpbWU7CisJfQorCWxpZmV0aW1lID0gKHN0cnVjdCBzYWRiX2xpZmV0aW1lKikgZXh0X2hkcnNbU0FEQl9FWFRfTElGRVRJTUVfU09GVC0xXTsKKwlpZiAobGlmZXRpbWUgIT0gTlVMTCkgeworCQl4LT5sZnQuc29mdF9wYWNrZXRfbGltaXQgPSBfS0VZMlgobGlmZXRpbWUtPnNhZGJfbGlmZXRpbWVfYWxsb2NhdGlvbnMpOworCQl4LT5sZnQuc29mdF9ieXRlX2xpbWl0ID0gX0tFWTJYKGxpZmV0aW1lLT5zYWRiX2xpZmV0aW1lX2J5dGVzKTsKKwkJeC0+bGZ0LnNvZnRfYWRkX2V4cGlyZXNfc2Vjb25kcyA9IGxpZmV0aW1lLT5zYWRiX2xpZmV0aW1lX2FkZHRpbWU7CisJCXgtPmxmdC5zb2Z0X3VzZV9leHBpcmVzX3NlY29uZHMgPSBsaWZldGltZS0+c2FkYl9saWZldGltZV91c2V0aW1lOworCX0KKwlrZXkgPSAoc3RydWN0IHNhZGJfa2V5KikgZXh0X2hkcnNbU0FEQl9FWFRfS0VZX0FVVEgtMV07CisJaWYgKHNhLT5zYWRiX3NhX2F1dGgpIHsKKwkJaW50IGtleXNpemUgPSAwOworCQlzdHJ1Y3QgeGZybV9hbGdvX2Rlc2MgKmEgPSB4ZnJtX2FhbGdfZ2V0X2J5aWQoc2EtPnNhZGJfc2FfYXV0aCk7CisJCWlmICghYSkgeworCQkJZXJyID0gLUVOT1NZUzsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChrZXkpCisJCQlrZXlzaXplID0gKGtleS0+c2FkYl9rZXlfYml0cyArIDcpIC8gODsKKwkJeC0+YWFsZyA9IGttYWxsb2Moc2l6ZW9mKCp4LT5hYWxnKSArIGtleXNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIXgtPmFhbGcpCisJCQlnb3RvIG91dDsKKwkJc3RyY3B5KHgtPmFhbGctPmFsZ19uYW1lLCBhLT5uYW1lKTsKKwkJeC0+YWFsZy0+YWxnX2tleV9sZW4gPSAwOworCQlpZiAoa2V5KSB7CisJCQl4LT5hYWxnLT5hbGdfa2V5X2xlbiA9IGtleS0+c2FkYl9rZXlfYml0czsKKwkJCW1lbWNweSh4LT5hYWxnLT5hbGdfa2V5LCBrZXkrMSwga2V5c2l6ZSk7CisJCX0KKwkJeC0+cHJvcHMuYWFsZ28gPSBzYS0+c2FkYl9zYV9hdXRoOworCQkvKiB4LT5hbGdvLmZsYWdzID0gc2EtPnNhZGJfc2FfZmxhZ3M7ICovCisJfQorCWlmIChzYS0+c2FkYl9zYV9lbmNyeXB0KSB7CisJCWlmIChoZHItPnNhZGJfbXNnX3NhdHlwZSA9PSBTQURCX1hfU0FUWVBFX0lQQ09NUCkgeworCQkJc3RydWN0IHhmcm1fYWxnb19kZXNjICphID0geGZybV9jYWxnX2dldF9ieWlkKHNhLT5zYWRiX3NhX2VuY3J5cHQpOworCQkJaWYgKCFhKSB7CisJCQkJZXJyID0gLUVOT1NZUzsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXgtPmNhbGcgPSBrbWFsbG9jKHNpemVvZigqeC0+Y2FsZyksIEdGUF9LRVJORUwpOworCQkJaWYgKCF4LT5jYWxnKQorCQkJCWdvdG8gb3V0OworCQkJc3RyY3B5KHgtPmNhbGctPmFsZ19uYW1lLCBhLT5uYW1lKTsKKwkJCXgtPnByb3BzLmNhbGdvID0gc2EtPnNhZGJfc2FfZW5jcnlwdDsKKwkJfSBlbHNlIHsKKwkJCWludCBrZXlzaXplID0gMDsKKwkJCXN0cnVjdCB4ZnJtX2FsZ29fZGVzYyAqYSA9IHhmcm1fZWFsZ19nZXRfYnlpZChzYS0+c2FkYl9zYV9lbmNyeXB0KTsKKwkJCWlmICghYSkgeworCQkJCWVyciA9IC1FTk9TWVM7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlrZXkgPSAoc3RydWN0IHNhZGJfa2V5KikgZXh0X2hkcnNbU0FEQl9FWFRfS0VZX0VOQ1JZUFQtMV07CisJCQlpZiAoa2V5KQorCQkJCWtleXNpemUgPSAoa2V5LT5zYWRiX2tleV9iaXRzICsgNykgLyA4OworCQkJeC0+ZWFsZyA9IGttYWxsb2Moc2l6ZW9mKCp4LT5lYWxnKSArIGtleXNpemUsIEdGUF9LRVJORUwpOworCQkJaWYgKCF4LT5lYWxnKQorCQkJCWdvdG8gb3V0OworCQkJc3RyY3B5KHgtPmVhbGctPmFsZ19uYW1lLCBhLT5uYW1lKTsKKwkJCXgtPmVhbGctPmFsZ19rZXlfbGVuID0gMDsKKwkJCWlmIChrZXkpIHsKKwkJCQl4LT5lYWxnLT5hbGdfa2V5X2xlbiA9IGtleS0+c2FkYl9rZXlfYml0czsKKwkJCQltZW1jcHkoeC0+ZWFsZy0+YWxnX2tleSwga2V5KzEsIGtleXNpemUpOworCQkJfQorCQkJeC0+cHJvcHMuZWFsZ28gPSBzYS0+c2FkYl9zYV9lbmNyeXB0OworCQl9CisJfQorCS8qIHgtPmFsZ28uZmxhZ3MgPSBzYS0+c2FkYl9zYV9mbGFnczsgKi8KKworCXgtPnByb3BzLmZhbWlseSA9IHBma2V5X3NhZGJfYWRkcjJ4ZnJtX2FkZHIoKHN0cnVjdCBzYWRiX2FkZHJlc3MgKikgZXh0X2hkcnNbU0FEQl9FWFRfQUREUkVTU19TUkMtMV0sIAorCQkJCQkJICAgICZ4LT5wcm9wcy5zYWRkcik7CisJaWYgKCF4LT5wcm9wcy5mYW1pbHkpIHsKKwkJZXJyID0gLUVBRk5PU1VQUE9SVDsKKwkJZ290byBvdXQ7CisJfQorCXBma2V5X3NhZGJfYWRkcjJ4ZnJtX2FkZHIoKHN0cnVjdCBzYWRiX2FkZHJlc3MgKikgZXh0X2hkcnNbU0FEQl9FWFRfQUREUkVTU19EU1QtMV0sIAorCQkJCSAgJngtPmlkLmRhZGRyKTsKKworCWlmIChleHRfaGRyc1tTQURCX1hfRVhUX1NBMi0xXSkgeworCQlzdHJ1Y3Qgc2FkYl94X3NhMiAqc2EyID0gKHZvaWQqKWV4dF9oZHJzW1NBREJfWF9FWFRfU0EyLTFdOworCQl4LT5wcm9wcy5tb2RlID0gc2EyLT5zYWRiX3hfc2EyX21vZGU7CisJCWlmICh4LT5wcm9wcy5tb2RlKQorCQkJeC0+cHJvcHMubW9kZS0tOworCQl4LT5wcm9wcy5yZXFpZCA9IHNhMi0+c2FkYl94X3NhMl9yZXFpZDsKKwl9CisKKwlpZiAoZXh0X2hkcnNbU0FEQl9FWFRfQUREUkVTU19QUk9YWS0xXSkgeworCQlzdHJ1Y3Qgc2FkYl9hZGRyZXNzICphZGRyID0gZXh0X2hkcnNbU0FEQl9FWFRfQUREUkVTU19QUk9YWS0xXTsKKworCQkvKiBOb2JvZHkgdXNlcyB0aGlzLCBidXQgd2UgdHJ5LiAqLworCQl4LT5zZWwuZmFtaWx5ID0gcGZrZXlfc2FkYl9hZGRyMnhmcm1fYWRkcihhZGRyLCAmeC0+c2VsLnNhZGRyKTsKKwkJeC0+c2VsLnByZWZpeGxlbl9zID0gYWRkci0+c2FkYl9hZGRyZXNzX3ByZWZpeGxlbjsKKwl9CisKKwlpZiAoZXh0X2hkcnNbU0FEQl9YX0VYVF9OQVRfVF9UWVBFLTFdKSB7CisJCXN0cnVjdCBzYWRiX3hfbmF0X3RfdHlwZSogbl90eXBlOworCQlzdHJ1Y3QgeGZybV9lbmNhcF90bXBsICpuYXR0OworCisJCXgtPmVuY2FwID0ga21hbGxvYyhzaXplb2YoKngtPmVuY2FwKSwgR0ZQX0tFUk5FTCk7CisJCWlmICgheC0+ZW5jYXApCisJCQlnb3RvIG91dDsKKworCQluYXR0ID0geC0+ZW5jYXA7CisJCW5fdHlwZSA9IGV4dF9oZHJzW1NBREJfWF9FWFRfTkFUX1RfVFlQRS0xXTsKKwkJbmF0dC0+ZW5jYXBfdHlwZSA9IG5fdHlwZS0+c2FkYl94X25hdF90X3R5cGVfdHlwZTsKKworCQlpZiAoZXh0X2hkcnNbU0FEQl9YX0VYVF9OQVRfVF9TUE9SVC0xXSkgeworCQkJc3RydWN0IHNhZGJfeF9uYXRfdF9wb3J0KiBuX3BvcnQgPQorCQkJCWV4dF9oZHJzW1NBREJfWF9FWFRfTkFUX1RfU1BPUlQtMV07CisJCQluYXR0LT5lbmNhcF9zcG9ydCA9IG5fcG9ydC0+c2FkYl94X25hdF90X3BvcnRfcG9ydDsKKwkJfQorCQlpZiAoZXh0X2hkcnNbU0FEQl9YX0VYVF9OQVRfVF9EUE9SVC0xXSkgeworCQkJc3RydWN0IHNhZGJfeF9uYXRfdF9wb3J0KiBuX3BvcnQgPQorCQkJCWV4dF9oZHJzW1NBREJfWF9FWFRfTkFUX1RfRFBPUlQtMV07CisJCQluYXR0LT5lbmNhcF9kcG9ydCA9IG5fcG9ydC0+c2FkYl94X25hdF90X3BvcnRfcG9ydDsKKwkJfQorCX0KKworCXgtPnR5cGUgPSB4ZnJtX2dldF90eXBlKHByb3RvLCB4LT5wcm9wcy5mYW1pbHkpOworCWlmICh4LT50eXBlID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT1BST1RPT1BUOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHgtPnR5cGUtPmluaXRfc3RhdGUoeCwgTlVMTCkpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCXgtPmttLnNlcSA9IGhkci0+c2FkYl9tc2dfc2VxOworCXgtPmttLnN0YXRlID0gWEZSTV9TVEFURV9WQUxJRDsKKwlyZXR1cm4geDsKKworb3V0OgorCXgtPmttLnN0YXRlID0gWEZSTV9TVEFURV9ERUFEOworCXhmcm1fc3RhdGVfcHV0KHgpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKK3N0YXRpYyBpbnQgcGZrZXlfcmVzZXJ2ZWQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc2FkYl9tc2cgKmhkciwgdm9pZCAqKmV4dF9oZHJzKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGludCBwZmtleV9nZXRzcGkoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc2FkYl9tc2cgKmhkciwgdm9pZCAqKmV4dF9oZHJzKQoreworCXN0cnVjdCBza19idWZmICpyZXNwX3NrYjsKKwlzdHJ1Y3Qgc2FkYl94X3NhMiAqc2EyOworCXN0cnVjdCBzYWRiX2FkZHJlc3MgKnNhZGRyLCAqZGFkZHI7CisJc3RydWN0IHNhZGJfbXNnICpvdXRfaGRyOworCXN0cnVjdCB4ZnJtX3N0YXRlICp4ID0gTlVMTDsKKwl1OCBtb2RlOworCXUzMiByZXFpZDsKKwl1OCBwcm90bzsKKwl1bnNpZ25lZCBzaG9ydCBmYW1pbHk7CisJeGZybV9hZGRyZXNzX3QgKnhzYWRkciA9IE5VTEwsICp4ZGFkZHIgPSBOVUxMOworCisJaWYgKCFwcmVzZW50X2FuZF9zYW1lX2ZhbWlseShleHRfaGRyc1tTQURCX0VYVF9BRERSRVNTX1NSQy0xXSwKKwkJCQkgICAgIGV4dF9oZHJzW1NBREJfRVhUX0FERFJFU1NfRFNULTFdKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwcm90byA9IHBma2V5X3NhdHlwZTJwcm90byhoZHItPnNhZGJfbXNnX3NhdHlwZSk7CisJaWYgKHByb3RvID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChzYTIgPSBleHRfaGRyc1tTQURCX1hfRVhUX1NBMi0xXSkgIT0gTlVMTCkgeworCQltb2RlID0gc2EyLT5zYWRiX3hfc2EyX21vZGUgLSAxOworCQlyZXFpZCA9IHNhMi0+c2FkYl94X3NhMl9yZXFpZDsKKwl9IGVsc2UgeworCQltb2RlID0gMDsKKwkJcmVxaWQgPSAwOworCX0KKworCXNhZGRyID0gZXh0X2hkcnNbU0FEQl9FWFRfQUREUkVTU19TUkMtMV07CisJZGFkZHIgPSBleHRfaGRyc1tTQURCX0VYVF9BRERSRVNTX0RTVC0xXTsKKworCWZhbWlseSA9ICgoc3RydWN0IHNvY2thZGRyICopKHNhZGRyICsgMSkpLT5zYV9mYW1pbHk7CisJc3dpdGNoIChmYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCXhkYWRkciA9ICh4ZnJtX2FkZHJlc3NfdCAqKSYoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKShkYWRkciArIDEpKS0+c2luX2FkZHIuc19hZGRyOworCQl4c2FkZHIgPSAoeGZybV9hZGRyZXNzX3QgKikmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikoc2FkZHIgKyAxKSktPnNpbl9hZGRyLnNfYWRkcjsKKwkJYnJlYWs7CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJY2FzZSBBRl9JTkVUNjoKKwkJeGRhZGRyID0gKHhmcm1fYWRkcmVzc190ICopJigoc3RydWN0IHNvY2thZGRyX2luNiAqKShkYWRkciArIDEpKS0+c2luNl9hZGRyOworCQl4c2FkZHIgPSAoeGZybV9hZGRyZXNzX3QgKikmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopKHNhZGRyICsgMSkpLT5zaW42X2FkZHI7CisJCWJyZWFrOworI2VuZGlmCisJfQorCisJaWYgKGhkci0+c2FkYl9tc2dfc2VxKSB7CisJCXggPSB4ZnJtX2ZpbmRfYWNxX2J5c2VxKGhkci0+c2FkYl9tc2dfc2VxKTsKKwkJaWYgKHggJiYgeGZybV9hZGRyX2NtcCgmeC0+aWQuZGFkZHIsIHhkYWRkciwgZmFtaWx5KSkgeworCQkJeGZybV9zdGF0ZV9wdXQoeCk7CisJCQl4ID0gTlVMTDsKKwkJfQorCX0KKworCWlmICgheCkKKwkJeCA9IHhmcm1fZmluZF9hY3EobW9kZSwgcmVxaWQsIHByb3RvLCB4ZGFkZHIsIHhzYWRkciwgMSwgZmFtaWx5KTsKKworCWlmICh4ID09IE5VTEwpCisJCXJldHVybiAtRU5PRU5UOworCisJcmVzcF9za2IgPSBFUlJfUFRSKC1FTk9FTlQpOworCisJc3Bpbl9sb2NrX2JoKCZ4LT5sb2NrKTsKKwlpZiAoeC0+a20uc3RhdGUgIT0gWEZSTV9TVEFURV9ERUFEKSB7CisJCXN0cnVjdCBzYWRiX3NwaXJhbmdlICpyYW5nZSA9IGV4dF9oZHJzW1NBREJfRVhUX1NQSVJBTkdFLTFdOworCQl1MzIgbWluX3NwaSwgbWF4X3NwaTsKKworCQlpZiAocmFuZ2UgIT0gTlVMTCkgeworCQkJbWluX3NwaSA9IHJhbmdlLT5zYWRiX3NwaXJhbmdlX21pbjsKKwkJCW1heF9zcGkgPSByYW5nZS0+c2FkYl9zcGlyYW5nZV9tYXg7CisJCX0gZWxzZSB7CisJCQltaW5fc3BpID0gMHgxMDA7CisJCQltYXhfc3BpID0gMHgwZmZmZmZmZjsKKwkJfQorCQl4ZnJtX2FsbG9jX3NwaSh4LCBodG9ubChtaW5fc3BpKSwgaHRvbmwobWF4X3NwaSkpOworCQlpZiAoeC0+aWQuc3BpKQorCQkJcmVzcF9za2IgPSBwZmtleV94ZnJtX3N0YXRlMm1zZyh4LCAwLCAzKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJngtPmxvY2spOworCisJaWYgKElTX0VSUihyZXNwX3NrYikpIHsKKwkJeGZybV9zdGF0ZV9wdXQoeCk7CisJCXJldHVybiAgUFRSX0VSUihyZXNwX3NrYik7CisJfQorCisJb3V0X2hkciA9IChzdHJ1Y3Qgc2FkYl9tc2cgKikgcmVzcF9za2ItPmRhdGE7CisJb3V0X2hkci0+c2FkYl9tc2dfdmVyc2lvbiA9IGhkci0+c2FkYl9tc2dfdmVyc2lvbjsKKwlvdXRfaGRyLT5zYWRiX21zZ190eXBlID0gU0FEQl9HRVRTUEk7CisJb3V0X2hkci0+c2FkYl9tc2dfc2F0eXBlID0gcGZrZXlfcHJvdG8yc2F0eXBlKHByb3RvKTsKKwlvdXRfaGRyLT5zYWRiX21zZ19lcnJubyA9IDA7CisJb3V0X2hkci0+c2FkYl9tc2dfcmVzZXJ2ZWQgPSAwOworCW91dF9oZHItPnNhZGJfbXNnX3NlcSA9IGhkci0+c2FkYl9tc2dfc2VxOworCW91dF9oZHItPnNhZGJfbXNnX3BpZCA9IGhkci0+c2FkYl9tc2dfcGlkOworCisJeGZybV9zdGF0ZV9wdXQoeCk7CisKKwlwZmtleV9icm9hZGNhc3QocmVzcF9za2IsIEdGUF9LRVJORUwsIEJST0FEQ0FTVF9PTkUsIHNrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBma2V5X2FjcXVpcmUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc2FkYl9tc2cgKmhkciwgdm9pZCAqKmV4dF9oZHJzKQoreworCXN0cnVjdCB4ZnJtX3N0YXRlICp4OworCisJaWYgKGhkci0+c2FkYl9tc2dfbGVuICE9IHNpemVvZihzdHJ1Y3Qgc2FkYl9tc2cpLzgpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChoZHItPnNhZGJfbXNnX3NlcSA9PSAwIHx8IGhkci0+c2FkYl9tc2dfZXJybm8gPT0gMCkKKwkJcmV0dXJuIDA7CisKKwl4ID0geGZybV9maW5kX2FjcV9ieXNlcShoZHItPnNhZGJfbXNnX3NlcSk7CisJaWYgKHggPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfYmgoJngtPmxvY2spOworCWlmICh4LT5rbS5zdGF0ZSA9PSBYRlJNX1NUQVRFX0FDUSkgeworCQl4LT5rbS5zdGF0ZSA9IFhGUk1fU1RBVEVfRVJST1I7CisJCXdha2VfdXAoJmttX3dhaXRxKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJngtPmxvY2spOworCXhmcm1fc3RhdGVfcHV0KHgpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcGZrZXlfYWRkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNhZGJfbXNnICpoZHIsIHZvaWQgKipleHRfaGRycykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqb3V0X3NrYjsKKwlzdHJ1Y3Qgc2FkYl9tc2cgKm91dF9oZHI7CisJc3RydWN0IHhmcm1fc3RhdGUgKng7CisJaW50IGVycjsKKworCXhmcm1fcHJvYmVfYWxncygpOworCQorCXggPSBwZmtleV9tc2cyeGZybV9zdGF0ZShoZHIsIGV4dF9oZHJzKTsKKwlpZiAoSVNfRVJSKHgpKQorCQlyZXR1cm4gUFRSX0VSUih4KTsKKworCWlmIChoZHItPnNhZGJfbXNnX3R5cGUgPT0gU0FEQl9BREQpCisJCWVyciA9IHhmcm1fc3RhdGVfYWRkKHgpOworCWVsc2UKKwkJZXJyID0geGZybV9zdGF0ZV91cGRhdGUoeCk7CisKKwlpZiAoZXJyIDwgMCkgeworCQl4LT5rbS5zdGF0ZSA9IFhGUk1fU1RBVEVfREVBRDsKKwkJeGZybV9zdGF0ZV9wdXQoeCk7CisJCXJldHVybiBlcnI7CisJfQorCisJb3V0X3NrYiA9IHBma2V5X3hmcm1fc3RhdGUybXNnKHgsIDAsIDMpOworCWlmIChJU19FUlIob3V0X3NrYikpCisJCXJldHVybiAgUFRSX0VSUihvdXRfc2tiKTsgLyogWFhYIFNob3VsZCB3ZSByZXR1cm4gMCBoZXJlID8gKi8KKworCW91dF9oZHIgPSAoc3RydWN0IHNhZGJfbXNnICopIG91dF9za2ItPmRhdGE7CisJb3V0X2hkci0+c2FkYl9tc2dfdmVyc2lvbiA9IGhkci0+c2FkYl9tc2dfdmVyc2lvbjsKKwlvdXRfaGRyLT5zYWRiX21zZ190eXBlID0gaGRyLT5zYWRiX21zZ190eXBlOworCW91dF9oZHItPnNhZGJfbXNnX3NhdHlwZSA9IHBma2V5X3Byb3RvMnNhdHlwZSh4LT5pZC5wcm90byk7CisJb3V0X2hkci0+c2FkYl9tc2dfZXJybm8gPSAwOworCW91dF9oZHItPnNhZGJfbXNnX3Jlc2VydmVkID0gMDsKKwlvdXRfaGRyLT5zYWRiX21zZ19zZXEgPSBoZHItPnNhZGJfbXNnX3NlcTsKKwlvdXRfaGRyLT5zYWRiX21zZ19waWQgPSBoZHItPnNhZGJfbXNnX3BpZDsKKworCXBma2V5X2Jyb2FkY2FzdChvdXRfc2tiLCBHRlBfQVRPTUlDLCBCUk9BRENBU1RfQUxMLCBzayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwZmtleV9kZWxldGUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc2FkYl9tc2cgKmhkciwgdm9pZCAqKmV4dF9oZHJzKQoreworCXN0cnVjdCB4ZnJtX3N0YXRlICp4OworCisJaWYgKCFleHRfaGRyc1tTQURCX0VYVF9TQS0xXSB8fAorCSAgICAhcHJlc2VudF9hbmRfc2FtZV9mYW1pbHkoZXh0X2hkcnNbU0FEQl9FWFRfQUREUkVTU19TUkMtMV0sCisJCQkJICAgICBleHRfaGRyc1tTQURCX0VYVF9BRERSRVNTX0RTVC0xXSkpCisJCXJldHVybiAtRUlOVkFMOworCisJeCA9IHBma2V5X3hmcm1fc3RhdGVfbG9va3VwKGhkciwgZXh0X2hkcnMpOworCWlmICh4ID09IE5VTEwpCisJCXJldHVybiAtRVNSQ0g7CisKKwlpZiAoeGZybV9zdGF0ZV9rZXJuKHgpKSB7CisJCXhmcm1fc3RhdGVfcHV0KHgpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKwkKKwl4ZnJtX3N0YXRlX2RlbGV0ZSh4KTsKKwl4ZnJtX3N0YXRlX3B1dCh4KTsKKworCXBma2V5X2Jyb2FkY2FzdChza2JfY2xvbmUoc2tiLCBHRlBfS0VSTkVMKSwgR0ZQX0tFUk5FTCwgCisJCQlCUk9BRENBU1RfQUxMLCBzayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwZmtleV9nZXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc2FkYl9tc2cgKmhkciwgdm9pZCAqKmV4dF9oZHJzKQoreworCV9fdTggcHJvdG87CisJc3RydWN0IHNrX2J1ZmYgKm91dF9za2I7CisJc3RydWN0IHNhZGJfbXNnICpvdXRfaGRyOworCXN0cnVjdCB4ZnJtX3N0YXRlICp4OworCisJaWYgKCFleHRfaGRyc1tTQURCX0VYVF9TQS0xXSB8fAorCSAgICAhcHJlc2VudF9hbmRfc2FtZV9mYW1pbHkoZXh0X2hkcnNbU0FEQl9FWFRfQUREUkVTU19TUkMtMV0sCisJCQkJICAgICBleHRfaGRyc1tTQURCX0VYVF9BRERSRVNTX0RTVC0xXSkpCisJCXJldHVybiAtRUlOVkFMOworCisJeCA9IHBma2V5X3hmcm1fc3RhdGVfbG9va3VwKGhkciwgZXh0X2hkcnMpOworCWlmICh4ID09IE5VTEwpCisJCXJldHVybiAtRVNSQ0g7CisKKwlvdXRfc2tiID0gcGZrZXlfeGZybV9zdGF0ZTJtc2coeCwgMSwgMyk7CisJcHJvdG8gPSB4LT5pZC5wcm90bzsKKwl4ZnJtX3N0YXRlX3B1dCh4KTsKKwlpZiAoSVNfRVJSKG91dF9za2IpKQorCQlyZXR1cm4gIFBUUl9FUlIob3V0X3NrYik7CisKKwlvdXRfaGRyID0gKHN0cnVjdCBzYWRiX21zZyAqKSBvdXRfc2tiLT5kYXRhOworCW91dF9oZHItPnNhZGJfbXNnX3ZlcnNpb24gPSBoZHItPnNhZGJfbXNnX3ZlcnNpb247CisJb3V0X2hkci0+c2FkYl9tc2dfdHlwZSA9IFNBREJfRFVNUDsKKwlvdXRfaGRyLT5zYWRiX21zZ19zYXR5cGUgPSBwZmtleV9wcm90bzJzYXR5cGUocHJvdG8pOworCW91dF9oZHItPnNhZGJfbXNnX2Vycm5vID0gMDsKKwlvdXRfaGRyLT5zYWRiX21zZ19yZXNlcnZlZCA9IDA7CisJb3V0X2hkci0+c2FkYl9tc2dfc2VxID0gaGRyLT5zYWRiX21zZ19zZXE7CisJb3V0X2hkci0+c2FkYl9tc2dfcGlkID0gaGRyLT5zYWRiX21zZ19waWQ7CisJcGZrZXlfYnJvYWRjYXN0KG91dF9za2IsIEdGUF9BVE9NSUMsIEJST0FEQ0FTVF9PTkUsIHNrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmNvbXBvc2Vfc2FkYl9zdXBwb3J0ZWQoc3RydWN0IHNhZGJfbXNnICpvcmlnLCBpbnQgYWxsb2NhdGlvbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBzYWRiX21zZyAqaGRyOworCWludCBsZW4sIGF1dGhfbGVuLCBlbmNfbGVuLCBpOworCisJYXV0aF9sZW4gPSB4ZnJtX2NvdW50X2F1dGhfc3VwcG9ydGVkKCk7CisJaWYgKGF1dGhfbGVuKSB7CisJCWF1dGhfbGVuICo9IHNpemVvZihzdHJ1Y3Qgc2FkYl9hbGcpOworCQlhdXRoX2xlbiArPSBzaXplb2Yoc3RydWN0IHNhZGJfc3VwcG9ydGVkKTsKKwl9CisJCisJZW5jX2xlbiA9IHhmcm1fY291bnRfZW5jX3N1cHBvcnRlZCgpOworCWlmIChlbmNfbGVuKSB7CisJCWVuY19sZW4gKj0gc2l6ZW9mKHN0cnVjdCBzYWRiX2FsZyk7CisJCWVuY19sZW4gKz0gc2l6ZW9mKHN0cnVjdCBzYWRiX3N1cHBvcnRlZCk7CisJfQorCQorCWxlbiA9IGVuY19sZW4gKyBhdXRoX2xlbiArIHNpemVvZihzdHJ1Y3Qgc2FkYl9tc2cpOworCisJc2tiID0gYWxsb2Nfc2tiKGxlbiArIDE2LCBhbGxvY2F0aW9uKTsKKwlpZiAoIXNrYikKKwkJZ290byBvdXRfcHV0X2FsZ3M7CisKKwloZHIgPSAoc3RydWN0IHNhZGJfbXNnICopIHNrYl9wdXQoc2tiLCBzaXplb2YoKmhkcikpOworCXBma2V5X2hkcl9kdXAoaGRyLCBvcmlnKTsKKwloZHItPnNhZGJfbXNnX2Vycm5vID0gMDsKKwloZHItPnNhZGJfbXNnX2xlbiA9IGxlbiAvIHNpemVvZih1aW50NjRfdCk7CisKKwlpZiAoYXV0aF9sZW4pIHsKKwkJc3RydWN0IHNhZGJfc3VwcG9ydGVkICpzcDsKKwkJc3RydWN0IHNhZGJfYWxnICphcDsKKworCQlzcCA9IChzdHJ1Y3Qgc2FkYl9zdXBwb3J0ZWQgKikgc2tiX3B1dChza2IsIGF1dGhfbGVuKTsKKwkJYXAgPSAoc3RydWN0IHNhZGJfYWxnICopIChzcCArIDEpOworCisJCXNwLT5zYWRiX3N1cHBvcnRlZF9sZW4gPSBhdXRoX2xlbiAvIHNpemVvZih1aW50NjRfdCk7CisJCXNwLT5zYWRiX3N1cHBvcnRlZF9leHR0eXBlID0gU0FEQl9FWFRfU1VQUE9SVEVEX0FVVEg7CisKKwkJZm9yIChpID0gMDsgOyBpKyspIHsKKwkJCXN0cnVjdCB4ZnJtX2FsZ29fZGVzYyAqYWFsZyA9IHhmcm1fYWFsZ19nZXRfYnlpZHgoaSk7CisJCQlpZiAoIWFhbGcpCisJCQkJYnJlYWs7CisJCQlpZiAoYWFsZy0+YXZhaWxhYmxlKQorCQkJCSphcCsrID0gYWFsZy0+ZGVzYzsKKwkJfQorCX0KKworCWlmIChlbmNfbGVuKSB7CisJCXN0cnVjdCBzYWRiX3N1cHBvcnRlZCAqc3A7CisJCXN0cnVjdCBzYWRiX2FsZyAqYXA7CisKKwkJc3AgPSAoc3RydWN0IHNhZGJfc3VwcG9ydGVkICopIHNrYl9wdXQoc2tiLCBlbmNfbGVuKTsKKwkJYXAgPSAoc3RydWN0IHNhZGJfYWxnICopIChzcCArIDEpOworCisJCXNwLT5zYWRiX3N1cHBvcnRlZF9sZW4gPSBlbmNfbGVuIC8gc2l6ZW9mKHVpbnQ2NF90KTsKKwkJc3AtPnNhZGJfc3VwcG9ydGVkX2V4dHR5cGUgPSBTQURCX0VYVF9TVVBQT1JURURfRU5DUllQVDsKKworCQlmb3IgKGkgPSAwOyA7IGkrKykgeworCQkJc3RydWN0IHhmcm1fYWxnb19kZXNjICplYWxnID0geGZybV9lYWxnX2dldF9ieWlkeChpKTsKKwkJCWlmICghZWFsZykKKwkJCQlicmVhazsKKwkJCWlmIChlYWxnLT5hdmFpbGFibGUpCisJCQkJKmFwKysgPSBlYWxnLT5kZXNjOworCQl9CisJfQorCitvdXRfcHV0X2FsZ3M6CisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIGludCBwZmtleV9yZWdpc3RlcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzYWRiX21zZyAqaGRyLCB2b2lkICoqZXh0X2hkcnMpCit7CisJc3RydWN0IHBma2V5X3NvY2sgKnBmayA9IHBma2V5X3NrKHNrKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc3VwcF9za2I7CisKKwlpZiAoaGRyLT5zYWRiX21zZ19zYXR5cGUgPiBTQURCX1NBVFlQRV9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGhkci0+c2FkYl9tc2dfc2F0eXBlICE9IFNBREJfU0FUWVBFX1VOU1BFQykgeworCQlpZiAocGZrLT5yZWdpc3RlcmVkJigxPDxoZHItPnNhZGJfbXNnX3NhdHlwZSkpCisJCQlyZXR1cm4gLUVFWElTVDsKKwkJcGZrLT5yZWdpc3RlcmVkIHw9ICgxPDxoZHItPnNhZGJfbXNnX3NhdHlwZSk7CisJfQorCisJeGZybV9wcm9iZV9hbGdzKCk7CisJCisJc3VwcF9za2IgPSBjb21wb3NlX3NhZGJfc3VwcG9ydGVkKGhkciwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdXBwX3NrYikgeworCQlpZiAoaGRyLT5zYWRiX21zZ19zYXR5cGUgIT0gU0FEQl9TQVRZUEVfVU5TUEVDKQorCQkJcGZrLT5yZWdpc3RlcmVkICY9IH4oMTw8aGRyLT5zYWRiX21zZ19zYXR5cGUpOworCisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisKKwlwZmtleV9icm9hZGNhc3Qoc3VwcF9za2IsIEdGUF9LRVJORUwsIEJST0FEQ0FTVF9SRUdJU1RFUkVELCBzayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwZmtleV9mbHVzaChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzYWRiX21zZyAqaGRyLCB2b2lkICoqZXh0X2hkcnMpCit7CisJdW5zaWduZWQgcHJvdG87CisJc3RydWN0IHNrX2J1ZmYgKnNrYl9vdXQ7CisJc3RydWN0IHNhZGJfbXNnICpoZHJfb3V0OworCisJcHJvdG8gPSBwZmtleV9zYXR5cGUycHJvdG8oaGRyLT5zYWRiX21zZ19zYXR5cGUpOworCWlmIChwcm90byA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNrYl9vdXQgPSBhbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBzYWRiX21zZykgKyAxNiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFza2Jfb3V0KQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwl4ZnJtX3N0YXRlX2ZsdXNoKHByb3RvKTsKKworCWhkcl9vdXQgPSAoc3RydWN0IHNhZGJfbXNnICopIHNrYl9wdXQoc2tiX291dCwgc2l6ZW9mKHN0cnVjdCBzYWRiX21zZykpOworCXBma2V5X2hkcl9kdXAoaGRyX291dCwgaGRyKTsKKwloZHJfb3V0LT5zYWRiX21zZ19lcnJubyA9ICh1aW50OF90KSAwOworCWhkcl9vdXQtPnNhZGJfbXNnX2xlbiA9IChzaXplb2Yoc3RydWN0IHNhZGJfbXNnKSAvIHNpemVvZih1aW50NjRfdCkpOworCisJcGZrZXlfYnJvYWRjYXN0KHNrYl9vdXQsIEdGUF9LRVJORUwsIEJST0FEQ0FTVF9BTEwsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwZmtleV9kdW1wX2RhdGEKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBzYWRiX21zZyAqaGRyOworCXN0cnVjdCBzb2NrICpzazsKK307CisKK3N0YXRpYyBpbnQgZHVtcF9zYShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgaW50IGNvdW50LCB2b2lkICpwdHIpCit7CisJc3RydWN0IHBma2V5X2R1bXBfZGF0YSAqZGF0YSA9IHB0cjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqb3V0X3NrYjsKKwlzdHJ1Y3Qgc2FkYl9tc2cgKm91dF9oZHI7CisKKwlvdXRfc2tiID0gcGZrZXlfeGZybV9zdGF0ZTJtc2coeCwgMSwgMyk7CisJaWYgKElTX0VSUihvdXRfc2tiKSkKKwkJcmV0dXJuIFBUUl9FUlIob3V0X3NrYik7CisKKwlvdXRfaGRyID0gKHN0cnVjdCBzYWRiX21zZyAqKSBvdXRfc2tiLT5kYXRhOworCW91dF9oZHItPnNhZGJfbXNnX3ZlcnNpb24gPSBkYXRhLT5oZHItPnNhZGJfbXNnX3ZlcnNpb247CisJb3V0X2hkci0+c2FkYl9tc2dfdHlwZSA9IFNBREJfRFVNUDsKKwlvdXRfaGRyLT5zYWRiX21zZ19zYXR5cGUgPSBwZmtleV9wcm90bzJzYXR5cGUoeC0+aWQucHJvdG8pOworCW91dF9oZHItPnNhZGJfbXNnX2Vycm5vID0gMDsKKwlvdXRfaGRyLT5zYWRiX21zZ19yZXNlcnZlZCA9IDA7CisJb3V0X2hkci0+c2FkYl9tc2dfc2VxID0gY291bnQ7CisJb3V0X2hkci0+c2FkYl9tc2dfcGlkID0gZGF0YS0+aGRyLT5zYWRiX21zZ19waWQ7CisJcGZrZXlfYnJvYWRjYXN0KG91dF9za2IsIEdGUF9BVE9NSUMsIEJST0FEQ0FTVF9PTkUsIGRhdGEtPnNrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwZmtleV9kdW1wKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNhZGJfbXNnICpoZHIsIHZvaWQgKipleHRfaGRycykKK3sKKwl1OCBwcm90bzsKKwlzdHJ1Y3QgcGZrZXlfZHVtcF9kYXRhIGRhdGEgPSB7IC5za2IgPSBza2IsIC5oZHIgPSBoZHIsIC5zayA9IHNrIH07CisKKwlwcm90byA9IHBma2V5X3NhdHlwZTJwcm90byhoZHItPnNhZGJfbXNnX3NhdHlwZSk7CisJaWYgKHByb3RvID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHhmcm1fc3RhdGVfd2Fsayhwcm90bywgZHVtcF9zYSwgJmRhdGEpOworfQorCitzdGF0aWMgaW50IHBma2V5X3Byb21pc2Moc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc2FkYl9tc2cgKmhkciwgdm9pZCAqKmV4dF9oZHJzKQoreworCXN0cnVjdCBwZmtleV9zb2NrICpwZmsgPSBwZmtleV9zayhzayk7CisJaW50IHNhdHlwZSA9IGhkci0+c2FkYl9tc2dfc2F0eXBlOworCisJaWYgKGhkci0+c2FkYl9tc2dfbGVuID09IChzaXplb2YoKmhkcikgLyBzaXplb2YodWludDY0X3QpKSkgeworCQkvKiBYWFggd2UgbWFuZ2xlIHBhY2tldC4uLiAqLworCQloZHItPnNhZGJfbXNnX2Vycm5vID0gMDsKKwkJaWYgKHNhdHlwZSAhPSAwICYmIHNhdHlwZSAhPSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXBmay0+cHJvbWlzYyA9IHNhdHlwZTsKKwl9CisJcGZrZXlfYnJvYWRjYXN0KHNrYl9jbG9uZShza2IsIEdGUF9LRVJORUwpLCBHRlBfS0VSTkVMLCBCUk9BRENBU1RfQUxMLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGVja19yZXFpZChzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLCBpbnQgZGlyLCBpbnQgY291bnQsIHZvaWQgKnB0cikKK3sKKwlpbnQgaTsKKwl1MzIgcmVxaWQgPSAqKHUzMiopcHRyOworCisJZm9yIChpPTA7IGk8eHAtPnhmcm1fbnI7IGkrKykgeworCQlpZiAoeHAtPnhmcm1fdmVjW2ldLnJlcWlkID09IHJlcWlkKQorCQkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIGdlbl9yZXFpZCh2b2lkKQoreworCXUzMiBzdGFydDsKKwlzdGF0aWMgdTMyIHJlcWlkID0gSVBTRUNfTUFOVUFMX1JFUUlEX01BWDsKKworCXN0YXJ0ID0gcmVxaWQ7CisJZG8geworCQkrK3JlcWlkOworCQlpZiAocmVxaWQgPT0gMCkKKwkJCXJlcWlkID0gSVBTRUNfTUFOVUFMX1JFUUlEX01BWCsxOworCQlpZiAoeGZybV9wb2xpY3lfd2FsayhjaGVja19yZXFpZCwgKHZvaWQqKSZyZXFpZCkgIT0gLUVFWElTVCkKKwkJCXJldHVybiByZXFpZDsKKwl9IHdoaWxlIChyZXFpZCAhPSBzdGFydCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3BhcnNlX2lwc2VjcmVxdWVzdChzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLCBzdHJ1Y3Qgc2FkYl94X2lwc2VjcmVxdWVzdCAqcnEpCit7CisJc3RydWN0IHhmcm1fdG1wbCAqdCA9IHhwLT54ZnJtX3ZlYyArIHhwLT54ZnJtX25yOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luOworI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjY7CisjZW5kaWYKKworCWlmICh4cC0+eGZybV9uciA+PSBYRlJNX01BWF9ERVBUSCkKKwkJcmV0dXJuIC1FTE9PUDsKKworCWlmIChycS0+c2FkYl94X2lwc2VjcmVxdWVzdF9tb2RlID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJdC0+aWQucHJvdG8gPSBycS0+c2FkYl94X2lwc2VjcmVxdWVzdF9wcm90bzsgLyogWFhYIGNoZWNrIHByb3RvICovCisJdC0+bW9kZSA9IHJxLT5zYWRiX3hfaXBzZWNyZXF1ZXN0X21vZGUtMTsKKwlpZiAocnEtPnNhZGJfeF9pcHNlY3JlcXVlc3RfbGV2ZWwgPT0gSVBTRUNfTEVWRUxfVVNFKQorCQl0LT5vcHRpb25hbCA9IDE7CisJZWxzZSBpZiAocnEtPnNhZGJfeF9pcHNlY3JlcXVlc3RfbGV2ZWwgPT0gSVBTRUNfTEVWRUxfVU5JUVVFKSB7CisJCXQtPnJlcWlkID0gcnEtPnNhZGJfeF9pcHNlY3JlcXVlc3RfcmVxaWQ7CisJCWlmICh0LT5yZXFpZCA+IElQU0VDX01BTlVBTF9SRVFJRF9NQVgpCisJCQl0LT5yZXFpZCA9IDA7CisJCWlmICghdC0+cmVxaWQgJiYgISh0LT5yZXFpZCA9IGdlbl9yZXFpZCgpKSkKKwkJCXJldHVybiAtRU5PQlVGUzsKKwl9CisKKwkvKiBhZGRyZXNzZXMgcHJlc2VudCBvbmx5IGluIHR1bm5lbCBtb2RlICovCisJaWYgKHQtPm1vZGUpIHsKKwkJc3dpdGNoICh4cC0+ZmFtaWx5KSB7CisJCWNhc2UgQUZfSU5FVDoKKwkJCXNpbiA9ICh2b2lkKikocnErMSk7CisJCQlpZiAoc2luLT5zaW5fZmFtaWx5ICE9IEFGX0lORVQpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl0LT5zYWRkci5hNCA9IHNpbi0+c2luX2FkZHIuc19hZGRyOworCQkJc2luKys7CisJCQlpZiAoc2luLT5zaW5fZmFtaWx5ICE9IEFGX0lORVQpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl0LT5pZC5kYWRkci5hNCA9IHNpbi0+c2luX2FkZHIuc19hZGRyOworCQkJYnJlYWs7CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJCWNhc2UgQUZfSU5FVDY6CisJCQlzaW42ID0gKHZvaWQgKikocnErMSk7CisJCQlpZiAoc2luNi0+c2luNl9mYW1pbHkgIT0gQUZfSU5FVDYpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQltZW1jcHkodC0+c2FkZHIuYTYsICZzaW42LT5zaW42X2FkZHIsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJCXNpbjYrKzsKKwkJCWlmIChzaW42LT5zaW42X2ZhbWlseSAhPSBBRl9JTkVUNikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCW1lbWNweSh0LT5pZC5kYWRkci5hNiwgJnNpbjYtPnNpbjZfYWRkciwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCS8qIE5vIHdheSB0byBzZXQgdGhpcyB2aWEga2FtZSBwZmtleSAqLworCXQtPmFhbGdvcyA9IHQtPmVhbGdvcyA9IHQtPmNhbGdvcyA9IH4wOworCXhwLT54ZnJtX25yKys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3BhcnNlX2lwc2VjcmVxdWVzdHMoc3RydWN0IHhmcm1fcG9saWN5ICp4cCwgc3RydWN0IHNhZGJfeF9wb2xpY3kgKnBvbCkKK3sKKwlpbnQgZXJyOworCWludCBsZW4gPSBwb2wtPnNhZGJfeF9wb2xpY3lfbGVuKjggLSBzaXplb2Yoc3RydWN0IHNhZGJfeF9wb2xpY3kpOworCXN0cnVjdCBzYWRiX3hfaXBzZWNyZXF1ZXN0ICpycSA9ICh2b2lkKikocG9sKzEpOworCisJd2hpbGUgKGxlbiA+PSBzaXplb2Yoc3RydWN0IHNhZGJfeF9pcHNlY3JlcXVlc3QpKSB7CisJCWlmICgoZXJyID0gcGFyc2VfaXBzZWNyZXF1ZXN0KHhwLCBycSkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWxlbiAtPSBycS0+c2FkYl94X2lwc2VjcmVxdWVzdF9sZW47CisJCXJxID0gKHZvaWQqKSgodTgqKXJxICsgcnEtPnNhZGJfeF9pcHNlY3JlcXVlc3RfbGVuKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGZrZXlfeGZybV9wb2xpY3kybXNnX3NpemUoc3RydWN0IHhmcm1fcG9saWN5ICp4cCkKK3sKKwlpbnQgc29ja2FkZHJfc2l6ZSA9IHBma2V5X3NvY2thZGRyX3NpemUoeHAtPmZhbWlseSk7CisJaW50IHNvY2tsZW4gPSAoeHAtPmZhbWlseSA9PSBBRl9JTkVUID8KKwkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pIDoKKwkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSk7CisKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBzYWRiX21zZykgKworCQkoc2l6ZW9mKHN0cnVjdCBzYWRiX2xpZmV0aW1lKSAqIDMpICsKKwkJKHNpemVvZihzdHJ1Y3Qgc2FkYl9hZGRyZXNzKSAqIDIpICsgCisJCShzb2NrYWRkcl9zaXplICogMikgKworCQlzaXplb2Yoc3RydWN0IHNhZGJfeF9wb2xpY3kpICsKKwkJKHhwLT54ZnJtX25yICogKHNpemVvZihzdHJ1Y3Qgc2FkYl94X2lwc2VjcmVxdWVzdCkgKworCQkJCShzb2NrbGVuICogMikpKTsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICogcGZrZXlfeGZybV9wb2xpY3kybXNnX3ByZXAoc3RydWN0IHhmcm1fcG9saWN5ICp4cCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBzaXplOworCisJc2l6ZSA9IHBma2V5X3hmcm1fcG9saWN5Mm1zZ19zaXplKHhwKTsKKworCXNrYiA9ICBhbGxvY19za2Ioc2l6ZSArIDE2LCBHRlBfQVRPTUlDKTsKKwlpZiAoc2tiID09IE5VTEwpCisJCXJldHVybiBFUlJfUFRSKC1FTk9CVUZTKTsKKworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyB2b2lkIHBma2V5X3hmcm1fcG9saWN5Mm1zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLCBpbnQgZGlyKQoreworCXN0cnVjdCBzYWRiX21zZyAqaGRyOworCXN0cnVjdCBzYWRiX2FkZHJlc3MgKmFkZHI7CisJc3RydWN0IHNhZGJfbGlmZXRpbWUgKmxpZmV0aW1lOworCXN0cnVjdCBzYWRiX3hfcG9saWN5ICpwb2w7CisJc3RydWN0IHNvY2thZGRyX2luICAgKnNpbjsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICAqc2luNjsKKyNlbmRpZgorCWludCBpOworCWludCBzaXplOworCWludCBzb2NrYWRkcl9zaXplID0gcGZrZXlfc29ja2FkZHJfc2l6ZSh4cC0+ZmFtaWx5KTsKKwlpbnQgc29ja2xlbiA9ICh4cC0+ZmFtaWx5ID09IEFGX0lORVQgPworCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikgOgorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpKTsKKworCXNpemUgPSBwZmtleV94ZnJtX3BvbGljeTJtc2dfc2l6ZSh4cCk7CisKKwkvKiBjYWxsIHNob3VsZCBmaWxsIGhlYWRlciBsYXRlciAqLworCWhkciA9IChzdHJ1Y3Qgc2FkYl9tc2cgKikgc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3Qgc2FkYl9tc2cpKTsKKwltZW1zZXQoaGRyLCAwLCBzaXplKTsJLyogWFhYIGRvIHdlIG5lZWQgdGhpcyA/ICovCisKKwkvKiBzcmMgYWRkcmVzcyAqLworCWFkZHIgPSAoc3RydWN0IHNhZGJfYWRkcmVzcyopIHNrYl9wdXQoc2tiLCAKKwkJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzYWRiX2FkZHJlc3MpK3NvY2thZGRyX3NpemUpOworCWFkZHItPnNhZGJfYWRkcmVzc19sZW4gPSAKKwkJKHNpemVvZihzdHJ1Y3Qgc2FkYl9hZGRyZXNzKStzb2NrYWRkcl9zaXplKS8KKwkJCXNpemVvZih1aW50NjRfdCk7CisJYWRkci0+c2FkYl9hZGRyZXNzX2V4dHR5cGUgPSBTQURCX0VYVF9BRERSRVNTX1NSQzsKKwlhZGRyLT5zYWRiX2FkZHJlc3NfcHJvdG8gPSBwZmtleV9wcm90b19mcm9tX3hmcm0oeHAtPnNlbGVjdG9yLnByb3RvKTsKKwlhZGRyLT5zYWRiX2FkZHJlc3NfcHJlZml4bGVuID0geHAtPnNlbGVjdG9yLnByZWZpeGxlbl9zOworCWFkZHItPnNhZGJfYWRkcmVzc19yZXNlcnZlZCA9IDA7CisJLyogc3JjIGFkZHJlc3MgKi8KKwlpZiAoeHAtPmZhbWlseSA9PSBBRl9JTkVUKSB7CisJCXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgKGFkZHIgKyAxKTsKKwkJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSB4cC0+c2VsZWN0b3Iuc2FkZHIuYTQ7CisJCXNpbi0+c2luX3BvcnQgPSB4cC0+c2VsZWN0b3Iuc3BvcnQ7CisJCW1lbXNldChzaW4tPnNpbl96ZXJvLCAwLCBzaXplb2Yoc2luLT5zaW5femVybykpOworCX0KKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwllbHNlIGlmICh4cC0+ZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCXNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSAoYWRkciArIDEpOworCQlzaW42LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQlzaW42LT5zaW42X3BvcnQgPSB4cC0+c2VsZWN0b3Iuc3BvcnQ7CisJCXNpbjYtPnNpbjZfZmxvd2luZm8gPSAwOworCQltZW1jcHkoJnNpbjYtPnNpbjZfYWRkciwgeHAtPnNlbGVjdG9yLnNhZGRyLmE2LAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQlzaW42LT5zaW42X3Njb3BlX2lkID0gMDsKKwl9CisjZW5kaWYKKwllbHNlCisJCUJVRygpOworCisJLyogZHN0IGFkZHJlc3MgKi8KKwlhZGRyID0gKHN0cnVjdCBzYWRiX2FkZHJlc3MqKSBza2JfcHV0KHNrYiwgCisJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc2FkYl9hZGRyZXNzKStzb2NrYWRkcl9zaXplKTsKKwlhZGRyLT5zYWRiX2FkZHJlc3NfbGVuID0KKwkJKHNpemVvZihzdHJ1Y3Qgc2FkYl9hZGRyZXNzKStzb2NrYWRkcl9zaXplKS8KKwkJCXNpemVvZih1aW50NjRfdCk7CisJYWRkci0+c2FkYl9hZGRyZXNzX2V4dHR5cGUgPSBTQURCX0VYVF9BRERSRVNTX0RTVDsKKwlhZGRyLT5zYWRiX2FkZHJlc3NfcHJvdG8gPSBwZmtleV9wcm90b19mcm9tX3hmcm0oeHAtPnNlbGVjdG9yLnByb3RvKTsKKwlhZGRyLT5zYWRiX2FkZHJlc3NfcHJlZml4bGVuID0geHAtPnNlbGVjdG9yLnByZWZpeGxlbl9kOyAKKwlhZGRyLT5zYWRiX2FkZHJlc3NfcmVzZXJ2ZWQgPSAwOworCWlmICh4cC0+ZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAoYWRkciArIDEpOworCQlzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IHhwLT5zZWxlY3Rvci5kYWRkci5hNDsKKwkJc2luLT5zaW5fcG9ydCA9IHhwLT5zZWxlY3Rvci5kcG9ydDsKKwkJbWVtc2V0KHNpbi0+c2luX3plcm8sIDAsIHNpemVvZihzaW4tPnNpbl96ZXJvKSk7CisJfQorI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCWVsc2UgaWYgKHhwLT5mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIChhZGRyICsgMSk7CisJCXNpbjYtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJCXNpbjYtPnNpbjZfcG9ydCA9IHhwLT5zZWxlY3Rvci5kcG9ydDsKKwkJc2luNi0+c2luNl9mbG93aW5mbyA9IDA7CisJCW1lbWNweSgmc2luNi0+c2luNl9hZGRyLCB4cC0+c2VsZWN0b3IuZGFkZHIuYTYsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisJCXNpbjYtPnNpbjZfc2NvcGVfaWQgPSAwOworCX0KKyNlbmRpZgorCWVsc2UKKwkJQlVHKCk7CisKKwkvKiBoYXJkIHRpbWUgKi8KKwlsaWZldGltZSA9IChzdHJ1Y3Qgc2FkYl9saWZldGltZSAqKSAgc2tiX3B1dChza2IsIAorCQkJCQkJICAgICBzaXplb2Yoc3RydWN0IHNhZGJfbGlmZXRpbWUpKTsKKwlsaWZldGltZS0+c2FkYl9saWZldGltZV9sZW4gPQorCQlzaXplb2Yoc3RydWN0IHNhZGJfbGlmZXRpbWUpL3NpemVvZih1aW50NjRfdCk7CisJbGlmZXRpbWUtPnNhZGJfbGlmZXRpbWVfZXh0dHlwZSA9IFNBREJfRVhUX0xJRkVUSU1FX0hBUkQ7CisJbGlmZXRpbWUtPnNhZGJfbGlmZXRpbWVfYWxsb2NhdGlvbnMgPSAgX1gyS0VZKHhwLT5sZnQuaGFyZF9wYWNrZXRfbGltaXQpOworCWxpZmV0aW1lLT5zYWRiX2xpZmV0aW1lX2J5dGVzID0gX1gyS0VZKHhwLT5sZnQuaGFyZF9ieXRlX2xpbWl0KTsKKwlsaWZldGltZS0+c2FkYl9saWZldGltZV9hZGR0aW1lID0geHAtPmxmdC5oYXJkX2FkZF9leHBpcmVzX3NlY29uZHM7CisJbGlmZXRpbWUtPnNhZGJfbGlmZXRpbWVfdXNldGltZSA9IHhwLT5sZnQuaGFyZF91c2VfZXhwaXJlc19zZWNvbmRzOworCS8qIHNvZnQgdGltZSAqLworCWxpZmV0aW1lID0gKHN0cnVjdCBzYWRiX2xpZmV0aW1lICopICBza2JfcHV0KHNrYiwgCisJCQkJCQkgICAgIHNpemVvZihzdHJ1Y3Qgc2FkYl9saWZldGltZSkpOworCWxpZmV0aW1lLT5zYWRiX2xpZmV0aW1lX2xlbiA9CisJCXNpemVvZihzdHJ1Y3Qgc2FkYl9saWZldGltZSkvc2l6ZW9mKHVpbnQ2NF90KTsKKwlsaWZldGltZS0+c2FkYl9saWZldGltZV9leHR0eXBlID0gU0FEQl9FWFRfTElGRVRJTUVfU09GVDsKKwlsaWZldGltZS0+c2FkYl9saWZldGltZV9hbGxvY2F0aW9ucyA9ICBfWDJLRVkoeHAtPmxmdC5zb2Z0X3BhY2tldF9saW1pdCk7CisJbGlmZXRpbWUtPnNhZGJfbGlmZXRpbWVfYnl0ZXMgPSBfWDJLRVkoeHAtPmxmdC5zb2Z0X2J5dGVfbGltaXQpOworCWxpZmV0aW1lLT5zYWRiX2xpZmV0aW1lX2FkZHRpbWUgPSB4cC0+bGZ0LnNvZnRfYWRkX2V4cGlyZXNfc2Vjb25kczsKKwlsaWZldGltZS0+c2FkYl9saWZldGltZV91c2V0aW1lID0geHAtPmxmdC5zb2Z0X3VzZV9leHBpcmVzX3NlY29uZHM7CisJLyogY3VycmVudCB0aW1lICovCisJbGlmZXRpbWUgPSAoc3RydWN0IHNhZGJfbGlmZXRpbWUgKikgIHNrYl9wdXQoc2tiLCAKKwkJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBzYWRiX2xpZmV0aW1lKSk7CisJbGlmZXRpbWUtPnNhZGJfbGlmZXRpbWVfbGVuID0KKwkJc2l6ZW9mKHN0cnVjdCBzYWRiX2xpZmV0aW1lKS9zaXplb2YodWludDY0X3QpOworCWxpZmV0aW1lLT5zYWRiX2xpZmV0aW1lX2V4dHR5cGUgPSBTQURCX0VYVF9MSUZFVElNRV9DVVJSRU5UOworCWxpZmV0aW1lLT5zYWRiX2xpZmV0aW1lX2FsbG9jYXRpb25zID0geHAtPmN1cmxmdC5wYWNrZXRzOworCWxpZmV0aW1lLT5zYWRiX2xpZmV0aW1lX2J5dGVzID0geHAtPmN1cmxmdC5ieXRlczsKKwlsaWZldGltZS0+c2FkYl9saWZldGltZV9hZGR0aW1lID0geHAtPmN1cmxmdC5hZGRfdGltZTsKKwlsaWZldGltZS0+c2FkYl9saWZldGltZV91c2V0aW1lID0geHAtPmN1cmxmdC51c2VfdGltZTsKKworCXBvbCA9IChzdHJ1Y3Qgc2FkYl94X3BvbGljeSAqKSAgc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3Qgc2FkYl94X3BvbGljeSkpOworCXBvbC0+c2FkYl94X3BvbGljeV9sZW4gPSBzaXplb2Yoc3RydWN0IHNhZGJfeF9wb2xpY3kpL3NpemVvZih1aW50NjRfdCk7CisJcG9sLT5zYWRiX3hfcG9saWN5X2V4dHR5cGUgPSBTQURCX1hfRVhUX1BPTElDWTsKKwlwb2wtPnNhZGJfeF9wb2xpY3lfdHlwZSA9IElQU0VDX1BPTElDWV9ESVNDQVJEOworCWlmICh4cC0+YWN0aW9uID09IFhGUk1fUE9MSUNZX0FMTE9XKSB7CisJCWlmICh4cC0+eGZybV9ucikKKwkJCXBvbC0+c2FkYl94X3BvbGljeV90eXBlID0gSVBTRUNfUE9MSUNZX0lQU0VDOworCQllbHNlCisJCQlwb2wtPnNhZGJfeF9wb2xpY3lfdHlwZSA9IElQU0VDX1BPTElDWV9OT05FOworCX0KKwlwb2wtPnNhZGJfeF9wb2xpY3lfZGlyID0gZGlyKzE7CisJcG9sLT5zYWRiX3hfcG9saWN5X2lkID0geHAtPmluZGV4OworCXBvbC0+c2FkYl94X3BvbGljeV9wcmlvcml0eSA9IHhwLT5wcmlvcml0eTsKKworCWZvciAoaT0wOyBpPHhwLT54ZnJtX25yOyBpKyspIHsKKwkJc3RydWN0IHNhZGJfeF9pcHNlY3JlcXVlc3QgKnJxOworCQlzdHJ1Y3QgeGZybV90bXBsICp0ID0geHAtPnhmcm1fdmVjICsgaTsKKwkJaW50IHJlcV9zaXplOworCisJCXJlcV9zaXplID0gc2l6ZW9mKHN0cnVjdCBzYWRiX3hfaXBzZWNyZXF1ZXN0KTsKKwkJaWYgKHQtPm1vZGUpCisJCQlyZXFfc2l6ZSArPSAyKnNvY2tsZW47CisJCWVsc2UKKwkJCXNpemUgLT0gMipzb2NrbGVuOworCQlycSA9ICh2b2lkKilza2JfcHV0KHNrYiwgcmVxX3NpemUpOworCQlwb2wtPnNhZGJfeF9wb2xpY3lfbGVuICs9IHJlcV9zaXplLzg7CisJCW1lbXNldChycSwgMCwgc2l6ZW9mKCpycSkpOworCQlycS0+c2FkYl94X2lwc2VjcmVxdWVzdF9sZW4gPSByZXFfc2l6ZTsKKwkJcnEtPnNhZGJfeF9pcHNlY3JlcXVlc3RfcHJvdG8gPSB0LT5pZC5wcm90bzsKKwkJcnEtPnNhZGJfeF9pcHNlY3JlcXVlc3RfbW9kZSA9IHQtPm1vZGUrMTsKKwkJcnEtPnNhZGJfeF9pcHNlY3JlcXVlc3RfbGV2ZWwgPSBJUFNFQ19MRVZFTF9SRVFVSVJFOworCQlpZiAodC0+cmVxaWQpCisJCQlycS0+c2FkYl94X2lwc2VjcmVxdWVzdF9sZXZlbCA9IElQU0VDX0xFVkVMX1VOSVFVRTsKKwkJaWYgKHQtPm9wdGlvbmFsKQorCQkJcnEtPnNhZGJfeF9pcHNlY3JlcXVlc3RfbGV2ZWwgPSBJUFNFQ19MRVZFTF9VU0U7CisJCXJxLT5zYWRiX3hfaXBzZWNyZXF1ZXN0X3JlcWlkID0gdC0+cmVxaWQ7CisJCWlmICh0LT5tb2RlKSB7CisJCQlzd2l0Y2ggKHhwLT5mYW1pbHkpIHsKKwkJCWNhc2UgQUZfSU5FVDoKKwkJCQlzaW4gPSAodm9pZCopKHJxKzEpOworCQkJCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCQkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSB0LT5zYWRkci5hNDsKKwkJCQlzaW4tPnNpbl9wb3J0ID0gMDsKKwkJCQltZW1zZXQoc2luLT5zaW5femVybywgMCwgc2l6ZW9mKHNpbi0+c2luX3plcm8pKTsKKwkJCQlzaW4rKzsKKwkJCQlzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQkJCXNpbi0+c2luX2FkZHIuc19hZGRyID0gdC0+aWQuZGFkZHIuYTQ7CisJCQkJc2luLT5zaW5fcG9ydCA9IDA7CisJCQkJbWVtc2V0KHNpbi0+c2luX3plcm8sIDAsIHNpemVvZihzaW4tPnNpbl96ZXJvKSk7CisJCQkJYnJlYWs7CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJCQljYXNlIEFGX0lORVQ2OgorCQkJCXNpbjYgPSAodm9pZCopKHJxKzEpOworCQkJCXNpbjYtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJCQkJc2luNi0+c2luNl9wb3J0ID0gMDsKKwkJCQlzaW42LT5zaW42X2Zsb3dpbmZvID0gMDsKKwkJCQltZW1jcHkoJnNpbjYtPnNpbjZfYWRkciwgdC0+c2FkZHIuYTYsCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJCQlzaW42LT5zaW42X3Njb3BlX2lkID0gMDsKKworCQkJCXNpbjYrKzsKKwkJCQlzaW42LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQkJCXNpbjYtPnNpbjZfcG9ydCA9IDA7CisJCQkJc2luNi0+c2luNl9mbG93aW5mbyA9IDA7CisJCQkJbWVtY3B5KCZzaW42LT5zaW42X2FkZHIsIHQtPmlkLmRhZGRyLmE2LAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisJCQkJc2luNi0+c2luNl9zY29wZV9pZCA9IDA7CisJCQkJYnJlYWs7CisjZW5kaWYKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJaGRyLT5zYWRiX21zZ19sZW4gPSBzaXplIC8gc2l6ZW9mKHVpbnQ2NF90KTsKKwloZHItPnNhZGJfbXNnX3Jlc2VydmVkID0gYXRvbWljX3JlYWQoJnhwLT5yZWZjbnQpOworfQorCitzdGF0aWMgaW50IHBma2V5X3NwZGFkZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzYWRiX21zZyAqaGRyLCB2b2lkICoqZXh0X2hkcnMpCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qgc2FkYl9saWZldGltZSAqbGlmZXRpbWU7CisJc3RydWN0IHNhZGJfYWRkcmVzcyAqc2E7CisJc3RydWN0IHNhZGJfeF9wb2xpY3kgKnBvbDsKKwlzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwOworCXN0cnVjdCBza19idWZmICpvdXRfc2tiOworCXN0cnVjdCBzYWRiX21zZyAqb3V0X2hkcjsKKworCWlmICghcHJlc2VudF9hbmRfc2FtZV9mYW1pbHkoZXh0X2hkcnNbU0FEQl9FWFRfQUREUkVTU19TUkMtMV0sCisJCQkJICAgICBleHRfaGRyc1tTQURCX0VYVF9BRERSRVNTX0RTVC0xXSkgfHwKKwkgICAgIWV4dF9oZHJzW1NBREJfWF9FWFRfUE9MSUNZLTFdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBvbCA9IGV4dF9oZHJzW1NBREJfWF9FWFRfUE9MSUNZLTFdOworCWlmIChwb2wtPnNhZGJfeF9wb2xpY3lfdHlwZSA+IElQU0VDX1BPTElDWV9JUFNFQykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFwb2wtPnNhZGJfeF9wb2xpY3lfZGlyIHx8IHBvbC0+c2FkYl94X3BvbGljeV9kaXIgPj0gSVBTRUNfRElSX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl4cCA9IHhmcm1fcG9saWN5X2FsbG9jKEdGUF9LRVJORUwpOworCWlmICh4cCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwl4cC0+YWN0aW9uID0gKHBvbC0+c2FkYl94X3BvbGljeV90eXBlID09IElQU0VDX1BPTElDWV9ESVNDQVJEID8KKwkJICAgICAgWEZSTV9QT0xJQ1lfQkxPQ0sgOiBYRlJNX1BPTElDWV9BTExPVyk7CisJeHAtPnByaW9yaXR5ID0gcG9sLT5zYWRiX3hfcG9saWN5X3ByaW9yaXR5OworCisJc2EgPSBleHRfaGRyc1tTQURCX0VYVF9BRERSRVNTX1NSQy0xXSwgCisJeHAtPmZhbWlseSA9IHBma2V5X3NhZGJfYWRkcjJ4ZnJtX2FkZHIoc2EsICZ4cC0+c2VsZWN0b3Iuc2FkZHIpOworCWlmICgheHAtPmZhbWlseSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJeHAtPnNlbGVjdG9yLmZhbWlseSA9IHhwLT5mYW1pbHk7CisJeHAtPnNlbGVjdG9yLnByZWZpeGxlbl9zID0gc2EtPnNhZGJfYWRkcmVzc19wcmVmaXhsZW47CisJeHAtPnNlbGVjdG9yLnByb3RvID0gcGZrZXlfcHJvdG9fdG9feGZybShzYS0+c2FkYl9hZGRyZXNzX3Byb3RvKTsKKwl4cC0+c2VsZWN0b3Iuc3BvcnQgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKShzYSsxKSktPnNpbl9wb3J0OworCWlmICh4cC0+c2VsZWN0b3Iuc3BvcnQpCisJCXhwLT5zZWxlY3Rvci5zcG9ydF9tYXNrID0gfjA7CisKKwlzYSA9IGV4dF9oZHJzW1NBREJfRVhUX0FERFJFU1NfRFNULTFdLCAKKwlwZmtleV9zYWRiX2FkZHIyeGZybV9hZGRyKHNhLCAmeHAtPnNlbGVjdG9yLmRhZGRyKTsKKwl4cC0+c2VsZWN0b3IucHJlZml4bGVuX2QgPSBzYS0+c2FkYl9hZGRyZXNzX3ByZWZpeGxlbjsKKworCS8qIEFtdXNpbmcsIHdlIHNldCB0aGlzIHR3aWNlLiAgS0FNRSBhcHBzIGFwcGVhciB0byBzZXQgc2FtZSB2YWx1ZQorCSAqIGluIGJvdGggYWRkcmVzc2VzLgorCSAqLworCXhwLT5zZWxlY3Rvci5wcm90byA9IHBma2V5X3Byb3RvX3RvX3hmcm0oc2EtPnNhZGJfYWRkcmVzc19wcm90byk7CisKKwl4cC0+c2VsZWN0b3IuZHBvcnQgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKShzYSsxKSktPnNpbl9wb3J0OworCWlmICh4cC0+c2VsZWN0b3IuZHBvcnQpCisJCXhwLT5zZWxlY3Rvci5kcG9ydF9tYXNrID0gfjA7CisKKwl4cC0+bGZ0LnNvZnRfYnl0ZV9saW1pdCA9IFhGUk1fSU5GOworCXhwLT5sZnQuaGFyZF9ieXRlX2xpbWl0ID0gWEZSTV9JTkY7CisJeHAtPmxmdC5zb2Z0X3BhY2tldF9saW1pdCA9IFhGUk1fSU5GOworCXhwLT5sZnQuaGFyZF9wYWNrZXRfbGltaXQgPSBYRlJNX0lORjsKKwlpZiAoKGxpZmV0aW1lID0gZXh0X2hkcnNbU0FEQl9FWFRfTElGRVRJTUVfSEFSRC0xXSkgIT0gTlVMTCkgeworCQl4cC0+bGZ0LmhhcmRfcGFja2V0X2xpbWl0ID0gX0tFWTJYKGxpZmV0aW1lLT5zYWRiX2xpZmV0aW1lX2FsbG9jYXRpb25zKTsKKwkJeHAtPmxmdC5oYXJkX2J5dGVfbGltaXQgPSBfS0VZMlgobGlmZXRpbWUtPnNhZGJfbGlmZXRpbWVfYnl0ZXMpOworCQl4cC0+bGZ0LmhhcmRfYWRkX2V4cGlyZXNfc2Vjb25kcyA9IGxpZmV0aW1lLT5zYWRiX2xpZmV0aW1lX2FkZHRpbWU7CisJCXhwLT5sZnQuaGFyZF91c2VfZXhwaXJlc19zZWNvbmRzID0gbGlmZXRpbWUtPnNhZGJfbGlmZXRpbWVfdXNldGltZTsKKwl9CisJaWYgKChsaWZldGltZSA9IGV4dF9oZHJzW1NBREJfRVhUX0xJRkVUSU1FX1NPRlQtMV0pICE9IE5VTEwpIHsKKwkJeHAtPmxmdC5zb2Z0X3BhY2tldF9saW1pdCA9IF9LRVkyWChsaWZldGltZS0+c2FkYl9saWZldGltZV9hbGxvY2F0aW9ucyk7CisJCXhwLT5sZnQuc29mdF9ieXRlX2xpbWl0ID0gX0tFWTJYKGxpZmV0aW1lLT5zYWRiX2xpZmV0aW1lX2J5dGVzKTsKKwkJeHAtPmxmdC5zb2Z0X2FkZF9leHBpcmVzX3NlY29uZHMgPSBsaWZldGltZS0+c2FkYl9saWZldGltZV9hZGR0aW1lOworCQl4cC0+bGZ0LnNvZnRfdXNlX2V4cGlyZXNfc2Vjb25kcyA9IGxpZmV0aW1lLT5zYWRiX2xpZmV0aW1lX3VzZXRpbWU7CisJfQorCXhwLT54ZnJtX25yID0gMDsKKwlpZiAocG9sLT5zYWRiX3hfcG9saWN5X3R5cGUgPT0gSVBTRUNfUE9MSUNZX0lQU0VDICYmCisJICAgIChlcnIgPSBwYXJzZV9pcHNlY3JlcXVlc3RzKHhwLCBwb2wpKSA8IDApCisJCWdvdG8gb3V0OworCisJb3V0X3NrYiA9IHBma2V5X3hmcm1fcG9saWN5Mm1zZ19wcmVwKHhwKTsKKwlpZiAoSVNfRVJSKG91dF9za2IpKSB7CisJCWVyciA9ICBQVFJfRVJSKG91dF9za2IpOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSB4ZnJtX3BvbGljeV9pbnNlcnQocG9sLT5zYWRiX3hfcG9saWN5X2Rpci0xLCB4cCwKKwkJCQkgaGRyLT5zYWRiX21zZ190eXBlICE9IFNBREJfWF9TUERVUERBVEUpOworCWlmIChlcnIpIHsKKwkJa2ZyZWVfc2tiKG91dF9za2IpOworCQlnb3RvIG91dDsKKwl9CisKKwlwZmtleV94ZnJtX3BvbGljeTJtc2cob3V0X3NrYiwgeHAsIHBvbC0+c2FkYl94X3BvbGljeV9kaXItMSk7CisKKwl4ZnJtX3BvbF9wdXQoeHApOworCisJb3V0X2hkciA9IChzdHJ1Y3Qgc2FkYl9tc2cgKikgb3V0X3NrYi0+ZGF0YTsKKwlvdXRfaGRyLT5zYWRiX21zZ192ZXJzaW9uID0gaGRyLT5zYWRiX21zZ192ZXJzaW9uOworCW91dF9oZHItPnNhZGJfbXNnX3R5cGUgPSBoZHItPnNhZGJfbXNnX3R5cGU7CisJb3V0X2hkci0+c2FkYl9tc2dfc2F0eXBlID0gMDsKKwlvdXRfaGRyLT5zYWRiX21zZ19lcnJubyA9IDA7CisJb3V0X2hkci0+c2FkYl9tc2dfc2VxID0gaGRyLT5zYWRiX21zZ19zZXE7CisJb3V0X2hkci0+c2FkYl9tc2dfcGlkID0gaGRyLT5zYWRiX21zZ19waWQ7CisJcGZrZXlfYnJvYWRjYXN0KG91dF9za2IsIEdGUF9BVE9NSUMsIEJST0FEQ0FTVF9BTEwsIHNrKTsKKwlyZXR1cm4gMDsKKworb3V0OgorCWtmcmVlKHhwKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHBma2V5X3NwZGRlbGV0ZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzYWRiX21zZyAqaGRyLCB2b2lkICoqZXh0X2hkcnMpCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qgc2FkYl9hZGRyZXNzICpzYTsKKwlzdHJ1Y3Qgc2FkYl94X3BvbGljeSAqcG9sOworCXN0cnVjdCB4ZnJtX3BvbGljeSAqeHA7CisJc3RydWN0IHNrX2J1ZmYgKm91dF9za2I7CisJc3RydWN0IHNhZGJfbXNnICpvdXRfaGRyOworCXN0cnVjdCB4ZnJtX3NlbGVjdG9yIHNlbDsKKworCWlmICghcHJlc2VudF9hbmRfc2FtZV9mYW1pbHkoZXh0X2hkcnNbU0FEQl9FWFRfQUREUkVTU19TUkMtMV0sCisJCQkJICAgICBleHRfaGRyc1tTQURCX0VYVF9BRERSRVNTX0RTVC0xXSkgfHwKKwkgICAgIWV4dF9oZHJzW1NBREJfWF9FWFRfUE9MSUNZLTFdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBvbCA9IGV4dF9oZHJzW1NBREJfWF9FWFRfUE9MSUNZLTFdOworCWlmICghcG9sLT5zYWRiX3hfcG9saWN5X2RpciB8fCBwb2wtPnNhZGJfeF9wb2xpY3lfZGlyID49IElQU0VDX0RJUl9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KCZzZWwsIDAsIHNpemVvZihzZWwpKTsKKworCXNhID0gZXh0X2hkcnNbU0FEQl9FWFRfQUREUkVTU19TUkMtMV0sIAorCXNlbC5mYW1pbHkgPSBwZmtleV9zYWRiX2FkZHIyeGZybV9hZGRyKHNhLCAmc2VsLnNhZGRyKTsKKwlzZWwucHJlZml4bGVuX3MgPSBzYS0+c2FkYl9hZGRyZXNzX3ByZWZpeGxlbjsKKwlzZWwucHJvdG8gPSBwZmtleV9wcm90b190b194ZnJtKHNhLT5zYWRiX2FkZHJlc3NfcHJvdG8pOworCXNlbC5zcG9ydCA9ICgoc3RydWN0IHNvY2thZGRyX2luICopKHNhKzEpKS0+c2luX3BvcnQ7CisJaWYgKHNlbC5zcG9ydCkKKwkJc2VsLnNwb3J0X21hc2sgPSB+MDsKKworCXNhID0gZXh0X2hkcnNbU0FEQl9FWFRfQUREUkVTU19EU1QtMV0sIAorCXBma2V5X3NhZGJfYWRkcjJ4ZnJtX2FkZHIoc2EsICZzZWwuZGFkZHIpOworCXNlbC5wcmVmaXhsZW5fZCA9IHNhLT5zYWRiX2FkZHJlc3NfcHJlZml4bGVuOworCXNlbC5wcm90byA9IHBma2V5X3Byb3RvX3RvX3hmcm0oc2EtPnNhZGJfYWRkcmVzc19wcm90byk7CisJc2VsLmRwb3J0ID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikoc2ErMSkpLT5zaW5fcG9ydDsKKwlpZiAoc2VsLmRwb3J0KQorCQlzZWwuZHBvcnRfbWFzayA9IH4wOworCisJeHAgPSB4ZnJtX3BvbGljeV9ieXNlbChwb2wtPnNhZGJfeF9wb2xpY3lfZGlyLTEsICZzZWwsIDEpOworCWlmICh4cCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWVyciA9IDA7CisKKwlvdXRfc2tiID0gcGZrZXlfeGZybV9wb2xpY3kybXNnX3ByZXAoeHApOworCWlmIChJU19FUlIob3V0X3NrYikpIHsKKwkJZXJyID0gIFBUUl9FUlIob3V0X3NrYik7CisJCWdvdG8gb3V0OworCX0KKwlwZmtleV94ZnJtX3BvbGljeTJtc2cob3V0X3NrYiwgeHAsIHBvbC0+c2FkYl94X3BvbGljeV9kaXItMSk7CisKKwlvdXRfaGRyID0gKHN0cnVjdCBzYWRiX21zZyAqKSBvdXRfc2tiLT5kYXRhOworCW91dF9oZHItPnNhZGJfbXNnX3ZlcnNpb24gPSBoZHItPnNhZGJfbXNnX3ZlcnNpb247CisJb3V0X2hkci0+c2FkYl9tc2dfdHlwZSA9IFNBREJfWF9TUERERUxFVEU7CisJb3V0X2hkci0+c2FkYl9tc2dfc2F0eXBlID0gMDsKKwlvdXRfaGRyLT5zYWRiX21zZ19lcnJubyA9IDA7CisJb3V0X2hkci0+c2FkYl9tc2dfc2VxID0gaGRyLT5zYWRiX21zZ19zZXE7CisJb3V0X2hkci0+c2FkYl9tc2dfcGlkID0gaGRyLT5zYWRiX21zZ19waWQ7CisJcGZrZXlfYnJvYWRjYXN0KG91dF9za2IsIEdGUF9BVE9NSUMsIEJST0FEQ0FTVF9BTEwsIHNrKTsKKwllcnIgPSAwOworCitvdXQ6CisJeGZybV9wb2xfcHV0KHhwKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHBma2V5X3NwZGdldChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzYWRiX21zZyAqaGRyLCB2b2lkICoqZXh0X2hkcnMpCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qgc2FkYl94X3BvbGljeSAqcG9sOworCXN0cnVjdCB4ZnJtX3BvbGljeSAqeHA7CisJc3RydWN0IHNrX2J1ZmYgKm91dF9za2I7CisJc3RydWN0IHNhZGJfbXNnICpvdXRfaGRyOworCisJaWYgKChwb2wgPSBleHRfaGRyc1tTQURCX1hfRVhUX1BPTElDWS0xXSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl4cCA9IHhmcm1fcG9saWN5X2J5aWQoMCwgcG9sLT5zYWRiX3hfcG9saWN5X2lkLAorCQkJICAgICAgaGRyLT5zYWRiX21zZ190eXBlID09IFNBREJfWF9TUERERUxFVEUyKTsKKwlpZiAoeHAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwllcnIgPSAwOworCisJb3V0X3NrYiA9IHBma2V5X3hmcm1fcG9saWN5Mm1zZ19wcmVwKHhwKTsKKwlpZiAoSVNfRVJSKG91dF9za2IpKSB7CisJCWVyciA9ICBQVFJfRVJSKG91dF9za2IpOworCQlnb3RvIG91dDsKKwl9CisJcGZrZXlfeGZybV9wb2xpY3kybXNnKG91dF9za2IsIHhwLCBwb2wtPnNhZGJfeF9wb2xpY3lfZGlyLTEpOworCisJb3V0X2hkciA9IChzdHJ1Y3Qgc2FkYl9tc2cgKikgb3V0X3NrYi0+ZGF0YTsKKwlvdXRfaGRyLT5zYWRiX21zZ192ZXJzaW9uID0gaGRyLT5zYWRiX21zZ192ZXJzaW9uOworCW91dF9oZHItPnNhZGJfbXNnX3R5cGUgPSBoZHItPnNhZGJfbXNnX3R5cGU7CisJb3V0X2hkci0+c2FkYl9tc2dfc2F0eXBlID0gMDsKKwlvdXRfaGRyLT5zYWRiX21zZ19lcnJubyA9IDA7CisJb3V0X2hkci0+c2FkYl9tc2dfc2VxID0gaGRyLT5zYWRiX21zZ19zZXE7CisJb3V0X2hkci0+c2FkYl9tc2dfcGlkID0gaGRyLT5zYWRiX21zZ19waWQ7CisJcGZrZXlfYnJvYWRjYXN0KG91dF9za2IsIEdGUF9BVE9NSUMsIEJST0FEQ0FTVF9BTEwsIHNrKTsKKwllcnIgPSAwOworCitvdXQ6CisJeGZybV9wb2xfcHV0KHhwKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGR1bXBfc3Aoc3RydWN0IHhmcm1fcG9saWN5ICp4cCwgaW50IGRpciwgaW50IGNvdW50LCB2b2lkICpwdHIpCit7CisJc3RydWN0IHBma2V5X2R1bXBfZGF0YSAqZGF0YSA9IHB0cjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqb3V0X3NrYjsKKwlzdHJ1Y3Qgc2FkYl9tc2cgKm91dF9oZHI7CisKKwlvdXRfc2tiID0gcGZrZXlfeGZybV9wb2xpY3kybXNnX3ByZXAoeHApOworCWlmIChJU19FUlIob3V0X3NrYikpCisJCXJldHVybiBQVFJfRVJSKG91dF9za2IpOworCisJcGZrZXlfeGZybV9wb2xpY3kybXNnKG91dF9za2IsIHhwLCBkaXIpOworCisJb3V0X2hkciA9IChzdHJ1Y3Qgc2FkYl9tc2cgKikgb3V0X3NrYi0+ZGF0YTsKKwlvdXRfaGRyLT5zYWRiX21zZ192ZXJzaW9uID0gZGF0YS0+aGRyLT5zYWRiX21zZ192ZXJzaW9uOworCW91dF9oZHItPnNhZGJfbXNnX3R5cGUgPSBTQURCX1hfU1BERFVNUDsKKwlvdXRfaGRyLT5zYWRiX21zZ19zYXR5cGUgPSBTQURCX1NBVFlQRV9VTlNQRUM7CisJb3V0X2hkci0+c2FkYl9tc2dfZXJybm8gPSAwOworCW91dF9oZHItPnNhZGJfbXNnX3NlcSA9IGNvdW50OworCW91dF9oZHItPnNhZGJfbXNnX3BpZCA9IGRhdGEtPmhkci0+c2FkYl9tc2dfcGlkOworCXBma2V5X2Jyb2FkY2FzdChvdXRfc2tiLCBHRlBfQVRPTUlDLCBCUk9BRENBU1RfT05FLCBkYXRhLT5zayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGZrZXlfc3BkZHVtcChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzYWRiX21zZyAqaGRyLCB2b2lkICoqZXh0X2hkcnMpCit7CisJc3RydWN0IHBma2V5X2R1bXBfZGF0YSBkYXRhID0geyAuc2tiID0gc2tiLCAuaGRyID0gaGRyLCAuc2sgPSBzayB9OworCisJcmV0dXJuIHhmcm1fcG9saWN5X3dhbGsoZHVtcF9zcCwgJmRhdGEpOworfQorCitzdGF0aWMgaW50IHBma2V5X3NwZGZsdXNoKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNhZGJfbXNnICpoZHIsIHZvaWQgKipleHRfaGRycykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiX291dDsKKwlzdHJ1Y3Qgc2FkYl9tc2cgKmhkcl9vdXQ7CisKKwlza2Jfb3V0ID0gYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3Qgc2FkYl9tc2cpICsgMTYsIEdGUF9LRVJORUwpOworCWlmICghc2tiX291dCkKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJeGZybV9wb2xpY3lfZmx1c2goKTsKKworCWhkcl9vdXQgPSAoc3RydWN0IHNhZGJfbXNnICopIHNrYl9wdXQoc2tiX291dCwgc2l6ZW9mKHN0cnVjdCBzYWRiX21zZykpOworCXBma2V5X2hkcl9kdXAoaGRyX291dCwgaGRyKTsKKwloZHJfb3V0LT5zYWRiX21zZ19lcnJubyA9ICh1aW50OF90KSAwOworCWhkcl9vdXQtPnNhZGJfbXNnX2xlbiA9IChzaXplb2Yoc3RydWN0IHNhZGJfbXNnKSAvIHNpemVvZih1aW50NjRfdCkpOworCXBma2V5X2Jyb2FkY2FzdChza2Jfb3V0LCBHRlBfS0VSTkVMLCBCUk9BRENBU1RfQUxMLCBOVUxMKTsKKworCXJldHVybiAwOworfQorCit0eXBlZGVmIGludCAoKnBma2V5X2hhbmRsZXIpKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgc3RydWN0IHNhZGJfbXNnICpoZHIsIHZvaWQgKipleHRfaGRycyk7CitzdGF0aWMgcGZrZXlfaGFuZGxlciBwZmtleV9mdW5jc1tTQURCX01BWCArIDFdID0geworCVtTQURCX1JFU0VSVkVEXQkJPSBwZmtleV9yZXNlcnZlZCwKKwlbU0FEQl9HRVRTUEldCQk9IHBma2V5X2dldHNwaSwKKwlbU0FEQl9VUERBVEVdCQk9IHBma2V5X2FkZCwKKwlbU0FEQl9BRERdCQk9IHBma2V5X2FkZCwKKwlbU0FEQl9ERUxFVEVdCQk9IHBma2V5X2RlbGV0ZSwKKwlbU0FEQl9HRVRdCQk9IHBma2V5X2dldCwKKwlbU0FEQl9BQ1FVSVJFXQkJPSBwZmtleV9hY3F1aXJlLAorCVtTQURCX1JFR0lTVEVSXQkJPSBwZmtleV9yZWdpc3RlciwKKwlbU0FEQl9FWFBJUkVdCQk9IE5VTEwsCisJW1NBREJfRkxVU0hdCQk9IHBma2V5X2ZsdXNoLAorCVtTQURCX0RVTVBdCQk9IHBma2V5X2R1bXAsCisJW1NBREJfWF9QUk9NSVNDXQk9IHBma2V5X3Byb21pc2MsCisJW1NBREJfWF9QQ0hBTkdFXQk9IE5VTEwsCisJW1NBREJfWF9TUERVUERBVEVdCT0gcGZrZXlfc3BkYWRkLAorCVtTQURCX1hfU1BEQUREXQkJPSBwZmtleV9zcGRhZGQsCisJW1NBREJfWF9TUERERUxFVEVdCT0gcGZrZXlfc3BkZGVsZXRlLAorCVtTQURCX1hfU1BER0VUXQkJPSBwZmtleV9zcGRnZXQsCisJW1NBREJfWF9TUERBQ1FVSVJFXQk9IE5VTEwsCisJW1NBREJfWF9TUEREVU1QXQk9IHBma2V5X3NwZGR1bXAsCisJW1NBREJfWF9TUERGTFVTSF0JPSBwZmtleV9zcGRmbHVzaCwKKwlbU0FEQl9YX1NQRFNFVElEWF0JPSBwZmtleV9zcGRhZGQsCisJW1NBREJfWF9TUERERUxFVEUyXQk9IHBma2V5X3NwZGdldCwKK307CisKK3N0YXRpYyBpbnQgcGZrZXlfcHJvY2VzcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzYWRiX21zZyAqaGRyKQoreworCXZvaWQgKmV4dF9oZHJzW1NBREJfRVhUX01BWF07CisJaW50IGVycjsKKworCXBma2V5X2Jyb2FkY2FzdChza2JfY2xvbmUoc2tiLCBHRlBfS0VSTkVMKSwgR0ZQX0tFUk5FTCwKKwkJCUJST0FEQ0FTVF9QUk9NSVNDX09OTFksIE5VTEwpOworCisJbWVtc2V0KGV4dF9oZHJzLCAwLCBzaXplb2YoZXh0X2hkcnMpKTsKKwllcnIgPSBwYXJzZV9leHRoZHJzKHNrYiwgaGRyLCBleHRfaGRycyk7CisJaWYgKCFlcnIpIHsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWlmIChwZmtleV9mdW5jc1toZHItPnNhZGJfbXNnX3R5cGVdKQorCQkJZXJyID0gcGZrZXlfZnVuY3NbaGRyLT5zYWRiX21zZ190eXBlXShzaywgc2tiLCBoZHIsIGV4dF9oZHJzKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBzYWRiX21zZyAqcGZrZXlfZ2V0X2Jhc2VfbXNnKHN0cnVjdCBza19idWZmICpza2IsIGludCAqZXJycCkKK3sKKwlzdHJ1Y3Qgc2FkYl9tc2cgKmhkciA9IE5VTEw7CisKKwlpZiAoc2tiLT5sZW4gPCBzaXplb2YoKmhkcikpIHsKKwkJKmVycnAgPSAtRU1TR1NJWkU7CisJfSBlbHNlIHsKKwkJaGRyID0gKHN0cnVjdCBzYWRiX21zZyAqKSBza2ItPmRhdGE7CisJCWlmIChoZHItPnNhZGJfbXNnX3ZlcnNpb24gIT0gUEZfS0VZX1YyIHx8CisJCSAgICBoZHItPnNhZGJfbXNnX3Jlc2VydmVkICE9IDAgfHwKKwkJICAgIChoZHItPnNhZGJfbXNnX3R5cGUgPD0gU0FEQl9SRVNFUlZFRCB8fAorCQkgICAgIGhkci0+c2FkYl9tc2dfdHlwZSA+IFNBREJfTUFYKSkgeworCQkJaGRyID0gTlVMTDsKKwkJCSplcnJwID0gLUVJTlZBTDsKKwkJfSBlbHNlIGlmIChoZHItPnNhZGJfbXNnX2xlbiAhPSAoc2tiLT5sZW4gLworCQkJCQkJIHNpemVvZih1aW50NjRfdCkpIHx8CisJCQkgICBoZHItPnNhZGJfbXNnX2xlbiA8IChzaXplb2Yoc3RydWN0IHNhZGJfbXNnKSAvCisJCQkJCQlzaXplb2YodWludDY0X3QpKSkgeworCQkJaGRyID0gTlVMTDsKKwkJCSplcnJwID0gLUVNU0dTSVpFOworCQl9IGVsc2UgeworCQkJKmVycnAgPSAwOworCQl9CisJfQorCXJldHVybiBoZHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFhbGdfdG1wbF9zZXQoc3RydWN0IHhmcm1fdG1wbCAqdCwgc3RydWN0IHhmcm1fYWxnb19kZXNjICpkKQoreworCXJldHVybiB0LT5hYWxnb3MgJiAoMSA8PCBkLT5kZXNjLnNhZGJfYWxnX2lkKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZWFsZ190bXBsX3NldChzdHJ1Y3QgeGZybV90bXBsICp0LCBzdHJ1Y3QgeGZybV9hbGdvX2Rlc2MgKmQpCit7CisJcmV0dXJuIHQtPmVhbGdvcyAmICgxIDw8IGQtPmRlc2Muc2FkYl9hbGdfaWQpOworfQorCitzdGF0aWMgaW50IGNvdW50X2FoX2NvbWJzKHN0cnVjdCB4ZnJtX3RtcGwgKnQpCit7CisJaW50IGksIHN6ID0gMDsKKworCWZvciAoaSA9IDA7IDsgaSsrKSB7CisJCXN0cnVjdCB4ZnJtX2FsZ29fZGVzYyAqYWFsZyA9IHhmcm1fYWFsZ19nZXRfYnlpZHgoaSk7CisJCWlmICghYWFsZykKKwkJCWJyZWFrOworCQlpZiAoYWFsZ190bXBsX3NldCh0LCBhYWxnKSAmJiBhYWxnLT5hdmFpbGFibGUpCisJCQlzeiArPSBzaXplb2Yoc3RydWN0IHNhZGJfY29tYik7CisJfQorCXJldHVybiBzeiArIHNpemVvZihzdHJ1Y3Qgc2FkYl9wcm9wKTsKK30KKworc3RhdGljIGludCBjb3VudF9lc3BfY29tYnMoc3RydWN0IHhmcm1fdG1wbCAqdCkKK3sKKwlpbnQgaSwgaywgc3ogPSAwOworCisJZm9yIChpID0gMDsgOyBpKyspIHsKKwkJc3RydWN0IHhmcm1fYWxnb19kZXNjICplYWxnID0geGZybV9lYWxnX2dldF9ieWlkeChpKTsKKwkJaWYgKCFlYWxnKQorCQkJYnJlYWs7CisJCQkKKwkJaWYgKCEoZWFsZ190bXBsX3NldCh0LCBlYWxnKSAmJiBlYWxnLT5hdmFpbGFibGUpKQorCQkJY29udGludWU7CisJCQkKKwkJZm9yIChrID0gMTsgOyBrKyspIHsKKwkJCXN0cnVjdCB4ZnJtX2FsZ29fZGVzYyAqYWFsZyA9IHhmcm1fYWFsZ19nZXRfYnlpZHgoayk7CisJCQlpZiAoIWFhbGcpCisJCQkJYnJlYWs7CisJCQkJCisJCQlpZiAoYWFsZ190bXBsX3NldCh0LCBhYWxnKSAmJiBhYWxnLT5hdmFpbGFibGUpCisJCQkJc3ogKz0gc2l6ZW9mKHN0cnVjdCBzYWRiX2NvbWIpOworCQl9CisJfQorCXJldHVybiBzeiArIHNpemVvZihzdHJ1Y3Qgc2FkYl9wcm9wKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9haF9jb21icyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgeGZybV90bXBsICp0KQoreworCXN0cnVjdCBzYWRiX3Byb3AgKnA7CisJaW50IGk7CisKKwlwID0gKHN0cnVjdCBzYWRiX3Byb3AqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IHNhZGJfcHJvcCkpOworCXAtPnNhZGJfcHJvcF9sZW4gPSBzaXplb2Yoc3RydWN0IHNhZGJfcHJvcCkvODsKKwlwLT5zYWRiX3Byb3BfZXh0dHlwZSA9IFNBREJfRVhUX1BST1BPU0FMOworCXAtPnNhZGJfcHJvcF9yZXBsYXkgPSAzMjsKKwltZW1zZXQocC0+c2FkYl9wcm9wX3Jlc2VydmVkLCAwLCBzaXplb2YocC0+c2FkYl9wcm9wX3Jlc2VydmVkKSk7CisKKwlmb3IgKGkgPSAwOyA7IGkrKykgeworCQlzdHJ1Y3QgeGZybV9hbGdvX2Rlc2MgKmFhbGcgPSB4ZnJtX2FhbGdfZ2V0X2J5aWR4KGkpOworCQlpZiAoIWFhbGcpCisJCQlicmVhazsKKworCQlpZiAoYWFsZ190bXBsX3NldCh0LCBhYWxnKSAmJiBhYWxnLT5hdmFpbGFibGUpIHsKKwkJCXN0cnVjdCBzYWRiX2NvbWIgKmM7CisJCQljID0gKHN0cnVjdCBzYWRiX2NvbWIqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IHNhZGJfY29tYikpOworCQkJbWVtc2V0KGMsIDAsIHNpemVvZigqYykpOworCQkJcC0+c2FkYl9wcm9wX2xlbiArPSBzaXplb2Yoc3RydWN0IHNhZGJfY29tYikvODsKKwkJCWMtPnNhZGJfY29tYl9hdXRoID0gYWFsZy0+ZGVzYy5zYWRiX2FsZ19pZDsKKwkJCWMtPnNhZGJfY29tYl9hdXRoX21pbmJpdHMgPSBhYWxnLT5kZXNjLnNhZGJfYWxnX21pbmJpdHM7CisJCQljLT5zYWRiX2NvbWJfYXV0aF9tYXhiaXRzID0gYWFsZy0+ZGVzYy5zYWRiX2FsZ19tYXhiaXRzOworCQkJYy0+c2FkYl9jb21iX2hhcmRfYWRkdGltZSA9IDI0KjYwKjYwOworCQkJYy0+c2FkYl9jb21iX3NvZnRfYWRkdGltZSA9IDIwKjYwKjYwOworCQkJYy0+c2FkYl9jb21iX2hhcmRfdXNldGltZSA9IDgqNjAqNjA7CisJCQljLT5zYWRiX2NvbWJfc29mdF91c2V0aW1lID0gNyo2MCo2MDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZHVtcF9lc3BfY29tYnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHhmcm1fdG1wbCAqdCkKK3sKKwlzdHJ1Y3Qgc2FkYl9wcm9wICpwOworCWludCBpLCBrOworCisJcCA9IChzdHJ1Y3Qgc2FkYl9wcm9wKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBzYWRiX3Byb3ApKTsKKwlwLT5zYWRiX3Byb3BfbGVuID0gc2l6ZW9mKHN0cnVjdCBzYWRiX3Byb3ApLzg7CisJcC0+c2FkYl9wcm9wX2V4dHR5cGUgPSBTQURCX0VYVF9QUk9QT1NBTDsKKwlwLT5zYWRiX3Byb3BfcmVwbGF5ID0gMzI7CisJbWVtc2V0KHAtPnNhZGJfcHJvcF9yZXNlcnZlZCwgMCwgc2l6ZW9mKHAtPnNhZGJfcHJvcF9yZXNlcnZlZCkpOworCisJZm9yIChpPTA7IDsgaSsrKSB7CisJCXN0cnVjdCB4ZnJtX2FsZ29fZGVzYyAqZWFsZyA9IHhmcm1fZWFsZ19nZXRfYnlpZHgoaSk7CisJCWlmICghZWFsZykKKwkJCWJyZWFrOworCQorCQlpZiAoIShlYWxnX3RtcGxfc2V0KHQsIGVhbGcpICYmIGVhbGctPmF2YWlsYWJsZSkpCisJCQljb250aW51ZTsKKwkJCQorCQlmb3IgKGsgPSAxOyA7IGsrKykgeworCQkJc3RydWN0IHNhZGJfY29tYiAqYzsKKwkJCXN0cnVjdCB4ZnJtX2FsZ29fZGVzYyAqYWFsZyA9IHhmcm1fYWFsZ19nZXRfYnlpZHgoayk7CisJCQlpZiAoIWFhbGcpCisJCQkJYnJlYWs7CisJCQlpZiAoIShhYWxnX3RtcGxfc2V0KHQsIGFhbGcpICYmIGFhbGctPmF2YWlsYWJsZSkpCisJCQkJY29udGludWU7CisJCQljID0gKHN0cnVjdCBzYWRiX2NvbWIqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IHNhZGJfY29tYikpOworCQkJbWVtc2V0KGMsIDAsIHNpemVvZigqYykpOworCQkJcC0+c2FkYl9wcm9wX2xlbiArPSBzaXplb2Yoc3RydWN0IHNhZGJfY29tYikvODsKKwkJCWMtPnNhZGJfY29tYl9hdXRoID0gYWFsZy0+ZGVzYy5zYWRiX2FsZ19pZDsKKwkJCWMtPnNhZGJfY29tYl9hdXRoX21pbmJpdHMgPSBhYWxnLT5kZXNjLnNhZGJfYWxnX21pbmJpdHM7CisJCQljLT5zYWRiX2NvbWJfYXV0aF9tYXhiaXRzID0gYWFsZy0+ZGVzYy5zYWRiX2FsZ19tYXhiaXRzOworCQkJYy0+c2FkYl9jb21iX2VuY3J5cHQgPSBlYWxnLT5kZXNjLnNhZGJfYWxnX2lkOworCQkJYy0+c2FkYl9jb21iX2VuY3J5cHRfbWluYml0cyA9IGVhbGctPmRlc2Muc2FkYl9hbGdfbWluYml0czsKKwkJCWMtPnNhZGJfY29tYl9lbmNyeXB0X21heGJpdHMgPSBlYWxnLT5kZXNjLnNhZGJfYWxnX21heGJpdHM7CisJCQljLT5zYWRiX2NvbWJfaGFyZF9hZGR0aW1lID0gMjQqNjAqNjA7CisJCQljLT5zYWRiX2NvbWJfc29mdF9hZGR0aW1lID0gMjAqNjAqNjA7CisJCQljLT5zYWRiX2NvbWJfaGFyZF91c2V0aW1lID0gOCo2MCo2MDsKKwkJCWMtPnNhZGJfY29tYl9zb2Z0X3VzZXRpbWUgPSA3KjYwKjYwOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHBma2V5X3NlbmRfbm90aWZ5KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBpbnQgaGFyZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqb3V0X3NrYjsKKwlzdHJ1Y3Qgc2FkYl9tc2cgKm91dF9oZHI7CisJaW50IGhzYyA9IChoYXJkID8gMiA6IDEpOworCisJb3V0X3NrYiA9IHBma2V5X3hmcm1fc3RhdGUybXNnKHgsIDAsIGhzYyk7CisJaWYgKElTX0VSUihvdXRfc2tiKSkKKwkJcmV0dXJuIFBUUl9FUlIob3V0X3NrYik7CisKKwlvdXRfaGRyID0gKHN0cnVjdCBzYWRiX21zZyAqKSBvdXRfc2tiLT5kYXRhOworCW91dF9oZHItPnNhZGJfbXNnX3ZlcnNpb24gPSBQRl9LRVlfVjI7CisJb3V0X2hkci0+c2FkYl9tc2dfdHlwZSA9IFNBREJfRVhQSVJFOworCW91dF9oZHItPnNhZGJfbXNnX3NhdHlwZSA9IHBma2V5X3Byb3RvMnNhdHlwZSh4LT5pZC5wcm90byk7CisJb3V0X2hkci0+c2FkYl9tc2dfZXJybm8gPSAwOworCW91dF9oZHItPnNhZGJfbXNnX3Jlc2VydmVkID0gMDsKKwlvdXRfaGRyLT5zYWRiX21zZ19zZXEgPSAwOworCW91dF9oZHItPnNhZGJfbXNnX3BpZCA9IDA7CisKKwlwZmtleV9icm9hZGNhc3Qob3V0X3NrYiwgR0ZQX0FUT01JQywgQlJPQURDQVNUX1JFR0lTVEVSRUQsIE5VTEwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIGdldF9hY3FzZXEodm9pZCkKK3sKKwl1MzIgcmVzOworCXN0YXRpYyB1MzIgYWNxc2VxOworCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWNxc2VxX2xvY2spOworCisJc3Bpbl9sb2NrX2JoKCZhY3FzZXFfbG9jayk7CisJcmVzID0gKCsrYWNxc2VxID8gOiArK2FjcXNlcSk7CisJc3Bpbl91bmxvY2tfYmgoJmFjcXNlcV9sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IHBma2V5X3NlbmRfYWNxdWlyZShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHhmcm1fdG1wbCAqdCwgc3RydWN0IHhmcm1fcG9saWN5ICp4cCwgaW50IGRpcikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBzYWRiX21zZyAqaGRyOworCXN0cnVjdCBzYWRiX2FkZHJlc3MgKmFkZHI7CisJc3RydWN0IHNhZGJfeF9wb2xpY3kgKnBvbDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42OworI2VuZGlmCisJaW50IHNvY2thZGRyX3NpemU7CisJaW50IHNpemU7CisJCisJc29ja2FkZHJfc2l6ZSA9IHBma2V5X3NvY2thZGRyX3NpemUoeC0+cHJvcHMuZmFtaWx5KTsKKwlpZiAoIXNvY2thZGRyX3NpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2FkYl9tc2cpICsKKwkJKHNpemVvZihzdHJ1Y3Qgc2FkYl9hZGRyZXNzKSAqIDIpICsKKwkJKHNvY2thZGRyX3NpemUgKiAyKSArCisJCXNpemVvZihzdHJ1Y3Qgc2FkYl94X3BvbGljeSk7CisJCisJaWYgKHgtPmlkLnByb3RvID09IElQUFJPVE9fQUgpCisJCXNpemUgKz0gY291bnRfYWhfY29tYnModCk7CisJZWxzZSBpZiAoeC0+aWQucHJvdG8gPT0gSVBQUk9UT19FU1ApCisJCXNpemUgKz0gY291bnRfZXNwX2NvbWJzKHQpOworCisJc2tiID0gIGFsbG9jX3NrYihzaXplICsgMTYsIEdGUF9BVE9NSUMpOworCWlmIChza2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJCisJaGRyID0gKHN0cnVjdCBzYWRiX21zZyAqKSBza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBzYWRiX21zZykpOworCWhkci0+c2FkYl9tc2dfdmVyc2lvbiA9IFBGX0tFWV9WMjsKKwloZHItPnNhZGJfbXNnX3R5cGUgPSBTQURCX0FDUVVJUkU7CisJaGRyLT5zYWRiX21zZ19zYXR5cGUgPSBwZmtleV9wcm90bzJzYXR5cGUoeC0+aWQucHJvdG8pOworCWhkci0+c2FkYl9tc2dfbGVuID0gc2l6ZSAvIHNpemVvZih1aW50NjRfdCk7CisJaGRyLT5zYWRiX21zZ19lcnJubyA9IDA7CisJaGRyLT5zYWRiX21zZ19yZXNlcnZlZCA9IDA7CisJaGRyLT5zYWRiX21zZ19zZXEgPSB4LT5rbS5zZXEgPSBnZXRfYWNxc2VxKCk7CisJaGRyLT5zYWRiX21zZ19waWQgPSAwOworCisJLyogc3JjIGFkZHJlc3MgKi8KKwlhZGRyID0gKHN0cnVjdCBzYWRiX2FkZHJlc3MqKSBza2JfcHV0KHNrYiwgCisJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc2FkYl9hZGRyZXNzKStzb2NrYWRkcl9zaXplKTsKKwlhZGRyLT5zYWRiX2FkZHJlc3NfbGVuID0gCisJCShzaXplb2Yoc3RydWN0IHNhZGJfYWRkcmVzcykrc29ja2FkZHJfc2l6ZSkvCisJCQlzaXplb2YodWludDY0X3QpOworCWFkZHItPnNhZGJfYWRkcmVzc19leHR0eXBlID0gU0FEQl9FWFRfQUREUkVTU19TUkM7CisJYWRkci0+c2FkYl9hZGRyZXNzX3Byb3RvID0gMDsKKwlhZGRyLT5zYWRiX2FkZHJlc3NfcmVzZXJ2ZWQgPSAwOworCWlmICh4LT5wcm9wcy5mYW1pbHkgPT0gQUZfSU5FVCkgeworCQlhZGRyLT5zYWRiX2FkZHJlc3NfcHJlZml4bGVuID0gMzI7CisKKwkJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAoYWRkciArIDEpOworCQlzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IHgtPnByb3BzLnNhZGRyLmE0OworCQlzaW4tPnNpbl9wb3J0ID0gMDsKKwkJbWVtc2V0KHNpbi0+c2luX3plcm8sIDAsIHNpemVvZihzaW4tPnNpbl96ZXJvKSk7CisJfQorI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCWVsc2UgaWYgKHgtPnByb3BzLmZhbWlseSA9PSBBRl9JTkVUNikgeworCQlhZGRyLT5zYWRiX2FkZHJlc3NfcHJlZml4bGVuID0gMTI4OworCisJCXNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSAoYWRkciArIDEpOworCQlzaW42LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQlzaW42LT5zaW42X3BvcnQgPSAwOworCQlzaW42LT5zaW42X2Zsb3dpbmZvID0gMDsKKwkJbWVtY3B5KCZzaW42LT5zaW42X2FkZHIsCisJCSAgICAgICB4LT5wcm9wcy5zYWRkci5hNiwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQlzaW42LT5zaW42X3Njb3BlX2lkID0gMDsKKwl9CisjZW5kaWYKKwllbHNlCisJCUJVRygpOworCQorCS8qIGRzdCBhZGRyZXNzICovCisJYWRkciA9IChzdHJ1Y3Qgc2FkYl9hZGRyZXNzKikgc2tiX3B1dChza2IsIAorCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHNhZGJfYWRkcmVzcykrc29ja2FkZHJfc2l6ZSk7CisJYWRkci0+c2FkYl9hZGRyZXNzX2xlbiA9CisJCShzaXplb2Yoc3RydWN0IHNhZGJfYWRkcmVzcykrc29ja2FkZHJfc2l6ZSkvCisJCQlzaXplb2YodWludDY0X3QpOworCWFkZHItPnNhZGJfYWRkcmVzc19leHR0eXBlID0gU0FEQl9FWFRfQUREUkVTU19EU1Q7CisJYWRkci0+c2FkYl9hZGRyZXNzX3Byb3RvID0gMDsKKwlhZGRyLT5zYWRiX2FkZHJlc3NfcmVzZXJ2ZWQgPSAwOworCWlmICh4LT5wcm9wcy5mYW1pbHkgPT0gQUZfSU5FVCkgeworCQlhZGRyLT5zYWRiX2FkZHJlc3NfcHJlZml4bGVuID0gMzI7IAorCisJCXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgKGFkZHIgKyAxKTsKKwkJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSB4LT5pZC5kYWRkci5hNDsKKwkJc2luLT5zaW5fcG9ydCA9IDA7CisJCW1lbXNldChzaW4tPnNpbl96ZXJvLCAwLCBzaXplb2Yoc2luLT5zaW5femVybykpOworCX0KKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwllbHNlIGlmICh4LT5wcm9wcy5mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJYWRkci0+c2FkYl9hZGRyZXNzX3ByZWZpeGxlbiA9IDEyODsgCisKKwkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIChhZGRyICsgMSk7CisJCXNpbjYtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJCXNpbjYtPnNpbjZfcG9ydCA9IDA7CisJCXNpbjYtPnNpbjZfZmxvd2luZm8gPSAwOworCQltZW1jcHkoJnNpbjYtPnNpbjZfYWRkciwKKwkJICAgICAgIHgtPmlkLmRhZGRyLmE2LCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisJCXNpbjYtPnNpbjZfc2NvcGVfaWQgPSAwOworCX0KKyNlbmRpZgorCWVsc2UKKwkJQlVHKCk7CisKKwlwb2wgPSAoc3RydWN0IHNhZGJfeF9wb2xpY3kgKikgIHNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IHNhZGJfeF9wb2xpY3kpKTsKKwlwb2wtPnNhZGJfeF9wb2xpY3lfbGVuID0gc2l6ZW9mKHN0cnVjdCBzYWRiX3hfcG9saWN5KS9zaXplb2YodWludDY0X3QpOworCXBvbC0+c2FkYl94X3BvbGljeV9leHR0eXBlID0gU0FEQl9YX0VYVF9QT0xJQ1k7CisJcG9sLT5zYWRiX3hfcG9saWN5X3R5cGUgPSBJUFNFQ19QT0xJQ1lfSVBTRUM7CisJcG9sLT5zYWRiX3hfcG9saWN5X2RpciA9IGRpcisxOworCXBvbC0+c2FkYl94X3BvbGljeV9pZCA9IHhwLT5pbmRleDsKKworCS8qIFNldCBzYWRiX2NvbWIncy4gKi8KKwlpZiAoeC0+aWQucHJvdG8gPT0gSVBQUk9UT19BSCkKKwkJZHVtcF9haF9jb21icyhza2IsIHQpOworCWVsc2UgaWYgKHgtPmlkLnByb3RvID09IElQUFJPVE9fRVNQKQorCQlkdW1wX2VzcF9jb21icyhza2IsIHQpOworCisJcmV0dXJuIHBma2V5X2Jyb2FkY2FzdChza2IsIEdGUF9BVE9NSUMsIEJST0FEQ0FTVF9SRUdJU1RFUkVELCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCB4ZnJtX3BvbGljeSAqcGZrZXlfY29tcGlsZV9wb2xpY3kodTE2IGZhbWlseSwgaW50IG9wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpkYXRhLCBpbnQgbGVuLCBpbnQgKmRpcikKK3sKKwlzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwOworCXN0cnVjdCBzYWRiX3hfcG9saWN5ICpwb2wgPSAoc3RydWN0IHNhZGJfeF9wb2xpY3kqKWRhdGE7CisKKwlzd2l0Y2ggKGZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJaWYgKG9wdCAhPSBJUF9JUFNFQ19QT0xJQ1kpIHsKKwkJCSpkaXIgPSAtRU9QTk9UU1VQUDsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWJyZWFrOworI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCWNhc2UgQUZfSU5FVDY6CisJCWlmIChvcHQgIT0gSVBWNl9JUFNFQ19QT0xJQ1kpIHsKKwkJCSpkaXIgPSAtRU9QTk9UU1VQUDsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJKmRpciA9IC1FSU5WQUw7CisJCXJldHVybiBOVUxMOworCX0KKworCSpkaXIgPSAtRUlOVkFMOworCisJaWYgKGxlbiA8IHNpemVvZihzdHJ1Y3Qgc2FkYl94X3BvbGljeSkgfHwKKwkgICAgcG9sLT5zYWRiX3hfcG9saWN5X2xlbio4ID4gbGVuIHx8CisJICAgIHBvbC0+c2FkYl94X3BvbGljeV90eXBlID4gSVBTRUNfUE9MSUNZX0JZUEFTUyB8fAorCSAgICAoIXBvbC0+c2FkYl94X3BvbGljeV9kaXIgfHwgcG9sLT5zYWRiX3hfcG9saWN5X2RpciA+IElQU0VDX0RJUl9PVVRCT1VORCkpCisJCXJldHVybiBOVUxMOworCisJeHAgPSB4ZnJtX3BvbGljeV9hbGxvYyhHRlBfQVRPTUlDKTsKKwlpZiAoeHAgPT0gTlVMTCkgeworCQkqZGlyID0gLUVOT0JVRlM7CisJCXJldHVybiBOVUxMOworCX0KKworCXhwLT5hY3Rpb24gPSAocG9sLT5zYWRiX3hfcG9saWN5X3R5cGUgPT0gSVBTRUNfUE9MSUNZX0RJU0NBUkQgPworCQkgICAgICBYRlJNX1BPTElDWV9CTE9DSyA6IFhGUk1fUE9MSUNZX0FMTE9XKTsKKworCXhwLT5sZnQuc29mdF9ieXRlX2xpbWl0ID0gWEZSTV9JTkY7CisJeHAtPmxmdC5oYXJkX2J5dGVfbGltaXQgPSBYRlJNX0lORjsKKwl4cC0+bGZ0LnNvZnRfcGFja2V0X2xpbWl0ID0gWEZSTV9JTkY7CisJeHAtPmxmdC5oYXJkX3BhY2tldF9saW1pdCA9IFhGUk1fSU5GOworCXhwLT5mYW1pbHkgPSBmYW1pbHk7CisKKwl4cC0+eGZybV9uciA9IDA7CisJaWYgKHBvbC0+c2FkYl94X3BvbGljeV90eXBlID09IElQU0VDX1BPTElDWV9JUFNFQyAmJgorCSAgICAoKmRpciA9IHBhcnNlX2lwc2VjcmVxdWVzdHMoeHAsIHBvbCkpIDwgMCkKKwkJZ290byBvdXQ7CisKKwkqZGlyID0gcG9sLT5zYWRiX3hfcG9saWN5X2Rpci0xOworCXJldHVybiB4cDsKKworb3V0OgorCWtmcmVlKHhwKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBwZmtleV9zZW5kX25ld19tYXBwaW5nKHN0cnVjdCB4ZnJtX3N0YXRlICp4LCB4ZnJtX2FkZHJlc3NfdCAqaXBhZGRyLCB1MTYgc3BvcnQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgc2FkYl9tc2cgKmhkcjsKKwlzdHJ1Y3Qgc2FkYl9zYSAqc2E7CisJc3RydWN0IHNhZGJfYWRkcmVzcyAqYWRkcjsKKwlzdHJ1Y3Qgc2FkYl94X25hdF90X3BvcnQgKm5fcG9ydDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42OworI2VuZGlmCisJaW50IHNvY2thZGRyX3NpemU7CisJaW50IHNpemU7CisJX191OCBzYXR5cGUgPSAoeC0+aWQucHJvdG8gPT0gSVBQUk9UT19FU1AgPyBTQURCX1NBVFlQRV9FU1AgOiAwKTsKKwlzdHJ1Y3QgeGZybV9lbmNhcF90bXBsICpuYXR0ID0gTlVMTDsKKworCXNvY2thZGRyX3NpemUgPSBwZmtleV9zb2NrYWRkcl9zaXplKHgtPnByb3BzLmZhbWlseSk7CisJaWYgKCFzb2NrYWRkcl9zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghc2F0eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgheC0+ZW5jYXApCisJCXJldHVybiAtRUlOVkFMOworCisJbmF0dCA9IHgtPmVuY2FwOworCisJLyogQnVpbGQgYW4gU0FEQl9YX05BVF9UX05FV19NQVBQSU5HIG1lc3NhZ2U6CisJICoKKwkgKiBIRFIgfCBTQSB8IEFERFJFU1NfU1JDIChvbGQgYWRkcikgfCBOQVRfVF9TUE9SVCAob2xkIHBvcnQpIHwKKwkgKiBBRERSRVNTX0RTVCAobmV3IGFkZHIpIHwgTkFUX1RfRFBPUlQgKG5ldyBwb3J0KQorCSAqLworCQorCXNpemUgPSBzaXplb2Yoc3RydWN0IHNhZGJfbXNnKSArCisJCXNpemVvZihzdHJ1Y3Qgc2FkYl9zYSkgKworCQkoc2l6ZW9mKHN0cnVjdCBzYWRiX2FkZHJlc3MpICogMikgKworCQkoc29ja2FkZHJfc2l6ZSAqIDIpICsKKwkJKHNpemVvZihzdHJ1Y3Qgc2FkYl94X25hdF90X3BvcnQpICogMik7CisJCisJc2tiID0gIGFsbG9jX3NrYihzaXplICsgMTYsIEdGUF9BVE9NSUMpOworCWlmIChza2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJCisJaGRyID0gKHN0cnVjdCBzYWRiX21zZyAqKSBza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBzYWRiX21zZykpOworCWhkci0+c2FkYl9tc2dfdmVyc2lvbiA9IFBGX0tFWV9WMjsKKwloZHItPnNhZGJfbXNnX3R5cGUgPSBTQURCX1hfTkFUX1RfTkVXX01BUFBJTkc7CisJaGRyLT5zYWRiX21zZ19zYXR5cGUgPSBzYXR5cGU7CisJaGRyLT5zYWRiX21zZ19sZW4gPSBzaXplIC8gc2l6ZW9mKHVpbnQ2NF90KTsKKwloZHItPnNhZGJfbXNnX2Vycm5vID0gMDsKKwloZHItPnNhZGJfbXNnX3Jlc2VydmVkID0gMDsKKwloZHItPnNhZGJfbXNnX3NlcSA9IHgtPmttLnNlcSA9IGdldF9hY3FzZXEoKTsKKwloZHItPnNhZGJfbXNnX3BpZCA9IDA7CisKKwkvKiBTQSAqLworCXNhID0gKHN0cnVjdCBzYWRiX3NhICopIHNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IHNhZGJfc2EpKTsKKwlzYS0+c2FkYl9zYV9sZW4gPSBzaXplb2Yoc3RydWN0IHNhZGJfc2EpL3NpemVvZih1aW50NjRfdCk7CisJc2EtPnNhZGJfc2FfZXh0dHlwZSA9IFNBREJfRVhUX1NBOworCXNhLT5zYWRiX3NhX3NwaSA9IHgtPmlkLnNwaTsKKwlzYS0+c2FkYl9zYV9yZXBsYXkgPSAwOworCXNhLT5zYWRiX3NhX3N0YXRlID0gMDsKKwlzYS0+c2FkYl9zYV9hdXRoID0gMDsKKwlzYS0+c2FkYl9zYV9lbmNyeXB0ID0gMDsKKwlzYS0+c2FkYl9zYV9mbGFncyA9IDA7CisKKwkvKiBBRERSRVNTX1NSQyAob2xkIGFkZHIpICovCisJYWRkciA9IChzdHJ1Y3Qgc2FkYl9hZGRyZXNzKikKKwkJc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3Qgc2FkYl9hZGRyZXNzKStzb2NrYWRkcl9zaXplKTsKKwlhZGRyLT5zYWRiX2FkZHJlc3NfbGVuID0gCisJCShzaXplb2Yoc3RydWN0IHNhZGJfYWRkcmVzcykrc29ja2FkZHJfc2l6ZSkvCisJCQlzaXplb2YodWludDY0X3QpOworCWFkZHItPnNhZGJfYWRkcmVzc19leHR0eXBlID0gU0FEQl9FWFRfQUREUkVTU19TUkM7CisJYWRkci0+c2FkYl9hZGRyZXNzX3Byb3RvID0gMDsKKwlhZGRyLT5zYWRiX2FkZHJlc3NfcmVzZXJ2ZWQgPSAwOworCWlmICh4LT5wcm9wcy5mYW1pbHkgPT0gQUZfSU5FVCkgeworCQlhZGRyLT5zYWRiX2FkZHJlc3NfcHJlZml4bGVuID0gMzI7CisKKwkJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAoYWRkciArIDEpOworCQlzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IHgtPnByb3BzLnNhZGRyLmE0OworCQlzaW4tPnNpbl9wb3J0ID0gMDsKKwkJbWVtc2V0KHNpbi0+c2luX3plcm8sIDAsIHNpemVvZihzaW4tPnNpbl96ZXJvKSk7CisJfQorI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCWVsc2UgaWYgKHgtPnByb3BzLmZhbWlseSA9PSBBRl9JTkVUNikgeworCQlhZGRyLT5zYWRiX2FkZHJlc3NfcHJlZml4bGVuID0gMTI4OworCisJCXNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSAoYWRkciArIDEpOworCQlzaW42LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQlzaW42LT5zaW42X3BvcnQgPSAwOworCQlzaW42LT5zaW42X2Zsb3dpbmZvID0gMDsKKwkJbWVtY3B5KCZzaW42LT5zaW42X2FkZHIsCisJCSAgICAgICB4LT5wcm9wcy5zYWRkci5hNiwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQlzaW42LT5zaW42X3Njb3BlX2lkID0gMDsKKwl9CisjZW5kaWYKKwllbHNlCisJCUJVRygpOworCisJLyogTkFUX1RfU1BPUlQgKG9sZCBwb3J0KSAqLworCW5fcG9ydCA9IChzdHJ1Y3Qgc2FkYl94X25hdF90X3BvcnQqKSBza2JfcHV0KHNrYiwgc2l6ZW9mICgqbl9wb3J0KSk7CisJbl9wb3J0LT5zYWRiX3hfbmF0X3RfcG9ydF9sZW4gPSBzaXplb2YoKm5fcG9ydCkvc2l6ZW9mKHVpbnQ2NF90KTsKKwluX3BvcnQtPnNhZGJfeF9uYXRfdF9wb3J0X2V4dHR5cGUgPSBTQURCX1hfRVhUX05BVF9UX1NQT1JUOworCW5fcG9ydC0+c2FkYl94X25hdF90X3BvcnRfcG9ydCA9IG5hdHQtPmVuY2FwX3Nwb3J0OworCW5fcG9ydC0+c2FkYl94X25hdF90X3BvcnRfcmVzZXJ2ZWQgPSAwOworCisJLyogQUREUkVTU19EU1QgKG5ldyBhZGRyKSAqLworCWFkZHIgPSAoc3RydWN0IHNhZGJfYWRkcmVzcyopCisJCXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IHNhZGJfYWRkcmVzcykrc29ja2FkZHJfc2l6ZSk7CisJYWRkci0+c2FkYl9hZGRyZXNzX2xlbiA9IAorCQkoc2l6ZW9mKHN0cnVjdCBzYWRiX2FkZHJlc3MpK3NvY2thZGRyX3NpemUpLworCQkJc2l6ZW9mKHVpbnQ2NF90KTsKKwlhZGRyLT5zYWRiX2FkZHJlc3NfZXh0dHlwZSA9IFNBREJfRVhUX0FERFJFU1NfRFNUOworCWFkZHItPnNhZGJfYWRkcmVzc19wcm90byA9IDA7CisJYWRkci0+c2FkYl9hZGRyZXNzX3Jlc2VydmVkID0gMDsKKwlpZiAoeC0+cHJvcHMuZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJYWRkci0+c2FkYl9hZGRyZXNzX3ByZWZpeGxlbiA9IDMyOworCisJCXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgKGFkZHIgKyAxKTsKKwkJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSBpcGFkZHItPmE0OworCQlzaW4tPnNpbl9wb3J0ID0gMDsKKwkJbWVtc2V0KHNpbi0+c2luX3plcm8sIDAsIHNpemVvZihzaW4tPnNpbl96ZXJvKSk7CisJfQorI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCWVsc2UgaWYgKHgtPnByb3BzLmZhbWlseSA9PSBBRl9JTkVUNikgeworCQlhZGRyLT5zYWRiX2FkZHJlc3NfcHJlZml4bGVuID0gMTI4OworCisJCXNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSAoYWRkciArIDEpOworCQlzaW42LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQlzaW42LT5zaW42X3BvcnQgPSAwOworCQlzaW42LT5zaW42X2Zsb3dpbmZvID0gMDsKKwkJbWVtY3B5KCZzaW42LT5zaW42X2FkZHIsICZpcGFkZHItPmE2LCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisJCXNpbjYtPnNpbjZfc2NvcGVfaWQgPSAwOworCX0KKyNlbmRpZgorCWVsc2UKKwkJQlVHKCk7CisKKwkvKiBOQVRfVF9EUE9SVCAobmV3IHBvcnQpICovCisJbl9wb3J0ID0gKHN0cnVjdCBzYWRiX3hfbmF0X3RfcG9ydCopIHNrYl9wdXQoc2tiLCBzaXplb2YgKCpuX3BvcnQpKTsKKwluX3BvcnQtPnNhZGJfeF9uYXRfdF9wb3J0X2xlbiA9IHNpemVvZigqbl9wb3J0KS9zaXplb2YodWludDY0X3QpOworCW5fcG9ydC0+c2FkYl94X25hdF90X3BvcnRfZXh0dHlwZSA9IFNBREJfWF9FWFRfTkFUX1RfRFBPUlQ7CisJbl9wb3J0LT5zYWRiX3hfbmF0X3RfcG9ydF9wb3J0ID0gc3BvcnQ7CisJbl9wb3J0LT5zYWRiX3hfbmF0X3RfcG9ydF9yZXNlcnZlZCA9IDA7CisKKwlyZXR1cm4gcGZrZXlfYnJvYWRjYXN0KHNrYiwgR0ZQX0FUT01JQywgQlJPQURDQVNUX1JFR0lTVEVSRUQsIE5VTEwpOworfQorCitzdGF0aWMgaW50IHBma2V5X3NlbmRtc2coc3RydWN0IGtpb2NiICpraW9jYiwKKwkJCSBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJc3RydWN0IHNhZGJfbXNnICpoZHIgPSBOVUxMOworCWludCBlcnI7CisKKwllcnIgPSAtRU9QTk9UU1VQUDsKKwlpZiAobXNnLT5tc2dfZmxhZ3MgJiBNU0dfT09CKQorCQlnb3RvIG91dDsKKworCWVyciA9IC1FTVNHU0laRTsKKwlpZiAoKHVuc2lnbmVkKWxlbiA+IHNrLT5za19zbmRidWYgLSAzMikKKwkJZ290byBvdXQ7CisKKwllcnIgPSAtRU5PQlVGUzsKKwlza2IgPSBhbGxvY19za2IobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2tiID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVGQVVMVDsKKwlpZiAobWVtY3B5X2Zyb21pb3ZlYyhza2JfcHV0KHNrYixsZW4pLCBtc2ctPm1zZ19pb3YsIGxlbikpCisJCWdvdG8gb3V0OworCisJaGRyID0gcGZrZXlfZ2V0X2Jhc2VfbXNnKHNrYiwgJmVycik7CisJaWYgKCFoZHIpCisJCWdvdG8gb3V0OworCisJZG93bigmeGZybV9jZmdfc2VtKTsKKwllcnIgPSBwZmtleV9wcm9jZXNzKHNrLCBza2IsIGhkcik7CisJdXAoJnhmcm1fY2ZnX3NlbSk7CisKK291dDoKKwlpZiAoZXJyICYmIGhkciAmJiBwZmtleV9lcnJvcihoZHIsIGVyciwgc2spID09IDApCisJCWVyciA9IDA7CisJaWYgKHNrYikKKwkJa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gZXJyID8gOiBsZW47Cit9CisKK3N0YXRpYyBpbnQgcGZrZXlfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmtpb2NiLAorCQkJIHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwKKwkJCSBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgY29waWVkLCBlcnI7CisKKwllcnIgPSAtRUlOVkFMOworCWlmIChmbGFncyAmIH4oTVNHX1BFRUt8TVNHX0RPTlRXQUlUfE1TR19UUlVOQ3xNU0dfQ01TR19DT01QQVQpKQorCQlnb3RvIG91dDsKKworCW1zZy0+bXNnX25hbWVsZW4gPSAwOworCXNrYiA9IHNrYl9yZWN2X2RhdGFncmFtKHNrLCBmbGFncywgZmxhZ3MgJiBNU0dfRE9OVFdBSVQsICZlcnIpOworCWlmIChza2IgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwljb3BpZWQgPSBza2ItPmxlbjsKKwlpZiAoY29waWVkID4gbGVuKSB7CisJCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19UUlVOQzsKKwkJY29waWVkID0gbGVuOworCX0KKworCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCAwLCBtc2ctPm1zZ19pb3YsIGNvcGllZCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZTsKKworCXNvY2tfcmVjdl90aW1lc3RhbXAobXNnLCBzaywgc2tiKTsKKworCWVyciA9IChmbGFncyAmIE1TR19UUlVOQykgPyBza2ItPmxlbiA6IGNvcGllZDsKKworb3V0X2ZyZWU6CisJc2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgcGZrZXlfb3BzID0geworCS5mYW1pbHkJCT0JUEZfS0VZLAorCS5vd25lcgkJPQlUSElTX01PRFVMRSwKKwkvKiBPcGVyYXRpb25zIHRoYXQgbWFrZSBubyBzZW5zZSBvbiBwZmtleSBzb2NrZXRzLiAqLworCS5iaW5kCQk9CXNvY2tfbm9fYmluZCwKKwkuY29ubmVjdAk9CXNvY2tfbm9fY29ubmVjdCwKKwkuc29ja2V0cGFpcgk9CXNvY2tfbm9fc29ja2V0cGFpciwKKwkuYWNjZXB0CQk9CXNvY2tfbm9fYWNjZXB0LAorCS5nZXRuYW1lCT0Jc29ja19ub19nZXRuYW1lLAorCS5pb2N0bAkJPQlzb2NrX25vX2lvY3RsLAorCS5saXN0ZW4JCT0Jc29ja19ub19saXN0ZW4sCisJLnNodXRkb3duCT0Jc29ja19ub19zaHV0ZG93biwKKwkuc2V0c29ja29wdAk9CXNvY2tfbm9fc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdAk9CXNvY2tfbm9fZ2V0c29ja29wdCwKKwkubW1hcAkJPQlzb2NrX25vX21tYXAsCisJLnNlbmRwYWdlCT0Jc29ja19ub19zZW5kcGFnZSwKKworCS8qIE5vdyB0aGUgb3BlcmF0aW9ucyB0aGF0IHJlYWxseSBvY2N1ci4gKi8KKwkucmVsZWFzZQk9CXBma2V5X3JlbGVhc2UsCisJLnBvbGwJCT0JZGF0YWdyYW1fcG9sbCwKKwkuc2VuZG1zZwk9CXBma2V5X3NlbmRtc2csCisJLnJlY3Ztc2cJPQlwZmtleV9yZWN2bXNnLAorfTsKKworc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5IHBma2V5X2ZhbWlseV9vcHMgPSB7CisJLmZhbWlseQk9CVBGX0tFWSwKKwkuY3JlYXRlCT0JcGZrZXlfY3JlYXRlLAorCS5vd25lcgk9CVRISVNfTU9EVUxFLAorfTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgaW50IHBma2V5X3JlYWRfcHJvYyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJICAgaW50IGxlbmd0aCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJb2ZmX3QgcG9zID0gMDsKKwlvZmZfdCBiZWdpbiA9IDA7CisJaW50IGxlbiA9IDA7CisJc3RydWN0IHNvY2sgKnM7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIsInNrICAgICAgIFJlZkNudCBSbWVtICAgV21lbSAgIFVzZXIgICBJbm9kZVxuIik7CisKKwlyZWFkX2xvY2soJnBma2V5X3RhYmxlX2xvY2spOworCisJc2tfZm9yX2VhY2gocywgbm9kZSwgJnBma2V5X3RhYmxlKSB7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZmZlcitsZW4sIiVwICUtNmQgJS02dSAlLTZ1ICUtNnUgJS02bHUiLAorCQkJICAgICAgIHMsCisJCQkgICAgICAgYXRvbWljX3JlYWQoJnMtPnNrX3JlZmNudCksCisJCQkgICAgICAgYXRvbWljX3JlYWQoJnMtPnNrX3JtZW1fYWxsb2MpLAorCQkJICAgICAgIGF0b21pY19yZWFkKCZzLT5za193bWVtX2FsbG9jKSwKKwkJCSAgICAgICBzb2NrX2lfdWlkKHMpLAorCQkJICAgICAgIHNvY2tfaV9pbm8ocykKKwkJCSAgICAgICApOworCisJCWJ1ZmZlcltsZW4rK10gPSAnXG4nOworCQkKKwkJcG9zID0gYmVnaW4gKyBsZW47CisJCWlmIChwb3MgPCBvZmZzZXQpIHsKKwkJCWxlbiA9IDA7CisJCQliZWdpbiA9IHBvczsKKwkJfQorCQlpZihwb3MgPiBvZmZzZXQgKyBsZW5ndGgpCisJCQlnb3RvIGRvbmU7CisJfQorCSplb2YgPSAxOworCitkb25lOgorCXJlYWRfdW5sb2NrKCZwZmtleV90YWJsZV9sb2NrKTsKKworCSpzdGFydCA9IGJ1ZmZlciArIChvZmZzZXQgLSBiZWdpbik7CisJbGVuIC09IChvZmZzZXQgLSBiZWdpbik7CisKKwlpZiAobGVuID4gbGVuZ3RoKQorCQlsZW4gPSBsZW5ndGg7CisJaWYgKGxlbiA8IDApCisJCWxlbiA9IDA7CisKKwlyZXR1cm4gbGVuOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgeGZybV9tZ3IgcGZrZXl2Ml9tZ3IgPQoreworCS5pZAkJPSAicGZrZXl2MiIsCisJLm5vdGlmeQkJPSBwZmtleV9zZW5kX25vdGlmeSwKKwkuYWNxdWlyZQk9IHBma2V5X3NlbmRfYWNxdWlyZSwKKwkuY29tcGlsZV9wb2xpY3kJPSBwZmtleV9jb21waWxlX3BvbGljeSwKKwkubmV3X21hcHBpbmcJPSBwZmtleV9zZW5kX25ld19tYXBwaW5nLAorfTsKKworc3RhdGljIHZvaWQgX19leGl0IGlwc2VjX3Bma2V5X2V4aXQodm9pZCkKK3sKKwl4ZnJtX3VucmVnaXN0ZXJfa20oJnBma2V5djJfbWdyKTsKKwlyZW1vdmVfcHJvY19lbnRyeSgibmV0L3Bma2V5IiwgTlVMTCk7CisJc29ja191bnJlZ2lzdGVyKFBGX0tFWSk7CisJcHJvdG9fdW5yZWdpc3Rlcigma2V5X3Byb3RvKTsKK30KKworc3RhdGljIGludCBfX2luaXQgaXBzZWNfcGZrZXlfaW5pdCh2b2lkKQoreworCWludCBlcnIgPSBwcm90b19yZWdpc3Rlcigma2V5X3Byb3RvLCAwKTsKKworCWlmIChlcnIgIT0gMCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBzb2NrX3JlZ2lzdGVyKCZwZmtleV9mYW1pbHlfb3BzKTsKKwlpZiAoZXJyICE9IDApCisJCWdvdG8gb3V0X3VucmVnaXN0ZXJfa2V5X3Byb3RvOworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJZXJyID0gLUVOT01FTTsKKwlpZiAoY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgibmV0L3Bma2V5IiwgMCwgTlVMTCwgcGZrZXlfcmVhZF9wcm9jLCBOVUxMKSA9PSBOVUxMKQorCQlnb3RvIG91dF9zb2NrX3VucmVnaXN0ZXI7CisjZW5kaWYKKwllcnIgPSB4ZnJtX3JlZ2lzdGVyX2ttKCZwZmtleXYyX21ncik7CisJaWYgKGVyciAhPSAwKQorCQlnb3RvIG91dF9yZW1vdmVfcHJvY19lbnRyeTsKK291dDoKKwlyZXR1cm4gZXJyOworb3V0X3JlbW92ZV9wcm9jX2VudHJ5OgorI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJcmVtb3ZlX3Byb2NfZW50cnkoIm5ldC9wZmtleSIsIE5VTEwpOworb3V0X3NvY2tfdW5yZWdpc3RlcjoKKyNlbmRpZgorCXNvY2tfdW5yZWdpc3RlcihQRl9LRVkpOworb3V0X3VucmVnaXN0ZXJfa2V5X3Byb3RvOgorCXByb3RvX3VucmVnaXN0ZXIoJmtleV9wcm90byk7CisJZ290byBvdXQ7Cit9CisKK21vZHVsZV9pbml0KGlwc2VjX3Bma2V5X2luaXQpOworbW9kdWxlX2V4aXQoaXBzZWNfcGZrZXlfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTkVUUFJPVE8oUEZfS0VZKTsKZGlmZiAtLWdpdCBhL25ldC9sYXBiL01ha2VmaWxlIGIvbmV0L2xhcGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmN2M5MAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9sYXBiL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IExBUEIgbGF5ZXIuCisjCisKK29iai0kKENPTkZJR19MQVBCKSArPSBsYXBiLm8KKworbGFwYi1vYmpzIDo9IGxhcGJfaW4ubyBsYXBiX291dC5vIGxhcGJfc3Vici5vIGxhcGJfdGltZXIubyBsYXBiX2lmYWNlLm8KZGlmZiAtLWdpdCBhL25ldC9sYXBiL2xhcGJfaWZhY2UuYyBiL25ldC9sYXBiL2xhcGJfaWZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWE2NjE2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2xhcGIvbGFwYl9pZmFjZS5jCkBAIC0wLDAgKzEsNDQ5IEBACisvKgorICoJTEFQQiByZWxlYXNlIDAwMgorICoKKyAqCVRoaXMgY29kZSBSRVFVSVJFUyAyLjEuMTUgb3IgaGlnaGVyLyBORVQzLjAzOAorICoKKyAqCVRoaXMgbW9kdWxlOgorICoJCVRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglIaXN0b3J5CisgKglMQVBCIDAwMQlKb25hdGhhbiBOYXlsb3IJU3RhcnRlZCBDb2RpbmcKKyAqCUxBUEIgMDAyCUpvbmF0aGFuIE5heWxvcglOZXcgdGltZXIgYXJjaGl0ZWN0dXJlLgorICoJMjAwMC0xMC0yOQlIZW5uZXIgRWlzZW4JbGFwYl9kYXRhX2luZGljYXRpb24oKSByZXR1cm4gc3RhdHVzLgorICovCisgCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPG5ldC9sYXBiLmg+CisKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGxhcGJfbGlzdCA9IExJU1RfSEVBRF9JTklUKGxhcGJfbGlzdCk7CitzdGF0aWMgREVGSU5FX1JXTE9DSyhsYXBiX2xpc3RfbG9jayk7CisKKy8qCisgKglGcmVlIGFuIGFsbG9jYXRlZCBsYXBiIGNvbnRyb2wgYmxvY2suIAorICovCitzdGF0aWMgdm9pZCBsYXBiX2ZyZWVfY2Ioc3RydWN0IGxhcGJfY2IgKmxhcGIpCit7CisJa2ZyZWUobGFwYik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbGFwYl9ob2xkKHN0cnVjdCBsYXBiX2NiICpsYXBiKQoreworCWF0b21pY19pbmMoJmxhcGItPnJlZmNudCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbGFwYl9wdXQoc3RydWN0IGxhcGJfY2IgKmxhcGIpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmxhcGItPnJlZmNudCkpCisJCWxhcGJfZnJlZV9jYihsYXBiKTsKK30KKworLyoKKyAqCVNvY2tldCByZW1vdmFsIGR1cmluZyBhbiBpbnRlcnJ1cHQgaXMgbm93IHNhZmUuCisgKi8KK3N0YXRpYyB2b2lkIF9fbGFwYl9yZW1vdmVfY2Ioc3RydWN0IGxhcGJfY2IgKmxhcGIpCit7CisJaWYgKGxhcGItPm5vZGUubmV4dCkgeworCQlsaXN0X2RlbCgmbGFwYi0+bm9kZSk7CisJCWxhcGJfcHV0KGxhcGIpOworCX0KK30KKworLyoKKyAqCUFkZCBhIHNvY2tldCB0byB0aGUgYm91bmQgc29ja2V0cyBsaXN0LgorICovCitzdGF0aWMgdm9pZCBfX2xhcGJfaW5zZXJ0X2NiKHN0cnVjdCBsYXBiX2NiICpsYXBiKQoreworCWxpc3RfYWRkKCZsYXBiLT5ub2RlLCAmbGFwYl9saXN0KTsKKwlsYXBiX2hvbGQobGFwYik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGFwYl9jYiAqX19sYXBiX2RldnRvc3RydWN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisJc3RydWN0IGxhcGJfY2IgKmxhcGIsICp1c2UgPSBOVUxMOworCisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmxhcGJfbGlzdCkgeworCQlsYXBiID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGxhcGJfY2IsIG5vZGUpOworCQlpZiAobGFwYi0+ZGV2ID09IGRldikgeworCQkJdXNlID0gbGFwYjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHVzZSkKKwkJbGFwYl9ob2xkKHVzZSk7CisKKwlyZXR1cm4gdXNlOworfQorCitzdGF0aWMgc3RydWN0IGxhcGJfY2IgKmxhcGJfZGV2dG9zdHJ1Y3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFwYl9jYiAqcmM7CisKKwlyZWFkX2xvY2tfYmgoJmxhcGJfbGlzdF9sb2NrKTsKKwlyYyA9IF9fbGFwYl9kZXZ0b3N0cnVjdChkZXYpOworCXJlYWRfdW5sb2NrX2JoKCZsYXBiX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisvKgorICoJQ3JlYXRlIGFuIGVtcHR5IExBUEIgY29udHJvbCBibG9jay4KKyAqLworc3RhdGljIHN0cnVjdCBsYXBiX2NiICpsYXBiX2NyZWF0ZV9jYih2b2lkKQoreworCXN0cnVjdCBsYXBiX2NiICpsYXBiID0ga21hbGxvYyhzaXplb2YoKmxhcGIpLCBHRlBfQVRPTUlDKTsKKworCisJaWYgKCFsYXBiKQorCQlnb3RvIG91dDsKKworCW1lbXNldChsYXBiLCAweDAwLCBzaXplb2YoKmxhcGIpKTsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmxhcGItPndyaXRlX3F1ZXVlKTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZsYXBiLT5hY2tfcXVldWUpOworCisJaW5pdF90aW1lcigmbGFwYi0+dDF0aW1lcik7CisJaW5pdF90aW1lcigmbGFwYi0+dDJ0aW1lcik7CisKKwlsYXBiLT50MSAgICAgID0gTEFQQl9ERUZBVUxUX1QxOworCWxhcGItPnQyICAgICAgPSBMQVBCX0RFRkFVTFRfVDI7CisJbGFwYi0+bjIgICAgICA9IExBUEJfREVGQVVMVF9OMjsKKwlsYXBiLT5tb2RlICAgID0gTEFQQl9ERUZBVUxUX01PREU7CisJbGFwYi0+d2luZG93ICA9IExBUEJfREVGQVVMVF9XSU5ET1c7CisJbGFwYi0+c3RhdGUgICA9IExBUEJfU1RBVEVfMDsKKwlhdG9taWNfc2V0KCZsYXBiLT5yZWZjbnQsIDEpOworb3V0OgorCXJldHVybiBsYXBiOworfQorCitpbnQgbGFwYl9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbGFwYl9yZWdpc3Rlcl9zdHJ1Y3QgKmNhbGxiYWNrcykKK3sKKwlzdHJ1Y3QgbGFwYl9jYiAqbGFwYjsKKwlpbnQgcmMgPSBMQVBCX0JBRFRPS0VOOworCisJd3JpdGVfbG9ja19iaCgmbGFwYl9saXN0X2xvY2spOworCisJbGFwYiA9IF9fbGFwYl9kZXZ0b3N0cnVjdChkZXYpOworCWlmIChsYXBiKSB7CisJCWxhcGJfcHV0KGxhcGIpOworCQlnb3RvIG91dDsKKwl9CisKKwlsYXBiID0gbGFwYl9jcmVhdGVfY2IoKTsKKwlyYyA9IExBUEJfTk9NRU07CisJaWYgKCFsYXBiKQorCQlnb3RvIG91dDsKKworCWxhcGItPmRldiAgICAgICA9IGRldjsKKwlsYXBiLT5jYWxsYmFja3MgPSAqY2FsbGJhY2tzOworCisJX19sYXBiX2luc2VydF9jYihsYXBiKTsKKworCWxhcGJfc3RhcnRfdDF0aW1lcihsYXBiKTsKKworCXJjID0gTEFQQl9PSzsKK291dDoKKwl3cml0ZV91bmxvY2tfYmgoJmxhcGJfbGlzdF9sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBsYXBiX3VucmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFwYl9jYiAqbGFwYjsKKwlpbnQgcmMgPSBMQVBCX0JBRFRPS0VOOworCisJd3JpdGVfbG9ja19iaCgmbGFwYl9saXN0X2xvY2spOworCWxhcGIgPSBfX2xhcGJfZGV2dG9zdHJ1Y3QoZGV2KTsKKwlpZiAoIWxhcGIpCisJCWdvdG8gb3V0OworCisJbGFwYl9zdG9wX3QxdGltZXIobGFwYik7CisJbGFwYl9zdG9wX3QydGltZXIobGFwYik7CisKKwlsYXBiX2NsZWFyX3F1ZXVlcyhsYXBiKTsKKworCV9fbGFwYl9yZW1vdmVfY2IobGFwYik7CisKKwlsYXBiX3B1dChsYXBiKTsKKwlyYyA9IExBUEJfT0s7CitvdXQ6CisJd3JpdGVfdW5sb2NrX2JoKCZsYXBiX2xpc3RfbG9jayk7CisJcmV0dXJuIHJjOworfQorCitpbnQgbGFwYl9nZXRwYXJtcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbGFwYl9wYXJtc19zdHJ1Y3QgKnBhcm1zKQoreworCWludCByYyA9IExBUEJfQkFEVE9LRU47CisJc3RydWN0IGxhcGJfY2IgKmxhcGIgPSBsYXBiX2RldnRvc3RydWN0KGRldik7CisKKwlpZiAoIWxhcGIpCisJCWdvdG8gb3V0OworCisJcGFybXMtPnQxICAgICAgPSBsYXBiLT50MSAvIEhaOworCXBhcm1zLT50MiAgICAgID0gbGFwYi0+dDIgLyBIWjsKKwlwYXJtcy0+bjIgICAgICA9IGxhcGItPm4yOworCXBhcm1zLT5uMmNvdW50ID0gbGFwYi0+bjJjb3VudDsKKwlwYXJtcy0+c3RhdGUgICA9IGxhcGItPnN0YXRlOworCXBhcm1zLT53aW5kb3cgID0gbGFwYi0+d2luZG93OworCXBhcm1zLT5tb2RlICAgID0gbGFwYi0+bW9kZTsKKworCWlmICghdGltZXJfcGVuZGluZygmbGFwYi0+dDF0aW1lcikpCisJCXBhcm1zLT50MXRpbWVyID0gMDsKKwllbHNlCisJCXBhcm1zLT50MXRpbWVyID0gKGxhcGItPnQxdGltZXIuZXhwaXJlcyAtIGppZmZpZXMpIC8gSFo7CisKKwlpZiAoIXRpbWVyX3BlbmRpbmcoJmxhcGItPnQydGltZXIpKQorCQlwYXJtcy0+dDJ0aW1lciA9IDA7CisJZWxzZQorCQlwYXJtcy0+dDJ0aW1lciA9IChsYXBiLT50MnRpbWVyLmV4cGlyZXMgLSBqaWZmaWVzKSAvIEhaOworCisJbGFwYl9wdXQobGFwYik7CisJcmMgPSBMQVBCX09LOworb3V0OgorCXJldHVybiByYzsKK30KKworaW50IGxhcGJfc2V0cGFybXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGxhcGJfcGFybXNfc3RydWN0ICpwYXJtcykKK3sKKwlpbnQgcmMgPSBMQVBCX0JBRFRPS0VOOworCXN0cnVjdCBsYXBiX2NiICpsYXBiID0gbGFwYl9kZXZ0b3N0cnVjdChkZXYpOworCisJaWYgKCFsYXBiKQorCQlnb3RvIG91dDsKKworCXJjID0gTEFQQl9JTlZBTFVFOworCWlmIChwYXJtcy0+dDEgPCAxIHx8IHBhcm1zLT50MiA8IDEgfHwgcGFybXMtPm4yIDwgMSkKKwkJZ290byBvdXRfcHV0OworCisJaWYgKGxhcGItPnN0YXRlID09IExBUEJfU1RBVEVfMCkgeworCQlpZiAoKChwYXJtcy0+bW9kZSAmIExBUEJfRVhURU5ERUQpICYmCisJCSAgICAgKHBhcm1zLT53aW5kb3cgPCAxIHx8IHBhcm1zLT53aW5kb3cgPiAxMjcpKSB8fAorCQkgICAgKHBhcm1zLT53aW5kb3cgPCAxIHx8IHBhcm1zLT53aW5kb3cgPiA3KSkKKwkJCWdvdG8gb3V0X3B1dDsKKworCQlsYXBiLT5tb2RlICAgID0gcGFybXMtPm1vZGU7CisJCWxhcGItPndpbmRvdyAgPSBwYXJtcy0+d2luZG93OworCX0KKworCWxhcGItPnQxICAgID0gcGFybXMtPnQxICogSFo7CisJbGFwYi0+dDIgICAgPSBwYXJtcy0+dDIgKiBIWjsKKwlsYXBiLT5uMiAgICA9IHBhcm1zLT5uMjsKKworCXJjID0gTEFQQl9PSzsKK291dF9wdXQ6CisJbGFwYl9wdXQobGFwYik7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCitpbnQgbGFwYl9jb25uZWN0X3JlcXVlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFwYl9jYiAqbGFwYiA9IGxhcGJfZGV2dG9zdHJ1Y3QoZGV2KTsKKwlpbnQgcmMgPSBMQVBCX0JBRFRPS0VOOworCisJaWYgKCFsYXBiKQorCQlnb3RvIG91dDsKKworCXJjID0gTEFQQl9PSzsKKwlpZiAobGFwYi0+c3RhdGUgPT0gTEFQQl9TVEFURV8xKQorCQlnb3RvIG91dF9wdXQ7CisKKwlyYyA9IExBUEJfQ09OTkVDVEVEOworCWlmIChsYXBiLT5zdGF0ZSA9PSBMQVBCX1NUQVRFXzMgfHwgbGFwYi0+c3RhdGUgPT0gTEFQQl9TVEFURV80KQorCQlnb3RvIG91dF9wdXQ7CisKKwlsYXBiX2VzdGFibGlzaF9kYXRhX2xpbmsobGFwYik7CisKKyNpZiBMQVBCX0RFQlVHID4gMAorCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMwIC0+IFMxXG4iLCBsYXBiLT5kZXYpOworI2VuZGlmCisJbGFwYi0+c3RhdGUgPSBMQVBCX1NUQVRFXzE7CisKKwlyYyA9IExBUEJfT0s7CitvdXRfcHV0OgorCWxhcGJfcHV0KGxhcGIpOworb3V0OgorCXJldHVybiByYzsKK30KKworaW50IGxhcGJfZGlzY29ubmVjdF9yZXF1ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhcGJfY2IgKmxhcGIgPSBsYXBiX2RldnRvc3RydWN0KGRldik7CisJaW50IHJjID0gTEFQQl9CQURUT0tFTjsKKworCWlmICghbGFwYikKKwkJZ290byBvdXQ7CisKKwlzd2l0Y2ggKGxhcGItPnN0YXRlKSB7CisJCWNhc2UgTEFQQl9TVEFURV8wOgorCQkJcmMgPSBMQVBCX05PVENPTk5FQ1RFRDsKKwkJCWdvdG8gb3V0X3B1dDsKKworCQljYXNlIExBUEJfU1RBVEVfMToKKyNpZiBMQVBCX0RFQlVHID4gMQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzEgVFggRElTQygxKVxuIiwgbGFwYi0+ZGV2KTsKKyNlbmRpZgorI2lmIExBUEJfREVCVUcgPiAwCisJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMSAtPiBTMFxuIiwgbGFwYi0+ZGV2KTsKKyNlbmRpZgorCQkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9ESVNDLCBMQVBCX1BPTExPTiwgTEFQQl9DT01NQU5EKTsKKwkJCWxhcGItPnN0YXRlID0gTEFQQl9TVEFURV8wOworCQkJbGFwYl9zdGFydF90MXRpbWVyKGxhcGIpOworCQkJcmMgPSBMQVBCX05PVENPTk5FQ1RFRDsKKwkJCWdvdG8gb3V0X3B1dDsKKworCQljYXNlIExBUEJfU1RBVEVfMjoKKwkJCXJjID0gTEFQQl9PSzsKKwkJCWdvdG8gb3V0X3B1dDsKKwl9CisKKwlsYXBiX2NsZWFyX3F1ZXVlcyhsYXBiKTsKKwlsYXBiLT5uMmNvdW50ID0gMDsKKwlsYXBiX3NlbmRfY29udHJvbChsYXBiLCBMQVBCX0RJU0MsIExBUEJfUE9MTE9OLCBMQVBCX0NPTU1BTkQpOworCWxhcGJfc3RhcnRfdDF0aW1lcihsYXBiKTsKKwlsYXBiX3N0b3BfdDJ0aW1lcihsYXBiKTsKKwlsYXBiLT5zdGF0ZSA9IExBUEJfU1RBVEVfMjsKKworI2lmIExBUEJfREVCVUcgPiAxCisJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgRElTQygxKVxuIiwgbGFwYi0+ZGV2KTsKKyNlbmRpZgorI2lmIExBUEJfREVCVUcgPiAwCisJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgLT4gUzJcbiIsIGxhcGItPmRldik7CisjZW5kaWYKKworCXJjID0gTEFQQl9PSzsKK291dF9wdXQ6CisJbGFwYl9wdXQobGFwYik7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCitpbnQgbGFwYl9kYXRhX3JlcXVlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGFwYl9jYiAqbGFwYiA9IGxhcGJfZGV2dG9zdHJ1Y3QoZGV2KTsKKwlpbnQgcmMgPSBMQVBCX0JBRFRPS0VOOworCisJaWYgKCFsYXBiKQorCQlnb3RvIG91dDsKKworCXJjID0gTEFQQl9OT1RDT05ORUNURUQ7CisJaWYgKGxhcGItPnN0YXRlICE9IExBUEJfU1RBVEVfMyAmJiBsYXBiLT5zdGF0ZSAhPSBMQVBCX1NUQVRFXzQpCisJCWdvdG8gb3V0X3B1dDsKKworCXNrYl9xdWV1ZV90YWlsKCZsYXBiLT53cml0ZV9xdWV1ZSwgc2tiKTsKKwlsYXBiX2tpY2sobGFwYik7CisJcmMgPSBMQVBCX09LOworb3V0X3B1dDoKKwlsYXBiX3B1dChsYXBiKTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBsYXBiX2RhdGFfcmVjZWl2ZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGFwYl9jYiAqbGFwYiA9IGxhcGJfZGV2dG9zdHJ1Y3QoZGV2KTsKKwlpbnQgcmMgPSBMQVBCX0JBRFRPS0VOOworCisJaWYgKGxhcGIpIHsKKwkJbGFwYl9kYXRhX2lucHV0KGxhcGIsIHNrYik7CisJCWxhcGJfcHV0KGxhcGIpOworCQlyYyA9IExBUEJfT0s7CisJfQorCisJcmV0dXJuIHJjOworfQorCit2b2lkIGxhcGJfY29ubmVjdF9jb25maXJtYXRpb24oc3RydWN0IGxhcGJfY2IgKmxhcGIsIGludCByZWFzb24pCit7CisJaWYgKGxhcGItPmNhbGxiYWNrcy5jb25uZWN0X2NvbmZpcm1hdGlvbikKKwkJbGFwYi0+Y2FsbGJhY2tzLmNvbm5lY3RfY29uZmlybWF0aW9uKGxhcGItPmRldiwgcmVhc29uKTsKK30KKwordm9pZCBsYXBiX2Nvbm5lY3RfaW5kaWNhdGlvbihzdHJ1Y3QgbGFwYl9jYiAqbGFwYiwgaW50IHJlYXNvbikKK3sKKwlpZiAobGFwYi0+Y2FsbGJhY2tzLmNvbm5lY3RfaW5kaWNhdGlvbikKKwkJbGFwYi0+Y2FsbGJhY2tzLmNvbm5lY3RfaW5kaWNhdGlvbihsYXBiLT5kZXYsIHJlYXNvbik7Cit9CisKK3ZvaWQgbGFwYl9kaXNjb25uZWN0X2NvbmZpcm1hdGlvbihzdHJ1Y3QgbGFwYl9jYiAqbGFwYiwgaW50IHJlYXNvbikKK3sKKwlpZiAobGFwYi0+Y2FsbGJhY2tzLmRpc2Nvbm5lY3RfY29uZmlybWF0aW9uKQorCQlsYXBiLT5jYWxsYmFja3MuZGlzY29ubmVjdF9jb25maXJtYXRpb24obGFwYi0+ZGV2LCByZWFzb24pOworfQorCit2b2lkIGxhcGJfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHN0cnVjdCBsYXBiX2NiICpsYXBiLCBpbnQgcmVhc29uKQoreworCWlmIChsYXBiLT5jYWxsYmFja3MuZGlzY29ubmVjdF9pbmRpY2F0aW9uKQorCQlsYXBiLT5jYWxsYmFja3MuZGlzY29ubmVjdF9pbmRpY2F0aW9uKGxhcGItPmRldiwgcmVhc29uKTsKK30KKworaW50IGxhcGJfZGF0YV9pbmRpY2F0aW9uKHN0cnVjdCBsYXBiX2NiICpsYXBiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmIChsYXBiLT5jYWxsYmFja3MuZGF0YV9pbmRpY2F0aW9uKQorCQlyZXR1cm4gbGFwYi0+Y2FsbGJhY2tzLmRhdGFfaW5kaWNhdGlvbihsYXBiLT5kZXYsIHNrYik7CisKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gTkVUX1JYX0NOX0hJR0g7IC8qIEZvciBub3c7IG11c3QgYmUgIT0gTkVUX1JYX0RST1AgKi8gCit9CisKK2ludCBsYXBiX2RhdGFfdHJhbnNtaXQoc3RydWN0IGxhcGJfY2IgKmxhcGIsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHVzZWQgPSAwOworCisJaWYgKGxhcGItPmNhbGxiYWNrcy5kYXRhX3RyYW5zbWl0KSB7CisJCWxhcGItPmNhbGxiYWNrcy5kYXRhX3RyYW5zbWl0KGxhcGItPmRldiwgc2tiKTsKKwkJdXNlZCA9IDE7CisJfQorCisJcmV0dXJuIHVzZWQ7Cit9CisKK0VYUE9SVF9TWU1CT0wobGFwYl9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGxhcGJfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGxhcGJfZ2V0cGFybXMpOworRVhQT1JUX1NZTUJPTChsYXBiX3NldHBhcm1zKTsKK0VYUE9SVF9TWU1CT0wobGFwYl9jb25uZWN0X3JlcXVlc3QpOworRVhQT1JUX1NZTUJPTChsYXBiX2Rpc2Nvbm5lY3RfcmVxdWVzdCk7CitFWFBPUlRfU1lNQk9MKGxhcGJfZGF0YV9yZXF1ZXN0KTsKK0VYUE9SVF9TWU1CT0wobGFwYl9kYXRhX3JlY2VpdmVkKTsKKworc3RhdGljIGludCBfX2luaXQgbGFwYl9pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBsYXBiX2V4aXQodm9pZCkKK3sKKwlXQVJOX09OKCFsaXN0X2VtcHR5KCZsYXBiX2xpc3QpKTsKK30KKworTU9EVUxFX0FVVEhPUigiSm9uYXRoYW4gTmF5bG9yIDxnNGtseEBnNGtseC5kZW1vbi5jby51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVGhlIFguMjUgTGluayBBY2Nlc3MgUHJvY2VkdXJlIEIgbGluayBsYXllciBwcm90b2NvbCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChsYXBiX2luaXQpOworbW9kdWxlX2V4aXQobGFwYl9leGl0KTsKZGlmZiAtLWdpdCBhL25ldC9sYXBiL2xhcGJfaW4uYyBiL25ldC9sYXBiL2xhcGJfaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGY4NzEzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2xhcGIvbGFwYl9pbi5jCkBAIC0wLDAgKzEsNzI0IEBACisvKgorICoJTEFQQiByZWxlYXNlIDAwMgorICoKKyAqCVRoaXMgY29kZSBSRVFVSVJFUyAyLjEuMTUgb3IgaGlnaGVyLyBORVQzLjAzOAorICoKKyAqCVRoaXMgbW9kdWxlOgorICoJCVRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglIaXN0b3J5CisgKglMQVBCIDAwMQlKb25hdGhhbiBOYXVsb3IJU3RhcnRlZCBDb2RpbmcKKyAqCUxBUEIgMDAyCUpvbmF0aGFuIE5heWxvcglOZXcgdGltZXIgYXJjaGl0ZWN0dXJlLgorICoJMjAwMC0xMC0yOQlIZW5uZXIgRWlzZW4JbGFwYl9kYXRhX2luZGljYXRpb24oKSByZXR1cm4gc3RhdHVzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxuZXQvbGFwYi5oPgorCisvKgorICoJU3RhdGUgbWFjaGluZSBmb3Igc3RhdGUgMCwgRGlzY29ubmVjdGVkIFN0YXRlLgorICoJVGhlIGhhbmRsaW5nIG9mIHRoZSB0aW1lcihzKSBpcyBpbiBmaWxlIGxhcGJfdGltZXIuYy4KKyAqLworc3RhdGljIHZvaWQgbGFwYl9zdGF0ZTBfbWFjaGluZShzdHJ1Y3QgbGFwYl9jYiAqbGFwYiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQlzdHJ1Y3QgbGFwYl9mcmFtZSAqZnJhbWUpCit7CisJc3dpdGNoIChmcmFtZS0+dHlwZSkgeworCQljYXNlIExBUEJfU0FCTToKKyNpZiBMQVBCX0RFQlVHID4gMQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzAgUlggU0FCTSglZClcbiIsCisJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOworI2VuZGlmCisJCQlpZiAobGFwYi0+bW9kZSAmIExBUEJfRVhURU5ERUQpIHsKKyNpZiBMQVBCX0RFQlVHID4gMQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMwIFRYIERNKCVkKVxuIiwKKwkJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOworI2VuZGlmCisJCQkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9ETSwgZnJhbWUtPnBmLAorCQkJCQkJICBMQVBCX1JFU1BPTlNFKTsKKwkJCX0gZWxzZSB7CisjaWYgTEFQQl9ERUJVRyA+IDEKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMCBUWCBVQSglZClcbiIsCisJCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKKyNlbmRpZgorI2lmIExBUEJfREVCVUcgPiAwCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzAgLT4gUzNcbiIsCisJCQkJICAgICAgIGxhcGItPmRldik7CisjZW5kaWYKKwkJCQlsYXBiX3NlbmRfY29udHJvbChsYXBiLCBMQVBCX1VBLCBmcmFtZS0+cGYsCisJCQkJCQkgIExBUEJfUkVTUE9OU0UpOworCQkJCWxhcGJfc3RvcF90MXRpbWVyKGxhcGIpOworCQkJCWxhcGJfc3RvcF90MnRpbWVyKGxhcGIpOworCQkJCWxhcGItPnN0YXRlICAgICA9IExBUEJfU1RBVEVfMzsKKwkJCQlsYXBiLT5jb25kaXRpb24gPSAweDAwOworCQkJCWxhcGItPm4yY291bnQgICA9IDA7CisJCQkJbGFwYi0+dnMgICAgICAgID0gMDsKKwkJCQlsYXBiLT52ciAgICAgICAgPSAwOworCQkJCWxhcGItPnZhICAgICAgICA9IDA7CisJCQkJbGFwYl9jb25uZWN0X2luZGljYXRpb24obGFwYiwgTEFQQl9PSyk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIExBUEJfU0FCTUU6CisjaWYgTEFQQl9ERUJVRyA+IDEKKwkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMwIFJYIFNBQk1FKCVkKVxuIiwKKwkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CisjZW5kaWYKKwkJCWlmIChsYXBiLT5tb2RlICYgTEFQQl9FWFRFTkRFRCkgeworI2lmIExBUEJfREVCVUcgPiAxCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzAgVFggVUEoJWQpXG4iLAorCQkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CisjZW5kaWYKKyNpZiBMQVBCX0RFQlVHID4gMAorCQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMwIC0+IFMzXG4iLAorCQkJCSAgICAgICBsYXBiLT5kZXYpOworI2VuZGlmCisJCQkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9VQSwgZnJhbWUtPnBmLAorCQkJCQkJICBMQVBCX1JFU1BPTlNFKTsKKwkJCQlsYXBiX3N0b3BfdDF0aW1lcihsYXBiKTsKKwkJCQlsYXBiX3N0b3BfdDJ0aW1lcihsYXBiKTsKKwkJCQlsYXBiLT5zdGF0ZSAgICAgPSBMQVBCX1NUQVRFXzM7CisJCQkJbGFwYi0+Y29uZGl0aW9uID0gMHgwMDsKKwkJCQlsYXBiLT5uMmNvdW50ICAgPSAwOworCQkJCWxhcGItPnZzICAgICAgICA9IDA7CisJCQkJbGFwYi0+dnIgICAgICAgID0gMDsKKwkJCQlsYXBiLT52YSAgICAgICAgPSAwOworCQkJCWxhcGJfY29ubmVjdF9pbmRpY2F0aW9uKGxhcGIsIExBUEJfT0spOworCQkJfSBlbHNlIHsKKyNpZiBMQVBCX0RFQlVHID4gMQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMwIFRYIERNKCVkKVxuIiwKKwkJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOworI2VuZGlmCisJCQkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9ETSwgZnJhbWUtPnBmLAorCQkJCQkJICBMQVBCX1JFU1BPTlNFKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgTEFQQl9ESVNDOgorI2lmIExBUEJfREVCVUcgPiAxCisJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMCBSWCBESVNDKCVkKVxuIiwKKwkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CisJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMCBUWCBVQSglZClcbiIsCisJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOworI2VuZGlmCisJCQlsYXBiX3NlbmRfY29udHJvbChsYXBiLCBMQVBCX1VBLCBmcmFtZS0+cGYsCisJCQkJCSAgTEFQQl9SRVNQT05TRSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qCisgKglTdGF0ZSBtYWNoaW5lIGZvciBzdGF0ZSAxLCBBd2FpdGluZyBDb25uZWN0aW9uIFN0YXRlLgorICoJVGhlIGhhbmRsaW5nIG9mIHRoZSB0aW1lcihzKSBpcyBpbiBmaWxlIGxhcGJfdGltZXIuYy4KKyAqLworc3RhdGljIHZvaWQgbGFwYl9zdGF0ZTFfbWFjaGluZShzdHJ1Y3QgbGFwYl9jYiAqbGFwYiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQlzdHJ1Y3QgbGFwYl9mcmFtZSAqZnJhbWUpCit7CisJc3dpdGNoIChmcmFtZS0+dHlwZSkgeworCQljYXNlIExBUEJfU0FCTToKKyNpZiBMQVBCX0RFQlVHID4gMQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzEgUlggU0FCTSglZClcbiIsCisJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOworI2VuZGlmCisJCQlpZiAobGFwYi0+bW9kZSAmIExBUEJfRVhURU5ERUQpIHsKKyNpZiBMQVBCX0RFQlVHID4gMQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMxIFRYIERNKCVkKVxuIiwKKwkJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOworI2VuZGlmCisJCQkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9ETSwgZnJhbWUtPnBmLAorCQkJCQkJICBMQVBCX1JFU1BPTlNFKTsKKwkJCX0gZWxzZSB7CisjaWYgTEFQQl9ERUJVRyA+IDEKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMSBUWCBVQSglZClcbiIsCisJCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKKyNlbmRpZgorCQkJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfVUEsIGZyYW1lLT5wZiwKKwkJCQkJCSAgTEFQQl9SRVNQT05TRSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIExBUEJfU0FCTUU6CisjaWYgTEFQQl9ERUJVRyA+IDEKKwkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMxIFJYIFNBQk1FKCVkKVxuIiwKKwkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CisjZW5kaWYKKwkJCWlmIChsYXBiLT5tb2RlICYgTEFQQl9FWFRFTkRFRCkgeworI2lmIExBUEJfREVCVUcgPiAxCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzEgVFggVUEoJWQpXG4iLAorCQkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CisjZW5kaWYKKwkJCQlsYXBiX3NlbmRfY29udHJvbChsYXBiLCBMQVBCX1VBLCBmcmFtZS0+cGYsCisJCQkJCQkgIExBUEJfUkVTUE9OU0UpOworCQkJfSBlbHNlIHsKKyNpZiBMQVBCX0RFQlVHID4gMQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMxIFRYIERNKCVkKVxuIiwKKwkJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOworI2VuZGlmCisJCQkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9ETSwgZnJhbWUtPnBmLAorCQkJCQkJICBMQVBCX1JFU1BPTlNFKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgTEFQQl9ESVNDOgorI2lmIExBUEJfREVCVUcgPiAxCisJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMSBSWCBESVNDKCVkKVxuIiwKKwkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CisJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMSBUWCBETSglZClcbiIsCisJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOworI2VuZGlmCisJCQlsYXBiX3NlbmRfY29udHJvbChsYXBiLCBMQVBCX0RNLCBmcmFtZS0+cGYsCisJCQkJCSAgTEFQQl9SRVNQT05TRSk7CisJCQlicmVhazsKKworCQljYXNlIExBUEJfVUE6CisjaWYgTEFQQl9ERUJVRyA+IDEKKwkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMxIFJYIFVBKCVkKVxuIiwKKwkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CisjZW5kaWYKKwkJCWlmIChmcmFtZS0+cGYpIHsKKyNpZiBMQVBCX0RFQlVHID4gMAorCQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMxIC0+IFMzXG4iLAorCQkJCSAgICAgICBsYXBiLT5kZXYpOworI2VuZGlmCisJCQkJbGFwYl9zdG9wX3QxdGltZXIobGFwYik7CisJCQkJbGFwYl9zdG9wX3QydGltZXIobGFwYik7CisJCQkJbGFwYi0+c3RhdGUgICAgID0gTEFQQl9TVEFURV8zOworCQkJCWxhcGItPmNvbmRpdGlvbiA9IDB4MDA7CisJCQkJbGFwYi0+bjJjb3VudCAgID0gMDsKKwkJCQlsYXBiLT52cyAgICAgICAgPSAwOworCQkJCWxhcGItPnZyICAgICAgICA9IDA7CisJCQkJbGFwYi0+dmEgICAgICAgID0gMDsKKwkJCQlsYXBiX2Nvbm5lY3RfY29uZmlybWF0aW9uKGxhcGIsIExBUEJfT0spOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBMQVBCX0RNOgorI2lmIExBUEJfREVCVUcgPiAxCisJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMSBSWCBETSglZClcbiIsCisJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOworI2VuZGlmCisJCQlpZiAoZnJhbWUtPnBmKSB7CisjaWYgTEFQQl9ERUJVRyA+IDAKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMSAtPiBTMFxuIiwKKwkJCQkgICAgICAgbGFwYi0+ZGV2KTsKKyNlbmRpZgorCQkJCWxhcGJfY2xlYXJfcXVldWVzKGxhcGIpOworCQkJCWxhcGItPnN0YXRlID0gTEFQQl9TVEFURV8wOworCQkJCWxhcGJfc3RhcnRfdDF0aW1lcihsYXBiKTsKKwkJCQlsYXBiX3N0b3BfdDJ0aW1lcihsYXBiKTsKKwkJCQlsYXBiX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihsYXBiLCBMQVBCX1JFRlVTRUQpOworCQkJfQorCQkJYnJlYWs7CisJfQorCisJa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qCisgKglTdGF0ZSBtYWNoaW5lIGZvciBzdGF0ZSAyLCBBd2FpdGluZyBSZWxlYXNlIFN0YXRlLgorICoJVGhlIGhhbmRsaW5nIG9mIHRoZSB0aW1lcihzKSBpcyBpbiBmaWxlIGxhcGJfdGltZXIuYworICovCitzdGF0aWMgdm9pZCBsYXBiX3N0YXRlMl9tYWNoaW5lKHN0cnVjdCBsYXBiX2NiICpsYXBiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCXN0cnVjdCBsYXBiX2ZyYW1lICpmcmFtZSkKK3sKKwlzd2l0Y2ggKGZyYW1lLT50eXBlKSB7CisJCWNhc2UgTEFQQl9TQUJNOgorCQljYXNlIExBUEJfU0FCTUU6CisjaWYgTEFQQl9ERUJVRyA+IDEKKwkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMyIFJYIHtTQUJNLFNBQk1FfSglZClcbiIsCisJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzIgVFggRE0oJWQpXG4iLAorCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKKyNlbmRpZgorCQkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9ETSwgZnJhbWUtPnBmLAorCQkJCQkgIExBUEJfUkVTUE9OU0UpOworCQkJYnJlYWs7CisKKwkJY2FzZSBMQVBCX0RJU0M6CisjaWYgTEFQQl9ERUJVRyA+IDEKKwkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMyIFJYIERJU0MoJWQpXG4iLAorCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMyIFRYIFVBKCVkKVxuIiwKKwkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CisjZW5kaWYKKwkJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfVUEsIGZyYW1lLT5wZiwKKwkJCQkJICBMQVBCX1JFU1BPTlNFKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTEFQQl9VQToKKyNpZiBMQVBCX0RFQlVHID4gMQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzIgUlggVUEoJWQpXG4iLAorCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKKyNlbmRpZgorCQkJaWYgKGZyYW1lLT5wZikgeworI2lmIExBUEJfREVCVUcgPiAwCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzIgLT4gUzBcbiIsCisJCQkJICAgICAgIGxhcGItPmRldik7CisjZW5kaWYKKwkJCQlsYXBiLT5zdGF0ZSA9IExBUEJfU1RBVEVfMDsKKwkJCQlsYXBiX3N0YXJ0X3QxdGltZXIobGFwYik7CisJCQkJbGFwYl9zdG9wX3QydGltZXIobGFwYik7CisJCQkJbGFwYl9kaXNjb25uZWN0X2NvbmZpcm1hdGlvbihsYXBiLCBMQVBCX09LKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgTEFQQl9ETToKKyNpZiBMQVBCX0RFQlVHID4gMQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzIgUlggRE0oJWQpXG4iLAorCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKKyNlbmRpZgorCQkJaWYgKGZyYW1lLT5wZikgeworI2lmIExBUEJfREVCVUcgPiAwCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzIgLT4gUzBcbiIsCisJCQkJICAgICAgIGxhcGItPmRldik7CisjZW5kaWYKKwkJCQlsYXBiLT5zdGF0ZSA9IExBUEJfU1RBVEVfMDsKKwkJCQlsYXBiX3N0YXJ0X3QxdGltZXIobGFwYik7CisJCQkJbGFwYl9zdG9wX3QydGltZXIobGFwYik7CisJCQkJbGFwYl9kaXNjb25uZWN0X2NvbmZpcm1hdGlvbihsYXBiLAorCQkJCQkJCSAgICAgTEFQQl9OT1RDT05ORUNURUQpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBMQVBCX0k6CisJCWNhc2UgTEFQQl9SRUo6CisJCWNhc2UgTEFQQl9STlI6CisJCWNhc2UgTEFQQl9SUjoKKyNpZiBMQVBCX0RFQlVHID4gMQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzIgUlgge0ksUkVKLFJOUixSUn0iCisJCQkgICAgICAgIiglZClcbiIsIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMyIFJYIERNKCVkKVxuIiwKKwkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CisjZW5kaWYKKwkJCWlmIChmcmFtZS0+cGYpCisJCQkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9ETSwgZnJhbWUtPnBmLAorCQkJCQkJICBMQVBCX1JFU1BPTlNFKTsKKwkJCWJyZWFrOworCX0KKworCWtmcmVlX3NrYihza2IpOworfQorCisvKgorICoJU3RhdGUgbWFjaGluZSBmb3Igc3RhdGUgMywgQ29ubmVjdGVkIFN0YXRlLgorICoJVGhlIGhhbmRsaW5nIG9mIHRoZSB0aW1lcihzKSBpcyBpbiBmaWxlIGxhcGJfdGltZXIuYworICovCitzdGF0aWMgdm9pZCBsYXBiX3N0YXRlM19tYWNoaW5lKHN0cnVjdCBsYXBiX2NiICpsYXBiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCXN0cnVjdCBsYXBiX2ZyYW1lICpmcmFtZSkKK3sKKwlpbnQgcXVldWVkID0gMDsKKwlpbnQgbW9kdWx1cyA9IChsYXBiLT5tb2RlICYgTEFQQl9FWFRFTkRFRCkgPyBMQVBCX0VNT0RVTFVTIDoKKwkJCQkJCSAgICAgTEFQQl9TTU9EVUxVUzsKKworCXN3aXRjaCAoZnJhbWUtPnR5cGUpIHsKKwkJY2FzZSBMQVBCX1NBQk06CisjaWYgTEFQQl9ERUJVRyA+IDEKKwkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMzIFJYIFNBQk0oJWQpXG4iLAorCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKKyNlbmRpZgorCQkJaWYgKGxhcGItPm1vZGUgJiBMQVBCX0VYVEVOREVEKSB7CisjaWYgTEFQQl9ERUJVRyA+IDEKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMyBUWCBETSglZClcbiIsCisJCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKKyNlbmRpZgorCQkJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfRE0sIGZyYW1lLT5wZiwKKwkJCQkJCSAgTEFQQl9SRVNQT05TRSk7CisJCQl9IGVsc2UgeworI2lmIExBUEJfREVCVUcgPiAxCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgVFggVUEoJWQpXG4iLAorCQkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CisjZW5kaWYKKwkJCQlsYXBiX3NlbmRfY29udHJvbChsYXBiLCBMQVBCX1VBLCBmcmFtZS0+cGYsCisJCQkJCQkgIExBUEJfUkVTUE9OU0UpOworCQkJCWxhcGJfc3RvcF90MXRpbWVyKGxhcGIpOworCQkJCWxhcGJfc3RvcF90MnRpbWVyKGxhcGIpOworCQkJCWxhcGItPmNvbmRpdGlvbiA9IDB4MDA7CisJCQkJbGFwYi0+bjJjb3VudCAgID0gMDsKKwkJCQlsYXBiLT52cyAgICAgICAgPSAwOworCQkJCWxhcGItPnZyICAgICAgICA9IDA7CisJCQkJbGFwYi0+dmEgICAgICAgID0gMDsKKwkJCQlsYXBiX3JlcXVldWVfZnJhbWVzKGxhcGIpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBMQVBCX1NBQk1FOgorI2lmIExBUEJfREVCVUcgPiAxCisJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMyBSWCBTQUJNRSglZClcbiIsCisJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOworI2VuZGlmCisJCQlpZiAobGFwYi0+bW9kZSAmIExBUEJfRVhURU5ERUQpIHsKKyNpZiBMQVBCX0RFQlVHID4gMQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMzIFRYIFVBKCVkKVxuIiwKKwkJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOworI2VuZGlmCisJCQkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9VQSwgZnJhbWUtPnBmLAorCQkJCQkJICBMQVBCX1JFU1BPTlNFKTsKKwkJCQlsYXBiX3N0b3BfdDF0aW1lcihsYXBiKTsKKwkJCQlsYXBiX3N0b3BfdDJ0aW1lcihsYXBiKTsKKwkJCQlsYXBiLT5jb25kaXRpb24gPSAweDAwOworCQkJCWxhcGItPm4yY291bnQgICA9IDA7CisJCQkJbGFwYi0+dnMgICAgICAgID0gMDsKKwkJCQlsYXBiLT52ciAgICAgICAgPSAwOworCQkJCWxhcGItPnZhICAgICAgICA9IDA7CisJCQkJbGFwYl9yZXF1ZXVlX2ZyYW1lcyhsYXBiKTsKKwkJCX0gZWxzZSB7CisjaWYgTEFQQl9ERUJVRyA+IDEKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMyBUWCBETSglZClcbiIsCisJCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKKyNlbmRpZgorCQkJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfRE0sIGZyYW1lLT5wZiwKKwkJCQkJCSAgTEFQQl9SRVNQT05TRSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIExBUEJfRElTQzoKKyNpZiBMQVBCX0RFQlVHID4gMQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgUlggRElTQyglZClcbiIsCisJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOworI2VuZGlmCisjaWYgTEFQQl9ERUJVRyA+IDAKKwkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMzIC0+IFMwXG4iLAorCQkJICAgICAgIGxhcGItPmRldik7CisjZW5kaWYKKwkJCWxhcGJfY2xlYXJfcXVldWVzKGxhcGIpOworCQkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9VQSwgZnJhbWUtPnBmLAorCQkJCQkgIExBUEJfUkVTUE9OU0UpOworCQkJbGFwYl9zdGFydF90MXRpbWVyKGxhcGIpOworCQkJbGFwYl9zdG9wX3QydGltZXIobGFwYik7CisJCQlsYXBiLT5zdGF0ZSA9IExBUEJfU1RBVEVfMDsKKwkJCWxhcGJfZGlzY29ubmVjdF9pbmRpY2F0aW9uKGxhcGIsIExBUEJfT0spOworCQkJYnJlYWs7CisKKwkJY2FzZSBMQVBCX0RNOgorI2lmIExBUEJfREVCVUcgPiAxCisJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMyBSWCBETSglZClcbiIsCisJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOworI2VuZGlmCisjaWYgTEFQQl9ERUJVRyA+IDAKKwkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMzIC0+IFMwXG4iLAorCQkJICAgICAgIGxhcGItPmRldik7CisjZW5kaWYKKwkJCWxhcGJfY2xlYXJfcXVldWVzKGxhcGIpOworCQkJbGFwYi0+c3RhdGUgPSBMQVBCX1NUQVRFXzA7CisJCQlsYXBiX3N0YXJ0X3QxdGltZXIobGFwYik7CisJCQlsYXBiX3N0b3BfdDJ0aW1lcihsYXBiKTsKKwkJCWxhcGJfZGlzY29ubmVjdF9pbmRpY2F0aW9uKGxhcGIsIExBUEJfTk9UQ09OTkVDVEVEKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTEFQQl9STlI6CisjaWYgTEFQQl9ERUJVRyA+IDEKKwkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMzIFJYIFJOUiglZCkgUiVkXG4iLAorCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmLCBmcmFtZS0+bnIpOworI2VuZGlmCisJCQlsYXBiLT5jb25kaXRpb24gfD0gTEFQQl9QRUVSX1JYX0JVU1lfQ09ORElUSU9OOworCQkJbGFwYl9jaGVja19uZWVkX3Jlc3BvbnNlKGxhcGIsIGZyYW1lLT5jciwgZnJhbWUtPnBmKTsKKwkJCWlmIChsYXBiX3ZhbGlkYXRlX25yKGxhcGIsIGZyYW1lLT5ucikpIHsKKwkJCQlsYXBiX2NoZWNrX2lmcmFtZXNfYWNrZWQobGFwYiwgZnJhbWUtPm5yKTsKKwkJCX0gZWxzZSB7CisJCQkJbGFwYi0+ZnJtcl9kYXRhID0gKmZyYW1lOworCQkJCWxhcGItPmZybXJfdHlwZSA9IExBUEJfRlJNUl9aOworCQkJCWxhcGJfdHJhbnNtaXRfZnJtcihsYXBiKTsKKyNpZiBMQVBCX0RFQlVHID4gMAorCQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMzIC0+IFM0XG4iLAorCQkJCSAgICAgICBsYXBiLT5kZXYpOworI2VuZGlmCisJCQkJbGFwYl9zdGFydF90MXRpbWVyKGxhcGIpOworCQkJCWxhcGJfc3RvcF90MnRpbWVyKGxhcGIpOworCQkJCWxhcGItPnN0YXRlICAgPSBMQVBCX1NUQVRFXzQ7CisJCQkJbGFwYi0+bjJjb3VudCA9IDA7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIExBUEJfUlI6CisjaWYgTEFQQl9ERUJVRyA+IDEKKwkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMzIFJYIFJSKCVkKSBSJWRcbiIsCisJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYsIGZyYW1lLT5ucik7CisjZW5kaWYKKwkJCWxhcGItPmNvbmRpdGlvbiAmPSB+TEFQQl9QRUVSX1JYX0JVU1lfQ09ORElUSU9OOworCQkJbGFwYl9jaGVja19uZWVkX3Jlc3BvbnNlKGxhcGIsIGZyYW1lLT5jciwgZnJhbWUtPnBmKTsKKwkJCWlmIChsYXBiX3ZhbGlkYXRlX25yKGxhcGIsIGZyYW1lLT5ucikpIHsKKwkJCQlsYXBiX2NoZWNrX2lmcmFtZXNfYWNrZWQobGFwYiwgZnJhbWUtPm5yKTsKKwkJCX0gZWxzZSB7CisJCQkJbGFwYi0+ZnJtcl9kYXRhID0gKmZyYW1lOworCQkJCWxhcGItPmZybXJfdHlwZSA9IExBUEJfRlJNUl9aOworCQkJCWxhcGJfdHJhbnNtaXRfZnJtcihsYXBiKTsKKyNpZiBMQVBCX0RFQlVHID4gMAorCQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMzIC0+IFM0XG4iLAorCQkJCSAgICAgICBsYXBiLT5kZXYpOworI2VuZGlmCisJCQkJbGFwYl9zdGFydF90MXRpbWVyKGxhcGIpOworCQkJCWxhcGJfc3RvcF90MnRpbWVyKGxhcGIpOworCQkJCWxhcGItPnN0YXRlICAgPSBMQVBCX1NUQVRFXzQ7CisJCQkJbGFwYi0+bjJjb3VudCA9IDA7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIExBUEJfUkVKOgorI2lmIExBUEJfREVCVUcgPiAxCisJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMyBSWCBSRUooJWQpIFIlZFxuIiwKKwkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZiwgZnJhbWUtPm5yKTsKKyNlbmRpZgorCQkJbGFwYi0+Y29uZGl0aW9uICY9IH5MQVBCX1BFRVJfUlhfQlVTWV9DT05ESVRJT047CisJCQlsYXBiX2NoZWNrX25lZWRfcmVzcG9uc2UobGFwYiwgZnJhbWUtPmNyLCBmcmFtZS0+cGYpOworCQkJaWYgKGxhcGJfdmFsaWRhdGVfbnIobGFwYiwgZnJhbWUtPm5yKSkgeworCQkJCWxhcGJfZnJhbWVzX2Fja2VkKGxhcGIsIGZyYW1lLT5ucik7CisJCQkJbGFwYl9zdG9wX3QxdGltZXIobGFwYik7CisJCQkJbGFwYi0+bjJjb3VudCA9IDA7CisJCQkJbGFwYl9yZXF1ZXVlX2ZyYW1lcyhsYXBiKTsKKwkJCX0gZWxzZSB7CisJCQkJbGFwYi0+ZnJtcl9kYXRhID0gKmZyYW1lOworCQkJCWxhcGItPmZybXJfdHlwZSA9IExBUEJfRlJNUl9aOworCQkJCWxhcGJfdHJhbnNtaXRfZnJtcihsYXBiKTsKKyNpZiBMQVBCX0RFQlVHID4gMAorCQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMzIC0+IFM0XG4iLAorCQkJCSAgICAgICBsYXBiLT5kZXYpOworI2VuZGlmCisJCQkJbGFwYl9zdGFydF90MXRpbWVyKGxhcGIpOworCQkJCWxhcGJfc3RvcF90MnRpbWVyKGxhcGIpOworCQkJCWxhcGItPnN0YXRlICAgPSBMQVBCX1NUQVRFXzQ7CisJCQkJbGFwYi0+bjJjb3VudCA9IDA7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIExBUEJfSToKKyNpZiBMQVBCX0RFQlVHID4gMQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgUlggSSglZCkgUyVkIFIlZFxuIiwKKwkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZiwgZnJhbWUtPm5zLCBmcmFtZS0+bnIpOworI2VuZGlmCisJCQlpZiAoIWxhcGJfdmFsaWRhdGVfbnIobGFwYiwgZnJhbWUtPm5yKSkgeworCQkJCWxhcGItPmZybXJfZGF0YSA9ICpmcmFtZTsKKwkJCQlsYXBiLT5mcm1yX3R5cGUgPSBMQVBCX0ZSTVJfWjsKKwkJCQlsYXBiX3RyYW5zbWl0X2ZybXIobGFwYik7CisjaWYgTEFQQl9ERUJVRyA+IDAKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMyAtPiBTNFxuIiwKKwkJCQkgICAgICAgbGFwYi0+ZGV2KTsKKyNlbmRpZgorCQkJCWxhcGJfc3RhcnRfdDF0aW1lcihsYXBiKTsKKwkJCQlsYXBiX3N0b3BfdDJ0aW1lcihsYXBiKTsKKwkJCQlsYXBiLT5zdGF0ZSAgID0gTEFQQl9TVEFURV80OworCQkJCWxhcGItPm4yY291bnQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGxhcGItPmNvbmRpdGlvbiAmIExBUEJfUEVFUl9SWF9CVVNZX0NPTkRJVElPTikKKwkJCQlsYXBiX2ZyYW1lc19hY2tlZChsYXBiLCBmcmFtZS0+bnIpOworCQkJZWxzZQorCQkJCWxhcGJfY2hlY2tfaWZyYW1lc19hY2tlZChsYXBiLCBmcmFtZS0+bnIpOworCisJCQlpZiAoZnJhbWUtPm5zID09IGxhcGItPnZyKSB7CisJCQkJaW50IGNuOworCQkJCWNuID0gbGFwYl9kYXRhX2luZGljYXRpb24obGFwYiwgc2tiKTsKKwkJCQlxdWV1ZWQgPSAxOworCQkJCS8qCisJCQkJICogSWYgdXBwZXIgbGF5ZXIgaGFzIGRyb3BwZWQgdGhlIGZyYW1lLCB3ZQorCQkJCSAqIGJhc2ljYWxseSBpZ25vcmUgYW55IGZ1cnRoZXIgcHJvdG9jb2wKKwkJCQkgKiBwcm9jZXNzaW5nLiBUaGlzIHdpbGwgY2F1c2UgdGhlIHBlZXIKKwkJCQkgKiB0byByZS10cmFuc21pdCB0aGUgZnJhbWUgbGF0ZXIgbGlrZQorCQkJCSAqIGEgZnJhbWUgbG9zdCBvbiB0aGUgd2lyZS4KKwkJCQkgKi8KKwkJCQlpZiAoY24gPT0gTkVUX1JYX0RST1ApIHsKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkJICAgICAgICJMQVBCOiByeCBjb25nZXN0aW9uXG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWxhcGItPnZyID0gKGxhcGItPnZyICsgMSkgJSBtb2R1bHVzOworCQkJCWxhcGItPmNvbmRpdGlvbiAmPSB+TEFQQl9SRUpFQ1RfQ09ORElUSU9OOworCQkJCWlmIChmcmFtZS0+cGYpCisJCQkJCWxhcGJfZW5xdWlyeV9yZXNwb25zZShsYXBiKTsKKwkJCQllbHNlIHsKKwkJCQkJaWYgKCEobGFwYi0+Y29uZGl0aW9uICYKKwkJCQkJICAgICAgTEFQQl9BQ0tfUEVORElOR19DT05ESVRJT04pKSB7CisJCQkJCQlsYXBiLT5jb25kaXRpb24gfD0gTEFQQl9BQ0tfUEVORElOR19DT05ESVRJT047CisJCQkJCQlsYXBiX3N0YXJ0X3QydGltZXIobGFwYik7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChsYXBiLT5jb25kaXRpb24gJiBMQVBCX1JFSkVDVF9DT05ESVRJT04pIHsKKwkJCQkJaWYgKGZyYW1lLT5wZikKKwkJCQkJCWxhcGJfZW5xdWlyeV9yZXNwb25zZShsYXBiKTsKKwkJCQl9IGVsc2UgeworI2lmIExBUEJfREVCVUcgPiAxCisJCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJCSAgICAgICAibGFwYjogKCVwKSBTMyBUWCBSRUooJWQpIFIlZFxuIiwKKwkJCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmLCBsYXBiLT52cik7CisjZW5kaWYKKwkJCQkJbGFwYi0+Y29uZGl0aW9uIHw9IExBUEJfUkVKRUNUX0NPTkRJVElPTjsKKwkJCQkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9SRUosCisJCQkJCQkJICBmcmFtZS0+cGYsCisJCQkJCQkJICBMQVBCX1JFU1BPTlNFKTsKKwkJCQkJbGFwYi0+Y29uZGl0aW9uICY9IH5MQVBCX0FDS19QRU5ESU5HX0NPTkRJVElPTjsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIExBUEJfRlJNUjoKKyNpZiBMQVBCX0RFQlVHID4gMQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgUlggRlJNUiglZCkgJTAyWCAiCisJCQkgICAgICAgIiUwMlggJTAyWCAlMDJYICUwMlhcbiIsIGxhcGItPmRldiwgZnJhbWUtPnBmLAorCQkJICAgICAgIHNrYi0+ZGF0YVswXSwgc2tiLT5kYXRhWzFdLCBza2ItPmRhdGFbMl0sCisJCQkgICAgICAgc2tiLT5kYXRhWzNdLCBza2ItPmRhdGFbNF0pOworI2VuZGlmCisJCQlsYXBiX2VzdGFibGlzaF9kYXRhX2xpbmsobGFwYik7CisjaWYgTEFQQl9ERUJVRyA+IDAKKwkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMzIC0+IFMxXG4iLAorCQkJICAgICAgIGxhcGItPmRldik7CisjZW5kaWYKKwkJCWxhcGJfcmVxdWV1ZV9mcmFtZXMobGFwYik7CisJCQlsYXBiLT5zdGF0ZSA9IExBUEJfU1RBVEVfMTsKKwkJCWJyZWFrOworCisJCWNhc2UgTEFQQl9JTExFR0FMOgorI2lmIExBUEJfREVCVUcgPiAxCisJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMyBSWCBJTExFR0FMKCVkKVxuIiwKKwkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CisjZW5kaWYKKwkJCWxhcGItPmZybXJfZGF0YSA9ICpmcmFtZTsKKwkJCWxhcGItPmZybXJfdHlwZSA9IExBUEJfRlJNUl9XOworCQkJbGFwYl90cmFuc21pdF9mcm1yKGxhcGIpOworI2lmIExBUEJfREVCVUcgPiAwCisJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMyAtPiBTNFxuIiwgbGFwYi0+ZGV2KTsKKyNlbmRpZgorCQkJbGFwYl9zdGFydF90MXRpbWVyKGxhcGIpOworCQkJbGFwYl9zdG9wX3QydGltZXIobGFwYik7CisJCQlsYXBiLT5zdGF0ZSAgID0gTEFQQl9TVEFURV80OworCQkJbGFwYi0+bjJjb3VudCA9IDA7CisJCQlicmVhazsKKwl9CisKKwlpZiAoIXF1ZXVlZCkKKwkJa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qCisgKglTdGF0ZSBtYWNoaW5lIGZvciBzdGF0ZSA0LCBGcmFtZSBSZWplY3QgU3RhdGUuCisgKglUaGUgaGFuZGxpbmcgb2YgdGhlIHRpbWVyKHMpIGlzIGluIGZpbGUgbGFwYl90aW1lci5jLgorICovCitzdGF0aWMgdm9pZCBsYXBiX3N0YXRlNF9tYWNoaW5lKHN0cnVjdCBsYXBiX2NiICpsYXBiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCXN0cnVjdCBsYXBiX2ZyYW1lICpmcmFtZSkKK3sKKwlzd2l0Y2ggKGZyYW1lLT50eXBlKSB7CisJCWNhc2UgTEFQQl9TQUJNOgorI2lmIExBUEJfREVCVUcgPiAxCisJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTNCBSWCBTQUJNKCVkKVxuIiwKKwkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CisjZW5kaWYKKwkJCWlmIChsYXBiLT5tb2RlICYgTEFQQl9FWFRFTkRFRCkgeworI2lmIExBUEJfREVCVUcgPiAxCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzQgVFggRE0oJWQpXG4iLAorCQkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CisjZW5kaWYKKwkJCQlsYXBiX3NlbmRfY29udHJvbChsYXBiLCBMQVBCX0RNLCBmcmFtZS0+cGYsCisJCQkJCQkgIExBUEJfUkVTUE9OU0UpOworCQkJfSBlbHNlIHsKKyNpZiBMQVBCX0RFQlVHID4gMQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFM0IFRYIFVBKCVkKVxuIiwKKwkJCQkgICAgICAgbGFwYi0+ZGV2LCBmcmFtZS0+cGYpOworI2VuZGlmCisjaWYgTEFQQl9ERUJVRyA+IDAKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTNCAtPiBTM1xuIiwKKwkJCQkgICAgICAgbGFwYi0+ZGV2KTsKKyNlbmRpZgorCQkJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfVUEsIGZyYW1lLT5wZiwKKwkJCQkJCSAgTEFQQl9SRVNQT05TRSk7CisJCQkJbGFwYl9zdG9wX3QxdGltZXIobGFwYik7CisJCQkJbGFwYl9zdG9wX3QydGltZXIobGFwYik7CisJCQkJbGFwYi0+c3RhdGUgICAgID0gTEFQQl9TVEFURV8zOworCQkJCWxhcGItPmNvbmRpdGlvbiA9IDB4MDA7CisJCQkJbGFwYi0+bjJjb3VudCAgID0gMDsKKwkJCQlsYXBiLT52cyAgICAgICAgPSAwOworCQkJCWxhcGItPnZyICAgICAgICA9IDA7CisJCQkJbGFwYi0+dmEgICAgICAgID0gMDsKKwkJCQlsYXBiX2Nvbm5lY3RfaW5kaWNhdGlvbihsYXBiLCBMQVBCX09LKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgTEFQQl9TQUJNRToKKyNpZiBMQVBCX0RFQlVHID4gMQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzQgUlggU0FCTUUoJWQpXG4iLAorCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKKyNlbmRpZgorCQkJaWYgKGxhcGItPm1vZGUgJiBMQVBCX0VYVEVOREVEKSB7CisjaWYgTEFQQl9ERUJVRyA+IDEKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTNCBUWCBVQSglZClcbiIsCisJCQkJICAgICAgIGxhcGItPmRldiwgZnJhbWUtPnBmKTsKKyNlbmRpZgorI2lmIExBUEJfREVCVUcgPiAwCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzQgLT4gUzNcbiIsCisJCQkJICAgICAgIGxhcGItPmRldik7CisjZW5kaWYKKwkJCQlsYXBiX3NlbmRfY29udHJvbChsYXBiLCBMQVBCX1VBLCBmcmFtZS0+cGYsCisJCQkJCQkgIExBUEJfUkVTUE9OU0UpOworCQkJCWxhcGJfc3RvcF90MXRpbWVyKGxhcGIpOworCQkJCWxhcGJfc3RvcF90MnRpbWVyKGxhcGIpOworCQkJCWxhcGItPnN0YXRlICAgICA9IExBUEJfU1RBVEVfMzsKKwkJCQlsYXBiLT5jb25kaXRpb24gPSAweDAwOworCQkJCWxhcGItPm4yY291bnQgICA9IDA7CisJCQkJbGFwYi0+dnMgICAgICAgID0gMDsKKwkJCQlsYXBiLT52ciAgICAgICAgPSAwOworCQkJCWxhcGItPnZhICAgICAgICA9IDA7CisJCQkJbGFwYl9jb25uZWN0X2luZGljYXRpb24obGFwYiwgTEFQQl9PSyk7CisJCQl9IGVsc2UgeworI2lmIExBUEJfREVCVUcgPiAxCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzQgVFggRE0oJWQpXG4iLAorCQkJCSAgICAgICBsYXBiLT5kZXYsIGZyYW1lLT5wZik7CisjZW5kaWYKKwkJCQlsYXBiX3NlbmRfY29udHJvbChsYXBiLCBMQVBCX0RNLCBmcmFtZS0+cGYsCisJCQkJCQkgIExBUEJfUkVTUE9OU0UpOworCQkJfQorCQkJYnJlYWs7CisJfQorCisJa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qCisgKglQcm9jZXNzIGFuIGluY29taW5nIExBUEIgZnJhbWUKKyAqLwordm9pZCBsYXBiX2RhdGFfaW5wdXQoc3RydWN0IGxhcGJfY2IgKmxhcGIsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxhcGJfZnJhbWUgZnJhbWU7CisKKwlpZiAobGFwYl9kZWNvZGUobGFwYiwgc2tiLCAmZnJhbWUpIDwgMCkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAobGFwYi0+c3RhdGUpIHsKKwljYXNlIExBUEJfU1RBVEVfMDoKKwkJbGFwYl9zdGF0ZTBfbWFjaGluZShsYXBiLCBza2IsICZmcmFtZSk7IGJyZWFrOworCWNhc2UgTEFQQl9TVEFURV8xOgorCQlsYXBiX3N0YXRlMV9tYWNoaW5lKGxhcGIsIHNrYiwgJmZyYW1lKTsgYnJlYWs7CisJY2FzZSBMQVBCX1NUQVRFXzI6CisJCWxhcGJfc3RhdGUyX21hY2hpbmUobGFwYiwgc2tiLCAmZnJhbWUpOyBicmVhazsKKwljYXNlIExBUEJfU1RBVEVfMzoKKwkJbGFwYl9zdGF0ZTNfbWFjaGluZShsYXBiLCBza2IsICZmcmFtZSk7IGJyZWFrOworCWNhc2UgTEFQQl9TVEFURV80OgorCQlsYXBiX3N0YXRlNF9tYWNoaW5lKGxhcGIsIHNrYiwgJmZyYW1lKTsgYnJlYWs7CisJfQorCisJbGFwYl9raWNrKGxhcGIpOworfQpkaWZmIC0tZ2l0IGEvbmV0L2xhcGIvbGFwYl9vdXQuYyBiL25ldC9sYXBiL2xhcGJfb3V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlhNzYxYgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9sYXBiL2xhcGJfb3V0LmMKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKglMQVBCIHJlbGVhc2UgMDAyCisgKgorICoJVGhpcyBjb2RlIFJFUVVJUkVTIDIuMS4xNSBvciBoaWdoZXIvIE5FVDMuMDM4CisgKgorICoJVGhpcyBtb2R1bGU6CisgKgkJVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCUhpc3RvcnkKKyAqCUxBUEIgMDAxCUpvbmF0aGFuIE5heWxvcglTdGFydGVkIENvZGluZworICoJTEFQQiAwMDIJSm9uYXRoYW4gTmF5bG9yCU5ldyB0aW1lciBhcmNoaXRlY3R1cmUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPG5ldC9sYXBiLmg+CisKKy8qIAorICogIFRoaXMgcHJvY2VkdXJlIGlzIHBhc3NlZCBhIGJ1ZmZlciBkZXNjcmlwdG9yIGZvciBhbiBpZnJhbWUuIEl0IGJ1aWxkcworICogIHRoZSByZXN0IG9mIHRoZSBjb250cm9sIHBhcnQgb2YgdGhlIGZyYW1lIGFuZCB0aGVuIHdyaXRlcyBpdCBvdXQuCisgKi8KK3N0YXRpYyB2b2lkIGxhcGJfc2VuZF9pZnJhbWUoc3RydWN0IGxhcGJfY2IgKmxhcGIsIHN0cnVjdCBza19idWZmICpza2IsIGludCBwb2xsX2JpdCkKK3sKKwl1bnNpZ25lZCBjaGFyICpmcmFtZTsKKworCWlmICghc2tiKQorCQlyZXR1cm47CisKKwlpZiAobGFwYi0+bW9kZSAmIExBUEJfRVhURU5ERUQpIHsKKwkJZnJhbWUgPSBza2JfcHVzaChza2IsIDIpOworCisJCWZyYW1lWzBdID0gTEFQQl9JOworCQlmcmFtZVswXSB8PSBsYXBiLT52cyA8PCAxOworCQlmcmFtZVsxXSA9IHBvbGxfYml0ID8gTEFQQl9FUEYgOiAwOworCQlmcmFtZVsxXSB8PSBsYXBiLT52ciA8PCAxOworCX0gZWxzZSB7CisJCWZyYW1lID0gc2tiX3B1c2goc2tiLCAxKTsKKworCQkqZnJhbWUgPSBMQVBCX0k7CisJCSpmcmFtZSB8PSBwb2xsX2JpdCA/IExBUEJfU1BGIDogMDsKKwkJKmZyYW1lIHw9IGxhcGItPnZyIDw8IDU7CisJCSpmcmFtZSB8PSBsYXBiLT52cyA8PCAxOworCX0KKworI2lmIExBUEJfREVCVUcgPiAxCisJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUyVkIFRYIEkoJWQpIFMlZCBSJWRcbiIsCisJICAgICAgIGxhcGItPmRldiwgbGFwYi0+c3RhdGUsIHBvbGxfYml0LCBsYXBiLT52cywgbGFwYi0+dnIpOworI2VuZGlmCisKKwlsYXBiX3RyYW5zbWl0X2J1ZmZlcihsYXBiLCBza2IsIExBUEJfQ09NTUFORCk7CQorfQorCit2b2lkIGxhcGJfa2ljayhzdHJ1Y3QgbGFwYl9jYiAqbGFwYikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqc2tibjsKKwl1bnNpZ25lZCBzaG9ydCBtb2R1bHVzLCBzdGFydCwgZW5kOworCisJbW9kdWx1cyA9IChsYXBiLT5tb2RlICYgTEFQQl9FWFRFTkRFRCkgPyBMQVBCX0VNT0RVTFVTIDogTEFQQl9TTU9EVUxVUzsKKwlzdGFydCA9ICFza2JfcGVlaygmbGFwYi0+YWNrX3F1ZXVlKSA/IGxhcGItPnZhIDogbGFwYi0+dnM7CisJZW5kICAgPSAobGFwYi0+dmEgKyBsYXBiLT53aW5kb3cpICUgbW9kdWx1czsKKworCWlmICghKGxhcGItPmNvbmRpdGlvbiAmIExBUEJfUEVFUl9SWF9CVVNZX0NPTkRJVElPTikgJiYKKwkgICAgc3RhcnQgIT0gZW5kICYmIHNrYl9wZWVrKCZsYXBiLT53cml0ZV9xdWV1ZSkpIHsKKwkJbGFwYi0+dnMgPSBzdGFydDsKKworCQkvKgorCQkgKiBEZXF1ZXVlIHRoZSBmcmFtZSBhbmQgY29weSBpdC4KKwkJICovCisJCXNrYiA9IHNrYl9kZXF1ZXVlKCZsYXBiLT53cml0ZV9xdWV1ZSk7CisKKwkJZG8geworCQkJaWYgKChza2JuID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwkJCQlza2JfcXVldWVfaGVhZCgmbGFwYi0+d3JpdGVfcXVldWUsIHNrYik7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChza2ItPnNrKQorCQkJCXNrYl9zZXRfb3duZXJfdyhza2JuLCBza2ItPnNrKTsKKworCQkJLyoKKwkJCSAqIFRyYW5zbWl0IHRoZSBmcmFtZSBjb3B5LgorCQkJICovCisJCQlsYXBiX3NlbmRfaWZyYW1lKGxhcGIsIHNrYm4sIExBUEJfUE9MTE9GRik7CisKKwkJCWxhcGItPnZzID0gKGxhcGItPnZzICsgMSkgJSBtb2R1bHVzOworCisJCQkvKgorCQkJICogUmVxdWV1ZSB0aGUgb3JpZ2luYWwgZGF0YSBmcmFtZS4KKwkJCSAqLworCQkJc2tiX3F1ZXVlX3RhaWwoJmxhcGItPmFja19xdWV1ZSwgc2tiKTsKKworCQl9IHdoaWxlIChsYXBiLT52cyAhPSBlbmQgJiYgKHNrYiA9IHNrYl9kZXF1ZXVlKCZsYXBiLT53cml0ZV9xdWV1ZSkpICE9IE5VTEwpOworCisJCWxhcGItPmNvbmRpdGlvbiAmPSB+TEFQQl9BQ0tfUEVORElOR19DT05ESVRJT047CisKKwkJaWYgKCFsYXBiX3QxdGltZXJfcnVubmluZyhsYXBiKSkKKwkJCWxhcGJfc3RhcnRfdDF0aW1lcihsYXBiKTsKKwl9Cit9CisKK3ZvaWQgbGFwYl90cmFuc21pdF9idWZmZXIoc3RydWN0IGxhcGJfY2IgKmxhcGIsIHN0cnVjdCBza19idWZmICpza2IsIGludCB0eXBlKQoreworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKworCXB0ciA9IHNrYl9wdXNoKHNrYiwgMSk7CisKKwlpZiAobGFwYi0+bW9kZSAmIExBUEJfTUxQKSB7CisJCWlmIChsYXBiLT5tb2RlICYgTEFQQl9EQ0UpIHsKKwkJCWlmICh0eXBlID09IExBUEJfQ09NTUFORCkKKwkJCQkqcHRyID0gTEFQQl9BRERSX0M7CisJCQlpZiAodHlwZSA9PSBMQVBCX1JFU1BPTlNFKQorCQkJCSpwdHIgPSBMQVBCX0FERFJfRDsKKwkJfSBlbHNlIHsKKwkJCWlmICh0eXBlID09IExBUEJfQ09NTUFORCkKKwkJCQkqcHRyID0gTEFQQl9BRERSX0Q7CisJCQlpZiAodHlwZSA9PSBMQVBCX1JFU1BPTlNFKQorCQkJCSpwdHIgPSBMQVBCX0FERFJfQzsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChsYXBiLT5tb2RlICYgTEFQQl9EQ0UpIHsKKwkJCWlmICh0eXBlID09IExBUEJfQ09NTUFORCkKKwkJCQkqcHRyID0gTEFQQl9BRERSX0E7CisJCQlpZiAodHlwZSA9PSBMQVBCX1JFU1BPTlNFKQorCQkJCSpwdHIgPSBMQVBCX0FERFJfQjsKKwkJfSBlbHNlIHsKKwkJCWlmICh0eXBlID09IExBUEJfQ09NTUFORCkKKwkJCQkqcHRyID0gTEFQQl9BRERSX0I7CisJCQlpZiAodHlwZSA9PSBMQVBCX1JFU1BPTlNFKQorCQkJCSpwdHIgPSBMQVBCX0FERFJfQTsKKwkJfQorCX0KKworI2lmIExBUEJfREVCVUcgPiAyCisJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUyVkIFRYICUwMlggJTAyWCAlMDJYXG4iLAorCSAgICAgICBsYXBiLT5kZXYsIGxhcGItPnN0YXRlLAorCSAgICAgICBza2ItPmRhdGFbMF0sIHNrYi0+ZGF0YVsxXSwgc2tiLT5kYXRhWzJdKTsKKyNlbmRpZgorCisJaWYgKCFsYXBiX2RhdGFfdHJhbnNtaXQobGFwYiwgc2tiKSkKKwkJa2ZyZWVfc2tiKHNrYik7Cit9CisKK3ZvaWQgbGFwYl9lc3RhYmxpc2hfZGF0YV9saW5rKHN0cnVjdCBsYXBiX2NiICpsYXBiKQoreworCWxhcGItPmNvbmRpdGlvbiA9IDB4MDA7CisJbGFwYi0+bjJjb3VudCAgID0gMDsKKworCWlmIChsYXBiLT5tb2RlICYgTEFQQl9FWFRFTkRFRCkgeworI2lmIExBUEJfREVCVUcgPiAxCisJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMlZCBUWCBTQUJNRSgxKVxuIiwKKwkJICAgICAgIGxhcGItPmRldiwgbGFwYi0+c3RhdGUpOworI2VuZGlmCisJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfU0FCTUUsIExBUEJfUE9MTE9OLCBMQVBCX0NPTU1BTkQpOworCX0gZWxzZSB7CisjaWYgTEFQQl9ERUJVRyA+IDEKKwkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUyVkIFRYIFNBQk0oMSlcbiIsCisJCSAgICAgICBsYXBiLT5kZXYsIGxhcGItPnN0YXRlKTsKKyNlbmRpZgorCQlsYXBiX3NlbmRfY29udHJvbChsYXBiLCBMQVBCX1NBQk0sIExBUEJfUE9MTE9OLCBMQVBCX0NPTU1BTkQpOworCX0KKworCWxhcGJfc3RhcnRfdDF0aW1lcihsYXBiKTsKKwlsYXBiX3N0b3BfdDJ0aW1lcihsYXBiKTsKK30KKwordm9pZCBsYXBiX2VucXVpcnlfcmVzcG9uc2Uoc3RydWN0IGxhcGJfY2IgKmxhcGIpCit7CisjaWYgTEFQQl9ERUJVRyA+IDEKKwlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTJWQgVFggUlIoMSkgUiVkXG4iLAorCSAgICAgICBsYXBiLT5kZXYsIGxhcGItPnN0YXRlLCBsYXBiLT52cik7CisjZW5kaWYKKworCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfUlIsIExBUEJfUE9MTE9OLCBMQVBCX1JFU1BPTlNFKTsKKworCWxhcGItPmNvbmRpdGlvbiAmPSB+TEFQQl9BQ0tfUEVORElOR19DT05ESVRJT047Cit9CisKK3ZvaWQgbGFwYl90aW1lb3V0X3Jlc3BvbnNlKHN0cnVjdCBsYXBiX2NiICpsYXBiKQoreworI2lmIExBUEJfREVCVUcgPiAxCisJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUyVkIFRYIFJSKDApIFIlZFxuIiwKKwkgICAgICAgbGFwYi0+ZGV2LCBsYXBiLT5zdGF0ZSwgbGFwYi0+dnIpOworI2VuZGlmCisJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9SUiwgTEFQQl9QT0xMT0ZGLCBMQVBCX1JFU1BPTlNFKTsKKworCWxhcGItPmNvbmRpdGlvbiAmPSB+TEFQQl9BQ0tfUEVORElOR19DT05ESVRJT047Cit9CisKK3ZvaWQgbGFwYl9jaGVja19pZnJhbWVzX2Fja2VkKHN0cnVjdCBsYXBiX2NiICpsYXBiLCB1bnNpZ25lZCBzaG9ydCBucikKK3sKKwlpZiAobGFwYi0+dnMgPT0gbnIpIHsKKwkJbGFwYl9mcmFtZXNfYWNrZWQobGFwYiwgbnIpOworCQlsYXBiX3N0b3BfdDF0aW1lcihsYXBiKTsKKwkJbGFwYi0+bjJjb3VudCA9IDA7CisJfSBlbHNlIGlmIChsYXBiLT52YSAhPSBucikgeworCQlsYXBiX2ZyYW1lc19hY2tlZChsYXBiLCBucik7CisJCWxhcGJfc3RhcnRfdDF0aW1lcihsYXBiKTsKKwl9Cit9CisKK3ZvaWQgbGFwYl9jaGVja19uZWVkX3Jlc3BvbnNlKHN0cnVjdCBsYXBiX2NiICpsYXBiLCBpbnQgdHlwZSwgaW50IHBmKQoreworCWlmICh0eXBlID09IExBUEJfQ09NTUFORCAmJiBwZikKKwkJbGFwYl9lbnF1aXJ5X3Jlc3BvbnNlKGxhcGIpOworfQpkaWZmIC0tZ2l0IGEvbmV0L2xhcGIvbGFwYl9zdWJyLmMgYi9uZXQvbGFwYi9sYXBiX3N1YnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGUwNWEwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2xhcGIvbGFwYl9zdWJyLmMKQEAgLTAsMCArMSwzMTMgQEAKKy8qCisgKglMQVBCIHJlbGVhc2UgMDAyCisgKgorICoJVGhpcyBjb2RlIFJFUVVJUkVTIDIuMS4xNSBvciBoaWdoZXIvIE5FVDMuMDM4CisgKgorICoJVGhpcyBtb2R1bGU6CisgKgkJVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCUhpc3RvcnkKKyAqCUxBUEIgMDAxCUpvbmF0aGFuIE5heWxvcglTdGFydGVkIENvZGluZworICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxuZXQvbGFwYi5oPgorCisvKgorICoJVGhpcyByb3V0aW5lIHB1cmdlcyBhbGwgdGhlIHF1ZXVlcyBvZiBmcmFtZXMuCisgKi8KK3ZvaWQgbGFwYl9jbGVhcl9xdWV1ZXMoc3RydWN0IGxhcGJfY2IgKmxhcGIpCit7CisJc2tiX3F1ZXVlX3B1cmdlKCZsYXBiLT53cml0ZV9xdWV1ZSk7CisJc2tiX3F1ZXVlX3B1cmdlKCZsYXBiLT5hY2tfcXVldWUpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIHB1cmdlcyB0aGUgaW5wdXQgcXVldWUgb2YgdGhvc2UgZnJhbWVzIHRoYXQgaGF2ZSBiZWVuCisgKiBhY2tub3dsZWRnZWQuIFRoaXMgcmVwbGFjZXMgdGhlIGJveGVzIGxhYmVsbGVkICJWKGEpIDwtIE4ocikiIG9uIHRoZQorICogU0RMIGRpYWdyYW0uCisgKi8KK3ZvaWQgbGFwYl9mcmFtZXNfYWNrZWQoc3RydWN0IGxhcGJfY2IgKmxhcGIsIHVuc2lnbmVkIHNob3J0IG5yKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IG1vZHVsdXM7CisKKwltb2R1bHVzID0gKGxhcGItPm1vZGUgJiBMQVBCX0VYVEVOREVEKSA/IExBUEJfRU1PRFVMVVMgOiBMQVBCX1NNT0RVTFVTOworCisJLyoKKwkgKiBSZW1vdmUgYWxsIHRoZSBhY2stZWQgZnJhbWVzIGZyb20gdGhlIGFjayBxdWV1ZS4KKwkgKi8KKwlpZiAobGFwYi0+dmEgIT0gbnIpCisJCXdoaWxlIChza2JfcGVlaygmbGFwYi0+YWNrX3F1ZXVlKSAmJiBsYXBiLT52YSAhPSBucikgeworCQkgICAgICAgIHNrYiA9IHNrYl9kZXF1ZXVlKCZsYXBiLT5hY2tfcXVldWUpOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlsYXBiLT52YSA9IChsYXBiLT52YSArIDEpICUgbW9kdWx1czsKKwkJfQorfQorCit2b2lkIGxhcGJfcmVxdWV1ZV9mcmFtZXMoc3RydWN0IGxhcGJfY2IgKmxhcGIpCit7CisgICAgICAgIHN0cnVjdCBza19idWZmICpza2IsICpza2JfcHJldiA9IE5VTEw7CisKKwkvKgorCSAqIFJlcXVldWUgYWxsIHRoZSB1bi1hY2stZWQgZnJhbWVzIG9uIHRoZSBvdXRwdXQgcXVldWUgdG8gYmUgcGlja2VkCisJICogdXAgYnkgbGFwYl9raWNrIGNhbGxlZCBmcm9tIHRoZSB0aW1lci4gVGhpcyBhcnJhbmdlbWVudCBoYW5kbGVzIHRoZQorCSAqIHBvc3NpYmlsaXR5IG9mIGFuIGVtcHR5IG91dHB1dCBxdWV1ZS4KKwkgKi8KKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZsYXBiLT5hY2tfcXVldWUpKSAhPSBOVUxMKSB7CisJCWlmICghc2tiX3ByZXYpCisJCQlza2JfcXVldWVfaGVhZCgmbGFwYi0+d3JpdGVfcXVldWUsIHNrYik7CisJCWVsc2UKKwkJCXNrYl9hcHBlbmQoc2tiX3ByZXYsIHNrYik7CisJCXNrYl9wcmV2ID0gc2tiOworCX0KK30KKworLyoKKyAqCVZhbGlkYXRlIHRoYXQgdGhlIHZhbHVlIG9mIG5yIGlzIGJldHdlZW4gdmEgYW5kIHZzLiBSZXR1cm4gdHJ1ZSBvcgorICoJZmFsc2UgZm9yIHRlc3RpbmcuCisgKi8KK2ludCBsYXBiX3ZhbGlkYXRlX25yKHN0cnVjdCBsYXBiX2NiICpsYXBiLCB1bnNpZ25lZCBzaG9ydCBucikKK3sKKwl1bnNpZ25lZCBzaG9ydCB2YyA9IGxhcGItPnZhOworCWludCBtb2R1bHVzOworCQorCW1vZHVsdXMgPSAobGFwYi0+bW9kZSAmIExBUEJfRVhURU5ERUQpID8gTEFQQl9FTU9EVUxVUyA6IExBUEJfU01PRFVMVVM7CisKKwl3aGlsZSAodmMgIT0gbGFwYi0+dnMpIHsKKwkJaWYgKG5yID09IHZjKQorCQkJcmV0dXJuIDE7CisJCXZjID0gKHZjICsgMSkgJSBtb2R1bHVzOworCX0KKwkKKwlyZXR1cm4gbnIgPT0gbGFwYi0+dnM7Cit9CisKKy8qCisgKglUaGlzIHJvdXRpbmUgaXMgdGhlIGNlbnRyYWxpc2VkIHJvdXRpbmUgZm9yIHBhcnNpbmcgdGhlIGNvbnRyb2wKKyAqCWluZm9ybWF0aW9uIGZvciB0aGUgZGlmZmVyZW50IGZyYW1lIGZvcm1hdHMuCisgKi8KK2ludCBsYXBiX2RlY29kZShzdHJ1Y3QgbGFwYl9jYiAqbGFwYiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJc3RydWN0IGxhcGJfZnJhbWUgKmZyYW1lKQoreworCWZyYW1lLT50eXBlID0gTEFQQl9JTExFR0FMOworCisjaWYgTEFQQl9ERUJVRyA+IDIKKwlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTJWQgUlggJTAyWCAlMDJYICUwMlhcbiIsCisJICAgICAgIGxhcGItPmRldiwgbGFwYi0+c3RhdGUsCisJICAgICAgIHNrYi0+ZGF0YVswXSwgc2tiLT5kYXRhWzFdLCBza2ItPmRhdGFbMl0pOworI2VuZGlmCisKKwkvKiBXZSBhbHdheXMgbmVlZCB0byBsb29rIGF0IDIgYnl0ZXMsIHNvbWV0aW1lcyB3ZSBuZWVkCisJICogdG8gbG9vayBhdCAzIGFuZCB0aG9zZSBjYXNlcyBhcmUgaGFuZGxlZCBiZWxvdy4KKwkgKi8KKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCAyKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKGxhcGItPm1vZGUgJiBMQVBCX01MUCkgeworCQlpZiAobGFwYi0+bW9kZSAmIExBUEJfRENFKSB7CisJCQlpZiAoc2tiLT5kYXRhWzBdID09IExBUEJfQUREUl9EKQorCQkJCWZyYW1lLT5jciA9IExBUEJfQ09NTUFORDsKKwkJCWlmIChza2ItPmRhdGFbMF0gPT0gTEFQQl9BRERSX0MpCisJCQkJZnJhbWUtPmNyID0gTEFQQl9SRVNQT05TRTsKKwkJfSBlbHNlIHsKKwkJCWlmIChza2ItPmRhdGFbMF0gPT0gTEFQQl9BRERSX0MpCisJCQkJZnJhbWUtPmNyID0gTEFQQl9DT01NQU5EOworCQkJaWYgKHNrYi0+ZGF0YVswXSA9PSBMQVBCX0FERFJfRCkKKwkJCQlmcmFtZS0+Y3IgPSBMQVBCX1JFU1BPTlNFOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGxhcGItPm1vZGUgJiBMQVBCX0RDRSkgeworCQkJaWYgKHNrYi0+ZGF0YVswXSA9PSBMQVBCX0FERFJfQikKKwkJCQlmcmFtZS0+Y3IgPSBMQVBCX0NPTU1BTkQ7CisJCQlpZiAoc2tiLT5kYXRhWzBdID09IExBUEJfQUREUl9BKQorCQkJCWZyYW1lLT5jciA9IExBUEJfUkVTUE9OU0U7CisJCX0gZWxzZSB7CisJCQlpZiAoc2tiLT5kYXRhWzBdID09IExBUEJfQUREUl9BKQorCQkJCWZyYW1lLT5jciA9IExBUEJfQ09NTUFORDsKKwkJCWlmIChza2ItPmRhdGFbMF0gPT0gTEFQQl9BRERSX0IpCisJCQkJZnJhbWUtPmNyID0gTEFQQl9SRVNQT05TRTsKKwkJfQorCX0KKwkJCisJc2tiX3B1bGwoc2tiLCAxKTsKKworCWlmIChsYXBiLT5tb2RlICYgTEFQQl9FWFRFTkRFRCkgeworCQlpZiAoIShza2ItPmRhdGFbMF0gJiBMQVBCX1MpKSB7CisJCQlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCAyKSkKKwkJCQlyZXR1cm4gLTE7CisJCQkvKgorCQkJICogSSBmcmFtZSAtIGNhcnJpZXMgTlIvTlMvUEYKKwkJCSAqLworCQkJZnJhbWUtPnR5cGUgICAgICAgPSBMQVBCX0k7CisJCQlmcmFtZS0+bnMgICAgICAgICA9IChza2ItPmRhdGFbMF0gPj4gMSkgJiAweDdGOworCQkJZnJhbWUtPm5yICAgICAgICAgPSAoc2tiLT5kYXRhWzFdID4+IDEpICYgMHg3RjsKKwkJCWZyYW1lLT5wZiAgICAgICAgID0gc2tiLT5kYXRhWzFdICYgTEFQQl9FUEY7CisJCQlmcmFtZS0+Y29udHJvbFswXSA9IHNrYi0+ZGF0YVswXTsKKwkJCWZyYW1lLT5jb250cm9sWzFdID0gc2tiLT5kYXRhWzFdOworCQkJc2tiX3B1bGwoc2tiLCAyKTsKKwkJfSBlbHNlIGlmICgoc2tiLT5kYXRhWzBdICYgTEFQQl9VKSA9PSAxKSB7CisJCQlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCAyKSkKKwkJCQlyZXR1cm4gLTE7CisJCQkvKgorCQkJICogUyBmcmFtZSAtIHRha2Ugb3V0IFBGL05SCisJCQkgKi8KKwkJCWZyYW1lLT50eXBlICAgICAgID0gc2tiLT5kYXRhWzBdICYgMHgwRjsKKwkJCWZyYW1lLT5uciAgICAgICAgID0gKHNrYi0+ZGF0YVsxXSA+PiAxKSAmIDB4N0Y7CisJCQlmcmFtZS0+cGYgICAgICAgICA9IHNrYi0+ZGF0YVsxXSAmIExBUEJfRVBGOworCQkJZnJhbWUtPmNvbnRyb2xbMF0gPSBza2ItPmRhdGFbMF07CisJCQlmcmFtZS0+Y29udHJvbFsxXSA9IHNrYi0+ZGF0YVsxXTsKKwkJCXNrYl9wdWxsKHNrYiwgMik7CisJCX0gZWxzZSBpZiAoKHNrYi0+ZGF0YVswXSAmIExBUEJfVSkgPT0gMykgeworCQkJLyoKKwkJCSAqIFUgZnJhbWUgLSB0YWtlIG91dCBQRgorCQkJICovCisJCQlmcmFtZS0+dHlwZSAgICAgICA9IHNrYi0+ZGF0YVswXSAmIH5MQVBCX1NQRjsKKwkJCWZyYW1lLT5wZiAgICAgICAgID0gc2tiLT5kYXRhWzBdICYgTEFQQl9TUEY7CisJCQlmcmFtZS0+Y29udHJvbFswXSA9IHNrYi0+ZGF0YVswXTsKKwkJCWZyYW1lLT5jb250cm9sWzFdID0gMHgwMDsKKwkJCXNrYl9wdWxsKHNrYiwgMSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIShza2ItPmRhdGFbMF0gJiBMQVBCX1MpKSB7CisJCQkvKgorCQkJICogSSBmcmFtZSAtIGNhcnJpZXMgTlIvTlMvUEYKKwkJCSAqLworCQkJZnJhbWUtPnR5cGUgPSBMQVBCX0k7CisJCQlmcmFtZS0+bnMgICA9IChza2ItPmRhdGFbMF0gPj4gMSkgJiAweDA3OworCQkJZnJhbWUtPm5yICAgPSAoc2tiLT5kYXRhWzBdID4+IDUpICYgMHgwNzsKKwkJCWZyYW1lLT5wZiAgID0gc2tiLT5kYXRhWzBdICYgTEFQQl9TUEY7CisJCX0gZWxzZSBpZiAoKHNrYi0+ZGF0YVswXSAmIExBUEJfVSkgPT0gMSkgeworCQkJLyoKKwkJCSAqIFMgZnJhbWUgLSB0YWtlIG91dCBQRi9OUgorCQkJICovCisJCQlmcmFtZS0+dHlwZSA9IHNrYi0+ZGF0YVswXSAmIDB4MEY7CisJCQlmcmFtZS0+bnIgICA9IChza2ItPmRhdGFbMF0gPj4gNSkgJiAweDA3OworCQkJZnJhbWUtPnBmICAgPSBza2ItPmRhdGFbMF0gJiBMQVBCX1NQRjsKKwkJfSBlbHNlIGlmICgoc2tiLT5kYXRhWzBdICYgTEFQQl9VKSA9PSAzKSB7CisJCQkvKgorCQkJICogVSBmcmFtZSAtIHRha2Ugb3V0IFBGCisJCQkgKi8KKwkJCWZyYW1lLT50eXBlID0gc2tiLT5kYXRhWzBdICYgfkxBUEJfU1BGOworCQkJZnJhbWUtPnBmICAgPSBza2ItPmRhdGFbMF0gJiBMQVBCX1NQRjsKKwkJfQorCisJCWZyYW1lLT5jb250cm9sWzBdID0gc2tiLT5kYXRhWzBdOworCisJCXNrYl9wdWxsKHNrYiwgMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIAorICoJVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHRoZSBIRExDIGxheWVyIGludGVybmFsbHkgIGdlbmVyYXRlcyBhCisgKgljb21tYW5kIG9yICByZXNwb25zZSAgZm9yICB0aGUgcmVtb3RlIG1hY2hpbmUgKCBlZy4gUlIsIFVBIGV0Yy4gKS4gCisgKglPbmx5IHN1cGVydmlzb3J5IG9yIHVubnVtYmVyZWQgZnJhbWVzIGFyZSBwcm9jZXNzZWQsIEZSTVJzIGFyZSBoYW5kbGVkCisgKglieSBsYXBiX3RyYW5zbWl0X2ZybXIgYmVsb3cuCisgKi8KK3ZvaWQgbGFwYl9zZW5kX2NvbnRyb2woc3RydWN0IGxhcGJfY2IgKmxhcGIsIGludCBmcmFtZXR5cGUsCisJCSAgICAgICBpbnQgcG9sbF9iaXQsIGludCB0eXBlKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgY2hhciAgKmRwdHI7CisKKwlpZiAoKHNrYiA9IGFsbG9jX3NrYihMQVBCX0hFQURFUl9MRU4gKyAzLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc2tiX3Jlc2VydmUoc2tiLCBMQVBCX0hFQURFUl9MRU4gKyAxKTsKKworCWlmIChsYXBiLT5tb2RlICYgTEFQQl9FWFRFTkRFRCkgeworCQlpZiAoKGZyYW1ldHlwZSAmIExBUEJfVSkgPT0gTEFQQl9VKSB7CisJCQlkcHRyICAgPSBza2JfcHV0KHNrYiwgMSk7CisJCQkqZHB0ciAgPSBmcmFtZXR5cGU7CisJCQkqZHB0ciB8PSBwb2xsX2JpdCA/IExBUEJfU1BGIDogMDsKKwkJfSBlbHNlIHsKKwkJCWRwdHIgICAgID0gc2tiX3B1dChza2IsIDIpOworCQkJZHB0clswXSAgPSBmcmFtZXR5cGU7CisJCQlkcHRyWzFdICA9IChsYXBiLT52ciA8PCAxKTsKKwkJCWRwdHJbMV0gfD0gcG9sbF9iaXQgPyBMQVBCX0VQRiA6IDA7CisJCX0KKwl9IGVsc2UgeworCQlkcHRyICAgPSBza2JfcHV0KHNrYiwgMSk7CisJCSpkcHRyICA9IGZyYW1ldHlwZTsKKwkJKmRwdHIgfD0gcG9sbF9iaXQgPyBMQVBCX1NQRiA6IDA7CisJCWlmICgoZnJhbWV0eXBlICYgTEFQQl9VKSA9PSBMQVBCX1MpCS8qIFMgZnJhbWVzIGNhcnJ5IE5SICovCisJCQkqZHB0ciB8PSAobGFwYi0+dnIgPDwgNSk7CisJfQorCisJbGFwYl90cmFuc21pdF9idWZmZXIobGFwYiwgc2tiLCB0eXBlKTsKK30KKworLyogCisgKglUaGlzIHJvdXRpbmUgZ2VuZXJhdGVzIEZSTVJzIGJhc2VkIG9uIGluZm9ybWF0aW9uIHByZXZpb3VzbHkgc3RvcmVkIGluCisgKgl0aGUgTEFQQiBjb250cm9sIGJsb2NrLgorICovCit2b2lkIGxhcGJfdHJhbnNtaXRfZnJtcihzdHJ1Y3QgbGFwYl9jYiAqbGFwYikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGNoYXIgICpkcHRyOworCisJaWYgKChza2IgPSBhbGxvY19za2IoTEFQQl9IRUFERVJfTEVOICsgNywgR0ZQX0FUT01JQykpID09IE5VTEwpCisJCXJldHVybjsKKworCXNrYl9yZXNlcnZlKHNrYiwgTEFQQl9IRUFERVJfTEVOICsgMSk7CisKKwlpZiAobGFwYi0+bW9kZSAmIExBUEJfRVhURU5ERUQpIHsKKwkJZHB0ciAgICA9IHNrYl9wdXQoc2tiLCA2KTsKKwkJKmRwdHIrKyA9IExBUEJfRlJNUjsKKwkJKmRwdHIrKyA9IGxhcGItPmZybXJfZGF0YS5jb250cm9sWzBdOworCQkqZHB0cisrID0gbGFwYi0+ZnJtcl9kYXRhLmNvbnRyb2xbMV07CisJCSpkcHRyKysgPSAobGFwYi0+dnMgPDwgMSkgJiAweEZFOworCQkqZHB0ciAgID0gKGxhcGItPnZyIDw8IDEpICYgMHhGRTsKKwkJaWYgKGxhcGItPmZybXJfZGF0YS5jciA9PSBMQVBCX1JFU1BPTlNFKQorCQkJKmRwdHIgfD0gMHgwMTsKKwkJZHB0cisrOworCQkqZHB0cisrID0gbGFwYi0+ZnJtcl90eXBlOworCisjaWYgTEFQQl9ERUJVRyA+IDEKKwlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTJWQgVFggRlJNUiAlMDJYICUwMlggJTAyWCAlMDJYICUwMlhcbiIsCisJICAgICAgIGxhcGItPmRldiwgbGFwYi0+c3RhdGUsCisJICAgICAgIHNrYi0+ZGF0YVsxXSwgc2tiLT5kYXRhWzJdLCBza2ItPmRhdGFbM10sCisJICAgICAgIHNrYi0+ZGF0YVs0XSwgc2tiLT5kYXRhWzVdKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWRwdHIgICAgPSBza2JfcHV0KHNrYiwgNCk7CisJCSpkcHRyKysgPSBMQVBCX0ZSTVI7CisJCSpkcHRyKysgPSBsYXBiLT5mcm1yX2RhdGEuY29udHJvbFswXTsKKwkJKmRwdHIgICA9IChsYXBiLT52cyA8PCAxKSAmIDB4MEU7CisJCSpkcHRyICB8PSAobGFwYi0+dnIgPDwgNSkgJiAweEUwOworCQlpZiAobGFwYi0+ZnJtcl9kYXRhLmNyID09IExBUEJfUkVTUE9OU0UpCisJCQkqZHB0ciB8PSAweDEwOworCQlkcHRyKys7CisJCSpkcHRyKysgPSBsYXBiLT5mcm1yX3R5cGU7CisKKyNpZiBMQVBCX0RFQlVHID4gMQorCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMlZCBUWCBGUk1SICUwMlggJTAyWCAlMDJYXG4iLAorCSAgICAgICBsYXBiLT5kZXYsIGxhcGItPnN0YXRlLCBza2ItPmRhdGFbMV0sCisJICAgICAgIHNrYi0+ZGF0YVsyXSwgc2tiLT5kYXRhWzNdKTsKKyNlbmRpZgorCX0KKworCWxhcGJfdHJhbnNtaXRfYnVmZmVyKGxhcGIsIHNrYiwgTEFQQl9SRVNQT05TRSk7Cit9CmRpZmYgLS1naXQgYS9uZXQvbGFwYi9sYXBiX3RpbWVyLmMgYi9uZXQvbGFwYi9sYXBiX3RpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM4ZjBmOAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9sYXBiL2xhcGJfdGltZXIuYwpAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqCUxBUEIgcmVsZWFzZSAwMDIKKyAqCisgKglUaGlzIGNvZGUgUkVRVUlSRVMgMi4xLjE1IG9yIGhpZ2hlci8gTkVUMy4wMzgKKyAqCisgKglUaGlzIG1vZHVsZToKKyAqCQlUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJSGlzdG9yeQorICoJTEFQQiAwMDEJSm9uYXRoYW4gTmF5bG9yCVN0YXJ0ZWQgQ29kaW5nCisgKglMQVBCIDAwMglKb25hdGhhbiBOYXlsb3IJTmV3IHRpbWVyIGFyY2hpdGVjdHVyZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxuZXQvbGFwYi5oPgorCitzdGF0aWMgdm9pZCBsYXBiX3QxdGltZXJfZXhwaXJ5KHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgbGFwYl90MnRpbWVyX2V4cGlyeSh1bnNpZ25lZCBsb25nKTsKKwordm9pZCBsYXBiX3N0YXJ0X3QxdGltZXIoc3RydWN0IGxhcGJfY2IgKmxhcGIpCit7CisJZGVsX3RpbWVyKCZsYXBiLT50MXRpbWVyKTsKKworCWxhcGItPnQxdGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZylsYXBiOworCWxhcGItPnQxdGltZXIuZnVuY3Rpb24gPSAmbGFwYl90MXRpbWVyX2V4cGlyeTsKKwlsYXBiLT50MXRpbWVyLmV4cGlyZXMgID0gamlmZmllcyArIGxhcGItPnQxOworCisJYWRkX3RpbWVyKCZsYXBiLT50MXRpbWVyKTsKK30KKwordm9pZCBsYXBiX3N0YXJ0X3QydGltZXIoc3RydWN0IGxhcGJfY2IgKmxhcGIpCit7CisJZGVsX3RpbWVyKCZsYXBiLT50MnRpbWVyKTsKKworCWxhcGItPnQydGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZylsYXBiOworCWxhcGItPnQydGltZXIuZnVuY3Rpb24gPSAmbGFwYl90MnRpbWVyX2V4cGlyeTsKKwlsYXBiLT50MnRpbWVyLmV4cGlyZXMgID0gamlmZmllcyArIGxhcGItPnQyOworCisJYWRkX3RpbWVyKCZsYXBiLT50MnRpbWVyKTsKK30KKwordm9pZCBsYXBiX3N0b3BfdDF0aW1lcihzdHJ1Y3QgbGFwYl9jYiAqbGFwYikKK3sKKwlkZWxfdGltZXIoJmxhcGItPnQxdGltZXIpOworfQorCit2b2lkIGxhcGJfc3RvcF90MnRpbWVyKHN0cnVjdCBsYXBiX2NiICpsYXBiKQoreworCWRlbF90aW1lcigmbGFwYi0+dDJ0aW1lcik7Cit9CisKK2ludCBsYXBiX3QxdGltZXJfcnVubmluZyhzdHJ1Y3QgbGFwYl9jYiAqbGFwYikKK3sKKwlyZXR1cm4gdGltZXJfcGVuZGluZygmbGFwYi0+dDF0aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIGxhcGJfdDJ0aW1lcl9leHBpcnkodW5zaWduZWQgbG9uZyBwYXJhbSkKK3sKKwlzdHJ1Y3QgbGFwYl9jYiAqbGFwYiA9IChzdHJ1Y3QgbGFwYl9jYiAqKXBhcmFtOworCisJaWYgKGxhcGItPmNvbmRpdGlvbiAmIExBUEJfQUNLX1BFTkRJTkdfQ09ORElUSU9OKSB7CisJCWxhcGItPmNvbmRpdGlvbiAmPSB+TEFQQl9BQ0tfUEVORElOR19DT05ESVRJT047CisJCWxhcGJfdGltZW91dF9yZXNwb25zZShsYXBiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGxhcGJfdDF0aW1lcl9leHBpcnkodW5zaWduZWQgbG9uZyBwYXJhbSkKK3sKKwlzdHJ1Y3QgbGFwYl9jYiAqbGFwYiA9IChzdHJ1Y3QgbGFwYl9jYiAqKXBhcmFtOworCisJc3dpdGNoIChsYXBiLT5zdGF0ZSkgeworCisJCS8qCisJCSAqCUlmIHdlIGFyZSBhIERDRSwga2VlcCBnb2luZyBETSAuLiBETSAuLiBETQorCQkgKi8KKwkJY2FzZSBMQVBCX1NUQVRFXzA6CisJCQlpZiAobGFwYi0+bW9kZSAmIExBUEJfRENFKQorCQkJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfRE0sIExBUEJfUE9MTE9GRiwgTEFQQl9SRVNQT05TRSk7CisJCQlicmVhazsKKworCQkvKgorCQkgKglBd2FpdGluZyBjb25uZWN0aW9uIHN0YXRlLCBzZW5kIFNBQk0oRSksIHVwIHRvIE4yIHRpbWVzLgorCQkgKi8KKwkJY2FzZSBMQVBCX1NUQVRFXzE6IAorCQkJaWYgKGxhcGItPm4yY291bnQgPT0gbGFwYi0+bjIpIHsKKwkJCQlsYXBiX2NsZWFyX3F1ZXVlcyhsYXBiKTsKKwkJCQlsYXBiLT5zdGF0ZSA9IExBUEJfU1RBVEVfMDsKKwkJCQlsYXBiX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbihsYXBiLCBMQVBCX1RJTUVET1VUKTsKKyNpZiBMQVBCX0RFQlVHID4gMAorCQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMxIC0+IFMwXG4iLCBsYXBiLT5kZXYpOworI2VuZGlmCisJCQkJcmV0dXJuOworCQkJfSBlbHNlIHsKKwkJCQlsYXBiLT5uMmNvdW50Kys7CisJCQkJaWYgKGxhcGItPm1vZGUgJiBMQVBCX0VYVEVOREVEKSB7CisjaWYgTEFQQl9ERUJVRyA+IDEKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzEgVFggU0FCTUUoMSlcbiIsIGxhcGItPmRldik7CisjZW5kaWYKKwkJCQkJbGFwYl9zZW5kX2NvbnRyb2wobGFwYiwgTEFQQl9TQUJNRSwgTEFQQl9QT0xMT04sIExBUEJfQ09NTUFORCk7CisJCQkJfSBlbHNlIHsKKyNpZiBMQVBCX0RFQlVHID4gMQorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTMSBUWCBTQUJNKDEpXG4iLCBsYXBiLT5kZXYpOworI2VuZGlmCisJCQkJCWxhcGJfc2VuZF9jb250cm9sKGxhcGIsIExBUEJfU0FCTSwgTEFQQl9QT0xMT04sIExBUEJfQ09NTUFORCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICoJQXdhaXRpbmcgZGlzY29ubmVjdGlvbiBzdGF0ZSwgc2VuZCBESVNDLCB1cCB0byBOMiB0aW1lcy4KKwkJICovCisJCWNhc2UgTEFQQl9TVEFURV8yOgorCQkJaWYgKGxhcGItPm4yY291bnQgPT0gbGFwYi0+bjIpIHsKKwkJCQlsYXBiX2NsZWFyX3F1ZXVlcyhsYXBiKTsKKwkJCQlsYXBiLT5zdGF0ZSA9IExBUEJfU1RBVEVfMDsKKwkJCQlsYXBiX2Rpc2Nvbm5lY3RfY29uZmlybWF0aW9uKGxhcGIsIExBUEJfVElNRURPVVQpOworI2lmIExBUEJfREVCVUcgPiAwCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzIgLT4gUzBcbiIsIGxhcGItPmRldik7CisjZW5kaWYKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCWxhcGItPm4yY291bnQrKzsKKyNpZiBMQVBCX0RFQlVHID4gMQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJsYXBiOiAoJXApIFMyIFRYIERJU0MoMSlcbiIsIGxhcGItPmRldik7CisjZW5kaWYKKwkJCQlsYXBiX3NlbmRfY29udHJvbChsYXBiLCBMQVBCX0RJU0MsIExBUEJfUE9MTE9OLCBMQVBCX0NPTU1BTkQpOworCQkJfQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICoJRGF0YSB0cmFuc2ZlciBzdGF0ZSwgcmVzdHJhbnNtaXQgSSBmcmFtZXMsIHVwIHRvIE4yIHRpbWVzLgorCQkgKi8KKwkJY2FzZSBMQVBCX1NUQVRFXzM6CisJCQlpZiAobGFwYi0+bjJjb3VudCA9PSBsYXBiLT5uMikgeworCQkJCWxhcGJfY2xlYXJfcXVldWVzKGxhcGIpOworCQkJCWxhcGItPnN0YXRlID0gTEFQQl9TVEFURV8wOworCQkJCWxhcGJfc3RvcF90MnRpbWVyKGxhcGIpOworCQkJCWxhcGJfZGlzY29ubmVjdF9pbmRpY2F0aW9uKGxhcGIsIExBUEJfVElNRURPVVQpOworI2lmIExBUEJfREVCVUcgPiAwCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImxhcGI6ICglcCkgUzMgLT4gUzBcbiIsIGxhcGItPmRldik7CisjZW5kaWYKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCWxhcGItPm4yY291bnQrKzsKKwkJCQlsYXBiX3JlcXVldWVfZnJhbWVzKGxhcGIpOworCQkJfQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICoJRnJhbWUgcmVqZWN0IHN0YXRlLCByZXN0cmFuc21pdCBGUk1SIGZyYW1lcywgdXAgdG8gTjIgdGltZXMuCisJCSAqLworCQljYXNlIExBUEJfU1RBVEVfNDoKKwkJCWlmIChsYXBiLT5uMmNvdW50ID09IGxhcGItPm4yKSB7CisJCQkJbGFwYl9jbGVhcl9xdWV1ZXMobGFwYik7CisJCQkJbGFwYi0+c3RhdGUgPSBMQVBCX1NUQVRFXzA7CisJCQkJbGFwYl9kaXNjb25uZWN0X2luZGljYXRpb24obGFwYiwgTEFQQl9USU1FRE9VVCk7CisjaWYgTEFQQl9ERUJVRyA+IDAKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYjogKCVwKSBTNCAtPiBTMFxuIiwgbGFwYi0+ZGV2KTsKKyNlbmRpZgorCQkJCXJldHVybjsKKwkJCX0gZWxzZSB7CisJCQkJbGFwYi0+bjJjb3VudCsrOworCQkJCWxhcGJfdHJhbnNtaXRfZnJtcihsYXBiKTsKKwkJCX0KKwkJCWJyZWFrOworCX0KKworCWxhcGJfc3RhcnRfdDF0aW1lcihsYXBiKTsKK30KZGlmZiAtLWdpdCBhL25ldC9sbGMvS2NvbmZpZyBiL25ldC9sbGMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTFjNjUxCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2xsYy9LY29uZmlnCkBAIC0wLDAgKzEsMTAgQEAKK2NvbmZpZyBMTEMKKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gTkVUCisKK2NvbmZpZyBMTEMyCisJdHJpc3RhdGUgIkFOU0kvSUVFRSA4MDIuMiBMTEMgdHlwZSAyIFN1cHBvcnQiCisJc2VsZWN0IExMQworCWhlbHAKKwkgIFRoaXMgaXMgYSBMb2dpY2FsIExpbmsgTGF5ZXIgdHlwZSAyLCBjb25uZWN0aW9uIG9yaWVudGVkIHN1cHBvcnQuIAorCSAgU2VsZWN0IHRoaXMgaWYgeW91IHdhbnQgdG8gaGF2ZSBzdXBwb3J0IGZvciBQRl9MTEMgc29ja2V0cy4KZGlmZiAtLWdpdCBhL25ldC9sbGMvTWFrZWZpbGUgYi9uZXQvbGxjL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYmQ0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbGxjL01ha2VmaWxlCkBAIC0wLDAgKzEsMjQgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IDgwMi4yIExMQyAoZnVsbHktZnVuY3Rpb25hbCkgbGF5ZXIuCisjCisjIENvcHlyaWdodCAoYykgMTk5NyBieSBQcm9jb20gVGVjaG5vbG9neSxJbmMuCisjCQkyMDAxLTIwMDMgYnkgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisjCisjIFRoaXMgcHJvZ3JhbSBjYW4gYmUgcmVkaXN0cmlidXRlZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIAorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9yIGltcGxpZWQgd2FycmFudHkKKyMgb2YgbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLgorIworIyBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworb2JqLSQoQ09ORklHX0xMQykgKz0gbGxjLm8KKworbGxjLXkgOj0gbGxjX2NvcmUubyBsbGNfaW5wdXQubyBsbGNfb3V0cHV0Lm8KKworb2JqLSQoQ09ORklHX0xMQzIpICs9IGxsYzIubworCitsbGMyLXkgOj0gbGxjX2lmLm8gbGxjX2NfZXYubyBsbGNfY19hYy5vIGxsY19jb25uLm8gbGxjX2Nfc3QubyBsbGNfcGR1Lm8gXAorCSAgbGxjX3NhcC5vIGxsY19zX2FjLm8gbGxjX3NfZXYubyBsbGNfc19zdC5vIGFmX2xsYy5vIGxsY19zdGF0aW9uLm8KKworbGxjMi0kKENPTkZJR19QUk9DX0ZTKSArPSBsbGNfcHJvYy5vCmRpZmYgLS1naXQgYS9uZXQvbGxjL2FmX2xsYy5jIGIvbmV0L2xsYy9hZl9sbGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGI0Y2ZlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2xsYy9hZl9sbGMuYwpAQCAtMCwwICsxLDEwNzkgQEAKKy8qCisgKiBhZl9sbGMuYyAtIExMQyBVc2VyIEludGVyZmFjZSBTQVBzCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgRnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIGFyZSBpbXBsZW1lbnRhdGlvbiBvZiBzb2NrZXQgYmFzZWQgbGxjCisgKiAgIGNvbW11bmljYXRpb25zIGZvciB0aGUgTGludXggb3BlcmF0aW5nIHN5c3RlbS4gU3VwcG9ydCBvZiBsbGMgY2xhc3MKKyAqICAgb25lIGFuZCBjbGFzcyB0d28gaXMgcHJvdmlkZWQgdmlhIFNPQ0tfREdSQU0gYW5kIFNPQ0tfU1RSRUFNCisgKiAgIHJlc3BlY3RpdmVseS4KKyAqCisgKiAgIEFuIGxsYzIgY29ubmVjdGlvbiBpcyAobWFjICsgc2FwKSwgb25seSBvbmUgbGxjMiBzYXAgY29ubmVjdGlvbgorICogICBpcyBhbGxvd2VkIHBlciBtYWMuIFRob3VnaCBvbmUgc2FwIG1heSBoYXZlIG11bHRpcGxlIG1hYyArIHNhcAorICogICBjb25uZWN0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgYnkgSmF5IFNjaHVsaXN0IDxqc2NobHN0QHNhbWJhLm9yZz4KKyAqCQkgMjAwMi0yMDAzIGJ5IEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBjYW4gYmUgcmVkaXN0cmlidXRlZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSBvciBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuCisgKgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPG5ldC9sbGMuaD4KKyNpbmNsdWRlIDxuZXQvbGxjX3NhcC5oPgorI2luY2x1ZGUgPG5ldC9sbGNfcGR1Lmg+CisjaW5jbHVkZSA8bmV0L2xsY19jb25uLmg+CisKKy8qIHJlbWVtYmVyOiB1bmluaXRpYWxpemVkIGdsb2JhbCBkYXRhIGlzIHplcm9lZCBiZWNhdXNlIGl0cyBpbiAuYnNzICovCitzdGF0aWMgdTE2IGxsY191aV9zYXBfbGFzdF9hdXRvcG9ydCA9IExMQ19TQVBfRFlOX1NUQVJUOworc3RhdGljIHUxNiBsbGNfdWlfc2FwX2xpbmtfbm9fbWF4WzI1Nl07CitzdGF0aWMgc3RydWN0IHNvY2thZGRyX2xsYyBsbGNfdWlfYWRkcm51bGw7CitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBsbGNfdWlfb3BzOworCitzdGF0aWMgaW50IGxsY191aV93YWl0X2Zvcl9jb25uKHN0cnVjdCBzb2NrICpzaywgaW50IHRpbWVvdXQpOworc3RhdGljIGludCBsbGNfdWlfd2FpdF9mb3JfZGlzYyhzdHJ1Y3Qgc29jayAqc2ssIGludCB0aW1lb3V0KTsKK3N0YXRpYyBpbnQgbGxjX3VpX3dhaXRfZm9yX2RhdGEoc3RydWN0IHNvY2sgKnNrLCBpbnQgdGltZW91dCk7CitzdGF0aWMgaW50IGxsY191aV93YWl0X2Zvcl9idXN5X2NvcmUoc3RydWN0IHNvY2sgKnNrLCBpbnQgdGltZW91dCk7CisKKyNpZiAwCisjZGVmaW5lIGRwcmludGsoYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgYXJncykKKyNlbHNlCisjZGVmaW5lIGRwcmludGsoYXJncy4uLikKKyNlbmRpZgorCisvKioKKyAqCWxsY191aV9uZXh0X2xpbmtfbm8gLSByZXR1cm4gdGhlIG5leHQgdW51c2VkIGxpbmsgbnVtYmVyIGZvciBhIHNhcAorICoJQHNhcDogQWRkcmVzcyBvZiBzYXAgdG8gZ2V0IGxpbmsgbnVtYmVyIGZyb20uCisgKgorICoJUmV0dXJuIHRoZSBuZXh0IHVudXNlZCBsaW5rIG51bWJlciBmb3IgYSBnaXZlbiBzYXAuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHUxNiBsbGNfdWlfbmV4dF9saW5rX25vKGludCBzYXApCit7CisJcmV0dXJuIGxsY191aV9zYXBfbGlua19ub19tYXhbc2FwXSsrOworfQorCisvKioKKyAqCWxsY19wcm90b190eXBlIC0gcmV0dXJuIGV0aCBwcm90b2NvbCBmb3IgQVJQIGhlYWRlciB0eXBlCisgKglAYXJwaHJkOiBBUlAgaGVhZGVyIHR5cGUuCisgKgorICoJR2l2ZW4gYW4gQVJQIGhlYWRlciB0eXBlIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBldGhlcm5ldCBwcm90b2NvbC4KKyAqLworc3RhdGljIF9faW5saW5lX18gdTE2IGxsY19wcm90b190eXBlKHUxNiBhcnBocmQpCit7CisJcmV0dXJuIGFycGhyZCA9PSBBUlBIUkRfSUVFRTgwMl9UUiA/CisJCSAgICAgICAgIGh0b25zKEVUSF9QX1RSXzgwMl8yKSA6IGh0b25zKEVUSF9QXzgwMl8yKTsKK30KKworLyoqCisgKglsbGNfdWlfYWRkcl9udWxsIC0gZGV0ZXJtaW5lcyBpZiBhIGFkZHJlc3Mgc3RydWN0dXJlIGlzIG51bGwKKyAqCUBhZGRyOiBBZGRyZXNzIHRvIHRlc3QgaWYgbnVsbC4KKyAqLworc3RhdGljIF9faW5saW5lX18gdTggbGxjX3VpX2FkZHJfbnVsbChzdHJ1Y3Qgc29ja2FkZHJfbGxjICphZGRyKQoreworCXJldHVybiAhbWVtY21wKGFkZHIsICZsbGNfdWlfYWRkcm51bGwsIHNpemVvZigqYWRkcikpOworfQorCisvKioKKyAqCWxsY191aV9oZWFkZXJfbGVuIC0gcmV0dXJuIGxlbmd0aCBvZiBsbGMgaGVhZGVyIGJhc2VkIG9uIG9wZXJhdGlvbgorICoJQHNrOiBTb2NrZXQgd2hpY2ggY29udGFpbnMgYSB2YWxpZCBsbGMgc29ja2V0IHR5cGUuCisgKglAYWRkcjogQ29tcGxldGUgc29ja2FkZHJfbGxjIHN0cnVjdHVyZSByZWNlaXZlZCBmcm9tIHRoZSB1c2VyLgorICoKKyAqCVByb3ZpZGUgdGhlIGxlbmd0aCBvZiB0aGUgbGxjIGhlYWRlciBkZXBlbmRpbmcgb24gd2hhdCBraW5kIG9mCisgKglvcGVyYXRpb24gdGhlIHVzZXIgd291bGQgbGlrZSB0byBwZXJmb3JtIGFuZCB0aGUgdHlwZSBvZiBzb2NrZXQuCisgKglSZXR1cm5zIHRoZSBjb3JyZWN0IGxsYyBoZWFkZXIgbGVuZ3RoLgorICovCitzdGF0aWMgX19pbmxpbmVfXyB1OCBsbGNfdWlfaGVhZGVyX2xlbihzdHJ1Y3Qgc29jayAqc2ssCisJCQkJICAgICAgIHN0cnVjdCBzb2NrYWRkcl9sbGMgKmFkZHIpCit7CisJdTggcmMgPSBMTENfUERVX0xFTl9VOworCisJaWYgKGFkZHItPnNsbGNfdGVzdCB8fCBhZGRyLT5zbGxjX3hpZCkKKwkJcmMgPSBMTENfUERVX0xFTl9VOworCWVsc2UgaWYgKHNrLT5za190eXBlID09IFNPQ0tfU1RSRUFNKQorCQlyYyA9IExMQ19QRFVfTEVOX0k7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqCWxsY191aV9zZW5kX2RhdGEgLSBzZW5kIGRhdGEgdmlhIHJlbGlhYmxlIGxsYzIgY29ubmVjdGlvbgorICoJQHNrOiBDb25uZWN0aW9uIHRoZSBzb2NrZXQgaXMgdXNpbmcuCisgKglAc2tiOiBEYXRhIHRoZSB1c2VyIHdpc2hlcyB0byBzZW5kLgorICoJQGFkZHI6IFNvdXJjZSBhbmQgZGVzdGluYXRpb24gZmllbGRzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLgorICoJQG5vYmxvY2s6IGNhbiB3ZSBibG9jayB3YWl0aW5nIGZvciBkYXRhPworICoKKyAqCVNlbmQgZGF0YSB2aWEgcmVsaWFibGUgbGxjMiBjb25uZWN0aW9uLgorICoJUmV0dXJucyAwIHVwb24gc3VjY2Vzcywgbm9uLXplcm8gaWYgYWN0aW9uIGRpZCBub3Qgc3VjY2VlZC4KKyAqLworc3RhdGljIGludCBsbGNfdWlfc2VuZF9kYXRhKHN0cnVjdCBzb2NrKiBzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG5vYmxvY2spCit7CisJc3RydWN0IGxsY19zb2NrKiBsbGMgPSBsbGNfc2soc2spOworCWludCByYyA9IDA7CisKKwlpZiAobGxjX2RhdGFfYWNjZXB0X3N0YXRlKGxsYy0+c3RhdGUpIHx8IGxsYy0+cF9mbGFnKSB7CisJCWludCB0aW1lb3V0ID0gc29ja19zbmR0aW1lbyhzaywgbm9ibG9jayk7CisKKwkJcmMgPSBsbGNfdWlfd2FpdF9mb3JfYnVzeV9jb3JlKHNrLCB0aW1lb3V0KTsKKwl9CisJaWYgKCFyYykKKwkJcmMgPSBsbGNfYnVpbGRfYW5kX3NlbmRfcGt0KHNrLCBza2IpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgbGxjX3VpX3NrX2luaXQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2sgKnNrKQoreworCXNrLT5za190eXBlCT0gc29jay0+dHlwZTsKKwlzay0+c2tfc2xlZXAJPSAmc29jay0+d2FpdDsKKwlzay0+c2tfc29ja2V0CT0gc29jazsKKwlzb2NrLT5zawk9IHNrOworCXNvY2stPm9wcwk9ICZsbGNfdWlfb3BzOworfQorCitzdGF0aWMgc3RydWN0IHByb3RvIGxsY19wcm90byA9IHsKKwkubmFtZQkgID0gIkREUCIsCisJLm93bmVyCSAgPSBUSElTX01PRFVMRSwKKwkub2JqX3NpemUgPSBzaXplb2Yoc3RydWN0IGxsY19zb2NrKSwKK307CisKKy8qKgorICoJbGxjX3VpX2NyZWF0ZSAtIGFsbG9jIGFuZCBpbml0IGEgbmV3IGxsY191aSBzb2NrZXQKKyAqCUBzb2NrOiBTb2NrZXQgdG8gaW5pdGlhbGl6ZSBhbmQgYXR0YWNoIGFsbG9jYXRlZCBzayB0by4KKyAqCUBwcm90b2NvbDogVW51c2VkLgorICoKKyAqCUFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IGxsY191aSBzb2NrZXQsIHZhbGlkYXRlIHRoZSB1c2VyIHdhbnRzIGEKKyAqCXNvY2tldCB0eXBlIHdlIGhhdmUgYXZhaWxhYmxlLgorICoJUmV0dXJucyAwIHVwb24gc3VjY2VzcywgbmVnYXRpdmUgdXBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGxsY191aV9jcmVhdGUoc3RydWN0IHNvY2tldCAqc29jaywgaW50IHByb3RvY29sKQoreworCXN0cnVjdCBzb2NrICpzazsKKwlpbnQgcmMgPSAtRVNPQ0tUTk9TVVBQT1JUOworCisJaWYgKHNvY2stPnR5cGUgPT0gU09DS19ER1JBTSB8fCBzb2NrLT50eXBlID09IFNPQ0tfU1RSRUFNKSB7CisJCXJjID0gLUVOT01FTTsKKwkJc2sgPSBsbGNfc2tfYWxsb2MoUEZfTExDLCBHRlBfS0VSTkVMLCAmbGxjX3Byb3RvKTsKKwkJaWYgKHNrKSB7CisJCQlyYyA9IDA7CisJCQlsbGNfdWlfc2tfaW5pdChzb2NrLCBzayk7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqCWxsY191aV9yZWxlYXNlIC0gc2h1dGRvd24gc29ja2V0CisgKglAc29jazogU29ja2V0IHRvIHJlbGVhc2UuCisgKgorICoJU2h1dGRvd24gYW5kIGRlYWxsb2NhdGUgYW4gZXhpc3Rpbmcgc29ja2V0LgorICovCitzdGF0aWMgaW50IGxsY191aV9yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGxsY19zb2NrICpsbGM7CisKKwlpZiAoIXNrKQorCQlnb3RvIG91dDsKKwlzb2NrX2hvbGQoc2spOworCWxvY2tfc29jayhzayk7CisJbGxjID0gbGxjX3NrKHNrKTsKKwlkcHJpbnRrKCIlczogY2xvc2luZyBsb2NhbCglMDJYKSByZW1vdGUoJTAyWClcbiIsIF9fRlVOQ1RJT05fXywKKwkJbGxjLT5sYWRkci5sc2FwLCBsbGMtPmRhZGRyLmxzYXApOworCWlmICghbGxjX3NlbmRfZGlzYyhzaykpCisJCWxsY191aV93YWl0X2Zvcl9kaXNjKHNrLCBzay0+c2tfcmN2dGltZW8pOworCWlmICghc29ja19mbGFnKHNrLCBTT0NLX1pBUFBFRCkpCisJCWxsY19zYXBfcmVtb3ZlX3NvY2tldChsbGMtPnNhcCwgc2spOworCXJlbGVhc2Vfc29jayhzayk7CisJaWYgKGxsYy0+c2FwICYmIGhsaXN0X2VtcHR5KCZsbGMtPnNhcC0+c2tfbGlzdC5saXN0KSkgeworCQlsbGNfcmVsZWFzZV9zb2NrZXRzKGxsYy0+c2FwKTsKKwkJbGxjX3NhcF9jbG9zZShsbGMtPnNhcCk7CisJfQorCWlmIChsbGMtPmRldikKKwkJZGV2X3B1dChsbGMtPmRldik7CisJc29ja19wdXQoc2spOworCWxsY19za19mcmVlKHNrKTsKK291dDoKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglsbGNfdWlfYXV0b3BvcnQgLSBwcm92aWRlIGR5bmFtaWNhbGx5IGFsbG9jYXRlIFNBUCBudW1iZXIKKyAqCisgKglQcm92aWRlIHRoZSBjYWxsZXIgd2l0aCBhIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBTQVAgbnVtYmVyIGFjY29yZGluZworICoJdG8gdGhlIHJ1bGVzIHRoYXQgYXJlIHNldCBpbiB0aGlzIGZ1bmN0aW9uLiBSZXR1cm5zOiAwLCB1cG9uIGZhaWx1cmUsCisgKglTQVAgbnVtYmVyIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBsbGNfdWlfYXV0b3BvcnQodm9pZCkKK3sKKwlzdHJ1Y3QgbGxjX3NhcCAqc2FwOworCWludCBpLCB0cmllcyA9IDA7CisKKwl3aGlsZSAodHJpZXMgPCBMTENfU0FQX0RZTl9UUklFUykgeworCQlmb3IgKGkgPSBsbGNfdWlfc2FwX2xhc3RfYXV0b3BvcnQ7CisJCSAgICAgaSA8IExMQ19TQVBfRFlOX1NUT1A7IGkgKz0gMikgeworCQkJc2FwID0gbGxjX3NhcF9maW5kKGkpOworCQkJaWYgKCFzYXApIHsKKwkJCQlsbGNfdWlfc2FwX2xhc3RfYXV0b3BvcnQgPSBpICsgMjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlsbGNfdWlfc2FwX2xhc3RfYXV0b3BvcnQgPSBMTENfU0FQX0RZTl9TVEFSVDsKKwkJdHJpZXMrKzsKKwl9CisJaSA9IDA7CitvdXQ6CisJcmV0dXJuIGk7Cit9CisKKy8qKgorICoJbGxjX3VpX2F1dG9iaW5kIC0gQmluZCBhIHNvY2tldCB0byBhIHNwZWNpZmljIGFkZHJlc3MuCisgKglAc2s6IFNvY2tldCB0byBiaW5kIGFuIGFkZHJlc3MgdG8uCisgKglAYWRkcjogQWRkcmVzcyB0aGUgdXNlciB3YW50cyB0aGUgc29ja2V0IGJvdW5kIHRvLgorICoKKyAqCUJpbmQgYSBzb2NrZXQgdG8gYSBzcGVjaWZpYyBhZGRyZXNzLiBGb3IgbGxjIGEgdXNlciBpcyBhYmxlIHRvIGJpbmQgdG8KKyAqCWEgc3BlY2lmaWMgc2FwIG9ubHkgb3IgbWFjICsgc2FwLiBJZiB0aGUgdXNlciBvbmx5IHNwZWNpZmllcyBhIHNhcCBhbmQKKyAqCWEgbnVsbCBkbWFjIChhbGwgemVyb3MpIHRoZSB1c2VyIGlzIGF0dGVtcHRpbmcgdG8gYmluZCB0byBhbiBlbnRpcmUKKyAqCXNhcC4gVGhpcyB3aWxsIHN0b3AgYW55b25lIGVsc2Ugb24gdGhlIGxvY2FsIHN5c3RlbSBmcm9tIHVzaW5nIHRoYXQKKyAqCXNhcC4gIElmIHNvbWVvbmUgZWxzZSBoYXMgYSBtYWMgKyBzYXAgb3BlbiB0aGUgYmluZCB0byBudWxsICsgc2FwIHdpbGwKKyAqCWZhaWwuCisgKglJZiB0aGUgdXNlciBkZXNpcmVzIHRvIGJpbmQgdG8gYSBzcGVjaWZpYyBtYWMgKyBzYXAsIGl0IGlzIHBvc3NpYmxlIHRvCisgKgloYXZlIG11bHRpcGxlIHNhcCBjb25uZWN0aW9ucyB2aWEgbXVsdGlwbGUgbWFjcy4KKyAqCUJpbmQgYW5kIGF1dG9iaW5kIGZvciB0aGF0IG1hdHRlciBtdXN0IGVuZm9yY2UgdGhlIGNvcnJlY3Qgc2FwIHVzYWdlCisgKglvdGhlcndpc2UgYWxsIGhlbGwgd2lsbCBicmVhayBsb29zZS4KKyAqCVJldHVybnM6IDAgdXBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgbGxjX3VpX2F1dG9iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkcl9sbGMgKmFkZHIpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2soc2spOworCXN0cnVjdCBsbGNfc2FwICpzYXA7CisJaW50IHJjID0gLUVJTlZBTDsKKworCWlmICghc29ja19mbGFnKHNrLCBTT0NLX1pBUFBFRCkpCisJCWdvdG8gb3V0OworCXJjID0gLUVOT0RFVjsKKwlsbGMtPmRldiA9IGRldl9nZXRmaXJzdGJ5aHd0eXBlKGFkZHItPnNsbGNfYXJwaHJkKTsKKwlpZiAoIWxsYy0+ZGV2KQorCQlnb3RvIG91dDsKKwlyYyA9IC1FVVNFUlM7CisJbGxjLT5sYWRkci5sc2FwID0gbGxjX3VpX2F1dG9wb3J0KCk7CisJaWYgKCFsbGMtPmxhZGRyLmxzYXApCisJCWdvdG8gb3V0OworCXJjID0gLUVCVVNZOyAvKiBzb21lIG90aGVyIG5ldHdvcmsgbGF5ZXIgaXMgdXNpbmcgdGhlIHNhcCAqLworCXNhcCA9IGxsY19zYXBfb3BlbihsbGMtPmxhZGRyLmxzYXAsIE5VTEwpOworCWlmICghc2FwKQorCQlnb3RvIG91dDsKKwltZW1jcHkobGxjLT5sYWRkci5tYWMsIGxsYy0+ZGV2LT5kZXZfYWRkciwgSUZIV0FERFJMRU4pOworCW1lbWNweSgmbGxjLT5hZGRyLCBhZGRyLCBzaXplb2YobGxjLT5hZGRyKSk7CisJLyogYXNzaWduIG5ldyBjb25uZWN0aW9uIHRvIGl0cyBTQVAgKi8KKwlsbGNfc2FwX2FkZF9zb2NrZXQoc2FwLCBzayk7CisJc29ja19yZXNldF9mbGFnKHNrLCBTT0NLX1pBUFBFRCk7CisJcmMgPSAwOworb3V0OgorCXJldHVybiByYzsKK30KKworLyoqCisgKglsbGNfdWlfYmluZCAtIGJpbmQgYSBzb2NrZXQgdG8gYSBzcGVjaWZpYyBhZGRyZXNzLgorICoJQHNvY2s6IFNvY2tldCB0byBiaW5kIGFuIGFkZHJlc3MgdG8uCisgKglAdWFkZHI6IEFkZHJlc3MgdGhlIHVzZXIgd2FudHMgdGhlIHNvY2tldCBib3VuZCB0by4KKyAqCUBhZGRybGVuOiBMZW5ndGggb2YgdGhlIHVhZGRyIHN0cnVjdHVyZS4KKyAqCisgKglCaW5kIGEgc29ja2V0IHRvIGEgc3BlY2lmaWMgYWRkcmVzcy4gRm9yIGxsYyBhIHVzZXIgaXMgYWJsZSB0byBiaW5kIHRvCisgKglhIHNwZWNpZmljIHNhcCBvbmx5IG9yIG1hYyArIHNhcC4gSWYgdGhlIHVzZXIgb25seSBzcGVjaWZpZXMgYSBzYXAgYW5kCisgKglhIG51bGwgZG1hYyAoYWxsIHplcm9zKSB0aGUgdXNlciBpcyBhdHRlbXB0aW5nIHRvIGJpbmQgdG8gYW4gZW50aXJlCisgKglzYXAuIFRoaXMgd2lsbCBzdG9wIGFueW9uZSBlbHNlIG9uIHRoZSBsb2NhbCBzeXN0ZW0gZnJvbSB1c2luZyB0aGF0CisgKglzYXAuIElmIHNvbWVvbmUgZWxzZSBoYXMgYSBtYWMgKyBzYXAgb3BlbiB0aGUgYmluZCB0byBudWxsICsgc2FwIHdpbGwKKyAqCWZhaWwuCisgKglJZiB0aGUgdXNlciBkZXNpcmVzIHRvIGJpbmQgdG8gYSBzcGVjaWZpYyBtYWMgKyBzYXAsIGl0IGlzIHBvc3NpYmxlIHRvCisgKgloYXZlIG11bHRpcGxlIHNhcCBjb25uZWN0aW9ucyB2aWEgbXVsdGlwbGUgbWFjcy4KKyAqCUJpbmQgYW5kIGF1dG9iaW5kIGZvciB0aGF0IG1hdHRlciBtdXN0IGVuZm9yY2UgdGhlIGNvcnJlY3Qgc2FwIHVzYWdlCisgKglvdGhlcndpc2UgYWxsIGhlbGwgd2lsbCBicmVhayBsb29zZS4KKyAqCVJldHVybnM6IDAgdXBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgbGxjX3VpX2JpbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwgaW50IGFkZHJsZW4pCit7CisJc3RydWN0IHNvY2thZGRyX2xsYyAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfbGxjICopdWFkZHI7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2soc2spOworCXN0cnVjdCBsbGNfc2FwICpzYXA7CisJaW50IHJjID0gLUVJTlZBTDsKKworCWRwcmludGsoIiVzOiBiaW5kaW5nICUwMlhcbiIsIF9fRlVOQ1RJT05fXywgYWRkci0+c2xsY19zYXApOworCWlmICghc29ja19mbGFnKHNrLCBTT0NLX1pBUFBFRCkgfHwgYWRkcmxlbiAhPSBzaXplb2YoKmFkZHIpKQorCQlnb3RvIG91dDsKKwlyYyA9IC1FQUZOT1NVUFBPUlQ7CisJaWYgKGFkZHItPnNsbGNfZmFtaWx5ICE9IEFGX0xMQykKKwkJZ290byBvdXQ7CisJaWYgKCFhZGRyLT5zbGxjX3NhcCkgeworCQlyYyA9IC1FVVNFUlM7CisJCWFkZHItPnNsbGNfc2FwID0gbGxjX3VpX2F1dG9wb3J0KCk7CisJCWlmICghYWRkci0+c2xsY19zYXApCisJCQlnb3RvIG91dDsKKwl9CisJc2FwID0gbGxjX3NhcF9maW5kKGFkZHItPnNsbGNfc2FwKTsKKwlpZiAoIXNhcCkgeworCQlzYXAgPSBsbGNfc2FwX29wZW4oYWRkci0+c2xsY19zYXAsIE5VTEwpOworCQlyYyA9IC1FQlVTWTsgLyogc29tZSBvdGhlciBuZXR3b3JrIGxheWVyIGlzIHVzaW5nIHRoZSBzYXAgKi8KKwkJaWYgKCFzYXApCisJCQlnb3RvIG91dDsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbGxjX2FkZHIgbGFkZHIsIGRhZGRyOworCQlzdHJ1Y3Qgc29jayAqYXNrOworCisJCW1lbXNldCgmbGFkZHIsIDAsIHNpemVvZihsYWRkcikpOworCQltZW1zZXQoJmRhZGRyLCAwLCBzaXplb2YoZGFkZHIpKTsKKwkJLyoKKwkJICogRklYTUU6IGNoZWNrIGlmIHRoZSB0aGUgYWRkcmVzcyBpcyBtdWx0aWNhc3QsCisJCSAqIAkgIG9ubHkgU09DS19ER1JBTSBjYW4gZG8gdGhpcy4KKwkJICovCisJCW1lbWNweShsYWRkci5tYWMsIGFkZHItPnNsbGNfbWFjLCBJRkhXQUREUkxFTik7CisJCWxhZGRyLmxzYXAgPSBhZGRyLT5zbGxjX3NhcDsKKwkJcmMgPSAtRUFERFJJTlVTRTsgLyogbWFjICsgc2FwIGNsYXNoLiAqLworCQlhc2sgPSBsbGNfbG9va3VwX2VzdGFibGlzaGVkKHNhcCwgJmRhZGRyLCAmbGFkZHIpOworCQlpZiAoYXNrKSB7CisJCQlzb2NrX3B1dChhc2spOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJbGxjLT5sYWRkci5sc2FwID0gYWRkci0+c2xsY19zYXA7CisJbWVtY3B5KGxsYy0+bGFkZHIubWFjLCBhZGRyLT5zbGxjX21hYywgSUZIV0FERFJMRU4pOworCW1lbWNweSgmbGxjLT5hZGRyLCBhZGRyLCBzaXplb2YobGxjLT5hZGRyKSk7CisJLyogYXNzaWduIG5ldyBjb25uZWN0aW9uIHRvIGl0cyBTQVAgKi8KKwlsbGNfc2FwX2FkZF9zb2NrZXQoc2FwLCBzayk7CisJc29ja19yZXNldF9mbGFnKHNrLCBTT0NLX1pBUFBFRCk7CisJcmMgPSAwOworb3V0OgorCXJldHVybiByYzsKK30KKworLyoqCisgKglsbGNfdWlfc2h1dGRvd24gLSBzaHV0ZG93biBhIGNvbm5lY3QgbGxjMiBzb2NrZXQuCisgKglAc29jazogU29ja2V0IHRvIHNodXRkb3duLgorICoJQGhvdzogV2hhdCBwYXJ0IG9mIHRoZSBzb2NrZXQgdG8gc2h1dGRvd24uCisgKgorICoJU2h1dGRvd24gYSBjb25uZWN0ZWQgbGxjMiBzb2NrZXQuIEN1cnJlbnRseSB0aGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMKKyAqCXNodXR0aW5nIGRvd24gYm90aCBzZW5kcyBhbmQgcmVjZWl2ZXMgKDIpLCB3ZSBjb3VsZCBwcm9iYWJseSBtYWtlIHRoaXMKKyAqCWZ1bmN0aW9uIHN1Y2ggdGhhdCBhIHVzZXIgY2FuIHNodXRkb3duIG9ubHkgaGFsZiB0aGUgY29ubmVjdGlvbiBidXQgbm90CisgKglyaWdodCBub3cuCisgKglSZXR1cm5zOiAwIHVwb24gc3VjY2VzcywgbmVnYXRpdmUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IGxsY191aV9zaHV0ZG93bihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgaG93KQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCByYyA9IC1FTk9UQ09OTjsKKworCWxvY2tfc29jayhzayk7CisJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfRVNUQUJMSVNIRUQpCisJCWdvdG8gb3V0OworCXJjID0gLUVJTlZBTDsKKwlpZiAoaG93ICE9IDIpCisJCWdvdG8gb3V0OworCXJjID0gbGxjX3NlbmRfZGlzYyhzayk7CisJaWYgKCFyYykKKwkJcmMgPSBsbGNfdWlfd2FpdF9mb3JfZGlzYyhzaywgc2stPnNrX3JjdnRpbWVvKTsKKwkvKiBXYWtlIHVwIGFueW9uZSBzbGVlcGluZyBpbiBwb2xsICovCisJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CitvdXQ6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICoJbGxjX3VpX2Nvbm5lY3QgLSBDb25uZWN0IHRvIGEgcmVtb3RlIGxsYzIgbWFjICsgc2FwLgorICoJQHNvY2s6IFNvY2tldCB3aGljaCB3aWxsIGJlIGNvbm5lY3RlZCB0byB0aGUgcmVtb3RlIGRlc3RpbmF0aW9uLgorICoJQHVhZGRyOiBSZW1vdGUgYW5kIHBvc3NpYmx5IHRoZSBsb2NhbCBhZGRyZXNzIG9mIHRoZSBuZXcgY29ubmVjdGlvbi4KKyAqCUBhZGRybGVuOiBTaXplIG9mIHVhZGRyIHN0cnVjdHVyZS4KKyAqCUBmbGFnczogT3BlcmF0aW9uYWwgZmxhZ3Mgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgorICoKKyAqCUNvbm5lY3QgdG8gYSByZW1vdGUgbGxjMiBtYWMgKyBzYXAuIFRoZSBjYWxsZXIgbXVzdCBzcGVjaWZ5IHRoZQorICoJZGVzdGluYXRpb24gbWFjIGFuZCBhZGRyZXNzIHRvIGNvbm5lY3QgdG8uIElmIHRoZSB1c2VyIGhhc24ndCBwcmV2aW91c2x5CisgKgljYWxsZWQgYmluZCgyKSB3aXRoIGEgc21hYyB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgaW50ZXJmYWNlIG9mIHRoZQorICoJc3BlY2lmaWVkIGFycCB0eXBlIHdpbGwgYmUgdXNlZC4KKyAqCVRoaXMgZnVuY3Rpb24gd2lsbCBhdXRvYmluZCBpZiB1c2VyIGRpZCBub3QgcHJldmlvdXNseSBjYWxsIGJpbmQuCisgKglSZXR1cm5zOiAwIHVwb24gc3VjY2VzcywgbmVnYXRpdmUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IGxsY191aV9jb25uZWN0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsCisJCQkgIGludCBhZGRybGVuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2soc2spOworCXN0cnVjdCBzb2NrYWRkcl9sbGMgKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2xsYyAqKXVhZGRyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IHJjID0gLUVJTlZBTDsKKworCWxvY2tfc29jayhzayk7CisJaWYgKGFkZHJsZW4gIT0gc2l6ZW9mKCphZGRyKSkKKwkJZ290byBvdXQ7CisJcmMgPSAtRUFGTk9TVVBQT1JUOworCWlmIChhZGRyLT5zbGxjX2ZhbWlseSAhPSBBRl9MTEMpCisJCWdvdG8gb3V0OworCS8qIGJpbmQgY29ubmVjdGlvbiB0byBzYXAgaWYgdXNlciBoYXNuJ3QgZG9uZSBpdC4gKi8KKwlpZiAoc29ja19mbGFnKHNrLCBTT0NLX1pBUFBFRCkpIHsKKwkJLyogYmluZCB0byBzYXAgd2l0aCBudWxsIGRldiwgZXhjbHVzaXZlICovCisJCXJjID0gbGxjX3VpX2F1dG9iaW5kKHNvY2ssIGFkZHIpOworCQlpZiAocmMpCisJCQlnb3RvIG91dDsKKwkJbGxjLT5kYWRkci5sc2FwID0gYWRkci0+c2xsY19zYXA7CisJCW1lbWNweShsbGMtPmRhZGRyLm1hYywgYWRkci0+c2xsY19tYWMsIElGSFdBRERSTEVOKTsKKwl9CisJZGV2ID0gbGxjLT5kZXY7CisJaWYgKHNrLT5za190eXBlICE9IFNPQ0tfU1RSRUFNKQorCQlnb3RvIG91dDsKKwlyYyA9IC1FQUxSRUFEWTsKKwlpZiAoc29jay0+c3RhdGUgPT0gU1NfQ09OTkVDVElORykKKwkJZ290byBvdXQ7CisJc29jay0+c3RhdGUgPSBTU19DT05ORUNUSU5HOworCXNrLT5za19zdGF0ZSAgID0gVENQX1NZTl9TRU5UOworCWxsYy0+bGluayAgID0gbGxjX3VpX25leHRfbGlua19ubyhsbGMtPnNhcC0+bGFkZHIubHNhcCk7CisJcmMgPSBsbGNfZXN0YWJsaXNoX2Nvbm5lY3Rpb24oc2ssIGRldi0+ZGV2X2FkZHIsCisJCQkJICAgICAgYWRkci0+c2xsY19tYWMsIGFkZHItPnNsbGNfc2FwKTsKKwlpZiAocmMpIHsKKwkJZHByaW50aygiJXM6IGxsY191aV9zZW5kX2Nvbm4gZmFpbGVkIDotKFxuIiwgX19GVU5DVElPTl9fKTsKKwkJc29jay0+c3RhdGUgID0gU1NfVU5DT05ORUNURUQ7CisJCXNrLT5za19zdGF0ZSA9IFRDUF9DTE9TRTsKKwkJZ290byBvdXQ7CisJfQorCXJjID0gbGxjX3VpX3dhaXRfZm9yX2Nvbm4oc2ssIHNrLT5za19yY3Z0aW1lbyk7CisJaWYgKHJjKQorCQlkcHJpbnRrKCIlczogbGxjX3VpX3dhaXRfZm9yX2Nvbm4gZmFpbGVkPSVkXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKK291dDoKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiByYzsKK30KKworLyoqCisgKglsbGNfdWlfbGlzdGVuIC0gYWxsb3cgYSBub3JtYWwgc29ja2V0IHRvIGFjY2VwdCBpbmNvbWluZyBjb25uZWN0aW9ucworICoJQHNvY2s6IFNvY2tldCB0byBhbGxvdyBpbmNvbWluZyBjb25uZWN0aW9ucyBvbi4KKyAqCUBiYWNrbG9nOiBOdW1iZXIgb2YgY29ubmVjdGlvbnMgdG8gcXVldWUuCisgKgorICoJQWxsb3cgYSBub3JtYWwgc29ja2V0IHRvIGFjY2VwdCBpbmNvbWluZyBjb25uZWN0aW9ucy4KKyAqCVJldHVybnMgMCB1cG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBsbGNfdWlfbGlzdGVuKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBiYWNrbG9nKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCByYyA9IC1FSU5WQUw7CisKKwlsb2NrX3NvY2soc2spOworCWlmIChzb2NrLT5zdGF0ZSAhPSBTU19VTkNPTk5FQ1RFRCkKKwkJZ290byBvdXQ7CisJcmMgPSAtRU9QTk9UU1VQUDsKKwlpZiAoc2stPnNrX3R5cGUgIT0gU09DS19TVFJFQU0pCisJCWdvdG8gb3V0OworCXJjID0gLUVBR0FJTjsKKwlpZiAoc29ja19mbGFnKHNrLCBTT0NLX1pBUFBFRCkpCisJCWdvdG8gb3V0OworCXJjID0gMDsKKwlpZiAoISh1bnNpZ25lZCliYWNrbG9nKQkvKiBCU0Rpc20gKi8KKwkJYmFja2xvZyA9IDE7CisJc2stPnNrX21heF9hY2tfYmFja2xvZyA9IGJhY2tsb2c7CisJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfTElTVEVOKSB7CisJCXNrLT5za19hY2tfYmFja2xvZyA9IDA7CisJCXNrLT5za19zdGF0ZQkgICA9IFRDUF9MSVNURU47CisJfQorCXNrLT5za19zb2NrZXQtPmZsYWdzIHw9IF9fU09fQUNDRVBUQ09OOworb3V0OgorCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGxsY191aV93YWl0X2Zvcl9kaXNjKHN0cnVjdCBzb2NrICpzaywgaW50IHRpbWVvdXQpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJaW50IHJjOworCisJYWRkX3dhaXRfcXVldWVfZXhjbHVzaXZlKHNrLT5za19zbGVlcCwgJndhaXQpOworCWZvciAoOzspIHsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlyYyA9IDA7CisJCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0NMT1NFKSB7CisJCQlyZWxlYXNlX3NvY2soc2spOworCQkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CisJCQlsb2NrX3NvY2soc2spOworCQl9IGVsc2UKKwkJCWJyZWFrOworCQlyYyA9IC1FUkVTVEFSVFNZUzsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisJCXJjID0gLUVBR0FJTjsKKwkJaWYgKCF0aW1lb3V0KQorCQkJYnJlYWs7CisJfQorCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbGxjX3VpX3dhaXRfZm9yX2Nvbm4oc3RydWN0IHNvY2sgKnNrLCBpbnQgdGltZW91dCkKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlpbnQgcmM7CisKKwlhZGRfd2FpdF9xdWV1ZV9leGNsdXNpdmUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJZm9yICg7OykgeworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXJjID0gLUVBR0FJTjsKKwkJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfQ0xPU0UpCisJCQlicmVhazsKKwkJcmMgPSAwOworCQlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkgeworCQkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworCQkJbG9ja19zb2NrKHNrKTsKKwkJfSBlbHNlCisJCQlicmVhazsKKwkJcmMgPSAtRVJFU1RBUlRTWVM7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCQlyYyA9IC1FQUdBSU47CisJCWlmICghdGltZW91dCkKKwkJCWJyZWFrOworCX0KKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGxsY191aV93YWl0X2Zvcl9kYXRhKHN0cnVjdCBzb2NrICpzaywgaW50IHRpbWVvdXQpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJaW50IHJjID0gMDsKKworCWFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwlmb3IgKDs7KSB7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKHNrLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikKKwkJCWJyZWFrOworCQkvKgorCQkgKiBXZWxsLCBpZiB3ZSBoYXZlIGJhY2tsb2csIHRyeSB0byBwcm9jZXNzIGl0IG5vdy4KKwkJICovCisgICAgICAgICAgICAgICAgaWYgKHNrLT5za19iYWNrbG9nLnRhaWwpIHsKKwkJCXJlbGVhc2Vfc29jayhzayk7CisJCQlsb2NrX3NvY2soc2spOworCQl9CisJCXJjID0gMDsKKwkJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKSB7CisJCQlyZWxlYXNlX3NvY2soc2spOworCQkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CisJCQlsb2NrX3NvY2soc2spOworCQl9IGVsc2UKKwkJCWJyZWFrOworCQlyYyA9IC1FUkVTVEFSVFNZUzsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisJCXJjID0gLUVBR0FJTjsKKwkJaWYgKCF0aW1lb3V0KQorCQkJYnJlYWs7CisJfQorCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbGxjX3VpX3dhaXRfZm9yX2J1c3lfY29yZShzdHJ1Y3Qgc29jayAqc2ssIGludCB0aW1lb3V0KQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHNrKTsKKwlpbnQgcmM7CisKKwlhZGRfd2FpdF9xdWV1ZV9leGNsdXNpdmUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJZm9yICg7OykgeworCQlkcHJpbnRrKCIlczogbG9vcGluZy4uLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlyYyA9IC1FTk9UQ09OTjsKKwkJaWYgKHNrLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikKKwkJCWJyZWFrOworCQlyYyA9IDA7CisJCWlmIChsbGNfZGF0YV9hY2NlcHRfc3RhdGUobGxjLT5zdGF0ZSkgfHwgbGxjLT5wX2ZsYWcpIHsKKwkJCXJlbGVhc2Vfc29jayhzayk7CisJCQl0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKwkJCWxvY2tfc29jayhzayk7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJCXJjID0gLUVSRVNUQVJUU1lTOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJcmMgPSAtRUFHQUlOOworCQlpZiAoIXRpbWVvdXQpCisJCQlicmVhazsKKwl9CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOworCXJldHVybiByYzsKK30KKworLyoqCisgKglsbGNfdWlfYWNjZXB0IC0gYWNjZXB0IGEgbmV3IGluY29taW5nIGNvbm5lY3Rpb24uCisgKglAc29jazogU29ja2V0IHdoaWNoIGNvbm5lY3Rpb25zIGFycml2ZSBvbi4KKyAqCUBuZXdzb2NrOiBTb2NrZXQgdG8gbW92ZSBpbmNvbWluZyBjb25uZWN0aW9uIHRvLgorICoJQGZsYWdzOiBVc2VyIHNwZWNpZmllZCBvcGVyYXRpb25hbCBmbGFncy4KKyAqCisgKglBY2NlcHQgYSBuZXcgaW5jb21pbmcgY29ubmVjdGlvbi4KKyAqCVJldHVybnMgMCB1cG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBsbGNfdWlfYWNjZXB0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrZXQgKm5ld3NvY2ssIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zaywgKm5ld3NrOworCXN0cnVjdCBsbGNfc29jayAqbGxjLCAqbmV3bGxjOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHJjID0gLUVPUE5PVFNVUFA7CisKKwlkcHJpbnRrKCIlczogYWNjZXB0aW5nIG9uICUwMlhcbiIsIF9fRlVOQ1RJT05fXywKKwkgICAgICAgIGxsY19zayhzayktPmxhZGRyLmxzYXApOworCWxvY2tfc29jayhzayk7CisJaWYgKHNrLT5za190eXBlICE9IFNPQ0tfU1RSRUFNKQorCQlnb3RvIG91dDsKKwlyYyA9IC1FSU5WQUw7CisJaWYgKHNvY2stPnN0YXRlICE9IFNTX1VOQ09OTkVDVEVEIHx8IHNrLT5za19zdGF0ZSAhPSBUQ1BfTElTVEVOKQorCQlnb3RvIG91dDsKKwkvKiB3YWl0IGZvciBhIGNvbm5lY3Rpb24gdG8gYXJyaXZlLiAqLworCXJjID0gbGxjX3VpX3dhaXRfZm9yX2RhdGEoc2ssIHNrLT5za19yY3Z0aW1lbyk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKwlkcHJpbnRrKCIlczogZ290IGEgbmV3IGNvbm5lY3Rpb24gb24gJTAyWFxuIiwgX19GVU5DVElPTl9fLAorCSAgICAgICAgbGxjX3NrKHNrKS0+bGFkZHIubHNhcCk7CisJc2tiID0gc2tiX2RlcXVldWUoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwlyYyA9IC1FSU5WQUw7CisJaWYgKCFza2ItPnNrKQorCQlnb3RvIGZyZWVzOworCXJjID0gMDsKKwluZXdzayA9IHNrYi0+c2s7CisJLyogYXR0YWNoIGNvbm5lY3Rpb24gdG8gYSBuZXcgc29ja2V0LiAqLworCWxsY191aV9za19pbml0KG5ld3NvY2ssIG5ld3NrKTsKKwlzb2NrX3Jlc2V0X2ZsYWcobmV3c2ssIFNPQ0tfWkFQUEVEKTsKKwluZXdzay0+c2tfc3RhdGUJCT0gVENQX0VTVEFCTElTSEVEOworCW5ld3NvY2stPnN0YXRlCQk9IFNTX0NPTk5FQ1RFRDsKKwlsbGMJCQk9IGxsY19zayhzayk7CisJbmV3bGxjCQkJPSBsbGNfc2sobmV3c2spOworCW1lbWNweSgmbmV3bGxjLT5hZGRyLCAmbGxjLT5hZGRyLCBzaXplb2YobmV3bGxjLT5hZGRyKSk7CisJbmV3bGxjLT5saW5rID0gbGxjX3VpX25leHRfbGlua19ubyhuZXdsbGMtPmxhZGRyLmxzYXApOworCisJLyogcHV0IG9yaWdpbmFsIHNvY2tldCBiYWNrIGludG8gYSBjbGVhbiBsaXN0ZW4gc3RhdGUuICovCisJc2stPnNrX3N0YXRlID0gVENQX0xJU1RFTjsKKwlzay0+c2tfYWNrX2JhY2tsb2ctLTsKKwlza2ItPnNrID0gTlVMTDsKKwlkcHJpbnRrKCIlczogb2sgc3VjY2VzcyBvbiAlMDJYLCBjbGllbnQgb24gJTAyWFxuIiwgX19GVU5DVElPTl9fLAorCQlsbGNfc2soc2spLT5hZGRyLnNsbGNfc2FwLCBuZXdsbGMtPmRhZGRyLmxzYXApOworZnJlZXM6CisJa2ZyZWVfc2tiKHNrYik7CitvdXQ6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICoJbGxjX3VpX3JlY3Ztc2cgLSBjb3B5IHJlY2VpdmVkIGRhdGEgdG8gdGhlIHNvY2tldCB1c2VyLgorICoJQHNvY2s6IFNvY2tldCB0byBjb3B5IGRhdGEgZnJvbS4KKyAqCUBtc2c6IFZhcmlvdXMgdXNlciBzcGFjZSByZWxhdGVkIGluZm9ybWF0aW9uLgorICoJQHNpemU6IFNpemUgb2YgdXNlciBidWZmZXIuCisgKglAZmxhZ3M6IFVzZXIgc3BlY2lmaWVkIGZsYWdzLgorICoKKyAqCUNvcHkgcmVjZWl2ZWQgZGF0YSB0byB0aGUgc29ja2V0IHVzZXIuCisgKglSZXR1cm5zIG5vbi1uZWdhdGl2ZSB1cG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBsbGNfdWlfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgc29ja2FkZHJfbGxjICp1YWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfbGxjICopbXNnLT5tc2dfbmFtZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXNpemVfdCBjb3BpZWQgPSAwOworCWludCByYyA9IC1FTk9NRU0sIHRpbWVvdXQ7CisJaW50IG5vYmxvY2sgPSBmbGFncyAmIE1TR19ET05UV0FJVDsKKworCWRwcmludGsoIiVzOiByZWNlaXZpbmcgaW4gJTAyWCBmcm9tICUwMlhcbiIsIF9fRlVOQ1RJT05fXywKKwkJbGxjX3NrKHNrKS0+bGFkZHIubHNhcCwgbGxjX3NrKHNrKS0+ZGFkZHIubHNhcCk7CisJbG9ja19zb2NrKHNrKTsKKwl0aW1lb3V0ID0gc29ja19yY3Z0aW1lbyhzaywgbm9ibG9jayk7CisJcmMgPSBsbGNfdWlfd2FpdF9mb3JfZGF0YShzaywgdGltZW91dCk7CisJaWYgKHJjKSB7CisJCWRwcmludGsoIiVzOiBsbGNfdWlfd2FpdF9mb3JfZGF0YSBmYWlsZWQgcmVjdiAiCisJCQkiaW4gJTAyWCBmcm9tICUwMlhcbiIsIF9fRlVOQ1RJT05fXywKKwkJCWxsY19zayhzayktPmxhZGRyLmxzYXAsIGxsY19zayhzayktPmRhZGRyLmxzYXApOworCQlnb3RvIG91dDsKKwl9CisJc2tiID0gc2tiX2RlcXVldWUoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwlpZiAoIXNrYikgLyogc2h1dGRvd24gKi8KKwkJZ290byBvdXQ7CisJY29waWVkID0gc2tiLT5sZW47CisJaWYgKGNvcGllZCA+IHNpemUpCisJCWNvcGllZCA9IHNpemU7CisJcmMgPSBza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhza2IsIDAsIG1zZy0+bXNnX2lvdiwgY29waWVkKTsKKwlpZiAocmMpCisJCWdvdG8gZGdyYW1fZnJlZTsKKwlpZiAoc2tiLT5sZW4gPiBjb3BpZWQpIHsKKwkJc2tiX3B1bGwoc2tiLCBjb3BpZWQpOworCQlza2JfcXVldWVfaGVhZCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJfQorCWlmICh1YWRkcikKKwkJbWVtY3B5KHVhZGRyLCBsbGNfdWlfc2tiX2NiKHNrYiksIHNpemVvZigqdWFkZHIpKTsKKwltc2ctPm1zZ19uYW1lbGVuID0gc2l6ZW9mKCp1YWRkcik7CisJaWYgKCFza2ItPmxpc3QpIHsKK2RncmFtX2ZyZWU6CisJCWtmcmVlX3NrYihza2IpOworCX0KK291dDoKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiByYyA/IDogY29waWVkOworfQorCisvKioKKyAqCWxsY191aV9zZW5kbXNnIC0gVHJhbnNtaXQgZGF0YSBwcm92aWRlZCBieSB0aGUgc29ja2V0IHVzZXIuCisgKglAc29jazogU29ja2V0IHRvIHRyYW5zbWl0IGRhdGEgZnJvbS4KKyAqCUBtc2c6IFZhcmlvdXMgdXNlciByZWxhdGVkIGluZm9ybWF0aW9uLgorICoJQGxlbjogTGVuZ3RoIG9mIGRhdGEgdG8gdHJhbnNtaXQuCisgKgorICoJVHJhbnNtaXQgZGF0YSBwcm92aWRlZCBieSB0aGUgc29ja2V0IHVzZXIuCisgKglSZXR1cm5zIG5vbi1uZWdhdGl2ZSB1cG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBsbGNfdWlfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgbGxjX3NvY2sgKmxsYyA9IGxsY19zayhzayk7CisJc3RydWN0IHNvY2thZGRyX2xsYyAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfbGxjICopbXNnLT5tc2dfbmFtZTsKKwlpbnQgZmxhZ3MgPSBtc2ctPm1zZ19mbGFnczsKKwlpbnQgbm9ibG9jayA9IGZsYWdzICYgTVNHX0RPTlRXQUlUOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzaXplX3Qgc2l6ZSA9IDA7CisJaW50IHJjID0gLUVJTlZBTCwgY29waWVkID0gMCwgaGRybGVuOworCisJZHByaW50aygiJXM6IHNlbmRpbmcgZnJvbSAlMDJYIHRvICUwMlhcbiIsIF9fRlVOQ1RJT05fXywKKwkJbGxjLT5sYWRkci5sc2FwLCBsbGMtPmRhZGRyLmxzYXApOworCWxvY2tfc29jayhzayk7CisJaWYgKGFkZHIpIHsKKwkJaWYgKG1zZy0+bXNnX25hbWVsZW4gPCBzaXplb2YoKmFkZHIpKQorCQkJZ290byByZWxlYXNlOworCX0gZWxzZSB7CisJCWlmIChsbGNfdWlfYWRkcl9udWxsKCZsbGMtPmFkZHIpKQorCQkJZ290byByZWxlYXNlOworCQlhZGRyID0gJmxsYy0+YWRkcjsKKwl9CisJLyogbXVzdCBiaW5kIGNvbm5lY3Rpb24gdG8gc2FwIGlmIHVzZXIgaGFzbid0IGRvbmUgaXQuICovCisJaWYgKHNvY2tfZmxhZyhzaywgU09DS19aQVBQRUQpKSB7CisJCS8qIGJpbmQgdG8gc2FwIHdpdGggbnVsbCBkZXYsIGV4Y2x1c2l2ZS4gKi8KKwkJcmMgPSBsbGNfdWlfYXV0b2JpbmQoc29jaywgYWRkcik7CisJCWlmIChyYykKKwkJCWdvdG8gcmVsZWFzZTsKKwl9CisJZGV2ID0gbGxjLT5kZXY7CisJaGRybGVuID0gZGV2LT5oYXJkX2hlYWRlcl9sZW4gKyBsbGNfdWlfaGVhZGVyX2xlbihzaywgYWRkcik7CisJc2l6ZSA9IGhkcmxlbiArIGxlbjsKKwlpZiAoc2l6ZSA+IGRldi0+bXR1KQorCQlzaXplID0gZGV2LT5tdHU7CisJY29waWVkID0gc2l6ZSAtIGhkcmxlbjsKKwlyZWxlYXNlX3NvY2soc2spOworCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssIHNpemUsIG5vYmxvY2ssICZyYyk7CisJbG9ja19zb2NrKHNrKTsKKwlpZiAoIXNrYikKKwkJZ290byByZWxlYXNlOworCXNrYi0+c2sJICAgICAgPSBzazsKKwlza2ItPmRldiAgICAgID0gZGV2OworCXNrYi0+cHJvdG9jb2wgPSBsbGNfcHJvdG9fdHlwZShhZGRyLT5zbGxjX2FycGhyZCk7CisJc2tiX3Jlc2VydmUoc2tiLCBoZHJsZW4pOyAKKwlyYyA9IG1lbWNweV9mcm9taW92ZWMoc2tiX3B1dChza2IsIGNvcGllZCksIG1zZy0+bXNnX2lvdiwgY29waWVkKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCWlmIChzay0+c2tfdHlwZSA9PSBTT0NLX0RHUkFNIHx8IGFkZHItPnNsbGNfdWEpIHsKKwkJbGxjX2J1aWxkX2FuZF9zZW5kX3VpX3BrdChsbGMtPnNhcCwgc2tiLCBhZGRyLT5zbGxjX21hYywKKwkJCQkJICBhZGRyLT5zbGxjX3NhcCk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoYWRkci0+c2xsY190ZXN0KSB7CisJCWxsY19idWlsZF9hbmRfc2VuZF90ZXN0X3BrdChsbGMtPnNhcCwgc2tiLCBhZGRyLT5zbGxjX21hYywKKwkJCQkJICAgIGFkZHItPnNsbGNfc2FwKTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChhZGRyLT5zbGxjX3hpZCkgeworCQlsbGNfYnVpbGRfYW5kX3NlbmRfeGlkX3BrdChsbGMtPnNhcCwgc2tiLCBhZGRyLT5zbGxjX21hYywKKwkJCQkJICAgYWRkci0+c2xsY19zYXApOworCQlnb3RvIG91dDsKKwl9CisJcmMgPSAtRU5PUFJPVE9PUFQ7CisJaWYgKCEoc2stPnNrX3R5cGUgPT0gU09DS19TVFJFQU0gJiYgIWFkZHItPnNsbGNfdWEpKQorCQlnb3RvIG91dDsKKwlyYyA9IGxsY191aV9zZW5kX2RhdGEoc2ssIHNrYiwgbm9ibG9jayk7CisJaWYgKHJjKQorCQlkcHJpbnRrKCIlczogbGxjX3VpX3NlbmRfZGF0YSBmYWlsZWQ6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKK291dDoKKwlpZiAocmMpCisJCWtmcmVlX3NrYihza2IpOworcmVsZWFzZToKKwlpZiAocmMpCisJCWRwcmludGsoIiVzOiBmYWlsZWQgc2VuZGluZyBmcm9tICUwMlggdG8gJTAyWDogJWRcbiIsCisJCQlfX0ZVTkNUSU9OX18sIGxsYy0+bGFkZHIubHNhcCwgbGxjLT5kYWRkci5sc2FwLCByYyk7CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gcmMgPyA6IGNvcGllZDsKK30KKworLyoqCisgKglsbGNfdWlfZ2V0bmFtZSAtIHJldHVybiB0aGUgYWRkcmVzcyBpbmZvIG9mIGEgc29ja2V0CisgKglAc29jazogU29ja2V0IHRvIGdldCBhZGRyZXNzIG9mLgorICoJQHVhZGRyOiBBZGRyZXNzIHN0cnVjdHVyZSB0byByZXR1cm4gaW5mb3JtYXRpb24uCisgKglAdWFkZHJsZW46IExlbmd0aCBvZiBhZGRyZXNzIHN0cnVjdHVyZS4KKyAqCUBwZWVyOiBEb2VzIHVzZXIgd2FudCBsb2NhbCBvciByZW1vdGUgYWRkcmVzcyBpbmZvcm1hdGlvbi4KKyAqCisgKglSZXR1cm4gdGhlIGFkZHJlc3MgaW5mb3JtYXRpb24gb2YgYSBzb2NrZXQuCisgKi8KK3N0YXRpYyBpbnQgbGxjX3VpX2dldG5hbWUoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwKKwkJCSAgaW50ICp1YWRkcmxlbiwgaW50IHBlZXIpCit7CisJc3RydWN0IHNvY2thZGRyX2xsYyBzbGxjOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHNrKTsKKwlpbnQgcmMgPSAwOworCisJbG9ja19zb2NrKHNrKTsKKwlpZiAoc29ja19mbGFnKHNrLCBTT0NLX1pBUFBFRCkpCisJCWdvdG8gb3V0OworCSp1YWRkcmxlbiA9IHNpemVvZihzbGxjKTsKKwltZW1zZXQodWFkZHIsIDAsICp1YWRkcmxlbik7CisJaWYgKHBlZXIpIHsKKwkJcmMgPSAtRU5PVENPTk47CisJCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKQorCQkJZ290byBvdXQ7CisJCWlmKGxsYy0+ZGV2KQorCQkJc2xsYy5zbGxjX2FycGhyZCA9IGxsYy0+ZGV2LT50eXBlOworCQlzbGxjLnNsbGNfc2FwID0gbGxjLT5kYWRkci5sc2FwOworCQltZW1jcHkoJnNsbGMuc2xsY19tYWMsICZsbGMtPmRhZGRyLm1hYywgSUZIV0FERFJMRU4pOworCX0gZWxzZSB7CisJCXJjID0gLUVJTlZBTDsKKwkJaWYgKCFsbGMtPnNhcCkKKwkJCWdvdG8gb3V0OworCQlzbGxjLnNsbGNfc2FwID0gbGxjLT5zYXAtPmxhZGRyLmxzYXA7CisKKwkJaWYgKGxsYy0+ZGV2KSB7CisJCQlzbGxjLnNsbGNfYXJwaHJkID0gbGxjLT5kZXYtPnR5cGU7CisJCQltZW1jcHkoJnNsbGMuc2xsY19tYWMsICZsbGMtPmRldi0+ZGV2X2FkZHIsCisJCQkgICAgICAgSUZIV0FERFJMRU4pOworCQl9CisJfQorCXJjID0gMDsKKwlzbGxjLnNsbGNfZmFtaWx5ID0gQUZfTExDOworCW1lbWNweSh1YWRkciwgJnNsbGMsIHNpemVvZihzbGxjKSk7CitvdXQ6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICoJbGxjX3VpX2lvY3RsIC0gaW8gY29udHJvbHMgZm9yIFBGX0xMQworICoJQHNvY2s6IFNvY2tldCB0byBnZXQvc2V0IGluZm8KKyAqCUBjbWQ6IGNvbW1hbmQKKyAqCUBhcmc6IG9wdGlvbmFsIGFyZ3VtZW50IGZvciBjbWQKKyAqCisgKglnZXQvc2V0IGluZm8gb24gbGxjIHNvY2tldHMKKyAqLworc3RhdGljIGludCBsbGNfdWlfaW9jdGwoc3RydWN0IHNvY2tldCAqc29jaywgdW5zaWduZWQgaW50IGNtZCwKKwkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiBkZXZfaW9jdGwoY21kLCAodm9pZCBfX3VzZXIgKilhcmcpOworfQorCisvKioKKyAqCWxsY191aV9zZXRzb2Nrb3B0IC0gc2V0IHZhcmlvdXMgY29ubmVjdGlvbiBzcGVjaWZpYyBwYXJhbWV0ZXJzLgorICoJQHNvY2s6IFNvY2tldCB0byBzZXQgb3B0aW9ucyBvbi4KKyAqCUBsZXZlbDogU29ja2V0IGxldmVsIHVzZXIgaXMgcmVxdWVzdGluZyBvcGVyYXRpb25zIG9uLgorICoJQG9wdG5hbWU6IE9wZXJhdGlvbiBuYW1lLgorICoJQG9wdHZhbCBVc2VyIHByb3ZpZGVkIG9wZXJhdGlvbiBkYXRhLgorICoJQG9wdGxlbjogTGVuZ3RoIG9mIG9wdHZhbC4KKyAqCisgKglTZXQgdmFyaW91cyBjb25uZWN0aW9uIHNwZWNpZmljIHBhcmFtZXRlcnMuCisgKi8KK3N0YXRpYyBpbnQgbGxjX3VpX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJCSAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgbGxjX3NvY2sgKmxsYyA9IGxsY19zayhzayk7CisJaW50IHJjID0gLUVJTlZBTCwgb3B0OworCisJbG9ja19zb2NrKHNrKTsKKwlpZiAobGV2ZWwgIT0gU09MX0xMQyB8fCBvcHRsZW4gIT0gc2l6ZW9mKGludCkpCisJCWdvdG8gb3V0OworCXJjID0gZ2V0X3VzZXIob3B0LCAoaW50IF9fdXNlciAqKW9wdHZhbCk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKwlyYyA9IC1FSU5WQUw7CisJc3dpdGNoIChvcHRuYW1lKSB7CisJY2FzZSBMTENfT1BUX1JFVFJZOgorCQlpZiAob3B0ID4gTExDX09QVF9NQVhfUkVUUlkpCisJCQlnb3RvIG91dDsKKwkJbGxjLT5uMiA9IG9wdDsKKwkJYnJlYWs7CisJY2FzZSBMTENfT1BUX1NJWkU6CisJCWlmIChvcHQgPiBMTENfT1BUX01BWF9TSVpFKQorCQkJZ290byBvdXQ7CisJCWxsYy0+bjEgPSBvcHQ7CisJCWJyZWFrOworCWNhc2UgTExDX09QVF9BQ0tfVE1SX0VYUDoKKwkJaWYgKG9wdCA+IExMQ19PUFRfTUFYX0FDS19UTVJfRVhQKQorCQkJZ290byBvdXQ7CisJCWxsYy0+YWNrX3RpbWVyLmV4cGlyZSA9IG9wdDsKKwkJYnJlYWs7CisJY2FzZSBMTENfT1BUX1BfVE1SX0VYUDoKKwkJaWYgKG9wdCA+IExMQ19PUFRfTUFYX1BfVE1SX0VYUCkKKwkJCWdvdG8gb3V0OworCQlsbGMtPnBmX2N5Y2xlX3RpbWVyLmV4cGlyZSA9IG9wdDsKKwkJYnJlYWs7CisJY2FzZSBMTENfT1BUX1JFSl9UTVJfRVhQOgorCQlpZiAob3B0ID4gTExDX09QVF9NQVhfUkVKX1RNUl9FWFApCisJCQlnb3RvIG91dDsKKwkJbGxjLT5yZWpfc2VudF90aW1lci5leHBpcmUgPSBvcHQ7CisJCWJyZWFrOworCWNhc2UgTExDX09QVF9CVVNZX1RNUl9FWFA6CisJCWlmIChvcHQgPiBMTENfT1BUX01BWF9CVVNZX1RNUl9FWFApCisJCQlnb3RvIG91dDsKKwkJbGxjLT5idXN5X3N0YXRlX3RpbWVyLmV4cGlyZSA9IG9wdDsKKwkJYnJlYWs7CisJY2FzZSBMTENfT1BUX1RYX1dJTjoKKwkJaWYgKG9wdCA+IExMQ19PUFRfTUFYX1dJTikKKwkJCWdvdG8gb3V0OworCQlsbGMtPmsgPSBvcHQ7CisJCWJyZWFrOworCWNhc2UgTExDX09QVF9SWF9XSU46CisJCWlmIChvcHQgPiBMTENfT1BUX01BWF9XSU4pCisJCQlnb3RvIG91dDsKKwkJbGxjLT5ydyA9IG9wdDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRU5PUFJPVE9PUFQ7CisJCWdvdG8gb3V0OworCX0KKwlyYyA9IDA7CitvdXQ6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICoJbGxjX3VpX2dldHNvY2tvcHQgLSBnZXQgY29ubmVjdGlvbiBzcGVjaWZpYyBzb2NrZXQgaW5mbworICoJQHNvY2s6IFNvY2tldCB0byBnZXQgaW5mb3JtYXRpb24gZnJvbS4KKyAqCUBsZXZlbDogU29ja2V0IGxldmVsIHVzZXIgaXMgcmVxdWVzdGluZyBvcGVyYXRpb25zIG9uLgorICoJQG9wdG5hbWU6IE9wZXJhdGlvbiBuYW1lLgorICoJQG9wdHZhbDogVmFyaWFibGUgdG8gcmV0dXJuIG9wZXJhdGlvbiBkYXRhIGluLgorICoJQG9wdGxlbjogTGVuZ3RoIG9mIG9wdHZhbC4KKyAqCisgKglHZXQgY29ubmVjdGlvbiBzcGVjaWZpYyBzb2NrZXQgaW5mb3JtYXRpb24uCisgKi8KK3N0YXRpYyBpbnQgbGxjX3VpX2dldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJCSAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHNrKTsKKwlpbnQgdmFsID0gMCwgbGVuID0gMCwgcmMgPSAtRUlOVkFMOworCisJbG9ja19zb2NrKHNrKTsKKwlpZiAobGV2ZWwgIT0gU09MX0xMQykKKwkJZ290byBvdXQ7CisJcmMgPSBnZXRfdXNlcihsZW4sIG9wdGxlbik7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKwlyYyA9IC1FSU5WQUw7CisJaWYgKGxlbiAhPSBzaXplb2YoaW50KSkKKwkJZ290byBvdXQ7CisJc3dpdGNoIChvcHRuYW1lKSB7CisJY2FzZSBMTENfT1BUX1JFVFJZOgorCQl2YWwgPSBsbGMtPm4yOwkJCQlicmVhazsKKwljYXNlIExMQ19PUFRfU0laRToKKwkJdmFsID0gbGxjLT5uMTsJCQkJYnJlYWs7CisJY2FzZSBMTENfT1BUX0FDS19UTVJfRVhQOgorCQl2YWwgPSBsbGMtPmFja190aW1lci5leHBpcmU7CQlicmVhazsKKwljYXNlIExMQ19PUFRfUF9UTVJfRVhQOgorCQl2YWwgPSBsbGMtPnBmX2N5Y2xlX3RpbWVyLmV4cGlyZTsJYnJlYWs7CisJY2FzZSBMTENfT1BUX1JFSl9UTVJfRVhQOgorCQl2YWwgPSBsbGMtPnJlal9zZW50X3RpbWVyLmV4cGlyZTsJYnJlYWs7CisJY2FzZSBMTENfT1BUX0JVU1lfVE1SX0VYUDoKKwkJdmFsID0gbGxjLT5idXN5X3N0YXRlX3RpbWVyLmV4cGlyZTsJYnJlYWs7CisJY2FzZSBMTENfT1BUX1RYX1dJTjoKKwkJdmFsID0gbGxjLT5rOwkJCQlicmVhazsKKwljYXNlIExMQ19PUFRfUlhfV0lOOgorCQl2YWwgPSBsbGMtPnJ3OwkJCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYyA9IC1FTk9QUk9UT09QVDsKKwkJZ290byBvdXQ7CisJfQorCXJjID0gMDsKKwlpZiAocHV0X3VzZXIobGVuLCBvcHRsZW4pIHx8IGNvcHlfdG9fdXNlcihvcHR2YWwsICZ2YWwsIGxlbikpCisJCXJjID0gLUVGQVVMVDsKK291dDoKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5IGxsY191aV9mYW1pbHlfb3BzID0geworCS5mYW1pbHkgPSBQRl9MTEMsCisJLmNyZWF0ZSA9IGxsY191aV9jcmVhdGUsCisJLm93bmVyCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBsbGNfdWlfb3BzID0geworCS5mYW1pbHkJICAgICA9IFBGX0xMQywKKwkub3duZXIgICAgICAgPSBUSElTX01PRFVMRSwKKwkucmVsZWFzZSAgICAgPSBsbGNfdWlfcmVsZWFzZSwKKwkuYmluZAkgICAgID0gbGxjX3VpX2JpbmQsCisJLmNvbm5lY3QgICAgID0gbGxjX3VpX2Nvbm5lY3QsCisJLnNvY2tldHBhaXIgID0gc29ja19ub19zb2NrZXRwYWlyLAorCS5hY2NlcHQgICAgICA9IGxsY191aV9hY2NlcHQsCisJLmdldG5hbWUgICAgID0gbGxjX3VpX2dldG5hbWUsCisJLnBvbGwJICAgICA9IGRhdGFncmFtX3BvbGwsCisJLmlvY3RsICAgICAgID0gbGxjX3VpX2lvY3RsLAorCS5saXN0ZW4gICAgICA9IGxsY191aV9saXN0ZW4sCisJLnNodXRkb3duICAgID0gbGxjX3VpX3NodXRkb3duLAorCS5zZXRzb2Nrb3B0ICA9IGxsY191aV9zZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0ICA9IGxsY191aV9nZXRzb2Nrb3B0LAorCS5zZW5kbXNnICAgICA9IGxsY191aV9zZW5kbXNnLAorCS5yZWN2bXNnICAgICA9IGxsY191aV9yZWN2bXNnLAorCS5tbWFwCSAgICAgPSBzb2NrX25vX21tYXAsCisJLnNlbmRwYWdlICAgID0gc29ja19ub19zZW5kcGFnZSwKK307CisKK2V4dGVybiB2b2lkIGxsY19zYXBfaGFuZGxlcihzdHJ1Y3QgbGxjX3NhcCAqc2FwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiB2b2lkIGxsY19jb25uX2hhbmRsZXIoc3RydWN0IGxsY19zYXAgKnNhcCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKK3N0YXRpYyBpbnQgX19pbml0IGxsYzJfaW5pdCh2b2lkKQoreworCWludCByYyA9IHByb3RvX3JlZ2lzdGVyKCZsbGNfcHJvdG8sIDApOworCisJaWYgKHJjICE9IDApCisJCWdvdG8gb3V0OworCisJbGxjX2J1aWxkX29mZnNldF90YWJsZSgpOworCWxsY19zdGF0aW9uX2luaXQoKTsKKwlsbGNfdWlfc2FwX2xhc3RfYXV0b3BvcnQgPSBMTENfU0FQX0RZTl9TVEFSVDsKKwlyYyA9IGxsY19wcm9jX2luaXQoKTsKKwlpZiAocmMgIT0gMCkKKwkJZ290byBvdXRfdW5yZWdpc3Rlcl9sbGNfcHJvdG87CisJc29ja19yZWdpc3RlcigmbGxjX3VpX2ZhbWlseV9vcHMpOworCWxsY19hZGRfcGFjayhMTENfREVTVF9TQVAsIGxsY19zYXBfaGFuZGxlcik7CisJbGxjX2FkZF9wYWNrKExMQ19ERVNUX0NPTk4sIGxsY19jb25uX2hhbmRsZXIpOworb3V0OgorCXJldHVybiByYzsKK291dF91bnJlZ2lzdGVyX2xsY19wcm90bzoKKwlwcm90b191bnJlZ2lzdGVyKCZsbGNfcHJvdG8pOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbGxjMl9leGl0KHZvaWQpCit7CisJbGxjX3N0YXRpb25fZXhpdCgpOworCWxsY19yZW1vdmVfcGFjayhMTENfREVTVF9TQVApOworCWxsY19yZW1vdmVfcGFjayhMTENfREVTVF9DT05OKTsKKwlzb2NrX3VucmVnaXN0ZXIoUEZfTExDKTsKKwlsbGNfcHJvY19leGl0KCk7CisJcHJvdG9fdW5yZWdpc3RlcigmbGxjX3Byb3RvKTsKK30KKworbW9kdWxlX2luaXQobGxjMl9pbml0KTsKK21vZHVsZV9leGl0KGxsYzJfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlByb2NvbSAxOTk3LCBKYXkgU2NodWxsaXN0IDIwMDEsIEFybmFsZG8gQy4gTWVsbyAyMDAxLTIwMDMiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSUVFRSA4MDIuMiBQRl9MTEMgc3VwcG9ydCIpOworTU9EVUxFX0FMSUFTX05FVFBST1RPKFBGX0xMQyk7CmRpZmYgLS1naXQgYS9uZXQvbGxjL2xsY19jX2FjLmMgYi9uZXQvbGxjL2xsY19jX2FjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIxOGJlNAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9sbGMvbGxjX2NfYWMuYwpAQCAtMCwwICsxLDE1MTQgQEAKKy8qCisgKiBsbGNfY19hYy5jIC0gYWN0aW9ucyBwZXJmb3JtZWQgZHVyaW5nIGNvbm5lY3Rpb24gc3RhdGUgdHJhbnNpdGlvbi4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgRnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIGFyZSBpbXBsZW1lbnRhdGlvbiBvZiBjb25uZWN0aW9uIGNvbXBvbmVudCBhY3Rpb25zCisgKiAgIERldGFpbHMgb2YgYWN0aW9ucyBjYW4gYmUgZm91bmQgaW4gSUVFRS04MDIuMiBzdGFuZGFyZCBkb2N1bWVudC4KKyAqICAgQWxsIGZ1bmN0aW9ucyBoYXZlIG9uZSBjb25uZWN0aW9uIGFuZCBvbmUgZXZlbnQgYXMgaW5wdXQgYXJndW1lbnQuIEFsbCBvZgorICogICB0aGVtIHJldHVybiAwIE9uIHN1Y2Nlc3MgYW5kIDEgb3RoZXJ3aXNlLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NyBieSBQcm9jb20gVGVjaG5vbG9neSwgSW5jLgorICogCQkgMjAwMS0yMDAzIGJ5IEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBjYW4gYmUgcmVkaXN0cmlidXRlZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSBvciBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuCisgKgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L2xsY19jb25uLmg+CisjaW5jbHVkZSA8bmV0L2xsY19zYXAuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9sbGNfY19ldi5oPgorI2luY2x1ZGUgPG5ldC9sbGNfY19hYy5oPgorI2luY2x1ZGUgPG5ldC9sbGNfY19zdC5oPgorI2luY2x1ZGUgPG5ldC9sbGNfcGR1Lmg+CisjaW5jbHVkZSA8bmV0L2xsYy5oPgorCisjaW5jbHVkZSAibGxjX291dHB1dC5oIgorCitzdGF0aWMgaW50IGxsY19jb25uX2FjX2luY192c19ieV8xKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBsbGNfcHJvY2Vzc190bXJfZXYoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgbGxjX2Nvbm5fYWNfZGF0YV9jb25maXJtKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKmV2KTsKKworc3RhdGljIGludCBsbGNfY29ubl9hY19pbmNfbnB0YV92YWx1ZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOworCitzdGF0aWMgaW50IGxsY19jb25uX2FjX3NlbmRfcnJfcnNwX2Zfc2V0X2Fja3BmKHN0cnVjdCBzb2NrICpzaywKKwkJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpOworCitzdGF0aWMgaW50IGxsY19jb25uX2FjX3NldF9wX2ZsYWdfMShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOworCisjZGVmaW5lIElOQ09SUkVDVCAwCisKK2ludCBsbGNfY29ubl9hY19jbGVhcl9yZW1vdGVfYnVzeShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2soc2spOworCisJaWYgKGxsYy0+cmVtb3RlX2J1c3lfZmxhZykgeworCQl1OCBucjsKKwkJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisKKwkJbGxjLT5yZW1vdGVfYnVzeV9mbGFnID0gMDsKKwkJZGVsX3RpbWVyKCZsbGMtPmJ1c3lfc3RhdGVfdGltZXIudGltZXIpOworCQluciA9IExMQ19JX0dFVF9OUihwZHUpOworCQlsbGNfY29ubl9yZXNlbmRfaV9wZHVfYXNfY21kKHNrLCBuciwgMCk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgbGxjX2Nvbm5fYWNfY29ubl9pbmQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCByYyA9IC1FTk9UQ09OTjsKKwl1OCBkc2FwOworCXN0cnVjdCBsbGNfc2FwICpzYXA7CisKKwlsbGNfcGR1X2RlY29kZV9kc2FwKHNrYiwgJmRzYXApOworCXNhcCA9IGxsY19zYXBfZmluZChkc2FwKTsKKwlpZiAoc2FwKSB7CisJCXN0cnVjdCBsbGNfY29ubl9zdGF0ZV9ldiAqZXYgPSBsbGNfY29ubl9ldihza2IpOworCQlzdHJ1Y3QgbGxjX3NvY2sgKmxsYyA9IGxsY19zayhzayk7CisKKwkJbGxjX3BkdV9kZWNvZGVfc2Eoc2tiLCBsbGMtPmRhZGRyLm1hYyk7CisJCWxsY19wZHVfZGVjb2RlX2RhKHNrYiwgbGxjLT5sYWRkci5tYWMpOworCQlsbGMtPmRldiA9IHNrYi0+ZGV2OworCQlldi0+aW5kX3ByaW0gPSBMTENfQ09OTl9QUklNOworCQlyYyA9IDA7CisJfQorCXJldHVybiByYzsKK30KKworaW50IGxsY19jb25uX2FjX2Nvbm5fY29uZmlybShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19jb25uX3N0YXRlX2V2ICpldiA9IGxsY19jb25uX2V2KHNrYik7CisKKwlldi0+Y2ZtX3ByaW0gPSBMTENfQ09OTl9QUklNOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxsY19jb25uX2FjX2RhdGFfY29uZmlybShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19jb25uX3N0YXRlX2V2ICpldiA9IGxsY19jb25uX2V2KHNrYik7CisKKwlldi0+Y2ZtX3ByaW0gPSBMTENfREFUQV9QUklNOworCXJldHVybiAwOworfQorCitpbnQgbGxjX2Nvbm5fYWNfZGF0YV9pbmQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWxsY19jb25uX3J0bl9wZHUoc2ssIHNrYik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBsbGNfY29ubl9hY19kaXNjX2luZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19jb25uX3N0YXRlX2V2ICpldiA9IGxsY19jb25uX2V2KHNrYik7CisJdTggcmVhc29uID0gMDsKKwlpbnQgcmMgPSAwOworCisJaWYgKGV2LT50eXBlID09IExMQ19DT05OX0VWX1RZUEVfUERVKSB7CisJCXN0cnVjdCBsbGNfcGR1X3VuICpwZHUgPSBsbGNfcGR1X3VuX2hkcihza2IpOworCisJCWlmIChMTENfUERVX0lTX1JTUChwZHUpICYmCisJCSAgICBMTENfUERVX1RZUEVfSVNfVShwZHUpICYmCisJCSAgICBMTENfVV9QRFVfUlNQKHBkdSkgPT0gTExDXzJfUERVX1JTUF9ETSkKKwkJCXJlYXNvbiA9IExMQ19ESVNDX1JFQVNPTl9SWF9ETV9SU1BfUERVOworCQllbHNlIGlmIChMTENfUERVX0lTX0NNRChwZHUpICYmCisJCQkgICBMTENfUERVX1RZUEVfSVNfVShwZHUpICYmCisJCQkgICBMTENfVV9QRFVfQ01EKHBkdSkgPT0gTExDXzJfUERVX0NNRF9ESVNDKQorCQkJcmVhc29uID0gTExDX0RJU0NfUkVBU09OX1JYX0RJU0NfQ01EX1BEVTsKKwl9IGVsc2UgaWYgKGV2LT50eXBlID09IExMQ19DT05OX0VWX1RZUEVfQUNLX1RNUikKKwkJcmVhc29uID0gTExDX0RJU0NfUkVBU09OX0FDS19UTVJfRVhQOworCWVsc2UgeworCQlyZWFzb24gPSAwOworCQlyYyA9IC1FSU5WQUw7CisJfQorCWlmICghcmMpIHsKKwkJZXYtPnJlYXNvbiAgID0gcmVhc29uOworCQlldi0+aW5kX3ByaW0gPSBMTENfRElTQ19QUklNOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK2ludCBsbGNfY29ubl9hY19kaXNjX2NvbmZpcm0oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfY29ubl9zdGF0ZV9ldiAqZXYgPSBsbGNfY29ubl9ldihza2IpOworCisJZXYtPnJlYXNvbiAgID0gZXYtPnN0YXR1czsKKwlldi0+Y2ZtX3ByaW0gPSBMTENfRElTQ19QUklNOworCXJldHVybiAwOworfQorCitpbnQgbGxjX2Nvbm5fYWNfcnN0X2luZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTggcmVhc29uID0gMDsKKwlpbnQgcmMgPSAxOworCXN0cnVjdCBsbGNfY29ubl9zdGF0ZV9ldiAqZXYgPSBsbGNfY29ubl9ldihza2IpOworCXN0cnVjdCBsbGNfcGR1X3VuICpwZHUgPSBsbGNfcGR1X3VuX2hkcihza2IpOworCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHNrKTsKKworCXN3aXRjaCAoZXYtPnR5cGUpIHsKKwljYXNlIExMQ19DT05OX0VWX1RZUEVfUERVOgorCQlpZiAoTExDX1BEVV9JU19SU1AocGR1KSAmJgorCQkgICAgTExDX1BEVV9UWVBFX0lTX1UocGR1KSAmJgorCQkgICAgTExDX1VfUERVX1JTUChwZHUpID09IExMQ18yX1BEVV9SU1BfRlJNUikgeworCQkJcmVhc29uID0gTExDX1JFU0VUX1JFQVNPTl9MT0NBTDsKKwkJCXJjID0gMDsKKwkJfSBlbHNlIGlmIChMTENfUERVX0lTX0NNRChwZHUpICYmCisJCQkgICBMTENfUERVX1RZUEVfSVNfVShwZHUpICYmCisJCQkgICBMTENfVV9QRFVfQ01EKHBkdSkgPT0gTExDXzJfUERVX0NNRF9TQUJNRSkgeworCQkJcmVhc29uID0gTExDX1JFU0VUX1JFQVNPTl9SRU1PVEU7CisJCQlyYyA9IDA7CisJCX0gZWxzZSB7CisJCQlyZWFzb24gPSAwOworCQkJcmMgID0gMTsKKwkJfQorCQlicmVhazsKKwljYXNlIExMQ19DT05OX0VWX1RZUEVfQUNLX1RNUjoKKwljYXNlIExMQ19DT05OX0VWX1RZUEVfUF9UTVI6CisJY2FzZSBMTENfQ09OTl9FVl9UWVBFX1JFSl9UTVI6CisJY2FzZSBMTENfQ09OTl9FVl9UWVBFX0JVU1lfVE1SOgorCQlpZiAobGxjLT5yZXRyeV9jb3VudCA+IGxsYy0+bjIpIHsKKwkJCXJlYXNvbiA9IExMQ19SRVNFVF9SRUFTT05fTE9DQUw7CisJCQlyYyA9IDA7CisJCX0gZWxzZQorCQkJcmMgPSAxOworCQlicmVhazsKKwl9CisJaWYgKCFyYykgeworCQlldi0+cmVhc29uICAgPSByZWFzb247CisJCWV2LT5pbmRfcHJpbSA9IExMQ19SRVNFVF9QUklNOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK2ludCBsbGNfY29ubl9hY19yc3RfY29uZmlybShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19jb25uX3N0YXRlX2V2ICpldiA9IGxsY19jb25uX2V2KHNrYik7CisKKwlldi0+cmVhc29uICAgPSAwOworCWV2LT5jZm1fcHJpbSA9IExMQ19SRVNFVF9QUklNOworCXJldHVybiAwOworfQorCitpbnQgbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3lfaWZfZl9lcV8xKHN0cnVjdCBzb2NrICpzaywKKwkJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisKKwlpZiAoTExDX1BEVV9JU19SU1AocGR1KSAmJgorCSAgICBMTENfUERVX1RZUEVfSVNfSShwZHUpICYmCisJICAgIExMQ19JX1BGX0lTXzEocGR1KSAmJiBsbGNfc2soc2spLT5hY2tfcGYpCisJCWxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5KHNrLCBza2IpOworCXJldHVybiAwOworfQorCitpbnQgbGxjX2Nvbm5fYWNfc3RvcF9yZWpfdG1yX2lmX2RhdGFfZmxhZ19lcV8yKHN0cnVjdCBzb2NrICpzaywKKwkJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2soc2spOworCisJaWYgKGxsYy0+ZGF0YV9mbGFnID09IDIpCisJCWRlbF90aW1lcigmbGxjLT5yZWpfc2VudF90aW1lci50aW1lcik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBsbGNfY29ubl9hY19zZW5kX2Rpc2NfY21kX3Bfc2V0X3goc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCByYyA9IC1FTk9CVUZTOworCXN0cnVjdCBza19idWZmICpuc2tiID0gbGxjX2FsbG9jX2ZyYW1lKCk7CisKKwlpZiAobnNrYikgeworCQlzdHJ1Y3QgbGxjX3NvY2sgKmxsYyA9IGxsY19zayhzayk7CisJCXN0cnVjdCBsbGNfc2FwICpzYXAgPSBsbGMtPnNhcDsKKworCQluc2tiLT5kZXYgPSBsbGMtPmRldjsKKwkJbGxjX3BkdV9oZWFkZXJfaW5pdChuc2tiLCBMTENfUERVX1RZUEVfVSwgc2FwLT5sYWRkci5sc2FwLAorCQkJCSAgICBsbGMtPmRhZGRyLmxzYXAsIExMQ19QRFVfQ01EKTsKKwkJbGxjX3BkdV9pbml0X2FzX2Rpc2NfY21kKG5za2IsIDEpOworCQlyYyA9IGxsY19tYWNfaGRyX2luaXQobnNrYiwgbGxjLT5kZXYtPmRldl9hZGRyLCBsbGMtPmRhZGRyLm1hYyk7CisJCWlmIChyYykKKwkJCWdvdG8gZnJlZTsKKwkJbGxjX2Nvbm5fc2VuZF9wZHUoc2ssIG5za2IpOworCQlsbGNfY29ubl9hY19zZXRfcF9mbGFnXzEoc2ssIHNrYik7CisJfQorb3V0OgorCXJldHVybiByYzsKK2ZyZWU6CisJa2ZyZWVfc2tiKG5za2IpOworCWdvdG8gb3V0OworfQorCitpbnQgbGxjX2Nvbm5fYWNfc2VuZF9kbV9yc3BfZl9zZXRfcChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHJjID0gLUVOT0JVRlM7CisJc3RydWN0IHNrX2J1ZmYgKm5za2IgPSBsbGNfYWxsb2NfZnJhbWUoKTsKKworCWlmIChuc2tiKSB7CisJCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHNrKTsKKwkJc3RydWN0IGxsY19zYXAgKnNhcCA9IGxsYy0+c2FwOworCQl1OCBmX2JpdDsKKworCQluc2tiLT5kZXYgPSBsbGMtPmRldjsKKwkJbGxjX3BkdV9kZWNvZGVfcGZfYml0KHNrYiwgJmZfYml0KTsKKwkJbGxjX3BkdV9oZWFkZXJfaW5pdChuc2tiLCBMTENfUERVX1RZUEVfVSwgc2FwLT5sYWRkci5sc2FwLAorCQkJCSAgICBsbGMtPmRhZGRyLmxzYXAsIExMQ19QRFVfUlNQKTsKKwkJbGxjX3BkdV9pbml0X2FzX2RtX3JzcChuc2tiLCBmX2JpdCk7CisJCXJjID0gbGxjX21hY19oZHJfaW5pdChuc2tiLCBsbGMtPmRldi0+ZGV2X2FkZHIsIGxsYy0+ZGFkZHIubWFjKTsKKwkJaWYgKHJjKQorCQkJZ290byBmcmVlOworCQlsbGNfY29ubl9zZW5kX3BkdShzaywgbnNrYik7CisJfQorb3V0OgorCXJldHVybiByYzsKK2ZyZWU6CisJa2ZyZWVfc2tiKG5za2IpOworCWdvdG8gb3V0OworfQorCitpbnQgbGxjX2Nvbm5fYWNfc2VuZF9kbV9yc3BfZl9zZXRfMShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHJjID0gLUVOT0JVRlM7CisJc3RydWN0IHNrX2J1ZmYgKm5za2IgPSBsbGNfYWxsb2NfZnJhbWUoKTsKKworCWlmIChuc2tiKSB7CisJCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHNrKTsKKwkJc3RydWN0IGxsY19zYXAgKnNhcCA9IGxsYy0+c2FwOworCQl1OCBmX2JpdCA9IDE7CisKKwkJbnNrYi0+ZGV2ID0gbGxjLT5kZXY7CisJCWxsY19wZHVfaGVhZGVyX2luaXQobnNrYiwgTExDX1BEVV9UWVBFX1UsIHNhcC0+bGFkZHIubHNhcCwKKwkJCQkgICAgbGxjLT5kYWRkci5sc2FwLCBMTENfUERVX1JTUCk7CisJCWxsY19wZHVfaW5pdF9hc19kbV9yc3AobnNrYiwgZl9iaXQpOworCQlyYyA9IGxsY19tYWNfaGRyX2luaXQobnNrYiwgbGxjLT5kZXYtPmRldl9hZGRyLCBsbGMtPmRhZGRyLm1hYyk7CisJCWlmIChyYykKKwkJCWdvdG8gZnJlZTsKKwkJbGxjX2Nvbm5fc2VuZF9wZHUoc2ssIG5za2IpOworCX0KK291dDoKKwlyZXR1cm4gcmM7CitmcmVlOgorCWtmcmVlX3NrYihuc2tiKTsKKwlnb3RvIG91dDsKK30KKworaW50IGxsY19jb25uX2FjX3NlbmRfZnJtcl9yc3BfZl9zZXRfeChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTggZl9iaXQ7CisJaW50IHJjID0gLUVOT0JVRlM7CisJc3RydWN0IHNrX2J1ZmYgKm5za2I7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2soc2spOworCisJbGxjLT5yeF9wZHVfaGRyID0gKigodTMyICopcGR1KTsKKwlpZiAoTExDX1BEVV9JU19DTUQocGR1KSkKKwkJbGxjX3BkdV9kZWNvZGVfcGZfYml0KHNrYiwgJmZfYml0KTsKKwllbHNlCisJCWZfYml0ID0gMDsKKwluc2tiID0gbGxjX2FsbG9jX2ZyYW1lKCk7CisJaWYgKG5za2IpIHsKKwkJc3RydWN0IGxsY19zYXAgKnNhcCA9IGxsYy0+c2FwOworCisJCW5za2ItPmRldiA9IGxsYy0+ZGV2OworCQlsbGNfcGR1X2hlYWRlcl9pbml0KG5za2IsIExMQ19QRFVfVFlQRV9VLCBzYXAtPmxhZGRyLmxzYXAsCisJCQkJICAgIGxsYy0+ZGFkZHIubHNhcCwgTExDX1BEVV9SU1ApOworCQlsbGNfcGR1X2luaXRfYXNfZnJtcl9yc3AobnNrYiwgcGR1LCBmX2JpdCwgbGxjLT52UywKKwkJCQkJIGxsYy0+dlIsIElOQ09SUkVDVCk7CisJCXJjID0gbGxjX21hY19oZHJfaW5pdChuc2tiLCBsbGMtPmRldi0+ZGV2X2FkZHIsIGxsYy0+ZGFkZHIubWFjKTsKKwkJaWYgKHJjKQorCQkJZ290byBmcmVlOworCQlsbGNfY29ubl9zZW5kX3BkdShzaywgbnNrYik7CisJfQorb3V0OgorCXJldHVybiByYzsKK2ZyZWU6CisJa2ZyZWVfc2tiKG5za2IpOworCWdvdG8gb3V0OworfQorCitpbnQgbGxjX2Nvbm5fYWNfcmVzZW5kX2ZybXJfcnNwX2Zfc2V0XzAoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCByYyA9IC1FTk9CVUZTOworCXN0cnVjdCBza19idWZmICpuc2tiID0gbGxjX2FsbG9jX2ZyYW1lKCk7CisKKwlpZiAobnNrYikgeworCQl1OCBmX2JpdCA9IDA7CisJCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHNrKTsKKwkJc3RydWN0IGxsY19zYXAgKnNhcCA9IGxsYy0+c2FwOworCQlzdHJ1Y3QgbGxjX3BkdV9zbiAqcGR1ID0gKHN0cnVjdCBsbGNfcGR1X3NuICopJmxsYy0+cnhfcGR1X2hkcjsKKworCQluc2tiLT5kZXYgPSBsbGMtPmRldjsKKwkJbGxjX3BkdV9oZWFkZXJfaW5pdChuc2tiLCBMTENfUERVX1RZUEVfVSwgc2FwLT5sYWRkci5sc2FwLAorCQkJCSAgICBsbGMtPmRhZGRyLmxzYXAsIExMQ19QRFVfUlNQKTsKKwkJbGxjX3BkdV9pbml0X2FzX2ZybXJfcnNwKG5za2IsIHBkdSwgZl9iaXQsIGxsYy0+dlMsCisJCQkJCSBsbGMtPnZSLCBJTkNPUlJFQ1QpOworCQlyYyA9IGxsY19tYWNfaGRyX2luaXQobnNrYiwgbGxjLT5kZXYtPmRldl9hZGRyLCBsbGMtPmRhZGRyLm1hYyk7CisJCWlmIChyYykKKwkJCWdvdG8gZnJlZTsKKwkJbGxjX2Nvbm5fc2VuZF9wZHUoc2ssIG5za2IpOworCX0KK291dDoKKwlyZXR1cm4gcmM7CitmcmVlOgorCWtmcmVlX3NrYihuc2tiKTsKKwlnb3RvIG91dDsKK30KKworaW50IGxsY19jb25uX2FjX3Jlc2VuZF9mcm1yX3JzcF9mX3NldF9wKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1OCBmX2JpdDsKKwlpbnQgcmMgPSAtRU5PQlVGUzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKKworCWxsY19wZHVfZGVjb2RlX3BmX2JpdChza2IsICZmX2JpdCk7CisJbnNrYiA9IGxsY19hbGxvY19mcmFtZSgpOworCWlmIChuc2tiKSB7CisJCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHNrKTsKKwkJc3RydWN0IGxsY19zYXAgKnNhcCA9IGxsYy0+c2FwOworCQlzdHJ1Y3QgbGxjX3BkdV9zbiAqcGR1ID0gbGxjX3BkdV9zbl9oZHIoc2tiKTsKKworCQluc2tiLT5kZXYgPSBsbGMtPmRldjsKKwkJbGxjX3BkdV9oZWFkZXJfaW5pdChuc2tiLCBMTENfUERVX1RZUEVfVSwgc2FwLT5sYWRkci5sc2FwLAorCQkJCSAgICBsbGMtPmRhZGRyLmxzYXAsIExMQ19QRFVfUlNQKTsKKwkJbGxjX3BkdV9pbml0X2FzX2ZybXJfcnNwKG5za2IsIHBkdSwgZl9iaXQsIGxsYy0+dlMsCisJCQkJCSBsbGMtPnZSLCBJTkNPUlJFQ1QpOworCQlyYyA9IGxsY19tYWNfaGRyX2luaXQobnNrYiwgbGxjLT5kZXYtPmRldl9hZGRyLCBsbGMtPmRhZGRyLm1hYyk7CisJCWlmIChyYykKKwkJCWdvdG8gZnJlZTsKKwkJbGxjX2Nvbm5fc2VuZF9wZHUoc2ssIG5za2IpOworCX0KK291dDoKKwlyZXR1cm4gcmM7CitmcmVlOgorCWtmcmVlX3NrYihuc2tiKTsKKwlnb3RvIG91dDsKK30KKworaW50IGxsY19jb25uX2FjX3NlbmRfaV9jbWRfcF9zZXRfMShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHJjOworCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHNrKTsKKwlzdHJ1Y3QgbGxjX3NhcCAqc2FwID0gbGxjLT5zYXA7CisKKwlsbGNfcGR1X2hlYWRlcl9pbml0KHNrYiwgTExDX1BEVV9UWVBFX0ksIHNhcC0+bGFkZHIubHNhcCwKKwkJCSAgICBsbGMtPmRhZGRyLmxzYXAsIExMQ19QRFVfQ01EKTsKKwlsbGNfcGR1X2luaXRfYXNfaV9jbWQoc2tiLCAxLCBsbGMtPnZTLCBsbGMtPnZSKTsKKwlyYyA9IGxsY19tYWNfaGRyX2luaXQoc2tiLCBsbGMtPmRldi0+ZGV2X2FkZHIsIGxsYy0+ZGFkZHIubWFjKTsKKwlpZiAoIXJjKSB7CisJCWxsY19jb25uX3NlbmRfcGR1KHNrLCBza2IpOworCQlsbGNfY29ubl9hY19pbmNfdnNfYnlfMShzaywgc2tiKTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGxsY19jb25uX2FjX3NlbmRfaV9jbWRfcF9zZXRfMChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHJjOworCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHNrKTsKKwlzdHJ1Y3QgbGxjX3NhcCAqc2FwID0gbGxjLT5zYXA7CisKKwlsbGNfcGR1X2hlYWRlcl9pbml0KHNrYiwgTExDX1BEVV9UWVBFX0ksIHNhcC0+bGFkZHIubHNhcCwKKwkJCSAgICBsbGMtPmRhZGRyLmxzYXAsIExMQ19QRFVfQ01EKTsKKwlsbGNfcGR1X2luaXRfYXNfaV9jbWQoc2tiLCAwLCBsbGMtPnZTLCBsbGMtPnZSKTsKKwlyYyA9IGxsY19tYWNfaGRyX2luaXQoc2tiLCBsbGMtPmRldi0+ZGV2X2FkZHIsIGxsYy0+ZGFkZHIubWFjKTsKKwlpZiAoIXJjKSB7CisJCWxsY19jb25uX3NlbmRfcGR1KHNrLCBza2IpOworCQlsbGNfY29ubl9hY19pbmNfdnNfYnlfMShzaywgc2tiKTsKKwl9CisJcmV0dXJuIHJjOworfQorCitpbnQgbGxjX2Nvbm5fYWNfc2VuZF9pX3h4eF94X3NldF8wKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmM7CisJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2soc2spOworCXN0cnVjdCBsbGNfc2FwICpzYXAgPSBsbGMtPnNhcDsKKworCWxsY19wZHVfaGVhZGVyX2luaXQoc2tiLCBMTENfUERVX1RZUEVfSSwgc2FwLT5sYWRkci5sc2FwLAorCQkJICAgIGxsYy0+ZGFkZHIubHNhcCwgTExDX1BEVV9DTUQpOworCWxsY19wZHVfaW5pdF9hc19pX2NtZChza2IsIDAsIGxsYy0+dlMsIGxsYy0+dlIpOworCXJjID0gbGxjX21hY19oZHJfaW5pdChza2IsIGxsYy0+ZGV2LT5kZXZfYWRkciwgbGxjLT5kYWRkci5tYWMpOworCWlmICghcmMpIHsKKwkJbGxjX2Nvbm5fc2VuZF9wZHUoc2ssIHNrYik7CisJCWxsY19jb25uX2FjX2luY192c19ieV8xKHNrLCBza2IpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGxsY19jb25uX2FjX3Jlc2VuZF9pX3h4eF94X3NldF8wKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX3BkdV9zbiAqcGR1ID0gbGxjX3BkdV9zbl9oZHIoc2tiKTsKKwl1OCBuciA9IExMQ19JX0dFVF9OUihwZHUpOworCisJbGxjX2Nvbm5fcmVzZW5kX2lfcGR1X2FzX2NtZChzaywgbnIsIDApOworCXJldHVybiAwOworfQorCitpbnQgbGxjX2Nvbm5fYWNfcmVzZW5kX2lfeHh4X3hfc2V0XzBfb3Jfc2VuZF9ycihzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXU4IG5yOworCXN0cnVjdCBsbGNfcGR1X3NuICpwZHUgPSBsbGNfcGR1X3NuX2hkcihza2IpOworCWludCByYyA9IC1FTk9CVUZTOworCXN0cnVjdCBza19idWZmICpuc2tiID0gbGxjX2FsbG9jX2ZyYW1lKCk7CisKKwlpZiAobnNrYikgeworCQlzdHJ1Y3QgbGxjX3NvY2sgKmxsYyA9IGxsY19zayhzayk7CisJCXN0cnVjdCBsbGNfc2FwICpzYXAgPSBsbGMtPnNhcDsKKworCQluc2tiLT5kZXYgPSBsbGMtPmRldjsKKwkJbGxjX3BkdV9oZWFkZXJfaW5pdChuc2tiLCBMTENfUERVX1RZUEVfVSwgc2FwLT5sYWRkci5sc2FwLAorCQkJCSAgICBsbGMtPmRhZGRyLmxzYXAsIExMQ19QRFVfUlNQKTsKKwkJbGxjX3BkdV9pbml0X2FzX3JyX3JzcChuc2tiLCAwLCBsbGMtPnZSKTsKKwkJcmMgPSBsbGNfbWFjX2hkcl9pbml0KG5za2IsIGxsYy0+ZGV2LT5kZXZfYWRkciwgbGxjLT5kYWRkci5tYWMpOworCQlpZiAoIXJjKQorCQkJbGxjX2Nvbm5fc2VuZF9wZHUoc2ssIG5za2IpOworCQllbHNlCisJCQlrZnJlZV9za2Ioc2tiKTsKKwl9CisJaWYgKHJjKSB7CisJCW5yID0gTExDX0lfR0VUX05SKHBkdSk7CisJCXJjID0gMDsKKwkJbGxjX2Nvbm5fcmVzZW5kX2lfcGR1X2FzX2NtZChzaywgbnIsIDApOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK2ludCBsbGNfY29ubl9hY19yZXNlbmRfaV9yc3BfZl9zZXRfMShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisJdTggbnIgPSBMTENfSV9HRVRfTlIocGR1KTsKKworCWxsY19jb25uX3Jlc2VuZF9pX3BkdV9hc19yc3Aoc2ssIG5yLCAxKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGxsY19jb25uX2FjX3NlbmRfcmVqX2NtZF9wX3NldF8xKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmMgPSAtRU5PQlVGUzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiA9IGxsY19hbGxvY19mcmFtZSgpOworCisJaWYgKG5za2IpIHsKKwkJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2soc2spOworCQlzdHJ1Y3QgbGxjX3NhcCAqc2FwID0gbGxjLT5zYXA7CisKKwkJbnNrYi0+ZGV2ID0gbGxjLT5kZXY7CisJCWxsY19wZHVfaGVhZGVyX2luaXQobnNrYiwgTExDX1BEVV9UWVBFX1MsIHNhcC0+bGFkZHIubHNhcCwKKwkJCQkgICAgbGxjLT5kYWRkci5sc2FwLCBMTENfUERVX0NNRCk7CisJCWxsY19wZHVfaW5pdF9hc19yZWpfY21kKG5za2IsIDEsIGxsYy0+dlIpOworCQlyYyA9IGxsY19tYWNfaGRyX2luaXQobnNrYiwgbGxjLT5kZXYtPmRldl9hZGRyLCBsbGMtPmRhZGRyLm1hYyk7CisJCWlmIChyYykKKwkJCWdvdG8gZnJlZTsKKwkJbGxjX2Nvbm5fc2VuZF9wZHUoc2ssIG5za2IpOworCX0KK291dDoKKwlyZXR1cm4gcmM7CitmcmVlOgorCWtmcmVlX3NrYihuc2tiKTsKKwlnb3RvIG91dDsKK30KKworaW50IGxsY19jb25uX2FjX3NlbmRfcmVqX3JzcF9mX3NldF8xKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmMgPSAtRU5PQlVGUzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiA9IGxsY19hbGxvY19mcmFtZSgpOworCisJaWYgKG5za2IpIHsKKwkJdTggZl9iaXQgPSAxOworCQlzdHJ1Y3QgbGxjX3NvY2sgKmxsYyA9IGxsY19zayhzayk7CisJCXN0cnVjdCBsbGNfc2FwICpzYXAgPSBsbGMtPnNhcDsKKworCQluc2tiLT5kZXYgPSBsbGMtPmRldjsKKwkJbGxjX3BkdV9oZWFkZXJfaW5pdChuc2tiLCBMTENfUERVX1RZUEVfUywgc2FwLT5sYWRkci5sc2FwLAorCQkJCSAgICBsbGMtPmRhZGRyLmxzYXAsIExMQ19QRFVfUlNQKTsKKwkJbGxjX3BkdV9pbml0X2FzX3Jlal9yc3AobnNrYiwgZl9iaXQsIGxsYy0+dlIpOworCQlyYyA9IGxsY19tYWNfaGRyX2luaXQobnNrYiwgbGxjLT5kZXYtPmRldl9hZGRyLCBsbGMtPmRhZGRyLm1hYyk7CisJCWlmIChyYykKKwkJCWdvdG8gZnJlZTsKKwkJbGxjX2Nvbm5fc2VuZF9wZHUoc2ssIG5za2IpOworCX0KK291dDoKKwlyZXR1cm4gcmM7CitmcmVlOgorCWtmcmVlX3NrYihuc2tiKTsKKwlnb3RvIG91dDsKK30KKworaW50IGxsY19jb25uX2FjX3NlbmRfcmVqX3h4eF94X3NldF8wKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmMgPSAtRU5PQlVGUzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiA9IGxsY19hbGxvY19mcmFtZSgpOworCisJaWYgKG5za2IpIHsKKwkJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2soc2spOworCQlzdHJ1Y3QgbGxjX3NhcCAqc2FwID0gbGxjLT5zYXA7CisJCXU4IGZfYml0ID0gMDsKKworCQluc2tiLT5kZXYgPSBsbGMtPmRldjsKKwkJbGxjX3BkdV9oZWFkZXJfaW5pdChuc2tiLCBMTENfUERVX1RZUEVfUywgc2FwLT5sYWRkci5sc2FwLAorCQkJCSAgICBsbGMtPmRhZGRyLmxzYXAsIExMQ19QRFVfUlNQKTsKKwkJbGxjX3BkdV9pbml0X2FzX3Jlal9yc3AobnNrYiwgZl9iaXQsIGxsYy0+dlIpOworCQlyYyA9IGxsY19tYWNfaGRyX2luaXQobnNrYiwgbGxjLT5kZXYtPmRldl9hZGRyLCBsbGMtPmRhZGRyLm1hYyk7CisJCWlmIChyYykKKwkJCWdvdG8gZnJlZTsKKwkJbGxjX2Nvbm5fc2VuZF9wZHUoc2ssIG5za2IpOworCX0KK291dDoKKwlyZXR1cm4gcmM7CitmcmVlOgorCWtmcmVlX3NrYihuc2tiKTsKKwlnb3RvIG91dDsKK30KKworaW50IGxsY19jb25uX2FjX3NlbmRfcm5yX2NtZF9wX3NldF8xKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmMgPSAtRU5PQlVGUzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiA9IGxsY19hbGxvY19mcmFtZSgpOworCisJaWYgKG5za2IpIHsKKwkJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2soc2spOworCQlzdHJ1Y3QgbGxjX3NhcCAqc2FwID0gbGxjLT5zYXA7CisKKwkJbnNrYi0+ZGV2ID0gbGxjLT5kZXY7CisJCWxsY19wZHVfaGVhZGVyX2luaXQobnNrYiwgTExDX1BEVV9UWVBFX1MsIHNhcC0+bGFkZHIubHNhcCwKKwkJCQkgICAgbGxjLT5kYWRkci5sc2FwLCBMTENfUERVX0NNRCk7CisJCWxsY19wZHVfaW5pdF9hc19ybnJfY21kKG5za2IsIDEsIGxsYy0+dlIpOworCQlyYyA9IGxsY19tYWNfaGRyX2luaXQobnNrYiwgbGxjLT5kZXYtPmRldl9hZGRyLCBsbGMtPmRhZGRyLm1hYyk7CisJCWlmIChyYykKKwkJCWdvdG8gZnJlZTsKKwkJbGxjX2Nvbm5fc2VuZF9wZHUoc2ssIG5za2IpOworCX0KK291dDoKKwlyZXR1cm4gcmM7CitmcmVlOgorCWtmcmVlX3NrYihuc2tiKTsKKwlnb3RvIG91dDsKK30KKworaW50IGxsY19jb25uX2FjX3NlbmRfcm5yX3JzcF9mX3NldF8xKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmMgPSAtRU5PQlVGUzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiA9IGxsY19hbGxvY19mcmFtZSgpOworCisJaWYgKG5za2IpIHsKKwkJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2soc2spOworCQlzdHJ1Y3QgbGxjX3NhcCAqc2FwID0gbGxjLT5zYXA7CisJCXU4IGZfYml0ID0gMTsKKworCQluc2tiLT5kZXYgPSBsbGMtPmRldjsKKwkJbGxjX3BkdV9oZWFkZXJfaW5pdChuc2tiLCBMTENfUERVX1RZUEVfUywgc2FwLT5sYWRkci5sc2FwLAorCQkJCSAgICBsbGMtPmRhZGRyLmxzYXAsIExMQ19QRFVfUlNQKTsKKwkJbGxjX3BkdV9pbml0X2FzX3Jucl9yc3AobnNrYiwgZl9iaXQsIGxsYy0+dlIpOworCQlyYyA9IGxsY19tYWNfaGRyX2luaXQobnNrYiwgbGxjLT5kZXYtPmRldl9hZGRyLCBsbGMtPmRhZGRyLm1hYyk7CisJCWlmIChyYykKKwkJCWdvdG8gZnJlZTsKKwkJbGxjX2Nvbm5fc2VuZF9wZHUoc2ssIG5za2IpOworCX0KK291dDoKKwlyZXR1cm4gcmM7CitmcmVlOgorCWtmcmVlX3NrYihuc2tiKTsKKwlnb3RvIG91dDsKK30KKworaW50IGxsY19jb25uX2FjX3NlbmRfcm5yX3h4eF94X3NldF8wKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmMgPSAtRU5PQlVGUzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiA9IGxsY19hbGxvY19mcmFtZSgpOworCisJaWYgKG5za2IpIHsKKwkJdTggZl9iaXQgPSAwOworCQlzdHJ1Y3QgbGxjX3NvY2sgKmxsYyA9IGxsY19zayhzayk7CisJCXN0cnVjdCBsbGNfc2FwICpzYXAgPSBsbGMtPnNhcDsKKworCQluc2tiLT5kZXYgPSBsbGMtPmRldjsKKwkJbGxjX3BkdV9oZWFkZXJfaW5pdChuc2tiLCBMTENfUERVX1RZUEVfUywgc2FwLT5sYWRkci5sc2FwLAorCQkJCSAgICBsbGMtPmRhZGRyLmxzYXAsIExMQ19QRFVfUlNQKTsKKwkJbGxjX3BkdV9pbml0X2FzX3Jucl9yc3AobnNrYiwgZl9iaXQsIGxsYy0+dlIpOworCQlyYyA9IGxsY19tYWNfaGRyX2luaXQobnNrYiwgbGxjLT5kZXYtPmRldl9hZGRyLCBsbGMtPmRhZGRyLm1hYyk7CisJCWlmIChyYykKKwkJCWdvdG8gZnJlZTsKKwkJbGxjX2Nvbm5fc2VuZF9wZHUoc2ssIG5za2IpOworCX0KK291dDoKKwlyZXR1cm4gcmM7CitmcmVlOgorCWtmcmVlX3NrYihuc2tiKTsKKwlnb3RvIG91dDsKK30KKworaW50IGxsY19jb25uX2FjX3NldF9yZW1vdGVfYnVzeShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2soc2spOworCisJaWYgKCFsbGMtPnJlbW90ZV9idXN5X2ZsYWcpIHsKKwkJbGxjLT5yZW1vdGVfYnVzeV9mbGFnID0gMTsKKwkJbW9kX3RpbWVyKCZsbGMtPmJ1c3lfc3RhdGVfdGltZXIudGltZXIsCisJCQkgamlmZmllcyArIGxsYy0+YnVzeV9zdGF0ZV90aW1lci5leHBpcmUgKiBIWik7CisJfQorCXJldHVybiAwOworfQorCitpbnQgbGxjX2Nvbm5fYWNfb3B0X3NlbmRfcm5yX3h4eF94X3NldF8wKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmMgPSAtRU5PQlVGUzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiA9IGxsY19hbGxvY19mcmFtZSgpOworCisJaWYgKG5za2IpIHsKKwkJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2soc2spOworCQlzdHJ1Y3QgbGxjX3NhcCAqc2FwID0gbGxjLT5zYXA7CisKKwkJbnNrYi0+ZGV2ID0gbGxjLT5kZXY7CisJCWxsY19wZHVfaGVhZGVyX2luaXQobnNrYiwgTExDX1BEVV9UWVBFX1MsIHNhcC0+bGFkZHIubHNhcCwKKwkJCQkgICAgbGxjLT5kYWRkci5sc2FwLCBMTENfUERVX1JTUCk7CisJCWxsY19wZHVfaW5pdF9hc19ybnJfcnNwKG5za2IsIDAsIGxsYy0+dlIpOworCQlyYyA9IGxsY19tYWNfaGRyX2luaXQobnNrYiwgbGxjLT5kZXYtPmRldl9hZGRyLCBsbGMtPmRhZGRyLm1hYyk7CisJCWlmIChyYykKKwkJCWdvdG8gZnJlZTsKKwkJbGxjX2Nvbm5fc2VuZF9wZHUoc2ssIG5za2IpOworCX0KK291dDoKKwlyZXR1cm4gcmM7CitmcmVlOgorCWtmcmVlX3NrYihuc2tiKTsKKwlnb3RvIG91dDsKK30KKworaW50IGxsY19jb25uX2FjX3NlbmRfcnJfY21kX3Bfc2V0XzEoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCByYyA9IC1FTk9CVUZTOworCXN0cnVjdCBza19idWZmICpuc2tiID0gbGxjX2FsbG9jX2ZyYW1lKCk7CisKKwlpZiAobnNrYikgeworCQlzdHJ1Y3QgbGxjX3NvY2sgKmxsYyA9IGxsY19zayhzayk7CisJCXN0cnVjdCBsbGNfc2FwICpzYXAgPSBsbGMtPnNhcDsKKworCQluc2tiLT5kZXYgPSBsbGMtPmRldjsKKwkJbGxjX3BkdV9oZWFkZXJfaW5pdChuc2tiLCBMTENfUERVX1RZUEVfUywgc2FwLT5sYWRkci5sc2FwLAorCQkJCSAgICBsbGMtPmRhZGRyLmxzYXAsIExMQ19QRFVfQ01EKTsKKwkJbGxjX3BkdV9pbml0X2FzX3JyX2NtZChuc2tiLCAxLCBsbGMtPnZSKTsKKwkJcmMgPSBsbGNfbWFjX2hkcl9pbml0KG5za2IsIGxsYy0+ZGV2LT5kZXZfYWRkciwgbGxjLT5kYWRkci5tYWMpOworCQlpZiAocmMpCisJCQlnb3RvIGZyZWU7CisJCWxsY19jb25uX3NlbmRfcGR1KHNrLCBuc2tiKTsKKwl9CitvdXQ6CisJcmV0dXJuIHJjOworZnJlZToKKwlrZnJlZV9za2IobnNrYik7CisJZ290byBvdXQ7Cit9CisKK2ludCBsbGNfY29ubl9hY19zZW5kX3JyX3JzcF9mX3NldF8xKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmMgPSAtRU5PQlVGUzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiA9IGxsY19hbGxvY19mcmFtZSgpOworCisJaWYgKG5za2IpIHsKKwkJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2soc2spOworCQlzdHJ1Y3QgbGxjX3NhcCAqc2FwID0gbGxjLT5zYXA7CisJCXU4IGZfYml0ID0gMTsKKworCQluc2tiLT5kZXYgPSBsbGMtPmRldjsKKwkJbGxjX3BkdV9oZWFkZXJfaW5pdChuc2tiLCBMTENfUERVX1RZUEVfUywgc2FwLT5sYWRkci5sc2FwLAorCQkJCSAgICBsbGMtPmRhZGRyLmxzYXAsIExMQ19QRFVfUlNQKTsKKwkJbGxjX3BkdV9pbml0X2FzX3JyX3JzcChuc2tiLCBmX2JpdCwgbGxjLT52Uik7CisJCXJjID0gbGxjX21hY19oZHJfaW5pdChuc2tiLCBsbGMtPmRldi0+ZGV2X2FkZHIsIGxsYy0+ZGFkZHIubWFjKTsKKwkJaWYgKHJjKQorCQkJZ290byBmcmVlOworCQlsbGNfY29ubl9zZW5kX3BkdShzaywgbnNrYik7CisJfQorb3V0OgorCXJldHVybiByYzsKK2ZyZWU6CisJa2ZyZWVfc2tiKG5za2IpOworCWdvdG8gb3V0OworfQorCitpbnQgbGxjX2Nvbm5fYWNfc2VuZF9hY2tfcnNwX2Zfc2V0XzEoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCByYyA9IC1FTk9CVUZTOworCXN0cnVjdCBza19idWZmICpuc2tiID0gbGxjX2FsbG9jX2ZyYW1lKCk7CisKKwlpZiAobnNrYikgeworCQlzdHJ1Y3QgbGxjX3NvY2sgKmxsYyA9IGxsY19zayhzayk7CisJCXN0cnVjdCBsbGNfc2FwICpzYXAgPSBsbGMtPnNhcDsKKwkJdTggZl9iaXQgPSAxOworCisJCW5za2ItPmRldiA9IGxsYy0+ZGV2OworCQlsbGNfcGR1X2hlYWRlcl9pbml0KG5za2IsIExMQ19QRFVfVFlQRV9TLCBzYXAtPmxhZGRyLmxzYXAsCisJCQkJICAgIGxsYy0+ZGFkZHIubHNhcCwgTExDX1BEVV9SU1ApOworCQlsbGNfcGR1X2luaXRfYXNfcnJfcnNwKG5za2IsIGZfYml0LCBsbGMtPnZSKTsKKwkJcmMgPSBsbGNfbWFjX2hkcl9pbml0KG5za2IsIGxsYy0+ZGV2LT5kZXZfYWRkciwgbGxjLT5kYWRkci5tYWMpOworCQlpZiAocmMpCisJCQlnb3RvIGZyZWU7CisJCWxsY19jb25uX3NlbmRfcGR1KHNrLCBuc2tiKTsKKwl9CitvdXQ6CisJcmV0dXJuIHJjOworZnJlZToKKwlrZnJlZV9za2IobnNrYik7CisJZ290byBvdXQ7Cit9CisKK2ludCBsbGNfY29ubl9hY19zZW5kX3JyX3h4eF94X3NldF8wKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmMgPSAtRU5PQlVGUzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiA9IGxsY19hbGxvY19mcmFtZSgpOworCisJaWYgKG5za2IpIHsKKwkJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2soc2spOworCQlzdHJ1Y3QgbGxjX3NhcCAqc2FwID0gbGxjLT5zYXA7CisKKwkJbnNrYi0+ZGV2ID0gbGxjLT5kZXY7CisJCWxsY19wZHVfaGVhZGVyX2luaXQobnNrYiwgTExDX1BEVV9UWVBFX1MsIHNhcC0+bGFkZHIubHNhcCwKKwkJCQkgICAgbGxjLT5kYWRkci5sc2FwLCBMTENfUERVX1JTUCk7CisJCWxsY19wZHVfaW5pdF9hc19ycl9yc3AobnNrYiwgMCwgbGxjLT52Uik7CisJCXJjID0gbGxjX21hY19oZHJfaW5pdChuc2tiLCBsbGMtPmRldi0+ZGV2X2FkZHIsIGxsYy0+ZGFkZHIubWFjKTsKKwkJaWYgKHJjKQorCQkJZ290byBmcmVlOworCQlsbGNfY29ubl9zZW5kX3BkdShzaywgbnNrYik7CisJfQorb3V0OgorCXJldHVybiByYzsKK2ZyZWU6CisJa2ZyZWVfc2tiKG5za2IpOworCWdvdG8gb3V0OworfQorCitpbnQgbGxjX2Nvbm5fYWNfc2VuZF9hY2tfeHh4X3hfc2V0XzAoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCByYyA9IC1FTk9CVUZTOworCXN0cnVjdCBza19idWZmICpuc2tiID0gbGxjX2FsbG9jX2ZyYW1lKCk7CisKKwlpZiAobnNrYikgeworCQlzdHJ1Y3QgbGxjX3NvY2sgKmxsYyA9IGxsY19zayhzayk7CisJCXN0cnVjdCBsbGNfc2FwICpzYXAgPSBsbGMtPnNhcDsKKworCQluc2tiLT5kZXYgPSBsbGMtPmRldjsKKwkJbGxjX3BkdV9oZWFkZXJfaW5pdChuc2tiLCBMTENfUERVX1RZUEVfUywgc2FwLT5sYWRkci5sc2FwLAorCQkJCSAgICBsbGMtPmRhZGRyLmxzYXAsIExMQ19QRFVfUlNQKTsKKwkJbGxjX3BkdV9pbml0X2FzX3JyX3JzcChuc2tiLCAwLCBsbGMtPnZSKTsKKwkJcmMgPSBsbGNfbWFjX2hkcl9pbml0KG5za2IsIGxsYy0+ZGV2LT5kZXZfYWRkciwgbGxjLT5kYWRkci5tYWMpOworCQlpZiAocmMpCisJCQlnb3RvIGZyZWU7CisJCWxsY19jb25uX3NlbmRfcGR1KHNrLCBuc2tiKTsKKwl9CitvdXQ6CisJcmV0dXJuIHJjOworZnJlZToKKwlrZnJlZV9za2IobnNrYik7CisJZ290byBvdXQ7Cit9CisKK3ZvaWQgbGxjX2Nvbm5fc2V0X3BfZmxhZyhzdHJ1Y3Qgc29jayAqc2ssIHU4IHZhbHVlKQoreworCWludCBzdGF0ZV9jaGFuZ2VkID0gbGxjX3NrKHNrKS0+cF9mbGFnICYmICF2YWx1ZTsKKworCWxsY19zayhzayktPnBfZmxhZyA9IHZhbHVlOworCisJaWYgKHN0YXRlX2NoYW5nZWQpCisJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworfQorCitpbnQgbGxjX2Nvbm5fYWNfc2VuZF9zYWJtZV9jbWRfcF9zZXRfeChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHJjID0gLUVOT0JVRlM7CisJc3RydWN0IHNrX2J1ZmYgKm5za2IgPSBsbGNfYWxsb2NfZnJhbWUoKTsKKwlzdHJ1Y3QgbGxjX3NvY2sgKmxsYyA9IGxsY19zayhzayk7CisKKwlpZiAobnNrYikgeworCQlzdHJ1Y3QgbGxjX3NhcCAqc2FwID0gbGxjLT5zYXA7CisJCXU4ICpkbWFjID0gbGxjLT5kYWRkci5tYWM7CisKKwkJaWYgKGxsYy0+ZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykKKwkJCWRtYWMgPSBsbGMtPmRldi0+ZGV2X2FkZHI7CisJCW5za2ItPmRldiA9IGxsYy0+ZGV2OworCQlsbGNfcGR1X2hlYWRlcl9pbml0KG5za2IsIExMQ19QRFVfVFlQRV9VLCBzYXAtPmxhZGRyLmxzYXAsCisJCQkJICAgIGxsYy0+ZGFkZHIubHNhcCwgTExDX1BEVV9DTUQpOworCQlsbGNfcGR1X2luaXRfYXNfc2FibWVfY21kKG5za2IsIDEpOworCQlyYyA9IGxsY19tYWNfaGRyX2luaXQobnNrYiwgbGxjLT5kZXYtPmRldl9hZGRyLCBkbWFjKTsKKwkJaWYgKHJjKQorCQkJZ290byBmcmVlOworCQlsbGNfY29ubl9zZW5kX3BkdShzaywgbnNrYik7CisJCWxsY19jb25uX3NldF9wX2ZsYWcoc2ssIDEpOworCX0KK291dDoKKwlyZXR1cm4gcmM7CitmcmVlOgorCWtmcmVlX3NrYihuc2tiKTsKKwlnb3RvIG91dDsKK30KKworaW50IGxsY19jb25uX2FjX3NlbmRfdWFfcnNwX2Zfc2V0X3Aoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXU4IGZfYml0OworCWludCByYyA9IC1FTk9CVUZTOworCXN0cnVjdCBza19idWZmICpuc2tiID0gbGxjX2FsbG9jX2ZyYW1lKCk7CisKKwlsbGNfcGR1X2RlY29kZV9wZl9iaXQoc2tiLCAmZl9iaXQpOworCWlmIChuc2tiKSB7CisJCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHNrKTsKKwkJc3RydWN0IGxsY19zYXAgKnNhcCA9IGxsYy0+c2FwOworCisJCW5za2ItPmRldiA9IGxsYy0+ZGV2OworCQlsbGNfcGR1X2hlYWRlcl9pbml0KG5za2IsIExMQ19QRFVfVFlQRV9VLCBzYXAtPmxhZGRyLmxzYXAsCisJCQkJICAgIGxsYy0+ZGFkZHIubHNhcCwgTExDX1BEVV9SU1ApOworCQlsbGNfcGR1X2luaXRfYXNfdWFfcnNwKG5za2IsIGZfYml0KTsKKwkJcmMgPSBsbGNfbWFjX2hkcl9pbml0KG5za2IsIGxsYy0+ZGV2LT5kZXZfYWRkciwgbGxjLT5kYWRkci5tYWMpOworCQlpZiAocmMpCisJCQlnb3RvIGZyZWU7CisJCWxsY19jb25uX3NlbmRfcGR1KHNrLCBuc2tiKTsKKwl9CitvdXQ6CisJcmV0dXJuIHJjOworZnJlZToKKwlrZnJlZV9za2IobnNrYik7CisJZ290byBvdXQ7Cit9CisKK2ludCBsbGNfY29ubl9hY19zZXRfc19mbGFnXzAoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWxsY19zayhzayktPnNfZmxhZyA9IDA7CisJcmV0dXJuIDA7Cit9CisKK2ludCBsbGNfY29ubl9hY19zZXRfc19mbGFnXzEoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWxsY19zayhzayktPnNfZmxhZyA9IDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBsbGNfY29ubl9hY19zdGFydF9wX3RpbWVyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX3NvY2sgKmxsYyA9IGxsY19zayhzayk7CisKKwlsbGNfY29ubl9zZXRfcF9mbGFnKHNrLCAxKTsKKwltb2RfdGltZXIoJmxsYy0+cGZfY3ljbGVfdGltZXIudGltZXIsCisJCSAgamlmZmllcyArIGxsYy0+cGZfY3ljbGVfdGltZXIuZXhwaXJlICogSFopOworCXJldHVybiAwOworfQorCisvKioKKyAqCWxsY19jb25uX2FjX3NlbmRfYWNrX2lmX25lZWRlZCAtIGNoZWNrIGlmIGFjayBpcyBuZWVkZWQKKyAqCUBzazogY3VycmVudCBjb25uZWN0aW9uIHN0cnVjdHVyZQorICoJQHNrYjogY3VycmVudCBldmVudAorICoKKyAqCUNoZWNrcyBudW1iZXIgb2YgcmVjZWl2ZWQgUERVcyB3aGljaCBoYXZlIG5vdCBiZWVuIGFja25vd2xlZGdlZCwgeWV0LAorICoJSWYgbnVtYmVyIG9mIHRoZW0gcmVhY2hlcyB0byAibnB0YSIoTnVtYmVyIG9mIFBEVXMgVG8gQWNrbm93bGVkZ2UpIHRoZW4KKyAqCXNlbmRzIGFuIFJSIHJlc3BvbnNlIGFzIGFja25vd2xlZGdlbWVudCBmb3IgdGhlbS4gIFJldHVybnMgMCBmb3IKKyAqCXN1Y2Nlc3MsIDEgb3RoZXJ3aXNlLgorICovCitpbnQgbGxjX2Nvbm5fYWNfc2VuZF9hY2tfaWZfbmVlZGVkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1OCBwZl9iaXQ7CisJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2soc2spOworCisJbGxjX3BkdV9kZWNvZGVfcGZfYml0KHNrYiwgJnBmX2JpdCk7CisJbGxjLT5hY2tfcGYgfD0gcGZfYml0ICYgMTsKKwlpZiAoIWxsYy0+YWNrX211c3RfYmVfc2VuZCkgeworCQlsbGMtPmZpcnN0X3BkdV9OcyA9IGxsYy0+dlI7CisJCWxsYy0+YWNrX211c3RfYmVfc2VuZCA9IDE7CisJCWxsYy0+YWNrX3BmID0gcGZfYml0ICYgMTsKKwl9CisJaWYgKCgobGxjLT52UiAtIGxsYy0+Zmlyc3RfcGR1X05zICsgMTI5KSAlIDEyOCkgPj0gbGxjLT5ucHRhKSB7CisJCWxsY19jb25uX2FjX3NlbmRfcnJfcnNwX2Zfc2V0X2Fja3BmKHNrLCBza2IpOworCQlsbGMtPmFja19tdXN0X2JlX3NlbmQJPSAwOworCQlsbGMtPmFja19wZgkJPSAwOworCQlsbGNfY29ubl9hY19pbmNfbnB0YV92YWx1ZShzaywgc2tiKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJbGxjX2Nvbm5fYWNfcnN0X3NlbmRhY2tfZmxhZyAtIHJlc2V0cyBhY2tfbXVzdF9iZV9zZW5kIGZsYWcKKyAqCUBzazogY3VycmVudCBjb25uZWN0aW9uIHN0cnVjdHVyZQorICoJQHNrYjogY3VycmVudCBldmVudAorICoKKyAqCVRoaXMgYWN0aW9uIHJlc2V0cyBhY2tfbXVzdF9iZV9zZW5kIGZsYWcgb2YgZ2l2ZW4gY29ubmVjdGlvbiwgdGhpcyBmbGFnCisgKglpbmRpY2F0ZXMgaWYgdGhlcmUgaXMgYW55IFBEVSB3aGljaCBoYXMgbm90IGJlZW4gYWNrbm93bGVkZ2VkIHlldC4KKyAqCVJldHVybnMgMCBmb3Igc3VjY2VzcywgMSBvdGhlcndpc2UuCisgKi8KK2ludCBsbGNfY29ubl9hY19yc3Rfc2VuZGFja19mbGFnKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlsbGNfc2soc2spLT5hY2tfbXVzdF9iZV9zZW5kID0gbGxjX3NrKHNrKS0+YWNrX3BmID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglsbGNfY29ubl9hY19zZW5kX2lfcnNwX2Zfc2V0X2Fja3BmIC0gYWNrbm93bGVkZ2UgcmVjZWl2ZWQgUERVcworICoJQHNrOiBjdXJyZW50IGNvbm5lY3Rpb24gc3RydWN0dXJlCisgKglAc2tiOiBjdXJyZW50IGV2ZW50CisgKgorICoJU2VuZHMgYW4gSSByZXNwb25zZSBQRFUgd2l0aCBmLWJpdCBzZXQgdG8gYWNrX3BmIGZsYWcgYXMgYWNrbm93bGVkZ2UgdG8KKyAqCWFsbCByZWNlaXZlZCBQRFVzIHdoaWNoIGhhdmUgbm90IGJlZW4gYWNrbm93bGVkZ2VkLCB5ZXQuIGFja19wZiBmbGFnIGlzCisgKglzZXQgdG8gb25lIGlmIG9uZSBQRFUgd2l0aCBwLWJpdCBzZXQgdG8gb25lIGlzIHJlY2VpdmVkLiAgUmV0dXJucyAwIGZvcgorICoJc3VjY2VzcywgMSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgbGxjX2Nvbm5fYWNfc2VuZF9pX3JzcF9mX3NldF9hY2twZihzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHJjOworCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHNrKTsKKwlzdHJ1Y3QgbGxjX3NhcCAqc2FwID0gbGxjLT5zYXA7CisKKwlsbGNfcGR1X2hlYWRlcl9pbml0KHNrYiwgTExDX1BEVV9UWVBFX0ksIHNhcC0+bGFkZHIubHNhcCwKKwkJCSAgICBsbGMtPmRhZGRyLmxzYXAsIExMQ19QRFVfUlNQKTsKKwlsbGNfcGR1X2luaXRfYXNfaV9jbWQoc2tiLCBsbGMtPmFja19wZiwgbGxjLT52UywgbGxjLT52Uik7CisJcmMgPSBsbGNfbWFjX2hkcl9pbml0KHNrYiwgbGxjLT5kZXYtPmRldl9hZGRyLCBsbGMtPmRhZGRyLm1hYyk7CisJaWYgKCFyYykgeworCQlsbGNfY29ubl9zZW5kX3BkdShzaywgc2tiKTsKKwkJbGxjX2Nvbm5fYWNfaW5jX3ZzX2J5XzEoc2ssIHNrYik7CisJfQorCXJldHVybiByYzsKK30KKworLyoqCisgKglsbGNfY29ubl9hY19zZW5kX2lfYXNfYWNrIC0gc2VuZHMgYW4gSS1mb3JtYXQgUERVIHRvIGFja25vd2xlZGdlIHJ4IFBEVXMKKyAqCUBzazogY3VycmVudCBjb25uZWN0aW9uIHN0cnVjdHVyZS4KKyAqCUBza2I6IGN1cnJlbnQgZXZlbnQuCisgKgorICoJVGhpcyBhY3Rpb24gc2VuZHMgYW4gSS1mb3JtYXQgUERVIGFzIGFja25vd2xlZGdlIHRvIHJlY2VpdmVkIFBEVXMgd2hpY2gKKyAqCWhhdmUgbm90IGJlZW4gYWNrbm93bGVkZ2VkLCB5ZXQsIGlmIHRoZXJlIGlzIGFueS4gQnkgdXNpbmcgb2YgdGhpcworICoJYWN0aW9uIG51bWJlciBvZiBhY2tub3dsZWRnZW1lbnRzIGRlY3JlYXNlcywgdGhpcyB0ZWNobmljIGlzIGNhbGxlZAorICoJcGlnZ3kgYmFja2luZy4gUmV0dXJucyAwIGZvciBzdWNjZXNzLCAxIG90aGVyd2lzZS4KKyAqLworaW50IGxsY19jb25uX2FjX3NlbmRfaV9hc19hY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHNrKTsKKworCWlmIChsbGMtPmFja19tdXN0X2JlX3NlbmQpIHsKKwkJbGxjX2Nvbm5fYWNfc2VuZF9pX3JzcF9mX3NldF9hY2twZihzaywgc2tiKTsKKwkJbGxjLT5hY2tfbXVzdF9iZV9zZW5kID0gMCA7CisJCWxsYy0+YWNrX3BmID0gMDsKKwl9IGVsc2UKKwkJbGxjX2Nvbm5fYWNfc2VuZF9pX2NtZF9wX3NldF8wKHNrLCBza2IpOworCXJldHVybiAwOworfQorCisvKioKKyAqCWxsY19jb25uX2FjX3NlbmRfcnJfcnNwX2Zfc2V0X2Fja3BmIC0gYWNrIGFsbCByeCBQRFVzIG5vdCB5ZXQgYWNrZWQKKyAqCUBzazogY3VycmVudCBjb25uZWN0aW9uIHN0cnVjdHVyZS4KKyAqCUBza2I6IGN1cnJlbnQgZXZlbnQuCisgKgorICoJVGhpcyBhY3Rpb24gc2VuZHMgYW4gUlIgcmVzcG9uc2Ugd2l0aCBmLWJpdCBzZXQgdG8gYWNrX3BmIGZsYWcgYXMKKyAqCWFja25vd2xlZGdlIHRvIGFsbCByZWNlaXZlZCBQRFVzIHdoaWNoIGhhdmUgbm90IGJlZW4gYWNrbm93bGVkZ2VkLCB5ZXQsCisgKglpZiB0aGVyZSBpcyBhbnkuIGFja19wZiBmbGFnIGluZGljYXRlcyBpZiBhIFBEVSBoYXMgYmVlbiByZWNlaXZlZCB3aXRoCisgKglwLWJpdCBzZXQgdG8gb25lLiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIDEgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IGxsY19jb25uX2FjX3NlbmRfcnJfcnNwX2Zfc2V0X2Fja3BmKHN0cnVjdCBzb2NrICpzaywKKwkJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHJjID0gLUVOT0JVRlM7CisJc3RydWN0IHNrX2J1ZmYgKm5za2IgPSBsbGNfYWxsb2NfZnJhbWUoKTsKKworCWlmIChuc2tiKSB7CisJCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHNrKTsKKwkJc3RydWN0IGxsY19zYXAgKnNhcCA9IGxsYy0+c2FwOworCisJCW5za2ItPmRldiA9IGxsYy0+ZGV2OworCQlsbGNfcGR1X2hlYWRlcl9pbml0KG5za2IsIExMQ19QRFVfVFlQRV9TLCBzYXAtPmxhZGRyLmxzYXAsCisJCQkJICAgIGxsYy0+ZGFkZHIubHNhcCwgTExDX1BEVV9SU1ApOworCQlsbGNfcGR1X2luaXRfYXNfcnJfcnNwKG5za2IsIGxsYy0+YWNrX3BmLCBsbGMtPnZSKTsKKwkJcmMgPSBsbGNfbWFjX2hkcl9pbml0KG5za2IsIGxsYy0+ZGV2LT5kZXZfYWRkciwgbGxjLT5kYWRkci5tYWMpOworCQlpZiAocmMpCisJCQlnb3RvIGZyZWU7CisJCWxsY19jb25uX3NlbmRfcGR1KHNrLCBuc2tiKTsKKwl9CitvdXQ6CisJcmV0dXJuIHJjOworZnJlZToKKwlrZnJlZV9za2IobnNrYik7CisJZ290byBvdXQ7Cit9CisKKy8qKgorICoJbGxjX2Nvbm5fYWNfaW5jX25wdGFfdmFsdWUgLSB0cmllcyB0byBtYWtlIHZhbHVlIG9mIG5wdGEgZ3JlYXRlcgorICoJQHNrOiBjdXJyZW50IGNvbm5lY3Rpb24gc3RydWN0dXJlLgorICoJQHNrYjogY3VycmVudCBldmVudC4KKyAqCisgKglBZnRlciAiaW5jX2NudHIiIHRpbWVzIGNhbGxpbmcgb2YgdGhpcyBhY3Rpb24sICJucHRhIiBpbmNyZWFzZSBieSBvbmUuCisgKgl0aGlzIGFjdGlvbiB0cmllcyB0byBtYWtlIHZhbGUgb2YgIm5wdGEiIGdyZWF0ZXIgYXMgcG9zc2libGU7IG51bWJlciBvZgorICoJYWNrbm93bGVkZ2VtZW50cyBkZWNyZWFzZXMgYnkgaW5jcmVhc2luZyBvZiAibnB0YSIuIFJldHVybnMgMCBmb3IKKyAqCXN1Y2Nlc3MsIDEgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IGxsY19jb25uX2FjX2luY19ucHRhX3ZhbHVlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX3NvY2sgKmxsYyA9IGxsY19zayhzayk7CisKKwlpZiAoIWxsYy0+aW5jX2NudHIpIHsKKwkJbGxjLT5kZWNfc3RlcCA9IDA7CisJCWxsYy0+ZGVjX2NudHIgPSBsbGMtPmluY19jbnRyID0gMjsKKwkJKytsbGMtPm5wdGE7CisJCWlmIChsbGMtPm5wdGEgPiAxMjcpCisJCQlsbGMtPm5wdGEgPSAxMjcgOworCX0gZWxzZQorCQktLWxsYy0+aW5jX2NudHI7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJbGxjX2Nvbm5fYWNfYWRqdXN0X25wdGFfYnlfcnIgLSBkZWNyZWFzZXMgIm5wdGEiIGJ5IG9uZQorICoJQHNrOiBjdXJyZW50IGNvbm5lY3Rpb24gc3RydWN0dXJlLgorICoJQHNrYjogY3VycmVudCBldmVudC4KKyAqCisgKglBZnRlciByZWNlaXZpbmcgImRlY19jbnRyIiB0aW1lcyBSUiBjb21tYW5kLCB0aGlzIGFjdGlvbiBkZWNyZWFzZXMKKyAqCSJucHRhIiBieSBvbmUuIFJldHVybnMgMCBmb3Igc3VjY2VzcywgMSBvdGhlcndpc2UuCisgKi8KK2ludCBsbGNfY29ubl9hY19hZGp1c3RfbnB0YV9ieV9ycihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2soc2spOworCisJaWYgKCFsbGMtPmNvbm5lY3Rfc3RlcCAmJiAhbGxjLT5yZW1vdGVfYnVzeV9mbGFnKSB7CisJCWlmICghbGxjLT5kZWNfc3RlcCkgeworCQkJaWYgKCFsbGMtPmRlY19jbnRyKSB7CisJCQkJbGxjLT5pbmNfY250ciA9IGxsYy0+ZGVjX2NudHIgPSAyOworCQkJCWlmIChsbGMtPm5wdGEgPiAwKQorCQkJCQlsbGMtPm5wdGEgPSBsbGMtPm5wdGEgLSAxOworCQkJfSBlbHNlCisJCQkJbGxjLT5kZWNfY250ciAtPTE7CisJCX0KKwl9IGVsc2UKKwkJbGxjLT5jb25uZWN0X3N0ZXAgPSAwIDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglsbGNfY29ubl9hY19hZGp1c3RfbnB0YV9ieV9ybnIgLSBkZWNyZWFzZXMgIm5wdGEiIGJ5IG9uZQorICoJQHNrOiBjdXJyZW50IGNvbm5lY3Rpb24gc3RydWN0dXJlLgorICoJQHNrYjogY3VycmVudCBldmVudC4KKyAqCisgKglBZnRlciByZWNlaXZpbmcgImRlY19jbnRyIiB0aW1lcyBSTlIgY29tbWFuZCwgdGhpcyBhY3Rpb24gZGVjcmVhc2VzCisgKgkibnB0YSIgYnkgb25lLiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIDEgb3RoZXJ3aXNlLgorICovCitpbnQgbGxjX2Nvbm5fYWNfYWRqdXN0X25wdGFfYnlfcm5yKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX3NvY2sgKmxsYyA9IGxsY19zayhzayk7CisKKwlpZiAobGxjLT5yZW1vdGVfYnVzeV9mbGFnKQorCQlpZiAoIWxsYy0+ZGVjX3N0ZXApIHsKKwkJCWlmICghbGxjLT5kZWNfY250cikgeworCQkJCWxsYy0+aW5jX2NudHIgPSBsbGMtPmRlY19jbnRyID0gMjsKKwkJCQlpZiAobGxjLT5ucHRhID4gMCkKKwkJCQkJLS1sbGMtPm5wdGE7CisJCQl9IGVsc2UKKwkJCQktLWxsYy0+ZGVjX2NudHI7CisJCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglsbGNfY29ubl9hY19kZWNfdHhfd2luX3NpemUgLSBkZWNyZWFzZXMgdHggd2luZG93IHNpemUKKyAqCUBzazogY3VycmVudCBjb25uZWN0aW9uIHN0cnVjdHVyZS4KKyAqCUBza2I6IGN1cnJlbnQgZXZlbnQuCisgKgorICoJQWZ0ZXIgcmVjZWl2aW5nIG9mIGEgUkVKIGNvbW1hbmQgb3IgcmVzcG9uc2UsIHRyYW5zbWl0IHdpbmRvdyBzaXplIGlzCisgKglkZWNyZWFzZWQgYnkgbnVtYmVyIG9mIFBEVXMgd2hpY2ggYXJlIG91dHN0YW5kaW5nIHlldC4gUmV0dXJucyAwIGZvcgorICoJc3VjY2VzcywgMSBvdGhlcndpc2UuCisgKi8KK2ludCBsbGNfY29ubl9hY19kZWNfdHhfd2luX3NpemUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHNrKTsKKwl1OCB1bmFja2VkX3BkdSA9IHNrYl9xdWV1ZV9sZW4oJmxsYy0+cGR1X3VuYWNrX3EpOworCisJbGxjLT5rIC09IHVuYWNrZWRfcGR1OworCWlmIChsbGMtPmsgPCAyKQorCQlsbGMtPmsgPSAyOworCXJldHVybiAwOworfQorCisvKioKKyAqCWxsY19jb25uX2FjX2luY190eF93aW5fc2l6ZSAtIHR4IHdpbmRvdyBzaXplIGlzIGluYyBieSAxCisgKglAc2s6IGN1cnJlbnQgY29ubmVjdGlvbiBzdHJ1Y3R1cmUuCisgKglAc2tiOiBjdXJyZW50IGV2ZW50LgorICoKKyAqCUFmdGVyIHJlY2VpdmluZyBhbiBSUiByZXNwb25zZSB3aXRoIGYtYml0IHNldCB0byBvbmUsIHRyYW5zbWl0IHdpbmRvdworICoJc2l6ZSBpcyBpbmNyZWFzZWQgYnkgb25lLiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIDEgb3RoZXJ3aXNlLgorICovCitpbnQgbGxjX2Nvbm5fYWNfaW5jX3R4X3dpbl9zaXplKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX3NvY2sgKmxsYyA9IGxsY19zayhzayk7CisKKwlsbGMtPmsgKz0gMTsKKwlpZiAobGxjLT5rID4gMTI4KQorCQlsbGMtPmsgPSAxMjggOworCXJldHVybiAwOworfQorCitpbnQgbGxjX2Nvbm5fYWNfc3RvcF9hbGxfdGltZXJzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX3NvY2sgKmxsYyA9IGxsY19zayhzayk7CisKKwlkZWxfdGltZXIoJmxsYy0+cGZfY3ljbGVfdGltZXIudGltZXIpOworCWRlbF90aW1lcigmbGxjLT5hY2tfdGltZXIudGltZXIpOworCWRlbF90aW1lcigmbGxjLT5yZWpfc2VudF90aW1lci50aW1lcik7CisJZGVsX3RpbWVyKCZsbGMtPmJ1c3lfc3RhdGVfdGltZXIudGltZXIpOworCWxsYy0+YWNrX211c3RfYmVfc2VuZCA9IDA7CisJbGxjLT5hY2tfcGYgPSAwOworCXJldHVybiAwOworfQorCitpbnQgbGxjX2Nvbm5fYWNfc3RvcF9vdGhlcl90aW1lcnMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHNrKTsKKworCWRlbF90aW1lcigmbGxjLT5yZWpfc2VudF90aW1lci50aW1lcik7CisJZGVsX3RpbWVyKCZsbGMtPnBmX2N5Y2xlX3RpbWVyLnRpbWVyKTsKKwlkZWxfdGltZXIoJmxsYy0+YnVzeV9zdGF0ZV90aW1lci50aW1lcik7CisJbGxjLT5hY2tfbXVzdF9iZV9zZW5kID0gMDsKKwlsbGMtPmFja19wZiA9IDA7CisJcmV0dXJuIDA7Cit9CisKK2ludCBsbGNfY29ubl9hY19zdGFydF9hY2tfdGltZXIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHNrKTsKKworCW1vZF90aW1lcigmbGxjLT5hY2tfdGltZXIudGltZXIsIGppZmZpZXMgKyBsbGMtPmFja190aW1lci5leHBpcmUgKiBIWik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBsbGNfY29ubl9hY19zdGFydF9yZWpfdGltZXIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHNrKTsKKworCW1vZF90aW1lcigmbGxjLT5yZWpfc2VudF90aW1lci50aW1lciwKKwkJICBqaWZmaWVzICsgbGxjLT5yZWpfc2VudF90aW1lci5leHBpcmUgKiBIWik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBsbGNfY29ubl9hY19zdGFydF9hY2tfdG1yX2lmX25vdF9ydW5uaW5nKHN0cnVjdCBzb2NrICpzaywKKwkJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHNrKTsKKworCWlmICghdGltZXJfcGVuZGluZygmbGxjLT5hY2tfdGltZXIudGltZXIpKQorCQltb2RfdGltZXIoJmxsYy0+YWNrX3RpbWVyLnRpbWVyLAorCQkJICBqaWZmaWVzICsgbGxjLT5hY2tfdGltZXIuZXhwaXJlICogSFopOworCXJldHVybiAwOworfQorCitpbnQgbGxjX2Nvbm5fYWNfc3RvcF9hY2tfdGltZXIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWRlbF90aW1lcigmbGxjX3NrKHNrKS0+YWNrX3RpbWVyLnRpbWVyKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGxsY19jb25uX2FjX3N0b3BfcF90aW1lcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2soc2spOworCisJZGVsX3RpbWVyKCZsbGMtPnBmX2N5Y2xlX3RpbWVyLnRpbWVyKTsKKwlsbGNfY29ubl9zZXRfcF9mbGFnKHNrLCAwKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGxsY19jb25uX2FjX3N0b3BfcmVqX3RpbWVyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlkZWxfdGltZXIoJmxsY19zayhzayktPnJlal9zZW50X3RpbWVyLnRpbWVyKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGFja2VkOworCXUxNiB1bmFja2VkID0gMDsKKwlzdHJ1Y3QgbGxjX3BkdV9zbiAqcGR1ID0gbGxjX3BkdV9zbl9oZHIoc2tiKTsKKwlzdHJ1Y3QgbGxjX3NvY2sgKmxsYyA9IGxsY19zayhzayk7CisKKwlsbGMtPmxhc3RfbnIgPSBQRFVfU1VQVl9HRVRfTnIocGR1KTsKKwlhY2tlZCA9IGxsY19jb25uX3JlbW92ZV9hY2tlZF9wZHVzKHNrLCBsbGMtPmxhc3RfbnIsICZ1bmFja2VkKTsKKwkvKiBPbiBsb29wYmFjayB3ZSBkb24ndCBxdWV1ZSBJIGZyYW1lcyBpbiB1bmFja19wZHVfcSBxdWV1ZS4gKi8KKwlpZiAoYWNrZWQgPiAwIHx8IChsbGMtPmRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spKSB7CisJCWxsYy0+cmV0cnlfY291bnQgPSAwOworCQlkZWxfdGltZXIoJmxsYy0+YWNrX3RpbWVyLnRpbWVyKTsKKwkJaWYgKGxsYy0+ZmFpbGVkX2RhdGFfcmVxKSB7CisJCQkvKiBhbHJlYWR5LCB3ZSBkaWQgbm90IGFjY2VwdCBkYXRhIGZyb20gdXBwZXIgbGF5ZXIKKwkJCSAqICh0eF93aW5kb3cgZnVsbCBvciB1bmFjY2VwdGFibGUgc3RhdGUpLiBOb3csIHdlCisJCQkgKiBjYW4gc2VuZCBkYXRhIGFuZCBtdXN0IGluZm9ybSB0byB1cHBlciBsYXllci4KKwkJCSAqLworCQkJbGxjLT5mYWlsZWRfZGF0YV9yZXEgPSAwOworCQkJbGxjX2Nvbm5fYWNfZGF0YV9jb25maXJtKHNrLCBza2IpOworCQl9CisJCWlmICh1bmFja2VkKQorCQkJbW9kX3RpbWVyKCZsbGMtPmFja190aW1lci50aW1lciwKKwkJCQkgIGppZmZpZXMgKyBsbGMtPmFja190aW1lci5leHBpcmUgKiBIWik7CisJfSBlbHNlIGlmIChsbGMtPmZhaWxlZF9kYXRhX3JlcSkgeworCQl1OCBmX2JpdDsKKworCQlsbGNfcGR1X2RlY29kZV9wZl9iaXQoc2tiLCAmZl9iaXQpOworCQlpZiAoZl9iaXQgPT0gMSkgeworCQkJbGxjLT5mYWlsZWRfZGF0YV9yZXEgPSAwOworCQkJbGxjX2Nvbm5fYWNfZGF0YV9jb25maXJtKHNrLCBza2IpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitpbnQgbGxjX2Nvbm5fYWNfdXBkX3BfZmxhZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisKKwlpZiAoTExDX1BEVV9JU19SU1AocGR1KSkgeworCQl1OCBmX2JpdDsKKworCQlsbGNfcGR1X2RlY29kZV9wZl9iaXQoc2tiLCAmZl9iaXQpOworCQlpZiAoZl9iaXQpIHsKKwkJCWxsY19jb25uX3NldF9wX2ZsYWcoc2ssIDApOworCQkJbGxjX2Nvbm5fYWNfc3RvcF9wX3RpbWVyKHNrLCBza2IpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitpbnQgbGxjX2Nvbm5fYWNfc2V0X2RhdGFfZmxhZ18yKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlsbGNfc2soc2spLT5kYXRhX2ZsYWcgPSAyOworCXJldHVybiAwOworfQorCitpbnQgbGxjX2Nvbm5fYWNfc2V0X2RhdGFfZmxhZ18wKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlsbGNfc2soc2spLT5kYXRhX2ZsYWcgPSAwOworCXJldHVybiAwOworfQorCitpbnQgbGxjX2Nvbm5fYWNfc2V0X2RhdGFfZmxhZ18xKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlsbGNfc2soc2spLT5kYXRhX2ZsYWcgPSAxOworCXJldHVybiAwOworfQorCitpbnQgbGxjX2Nvbm5fYWNfc2V0X2RhdGFfZmxhZ18xX2lmX2RhdGFfZmxhZ19lcV8wKHN0cnVjdCBzb2NrICpzaywKKwkJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAoIWxsY19zayhzayktPmRhdGFfZmxhZykKKwkJbGxjX3NrKHNrKS0+ZGF0YV9mbGFnID0gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IGxsY19jb25uX2FjX3NldF9wX2ZsYWdfMChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJbGxjX2Nvbm5fc2V0X3BfZmxhZyhzaywgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGxjX2Nvbm5fYWNfc2V0X3BfZmxhZ18xKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlsbGNfY29ubl9zZXRfcF9mbGFnKHNrLCAxKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGxsY19jb25uX2FjX3NldF9yZW1vdGVfYnVzeV8wKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlsbGNfc2soc2spLT5yZW1vdGVfYnVzeV9mbGFnID0gMDsKKwlyZXR1cm4gMDsKK30KKworaW50IGxsY19jb25uX2FjX3NldF9jYXVzZV9mbGFnXzAoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWxsY19zayhzayktPmNhdXNlX2ZsYWcgPSAwOworCXJldHVybiAwOworfQorCitpbnQgbGxjX2Nvbm5fYWNfc2V0X2NhdXNlX2ZsYWdfMShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJbGxjX3NrKHNrKS0+Y2F1c2VfZmxhZyA9IDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBsbGNfY29ubl9hY19zZXRfcmV0cnlfY250XzAoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWxsY19zayhzayktPnJldHJ5X2NvdW50ID0gMDsKKwlyZXR1cm4gMDsKK30KKworaW50IGxsY19jb25uX2FjX2luY19yZXRyeV9jbnRfYnlfMShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJbGxjX3NrKHNrKS0+cmV0cnlfY291bnQrKzsKKwlyZXR1cm4gMDsKK30KKworaW50IGxsY19jb25uX2FjX3NldF92cl8wKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlsbGNfc2soc2spLT52UiA9IDA7CisJcmV0dXJuIDA7Cit9CisKK2ludCBsbGNfY29ubl9hY19pbmNfdnJfYnlfMShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJbGxjX3NrKHNrKS0+dlIgPSBQRFVfR0VUX05FWFRfVnIobGxjX3NrKHNrKS0+dlIpOworCXJldHVybiAwOworfQorCitpbnQgbGxjX2Nvbm5fYWNfc2V0X3ZzXzAoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWxsY19zayhzayktPnZTID0gMDsKKwlyZXR1cm4gMDsKK30KKworaW50IGxsY19jb25uX2FjX3NldF92c19ucihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJbGxjX3NrKHNrKS0+dlMgPSBsbGNfc2soc2spLT5sYXN0X25yOworCXJldHVybiAwOworfQorCitpbnQgbGxjX2Nvbm5fYWNfaW5jX3ZzX2J5XzEoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWxsY19zayhzayktPnZTID0gKGxsY19zayhzayktPnZTICsgMSkgJSAxMjg7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbGxjX2Nvbm5fcGZfY3ljbGVfdG1yX2NiKHVuc2lnbmVkIGxvbmcgdGltZW91dF9kYXRhKQoreworCXN0cnVjdCBzb2NrICpzayA9IChzdHJ1Y3Qgc29jayAqKXRpbWVvdXRfZGF0YTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYWxsb2Nfc2tiKDAsIEdGUF9BVE9NSUMpOworCisJYmhfbG9ja19zb2NrKHNrKTsKKwlpZiAoc2tiKSB7CisJCXN0cnVjdCBsbGNfY29ubl9zdGF0ZV9ldiAqZXYgPSBsbGNfY29ubl9ldihza2IpOworCisJCXNrYi0+c2sgID0gc2s7CisJCWV2LT50eXBlID0gTExDX0NPTk5fRVZfVFlQRV9QX1RNUjsKKwkJbGxjX3Byb2Nlc3NfdG1yX2V2KHNrLCBza2IpOworCX0KKwliaF91bmxvY2tfc29jayhzayk7Cit9CisKK3ZvaWQgbGxjX2Nvbm5fYnVzeV90bXJfY2IodW5zaWduZWQgbG9uZyB0aW1lb3V0X2RhdGEpCit7CisJc3RydWN0IHNvY2sgKnNrID0gKHN0cnVjdCBzb2NrICopdGltZW91dF9kYXRhOworCXN0cnVjdCBza19idWZmICpza2IgPSBhbGxvY19za2IoMCwgR0ZQX0FUT01JQyk7CisKKwliaF9sb2NrX3NvY2soc2spOworCWlmIChza2IpIHsKKwkJc3RydWN0IGxsY19jb25uX3N0YXRlX2V2ICpldiA9IGxsY19jb25uX2V2KHNrYik7CisKKwkJc2tiLT5zayAgPSBzazsKKwkJZXYtPnR5cGUgPSBMTENfQ09OTl9FVl9UWVBFX0JVU1lfVE1SOworCQlsbGNfcHJvY2Vzc190bXJfZXYoc2ssIHNrYik7CisJfQorCWJoX3VubG9ja19zb2NrKHNrKTsKK30KKwordm9pZCBsbGNfY29ubl9hY2tfdG1yX2NiKHVuc2lnbmVkIGxvbmcgdGltZW91dF9kYXRhKQoreworCXN0cnVjdCBzb2NrKiBzayA9IChzdHJ1Y3Qgc29jayAqKXRpbWVvdXRfZGF0YTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYWxsb2Nfc2tiKDAsIEdGUF9BVE9NSUMpOworCisJYmhfbG9ja19zb2NrKHNrKTsKKwlpZiAoc2tiKSB7CisJCXN0cnVjdCBsbGNfY29ubl9zdGF0ZV9ldiAqZXYgPSBsbGNfY29ubl9ldihza2IpOworCisJCXNrYi0+c2sgID0gc2s7CisJCWV2LT50eXBlID0gTExDX0NPTk5fRVZfVFlQRV9BQ0tfVE1SOworCQlsbGNfcHJvY2Vzc190bXJfZXYoc2ssIHNrYik7CisJfQorCWJoX3VubG9ja19zb2NrKHNrKTsKK30KKwordm9pZCBsbGNfY29ubl9yZWpfdG1yX2NiKHVuc2lnbmVkIGxvbmcgdGltZW91dF9kYXRhKQoreworCXN0cnVjdCBzb2NrICpzayA9IChzdHJ1Y3Qgc29jayAqKXRpbWVvdXRfZGF0YTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYWxsb2Nfc2tiKDAsIEdGUF9BVE9NSUMpOworCisJYmhfbG9ja19zb2NrKHNrKTsKKwlpZiAoc2tiKSB7CisJCXN0cnVjdCBsbGNfY29ubl9zdGF0ZV9ldiAqZXYgPSBsbGNfY29ubl9ldihza2IpOworCisJCXNrYi0+c2sgID0gc2s7CisJCWV2LT50eXBlID0gTExDX0NPTk5fRVZfVFlQRV9SRUpfVE1SOworCQlsbGNfcHJvY2Vzc190bXJfZXYoc2ssIHNrYik7CisJfQorCWJoX3VubG9ja19zb2NrKHNrKTsKK30KKworaW50IGxsY19jb25uX2FjX3JzdF92cyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJbGxjX3NrKHNrKS0+WCA9IGxsY19zayhzayktPnZTOworCWxsY19jb25uX2FjX3NldF92c19ucihzaywgc2tiKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGxsY19jb25uX2FjX3VwZF92cyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisJdTggbnIgPSBQRFVfU1VQVl9HRVRfTnIocGR1KTsKKworCWlmIChsbGNfY2lyY3VsYXJfYmV0d2VlbihsbGNfc2soc2spLT52UywgbnIsIGxsY19zayhzayktPlgpKQorCQlsbGNfY29ubl9hY19zZXRfdnNfbnIoc2ssIHNrYik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBOb24tc3RhbmRhcmQgYWN0aW9uczsgdGhlc2Ugbm90IGNvbnRhaW5lZCBpbiBJRUVFIHNwZWNpZmljYXRpb247IGZvcgorICogb3VyIG93biB1c2FnZQorICovCisvKioKKyAqCWxsY19jb25uX2Rpc2MgLSByZW1vdmVzIGNvbm5lY3Rpb24gZnJvbSBTQVAgbGlzdCBhbmQgZnJlZXMgaXQKKyAqCUBzazogY2xvc2VkIGNvbm5lY3Rpb24KKyAqCUBza2I6IG9jY3VycmVkIGV2ZW50CisgKi8KK2ludCBsbGNfY29ubl9kaXNjKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKiBGSVhNRTogdGhpcyB0aGluZyBzZWVtcyB0byB3YW50IHRvIGRpZSAqLworCXJldHVybiAwOworfQorCisvKioKKyAqCWxsY19jb25uX3Jlc2V0IC0gcmVzZXRzIGNvbm5lY3Rpb24KKyAqCUBzayA6IHJlc2V0aW5nIGNvbm5lY3Rpb24uCisgKglAc2tiOiBvY2N1cnJlZCBldmVudC4KKyAqCisgKglTdG9wIGFsbCB0aW1lcnMsIGVtcHR5IGFsbCBxdWV1ZXMgYW5kIHJlc2V0IGFsbCBmbGFncy4KKyAqLworaW50IGxsY19jb25uX3Jlc2V0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlsbGNfc2tfcmVzZXQoc2spOworCXJldHVybiAwOworfQorCisvKioKKyAqCWxsY19jaXJjdWxhcl9iZXR3ZWVuIC0gZGVzaWduYXRlcyB0aGF0IGIgaXMgYmV0d2VlbiBhIGFuZCBjIG9yIG5vdAorICoJQGE6IGxvd2VyIGJvdW5kCisgKglAYjogZWxlbWVudCB0byBzZWUgaWYgaXMgYmV0d2VlbiBhIGFuZCBiCisgKglAYzogdXBwZXIgYm91bmQKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGRlc2lnbmF0ZXMgdGhhdCBiIGlzIGJldHdlZW4gYSBhbmQgYyBvciBub3QgKGZvciBleGFtcGxlLAorICoJMCBpcyBiZXR3ZWVuIDEyNyBhbmQgMSkuIFJldHVybnMgMSBpZiBiIGlzIGJldHdlZW4gYSBhbmQgYywgMAorICoJb3RoZXJ3aXNlLgorICovCit1OCBsbGNfY2lyY3VsYXJfYmV0d2Vlbih1OCBhLCB1OCBiLCB1OCBjKQoreworCWIgPSBiIC0gYTsKKwljID0gYyAtIGE7CisJcmV0dXJuIGIgPD0gYzsKK30KKworLyoqCisgKglsbGNfcHJvY2Vzc190bXJfZXYgLSB0aW1lciBiYWNrZW5kCisgKglAc2s6IGFjdGl2ZSBjb25uZWN0aW9uCisgKglAc2tiOiBvY2N1cnJlZCBldmVudAorICoKKyAqCVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGltZXIgY2FsbGJhY2sgZnVuY3Rpb25zLiBXaGVuIGNvbm5lY3Rpb24KKyAqCWlzIGJ1c3kgKGR1cmluZyBzZW5kaW5nIGEgZGF0YSBmcmFtZSkgdGltZXIgZXhwaXJhdGlvbiBldmVudCBtdXN0IGJlCisgKglxdWV1ZWQuIE90aGVyd2lzZSB0aGlzIGV2ZW50IGNhbiBiZSBzZW50IHRvIGNvbm5lY3Rpb24gc3RhdGUgbWFjaGluZS4KKyAqCVF1ZXVlZCBldmVudHMgd2lsbCBwcm9jZXNzIGJ5IGxsY19iYWNrbG9nX3JjdiBmdW5jdGlvbiBhZnRlciBzZW5kaW5nCisgKglkYXRhIGZyYW1lLgorICovCitzdGF0aWMgdm9pZCBsbGNfcHJvY2Vzc190bXJfZXYoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmIChsbGNfc2soc2spLT5zdGF0ZSA9PSBMTENfQ09OTl9PVVRfT0ZfU1ZDKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0aW1lciBjYWxsZWQgb24gY2xvc2VkIGNvbm5lY3Rpb25cbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQlrZnJlZV9za2Ioc2tiKTsKKwl9IGVsc2UgeworCQlpZiAoIXNvY2tfb3duZWRfYnlfdXNlcihzaykpCisJCQlsbGNfY29ubl9zdGF0ZV9wcm9jZXNzKHNrLCBza2IpOworCQllbHNlIHsKKwkJCWxsY19zZXRfYmFja2xvZ190eXBlKHNrYiwgTExDX0VWRU5UKTsKKwkJCXNrX2FkZF9iYWNrbG9nKHNrLCBza2IpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvbmV0L2xsYy9sbGNfY19ldi5jIGIvbmV0L2xsYy9sbGNfY19ldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMTMwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbGxjL2xsY19jX2V2LmMKQEAgLTAsMCArMSw3NjkgQEAKKy8qCisgKiBsbGNfY19ldi5jIC0gQ29ubmVjdGlvbiBjb21wb25lbnQgc3RhdGUgdHJhbnNpdGlvbiBldmVudCBxdWFsaWZpZXJzCisgKgorICogQSAnc3RhdGUnIGNvbnNpc3RzIG9mIGEgbnVtYmVyIG9mIHBvc3NpYmxlIGV2ZW50IG1hdGNoaW5nIGZ1bmN0aW9ucywKKyAqIHRoZSBhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGJlaW5nIGV4ZWN1dGVkIHdoZW4gdGhhdCBldmVudCBpcworICogbWF0Y2hlZDsgYSAnc3RhdGUgbWFjaGluZScgYWNjZXB0cyBldmVudHMgaW4gYSBzZXJpYWwgZmFzaGlvbiBmcm9tIGFuCisgKiBldmVudCBxdWV1ZS4gRWFjaCBldmVudCBpcyBwYXNzZWQgdG8gZWFjaCBzdWNjZXNzaXZlIGV2ZW50IG1hdGNoaW5nCisgKiBmdW5jdGlvbiB1bnRpbCBhIG1hdGNoIGlzIG1hZGUgKHRoZSBldmVudCBtYXRjaGluZyBmdW5jdGlvbiByZXR1cm5zCisgKiBzdWNjZXNzLCBvciAnMCcpIG9yIHRoZSBsaXN0IG9mIGV2ZW50IG1hdGNoaW5nIGZ1bmN0aW9ucyBpcyBleGhhdXN0ZWQuCisgKiBJZiBhIG1hdGNoIGlzIG1hZGUsIHRoZSBhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQgYXJlIGV4ZWN1dGVkCisgKiBhbmQgdGhlIHN0YXRlIGlzIGNoYW5nZWQgdG8gdGhhdCBldmVudCdzIHRyYW5zaXRpb24gc3RhdGUuIEJlZm9yZSBzb21lCisgKiBldmVudHMgYXJlIHJlY29nbml6ZWQsIGV2ZW4gYWZ0ZXIgYSBtYXRjaCBoYXMgYmVlbiBtYWRlLCBhIGNlcnRhaW4KKyAqIG51bWJlciBvZiAnZXZlbnQgcXVhbGlmaWVyJyBmdW5jdGlvbnMgbXVzdCBhbHNvIGJlIGV4ZWN1dGVkLiBJZiB0aGVzZQorICogYWxsIGV4ZWN1dGUgc3VjY2Vzc2Z1bGx5LCB0aGVuIHRoZSBldmVudCBpcyBmaW5hbGx5IGV4ZWN1dGVkLgorICoKKyAqIFRoZXNlIGV2ZW50IGZ1bmN0aW9ucyBtdXN0IHJldHVybiAwIGZvciBzdWNjZXNzLCB0byBzaG93IGEgbWF0Y2hlZAorICogZXZlbnQsIG9mIDEgaWYgdGhlIGV2ZW50IGRvZXMgbm90IG1hdGNoLiBFdmVudCBxdWFsaWZpZXIgZnVuY3Rpb25zCisgKiBtdXN0IHJldHVybiBhIDAgZm9yIHN1Y2Nlc3Mgb3IgYSBub24temVybyBmb3IgZmFpbHVyZS4gRWFjaCBmdW5jdGlvbgorICogaXMgc2ltcGx5IHJlc3BvbnNpYmxlIGZvciB2ZXJpZnlpbmcgb25lIHNpbmdsZSB0aGluZyBhbmQgcmV0dXJuaW5nCisgKiBlaXRoZXIgYSBzdWNjZXNzIG9yIGZhaWx1cmUuCisgKgorICogQWxsIG9mIGZvbGxvd2VkIGV2ZW50IGZ1bmN0aW9ucyBhcmUgZGVzY3JpYmVkIGluIDgwMi4yIExMQyBQcm90b2NvbAorICogc3RhbmRhcmQgZG9jdW1lbnQgZXhjZXB0IHR3byBmdW5jdGlvbnMgdGhhdCB3ZSBhZGRlZCB0aGF0IHdpbGwgZXhwbGFpbgorICogaW4gdGhlaXIgY29tbWVudHMsIGF0IGJlbG93LgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NyBieSBQcm9jb20gVGVjaG5vbG9neSwgSW5jLgorICogCQkgMjAwMS0yMDAzIGJ5IEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBjYW4gYmUgcmVkaXN0cmlidXRlZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSBvciBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuCisgKgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L2xsY19jb25uLmg+CisjaW5jbHVkZSA8bmV0L2xsY19zYXAuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9sbGNfY19ldi5oPgorI2luY2x1ZGUgPG5ldC9sbGNfcGR1Lmg+CisKKyNpZiAxCisjZGVmaW5lIGRwcmludGsoYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgYXJncykKKyNlbHNlCisjZGVmaW5lIGRwcmludGsoYXJncy4uLikKKyNlbmRpZgorCitleHRlcm4gdTE2IGxsY19jaXJjdWxhcl9iZXR3ZWVuKHU4IGEsIHU4IGIsIHU4IGMpOworCisvKioKKyAqCWxsY191dGlsX25zX2luc2lkZV9yeF93aW5kb3cgLSBjaGVjayBpZiBzZXF1ZW5jZSBudW1iZXIgaXMgaW4gcnggd2luZG93CisgKglAbnM6IHNlcXVlbmNlIG51bWJlciBvZiByZWNlaXZlZCBwZHUuCisgKglAdnI6IHNlcXVlbmNlIG51bWJlciB3aGljaCByZWNlaXZlciBleHBlY3RzIHRvIHJlY2VpdmUuCisgKglAcnc6IHJlY2VpdmUgd2luZG93IHNpemUgb2YgcmVjZWl2ZXIuCisgKgorICoJQ2hlY2tzIGlmIHNlcXVlbmNlIG51bWJlciBvZiByZWNlaXZlZCBQRFUgaXMgaW4gcmFuZ2Ugb2YgcmVjZWl2ZQorICoJd2luZG93LiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIDEgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyB1MTYgbGxjX3V0aWxfbnNfaW5zaWRlX3J4X3dpbmRvdyh1OCBucywgdTggdnIsIHU4IHJ3KQoreworCXJldHVybiAhbGxjX2NpcmN1bGFyX2JldHdlZW4odnIsIG5zLAorCQkJCSAgICAgKHZyICsgcncgLSAxKSAlIExMQ18yX1NFUV9OQlJfTU9EVUxPKTsKK30KKworLyoqCisgKglsbGNfdXRpbF9ucl9pbnNpZGVfdHhfd2luZG93IC0gY2hlY2sgaWYgc2VxdWVuY2UgbnVtYmVyIGlzIGluIHR4IHdpbmRvdworICoJQHNrOiBjdXJyZW50IGNvbm5lY3Rpb24uCisgKglAbnI6IE4oUikgb2YgcmVjZWl2ZWQgUERVLgorICoKKyAqCVRoaXMgcm91dGluZSBjaGVja3MgaWYgTihSKSBvZiByZWNlaXZlZCBQRFUgaXMgaW4gcmFuZ2Ugb2YgdHJhbnNtaXQKKyAqCXdpbmRvdzsgb24gdGhlIG90aGVyIGhhbmQgY2hlY2tzIGlmIHJlY2VpdmVkIFBEVSBhY2tub3dsZWRnZXMgc29tZQorICoJb3V0c3RhbmRpbmcgUERVcyB0aGF0IGFyZSBpbiB0cmFuc21pdCB3aW5kb3cuIFJldHVybnMgMCBmb3Igc3VjY2VzcywgMQorICoJb3RoZXJ3aXNlLgorICovCitzdGF0aWMgdTE2IGxsY191dGlsX25yX2luc2lkZV90eF93aW5kb3coc3RydWN0IHNvY2sgKnNrLCB1OCBucikKK3sKKwl1OCBucjEsIG5yMjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBsbGNfcGR1X3NuICpwZHU7CisJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2soc2spOworCWludCByYyA9IDA7CisKKwlpZiAobGxjLT5kZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLKQorCQlnb3RvIG91dDsKKwlyYyA9IDE7CisJaWYgKCFza2JfcXVldWVfbGVuKCZsbGMtPnBkdV91bmFja19xKSkKKwkJZ290byBvdXQ7CisJc2tiID0gc2tiX3BlZWsoJmxsYy0+cGR1X3VuYWNrX3EpOworCXBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisJbnIxID0gTExDX0lfR0VUX05TKHBkdSk7CisJc2tiID0gc2tiX3BlZWtfdGFpbCgmbGxjLT5wZHVfdW5hY2tfcSk7CisJcGR1ID0gbGxjX3BkdV9zbl9oZHIoc2tiKTsKKwlucjIgPSBMTENfSV9HRVRfTlMocGR1KTsKKwlyYyA9ICFsbGNfY2lyY3VsYXJfYmV0d2VlbihucjEsIG5yLCAobnIyICsgMSkgJSBMTENfMl9TRVFfTkJSX01PRFVMTyk7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCitpbnQgbGxjX2Nvbm5fZXZfY29ubl9yZXEoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfY29ubl9zdGF0ZV9ldiAqZXYgPSBsbGNfY29ubl9ldihza2IpOworCisJcmV0dXJuIGV2LT5wcmltID09IExMQ19DT05OX1BSSU0gJiYKKwkgICAgICAgZXYtPnByaW1fdHlwZSA9PSBMTENfUFJJTV9UWVBFX1JFUSA/IDAgOiAxOworfQorCitpbnQgbGxjX2Nvbm5fZXZfZGF0YV9yZXEoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfY29ubl9zdGF0ZV9ldiAqZXYgPSBsbGNfY29ubl9ldihza2IpOworCisJcmV0dXJuIGV2LT5wcmltID09IExMQ19EQVRBX1BSSU0gJiYKKwkgICAgICAgZXYtPnByaW1fdHlwZSA9PSBMTENfUFJJTV9UWVBFX1JFUSA/IDAgOiAxOworfQorCitpbnQgbGxjX2Nvbm5fZXZfZGlzY19yZXEoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfY29ubl9zdGF0ZV9ldiAqZXYgPSBsbGNfY29ubl9ldihza2IpOworCisJcmV0dXJuIGV2LT5wcmltID09IExMQ19ESVNDX1BSSU0gJiYKKwkgICAgICAgZXYtPnByaW1fdHlwZSA9PSBMTENfUFJJTV9UWVBFX1JFUSA/IDAgOiAxOworfQorCitpbnQgbGxjX2Nvbm5fZXZfcnN0X3JlcShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19jb25uX3N0YXRlX2V2ICpldiA9IGxsY19jb25uX2V2KHNrYik7CisKKwlyZXR1cm4gZXYtPnByaW0gPT0gTExDX1JFU0VUX1BSSU0gJiYKKwkgICAgICAgZXYtPnByaW1fdHlwZSA9PSBMTENfUFJJTV9UWVBFX1JFUSA/IDAgOiAxOworfQorCitpbnQgbGxjX2Nvbm5fZXZfbG9jYWxfYnVzeV9kZXRlY3RlZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19jb25uX3N0YXRlX2V2ICpldiA9IGxsY19jb25uX2V2KHNrYik7CisKKwlyZXR1cm4gZXYtPnR5cGUgPT0gTExDX0NPTk5fRVZfVFlQRV9TSU1QTEUgJiYKKwkgICAgICAgZXYtPnByaW1fdHlwZSA9PSBMTENfQ09OTl9FVl9MT0NBTF9CVVNZX0RFVEVDVEVEID8gMCA6IDE7Cit9CisKK2ludCBsbGNfY29ubl9ldl9sb2NhbF9idXN5X2NsZWFyZWQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfY29ubl9zdGF0ZV9ldiAqZXYgPSBsbGNfY29ubl9ldihza2IpOworCisJcmV0dXJuIGV2LT50eXBlID09IExMQ19DT05OX0VWX1RZUEVfU0lNUExFICYmCisJICAgICAgIGV2LT5wcmltX3R5cGUgPT0gTExDX0NPTk5fRVZfTE9DQUxfQlVTWV9DTEVBUkVEID8gMCA6IDE7Cit9CisKK2ludCBsbGNfY29ubl9ldl9yeF9iYWRfcGR1KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gMTsKK30KKworaW50IGxsY19jb25uX2V2X3J4X2Rpc2NfY21kX3BiaXRfc2V0X3goc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfcGR1X3VuICpwZHUgPSBsbGNfcGR1X3VuX2hkcihza2IpOworCisJcmV0dXJuIExMQ19QRFVfSVNfQ01EKHBkdSkgJiYgTExDX1BEVV9UWVBFX0lTX1UocGR1KSAmJgorCSAgICAgICBMTENfVV9QRFVfQ01EKHBkdSkgPT0gTExDXzJfUERVX0NNRF9ESVNDID8gMCA6IDE7Cit9CisKK2ludCBsbGNfY29ubl9ldl9yeF9kbV9yc3BfZmJpdF9zZXRfeChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19wZHVfdW4gKnBkdSA9IGxsY19wZHVfdW5faGRyKHNrYik7CisKKwlyZXR1cm4gTExDX1BEVV9JU19SU1AocGR1KSAmJiBMTENfUERVX1RZUEVfSVNfVShwZHUpICYmCisJICAgICAgIExMQ19VX1BEVV9SU1AocGR1KSA9PSBMTENfMl9QRFVfUlNQX0RNID8gMCA6IDE7Cit9CisKK2ludCBsbGNfY29ubl9ldl9yeF9mcm1yX3JzcF9mYml0X3NldF94KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX3BkdV91biAqcGR1ID0gbGxjX3BkdV91bl9oZHIoc2tiKTsKKworCXJldHVybiBMTENfUERVX0lTX1JTUChwZHUpICYmIExMQ19QRFVfVFlQRV9JU19VKHBkdSkgJiYKKwkgICAgICAgTExDX1VfUERVX1JTUChwZHUpID09IExMQ18yX1BEVV9SU1BfRlJNUiA/IDAgOiAxOworfQorCitpbnQgbGxjX2Nvbm5fZXZfcnhfaV9jbWRfcGJpdF9zZXRfMChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisKKwlyZXR1cm4gbGxjX2Nvbm5fc3BhY2Uoc2ssIHNrYikgJiYKKwkgICAgICAgTExDX1BEVV9JU19DTUQocGR1KSAmJiBMTENfUERVX1RZUEVfSVNfSShwZHUpICYmCisJICAgICAgIExMQ19JX1BGX0lTXzAocGR1KSAmJgorCSAgICAgICBMTENfSV9HRVRfTlMocGR1KSA9PSBsbGNfc2soc2spLT52UiA/IDAgOiAxOworfQorCitpbnQgbGxjX2Nvbm5fZXZfcnhfaV9jbWRfcGJpdF9zZXRfMShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisKKwlyZXR1cm4gbGxjX2Nvbm5fc3BhY2Uoc2ssIHNrYikgJiYKKwkgICAgICAgTExDX1BEVV9JU19DTUQocGR1KSAmJiBMTENfUERVX1RZUEVfSVNfSShwZHUpICYmCisJICAgICAgIExMQ19JX1BGX0lTXzEocGR1KSAmJgorCSAgICAgICBMTENfSV9HRVRfTlMocGR1KSA9PSBsbGNfc2soc2spLT52UiA/IDAgOiAxOworfQorCitpbnQgbGxjX2Nvbm5fZXZfcnhfaV9jbWRfcGJpdF9zZXRfMF91bmV4cGRfbnMoc3RydWN0IHNvY2sgKnNrLAorCQkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfcGR1X3NuICpwZHUgPSBsbGNfcGR1X3NuX2hkcihza2IpOworCXU4IHZyID0gbGxjX3NrKHNrKS0+dlI7CisJdTggbnMgPSBMTENfSV9HRVRfTlMocGR1KTsKKworCXJldHVybiBMTENfUERVX0lTX0NNRChwZHUpICYmIExMQ19QRFVfVFlQRV9JU19JKHBkdSkgJiYKKwkgICAgICAgTExDX0lfUEZfSVNfMChwZHUpICYmIG5zICE9IHZyICYmCisJICAgICAgICFsbGNfdXRpbF9uc19pbnNpZGVfcnhfd2luZG93KG5zLCB2ciwgbGxjX3NrKHNrKS0+cncpID8gMCA6IDE7Cit9CisKK2ludCBsbGNfY29ubl9ldl9yeF9pX2NtZF9wYml0X3NldF8xX3VuZXhwZF9ucyhzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisJdTggdnIgPSBsbGNfc2soc2spLT52UjsKKwl1OCBucyA9IExMQ19JX0dFVF9OUyhwZHUpOworCisJcmV0dXJuIExMQ19QRFVfSVNfQ01EKHBkdSkgJiYgTExDX1BEVV9UWVBFX0lTX0kocGR1KSAmJgorCSAgICAgICBMTENfSV9QRl9JU18xKHBkdSkgJiYgbnMgIT0gdnIgJiYKKwkgICAgICAgIWxsY191dGlsX25zX2luc2lkZV9yeF93aW5kb3cobnMsIHZyLCBsbGNfc2soc2spLT5ydykgPyAwIDogMTsKK30KKworaW50IGxsY19jb25uX2V2X3J4X2lfY21kX3BiaXRfc2V0X3hfaW52YWxfbnMoc3RydWN0IHNvY2sgKnNrLAorCQkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19wZHVfc24gKiBwZHUgPSBsbGNfcGR1X3NuX2hkcihza2IpOworCXU4IHZyID0gbGxjX3NrKHNrKS0+dlI7CisJdTggbnMgPSBMTENfSV9HRVRfTlMocGR1KTsKKwl1MTYgcmMgPSBMTENfUERVX0lTX0NNRChwZHUpICYmIExMQ19QRFVfVFlQRV9JU19JKHBkdSkgJiYgbnMgIT0gdnIgJiYKKwkJIGxsY191dGlsX25zX2luc2lkZV9yeF93aW5kb3cobnMsIHZyLCBsbGNfc2soc2spLT5ydykgPyAwIDogMTsKKwlpZiAoIXJjKQorCQlkcHJpbnRrKCIlczogbWF0Y2hlZCwgc3RhdGU9JWQsIG5zPSVkLCB2cj0lZFxuIiwKKwkJCV9fRlVOQ1RJT05fXywgbGxjX3NrKHNrKS0+c3RhdGUsIG5zLCB2cik7CisJcmV0dXJuIHJjOworfQorCitpbnQgbGxjX2Nvbm5fZXZfcnhfaV9yc3BfZmJpdF9zZXRfMChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisKKwlyZXR1cm4gbGxjX2Nvbm5fc3BhY2Uoc2ssIHNrYikgJiYKKwkgICAgICAgTExDX1BEVV9JU19SU1AocGR1KSAmJiBMTENfUERVX1RZUEVfSVNfSShwZHUpICYmCisJICAgICAgIExMQ19JX1BGX0lTXzAocGR1KSAmJgorCSAgICAgICBMTENfSV9HRVRfTlMocGR1KSA9PSBsbGNfc2soc2spLT52UiA/IDAgOiAxOworfQorCitpbnQgbGxjX2Nvbm5fZXZfcnhfaV9yc3BfZmJpdF9zZXRfMShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisKKwlyZXR1cm4gTExDX1BEVV9JU19SU1AocGR1KSAmJiBMTENfUERVX1RZUEVfSVNfSShwZHUpICYmCisJICAgICAgIExMQ19JX1BGX0lTXzEocGR1KSAmJgorCSAgICAgICBMTENfSV9HRVRfTlMocGR1KSA9PSBsbGNfc2soc2spLT52UiA/IDAgOiAxOworfQorCitpbnQgbGxjX2Nvbm5fZXZfcnhfaV9yc3BfZmJpdF9zZXRfeChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisKKwlyZXR1cm4gbGxjX2Nvbm5fc3BhY2Uoc2ssIHNrYikgJiYKKwkgICAgICAgTExDX1BEVV9JU19SU1AocGR1KSAmJiBMTENfUERVX1RZUEVfSVNfSShwZHUpICYmCisJICAgICAgIExMQ19JX0dFVF9OUyhwZHUpID09IGxsY19zayhzayktPnZSID8gMCA6IDE7Cit9CisKK2ludCBsbGNfY29ubl9ldl9yeF9pX3JzcF9mYml0X3NldF8wX3VuZXhwZF9ucyhzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisJdTggdnIgPSBsbGNfc2soc2spLT52UjsKKwl1OCBucyA9IExMQ19JX0dFVF9OUyhwZHUpOworCisJcmV0dXJuIExMQ19QRFVfSVNfUlNQKHBkdSkgJiYgTExDX1BEVV9UWVBFX0lTX0kocGR1KSAmJgorCSAgICAgICBMTENfSV9QRl9JU18wKHBkdSkgJiYgbnMgIT0gdnIgJiYKKwkgICAgICAgIWxsY191dGlsX25zX2luc2lkZV9yeF93aW5kb3cobnMsIHZyLCBsbGNfc2soc2spLT5ydykgPyAwIDogMTsKK30KKworaW50IGxsY19jb25uX2V2X3J4X2lfcnNwX2ZiaXRfc2V0XzFfdW5leHBkX25zKHN0cnVjdCBzb2NrICpzaywKKwkJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX3BkdV9zbiAqcGR1ID0gbGxjX3BkdV9zbl9oZHIoc2tiKTsKKwl1OCB2ciA9IGxsY19zayhzayktPnZSOworCXU4IG5zID0gTExDX0lfR0VUX05TKHBkdSk7CisKKwlyZXR1cm4gTExDX1BEVV9JU19SU1AocGR1KSAmJiBMTENfUERVX1RZUEVfSVNfSShwZHUpICYmCisJICAgICAgIExMQ19JX1BGX0lTXzEocGR1KSAmJiBucyAhPSB2ciAmJgorCSAgICAgICAhbGxjX3V0aWxfbnNfaW5zaWRlX3J4X3dpbmRvdyhucywgdnIsIGxsY19zayhzayktPnJ3KSA/IDAgOiAxOworfQorCitpbnQgbGxjX2Nvbm5fZXZfcnhfaV9yc3BfZmJpdF9zZXRfeF91bmV4cGRfbnMoc3RydWN0IHNvY2sgKnNrLAorCQkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfcGR1X3NuICpwZHUgPSBsbGNfcGR1X3NuX2hkcihza2IpOworCXU4IHZyID0gbGxjX3NrKHNrKS0+dlI7CisJdTggbnMgPSBMTENfSV9HRVRfTlMocGR1KTsKKworCXJldHVybiBMTENfUERVX0lTX1JTUChwZHUpICYmIExMQ19QRFVfVFlQRV9JU19JKHBkdSkgJiYgbnMgIT0gdnIgJiYKKwkgICAgICAgIWxsY191dGlsX25zX2luc2lkZV9yeF93aW5kb3cobnMsIHZyLCBsbGNfc2soc2spLT5ydykgPyAwIDogMTsKK30KKworaW50IGxsY19jb25uX2V2X3J4X2lfcnNwX2ZiaXRfc2V0X3hfaW52YWxfbnMoc3RydWN0IHNvY2sgKnNrLAorCQkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisJdTggdnIgPSBsbGNfc2soc2spLT52UjsKKwl1OCBucyA9IExMQ19JX0dFVF9OUyhwZHUpOworCXUxNiByYyA9IExMQ19QRFVfSVNfUlNQKHBkdSkgJiYgTExDX1BEVV9UWVBFX0lTX0kocGR1KSAmJiBucyAhPSB2ciAmJgorCQkgbGxjX3V0aWxfbnNfaW5zaWRlX3J4X3dpbmRvdyhucywgdnIsIGxsY19zayhzayktPnJ3KSA/IDAgOiAxOworCWlmICghcmMpCisJCWRwcmludGsoIiVzOiBtYXRjaGVkLCBzdGF0ZT0lZCwgbnM9JWQsIHZyPSVkXG4iLAorCQkJX19GVU5DVElPTl9fLCBsbGNfc2soc2spLT5zdGF0ZSwgbnMsIHZyKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBsbGNfY29ubl9ldl9yeF9yZWpfY21kX3BiaXRfc2V0XzAoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfcGR1X3NuICpwZHUgPSBsbGNfcGR1X3NuX2hkcihza2IpOworCisJcmV0dXJuIExMQ19QRFVfSVNfQ01EKHBkdSkgJiYgTExDX1BEVV9UWVBFX0lTX1MocGR1KSAmJgorCSAgICAgICBMTENfU19QRl9JU18wKHBkdSkgJiYKKwkgICAgICAgTExDX1NfUERVX0NNRChwZHUpID09IExMQ18yX1BEVV9DTURfUkVKID8gMCA6IDE7Cit9CisKK2ludCBsbGNfY29ubl9ldl9yeF9yZWpfY21kX3BiaXRfc2V0XzEoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfcGR1X3NuICpwZHUgPSBsbGNfcGR1X3NuX2hkcihza2IpOworCisJcmV0dXJuIExMQ19QRFVfSVNfQ01EKHBkdSkgJiYgTExDX1BEVV9UWVBFX0lTX1MocGR1KSAmJgorCSAgICAgICBMTENfU19QRl9JU18xKHBkdSkgJiYKKwkgICAgICAgTExDX1NfUERVX0NNRChwZHUpID09IExMQ18yX1BEVV9DTURfUkVKID8gMCA6IDE7Cit9CisKK2ludCBsbGNfY29ubl9ldl9yeF9yZWpfcnNwX2ZiaXRfc2V0XzAoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfcGR1X3NuICpwZHUgPSBsbGNfcGR1X3NuX2hkcihza2IpOworCisJcmV0dXJuIExMQ19QRFVfSVNfUlNQKHBkdSkgJiYgTExDX1BEVV9UWVBFX0lTX1MocGR1KSAmJgorCSAgICAgICBMTENfU19QRl9JU18wKHBkdSkgJiYKKwkgICAgICAgTExDX1NfUERVX1JTUChwZHUpID09IExMQ18yX1BEVV9SU1BfUkVKID8gMCA6IDE7Cit9CisKK2ludCBsbGNfY29ubl9ldl9yeF9yZWpfcnNwX2ZiaXRfc2V0XzEoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfcGR1X3NuICpwZHUgPSBsbGNfcGR1X3NuX2hkcihza2IpOworCisJcmV0dXJuIExMQ19QRFVfSVNfUlNQKHBkdSkgJiYgTExDX1BEVV9UWVBFX0lTX1MocGR1KSAmJgorCSAgICAgICBMTENfU19QRl9JU18xKHBkdSkgJiYKKwkgICAgICAgTExDX1NfUERVX1JTUChwZHUpID09IExMQ18yX1BEVV9SU1BfUkVKID8gMCA6IDE7Cit9CisKK2ludCBsbGNfY29ubl9ldl9yeF9yZWpfcnNwX2ZiaXRfc2V0X3goc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfcGR1X3VuICpwZHUgPSBsbGNfcGR1X3VuX2hkcihza2IpOworCisJcmV0dXJuIExMQ19QRFVfSVNfUlNQKHBkdSkgJiYgTExDX1BEVV9UWVBFX0lTX1MocGR1KSAmJgorCSAgICAgICBMTENfU19QRFVfUlNQKHBkdSkgPT0gTExDXzJfUERVX1JTUF9SRUogPyAwIDogMTsKK30KKworaW50IGxsY19jb25uX2V2X3J4X3Jucl9jbWRfcGJpdF9zZXRfMChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisKKwlyZXR1cm4gTExDX1BEVV9JU19DTUQocGR1KSAmJiBMTENfUERVX1RZUEVfSVNfUyhwZHUpICYmCisJICAgICAgIExMQ19TX1BGX0lTXzAocGR1KSAmJgorCSAgICAgICBMTENfU19QRFVfQ01EKHBkdSkgPT0gTExDXzJfUERVX0NNRF9STlIgPyAwIDogMTsKK30KKworaW50IGxsY19jb25uX2V2X3J4X3Jucl9jbWRfcGJpdF9zZXRfMShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisKKwlyZXR1cm4gTExDX1BEVV9JU19DTUQocGR1KSAmJiBMTENfUERVX1RZUEVfSVNfUyhwZHUpICYmCisJICAgICAgIExMQ19TX1BGX0lTXzEocGR1KSAmJgorCSAgICAgICBMTENfU19QRFVfQ01EKHBkdSkgPT0gTExDXzJfUERVX0NNRF9STlIgPyAwIDogMTsKK30KKworaW50IGxsY19jb25uX2V2X3J4X3Jucl9yc3BfZmJpdF9zZXRfMChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisKKwlyZXR1cm4gTExDX1BEVV9JU19SU1AocGR1KSAmJiBMTENfUERVX1RZUEVfSVNfUyhwZHUpICYmCisJICAgICAgIExMQ19TX1BGX0lTXzAocGR1KSAmJgorCSAgICAgICBMTENfU19QRFVfUlNQKHBkdSkgPT0gTExDXzJfUERVX1JTUF9STlIgPyAwIDogMTsKK30KKworaW50IGxsY19jb25uX2V2X3J4X3Jucl9yc3BfZmJpdF9zZXRfMShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisKKwlyZXR1cm4gTExDX1BEVV9JU19SU1AocGR1KSAmJiBMTENfUERVX1RZUEVfSVNfUyhwZHUpICYmCisJICAgICAgIExMQ19TX1BGX0lTXzEocGR1KSAmJgorCSAgICAgICBMTENfU19QRFVfUlNQKHBkdSkgPT0gTExDXzJfUERVX1JTUF9STlIgPyAwIDogMTsKK30KKworaW50IGxsY19jb25uX2V2X3J4X3JyX2NtZF9wYml0X3NldF8wKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX3BkdV9zbiAqcGR1ID0gbGxjX3BkdV9zbl9oZHIoc2tiKTsKKworCXJldHVybiBMTENfUERVX0lTX0NNRChwZHUpICYmIExMQ19QRFVfVFlQRV9JU19TKHBkdSkgJiYKKwkgICAgICAgTExDX1NfUEZfSVNfMChwZHUpICYmCisJICAgICAgIExMQ19TX1BEVV9DTUQocGR1KSA9PSBMTENfMl9QRFVfQ01EX1JSID8gMCA6IDE7Cit9CisKK2ludCBsbGNfY29ubl9ldl9yeF9ycl9jbWRfcGJpdF9zZXRfMShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisKKwlyZXR1cm4gTExDX1BEVV9JU19DTUQocGR1KSAmJiBMTENfUERVX1RZUEVfSVNfUyhwZHUpICYmCisJICAgICAgIExMQ19TX1BGX0lTXzEocGR1KSAmJgorCSAgICAgICBMTENfU19QRFVfQ01EKHBkdSkgPT0gTExDXzJfUERVX0NNRF9SUiA/IDAgOiAxOworfQorCitpbnQgbGxjX2Nvbm5fZXZfcnhfcnJfcnNwX2ZiaXRfc2V0XzAoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfcGR1X3NuICpwZHUgPSBsbGNfcGR1X3NuX2hkcihza2IpOworCisJcmV0dXJuIGxsY19jb25uX3NwYWNlKHNrLCBza2IpICYmCisJICAgICAgIExMQ19QRFVfSVNfUlNQKHBkdSkgJiYgTExDX1BEVV9UWVBFX0lTX1MocGR1KSAmJgorCSAgICAgICBMTENfU19QRl9JU18wKHBkdSkgJiYKKwkgICAgICAgTExDX1NfUERVX1JTUChwZHUpID09IExMQ18yX1BEVV9SU1BfUlIgPyAwIDogMTsKK30KKworaW50IGxsY19jb25uX2V2X3J4X3JyX3JzcF9mYml0X3NldF8xKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX3BkdV9zbiAqcGR1ID0gbGxjX3BkdV9zbl9oZHIoc2tiKTsKKworCXJldHVybiBsbGNfY29ubl9zcGFjZShzaywgc2tiKSAmJgorCSAgICAgICBMTENfUERVX0lTX1JTUChwZHUpICYmIExMQ19QRFVfVFlQRV9JU19TKHBkdSkgJiYKKwkgICAgICAgTExDX1NfUEZfSVNfMShwZHUpICYmCisJICAgICAgIExMQ19TX1BEVV9SU1AocGR1KSA9PSBMTENfMl9QRFVfUlNQX1JSID8gMCA6IDE7Cit9CisKK2ludCBsbGNfY29ubl9ldl9yeF9zYWJtZV9jbWRfcGJpdF9zZXRfeChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19wZHVfdW4gKnBkdSA9IGxsY19wZHVfdW5faGRyKHNrYik7CisKKwlyZXR1cm4gTExDX1BEVV9JU19DTUQocGR1KSAmJiBMTENfUERVX1RZUEVfSVNfVShwZHUpICYmCisJICAgICAgIExMQ19VX1BEVV9DTUQocGR1KSA9PSBMTENfMl9QRFVfQ01EX1NBQk1FID8gMCA6IDE7Cit9CisKK2ludCBsbGNfY29ubl9ldl9yeF91YV9yc3BfZmJpdF9zZXRfeChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19wZHVfdW4gKnBkdSA9IGxsY19wZHVfdW5faGRyKHNrYik7CisKKwlyZXR1cm4gTExDX1BEVV9JU19SU1AocGR1KSAmJiBMTENfUERVX1RZUEVfSVNfVShwZHUpICYmCisJICAgICAgIExMQ19VX1BEVV9SU1AocGR1KSA9PSBMTENfMl9QRFVfUlNQX1VBID8gMCA6IDE7Cit9CisKK2ludCBsbGNfY29ubl9ldl9yeF94eHhfY21kX3BiaXRfc2V0XzEoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXUxNiByYyA9IDE7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisKKwlpZiAoTExDX1BEVV9JU19DTUQocGR1KSkgeworCQlpZiAoTExDX1BEVV9UWVBFX0lTX0kocGR1KSB8fCBMTENfUERVX1RZUEVfSVNfUyhwZHUpKSB7CisJCQlpZiAoTExDX0lfUEZfSVNfMShwZHUpKQorCQkJCXJjID0gMDsKKwkJfSBlbHNlIGlmIChMTENfUERVX1RZUEVfSVNfVShwZHUpICYmIExMQ19VX1BGX0lTXzEocGR1KSkKKwkJCXJjID0gMDsKKwl9CisJcmV0dXJuIHJjOworfQorCitpbnQgbGxjX2Nvbm5fZXZfcnhfeHh4X2NtZF9wYml0X3NldF94KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1MTYgcmMgPSAxOworCXN0cnVjdCBsbGNfcGR1X3VuICpwZHUgPSBsbGNfcGR1X3VuX2hkcihza2IpOworCisJaWYgKExMQ19QRFVfSVNfQ01EKHBkdSkpIHsKKwkJaWYgKExMQ19QRFVfVFlQRV9JU19JKHBkdSkgfHwgTExDX1BEVV9UWVBFX0lTX1MocGR1KSkKKwkJCXJjID0gMDsKKwkJZWxzZSBpZiAoTExDX1BEVV9UWVBFX0lTX1UocGR1KSkKKwkJCXN3aXRjaCAoTExDX1VfUERVX0NNRChwZHUpKSB7CisJCQljYXNlIExMQ18yX1BEVV9DTURfU0FCTUU6CisJCQljYXNlIExMQ18yX1BEVV9DTURfRElTQzoKKwkJCQlyYyA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJfQorCXJldHVybiByYzsKK30KKworaW50IGxsY19jb25uX2V2X3J4X3h4eF9yc3BfZmJpdF9zZXRfMShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTE2IHJjID0gMTsKKwlzdHJ1Y3QgbGxjX3BkdV9zbiAqcGR1ID0gbGxjX3BkdV9zbl9oZHIoc2tiKTsKKworCWlmIChMTENfUERVX0lTX1JTUChwZHUpKSB7CisJCWlmIChMTENfUERVX1RZUEVfSVNfSShwZHUpIHx8IExMQ19QRFVfVFlQRV9JU19TKHBkdSkpIHsKKwkJCWlmIChMTENfSV9QRl9JU18xKHBkdSkpCisJCQkJcmMgPSAwOworCQl9IGVsc2UgaWYgKExMQ19QRFVfVFlQRV9JU19VKHBkdSkpCisJCQlzd2l0Y2ggKExMQ19VX1BEVV9SU1AocGR1KSkgeworCQkJY2FzZSBMTENfMl9QRFVfUlNQX1VBOgorCQkJY2FzZSBMTENfMl9QRFVfUlNQX0RNOgorCQkJY2FzZSBMTENfMl9QRFVfUlNQX0ZSTVI6CisJCQkJaWYgKExMQ19VX1BGX0lTXzEocGR1KSkKKwkJCQkJcmMgPSAwOworCQkJCWJyZWFrOworCQkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisKK2ludCBsbGNfY29ubl9ldl9yeF94eHhfcnNwX2ZiaXRfc2V0X3goc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXUxNiByYyA9IDE7CisJc3RydWN0IGxsY19wZHVfdW4gKnBkdSA9IGxsY19wZHVfdW5faGRyKHNrYik7CisKKwlpZiAoTExDX1BEVV9JU19SU1AocGR1KSkgeworCQlpZiAoTExDX1BEVV9UWVBFX0lTX0kocGR1KSB8fCBMTENfUERVX1RZUEVfSVNfUyhwZHUpKQorCQkJcmMgPSAwOworCQllbHNlIGlmIChMTENfUERVX1RZUEVfSVNfVShwZHUpKQorCQkJc3dpdGNoIChMTENfVV9QRFVfUlNQKHBkdSkpIHsKKwkJCWNhc2UgTExDXzJfUERVX1JTUF9VQToKKwkJCWNhc2UgTExDXzJfUERVX1JTUF9ETToKKwkJCWNhc2UgTExDXzJfUERVX1JTUF9GUk1SOgorCQkJCXJjID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBsbGNfY29ubl9ldl9yeF96enpfY21kX3BiaXRfc2V0X3hfaW52YWxfbnIoc3RydWN0IHNvY2sgKnNrLAorCQkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1MTYgcmMgPSAxOworCXN0cnVjdCBsbGNfcGR1X3NuICpwZHUgPSBsbGNfcGR1X3NuX2hkcihza2IpOworCXU4IHZzID0gbGxjX3NrKHNrKS0+dlM7CisJdTggbnIgPSBMTENfSV9HRVRfTlIocGR1KTsKKworCWlmIChMTENfUERVX0lTX0NNRChwZHUpICYmCisJICAgIChMTENfUERVX1RZUEVfSVNfSShwZHUpIHx8IExMQ19QRFVfVFlQRV9JU19TKHBkdSkpICYmCisJICAgIG5yICE9IHZzICYmIGxsY191dGlsX25yX2luc2lkZV90eF93aW5kb3coc2ssIG5yKSkgeworCQlkcHJpbnRrKCIlczogbWF0Y2hlZCwgc3RhdGU9JWQsIHZzPSVkLCBucj0lZFxuIiwKKwkJCV9fRlVOQ1RJT05fXywgbGxjX3NrKHNrKS0+c3RhdGUsIHZzLCBucik7CisJCXJjID0gMDsKKwl9CisJcmV0dXJuIHJjOworfQorCitpbnQgbGxjX2Nvbm5fZXZfcnhfenp6X3JzcF9mYml0X3NldF94X2ludmFsX25yKHN0cnVjdCBzb2NrICpzaywKKwkJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTE2IHJjID0gMTsKKwlzdHJ1Y3QgbGxjX3BkdV9zbiAqcGR1ID0gbGxjX3BkdV9zbl9oZHIoc2tiKTsKKwl1OCB2cyA9IGxsY19zayhzayktPnZTOworCXU4IG5yID0gTExDX0lfR0VUX05SKHBkdSk7CisKKwlpZiAoTExDX1BEVV9JU19SU1AocGR1KSAmJgorCSAgICAoTExDX1BEVV9UWVBFX0lTX0kocGR1KSB8fCBMTENfUERVX1RZUEVfSVNfUyhwZHUpKSAmJgorCSAgICBuciAhPSB2cyAmJiBsbGNfdXRpbF9ucl9pbnNpZGVfdHhfd2luZG93KHNrLCBucikpIHsKKwkJcmMgPSAwOworCQlkcHJpbnRrKCIlczogbWF0Y2hlZCwgc3RhdGU9JWQsIHZzPSVkLCBucj0lZFxuIiwKKwkJCV9fRlVOQ1RJT05fXywgbGxjX3NrKHNrKS0+c3RhdGUsIHZzLCBucik7CisJfQorCXJldHVybiByYzsKK30KKworaW50IGxsY19jb25uX2V2X3J4X2FueV9mcmFtZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCBsbGNfY29ubl9ldl9wX3Rtcl9leHAoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfY29ubl9zdGF0ZV9ldiAqZXYgPSBsbGNfY29ubl9ldihza2IpOworCisJcmV0dXJuIGV2LT50eXBlICE9IExMQ19DT05OX0VWX1RZUEVfUF9UTVI7Cit9CisKK2ludCBsbGNfY29ubl9ldl9hY2tfdG1yX2V4cChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19jb25uX3N0YXRlX2V2ICpldiA9IGxsY19jb25uX2V2KHNrYik7CisKKwlyZXR1cm4gZXYtPnR5cGUgIT0gTExDX0NPTk5fRVZfVFlQRV9BQ0tfVE1SOworfQorCitpbnQgbGxjX2Nvbm5fZXZfcmVqX3Rtcl9leHAoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfY29ubl9zdGF0ZV9ldiAqZXYgPSBsbGNfY29ubl9ldihza2IpOworCisJcmV0dXJuIGV2LT50eXBlICE9IExMQ19DT05OX0VWX1RZUEVfUkVKX1RNUjsKK30KKworaW50IGxsY19jb25uX2V2X2J1c3lfdG1yX2V4cChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19jb25uX3N0YXRlX2V2ICpldiA9IGxsY19jb25uX2V2KHNrYik7CisKKwlyZXR1cm4gZXYtPnR5cGUgIT0gTExDX0NPTk5fRVZfVFlQRV9CVVNZX1RNUjsKK30KKworaW50IGxsY19jb25uX2V2X2luaXRfcF9mX2N5Y2xlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gMTsKK30KKworaW50IGxsY19jb25uX2V2X3R4X2J1ZmZlcl9mdWxsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfZXYgKmV2ID0gbGxjX2Nvbm5fZXYoc2tiKTsKKworCXJldHVybiBldi0+dHlwZSA9PSBMTENfQ09OTl9FVl9UWVBFX1NJTVBMRSAmJgorCSAgICAgICBldi0+cHJpbV90eXBlID09IExMQ19DT05OX0VWX1RYX0JVRkZfRlVMTCA/IDAgOiAxOworfQorCisvKiBFdmVudCBxdWFsaWZpZXIgZnVuY3Rpb25zCisgKgorICogdGhlc2UgZnVuY3Rpb25zIHNpbXBseSB2ZXJpZnkgdGhlIHZhbHVlIG9mIGEgc3RhdGUgZmxhZyBhc3NvY2lhdGVkIHdpdGgKKyAqIHRoZSBjb25uZWN0aW9uIGFuZCByZXR1cm4gZWl0aGVyIGEgMCBmb3Igc3VjY2VzcyBvciBhIG5vbi16ZXJvIHZhbHVlCisgKiBmb3Igbm90LXN1Y2Nlc3M7IHZlcmlmeSB0aGUgZXZlbnQgaXMgdGhlIHR5cGUgd2UgZXhwZWN0CisgKi8KK2ludCBsbGNfY29ubl9ldl9xbGZ5X2RhdGFfZmxhZ19lcV8xKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gbGxjX3NrKHNrKS0+ZGF0YV9mbGFnICE9IDE7Cit9CisKK2ludCBsbGNfY29ubl9ldl9xbGZ5X2RhdGFfZmxhZ19lcV8wKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gbGxjX3NrKHNrKS0+ZGF0YV9mbGFnOworfQorCitpbnQgbGxjX2Nvbm5fZXZfcWxmeV9kYXRhX2ZsYWdfZXFfMihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIGxsY19zayhzayktPmRhdGFfZmxhZyAhPSAyOworfQorCitpbnQgbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfMShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIGxsY19zayhzayktPnBfZmxhZyAhPSAxOworfQorCisvKioKKyAqCWNvbm5fZXZfcWxmeV9sYXN0X2ZyYW1lX2VxXzEgLSBjaGVja3MgaWYgZnJhbWUgaXMgbGFzdCBpbiB0eCB3aW5kb3cKKyAqCUBzazogY3VycmVudCBjb25uZWN0aW9uIHN0cnVjdHVyZS4KKyAqCUBza2I6IGN1cnJlbnQgZXZlbnQuCisgKgorICoJVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIHdoZW4gZnJhbWUgd2hpY2ggaXMgc2VudCwgaXMgbGFzdCBmcmFtZSBvZgorICoJdHJhbnNtaXQgd2luZG93LCBpZiBpdCBpcyB0aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJuIHplcm8gZWxzZSByZXR1cm4KKyAqCW9uZS4gIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3Igc2VuZGluZyBsYXN0IGZyYW1lIG9mIHRyYW5zbWl0IHdpbmRvdworICoJYXMgSS1mb3JtYXQgY29tbWFuZCB3aXRoIHAtYml0IHNldCB0byBvbmUuIFJldHVybnMgMCBpZiBmcmFtZSBpcyBsYXN0CisgKglmcmFtZSwgMSBvdGhlcndpc2UuCisgKi8KK2ludCBsbGNfY29ubl9ldl9xbGZ5X2xhc3RfZnJhbWVfZXFfMShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuICEoc2tiX3F1ZXVlX2xlbigmbGxjX3NrKHNrKS0+cGR1X3VuYWNrX3EpICsgMSA9PSBsbGNfc2soc2spLT5rKTsKK30KKworLyoqCisgKgljb25uX2V2X3FsZnlfbGFzdF9mcmFtZV9lcV8wIC0gY2hlY2tzIGlmIGZyYW1lIGlzbid0IGxhc3QgaW4gdHggd2luZG93CisgKglAc2s6IGN1cnJlbnQgY29ubmVjdGlvbiBzdHJ1Y3R1cmUuCisgKglAc2tiOiBjdXJyZW50IGV2ZW50LgorICoKKyAqCVRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyB3aGVuIGZyYW1lIHdoaWNoIGlzIHNlbnQsIGlzbid0IGxhc3QgZnJhbWUgb2YKKyAqCXRyYW5zbWl0IHdpbmRvdywgaWYgaXQgaXNuJ3QgdGhlbiB0aGlzIGZ1bmN0aW9uIHJldHVybiB6ZXJvIGVsc2UgcmV0dXJuCisgKglvbmUuIFJldHVybnMgMCBpZiBmcmFtZSBpc24ndCBsYXN0IGZyYW1lLCAxIG90aGVyd2lzZS4KKyAqLworaW50IGxsY19jb25uX2V2X3FsZnlfbGFzdF9mcmFtZV9lcV8wKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2tiX3F1ZXVlX2xlbigmbGxjX3NrKHNrKS0+cGR1X3VuYWNrX3EpICsgMSA9PSBsbGNfc2soc2spLT5rOworfQorCitpbnQgbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfMChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIGxsY19zayhzayktPnBfZmxhZzsKK30KKworaW50IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxX2Yoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXU4IGZfYml0OworCisJbGxjX3BkdV9kZWNvZGVfcGZfYml0KHNrYiwgJmZfYml0KTsKKwlyZXR1cm4gbGxjX3NrKHNrKS0+cF9mbGFnID09IGZfYml0ID8gMCA6IDE7Cit9CisKK2ludCBsbGNfY29ubl9ldl9xbGZ5X3JlbW90ZV9idXN5X2VxXzAoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBsbGNfc2soc2spLT5yZW1vdGVfYnVzeV9mbGFnOworfQorCitpbnQgbGxjX2Nvbm5fZXZfcWxmeV9yZW1vdGVfYnVzeV9lcV8xKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gIWxsY19zayhzayktPnJlbW90ZV9idXN5X2ZsYWc7Cit9CisKK2ludCBsbGNfY29ubl9ldl9xbGZ5X3JldHJ5X2NudF9sdF9uMihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuICEobGxjX3NrKHNrKS0+cmV0cnlfY291bnQgPCBsbGNfc2soc2spLT5uMik7Cit9CisKK2ludCBsbGNfY29ubl9ldl9xbGZ5X3JldHJ5X2NudF9ndGVfbjIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAhKGxsY19zayhzayktPnJldHJ5X2NvdW50ID49IGxsY19zayhzayktPm4yKTsKK30KKworaW50IGxsY19jb25uX2V2X3FsZnlfc19mbGFnX2VxXzEoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAhbGxjX3NrKHNrKS0+c19mbGFnOworfQorCitpbnQgbGxjX2Nvbm5fZXZfcWxmeV9zX2ZsYWdfZXFfMChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIGxsY19zayhzayktPnNfZmxhZzsKK30KKworaW50IGxsY19jb25uX2V2X3FsZnlfY2F1c2VfZmxhZ19lcV8xKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gIWxsY19zayhzayktPmNhdXNlX2ZsYWc7Cit9CisKK2ludCBsbGNfY29ubl9ldl9xbGZ5X2NhdXNlX2ZsYWdfZXFfMChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIGxsY19zayhzayktPmNhdXNlX2ZsYWc7Cit9CisKK2ludCBsbGNfY29ubl9ldl9xbGZ5X3NldF9zdGF0dXNfY29ubihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19jb25uX3N0YXRlX2V2ICpldiA9IGxsY19jb25uX2V2KHNrYik7CisKKwlldi0+c3RhdHVzID0gTExDX1NUQVRVU19DT05OOworCXJldHVybiAwOworfQorCitpbnQgbGxjX2Nvbm5fZXZfcWxmeV9zZXRfc3RhdHVzX2Rpc2Moc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfY29ubl9zdGF0ZV9ldiAqZXYgPSBsbGNfY29ubl9ldihza2IpOworCisJZXYtPnN0YXR1cyA9IExMQ19TVEFUVVNfRElTQzsKKwlyZXR1cm4gMDsKK30KKworaW50IGxsY19jb25uX2V2X3FsZnlfc2V0X3N0YXR1c19mYWlsZWQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfY29ubl9zdGF0ZV9ldiAqZXYgPSBsbGNfY29ubl9ldihza2IpOworCisJZXYtPnN0YXR1cyA9IExMQ19TVEFUVVNfRkFJTEVEOworCXJldHVybiAwOworfQorCitpbnQgbGxjX2Nvbm5fZXZfcWxmeV9zZXRfc3RhdHVzX3JlbW90ZV9idXN5KHN0cnVjdCBzb2NrICpzaywKKwkJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19jb25uX3N0YXRlX2V2ICpldiA9IGxsY19jb25uX2V2KHNrYik7CisKKwlldi0+c3RhdHVzID0gTExDX1NUQVRVU19SRU1PVEVfQlVTWTsKKwlyZXR1cm4gMDsKK30KKworaW50IGxsY19jb25uX2V2X3FsZnlfc2V0X3N0YXR1c19yZWZ1c2Uoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfY29ubl9zdGF0ZV9ldiAqZXYgPSBsbGNfY29ubl9ldihza2IpOworCisJZXYtPnN0YXR1cyA9IExMQ19TVEFUVVNfUkVGVVNFOworCXJldHVybiAwOworfQorCitpbnQgbGxjX2Nvbm5fZXZfcWxmeV9zZXRfc3RhdHVzX2NvbmZsaWN0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfZXYgKmV2ID0gbGxjX2Nvbm5fZXYoc2tiKTsKKworCWV2LT5zdGF0dXMgPSBMTENfU1RBVFVTX0NPTkZMSUNUOworCXJldHVybiAwOworfQorCitpbnQgbGxjX2Nvbm5fZXZfcWxmeV9zZXRfc3RhdHVzX3JzdF9kb25lKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfZXYgKmV2ID0gbGxjX2Nvbm5fZXYoc2tiKTsKKworCWV2LT5zdGF0dXMgPSBMTENfU1RBVFVTX1JFU0VUX0RPTkU7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9uZXQvbGxjL2xsY19jX3N0LmMgYi9uZXQvbGxjL2xsY19jX3N0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE4YTk0MgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9sbGMvbGxjX2Nfc3QuYwpAQCAtMCwwICsxLDQ5NDYgQEAKKy8qCisgKiBsbGNfY19zdC5jIC0gVGhpcyBtb2R1bGUgY29udGFpbnMgc3RhdGUgdHJhbnNpdGlvbiBvZiBjb25uZWN0aW9uIGNvbXBvbmVudC4KKyAqCisgKiBEZXNjcmlwdGlvbiBvZiBldmVudCBmdW5jdGlvbnMgYW5kIGFjdGlvbnMgdGhlcmUgaXMgaW4gODAyLjIgTExDIHN0YW5kYXJkLAorICogb3IgaW4gImxsY19jX2FjLmMiIGFuZCAibGxjX2NfZXYuYyIgbW9kdWxlcy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcgYnkgUHJvY29tIFRlY2hub2xvZ3ksIEluYy4KKyAqIAkJIDIwMDEtMjAwMyBieSBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAqCisgKiBUaGlzIHByb2dyYW0gY2FuIGJlIHJlZGlzdHJpYnV0ZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgb3IgaW1wbGllZCB3YXJyYW50eQorICogb2YgbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLgorICoKKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0L2xsY19pZi5oPgorI2luY2x1ZGUgPG5ldC9sbGNfc2FwLmg+CisjaW5jbHVkZSA8bmV0L2xsY19jX2V2Lmg+CisjaW5jbHVkZSA8bmV0L2xsY19jX2FjLmg+CisjaW5jbHVkZSA8bmV0L2xsY19jX3N0Lmg+CisKKyNkZWZpbmUgTk9ORSBOVUxMCisKKy8qIENPTU1PTiBDT05ORUNUSU9OIFNUQVRFIHRyYW5zaXRpb25zCisgKiBDb21tb24gdHJhbnNpdGlvbnMgZm9yCisgKiBMTENfQ09OTl9TVEFURV9OT1JNQUwsCisgKiBMTENfQ09OTl9TVEFURV9CVVNZLAorICogTExDX0NPTk5fU1RBVEVfUkVKLAorICogTExDX0NPTk5fU1RBVEVfQVdBSVQsCisgKiBMTENfQ09OTl9TVEFURV9BV0FJVF9CVVNZIGFuZAorICogTExDX0NPTk5fU1RBVEVfQVdBSVRfUkVKIHN0YXRlcworICovCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfRElTQ19SRVEgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfY29tbW9uX2FjdGlvbnNfMVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfZGlzY19jbWRfcF9zZXRfeCwKKwlbMV0gPSBsbGNfY29ubl9hY19zdGFydF9hY2tfdGltZXIsCisJWzJdID0gbGxjX2Nvbm5fYWNfc3RvcF9vdGhlcl90aW1lcnMsCisJWzNdID0gbGxjX2Nvbm5fYWNfc2V0X3JldHJ5X2NudF8wLAorCVs0XSA9IGxsY19jb25uX2FjX3NldF9jYXVzZV9mbGFnXzEsCisJWzVdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2NvbW1vbl9zdGF0ZV90cmFuc18xID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9kaXNjX3JlcSwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0RfQ09OTiwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfY29tbW9uX2FjdGlvbnNfMSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SRVNFVF9SRVEgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfY29tbW9uX2FjdGlvbnNfMltdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfc2FibWVfY21kX3Bfc2V0X3gsCisJWzFdID0gbGxjX2Nvbm5fYWNfc3RhcnRfYWNrX3RpbWVyLAorCVsyXSA9IGxsY19jb25uX2FjX3N0b3Bfb3RoZXJfdGltZXJzLAorCVszXSA9IGxsY19jb25uX2FjX3NldF9yZXRyeV9jbnRfMCwKKwlbNF0gPSBsbGNfY29ubl9hY19zZXRfY2F1c2VfZmxhZ18xLAorCVs1XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19jb21tb25fc3RhdGVfdHJhbnNfMiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnN0X3JlcSwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX1JFU0VULAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19jb21tb25fYWN0aW9uc18yLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1NBQk1FX0NNRF9QYml0X1NFVF9YIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2NvbW1vbl9hY3Rpb25zXzNbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zdG9wX2FsbF90aW1lcnMsCisJWzFdID0gbGxjX2Nvbm5fYWNfc2V0X3ZzXzAsCisJWzJdID0gbGxjX2Nvbm5fYWNfc2V0X3ZyXzAsCisJWzNdID0gbGxjX2Nvbm5fYWNfc2VuZF91YV9yc3BfZl9zZXRfcCwKKwlbNF0gPSBsbGNfY29ubl9hY19yc3RfaW5kLAorCVs1XSA9IGxsY19jb25uX2FjX3NldF9wX2ZsYWdfMCwKKwlbNl0gPSBsbGNfY29ubl9hY19zZXRfcmVtb3RlX2J1c3lfMCwKKwlbN10gPSBsbGNfY29ubl9yZXNldCwKKwlbOF0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzMgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3NhYm1lX2NtZF9wYml0X3NldF94LAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfTk9STUFMLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19jb21tb25fYWN0aW9uc18zLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0RJU0NfQ01EX1BiaXRfU0VUX1ggZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfY29tbW9uX2FjdGlvbnNfNFtdID0geworCVswXSA9IGxsY19jb25uX2FjX3N0b3BfYWxsX3RpbWVycywKKwlbMV0gPSBsbGNfY29ubl9hY19zZW5kX3VhX3JzcF9mX3NldF9wLAorCVsyXSA9IGxsY19jb25uX2FjX2Rpc2NfaW5kLAorCVszXSA9IGxsY19jb25uX2Rpc2MsCisJWzRdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2NvbW1vbl9zdGF0ZV90cmFuc180ID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9kaXNjX2NtZF9wYml0X3NldF94LAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQURNLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19jb21tb25fYWN0aW9uc180LAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0ZSTVJfUlNQX0ZiaXRfU0VUX1ggZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfY29tbW9uX2FjdGlvbnNfNVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfc2FibWVfY21kX3Bfc2V0X3gsCisJWzFdID0gbGxjX2Nvbm5fYWNfc3RhcnRfYWNrX3RpbWVyLAorCVsyXSA9IGxsY19jb25uX2FjX3N0b3Bfb3RoZXJfdGltZXJzLAorCVszXSA9IGxsY19jb25uX2FjX3NldF9yZXRyeV9jbnRfMCwKKwlbNF0gPSBsbGNfY29ubl9hY19yc3RfaW5kLAorCVs1XSA9IGxsY19jb25uX2FjX3NldF9jYXVzZV9mbGFnXzAsCisJWzZdID0gbGxjX2Nvbm5fcmVzZXQsCisJWzddID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2NvbW1vbl9zdGF0ZV90cmFuc181ID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9mcm1yX3JzcF9mYml0X3NldF94LAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfUkVTRVQsCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2NvbW1vbl9hY3Rpb25zXzUsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfRE1fUlNQX0ZiaXRfU0VUX1ggZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfY29tbW9uX2FjdGlvbnNfNltdID0geworCVswXSA9IGxsY19jb25uX2FjX2Rpc2NfaW5kLAorCVsxXSA9IGxsY19jb25uX2FjX3N0b3BfYWxsX3RpbWVycywKKwlbMl0gPSBsbGNfY29ubl9kaXNjLAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19jb21tb25fc3RhdGVfdHJhbnNfNiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfZG1fcnNwX2ZiaXRfc2V0X3gsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BRE0sCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2NvbW1vbl9hY3Rpb25zXzYsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfWlpaX0NNRF9QYml0X1NFVF9YX0lOVkFMX05yIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2NvbW1vbl9hY3Rpb25zXzdhW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9mcm1yX3JzcF9mX3NldF94LAorCVsxXSA9IGxsY19jb25uX2FjX3N0YXJ0X2Fja190aW1lciwKKwlbMl0gPSBsbGNfY29ubl9hY19zdG9wX290aGVyX3RpbWVycywKKwlbM10gPSBsbGNfY29ubl9hY19zZXRfcmV0cnlfY250XzAsCisJWzRdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2NvbW1vbl9zdGF0ZV90cmFuc183YSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfenp6X2NtZF9wYml0X3NldF94X2ludmFsX25yLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfRVJST1IsCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2NvbW1vbl9hY3Rpb25zXzdhLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0lfQ01EX1BiaXRfU0VUX1hfSU5WQUxfTnMgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfY29tbW9uX2FjdGlvbnNfN2JbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX2ZybXJfcnNwX2Zfc2V0X3gsCisJWzFdID0gbGxjX2Nvbm5fYWNfc3RhcnRfYWNrX3RpbWVyLAorCVsyXSA9IGxsY19jb25uX2FjX3N0b3Bfb3RoZXJfdGltZXJzLAorCVszXSA9IGxsY19jb25uX2FjX3NldF9yZXRyeV9jbnRfMCwKKwlbNF0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzdiID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9pX2NtZF9wYml0X3NldF94X2ludmFsX25zLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfRVJST1IsCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2NvbW1vbl9hY3Rpb25zXzdiLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1paWl9SU1BfRmJpdF9TRVRfWF9JTlZBTF9OciBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19jb21tb25fYWN0aW9uc184YVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfZnJtcl9yc3BfZl9zZXRfeCwKKwlbMV0gPSBsbGNfY29ubl9hY19zdGFydF9hY2tfdGltZXIsCisJWzJdID0gbGxjX2Nvbm5fYWNfc3RvcF9vdGhlcl90aW1lcnMsCisJWzNdID0gbGxjX2Nvbm5fYWNfc2V0X3JldHJ5X2NudF8wLAorCVs0XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19jb21tb25fc3RhdGVfdHJhbnNfOGEgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3p6el9yc3BfZmJpdF9zZXRfeF9pbnZhbF9uciwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0VSUk9SLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19jb21tb25fYWN0aW9uc184YSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9JX1JTUF9GYml0X1NFVF9YX0lOVkFMX05zIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2NvbW1vbl9hY3Rpb25zXzhiW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9mcm1yX3JzcF9mX3NldF94LAorCVsxXSA9IGxsY19jb25uX2FjX3N0YXJ0X2Fja190aW1lciwKKwlbMl0gPSBsbGNfY29ubl9hY19zdG9wX290aGVyX3RpbWVycywKKwlbM10gPSBsbGNfY29ubl9hY19zZXRfcmV0cnlfY250XzAsCisJWzRdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2NvbW1vbl9zdGF0ZV90cmFuc184YiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfaV9yc3BfZmJpdF9zZXRfeF9pbnZhbF9ucywKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0VSUk9SLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19jb21tb25fYWN0aW9uc184YiwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9CQURfUERVIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2NvbW1vbl9hY3Rpb25zXzhjW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9mcm1yX3JzcF9mX3NldF94LAorCVsxXSA9IGxsY19jb25uX2FjX3N0YXJ0X2Fja190aW1lciwKKwlbMl0gPSBsbGNfY29ubl9hY19zdG9wX290aGVyX3RpbWVycywKKwlbM10gPSBsbGNfY29ubl9hY19zZXRfcmV0cnlfY250XzAsCisJWzRdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2NvbW1vbl9zdGF0ZV90cmFuc184YyA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfYmFkX3BkdSwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0VSUk9SLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19jb21tb25fYWN0aW9uc184YywKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9VQV9SU1BfRmJpdF9TRVRfWCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19jb21tb25fYWN0aW9uc185W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9mcm1yX3JzcF9mX3NldF94LAorCVsxXSA9IGxsY19jb25uX2FjX3N0YXJ0X2Fja190aW1lciwKKwlbMl0gPSBsbGNfY29ubl9hY19zdG9wX290aGVyX3RpbWVycywKKwlbM10gPSBsbGNfY29ubl9hY19zZXRfcmV0cnlfY250XzAsCisJWzRdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2NvbW1vbl9zdGF0ZV90cmFuc185ID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF91YV9yc3BfZmJpdF9zZXRfeCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0VSUk9SLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19jb21tb25fYWN0aW9uc185LAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1hYWF9SU1BfRmJpdF9TRVRfMSBldmVudCAqLworI2lmIDAKK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX2NvbW1vbl9ldl9xZnlyc18xMFtdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxXzAsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfY29tbW9uX2FjdGlvbnNfMTBbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX2ZybXJfcnNwX2Zfc2V0X3gsCisJWzFdID0gbGxjX2Nvbm5fYWNfc3RhcnRfYWNrX3RpbWVyLAorCVsyXSA9IGxsY19jb25uX2FjX3N0b3Bfb3RoZXJfdGltZXJzLAorCVszXSA9IGxsY19jb25uX2FjX3NldF9yZXRyeV9jbnRfMCwKKwlbNF0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzEwID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF94eHhfcnNwX2ZiaXRfc2V0XzEsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9FUlJPUiwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19jb21tb25fZXZfcWZ5cnNfMTAsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfY29tbW9uX2FjdGlvbnNfMTAsCit9OworI2VuZGlmCisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9QX1RNUl9FWFAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX2NvbW1vbl9ldl9xZnlyc18xMWFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3JldHJ5X2NudF9ndGVfbjIsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfY29tbW9uX2FjdGlvbnNfMTFhW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9zYWJtZV9jbWRfcF9zZXRfeCwKKwlbMV0gPSBsbGNfY29ubl9hY19zdGFydF9hY2tfdGltZXIsCisJWzJdID0gbGxjX2Nvbm5fYWNfc3RvcF9vdGhlcl90aW1lcnMsCisJWzNdID0gbGxjX2Nvbm5fYWNfc2V0X3JldHJ5X2NudF8wLAorCVs0XSA9IGxsY19jb25uX2FjX3NldF9jYXVzZV9mbGFnXzAsCisJWzVdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2NvbW1vbl9zdGF0ZV90cmFuc18xMWEgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3BfdG1yX2V4cCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX1JFU0VULAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX2NvbW1vbl9ldl9xZnlyc18xMWEsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfY29tbW9uX2FjdGlvbnNfMTFhLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX0FDS19UTVJfRVhQIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19jb21tb25fZXZfcWZ5cnNfMTFiW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9yZXRyeV9jbnRfZ3RlX24yLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2NvbW1vbl9hY3Rpb25zXzExYltdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfc2FibWVfY21kX3Bfc2V0X3gsCisJWzFdID0gbGxjX2Nvbm5fYWNfc3RhcnRfYWNrX3RpbWVyLAorCVsyXSA9IGxsY19jb25uX2FjX3N0b3Bfb3RoZXJfdGltZXJzLAorCVszXSA9IGxsY19jb25uX2FjX3NldF9yZXRyeV9jbnRfMCwKKwlbNF0gPSBsbGNfY29ubl9hY19zZXRfY2F1c2VfZmxhZ18wLAorCVs1XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19jb21tb25fc3RhdGVfdHJhbnNfMTFiID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9hY2tfdG1yX2V4cCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX1JFU0VULAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX2NvbW1vbl9ldl9xZnlyc18xMWIsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfY29tbW9uX2FjdGlvbnNfMTFiLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JFSl9UTVJfRVhQIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19jb21tb25fZXZfcWZ5cnNfMTFjW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9yZXRyeV9jbnRfZ3RlX24yLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2NvbW1vbl9hY3Rpb25zXzExY1tdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfc2FibWVfY21kX3Bfc2V0X3gsCisJWzFdID0gbGxjX2Nvbm5fYWNfc3RhcnRfYWNrX3RpbWVyLAorCVsyXSA9IGxsY19jb25uX2FjX3N0b3Bfb3RoZXJfdGltZXJzLAorCVszXSA9IGxsY19jb25uX2FjX3NldF9yZXRyeV9jbnRfMCwKKwlbNF0gPSBsbGNfY29ubl9hY19zZXRfY2F1c2VfZmxhZ18wLAorCVs1XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19jb21tb25fc3RhdGVfdHJhbnNfMTFjID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yZWpfdG1yX2V4cCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX1JFU0VULAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX2NvbW1vbl9ldl9xZnlyc18xMWMsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfY29tbW9uX2FjdGlvbnNfMTFjLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX0JVU1lfVE1SX0VYUCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfY29tbW9uX2V2X3FmeXJzXzExZFtdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcmV0cnlfY250X2d0ZV9uMiwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19jb21tb25fYWN0aW9uc18xMWRbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX3NhYm1lX2NtZF9wX3NldF94LAorCVsxXSA9IGxsY19jb25uX2FjX3N0YXJ0X2Fja190aW1lciwKKwlbMl0gPSBsbGNfY29ubl9hY19zdG9wX290aGVyX3RpbWVycywKKwlbM10gPSBsbGNfY29ubl9hY19zZXRfcmV0cnlfY250XzAsCisJWzRdID0gbGxjX2Nvbm5fYWNfc2V0X2NhdXNlX2ZsYWdfMCwKKwlbNV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzExZCA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfYnVzeV90bXJfZXhwLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfUkVTRVQsCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfY29tbW9uX2V2X3FmeXJzXzExZCwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19jb21tb25fYWN0aW9uc18xMWQsCit9OworCisvKgorICogQ29tbW9uIGR1bW15IHN0YXRlIHRyYW5zaXRpb247IG11c3QgYmUgbGFzdCBlbnRyeSBmb3IgYWxsIHN0YXRlCisgKiB0cmFuc2l0aW9uIGdyb3VwcyAtIGl0J2xsIGJlIG9uIC5ic3MsIHNvIHdpbGwgYmUgemVyb2VkLgorICovCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19jb21tb25fc3RhdGVfdHJhbnNfZW5kOworCisvKiBMTENfQ09OTl9TVEFURV9BRE0gdHJhbnNpdGlvbnMgKi8KKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9DT05OX1JFUSBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hZG1fYWN0aW9uc18xW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9zYWJtZV9jbWRfcF9zZXRfeCwKKwlbMV0gPSBsbGNfY29ubl9hY19zdGFydF9hY2tfdGltZXIsCisJWzJdID0gbGxjX2Nvbm5fYWNfc2V0X3JldHJ5X2NudF8wLAorCVszXSA9IGxsY19jb25uX2FjX3NldF9zX2ZsYWdfMCwKKwlbNF0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYWRtX3N0YXRlX3RyYW5zXzEgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X2Nvbm5fcmVxLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfU0VUVVAsCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2FkbV9hY3Rpb25zXzEsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfU0FCTUVfQ01EX1BiaXRfU0VUX1ggZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYWRtX2FjdGlvbnNfMltdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfdWFfcnNwX2Zfc2V0X3AsCisJWzFdID0gbGxjX2Nvbm5fYWNfc2V0X3ZzXzAsCisJWzJdID0gbGxjX2Nvbm5fYWNfc2V0X3ZyXzAsCisJWzNdID0gbGxjX2Nvbm5fYWNfc2V0X3JldHJ5X2NudF8wLAorCVs0XSA9IGxsY19jb25uX2FjX3NldF9wX2ZsYWdfMCwKKwlbNV0gPSBsbGNfY29ubl9hY19zZXRfcmVtb3RlX2J1c3lfMCwKKwlbNl0gPSBsbGNfY29ubl9hY19jb25uX2luZCwKKwlbN10gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYWRtX3N0YXRlX3RyYW5zXzIgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3NhYm1lX2NtZF9wYml0X3NldF94LAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfTk9STUFMLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19hZG1fYWN0aW9uc18yLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0RJU0NfQ01EX1BiaXRfU0VUX1ggZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYWRtX2FjdGlvbnNfM1tdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfZG1fcnNwX2Zfc2V0X3AsCisJWzFdID0gbGxjX2Nvbm5fZGlzYywKKwlbMl0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYWRtX3N0YXRlX3RyYW5zXzMgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X2Rpc2NfY21kX3BiaXRfc2V0X3gsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BRE0sCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2FkbV9hY3Rpb25zXzMsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfWFhYX0NNRF9QYml0X1NFVF8xIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2FkbV9hY3Rpb25zXzRbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX2RtX3JzcF9mX3NldF8xLAorCVsxXSA9IGxsY19jb25uX2Rpc2MsCisJWzJdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2FkbV9zdGF0ZV90cmFuc180ID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF94eHhfY21kX3BiaXRfc2V0XzEsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BRE0sCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2FkbV9hY3Rpb25zXzQsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfWFhYX1lZWSBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hZG1fYWN0aW9uc181W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZGlzYywKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYWRtX3N0YXRlX3RyYW5zXzUgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X2FueV9mcmFtZSwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX09VVF9PRl9TVkMsCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2FkbV9hY3Rpb25zXzUsCit9OworCisvKgorICogQXJyYXkgb2YgcG9pbnRlcnM7CisgKiBvbmUgdG8gZWFjaCB0cmFuc2l0aW9uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgKmxsY19hZG1fc3RhdGVfdHJhbnNpdGlvbnNbXSA9IHsKKwlbMF0gPSAmbGxjX2FkbV9zdGF0ZV90cmFuc18xLAkJLyogUmVxdWVzdCAqLworCVsxXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zX2VuZCwKKwlbMl0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc19lbmQsCS8qIGxvY2FsX2J1c3kgKi8KKwlbM10gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc19lbmQsCS8qIGluaXRfcGZfY3ljbGUgKi8KKwlbNF0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc19lbmQsCS8qIHRpbWVyICovCisJWzVdID0gJmxsY19hZG1fc3RhdGVfdHJhbnNfMiwJCS8qIFJlY2VpdmUgZnJhbWUgKi8KKwlbNl0gPSAmbGxjX2FkbV9zdGF0ZV90cmFuc18zLAorCVs3XSA9ICZsbGNfYWRtX3N0YXRlX3RyYW5zXzQsCisJWzhdID0gJmxsY19hZG1fc3RhdGVfdHJhbnNfNSwKKwlbOV0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc19lbmQsCit9OworCisvKiBMTENfQ09OTl9TVEFURV9TRVRVUCB0cmFuc2l0aW9ucyAqLworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1NBQk1FX0NNRF9QYml0X1NFVF9YIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX3NldHVwX2FjdGlvbnNfMVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfdWFfcnNwX2Zfc2V0X3AsCisJWzFdID0gbGxjX2Nvbm5fYWNfc2V0X3ZzXzAsCisJWzJdID0gbGxjX2Nvbm5fYWNfc2V0X3ZyXzAsCisJWzNdID0gbGxjX2Nvbm5fYWNfc2V0X3NfZmxhZ18xLAorCVs0XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19zZXR1cF9zdGF0ZV90cmFuc18xID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9zYWJtZV9jbWRfcGJpdF9zZXRfeCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX1NFVFVQLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19zZXR1cF9hY3Rpb25zXzEsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfVUFfUlNQX0ZiaXRfU0VUX1ggZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX3NldHVwX2V2X3FmeXJzXzJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV9mLAorCVsxXSA9IGxsY19jb25uX2V2X3FsZnlfc2V0X3N0YXR1c19jb25uLAorCVsyXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX3NldHVwX2FjdGlvbnNfMltdID0geworCVswXSA9IGxsY19jb25uX2FjX3N0b3BfYWNrX3RpbWVyLAorCVsxXSA9IGxsY19jb25uX2FjX3NldF92c18wLAorCVsyXSA9IGxsY19jb25uX2FjX3NldF92cl8wLAorCVszXSA9IGxsY19jb25uX2FjX3VwZF9wX2ZsYWcsCisJWzRdID0gbGxjX2Nvbm5fYWNfc2V0X3JlbW90ZV9idXN5XzAsCisJWzVdID0gbGxjX2Nvbm5fYWNfY29ubl9jb25maXJtLAorCVs2XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19zZXR1cF9zdGF0ZV90cmFuc18yID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF91YV9yc3BfZmJpdF9zZXRfeCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX05PUk1BTCwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19zZXR1cF9ldl9xZnlyc18yLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX3NldHVwX2FjdGlvbnNfMiwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9BQ0tfVE1SX0VYUCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfc2V0dXBfZXZfcWZ5cnNfM1tdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfc19mbGFnX2VxXzEsCisJWzFdID0gbGxjX2Nvbm5fZXZfcWxmeV9zZXRfc3RhdHVzX2Nvbm4sCisJWzJdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfc2V0dXBfYWN0aW9uc18zW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2V0X3BfZmxhZ18wLAorCVsxXSA9IGxsY19jb25uX2FjX3NldF9yZW1vdGVfYnVzeV8wLAorCVsyXSA9IGxsY19jb25uX2FjX2Nvbm5fY29uZmlybSwKKwlbM10gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfc2V0dXBfc3RhdGVfdHJhbnNfMyA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfYWNrX3Rtcl9leHAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9OT1JNQUwsCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfc2V0dXBfZXZfcWZ5cnNfMywKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19zZXR1cF9hY3Rpb25zXzMsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfRElTQ19DTURfUGJpdF9TRVRfWCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfc2V0dXBfZXZfcWZ5cnNfNFtdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfc2V0X3N0YXR1c19kaXNjLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX3NldHVwX2FjdGlvbnNfNFtdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfZG1fcnNwX2Zfc2V0X3AsCisJWzFdID0gbGxjX2Nvbm5fYWNfc3RvcF9hY2tfdGltZXIsCisJWzJdID0gbGxjX2Nvbm5fYWNfY29ubl9jb25maXJtLAorCVszXSA9IGxsY19jb25uX2Rpc2MsCisJWzRdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX3NldHVwX3N0YXRlX3RyYW5zXzQgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X2Rpc2NfY21kX3BiaXRfc2V0X3gsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BRE0sCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfc2V0dXBfZXZfcWZ5cnNfNCwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19zZXR1cF9hY3Rpb25zXzQsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfRE1fUlNQX0ZiaXRfU0VUX1ggZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX3NldHVwX2V2X3FmeXJzXzVbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3NldF9zdGF0dXNfZGlzYywKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19zZXR1cF9hY3Rpb25zXzVbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zdG9wX2Fja190aW1lciwKKwlbMV0gPSBsbGNfY29ubl9hY19jb25uX2NvbmZpcm0sCisJWzJdID0gbGxjX2Nvbm5fZGlzYywKKwlbM10gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfc2V0dXBfc3RhdGVfdHJhbnNfNSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfZG1fcnNwX2ZiaXRfc2V0X3gsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BRE0sCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfc2V0dXBfZXZfcWZ5cnNfNSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19zZXR1cF9hY3Rpb25zXzUsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfQUNLX1RNUl9FWFAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX3NldHVwX2V2X3FmeXJzXzdbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3JldHJ5X2NudF9sdF9uMiwKKwlbMV0gPSBsbGNfY29ubl9ldl9xbGZ5X3NfZmxhZ19lcV8wLAorCVsyXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX3NldHVwX2FjdGlvbnNfN1tdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfc2FibWVfY21kX3Bfc2V0X3gsCisJWzFdID0gbGxjX2Nvbm5fYWNfc3RhcnRfYWNrX3RpbWVyLAorCVsyXSA9IGxsY19jb25uX2FjX2luY19yZXRyeV9jbnRfYnlfMSwKKwlbM10gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfc2V0dXBfc3RhdGVfdHJhbnNfNyA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfYWNrX3Rtcl9leHAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9TRVRVUCwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19zZXR1cF9ldl9xZnlyc183LAorCS5ldl9hY3Rpb25zICAgID0gbGxjX3NldHVwX2FjdGlvbnNfNywKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9BQ0tfVE1SX0VYUCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfc2V0dXBfZXZfcWZ5cnNfOFtdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcmV0cnlfY250X2d0ZV9uMiwKKwlbMV0gPSBsbGNfY29ubl9ldl9xbGZ5X3NfZmxhZ19lcV8wLAorCVsyXSA9IGxsY19jb25uX2V2X3FsZnlfc2V0X3N0YXR1c19mYWlsZWQsCisJWzNdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfc2V0dXBfYWN0aW9uc184W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfY29ubl9jb25maXJtLAorCVsxXSA9IGxsY19jb25uX2Rpc2MsCisJWzJdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX3NldHVwX3N0YXRlX3RyYW5zXzggPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X2Fja190bXJfZXhwLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQURNLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX3NldHVwX2V2X3FmeXJzXzgsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfc2V0dXBfYWN0aW9uc184LAorfTsKKworLyoKKyAqIEFycmF5IG9mIHBvaW50ZXJzOworICogb25lIHRvIGVhY2ggdHJhbnNpdGlvbgorICovCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zICpsbGNfc2V0dXBfc3RhdGVfdHJhbnNpdGlvbnNbXSA9IHsKKwkgWzBdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfZW5kLAkvKiBSZXF1ZXN0ICovCisJIFsxXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zX2VuZCwJLyogbG9jYWwgYnVzeSAqLworCSBbMl0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc19lbmQsCS8qIGluaXRfcGZfY3ljbGUgKi8KKwkgWzNdID0gJmxsY19zZXR1cF9zdGF0ZV90cmFuc18zLAkvKiBUaW1lciAqLworCSBbNF0gPSAmbGxjX3NldHVwX3N0YXRlX3RyYW5zXzcsCisJIFs1XSA9ICZsbGNfc2V0dXBfc3RhdGVfdHJhbnNfOCwKKwkgWzZdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfZW5kLAorCSBbN10gPSAmbGxjX3NldHVwX3N0YXRlX3RyYW5zXzEsCS8qIFJlY2VpdmUgZnJhbWUgKi8KKwkgWzhdID0gJmxsY19zZXR1cF9zdGF0ZV90cmFuc18yLAorCSBbOV0gPSAmbGxjX3NldHVwX3N0YXRlX3RyYW5zXzQsCisJWzEwXSA9ICZsbGNfc2V0dXBfc3RhdGVfdHJhbnNfNSwKKwlbMTFdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfZW5kLAorfTsKKworLyogTExDX0NPTk5fU1RBVEVfTk9STUFMIHRyYW5zaXRpb25zICovCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfREFUQV9SRVEgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX25vcm1hbF9ldl9xZnlyc18xW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9yZW1vdGVfYnVzeV9lcV8wLAorCVsxXSA9IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxXzAsCisJWzJdID0gbGxjX2Nvbm5fZXZfcWxmeV9sYXN0X2ZyYW1lX2VxXzAsCisJWzNdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfbm9ybWFsX2FjdGlvbnNfMVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfaV9hc19hY2ssCisJWzFdID0gbGxjX2Nvbm5fYWNfc3RhcnRfYWNrX3Rtcl9pZl9ub3RfcnVubmluZywKKwlbMl0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfbm9ybWFsX3N0YXRlX3RyYW5zXzEgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X2RhdGFfcmVxLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfTk9STUFMLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX25vcm1hbF9ldl9xZnlyc18xLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX25vcm1hbF9hY3Rpb25zXzEsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfREFUQV9SRVEgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX25vcm1hbF9ldl9xZnlyc18yW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9yZW1vdGVfYnVzeV9lcV8wLAorCVsxXSA9IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxXzAsCisJWzJdID0gbGxjX2Nvbm5fZXZfcWxmeV9sYXN0X2ZyYW1lX2VxXzEsCisJWzNdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfbm9ybWFsX2FjdGlvbnNfMltdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfaV9jbWRfcF9zZXRfMSwKKwlbMV0gPSBsbGNfY29ubl9hY19zdGFydF9wX3RpbWVyLAorCVsyXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19ub3JtYWxfc3RhdGVfdHJhbnNfMiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfZGF0YV9yZXEsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9OT1JNQUwsCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfbm9ybWFsX2V2X3FmeXJzXzIsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfbm9ybWFsX2FjdGlvbnNfMiwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9EQVRBX1JFUSBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfbm9ybWFsX2V2X3FmeXJzXzJfMVtdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcmVtb3RlX2J1c3lfZXFfMSwKKwlbMV0gPSBsbGNfY29ubl9ldl9xbGZ5X3NldF9zdGF0dXNfcmVtb3RlX2J1c3ksCisJWzJdID0gTlVMTCwKK307CisKKy8qIGp1c3Qgb25lIG1lbWJlciwgTlVMTCwgLmJzcyB6ZXJvZXMgaXQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfbm9ybWFsX2FjdGlvbnNfMl8xWzFdOworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19ub3JtYWxfc3RhdGVfdHJhbnNfMl8xID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9kYXRhX3JlcSwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX05PUk1BTCwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19ub3JtYWxfZXZfcWZ5cnNfMl8xLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX25vcm1hbF9hY3Rpb25zXzJfMSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9MT0NBTF9CVVNZX0RFVEVDVEVEIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19ub3JtYWxfZXZfcWZ5cnNfM1tdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxXzAsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfbm9ybWFsX2FjdGlvbnNfM1tdID0geworCVswXSA9IGxsY19jb25uX2FjX3JzdF9zZW5kYWNrX2ZsYWcsCisJWzFdID0gbGxjX2Nvbm5fYWNfc2VuZF9ybnJfeHh4X3hfc2V0XzAsCisJWzJdID0gbGxjX2Nvbm5fYWNfc2V0X2RhdGFfZmxhZ18wLAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19ub3JtYWxfc3RhdGVfdHJhbnNfMyA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfbG9jYWxfYnVzeV9kZXRlY3RlZCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0JVU1ksCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfbm9ybWFsX2V2X3FmeXJzXzMsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfbm9ybWFsX2FjdGlvbnNfMywKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9MT0NBTF9CVVNZX0RFVEVDVEVEIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19ub3JtYWxfZXZfcWZ5cnNfNFtdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxXzEsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfbm9ybWFsX2FjdGlvbnNfNFtdID0geworCVswXSA9IGxsY19jb25uX2FjX3JzdF9zZW5kYWNrX2ZsYWcsCisJWzFdID0gbGxjX2Nvbm5fYWNfc2VuZF9ybnJfeHh4X3hfc2V0XzAsCisJWzJdID0gbGxjX2Nvbm5fYWNfc2V0X2RhdGFfZmxhZ18wLAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19ub3JtYWxfc3RhdGVfdHJhbnNfNCA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfbG9jYWxfYnVzeV9kZXRlY3RlZCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0JVU1ksCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfbm9ybWFsX2V2X3FmeXJzXzQsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfbm9ybWFsX2FjdGlvbnNfNCwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9JX0NNRF9QYml0X1NFVF8wX1VORVhQRF9OcyBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfbm9ybWFsX2V2X3FmeXJzXzVhW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfMCwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19ub3JtYWxfYWN0aW9uc181YVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3JzdF9zZW5kYWNrX2ZsYWcsCisJWzFdID0gbGxjX2Nvbm5fYWNfc2VuZF9yZWpfeHh4X3hfc2V0XzAsCisJWzJdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVszXSA9IGxsY19jb25uX2FjX3VwZF9wX2ZsYWcsCisJWzRdID0gbGxjX2Nvbm5fYWNfc3RhcnRfcmVqX3RpbWVyLAorCVs1XSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5X2lmX2ZfZXFfMSwKKwlbNl0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfbm9ybWFsX3N0YXRlX3RyYW5zXzVhID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9pX2NtZF9wYml0X3NldF8wX3VuZXhwZF9ucywKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX1JFSiwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19ub3JtYWxfZXZfcWZ5cnNfNWEsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfbm9ybWFsX2FjdGlvbnNfNWEsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfSV9SU1BfRmJpdF9TRVRfMF9VTkVYUERfTnMgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX25vcm1hbF9ldl9xZnlyc181YltdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxXzAsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfbm9ybWFsX2FjdGlvbnNfNWJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19yc3Rfc2VuZGFja19mbGFnLAorCVsxXSA9IGxsY19jb25uX2FjX3NlbmRfcmVqX3h4eF94X3NldF8wLAorCVsyXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbM10gPSBsbGNfY29ubl9hY191cGRfcF9mbGFnLAorCVs0XSA9IGxsY19jb25uX2FjX3N0YXJ0X3Jlal90aW1lciwKKwlbNV0gPSBsbGNfY29ubl9hY19jbGVhcl9yZW1vdGVfYnVzeV9pZl9mX2VxXzEsCisJWzZdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX25vcm1hbF9zdGF0ZV90cmFuc181YiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfaV9yc3BfZmJpdF9zZXRfMF91bmV4cGRfbnMsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9SRUosCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfbm9ybWFsX2V2X3FmeXJzXzViLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX25vcm1hbF9hY3Rpb25zXzViLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0lfUlNQX0ZiaXRfU0VUXzFfVU5FWFBEX05zIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19ub3JtYWxfZXZfcWZ5cnNfNWNbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV8xLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX25vcm1hbF9hY3Rpb25zXzVjW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfcnN0X3NlbmRhY2tfZmxhZywKKwlbMV0gPSBsbGNfY29ubl9hY19zZW5kX3Jlal94eHhfeF9zZXRfMCwKKwlbMl0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzNdID0gbGxjX2Nvbm5fYWNfdXBkX3BfZmxhZywKKwlbNF0gPSBsbGNfY29ubl9hY19zdGFydF9yZWpfdGltZXIsCisJWzVdID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3lfaWZfZl9lcV8xLAorCVs2XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19ub3JtYWxfc3RhdGVfdHJhbnNfNWMgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X2lfcnNwX2ZiaXRfc2V0XzFfdW5leHBkX25zLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfUkVKLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX25vcm1hbF9ldl9xZnlyc181YywKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19ub3JtYWxfYWN0aW9uc181YywKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9JX0NNRF9QYml0X1NFVF8wX1VORVhQRF9OcyBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfbm9ybWFsX2V2X3FmeXJzXzZhW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfMSwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19ub3JtYWxfYWN0aW9uc182YVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3JzdF9zZW5kYWNrX2ZsYWcsCisJWzFdID0gbGxjX2Nvbm5fYWNfc2VuZF9yZWpfeHh4X3hfc2V0XzAsCisJWzJdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVszXSA9IGxsY19jb25uX2FjX3N0YXJ0X3Jlal90aW1lciwKKwlbNF0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfbm9ybWFsX3N0YXRlX3RyYW5zXzZhID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9pX2NtZF9wYml0X3NldF8wX3VuZXhwZF9ucywKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX1JFSiwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19ub3JtYWxfZXZfcWZ5cnNfNmEsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfbm9ybWFsX2FjdGlvbnNfNmEsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfSV9SU1BfRmJpdF9TRVRfMF9VTkVYUERfTnMgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX25vcm1hbF9ldl9xZnlyc182YltdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxXzEsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfbm9ybWFsX2FjdGlvbnNfNmJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19yc3Rfc2VuZGFja19mbGFnLAorCVsxXSA9IGxsY19jb25uX2FjX3NlbmRfcmVqX3h4eF94X3NldF8wLAorCVsyXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbM10gPSBsbGNfY29ubl9hY19zdGFydF9yZWpfdGltZXIsCisJWzRdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX25vcm1hbF9zdGF0ZV90cmFuc182YiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfaV9yc3BfZmJpdF9zZXRfMF91bmV4cGRfbnMsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9SRUosCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfbm9ybWFsX2V2X3FmeXJzXzZiLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX25vcm1hbF9hY3Rpb25zXzZiLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0lfQ01EX1BiaXRfU0VUXzFfVU5FWFBEX05zIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX25vcm1hbF9hY3Rpb25zXzdbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19yc3Rfc2VuZGFja19mbGFnLAorCVsxXSA9IGxsY19jb25uX2FjX3NlbmRfcmVqX3JzcF9mX3NldF8xLAorCVsyXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbM10gPSBsbGNfY29ubl9hY19zdGFydF9yZWpfdGltZXIsCisJWzRdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX25vcm1hbF9zdGF0ZV90cmFuc183ID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9pX2NtZF9wYml0X3NldF8xX3VuZXhwZF9ucywKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX1JFSiwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfbm9ybWFsX2FjdGlvbnNfNywKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9JX1JTUF9GYml0X1NFVF9YIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19ub3JtYWxfZXZfcWZ5cnNfOGFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV9mLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX25vcm1hbF9hY3Rpb25zXzhbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19pbmNfdnJfYnlfMSwKKwlbMV0gPSBsbGNfY29ubl9hY19kYXRhX2luZCwKKwlbMl0gPSBsbGNfY29ubl9hY191cGRfcF9mbGFnLAorCVszXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbNF0gPSBsbGNfY29ubl9hY19jbGVhcl9yZW1vdGVfYnVzeV9pZl9mX2VxXzEsCisJWzVdID0gbGxjX2Nvbm5fYWNfc2VuZF9hY2tfaWZfbmVlZGVkLAorCVs2XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19ub3JtYWxfc3RhdGVfdHJhbnNfOGEgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X2lfcnNwX2ZiaXRfc2V0X3gsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9OT1JNQUwsCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfbm9ybWFsX2V2X3FmeXJzXzhhLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX25vcm1hbF9hY3Rpb25zXzgsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfSV9DTURfUGJpdF9TRVRfMCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfbm9ybWFsX2V2X3FmeXJzXzhiW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfMCwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfbm9ybWFsX3N0YXRlX3RyYW5zXzhiID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9pX2NtZF9wYml0X3NldF8wLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfTk9STUFMLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX25vcm1hbF9ldl9xZnlyc184YiwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19ub3JtYWxfYWN0aW9uc184LAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0lfUlNQX0ZiaXRfU0VUXzAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX25vcm1hbF9ldl9xZnlyc185YVtdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxXzEsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfbm9ybWFsX2FjdGlvbnNfOWFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19pbmNfdnJfYnlfMSwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzJdID0gbGxjX2Nvbm5fYWNfZGF0YV9pbmQsCisJWzNdID0gbGxjX2Nvbm5fYWNfc2VuZF9hY2tfaWZfbmVlZGVkLAorCVs0XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19ub3JtYWxfc3RhdGVfdHJhbnNfOWEgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X2lfcnNwX2ZiaXRfc2V0XzAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9OT1JNQUwsCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfbm9ybWFsX2V2X3FmeXJzXzlhLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX25vcm1hbF9hY3Rpb25zXzlhLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0lfQ01EX1BiaXRfU0VUXzAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX25vcm1hbF9ldl9xZnlyc185YltdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxXzEsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfbm9ybWFsX2FjdGlvbnNfOWJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19pbmNfdnJfYnlfMSwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzJdID0gbGxjX2Nvbm5fYWNfZGF0YV9pbmQsCisJWzNdID0gbGxjX2Nvbm5fYWNfc2VuZF9hY2tfaWZfbmVlZGVkLAorCVs0XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19ub3JtYWxfc3RhdGVfdHJhbnNfOWIgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X2lfY21kX3BiaXRfc2V0XzAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9OT1JNQUwsCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfbm9ybWFsX2V2X3FmeXJzXzliLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX25vcm1hbF9hY3Rpb25zXzliLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0lfQ01EX1BiaXRfU0VUXzEgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfbm9ybWFsX2FjdGlvbnNfMTBbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19pbmNfdnJfYnlfMSwKKwlbMV0gPSBsbGNfY29ubl9hY19zZW5kX2Fja19yc3BfZl9zZXRfMSwKKwlbMl0gPSBsbGNfY29ubl9hY19yc3Rfc2VuZGFja19mbGFnLAorCVszXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbNF0gPSBsbGNfY29ubl9hY19kYXRhX2luZCwKKwlbNV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfbm9ybWFsX3N0YXRlX3RyYW5zXzEwID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9pX2NtZF9wYml0X3NldF8xLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfTk9STUFMLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19ub3JtYWxfYWN0aW9uc18xMCwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciAqIExMQ19DT05OX0VWX1JYX1JSX0NNRF9QYml0X1NFVF8wIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX25vcm1hbF9hY3Rpb25zXzExYVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3VwZF9wX2ZsYWcsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsyXSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5LAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19ub3JtYWxfc3RhdGVfdHJhbnNfMTFhID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9ycl9jbWRfcGJpdF9zZXRfMCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX05PUk1BTCwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfbm9ybWFsX2FjdGlvbnNfMTFhLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JSX1JTUF9GYml0X1NFVF8wIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX25vcm1hbF9hY3Rpb25zXzExYltdID0geworCVswXSA9IGxsY19jb25uX2FjX3VwZF9wX2ZsYWcsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsyXSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5LAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19ub3JtYWxfc3RhdGVfdHJhbnNfMTFiID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9ycl9yc3BfZmJpdF9zZXRfMCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX05PUk1BTCwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfbm9ybWFsX2FjdGlvbnNfMTFiLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JSX1JTUF9GYml0X1NFVF8xIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19ub3JtYWxfZXZfcWZ5cnNfMTFjW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfMSwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19ub3JtYWxfYWN0aW9uc18xMWNbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY191cGRfcF9mbGFnLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMl0gPSBsbGNfY29ubl9hY19pbmNfdHhfd2luX3NpemUsCisJWzNdID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3ksCisJWzRdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX25vcm1hbF9zdGF0ZV90cmFuc18xMWMgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3JyX3JzcF9mYml0X3NldF8xLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfTk9STUFMLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX25vcm1hbF9ldl9xZnlyc18xMWMsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfbm9ybWFsX2FjdGlvbnNfMTFjLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JSX0NNRF9QYml0X1NFVF8xIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX25vcm1hbF9hY3Rpb25zXzEyW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9hY2tfcnNwX2Zfc2V0XzEsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsyXSA9IGxsY19jb25uX2FjX2FkanVzdF9ucHRhX2J5X3JyLAorCVszXSA9IGxsY19jb25uX2FjX3JzdF9zZW5kYWNrX2ZsYWcsCisJWzRdID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3ksCisJWzVdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX25vcm1hbF9zdGF0ZV90cmFuc18xMiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfcnJfY21kX3BiaXRfc2V0XzEsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9OT1JNQUwsCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX25vcm1hbF9hY3Rpb25zXzEyLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JOUl9DTURfUGJpdF9TRVRfMCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19ub3JtYWxfYWN0aW9uc18xM2FbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY191cGRfcF9mbGFnLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMl0gPSBsbGNfY29ubl9hY19zZXRfcmVtb3RlX2J1c3ksCisJWzNdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX25vcm1hbF9zdGF0ZV90cmFuc18xM2EgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3Jucl9jbWRfcGJpdF9zZXRfMCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX05PUk1BTCwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfbm9ybWFsX2FjdGlvbnNfMTNhLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JOUl9SU1BfRmJpdF9TRVRfMCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19ub3JtYWxfYWN0aW9uc18xM2JbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY191cGRfcF9mbGFnLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMl0gPSBsbGNfY29ubl9hY19zZXRfcmVtb3RlX2J1c3ksCisJWzNdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX25vcm1hbF9zdGF0ZV90cmFuc18xM2IgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3Jucl9yc3BfZmJpdF9zZXRfMCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX05PUk1BTCwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfbm9ybWFsX2FjdGlvbnNfMTNiLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JOUl9SU1BfRmJpdF9TRVRfMSBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfbm9ybWFsX2V2X3FmeXJzXzEzY1tdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxXzEsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfbm9ybWFsX2FjdGlvbnNfMTNjW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfdXBkX3BfZmxhZywKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzJdID0gbGxjX2Nvbm5fYWNfc2V0X3JlbW90ZV9idXN5LAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19ub3JtYWxfc3RhdGVfdHJhbnNfMTNjID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9ybnJfcnNwX2ZiaXRfc2V0XzEsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9OT1JNQUwsCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfbm9ybWFsX2V2X3FmeXJzXzEzYywKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19ub3JtYWxfYWN0aW9uc18xM2MsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfUk5SX0NNRF9QYml0X1NFVF8xIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX25vcm1hbF9hY3Rpb25zXzE0W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9ycl9yc3BfZl9zZXRfMSwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzJdID0gbGxjX2Nvbm5fYWNfYWRqdXN0X25wdGFfYnlfcm5yLAorCVszXSA9IGxsY19jb25uX2FjX3JzdF9zZW5kYWNrX2ZsYWcsCisJWzRdID0gbGxjX2Nvbm5fYWNfc2V0X3JlbW90ZV9idXN5LAorCVs1XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19ub3JtYWxfc3RhdGVfdHJhbnNfMTQgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3Jucl9jbWRfcGJpdF9zZXRfMSwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX05PUk1BTCwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfbm9ybWFsX2FjdGlvbnNfMTQsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfUkVKX0NNRF9QYml0X1NFVF8wIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19ub3JtYWxfZXZfcWZ5cnNfMTVhW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfMCwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19ub3JtYWxfYWN0aW9uc18xNWFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZXRfdnNfbnIsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsyXSA9IGxsY19jb25uX2FjX3VwZF9wX2ZsYWcsCisJWzNdID0gbGxjX2Nvbm5fYWNfZGVjX3R4X3dpbl9zaXplLAorCVs0XSA9IGxsY19jb25uX2FjX3Jlc2VuZF9pX3h4eF94X3NldF8wLAorCVs1XSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5LAorCVs2XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19ub3JtYWxfc3RhdGVfdHJhbnNfMTVhID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9yZWpfY21kX3BiaXRfc2V0XzAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9OT1JNQUwsCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfbm9ybWFsX2V2X3FmeXJzXzE1YSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19ub3JtYWxfYWN0aW9uc18xNWEsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfUkVKX1JTUF9GYml0X1NFVF9YIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19ub3JtYWxfZXZfcWZ5cnNfMTViW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfZiwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19ub3JtYWxfYWN0aW9uc18xNWJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZXRfdnNfbnIsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsyXSA9IGxsY19jb25uX2FjX3VwZF9wX2ZsYWcsCisJWzNdID0gbGxjX2Nvbm5fYWNfZGVjX3R4X3dpbl9zaXplLAorCVs0XSA9IGxsY19jb25uX2FjX3Jlc2VuZF9pX3h4eF94X3NldF8wLAorCVs1XSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5LAorCVs2XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19ub3JtYWxfc3RhdGVfdHJhbnNfMTViID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9yZWpfcnNwX2ZiaXRfc2V0X3gsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9OT1JNQUwsCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfbm9ybWFsX2V2X3FmeXJzXzE1YiwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19ub3JtYWxfYWN0aW9uc18xNWIsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfUkVKX0NNRF9QYml0X1NFVF8wIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19ub3JtYWxfZXZfcWZ5cnNfMTZhW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfMSwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19ub3JtYWxfYWN0aW9uc18xNmFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZXRfdnNfbnIsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsyXSA9IGxsY19jb25uX2FjX2RlY190eF93aW5fc2l6ZSwKKwlbM10gPSBsbGNfY29ubl9hY19yZXNlbmRfaV94eHhfeF9zZXRfMCwKKwlbNF0gPSBsbGNfY29ubl9hY19jbGVhcl9yZW1vdGVfYnVzeSwKKwlbNV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfbm9ybWFsX3N0YXRlX3RyYW5zXzE2YSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfcmVqX2NtZF9wYml0X3NldF8wLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfTk9STUFMLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX25vcm1hbF9ldl9xZnlyc18xNmEsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfbm9ybWFsX2FjdGlvbnNfMTZhLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JFSl9SU1BfRmJpdF9TRVRfMCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfbm9ybWFsX2V2X3FmeXJzXzE2YltdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxXzEsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfbm9ybWFsX2FjdGlvbnNfMTZiW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2V0X3ZzX25yLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMl0gPSBsbGNfY29ubl9hY19kZWNfdHhfd2luX3NpemUsCisJWzNdID0gbGxjX2Nvbm5fYWNfcmVzZW5kX2lfeHh4X3hfc2V0XzAsCisJWzRdID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3ksCisJWzVdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX25vcm1hbF9zdGF0ZV90cmFuc18xNmIgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3Jlal9yc3BfZmJpdF9zZXRfMCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX05PUk1BTCwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19ub3JtYWxfZXZfcWZ5cnNfMTZiLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX25vcm1hbF9hY3Rpb25zXzE2YiwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9SRUpfQ01EX1BiaXRfU0VUXzEgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfbm9ybWFsX2FjdGlvbnNfMTdbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZXRfdnNfbnIsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsyXSA9IGxsY19jb25uX2FjX2RlY190eF93aW5fc2l6ZSwKKwlbM10gPSBsbGNfY29ubl9hY19yZXNlbmRfaV9yc3BfZl9zZXRfMSwKKwlbNF0gPSBsbGNfY29ubl9hY19jbGVhcl9yZW1vdGVfYnVzeSwKKwlbNV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfbm9ybWFsX3N0YXRlX3RyYW5zXzE3ID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9yZWpfY21kX3BiaXRfc2V0XzEsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9OT1JNQUwsCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX25vcm1hbF9hY3Rpb25zXzE3LAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX0lOSVRfUF9GX0NZQ0xFIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19ub3JtYWxfZXZfcWZ5cnNfMThbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV8wLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX25vcm1hbF9hY3Rpb25zXzE4W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9ycl9jbWRfcF9zZXRfMSwKKwlbMV0gPSBsbGNfY29ubl9hY19zdGFydF9wX3RpbWVyLAorCVsyXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19ub3JtYWxfc3RhdGVfdHJhbnNfMTggPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X2luaXRfcF9mX2N5Y2xlLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfTk9STUFMLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX25vcm1hbF9ldl9xZnlyc18xOCwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19ub3JtYWxfYWN0aW9uc18xOCwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9QX1RNUl9FWFAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX25vcm1hbF9ldl9xZnlyc18xOVtdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcmV0cnlfY250X2x0X24yLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX25vcm1hbF9hY3Rpb25zXzE5W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfcnN0X3NlbmRhY2tfZmxhZywKKwlbMV0gPSBsbGNfY29ubl9hY19zZW5kX3JyX2NtZF9wX3NldF8xLAorCVsyXSA9IGxsY19jb25uX2FjX3JzdF92cywKKwlbM10gPSBsbGNfY29ubl9hY19zdGFydF9wX3RpbWVyLAorCVs0XSA9IGxsY19jb25uX2FjX2luY19yZXRyeV9jbnRfYnlfMSwKKwlbNV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfbm9ybWFsX3N0YXRlX3RyYW5zXzE5ID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9wX3Rtcl9leHAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BV0FJVCwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19ub3JtYWxfZXZfcWZ5cnNfMTksCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfbm9ybWFsX2FjdGlvbnNfMTksCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfQUNLX1RNUl9FWFAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX25vcm1hbF9ldl9xZnlyc18yMGFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV8wLAorCVsxXSA9IGxsY19jb25uX2V2X3FsZnlfcmV0cnlfY250X2x0X24yLAorCVsyXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX25vcm1hbF9hY3Rpb25zXzIwYVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3JzdF9zZW5kYWNrX2ZsYWcsCisJWzFdID0gbGxjX2Nvbm5fYWNfc2VuZF9ycl9jbWRfcF9zZXRfMSwKKwlbMl0gPSBsbGNfY29ubl9hY19yc3RfdnMsCisJWzNdID0gbGxjX2Nvbm5fYWNfc3RhcnRfcF90aW1lciwKKwlbNF0gPSBsbGNfY29ubl9hY19pbmNfcmV0cnlfY250X2J5XzEsCisJWzVdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX25vcm1hbF9zdGF0ZV90cmFuc18yMGEgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X2Fja190bXJfZXhwLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVQsCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfbm9ybWFsX2V2X3FmeXJzXzIwYSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19ub3JtYWxfYWN0aW9uc18yMGEsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfQlVTWV9UTVJfRVhQIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19ub3JtYWxfZXZfcWZ5cnNfMjBiW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfMCwKKwlbMV0gPSBsbGNfY29ubl9ldl9xbGZ5X3JldHJ5X2NudF9sdF9uMiwKKwlbMl0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19ub3JtYWxfYWN0aW9uc18yMGJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19yc3Rfc2VuZGFja19mbGFnLAorCVsxXSA9IGxsY19jb25uX2FjX3NlbmRfcnJfY21kX3Bfc2V0XzEsCisJWzJdID0gbGxjX2Nvbm5fYWNfcnN0X3ZzLAorCVszXSA9IGxsY19jb25uX2FjX3N0YXJ0X3BfdGltZXIsCisJWzRdID0gbGxjX2Nvbm5fYWNfaW5jX3JldHJ5X2NudF9ieV8xLAorCVs1XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19ub3JtYWxfc3RhdGVfdHJhbnNfMjBiID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9idXN5X3Rtcl9leHAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BV0FJVCwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19ub3JtYWxfZXZfcWZ5cnNfMjBiLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX25vcm1hbF9hY3Rpb25zXzIwYiwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9UWF9CVUZGX0ZVTEwgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX25vcm1hbF9ldl9xZnlyc18yMVtdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxXzAsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfbm9ybWFsX2FjdGlvbnNfMjFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX3JyX2NtZF9wX3NldF8xLAorCVsxXSA9IGxsY19jb25uX2FjX3N0YXJ0X3BfdGltZXIsCisJWzJdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX25vcm1hbF9zdGF0ZV90cmFuc18yMSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfdHhfYnVmZmVyX2Z1bGwsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9OT1JNQUwsCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfbm9ybWFsX2V2X3FmeXJzXzIxLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX25vcm1hbF9hY3Rpb25zXzIxLAorfTsKKworLyoKKyAqIEFycmF5IG9mIHBvaW50ZXJzOworICogb25lIHRvIGVhY2ggdHJhbnNpdGlvbgorICovCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zICpsbGNfbm9ybWFsX3N0YXRlX3RyYW5zaXRpb25zW10gPSB7CisJIFswXSA9ICZsbGNfbm9ybWFsX3N0YXRlX3RyYW5zXzEsCS8qIFJlcXVlc3RzICovCisJIFsxXSA9ICZsbGNfbm9ybWFsX3N0YXRlX3RyYW5zXzIsCisJIFsyXSA9ICZsbGNfbm9ybWFsX3N0YXRlX3RyYW5zXzJfMSwKKwkgWzNdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfMSwKKwkgWzRdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfMiwKKwkgWzVdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfZW5kLAorCSBbNl0gPSAmbGxjX25vcm1hbF9zdGF0ZV90cmFuc18yMSwKKwkgWzddID0gJmxsY19ub3JtYWxfc3RhdGVfdHJhbnNfMywJLyogTG9jYWwgYnVzeSAqLworCSBbOF0gPSAmbGxjX25vcm1hbF9zdGF0ZV90cmFuc180LAorCSBbOV0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc19lbmQsCisJWzEwXSA9ICZsbGNfbm9ybWFsX3N0YXRlX3RyYW5zXzE4LAkvKiBJbml0IHBmIGN5Y2xlICovCisJWzExXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zX2VuZCwKKwlbMTJdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfMTFhLAkvKiBUaW1lcnMgKi8KKwlbMTNdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfMTFiLAorCVsxNF0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc18xMWMsCisJWzE1XSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzExZCwKKwlbMTZdID0gJmxsY19ub3JtYWxfc3RhdGVfdHJhbnNfMTksCisJWzE3XSA9ICZsbGNfbm9ybWFsX3N0YXRlX3RyYW5zXzIwYSwKKwlbMThdID0gJmxsY19ub3JtYWxfc3RhdGVfdHJhbnNfMjBiLAorCVsxOV0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc19lbmQsCisJWzIwXSA9ICZsbGNfbm9ybWFsX3N0YXRlX3RyYW5zXzhiLAkvKiBSZWNlaXZlIGZyYW1lcyAqLworCVsyMV0gPSAmbGxjX25vcm1hbF9zdGF0ZV90cmFuc185YiwKKwlbMjJdID0gJmxsY19ub3JtYWxfc3RhdGVfdHJhbnNfMTAsCisJWzIzXSA9ICZsbGNfbm9ybWFsX3N0YXRlX3RyYW5zXzExYiwKKwlbMjRdID0gJmxsY19ub3JtYWxfc3RhdGVfdHJhbnNfMTFjLAorCVsyNV0gPSAmbGxjX25vcm1hbF9zdGF0ZV90cmFuc181YSwKKwlbMjZdID0gJmxsY19ub3JtYWxfc3RhdGVfdHJhbnNfNWIsCisJWzI3XSA9ICZsbGNfbm9ybWFsX3N0YXRlX3RyYW5zXzVjLAorCVsyOF0gPSAmbGxjX25vcm1hbF9zdGF0ZV90cmFuc182YSwKKwlbMjldID0gJmxsY19ub3JtYWxfc3RhdGVfdHJhbnNfNmIsCisJWzMwXSA9ICZsbGNfbm9ybWFsX3N0YXRlX3RyYW5zXzcsCisJWzMxXSA9ICZsbGNfbm9ybWFsX3N0YXRlX3RyYW5zXzhhLAorCVszMl0gPSAmbGxjX25vcm1hbF9zdGF0ZV90cmFuc185YSwKKwlbMzNdID0gJmxsY19ub3JtYWxfc3RhdGVfdHJhbnNfMTFhLAorCVszNF0gPSAmbGxjX25vcm1hbF9zdGF0ZV90cmFuc18xMiwKKwlbMzVdID0gJmxsY19ub3JtYWxfc3RhdGVfdHJhbnNfMTNhLAorCVszNl0gPSAmbGxjX25vcm1hbF9zdGF0ZV90cmFuc18xM2IsCisJWzM3XSA9ICZsbGNfbm9ybWFsX3N0YXRlX3RyYW5zXzEzYywKKwlbMzhdID0gJmxsY19ub3JtYWxfc3RhdGVfdHJhbnNfMTQsCisJWzM5XSA9ICZsbGNfbm9ybWFsX3N0YXRlX3RyYW5zXzE1YSwKKwlbNDBdID0gJmxsY19ub3JtYWxfc3RhdGVfdHJhbnNfMTViLAorCVs0MV0gPSAmbGxjX25vcm1hbF9zdGF0ZV90cmFuc18xNmEsCisJWzQyXSA9ICZsbGNfbm9ybWFsX3N0YXRlX3RyYW5zXzE2YiwKKwlbNDNdID0gJmxsY19ub3JtYWxfc3RhdGVfdHJhbnNfMTcsCisJWzQ0XSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzMsCisJWzQ1XSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzQsCisJWzQ2XSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzUsCisJWzQ3XSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzYsCisJWzQ4XSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzdhLAorCVs0OV0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc183YiwKKwlbNTBdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfOGEsCisJWzUxXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzhiLAorCVs1Ml0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc184YywKKwlbNTNdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfOSwKKwkvKiBbNTRdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfMTAsICovCisJWzU0XSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zX2VuZCwKK307CisKKy8qIExMQ19DT05OX1NUQVRFX0JVU1kgdHJhbnNpdGlvbnMgKi8KKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9EQVRBX1JFUSBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfYnVzeV9ldl9xZnlyc18xW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9yZW1vdGVfYnVzeV9lcV8wLAorCVsxXSA9IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxXzAsCisJWzJdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYnVzeV9hY3Rpb25zXzFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX2lfeHh4X3hfc2V0XzAsCisJWzFdID0gbGxjX2Nvbm5fYWNfc3RhcnRfYWNrX3Rtcl9pZl9ub3RfcnVubmluZywKKwlbMl0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYnVzeV9zdGF0ZV90cmFuc18xID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9kYXRhX3JlcSwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0JVU1ksCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfYnVzeV9ldl9xZnlyc18xLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2J1c3lfYWN0aW9uc18xLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX0RBVEFfUkVRIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19idXN5X2V2X3FmeXJzXzJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3JlbW90ZV9idXN5X2VxXzAsCisJWzFdID0gbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfMSwKKwlbMl0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19idXN5X2FjdGlvbnNfMltdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfaV94eHhfeF9zZXRfMCwKKwlbMV0gPSBsbGNfY29ubl9hY19zdGFydF9hY2tfdG1yX2lmX25vdF9ydW5uaW5nLAorCVsyXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19idXN5X3N0YXRlX3RyYW5zXzIgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X2RhdGFfcmVxLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQlVTWSwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19idXN5X2V2X3FmeXJzXzIsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYnVzeV9hY3Rpb25zXzIsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfREFUQV9SRVEgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX2J1c3lfZXZfcWZ5cnNfMl8xW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9yZW1vdGVfYnVzeV9lcV8xLAorCVsxXSA9IGxsY19jb25uX2V2X3FsZnlfc2V0X3N0YXR1c19yZW1vdGVfYnVzeSwKKwlbMl0gPSBOVUxMLAorfTsKKworLyoganVzdCBvbmUgbWVtYmVyLCBOVUxMLCAuYnNzIHplcm9lcyBpdCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19idXN5X2FjdGlvbnNfMl8xWzFdOworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19idXN5X3N0YXRlX3RyYW5zXzJfMSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfZGF0YV9yZXEsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9CVVNZLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX2J1c3lfZXZfcWZ5cnNfMl8xLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2J1c3lfYWN0aW9uc18yXzEsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfTE9DQUxfQlVTWV9DTEVBUkVEIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19idXN5X2V2X3FmeXJzXzNbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X2RhdGFfZmxhZ19lcV8xLAorCVsxXSA9IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxXzAsCisJWzJdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYnVzeV9hY3Rpb25zXzNbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX3Jlal94eHhfeF9zZXRfMCwKKwlbMV0gPSBsbGNfY29ubl9hY19zdGFydF9yZWpfdGltZXIsCisJWzJdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2J1c3lfc3RhdGVfdHJhbnNfMyA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfbG9jYWxfYnVzeV9jbGVhcmVkLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfUkVKLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX2J1c3lfZXZfcWZ5cnNfMywKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19idXN5X2FjdGlvbnNfMywKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9MT0NBTF9CVVNZX0NMRUFSRUQgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX2J1c3lfZXZfcWZ5cnNfNFtdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfZGF0YV9mbGFnX2VxXzEsCisJWzFdID0gbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfMSwKKwlbMl0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19idXN5X2FjdGlvbnNfNFtdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfcmVqX3h4eF94X3NldF8wLAorCVsxXSA9IGxsY19jb25uX2FjX3N0YXJ0X3Jlal90aW1lciwKKwlbMl0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYnVzeV9zdGF0ZV90cmFuc180ID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9sb2NhbF9idXN5X2NsZWFyZWQsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9SRUosCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfYnVzeV9ldl9xZnlyc180LAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2J1c3lfYWN0aW9uc180LAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX0xPQ0FMX0JVU1lfQ0xFQVJFRCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfYnVzeV9ldl9xZnlyc181W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9kYXRhX2ZsYWdfZXFfMCwKKwlbMV0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV8wLAorCVsyXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2J1c3lfYWN0aW9uc181W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9ycl94eHhfeF9zZXRfMCwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYnVzeV9zdGF0ZV90cmFuc181ID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9sb2NhbF9idXN5X2NsZWFyZWQsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9OT1JNQUwsCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfYnVzeV9ldl9xZnlyc181LAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2J1c3lfYWN0aW9uc181LAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX0xPQ0FMX0JVU1lfQ0xFQVJFRCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfYnVzeV9ldl9xZnlyc182W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9kYXRhX2ZsYWdfZXFfMCwKKwlbMV0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV8xLAorCVsyXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2J1c3lfYWN0aW9uc182W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9ycl94eHhfeF9zZXRfMCwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYnVzeV9zdGF0ZV90cmFuc182ID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9sb2NhbF9idXN5X2NsZWFyZWQsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9OT1JNQUwsCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfYnVzeV9ldl9xZnlyc182LAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2J1c3lfYWN0aW9uc182LAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX0xPQ0FMX0JVU1lfQ0xFQVJFRCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfYnVzeV9ldl9xZnlyc183W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9kYXRhX2ZsYWdfZXFfMiwKKwlbMV0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV8wLAorCVsyXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2J1c3lfYWN0aW9uc183W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9ycl94eHhfeF9zZXRfMCwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYnVzeV9zdGF0ZV90cmFuc183ID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9sb2NhbF9idXN5X2NsZWFyZWQsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9SRUosCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfYnVzeV9ldl9xZnlyc183LAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2J1c3lfYWN0aW9uc183LAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX0xPQ0FMX0JVU1lfQ0xFQVJFRCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfYnVzeV9ldl9xZnlyc184W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9kYXRhX2ZsYWdfZXFfMiwKKwlbMV0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV8xLAorCVsyXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2J1c3lfYWN0aW9uc184W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9ycl94eHhfeF9zZXRfMCwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYnVzeV9zdGF0ZV90cmFuc184ID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9sb2NhbF9idXN5X2NsZWFyZWQsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9SRUosCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfYnVzeV9ldl9xZnlyc184LAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2J1c3lfYWN0aW9uc184LAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0lfUlNQX0ZiaXRfU0VUX1hfVU5FWFBEX05zIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19idXN5X2V2X3FmeXJzXzlhW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfZiwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19idXN5X2FjdGlvbnNfOWFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19vcHRfc2VuZF9ybnJfeHh4X3hfc2V0XzAsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX3BfZmxhZywKKwlbMl0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzNdID0gbGxjX2Nvbm5fYWNfc2V0X2RhdGFfZmxhZ18xX2lmX2RhdGFfZmxhZ19lcV8wLAorCVs0XSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5X2lmX2ZfZXFfMSwKKwlbNV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYnVzeV9zdGF0ZV90cmFuc185YSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfaV9yc3BfZmJpdF9zZXRfeF91bmV4cGRfbnMsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9CVVNZLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX2J1c3lfZXZfcWZ5cnNfOWEsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYnVzeV9hY3Rpb25zXzlhLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0lfQ01EX1BiaXRfU0VUXzBfVU5FWFBEX05zIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19idXN5X2V2X3FmeXJzXzliW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfMCwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19idXN5X2FjdGlvbnNfOWJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19vcHRfc2VuZF9ybnJfeHh4X3hfc2V0XzAsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX3BfZmxhZywKKwlbMl0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzNdID0gbGxjX2Nvbm5fYWNfc2V0X2RhdGFfZmxhZ18xX2lmX2RhdGFfZmxhZ19lcV8wLAorCVs0XSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5X2lmX2ZfZXFfMSwKKwlbNV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYnVzeV9zdGF0ZV90cmFuc185YiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfaV9jbWRfcGJpdF9zZXRfMF91bmV4cGRfbnMsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9CVVNZLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX2J1c3lfZXZfcWZ5cnNfOWIsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYnVzeV9hY3Rpb25zXzliLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0lfUlNQX0ZiaXRfU0VUXzBfVU5FWFBEX05zIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19idXN5X2V2X3FmeXJzXzEwYVtdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxXzEsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYnVzeV9hY3Rpb25zXzEwYVtdID0geworCVswXSA9IGxsY19jb25uX2FjX29wdF9zZW5kX3Jucl94eHhfeF9zZXRfMCwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzJdID0gbGxjX2Nvbm5fYWNfc2V0X2RhdGFfZmxhZ18xX2lmX2RhdGFfZmxhZ19lcV8wLAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19idXN5X3N0YXRlX3RyYW5zXzEwYSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfaV9yc3BfZmJpdF9zZXRfMF91bmV4cGRfbnMsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9CVVNZLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX2J1c3lfZXZfcWZ5cnNfMTBhLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2J1c3lfYWN0aW9uc18xMGEsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfSV9DTURfUGJpdF9TRVRfMF9VTkVYUERfTnMgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX2J1c3lfZXZfcWZ5cnNfMTBiW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfMSwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19idXN5X2FjdGlvbnNfMTBiW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfb3B0X3NlbmRfcm5yX3h4eF94X3NldF8wLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMl0gPSBsbGNfY29ubl9hY19zZXRfZGF0YV9mbGFnXzFfaWZfZGF0YV9mbGFnX2VxXzAsCisJWzNdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2J1c3lfc3RhdGVfdHJhbnNfMTBiID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9pX2NtZF9wYml0X3NldF8wX3VuZXhwZF9ucywKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0JVU1ksCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfYnVzeV9ldl9xZnlyc18xMGIsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYnVzeV9hY3Rpb25zXzEwYiwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9JX0NNRF9QYml0X1NFVF8xX1VORVhQRF9OcyBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19idXN5X2FjdGlvbnNfMTFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX3Jucl9yc3BfZl9zZXRfMSwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzJdID0gbGxjX2Nvbm5fYWNfc2V0X2RhdGFfZmxhZ18xX2lmX2RhdGFfZmxhZ19lcV8wLAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19idXN5X3N0YXRlX3RyYW5zXzExID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9pX2NtZF9wYml0X3NldF8xX3VuZXhwZF9ucywKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0JVU1ksCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2J1c3lfYWN0aW9uc18xMSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9JX0NNRF9QYml0X1NFVF8xIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2J1c3lfYWN0aW9uc18xMltdID0geworCVswXSA9IGxsY19jb25uX2FjX2luY192cl9ieV8xLAorCVsxXSA9IGxsY19jb25uX2FjX2RhdGFfaW5kLAorCVsyXSA9IGxsY19jb25uX2FjX3NlbmRfcm5yX3JzcF9mX3NldF8xLAorCVszXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbNF0gPSBsbGNfY29ubl9hY19zdG9wX3Jlal90bXJfaWZfZGF0YV9mbGFnX2VxXzIsCisJWzVdID0gbGxjX2Nvbm5fYWNfc2V0X2RhdGFfZmxhZ18wLAorCVs2XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19idXN5X3N0YXRlX3RyYW5zXzEyID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9pX2NtZF9wYml0X3NldF8xLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQlVTWSwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYnVzeV9hY3Rpb25zXzEyLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0lfUlNQX0ZiaXRfU0VUX1ggZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX2J1c3lfZXZfcWZ5cnNfMTNhW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfZiwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19idXN5X2FjdGlvbnNfMTNhW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfaW5jX3ZyX2J5XzEsCisJWzFdID0gbGxjX2Nvbm5fYWNfZGF0YV9pbmQsCisJWzJdID0gbGxjX2Nvbm5fYWNfdXBkX3BfZmxhZywKKwlbM10gPSBsbGNfY29ubl9hY19vcHRfc2VuZF9ybnJfeHh4X3hfc2V0XzAsCisJWzRdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVs1XSA9IGxsY19jb25uX2FjX3N0b3BfcmVqX3Rtcl9pZl9kYXRhX2ZsYWdfZXFfMiwKKwlbNl0gPSBsbGNfY29ubl9hY19zZXRfZGF0YV9mbGFnXzAsCisJWzddID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3lfaWZfZl9lcV8xLAorCVs4XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19idXN5X3N0YXRlX3RyYW5zXzEzYSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfaV9yc3BfZmJpdF9zZXRfeCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0JVU1ksCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfYnVzeV9ldl9xZnlyc18xM2EsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYnVzeV9hY3Rpb25zXzEzYSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9JX0NNRF9QYml0X1NFVF8wIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19idXN5X2V2X3FmeXJzXzEzYltdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxXzAsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYnVzeV9hY3Rpb25zXzEzYltdID0geworCVswXSA9IGxsY19jb25uX2FjX2luY192cl9ieV8xLAorCVsxXSA9IGxsY19jb25uX2FjX2RhdGFfaW5kLAorCVsyXSA9IGxsY19jb25uX2FjX3VwZF9wX2ZsYWcsCisJWzNdID0gbGxjX2Nvbm5fYWNfb3B0X3NlbmRfcm5yX3h4eF94X3NldF8wLAorCVs0XSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbNV0gPSBsbGNfY29ubl9hY19zdG9wX3Jlal90bXJfaWZfZGF0YV9mbGFnX2VxXzIsCisJWzZdID0gbGxjX2Nvbm5fYWNfc2V0X2RhdGFfZmxhZ18wLAorCVs3XSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5X2lmX2ZfZXFfMSwKKwlbOF0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYnVzeV9zdGF0ZV90cmFuc18xM2IgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X2lfY21kX3BiaXRfc2V0XzAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9CVVNZLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX2J1c3lfZXZfcWZ5cnNfMTNiLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2J1c3lfYWN0aW9uc18xM2IsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfSV9SU1BfRmJpdF9TRVRfMCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfYnVzeV9ldl9xZnlyc18xNGFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV8xLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2J1c3lfYWN0aW9uc18xNGFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19pbmNfdnJfYnlfMSwKKwlbMV0gPSBsbGNfY29ubl9hY19kYXRhX2luZCwKKwlbMl0gPSBsbGNfY29ubl9hY19vcHRfc2VuZF9ybnJfeHh4X3hfc2V0XzAsCisJWzNdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVs0XSA9IGxsY19jb25uX2FjX3N0b3BfcmVqX3Rtcl9pZl9kYXRhX2ZsYWdfZXFfMiwKKwlbNV0gPSBsbGNfY29ubl9hY19zZXRfZGF0YV9mbGFnXzAsCisJWzZdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2J1c3lfc3RhdGVfdHJhbnNfMTRhID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9pX3JzcF9mYml0X3NldF8wLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQlVTWSwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19idXN5X2V2X3FmeXJzXzE0YSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19idXN5X2FjdGlvbnNfMTRhLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0lfQ01EX1BiaXRfU0VUXzAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX2J1c3lfZXZfcWZ5cnNfMTRiW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfMSwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19idXN5X2FjdGlvbnNfMTRiW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfaW5jX3ZyX2J5XzEsCisJWzFdID0gbGxjX2Nvbm5fYWNfZGF0YV9pbmQsCisJWzJdID0gbGxjX2Nvbm5fYWNfb3B0X3NlbmRfcm5yX3h4eF94X3NldF8wLAorCVszXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbNF0gPSBsbGNfY29ubl9hY19zdG9wX3Jlal90bXJfaWZfZGF0YV9mbGFnX2VxXzIsCisJWzVdID0gbGxjX2Nvbm5fYWNfc2V0X2RhdGFfZmxhZ18wLAorCVs2XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19idXN5X3N0YXRlX3RyYW5zXzE0YiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfaV9jbWRfcGJpdF9zZXRfMCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0JVU1ksCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfYnVzeV9ldl9xZnlyc18xNGIsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYnVzeV9hY3Rpb25zXzE0YiwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9SUl9DTURfUGJpdF9TRVRfMCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19idXN5X2FjdGlvbnNfMTVhW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfdXBkX3BfZmxhZywKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzJdID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3ksCisJWzNdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2J1c3lfc3RhdGVfdHJhbnNfMTVhID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9ycl9jbWRfcGJpdF9zZXRfMCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0JVU1ksCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2J1c3lfYWN0aW9uc18xNWEsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfUlJfUlNQX0ZiaXRfU0VUXzAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYnVzeV9hY3Rpb25zXzE1YltdID0geworCVswXSA9IGxsY19jb25uX2FjX3VwZF9wX2ZsYWcsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsyXSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5LAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19idXN5X3N0YXRlX3RyYW5zXzE1YiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfcnJfcnNwX2ZiaXRfc2V0XzAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9CVVNZLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19idXN5X2FjdGlvbnNfMTViLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JSX1JTUF9GYml0X1NFVF8xIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19idXN5X2V2X3FmeXJzXzE1Y1tdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxXzEsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYnVzeV9hY3Rpb25zXzE1Y1tdID0geworCVswXSA9IGxsY19jb25uX2FjX3VwZF9wX2ZsYWcsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsyXSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5LAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19idXN5X3N0YXRlX3RyYW5zXzE1YyA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfcnJfcnNwX2ZiaXRfc2V0XzEsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9CVVNZLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX2J1c3lfZXZfcWZ5cnNfMTVjLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2J1c3lfYWN0aW9uc18xNWMsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfUlJfQ01EX1BiaXRfU0VUXzEgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYnVzeV9hY3Rpb25zXzE2W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9ybnJfcnNwX2Zfc2V0XzEsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsyXSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5LAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19idXN5X3N0YXRlX3RyYW5zXzE2ID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9ycl9jbWRfcGJpdF9zZXRfMSwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0JVU1ksCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2J1c3lfYWN0aW9uc18xNiwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9STlJfQ01EX1BiaXRfU0VUXzAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYnVzeV9hY3Rpb25zXzE3YVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3VwZF9wX2ZsYWcsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsyXSA9IGxsY19jb25uX2FjX3NldF9yZW1vdGVfYnVzeSwKKwlbM10gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYnVzeV9zdGF0ZV90cmFuc18xN2EgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3Jucl9jbWRfcGJpdF9zZXRfMCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0JVU1ksCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2J1c3lfYWN0aW9uc18xN2EsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfUk5SX1JTUF9GYml0X1NFVF8wIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2J1c3lfYWN0aW9uc18xN2JbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY191cGRfcF9mbGFnLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMl0gPSBsbGNfY29ubl9hY19zZXRfcmVtb3RlX2J1c3ksCisJWzNdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2J1c3lfc3RhdGVfdHJhbnNfMTdiID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9ybnJfcnNwX2ZiaXRfc2V0XzAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9CVVNZLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19idXN5X2FjdGlvbnNfMTdiLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JOUl9SU1BfRmJpdF9TRVRfMSBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfYnVzeV9ldl9xZnlyc18xN2NbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV8xLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2J1c3lfYWN0aW9uc18xN2NbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY191cGRfcF9mbGFnLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMl0gPSBsbGNfY29ubl9hY19zZXRfcmVtb3RlX2J1c3ksCisJWzNdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2J1c3lfc3RhdGVfdHJhbnNfMTdjID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9ybnJfcnNwX2ZiaXRfc2V0XzEsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9CVVNZLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX2J1c3lfZXZfcWZ5cnNfMTdjLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2J1c3lfYWN0aW9uc18xN2MsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfUk5SX0NNRF9QYml0X1NFVF8xIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2J1c3lfYWN0aW9uc18xOFtdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfcm5yX3JzcF9mX3NldF8xLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMl0gPSBsbGNfY29ubl9hY19zZXRfcmVtb3RlX2J1c3ksCisJWzNdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2J1c3lfc3RhdGVfdHJhbnNfMTggPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3Jucl9jbWRfcGJpdF9zZXRfMSwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0JVU1ksCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2J1c3lfYWN0aW9uc18xOCwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9SRUpfQ01EX1BiaXRfU0VUXzAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX2J1c3lfZXZfcWZ5cnNfMTlhW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfMCwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19idXN5X2FjdGlvbnNfMTlhW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2V0X3ZzX25yLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMl0gPSBsbGNfY29ubl9hY191cGRfcF9mbGFnLAorCVszXSA9IGxsY19jb25uX2FjX3Jlc2VuZF9pX3h4eF94X3NldF8wLAorCVs0XSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5LAorCVs1XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19idXN5X3N0YXRlX3RyYW5zXzE5YSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfcmVqX2NtZF9wYml0X3NldF8wLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQlVTWSwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19idXN5X2V2X3FmeXJzXzE5YSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19idXN5X2FjdGlvbnNfMTlhLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JFSl9SU1BfRmJpdF9TRVRfWCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfYnVzeV9ldl9xZnlyc18xOWJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV9mLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2J1c3lfYWN0aW9uc18xOWJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZXRfdnNfbnIsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsyXSA9IGxsY19jb25uX2FjX3VwZF9wX2ZsYWcsCisJWzNdID0gbGxjX2Nvbm5fYWNfcmVzZW5kX2lfeHh4X3hfc2V0XzAsCisJWzRdID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3ksCisJWzVdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2J1c3lfc3RhdGVfdHJhbnNfMTliID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9yZWpfcnNwX2ZiaXRfc2V0X3gsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9CVVNZLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX2J1c3lfZXZfcWZ5cnNfMTliLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2J1c3lfYWN0aW9uc18xOWIsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfUkVKX0NNRF9QYml0X1NFVF8wIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19idXN5X2V2X3FmeXJzXzIwYVtdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxXzEsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYnVzeV9hY3Rpb25zXzIwYVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3NldF92c19uciwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzJdID0gbGxjX2Nvbm5fYWNfcmVzZW5kX2lfeHh4X3hfc2V0XzAsCisJWzNdID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3ksCisJWzRdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2J1c3lfc3RhdGVfdHJhbnNfMjBhID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9yZWpfY21kX3BiaXRfc2V0XzAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9CVVNZLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX2J1c3lfZXZfcWZ5cnNfMjBhLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2J1c3lfYWN0aW9uc18yMGEsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfUkVKX1JTUF9GYml0X1NFVF8wIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19idXN5X2V2X3FmeXJzXzIwYltdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxXzEsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYnVzeV9hY3Rpb25zXzIwYltdID0geworCVswXSA9IGxsY19jb25uX2FjX3NldF92c19uciwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzJdID0gbGxjX2Nvbm5fYWNfcmVzZW5kX2lfeHh4X3hfc2V0XzAsCisJWzNdID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3ksCisJWzRdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2J1c3lfc3RhdGVfdHJhbnNfMjBiID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9yZWpfcnNwX2ZiaXRfc2V0XzAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9CVVNZLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX2J1c3lfZXZfcWZ5cnNfMjBiLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2J1c3lfYWN0aW9uc18yMGIsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfUkVKX0NNRF9QYml0X1NFVF8xIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2J1c3lfYWN0aW9uc18yMVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3NldF92c19uciwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzJdID0gbGxjX2Nvbm5fYWNfc2VuZF9ybnJfcnNwX2Zfc2V0XzEsCisJWzNdID0gbGxjX2Nvbm5fYWNfcmVzZW5kX2lfeHh4X3hfc2V0XzAsCisJWzRdID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3ksCisJWzVdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2J1c3lfc3RhdGVfdHJhbnNfMjEgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3Jlal9jbWRfcGJpdF9zZXRfMSwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0JVU1ksCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2J1c3lfYWN0aW9uc18yMSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9JTklUX1BfRl9DWUNMRSBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfYnVzeV9ldl9xZnlyc18yMltdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxXzAsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYnVzeV9hY3Rpb25zXzIyW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9ybnJfY21kX3Bfc2V0XzEsCisJWzFdID0gbGxjX2Nvbm5fYWNfc3RhcnRfcF90aW1lciwKKwlbMl0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYnVzeV9zdGF0ZV90cmFuc18yMiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfaW5pdF9wX2ZfY3ljbGUsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9CVVNZLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX2J1c3lfZXZfcWZ5cnNfMjIsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYnVzeV9hY3Rpb25zXzIyLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1BfVE1SX0VYUCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfYnVzeV9ldl9xZnlyc18yM1tdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcmV0cnlfY250X2x0X24yLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2J1c3lfYWN0aW9uc18yM1tdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfcm5yX2NtZF9wX3NldF8xLAorCVsxXSA9IGxsY19jb25uX2FjX3JzdF92cywKKwlbMl0gPSBsbGNfY29ubl9hY19zdGFydF9wX3RpbWVyLAorCVszXSA9IGxsY19jb25uX2FjX2luY19yZXRyeV9jbnRfYnlfMSwKKwlbNF0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYnVzeV9zdGF0ZV90cmFuc18yMyA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcF90bXJfZXhwLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVRfQlVTWSwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19idXN5X2V2X3FmeXJzXzIzLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2J1c3lfYWN0aW9uc18yMywKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9BQ0tfVE1SX0VYUCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfYnVzeV9ldl9xZnlyc18yNGFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV8wLAorCVsxXSA9IGxsY19jb25uX2V2X3FsZnlfcmV0cnlfY250X2x0X24yLAorCVsyXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2J1c3lfYWN0aW9uc18yNGFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX3Jucl9jbWRfcF9zZXRfMSwKKwlbMV0gPSBsbGNfY29ubl9hY19zdGFydF9wX3RpbWVyLAorCVsyXSA9IGxsY19jb25uX2FjX2luY19yZXRyeV9jbnRfYnlfMSwKKwlbM10gPSBsbGNfY29ubl9hY19yc3RfdnMsCisJWzRdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2J1c3lfc3RhdGVfdHJhbnNfMjRhID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9hY2tfdG1yX2V4cCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FXQUlUX0JVU1ksCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfYnVzeV9ldl9xZnlyc18yNGEsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYnVzeV9hY3Rpb25zXzI0YSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9CVVNZX1RNUl9FWFAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX2J1c3lfZXZfcWZ5cnNfMjRiW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfMCwKKwlbMV0gPSBsbGNfY29ubl9ldl9xbGZ5X3JldHJ5X2NudF9sdF9uMiwKKwlbMl0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19idXN5X2FjdGlvbnNfMjRiW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9ybnJfY21kX3Bfc2V0XzEsCisJWzFdID0gbGxjX2Nvbm5fYWNfc3RhcnRfcF90aW1lciwKKwlbMl0gPSBsbGNfY29ubl9hY19pbmNfcmV0cnlfY250X2J5XzEsCisJWzNdID0gbGxjX2Nvbm5fYWNfcnN0X3ZzLAorCVs0XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19idXN5X3N0YXRlX3RyYW5zXzI0YiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfYnVzeV90bXJfZXhwLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVRfQlVTWSwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19idXN5X2V2X3FmeXJzXzI0YiwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19idXN5X2FjdGlvbnNfMjRiLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JFSl9UTVJfRVhQIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19idXN5X2V2X3FmeXJzXzI1W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfMCwKKwlbMV0gPSBsbGNfY29ubl9ldl9xbGZ5X3JldHJ5X2NudF9sdF9uMiwKKwlbMl0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19idXN5X2FjdGlvbnNfMjVbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX3Jucl9jbWRfcF9zZXRfMSwKKwlbMV0gPSBsbGNfY29ubl9hY19zdGFydF9wX3RpbWVyLAorCVsyXSA9IGxsY19jb25uX2FjX2luY19yZXRyeV9jbnRfYnlfMSwKKwlbM10gPSBsbGNfY29ubl9hY19yc3RfdnMsCisJWzRdID0gbGxjX2Nvbm5fYWNfc2V0X2RhdGFfZmxhZ18xLAorCVs1XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19idXN5X3N0YXRlX3RyYW5zXzI1ID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yZWpfdG1yX2V4cCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FXQUlUX0JVU1ksCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfYnVzeV9ldl9xZnlyc18yNSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19idXN5X2FjdGlvbnNfMjUsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUkVKX1RNUl9FWFAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX2J1c3lfZXZfcWZ5cnNfMjZbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV8xLAorCVsxXSA9IGxsY19jb25uX2V2X3FsZnlfcmV0cnlfY250X2x0X24yLAorCVsyXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2J1c3lfYWN0aW9uc18yNltdID0geworCVswXSA9IGxsY19jb25uX2FjX3NldF9kYXRhX2ZsYWdfMSwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYnVzeV9zdGF0ZV90cmFuc18yNiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcmVqX3Rtcl9leHAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9CVVNZLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX2J1c3lfZXZfcWZ5cnNfMjYsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYnVzeV9hY3Rpb25zXzI2LAorfTsKKworLyoKKyAqIEFycmF5IG9mIHBvaW50ZXJzOworICogb25lIHRvIGVhY2ggdHJhbnNpdGlvbgorICovCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zICpsbGNfYnVzeV9zdGF0ZV90cmFuc2l0aW9uc1tdID0geworCSBbMF0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc18xLAkvKiBSZXF1ZXN0ICovCisJIFsxXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzIsCisJIFsyXSA9ICZsbGNfYnVzeV9zdGF0ZV90cmFuc18xLAorCSBbM10gPSAmbGxjX2J1c3lfc3RhdGVfdHJhbnNfMiwKKwkgWzRdID0gJmxsY19idXN5X3N0YXRlX3RyYW5zXzJfMSwKKwkgWzVdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfZW5kLAorCSBbNl0gPSAmbGxjX2J1c3lfc3RhdGVfdHJhbnNfMywJCS8qIExvY2FsIGJ1c3kgKi8KKwkgWzddID0gJmxsY19idXN5X3N0YXRlX3RyYW5zXzQsCisJIFs4XSA9ICZsbGNfYnVzeV9zdGF0ZV90cmFuc181LAorCSBbOV0gPSAmbGxjX2J1c3lfc3RhdGVfdHJhbnNfNiwKKwlbMTBdID0gJmxsY19idXN5X3N0YXRlX3RyYW5zXzcsCisJWzExXSA9ICZsbGNfYnVzeV9zdGF0ZV90cmFuc184LAorCVsxMl0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc19lbmQsCisJWzEzXSA9ICZsbGNfYnVzeV9zdGF0ZV90cmFuc18yMiwJLyogSW5pdGlhdGUgUEYgY3ljbGUgKi8KKwlbMTRdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfZW5kLAorCVsxNV0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc18xMWEsCS8qIFRpbWVyICovCisJWzE2XSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzExYiwKKwlbMTddID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfMTFjLAorCVsxOF0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc18xMWQsCisJWzE5XSA9ICZsbGNfYnVzeV9zdGF0ZV90cmFuc18yMywKKwlbMjBdID0gJmxsY19idXN5X3N0YXRlX3RyYW5zXzI0YSwKKwlbMjFdID0gJmxsY19idXN5X3N0YXRlX3RyYW5zXzI0YiwKKwlbMjJdID0gJmxsY19idXN5X3N0YXRlX3RyYW5zXzI1LAorCVsyM10gPSAmbGxjX2J1c3lfc3RhdGVfdHJhbnNfMjYsCisJWzI0XSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zX2VuZCwKKwlbMjVdID0gJmxsY19idXN5X3N0YXRlX3RyYW5zXzlhLAkvKiBSZWNlaXZlIGZyYW1lICovCisJWzI2XSA9ICZsbGNfYnVzeV9zdGF0ZV90cmFuc185YiwKKwlbMjddID0gJmxsY19idXN5X3N0YXRlX3RyYW5zXzEwYSwKKwlbMjhdID0gJmxsY19idXN5X3N0YXRlX3RyYW5zXzEwYiwKKwlbMjldID0gJmxsY19idXN5X3N0YXRlX3RyYW5zXzExLAorCVszMF0gPSAmbGxjX2J1c3lfc3RhdGVfdHJhbnNfMTIsCisJWzMxXSA9ICZsbGNfYnVzeV9zdGF0ZV90cmFuc18xM2EsCisJWzMyXSA9ICZsbGNfYnVzeV9zdGF0ZV90cmFuc18xM2IsCisJWzMzXSA9ICZsbGNfYnVzeV9zdGF0ZV90cmFuc18xNGEsCisJWzM0XSA9ICZsbGNfYnVzeV9zdGF0ZV90cmFuc18xNGIsCisJWzM1XSA9ICZsbGNfYnVzeV9zdGF0ZV90cmFuc18xNWEsCisJWzM2XSA9ICZsbGNfYnVzeV9zdGF0ZV90cmFuc18xNWIsCisJWzM3XSA9ICZsbGNfYnVzeV9zdGF0ZV90cmFuc18xNWMsCisJWzM4XSA9ICZsbGNfYnVzeV9zdGF0ZV90cmFuc18xNiwKKwlbMzldID0gJmxsY19idXN5X3N0YXRlX3RyYW5zXzE3YSwKKwlbNDBdID0gJmxsY19idXN5X3N0YXRlX3RyYW5zXzE3YiwKKwlbNDFdID0gJmxsY19idXN5X3N0YXRlX3RyYW5zXzE3YywKKwlbNDJdID0gJmxsY19idXN5X3N0YXRlX3RyYW5zXzE4LAorCVs0M10gPSAmbGxjX2J1c3lfc3RhdGVfdHJhbnNfMTlhLAorCVs0NF0gPSAmbGxjX2J1c3lfc3RhdGVfdHJhbnNfMTliLAorCVs0NV0gPSAmbGxjX2J1c3lfc3RhdGVfdHJhbnNfMjBhLAorCVs0Nl0gPSAmbGxjX2J1c3lfc3RhdGVfdHJhbnNfMjBiLAorCVs0N10gPSAmbGxjX2J1c3lfc3RhdGVfdHJhbnNfMjEsCisJWzQ4XSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzMsCisJWzQ5XSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzQsCisJWzUwXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzUsCisJWzUxXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzYsCisJWzUyXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzdhLAorCVs1M10gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc183YiwKKwlbNTRdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfOGEsCisJWzU1XSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzhiLAorCVs1Nl0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc184YywKKwlbNTddID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfOSwKKwkvKiBbNThdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfMTAsICovCisJWzU4XSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zX2VuZCwKK307CisKKy8qIExMQ19DT05OX1NUQVRFX1JFSiB0cmFuc2l0aW9ucyAqLworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX0RBVEFfUkVRIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19yZWplY3RfZXZfcWZ5cnNfMVtdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcmVtb3RlX2J1c3lfZXFfMCwKKwlbMV0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV8wLAorCVsyXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX3JlamVjdF9hY3Rpb25zXzFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX2lfeHh4X3hfc2V0XzAsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX3JlamVjdF9zdGF0ZV90cmFuc18xID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9kYXRhX3JlcSwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX1JFSiwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19yZWplY3RfZXZfcWZ5cnNfMSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19yZWplY3RfYWN0aW9uc18xLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX0RBVEFfUkVRIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19yZWplY3RfZXZfcWZ5cnNfMltdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcmVtb3RlX2J1c3lfZXFfMCwKKwlbMV0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV8xLAorCVsyXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX3JlamVjdF9hY3Rpb25zXzJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX2lfeHh4X3hfc2V0XzAsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX3JlamVjdF9zdGF0ZV90cmFuc18yID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9kYXRhX3JlcSwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX1JFSiwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19yZWplY3RfZXZfcWZ5cnNfMiwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19yZWplY3RfYWN0aW9uc18yLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX0RBVEFfUkVRIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19yZWplY3RfZXZfcWZ5cnNfMl8xW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9yZW1vdGVfYnVzeV9lcV8xLAorCVsxXSA9IGxsY19jb25uX2V2X3FsZnlfc2V0X3N0YXR1c19yZW1vdGVfYnVzeSwKKwlbMl0gPSBOVUxMLAorfTsKKworLyoganVzdCBvbmUgbWVtYmVyLCBOVUxMLCAuYnNzIHplcm9lcyBpdCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19yZWplY3RfYWN0aW9uc18yXzFbMV07CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX3JlamVjdF9zdGF0ZV90cmFuc18yXzEgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X2RhdGFfcmVxLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfUkVKLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX3JlamVjdF9ldl9xZnlyc18yXzEsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfcmVqZWN0X2FjdGlvbnNfMl8xLAorfTsKKworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfTE9DQUxfQlVTWV9ERVRFQ1RFRCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfcmVqZWN0X2V2X3FmeXJzXzNbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV8wLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX3JlamVjdF9hY3Rpb25zXzNbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX3Jucl94eHhfeF9zZXRfMCwKKwlbMV0gPSBsbGNfY29ubl9hY19zZXRfZGF0YV9mbGFnXzIsCisJWzJdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX3JlamVjdF9zdGF0ZV90cmFuc18zID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9sb2NhbF9idXN5X2RldGVjdGVkLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQlVTWSwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19yZWplY3RfZXZfcWZ5cnNfMywKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19yZWplY3RfYWN0aW9uc18zLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX0xPQ0FMX0JVU1lfREVURUNURUQgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX3JlamVjdF9ldl9xZnlyc180W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfMSwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19yZWplY3RfYWN0aW9uc180W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9ybnJfeHh4X3hfc2V0XzAsCisJWzFdID0gbGxjX2Nvbm5fYWNfc2V0X2RhdGFfZmxhZ18yLAorCVsyXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19yZWplY3Rfc3RhdGVfdHJhbnNfNCA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfbG9jYWxfYnVzeV9kZXRlY3RlZCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0JVU1ksCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfcmVqZWN0X2V2X3FmeXJzXzQsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfcmVqZWN0X2FjdGlvbnNfNCwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9JX0NNRF9QYml0X1NFVF8wX1VORVhQRF9OcyBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19yZWplY3RfYWN0aW9uc181YVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfcF9mbGFnLAorCVsyXSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5X2lmX2ZfZXFfMSwKKwlbM10gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfcmVqZWN0X3N0YXRlX3RyYW5zXzVhID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9pX2NtZF9wYml0X3NldF8wX3VuZXhwZF9ucywKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX1JFSiwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfcmVqZWN0X2FjdGlvbnNfNWEsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfSV9SU1BfRmJpdF9TRVRfMF9VTkVYUERfTnMgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfcmVqZWN0X2FjdGlvbnNfNWJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX3BfZmxhZywKKwlbMl0gPSBsbGNfY29ubl9hY19jbGVhcl9yZW1vdGVfYnVzeV9pZl9mX2VxXzEsCisJWzNdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX3JlamVjdF9zdGF0ZV90cmFuc181YiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfaV9yc3BfZmJpdF9zZXRfMF91bmV4cGRfbnMsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9SRUosCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX3JlamVjdF9hY3Rpb25zXzViLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0lfUlNQX0ZiaXRfU0VUXzFfVU5FWFBEX05zIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19yZWplY3RfZXZfcWZ5cnNfNWNbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV8xLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX3JlamVjdF9hY3Rpb25zXzVjW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF9wX2ZsYWcsCisJWzJdID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3lfaWZfZl9lcV8xLAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19yZWplY3Rfc3RhdGVfdHJhbnNfNWMgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X2lfcnNwX2ZiaXRfc2V0XzFfdW5leHBkX25zLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfUkVKLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX3JlamVjdF9ldl9xZnlyc181YywKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19yZWplY3RfYWN0aW9uc181YywKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9JX0NNRF9QYml0X1NFVF8xX1VORVhQRF9OcyBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19yZWplY3RfYWN0aW9uc182W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9ycl9yc3BfZl9zZXRfMSwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzJdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX3JlamVjdF9zdGF0ZV90cmFuc182ID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9pX2NtZF9wYml0X3NldF8xX3VuZXhwZF9ucywKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX1JFSiwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfcmVqZWN0X2FjdGlvbnNfNiwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9JX1JTUF9GYml0X1NFVF9YIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19yZWplY3RfZXZfcWZ5cnNfN2FbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV9mLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX3JlamVjdF9hY3Rpb25zXzdhW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfaW5jX3ZyX2J5XzEsCisJWzFdID0gbGxjX2Nvbm5fYWNfZGF0YV9pbmQsCisJWzJdID0gbGxjX2Nvbm5fYWNfdXBkX3BfZmxhZywKKwlbM10gPSBsbGNfY29ubl9hY19zZW5kX2Fja194eHhfeF9zZXRfMCwKKwlbNF0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzVdID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3lfaWZfZl9lcV8xLAorCVs2XSA9IGxsY19jb25uX2FjX3N0b3BfcmVqX3RpbWVyLAorCVs3XSA9IE5VTEwsCisKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX3JlamVjdF9zdGF0ZV90cmFuc183YSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfaV9yc3BfZmJpdF9zZXRfeCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX05PUk1BTCwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19yZWplY3RfZXZfcWZ5cnNfN2EsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfcmVqZWN0X2FjdGlvbnNfN2EsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfSV9DTURfUGJpdF9TRVRfMCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfcmVqZWN0X2V2X3FmeXJzXzdiW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfMCwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19yZWplY3RfYWN0aW9uc183YltdID0geworCVswXSA9IGxsY19jb25uX2FjX2luY192cl9ieV8xLAorCVsxXSA9IGxsY19jb25uX2FjX2RhdGFfaW5kLAorCVsyXSA9IGxsY19jb25uX2FjX3VwZF9wX2ZsYWcsCisJWzNdID0gbGxjX2Nvbm5fYWNfc2VuZF9hY2tfeHh4X3hfc2V0XzAsCisJWzRdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVs1XSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5X2lmX2ZfZXFfMSwKKwlbNl0gPSBsbGNfY29ubl9hY19zdG9wX3Jlal90aW1lciwKKwlbN10gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfcmVqZWN0X3N0YXRlX3RyYW5zXzdiID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9pX2NtZF9wYml0X3NldF8wLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfTk9STUFMLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX3JlamVjdF9ldl9xZnlyc183YiwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19yZWplY3RfYWN0aW9uc183YiwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9JX1JTUF9GYml0X1NFVF8wIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19yZWplY3RfZXZfcWZ5cnNfOGFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV8xLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX3JlamVjdF9hY3Rpb25zXzhhW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfaW5jX3ZyX2J5XzEsCisJWzFdID0gbGxjX2Nvbm5fYWNfZGF0YV9pbmQsCisJWzJdID0gbGxjX2Nvbm5fYWNfc2VuZF9hY2tfeHh4X3hfc2V0XzAsCisJWzNdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVs0XSA9IGxsY19jb25uX2FjX3N0b3BfcmVqX3RpbWVyLAorCVs1XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19yZWplY3Rfc3RhdGVfdHJhbnNfOGEgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X2lfcnNwX2ZiaXRfc2V0XzAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9OT1JNQUwsCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfcmVqZWN0X2V2X3FmeXJzXzhhLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX3JlamVjdF9hY3Rpb25zXzhhLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0lfQ01EX1BiaXRfU0VUXzAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX3JlamVjdF9ldl9xZnlyc184YltdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxXzEsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfcmVqZWN0X2FjdGlvbnNfOGJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19pbmNfdnJfYnlfMSwKKwlbMV0gPSBsbGNfY29ubl9hY19kYXRhX2luZCwKKwlbMl0gPSBsbGNfY29ubl9hY19zZW5kX2Fja194eHhfeF9zZXRfMCwKKwlbM10gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzRdID0gbGxjX2Nvbm5fYWNfc3RvcF9yZWpfdGltZXIsCisJWzVdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX3JlamVjdF9zdGF0ZV90cmFuc184YiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfaV9jbWRfcGJpdF9zZXRfMCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX05PUk1BTCwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19yZWplY3RfZXZfcWZ5cnNfOGIsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfcmVqZWN0X2FjdGlvbnNfOGIsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfSV9DTURfUGJpdF9TRVRfMSBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19yZWplY3RfYWN0aW9uc185W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfaW5jX3ZyX2J5XzEsCisJWzFdID0gbGxjX2Nvbm5fYWNfZGF0YV9pbmQsCisJWzJdID0gbGxjX2Nvbm5fYWNfc2VuZF9hY2tfcnNwX2Zfc2V0XzEsCisJWzNdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVs0XSA9IGxsY19jb25uX2FjX3N0b3BfcmVqX3RpbWVyLAorCVs1XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19yZWplY3Rfc3RhdGVfdHJhbnNfOSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfaV9jbWRfcGJpdF9zZXRfMSwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX05PUk1BTCwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfcmVqZWN0X2FjdGlvbnNfOSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9SUl9DTURfUGJpdF9TRVRfMCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19yZWplY3RfYWN0aW9uc18xMGFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY191cGRfcF9mbGFnLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMl0gPSBsbGNfY29ubl9hY19jbGVhcl9yZW1vdGVfYnVzeSwKKwlbM10gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfcmVqZWN0X3N0YXRlX3RyYW5zXzEwYSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfcnJfY21kX3BiaXRfc2V0XzAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9SRUosCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX3JlamVjdF9hY3Rpb25zXzEwYSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9SUl9SU1BfRmJpdF9TRVRfMCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19yZWplY3RfYWN0aW9uc18xMGJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY191cGRfcF9mbGFnLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMl0gPSBsbGNfY29ubl9hY19jbGVhcl9yZW1vdGVfYnVzeSwKKwlbM10gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfcmVqZWN0X3N0YXRlX3RyYW5zXzEwYiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfcnJfcnNwX2ZiaXRfc2V0XzAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9SRUosCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX3JlamVjdF9hY3Rpb25zXzEwYiwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9SUl9SU1BfRmJpdF9TRVRfMSBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfcmVqZWN0X2V2X3FmeXJzXzEwY1tdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxXzEsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfcmVqZWN0X2FjdGlvbnNfMTBjW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfdXBkX3BfZmxhZywKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzJdID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3ksCisJWzNdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX3JlamVjdF9zdGF0ZV90cmFuc18xMGMgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3JyX3JzcF9mYml0X3NldF8xLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfUkVKLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX3JlamVjdF9ldl9xZnlyc18xMGMsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfcmVqZWN0X2FjdGlvbnNfMTBjLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JSX0NNRF9QYml0X1NFVF8xIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX3JlamVjdF9hY3Rpb25zXzExW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9hY2tfcnNwX2Zfc2V0XzEsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsyXSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5LAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19yZWplY3Rfc3RhdGVfdHJhbnNfMTEgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3JyX2NtZF9wYml0X3NldF8xLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfUkVKLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19yZWplY3RfYWN0aW9uc18xMSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9STlJfQ01EX1BiaXRfU0VUXzAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfcmVqZWN0X2FjdGlvbnNfMTJhW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfdXBkX3BfZmxhZywKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzJdID0gbGxjX2Nvbm5fYWNfc2V0X3JlbW90ZV9idXN5LAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19yZWplY3Rfc3RhdGVfdHJhbnNfMTJhID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9ybnJfY21kX3BiaXRfc2V0XzAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9SRUosCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX3JlamVjdF9hY3Rpb25zXzEyYSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9STlJfUlNQX0ZiaXRfU0VUXzAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfcmVqZWN0X2FjdGlvbnNfMTJiW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfdXBkX3BfZmxhZywKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzJdID0gbGxjX2Nvbm5fYWNfc2V0X3JlbW90ZV9idXN5LAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19yZWplY3Rfc3RhdGVfdHJhbnNfMTJiID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9ybnJfcnNwX2ZiaXRfc2V0XzAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9SRUosCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX3JlamVjdF9hY3Rpb25zXzEyYiwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9STlJfUlNQX0ZiaXRfU0VUXzEgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX3JlamVjdF9ldl9xZnlyc18xMmNbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV8xLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX3JlamVjdF9hY3Rpb25zXzEyY1tdID0geworCVswXSA9IGxsY19jb25uX2FjX3VwZF9wX2ZsYWcsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsyXSA9IGxsY19jb25uX2FjX3NldF9yZW1vdGVfYnVzeSwKKwlbM10gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfcmVqZWN0X3N0YXRlX3RyYW5zXzEyYyA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfcm5yX3JzcF9mYml0X3NldF8xLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfUkVKLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX3JlamVjdF9ldl9xZnlyc18xMmMsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfcmVqZWN0X2FjdGlvbnNfMTJjLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JOUl9DTURfUGJpdF9TRVRfMSBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19yZWplY3RfYWN0aW9uc18xM1tdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfcnJfcnNwX2Zfc2V0XzEsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsyXSA9IGxsY19jb25uX2FjX3NldF9yZW1vdGVfYnVzeSwKKwlbM10gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfcmVqZWN0X3N0YXRlX3RyYW5zXzEzID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9ybnJfY21kX3BiaXRfc2V0XzEsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9SRUosCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX3JlamVjdF9hY3Rpb25zXzEzLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JFSl9DTURfUGJpdF9TRVRfMCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfcmVqZWN0X2V2X3FmeXJzXzE0YVtdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxXzAsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfcmVqZWN0X2FjdGlvbnNfMTRhW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2V0X3ZzX25yLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMl0gPSBsbGNfY29ubl9hY191cGRfcF9mbGFnLAorCVszXSA9IGxsY19jb25uX2FjX3Jlc2VuZF9pX3h4eF94X3NldF8wLAorCVs0XSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5LAorCVs1XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19yZWplY3Rfc3RhdGVfdHJhbnNfMTRhID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9yZWpfY21kX3BiaXRfc2V0XzAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9SRUosCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfcmVqZWN0X2V2X3FmeXJzXzE0YSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19yZWplY3RfYWN0aW9uc18xNGEsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfUkVKX1JTUF9GYml0X1NFVF9YIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19yZWplY3RfZXZfcWZ5cnNfMTRiW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfZiwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19yZWplY3RfYWN0aW9uc18xNGJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZXRfdnNfbnIsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsyXSA9IGxsY19jb25uX2FjX3VwZF9wX2ZsYWcsCisJWzNdID0gbGxjX2Nvbm5fYWNfcmVzZW5kX2lfeHh4X3hfc2V0XzAsCisJWzRdID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3ksCisJWzVdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX3JlamVjdF9zdGF0ZV90cmFuc18xNGIgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3Jlal9yc3BfZmJpdF9zZXRfeCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX1JFSiwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19yZWplY3RfZXZfcWZ5cnNfMTRiLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX3JlamVjdF9hY3Rpb25zXzE0YiwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9SRUpfQ01EX1BiaXRfU0VUXzAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX3JlamVjdF9ldl9xZnlyc18xNWFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV8xLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX3JlamVjdF9hY3Rpb25zXzE1YVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3NldF92c19uciwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzJdID0gbGxjX2Nvbm5fYWNfcmVzZW5kX2lfeHh4X3hfc2V0XzAsCisJWzNdID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3ksCisJWzRdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX3JlamVjdF9zdGF0ZV90cmFuc18xNWEgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3Jlal9jbWRfcGJpdF9zZXRfMCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX1JFSiwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19yZWplY3RfZXZfcWZ5cnNfMTVhLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX3JlamVjdF9hY3Rpb25zXzE1YSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9SRUpfUlNQX0ZiaXRfU0VUXzAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX3JlamVjdF9ldl9xZnlyc18xNWJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV8xLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX3JlamVjdF9hY3Rpb25zXzE1YltdID0geworCVswXSA9IGxsY19jb25uX2FjX3NldF92c19uciwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzJdID0gbGxjX2Nvbm5fYWNfcmVzZW5kX2lfeHh4X3hfc2V0XzAsCisJWzNdID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3ksCisJWzRdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX3JlamVjdF9zdGF0ZV90cmFuc18xNWIgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3Jlal9yc3BfZmJpdF9zZXRfMCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX1JFSiwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19yZWplY3RfZXZfcWZ5cnNfMTViLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX3JlamVjdF9hY3Rpb25zXzE1YiwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9SRUpfQ01EX1BiaXRfU0VUXzEgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfcmVqZWN0X2FjdGlvbnNfMTZbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZXRfdnNfbnIsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsyXSA9IGxsY19jb25uX2FjX3Jlc2VuZF9pX3JzcF9mX3NldF8xLAorCVszXSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5LAorCVs0XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19yZWplY3Rfc3RhdGVfdHJhbnNfMTYgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3Jlal9jbWRfcGJpdF9zZXRfMSwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX1JFSiwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfcmVqZWN0X2FjdGlvbnNfMTYsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfSU5JVF9QX0ZfQ1lDTEUgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX3JlamVjdF9ldl9xZnlyc18xN1tdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcF9mbGFnX2VxXzAsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfcmVqZWN0X2FjdGlvbnNfMTdbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX3JyX2NtZF9wX3NldF8xLAorCVsxXSA9IGxsY19jb25uX2FjX3N0YXJ0X3BfdGltZXIsCisJWzJdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX3JlamVjdF9zdGF0ZV90cmFuc18xNyA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfaW5pdF9wX2ZfY3ljbGUsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9SRUosCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfcmVqZWN0X2V2X3FmeXJzXzE3LAorCS5ldl9hY3Rpb25zICAgID0gbGxjX3JlamVjdF9hY3Rpb25zXzE3LAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JFSl9UTVJfRVhQIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19yZWplY3RfZXZfcWZ5cnNfMThbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV8wLAorCVsxXSA9IGxsY19jb25uX2V2X3FsZnlfcmV0cnlfY250X2x0X24yLAorCVsyXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX3JlamVjdF9hY3Rpb25zXzE4W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9yZWpfY21kX3Bfc2V0XzEsCisJWzFdID0gbGxjX2Nvbm5fYWNfc3RhcnRfcF90aW1lciwKKwlbMl0gPSBsbGNfY29ubl9hY19zdGFydF9yZWpfdGltZXIsCisJWzNdID0gbGxjX2Nvbm5fYWNfaW5jX3JldHJ5X2NudF9ieV8xLAorCVs0XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19yZWplY3Rfc3RhdGVfdHJhbnNfMTggPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3Jlal90bXJfZXhwLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfUkVKLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX3JlamVjdF9ldl9xZnlyc18xOCwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19yZWplY3RfYWN0aW9uc18xOCwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9QX1RNUl9FWFAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX3JlamVjdF9ldl9xZnlyc18xOVtdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcmV0cnlfY250X2x0X24yLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX3JlamVjdF9hY3Rpb25zXzE5W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9ycl9jbWRfcF9zZXRfMSwKKwlbMV0gPSBsbGNfY29ubl9hY19zdGFydF9wX3RpbWVyLAorCVsyXSA9IGxsY19jb25uX2FjX3N0YXJ0X3Jlal90aW1lciwKKwlbM10gPSBsbGNfY29ubl9hY19pbmNfcmV0cnlfY250X2J5XzEsCisJWzRdID0gbGxjX2Nvbm5fYWNfcnN0X3ZzLAorCVs1XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19yZWplY3Rfc3RhdGVfdHJhbnNfMTkgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3BfdG1yX2V4cCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FXQUlUX1JFSiwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19yZWplY3RfZXZfcWZ5cnNfMTksCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfcmVqZWN0X2FjdGlvbnNfMTksCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfQUNLX1RNUl9FWFAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX3JlamVjdF9ldl9xZnlyc18yMGFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV8wLAorCVsxXSA9IGxsY19jb25uX2V2X3FsZnlfcmV0cnlfY250X2x0X24yLAorCVsyXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX3JlamVjdF9hY3Rpb25zXzIwYVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfcnJfY21kX3Bfc2V0XzEsCisJWzFdID0gbGxjX2Nvbm5fYWNfc3RhcnRfcF90aW1lciwKKwlbMl0gPSBsbGNfY29ubl9hY19zdGFydF9yZWpfdGltZXIsCisJWzNdID0gbGxjX2Nvbm5fYWNfaW5jX3JldHJ5X2NudF9ieV8xLAorCVs0XSA9IGxsY19jb25uX2FjX3JzdF92cywKKwlbNV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfcmVqZWN0X3N0YXRlX3RyYW5zXzIwYSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfYWNrX3Rtcl9leHAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BV0FJVF9SRUosCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfcmVqZWN0X2V2X3FmeXJzXzIwYSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19yZWplY3RfYWN0aW9uc18yMGEsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfQlVTWV9UTVJfRVhQIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19yZWplY3RfZXZfcWZ5cnNfMjBiW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfMCwKKwlbMV0gPSBsbGNfY29ubl9ldl9xbGZ5X3JldHJ5X2NudF9sdF9uMiwKKwlbMl0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19yZWplY3RfYWN0aW9uc18yMGJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX3JyX2NtZF9wX3NldF8xLAorCVsxXSA9IGxsY19jb25uX2FjX3N0YXJ0X3BfdGltZXIsCisJWzJdID0gbGxjX2Nvbm5fYWNfc3RhcnRfcmVqX3RpbWVyLAorCVszXSA9IGxsY19jb25uX2FjX2luY19yZXRyeV9jbnRfYnlfMSwKKwlbNF0gPSBsbGNfY29ubl9hY19yc3RfdnMsCisJWzVdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX3JlamVjdF9zdGF0ZV90cmFuc18yMGIgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X2J1c3lfdG1yX2V4cCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FXQUlUX1JFSiwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19yZWplY3RfZXZfcWZ5cnNfMjBiLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX3JlamVjdF9hY3Rpb25zXzIwYiwKK307CisKKy8qCisgKiBBcnJheSBvZiBwb2ludGVyczsKKyAqIG9uZSB0byBlYWNoIHRyYW5zaXRpb24KKyAqLworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyAqbGxjX3JlamVjdF9zdGF0ZV90cmFuc2l0aW9uc1tdID0geworCSBbMF0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc18xLAkvKiBSZXF1ZXN0ICovCisJIFsxXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzIsCisJIFsyXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zX2VuZCwKKwkgWzNdID0gJmxsY19yZWplY3Rfc3RhdGVfdHJhbnNfMSwKKwkgWzRdID0gJmxsY19yZWplY3Rfc3RhdGVfdHJhbnNfMiwKKwkgWzVdID0gJmxsY19yZWplY3Rfc3RhdGVfdHJhbnNfMl8xLAorCSBbNl0gPSAmbGxjX3JlamVjdF9zdGF0ZV90cmFuc18zLAkvKiBMb2NhbCBidXN5ICovCisJIFs3XSA9ICZsbGNfcmVqZWN0X3N0YXRlX3RyYW5zXzQsCisJIFs4XSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zX2VuZCwKKwkgWzldID0gJmxsY19yZWplY3Rfc3RhdGVfdHJhbnNfMTcsCS8qIEluaXRpYXRlIFBGIGN5Y2xlICovCisJWzEwXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zX2VuZCwKKwlbMTFdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfMTFhLAkvKiBUaW1lciAqLworCVsxMl0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc18xMWIsCisJWzEzXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzExYywKKwlbMTRdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfMTFkLAorCVsxNV0gPSAmbGxjX3JlamVjdF9zdGF0ZV90cmFuc18xOCwKKwlbMTZdID0gJmxsY19yZWplY3Rfc3RhdGVfdHJhbnNfMTksCisJWzE3XSA9ICZsbGNfcmVqZWN0X3N0YXRlX3RyYW5zXzIwYSwKKwlbMThdID0gJmxsY19yZWplY3Rfc3RhdGVfdHJhbnNfMjBiLAorCVsxOV0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc19lbmQsCisJWzIwXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzMsCS8qIFJlY2VpdmUgZnJhbWUgKi8KKwlbMjFdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfNCwKKwlbMjJdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfNSwKKwlbMjNdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfNiwKKwlbMjRdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfN2EsCisJWzI1XSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzdiLAorCVsyNl0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc184YSwKKwlbMjddID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfOGIsCisJWzI4XSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzhjLAorCVsyOV0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc185LAorCS8qIFszMF0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc18xMCwgKi8KKwlbMzBdID0gJmxsY19yZWplY3Rfc3RhdGVfdHJhbnNfNWEsCisJWzMxXSA9ICZsbGNfcmVqZWN0X3N0YXRlX3RyYW5zXzViLAorCVszMl0gPSAmbGxjX3JlamVjdF9zdGF0ZV90cmFuc181YywKKwlbMzNdID0gJmxsY19yZWplY3Rfc3RhdGVfdHJhbnNfNiwKKwlbMzRdID0gJmxsY19yZWplY3Rfc3RhdGVfdHJhbnNfN2EsCisJWzM1XSA9ICZsbGNfcmVqZWN0X3N0YXRlX3RyYW5zXzdiLAorCVszNl0gPSAmbGxjX3JlamVjdF9zdGF0ZV90cmFuc184YSwKKwlbMzddID0gJmxsY19yZWplY3Rfc3RhdGVfdHJhbnNfOGIsCisJWzM4XSA9ICZsbGNfcmVqZWN0X3N0YXRlX3RyYW5zXzksCisJWzM5XSA9ICZsbGNfcmVqZWN0X3N0YXRlX3RyYW5zXzEwYSwKKwlbNDBdID0gJmxsY19yZWplY3Rfc3RhdGVfdHJhbnNfMTBiLAorCVs0MV0gPSAmbGxjX3JlamVjdF9zdGF0ZV90cmFuc18xMGMsCisJWzQyXSA9ICZsbGNfcmVqZWN0X3N0YXRlX3RyYW5zXzExLAorCVs0M10gPSAmbGxjX3JlamVjdF9zdGF0ZV90cmFuc18xMmEsCisJWzQ0XSA9ICZsbGNfcmVqZWN0X3N0YXRlX3RyYW5zXzEyYiwKKwlbNDVdID0gJmxsY19yZWplY3Rfc3RhdGVfdHJhbnNfMTJjLAorCVs0Nl0gPSAmbGxjX3JlamVjdF9zdGF0ZV90cmFuc18xMywKKwlbNDddID0gJmxsY19yZWplY3Rfc3RhdGVfdHJhbnNfMTRhLAorCVs0OF0gPSAmbGxjX3JlamVjdF9zdGF0ZV90cmFuc18xNGIsCisJWzQ5XSA9ICZsbGNfcmVqZWN0X3N0YXRlX3RyYW5zXzE1YSwKKwlbNTBdID0gJmxsY19yZWplY3Rfc3RhdGVfdHJhbnNfMTViLAorCVs1MV0gPSAmbGxjX3JlamVjdF9zdGF0ZV90cmFuc18xNiwKKwlbNTJdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfZW5kLAorfTsKKworLyogTExDX0NPTk5fU1RBVEVfQVdBSVQgdHJhbnNpdGlvbnMgKi8KKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9EQVRBX1JFUSBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfYXdhaXRfZXZfcWZ5cnNfMV8wW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9zZXRfc3RhdHVzX3JlZnVzZSwKKwlbMV0gPSBOVUxMLAorfTsKKworLyoganVzdCBvbmUgbWVtYmVyLCBOVUxMLCAuYnNzIHplcm9lcyBpdCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hd2FpdF9hY3Rpb25zXzFfMFsxXTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfc3RhdGVfdHJhbnNfMV8wID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9kYXRhX3JlcSwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FXQUlULAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX2F3YWl0X2V2X3FmeXJzXzFfMCwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19hd2FpdF9hY3Rpb25zXzFfMCwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9MT0NBTF9CVVNZX0RFVEVDVEVEIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2F3YWl0X2FjdGlvbnNfMVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfcm5yX3h4eF94X3NldF8wLAorCVsxXSA9IGxsY19jb25uX2FjX3NldF9kYXRhX2ZsYWdfMCwKKwlbMl0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfc3RhdGVfdHJhbnNfMSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfbG9jYWxfYnVzeV9kZXRlY3RlZCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FXQUlUX0JVU1ksCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X2FjdGlvbnNfMSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9JX1JTUF9GYml0X1NFVF8xX1VORVhQRF9OcyBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hd2FpdF9hY3Rpb25zXzJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX3Jlal94eHhfeF9zZXRfMCwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzJdID0gbGxjX2Nvbm5fYWNfdXBkX3ZzLAorCVszXSA9IGxsY19jb25uX2FjX3N0b3BfcF90aW1lciwKKwlbNF0gPSBsbGNfY29ubl9hY19yZXNlbmRfaV94eHhfeF9zZXRfMCwKKwlbNV0gPSBsbGNfY29ubl9hY19zdGFydF9yZWpfdGltZXIsCisJWzZdID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3ksCisJWzddID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2F3YWl0X3N0YXRlX3RyYW5zXzIgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X2lfcnNwX2ZiaXRfc2V0XzFfdW5leHBkX25zLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfUkVKLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19hd2FpdF9hY3Rpb25zXzIsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfSV9DTURfUGJpdF9TRVRfMF9VTkVYUERfTnMgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfYWN0aW9uc18zYVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfcmVqX3h4eF94X3NldF8wLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMl0gPSBsbGNfY29ubl9hY191cGRfdnMsCisJWzNdID0gbGxjX2Nvbm5fYWNfc3RhcnRfcmVqX3RpbWVyLAorCVs0XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9zdGF0ZV90cmFuc18zYSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfaV9jbWRfcGJpdF9zZXRfMF91bmV4cGRfbnMsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BV0FJVF9SRUosCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X2FjdGlvbnNfM2EsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfSV9SU1BfRmJpdF9TRVRfMF9VTkVYUERfTnMgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfYWN0aW9uc18zYltdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfcmVqX3h4eF94X3NldF8wLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMl0gPSBsbGNfY29ubl9hY191cGRfdnMsCisJWzNdID0gbGxjX2Nvbm5fYWNfc3RhcnRfcmVqX3RpbWVyLAorCVs0XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9zdGF0ZV90cmFuc18zYiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfaV9yc3BfZmJpdF9zZXRfMF91bmV4cGRfbnMsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BV0FJVF9SRUosCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X2FjdGlvbnNfM2IsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfSV9DTURfUGJpdF9TRVRfMV9VTkVYUERfTnMgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfYWN0aW9uc180W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9yZWpfcnNwX2Zfc2V0XzEsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsyXSA9IGxsY19jb25uX2FjX3VwZF92cywKKwlbM10gPSBsbGNfY29ubl9hY19zdGFydF9yZWpfdGltZXIsCisJWzRdID0gbGxjX2Nvbm5fYWNfc3RhcnRfcF90aW1lciwKKwlbNV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfc3RhdGVfdHJhbnNfNCA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfaV9jbWRfcGJpdF9zZXRfMV91bmV4cGRfbnMsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BV0FJVF9SRUosCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X2FjdGlvbnNfNCwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9JX1JTUF9GYml0X1NFVF8xIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2F3YWl0X2FjdGlvbnNfNVtdID0geworCVswXSA9IGxsY19jb25uX2FjX2luY192cl9ieV8xLAorCVsxXSA9IGxsY19jb25uX2FjX2RhdGFfaW5kLAorCVsyXSA9IGxsY19jb25uX2FjX3N0b3BfcF90aW1lciwKKwlbM10gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzRdID0gbGxjX2Nvbm5fYWNfdXBkX3ZzLAorCVs1XSA9IGxsY19jb25uX2FjX3Jlc2VuZF9pX3h4eF94X3NldF8wX29yX3NlbmRfcnIsCisJWzZdID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3ksCisJWzddID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2F3YWl0X3N0YXRlX3RyYW5zXzUgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X2lfcnNwX2ZiaXRfc2V0XzEsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9OT1JNQUwsCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X2FjdGlvbnNfNSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9JX1JTUF9GYml0X1NFVF8wIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2F3YWl0X2FjdGlvbnNfNmFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19pbmNfdnJfYnlfMSwKKwlbMV0gPSBsbGNfY29ubl9hY19kYXRhX2luZCwKKwlbMl0gPSBsbGNfY29ubl9hY19zZW5kX3JyX3h4eF94X3NldF8wLAorCVszXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbNF0gPSBsbGNfY29ubl9hY191cGRfdnMsCisJWzVdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2F3YWl0X3N0YXRlX3RyYW5zXzZhID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9pX3JzcF9mYml0X3NldF8wLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVQsCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X2FjdGlvbnNfNmEsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfSV9DTURfUGJpdF9TRVRfMCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hd2FpdF9hY3Rpb25zXzZiW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfaW5jX3ZyX2J5XzEsCisJWzFdID0gbGxjX2Nvbm5fYWNfZGF0YV9pbmQsCisJWzJdID0gbGxjX2Nvbm5fYWNfc2VuZF9ycl94eHhfeF9zZXRfMCwKKwlbM10gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzRdID0gbGxjX2Nvbm5fYWNfdXBkX3ZzLAorCVs1XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9zdGF0ZV90cmFuc182YiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfaV9jbWRfcGJpdF9zZXRfMCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FXQUlULAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19hd2FpdF9hY3Rpb25zXzZiLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0lfQ01EX1BiaXRfU0VUXzEgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfYWN0aW9uc183W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfaW5jX3ZyX2J5XzEsCisJWzFdID0gbGxjX2Nvbm5fYWNfZGF0YV9pbmQsCisJWzJdID0gbGxjX2Nvbm5fYWNfc2VuZF9ycl9yc3BfZl9zZXRfMSwKKwlbM10gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzRdID0gbGxjX2Nvbm5fYWNfdXBkX3ZzLAorCVs1XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9zdGF0ZV90cmFuc183ID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9pX2NtZF9wYml0X3NldF8xLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVQsCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X2FjdGlvbnNfNywKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9SUl9SU1BfRmJpdF9TRVRfMSBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hd2FpdF9hY3Rpb25zXzhhW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF92cywKKwlbMl0gPSBsbGNfY29ubl9hY19zdG9wX3BfdGltZXIsCisJWzNdID0gbGxjX2Nvbm5fYWNfcmVzZW5kX2lfeHh4X3hfc2V0XzAsCisJWzRdID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3ksCisJWzVdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2F3YWl0X3N0YXRlX3RyYW5zXzhhID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9ycl9yc3BfZmJpdF9zZXRfMSwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX05PUk1BTCwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYXdhaXRfYWN0aW9uc184YSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9SRUpfUlNQX0ZiaXRfU0VUXzEgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfYWN0aW9uc184YltdID0geworCVswXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfdnMsCisJWzJdID0gbGxjX2Nvbm5fYWNfc3RvcF9wX3RpbWVyLAorCVszXSA9IGxsY19jb25uX2FjX3Jlc2VuZF9pX3h4eF94X3NldF8wLAorCVs0XSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5LAorCVs1XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9zdGF0ZV90cmFuc184YiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfcmVqX3JzcF9mYml0X3NldF8xLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfTk9STUFMLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19hd2FpdF9hY3Rpb25zXzhiLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JSX0NNRF9QYml0X1NFVF8wIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2F3YWl0X2FjdGlvbnNfOWFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX3ZzLAorCVsyXSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5LAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9zdGF0ZV90cmFuc185YSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfcnJfY21kX3BiaXRfc2V0XzAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BV0FJVCwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYXdhaXRfYWN0aW9uc185YSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9SUl9SU1BfRmJpdF9TRVRfMCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hd2FpdF9hY3Rpb25zXzliW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF92cywKKwlbMl0gPSBsbGNfY29ubl9hY19jbGVhcl9yZW1vdGVfYnVzeSwKKwlbM10gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfc3RhdGVfdHJhbnNfOWIgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3JyX3JzcF9mYml0X3NldF8wLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVQsCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X2FjdGlvbnNfOWIsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfUkVKX0NNRF9QYml0X1NFVF8wIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2F3YWl0X2FjdGlvbnNfOWNbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX3ZzLAorCVsyXSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5LAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9zdGF0ZV90cmFuc185YyA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfcmVqX2NtZF9wYml0X3NldF8wLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVQsCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X2FjdGlvbnNfOWMsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfUkVKX1JTUF9GYml0X1NFVF8wIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2F3YWl0X2FjdGlvbnNfOWRbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX3ZzLAorCVsyXSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5LAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9zdGF0ZV90cmFuc185ZCA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfcmVqX3JzcF9mYml0X3NldF8wLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVQsCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X2FjdGlvbnNfOWQsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfUlJfQ01EX1BiaXRfU0VUXzEgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfYWN0aW9uc18xMGFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX3JyX3JzcF9mX3NldF8xLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMl0gPSBsbGNfY29ubl9hY191cGRfdnMsCisJWzNdID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3ksCisJWzRdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2F3YWl0X3N0YXRlX3RyYW5zXzEwYSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfcnJfY21kX3BiaXRfc2V0XzEsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BV0FJVCwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYXdhaXRfYWN0aW9uc18xMGEsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfUkVKX0NNRF9QYml0X1NFVF8xIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2F3YWl0X2FjdGlvbnNfMTBiW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9ycl9yc3BfZl9zZXRfMSwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzJdID0gbGxjX2Nvbm5fYWNfdXBkX3ZzLAorCVszXSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5LAorCVs0XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9zdGF0ZV90cmFuc18xMGIgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3Jlal9jbWRfcGJpdF9zZXRfMSwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FXQUlULAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19hd2FpdF9hY3Rpb25zXzEwYiwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9STlJfUlNQX0ZiaXRfU0VUXzEgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfYWN0aW9uc18xMVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfdnMsCisJWzJdID0gbGxjX2Nvbm5fYWNfc3RvcF9wX3RpbWVyLAorCVszXSA9IGxsY19jb25uX2FjX3NldF9yZW1vdGVfYnVzeSwKKwlbNF0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfc3RhdGVfdHJhbnNfMTEgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3Jucl9yc3BfZmJpdF9zZXRfMSwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX05PUk1BTCwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYXdhaXRfYWN0aW9uc18xMSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9STlJfQ01EX1BiaXRfU0VUXzAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfYWN0aW9uc18xMmFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX3ZzLAorCVsyXSA9IGxsY19jb25uX2FjX3NldF9yZW1vdGVfYnVzeSwKKwlbM10gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfc3RhdGVfdHJhbnNfMTJhID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9ybnJfY21kX3BiaXRfc2V0XzAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BV0FJVCwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYXdhaXRfYWN0aW9uc18xMmEsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfUk5SX1JTUF9GYml0X1NFVF8wIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2F3YWl0X2FjdGlvbnNfMTJiW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF92cywKKwlbMl0gPSBsbGNfY29ubl9hY19zZXRfcmVtb3RlX2J1c3ksCisJWzNdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2F3YWl0X3N0YXRlX3RyYW5zXzEyYiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfcm5yX3JzcF9mYml0X3NldF8wLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVQsCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X2FjdGlvbnNfMTJiLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JOUl9DTURfUGJpdF9TRVRfMSBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hd2FpdF9hY3Rpb25zXzEzW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9ycl9yc3BfZl9zZXRfMSwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzJdID0gbGxjX2Nvbm5fYWNfdXBkX3ZzLAorCVszXSA9IGxsY19jb25uX2FjX3NldF9yZW1vdGVfYnVzeSwKKwlbNF0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfc3RhdGVfdHJhbnNfMTMgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3Jucl9jbWRfcGJpdF9zZXRfMSwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FXQUlULAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19hd2FpdF9hY3Rpb25zXzEzLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1BfVE1SX0VYUCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfYXdhaXRfZXZfcWZ5cnNfMTRbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3JldHJ5X2NudF9sdF9uMiwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hd2FpdF9hY3Rpb25zXzE0W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9ycl9jbWRfcF9zZXRfMSwKKwlbMV0gPSBsbGNfY29ubl9hY19zdGFydF9wX3RpbWVyLAorCVsyXSA9IGxsY19jb25uX2FjX2luY19yZXRyeV9jbnRfYnlfMSwKKwlbM10gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfc3RhdGVfdHJhbnNfMTQgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3BfdG1yX2V4cCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FXQUlULAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX2F3YWl0X2V2X3FmeXJzXzE0LAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X2FjdGlvbnNfMTQsCit9OworCisvKgorICogQXJyYXkgb2YgcG9pbnRlcnM7CisgKiBvbmUgdG8gZWFjaCB0cmFuc2l0aW9uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgKmxsY19hd2FpdF9zdGF0ZV90cmFuc2l0aW9uc1tdID0geworCSBbMF0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc18xLAkvKiBSZXF1ZXN0ICovCisJIFsxXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzIsCisJIFsyXSA9ICZsbGNfYXdhaXRfc3RhdGVfdHJhbnNfMV8wLAorCSBbM10gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc19lbmQsCisJIFs0XSA9ICZsbGNfYXdhaXRfc3RhdGVfdHJhbnNfMSwJLyogTG9jYWwgYnVzeSAqLworCSBbNV0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc19lbmQsCisJIFs2XSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zX2VuZCwJLyogSW5pdGlhdGUgUEYgQ3ljbGUgKi8KKwkgWzddID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfMTFhLAkvKiBUaW1lciAqLworCSBbOF0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc18xMWIsCisJIFs5XSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzExYywKKwlbMTBdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfMTFkLAorCVsxMV0gPSAmbGxjX2F3YWl0X3N0YXRlX3RyYW5zXzE0LAorCVsxMl0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc19lbmQsCisJWzEzXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzMsCS8qIFJlY2VpdmUgZnJhbWUgKi8KKwlbMTRdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfNCwKKwlbMTVdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfNSwKKwlbMTZdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfNiwKKwlbMTddID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfN2EsCisJWzE4XSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzdiLAorCVsxOV0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc184YSwKKwlbMjBdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfOGIsCisJWzIxXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzhjLAorCVsyMl0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc185LAorCS8qIFsyM10gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc18xMCwgKi8KKwlbMjNdID0gJmxsY19hd2FpdF9zdGF0ZV90cmFuc18yLAorCVsyNF0gPSAmbGxjX2F3YWl0X3N0YXRlX3RyYW5zXzNhLAorCVsyNV0gPSAmbGxjX2F3YWl0X3N0YXRlX3RyYW5zXzNiLAorCVsyNl0gPSAmbGxjX2F3YWl0X3N0YXRlX3RyYW5zXzQsCisJWzI3XSA9ICZsbGNfYXdhaXRfc3RhdGVfdHJhbnNfNSwKKwlbMjhdID0gJmxsY19hd2FpdF9zdGF0ZV90cmFuc182YSwKKwlbMjldID0gJmxsY19hd2FpdF9zdGF0ZV90cmFuc182YiwKKwlbMzBdID0gJmxsY19hd2FpdF9zdGF0ZV90cmFuc183LAorCVszMV0gPSAmbGxjX2F3YWl0X3N0YXRlX3RyYW5zXzhhLAorCVszMl0gPSAmbGxjX2F3YWl0X3N0YXRlX3RyYW5zXzhiLAorCVszM10gPSAmbGxjX2F3YWl0X3N0YXRlX3RyYW5zXzlhLAorCVszNF0gPSAmbGxjX2F3YWl0X3N0YXRlX3RyYW5zXzliLAorCVszNV0gPSAmbGxjX2F3YWl0X3N0YXRlX3RyYW5zXzljLAorCVszNl0gPSAmbGxjX2F3YWl0X3N0YXRlX3RyYW5zXzlkLAorCVszN10gPSAmbGxjX2F3YWl0X3N0YXRlX3RyYW5zXzEwYSwKKwlbMzhdID0gJmxsY19hd2FpdF9zdGF0ZV90cmFuc18xMGIsCisJWzM5XSA9ICZsbGNfYXdhaXRfc3RhdGVfdHJhbnNfMTEsCisJWzQwXSA9ICZsbGNfYXdhaXRfc3RhdGVfdHJhbnNfMTJhLAorCVs0MV0gPSAmbGxjX2F3YWl0X3N0YXRlX3RyYW5zXzEyYiwKKwlbNDJdID0gJmxsY19hd2FpdF9zdGF0ZV90cmFuc18xMywKKwlbNDNdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfZW5kLAorfTsKKworLyogTExDX0NPTk5fU1RBVEVfQVdBSVRfQlVTWSB0cmFuc2l0aW9ucyAqLworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX0RBVEFfQ09OTl9SRVEgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX2F3YWl0X2J1c3lfZXZfcWZ5cnNfMV8wW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9zZXRfc3RhdHVzX3JlZnVzZSwKKwlbMV0gPSBOVUxMLAorfTsKKworLyoganVzdCBvbmUgbWVtYmVyLCBOVUxMLCAuYnNzIHplcm9lcyBpdCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hd2FpdF9idXN5X2FjdGlvbnNfMV8wWzFdOworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9idXN5X3N0YXRlX3RyYW5zXzFfMCA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfZGF0YV9yZXEsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BV0FJVF9CVVNZLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX2F3YWl0X2J1c3lfZXZfcWZ5cnNfMV8wLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X2J1c3lfYWN0aW9uc18xXzAsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfTE9DQUxfQlVTWV9DTEVBUkVEIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19hd2FpdF9idXN5X2V2X3FmeXJzXzFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X2RhdGFfZmxhZ19lcV8xLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2F3YWl0X2J1c3lfYWN0aW9uc18xW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9yZWpfeHh4X3hfc2V0XzAsCisJWzFdID0gbGxjX2Nvbm5fYWNfc3RhcnRfcmVqX3RpbWVyLAorCVsyXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9idXN5X3N0YXRlX3RyYW5zXzEgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X2xvY2FsX2J1c3lfY2xlYXJlZCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FXQUlUX1JFSiwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19hd2FpdF9idXN5X2V2X3FmeXJzXzEsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYXdhaXRfYnVzeV9hY3Rpb25zXzEsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfTE9DQUxfQlVTWV9DTEVBUkVEIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19hd2FpdF9idXN5X2V2X3FmeXJzXzJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X2RhdGFfZmxhZ19lcV8wLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2F3YWl0X2J1c3lfYWN0aW9uc18yW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9ycl94eHhfeF9zZXRfMCwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfYnVzeV9zdGF0ZV90cmFuc18yID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9sb2NhbF9idXN5X2NsZWFyZWQsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BV0FJVCwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19hd2FpdF9idXN5X2V2X3FmeXJzXzIsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYXdhaXRfYnVzeV9hY3Rpb25zXzIsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfTE9DQUxfQlVTWV9DTEVBUkVEIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19hd2FpdF9idXN5X2V2X3FmeXJzXzNbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X2RhdGFfZmxhZ19lcV8yLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2F3YWl0X2J1c3lfYWN0aW9uc18zW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9ycl94eHhfeF9zZXRfMCwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfYnVzeV9zdGF0ZV90cmFuc18zID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9sb2NhbF9idXN5X2NsZWFyZWQsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BV0FJVF9SRUosCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfYXdhaXRfYnVzeV9ldl9xZnlyc18zLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X2J1c3lfYWN0aW9uc18zLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0lfUlNQX0ZiaXRfU0VUXzFfVU5FWFBEX05zIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2F3YWl0X2J1c3lfYWN0aW9uc180W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfb3B0X3NlbmRfcm5yX3h4eF94X3NldF8wLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMl0gPSBsbGNfY29ubl9hY191cGRfdnMsCisJWzNdID0gbGxjX2Nvbm5fYWNfc3RvcF9wX3RpbWVyLAorCVs0XSA9IGxsY19jb25uX2FjX3NldF9kYXRhX2ZsYWdfMSwKKwlbNV0gPSBsbGNfY29ubl9hY19jbGVhcl9yZW1vdGVfYnVzeSwKKwlbNl0gPSBsbGNfY29ubl9hY19yZXNlbmRfaV94eHhfeF9zZXRfMCwKKwlbN10gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfYnVzeV9zdGF0ZV90cmFuc180ID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9pX3JzcF9mYml0X3NldF8xX3VuZXhwZF9ucywKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0JVU1ksCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X2J1c3lfYWN0aW9uc180LAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0lfQ01EX1BiaXRfU0VUXzBfVU5FWFBEX05zIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2F3YWl0X2J1c3lfYWN0aW9uc181YVtdID0geworCVswXSA9IGxsY19jb25uX2FjX29wdF9zZW5kX3Jucl94eHhfeF9zZXRfMCwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzJdID0gbGxjX2Nvbm5fYWNfdXBkX3ZzLAorCVszXSA9IGxsY19jb25uX2FjX3NldF9kYXRhX2ZsYWdfMSwKKwlbNF0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfYnVzeV9zdGF0ZV90cmFuc181YSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfaV9jbWRfcGJpdF9zZXRfMF91bmV4cGRfbnMsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BV0FJVF9CVVNZLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19hd2FpdF9idXN5X2FjdGlvbnNfNWEsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfSV9SU1BfRmJpdF9TRVRfMF9VTkVYUERfTnMgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfYnVzeV9hY3Rpb25zXzViW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfb3B0X3NlbmRfcm5yX3h4eF94X3NldF8wLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMl0gPSBsbGNfY29ubl9hY191cGRfdnMsCisJWzNdID0gbGxjX2Nvbm5fYWNfc2V0X2RhdGFfZmxhZ18xLAorCVs0XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9idXN5X3N0YXRlX3RyYW5zXzViID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9pX3JzcF9mYml0X3NldF8wX3VuZXhwZF9ucywKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FXQUlUX0JVU1ksCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X2J1c3lfYWN0aW9uc181YiwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9JX0NNRF9QYml0X1NFVF8xX1VORVhQRF9OcyBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hd2FpdF9idXN5X2FjdGlvbnNfNltdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfcm5yX3JzcF9mX3NldF8xLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMl0gPSBsbGNfY29ubl9hY191cGRfdnMsCisJWzNdID0gbGxjX2Nvbm5fYWNfc2V0X2RhdGFfZmxhZ18xLAorCVs0XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9idXN5X3N0YXRlX3RyYW5zXzYgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X2lfY21kX3BiaXRfc2V0XzFfdW5leHBkX25zLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVRfQlVTWSwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYXdhaXRfYnVzeV9hY3Rpb25zXzYsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfSV9SU1BfRmJpdF9TRVRfMSBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hd2FpdF9idXN5X2FjdGlvbnNfN1tdID0geworCVswXSA9IGxsY19jb25uX2FjX29wdF9zZW5kX3Jucl94eHhfeF9zZXRfMCwKKwlbMV0gPSBsbGNfY29ubl9hY19pbmNfdnJfYnlfMSwKKwlbMl0gPSBsbGNfY29ubl9hY19kYXRhX2luZCwKKwlbM10gPSBsbGNfY29ubl9hY19zdG9wX3BfdGltZXIsCisJWzRdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVs1XSA9IGxsY19jb25uX2FjX3VwZF92cywKKwlbNl0gPSBsbGNfY29ubl9hY19zZXRfZGF0YV9mbGFnXzAsCisJWzddID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3ksCisJWzhdID0gbGxjX2Nvbm5fYWNfcmVzZW5kX2lfeHh4X3hfc2V0XzAsCisJWzldID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2F3YWl0X2J1c3lfc3RhdGVfdHJhbnNfNyA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfaV9yc3BfZmJpdF9zZXRfMSwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0JVU1ksCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X2J1c3lfYWN0aW9uc183LAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0lfUlNQX0ZiaXRfU0VUXzAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfYnVzeV9hY3Rpb25zXzhhW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfb3B0X3NlbmRfcm5yX3h4eF94X3NldF8wLAorCVsxXSA9IGxsY19jb25uX2FjX2luY192cl9ieV8xLAorCVsyXSA9IGxsY19jb25uX2FjX2RhdGFfaW5kLAorCVszXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbNF0gPSBsbGNfY29ubl9hY191cGRfdnMsCisJWzVdID0gbGxjX2Nvbm5fYWNfc2V0X2RhdGFfZmxhZ18wLAorCVs2XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9idXN5X3N0YXRlX3RyYW5zXzhhID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9pX3JzcF9mYml0X3NldF8wLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVRfQlVTWSwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYXdhaXRfYnVzeV9hY3Rpb25zXzhhLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0lfQ01EX1BiaXRfU0VUXzAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfYnVzeV9hY3Rpb25zXzhiW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfb3B0X3NlbmRfcm5yX3h4eF94X3NldF8wLAorCVsxXSA9IGxsY19jb25uX2FjX2luY192cl9ieV8xLAorCVsyXSA9IGxsY19jb25uX2FjX2RhdGFfaW5kLAorCVszXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbNF0gPSBsbGNfY29ubl9hY191cGRfdnMsCisJWzVdID0gbGxjX2Nvbm5fYWNfc2V0X2RhdGFfZmxhZ18wLAorCVs2XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9idXN5X3N0YXRlX3RyYW5zXzhiID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9pX2NtZF9wYml0X3NldF8wLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVRfQlVTWSwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYXdhaXRfYnVzeV9hY3Rpb25zXzhiLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0lfQ01EX1BiaXRfU0VUXzEgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfYnVzeV9hY3Rpb25zXzlbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX3Jucl9yc3BfZl9zZXRfMSwKKwlbMV0gPSBsbGNfY29ubl9hY19pbmNfdnJfYnlfMSwKKwlbMl0gPSBsbGNfY29ubl9hY19kYXRhX2luZCwKKwlbM10gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzRdID0gbGxjX2Nvbm5fYWNfdXBkX3ZzLAorCVs1XSA9IGxsY19jb25uX2FjX3NldF9kYXRhX2ZsYWdfMCwKKwlbNl0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfYnVzeV9zdGF0ZV90cmFuc185ID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9pX2NtZF9wYml0X3NldF8xLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVRfQlVTWSwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYXdhaXRfYnVzeV9hY3Rpb25zXzksCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfUlJfUlNQX0ZiaXRfU0VUXzEgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfYnVzeV9hY3Rpb25zXzEwYVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfdnMsCisJWzJdID0gbGxjX2Nvbm5fYWNfc3RvcF9wX3RpbWVyLAorCVszXSA9IGxsY19jb25uX2FjX3Jlc2VuZF9pX3h4eF94X3NldF8wLAorCVs0XSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5LAorCVs1XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9idXN5X3N0YXRlX3RyYW5zXzEwYSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfcnJfcnNwX2ZiaXRfc2V0XzEsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9CVVNZLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19hd2FpdF9idXN5X2FjdGlvbnNfMTBhLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JFSl9SU1BfRmJpdF9TRVRfMSBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hd2FpdF9idXN5X2FjdGlvbnNfMTBiW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF92cywKKwlbMl0gPSBsbGNfY29ubl9hY19zdG9wX3BfdGltZXIsCisJWzNdID0gbGxjX2Nvbm5fYWNfcmVzZW5kX2lfeHh4X3hfc2V0XzAsCisJWzRdID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3ksCisJWzVdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2F3YWl0X2J1c3lfc3RhdGVfdHJhbnNfMTBiID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9yZWpfcnNwX2ZiaXRfc2V0XzEsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9CVVNZLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19hd2FpdF9idXN5X2FjdGlvbnNfMTBiLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JSX0NNRF9QYml0X1NFVF8wIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2F3YWl0X2J1c3lfYWN0aW9uc18xMWFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX3ZzLAorCVsyXSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5LAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9idXN5X3N0YXRlX3RyYW5zXzExYSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfcnJfY21kX3BiaXRfc2V0XzAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BV0FJVF9CVVNZLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19hd2FpdF9idXN5X2FjdGlvbnNfMTFhLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JSX1JTUF9GYml0X1NFVF8wIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2F3YWl0X2J1c3lfYWN0aW9uc18xMWJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX3ZzLAorCVsyXSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5LAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9idXN5X3N0YXRlX3RyYW5zXzExYiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfcnJfcnNwX2ZiaXRfc2V0XzAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BV0FJVF9CVVNZLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19hd2FpdF9idXN5X2FjdGlvbnNfMTFiLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JFSl9DTURfUGJpdF9TRVRfMCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hd2FpdF9idXN5X2FjdGlvbnNfMTFjW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF92cywKKwlbMl0gPSBsbGNfY29ubl9hY19jbGVhcl9yZW1vdGVfYnVzeSwKKwlbM10gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfYnVzeV9zdGF0ZV90cmFuc18xMWMgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3Jlal9jbWRfcGJpdF9zZXRfMCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FXQUlUX0JVU1ksCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X2J1c3lfYWN0aW9uc18xMWMsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfUkVKX1JTUF9GYml0X1NFVF8wIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2F3YWl0X2J1c3lfYWN0aW9uc18xMWRbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX3ZzLAorCVsyXSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5LAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9idXN5X3N0YXRlX3RyYW5zXzExZCA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfcmVqX3JzcF9mYml0X3NldF8wLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVRfQlVTWSwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYXdhaXRfYnVzeV9hY3Rpb25zXzExZCwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9SUl9DTURfUGJpdF9TRVRfMSBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hd2FpdF9idXN5X2FjdGlvbnNfMTJhW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9ybnJfcnNwX2Zfc2V0XzEsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsyXSA9IGxsY19jb25uX2FjX3VwZF92cywKKwlbM10gPSBsbGNfY29ubl9hY19jbGVhcl9yZW1vdGVfYnVzeSwKKwlbNF0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfYnVzeV9zdGF0ZV90cmFuc18xMmEgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3JyX2NtZF9wYml0X3NldF8xLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVRfQlVTWSwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYXdhaXRfYnVzeV9hY3Rpb25zXzEyYSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9SRUpfQ01EX1BiaXRfU0VUXzEgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfYnVzeV9hY3Rpb25zXzEyYltdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfcm5yX3JzcF9mX3NldF8xLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMl0gPSBsbGNfY29ubl9hY191cGRfdnMsCisJWzNdID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3ksCisJWzRdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2F3YWl0X2J1c3lfc3RhdGVfdHJhbnNfMTJiID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9yZWpfY21kX3BiaXRfc2V0XzEsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BV0FJVF9CVVNZLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19hd2FpdF9idXN5X2FjdGlvbnNfMTJiLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JOUl9SU1BfRmJpdF9TRVRfMSBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hd2FpdF9idXN5X2FjdGlvbnNfMTNbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX3ZzLAorCVsyXSA9IGxsY19jb25uX2FjX3N0b3BfcF90aW1lciwKKwlbM10gPSBsbGNfY29ubl9hY19zZXRfcmVtb3RlX2J1c3ksCisJWzRdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2F3YWl0X2J1c3lfc3RhdGVfdHJhbnNfMTMgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3Jucl9yc3BfZmJpdF9zZXRfMSwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0JVU1ksCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X2J1c3lfYWN0aW9uc18xMywKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9STlJfQ01EX1BiaXRfU0VUXzAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfYnVzeV9hY3Rpb25zXzE0YVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfdnMsCisJWzJdID0gbGxjX2Nvbm5fYWNfc2V0X3JlbW90ZV9idXN5LAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9idXN5X3N0YXRlX3RyYW5zXzE0YSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfcm5yX2NtZF9wYml0X3NldF8wLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVRfQlVTWSwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYXdhaXRfYnVzeV9hY3Rpb25zXzE0YSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9STlJfUlNQX0ZiaXRfU0VUXzAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfYnVzeV9hY3Rpb25zXzE0YltdID0geworCVswXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfdnMsCisJWzJdID0gbGxjX2Nvbm5fYWNfc2V0X3JlbW90ZV9idXN5LAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9idXN5X3N0YXRlX3RyYW5zXzE0YiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfcm5yX3JzcF9mYml0X3NldF8wLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVRfQlVTWSwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYXdhaXRfYnVzeV9hY3Rpb25zXzE0YiwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9STlJfQ01EX1BiaXRfU0VUXzEgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfYnVzeV9hY3Rpb25zXzE1W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9ybnJfcnNwX2Zfc2V0XzEsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsyXSA9IGxsY19jb25uX2FjX3VwZF92cywKKwlbM10gPSBsbGNfY29ubl9hY19zZXRfcmVtb3RlX2J1c3ksCisJWzRdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2F3YWl0X2J1c3lfc3RhdGVfdHJhbnNfMTUgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3Jucl9jbWRfcGJpdF9zZXRfMSwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FXQUlUX0JVU1ksCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X2J1c3lfYWN0aW9uc18xNSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9QX1RNUl9FWFAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX2F3YWl0X2J1c3lfZXZfcWZ5cnNfMTZbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3JldHJ5X2NudF9sdF9uMiwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hd2FpdF9idXN5X2FjdGlvbnNfMTZbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX3Jucl9jbWRfcF9zZXRfMSwKKwlbMV0gPSBsbGNfY29ubl9hY19zdGFydF9wX3RpbWVyLAorCVsyXSA9IGxsY19jb25uX2FjX2luY19yZXRyeV9jbnRfYnlfMSwKKwlbM10gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfYnVzeV9zdGF0ZV90cmFuc18xNiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcF90bXJfZXhwLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVRfQlVTWSwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19hd2FpdF9idXN5X2V2X3FmeXJzXzE2LAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X2J1c3lfYWN0aW9uc18xNiwKK307CisKKy8qCisgKiBBcnJheSBvZiBwb2ludGVyczsKKyAqIG9uZSB0byBlYWNoIHRyYW5zaXRpb24KKyAqLworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyAqbGxjX2F3YWl0X2J1c3lfc3RhdGVfdHJhbnNpdGlvbnNbXSA9IHsKKwkgWzBdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfMSwJCS8qIFJlcXVlc3QgKi8KKwkgWzFdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfMiwKKwkgWzJdID0gJmxsY19hd2FpdF9idXN5X3N0YXRlX3RyYW5zXzFfMCwKKwkgWzNdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfZW5kLAorCSBbNF0gPSAmbGxjX2F3YWl0X2J1c3lfc3RhdGVfdHJhbnNfMSwJCS8qIExvY2FsIGJ1c3kgKi8KKwkgWzVdID0gJmxsY19hd2FpdF9idXN5X3N0YXRlX3RyYW5zXzIsCisJIFs2XSA9ICZsbGNfYXdhaXRfYnVzeV9zdGF0ZV90cmFuc18zLAorCSBbN10gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc19lbmQsCisJIFs4XSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zX2VuZCwJCS8qIEluaXRpYXRlIFBGIGN5Y2xlICovCisJIFs5XSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzExYSwJCS8qIFRpbWVyICovCisJWzEwXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzExYiwKKwlbMTFdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfMTFjLAorCVsxMl0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc18xMWQsCisJWzEzXSA9ICZsbGNfYXdhaXRfYnVzeV9zdGF0ZV90cmFuc18xNiwKKwlbMTRdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfZW5kLAorCVsxNV0gPSAmbGxjX2F3YWl0X2J1c3lfc3RhdGVfdHJhbnNfNCwJCS8qIFJlY2VpdmUgZnJhbWUgKi8KKwlbMTZdID0gJmxsY19hd2FpdF9idXN5X3N0YXRlX3RyYW5zXzVhLAorCVsxN10gPSAmbGxjX2F3YWl0X2J1c3lfc3RhdGVfdHJhbnNfNWIsCisJWzE4XSA9ICZsbGNfYXdhaXRfYnVzeV9zdGF0ZV90cmFuc182LAorCVsxOV0gPSAmbGxjX2F3YWl0X2J1c3lfc3RhdGVfdHJhbnNfNywKKwlbMjBdID0gJmxsY19hd2FpdF9idXN5X3N0YXRlX3RyYW5zXzhhLAorCVsyMV0gPSAmbGxjX2F3YWl0X2J1c3lfc3RhdGVfdHJhbnNfOGIsCisJWzIyXSA9ICZsbGNfYXdhaXRfYnVzeV9zdGF0ZV90cmFuc185LAorCVsyM10gPSAmbGxjX2F3YWl0X2J1c3lfc3RhdGVfdHJhbnNfMTBhLAorCVsyNF0gPSAmbGxjX2F3YWl0X2J1c3lfc3RhdGVfdHJhbnNfMTBiLAorCVsyNV0gPSAmbGxjX2F3YWl0X2J1c3lfc3RhdGVfdHJhbnNfMTFhLAorCVsyNl0gPSAmbGxjX2F3YWl0X2J1c3lfc3RhdGVfdHJhbnNfMTFiLAorCVsyN10gPSAmbGxjX2F3YWl0X2J1c3lfc3RhdGVfdHJhbnNfMTFjLAorCVsyOF0gPSAmbGxjX2F3YWl0X2J1c3lfc3RhdGVfdHJhbnNfMTFkLAorCVsyOV0gPSAmbGxjX2F3YWl0X2J1c3lfc3RhdGVfdHJhbnNfMTJhLAorCVszMF0gPSAmbGxjX2F3YWl0X2J1c3lfc3RhdGVfdHJhbnNfMTJiLAorCVszMV0gPSAmbGxjX2F3YWl0X2J1c3lfc3RhdGVfdHJhbnNfMTMsCisJWzMyXSA9ICZsbGNfYXdhaXRfYnVzeV9zdGF0ZV90cmFuc18xNGEsCisJWzMzXSA9ICZsbGNfYXdhaXRfYnVzeV9zdGF0ZV90cmFuc18xNGIsCisJWzM0XSA9ICZsbGNfYXdhaXRfYnVzeV9zdGF0ZV90cmFuc18xNSwKKwlbMzVdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfMywKKwlbMzZdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfNCwKKwlbMzddID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfNSwKKwlbMzhdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfNiwKKwlbMzldID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfN2EsCisJWzQwXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzdiLAorCVs0MV0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc184YSwKKwlbNDJdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfOGIsCisJWzQzXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzhjLAorCVs0NF0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc185LAorCS8qIFs0NV0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc18xMCwgKi8KKwlbNDVdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfZW5kLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gTExDX0NPTk5fU1RBVEVfQVdBSVRfUkVKIHRyYW5zaXRpb25zIC0tLS0tLS0tLS0tLS0tLSAqLworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX0RBVEFfQ09OTl9SRVEgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX2F3YWl0X3JlamVjdF9ldl9xZnlyc18xXzBbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3NldF9zdGF0dXNfcmVmdXNlLAorCVsxXSA9IE5VTEwsCit9OworCisvKiBqdXN0IG9uZSBtZW1iZXIsIE5VTEwsIC5ic3MgemVyb2VzIGl0ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2F3YWl0X3JlamVjdF9hY3Rpb25zXzFfMFsxXTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfcmVqZWN0X3N0YXRlX3RyYW5zXzFfMCA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfZGF0YV9yZXEsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BV0FJVF9SRUosCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfYXdhaXRfcmVqZWN0X2V2X3FmeXJzXzFfMCwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19hd2FpdF9yZWplY3RfYWN0aW9uc18xXzAsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfTE9DQUxfQlVTWV9ERVRFQ1RFRCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hd2FpdF9yZWpjdF9hY3Rpb25zXzFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX3Jucl94eHhfeF9zZXRfMCwKKwlbMV0gPSBsbGNfY29ubl9hY19zZXRfZGF0YV9mbGFnXzIsCisJWzJdID0gTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfcmVqY3Rfc3RhdGVfdHJhbnNfMSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfbG9jYWxfYnVzeV9kZXRlY3RlZCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FXQUlUX0JVU1ksCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X3JlamN0X2FjdGlvbnNfMSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9JX0NNRF9QYml0X1NFVF8wX1VORVhQRF9OcyBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hd2FpdF9yZWpjdF9hY3Rpb25zXzJhW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF92cywKKwlbMl0gPSBOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9yZWpjdF9zdGF0ZV90cmFuc18yYSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfaV9jbWRfcGJpdF9zZXRfMF91bmV4cGRfbnMsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BV0FJVF9SRUosCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X3JlamN0X2FjdGlvbnNfMmEsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfSV9SU1BfRmJpdF9TRVRfMF9VTkVYUERfTnMgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfcmVqY3RfYWN0aW9uc18yYltdID0geworCVswXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfdnMsCisJWzJdID0gTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfcmVqY3Rfc3RhdGVfdHJhbnNfMmIgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X2lfcnNwX2ZiaXRfc2V0XzBfdW5leHBkX25zLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVRfUkVKLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19hd2FpdF9yZWpjdF9hY3Rpb25zXzJiLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0lfQ01EX1BiaXRfU0VUXzFfVU5FWFBEX05zIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2F3YWl0X3JlamN0X2FjdGlvbnNfM1tdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfcnJfcnNwX2Zfc2V0XzEsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsyXSA9IGxsY19jb25uX2FjX3VwZF92cywKKwlbM10gPSBOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9yZWpjdF9zdGF0ZV90cmFuc18zID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9pX2NtZF9wYml0X3NldF8xX3VuZXhwZF9ucywKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FXQUlUX1JFSiwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYXdhaXRfcmVqY3RfYWN0aW9uc18zLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0lfUlNQX0ZiaXRfU0VUXzEgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfcmVqY3RfYWN0aW9uc180W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfaW5jX3ZyX2J5XzEsCisJWzFdID0gbGxjX2Nvbm5fYWNfZGF0YV9pbmQsCisJWzJdID0gbGxjX2Nvbm5fYWNfc3RvcF9wX3RpbWVyLAorCVszXSA9IGxsY19jb25uX2FjX3N0b3BfcmVqX3RpbWVyLAorCVs0XSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbNV0gPSBsbGNfY29ubl9hY191cGRfdnMsCisJWzZdID0gbGxjX2Nvbm5fYWNfcmVzZW5kX2lfeHh4X3hfc2V0XzBfb3Jfc2VuZF9yciwKKwlbN10gPSBsbGNfY29ubl9hY19jbGVhcl9yZW1vdGVfYnVzeSwKKwlbOF0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfcmVqY3Rfc3RhdGVfdHJhbnNfNCA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfaV9yc3BfZmJpdF9zZXRfMSwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX05PUk1BTCwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYXdhaXRfcmVqY3RfYWN0aW9uc180LAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0lfUlNQX0ZiaXRfU0VUXzAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfcmVqY3RfYWN0aW9uc181YVtdID0geworCVswXSA9IGxsY19jb25uX2FjX2luY192cl9ieV8xLAorCVsxXSA9IGxsY19jb25uX2FjX2RhdGFfaW5kLAorCVsyXSA9IGxsY19jb25uX2FjX3NlbmRfcnJfeHh4X3hfc2V0XzAsCisJWzNdID0gbGxjX2Nvbm5fYWNfc3RvcF9yZWpfdGltZXIsCisJWzRdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVs1XSA9IGxsY19jb25uX2FjX3VwZF92cywKKwlbNl0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfcmVqY3Rfc3RhdGVfdHJhbnNfNWEgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X2lfcnNwX2ZiaXRfc2V0XzAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BV0FJVCwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYXdhaXRfcmVqY3RfYWN0aW9uc181YSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9JX0NNRF9QYml0X1NFVF8wIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2F3YWl0X3JlamN0X2FjdGlvbnNfNWJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19pbmNfdnJfYnlfMSwKKwlbMV0gPSBsbGNfY29ubl9hY19kYXRhX2luZCwKKwlbMl0gPSBsbGNfY29ubl9hY19zZW5kX3JyX3h4eF94X3NldF8wLAorCVszXSA9IGxsY19jb25uX2FjX3N0b3BfcmVqX3RpbWVyLAorCVs0XSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbNV0gPSBsbGNfY29ubl9hY191cGRfdnMsCisJWzZdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2F3YWl0X3JlamN0X3N0YXRlX3RyYW5zXzViID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9pX2NtZF9wYml0X3NldF8wLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVQsCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X3JlamN0X2FjdGlvbnNfNWIsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfSV9DTURfUGJpdF9TRVRfMSBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hd2FpdF9yZWpjdF9hY3Rpb25zXzZbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19pbmNfdnJfYnlfMSwKKwlbMV0gPSBsbGNfY29ubl9hY19kYXRhX2luZCwKKwlbMl0gPSBsbGNfY29ubl9hY19zZW5kX3JyX3JzcF9mX3NldF8xLAorCVszXSA9IGxsY19jb25uX2FjX3N0b3BfcmVqX3RpbWVyLAorCVs0XSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbNV0gPSBsbGNfY29ubl9hY191cGRfdnMsCisJWzZdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2F3YWl0X3JlamN0X3N0YXRlX3RyYW5zXzYgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X2lfY21kX3BiaXRfc2V0XzEsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BV0FJVCwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYXdhaXRfcmVqY3RfYWN0aW9uc182LAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JSX1JTUF9GYml0X1NFVF8xIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2F3YWl0X3JlamN0X2FjdGlvbnNfN2FbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX3ZzLAorCVsyXSA9IGxsY19jb25uX2FjX3N0b3BfcF90aW1lciwKKwlbM10gPSBsbGNfY29ubl9hY19yZXNlbmRfaV94eHhfeF9zZXRfMCwKKwlbNF0gPSBsbGNfY29ubl9hY19jbGVhcl9yZW1vdGVfYnVzeSwKKwlbNV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfcmVqY3Rfc3RhdGVfdHJhbnNfN2EgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3JyX3JzcF9mYml0X3NldF8xLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfUkVKLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19hd2FpdF9yZWpjdF9hY3Rpb25zXzdhLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JFSl9SU1BfRmJpdF9TRVRfMSBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hd2FpdF9yZWpjdF9hY3Rpb25zXzdiW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF92cywKKwlbMl0gPSBsbGNfY29ubl9hY19zdG9wX3BfdGltZXIsCisJWzNdID0gbGxjX2Nvbm5fYWNfcmVzZW5kX2lfeHh4X3hfc2V0XzAsCisJWzRdID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3ksCisJWzVdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2F3YWl0X3JlamN0X3N0YXRlX3RyYW5zXzdiID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9yZWpfcnNwX2ZiaXRfc2V0XzEsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9SRUosCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X3JlamN0X2FjdGlvbnNfN2IsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfSV9SU1BfRmJpdF9TRVRfMV9VTkVYUERfTnMgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfcmVqY3RfYWN0aW9uc183Y1tdID0geworCVswXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfdnMsCisJWzJdID0gbGxjX2Nvbm5fYWNfc3RvcF9wX3RpbWVyLAorCVszXSA9IGxsY19jb25uX2FjX3Jlc2VuZF9pX3h4eF94X3NldF8wLAorCVs0XSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5LAorCVs1XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9yZWpjdF9zdGF0ZV90cmFuc183YyA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfaV9yc3BfZmJpdF9zZXRfMV91bmV4cGRfbnMsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9SRUosCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X3JlamN0X2FjdGlvbnNfN2MsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfUlJfQ01EX1BiaXRfU0VUXzAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfcmVqY3RfYWN0aW9uc184YVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfdnMsCisJWzJdID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3ksCisJWzNdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2F3YWl0X3JlamN0X3N0YXRlX3RyYW5zXzhhID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9ycl9jbWRfcGJpdF9zZXRfMCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FXQUlUX1JFSiwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYXdhaXRfcmVqY3RfYWN0aW9uc184YSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9SUl9SU1BfRmJpdF9TRVRfMCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hd2FpdF9yZWpjdF9hY3Rpb25zXzhiW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF92cywKKwlbMl0gPSBsbGNfY29ubl9hY19jbGVhcl9yZW1vdGVfYnVzeSwKKwlbM10gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfcmVqY3Rfc3RhdGVfdHJhbnNfOGIgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3JyX3JzcF9mYml0X3NldF8wLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVRfUkVKLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19hd2FpdF9yZWpjdF9hY3Rpb25zXzhiLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JFSl9DTURfUGJpdF9TRVRfMCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hd2FpdF9yZWpjdF9hY3Rpb25zXzhjW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF92cywKKwlbMl0gPSBsbGNfY29ubl9hY19jbGVhcl9yZW1vdGVfYnVzeSwKKwlbM10gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfcmVqY3Rfc3RhdGVfdHJhbnNfOGMgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3Jlal9jbWRfcGJpdF9zZXRfMCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FXQUlUX1JFSiwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYXdhaXRfcmVqY3RfYWN0aW9uc184YywKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9SRUpfUlNQX0ZiaXRfU0VUXzAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfcmVqY3RfYWN0aW9uc184ZFtdID0geworCVswXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfdnMsCisJWzJdID0gbGxjX2Nvbm5fYWNfY2xlYXJfcmVtb3RlX2J1c3ksCisJWzNdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2F3YWl0X3JlamN0X3N0YXRlX3RyYW5zXzhkID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9yZWpfcnNwX2ZiaXRfc2V0XzAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BV0FJVF9SRUosCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X3JlamN0X2FjdGlvbnNfOGQsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfUlJfQ01EX1BiaXRfU0VUXzEgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfcmVqY3RfYWN0aW9uc185YVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfcnJfcnNwX2Zfc2V0XzEsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsyXSA9IGxsY19jb25uX2FjX3VwZF92cywKKwlbM10gPSBsbGNfY29ubl9hY19jbGVhcl9yZW1vdGVfYnVzeSwKKwlbNF0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfYXdhaXRfcmVqY3Rfc3RhdGVfdHJhbnNfOWEgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3JyX2NtZF9wYml0X3NldF8xLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVRfUkVKLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19hd2FpdF9yZWpjdF9hY3Rpb25zXzlhLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JFSl9DTURfUGJpdF9TRVRfMSBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hd2FpdF9yZWpjdF9hY3Rpb25zXzliW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9ycl9yc3BfZl9zZXRfMSwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfbnJfcmVjZWl2ZWQsCisJWzJdID0gbGxjX2Nvbm5fYWNfdXBkX3ZzLAorCVszXSA9IGxsY19jb25uX2FjX2NsZWFyX3JlbW90ZV9idXN5LAorCVs0XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9yZWpjdF9zdGF0ZV90cmFuc185YiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfcmVqX2NtZF9wYml0X3NldF8xLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVRfUkVKLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19hd2FpdF9yZWpjdF9hY3Rpb25zXzliLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JOUl9SU1BfRmJpdF9TRVRfMSBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hd2FpdF9yZWpjdF9hY3Rpb25zXzEwW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF92cywKKwlbMl0gPSBsbGNfY29ubl9hY19zdG9wX3BfdGltZXIsCisJWzNdID0gbGxjX2Nvbm5fYWNfc2V0X3JlbW90ZV9idXN5LAorCVs0XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9yZWpjdF9zdGF0ZV90cmFuc18xMCA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfcm5yX3JzcF9mYml0X3NldF8xLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfUkVKLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19hd2FpdF9yZWpjdF9hY3Rpb25zXzEwLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1JOUl9DTURfUGJpdF9TRVRfMCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19hd2FpdF9yZWpjdF9hY3Rpb25zXzExYVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3VwZF9ucl9yZWNlaXZlZCwKKwlbMV0gPSBsbGNfY29ubl9hY191cGRfdnMsCisJWzJdID0gbGxjX2Nvbm5fYWNfc2V0X3JlbW90ZV9idXN5LAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9yZWpjdF9zdGF0ZV90cmFuc18xMWEgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3Jucl9jbWRfcGJpdF9zZXRfMCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FXQUlUX1JFSiwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfYXdhaXRfcmVqY3RfYWN0aW9uc18xMWEsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfUk5SX1JTUF9GYml0X1NFVF8wIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2F3YWl0X3JlamN0X2FjdGlvbnNfMTFiW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsxXSA9IGxsY19jb25uX2FjX3VwZF92cywKKwlbMl0gPSBsbGNfY29ubl9hY19zZXRfcmVtb3RlX2J1c3ksCisJWzNdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2F3YWl0X3JlamN0X3N0YXRlX3RyYW5zXzExYiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfcm5yX3JzcF9mYml0X3NldF8wLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVRfUkVKLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19hd2FpdF9yZWpjdF9hY3Rpb25zXzExYiwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9STlJfQ01EX1BiaXRfU0VUXzEgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfYXdhaXRfcmVqY3RfYWN0aW9uc18xMltdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfcnJfcnNwX2Zfc2V0XzEsCisJWzFdID0gbGxjX2Nvbm5fYWNfdXBkX25yX3JlY2VpdmVkLAorCVsyXSA9IGxsY19jb25uX2FjX3VwZF92cywKKwlbM10gPSBsbGNfY29ubl9hY19zZXRfcmVtb3RlX2J1c3ksCisJWzRdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2F3YWl0X3JlamN0X3N0YXRlX3RyYW5zXzEyID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9ybnJfY21kX3BiaXRfc2V0XzEsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BV0FJVF9SRUosCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X3JlamN0X2FjdGlvbnNfMTIsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUF9UTVJfRVhQIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19hd2FpdF9yZWpjdF9ldl9xZnlyc18xM1tdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcmV0cnlfY250X2x0X24yLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2F3YWl0X3JlamN0X2FjdGlvbnNfMTNbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX3Jlal9jbWRfcF9zZXRfMSwKKwlbMV0gPSBsbGNfY29ubl9hY19zdG9wX3BfdGltZXIsCisJWzJdID0gbGxjX2Nvbm5fYWNfaW5jX3JldHJ5X2NudF9ieV8xLAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19hd2FpdF9yZWpjdF9zdGF0ZV90cmFuc18xMyA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcF90bXJfZXhwLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQVdBSVRfUkVKLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX2F3YWl0X3JlamN0X2V2X3FmeXJzXzEzLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2F3YWl0X3JlamN0X2FjdGlvbnNfMTMsCit9OworCisvKgorICogQXJyYXkgb2YgcG9pbnRlcnM7CisgKiBvbmUgdG8gZWFjaCB0cmFuc2l0aW9uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgKmxsY19hd2FpdF9yZWpjdF9zdGF0ZV90cmFuc2l0aW9uc1tdID0geworCSBbMF0gPSAmbGxjX2F3YWl0X3JlamVjdF9zdGF0ZV90cmFuc18xXzAsCisJIFsxXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzEsCQkvKiByZXF1ZXN0cyAqLworCSBbMl0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc18yLAorCSBbM10gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc19lbmQsCisJIFs0XSA9ICZsbGNfYXdhaXRfcmVqY3Rfc3RhdGVfdHJhbnNfMSwJCS8qIGxvY2FsIGJ1c3kgKi8KKwkgWzVdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfZW5kLAorCSBbNl0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc19lbmQsCQkvKiBJbml0aWF0ZSBQRiBjeWNsZSAqLworCSBbN10gPSAmbGxjX2F3YWl0X3JlamN0X3N0YXRlX3RyYW5zXzEzLAkvKiB0aW1lcnMgKi8KKwkgWzhdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfMTFhLAorCSBbOV0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc18xMWIsCisJWzEwXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzExYywKKwlbMTFdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfMTFkLAorCVsxMl0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc19lbmQsCisJWzEzXSA9ICZsbGNfYXdhaXRfcmVqY3Rfc3RhdGVfdHJhbnNfMmEsCS8qIHJlY2VpdmUgZnJhbWVzICovCisJWzE0XSA9ICZsbGNfYXdhaXRfcmVqY3Rfc3RhdGVfdHJhbnNfMmIsCisJWzE1XSA9ICZsbGNfYXdhaXRfcmVqY3Rfc3RhdGVfdHJhbnNfMywKKwlbMTZdID0gJmxsY19hd2FpdF9yZWpjdF9zdGF0ZV90cmFuc180LAorCVsxN10gPSAmbGxjX2F3YWl0X3JlamN0X3N0YXRlX3RyYW5zXzVhLAorCVsxOF0gPSAmbGxjX2F3YWl0X3JlamN0X3N0YXRlX3RyYW5zXzViLAorCVsxOV0gPSAmbGxjX2F3YWl0X3JlamN0X3N0YXRlX3RyYW5zXzYsCisJWzIwXSA9ICZsbGNfYXdhaXRfcmVqY3Rfc3RhdGVfdHJhbnNfN2EsCisJWzIxXSA9ICZsbGNfYXdhaXRfcmVqY3Rfc3RhdGVfdHJhbnNfN2IsCisJWzIyXSA9ICZsbGNfYXdhaXRfcmVqY3Rfc3RhdGVfdHJhbnNfN2MsCisJWzIzXSA9ICZsbGNfYXdhaXRfcmVqY3Rfc3RhdGVfdHJhbnNfOGEsCisJWzI0XSA9ICZsbGNfYXdhaXRfcmVqY3Rfc3RhdGVfdHJhbnNfOGIsCisJWzI1XSA9ICZsbGNfYXdhaXRfcmVqY3Rfc3RhdGVfdHJhbnNfOGMsCisJWzI2XSA9ICZsbGNfYXdhaXRfcmVqY3Rfc3RhdGVfdHJhbnNfOGQsCisJWzI3XSA9ICZsbGNfYXdhaXRfcmVqY3Rfc3RhdGVfdHJhbnNfOWEsCisJWzI4XSA9ICZsbGNfYXdhaXRfcmVqY3Rfc3RhdGVfdHJhbnNfOWIsCisJWzI5XSA9ICZsbGNfYXdhaXRfcmVqY3Rfc3RhdGVfdHJhbnNfMTAsCisJWzMwXSA9ICZsbGNfYXdhaXRfcmVqY3Rfc3RhdGVfdHJhbnNfMTFhLAorCVszMV0gPSAmbGxjX2F3YWl0X3JlamN0X3N0YXRlX3RyYW5zXzExYiwKKwlbMzJdID0gJmxsY19hd2FpdF9yZWpjdF9zdGF0ZV90cmFuc18xMiwKKwlbMzNdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfMywKKwlbMzRdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfNCwKKwlbMzVdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfNSwKKwlbMzZdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfNiwKKwlbMzddID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfN2EsCisJWzM4XSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzdiLAorCVszOV0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc184YSwKKwlbNDBdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfOGIsCisJWzQxXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zXzhjLAorCVs0Ml0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc185LAorCS8qIFs0M10gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc18xMCwgKi8KKwlbNDNdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfZW5kLAorfTsKKworLyogTExDX0NPTk5fU1RBVEVfRF9DT05OIHRyYW5zaXRpb25zICovCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfU0FCTUVfQ01EX1BiaXRfU0VUX1ggZXZlbnQsCisgKiBjYXVzZV9mbGFnID0gMSAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfZF9jb25uX2V2X3FmeXJzXzFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X2NhdXNlX2ZsYWdfZXFfMSwKKwlbMV0gPSBsbGNfY29ubl9ldl9xbGZ5X3NldF9zdGF0dXNfY29uZmxpY3QsCisJWzJdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfZF9jb25uX2FjdGlvbnNfMVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfZG1fcnNwX2Zfc2V0X3AsCisJWzFdID0gbGxjX2Nvbm5fYWNfc3RvcF9hY2tfdGltZXIsCisJWzJdID0gbGxjX2Nvbm5fYWNfZGlzY19jb25maXJtLAorCVszXSA9IGxsY19jb25uX2Rpc2MsCisJWzRdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2RfY29ubl9zdGF0ZV90cmFuc18xID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9zYWJtZV9jbWRfcGJpdF9zZXRfeCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FETSwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19kX2Nvbm5fZXZfcWZ5cnNfMSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19kX2Nvbm5fYWN0aW9uc18xLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1NBQk1FX0NNRF9QYml0X1NFVF9YIGV2ZW50LAorICogY2F1c2VfZmxhZyA9IDAKKyAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfZF9jb25uX2V2X3FmeXJzXzFfMVtdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfY2F1c2VfZmxhZ19lcV8wLAorCVsxXSA9IGxsY19jb25uX2V2X3FsZnlfc2V0X3N0YXR1c19jb25mbGljdCwKKwlbMl0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19kX2Nvbm5fYWN0aW9uc18xXzFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX2RtX3JzcF9mX3NldF9wLAorCVsxXSA9IGxsY19jb25uX2FjX3N0b3BfYWNrX3RpbWVyLAorCVsyXSA9IGxsY19jb25uX2Rpc2MsCisJWzNdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2RfY29ubl9zdGF0ZV90cmFuc18xXzEgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3NhYm1lX2NtZF9wYml0X3NldF94LAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQURNLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX2RfY29ubl9ldl9xZnlyc18xXzEsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfZF9jb25uX2FjdGlvbnNfMV8xLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1VBX1JTUF9GYml0X1NFVF9YIGV2ZW50LAorICogY2F1c2VfZmxhZyA9IDEKKyAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfZF9jb25uX2V2X3FmeXJzXzJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV9mLAorCVsxXSA9IGxsY19jb25uX2V2X3FsZnlfY2F1c2VfZmxhZ19lcV8xLAorCVsyXSA9IGxsY19jb25uX2V2X3FsZnlfc2V0X3N0YXR1c19kaXNjLAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2RfY29ubl9hY3Rpb25zXzJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zdG9wX2Fja190aW1lciwKKwlbMV0gPSBsbGNfY29ubl9hY19kaXNjX2NvbmZpcm0sCisJWzJdID0gbGxjX2Nvbm5fZGlzYywKKwlbM10gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfZF9jb25uX3N0YXRlX3RyYW5zXzIgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X3VhX3JzcF9mYml0X3NldF94LAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQURNLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX2RfY29ubl9ldl9xZnlyc18yLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2RfY29ubl9hY3Rpb25zXzIsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfVUFfUlNQX0ZiaXRfU0VUX1ggZXZlbnQsCisgKiBjYXVzZV9mbGFnID0gMAorICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19kX2Nvbm5fZXZfcWZ5cnNfMl8xW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9wX2ZsYWdfZXFfZiwKKwlbMV0gPSBsbGNfY29ubl9ldl9xbGZ5X2NhdXNlX2ZsYWdfZXFfMCwKKwlbMl0gPSBsbGNfY29ubl9ldl9xbGZ5X3NldF9zdGF0dXNfZGlzYywKKwlbM10gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19kX2Nvbm5fYWN0aW9uc18yXzFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zdG9wX2Fja190aW1lciwKKwlbMV0gPSBsbGNfY29ubl9kaXNjLAorCVsyXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19kX2Nvbm5fc3RhdGVfdHJhbnNfMl8xID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF91YV9yc3BfZmJpdF9zZXRfeCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FETSwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19kX2Nvbm5fZXZfcWZ5cnNfMl8xLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2RfY29ubl9hY3Rpb25zXzJfMSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9ESVNDX0NNRF9QYml0X1NFVF9YIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2RfY29ubl9hY3Rpb25zXzNbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX3VhX3JzcF9mX3NldF9wLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19kX2Nvbm5fc3RhdGVfdHJhbnNfMyA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfZGlzY19jbWRfcGJpdF9zZXRfeCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0RfQ09OTiwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfZF9jb25uX2FjdGlvbnNfMywKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9ETV9SU1BfRmJpdF9TRVRfWCBldmVudCwKKyAqIGNhdXNlX2ZsYWcgPSAxCisgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX2RfY29ubl9ldl9xZnlyc180W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9jYXVzZV9mbGFnX2VxXzEsCisJWzFdID0gbGxjX2Nvbm5fZXZfcWxmeV9zZXRfc3RhdHVzX2Rpc2MsCisJWzJdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfZF9jb25uX2FjdGlvbnNfNFtdID0geworCVswXSA9IGxsY19jb25uX2FjX3N0b3BfYWNrX3RpbWVyLAorCVsxXSA9IGxsY19jb25uX2FjX2Rpc2NfY29uZmlybSwKKwlbMl0gPSBsbGNfY29ubl9kaXNjLAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19kX2Nvbm5fc3RhdGVfdHJhbnNfNCA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfZG1fcnNwX2ZiaXRfc2V0X3gsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BRE0sCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfZF9jb25uX2V2X3FmeXJzXzQsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfZF9jb25uX2FjdGlvbnNfNCwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9ETV9SU1BfRmJpdF9TRVRfWCBldmVudCwKKyAqIGNhdXNlX2ZsYWcgPSAwCisgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX2RfY29ubl9ldl9xZnlyc180XzFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X2NhdXNlX2ZsYWdfZXFfMCwKKwlbMV0gPSBsbGNfY29ubl9ldl9xbGZ5X3NldF9zdGF0dXNfZGlzYywKKwlbMl0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19kX2Nvbm5fYWN0aW9uc180XzFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zdG9wX2Fja190aW1lciwKKwlbMV0gPSBsbGNfY29ubl9kaXNjLAorCVsyXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19kX2Nvbm5fc3RhdGVfdHJhbnNfNF8xID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9kbV9yc3BfZmJpdF9zZXRfeCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FETSwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19kX2Nvbm5fZXZfcWZ5cnNfNF8xLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2RfY29ubl9hY3Rpb25zXzRfMSwKK307CisKKy8qCisgKiBTdGF0ZSB0cmFuc2l0aW9uIGZvcgorICogTExDX0NPTk5fRVZfREFUQV9DT05OX1JFUSBldmVudAorICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19kX2Nvbm5fZXZfcWZ5cnNfNVtdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfc2V0X3N0YXR1c19yZWZ1c2UsCisJWzFdID0gTlVMTCwKK307CisKKy8qIGp1c3Qgb25lIG1lbWJlciwgTlVMTCwgLmJzcyB6ZXJvZXMgaXQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfZF9jb25uX2FjdGlvbnNfNVsxXTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfZF9jb25uX3N0YXRlX3RyYW5zXzUgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X2RhdGFfcmVxLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfRF9DT05OLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX2RfY29ubl9ldl9xZnlyc181LAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2RfY29ubl9hY3Rpb25zXzUsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfQUNLX1RNUl9FWFAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX2RfY29ubl9ldl9xZnlyc182W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9yZXRyeV9jbnRfbHRfbjIsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfZF9jb25uX2FjdGlvbnNfNltdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfZGlzY19jbWRfcF9zZXRfeCwKKwlbMV0gPSBsbGNfY29ubl9hY19zdGFydF9hY2tfdGltZXIsCisJWzJdID0gbGxjX2Nvbm5fYWNfaW5jX3JldHJ5X2NudF9ieV8xLAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19kX2Nvbm5fc3RhdGVfdHJhbnNfNiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfYWNrX3Rtcl9leHAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9EX0NPTk4sCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfZF9jb25uX2V2X3FmeXJzXzYsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfZF9jb25uX2FjdGlvbnNfNiwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9BQ0tfVE1SX0VYUCBldmVudCwgY2F1c2VfZmxhZyA9IDEgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX2RfY29ubl9ldl9xZnlyc183W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9yZXRyeV9jbnRfZ3RlX24yLAorCVsxXSA9IGxsY19jb25uX2V2X3FsZnlfY2F1c2VfZmxhZ19lcV8xLAorCVsyXSA9IGxsY19jb25uX2V2X3FsZnlfc2V0X3N0YXR1c19mYWlsZWQsCisJWzNdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfZF9jb25uX2FjdGlvbnNfN1tdID0geworCVswXSA9IGxsY19jb25uX2FjX2Rpc2NfY29uZmlybSwKKwlbMV0gPSBsbGNfY29ubl9kaXNjLAorCVsyXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19kX2Nvbm5fc3RhdGVfdHJhbnNfNyA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfYWNrX3Rtcl9leHAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BRE0sCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfZF9jb25uX2V2X3FmeXJzXzcsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfZF9jb25uX2FjdGlvbnNfNywKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9BQ0tfVE1SX0VYUCBldmVudCwgY2F1c2VfZmxhZyA9IDAgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX2RfY29ubl9ldl9xZnlyc184W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9yZXRyeV9jbnRfZ3RlX24yLAorCVsxXSA9IGxsY19jb25uX2V2X3FsZnlfY2F1c2VfZmxhZ19lcV8wLAorCVsyXSA9IGxsY19jb25uX2V2X3FsZnlfc2V0X3N0YXR1c19mYWlsZWQsCisJWzNdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfZF9jb25uX2FjdGlvbnNfOFtdID0geworCVswXSA9IGxsY19jb25uX2Rpc2MsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2RfY29ubl9zdGF0ZV90cmFuc184ID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9hY2tfdG1yX2V4cCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FETSwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19kX2Nvbm5fZXZfcWZ5cnNfOCwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19kX2Nvbm5fYWN0aW9uc184LAorfTsKKworLyoKKyAqIEFycmF5IG9mIHBvaW50ZXJzOworICogb25lIHRvIGVhY2ggdHJhbnNpdGlvbgorICovCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zICpsbGNfZF9jb25uX3N0YXRlX3RyYW5zaXRpb25zW10gPSB7CisJIFswXSA9ICZsbGNfZF9jb25uX3N0YXRlX3RyYW5zXzUsCS8qIFJlcXVlc3QgKi8KKwkgWzFdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfZW5kLAorCSBbMl0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc19lbmQsCS8qIExvY2FsIGJ1c3kgKi8KKwkgWzNdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfZW5kLAkvKiBJbml0aWF0ZSBQRiBjeWNsZSAqLworCSBbNF0gPSAmbGxjX2RfY29ubl9zdGF0ZV90cmFuc182LAkvKiBUaW1lciAqLworCSBbNV0gPSAmbGxjX2RfY29ubl9zdGF0ZV90cmFuc183LAorCSBbNl0gPSAmbGxjX2RfY29ubl9zdGF0ZV90cmFuc184LAorCSBbN10gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc19lbmQsCisJIFs4XSA9ICZsbGNfZF9jb25uX3N0YXRlX3RyYW5zXzEsCS8qIFJlY2VpdmUgZnJhbWUgKi8KKwkgWzldID0gJmxsY19kX2Nvbm5fc3RhdGVfdHJhbnNfMV8xLAorCVsxMF0gPSAmbGxjX2RfY29ubl9zdGF0ZV90cmFuc18yLAorCVsxMV0gPSAmbGxjX2RfY29ubl9zdGF0ZV90cmFuc18yXzEsCisJWzEyXSA9ICZsbGNfZF9jb25uX3N0YXRlX3RyYW5zXzMsCisJWzEzXSA9ICZsbGNfZF9jb25uX3N0YXRlX3RyYW5zXzQsCisJWzE0XSA9ICZsbGNfZF9jb25uX3N0YXRlX3RyYW5zXzRfMSwKKwlbMTVdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfZW5kLAorfTsKKworLyogTExDX0NPTk5fU1RBVEVfUkVTRVQgdHJhbnNpdGlvbnMgKi8KKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9TQUJNRV9DTURfUGJpdF9TRVRfWCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19yc3RfYWN0aW9uc18xW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2V0X3ZzXzAsCisJWzFdID0gbGxjX2Nvbm5fYWNfc2V0X3ZyXzAsCisJWzJdID0gbGxjX2Nvbm5fYWNfc2V0X3NfZmxhZ18xLAorCVszXSA9IGxsY19jb25uX2FjX3NlbmRfdWFfcnNwX2Zfc2V0X3AsCisJWzRdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX3JzdF9zdGF0ZV90cmFuc18xID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9zYWJtZV9jbWRfcGJpdF9zZXRfeCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX1JFU0VULAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19yc3RfYWN0aW9uc18xLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1VBX1JTUF9GYml0X1NFVF9YIGV2ZW50LAorICogY2F1c2VfZmxhZyA9IDEKKyAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfcnN0X2V2X3FmeXJzXzJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV9mLAorCVsxXSA9IGxsY19jb25uX2V2X3FsZnlfY2F1c2VfZmxhZ19lcV8xLAorCVsyXSA9IGxsY19jb25uX2V2X3FsZnlfc2V0X3N0YXR1c19jb25uLAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX3JzdF9hY3Rpb25zXzJbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zdG9wX2Fja190aW1lciwKKwlbMV0gPSBsbGNfY29ubl9hY19zZXRfdnNfMCwKKwlbMl0gPSBsbGNfY29ubl9hY19zZXRfdnJfMCwKKwlbM10gPSBsbGNfY29ubl9hY191cGRfcF9mbGFnLAorCVs0XSA9IGxsY19jb25uX2FjX3JzdF9jb25maXJtLAorCVs1XSA9IGxsY19jb25uX2FjX3NldF9yZW1vdGVfYnVzeV8wLAorCVs2XSA9IGxsY19jb25uX3Jlc2V0LAorCVs3XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19yc3Rfc3RhdGVfdHJhbnNfMiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfdWFfcnNwX2ZiaXRfc2V0X3gsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9OT1JNQUwsCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfcnN0X2V2X3FmeXJzXzIsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfcnN0X2FjdGlvbnNfMiwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9VQV9SU1BfRmJpdF9TRVRfWCBldmVudCwKKyAqIGNhdXNlX2ZsYWcgPSAwCisgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX3JzdF9ldl9xZnlyc18yXzFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3BfZmxhZ19lcV9mLAorCVsxXSA9IGxsY19jb25uX2V2X3FsZnlfY2F1c2VfZmxhZ19lcV8wLAorCVsyXSA9IGxsY19jb25uX2V2X3FsZnlfc2V0X3N0YXR1c19yc3RfZG9uZSwKKwlbM10gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19yc3RfYWN0aW9uc18yXzFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zdG9wX2Fja190aW1lciwKKwlbMV0gPSBsbGNfY29ubl9hY19zZXRfdnNfMCwKKwlbMl0gPSBsbGNfY29ubl9hY19zZXRfdnJfMCwKKwlbM10gPSBsbGNfY29ubl9hY191cGRfcF9mbGFnLAorCVs0XSA9IGxsY19jb25uX2FjX3JzdF9jb25maXJtLAorCVs1XSA9IGxsY19jb25uX2FjX3NldF9yZW1vdGVfYnVzeV8wLAorCVs2XSA9IGxsY19jb25uX3Jlc2V0LAorCVs3XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19yc3Rfc3RhdGVfdHJhbnNfMl8xID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF91YV9yc3BfZmJpdF9zZXRfeCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX05PUk1BTCwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19yc3RfZXZfcWZ5cnNfMl8xLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX3JzdF9hY3Rpb25zXzJfMSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9BQ0tfVE1SX0VYUCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfcnN0X2V2X3FmeXJzXzNbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3NfZmxhZ19lcV8xLAorCVsxXSA9IGxsY19jb25uX2V2X3FsZnlfc2V0X3N0YXR1c19yc3RfZG9uZSwKKwlbMl0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19yc3RfYWN0aW9uc18zW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2V0X3BfZmxhZ18wLAorCVsxXSA9IGxsY19jb25uX2FjX3NldF9yZW1vdGVfYnVzeV8wLAorCVsyXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19yc3Rfc3RhdGVfdHJhbnNfMyA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfYWNrX3Rtcl9leHAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9OT1JNQUwsCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfcnN0X2V2X3FmeXJzXzMsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfcnN0X2FjdGlvbnNfMywKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9ESVNDX0NNRF9QYml0X1NFVF9YIGV2ZW50LAorICogY2F1c2VfZmxhZyA9IDEKKyAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfcnN0X2V2X3FmeXJzXzRbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X2NhdXNlX2ZsYWdfZXFfMSwKKwlbMV0gPSBsbGNfY29ubl9ldl9xbGZ5X3NldF9zdGF0dXNfZGlzYywKKwlbMl0gPSBOVUxMLAorfTsKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfcnN0X2FjdGlvbnNfNFtdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfZG1fcnNwX2Zfc2V0X3AsCisJWzFdID0gbGxjX2Nvbm5fYWNfZGlzY19pbmQsCisJWzJdID0gbGxjX2Nvbm5fYWNfc3RvcF9hY2tfdGltZXIsCisJWzNdID0gbGxjX2Nvbm5fZGlzYywKKwlbNF0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfcnN0X3N0YXRlX3RyYW5zXzQgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X2Rpc2NfY21kX3BiaXRfc2V0X3gsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BRE0sCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfcnN0X2V2X3FmeXJzXzQsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfcnN0X2FjdGlvbnNfNCwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9ESVNDX0NNRF9QYml0X1NFVF9YIGV2ZW50LAorICogY2F1c2VfZmxhZyA9IDAKKyAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfcnN0X2V2X3FmeXJzXzRfMVtdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfY2F1c2VfZmxhZ19lcV8wLAorCVsxXSA9IGxsY19jb25uX2V2X3FsZnlfc2V0X3N0YXR1c19yZWZ1c2UsCisJWzJdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfcnN0X2FjdGlvbnNfNF8xW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9kbV9yc3BfZl9zZXRfcCwKKwlbMV0gPSBsbGNfY29ubl9hY19zdG9wX2Fja190aW1lciwKKwlbMl0gPSBsbGNfY29ubl9kaXNjLAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19yc3Rfc3RhdGVfdHJhbnNfNF8xID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9kaXNjX2NtZF9wYml0X3NldF94LAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQURNLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX3JzdF9ldl9xZnlyc180XzEsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfcnN0X2FjdGlvbnNfNF8xLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0RNX1JTUF9GYml0X1NFVF9YIGV2ZW50LAorICogY2F1c2VfZmxhZyA9IDEKKyAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfcnN0X2V2X3FmeXJzXzVbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X2NhdXNlX2ZsYWdfZXFfMSwKKwlbMV0gPSBsbGNfY29ubl9ldl9xbGZ5X3NldF9zdGF0dXNfZGlzYywKKwlbMl0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19yc3RfYWN0aW9uc181W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfZGlzY19pbmQsCisJWzFdID0gbGxjX2Nvbm5fYWNfc3RvcF9hY2tfdGltZXIsCisJWzJdID0gbGxjX2Nvbm5fZGlzYywKKwlbM10gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfcnN0X3N0YXRlX3RyYW5zXzUgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X2RtX3JzcF9mYml0X3NldF94LAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQURNLAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX3JzdF9ldl9xZnlyc181LAorCS5ldl9hY3Rpb25zICAgID0gbGxjX3JzdF9hY3Rpb25zXzUsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfRE1fUlNQX0ZiaXRfU0VUX1ggZXZlbnQsCisgKiBjYXVzZV9mbGFnID0gMAorICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19yc3RfZXZfcWZ5cnNfNV8xW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9jYXVzZV9mbGFnX2VxXzAsCisJWzFdID0gbGxjX2Nvbm5fZXZfcWxmeV9zZXRfc3RhdHVzX3JlZnVzZSwKKwlbMl0gPSBOVUxMLAorfTsKKworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19yc3RfYWN0aW9uc181XzFbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zdG9wX2Fja190aW1lciwKKwlbMV0gPSBsbGNfY29ubl9kaXNjLAorCVsyXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19yc3Rfc3RhdGVfdHJhbnNfNV8xID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF9kbV9yc3BfZmJpdF9zZXRfeCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FETSwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19yc3RfZXZfcWZ5cnNfNV8xLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX3JzdF9hY3Rpb25zXzVfMSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBEQVRBX0NPTk5fUkVRIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19yc3RfZXZfcWZ5cnNfNltdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfc2V0X3N0YXR1c19yZWZ1c2UsCisJWzFdID0gTlVMTCwKK307CisKKy8qIGp1c3Qgb25lIG1lbWJlciwgTlVMTCwgLmJzcyB6ZXJvZXMgaXQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfcnN0X2FjdGlvbnNfNlsxXTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfcnN0X3N0YXRlX3RyYW5zXzYgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X2RhdGFfcmVxLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfUkVTRVQsCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfcnN0X2V2X3FmeXJzXzYsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfcnN0X2FjdGlvbnNfNiwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9BQ0tfVE1SX0VYUCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfcnN0X2V2X3FmeXJzXzdbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3JldHJ5X2NudF9sdF9uMiwKKwlbMV0gPSBsbGNfY29ubl9ldl9xbGZ5X3NfZmxhZ19lcV8wLAorCVsyXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX3JzdF9hY3Rpb25zXzdbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX3NhYm1lX2NtZF9wX3NldF94LAorCVsxXSA9IGxsY19jb25uX2FjX3N0YXJ0X2Fja190aW1lciwKKwlbMl0gPSBsbGNfY29ubl9hY19pbmNfcmV0cnlfY250X2J5XzEsCisJWzNdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX3JzdF9zdGF0ZV90cmFuc183ID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9hY2tfdG1yX2V4cCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX1JFU0VULAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX3JzdF9ldl9xZnlyc183LAorCS5ldl9hY3Rpb25zICAgID0gbGxjX3JzdF9hY3Rpb25zXzcsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfQUNLX1RNUl9FWFAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX3JzdF9ldl9xZnlyc184W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9yZXRyeV9jbnRfZ3RlX24yLAorCVsxXSA9IGxsY19jb25uX2V2X3FsZnlfc19mbGFnX2VxXzAsCisJWzJdID0gbGxjX2Nvbm5fZXZfcWxmeV9jYXVzZV9mbGFnX2VxXzEsCisJWzNdID0gbGxjX2Nvbm5fZXZfcWxmeV9zZXRfc3RhdHVzX2ZhaWxlZCwKKwlbNF0gPSBOVUxMLAorfTsKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfcnN0X2FjdGlvbnNfOFtdID0geworCVswXSA9IGxsY19jb25uX2FjX2Rpc2NfaW5kLAorCVsxXSA9IGxsY19jb25uX2Rpc2MsCisJWzJdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX3JzdF9zdGF0ZV90cmFuc184ID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9hY2tfdG1yX2V4cCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FETSwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19yc3RfZXZfcWZ5cnNfOCwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19yc3RfYWN0aW9uc184LAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX0FDS19UTVJfRVhQIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fZXZfcWZ5cl90IGxsY19yc3RfZXZfcWZ5cnNfOF8xW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fZXZfcWxmeV9yZXRyeV9jbnRfZ3RlX24yLAorCVsxXSA9IGxsY19jb25uX2V2X3FsZnlfc19mbGFnX2VxXzAsCisJWzJdID0gbGxjX2Nvbm5fZXZfcWxmeV9jYXVzZV9mbGFnX2VxXzAsCisJWzNdID0gbGxjX2Nvbm5fZXZfcWxmeV9zZXRfc3RhdHVzX2ZhaWxlZCwKKwlbNF0gPSBOVUxMLAorfTsKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfcnN0X2FjdGlvbnNfOF8xW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfZGlzY19pbmQsCisJWzFdID0gbGxjX2Nvbm5fZGlzYywKKwlbMl0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfcnN0X3N0YXRlX3RyYW5zXzhfMSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfYWNrX3Rtcl9leHAsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9BRE0sCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfcnN0X2V2X3FmeXJzXzhfMSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19yc3RfYWN0aW9uc184XzEsCit9OworCisvKgorICogQXJyYXkgb2YgcG9pbnRlcnM7CisgKiBvbmUgdG8gZWFjaCB0cmFuc2l0aW9uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgKmxsY19yc3Rfc3RhdGVfdHJhbnNpdGlvbnNbXSA9IHsKKwkgWzBdID0gJmxsY19yc3Rfc3RhdGVfdHJhbnNfNiwJCS8qIFJlcXVlc3QgKi8KKwkgWzFdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfZW5kLAorCSBbMl0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc19lbmQsCS8qIExvY2FsIGJ1c3kgKi8KKwkgWzNdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfZW5kLAkvKiBJbml0aWF0ZSBQRiBjeWNsZSAqLworCSBbNF0gPSAmbGxjX3JzdF9zdGF0ZV90cmFuc18zLAkJLyogVGltZXIgKi8KKwkgWzVdID0gJmxsY19yc3Rfc3RhdGVfdHJhbnNfNywKKwkgWzZdID0gJmxsY19yc3Rfc3RhdGVfdHJhbnNfOCwKKwkgWzddID0gJmxsY19yc3Rfc3RhdGVfdHJhbnNfOF8xLAorCSBbOF0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc19lbmQsCisJIFs5XSA9ICZsbGNfcnN0X3N0YXRlX3RyYW5zXzEsCQkvKiBSZWNlaXZlIGZyYW1lICovCisJWzEwXSA9ICZsbGNfcnN0X3N0YXRlX3RyYW5zXzIsCisJWzExXSA9ICZsbGNfcnN0X3N0YXRlX3RyYW5zXzJfMSwKKwlbMTJdID0gJmxsY19yc3Rfc3RhdGVfdHJhbnNfNCwKKwlbMTNdID0gJmxsY19yc3Rfc3RhdGVfdHJhbnNfNF8xLAorCVsxNF0gPSAmbGxjX3JzdF9zdGF0ZV90cmFuc181LAorCVsxNV0gPSAmbGxjX3JzdF9zdGF0ZV90cmFuc181XzEsCisJWzE2XSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zX2VuZCwKK307CisKKy8qIExMQ19DT05OX1NUQVRFX0VSUk9SIHRyYW5zaXRpb25zICovCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfU0FCTUVfQ01EX1BiaXRfU0VUX1ggZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfZXJyb3JfYWN0aW9uc18xW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2V0X3ZzXzAsCisJWzFdID0gbGxjX2Nvbm5fYWNfc2V0X3ZyXzAsCisJWzJdID0gbGxjX2Nvbm5fYWNfc2VuZF91YV9yc3BfZl9zZXRfcCwKKwlbM10gPSBsbGNfY29ubl9hY19yc3RfaW5kLAorCVs0XSA9IGxsY19jb25uX2FjX3NldF9wX2ZsYWdfMCwKKwlbNV0gPSBsbGNfY29ubl9hY19zZXRfcmVtb3RlX2J1c3lfMCwKKwlbNl0gPSBsbGNfY29ubl9hY19zdG9wX2Fja190aW1lciwKKwlbN10gPSBsbGNfY29ubl9yZXNldCwKKwlbOF0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfZXJyb3Jfc3RhdGVfdHJhbnNfMSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfc2FibWVfY21kX3BiaXRfc2V0X3gsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9OT1JNQUwsCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2Vycm9yX2FjdGlvbnNfMSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9SWF9ESVNDX0NNRF9QYml0X1NFVF9YIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2Vycm9yX2FjdGlvbnNfMltdID0geworCVswXSA9IGxsY19jb25uX2FjX3NlbmRfdWFfcnNwX2Zfc2V0X3AsCisJWzFdID0gbGxjX2Nvbm5fYWNfZGlzY19pbmQsCisJWzJdID0gbGxjX2Nvbm5fYWNfc3RvcF9hY2tfdGltZXIsCisJWzNdID0gbGxjX2Nvbm5fZGlzYywKKwlbNF0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfZXJyb3Jfc3RhdGVfdHJhbnNfMiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfZGlzY19jbWRfcGJpdF9zZXRfeCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FETSwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfZXJyb3JfYWN0aW9uc18yLAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX0RNX1JTUF9GYml0X1NFVF9YIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2Vycm9yX2FjdGlvbnNfM1tdID0geworCVswXSA9IGxsY19jb25uX2FjX2Rpc2NfaW5kLAorCVsxXSA9IGxsY19jb25uX2FjX3N0b3BfYWNrX3RpbWVyLAorCVsyXSA9IGxsY19jb25uX2Rpc2MsCisJWzNdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2Vycm9yX3N0YXRlX3RyYW5zXzMgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X3J4X2RtX3JzcF9mYml0X3NldF94LAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQURNLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19lcnJvcl9hY3Rpb25zXzMsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfRlJNUl9SU1BfRmJpdF9TRVRfWCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2FjdGlvbl90IGxsY19lcnJvcl9hY3Rpb25zXzRbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9hY19zZW5kX3NhYm1lX2NtZF9wX3NldF94LAorCVsxXSA9IGxsY19jb25uX2FjX3N0YXJ0X2Fja190aW1lciwKKwlbMl0gPSBsbGNfY29ubl9hY19zZXRfcmV0cnlfY250XzAsCisJWzNdID0gbGxjX2Nvbm5fYWNfc2V0X2NhdXNlX2ZsYWdfMCwKKwlbNF0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfZXJyb3Jfc3RhdGVfdHJhbnNfNCA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfZnJtcl9yc3BfZmJpdF9zZXRfeCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX1JFU0VULAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19lcnJvcl9hY3Rpb25zXzQsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfUlhfWFhYX0NNRF9QYml0X1NFVF9YIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2Vycm9yX2FjdGlvbnNfNVtdID0geworCVswXSA9IGxsY19jb25uX2FjX3Jlc2VuZF9mcm1yX3JzcF9mX3NldF9wLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19lcnJvcl9zdGF0ZV90cmFuc181ID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9yeF94eHhfY21kX3BiaXRfc2V0X3gsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9FUlJPUiwKKwkuZXZfcXVhbGlmaWVycyA9IE5PTkUsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfZXJyb3JfYWN0aW9uc181LAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX1JYX1hYWF9SU1BfRmJpdF9TRVRfWCBldmVudCAqLworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfZXJyb3Jfc3RhdGVfdHJhbnNfNiA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfcnhfeHh4X3JzcF9mYml0X3NldF94LAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfRVJST1IsCisJLmV2X3F1YWxpZmllcnMgPSBOT05FLAorCS5ldl9hY3Rpb25zICAgID0gTk9ORSwKK307CisKKy8qIFN0YXRlIHRyYW5zaXRpb25zIGZvciBMTENfQ09OTl9FVl9BQ0tfVE1SX0VYUCBldmVudCAqLworc3RhdGljIGxsY19jb25uX2V2X3FmeXJfdCBsbGNfZXJyb3JfZXZfcWZ5cnNfN1tdID0geworCVswXSA9IGxsY19jb25uX2V2X3FsZnlfcmV0cnlfY250X2x0X24yLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2Vycm9yX2FjdGlvbnNfN1tdID0geworCVswXSA9IGxsY19jb25uX2FjX3Jlc2VuZF9mcm1yX3JzcF9mX3NldF8wLAorCVsxXSA9IGxsY19jb25uX2FjX3N0YXJ0X2Fja190aW1lciwKKwlbMl0gPSBsbGNfY29ubl9hY19pbmNfcmV0cnlfY250X2J5XzEsCisJWzNdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfdHJhbnMgbGxjX2Vycm9yX3N0YXRlX3RyYW5zXzcgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X2Fja190bXJfZXhwLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfRVJST1IsCisJLmV2X3F1YWxpZmllcnMgPSBsbGNfZXJyb3JfZXZfcWZ5cnNfNywKKwkuZXZfYWN0aW9ucyAgICA9IGxsY19lcnJvcl9hY3Rpb25zXzcsCit9OworCisvKiBTdGF0ZSB0cmFuc2l0aW9ucyBmb3IgTExDX0NPTk5fRVZfQUNLX1RNUl9FWFAgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX2Vycm9yX2V2X3FmeXJzXzhbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3JldHJ5X2NudF9ndGVfbjIsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBsbGNfY29ubl9hY3Rpb25fdCBsbGNfZXJyb3JfYWN0aW9uc184W10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc2VuZF9zYWJtZV9jbWRfcF9zZXRfeCwKKwlbMV0gPSBsbGNfY29ubl9hY19zZXRfc19mbGFnXzAsCisJWzJdID0gbGxjX2Nvbm5fYWNfc3RhcnRfYWNrX3RpbWVyLAorCVszXSA9IGxsY19jb25uX2FjX3NldF9yZXRyeV9jbnRfMCwKKwlbNF0gPSBsbGNfY29ubl9hY19zZXRfY2F1c2VfZmxhZ18wLAorCVs1XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY19lcnJvcl9zdGF0ZV90cmFuc184ID0geworCS5ldgkgICAgICAgPSBsbGNfY29ubl9ldl9hY2tfdG1yX2V4cCwKKwkubmV4dF9zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX1JFU0VULAorCS5ldl9xdWFsaWZpZXJzID0gbGxjX2Vycm9yX2V2X3FmeXJzXzgsCisJLmV2X2FjdGlvbnMgICAgPSBsbGNfZXJyb3JfYWN0aW9uc184LAorfTsKKworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX0RBVEFfQ09OTl9SRVEgZXZlbnQgKi8KK3N0YXRpYyBsbGNfY29ubl9ldl9xZnlyX3QgbGxjX2Vycm9yX2V2X3FmeXJzXzlbXSA9IHsKKwlbMF0gPSBsbGNfY29ubl9ldl9xbGZ5X3NldF9zdGF0dXNfcmVmdXNlLAorCVsxXSA9IE5VTEwsCit9OworCisvKiBqdXN0IG9uZSBtZW1iZXIsIE5VTEwsIC5ic3MgemVyb2VzIGl0ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX2Vycm9yX2FjdGlvbnNfOVsxXTsKKworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyBsbGNfZXJyb3Jfc3RhdGVfdHJhbnNfOSA9IHsKKwkuZXYJICAgICAgID0gbGxjX2Nvbm5fZXZfZGF0YV9yZXEsCisJLm5leHRfc3RhdGUgICAgPSBMTENfQ09OTl9TVEFURV9FUlJPUiwKKwkuZXZfcXVhbGlmaWVycyA9IGxsY19lcnJvcl9ldl9xZnlyc185LAorCS5ldl9hY3Rpb25zICAgID0gbGxjX2Vycm9yX2FjdGlvbnNfOSwKK307CisKKy8qCisgKiBBcnJheSBvZiBwb2ludGVyczsKKyAqIG9uZSB0byBlYWNoIHRyYW5zaXRpb24KKyAqLworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyAqbGxjX2Vycm9yX3N0YXRlX3RyYW5zaXRpb25zW10gPSB7CisJIFswXSA9ICZsbGNfZXJyb3Jfc3RhdGVfdHJhbnNfOSwJLyogUmVxdWVzdCAqLworCSBbMV0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc19lbmQsCisJIFsyXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zX2VuZCwJLyogTG9jYWwgYnVzeSAqLworCSBbM10gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc19lbmQsCS8qIEluaXRpYXRlIFBGIGN5Y2xlICovCisJIFs0XSA9ICZsbGNfZXJyb3Jfc3RhdGVfdHJhbnNfNywJLyogVGltZXIgKi8KKwkgWzVdID0gJmxsY19lcnJvcl9zdGF0ZV90cmFuc184LAorCSBbNl0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc19lbmQsCisJIFs3XSA9ICZsbGNfZXJyb3Jfc3RhdGVfdHJhbnNfMSwJLyogUmVjZWl2ZSBmcmFtZSAqLworCSBbOF0gPSAmbGxjX2Vycm9yX3N0YXRlX3RyYW5zXzIsCisJIFs5XSA9ICZsbGNfZXJyb3Jfc3RhdGVfdHJhbnNfMywKKwlbMTBdID0gJmxsY19lcnJvcl9zdGF0ZV90cmFuc180LAorCVsxMV0gPSAmbGxjX2Vycm9yX3N0YXRlX3RyYW5zXzUsCisJWzEyXSA9ICZsbGNfZXJyb3Jfc3RhdGVfdHJhbnNfNiwKKwlbMTNdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfZW5kLAorfTsKKworLyogTExDX0NPTk5fU1RBVEVfVEVNUCB0cmFuc2l0aW9ucyAqLworLyogU3RhdGUgdHJhbnNpdGlvbnMgZm9yIExMQ19DT05OX0VWX0RJU0NfUkVRIGV2ZW50ICovCitzdGF0aWMgbGxjX2Nvbm5fYWN0aW9uX3QgbGxjX3RlbXBfYWN0aW9uc18xW10gPSB7CisJWzBdID0gbGxjX2Nvbm5fYWNfc3RvcF9hbGxfdGltZXJzLAorCVsxXSA9IGxsY19jb25uX2FjX3NlbmRfZGlzY19jbWRfcF9zZXRfeCwKKwlbMl0gPSBsbGNfY29ubl9kaXNjLAorCVszXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zIGxsY190ZW1wX3N0YXRlX3RyYW5zXzEgPSB7CisJLmV2CSAgICAgICA9IGxsY19jb25uX2V2X2Rpc2NfcmVxLAorCS5uZXh0X3N0YXRlICAgID0gTExDX0NPTk5fU1RBVEVfQURNLAorCS5ldl9xdWFsaWZpZXJzID0gTk9ORSwKKwkuZXZfYWN0aW9ucyAgICA9IGxsY190ZW1wX2FjdGlvbnNfMSwKK307CisKKy8qCisgKiBBcnJheSBvZiBwb2ludGVyczsKKyAqIG9uZSB0byBlYWNoIHRyYW5zaXRpb24KKyAqLworc3RhdGljIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyAqbGxjX3RlbXBfc3RhdGVfdHJhbnNpdGlvbnNbXSA9IHsKKwlbMF0gPSAmbGxjX3RlbXBfc3RhdGVfdHJhbnNfMSwJCS8qIHJlcXVlc3RzICovCisJWzFdID0gJmxsY19jb21tb25fc3RhdGVfdHJhbnNfZW5kLAorCVsyXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zX2VuZCwJLyogbG9jYWwgYnVzeSAqLworCVszXSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zX2VuZCwJLyogaW5pdF9wZl9jeWNsZSAqLworCVs0XSA9ICZsbGNfY29tbW9uX3N0YXRlX3RyYW5zX2VuZCwJLyogdGltZXIgKi8KKwlbNV0gPSAmbGxjX2NvbW1vbl9zdGF0ZV90cmFuc19lbmQsCS8qIHJlY2VpdmUgKi8KK307CisKKy8qIENvbm5lY3Rpb24gU3RhdGUgVHJhbnNpdGlvbiBUYWJsZSAqLworc3RydWN0IGxsY19jb25uX3N0YXRlIGxsY19jb25uX3N0YXRlX3RhYmxlW05CUl9DT05OX1NUQVRFU10gPSB7CisJW0xMQ19DT05OX1NUQVRFX0FETSAtIDFdID0geworCQkuY3VycmVudF9zdGF0ZQk9IExMQ19DT05OX1NUQVRFX0FETSwKKwkJLnRyYW5zaXRpb25zCT0gbGxjX2FkbV9zdGF0ZV90cmFuc2l0aW9ucywKKwl9LAorCVtMTENfQ09OTl9TVEFURV9TRVRVUCAtIDFdID0geworCQkuY3VycmVudF9zdGF0ZQk9IExMQ19DT05OX1NUQVRFX1NFVFVQLAorCQkudHJhbnNpdGlvbnMJPSBsbGNfc2V0dXBfc3RhdGVfdHJhbnNpdGlvbnMsCisJfSwKKwlbTExDX0NPTk5fU1RBVEVfTk9STUFMIC0gMV0gPSB7CisJCS5jdXJyZW50X3N0YXRlCT0gTExDX0NPTk5fU1RBVEVfTk9STUFMLAorCQkudHJhbnNpdGlvbnMJPSBsbGNfbm9ybWFsX3N0YXRlX3RyYW5zaXRpb25zLAorCX0sCisJW0xMQ19DT05OX1NUQVRFX0JVU1kgLSAxXSA9IHsKKwkJLmN1cnJlbnRfc3RhdGUJPSBMTENfQ09OTl9TVEFURV9CVVNZLAorCQkudHJhbnNpdGlvbnMJPSBsbGNfYnVzeV9zdGF0ZV90cmFuc2l0aW9ucywKKwl9LAorCVtMTENfQ09OTl9TVEFURV9SRUogLSAxXSA9IHsKKwkJLmN1cnJlbnRfc3RhdGUJPSBMTENfQ09OTl9TVEFURV9SRUosCisJCS50cmFuc2l0aW9ucwk9IGxsY19yZWplY3Rfc3RhdGVfdHJhbnNpdGlvbnMsCisJfSwKKwlbTExDX0NPTk5fU1RBVEVfQVdBSVQgLSAxXSA9IHsKKwkJLmN1cnJlbnRfc3RhdGUJPSBMTENfQ09OTl9TVEFURV9BV0FJVCwKKwkJLnRyYW5zaXRpb25zCT0gbGxjX2F3YWl0X3N0YXRlX3RyYW5zaXRpb25zLAorCX0sCisJW0xMQ19DT05OX1NUQVRFX0FXQUlUX0JVU1kgLSAxXSA9IHsKKwkJLmN1cnJlbnRfc3RhdGUJPSBMTENfQ09OTl9TVEFURV9BV0FJVF9CVVNZLAorCQkudHJhbnNpdGlvbnMJPSBsbGNfYXdhaXRfYnVzeV9zdGF0ZV90cmFuc2l0aW9ucywKKwl9LAorCVtMTENfQ09OTl9TVEFURV9BV0FJVF9SRUogLSAxXSA9IHsKKwkJLmN1cnJlbnRfc3RhdGUJPSBMTENfQ09OTl9TVEFURV9BV0FJVF9SRUosCisJCS50cmFuc2l0aW9ucwk9IGxsY19hd2FpdF9yZWpjdF9zdGF0ZV90cmFuc2l0aW9ucywKKwl9LAorCVtMTENfQ09OTl9TVEFURV9EX0NPTk4gLSAxXSA9IHsKKwkJLmN1cnJlbnRfc3RhdGUJPSBMTENfQ09OTl9TVEFURV9EX0NPTk4sCisJCS50cmFuc2l0aW9ucwk9IGxsY19kX2Nvbm5fc3RhdGVfdHJhbnNpdGlvbnMsCisJfSwKKwlbTExDX0NPTk5fU1RBVEVfUkVTRVQgLSAxXSA9IHsKKwkJLmN1cnJlbnRfc3RhdGUJPSBMTENfQ09OTl9TVEFURV9SRVNFVCwKKwkJLnRyYW5zaXRpb25zCT0gbGxjX3JzdF9zdGF0ZV90cmFuc2l0aW9ucywKKwl9LAorCVtMTENfQ09OTl9TVEFURV9FUlJPUiAtIDFdID0geworCQkuY3VycmVudF9zdGF0ZQk9IExMQ19DT05OX1NUQVRFX0VSUk9SLAorCQkudHJhbnNpdGlvbnMJPSBsbGNfZXJyb3Jfc3RhdGVfdHJhbnNpdGlvbnMsCisJfSwKKwlbTExDX0NPTk5fU1RBVEVfVEVNUCAtIDFdID0geworCQkuY3VycmVudF9zdGF0ZQk9IExMQ19DT05OX1NUQVRFX1RFTVAsCisJCS50cmFuc2l0aW9ucwk9IGxsY190ZW1wX3N0YXRlX3RyYW5zaXRpb25zLAorCX0sCit9OwpkaWZmIC0tZ2l0IGEvbmV0L2xsYy9sbGNfY29ubi5jIGIvbmV0L2xsYy9sbGNfY29ubi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYTgxMmEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbGxjL2xsY19jb25uLmMKQEAgLTAsMCArMSw5MTUgQEAKKy8qCisgKiBsbGNfY29ubi5jIC0gRHJpdmVyIHJvdXRpbmVzIGZvciBjb25uZWN0aW9uIGNvbXBvbmVudC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcgYnkgUHJvY29tIFRlY2hub2xvZ3ksIEluYy4KKyAqCQkgMjAwMS0yMDAzIGJ5IEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBjYW4gYmUgcmVkaXN0cmlidXRlZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSBvciBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuCisgKgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bmV0L2xsY19zYXAuaD4KKyNpbmNsdWRlIDxuZXQvbGxjX2Nvbm4uaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPG5ldC9sbGNfY19ldi5oPgorI2luY2x1ZGUgPG5ldC9sbGNfY19hYy5oPgorI2luY2x1ZGUgPG5ldC9sbGNfY19zdC5oPgorI2luY2x1ZGUgPG5ldC9sbGNfcGR1Lmg+CisKKyNpZiAwCisjZGVmaW5lIGRwcmludGsoYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgYXJncykKKyNlbHNlCisjZGVmaW5lIGRwcmludGsoYXJncy4uLikKKyNlbmRpZgorCitzdGF0aWMgaW50IGxsY19maW5kX29mZnNldChpbnQgc3RhdGUsIGludCBldl90eXBlKTsKK3N0YXRpYyB2b2lkIGxsY19jb25uX3NlbmRfcGR1cyhzdHJ1Y3Qgc29jayAqc2spOworc3RhdGljIGludCBsbGNfY29ubl9zZXJ2aWNlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgaW50IGxsY19leGVjX2Nvbm5fdHJhbnNfYWN0aW9ucyhzdHJ1Y3Qgc29jayAqc2ssCisJCQkJICAgICAgIHN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyAqdHJhbnMsCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpldik7CitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zICpsbGNfcXVhbGlmeV9jb25uX2V2KHN0cnVjdCBzb2NrICpzaywKKwkJCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworLyogT2Zmc2V0IHRhYmxlIG9uIGNvbm5lY3Rpb24gc3RhdGVzIHRyYW5zaXRpb24gZGlhZ3JhbSAqLworc3RhdGljIGludCBsbGNfb2Zmc2V0X3RhYmxlW05CUl9DT05OX1NUQVRFU11bTkJSX0NPTk5fRVZdOworCisvKioKKyAqCWxsY19jb25uX3N0YXRlX3Byb2Nlc3MgLSBzZW5kcyBldmVudCB0byBjb25uZWN0aW9uIHN0YXRlIG1hY2hpbmUKKyAqCUBzazogY29ubmVjdGlvbgorICoJQHNrYjogb2NjdXJyZWQgZXZlbnQKKyAqCisgKglTZW5kcyBhbiBldmVudCB0byBjb25uZWN0aW9uIHN0YXRlIG1hY2hpbmUuIEFmdGVyIHByb2Nlc3NpbmcgZXZlbnQKKyAqCShleGVjdXRpbmcgaXQncyBhY3Rpb25zIGFuZCBjaGFuZ2luZyBzdGF0ZSksIHVwcGVyIGxheWVyIHdpbGwgYmUKKyAqCWluZGljYXRlZCBvciBjb25maXJtZWQsIGlmIG5lZWRlZC4gUmV0dXJucyAwIGZvciBzdWNjZXNzLCAxIGZvcgorICoJZmFpbHVyZS4gVGhlIHNvY2tldCBsb2NrIGhhcyB0byBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKi8KK2ludCBsbGNfY29ubl9zdGF0ZV9wcm9jZXNzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmM7CisJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2soc2spOworCXN0cnVjdCBsbGNfY29ubl9zdGF0ZV9ldiAqZXYgPSBsbGNfY29ubl9ldihza2IpOworCisJLyoKKwkgKiBXZSBoYXZlIHRvIGhvbGQgdGhlIHNrYiwgYmVjYXVzZSBsbGNfY29ubl9zZXJ2aWNlIHdpbGwga2ZyZWUgaXQgaW4KKwkgKiB0aGUgc2VuZGluZyBwYXRoIGFuZCB3ZSBuZWVkIHRvIGxvb2sgYXQgdGhlIHNrYi0+Y2IsIHdoZXJlIHdlIGVuY29kZQorCSAqIGxsY19jb25uX3N0YXRlX2V2LgorCSAqLworCXNrYl9nZXQoc2tiKTsKKwlldi0+aW5kX3ByaW0gPSBldi0+Y2ZtX3ByaW0gPSAwOworCXJjID0gbGxjX2Nvbm5fc2VydmljZShzaywgc2tiKTsgLyogc2VuZGluZyBldmVudCB0byBzdGF0ZSBtYWNoaW5lICovCisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGxsY19jb25uX3NlcnZpY2UgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dF9rZnJlZV9za2I7CisJfQorCisJaWYgKCFldi0+aW5kX3ByaW0gJiYgIWV2LT5jZm1fcHJpbSkgeworCQkvKiBpbmRpY2F0ZSBvciBjb25maXJtIG5vdCByZXF1aXJlZCAqLworCQlpZiAoIXNrYi0+bGlzdCkKKwkJCWdvdG8gb3V0X2tmcmVlX3NrYjsKKwkJZ290byBvdXRfc2tiX3B1dDsKKwl9CisKKwlpZiAoZXYtPmluZF9wcmltICYmIGV2LT5jZm1fcHJpbSkgLyogUGFyYW5vaWEgKi8KKwkJc2tiX2dldChza2IpOworCisJc3dpdGNoIChldi0+aW5kX3ByaW0pIHsKKwljYXNlIExMQ19EQVRBX1BSSU06CisJCWxsY19zYXZlX3ByaW1pdGl2ZShza2IsIExMQ19EQVRBX1BSSU0pOworCQlpZiAoc29ja19xdWV1ZV9yY3Zfc2tiKHNrLCBza2IpKSB7CisJCQkvKgorCQkJICogc2hvdWxkbid0IGhhcHBlbgorCQkJICovCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzb2NrX3F1ZXVlX3Jjdl9za2IgZmFpbGVkIVxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBMTENfQ09OTl9QUklNOiB7CisJCXN0cnVjdCBzb2NrICpwYXJlbnQgPSBza2ItPnNrOworCisJCXNrYi0+c2sgPSBzazsKKwkJc2tiX3F1ZXVlX3RhaWwoJnBhcmVudC0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKKwkJc2stPnNrX3N0YXRlX2NoYW5nZShwYXJlbnQpOworCX0KKwkJYnJlYWs7CisJY2FzZSBMTENfRElTQ19QUklNOgorCQlzb2NrX2hvbGQoc2spOworCQlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19TVFJFQU0gJiYKKwkJICAgIHNrLT5za19zdGF0ZSA9PSBUQ1BfRVNUQUJMSVNIRUQpIHsKKwkJCXNrLT5za19zaHV0ZG93biAgICAgICA9IFNIVVRET1dOX01BU0s7CisJCQlzay0+c2tfc29ja2V0LT5zdGF0ZSAgPSBTU19VTkNPTk5FQ1RFRDsKKwkJCXNrLT5za19zdGF0ZSAgICAgICAgICA9IFRDUF9DTE9TRTsKKwkJCWlmICghc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKSB7CisJCQkJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisJCQkJc29ja19zZXRfZmxhZyhzaywgU09DS19ERUFEKTsKKwkJCX0KKwkJfQorCQlrZnJlZV9za2Ioc2tiKTsKKwkJc29ja19wdXQoc2spOworCQlicmVhazsKKwljYXNlIExMQ19SRVNFVF9QUklNOgorCQkvKgorCQkgKiBGSVhNRToKKwkJICogUkVTRVQgaXMgbm90IGJlaW5nIG5vdGlmaWVkIHRvIHVwcGVyIGxheWVycyBmb3Igbm93CisJCSAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogcmVjZWl2ZWQgYSByZXNldCBpbmQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKGV2LT5pbmRfcHJpbSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlY2VpdmVkIHVua25vd24gJWQgcHJpbSFcbiIsCisJCQkJX19GVU5DVElPTl9fLCBldi0+aW5kX3ByaW0pOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCX0KKwkJLyogTm8gaW5kaWNhdGlvbiAqLworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKGV2LT5jZm1fcHJpbSkgeworCWNhc2UgTExDX0RBVEFfUFJJTToKKwkJaWYgKCFsbGNfZGF0YV9hY2NlcHRfc3RhdGUobGxjLT5zdGF0ZSkpCisJCQlzay0+c2tfd3JpdGVfc3BhY2Uoc2spOworCQllbHNlCisJCQlyYyA9IGxsYy0+ZmFpbGVkX2RhdGFfcmVxID0gMTsKKwkJYnJlYWs7CisJY2FzZSBMTENfQ09OTl9QUklNOgorCQlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19TVFJFQU0gJiYKKwkJICAgIHNrLT5za19zdGF0ZSA9PSBUQ1BfU1lOX1NFTlQpIHsKKwkJCWlmIChldi0+c3RhdHVzKSB7CisJCQkJc2stPnNrX3NvY2tldC0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKKwkJCQlzay0+c2tfc3RhdGUgICAgICAgICA9IFRDUF9DTE9TRTsKKwkJCX0gZWxzZSB7CisJCQkJc2stPnNrX3NvY2tldC0+c3RhdGUgPSBTU19DT05ORUNURUQ7CisJCQkJc2stPnNrX3N0YXRlICAgICAgICAgPSBUQ1BfRVNUQUJMSVNIRUQ7CisJCQl9CisJCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKKwkJfQorCQlicmVhazsKKwljYXNlIExMQ19ESVNDX1BSSU06CisJCXNvY2tfaG9sZChzayk7CisJCWlmIChzay0+c2tfdHlwZSA9PSBTT0NLX1NUUkVBTSAmJiBzay0+c2tfc3RhdGUgPT0gVENQX0NMT1NJTkcpIHsKKwkJCXNrLT5za19zb2NrZXQtPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CisJCQlzay0+c2tfc3RhdGUgICAgICAgICA9IFRDUF9DTE9TRTsKKwkJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCQl9CisJCXNvY2tfcHV0KHNrKTsKKwkJYnJlYWs7CisJY2FzZSBMTENfUkVTRVRfUFJJTToKKwkJLyoKKwkJICogRklYTUU6CisJCSAqIFJFU0VUIGlzIG5vdCBiZWluZyBub3RpZmllZCB0byB1cHBlciBsYXllcnMgZm9yIG5vdworCQkgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlY2VpdmVkIGEgcmVzZXQgY29uZiFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChldi0+Y2ZtX3ByaW0pIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiByZWNlaXZlZCB1bmtub3duICVkIHByaW0hXG4iLAorCQkJCQlfX0ZVTkNUSU9OX18sIGV2LT5jZm1fcHJpbSk7CisJCQlicmVhazsKKwkJfQorCQlnb3RvIG91dF9za2JfcHV0OyAvKiBObyBjb25maXJtYXRpb24gKi8KKwl9CitvdXRfa2ZyZWVfc2tiOgorCWtmcmVlX3NrYihza2IpOworb3V0X3NrYl9wdXQ6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIHJjOworfQorCit2b2lkIGxsY19jb25uX3NlbmRfcGR1KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKiBxdWV1ZSBQRFUgdG8gc2VuZCB0byBNQUMgbGF5ZXIgKi8KKwlza2JfcXVldWVfdGFpbCgmc2stPnNrX3dyaXRlX3F1ZXVlLCBza2IpOworCWxsY19jb25uX3NlbmRfcGR1cyhzayk7Cit9CisKKy8qKgorICoJbGxjX2Nvbm5fcnRuX3BkdSAtIHNlbmRzIHJlY2VpdmVkIGRhdGEgcGR1IHRvIHVwcGVyIGxheWVyCisgKglAc2s6IEFjdGl2ZSBjb25uZWN0aW9uCisgKglAc2tiOiBSZWNlaXZlZCBkYXRhIGZyYW1lCisgKgorICoJU2VuZHMgcmVjZWl2ZWQgZGF0YSBwZHUgdG8gdXBwZXIgbGF5ZXIgKGJ5IHVzaW5nIGluZGljYXRlIGZ1bmN0aW9uKS4KKyAqCVByZXBhcmVzIHNlcnZpY2UgcGFyYW1ldGVycyAocHJpbSBhbmQgcHJpbV9kYXRhKS4gY2FsbGluZyBpbmRpY2F0aW9uCisgKglmdW5jdGlvbiB3aWxsIGJlIGRvbmUgaW4gbGxjX2Nvbm5fc3RhdGVfcHJvY2Vzcy4KKyAqLwordm9pZCBsbGNfY29ubl9ydG5fcGR1KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfZXYgKmV2ID0gbGxjX2Nvbm5fZXYoc2tiKTsKKworCWV2LT5pbmRfcHJpbSA9IExMQ19EQVRBX1BSSU07Cit9CisKKy8qKgorICoJbGxjX2Nvbm5fcmVzZW5kX2lfcGR1X2FzX2NtZCAtIHJlc2VuZCBhbGwgYWxsIHVuYWNrbm93bGVkZ2VkIEkgUERVcworICoJQHNrOiBhY3RpdmUgY29ubmVjdGlvbgorICoJQG5yOiBOUgorICoJQGZpcnN0X3BfYml0OiBwX2JpdCB2YWx1ZSBvZiBmaXJzdCBwZHUKKyAqCisgKglSZXNlbmQgYWxsIHVuYWNrbm93bGVkZ2VkIEkgUERVcywgc3RhcnRpbmcgd2l0aCB0aGUgTlI7IHNlbmQgZmlyc3QgYXMKKyAqCWNvbW1hbmQgUERVIHdpdGggUCBiaXQgZXF1YWwgZmlyc3RfcF9iaXQ7IGlmIG1vcmUgdGhhbiBvbmUgc2VuZAorICoJc3Vic2VxdWVudCBhcyBjb21tYW5kIFBEVXMgd2l0aCBQIGJpdCBlcXVhbCB6ZXJvICgwKS4KKyAqLwordm9pZCBsbGNfY29ubl9yZXNlbmRfaV9wZHVfYXNfY21kKHN0cnVjdCBzb2NrICpzaywgdTggbnIsIHU4IGZpcnN0X3BfYml0KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdTsKKwl1MTYgbmJyX3VuYWNrX3BkdXM7CisJc3RydWN0IGxsY19zb2NrICpsbGM7CisJdTggaG93bWFueV9yZXNlbmQgPSAwOworCisJbGxjX2Nvbm5fcmVtb3ZlX2Fja2VkX3BkdXMoc2ssIG5yLCAmbmJyX3VuYWNrX3BkdXMpOworCWlmICghbmJyX3VuYWNrX3BkdXMpCisJCWdvdG8gb3V0OworCS8qCisJICogUHJvY2VzcyB1bmFjayBQRFVzIG9ubHkgaWYgdW5hY2sgcXVldWUgaXMgbm90IGVtcHR5OyByZW1vdmUKKwkgKiBhcHByb3ByaWF0ZSBQRFVzLCBmaXggdGhlbSB1cCwgYW5kIHB1dCB0aGVtIG9uIG1hY19wZHVfcS4KKwkgKi8KKwlsbGMgPSBsbGNfc2soc2spOworCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmbGxjLT5wZHVfdW5hY2tfcSkpICE9IE5VTEwpIHsKKwkJcGR1ID0gbGxjX3BkdV9zbl9oZHIoc2tiKTsKKwkJbGxjX3BkdV9zZXRfY21kX3JzcChza2IsIExMQ19QRFVfQ01EKTsKKwkJbGxjX3BkdV9zZXRfcGZfYml0KHNrYiwgZmlyc3RfcF9iaXQpOworCQlza2JfcXVldWVfdGFpbCgmc2stPnNrX3dyaXRlX3F1ZXVlLCBza2IpOworCQlmaXJzdF9wX2JpdCA9IDA7CisJCWxsYy0+dlMgPSBMTENfSV9HRVRfTlMocGR1KTsKKwkJaG93bWFueV9yZXNlbmQrKzsKKwl9CisJaWYgKGhvd21hbnlfcmVzZW5kID4gMCkKKwkJbGxjLT52UyA9IChsbGMtPnZTICsgMSkgJSBMTENfMl9TRVFfTkJSX01PRFVMTzsKKwkvKiBhbnkgUERVcyB0byByZS1zZW5kIGFyZSBxdWV1ZWQgdXA7IHN0YXJ0IHNlbmRpbmcgdG8gTUFDICovCisJbGxjX2Nvbm5fc2VuZF9wZHVzKHNrKTsKK291dDo7Cit9CisKKy8qKgorICoJbGxjX2Nvbm5fcmVzZW5kX2lfcGR1X2FzX3JzcCAtIFJlc2VuZCBhbGwgdW5hY2tub3dsZWRnZWQgSSBQRFVzCisgKglAc2s6IGFjdGl2ZSBjb25uZWN0aW9uLgorICoJQG5yOiBOUgorICoJQGZpcnN0X2ZfYml0OiBmX2JpdCB2YWx1ZSBvZiBmaXJzdCBwZHUuCisgKgorICoJUmVzZW5kIGFsbCB1bmFja25vd2xlZGdlZCBJIFBEVXMsIHN0YXJ0aW5nIHdpdGggdGhlIE5SOyBzZW5kIGZpcnN0IGFzCisgKglyZXNwb25zZSBQRFUgd2l0aCBGIGJpdCBlcXVhbCBmaXJzdF9mX2JpdDsgaWYgbW9yZSB0aGFuIG9uZSBzZW5kCisgKglzdWJzZXF1ZW50IGFzIHJlc3BvbnNlIFBEVXMgd2l0aCBGIGJpdCBlcXVhbCB6ZXJvICgwKS4KKyAqLwordm9pZCBsbGNfY29ubl9yZXNlbmRfaV9wZHVfYXNfcnNwKHN0cnVjdCBzb2NrICpzaywgdTggbnIsIHU4IGZpcnN0X2ZfYml0KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdTE2IG5icl91bmFja19wZHVzOworCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHNrKTsKKwl1OCBob3dtYW55X3Jlc2VuZCA9IDA7CisKKwlsbGNfY29ubl9yZW1vdmVfYWNrZWRfcGR1cyhzaywgbnIsICZuYnJfdW5hY2tfcGR1cyk7CisJaWYgKCFuYnJfdW5hY2tfcGR1cykKKwkJZ290byBvdXQ7CisJLyoKKwkgKiBQcm9jZXNzIHVuYWNrIFBEVXMgb25seSBpZiB1bmFjayBxdWV1ZSBpcyBub3QgZW1wdHk7IHJlbW92ZQorCSAqIGFwcHJvcHJpYXRlIFBEVXMsIGZpeCB0aGVtIHVwLCBhbmQgcHV0IHRoZW0gb24gbWFjX3BkdV9xCisJICovCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmbGxjLT5wZHVfdW5hY2tfcSkpICE9IE5VTEwpIHsKKwkJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisKKwkJbGxjX3BkdV9zZXRfY21kX3JzcChza2IsIExMQ19QRFVfUlNQKTsKKwkJbGxjX3BkdV9zZXRfcGZfYml0KHNrYiwgZmlyc3RfZl9iaXQpOworCQlza2JfcXVldWVfdGFpbCgmc2stPnNrX3dyaXRlX3F1ZXVlLCBza2IpOworCQlmaXJzdF9mX2JpdCA9IDA7CisJCWxsYy0+dlMgPSBMTENfSV9HRVRfTlMocGR1KTsKKwkJaG93bWFueV9yZXNlbmQrKzsKKwl9CisJaWYgKGhvd21hbnlfcmVzZW5kID4gMCkKKwkJbGxjLT52UyA9IChsbGMtPnZTICsgMSkgJSBMTENfMl9TRVFfTkJSX01PRFVMTzsKKwkvKiBhbnkgUERVcyB0byByZS1zZW5kIGFyZSBxdWV1ZWQgdXA7IHN0YXJ0IHNlbmRpbmcgdG8gTUFDICovCisJbGxjX2Nvbm5fc2VuZF9wZHVzKHNrKTsKK291dDo7Cit9CisKKy8qKgorICoJbGxjX2Nvbm5fcmVtb3ZlX2Fja2VkX3BkdXMgLSBSZW1vdmVzIGFja25vd2xlZGdlZCBwZHVzIGZyb20gdHggcXVldWUKKyAqCUBzazogYWN0aXZlIGNvbm5lY3Rpb24KKyAqCW5yOiBOUgorICoJaG93X21hbnlfdW5hY2tlZDogc2l6ZSBvZiBwZHVfdW5hY2tfcSBhZnRlciByZW1vdmluZyBhY2tlZCBwZHVzCisgKgorICoJUmVtb3ZlcyBhY2tub3dsZWRnZWQgcGR1cyBmcm9tIHRyYW5zbWl0IHF1ZXVlIChwZHVfdW5hY2tfcSkuIFJldHVybnMKKyAqCXRoZSBudW1iZXIgb2YgcGR1cyB0aGF0IHJlbW92ZWQgZnJvbSBxdWV1ZS4KKyAqLworaW50IGxsY19jb25uX3JlbW92ZV9hY2tlZF9wZHVzKHN0cnVjdCBzb2NrICpzaywgdTggbnIsIHUxNiAqaG93X21hbnlfdW5hY2tlZCkKK3sKKwlpbnQgcGR1X3BvcywgaTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBsbGNfcGR1X3NuICpwZHU7CisJaW50IG5icl9hY2tlZCA9IDA7CisJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2soc2spOworCWludCBxX2xlbiA9IHNrYl9xdWV1ZV9sZW4oJmxsYy0+cGR1X3VuYWNrX3EpOworCisJaWYgKCFxX2xlbikKKwkJZ290byBvdXQ7CisJc2tiID0gc2tiX3BlZWsoJmxsYy0+cGR1X3VuYWNrX3EpOworCXBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisKKwkvKiBmaW5kaW5nIHBvc2l0aW9uIG9mIGxhc3QgYWNrZWQgcGR1IGluIHF1ZXVlICovCisJcGR1X3BvcyA9ICgoaW50KUxMQ18yX1NFUV9OQlJfTU9EVUxPICsgKGludCluciAtCisJCQkoaW50KUxMQ19JX0dFVF9OUyhwZHUpKSAlIExMQ18yX1NFUV9OQlJfTU9EVUxPOworCisJZm9yIChpID0gMDsgaSA8IHBkdV9wb3MgJiYgaSA8IHFfbGVuOyBpKyspIHsKKwkJc2tiID0gc2tiX2RlcXVldWUoJmxsYy0+cGR1X3VuYWNrX3EpOworCQlpZiAoc2tiKQorCQkJa2ZyZWVfc2tiKHNrYik7CisJCW5icl9hY2tlZCsrOworCX0KK291dDoKKwkqaG93X21hbnlfdW5hY2tlZCA9IHNrYl9xdWV1ZV9sZW4oJmxsYy0+cGR1X3VuYWNrX3EpOworCXJldHVybiBuYnJfYWNrZWQ7Cit9CisKKy8qKgorICoJbGxjX2Nvbm5fc2VuZF9wZHVzIC0gU2VuZHMgcXVldWVkIFBEVXMKKyAqCUBzazogYWN0aXZlIGNvbm5lY3Rpb24KKyAqCisgKglTZW5kcyBxdWV1ZWQgcGR1cyB0byBNQUMgbGF5ZXIgZm9yIHRyYW5zbWlzc2lvbi4KKyAqLworc3RhdGljIHZvaWQgbGxjX2Nvbm5fc2VuZF9wZHVzKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3dyaXRlX3F1ZXVlKSkgIT0gTlVMTCkgeworCQlzdHJ1Y3QgbGxjX3BkdV9zbiAqcGR1ID0gbGxjX3BkdV9zbl9oZHIoc2tiKTsKKworCQlpZiAoTExDX1BEVV9UWVBFX0lTX0kocGR1KSAmJgorCQkgICAgIShza2ItPmRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCisJCQlza2JfcXVldWVfdGFpbCgmbGxjX3NrKHNrKS0+cGR1X3VuYWNrX3EsIHNrYik7CisJCQlpZiAoIXNrYjIpCisJCQkJYnJlYWs7CisJCQlza2IgPSBza2IyOworCQl9CisJCWRldl9xdWV1ZV94bWl0KHNrYik7CisJfQorfQorCisvKioKKyAqCWxsY19jb25uX3NlcnZpY2UgLSBmaW5kcyB0cmFuc2l0aW9uIGFuZCBjaGFuZ2VzIHN0YXRlIG9mIGNvbm5lY3Rpb24KKyAqCUBzazogY29ubmVjdGlvbgorICoJQHNrYjogaGFwcGVuZWQgZXZlbnQKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGZpbmRzIHRyYW5zaXRpb24gdGhhdCBtYXRjaGVzIHdpdGggaGFwcGVuZWQgZXZlbnQsIHRoZW4KKyAqCWV4ZWN1dGVzIHJlbGF0ZWQgYWN0aW9ucyBhbmQgZmluYWxseSBjaGFuZ2VzIHN0YXRlIG9mIGNvbm5lY3Rpb24uCisgKglSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIDEgZm9yIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgbGxjX2Nvbm5fc2VydmljZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHJjID0gMTsKKwlzdHJ1Y3QgbGxjX3NvY2sgKmxsYyA9IGxsY19zayhzayk7CisJc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zICp0cmFuczsKKworCWlmIChsbGMtPnN0YXRlID4gTkJSX0NPTk5fU1RBVEVTKQorCQlnb3RvIG91dDsKKwlyYyA9IDA7CisJdHJhbnMgPSBsbGNfcXVhbGlmeV9jb25uX2V2KHNrLCBza2IpOworCWlmICh0cmFucykgeworCQlyYyA9IGxsY19leGVjX2Nvbm5fdHJhbnNfYWN0aW9ucyhzaywgdHJhbnMsIHNrYik7CisJCWlmICghcmMgJiYgdHJhbnMtPm5leHRfc3RhdGUgIT0gTk9fU1RBVEVfQ0hBTkdFKSB7CisJCQlsbGMtPnN0YXRlID0gdHJhbnMtPm5leHRfc3RhdGU7CisJCQlpZiAoIWxsY19kYXRhX2FjY2VwdF9zdGF0ZShsbGMtPnN0YXRlKSkKKwkJCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKKwkJfQorCX0KK291dDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICoJbGxjX3F1YWxpZnlfY29ubl9ldiAtIGZpbmRzIHRyYW5zaXRpb24gZm9yIGV2ZW50CisgKglAc2s6IGNvbm5lY3Rpb24KKyAqCUBza2I6IGhhcHBlbmVkIGV2ZW50CisgKgorICoJVGhpcyBmdW5jdGlvbiBmaW5kcyB0cmFuc2l0aW9uIHRoYXQgbWF0Y2hlcyB3aXRoIGhhcHBlbmVkIGV2ZW50LgorICoJUmV0dXJucyBwb2ludGVyIHRvIGZvdW5kIHRyYW5zaXRpb24gb24gc3VjY2VzcywgJU5VTEwgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zICpsbGNfcXVhbGlmeV9jb25uX2V2KHN0cnVjdCBzb2NrICpzaywKKwkJCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfY29ubl9zdGF0ZV90cmFucyAqKm5leHRfdHJhbnM7CisJbGxjX2Nvbm5fZXZfcWZ5cl90ICpuZXh0X3F1YWxpZmllcjsKKwlzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfZXYgKmV2ID0gbGxjX2Nvbm5fZXYoc2tiKTsKKwlzdHJ1Y3QgbGxjX3NvY2sgKmxsYyA9IGxsY19zayhzayk7CisJc3RydWN0IGxsY19jb25uX3N0YXRlICpjdXJyX3N0YXRlID0KKwkJCQkJJmxsY19jb25uX3N0YXRlX3RhYmxlW2xsYy0+c3RhdGUgLSAxXTsKKworCS8qIHNlYXJjaCB0aHJ1IGV2ZW50cyBmb3IgdGhpcyBzdGF0ZSB1bnRpbAorCSAqIGxpc3QgZXhoYXVzdGVkIG9yIHVudGlsIG5vIG1vcmUKKwkgKi8KKwlmb3IgKG5leHRfdHJhbnMgPSBjdXJyX3N0YXRlLT50cmFuc2l0aW9ucyArCisJCWxsY19maW5kX29mZnNldChsbGMtPnN0YXRlIC0gMSwgZXYtPnR5cGUpOworCSAgICAgKCpuZXh0X3RyYW5zKS0+ZXY7IG5leHRfdHJhbnMrKykgeworCQlpZiAoISgoKm5leHRfdHJhbnMpLT5ldikoc2ssIHNrYikpIHsKKwkJCS8qIGdvdCBQT1NTSUJMRSBldmVudCBtYXRjaDsgdGhlIGV2ZW50IG1heSByZXF1aXJlCisJCQkgKiBxdWFsaWZpY2F0aW9uIGJhc2VkIG9uIHRoZSB2YWx1ZXMgb2YgYSBudW1iZXIgb2YKKwkJCSAqIHN0YXRlIGZsYWdzOyBpZiBhbGwgcXVhbGlmaWNhdGlvbnMgYXJlIG1ldCAoaS5lLiwKKwkJCSAqIGlmIGFsbCBxdWFsaWZ5aW5nIGZ1bmN0aW9ucyByZXR1cm4gc3VjY2Vzcywgb3IgMCwKKwkJCSAqIHRoZW4gdGhpcyBpcyBUSEUgZXZlbnQgd2UncmUgbG9va2luZyBmb3IKKwkJCSAqLworCQkJZm9yIChuZXh0X3F1YWxpZmllciA9ICgqbmV4dF90cmFucyktPmV2X3F1YWxpZmllcnM7CisJCQkgICAgIG5leHRfcXVhbGlmaWVyICYmICpuZXh0X3F1YWxpZmllciAmJgorCQkJICAgICAhKCpuZXh0X3F1YWxpZmllcikoc2ssIHNrYik7IG5leHRfcXVhbGlmaWVyKyspCisJCQkJLyogbm90aGluZyAqLzsKKwkJCWlmICghbmV4dF9xdWFsaWZpZXIgfHwgISpuZXh0X3F1YWxpZmllcikKKwkJCQkvKiBhbGwgcXVhbGlmaWVycyBleGVjdXRlZCBzdWNjZXNzZnVsbHk7IHRoaXMgaXMKKwkJCQkgKiBvdXIgdHJhbnNpdGlvbjsgcmV0dXJuIGl0IHNvIHdlIGNhbiBwZXJmb3JtCisJCQkJICogdGhlIGFzc29jaWF0ZWQgYWN0aW9ucyAmIGNoYW5nZSB0aGUgc3RhdGUKKwkJCQkgKi8KKwkJCQlyZXR1cm4gKm5leHRfdHJhbnM7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICoJbGxjX2V4ZWNfY29ubl90cmFuc19hY3Rpb25zIC0gZXhlY3V0ZXMgcmVsYXRlZCBhY3Rpb25zCisgKglAc2s6IGNvbm5lY3Rpb24KKyAqCUB0cmFuczogdHJhbnNpdGlvbiB0aGF0IGl0J3MgYWN0aW9ucyBtdXN0IGJlIHBlcmZvcm1lZAorICoJQHNrYjogZXZlbnQKKyAqCisgKglFeGVjdXRlcyBhY3Rpb25zIHRoYXQgaXMgcmVsYXRlZCB0byBoYXBwZW5lZCBldmVudC4gUmV0dXJucyAwIGZvcgorICoJc3VjY2VzcywgMSB0byBpbmRpY2F0ZSBmYWlsdXJlIG9mIGF0IGxlYXN0IG9uZSBhY3Rpb24uCisgKi8KK3N0YXRpYyBpbnQgbGxjX2V4ZWNfY29ubl90cmFuc19hY3Rpb25zKHN0cnVjdCBzb2NrICpzaywKKwkJCQkgICAgICAgc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zICp0cmFucywKKwkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmMgPSAwOworCWxsY19jb25uX2FjdGlvbl90ICpuZXh0X2FjdGlvbjsKKworCWZvciAobmV4dF9hY3Rpb24gPSB0cmFucy0+ZXZfYWN0aW9uczsKKwkgICAgIG5leHRfYWN0aW9uICYmICpuZXh0X2FjdGlvbjsgbmV4dF9hY3Rpb24rKykgeworCQlpbnQgcmMyID0gKCpuZXh0X2FjdGlvbikoc2ssIHNrYik7CisKKwkJaWYgKHJjMiA9PSAyKSB7CisJCQlyYyA9IHJjMjsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKHJjMikKKwkJCXJjID0gMTsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqCWxsY19sb29rdXBfZXN0YWJsaXNoZWQgLSBGaW5kcyBjb25uZWN0aW9uIGZvciB0aGUgcmVtb3RlL2xvY2FsIHNhcC9tYWMKKyAqCUBzYXA6IFNBUAorICoJQGRhZGRyOiBhZGRyZXNzIG9mIHJlbW90ZSBMTEMgKE1BQyArIFNBUCkKKyAqCUBsYWRkcjogYWRkcmVzcyBvZiBsb2NhbCBMTEMgKE1BQyArIFNBUCkKKyAqCisgKglTZWFyY2ggY29ubmVjdGlvbiBsaXN0IG9mIHRoZSBTQVAgYW5kIGZpbmRzIGNvbm5lY3Rpb24gdXNpbmcgdGhlIHJlbW90ZQorICoJbWFjLCByZW1vdGUgc2FwLCBsb2NhbCBtYWMsIGFuZCBsb2NhbCBzYXAuIFJldHVybnMgcG9pbnRlciBmb3IKKyAqCWNvbm5lY3Rpb24gZm91bmQsICVOVUxMIG90aGVyd2lzZS4KKyAqLworc3RydWN0IHNvY2sgKmxsY19sb29rdXBfZXN0YWJsaXNoZWQoc3RydWN0IGxsY19zYXAgKnNhcCwgc3RydWN0IGxsY19hZGRyICpkYWRkciwKKwkJCQkgICAgc3RydWN0IGxsY19hZGRyICpsYWRkcikKK3sKKwlzdHJ1Y3Qgc29jayAqcmM7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisKKwlyZWFkX2xvY2tfYmgoJnNhcC0+c2tfbGlzdC5sb2NrKTsKKwlza19mb3JfZWFjaChyYywgbm9kZSwgJnNhcC0+c2tfbGlzdC5saXN0KSB7CisJCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHJjKTsKKworCQlpZiAobGxjLT5sYWRkci5sc2FwID09IGxhZGRyLT5sc2FwICYmCisJCSAgICBsbGMtPmRhZGRyLmxzYXAgPT0gZGFkZHItPmxzYXAgJiYKKwkJICAgIGxsY19tYWNfbWF0Y2gobGxjLT5sYWRkci5tYWMsIGxhZGRyLT5tYWMpICYmCisJCSAgICBsbGNfbWFjX21hdGNoKGxsYy0+ZGFkZHIubWFjLCBkYWRkci0+bWFjKSkgeworCQkJc29ja19ob2xkKHJjKTsKKwkJCWdvdG8gZm91bmQ7CisJCX0KKwl9CisJcmMgPSBOVUxMOworZm91bmQ6CisJcmVhZF91bmxvY2tfYmgoJnNhcC0+c2tfbGlzdC5sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICoJbGxjX2xvb2t1cF9saXN0ZW5lciAtIEZpbmRzIGxpc3RlbmVyIGZvciBsb2NhbCBNQUMgKyBTQVAKKyAqCUBzYXA6IFNBUAorICoJQGxhZGRyOiBhZGRyZXNzIG9mIGxvY2FsIExMQyAoTUFDICsgU0FQKQorICoKKyAqCVNlYXJjaCBjb25uZWN0aW9uIGxpc3Qgb2YgdGhlIFNBUCBhbmQgZmluZHMgY29ubmVjdGlvbiBsaXN0ZW5pbmcgb24KKyAqCWxvY2FsIG1hYywgYW5kIGxvY2FsIHNhcC4gUmV0dXJucyBwb2ludGVyIGZvciBwYXJlbnQgc29ja2V0IGZvdW5kLAorICoJJU5VTEwgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgc3RydWN0IHNvY2sgKmxsY19sb29rdXBfbGlzdGVuZXIoc3RydWN0IGxsY19zYXAgKnNhcCwKKwkJCQkJc3RydWN0IGxsY19hZGRyICpsYWRkcikKK3sKKwlzdHJ1Y3Qgc29jayAqcmM7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisKKwlyZWFkX2xvY2tfYmgoJnNhcC0+c2tfbGlzdC5sb2NrKTsKKwlza19mb3JfZWFjaChyYywgbm9kZSwgJnNhcC0+c2tfbGlzdC5saXN0KSB7CisJCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHJjKTsKKworCQlpZiAocmMtPnNrX3R5cGUgPT0gU09DS19TVFJFQU0gJiYgcmMtPnNrX3N0YXRlID09IFRDUF9MSVNURU4gJiYKKwkJICAgIGxsYy0+bGFkZHIubHNhcCA9PSBsYWRkci0+bHNhcCAmJgorCQkgICAgKGxsY19tYWNfbWF0Y2gobGxjLT5sYWRkci5tYWMsIGxhZGRyLT5tYWMpIHx8CisJCSAgICAgbGxjX21hY19udWxsKGxsYy0+bGFkZHIubWFjKSkpIHsKKwkJCXNvY2tfaG9sZChyYyk7CisJCQlnb3RvIGZvdW5kOworCQl9CisJfQorCXJjID0gTlVMTDsKK2ZvdW5kOgorCXJlYWRfdW5sb2NrX2JoKCZzYXAtPnNrX2xpc3QubG9jayk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqCWxsY19kYXRhX2FjY2VwdF9zdGF0ZSAtIGRlc2lnbmF0ZXMgaWYgaW4gdGhpcyBzdGF0ZSBkYXRhIGNhbiBiZSBzZW50LgorICoJQHN0YXRlOiBzdGF0ZSBvZiBjb25uZWN0aW9uLgorICoKKyAqCVJldHVybnMgMCBpZiBkYXRhIGNhbiBiZSBzZW50LCAxIG90aGVyd2lzZS4KKyAqLwordTggbGxjX2RhdGFfYWNjZXB0X3N0YXRlKHU4IHN0YXRlKQoreworCXJldHVybiBzdGF0ZSAhPSBMTENfQ09OTl9TVEFURV9OT1JNQUwgJiYgc3RhdGUgIT0gTExDX0NPTk5fU1RBVEVfQlVTWSAmJgorCSAgICAgICBzdGF0ZSAhPSBMTENfQ09OTl9TVEFURV9SRUo7Cit9CisKKy8qKgorICoJZmluZF9uZXh0X29mZnNldCAtIGZpbmRzIG9mZnNldCBmb3IgbmV4dCBjYXRlZ29yeSBvZiB0cmFuc2l0aW9ucworICoJQHN0YXRlOiBzdGF0ZSB0YWJsZS4KKyAqCUBvZmZzZXQ6IHN0YXJ0IG9mZnNldC4KKyAqCisgKglGaW5kcyBvZmZzZXQgb2YgbmV4dCBjYXRlZ29yeSBvZiB0cmFuc2l0aW9ucyBpbiB0cmFuc2l0aW9uIHRhYmxlLgorICoJUmV0dXJucyB0aGUgc3RhcnQgaW5kZXggb2YgbmV4dCBjYXRlZ29yeS4KKyAqLworc3RhdGljIHUxNiBmaW5kX25leHRfb2Zmc2V0KHN0cnVjdCBsbGNfY29ubl9zdGF0ZSAqc3RhdGUsIHUxNiBvZmZzZXQpCit7CisJdTE2IGNudCA9IDA7CisJc3RydWN0IGxsY19jb25uX3N0YXRlX3RyYW5zICoqbmV4dF90cmFuczsKKworCWZvciAobmV4dF90cmFucyA9IHN0YXRlLT50cmFuc2l0aW9ucyArIG9mZnNldDsKKwkgICAgICgqbmV4dF90cmFucyktPmV2OyBuZXh0X3RyYW5zKyspCisJCSsrY250OworCXJldHVybiBjbnQ7Cit9CisKKy8qKgorICoJbGxjX2J1aWxkX29mZnNldF90YWJsZSAtIGJ1aWxkcyBvZmZzZXQgdGFibGUgb2YgY29ubmVjdGlvbgorICoKKyAqCUZpbGxzIG9mZnNldCB0YWJsZSBvZiBjb25uZWN0aW9uIHN0YXRlIHRyYW5zaXRpb24gdGFibGUKKyAqCShsbGNfb2Zmc2V0X3RhYmxlKS4KKyAqLwordm9pZCBfX2luaXQgbGxjX2J1aWxkX29mZnNldF90YWJsZSh2b2lkKQoreworCXN0cnVjdCBsbGNfY29ubl9zdGF0ZSAqY3Vycl9zdGF0ZTsKKwlpbnQgc3RhdGUsIGV2X3R5cGUsIG5leHRfb2Zmc2V0OworCisJZm9yIChzdGF0ZSA9IDA7IHN0YXRlIDwgTkJSX0NPTk5fU1RBVEVTOyBzdGF0ZSsrKSB7CisJCWN1cnJfc3RhdGUgPSAmbGxjX2Nvbm5fc3RhdGVfdGFibGVbc3RhdGVdOworCQluZXh0X29mZnNldCA9IDA7CisJCWZvciAoZXZfdHlwZSA9IDA7IGV2X3R5cGUgPCBOQlJfQ09OTl9FVjsgZXZfdHlwZSsrKSB7CisJCQlsbGNfb2Zmc2V0X3RhYmxlW3N0YXRlXVtldl90eXBlXSA9IG5leHRfb2Zmc2V0OworCQkJbmV4dF9vZmZzZXQgKz0gZmluZF9uZXh0X29mZnNldChjdXJyX3N0YXRlLAorCQkJCQkJCW5leHRfb2Zmc2V0KSArIDE7CisJCX0KKwl9Cit9CisKKy8qKgorICoJbGxjX2ZpbmRfb2Zmc2V0IC0gZmluZHMgc3RhcnQgb2Zmc2V0IG9mIGNhdGVnb3J5IG9mIHRyYW5zaXRpb25zCisgKglAc3RhdGU6IHN0YXRlIG9mIGNvbm5lY3Rpb24KKyAqCUBldl90eXBlOiB0eXBlIG9mIGhhcHBlbmVkIGV2ZW50CisgKgorICoJRmluZHMgc3RhcnQgb2Zmc2V0IG9mIGRlc2lyZWQgY2F0ZWdvcnkgb2YgdHJhbnNpdGlvbnMuIFJldHVybnMgdGhlCisgKglkZXNpcmVkIHN0YXJ0IG9mZnNldC4KKyAqLworc3RhdGljIGludCBsbGNfZmluZF9vZmZzZXQoaW50IHN0YXRlLCBpbnQgZXZfdHlwZSkKK3sKKwlpbnQgcmMgPSAwOworCS8qIGF0IHRoaXMgc3RhZ2UsIGxsY19vZmZzZXRfdGFibGVbLi5dWzJdIGlzIG5vdCBpbXBvcnRhbnQuIGl0IGlzIGZvcgorCSAqIGluaXRfcGZfY3ljbGUgYW5kIEkgZG9uJ3Qga25vdyB3aGF0IGlzIGl0LgorCSAqLworCXN3aXRjaCAoZXZfdHlwZSkgeworCWNhc2UgTExDX0NPTk5fRVZfVFlQRV9QUklNOgorCQlyYyA9IGxsY19vZmZzZXRfdGFibGVbc3RhdGVdWzBdOyBicmVhazsKKwljYXNlIExMQ19DT05OX0VWX1RZUEVfUERVOgorCQlyYyA9IGxsY19vZmZzZXRfdGFibGVbc3RhdGVdWzRdOyBicmVhazsKKwljYXNlIExMQ19DT05OX0VWX1RZUEVfU0lNUExFOgorCQlyYyA9IGxsY19vZmZzZXRfdGFibGVbc3RhdGVdWzFdOyBicmVhazsKKwljYXNlIExMQ19DT05OX0VWX1RZUEVfUF9UTVI6CisJY2FzZSBMTENfQ09OTl9FVl9UWVBFX0FDS19UTVI6CisJY2FzZSBMTENfQ09OTl9FVl9UWVBFX1JFSl9UTVI6CisJY2FzZSBMTENfQ09OTl9FVl9UWVBFX0JVU1lfVE1SOgorCQlyYyA9IGxsY19vZmZzZXRfdGFibGVbc3RhdGVdWzNdOyBicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqCWxsY19zYXBfYWRkX3NvY2tldCAtIGFkZHMgYSBzb2NrZXQgdG8gYSBTQVAKKyAqCUBzYXA6IFNBUAorICoJQHNrOiBzb2NrZXQKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGFkZHMgYSBzb2NrZXQgdG8gc2tfbGlzdCBvZiBhIFNBUC4KKyAqLwordm9pZCBsbGNfc2FwX2FkZF9zb2NrZXQoc3RydWN0IGxsY19zYXAgKnNhcCwgc3RydWN0IHNvY2sgKnNrKQoreworCXdyaXRlX2xvY2tfYmgoJnNhcC0+c2tfbGlzdC5sb2NrKTsKKwlsbGNfc2soc2spLT5zYXAgPSBzYXA7CisJc2tfYWRkX25vZGUoc2ssICZzYXAtPnNrX2xpc3QubGlzdCk7CisJd3JpdGVfdW5sb2NrX2JoKCZzYXAtPnNrX2xpc3QubG9jayk7Cit9CisKKy8qKgorICoJbGxjX3NhcF9yZW1vdmVfc29ja2V0IC0gcmVtb3ZlcyBhIHNvY2tldCBmcm9tIFNBUAorICoJQHNhcDogU0FQCisgKglAc2s6IHNvY2tldAorICoKKyAqCVRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBhIGNvbm5lY3Rpb24gZnJvbSBza19saXN0Lmxpc3Qgb2YgYSBTQVAgaWYKKyAqCXRoZSBjb25uZWN0aW9uIHdhcyBpbiB0aGlzIGxpc3QuCisgKi8KK3ZvaWQgbGxjX3NhcF9yZW1vdmVfc29ja2V0KHN0cnVjdCBsbGNfc2FwICpzYXAsIHN0cnVjdCBzb2NrICpzaykKK3sKKwl3cml0ZV9sb2NrX2JoKCZzYXAtPnNrX2xpc3QubG9jayk7CisJc2tfZGVsX25vZGVfaW5pdChzayk7CisJd3JpdGVfdW5sb2NrX2JoKCZzYXAtPnNrX2xpc3QubG9jayk7Cit9CisKKy8qKgorICoJbGxjX2Nvbm5fcmN2IC0gc2VuZHMgcmVjZWl2ZWQgcGR1cyB0byB0aGUgY29ubmVjdGlvbiBzdGF0ZSBtYWNoaW5lCisgKglAc2s6IGN1cnJlbnQgY29ubmVjdGlvbiBzdHJ1Y3R1cmUuCisgKglAc2tiOiByZWNlaXZlZCBmcmFtZS4KKyAqCisgKglTZW5kcyByZWNlaXZlZCBwZHVzIHRvIHRoZSBjb25uZWN0aW9uIHN0YXRlIG1hY2hpbmUuCisgKi8KK3N0YXRpYyBpbnQgbGxjX2Nvbm5fcmN2KHN0cnVjdCBzb2NrKiBzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfZXYgKmV2ID0gbGxjX2Nvbm5fZXYoc2tiKTsKKwlzdHJ1Y3QgbGxjX3NvY2sgKmxsYyA9IGxsY19zayhzayk7CisKKwlpZiAoIWxsYy0+ZGV2KQorCQlsbGMtPmRldiA9IHNrYi0+ZGV2OworCWV2LT50eXBlICAgPSBMTENfQ09OTl9FVl9UWVBFX1BEVTsKKwlldi0+cmVhc29uID0gMDsKKwlyZXR1cm4gbGxjX2Nvbm5fc3RhdGVfcHJvY2Vzcyhzaywgc2tiKTsKK30KKwordm9pZCBsbGNfY29ubl9oYW5kbGVyKHN0cnVjdCBsbGNfc2FwICpzYXAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19hZGRyIHNhZGRyLCBkYWRkcjsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlsbGNfcGR1X2RlY29kZV9zYShza2IsIHNhZGRyLm1hYyk7CisJbGxjX3BkdV9kZWNvZGVfc3NhcChza2IsICZzYWRkci5sc2FwKTsKKwlsbGNfcGR1X2RlY29kZV9kYShza2IsIGRhZGRyLm1hYyk7CisJbGxjX3BkdV9kZWNvZGVfZHNhcChza2IsICZkYWRkci5sc2FwKTsKKworCXNrID0gbGxjX2xvb2t1cF9lc3RhYmxpc2hlZChzYXAsICZzYWRkciwgJmRhZGRyKTsKKwlpZiAoIXNrKSB7CisJCS8qCisJCSAqIERpZG4ndCBmaW5kIGFuIGFjdGl2ZSBjb25uZWN0aW9uOyB2ZXJpZnkgaWYgdGhlcmUKKwkJICogaXMgYSBsaXN0ZW5pbmcgc29ja2V0IGZvciB0aGlzIGxsYyBhZGRyCisJCSAqLworCQlzdHJ1Y3QgbGxjX3NvY2sgKmxsYzsKKwkJc3RydWN0IHNvY2sgKnBhcmVudCA9IGxsY19sb29rdXBfbGlzdGVuZXIoc2FwLCAmZGFkZHIpOworCisJCWlmICghcGFyZW50KSB7CisJCQlkcHJpbnRrKCJsbGNfbG9va3VwX2xpc3RlbmVyIGZhaWxlZCFcbiIpOworCQkJZ290byBkcm9wOworCQl9CisKKwkJc2sgPSBsbGNfc2tfYWxsb2MocGFyZW50LT5za19mYW1pbHksIEdGUF9BVE9NSUMsIHBhcmVudC0+c2tfcHJvdCk7CisJCWlmICghc2spIHsKKwkJCXNvY2tfcHV0KHBhcmVudCk7CisJCQlnb3RvIGRyb3A7CisJCX0KKwkJbGxjID0gbGxjX3NrKHNrKTsKKwkJbWVtY3B5KCZsbGMtPmxhZGRyLCAmZGFkZHIsIHNpemVvZihsbGMtPmxhZGRyKSk7CisJCW1lbWNweSgmbGxjLT5kYWRkciwgJnNhZGRyLCBzaXplb2YobGxjLT5kYWRkcikpOworCQlsbGNfc2FwX2FkZF9zb2NrZXQoc2FwLCBzayk7CisJCXNvY2tfaG9sZChzayk7CisJCXNvY2tfcHV0KHBhcmVudCk7CisJCXNrYi0+c2sgPSBwYXJlbnQ7CisJfSBlbHNlCisJCXNrYi0+c2sgPSBzazsKKwliaF9sb2NrX3NvY2soc2spOworCWlmICghc29ja19vd25lZF9ieV91c2VyKHNrKSkKKwkJbGxjX2Nvbm5fcmN2KHNrLCBza2IpOworCWVsc2UgeworCQlkcHJpbnRrKCIlczogYWRkaW5nIHRvIGJhY2tsb2cuLi5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWxsY19zZXRfYmFja2xvZ190eXBlKHNrYiwgTExDX1BBQ0tFVCk7CisJCXNrX2FkZF9iYWNrbG9nKHNrLCBza2IpOworCX0KKwliaF91bmxvY2tfc29jayhzayk7CisJc29ja19wdXQoc2spOworCXJldHVybjsKK2Ryb3A6CisJa2ZyZWVfc2tiKHNrYik7Cit9CisKKyN1bmRlZiBMTENfUkVGQ05UX0RFQlVHCisjaWZkZWYgTExDX1JFRkNOVF9ERUJVRworc3RhdGljIGF0b21pY190IGxsY19zb2NrX25yOworI2VuZGlmCisKKy8qKgorICoJbGxjX3JlbGVhc2Vfc29ja2V0cyAtIHJlbGVhc2VzIGFsbCBzb2NrZXRzIGluIGEgc2FwCisgKglAc2FwOiBzYXAgdG8gcmVsZWFzZSBpdHMgc29ja2V0cworICoKKyAqCVJlbGVhc2VzIGFsbCBjb25uZWN0aW9ucyBvZiBhIHNhcC4gUmV0dXJucyAwIGlmIGFsbCBhY3Rpb25zIGNvbXBsZXRlCisgKglzdWNjZXNzZnVsbHksIG5vbnplcm8gb3RoZXJ3aXNlCisgKi8KK2ludCBsbGNfcmVsZWFzZV9zb2NrZXRzKHN0cnVjdCBsbGNfc2FwICpzYXApCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisKKwl3cml0ZV9sb2NrX2JoKCZzYXAtPnNrX2xpc3QubG9jayk7CisKKwlza19mb3JfZWFjaChzaywgbm9kZSwgJnNhcC0+c2tfbGlzdC5saXN0KSB7CisJCWxsY19zayhzayktPnN0YXRlID0gTExDX0NPTk5fU1RBVEVfVEVNUDsKKworCQlpZiAobGxjX3NlbmRfZGlzYyhzaykpCisJCQlyYyA9IDE7CisJfQorCisJd3JpdGVfdW5sb2NrX2JoKCZzYXAtPnNrX2xpc3QubG9jayk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqCWxsY19iYWNrbG9nX3JjdiAtIFByb2Nlc3NlcyByeCBmcmFtZXMgYW5kIGV4cGlyZWQgdGltZXJzLgorICoJQHNrOiBMTEMgc29jayAocDgwMjIgY29ubmVjdGlvbikKKyAqCUBza2I6IHF1ZXVlZCByeCBmcmFtZSBvciBldmVudAorICoKKyAqCVRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIGZyYW1lcyB0aGF0IGhhcyByZWNlaXZlZCBhbmQgdGltZXJzIHRoYXQgaGFzCisgKglleHBpcmVkIGR1cmluZyBzZW5kaW5nIGFuIEkgcGR1IChyZWZlciB0byBkYXRhX3JlcV9oYW5kbGVyKS4gIGZyYW1lcworICoJcXVldWUgYnkgbGxjX3JjdiBmdW5jdGlvbiAobGxjX21hYy5jKSBhbmQgdGltZXJzIHF1ZXVlIGJ5IHRpbWVyCisgKgljYWxsYmFjayBmdW5jdGlvbnMobGxjX2NfYWMuYykuCisgKi8KK3N0YXRpYyBpbnQgbGxjX2JhY2tsb2dfcmN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHNrKTsKKworCWlmIChsbGNfYmFja2xvZ190eXBlKHNrYikgPT0gTExDX1BBQ0tFVCkgeworCQlpZiAobGxjLT5zdGF0ZSA+IDEpIC8qIG5vdCBjbG9zZWQgKi8KKwkJCXJjID0gbGxjX2Nvbm5fcmN2KHNrLCBza2IpOworCQllbHNlCisJCQlnb3RvIG91dF9rZnJlZV9za2I7CisJfSBlbHNlIGlmIChsbGNfYmFja2xvZ190eXBlKHNrYikgPT0gTExDX0VWRU5UKSB7CisJCS8qIHRpbWVyIGV4cGlyYXRpb24gZXZlbnQgKi8KKwkJaWYgKGxsYy0+c3RhdGUgPiAxKSAgLyogbm90IGNsb3NlZCAqLworCQkJcmMgPSBsbGNfY29ubl9zdGF0ZV9wcm9jZXNzKHNrLCBza2IpOworCQllbHNlCisJCQlnb3RvIG91dF9rZnJlZV9za2I7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaW52YWxpZCBza2IgaW4gYmFja2xvZ1xuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBvdXRfa2ZyZWVfc2tiOworCX0KK291dDoKKwlyZXR1cm4gcmM7CitvdXRfa2ZyZWVfc2tiOgorCWtmcmVlX3NrYihza2IpOworCWdvdG8gb3V0OworfQorCisvKioKKyAqICAgICBsbGNfc2tfaW5pdCAtIEluaXRpYWxpemVzIGEgc29ja2V0IHdpdGggZGVmYXVsdCBsbGMgdmFsdWVzLgorICogICAgIEBzazogc29ja2V0IHRvIGluaXRpYWxpemUuCisgKgorICogICAgIEluaXRpYWxpemVzIGEgc29ja2V0IHdpdGggZGVmYXVsdCBsbGMgdmFsdWVzLgorICovCitzdGF0aWMgdm9pZCBsbGNfc2tfaW5pdChzdHJ1Y3Qgc29jayogc2spCit7CisJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2soc2spOworCisJbGxjLT5zdGF0ZSAgICA9IExMQ19DT05OX1NUQVRFX0FETTsKKwlsbGMtPmluY19jbnRyID0gbGxjLT5kZWNfY250ciA9IDI7CisJbGxjLT5kZWNfc3RlcCA9IGxsYy0+Y29ubmVjdF9zdGVwID0gMTsKKworCWluaXRfdGltZXIoJmxsYy0+YWNrX3RpbWVyLnRpbWVyKTsKKwlsbGMtPmFja190aW1lci5leHBpcmUJICAgICAgPSBMTENfQUNLX1RJTUU7CisJbGxjLT5hY2tfdGltZXIudGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZylzazsKKwlsbGMtPmFja190aW1lci50aW1lci5mdW5jdGlvbiA9IGxsY19jb25uX2Fja190bXJfY2I7CisKKwlpbml0X3RpbWVyKCZsbGMtPnBmX2N5Y2xlX3RpbWVyLnRpbWVyKTsKKwlsbGMtPnBmX2N5Y2xlX3RpbWVyLmV4cGlyZQkgICA9IExMQ19QX1RJTUU7CisJbGxjLT5wZl9jeWNsZV90aW1lci50aW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKXNrOworCWxsYy0+cGZfY3ljbGVfdGltZXIudGltZXIuZnVuY3Rpb24gPSBsbGNfY29ubl9wZl9jeWNsZV90bXJfY2I7CisKKwlpbml0X3RpbWVyKCZsbGMtPnJlal9zZW50X3RpbWVyLnRpbWVyKTsKKwlsbGMtPnJlal9zZW50X3RpbWVyLmV4cGlyZQkgICA9IExMQ19SRUpfVElNRTsKKwlsbGMtPnJlal9zZW50X3RpbWVyLnRpbWVyLmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpc2s7CisJbGxjLT5yZWpfc2VudF90aW1lci50aW1lci5mdW5jdGlvbiA9IGxsY19jb25uX3Jlal90bXJfY2I7CisKKwlpbml0X3RpbWVyKCZsbGMtPmJ1c3lfc3RhdGVfdGltZXIudGltZXIpOworCWxsYy0+YnVzeV9zdGF0ZV90aW1lci5leHBpcmUJICAgICA9IExMQ19CVVNZX1RJTUU7CisJbGxjLT5idXN5X3N0YXRlX3RpbWVyLnRpbWVyLmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpc2s7CisJbGxjLT5idXN5X3N0YXRlX3RpbWVyLnRpbWVyLmZ1bmN0aW9uID0gbGxjX2Nvbm5fYnVzeV90bXJfY2I7CisKKwlsbGMtPm4yID0gMjsgICAvKiBtYXggcmV0cmFuc21pdCAqLworCWxsYy0+ayAgPSAyOyAgIC8qIHR4IHdpbiBzaXplLCB3aWxsIGFkanVzdCBkeW5hbSAqLworCWxsYy0+cncgPSAxMjg7IC8qIHJ4IHdpbiBzaXplIChvcHQgYW5kIGVxdWFsIHRvCisJCSAgICAgICAgKiB0eF93aW4gb2YgcmVtb3RlIExMQykgKi8KKwlza2JfcXVldWVfaGVhZF9pbml0KCZsbGMtPnBkdV91bmFja19xKTsKKwlzay0+c2tfYmFja2xvZ19yY3YgPSBsbGNfYmFja2xvZ19yY3Y7Cit9CisKKy8qKgorICoJbGxjX3NrX2FsbG9jIC0gQWxsb2NhdGVzIExMQyBzb2NrCisgKglAZmFtaWx5OiB1cHBlciBsYXllciBwcm90b2NvbCBmYW1pbHkKKyAqCUBwcmlvcml0eTogZm9yIGFsbG9jYXRpb24gKCVHRlBfS0VSTkVMLCAlR0ZQX0FUT01JQywgZXRjKQorICoKKyAqCUFsbG9jYXRlcyBhIExMQyBzb2NrIGFuZCBpbml0aWFsaXplcyBpdC4gUmV0dXJucyB0aGUgbmV3IExMQyBzb2NrCisgKglvciAlTlVMTCBpZiB0aGVyZSdzIG5vIG1lbW9yeSBhdmFpbGFibGUgZm9yIG9uZQorICovCitzdHJ1Y3Qgc29jayAqbGxjX3NrX2FsbG9jKGludCBmYW1pbHksIGludCBwcmlvcml0eSwgc3RydWN0IHByb3RvICpwcm90KQoreworCXN0cnVjdCBzb2NrICpzayA9IHNrX2FsbG9jKGZhbWlseSwgcHJpb3JpdHksIHByb3QsIDEpOworCisJaWYgKCFzaykKKwkJZ290byBvdXQ7CisJbGxjX3NrX2luaXQoc2spOworCXNvY2tfaW5pdF9kYXRhKE5VTEwsIHNrKTsKKyNpZmRlZiBMTENfUkVGQ05UX0RFQlVHCisJYXRvbWljX2luYygmbGxjX3NvY2tfbnIpOworCXByaW50ayhLRVJOX0RFQlVHICJMTEMgc29ja2V0ICVwIGNyZWF0ZWQgaW4gJXMsIG5vdyB3ZSBoYXZlICVkIGFsaXZlXG4iLCBzaywKKwkJX19GVU5DVElPTl9fLCBhdG9taWNfcmVhZCgmbGxjX3NvY2tfbnIpKTsKKyNlbmRpZgorb3V0OgorCXJldHVybiBzazsKK30KKworLyoqCisgKglsbGNfc2tfZnJlZSAtIEZyZWVzIGEgTExDIHNvY2tldAorICoJQHNrIC0gc29ja2V0IHRvIGZyZWUKKyAqCisgKglGcmVlcyBhIExMQyBzb2NrZXQKKyAqLwordm9pZCBsbGNfc2tfZnJlZShzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2soc2spOworCisJbGxjLT5zdGF0ZSA9IExMQ19DT05OX09VVF9PRl9TVkM7CisJLyogU3RvcCBhbGwgKHBvc3NpYmx5KSBydW5uaW5nIHRpbWVycyAqLworCWxsY19jb25uX2FjX3N0b3BfYWxsX3RpbWVycyhzaywgTlVMTCk7CisjaWZkZWYgREVCVUdfTExDX0NPTk5fQUxMT0MKKwlwcmludGsoS0VSTl9JTkZPICIlczogdW5hY2txPSVkLCB0eHE9JWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJc2tiX3F1ZXVlX2xlbigmbGxjLT5wZHVfdW5hY2tfcSksCisJCXNrYl9xdWV1ZV9sZW4oJnNrLT5za193cml0ZV9xdWV1ZSkpOworI2VuZGlmCisJc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfd3JpdGVfcXVldWUpOworCXNrYl9xdWV1ZV9wdXJnZSgmbGxjLT5wZHVfdW5hY2tfcSk7CisjaWZkZWYgTExDX1JFRkNOVF9ERUJVRworCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3JlZmNudCkgIT0gMSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiRGVzdHJ1Y3Rpb24gb2YgTExDIHNvY2sgJXAgZGVsYXllZCBpbiAlcywgY250PSVkXG4iLAorCQkJc2ssIF9fRlVOQ1RJT05fXywgYXRvbWljX3JlYWQoJnNrLT5za19yZWZjbnQpKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVkIExMQyBzb2NrZXRzIGFyZSBzdGlsbCBhbGl2ZVxuIiwKKwkJCWF0b21pY19yZWFkKCZsbGNfc29ja19ucikpOworCX0gZWxzZSB7CisJCWF0b21pY19kZWMoJmxsY19zb2NrX25yKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkxMQyBzb2NrZXQgJXAgcmVsZWFzZWQgaW4gJXMsICVkIGFyZSBzdGlsbCBhbGl2ZVxuIiwgc2ssCisJCQlfX0ZVTkNUSU9OX18sIGF0b21pY19yZWFkKCZsbGNfc29ja19ucikpOworCX0KKyNlbmRpZgorCXNvY2tfcHV0KHNrKTsKK30KKworLyoqCisgKglsbGNfc2tfcmVzZXQgLSByZXNldHMgYSBjb25uZWN0aW9uCisgKglAc2s6IExMQyBzb2NrZXQgdG8gcmVzZXQKKyAqCisgKglSZXNldHMgYSBjb25uZWN0aW9uIHRvIHRoZSBvdXQgb2Ygc2VydmljZSBzdGF0ZS4gU3RvcHMgaXRzIHRpbWVycworICoJYW5kIGZyZWVzIGFueSBmcmFtZXMgaW4gdGhlIHF1ZXVlcyBvZiB0aGUgY29ubmVjdGlvbi4KKyAqLwordm9pZCBsbGNfc2tfcmVzZXQoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHNrKTsKKworCWxsY19jb25uX2FjX3N0b3BfYWxsX3RpbWVycyhzaywgTlVMTCk7CisJc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfd3JpdGVfcXVldWUpOworCXNrYl9xdWV1ZV9wdXJnZSgmbGxjLT5wZHVfdW5hY2tfcSk7CisJbGxjLT5yZW1vdGVfYnVzeV9mbGFnCT0gMDsKKwlsbGMtPmNhdXNlX2ZsYWcJCT0gMDsKKwlsbGMtPnJldHJ5X2NvdW50CT0gMDsKKwlsbGNfY29ubl9zZXRfcF9mbGFnKHNrLCAwKTsKKwlsbGMtPmZfZmxhZwkJPSAwOworCWxsYy0+c19mbGFnCQk9IDA7CisJbGxjLT5hY2tfcGYJCT0gMDsKKwlsbGMtPmZpcnN0X3BkdV9Ocwk9IDA7CisJbGxjLT5hY2tfbXVzdF9iZV9zZW5kCT0gMDsKKwlsbGMtPmRlY19zdGVwCQk9IDE7CisJbGxjLT5pbmNfY250cgkJPSAyOworCWxsYy0+ZGVjX2NudHIJCT0gMjsKKwlsbGMtPlgJCQk9IDA7CisJbGxjLT5mYWlsZWRfZGF0YV9yZXEJPSAwIDsKKwlsbGMtPmxhc3RfbnIJCT0gMDsKK30KZGlmZiAtLWdpdCBhL25ldC9sbGMvbGxjX2NvcmUuYyBiL25ldC9sbGMvbGxjX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmYwMmMwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2xsYy9sbGNfY29yZS5jCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogbGxjX2NvcmUuYyAtIE1pbmltdW0gbmVlZGVkIHJvdXRpbmVzIGZvciBzYXAgaGFuZGxpbmcgYW5kIG1vZHVsZSBpbml0L2V4aXQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcgYnkgUHJvY29tIFRlY2hub2xvZ3ksIEluYy4KKyAqIAkJIDIwMDEtMjAwMyBieSBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAqCisgKiBUaGlzIHByb2dyYW0gY2FuIGJlIHJlZGlzdHJpYnV0ZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgb3IgaW1wbGllZCB3YXJyYW50eQorICogb2YgbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLgorICoKKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPG5ldC9sbGMuaD4KKworTElTVF9IRUFEKGxsY19zYXBfbGlzdCk7CitERUZJTkVfUldMT0NLKGxsY19zYXBfbGlzdF9sb2NrKTsKKwordW5zaWduZWQgY2hhciBsbGNfc3RhdGlvbl9tYWNfc2FbRVRIX0FMRU5dOworCisvKioKKyAqCWxsY19zYXBfYWxsb2MgLSBhbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIHNhcC4KKyAqCisgKglBbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIHNhcC4KKyAqLworc3RhdGljIHN0cnVjdCBsbGNfc2FwICpsbGNfc2FwX2FsbG9jKHZvaWQpCit7CisJc3RydWN0IGxsY19zYXAgKnNhcCA9IGttYWxsb2Moc2l6ZW9mKCpzYXApLCBHRlBfQVRPTUlDKTsKKworCWlmIChzYXApIHsKKwkJbWVtc2V0KHNhcCwgMCwgc2l6ZW9mKCpzYXApKTsKKwkJc2FwLT5zdGF0ZSA9IExMQ19TQVBfU1RBVEVfQUNUSVZFOworCQltZW1jcHkoc2FwLT5sYWRkci5tYWMsIGxsY19zdGF0aW9uX21hY19zYSwgRVRIX0FMRU4pOworCQlyd2xvY2tfaW5pdCgmc2FwLT5za19saXN0LmxvY2spOworCX0KKwlyZXR1cm4gc2FwOworfQorCisvKioKKyAqCWxsY19hZGRfc2FwIC0gYWRkIHNhcCB0byBzdGF0aW9uIGxpc3QKKyAqCUBzYXA6IEFkZHJlc3Mgb2YgdGhlIHNhcAorICoKKyAqCUFkZHMgYSBzYXAgdG8gdGhlIExMQydzIHN0YXRpb24gc2FwIGxpc3QuCisgKi8KK3N0YXRpYyB2b2lkIGxsY19hZGRfc2FwKHN0cnVjdCBsbGNfc2FwICpzYXApCit7CisJd3JpdGVfbG9ja19iaCgmbGxjX3NhcF9saXN0X2xvY2spOworCWxpc3RfYWRkX3RhaWwoJnNhcC0+bm9kZSwgJmxsY19zYXBfbGlzdCk7CisJd3JpdGVfdW5sb2NrX2JoKCZsbGNfc2FwX2xpc3RfbG9jayk7Cit9CisKKy8qKgorICoJbGxjX2RlbF9zYXAgLSBkZWwgc2FwIGZyb20gc3RhdGlvbiBsaXN0CisgKglAc2FwOiBBZGRyZXNzIG9mIHRoZSBzYXAKKyAqCisgKglSZW1vdmVzIGEgc2FwIHRvIHRoZSBMTEMncyBzdGF0aW9uIHNhcCBsaXN0LgorICovCitzdGF0aWMgdm9pZCBsbGNfZGVsX3NhcChzdHJ1Y3QgbGxjX3NhcCAqc2FwKQoreworCXdyaXRlX2xvY2tfYmgoJmxsY19zYXBfbGlzdF9sb2NrKTsKKwlsaXN0X2RlbCgmc2FwLT5ub2RlKTsKKwl3cml0ZV91bmxvY2tfYmgoJmxsY19zYXBfbGlzdF9sb2NrKTsKK30KKworLyoqCisgKglsbGNfc2FwX2ZpbmQgLSBzZWFyY2hzIGEgU0FQIGluIHN0YXRpb24KKyAqCUBzYXBfdmFsdWU6IHNhcCB0byBiZSBmb3VuZAorICoKKyAqCVNlYXJjaHMgZm9yIGEgc2FwIGluIHRoZSBzYXAgbGlzdCBvZiB0aGUgTExDJ3Mgc3RhdGlvbiB1cG9uIHRoZSBzYXAgSUQuCisgKglSZXR1cm5zIHRoZSBzYXAgb3IgJU5VTEwgaWYgbm90IGZvdW5kLgorICovCitzdHJ1Y3QgbGxjX3NhcCAqbGxjX3NhcF9maW5kKHVuc2lnbmVkIGNoYXIgc2FwX3ZhbHVlKQoreworCXN0cnVjdCBsbGNfc2FwKiBzYXA7CisKKwlyZWFkX2xvY2tfYmgoJmxsY19zYXBfbGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNhcCwgJmxsY19zYXBfbGlzdCwgbm9kZSkKKwkJaWYgKHNhcC0+bGFkZHIubHNhcCA9PSBzYXBfdmFsdWUpCisJCQlnb3RvIG91dDsKKwlzYXAgPSBOVUxMOworb3V0OgorCXJlYWRfdW5sb2NrX2JoKCZsbGNfc2FwX2xpc3RfbG9jayk7CisJcmV0dXJuIHNhcDsKK30KKworLyoqCisgKglsbGNfc2FwX29wZW4gLSBvcGVuIGludGVyZmFjZSB0byB0aGUgdXBwZXIgbGF5ZXJzLgorICoJQGxzYXA6IFNBUCBudW1iZXIuCisgKglAZnVuYzogcmN2IGZ1bmMgZm9yIGRhdGFsaW5rIHByb3RvcworICoKKyAqCUludGVyZmFjZSBmdW5jdGlvbiB0byB1cHBlciBsYXllci4gRWFjaCBvbmUgd2hvIHdhbnRzIHRvIGdldCBhIFNBUAorICoJKGZvciBleGFtcGxlIE5ldEJFVUkpIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24uIFJldHVybnMgdGhlIG9wZW5lZAorICoJU0FQIGZvciBzdWNjZXNzLCBOVUxMIGZvciBmYWlsdXJlLgorICovCitzdHJ1Y3QgbGxjX3NhcCAqbGxjX3NhcF9vcGVuKHVuc2lnbmVkIGNoYXIgbHNhcCwKKwkJCSAgICAgaW50ICgqZnVuYykoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0KSkKK3sKKwlzdHJ1Y3QgbGxjX3NhcCAqc2FwID0gbGxjX3NhcF9maW5kKGxzYXApOworCisJaWYgKHNhcCkgeyAvKiBTQVAgYWxyZWFkeSBleGlzdHMgKi8KKwkJc2FwID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCXNhcCA9IGxsY19zYXBfYWxsb2MoKTsKKwlpZiAoIXNhcCkKKwkJZ290byBvdXQ7CisJc2FwLT5sYWRkci5sc2FwID0gbHNhcDsKKwlzYXAtPnJjdl9mdW5jCT0gZnVuYzsKKwlsbGNfYWRkX3NhcChzYXApOworb3V0OgorCXJldHVybiBzYXA7Cit9CisKKy8qKgorICoJbGxjX3NhcF9jbG9zZSAtIGNsb3NlIGludGVyZmFjZSBmb3IgdXBwZXIgbGF5ZXJzLgorICoJQHNhcDogU0FQIHRvIGJlIGNsb3NlZC4KKyAqCisgKglDbG9zZSBpbnRlcmZhY2UgZnVuY3Rpb24gdG8gdXBwZXIgbGF5ZXIuIEVhY2ggb25lIHdobyB3YW50cyB0bworICoJY2xvc2UgYW4gb3BlbiBTQVAgKGZvciBleGFtcGxlIE5ldEJFVUkpIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24uCisgKiAJUmVtb3ZlcyB0aGlzIHNhcCBmcm9tIHRoZSBsaXN0IG9mIHNhcHMgaW4gdGhlIHN0YXRpb24gYW5kIHRoZW4KKyAqIAlmcmVlcyB0aGUgbWVtb3J5IGZvciB0aGlzIHNhcC4KKyAqLwordm9pZCBsbGNfc2FwX2Nsb3NlKHN0cnVjdCBsbGNfc2FwICpzYXApCit7CisJV0FSTl9PTighaGxpc3RfZW1wdHkoJnNhcC0+c2tfbGlzdC5saXN0KSk7CisJbGxjX2RlbF9zYXAoc2FwKTsKKwlrZnJlZShzYXApOworfQorCitzdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIGxsY19wYWNrZXRfdHlwZSA9IHsKKwkudHlwZSA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyXzIpLAorCS5mdW5jID0gbGxjX3JjdiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGFja2V0X3R5cGUgbGxjX3RyX3BhY2tldF90eXBlID0geworCS50eXBlID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9UUl84MDJfMiksCisJLmZ1bmMgPSBsbGNfcmN2LAorfTsKKworc3RhdGljIGludCBfX2luaXQgbGxjX2luaXQodm9pZCkKK3sKKwlpZiAoZGV2X2Jhc2UtPm5leHQpCisJCW1lbWNweShsbGNfc3RhdGlvbl9tYWNfc2EsIGRldl9iYXNlLT5uZXh0LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCWVsc2UKKwkJbWVtc2V0KGxsY19zdGF0aW9uX21hY19zYSwgMCwgRVRIX0FMRU4pOworCWRldl9hZGRfcGFjaygmbGxjX3BhY2tldF90eXBlKTsKKwlkZXZfYWRkX3BhY2soJmxsY190cl9wYWNrZXRfdHlwZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBsbGNfZXhpdCh2b2lkKQoreworCWRldl9yZW1vdmVfcGFjaygmbGxjX3BhY2tldF90eXBlKTsKKwlkZXZfcmVtb3ZlX3BhY2soJmxsY190cl9wYWNrZXRfdHlwZSk7Cit9CisKK21vZHVsZV9pbml0KGxsY19pbml0KTsKK21vZHVsZV9leGl0KGxsY19leGl0KTsKKworRVhQT1JUX1NZTUJPTChsbGNfc3RhdGlvbl9tYWNfc2EpOworRVhQT1JUX1NZTUJPTChsbGNfc2FwX2xpc3QpOworRVhQT1JUX1NZTUJPTChsbGNfc2FwX2xpc3RfbG9jayk7CitFWFBPUlRfU1lNQk9MKGxsY19zYXBfZmluZCk7CitFWFBPUlRfU1lNQk9MKGxsY19zYXBfb3Blbik7CitFWFBPUlRfU1lNQk9MKGxsY19zYXBfY2xvc2UpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJQcm9jb20gMTk5NywgSmF5IFNjaHVsbGlzdCAyMDAxLCBBcm5hbGRvIEMuIE1lbG8gMjAwMS0yMDAzIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxMQyBJRUVFIDgwMi4yIGNvcmUgc3VwcG9ydCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2xsYy9sbGNfaWYuYyBiL25ldC9sbGMvbGxjX2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY5ZmM0OAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9sbGMvbGxjX2lmLmMKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBsbGNfaWYuYyAtIERlZmluZXMgTExDIGludGVyZmFjZSB0byB1cHBlciBsYXllcgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NyBieSBQcm9jb20gVGVjaG5vbG9neSwgSW5jLgorICogCQkgMjAwMS0yMDAzIGJ5IEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBjYW4gYmUgcmVkaXN0cmlidXRlZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSBvciBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuCisgKgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8bmV0L2xsY19pZi5oPgorI2luY2x1ZGUgPG5ldC9sbGNfc2FwLmg+CisjaW5jbHVkZSA8bmV0L2xsY19zX2V2Lmg+CisjaW5jbHVkZSA8bmV0L2xsY19jb25uLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvbGxjX2NfZXYuaD4KKyNpbmNsdWRlIDxuZXQvbGxjX2NfYWMuaD4KKyNpbmNsdWRlIDxuZXQvbGxjX2Nfc3QuaD4KKwordTggbGxjX21hY19udWxsX3ZhcltJRkhXQUREUkxFTl07CisKKy8qKgorICoJbGxjX2J1aWxkX2FuZF9zZW5kX3BrdCAtIENvbm5lY3Rpb24gZGF0YSBzZW5kaW5nIGZvciB1cHBlciBsYXllcnMuCisgKglAc2s6IGNvbm5lY3Rpb24KKyAqCUBza2I6IHBhY2tldCB0byBzZW5kCisgKgorICoJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB1cHBlciBsYXllciB3YW50cyB0byBzZW5kIGRhdGEgdXNpbmcKKyAqCWNvbm5lY3Rpb24gb3JpZW50ZWQgY29tbXVuaWNhdGlvbiBtb2RlLiBEdXJpbmcgc2VuZGluZyBkYXRhLCBjb25uZWN0aW9uCisgKgl3aWxsIGJlIGxvY2tlZCBhbmQgcmVjZWl2ZWQgZnJhbWVzIGFuZCBleHBpcmVkIHRpbWVycyB3aWxsIGJlIHF1ZXVlZC4KKyAqCVJldHVybnMgMCBmb3Igc3VjY2VzcywgLUVDT05OQUJPUlRFRCB3aGVuIHRoZSBjb25uZWN0aW9uIGFscmVhZHkKKyAqCWNsb3NlZCBhbmQgLUVCVVNZIHdoZW4gc2VuZGluZyBkYXRhIGlzIG5vdCBwZXJtaXR0ZWQgaW4gdGhpcyBzdGF0ZSBvcgorICoJTExDIGhhcyBzZW5kIGFuIEkgcGR1IHdpdGggcCBiaXQgc2V0IHRvIDEgYW5kIGlzIHdhaXRpbmcgZm9yIGl0J3MKKyAqCXJlc3BvbnNlLgorICovCitpbnQgbGxjX2J1aWxkX2FuZF9zZW5kX3BrdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19jb25uX3N0YXRlX2V2ICpldjsKKwlpbnQgcmMgPSAtRUNPTk5BQk9SVEVEOworCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHNrKTsKKworCWlmIChsbGMtPnN0YXRlID09IExMQ19DT05OX1NUQVRFX0FETSkKKwkJZ290byBvdXQ7CisJcmMgPSAtRUJVU1k7CisJaWYgKGxsY19kYXRhX2FjY2VwdF9zdGF0ZShsbGMtPnN0YXRlKSkgeyAvKiBkYXRhX2Nvbm5fcmVmdXNlICovCisJCWxsYy0+ZmFpbGVkX2RhdGFfcmVxID0gMTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChsbGMtPnBfZmxhZykgeworCQlsbGMtPmZhaWxlZF9kYXRhX3JlcSA9IDE7CisJCWdvdG8gb3V0OworCX0KKwlldiA9IGxsY19jb25uX2V2KHNrYik7CisJZXYtPnR5cGUgICAgICA9IExMQ19DT05OX0VWX1RZUEVfUFJJTTsKKwlldi0+cHJpbSAgICAgID0gTExDX0RBVEFfUFJJTTsKKwlldi0+cHJpbV90eXBlID0gTExDX1BSSU1fVFlQRV9SRVE7CisJc2tiLT5kZXYgICAgICA9IGxsYy0+ZGV2OworCXJjID0gbGxjX2Nvbm5fc3RhdGVfcHJvY2Vzcyhzaywgc2tiKTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICoJbGxjX2VzdGFibGlzaF9jb25uZWN0aW9uIC0gQ2FsbGVkIGJ5IHVwcGVyIGxheWVyIHRvIGVzdGFibGlzaCBhIGNvbm4KKyAqCUBzazogY29ubmVjdGlvbgorICoJQGxtYWM6IGxvY2FsIG1hYyBhZGRyZXNzCisgKglAZG1hYzogZGVzdGluYXRpb24gbWFjIGFkZHJlc3MKKyAqCUBkc2FwOiBkZXN0aW5hdGlvbiBzYXAKKyAqCisgKglVcHBlciBsYXllciBjYWxscyB0aGlzIHRvIGVzdGFibGlzaCBhbiBMTEMgY29ubmVjdGlvbiB3aXRoIGEgcmVtb3RlCisgKgltYWNoaW5lLiBUaGlzIGZ1bmN0aW9uIHBhY2thZ2VzIGEgcHJvcGVyIGV2ZW50IGFuZCBzZW5kcyBpdCBjb25uZWN0aW9uCisgKgljb21wb25lbnQgc3RhdGUgbWFjaGluZS4gU3VjY2VzcyBvciBmYWlsdXJlIG9mIGNvbm5lY3Rpb24KKyAqCWVzdGFibGlzaG1lbnQgd2lsbCBpbmZvcm0gdG8gdXBwZXIgbGF5ZXIgdmlhIGNhbGxpbmcgaXQncyBjb25maXJtCisgKglmdW5jdGlvbiBhbmQgcGFzc2luZyBwcm9wZXIgaW5mb3JtYXRpb24uCisgKi8KK2ludCBsbGNfZXN0YWJsaXNoX2Nvbm5lY3Rpb24oc3RydWN0IHNvY2sgKnNrLCB1OCAqbG1hYywgdTggKmRtYWMsIHU4IGRzYXApCit7CisJaW50IHJjID0gLUVJU0NPTk47CisJc3RydWN0IGxsY19hZGRyIGxhZGRyLCBkYWRkcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBsbGNfc29jayAqbGxjID0gbGxjX3NrKHNrKTsKKwlzdHJ1Y3Qgc29jayAqZXhpc3Rpbmc7CisKKwlsYWRkci5sc2FwID0gbGxjLT5zYXAtPmxhZGRyLmxzYXA7CisJZGFkZHIubHNhcCA9IGRzYXA7CisJbWVtY3B5KGRhZGRyLm1hYywgZG1hYywgc2l6ZW9mKGRhZGRyLm1hYykpOworCW1lbWNweShsYWRkci5tYWMsIGxtYWMsIHNpemVvZihsYWRkci5tYWMpKTsKKwlleGlzdGluZyA9IGxsY19sb29rdXBfZXN0YWJsaXNoZWQobGxjLT5zYXAsICZkYWRkciwgJmxhZGRyKTsKKwlpZiAoZXhpc3RpbmcpIHsKKwkJaWYgKGV4aXN0aW5nLT5za19zdGF0ZSA9PSBUQ1BfRVNUQUJMSVNIRUQpIHsKKwkJCXNrID0gZXhpc3Rpbmc7CisJCQlnb3RvIG91dF9wdXQ7CisJCX0gZWxzZQorCQkJc29ja19wdXQoZXhpc3RpbmcpOworCX0KKwlzb2NrX2hvbGQoc2spOworCXJjID0gLUVOT01FTTsKKwlza2IgPSBhbGxvY19za2IoMCwgR0ZQX0FUT01JQyk7CisJaWYgKHNrYikgeworCQlzdHJ1Y3QgbGxjX2Nvbm5fc3RhdGVfZXYgKmV2ID0gbGxjX2Nvbm5fZXYoc2tiKTsKKworCQlldi0+dHlwZSAgICAgID0gTExDX0NPTk5fRVZfVFlQRV9QUklNOworCQlldi0+cHJpbSAgICAgID0gTExDX0NPTk5fUFJJTTsKKwkJZXYtPnByaW1fdHlwZSA9IExMQ19QUklNX1RZUEVfUkVROworCQlyYyA9IGxsY19jb25uX3N0YXRlX3Byb2Nlc3Moc2ssIHNrYik7CisJfQorb3V0X3B1dDoKKwlzb2NrX3B1dChzayk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqCWxsY19zZW5kX2Rpc2MgLSBDYWxsZWQgYnkgdXBwZXIgbGF5ZXIgdG8gY2xvc2UgYSBjb25uZWN0aW9uCisgKglAc2s6IGNvbm5lY3Rpb24gdG8gYmUgY2xvc2VkCisgKgorICoJVXBwZXIgbGF5ZXIgY2FsbHMgdGhpcyB3aGVuIGl0IHdhbnRzIHRvIGNsb3NlIGFuIGVzdGFibGlzaGVkIExMQworICoJY29ubmVjdGlvbiB3aXRoIGEgcmVtb3RlIG1hY2hpbmUuIFRoaXMgZnVuY3Rpb24gcGFja2FnZXMgYSBwcm9wZXIgZXZlbnQKKyAqCWFuZCBzZW5kcyBpdCB0byBjb25uZWN0aW9uIGNvbXBvbmVudCBzdGF0ZSBtYWNoaW5lLiBSZXR1cm5zIDAgZm9yCisgKglzdWNjZXNzLCAxIG90aGVyd2lzZS4KKyAqLworaW50IGxsY19zZW5kX2Rpc2Moc3RydWN0IHNvY2sgKnNrKQoreworCXUxNiByYyA9IDE7CisJc3RydWN0IGxsY19jb25uX3N0YXRlX2V2ICpldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc29ja19ob2xkKHNrKTsKKwlpZiAoc2stPnNrX3R5cGUgIT0gU09DS19TVFJFQU0gfHwgc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCB8fAorCSAgICBsbGNfc2soc2spLT5zdGF0ZSA9PSBMTENfQ09OTl9TVEFURV9BRE0gfHwKKwkgICAgbGxjX3NrKHNrKS0+c3RhdGUgPT0gTExDX0NPTk5fT1VUX09GX1NWQykKKwkJZ290byBvdXQ7CisJLyoKKwkgKiBQb3N0cG9uZSB1bmFzc2lnbmluZyB0aGUgY29ubmVjdGlvbiBmcm9tIGl0cyBTQVAgYW5kIHJldHVybmluZyB0aGUKKwkgKiBjb25uZWN0aW9uIHVudGlsIGFsbCBBQ1RJT05zIGhhdmUgYmVlbiBjb21wbGV0ZWx5IGV4ZWN1dGVkCisJICovCisJc2tiID0gYWxsb2Nfc2tiKDAsIEdGUF9BVE9NSUMpOworCWlmICghc2tiKQorCQlnb3RvIG91dDsKKwlzay0+c2tfc3RhdGUgID0gVENQX0NMT1NJTkc7CisJZXYJICAgICAgPSBsbGNfY29ubl9ldihza2IpOworCWV2LT50eXBlICAgICAgPSBMTENfQ09OTl9FVl9UWVBFX1BSSU07CisJZXYtPnByaW0gICAgICA9IExMQ19ESVNDX1BSSU07CisJZXYtPnByaW1fdHlwZSA9IExMQ19QUklNX1RZUEVfUkVROworCXJjID0gbGxjX2Nvbm5fc3RhdGVfcHJvY2Vzcyhzaywgc2tiKTsKK291dDoKKwlzb2NrX3B1dChzayk7CisJcmV0dXJuIHJjOworfQorCmRpZmYgLS1naXQgYS9uZXQvbGxjL2xsY19pbnB1dC5jIGIvbmV0L2xsYy9sbGNfaW5wdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGE2OTc2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2xsYy9sbGNfaW5wdXQuYwpAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIGxsY19pbnB1dC5jIC0gTWluaW1hbCBpbnB1dCBwYXRoIGZvciBMTEMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcgYnkgUHJvY29tIFRlY2hub2xvZ3ksIEluYy4KKyAqIAkJIDIwMDEtMjAwMyBieSBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAqCisgKiBUaGlzIHByb2dyYW0gY2FuIGJlIHJlZGlzdHJpYnV0ZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgb3IgaW1wbGllZCB3YXJyYW50eQorICogb2YgbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLgorICoKKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPG5ldC9sbGMuaD4KKyNpbmNsdWRlIDxuZXQvbGxjX3BkdS5oPgorI2luY2x1ZGUgPG5ldC9sbGNfc2FwLmg+CisKKyNpZiAwCisjZGVmaW5lIGRwcmludGsoYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgYXJncykKKyNlbHNlCisjZGVmaW5lIGRwcmludGsoYXJncy4uLikKKyNlbmRpZgorCisvKgorICogUGFja2V0IGhhbmRsZXIgZm9yIHRoZSBzdGF0aW9uLCByZWdpc3RlcmFibGUgYmVjYXVzZSBpbiB0aGUgbWluaW1hbAorICogTExDIGNvcmUgdGhhdCBpcyB0YWtpbmcgc2hhcGUgb25seSB0aGUgdmVyeSBtaW5pbWFsIHN1YnNldCBvZiBMTEMgdGhhdAorICogaXMgbmVlZGVkIGZvciB0aGluZ3MgbGlrZSBJUFgsIEFwcGxldGFsaywgZXRjIHdpbGwgc3RheSwgd2l0aCBhbGwgdGhlCisgKiByZXN0IGluIHRoZSBsbGMxIGFuZCBsbGMyIG1vZHVsZXMuCisgKi8KK3N0YXRpYyB2b2lkICgqbGxjX3N0YXRpb25faGFuZGxlcikoc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKy8qCisgKiBQYWNrZXQgaGFuZGxlcnMgZm9yIExMQ19ERVNUX1NBUCBhbmQgTExDX0RFU1RfQ09OTi4KKyAqLworc3RhdGljIHZvaWQgKCpsbGNfdHlwZV9oYW5kbGVyc1syXSkoc3RydWN0IGxsY19zYXAgKnNhcCwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKK3ZvaWQgbGxjX2FkZF9wYWNrKGludCB0eXBlLCB2b2lkICgqaGFuZGxlcikoc3RydWN0IGxsY19zYXAgKnNhcCwKKwkJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpKQoreworCWlmICh0eXBlID09IExMQ19ERVNUX1NBUCB8fCB0eXBlID09IExMQ19ERVNUX0NPTk4pCisJCWxsY190eXBlX2hhbmRsZXJzW3R5cGUgLSAxXSA9IGhhbmRsZXI7Cit9CisKK3ZvaWQgbGxjX3JlbW92ZV9wYWNrKGludCB0eXBlKQoreworCWlmICh0eXBlID09IExMQ19ERVNUX1NBUCB8fCB0eXBlID09IExMQ19ERVNUX0NPTk4pCisJCWxsY190eXBlX2hhbmRsZXJzW3R5cGUgLSAxXSA9IE5VTEw7Cit9CisKK3ZvaWQgbGxjX3NldF9zdGF0aW9uX2hhbmRsZXIodm9pZCAoKmhhbmRsZXIpKHN0cnVjdCBza19idWZmICpza2IpKQoreworCWxsY19zdGF0aW9uX2hhbmRsZXIgPSBoYW5kbGVyOworfQorCisvKioKKyAqCWxsY19wZHVfdHlwZSAtIHJldHVybnMgd2hpY2ggTExDIGNvbXBvbmVudCBtdXN0IGhhbmRsZSBmb3IgUERVCisgKglAc2tiOiBpbnB1dCBza2IKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHJldHVybnMgd2hpY2ggTExDIGNvbXBvbmVudCBtdXN0IGhhbmRsZSB0aGlzIFBEVS4KKyAqLworc3RhdGljIF9faW5saW5lX18gaW50IGxsY19wZHVfdHlwZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCB0eXBlID0gTExDX0RFU1RfQ09OTjsgLyogSS1QRFUgb3IgUy1QRFUgdHlwZSAqLworCXN0cnVjdCBsbGNfcGR1X3NuICpwZHUgPSBsbGNfcGR1X3NuX2hkcihza2IpOworCisJaWYgKChwZHUtPmN0cmxfMSAmIExMQ19QRFVfVFlQRV9NQVNLKSAhPSBMTENfUERVX1RZUEVfVSkKKwkJZ290byBvdXQ7CisJc3dpdGNoIChMTENfVV9QRFVfQ01EKHBkdSkpIHsKKwljYXNlIExMQ18xX1BEVV9DTURfWElEOgorCWNhc2UgTExDXzFfUERVX0NNRF9VSToKKwljYXNlIExMQ18xX1BEVV9DTURfVEVTVDoKKwkJdHlwZSA9IExMQ19ERVNUX1NBUDsKKwkJYnJlYWs7CisJY2FzZSBMTENfMl9QRFVfQ01EX1NBQk1FOgorCWNhc2UgTExDXzJfUERVX0NNRF9ESVNDOgorCWNhc2UgTExDXzJfUERVX1JTUF9VQToKKwljYXNlIExMQ18yX1BEVV9SU1BfRE06CisJY2FzZSBMTENfMl9QRFVfUlNQX0ZSTVI6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXR5cGUgPSBMTENfREVTVF9JTlZBTElEOworCQlicmVhazsKKwl9CitvdXQ6CisJcmV0dXJuIHR5cGU7Cit9CisKKy8qKgorICoJbGxjX2ZpeHVwX3NrYiAtIGluaXRpYWxpemVzIHNrYiBwb2ludGVycworICoJQHNrYjogVGhpcyBhcmd1bWVudCBwb2ludHMgdG8gaW5jb21pbmcgc2tiCisgKgorICoJSW5pdGlhbGl6ZXMgaW50ZXJuYWwgc2tiIHBvaW50ZXIgdG8gc3RhcnQgb2YgbmV0d29yayBsYXllciBieSBkZXJpdmluZworICoJbGVuZ3RoIG9mIExMQyBoZWFkZXI7IGZpbmRzIGxlbmd0aCBvZiBMTEMgY29udHJvbCBmaWVsZCBpbiBMTEMgaGVhZGVyCisgKglieSBsb29raW5nIGF0IHRoZSB0d28gbG93ZXN0LW9yZGVyIGJpdHMgb2YgdGhlIGZpcnN0IGNvbnRyb2wgZmllbGQKKyAqCWJ5dGU7IGZpZWxkIGlzIGVpdGhlciAzIG9yIDQgYnl0ZXMgbG9uZy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbGxjX2ZpeHVwX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXU4IGxsY19sZW4gPSAyOworCXN0cnVjdCBsbGNfcGR1X3NuICpwZHU7CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2YoKnBkdSkpKQorCQlyZXR1cm4gMDsKKworCXBkdSA9IChzdHJ1Y3QgbGxjX3BkdV9zbiAqKXNrYi0+ZGF0YTsKKwlpZiAoKHBkdS0+Y3RybF8xICYgTExDX1BEVV9UWVBFX01BU0spID09IExMQ19QRFVfVFlQRV9VKQorCQlsbGNfbGVuID0gMTsKKwlsbGNfbGVuICs9IDI7CisJc2tiLT5oLnJhdyArPSBsbGNfbGVuOworCXNrYl9wdWxsKHNrYiwgbGxjX2xlbik7CisJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyXzIpKSB7CisJCXUxNiBwZHVsZW4gPSBldGhfaGRyKHNrYiktPmhfcHJvdG8sCisJCSAgICBkYXRhX3NpemUgPSBudG9ocyhwZHVsZW4pIC0gbGxjX2xlbjsKKworCQlza2JfdHJpbShza2IsIGRhdGFfc2l6ZSk7CisJfQorCXJldHVybiAxOworfQorCisvKioKKyAqCWxsY19yY3YgLSA4MDIuMiBlbnRyeSBwb2ludCBmcm9tIG5ldCBsb3dlciBsYXllcnMKKyAqCUBza2I6IHJlY2VpdmVkIHBkdQorICoJQGRldjogZGV2aWNlIHRoYXQgcmVjZWl2ZSBwZHUKKyAqCUBwdDogcGFja2V0IHR5cGUKKyAqCisgKglXaGVuIHRoZSBzeXN0ZW0gcmVjZWl2ZXMgYSA4MDIuMiBmcmFtZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4gSXQKKyAqCWNoZWNrcyBTQVAgYW5kIGNvbm5lY3Rpb24gb2YgcmVjZWl2ZWQgcGR1IGFuZCBwYXNzZXMgZnJhbWUgdG8KKyAqCWxsY197c3RhdGlvbixzYXAsY29ubn1fcmN2IGZvciBzZW5kaW5nIHRvIHByb3BlciBzdGF0ZSBtYWNoaW5lLiBJZgorICoJdGhlIGZyYW1lIGlzIHJlbGF0ZWQgdG8gYSBidXN5IGNvbm5lY3Rpb24gKGEgY29ubmVjdGlvbiBpcyBzZW5kaW5nCisgKglkYXRhIG5vdyksIGl0IHF1ZXVlcyB0aGlzIGZyYW1lIGluIHRoZSBjb25uZWN0aW9uJ3MgYmFja2xvZy4KKyAqLworaW50IGxsY19yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkgICAgc3RydWN0IHBhY2tldF90eXBlICpwdCkKK3sKKwlzdHJ1Y3QgbGxjX3NhcCAqc2FwOworCXN0cnVjdCBsbGNfcGR1X3NuICpwZHU7CisJaW50IGRlc3Q7CisKKwkvKgorCSAqIFdoZW4gdGhlIGludGVyZmFjZSBpcyBpbiBwcm9taXNjLiBtb2RlLCBkcm9wIGFsbCB0aGUgY3JhcCB0aGF0IGl0CisJICogcmVjZWl2ZXMsIGRvIG5vdCB0cnkgdG8gYW5hbHlzZSBpdC4KKwkgKi8KKwlpZiAodW5saWtlbHkoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfT1RIRVJIT1NUKSkgeworCQlkcHJpbnRrKCIlczogUEFDS0VUX09USEVSSE9TVFxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBkcm9wOworCX0KKwlza2IgPSBza2Jfc2hhcmVfY2hlY2soc2tiLCBHRlBfQVRPTUlDKTsKKwlpZiAodW5saWtlbHkoIXNrYikpCisJCWdvdG8gb3V0OworCWlmICh1bmxpa2VseSghbGxjX2ZpeHVwX3NrYihza2IpKSkKKwkJZ290byBkcm9wOworCXBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisJaWYgKHVubGlrZWx5KCFwZHUtPmRzYXApKSAvKiBOVUxMIERTQVAsIHJlZmVyIHRvIHN0YXRpb24gKi8KKwkgICAgICAgZ290byBoYW5kbGVfc3RhdGlvbjsKKwlzYXAgPSBsbGNfc2FwX2ZpbmQocGR1LT5kc2FwKTsKKwlpZiAodW5saWtlbHkoIXNhcCkpIHsvKiB1bmtub3duIFNBUCAqLworCQlkcHJpbnRrKCIlczogbGxjX3NhcF9maW5kKCUwMlgpIGZhaWxlZCFcbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgICAgICBwZHUtPmRzYXApOworCQlnb3RvIGRyb3A7CisJfQorCS8qCisJICogRmlyc3QgdGhlIHVwcGVyIGxheWVyIHByb3RvY29scyB0aGF0IGRvbid0IG5lZWQgdGhlIGZ1bGwKKwkgKiBMTEMgZnVuY3Rpb25hbGl0eQorCSAqLworCWlmIChzYXAtPnJjdl9mdW5jKSB7CisJCXNhcC0+cmN2X2Z1bmMoc2tiLCBkZXYsIHB0KTsKKwkJZ290byBvdXQ7CisJfQorCWRlc3QgPSBsbGNfcGR1X3R5cGUoc2tiKTsKKwlpZiAodW5saWtlbHkoIWRlc3QgfHwgIWxsY190eXBlX2hhbmRsZXJzW2Rlc3QgLSAxXSkpCisJCWdvdG8gZHJvcDsKKwlsbGNfdHlwZV9oYW5kbGVyc1tkZXN0IC0gMV0oc2FwLCBza2IpOworb3V0OgorCXJldHVybiAwOworZHJvcDoKKwlrZnJlZV9za2Ioc2tiKTsKKwlnb3RvIG91dDsKK2hhbmRsZV9zdGF0aW9uOgorCWlmICghbGxjX3N0YXRpb25faGFuZGxlcikKKwkJZ290byBkcm9wOworCWxsY19zdGF0aW9uX2hhbmRsZXIoc2tiKTsKKwlnb3RvIG91dDsKK30KKworRVhQT1JUX1NZTUJPTChsbGNfYWRkX3BhY2spOworRVhQT1JUX1NZTUJPTChsbGNfcmVtb3ZlX3BhY2spOworRVhQT1JUX1NZTUJPTChsbGNfc2V0X3N0YXRpb25faGFuZGxlcik7CmRpZmYgLS1naXQgYS9uZXQvbGxjL2xsY19vdXRwdXQuYyBiL25ldC9sbGMvbGxjX291dHB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNTc4NGMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbGxjL2xsY19vdXRwdXQuYwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIGxsY19vdXRwdXQuYyAtIExMQyBtaW5pbWFsIG91dHB1dCBwYXRoCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3IGJ5IFByb2NvbSBUZWNobm9sb2d5LCBJbmMuCisgKiAJCSAyMDAxLTIwMDMgYnkgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisgKgorICogVGhpcyBwcm9ncmFtIGNhbiBiZSByZWRpc3RyaWJ1dGVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24uCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgb3IgaW1wbGllZCB3YXJyYW50eQorICogb2YgbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLgorICoKKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3RyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdHJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvbGxjLmg+CisjaW5jbHVkZSA8bmV0L2xsY19wZHUuaD4KKworLyoqCisgKglsbGNfbWFjX2hkcl9pbml0IC0gZmlsbHMgTUFDIGhlYWRlciBmaWVsZHMKKyAqCUBza2I6IEFkZHJlc3Mgb2YgdGhlIGZyYW1lIHRvIGluaXRpYWxpemUgaXRzIE1BQyBoZWFkZXIKKyAqCUBzYTogVGhlIE1BQyBzb3VyY2UgYWRkcmVzcworICoJQGRhOiBUaGUgTUFDIGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAqCisgKglGaWxscyBNQUMgaGVhZGVyIGZpZWxkcywgZGVwZW5kaW5nIG9uIE1BQyB0eXBlLiBSZXR1cm5zIDAsIElmIE1BQyB0eXBlCisgKglpcyBhIHZhbGlkIHR5cGUgYW5kIGluaXRpYWxpemF0aW9uIGNvbXBsZXRlcyBjb3JyZWN0bHkgMSwgb3RoZXJ3aXNlLgorICovCitpbnQgbGxjX21hY19oZHJfaW5pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBjaGFyICpzYSwgdW5zaWduZWQgY2hhciAqZGEpCit7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoc2tiLT5kZXYtPnR5cGUpIHsKKyNpZmRlZiBDT05GSUdfVFIKKwljYXNlIEFSUEhSRF9JRUVFODAyX1RSOiB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKKwkJc3RydWN0IHRyaF9oZHIgKnRyaDsKKwkJCisJCXNrYi0+bWFjLnJhdyA9IHNrYl9wdXNoKHNrYiwgc2l6ZW9mKCp0cmgpKTsKKwkJdHJoID0gdHJfaGRyKHNrYik7CisJCXRyaC0+YWMgPSBBQzsKKwkJdHJoLT5mYyA9IExMQ19GUkFNRTsKKwkJaWYgKHNhKQorCQkJbWVtY3B5KHRyaC0+c2FkZHIsIHNhLCBkZXYtPmFkZHJfbGVuKTsKKwkJZWxzZQorCQkJbWVtc2V0KHRyaC0+c2FkZHIsIDAsIGRldi0+YWRkcl9sZW4pOworCQlpZiAoZGEpIHsKKwkJCW1lbWNweSh0cmgtPmRhZGRyLCBkYSwgZGV2LT5hZGRyX2xlbik7CisJCQl0cl9zb3VyY2Vfcm91dGUoc2tiLCB0cmgsIGRldik7CisJCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCX0KKwkJYnJlYWs7CisJfQorI2VuZGlmCisJY2FzZSBBUlBIUkRfRVRIRVI6CisJY2FzZSBBUlBIUkRfTE9PUEJBQ0s6IHsKKwkJdW5zaWduZWQgc2hvcnQgbGVuID0gc2tiLT5sZW47CisJCXN0cnVjdCBldGhoZHIgKmV0aDsKKworCQlza2ItPm1hYy5yYXcgPSBza2JfcHVzaChza2IsIHNpemVvZigqZXRoKSk7CisJCWV0aCA9IGV0aF9oZHIoc2tiKTsKKwkJZXRoLT5oX3Byb3RvID0gaHRvbnMobGVuKTsKKwkJbWVtY3B5KGV0aC0+aF9kZXN0LCBkYSwgRVRIX0FMRU4pOworCQltZW1jcHkoZXRoLT5oX3NvdXJjZSwgc2EsIEVUSF9BTEVOKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImRldmljZSB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICVkXG4iLAorCQkgICAgICAgc2tiLT5kZXYtPnR5cGUpOworCQlyYyA9IC1FSU5WQUw7CisJfQorCXJldHVybiByYzsKK30KKworLyoqCisgKglsbGNfYnVpbGRfYW5kX3NlbmRfdWlfcGt0IC0gdW5pdGRhdGEgcmVxdWVzdCBpbnRlcmZhY2UgZm9yIHVwcGVyIGxheWVycworICoJQHNhcDogc2FwIHRvIHVzZQorICoJQHNrYjogcGFja2V0IHRvIHNlbmQKKyAqCUBkbWFjOiBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcworICoJQGRzYXA6IGRlc3RpbmF0aW9uIHNhcAorICoKKyAqCVVwcGVyIGxheWVycyBjYWxscyB0aGlzIGZ1bmN0aW9uIHdoZW4gdXBwZXIgbGF5ZXIgd2FudHMgdG8gc2VuZCBkYXRhCisgKgl1c2luZyBjb25uZWN0aW9uLWxlc3MgbW9kZSBjb21tdW5pY2F0aW9uIChVSSBwZHUpLgorICoKKyAqCUFjY2VwdCBkYXRhIGZyYW1lIGZyb20gbmV0d29yayBsYXllciB0byBiZSBzZW50IHVzaW5nIGNvbm5lY3Rpb24tCisgKglsZXNzIG1vZGUgY29tbXVuaWNhdGlvbjsgdGltZW91dC9yZXRyaWVzIGhhbmRsZWQgYnkgbmV0d29yayBsYXllcjsKKyAqCXBhY2thZ2UgcHJpbWl0aXZlIGFzIGFuIGV2ZW50IGFuZCBzZW5kIHRvIFNBUCBldmVudCBoYW5kbGVyCisgKi8KK2ludCBsbGNfYnVpbGRfYW5kX3NlbmRfdWlfcGt0KHN0cnVjdCBsbGNfc2FwICpzYXAsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICB1bnNpZ25lZCBjaGFyICpkbWFjLCB1bnNpZ25lZCBjaGFyIGRzYXApCit7CisJaW50IHJjOworCWxsY19wZHVfaGVhZGVyX2luaXQoc2tiLCBMTENfUERVX1RZUEVfVSwgc2FwLT5sYWRkci5sc2FwLAorCQkJICAgIGRzYXAsIExMQ19QRFVfQ01EKTsKKwlsbGNfcGR1X2luaXRfYXNfdWlfY21kKHNrYik7CisJcmMgPSBsbGNfbWFjX2hkcl9pbml0KHNrYiwgc2tiLT5kZXYtPmRldl9hZGRyLCBkbWFjKTsKKwlpZiAoIXJjKQorCQlyYyA9IGRldl9xdWV1ZV94bWl0KHNrYik7CisJcmV0dXJuIHJjOworfQorCitFWFBPUlRfU1lNQk9MKGxsY19tYWNfaGRyX2luaXQpOworRVhQT1JUX1NZTUJPTChsbGNfYnVpbGRfYW5kX3NlbmRfdWlfcGt0KTsKZGlmZiAtLWdpdCBhL25ldC9sbGMvbGxjX291dHB1dC5oIGIvbmV0L2xsYy9sbGNfb3V0cHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5ZWRmNwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9sbGMvbGxjX291dHB1dC5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgTExDX09VVFBVVF9ICisjZGVmaW5lIExMQ19PVVRQVVRfSAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NyBieSBQcm9jb20gVGVjaG5vbG9neSwgSW5jLgorICogCQkgMjAwMS0yMDAzIGJ5IEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBjYW4gYmUgcmVkaXN0cmlidXRlZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9yIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4KKyAqCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKK3N0cnVjdCBza19idWZmOworCitpbnQgbGxjX21hY19oZHJfaW5pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBjaGFyICpzYSwgdW5zaWduZWQgY2hhciAqZGEpOworCisjZW5kaWYgLyogTExDX09VVFBVVF9IICovCmRpZmYgLS1naXQgYS9uZXQvbGxjL2xsY19wZHUuYyBiL25ldC9sbGMvbGxjX3BkdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOGNlNTIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbGxjL2xsY19wZHUuYwpAQCAtMCwwICsxLDM3MiBAQAorLyoKKyAqIGxsY19wZHUuYyAtIGFjY2VzcyB0byBQRFUgaW50ZXJuYWxzCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3IGJ5IFByb2NvbSBUZWNobm9sb2d5LCBJbmMuCisgKgkJIDIwMDEtMjAwMyBieSBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAqCisgKiBUaGlzIHByb2dyYW0gY2FuIGJlIHJlZGlzdHJpYnV0ZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgb3IgaW1wbGllZCB3YXJyYW50eQorICogb2YgbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLgorICoKKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L2xsY19wZHUuaD4KKworc3RhdGljIHZvaWQgbGxjX3BkdV9kZWNvZGVfcGR1X3R5cGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKnR5cGUpOworc3RhdGljIHU4IGxsY19wZHVfZ2V0X3BmX2JpdChzdHJ1Y3QgbGxjX3BkdV9zbiAqcGR1KTsKKwordm9pZCBsbGNfcGR1X3NldF9jbWRfcnNwKHN0cnVjdCBza19idWZmICpza2IsIHU4IHBkdV90eXBlKQoreworCWxsY19wZHVfdW5faGRyKHNrYiktPnNzYXAgfD0gcGR1X3R5cGU7Cit9CisKKy8qKgorICoJcGR1X3NldF9wZl9iaXQgLSBzZXRzIHBvbGwvZmluYWwgYml0IGluIExMQyBoZWFkZXIKKyAqCUBwZHVfZnJhbWU6IGlucHV0IGZyYW1lIHRoYXQgcC9mIGJpdCBtdXN0IGJlIHNldCBpbnRvIGl0LgorICoJQGJpdF92YWx1ZTogcG9sbC9maW5hbCBiaXQgKDAgb3IgMSkuCisgKgorICoJVGhpcyBmdW5jdGlvbiBzZXRzIHBvbGwvZmluYWwgYml0IGluIExMQyBoZWFkZXIgKGJhc2VkIG9uIHR5cGUgb2YgUERVKS4KKyAqCWluIEkgb3IgUyBwZHVzLCBwL2YgYml0IGlzIHJpZ2h0IGJpdCBvZiBmb3VydGggYnl0ZSBpbiBoZWFkZXIuIGluIFUKKyAqCXBkdXMgcC9mIGJpdCBpcyBmaWZ0aCBiaXQgb2YgdGhpcmQgYnl0ZS4KKyAqLwordm9pZCBsbGNfcGR1X3NldF9wZl9iaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggYml0X3ZhbHVlKQoreworCXU4IHBkdV90eXBlOworCXN0cnVjdCBsbGNfcGR1X3NuICpwZHU7CisKKwlsbGNfcGR1X2RlY29kZV9wZHVfdHlwZShza2IsICZwZHVfdHlwZSk7CisJcGR1ID0gbGxjX3BkdV9zbl9oZHIoc2tiKTsKKwkKKwlzd2l0Y2ggKHBkdV90eXBlKSB7CisJY2FzZSBMTENfUERVX1RZUEVfSToKKwljYXNlIExMQ19QRFVfVFlQRV9TOgorCQlwZHUtPmN0cmxfMiA9IChwZHUtPmN0cmxfMiAmIDB4RkUpIHwgYml0X3ZhbHVlOworCQlicmVhazsKKwljYXNlIExMQ19QRFVfVFlQRV9VOgorCQlwZHUtPmN0cmxfMSB8PSAocGR1LT5jdHJsXzEgJiAweEVGKSB8IChiaXRfdmFsdWUgPDwgNCk7CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKglsbGNfcGR1X2RlY29kZV9wZl9iaXQgLSBleHRyYWNzIHBvbGwvZmluYWwgYml0IGZyb20gTExDIGhlYWRlcgorICoJQHNrYjogaW5wdXQgc2tiIHRoYXQgcC9mIGJpdCBtdXN0IGJlIGV4dHJhY3RlZCBmcm9tIGl0CisgKglAcGZfYml0OiBwb2xsL2ZpbmFsIGJpdCAoMCBvciAxKQorICoKKyAqCVRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgcG9sbC9maW5hbCBiaXQgZnJvbSBMTEMgaGVhZGVyIChiYXNlZCBvbiB0eXBlIG9mCisgKglQRFUpLiBJbiBJIG9yIFMgcGR1cywgcC9mIGJpdCBpcyByaWdodCBiaXQgb2YgZm91cnRoIGJ5dGUgaW4gaGVhZGVyLiBJbgorICoJVSBwZHVzIHAvZiBiaXQgaXMgZmlmdGggYml0IG9mIHRoaXJkIGJ5dGUuCisgKi8KK3ZvaWQgbGxjX3BkdV9kZWNvZGVfcGZfYml0KHN0cnVjdCBza19idWZmICpza2IsIHU4ICpwZl9iaXQpCit7CisJdTggcGR1X3R5cGU7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdTsKKworCWxsY19wZHVfZGVjb2RlX3BkdV90eXBlKHNrYiwgJnBkdV90eXBlKTsKKwlwZHUgPSBsbGNfcGR1X3NuX2hkcihza2IpOworCisJc3dpdGNoIChwZHVfdHlwZSkgeworCWNhc2UgTExDX1BEVV9UWVBFX0k6CisJY2FzZSBMTENfUERVX1RZUEVfUzoKKwkJKnBmX2JpdCA9IHBkdS0+Y3RybF8yICYgTExDX1NfUEZfQklUX01BU0s7CisJCWJyZWFrOworCWNhc2UgTExDX1BEVV9UWVBFX1U6CisJCSpwZl9iaXQgPSAocGR1LT5jdHJsXzEgJiBMTENfVV9QRl9CSVRfTUFTSykgPj4gNDsKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqCWxsY19wZHVfaW5pdF9hc19kaXNjX2NtZCAtIEJ1aWxkcyBESVNDIFBEVQorICoJQHNrYjogQWRkcmVzcyBvZiB0aGUgc2tiIHRvIGJ1aWxkCisgKglAcF9iaXQ6IFRoZSBQIGJpdCB0byBzZXQgaW4gdGhlIFBEVQorICoKKyAqCUJ1aWxkcyBhIHBkdSBmcmFtZSBhcyBhIERJU0MgY29tbWFuZC4KKyAqLwordm9pZCBsbGNfcGR1X2luaXRfYXNfZGlzY19jbWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggcF9iaXQpCit7CisJc3RydWN0IGxsY19wZHVfdW4gKnBkdSA9IGxsY19wZHVfdW5faGRyKHNrYik7CisKKwlwZHUtPmN0cmxfMSAgPSBMTENfUERVX1RZUEVfVTsKKwlwZHUtPmN0cmxfMSB8PSBMTENfMl9QRFVfQ01EX0RJU0M7CisJcGR1LT5jdHJsXzEgfD0gKChwX2JpdCAmIDEpIDw8IDQpICYgTExDX1VfUEZfQklUX01BU0s7Cit9CisKKy8qKgorICoJbGxjX3BkdV9pbml0X2FzX2lfY21kIC0gYnVpbGRzIEkgcGR1CisgKglAc2tiOiBBZGRyZXNzIG9mIHRoZSBza2IgdG8gYnVpbGQKKyAqCUBwX2JpdDogVGhlIFAgYml0IHRvIHNldCBpbiB0aGUgUERVCisgKglAbnM6IFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGRhdGEgUERVCisgKglAbnI6IFRoZSBzZXEuIG51bWJlciBvZiB0aGUgZXhwZWN0ZWQgSSBQRFUgZnJvbSB0aGUgcmVtb3RlCisgKgorICoJQnVpbGRzIGEgcGR1IGZyYW1lIGFzIGFuIEkgY29tbWFuZC4KKyAqLwordm9pZCBsbGNfcGR1X2luaXRfYXNfaV9jbWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggcF9iaXQsIHU4IG5zLCB1OCBucikKK3sKKwlzdHJ1Y3QgbGxjX3BkdV9zbiAqcGR1ID0gbGxjX3BkdV9zbl9oZHIoc2tiKTsKKworCXBkdS0+Y3RybF8xICA9IExMQ19QRFVfVFlQRV9JOworCXBkdS0+Y3RybF8yICA9IDA7CisJcGR1LT5jdHJsXzIgfD0gKHBfYml0ICYgTExDX0lfUEZfQklUX01BU0spOyAvKiBwL2YgYml0ICovCisJcGR1LT5jdHJsXzEgfD0gKG5zIDw8IDEpICYgMHhGRTsgICAvKiBzZXQgTihTKSBpbiBiaXRzIDIuLjggKi8KKwlwZHUtPmN0cmxfMiB8PSAobnIgPDwgMSkgJiAweEZFOyAgIC8qIHNldCBOKFIpIGluIGJpdHMgMTAuLjE2ICovCit9CisKKy8qKgorICoJbGxjX3BkdV9pbml0X2FzX3Jlal9jbWQgLSBidWlsZHMgUkVKIFBEVQorICoJQHNrYjogQWRkcmVzcyBvZiB0aGUgc2tiIHRvIGJ1aWxkCisgKglAcF9iaXQ6IFRoZSBQIGJpdCB0byBzZXQgaW4gdGhlIFBEVQorICoJQG5yOiBUaGUgc2VxLiBudW1iZXIgb2YgdGhlIGV4cGVjdGVkIEkgUERVIGZyb20gdGhlIHJlbW90ZQorICoKKyAqCUJ1aWxkcyBhIHBkdSBmcmFtZSBhcyBhIFJFSiBjb21tYW5kLgorICovCit2b2lkIGxsY19wZHVfaW5pdF9hc19yZWpfY21kKHN0cnVjdCBza19idWZmICpza2IsIHU4IHBfYml0LCB1OCBucikKK3sKKwlzdHJ1Y3QgbGxjX3BkdV9zbiAqcGR1ID0gbGxjX3BkdV9zbl9oZHIoc2tiKTsKKworCXBkdS0+Y3RybF8xICA9IExMQ19QRFVfVFlQRV9TOworCXBkdS0+Y3RybF8xIHw9IExMQ18yX1BEVV9DTURfUkVKOworCXBkdS0+Y3RybF8yICA9IDA7CisJcGR1LT5jdHJsXzIgfD0gcF9iaXQgJiBMTENfU19QRl9CSVRfTUFTSzsKKwlwZHUtPmN0cmxfMSAmPSAweDBGOyAgICAvKiBzZXR0aW5nIGJpdHMgNS4uOCB0byB6ZXJvKHJlc2VydmVkKSAqLworCXBkdS0+Y3RybF8yIHw9IChuciA8PCAxKSAmIDB4RkU7IC8qIHNldCBOKFIpIGluIGJpdHMgMTAuLjE2ICovCit9CisKKy8qKgorICoJbGxjX3BkdV9pbml0X2FzX3Jucl9jbWQgLSBidWlsZHMgUk5SIHBkdQorICoJQHNrYjogQWRkcmVzcyBvZiB0aGUgc2tiIHRvIGJ1aWxkCisgKglAcF9iaXQ6IFRoZSBQIGJpdCB0byBzZXQgaW4gdGhlIFBEVQorICoJQG5yOiBUaGUgc2VxLiBudW1iZXIgb2YgdGhlIGV4cGVjdGVkIEkgUERVIGZyb20gdGhlIHJlbW90ZQorICoKKyAqCUJ1aWxkcyBhIHBkdSBmcmFtZSBhcyBhbiBSTlIgY29tbWFuZC4KKyAqLwordm9pZCBsbGNfcGR1X2luaXRfYXNfcm5yX2NtZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCBwX2JpdCwgdTggbnIpCit7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisKKwlwZHUtPmN0cmxfMSAgPSBMTENfUERVX1RZUEVfUzsKKwlwZHUtPmN0cmxfMSB8PSBMTENfMl9QRFVfQ01EX1JOUjsKKwlwZHUtPmN0cmxfMiAgPSAwOworCXBkdS0+Y3RybF8yIHw9IHBfYml0ICYgTExDX1NfUEZfQklUX01BU0s7CisJcGR1LT5jdHJsXzEgJj0gMHgwRjsgICAgLyogc2V0dGluZyBiaXRzIDUuLjggdG8gemVybyhyZXNlcnZlZCkgKi8KKwlwZHUtPmN0cmxfMiB8PSAobnIgPDwgMSkgJiAweEZFOyAvKiBzZXQgTihSKSBpbiBiaXRzIDEwLi4xNiAqLworfQorCisvKioKKyAqCWxsY19wZHVfaW5pdF9hc19ycl9jbWQgLSBCdWlsZHMgUlIgcGR1CisgKglAc2tiOiBBZGRyZXNzIG9mIHRoZSBza2IgdG8gYnVpbGQKKyAqCUBwX2JpdDogVGhlIFAgYml0IHRvIHNldCBpbiB0aGUgUERVCisgKglAbnI6IFRoZSBzZXEuIG51bWJlciBvZiB0aGUgZXhwZWN0ZWQgSSBQRFUgZnJvbSB0aGUgcmVtb3RlCisgKgorICoJQnVpbGRzIGEgcGR1IGZyYW1lIGFzIGFuIFJSIGNvbW1hbmQuCisgKi8KK3ZvaWQgbGxjX3BkdV9pbml0X2FzX3JyX2NtZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCBwX2JpdCwgdTggbnIpCit7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisKKwlwZHUtPmN0cmxfMSAgPSBMTENfUERVX1RZUEVfUzsKKwlwZHUtPmN0cmxfMSB8PSBMTENfMl9QRFVfQ01EX1JSOworCXBkdS0+Y3RybF8yICA9IHBfYml0ICYgTExDX1NfUEZfQklUX01BU0s7CisJcGR1LT5jdHJsXzEgJj0gMHgwRjsgICAgLyogc2V0dGluZyBiaXRzIDUuLjggdG8gemVybyhyZXNlcnZlZCkgKi8KKwlwZHUtPmN0cmxfMiB8PSAobnIgPDwgMSkgJiAweEZFOyAvKiBzZXQgTihSKSBpbiBiaXRzIDEwLi4xNiAqLworfQorCisvKioKKyAqCWxsY19wZHVfaW5pdF9hc19zYWJtZV9jbWQgLSBidWlsZHMgU0FCTUUgcGR1CisgKglAc2tiOiBBZGRyZXNzIG9mIHRoZSBza2IgdG8gYnVpbGQKKyAqCUBwX2JpdDogVGhlIFAgYml0IHRvIHNldCBpbiB0aGUgUERVCisgKgorICoJQnVpbGRzIGEgcGR1IGZyYW1lIGFzIGFuIFNBQk1FIGNvbW1hbmQuCisgKi8KK3ZvaWQgbGxjX3BkdV9pbml0X2FzX3NhYm1lX2NtZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCBwX2JpdCkKK3sKKwlzdHJ1Y3QgbGxjX3BkdV91biAqcGR1ID0gbGxjX3BkdV91bl9oZHIoc2tiKTsKKworCXBkdS0+Y3RybF8xICA9IExMQ19QRFVfVFlQRV9VOworCXBkdS0+Y3RybF8xIHw9IExMQ18yX1BEVV9DTURfU0FCTUU7CisJcGR1LT5jdHJsXzEgfD0gKChwX2JpdCAmIDEpIDw8IDQpICYgTExDX1VfUEZfQklUX01BU0s7Cit9CisKKy8qKgorICoJbGxjX3BkdV9pbml0X2FzX2RtX3JzcCAtIGJ1aWxkcyBETSByZXNwb25zZSBwZHUKKyAqCUBza2I6IEFkZHJlc3Mgb2YgdGhlIHNrYiB0byBidWlsZAorICoJQGZfYml0OiBUaGUgRiBiaXQgdG8gc2V0IGluIHRoZSBQRFUKKyAqCisgKglCdWlsZHMgYSBwZHUgZnJhbWUgYXMgYSBETSByZXNwb25zZS4KKyAqLwordm9pZCBsbGNfcGR1X2luaXRfYXNfZG1fcnNwKHN0cnVjdCBza19idWZmICpza2IsIHU4IGZfYml0KQoreworCXN0cnVjdCBsbGNfcGR1X3VuICpwZHUgPSBsbGNfcGR1X3VuX2hkcihza2IpOworCisJcGR1LT5jdHJsXzEgID0gTExDX1BEVV9UWVBFX1U7CisJcGR1LT5jdHJsXzEgfD0gTExDXzJfUERVX1JTUF9ETTsKKwlwZHUtPmN0cmxfMSB8PSAoKGZfYml0ICYgMSkgPDwgNCkgJiBMTENfVV9QRl9CSVRfTUFTSzsKK30KKworLyoqCisgKglsbGNfcGR1X2luaXRfYXNfZnJtcl9yc3AgLSBidWlsZHMgRlJNUiByZXNwb25zZSBQRFUKKyAqCUBza2I6IEFkZHJlc3Mgb2YgdGhlIGZyYW1lIHRvIGJ1aWxkCisgKglAcHJldl9wZHU6IFRoZSByZWplY3RlZCBQRFUgZnJhbWUKKyAqCUBmX2JpdDogVGhlIEYgYml0IHRvIHNldCBpbiB0aGUgUERVCisgKglAdnM6IHR4IHN0YXRlIHZhcmkgdmFsdWUgZm9yIHRoZSBkYXRhIGxpbmsgY29ubiBhdCB0aGUgcmVqZWN0aW5nIExMQworICoJQHZyOiByeCBzdGF0ZSB2YXIgdmFsdWUgZm9yIHRoZSBkYXRhIGxpbmsgY29ubiBhdCB0aGUgcmVqZWN0aW5nIExMQworICoJQHZ6eXh3OiBjb21wbGV0ZWx5IGRlc2NyaWJlZCBpbiB0aGUgSUVFRSBTdGQgODAyLjIgZG9jdW1lbnQgKFBnIDU1KQorICoKKyAqCUJ1aWxkcyBhIHBkdSBmcmFtZSBhcyBhIEZSTVIgcmVzcG9uc2UuCisgKi8KK3ZvaWQgbGxjX3BkdV9pbml0X2FzX2ZybXJfcnNwKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBsbGNfcGR1X3NuICpwcmV2X3BkdSwKKwkJCSAgICAgIHU4IGZfYml0LCB1OCB2cywgdTggdnIsIHU4IHZ6eXh3KQoreworCXN0cnVjdCBsbGNfZnJtcl9pbmZvICpmcm1yX2luZm87CisJdTggcHJldl9wZiA9IDA7CisJdTggKmN0cmw7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisKKwlwZHUtPmN0cmxfMSAgPSBMTENfUERVX1RZUEVfVTsKKwlwZHUtPmN0cmxfMSB8PSBMTENfMl9QRFVfUlNQX0ZSTVI7CisJcGR1LT5jdHJsXzEgfD0gKChmX2JpdCAmIDEpIDw8IDQpICYgTExDX1VfUEZfQklUX01BU0s7CisKKwlmcm1yX2luZm8gPSAoc3RydWN0IGxsY19mcm1yX2luZm8gKikmcGR1LT5jdHJsXzI7CisJY3RybCA9ICh1OCAqKSZwcmV2X3BkdS0+Y3RybF8xOworCUZSTVJfSU5GT19TRVRfUkVKX0NOVFJMKGZybXJfaW5mbyxjdHJsKTsKKwlGUk1SX0lORk9fU0VUX1ZzKGZybXJfaW5mbywgdnMpOworCUZSTVJfSU5GT19TRVRfVnIoZnJtcl9pbmZvLCB2cik7CisJcHJldl9wZiA9IGxsY19wZHVfZ2V0X3BmX2JpdChwcmV2X3BkdSk7CisJRlJNUl9JTkZPX1NFVF9DX1JfQklUKGZybXJfaW5mbywgcHJldl9wZik7CisJRlJNUl9JTkZPX1NFVF9JTlZBTElEX1BEVV9DVFJMX0lORChmcm1yX2luZm8sIHZ6eXh3KTsKKwlGUk1SX0lORk9fU0VUX0lOVkFMSURfUERVX0lORk9fSU5EKGZybXJfaW5mbywgdnp5eHcpOworCUZSTVJfSU5GT19TRVRfUERVX0lORk9fMkxPTkdfSU5EKGZybXJfaW5mbywgdnp5eHcpOworCUZSTVJfSU5GT19TRVRfUERVX0lOVkFMSURfTnJfSU5EKGZybXJfaW5mbywgdnp5eHcpOworCUZSTVJfSU5GT19TRVRfUERVX0lOVkFMSURfTnNfSU5EKGZybXJfaW5mbywgdnp5eHcpOworCXNrYl9wdXQoc2tiLCA1KTsKK30KKworLyoqCisgKglsbGNfcGR1X2luaXRfYXNfcnJfcnNwIC0gYnVpbGRzIFJSIHJlc3BvbnNlIHBkdQorICoJQHNrYjogQWRkcmVzcyBvZiB0aGUgc2tiIHRvIGJ1aWxkCisgKglAZl9iaXQ6IFRoZSBGIGJpdCB0byBzZXQgaW4gdGhlIFBEVQorICoJQG5yOiBUaGUgc2VxLiBudW1iZXIgb2YgdGhlIGV4cGVjdGVkIGRhdGEgUERVIGZyb20gdGhlIHJlbW90ZQorICoKKyAqCUJ1aWxkcyBhIHBkdSBmcmFtZSBhcyBhbiBSUiByZXNwb25zZS4KKyAqLwordm9pZCBsbGNfcGR1X2luaXRfYXNfcnJfcnNwKHN0cnVjdCBza19idWZmICpza2IsIHU4IGZfYml0LCB1OCBucikKK3sKKwlzdHJ1Y3QgbGxjX3BkdV9zbiAqcGR1ID0gbGxjX3BkdV9zbl9oZHIoc2tiKTsKKworCXBkdS0+Y3RybF8xICA9IExMQ19QRFVfVFlQRV9TOworCXBkdS0+Y3RybF8xIHw9IExMQ18yX1BEVV9SU1BfUlI7CisJcGR1LT5jdHJsXzIgID0gMDsKKwlwZHUtPmN0cmxfMiB8PSBmX2JpdCAmIExMQ19TX1BGX0JJVF9NQVNLOworCXBkdS0+Y3RybF8xICY9IDB4MEY7ICAgIC8qIHNldHRpbmcgYml0cyA1Li44IHRvIHplcm8ocmVzZXJ2ZWQpICovCisJcGR1LT5jdHJsXzIgfD0gKG5yIDw8IDEpICYgMHhGRTsgIC8qIHNldCBOKFIpIGluIGJpdHMgMTAuLjE2ICovCit9CisKKy8qKgorICoJbGxjX3BkdV9pbml0X2FzX3Jlal9yc3AgLSBidWlsZHMgUkVKIHJlc3BvbnNlIHBkdQorICoJQHNrYjogQWRkcmVzcyBvZiB0aGUgc2tiIHRvIGJ1aWxkCisgKglAZl9iaXQ6IFRoZSBGIGJpdCB0byBzZXQgaW4gdGhlIFBEVQorICoJQG5yOiBUaGUgc2VxLiBudW1iZXIgb2YgdGhlIGV4cGVjdGVkIGRhdGEgUERVIGZyb20gdGhlIHJlbW90ZQorICoKKyAqCUJ1aWxkcyBhIHBkdSBmcmFtZSBhcyBhIFJFSiByZXNwb25zZS4KKyAqLwordm9pZCBsbGNfcGR1X2luaXRfYXNfcmVqX3JzcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCBmX2JpdCwgdTggbnIpCit7CisJc3RydWN0IGxsY19wZHVfc24gKnBkdSA9IGxsY19wZHVfc25faGRyKHNrYik7CisKKwlwZHUtPmN0cmxfMSAgPSBMTENfUERVX1RZUEVfUzsKKwlwZHUtPmN0cmxfMSB8PSBMTENfMl9QRFVfUlNQX1JFSjsKKwlwZHUtPmN0cmxfMiAgPSAwOworCXBkdS0+Y3RybF8yIHw9IGZfYml0ICYgTExDX1NfUEZfQklUX01BU0s7CisJcGR1LT5jdHJsXzEgJj0gMHgwRjsgICAgLyogc2V0dGluZyBiaXRzIDUuLjggdG8gemVybyhyZXNlcnZlZCkgKi8KKwlwZHUtPmN0cmxfMiB8PSAobnIgPDwgMSkgJiAweEZFOyAgLyogc2V0IE4oUikgaW4gYml0cyAxMC4uMTYgKi8KK30KKworLyoqCisgKglsbGNfcGR1X2luaXRfYXNfcm5yX3JzcCAtIGJ1aWxkcyBSTlIgcmVzcG9uc2UgcGR1CisgKglAc2tiOiBBZGRyZXNzIG9mIHRoZSBmcmFtZSB0byBidWlsZAorICoJQGZfYml0OiBUaGUgRiBiaXQgdG8gc2V0IGluIHRoZSBQRFUKKyAqCUBucjogVGhlIHNlcS4gbnVtYmVyIG9mIHRoZSBleHBlY3RlZCBkYXRhIFBEVSBmcm9tIHRoZSByZW1vdGUKKyAqCisgKglCdWlsZHMgYSBwZHUgZnJhbWUgYXMgYW4gUk5SIHJlc3BvbnNlLgorICovCit2b2lkIGxsY19wZHVfaW5pdF9hc19ybnJfcnNwKHN0cnVjdCBza19idWZmICpza2IsIHU4IGZfYml0LCB1OCBucikKK3sKKwlzdHJ1Y3QgbGxjX3BkdV9zbiAqcGR1ID0gbGxjX3BkdV9zbl9oZHIoc2tiKTsKKworCXBkdS0+Y3RybF8xICA9IExMQ19QRFVfVFlQRV9TOworCXBkdS0+Y3RybF8xIHw9IExMQ18yX1BEVV9SU1BfUk5SOworCXBkdS0+Y3RybF8yICA9IDA7CisJcGR1LT5jdHJsXzIgfD0gZl9iaXQgJiBMTENfU19QRl9CSVRfTUFTSzsKKwlwZHUtPmN0cmxfMSAmPSAweDBGOyAgICAvKiBzZXR0aW5nIGJpdHMgNS4uOCB0byB6ZXJvKHJlc2VydmVkKSAqLworCXBkdS0+Y3RybF8yIHw9IChuciA8PCAxKSAmIDB4RkU7ICAvKiBzZXQgTihSKSBpbiBiaXRzIDEwLi4xNiAqLworfQorCisvKioKKyAqCWxsY19wZHVfaW5pdF9hc191YV9yc3AgLSBidWlsZHMgVUEgcmVzcG9uc2UgcGR1CisgKglAc2tiOiBBZGRyZXNzIG9mIHRoZSBmcmFtZSB0byBidWlsZAorICoJQGZfYml0OiBUaGUgRiBiaXQgdG8gc2V0IGluIHRoZSBQRFUKKyAqCisgKglCdWlsZHMgYSBwZHUgZnJhbWUgYXMgYSBVQSByZXNwb25zZS4KKyAqLwordm9pZCBsbGNfcGR1X2luaXRfYXNfdWFfcnNwKHN0cnVjdCBza19idWZmICpza2IsIHU4IGZfYml0KQoreworCXN0cnVjdCBsbGNfcGR1X3VuICpwZHUgPSBsbGNfcGR1X3VuX2hkcihza2IpOworCisJcGR1LT5jdHJsXzEgID0gTExDX1BEVV9UWVBFX1U7CisJcGR1LT5jdHJsXzEgfD0gTExDXzJfUERVX1JTUF9VQTsKKwlwZHUtPmN0cmxfMSB8PSAoKGZfYml0ICYgMSkgPDwgNCkgJiBMTENfVV9QRl9CSVRfTUFTSzsKK30KKworLyoqCisgKglsbGNfcGR1X2RlY29kZV9wZHVfdHlwZSAtIGRlc2lnbmF0ZXMgUERVIHR5cGUKKyAqCUBza2I6IGlucHV0IHNrYiB0aGF0IHR5cGUgb2YgaXQgbXVzdCBiZSBkZXNpZ25hdGVkLgorICoJQHR5cGU6IHR5cGUgb2YgUERVIChvdXRwdXQgYXJndW1lbnQpLgorICoKKyAqCVRoaXMgZnVuY3Rpb24gZGVzaWduYXRlcyB0eXBlIG9mIFBEVSAoSSwgUyBvciBVKS4KKyAqLworc3RhdGljIHZvaWQgbGxjX3BkdV9kZWNvZGVfcGR1X3R5cGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKnR5cGUpCit7CisJc3RydWN0IGxsY19wZHVfdW4gKnBkdSA9IGxsY19wZHVfdW5faGRyKHNrYik7CisKKwlpZiAocGR1LT5jdHJsXzEgJiAxKSB7CisJCWlmICgocGR1LT5jdHJsXzEgJiBMTENfUERVX1RZUEVfVSkgPT0gTExDX1BEVV9UWVBFX1UpCisJCQkqdHlwZSA9IExMQ19QRFVfVFlQRV9VOworCQllbHNlCisJCQkqdHlwZSA9IExMQ19QRFVfVFlQRV9TOworCX0gZWxzZQorCQkqdHlwZSA9IExMQ19QRFVfVFlQRV9JOworfQorCisvKioKKyAqCWxsY19wZHVfZ2V0X3BmX2JpdCAtIGV4dHJhY3RzIHAvZiBiaXQgb2YgaW5wdXQgUERVCisgKglAcGR1OiBwb2ludGVyIHRvIExMQyBoZWFkZXIuCisgKgorICoJVGhpcyBmdW5jdGlvbiBleHRyYWN0cyBwL2YgYml0IG9mIGlucHV0IFBEVS4gYXQgZmlyc3QgZXhhbWluZXMgdHlwZSBvZgorICoJUERVIGFuZCB0aGVuIGV4dHJhY3RzIHAvZiBiaXQuIFJldHVybnMgdGhlIHAvZiBiaXQuCisgKi8KK3N0YXRpYyB1OCBsbGNfcGR1X2dldF9wZl9iaXQoc3RydWN0IGxsY19wZHVfc24gKnBkdSkKK3sKKwl1OCBwZHVfdHlwZTsKKwl1OCBwZl9iaXQgPSAwOworCisJaWYgKHBkdS0+Y3RybF8xICYgMSkgeworCQlpZiAoKHBkdS0+Y3RybF8xICYgTExDX1BEVV9UWVBFX1UpID09IExMQ19QRFVfVFlQRV9VKQorCQkJcGR1X3R5cGUgPSBMTENfUERVX1RZUEVfVTsKKwkJZWxzZQorCQkJcGR1X3R5cGUgPSBMTENfUERVX1RZUEVfUzsKKwl9IGVsc2UKKwkJcGR1X3R5cGUgPSBMTENfUERVX1RZUEVfSTsKKwlzd2l0Y2ggKHBkdV90eXBlKSB7CisJY2FzZSBMTENfUERVX1RZUEVfSToKKwljYXNlIExMQ19QRFVfVFlQRV9TOgorCQlwZl9iaXQgPSBwZHUtPmN0cmxfMiAmIExMQ19TX1BGX0JJVF9NQVNLOworCQlicmVhazsKKwljYXNlIExMQ19QRFVfVFlQRV9VOgorCQlwZl9iaXQgPSAocGR1LT5jdHJsXzEgJiBMTENfVV9QRl9CSVRfTUFTSykgPj4gNDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBwZl9iaXQ7Cit9CmRpZmYgLS1naXQgYS9uZXQvbGxjL2xsY19wcm9jLmMgYi9uZXQvbGxjL2xsY19wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZlOGRiMwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9sbGMvbGxjX3Byb2MuYwpAQCAtMCwwICsxLDI2NyBAQAorLyoKKyAqIHByb2NfbGxjLmMgLSBwcm9jIGludGVyZmFjZSBmb3IgTExDCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxIGJ5IEpheSBTY2h1bGlzdCA8anNjaGxzdEBzYW1iYS5vcmc+CisgKgkJIDIwMDItMjAwMyBieSBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAqCisgKiBUaGlzIHByb2dyYW0gY2FuIGJlIHJlZGlzdHJpYnV0ZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgb3IgaW1wbGllZCB3YXJyYW50eQorICogb2YgbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLgorICoKKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvbGxjLmg+CisjaW5jbHVkZSA8bmV0L2xsY19jX2FjLmg+CisjaW5jbHVkZSA8bmV0L2xsY19jX2V2Lmg+CisjaW5jbHVkZSA8bmV0L2xsY19jX3N0Lmg+CisjaW5jbHVkZSA8bmV0L2xsY19jb25uLmg+CisKK3N0YXRpYyB2b2lkIGxsY191aV9mb3JtYXRfbWFjKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB1bnNpZ25lZCBjaGFyICptYWMpCit7CisJc2VxX3ByaW50ZihzZXEsICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCIsCisJCSAgIG1hY1swXSwgbWFjWzFdLCBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0pOworfQorCitzdGF0aWMgc3RydWN0IHNvY2sgKmxsY19nZXRfc2tfaWR4KGxvZmZfdCBwb3MpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqc2FwX2VudHJ5OworCXN0cnVjdCBsbGNfc2FwICpzYXA7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJc3RydWN0IHNvY2sgKnNrID0gTlVMTDsKKworCWxpc3RfZm9yX2VhY2goc2FwX2VudHJ5LCAmbGxjX3NhcF9saXN0KSB7CisJCXNhcCA9IGxpc3RfZW50cnkoc2FwX2VudHJ5LCBzdHJ1Y3QgbGxjX3NhcCwgbm9kZSk7CisKKwkJcmVhZF9sb2NrX2JoKCZzYXAtPnNrX2xpc3QubG9jayk7CisJCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmc2FwLT5za19saXN0Lmxpc3QpIHsKKwkJCWlmICghcG9zKQorCQkJCWdvdG8gZm91bmQ7CisJCQktLXBvczsKKwkJfQorCQlyZWFkX3VubG9ja19iaCgmc2FwLT5za19saXN0LmxvY2spOworCX0KKwlzayA9IE5VTEw7Citmb3VuZDoKKwlyZXR1cm4gc2s7Cit9CisKK3N0YXRpYyB2b2lkICpsbGNfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlsb2ZmX3QgbCA9ICpwb3M7CisKKwlyZWFkX2xvY2tfYmgoJmxsY19zYXBfbGlzdF9sb2NrKTsKKwlyZXR1cm4gbCA/IGxsY19nZXRfc2tfaWR4KC0tbCkgOiBTRVFfU1RBUlRfVE9LRU47Cit9CisKK3N0YXRpYyB2b2lkICpsbGNfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBzb2NrKiBzaywgKm5leHQ7CisJc3RydWN0IGxsY19zb2NrICpsbGM7CisJc3RydWN0IGxsY19zYXAgKnNhcDsKKworCSsrKnBvczsKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJc2sgPSBsbGNfZ2V0X3NrX2lkeCgwKTsKKwkJZ290byBvdXQ7CisJfQorCXNrID0gdjsKKwluZXh0ID0gc2tfbmV4dChzayk7CisJaWYgKG5leHQpIHsKKwkJc2sgPSBuZXh0OworCQlnb3RvIG91dDsKKwl9CisJbGxjID0gbGxjX3NrKHNrKTsKKwlzYXAgPSBsbGMtPnNhcDsKKwlyZWFkX3VubG9ja19iaCgmc2FwLT5za19saXN0LmxvY2spOworCXNrID0gTlVMTDsKKwlmb3IgKDs7KSB7CisJCWlmIChzYXAtPm5vZGUubmV4dCA9PSAmbGxjX3NhcF9saXN0KQorCQkJYnJlYWs7CisJCXNhcCA9IGxpc3RfZW50cnkoc2FwLT5ub2RlLm5leHQsIHN0cnVjdCBsbGNfc2FwLCBub2RlKTsKKwkJcmVhZF9sb2NrX2JoKCZzYXAtPnNrX2xpc3QubG9jayk7CisJCWlmICghaGxpc3RfZW1wdHkoJnNhcC0+c2tfbGlzdC5saXN0KSkgeworCQkJc2sgPSBza19oZWFkKCZzYXAtPnNrX2xpc3QubGlzdCk7CisJCQlicmVhazsKKwkJfQorCQlyZWFkX3VubG9ja19iaCgmc2FwLT5za19saXN0LmxvY2spOworCX0KK291dDoKKwlyZXR1cm4gc2s7Cit9CisKK3N0YXRpYyB2b2lkIGxsY19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpZiAodiAmJiB2ICE9IFNFUV9TVEFSVF9UT0tFTikgeworCQlzdHJ1Y3Qgc29jayAqc2sgPSB2OworCQlzdHJ1Y3QgbGxjX3NvY2sgKmxsYyA9IGxsY19zayhzayk7CisJCXN0cnVjdCBsbGNfc2FwICpzYXAgPSBsbGMtPnNhcDsKKworCQlyZWFkX3VubG9ja19iaCgmc2FwLT5za19saXN0LmxvY2spOworCX0KKwlyZWFkX3VubG9ja19iaCgmbGxjX3NhcF9saXN0X2xvY2spOworfQorCitzdGF0aWMgaW50IGxsY19zZXFfc29ja2V0X3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IHNvY2sqIHNrOworCXN0cnVjdCBsbGNfc29jayAqbGxjOworCisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CisJCXNlcV9wdXRzKHNlcSwgIlNLdCBNYyBsb2NhbF9tYWNfc2FwICAgICAgICByZW1vdGVfbWFjX3NhcCAgICIKKwkJCSAgICAgICIgICAgdHhfcXVldWUgcnhfcXVldWUgc3QgdWlkIGxpbmtcbiIpOworCQlnb3RvIG91dDsKKwl9CisJc2sgPSB2OworCWxsYyA9IGxsY19zayhzayk7CisKKwkvKiBGSVhNRTogY2hlY2sgaWYgdGhlIGFkZHJlc3MgaXMgbXVsdGljYXN0ICovCisJc2VxX3ByaW50ZihzZXEsICIlMlggICUyWCAiLCBzay0+c2tfdHlwZSwgMCk7CisKKwlpZiAobGxjLT5kZXYpCisJCWxsY191aV9mb3JtYXRfbWFjKHNlcSwgbGxjLT5kZXYtPmRldl9hZGRyKTsKKwllbHNlCisJCXNlcV9wcmludGYoc2VxLCAiMDA6MDA6MDA6MDA6MDA6MDAiKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkAlMDJYICIsIGxsYy0+c2FwLT5sYWRkci5sc2FwKTsKKwlsbGNfdWlfZm9ybWF0X21hYyhzZXEsIGxsYy0+ZGFkZHIubWFjKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkAlMDJYICU4ZCAlOGQgJTJkICUzZCAlNGRcbiIsIGxsYy0+ZGFkZHIubHNhcCwKKwkJICAgYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKSwKKwkJICAgYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSwKKwkJICAgc2stPnNrX3N0YXRlLAorCQkgICBzay0+c2tfc29ja2V0ID8gU09DS19JTk9ERShzay0+c2tfc29ja2V0KS0+aV91aWQgOiAtMSwKKwkJICAgbGxjLT5saW5rKTsKK291dDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNoYXIgKmxsY19jb25uX3N0YXRlX25hbWVzW10gPSB7CisJW0xMQ19DT05OX1NUQVRFX0FETV0gPSAgICAgICAgImFkbSIsIAorCVtMTENfQ09OTl9TVEFURV9TRVRVUF0gPSAgICAgICJzZXR1cCIsIAorCVtMTENfQ09OTl9TVEFURV9OT1JNQUxdID0gICAgICJub3JtYWwiLAorCVtMTENfQ09OTl9TVEFURV9CVVNZXSA9ICAgICAgICJidXN5IiwgCisJW0xMQ19DT05OX1NUQVRFX1JFSl0gPSAgICAgICAgInJlaiIsIAorCVtMTENfQ09OTl9TVEFURV9BV0FJVF0gPSAgICAgICJhd2FpdCIsIAorCVtMTENfQ09OTl9TVEFURV9BV0FJVF9CVVNZXSA9ICJhd2FpdF9idXN5IiwKKwlbTExDX0NPTk5fU1RBVEVfQVdBSVRfUkVKXSA9ICAiYXdhaXRfcmVqIiwKKwlbTExDX0NPTk5fU1RBVEVfRF9DT05OXQk9ICAgICAiZF9jb25uIiwKKwlbTExDX0NPTk5fU1RBVEVfUkVTRVRdID0gICAgICAicmVzZXQiLCAKKwlbTExDX0NPTk5fU1RBVEVfRVJST1JdID0gICAgICAiZXJyb3IiLCAKKwlbTExDX0NPTk5fU1RBVEVfVEVNUF0gPSAgICAgICAidGVtcCIsIAorfTsKKworc3RhdGljIGludCBsbGNfc2VxX2NvcmVfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3Qgc29jayogc2s7CisJc3RydWN0IGxsY19zb2NrICpsbGM7CisKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJc2VxX3B1dHMoc2VxLCAiQ29ubmVjdGlvbiBsaXN0OlxuIgorCQkJICAgICAgImRzYXAgc3RhdGUgICAgICByZXRyIHR4dyByeHcgcGYgZmYgc2YgZGYgcnMgY3MgIgorCQkJICAgICAgInRhY2sgdHBmYyB0cnMgdGJzIGJsb2cgYnVzclxuIik7CisJCWdvdG8gb3V0OworCX0KKwlzayA9IHY7CisJbGxjID0gbGxjX3NrKHNrKTsKKworCXNlcV9wcmludGYoc2VxLCAiICUwMlggICUtMTBzICUzZCAgJTNkICUzZCAlMmQgJTJkICUyZCAlMmQgJTJkICUyZCAiCisJCQkiJTRkICU0ZCAlM2QgJTNkICU0ZCAlNGRcbiIsCisJCSAgIGxsYy0+ZGFkZHIubHNhcCwgbGxjX2Nvbm5fc3RhdGVfbmFtZXNbbGxjLT5zdGF0ZV0sCisJCSAgIGxsYy0+cmV0cnlfY291bnQsIGxsYy0+aywgbGxjLT5ydywgbGxjLT5wX2ZsYWcsIGxsYy0+Zl9mbGFnLAorCQkgICBsbGMtPnNfZmxhZywgbGxjLT5kYXRhX2ZsYWcsIGxsYy0+cmVtb3RlX2J1c3lfZmxhZywKKwkJICAgbGxjLT5jYXVzZV9mbGFnLCB0aW1lcl9wZW5kaW5nKCZsbGMtPmFja190aW1lci50aW1lciksCisJCSAgIHRpbWVyX3BlbmRpbmcoJmxsYy0+cGZfY3ljbGVfdGltZXIudGltZXIpLAorCQkgICB0aW1lcl9wZW5kaW5nKCZsbGMtPnJlal9zZW50X3RpbWVyLnRpbWVyKSwKKwkJICAgdGltZXJfcGVuZGluZygmbGxjLT5idXN5X3N0YXRlX3RpbWVyLnRpbWVyKSwKKwkJICAgISFzay0+c2tfYmFja2xvZy50YWlsLCAhIXNvY2tfb3duZWRfYnlfdXNlcihzaykpOworb3V0OgorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGxsY19zZXFfc29ja2V0X29wcyA9IHsKKwkuc3RhcnQgID0gbGxjX3NlcV9zdGFydCwKKwkubmV4dCAgID0gbGxjX3NlcV9uZXh0LAorCS5zdG9wICAgPSBsbGNfc2VxX3N0b3AsCisJLnNob3cgICA9IGxsY19zZXFfc29ja2V0X3Nob3csCit9OworCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGxsY19zZXFfY29yZV9vcHMgPSB7CisJLnN0YXJ0ICA9IGxsY19zZXFfc3RhcnQsCisJLm5leHQgICA9IGxsY19zZXFfbmV4dCwKKwkuc3RvcCAgID0gbGxjX3NlcV9zdG9wLAorCS5zaG93ICAgPSBsbGNfc2VxX2NvcmVfc2hvdywKK307CisKK3N0YXRpYyBpbnQgbGxjX3NlcV9zb2NrZXRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmxsY19zZXFfc29ja2V0X29wcyk7Cit9CisKK3N0YXRpYyBpbnQgbGxjX3NlcV9jb3JlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZsbGNfc2VxX2NvcmVfb3BzKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbGxjX3NlcV9zb2NrZXRfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gbGxjX3NlcV9zb2NrZXRfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbGxjX3NlcV9jb3JlX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IGxsY19zZXFfY29yZV9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpsbGNfcHJvY19kaXI7CisKK2ludCBfX2luaXQgbGxjX3Byb2NfaW5pdCh2b2lkKQoreworCWludCByYyA9IC1FTk9NRU07CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwOworCisJbGxjX3Byb2NfZGlyID0gcHJvY19ta2RpcigibGxjIiwgcHJvY19uZXQpOworCWlmICghbGxjX3Byb2NfZGlyKQorCQlnb3RvIG91dDsKKwlsbGNfcHJvY19kaXItPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwlwID0gY3JlYXRlX3Byb2NfZW50cnkoInNvY2tldCIsIFNfSVJVR08sIGxsY19wcm9jX2Rpcik7CisJaWYgKCFwKQorCQlnb3RvIG91dF9zb2NrZXQ7CisKKwlwLT5wcm9jX2ZvcHMgPSAmbGxjX3NlcV9zb2NrZXRfZm9wczsKKworCXAgPSBjcmVhdGVfcHJvY19lbnRyeSgiY29yZSIsIFNfSVJVR08sIGxsY19wcm9jX2Rpcik7CisJaWYgKCFwKQorCQlnb3RvIG91dF9jb3JlOworCisJcC0+cHJvY19mb3BzID0gJmxsY19zZXFfY29yZV9mb3BzOworCisJcmMgPSAwOworb3V0OgorCXJldHVybiByYzsKK291dF9jb3JlOgorCXJlbW92ZV9wcm9jX2VudHJ5KCJzb2NrZXQiLCBsbGNfcHJvY19kaXIpOworb3V0X3NvY2tldDoKKwlyZW1vdmVfcHJvY19lbnRyeSgibGxjIiwgcHJvY19uZXQpOworCWdvdG8gb3V0OworfQorCit2b2lkIGxsY19wcm9jX2V4aXQodm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeSgic29ja2V0IiwgbGxjX3Byb2NfZGlyKTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiY29yZSIsIGxsY19wcm9jX2Rpcik7CisJcmVtb3ZlX3Byb2NfZW50cnkoImxsYyIsIHByb2NfbmV0KTsKK30KZGlmZiAtLWdpdCBhL25ldC9sbGMvbGxjX3NfYWMuYyBiL25ldC9sbGMvbGxjX3NfYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDhiYTdkCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2xsYy9sbGNfc19hYy5jCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogbGxjX3NfYWMuYyAtIGFjdGlvbnMgcGVyZm9ybWVkIGR1cmluZyBzYXAgc3RhdGUgdHJhbnNpdGlvbi4KKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIEZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSBhcmUgaW1wbGVtZW50YXRpb24gb2Ygc2FwIGNvbXBvbmVudCBhY3Rpb25zLgorICogICBEZXRhaWxzIG9mIGFjdGlvbnMgY2FuIGJlIGZvdW5kIGluIElFRUUtODAyLjIgc3RhbmRhcmQgZG9jdW1lbnQuCisgKiAgIEFsbCBmdW5jdGlvbnMgaGF2ZSBvbmUgc2FwIGFuZCBvbmUgZXZlbnQgYXMgaW5wdXQgYXJndW1lbnQuIEFsbCBvZgorICogICB0aGVtIHJldHVybiAwIE9uIHN1Y2Nlc3MgYW5kIDEgb3RoZXJ3aXNlLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NyBieSBQcm9jb20gVGVjaG5vbG9neSwgSW5jLgorICoJCSAyMDAxLTIwMDMgYnkgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisgKgorICogVGhpcyBwcm9ncmFtIGNhbiBiZSByZWRpc3RyaWJ1dGVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9yIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4KKyAqCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPG5ldC9sbGMuaD4KKyNpbmNsdWRlIDxuZXQvbGxjX3BkdS5oPgorI2luY2x1ZGUgPG5ldC9sbGNfc19hYy5oPgorI2luY2x1ZGUgPG5ldC9sbGNfc19ldi5oPgorI2luY2x1ZGUgPG5ldC9sbGNfc2FwLmg+CisjaW5jbHVkZSAibGxjX291dHB1dC5oIgorCisvKioKKyAqCWxsY19zYXBfYWN0aW9uX3VuaXRfZGF0YV9pbmQgLSBmb3J3YXJkIFVJIFBEVSB0byBuZXR3b3JrIGxheWVyCisgKglAc2FwOiBTQVAKKyAqCUBza2I6IHRoZSBldmVudCB0byBmb3J3YXJkCisgKgorICoJUmVjZWl2ZWQgYSBVSSBQRFUgZnJvbSBNQUMgbGF5ZXI7IGZvcndhcmQgdG8gbmV0d29yayBsYXllciBhcyBhCisgKglVTklUREFUQSBJTkRJQ0FUSU9OOyB2ZXJpZnkgb3VyIGV2ZW50IGlzIHRoZSBraW5kIHdlIGV4cGVjdAorICovCitpbnQgbGxjX3NhcF9hY3Rpb25fdW5pdGRhdGFfaW5kKHN0cnVjdCBsbGNfc2FwICpzYXAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJbGxjX3NhcF9ydG5fcGR1KHNhcCwgc2tiKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglsbGNfc2FwX2FjdGlvbl9zZW5kX3VpIC0gc2VuZHMgVUkgUERVIHJlc3AgdG8gVU5JVERBVEEgUkVRIHRvIE1BQyBsYXllcgorICoJQHNhcDogU0FQCisgKglAc2tiOiB0aGUgZXZlbnQgdG8gc2VuZAorICoKKyAqCVNlbmRzIGEgVUkgUERVIHRvIHRoZSBNQUMgbGF5ZXIgaW4gcmVzcG9uc2UgdG8gYSBVTklUREFUQSBSRVFVRVNUCisgKglwcmltaXRpdmUgZnJvbSB0aGUgbmV0d29yayBsYXllci4gVmVyaWZpZXMgZXZlbnQgaXMgYSBwcmltaXRpdmUgdHlwZSBvZgorICoJZXZlbnQuIFZlcmlmeSB0aGUgcHJpbWl0aXZlIGlzIGEgVU5JVERBVEEgUkVRVUVTVC4KKyAqLworaW50IGxsY19zYXBfYWN0aW9uX3NlbmRfdWkoc3RydWN0IGxsY19zYXAgKnNhcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX3NhcF9zdGF0ZV9ldiAqZXYgPSBsbGNfc2FwX2V2KHNrYik7CisJaW50IHJjOworCisJbGxjX3BkdV9oZWFkZXJfaW5pdChza2IsIExMQ19QRFVfVFlQRV9VLCBldi0+c2FkZHIubHNhcCwKKwkJCSAgICBldi0+ZGFkZHIubHNhcCwgTExDX1BEVV9DTUQpOworCWxsY19wZHVfaW5pdF9hc191aV9jbWQoc2tiKTsKKwlyYyA9IGxsY19tYWNfaGRyX2luaXQoc2tiLCBldi0+c2FkZHIubWFjLCBldi0+ZGFkZHIubWFjKTsKKwlpZiAoIXJjKQorCQlyYyA9IGRldl9xdWV1ZV94bWl0KHNrYik7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqCWxsY19zYXBfYWN0aW9uX3NlbmRfeGlkX2MgLSBzZW5kIFhJRCBQRFUgYXMgcmVzcG9uc2UgdG8gWElEIFJFUQorICoJQHNhcDogU0FQCisgKglAc2tiOiB0aGUgZXZlbnQgdG8gc2VuZAorICoKKyAqCVNlbmQgYSBYSUQgY29tbWFuZCBQRFUgdG8gTUFDIGxheWVyIGluIHJlc3BvbnNlIHRvIGEgWElEIFJFUVVFU1QKKyAqCXByaW1pdGl2ZSBmcm9tIHRoZSBuZXR3b3JrIGxheWVyLiBWZXJpZnkgZXZlbnQgaXMgYSBwcmltaXRpdmUgdHlwZQorICoJZXZlbnQuIFZlcmlmeSB0aGUgcHJpbWl0aXZlIGlzIGEgWElEIFJFUVVFU1QuCisgKi8KK2ludCBsbGNfc2FwX2FjdGlvbl9zZW5kX3hpZF9jKHN0cnVjdCBsbGNfc2FwICpzYXAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19zYXBfc3RhdGVfZXYgKmV2ID0gbGxjX3NhcF9ldihza2IpOworCWludCByYzsKKworCWxsY19wZHVfaGVhZGVyX2luaXQoc2tiLCBMTENfUERVX1RZUEVfVSwgZXYtPnNhZGRyLmxzYXAsCisJCQkgICAgZXYtPmRhZGRyLmxzYXAsIExMQ19QRFVfQ01EKTsKKwlsbGNfcGR1X2luaXRfYXNfeGlkX2NtZChza2IsIExMQ19YSURfTlVMTF9DTEFTU18yLCAwKTsKKwlyYyA9IGxsY19tYWNfaGRyX2luaXQoc2tiLCBldi0+c2FkZHIubWFjLCBldi0+ZGFkZHIubWFjKTsKKwlpZiAoIXJjKQorCQlyYyA9IGRldl9xdWV1ZV94bWl0KHNrYik7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqCWxsY19zYXBfYWN0aW9uX3NlbmRfeGlkX3IgLSBzZW5kIFhJRCBQRFUgcmVzcCB0byBNQUMgZm9yIHJlY2VpdmVkIFhJRAorICoJQHNhcDogU0FQCisgKglAc2tiOiB0aGUgZXZlbnQgdG8gc2VuZAorICoKKyAqCVNlbmQgWElEIHJlc3BvbnNlIFBEVSB0byBNQUMgaW4gcmVzcG9uc2UgdG8gYW4gZWFybGllciByZWNlaXZlZCBYSUQKKyAqCWNvbW1hbmQgUERVLiBWZXJpZnkgZXZlbnQgaXMgYSBQRFUgdHlwZSBldmVudAorICovCitpbnQgbGxjX3NhcF9hY3Rpb25fc2VuZF94aWRfcihzdHJ1Y3QgbGxjX3NhcCAqc2FwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXU4IG1hY19kYVtFVEhfQUxFTl0sIG1hY19zYVtFVEhfQUxFTl0sIGRzYXA7CisJaW50IHJjID0gMTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKKworCWxsY19wZHVfZGVjb2RlX3NhKHNrYiwgbWFjX2RhKTsKKwlsbGNfcGR1X2RlY29kZV9kYShza2IsIG1hY19zYSk7CisJbGxjX3BkdV9kZWNvZGVfc3NhcChza2IsICZkc2FwKTsKKwluc2tiID0gbGxjX2FsbG9jX2ZyYW1lKCk7CisJaWYgKCFuc2tiKQorCQlnb3RvIG91dDsKKwluc2tiLT5kZXYgPSBza2ItPmRldjsKKwlsbGNfcGR1X2hlYWRlcl9pbml0KG5za2IsIExMQ19QRFVfVFlQRV9VLCBzYXAtPmxhZGRyLmxzYXAsIGRzYXAsCisJCQkgICAgTExDX1BEVV9SU1ApOworCWxsY19wZHVfaW5pdF9hc194aWRfcnNwKG5za2IsIExMQ19YSURfTlVMTF9DTEFTU18yLCAwKTsKKwlyYyA9IGxsY19tYWNfaGRyX2luaXQobnNrYiwgbWFjX3NhLCBtYWNfZGEpOworCWlmICghcmMpCisJCXJjID0gZGV2X3F1ZXVlX3htaXQobnNrYik7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqCWxsY19zYXBfYWN0aW9uX3NlbmRfdGVzdF9jIC0gc2VuZCBURVNUIFBEVSB0byBNQUMgaW4gcmVzcCB0byBURVNUIFJFUQorICoJQHNhcDogU0FQCisgKglAc2tiOiB0aGUgZXZlbnQgdG8gc2VuZAorICoKKyAqCVNlbmQgYSBURVNUIGNvbW1hbmQgUERVIHRvIHRoZSBNQUMgbGF5ZXIgaW4gcmVzcG9uc2UgdG8gYSBURVNUIFJFUVVFU1QKKyAqCXByaW1pdGl2ZSBmcm9tIHRoZSBuZXR3b3JrIGxheWVyLiBWZXJpZnkgZXZlbnQgaXMgYSBwcmltaXRpdmUgdHlwZQorICoJZXZlbnQ7IHZlcmlmeSB0aGUgcHJpbWl0aXZlIGlzIGEgVEVTVCBSRVFVRVNULgorICovCitpbnQgbGxjX3NhcF9hY3Rpb25fc2VuZF90ZXN0X2Moc3RydWN0IGxsY19zYXAgKnNhcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX3NhcF9zdGF0ZV9ldiAqZXYgPSBsbGNfc2FwX2V2KHNrYik7CisJaW50IHJjOworCisJbGxjX3BkdV9oZWFkZXJfaW5pdChza2IsIExMQ19QRFVfVFlQRV9VLCBldi0+c2FkZHIubHNhcCwKKwkJCSAgICBldi0+ZGFkZHIubHNhcCwgTExDX1BEVV9DTUQpOworCWxsY19wZHVfaW5pdF9hc190ZXN0X2NtZChza2IpOworCXJjID0gbGxjX21hY19oZHJfaW5pdChza2IsIGV2LT5zYWRkci5tYWMsIGV2LT5kYWRkci5tYWMpOworCWlmICghcmMpCisJCXJjID0gZGV2X3F1ZXVlX3htaXQoc2tiKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBsbGNfc2FwX2FjdGlvbl9zZW5kX3Rlc3RfcihzdHJ1Y3QgbGxjX3NhcCAqc2FwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXU4IG1hY19kYVtFVEhfQUxFTl0sIG1hY19zYVtFVEhfQUxFTl0sIGRzYXA7CisJc3RydWN0IHNrX2J1ZmYgKm5za2I7CisJaW50IHJjID0gMTsKKworCWxsY19wZHVfZGVjb2RlX3NhKHNrYiwgbWFjX2RhKTsKKwlsbGNfcGR1X2RlY29kZV9kYShza2IsIG1hY19zYSk7CisJbGxjX3BkdV9kZWNvZGVfc3NhcChza2IsICZkc2FwKTsKKwluc2tiID0gbGxjX2FsbG9jX2ZyYW1lKCk7CisJaWYgKCFuc2tiKQorCQlnb3RvIG91dDsKKwluc2tiLT5kZXYgPSBza2ItPmRldjsKKwlsbGNfcGR1X2hlYWRlcl9pbml0KG5za2IsIExMQ19QRFVfVFlQRV9VLCBzYXAtPmxhZGRyLmxzYXAsIGRzYXAsCisJCQkgICAgTExDX1BEVV9SU1ApOworCWxsY19wZHVfaW5pdF9hc190ZXN0X3JzcChuc2tiLCBza2IpOworCXJjID0gbGxjX21hY19oZHJfaW5pdChuc2tiLCBtYWNfc2EsIG1hY19kYSk7CisJaWYgKCFyYykKKwkJcmMgPSBkZXZfcXVldWVfeG1pdChuc2tiKTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICoJbGxjX3NhcF9hY3Rpb25fcmVwb3J0X3N0YXR1cyAtIHJlcG9ydCBkYXRhIGxpbmsgc3RhdHVzIHRvIGxheWVyIG1nbXQKKyAqCUBzYXA6IFNBUAorICoJQHNrYjogdGhlIGV2ZW50IHRvIHNlbmQKKyAqCisgKglSZXBvcnQgZGF0YSBsaW5rIHN0YXR1cyB0byBsYXllciBtYW5hZ2VtZW50LiBWZXJpZnkgb3VyIGV2ZW50IGlzIHRoZQorICoJa2luZCB3ZSBleHBlY3QuCisgKi8KK2ludCBsbGNfc2FwX2FjdGlvbl9yZXBvcnRfc3RhdHVzKHN0cnVjdCBsbGNfc2FwICpzYXAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJbGxjX3NhcF9hY3Rpb25feGlkX2luZCAtIHNlbmQgWElEIFBEVSByZXNwIHRvIG5ldCBsYXllciB2aWEgWElEIElORAorICoJQHNhcDogU0FQCisgKglAc2tiOiB0aGUgZXZlbnQgdG8gc2VuZAorICoKKyAqCVNlbmQgYSBYSUQgcmVzcG9uc2UgUERVIHRvIHRoZSBuZXR3b3JrIGxheWVyIHZpYSBhIFhJRCBJTkRJQ0FUSU9OCisgKglwcmltaXRpdmUuCisgKi8KK2ludCBsbGNfc2FwX2FjdGlvbl94aWRfaW5kKHN0cnVjdCBsbGNfc2FwICpzYXAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJbGxjX3NhcF9ydG5fcGR1KHNhcCwgc2tiKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglsbGNfc2FwX2FjdGlvbl90ZXN0X2luZCAtIHNlbmQgVEVTVCBQRFUgdG8gbmV0IGxheWVyIHZpYSBURVNUIElORAorICoJQHNhcDogU0FQCisgKglAc2tiOiB0aGUgZXZlbnQgdG8gc2VuZAorICoKKyAqCVNlbmQgYSBURVNUIHJlc3BvbnNlIFBEVSB0byB0aGUgbmV0d29yayBsYXllciB2aWEgYSBURVNUIElORElDQVRJT04KKyAqCXByaW1pdGl2ZS4gVmVyaWZ5IG91ciBldmVudCBpcyBhIFBEVSB0eXBlIGV2ZW50LgorICovCitpbnQgbGxjX3NhcF9hY3Rpb25fdGVzdF9pbmQoc3RydWN0IGxsY19zYXAgKnNhcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlsbGNfc2FwX3J0bl9wZHUoc2FwLCBza2IpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbmV0L2xsYy9sbGNfc19ldi5jIGIvbmV0L2xsYy9sbGNfc19ldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NGQyYTEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbGxjL2xsY19zX2V2LmMKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBsbGNfc19ldi5jIC0gRGVmaW5lcyBTQVAgY29tcG9uZW50IGV2ZW50cworICoKKyAqIFRoZSBmb2xsb3dlZCBldmVudCBmdW5jdGlvbnMgYXJlIFNBUCBjb21wb25lbnQgZXZlbnRzIHdoaWNoIGFyZSBkZXNjcmliZWQKKyAqIGluIDgwMi4yIExMQyBwcm90b2NvbCBzdGFuZGFyZCBkb2N1bWVudC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcgYnkgUHJvY29tIFRlY2hub2xvZ3ksIEluYy4KKyAqCQkgMjAwMS0yMDAzIGJ5IEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBjYW4gYmUgcmVkaXN0cmlidXRlZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSBvciBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuCisgKgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvbGxjX2lmLmg+CisjaW5jbHVkZSA8bmV0L2xsY19zX2V2Lmg+CisjaW5jbHVkZSA8bmV0L2xsY19wZHUuaD4KKworaW50IGxsY19zYXBfZXZfYWN0aXZhdGlvbl9yZXEoc3RydWN0IGxsY19zYXAgKnNhcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX3NhcF9zdGF0ZV9ldiAqZXYgPSBsbGNfc2FwX2V2KHNrYik7CisKKwlyZXR1cm4gZXYtPnR5cGUgPT0gTExDX1NBUF9FVl9UWVBFX1NJTVBMRSAmJgorCSAgICAgICBldi0+cHJpbV90eXBlID09IExMQ19TQVBfRVZfQUNUSVZBVElPTl9SRVEgPyAwIDogMTsKK30KKworaW50IGxsY19zYXBfZXZfcnhfdWkoc3RydWN0IGxsY19zYXAgKnNhcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX3NhcF9zdGF0ZV9ldiAqZXYgPSBsbGNfc2FwX2V2KHNrYik7CisJc3RydWN0IGxsY19wZHVfdW4gKnBkdSA9IGxsY19wZHVfdW5faGRyKHNrYik7CisKKwlyZXR1cm4gZXYtPnR5cGUgPT0gTExDX1NBUF9FVl9UWVBFX1BEVSAmJiBMTENfUERVX0lTX0NNRChwZHUpICYmCisJICAgICAgIExMQ19QRFVfVFlQRV9JU19VKHBkdSkgJiYKKwkgICAgICAgTExDX1VfUERVX0NNRChwZHUpID09IExMQ18xX1BEVV9DTURfVUkgPyAwIDogMTsKK30KKworaW50IGxsY19zYXBfZXZfdW5pdGRhdGFfcmVxKHN0cnVjdCBsbGNfc2FwICpzYXAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19zYXBfc3RhdGVfZXYgKmV2ID0gbGxjX3NhcF9ldihza2IpOworCisJcmV0dXJuIGV2LT50eXBlID09IExMQ19TQVBfRVZfVFlQRV9QUklNICYmCisJICAgICAgIGV2LT5wcmltID09IExMQ19EQVRBVU5JVF9QUklNICYmCisJICAgICAgIGV2LT5wcmltX3R5cGUgPT0gTExDX1BSSU1fVFlQRV9SRVEgPyAwIDogMTsKKworfQorCitpbnQgbGxjX3NhcF9ldl94aWRfcmVxKHN0cnVjdCBsbGNfc2FwICpzYXAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19zYXBfc3RhdGVfZXYgKmV2ID0gbGxjX3NhcF9ldihza2IpOworCisJcmV0dXJuIGV2LT50eXBlID09IExMQ19TQVBfRVZfVFlQRV9QUklNICYmCisJICAgICAgIGV2LT5wcmltID09IExMQ19YSURfUFJJTSAmJgorCSAgICAgICBldi0+cHJpbV90eXBlID09IExMQ19QUklNX1RZUEVfUkVRID8gMCA6IDE7Cit9CisKK2ludCBsbGNfc2FwX2V2X3J4X3hpZF9jKHN0cnVjdCBsbGNfc2FwICpzYXAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19zYXBfc3RhdGVfZXYgKmV2ID0gbGxjX3NhcF9ldihza2IpOworCXN0cnVjdCBsbGNfcGR1X3VuICpwZHUgPSBsbGNfcGR1X3VuX2hkcihza2IpOworCisJcmV0dXJuIGV2LT50eXBlID09IExMQ19TQVBfRVZfVFlQRV9QRFUgJiYgTExDX1BEVV9JU19DTUQocGR1KSAmJgorCSAgICAgICBMTENfUERVX1RZUEVfSVNfVShwZHUpICYmCisJICAgICAgIExMQ19VX1BEVV9DTUQocGR1KSA9PSBMTENfMV9QRFVfQ01EX1hJRCA/IDAgOiAxOworfQorCitpbnQgbGxjX3NhcF9ldl9yeF94aWRfcihzdHJ1Y3QgbGxjX3NhcCAqc2FwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfc2FwX3N0YXRlX2V2ICpldiA9IGxsY19zYXBfZXYoc2tiKTsKKwlzdHJ1Y3QgbGxjX3BkdV91biAqcGR1ID0gbGxjX3BkdV91bl9oZHIoc2tiKTsKKworCXJldHVybiBldi0+dHlwZSA9PSBMTENfU0FQX0VWX1RZUEVfUERVICYmIExMQ19QRFVfSVNfUlNQKHBkdSkgJiYKKwkgICAgICAgTExDX1BEVV9UWVBFX0lTX1UocGR1KSAmJgorCSAgICAgICBMTENfVV9QRFVfUlNQKHBkdSkgPT0gTExDXzFfUERVX0NNRF9YSUQgPyAwIDogMTsKK30KKworaW50IGxsY19zYXBfZXZfdGVzdF9yZXEoc3RydWN0IGxsY19zYXAgKnNhcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX3NhcF9zdGF0ZV9ldiAqZXYgPSBsbGNfc2FwX2V2KHNrYik7CisKKwlyZXR1cm4gZXYtPnR5cGUgPT0gTExDX1NBUF9FVl9UWVBFX1BSSU0gJiYKKwkgICAgICAgZXYtPnByaW0gPT0gTExDX1RFU1RfUFJJTSAmJgorCSAgICAgICBldi0+cHJpbV90eXBlID09IExMQ19QUklNX1RZUEVfUkVRID8gMCA6IDE7Cit9CisKK2ludCBsbGNfc2FwX2V2X3J4X3Rlc3RfYyhzdHJ1Y3QgbGxjX3NhcCAqc2FwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfc2FwX3N0YXRlX2V2ICpldiA9IGxsY19zYXBfZXYoc2tiKTsKKwlzdHJ1Y3QgbGxjX3BkdV91biAqcGR1ID0gbGxjX3BkdV91bl9oZHIoc2tiKTsKKworCXJldHVybiBldi0+dHlwZSA9PSBMTENfU0FQX0VWX1RZUEVfUERVICYmIExMQ19QRFVfSVNfQ01EKHBkdSkgJiYKKwkgICAgICAgTExDX1BEVV9UWVBFX0lTX1UocGR1KSAmJgorCSAgICAgICBMTENfVV9QRFVfQ01EKHBkdSkgPT0gTExDXzFfUERVX0NNRF9URVNUID8gMCA6IDE7Cit9CisKK2ludCBsbGNfc2FwX2V2X3J4X3Rlc3RfcihzdHJ1Y3QgbGxjX3NhcCAqc2FwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfc2FwX3N0YXRlX2V2ICpldiA9IGxsY19zYXBfZXYoc2tiKTsKKwlzdHJ1Y3QgbGxjX3BkdV91biAqcGR1ID0gbGxjX3BkdV91bl9oZHIoc2tiKTsKKworCXJldHVybiBldi0+dHlwZSA9PSBMTENfU0FQX0VWX1RZUEVfUERVICYmIExMQ19QRFVfSVNfUlNQKHBkdSkgJiYKKwkgICAgICAgTExDX1BEVV9UWVBFX0lTX1UocGR1KSAmJgorCSAgICAgICBMTENfVV9QRFVfUlNQKHBkdSkgPT0gTExDXzFfUERVX0NNRF9URVNUID8gMCA6IDE7Cit9CisKK2ludCBsbGNfc2FwX2V2X2RlYWN0aXZhdGlvbl9yZXEoc3RydWN0IGxsY19zYXAgKnNhcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX3NhcF9zdGF0ZV9ldiAqZXYgPSBsbGNfc2FwX2V2KHNrYik7CisKKwlyZXR1cm4gZXYtPnR5cGUgPT0gTExDX1NBUF9FVl9UWVBFX1NJTVBMRSAmJgorCSAgICAgICBldi0+cHJpbV90eXBlID09IExMQ19TQVBfRVZfREVBQ1RJVkFUSU9OX1JFUSA/IDAgOiAxOworfQpkaWZmIC0tZ2l0IGEvbmV0L2xsYy9sbGNfc19zdC5jIGIvbmV0L2xsYy9sbGNfc19zdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNDMyMDEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbGxjL2xsY19zX3N0LmMKQEAgLTAsMCArMSwxODMgQEAKKy8qCisgKiBsbGNfc19zdC5jIC0gRGVmaW5lcyBTQVAgY29tcG9uZW50IHN0YXRlIG1hY2hpbmUgdHJhbnNpdGlvbnMuCisgKgorICogVGhlIGZvbGxvd2VkIHRyYW5zaXRpb25zIGFyZSBTQVAgY29tcG9uZW50IHN0YXRlIG1hY2hpbmUgdHJhbnNpdGlvbnMKKyAqIHdoaWNoIGFyZSBkZXNjcmliZWQgaW4gODAyLjIgTExDIHByb3RvY29sIHN0YW5kYXJkIGRvY3VtZW50LgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NyBieSBQcm9jb20gVGVjaG5vbG9neSwgSW5jLgorICoJCSAyMDAxLTIwMDMgYnkgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisgKgorICogVGhpcyBwcm9ncmFtIGNhbiBiZSByZWRpc3RyaWJ1dGVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9yIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4KKyAqCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPG5ldC9sbGNfaWYuaD4KKyNpbmNsdWRlIDxuZXQvbGxjX3NfZXYuaD4KKyNpbmNsdWRlIDxuZXQvbGxjX3NfYWMuaD4KKyNpbmNsdWRlIDxuZXQvbGxjX3Nfc3QuaD4KKworLyogZHVtbXkgbGFzdC10cmFuc2l0aW9uIGluZGljYXRvcjsgY29tbW9uIHRvIGFsbCBzdGF0ZSB0cmFuc2l0aW9uIGdyb3VwcworICogbGFzdCBlbnRyeSBmb3IgdGhpcyBzdGF0ZQorICogYWxsIG1lbWJlcnMgYXJlIHplcm9zLCAuYnNzIHplcm9lcyBpdAorICovCitzdGF0aWMgc3RydWN0IGxsY19zYXBfc3RhdGVfdHJhbnMgbGxjX3NhcF9zdGF0ZV90cmFuc19lbmQ7CisKKy8qIHN0YXRlIExMQ19TQVBfU1RBVEVfSU5BQ1RJVkUgdHJhbnNpdGlvbiBmb3IKKyAqIExMQ19TQVBfRVZfQUNUSVZBVElPTl9SRVEgZXZlbnQKKyAqLworc3RhdGljIGxsY19zYXBfYWN0aW9uX3QgbGxjX3NhcF9pbmFjdGl2ZV9zdGF0ZV9hY3Rpb25zXzFbXSA9IHsKKwlbMF0gPSBsbGNfc2FwX2FjdGlvbl9yZXBvcnRfc3RhdHVzLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19zYXBfc3RhdGVfdHJhbnMgbGxjX3NhcF9pbmFjdGl2ZV9zdGF0ZV90cmFuc18xID0geworCS5ldiA9CQlsbGNfc2FwX2V2X2FjdGl2YXRpb25fcmVxLAorCS5uZXh0X3N0YXRlID0JTExDX1NBUF9TVEFURV9BQ1RJVkUsCisJLmV2X2FjdGlvbnMgPQlsbGNfc2FwX2luYWN0aXZlX3N0YXRlX2FjdGlvbnNfMSwKK307CisKKy8qIGFycmF5IG9mIHBvaW50ZXJzOyBvbmUgdG8gZWFjaCB0cmFuc2l0aW9uICovCitzdGF0aWMgc3RydWN0IGxsY19zYXBfc3RhdGVfdHJhbnMgKmxsY19zYXBfaW5hY3RpdmVfc3RhdGVfdHJhbnNpdGlvbnNbXSA9IHsKKwlbMF0gPSAmbGxjX3NhcF9pbmFjdGl2ZV9zdGF0ZV90cmFuc18xLAorCVsxXSA9ICZsbGNfc2FwX3N0YXRlX3RyYW5zX2VuZCwKK307CisKKy8qIHN0YXRlIExMQ19TQVBfU1RBVEVfQUNUSVZFIHRyYW5zaXRpb24gZm9yIExMQ19TQVBfRVZfUlhfVUkgZXZlbnQgKi8KK3N0YXRpYyBsbGNfc2FwX2FjdGlvbl90IGxsY19zYXBfYWN0aXZlX3N0YXRlX2FjdGlvbnNfMVtdID0geworCVswXSA9IGxsY19zYXBfYWN0aW9uX3VuaXRkYXRhX2luZCwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfc2FwX3N0YXRlX3RyYW5zIGxsY19zYXBfYWN0aXZlX3N0YXRlX3RyYW5zXzEgPSB7CisJLmV2ID0JCWxsY19zYXBfZXZfcnhfdWksCisJLm5leHRfc3RhdGUgPQlMTENfU0FQX1NUQVRFX0FDVElWRSwKKwkuZXZfYWN0aW9ucyA9CWxsY19zYXBfYWN0aXZlX3N0YXRlX2FjdGlvbnNfMSwKK307CisKKy8qIHN0YXRlIExMQ19TQVBfU1RBVEVfQUNUSVZFIHRyYW5zaXRpb24gZm9yIExMQ19TQVBfRVZfVU5JVERBVEFfUkVRIGV2ZW50ICovCitzdGF0aWMgbGxjX3NhcF9hY3Rpb25fdCBsbGNfc2FwX2FjdGl2ZV9zdGF0ZV9hY3Rpb25zXzJbXSA9IHsKKwlbMF0gPSBsbGNfc2FwX2FjdGlvbl9zZW5kX3VpLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19zYXBfc3RhdGVfdHJhbnMgbGxjX3NhcF9hY3RpdmVfc3RhdGVfdHJhbnNfMiA9IHsKKwkuZXYgPQkJbGxjX3NhcF9ldl91bml0ZGF0YV9yZXEsCisJLm5leHRfc3RhdGUgPQlMTENfU0FQX1NUQVRFX0FDVElWRSwKKwkuZXZfYWN0aW9ucyA9CWxsY19zYXBfYWN0aXZlX3N0YXRlX2FjdGlvbnNfMiwKK307CisKKy8qIHN0YXRlIExMQ19TQVBfU1RBVEVfQUNUSVZFIHRyYW5zaXRpb24gZm9yIExMQ19TQVBfRVZfWElEX1JFUSBldmVudCAqLworc3RhdGljIGxsY19zYXBfYWN0aW9uX3QgbGxjX3NhcF9hY3RpdmVfc3RhdGVfYWN0aW9uc18zW10gPSB7CisJWzBdID0gbGxjX3NhcF9hY3Rpb25fc2VuZF94aWRfYywKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfc2FwX3N0YXRlX3RyYW5zIGxsY19zYXBfYWN0aXZlX3N0YXRlX3RyYW5zXzMgPSB7CisJLmV2ID0JCWxsY19zYXBfZXZfeGlkX3JlcSwKKwkubmV4dF9zdGF0ZSA9CUxMQ19TQVBfU1RBVEVfQUNUSVZFLAorCS5ldl9hY3Rpb25zID0JbGxjX3NhcF9hY3RpdmVfc3RhdGVfYWN0aW9uc18zLAorfTsKKworLyogc3RhdGUgTExDX1NBUF9TVEFURV9BQ1RJVkUgdHJhbnNpdGlvbiBmb3IgTExDX1NBUF9FVl9SWF9YSURfQyBldmVudCAqLworc3RhdGljIGxsY19zYXBfYWN0aW9uX3QgbGxjX3NhcF9hY3RpdmVfc3RhdGVfYWN0aW9uc180W10gPSB7CisJWzBdID0gbGxjX3NhcF9hY3Rpb25fc2VuZF94aWRfciwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfc2FwX3N0YXRlX3RyYW5zIGxsY19zYXBfYWN0aXZlX3N0YXRlX3RyYW5zXzQgPSB7CisJLmV2ID0JCWxsY19zYXBfZXZfcnhfeGlkX2MsCisJLm5leHRfc3RhdGUgPQlMTENfU0FQX1NUQVRFX0FDVElWRSwKKwkuZXZfYWN0aW9ucyA9CWxsY19zYXBfYWN0aXZlX3N0YXRlX2FjdGlvbnNfNCwKK307CisKKy8qIHN0YXRlIExMQ19TQVBfU1RBVEVfQUNUSVZFIHRyYW5zaXRpb24gZm9yIExMQ19TQVBfRVZfUlhfWElEX1IgZXZlbnQgKi8KK3N0YXRpYyBsbGNfc2FwX2FjdGlvbl90IGxsY19zYXBfYWN0aXZlX3N0YXRlX2FjdGlvbnNfNVtdID0geworCVswXSA9IGxsY19zYXBfYWN0aW9uX3hpZF9pbmQsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX3NhcF9zdGF0ZV90cmFucyBsbGNfc2FwX2FjdGl2ZV9zdGF0ZV90cmFuc181ID0geworCS5ldiA9CQlsbGNfc2FwX2V2X3J4X3hpZF9yLAorCS5uZXh0X3N0YXRlID0JTExDX1NBUF9TVEFURV9BQ1RJVkUsCisJLmV2X2FjdGlvbnMgPQlsbGNfc2FwX2FjdGl2ZV9zdGF0ZV9hY3Rpb25zXzUsCit9OworCisvKiBzdGF0ZSBMTENfU0FQX1NUQVRFX0FDVElWRSB0cmFuc2l0aW9uIGZvciBMTENfU0FQX0VWX1RFU1RfUkVRIGV2ZW50ICovCitzdGF0aWMgbGxjX3NhcF9hY3Rpb25fdCBsbGNfc2FwX2FjdGl2ZV9zdGF0ZV9hY3Rpb25zXzZbXSA9IHsKKwlbMF0gPSBsbGNfc2FwX2FjdGlvbl9zZW5kX3Rlc3RfYywKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfc2FwX3N0YXRlX3RyYW5zIGxsY19zYXBfYWN0aXZlX3N0YXRlX3RyYW5zXzYgPSB7CisJLmV2ID0JCWxsY19zYXBfZXZfdGVzdF9yZXEsCisJLm5leHRfc3RhdGUgPQlMTENfU0FQX1NUQVRFX0FDVElWRSwKKwkuZXZfYWN0aW9ucyA9CWxsY19zYXBfYWN0aXZlX3N0YXRlX2FjdGlvbnNfNiwKK307CisKKy8qIHN0YXRlIExMQ19TQVBfU1RBVEVfQUNUSVZFIHRyYW5zaXRpb24gZm9yIExMQ19TQVBfRVZfUlhfVEVTVF9DIGV2ZW50ICovCitzdGF0aWMgbGxjX3NhcF9hY3Rpb25fdCBsbGNfc2FwX2FjdGl2ZV9zdGF0ZV9hY3Rpb25zXzdbXSA9IHsKKwlbMF0gPSBsbGNfc2FwX2FjdGlvbl9zZW5kX3Rlc3RfciwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfc2FwX3N0YXRlX3RyYW5zIGxsY19zYXBfYWN0aXZlX3N0YXRlX3RyYW5zXzcgPSB7CisJLmV2ID0JCWxsY19zYXBfZXZfcnhfdGVzdF9jLAorCS5uZXh0X3N0YXRlID0JTExDX1NBUF9TVEFURV9BQ1RJVkUsCisJLmV2X2FjdGlvbnMgPQlsbGNfc2FwX2FjdGl2ZV9zdGF0ZV9hY3Rpb25zXzcKK307CisKKy8qIHN0YXRlIExMQ19TQVBfU1RBVEVfQUNUSVZFIHRyYW5zaXRpb24gZm9yIExMQ19TQVBfRVZfUlhfVEVTVF9SIGV2ZW50ICovCitzdGF0aWMgbGxjX3NhcF9hY3Rpb25fdCBsbGNfc2FwX2FjdGl2ZV9zdGF0ZV9hY3Rpb25zXzhbXSA9IHsKKwlbMF0gPSBsbGNfc2FwX2FjdGlvbl90ZXN0X2luZCwKKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfc2FwX3N0YXRlX3RyYW5zIGxsY19zYXBfYWN0aXZlX3N0YXRlX3RyYW5zXzggPSB7CisJLmV2ID0JCWxsY19zYXBfZXZfcnhfdGVzdF9yLAorCS5uZXh0X3N0YXRlID0JTExDX1NBUF9TVEFURV9BQ1RJVkUsCisJLmV2X2FjdGlvbnMgPQlsbGNfc2FwX2FjdGl2ZV9zdGF0ZV9hY3Rpb25zXzgsCit9OworCisvKiBzdGF0ZSBMTENfU0FQX1NUQVRFX0FDVElWRSB0cmFuc2l0aW9uIGZvcgorICogTExDX1NBUF9FVl9ERUFDVElWQVRJT05fUkVRIGV2ZW50CisgKi8KK3N0YXRpYyBsbGNfc2FwX2FjdGlvbl90IGxsY19zYXBfYWN0aXZlX3N0YXRlX2FjdGlvbnNfOVtdID0geworCVswXSA9IGxsY19zYXBfYWN0aW9uX3JlcG9ydF9zdGF0dXMsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX3NhcF9zdGF0ZV90cmFucyBsbGNfc2FwX2FjdGl2ZV9zdGF0ZV90cmFuc185ID0geworCS5ldiA9CQlsbGNfc2FwX2V2X2RlYWN0aXZhdGlvbl9yZXEsCisJLm5leHRfc3RhdGUgPQlMTENfU0FQX1NUQVRFX0lOQUNUSVZFLAorCS5ldl9hY3Rpb25zID0JbGxjX3NhcF9hY3RpdmVfc3RhdGVfYWN0aW9uc185Cit9OworCisvKiBhcnJheSBvZiBwb2ludGVyczsgb25lIHRvIGVhY2ggdHJhbnNpdGlvbiAqLworc3RhdGljIHN0cnVjdCBsbGNfc2FwX3N0YXRlX3RyYW5zICpsbGNfc2FwX2FjdGl2ZV9zdGF0ZV90cmFuc2l0aW9uc1tdID0geworCVswXSA9ICZsbGNfc2FwX2FjdGl2ZV9zdGF0ZV90cmFuc18yLAorCVsxXSA9ICZsbGNfc2FwX2FjdGl2ZV9zdGF0ZV90cmFuc18xLAorCVsyXSA9ICZsbGNfc2FwX2FjdGl2ZV9zdGF0ZV90cmFuc18zLAorCVszXSA9ICZsbGNfc2FwX2FjdGl2ZV9zdGF0ZV90cmFuc180LAorCVs0XSA9ICZsbGNfc2FwX2FjdGl2ZV9zdGF0ZV90cmFuc181LAorCVs1XSA9ICZsbGNfc2FwX2FjdGl2ZV9zdGF0ZV90cmFuc182LAorCVs2XSA9ICZsbGNfc2FwX2FjdGl2ZV9zdGF0ZV90cmFuc183LAorCVs3XSA9ICZsbGNfc2FwX2FjdGl2ZV9zdGF0ZV90cmFuc184LAorCVs4XSA9ICZsbGNfc2FwX2FjdGl2ZV9zdGF0ZV90cmFuc185LAorCVs5XSA9ICZsbGNfc2FwX3N0YXRlX3RyYW5zX2VuZCwKK307CisKKy8qIFNBUCBzdGF0ZSB0cmFuc2l0aW9uIHRhYmxlICovCitzdHJ1Y3QgbGxjX3NhcF9zdGF0ZSBsbGNfc2FwX3N0YXRlX3RhYmxlW0xMQ19OUl9TQVBfU1RBVEVTXSA9IHsKKwlbTExDX1NBUF9TVEFURV9JTkFDVElWRSAtIDFdID0geworCQkuY3Vycl9zdGF0ZQk9IExMQ19TQVBfU1RBVEVfSU5BQ1RJVkUsCisJCS50cmFuc2l0aW9ucwk9IGxsY19zYXBfaW5hY3RpdmVfc3RhdGVfdHJhbnNpdGlvbnMsCisgICAgICAgCX0sCisJW0xMQ19TQVBfU1RBVEVfQUNUSVZFIC0gMV0gPSB7CisJCS5jdXJyX3N0YXRlCT0gTExDX1NBUF9TVEFURV9BQ1RJVkUsCisJCS50cmFuc2l0aW9ucwk9IGxsY19zYXBfYWN0aXZlX3N0YXRlX3RyYW5zaXRpb25zLAorCX0sCit9OwpkaWZmIC0tZ2l0IGEvbmV0L2xsYy9sbGNfc2FwLmMgYi9uZXQvbGxjL2xsY19zYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjVjOTRlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2xsYy9sbGNfc2FwLmMKQEAgLTAsMCArMSwzMTYgQEAKKy8qCisgKiBsbGNfc2FwLmMgLSBkcml2ZXIgcm91dGluZXMgZm9yIFNBUCBjb21wb25lbnQuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3IGJ5IFByb2NvbSBUZWNobm9sb2d5LCBJbmMuCisgKiAJCSAyMDAxLTIwMDMgYnkgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisgKgorICogVGhpcyBwcm9ncmFtIGNhbiBiZSByZWRpc3RyaWJ1dGVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9yIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4KKyAqCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPG5ldC9sbGMuaD4KKyNpbmNsdWRlIDxuZXQvbGxjX2lmLmg+CisjaW5jbHVkZSA8bmV0L2xsY19jb25uLmg+CisjaW5jbHVkZSA8bmV0L2xsY19wZHUuaD4KKyNpbmNsdWRlIDxuZXQvbGxjX3NhcC5oPgorI2luY2x1ZGUgPG5ldC9sbGNfc19hYy5oPgorI2luY2x1ZGUgPG5ldC9sbGNfc19ldi5oPgorI2luY2x1ZGUgPG5ldC9sbGNfc19zdC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvbGxjLmg+CisKKy8qKgorICoJbGxjX2FsbG9jX2ZyYW1lIC0gYWxsb2NhdGVzIHNrX2J1ZmYgZm9yIGZyYW1lCisgKgorICoJQWxsb2NhdGVzIGFuIHNrX2J1ZmYgZm9yIGZyYW1lIGFuZCBpbml0aWFsaXplcyBza19idWZmIGZpZWxkcy4KKyAqCVJldHVybnMgYWxsb2NhdGVkIHNrYiBvciAlTlVMTCB3aGVuIG91dCBvZiBtZW1vcnkuCisgKi8KK3N0cnVjdCBza19idWZmICpsbGNfYWxsb2NfZnJhbWUodm9pZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYWxsb2Nfc2tiKDEyOCwgR0ZQX0FUT01JQyk7CisKKwlpZiAoc2tiKSB7CisJCXNrYl9yZXNlcnZlKHNrYiwgNTApOworCQlza2ItPm5oLnJhdyAgID0gc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QXzgwMl8yKTsKKwkJc2tiLT5kZXYgICAgICA9IGRldl9iYXNlLT5uZXh0OworCQlza2ItPm1hYy5yYXcgID0gc2tiLT5oZWFkOworCX0KKwlyZXR1cm4gc2tiOworfQorCit2b2lkIGxsY19zYXZlX3ByaW1pdGl2ZShzdHJ1Y3Qgc2tfYnVmZiogc2tiLCB1OCBwcmltKQoreworCXN0cnVjdCBzb2NrYWRkcl9sbGMgKmFkZHIgPSBsbGNfdWlfc2tiX2NiKHNrYik7CisKKyAgICAgICAvKiBzYXZlIHByaW1pdGl2ZSBmb3IgdXNlIGJ5IHRoZSB1c2VyLiAqLworCWFkZHItPnNsbGNfZmFtaWx5ID0gc2tiLT5zay0+c2tfZmFtaWx5OworCWFkZHItPnNsbGNfYXJwaHJkID0gc2tiLT5kZXYtPnR5cGU7CisJYWRkci0+c2xsY190ZXN0ICAgPSBwcmltID09IExMQ19URVNUX1BSSU07CisJYWRkci0+c2xsY194aWQgICAgPSBwcmltID09IExMQ19YSURfUFJJTTsKKwlhZGRyLT5zbGxjX3VhICAgICA9IHByaW0gPT0gTExDX0RBVEFVTklUX1BSSU07CisJbGxjX3BkdV9kZWNvZGVfc2Eoc2tiLCBhZGRyLT5zbGxjX21hYyk7CisJbGxjX3BkdV9kZWNvZGVfc3NhcChza2IsICZhZGRyLT5zbGxjX3NhcCk7Cit9CisKKy8qKgorICoJbGxjX3NhcF9ydG5fcGR1IC0gSW5mb3JtcyB1cHBlciBsYXllciBvbiByeCBvZiBhbiBVSSwgWElEIG9yIFRFU1QgcGR1LgorICoJQHNhcDogcG9pbnRlciB0byBTQVAKKyAqCUBza2I6IHJlY2VpdmVkIHBkdQorICovCit2b2lkIGxsY19zYXBfcnRuX3BkdShzdHJ1Y3QgbGxjX3NhcCAqc2FwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfc2FwX3N0YXRlX2V2ICpldiA9IGxsY19zYXBfZXYoc2tiKTsKKwlzdHJ1Y3QgbGxjX3BkdV91biAqcGR1ID0gbGxjX3BkdV91bl9oZHIoc2tiKTsKKworCXN3aXRjaCAoTExDX1VfUERVX1JTUChwZHUpKSB7CisJY2FzZSBMTENfMV9QRFVfQ01EX1RFU1Q6CisJCWV2LT5wcmltID0gTExDX1RFU1RfUFJJTTsJYnJlYWs7CisJY2FzZSBMTENfMV9QRFVfQ01EX1hJRDoKKwkJZXYtPnByaW0gPSBMTENfWElEX1BSSU07CWJyZWFrOworCWNhc2UgTExDXzFfUERVX0NNRF9VSToKKwkJZXYtPnByaW0gPSBMTENfREFUQVVOSVRfUFJJTTsJYnJlYWs7CisJfQorCWV2LT5pbmRfY2ZtX2ZsYWcgPSBMTENfSU5EOworfQorCisvKioKKyAqCWxsY19maW5kX3NhcF90cmFucyAtIGZpbmRzIHRyYW5zaXRpb24gZm9yIGV2ZW50CisgKglAc2FwOiBwb2ludGVyIHRvIFNBUAorICoJQHNrYjogaGFwcGVuZWQgZXZlbnQKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGZpbmRzIHRyYW5zaXRpb24gdGhhdCBtYXRjaGVzIHdpdGggaGFwcGVuZWQgZXZlbnQuCisgKglSZXR1cm5zIHRoZSBwb2ludGVyIHRvIGZvdW5kIHRyYW5zaXRpb24gb24gc3VjY2VzcyBvciAlTlVMTCBmb3IKKyAqCWZhaWx1cmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbGxjX3NhcF9zdGF0ZV90cmFucyAqbGxjX2ZpbmRfc2FwX3RyYW5zKHN0cnVjdCBsbGNfc2FwICpzYXAsCisJCQkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiogc2tiKQoreworCWludCBpID0gMDsKKwlzdHJ1Y3QgbGxjX3NhcF9zdGF0ZV90cmFucyAqcmMgPSBOVUxMOworCXN0cnVjdCBsbGNfc2FwX3N0YXRlX3RyYW5zICoqbmV4dF90cmFuczsKKwlzdHJ1Y3QgbGxjX3NhcF9zdGF0ZSAqY3Vycl9zdGF0ZSA9ICZsbGNfc2FwX3N0YXRlX3RhYmxlW3NhcC0+c3RhdGUgLSAxXTsKKwkvKgorCSAqIFNlYXJjaCB0aHJ1IGV2ZW50cyBmb3IgdGhpcyBzdGF0ZSB1bnRpbCBsaXN0IGV4aGF1c3RlZCBvciB1bnRpbAorCSAqIGl0cyBvYnZpb3VzIHRoZSBldmVudCBpcyBub3QgdmFsaWQgZm9yIHRoZSBjdXJyZW50IHN0YXRlCisJICovCisJZm9yIChuZXh0X3RyYW5zID0gY3Vycl9zdGF0ZS0+dHJhbnNpdGlvbnM7IG5leHRfdHJhbnNbaV0tPmV2OyBpKyspCisJCWlmICghbmV4dF90cmFuc1tpXS0+ZXYoc2FwLCBza2IpKSB7CisJCQlyYyA9IG5leHRfdHJhbnNbaV07IC8qIGdvdCBldmVudCBtYXRjaDsgcmV0dXJuIGl0ICovCisJCQlicmVhazsKKwkJfQorCXJldHVybiByYzsKK30KKworLyoqCisgKglsbGNfZXhlY19zYXBfdHJhbnNfYWN0aW9ucyAtIGV4ZWN1dGUgYWN0aW9ucyByZWxhdGVkIHRvIGV2ZW50CisgKglAc2FwOiBwb2ludGVyIHRvIFNBUAorICoJQHRyYW5zOiBwb2ludGVyIHRvIHRyYW5zaXRpb24gdGhhdCBpdCdzIGFjdGlvbnMgbXVzdCBiZSBwZXJmb3JtZWQKKyAqCUBza2I6IGhhcHBlbmVkIGV2ZW50LgorICoKKyAqCVRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgYWN0aW9ucyB0aGF0IGlzIHJlbGF0ZWQgdG8gaGFwcGVuZWQgZXZlbnQuCisgKglSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MgYW5kIDEgZm9yIGZhaWx1cmUgb2YgYXQgbGVhc3Qgb25lIGFjdGlvbi4KKyAqLworc3RhdGljIGludCBsbGNfZXhlY19zYXBfdHJhbnNfYWN0aW9ucyhzdHJ1Y3QgbGxjX3NhcCAqc2FwLAorCQkJCSAgICAgIHN0cnVjdCBsbGNfc2FwX3N0YXRlX3RyYW5zICp0cmFucywKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCByYyA9IDA7CisJbGxjX3NhcF9hY3Rpb25fdCAqbmV4dF9hY3Rpb24gPSB0cmFucy0+ZXZfYWN0aW9uczsKKworCWZvciAoOyBuZXh0X2FjdGlvbiAmJiAqbmV4dF9hY3Rpb247IG5leHRfYWN0aW9uKyspCisJCWlmICgoKm5leHRfYWN0aW9uKShzYXAsIHNrYikpCisJCQlyYyA9IDE7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqCWxsY19zYXBfbmV4dF9zdGF0ZSAtIGZpbmRzIHRyYW5zaXRpb24sIGV4ZWNzIGFjdGlvbnMgJiBjaGFuZ2UgU0FQIHN0YXRlCisgKglAc2FwOiBwb2ludGVyIHRvIFNBUAorICoJQHNrYjogaGFwcGVuZWQgZXZlbnQKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGZpbmRzIHRyYW5zaXRpb24gdGhhdCBtYXRjaGVzIHdpdGggaGFwcGVuZWQgZXZlbnQsIHRoZW4KKyAqCWV4ZWN1dGVzIHJlbGF0ZWQgYWN0aW9ucyBhbmQgZmluYWxseSBjaGFuZ2VzIHN0YXRlIG9mIFNBUC4gSXQgcmV0dXJucworICoJMCBvbiBzdWNjZXNzIGFuZCAxIGZvciBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGxsY19zYXBfbmV4dF9zdGF0ZShzdHJ1Y3QgbGxjX3NhcCAqc2FwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCByYyA9IDE7CisJc3RydWN0IGxsY19zYXBfc3RhdGVfdHJhbnMgKnRyYW5zOworCisJaWYgKHNhcC0+c3RhdGUgPiBMTENfTlJfU0FQX1NUQVRFUykKKwkJZ290byBvdXQ7CisJdHJhbnMgPSBsbGNfZmluZF9zYXBfdHJhbnMoc2FwLCBza2IpOworCWlmICghdHJhbnMpCisJCWdvdG8gb3V0OworCS8qCisJICogR290IHRoZSBzdGF0ZSB0byB3aGljaCB3ZSBuZXh0IHRyYW5zaXRpb247IHBlcmZvcm0gdGhlIGFjdGlvbnMKKwkgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2l0aW9uIGJlZm9yZSBhY3R1YWxseSB0cmFuc2l0aW9uaW5nIHRvIHRoZQorCSAqIG5leHQgc3RhdGUKKwkgKi8KKwlyYyA9IGxsY19leGVjX3NhcF90cmFuc19hY3Rpb25zKHNhcCwgdHJhbnMsIHNrYik7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKwkvKgorCSAqIFRyYW5zaXRpb24gU0FQIHRvIG5leHQgc3RhdGUgaWYgYWxsIGFjdGlvbnMgZXhlY3V0ZSBzdWNjZXNzZnVsbHkKKwkgKi8KKwlzYXAtPnN0YXRlID0gdHJhbnMtPm5leHRfc3RhdGU7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqCWxsY19zYXBfc3RhdGVfcHJvY2VzcyAtIHNlbmRzIGV2ZW50IHRvIFNBUCBzdGF0ZSBtYWNoaW5lCisgKglAc2FwOiBzYXAgdG8gdXNlCisgKglAc2tiOiBwb2ludGVyIHRvIG9jY3VycmVkIGV2ZW50CisgKgorICoJQWZ0ZXIgZXhlY3V0aW5nIGFjdGlvbnMgb2YgdGhlIGV2ZW50LCB1cHBlciBsYXllciB3aWxsIGJlIGluZGljYXRlZAorICoJaWYgbmVlZGVkKG9uIHJlY2VpdmluZyBhbiBVSSBmcmFtZSkuIHNrIGNhbiBiZSBudWxsIGZvciB0aGUKKyAqCWRhdGFsaW5rX3Byb3RvIGNhc2UuCisgKi8KK3N0YXRpYyB2b2lkIGxsY19zYXBfc3RhdGVfcHJvY2VzcyhzdHJ1Y3QgbGxjX3NhcCAqc2FwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfc2FwX3N0YXRlX2V2ICpldiA9IGxsY19zYXBfZXYoc2tiKTsKKworCS8qCisJICogV2UgaGF2ZSB0byBob2xkIHRoZSBza2IsIGJlY2F1c2UgbGxjX3NhcF9uZXh0X3N0YXRlCisJICogd2lsbCBrZnJlZSBpdCBpbiB0aGUgc2VuZGluZyBwYXRoIGFuZCB3ZSBuZWVkIHRvCisJICogbG9vayBhdCB0aGUgc2tiLT5jYiwgd2hlcmUgd2UgZW5jb2RlIGxsY19zYXBfc3RhdGVfZXYuCisJICovCisJc2tiX2dldChza2IpOworCWV2LT5pbmRfY2ZtX2ZsYWcgPSAwOworCWxsY19zYXBfbmV4dF9zdGF0ZShzYXAsIHNrYik7CisJaWYgKGV2LT5pbmRfY2ZtX2ZsYWcgPT0gTExDX0lORCkgeworCQlpZiAoc2tiLT5zay0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTikKKwkJCWtmcmVlX3NrYihza2IpOworCQllbHNlIHsKKwkJCWxsY19zYXZlX3ByaW1pdGl2ZShza2IsIGV2LT5wcmltKTsKKworCQkJLyogcXVldWUgc2tiIHRvIHRoZSB1c2VyLiAqLworCQkJaWYgKHNvY2tfcXVldWVfcmN2X3NrYihza2ItPnNrLCBza2IpKQorCQkJCWtmcmVlX3NrYihza2IpOworCQl9CisJfSAKKwlrZnJlZV9za2Ioc2tiKTsKK30KKworLyoqCisgKglsbGNfYnVpbGRfYW5kX3NlbmRfdGVzdF9wa3QgLSBURVNUIGludGVyZmFjZSBmb3IgdXBwZXIgbGF5ZXJzLgorICoJQHNhcDogc2FwIHRvIHVzZQorICoJQHNrYjogcGFja2V0IHRvIHNlbmQKKyAqCUBkbWFjOiBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcworICoJQGRzYXA6IGRlc3RpbmF0aW9uIHNhcAorICoKKyAqCVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdXBwZXIgbGF5ZXIgd2FudHMgdG8gc2VuZCBhIFRFU1QgcGR1LgorICoJUmV0dXJucyAwIGZvciBzdWNjZXNzLCAxIG90aGVyd2lzZS4KKyAqLwordm9pZCBsbGNfYnVpbGRfYW5kX3NlbmRfdGVzdF9wa3Qoc3RydWN0IGxsY19zYXAgKnNhcCwgCisJCQkJIHN0cnVjdCBza19idWZmICpza2IsIHU4ICpkbWFjLCB1OCBkc2FwKQoreworCXN0cnVjdCBsbGNfc2FwX3N0YXRlX2V2ICpldiA9IGxsY19zYXBfZXYoc2tiKTsKKworCWV2LT5zYWRkci5sc2FwID0gc2FwLT5sYWRkci5sc2FwOworCWV2LT5kYWRkci5sc2FwID0gZHNhcDsKKwltZW1jcHkoZXYtPnNhZGRyLm1hYywgc2tiLT5kZXYtPmRldl9hZGRyLCBJRkhXQUREUkxFTik7CisJbWVtY3B5KGV2LT5kYWRkci5tYWMsIGRtYWMsIElGSFdBRERSTEVOKTsKKwkKKwlldi0+dHlwZSAgICAgID0gTExDX1NBUF9FVl9UWVBFX1BSSU07CisJZXYtPnByaW0gICAgICA9IExMQ19URVNUX1BSSU07CisJZXYtPnByaW1fdHlwZSA9IExMQ19QUklNX1RZUEVfUkVROworCWxsY19zYXBfc3RhdGVfcHJvY2VzcyhzYXAsIHNrYik7Cit9CisKKy8qKgorICoJbGxjX2J1aWxkX2FuZF9zZW5kX3hpZF9wa3QgLSBYSUQgaW50ZXJmYWNlIGZvciB1cHBlciBsYXllcnMKKyAqCUBzYXA6IHNhcCB0byB1c2UKKyAqCUBza2I6IHBhY2tldCB0byBzZW5kCisgKglAZG1hYzogZGVzdGluYXRpb24gbWFjIGFkZHJlc3MKKyAqCUBkc2FwOiBkZXN0aW5hdGlvbiBzYXAKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHVwcGVyIGxheWVyIHdhbnRzIHRvIHNlbmQgYSBYSUQgcGR1LgorICoJUmV0dXJucyAwIGZvciBzdWNjZXNzLCAxIG90aGVyd2lzZS4KKyAqLwordm9pZCBsbGNfYnVpbGRfYW5kX3NlbmRfeGlkX3BrdChzdHJ1Y3QgbGxjX3NhcCAqc2FwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCXU4ICpkbWFjLCB1OCBkc2FwKQoreworCXN0cnVjdCBsbGNfc2FwX3N0YXRlX2V2ICpldiA9IGxsY19zYXBfZXYoc2tiKTsKKworCWV2LT5zYWRkci5sc2FwID0gc2FwLT5sYWRkci5sc2FwOworCWV2LT5kYWRkci5sc2FwID0gZHNhcDsKKwltZW1jcHkoZXYtPnNhZGRyLm1hYywgc2tiLT5kZXYtPmRldl9hZGRyLCBJRkhXQUREUkxFTik7CisJbWVtY3B5KGV2LT5kYWRkci5tYWMsIGRtYWMsIElGSFdBRERSTEVOKTsKKworCWV2LT50eXBlICAgICAgPSBMTENfU0FQX0VWX1RZUEVfUFJJTTsKKwlldi0+cHJpbSAgICAgID0gTExDX1hJRF9QUklNOworCWV2LT5wcmltX3R5cGUgPSBMTENfUFJJTV9UWVBFX1JFUTsKKwlsbGNfc2FwX3N0YXRlX3Byb2Nlc3Moc2FwLCBza2IpOworfQorCisvKioKKyAqCWxsY19zYXBfcmN2IC0gc2VuZHMgcmVjZWl2ZWQgcGR1cyB0byB0aGUgc2FwIHN0YXRlIG1hY2hpbmUKKyAqCUBzYXA6IGN1cnJlbnQgc2FwIGNvbXBvbmVudCBzdHJ1Y3R1cmUuCisgKglAc2tiOiByZWNlaXZlZCBmcmFtZS4KKyAqCisgKglTZW5kcyByZWNlaXZlZCBwZHVzIHRvIHRoZSBzYXAgc3RhdGUgbWFjaGluZS4KKyAqLworc3RhdGljIHZvaWQgbGxjX3NhcF9yY3Yoc3RydWN0IGxsY19zYXAgKnNhcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX3NhcF9zdGF0ZV9ldiAqZXYgPSBsbGNfc2FwX2V2KHNrYik7CisKKwlldi0+dHlwZSAgID0gTExDX1NBUF9FVl9UWVBFX1BEVTsKKwlldi0+cmVhc29uID0gMDsKKwlsbGNfc2FwX3N0YXRlX3Byb2Nlc3Moc2FwLCBza2IpOworfQorCisvKioKKyAqCWxsY19sb29rdXBfZGdyYW0gLSBGaW5kcyBkZ3JhbSBzb2NrZXQgZm9yIHRoZSBsb2NhbCBzYXAvbWFjCisgKglAc2FwOiBTQVAKKyAqCUBsYWRkcjogYWRkcmVzcyBvZiBsb2NhbCBMTEMgKE1BQyArIFNBUCkKKyAqCisgKglTZWFyY2ggc29ja2V0IGxpc3Qgb2YgdGhlIFNBUCBhbmQgZmluZHMgY29ubmVjdGlvbiB1c2luZyB0aGUgbG9jYWwKKyAqCW1hYywgYW5kIGxvY2FsIHNhcC4gUmV0dXJucyBwb2ludGVyIGZvciBzb2NrZXQgZm91bmQsICVOVUxMIG90aGVyd2lzZS4KKyAqLworc3RhdGljIHN0cnVjdCBzb2NrICpsbGNfbG9va3VwX2RncmFtKHN0cnVjdCBsbGNfc2FwICpzYXAsCisJCQkJICAgICBzdHJ1Y3QgbGxjX2FkZHIgKmxhZGRyKQoreworCXN0cnVjdCBzb2NrICpyYzsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCXJlYWRfbG9ja19iaCgmc2FwLT5za19saXN0LmxvY2spOworCXNrX2Zvcl9lYWNoKHJjLCBub2RlLCAmc2FwLT5za19saXN0Lmxpc3QpIHsKKwkJc3RydWN0IGxsY19zb2NrICpsbGMgPSBsbGNfc2socmMpOworCisJCWlmIChyYy0+c2tfdHlwZSA9PSBTT0NLX0RHUkFNICYmCisJCSAgICBsbGMtPmxhZGRyLmxzYXAgPT0gbGFkZHItPmxzYXAgJiYKKwkJICAgIGxsY19tYWNfbWF0Y2gobGxjLT5sYWRkci5tYWMsIGxhZGRyLT5tYWMpKSB7CisJCQlzb2NrX2hvbGQocmMpOworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKwlyYyA9IE5VTEw7Citmb3VuZDoKKwlyZWFkX3VubG9ja19iaCgmc2FwLT5za19saXN0LmxvY2spOworCXJldHVybiByYzsKK30KKwordm9pZCBsbGNfc2FwX2hhbmRsZXIoc3RydWN0IGxsY19zYXAgKnNhcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX2FkZHIgbGFkZHI7CisJc3RydWN0IHNvY2sgKnNrOworCisJbGxjX3BkdV9kZWNvZGVfZGEoc2tiLCBsYWRkci5tYWMpOworCWxsY19wZHVfZGVjb2RlX2RzYXAoc2tiLCAmbGFkZHIubHNhcCk7CisKKwlzayA9IGxsY19sb29rdXBfZGdyYW0oc2FwLCAmbGFkZHIpOworCWlmIChzaykgeworCQlza2ItPnNrID0gc2s7CisJCWxsY19zYXBfcmN2KHNhcCwgc2tiKTsKKwkJc29ja19wdXQoc2spOworCX0gZWxzZQorCQlrZnJlZV9za2Ioc2tiKTsKK30KZGlmZiAtLWdpdCBhL25ldC9sbGMvbGxjX3N0YXRpb24uYyBiL25ldC9sbGMvbGxjX3N0YXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmU0OGEyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2xsYy9sbGNfc3RhdGlvbi5jCkBAIC0wLDAgKzEsNzEzIEBACisvKgorICogbGxjX3N0YXRpb24uYyAtIHN0YXRpb24gY29tcG9uZW50IG9mIExMQworICoKKyAqIENvcHlyaWdodCAoYykgMTk5NyBieSBQcm9jb20gVGVjaG5vbG9neSwgSW5jLgorICogCQkgMjAwMS0yMDAzIGJ5IEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBjYW4gYmUgcmVkaXN0cmlidXRlZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSBvciBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuCisgKgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPG5ldC9sbGMuaD4KKyNpbmNsdWRlIDxuZXQvbGxjX3NhcC5oPgorI2luY2x1ZGUgPG5ldC9sbGNfY29ubi5oPgorI2luY2x1ZGUgPG5ldC9sbGNfY19hYy5oPgorI2luY2x1ZGUgPG5ldC9sbGNfc19hYy5oPgorI2luY2x1ZGUgPG5ldC9sbGNfY19ldi5oPgorI2luY2x1ZGUgPG5ldC9sbGNfY19zdC5oPgorI2luY2x1ZGUgPG5ldC9sbGNfc19ldi5oPgorI2luY2x1ZGUgPG5ldC9sbGNfc19zdC5oPgorI2luY2x1ZGUgPG5ldC9sbGNfcGR1Lmg+CisKKy8qKgorICogc3RydWN0IGxsY19zdGF0aW9uIC0gTExDIHN0YXRpb24gY29tcG9uZW50CisgKgorICogU0FQIGFuZCBjb25uZWN0aW9uIHJlc291cmNlIG1hbmFnZXIsIG9uZSBwZXIgYWRhcHRlci4KKyAqCisgKiBAc3RhdGUgLSBzdGF0ZSBvZiBzdGF0aW9uCisgKiBAeGlkX3JfY291bnQgLSBYSUQgcmVzcG9uc2UgUERVIGNvdW50ZXIKKyAqIEBtYWNfc2EgLSBNQUMgc291cmNlIGFkZHJlc3MKKyAqIEBzYXBfbGlzdCAtIGxpc3Qgb2YgcmVsYXRlZCBTQVBzCisgKiBAZXZfcSAtIGV2ZW50cyBlbnRlcmluZyBzdGF0ZSBtYWNoLgorICogQG1hY19wZHVfcSAtIFBEVXMgcmVhZHkgdG8gc2VuZCB0byBNQUMKKyAqLworc3RydWN0IGxsY19zdGF0aW9uIHsKKwl1OAkJCSAgICBzdGF0ZTsKKwl1OAkJCSAgICB4aWRfcl9jb3VudDsKKwlzdHJ1Y3QgdGltZXJfbGlzdAkgICAgYWNrX3RpbWVyOworCXU4CQkJICAgIHJldHJ5X2NvdW50OworCXU4CQkJICAgIG1heGltdW1fcmV0cnk7CisJc3RydWN0IHsKKwkJc3RydWN0IHNrX2J1ZmZfaGVhZCBsaXN0OworCQlzcGlubG9ja190CSAgICBsb2NrOworCX0gZXZfcTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCSAgICBtYWNfcGR1X3E7Cit9OworCisvKiBUeXBlcyBvZiBldmVudHMgKHBvc3NpYmxlIHZhbHVlcyBpbiAnZXYtPnR5cGUnKSAqLworI2RlZmluZSBMTENfU1RBVElPTl9FVl9UWVBFX1NJTVBMRQkxCisjZGVmaW5lIExMQ19TVEFUSU9OX0VWX1RZUEVfQ09ORElUSU9OCTIKKyNkZWZpbmUgTExDX1NUQVRJT05fRVZfVFlQRV9QUklNCTMKKyNkZWZpbmUgTExDX1NUQVRJT05fRVZfVFlQRV9QRFUJCTQgICAgICAgLyogY29tbWFuZC9yZXNwb25zZSBQRFUgKi8KKyNkZWZpbmUgTExDX1NUQVRJT05fRVZfVFlQRV9BQ0tfVE1SCTUKKyNkZWZpbmUgTExDX1NUQVRJT05fRVZfVFlQRV9SUFRfU1RBVFVTCTYKKworLyogRXZlbnRzICovCisjZGVmaW5lIExMQ19TVEFUSU9OX0VWX0VOQUJMRV9XSVRIX0RVUF9BRERSX0NIRUNLCQkxCisjZGVmaW5lIExMQ19TVEFUSU9OX0VWX0VOQUJMRV9XSVRIT1VUX0RVUF9BRERSX0NIRUNLCQkyCisjZGVmaW5lIExMQ19TVEFUSU9OX0VWX0FDS19UTVJfRVhQX0xUX1JFVFJZX0NOVF9NQVhfUkVUUlkJMworI2RlZmluZSBMTENfU1RBVElPTl9FVl9BQ0tfVE1SX0VYUF9FUV9SRVRSWV9DTlRfTUFYX1JFVFJZCTQKKyNkZWZpbmUgTExDX1NUQVRJT05fRVZfUlhfTlVMTF9EU0FQX1hJRF9DCQkJNQorI2RlZmluZSBMTENfU1RBVElPTl9FVl9SWF9OVUxMX0RTQVBfMF9YSURfUl9YSURfUl9DTlRfRVEJNgorI2RlZmluZSBMTENfU1RBVElPTl9FVl9SWF9OVUxMX0RTQVBfMV9YSURfUl9YSURfUl9DTlRfRVEJNworI2RlZmluZSBMTENfU1RBVElPTl9FVl9SWF9OVUxMX0RTQVBfVEVTVF9DCQkJOAorI2RlZmluZSBMTENfU1RBVElPTl9FVl9ESVNBQkxFX1JFUQkJCQk5CisKK3N0cnVjdCBsbGNfc3RhdGlvbl9zdGF0ZV9ldiB7CisJdTgJCSB0eXBlOworCXU4CQkgcHJpbTsKKwl1OAkJIHByaW1fdHlwZTsKKwl1OAkJIHJlYXNvbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7IC8qIG5vZGUgaW4gc3RhdGlvbi0+ZXZfcS5saXN0ICovCit9OworCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgbGxjX3N0YXRpb25fc3RhdGVfZXYgKgorCQkJCQlsbGNfc3RhdGlvbl9ldihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAoc3RydWN0IGxsY19zdGF0aW9uX3N0YXRlX2V2ICopc2tiLT5jYjsKK30KKwordHlwZWRlZiBpbnQgKCpsbGNfc3RhdGlvbl9ldl90KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworI2RlZmluZSBMTENfU1RBVElPTl9TVEFURV9ET1dOCQkxCS8qIGluaXRpYWwgc3RhdGUgKi8KKyNkZWZpbmUgTExDX1NUQVRJT05fU1RBVEVfRFVQX0FERFJfQ0hLCTIKKyNkZWZpbmUgTExDX1NUQVRJT05fU1RBVEVfVVAJCTMKKworI2RlZmluZSBMTENfTkJSX1NUQVRJT05fU1RBVEVTCQkzCS8qIHNpemUgb2Ygc3RhdGUgdGFibGUgKi8KKwordHlwZWRlZiBpbnQgKCpsbGNfc3RhdGlvbl9hY3Rpb25fdCkoc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKy8qIFN0YXRpb24gY29tcG9uZW50IHN0YXRlIHRhYmxlIHN0cnVjdHVyZSAqLworc3RydWN0IGxsY19zdGF0aW9uX3N0YXRlX3RyYW5zIHsKKwlsbGNfc3RhdGlvbl9ldl90IGV2OworCXU4IG5leHRfc3RhdGU7CisJbGxjX3N0YXRpb25fYWN0aW9uX3QgKmV2X2FjdGlvbnM7Cit9OworCitzdHJ1Y3QgbGxjX3N0YXRpb25fc3RhdGUgeworCXU4IGN1cnJfc3RhdGU7CisJc3RydWN0IGxsY19zdGF0aW9uX3N0YXRlX3RyYW5zICoqdHJhbnNpdGlvbnM7Cit9OworCitzdGF0aWMgc3RydWN0IGxsY19zdGF0aW9uIGxsY19tYWluX3N0YXRpb247CisKK3N0YXRpYyBpbnQgbGxjX3N0YXRfZXZfZW5hYmxlX3dpdGhfZHVwX2FkZHJfY2hlY2soc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX3N0YXRpb25fc3RhdGVfZXYgKmV2ID0gbGxjX3N0YXRpb25fZXYoc2tiKTsJCisJCisJcmV0dXJuIGV2LT50eXBlID09IExMQ19TVEFUSU9OX0VWX1RZUEVfU0lNUExFICYmCisJICAgICAgIGV2LT5wcmltX3R5cGUgPT0KKwkgICAgICAgCQkgICAgICBMTENfU1RBVElPTl9FVl9FTkFCTEVfV0lUSF9EVVBfQUREUl9DSEVDSyA/IDAgOiAxOworfQorCitzdGF0aWMgaW50IGxsY19zdGF0X2V2X2VuYWJsZV93aXRob3V0X2R1cF9hZGRyX2NoZWNrKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19zdGF0aW9uX3N0YXRlX2V2ICpldiA9IGxsY19zdGF0aW9uX2V2KHNrYik7CQorCQorCXJldHVybiBldi0+dHlwZSA9PSBMTENfU1RBVElPTl9FVl9UWVBFX1NJTVBMRSAmJgorCSAgICAgICBldi0+cHJpbV90eXBlID09CisJCQlMTENfU1RBVElPTl9FVl9FTkFCTEVfV0lUSE9VVF9EVVBfQUREUl9DSEVDSyA/IDAgOiAxOworfQorCitzdGF0aWMgaW50IGxsY19zdGF0X2V2X2Fja190bXJfZXhwX2x0X3JldHJ5X2NudF9tYXhfcmV0cnkoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGxjX3N0YXRpb25fc3RhdGVfZXYgKmV2ID0gbGxjX3N0YXRpb25fZXYoc2tiKTsJCisJCisJcmV0dXJuIGV2LT50eXBlID09IExMQ19TVEFUSU9OX0VWX1RZUEVfQUNLX1RNUiAmJgorCQlsbGNfbWFpbl9zdGF0aW9uLnJldHJ5X2NvdW50IDwKKwkJbGxjX21haW5fc3RhdGlvbi5tYXhpbXVtX3JldHJ5ID8gMCA6IDE7Cit9CisKK3N0YXRpYyBpbnQgbGxjX3N0YXRfZXZfYWNrX3Rtcl9leHBfZXFfcmV0cnlfY250X21heF9yZXRyeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfc3RhdGlvbl9zdGF0ZV9ldiAqZXYgPSBsbGNfc3RhdGlvbl9ldihza2IpOwkKKwkKKwlyZXR1cm4gZXYtPnR5cGUgPT0gTExDX1NUQVRJT05fRVZfVFlQRV9BQ0tfVE1SICYmCisJCWxsY19tYWluX3N0YXRpb24ucmV0cnlfY291bnQgPT0KKwkJbGxjX21haW5fc3RhdGlvbi5tYXhpbXVtX3JldHJ5ID8gMCA6IDE7Cit9CisKK3N0YXRpYyBpbnQgbGxjX3N0YXRfZXZfcnhfbnVsbF9kc2FwX3hpZF9jKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19zdGF0aW9uX3N0YXRlX2V2ICpldiA9IGxsY19zdGF0aW9uX2V2KHNrYik7CQorCXN0cnVjdCBsbGNfcGR1X3VuICpwZHUgPSBsbGNfcGR1X3VuX2hkcihza2IpOworCisJcmV0dXJuIGV2LT50eXBlID09IExMQ19TVEFUSU9OX0VWX1RZUEVfUERVICYmCisJICAgICAgIExMQ19QRFVfSVNfQ01EKHBkdSkgJiYJCQkvKiBjb21tYW5kIFBEVSAqLworCSAgICAgICBMTENfUERVX1RZUEVfSVNfVShwZHUpICYmCQkvKiBVIHR5cGUgUERVICovCisJICAgICAgIExMQ19VX1BEVV9DTUQocGR1KSA9PSBMTENfMV9QRFVfQ01EX1hJRCAmJgorCSAgICAgICAhcGR1LT5kc2FwID8gMCA6IDE7CQkJLyogTlVMTCBEU0FQIHZhbHVlICovCit9CisKK3N0YXRpYyBpbnQgbGxjX3N0YXRfZXZfcnhfbnVsbF9kc2FwXzBfeGlkX3JfeGlkX3JfY250X2VxKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19zdGF0aW9uX3N0YXRlX2V2ICpldiA9IGxsY19zdGF0aW9uX2V2KHNrYik7CisJc3RydWN0IGxsY19wZHVfdW4gKnBkdSA9IGxsY19wZHVfdW5faGRyKHNrYik7CisKKwlyZXR1cm4gZXYtPnR5cGUgPT0gTExDX1NUQVRJT05fRVZfVFlQRV9QRFUgJiYKKwkgICAgICAgTExDX1BEVV9JU19SU1AocGR1KSAmJgkJCS8qIHJlc3BvbnNlIFBEVSAqLworCSAgICAgICBMTENfUERVX1RZUEVfSVNfVShwZHUpICYmCQkvKiBVIHR5cGUgUERVICovCisJICAgICAgIExMQ19VX1BEVV9SU1AocGR1KSA9PSBMTENfMV9QRFVfQ01EX1hJRCAmJgorCSAgICAgICAhcGR1LT5kc2FwICYmCQkJCS8qIE5VTEwgRFNBUCB2YWx1ZSAqLworCSAgICAgICAhbGxjX21haW5fc3RhdGlvbi54aWRfcl9jb3VudCA/IDAgOiAxOworfQorCitzdGF0aWMgaW50IGxsY19zdGF0X2V2X3J4X251bGxfZHNhcF8xX3hpZF9yX3hpZF9yX2NudF9lcShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfc3RhdGlvbl9zdGF0ZV9ldiAqZXYgPSBsbGNfc3RhdGlvbl9ldihza2IpOworCXN0cnVjdCBsbGNfcGR1X3VuICpwZHUgPSBsbGNfcGR1X3VuX2hkcihza2IpOworCisJcmV0dXJuIGV2LT50eXBlID09IExMQ19TVEFUSU9OX0VWX1RZUEVfUERVICYmCisJICAgICAgIExMQ19QRFVfSVNfUlNQKHBkdSkgJiYJCQkvKiByZXNwb25zZSBQRFUgKi8KKwkgICAgICAgTExDX1BEVV9UWVBFX0lTX1UocGR1KSAmJgkJLyogVSB0eXBlIFBEVSAqLworCSAgICAgICBMTENfVV9QRFVfUlNQKHBkdSkgPT0gTExDXzFfUERVX0NNRF9YSUQgJiYKKwkgICAgICAgIXBkdS0+ZHNhcCAmJgkJCQkvKiBOVUxMIERTQVAgdmFsdWUgKi8KKwkgICAgICAgbGxjX21haW5fc3RhdGlvbi54aWRfcl9jb3VudCA9PSAxID8gMCA6IDE7Cit9CisKK3N0YXRpYyBpbnQgbGxjX3N0YXRfZXZfcnhfbnVsbF9kc2FwX3Rlc3RfYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfc3RhdGlvbl9zdGF0ZV9ldiAqZXYgPSBsbGNfc3RhdGlvbl9ldihza2IpOworCXN0cnVjdCBsbGNfcGR1X3VuICpwZHUgPSBsbGNfcGR1X3VuX2hkcihza2IpOworCisJcmV0dXJuIGV2LT50eXBlID09IExMQ19TVEFUSU9OX0VWX1RZUEVfUERVICYmCisJICAgICAgIExMQ19QRFVfSVNfQ01EKHBkdSkgJiYJCQkvKiBjb21tYW5kIFBEVSAqLworCSAgICAgICBMTENfUERVX1RZUEVfSVNfVShwZHUpICYmCQkvKiBVIHR5cGUgUERVICovCisJICAgICAgIExMQ19VX1BEVV9DTUQocGR1KSA9PSBMTENfMV9QRFVfQ01EX1RFU1QgJiYKKwkgICAgICAgIXBkdS0+ZHNhcCA/IDAgOiAxOwkJCS8qIE5VTEwgRFNBUCAqLworfQorCitzdGF0aWMgaW50IGxsY19zdGF0X2V2X2Rpc2FibGVfcmVxKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19zdGF0aW9uX3N0YXRlX2V2ICpldiA9IGxsY19zdGF0aW9uX2V2KHNrYik7CisKKwlyZXR1cm4gZXYtPnR5cGUgPT0gTExDX1NUQVRJT05fRVZfVFlQRV9QUklNICYmCisJICAgICAgIGV2LT5wcmltID09IExMQ19ESVNBQkxFX1BSSU0gJiYKKwkgICAgICAgZXYtPnByaW1fdHlwZSA9PSBMTENfUFJJTV9UWVBFX1JFUSA/IDAgOiAxOworfQorCisvKioKKyAqCWxsY19zdGF0aW9uX3NlbmRfcGR1IC0gcXVldWVzIFBEVSB0byBzZW5kCisgKglAc2tiOiBBZGRyZXNzIG9mIHRoZSBQRFUKKyAqCisgKglRdWV1ZXMgYSBQRFUgdG8gc2VuZCB0byB0aGUgTUFDIGxheWVyLgorICovCitzdGF0aWMgdm9pZCBsbGNfc3RhdGlvbl9zZW5kX3BkdShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNrYl9xdWV1ZV90YWlsKCZsbGNfbWFpbl9zdGF0aW9uLm1hY19wZHVfcSwgc2tiKTsKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZsbGNfbWFpbl9zdGF0aW9uLm1hY19wZHVfcSkpICE9IE5VTEwpCisJCWlmIChkZXZfcXVldWVfeG1pdChza2IpKQorCQkJYnJlYWs7Cit9CisKK3N0YXRpYyBpbnQgbGxjX3N0YXRpb25fYWNfc3RhcnRfYWNrX3RpbWVyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJbW9kX3RpbWVyKCZsbGNfbWFpbl9zdGF0aW9uLmFja190aW1lciwgamlmZmllcyArIExMQ19BQ0tfVElNRSAqIEhaKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsbGNfc3RhdGlvbl9hY19zZXRfcmV0cnlfY250XzAoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlsbGNfbWFpbl9zdGF0aW9uLnJldHJ5X2NvdW50ID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsbGNfc3RhdGlvbl9hY19pbmNfcmV0cnlfY250X2J5XzEoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlsbGNfbWFpbl9zdGF0aW9uLnJldHJ5X2NvdW50Kys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGxjX3N0YXRpb25fYWNfc2V0X3hpZF9yX2NudF8wKHN0cnVjdCBza19idWZmICpza2IpCit7CisJbGxjX21haW5fc3RhdGlvbi54aWRfcl9jb3VudCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGxjX3N0YXRpb25fYWNfaW5jX3hpZF9yX2NudF9ieV8xKHN0cnVjdCBza19idWZmICpza2IpCit7CisJbGxjX21haW5fc3RhdGlvbi54aWRfcl9jb3VudCsrOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxsY19zdGF0aW9uX2FjX3NlbmRfbnVsbF9kc2FwX3hpZF9jKHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHJjID0gMTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiA9IGxsY19hbGxvY19mcmFtZSgpOworCisJaWYgKCFuc2tiKQorCQlnb3RvIG91dDsKKwlsbGNfcGR1X2hlYWRlcl9pbml0KG5za2IsIExMQ19QRFVfVFlQRV9VLCAwLCAwLCBMTENfUERVX0NNRCk7CisJbGxjX3BkdV9pbml0X2FzX3hpZF9jbWQobnNrYiwgTExDX1hJRF9OVUxMX0NMQVNTXzIsIDEyNyk7CisJcmMgPSBsbGNfbWFjX2hkcl9pbml0KG5za2IsIGxsY19zdGF0aW9uX21hY19zYSwgbGxjX3N0YXRpb25fbWFjX3NhKTsKKwlpZiAocmMpCisJCWdvdG8gZnJlZTsKKwlsbGNfc3RhdGlvbl9zZW5kX3BkdShuc2tiKTsKK291dDoKKwlyZXR1cm4gcmM7CitmcmVlOgorCWtmcmVlX3NrYihza2IpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50IGxsY19zdGF0aW9uX2FjX3NlbmRfeGlkX3Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1OCBtYWNfZGFbRVRIX0FMRU5dLCBkc2FwOworCWludCByYyA9IDE7CisJc3RydWN0IHNrX2J1ZmYqIG5za2IgPSBsbGNfYWxsb2NfZnJhbWUoKTsKKworCWlmICghbnNrYikKKwkJZ290byBvdXQ7CisJcmMgPSAwOworCW5za2ItPmRldiA9IHNrYi0+ZGV2OworCWxsY19wZHVfZGVjb2RlX3NhKHNrYiwgbWFjX2RhKTsKKwlsbGNfcGR1X2RlY29kZV9zc2FwKHNrYiwgJmRzYXApOworCWxsY19wZHVfaGVhZGVyX2luaXQobnNrYiwgTExDX1BEVV9UWVBFX1UsIDAsIGRzYXAsIExMQ19QRFVfUlNQKTsKKwlsbGNfcGR1X2luaXRfYXNfeGlkX3JzcChuc2tiLCBMTENfWElEX05VTExfQ0xBU1NfMiwgMTI3KTsKKwlyYyA9IGxsY19tYWNfaGRyX2luaXQobnNrYiwgbGxjX3N0YXRpb25fbWFjX3NhLCBtYWNfZGEpOworCWlmIChyYykKKwkJZ290byBmcmVlOworCWxsY19zdGF0aW9uX3NlbmRfcGR1KG5za2IpOworb3V0OgorCXJldHVybiByYzsKK2ZyZWU6CisJa2ZyZWVfc2tiKHNrYik7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBpbnQgbGxjX3N0YXRpb25fYWNfc2VuZF90ZXN0X3Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1OCBtYWNfZGFbRVRIX0FMRU5dLCBkc2FwOworCWludCByYyA9IDE7CisJc3RydWN0IHNrX2J1ZmYgKm5za2IgPSBsbGNfYWxsb2NfZnJhbWUoKTsKKworCWlmICghbnNrYikKKwkJZ290byBvdXQ7CisJcmMgPSAwOworCW5za2ItPmRldiA9IHNrYi0+ZGV2OworCWxsY19wZHVfZGVjb2RlX3NhKHNrYiwgbWFjX2RhKTsKKwlsbGNfcGR1X2RlY29kZV9zc2FwKHNrYiwgJmRzYXApOworCWxsY19wZHVfaGVhZGVyX2luaXQobnNrYiwgTExDX1BEVV9UWVBFX1UsIDAsIGRzYXAsIExMQ19QRFVfUlNQKTsKKyAgICAgICAJbGxjX3BkdV9pbml0X2FzX3Rlc3RfcnNwKG5za2IsIHNrYik7CisJcmMgPSBsbGNfbWFjX2hkcl9pbml0KG5za2IsIGxsY19zdGF0aW9uX21hY19zYSwgbWFjX2RhKTsKKwlpZiAocmMpCisJCWdvdG8gZnJlZTsKKwlsbGNfc3RhdGlvbl9zZW5kX3BkdShuc2tiKTsKK291dDoKKwlyZXR1cm4gcmM7CitmcmVlOgorCWtmcmVlX3NrYihza2IpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50IGxsY19zdGF0aW9uX2FjX3JlcG9ydF9zdGF0dXMoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gMDsKK30KKworLyogQ09NTU9OIFNUQVRJT04gU1RBVEUgdHJhbnNpdGlvbnMgKi8KKworLyogZHVtbXkgbGFzdC10cmFuc2l0aW9uIGluZGljYXRvcjsgY29tbW9uIHRvIGFsbCBzdGF0ZSB0cmFuc2l0aW9uIGdyb3VwcworICogbGFzdCBlbnRyeSBmb3IgdGhpcyBzdGF0ZQorICogYWxsIG1lbWJlcnMgYXJlIHplcm9zLCAuYnNzIHplcm9lcyBpdAorICovCitzdGF0aWMgc3RydWN0IGxsY19zdGF0aW9uX3N0YXRlX3RyYW5zIGxsY19zdGF0X3N0YXRlX3RyYW5zX2VuZDsKKworLyogRE9XTiBTVEFURSB0cmFuc2l0aW9ucyAqLworCisvKiBzdGF0ZSB0cmFuc2l0aW9uIGZvciBMTENfU1RBVElPTl9FVl9FTkFCTEVfV0lUSF9EVVBfQUREUl9DSEVDSyBldmVudCAqLworc3RhdGljIGxsY19zdGF0aW9uX2FjdGlvbl90IGxsY19zdGF0X2Rvd25fc3RhdGVfYWN0aW9uc18xW10gPSB7CisJWzBdID0gbGxjX3N0YXRpb25fYWNfc3RhcnRfYWNrX3RpbWVyLAorCVsxXSA9IGxsY19zdGF0aW9uX2FjX3NldF9yZXRyeV9jbnRfMCwKKwlbMl0gPSBsbGNfc3RhdGlvbl9hY19zZXRfeGlkX3JfY250XzAsCisJWzNdID0gbGxjX3N0YXRpb25fYWNfc2VuZF9udWxsX2RzYXBfeGlkX2MsCisJWzRdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX3N0YXRpb25fc3RhdGVfdHJhbnMgbGxjX3N0YXRfZG93bl9zdGF0ZV90cmFuc18xID0geworCS5ldgkgICAgPSBsbGNfc3RhdF9ldl9lbmFibGVfd2l0aF9kdXBfYWRkcl9jaGVjaywKKwkubmV4dF9zdGF0ZSA9IExMQ19TVEFUSU9OX1NUQVRFX0RVUF9BRERSX0NISywKKwkuZXZfYWN0aW9ucyA9IGxsY19zdGF0X2Rvd25fc3RhdGVfYWN0aW9uc18xLAorfTsKKworLyogc3RhdGUgdHJhbnNpdGlvbiBmb3IgTExDX1NUQVRJT05fRVZfRU5BQkxFX1dJVEhPVVRfRFVQX0FERFJfQ0hFQ0sgZXZlbnQgKi8KK3N0YXRpYyBsbGNfc3RhdGlvbl9hY3Rpb25fdCBsbGNfc3RhdF9kb3duX3N0YXRlX2FjdGlvbnNfMltdID0geworCVswXSA9IGxsY19zdGF0aW9uX2FjX3JlcG9ydF9zdGF0dXMsCS8qIFNUQVRJT04gVVAgKi8KKwlbMV0gPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBsbGNfc3RhdGlvbl9zdGF0ZV90cmFucyBsbGNfc3RhdF9kb3duX3N0YXRlX3RyYW5zXzIgPSB7CisJLmV2CSAgICA9IGxsY19zdGF0X2V2X2VuYWJsZV93aXRob3V0X2R1cF9hZGRyX2NoZWNrLAorCS5uZXh0X3N0YXRlID0gTExDX1NUQVRJT05fU1RBVEVfVVAsCisJLmV2X2FjdGlvbnMgPSBsbGNfc3RhdF9kb3duX3N0YXRlX2FjdGlvbnNfMiwKK307CisKKy8qIGFycmF5IG9mIHBvaW50ZXJzOyBvbmUgdG8gZWFjaCB0cmFuc2l0aW9uICovCitzdGF0aWMgc3RydWN0IGxsY19zdGF0aW9uX3N0YXRlX3RyYW5zICpsbGNfc3RhdF9kd25fc3RhdGVfdHJhbnNbXSA9IHsKKwlbMF0gPSAmbGxjX3N0YXRfZG93bl9zdGF0ZV90cmFuc18xLAorCVsxXSA9ICZsbGNfc3RhdF9kb3duX3N0YXRlX3RyYW5zXzIsCisJWzJdID0gJmxsY19zdGF0X3N0YXRlX3RyYW5zX2VuZCwKK307CisKKy8qIFVQIFNUQVRFIHRyYW5zaXRpb25zICovCisvKiBzdGF0ZSB0cmFuc2l0aW9uIGZvciBMTENfU1RBVElPTl9FVl9ESVNBQkxFX1JFUSBldmVudCAqLworc3RhdGljIGxsY19zdGF0aW9uX2FjdGlvbl90IGxsY19zdGF0X3VwX3N0YXRlX2FjdGlvbnNfMVtdID0geworCVswXSA9IGxsY19zdGF0aW9uX2FjX3JlcG9ydF9zdGF0dXMsCS8qIFNUQVRJT04gRE9XTiAqLworCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19zdGF0aW9uX3N0YXRlX3RyYW5zIGxsY19zdGF0X3VwX3N0YXRlX3RyYW5zXzEgPSB7CisJLmV2CSAgICA9IGxsY19zdGF0X2V2X2Rpc2FibGVfcmVxLAorCS5uZXh0X3N0YXRlID0gTExDX1NUQVRJT05fU1RBVEVfRE9XTiwKKwkuZXZfYWN0aW9ucyA9IGxsY19zdGF0X3VwX3N0YXRlX2FjdGlvbnNfMSwKK307CisKKy8qIHN0YXRlIHRyYW5zaXRpb24gZm9yIExMQ19TVEFUSU9OX0VWX1JYX05VTExfRFNBUF9YSURfQyBldmVudCAqLworc3RhdGljIGxsY19zdGF0aW9uX2FjdGlvbl90IGxsY19zdGF0X3VwX3N0YXRlX2FjdGlvbnNfMltdID0geworCVswXSA9IGxsY19zdGF0aW9uX2FjX3NlbmRfeGlkX3IsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX3N0YXRpb25fc3RhdGVfdHJhbnMgbGxjX3N0YXRfdXBfc3RhdGVfdHJhbnNfMiA9IHsKKwkuZXYJICAgID0gbGxjX3N0YXRfZXZfcnhfbnVsbF9kc2FwX3hpZF9jLAorCS5uZXh0X3N0YXRlID0gTExDX1NUQVRJT05fU1RBVEVfVVAsCisJLmV2X2FjdGlvbnMgPSBsbGNfc3RhdF91cF9zdGF0ZV9hY3Rpb25zXzIsCit9OworCisvKiBzdGF0ZSB0cmFuc2l0aW9uIGZvciBMTENfU1RBVElPTl9FVl9SWF9OVUxMX0RTQVBfVEVTVF9DIGV2ZW50ICovCitzdGF0aWMgbGxjX3N0YXRpb25fYWN0aW9uX3QgbGxjX3N0YXRfdXBfc3RhdGVfYWN0aW9uc18zW10gPSB7CisJWzBdID0gbGxjX3N0YXRpb25fYWNfc2VuZF90ZXN0X3IsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX3N0YXRpb25fc3RhdGVfdHJhbnMgbGxjX3N0YXRfdXBfc3RhdGVfdHJhbnNfMyA9IHsKKwkuZXYJICAgID0gbGxjX3N0YXRfZXZfcnhfbnVsbF9kc2FwX3Rlc3RfYywKKwkubmV4dF9zdGF0ZSA9IExMQ19TVEFUSU9OX1NUQVRFX1VQLAorCS5ldl9hY3Rpb25zID0gbGxjX3N0YXRfdXBfc3RhdGVfYWN0aW9uc18zLAorfTsKKworLyogYXJyYXkgb2YgcG9pbnRlcnM7IG9uZSB0byBlYWNoIHRyYW5zaXRpb24gKi8KK3N0YXRpYyBzdHJ1Y3QgbGxjX3N0YXRpb25fc3RhdGVfdHJhbnMgKmxsY19zdGF0X3VwX3N0YXRlX3RyYW5zIFtdID0geworCVswXSA9ICZsbGNfc3RhdF91cF9zdGF0ZV90cmFuc18xLAorCVsxXSA9ICZsbGNfc3RhdF91cF9zdGF0ZV90cmFuc18yLAorCVsyXSA9ICZsbGNfc3RhdF91cF9zdGF0ZV90cmFuc18zLAorCVszXSA9ICZsbGNfc3RhdF9zdGF0ZV90cmFuc19lbmQsCit9OworCisvKiBEVVAgQUREUiBDSEsgU1RBVEUgdHJhbnNpdGlvbnMgKi8KKy8qIHN0YXRlIHRyYW5zaXRpb24gZm9yIExMQ19TVEFUSU9OX0VWX1JYX05VTExfRFNBUF8wX1hJRF9SX1hJRF9SX0NOVF9FUQorICogZXZlbnQKKyAqLworc3RhdGljIGxsY19zdGF0aW9uX2FjdGlvbl90IGxsY19zdGF0X2R1cGFkZHJfc3RhdGVfYWN0aW9uc18xW10gPSB7CisJWzBdID0gbGxjX3N0YXRpb25fYWNfaW5jX3hpZF9yX2NudF9ieV8xLAorCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19zdGF0aW9uX3N0YXRlX3RyYW5zIGxsY19zdGF0X2R1cGFkZHJfc3RhdGVfdHJhbnNfMSA9IHsKKwkuZXYJICAgID0gbGxjX3N0YXRfZXZfcnhfbnVsbF9kc2FwXzBfeGlkX3JfeGlkX3JfY250X2VxLAorCS5uZXh0X3N0YXRlID0gTExDX1NUQVRJT05fU1RBVEVfRFVQX0FERFJfQ0hLLAorCS5ldl9hY3Rpb25zID0gbGxjX3N0YXRfZHVwYWRkcl9zdGF0ZV9hY3Rpb25zXzEsCit9OworCisvKiBzdGF0ZSB0cmFuc2l0aW9uIGZvciBMTENfU1RBVElPTl9FVl9SWF9OVUxMX0RTQVBfMV9YSURfUl9YSURfUl9DTlRfRVEKKyAqIGV2ZW50CisgKi8KK3N0YXRpYyBsbGNfc3RhdGlvbl9hY3Rpb25fdCBsbGNfc3RhdF9kdXBhZGRyX3N0YXRlX2FjdGlvbnNfMltdID0geworCVswXSA9IGxsY19zdGF0aW9uX2FjX3JlcG9ydF9zdGF0dXMsCS8qIERVUExJQ0FURSBBRERSRVNTIEZPVU5EICovCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX3N0YXRpb25fc3RhdGVfdHJhbnMgbGxjX3N0YXRfZHVwYWRkcl9zdGF0ZV90cmFuc18yID0geworCS5ldgkgICAgPSBsbGNfc3RhdF9ldl9yeF9udWxsX2RzYXBfMV94aWRfcl94aWRfcl9jbnRfZXEsCisJLm5leHRfc3RhdGUgPSBMTENfU1RBVElPTl9TVEFURV9ET1dOLAorCS5ldl9hY3Rpb25zID0gbGxjX3N0YXRfZHVwYWRkcl9zdGF0ZV9hY3Rpb25zXzIsCit9OworCisvKiBzdGF0ZSB0cmFuc2l0aW9uIGZvciBMTENfU1RBVElPTl9FVl9SWF9OVUxMX0RTQVBfWElEX0MgZXZlbnQgKi8KK3N0YXRpYyBsbGNfc3RhdGlvbl9hY3Rpb25fdCBsbGNfc3RhdF9kdXBhZGRyX3N0YXRlX2FjdGlvbnNfM1tdID0geworCVswXSA9IGxsY19zdGF0aW9uX2FjX3NlbmRfeGlkX3IsCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX3N0YXRpb25fc3RhdGVfdHJhbnMgbGxjX3N0YXRfZHVwYWRkcl9zdGF0ZV90cmFuc18zID0geworCS5ldgkgICAgPSBsbGNfc3RhdF9ldl9yeF9udWxsX2RzYXBfeGlkX2MsCisJLm5leHRfc3RhdGUgPSBMTENfU1RBVElPTl9TVEFURV9EVVBfQUREUl9DSEssCisJLmV2X2FjdGlvbnMgPSBsbGNfc3RhdF9kdXBhZGRyX3N0YXRlX2FjdGlvbnNfMywKK307CisKKy8qIHN0YXRlIHRyYW5zaXRpb24gZm9yIExMQ19TVEFUSU9OX0VWX0FDS19UTVJfRVhQX0xUX1JFVFJZX0NOVF9NQVhfUkVUUlkKKyAqIGV2ZW50CisgKi8KK3N0YXRpYyBsbGNfc3RhdGlvbl9hY3Rpb25fdCBsbGNfc3RhdF9kdXBhZGRyX3N0YXRlX2FjdGlvbnNfNFtdID0geworCVswXSA9IGxsY19zdGF0aW9uX2FjX3N0YXJ0X2Fja190aW1lciwKKwlbMV0gPSBsbGNfc3RhdGlvbl9hY19pbmNfcmV0cnlfY250X2J5XzEsCisJWzJdID0gbGxjX3N0YXRpb25fYWNfc2V0X3hpZF9yX2NudF8wLAorCVszXSA9IGxsY19zdGF0aW9uX2FjX3NlbmRfbnVsbF9kc2FwX3hpZF9jLAorCVs0XSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19zdGF0aW9uX3N0YXRlX3RyYW5zIGxsY19zdGF0X2R1cGFkZHJfc3RhdGVfdHJhbnNfNCA9IHsKKwkuZXYJICAgID0gbGxjX3N0YXRfZXZfYWNrX3Rtcl9leHBfbHRfcmV0cnlfY250X21heF9yZXRyeSwKKwkubmV4dF9zdGF0ZSA9IExMQ19TVEFUSU9OX1NUQVRFX0RVUF9BRERSX0NISywKKwkuZXZfYWN0aW9ucyA9IGxsY19zdGF0X2R1cGFkZHJfc3RhdGVfYWN0aW9uc180LAorfTsKKworLyogc3RhdGUgdHJhbnNpdGlvbiBmb3IgTExDX1NUQVRJT05fRVZfQUNLX1RNUl9FWFBfRVFfUkVUUllfQ05UX01BWF9SRVRSWQorICogZXZlbnQKKyAqLworc3RhdGljIGxsY19zdGF0aW9uX2FjdGlvbl90IGxsY19zdGF0X2R1cGFkZHJfc3RhdGVfYWN0aW9uc181W10gPSB7CisJWzBdID0gbGxjX3N0YXRpb25fYWNfcmVwb3J0X3N0YXR1cywJLyogU1RBVElPTiBVUCAqLworCVsxXSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19zdGF0aW9uX3N0YXRlX3RyYW5zIGxsY19zdGF0X2R1cGFkZHJfc3RhdGVfdHJhbnNfNSA9IHsKKwkuZXYJICAgID0gbGxjX3N0YXRfZXZfYWNrX3Rtcl9leHBfZXFfcmV0cnlfY250X21heF9yZXRyeSwKKwkubmV4dF9zdGF0ZSA9IExMQ19TVEFUSU9OX1NUQVRFX1VQLAorCS5ldl9hY3Rpb25zID0gbGxjX3N0YXRfZHVwYWRkcl9zdGF0ZV9hY3Rpb25zXzUsCit9OworCisvKiBzdGF0ZSB0cmFuc2l0aW9uIGZvciBMTENfU1RBVElPTl9FVl9ESVNBQkxFX1JFUSBldmVudCAqLworc3RhdGljIGxsY19zdGF0aW9uX2FjdGlvbl90IGxsY19zdGF0X2R1cGFkZHJfc3RhdGVfYWN0aW9uc182W10gPSB7CisJWzBdID0gbGxjX3N0YXRpb25fYWNfcmVwb3J0X3N0YXR1cywJLyogU1RBVElPTiBET1dOICovCisJWzFdID0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxjX3N0YXRpb25fc3RhdGVfdHJhbnMgbGxjX3N0YXRfZHVwYWRkcl9zdGF0ZV90cmFuc182ID0geworCS5ldgkgICAgPSBsbGNfc3RhdF9ldl9kaXNhYmxlX3JlcSwKKwkubmV4dF9zdGF0ZSA9IExMQ19TVEFUSU9OX1NUQVRFX0RPV04sCisJLmV2X2FjdGlvbnMgPSBsbGNfc3RhdF9kdXBhZGRyX3N0YXRlX2FjdGlvbnNfNiwKK307CisKKy8qIGFycmF5IG9mIHBvaW50ZXJzOyBvbmUgdG8gZWFjaCB0cmFuc2l0aW9uICovCitzdGF0aWMgc3RydWN0IGxsY19zdGF0aW9uX3N0YXRlX3RyYW5zICpsbGNfc3RhdF9kdXBhZGRyX3N0YXRlX3RyYW5zW10gPSB7CisJWzBdID0gJmxsY19zdGF0X2R1cGFkZHJfc3RhdGVfdHJhbnNfNiwJLyogUmVxdWVzdCAqLworCVsxXSA9ICZsbGNfc3RhdF9kdXBhZGRyX3N0YXRlX3RyYW5zXzQsCS8qIFRpbWVyICovCisJWzJdID0gJmxsY19zdGF0X2R1cGFkZHJfc3RhdGVfdHJhbnNfNSwKKwlbM10gPSAmbGxjX3N0YXRfZHVwYWRkcl9zdGF0ZV90cmFuc18xLAkvKiBSZWNlaXZlIGZyYW1lICovCisJWzRdID0gJmxsY19zdGF0X2R1cGFkZHJfc3RhdGVfdHJhbnNfMiwKKwlbNV0gPSAmbGxjX3N0YXRfZHVwYWRkcl9zdGF0ZV90cmFuc18zLAorCVs2XSA9ICZsbGNfc3RhdF9zdGF0ZV90cmFuc19lbmQsCit9OworCitzdGF0aWMgc3RydWN0IGxsY19zdGF0aW9uX3N0YXRlCisJCQlsbGNfc3RhdGlvbl9zdGF0ZV90YWJsZVtMTENfTkJSX1NUQVRJT05fU1RBVEVTXSA9IHsKKwlbTExDX1NUQVRJT05fU1RBVEVfRE9XTiAtIDFdID0geworCQkuY3Vycl9zdGF0ZSAgPSBMTENfU1RBVElPTl9TVEFURV9ET1dOLAorCQkudHJhbnNpdGlvbnMgPSBsbGNfc3RhdF9kd25fc3RhdGVfdHJhbnMsCisJfSwKKwlbTExDX1NUQVRJT05fU1RBVEVfRFVQX0FERFJfQ0hLIC0gMV0gPSB7CisJCS5jdXJyX3N0YXRlICA9IExMQ19TVEFUSU9OX1NUQVRFX0RVUF9BRERSX0NISywKKwkJLnRyYW5zaXRpb25zID0gbGxjX3N0YXRfZHVwYWRkcl9zdGF0ZV90cmFucywKKwl9LAorCVtMTENfU1RBVElPTl9TVEFURV9VUCAtIDFdID0geworCQkuY3Vycl9zdGF0ZSAgPSBMTENfU1RBVElPTl9TVEFURV9VUCwKKwkJLnRyYW5zaXRpb25zID0gbGxjX3N0YXRfdXBfc3RhdGVfdHJhbnMsCisJfSwKK307CisKKy8qKgorICoJbGxjX2V4ZWNfc3RhdGlvbl90cmFuc19hY3Rpb25zIC0gZXhlY3V0ZXMgYWN0aW9ucyBmb3IgdHJhbnNpdGlvbgorICoJQHRyYW5zOiBBZGRyZXNzIG9mIHRoZSB0cmFuc2l0aW9uCisgKglAc2tiOiBBZGRyZXNzIG9mIHRoZSBldmVudCB0aGF0IGNhdXNlZCB0aGUgdHJhbnNpdGlvbgorICoKKyAqCUV4ZWN1dGVzIGFjdGlvbnMgb2YgYSB0cmFuc2l0aW9uIG9mIHRoZSBzdGF0aW9uIHN0YXRlIG1hY2hpbmUuIFJldHVybnMKKyAqCTAgaWYgYWxsIGFjdGlvbnMgY29tcGxldGUgc3VjY2Vzc2Z1bGx5LCBub256ZXJvIG90aGVyd2lzZS4KKyAqLworc3RhdGljIHUxNiBsbGNfZXhlY19zdGF0aW9uX3RyYW5zX2FjdGlvbnMoc3RydWN0IGxsY19zdGF0aW9uX3N0YXRlX3RyYW5zICp0cmFucywKKwkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXUxNiByYyA9IDA7CisJbGxjX3N0YXRpb25fYWN0aW9uX3QgKm5leHRfYWN0aW9uID0gdHJhbnMtPmV2X2FjdGlvbnM7CisKKwlmb3IgKDsgbmV4dF9hY3Rpb24gJiYgKm5leHRfYWN0aW9uOyBuZXh0X2FjdGlvbisrKQorCQlpZiAoKCpuZXh0X2FjdGlvbikoc2tiKSkKKwkJCXJjID0gMTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICoJbGxjX2ZpbmRfc3RhdGlvbl90cmFucyAtIGZpbmRzIHRyYW5zaXRpb24gZm9yIHRoaXMgZXZlbnQKKyAqCUBza2I6IEFkZHJlc3Mgb2YgdGhlIGV2ZW50CisgKgorICoJU2VhcmNoIHRocnUgZXZlbnRzIG9mIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzdGF0aW9uIHVudGlsIGxpc3QKKyAqCWV4aGF1c3RlZCBvciBpdCdzIG9idmlvdXMgdGhhdCB0aGUgZXZlbnQgaXMgbm90IHZhbGlkIGZvciB0aGUgY3VycmVudAorICoJc3RhdGUuIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHRyYW5zaXRpb24gaWYgY291bmQsICVOVUxMIG90aGVyd2lzZS4KKyAqLworc3RhdGljIHN0cnVjdCBsbGNfc3RhdGlvbl9zdGF0ZV90cmFucyAqCisJCQkJbGxjX2ZpbmRfc3RhdGlvbl90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBpID0gMDsKKwlzdHJ1Y3QgbGxjX3N0YXRpb25fc3RhdGVfdHJhbnMgKnJjID0gTlVMTDsKKwlzdHJ1Y3QgbGxjX3N0YXRpb25fc3RhdGVfdHJhbnMgKipuZXh0X3RyYW5zOworCXN0cnVjdCBsbGNfc3RhdGlvbl9zdGF0ZSAqY3Vycl9zdGF0ZSA9CisJCQkJJmxsY19zdGF0aW9uX3N0YXRlX3RhYmxlW2xsY19tYWluX3N0YXRpb24uc3RhdGUgLSAxXTsKKworCWZvciAobmV4dF90cmFucyA9IGN1cnJfc3RhdGUtPnRyYW5zaXRpb25zOyBuZXh0X3RyYW5zW2ldLT5ldjsgaSsrKQorCQlpZiAoIW5leHRfdHJhbnNbaV0tPmV2KHNrYikpIHsKKwkJCXJjID0gbmV4dF90cmFuc1tpXTsKKwkJCWJyZWFrOworCQl9CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqCWxsY19zdGF0aW9uX2ZyZWVfZXYgLSBmcmVlcyBhbiBldmVudAorICoJQHNrYjogQWRkcmVzcyBvZiB0aGUgZXZlbnQKKyAqCisgKglGcmVlcyBhbiBldmVudC4KKyAqLworc3RhdGljIHZvaWQgbGxjX3N0YXRpb25fZnJlZV9ldihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfc3RhdGlvbl9zdGF0ZV9ldiAqZXYgPSBsbGNfc3RhdGlvbl9ldihza2IpOworCisJaWYgKGV2LT50eXBlID09IExMQ19TVEFUSU9OX0VWX1RZUEVfUERVKQorCQlrZnJlZV9za2Ioc2tiKTsKK30KKworLyoqCisgKglsbGNfc3RhdGlvbl9uZXh0X3N0YXRlIC0gcHJvY2Vzc2VzIGV2ZW50IGFuZCBnb2VzIHRvIHRoZSBuZXh0IHN0YXRlCisgKglAc2tiOiBBZGRyZXNzIG9mIHRoZSBldmVudAorICoKKyAqCVByb2Nlc3NlcyBhbiBldmVudCwgZXhlY3V0ZXMgYW55IHRyYW5zaXRpb25zIHJlbGF0ZWQgdG8gdGhhdCBldmVudCBhbmQKKyAqCXVwZGF0ZXMgdGhlIHN0YXRlIG9mIHRoZSBzdGF0aW9uLgorICovCitzdGF0aWMgdTE2IGxsY19zdGF0aW9uX25leHRfc3RhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1MTYgcmMgPSAxOworCXN0cnVjdCBsbGNfc3RhdGlvbl9zdGF0ZV90cmFucyAqdHJhbnM7CisKKwlpZiAobGxjX21haW5fc3RhdGlvbi5zdGF0ZSA+IExMQ19OQlJfU1RBVElPTl9TVEFURVMpCisJCWdvdG8gb3V0OworCXRyYW5zID0gbGxjX2ZpbmRfc3RhdGlvbl90cmFucyhza2IpOworCWlmICh0cmFucykgeworCQkvKiBnb3QgdGhlIHN0YXRlIHRvIHdoaWNoIHdlIG5leHQgdHJhbnNpdGlvbjsgcGVyZm9ybSB0aGUKKwkJICogYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2l0aW9uIGJlZm9yZSBhY3R1YWxseQorCQkgKiB0cmFuc2l0aW9uaW5nIHRvIHRoZSBuZXh0IHN0YXRlCisJCSAqLworCQlyYyA9IGxsY19leGVjX3N0YXRpb25fdHJhbnNfYWN0aW9ucyh0cmFucywgc2tiKTsKKwkJaWYgKCFyYykKKwkJCS8qIHRyYW5zaXRpb24gc3RhdGlvbiB0byBuZXh0IHN0YXRlIGlmIGFsbCBhY3Rpb25zCisJCQkgKiBleGVjdXRlIHN1Y2Nlc3NmdWxseTsgZG9uZTsgd2FpdCBmb3IgbmV4dCBldmVudAorCQkJICovCisJCQlsbGNfbWFpbl9zdGF0aW9uLnN0YXRlID0gdHJhbnMtPm5leHRfc3RhdGU7CisJfSBlbHNlCisJCS8qIGV2ZW50IG5vdCByZWNvZ25pemVkIGluIGN1cnJlbnQgc3RhdGU7IHJlLXF1ZXVlIGl0IGZvcgorCQkgKiBwcm9jZXNzaW5nIGFnYWluIGF0IGEgbGF0ZXIgdGltZTsgcmV0dXJuIGZhaWx1cmUKKwkJICovCisJCXJjID0gMDsKK291dDoKKwlsbGNfc3RhdGlvbl9mcmVlX2V2KHNrYik7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqCWxsY19zdGF0aW9uX3NlcnZpY2VfZXZlbnRzIC0gc2VydmljZSBldmVudHMgaW4gdGhlIHF1ZXVlCisgKgorICoJR2V0IGFuIGV2ZW50IGZyb20gdGhlIHN0YXRpb24gZXZlbnQgcXVldWUgKGlmIGFueSk7IGF0dGVtcHQgdG8gc2VydmljZQorICoJdGhlIGV2ZW50OyBpZiBldmVudCBzZXJ2aWNlZCwgZ2V0IHRoZSBuZXh0IGV2ZW50IChpZiBhbnkpIG9uIHRoZSBldmVudAorICoJcXVldWU7IGlmIGV2ZW50IG5vdCBzZXJ2aWNlLCByZS1xdWV1ZSB0aGUgZXZlbnQgb24gdGhlIGV2ZW50IHF1ZXVlIGFuZAorICoJYXR0ZW1wdCB0byBzZXJ2aWNlIHRoZSBuZXh0IGV2ZW50OyB3aGVuIHNlcnZpY2VkIGFsbCBldmVudHMgaW4gcXVldWUsCisgKglmaW5pc2hlZDsgaWYgZG9uJ3QgdHJhbnNpdGlvbiB0byBkaWZmZXJlbnQgc3RhdGUsIGp1c3Qgc2VydmljZSBhbGwKKyAqCWV2ZW50cyBvbmNlOyBpZiB0cmFuc2l0aW9uIHRvIG5ldyBzdGF0ZSwgc2VydmljZSBhbGwgZXZlbnRzIGFnYWluLgorICoJQ2FsbGVyIG11c3QgaG9sZCBsbGNfbWFpbl9zdGF0aW9uLmV2X3EubG9jay4KKyAqLworc3RhdGljIHZvaWQgbGxjX3N0YXRpb25fc2VydmljZV9ldmVudHModm9pZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmbGxjX21haW5fc3RhdGlvbi5ldl9xLmxpc3QpKSAhPSBOVUxMKQorCQlsbGNfc3RhdGlvbl9uZXh0X3N0YXRlKHNrYik7Cit9CisKKy8qKgorICoJbGxjX3N0YXRpb25fc3RhdGVfcHJvY2VzczogcXVldWUgZXZlbnQgYW5kIHRyeSB0byBwcm9jZXNzIHF1ZXVlLgorICoJQHNrYjogQWRkcmVzcyBvZiB0aGUgZXZlbnQKKyAqCisgKglRdWV1ZXMgYW4gZXZlbnQgKG9uIHRoZSBzdGF0aW9uIGV2ZW50IHF1ZXVlKSBmb3IgaGFuZGxpbmcgYnkgdGhlCisgKglzdGF0aW9uIHN0YXRlIG1hY2hpbmUgYW5kIGF0dGVtcHRzIHRvIHByb2Nlc3MgYW55IHF1ZXVlZC11cCBldmVudHMuCisgKi8KK3N0YXRpYyB2b2lkIGxsY19zdGF0aW9uX3N0YXRlX3Byb2Nlc3Moc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzcGluX2xvY2tfYmgoJmxsY19tYWluX3N0YXRpb24uZXZfcS5sb2NrKTsKKwlza2JfcXVldWVfdGFpbCgmbGxjX21haW5fc3RhdGlvbi5ldl9xLmxpc3QsIHNrYik7CisJbGxjX3N0YXRpb25fc2VydmljZV9ldmVudHMoKTsKKwlzcGluX3VubG9ja19iaCgmbGxjX21haW5fc3RhdGlvbi5ldl9xLmxvY2spOworfQorCitzdGF0aWMgdm9pZCBsbGNfc3RhdGlvbl9hY2tfdG1yX2NiKHVuc2lnbmVkIGxvbmcgdGltZW91dF9kYXRhKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBhbGxvY19za2IoMCwgR0ZQX0FUT01JQyk7CisKKwlpZiAoc2tiKSB7CisJCXN0cnVjdCBsbGNfc3RhdGlvbl9zdGF0ZV9ldiAqZXYgPSBsbGNfc3RhdGlvbl9ldihza2IpOworCisJCWV2LT50eXBlID0gTExDX1NUQVRJT05fRVZfVFlQRV9BQ0tfVE1SOworCQlsbGNfc3RhdGlvbl9zdGF0ZV9wcm9jZXNzKHNrYik7CisJfQorfQorCisvKgorICoJbGxjX3N0YXRpb25fcmN2IC0gc2VuZCByZWNlaXZlZCBwZHUgdG8gdGhlIHN0YXRpb24gc3RhdGUgbWFjaGluZQorICoJQHNrYjogcmVjZWl2ZWQgZnJhbWUuCisgKgorICoJU2VuZHMgZGF0YSB1bml0IHRvIHN0YXRpb24gc3RhdGUgbWFjaGluZS4KKyAqLworc3RhdGljIHZvaWQgbGxjX3N0YXRpb25fcmN2KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxsY19zdGF0aW9uX3N0YXRlX2V2ICpldiA9IGxsY19zdGF0aW9uX2V2KHNrYik7CisKKwlldi0+dHlwZSAgID0gTExDX1NUQVRJT05fRVZfVFlQRV9QRFU7CisJZXYtPnJlYXNvbiA9IDA7CisJbGxjX3N0YXRpb25fc3RhdGVfcHJvY2Vzcyhza2IpOworfQorCitpbnQgX19pbml0IGxsY19zdGF0aW9uX2luaXQodm9pZCkKK3sKKwl1MTYgcmMgPSAtRU5PQlVGUzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBsbGNfc3RhdGlvbl9zdGF0ZV9ldiAqZXY7CisKKwlza2JfcXVldWVfaGVhZF9pbml0KCZsbGNfbWFpbl9zdGF0aW9uLm1hY19wZHVfcSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbGxjX21haW5fc3RhdGlvbi5ldl9xLmxpc3QpOworCXNwaW5fbG9ja19pbml0KCZsbGNfbWFpbl9zdGF0aW9uLmV2X3EubG9jayk7CisJaW5pdF90aW1lcigmbGxjX21haW5fc3RhdGlvbi5hY2tfdGltZXIpOworCWxsY19tYWluX3N0YXRpb24uYWNrX3RpbWVyLmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpJmxsY19tYWluX3N0YXRpb247CisJbGxjX21haW5fc3RhdGlvbi5hY2tfdGltZXIuZnVuY3Rpb24gPSBsbGNfc3RhdGlvbl9hY2tfdG1yX2NiOworCisJc2tiID0gYWxsb2Nfc2tiKDAsIEdGUF9BVE9NSUMpOworCWlmICghc2tiKQorCQlnb3RvIG91dDsKKwlyYyA9IDA7CisJbGxjX3NldF9zdGF0aW9uX2hhbmRsZXIobGxjX3N0YXRpb25fcmN2KTsKKwlldiA9IGxsY19zdGF0aW9uX2V2KHNrYik7CisJbWVtc2V0KGV2LCAwLCBzaXplb2YoKmV2KSk7CisJbGxjX21haW5fc3RhdGlvbi5hY2tfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAzICogSFo7CisJbGxjX21haW5fc3RhdGlvbi5tYXhpbXVtX3JldHJ5CT0gMTsKKwlsbGNfbWFpbl9zdGF0aW9uLnN0YXRlCQk9IExMQ19TVEFUSU9OX1NUQVRFX0RPV047CisJZXYtPnR5cGUJPSBMTENfU1RBVElPTl9FVl9UWVBFX1NJTVBMRTsKKwlldi0+cHJpbV90eXBlCT0gTExDX1NUQVRJT05fRVZfRU5BQkxFX1dJVEhPVVRfRFVQX0FERFJfQ0hFQ0s7CisJcmMgPSBsbGNfc3RhdGlvbl9uZXh0X3N0YXRlKHNrYik7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCit2b2lkIF9fZXhpdCBsbGNfc3RhdGlvbl9leGl0KHZvaWQpCit7CisJbGxjX3NldF9zdGF0aW9uX2hhbmRsZXIoTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9uZXQvbmV0bGluay9NYWtlZmlsZSBiL25ldC9uZXRsaW5rL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZDljMmQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0bGluay9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBuZXRsaW5rIGRyaXZlci4KKyMKKworb2JqLXkgIAkJCQk6PSBhZl9uZXRsaW5rLm8KZGlmZiAtLWdpdCBhL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYyBiL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDU5MDVjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCkBAIC0wLDAgKzEsMTQ1NCBAQAorLyoKKyAqIE5FVExJTksgICAgICBLZXJuZWwtdXNlciBjb21tdW5pY2F0aW9uIHByb3RvY29sLgorICoKKyAqIAkJQXV0aG9yczoJQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqIAkJCQlBbGV4ZXkgS3V6bmV0c292IDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVHVlIEp1biAyNiAxNDozNjo0OCBNRVNUIDIwMDEgSGVyYmVydCAiaGVycCIgUm9zbWFuaXRoCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCBuZXRsaW5rX3Byb3RvX2V4aXQKKyAqIFR1ZSBKYW4gMjIgMTg6MzI6NDQgQlJTVCAyMDAyIEFybmFsZG8gQy4gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorICogCQkJCSB1c2UgbmxrX3NrLCBhcyBzay0+cHJvdGluZm8gaXMgb24gYSBkaWV0IDgpCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvdW4uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvc2NtLmg+CisKKyNkZWZpbmUgTnByaW50ayhhLi4uKQorCitzdHJ1Y3QgbmV0bGlua19zb2NrIHsKKwkvKiBzdHJ1Y3Qgc29jayBoYXMgdG8gYmUgdGhlIGZpcnN0IG1lbWJlciBvZiBuZXRsaW5rX3NvY2sgKi8KKwlzdHJ1Y3Qgc29jawkJc2s7CisJdTMyCQkJcGlkOworCXVuc2lnbmVkIGludAkJZ3JvdXBzOworCXUzMgkJCWRzdF9waWQ7CisJdW5zaWduZWQgaW50CQlkc3RfZ3JvdXBzOworCXVuc2lnbmVkIGxvbmcJCXN0YXRlOworCXdhaXRfcXVldWVfaGVhZF90CXdhaXQ7CisJc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sJKmNiOworCXNwaW5sb2NrX3QJCWNiX2xvY2s7CisJdm9pZAkJCSgqZGF0YV9yZWFkeSkoc3RydWN0IHNvY2sgKnNrLCBpbnQgYnl0ZXMpOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0bGlua19zb2NrICpubGtfc2soc3RydWN0IHNvY2sgKnNrKQoreworCXJldHVybiAoc3RydWN0IG5ldGxpbmtfc29jayAqKXNrOworfQorCitzdHJ1Y3QgbmxfcGlkX2hhc2ggeworCXN0cnVjdCBobGlzdF9oZWFkICp0YWJsZTsKKwl1bnNpZ25lZCBsb25nIHJlaGFzaF90aW1lOworCisJdW5zaWduZWQgaW50IG1hc2s7CisJdW5zaWduZWQgaW50IHNoaWZ0OworCisJdW5zaWduZWQgaW50IGVudHJpZXM7CisJdW5zaWduZWQgaW50IG1heF9zaGlmdDsKKworCXUzMiBybmQ7Cit9OworCitzdHJ1Y3QgbmV0bGlua190YWJsZSB7CisJc3RydWN0IG5sX3BpZF9oYXNoIGhhc2g7CisJc3RydWN0IGhsaXN0X2hlYWQgbWNfbGlzdDsKKwl1bnNpZ25lZCBpbnQgbmxfbm9ucm9vdDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmV0bGlua190YWJsZSAqbmxfdGFibGU7CisKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChubF90YWJsZV93YWl0KTsKKworc3RhdGljIGludCBuZXRsaW5rX2R1bXAoc3RydWN0IHNvY2sgKnNrKTsKK3N0YXRpYyB2b2lkIG5ldGxpbmtfZGVzdHJveV9jYWxsYmFjayhzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOworCitzdGF0aWMgREVGSU5FX1JXTE9DSyhubF90YWJsZV9sb2NrKTsKK3N0YXRpYyBhdG9taWNfdCBubF90YWJsZV91c2VycyA9IEFUT01JQ19JTklUKDApOworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZXRsaW5rX2NoYWluOworCitzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgKm5sX3BpZF9oYXNoZm4oc3RydWN0IG5sX3BpZF9oYXNoICpoYXNoLCB1MzIgcGlkKQoreworCXJldHVybiAmaGFzaC0+dGFibGVbamhhc2hfMXdvcmQocGlkLCBoYXNoLT5ybmQpICYgaGFzaC0+bWFza107Cit9CisKK3N0YXRpYyB2b2lkIG5ldGxpbmtfc29ja19kZXN0cnVjdChzdHJ1Y3Qgc29jayAqc2spCit7CisJc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisKKwlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkgeworCQlwcmludGsoIkZyZWVpbmcgYWxpdmUgbmV0bGluayBzb2NrZXQgJXBcbiIsIHNrKTsKKwkJcmV0dXJuOworCX0KKwlCVUdfVFJBUCghYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSk7CisJQlVHX1RSQVAoIWF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYykpOworCUJVR19UUkFQKCFubGtfc2soc2spLT5jYik7Cit9CisKKy8qIFRoaXMgbG9jayB3aXRob3V0IFdRX0ZMQUdfRVhDTFVTSVZFIGlzIGdvb2Qgb24gVVAgYW5kIGl0IGlzIF92ZXJ5XyBiYWQgb24gU01QLgorICogTG9vaywgd2hlbiBzZXZlcmFsIHdyaXRlcnMgc2xlZXAgYW5kIHJlYWRlciB3YWtlcyB0aGVtIHVwLCBhbGwgYnV0IG9uZQorICogaW1tZWRpYXRlbHkgaGl0IHdyaXRlIGxvY2sgYW5kIGdyYWIgYWxsIHRoZSBjcHVzLiBFeGNsdXNpdmUgc2xlZXAgc29sdmVzCisgKiB0aGlzLCBfYnV0XyByZW1lbWJlciwgaXQgYWRkcyB1c2VsZXNzIHdvcmsgb24gVVAgbWFjaGluZXMuCisgKi8KKworc3RhdGljIHZvaWQgbmV0bGlua190YWJsZV9ncmFiKHZvaWQpCit7CisJd3JpdGVfbG9ja19iaCgmbmxfdGFibGVfbG9jayk7CisKKwlpZiAoYXRvbWljX3JlYWQoJm5sX3RhYmxlX3VzZXJzKSkgeworCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCQlhZGRfd2FpdF9xdWV1ZV9leGNsdXNpdmUoJm5sX3RhYmxlX3dhaXQsICZ3YWl0KTsKKwkJZm9yKDs7KSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlpZiAoYXRvbWljX3JlYWQoJm5sX3RhYmxlX3VzZXJzKSA9PSAwKQorCQkJCWJyZWFrOworCQkJd3JpdGVfdW5sb2NrX2JoKCZubF90YWJsZV9sb2NrKTsKKwkJCXNjaGVkdWxlKCk7CisJCQl3cml0ZV9sb2NrX2JoKCZubF90YWJsZV9sb2NrKTsKKwkJfQorCisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJm5sX3RhYmxlX3dhaXQsICZ3YWl0KTsKKwl9Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbmV0bGlua190YWJsZV91bmdyYWIodm9pZCkKK3sKKwl3cml0ZV91bmxvY2tfYmgoJm5sX3RhYmxlX2xvY2spOworCXdha2VfdXAoJm5sX3RhYmxlX3dhaXQpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCituZXRsaW5rX2xvY2tfdGFibGUodm9pZCkKK3sKKwkvKiByZWFkX2xvY2soKSBzeW5jaHJvbml6ZXMgdXMgdG8gbmV0bGlua190YWJsZV9ncmFiICovCisKKwlyZWFkX2xvY2soJm5sX3RhYmxlX2xvY2spOworCWF0b21pY19pbmMoJm5sX3RhYmxlX3VzZXJzKTsKKwlyZWFkX3VubG9jaygmbmxfdGFibGVfbG9jayk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQKK25ldGxpbmtfdW5sb2NrX3RhYmxlKHZvaWQpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJm5sX3RhYmxlX3VzZXJzKSkKKwkJd2FrZV91cCgmbmxfdGFibGVfd2FpdCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBzb2NrICpuZXRsaW5rX2xvb2t1cChpbnQgcHJvdG9jb2wsIHUzMiBwaWQpCit7CisJc3RydWN0IG5sX3BpZF9oYXNoICpoYXNoID0gJm5sX3RhYmxlW3Byb3RvY29sXS5oYXNoOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCXJlYWRfbG9jaygmbmxfdGFibGVfbG9jayk7CisJaGVhZCA9IG5sX3BpZF9oYXNoZm4oaGFzaCwgcGlkKTsKKwlza19mb3JfZWFjaChzaywgbm9kZSwgaGVhZCkgeworCQlpZiAobmxrX3NrKHNrKS0+cGlkID09IHBpZCkgeworCQkJc29ja19ob2xkKHNrKTsKKwkJCWdvdG8gZm91bmQ7CisJCX0KKwl9CisJc2sgPSBOVUxMOworZm91bmQ6CisJcmVhZF91bmxvY2soJm5sX3RhYmxlX2xvY2spOworCXJldHVybiBzazsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaGxpc3RfaGVhZCAqbmxfcGlkX2hhc2hfYWxsb2Moc2l6ZV90IHNpemUpCit7CisJaWYgKHNpemUgPD0gUEFHRV9TSVpFKQorCQlyZXR1cm4ga21hbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKKwllbHNlCisJCXJldHVybiAoc3RydWN0IGhsaXN0X2hlYWQgKikKKwkJCV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0FUT01JQywgZ2V0X29yZGVyKHNpemUpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5sX3BpZF9oYXNoX2ZyZWUoc3RydWN0IGhsaXN0X2hlYWQgKnRhYmxlLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoc2l6ZSA8PSBQQUdFX1NJWkUpCisJCWtmcmVlKHRhYmxlKTsKKwllbHNlCisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpdGFibGUsIGdldF9vcmRlcihzaXplKSk7Cit9CisKK3N0YXRpYyBpbnQgbmxfcGlkX2hhc2hfcmVoYXNoKHN0cnVjdCBubF9waWRfaGFzaCAqaGFzaCwgaW50IGdyb3cpCit7CisJdW5zaWduZWQgaW50IG9tYXNrLCBtYXNrLCBzaGlmdDsKKwlzaXplX3Qgb3NpemUsIHNpemU7CisJc3RydWN0IGhsaXN0X2hlYWQgKm90YWJsZSwgKnRhYmxlOworCWludCBpOworCisJb21hc2sgPSBtYXNrID0gaGFzaC0+bWFzazsKKwlvc2l6ZSA9IHNpemUgPSAobWFzayArIDEpICogc2l6ZW9mKCp0YWJsZSk7CisJc2hpZnQgPSBoYXNoLT5zaGlmdDsKKworCWlmIChncm93KSB7CisJCWlmICgrK3NoaWZ0ID4gaGFzaC0+bWF4X3NoaWZ0KQorCQkJcmV0dXJuIDA7CisJCW1hc2sgPSBtYXNrICogMiArIDE7CisJCXNpemUgKj0gMjsKKwl9CisKKwl0YWJsZSA9IG5sX3BpZF9oYXNoX2FsbG9jKHNpemUpOworCWlmICghdGFibGUpCisJCXJldHVybiAwOworCisJbWVtc2V0KHRhYmxlLCAwLCBzaXplKTsKKwlvdGFibGUgPSBoYXNoLT50YWJsZTsKKwloYXNoLT50YWJsZSA9IHRhYmxlOworCWhhc2gtPm1hc2sgPSBtYXNrOworCWhhc2gtPnNoaWZ0ID0gc2hpZnQ7CisJZ2V0X3JhbmRvbV9ieXRlcygmaGFzaC0+cm5kLCBzaXplb2YoaGFzaC0+cm5kKSk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IG9tYXNrOyBpKyspIHsKKwkJc3RydWN0IHNvY2sgKnNrOworCQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKnRtcDsKKworCQlza19mb3JfZWFjaF9zYWZlKHNrLCBub2RlLCB0bXAsICZvdGFibGVbaV0pCisJCQlfX3NrX2FkZF9ub2RlKHNrLCBubF9waWRfaGFzaGZuKGhhc2gsIG5sa19zayhzayktPnBpZCkpOworCX0KKworCW5sX3BpZF9oYXNoX2ZyZWUob3RhYmxlLCBvc2l6ZSk7CisJaGFzaC0+cmVoYXNoX3RpbWUgPSBqaWZmaWVzICsgMTAgKiA2MCAqIEhaOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBubF9waWRfaGFzaF9kaWx1dGUoc3RydWN0IG5sX3BpZF9oYXNoICpoYXNoLCBpbnQgbGVuKQoreworCWludCBhdmcgPSBoYXNoLT5lbnRyaWVzID4+IGhhc2gtPnNoaWZ0OworCisJaWYgKHVubGlrZWx5KGF2ZyA+IDEpICYmIG5sX3BpZF9oYXNoX3JlaGFzaChoYXNoLCAxKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAodW5saWtlbHkobGVuID4gYXZnKSAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIGhhc2gtPnJlaGFzaF90aW1lKSkgeworCQlubF9waWRfaGFzaF9yZWhhc2goaGFzaCwgMCk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBuZXRsaW5rX29wczsKKworc3RhdGljIGludCBuZXRsaW5rX2luc2VydChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBwaWQpCit7CisJc3RydWN0IG5sX3BpZF9oYXNoICpoYXNoID0gJm5sX3RhYmxlW3NrLT5za19wcm90b2NvbF0uaGFzaDsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKKwlpbnQgZXJyID0gLUVBRERSSU5VU0U7CisJc3RydWN0IHNvY2sgKm9zazsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlpbnQgbGVuOworCisJbmV0bGlua190YWJsZV9ncmFiKCk7CisJaGVhZCA9IG5sX3BpZF9oYXNoZm4oaGFzaCwgcGlkKTsKKwlsZW4gPSAwOworCXNrX2Zvcl9lYWNoKG9zaywgbm9kZSwgaGVhZCkgeworCQlpZiAobmxrX3NrKG9zayktPnBpZCA9PSBwaWQpCisJCQlicmVhazsKKwkJbGVuKys7CisJfQorCWlmIChub2RlKQorCQlnb3RvIGVycjsKKworCWVyciA9IC1FQlVTWTsKKwlpZiAobmxrX3NrKHNrKS0+cGlkKQorCQlnb3RvIGVycjsKKworCWVyciA9IC1FTk9NRU07CisJaWYgKEJJVFNfUEVSX0xPTkcgPiAzMiAmJiB1bmxpa2VseShoYXNoLT5lbnRyaWVzID49IFVJTlRfTUFYKSkKKwkJZ290byBlcnI7CisKKwlpZiAobGVuICYmIG5sX3BpZF9oYXNoX2RpbHV0ZShoYXNoLCBsZW4pKQorCQloZWFkID0gbmxfcGlkX2hhc2hmbihoYXNoLCBwaWQpOworCWhhc2gtPmVudHJpZXMrKzsKKwlubGtfc2soc2spLT5waWQgPSBwaWQ7CisJc2tfYWRkX25vZGUoc2ssIGhlYWQpOworCWVyciA9IDA7CisKK2VycjoKKwluZXRsaW5rX3RhYmxlX3VuZ3JhYigpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGxpbmtfcmVtb3ZlKHN0cnVjdCBzb2NrICpzaykKK3sKKwluZXRsaW5rX3RhYmxlX2dyYWIoKTsKKwlubF90YWJsZVtzay0+c2tfcHJvdG9jb2xdLmhhc2guZW50cmllcy0tOworCXNrX2RlbF9ub2RlX2luaXQoc2spOworCWlmIChubGtfc2soc2spLT5ncm91cHMpCisJCV9fc2tfZGVsX2JpbmRfbm9kZShzayk7CisJbmV0bGlua190YWJsZV91bmdyYWIoKTsKK30KKworc3RhdGljIHN0cnVjdCBwcm90byBuZXRsaW5rX3Byb3RvID0geworCS5uYW1lCSAgPSAiTkVUTElOSyIsCisJLm93bmVyCSAgPSBUSElTX01PRFVMRSwKKwkub2JqX3NpemUgPSBzaXplb2Yoc3RydWN0IG5ldGxpbmtfc29jayksCit9OworCitzdGF0aWMgaW50IG5ldGxpbmtfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrOworCisJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKKworCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfUkFXICYmIHNvY2stPnR5cGUgIT0gU09DS19ER1JBTSkKKwkJcmV0dXJuIC1FU09DS1ROT1NVUFBPUlQ7CisKKwlpZiAocHJvdG9jb2w8MCB8fCBwcm90b2NvbCA+PSBNQVhfTElOS1MpCisJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOworCisJc29jay0+b3BzID0gJm5ldGxpbmtfb3BzOworCisJc2sgPSBza19hbGxvYyhQRl9ORVRMSU5LLCBHRlBfS0VSTkVMLCAmbmV0bGlua19wcm90bywgMSk7CisJaWYgKCFzaykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisKKwlubGsgPSBubGtfc2soc2spOworCisJc3Bpbl9sb2NrX2luaXQoJm5say0+Y2JfbG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbmxrLT53YWl0KTsKKwlzay0+c2tfZGVzdHJ1Y3QgPSBuZXRsaW5rX3NvY2tfZGVzdHJ1Y3Q7CisKKwlzay0+c2tfcHJvdG9jb2wgPSBwcm90b2NvbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXRsaW5rX3JlbGVhc2Uoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgbmV0bGlua19zb2NrICpubGs7CisKKwlpZiAoIXNrKQorCQlyZXR1cm4gMDsKKworCW5ldGxpbmtfcmVtb3ZlKHNrKTsKKwlubGsgPSBubGtfc2soc2spOworCisJc3Bpbl9sb2NrKCZubGstPmNiX2xvY2spOworCWlmIChubGstPmNiKSB7CisJCW5say0+Y2ItPmRvbmUobmxrLT5jYik7CisJCW5ldGxpbmtfZGVzdHJveV9jYWxsYmFjayhubGstPmNiKTsKKwkJbmxrLT5jYiA9IE5VTEw7CisJCV9fc29ja19wdXQoc2spOworCX0KKwlzcGluX3VubG9jaygmbmxrLT5jYl9sb2NrKTsKKworCS8qIE9LLiBTb2NrZXQgaXMgdW5saW5rZWQsIGFuZCwgdGhlcmVmb3JlLAorCSAgIG5vIG5ldyBwYWNrZXRzIHdpbGwgYXJyaXZlICovCisKKwlzb2NrX29ycGhhbihzayk7CisJc29jay0+c2sgPSBOVUxMOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJm5say0+d2FpdCk7CisKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za193cml0ZV9xdWV1ZSk7CisKKwlpZiAobmxrLT5waWQgJiYgIW5say0+Z3JvdXBzKSB7CisJCXN0cnVjdCBuZXRsaW5rX25vdGlmeSBuID0geworCQkJCQkJLnByb3RvY29sID0gc2stPnNrX3Byb3RvY29sLAorCQkJCQkJLnBpZCA9IG5say0+cGlkLAorCQkJCQkgIH07CisJCW5vdGlmaWVyX2NhbGxfY2hhaW4oJm5ldGxpbmtfY2hhaW4sIE5FVExJTktfVVJFTEVBU0UsICZuKTsKKwl9CQorCQorCXNvY2tfcHV0KHNrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXRsaW5rX2F1dG9iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IG5sX3BpZF9oYXNoICpoYXNoID0gJm5sX3RhYmxlW3NrLT5za19wcm90b2NvbF0uaGFzaDsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKKwlzdHJ1Y3Qgc29jayAqb3NrOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXMzMiBwaWQgPSBjdXJyZW50LT5waWQ7CisJaW50IGVycjsKKwlzdGF0aWMgczMyIHJvdmVyID0gLTQwOTc7CisKK3JldHJ5OgorCWNvbmRfcmVzY2hlZCgpOworCW5ldGxpbmtfdGFibGVfZ3JhYigpOworCWhlYWQgPSBubF9waWRfaGFzaGZuKGhhc2gsIHBpZCk7CisJc2tfZm9yX2VhY2gob3NrLCBub2RlLCBoZWFkKSB7CisJCWlmIChubGtfc2sob3NrKS0+cGlkID09IHBpZCkgeworCQkJLyogQmluZCBjb2xsaXNpb24sIHNlYXJjaCBuZWdhdGl2ZSBwaWQgdmFsdWVzLiAqLworCQkJcGlkID0gcm92ZXItLTsKKwkJCWlmIChyb3ZlciA+IC00MDk3KQorCQkJCXJvdmVyID0gLTQwOTc7CisJCQluZXRsaW5rX3RhYmxlX3VuZ3JhYigpOworCQkJZ290byByZXRyeTsKKwkJfQorCX0KKwluZXRsaW5rX3RhYmxlX3VuZ3JhYigpOworCisJZXJyID0gbmV0bGlua19pbnNlcnQoc2ssIHBpZCk7CisJaWYgKGVyciA9PSAtRUFERFJJTlVTRSkKKwkJZ290byByZXRyeTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbmV0bGlua19jYXBhYmxlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBmbGFnKSAKK3sgCisJcmV0dXJuIChubF90YWJsZVtzb2NrLT5zay0+c2tfcHJvdG9jb2xdLm5sX25vbnJvb3QgJiBmbGFnKSB8fAorCSAgICAgICBjYXBhYmxlKENBUF9ORVRfQURNSU4pOworfSAKKworc3RhdGljIGludCBuZXRsaW5rX2JpbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcl9sZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfbmwgKm5sYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfbmwgKilhZGRyOworCWludCBlcnI7CisJCisJaWYgKG5sYWRkci0+bmxfZmFtaWx5ICE9IEFGX05FVExJTkspCisJCXJldHVybiAtRUlOVkFMOworCisJLyogT25seSBzdXBlcnVzZXIgaXMgYWxsb3dlZCB0byBsaXN0ZW4gbXVsdGljYXN0cyAqLworCWlmIChubGFkZHItPm5sX2dyb3VwcyAmJiAhbmV0bGlua19jYXBhYmxlKHNvY2ssIE5MX05PTlJPT1RfUkVDVikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAobmxrLT5waWQpIHsKKwkJaWYgKG5sYWRkci0+bmxfcGlkICE9IG5say0+cGlkKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJZXJyID0gbmxhZGRyLT5ubF9waWQgPworCQkJbmV0bGlua19pbnNlcnQoc2ssIG5sYWRkci0+bmxfcGlkKSA6CisJCQluZXRsaW5rX2F1dG9iaW5kKHNvY2spOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoIW5sYWRkci0+bmxfZ3JvdXBzICYmICFubGstPmdyb3VwcykKKwkJcmV0dXJuIDA7CisKKwluZXRsaW5rX3RhYmxlX2dyYWIoKTsKKwlpZiAobmxrLT5ncm91cHMgJiYgIW5sYWRkci0+bmxfZ3JvdXBzKQorCQlfX3NrX2RlbF9iaW5kX25vZGUoc2spOworCWVsc2UgaWYgKCFubGstPmdyb3VwcyAmJiBubGFkZHItPm5sX2dyb3VwcykKKwkJc2tfYWRkX2JpbmRfbm9kZShzaywgJm5sX3RhYmxlW3NrLT5za19wcm90b2NvbF0ubWNfbGlzdCk7CisJbmxrLT5ncm91cHMgPSBubGFkZHItPm5sX2dyb3VwczsKKwluZXRsaW5rX3RhYmxlX3VuZ3JhYigpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmV0bGlua19jb25uZWN0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkciwKKwkJCSAgIGludCBhbGVuLCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfbmwgKm5sYWRkcj0oc3RydWN0IHNvY2thZGRyX25sKilhZGRyOworCisJaWYgKGFkZHItPnNhX2ZhbWlseSA9PSBBRl9VTlNQRUMpIHsKKwkJc2stPnNrX3N0YXRlCT0gTkVUTElOS19VTkNPTk5FQ1RFRDsKKwkJbmxrLT5kc3RfcGlkCT0gMDsKKwkJbmxrLT5kc3RfZ3JvdXBzID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChhZGRyLT5zYV9mYW1pbHkgIT0gQUZfTkVUTElOSykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBPbmx5IHN1cGVydXNlciBpcyBhbGxvd2VkIHRvIHNlbmQgbXVsdGljYXN0cyAqLworCWlmIChubGFkZHItPm5sX2dyb3VwcyAmJiAhbmV0bGlua19jYXBhYmxlKHNvY2ssIE5MX05PTlJPT1RfU0VORCkpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoIW5say0+cGlkKQorCQllcnIgPSBuZXRsaW5rX2F1dG9iaW5kKHNvY2spOworCisJaWYgKGVyciA9PSAwKSB7CisJCXNrLT5za19zdGF0ZQk9IE5FVExJTktfQ09OTkVDVEVEOworCQlubGstPmRzdF9waWQgCT0gbmxhZGRyLT5ubF9waWQ7CisJCW5say0+ZHN0X2dyb3VwcyA9IG5sYWRkci0+bmxfZ3JvdXBzOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbmV0bGlua19nZXRuYW1lKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50ICphZGRyX2xlbiwgaW50IHBlZXIpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfbmwgKm5sYWRkcj0oc3RydWN0IHNvY2thZGRyX25sICopYWRkcjsKKwkKKwlubGFkZHItPm5sX2ZhbWlseSA9IEFGX05FVExJTks7CisJbmxhZGRyLT5ubF9wYWQgPSAwOworCSphZGRyX2xlbiA9IHNpemVvZigqbmxhZGRyKTsKKworCWlmIChwZWVyKSB7CisJCW5sYWRkci0+bmxfcGlkID0gbmxrLT5kc3RfcGlkOworCQlubGFkZHItPm5sX2dyb3VwcyA9IG5say0+ZHN0X2dyb3VwczsKKwl9IGVsc2UgeworCQlubGFkZHItPm5sX3BpZCA9IG5say0+cGlkOworCQlubGFkZHItPm5sX2dyb3VwcyA9IG5say0+Z3JvdXBzOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmV0bGlua19vdmVycnVuKHN0cnVjdCBzb2NrICpzaykKK3sKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoMCwgJm5sa19zayhzayktPnN0YXRlKSkgeworCQlzay0+c2tfZXJyID0gRU5PQlVGUzsKKwkJc2stPnNrX2Vycm9yX3JlcG9ydChzayk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHNvY2sgKm5ldGxpbmtfZ2V0c29ja2J5cGlkKHN0cnVjdCBzb2NrICpzc2ssIHUzMiBwaWQpCit7CisJaW50IHByb3RvY29sID0gc3NrLT5za19wcm90b2NvbDsKKwlzdHJ1Y3Qgc29jayAqc29jazsKKwlzdHJ1Y3QgbmV0bGlua19zb2NrICpubGs7CisKKwlzb2NrID0gbmV0bGlua19sb29rdXAocHJvdG9jb2wsIHBpZCk7CisJaWYgKCFzb2NrKQorCQlyZXR1cm4gRVJSX1BUUigtRUNPTk5SRUZVU0VEKTsKKworCS8qIERvbid0IGJvdGhlciBxdWV1aW5nIHNrYiBpZiBrZXJuZWwgc29ja2V0IGhhcyBubyBpbnB1dCBmdW5jdGlvbiAqLworCW5sayA9IG5sa19zayhzb2NrKTsKKwlpZiAoKG5say0+cGlkID09IDAgJiYgIW5say0+ZGF0YV9yZWFkeSkgfHwKKwkgICAgKHNvY2stPnNrX3N0YXRlID09IE5FVExJTktfQ09OTkVDVEVEICYmCisJICAgICBubGstPmRzdF9waWQgIT0gbmxrX3NrKHNzayktPnBpZCkpIHsKKwkJc29ja19wdXQoc29jayk7CisJCXJldHVybiBFUlJfUFRSKC1FQ09OTlJFRlVTRUQpOworCX0KKwlyZXR1cm4gc29jazsKK30KKworc3RydWN0IHNvY2sgKm5ldGxpbmtfZ2V0c29ja2J5ZmlscChzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHNvY2sgKnNvY2s7CisKKwlpZiAoIVNfSVNTT0NLKGlub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PVFNPQ0spOworCisJc29jayA9IFNPQ0tFVF9JKGlub2RlKS0+c2s7CisJaWYgKHNvY2stPnNrX2ZhbWlseSAhPSBBRl9ORVRMSU5LKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCXNvY2tfaG9sZChzb2NrKTsKKwlyZXR1cm4gc29jazsKK30KKworLyoKKyAqIEF0dGFjaCBhIHNrYiB0byBhIG5ldGxpbmsgc29ja2V0LgorICogVGhlIGNhbGxlciBtdXN0IGhvbGQgYSByZWZlcmVuY2UgdG8gdGhlIGRlc3RpbmF0aW9uIHNvY2tldC4gT24gZXJyb3IsIHRoZQorICogcmVmZXJlbmNlIGlzIGRyb3BwZWQuIFRoZSBza2IgaXMgbm90IHNlbmQgdG8gdGhlIGRlc3RpbmF0aW9uLCBqdXN0IGFsbAorICogYWxsIGVycm9yIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGFuZCBtZW1vcnkgaW4gdGhlIHF1ZXVlIGlzIHJlc2VydmVkLgorICogUmV0dXJuIHZhbHVlczoKKyAqIDwgMDogZXJyb3IuIHNrYiBmcmVlZCwgcmVmZXJlbmNlIHRvIHNvY2sgZHJvcHBlZC4KKyAqIDA6IGNvbnRpbnVlCisgKiAxOiByZXBlYXQgbG9va3VwIC0gcmVmZXJlbmNlIGRyb3BwZWQgd2hpbGUgd2FpdGluZyBmb3Igc29ja2V0IG1lbW9yeS4KKyAqLworaW50IG5ldGxpbmtfYXR0YWNoc2tiKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG5vbmJsb2NrLCBsb25nIHRpbWVvKQoreworCXN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sazsKKworCW5sayA9IG5sa19zayhzayk7CisKKwlpZiAoYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSA+IHNrLT5za19yY3ZidWYgfHwKKwkgICAgdGVzdF9iaXQoMCwgJm5say0+c3RhdGUpKSB7CisJCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCQlpZiAoIXRpbWVvKSB7CisJCQlpZiAoIW5say0+cGlkKQorCQkJCW5ldGxpbmtfb3ZlcnJ1bihzayk7CisJCQlzb2NrX3B1dChzayk7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlhZGRfd2FpdF9xdWV1ZSgmbmxrLT53YWl0LCAmd2FpdCk7CisKKwkJaWYgKChhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpID4gc2stPnNrX3JjdmJ1ZiB8fAorCQkgICAgIHRlc3RfYml0KDAsICZubGstPnN0YXRlKSkgJiYKKwkJICAgICFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCisJCQl0aW1lbyA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW8pOworCisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJm5say0+d2FpdCwgJndhaXQpOworCQlzb2NrX3B1dChzayk7CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiBzb2NrX2ludHJfZXJybm8odGltZW8pOworCQl9CisJCXJldHVybiAxOworCX0KKwlza2Jfc2V0X293bmVyX3Ioc2tiLCBzayk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBuZXRsaW5rX3NlbmRza2Ioc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcHJvdG9jb2wpCit7CisJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrOworCWludCBsZW4gPSBza2ItPmxlbjsKKworCW5sayA9IG5sa19zayhzayk7CisKKwlza2JfcXVldWVfdGFpbCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJc2stPnNrX2RhdGFfcmVhZHkoc2ssIGxlbik7CisJc29ja19wdXQoc2spOworCXJldHVybiBsZW47Cit9CisKK3ZvaWQgbmV0bGlua19kZXRhY2hza2Ioc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWtmcmVlX3NrYihza2IpOworCXNvY2tfcHV0KHNrKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqbmV0bGlua190cmltKHN0cnVjdCBza19idWZmICpza2IsIGludCBhbGxvY2F0aW9uKQoreworCWludCBkZWx0YTsKKworCXNrYl9vcnBoYW4oc2tiKTsKKworCWRlbHRhID0gc2tiLT5lbmQgLSBza2ItPnRhaWw7CisJaWYgKGRlbHRhICogMiA8IHNrYi0+dHJ1ZXNpemUpCisJCXJldHVybiBza2I7CisKKwlpZiAoc2tiX3NoYXJlZChza2IpKSB7CisJCXN0cnVjdCBza19idWZmICpuc2tiID0gc2tiX2Nsb25lKHNrYiwgYWxsb2NhdGlvbik7CisJCWlmICghbnNrYikKKwkJCXJldHVybiBza2I7CisJCWtmcmVlX3NrYihza2IpOworCQlza2IgPSBuc2tiOworCX0KKworCWlmICghcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIC1kZWx0YSwgYWxsb2NhdGlvbikpCisJCXNrYi0+dHJ1ZXNpemUgLT0gZGVsdGE7CisKKwlyZXR1cm4gc2tiOworfQorCitpbnQgbmV0bGlua191bmljYXN0KHN0cnVjdCBzb2NrICpzc2ssIHN0cnVjdCBza19idWZmICpza2IsIHUzMiBwaWQsIGludCBub25ibG9jaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisJaW50IGVycjsKKwlsb25nIHRpbWVvOworCisJc2tiID0gbmV0bGlua190cmltKHNrYiwgZ2ZwX2FueSgpKTsKKworCXRpbWVvID0gc29ja19zbmR0aW1lbyhzc2ssIG5vbmJsb2NrKTsKK3JldHJ5OgorCXNrID0gbmV0bGlua19nZXRzb2NrYnlwaWQoc3NrLCBwaWQpOworCWlmIChJU19FUlIoc2spKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gUFRSX0VSUihzayk7CisJfQorCWVyciA9IG5ldGxpbmtfYXR0YWNoc2tiKHNrLCBza2IsIG5vbmJsb2NrLCB0aW1lbyk7CisJaWYgKGVyciA9PSAxKQorCQlnb3RvIHJldHJ5OworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gbmV0bGlua19zZW5kc2tiKHNrLCBza2IsIHNzay0+c2tfcHJvdG9jb2wpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgbmV0bGlua19icm9hZGNhc3RfZGVsaXZlcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTsKKworCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpIDw9IHNrLT5za19yY3ZidWYgJiYKKwkgICAgIXRlc3RfYml0KDAsICZubGstPnN0YXRlKSkgeworCQlza2Jfc2V0X293bmVyX3Ioc2tiLCBzayk7CisJCXNrYl9xdWV1ZV90YWlsKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKKwkJc2stPnNrX2RhdGFfcmVhZHkoc2ssIHNrYi0+bGVuKTsKKwkJcmV0dXJuIGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPiBzay0+c2tfcmN2YnVmOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0cnVjdCBuZXRsaW5rX2Jyb2FkY2FzdF9kYXRhIHsKKwlzdHJ1Y3Qgc29jayAqZXhjbHVkZV9zazsKKwl1MzIgcGlkOworCXUzMiBncm91cDsKKwlpbnQgZmFpbHVyZTsKKwlpbnQgY29uZ2VzdGVkOworCWludCBkZWxpdmVyZWQ7CisJaW50IGFsbG9jYXRpb247CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnNrYjI7Cit9OworCitzdGF0aWMgaW5saW5lIGludCBkb19vbmVfYnJvYWRjYXN0KHN0cnVjdCBzb2NrICpzaywKKwkJCQkgICBzdHJ1Y3QgbmV0bGlua19icm9hZGNhc3RfZGF0YSAqcCkKK3sKKwlzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2soc2spOworCWludCB2YWw7CisKKwlpZiAocC0+ZXhjbHVkZV9zayA9PSBzaykKKwkJZ290byBvdXQ7CisKKwlpZiAobmxrLT5waWQgPT0gcC0+cGlkIHx8ICEobmxrLT5ncm91cHMgJiBwLT5ncm91cCkpCisJCWdvdG8gb3V0OworCisJaWYgKHAtPmZhaWx1cmUpIHsKKwkJbmV0bGlua19vdmVycnVuKHNrKTsKKwkJZ290byBvdXQ7CisJfQorCisJc29ja19ob2xkKHNrKTsKKwlpZiAocC0+c2tiMiA9PSBOVUxMKSB7CisJCWlmIChhdG9taWNfcmVhZCgmcC0+c2tiLT51c2VycykgIT0gMSkgeworCQkJcC0+c2tiMiA9IHNrYl9jbG9uZShwLT5za2IsIHAtPmFsbG9jYXRpb24pOworCQl9IGVsc2UgeworCQkJcC0+c2tiMiA9IHAtPnNrYjsKKwkJCWF0b21pY19pbmMoJnAtPnNrYi0+dXNlcnMpOworCQl9CisJfQorCWlmIChwLT5za2IyID09IE5VTEwpIHsKKwkJbmV0bGlua19vdmVycnVuKHNrKTsKKwkJLyogQ2xvbmUgZmFpbGVkLiBOb3RpZnkgQUxMIGxpc3RlbmVycy4gKi8KKwkJcC0+ZmFpbHVyZSA9IDE7CisJfSBlbHNlIGlmICgodmFsID0gbmV0bGlua19icm9hZGNhc3RfZGVsaXZlcihzaywgcC0+c2tiMikpIDwgMCkgeworCQluZXRsaW5rX292ZXJydW4oc2spOworCX0gZWxzZSB7CisJCXAtPmNvbmdlc3RlZCB8PSB2YWw7CisJCXAtPmRlbGl2ZXJlZCA9IDE7CisJCXAtPnNrYjIgPSBOVUxMOworCX0KKwlzb2NrX3B1dChzayk7CisKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50IG5ldGxpbmtfYnJvYWRjYXN0KHN0cnVjdCBzb2NrICpzc2ssIHN0cnVjdCBza19idWZmICpza2IsIHUzMiBwaWQsCisJCSAgICAgIHUzMiBncm91cCwgaW50IGFsbG9jYXRpb24pCit7CisJc3RydWN0IG5ldGxpbmtfYnJvYWRjYXN0X2RhdGEgaW5mbzsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlza2IgPSBuZXRsaW5rX3RyaW0oc2tiLCBhbGxvY2F0aW9uKTsKKworCWluZm8uZXhjbHVkZV9zayA9IHNzazsKKwlpbmZvLnBpZCA9IHBpZDsKKwlpbmZvLmdyb3VwID0gZ3JvdXA7CisJaW5mby5mYWlsdXJlID0gMDsKKwlpbmZvLmNvbmdlc3RlZCA9IDA7CisJaW5mby5kZWxpdmVyZWQgPSAwOworCWluZm8uYWxsb2NhdGlvbiA9IGFsbG9jYXRpb247CisJaW5mby5za2IgPSBza2I7CisJaW5mby5za2IyID0gTlVMTDsKKworCS8qIFdoaWxlIHdlIHNsZWVwIGluIGNsb25lLCBkbyBub3QgYWxsb3cgdG8gY2hhbmdlIHNvY2tldCBsaXN0ICovCisKKwluZXRsaW5rX2xvY2tfdGFibGUoKTsKKworCXNrX2Zvcl9lYWNoX2JvdW5kKHNrLCBub2RlLCAmbmxfdGFibGVbc3NrLT5za19wcm90b2NvbF0ubWNfbGlzdCkKKwkJZG9fb25lX2Jyb2FkY2FzdChzaywgJmluZm8pOworCisJbmV0bGlua191bmxvY2tfdGFibGUoKTsKKworCWlmIChpbmZvLnNrYjIpCisJCWtmcmVlX3NrYihpbmZvLnNrYjIpOworCWtmcmVlX3NrYihza2IpOworCisJaWYgKGluZm8uZGVsaXZlcmVkKSB7CisJCWlmIChpbmZvLmNvbmdlc3RlZCAmJiAoYWxsb2NhdGlvbiAmIF9fR0ZQX1dBSVQpKQorCQkJeWllbGQoKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChpbmZvLmZhaWx1cmUpCisJCXJldHVybiAtRU5PQlVGUzsKKwlyZXR1cm4gLUVTUkNIOworfQorCitzdHJ1Y3QgbmV0bGlua19zZXRfZXJyX2RhdGEgeworCXN0cnVjdCBzb2NrICpleGNsdWRlX3NrOworCXUzMiBwaWQ7CisJdTMyIGdyb3VwOworCWludCBjb2RlOworfTsKKworc3RhdGljIGlubGluZSBpbnQgZG9fb25lX3NldF9lcnIoc3RydWN0IHNvY2sgKnNrLAorCQkJCSBzdHJ1Y3QgbmV0bGlua19zZXRfZXJyX2RhdGEgKnApCit7CisJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTsKKworCWlmIChzayA9PSBwLT5leGNsdWRlX3NrKQorCQlnb3RvIG91dDsKKworCWlmIChubGstPnBpZCA9PSBwLT5waWQgfHwgIShubGstPmdyb3VwcyAmIHAtPmdyb3VwKSkKKwkJZ290byBvdXQ7CisKKwlzay0+c2tfZXJyID0gcC0+Y29kZTsKKwlzay0+c2tfZXJyb3JfcmVwb3J0KHNrKTsKK291dDoKKwlyZXR1cm4gMDsKK30KKwordm9pZCBuZXRsaW5rX3NldF9lcnIoc3RydWN0IHNvY2sgKnNzaywgdTMyIHBpZCwgdTMyIGdyb3VwLCBpbnQgY29kZSkKK3sKKwlzdHJ1Y3QgbmV0bGlua19zZXRfZXJyX2RhdGEgaW5mbzsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlpbmZvLmV4Y2x1ZGVfc2sgPSBzc2s7CisJaW5mby5waWQgPSBwaWQ7CisJaW5mby5ncm91cCA9IGdyb3VwOworCWluZm8uY29kZSA9IGNvZGU7CisKKwlyZWFkX2xvY2soJm5sX3RhYmxlX2xvY2spOworCisJc2tfZm9yX2VhY2hfYm91bmQoc2ssIG5vZGUsICZubF90YWJsZVtzc2stPnNrX3Byb3RvY29sXS5tY19saXN0KQorCQlkb19vbmVfc2V0X2VycihzaywgJmluZm8pOworCisJcmVhZF91bmxvY2soJm5sX3RhYmxlX2xvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmV0bGlua19yY3Zfd2FrZShzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTsKKworCWlmICghc2tiX3F1ZXVlX2xlbigmc2stPnNrX3JlY2VpdmVfcXVldWUpKQorCQljbGVhcl9iaXQoMCwgJm5say0+c3RhdGUpOworCWlmICghdGVzdF9iaXQoMCwgJm5say0+c3RhdGUpKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm5say0+d2FpdCk7Cit9CisKK3N0YXRpYyBpbnQgbmV0bGlua19zZW5kbXNnKHN0cnVjdCBraW9jYiAqa2lvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNvY2tfaW9jYiAqc2lvY2IgPSBraW9jYl90b19zaW9jYihraW9jYik7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfbmwgKmFkZHI9bXNnLT5tc2dfbmFtZTsKKwl1MzIgZHN0X3BpZDsKKwl1MzIgZHN0X2dyb3VwczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBlcnI7CisJc3RydWN0IHNjbV9jb29raWUgc2NtOworCisJaWYgKG1zZy0+bXNnX2ZsYWdzJk1TR19PT0IpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChOVUxMID09IHNpb2NiLT5zY20pCisJCXNpb2NiLT5zY20gPSAmc2NtOworCWVyciA9IHNjbV9zZW5kKHNvY2ssIG1zZywgc2lvY2ItPnNjbSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlpZiAobXNnLT5tc2dfbmFtZWxlbikgeworCQlpZiAoYWRkci0+bmxfZmFtaWx5ICE9IEFGX05FVExJTkspCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZHN0X3BpZCA9IGFkZHItPm5sX3BpZDsKKwkJZHN0X2dyb3VwcyA9IGFkZHItPm5sX2dyb3VwczsKKwkJaWYgKGRzdF9ncm91cHMgJiYgIW5ldGxpbmtfY2FwYWJsZShzb2NrLCBOTF9OT05ST09UX1NFTkQpKQorCQkJcmV0dXJuIC1FUEVSTTsKKwl9IGVsc2UgeworCQlkc3RfcGlkID0gbmxrLT5kc3RfcGlkOworCQlkc3RfZ3JvdXBzID0gbmxrLT5kc3RfZ3JvdXBzOworCX0KKworCWlmICghbmxrLT5waWQpIHsKKwkJZXJyID0gbmV0bGlua19hdXRvYmluZChzb2NrKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKworCWVyciA9IC1FTVNHU0laRTsKKwlpZiAobGVuID4gc2stPnNrX3NuZGJ1ZiAtIDMyKQorCQlnb3RvIG91dDsKKwllcnIgPSAtRU5PQlVGUzsKKwlza2IgPSBhbGxvY19za2IobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2tiPT1OVUxMKQorCQlnb3RvIG91dDsKKworCU5FVExJTktfQ0Ioc2tiKS5waWQJPSBubGstPnBpZDsKKwlORVRMSU5LX0NCKHNrYikuZ3JvdXBzCT0gbmxrLT5ncm91cHM7CisJTkVUTElOS19DQihza2IpLmRzdF9waWQgPSBkc3RfcGlkOworCU5FVExJTktfQ0Ioc2tiKS5kc3RfZ3JvdXBzID0gZHN0X2dyb3VwczsKKwltZW1jcHkoTkVUTElOS19DUkVEUyhza2IpLCAmc2lvY2ItPnNjbS0+Y3JlZHMsIHNpemVvZihzdHJ1Y3QgdWNyZWQpKTsKKworCS8qIFdoYXQgY2FuIEkgZG8/IE5ldGxpbmsgaXMgYXN5bmNocm9ub3VzLCBzbyB0aGF0CisJICAgd2Ugd2lsbCBoYXZlIHRvIHNhdmUgY3VycmVudCBjYXBhYmlsaXRpZXMgdG8KKwkgICBjaGVjayB0aGVtLCB3aGVuIHRoaXMgbWVzc2FnZSB3aWxsIGJlIGRlbGl2ZXJlZAorCSAgIHRvIGNvcnJlc3BvbmRpbmcga2VybmVsIG1vZHVsZS4gICAtLUFOSyAoOTgwODAyKQorCSAqLworCisJZXJyID0gLUVGQVVMVDsKKwlpZiAobWVtY3B5X2Zyb21pb3ZlYyhza2JfcHV0KHNrYixsZW4pLCBtc2ctPm1zZ19pb3YsIGxlbikpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IHNlY3VyaXR5X25ldGxpbmtfc2VuZChzaywgc2tiKTsKKwlpZiAoZXJyKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZHN0X2dyb3VwcykgeworCQlhdG9taWNfaW5jKCZza2ItPnVzZXJzKTsKKwkJbmV0bGlua19icm9hZGNhc3Qoc2ssIHNrYiwgZHN0X3BpZCwgZHN0X2dyb3VwcywgR0ZQX0tFUk5FTCk7CisJfQorCWVyciA9IG5ldGxpbmtfdW5pY2FzdChzaywgc2tiLCBkc3RfcGlkLCBtc2ctPm1zZ19mbGFncyZNU0dfRE9OVFdBSVQpOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBuZXRsaW5rX3JlY3Ztc2coc3RydWN0IGtpb2NiICpraW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCSAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwKKwkJCSAgIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29ja19pb2NiICpzaW9jYiA9IGtpb2NiX3RvX3Npb2NiKGtpb2NiKTsKKwlzdHJ1Y3Qgc2NtX2Nvb2tpZSBzY207CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTsKKwlpbnQgbm9ibG9jayA9IGZsYWdzJk1TR19ET05UV0FJVDsKKwlzaXplX3QgY29waWVkOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGVycjsKKworCWlmIChmbGFncyZNU0dfT09CKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwljb3BpZWQgPSAwOworCisJc2tiID0gc2tiX3JlY3ZfZGF0YWdyYW0oc2ssZmxhZ3Msbm9ibG9jaywmZXJyKTsKKwlpZiAoc2tiPT1OVUxMKQorCQlnb3RvIG91dDsKKworCW1zZy0+bXNnX25hbWVsZW4gPSAwOworCisJY29waWVkID0gc2tiLT5sZW47CisJaWYgKGxlbiA8IGNvcGllZCkgeworCQltc2ctPm1zZ19mbGFncyB8PSBNU0dfVFJVTkM7CisJCWNvcGllZCA9IGxlbjsKKwl9CisKKwlza2ItPmgucmF3ID0gc2tiLT5kYXRhOworCWVyciA9IHNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgMCwgbXNnLT5tc2dfaW92LCBjb3BpZWQpOworCisJaWYgKG1zZy0+bXNnX25hbWUpIHsKKwkJc3RydWN0IHNvY2thZGRyX25sICphZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9ubCopbXNnLT5tc2dfbmFtZTsKKwkJYWRkci0+bmxfZmFtaWx5ID0gQUZfTkVUTElOSzsKKwkJYWRkci0+bmxfcGFkICAgID0gMDsKKwkJYWRkci0+bmxfcGlkCT0gTkVUTElOS19DQihza2IpLnBpZDsKKwkJYWRkci0+bmxfZ3JvdXBzCT0gTkVUTElOS19DQihza2IpLmRzdF9ncm91cHM7CisJCW1zZy0+bXNnX25hbWVsZW4gPSBzaXplb2YoKmFkZHIpOworCX0KKworCWlmIChOVUxMID09IHNpb2NiLT5zY20pIHsKKwkJbWVtc2V0KCZzY20sIDAsIHNpemVvZihzY20pKTsKKwkJc2lvY2ItPnNjbSA9ICZzY207CisJfQorCXNpb2NiLT5zY20tPmNyZWRzID0gKk5FVExJTktfQ1JFRFMoc2tiKTsKKwlza2JfZnJlZV9kYXRhZ3JhbShzaywgc2tiKTsKKworCWlmIChubGstPmNiICYmIGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPD0gc2stPnNrX3JjdmJ1ZiAvIDIpCisJCW5ldGxpbmtfZHVtcChzayk7CisKKwlzY21fcmVjdihzb2NrLCBtc2csIHNpb2NiLT5zY20sIGZsYWdzKTsKKworb3V0OgorCW5ldGxpbmtfcmN2X3dha2Uoc2spOworCXJldHVybiBlcnIgPyA6IGNvcGllZDsKK30KKworc3RhdGljIHZvaWQgbmV0bGlua19kYXRhX3JlYWR5KHN0cnVjdCBzb2NrICpzaywgaW50IGxlbikKK3sKKwlzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2soc2spOworCisJaWYgKG5say0+ZGF0YV9yZWFkeSkKKwkJbmxrLT5kYXRhX3JlYWR5KHNrLCBsZW4pOworCW5ldGxpbmtfcmN2X3dha2Uoc2spOworfQorCisvKgorICoJV2UgZXhwb3J0IHRoZXNlIGZ1bmN0aW9ucyB0byBvdGhlciBtb2R1bGVzLiBUaGV5IHByb3ZpZGUgYSAKKyAqCWNvbXBsZXRlIHNldCBvZiBrZXJuZWwgbm9uLWJsb2NraW5nIHN1cHBvcnQgZm9yIG1lc3NhZ2UKKyAqCXF1ZXVlaW5nLgorICovCisKK3N0cnVjdCBzb2NrICoKK25ldGxpbmtfa2VybmVsX2NyZWF0ZShpbnQgdW5pdCwgdm9pZCAoKmlucHV0KShzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4pKQoreworCXN0cnVjdCBzb2NrZXQgKnNvY2s7CisJc3RydWN0IHNvY2sgKnNrOworCisJaWYgKCFubF90YWJsZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAodW5pdDwwIHx8IHVuaXQ+PU1BWF9MSU5LUykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoc29ja19jcmVhdGVfbGl0ZShQRl9ORVRMSU5LLCBTT0NLX0RHUkFNLCB1bml0LCAmc29jaykpCisJCXJldHVybiBOVUxMOworCisJaWYgKG5ldGxpbmtfY3JlYXRlKHNvY2ssIHVuaXQpIDwgMCkgeworCQlzb2NrX3JlbGVhc2Uoc29jayk7CisJCXJldHVybiBOVUxMOworCX0KKwlzayA9IHNvY2stPnNrOworCXNrLT5za19kYXRhX3JlYWR5ID0gbmV0bGlua19kYXRhX3JlYWR5OworCWlmIChpbnB1dCkKKwkJbmxrX3NrKHNrKS0+ZGF0YV9yZWFkeSA9IGlucHV0OworCisJaWYgKG5ldGxpbmtfaW5zZXJ0KHNrLCAwKSkgeworCQlzb2NrX3JlbGVhc2Uoc29jayk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gc2s7Cit9CisKK3ZvaWQgbmV0bGlua19zZXRfbm9ucm9vdChpbnQgcHJvdG9jb2wsIHVuc2lnbmVkIGludCBmbGFncykKK3sgCisJaWYgKCh1bnNpZ25lZCBpbnQpcHJvdG9jb2wgPCBNQVhfTElOS1MpIAorCQlubF90YWJsZVtwcm90b2NvbF0ubmxfbm9ucm9vdCA9IGZsYWdzOworfSAKKworc3RhdGljIHZvaWQgbmV0bGlua19kZXN0cm95X2NhbGxiYWNrKHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlpZiAoY2ItPnNrYikKKwkJa2ZyZWVfc2tiKGNiLT5za2IpOworCWtmcmVlKGNiKTsKK30KKworLyoKKyAqIEl0IGxvb2tzIGEgYml0IHVnbHkuCisgKiBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gY3JlYXRlIGtlcm5lbCB0aHJlYWQuCisgKi8KKworc3RhdGljIGludCBuZXRsaW5rX2R1bXAoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzayk7CisJc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisJaW50IGxlbjsKKwkKKwlza2IgPSBzb2NrX3JtYWxsb2Moc2ssIE5MTVNHX0dPT0RTSVpFLCAwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJc3Bpbl9sb2NrKCZubGstPmNiX2xvY2spOworCisJY2IgPSBubGstPmNiOworCWlmIChjYiA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrKCZubGstPmNiX2xvY2spOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbGVuID0gY2ItPmR1bXAoc2tiLCBjYik7CisKKwlpZiAobGVuID4gMCkgeworCQlzcGluX3VubG9jaygmbmxrLT5jYl9sb2NrKTsKKwkJc2tiX3F1ZXVlX3RhaWwoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpOworCQlzay0+c2tfZGF0YV9yZWFkeShzaywgbGVuKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbmxoID0gX19ubG1zZ19wdXQoc2tiLCBORVRMSU5LX0NCKGNiLT5za2IpLnBpZCwgY2ItPm5saC0+bmxtc2dfc2VxLCBOTE1TR19ET05FLCBzaXplb2YoaW50KSk7CisJbmxoLT5ubG1zZ19mbGFncyB8PSBOTE1fRl9NVUxUSTsKKwltZW1jcHkoTkxNU0dfREFUQShubGgpLCAmbGVuLCBzaXplb2YobGVuKSk7CisJc2tiX3F1ZXVlX3RhaWwoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpOworCXNrLT5za19kYXRhX3JlYWR5KHNrLCBza2ItPmxlbik7CisKKwljYi0+ZG9uZShjYik7CisJbmxrLT5jYiA9IE5VTEw7CisJc3Bpbl91bmxvY2soJm5say0+Y2JfbG9jayk7CisKKwluZXRsaW5rX2Rlc3Ryb3lfY2FsbGJhY2soY2IpOworCV9fc29ja19wdXQoc2spOworCXJldHVybiAwOworfQorCitpbnQgbmV0bGlua19kdW1wX3N0YXJ0KHN0cnVjdCBzb2NrICpzc2ssIHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKKwkJICAgICAgIGludCAoKmR1bXApKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrKiksCisJCSAgICAgICBpbnQgKCpkb25lKShzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayopKQoreworCXN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYjsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrOworCisJY2IgPSBrbWFsbG9jKHNpemVvZigqY2IpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJbWVtc2V0KGNiLCAwLCBzaXplb2YoKmNiKSk7CisJY2ItPmR1bXAgPSBkdW1wOworCWNiLT5kb25lID0gZG9uZTsKKwljYi0+bmxoID0gbmxoOworCWF0b21pY19pbmMoJnNrYi0+dXNlcnMpOworCWNiLT5za2IgPSBza2I7CisKKwlzayA9IG5ldGxpbmtfbG9va3VwKHNzay0+c2tfcHJvdG9jb2wsIE5FVExJTktfQ0Ioc2tiKS5waWQpOworCWlmIChzayA9PSBOVUxMKSB7CisJCW5ldGxpbmtfZGVzdHJveV9jYWxsYmFjayhjYik7CisJCXJldHVybiAtRUNPTk5SRUZVU0VEOworCX0KKwlubGsgPSBubGtfc2soc2spOworCS8qIEEgZHVtcCBpcyBpbiBwcm9ncmVzcy4uLiAqLworCXNwaW5fbG9jaygmbmxrLT5jYl9sb2NrKTsKKwlpZiAobmxrLT5jYikgeworCQlzcGluX3VubG9jaygmbmxrLT5jYl9sb2NrKTsKKwkJbmV0bGlua19kZXN0cm95X2NhbGxiYWNrKGNiKTsKKwkJc29ja19wdXQoc2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlubGstPmNiID0gY2I7CisJc29ja19ob2xkKHNrKTsKKwlzcGluX3VubG9jaygmbmxrLT5jYl9sb2NrKTsKKworCW5ldGxpbmtfZHVtcChzayk7CisJc29ja19wdXQoc2spOworCXJldHVybiAwOworfQorCit2b2lkIG5ldGxpbmtfYWNrKHN0cnVjdCBza19idWZmICppbl9za2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCBpbnQgZXJyKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5sbXNnaGRyICpyZXA7CisJc3RydWN0IG5sbXNnZXJyICplcnJtc2c7CisJaW50IHNpemU7CisKKwlpZiAoZXJyID09IDApCisJCXNpemUgPSBOTE1TR19TUEFDRShzaXplb2Yoc3RydWN0IG5sbXNnZXJyKSk7CisJZWxzZQorCQlzaXplID0gTkxNU0dfU1BBQ0UoNCArIE5MTVNHX0FMSUdOKG5saC0+bmxtc2dfbGVuKSk7CisKKwlza2IgPSBhbGxvY19za2Ioc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFza2IpIHsKKwkJc3RydWN0IHNvY2sgKnNrOworCisJCXNrID0gbmV0bGlua19sb29rdXAoaW5fc2tiLT5zay0+c2tfcHJvdG9jb2wsCisJCQkJICAgIE5FVExJTktfQ0IoaW5fc2tiKS5waWQpOworCQlpZiAoc2spIHsKKwkJCXNrLT5za19lcnIgPSBFTk9CVUZTOworCQkJc2stPnNrX2Vycm9yX3JlcG9ydChzayk7CisJCQlzb2NrX3B1dChzayk7CisJCX0KKwkJcmV0dXJuOworCX0KKworCXJlcCA9IF9fbmxtc2dfcHV0KHNrYiwgTkVUTElOS19DQihpbl9za2IpLnBpZCwgbmxoLT5ubG1zZ19zZXEsCisJCQkgIE5MTVNHX0VSUk9SLCBzaXplb2Yoc3RydWN0IG5sbXNnZXJyKSk7CisJZXJybXNnID0gTkxNU0dfREFUQShyZXApOworCWVycm1zZy0+ZXJyb3IgPSBlcnI7CisJbWVtY3B5KCZlcnJtc2ctPm1zZywgbmxoLCBlcnIgPyBubGgtPm5sbXNnX2xlbiA6IHNpemVvZihzdHJ1Y3Qgbmxtc2doZHIpKTsKKwluZXRsaW5rX3VuaWNhc3QoaW5fc2tiLT5zaywgc2tiLCBORVRMSU5LX0NCKGluX3NrYikucGlkLCBNU0dfRE9OVFdBSVQpOworfQorCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RydWN0IG5sX3NlcV9pdGVyIHsKKwlpbnQgbGluazsKKwlpbnQgaGFzaF9pZHg7Cit9OworCitzdGF0aWMgc3RydWN0IHNvY2sgKm5ldGxpbmtfc2VxX3NvY2tldF9pZHgoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCBwb3MpCit7CisJc3RydWN0IG5sX3NlcV9pdGVyICppdGVyID0gc2VxLT5wcml2YXRlOworCWludCBpLCBqOworCXN0cnVjdCBzb2NrICpzOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCWxvZmZfdCBvZmYgPSAwOworCisJZm9yIChpPTA7IGk8TUFYX0xJTktTOyBpKyspIHsKKwkJc3RydWN0IG5sX3BpZF9oYXNoICpoYXNoID0gJm5sX3RhYmxlW2ldLmhhc2g7CisKKwkJZm9yIChqID0gMDsgaiA8PSBoYXNoLT5tYXNrOyBqKyspIHsKKwkJCXNrX2Zvcl9lYWNoKHMsIG5vZGUsICZoYXNoLT50YWJsZVtqXSkgeworCQkJCWlmIChvZmYgPT0gcG9zKSB7CisJCQkJCWl0ZXItPmxpbmsgPSBpOworCQkJCQlpdGVyLT5oYXNoX2lkeCA9IGo7CisJCQkJCXJldHVybiBzOworCQkJCX0KKwkJCQkrK29mZjsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKm5ldGxpbmtfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlyZWFkX2xvY2soJm5sX3RhYmxlX2xvY2spOworCXJldHVybiAqcG9zID8gbmV0bGlua19zZXFfc29ja2V0X2lkeChzZXEsICpwb3MgLSAxKSA6IFNFUV9TVEFSVF9UT0tFTjsKK30KKworc3RhdGljIHZvaWQgKm5ldGxpbmtfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBzb2NrICpzOworCXN0cnVjdCBubF9zZXFfaXRlciAqaXRlcjsKKwlpbnQgaSwgajsKKworCSsrKnBvczsKKworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKKwkJcmV0dXJuIG5ldGxpbmtfc2VxX3NvY2tldF9pZHgoc2VxLCAwKTsKKwkJCisJcyA9IHNrX25leHQodik7CisJaWYgKHMpCisJCXJldHVybiBzOworCisJaXRlciA9IHNlcS0+cHJpdmF0ZTsKKwlpID0gaXRlci0+bGluazsKKwlqID0gaXRlci0+aGFzaF9pZHggKyAxOworCisJZG8geworCQlzdHJ1Y3QgbmxfcGlkX2hhc2ggKmhhc2ggPSAmbmxfdGFibGVbaV0uaGFzaDsKKworCQlmb3IgKDsgaiA8PSBoYXNoLT5tYXNrOyBqKyspIHsKKwkJCXMgPSBza19oZWFkKCZoYXNoLT50YWJsZVtqXSk7CisJCQlpZiAocykgeworCQkJCWl0ZXItPmxpbmsgPSBpOworCQkJCWl0ZXItPmhhc2hfaWR4ID0gajsKKwkJCQlyZXR1cm4gczsKKwkJCX0KKwkJfQorCisJCWogPSAwOworCX0gd2hpbGUgKCsraSA8IE1BWF9MSU5LUyk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgbmV0bGlua19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlyZWFkX3VubG9jaygmbmxfdGFibGVfbG9jayk7Cit9CisKKworc3RhdGljIGludCBuZXRsaW5rX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKKwkJc2VxX3B1dHMoc2VxLAorCQkJICJzayAgICAgICBFdGggUGlkICAgIEdyb3VwcyAgICIKKwkJCSAiUm1lbSAgICAgV21lbSAgICAgRHVtcCAgICAgTG9ja3NcbiIpOworCWVsc2UgeworCQlzdHJ1Y3Qgc29jayAqcyA9IHY7CisJCXN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzKTsKKworCQlzZXFfcHJpbnRmKHNlcSwgIiVwICUtM2QgJS02ZCAlMDh4ICUtOGQgJS04ZCAlcCAlZFxuIiwKKwkJCSAgIHMsCisJCQkgICBzLT5za19wcm90b2NvbCwKKwkJCSAgIG5say0+cGlkLAorCQkJICAgbmxrLT5ncm91cHMsCisJCQkgICBhdG9taWNfcmVhZCgmcy0+c2tfcm1lbV9hbGxvYyksCisJCQkgICBhdG9taWNfcmVhZCgmcy0+c2tfd21lbV9hbGxvYyksCisJCQkgICBubGstPmNiLAorCQkJICAgYXRvbWljX3JlYWQoJnMtPnNrX3JlZmNudCkKKwkJCSk7CisKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbmV0bGlua19zZXFfb3BzID0geworCS5zdGFydCAgPSBuZXRsaW5rX3NlcV9zdGFydCwKKwkubmV4dCAgID0gbmV0bGlua19zZXFfbmV4dCwKKwkuc3RvcCAgID0gbmV0bGlua19zZXFfc3RvcCwKKwkuc2hvdyAgID0gbmV0bGlua19zZXFfc2hvdywKK307CisKKworc3RhdGljIGludCBuZXRsaW5rX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzZXFfZmlsZSAqc2VxOworCXN0cnVjdCBubF9zZXFfaXRlciAqaXRlcjsKKwlpbnQgZXJyOworCisJaXRlciA9IGttYWxsb2Moc2l6ZW9mKCppdGVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpdGVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVyciA9IHNlcV9vcGVuKGZpbGUsICZuZXRsaW5rX3NlcV9vcHMpOworCWlmIChlcnIpIHsKKwkJa2ZyZWUoaXRlcik7CisJCXJldHVybiBlcnI7CisJfQorCisJbWVtc2V0KGl0ZXIsIDAsIHNpemVvZigqaXRlcikpOworCXNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzZXEtPnByaXZhdGUgPSBpdGVyOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBuZXRsaW5rX3NlcV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBuZXRsaW5rX3NlcV9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2VfcHJpdmF0ZSwKK307CisKKyNlbmRpZgorCitpbnQgbmV0bGlua19yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCXJldHVybiBub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmbmV0bGlua19jaGFpbiwgbmIpOworfQorCitpbnQgbmV0bGlua191bnJlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0dXJuIG5vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJm5ldGxpbmtfY2hhaW4sIG5iKTsKK30KKyAgICAgICAgICAgICAgICAKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIG5ldGxpbmtfb3BzID0geworCS5mYW1pbHkgPQlQRl9ORVRMSU5LLAorCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5yZWxlYXNlID0JbmV0bGlua19yZWxlYXNlLAorCS5iaW5kID0JCW5ldGxpbmtfYmluZCwKKwkuY29ubmVjdCA9CW5ldGxpbmtfY29ubmVjdCwKKwkuc29ja2V0cGFpciA9CXNvY2tfbm9fc29ja2V0cGFpciwKKwkuYWNjZXB0ID0Jc29ja19ub19hY2NlcHQsCisJLmdldG5hbWUgPQluZXRsaW5rX2dldG5hbWUsCisJLnBvbGwgPQkJZGF0YWdyYW1fcG9sbCwKKwkuaW9jdGwgPQlzb2NrX25vX2lvY3RsLAorCS5saXN0ZW4gPQlzb2NrX25vX2xpc3RlbiwKKwkuc2h1dGRvd24gPQlzb2NrX25vX3NodXRkb3duLAorCS5zZXRzb2Nrb3B0ID0Jc29ja19ub19zZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0ID0Jc29ja19ub19nZXRzb2Nrb3B0LAorCS5zZW5kbXNnID0JbmV0bGlua19zZW5kbXNnLAorCS5yZWN2bXNnID0JbmV0bGlua19yZWN2bXNnLAorCS5tbWFwID0JCXNvY2tfbm9fbW1hcCwKKwkuc2VuZHBhZ2UgPQlzb2NrX25vX3NlbmRwYWdlLAorfTsKKworc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5IG5ldGxpbmtfZmFtaWx5X29wcyA9IHsKKwkuZmFtaWx5ID0gUEZfTkVUTElOSywKKwkuY3JlYXRlID0gbmV0bGlua19jcmVhdGUsCisJLm93bmVyCT0gVEhJU19NT0RVTEUsCS8qIGZvciBjb25zaXN0ZW5jeSA4KSAqLworfTsKKworZXh0ZXJuIHZvaWQgbmV0bGlua19za2JfcGFybXNfdG9vX2xhcmdlKHZvaWQpOworCitzdGF0aWMgaW50IF9faW5pdCBuZXRsaW5rX3Byb3RvX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqZHVtbXlfc2tiOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgbWF4OworCXVuc2lnbmVkIGludCBvcmRlcjsKKwlpbnQgZXJyID0gcHJvdG9fcmVnaXN0ZXIoJm5ldGxpbmtfcHJvdG8sIDApOworCisJaWYgKGVyciAhPSAwKQorCQlnb3RvIG91dDsKKworCWlmIChzaXplb2Yoc3RydWN0IG5ldGxpbmtfc2tiX3Bhcm1zKSA+IHNpemVvZihkdW1teV9za2ItPmNiKSkKKwkJbmV0bGlua19za2JfcGFybXNfdG9vX2xhcmdlKCk7CisKKwlubF90YWJsZSA9IGttYWxsb2Moc2l6ZW9mKCpubF90YWJsZSkgKiBNQVhfTElOS1MsIEdGUF9LRVJORUwpOworCWlmICghbmxfdGFibGUpIHsKK2Vub21lbToKKwkJcHJpbnRrKEtFUk5fQ1JJVCAibmV0bGlua19pbml0OiBDYW5ub3QgYWxsb2NhdGUgbmxfdGFibGVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQobmxfdGFibGUsIDAsIHNpemVvZigqbmxfdGFibGUpICogTUFYX0xJTktTKTsKKworCWlmIChudW1fcGh5c3BhZ2VzID49ICgxMjggKiAxMDI0KSkKKwkJbWF4ID0gbnVtX3BoeXNwYWdlcyA+PiAoMjEgLSBQQUdFX1NISUZUKTsKKwllbHNlCisJCW1heCA9IG51bV9waHlzcGFnZXMgPj4gKDIzIC0gUEFHRV9TSElGVCk7CisKKwlvcmRlciA9IGdldF9iaXRtYXNrX29yZGVyKG1heCkgLSAxICsgUEFHRV9TSElGVDsKKwltYXggPSAoMVVMIDw8IG9yZGVyKSAvIHNpemVvZihzdHJ1Y3QgaGxpc3RfaGVhZCk7CisJb3JkZXIgPSBnZXRfYml0bWFza19vcmRlcihtYXggPiBVSU5UX01BWCA/IFVJTlRfTUFYIDogbWF4KSAtIDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xJTktTOyBpKyspIHsKKwkJc3RydWN0IG5sX3BpZF9oYXNoICpoYXNoID0gJm5sX3RhYmxlW2ldLmhhc2g7CisKKwkJaGFzaC0+dGFibGUgPSBubF9waWRfaGFzaF9hbGxvYygxICogc2l6ZW9mKCpoYXNoLT50YWJsZSkpOworCQlpZiAoIWhhc2gtPnRhYmxlKSB7CisJCQl3aGlsZSAoaS0tID4gMCkKKwkJCQlubF9waWRfaGFzaF9mcmVlKG5sX3RhYmxlW2ldLmhhc2gudGFibGUsCisJCQkJCQkgMSAqIHNpemVvZigqaGFzaC0+dGFibGUpKTsKKwkJCWtmcmVlKG5sX3RhYmxlKTsKKwkJCWdvdG8gZW5vbWVtOworCQl9CisJCW1lbXNldChoYXNoLT50YWJsZSwgMCwgMSAqIHNpemVvZigqaGFzaC0+dGFibGUpKTsKKwkJaGFzaC0+bWF4X3NoaWZ0ID0gb3JkZXI7CisJCWhhc2gtPnNoaWZ0ID0gMDsKKwkJaGFzaC0+bWFzayA9IDA7CisJCWhhc2gtPnJlaGFzaF90aW1lID0gamlmZmllczsKKwl9CisKKwlzb2NrX3JlZ2lzdGVyKCZuZXRsaW5rX2ZhbWlseV9vcHMpOworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJcHJvY19uZXRfZm9wc19jcmVhdGUoIm5ldGxpbmsiLCAwLCAmbmV0bGlua19zZXFfZm9wcyk7CisjZW5kaWYKKwkvKiBUaGUgbmV0bGluayBkZXZpY2UgaGFuZGxlciBtYXkgYmUgbmVlZGVkIGVhcmx5LiAqLyAKKwlydG5ldGxpbmtfaW5pdCgpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBuZXRsaW5rX3Byb3RvX2V4aXQodm9pZCkKK3sKKwlzb2NrX3VucmVnaXN0ZXIoUEZfTkVUTElOSyk7CisJcHJvY19uZXRfcmVtb3ZlKCJuZXRsaW5rIik7CisJa2ZyZWUobmxfdGFibGUpOworCW5sX3RhYmxlID0gTlVMTDsKKwlwcm90b191bnJlZ2lzdGVyKCZuZXRsaW5rX3Byb3RvKTsKK30KKworY29yZV9pbml0Y2FsbChuZXRsaW5rX3Byb3RvX2luaXQpOworbW9kdWxlX2V4aXQobmV0bGlua19wcm90b19leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitNT0RVTEVfQUxJQVNfTkVUUFJPVE8oUEZfTkVUTElOSyk7CisKK0VYUE9SVF9TWU1CT0wobmV0bGlua19hY2spOworRVhQT1JUX1NZTUJPTChuZXRsaW5rX2Jyb2FkY2FzdCk7CitFWFBPUlRfU1lNQk9MKG5ldGxpbmtfZHVtcF9zdGFydCk7CitFWFBPUlRfU1lNQk9MKG5ldGxpbmtfa2VybmVsX2NyZWF0ZSk7CitFWFBPUlRfU1lNQk9MKG5ldGxpbmtfcmVnaXN0ZXJfbm90aWZpZXIpOworRVhQT1JUX1NZTUJPTChuZXRsaW5rX3NldF9lcnIpOworRVhQT1JUX1NZTUJPTChuZXRsaW5rX3NldF9ub25yb290KTsKK0VYUE9SVF9TWU1CT0wobmV0bGlua191bmljYXN0KTsKK0VYUE9SVF9TWU1CT0wobmV0bGlua191bnJlZ2lzdGVyX25vdGlmaWVyKTsKKwpkaWZmIC0tZ2l0IGEvbmV0L25ldHJvbS9NYWtlZmlsZSBiL25ldC9uZXRyb20vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY2MGY1YQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRyb20vTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggTkVUL1JPTSBsYXllci4KKyMKKworb2JqLSQoQ09ORklHX05FVFJPTSkgKz0gbmV0cm9tLm8KKworbmV0cm9tLXkJCTo9IGFmX25ldHJvbS5vIG5yX2Rldi5vIG5yX2luLm8gbnJfbG9vcGJhY2subyBcCisJCQkgICBucl9vdXQubyBucl9yb3V0ZS5vIG5yX3N1YnIubyBucl90aW1lci5vCituZXRyb20tJChDT05GSUdfU1lTQ1RMKQkrPSBzeXNjdGxfbmV0X25ldHJvbS5vCmRpZmYgLS1naXQgYS9uZXQvbmV0cm9tL2FmX25ldHJvbS5jIGIvbmV0L25ldHJvbS9hZl9uZXRyb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWVkNGE5Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldHJvbS9hZl9uZXRyb20uYwpAQCAtMCwwICsxLDE0ODUgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENvcHlyaWdodCBKb25hdGhhbiBOYXlsb3IgRzRLTFggKGc0a2x4QGc0a2x4LmRlbW9uLmNvLnVrKQorICogQ29weXJpZ2h0IEFsYW4gQ294IEdXNFBUUyAoYWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrKQorICogQ29weXJpZ2h0IERhcnJ5bCBNaWxlcyBHN0xFRCAoZGxtQGc3bGVkLmRlbW9uLmNvLnVrKQorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxuZXQvYXgyNS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgkvKiBGb3IgVElPQ0lOUS9PVVRRICovCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPG5ldC9uZXRyb20uaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworc3RhdGljIGludCBucl9uZGV2cyA9IDQ7CisKK2ludCBzeXNjdGxfbmV0cm9tX2RlZmF1bHRfcGF0aF9xdWFsaXR5ICAgICAgICAgICAgPSBOUl9ERUZBVUxUX1FVQUw7CitpbnQgc3lzY3RsX25ldHJvbV9vYnNvbGVzY2VuY2VfY291bnRfaW5pdGlhbGlzZXIgID0gTlJfREVGQVVMVF9PQlM7CitpbnQgc3lzY3RsX25ldHJvbV9uZXR3b3JrX3R0bF9pbml0aWFsaXNlciAgICAgICAgID0gTlJfREVGQVVMVF9UVEw7CitpbnQgc3lzY3RsX25ldHJvbV90cmFuc3BvcnRfdGltZW91dCAgICAgICAgICAgICAgID0gTlJfREVGQVVMVF9UMTsKK2ludCBzeXNjdGxfbmV0cm9tX3RyYW5zcG9ydF9tYXhpbXVtX3RyaWVzICAgICAgICAgPSBOUl9ERUZBVUxUX04yOworaW50IHN5c2N0bF9uZXRyb21fdHJhbnNwb3J0X2Fja25vd2xlZGdlX2RlbGF5ICAgICA9IE5SX0RFRkFVTFRfVDI7CitpbnQgc3lzY3RsX25ldHJvbV90cmFuc3BvcnRfYnVzeV9kZWxheSAgICAgICAgICAgID0gTlJfREVGQVVMVF9UNDsKK2ludCBzeXNjdGxfbmV0cm9tX3RyYW5zcG9ydF9yZXF1ZXN0ZWRfd2luZG93X3NpemUgPSBOUl9ERUZBVUxUX1dJTkRPVzsKK2ludCBzeXNjdGxfbmV0cm9tX3RyYW5zcG9ydF9ub19hY3Rpdml0eV90aW1lb3V0ICAgPSBOUl9ERUZBVUxUX0lETEU7CitpbnQgc3lzY3RsX25ldHJvbV9yb3V0aW5nX2NvbnRyb2wgICAgICAgICAgICAgICAgID0gTlJfREVGQVVMVF9ST1VUSU5HOworaW50IHN5c2N0bF9uZXRyb21fbGlua19mYWlsc19jb3VudCAgICAgICAgICAgICAgICA9IE5SX0RFRkFVTFRfRkFJTFM7CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBjaXJjdWl0ID0gMHgxMDE7CisKK3N0YXRpYyBITElTVF9IRUFEKG5yX2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhucl9saXN0X2xvY2spOworCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBucl9wcm90b19vcHM7CisKKy8qCisgKglTb2NrZXQgcmVtb3ZhbCBkdXJpbmcgYW4gaW50ZXJydXB0IGlzIG5vdyBzYWZlLgorICovCitzdGF0aWMgdm9pZCBucl9yZW1vdmVfc29ja2V0KHN0cnVjdCBzb2NrICpzaykKK3sKKwlzcGluX2xvY2tfYmgoJm5yX2xpc3RfbG9jayk7CisJc2tfZGVsX25vZGVfaW5pdChzayk7CisJc3Bpbl91bmxvY2tfYmgoJm5yX2xpc3RfbG9jayk7Cit9CisKKy8qCisgKglLaWxsIGFsbCBib3VuZCBzb2NrZXRzIG9uIGEgZHJvcHBlZCBkZXZpY2UuCisgKi8KK3N0YXRpYyB2b2lkIG5yX2tpbGxfYnlfZGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNvY2sgKnM7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisKKwlzcGluX2xvY2tfYmgoJm5yX2xpc3RfbG9jayk7CisJc2tfZm9yX2VhY2gocywgbm9kZSwgJm5yX2xpc3QpCisJCWlmIChucl9zayhzKS0+ZGV2aWNlID09IGRldikKKwkJCW5yX2Rpc2Nvbm5lY3QocywgRU5FVFVOUkVBQ0gpOworCXNwaW5fdW5sb2NrX2JoKCZucl9saXN0X2xvY2spOworfQorCisvKgorICoJSGFuZGxlIGRldmljZSBzdGF0dXMgY2hhbmdlcy4KKyAqLworc3RhdGljIGludCBucl9kZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXB0cjsKKworCWlmIChldmVudCAhPSBORVRERVZfRE9XTikKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJbnJfa2lsbF9ieV9kZXZpY2UoZGV2KTsKKwlucl9ydF9kZXZpY2VfZG93bihkZXYpOworCQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworLyoKKyAqCUFkZCBhIHNvY2tldCB0byB0aGUgYm91bmQgc29ja2V0cyBsaXN0LgorICovCitzdGF0aWMgdm9pZCBucl9pbnNlcnRfc29ja2V0KHN0cnVjdCBzb2NrICpzaykKK3sKKwlzcGluX2xvY2tfYmgoJm5yX2xpc3RfbG9jayk7CisJc2tfYWRkX25vZGUoc2ssICZucl9saXN0KTsKKwlzcGluX3VubG9ja19iaCgmbnJfbGlzdF9sb2NrKTsKK30KKworLyoKKyAqCUZpbmQgYSBzb2NrZXQgdGhhdCB3YW50cyB0byBhY2NlcHQgdGhlIENvbm5lY3QgUmVxdWVzdCB3ZSBqdXN0CisgKglyZWNlaXZlZC4KKyAqLworc3RhdGljIHN0cnVjdCBzb2NrICpucl9maW5kX2xpc3RlbmVyKGF4MjVfYWRkcmVzcyAqYWRkcikKK3sKKwlzdHJ1Y3Qgc29jayAqczsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCXNwaW5fbG9ja19iaCgmbnJfbGlzdF9sb2NrKTsKKwlza19mb3JfZWFjaChzLCBub2RlLCAmbnJfbGlzdCkKKwkJaWYgKCFheDI1Y21wKCZucl9zayhzKS0+c291cmNlX2FkZHIsIGFkZHIpICYmCisJCSAgICBzLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOKSB7CisJCSAgICAJYmhfbG9ja19zb2NrKHMpOworCQkJZ290byBmb3VuZDsKKwkJfQorCXMgPSBOVUxMOworZm91bmQ6CisJc3Bpbl91bmxvY2tfYmgoJm5yX2xpc3RfbG9jayk7CisJcmV0dXJuIHM7Cit9CisKKy8qCisgKglGaW5kIGEgY29ubmVjdGVkIE5FVC9ST00gc29ja2V0IGdpdmVuIG15IGNpcmN1aXQgSURzLgorICovCitzdGF0aWMgc3RydWN0IHNvY2sgKm5yX2ZpbmRfc29ja2V0KHVuc2lnbmVkIGNoYXIgaW5kZXgsIHVuc2lnbmVkIGNoYXIgaWQpCit7CisJc3RydWN0IHNvY2sgKnM7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisKKwlzcGluX2xvY2tfYmgoJm5yX2xpc3RfbG9jayk7CisJc2tfZm9yX2VhY2gocywgbm9kZSwgJm5yX2xpc3QpIHsKKwkJc3RydWN0IG5yX3NvY2sgKm5yID0gbnJfc2socyk7CisJCQorCQlpZiAobnItPm15X2luZGV4ID09IGluZGV4ICYmIG5yLT5teV9pZCA9PSBpZCkgeworCQkJYmhfbG9ja19zb2NrKHMpOworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKwlzID0gTlVMTDsKK2ZvdW5kOgorCXNwaW5fdW5sb2NrX2JoKCZucl9saXN0X2xvY2spOworCXJldHVybiBzOworfQorCisvKgorICoJRmluZCBhIGNvbm5lY3RlZCBORVQvUk9NIHNvY2tldCBnaXZlbiB0aGVpciBjaXJjdWl0IElEcy4KKyAqLworc3RhdGljIHN0cnVjdCBzb2NrICpucl9maW5kX3BlZXIodW5zaWduZWQgY2hhciBpbmRleCwgdW5zaWduZWQgY2hhciBpZCwKKwlheDI1X2FkZHJlc3MgKmRlc3QpCit7CisJc3RydWN0IHNvY2sgKnM7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisKKwlzcGluX2xvY2tfYmgoJm5yX2xpc3RfbG9jayk7CisJc2tfZm9yX2VhY2gocywgbm9kZSwgJm5yX2xpc3QpIHsKKwkJc3RydWN0IG5yX3NvY2sgKm5yID0gbnJfc2socyk7CisJCQorCQlpZiAobnItPnlvdXJfaW5kZXggPT0gaW5kZXggJiYgbnItPnlvdXJfaWQgPT0gaWQgJiYKKwkJICAgICFheDI1Y21wKCZuci0+ZGVzdF9hZGRyLCBkZXN0KSkgeworCQkgICAgCWJoX2xvY2tfc29jayhzKTsKKwkJCWdvdG8gZm91bmQ7CisJCX0KKwl9CisJcyA9IE5VTEw7Citmb3VuZDoKKwlzcGluX3VubG9ja19iaCgmbnJfbGlzdF9sb2NrKTsKKwlyZXR1cm4gczsKK30KKworLyoKKyAqCUZpbmQgbmV4dCBmcmVlIGNpcmN1aXQgSUQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBucl9maW5kX25leHRfY2lyY3VpdCh2b2lkKQoreworCXVuc2lnbmVkIHNob3J0IGlkID0gY2lyY3VpdDsKKwl1bnNpZ25lZCBjaGFyIGksIGo7CisJc3RydWN0IHNvY2sgKnNrOworCisJZm9yICg7OykgeworCQlpID0gaWQgLyAyNTY7CisJCWogPSBpZCAlIDI1NjsKKworCQlpZiAoaSAhPSAwICYmIGogIT0gMCkgeworCQkJaWYgKChzaz1ucl9maW5kX3NvY2tldChpLCBqKSkgPT0gTlVMTCkKKwkJCQlicmVhazsKKwkJCWJoX3VubG9ja19zb2NrKHNrKTsKKwkJfQorCisJCWlkKys7CisJfQorCisJcmV0dXJuIGlkOworfQorCisvKgorICoJRGVmZXJyZWQgZGVzdHJveS4KKyAqLwordm9pZCBucl9kZXN0cm95X3NvY2tldChzdHJ1Y3Qgc29jayAqKTsKKworLyoKKyAqCUhhbmRsZXIgZm9yIGRlZmVycmVkIGtpbGxzLgorICovCitzdGF0aWMgdm9pZCBucl9kZXN0cm95X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s9KHN0cnVjdCBzb2NrICopZGF0YTsKKwliaF9sb2NrX3NvY2soc2spOworCXNvY2tfaG9sZChzayk7CisJbnJfZGVzdHJveV9zb2NrZXQoc2spOworCWJoX3VubG9ja19zb2NrKHNrKTsKKwlzb2NrX3B1dChzayk7Cit9CisKKy8qCisgKglUaGlzIGlzIGNhbGxlZCBmcm9tIHVzZXIgbW9kZSBhbmQgdGhlIHRpbWVycy4gVGh1cyBpdCBwcm90ZWN0cyBpdHNlbGYKKyAqCWFnYWluc3QgaW50ZXJydXB0IHVzZXJzIGJ1dCBkb2Vzbid0IHdvcnJ5IGFib3V0IGJlaW5nIGNhbGxlZCBkdXJpbmcKKyAqCXdvcmsuIE9uY2UgaXQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSBubyBpbnRlcnJ1cHQgb3IgYm90dG9tIGhhbGYKKyAqCXdpbGwgdG91Y2ggaXQgYW5kIHdlIGFyZSAoZmFpcmx5IDgtKSApIHNhZmUuCisgKi8KK3ZvaWQgbnJfZGVzdHJveV9zb2NrZXQoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlucl9yZW1vdmVfc29ja2V0KHNrKTsKKworCW5yX3N0b3BfaGVhcnRiZWF0KHNrKTsKKwlucl9zdG9wX3QxdGltZXIoc2spOworCW5yX3N0b3BfdDJ0aW1lcihzayk7CisJbnJfc3RvcF90NHRpbWVyKHNrKTsKKwlucl9zdG9wX2lkbGV0aW1lcihzayk7CisKKwlucl9jbGVhcl9xdWV1ZXMoc2spOwkJLyogRmx1c2ggdGhlIHF1ZXVlcyAqLworCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKSAhPSBOVUxMKSB7CisJCWlmIChza2ItPnNrICE9IHNrKSB7IC8qIEEgcGVuZGluZyBjb25uZWN0aW9uICovCisJCQkvKiBRdWV1ZSB0aGUgdW5hY2NlcHRlZCBzb2NrZXQgZm9yIGRlYXRoICovCisJCQlzb2NrX3NldF9mbGFnKHNrYi0+c2ssIFNPQ0tfREVBRCk7CisJCQlucl9zdGFydF9oZWFydGJlYXQoc2tiLT5zayk7CisJCQlucl9zayhza2ItPnNrKS0+c3RhdGUgPSBOUl9TVEFURV8wOworCQl9CisKKwkJa2ZyZWVfc2tiKHNrYik7CisJfQorCisJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYykgfHwKKwkgICAgYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSkgeworCQkvKiBEZWZlcjogb3V0c3RhbmRpbmcgYnVmZmVycyAqLworCQlzay0+c2tfdGltZXIuZnVuY3Rpb24gPSBucl9kZXN0cm95X3RpbWVyOworCQlzay0+c2tfdGltZXIuZXhwaXJlcyAgPSBqaWZmaWVzICsgMiAqIEhaOworCQlhZGRfdGltZXIoJnNrLT5za190aW1lcik7CisJfSBlbHNlCisJCXNvY2tfcHV0KHNrKTsKK30KKworLyoKKyAqCUhhbmRsaW5nIGZvciBzeXN0ZW0gY2FsbHMgYXBwbGllZCB2aWEgdGhlIHZhcmlvdXMgaW50ZXJmYWNlcyB0byBhCisgKglORVQvUk9NIHNvY2tldCBvYmplY3QuCisgKi8KKworc3RhdGljIGludCBucl9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgbnJfc29jayAqbnIgPSBucl9zayhzayk7CisJaW50IG9wdDsKKworCWlmIChsZXZlbCAhPSBTT0xfTkVUUk9NKQorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCisJaWYgKG9wdGxlbiA8IHNpemVvZihpbnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChnZXRfdXNlcihvcHQsIChpbnQgX191c2VyICopb3B0dmFsKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKG9wdG5hbWUpIHsKKwljYXNlIE5FVFJPTV9UMToKKwkJaWYgKG9wdCA8IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbnItPnQxID0gb3B0ICogSFo7CisJCXJldHVybiAwOworCisJY2FzZSBORVRST01fVDI6CisJCWlmIChvcHQgPCAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW5yLT50MiA9IG9wdCAqIEhaOworCQlyZXR1cm4gMDsKKworCWNhc2UgTkVUUk9NX04yOgorCQlpZiAob3B0IDwgMSB8fCBvcHQgPiAzMSkKKwkJCXJldHVybiAtRUlOVkFMOworCQluci0+bjIgPSBvcHQ7CisJCXJldHVybiAwOworCisJY2FzZSBORVRST01fVDQ6CisJCWlmIChvcHQgPCAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW5yLT50NCA9IG9wdCAqIEhaOworCQlyZXR1cm4gMDsKKworCWNhc2UgTkVUUk9NX0lETEU6CisJCWlmIChvcHQgPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW5yLT5pZGxlID0gb3B0ICogNjAgKiBIWjsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCX0KK30KKworc3RhdGljIGludCBucl9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBucl9zb2NrICpuciA9IG5yX3NrKHNrKTsKKwlpbnQgdmFsID0gMDsKKwlpbnQgbGVuOyAKKworCWlmIChsZXZlbCAhPSBTT0xfTkVUUk9NKQorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCQorCWlmIChnZXRfdXNlcihsZW4sIG9wdGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGxlbiA8IDApCisJCXJldHVybiAtRUlOVkFMOworCQkKKwlzd2l0Y2ggKG9wdG5hbWUpIHsKKwljYXNlIE5FVFJPTV9UMToKKwkJdmFsID0gbnItPnQxIC8gSFo7CisJCWJyZWFrOworCisJY2FzZSBORVRST01fVDI6CisJCXZhbCA9IG5yLT50MiAvIEhaOworCQlicmVhazsKKworCWNhc2UgTkVUUk9NX04yOgorCQl2YWwgPSBuci0+bjI7CisJCWJyZWFrOworCisJY2FzZSBORVRST01fVDQ6CisJCXZhbCA9IG5yLT50NCAvIEhaOworCQlicmVhazsKKworCWNhc2UgTkVUUk9NX0lETEU6CisJCXZhbCA9IG5yLT5pZGxlIC8gKDYwICogSFopOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisJfQorCisJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sIHNpemVvZihpbnQpKTsKKworCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGNvcHlfdG9fdXNlcihvcHR2YWwsICZ2YWwsIGxlbikgPyAtRUZBVUxUIDogMDsKK30KKworc3RhdGljIGludCBucl9saXN0ZW4oc3RydWN0IHNvY2tldCAqc29jaywgaW50IGJhY2tsb2cpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisKKwlsb2NrX3NvY2soc2spOworCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0xJU1RFTikgeworCQltZW1zZXQoJm5yX3NrKHNrKS0+dXNlcl9hZGRyLCAwLCBBWDI1X0FERFJfTEVOKTsKKwkJc2stPnNrX21heF9hY2tfYmFja2xvZyA9IGJhY2tsb2c7CisJCXNrLT5za19zdGF0ZSAgICAgICAgICAgPSBUQ1BfTElTVEVOOworCQlyZWxlYXNlX3NvY2soc2spOworCQlyZXR1cm4gMDsKKwl9CisJcmVsZWFzZV9zb2NrKHNrKTsKKworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIHN0cnVjdCBwcm90byBucl9wcm90byA9IHsKKwkubmFtZQkgID0gIk5FVFJPTSIsCisJLm93bmVyCSAgPSBUSElTX01PRFVMRSwKKwkub2JqX3NpemUgPSBzaXplb2Yoc3RydWN0IG5yX3NvY2spLAorfTsKKworc3RhdGljIGludCBucl9jcmVhdGUoc3RydWN0IHNvY2tldCAqc29jaywgaW50IHByb3RvY29sKQoreworCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3QgbnJfc29jayAqbnI7CisKKwlpZiAoc29jay0+dHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCB8fCBwcm90b2NvbCAhPSAwKQorCQlyZXR1cm4gLUVTT0NLVE5PU1VQUE9SVDsKKworCWlmICgoc2sgPSBza19hbGxvYyhQRl9ORVRST00sIEdGUF9BVE9NSUMsICZucl9wcm90bywgMSkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJbnIgPSBucl9zayhzayk7CisKKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisKKwlzb2NrLT5vcHMgICAgPSAmbnJfcHJvdG9fb3BzOworCXNrLT5za19wcm90b2NvbCA9IHByb3RvY29sOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbnItPmFja19xdWV1ZSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbnItPnJlc2VxX3F1ZXVlKTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZuci0+ZnJhZ19xdWV1ZSk7CisKKwlucl9pbml0X3RpbWVycyhzayk7CisKKwluci0+dDEgICAgID0gc3lzY3RsX25ldHJvbV90cmFuc3BvcnRfdGltZW91dDsKKwluci0+dDIgICAgID0gc3lzY3RsX25ldHJvbV90cmFuc3BvcnRfYWNrbm93bGVkZ2VfZGVsYXk7CisJbnItPm4yICAgICA9IHN5c2N0bF9uZXRyb21fdHJhbnNwb3J0X21heGltdW1fdHJpZXM7CisJbnItPnQ0ICAgICA9IHN5c2N0bF9uZXRyb21fdHJhbnNwb3J0X2J1c3lfZGVsYXk7CisJbnItPmlkbGUgICA9IHN5c2N0bF9uZXRyb21fdHJhbnNwb3J0X25vX2FjdGl2aXR5X3RpbWVvdXQ7CisJbnItPndpbmRvdyA9IHN5c2N0bF9uZXRyb21fdHJhbnNwb3J0X3JlcXVlc3RlZF93aW5kb3dfc2l6ZTsKKworCW5yLT5icHFleHQgPSAxOworCW5yLT5zdGF0ZSAgPSBOUl9TVEFURV8wOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqbnJfbWFrZV9uZXcoc3RydWN0IHNvY2sgKm9zaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IG5yX3NvY2sgKm5yLCAqb25yOworCisJaWYgKG9zay0+c2tfdHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoKHNrID0gc2tfYWxsb2MoUEZfTkVUUk9NLCBHRlBfQVRPTUlDLCBvc2stPnNrX3Byb3QsIDEpKSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCW5yID0gbnJfc2soc2spOworCisJc29ja19pbml0X2RhdGEoTlVMTCwgc2spOworCisJc2stPnNrX3R5cGUgICAgID0gb3NrLT5za190eXBlOworCXNrLT5za19zb2NrZXQgICA9IG9zay0+c2tfc29ja2V0OworCXNrLT5za19wcmlvcml0eSA9IG9zay0+c2tfcHJpb3JpdHk7CisJc2stPnNrX3Byb3RvY29sID0gb3NrLT5za19wcm90b2NvbDsKKwlzay0+c2tfcmN2YnVmICAgPSBvc2stPnNrX3JjdmJ1ZjsKKwlzay0+c2tfc25kYnVmICAgPSBvc2stPnNrX3NuZGJ1ZjsKKwlzay0+c2tfc3RhdGUgICAgPSBUQ1BfRVNUQUJMSVNIRUQ7CisJc2stPnNrX3NsZWVwICAgID0gb3NrLT5za19zbGVlcDsKKworCWlmIChzb2NrX2ZsYWcob3NrLCBTT0NLX1pBUFBFRCkpCisJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKworCWlmIChzb2NrX2ZsYWcob3NrLCBTT0NLX0RCRykpCisJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfREJHKTsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJm5yLT5hY2tfcXVldWUpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJm5yLT5yZXNlcV9xdWV1ZSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbnItPmZyYWdfcXVldWUpOworCisJbnJfaW5pdF90aW1lcnMoc2spOworCisJb25yID0gbnJfc2sob3NrKTsKKworCW5yLT50MSAgICAgID0gb25yLT50MTsKKwluci0+dDIgICAgICA9IG9uci0+dDI7CisJbnItPm4yICAgICAgPSBvbnItPm4yOworCW5yLT50NCAgICAgID0gb25yLT50NDsKKwluci0+aWRsZSAgICA9IG9uci0+aWRsZTsKKwluci0+d2luZG93ICA9IG9uci0+d2luZG93OworCisJbnItPmRldmljZSAgPSBvbnItPmRldmljZTsKKwluci0+YnBxZXh0ICA9IG9uci0+YnBxZXh0OworCisJcmV0dXJuIHNrOworfQorCitzdGF0aWMgaW50IG5yX3JlbGVhc2Uoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgbnJfc29jayAqbnI7CisKKwlpZiAoc2sgPT0gTlVMTCkgcmV0dXJuIDA7CisKKwlzb2NrX2hvbGQoc2spOworCWxvY2tfc29jayhzayk7CisJbnIgPSBucl9zayhzayk7CisKKwlzd2l0Y2ggKG5yLT5zdGF0ZSkgeworCWNhc2UgTlJfU1RBVEVfMDoKKwljYXNlIE5SX1NUQVRFXzE6CisJY2FzZSBOUl9TVEFURV8yOgorCQlucl9kaXNjb25uZWN0KHNrLCAwKTsKKwkJbnJfZGVzdHJveV9zb2NrZXQoc2spOworCQlicmVhazsKKworCWNhc2UgTlJfU1RBVEVfMzoKKwkJbnJfY2xlYXJfcXVldWVzKHNrKTsKKwkJbnItPm4yY291bnQgPSAwOworCQlucl93cml0ZV9pbnRlcm5hbChzaywgTlJfRElTQ1JFUSk7CisJCW5yX3N0YXJ0X3QxdGltZXIoc2spOworCQlucl9zdG9wX3QydGltZXIoc2spOworCQlucl9zdG9wX3Q0dGltZXIoc2spOworCQlucl9zdG9wX2lkbGV0aW1lcihzayk7CisJCW5yLT5zdGF0ZSAgICA9IE5SX1NUQVRFXzI7CisJCXNrLT5za19zdGF0ZSAgICA9IFRDUF9DTE9TRTsKKwkJc2stPnNrX3NodXRkb3duIHw9IFNFTkRfU0hVVERPV047CisJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCQlzb2NrX29ycGhhbihzayk7CisJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfREVTVFJPWSk7CisJCXNrLT5za19zb2NrZXQgICA9IE5VTEw7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc2stPnNrX3NvY2tldCA9IE5VTEw7CisJCWJyZWFrOworCX0KKworCXNvY2stPnNrICAgPSBOVUxMOwkKKwlyZWxlYXNlX3NvY2soc2spOworCXNvY2tfcHV0KHNrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5yX2JpbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwgaW50IGFkZHJfbGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBucl9zb2NrICpuciA9IG5yX3NrKHNrKTsKKwlzdHJ1Y3QgZnVsbF9zb2NrYWRkcl9heDI1ICphZGRyID0gKHN0cnVjdCBmdWxsX3NvY2thZGRyX2F4MjUgKil1YWRkcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWF4MjVfYWRkcmVzcyAqdXNlciwgKnNvdXJjZTsKKworCWxvY2tfc29jayhzayk7CisJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKSkgeworCQlyZWxlYXNlX3NvY2soc2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGFkZHJfbGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9heDI1KSB8fCBhZGRyX2xlbiA+IHNpemVvZihzdHJ1Y3QgZnVsbF9zb2NrYWRkcl9heDI1KSkgeworCQlyZWxlYXNlX3NvY2soc2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGFkZHJfbGVuIDwgKGFkZHItPmZzYV9heDI1LnNheDI1X25kaWdpcyAqIHNpemVvZihheDI1X2FkZHJlc3MpICsgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9heDI1KSkpIHsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChhZGRyLT5mc2FfYXgyNS5zYXgyNV9mYW1pbHkgIT0gQUZfTkVUUk9NKSB7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoKGRldiA9IG5yX2Rldl9nZXQoJmFkZHItPmZzYV9heDI1LnNheDI1X2NhbGwpKSA9PSBOVUxMKSB7CisJCVNPQ0tfREVCVUcoc2ssICJORVQvUk9NOiBiaW5kIGZhaWxlZDogaW52YWxpZCBub2RlIGNhbGxzaWduXG4iKTsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCX0KKworCS8qCisJICogT25seSB0aGUgc3VwZXIgdXNlciBjYW4gc2V0IGFuIGFyYml0cmFyeSB1c2VyIGNhbGxzaWduLgorCSAqLworCWlmIChhZGRyLT5mc2FfYXgyNS5zYXgyNV9uZGlnaXMgPT0gMSkgeworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9CSU5EX1NFUlZJQ0UpKSB7CisJCQlkZXZfcHV0KGRldik7CisJCQlyZWxlYXNlX3NvY2soc2spOworCQkJcmV0dXJuIC1FQUNDRVM7CisJCX0KKwkJbnItPnVzZXJfYWRkciAgID0gYWRkci0+ZnNhX2RpZ2lwZWF0ZXJbMF07CisJCW5yLT5zb3VyY2VfYWRkciA9IGFkZHItPmZzYV9heDI1LnNheDI1X2NhbGw7CisJfSBlbHNlIHsKKwkJc291cmNlID0gJmFkZHItPmZzYV9heDI1LnNheDI1X2NhbGw7CisKKwkJaWYgKCh1c2VyID0gYXgyNV9maW5kYnl1aWQoY3VycmVudC0+ZXVpZCkpID09IE5VTEwpIHsKKwkJCWlmIChheDI1X3VpZF9wb2xpY3kgJiYgIWNhcGFibGUoQ0FQX05FVF9CSU5EX1NFUlZJQ0UpKSB7CisJCQkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJCQlkZXZfcHV0KGRldik7CisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCX0KKwkJCXVzZXIgPSBzb3VyY2U7CisJCX0KKworCQluci0+dXNlcl9hZGRyICAgPSAqdXNlcjsKKwkJbnItPnNvdXJjZV9hZGRyID0gKnNvdXJjZTsKKwl9CisKKwluci0+ZGV2aWNlID0gZGV2OworCW5yX2luc2VydF9zb2NrZXQoc2spOworCisJc29ja19yZXNldF9mbGFnKHNrLCBTT0NLX1pBUFBFRCk7CisJZGV2X3B1dChkZXYpOworCXJlbGVhc2Vfc29jayhzayk7CisJU09DS19ERUJVRyhzaywgIk5FVC9ST006IHNvY2tldCBpcyBib3VuZFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnJfY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLAorCWludCBhZGRyX2xlbiwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBucl9zb2NrICpuciA9IG5yX3NrKHNrKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfYXgyNSAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfYXgyNSAqKXVhZGRyOworCWF4MjVfYWRkcmVzcyAqdXNlciwgKnNvdXJjZSA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCWxvY2tfc29jayhzayk7CisJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfRVNUQUJMSVNIRUQgJiYgc29jay0+c3RhdGUgPT0gU1NfQ09OTkVDVElORykgeworCQlzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJcmV0dXJuIDA7CS8qIENvbm5lY3QgY29tcGxldGVkIGR1cmluZyBhIEVSRVNUQVJUU1lTIGV2ZW50ICovCisJfQorCisJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfQ0xPU0UgJiYgc29jay0+c3RhdGUgPT0gU1NfQ09OTkVDVElORykgeworCQlzb2NrLT5zdGF0ZSA9IFNTX1VOQ09OTkVDVEVEOworCQlyZWxlYXNlX3NvY2soc2spOworCQlyZXR1cm4gLUVDT05OUkVGVVNFRDsKKwl9CisKKwlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9FU1RBQkxJU0hFRCkgeworCQlyZWxlYXNlX3NvY2soc2spOworCQlyZXR1cm4gLUVJU0NPTk47CS8qIE5vIHJlY29ubmVjdCBvbiBhIHNlcXBhY2tldCBzb2NrZXQgKi8KKwl9CisKKwlzay0+c2tfc3RhdGUgICA9IFRDUF9DTE9TRTsJCisJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKKworCWlmIChhZGRyX2xlbiAhPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2F4MjUpICYmIGFkZHJfbGVuICE9IHNpemVvZihzdHJ1Y3QgZnVsbF9zb2NrYWRkcl9heDI1KSkgeworCQlyZWxlYXNlX3NvY2soc2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGFkZHItPnNheDI1X2ZhbWlseSAhPSBBRl9ORVRST00pIHsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKSkgewkvKiBNdXN0IGJpbmQgZmlyc3QgLSBhdXRvYmluZGluZyBpbiB0aGlzIG1heSBvciBtYXkgbm90IHdvcmsgKi8KKwkJc29ja19yZXNldF9mbGFnKHNrLCBTT0NLX1pBUFBFRCk7CisKKwkJaWYgKChkZXYgPSBucl9kZXZfZmlyc3QoKSkgPT0gTlVMTCkgeworCQkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJCXJldHVybiAtRU5FVFVOUkVBQ0g7CisJCX0KKwkJc291cmNlID0gKGF4MjVfYWRkcmVzcyAqKWRldi0+ZGV2X2FkZHI7CisKKwkJaWYgKCh1c2VyID0gYXgyNV9maW5kYnl1aWQoY3VycmVudC0+ZXVpZCkpID09IE5VTEwpIHsKKwkJCWlmIChheDI1X3VpZF9wb2xpY3kgJiYgIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCQlkZXZfcHV0KGRldik7CisJCQkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJfQorCQkJdXNlciA9IHNvdXJjZTsKKwkJfQorCisJCW5yLT51c2VyX2FkZHIgICA9ICp1c2VyOworCQluci0+c291cmNlX2FkZHIgPSAqc291cmNlOworCQluci0+ZGV2aWNlICAgICAgPSBkZXY7CisKKwkJZGV2X3B1dChkZXYpOworCQlucl9pbnNlcnRfc29ja2V0KHNrKTsJCS8qIEZpbmlzaCB0aGUgYmluZCAqLworCX0KKworCW5yLT5kZXN0X2FkZHIgPSBhZGRyLT5zYXgyNV9jYWxsOworCisJcmVsZWFzZV9zb2NrKHNrKTsKKwljaXJjdWl0ID0gbnJfZmluZF9uZXh0X2NpcmN1aXQoKTsKKwlsb2NrX3NvY2soc2spOworCisJbnItPm15X2luZGV4ID0gY2lyY3VpdCAvIDI1NjsKKwluci0+bXlfaWQgICAgPSBjaXJjdWl0ICUgMjU2OworCisJY2lyY3VpdCsrOworCisJLyogTW92ZSB0byBjb25uZWN0aW5nIHNvY2tldCwgc3RhcnQgc2VuZGluZyBDb25uZWN0IFJlcXVlc3RzICovCisJc29jay0+c3RhdGUgID0gU1NfQ09OTkVDVElORzsKKwlzay0+c2tfc3RhdGUgPSBUQ1BfU1lOX1NFTlQ7CisKKwlucl9lc3RhYmxpc2hfZGF0YV9saW5rKHNrKTsKKworCW5yLT5zdGF0ZSA9IE5SX1NUQVRFXzE7CisKKwlucl9zdGFydF9oZWFydGJlYXQoc2spOworCisJLyogTm93IHRoZSBsb29wICovCisJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfRVNUQUJMSVNIRUQgJiYgKGZsYWdzICYgT19OT05CTE9DSykpIHsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJcmV0dXJuIC1FSU5QUk9HUkVTUzsKKwl9CisJCQorCS8qCisJICogQSBDb25uZWN0IEFjayB3aXRoIENob2tlIG9yIHRpbWVvdXQgb3IgZmFpbGVkIHJvdXRpbmcgd2lsbCBnbyB0bworCSAqIGNsb3NlZC4KKwkgKi8KKwlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9TWU5fU0VOVCkgeworCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIHRzayk7CisKKwkJYWRkX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJCWZvciAoOzspIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9TWU5fU0VOVCkKKwkJCQlicmVhazsKKwkJCXJlbGVhc2Vfc29jayhzayk7CisJCQlpZiAoIXNpZ25hbF9wZW5kaW5nKHRzaykpIHsKKwkJCQlzY2hlZHVsZSgpOworCQkJCWxvY2tfc29jayhzayk7CisJCQkJY29udGludWU7CisJCQl9CisJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJCXJlbW92ZV93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOworCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJfQorCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJfQorCisJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfRVNUQUJMSVNIRUQpIHsKKwkJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJcmV0dXJuIHNvY2tfZXJyb3Ioc2spOwkvKiBBbHdheXMgc2V0IGF0IHRoaXMgcG9pbnQgKi8KKwl9CisKKwlzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKwlyZWxlYXNlX3NvY2soc2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnJfYWNjZXB0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrZXQgKm5ld3NvY2ssIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgdHNrKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBzb2NrICpuZXdzazsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJaW50IGVyciA9IDA7CisKKwlpZiAoKHNrID0gc29jay0+c2spID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJbG9ja19zb2NrKHNrKTsKKwlpZiAoc2stPnNrX3R5cGUgIT0gU09DS19TRVFQQUNLRVQpIHsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0xJU1RFTikgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqCVRoZSB3cml0ZSBxdWV1ZSB0aGlzIHRpbWUgaXMgaG9sZGluZyBzb2NrZXRzIHJlYWR5IHRvIHVzZQorCSAqCWhvb2tlZCBpbnRvIHRoZSBTQUJNIHdlIHNhdmVkCisJICovCisJYWRkX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJZm9yICg7OykgeworCQlza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCQlpZiAoc2tiKQorCQkJYnJlYWs7CisKKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCWlmIChmbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQkJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJCQlyZXR1cm4gLUVXT1VMREJMT0NLOworCQl9CisJCWlmICghc2lnbmFsX3BlbmRpbmcodHNrKSkgeworCQkJc2NoZWR1bGUoKTsKKwkJCWxvY2tfc29jayhzayk7CisJCQljb250aW51ZTsKKwkJfQorCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCXJlbW92ZV93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOworCisJbmV3c2sgPSBza2ItPnNrOworCW5ld3NrLT5za19zb2NrZXQgPSBuZXdzb2NrOworCW5ld3NrLT5za19zbGVlcCA9ICZuZXdzb2NrLT53YWl0OworCisJLyogTm93IGF0dGFjaCB1cCB0aGUgbmV3IHNvY2tldCAqLworCWtmcmVlX3NrYihza2IpOworCXNrLT5za19hY2tfYmFja2xvZy0tOworCW5ld3NvY2stPnNrID0gbmV3c2s7CisKK291dDoKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbnJfZ2V0bmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLAorCWludCAqdWFkZHJfbGVuLCBpbnQgcGVlcikKK3sKKwlzdHJ1Y3QgZnVsbF9zb2NrYWRkcl9heDI1ICpzYXggPSAoc3RydWN0IGZ1bGxfc29ja2FkZHJfYXgyNSAqKXVhZGRyOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBucl9zb2NrICpuciA9IG5yX3NrKHNrKTsKKworCWxvY2tfc29jayhzayk7CisJaWYgKHBlZXIgIT0gMCkgeworCQlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkgeworCQkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJCXJldHVybiAtRU5PVENPTk47CisJCX0KKwkJc2F4LT5mc2FfYXgyNS5zYXgyNV9mYW1pbHkgPSBBRl9ORVRST007CisJCXNheC0+ZnNhX2F4MjUuc2F4MjVfbmRpZ2lzID0gMTsKKwkJc2F4LT5mc2FfYXgyNS5zYXgyNV9jYWxsICAgPSBuci0+dXNlcl9hZGRyOworCQlzYXgtPmZzYV9kaWdpcGVhdGVyWzBdICAgICA9IG5yLT5kZXN0X2FkZHI7CisJCSp1YWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IGZ1bGxfc29ja2FkZHJfYXgyNSk7CisJfSBlbHNlIHsKKwkJc2F4LT5mc2FfYXgyNS5zYXgyNV9mYW1pbHkgPSBBRl9ORVRST007CisJCXNheC0+ZnNhX2F4MjUuc2F4MjVfbmRpZ2lzID0gMDsKKwkJc2F4LT5mc2FfYXgyNS5zYXgyNV9jYWxsICAgPSBuci0+c291cmNlX2FkZHI7CisJCSp1YWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2F4MjUpOworCX0KKwlyZWxlYXNlX3NvY2soc2spOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBucl9yeF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3Qgc29jayAqbWFrZTsJCisJc3RydWN0IG5yX3NvY2sgKm5yX21ha2U7CisJYXgyNV9hZGRyZXNzICpzcmMsICpkZXN0LCAqdXNlcjsKKwl1bnNpZ25lZCBzaG9ydCBjaXJjdWl0X2luZGV4LCBjaXJjdWl0X2lkOworCXVuc2lnbmVkIHNob3J0IHBlZXJfY2lyY3VpdF9pbmRleCwgcGVlcl9jaXJjdWl0X2lkOworCXVuc2lnbmVkIHNob3J0IGZyYW1ldHlwZSwgZmxhZ3MsIHdpbmRvdywgdGltZW91dDsKKwlpbnQgcmV0OworCisJc2tiLT5zayA9IE5VTEw7CQkvKiBJbml0aWFsbHkgd2UgZG9uJ3Qga25vdyB3aG8gaXQncyBmb3IgKi8KKworCS8qCisJICoJc2tiLT5kYXRhIHBvaW50cyB0byB0aGUgbmV0cm9tIGZyYW1lIHN0YXJ0CisJICovCisKKwlzcmMgID0gKGF4MjVfYWRkcmVzcyAqKShza2ItPmRhdGEgKyAwKTsKKwlkZXN0ID0gKGF4MjVfYWRkcmVzcyAqKShza2ItPmRhdGEgKyA3KTsKKworCWNpcmN1aXRfaW5kZXggICAgICA9IHNrYi0+ZGF0YVsxNV07CisJY2lyY3VpdF9pZCAgICAgICAgID0gc2tiLT5kYXRhWzE2XTsKKwlwZWVyX2NpcmN1aXRfaW5kZXggPSBza2ItPmRhdGFbMTddOworCXBlZXJfY2lyY3VpdF9pZCAgICA9IHNrYi0+ZGF0YVsxOF07CisJZnJhbWV0eXBlICAgICAgICAgID0gc2tiLT5kYXRhWzE5XSAmIDB4MEY7CisJZmxhZ3MgICAgICAgICAgICAgID0gc2tiLT5kYXRhWzE5XSAmIDB4RjA7CisKKyNpZmRlZiBDT05GSUdfSU5FVAorCS8qCisJICogQ2hlY2sgZm9yIGFuIGluY29taW5nIElQIG92ZXIgTkVUL1JPTSBmcmFtZS4KKwkgKi8KKwlpZiAoZnJhbWV0eXBlID09IE5SX1BST1RPRVhUICYmIGNpcmN1aXRfaW5kZXggPT0gTlJfUFJPVE9fSVAgJiYgY2lyY3VpdF9pZCA9PSBOUl9QUk9UT19JUCkgeworCQlza2JfcHVsbChza2IsIE5SX05FVFdPUktfTEVOICsgTlJfVFJBTlNQT1JUX0xFTik7CisJCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisKKwkJcmV0dXJuIG5yX3J4X2lwKHNrYiwgZGV2KTsKKwl9CisjZW5kaWYKKworCS8qCisJICogRmluZCBhbiBleGlzdGluZyBzb2NrZXQgY29ubmVjdGlvbiwgYmFzZWQgb24gY2lyY3VpdCBJRCwgaWYgaXQncworCSAqIGEgQ29ubmVjdCBSZXF1ZXN0IGJhc2UgaXQgb24gdGhlaXIgY2lyY3VpdCBJRC4KKwkgKgorCSAqIENpcmN1aXQgSUQgMC8wIGlzIG5vdCB2YWxpZCBidXQgaXQgY291bGQgc3RpbGwgYmUgYSAicmVzZXQiIGZvciBhCisJICogY2lyY3VpdCB0aGF0IG5vIGxvbmdlciBleGlzdHMgYXQgdGhlIG90aGVyIGVuZCAuLi4KKwkgKi8KKworCXNrID0gTlVMTDsKKworCWlmIChjaXJjdWl0X2luZGV4ID09IDAgJiYgY2lyY3VpdF9pZCA9PSAwKSB7CisJCWlmIChmcmFtZXR5cGUgPT0gTlJfQ09OTkFDSyAmJiBmbGFncyA9PSBOUl9DSE9LRV9GTEFHKQorCQkJc2sgPSBucl9maW5kX3BlZXIocGVlcl9jaXJjdWl0X2luZGV4LCBwZWVyX2NpcmN1aXRfaWQsIHNyYyk7CisJfSBlbHNlIHsKKwkJaWYgKGZyYW1ldHlwZSA9PSBOUl9DT05OUkVRKQorCQkJc2sgPSBucl9maW5kX3BlZXIoY2lyY3VpdF9pbmRleCwgY2lyY3VpdF9pZCwgc3JjKTsKKwkJZWxzZQorCQkJc2sgPSBucl9maW5kX3NvY2tldChjaXJjdWl0X2luZGV4LCBjaXJjdWl0X2lkKTsKKwl9CisKKwlpZiAoc2sgIT0gTlVMTCkgeworCQlza2ItPmgucmF3ID0gc2tiLT5kYXRhOworCisJCWlmIChmcmFtZXR5cGUgPT0gTlJfQ09OTkFDSyAmJiBza2ItPmxlbiA9PSAyMikKKwkJCW5yX3NrKHNrKS0+YnBxZXh0ID0gMTsKKwkJZWxzZQorCQkJbnJfc2soc2spLT5icHFleHQgPSAwOworCisJCXJldCA9IG5yX3Byb2Nlc3NfcnhfZnJhbWUoc2ssIHNrYik7CisJCWJoX3VubG9ja19zb2NrKHNrKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKgorCSAqIE5vdyBpdCBzaG91bGQgYmUgYSBDT05OUkVRLgorCSAqLworCWlmIChmcmFtZXR5cGUgIT0gTlJfQ09OTlJFUSkgeworCQkvKgorCQkgKiBIZXJlIGl0IHdvdWxkIGJlIG5pY2UgdG8gYmUgYWJsZSB0byBzZW5kIGEgcmVzZXQgYnV0CisJCSAqIE5FVC9ST00gZG9lc24ndCBoYXZlIG9uZS4gVGhlIGZvbGxvd2luZyBoYWNrIHdvdWxkCisJCSAqIGhhdmUgYmVlbiBhIHdheSB0byBleHRlbmQgdGhlIHByb3RvY29sIGJ1dCBhcHBhcmVudGx5CisJCSAqIGl0IGtpbGxzIEJQUSBib3hlcy4uLiA6LSgKKwkJICovCisjaWYgMAorCQkvKgorCQkgKiBOZXZlciByZXBseSB0byBhIENPTk5BQ0svQ0hPS0UuCisJCSAqLworCQlpZiAoZnJhbWV0eXBlICE9IE5SX0NPTk5BQ0sgfHwgZmxhZ3MgIT0gTlJfQ0hPS0VfRkxBRykKKwkJCW5yX3RyYW5zbWl0X3JlZnVzYWwoc2tiLCAxKTsKKyNlbmRpZgorCQlyZXR1cm4gMDsKKwl9CisKKwlzayA9IG5yX2ZpbmRfbGlzdGVuZXIoZGVzdCk7CisKKwl1c2VyID0gKGF4MjVfYWRkcmVzcyAqKShza2ItPmRhdGEgKyAyMSk7CisKKwlpZiAoc2sgPT0gTlVMTCB8fCBza19hY2NlcHRxX2lzX2Z1bGwoc2spIHx8CisJICAgIChtYWtlID0gbnJfbWFrZV9uZXcoc2spKSA9PSBOVUxMKSB7CisJCW5yX3RyYW5zbWl0X3JlZnVzYWwoc2tiLCAwKTsKKwkJaWYgKHNrKQorCQkJYmhfdW5sb2NrX3NvY2soc2spOworCQlyZXR1cm4gMDsKKwl9CisKKwl3aW5kb3cgPSBza2ItPmRhdGFbMjBdOworCisJc2tiLT5zayAgICAgICAgICAgICA9IG1ha2U7CisJbWFrZS0+c2tfc3RhdGUJICAgID0gVENQX0VTVEFCTElTSEVEOworCisJLyogRmlsbCBpbiBoaXMgY2lyY3VpdCBkZXRhaWxzICovCisJbnJfbWFrZSA9IG5yX3NrKG1ha2UpOworCW5yX21ha2UtPnNvdXJjZV9hZGRyID0gKmRlc3Q7CisJbnJfbWFrZS0+ZGVzdF9hZGRyICAgPSAqc3JjOworCW5yX21ha2UtPnVzZXJfYWRkciAgID0gKnVzZXI7CisKKwlucl9tYWtlLT55b3VyX2luZGV4ICA9IGNpcmN1aXRfaW5kZXg7CisJbnJfbWFrZS0+eW91cl9pZCAgICAgPSBjaXJjdWl0X2lkOworCisJYmhfdW5sb2NrX3NvY2soc2spOworCWNpcmN1aXQgPSBucl9maW5kX25leHRfY2lyY3VpdCgpOworCWJoX2xvY2tfc29jayhzayk7CisKKwlucl9tYWtlLT5teV9pbmRleCAgICA9IGNpcmN1aXQgLyAyNTY7CisJbnJfbWFrZS0+bXlfaWQgICAgICAgPSBjaXJjdWl0ICUgMjU2OworCisJY2lyY3VpdCsrOworCisJLyogV2luZG93IG5lZ290aWF0aW9uICovCisJaWYgKHdpbmRvdyA8IG5yX21ha2UtPndpbmRvdykKKwkJbnJfbWFrZS0+d2luZG93ID0gd2luZG93OworCisJLyogTDQgdGltZW91dCBuZWdvdGlhdGlvbiAqLworCWlmIChza2ItPmxlbiA9PSAzNykgeworCQl0aW1lb3V0ID0gc2tiLT5kYXRhWzM2XSAqIDI1NiArIHNrYi0+ZGF0YVszNV07CisJCWlmICh0aW1lb3V0ICogSFogPCBucl9tYWtlLT50MSkKKwkJCW5yX21ha2UtPnQxID0gdGltZW91dCAqIEhaOworCQlucl9tYWtlLT5icHFleHQgPSAxOworCX0gZWxzZSB7CisJCW5yX21ha2UtPmJwcWV4dCA9IDA7CisJfQorCisJbnJfd3JpdGVfaW50ZXJuYWwobWFrZSwgTlJfQ09OTkFDSyk7CisKKwlucl9tYWtlLT5jb25kaXRpb24gPSAweDAwOworCW5yX21ha2UtPnZzICAgICAgICA9IDA7CisJbnJfbWFrZS0+dmEgICAgICAgID0gMDsKKwlucl9tYWtlLT52ciAgICAgICAgPSAwOworCW5yX21ha2UtPnZsICAgICAgICA9IDA7CisJbnJfbWFrZS0+c3RhdGUgICAgID0gTlJfU1RBVEVfMzsKKwlzay0+c2tfYWNrX2JhY2tsb2crKzsKKworCW5yX2luc2VydF9zb2NrZXQobWFrZSk7CisKKwlza2JfcXVldWVfaGVhZCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisKKwlucl9zdGFydF9oZWFydGJlYXQobWFrZSk7CisJbnJfc3RhcnRfaWRsZXRpbWVyKG1ha2UpOworCisJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCisJCXNrLT5za19kYXRhX3JlYWR5KHNrLCBza2ItPmxlbik7CisKKwliaF91bmxvY2tfc29jayhzayk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbnJfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCSAgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgbnJfc29jayAqbnIgPSBucl9zayhzayk7CisJc3RydWN0IHNvY2thZGRyX2F4MjUgKnVzYXggPSAoc3RydWN0IHNvY2thZGRyX2F4MjUgKiltc2ctPm1zZ19uYW1lOworCWludCBlcnI7CisJc3RydWN0IHNvY2thZGRyX2F4MjUgc2F4OworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgY2hhciAqYXNtcHRyOworCWludCBzaXplOworCisJaWYgKG1zZy0+bXNnX2ZsYWdzICYgfihNU0dfRE9OVFdBSVR8TVNHX0VPUnxNU0dfQ01TR19DT01QQVQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxvY2tfc29jayhzayk7CisJaWYgKHNvY2tfZmxhZyhzaywgU09DS19aQVBQRUQpKSB7CisJCWVyciA9IC1FQUREUk5PVEFWQUlMOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoc2stPnNrX3NodXRkb3duICYgU0VORF9TSFVURE9XTikgeworCQlzZW5kX3NpZyhTSUdQSVBFLCBjdXJyZW50LCAwKTsKKwkJZXJyID0gLUVQSVBFOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobnItPmRldmljZSA9PSBOVUxMKSB7CisJCWVyciA9IC1FTkVUVU5SRUFDSDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHVzYXgpIHsKKwkJaWYgKG1zZy0+bXNnX25hbWVsZW4gPCBzaXplb2Yoc2F4KSkgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCXNheCA9ICp1c2F4OworCQlpZiAoYXgyNWNtcCgmbnItPmRlc3RfYWRkciwgJnNheC5zYXgyNV9jYWxsKSAhPSAwKSB7CisJCQllcnIgPSAtRUlTQ09OTjsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChzYXguc2F4MjVfZmFtaWx5ICE9IEFGX05FVFJPTSkgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfRVNUQUJMSVNIRUQpIHsKKwkJCWVyciA9IC1FTk9UQ09OTjsKKwkJCWdvdG8gb3V0OworCQl9CisJCXNheC5zYXgyNV9mYW1pbHkgPSBBRl9ORVRST007CisJCXNheC5zYXgyNV9jYWxsICAgPSBuci0+ZGVzdF9hZGRyOworCX0KKworCVNPQ0tfREVCVUcoc2ssICJORVQvUk9NOiBzZW5kdG86IEFkZHJlc3NlcyBidWlsdC5cbiIpOworCisJLyogQnVpbGQgYSBwYWNrZXQgKi8KKwlTT0NLX0RFQlVHKHNrLCAiTkVUL1JPTTogc2VuZHRvOiBidWlsZGluZyBwYWNrZXQuXG4iKTsKKwlzaXplID0gbGVuICsgTlJfTkVUV09SS19MRU4gKyBOUl9UUkFOU1BPUlRfTEVOOworCisJaWYgKChza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCBzaXplLCBtc2ctPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVCwgJmVycikpID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJc2tiX3Jlc2VydmUoc2tiLCBzaXplIC0gbGVuKTsKKworCS8qCisJICoJUHVzaCBkb3duIHRoZSBORVQvUk9NIGhlYWRlcgorCSAqLworCisJYXNtcHRyID0gc2tiX3B1c2goc2tiLCBOUl9UUkFOU1BPUlRfTEVOKTsKKwlTT0NLX0RFQlVHKHNrLCAiQnVpbGRpbmcgTkVUL1JPTSBIZWFkZXIuXG4iKTsKKworCS8qIEJ1aWxkIGEgTkVUL1JPTSBUcmFuc3BvcnQgaGVhZGVyICovCisKKwkqYXNtcHRyKysgPSBuci0+eW91cl9pbmRleDsKKwkqYXNtcHRyKysgPSBuci0+eW91cl9pZDsKKwkqYXNtcHRyKysgPSAwOwkJLyogVG8gYmUgZmlsbGVkIGluIGxhdGVyICovCisJKmFzbXB0cisrID0gMDsJCS8qICAgICAgRGl0dG8gICAgICAgICAgICAqLworCSphc21wdHIrKyA9IE5SX0lORk87CisJU09DS19ERUJVRyhzaywgIkJ1aWx0IGhlYWRlci5cbiIpOworCisJLyoKKwkgKglQdXQgdGhlIGRhdGEgb24gdGhlIGVuZAorCSAqLworCisJc2tiLT5oLnJhdyA9IHNrYl9wdXQoc2tiLCBsZW4pOworCisJYXNtcHRyID0gc2tiLT5oLnJhdzsKKwlTT0NLX0RFQlVHKHNrLCAiTkVUL1JPTTogQXBwZW5kaW5nIHVzZXIgZGF0YVxuIik7CisKKwkvKiBVc2VyIGRhdGEgZm9sbG93cyBpbW1lZGlhdGVseSBhZnRlciB0aGUgTkVUL1JPTSB0cmFuc3BvcnQgaGVhZGVyICovCisJaWYgKG1lbWNweV9mcm9taW92ZWMoYXNtcHRyLCBtc2ctPm1zZ19pb3YsIGxlbikpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWVyciA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCVNPQ0tfREVCVUcoc2ssICJORVQvUk9NOiBUcmFuc21pdHRpbmcgYnVmZmVyXG4iKTsKKworCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKSB7CisJCWtmcmVlX3NrYihza2IpOworCQllcnIgPSAtRU5PVENPTk47CisJCWdvdG8gb3V0OworCX0KKworCW5yX291dHB1dChzaywgc2tiKTsJLyogU2hvdmUgaXQgb250byB0aGUgcXVldWUgKi8KKworCWVyciA9IGxlbjsKK291dDoKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbnJfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCSAgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgc29ja2FkZHJfYXgyNSAqc2F4ID0gKHN0cnVjdCBzb2NrYWRkcl9heDI1ICopbXNnLT5tc2dfbmFtZTsKKwlzaXplX3QgY29waWVkOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGVyOworCisJLyoKKwkgKiBUaGlzIHdvcmtzIGZvciBzZXFwYWNrZXQgdG9vLiBUaGUgcmVjZWl2ZXIgaGFzIG9yZGVyZWQgdGhlIHF1ZXVlIGZvcgorCSAqIHVzISBXZSBkbyBvbmUgcXVpY2sgY2hlY2sgZmlyc3QgdGhvdWdoCisJICovCisKKwlsb2NrX3NvY2soc2spOworCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKSB7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCXJldHVybiAtRU5PVENPTk47CisJfQorCisJLyogTm93IHdlIGNhbiB0cmVhdCBhbGwgYWxpa2UgKi8KKwlpZiAoKHNrYiA9IHNrYl9yZWN2X2RhdGFncmFtKHNrLCBmbGFncyAmIH5NU0dfRE9OVFdBSVQsIGZsYWdzICYgTVNHX0RPTlRXQUlULCAmZXIpKSA9PSBOVUxMKSB7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCXJldHVybiBlcjsKKwl9CisKKwlza2ItPmgucmF3ID0gc2tiLT5kYXRhOworCWNvcGllZCAgICAgPSBza2ItPmxlbjsKKworCWlmIChjb3BpZWQgPiBzaXplKSB7CisJCWNvcGllZCA9IHNpemU7CisJCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19UUlVOQzsKKwl9CisKKwlza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhza2IsIDAsIG1zZy0+bXNnX2lvdiwgY29waWVkKTsKKworCWlmIChzYXggIT0gTlVMTCkgeworCQlzYXgtPnNheDI1X2ZhbWlseSA9IEFGX05FVFJPTTsKKwkJbWVtY3B5KHNheC0+c2F4MjVfY2FsbC5heDI1X2NhbGwsIHNrYi0+ZGF0YSArIDcsIEFYMjVfQUREUl9MRU4pOworCX0KKworCW1zZy0+bXNnX25hbWVsZW4gPSBzaXplb2YoKnNheCk7CisKKwlza2JfZnJlZV9kYXRhZ3JhbShzaywgc2tiKTsKKworCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGNvcGllZDsKK30KKworCitzdGF0aWMgaW50IG5yX2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCByZXQ7CisKKwlsb2NrX3NvY2soc2spOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUSU9DT1VUUTogeworCQlsb25nIGFtb3VudDsKKwkJYW1vdW50ID0gc2stPnNrX3NuZGJ1ZiAtIGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYyk7CisJCWlmIChhbW91bnQgPCAwKQorCQkJYW1vdW50ID0gMDsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJcmV0dXJuIHB1dF91c2VyKGFtb3VudCwgKGludCBfX3VzZXIgKilhcmdwKTsKKwl9CisKKwljYXNlIFRJT0NJTlE6IHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJbG9uZyBhbW91bnQgPSAwTDsKKwkJLyogVGhlc2UgdHdvIGFyZSBzYWZlIG9uIGEgc2luZ2xlIENQVSBzeXN0ZW0gYXMgb25seSB1c2VyIHRhc2tzIGZpZGRsZSBoZXJlICovCisJCWlmICgoc2tiID0gc2tiX3BlZWsoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSkgIT0gTlVMTCkKKwkJCWFtb3VudCA9IHNrYi0+bGVuOworCQlyZWxlYXNlX3NvY2soc2spOworCQlyZXR1cm4gcHV0X3VzZXIoYW1vdW50LCAoaW50IF9fdXNlciAqKWFyZ3ApOworCX0KKworCWNhc2UgU0lPQ0dTVEFNUDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJaWYgKHNrICE9IE5VTEwpCisJCQlyZXQgPSBzb2NrX2dldF90aW1lc3RhbXAoc2ssIGFyZ3ApOworCQlyZWxlYXNlX3NvY2soc2spOworCQlyZXR1cm4gcmV0OworCisJY2FzZSBTSU9DR0lGQUREUjoKKwljYXNlIFNJT0NTSUZBRERSOgorCWNhc2UgU0lPQ0dJRkRTVEFERFI6CisJY2FzZSBTSU9DU0lGRFNUQUREUjoKKwljYXNlIFNJT0NHSUZCUkRBRERSOgorCWNhc2UgU0lPQ1NJRkJSREFERFI6CisJY2FzZSBTSU9DR0lGTkVUTUFTSzoKKwljYXNlIFNJT0NTSUZORVRNQVNLOgorCWNhc2UgU0lPQ0dJRk1FVFJJQzoKKwljYXNlIFNJT0NTSUZNRVRSSUM6CisJCXJlbGVhc2Vfc29jayhzayk7CisJCXJldHVybiAtRUlOVkFMOworCisJY2FzZSBTSU9DQUREUlQ6CisJY2FzZSBTSU9DREVMUlQ6CisJY2FzZSBTSU9DTlJERUNPQlM6CisJCXJlbGVhc2Vfc29jayhzayk7CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgcmV0dXJuIC1FUEVSTTsKKwkJcmV0dXJuIG5yX3J0X2lvY3RsKGNtZCwgYXJncCk7CisKKwlkZWZhdWx0OgorCQlyZWxlYXNlX3NvY2soc2spOworCQlyZXR1cm4gZGV2X2lvY3RsKGNtZCwgYXJncCk7CisJfQorCXJlbGVhc2Vfc29jayhzayk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKK3N0YXRpYyB2b2lkICpucl9pbmZvX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3Qgc29jayAqczsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlpbnQgaSA9IDE7CisKKwlzcGluX2xvY2tfYmgoJm5yX2xpc3RfbG9jayk7CisJaWYgKCpwb3MgPT0gMCkKKwkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKKworCXNrX2Zvcl9lYWNoKHMsIG5vZGUsICZucl9saXN0KSB7CisJCWlmIChpID09ICpwb3MpCisJCQlyZXR1cm4gczsKKwkJKytpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKm5yX2luZm9fbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJKysqcG9zOworCisJcmV0dXJuICh2ID09IFNFUV9TVEFSVF9UT0tFTikgPyBza19oZWFkKCZucl9saXN0KSAKKwkJOiBza19uZXh0KChzdHJ1Y3Qgc29jayAqKXYpOworfQorCQorc3RhdGljIHZvaWQgbnJfaW5mb19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXNwaW5fdW5sb2NrX2JoKCZucl9saXN0X2xvY2spOworfQorCitzdGF0aWMgaW50IG5yX2luZm9fc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3Qgc29jayAqcyA9IHY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbnJfc29jayAqbnI7CisJY29uc3QgY2hhciAqZGV2bmFtZTsKKworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKKwkJc2VxX3B1dHMoc2VxLAorInVzZXJfYWRkciBkZXN0X25vZGUgc3JjX25vZGUgIGRldiAgICBteSAgeW91ciAgc3QgIHZzICB2ciAgdmEgICAgdDEgICAgIHQyICAgICB0NCAgICAgIGlkbGUgICBuMiAgd25kIFNuZC1RIFJjdi1RIGlub2RlXG4iKTsKKworCWVsc2UgeworCisJCWJoX2xvY2tfc29jayhzKTsKKwkJbnIgPSBucl9zayhzKTsKKworCQlpZiAoKGRldiA9IG5yLT5kZXZpY2UpID09IE5VTEwpCisJCQlkZXZuYW1lID0gIj8/PyI7CisJCWVsc2UKKwkJCWRldm5hbWUgPSBkZXYtPm5hbWU7CisKKwkJc2VxX3ByaW50ZihzZXEsICIlLTlzICIsIGF4MmFzYygmbnItPnVzZXJfYWRkcikpOworCQlzZXFfcHJpbnRmKHNlcSwgIiUtOXMgIiwgYXgyYXNjKCZuci0+ZGVzdF9hZGRyKSk7CisJCXNlcV9wcmludGYoc2VxLCAKKyIlLTlzICUtM3MgICUwMlgvJTAyWCAlMDJYLyUwMlggJTJkICUzZCAlM2QgJTNkICUzbHUvJTAzbHUgJTJsdS8lMDJsdSAlM2x1LyUwM2x1ICUzbHUvJTAzbHUgJTJkLyUwMmQgJTNkICU1ZCAlNWQgJWxkXG4iLAorCQkJYXgyYXNjKCZuci0+c291cmNlX2FkZHIpLAorCQkJZGV2bmFtZSwKKwkJCW5yLT5teV9pbmRleCwKKwkJCW5yLT5teV9pZCwKKwkJCW5yLT55b3VyX2luZGV4LAorCQkJbnItPnlvdXJfaWQsCisJCQluci0+c3RhdGUsCisJCQluci0+dnMsCisJCQluci0+dnIsCisJCQluci0+dmEsCisJCQlheDI1X2Rpc3BsYXlfdGltZXIoJm5yLT50MXRpbWVyKSAvIEhaLAorCQkJbnItPnQxIC8gSFosCisJCQlheDI1X2Rpc3BsYXlfdGltZXIoJm5yLT50MnRpbWVyKSAvIEhaLAorCQkJbnItPnQyIC8gSFosCisJCQlheDI1X2Rpc3BsYXlfdGltZXIoJm5yLT50NHRpbWVyKSAvIEhaLAorCQkJbnItPnQ0IC8gSFosCisJCQlheDI1X2Rpc3BsYXlfdGltZXIoJm5yLT5pZGxldGltZXIpIC8gKDYwICogSFopLAorCQkJbnItPmlkbGUgLyAoNjAgKiBIWiksCisJCQluci0+bjJjb3VudCwKKwkJCW5yLT5uMiwKKwkJCW5yLT53aW5kb3csCisJCQlhdG9taWNfcmVhZCgmcy0+c2tfd21lbV9hbGxvYyksCisJCQlhdG9taWNfcmVhZCgmcy0+c2tfcm1lbV9hbGxvYyksCisJCQlzLT5za19zb2NrZXQgPyBTT0NLX0lOT0RFKHMtPnNrX3NvY2tldCktPmlfaW5vIDogMEwpOworCisJCWJoX3VubG9ja19zb2NrKHMpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBucl9pbmZvX3NlcW9wcyA9IHsKKwkuc3RhcnQgPSBucl9pbmZvX3N0YXJ0LAorCS5uZXh0ID0gbnJfaW5mb19uZXh0LAorCS5zdG9wID0gbnJfaW5mb19zdG9wLAorCS5zaG93ID0gbnJfaW5mb19zaG93LAorfTsKKyAKK3N0YXRpYyBpbnQgbnJfaW5mb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmbnJfaW5mb19zZXFvcHMpOworfQorIAorc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbnJfaW5mb19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gbnJfaW5mb19vcGVuLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKyNlbmRpZgkvKiBDT05GSUdfUFJPQ19GUyAqLworCitzdGF0aWMgc3RydWN0IG5ldF9wcm90b19mYW1pbHkgbnJfZmFtaWx5X29wcyA9IHsKKwkuZmFtaWx5CQk9CVBGX05FVFJPTSwKKwkuY3JlYXRlCQk9CW5yX2NyZWF0ZSwKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBucl9wcm90b19vcHMgPSB7CisJLmZhbWlseQkJPQlQRl9ORVRST00sCisJLm93bmVyCQk9CVRISVNfTU9EVUxFLAorCS5yZWxlYXNlCT0JbnJfcmVsZWFzZSwKKwkuYmluZAkJPQlucl9iaW5kLAorCS5jb25uZWN0CT0JbnJfY29ubmVjdCwKKwkuc29ja2V0cGFpcgk9CXNvY2tfbm9fc29ja2V0cGFpciwKKwkuYWNjZXB0CQk9CW5yX2FjY2VwdCwKKwkuZ2V0bmFtZQk9CW5yX2dldG5hbWUsCisJLnBvbGwJCT0JZGF0YWdyYW1fcG9sbCwKKwkuaW9jdGwJCT0JbnJfaW9jdGwsCisJLmxpc3RlbgkJPQlucl9saXN0ZW4sCisJLnNodXRkb3duCT0Jc29ja19ub19zaHV0ZG93biwKKwkuc2V0c29ja29wdAk9CW5yX3NldHNvY2tvcHQsCisJLmdldHNvY2tvcHQJPQlucl9nZXRzb2Nrb3B0LAorCS5zZW5kbXNnCT0JbnJfc2VuZG1zZywKKwkucmVjdm1zZwk9CW5yX3JlY3Ztc2csCisJLm1tYXAJCT0Jc29ja19ub19tbWFwLAorCS5zZW5kcGFnZQk9CXNvY2tfbm9fc2VuZHBhZ2UsCit9OworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG5yX2Rldl9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbAk9CW5yX2RldmljZV9ldmVudCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqKmRldl9ucjsKKworc3RhdGljIGNoYXIgYmFubmVyW10gX19pbml0ZGF0YSA9IEtFUk5fSU5GTyAiRzRLTFggTkVUL1JPTSBmb3IgTGludXguIFZlcnNpb24gMC43IGZvciBBWDI1LjAzNyBMaW51eCAyLjRcbiI7CisKK3N0YXRpYyBpbnQgX19pbml0IG5yX3Byb3RvX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgcmMgPSBwcm90b19yZWdpc3RlcigmbnJfcHJvdG8sIDApOworCisJaWYgKHJjICE9IDApCisJCWdvdG8gb3V0OworCisJaWYgKG5yX25kZXZzID4gMHg3ZmZmZmZmZi9zaXplb2Yoc3RydWN0IG5ldF9kZXZpY2UgKikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJORVQvUk9NOiBucl9wcm90b19pbml0IC0gbnJfbmRldnMgcGFyYW1ldGVyIHRvIGxhcmdlXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWRldl9uciA9IGttYWxsb2MobnJfbmRldnMgKiBzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2UgKiksIEdGUF9LRVJORUwpOworCWlmIChkZXZfbnIgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIk5FVC9ST006IG5yX3Byb3RvX2luaXQgLSB1bmFibGUgdG8gYWxsb2NhdGUgZGV2aWNlIGFycmF5XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1lbXNldChkZXZfbnIsIDB4MDAsIG5yX25kZXZzICogc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlICopKTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9uZGV2czsgaSsrKSB7CisJCWNoYXIgbmFtZVtJRk5BTVNJWl07CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwkJc3ByaW50ZihuYW1lLCAibnIlZCIsIGkpOworCQlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSwgbmFtZSwKKwkJCQkJICBucl9zZXR1cCk7CisJCWlmICghZGV2KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIk5FVC9ST006IG5yX3Byb3RvX2luaXQgLSB1bmFibGUgdG8gYWxsb2NhdGUgZGV2aWNlIHN0cnVjdHVyZVxuIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJCisJCWRldi0+YmFzZV9hZGRyID0gaTsKKwkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIk5FVC9ST006IG5yX3Byb3RvX2luaXQgLSB1bmFibGUgdG8gcmVnaXN0ZXIgbmV0d29yayBkZXZpY2VcbiIpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlkZXZfbnJbaV0gPSBkZXY7CisJfQorCisJaWYgKHNvY2tfcmVnaXN0ZXIoJm5yX2ZhbWlseV9vcHMpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTkVUL1JPTTogbnJfcHJvdG9faW5pdCAtIHVuYWJsZSB0byByZWdpc3RlciBzb2NrZXQgZmFtaWx5XG4iKTsKKwkJZ290byBmYWlsOworCX0KKwkJCisJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZucl9kZXZfbm90aWZpZXIpOworCXByaW50ayhiYW5uZXIpOworCisJYXgyNV9wcm90b2NvbF9yZWdpc3RlcihBWDI1X1BfTkVUUk9NLCBucl9yb3V0ZV9mcmFtZSk7CisJYXgyNV9saW5rZmFpbF9yZWdpc3Rlcihucl9saW5rX2ZhaWxlZCk7CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJbnJfcmVnaXN0ZXJfc3lzY3RsKCk7CisjZW5kaWYKKworCW5yX2xvb3BiYWNrX2luaXQoKTsKKworCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJuciIsIFNfSVJVR08sICZucl9pbmZvX2ZvcHMpOworCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJucl9uZWlnaCIsIFNfSVJVR08sICZucl9uZWlnaF9mb3BzKTsKKwlwcm9jX25ldF9mb3BzX2NyZWF0ZSgibnJfbm9kZXMiLCBTX0lSVUdPLCAmbnJfbm9kZXNfZm9wcyk7CitvdXQ6CisJcmV0dXJuIHJjOworZmFpbDoKKwl3aGlsZSAoLS1pID49IDApIHsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2X25yW2ldKTsKKwkJZnJlZV9uZXRkZXYoZGV2X25yW2ldKTsKKwl9CisJa2ZyZWUoZGV2X25yKTsKKwlwcm90b191bnJlZ2lzdGVyKCZucl9wcm90byk7CisJcmMgPSAtMTsKKwlnb3RvIG91dDsKK30KKworbW9kdWxlX2luaXQobnJfcHJvdG9faW5pdCk7CisKK21vZHVsZV9wYXJhbShucl9uZGV2cywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobnJfbmRldnMsICJudW1iZXIgb2YgTkVUL1JPTSBkZXZpY2VzIik7CisKK01PRFVMRV9BVVRIT1IoIkpvbmF0aGFuIE5heWxvciBHNEtMWCA8ZzRrbHhAZzRrbHguZGVtb24uY28udWs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRoZSBhbWF0ZXVyIHJhZGlvIE5FVC9ST00gbmV0d29yayBhbmQgdHJhbnNwb3J0IGxheWVyIHByb3RvY29sIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTkVUUFJPVE8oUEZfTkVUUk9NKTsKKworc3RhdGljIHZvaWQgX19leGl0IG5yX2V4aXQodm9pZCkKK3sKKwlpbnQgaTsKKworCXByb2NfbmV0X3JlbW92ZSgibnIiKTsKKwlwcm9jX25ldF9yZW1vdmUoIm5yX25laWdoIik7CisJcHJvY19uZXRfcmVtb3ZlKCJucl9ub2RlcyIpOworCW5yX2xvb3BiYWNrX2NsZWFyKCk7CisKKwlucl9ydF9mcmVlKCk7CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJbnJfdW5yZWdpc3Rlcl9zeXNjdGwoKTsKKyNlbmRpZgorCisJYXgyNV9saW5rZmFpbF9yZWxlYXNlKG5yX2xpbmtfZmFpbGVkKTsKKwlheDI1X3Byb3RvY29sX3JlbGVhc2UoQVgyNV9QX05FVFJPTSk7CisKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmbnJfZGV2X25vdGlmaWVyKTsKKworCXNvY2tfdW5yZWdpc3RlcihQRl9ORVRST00pOworCisJZm9yIChpID0gMDsgaSA8IG5yX25kZXZzOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9ucltpXTsKKwkJaWYgKGRldikgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9CisKKwlrZnJlZShkZXZfbnIpOworCXByb3RvX3VucmVnaXN0ZXIoJm5yX3Byb3RvKTsKK30KK21vZHVsZV9leGl0KG5yX2V4aXQpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldHJvbS9ucl9kZXYuYyBiL25ldC9uZXRyb20vbnJfZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIwYmY3NAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRyb20vbnJfZGV2LmMKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENvcHlyaWdodCBKb25hdGhhbiBOYXlsb3IgRzRLTFggKGc0a2x4QGc0a2x4LmRlbW9uLmNvLnVrKQorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CS8qIEZvciB0aGUgc3RhdGlzdGljcyBzdHJ1Y3R1cmUuICovCisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorCisjaW5jbHVkZSA8bmV0L2F4MjUuaD4KKyNpbmNsdWRlIDxuZXQvbmV0cm9tLmg+CisKKyNpZmRlZiBDT05GSUdfSU5FVAorCisvKgorICoJT25seSBhbGxvdyBJUCBvdmVyIE5FVC9ST00gZnJhbWVzIHRocm91Z2ggaWYgdGhlIG5ldHJvbSBkZXZpY2UgaXMgdXAuCisgKi8KKworaW50IG5yX3J4X2lwKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwkJcmV0dXJuIDA7CisJfQorCisJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwlzdGF0cy0+cnhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOworCisJLyogU3Bvb2YgaW5jb21pbmcgZGV2aWNlICovCisJc2tiLT5kZXYgICAgICA9IGRldjsKKwlza2ItPmgucmF3ICAgID0gc2tiLT5kYXRhOworCXNrYi0+bmgucmF3ICAgPSBza2ItPmRhdGE7CisJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOworCisJaXBfcmN2KHNrYiwgc2tiLT5kZXYsIE5VTEwpOworCisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBucl9yZWJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBza19idWZmICpza2JuOworCXVuc2lnbmVkIGNoYXIgKmJwID0gc2tiLT5kYXRhOworCWludCBsZW47CisKKwlpZiAoYXJwX2ZpbmQoYnAgKyA3LCBza2IpKSB7CisJCXJldHVybiAxOworCX0KKworCWJwWzZdICY9IH5BWDI1X0NCSVQ7CisJYnBbNl0gJj0gfkFYMjVfRUJJVDsKKwlicFs2XSB8PSBBWDI1X1NTU0lEX1NQQVJFOworCWJwICAgICs9IEFYMjVfQUREUl9MRU47CisKKwlicFs2XSAmPSB+QVgyNV9DQklUOworCWJwWzZdIHw9IEFYMjVfRUJJVDsKKwlicFs2XSB8PSBBWDI1X1NTU0lEX1NQQVJFOworCisJaWYgKChza2JuID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAxOworCX0KKworCWlmIChza2ItPnNrICE9IE5VTEwpCisJCXNrYl9zZXRfb3duZXJfdyhza2JuLCBza2ItPnNrKTsKKworCWtmcmVlX3NrYihza2IpOworCisJbGVuID0gc2tibi0+bGVuOworCisJaWYgKCFucl9yb3V0ZV9mcmFtZShza2JuLCBOVUxMKSkgeworCQlrZnJlZV9za2Ioc2tibik7CisJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwl9CisKKwlzdGF0cy0+dHhfcGFja2V0cysrOworCXN0YXRzLT50eF9ieXRlcyArPSBsZW47CisKKwlyZXR1cm4gMTsKK30KKworI2Vsc2UKKworc3RhdGljIGludCBucl9yZWJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAxOworfQorCisjZW5kaWYKKworc3RhdGljIGludCBucl9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdHlwZSwKKwl2b2lkICpkYWRkciwgdm9pZCAqc2FkZHIsIHVuc2lnbmVkIGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICpidWZmID0gc2tiX3B1c2goc2tiLCBOUl9ORVRXT1JLX0xFTiArIE5SX1RSQU5TUE9SVF9MRU4pOworCisJbWVtY3B5KGJ1ZmYsIChzYWRkciAhPSBOVUxMKSA/IHNhZGRyIDogZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbik7CisJYnVmZls2XSAmPSB+QVgyNV9DQklUOworCWJ1ZmZbNl0gJj0gfkFYMjVfRUJJVDsKKwlidWZmWzZdIHw9IEFYMjVfU1NTSURfU1BBUkU7CisJYnVmZiAgICArPSBBWDI1X0FERFJfTEVOOworCisJaWYgKGRhZGRyICE9IE5VTEwpCisJCW1lbWNweShidWZmLCBkYWRkciwgZGV2LT5hZGRyX2xlbik7CisJYnVmZls2XSAmPSB+QVgyNV9DQklUOworCWJ1ZmZbNl0gfD0gQVgyNV9FQklUOworCWJ1ZmZbNl0gfD0gQVgyNV9TU1NJRF9TUEFSRTsKKwlidWZmICAgICs9IEFYMjVfQUREUl9MRU47CisKKwkqYnVmZisrID0gc3lzY3RsX25ldHJvbV9uZXR3b3JrX3R0bF9pbml0aWFsaXNlcjsKKworCSpidWZmKysgPSBOUl9QUk9UT19JUDsKKwkqYnVmZisrID0gTlJfUFJPVE9fSVA7CisJKmJ1ZmYrKyA9IDA7CisJKmJ1ZmYrKyA9IDA7CisJKmJ1ZmYrKyA9IE5SX1BST1RPRVhUOworCisJaWYgKGRhZGRyICE9IE5VTEwpCisJCXJldHVybiAzNzsKKworCXJldHVybiAtMzc7Cit9CisKK3N0YXRpYyBpbnQgbnJfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisJc3RydWN0IHNvY2thZGRyICpzYSA9IGFkZHI7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9VUCkKKwkJYXgyNV9saXN0ZW5fcmVsZWFzZSgoYXgyNV9hZGRyZXNzICopZGV2LT5kZXZfYWRkciwgTlVMTCk7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgc2EtPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApCisJCWF4MjVfbGlzdGVuX3JlZ2lzdGVyKChheDI1X2FkZHJlc3MgKilkZXYtPmRldl9hZGRyLCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5yX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCWF4MjVfbGlzdGVuX3JlZ2lzdGVyKChheDI1X2FkZHJlc3MgKilkZXYtPmRldl9hZGRyLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBucl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWF4MjVfbGlzdGVuX3JlbGVhc2UoKGF4MjVfYWRkcmVzcyAqKWRldi0+ZGV2X2FkZHIsIE5VTEwpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBucl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJc3RhdHMtPnR4X2Vycm9ycysrOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5yX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBuZXRkZXZfcHJpdihkZXYpOworfQorCit2b2lkIG5yX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCWRldi0+bXR1CQk9IE5SX01BWF9QQUNLRVRfU0laRTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IG5yX3htaXQ7CisJZGV2LT5vcGVuCQk9IG5yX29wZW47CisJZGV2LT5zdG9wCQk9IG5yX2Nsb3NlOworCisJZGV2LT5oYXJkX2hlYWRlcgk9IG5yX2hlYWRlcjsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbgk9IE5SX05FVFdPUktfTEVOICsgTlJfVFJBTlNQT1JUX0xFTjsKKwlkZXYtPmFkZHJfbGVuCQk9IEFYMjVfQUREUl9MRU47CisJZGV2LT50eXBlCQk9IEFSUEhSRF9ORVRST007CisJZGV2LT50eF9xdWV1ZV9sZW4JPSA0MDsKKwlkZXYtPnJlYnVpbGRfaGVhZGVyCT0gbnJfcmVidWlsZF9oZWFkZXI7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgICAgPSBucl9zZXRfbWFjX2FkZHJlc3M7CisKKwkvKiBOZXctc3R5bGUgZmxhZ3MuICovCisJZGV2LT5mbGFncwkJPSAwOworCisJZGV2LT5nZXRfc3RhdHMgCQk9IG5yX2dldF9zdGF0czsKK30KZGlmZiAtLWdpdCBhL25ldC9uZXRyb20vbnJfaW4uYyBiL25ldC9uZXRyb20vbnJfaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzQ0YjM3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldHJvbS9ucl9pbi5jCkBAIC0wLDAgKzEsMjkwIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDb3B5cmlnaHQgSm9uYXRoYW4gTmF5bG9yIEc0S0xYIChnNGtseEBnNGtseC5kZW1vbi5jby51aykKKyAqIENvcHlyaWdodCBEYXJyeWwgTWlsZXMgRzdMRUQgKGRsbUBnN2xlZC5kZW1vbi5jby51aykKKyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bmV0L2F4MjUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CQkJLyogRm9yIGlwX3JjdiAqLworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxuZXQvbmV0cm9tLmg+CisKK3N0YXRpYyBpbnQgbnJfcXVldWVfcnhfZnJhbWUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbW9yZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tibywgKnNrYm4gPSBza2I7CisJc3RydWN0IG5yX3NvY2sgKm5yID0gbnJfc2soc2spOworCisJc2tiX3B1bGwoc2tiLCBOUl9ORVRXT1JLX0xFTiArIE5SX1RSQU5TUE9SVF9MRU4pOworCisJbnJfc3RhcnRfaWRsZXRpbWVyKHNrKTsKKworCWlmIChtb3JlKSB7CisJCW5yLT5mcmFnbGVuICs9IHNrYi0+bGVuOworCQlza2JfcXVldWVfdGFpbCgmbnItPmZyYWdfcXVldWUsIHNrYik7CisJCXJldHVybiAwOworCX0KKworCWlmICghbW9yZSAmJiBuci0+ZnJhZ2xlbiA+IDApIHsJLyogRW5kIG9mIGZyYWdtZW50ICovCisJCW5yLT5mcmFnbGVuICs9IHNrYi0+bGVuOworCQlza2JfcXVldWVfdGFpbCgmbnItPmZyYWdfcXVldWUsIHNrYik7CisKKwkJaWYgKChza2JuID0gYWxsb2Nfc2tiKG5yLT5mcmFnbGVuLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwkJCXJldHVybiAxOworCisJCXNrYm4tPmgucmF3ID0gc2tibi0+ZGF0YTsKKworCQl3aGlsZSAoKHNrYm8gPSBza2JfZGVxdWV1ZSgmbnItPmZyYWdfcXVldWUpKSAhPSBOVUxMKSB7CisJCQltZW1jcHkoc2tiX3B1dChza2JuLCBza2JvLT5sZW4pLCBza2JvLT5kYXRhLCBza2JvLT5sZW4pOworCQkJa2ZyZWVfc2tiKHNrYm8pOworCQl9CisKKwkJbnItPmZyYWdsZW4gPSAwOworCX0KKworCXJldHVybiBzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYm4pOworfQorCisvKgorICogU3RhdGUgbWFjaGluZSBmb3Igc3RhdGUgMSwgQXdhaXRpbmcgQ29ubmVjdGlvbiBTdGF0ZS4KKyAqIFRoZSBoYW5kbGluZyBvZiB0aGUgdGltZXIocykgaXMgaW4gZmlsZSBucl90aW1lci5jLgorICogSGFuZGxpbmcgb2Ygc3RhdGUgMCBhbmQgY29ubmVjdGlvbiByZWxlYXNlIGlzIGluIG5ldHJvbS5jLgorICovCitzdGF0aWMgaW50IG5yX3N0YXRlMV9tYWNoaW5lKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwlpbnQgZnJhbWV0eXBlKQoreworCXN3aXRjaCAoZnJhbWV0eXBlKSB7CisJY2FzZSBOUl9DT05OQUNLOiB7CisJCXN0cnVjdCBucl9zb2NrICpuciA9IG5yX3NrKHNrKTsKKworCQlucl9zdG9wX3QxdGltZXIoc2spOworCQlucl9zdGFydF9pZGxldGltZXIoc2spOworCQluci0+eW91cl9pbmRleCA9IHNrYi0+ZGF0YVsxN107CisJCW5yLT55b3VyX2lkICAgID0gc2tiLT5kYXRhWzE4XTsKKwkJbnItPnZzCSAgICAgICA9IDA7CisJCW5yLT52YQkgICAgICAgPSAwOworCQluci0+dnIJICAgICAgID0gMDsKKwkJbnItPnZsCSAgICAgICA9IDA7CisJCW5yLT5zdGF0ZSAgICAgID0gTlJfU1RBVEVfMzsKKwkJbnItPm4yY291bnQgICAgPSAwOworCQluci0+d2luZG93ICAgICA9IHNrYi0+ZGF0YVsyMF07CisJCXNrLT5za19zdGF0ZSAgID0gVENQX0VTVEFCTElTSEVEOworCQlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkKKwkJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCQlicmVhazsKKwl9CisKKwljYXNlIE5SX0NPTk5BQ0sgfCBOUl9DSE9LRV9GTEFHOgorCQlucl9kaXNjb25uZWN0KHNrLCBFQ09OTlJFRlVTRUQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFN0YXRlIG1hY2hpbmUgZm9yIHN0YXRlIDIsIEF3YWl0aW5nIFJlbGVhc2UgU3RhdGUuCisgKiBUaGUgaGFuZGxpbmcgb2YgdGhlIHRpbWVyKHMpIGlzIGluIGZpbGUgbnJfdGltZXIuYworICogSGFuZGxpbmcgb2Ygc3RhdGUgMCBhbmQgY29ubmVjdGlvbiByZWxlYXNlIGlzIGluIG5ldHJvbS5jLgorICovCitzdGF0aWMgaW50IG5yX3N0YXRlMl9tYWNoaW5lKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwlpbnQgZnJhbWV0eXBlKQoreworCXN3aXRjaCAoZnJhbWV0eXBlKSB7CisJY2FzZSBOUl9DT05OQUNLIHwgTlJfQ0hPS0VfRkxBRzoKKwkJbnJfZGlzY29ubmVjdChzaywgRUNPTk5SRVNFVCk7CisJCWJyZWFrOworCisJY2FzZSBOUl9ESVNDUkVROgorCQlucl93cml0ZV9pbnRlcm5hbChzaywgTlJfRElTQ0FDSyk7CisKKwljYXNlIE5SX0RJU0NBQ0s6CisJCW5yX2Rpc2Nvbm5lY3Qoc2ssIDApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFN0YXRlIG1hY2hpbmUgZm9yIHN0YXRlIDMsIENvbm5lY3RlZCBTdGF0ZS4KKyAqIFRoZSBoYW5kbGluZyBvZiB0aGUgdGltZXIocykgaXMgaW4gZmlsZSBucl90aW1lci5jCisgKiBIYW5kbGluZyBvZiBzdGF0ZSAwIGFuZCBjb25uZWN0aW9uIHJlbGVhc2UgaXMgaW4gbmV0cm9tLmMuCisgKi8KK3N0YXRpYyBpbnQgbnJfc3RhdGUzX21hY2hpbmUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZnJhbWV0eXBlKQoreworCXN0cnVjdCBucl9zb2NrICpucm9tID0gbnJfc2soc2spOworCXN0cnVjdCBza19idWZmX2hlYWQgdGVtcF9xdWV1ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tibjsKKwl1bnNpZ25lZCBzaG9ydCBzYXZlX3ZyOworCXVuc2lnbmVkIHNob3J0IG5yLCBuczsKKwlpbnQgcXVldWVkID0gMDsKKworCW5yID0gc2tiLT5kYXRhWzE4XTsKKwlucyA9IHNrYi0+ZGF0YVsxN107CisKKwlzd2l0Y2ggKGZyYW1ldHlwZSkgeworCWNhc2UgTlJfQ09OTlJFUToKKwkJbnJfd3JpdGVfaW50ZXJuYWwoc2ssIE5SX0NPTk5BQ0spOworCQlicmVhazsKKworCWNhc2UgTlJfRElTQ1JFUToKKwkJbnJfd3JpdGVfaW50ZXJuYWwoc2ssIE5SX0RJU0NBQ0spOworCQlucl9kaXNjb25uZWN0KHNrLCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIE5SX0NPTk5BQ0sgfCBOUl9DSE9LRV9GTEFHOgorCWNhc2UgTlJfRElTQ0FDSzoKKwkJbnJfZGlzY29ubmVjdChzaywgRUNPTk5SRVNFVCk7CisJCWJyZWFrOworCisJY2FzZSBOUl9JTkZPQUNLOgorCWNhc2UgTlJfSU5GT0FDSyB8IE5SX0NIT0tFX0ZMQUc6CisJY2FzZSBOUl9JTkZPQUNLIHwgTlJfTkFLX0ZMQUc6CisJY2FzZSBOUl9JTkZPQUNLIHwgTlJfTkFLX0ZMQUcgfCBOUl9DSE9LRV9GTEFHOgorCQlpZiAoZnJhbWV0eXBlICYgTlJfQ0hPS0VfRkxBRykgeworCQkJbnJvbS0+Y29uZGl0aW9uIHw9IE5SX0NPTkRfUEVFUl9SWF9CVVNZOworCQkJbnJfc3RhcnRfdDR0aW1lcihzayk7CisJCX0gZWxzZSB7CisJCQlucm9tLT5jb25kaXRpb24gJj0gfk5SX0NPTkRfUEVFUl9SWF9CVVNZOworCQkJbnJfc3RvcF90NHRpbWVyKHNrKTsKKwkJfQorCQlpZiAoIW5yX3ZhbGlkYXRlX25yKHNrLCBucikpIHsKKwkJCWJyZWFrOworCQl9CisJCWlmIChmcmFtZXR5cGUgJiBOUl9OQUtfRkxBRykgeworCQkJbnJfZnJhbWVzX2Fja2VkKHNrLCBucik7CisJCQlucl9zZW5kX25ha19mcmFtZShzayk7CisJCX0gZWxzZSB7CisJCQlpZiAobnJvbS0+Y29uZGl0aW9uICYgTlJfQ09ORF9QRUVSX1JYX0JVU1kpIHsKKwkJCQlucl9mcmFtZXNfYWNrZWQoc2ssIG5yKTsKKwkJCX0gZWxzZSB7CisJCQkJbnJfY2hlY2tfaWZyYW1lc19hY2tlZChzaywgbnIpOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBOUl9JTkZPOgorCWNhc2UgTlJfSU5GTyB8IE5SX05BS19GTEFHOgorCWNhc2UgTlJfSU5GTyB8IE5SX0NIT0tFX0ZMQUc6CisJY2FzZSBOUl9JTkZPIHwgTlJfTU9SRV9GTEFHOgorCWNhc2UgTlJfSU5GTyB8IE5SX05BS19GTEFHIHwgTlJfQ0hPS0VfRkxBRzoKKwljYXNlIE5SX0lORk8gfCBOUl9DSE9LRV9GTEFHIHwgTlJfTU9SRV9GTEFHOgorCWNhc2UgTlJfSU5GTyB8IE5SX05BS19GTEFHIHwgTlJfTU9SRV9GTEFHOgorCWNhc2UgTlJfSU5GTyB8IE5SX05BS19GTEFHIHwgTlJfQ0hPS0VfRkxBRyB8IE5SX01PUkVfRkxBRzoKKwkJaWYgKGZyYW1ldHlwZSAmIE5SX0NIT0tFX0ZMQUcpIHsKKwkJCW5yb20tPmNvbmRpdGlvbiB8PSBOUl9DT05EX1BFRVJfUlhfQlVTWTsKKwkJCW5yX3N0YXJ0X3Q0dGltZXIoc2spOworCQl9IGVsc2UgeworCQkJbnJvbS0+Y29uZGl0aW9uICY9IH5OUl9DT05EX1BFRVJfUlhfQlVTWTsKKwkJCW5yX3N0b3BfdDR0aW1lcihzayk7CisJCX0KKwkJaWYgKG5yX3ZhbGlkYXRlX25yKHNrLCBucikpIHsKKwkJCWlmIChmcmFtZXR5cGUgJiBOUl9OQUtfRkxBRykgeworCQkJCW5yX2ZyYW1lc19hY2tlZChzaywgbnIpOworCQkJCW5yX3NlbmRfbmFrX2ZyYW1lKHNrKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKG5yb20tPmNvbmRpdGlvbiAmIE5SX0NPTkRfUEVFUl9SWF9CVVNZKSB7CisJCQkJCW5yX2ZyYW1lc19hY2tlZChzaywgbnIpOworCQkJCX0gZWxzZSB7CisJCQkJCW5yX2NoZWNrX2lmcmFtZXNfYWNrZWQoc2ssIG5yKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcXVldWVkID0gMTsKKwkJc2tiX3F1ZXVlX2hlYWQoJm5yb20tPnJlc2VxX3F1ZXVlLCBza2IpOworCQlpZiAobnJvbS0+Y29uZGl0aW9uICYgTlJfQ09ORF9PV05fUlhfQlVTWSkKKwkJCWJyZWFrOworCQlza2JfcXVldWVfaGVhZF9pbml0KCZ0ZW1wX3F1ZXVlKTsKKwkJZG8geworCQkJc2F2ZV92ciA9IG5yb20tPnZyOworCQkJd2hpbGUgKChza2JuID0gc2tiX2RlcXVldWUoJm5yb20tPnJlc2VxX3F1ZXVlKSkgIT0gTlVMTCkgeworCQkJCW5zID0gc2tibi0+ZGF0YVsxN107CisJCQkJaWYgKG5zID09IG5yb20tPnZyKSB7CisJCQkJCWlmIChucl9xdWV1ZV9yeF9mcmFtZShzaywgc2tibiwgZnJhbWV0eXBlICYgTlJfTU9SRV9GTEFHKSA9PSAwKSB7CisJCQkJCQlucm9tLT52ciA9IChucm9tLT52ciArIDEpICUgTlJfTU9EVUxVUzsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW5yb20tPmNvbmRpdGlvbiB8PSBOUl9DT05EX09XTl9SWF9CVVNZOworCQkJCQkJc2tiX3F1ZXVlX3RhaWwoJnRlbXBfcXVldWUsIHNrYm4pOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChucl9pbl9yeF93aW5kb3coc2ssIG5zKSkgeworCQkJCQlza2JfcXVldWVfdGFpbCgmdGVtcF9xdWV1ZSwgc2tibik7CisJCQkJfSBlbHNlIHsKKwkJCQkJa2ZyZWVfc2tiKHNrYm4pOworCQkJCX0KKwkJCX0KKwkJCXdoaWxlICgoc2tibiA9IHNrYl9kZXF1ZXVlKCZ0ZW1wX3F1ZXVlKSkgIT0gTlVMTCkgeworCQkJCXNrYl9xdWV1ZV90YWlsKCZucm9tLT5yZXNlcV9xdWV1ZSwgc2tibik7CisJCQl9CisJCX0gd2hpbGUgKHNhdmVfdnIgIT0gbnJvbS0+dnIpOworCQkvKgorCQkgKiBXaW5kb3cgaXMgZnVsbCwgYWNrIGl0IGltbWVkaWF0ZWx5LgorCQkgKi8KKwkJaWYgKCgobnJvbS0+dmwgKyBucm9tLT53aW5kb3cpICUgTlJfTU9EVUxVUykgPT0gbnJvbS0+dnIpIHsKKwkJCW5yX2VucXVpcnlfcmVzcG9uc2Uoc2spOworCQl9IGVsc2UgeworCQkJaWYgKCEobnJvbS0+Y29uZGl0aW9uICYgTlJfQ09ORF9BQ0tfUEVORElORykpIHsKKwkJCQlucm9tLT5jb25kaXRpb24gfD0gTlJfQ09ORF9BQ0tfUEVORElORzsKKwkJCQlucl9zdGFydF90MnRpbWVyKHNrKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcXVldWVkOworfQorCisvKiBIaWdoZXIgbGV2ZWwgdXBjYWxsIGZvciBhIExBUEIgZnJhbWUgLSBjYWxsZWQgd2l0aCBzayBsb2NrZWQgKi8KK2ludCBucl9wcm9jZXNzX3J4X2ZyYW1lKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbnJfc29jayAqbnIgPSBucl9zayhzayk7CisJaW50IHF1ZXVlZCA9IDAsIGZyYW1ldHlwZTsKKworCWlmIChuci0+c3RhdGUgPT0gTlJfU1RBVEVfMCkKKwkJcmV0dXJuIDA7CisKKwlmcmFtZXR5cGUgPSBza2ItPmRhdGFbMTldOworCisJc3dpdGNoIChuci0+c3RhdGUpIHsKKwljYXNlIE5SX1NUQVRFXzE6CisJCXF1ZXVlZCA9IG5yX3N0YXRlMV9tYWNoaW5lKHNrLCBza2IsIGZyYW1ldHlwZSk7CisJCWJyZWFrOworCWNhc2UgTlJfU1RBVEVfMjoKKwkJcXVldWVkID0gbnJfc3RhdGUyX21hY2hpbmUoc2ssIHNrYiwgZnJhbWV0eXBlKTsKKwkJYnJlYWs7CisJY2FzZSBOUl9TVEFURV8zOgorCQlxdWV1ZWQgPSBucl9zdGF0ZTNfbWFjaGluZShzaywgc2tiLCBmcmFtZXR5cGUpOworCQlicmVhazsKKwl9CisKKwlucl9raWNrKHNrKTsKKworCXJldHVybiBxdWV1ZWQ7Cit9CmRpZmYgLS1naXQgYS9uZXQvbmV0cm9tL25yX2xvb3BiYWNrLmMgYi9uZXQvbmV0cm9tL25yX2xvb3BiYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY1YjJhYgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRyb20vbnJfbG9vcGJhY2suYwpAQCAtMCwwICsxLDc2IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDb3B5cmlnaHQgVG9taSBNYW5uaW5lbiBPSDJCTlMgKG9oMmJuc0BzcmFsLmZpKQorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPG5ldC9heDI1Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L25ldHJvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworc3RhdGljIHZvaWQgbnJfbG9vcGJhY2tfdGltZXIodW5zaWduZWQgbG9uZyk7CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGxvb3BiYWNrX3F1ZXVlOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGxvb3BiYWNrX3RpbWVyID0gVElNRVJfSU5JVElBTElaRVIobnJfbG9vcGJhY2tfdGltZXIsIDAsIDApOworCit2b2lkIF9faW5pdCBucl9sb29wYmFja19pbml0KHZvaWQpCit7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbG9vcGJhY2tfcXVldWUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBucl9sb29wYmFja19ydW5uaW5nKHZvaWQpCit7CisJcmV0dXJuIHRpbWVyX3BlbmRpbmcoJmxvb3BiYWNrX3RpbWVyKTsKK30KKworaW50IG5yX2xvb3BiYWNrX3F1ZXVlKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYm47CisKKwlpZiAoKHNrYm4gPSBhbGxvY19za2Ioc2tiLT5sZW4sIEdGUF9BVE9NSUMpKSAhPSBOVUxMKSB7CisJCW1lbWNweShza2JfcHV0KHNrYm4sIHNrYi0+bGVuKSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCXNrYm4tPmgucmF3ID0gc2tibi0+ZGF0YTsKKworCQlza2JfcXVldWVfdGFpbCgmbG9vcGJhY2tfcXVldWUsIHNrYm4pOworCisJCWlmICghbnJfbG9vcGJhY2tfcnVubmluZygpKQorCQkJbW9kX3RpbWVyKCZsb29wYmFja190aW1lciwgamlmZmllcyArIDEwKTsKKwl9CisKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgbnJfbG9vcGJhY2tfdGltZXIodW5zaWduZWQgbG9uZyBwYXJhbSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWF4MjVfYWRkcmVzcyAqbnJfZGVzdDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJaWYgKChza2IgPSBza2JfZGVxdWV1ZSgmbG9vcGJhY2tfcXVldWUpKSAhPSBOVUxMKSB7CisJCW5yX2Rlc3QgPSAoYXgyNV9hZGRyZXNzICopKHNrYi0+ZGF0YSArIDcpOworCisJCWRldiA9IG5yX2Rldl9nZXQobnJfZGVzdCk7CisKKwkJaWYgKGRldiA9PSBOVUxMIHx8IG5yX3J4X2ZyYW1lKHNrYiwgZGV2KSA9PSAwKQorCQkJa2ZyZWVfc2tiKHNrYik7CisKKwkJaWYgKGRldiAhPSBOVUxMKQorCQkJZGV2X3B1dChkZXYpOworCisJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZsb29wYmFja19xdWV1ZSkgJiYgIW5yX2xvb3BiYWNrX3J1bm5pbmcoKSkKKwkJCW1vZF90aW1lcigmbG9vcGJhY2tfdGltZXIsIGppZmZpZXMgKyAxMCk7CisJfQorfQorCit2b2lkIF9fZXhpdCBucl9sb29wYmFja19jbGVhcih2b2lkKQoreworCWRlbF90aW1lcl9zeW5jKCZsb29wYmFja190aW1lcik7CisJc2tiX3F1ZXVlX3B1cmdlKCZsb29wYmFja19xdWV1ZSk7Cit9CmRpZmYgLS1naXQgYS9uZXQvbmV0cm9tL25yX291dC5jIGIvbmV0L25ldHJvbS9ucl9vdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTM5ZGVkCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldHJvbS9ucl9vdXQuYwpAQCAtMCwwICsxLDI3NCBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQ29weXJpZ2h0IEpvbmF0aGFuIE5heWxvciBHNEtMWCAoZzRrbHhAZzRrbHguZGVtb24uY28udWspCisgKiBDb3B5cmlnaHQgRGFycnlsIE1pbGVzIEc3TEVEIChkbG1AZzdsZWQuZGVtb24uY28udWspCisgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPG5ldC9heDI1Lmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRyb20uaD4KKworLyoKKyAqCVRoaXMgaXMgd2hlcmUgYWxsIE5FVC9ST00gZnJhbWVzIHBhc3MsIGV4Y2VwdCBmb3IgSVAtb3Zlci1ORVQvUk9NIHdoaWNoCisgKgljYW5ub3QgYmUgZnJhZ21lbnRlZCBpbiB0aGlzIG1hbm5lci4KKyAqLwordm9pZCBucl9vdXRwdXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmICpza2JuOworCXVuc2lnbmVkIGNoYXIgdHJhbnNwb3J0W05SX1RSQU5TUE9SVF9MRU5dOworCWludCBlcnIsIGZyb250bGVuLCBsZW47CisKKwlpZiAoc2tiLT5sZW4gLSBOUl9UUkFOU1BPUlRfTEVOID4gTlJfTUFYX1BBQ0tFVF9TSVpFKSB7CisJCS8qIFNhdmUgYSBjb3B5IG9mIHRoZSBUcmFuc3BvcnQgSGVhZGVyICovCisJCW1lbWNweSh0cmFuc3BvcnQsIHNrYi0+ZGF0YSwgTlJfVFJBTlNQT1JUX0xFTik7CisJCXNrYl9wdWxsKHNrYiwgTlJfVFJBTlNQT1JUX0xFTik7CisKKwkJZnJvbnRsZW4gPSBza2JfaGVhZHJvb20oc2tiKTsKKworCQl3aGlsZSAoc2tiLT5sZW4gPiAwKSB7CisJCQlpZiAoKHNrYm4gPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCBmcm9udGxlbiArIE5SX01BWF9QQUNLRVRfU0laRSwgMCwgJmVycikpID09IE5VTEwpCisJCQkJcmV0dXJuOworCisJCQlza2JfcmVzZXJ2ZShza2JuLCBmcm9udGxlbik7CisKKwkJCWxlbiA9IChOUl9NQVhfUEFDS0VUX1NJWkUgPiBza2ItPmxlbikgPyBza2ItPmxlbiA6IE5SX01BWF9QQUNLRVRfU0laRTsKKworCQkJLyogQ29weSB0aGUgdXNlciBkYXRhICovCisJCQltZW1jcHkoc2tiX3B1dChza2JuLCBsZW4pLCBza2ItPmRhdGEsIGxlbik7CisJCQlza2JfcHVsbChza2IsIGxlbik7CisKKwkJCS8qIER1cGxpY2F0ZSB0aGUgVHJhbnNwb3J0IEhlYWRlciAqLworCQkJc2tiX3B1c2goc2tibiwgTlJfVFJBTlNQT1JUX0xFTik7CisJCQltZW1jcHkoc2tibi0+ZGF0YSwgdHJhbnNwb3J0LCBOUl9UUkFOU1BPUlRfTEVOKTsKKworCQkJaWYgKHNrYi0+bGVuID4gMCkKKwkJCQlza2JuLT5kYXRhWzRdIHw9IE5SX01PUkVfRkxBRzsKKworCQkJc2tiX3F1ZXVlX3RhaWwoJnNrLT5za193cml0ZV9xdWV1ZSwgc2tibik7IC8qIFRocm93IGl0IG9uIHRoZSBxdWV1ZSAqLworCQl9CisKKwkJa2ZyZWVfc2tiKHNrYik7CisJfSBlbHNlIHsKKwkJc2tiX3F1ZXVlX3RhaWwoJnNrLT5za193cml0ZV9xdWV1ZSwgc2tiKTsJCS8qIFRocm93IGl0IG9uIHRoZSBxdWV1ZSAqLworCX0KKworCW5yX2tpY2soc2spOworfQorCisvKgorICoJVGhpcyBwcm9jZWR1cmUgaXMgcGFzc2VkIGEgYnVmZmVyIGRlc2NyaXB0b3IgZm9yIGFuIGlmcmFtZS4gSXQgYnVpbGRzCisgKgl0aGUgcmVzdCBvZiB0aGUgY29udHJvbCBwYXJ0IG9mIHRoZSBmcmFtZSBhbmQgdGhlbiB3cml0ZXMgaXQgb3V0LgorICovCitzdGF0aWMgdm9pZCBucl9zZW5kX2lmcmFtZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5yX3NvY2sgKm5yID0gbnJfc2soc2spOworCisJaWYgKHNrYiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlza2ItPmRhdGFbMl0gPSBuci0+dnM7CisJc2tiLT5kYXRhWzNdID0gbnItPnZyOworCisJaWYgKG5yLT5jb25kaXRpb24gJiBOUl9DT05EX09XTl9SWF9CVVNZKQorCQlza2ItPmRhdGFbNF0gfD0gTlJfQ0hPS0VfRkxBRzsKKworCW5yX3N0YXJ0X2lkbGV0aW1lcihzayk7CisKKwlucl90cmFuc21pdF9idWZmZXIoc2ssIHNrYik7Cit9CisKK3ZvaWQgbnJfc2VuZF9uYWtfZnJhbWUoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBza19idWZmICpza2IsICpza2JuOworCXN0cnVjdCBucl9zb2NrICpuciA9IG5yX3NrKHNrKTsKKworCWlmICgoc2tiID0gc2tiX3BlZWsoJm5yLT5hY2tfcXVldWUpKSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoKHNrYm4gPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc2tibi0+ZGF0YVsyXSA9IG5yLT52YTsKKwlza2JuLT5kYXRhWzNdID0gbnItPnZyOworCisJaWYgKG5yLT5jb25kaXRpb24gJiBOUl9DT05EX09XTl9SWF9CVVNZKQorCQlza2JuLT5kYXRhWzRdIHw9IE5SX0NIT0tFX0ZMQUc7CisKKwlucl90cmFuc21pdF9idWZmZXIoc2ssIHNrYm4pOworCisJbnItPmNvbmRpdGlvbiAmPSB+TlJfQ09ORF9BQ0tfUEVORElORzsKKwluci0+dmwgICAgICAgICA9IG5yLT52cjsKKworCW5yX3N0b3BfdDF0aW1lcihzayk7Cit9CisKK3ZvaWQgbnJfa2ljayhzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IG5yX3NvY2sgKm5yID0gbnJfc2soc2spOworCXN0cnVjdCBza19idWZmICpza2IsICpza2JuOworCXVuc2lnbmVkIHNob3J0IHN0YXJ0LCBlbmQ7CisKKwlpZiAobnItPnN0YXRlICE9IE5SX1NUQVRFXzMpCisJCXJldHVybjsKKworCWlmIChuci0+Y29uZGl0aW9uICYgTlJfQ09ORF9QRUVSX1JYX0JVU1kpCisJCXJldHVybjsKKworCWlmICghc2tiX3BlZWsoJnNrLT5za193cml0ZV9xdWV1ZSkpCisJCXJldHVybjsKKworCXN0YXJ0ID0gKHNrYl9wZWVrKCZuci0+YWNrX3F1ZXVlKSA9PSBOVUxMKSA/IG5yLT52YSA6IG5yLT52czsKKwllbmQgICA9IChuci0+dmEgKyBuci0+d2luZG93KSAlIE5SX01PRFVMVVM7CisKKwlpZiAoc3RhcnQgPT0gZW5kKQorCQlyZXR1cm47CisKKwluci0+dnMgPSBzdGFydDsKKworCS8qCisJICogVHJhbnNtaXQgZGF0YSB1bnRpbCBlaXRoZXIgd2UncmUgb3V0IG9mIGRhdGEgdG8gc2VuZCBvcgorCSAqIHRoZSB3aW5kb3cgaXMgZnVsbC4KKwkgKi8KKworCS8qCisJICogRGVxdWV1ZSB0aGUgZnJhbWUgYW5kIGNvcHkgaXQuCisJICovCisJc2tiID0gc2tiX2RlcXVldWUoJnNrLT5za193cml0ZV9xdWV1ZSk7CisKKwlkbyB7CisJCWlmICgoc2tibiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCQlza2JfcXVldWVfaGVhZCgmc2stPnNrX3dyaXRlX3F1ZXVlLCBza2IpOworCQkJYnJlYWs7CisJCX0KKworCQlza2Jfc2V0X293bmVyX3coc2tibiwgc2spOworCisJCS8qCisJCSAqIFRyYW5zbWl0IHRoZSBmcmFtZSBjb3B5LgorCQkgKi8KKwkJbnJfc2VuZF9pZnJhbWUoc2ssIHNrYm4pOworCisJCW5yLT52cyA9IChuci0+dnMgKyAxKSAlIE5SX01PRFVMVVM7CisKKwkJLyoKKwkJICogUmVxdWV1ZSB0aGUgb3JpZ2luYWwgZGF0YSBmcmFtZS4KKwkJICovCisJCXNrYl9xdWV1ZV90YWlsKCZuci0+YWNrX3F1ZXVlLCBza2IpOworCisJfSB3aGlsZSAobnItPnZzICE9IGVuZCAmJgorCQkgKHNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfd3JpdGVfcXVldWUpKSAhPSBOVUxMKTsKKworCW5yLT52bCAgICAgICAgID0gbnItPnZyOworCW5yLT5jb25kaXRpb24gJj0gfk5SX0NPTkRfQUNLX1BFTkRJTkc7CisKKwlpZiAoIW5yX3QxdGltZXJfcnVubmluZyhzaykpCisJCW5yX3N0YXJ0X3QxdGltZXIoc2spOworfQorCit2b2lkIG5yX3RyYW5zbWl0X2J1ZmZlcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5yX3NvY2sgKm5yID0gbnJfc2soc2spOworCXVuc2lnbmVkIGNoYXIgKmRwdHI7CisKKwkvKgorCSAqCUFkZCB0aGUgcHJvdG9jb2wgYnl0ZSBhbmQgbmV0d29yayBoZWFkZXIuCisJICovCisJZHB0ciA9IHNrYl9wdXNoKHNrYiwgTlJfTkVUV09SS19MRU4pOworCisJbWVtY3B5KGRwdHIsICZuci0+c291cmNlX2FkZHIsIEFYMjVfQUREUl9MRU4pOworCWRwdHJbNl0gJj0gfkFYMjVfQ0JJVDsKKwlkcHRyWzZdICY9IH5BWDI1X0VCSVQ7CisJZHB0cls2XSB8PSBBWDI1X1NTU0lEX1NQQVJFOworCWRwdHIgKz0gQVgyNV9BRERSX0xFTjsKKworCW1lbWNweShkcHRyLCAmbnItPmRlc3RfYWRkciwgQVgyNV9BRERSX0xFTik7CisJZHB0cls2XSAmPSB+QVgyNV9DQklUOworCWRwdHJbNl0gfD0gQVgyNV9FQklUOworCWRwdHJbNl0gfD0gQVgyNV9TU1NJRF9TUEFSRTsKKwlkcHRyICs9IEFYMjVfQUREUl9MRU47CisKKwkqZHB0cisrID0gc3lzY3RsX25ldHJvbV9uZXR3b3JrX3R0bF9pbml0aWFsaXNlcjsKKworCWlmICghbnJfcm91dGVfZnJhbWUoc2tiLCBOVUxMKSkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJbnJfZGlzY29ubmVjdChzaywgRU5FVFVOUkVBQ0gpOworCX0KK30KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYXJlIHRha2VuIGZyb20gcGFnZSAxNzAgb2YgdGhlIDd0aCBBUlJMIENvbXB1dGVyCisgKiBOZXR3b3JraW5nIENvbmZlcmVuY2UgcGFwZXIsIGFzIGlzIHRoZSB3aG9sZSBzdGF0ZSBtYWNoaW5lLgorICovCisKK3ZvaWQgbnJfZXN0YWJsaXNoX2RhdGFfbGluayhzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IG5yX3NvY2sgKm5yID0gbnJfc2soc2spOworCisJbnItPmNvbmRpdGlvbiA9IDB4MDA7CisJbnItPm4yY291bnQgICA9IDA7CisKKwlucl93cml0ZV9pbnRlcm5hbChzaywgTlJfQ09OTlJFUSk7CisKKwlucl9zdG9wX3QydGltZXIoc2spOworCW5yX3N0b3BfdDR0aW1lcihzayk7CisJbnJfc3RvcF9pZGxldGltZXIoc2spOworCW5yX3N0YXJ0X3QxdGltZXIoc2spOworfQorCisvKgorICogTmV2ZXIgc2VuZCBhIE5BSyB3aGVuIHdlIGFyZSBDSE9LRWQuCisgKi8KK3ZvaWQgbnJfZW5xdWlyeV9yZXNwb25zZShzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IG5yX3NvY2sgKm5yID0gbnJfc2soc2spOworCWludCBmcmFtZXR5cGUgPSBOUl9JTkZPQUNLOworCisJaWYgKG5yLT5jb25kaXRpb24gJiBOUl9DT05EX09XTl9SWF9CVVNZKSB7CisJCWZyYW1ldHlwZSB8PSBOUl9DSE9LRV9GTEFHOworCX0gZWxzZSB7CisJCWlmIChza2JfcGVlaygmbnItPnJlc2VxX3F1ZXVlKSAhPSBOVUxMKQorCQkJZnJhbWV0eXBlIHw9IE5SX05BS19GTEFHOworCX0KKworCW5yX3dyaXRlX2ludGVybmFsKHNrLCBmcmFtZXR5cGUpOworCisJbnItPnZsICAgICAgICAgPSBuci0+dnI7CisJbnItPmNvbmRpdGlvbiAmPSB+TlJfQ09ORF9BQ0tfUEVORElORzsKK30KKwordm9pZCBucl9jaGVja19pZnJhbWVzX2Fja2VkKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgc2hvcnQgbnIpCit7CisJc3RydWN0IG5yX3NvY2sgKm5yb20gPSBucl9zayhzayk7CisKKwlpZiAobnJvbS0+dnMgPT0gbnIpIHsKKwkJbnJfZnJhbWVzX2Fja2VkKHNrLCBucik7CisJCW5yX3N0b3BfdDF0aW1lcihzayk7CisJCW5yb20tPm4yY291bnQgPSAwOworCX0gZWxzZSB7CisJCWlmIChucm9tLT52YSAhPSBucikgeworCQkJbnJfZnJhbWVzX2Fja2VkKHNrLCBucik7CisJCQlucl9zdGFydF90MXRpbWVyKHNrKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL25ldC9uZXRyb20vbnJfcm91dGUuYyBiL25ldC9uZXRyb20vbnJfcm91dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTg2YjM2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldHJvbS9ucl9yb3V0ZS5jCkBAIC0wLDAgKzEsMTA0MSBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQ29weXJpZ2h0IEpvbmF0aGFuIE5heWxvciBHNEtMWCAoZzRrbHhAZzRrbHguZGVtb24uY28udWspCisgKiBDb3B5cmlnaHQgQWxhbiBDb3ggR1c0UFRTIChhbGFuQGx4b3JndWsudWt1dS5vcmcudWspCisgKiBDb3B5cmlnaHQgVG9taSBNYW5uaW5lbiBPSDJCTlMgKG9oMmJuc0BzcmFsLmZpKQorICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxuZXQvYXgyNS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4JLyogRm9yIFRJT0NJTlEvT1VUUSAqLworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxuZXQvbmV0cm9tLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworc3RhdGljIHVuc2lnbmVkIGludCBucl9uZWlnaF9ubyA9IDE7CisKK3N0YXRpYyBITElTVF9IRUFEKG5yX25vZGVfbGlzdCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG5yX25vZGVfbGlzdF9sb2NrKTsKK3N0YXRpYyBITElTVF9IRUFEKG5yX25laWdoX2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhucl9uZWlnaF9saXN0X2xvY2spOworCitzdGF0aWMgc3RydWN0IG5yX25vZGUgKm5yX25vZGVfZ2V0KGF4MjVfYWRkcmVzcyAqY2FsbHNpZ24pCit7CisJc3RydWN0IG5yX25vZGUgKmZvdW5kID0gTlVMTDsKKwlzdHJ1Y3QgbnJfbm9kZSAqbnJfbm9kZTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCXNwaW5fbG9ja19iaCgmbnJfbm9kZV9saXN0X2xvY2spOworCW5yX25vZGVfZm9yX2VhY2gobnJfbm9kZSwgbm9kZSwgJm5yX25vZGVfbGlzdCkKKwkJaWYgKGF4MjVjbXAoY2FsbHNpZ24sICZucl9ub2RlLT5jYWxsc2lnbikgPT0gMCkgeworCQkJbnJfbm9kZV9ob2xkKG5yX25vZGUpOworCQkJZm91bmQgPSBucl9ub2RlOworCQkJYnJlYWs7CisJCX0KKwlzcGluX3VubG9ja19iaCgmbnJfbm9kZV9saXN0X2xvY2spOworCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIHN0cnVjdCBucl9uZWlnaCAqbnJfbmVpZ2hfZ2V0X2RldihheDI1X2FkZHJlc3MgKmNhbGxzaWduLAorCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbnJfbmVpZ2ggKmZvdW5kID0gTlVMTDsKKwlzdHJ1Y3QgbnJfbmVpZ2ggKm5yX25laWdoOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJc3Bpbl9sb2NrX2JoKCZucl9uZWlnaF9saXN0X2xvY2spOworCW5yX25laWdoX2Zvcl9lYWNoKG5yX25laWdoLCBub2RlLCAmbnJfbmVpZ2hfbGlzdCkKKwkJaWYgKGF4MjVjbXAoY2FsbHNpZ24sICZucl9uZWlnaC0+Y2FsbHNpZ24pID09IDAgJiYKKwkJICAgIG5yX25laWdoLT5kZXYgPT0gZGV2KSB7CisJCQlucl9uZWlnaF9ob2xkKG5yX25laWdoKTsKKwkJCWZvdW5kID0gbnJfbmVpZ2g7CisJCQlicmVhazsKKwkJfQorCXNwaW5fdW5sb2NrX2JoKCZucl9uZWlnaF9saXN0X2xvY2spOworCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIHZvaWQgbnJfcmVtb3ZlX25laWdoKHN0cnVjdCBucl9uZWlnaCAqKTsKKworLyoKKyAqCUFkZCBhIG5ldyByb3V0ZSB0byBhIG5vZGUsIGFuZCBpbiB0aGUgcHJvY2VzcyBhZGQgdGhlIG5vZGUgYW5kIHRoZQorICoJbmVpZ2hib3VyIGlmIGl0IGlzIG5ldy4KKyAqLworc3RhdGljIGludCBucl9hZGRfbm9kZShheDI1X2FkZHJlc3MgKm5yLCBjb25zdCBjaGFyICptbmVtb25pYywgYXgyNV9hZGRyZXNzICpheDI1LAorCWF4MjVfZGlnaSAqYXgyNV9kaWdpLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcXVhbGl0eSwgaW50IG9ic19jb3VudCkKK3sKKwlzdHJ1Y3QgbnJfbm9kZSAgKm5yX25vZGU7CisJc3RydWN0IG5yX25laWdoICpucl9uZWlnaDsKKwlzdHJ1Y3QgbnJfcm91dGUgbnJfcm91dGU7CisJaW50IGksIGZvdW5kOworCXN0cnVjdCBuZXRfZGV2aWNlICpvZGV2OworCisJaWYgKChvZGV2PW5yX2Rldl9nZXQobnIpKSAhPSBOVUxMKSB7CS8qIENhbid0IGFkZCByb3V0ZXMgdG8gb3Vyc2VsZiAqLworCQlkZXZfcHV0KG9kZXYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlucl9ub2RlID0gbnJfbm9kZV9nZXQobnIpOworCisJbnJfbmVpZ2ggPSBucl9uZWlnaF9nZXRfZGV2KGF4MjUsIGRldik7CisKKwkvKgorCSAqIFRoZSBMMiBsaW5rIHRvIGEgbmVpZ2hib3VyIGhhcyBmYWlsZWQgaW4gdGhlIHBhc3QKKwkgKiBhbmQgbm93IGEgZnJhbWUgY29tZXMgZnJvbSB0aGlzIG5laWdoYm91ci4gV2UgYXNzdW1lCisJICogaXQgd2FzIGEgdGVtcG9yYXJ5IHRyb3VibGUgd2l0aCB0aGUgbGluayBhbmQgcmVzZXQgdGhlCisJICogcm91dGVzIG5vdyAoYW5kIG5vdCB3YWl0IGZvciBhIG5vZGUgYnJvYWRjYXN0KS4KKwkgKi8KKwlpZiAobnJfbmVpZ2ggIT0gTlVMTCAmJiBucl9uZWlnaC0+ZmFpbGVkICE9IDAgJiYgcXVhbGl0eSA9PSAwKSB7CisJCXN0cnVjdCBucl9ub2RlICpucl9ub2RldDsKKwkJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisKKwkJc3Bpbl9sb2NrX2JoKCZucl9ub2RlX2xpc3RfbG9jayk7CisJCW5yX25vZGVfZm9yX2VhY2gobnJfbm9kZXQsIG5vZGUsICZucl9ub2RlX2xpc3QpIHsKKwkJCW5yX25vZGVfbG9jayhucl9ub2RldCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgbnJfbm9kZXQtPmNvdW50OyBpKyspCisJCQkJaWYgKG5yX25vZGV0LT5yb3V0ZXNbaV0ubmVpZ2hib3VyID09IG5yX25laWdoKQorCQkJCQlpZiAoaSA8IG5yX25vZGV0LT53aGljaCkKKwkJCQkJCW5yX25vZGV0LT53aGljaCA9IGk7CisJCQlucl9ub2RlX3VubG9jayhucl9ub2RldCk7CisJCX0KKwkJc3Bpbl91bmxvY2tfYmgoJm5yX25vZGVfbGlzdF9sb2NrKTsKKwl9CisKKwlpZiAobnJfbmVpZ2ggIT0gTlVMTCkKKwkJbnJfbmVpZ2gtPmZhaWxlZCA9IDA7CisKKwlpZiAocXVhbGl0eSA9PSAwICYmIG5yX25laWdoICE9IE5VTEwgJiYgbnJfbm9kZSAhPSBOVUxMKSB7CisJCW5yX25laWdoX3B1dChucl9uZWlnaCk7CisJCW5yX25vZGVfcHV0KG5yX25vZGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobnJfbmVpZ2ggPT0gTlVMTCkgeworCQlpZiAoKG5yX25laWdoID0ga21hbGxvYyhzaXplb2YoKm5yX25laWdoKSwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwkJCWlmIChucl9ub2RlKQorCQkJCW5yX25vZGVfcHV0KG5yX25vZGUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlucl9uZWlnaC0+Y2FsbHNpZ24gPSAqYXgyNTsKKwkJbnJfbmVpZ2gtPmRpZ2lwZWF0ID0gTlVMTDsKKwkJbnJfbmVpZ2gtPmF4MjUgICAgID0gTlVMTDsKKwkJbnJfbmVpZ2gtPmRldiAgICAgID0gZGV2OworCQlucl9uZWlnaC0+cXVhbGl0eSAgPSBzeXNjdGxfbmV0cm9tX2RlZmF1bHRfcGF0aF9xdWFsaXR5OworCQlucl9uZWlnaC0+bG9ja2VkICAgPSAwOworCQlucl9uZWlnaC0+Y291bnQgICAgPSAwOworCQlucl9uZWlnaC0+bnVtYmVyICAgPSBucl9uZWlnaF9ubysrOworCQlucl9uZWlnaC0+ZmFpbGVkICAgPSAwOworCQlhdG9taWNfc2V0KCZucl9uZWlnaC0+cmVmY291bnQsIDEpOworCisJCWlmIChheDI1X2RpZ2kgIT0gTlVMTCAmJiBheDI1X2RpZ2ktPm5kaWdpID4gMCkgeworCQkJaWYgKChucl9uZWlnaC0+ZGlnaXBlYXQgPSBrbWFsbG9jKHNpemVvZigqYXgyNV9kaWdpKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJCQlrZnJlZShucl9uZWlnaCk7CisJCQkJaWYgKG5yX25vZGUpCisJCQkJCW5yX25vZGVfcHV0KG5yX25vZGUpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJbWVtY3B5KG5yX25laWdoLT5kaWdpcGVhdCwgYXgyNV9kaWdpLAorCQkJCQlzaXplb2YoKmF4MjVfZGlnaSkpOworCQl9CisKKwkJc3Bpbl9sb2NrX2JoKCZucl9uZWlnaF9saXN0X2xvY2spOworCQlobGlzdF9hZGRfaGVhZCgmbnJfbmVpZ2gtPm5laWdoX25vZGUsICZucl9uZWlnaF9saXN0KTsKKwkJbnJfbmVpZ2hfaG9sZChucl9uZWlnaCk7CisJCXNwaW5fdW5sb2NrX2JoKCZucl9uZWlnaF9saXN0X2xvY2spOworCX0KKworCWlmIChxdWFsaXR5ICE9IDAgJiYgYXgyNWNtcChuciwgYXgyNSkgPT0gMCAmJiAhbnJfbmVpZ2gtPmxvY2tlZCkKKwkJbnJfbmVpZ2gtPnF1YWxpdHkgPSBxdWFsaXR5OworCisJaWYgKG5yX25vZGUgPT0gTlVMTCkgeworCQlpZiAoKG5yX25vZGUgPSBrbWFsbG9jKHNpemVvZigqbnJfbm9kZSksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCQlpZiAobnJfbmVpZ2gpCisJCQkJbnJfbmVpZ2hfcHV0KG5yX25laWdoKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJbnJfbm9kZS0+Y2FsbHNpZ24gPSAqbnI7CisJCXN0cmNweShucl9ub2RlLT5tbmVtb25pYywgbW5lbW9uaWMpOworCisJCW5yX25vZGUtPndoaWNoID0gMDsKKwkJbnJfbm9kZS0+Y291bnQgPSAxOworCQlhdG9taWNfc2V0KCZucl9ub2RlLT5yZWZjb3VudCwgMSk7CisJCXNwaW5fbG9ja19pbml0KCZucl9ub2RlLT5ub2RlX2xvY2spOworCisJCW5yX25vZGUtPnJvdXRlc1swXS5xdWFsaXR5ICAgPSBxdWFsaXR5OworCQlucl9ub2RlLT5yb3V0ZXNbMF0ub2JzX2NvdW50ID0gb2JzX2NvdW50OworCQlucl9ub2RlLT5yb3V0ZXNbMF0ubmVpZ2hib3VyID0gbnJfbmVpZ2g7CisKKwkJbnJfbmVpZ2hfaG9sZChucl9uZWlnaCk7CisJCW5yX25laWdoLT5jb3VudCsrOworCisJCXNwaW5fbG9ja19iaCgmbnJfbm9kZV9saXN0X2xvY2spOworCQlobGlzdF9hZGRfaGVhZCgmbnJfbm9kZS0+bm9kZV9ub2RlLCAmbnJfbm9kZV9saXN0KTsKKwkJLyogcmVmY291bnQgaW5pdGlhbGl6ZWQgYXQgMSAqLworCQlzcGluX3VubG9ja19iaCgmbnJfbm9kZV9saXN0X2xvY2spOworCisJCXJldHVybiAwOworCX0KKwlucl9ub2RlX2xvY2sobnJfbm9kZSk7CisKKwlpZiAocXVhbGl0eSAhPSAwKQorCQlzdHJjcHkobnJfbm9kZS0+bW5lbW9uaWMsIG1uZW1vbmljKTsKKworCWZvciAoZm91bmQgPSAwLCBpID0gMDsgaSA8IG5yX25vZGUtPmNvdW50OyBpKyspIHsKKwkJaWYgKG5yX25vZGUtPnJvdXRlc1tpXS5uZWlnaGJvdXIgPT0gbnJfbmVpZ2gpIHsKKwkJCW5yX25vZGUtPnJvdXRlc1tpXS5xdWFsaXR5ICAgPSBxdWFsaXR5OworCQkJbnJfbm9kZS0+cm91dGVzW2ldLm9ic19jb3VudCA9IG9ic19jb3VudDsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFmb3VuZCkgeworCQkvKiBXZSBoYXZlIHNwYWNlIGF0IHRoZSBib3R0b20sIHNsb3QgaXQgaW4gKi8KKwkJaWYgKG5yX25vZGUtPmNvdW50IDwgMykgeworCQkJbnJfbm9kZS0+cm91dGVzWzJdID0gbnJfbm9kZS0+cm91dGVzWzFdOworCQkJbnJfbm9kZS0+cm91dGVzWzFdID0gbnJfbm9kZS0+cm91dGVzWzBdOworCisJCQlucl9ub2RlLT5yb3V0ZXNbMF0ucXVhbGl0eSAgID0gcXVhbGl0eTsKKwkJCW5yX25vZGUtPnJvdXRlc1swXS5vYnNfY291bnQgPSBvYnNfY291bnQ7CisJCQlucl9ub2RlLT5yb3V0ZXNbMF0ubmVpZ2hib3VyID0gbnJfbmVpZ2g7CisKKwkJCW5yX25vZGUtPndoaWNoKys7CisJCQlucl9ub2RlLT5jb3VudCsrOworCQkJbnJfbmVpZ2hfaG9sZChucl9uZWlnaCk7CisJCQlucl9uZWlnaC0+Y291bnQrKzsKKwkJfSBlbHNlIHsKKwkJCS8qIEl0IG11c3QgYmUgYmV0dGVyIHRoYW4gdGhlIHdvcnN0ICovCisJCQlpZiAocXVhbGl0eSA+IG5yX25vZGUtPnJvdXRlc1syXS5xdWFsaXR5KSB7CisJCQkJbnJfbm9kZS0+cm91dGVzWzJdLm5laWdoYm91ci0+Y291bnQtLTsKKwkJCQlucl9uZWlnaF9wdXQobnJfbm9kZS0+cm91dGVzWzJdLm5laWdoYm91cik7CisKKwkJCQlpZiAobnJfbm9kZS0+cm91dGVzWzJdLm5laWdoYm91ci0+Y291bnQgPT0gMCAmJiAhbnJfbm9kZS0+cm91dGVzWzJdLm5laWdoYm91ci0+bG9ja2VkKQorCQkJCQlucl9yZW1vdmVfbmVpZ2gobnJfbm9kZS0+cm91dGVzWzJdLm5laWdoYm91cik7CisKKwkJCQlucl9ub2RlLT5yb3V0ZXNbMl0ucXVhbGl0eSAgID0gcXVhbGl0eTsKKwkJCQlucl9ub2RlLT5yb3V0ZXNbMl0ub2JzX2NvdW50ID0gb2JzX2NvdW50OworCQkJCW5yX25vZGUtPnJvdXRlc1syXS5uZWlnaGJvdXIgPSBucl9uZWlnaDsKKworCQkJCW5yX25laWdoX2hvbGQobnJfbmVpZ2gpOworCQkJCW5yX25laWdoLT5jb3VudCsrOworCQkJfQorCQl9CisJfQorCisJLyogTm93IHJlLXNvcnQgdGhlIHJvdXRlcyBpbiBxdWFsaXR5IG9yZGVyICovCisJc3dpdGNoIChucl9ub2RlLT5jb3VudCkgeworCWNhc2UgMzoKKwkJaWYgKG5yX25vZGUtPnJvdXRlc1sxXS5xdWFsaXR5ID4gbnJfbm9kZS0+cm91dGVzWzBdLnF1YWxpdHkpIHsKKwkJCXN3aXRjaCAobnJfbm9kZS0+d2hpY2gpIHsKKwkJCQljYXNlIDA6ICBucl9ub2RlLT53aGljaCA9IDE7IGJyZWFrOworCQkJCWNhc2UgMTogIG5yX25vZGUtPndoaWNoID0gMDsgYnJlYWs7CisJCQkJZGVmYXVsdDogYnJlYWs7CisJCQl9CisJCQlucl9yb3V0ZSAgICAgICAgICAgPSBucl9ub2RlLT5yb3V0ZXNbMF07CisJCQlucl9ub2RlLT5yb3V0ZXNbMF0gPSBucl9ub2RlLT5yb3V0ZXNbMV07CisJCQlucl9ub2RlLT5yb3V0ZXNbMV0gPSBucl9yb3V0ZTsKKwkJfQorCQlpZiAobnJfbm9kZS0+cm91dGVzWzJdLnF1YWxpdHkgPiBucl9ub2RlLT5yb3V0ZXNbMV0ucXVhbGl0eSkgeworCQkJc3dpdGNoIChucl9ub2RlLT53aGljaCkgeworCQkJY2FzZSAxOiAgbnJfbm9kZS0+d2hpY2ggPSAyOworCQkJCWJyZWFrOworCisJCQljYXNlIDI6ICBucl9ub2RlLT53aGljaCA9IDE7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQlucl9yb3V0ZSAgICAgICAgICAgPSBucl9ub2RlLT5yb3V0ZXNbMV07CisJCQlucl9ub2RlLT5yb3V0ZXNbMV0gPSBucl9ub2RlLT5yb3V0ZXNbMl07CisJCQlucl9ub2RlLT5yb3V0ZXNbMl0gPSBucl9yb3V0ZTsKKwkJfQorCWNhc2UgMjoKKwkJaWYgKG5yX25vZGUtPnJvdXRlc1sxXS5xdWFsaXR5ID4gbnJfbm9kZS0+cm91dGVzWzBdLnF1YWxpdHkpIHsKKwkJCXN3aXRjaCAobnJfbm9kZS0+d2hpY2gpIHsKKwkJCWNhc2UgMDogIG5yX25vZGUtPndoaWNoID0gMTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAxOiAgbnJfbm9kZS0+d2hpY2ggPSAwOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OiBicmVhazsKKwkJCX0KKwkJCW5yX3JvdXRlICAgICAgICAgICA9IG5yX25vZGUtPnJvdXRlc1swXTsKKwkJCW5yX25vZGUtPnJvdXRlc1swXSA9IG5yX25vZGUtPnJvdXRlc1sxXTsKKwkJCW5yX25vZGUtPnJvdXRlc1sxXSA9IG5yX3JvdXRlOworCQkJfQorCWNhc2UgMToKKwkJYnJlYWs7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5yX25vZGUtPmNvdW50OyBpKyspIHsKKwkJaWYgKG5yX25vZGUtPnJvdXRlc1tpXS5uZWlnaGJvdXIgPT0gbnJfbmVpZ2gpIHsKKwkJCWlmIChpIDwgbnJfbm9kZS0+d2hpY2gpCisJCQkJbnJfbm9kZS0+d2hpY2ggPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlucl9uZWlnaF9wdXQobnJfbmVpZ2gpOworCW5yX25vZGVfdW5sb2NrKG5yX25vZGUpOworCW5yX25vZGVfcHV0KG5yX25vZGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19ucl9yZW1vdmVfbm9kZShzdHJ1Y3QgbnJfbm9kZSAqbnJfbm9kZSkKK3sKKwlobGlzdF9kZWxfaW5pdCgmbnJfbm9kZS0+bm9kZV9ub2RlKTsKKwlucl9ub2RlX3B1dChucl9ub2RlKTsKK30KKworI2RlZmluZSBucl9yZW1vdmVfbm9kZV9sb2NrZWQoX19ub2RlKSBcCisJX19ucl9yZW1vdmVfbm9kZShfX25vZGUpCisKK3N0YXRpYyB2b2lkIG5yX3JlbW92ZV9ub2RlKHN0cnVjdCBucl9ub2RlICpucl9ub2RlKQoreworCXNwaW5fbG9ja19iaCgmbnJfbm9kZV9saXN0X2xvY2spOworCV9fbnJfcmVtb3ZlX25vZGUobnJfbm9kZSk7CisJc3Bpbl91bmxvY2tfYmgoJm5yX25vZGVfbGlzdF9sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fbnJfcmVtb3ZlX25laWdoKHN0cnVjdCBucl9uZWlnaCAqbnJfbmVpZ2gpCit7CisJaGxpc3RfZGVsX2luaXQoJm5yX25laWdoLT5uZWlnaF9ub2RlKTsKKwlucl9uZWlnaF9wdXQobnJfbmVpZ2gpOworfQorCisjZGVmaW5lIG5yX3JlbW92ZV9uZWlnaF9sb2NrZWQoX19uZWlnaCkgXAorCV9fbnJfcmVtb3ZlX25laWdoKF9fbmVpZ2gpCisKK3N0YXRpYyB2b2lkIG5yX3JlbW92ZV9uZWlnaChzdHJ1Y3QgbnJfbmVpZ2ggKm5yX25laWdoKQoreworCXNwaW5fbG9ja19iaCgmbnJfbmVpZ2hfbGlzdF9sb2NrKTsKKwlfX25yX3JlbW92ZV9uZWlnaChucl9uZWlnaCk7CisJc3Bpbl91bmxvY2tfYmgoJm5yX25laWdoX2xpc3RfbG9jayk7Cit9CisKKy8qCisgKgkiRGVsZXRlIiBhIG5vZGUuIFN0cmljdGx5IHNwZWFraW5nIHJlbW92ZSBhIHJvdXRlIHRvIGEgbm9kZS4gVGhlIG5vZGUKKyAqCWlzIG9ubHkgZGVsZXRlZCBpZiBubyByb3V0ZXMgYXJlIGxlZnQgdG8gaXQuCisgKi8KK3N0YXRpYyBpbnQgbnJfZGVsX25vZGUoYXgyNV9hZGRyZXNzICpjYWxsc2lnbiwgYXgyNV9hZGRyZXNzICpuZWlnaGJvdXIsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5yX25vZGUgICpucl9ub2RlOworCXN0cnVjdCBucl9uZWlnaCAqbnJfbmVpZ2g7CisJaW50IGk7CisKKwlucl9ub2RlID0gbnJfbm9kZV9nZXQoY2FsbHNpZ24pOworCisJaWYgKG5yX25vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlucl9uZWlnaCA9IG5yX25laWdoX2dldF9kZXYobmVpZ2hib3VyLCBkZXYpOworCisJaWYgKG5yX25laWdoID09IE5VTEwpIHsKKwkJbnJfbm9kZV9wdXQobnJfbm9kZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW5yX25vZGVfbG9jayhucl9ub2RlKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnJfbm9kZS0+Y291bnQ7IGkrKykgeworCQlpZiAobnJfbm9kZS0+cm91dGVzW2ldLm5laWdoYm91ciA9PSBucl9uZWlnaCkgeworCQkJbnJfbmVpZ2gtPmNvdW50LS07CisJCQlucl9uZWlnaF9wdXQobnJfbmVpZ2gpOworCisJCQlpZiAobnJfbmVpZ2gtPmNvdW50ID09IDAgJiYgIW5yX25laWdoLT5sb2NrZWQpCisJCQkJbnJfcmVtb3ZlX25laWdoKG5yX25laWdoKTsKKwkJCW5yX25laWdoX3B1dChucl9uZWlnaCk7CisKKwkJCW5yX25vZGUtPmNvdW50LS07CisKKwkJCWlmIChucl9ub2RlLT5jb3VudCA9PSAwKSB7CisJCQkJbnJfcmVtb3ZlX25vZGUobnJfbm9kZSk7CisJCQl9IGVsc2UgeworCQkJCXN3aXRjaCAoaSkgeworCQkJCWNhc2UgMDoKKwkJCQkJbnJfbm9kZS0+cm91dGVzWzBdID0gbnJfbm9kZS0+cm91dGVzWzFdOworCQkJCWNhc2UgMToKKwkJCQkJbnJfbm9kZS0+cm91dGVzWzFdID0gbnJfbm9kZS0+cm91dGVzWzJdOworCQkJCWNhc2UgMjoKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCW5yX25vZGVfcHV0KG5yX25vZGUpOworCQkJfQorCQkJbnJfbm9kZV91bmxvY2sobnJfbm9kZSk7CisKKwkJCXJldHVybiAwOworCQl9CisJfQorCW5yX25laWdoX3B1dChucl9uZWlnaCk7CisJbnJfbm9kZV91bmxvY2sobnJfbm9kZSk7CisJbnJfbm9kZV9wdXQobnJfbm9kZSk7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyAqCUxvY2sgYSBuZWlnaGJvdXIgd2l0aCBhIHF1YWxpdHkuCisgKi8KK3N0YXRpYyBpbnQgbnJfYWRkX25laWdoKGF4MjVfYWRkcmVzcyAqY2FsbHNpZ24sIGF4MjVfZGlnaSAqYXgyNV9kaWdpLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcXVhbGl0eSkKK3sKKwlzdHJ1Y3QgbnJfbmVpZ2ggKm5yX25laWdoOworCisJbnJfbmVpZ2ggPSBucl9uZWlnaF9nZXRfZGV2KGNhbGxzaWduLCBkZXYpOworCWlmIChucl9uZWlnaCkgeworCQlucl9uZWlnaC0+cXVhbGl0eSA9IHF1YWxpdHk7CisJCW5yX25laWdoLT5sb2NrZWQgID0gMTsKKwkJbnJfbmVpZ2hfcHV0KG5yX25laWdoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChucl9uZWlnaCA9IGttYWxsb2Moc2l6ZW9mKCpucl9uZWlnaCksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5yX25laWdoLT5jYWxsc2lnbiA9ICpjYWxsc2lnbjsKKwlucl9uZWlnaC0+ZGlnaXBlYXQgPSBOVUxMOworCW5yX25laWdoLT5heDI1ICAgICA9IE5VTEw7CisJbnJfbmVpZ2gtPmRldiAgICAgID0gZGV2OworCW5yX25laWdoLT5xdWFsaXR5ICA9IHF1YWxpdHk7CisJbnJfbmVpZ2gtPmxvY2tlZCAgID0gMTsKKwlucl9uZWlnaC0+Y291bnQgICAgPSAwOworCW5yX25laWdoLT5udW1iZXIgICA9IG5yX25laWdoX25vKys7CisJbnJfbmVpZ2gtPmZhaWxlZCAgID0gMDsKKwlhdG9taWNfc2V0KCZucl9uZWlnaC0+cmVmY291bnQsIDEpOworCisJaWYgKGF4MjVfZGlnaSAhPSBOVUxMICYmIGF4MjVfZGlnaS0+bmRpZ2kgPiAwKSB7CisJCWlmICgobnJfbmVpZ2gtPmRpZ2lwZWF0ID0ga21hbGxvYyhzaXplb2YoKmF4MjVfZGlnaSksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCQlrZnJlZShucl9uZWlnaCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQltZW1jcHkobnJfbmVpZ2gtPmRpZ2lwZWF0LCBheDI1X2RpZ2ksIHNpemVvZigqYXgyNV9kaWdpKSk7CisJfQorCisJc3Bpbl9sb2NrX2JoKCZucl9uZWlnaF9saXN0X2xvY2spOworCWhsaXN0X2FkZF9oZWFkKCZucl9uZWlnaC0+bmVpZ2hfbm9kZSwgJm5yX25laWdoX2xpc3QpOworCS8qIHJlZmNvdW50IGlzIGluaXRpYWxpemVkIGF0IDEgKi8KKwlzcGluX3VubG9ja19iaCgmbnJfbmVpZ2hfbGlzdF9sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKgorICoJIkRlbGV0ZSIgYSBuZWlnaGJvdXIuIFRoZSBuZWlnaGJvdXIgaXMgb25seSByZW1vdmVkIGlmIHRoZSBudW1iZXIKKyAqCW9mIG5vZGVzIHRoYXQgbWF5IHVzZSBpdCBpcyB6ZXJvLgorICovCitzdGF0aWMgaW50IG5yX2RlbF9uZWlnaChheDI1X2FkZHJlc3MgKmNhbGxzaWduLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcXVhbGl0eSkKK3sKKwlzdHJ1Y3QgbnJfbmVpZ2ggKm5yX25laWdoOworCisJbnJfbmVpZ2ggPSBucl9uZWlnaF9nZXRfZGV2KGNhbGxzaWduLCBkZXYpOworCisJaWYgKG5yX25laWdoID09IE5VTEwpIHJldHVybiAtRUlOVkFMOworCisJbnJfbmVpZ2gtPnF1YWxpdHkgPSBxdWFsaXR5OworCW5yX25laWdoLT5sb2NrZWQgID0gMDsKKworCWlmIChucl9uZWlnaC0+Y291bnQgPT0gMCkKKwkJbnJfcmVtb3ZlX25laWdoKG5yX25laWdoKTsKKwlucl9uZWlnaF9wdXQobnJfbmVpZ2gpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglEZWNyZW1lbnQgdGhlIG9ic29sZXNjZW5jZSBjb3VudCBieSBvbmUuIElmIGEgcm91dGUgaXMgcmVkdWNlZCB0byBhCisgKgljb3VudCBvZiB6ZXJvLCByZW1vdmUgaXQuIEFsc28gcmVtb3ZlIGFueSB1bmxvY2tlZCBuZWlnaGJvdXJzIHdpdGgKKyAqCXplcm8gbm9kZXMgcm91dGluZyB2aWEgaXQuCisgKi8KK3N0YXRpYyBpbnQgbnJfZGVjX29icyh2b2lkKQoreworCXN0cnVjdCBucl9uZWlnaCAqbnJfbmVpZ2g7CisJc3RydWN0IG5yX25vZGUgICpzOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqbm9kZXQ7CisJaW50IGk7CisKKwlzcGluX2xvY2tfYmgoJm5yX25vZGVfbGlzdF9sb2NrKTsKKwlucl9ub2RlX2Zvcl9lYWNoX3NhZmUocywgbm9kZSwgbm9kZXQsICZucl9ub2RlX2xpc3QpIHsKKwkJbnJfbm9kZV9sb2NrKHMpOworCQlmb3IgKGkgPSAwOyBpIDwgcy0+Y291bnQ7IGkrKykgeworCQkJc3dpdGNoIChzLT5yb3V0ZXNbaV0ub2JzX2NvdW50KSB7CisJCQljYXNlIDA6CQkvKiBBIGxvY2tlZCBlbnRyeSAqLworCQkJCWJyZWFrOworCisJCQljYXNlIDE6CQkvKiBGcm9tIDEgLT4gMCAqLworCQkJCW5yX25laWdoID0gcy0+cm91dGVzW2ldLm5laWdoYm91cjsKKworCQkJCW5yX25laWdoLT5jb3VudC0tOworCQkJCW5yX25laWdoX3B1dChucl9uZWlnaCk7CisKKwkJCQlpZiAobnJfbmVpZ2gtPmNvdW50ID09IDAgJiYgIW5yX25laWdoLT5sb2NrZWQpCisJCQkJCW5yX3JlbW92ZV9uZWlnaChucl9uZWlnaCk7CisKKwkJCQlzLT5jb3VudC0tOworCisJCQkJc3dpdGNoIChpKSB7CisJCQkJCWNhc2UgMDoKKwkJCQkJCXMtPnJvdXRlc1swXSA9IHMtPnJvdXRlc1sxXTsKKwkJCQkJY2FzZSAxOgorCQkJCQkJcy0+cm91dGVzWzFdID0gcy0+cm91dGVzWzJdOworCQkJCQljYXNlIDI6CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJcy0+cm91dGVzW2ldLm9ic19jb3VudC0tOworCQkJCWJyZWFrOworCisJCQl9CisJCX0KKworCQlpZiAocy0+Y291bnQgPD0gMCkKKwkJCW5yX3JlbW92ZV9ub2RlX2xvY2tlZChzKTsKKwkJbnJfbm9kZV91bmxvY2socyk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZucl9ub2RlX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCUEgZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQuIFJlbW92ZSBpdHMgcm91dGVzIGFuZCBuZWlnaGJvdXJzLgorICovCit2b2lkIG5yX3J0X2RldmljZV9kb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5yX25laWdoICpzOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqbm9kZXQsICpub2RlMiwgKm5vZGUydDsKKwlzdHJ1Y3QgbnJfbm9kZSAgKnQ7CisJaW50IGk7CisKKwlzcGluX2xvY2tfYmgoJm5yX25laWdoX2xpc3RfbG9jayk7CisJbnJfbmVpZ2hfZm9yX2VhY2hfc2FmZShzLCBub2RlLCBub2RldCwgJm5yX25laWdoX2xpc3QpIHsKKwkJaWYgKHMtPmRldiA9PSBkZXYpIHsKKwkJCXNwaW5fbG9ja19iaCgmbnJfbm9kZV9saXN0X2xvY2spOworCQkJbnJfbm9kZV9mb3JfZWFjaF9zYWZlKHQsIG5vZGUyLCBub2RlMnQsICZucl9ub2RlX2xpc3QpIHsKKwkJCQlucl9ub2RlX2xvY2sodCk7CisJCQkJZm9yIChpID0gMDsgaSA8IHQtPmNvdW50OyBpKyspIHsKKwkJCQkJaWYgKHQtPnJvdXRlc1tpXS5uZWlnaGJvdXIgPT0gcykgeworCQkJCQkJdC0+Y291bnQtLTsKKworCQkJCQkJc3dpdGNoIChpKSB7CisJCQkJCQljYXNlIDA6CisJCQkJCQkJdC0+cm91dGVzWzBdID0gdC0+cm91dGVzWzFdOworCQkJCQkJY2FzZSAxOgorCQkJCQkJCXQtPnJvdXRlc1sxXSA9IHQtPnJvdXRlc1syXTsKKwkJCQkJCWNhc2UgMjoKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCWlmICh0LT5jb3VudCA8PSAwKQorCQkJCQlucl9yZW1vdmVfbm9kZV9sb2NrZWQodCk7CisJCQkJbnJfbm9kZV91bmxvY2sodCk7CisJCQl9CisJCQlzcGluX3VubG9ja19iaCgmbnJfbm9kZV9saXN0X2xvY2spOworCisJCQlucl9yZW1vdmVfbmVpZ2hfbG9ja2VkKHMpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2JoKCZucl9uZWlnaF9saXN0X2xvY2spOworfQorCisvKgorICoJQ2hlY2sgdGhhdCB0aGUgZGV2aWNlIGdpdmVuIGlzIGEgdmFsaWQgQVguMjUgaW50ZXJmYWNlIHRoYXQgaXMgInVwIi4KKyAqCU9yIGEgdmFsaWQgZXRoZXJuZXQgaW50ZXJmYWNlIHdpdGggYW4gQVguMjUgY2FsbHNpZ24gYmluZGluZy4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpucl9heDI1X2Rldl9nZXQoY2hhciAqZGV2bmFtZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJaWYgKChkZXYgPSBkZXZfZ2V0X2J5X25hbWUoZGV2bmFtZSkpID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaWYgKChkZXYtPmZsYWdzICYgSUZGX1VQKSAmJiBkZXYtPnR5cGUgPT0gQVJQSFJEX0FYMjUpCisJCXJldHVybiBkZXY7CisKKwlkZXZfcHV0KGRldik7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKglGaW5kIHRoZSBmaXJzdCBhY3RpdmUgTkVUL1JPTSBkZXZpY2UsIHVzdWFsbHkgIm5yMCIuCisgKi8KK3N0cnVjdCBuZXRfZGV2aWNlICpucl9kZXZfZmlyc3Qodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCAqZmlyc3QgPSBOVUxMOworCisJcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKwlmb3IgKGRldiA9IGRldl9iYXNlOyBkZXYgIT0gTlVMTDsgZGV2ID0gZGV2LT5uZXh0KSB7CisJCWlmICgoZGV2LT5mbGFncyAmIElGRl9VUCkgJiYgZGV2LT50eXBlID09IEFSUEhSRF9ORVRST00pCisJCQlpZiAoZmlyc3QgPT0gTlVMTCB8fCBzdHJuY21wKGRldi0+bmFtZSwgZmlyc3QtPm5hbWUsIDMpIDwgMCkKKwkJCQlmaXJzdCA9IGRldjsKKwl9CisJaWYgKGZpcnN0KQorCQlkZXZfaG9sZChmaXJzdCk7CisJcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOworCisJcmV0dXJuIGZpcnN0OworfQorCisvKgorICoJRmluZCB0aGUgTkVUL1JPTSBkZXZpY2UgZm9yIHRoZSBnaXZlbiBjYWxsc2lnbi4KKyAqLworc3RydWN0IG5ldF9kZXZpY2UgKm5yX2Rldl9nZXQoYXgyNV9hZGRyZXNzICphZGRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOworCWZvciAoZGV2ID0gZGV2X2Jhc2U7IGRldiAhPSBOVUxMOyBkZXYgPSBkZXYtPm5leHQpIHsKKwkJaWYgKChkZXYtPmZsYWdzICYgSUZGX1VQKSAmJiBkZXYtPnR5cGUgPT0gQVJQSFJEX05FVFJPTSAmJiBheDI1Y21wKGFkZHIsIChheDI1X2FkZHJlc3MgKilkZXYtPmRldl9hZGRyKSA9PSAwKSB7CisJCQlkZXZfaG9sZChkZXYpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CitvdXQ6CisJcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOworCXJldHVybiBkZXY7Cit9CisKK3N0YXRpYyBheDI1X2RpZ2kgKm5yX2NhbGxfdG9fZGlnaShpbnQgbmRpZ2lzLCBheDI1X2FkZHJlc3MgKmRpZ2lwZWF0ZXJzKQoreworCXN0YXRpYyBheDI1X2RpZ2kgYXgyNV9kaWdpOworCWludCBpOworCisJaWYgKG5kaWdpcyA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBuZGlnaXM7IGkrKykgeworCQlheDI1X2RpZ2kuY2FsbHNbaV0gICAgPSBkaWdpcGVhdGVyc1tpXTsKKwkJYXgyNV9kaWdpLnJlcGVhdGVkW2ldID0gMDsKKwl9CisKKwlheDI1X2RpZ2kubmRpZ2kgICAgICA9IG5kaWdpczsKKwlheDI1X2RpZ2kubGFzdHJlcGVhdCA9IC0xOworCisJcmV0dXJuICZheDI1X2RpZ2k7Cit9CisKKy8qCisgKglIYW5kbGUgdGhlIGlvY3RscyB0aGF0IGNvbnRyb2wgdGhlIHJvdXRpbmcgZnVuY3Rpb25zLgorICovCitpbnQgbnJfcnRfaW9jdGwodW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgbnJfcm91dGVfc3RydWN0IG5yX3JvdXRlOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IHJldDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DQUREUlQ6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbnJfcm91dGUsIGFyZywgc2l6ZW9mKHN0cnVjdCBucl9yb3V0ZV9zdHJ1Y3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoKGRldiA9IG5yX2F4MjVfZGV2X2dldChucl9yb3V0ZS5kZXZpY2UpKSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChucl9yb3V0ZS5uZGlnaXMgPCAwIHx8IG5yX3JvdXRlLm5kaWdpcyA+IEFYMjVfTUFYX0RJR0lTKSB7CisJCQlkZXZfcHV0KGRldik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlzd2l0Y2ggKG5yX3JvdXRlLnR5cGUpIHsKKwkJY2FzZSBORVRST01fTk9ERToKKwkJCXJldCA9IG5yX2FkZF9ub2RlKCZucl9yb3V0ZS5jYWxsc2lnbiwKKwkJCQlucl9yb3V0ZS5tbmVtb25pYywKKwkJCQkmbnJfcm91dGUubmVpZ2hib3VyLAorCQkJCW5yX2NhbGxfdG9fZGlnaShucl9yb3V0ZS5uZGlnaXMsIG5yX3JvdXRlLmRpZ2lwZWF0ZXJzKSwKKwkJCQlkZXYsIG5yX3JvdXRlLnF1YWxpdHksCisJCQkJbnJfcm91dGUub2JzX2NvdW50KTsKKwkJCWJyZWFrOworCQljYXNlIE5FVFJPTV9ORUlHSDoKKwkJCXJldCA9IG5yX2FkZF9uZWlnaCgmbnJfcm91dGUuY2FsbHNpZ24sCisJCQkJbnJfY2FsbF90b19kaWdpKG5yX3JvdXRlLm5kaWdpcywgbnJfcm91dGUuZGlnaXBlYXRlcnMpLAorCQkJCWRldiwgbnJfcm91dGUucXVhbGl0eSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwkJZGV2X3B1dChkZXYpOworCQlyZXR1cm4gcmV0OworCisJY2FzZSBTSU9DREVMUlQ6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbnJfcm91dGUsIGFyZywgc2l6ZW9mKHN0cnVjdCBucl9yb3V0ZV9zdHJ1Y3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoKGRldiA9IG5yX2F4MjVfZGV2X2dldChucl9yb3V0ZS5kZXZpY2UpKSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXN3aXRjaCAobnJfcm91dGUudHlwZSkgeworCQljYXNlIE5FVFJPTV9OT0RFOgorCQkJcmV0ID0gbnJfZGVsX25vZGUoJm5yX3JvdXRlLmNhbGxzaWduLAorCQkJCSZucl9yb3V0ZS5uZWlnaGJvdXIsIGRldik7CisJCQlicmVhazsKKwkJY2FzZSBORVRST01fTkVJR0g6CisJCQlyZXQgPSBucl9kZWxfbmVpZ2goJm5yX3JvdXRlLmNhbGxzaWduLAorCQkJCWRldiwgbnJfcm91dGUucXVhbGl0eSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwkJZGV2X3B1dChkZXYpOworCQlyZXR1cm4gcmV0OworCisJY2FzZSBTSU9DTlJERUNPQlM6CisJCXJldHVybiBucl9kZWNfb2JzKCk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIAlBIGxldmVsIDIgbGluayBoYXMgdGltZWQgb3V0LCB0aGVyZWZvcmUgaXQgYXBwZWFycyB0byBiZSBhIHBvb3IgbGluaywKKyAqCXRoZW4gZG9uJ3QgdXNlIHRoYXQgbmVpZ2hib3VyIHVudGlsIGl0IGlzIHJlc2V0LgorICovCit2b2lkIG5yX2xpbmtfZmFpbGVkKGF4MjVfY2IgKmF4MjUsIGludCByZWFzb24pCit7CisJc3RydWN0IG5yX25laWdoICpzLCAqbnJfbmVpZ2ggPSBOVUxMOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXN0cnVjdCBucl9ub2RlICAqbnJfbm9kZSA9IE5VTEw7CisKKwlzcGluX2xvY2tfYmgoJm5yX25laWdoX2xpc3RfbG9jayk7CisJbnJfbmVpZ2hfZm9yX2VhY2gocywgbm9kZSwgJm5yX25laWdoX2xpc3QpCisJCWlmIChzLT5heDI1ID09IGF4MjUpIHsKKwkJCW5yX25laWdoX2hvbGQocyk7CisJCQlucl9uZWlnaCA9IHM7CisJCQlicmVhazsKKwkJfQorCXNwaW5fdW5sb2NrX2JoKCZucl9uZWlnaF9saXN0X2xvY2spOworCisJaWYgKG5yX25laWdoID09IE5VTEwpIHJldHVybjsKKworCW5yX25laWdoLT5heDI1ID0gTlVMTDsKKwlheDI1X2NiX3B1dChheDI1KTsKKworCWlmICgrK25yX25laWdoLT5mYWlsZWQgPCBzeXNjdGxfbmV0cm9tX2xpbmtfZmFpbHNfY291bnQpIHsKKwkJbnJfbmVpZ2hfcHV0KG5yX25laWdoKTsKKwkJcmV0dXJuOworCX0KKwlzcGluX2xvY2tfYmgoJm5yX25vZGVfbGlzdF9sb2NrKTsKKwlucl9ub2RlX2Zvcl9lYWNoKG5yX25vZGUsIG5vZGUsICZucl9ub2RlX2xpc3QpCisJCW5yX25vZGVfbG9jayhucl9ub2RlKTsKKwkJaWYgKG5yX25vZGUtPndoaWNoIDwgbnJfbm9kZS0+Y291bnQgJiYgbnJfbm9kZS0+cm91dGVzW25yX25vZGUtPndoaWNoXS5uZWlnaGJvdXIgPT0gbnJfbmVpZ2gpCisJCQlucl9ub2RlLT53aGljaCsrOworCQlucl9ub2RlX3VubG9jayhucl9ub2RlKTsKKwlzcGluX3VubG9ja19iaCgmbnJfbm9kZV9saXN0X2xvY2spOworCW5yX25laWdoX3B1dChucl9uZWlnaCk7Cit9CisKKy8qCisgKglSb3V0ZSBhIGZyYW1lIHRvIGFuIGFwcHJvcHJpYXRlIEFYLjI1IGNvbm5lY3Rpb24uIEEgTlVMTCBheDI1X2NiCisgKglpbmRpY2F0ZXMgYW4gaW50ZXJuYWxseSBnZW5lcmF0ZWQgZnJhbWUuCisgKi8KK2ludCBucl9yb3V0ZV9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBheDI1X2NiICpheDI1KQoreworCWF4MjVfYWRkcmVzcyAqbnJfc3JjLCAqbnJfZGVzdDsKKwlzdHJ1Y3QgbnJfbmVpZ2ggKm5yX25laWdoOworCXN0cnVjdCBucl9ub2RlICAqbnJfbm9kZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXVuc2lnbmVkIGNoYXIgKmRwdHI7CisJYXgyNV9jYiAqYXgyNXM7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tibjsKKworCisJbnJfc3JjICA9IChheDI1X2FkZHJlc3MgKikoc2tiLT5kYXRhICsgMCk7CisJbnJfZGVzdCA9IChheDI1X2FkZHJlc3MgKikoc2tiLT5kYXRhICsgNyk7CisKKwlpZiAoYXgyNSAhPSBOVUxMKQorCQlucl9hZGRfbm9kZShucl9zcmMsICIiLCAmYXgyNS0+ZGVzdF9hZGRyLCBheDI1LT5kaWdpcGVhdCwKKwkJCSAgICBheDI1LT5heDI1X2Rldi0+ZGV2LCAwLCBzeXNjdGxfbmV0cm9tX29ic29sZXNjZW5jZV9jb3VudF9pbml0aWFsaXNlcik7CisKKwlpZiAoKGRldiA9IG5yX2Rldl9nZXQobnJfZGVzdCkpICE9IE5VTEwpIHsJLyogSXRzIGZvciBtZSAqLworCQlpZiAoYXgyNSA9PSBOVUxMKQkJCS8qIEl0cyBmcm9tIG1lICovCisJCQlyZXQgPSBucl9sb29wYmFja19xdWV1ZShza2IpOworCQllbHNlCisJCQlyZXQgPSBucl9yeF9mcmFtZShza2IsIGRldik7CisJCWRldl9wdXQoZGV2KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIXN5c2N0bF9uZXRyb21fcm91dGluZ19jb250cm9sICYmIGF4MjUgIT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwkvKiBJdHMgVGltZS1Uby1MaXZlIGhhcyBleHBpcmVkICovCisJaWYgKHNrYi0+ZGF0YVsxNF0gPT0gMSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlucl9ub2RlID0gbnJfbm9kZV9nZXQobnJfZGVzdCk7CisJaWYgKG5yX25vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJbnJfbm9kZV9sb2NrKG5yX25vZGUpOworCisJaWYgKG5yX25vZGUtPndoaWNoID49IG5yX25vZGUtPmNvdW50KSB7CisJCW5yX25vZGVfdW5sb2NrKG5yX25vZGUpOworCQlucl9ub2RlX3B1dChucl9ub2RlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbnJfbmVpZ2ggPSBucl9ub2RlLT5yb3V0ZXNbbnJfbm9kZS0+d2hpY2hdLm5laWdoYm91cjsKKworCWlmICgoZGV2ID0gbnJfZGV2X2ZpcnN0KCkpID09IE5VTEwpIHsKKwkJbnJfbm9kZV91bmxvY2sobnJfbm9kZSk7CisJCW5yX25vZGVfcHV0KG5yX25vZGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBXZSBhcmUgZ29pbmcgdG8gY2hhbmdlIHRoZSBuZXRyb20gaGVhZGVycyBzbyB3ZSBzaG91bGQgZ2V0IG91cgorCSAgIG93biBza2IsIHdlIGFsc28gZGlkIG5vdCBrbm93IHVudGlsIG5vdyBob3cgbXVjaCBoZWFkZXIgc3BhY2UKKwkgICB3ZSBoYWQgdG8gcmVzZXJ2ZS4uLiAtIFJYUSAqLworCWlmICgoc2tibj1za2JfY29weV9leHBhbmQoc2tiLCBkZXYtPmhhcmRfaGVhZGVyX2xlbiwgMCwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwkJbnJfbm9kZV91bmxvY2sobnJfbm9kZSk7CisJCW5yX25vZGVfcHV0KG5yX25vZGUpOworCQlkZXZfcHV0KGRldik7CisJCXJldHVybiAwOworCX0KKwlrZnJlZV9za2Ioc2tiKTsKKwlza2I9c2tibjsKKwlza2ItPmRhdGFbMTRdLS07CisKKwlkcHRyICA9IHNrYl9wdXNoKHNrYiwgMSk7CisJKmRwdHIgPSBBWDI1X1BfTkVUUk9NOworCisJYXgyNXMgPSBheDI1X3NlbmRfZnJhbWUoc2tiLCAyNTYsIChheDI1X2FkZHJlc3MgKilkZXYtPmRldl9hZGRyLCAmbnJfbmVpZ2gtPmNhbGxzaWduLCBucl9uZWlnaC0+ZGlnaXBlYXQsIG5yX25laWdoLT5kZXYpOworCWlmIChucl9uZWlnaC0+YXgyNSAmJiBheDI1cykgeworCQkvKiBXZSB3ZXJlIGFscmVhZHkgaG9sZGluZyB0aGlzIGF4MjVfY2IgKi8KKwkJYXgyNV9jYl9wdXQoYXgyNXMpOworCX0KKwlucl9uZWlnaC0+YXgyNSA9IGF4MjVzOworCisJZGV2X3B1dChkZXYpOworCXJldCA9IChucl9uZWlnaC0+YXgyNSAhPSBOVUxMKTsKKwlucl9ub2RlX3VubG9jayhucl9ub2RlKTsKKwlucl9ub2RlX3B1dChucl9ub2RlKTsKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworc3RhdGljIHZvaWQgKm5yX25vZGVfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBucl9ub2RlICpucl9ub2RlOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCWludCBpID0gMTsKKyAKKyAJc3Bpbl9sb2NrX2JoKCZucl9ub2RlX2xpc3RfbG9jayk7CisJaWYgKCpwb3MgPT0gMCkKKwkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKKworCW5yX25vZGVfZm9yX2VhY2gobnJfbm9kZSwgbm9kZSwgJm5yX25vZGVfbGlzdCkgeworCQlpZiAoaSA9PSAqcG9zKQorCQkJcmV0dXJuIG5yX25vZGU7CisJCSsraTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKm5yX25vZGVfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJKysqcG9zOworCQorCW5vZGUgPSAodiA9PSBTRVFfU1RBUlRfVE9LRU4pICAKKwkJPyBucl9ub2RlX2xpc3QuZmlyc3QKKwkJOiAoKHN0cnVjdCBucl9ub2RlICopdiktPm5vZGVfbm9kZS5uZXh0OworCisJcmV0dXJuIGhsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBucl9ub2RlLCBub2RlX25vZGUpOworfQorCitzdGF0aWMgdm9pZCBucl9ub2RlX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3Bpbl91bmxvY2tfYmgoJm5yX25vZGVfbGlzdF9sb2NrKTsKK30KKworc3RhdGljIGludCBucl9ub2RlX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJaW50IGk7CisKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXNlcV9wdXRzKHNlcSwKKwkJCSAiY2FsbHNpZ24gIG1uZW1vbmljIHcgbiBxdWFsIG9icyBuZWlnaCBxdWFsIG9icyBuZWlnaCBxdWFsIG9icyBuZWlnaFxuIik7CisJZWxzZSB7CisJCXN0cnVjdCBucl9ub2RlICpucl9ub2RlID0gdjsKKwkJbnJfbm9kZV9sb2NrKG5yX25vZGUpOworCQlzZXFfcHJpbnRmKHNlcSwgIiUtOXMgJS03cyAgJWQgJWQiLAorCQkJYXgyYXNjKCZucl9ub2RlLT5jYWxsc2lnbiksCisJCQkobnJfbm9kZS0+bW5lbW9uaWNbMF0gPT0gJ1wwJykgPyAiKiIgOiBucl9ub2RlLT5tbmVtb25pYywKKwkJCW5yX25vZGUtPndoaWNoICsgMSwKKwkJCW5yX25vZGUtPmNvdW50KTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbnJfbm9kZS0+Y291bnQ7IGkrKykgeworCQkJc2VxX3ByaW50ZihzZXEsICIgICUzZCAgICVkICUwNWQiLAorCQkJCW5yX25vZGUtPnJvdXRlc1tpXS5xdWFsaXR5LAorCQkJCW5yX25vZGUtPnJvdXRlc1tpXS5vYnNfY291bnQsCisJCQkJbnJfbm9kZS0+cm91dGVzW2ldLm5laWdoYm91ci0+bnVtYmVyKTsKKwkJfQorCQlucl9ub2RlX3VubG9jayhucl9ub2RlKTsKKworCQlzZXFfcHV0cyhzZXEsICJcbiIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBucl9ub2RlX3NlcW9wcyA9IHsKKwkuc3RhcnQgPSBucl9ub2RlX3N0YXJ0LAorCS5uZXh0ID0gbnJfbm9kZV9uZXh0LAorCS5zdG9wID0gbnJfbm9kZV9zdG9wLAorCS5zaG93ID0gbnJfbm9kZV9zaG93LAorfTsKKworc3RhdGljIGludCBucl9ub2RlX2luZm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJm5yX25vZGVfc2Vxb3BzKTsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBucl9ub2Rlc19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gbnJfbm9kZV9pbmZvX29wZW4sCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgdm9pZCAqbnJfbmVpZ2hfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBucl9uZWlnaCAqbnJfbmVpZ2g7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJaW50IGkgPSAxOworCisJc3Bpbl9sb2NrX2JoKCZucl9uZWlnaF9saXN0X2xvY2spOworCWlmICgqcG9zID09IDApCisJCXJldHVybiBTRVFfU1RBUlRfVE9LRU47CisKKwlucl9uZWlnaF9mb3JfZWFjaChucl9uZWlnaCwgbm9kZSwgJm5yX25laWdoX2xpc3QpIHsKKwkJaWYgKGkgPT0gKnBvcykKKwkJCXJldHVybiBucl9uZWlnaDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICpucl9uZWlnaF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwkrKypwb3M7CisJCisJbm9kZSA9ICh2ID09IFNFUV9TVEFSVF9UT0tFTikgIAorCQk/IG5yX25laWdoX2xpc3QuZmlyc3QKKwkJOiAoKHN0cnVjdCBucl9uZWlnaCAqKXYpLT5uZWlnaF9ub2RlLm5leHQ7CisKKwlyZXR1cm4gaGxpc3RfZW50cnkobm9kZSwgc3RydWN0IG5yX25laWdoLCBuZWlnaF9ub2RlKTsKK30KKworc3RhdGljIHZvaWQgbnJfbmVpZ2hfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzcGluX3VubG9ja19iaCgmbnJfbmVpZ2hfbGlzdF9sb2NrKTsKK30KKworc3RhdGljIGludCBucl9uZWlnaF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWludCBpOworCisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlzZXFfcHV0cyhzZXEsICJhZGRyICBjYWxsc2lnbiAgZGV2ICBxdWFsIGxvY2sgY291bnQgZmFpbGVkIGRpZ2lwZWF0ZXJzXG4iKTsKKwllbHNlIHsKKwkJc3RydWN0IG5yX25laWdoICpucl9uZWlnaCA9IHY7CisKKwkJc2VxX3ByaW50ZihzZXEsICIlMDVkICUtOXMgJS00cyAgJTNkICAgICVkICAgJTNkICAgICUzZCIsCisJCQlucl9uZWlnaC0+bnVtYmVyLAorCQkJYXgyYXNjKCZucl9uZWlnaC0+Y2FsbHNpZ24pLAorCQkJbnJfbmVpZ2gtPmRldiA/IG5yX25laWdoLT5kZXYtPm5hbWUgOiAiPz8/IiwKKwkJCW5yX25laWdoLT5xdWFsaXR5LAorCQkJbnJfbmVpZ2gtPmxvY2tlZCwKKwkJCW5yX25laWdoLT5jb3VudCwKKwkJCW5yX25laWdoLT5mYWlsZWQpOworCisJCWlmIChucl9uZWlnaC0+ZGlnaXBlYXQgIT0gTlVMTCkgeworCQkJZm9yIChpID0gMDsgaSA8IG5yX25laWdoLT5kaWdpcGVhdC0+bmRpZ2k7IGkrKykKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiAlcyIsIAorCQkJCQkgICBheDJhc2MoJm5yX25laWdoLT5kaWdpcGVhdC0+Y2FsbHNbaV0pKTsKKwkJfQorCisJCXNlcV9wdXRzKHNlcSwgIlxuIik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIG5yX25laWdoX3NlcW9wcyA9IHsKKwkuc3RhcnQgPSBucl9uZWlnaF9zdGFydCwKKwkubmV4dCA9IG5yX25laWdoX25leHQsCisJLnN0b3AgPSBucl9uZWlnaF9zdG9wLAorCS5zaG93ID0gbnJfbmVpZ2hfc2hvdywKK307CisKK3N0YXRpYyBpbnQgbnJfbmVpZ2hfaW5mb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmbnJfbmVpZ2hfc2Vxb3BzKTsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBucl9uZWlnaF9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gbnJfbmVpZ2hfaW5mb19vcGVuLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKworI2VuZGlmCisKKy8qCisgKglGcmVlIGFsbCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBub2RlcyBhbmQgcm91dGVzIGxpc3RzLgorICovCit2b2lkIF9fZXhpdCBucl9ydF9mcmVlKHZvaWQpCit7CisJc3RydWN0IG5yX25laWdoICpzID0gTlVMTDsKKwlzdHJ1Y3QgbnJfbm9kZSAgKnQgPSBOVUxMOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqbm9kZXQ7CisKKwlzcGluX2xvY2tfYmgoJm5yX25laWdoX2xpc3RfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZucl9ub2RlX2xpc3RfbG9jayk7CisJbnJfbm9kZV9mb3JfZWFjaF9zYWZlKHQsIG5vZGUsIG5vZGV0LCAmbnJfbm9kZV9saXN0KSB7CisJCW5yX25vZGVfbG9jayh0KTsKKwkJbnJfcmVtb3ZlX25vZGVfbG9ja2VkKHQpOworCQlucl9ub2RlX3VubG9jayh0KTsKKwl9CisJbnJfbmVpZ2hfZm9yX2VhY2hfc2FmZShzLCBub2RlLCBub2RldCwgJm5yX25laWdoX2xpc3QpIHsKKwkJd2hpbGUocy0+Y291bnQpIHsKKwkJCXMtPmNvdW50LS07CisJCQlucl9uZWlnaF9wdXQocyk7CisJCX0KKwkJbnJfcmVtb3ZlX25laWdoX2xvY2tlZChzKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJm5yX25vZGVfbGlzdF9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmbnJfbmVpZ2hfbGlzdF9sb2NrKTsKK30KZGlmZiAtLWdpdCBhL25ldC9uZXRyb20vbnJfc3Vici5jIGIvbmV0L25ldHJvbS9ucl9zdWJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYyNzM0NwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRyb20vbnJfc3Vici5jCkBAIC0wLDAgKzEsMjgzIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDb3B5cmlnaHQgSm9uYXRoYW4gTmF5bG9yIEc0S0xYIChnNGtseEBnNGtseC5kZW1vbi5jby51aykKKyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bmV0L2F4MjUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRyb20uaD4KKworLyoKKyAqCVRoaXMgcm91dGluZSBwdXJnZXMgYWxsIG9mIHRoZSBxdWV1ZXMgb2YgZnJhbWVzLgorICovCit2b2lkIG5yX2NsZWFyX3F1ZXVlcyhzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IG5yX3NvY2sgKm5yID0gbnJfc2soc2spOworCisJc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfd3JpdGVfcXVldWUpOworCXNrYl9xdWV1ZV9wdXJnZSgmbnItPmFja19xdWV1ZSk7CisJc2tiX3F1ZXVlX3B1cmdlKCZuci0+cmVzZXFfcXVldWUpOworCXNrYl9xdWV1ZV9wdXJnZSgmbnItPmZyYWdfcXVldWUpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIHB1cmdlcyB0aGUgaW5wdXQgcXVldWUgb2YgdGhvc2UgZnJhbWVzIHRoYXQgaGF2ZSBiZWVuCisgKiBhY2tub3dsZWRnZWQuIFRoaXMgcmVwbGFjZXMgdGhlIGJveGVzIGxhYmVsbGVkICJWKGEpIDwtIE4ocikiIG9uIHRoZQorICogU0RMIGRpYWdyYW0uCisgKi8KK3ZvaWQgbnJfZnJhbWVzX2Fja2VkKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgc2hvcnQgbnIpCit7CisJc3RydWN0IG5yX3NvY2sgKm5yb20gPSBucl9zayhzayk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCS8qCisJICogUmVtb3ZlIGFsbCB0aGUgYWNrLWVkIGZyYW1lcyBmcm9tIHRoZSBhY2sgcXVldWUuCisJICovCisJaWYgKG5yb20tPnZhICE9IG5yKSB7CisJCXdoaWxlIChza2JfcGVlaygmbnJvbS0+YWNrX3F1ZXVlKSAhPSBOVUxMICYmIG5yb20tPnZhICE9IG5yKSB7CisJCSAgICAgICAgc2tiID0gc2tiX2RlcXVldWUoJm5yb20tPmFja19xdWV1ZSk7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCW5yb20tPnZhID0gKG5yb20tPnZhICsgMSkgJSBOUl9NT0RVTFVTOworCQl9CisJfQorfQorCisvKgorICogUmVxdWV1ZSBhbGwgdGhlIHVuLWFjay1lZCBmcmFtZXMgb24gdGhlIG91dHB1dCBxdWV1ZSB0byBiZSBwaWNrZWQKKyAqIHVwIGJ5IG5yX2tpY2sgY2FsbGVkIGZyb20gdGhlIHRpbWVyLiBUaGlzIGFycmFuZ2VtZW50IGhhbmRsZXMgdGhlCisgKiBwb3NzaWJpbGl0eSBvZiBhbiBlbXB0eSBvdXRwdXQgcXVldWUuCisgKi8KK3ZvaWQgbnJfcmVxdWV1ZV9mcmFtZXMoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBza19idWZmICpza2IsICpza2JfcHJldiA9IE5VTEw7CisKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZucl9zayhzayktPmFja19xdWV1ZSkpICE9IE5VTEwpIHsKKwkJaWYgKHNrYl9wcmV2ID09IE5VTEwpCisJCQlza2JfcXVldWVfaGVhZCgmc2stPnNrX3dyaXRlX3F1ZXVlLCBza2IpOworCQllbHNlCisJCQlza2JfYXBwZW5kKHNrYl9wcmV2LCBza2IpOworCQlza2JfcHJldiA9IHNrYjsKKwl9Cit9CisKKy8qCisgKglWYWxpZGF0ZSB0aGF0IHRoZSB2YWx1ZSBvZiBuciBpcyBiZXR3ZWVuIHZhIGFuZCB2cy4gUmV0dXJuIHRydWUgb3IKKyAqCWZhbHNlIGZvciB0ZXN0aW5nLgorICovCitpbnQgbnJfdmFsaWRhdGVfbnIoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBzaG9ydCBucikKK3sKKwlzdHJ1Y3QgbnJfc29jayAqbnJvbSA9IG5yX3NrKHNrKTsKKwl1bnNpZ25lZCBzaG9ydCB2YyA9IG5yb20tPnZhOworCisJd2hpbGUgKHZjICE9IG5yb20tPnZzKSB7CisJCWlmIChuciA9PSB2YykgcmV0dXJuIDE7CisJCXZjID0gKHZjICsgMSkgJSBOUl9NT0RVTFVTOworCX0KKworCXJldHVybiBuciA9PSBucm9tLT52czsKK30KKworLyoKKyAqCUNoZWNrIHRoYXQgbnMgaXMgd2l0aGluIHRoZSByZWNlaXZlIHdpbmRvdy4KKyAqLworaW50IG5yX2luX3J4X3dpbmRvdyhzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIHNob3J0IG5zKQoreworCXN0cnVjdCBucl9zb2NrICpuciA9IG5yX3NrKHNrKTsKKwl1bnNpZ25lZCBzaG9ydCB2YyA9IG5yLT52cjsKKwl1bnNpZ25lZCBzaG9ydCB2dCA9IChuci0+dmwgKyBuci0+d2luZG93KSAlIE5SX01PRFVMVVM7CisKKwl3aGlsZSAodmMgIT0gdnQpIHsKKwkJaWYgKG5zID09IHZjKSByZXR1cm4gMTsKKwkJdmMgPSAodmMgKyAxKSAlIE5SX01PRFVMVVM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHRoZSBIRExDIGxheWVyIGludGVybmFsbHkgZ2VuZXJhdGVzIGEKKyAqICBjb250cm9sIGZyYW1lLgorICovCit2b2lkIG5yX3dyaXRlX2ludGVybmFsKHN0cnVjdCBzb2NrICpzaywgaW50IGZyYW1ldHlwZSkKK3sKKwlzdHJ1Y3QgbnJfc29jayAqbnIgPSBucl9zayhzayk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyICAqZHB0cjsKKwlpbnQgbGVuLCB0aW1lb3V0OworCisJbGVuID0gTlJfTkVUV09SS19MRU4gKyBOUl9UUkFOU1BPUlRfTEVOOworCisJc3dpdGNoIChmcmFtZXR5cGUgJiAweDBGKSB7CisJY2FzZSBOUl9DT05OUkVROgorCQlsZW4gKz0gMTc7CisJCWJyZWFrOworCWNhc2UgTlJfQ09OTkFDSzoKKwkJbGVuICs9IChuci0+YnBxZXh0KSA/IDIgOiAxOworCQlicmVhazsKKwljYXNlIE5SX0RJU0NSRVE6CisJY2FzZSBOUl9ESVNDQUNLOgorCWNhc2UgTlJfSU5GT0FDSzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJORVQvUk9NOiBucl93cml0ZV9pbnRlcm5hbCAtIGludmFsaWQgZnJhbWUgdHlwZSAlZFxuIiwgZnJhbWV0eXBlKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgoc2tiID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJCXJldHVybjsKKworCS8qCisJICoJU3BhY2UgZm9yIEFYLjI1IGFuZCBORVQvUk9NIG5ldHdvcmsgaGVhZGVyCisJICovCisJc2tiX3Jlc2VydmUoc2tiLCBOUl9ORVRXT1JLX0xFTik7CisKKwlkcHRyID0gc2tiX3B1dChza2IsIHNrYl90YWlscm9vbShza2IpKTsKKworCXN3aXRjaCAoZnJhbWV0eXBlICYgMHgwRikgeworCWNhc2UgTlJfQ09OTlJFUToKKwkJdGltZW91dCAgPSBuci0+dDEgLyBIWjsKKwkJKmRwdHIrKyAgPSBuci0+bXlfaW5kZXg7CisJCSpkcHRyKysgID0gbnItPm15X2lkOworCQkqZHB0cisrICA9IDA7CisJCSpkcHRyKysgID0gMDsKKwkJKmRwdHIrKyAgPSBmcmFtZXR5cGU7CisJCSpkcHRyKysgID0gbnItPndpbmRvdzsKKwkJbWVtY3B5KGRwdHIsICZuci0+dXNlcl9hZGRyLCBBWDI1X0FERFJfTEVOKTsKKwkJZHB0cls2XSAmPSB+QVgyNV9DQklUOworCQlkcHRyWzZdICY9IH5BWDI1X0VCSVQ7CisJCWRwdHJbNl0gfD0gQVgyNV9TU1NJRF9TUEFSRTsKKwkJZHB0ciAgICArPSBBWDI1X0FERFJfTEVOOworCQltZW1jcHkoZHB0ciwgJm5yLT5zb3VyY2VfYWRkciwgQVgyNV9BRERSX0xFTik7CisJCWRwdHJbNl0gJj0gfkFYMjVfQ0JJVDsKKwkJZHB0cls2XSAmPSB+QVgyNV9FQklUOworCQlkcHRyWzZdIHw9IEFYMjVfU1NTSURfU1BBUkU7CisJCWRwdHIgICAgKz0gQVgyNV9BRERSX0xFTjsKKwkJKmRwdHIrKyAgPSB0aW1lb3V0ICUgMjU2OworCQkqZHB0cisrICA9IHRpbWVvdXQgLyAyNTY7CisJCWJyZWFrOworCisJY2FzZSBOUl9DT05OQUNLOgorCQkqZHB0cisrID0gbnItPnlvdXJfaW5kZXg7CisJCSpkcHRyKysgPSBuci0+eW91cl9pZDsKKwkJKmRwdHIrKyA9IG5yLT5teV9pbmRleDsKKwkJKmRwdHIrKyA9IG5yLT5teV9pZDsKKwkJKmRwdHIrKyA9IGZyYW1ldHlwZTsKKwkJKmRwdHIrKyA9IG5yLT53aW5kb3c7CisJCWlmIChuci0+YnBxZXh0KSAqZHB0cisrID0gc3lzY3RsX25ldHJvbV9uZXR3b3JrX3R0bF9pbml0aWFsaXNlcjsKKwkJYnJlYWs7CisKKwljYXNlIE5SX0RJU0NSRVE6CisJY2FzZSBOUl9ESVNDQUNLOgorCQkqZHB0cisrID0gbnItPnlvdXJfaW5kZXg7CisJCSpkcHRyKysgPSBuci0+eW91cl9pZDsKKwkJKmRwdHIrKyA9IDA7CisJCSpkcHRyKysgPSAwOworCQkqZHB0cisrID0gZnJhbWV0eXBlOworCQlicmVhazsKKworCWNhc2UgTlJfSU5GT0FDSzoKKwkJKmRwdHIrKyA9IG5yLT55b3VyX2luZGV4OworCQkqZHB0cisrID0gbnItPnlvdXJfaWQ7CisJCSpkcHRyKysgPSAwOworCQkqZHB0cisrID0gbnItPnZyOworCQkqZHB0cisrID0gZnJhbWV0eXBlOworCQlicmVhazsKKwl9CisKKwlucl90cmFuc21pdF9idWZmZXIoc2ssIHNrYik7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gYSBDb25uZWN0IEFja25vd2xlZGdlIHdpdGggdGhlIENob2tlIEZsYWcKKyAqIHNldCBpcyBuZWVkZWQgdG8gcmVmdXNlIGEgY29ubmVjdGlvbi4KKyAqLwordm9pZCBucl90cmFuc21pdF9yZWZ1c2FsKHN0cnVjdCBza19idWZmICpza2IsIGludCBtaW5lKQoreworCXN0cnVjdCBza19idWZmICpza2JuOworCXVuc2lnbmVkIGNoYXIgKmRwdHI7CisJaW50IGxlbjsKKworCWxlbiA9IE5SX05FVFdPUktfTEVOICsgTlJfVFJBTlNQT1JUX0xFTiArIDE7CisKKwlpZiAoKHNrYm4gPSBhbGxvY19za2IobGVuLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc2tiX3Jlc2VydmUoc2tibiwgMCk7CisKKwlkcHRyID0gc2tiX3B1dChza2JuLCBOUl9ORVRXT1JLX0xFTiArIE5SX1RSQU5TUE9SVF9MRU4pOworCisJbWVtY3B5KGRwdHIsIHNrYi0+ZGF0YSArIDcsIEFYMjVfQUREUl9MRU4pOworCWRwdHJbNl0gJj0gfkFYMjVfQ0JJVDsKKwlkcHRyWzZdICY9IH5BWDI1X0VCSVQ7CisJZHB0cls2XSB8PSBBWDI1X1NTU0lEX1NQQVJFOworCWRwdHIgKz0gQVgyNV9BRERSX0xFTjsKKworCW1lbWNweShkcHRyLCBza2ItPmRhdGEgKyAwLCBBWDI1X0FERFJfTEVOKTsKKwlkcHRyWzZdICY9IH5BWDI1X0NCSVQ7CisJZHB0cls2XSB8PSBBWDI1X0VCSVQ7CisJZHB0cls2XSB8PSBBWDI1X1NTU0lEX1NQQVJFOworCWRwdHIgKz0gQVgyNV9BRERSX0xFTjsKKworCSpkcHRyKysgPSBzeXNjdGxfbmV0cm9tX25ldHdvcmtfdHRsX2luaXRpYWxpc2VyOworCisJaWYgKG1pbmUpIHsKKwkJKmRwdHIrKyA9IDA7CisJCSpkcHRyKysgPSAwOworCQkqZHB0cisrID0gc2tiLT5kYXRhWzE1XTsKKwkJKmRwdHIrKyA9IHNrYi0+ZGF0YVsxNl07CisJfSBlbHNlIHsKKwkJKmRwdHIrKyA9IHNrYi0+ZGF0YVsxNV07CisJCSpkcHRyKysgPSBza2ItPmRhdGFbMTZdOworCQkqZHB0cisrID0gMDsKKwkJKmRwdHIrKyA9IDA7CisJfQorCisJKmRwdHIrKyA9IE5SX0NPTk5BQ0sgfCBOUl9DSE9LRV9GTEFHOworCSpkcHRyKysgPSAwOworCisJaWYgKCFucl9yb3V0ZV9mcmFtZShza2JuLCBOVUxMKSkKKwkJa2ZyZWVfc2tiKHNrYm4pOworfQorCit2b2lkIG5yX2Rpc2Nvbm5lY3Qoc3RydWN0IHNvY2sgKnNrLCBpbnQgcmVhc29uKQoreworCW5yX3N0b3BfdDF0aW1lcihzayk7CisJbnJfc3RvcF90MnRpbWVyKHNrKTsKKwlucl9zdG9wX3Q0dGltZXIoc2spOworCW5yX3N0b3BfaWRsZXRpbWVyKHNrKTsKKworCW5yX2NsZWFyX3F1ZXVlcyhzayk7CisKKwlucl9zayhzayktPnN0YXRlID0gTlJfU1RBVEVfMDsKKworCXNrLT5za19zdGF0ZSAgICAgPSBUQ1BfQ0xPU0U7CisJc2stPnNrX2VyciAgICAgICA9IHJlYXNvbjsKKwlzay0+c2tfc2h1dGRvd24gfD0gU0VORF9TSFVURE9XTjsKKworCWlmICghc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKSB7CisJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX0RFQUQpOworCX0KK30KZGlmZiAtLWdpdCBhL25ldC9uZXRyb20vbnJfdGltZXIuYyBiL25ldC9uZXRyb20vbnJfdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWFiZGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldHJvbS9ucl90aW1lci5jCkBAIC0wLDAgKzEsMjYwIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIEpvbmF0aGFuIE5heWxvciBHNEtMWCAoZzRrbHhAZzRrbHguZGVtb24uY28udWspCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmFsZiBCYWVjaGxlIERPMUdSQiAocmFsZkBnbnUub3JnKQorICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPG5ldC9heDI1Lmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxuZXQvbmV0cm9tLmg+CisKK3N0YXRpYyB2b2lkIG5yX2hlYXJ0YmVhdF9leHBpcnkodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCBucl90MXRpbWVyX2V4cGlyeSh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyB2b2lkIG5yX3QydGltZXJfZXhwaXJ5KHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgbnJfdDR0aW1lcl9leHBpcnkodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCBucl9pZGxldGltZXJfZXhwaXJ5KHVuc2lnbmVkIGxvbmcpOworCit2b2lkIG5yX2luaXRfdGltZXJzKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgbnJfc29jayAqbnIgPSBucl9zayhzayk7CisKKwlpbml0X3RpbWVyKCZuci0+dDF0aW1lcik7CisJbnItPnQxdGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZylzazsKKwluci0+dDF0aW1lci5mdW5jdGlvbiA9ICZucl90MXRpbWVyX2V4cGlyeTsKKwkKKwlpbml0X3RpbWVyKCZuci0+dDJ0aW1lcik7CisJbnItPnQydGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZylzazsKKwluci0+dDJ0aW1lci5mdW5jdGlvbiA9ICZucl90MnRpbWVyX2V4cGlyeTsKKworCWluaXRfdGltZXIoJm5yLT50NHRpbWVyKTsKKwluci0+dDR0aW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKXNrOworCW5yLT50NHRpbWVyLmZ1bmN0aW9uID0gJm5yX3Q0dGltZXJfZXhwaXJ5OworCisJaW5pdF90aW1lcigmbnItPmlkbGV0aW1lcik7CisJbnItPmlkbGV0aW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKXNrOworCW5yLT5pZGxldGltZXIuZnVuY3Rpb24gPSAmbnJfaWRsZXRpbWVyX2V4cGlyeTsKKworCS8qIGluaXRpYWxpemVkIGJ5IHNvY2tfaW5pdF9kYXRhICovCisJc2stPnNrX3RpbWVyLmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpc2s7CisJc2stPnNrX3RpbWVyLmZ1bmN0aW9uID0gJm5yX2hlYXJ0YmVhdF9leHBpcnk7Cit9CisKK3ZvaWQgbnJfc3RhcnRfdDF0aW1lcihzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IG5yX3NvY2sgKm5yID0gbnJfc2soc2spOworCisJbW9kX3RpbWVyKCZuci0+dDF0aW1lciwgamlmZmllcyArIG5yLT50MSk7Cit9CisKK3ZvaWQgbnJfc3RhcnRfdDJ0aW1lcihzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IG5yX3NvY2sgKm5yID0gbnJfc2soc2spOworCisJbW9kX3RpbWVyKCZuci0+dDJ0aW1lciwgamlmZmllcyArIG5yLT50Mik7Cit9CisKK3ZvaWQgbnJfc3RhcnRfdDR0aW1lcihzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IG5yX3NvY2sgKm5yID0gbnJfc2soc2spOworCisJbW9kX3RpbWVyKCZuci0+dDR0aW1lciwgamlmZmllcyArIG5yLT50NCk7Cit9CisKK3ZvaWQgbnJfc3RhcnRfaWRsZXRpbWVyKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgbnJfc29jayAqbnIgPSBucl9zayhzayk7CisKKwlpZiAobnItPmlkbGUgPiAwKQorCQltb2RfdGltZXIoJm5yLT5pZGxldGltZXIsIGppZmZpZXMgKyBuci0+aWRsZSk7Cit9CisKK3ZvaWQgbnJfc3RhcnRfaGVhcnRiZWF0KHN0cnVjdCBzb2NrICpzaykKK3sKKwltb2RfdGltZXIoJnNrLT5za190aW1lciwgamlmZmllcyArIDUgKiBIWik7Cit9CisKK3ZvaWQgbnJfc3RvcF90MXRpbWVyKHN0cnVjdCBzb2NrICpzaykKK3sKKwlkZWxfdGltZXIoJm5yX3NrKHNrKS0+dDF0aW1lcik7Cit9CisKK3ZvaWQgbnJfc3RvcF90MnRpbWVyKHN0cnVjdCBzb2NrICpzaykKK3sKKwlkZWxfdGltZXIoJm5yX3NrKHNrKS0+dDJ0aW1lcik7Cit9CisKK3ZvaWQgbnJfc3RvcF90NHRpbWVyKHN0cnVjdCBzb2NrICpzaykKK3sKKwlkZWxfdGltZXIoJm5yX3NrKHNrKS0+dDR0aW1lcik7Cit9CisKK3ZvaWQgbnJfc3RvcF9pZGxldGltZXIoc3RydWN0IHNvY2sgKnNrKQoreworCWRlbF90aW1lcigmbnJfc2soc2spLT5pZGxldGltZXIpOworfQorCit2b2lkIG5yX3N0b3BfaGVhcnRiZWF0KHN0cnVjdCBzb2NrICpzaykKK3sKKwlkZWxfdGltZXIoJnNrLT5za190aW1lcik7Cit9CisKK2ludCBucl90MXRpbWVyX3J1bm5pbmcoc3RydWN0IHNvY2sgKnNrKQoreworCXJldHVybiB0aW1lcl9wZW5kaW5nKCZucl9zayhzayktPnQxdGltZXIpOworfQorCitzdGF0aWMgdm9pZCBucl9oZWFydGJlYXRfZXhwaXJ5KHVuc2lnbmVkIGxvbmcgcGFyYW0pCit7CisJc3RydWN0IHNvY2sgKnNrID0gKHN0cnVjdCBzb2NrICopcGFyYW07CisJc3RydWN0IG5yX3NvY2sgKm5yID0gbnJfc2soc2spOworCisJYmhfbG9ja19zb2NrKHNrKTsKKwlzd2l0Y2ggKG5yLT5zdGF0ZSkgeworCWNhc2UgTlJfU1RBVEVfMDoKKwkJLyogTWFnaWMgaGVyZTogSWYgd2UgbGlzdGVuKCkgYW5kIGEgbmV3IGxpbmsgZGllcyBiZWZvcmUgaXQKKwkJICAgaXMgYWNjZXB0ZWQoKSBpdCBpc24ndCAnZGVhZCcgc28gZG9lc24ndCBnZXQgcmVtb3ZlZC4gKi8KKwkJaWYgKHNvY2tfZmxhZyhzaywgU09DS19ERVNUUk9ZKSB8fAorCQkgICAgKHNrLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOICYmIHNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkpIHsKKwkJCXNvY2tfaG9sZChzayk7CisJCQlucl9kZXN0cm95X3NvY2tldChzayk7CisJCQliaF91bmxvY2tfc29jayhzayk7CisJCQlzb2NrX3B1dChzayk7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE5SX1NUQVRFXzM6CisJCS8qCisJCSAqIENoZWNrIGZvciB0aGUgc3RhdGUgb2YgdGhlIHJlY2VpdmUgYnVmZmVyLgorCQkgKi8KKwkJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPCAoc2stPnNrX3JjdmJ1ZiAvIDIpICYmCisJCSAgICAobnItPmNvbmRpdGlvbiAmIE5SX0NPTkRfT1dOX1JYX0JVU1kpKSB7CisJCQluci0+Y29uZGl0aW9uICY9IH5OUl9DT05EX09XTl9SWF9CVVNZOworCQkJbnItPmNvbmRpdGlvbiAmPSB+TlJfQ09ORF9BQ0tfUEVORElORzsKKwkJCW5yLT52bCAgICAgICAgID0gbnItPnZyOworCQkJbnJfd3JpdGVfaW50ZXJuYWwoc2ssIE5SX0lORk9BQ0spOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCisJbnJfc3RhcnRfaGVhcnRiZWF0KHNrKTsKKwliaF91bmxvY2tfc29jayhzayk7Cit9CisKK3N0YXRpYyB2b2lkIG5yX3QydGltZXJfZXhwaXJ5KHVuc2lnbmVkIGxvbmcgcGFyYW0pCit7CisJc3RydWN0IHNvY2sgKnNrID0gKHN0cnVjdCBzb2NrICopcGFyYW07CisJc3RydWN0IG5yX3NvY2sgKm5yID0gbnJfc2soc2spOworCisJYmhfbG9ja19zb2NrKHNrKTsKKwlpZiAobnItPmNvbmRpdGlvbiAmIE5SX0NPTkRfQUNLX1BFTkRJTkcpIHsKKwkJbnItPmNvbmRpdGlvbiAmPSB+TlJfQ09ORF9BQ0tfUEVORElORzsKKwkJbnJfZW5xdWlyeV9yZXNwb25zZShzayk7CisJfQorCWJoX3VubG9ja19zb2NrKHNrKTsKK30KKworc3RhdGljIHZvaWQgbnJfdDR0aW1lcl9leHBpcnkodW5zaWduZWQgbG9uZyBwYXJhbSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSAoc3RydWN0IHNvY2sgKilwYXJhbTsKKworCWJoX2xvY2tfc29jayhzayk7CisJbnJfc2soc2spLT5jb25kaXRpb24gJj0gfk5SX0NPTkRfUEVFUl9SWF9CVVNZOworCWJoX3VubG9ja19zb2NrKHNrKTsKK30KKworc3RhdGljIHZvaWQgbnJfaWRsZXRpbWVyX2V4cGlyeSh1bnNpZ25lZCBsb25nIHBhcmFtKQoreworCXN0cnVjdCBzb2NrICpzayA9IChzdHJ1Y3Qgc29jayAqKXBhcmFtOworCXN0cnVjdCBucl9zb2NrICpuciA9IG5yX3NrKHNrKTsKKworCWJoX2xvY2tfc29jayhzayk7CisKKwlucl9jbGVhcl9xdWV1ZXMoc2spOworCisJbnItPm4yY291bnQgPSAwOworCW5yX3dyaXRlX2ludGVybmFsKHNrLCBOUl9ESVNDUkVRKTsKKwluci0+c3RhdGUgPSBOUl9TVEFURV8yOworCisJbnJfc3RhcnRfdDF0aW1lcihzayk7CisJbnJfc3RvcF90MnRpbWVyKHNrKTsKKwlucl9zdG9wX3Q0dGltZXIoc2spOworCisJc2stPnNrX3N0YXRlICAgICA9IFRDUF9DTE9TRTsKKwlzay0+c2tfZXJyICAgICAgID0gMDsKKwlzay0+c2tfc2h1dGRvd24gfD0gU0VORF9TSFVURE9XTjsKKworCWlmICghc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKSB7CisJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX0RFQUQpOworCX0KKwliaF91bmxvY2tfc29jayhzayk7Cit9CisKK3N0YXRpYyB2b2lkIG5yX3QxdGltZXJfZXhwaXJ5KHVuc2lnbmVkIGxvbmcgcGFyYW0pCit7CisJc3RydWN0IHNvY2sgKnNrID0gKHN0cnVjdCBzb2NrICopcGFyYW07CisJc3RydWN0IG5yX3NvY2sgKm5yID0gbnJfc2soc2spOworCisJYmhfbG9ja19zb2NrKHNrKTsKKwlzd2l0Y2ggKG5yLT5zdGF0ZSkgeworCWNhc2UgTlJfU1RBVEVfMToKKwkJaWYgKG5yLT5uMmNvdW50ID09IG5yLT5uMikgeworCQkJbnJfZGlzY29ubmVjdChzaywgRVRJTUVET1VUKTsKKwkJCWJoX3VubG9ja19zb2NrKHNrKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCW5yLT5uMmNvdW50Kys7CisJCQlucl93cml0ZV9pbnRlcm5hbChzaywgTlJfQ09OTlJFUSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE5SX1NUQVRFXzI6CisJCWlmIChuci0+bjJjb3VudCA9PSBuci0+bjIpIHsKKwkJCW5yX2Rpc2Nvbm5lY3Qoc2ssIEVUSU1FRE9VVCk7CisJCQliaF91bmxvY2tfc29jayhzayk7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQluci0+bjJjb3VudCsrOworCQkJbnJfd3JpdGVfaW50ZXJuYWwoc2ssIE5SX0RJU0NSRVEpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBOUl9TVEFURV8zOgorCQlpZiAobnItPm4yY291bnQgPT0gbnItPm4yKSB7CisJCQlucl9kaXNjb25uZWN0KHNrLCBFVElNRURPVVQpOworCQkJYmhfdW5sb2NrX3NvY2soc2spOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJbnItPm4yY291bnQrKzsKKwkJCW5yX3JlcXVldWVfZnJhbWVzKHNrKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlucl9zdGFydF90MXRpbWVyKHNrKTsKKwliaF91bmxvY2tfc29jayhzayk7Cit9CmRpZmYgLS1naXQgYS9uZXQvbmV0cm9tL3N5c2N0bF9uZXRfbmV0cm9tLmMgYi9uZXQvbmV0cm9tL3N5c2N0bF9uZXRfbmV0cm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllZDUwMwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRyb20vc3lzY3RsX25ldF9uZXRyb20uYwpAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2IE1pa2UgU2hhdmVyIChzaGF2ZXJAemVyb2tub3dsZWRnZS5jb20pCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxuZXQvYXgyNS5oPgorI2luY2x1ZGUgPG5ldC9uZXRyb20uaD4KKworLyoKKyAqCVZhbHVlcyB0YWtlbiBmcm9tIE5FVC9ST00gZG9jdW1lbnRhdGlvbi4KKyAqLworc3RhdGljIGludCBtaW5fcXVhbGl0eVtdID0gezB9LCBtYXhfcXVhbGl0eVtdID0gezI1NX07CitzdGF0aWMgaW50IG1pbl9vYnNbXSAgICAgPSB7MH0sIG1heF9vYnNbXSAgICAgPSB7MjU1fTsKK3N0YXRpYyBpbnQgbWluX3R0bFtdICAgICA9IHswfSwgbWF4X3R0bFtdICAgICA9IHsyNTV9Oworc3RhdGljIGludCBtaW5fdDFbXSAgICAgID0gezUgKiBIWn07CitzdGF0aWMgaW50IG1heF90MVtdICAgICAgPSB7NjAwICogSFp9Oworc3RhdGljIGludCBtaW5fbjJbXSAgICAgID0gezJ9LCBtYXhfbjJbXSAgICAgID0gezEyN307CitzdGF0aWMgaW50IG1pbl90MltdICAgICAgPSB7MSAqIEhafTsKK3N0YXRpYyBpbnQgbWF4X3QyW10gICAgICA9IHs2MCAqIEhafTsKK3N0YXRpYyBpbnQgbWluX3Q0W10gICAgICA9IHsxICogSFp9Oworc3RhdGljIGludCBtYXhfdDRbXSAgICAgID0gezEwMDAgKiBIWn07CitzdGF0aWMgaW50IG1pbl93aW5kb3dbXSAgPSB7MX0sIG1heF93aW5kb3dbXSAgPSB7MTI3fTsKK3N0YXRpYyBpbnQgbWluX2lkbGVbXSAgICA9IHswICogSFp9Oworc3RhdGljIGludCBtYXhfaWRsZVtdICAgID0gezY1NTM1ICogSFp9Oworc3RhdGljIGludCBtaW5fcm91dGVbXSAgID0gezB9LCBtYXhfcm91dGVbXSAgID0gezF9Oworc3RhdGljIGludCBtaW5fZmFpbHNbXSAgID0gezF9LCBtYXhfZmFpbHNbXSAgID0gezEwfTsKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpucl90YWJsZV9oZWFkZXI7CisKK3N0YXRpYyBjdGxfdGFibGUgbnJfdGFibGVbXSA9IHsKKyAgICAgICAgeworCQkuY3RsX25hbWUJPSBORVRfTkVUUk9NX0RFRkFVTFRfUEFUSF9RVUFMSVRZLAorCQkucHJvY25hbWUJPSAiZGVmYXVsdF9wYXRoX3F1YWxpdHkiLAorCQkuZGF0YQkJPSAmc3lzY3RsX25ldHJvbV9kZWZhdWx0X3BhdGhfcXVhbGl0eSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl9xdWFsaXR5LAorCQkuZXh0cmEyCQk9ICZtYXhfcXVhbGl0eQorCX0sCisgICAgICAgIHsKKwkJLmN0bF9uYW1lCT0gTkVUX05FVFJPTV9PQlNPTEVTQ0VOQ0VfQ09VTlRfSU5JVElBTElTRVIsCisJCS5wcm9jbmFtZQk9ICJvYnNvbGVzY2VuY2VfY291bnRfaW5pdGlhbGlzZXIiLAorCQkuZGF0YQkJPSAmc3lzY3RsX25ldHJvbV9vYnNvbGVzY2VuY2VfY291bnRfaW5pdGlhbGlzZXIsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisgCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmbWluX29icywKKwkJLmV4dHJhMgkJPSAmbWF4X29icworCX0sCisgICAgICAgIHsKKwkJLmN0bF9uYW1lCT0gTkVUX05FVFJPTV9ORVRXT1JLX1RUTF9JTklUSUFMSVNFUiwKKwkJLnByb2NuYW1lCT0gIm5ldHdvcmtfdHRsX2luaXRpYWxpc2VyIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9uZXRyb21fbmV0d29ya190dGxfaW5pdGlhbGlzZXIsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZtaW5fdHRsLAorCQkuZXh0cmEyCQk9ICZtYXhfdHRsCisJfSwKKyAgICAgICAgeworCQkuY3RsX25hbWUJPSBORVRfTkVUUk9NX1RSQU5TUE9SVF9USU1FT1VULAorCQkucHJvY25hbWUJPSAidHJhbnNwb3J0X3RpbWVvdXQiLAorCQkuZGF0YQkJPSAmc3lzY3RsX25ldHJvbV90cmFuc3BvcnRfdGltZW91dCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl90MSwKKwkJLmV4dHJhMgkJPSAmbWF4X3QxCisJfSwKKyAgICAgICAgeworCQkuY3RsX25hbWUJPSBORVRfTkVUUk9NX1RSQU5TUE9SVF9NQVhJTVVNX1RSSUVTLAorCQkucHJvY25hbWUJPSAidHJhbnNwb3J0X21heGltdW1fdHJpZXMiLAorCQkuZGF0YQkJPSAmc3lzY3RsX25ldHJvbV90cmFuc3BvcnRfbWF4aW11bV90cmllcywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl9uMiwKKwkJLmV4dHJhMgkJPSAmbWF4X24yCisJfSwKKyAgICAgICAgeworCQkuY3RsX25hbWUJPSBORVRfTkVUUk9NX1RSQU5TUE9SVF9BQ0tOT1dMRURHRV9ERUxBWSwKKwkJLnByb2NuYW1lCT0gInRyYW5zcG9ydF9hY2tub3dsZWRnZV9kZWxheSIsCisJCS5kYXRhCQk9ICZzeXNjdGxfbmV0cm9tX3RyYW5zcG9ydF9hY2tub3dsZWRnZV9kZWxheSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl90MiwKKwkJLmV4dHJhMgkJPSAmbWF4X3QyCisJfSwKKyAgICAgICAgeworCQkuY3RsX25hbWUJPSBORVRfTkVUUk9NX1RSQU5TUE9SVF9CVVNZX0RFTEFZLAorCQkucHJvY25hbWUJPSAidHJhbnNwb3J0X2J1c3lfZGVsYXkiLAorCQkuZGF0YQkJPSAmc3lzY3RsX25ldHJvbV90cmFuc3BvcnRfYnVzeV9kZWxheSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl90NCwKKwkJLmV4dHJhMgkJPSAmbWF4X3Q0CisJfSwKKyAgICAgICAgeworCQkuY3RsX25hbWUJPSBORVRfTkVUUk9NX1RSQU5TUE9SVF9SRVFVRVNURURfV0lORE9XX1NJWkUsCisJCS5wcm9jbmFtZQk9ICJ0cmFuc3BvcnRfcmVxdWVzdGVkX3dpbmRvd19zaXplIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9uZXRyb21fdHJhbnNwb3J0X3JlcXVlc3RlZF93aW5kb3dfc2l6ZSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl93aW5kb3csCisJCS5leHRyYTIJCT0gJm1heF93aW5kb3cKKwl9LAorICAgICAgICB7CisJCS5jdGxfbmFtZQk9IE5FVF9ORVRST01fVFJBTlNQT1JUX05PX0FDVElWSVRZX1RJTUVPVVQsCisJCS5wcm9jbmFtZQk9ICJ0cmFuc3BvcnRfbm9fYWN0aXZpdHlfdGltZW91dCIsCisJCS5kYXRhCQk9ICZzeXNjdGxfbmV0cm9tX3RyYW5zcG9ydF9ub19hY3Rpdml0eV90aW1lb3V0LAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmbWluX2lkbGUsCisJCS5leHRyYTIJCT0gJm1heF9pZGxlCisJfSwKKyAgICAgICAgeworCQkuY3RsX25hbWUJPSBORVRfTkVUUk9NX1JPVVRJTkdfQ09OVFJPTCwKKwkJLnByb2NuYW1lCT0gInJvdXRpbmdfY29udHJvbCIsCisJCS5kYXRhCQk9ICZzeXNjdGxfbmV0cm9tX3JvdXRpbmdfY29udHJvbCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl9yb3V0ZSwKKwkJLmV4dHJhMgkJPSAmbWF4X3JvdXRlCisJfSwKKyAgICAgICAgeworCQkuY3RsX25hbWUJPSBORVRfTkVUUk9NX0xJTktfRkFJTFNfQ09VTlQsCisJCS5wcm9jbmFtZQk9ICJsaW5rX2ZhaWxzX2NvdW50IiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9uZXRyb21fbGlua19mYWlsc19jb3VudCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl9mYWlscywKKwkJLmV4dHJhMgkJPSAmbWF4X2ZhaWxzCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIGN0bF90YWJsZSBucl9kaXJfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9ORVRST00sCisJCS5wcm9jbmFtZQk9ICJuZXRyb20iLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gbnJfdGFibGUKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCitzdGF0aWMgY3RsX3RhYmxlIG5yX3Jvb3RfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9ORVQsCisJCS5wcm9jbmFtZQk9ICJuZXQiLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gbnJfZGlyX3RhYmxlCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKwordm9pZCBfX2luaXQgbnJfcmVnaXN0ZXJfc3lzY3RsKHZvaWQpCit7CisJbnJfdGFibGVfaGVhZGVyID0gcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKG5yX3Jvb3RfdGFibGUsIDEpOworfQorCit2b2lkIG5yX3VucmVnaXN0ZXJfc3lzY3RsKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUobnJfdGFibGVfaGVhZGVyKTsKK30KZGlmZiAtLWdpdCBhL25ldC9ub25ldC5jIGIvbmV0L25vbmV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUyNDFkYwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9ub25ldC5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBuZXQvbm9uZXQuYworICoKKyAqIER1bW15IGZ1bmN0aW9ucyB0byBhbGxvdyB1cyB0byBjb25maWd1cmUgbmV0d29yayBzdXBwb3J0IGVudGlyZWx5CisgKiBvdXQgb2YgdGhlIGtlcm5lbC4KKyAqCisgKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdmVyc2lvbiAyLgorICogQ29weXJpZ2h0IChjKSBNYXR0aGV3IFdpbGNveCAyMDAzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKK3ZvaWQgX19pbml0IHNvY2tfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIkxpbnV4IE5vTkVUMS4wIGZvciBMaW51eCAyLjZcbiIpOworfQorCitzdGF0aWMgaW50IHNvY2tfbm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlycmVsZXZhbnQsIHN0cnVjdCBmaWxlICpkb250Y2FyZSkKK3sKKwlyZXR1cm4gLUVOWElPOworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJhZF9zb2NrX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBzb2NrX25vX29wZW4sCit9OwpkaWZmIC0tZ2l0IGEvbmV0L3BhY2tldC9NYWtlZmlsZSBiL25ldC9wYWNrZXQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODExODNlYQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9wYWNrZXQvTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgcGFja2V0IEFGLgorIworCitvYmotJChDT05GSUdfUEFDS0VUKSArPSBhZl9wYWNrZXQubwpkaWZmIC0tZ2l0IGEvbmV0L3BhY2tldC9hZl9wYWNrZXQuYyBiL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRhY2VhMAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKQEAgLTAsMCArMSwxOTA3IEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCVBBQ0tFVCAtIGltcGxlbWVudHMgcmF3IHBhY2tldCBzb2NrZXRzLgorICoKKyAqIFZlcnNpb246CSRJZDogYWZfcGFja2V0LmMsdiAxLjYxIDIwMDIvMDIvMDggMDM6NTc6MTkgZGF2ZW0gRXhwICQKKyAqCisgKiBBdXRob3JzOglSb3NzIEJpcm8sIDxiaXI3QGxlbGFuZC5TdGFuZm9yZC5FZHU+CisgKgkJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgkJQWxhbiBDb3gsIDxndzRwdHNAZ3c0cHRzLmFtcHIub3JnPgorICoKKyAqIEZpeGVzOgkKKyAqCQlBbGFuIENveAk6CXZlcmlmeV9hcmVhKCkgbm93IHVzZWQgY29ycmVjdGx5CisgKgkJQWxhbiBDb3gJOgluZXcgc2tidWZmIGxpc3RzLCBsb29rIG1hIG5vIGJhY2tsb2dzIQorICoJCUFsYW4gQ294CToJdGlkaWVkIHNrYnVmZiBsaXN0cy4KKyAqCQlBbGFuIENveAk6CU5vdyB1c2VzIGdlbmVyaWMgZGF0YWdyYW0gcm91dGluZXMgSQorICoJCQkJCWFkZGVkLiBBbHNvIGZpeGVkIHRoZSBwZWVrL3JlYWQgY3Jhc2gKKyAqCQkJCQlmcm9tIGFsbCBvbGQgTGludXggZGF0YWdyYW0gY29kZS4KKyAqCQlBbGFuIENveAk6CVVzZXMgdGhlIGltcHJvdmVkIGRhdGFncmFtIGNvZGUuCisgKgkJQWxhbiBDb3gJOglBZGRlZCBOVUxMJ3MgZm9yIHNvY2tldCBvcHRpb25zLgorICoJCUFsYW4gQ294CToJUmUtY29tbWVudGVkIHRoZSBjb2RlLgorICoJCUFsYW4gQ294CToJVXNlIG5ldyBrZXJuZWwgc2lkZSBhZGRyZXNzaW5nCisgKgkJUm9iIEphbnNzZW4JOglDb3JyZWN0IE1UVSB1c2FnZS4KKyAqCQlEYXZlIFBsYXR0CToJQ291bnRlciBsZWFrcyBjYXVzZWQgYnkgaW5jb3JyZWN0CisgKgkJCQkJaW50ZXJydXB0IGxvY2tpbmcgYW5kIHNvbWUgc2xpZ2h0bHkKKyAqCQkJCQlkdWJpb3VzIGdjYyBvdXRwdXQuIENhbiB5b3UgcmVhZAorICoJCQkJCWNvbXBpbGVyOiBpdCBzYWlkIF9WT0xBVElMRV8KKyAqCVJpY2hhcmQgS29vaWptYW4JOglUaW1lc3RhbXAgZml4ZXMuCisgKgkJQWxhbiBDb3gJOglOZXcgYnVmZmVycy4gVXNlIHNrLT5tYWMucmF3LgorICoJCUFsYW4gQ294CToJc2VuZG1zZy9yZWN2bXNnIHN1cHBvcnQuCisgKgkJQWxhbiBDb3gJOglQcm90b2NvbCBzZXR0aW5nIHN1cHBvcnQKKyAqCUFsZXhleSBLdXpuZXRzb3YJOglVbnRpZWQgZnJvbSBJUHY0IHN0YWNrLgorICoJQ3lydXMgRHVyZ2luCQk6CUZpeGVkIGtlcm5lbGQgZm9yIGttb2QuCisgKglNaWNoYWwgT3N0cm93c2tpICAgICAgICA6ICAgICAgIE1vZHVsZSBpbml0aWFsaXphdGlvbiBjbGVhbnVwLgorICogICAgICAgICBVbGlzZXMgQWxvbnNvICAgICAgICA6ICAgICAgIEZyYW1lIG51bWJlciBsaW1pdCByZW1vdmFsIGFuZCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXRfc2V0X3JpbmcgbWVtb3J5IGxlYWsuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisgCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9wYWNrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaWZkZWYgQ09ORklHX0lORVQKKyNpbmNsdWRlIDxuZXQvaW5ldF9jb21tb24uaD4KKyNlbmRpZgorCisjZGVmaW5lIENPTkZJR19TT0NLX1BBQ0tFVAkxCisKKy8qCisgICBQcm9wb3NlZCByZXBsYWNlbWVudCBmb3IgU0lPQ3tBREQsREVMfU1VTFRJIGFuZAorICAgSUZGX1BST01JU0MsIElGRl9BTExNVUxUSSBmbGFncy4KKworICAgSXQgaXMgbW9yZSBleHBlbnNpdmUsIGJ1dCBJIGJlbGlldmUsCisgICBpdCBpcyByZWFsbHkgY29ycmVjdCBzb2x1dGlvbjogcmVlbnRlcmVibGUsIHNhZmUgYW5kIGZhdWx0IHRvbGVyYW50LgorCisgICBJRkZfUFJPTUlTQy9JRkZfQUxMTVVMVEkvU0lPQ3tBREQvREVMfU1VTFRJIGFyZSBmYWtlZCBieSBrZWVwaW5nCisgICByZWZlcmVuY2UgY291bnQgYW5kIGdsb2JhbCBmbGFnLCBzbyB0aGF0IHJlYWwgc3RhdHVzIGlzCisgICAoZ2ZsYWd8KGNvdW50ICE9IDApKSwgc28gdGhhdCB3ZSBjYW4gdXNlIG9ic29sZXRlIGZhdWx0eSBpbnRlcmZhY2UKKyAgIG5vdCBoYXJtaW5nIGNsZXZlciB1c2Vycy4KKyAqLworI2RlZmluZSBDT05GSUdfUEFDS0VUX01VTFRJQ0FTVAkxCisKKy8qCisgICBBc3N1bXB0aW9uczoKKyAgIC0gaWYgZGV2aWNlIGhhcyBubyBkZXYtPmhhcmRfaGVhZGVyIHJvdXRpbmUsIGl0IGFkZHMgYW5kIHJlbW92ZXMgbGwgaGVhZGVyCisgICAgIGluc2lkZSBpdHNlbGYuIEluIHRoaXMgY2FzZSBsbCBoZWFkZXIgaXMgaW52aXNpYmxlIG91dHNpZGUgb2YgZGV2aWNlLAorICAgICBidXQgaGlnaGVyIGxldmVscyBzdGlsbCBzaG91bGQgcmVzZXJ2ZSBkZXYtPmhhcmRfaGVhZGVyX2xlbi4KKyAgICAgU29tZSBkZXZpY2VzIGFyZSBlbm91Z2ggY2xldmVyIHRvIHJlYWxsb2NhdGUgc2tiLCB3aGVuIGhlYWRlcgorICAgICB3aWxsIG5vdCBmaXQgdG8gcmVzZXJ2ZWQgc3BhY2UgKHR1bm5lbCksIGFub3RoZXIgb25lcyBhcmUgc2lsbHkKKyAgICAgKFBQUCkuCisgICAtIHBhY2tldCBzb2NrZXQgcmVjZWl2ZXMgcGFja2V0cyB3aXRoIHB1bGxlZCBsbCBoZWFkZXIsCisgICAgIHNvIHRoYXQgU09DS19SQVcgc2hvdWxkIHB1c2ggaXQgYmFjay4KKworT24gcmVjZWl2ZToKKy0tLS0tLS0tLS0tCisKK0luY29taW5nLCBkZXYtPmhhcmRfaGVhZGVyIT1OVUxMCisgICBtYWMucmF3IC0+IGxsIGhlYWRlcgorICAgZGF0YSAgICAtPiBkYXRhCisKK091dGdvaW5nLCBkZXYtPmhhcmRfaGVhZGVyIT1OVUxMCisgICBtYWMucmF3IC0+IGxsIGhlYWRlcgorICAgZGF0YSAgICAtPiBsbCBoZWFkZXIKKworSW5jb21pbmcsIGRldi0+aGFyZF9oZWFkZXI9PU5VTEwKKyAgIG1hYy5yYXcgLT4gVU5LTk9XTiBwb3NpdGlvbi4gSXQgaXMgdmVyeSBsaWtlbHksIHRoYXQgaXQgcG9pbnRzIHRvIGxsIGhlYWRlci4KKyAgICAgICAgICAgICAgUFBQIG1ha2VzIGl0LCB0aGF0IGlzIHdyb25nLCBiZWNhdXNlIGludHJvZHVjZSBhc3N5bWV0cnkKKwkgICAgICBiZXR3ZWVuIHJ4IGFuZCB0eCBwYXRocy4KKyAgIGRhdGEgICAgLT4gZGF0YQorCitPdXRnb2luZywgZGV2LT5oYXJkX2hlYWRlcj09TlVMTAorICAgbWFjLnJhdyAtPiBkYXRhLiBsbCBoZWFkZXIgaXMgc3RpbGwgbm90IGJ1aWx0IQorICAgZGF0YSAgICAtPiBkYXRhCisKK1Jlc3VtZQorICBJZiBkZXYtPmhhcmRfaGVhZGVyPT1OVUxMIHdlIGFyZSB1bmxpa2VseSB0byByZXN0b3JlIHNlbnNpYmxlIGxsIGhlYWRlci4KKworCitPbiB0cmFuc21pdDoKKy0tLS0tLS0tLS0tLQorCitkZXYtPmhhcmRfaGVhZGVyICE9IE5VTEwKKyAgIG1hYy5yYXcgLT4gbGwgaGVhZGVyCisgICBkYXRhICAgIC0+IGxsIGhlYWRlcgorCitkZXYtPmhhcmRfaGVhZGVyID09IE5VTEwgKGxsIGhlYWRlciBpcyBhZGRlZCBieSBkZXZpY2UsIHdlIGNhbm5vdCBjb250cm9sIGl0KQorICAgbWFjLnJhdyAtPiBkYXRhCisgICBkYXRhIC0+IGRhdGEKKworICAgV2Ugc2hvdWxkIHNldCBuaC5yYXcgb24gb3V0cHV0IHRvIGNvcnJlY3QgcG9zaXN0aW9uLAorICAgcGFja2V0IGNsYXNzaWZpZXIgZGVwZW5kcyBvbiBpdC4KKyAqLworCisvKiBMaXN0IG9mIGFsbCBwYWNrZXQgc29ja2V0cy4gKi8KK3N0YXRpYyBITElTVF9IRUFEKHBhY2tldF9za2xpc3QpOworc3RhdGljIERFRklORV9SV0xPQ0socGFja2V0X3NrbGlzdF9sb2NrKTsKKworc3RhdGljIGF0b21pY190IHBhY2tldF9zb2Nrc19ucjsKKworCisvKiBQcml2YXRlIHBhY2tldCBzb2NrZXQgc3RydWN0dXJlcy4gKi8KKworI2lmZGVmIENPTkZJR19QQUNLRVRfTVVMVElDQVNUCitzdHJ1Y3QgcGFja2V0X21jbGlzdAoreworCXN0cnVjdCBwYWNrZXRfbWNsaXN0CSpuZXh0OworCWludAkJCWlmaW5kZXg7CisJaW50CQkJY291bnQ7CisJdW5zaWduZWQgc2hvcnQJCXR5cGU7CisJdW5zaWduZWQgc2hvcnQJCWFsZW47CisJdW5zaWduZWQgY2hhcgkJYWRkcls4XTsKK307CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUEFDS0VUX01NQVAKK3N0YXRpYyBpbnQgcGFja2V0X3NldF9yaW5nKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRwYWNrZXRfcmVxICpyZXEsIGludCBjbG9zaW5nKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBwYWNrZXRfZmx1c2hfbWNsaXN0KHN0cnVjdCBzb2NrICpzayk7CisKK3N0cnVjdCBwYWNrZXRfc29jayB7CisJLyogc3RydWN0IHNvY2sgaGFzIHRvIGJlIHRoZSBmaXJzdCBtZW1iZXIgb2YgcGFja2V0X3NvY2sgKi8KKwlzdHJ1Y3Qgc29jawkJc2s7CisJc3RydWN0IHRwYWNrZXRfc3RhdHMJc3RhdHM7CisjaWZkZWYgQ09ORklHX1BBQ0tFVF9NTUFQCisJY2hhciAqCQkJKnBnX3ZlYzsKKwl1bnNpZ25lZCBpbnQJCWhlYWQ7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgZnJhbWVzX3Blcl9ibG9jazsKKwl1bnNpZ25lZCBpbnQJCWZyYW1lX3NpemU7CisJdW5zaWduZWQgaW50CQlmcmFtZV9tYXg7CisJaW50CQkJY29weV90aHJlc2g7CisjZW5kaWYKKwlzdHJ1Y3QgcGFja2V0X3R5cGUJcHJvdF9ob29rOworCXNwaW5sb2NrX3QJCWJpbmRfbG9jazsKKwljaGFyCQkJcnVubmluZzsJLyogcHJvdF9ob29rIGlzIGF0dGFjaGVkKi8KKwlpbnQJCQlpZmluZGV4OwkvKiBib3VuZCBkZXZpY2UJCSovCisJdW5zaWduZWQgc2hvcnQJCW51bTsKKyNpZmRlZiBDT05GSUdfUEFDS0VUX01VTFRJQ0FTVAorCXN0cnVjdCBwYWNrZXRfbWNsaXN0CSptY2xpc3Q7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUEFDS0VUX01NQVAKKwlhdG9taWNfdAkJbWFwcGVkOworCXVuc2lnbmVkIGludCAgICAgICAgICAgIHBnX3ZlY19vcmRlcjsKKwl1bnNpZ25lZCBpbnQJCXBnX3ZlY19wYWdlczsKKwl1bnNpZ25lZCBpbnQJCXBnX3ZlY19sZW47CisjZW5kaWYKK307CisKKyNpZmRlZiBDT05GSUdfUEFDS0VUX01NQVAKKworc3RhdGljIGlubGluZSBjaGFyICpwYWNrZXRfbG9va3VwX2ZyYW1lKHN0cnVjdCBwYWNrZXRfc29jayAqcG8sIHVuc2lnbmVkIGludCBwb3NpdGlvbikKK3sKKwl1bnNpZ25lZCBpbnQgcGdfdmVjX3BvcywgZnJhbWVfb2Zmc2V0OworCWNoYXIgKmZyYW1lOworCisJcGdfdmVjX3BvcyA9IHBvc2l0aW9uIC8gcG8tPmZyYW1lc19wZXJfYmxvY2s7CisJZnJhbWVfb2Zmc2V0ID0gcG9zaXRpb24gJSBwby0+ZnJhbWVzX3Blcl9ibG9jazsKKworCWZyYW1lID0gcG8tPnBnX3ZlY1twZ192ZWNfcG9zXSArIChmcmFtZV9vZmZzZXQgKiBwby0+ZnJhbWVfc2l6ZSk7CisJCisJcmV0dXJuIGZyYW1lOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBhY2tldF9zb2NrICpwa3Rfc2soc3RydWN0IHNvY2sgKnNrKQoreworCXJldHVybiAoc3RydWN0IHBhY2tldF9zb2NrICopc2s7Cit9CisKK3N0YXRpYyB2b2lkIHBhY2tldF9zb2NrX2Rlc3RydWN0KHN0cnVjdCBzb2NrICpzaykKK3sKKwlCVUdfVFJBUCghYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSk7CisJQlVHX1RSQVAoIWF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYykpOworCisJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpIHsKKwkJcHJpbnRrKCJBdHRlbXB0IHRvIHJlbGVhc2UgYWxpdmUgcGFja2V0IHNvY2tldDogJXBcbiIsIHNrKTsKKwkJcmV0dXJuOworCX0KKworCWF0b21pY19kZWMoJnBhY2tldF9zb2Nrc19ucik7CisjaWZkZWYgUEFDS0VUX1JFRkNOVF9ERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJQQUNLRVQgc29ja2V0ICVwIGlzIGZyZWUsICVkIGFyZSBhbGl2ZVxuIiwgc2ssIGF0b21pY19yZWFkKCZwYWNrZXRfc29ja3NfbnIpKTsKKyNlbmRpZgorfQorCisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIHBhY2tldF9vcHM7CisKKyNpZmRlZiBDT05GSUdfU09DS19QQUNLRVQKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIHBhY2tldF9vcHNfc3BrdDsKKworc3RhdGljIGludCBwYWNrZXRfcmN2X3Nwa3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgIHN0cnVjdCBwYWNrZXRfdHlwZSAqcHQpCit7CisJc3RydWN0IHNvY2sgKnNrOworCXN0cnVjdCBzb2NrYWRkcl9wa3QgKnNwa3Q7CisKKwkvKgorCSAqCVdoZW4gd2UgcmVnaXN0ZXJlZCB0aGUgcHJvdG9jb2wgd2Ugc2F2ZWQgdGhlIHNvY2tldCBpbiB0aGUgZGF0YQorCSAqCWZpZWxkIGZvciBqdXN0IHRoaXMgZXZlbnQuCisJICovCisKKwlzayA9IHB0LT5hZl9wYWNrZXRfcHJpdjsKKwkKKwkvKgorCSAqCVlhbmsgYmFjayB0aGUgaGVhZGVycyBbaG9wZSB0aGUgZGV2aWNlIHNldCB0aGlzCisJICoJcmlnaHQgb3Iga2VyYm9vbS4uLl0KKwkgKgorCSAqCUluY29taW5nIHBhY2tldHMgaGF2ZSBsbCBoZWFkZXIgcHVsbGVkLAorCSAqCXB1c2ggaXQgYmFjay4KKwkgKgorCSAqCUZvciBvdXRnb2luZyBvbmVzIHNrYi0+ZGF0YSA9PSBza2ItPm1hYy5yYXcKKwkgKglzbyB0aGF0IHRoaXMgcHJvY2VkdXJlIGlzIG5vb3AuCisJICovCisKKwlpZiAoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfTE9PUEJBQ0spCisJCWdvdG8gb3V0OworCisJaWYgKChza2IgPSBza2Jfc2hhcmVfY2hlY2soc2tiLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwkJZ290byBvb207CisKKwkvKiBkcm9wIGFueSByb3V0aW5nIGluZm8gKi8KKwlkc3RfcmVsZWFzZShza2ItPmRzdCk7CisJc2tiLT5kc3QgPSBOVUxMOworCisJc3BrdCA9IChzdHJ1Y3Qgc29ja2FkZHJfcGt0Kilza2ItPmNiOworCisJc2tiX3B1c2goc2tiLCBza2ItPmRhdGEtc2tiLT5tYWMucmF3KTsKKworCS8qCisJICoJVGhlIFNPQ0tfUEFDS0VUIHNvY2tldCByZWNlaXZlcyBfYWxsXyBmcmFtZXMuCisJICovCisKKwlzcGt0LT5zcGt0X2ZhbWlseSA9IGRldi0+dHlwZTsKKwlzdHJsY3B5KHNwa3QtPnNwa3RfZGV2aWNlLCBkZXYtPm5hbWUsIHNpemVvZihzcGt0LT5zcGt0X2RldmljZSkpOworCXNwa3QtPnNwa3RfcHJvdG9jb2wgPSBza2ItPnByb3RvY29sOworCisJLyoKKwkgKglDaGFyZ2UgdGhlIG1lbW9yeSB0byB0aGUgc29ja2V0LiBUaGlzIGlzIGRvbmUgc3BlY2lmaWNhbGx5CisJICoJdG8gcHJldmVudCBzb2NrZXRzIHVzaW5nIGFsbCB0aGUgbWVtb3J5IHVwLgorCSAqLworCisJaWYgKHNvY2tfcXVldWVfcmN2X3NrYihzayxza2IpID09IDApCisJCXJldHVybiAwOworCitvdXQ6CisJa2ZyZWVfc2tiKHNrYik7Citvb206CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqCU91dHB1dCBhIHJhdyBwYWNrZXQgdG8gYSBkZXZpY2UgbGF5ZXIuIFRoaXMgYnlwYXNzZXMgYWxsIHRoZSBvdGhlcgorICoJcHJvdG9jb2wgbGF5ZXJzIGFuZCB5b3UgbXVzdCB0aGVyZWZvcmUgc3VwcGx5IGl0IHdpdGggYSBjb21wbGV0ZSBmcmFtZQorICovCisgCitzdGF0aWMgaW50IHBhY2tldF9zZW5kbXNnX3Nwa3Qoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJICAgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgc29ja2FkZHJfcGt0ICpzYWRkcj0oc3RydWN0IHNvY2thZGRyX3BrdCAqKW1zZy0+bXNnX25hbWU7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXVuc2lnbmVkIHNob3J0IHByb3RvPTA7CisJaW50IGVycjsKKwkKKwkvKgorCSAqCUdldCBhbmQgdmVyaWZ5IHRoZSBhZGRyZXNzLiAKKwkgKi8KKworCWlmIChzYWRkcikKKwl7CisJCWlmIChtc2ctPm1zZ19uYW1lbGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpCisJCQlyZXR1cm4oLUVJTlZBTCk7CisJCWlmIChtc2ctPm1zZ19uYW1lbGVuPT1zaXplb2Yoc3RydWN0IHNvY2thZGRyX3BrdCkpCisJCQlwcm90bz1zYWRkci0+c3BrdF9wcm90b2NvbDsKKwl9CisJZWxzZQorCQlyZXR1cm4oLUVOT1RDT05OKTsJLyogU09DS19QQUNLRVQgbXVzdCBiZSBzZW50IGdpdmluZyBhbiBhZGRyZXNzICovCisKKwkvKgorCSAqCUZpbmQgdGhlIGRldmljZSBmaXJzdCB0byBzaXplIGNoZWNrIGl0IAorCSAqLworCisJc2FkZHItPnNwa3RfZGV2aWNlWzEzXSA9IDA7CisJZGV2ID0gZGV2X2dldF9ieV9uYW1lKHNhZGRyLT5zcGt0X2RldmljZSk7CisJZXJyID0gLUVOT0RFVjsKKwlpZiAoZGV2ID09IE5VTEwpCisJCWdvdG8gb3V0X3VubG9jazsKKwkKKwkvKgorCSAqCVlvdSBtYXkgbm90IHF1ZXVlIGEgZnJhbWUgYmlnZ2VyIHRoYW4gdGhlIG10dS4gVGhpcyBpcyB0aGUgbG93ZXN0IGxldmVsCisJICoJcmF3IHByb3RvY29sIGFuZCB5b3UgbXVzdCBkbyB5b3VyIG93biBmcmFnbWVudGF0aW9uIGF0IHRoaXMgbGV2ZWwuCisJICovCisJIAorCWVyciA9IC1FTVNHU0laRTsKKyAJaWYobGVuPmRldi0+bXR1K2Rldi0+aGFyZF9oZWFkZXJfbGVuKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwllcnIgPSAtRU5PQlVGUzsKKwlza2IgPSBzb2NrX3dtYWxsb2Moc2ssIGxlbiArIExMX1JFU0VSVkVEX1NQQUNFKGRldiksIDAsIEdGUF9LRVJORUwpOworCisJLyoKKwkgKglJZiB0aGUgd3JpdGUgYnVmZmVyIGlzIGZ1bGwsIHRoZW4gdG91Z2guIEF0IHRoaXMgbGV2ZWwgdGhlIHVzZXIgZ2V0cyB0bworCSAqCWRlYWwgd2l0aCB0aGUgcHJvYmxlbSAtIGRvIHlvdXIgb3duIGFsZ29yaXRobWljIGJhY2tvZmZzLiBUaGF0J3MgZmFyCisJICoJbW9yZSBmbGV4aWJsZS4KKwkgKi8KKwkgCisJaWYgKHNrYiA9PSBOVUxMKSAKKwkJZ290byBvdXRfdW5sb2NrOworCisJLyoKKwkgKglGaWxsIGl0IGluIAorCSAqLworCSAKKwkvKiBGSVhNRTogU2F2ZSBzb21lIHNwYWNlIGZvciBicm9rZW4gZHJpdmVycyB0aGF0IHdyaXRlIGEKKwkgKiBoYXJkIGhlYWRlciBhdCB0cmFuc21pc3Npb24gdGltZSBieSB0aGVtc2VsdmVzLiBQUFAgaXMgdGhlCisJICogbm90YWJsZSBvbmUgaGVyZS4gVGhpcyBzaG91bGQgcmVhbGx5IGJlIGZpeGVkIGF0IHRoZSBkcml2ZXIgbGV2ZWwuCisJICovCisJc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKKwlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKworCS8qIFRyeSB0byBhbGlnbiBkYXRhIHBhcnQgY29ycmVjdGx5ICovCisJaWYgKGRldi0+aGFyZF9oZWFkZXIpIHsKKwkJc2tiLT5kYXRhIC09IGRldi0+aGFyZF9oZWFkZXJfbGVuOworCQlza2ItPnRhaWwgLT0gZGV2LT5oYXJkX2hlYWRlcl9sZW47CisJCWlmIChsZW4gPCBkZXYtPmhhcmRfaGVhZGVyX2xlbikKKwkJCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCX0KKworCS8qIFJldHVybnMgLUVGQVVMVCBvbiBlcnJvciAqLworCWVyciA9IG1lbWNweV9mcm9taW92ZWMoc2tiX3B1dChza2IsbGVuKSwgbXNnLT5tc2dfaW92LCBsZW4pOworCXNrYi0+cHJvdG9jb2wgPSBwcm90bzsKKwlza2ItPmRldiA9IGRldjsKKwlza2ItPnByaW9yaXR5ID0gc2stPnNrX3ByaW9yaXR5OworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwllcnIgPSAtRU5FVERPV047CisJaWYgKCEoZGV2LT5mbGFncyAmIElGRl9VUCkpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwkvKgorCSAqCU5vdyBzZW5kIGl0CisJICovCisKKwlkZXZfcXVldWVfeG1pdChza2IpOworCWRldl9wdXQoZGV2KTsKKwlyZXR1cm4obGVuKTsKKworb3V0X2ZyZWU6CisJa2ZyZWVfc2tiKHNrYik7CitvdXRfdW5sb2NrOgorCWlmIChkZXYpCisJCWRldl9wdXQoZGV2KTsKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgcnVuX2ZpbHRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIHJlcykKK3sKKwlzdHJ1Y3Qgc2tfZmlsdGVyICpmaWx0ZXI7CisKKwliaF9sb2NrX3NvY2soc2spOworCWZpbHRlciA9IHNrLT5za19maWx0ZXI7CisJLyoKKwkgKiBPdXIgY2FsbGVyIGFscmVhZHkgY2hlY2tlZCB0aGF0IGZpbHRlciAhPSBOVUxMIGJ1dCB3ZSBuZWVkIHRvCisJICogdmVyaWZ5IHRoYXQgdW5kZXIgYmhfbG9ja19zb2NrKCkgdG8gYmUgc2FmZQorCSAqLworCWlmIChsaWtlbHkoZmlsdGVyICE9IE5VTEwpKQorCQlyZXMgPSBza19ydW5fZmlsdGVyKHNrYiwgZmlsdGVyLT5pbnNucywgZmlsdGVyLT5sZW4pOworCWJoX3VubG9ja19zb2NrKHNrKTsKKworCXJldHVybiByZXM7Cit9CisKKy8qCisgICBUaGlzIGZ1bmN0aW9uIG1ha2VzIGxhenkgc2tiIGNsb25pbmcgaW4gaG9wZSB0aGF0IG1vc3Qgb2YgcGFja2V0cworICAgYXJlIGRpc2NhcmRlZCBieSBCUEYuCisKKyAgIE5vdGUgdHJpY2t5IHBhcnQ6IHdlIERPIG1hbmdsZSBzaGFyZWQgc2tiISBza2ItPmRhdGEsIHNrYi0+bGVuCisgICBhbmQgc2tiLT5jYiBhcmUgbWFuZ2xlZC4gSXQgd29ya3MgYmVjYXVzZSAoYW5kIHVudGlsKSBwYWNrZXRzCisgICBmYWxsaW5nIGhlcmUgYXJlIG93bmVkIGJ5IGN1cnJlbnQgQ1BVLiBPdXRwdXQgcGFja2V0cyBhcmUgY2xvbmVkCisgICBieSBkZXZfcXVldWVfeG1pdF9uaXQoKSwgaW5wdXQgcGFja2V0cyBhcmUgcHJvY2Vzc2VkIGJ5IG5ldF9iaAorICAgc2VxdWVuY2lhbGx5LCBzbyB0aGF0IGlmIHdlIHJldHVybiBza2IgdG8gb3JpZ2luYWwgc3RhdGUgb24gZXhpdCwKKyAgIHdlIHdpbGwgbm90IGhhcm0gYW55b25lLgorICovCisKK3N0YXRpYyBpbnQgcGFja2V0X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCAgc3RydWN0IHBhY2tldF90eXBlICpwdCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IHNvY2thZGRyX2xsICpzbGw7CisJc3RydWN0IHBhY2tldF9zb2NrICpwbzsKKwl1OCAqIHNrYl9oZWFkID0gc2tiLT5kYXRhOworCWludCBza2JfbGVuID0gc2tiLT5sZW47CisJdW5zaWduZWQgc25hcGxlbjsKKworCWlmIChza2ItPnBrdF90eXBlID09IFBBQ0tFVF9MT09QQkFDSykKKwkJZ290byBkcm9wOworCisJc2sgPSBwdC0+YWZfcGFja2V0X3ByaXY7CisJcG8gPSBwa3Rfc2soc2spOworCisJc2tiLT5kZXYgPSBkZXY7CisKKwlpZiAoZGV2LT5oYXJkX2hlYWRlcikgeworCQkvKiBUaGUgZGV2aWNlIGhhcyBhbiBleHBsaWNpdCBub3Rpb24gb2YgbGwgaGVhZGVyLAorCQkgICBleHBvcnRlZCB0byBoaWdoZXIgbGV2ZWxzLgorCisJCSAgIE90aGVyd2lzZSwgdGhlIGRldmljZSBoaWRlcyBkYXRhaWxzIG9mIGl0IGZyYW1lCisJCSAgIHN0cnVjdHVyZSwgc28gdGhhdCBjb3JyZXNwb25kaW5nIHBhY2tldCBoZWFkCisJCSAgIG5ldmVyIGRlbGl2ZXJlZCB0byB1c2VyLgorCQkgKi8KKwkJaWYgKHNrLT5za190eXBlICE9IFNPQ0tfREdSQU0pCisJCQlza2JfcHVzaChza2IsIHNrYi0+ZGF0YSAtIHNrYi0+bWFjLnJhdyk7CisJCWVsc2UgaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09VVEdPSU5HKSB7CisJCQkvKiBTcGVjaWFsIGNhc2U6IG91dGdvaW5nIHBhY2tldHMgaGF2ZSBsbCBoZWFkZXIgYXQgaGVhZCAqLworCQkJc2tiX3B1bGwoc2tiLCBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YSk7CisJCX0KKwl9CisKKwlzbmFwbGVuID0gc2tiLT5sZW47CisKKwlpZiAoc2stPnNrX2ZpbHRlcikgeworCQl1bnNpZ25lZCByZXMgPSBydW5fZmlsdGVyKHNrYiwgc2ssIHNuYXBsZW4pOworCQlpZiAocmVzID09IDApCisJCQlnb3RvIGRyb3Bfbl9yZXN0b3JlOworCQlpZiAoc25hcGxlbiA+IHJlcykKKwkJCXNuYXBsZW4gPSByZXM7CisJfQorCisJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgKyBza2ItPnRydWVzaXplID49CisJICAgICh1bnNpZ25lZClzay0+c2tfcmN2YnVmKQorCQlnb3RvIGRyb3Bfbl9hY2N0OworCisJaWYgKHNrYl9zaGFyZWQoc2tiKSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCQlpZiAobnNrYiA9PSBOVUxMKQorCQkJZ290byBkcm9wX25fYWNjdDsKKworCQlpZiAoc2tiX2hlYWQgIT0gc2tiLT5kYXRhKSB7CisJCQlza2ItPmRhdGEgPSBza2JfaGVhZDsKKwkJCXNrYi0+bGVuID0gc2tiX2xlbjsKKwkJfQorCQlrZnJlZV9za2Ioc2tiKTsKKwkJc2tiID0gbnNrYjsKKwl9CisKKwlzbGwgPSAoc3RydWN0IHNvY2thZGRyX2xsKilza2ItPmNiOworCXNsbC0+c2xsX2ZhbWlseSA9IEFGX1BBQ0tFVDsKKwlzbGwtPnNsbF9oYXR5cGUgPSBkZXYtPnR5cGU7CisJc2xsLT5zbGxfcHJvdG9jb2wgPSBza2ItPnByb3RvY29sOworCXNsbC0+c2xsX3BrdHR5cGUgPSBza2ItPnBrdF90eXBlOworCXNsbC0+c2xsX2lmaW5kZXggPSBkZXYtPmlmaW5kZXg7CisJc2xsLT5zbGxfaGFsZW4gPSAwOworCisJaWYgKGRldi0+aGFyZF9oZWFkZXJfcGFyc2UpCisJCXNsbC0+c2xsX2hhbGVuID0gZGV2LT5oYXJkX2hlYWRlcl9wYXJzZShza2IsIHNsbC0+c2xsX2FkZHIpOworCisJaWYgKHBza2JfdHJpbShza2IsIHNuYXBsZW4pKQorCQlnb3RvIGRyb3Bfbl9hY2N0OworCisJc2tiX3NldF9vd25lcl9yKHNrYiwgc2spOworCXNrYi0+ZGV2ID0gTlVMTDsKKwlkc3RfcmVsZWFzZShza2ItPmRzdCk7CisJc2tiLT5kc3QgPSBOVUxMOworCisJc3Bpbl9sb2NrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwlwby0+c3RhdHMudHBfcGFja2V0cysrOworCV9fc2tiX3F1ZXVlX3RhaWwoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpOworCXNwaW5fdW5sb2NrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwlzay0+c2tfZGF0YV9yZWFkeShzaywgc2tiLT5sZW4pOworCXJldHVybiAwOworCitkcm9wX25fYWNjdDoKKwlzcGluX2xvY2soJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOworCXBvLT5zdGF0cy50cF9kcm9wcysrOworCXNwaW5fdW5sb2NrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKworZHJvcF9uX3Jlc3RvcmU6CisJaWYgKHNrYl9oZWFkICE9IHNrYi0+ZGF0YSAmJiBza2Jfc2hhcmVkKHNrYikpIHsKKwkJc2tiLT5kYXRhID0gc2tiX2hlYWQ7CisJCXNrYi0+bGVuID0gc2tiX2xlbjsKKwl9Citkcm9wOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BBQ0tFVF9NTUFQCitzdGF0aWMgaW50IHRwYWNrZXRfcmN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsICBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0KQoreworCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvOworCXN0cnVjdCBzb2NrYWRkcl9sbCAqc2xsOworCXN0cnVjdCB0cGFja2V0X2hkciAqaDsKKwl1OCAqIHNrYl9oZWFkID0gc2tiLT5kYXRhOworCWludCBza2JfbGVuID0gc2tiLT5sZW47CisJdW5zaWduZWQgc25hcGxlbjsKKwl1bnNpZ25lZCBsb25nIHN0YXR1cyA9IFRQX1NUQVRVU19MT1NJTkd8VFBfU1RBVFVTX1VTRVI7CisJdW5zaWduZWQgc2hvcnQgbWFjb2ZmLCBuZXRvZmY7CisJc3RydWN0IHNrX2J1ZmYgKmNvcHlfc2tiID0gTlVMTDsKKworCWlmIChza2ItPnBrdF90eXBlID09IFBBQ0tFVF9MT09QQkFDSykKKwkJZ290byBkcm9wOworCisJc2sgPSBwdC0+YWZfcGFja2V0X3ByaXY7CisJcG8gPSBwa3Rfc2soc2spOworCisJaWYgKGRldi0+aGFyZF9oZWFkZXIpIHsKKwkJaWYgKHNrLT5za190eXBlICE9IFNPQ0tfREdSQU0pCisJCQlza2JfcHVzaChza2IsIHNrYi0+ZGF0YSAtIHNrYi0+bWFjLnJhdyk7CisJCWVsc2UgaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09VVEdPSU5HKSB7CisJCQkvKiBTcGVjaWFsIGNhc2U6IG91dGdvaW5nIHBhY2tldHMgaGF2ZSBsbCBoZWFkZXIgYXQgaGVhZCAqLworCQkJc2tiX3B1bGwoc2tiLCBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YSk7CisJCQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpCisJCQkJc3RhdHVzIHw9IFRQX1NUQVRVU19DU1VNTk9UUkVBRFk7CisJCX0KKwl9CisKKwlzbmFwbGVuID0gc2tiLT5sZW47CisKKwlpZiAoc2stPnNrX2ZpbHRlcikgeworCQl1bnNpZ25lZCByZXMgPSBydW5fZmlsdGVyKHNrYiwgc2ssIHNuYXBsZW4pOworCQlpZiAocmVzID09IDApCisJCQlnb3RvIGRyb3Bfbl9yZXN0b3JlOworCQlpZiAoc25hcGxlbiA+IHJlcykKKwkJCXNuYXBsZW4gPSByZXM7CisJfQorCisJaWYgKHNrLT5za190eXBlID09IFNPQ0tfREdSQU0pIHsKKwkJbWFjb2ZmID0gbmV0b2ZmID0gVFBBQ0tFVF9BTElHTihUUEFDS0VUX0hEUkxFTikgKyAxNjsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBtYWNsZW4gPSBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YTsKKwkJbmV0b2ZmID0gVFBBQ0tFVF9BTElHTihUUEFDS0VUX0hEUkxFTiArIChtYWNsZW4gPCAxNiA/IDE2IDogbWFjbGVuKSk7CisJCW1hY29mZiA9IG5ldG9mZiAtIG1hY2xlbjsKKwl9CisKKwlpZiAobWFjb2ZmICsgc25hcGxlbiA+IHBvLT5mcmFtZV9zaXplKSB7CisJCWlmIChwby0+Y29weV90aHJlc2ggJiYKKwkJICAgIGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgKyBza2ItPnRydWVzaXplIDwKKwkJICAgICh1bnNpZ25lZClzay0+c2tfcmN2YnVmKSB7CisJCQlpZiAoc2tiX3NoYXJlZChza2IpKSB7CisJCQkJY29weV9za2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJCX0gZWxzZSB7CisJCQkJY29weV9za2IgPSBza2JfZ2V0KHNrYik7CisJCQkJc2tiX2hlYWQgPSBza2ItPmRhdGE7CisJCQl9CisJCQlpZiAoY29weV9za2IpCisJCQkJc2tiX3NldF9vd25lcl9yKGNvcHlfc2tiLCBzayk7CisJCX0KKwkJc25hcGxlbiA9IHBvLT5mcmFtZV9zaXplIC0gbWFjb2ZmOworCQlpZiAoKGludClzbmFwbGVuIDwgMCkKKwkJCXNuYXBsZW4gPSAwOworCX0KKwlpZiAoc25hcGxlbiA+IHNrYi0+bGVuLXNrYi0+ZGF0YV9sZW4pCisJCXNuYXBsZW4gPSBza2ItPmxlbi1za2ItPmRhdGFfbGVuOworCisJc3Bpbl9sb2NrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwloID0gKHN0cnVjdCB0cGFja2V0X2hkciAqKXBhY2tldF9sb29rdXBfZnJhbWUocG8sIHBvLT5oZWFkKTsKKwkKKwlpZiAoaC0+dHBfc3RhdHVzKQorCQlnb3RvIHJpbmdfaXNfZnVsbDsKKwlwby0+aGVhZCA9IHBvLT5oZWFkICE9IHBvLT5mcmFtZV9tYXggPyBwby0+aGVhZCsxIDogMDsKKwlwby0+c3RhdHMudHBfcGFja2V0cysrOworCWlmIChjb3B5X3NrYikgeworCQlzdGF0dXMgfD0gVFBfU1RBVFVTX0NPUFk7CisJCV9fc2tiX3F1ZXVlX3RhaWwoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBjb3B5X3NrYik7CisJfQorCWlmICghcG8tPnN0YXRzLnRwX2Ryb3BzKQorCQlzdGF0dXMgJj0gflRQX1NUQVRVU19MT1NJTkc7CisJc3Bpbl91bmxvY2soJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOworCisJbWVtY3B5KCh1OCopaCArIG1hY29mZiwgc2tiLT5kYXRhLCBzbmFwbGVuKTsKKworCWgtPnRwX2xlbiA9IHNrYi0+bGVuOworCWgtPnRwX3NuYXBsZW4gPSBzbmFwbGVuOworCWgtPnRwX21hYyA9IG1hY29mZjsKKwloLT50cF9uZXQgPSBuZXRvZmY7CisJaWYgKHNrYi0+c3RhbXAudHZfc2VjID09IDApIHsgCisJCWRvX2dldHRpbWVvZmRheSgmc2tiLT5zdGFtcCk7CisJCXNvY2tfZW5hYmxlX3RpbWVzdGFtcChzayk7CisJfQorCWgtPnRwX3NlYyA9IHNrYi0+c3RhbXAudHZfc2VjOworCWgtPnRwX3VzZWMgPSBza2ItPnN0YW1wLnR2X3VzZWM7CisKKwlzbGwgPSAoc3RydWN0IHNvY2thZGRyX2xsKikoKHU4KiloICsgVFBBQ0tFVF9BTElHTihzaXplb2YoKmgpKSk7CisJc2xsLT5zbGxfaGFsZW4gPSAwOworCWlmIChkZXYtPmhhcmRfaGVhZGVyX3BhcnNlKQorCQlzbGwtPnNsbF9oYWxlbiA9IGRldi0+aGFyZF9oZWFkZXJfcGFyc2Uoc2tiLCBzbGwtPnNsbF9hZGRyKTsKKwlzbGwtPnNsbF9mYW1pbHkgPSBBRl9QQUNLRVQ7CisJc2xsLT5zbGxfaGF0eXBlID0gZGV2LT50eXBlOworCXNsbC0+c2xsX3Byb3RvY29sID0gc2tiLT5wcm90b2NvbDsKKwlzbGwtPnNsbF9wa3R0eXBlID0gc2tiLT5wa3RfdHlwZTsKKwlzbGwtPnNsbF9pZmluZGV4ID0gZGV2LT5pZmluZGV4OworCisJaC0+dHBfc3RhdHVzID0gc3RhdHVzOworCW1iKCk7CisKKwl7CisJCXN0cnVjdCBwYWdlICpwX3N0YXJ0LCAqcF9lbmQ7CisJCXU4ICpoX2VuZCA9ICh1OCAqKWggKyBtYWNvZmYgKyBzbmFwbGVuIC0gMTsKKworCQlwX3N0YXJ0ID0gdmlydF90b19wYWdlKGgpOworCQlwX2VuZCA9IHZpcnRfdG9fcGFnZShoX2VuZCk7CisJCXdoaWxlIChwX3N0YXJ0IDw9IHBfZW5kKSB7CisJCQlmbHVzaF9kY2FjaGVfcGFnZShwX3N0YXJ0KTsKKwkJCXBfc3RhcnQrKzsKKwkJfQorCX0KKworCXNrLT5za19kYXRhX3JlYWR5KHNrLCAwKTsKKworZHJvcF9uX3Jlc3RvcmU6CisJaWYgKHNrYl9oZWFkICE9IHNrYi0+ZGF0YSAmJiBza2Jfc2hhcmVkKHNrYikpIHsKKwkJc2tiLT5kYXRhID0gc2tiX2hlYWQ7CisJCXNrYi0+bGVuID0gc2tiX2xlbjsKKwl9Citkcm9wOgorICAgICAgICBrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKKworcmluZ19pc19mdWxsOgorCXBvLT5zdGF0cy50cF9kcm9wcysrOworCXNwaW5fdW5sb2NrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKworCXNrLT5za19kYXRhX3JlYWR5KHNrLCAwKTsKKwlpZiAoY29weV9za2IpCisJCWtmcmVlX3NrYihjb3B5X3NrYik7CisJZ290byBkcm9wX25fcmVzdG9yZTsKK30KKworI2VuZGlmCisKKworc3RhdGljIGludCBwYWNrZXRfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgc29ja2FkZHJfbGwgKnNhZGRyPShzdHJ1Y3Qgc29ja2FkZHJfbGwgKiltc2ctPm1zZ19uYW1lOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBzaG9ydCBwcm90bzsKKwl1bnNpZ25lZCBjaGFyICphZGRyOworCWludCBpZmluZGV4LCBlcnIsIHJlc2VydmUgPSAwOworCisJLyoKKwkgKglHZXQgYW5kIHZlcmlmeSB0aGUgYWRkcmVzcy4gCisJICovCisJIAorCWlmIChzYWRkciA9PSBOVUxMKSB7CisJCXN0cnVjdCBwYWNrZXRfc29jayAqcG8gPSBwa3Rfc2soc2spOworCisJCWlmaW5kZXgJPSBwby0+aWZpbmRleDsKKwkJcHJvdG8JPSBwby0+bnVtOworCQlhZGRyCT0gTlVMTDsKKwl9IGVsc2UgeworCQllcnIgPSAtRUlOVkFMOworCQlpZiAobXNnLT5tc2dfbmFtZWxlbiA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfbGwpKQorCQkJZ290byBvdXQ7CisJCWlmaW5kZXgJPSBzYWRkci0+c2xsX2lmaW5kZXg7CisJCXByb3RvCT0gc2FkZHItPnNsbF9wcm90b2NvbDsKKwkJYWRkcgk9IHNhZGRyLT5zbGxfYWRkcjsKKwl9CisKKworCWRldiA9IGRldl9nZXRfYnlfaW5kZXgoaWZpbmRleCk7CisJZXJyID0gLUVOWElPOworCWlmIChkZXYgPT0gTlVMTCkKKwkJZ290byBvdXRfdW5sb2NrOworCWlmIChzb2NrLT50eXBlID09IFNPQ0tfUkFXKQorCQlyZXNlcnZlID0gZGV2LT5oYXJkX2hlYWRlcl9sZW47CisKKwllcnIgPSAtRU1TR1NJWkU7CisJaWYgKGxlbiA+IGRldi0+bXR1K3Jlc2VydmUpCisJCWdvdG8gb3V0X3VubG9jazsKKworCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssIGxlbiArIExMX1JFU0VSVkVEX1NQQUNFKGRldiksCisJCQkJbXNnLT5tc2dfZmxhZ3MgJiBNU0dfRE9OVFdBSVQsICZlcnIpOworCWlmIChza2I9PU5VTEwpCisJCWdvdG8gb3V0X3VubG9jazsKKworCXNrYl9yZXNlcnZlKHNrYiwgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSk7CisJc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisKKwlpZiAoZGV2LT5oYXJkX2hlYWRlcikgeworCQlpbnQgcmVzOworCQllcnIgPSAtRUlOVkFMOworCQlyZXMgPSBkZXYtPmhhcmRfaGVhZGVyKHNrYiwgZGV2LCBudG9ocyhwcm90byksIGFkZHIsIE5VTEwsIGxlbik7CisJCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfREdSQU0pIHsKKwkJCXNrYi0+dGFpbCA9IHNrYi0+ZGF0YTsKKwkJCXNrYi0+bGVuID0gMDsKKwkJfSBlbHNlIGlmIChyZXMgPCAwKQorCQkJZ290byBvdXRfZnJlZTsKKwl9CisKKwkvKiBSZXR1cm5zIC1FRkFVTFQgb24gZXJyb3IgKi8KKwllcnIgPSBtZW1jcHlfZnJvbWlvdmVjKHNrYl9wdXQoc2tiLGxlbiksIG1zZy0+bXNnX2lvdiwgbGVuKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlOworCisJc2tiLT5wcm90b2NvbCA9IHByb3RvOworCXNrYi0+ZGV2ID0gZGV2OworCXNrYi0+cHJpb3JpdHkgPSBzay0+c2tfcHJpb3JpdHk7CisKKwllcnIgPSAtRU5FVERPV047CisJaWYgKCEoZGV2LT5mbGFncyAmIElGRl9VUCkpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwkvKgorCSAqCU5vdyBzZW5kIGl0CisJICovCisKKwllcnIgPSBkZXZfcXVldWVfeG1pdChza2IpOworCWlmIChlcnIgPiAwICYmIChlcnIgPSBuZXRfeG1pdF9lcnJubyhlcnIpKSAhPSAwKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlkZXZfcHV0KGRldik7CisKKwlyZXR1cm4obGVuKTsKKworb3V0X2ZyZWU6CisJa2ZyZWVfc2tiKHNrYik7CitvdXRfdW5sb2NrOgorCWlmIChkZXYpCisJCWRldl9wdXQoZGV2KTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJQ2xvc2UgYSBQQUNLRVQgc29ja2V0LiBUaGlzIGlzIGZhaXJseSBzaW1wbGUuIFdlIGltbWVkaWF0ZWx5IGdvCisgKgl0byAnY2xvc2VkJyBzdGF0ZSBhbmQgcmVtb3ZlIG91ciBwcm90b2NvbCBlbnRyeSBpbiB0aGUgZGV2aWNlIGxpc3QuCisgKi8KKworc3RhdGljIGludCBwYWNrZXRfcmVsZWFzZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBwYWNrZXRfc29jayAqcG87CisKKwlpZiAoIXNrKQorCQlyZXR1cm4gMDsKKworCXBvID0gcGt0X3NrKHNrKTsKKworCXdyaXRlX2xvY2tfYmgoJnBhY2tldF9za2xpc3RfbG9jayk7CisJc2tfZGVsX25vZGVfaW5pdChzayk7CisJd3JpdGVfdW5sb2NrX2JoKCZwYWNrZXRfc2tsaXN0X2xvY2spOworCisJLyoKKwkgKglVbmhvb2sgcGFja2V0IHJlY2VpdmUgaGFuZGxlci4KKwkgKi8KKworCWlmIChwby0+cnVubmluZykgeworCQkvKgorCQkgKglSZW1vdmUgdGhlIHByb3RvY29sIGhvb2sKKwkJICovCisJCWRldl9yZW1vdmVfcGFjaygmcG8tPnByb3RfaG9vayk7CisJCXBvLT5ydW5uaW5nID0gMDsKKwkJcG8tPm51bSA9IDA7CisJCV9fc29ja19wdXQoc2spOworCX0KKworI2lmZGVmIENPTkZJR19QQUNLRVRfTVVMVElDQVNUCisJcGFja2V0X2ZsdXNoX21jbGlzdChzayk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQUNLRVRfTU1BUAorCWlmIChwby0+cGdfdmVjKSB7CisJCXN0cnVjdCB0cGFja2V0X3JlcSByZXE7CisJCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisJCXBhY2tldF9zZXRfcmluZyhzaywgJnJlcSwgMSk7CisJfQorI2VuZGlmCisKKwkvKgorCSAqCU5vdyB0aGUgc29ja2V0IGlzIGRlYWQuIE5vIG1vcmUgaW5wdXQgd2lsbCBhcHBlYXIuCisJICovCisKKwlzb2NrX29ycGhhbihzayk7CisJc29jay0+c2sgPSBOVUxMOworCisJLyogUHVyZ2UgcXVldWVzICovCisKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKworCXNvY2tfcHV0KHNrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCUF0dGFjaCBhIHBhY2tldCBob29rLgorICovCisKK3N0YXRpYyBpbnQgcGFja2V0X2RvX2JpbmQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcHJvdG9jb2wpCit7CisJc3RydWN0IHBhY2tldF9zb2NrICpwbyA9IHBrdF9zayhzayk7CisJLyoKKwkgKglEZXRhY2ggYW4gZXhpc3RpbmcgaG9vayBpZiBwcmVzZW50LgorCSAqLworCisJbG9ja19zb2NrKHNrKTsKKworCXNwaW5fbG9jaygmcG8tPmJpbmRfbG9jayk7CisJaWYgKHBvLT5ydW5uaW5nKSB7CisJCV9fc29ja19wdXQoc2spOworCQlwby0+cnVubmluZyA9IDA7CisJCXBvLT5udW0gPSAwOworCQlzcGluX3VubG9jaygmcG8tPmJpbmRfbG9jayk7CisJCWRldl9yZW1vdmVfcGFjaygmcG8tPnByb3RfaG9vayk7CisJCXNwaW5fbG9jaygmcG8tPmJpbmRfbG9jayk7CisJfQorCisJcG8tPm51bSA9IHByb3RvY29sOworCXBvLT5wcm90X2hvb2sudHlwZSA9IHByb3RvY29sOworCXBvLT5wcm90X2hvb2suZGV2ID0gZGV2OworCisJcG8tPmlmaW5kZXggPSBkZXYgPyBkZXYtPmlmaW5kZXggOiAwOworCisJaWYgKHByb3RvY29sID09IDApCisJCWdvdG8gb3V0X3VubG9jazsKKworCWlmIChkZXYpIHsKKwkJaWYgKGRldi0+ZmxhZ3MmSUZGX1VQKSB7CisJCQlkZXZfYWRkX3BhY2soJnBvLT5wcm90X2hvb2spOworCQkJc29ja19ob2xkKHNrKTsKKwkJCXBvLT5ydW5uaW5nID0gMTsKKwkJfSBlbHNlIHsKKwkJCXNrLT5za19lcnIgPSBFTkVURE9XTjsKKwkJCWlmICghc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKQorCQkJCXNrLT5za19lcnJvcl9yZXBvcnQoc2spOworCQl9CisJfSBlbHNlIHsKKwkJZGV2X2FkZF9wYWNrKCZwby0+cHJvdF9ob29rKTsKKwkJc29ja19ob2xkKHNrKTsKKwkJcG8tPnJ1bm5pbmcgPSAxOworCX0KKworb3V0X3VubG9jazoKKwlzcGluX3VubG9jaygmcG8tPmJpbmRfbG9jayk7CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCUJpbmQgYSBwYWNrZXQgc29ja2V0IHRvIGEgZGV2aWNlCisgKi8KKworI2lmZGVmIENPTkZJR19TT0NLX1BBQ0tFVAorCitzdGF0aWMgaW50IHBhY2tldF9iaW5kX3Nwa3Qoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwgaW50IGFkZHJfbGVuKQoreworCXN0cnVjdCBzb2NrICpzaz1zb2NrLT5zazsKKwljaGFyIG5hbWVbMTVdOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGVyciA9IC1FTk9ERVY7CisJCisJLyoKKwkgKglDaGVjayBsZWdhbGl0eQorCSAqLworCSAKKwlpZihhZGRyX2xlbiE9c2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpCisJCXJldHVybiAtRUlOVkFMOworCXN0cmxjcHkobmFtZSx1YWRkci0+c2FfZGF0YSxzaXplb2YobmFtZSkpOworCisJZGV2ID0gZGV2X2dldF9ieV9uYW1lKG5hbWUpOworCWlmIChkZXYpIHsKKwkJZXJyID0gcGFja2V0X2RvX2JpbmQoc2ssIGRldiwgcGt0X3NrKHNrKS0+bnVtKTsKKwkJZGV2X3B1dChkZXYpOworCX0KKwlyZXR1cm4gZXJyOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcGFja2V0X2JpbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwgaW50IGFkZHJfbGVuKQoreworCXN0cnVjdCBzb2NrYWRkcl9sbCAqc2xsID0gKHN0cnVjdCBzb2NrYWRkcl9sbCopdWFkZHI7CisJc3RydWN0IHNvY2sgKnNrPXNvY2stPnNrOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCWludCBlcnI7CisKKworCS8qCisJICoJQ2hlY2sgbGVnYWxpdHkKKwkgKi8KKwkgCisJaWYgKGFkZHJfbGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9sbCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChzbGwtPnNsbF9mYW1pbHkgIT0gQUZfUEFDS0VUKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzbGwtPnNsbF9pZmluZGV4KSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWRldiA9IGRldl9nZXRfYnlfaW5kZXgoc2xsLT5zbGxfaWZpbmRleCk7CisJCWlmIChkZXYgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCX0KKwllcnIgPSBwYWNrZXRfZG9fYmluZChzaywgZGV2LCBzbGwtPnNsbF9wcm90b2NvbCA/IDogcGt0X3NrKHNrKS0+bnVtKTsKKwlpZiAoZGV2KQorCQlkZXZfcHV0KGRldik7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IHByb3RvIHBhY2tldF9wcm90byA9IHsKKwkubmFtZQkgID0gIlBBQ0tFVCIsCisJLm93bmVyCSAgPSBUSElTX01PRFVMRSwKKwkub2JqX3NpemUgPSBzaXplb2Yoc3RydWN0IHBhY2tldF9zb2NrKSwKK307CisKKy8qCisgKglDcmVhdGUgYSBwYWNrZXQgb2YgdHlwZSBTT0NLX1BBQ0tFVC4gCisgKi8KKworc3RhdGljIGludCBwYWNrZXRfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IHBhY2tldF9zb2NrICpwbzsKKwlpbnQgZXJyOworCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfUkFXKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAoc29jay0+dHlwZSAhPSBTT0NLX0RHUkFNICYmIHNvY2stPnR5cGUgIT0gU09DS19SQVcKKyNpZmRlZiBDT05GSUdfU09DS19QQUNLRVQKKwkgICAgJiYgc29jay0+dHlwZSAhPSBTT0NLX1BBQ0tFVAorI2VuZGlmCisJICAgICkKKwkJcmV0dXJuIC1FU09DS1ROT1NVUFBPUlQ7CisKKwlzb2NrLT5zdGF0ZSA9IFNTX1VOQ09OTkVDVEVEOworCisJZXJyID0gLUVOT0JVRlM7CisJc2sgPSBza19hbGxvYyhQRl9QQUNLRVQsIEdGUF9LRVJORUwsICZwYWNrZXRfcHJvdG8sIDEpOworCWlmIChzayA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCXNvY2stPm9wcyA9ICZwYWNrZXRfb3BzOworI2lmZGVmIENPTkZJR19TT0NLX1BBQ0tFVAorCWlmIChzb2NrLT50eXBlID09IFNPQ0tfUEFDS0VUKQorCQlzb2NrLT5vcHMgPSAmcGFja2V0X29wc19zcGt0OworI2VuZGlmCisJc29ja19pbml0X2RhdGEoc29jaywgc2spOworCisJcG8gPSBwa3Rfc2soc2spOworCXNrLT5za19mYW1pbHkgPSBQRl9QQUNLRVQ7CisJcG8tPm51bSA9IHByb3RvY29sOworCisJc2stPnNrX2Rlc3RydWN0ID0gcGFja2V0X3NvY2tfZGVzdHJ1Y3Q7CisJYXRvbWljX2luYygmcGFja2V0X3NvY2tzX25yKTsKKworCS8qCisJICoJQXR0YWNoIGEgcHJvdG9jb2wgYmxvY2sKKwkgKi8KKworCXNwaW5fbG9ja19pbml0KCZwby0+YmluZF9sb2NrKTsKKwlwby0+cHJvdF9ob29rLmZ1bmMgPSBwYWNrZXRfcmN2OworI2lmZGVmIENPTkZJR19TT0NLX1BBQ0tFVAorCWlmIChzb2NrLT50eXBlID09IFNPQ0tfUEFDS0VUKQorCQlwby0+cHJvdF9ob29rLmZ1bmMgPSBwYWNrZXRfcmN2X3Nwa3Q7CisjZW5kaWYKKwlwby0+cHJvdF9ob29rLmFmX3BhY2tldF9wcml2ID0gc2s7CisKKwlpZiAocHJvdG9jb2wpIHsKKwkJcG8tPnByb3RfaG9vay50eXBlID0gcHJvdG9jb2w7CisJCWRldl9hZGRfcGFjaygmcG8tPnByb3RfaG9vayk7CisJCXNvY2tfaG9sZChzayk7CisJCXBvLT5ydW5uaW5nID0gMTsKKwl9CisKKwl3cml0ZV9sb2NrX2JoKCZwYWNrZXRfc2tsaXN0X2xvY2spOworCXNrX2FkZF9ub2RlKHNrLCAmcGFja2V0X3NrbGlzdCk7CisJd3JpdGVfdW5sb2NrX2JoKCZwYWNrZXRfc2tsaXN0X2xvY2spOworCXJldHVybigwKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJUHVsbCBhIHBhY2tldCBmcm9tIG91ciByZWNlaXZlIHF1ZXVlIGFuZCBoYW5kIGl0IHRvIHRoZSB1c2VyLgorICoJSWYgbmVjZXNzYXJ5IHdlIGJsb2NrLgorICovCisKK3N0YXRpYyBpbnQgcGFja2V0X3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBjb3BpZWQsIGVycjsKKworCWVyciA9IC1FSU5WQUw7CisJaWYgKGZsYWdzICYgfihNU0dfUEVFS3xNU0dfRE9OVFdBSVR8TVNHX1RSVU5DfE1TR19DTVNHX0NPTVBBVCkpCisJCWdvdG8gb3V0OworCisjaWYgMAorCS8qIFdoYXQgZXJyb3Igc2hvdWxkIHdlIHJldHVybiBub3c/IEVVTkFUVEFDSD8gKi8KKwlpZiAocGt0X3NrKHNrKS0+aWZpbmRleCA8IDApCisJCXJldHVybiAtRU5PREVWOworI2VuZGlmCisKKwkvKgorCSAqCUlmIHRoZSBhZGRyZXNzIGxlbmd0aCBmaWVsZCBpcyB0aGVyZSB0byBiZSBmaWxsZWQgaW4sIHdlIGZpbGwKKwkgKglpdCBpbiBub3cuCisJICovCisKKwlpZiAoc29jay0+dHlwZSA9PSBTT0NLX1BBQ0tFVCkKKwkJbXNnLT5tc2dfbmFtZWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfcGt0KTsKKwllbHNlCisJCW1zZy0+bXNnX25hbWVsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2xsKTsKKworCS8qCisJICoJQ2FsbCB0aGUgZ2VuZXJpYyBkYXRhZ3JhbSByZWNlaXZlci4gVGhpcyBoYW5kbGVzIGFsbCBzb3J0cworCSAqCW9mIGhvcnJpYmxlIHJhY2VzIGFuZCByZS1lbnRyYW5jeSBzbyB3ZSBjYW4gZm9yZ2V0IGFib3V0IGl0CisJICoJaW4gdGhlIHByb3RvY29sIGxheWVycy4KKwkgKgorCSAqCU5vdyBpdCB3aWxsIHJldHVybiBFTkVURE9XTiwgaWYgZGV2aWNlIGhhdmUganVzdCBnb25lIGRvd24sCisJICoJYnV0IHRoZW4gaXQgd2lsbCBibG9jay4KKwkgKi8KKworCXNrYj1za2JfcmVjdl9kYXRhZ3JhbShzayxmbGFncyxmbGFncyZNU0dfRE9OVFdBSVQsJmVycik7CisKKwkvKgorCSAqCUFuIGVycm9yIG9jY3VycmVkIHNvIHJldHVybiBpdC4gQmVjYXVzZSBza2JfcmVjdl9kYXRhZ3JhbSgpIAorCSAqCWhhbmRsZXMgdGhlIGJsb2NraW5nIHdlIGRvbid0IHNlZSBhbmQgd29ycnkgYWJvdXQgYmxvY2tpbmcKKwkgKglyZXRyaWVzLgorCSAqLworCisJaWYoc2tiPT1OVUxMKQorCQlnb3RvIG91dDsKKworCS8qCisJICoJWW91IGxvc2UgYW55IGRhdGEgYmV5b25kIHRoZSBidWZmZXIgeW91IGdhdmUuIElmIGl0IHdvcnJpZXMgYQorCSAqCXVzZXIgcHJvZ3JhbSB0aGV5IGNhbiBhc2sgdGhlIGRldmljZSBmb3IgaXRzIE1UVSBhbnl3YXkuCisJICovCisKKwljb3BpZWQgPSBza2ItPmxlbjsKKwlpZiAoY29waWVkID4gbGVuKQorCXsKKwkJY29waWVkPWxlbjsKKwkJbXNnLT5tc2dfZmxhZ3N8PU1TR19UUlVOQzsKKwl9CisKKwllcnIgPSBza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhza2IsIDAsIG1zZy0+bXNnX2lvdiwgY29waWVkKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlOworCisJc29ja19yZWN2X3RpbWVzdGFtcChtc2csIHNrLCBza2IpOworCisJaWYgKG1zZy0+bXNnX25hbWUpCisJCW1lbWNweShtc2ctPm1zZ19uYW1lLCBza2ItPmNiLCBtc2ctPm1zZ19uYW1lbGVuKTsKKworCS8qCisJICoJRnJlZSBvciByZXR1cm4gdGhlIGJ1ZmZlciBhcyBhcHByb3ByaWF0ZS4gQWdhaW4gdGhpcworCSAqCWhpZGVzIGFsbCB0aGUgcmFjZXMgYW5kIHJlLWVudHJhbmN5IGlzc3VlcyBmcm9tIHVzLgorCSAqLworCWVyciA9IChmbGFncyZNU0dfVFJVTkMpID8gc2tiLT5sZW4gOiBjb3BpZWQ7CisKK291dF9mcmVlOgorCXNrYl9mcmVlX2RhdGFncmFtKHNrLCBza2IpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKyNpZmRlZiBDT05GSUdfU09DS19QQUNLRVQKK3N0YXRpYyBpbnQgcGFja2V0X2dldG5hbWVfc3BrdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLAorCQkJICAgICAgIGludCAqdWFkZHJfbGVuLCBpbnQgcGVlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBzb2NrICpzawk9IHNvY2stPnNrOworCisJaWYgKHBlZXIpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXVhZGRyLT5zYV9mYW1pbHkgPSBBRl9QQUNLRVQ7CisJZGV2ID0gZGV2X2dldF9ieV9pbmRleChwa3Rfc2soc2spLT5pZmluZGV4KTsKKwlpZiAoZGV2KSB7CisJCXN0cmxjcHkodWFkZHItPnNhX2RhdGEsIGRldi0+bmFtZSwgMTUpOworCQlkZXZfcHV0KGRldik7CisJfSBlbHNlCisJCW1lbXNldCh1YWRkci0+c2FfZGF0YSwgMCwgMTQpOworCSp1YWRkcl9sZW4gPSBzaXplb2YoKnVhZGRyKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcGFja2V0X2dldG5hbWUoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwKKwkJCSAgaW50ICp1YWRkcl9sZW4sIGludCBwZWVyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHBhY2tldF9zb2NrICpwbyA9IHBrdF9zayhzayk7CisJc3RydWN0IHNvY2thZGRyX2xsICpzbGwgPSAoc3RydWN0IHNvY2thZGRyX2xsKil1YWRkcjsKKworCWlmIChwZWVyKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlzbGwtPnNsbF9mYW1pbHkgPSBBRl9QQUNLRVQ7CisJc2xsLT5zbGxfaWZpbmRleCA9IHBvLT5pZmluZGV4OworCXNsbC0+c2xsX3Byb3RvY29sID0gcG8tPm51bTsKKwlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KHBvLT5pZmluZGV4KTsKKwlpZiAoZGV2KSB7CisJCXNsbC0+c2xsX2hhdHlwZSA9IGRldi0+dHlwZTsKKwkJc2xsLT5zbGxfaGFsZW4gPSBkZXYtPmFkZHJfbGVuOworCQltZW1jcHkoc2xsLT5zbGxfYWRkciwgZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbik7CisJCWRldl9wdXQoZGV2KTsKKwl9IGVsc2UgeworCQlzbGwtPnNsbF9oYXR5cGUgPSAwOwkvKiBCYWQ6IHdlIGhhdmUgbm8gQVJQSFJEX1VOU1BFQyAqLworCQlzbGwtPnNsbF9oYWxlbiA9IDA7CisJfQorCSp1YWRkcl9sZW4gPSBzaXplb2YoKnNsbCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QQUNLRVRfTVVMVElDQVNUCitzdGF0aWMgdm9pZCBwYWNrZXRfZGV2X21jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBwYWNrZXRfbWNsaXN0ICppLCBpbnQgd2hhdCkKK3sKKwlzd2l0Y2ggKGktPnR5cGUpIHsKKwljYXNlIFBBQ0tFVF9NUl9NVUxUSUNBU1Q6CisJCWlmICh3aGF0ID4gMCkKKwkJCWRldl9tY19hZGQoZGV2LCBpLT5hZGRyLCBpLT5hbGVuLCAwKTsKKwkJZWxzZQorCQkJZGV2X21jX2RlbGV0ZShkZXYsIGktPmFkZHIsIGktPmFsZW4sIDApOworCQlicmVhazsKKwljYXNlIFBBQ0tFVF9NUl9QUk9NSVNDOgorCQlkZXZfc2V0X3Byb21pc2N1aXR5KGRldiwgd2hhdCk7CisJCWJyZWFrOworCWNhc2UgUEFDS0VUX01SX0FMTE1VTFRJOgorCQlkZXZfc2V0X2FsbG11bHRpKGRldiwgd2hhdCk7CisJCWJyZWFrOworCWRlZmF1bHQ6OworCX0KK30KKworc3RhdGljIHZvaWQgcGFja2V0X2Rldl9tY2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHBhY2tldF9tY2xpc3QgKmksIGludCB3aGF0KQoreworCWZvciAoIDsgaTsgaT1pLT5uZXh0KSB7CisJCWlmIChpLT5pZmluZGV4ID09IGRldi0+aWZpbmRleCkKKwkJCXBhY2tldF9kZXZfbWMoZGV2LCBpLCB3aGF0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcGFja2V0X21jX2FkZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwYWNrZXRfbXJlcSAqbXJlcSkKK3sKKwlzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvID0gcGt0X3NrKHNrKTsKKwlzdHJ1Y3QgcGFja2V0X21jbGlzdCAqbWwsICppOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGVycjsKKworCXJ0bmxfbG9jaygpOworCisJZXJyID0gLUVOT0RFVjsKKwlkZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgobXJlcS0+bXJfaWZpbmRleCk7CisJaWYgKCFkZXYpCisJCWdvdG8gZG9uZTsKKworCWVyciA9IC1FSU5WQUw7CisJaWYgKG1yZXEtPm1yX2FsZW4gPiBkZXYtPmFkZHJfbGVuKQorCQlnb3RvIGRvbmU7CisKKwllcnIgPSAtRU5PQlVGUzsKKwlpID0gKHN0cnVjdCBwYWNrZXRfbWNsaXN0ICopa21hbGxvYyhzaXplb2YoKmkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoaSA9PSBOVUxMKQorCQlnb3RvIGRvbmU7CisKKwllcnIgPSAwOworCWZvciAobWwgPSBwby0+bWNsaXN0OyBtbDsgbWwgPSBtbC0+bmV4dCkgeworCQlpZiAobWwtPmlmaW5kZXggPT0gbXJlcS0+bXJfaWZpbmRleCAmJgorCQkgICAgbWwtPnR5cGUgPT0gbXJlcS0+bXJfdHlwZSAmJgorCQkgICAgbWwtPmFsZW4gPT0gbXJlcS0+bXJfYWxlbiAmJgorCQkgICAgbWVtY21wKG1sLT5hZGRyLCBtcmVxLT5tcl9hZGRyZXNzLCBtbC0+YWxlbikgPT0gMCkgeworCQkJbWwtPmNvdW50Kys7CisJCQkvKiBGcmVlIHRoZSBuZXcgZWxlbWVudCAuLi4gKi8KKwkJCWtmcmVlKGkpOworCQkJZ290byBkb25lOworCQl9CisJfQorCisJaS0+dHlwZSA9IG1yZXEtPm1yX3R5cGU7CisJaS0+aWZpbmRleCA9IG1yZXEtPm1yX2lmaW5kZXg7CisJaS0+YWxlbiA9IG1yZXEtPm1yX2FsZW47CisJbWVtY3B5KGktPmFkZHIsIG1yZXEtPm1yX2FkZHJlc3MsIGktPmFsZW4pOworCWktPmNvdW50ID0gMTsKKwlpLT5uZXh0ID0gcG8tPm1jbGlzdDsKKwlwby0+bWNsaXN0ID0gaTsKKwlwYWNrZXRfZGV2X21jKGRldiwgaSwgKzEpOworCitkb25lOgorCXJ0bmxfdW5sb2NrKCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBwYWNrZXRfbWNfZHJvcChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwYWNrZXRfbXJlcSAqbXJlcSkKK3sKKwlzdHJ1Y3QgcGFja2V0X21jbGlzdCAqbWwsICoqbWxwOworCisJcnRubF9sb2NrKCk7CisKKwlmb3IgKG1scCA9ICZwa3Rfc2soc2spLT5tY2xpc3Q7IChtbCA9ICptbHApICE9IE5VTEw7IG1scCA9ICZtbC0+bmV4dCkgeworCQlpZiAobWwtPmlmaW5kZXggPT0gbXJlcS0+bXJfaWZpbmRleCAmJgorCQkgICAgbWwtPnR5cGUgPT0gbXJlcS0+bXJfdHlwZSAmJgorCQkgICAgbWwtPmFsZW4gPT0gbXJlcS0+bXJfYWxlbiAmJgorCQkgICAgbWVtY21wKG1sLT5hZGRyLCBtcmVxLT5tcl9hZGRyZXNzLCBtbC0+YWxlbikgPT0gMCkgeworCQkJaWYgKC0tbWwtPmNvdW50ID09IDApIHsKKwkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCQkJCSptbHAgPSBtbC0+bmV4dDsKKwkJCQlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KG1sLT5pZmluZGV4KTsKKwkJCQlpZiAoZGV2KSB7CisJCQkJCXBhY2tldF9kZXZfbWMoZGV2LCBtbCwgLTEpOworCQkJCQlkZXZfcHV0KGRldik7CisJCQkJfQorCQkJCWtmcmVlKG1sKTsKKwkJCX0KKwkJCXJ0bmxfdW5sb2NrKCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlydG5sX3VubG9jaygpOworCXJldHVybiAtRUFERFJOT1RBVkFJTDsKK30KKworc3RhdGljIHZvaWQgcGFja2V0X2ZsdXNoX21jbGlzdChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHBhY2tldF9zb2NrICpwbyA9IHBrdF9zayhzayk7CisJc3RydWN0IHBhY2tldF9tY2xpc3QgKm1sOworCisJaWYgKCFwby0+bWNsaXN0KQorCQlyZXR1cm47CisKKwlydG5sX2xvY2soKTsKKwl3aGlsZSAoKG1sID0gcG8tPm1jbGlzdCkgIT0gTlVMTCkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJCXBvLT5tY2xpc3QgPSBtbC0+bmV4dDsKKwkJaWYgKChkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KG1sLT5pZmluZGV4KSkgIT0gTlVMTCkgeworCQkJcGFja2V0X2Rldl9tYyhkZXYsIG1sLCAtMSk7CisJCQlkZXZfcHV0KGRldik7CisJCX0KKwkJa2ZyZWUobWwpOworCX0KKwlydG5sX3VubG9jaygpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK3BhY2tldF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJaW50IHJldDsKKworCWlmIChsZXZlbCAhPSBTT0xfUEFDS0VUKQorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCisJc3dpdGNoKG9wdG5hbWUpCXsKKyNpZmRlZiBDT05GSUdfUEFDS0VUX01VTFRJQ0FTVAorCWNhc2UgUEFDS0VUX0FERF9NRU1CRVJTSElQOgkKKwljYXNlIFBBQ0tFVF9EUk9QX01FTUJFUlNISVA6CisJeworCQlzdHJ1Y3QgcGFja2V0X21yZXEgbXJlcTsKKwkJaWYgKG9wdGxlbjxzaXplb2YobXJlcSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZtcmVxLG9wdHZhbCxzaXplb2YobXJlcSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChvcHRuYW1lID09IFBBQ0tFVF9BRERfTUVNQkVSU0hJUCkKKwkJCXJldCA9IHBhY2tldF9tY19hZGQoc2ssICZtcmVxKTsKKwkJZWxzZQorCQkJcmV0ID0gcGFja2V0X21jX2Ryb3Aoc2ssICZtcmVxKTsKKwkJcmV0dXJuIHJldDsKKwl9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUEFDS0VUX01NQVAKKwljYXNlIFBBQ0tFVF9SWF9SSU5HOgorCXsKKwkJc3RydWN0IHRwYWNrZXRfcmVxIHJlcTsKKworCQlpZiAob3B0bGVuPHNpemVvZihyZXEpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxLG9wdHZhbCxzaXplb2YocmVxKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIHBhY2tldF9zZXRfcmluZyhzaywgJnJlcSwgMCk7CisJfQorCWNhc2UgUEFDS0VUX0NPUFlfVEhSRVNIOgorCXsKKwkJaW50IHZhbDsKKworCQlpZiAob3B0bGVuIT1zaXplb2YodmFsKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCxvcHR2YWwsc2l6ZW9mKHZhbCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcGt0X3NrKHNrKS0+Y29weV90aHJlc2ggPSB2YWw7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisJfQorfQorCitzdGF0aWMgaW50IHBhY2tldF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCQkgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKK3sKKwlpbnQgbGVuOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBwYWNrZXRfc29jayAqcG8gPSBwa3Rfc2soc2spOworCisJaWYgKGxldmVsICE9IFNPTF9QQUNLRVQpCisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisKKyAgCWlmIChnZXRfdXNlcihsZW4sb3B0bGVuKSkKKyAgCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkJCisJc3dpdGNoKG9wdG5hbWUpCXsKKwljYXNlIFBBQ0tFVF9TVEFUSVNUSUNTOgorCXsKKwkJc3RydWN0IHRwYWNrZXRfc3RhdHMgc3Q7CisKKwkJaWYgKGxlbiA+IHNpemVvZihzdHJ1Y3QgdHBhY2tldF9zdGF0cykpCisJCQlsZW4gPSBzaXplb2Yoc3RydWN0IHRwYWNrZXRfc3RhdHMpOworCQlzcGluX2xvY2tfYmgoJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOworCQlzdCA9IHBvLT5zdGF0czsKKwkJbWVtc2V0KCZwby0+c3RhdHMsIDAsIHNpemVvZihzdCkpOworCQlzcGluX3VubG9ja19iaCgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7CisJCXN0LnRwX3BhY2tldHMgKz0gc3QudHBfZHJvcHM7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsICZzdCwgbGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKwl9CisKKyAgCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpCisgIAkJcmV0dXJuIC1FRkFVTFQ7CisgIAlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHBhY2tldF9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgbXNnLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlKilkYXRhOworCisJcmVhZF9sb2NrKCZwYWNrZXRfc2tsaXN0X2xvY2spOworCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmcGFja2V0X3NrbGlzdCkgeworCQlzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvID0gcGt0X3NrKHNrKTsKKworCQlzd2l0Y2ggKG1zZykgeworCQljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgorI2lmZGVmIENPTkZJR19QQUNLRVRfTVVMVElDQVNUCisJCQlpZiAocG8tPm1jbGlzdCkKKwkJCQlwYWNrZXRfZGV2X21jbGlzdChkZXYsIHBvLT5tY2xpc3QsIC0xKTsKKwkJCS8vIGZhbGx0aHJvdWdoCisjZW5kaWYKKwkJY2FzZSBORVRERVZfRE9XTjoKKwkJCWlmIChkZXYtPmlmaW5kZXggPT0gcG8tPmlmaW5kZXgpIHsKKwkJCQlzcGluX2xvY2soJnBvLT5iaW5kX2xvY2spOworCQkJCWlmIChwby0+cnVubmluZykgeworCQkJCQlfX2Rldl9yZW1vdmVfcGFjaygmcG8tPnByb3RfaG9vayk7CisJCQkJCV9fc29ja19wdXQoc2spOworCQkJCQlwby0+cnVubmluZyA9IDA7CisJCQkJCXNrLT5za19lcnIgPSBFTkVURE9XTjsKKwkJCQkJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCisJCQkJCQlzay0+c2tfZXJyb3JfcmVwb3J0KHNrKTsKKwkJCQl9CisJCQkJaWYgKG1zZyA9PSBORVRERVZfVU5SRUdJU1RFUikgeworCQkJCQlwby0+aWZpbmRleCA9IC0xOworCQkJCQlwby0+cHJvdF9ob29rLmRldiA9IE5VTEw7CisJCQkJfQorCQkJCXNwaW5fdW5sb2NrKCZwby0+YmluZF9sb2NrKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE5FVERFVl9VUDoKKwkJCXNwaW5fbG9jaygmcG8tPmJpbmRfbG9jayk7CisJCQlpZiAoZGV2LT5pZmluZGV4ID09IHBvLT5pZmluZGV4ICYmIHBvLT5udW0gJiYKKwkJCSAgICAhcG8tPnJ1bm5pbmcpIHsKKwkJCQlkZXZfYWRkX3BhY2soJnBvLT5wcm90X2hvb2spOworCQkJCXNvY2tfaG9sZChzayk7CisJCQkJcG8tPnJ1bm5pbmcgPSAxOworCQkJfQorCQkJc3Bpbl91bmxvY2soJnBvLT5iaW5kX2xvY2spOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmVhZF91bmxvY2soJnBhY2tldF9za2xpc3RfbG9jayk7CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisKK3N0YXRpYyBpbnQgcGFja2V0X2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBjbWQsCisJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKworCXN3aXRjaChjbWQpIHsKKwkJY2FzZSBTSU9DT1VUUToKKwkJeworCQkJaW50IGFtb3VudCA9IGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYyk7CisJCQlyZXR1cm4gcHV0X3VzZXIoYW1vdW50LCAoaW50IF9fdXNlciAqKWFyZyk7CisJCX0KKwkJY2FzZSBTSU9DSU5ROgorCQl7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJaW50IGFtb3VudCA9IDA7CisKKwkJCXNwaW5fbG9ja19iaCgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7CisJCQlza2IgPSBza2JfcGVlaygmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCQkJaWYgKHNrYikKKwkJCQlhbW91bnQgPSBza2ItPmxlbjsKKwkJCXNwaW5fdW5sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwkJCXJldHVybiBwdXRfdXNlcihhbW91bnQsIChpbnQgX191c2VyICopYXJnKTsKKwkJfQorCQljYXNlIFNJT0NHU1RBTVA6CisJCQlyZXR1cm4gc29ja19nZXRfdGltZXN0YW1wKHNrLCAoc3RydWN0IHRpbWV2YWwgX191c2VyICopYXJnKTsKKwkJCQorI2lmZGVmIENPTkZJR19JTkVUCisJCWNhc2UgU0lPQ0FERFJUOgorCQljYXNlIFNJT0NERUxSVDoKKwkJY2FzZSBTSU9DREFSUDoKKwkJY2FzZSBTSU9DR0FSUDoKKwkJY2FzZSBTSU9DU0FSUDoKKwkJY2FzZSBTSU9DR0lGQUREUjoKKwkJY2FzZSBTSU9DU0lGQUREUjoKKwkJY2FzZSBTSU9DR0lGQlJEQUREUjoKKwkJY2FzZSBTSU9DU0lGQlJEQUREUjoKKwkJY2FzZSBTSU9DR0lGTkVUTUFTSzoKKwkJY2FzZSBTSU9DU0lGTkVUTUFTSzoKKwkJY2FzZSBTSU9DR0lGRFNUQUREUjoKKwkJY2FzZSBTSU9DU0lGRFNUQUREUjoKKwkJY2FzZSBTSU9DU0lGRkxBR1M6CisJCQlyZXR1cm4gaW5ldF9kZ3JhbV9vcHMuaW9jdGwoc29jaywgY21kLCBhcmcpOworI2VuZGlmCisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBkZXZfaW9jdGwoY21kLCAodm9pZCBfX3VzZXIgKilhcmcpOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmbmRlZiBDT05GSUdfUEFDS0VUX01NQVAKKyNkZWZpbmUgcGFja2V0X21tYXAgc29ja19ub19tbWFwCisjZGVmaW5lIHBhY2tldF9wb2xsIGRhdGFncmFtX3BvbGwKKyNlbHNlCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGFja2V0X3BvbGwoc3RydWN0IGZpbGUgKiBmaWxlLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJCXBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHBhY2tldF9zb2NrICpwbyA9IHBrdF9zayhzayk7CisJdW5zaWduZWQgaW50IG1hc2sgPSBkYXRhZ3JhbV9wb2xsKGZpbGUsIHNvY2ssIHdhaXQpOworCisJc3Bpbl9sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwlpZiAocG8tPnBnX3ZlYykgeworCQl1bnNpZ25lZCBsYXN0ID0gcG8tPmhlYWQgPyBwby0+aGVhZC0xIDogcG8tPmZyYW1lX21heDsKKwkJc3RydWN0IHRwYWNrZXRfaGRyICpoOworCisJCWggPSAoc3RydWN0IHRwYWNrZXRfaGRyICopcGFja2V0X2xvb2t1cF9mcmFtZShwbywgbGFzdCk7CisKKwkJaWYgKGgtPnRwX3N0YXR1cykKKwkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOworCXJldHVybiBtYXNrOworfQorCisKKy8qIERpcnR5PyBXZWxsLCBJIHN0aWxsIGRpZCBub3QgbGVhcm4gYmV0dGVyIHdheSB0byBhY2NvdW50CisgKiBmb3IgdXNlciBtbWFwcy4KKyAqLworCitzdGF0aWMgdm9pZCBwYWNrZXRfbW1fb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IHZtYS0+dm1fZmlsZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHNvY2tldCAqIHNvY2sgPSBTT0NLRVRfSShpbm9kZSk7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJCisJaWYgKHNrKQorCQlhdG9taWNfaW5jKCZwa3Rfc2soc2spLT5tYXBwZWQpOworfQorCitzdGF0aWMgdm9pZCBwYWNrZXRfbW1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGZpbGUgKmZpbGUgPSB2bWEtPnZtX2ZpbGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBzb2NrZXQgKiBzb2NrID0gU09DS0VUX0koaW5vZGUpOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCQorCWlmIChzaykKKwkJYXRvbWljX2RlYygmcGt0X3NrKHNrKS0+bWFwcGVkKTsKK30KKworc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBwYWNrZXRfbW1hcF9vcHMgPSB7CisJLm9wZW4gPQlwYWNrZXRfbW1fb3BlbiwKKwkuY2xvc2UgPXBhY2tldF9tbV9jbG9zZSwKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnBnX3ZlY19lbmRwYWdlKGNoYXIgKm9uZV9wZ192ZWMsIHVuc2lnbmVkIGludCBvcmRlcikKK3sKKwlyZXR1cm4gdmlydF90b19wYWdlKG9uZV9wZ192ZWMgKyAoUEFHRV9TSVpFIDw8IG9yZGVyKSAtIDEpOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3BnX3ZlYyhjaGFyICoqcGdfdmVjLCB1bnNpZ25lZCBvcmRlciwgdW5zaWduZWQgbGVuKQoreworCWludCBpOworCisJZm9yIChpPTA7IGk8bGVuOyBpKyspIHsKKwkJaWYgKHBnX3ZlY1tpXSkgeworCQkJc3RydWN0IHBhZ2UgKnBhZ2UsICpwZW5kOworCisJCQlwZW5kID0gcGdfdmVjX2VuZHBhZ2UocGdfdmVjW2ldLCBvcmRlcik7CisJCQlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UocGdfdmVjW2ldKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCisJCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7CisJCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXBnX3ZlY1tpXSwgb3JkZXIpOworCQl9CisJfQorCWtmcmVlKHBnX3ZlYyk7Cit9CisKKworc3RhdGljIGludCBwYWNrZXRfc2V0X3Jpbmcoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdHBhY2tldF9yZXEgKnJlcSwgaW50IGNsb3NpbmcpCit7CisJY2hhciAqKnBnX3ZlYyA9IE5VTEw7CisJc3RydWN0IHBhY2tldF9zb2NrICpwbyA9IHBrdF9zayhzayk7CisJaW50IHdhc19ydW5uaW5nLCBudW0sIG9yZGVyID0gMDsKKwlpbnQgZXJyID0gMDsKKwkKKwlpZiAocmVxLT50cF9ibG9ja19ucikgeworCQlpbnQgaSwgbDsKKworCQkvKiBTYW5pdHkgdGVzdHMgYW5kIHNvbWUgY2FsY3VsYXRpb25zICovCisKKwkJaWYgKHBvLT5wZ192ZWMpCisJCQlyZXR1cm4gLUVCVVNZOworCisJCWlmICgoaW50KXJlcS0+dHBfYmxvY2tfc2l6ZSA8PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChyZXEtPnRwX2Jsb2NrX3NpemUmKFBBR0VfU0laRS0xKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAocmVxLT50cF9mcmFtZV9zaXplIDwgVFBBQ0tFVF9IRFJMRU4pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHJlcS0+dHBfZnJhbWVfc2l6ZSYoVFBBQ0tFVF9BTElHTk1FTlQtMSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlwby0+ZnJhbWVzX3Blcl9ibG9jayA9IHJlcS0+dHBfYmxvY2tfc2l6ZS9yZXEtPnRwX2ZyYW1lX3NpemU7CisJCWlmIChwby0+ZnJhbWVzX3Blcl9ibG9jayA8PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChwby0+ZnJhbWVzX3Blcl9ibG9jaypyZXEtPnRwX2Jsb2NrX25yICE9IHJlcS0+dHBfZnJhbWVfbnIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJLyogT0shICovCisKKwkJLyogQWxsb2NhdGUgcGFnZSB2ZWN0b3IgKi8KKwkJd2hpbGUgKChQQUdFX1NJWkU8PG9yZGVyKSA8IHJlcS0+dHBfYmxvY2tfc2l6ZSkKKwkJCW9yZGVyKys7CisKKwkJZXJyID0gLUVOT01FTTsKKworCQlwZ192ZWMgPSBrbWFsbG9jKHJlcS0+dHBfYmxvY2tfbnIqc2l6ZW9mKGNoYXIgKiksIEdGUF9LRVJORUwpOworCQlpZiAocGdfdmVjID09IE5VTEwpCisJCQlnb3RvIG91dDsKKwkJbWVtc2V0KHBnX3ZlYywgMCwgcmVxLT50cF9ibG9ja19ucipzaXplb2YoY2hhciAqKikpOworCisJCWZvciAoaT0wOyBpPHJlcS0+dHBfYmxvY2tfbnI7IGkrKykgeworCQkJc3RydWN0IHBhZ2UgKnBhZ2UsICpwZW5kOworCQkJcGdfdmVjW2ldID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIG9yZGVyKTsKKwkJCWlmICghcGdfdmVjW2ldKQorCQkJCWdvdG8gb3V0X2ZyZWVfcGd2ZWM7CisKKwkJCXBlbmQgPSBwZ192ZWNfZW5kcGFnZShwZ192ZWNbaV0sIG9yZGVyKTsKKwkJCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShwZ192ZWNbaV0pOyBwYWdlIDw9IHBlbmQ7IHBhZ2UrKykKKwkJCQlTZXRQYWdlUmVzZXJ2ZWQocGFnZSk7CisJCX0KKwkJLyogUGFnZSB2ZWN0b3IgaXMgYWxsb2NhdGVkICovCisKKwkJbCA9IDA7CisJCWZvciAoaT0wOyBpPHJlcS0+dHBfYmxvY2tfbnI7IGkrKykgeworCQkJY2hhciAqcHRyID0gcGdfdmVjW2ldOworCQkJc3RydWN0IHRwYWNrZXRfaGRyICpoZWFkZXI7CisJCQlpbnQgazsKKworCQkJZm9yIChrPTA7IGs8cG8tPmZyYW1lc19wZXJfYmxvY2s7IGsrKykgeworCQkJCQorCQkJCWhlYWRlciA9IChzdHJ1Y3QgdHBhY2tldF9oZHIqKXB0cjsKKwkJCQloZWFkZXItPnRwX3N0YXR1cyA9IFRQX1NUQVRVU19LRVJORUw7CisJCQkJcHRyICs9IHJlcS0+dHBfZnJhbWVfc2l6ZTsKKwkJCX0KKwkJfQorCQkvKiBEb25lICovCisJfSBlbHNlIHsKKwkJaWYgKHJlcS0+dHBfZnJhbWVfbnIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsb2NrX3NvY2soc2spOworCisJLyogRGV0YWNoIHNvY2tldCBmcm9tIG5ldHdvcmsgKi8KKwlzcGluX2xvY2soJnBvLT5iaW5kX2xvY2spOworCXdhc19ydW5uaW5nID0gcG8tPnJ1bm5pbmc7CisJbnVtID0gcG8tPm51bTsKKwlpZiAod2FzX3J1bm5pbmcpIHsKKwkJX19kZXZfcmVtb3ZlX3BhY2soJnBvLT5wcm90X2hvb2spOworCQlwby0+bnVtID0gMDsKKwkJcG8tPnJ1bm5pbmcgPSAwOworCQlfX3NvY2tfcHV0KHNrKTsKKwl9CisJc3Bpbl91bmxvY2soJnBvLT5iaW5kX2xvY2spOworCQkKKwlzeW5jaHJvbml6ZV9uZXQoKTsKKworCWVyciA9IC1FQlVTWTsKKwlpZiAoY2xvc2luZyB8fCBhdG9taWNfcmVhZCgmcG8tPm1hcHBlZCkgPT0gMCkgeworCQllcnIgPSAwOworI2RlZmluZSBYQyhhLCBiKSAoeyBfX3R5cGVvZl9fICgoYSkpIF9fdDsgX190ID0gKGEpOyAoYSkgPSAoYik7IF9fdDsgfSkKKworCQlzcGluX2xvY2tfYmgoJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOworCQlwZ192ZWMgPSBYQyhwby0+cGdfdmVjLCBwZ192ZWMpOworCQlwby0+ZnJhbWVfbWF4ID0gcmVxLT50cF9mcmFtZV9uci0xOworCQlwby0+aGVhZCA9IDA7CisJCXBvLT5mcmFtZV9zaXplID0gcmVxLT50cF9mcmFtZV9zaXplOworCQlzcGluX3VubG9ja19iaCgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7CisKKwkJb3JkZXIgPSBYQyhwby0+cGdfdmVjX29yZGVyLCBvcmRlcik7CisJCXJlcS0+dHBfYmxvY2tfbnIgPSBYQyhwby0+cGdfdmVjX2xlbiwgcmVxLT50cF9ibG9ja19ucik7CisKKwkJcG8tPnBnX3ZlY19wYWdlcyA9IHJlcS0+dHBfYmxvY2tfc2l6ZS9QQUdFX1NJWkU7CisJCXBvLT5wcm90X2hvb2suZnVuYyA9IHBvLT5wZ192ZWMgPyB0cGFja2V0X3JjdiA6IHBhY2tldF9yY3Y7CisJCXNrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOworI3VuZGVmIFhDCisJCWlmIChhdG9taWNfcmVhZCgmcG8tPm1hcHBlZCkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAicGFja2V0X21tYXA6IHZtYSBpcyBidXN5OiAlZFxuIiwgYXRvbWljX3JlYWQoJnBvLT5tYXBwZWQpKTsKKwl9CisKKwlzcGluX2xvY2soJnBvLT5iaW5kX2xvY2spOworCWlmICh3YXNfcnVubmluZyAmJiAhcG8tPnJ1bm5pbmcpIHsKKwkJc29ja19ob2xkKHNrKTsKKwkJcG8tPnJ1bm5pbmcgPSAxOworCQlwby0+bnVtID0gbnVtOworCQlkZXZfYWRkX3BhY2soJnBvLT5wcm90X2hvb2spOworCX0KKwlzcGluX3VubG9jaygmcG8tPmJpbmRfbG9jayk7CisKKwlyZWxlYXNlX3NvY2soc2spOworCitvdXRfZnJlZV9wZ3ZlYzoKKwlpZiAocGdfdmVjKQorCQlmcmVlX3BnX3ZlYyhwZ192ZWMsIG9yZGVyLCByZXEtPnRwX2Jsb2NrX25yKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHBhY2tldF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvID0gcGt0X3NrKHNrKTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgbG9uZyBzdGFydDsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKwlpbnQgaTsKKworCWlmICh2bWEtPnZtX3Bnb2ZmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisKKwlsb2NrX3NvY2soc2spOworCWlmIChwby0+cGdfdmVjID09IE5VTEwpCisJCWdvdG8gb3V0OworCWlmIChzaXplICE9IHBvLT5wZ192ZWNfbGVuKnBvLT5wZ192ZWNfcGFnZXMqUEFHRV9TSVpFKQorCQlnb3RvIG91dDsKKworCWF0b21pY19pbmMoJnBvLT5tYXBwZWQpOworCXN0YXJ0ID0gdm1hLT52bV9zdGFydDsKKwllcnIgPSAtRUFHQUlOOworCWZvciAoaT0wOyBpPHBvLT5wZ192ZWNfbGVuOyBpKyspIHsKKwkJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHN0YXJ0LAorCQkJCSAgICAgX19wYShwby0+cGdfdmVjW2ldKSA+PiBQQUdFX1NISUZULAorCQkJCSAgICAgcG8tPnBnX3ZlY19wYWdlcypQQUdFX1NJWkUsCisJCQkJICAgICB2bWEtPnZtX3BhZ2VfcHJvdCkpCisJCQlnb3RvIG91dDsKKwkJc3RhcnQgKz0gcG8tPnBnX3ZlY19wYWdlcypQQUdFX1NJWkU7CisJfQorCXZtYS0+dm1fb3BzID0gJnBhY2tldF9tbWFwX29wczsKKwllcnIgPSAwOworCitvdXQ6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmCisKKworI2lmZGVmIENPTkZJR19TT0NLX1BBQ0tFVAorc3RhdGljIHN0cnVjdCBwcm90b19vcHMgcGFja2V0X29wc19zcGt0ID0geworCS5mYW1pbHkgPQlQRl9QQUNLRVQsCisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLnJlbGVhc2UgPQlwYWNrZXRfcmVsZWFzZSwKKwkuYmluZCA9CQlwYWNrZXRfYmluZF9zcGt0LAorCS5jb25uZWN0ID0Jc29ja19ub19jb25uZWN0LAorCS5zb2NrZXRwYWlyID0Jc29ja19ub19zb2NrZXRwYWlyLAorCS5hY2NlcHQgPQlzb2NrX25vX2FjY2VwdCwKKwkuZ2V0bmFtZSA9CXBhY2tldF9nZXRuYW1lX3Nwa3QsCisJLnBvbGwgPQkJZGF0YWdyYW1fcG9sbCwKKwkuaW9jdGwgPQlwYWNrZXRfaW9jdGwsCisJLmxpc3RlbiA9CXNvY2tfbm9fbGlzdGVuLAorCS5zaHV0ZG93biA9CXNvY2tfbm9fc2h1dGRvd24sCisJLnNldHNvY2tvcHQgPQlzb2NrX25vX3NldHNvY2tvcHQsCisJLmdldHNvY2tvcHQgPQlzb2NrX25vX2dldHNvY2tvcHQsCisJLnNlbmRtc2cgPQlwYWNrZXRfc2VuZG1zZ19zcGt0LAorCS5yZWN2bXNnID0JcGFja2V0X3JlY3Ztc2csCisJLm1tYXAgPQkJc29ja19ub19tbWFwLAorCS5zZW5kcGFnZSA9CXNvY2tfbm9fc2VuZHBhZ2UsCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIHBhY2tldF9vcHMgPSB7CisJLmZhbWlseSA9CVBGX1BBQ0tFVCwKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkucmVsZWFzZSA9CXBhY2tldF9yZWxlYXNlLAorCS5iaW5kID0JCXBhY2tldF9iaW5kLAorCS5jb25uZWN0ID0Jc29ja19ub19jb25uZWN0LAorCS5zb2NrZXRwYWlyID0Jc29ja19ub19zb2NrZXRwYWlyLAorCS5hY2NlcHQgPQlzb2NrX25vX2FjY2VwdCwKKwkuZ2V0bmFtZSA9CXBhY2tldF9nZXRuYW1lLCAKKwkucG9sbCA9CQlwYWNrZXRfcG9sbCwKKwkuaW9jdGwgPQlwYWNrZXRfaW9jdGwsCisJLmxpc3RlbiA9CXNvY2tfbm9fbGlzdGVuLAorCS5zaHV0ZG93biA9CXNvY2tfbm9fc2h1dGRvd24sCisJLnNldHNvY2tvcHQgPQlwYWNrZXRfc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdCA9CXBhY2tldF9nZXRzb2Nrb3B0LAorCS5zZW5kbXNnID0JcGFja2V0X3NlbmRtc2csCisJLnJlY3Ztc2cgPQlwYWNrZXRfcmVjdm1zZywKKwkubW1hcCA9CQlwYWNrZXRfbW1hcCwKKwkuc2VuZHBhZ2UgPQlzb2NrX25vX3NlbmRwYWdlLAorfTsKKworc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5IHBhY2tldF9mYW1pbHlfb3BzID0geworCS5mYW1pbHkgPQlQRl9QQUNLRVQsCisJLmNyZWF0ZSA9CXBhY2tldF9jcmVhdGUsCisJLm93bmVyCT0JVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBhY2tldF9uZXRkZXZfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPXBhY2tldF9ub3RpZmllciwKK307CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29jayAqcGFja2V0X3NlcV9pZHgobG9mZl90IG9mZikKK3sKKwlzdHJ1Y3Qgc29jayAqczsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCXNrX2Zvcl9lYWNoKHMsIG5vZGUsICZwYWNrZXRfc2tsaXN0KSB7CisJCWlmICghb2ZmLS0pCisJCQlyZXR1cm4gczsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICpwYWNrZXRfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlyZWFkX2xvY2soJnBhY2tldF9za2xpc3RfbG9jayk7CisJcmV0dXJuICpwb3MgPyBwYWNrZXRfc2VxX2lkeCgqcG9zIC0gMSkgOiBTRVFfU1RBUlRfVE9LRU47Cit9CisKK3N0YXRpYyB2b2lkICpwYWNrZXRfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCSsrKnBvczsKKwlyZXR1cm4gICh2ID09IFNFUV9TVEFSVF9UT0tFTikgCisJCT8gc2tfaGVhZCgmcGFja2V0X3NrbGlzdCkgCisJCTogc2tfbmV4dCgoc3RydWN0IHNvY2sqKXYpIDsKK30KKworc3RhdGljIHZvaWQgcGFja2V0X3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXJlYWRfdW5sb2NrKCZwYWNrZXRfc2tsaXN0X2xvY2spOwkJCit9CisKK3N0YXRpYyBpbnQgcGFja2V0X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KSAKK3sKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXNlcV9wdXRzKHNlcSwgInNrICAgICAgIFJlZkNudCBUeXBlIFByb3RvICBJZmFjZSBSIFJtZW0gICBVc2VyICAgSW5vZGVcbiIpOworCWVsc2UgeworCQlzdHJ1Y3Qgc29jayAqcyA9IHY7CisJCWNvbnN0IHN0cnVjdCBwYWNrZXRfc29jayAqcG8gPSBwa3Rfc2socyk7CisKKwkJc2VxX3ByaW50ZihzZXEsCisJCQkgICAiJXAgJS02ZCAlLTRkICUwNHggICAlLTVkICUxZCAlLTZ1ICUtNnUgJS02bHVcbiIsCisJCQkgICBzLAorCQkJICAgYXRvbWljX3JlYWQoJnMtPnNrX3JlZmNudCksCisJCQkgICBzLT5za190eXBlLAorCQkJICAgbnRvaHMocG8tPm51bSksCisJCQkgICBwby0+aWZpbmRleCwKKwkJCSAgIHBvLT5ydW5uaW5nLAorCQkJICAgYXRvbWljX3JlYWQoJnMtPnNrX3JtZW1fYWxsb2MpLAorCQkJICAgc29ja19pX3VpZChzKSwKKwkJCSAgIHNvY2tfaV9pbm8ocykgKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBwYWNrZXRfc2VxX29wcyA9IHsKKwkuc3RhcnQJPSBwYWNrZXRfc2VxX3N0YXJ0LAorCS5uZXh0CT0gcGFja2V0X3NlcV9uZXh0LAorCS5zdG9wCT0gcGFja2V0X3NlcV9zdG9wLAorCS5zaG93CT0gcGFja2V0X3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBwYWNrZXRfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZwYWNrZXRfc2VxX29wcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBhY2tldF9zZXFfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gcGFja2V0X3NlcV9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCisjZW5kaWYKKworc3RhdGljIHZvaWQgX19leGl0IHBhY2tldF9leGl0KHZvaWQpCit7CisJcHJvY19uZXRfcmVtb3ZlKCJwYWNrZXQiKTsKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmcGFja2V0X25ldGRldl9ub3RpZmllcik7CisJc29ja191bnJlZ2lzdGVyKFBGX1BBQ0tFVCk7CisJcHJvdG9fdW5yZWdpc3RlcigmcGFja2V0X3Byb3RvKTsKK30KKworc3RhdGljIGludCBfX2luaXQgcGFja2V0X2luaXQodm9pZCkKK3sKKwlpbnQgcmMgPSBwcm90b19yZWdpc3RlcigmcGFja2V0X3Byb3RvLCAwKTsKKworCWlmIChyYyAhPSAwKQorCQlnb3RvIG91dDsKKworCXNvY2tfcmVnaXN0ZXIoJnBhY2tldF9mYW1pbHlfb3BzKTsKKwlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJnBhY2tldF9uZXRkZXZfbm90aWZpZXIpOworCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJwYWNrZXQiLCAwLCAmcGFja2V0X3NlcV9mb3BzKTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK21vZHVsZV9pbml0KHBhY2tldF9pbml0KTsKK21vZHVsZV9leGl0KHBhY2tldF9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19ORVRQUk9UTyhQRl9QQUNLRVQpOwpkaWZmIC0tZ2l0IGEvbmV0L3Jvc2UvTWFrZWZpbGUgYi9uZXQvcm9zZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTI0ODExCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3Jvc2UvTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggUm9zZSAoWC4yNSBQTFApIGxheWVyLgorIworCitvYmotJChDT05GSUdfUk9TRSkgKz0gcm9zZS5vCisKK3Jvc2UteQkgIDo9IGFmX3Jvc2UubyByb3NlX2Rldi5vIHJvc2VfaW4ubyByb3NlX2xpbmsubyByb3NlX2xvb3BiYWNrLm8gXAorCSAgICAgcm9zZV9vdXQubyByb3NlX3JvdXRlLm8gcm9zZV9zdWJyLm8gcm9zZV90aW1lci5vCityb3NlLSQoQ09ORklHX1NZU0NUTCkgKz0gc3lzY3RsX25ldF9yb3NlLm8KZGlmZiAtLWdpdCBhL25ldC9yb3NlL2FmX3Jvc2UuYyBiL25ldC9yb3NlL2FmX3Jvc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWI2YTViCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3Jvc2UvYWZfcm9zZS5jCkBAIC0wLDAgKzEsMTU4OSBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQ29weXJpZ2h0IChDKSBKb25hdGhhbiBOYXlsb3IgRzRLTFggKGc0a2x4QGc0a2x4LmRlbW9uLmNvLnVrKQorICogQ29weXJpZ2h0IChDKSBBbGFuIENveCBHVzRQVFMgKGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51aykKKyAqIENvcHlyaWdodCAoQykgVGVycnkgRGF3c29uIFZLMktUSiAodGVycnlAYW5pbWF0cy5uZXQpCisgKiBDb3B5cmlnaHQgKEMpIFRvbWkgTWFubmluZW4gT0gyQk5TIChvaDJibnNAc3JhbC5maSkKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bmV0L2F4MjUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bmV0L3Jvc2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorCitzdGF0aWMgaW50IHJvc2VfbmRldnMgPSAxMDsKKworaW50IHN5c2N0bF9yb3NlX3Jlc3RhcnRfcmVxdWVzdF90aW1lb3V0ID0gUk9TRV9ERUZBVUxUX1QwOworaW50IHN5c2N0bF9yb3NlX2NhbGxfcmVxdWVzdF90aW1lb3V0ICAgID0gUk9TRV9ERUZBVUxUX1QxOworaW50IHN5c2N0bF9yb3NlX3Jlc2V0X3JlcXVlc3RfdGltZW91dCAgID0gUk9TRV9ERUZBVUxUX1QyOworaW50IHN5c2N0bF9yb3NlX2NsZWFyX3JlcXVlc3RfdGltZW91dCAgID0gUk9TRV9ERUZBVUxUX1QzOworaW50IHN5c2N0bF9yb3NlX25vX2FjdGl2aXR5X3RpbWVvdXQgICAgID0gUk9TRV9ERUZBVUxUX0lETEU7CitpbnQgc3lzY3RsX3Jvc2VfYWNrX2hvbGRfYmFja190aW1lb3V0ICAgPSBST1NFX0RFRkFVTFRfSEI7CitpbnQgc3lzY3RsX3Jvc2Vfcm91dGluZ19jb250cm9sICAgICAgICAgPSBST1NFX0RFRkFVTFRfUk9VVElORzsKK2ludCBzeXNjdGxfcm9zZV9saW5rX2ZhaWxfdGltZW91dCAgICAgICA9IFJPU0VfREVGQVVMVF9GQUlMX1RJTUVPVVQ7CitpbnQgc3lzY3RsX3Jvc2VfbWF4aW11bV92Y3MgICAgICAgICAgICAgPSBST1NFX0RFRkFVTFRfTUFYVkM7CitpbnQgc3lzY3RsX3Jvc2Vfd2luZG93X3NpemUgICAgICAgICAgICAgPSBST1NFX0RFRkFVTFRfV0lORE9XX1NJWkU7CisKK3N0YXRpYyBITElTVF9IRUFEKHJvc2VfbGlzdCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJvc2VfbGlzdF9sb2NrKTsKKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgcm9zZV9wcm90b19vcHM7CisKK2F4MjVfYWRkcmVzcyByb3NlX2NhbGxzaWduOworCisvKgorICoJQ29udmVydCBhIFJPU0UgYWRkcmVzcyBpbnRvIHRleHQuCisgKi8KK2NvbnN0IGNoYXIgKnJvc2UyYXNjKGNvbnN0IHJvc2VfYWRkcmVzcyAqYWRkcikKK3sKKwlzdGF0aWMgY2hhciBidWZmZXJbMTFdOworCisJaWYgKGFkZHItPnJvc2VfYWRkclswXSA9PSAweDAwICYmIGFkZHItPnJvc2VfYWRkclsxXSA9PSAweDAwICYmCisJICAgIGFkZHItPnJvc2VfYWRkclsyXSA9PSAweDAwICYmIGFkZHItPnJvc2VfYWRkclszXSA9PSAweDAwICYmCisJICAgIGFkZHItPnJvc2VfYWRkcls0XSA9PSAweDAwKSB7CisJCXN0cmNweShidWZmZXIsICIqIik7CisJfSBlbHNlIHsKKwkJc3ByaW50ZihidWZmZXIsICIlMDJYJTAyWCUwMlglMDJYJTAyWCIsIGFkZHItPnJvc2VfYWRkclswXSAmIDB4RkYsCisJCQkJCQlhZGRyLT5yb3NlX2FkZHJbMV0gJiAweEZGLAorCQkJCQkJYWRkci0+cm9zZV9hZGRyWzJdICYgMHhGRiwKKwkJCQkJCWFkZHItPnJvc2VfYWRkclszXSAmIDB4RkYsCisJCQkJCQlhZGRyLT5yb3NlX2FkZHJbNF0gJiAweEZGKTsKKwl9CisKKwlyZXR1cm4gYnVmZmVyOworfQorCisvKgorICoJQ29tcGFyZSB0d28gUk9TRSBhZGRyZXNzZXMsIDAgPT0gZXF1YWwuCisgKi8KK2ludCByb3NlY21wKHJvc2VfYWRkcmVzcyAqYWRkcjEsIHJvc2VfYWRkcmVzcyAqYWRkcjIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQlpZiAoYWRkcjEtPnJvc2VfYWRkcltpXSAhPSBhZGRyMi0+cm9zZV9hZGRyW2ldKQorCQkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCUNvbXBhcmUgdHdvIFJPU0UgYWRkcmVzc2VzIGZvciBvbmx5IG1hc2sgZGlnaXRzLCAwID09IGVxdWFsLgorICovCitpbnQgcm9zZWNtcG0ocm9zZV9hZGRyZXNzICphZGRyMSwgcm9zZV9hZGRyZXNzICphZGRyMiwgdW5zaWduZWQgc2hvcnQgbWFzaykKK3sKKwlpbnQgaSwgajsKKworCWlmIChtYXNrID4gMTApCisJCXJldHVybiAxOworCisJZm9yIChpID0gMDsgaSA8IG1hc2s7IGkrKykgeworCQlqID0gaSAvIDI7CisKKwkJaWYgKChpICUgMikgIT0gMCkgeworCQkJaWYgKChhZGRyMS0+cm9zZV9hZGRyW2pdICYgMHgwRikgIT0gKGFkZHIyLT5yb3NlX2FkZHJbal0gJiAweDBGKSkKKwkJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIHsKKwkJCWlmICgoYWRkcjEtPnJvc2VfYWRkcltqXSAmIDB4RjApICE9IChhZGRyMi0+cm9zZV9hZGRyW2pdICYgMHhGMCkpCisJCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCVNvY2tldCByZW1vdmFsIGR1cmluZyBhbiBpbnRlcnJ1cHQgaXMgbm93IHNhZmUuCisgKi8KK3N0YXRpYyB2b2lkIHJvc2VfcmVtb3ZlX3NvY2tldChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3Bpbl9sb2NrX2JoKCZyb3NlX2xpc3RfbG9jayk7CisJc2tfZGVsX25vZGVfaW5pdChzayk7CisJc3Bpbl91bmxvY2tfYmgoJnJvc2VfbGlzdF9sb2NrKTsKK30KKworLyoKKyAqCUtpbGwgYWxsIGJvdW5kIHNvY2tldHMgb24gYSBicm9rZW4gbGluayBsYXllciBjb25uZWN0aW9uIHRvIGEKKyAqCXBhcnRpY3VsYXIgbmVpZ2hib3VyLgorICovCit2b2lkIHJvc2Vfa2lsbF9ieV9uZWlnaChzdHJ1Y3Qgcm9zZV9uZWlnaCAqbmVpZ2gpCit7CisJc3RydWN0IHNvY2sgKnM7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisKKwlzcGluX2xvY2tfYmgoJnJvc2VfbGlzdF9sb2NrKTsKKwlza19mb3JfZWFjaChzLCBub2RlLCAmcm9zZV9saXN0KSB7CisJCXN0cnVjdCByb3NlX3NvY2sgKnJvc2UgPSByb3NlX3NrKHMpOworCisJCWlmIChyb3NlLT5uZWlnaGJvdXIgPT0gbmVpZ2gpIHsKKwkJCXJvc2VfZGlzY29ubmVjdChzLCBFTkVUVU5SRUFDSCwgUk9TRV9PVVRfT0ZfT1JERVIsIDApOworCQkJcm9zZS0+bmVpZ2hib3VyLT51c2UtLTsKKwkJCXJvc2UtPm5laWdoYm91ciA9IE5VTEw7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJnJvc2VfbGlzdF9sb2NrKTsKK30KKworLyoKKyAqCUtpbGwgYWxsIGJvdW5kIHNvY2tldHMgb24gYSBkcm9wcGVkIGRldmljZS4KKyAqLworc3RhdGljIHZvaWQgcm9zZV9raWxsX2J5X2RldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzb2NrICpzOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJc3Bpbl9sb2NrX2JoKCZyb3NlX2xpc3RfbG9jayk7CisJc2tfZm9yX2VhY2gocywgbm9kZSwgJnJvc2VfbGlzdCkgeworCQlzdHJ1Y3Qgcm9zZV9zb2NrICpyb3NlID0gcm9zZV9zayhzKTsKKworCQlpZiAocm9zZS0+ZGV2aWNlID09IGRldikgeworCQkJcm9zZV9kaXNjb25uZWN0KHMsIEVORVRVTlJFQUNILCBST1NFX09VVF9PRl9PUkRFUiwgMCk7CisJCQlyb3NlLT5uZWlnaGJvdXItPnVzZS0tOworCQkJcm9zZS0+ZGV2aWNlID0gTlVMTDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19iaCgmcm9zZV9saXN0X2xvY2spOworfQorCisvKgorICoJSGFuZGxlIGRldmljZSBzdGF0dXMgY2hhbmdlcy4KKyAqLworc3RhdGljIGludCByb3NlX2RldmljZV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsCisJdm9pZCAqcHRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilwdHI7CisKKwlpZiAoZXZlbnQgIT0gTkVUREVWX0RPV04pCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCXN3aXRjaCAoZGV2LT50eXBlKSB7CisJY2FzZSBBUlBIUkRfUk9TRToKKwkJcm9zZV9raWxsX2J5X2RldmljZShkZXYpOworCQlicmVhazsKKwljYXNlIEFSUEhSRF9BWDI1OgorCQlyb3NlX2xpbmtfZGV2aWNlX2Rvd24oZGV2KTsKKwkJcm9zZV9ydF9kZXZpY2VfZG93bihkZXYpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKy8qCisgKglBZGQgYSBzb2NrZXQgdG8gdGhlIGJvdW5kIHNvY2tldHMgbGlzdC4KKyAqLworc3RhdGljIHZvaWQgcm9zZV9pbnNlcnRfc29ja2V0KHN0cnVjdCBzb2NrICpzaykKK3sKKworCXNwaW5fbG9ja19iaCgmcm9zZV9saXN0X2xvY2spOworCXNrX2FkZF9ub2RlKHNrLCAmcm9zZV9saXN0KTsKKwlzcGluX3VubG9ja19iaCgmcm9zZV9saXN0X2xvY2spOworfQorCisvKgorICoJRmluZCBhIHNvY2tldCB0aGF0IHdhbnRzIHRvIGFjY2VwdCB0aGUgQ2FsbCBSZXF1ZXN0IHdlIGp1c3QKKyAqCXJlY2VpdmVkLgorICovCitzdGF0aWMgc3RydWN0IHNvY2sgKnJvc2VfZmluZF9saXN0ZW5lcihyb3NlX2FkZHJlc3MgKmFkZHIsIGF4MjVfYWRkcmVzcyAqY2FsbCkKK3sKKwlzdHJ1Y3Qgc29jayAqczsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCXNwaW5fbG9ja19iaCgmcm9zZV9saXN0X2xvY2spOworCXNrX2Zvcl9lYWNoKHMsIG5vZGUsICZyb3NlX2xpc3QpIHsKKwkJc3RydWN0IHJvc2Vfc29jayAqcm9zZSA9IHJvc2Vfc2socyk7CisKKwkJaWYgKCFyb3NlY21wKCZyb3NlLT5zb3VyY2VfYWRkciwgYWRkcikgJiYKKwkJICAgICFheDI1Y21wKCZyb3NlLT5zb3VyY2VfY2FsbCwgY2FsbCkgJiYKKwkJICAgICFyb3NlLT5zb3VyY2VfbmRpZ2lzICYmIHMtPnNrX3N0YXRlID09IFRDUF9MSVNURU4pCisJCQlnb3RvIGZvdW5kOworCX0KKworCXNrX2Zvcl9lYWNoKHMsIG5vZGUsICZyb3NlX2xpc3QpIHsKKwkJc3RydWN0IHJvc2Vfc29jayAqcm9zZSA9IHJvc2Vfc2socyk7CisKKwkJaWYgKCFyb3NlY21wKCZyb3NlLT5zb3VyY2VfYWRkciwgYWRkcikgJiYKKwkJICAgICFheDI1Y21wKCZyb3NlLT5zb3VyY2VfY2FsbCwgJm51bGxfYXgyNV9hZGRyZXNzKSAmJgorCQkgICAgcy0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTikKKwkJCWdvdG8gZm91bmQ7CisJfQorCXMgPSBOVUxMOworZm91bmQ6CisJc3Bpbl91bmxvY2tfYmgoJnJvc2VfbGlzdF9sb2NrKTsKKwlyZXR1cm4gczsKK30KKworLyoKKyAqCUZpbmQgYSBjb25uZWN0ZWQgUk9TRSBzb2NrZXQgZ2l2ZW4gbXkgTENJIGFuZCBkZXZpY2UuCisgKi8KK3N0cnVjdCBzb2NrICpyb3NlX2ZpbmRfc29ja2V0KHVuc2lnbmVkIGludCBsY2ksIHN0cnVjdCByb3NlX25laWdoICpuZWlnaCkKK3sKKwlzdHJ1Y3Qgc29jayAqczsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCXNwaW5fbG9ja19iaCgmcm9zZV9saXN0X2xvY2spOworCXNrX2Zvcl9lYWNoKHMsIG5vZGUsICZyb3NlX2xpc3QpIHsKKwkJc3RydWN0IHJvc2Vfc29jayAqcm9zZSA9IHJvc2Vfc2socyk7CisKKwkJaWYgKHJvc2UtPmxjaSA9PSBsY2kgJiYgcm9zZS0+bmVpZ2hib3VyID09IG5laWdoKQorCQkJZ290byBmb3VuZDsKKwl9CisJcyA9IE5VTEw7Citmb3VuZDoKKwlzcGluX3VubG9ja19iaCgmcm9zZV9saXN0X2xvY2spOworCXJldHVybiBzOworfQorCisvKgorICoJRmluZCBhIHVuaXF1ZSBMQ0kgZm9yIGEgZ2l2ZW4gZGV2aWNlLgorICovCit1bnNpZ25lZCBpbnQgcm9zZV9uZXdfbGNpKHN0cnVjdCByb3NlX25laWdoICpuZWlnaCkKK3sKKwlpbnQgbGNpOworCisJaWYgKG5laWdoLT5kY2VfbW9kZSkgeworCQlmb3IgKGxjaSA9IDE7IGxjaSA8PSBzeXNjdGxfcm9zZV9tYXhpbXVtX3ZjczsgbGNpKyspCisJCQlpZiAocm9zZV9maW5kX3NvY2tldChsY2ksIG5laWdoKSA9PSBOVUxMICYmIHJvc2Vfcm91dGVfZnJlZV9sY2kobGNpLCBuZWlnaCkgPT0gTlVMTCkKKwkJCQlyZXR1cm4gbGNpOworCX0gZWxzZSB7CisJCWZvciAobGNpID0gc3lzY3RsX3Jvc2VfbWF4aW11bV92Y3M7IGxjaSA+IDA7IGxjaS0tKQorCQkJaWYgKHJvc2VfZmluZF9zb2NrZXQobGNpLCBuZWlnaCkgPT0gTlVMTCAmJiByb3NlX3JvdXRlX2ZyZWVfbGNpKGxjaSwgbmVpZ2gpID09IE5VTEwpCisJCQkJcmV0dXJuIGxjaTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCURlZmVycmVkIGRlc3Ryb3kuCisgKi8KK3ZvaWQgcm9zZV9kZXN0cm95X3NvY2tldChzdHJ1Y3Qgc29jayAqKTsKKworLyoKKyAqCUhhbmRsZXIgZm9yIGRlZmVycmVkIGtpbGxzLgorICovCitzdGF0aWMgdm9pZCByb3NlX2Rlc3Ryb3lfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXJvc2VfZGVzdHJveV9zb2NrZXQoKHN0cnVjdCBzb2NrICopZGF0YSk7Cit9CisKKy8qCisgKglUaGlzIGlzIGNhbGxlZCBmcm9tIHVzZXIgbW9kZSBhbmQgdGhlIHRpbWVycy4gVGh1cyBpdCBwcm90ZWN0cyBpdHNlbGYKKyAqCWFnYWluc3QgaW50ZXJydXB0IHVzZXJzIGJ1dCBkb2Vzbid0IHdvcnJ5IGFib3V0IGJlaW5nIGNhbGxlZCBkdXJpbmcKKyAqCXdvcmsuICBPbmNlIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWUgbm8gaW50ZXJydXB0IG9yIGJvdHRvbSBoYWxmCisgKgl3aWxsIHRvdWNoIGl0IGFuZCB3ZSBhcmUgKGZhaXJseSA4LSkgKSBzYWZlLgorICovCit2b2lkIHJvc2VfZGVzdHJveV9zb2NrZXQoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlyb3NlX3JlbW92ZV9zb2NrZXQoc2spOworCXJvc2Vfc3RvcF9oZWFydGJlYXQoc2spOworCXJvc2Vfc3RvcF9pZGxldGltZXIoc2spOworCXJvc2Vfc3RvcF90aW1lcihzayk7CisKKwlyb3NlX2NsZWFyX3F1ZXVlcyhzayk7CQkvKiBGbHVzaCB0aGUgcXVldWVzICovCisKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpICE9IE5VTEwpIHsKKwkJaWYgKHNrYi0+c2sgIT0gc2spIHsJLyogQSBwZW5kaW5nIGNvbm5lY3Rpb24gKi8KKwkJCS8qIFF1ZXVlIHRoZSB1bmFjY2VwdGVkIHNvY2tldCBmb3IgZGVhdGggKi8KKwkJCXNvY2tfc2V0X2ZsYWcoc2tiLT5zaywgU09DS19ERUFEKTsKKwkJCXJvc2Vfc3RhcnRfaGVhcnRiZWF0KHNrYi0+c2spOworCQkJcm9zZV9zayhza2ItPnNrKS0+c3RhdGUgPSBST1NFX1NUQVRFXzA7CisJCX0KKworCQlrZnJlZV9za2Ioc2tiKTsKKwl9CisKKwlpZiAoYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKSB8fAorCSAgICBhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpKSB7CisJCS8qIERlZmVyOiBvdXRzdGFuZGluZyBidWZmZXJzICovCisJCWluaXRfdGltZXIoJnNrLT5za190aW1lcik7CisJCXNrLT5za190aW1lci5leHBpcmVzICA9IGppZmZpZXMgKyAxMCAqIEhaOworCQlzay0+c2tfdGltZXIuZnVuY3Rpb24gPSByb3NlX2Rlc3Ryb3lfdGltZXI7CisJCXNrLT5za190aW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKXNrOworCQlhZGRfdGltZXIoJnNrLT5za190aW1lcik7CisJfSBlbHNlCisJCXNvY2tfcHV0KHNrKTsKK30KKworLyoKKyAqCUhhbmRsaW5nIGZvciBzeXN0ZW0gY2FsbHMgYXBwbGllZCB2aWEgdGhlIHZhcmlvdXMgaW50ZXJmYWNlcyB0byBhCisgKglST1NFIHNvY2tldCBvYmplY3QuCisgKi8KKworc3RhdGljIGludCByb3NlX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwljaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCByb3NlX3NvY2sgKnJvc2UgPSByb3NlX3NrKHNrKTsKKwlpbnQgb3B0OworCisJaWYgKGxldmVsICE9IFNPTF9ST1NFKQorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCisJaWYgKG9wdGxlbiA8IHNpemVvZihpbnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChnZXRfdXNlcihvcHQsIChpbnQgX191c2VyICopb3B0dmFsKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKG9wdG5hbWUpIHsKKwljYXNlIFJPU0VfREVGRVI6CisJCXJvc2UtPmRlZmVyID0gb3B0ID8gMSA6IDA7CisJCXJldHVybiAwOworCisJY2FzZSBST1NFX1QxOgorCQlpZiAob3B0IDwgMSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyb3NlLT50MSA9IG9wdCAqIEhaOworCQlyZXR1cm4gMDsKKworCWNhc2UgUk9TRV9UMjoKKwkJaWYgKG9wdCA8IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcm9zZS0+dDIgPSBvcHQgKiBIWjsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFJPU0VfVDM6CisJCWlmIChvcHQgPCAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJvc2UtPnQzID0gb3B0ICogSFo7CisJCXJldHVybiAwOworCisJY2FzZSBST1NFX0hPTERCQUNLOgorCQlpZiAob3B0IDwgMSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyb3NlLT5oYiA9IG9wdCAqIEhaOworCQlyZXR1cm4gMDsKKworCWNhc2UgUk9TRV9JRExFOgorCQlpZiAob3B0IDwgMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyb3NlLT5pZGxlID0gb3B0ICogNjAgKiBIWjsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFJPU0VfUUJJVElOQ0w6CisJCXJvc2UtPnFiaXRpbmNsID0gb3B0ID8gMSA6IDA7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcm9zZV9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCByb3NlX3NvY2sgKnJvc2UgPSByb3NlX3NrKHNrKTsKKwlpbnQgdmFsID0gMDsKKwlpbnQgbGVuOworCisJaWYgKGxldmVsICE9IFNPTF9ST1NFKQorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCisJaWYgKGdldF91c2VyKGxlbiwgb3B0bGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKG9wdG5hbWUpIHsKKwljYXNlIFJPU0VfREVGRVI6CisJCXZhbCA9IHJvc2UtPmRlZmVyOworCQlicmVhazsKKworCWNhc2UgUk9TRV9UMToKKwkJdmFsID0gcm9zZS0+dDEgLyBIWjsKKwkJYnJlYWs7CisKKwljYXNlIFJPU0VfVDI6CisJCXZhbCA9IHJvc2UtPnQyIC8gSFo7CisJCWJyZWFrOworCisJY2FzZSBST1NFX1QzOgorCQl2YWwgPSByb3NlLT50MyAvIEhaOworCQlicmVhazsKKworCWNhc2UgUk9TRV9IT0xEQkFDSzoKKwkJdmFsID0gcm9zZS0+aGIgLyBIWjsKKwkJYnJlYWs7CisKKwljYXNlIFJPU0VfSURMRToKKwkJdmFsID0gcm9zZS0+aWRsZSAvICg2MCAqIEhaKTsKKwkJYnJlYWs7CisKKwljYXNlIFJPU0VfUUJJVElOQ0w6CisJCXZhbCA9IHJvc2UtPnFiaXRpbmNsOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisJfQorCisJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sIHNpemVvZihpbnQpKTsKKworCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGNvcHlfdG9fdXNlcihvcHR2YWwsICZ2YWwsIGxlbikgPyAtRUZBVUxUIDogMDsKK30KKworc3RhdGljIGludCByb3NlX2xpc3RlbihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgYmFja2xvZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKworCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0xJU1RFTikgeworCQlzdHJ1Y3Qgcm9zZV9zb2NrICpyb3NlID0gcm9zZV9zayhzayk7CisKKwkJcm9zZS0+ZGVzdF9uZGlnaXMgPSAwOworCQltZW1zZXQoJnJvc2UtPmRlc3RfYWRkciwgMCwgUk9TRV9BRERSX0xFTik7CisJCW1lbXNldCgmcm9zZS0+ZGVzdF9jYWxsLCAwLCBBWDI1X0FERFJfTEVOKTsKKwkJbWVtc2V0KHJvc2UtPmRlc3RfZGlnaXMsIDAsIEFYMjVfQUREUl9MRU4gKiBST1NFX01BWF9ESUdJUyk7CisJCXNrLT5za19tYXhfYWNrX2JhY2tsb2cgPSBiYWNrbG9nOworCQlzay0+c2tfc3RhdGUgICAgICAgICAgID0gVENQX0xJU1RFTjsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgc3RydWN0IHByb3RvIHJvc2VfcHJvdG8gPSB7CisJLm5hbWUJICA9ICJST1NFIiwKKwkub3duZXIJICA9IFRISVNfTU9EVUxFLAorCS5vYmpfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgcm9zZV9zb2NrKSwKK307CisKK3N0YXRpYyBpbnQgcm9zZV9jcmVhdGUoc3RydWN0IHNvY2tldCAqc29jaywgaW50IHByb3RvY29sKQoreworCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3Qgcm9zZV9zb2NrICpyb3NlOworCisJaWYgKHNvY2stPnR5cGUgIT0gU09DS19TRVFQQUNLRVQgfHwgcHJvdG9jb2wgIT0gMCkKKwkJcmV0dXJuIC1FU09DS1ROT1NVUFBPUlQ7CisKKwlpZiAoKHNrID0gc2tfYWxsb2MoUEZfUk9TRSwgR0ZQX0FUT01JQywgJnJvc2VfcHJvdG8sIDEpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJvc2UgPSByb3NlX3NrKHNrKTsKKworCXNvY2tfaW5pdF9kYXRhKHNvY2ssIHNrKTsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnJvc2UtPmFja19xdWV1ZSk7CisjaWZkZWYgTV9CSVQKKwlza2JfcXVldWVfaGVhZF9pbml0KCZyb3NlLT5mcmFnX3F1ZXVlKTsKKwlyb3NlLT5mcmFnbGVuICAgID0gMDsKKyNlbmRpZgorCisJc29jay0+b3BzICAgID0gJnJvc2VfcHJvdG9fb3BzOworCXNrLT5za19wcm90b2NvbCA9IHByb3RvY29sOworCisJaW5pdF90aW1lcigmcm9zZS0+dGltZXIpOworCWluaXRfdGltZXIoJnJvc2UtPmlkbGV0aW1lcik7CisKKwlyb3NlLT50MSAgID0gc3lzY3RsX3Jvc2VfY2FsbF9yZXF1ZXN0X3RpbWVvdXQ7CisJcm9zZS0+dDIgICA9IHN5c2N0bF9yb3NlX3Jlc2V0X3JlcXVlc3RfdGltZW91dDsKKwlyb3NlLT50MyAgID0gc3lzY3RsX3Jvc2VfY2xlYXJfcmVxdWVzdF90aW1lb3V0OworCXJvc2UtPmhiICAgPSBzeXNjdGxfcm9zZV9hY2tfaG9sZF9iYWNrX3RpbWVvdXQ7CisJcm9zZS0+aWRsZSA9IHN5c2N0bF9yb3NlX25vX2FjdGl2aXR5X3RpbWVvdXQ7CisKKwlyb3NlLT5zdGF0ZSA9IFJPU0VfU1RBVEVfMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNvY2sgKnJvc2VfbWFrZV9uZXcoc3RydWN0IHNvY2sgKm9zaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IHJvc2Vfc29jayAqcm9zZSwgKm9yb3NlOworCisJaWYgKG9zay0+c2tfdHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoKHNrID0gc2tfYWxsb2MoUEZfUk9TRSwgR0ZQX0FUT01JQywgJnJvc2VfcHJvdG8sIDEpKSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXJvc2UgPSByb3NlX3NrKHNrKTsKKworCXNvY2tfaW5pdF9kYXRhKE5VTEwsIHNrKTsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnJvc2UtPmFja19xdWV1ZSk7CisjaWZkZWYgTV9CSVQKKwlza2JfcXVldWVfaGVhZF9pbml0KCZyb3NlLT5mcmFnX3F1ZXVlKTsKKwlyb3NlLT5mcmFnbGVuICA9IDA7CisjZW5kaWYKKworCXNrLT5za190eXBlICAgICA9IG9zay0+c2tfdHlwZTsKKwlzay0+c2tfc29ja2V0ICAgPSBvc2stPnNrX3NvY2tldDsKKwlzay0+c2tfcHJpb3JpdHkgPSBvc2stPnNrX3ByaW9yaXR5OworCXNrLT5za19wcm90b2NvbCA9IG9zay0+c2tfcHJvdG9jb2w7CisJc2stPnNrX3JjdmJ1ZiAgID0gb3NrLT5za19yY3ZidWY7CisJc2stPnNrX3NuZGJ1ZiAgID0gb3NrLT5za19zbmRidWY7CisJc2stPnNrX3N0YXRlICAgID0gVENQX0VTVEFCTElTSEVEOworCXNrLT5za19zbGVlcCAgICA9IG9zay0+c2tfc2xlZXA7CisKKwlpZiAoc29ja19mbGFnKG9zaywgU09DS19aQVBQRUQpKQorCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX1pBUFBFRCk7CisKKwlpZiAoc29ja19mbGFnKG9zaywgU09DS19EQkcpKQorCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX0RCRyk7CisKKwlpbml0X3RpbWVyKCZyb3NlLT50aW1lcik7CisJaW5pdF90aW1lcigmcm9zZS0+aWRsZXRpbWVyKTsKKworCW9yb3NlCQk9IHJvc2Vfc2sob3NrKTsKKwlyb3NlLT50MQk9IG9yb3NlLT50MTsKKwlyb3NlLT50Mgk9IG9yb3NlLT50MjsKKwlyb3NlLT50Mwk9IG9yb3NlLT50MzsKKwlyb3NlLT5oYgk9IG9yb3NlLT5oYjsKKwlyb3NlLT5pZGxlCT0gb3Jvc2UtPmlkbGU7CisJcm9zZS0+ZGVmZXIJPSBvcm9zZS0+ZGVmZXI7CisJcm9zZS0+ZGV2aWNlCT0gb3Jvc2UtPmRldmljZTsKKwlyb3NlLT5xYml0aW5jbAk9IG9yb3NlLT5xYml0aW5jbDsKKworCXJldHVybiBzazsKK30KKworc3RhdGljIGludCByb3NlX3JlbGVhc2Uoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgcm9zZV9zb2NrICpyb3NlOworCisJaWYgKHNrID09IE5VTEwpIHJldHVybiAwOworCisJcm9zZSA9IHJvc2Vfc2soc2spOworCisJc3dpdGNoIChyb3NlLT5zdGF0ZSkgeworCWNhc2UgUk9TRV9TVEFURV8wOgorCQlyb3NlX2Rpc2Nvbm5lY3Qoc2ssIDAsIC0xLCAtMSk7CisJCXJvc2VfZGVzdHJveV9zb2NrZXQoc2spOworCQlicmVhazsKKworCWNhc2UgUk9TRV9TVEFURV8yOgorCQlyb3NlLT5uZWlnaGJvdXItPnVzZS0tOworCQlyb3NlX2Rpc2Nvbm5lY3Qoc2ssIDAsIC0xLCAtMSk7CisJCXJvc2VfZGVzdHJveV9zb2NrZXQoc2spOworCQlicmVhazsKKworCWNhc2UgUk9TRV9TVEFURV8xOgorCWNhc2UgUk9TRV9TVEFURV8zOgorCWNhc2UgUk9TRV9TVEFURV80OgorCWNhc2UgUk9TRV9TVEFURV81OgorCQlyb3NlX2NsZWFyX3F1ZXVlcyhzayk7CisJCXJvc2Vfc3RvcF9pZGxldGltZXIoc2spOworCQlyb3NlX3dyaXRlX2ludGVybmFsKHNrLCBST1NFX0NMRUFSX1JFUVVFU1QpOworCQlyb3NlX3N0YXJ0X3QzdGltZXIoc2spOworCQlyb3NlLT5zdGF0ZSAgPSBST1NFX1NUQVRFXzI7CisJCXNrLT5za19zdGF0ZSAgICA9IFRDUF9DTE9TRTsKKwkJc2stPnNrX3NodXRkb3duIHw9IFNFTkRfU0hVVERPV047CisJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX0RFQUQpOworCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX0RFU1RST1kpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXNvY2stPnNrID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvc2VfYmluZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLCBpbnQgYWRkcl9sZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHJvc2Vfc29jayAqcm9zZSA9IHJvc2Vfc2soc2spOworCXN0cnVjdCBzb2NrYWRkcl9yb3NlICphZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9yb3NlICopdWFkZHI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlheDI1X2FkZHJlc3MgKnVzZXIsICpzb3VyY2U7CisJaW50IG47CisKKwlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19aQVBQRUQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChhZGRyX2xlbiAhPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3Jvc2UpICYmIGFkZHJfbGVuICE9IHNpemVvZihzdHJ1Y3QgZnVsbF9zb2NrYWRkcl9yb3NlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYWRkci0+c3Jvc2VfZmFtaWx5ICE9IEFGX1JPU0UpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGFkZHJfbGVuID09IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfcm9zZSkgJiYgYWRkci0+c3Jvc2VfbmRpZ2lzID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYWRkci0+c3Jvc2VfbmRpZ2lzID4gUk9TRV9NQVhfRElHSVMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChkZXYgPSByb3NlX2Rldl9nZXQoJmFkZHItPnNyb3NlX2FkZHIpKSA9PSBOVUxMKSB7CisJCVNPQ0tfREVCVUcoc2ssICJST1NFOiBiaW5kIGZhaWxlZDogaW52YWxpZCBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCX0KKworCXNvdXJjZSA9ICZhZGRyLT5zcm9zZV9jYWxsOworCisJaWYgKCh1c2VyID0gYXgyNV9maW5kYnl1aWQoY3VycmVudC0+ZXVpZCkpID09IE5VTEwpIHsKKwkJaWYgKGF4MjVfdWlkX3BvbGljeSAmJiAhY2FwYWJsZShDQVBfTkVUX0JJTkRfU0VSVklDRSkpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJdXNlciA9IHNvdXJjZTsKKwl9CisKKwlyb3NlLT5zb3VyY2VfYWRkciAgID0gYWRkci0+c3Jvc2VfYWRkcjsKKwlyb3NlLT5zb3VyY2VfY2FsbCAgID0gKnVzZXI7CisJcm9zZS0+ZGV2aWNlICAgICAgICA9IGRldjsKKwlyb3NlLT5zb3VyY2VfbmRpZ2lzID0gYWRkci0+c3Jvc2VfbmRpZ2lzOworCisJaWYgKGFkZHJfbGVuID09IHNpemVvZihzdHJ1Y3QgZnVsbF9zb2NrYWRkcl9yb3NlKSkgeworCQlzdHJ1Y3QgZnVsbF9zb2NrYWRkcl9yb3NlICpmdWxsX2FkZHIgPSAoc3RydWN0IGZ1bGxfc29ja2FkZHJfcm9zZSAqKXVhZGRyOworCQlmb3IgKG4gPSAwIDsgbiA8IGFkZHItPnNyb3NlX25kaWdpcyA7IG4rKykKKwkJCXJvc2UtPnNvdXJjZV9kaWdpc1tuXSA9IGZ1bGxfYWRkci0+c3Jvc2VfZGlnaXNbbl07CisJfSBlbHNlIHsKKwkJaWYgKHJvc2UtPnNvdXJjZV9uZGlnaXMgPT0gMSkgeworCQkJcm9zZS0+c291cmNlX2RpZ2lzWzBdID0gYWRkci0+c3Jvc2VfZGlnaTsKKwkJfQorCX0KKworCXJvc2VfaW5zZXJ0X3NvY2tldChzayk7CisKKwlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKwlTT0NLX0RFQlVHKHNrLCAiUk9TRTogc29ja2V0IGlzIGJvdW5kXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByb3NlX2Nvbm5lY3Qoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwgaW50IGFkZHJfbGVuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHJvc2Vfc29jayAqcm9zZSA9IHJvc2Vfc2soc2spOworCXN0cnVjdCBzb2NrYWRkcl9yb3NlICphZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9yb3NlICopdWFkZHI7CisJdW5zaWduZWQgY2hhciBjYXVzZSwgZGlhZ25vc3RpYzsKKwlheDI1X2FkZHJlc3MgKnVzZXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgbjsKKworCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0VTVEFCTElTSEVEICYmIHNvY2stPnN0YXRlID09IFNTX0NPTk5FQ1RJTkcpIHsKKwkJc29jay0+c3RhdGUgPSBTU19DT05ORUNURUQ7CisJCXJldHVybiAwOwkvKiBDb25uZWN0IGNvbXBsZXRlZCBkdXJpbmcgYSBFUkVTVEFSVFNZUyBldmVudCAqLworCX0KKworCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0NMT1NFICYmIHNvY2stPnN0YXRlID09IFNTX0NPTk5FQ1RJTkcpIHsKKwkJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKKwkJcmV0dXJuIC1FQ09OTlJFRlVTRUQ7CisJfQorCisJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfRVNUQUJMSVNIRUQpCisJCXJldHVybiAtRUlTQ09OTjsJLyogTm8gcmVjb25uZWN0IG9uIGEgc2VxcGFja2V0IHNvY2tldCAqLworCisJc2stPnNrX3N0YXRlICAgPSBUQ1BfQ0xPU0U7CisJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKKworCWlmIChhZGRyX2xlbiAhPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3Jvc2UpICYmIGFkZHJfbGVuICE9IHNpemVvZihzdHJ1Y3QgZnVsbF9zb2NrYWRkcl9yb3NlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYWRkci0+c3Jvc2VfZmFtaWx5ICE9IEFGX1JPU0UpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGFkZHJfbGVuID09IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfcm9zZSkgJiYgYWRkci0+c3Jvc2VfbmRpZ2lzID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYWRkci0+c3Jvc2VfbmRpZ2lzID4gUk9TRV9NQVhfRElHSVMpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogU291cmNlICsgRGVzdGluYXRpb24gZGlnaXMgc2hvdWxkIG5vdCBleGNlZWQgUk9TRV9NQVhfRElHSVMgKi8KKwlpZiAoKHJvc2UtPnNvdXJjZV9uZGlnaXMgKyBhZGRyLT5zcm9zZV9uZGlnaXMpID4gUk9TRV9NQVhfRElHSVMpCisJCXJldHVybiAtRUlOVkFMOworCisJcm9zZS0+bmVpZ2hib3VyID0gcm9zZV9nZXRfbmVpZ2goJmFkZHItPnNyb3NlX2FkZHIsICZjYXVzZSwKKwkJCQkJICZkaWFnbm9zdGljKTsKKwlpZiAoIXJvc2UtPm5laWdoYm91cikKKwkJcmV0dXJuIC1FTkVUVU5SRUFDSDsKKworCXJvc2UtPmxjaSA9IHJvc2VfbmV3X2xjaShyb3NlLT5uZWlnaGJvdXIpOworCWlmICghcm9zZS0+bGNpKQorCQlyZXR1cm4gLUVORVRVTlJFQUNIOworCisJaWYgKHNvY2tfZmxhZyhzaywgU09DS19aQVBQRUQpKSB7CS8qIE11c3QgYmluZCBmaXJzdCAtIGF1dG9iaW5kaW5nIGluIHRoaXMgbWF5IG9yIG1heSBub3Qgd29yayAqLworCQlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKworCQlpZiAoKGRldiA9IHJvc2VfZGV2X2ZpcnN0KCkpID09IE5VTEwpCisJCQlyZXR1cm4gLUVORVRVTlJFQUNIOworCisJCWlmICgodXNlciA9IGF4MjVfZmluZGJ5dWlkKGN1cnJlbnQtPmV1aWQpKSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbWVtY3B5KCZyb3NlLT5zb3VyY2VfYWRkciwgZGV2LT5kZXZfYWRkciwgUk9TRV9BRERSX0xFTik7CisJCXJvc2UtPnNvdXJjZV9jYWxsID0gKnVzZXI7CisJCXJvc2UtPmRldmljZSAgICAgID0gZGV2OworCisJCXJvc2VfaW5zZXJ0X3NvY2tldChzayk7CQkvKiBGaW5pc2ggdGhlIGJpbmQgKi8KKwl9CisKKwlyb3NlLT5kZXN0X2FkZHIgICA9IGFkZHItPnNyb3NlX2FkZHI7CisJcm9zZS0+ZGVzdF9jYWxsICAgPSBhZGRyLT5zcm9zZV9jYWxsOworCXJvc2UtPnJhbmQgICAgICAgID0gKChsb25nKXJvc2UgJiAweEZGRkYpICsgcm9zZS0+bGNpOworCXJvc2UtPmRlc3RfbmRpZ2lzID0gYWRkci0+c3Jvc2VfbmRpZ2lzOworCisJaWYgKGFkZHJfbGVuID09IHNpemVvZihzdHJ1Y3QgZnVsbF9zb2NrYWRkcl9yb3NlKSkgeworCQlzdHJ1Y3QgZnVsbF9zb2NrYWRkcl9yb3NlICpmdWxsX2FkZHIgPSAoc3RydWN0IGZ1bGxfc29ja2FkZHJfcm9zZSAqKXVhZGRyOworCQlmb3IgKG4gPSAwIDsgbiA8IGFkZHItPnNyb3NlX25kaWdpcyA7IG4rKykKKwkJCXJvc2UtPmRlc3RfZGlnaXNbbl0gPSBmdWxsX2FkZHItPnNyb3NlX2RpZ2lzW25dOworCX0gZWxzZSB7CisJCWlmIChyb3NlLT5kZXN0X25kaWdpcyA9PSAxKSB7CisJCQlyb3NlLT5kZXN0X2RpZ2lzWzBdID0gYWRkci0+c3Jvc2VfZGlnaTsKKwkJfQorCX0KKworCS8qIE1vdmUgdG8gY29ubmVjdGluZyBzb2NrZXQsIHN0YXJ0IHNlbmRpbmcgQ29ubmVjdCBSZXF1ZXN0cyAqLworCXNvY2stPnN0YXRlICAgPSBTU19DT05ORUNUSU5HOworCXNrLT5za19zdGF0ZSAgICAgPSBUQ1BfU1lOX1NFTlQ7CisKKwlyb3NlLT5zdGF0ZSA9IFJPU0VfU1RBVEVfMTsKKworCXJvc2UtPm5laWdoYm91ci0+dXNlKys7CisKKwlyb3NlX3dyaXRlX2ludGVybmFsKHNrLCBST1NFX0NBTExfUkVRVUVTVCk7CisJcm9zZV9zdGFydF9oZWFydGJlYXQoc2spOworCXJvc2Vfc3RhcnRfdDF0aW1lcihzayk7CisKKwkvKiBOb3cgdGhlIGxvb3AgKi8KKwlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCAmJiAoZmxhZ3MgJiBPX05PTkJMT0NLKSkKKwkJcmV0dXJuIC1FSU5QUk9HUkVTUzsKKworCS8qCisJICogQSBDb25uZWN0IEFjayB3aXRoIENob2tlIG9yIHRpbWVvdXQgb3IgZmFpbGVkIHJvdXRpbmcgd2lsbCBnbyB0bworCSAqIGNsb3NlZC4KKwkgKi8KKwlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9TWU5fU0VOVCkgeworCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIHRzayk7CisKKwkJYWRkX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJCWZvciAoOzspIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9TWU5fU0VOVCkKKwkJCQlicmVhazsKKwkJCWlmICghc2lnbmFsX3BlbmRpbmcodHNrKSkgeworCQkJCXNjaGVkdWxlKCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJCXJlbW92ZV93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOworCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJfQorCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJfQorCisJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfRVNUQUJMSVNIRUQpIHsKKwkJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKKwkJcmV0dXJuIHNvY2tfZXJyb3Ioc2spOwkvKiBBbHdheXMgc2V0IGF0IHRoaXMgcG9pbnQgKi8KKwl9CisKKwlzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvc2VfYWNjZXB0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrZXQgKm5ld3NvY2ssIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgdHNrKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBzb2NrICpuZXdzazsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJaW50IGVyciA9IDA7CisKKwlpZiAoKHNrID0gc29jay0+c2spID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJbG9ja19zb2NrKHNrKTsKKwlpZiAoc2stPnNrX3R5cGUgIT0gU09DS19TRVFQQUNLRVQpIHsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0xJU1RFTikgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqCVRoZSB3cml0ZSBxdWV1ZSB0aGlzIHRpbWUgaXMgaG9sZGluZyBzb2NrZXRzIHJlYWR5IHRvIHVzZQorCSAqCWhvb2tlZCBpbnRvIHRoZSBTQUJNIHdlIHNhdmVkCisJICovCisJYWRkX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJZm9yICg7OykgeworCQlza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCQlpZiAoc2tiKQorCQkJYnJlYWs7CisKKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCWlmIChmbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQkJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJCQlyZXR1cm4gLUVXT1VMREJMT0NLOworCQl9CisJCWlmICghc2lnbmFsX3BlbmRpbmcodHNrKSkgeworCQkJc2NoZWR1bGUoKTsKKwkJCWxvY2tfc29jayhzayk7CisJCQljb250aW51ZTsKKwkJfQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwlyZW1vdmVfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKKworCW5ld3NrID0gc2tiLT5zazsKKwluZXdzay0+c2tfc29ja2V0ID0gbmV3c29jazsKKwluZXdzay0+c2tfc2xlZXAgPSAmbmV3c29jay0+d2FpdDsKKworCS8qIE5vdyBhdHRhY2ggdXAgdGhlIG5ldyBzb2NrZXQgKi8KKwlza2ItPnNrID0gTlVMTDsKKwlrZnJlZV9za2Ioc2tiKTsKKwlzay0+c2tfYWNrX2JhY2tsb2ctLTsKKwluZXdzb2NrLT5zayA9IG5ld3NrOworCitvdXQ6CisJcmVsZWFzZV9zb2NrKHNrKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcm9zZV9nZXRuYW1lKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsCisJaW50ICp1YWRkcl9sZW4sIGludCBwZWVyKQoreworCXN0cnVjdCBmdWxsX3NvY2thZGRyX3Jvc2UgKnNyb3NlID0gKHN0cnVjdCBmdWxsX3NvY2thZGRyX3Jvc2UgKil1YWRkcjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgcm9zZV9zb2NrICpyb3NlID0gcm9zZV9zayhzayk7CisJaW50IG47CisKKwlpZiAocGVlciAhPSAwKSB7CisJCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKQorCQkJcmV0dXJuIC1FTk9UQ09OTjsKKwkJc3Jvc2UtPnNyb3NlX2ZhbWlseSA9IEFGX1JPU0U7CisJCXNyb3NlLT5zcm9zZV9hZGRyICAgPSByb3NlLT5kZXN0X2FkZHI7CisJCXNyb3NlLT5zcm9zZV9jYWxsICAgPSByb3NlLT5kZXN0X2NhbGw7CisJCXNyb3NlLT5zcm9zZV9uZGlnaXMgPSByb3NlLT5kZXN0X25kaWdpczsKKwkJZm9yIChuID0gMDsgbiA8IHJvc2UtPmRlc3RfbmRpZ2lzOyBuKyspCisJCQlzcm9zZS0+c3Jvc2VfZGlnaXNbbl0gPSByb3NlLT5kZXN0X2RpZ2lzW25dOworCX0gZWxzZSB7CisJCXNyb3NlLT5zcm9zZV9mYW1pbHkgPSBBRl9ST1NFOworCQlzcm9zZS0+c3Jvc2VfYWRkciAgID0gcm9zZS0+c291cmNlX2FkZHI7CisJCXNyb3NlLT5zcm9zZV9jYWxsICAgPSByb3NlLT5zb3VyY2VfY2FsbDsKKwkJc3Jvc2UtPnNyb3NlX25kaWdpcyA9IHJvc2UtPnNvdXJjZV9uZGlnaXM7CisJCWZvciAobiA9IDA7IG4gPCByb3NlLT5zb3VyY2VfbmRpZ2lzOyBuKyspCisJCQlzcm9zZS0+c3Jvc2VfZGlnaXNbbl0gPSByb3NlLT5zb3VyY2VfZGlnaXNbbl07CisJfQorCisJKnVhZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3QgZnVsbF9zb2NrYWRkcl9yb3NlKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJvc2VfcnhfY2FsbF9yZXF1ZXN0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCByb3NlX25laWdoICpuZWlnaCwgdW5zaWduZWQgaW50IGxjaSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IHNvY2sgKm1ha2U7CisJc3RydWN0IHJvc2Vfc29jayAqbWFrZV9yb3NlOworCXN0cnVjdCByb3NlX2ZhY2lsaXRpZXNfc3RydWN0IGZhY2lsaXRpZXM7CisJaW50IG4sIGxlbjsKKworCXNrYi0+c2sgPSBOVUxMOwkJLyogSW5pdGlhbGx5IHdlIGRvbid0IGtub3cgd2hvIGl0J3MgZm9yICovCisKKwkvKgorCSAqCXNrYi0+ZGF0YSBwb2ludHMgdG8gdGhlIHJvc2UgZnJhbWUgc3RhcnQKKwkgKi8KKwltZW1zZXQoJmZhY2lsaXRpZXMsIDB4MDAsIHNpemVvZihzdHJ1Y3Qgcm9zZV9mYWNpbGl0aWVzX3N0cnVjdCkpOworCisJbGVuICA9ICgoKHNrYi0+ZGF0YVszXSA+PiA0KSAmIDB4MEYpICsgMSkgLyAyOworCWxlbiArPSAoKChza2ItPmRhdGFbM10gPj4gMCkgJiAweDBGKSArIDEpIC8gMjsKKwlpZiAoIXJvc2VfcGFyc2VfZmFjaWxpdGllcyhza2ItPmRhdGEgKyBsZW4gKyA0LCAmZmFjaWxpdGllcykpIHsKKwkJcm9zZV90cmFuc21pdF9jbGVhcl9yZXF1ZXN0KG5laWdoLCBsY2ksIFJPU0VfSU5WQUxJRF9GQUNJTElUWSwgNzYpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzayA9IHJvc2VfZmluZF9saXN0ZW5lcigmZmFjaWxpdGllcy5zb3VyY2VfYWRkciwgJmZhY2lsaXRpZXMuc291cmNlX2NhbGwpOworCisJLyoKKwkgKiBXZSBjYW4ndCBhY2NlcHQgdGhlIENhbGwgUmVxdWVzdC4KKwkgKi8KKwlpZiAoc2sgPT0gTlVMTCB8fCBza19hY2NlcHRxX2lzX2Z1bGwoc2spIHx8CisJICAgIChtYWtlID0gcm9zZV9tYWtlX25ldyhzaykpID09IE5VTEwpIHsKKwkJcm9zZV90cmFuc21pdF9jbGVhcl9yZXF1ZXN0KG5laWdoLCBsY2ksIFJPU0VfTkVUV09SS19DT05HRVNUSU9OLCAxMjApOworCQlyZXR1cm4gMDsKKwl9CisKKwlza2ItPnNrICAgICA9IG1ha2U7CisJbWFrZS0+c2tfc3RhdGUgPSBUQ1BfRVNUQUJMSVNIRUQ7CisJbWFrZV9yb3NlID0gcm9zZV9zayhtYWtlKTsKKworCW1ha2Vfcm9zZS0+bGNpICAgICAgICAgICA9IGxjaTsKKwltYWtlX3Jvc2UtPmRlc3RfYWRkciAgICAgPSBmYWNpbGl0aWVzLmRlc3RfYWRkcjsKKwltYWtlX3Jvc2UtPmRlc3RfY2FsbCAgICAgPSBmYWNpbGl0aWVzLmRlc3RfY2FsbDsKKwltYWtlX3Jvc2UtPmRlc3RfbmRpZ2lzICAgPSBmYWNpbGl0aWVzLmRlc3RfbmRpZ2lzOworCWZvciAobiA9IDAgOyBuIDwgZmFjaWxpdGllcy5kZXN0X25kaWdpcyA7IG4rKykKKwkJbWFrZV9yb3NlLT5kZXN0X2RpZ2lzW25dID0gZmFjaWxpdGllcy5kZXN0X2RpZ2lzW25dOworCW1ha2Vfcm9zZS0+c291cmNlX2FkZHIgICA9IGZhY2lsaXRpZXMuc291cmNlX2FkZHI7CisJbWFrZV9yb3NlLT5zb3VyY2VfY2FsbCAgID0gZmFjaWxpdGllcy5zb3VyY2VfY2FsbDsKKwltYWtlX3Jvc2UtPnNvdXJjZV9uZGlnaXMgPSBmYWNpbGl0aWVzLnNvdXJjZV9uZGlnaXM7CisJZm9yIChuID0gMCA7IG4gPCBmYWNpbGl0aWVzLnNvdXJjZV9uZGlnaXMgOyBuKyspCisJCW1ha2Vfcm9zZS0+c291cmNlX2RpZ2lzW25dPSBmYWNpbGl0aWVzLnNvdXJjZV9kaWdpc1tuXTsKKwltYWtlX3Jvc2UtPm5laWdoYm91ciAgICAgPSBuZWlnaDsKKwltYWtlX3Jvc2UtPmRldmljZSAgICAgICAgPSBkZXY7CisJbWFrZV9yb3NlLT5mYWNpbGl0aWVzICAgID0gZmFjaWxpdGllczsKKworCW1ha2Vfcm9zZS0+bmVpZ2hib3VyLT51c2UrKzsKKworCWlmIChyb3NlX3NrKHNrKS0+ZGVmZXIpIHsKKwkJbWFrZV9yb3NlLT5zdGF0ZSA9IFJPU0VfU1RBVEVfNTsKKwl9IGVsc2UgeworCQlyb3NlX3dyaXRlX2ludGVybmFsKG1ha2UsIFJPU0VfQ0FMTF9BQ0NFUFRFRCk7CisJCW1ha2Vfcm9zZS0+c3RhdGUgPSBST1NFX1NUQVRFXzM7CisJCXJvc2Vfc3RhcnRfaWRsZXRpbWVyKG1ha2UpOworCX0KKworCW1ha2Vfcm9zZS0+Y29uZGl0aW9uID0gMHgwMDsKKwltYWtlX3Jvc2UtPnZzICAgICAgICA9IDA7CisJbWFrZV9yb3NlLT52YSAgICAgICAgPSAwOworCW1ha2Vfcm9zZS0+dnIgICAgICAgID0gMDsKKwltYWtlX3Jvc2UtPnZsICAgICAgICA9IDA7CisJc2stPnNrX2Fja19iYWNrbG9nKys7CisKKwlyb3NlX2luc2VydF9zb2NrZXQobWFrZSk7CisKKwlza2JfcXVldWVfaGVhZCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisKKwlyb3NlX3N0YXJ0X2hlYXJ0YmVhdChtYWtlKTsKKworCWlmICghc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKQorCQlzay0+c2tfZGF0YV9yZWFkeShzaywgc2tiLT5sZW4pOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcm9zZV9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCXN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgcm9zZV9zb2NrICpyb3NlID0gcm9zZV9zayhzayk7CisJc3RydWN0IHNvY2thZGRyX3Jvc2UgKnVzcm9zZSA9IChzdHJ1Y3Qgc29ja2FkZHJfcm9zZSAqKW1zZy0+bXNnX25hbWU7CisJaW50IGVycjsKKwlzdHJ1Y3QgZnVsbF9zb2NrYWRkcl9yb3NlIHNyb3NlOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgY2hhciAqYXNtcHRyOworCWludCBuLCBzaXplLCBxYml0ID0gMDsKKworCWlmIChtc2ctPm1zZ19mbGFncyAmIH4oTVNHX0RPTlRXQUlUfE1TR19FT1J8TVNHX0NNU0dfQ09NUEFUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc29ja19mbGFnKHNrLCBTT0NLX1pBUFBFRCkpCisJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKKworCWlmIChzay0+c2tfc2h1dGRvd24gJiBTRU5EX1NIVVRET1dOKSB7CisJCXNlbmRfc2lnKFNJR1BJUEUsIGN1cnJlbnQsIDApOworCQlyZXR1cm4gLUVQSVBFOworCX0KKworCWlmIChyb3NlLT5uZWlnaGJvdXIgPT0gTlVMTCB8fCByb3NlLT5kZXZpY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTkVUVU5SRUFDSDsKKworCWlmICh1c3Jvc2UgIT0gTlVMTCkgeworCQlpZiAobXNnLT5tc2dfbmFtZWxlbiAhPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3Jvc2UpICYmIG1zZy0+bXNnX25hbWVsZW4gIT0gc2l6ZW9mKHN0cnVjdCBmdWxsX3NvY2thZGRyX3Jvc2UpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW1lbXNldCgmc3Jvc2UsIDAsIHNpemVvZihzdHJ1Y3QgZnVsbF9zb2NrYWRkcl9yb3NlKSk7CisJCW1lbWNweSgmc3Jvc2UsIHVzcm9zZSwgbXNnLT5tc2dfbmFtZWxlbik7CisJCWlmIChyb3NlY21wKCZyb3NlLT5kZXN0X2FkZHIsICZzcm9zZS5zcm9zZV9hZGRyKSAhPSAwIHx8CisJCSAgICBheDI1Y21wKCZyb3NlLT5kZXN0X2NhbGwsICZzcm9zZS5zcm9zZV9jYWxsKSAhPSAwKQorCQkJcmV0dXJuIC1FSVNDT05OOworCQlpZiAoc3Jvc2Uuc3Jvc2VfbmRpZ2lzICE9IHJvc2UtPmRlc3RfbmRpZ2lzKQorCQkJcmV0dXJuIC1FSVNDT05OOworCQlpZiAoc3Jvc2Uuc3Jvc2VfbmRpZ2lzID09IHJvc2UtPmRlc3RfbmRpZ2lzKSB7CisJCQlmb3IgKG4gPSAwIDsgbiA8IHNyb3NlLnNyb3NlX25kaWdpcyA7IG4rKykKKwkJCQlpZiAoYXgyNWNtcCgmcm9zZS0+ZGVzdF9kaWdpc1tuXSwKKwkJCQkJICAgICZzcm9zZS5zcm9zZV9kaWdpc1tuXSkpCisJCQkJCXJldHVybiAtRUlTQ09OTjsKKwkJfQorCQlpZiAoc3Jvc2Uuc3Jvc2VfZmFtaWx5ICE9IEFGX1JPU0UpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkKKwkJCXJldHVybiAtRU5PVENPTk47CisKKwkJc3Jvc2Uuc3Jvc2VfZmFtaWx5ID0gQUZfUk9TRTsKKwkJc3Jvc2Uuc3Jvc2VfYWRkciAgID0gcm9zZS0+ZGVzdF9hZGRyOworCQlzcm9zZS5zcm9zZV9jYWxsICAgPSByb3NlLT5kZXN0X2NhbGw7CisJCXNyb3NlLnNyb3NlX25kaWdpcyA9IHJvc2UtPmRlc3RfbmRpZ2lzOworCQlmb3IgKG4gPSAwIDsgbiA8IHJvc2UtPmRlc3RfbmRpZ2lzIDsgbisrKQorCQkJc3Jvc2Uuc3Jvc2VfZGlnaXNbbl0gPSByb3NlLT5kZXN0X2RpZ2lzW25dOworCX0KKworCVNPQ0tfREVCVUcoc2ssICJST1NFOiBzZW5kdG86IEFkZHJlc3NlcyBidWlsdC5cbiIpOworCisJLyogQnVpbGQgYSBwYWNrZXQgKi8KKwlTT0NLX0RFQlVHKHNrLCAiUk9TRTogc2VuZHRvOiBidWlsZGluZyBwYWNrZXQuXG4iKTsKKwlzaXplID0gbGVuICsgQVgyNV9CUFFfSEVBREVSX0xFTiArIEFYMjVfTUFYX0hFQURFUl9MRU4gKyBST1NFX01JTl9MRU47CisKKwlpZiAoKHNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssIHNpemUsIG1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlULCAmZXJyKSkgPT0gTlVMTCkKKwkJcmV0dXJuIGVycjsKKworCXNrYl9yZXNlcnZlKHNrYiwgQVgyNV9CUFFfSEVBREVSX0xFTiArIEFYMjVfTUFYX0hFQURFUl9MRU4gKyBST1NFX01JTl9MRU4pOworCisJLyoKKwkgKglQdXQgdGhlIGRhdGEgb24gdGhlIGVuZAorCSAqLworCVNPQ0tfREVCVUcoc2ssICJST1NFOiBBcHBlbmRpbmcgdXNlciBkYXRhXG4iKTsKKworCWFzbXB0ciA9IHNrYi0+aC5yYXcgPSBza2JfcHV0KHNrYiwgbGVuKTsKKworCWVyciA9IG1lbWNweV9mcm9taW92ZWMoYXNtcHRyLCBtc2ctPm1zZ19pb3YsIGxlbik7CisJaWYgKGVycikgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKgorCSAqCUlmIHRoZSBRIEJJVCBJbmNsdWRlIHNvY2tldCBvcHRpb24gaXMgaW4gZm9yY2UsIHRoZSBmaXJzdAorCSAqCWJ5dGUgb2YgdGhlIHVzZXIgZGF0YSBpcyB0aGUgbG9naWNhbCB2YWx1ZSBvZiB0aGUgUSBCaXQuCisJICovCisJaWYgKHJvc2UtPnFiaXRpbmNsKSB7CisJCXFiaXQgPSBza2ItPmRhdGFbMF07CisJCXNrYl9wdWxsKHNrYiwgMSk7CisJfQorCisJLyoKKwkgKglQdXNoIGRvd24gdGhlIFJPU0UgaGVhZGVyCisJICovCisJYXNtcHRyID0gc2tiX3B1c2goc2tiLCBST1NFX01JTl9MRU4pOworCisJU09DS19ERUJVRyhzaywgIlJPU0U6IEJ1aWxkaW5nIE5ldHdvcmsgSGVhZGVyLlxuIik7CisKKwkvKiBCdWlsZCBhIFJPU0UgTmV0d29yayBoZWFkZXIgKi8KKwlhc21wdHJbMF0gPSAoKHJvc2UtPmxjaSA+PiA4KSAmIDB4MEYpIHwgUk9TRV9HRkk7CisJYXNtcHRyWzFdID0gKHJvc2UtPmxjaSA+PiAwKSAmIDB4RkY7CisJYXNtcHRyWzJdID0gUk9TRV9EQVRBOworCisJaWYgKHFiaXQpCisJCWFzbXB0clswXSB8PSBST1NFX1FfQklUOworCisJU09DS19ERUJVRyhzaywgIlJPU0U6IEJ1aWx0IGhlYWRlci5cbiIpOworCisJU09DS19ERUJVRyhzaywgIlJPU0U6IFRyYW5zbWl0dGluZyBidWZmZXJcbiIpOworCisJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfRVNUQUJMSVNIRUQpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAtRU5PVENPTk47CisJfQorCisjaWZkZWYgTV9CSVQKKyNkZWZpbmUgUk9TRV9QQUNMRU4gKDI1Ni1ST1NFX01JTl9MRU4pCisJaWYgKHNrYi0+bGVuIC0gUk9TRV9NSU5fTEVOID4gUk9TRV9QQUNMRU4pIHsKKwkJdW5zaWduZWQgY2hhciBoZWFkZXJbUk9TRV9NSU5fTEVOXTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYm47CisJCWludCBmcm9udGxlbjsKKwkJaW50IGxnOworCisJCS8qIFNhdmUgYSBjb3B5IG9mIHRoZSBIZWFkZXIgKi8KKwkJbWVtY3B5KGhlYWRlciwgc2tiLT5kYXRhLCBST1NFX01JTl9MRU4pOworCQlza2JfcHVsbChza2IsIFJPU0VfTUlOX0xFTik7CisKKwkJZnJvbnRsZW4gPSBza2JfaGVhZHJvb20oc2tiKTsKKworCQl3aGlsZSAoc2tiLT5sZW4gPiAwKSB7CisJCQlpZiAoKHNrYm4gPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCBmcm9udGxlbiArIFJPU0VfUEFDTEVOLCAwLCAmZXJyKSkgPT0gTlVMTCkgeworCQkJCWtmcmVlX3NrYihza2IpOworCQkJCXJldHVybiBlcnI7CisJCQl9CisKKwkJCXNrYm4tPnNrICAgPSBzazsKKwkJCXNrYm4tPmZyZWUgPSAxOworCQkJc2tibi0+YXJwICA9IDE7CisKKwkJCXNrYl9yZXNlcnZlKHNrYm4sIGZyb250bGVuKTsKKworCQkJbGcgPSAoUk9TRV9QQUNMRU4gPiBza2ItPmxlbikgPyBza2ItPmxlbiA6IFJPU0VfUEFDTEVOOworCisJCQkvKiBDb3B5IHRoZSB1c2VyIGRhdGEgKi8KKwkJCW1lbWNweShza2JfcHV0KHNrYm4sIGxnKSwgc2tiLT5kYXRhLCBsZyk7CisJCQlza2JfcHVsbChza2IsIGxnKTsKKworCQkJLyogRHVwbGljYXRlIHRoZSBIZWFkZXIgKi8KKwkJCXNrYl9wdXNoKHNrYm4sIFJPU0VfTUlOX0xFTik7CisJCQltZW1jcHkoc2tibi0+ZGF0YSwgaGVhZGVyLCBST1NFX01JTl9MRU4pOworCisJCQlpZiAoc2tiLT5sZW4gPiAwKQorCQkJCXNrYm4tPmRhdGFbMl0gfD0gTV9CSVQ7CisKKwkJCXNrYl9xdWV1ZV90YWlsKCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYm4pOyAvKiBUaHJvdyBpdCBvbiB0aGUgcXVldWUgKi8KKwkJfQorCisJCXNrYi0+ZnJlZSA9IDE7CisJCWtmcmVlX3NrYihza2IpOworCX0gZWxzZSB7CisJCXNrYl9xdWV1ZV90YWlsKCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYik7CQkvKiBUaHJvdyBpdCBvbiB0aGUgcXVldWUgKi8KKwl9CisjZWxzZQorCXNrYl9xdWV1ZV90YWlsKCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYik7CS8qIFNob3ZlIGl0IG9udG8gdGhlIHF1ZXVlICovCisjZW5kaWYKKworCXJvc2Vfa2ljayhzayk7CisKKwlyZXR1cm4gbGVuOworfQorCisKK3N0YXRpYyBpbnQgcm9zZV9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCXN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgcm9zZV9zb2NrICpyb3NlID0gcm9zZV9zayhzayk7CisJc3RydWN0IHNvY2thZGRyX3Jvc2UgKnNyb3NlID0gKHN0cnVjdCBzb2NrYWRkcl9yb3NlICopbXNnLT5tc2dfbmFtZTsKKwlzaXplX3QgY29waWVkOworCXVuc2lnbmVkIGNoYXIgKmFzbXB0cjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBuLCBlciwgcWJpdDsKKworCS8qCisJICogVGhpcyB3b3JrcyBmb3Igc2VxcGFja2V0IHRvby4gVGhlIHJlY2VpdmVyIGhhcyBvcmRlcmVkIHRoZSBxdWV1ZSBmb3IKKwkgKiB1cyEgV2UgZG8gb25lIHF1aWNrIGNoZWNrIGZpcnN0IHRob3VnaAorCSAqLworCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKQorCQlyZXR1cm4gLUVOT1RDT05OOworCisJLyogTm93IHdlIGNhbiB0cmVhdCBhbGwgYWxpa2UgKi8KKwlpZiAoKHNrYiA9IHNrYl9yZWN2X2RhdGFncmFtKHNrLCBmbGFncyAmIH5NU0dfRE9OVFdBSVQsIGZsYWdzICYgTVNHX0RPTlRXQUlULCAmZXIpKSA9PSBOVUxMKQorCQlyZXR1cm4gZXI7CisKKwlxYml0ID0gKHNrYi0+ZGF0YVswXSAmIFJPU0VfUV9CSVQpID09IFJPU0VfUV9CSVQ7CisKKwlza2JfcHVsbChza2IsIFJPU0VfTUlOX0xFTik7CisKKwlpZiAocm9zZS0+cWJpdGluY2wpIHsKKwkJYXNtcHRyICA9IHNrYl9wdXNoKHNrYiwgMSk7CisJCSphc21wdHIgPSBxYml0OworCX0KKworCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJY29waWVkICAgICA9IHNrYi0+bGVuOworCisJaWYgKGNvcGllZCA+IHNpemUpIHsKKwkJY29waWVkID0gc2l6ZTsKKwkJbXNnLT5tc2dfZmxhZ3MgfD0gTVNHX1RSVU5DOworCX0KKworCXNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgMCwgbXNnLT5tc2dfaW92LCBjb3BpZWQpOworCisJaWYgKHNyb3NlICE9IE5VTEwpIHsKKwkJc3Jvc2UtPnNyb3NlX2ZhbWlseSA9IEFGX1JPU0U7CisJCXNyb3NlLT5zcm9zZV9hZGRyICAgPSByb3NlLT5kZXN0X2FkZHI7CisJCXNyb3NlLT5zcm9zZV9jYWxsICAgPSByb3NlLT5kZXN0X2NhbGw7CisJCXNyb3NlLT5zcm9zZV9uZGlnaXMgPSByb3NlLT5kZXN0X25kaWdpczsKKwkJaWYgKG1zZy0+bXNnX25hbWVsZW4gPj0gc2l6ZW9mKHN0cnVjdCBmdWxsX3NvY2thZGRyX3Jvc2UpKSB7CisJCQlzdHJ1Y3QgZnVsbF9zb2NrYWRkcl9yb3NlICpmdWxsX3Nyb3NlID0gKHN0cnVjdCBmdWxsX3NvY2thZGRyX3Jvc2UgKiltc2ctPm1zZ19uYW1lOworCQkJZm9yIChuID0gMCA7IG4gPCByb3NlLT5kZXN0X25kaWdpcyA7IG4rKykKKwkJCQlmdWxsX3Nyb3NlLT5zcm9zZV9kaWdpc1tuXSA9IHJvc2UtPmRlc3RfZGlnaXNbbl07CisJCQltc2ctPm1zZ19uYW1lbGVuID0gc2l6ZW9mKHN0cnVjdCBmdWxsX3NvY2thZGRyX3Jvc2UpOworCQl9IGVsc2UgeworCQkJaWYgKHJvc2UtPmRlc3RfbmRpZ2lzID49IDEpIHsKKwkJCQlzcm9zZS0+c3Jvc2VfbmRpZ2lzID0gMTsKKwkJCQlzcm9zZS0+c3Jvc2VfZGlnaSA9IHJvc2UtPmRlc3RfZGlnaXNbMF07CisJCQl9CisJCQltc2ctPm1zZ19uYW1lbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9yb3NlKTsKKwkJfQorCX0KKworCXNrYl9mcmVlX2RhdGFncmFtKHNrLCBza2IpOworCisJcmV0dXJuIGNvcGllZDsKK30KKworCitzdGF0aWMgaW50IHJvc2VfaW9jdGwoc3RydWN0IHNvY2tldCAqc29jaywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHJvc2Vfc29jayAqcm9zZSA9IHJvc2Vfc2soc2spOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFRJT0NPVVRROiB7CisJCWxvbmcgYW1vdW50OworCQlhbW91bnQgPSBzay0+c2tfc25kYnVmIC0gYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKTsKKwkJaWYgKGFtb3VudCA8IDApCisJCQlhbW91bnQgPSAwOworCQlyZXR1cm4gcHV0X3VzZXIoYW1vdW50LCAodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZ3ApOworCX0KKworCWNhc2UgVElPQ0lOUTogeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlsb25nIGFtb3VudCA9IDBMOworCQkvKiBUaGVzZSB0d28gYXJlIHNhZmUgb24gYSBzaW5nbGUgQ1BVIHN5c3RlbSBhcyBvbmx5IHVzZXIgdGFza3MgZmlkZGxlIGhlcmUgKi8KKwkJaWYgKChza2IgPSBza2JfcGVlaygmc2stPnNrX3JlY2VpdmVfcXVldWUpKSAhPSBOVUxMKQorCQkJYW1vdW50ID0gc2tiLT5sZW47CisJCXJldHVybiBwdXRfdXNlcihhbW91bnQsICh1bnNpZ25lZCBpbnQgX191c2VyICopYXJncCk7CisJfQorCisJY2FzZSBTSU9DR1NUQU1QOgorCQlpZiAoc2sgIT0gTlVMTCkgCisJCQlyZXR1cm4gc29ja19nZXRfdGltZXN0YW1wKHNrLCAoc3RydWN0IHRpbWV2YWwgX191c2VyICopYXJncCk7CisJCXJldHVybiAtRUlOVkFMOworCisJY2FzZSBTSU9DR0lGQUREUjoKKwljYXNlIFNJT0NTSUZBRERSOgorCWNhc2UgU0lPQ0dJRkRTVEFERFI6CisJY2FzZSBTSU9DU0lGRFNUQUREUjoKKwljYXNlIFNJT0NHSUZCUkRBRERSOgorCWNhc2UgU0lPQ1NJRkJSREFERFI6CisJY2FzZSBTSU9DR0lGTkVUTUFTSzoKKwljYXNlIFNJT0NTSUZORVRNQVNLOgorCWNhc2UgU0lPQ0dJRk1FVFJJQzoKKwljYXNlIFNJT0NTSUZNRVRSSUM6CisJCXJldHVybiAtRUlOVkFMOworCisJY2FzZSBTSU9DQUREUlQ6CisJY2FzZSBTSU9DREVMUlQ6CisJY2FzZSBTSU9DUlNDTFJSVDoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJcmV0dXJuIHJvc2VfcnRfaW9jdGwoY21kLCBhcmdwKTsKKworCWNhc2UgU0lPQ1JTR0NBVVNFOiB7CisJCXN0cnVjdCByb3NlX2NhdXNlX3N0cnVjdCByb3NlX2NhdXNlOworCQlyb3NlX2NhdXNlLmNhdXNlICAgICAgPSByb3NlLT5jYXVzZTsKKwkJcm9zZV9jYXVzZS5kaWFnbm9zdGljID0gcm9zZS0+ZGlhZ25vc3RpYzsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmcm9zZV9jYXVzZSwgc2l6ZW9mKHN0cnVjdCByb3NlX2NhdXNlX3N0cnVjdCkpID8gLUVGQVVMVCA6IDA7CisJfQorCisJY2FzZSBTSU9DUlNTQ0FVU0U6IHsKKwkJc3RydWN0IHJvc2VfY2F1c2Vfc3RydWN0IHJvc2VfY2F1c2U7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcm9zZV9jYXVzZSwgYXJncCwgc2l6ZW9mKHN0cnVjdCByb3NlX2NhdXNlX3N0cnVjdCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJvc2UtPmNhdXNlICAgICAgPSByb3NlX2NhdXNlLmNhdXNlOworCQlyb3NlLT5kaWFnbm9zdGljID0gcm9zZV9jYXVzZS5kaWFnbm9zdGljOworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFNJT0NSU1NMMkNBTEw6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGF4MjVjbXAoJnJvc2VfY2FsbHNpZ24sICZudWxsX2F4MjVfYWRkcmVzcykgIT0gMCkKKwkJCWF4MjVfbGlzdGVuX3JlbGVhc2UoJnJvc2VfY2FsbHNpZ24sIE5VTEwpOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnJvc2VfY2FsbHNpZ24sIGFyZ3AsIHNpemVvZihheDI1X2FkZHJlc3MpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoYXgyNWNtcCgmcm9zZV9jYWxsc2lnbiwgJm51bGxfYXgyNV9hZGRyZXNzKSAhPSAwKQorCQkJYXgyNV9saXN0ZW5fcmVnaXN0ZXIoJnJvc2VfY2FsbHNpZ24sIE5VTEwpOworCQlyZXR1cm4gMDsKKworCWNhc2UgU0lPQ1JTR0wyQ0FMTDoKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmcm9zZV9jYWxsc2lnbiwgc2l6ZW9mKGF4MjVfYWRkcmVzcykpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNJT0NSU0FDQ0VQVDoKKwkJaWYgKHJvc2UtPnN0YXRlID09IFJPU0VfU1RBVEVfNSkgeworCQkJcm9zZV93cml0ZV9pbnRlcm5hbChzaywgUk9TRV9DQUxMX0FDQ0VQVEVEKTsKKwkJCXJvc2Vfc3RhcnRfaWRsZXRpbWVyKHNrKTsKKwkJCXJvc2UtPmNvbmRpdGlvbiA9IDB4MDA7CisJCQlyb3NlLT52cyAgICAgICAgPSAwOworCQkJcm9zZS0+dmEgICAgICAgID0gMDsKKwkJCXJvc2UtPnZyICAgICAgICA9IDA7CisJCQlyb3NlLT52bCAgICAgICAgPSAwOworCQkJcm9zZS0+c3RhdGUgICAgID0gUk9TRV9TVEFURV8zOworCQl9CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGRldl9pb2N0bChjbWQsIGFyZ3ApOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyB2b2lkICpyb3NlX2luZm9fc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCWludCBpOworCXN0cnVjdCBzb2NrICpzOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJc3Bpbl9sb2NrX2JoKCZyb3NlX2xpc3RfbG9jayk7CisJaWYgKCpwb3MgPT0gMCkKKwkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKKwkKKwlpID0gMTsKKwlza19mb3JfZWFjaChzLCBub2RlLCAmcm9zZV9saXN0KSB7CisJCWlmIChpID09ICpwb3MpCisJCQlyZXR1cm4gczsKKwkJKytpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKnJvc2VfaW5mb19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwkrKypwb3M7CisKKwlyZXR1cm4gKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSA/IHNrX2hlYWQoJnJvc2VfbGlzdCkgCisJCTogc2tfbmV4dCgoc3RydWN0IHNvY2sgKil2KTsKK30KKwkKK3N0YXRpYyB2b2lkIHJvc2VfaW5mb19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXNwaW5fdW5sb2NrX2JoKCZyb3NlX2xpc3RfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgcm9zZV9pbmZvX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlzZXFfcHV0cyhzZXEsIAorCQkJICJkZXN0X2FkZHIgIGRlc3RfY2FsbCBzcmNfYWRkciAgIHNyY19jYWxsICBkZXYgICBsY2kgbmVpZ2ggc3QgdnMgdnIgdmEgICB0ICB0MSAgdDIgIHQzICBoYiAgICBpZGxlIFNuZC1RIFJjdi1RIGlub2RlXG4iKTsKKworCWVsc2UgeworCQlzdHJ1Y3Qgc29jayAqcyA9IHY7CisJCXN0cnVjdCByb3NlX3NvY2sgKnJvc2UgPSByb3NlX3NrKHMpOworCQljb25zdCBjaGFyICpkZXZuYW1lLCAqY2FsbHNpZ247CisJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSByb3NlLT5kZXZpY2U7CisKKwkJaWYgKCFkZXYpCisJCQlkZXZuYW1lID0gIj8/PyI7CisJCWVsc2UKKwkJCWRldm5hbWUgPSBkZXYtPm5hbWU7CisJCQorCQlzZXFfcHJpbnRmKHNlcSwgIiUtMTBzICUtOXMgIiwKKwkJCXJvc2UyYXNjKCZyb3NlLT5kZXN0X2FkZHIpLAorCQkJYXgyYXNjKCZyb3NlLT5kZXN0X2NhbGwpKTsKKworCQlpZiAoYXgyNWNtcCgmcm9zZS0+c291cmNlX2NhbGwsICZudWxsX2F4MjVfYWRkcmVzcykgPT0gMCkKKwkJCWNhbGxzaWduID0gIj8/Pz8/Py0/IjsKKwkJZWxzZQorCQkJY2FsbHNpZ24gPSBheDJhc2MoJnJvc2UtPnNvdXJjZV9jYWxsKTsKKworCQlzZXFfcHJpbnRmKHNlcSwKKwkJCSAgICIlLTEwcyAlLTlzICUtNXMgJTMuM1ggJTA1ZCAgJWQgICVkICAlZCAgJWQgJTNsdSAlM2x1ICUzbHUgJTNsdSAlM2x1ICUzbHUvJTAzbHUgJTVkICU1ZCAlbGRcbiIsCisJCQlyb3NlMmFzYygmcm9zZS0+c291cmNlX2FkZHIpLAorCQkJY2FsbHNpZ24sCisJCQlkZXZuYW1lLAorCQkJcm9zZS0+bGNpICYgMHgwRkZGLAorCQkJKHJvc2UtPm5laWdoYm91cikgPyByb3NlLT5uZWlnaGJvdXItPm51bWJlciA6IDAsCisJCQlyb3NlLT5zdGF0ZSwKKwkJCXJvc2UtPnZzLAorCQkJcm9zZS0+dnIsCisJCQlyb3NlLT52YSwKKwkJCWF4MjVfZGlzcGxheV90aW1lcigmcm9zZS0+dGltZXIpIC8gSFosCisJCQlyb3NlLT50MSAvIEhaLAorCQkJcm9zZS0+dDIgLyBIWiwKKwkJCXJvc2UtPnQzIC8gSFosCisJCQlyb3NlLT5oYiAvIEhaLAorCQkJYXgyNV9kaXNwbGF5X3RpbWVyKCZyb3NlLT5pZGxldGltZXIpIC8gKDYwICogSFopLAorCQkJcm9zZS0+aWRsZSAvICg2MCAqIEhaKSwKKwkJCWF0b21pY19yZWFkKCZzLT5za193bWVtX2FsbG9jKSwKKwkJCWF0b21pY19yZWFkKCZzLT5za19ybWVtX2FsbG9jKSwKKwkJCXMtPnNrX3NvY2tldCA/IFNPQ0tfSU5PREUocy0+c2tfc29ja2V0KS0+aV9pbm8gOiAwTCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcm9zZV9pbmZvX3NlcW9wcyA9IHsKKwkuc3RhcnQgPSByb3NlX2luZm9fc3RhcnQsCisJLm5leHQgPSByb3NlX2luZm9fbmV4dCwKKwkuc3RvcCA9IHJvc2VfaW5mb19zdG9wLAorCS5zaG93ID0gcm9zZV9pbmZvX3Nob3csCit9OworCitzdGF0aWMgaW50IHJvc2VfaW5mb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmcm9zZV9pbmZvX3NlcW9wcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJvc2VfaW5mb19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gcm9zZV9pbmZvX29wZW4sCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworI2VuZGlmCS8qIENPTkZJR19QUk9DX0ZTICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSByb3NlX2ZhbWlseV9vcHMgPSB7CisJLmZhbWlseQkJPQlQRl9ST1NFLAorCS5jcmVhdGUJCT0Jcm9zZV9jcmVhdGUsCisJLm93bmVyCQk9CVRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgcm9zZV9wcm90b19vcHMgPSB7CisJLmZhbWlseQkJPQlQRl9ST1NFLAorCS5vd25lcgkJPQlUSElTX01PRFVMRSwKKwkucmVsZWFzZQk9CXJvc2VfcmVsZWFzZSwKKwkuYmluZAkJPQlyb3NlX2JpbmQsCisJLmNvbm5lY3QJPQlyb3NlX2Nvbm5lY3QsCisJLnNvY2tldHBhaXIJPQlzb2NrX25vX3NvY2tldHBhaXIsCisJLmFjY2VwdAkJPQlyb3NlX2FjY2VwdCwKKwkuZ2V0bmFtZQk9CXJvc2VfZ2V0bmFtZSwKKwkucG9sbAkJPQlkYXRhZ3JhbV9wb2xsLAorCS5pb2N0bAkJPQlyb3NlX2lvY3RsLAorCS5saXN0ZW4JCT0Jcm9zZV9saXN0ZW4sCisJLnNodXRkb3duCT0Jc29ja19ub19zaHV0ZG93biwKKwkuc2V0c29ja29wdAk9CXJvc2Vfc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdAk9CXJvc2VfZ2V0c29ja29wdCwKKwkuc2VuZG1zZwk9CXJvc2Vfc2VuZG1zZywKKwkucmVjdm1zZwk9CXJvc2VfcmVjdm1zZywKKwkubW1hcAkJPQlzb2NrX25vX21tYXAsCisJLnNlbmRwYWdlCT0Jc29ja19ub19zZW5kcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcm9zZV9kZXZfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwJPQlyb3NlX2RldmljZV9ldmVudCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqKmRldl9yb3NlOworCitzdGF0aWMgY29uc3QgY2hhciBiYW5uZXJbXSA9IEtFUk5fSU5GTyAiRjZGQkIvRzRLTFggUk9TRSBmb3IgTGludXguIFZlcnNpb24gMC42MiBmb3IgQVgyNS4wMzcgTGludXggMi40XG4iOworCitzdGF0aWMgaW50IF9faW5pdCByb3NlX3Byb3RvX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgcmMgPSBwcm90b19yZWdpc3Rlcigmcm9zZV9wcm90bywgMCk7CisKKwlpZiAocmMgIT0gMCkKKwkJZ290byBvdXQ7CisKKwlyb3NlX2NhbGxzaWduID0gbnVsbF9heDI1X2FkZHJlc3M7CisKKwlpZiAocm9zZV9uZGV2cyA+IDB4N0ZGRkZGRkYvc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlICopKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUk9TRTogcm9zZV9wcm90b19pbml0IC0gcm9zZV9uZGV2cyBwYXJhbWV0ZXIgdG8gbGFyZ2VcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZGV2X3Jvc2UgPSBrbWFsbG9jKHJvc2VfbmRldnMgKiBzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2UgKiksIEdGUF9LRVJORUwpOworCWlmIChkZXZfcm9zZSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUk9TRTogcm9zZV9wcm90b19pbml0IC0gdW5hYmxlIHRvIGFsbG9jYXRlIGRldmljZSBzdHJ1Y3R1cmVcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJbWVtc2V0KGRldl9yb3NlLCAweDAwLCByb3NlX25kZXZzICogc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlKikpOworCWZvciAoaSA9IDA7IGkgPCByb3NlX25kZXZzOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwkJY2hhciBuYW1lW0lGTkFNU0laXTsKKworCQlzcHJpbnRmKG5hbWUsICJyb3NlJWQiLCBpKTsKKwkJZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyksIAorCQkJCSAgIG5hbWUsIHJvc2Vfc2V0dXApOworCQlpZiAoIWRldikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJST1NFOiByb3NlX3Byb3RvX2luaXQgLSB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiUk9TRTogbmV0ZGV2aWNlIHJlZ2Vpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJZGV2X3Jvc2VbaV0gPSBkZXY7CisJfQorCisJc29ja19yZWdpc3Rlcigmcm9zZV9mYW1pbHlfb3BzKTsKKwlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJnJvc2VfZGV2X25vdGlmaWVyKTsKKwlwcmludGsoYmFubmVyKTsKKworCWF4MjVfcHJvdG9jb2xfcmVnaXN0ZXIoQVgyNV9QX1JPU0UsIHJvc2Vfcm91dGVfZnJhbWUpOworCWF4MjVfbGlua2ZhaWxfcmVnaXN0ZXIocm9zZV9saW5rX2ZhaWxlZCk7CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJcm9zZV9yZWdpc3Rlcl9zeXNjdGwoKTsKKyNlbmRpZgorCXJvc2VfbG9vcGJhY2tfaW5pdCgpOworCisJcm9zZV9hZGRfbG9vcGJhY2tfbmVpZ2goKTsKKworCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJyb3NlIiwgU19JUlVHTywgJnJvc2VfaW5mb19mb3BzKTsKKwlwcm9jX25ldF9mb3BzX2NyZWF0ZSgicm9zZV9uZWlnaCIsIFNfSVJVR08sICZyb3NlX25laWdoX2ZvcHMpOworCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJyb3NlX25vZGVzIiwgU19JUlVHTywgJnJvc2Vfbm9kZXNfZm9wcyk7CisJcHJvY19uZXRfZm9wc19jcmVhdGUoInJvc2Vfcm91dGVzIiwgU19JUlVHTywgJnJvc2Vfcm91dGVzX2ZvcHMpOworb3V0OgorCXJldHVybiByYzsKK2ZhaWw6CisJd2hpbGUgKC0taSA+PSAwKSB7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldl9yb3NlW2ldKTsKKwkJZnJlZV9uZXRkZXYoZGV2X3Jvc2VbaV0pOworCX0KKwlrZnJlZShkZXZfcm9zZSk7CisJcHJvdG9fdW5yZWdpc3Rlcigmcm9zZV9wcm90byk7CisJcmV0dXJuIC1FTk9NRU07Cit9Cittb2R1bGVfaW5pdChyb3NlX3Byb3RvX2luaXQpOworCittb2R1bGVfcGFyYW0ocm9zZV9uZGV2cywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mocm9zZV9uZGV2cywgIm51bWJlciBvZiBST1NFIGRldmljZXMiKTsKKworTU9EVUxFX0FVVEhPUigiSm9uYXRoYW4gTmF5bG9yIEc0S0xYIDxnNGtseEBnNGtseC5kZW1vbi5jby51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVGhlIGFtYXRldXIgcmFkaW8gUk9TRSBuZXR3b3JrIGxheWVyIHByb3RvY29sIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTkVUUFJPVE8oUEZfUk9TRSk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCByb3NlX2V4aXQodm9pZCkKK3sKKwlpbnQgaTsKKworCXByb2NfbmV0X3JlbW92ZSgicm9zZSIpOworCXByb2NfbmV0X3JlbW92ZSgicm9zZV9uZWlnaCIpOworCXByb2NfbmV0X3JlbW92ZSgicm9zZV9ub2RlcyIpOworCXByb2NfbmV0X3JlbW92ZSgicm9zZV9yb3V0ZXMiKTsKKwlyb3NlX2xvb3BiYWNrX2NsZWFyKCk7CisKKwlyb3NlX3J0X2ZyZWUoKTsKKworCWF4MjVfcHJvdG9jb2xfcmVsZWFzZShBWDI1X1BfUk9TRSk7CisJYXgyNV9saW5rZmFpbF9yZWxlYXNlKHJvc2VfbGlua19mYWlsZWQpOworCisJaWYgKGF4MjVjbXAoJnJvc2VfY2FsbHNpZ24sICZudWxsX2F4MjVfYWRkcmVzcykgIT0gMCkKKwkJYXgyNV9saXN0ZW5fcmVsZWFzZSgmcm9zZV9jYWxsc2lnbiwgTlVMTCk7CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJcm9zZV91bnJlZ2lzdGVyX3N5c2N0bCgpOworI2VuZGlmCisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJnJvc2VfZGV2X25vdGlmaWVyKTsKKworCXNvY2tfdW5yZWdpc3RlcihQRl9ST1NFKTsKKworCWZvciAoaSA9IDA7IGkgPCByb3NlX25kZXZzOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9yb3NlW2ldOworCisJCWlmIChkZXYpIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQlmcmVlX25ldGRldihkZXYpOworCQl9CisJfQorCisJa2ZyZWUoZGV2X3Jvc2UpOworCXByb3RvX3VucmVnaXN0ZXIoJnJvc2VfcHJvdG8pOworfQorCittb2R1bGVfZXhpdChyb3NlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvbmV0L3Jvc2Uvcm9zZV9kZXYuYyBiL25ldC9yb3NlL3Jvc2VfZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlZDlhMQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yb3NlL3Jvc2VfZGV2LmMKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgSm9uYXRoYW4gTmF5bG9yIEc0S0xYIChnNGtseEBnNGtseC5kZW1vbi5jby51aykKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisKKyNpbmNsdWRlIDxuZXQvYXgyNS5oPgorI2luY2x1ZGUgPG5ldC9yb3NlLmg+CisKK3N0YXRpYyBpbnQgcm9zZV9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdHlwZSwKKwl2b2lkICpkYWRkciwgdm9pZCAqc2FkZHIsIHVuc2lnbmVkIGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICpidWZmID0gc2tiX3B1c2goc2tiLCBST1NFX01JTl9MRU4gKyAyKTsKKworCSpidWZmKysgPSBST1NFX0dGSSB8IFJPU0VfUV9CSVQ7CisJKmJ1ZmYrKyA9IDB4MDA7CisJKmJ1ZmYrKyA9IFJPU0VfREFUQTsKKwkqYnVmZisrID0gMHg3RjsKKwkqYnVmZisrID0gQVgyNV9QX0lQOworCisJaWYgKGRhZGRyICE9IE5VTEwpCisJCXJldHVybiAzNzsKKworCXJldHVybiAtMzc7Cit9CisKK3N0YXRpYyBpbnQgcm9zZV9yZWJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGNoYXIgKmJwID0gKHVuc2lnbmVkIGNoYXIgKilza2ItPmRhdGE7CisJc3RydWN0IHNrX2J1ZmYgKnNrYm47CisKKyNpZmRlZiBDT05GSUdfSU5FVAorCWlmIChhcnBfZmluZChicCArIDcsIHNrYikpIHsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKChza2JuID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAxOworCX0KKworCWlmIChza2ItPnNrICE9IE5VTEwpCisJCXNrYl9zZXRfb3duZXJfdyhza2JuLCBza2ItPnNrKTsKKworCWtmcmVlX3NrYihza2IpOworCisJaWYgKCFyb3NlX3JvdXRlX2ZyYW1lKHNrYm4sIE5VTEwpKSB7CisJCWtmcmVlX3NrYihza2JuKTsKKwkJc3RhdHMtPnR4X2Vycm9ycysrOworCQlyZXR1cm4gMTsKKwl9CisKKwlzdGF0cy0+dHhfcGFja2V0cysrOworCXN0YXRzLT50eF9ieXRlcyArPSBza2JuLT5sZW47CisjZW5kaWYKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCByb3NlX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCXN0cnVjdCBzb2NrYWRkciAqc2EgPSBhZGRyOworCisJcm9zZV9kZWxfbG9vcGJhY2tfbm9kZSgocm9zZV9hZGRyZXNzICopZGV2LT5kZXZfYWRkcik7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgc2EtPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCisJcm9zZV9hZGRfbG9vcGJhY2tfbm9kZSgocm9zZV9hZGRyZXNzICopZGV2LT5kZXZfYWRkcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByb3NlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJvc2VfYWRkX2xvb3BiYWNrX25vZGUoKHJvc2VfYWRkcmVzcyAqKWRldi0+ZGV2X2FkZHIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvc2VfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJcm9zZV9kZWxfbG9vcGJhY2tfbm9kZSgocm9zZV9hZGRyZXNzICopZGV2LT5kZXZfYWRkcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcm9zZV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUk9TRTogcm9zZV94bWl0IC0gY2FsbGVkIHdoZW4gaWZhY2UgaXMgZG93blxuIik7CisJCXJldHVybiAxOworCX0KKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJc3RhdHMtPnR4X2Vycm9ycysrOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnJvc2VfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIG5ldGRldl9wcml2KGRldik7Cit9CisKK3ZvaWQgcm9zZV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlkZXYtPm10dQkJPSBST1NFX01BWF9QQUNLRVRfU0laRSAtIDI7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSByb3NlX3htaXQ7CisJZGV2LT5vcGVuCQk9IHJvc2Vfb3BlbjsKKwlkZXYtPnN0b3AJCT0gcm9zZV9jbG9zZTsKKworCWRldi0+aGFyZF9oZWFkZXIJPSByb3NlX2hlYWRlcjsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbgk9IEFYMjVfQlBRX0hFQURFUl9MRU4gKyBBWDI1X01BWF9IRUFERVJfTEVOICsgUk9TRV9NSU5fTEVOOworCWRldi0+YWRkcl9sZW4JCT0gUk9TRV9BRERSX0xFTjsKKwlkZXYtPnR5cGUJCT0gQVJQSFJEX1JPU0U7CisJZGV2LT5yZWJ1aWxkX2hlYWRlcgk9IHJvc2VfcmVidWlsZF9oZWFkZXI7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgICAgPSByb3NlX3NldF9tYWNfYWRkcmVzczsKKworCS8qIE5ldy1zdHlsZSBmbGFncy4gKi8KKwlkZXYtPmZsYWdzCQk9IDA7CisJZGV2LT5nZXRfc3RhdHMgPSByb3NlX2dldF9zdGF0czsKK30KZGlmZiAtLWdpdCBhL25ldC9yb3NlL3Jvc2VfaW4uYyBiL25ldC9yb3NlL3Jvc2VfaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjQ3NWExCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3Jvc2Uvcm9zZV9pbi5jCkBAIC0wLDAgKzEsMjk3IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIEpvbmF0aGFuIE5heWxvciBHNEtMWCAoZzRrbHhAZzRrbHguZGVtb24uY28udWspCisgKgorICogTW9zdCBvZiB0aGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIFNETCBkaWFncmFtcyBwdWJsaXNoZWQgaW4gdGhlIDd0aCBBUlJMCisgKiBDb21wdXRlciBOZXR3b3JraW5nIENvbmZlcmVuY2UgcGFwZXJzLiBUaGUgZGlhZ3JhbXMgaGF2ZSBtaXN0YWtlcyBpbiB0aGVtLAorICogYnV0IGFyZSBtb3N0bHkgY29ycmVjdC4gQmVmb3JlIHlvdSBtb2RpZnkgdGhlIGNvZGUgY291bGQgeW91IHJlYWQgdGhlIFNETAorICogZGlhZ3JhbXMgYXMgdGhlIGNvZGUgaXMgbm90IG9idmlvdXMgYW5kIHByb2JhYmx5IHZlcnkgZWFzeSB0byBicmVhay4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bmV0L2F4MjUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4JCQkvKiBGb3IgaXBfcmN2ICovCisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bmV0L3Jvc2UuaD4KKworLyoKKyAqIFN0YXRlIG1hY2hpbmUgZm9yIHN0YXRlIDEsIEF3YWl0aW5nIENhbGwgQWNjZXB0ZWQgU3RhdGUuCisgKiBUaGUgaGFuZGxpbmcgb2YgdGhlIHRpbWVyKHMpIGlzIGluIGZpbGUgcm9zZV90aW1lci5jLgorICogSGFuZGxpbmcgb2Ygc3RhdGUgMCBhbmQgY29ubmVjdGlvbiByZWxlYXNlIGlzIGluIGFmX3Jvc2UuYy4KKyAqLworc3RhdGljIGludCByb3NlX3N0YXRlMV9tYWNoaW5lKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGZyYW1ldHlwZSkKK3sKKwlzdHJ1Y3Qgcm9zZV9zb2NrICpyb3NlID0gcm9zZV9zayhzayk7CisKKwlzd2l0Y2ggKGZyYW1ldHlwZSkgeworCWNhc2UgUk9TRV9DQUxMX0FDQ0VQVEVEOgorCQlyb3NlX3N0b3BfdGltZXIoc2spOworCQlyb3NlX3N0YXJ0X2lkbGV0aW1lcihzayk7CisJCXJvc2UtPmNvbmRpdGlvbiA9IDB4MDA7CisJCXJvc2UtPnZzICAgICAgICA9IDA7CisJCXJvc2UtPnZhICAgICAgICA9IDA7CisJCXJvc2UtPnZyICAgICAgICA9IDA7CisJCXJvc2UtPnZsICAgICAgICA9IDA7CisJCXJvc2UtPnN0YXRlICAgICA9IFJPU0VfU1RBVEVfMzsKKwkJc2stPnNrX3N0YXRlCT0gVENQX0VTVEFCTElTSEVEOworCQlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkKKwkJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCQlicmVhazsKKworCWNhc2UgUk9TRV9DTEVBUl9SRVFVRVNUOgorCQlyb3NlX3dyaXRlX2ludGVybmFsKHNrLCBST1NFX0NMRUFSX0NPTkZJUk1BVElPTik7CisJCXJvc2VfZGlzY29ubmVjdChzaywgRUNPTk5SRUZVU0VELCBza2ItPmRhdGFbM10sIHNrYi0+ZGF0YVs0XSk7CisJCXJvc2UtPm5laWdoYm91ci0+dXNlLS07CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTdGF0ZSBtYWNoaW5lIGZvciBzdGF0ZSAyLCBBd2FpdGluZyBDbGVhciBDb25maXJtYXRpb24gU3RhdGUuCisgKiBUaGUgaGFuZGxpbmcgb2YgdGhlIHRpbWVyKHMpIGlzIGluIGZpbGUgcm9zZV90aW1lci5jCisgKiBIYW5kbGluZyBvZiBzdGF0ZSAwIGFuZCBjb25uZWN0aW9uIHJlbGVhc2UgaXMgaW4gYWZfcm9zZS5jLgorICovCitzdGF0aWMgaW50IHJvc2Vfc3RhdGUyX21hY2hpbmUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZnJhbWV0eXBlKQoreworCXN0cnVjdCByb3NlX3NvY2sgKnJvc2UgPSByb3NlX3NrKHNrKTsKKworCXN3aXRjaCAoZnJhbWV0eXBlKSB7CisJY2FzZSBST1NFX0NMRUFSX1JFUVVFU1Q6CisJCXJvc2Vfd3JpdGVfaW50ZXJuYWwoc2ssIFJPU0VfQ0xFQVJfQ09ORklSTUFUSU9OKTsKKwkJcm9zZV9kaXNjb25uZWN0KHNrLCAwLCBza2ItPmRhdGFbM10sIHNrYi0+ZGF0YVs0XSk7CisJCXJvc2UtPm5laWdoYm91ci0+dXNlLS07CisJCWJyZWFrOworCisJY2FzZSBST1NFX0NMRUFSX0NPTkZJUk1BVElPTjoKKwkJcm9zZV9kaXNjb25uZWN0KHNrLCAwLCAtMSwgLTEpOworCQlyb3NlLT5uZWlnaGJvdXItPnVzZS0tOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogU3RhdGUgbWFjaGluZSBmb3Igc3RhdGUgMywgQ29ubmVjdGVkIFN0YXRlLgorICogVGhlIGhhbmRsaW5nIG9mIHRoZSB0aW1lcihzKSBpcyBpbiBmaWxlIHJvc2VfdGltZXIuYworICogSGFuZGxpbmcgb2Ygc3RhdGUgMCBhbmQgY29ubmVjdGlvbiByZWxlYXNlIGlzIGluIGFmX3Jvc2UuYy4KKyAqLworc3RhdGljIGludCByb3NlX3N0YXRlM19tYWNoaW5lKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGZyYW1ldHlwZSwgaW50IG5zLCBpbnQgbnIsIGludCBxLCBpbnQgZCwgaW50IG0pCit7CisJc3RydWN0IHJvc2Vfc29jayAqcm9zZSA9IHJvc2Vfc2soc2spOworCWludCBxdWV1ZWQgPSAwOworCisJc3dpdGNoIChmcmFtZXR5cGUpIHsKKwljYXNlIFJPU0VfUkVTRVRfUkVRVUVTVDoKKwkJcm9zZV9zdG9wX3RpbWVyKHNrKTsKKwkJcm9zZV9zdGFydF9pZGxldGltZXIoc2spOworCQlyb3NlX3dyaXRlX2ludGVybmFsKHNrLCBST1NFX1JFU0VUX0NPTkZJUk1BVElPTik7CisJCXJvc2UtPmNvbmRpdGlvbiA9IDB4MDA7CisJCXJvc2UtPnZzICAgICAgICA9IDA7CisJCXJvc2UtPnZyICAgICAgICA9IDA7CisJCXJvc2UtPnZhICAgICAgICA9IDA7CisJCXJvc2UtPnZsICAgICAgICA9IDA7CisJCXJvc2VfcmVxdWV1ZV9mcmFtZXMoc2spOworCQlicmVhazsKKworCWNhc2UgUk9TRV9DTEVBUl9SRVFVRVNUOgorCQlyb3NlX3dyaXRlX2ludGVybmFsKHNrLCBST1NFX0NMRUFSX0NPTkZJUk1BVElPTik7CisJCXJvc2VfZGlzY29ubmVjdChzaywgMCwgc2tiLT5kYXRhWzNdLCBza2ItPmRhdGFbNF0pOworCQlyb3NlLT5uZWlnaGJvdXItPnVzZS0tOworCQlicmVhazsKKworCWNhc2UgUk9TRV9SUjoKKwljYXNlIFJPU0VfUk5SOgorCQlpZiAoIXJvc2VfdmFsaWRhdGVfbnIoc2ssIG5yKSkgeworCQkJcm9zZV93cml0ZV9pbnRlcm5hbChzaywgUk9TRV9SRVNFVF9SRVFVRVNUKTsKKwkJCXJvc2UtPmNvbmRpdGlvbiA9IDB4MDA7CisJCQlyb3NlLT52cyAgICAgICAgPSAwOworCQkJcm9zZS0+dnIgICAgICAgID0gMDsKKwkJCXJvc2UtPnZhICAgICAgICA9IDA7CisJCQlyb3NlLT52bCAgICAgICAgPSAwOworCQkJcm9zZS0+c3RhdGUgICAgID0gUk9TRV9TVEFURV80OworCQkJcm9zZV9zdGFydF90MnRpbWVyKHNrKTsKKwkJCXJvc2Vfc3RvcF9pZGxldGltZXIoc2spOworCQl9IGVsc2UgeworCQkJcm9zZV9mcmFtZXNfYWNrZWQoc2ssIG5yKTsKKwkJCWlmIChmcmFtZXR5cGUgPT0gUk9TRV9STlIpIHsKKwkJCQlyb3NlLT5jb25kaXRpb24gfD0gUk9TRV9DT05EX1BFRVJfUlhfQlVTWTsKKwkJCX0gZWxzZSB7CisJCQkJcm9zZS0+Y29uZGl0aW9uICY9IH5ST1NFX0NPTkRfUEVFUl9SWF9CVVNZOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBST1NFX0RBVEE6CS8qIFhYWCAqLworCQlyb3NlLT5jb25kaXRpb24gJj0gflJPU0VfQ09ORF9QRUVSX1JYX0JVU1k7CisJCWlmICghcm9zZV92YWxpZGF0ZV9ucihzaywgbnIpKSB7CisJCQlyb3NlX3dyaXRlX2ludGVybmFsKHNrLCBST1NFX1JFU0VUX1JFUVVFU1QpOworCQkJcm9zZS0+Y29uZGl0aW9uID0gMHgwMDsKKwkJCXJvc2UtPnZzICAgICAgICA9IDA7CisJCQlyb3NlLT52ciAgICAgICAgPSAwOworCQkJcm9zZS0+dmEgICAgICAgID0gMDsKKwkJCXJvc2UtPnZsICAgICAgICA9IDA7CisJCQlyb3NlLT5zdGF0ZSAgICAgPSBST1NFX1NUQVRFXzQ7CisJCQlyb3NlX3N0YXJ0X3QydGltZXIoc2spOworCQkJcm9zZV9zdG9wX2lkbGV0aW1lcihzayk7CisJCQlicmVhazsKKwkJfQorCQlyb3NlX2ZyYW1lc19hY2tlZChzaywgbnIpOworCQlpZiAobnMgPT0gcm9zZS0+dnIpIHsKKwkJCXJvc2Vfc3RhcnRfaWRsZXRpbWVyKHNrKTsKKwkJCWlmIChzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYikgPT0gMCkgeworCQkJCXJvc2UtPnZyID0gKHJvc2UtPnZyICsgMSkgJSBST1NFX01PRFVMVVM7CisJCQkJcXVldWVkID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAhICovCisJCQkJcm9zZV93cml0ZV9pbnRlcm5hbChzaywgUk9TRV9SRVNFVF9SRVFVRVNUKTsKKwkJCQlyb3NlLT5jb25kaXRpb24gPSAweDAwOworCQkJCXJvc2UtPnZzICAgICAgICA9IDA7CisJCQkJcm9zZS0+dnIgICAgICAgID0gMDsKKwkJCQlyb3NlLT52YSAgICAgICAgPSAwOworCQkJCXJvc2UtPnZsICAgICAgICA9IDA7CisJCQkJcm9zZS0+c3RhdGUgICAgID0gUk9TRV9TVEFURV80OworCQkJCXJvc2Vfc3RhcnRfdDJ0aW1lcihzayk7CisJCQkJcm9zZV9zdG9wX2lkbGV0aW1lcihzayk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSA+CisJCQkgICAgKHNrLT5za19yY3ZidWYgLyAyKSkKKwkJCQlyb3NlLT5jb25kaXRpb24gfD0gUk9TRV9DT05EX09XTl9SWF9CVVNZOworCQl9CisJCS8qCisJCSAqIElmIHRoZSB3aW5kb3cgaXMgZnVsbCwgYWNrIHRoZSBmcmFtZSwgZWxzZSBzdGFydCB0aGUKKwkJICogYWNrbm93bGVkZ2UgaG9sZCBiYWNrIHRpbWVyLgorCQkgKi8KKwkJaWYgKCgocm9zZS0+dmwgKyBzeXNjdGxfcm9zZV93aW5kb3dfc2l6ZSkgJSBST1NFX01PRFVMVVMpID09IHJvc2UtPnZyKSB7CisJCQlyb3NlLT5jb25kaXRpb24gJj0gflJPU0VfQ09ORF9BQ0tfUEVORElORzsKKwkJCXJvc2Vfc3RvcF90aW1lcihzayk7CisJCQlyb3NlX2VucXVpcnlfcmVzcG9uc2Uoc2spOworCQl9IGVsc2UgeworCQkJcm9zZS0+Y29uZGl0aW9uIHw9IFJPU0VfQ09ORF9BQ0tfUEVORElORzsKKwkJCXJvc2Vfc3RhcnRfaGJ0aW1lcihzayk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJST1NFOiB1bmtub3duICUwMlggaW4gc3RhdGUgM1xuIiwgZnJhbWV0eXBlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHF1ZXVlZDsKK30KKworLyoKKyAqIFN0YXRlIG1hY2hpbmUgZm9yIHN0YXRlIDQsIEF3YWl0aW5nIFJlc2V0IENvbmZpcm1hdGlvbiBTdGF0ZS4KKyAqIFRoZSBoYW5kbGluZyBvZiB0aGUgdGltZXIocykgaXMgaW4gZmlsZSByb3NlX3RpbWVyLmMKKyAqIEhhbmRsaW5nIG9mIHN0YXRlIDAgYW5kIGNvbm5lY3Rpb24gcmVsZWFzZSBpcyBpbiBhZl9yb3NlLmMuCisgKi8KK3N0YXRpYyBpbnQgcm9zZV9zdGF0ZTRfbWFjaGluZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIGludCBmcmFtZXR5cGUpCit7CisJc3RydWN0IHJvc2Vfc29jayAqcm9zZSA9IHJvc2Vfc2soc2spOworCisJc3dpdGNoIChmcmFtZXR5cGUpIHsKKwljYXNlIFJPU0VfUkVTRVRfUkVRVUVTVDoKKwkJcm9zZV93cml0ZV9pbnRlcm5hbChzaywgUk9TRV9SRVNFVF9DT05GSVJNQVRJT04pOworCWNhc2UgUk9TRV9SRVNFVF9DT05GSVJNQVRJT046CisJCXJvc2Vfc3RvcF90aW1lcihzayk7CisJCXJvc2Vfc3RhcnRfaWRsZXRpbWVyKHNrKTsKKwkJcm9zZS0+Y29uZGl0aW9uID0gMHgwMDsKKwkJcm9zZS0+dmEgICAgICAgID0gMDsKKwkJcm9zZS0+dnIgICAgICAgID0gMDsKKwkJcm9zZS0+dnMgICAgICAgID0gMDsKKwkJcm9zZS0+dmwgICAgICAgID0gMDsKKwkJcm9zZS0+c3RhdGUgICAgID0gUk9TRV9TVEFURV8zOworCQlyb3NlX3JlcXVldWVfZnJhbWVzKHNrKTsKKwkJYnJlYWs7CisKKwljYXNlIFJPU0VfQ0xFQVJfUkVRVUVTVDoKKwkJcm9zZV93cml0ZV9pbnRlcm5hbChzaywgUk9TRV9DTEVBUl9DT05GSVJNQVRJT04pOworCQlyb3NlX2Rpc2Nvbm5lY3Qoc2ssIDAsIHNrYi0+ZGF0YVszXSwgc2tiLT5kYXRhWzRdKTsKKwkJcm9zZS0+bmVpZ2hib3VyLT51c2UtLTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFN0YXRlIG1hY2hpbmUgZm9yIHN0YXRlIDUsIEF3YWl0aW5nIENhbGwgQWNjZXB0YW5jZSBTdGF0ZS4KKyAqIFRoZSBoYW5kbGluZyBvZiB0aGUgdGltZXIocykgaXMgaW4gZmlsZSByb3NlX3RpbWVyLmMKKyAqIEhhbmRsaW5nIG9mIHN0YXRlIDAgYW5kIGNvbm5lY3Rpb24gcmVsZWFzZSBpcyBpbiBhZl9yb3NlLmMuCisgKi8KK3N0YXRpYyBpbnQgcm9zZV9zdGF0ZTVfbWFjaGluZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIGludCBmcmFtZXR5cGUpCit7CisJaWYgKGZyYW1ldHlwZSA9PSBST1NFX0NMRUFSX1JFUVVFU1QpIHsKKwkJcm9zZV93cml0ZV9pbnRlcm5hbChzaywgUk9TRV9DTEVBUl9DT05GSVJNQVRJT04pOworCQlyb3NlX2Rpc2Nvbm5lY3Qoc2ssIDAsIHNrYi0+ZGF0YVszXSwgc2tiLT5kYXRhWzRdKTsKKwkJcm9zZV9zayhzayktPm5laWdoYm91ci0+dXNlLS07CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIEhpZ2hlciBsZXZlbCB1cGNhbGwgZm9yIGEgTEFQQiBmcmFtZSAqLworaW50IHJvc2VfcHJvY2Vzc19yeF9mcmFtZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHJvc2Vfc29jayAqcm9zZSA9IHJvc2Vfc2soc2spOworCWludCBxdWV1ZWQgPSAwLCBmcmFtZXR5cGUsIG5zLCBuciwgcSwgZCwgbTsKKworCWlmIChyb3NlLT5zdGF0ZSA9PSBST1NFX1NUQVRFXzApCisJCXJldHVybiAwOworCisJZnJhbWV0eXBlID0gcm9zZV9kZWNvZGUoc2tiLCAmbnMsICZuciwgJnEsICZkLCAmbSk7CisKKwlzd2l0Y2ggKHJvc2UtPnN0YXRlKSB7CisJY2FzZSBST1NFX1NUQVRFXzE6CisJCXF1ZXVlZCA9IHJvc2Vfc3RhdGUxX21hY2hpbmUoc2ssIHNrYiwgZnJhbWV0eXBlKTsKKwkJYnJlYWs7CisJY2FzZSBST1NFX1NUQVRFXzI6CisJCXF1ZXVlZCA9IHJvc2Vfc3RhdGUyX21hY2hpbmUoc2ssIHNrYiwgZnJhbWV0eXBlKTsKKwkJYnJlYWs7CisJY2FzZSBST1NFX1NUQVRFXzM6CisJCXF1ZXVlZCA9IHJvc2Vfc3RhdGUzX21hY2hpbmUoc2ssIHNrYiwgZnJhbWV0eXBlLCBucywgbnIsIHEsIGQsIG0pOworCQlicmVhazsKKwljYXNlIFJPU0VfU1RBVEVfNDoKKwkJcXVldWVkID0gcm9zZV9zdGF0ZTRfbWFjaGluZShzaywgc2tiLCBmcmFtZXR5cGUpOworCQlicmVhazsKKwljYXNlIFJPU0VfU1RBVEVfNToKKwkJcXVldWVkID0gcm9zZV9zdGF0ZTVfbWFjaGluZShzaywgc2tiLCBmcmFtZXR5cGUpOworCQlicmVhazsKKwl9CisKKwlyb3NlX2tpY2soc2spOworCisJcmV0dXJuIHF1ZXVlZDsKK30KZGlmZiAtLWdpdCBhL25ldC9yb3NlL3Jvc2VfbGluay5jIGIvbmV0L3Jvc2Uvcm9zZV9saW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDllOWU5ZAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yb3NlL3Jvc2VfbGluay5jCkBAIC0wLDAgKzEsMjg4IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIEpvbmF0aGFuIE5heWxvciBHNEtMWCAoZzRrbHhAZzRrbHguZGVtb24uY28udWspCisgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bmV0L2F4MjUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPG5ldC9yb3NlLmg+CisKK3N0YXRpYyB2b2lkIHJvc2VfZnRpbWVyX2V4cGlyeSh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyB2b2lkIHJvc2VfdDB0aW1lcl9leHBpcnkodW5zaWduZWQgbG9uZyk7CisKK3N0YXRpYyB2b2lkIHJvc2VfdHJhbnNtaXRfcmVzdGFydF9jb25maXJtYXRpb24oc3RydWN0IHJvc2VfbmVpZ2ggKm5laWdoKTsKK3N0YXRpYyB2b2lkIHJvc2VfdHJhbnNtaXRfcmVzdGFydF9yZXF1ZXN0KHN0cnVjdCByb3NlX25laWdoICpuZWlnaCk7CisKK3ZvaWQgcm9zZV9zdGFydF9mdGltZXIoc3RydWN0IHJvc2VfbmVpZ2ggKm5laWdoKQoreworCWRlbF90aW1lcigmbmVpZ2gtPmZ0aW1lcik7CisKKwluZWlnaC0+ZnRpbWVyLmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpbmVpZ2g7CisJbmVpZ2gtPmZ0aW1lci5mdW5jdGlvbiA9ICZyb3NlX2Z0aW1lcl9leHBpcnk7CisJbmVpZ2gtPmZ0aW1lci5leHBpcmVzICA9IGppZmZpZXMgKyBzeXNjdGxfcm9zZV9saW5rX2ZhaWxfdGltZW91dDsKKworCWFkZF90aW1lcigmbmVpZ2gtPmZ0aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIHJvc2Vfc3RhcnRfdDB0aW1lcihzdHJ1Y3Qgcm9zZV9uZWlnaCAqbmVpZ2gpCit7CisJZGVsX3RpbWVyKCZuZWlnaC0+dDB0aW1lcik7CisKKwluZWlnaC0+dDB0aW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKW5laWdoOworCW5laWdoLT50MHRpbWVyLmZ1bmN0aW9uID0gJnJvc2VfdDB0aW1lcl9leHBpcnk7CisJbmVpZ2gtPnQwdGltZXIuZXhwaXJlcyAgPSBqaWZmaWVzICsgc3lzY3RsX3Jvc2VfcmVzdGFydF9yZXF1ZXN0X3RpbWVvdXQ7CisKKwlhZGRfdGltZXIoJm5laWdoLT50MHRpbWVyKTsKK30KKwordm9pZCByb3NlX3N0b3BfZnRpbWVyKHN0cnVjdCByb3NlX25laWdoICpuZWlnaCkKK3sKKwlkZWxfdGltZXIoJm5laWdoLT5mdGltZXIpOworfQorCit2b2lkIHJvc2Vfc3RvcF90MHRpbWVyKHN0cnVjdCByb3NlX25laWdoICpuZWlnaCkKK3sKKwlkZWxfdGltZXIoJm5laWdoLT50MHRpbWVyKTsKK30KKworaW50IHJvc2VfZnRpbWVyX3J1bm5pbmcoc3RydWN0IHJvc2VfbmVpZ2ggKm5laWdoKQoreworCXJldHVybiB0aW1lcl9wZW5kaW5nKCZuZWlnaC0+ZnRpbWVyKTsKK30KKworc3RhdGljIGludCByb3NlX3QwdGltZXJfcnVubmluZyhzdHJ1Y3Qgcm9zZV9uZWlnaCAqbmVpZ2gpCit7CisJcmV0dXJuIHRpbWVyX3BlbmRpbmcoJm5laWdoLT50MHRpbWVyKTsKK30KKworc3RhdGljIHZvaWQgcm9zZV9mdGltZXJfZXhwaXJ5KHVuc2lnbmVkIGxvbmcgcGFyYW0pCit7Cit9CisKK3N0YXRpYyB2b2lkIHJvc2VfdDB0aW1lcl9leHBpcnkodW5zaWduZWQgbG9uZyBwYXJhbSkKK3sKKwlzdHJ1Y3Qgcm9zZV9uZWlnaCAqbmVpZ2ggPSAoc3RydWN0IHJvc2VfbmVpZ2ggKilwYXJhbTsKKworCXJvc2VfdHJhbnNtaXRfcmVzdGFydF9yZXF1ZXN0KG5laWdoKTsKKworCW5laWdoLT5kY2VfbW9kZSA9IDA7CisKKwlyb3NlX3N0YXJ0X3QwdGltZXIobmVpZ2gpOworfQorCisvKgorICoJSW50ZXJmYWNlIHRvIGF4MjVfc2VuZF9mcmFtZS4gQ2hhbmdlcyBteSBsZXZlbCAyIGNhbGxzaWduIGRlcGVuZGluZworICoJb24gd2hldGhlciB3ZSBoYXZlIGEgZ2xvYmFsIFJPU0UgY2FsbHNpZ24gb3IgdXNlIHRoZSBkZWZhdWx0IHBvcnQKKyAqCWNhbGxzaWduLgorICovCitzdGF0aWMgaW50IHJvc2Vfc2VuZF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgcm9zZV9uZWlnaCAqbmVpZ2gpCit7CisJYXgyNV9hZGRyZXNzICpyb3NlX2NhbGw7CisKKwlpZiAoYXgyNWNtcCgmcm9zZV9jYWxsc2lnbiwgJm51bGxfYXgyNV9hZGRyZXNzKSA9PSAwKQorCQlyb3NlX2NhbGwgPSAoYXgyNV9hZGRyZXNzICopbmVpZ2gtPmRldi0+ZGV2X2FkZHI7CisJZWxzZQorCQlyb3NlX2NhbGwgPSAmcm9zZV9jYWxsc2lnbjsKKworCW5laWdoLT5heDI1ID0gYXgyNV9zZW5kX2ZyYW1lKHNrYiwgMjYwLCByb3NlX2NhbGwsICZuZWlnaC0+Y2FsbHNpZ24sIG5laWdoLT5kaWdpcGVhdCwgbmVpZ2gtPmRldik7CisKKwlyZXR1cm4gKG5laWdoLT5heDI1ICE9IE5VTEwpOworfQorCisvKgorICoJSW50ZXJmYWNlIHRvIGF4MjVfbGlua191cC4gQ2hhbmdlcyBteSBsZXZlbCAyIGNhbGxzaWduIGRlcGVuZGluZworICoJb24gd2hldGhlciB3ZSBoYXZlIGEgZ2xvYmFsIFJPU0UgY2FsbHNpZ24gb3IgdXNlIHRoZSBkZWZhdWx0IHBvcnQKKyAqCWNhbGxzaWduLgorICovCitzdGF0aWMgaW50IHJvc2VfbGlua191cChzdHJ1Y3Qgcm9zZV9uZWlnaCAqbmVpZ2gpCit7CisJYXgyNV9hZGRyZXNzICpyb3NlX2NhbGw7CisKKwlpZiAoYXgyNWNtcCgmcm9zZV9jYWxsc2lnbiwgJm51bGxfYXgyNV9hZGRyZXNzKSA9PSAwKQorCQlyb3NlX2NhbGwgPSAoYXgyNV9hZGRyZXNzICopbmVpZ2gtPmRldi0+ZGV2X2FkZHI7CisJZWxzZQorCQlyb3NlX2NhbGwgPSAmcm9zZV9jYWxsc2lnbjsKKworCW5laWdoLT5heDI1ID0gYXgyNV9maW5kX2NiKHJvc2VfY2FsbCwgJm5laWdoLT5jYWxsc2lnbiwgbmVpZ2gtPmRpZ2lwZWF0LCBuZWlnaC0+ZGV2KTsKKworCXJldHVybiAobmVpZ2gtPmF4MjUgIT0gTlVMTCk7Cit9CisKKy8qCisgKglUaGlzIGhhbmRsZXMgYWxsIHJlc3RhcnQgYW5kIGRpYWdub3N0aWMgZnJhbWVzLgorICovCit2b2lkIHJvc2VfbGlua19yeF9yZXN0YXJ0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCByb3NlX25laWdoICpuZWlnaCwgdW5zaWduZWQgc2hvcnQgZnJhbWV0eXBlKQoreworCXN0cnVjdCBza19idWZmICpza2JuOworCisJc3dpdGNoIChmcmFtZXR5cGUpIHsKKwljYXNlIFJPU0VfUkVTVEFSVF9SRVFVRVNUOgorCQlyb3NlX3N0b3BfdDB0aW1lcihuZWlnaCk7CisJCW5laWdoLT5yZXN0YXJ0ZWQgPSAxOworCQluZWlnaC0+ZGNlX21vZGUgID0gKHNrYi0+ZGF0YVszXSA9PSBST1NFX0RURV9PUklHSU5BVEVEKTsKKwkJcm9zZV90cmFuc21pdF9yZXN0YXJ0X2NvbmZpcm1hdGlvbihuZWlnaCk7CisJCWJyZWFrOworCisJY2FzZSBST1NFX1JFU1RBUlRfQ09ORklSTUFUSU9OOgorCQlyb3NlX3N0b3BfdDB0aW1lcihuZWlnaCk7CisJCW5laWdoLT5yZXN0YXJ0ZWQgPSAxOworCQlicmVhazsKKworCWNhc2UgUk9TRV9ESUFHTk9TVElDOgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJST1NFOiByZWNlaXZlZCBkaWFnbm9zdGljICMlZCAtICUwMlggJTAyWCAlMDJYXG4iLCBza2ItPmRhdGFbM10sIHNrYi0+ZGF0YVs0XSwgc2tiLT5kYXRhWzVdLCBza2ItPmRhdGFbNl0pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJPU0U6IHJlY2VpdmVkIHVua25vd24gJTAyWCB3aXRoIExDSSAwMDBcbiIsIGZyYW1ldHlwZSk7CisJCWJyZWFrOworCX0KKworCWlmIChuZWlnaC0+cmVzdGFydGVkKSB7CisJCXdoaWxlICgoc2tibiA9IHNrYl9kZXF1ZXVlKCZuZWlnaC0+cXVldWUpKSAhPSBOVUxMKQorCQkJaWYgKCFyb3NlX3NlbmRfZnJhbWUoc2tibiwgbmVpZ2gpKQorCQkJCWtmcmVlX3NrYihza2JuKTsKKwl9Cit9CisKKy8qCisgKglUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gYSBSZXN0YXJ0IFJlcXVlc3QgaXMgbmVlZGVkCisgKi8KK3N0YXRpYyB2b2lkIHJvc2VfdHJhbnNtaXRfcmVzdGFydF9yZXF1ZXN0KHN0cnVjdCByb3NlX25laWdoICpuZWlnaCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGNoYXIgKmRwdHI7CisJaW50IGxlbjsKKworCWxlbiA9IEFYMjVfQlBRX0hFQURFUl9MRU4gKyBBWDI1X01BWF9IRUFERVJfTEVOICsgUk9TRV9NSU5fTEVOICsgMzsKKworCWlmICgoc2tiID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJCXJldHVybjsKKworCXNrYl9yZXNlcnZlKHNrYiwgQVgyNV9CUFFfSEVBREVSX0xFTiArIEFYMjVfTUFYX0hFQURFUl9MRU4pOworCisJZHB0ciA9IHNrYl9wdXQoc2tiLCBST1NFX01JTl9MRU4gKyAzKTsKKworCSpkcHRyKysgPSBBWDI1X1BfUk9TRTsKKwkqZHB0cisrID0gUk9TRV9HRkk7CisJKmRwdHIrKyA9IDB4MDA7CisJKmRwdHIrKyA9IFJPU0VfUkVTVEFSVF9SRVFVRVNUOworCSpkcHRyKysgPSBST1NFX0RURV9PUklHSU5BVEVEOworCSpkcHRyKysgPSAwOworCisJaWYgKCFyb3NlX3NlbmRfZnJhbWUoc2tiLCBuZWlnaCkpCisJCWtmcmVlX3NrYihza2IpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIGEgUmVzdGFydCBDb25maXJtYXRpb24gaXMgbmVlZGVkCisgKi8KK3N0YXRpYyB2b2lkIHJvc2VfdHJhbnNtaXRfcmVzdGFydF9jb25maXJtYXRpb24oc3RydWN0IHJvc2VfbmVpZ2ggKm5laWdoKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgY2hhciAqZHB0cjsKKwlpbnQgbGVuOworCisJbGVuID0gQVgyNV9CUFFfSEVBREVSX0xFTiArIEFYMjVfTUFYX0hFQURFUl9MRU4gKyBST1NFX01JTl9MRU4gKyAxOworCisJaWYgKChza2IgPSBhbGxvY19za2IobGVuLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc2tiX3Jlc2VydmUoc2tiLCBBWDI1X0JQUV9IRUFERVJfTEVOICsgQVgyNV9NQVhfSEVBREVSX0xFTik7CisKKwlkcHRyID0gc2tiX3B1dChza2IsIFJPU0VfTUlOX0xFTiArIDEpOworCisJKmRwdHIrKyA9IEFYMjVfUF9ST1NFOworCSpkcHRyKysgPSBST1NFX0dGSTsKKwkqZHB0cisrID0gMHgwMDsKKwkqZHB0cisrID0gUk9TRV9SRVNUQVJUX0NPTkZJUk1BVElPTjsKKworCWlmICghcm9zZV9zZW5kX2ZyYW1lKHNrYiwgbmVpZ2gpKQorCQlrZnJlZV9za2Ioc2tiKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiBhIENsZWFyIFJlcXVlc3QgaXMgbmVlZGVkIG91dHNpZGUgb2YgdGhlIGNvbnRleHQKKyAqIG9mIGEgY29ubmVjdGVkIHNvY2tldC4KKyAqLwordm9pZCByb3NlX3RyYW5zbWl0X2NsZWFyX3JlcXVlc3Qoc3RydWN0IHJvc2VfbmVpZ2ggKm5laWdoLCB1bnNpZ25lZCBpbnQgbGNpLCB1bnNpZ25lZCBjaGFyIGNhdXNlLCB1bnNpZ25lZCBjaGFyIGRpYWdub3N0aWMpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyICpkcHRyOworCWludCBsZW47CisKKwlsZW4gPSBBWDI1X0JQUV9IRUFERVJfTEVOICsgQVgyNV9NQVhfSEVBREVSX0xFTiArIFJPU0VfTUlOX0xFTiArIDM7CisKKwlpZiAoKHNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlza2JfcmVzZXJ2ZShza2IsIEFYMjVfQlBRX0hFQURFUl9MRU4gKyBBWDI1X01BWF9IRUFERVJfTEVOKTsKKworCWRwdHIgPSBza2JfcHV0KHNrYiwgUk9TRV9NSU5fTEVOICsgMyk7CisKKwkqZHB0cisrID0gQVgyNV9QX1JPU0U7CisJKmRwdHIrKyA9ICgobGNpID4+IDgpICYgMHgwRikgfCBST1NFX0dGSTsKKwkqZHB0cisrID0gKChsY2kgPj4gMCkgJiAweEZGKTsKKwkqZHB0cisrID0gUk9TRV9DTEVBUl9SRVFVRVNUOworCSpkcHRyKysgPSBjYXVzZTsKKwkqZHB0cisrID0gZGlhZ25vc3RpYzsKKworCWlmICghcm9zZV9zZW5kX2ZyYW1lKHNrYiwgbmVpZ2gpKQorCQlrZnJlZV9za2Ioc2tiKTsKK30KKwordm9pZCByb3NlX3RyYW5zbWl0X2xpbmsoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHJvc2VfbmVpZ2ggKm5laWdoKQoreworCXVuc2lnbmVkIGNoYXIgKmRwdHI7CisKKyNpZiAwCisJaWYgKGNhbGxfZndfZmlyZXdhbGwoUEZfUk9TRSwgc2tiLT5kZXYsIHNrYi0+ZGF0YSwgTlVMTCwgJnNrYikgIT0gRldfQUNDRVBUKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorI2VuZGlmCisKKwlpZiAobmVpZ2gtPmxvb3BiYWNrKSB7CisJCXJvc2VfbG9vcGJhY2tfcXVldWUoc2tiLCBuZWlnaCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIXJvc2VfbGlua191cChuZWlnaCkpCisJCW5laWdoLT5yZXN0YXJ0ZWQgPSAwOworCisJZHB0ciA9IHNrYl9wdXNoKHNrYiwgMSk7CisJKmRwdHIrKyA9IEFYMjVfUF9ST1NFOworCisJaWYgKG5laWdoLT5yZXN0YXJ0ZWQpIHsKKwkJaWYgKCFyb3NlX3NlbmRfZnJhbWUoc2tiLCBuZWlnaCkpCisJCQlrZnJlZV9za2Ioc2tiKTsKKwl9IGVsc2UgeworCQlza2JfcXVldWVfdGFpbCgmbmVpZ2gtPnF1ZXVlLCBza2IpOworCisJCWlmICghcm9zZV90MHRpbWVyX3J1bm5pbmcobmVpZ2gpKSB7CisJCQlyb3NlX3RyYW5zbWl0X3Jlc3RhcnRfcmVxdWVzdChuZWlnaCk7CisJCQluZWlnaC0+ZGNlX21vZGUgPSAwOworCQkJcm9zZV9zdGFydF90MHRpbWVyKG5laWdoKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL25ldC9yb3NlL3Jvc2VfbG9vcGJhY2suYyBiL25ldC9yb3NlL3Jvc2VfbG9vcGJhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDNiNGQzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3Jvc2Uvcm9zZV9sb29wYmFjay5jCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIEpvbmF0aGFuIE5heWxvciBHNEtMWCAoZzRrbHhAZzRrbHguZGVtb24uY28udWspCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bmV0L2F4MjUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvcm9zZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworc3RhdGljIHN0cnVjdCBza19idWZmX2hlYWQgbG9vcGJhY2tfcXVldWU7CitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgbG9vcGJhY2tfdGltZXI7CisKK3N0YXRpYyB2b2lkIHJvc2Vfc2V0X2xvb3BiYWNrX3RpbWVyKHZvaWQpOworCit2b2lkIHJvc2VfbG9vcGJhY2tfaW5pdCh2b2lkKQoreworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmxvb3BiYWNrX3F1ZXVlKTsKKworCWluaXRfdGltZXIoJmxvb3BiYWNrX3RpbWVyKTsKK30KKworc3RhdGljIGludCByb3NlX2xvb3BiYWNrX3J1bm5pbmcodm9pZCkKK3sKKwlyZXR1cm4gdGltZXJfcGVuZGluZygmbG9vcGJhY2tfdGltZXIpOworfQorCitpbnQgcm9zZV9sb29wYmFja19xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgcm9zZV9uZWlnaCAqbmVpZ2gpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYm47CisKKwlza2JuID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisKKwlrZnJlZV9za2Ioc2tiKTsKKworCWlmIChza2JuICE9IE5VTEwpIHsKKwkJc2tiX3F1ZXVlX3RhaWwoJmxvb3BiYWNrX3F1ZXVlLCBza2JuKTsKKworCQlpZiAoIXJvc2VfbG9vcGJhY2tfcnVubmluZygpKQorCQkJcm9zZV9zZXRfbG9vcGJhY2tfdGltZXIoKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcm9zZV9sb29wYmFja190aW1lcih1bnNpZ25lZCBsb25nKTsKKworc3RhdGljIHZvaWQgcm9zZV9zZXRfbG9vcGJhY2tfdGltZXIodm9pZCkKK3sKKwlkZWxfdGltZXIoJmxvb3BiYWNrX3RpbWVyKTsKKworCWxvb3BiYWNrX3RpbWVyLmRhdGEgICAgID0gMDsKKwlsb29wYmFja190aW1lci5mdW5jdGlvbiA9ICZyb3NlX2xvb3BiYWNrX3RpbWVyOworCWxvb3BiYWNrX3RpbWVyLmV4cGlyZXMgID0gamlmZmllcyArIDEwOworCisJYWRkX3RpbWVyKCZsb29wYmFja190aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIHJvc2VfbG9vcGJhY2tfdGltZXIodW5zaWduZWQgbG9uZyBwYXJhbSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJcm9zZV9hZGRyZXNzICpkZXN0OworCXN0cnVjdCBzb2NrICpzazsKKwl1bnNpZ25lZCBzaG9ydCBmcmFtZXR5cGU7CisJdW5zaWduZWQgaW50IGxjaV9pLCBsY2lfbzsKKworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmxvb3BiYWNrX3F1ZXVlKSkgIT0gTlVMTCkgeworCQlsY2lfaSAgICAgPSAoKHNrYi0+ZGF0YVswXSA8PCA4KSAmIDB4RjAwKSArICgoc2tiLT5kYXRhWzFdIDw8IDApICYgMHgwRkYpOworCQlmcmFtZXR5cGUgPSBza2ItPmRhdGFbMl07CisJCWRlc3QgICAgICA9IChyb3NlX2FkZHJlc3MgKikoc2tiLT5kYXRhICsgNCk7CisJCWxjaV9vICAgICA9IDB4RkZGIC0gbGNpX2k7CisKKwkJc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKworCQlpZiAoKHNrID0gcm9zZV9maW5kX3NvY2tldChsY2lfbywgcm9zZV9sb29wYmFja19uZWlnaCkpICE9IE5VTEwpIHsKKwkJCWlmIChyb3NlX3Byb2Nlc3NfcnhfZnJhbWUoc2ssIHNrYikgPT0gMCkKKwkJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGZyYW1ldHlwZSA9PSBST1NFX0NBTExfUkVRVUVTVCkgeworCQkJaWYgKChkZXYgPSByb3NlX2Rldl9nZXQoZGVzdCkpICE9IE5VTEwpIHsKKwkJCQlpZiAocm9zZV9yeF9jYWxsX3JlcXVlc3Qoc2tiLCBkZXYsIHJvc2VfbG9vcGJhY2tfbmVpZ2gsIGxjaV9vKSA9PSAwKQorCQkJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCX0gZWxzZSB7CisJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJfQorCX0KK30KKwordm9pZCBfX2V4aXQgcm9zZV9sb29wYmFja19jbGVhcih2b2lkKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlkZWxfdGltZXIoJmxvb3BiYWNrX3RpbWVyKTsKKworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmxvb3BiYWNrX3F1ZXVlKSkgIT0gTlVMTCkgeworCQlza2ItPnNrID0gTlVMTDsKKwkJa2ZyZWVfc2tiKHNrYik7CisJfQorfQpkaWZmIC0tZ2l0IGEvbmV0L3Jvc2Uvcm9zZV9vdXQuYyBiL25ldC9yb3NlL3Jvc2Vfb3V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk2NWZmYwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yb3NlL3Jvc2Vfb3V0LmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgSm9uYXRoYW4gTmF5bG9yIEc0S0xYIChnNGtseEBnNGtseC5kZW1vbi5jby51aykKKyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bmV0L2F4MjUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPG5ldC9yb3NlLmg+CisKKy8qCisgKglUaGlzIHByb2NlZHVyZSBpcyBwYXNzZWQgYSBidWZmZXIgZGVzY3JpcHRvciBmb3IgYW4gaWZyYW1lLiBJdCBidWlsZHMKKyAqCXRoZSByZXN0IG9mIHRoZSBjb250cm9sIHBhcnQgb2YgdGhlIGZyYW1lIGFuZCB0aGVuIHdyaXRlcyBpdCBvdXQuCisgKi8KK3N0YXRpYyB2b2lkIHJvc2Vfc2VuZF9pZnJhbWUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByb3NlX3NvY2sgKnJvc2UgPSByb3NlX3NrKHNrKTsKKworCWlmIChza2IgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc2tiLT5kYXRhWzJdIHw9IChyb3NlLT52ciA8PCA1KSAmIDB4RTA7CisJc2tiLT5kYXRhWzJdIHw9IChyb3NlLT52cyA8PCAxKSAmIDB4MEU7CisKKwlyb3NlX3N0YXJ0X2lkbGV0aW1lcihzayk7CisKKwlyb3NlX3RyYW5zbWl0X2xpbmsoc2tiLCByb3NlLT5uZWlnaGJvdXIpOworfQorCit2b2lkIHJvc2Vfa2ljayhzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHJvc2Vfc29jayAqcm9zZSA9IHJvc2Vfc2soc2spOworCXN0cnVjdCBza19idWZmICpza2IsICpza2JuOworCXVuc2lnbmVkIHNob3J0IHN0YXJ0LCBlbmQ7CisKKwlpZiAocm9zZS0+c3RhdGUgIT0gUk9TRV9TVEFURV8zKQorCQlyZXR1cm47CisKKwlpZiAocm9zZS0+Y29uZGl0aW9uICYgUk9TRV9DT05EX1BFRVJfUlhfQlVTWSkKKwkJcmV0dXJuOworCisJaWYgKCFza2JfcGVlaygmc2stPnNrX3dyaXRlX3F1ZXVlKSkKKwkJcmV0dXJuOworCisJc3RhcnQgPSAoc2tiX3BlZWsoJnJvc2UtPmFja19xdWV1ZSkgPT0gTlVMTCkgPyByb3NlLT52YSA6IHJvc2UtPnZzOworCWVuZCAgID0gKHJvc2UtPnZhICsgc3lzY3RsX3Jvc2Vfd2luZG93X3NpemUpICUgUk9TRV9NT0RVTFVTOworCisJaWYgKHN0YXJ0ID09IGVuZCkKKwkJcmV0dXJuOworCisJcm9zZS0+dnMgPSBzdGFydDsKKworCS8qCisJICogVHJhbnNtaXQgZGF0YSB1bnRpbCBlaXRoZXIgd2UncmUgb3V0IG9mIGRhdGEgdG8gc2VuZCBvcgorCSAqIHRoZSB3aW5kb3cgaXMgZnVsbC4KKwkgKi8KKworCXNrYiAgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3dyaXRlX3F1ZXVlKTsKKworCWRvIHsKKwkJaWYgKChza2JuID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwkJCXNrYl9xdWV1ZV9oZWFkKCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYik7CisJCQlicmVhazsKKwkJfQorCisJCXNrYl9zZXRfb3duZXJfdyhza2JuLCBzayk7CisKKwkJLyoKKwkJICogVHJhbnNtaXQgdGhlIGZyYW1lIGNvcHkuCisJCSAqLworCQlyb3NlX3NlbmRfaWZyYW1lKHNrLCBza2JuKTsKKworCQlyb3NlLT52cyA9IChyb3NlLT52cyArIDEpICUgUk9TRV9NT0RVTFVTOworCisJCS8qCisJCSAqIFJlcXVldWUgdGhlIG9yaWdpbmFsIGRhdGEgZnJhbWUuCisJCSAqLworCQlza2JfcXVldWVfdGFpbCgmcm9zZS0+YWNrX3F1ZXVlLCBza2IpOworCisJfSB3aGlsZSAocm9zZS0+dnMgIT0gZW5kICYmCisJCSAoc2tiID0gc2tiX2RlcXVldWUoJnNrLT5za193cml0ZV9xdWV1ZSkpICE9IE5VTEwpOworCisJcm9zZS0+dmwgICAgICAgICA9IHJvc2UtPnZyOworCXJvc2UtPmNvbmRpdGlvbiAmPSB+Uk9TRV9DT05EX0FDS19QRU5ESU5HOworCisJcm9zZV9zdG9wX3RpbWVyKHNrKTsKK30KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYXJlIHRha2VuIGZyb20gcGFnZSAxNzAgb2YgdGhlIDd0aCBBUlJMIENvbXB1dGVyCisgKiBOZXR3b3JraW5nIENvbmZlcmVuY2UgcGFwZXIsIGFzIGlzIHRoZSB3aG9sZSBzdGF0ZSBtYWNoaW5lLgorICovCisKK3ZvaWQgcm9zZV9lbnF1aXJ5X3Jlc3BvbnNlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3Qgcm9zZV9zb2NrICpyb3NlID0gcm9zZV9zayhzayk7CisKKwlpZiAocm9zZS0+Y29uZGl0aW9uICYgUk9TRV9DT05EX09XTl9SWF9CVVNZKQorCQlyb3NlX3dyaXRlX2ludGVybmFsKHNrLCBST1NFX1JOUik7CisJZWxzZQorCQlyb3NlX3dyaXRlX2ludGVybmFsKHNrLCBST1NFX1JSKTsKKworCXJvc2UtPnZsICAgICAgICAgPSByb3NlLT52cjsKKwlyb3NlLT5jb25kaXRpb24gJj0gflJPU0VfQ09ORF9BQ0tfUEVORElORzsKKworCXJvc2Vfc3RvcF90aW1lcihzayk7Cit9CmRpZmYgLS1naXQgYS9uZXQvcm9zZS9yb3NlX3JvdXRlLmMgYi9uZXQvcm9zZS9yb3NlX3JvdXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY3M2ViYgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yb3NlL3Jvc2Vfcm91dGUuYwpAQCAtMCwwICsxLDEzNDMgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgSm9uYXRoYW4gTmF5bG9yIEc0S0xYIChnNGtseEBnNGtseC5kZW1vbi5jby51aykKKyAqIENvcHlyaWdodCAoQykgVGVycnkgRGF3c29uIFZLMktUSiAodGVycnlAYW5pbWF0cy5uZXQpCisgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPG5ldC9heDI1Lmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4JLyogRm9yIFRJT0NJTlEvT1VUUSAqLworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bmV0L3Jvc2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCitzdGF0aWMgdW5zaWduZWQgaW50IHJvc2VfbmVpZ2hfbm8gPSAxOworCitzdGF0aWMgc3RydWN0IHJvc2Vfbm9kZSAgKnJvc2Vfbm9kZV9saXN0Oworc3RhdGljIERFRklORV9TUElOTE9DSyhyb3NlX25vZGVfbGlzdF9sb2NrKTsKK3N0YXRpYyBzdHJ1Y3Qgcm9zZV9uZWlnaCAqcm9zZV9uZWlnaF9saXN0Oworc3RhdGljIERFRklORV9TUElOTE9DSyhyb3NlX25laWdoX2xpc3RfbG9jayk7CitzdGF0aWMgc3RydWN0IHJvc2Vfcm91dGUgKnJvc2Vfcm91dGVfbGlzdDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socm9zZV9yb3V0ZV9saXN0X2xvY2spOworCitzdHJ1Y3Qgcm9zZV9uZWlnaCAqcm9zZV9sb29wYmFja19uZWlnaDsKKworc3RhdGljIHZvaWQgcm9zZV9yZW1vdmVfbmVpZ2goc3RydWN0IHJvc2VfbmVpZ2ggKik7CisKKy8qCisgKglBZGQgYSBuZXcgcm91dGUgdG8gYSBub2RlLCBhbmQgaW4gdGhlIHByb2Nlc3MgYWRkIHRoZSBub2RlIGFuZCB0aGUKKyAqCW5laWdoYm91ciBpZiBpdCBpcyBuZXcuCisgKi8KK3N0YXRpYyBpbnQgcm9zZV9hZGRfbm9kZShzdHJ1Y3Qgcm9zZV9yb3V0ZV9zdHJ1Y3QgKnJvc2Vfcm91dGUsCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgcm9zZV9ub2RlICAqcm9zZV9ub2RlLCAqcm9zZV90bXBuLCAqcm9zZV90bXBwOworCXN0cnVjdCByb3NlX25laWdoICpyb3NlX25laWdoOworCWludCBpLCByZXMgPSAwOworCisJc3Bpbl9sb2NrX2JoKCZyb3NlX25vZGVfbGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnJvc2VfbmVpZ2hfbGlzdF9sb2NrKTsKKworCXJvc2Vfbm9kZSA9IHJvc2Vfbm9kZV9saXN0OworCXdoaWxlIChyb3NlX25vZGUgIT0gTlVMTCkgeworCQlpZiAoKHJvc2Vfbm9kZS0+bWFzayA9PSByb3NlX3JvdXRlLT5tYXNrKSAmJgorCQkgICAgKHJvc2VjbXBtKCZyb3NlX3JvdXRlLT5hZGRyZXNzLCAmcm9zZV9ub2RlLT5hZGRyZXNzLAorCQkgICAgICAgICAgICAgIHJvc2Vfcm91dGUtPm1hc2spID09IDApKQorCQkJYnJlYWs7CisJCXJvc2Vfbm9kZSA9IHJvc2Vfbm9kZS0+bmV4dDsKKwl9CisKKwlpZiAocm9zZV9ub2RlICE9IE5VTEwgJiYgcm9zZV9ub2RlLT5sb29wYmFjaykgeworCQlyZXMgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlyb3NlX25laWdoID0gcm9zZV9uZWlnaF9saXN0OworCXdoaWxlIChyb3NlX25laWdoICE9IE5VTEwpIHsKKwkJaWYgKGF4MjVjbXAoJnJvc2Vfcm91dGUtPm5laWdoYm91ciwgJnJvc2VfbmVpZ2gtPmNhbGxzaWduKSA9PSAwCisJCSAgICAmJiByb3NlX25laWdoLT5kZXYgPT0gZGV2KQorCQkJYnJlYWs7CisJCXJvc2VfbmVpZ2ggPSByb3NlX25laWdoLT5uZXh0OworCX0KKworCWlmIChyb3NlX25laWdoID09IE5VTEwpIHsKKwkJcm9zZV9uZWlnaCA9IGttYWxsb2Moc2l6ZW9mKCpyb3NlX25laWdoKSwgR0ZQX0FUT01JQyk7CisJCWlmIChyb3NlX25laWdoID09IE5VTEwpIHsKKwkJCXJlcyA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXJvc2VfbmVpZ2gtPmNhbGxzaWduICA9IHJvc2Vfcm91dGUtPm5laWdoYm91cjsKKwkJcm9zZV9uZWlnaC0+ZGlnaXBlYXQgID0gTlVMTDsKKwkJcm9zZV9uZWlnaC0+YXgyNSAgICAgID0gTlVMTDsKKwkJcm9zZV9uZWlnaC0+ZGV2ICAgICAgID0gZGV2OworCQlyb3NlX25laWdoLT5jb3VudCAgICAgPSAwOworCQlyb3NlX25laWdoLT51c2UgICAgICAgPSAwOworCQlyb3NlX25laWdoLT5kY2VfbW9kZSAgPSAwOworCQlyb3NlX25laWdoLT5sb29wYmFjayAgPSAwOworCQlyb3NlX25laWdoLT5udW1iZXIgICAgPSByb3NlX25laWdoX25vKys7CisJCXJvc2VfbmVpZ2gtPnJlc3RhcnRlZCA9IDA7CisKKwkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcm9zZV9uZWlnaC0+cXVldWUpOworCisJCWluaXRfdGltZXIoJnJvc2VfbmVpZ2gtPmZ0aW1lcik7CisJCWluaXRfdGltZXIoJnJvc2VfbmVpZ2gtPnQwdGltZXIpOworCisJCWlmIChyb3NlX3JvdXRlLT5uZGlnaXMgIT0gMCkgeworCQkJaWYgKChyb3NlX25laWdoLT5kaWdpcGVhdCA9IGttYWxsb2Moc2l6ZW9mKGF4MjVfZGlnaSksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCQkJa2ZyZWUocm9zZV9uZWlnaCk7CisJCQkJcmVzID0gLUVOT01FTTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJcm9zZV9uZWlnaC0+ZGlnaXBlYXQtPm5kaWdpICAgICAgPSByb3NlX3JvdXRlLT5uZGlnaXM7CisJCQlyb3NlX25laWdoLT5kaWdpcGVhdC0+bGFzdHJlcGVhdCA9IC0xOworCisJCQlmb3IgKGkgPSAwOyBpIDwgcm9zZV9yb3V0ZS0+bmRpZ2lzOyBpKyspIHsKKwkJCQlyb3NlX25laWdoLT5kaWdpcGVhdC0+Y2FsbHNbaV0gICAgPQorCQkJCQlyb3NlX3JvdXRlLT5kaWdpcGVhdGVyc1tpXTsKKwkJCQlyb3NlX25laWdoLT5kaWdpcGVhdC0+cmVwZWF0ZWRbaV0gPSAwOworCQkJfQorCQl9CisKKwkJcm9zZV9uZWlnaC0+bmV4dCA9IHJvc2VfbmVpZ2hfbGlzdDsKKwkJcm9zZV9uZWlnaF9saXN0ICA9IHJvc2VfbmVpZ2g7CisJfQorCisJLyoKKwkgKiBUaGlzIGlzIGEgbmV3IG5vZGUgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgbGlzdC4gRmluZCB3aGVyZSBpdCBuZWVkcworCSAqIHRvIGJlIGluc2VydGVkIGludG8gdGhlIGxpc3QsIGFuZCBpbnNlcnQgaXQuIFdlIHdhbnQgdG8gYmUgc3VyZQorCSAqIHRvIG9yZGVyIHRoZSBsaXN0IGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgbWFzayBzaXplIHRvIGVuc3VyZSB0aGF0CisJICogbGF0ZXIgd2hlbiB3ZSBhcmUgc2VhcmNoaW5nIHRoaXMgbGlzdCB0aGUgZmlyc3QgbWF0Y2ggd2lsbCBiZSB0aGUKKwkgKiBiZXN0IG1hdGNoLgorCSAqLworCWlmIChyb3NlX25vZGUgPT0gTlVMTCkgeworCQlyb3NlX3RtcG4gPSByb3NlX25vZGVfbGlzdDsKKwkJcm9zZV90bXBwID0gTlVMTDsKKworCQl3aGlsZSAocm9zZV90bXBuICE9IE5VTEwpIHsKKwkJCWlmIChyb3NlX3RtcG4tPm1hc2sgPiByb3NlX3JvdXRlLT5tYXNrKSB7CisJCQkJcm9zZV90bXBwID0gcm9zZV90bXBuOworCQkJCXJvc2VfdG1wbiA9IHJvc2VfdG1wbi0+bmV4dDsKKwkJCX0gZWxzZSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKiBjcmVhdGUgbmV3IG5vZGUgKi8KKwkJcm9zZV9ub2RlID0ga21hbGxvYyhzaXplb2YoKnJvc2Vfbm9kZSksIEdGUF9BVE9NSUMpOworCQlpZiAocm9zZV9ub2RlID09IE5VTEwpIHsKKwkJCXJlcyA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXJvc2Vfbm9kZS0+YWRkcmVzcyAgICAgID0gcm9zZV9yb3V0ZS0+YWRkcmVzczsKKwkJcm9zZV9ub2RlLT5tYXNrICAgICAgICAgPSByb3NlX3JvdXRlLT5tYXNrOworCQlyb3NlX25vZGUtPmNvdW50ICAgICAgICA9IDE7CisJCXJvc2Vfbm9kZS0+bG9vcGJhY2sgICAgID0gMDsKKwkJcm9zZV9ub2RlLT5uZWlnaGJvdXJbMF0gPSByb3NlX25laWdoOworCisJCWlmIChyb3NlX3RtcG4gPT0gTlVMTCkgeworCQkJaWYgKHJvc2VfdG1wcCA9PSBOVUxMKSB7CS8qIEVtcHR5IGxpc3QgKi8KKwkJCQlyb3NlX25vZGVfbGlzdCAgPSByb3NlX25vZGU7CisJCQkJcm9zZV9ub2RlLT5uZXh0ID0gTlVMTDsKKwkJCX0gZWxzZSB7CisJCQkJcm9zZV90bXBwLT5uZXh0ID0gcm9zZV9ub2RlOworCQkJCXJvc2Vfbm9kZS0+bmV4dCA9IE5VTEw7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAocm9zZV90bXBwID09IE5VTEwpIHsJLyogMXN0IG5vZGUgKi8KKwkJCQlyb3NlX25vZGUtPm5leHQgPSByb3NlX25vZGVfbGlzdDsKKwkJCQlyb3NlX25vZGVfbGlzdCAgPSByb3NlX25vZGU7CisJCQl9IGVsc2UgeworCQkJCXJvc2VfdG1wcC0+bmV4dCA9IHJvc2Vfbm9kZTsKKwkJCQlyb3NlX25vZGUtPm5leHQgPSByb3NlX3RtcG47CisJCQl9CisJCX0KKwkJcm9zZV9uZWlnaC0+Y291bnQrKzsKKworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBXZSBoYXZlIHNwYWNlLCBzbG90IGl0IGluICovCisJaWYgKHJvc2Vfbm9kZS0+Y291bnQgPCAzKSB7CisJCXJvc2Vfbm9kZS0+bmVpZ2hib3VyW3Jvc2Vfbm9kZS0+Y291bnRdID0gcm9zZV9uZWlnaDsKKwkJcm9zZV9ub2RlLT5jb3VudCsrOworCQlyb3NlX25laWdoLT5jb3VudCsrOworCX0KKworb3V0OgorCXNwaW5fdW5sb2NrX2JoKCZyb3NlX25laWdoX2xpc3RfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnJvc2Vfbm9kZV9saXN0X2xvY2spOworCisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqIENhbGxlciBpcyBob2xkaW5nIHJvc2Vfbm9kZV9saXN0X2xvY2suCisgKi8KK3N0YXRpYyB2b2lkIHJvc2VfcmVtb3ZlX25vZGUoc3RydWN0IHJvc2Vfbm9kZSAqcm9zZV9ub2RlKQoreworCXN0cnVjdCByb3NlX25vZGUgKnM7CisKKwlpZiAoKHMgPSByb3NlX25vZGVfbGlzdCkgPT0gcm9zZV9ub2RlKSB7CisJCXJvc2Vfbm9kZV9saXN0ID0gcm9zZV9ub2RlLT5uZXh0OworCQlrZnJlZShyb3NlX25vZGUpOworCQlyZXR1cm47CisJfQorCisJd2hpbGUgKHMgIT0gTlVMTCAmJiBzLT5uZXh0ICE9IE5VTEwpIHsKKwkJaWYgKHMtPm5leHQgPT0gcm9zZV9ub2RlKSB7CisJCQlzLT5uZXh0ID0gcm9zZV9ub2RlLT5uZXh0OworCQkJa2ZyZWUocm9zZV9ub2RlKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXMgPSBzLT5uZXh0OworCX0KK30KKworLyoKKyAqIENhbGxlciBpcyBob2xkaW5nIHJvc2VfbmVpZ2hfbGlzdF9sb2NrLgorICovCitzdGF0aWMgdm9pZCByb3NlX3JlbW92ZV9uZWlnaChzdHJ1Y3Qgcm9zZV9uZWlnaCAqcm9zZV9uZWlnaCkKK3sKKwlzdHJ1Y3Qgcm9zZV9uZWlnaCAqczsKKworCXJvc2Vfc3RvcF9mdGltZXIocm9zZV9uZWlnaCk7CisJcm9zZV9zdG9wX3QwdGltZXIocm9zZV9uZWlnaCk7CisKKwlza2JfcXVldWVfcHVyZ2UoJnJvc2VfbmVpZ2gtPnF1ZXVlKTsKKworCXNwaW5fbG9ja19iaCgmcm9zZV9uZWlnaF9saXN0X2xvY2spOworCisJaWYgKChzID0gcm9zZV9uZWlnaF9saXN0KSA9PSByb3NlX25laWdoKSB7CisJCXJvc2VfbmVpZ2hfbGlzdCA9IHJvc2VfbmVpZ2gtPm5leHQ7CisJCXNwaW5fdW5sb2NrX2JoKCZyb3NlX25laWdoX2xpc3RfbG9jayk7CisJCWlmIChyb3NlX25laWdoLT5kaWdpcGVhdCAhPSBOVUxMKQorCQkJa2ZyZWUocm9zZV9uZWlnaC0+ZGlnaXBlYXQpOworCQlrZnJlZShyb3NlX25laWdoKTsKKwkJcmV0dXJuOworCX0KKworCXdoaWxlIChzICE9IE5VTEwgJiYgcy0+bmV4dCAhPSBOVUxMKSB7CisJCWlmIChzLT5uZXh0ID09IHJvc2VfbmVpZ2gpIHsKKwkJCXMtPm5leHQgPSByb3NlX25laWdoLT5uZXh0OworCQkJc3Bpbl91bmxvY2tfYmgoJnJvc2VfbmVpZ2hfbGlzdF9sb2NrKTsKKwkJCWlmIChyb3NlX25laWdoLT5kaWdpcGVhdCAhPSBOVUxMKQorCQkJCWtmcmVlKHJvc2VfbmVpZ2gtPmRpZ2lwZWF0KTsKKwkJCWtmcmVlKHJvc2VfbmVpZ2gpOworCQkJcmV0dXJuOworCQl9CisKKwkJcyA9IHMtPm5leHQ7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZyb3NlX25laWdoX2xpc3RfbG9jayk7Cit9CisKKy8qCisgKiBDYWxsZXIgaXMgaG9sZGluZyByb3NlX3JvdXRlX2xpc3RfbG9jay4KKyAqLworc3RhdGljIHZvaWQgcm9zZV9yZW1vdmVfcm91dGUoc3RydWN0IHJvc2Vfcm91dGUgKnJvc2Vfcm91dGUpCit7CisJc3RydWN0IHJvc2Vfcm91dGUgKnM7CisKKwlpZiAocm9zZV9yb3V0ZS0+bmVpZ2gxICE9IE5VTEwpCisJCXJvc2Vfcm91dGUtPm5laWdoMS0+dXNlLS07CisKKwlpZiAocm9zZV9yb3V0ZS0+bmVpZ2gyICE9IE5VTEwpCisJCXJvc2Vfcm91dGUtPm5laWdoMi0+dXNlLS07CisKKwlpZiAoKHMgPSByb3NlX3JvdXRlX2xpc3QpID09IHJvc2Vfcm91dGUpIHsKKwkJcm9zZV9yb3V0ZV9saXN0ID0gcm9zZV9yb3V0ZS0+bmV4dDsKKwkJa2ZyZWUocm9zZV9yb3V0ZSk7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAocyAhPSBOVUxMICYmIHMtPm5leHQgIT0gTlVMTCkgeworCQlpZiAocy0+bmV4dCA9PSByb3NlX3JvdXRlKSB7CisJCQlzLT5uZXh0ID0gcm9zZV9yb3V0ZS0+bmV4dDsKKwkJCWtmcmVlKHJvc2Vfcm91dGUpOworCQkJcmV0dXJuOworCQl9CisKKwkJcyA9IHMtPm5leHQ7CisJfQorfQorCisvKgorICoJIkRlbGV0ZSIgYSBub2RlLiBTdHJpY3RseSBzcGVha2luZyByZW1vdmUgYSByb3V0ZSB0byBhIG5vZGUuIFRoZSBub2RlCisgKglpcyBvbmx5IGRlbGV0ZWQgaWYgbm8gcm91dGVzIGFyZSBsZWZ0IHRvIGl0LgorICovCitzdGF0aWMgaW50IHJvc2VfZGVsX25vZGUoc3RydWN0IHJvc2Vfcm91dGVfc3RydWN0ICpyb3NlX3JvdXRlLAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJvc2Vfbm9kZSAgKnJvc2Vfbm9kZTsKKwlzdHJ1Y3Qgcm9zZV9uZWlnaCAqcm9zZV9uZWlnaDsKKwlpbnQgaSwgZXJyID0gMDsKKworCXNwaW5fbG9ja19iaCgmcm9zZV9ub2RlX2xpc3RfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZyb3NlX25laWdoX2xpc3RfbG9jayk7CisKKwlyb3NlX25vZGUgPSByb3NlX25vZGVfbGlzdDsKKwl3aGlsZSAocm9zZV9ub2RlICE9IE5VTEwpIHsKKwkJaWYgKChyb3NlX25vZGUtPm1hc2sgPT0gcm9zZV9yb3V0ZS0+bWFzaykgJiYKKwkJICAgIChyb3NlY21wbSgmcm9zZV9yb3V0ZS0+YWRkcmVzcywgJnJvc2Vfbm9kZS0+YWRkcmVzcywKKwkJICAgICAgICAgICAgICByb3NlX3JvdXRlLT5tYXNrKSA9PSAwKSkKKwkJCWJyZWFrOworCQlyb3NlX25vZGUgPSByb3NlX25vZGUtPm5leHQ7CisJfQorCisJaWYgKHJvc2Vfbm9kZSA9PSBOVUxMIHx8IHJvc2Vfbm9kZS0+bG9vcGJhY2spIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJcm9zZV9uZWlnaCA9IHJvc2VfbmVpZ2hfbGlzdDsKKwl3aGlsZSAocm9zZV9uZWlnaCAhPSBOVUxMKSB7CisJCWlmIChheDI1Y21wKCZyb3NlX3JvdXRlLT5uZWlnaGJvdXIsICZyb3NlX25laWdoLT5jYWxsc2lnbikgPT0gMAorCQkgICAgJiYgcm9zZV9uZWlnaC0+ZGV2ID09IGRldikKKwkJCWJyZWFrOworCQlyb3NlX25laWdoID0gcm9zZV9uZWlnaC0+bmV4dDsKKwl9CisKKwlpZiAocm9zZV9uZWlnaCA9PSBOVUxMKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCByb3NlX25vZGUtPmNvdW50OyBpKyspIHsKKwkJaWYgKHJvc2Vfbm9kZS0+bmVpZ2hib3VyW2ldID09IHJvc2VfbmVpZ2gpIHsKKwkJCXJvc2VfbmVpZ2gtPmNvdW50LS07CisKKwkJCWlmIChyb3NlX25laWdoLT5jb3VudCA9PSAwICYmIHJvc2VfbmVpZ2gtPnVzZSA9PSAwKQorCQkJCXJvc2VfcmVtb3ZlX25laWdoKHJvc2VfbmVpZ2gpOworCisJCQlyb3NlX25vZGUtPmNvdW50LS07CisKKwkJCWlmIChyb3NlX25vZGUtPmNvdW50ID09IDApIHsKKwkJCQlyb3NlX3JlbW92ZV9ub2RlKHJvc2Vfbm9kZSk7CisJCQl9IGVsc2UgeworCQkJCXN3aXRjaCAoaSkgeworCQkJCWNhc2UgMDoKKwkJCQkJcm9zZV9ub2RlLT5uZWlnaGJvdXJbMF0gPQorCQkJCQkJcm9zZV9ub2RlLT5uZWlnaGJvdXJbMV07CisJCQkJY2FzZSAxOgorCQkJCQlyb3NlX25vZGUtPm5laWdoYm91clsxXSA9CisJCQkJCQlyb3NlX25vZGUtPm5laWdoYm91clsyXTsKKwkJCQljYXNlIDI6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWVyciA9IC1FSU5WQUw7CisKK291dDoKKwlzcGluX3VubG9ja19iaCgmcm9zZV9uZWlnaF9saXN0X2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZyb3NlX25vZGVfbGlzdF9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKglBZGQgdGhlIGxvb3BiYWNrIG5laWdoYm91ci4KKyAqLworaW50IHJvc2VfYWRkX2xvb3BiYWNrX25laWdoKHZvaWQpCit7CisJaWYgKChyb3NlX2xvb3BiYWNrX25laWdoID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJvc2VfbmVpZ2gpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyb3NlX2xvb3BiYWNrX25laWdoLT5jYWxsc2lnbiAgPSBudWxsX2F4MjVfYWRkcmVzczsKKwlyb3NlX2xvb3BiYWNrX25laWdoLT5kaWdpcGVhdCAgPSBOVUxMOworCXJvc2VfbG9vcGJhY2tfbmVpZ2gtPmF4MjUgICAgICA9IE5VTEw7CisJcm9zZV9sb29wYmFja19uZWlnaC0+ZGV2ICAgICAgID0gTlVMTDsKKwlyb3NlX2xvb3BiYWNrX25laWdoLT5jb3VudCAgICAgPSAwOworCXJvc2VfbG9vcGJhY2tfbmVpZ2gtPnVzZSAgICAgICA9IDA7CisJcm9zZV9sb29wYmFja19uZWlnaC0+ZGNlX21vZGUgID0gMTsKKwlyb3NlX2xvb3BiYWNrX25laWdoLT5sb29wYmFjayAgPSAxOworCXJvc2VfbG9vcGJhY2tfbmVpZ2gtPm51bWJlciAgICA9IHJvc2VfbmVpZ2hfbm8rKzsKKwlyb3NlX2xvb3BiYWNrX25laWdoLT5yZXN0YXJ0ZWQgPSAxOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcm9zZV9sb29wYmFja19uZWlnaC0+cXVldWUpOworCisJaW5pdF90aW1lcigmcm9zZV9sb29wYmFja19uZWlnaC0+ZnRpbWVyKTsKKwlpbml0X3RpbWVyKCZyb3NlX2xvb3BiYWNrX25laWdoLT50MHRpbWVyKTsKKworCXNwaW5fbG9ja19iaCgmcm9zZV9uZWlnaF9saXN0X2xvY2spOworCXJvc2VfbG9vcGJhY2tfbmVpZ2gtPm5leHQgPSByb3NlX25laWdoX2xpc3Q7CisJcm9zZV9uZWlnaF9saXN0ICAgICAgICAgICA9IHJvc2VfbG9vcGJhY2tfbmVpZ2g7CisJc3Bpbl91bmxvY2tfYmgoJnJvc2VfbmVpZ2hfbGlzdF9sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKgorICoJQWRkIGEgbG9vcGJhY2sgbm9kZS4KKyAqLworaW50IHJvc2VfYWRkX2xvb3BiYWNrX25vZGUocm9zZV9hZGRyZXNzICphZGRyZXNzKQoreworCXN0cnVjdCByb3NlX25vZGUgKnJvc2Vfbm9kZTsKKwl1bnNpZ25lZCBpbnQgZXJyID0gMDsKKworCXNwaW5fbG9ja19iaCgmcm9zZV9ub2RlX2xpc3RfbG9jayk7CisKKwlyb3NlX25vZGUgPSByb3NlX25vZGVfbGlzdDsKKwl3aGlsZSAocm9zZV9ub2RlICE9IE5VTEwpIHsKKwkJaWYgKChyb3NlX25vZGUtPm1hc2sgPT0gMTApICYmCisJCSAgICAgKHJvc2VjbXBtKGFkZHJlc3MsICZyb3NlX25vZGUtPmFkZHJlc3MsIDEwKSA9PSAwKSAmJgorCQkgICAgIHJvc2Vfbm9kZS0+bG9vcGJhY2spCisJCQlicmVhazsKKwkJcm9zZV9ub2RlID0gcm9zZV9ub2RlLT5uZXh0OworCX0KKworCWlmIChyb3NlX25vZGUgIT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlpZiAoKHJvc2Vfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKCpyb3NlX25vZGUpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlyb3NlX25vZGUtPmFkZHJlc3MgICAgICA9ICphZGRyZXNzOworCXJvc2Vfbm9kZS0+bWFzayAgICAgICAgID0gMTA7CisJcm9zZV9ub2RlLT5jb3VudCAgICAgICAgPSAxOworCXJvc2Vfbm9kZS0+bG9vcGJhY2sgICAgID0gMTsKKwlyb3NlX25vZGUtPm5laWdoYm91clswXSA9IHJvc2VfbG9vcGJhY2tfbmVpZ2g7CisKKwkvKiBJbnNlcnQgYXQgdGhlIGhlYWQgb2YgbGlzdC4gQWRkcmVzcyBpcyBhbHdheXMgbWFzaz0xMCAqLworCXJvc2Vfbm9kZS0+bmV4dCA9IHJvc2Vfbm9kZV9saXN0OworCXJvc2Vfbm9kZV9saXN0ICA9IHJvc2Vfbm9kZTsKKworCXJvc2VfbG9vcGJhY2tfbmVpZ2gtPmNvdW50Kys7CisKK291dDoKKwlzcGluX3VubG9ja19iaCgmcm9zZV9ub2RlX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCURlbGV0ZSBhIGxvb3BiYWNrIG5vZGUuCisgKi8KK3ZvaWQgcm9zZV9kZWxfbG9vcGJhY2tfbm9kZShyb3NlX2FkZHJlc3MgKmFkZHJlc3MpCit7CisJc3RydWN0IHJvc2Vfbm9kZSAqcm9zZV9ub2RlOworCisJc3Bpbl9sb2NrX2JoKCZyb3NlX25vZGVfbGlzdF9sb2NrKTsKKworCXJvc2Vfbm9kZSA9IHJvc2Vfbm9kZV9saXN0OworCXdoaWxlIChyb3NlX25vZGUgIT0gTlVMTCkgeworCQlpZiAoKHJvc2Vfbm9kZS0+bWFzayA9PSAxMCkgJiYKKwkJICAgIChyb3NlY21wbShhZGRyZXNzLCAmcm9zZV9ub2RlLT5hZGRyZXNzLCAxMCkgPT0gMCkgJiYKKwkJICAgIHJvc2Vfbm9kZS0+bG9vcGJhY2spCisJCQlicmVhazsKKwkJcm9zZV9ub2RlID0gcm9zZV9ub2RlLT5uZXh0OworCX0KKworCWlmIChyb3NlX25vZGUgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlyb3NlX3JlbW92ZV9ub2RlKHJvc2Vfbm9kZSk7CisKKwlyb3NlX2xvb3BiYWNrX25laWdoLT5jb3VudC0tOworCitvdXQ6CisJc3Bpbl91bmxvY2tfYmgoJnJvc2Vfbm9kZV9saXN0X2xvY2spOworfQorCisvKgorICoJQSBkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZC4gUmVtb3ZlIGl0cyByb3V0ZXMgYW5kIG5laWdoYm91cnMuCisgKi8KK3ZvaWQgcm9zZV9ydF9kZXZpY2VfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByb3NlX25laWdoICpzLCAqcm9zZV9uZWlnaDsKKwlzdHJ1Y3Qgcm9zZV9ub2RlICAqdCwgKnJvc2Vfbm9kZTsKKwlpbnQgaTsKKworCXNwaW5fbG9ja19iaCgmcm9zZV9ub2RlX2xpc3RfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZyb3NlX25laWdoX2xpc3RfbG9jayk7CisJcm9zZV9uZWlnaCA9IHJvc2VfbmVpZ2hfbGlzdDsKKwl3aGlsZSAocm9zZV9uZWlnaCAhPSBOVUxMKSB7CisJCXMgICAgICAgICAgPSByb3NlX25laWdoOworCQlyb3NlX25laWdoID0gcm9zZV9uZWlnaC0+bmV4dDsKKworCQlpZiAocy0+ZGV2ICE9IGRldikKKwkJCWNvbnRpbnVlOworCisJCXJvc2Vfbm9kZSA9IHJvc2Vfbm9kZV9saXN0OworCisJCXdoaWxlIChyb3NlX25vZGUgIT0gTlVMTCkgeworCQkJdCAgICAgICAgID0gcm9zZV9ub2RlOworCQkJcm9zZV9ub2RlID0gcm9zZV9ub2RlLT5uZXh0OworCisJCQlmb3IgKGkgPSAwOyBpIDwgdC0+Y291bnQ7IGkrKykgeworCQkJCWlmICh0LT5uZWlnaGJvdXJbaV0gIT0gcykKKwkJCQkJY29udGludWU7CisKKwkJCQl0LT5jb3VudC0tOworCisJCQkJc3dpdGNoIChpKSB7CisJCQkJY2FzZSAwOgorCQkJCQl0LT5uZWlnaGJvdXJbMF0gPSB0LT5uZWlnaGJvdXJbMV07CisJCQkJY2FzZSAxOgorCQkJCQl0LT5uZWlnaGJvdXJbMV0gPSB0LT5uZWlnaGJvdXJbMl07CisJCQkJY2FzZSAyOgorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmICh0LT5jb3VudCA8PSAwKQorCQkJCXJvc2VfcmVtb3ZlX25vZGUodCk7CisJCX0KKworCQlyb3NlX3JlbW92ZV9uZWlnaChzKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnJvc2VfbmVpZ2hfbGlzdF9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmcm9zZV9ub2RlX2xpc3RfbG9jayk7Cit9CisKKyNpZiAwIC8qIEN1cnJlbnRseSB1bnVzZWQgKi8KKy8qCisgKglBIGRldmljZSBoYXMgYmVlbiByZW1vdmVkLiBSZW1vdmUgaXRzIGxpbmtzLgorICovCit2b2lkIHJvc2Vfcm91dGVfZGV2aWNlX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgcm9zZV9yb3V0ZSAqcywgKnJvc2Vfcm91dGU7CisKKwlzcGluX2xvY2tfYmgoJnJvc2Vfcm91dGVfbGlzdF9sb2NrKTsKKwlyb3NlX3JvdXRlID0gcm9zZV9yb3V0ZV9saXN0OworCXdoaWxlIChyb3NlX3JvdXRlICE9IE5VTEwpIHsKKwkJcyAgICAgICAgICA9IHJvc2Vfcm91dGU7CisJCXJvc2Vfcm91dGUgPSByb3NlX3JvdXRlLT5uZXh0OworCisJCWlmIChzLT5uZWlnaDEtPmRldiA9PSBkZXYgfHwgcy0+bmVpZ2gyLT5kZXYgPT0gZGV2KQorCQkJcm9zZV9yZW1vdmVfcm91dGUocyk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZyb3NlX3JvdXRlX2xpc3RfbG9jayk7Cit9CisjZW5kaWYKKworLyoKKyAqCUNsZWFyIGFsbCBub2RlcyBhbmQgbmVpZ2hib3VycyBvdXQsIGV4Y2VwdCBmb3IgbmVpZ2hib3VycyB3aXRoCisgKglhY3RpdmUgY29ubmVjdGlvbnMgZ29pbmcgdGhyb3VnaCB0aGVtLgorICogIERvIG5vdCBjbGVhciBsb29wYmFjayBuZWlnaGJvdXIgYW5kIG5vZGVzLgorICovCitzdGF0aWMgaW50IHJvc2VfY2xlYXJfcm91dGVzKHZvaWQpCit7CisJc3RydWN0IHJvc2VfbmVpZ2ggKnMsICpyb3NlX25laWdoOworCXN0cnVjdCByb3NlX25vZGUgICp0LCAqcm9zZV9ub2RlOworCisJc3Bpbl9sb2NrX2JoKCZyb3NlX25vZGVfbGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnJvc2VfbmVpZ2hfbGlzdF9sb2NrKTsKKworCXJvc2VfbmVpZ2ggPSByb3NlX25laWdoX2xpc3Q7CisJcm9zZV9ub2RlICA9IHJvc2Vfbm9kZV9saXN0OworCisJd2hpbGUgKHJvc2Vfbm9kZSAhPSBOVUxMKSB7CisJCXQgICAgICAgICA9IHJvc2Vfbm9kZTsKKwkJcm9zZV9ub2RlID0gcm9zZV9ub2RlLT5uZXh0OworCQlpZiAoIXQtPmxvb3BiYWNrKQorCQkJcm9zZV9yZW1vdmVfbm9kZSh0KTsKKwl9CisKKwl3aGlsZSAocm9zZV9uZWlnaCAhPSBOVUxMKSB7CisJCXMgICAgICAgICAgPSByb3NlX25laWdoOworCQlyb3NlX25laWdoID0gcm9zZV9uZWlnaC0+bmV4dDsKKworCQlpZiAocy0+dXNlID09IDAgJiYgIXMtPmxvb3BiYWNrKSB7CisJCQlzLT5jb3VudCA9IDA7CisJCQlyb3NlX3JlbW92ZV9uZWlnaChzKTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2JoKCZyb3NlX25laWdoX2xpc3RfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnJvc2Vfbm9kZV9saXN0X2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglDaGVjayB0aGF0IHRoZSBkZXZpY2UgZ2l2ZW4gaXMgYSB2YWxpZCBBWC4yNSBpbnRlcmZhY2UgdGhhdCBpcyAidXAiLgorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnJvc2VfYXgyNV9kZXZfZ2V0KGNoYXIgKmRldm5hbWUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCWlmICgoZGV2ID0gZGV2X2dldF9ieV9uYW1lKGRldm5hbWUpKSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICgoZGV2LT5mbGFncyAmIElGRl9VUCkgJiYgZGV2LT50eXBlID09IEFSUEhSRF9BWDI1KQorCQlyZXR1cm4gZGV2OworCisJZGV2X3B1dChkZXYpOworCXJldHVybiBOVUxMOworfQorCisvKgorICoJRmluZCB0aGUgZmlyc3QgYWN0aXZlIFJPU0UgZGV2aWNlLCB1c3VhbGx5ICJyb3NlMCIuCisgKi8KK3N0cnVjdCBuZXRfZGV2aWNlICpyb3NlX2Rldl9maXJzdCh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsICpmaXJzdCA9IE5VTEw7CisKKwlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOworCWZvciAoZGV2ID0gZGV2X2Jhc2U7IGRldiAhPSBOVUxMOyBkZXYgPSBkZXYtPm5leHQpIHsKKwkJaWYgKChkZXYtPmZsYWdzICYgSUZGX1VQKSAmJiBkZXYtPnR5cGUgPT0gQVJQSFJEX1JPU0UpCisJCQlpZiAoZmlyc3QgPT0gTlVMTCB8fCBzdHJuY21wKGRldi0+bmFtZSwgZmlyc3QtPm5hbWUsIDMpIDwgMCkKKwkJCQlmaXJzdCA9IGRldjsKKwl9CisJcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOworCisJcmV0dXJuIGZpcnN0OworfQorCisvKgorICoJRmluZCB0aGUgUk9TRSBkZXZpY2UgZm9yIHRoZSBnaXZlbiBhZGRyZXNzLgorICovCitzdHJ1Y3QgbmV0X2RldmljZSAqcm9zZV9kZXZfZ2V0KHJvc2VfYWRkcmVzcyAqYWRkcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKwlmb3IgKGRldiA9IGRldl9iYXNlOyBkZXYgIT0gTlVMTDsgZGV2ID0gZGV2LT5uZXh0KSB7CisJCWlmICgoZGV2LT5mbGFncyAmIElGRl9VUCkgJiYgZGV2LT50eXBlID09IEFSUEhSRF9ST1NFICYmIHJvc2VjbXAoYWRkciwgKHJvc2VfYWRkcmVzcyAqKWRldi0+ZGV2X2FkZHIpID09IDApIHsKKwkJCWRldl9ob2xkKGRldik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KK291dDoKKwlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7CisJcmV0dXJuIGRldjsKK30KKworc3RhdGljIGludCByb3NlX2Rldl9leGlzdHMocm9zZV9hZGRyZXNzICphZGRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOworCWZvciAoZGV2ID0gZGV2X2Jhc2U7IGRldiAhPSBOVUxMOyBkZXYgPSBkZXYtPm5leHQpIHsKKwkJaWYgKChkZXYtPmZsYWdzICYgSUZGX1VQKSAmJiBkZXYtPnR5cGUgPT0gQVJQSFJEX1JPU0UgJiYgcm9zZWNtcChhZGRyLCAocm9zZV9hZGRyZXNzICopZGV2LT5kZXZfYWRkcikgPT0gMCkKKwkJCWdvdG8gb3V0OworCX0KK291dDoKKwlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7CisJcmV0dXJuIGRldiAhPSBOVUxMOworfQorCisKKworCitzdHJ1Y3Qgcm9zZV9yb3V0ZSAqcm9zZV9yb3V0ZV9mcmVlX2xjaSh1bnNpZ25lZCBpbnQgbGNpLCBzdHJ1Y3Qgcm9zZV9uZWlnaCAqbmVpZ2gpCit7CisJc3RydWN0IHJvc2Vfcm91dGUgKnJvc2Vfcm91dGU7CisKKwlmb3IgKHJvc2Vfcm91dGUgPSByb3NlX3JvdXRlX2xpc3Q7IHJvc2Vfcm91dGUgIT0gTlVMTDsgcm9zZV9yb3V0ZSA9IHJvc2Vfcm91dGUtPm5leHQpCisJCWlmICgocm9zZV9yb3V0ZS0+bmVpZ2gxID09IG5laWdoICYmIHJvc2Vfcm91dGUtPmxjaTEgPT0gbGNpKSB8fAorCQkgICAgKHJvc2Vfcm91dGUtPm5laWdoMiA9PSBuZWlnaCAmJiByb3NlX3JvdXRlLT5sY2kyID09IGxjaSkpCisJCQlyZXR1cm4gcm9zZV9yb3V0ZTsKKworCXJldHVybiBOVUxMOworfQorCisvKgorICoJRmluZCBhIG5laWdoYm91ciBnaXZlbiBhIFJPU0UgYWRkcmVzcy4KKyAqLworc3RydWN0IHJvc2VfbmVpZ2ggKnJvc2VfZ2V0X25laWdoKHJvc2VfYWRkcmVzcyAqYWRkciwgdW5zaWduZWQgY2hhciAqY2F1c2UsCisJdW5zaWduZWQgY2hhciAqZGlhZ25vc3RpYykKK3sKKwlzdHJ1Y3Qgcm9zZV9uZWlnaCAqcmVzID0gTlVMTDsKKwlzdHJ1Y3Qgcm9zZV9ub2RlICpub2RlOworCWludCBmYWlsZWQgPSAwOworCWludCBpOworCisJc3Bpbl9sb2NrX2JoKCZyb3NlX25vZGVfbGlzdF9sb2NrKTsKKwlmb3IgKG5vZGUgPSByb3NlX25vZGVfbGlzdDsgbm9kZSAhPSBOVUxMOyBub2RlID0gbm9kZS0+bmV4dCkgeworCQlpZiAocm9zZWNtcG0oYWRkciwgJm5vZGUtPmFkZHJlc3MsIG5vZGUtPm1hc2spID09IDApIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBub2RlLT5jb3VudDsgaSsrKSB7CisJCQkJaWYgKCFyb3NlX2Z0aW1lcl9ydW5uaW5nKG5vZGUtPm5laWdoYm91cltpXSkpIHsKKwkJCQkJcmVzID0gbm9kZS0+bmVpZ2hib3VyW2ldOworCQkJCQlnb3RvIG91dDsKKwkJCQl9IGVsc2UKKwkJCQkJZmFpbGVkID0gMTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGZhaWxlZCkgeworCQkqY2F1c2UgICAgICA9IFJPU0VfT1VUX09GX09SREVSOworCQkqZGlhZ25vc3RpYyA9IDA7CisJfSBlbHNlIHsKKwkJKmNhdXNlICAgICAgPSBST1NFX05PVF9PQlRBSU5BQkxFOworCQkqZGlhZ25vc3RpYyA9IDA7CisJfQorCitvdXQ6CisJc3Bpbl91bmxvY2tfYmgoJnJvc2Vfbm9kZV9saXN0X2xvY2spOworCisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqCUhhbmRsZSB0aGUgaW9jdGxzIHRoYXQgY29udHJvbCB0aGUgcm91dGluZyBmdW5jdGlvbnMuCisgKi8KK2ludCByb3NlX3J0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IHJvc2Vfcm91dGVfc3RydWN0IHJvc2Vfcm91dGU7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgZXJyOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NBRERSVDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZyb3NlX3JvdXRlLCBhcmcsIHNpemVvZihzdHJ1Y3Qgcm9zZV9yb3V0ZV9zdHJ1Y3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoKGRldiA9IHJvc2VfYXgyNV9kZXZfZ2V0KHJvc2Vfcm91dGUuZGV2aWNlKSkgPT0gTlVMTCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAocm9zZV9kZXZfZXhpc3RzKCZyb3NlX3JvdXRlLmFkZHJlc3MpKSB7IC8qIENhbid0IGFkZCByb3V0ZXMgdG8gb3Vyc2VsZiAqLworCQkJZGV2X3B1dChkZXYpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKHJvc2Vfcm91dGUubWFzayA+IDEwKSAvKiBNYXNrIGNhbid0IGJlIG1vcmUgdGhhbiAxMCBkaWdpdHMgKi8KKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAocm9zZV9yb3V0ZS5uZGlnaXMgPiA4KSAvKiBObyBtb3JlIHRoYW4gOCBkaWdpcGVhdHMgKi8KKwkJCXJldHVybiAtRUlOVkFMOworCQllcnIgPSByb3NlX2FkZF9ub2RlKCZyb3NlX3JvdXRlLCBkZXYpOworCQlkZXZfcHV0KGRldik7CisJCXJldHVybiBlcnI7CisKKwljYXNlIFNJT0NERUxSVDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZyb3NlX3JvdXRlLCBhcmcsIHNpemVvZihzdHJ1Y3Qgcm9zZV9yb3V0ZV9zdHJ1Y3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoKGRldiA9IHJvc2VfYXgyNV9kZXZfZ2V0KHJvc2Vfcm91dGUuZGV2aWNlKSkgPT0gTlVMTCkKKwkJCXJldHVybiAtRUlOVkFMOworCQllcnIgPSByb3NlX2RlbF9ub2RlKCZyb3NlX3JvdXRlLCBkZXYpOworCQlkZXZfcHV0KGRldik7CisJCXJldHVybiBlcnI7CisKKwljYXNlIFNJT0NSU0NMUlJUOgorCQlyZXR1cm4gcm9zZV9jbGVhcl9yb3V0ZXMoKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByb3NlX2RlbF9yb3V0ZV9ieV9uZWlnaChzdHJ1Y3Qgcm9zZV9uZWlnaCAqcm9zZV9uZWlnaCkKK3sKKwlzdHJ1Y3Qgcm9zZV9yb3V0ZSAqcm9zZV9yb3V0ZSwgKnM7CisKKwlyb3NlX25laWdoLT5yZXN0YXJ0ZWQgPSAwOworCisJcm9zZV9zdG9wX3QwdGltZXIocm9zZV9uZWlnaCk7CisJcm9zZV9zdGFydF9mdGltZXIocm9zZV9uZWlnaCk7CisKKwlza2JfcXVldWVfcHVyZ2UoJnJvc2VfbmVpZ2gtPnF1ZXVlKTsKKworCXNwaW5fbG9ja19iaCgmcm9zZV9yb3V0ZV9saXN0X2xvY2spOworCisJcm9zZV9yb3V0ZSA9IHJvc2Vfcm91dGVfbGlzdDsKKworCXdoaWxlIChyb3NlX3JvdXRlICE9IE5VTEwpIHsKKwkJaWYgKChyb3NlX3JvdXRlLT5uZWlnaDEgPT0gcm9zZV9uZWlnaCAmJiByb3NlX3JvdXRlLT5uZWlnaDIgPT0gcm9zZV9uZWlnaCkgfHwKKwkJICAgIChyb3NlX3JvdXRlLT5uZWlnaDEgPT0gcm9zZV9uZWlnaCAmJiByb3NlX3JvdXRlLT5uZWlnaDIgPT0gTlVMTCkgICAgICAgfHwKKwkJICAgIChyb3NlX3JvdXRlLT5uZWlnaDIgPT0gcm9zZV9uZWlnaCAmJiByb3NlX3JvdXRlLT5uZWlnaDEgPT0gTlVMTCkpIHsKKwkJCXMgPSByb3NlX3JvdXRlLT5uZXh0OworCQkJcm9zZV9yZW1vdmVfcm91dGUocm9zZV9yb3V0ZSk7CisJCQlyb3NlX3JvdXRlID0gczsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHJvc2Vfcm91dGUtPm5laWdoMSA9PSByb3NlX25laWdoKSB7CisJCQlyb3NlX3JvdXRlLT5uZWlnaDEtPnVzZS0tOworCQkJcm9zZV9yb3V0ZS0+bmVpZ2gxID0gTlVMTDsKKwkJCXJvc2VfdHJhbnNtaXRfY2xlYXJfcmVxdWVzdChyb3NlX3JvdXRlLT5uZWlnaDIsIHJvc2Vfcm91dGUtPmxjaTIsIFJPU0VfT1VUX09GX09SREVSLCAwKTsKKwkJfQorCisJCWlmIChyb3NlX3JvdXRlLT5uZWlnaDIgPT0gcm9zZV9uZWlnaCkgeworCQkJcm9zZV9yb3V0ZS0+bmVpZ2gyLT51c2UtLTsKKwkJCXJvc2Vfcm91dGUtPm5laWdoMiA9IE5VTEw7CisJCQlyb3NlX3RyYW5zbWl0X2NsZWFyX3JlcXVlc3Qocm9zZV9yb3V0ZS0+bmVpZ2gxLCByb3NlX3JvdXRlLT5sY2kxLCBST1NFX09VVF9PRl9PUkRFUiwgMCk7CisJCX0KKworCQlyb3NlX3JvdXRlID0gcm9zZV9yb3V0ZS0+bmV4dDsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnJvc2Vfcm91dGVfbGlzdF9sb2NrKTsKK30KKworLyoKKyAqIAlBIGxldmVsIDIgbGluayBoYXMgdGltZWQgb3V0LCB0aGVyZWZvcmUgaXQgYXBwZWFycyB0byBiZSBhIHBvb3IgbGluaywKKyAqCXRoZW4gZG9uJ3QgdXNlIHRoYXQgbmVpZ2hib3VyIHVudGlsIGl0IGlzIHJlc2V0LiBCbG93IGF3YXkgYWxsIHRocm91Z2gKKyAqCXJvdXRlcyBhbmQgY29ubmVjdGlvbnMgdXNpbmcgdGhpcyByb3V0ZS4KKyAqLwordm9pZCByb3NlX2xpbmtfZmFpbGVkKGF4MjVfY2IgKmF4MjUsIGludCByZWFzb24pCit7CisJc3RydWN0IHJvc2VfbmVpZ2ggKnJvc2VfbmVpZ2g7CisKKwlzcGluX2xvY2tfYmgoJnJvc2VfbmVpZ2hfbGlzdF9sb2NrKTsKKwlyb3NlX25laWdoID0gcm9zZV9uZWlnaF9saXN0OworCXdoaWxlIChyb3NlX25laWdoICE9IE5VTEwpIHsKKwkJaWYgKHJvc2VfbmVpZ2gtPmF4MjUgPT0gYXgyNSkKKwkJCWJyZWFrOworCQlyb3NlX25laWdoID0gcm9zZV9uZWlnaC0+bmV4dDsKKwl9CisKKwlpZiAocm9zZV9uZWlnaCAhPSBOVUxMKSB7CisJCXJvc2VfbmVpZ2gtPmF4MjUgPSBOVUxMOworCisJCXJvc2VfZGVsX3JvdXRlX2J5X25laWdoKHJvc2VfbmVpZ2gpOworCQlyb3NlX2tpbGxfYnlfbmVpZ2gocm9zZV9uZWlnaCk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZyb3NlX25laWdoX2xpc3RfbG9jayk7Cit9CisKKy8qCisgKiAJQSBkZXZpY2UgaGFzIGJlZW4gImRvd25lZCIgcmVtb3ZlIGl0cyBsaW5rIHN0YXR1cy4gQmxvdyBhd2F5IGFsbAorICoJdGhyb3VnaCByb3V0ZXMgYW5kIGNvbm5lY3Rpb25zIHRoYXQgdXNlIHRoaXMgZGV2aWNlLgorICovCit2b2lkIHJvc2VfbGlua19kZXZpY2VfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByb3NlX25laWdoICpyb3NlX25laWdoOworCisJZm9yIChyb3NlX25laWdoID0gcm9zZV9uZWlnaF9saXN0OyByb3NlX25laWdoICE9IE5VTEw7IHJvc2VfbmVpZ2ggPSByb3NlX25laWdoLT5uZXh0KSB7CisJCWlmIChyb3NlX25laWdoLT5kZXYgPT0gZGV2KSB7CisJCQlyb3NlX2RlbF9yb3V0ZV9ieV9uZWlnaChyb3NlX25laWdoKTsKKwkJCXJvc2Vfa2lsbF9ieV9uZWlnaChyb3NlX25laWdoKTsKKwkJfQorCX0KK30KKworLyoKKyAqCVJvdXRlIGEgZnJhbWUgdG8gYW4gYXBwcm9wcmlhdGUgQVguMjUgY29ubmVjdGlvbi4KKyAqLworaW50IHJvc2Vfcm91dGVfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgYXgyNV9jYiAqYXgyNSkKK3sKKwlzdHJ1Y3Qgcm9zZV9uZWlnaCAqcm9zZV9uZWlnaCwgKm5ld19uZWlnaDsKKwlzdHJ1Y3Qgcm9zZV9yb3V0ZSAqcm9zZV9yb3V0ZTsKKwlzdHJ1Y3Qgcm9zZV9mYWNpbGl0aWVzX3N0cnVjdCBmYWNpbGl0aWVzOworCXJvc2VfYWRkcmVzcyAqc3JjX2FkZHIsICpkZXN0X2FkZHI7CisJc3RydWN0IHNvY2sgKnNrOworCXVuc2lnbmVkIHNob3J0IGZyYW1ldHlwZTsKKwl1bnNpZ25lZCBpbnQgbGNpLCBuZXdfbGNpOworCXVuc2lnbmVkIGNoYXIgY2F1c2UsIGRpYWdub3N0aWM7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgbGVuLCByZXMgPSAwOworCisjaWYgMAorCWlmIChjYWxsX2luX2ZpcmV3YWxsKFBGX1JPU0UsIHNrYi0+ZGV2LCBza2ItPmRhdGEsIE5VTEwsICZza2IpICE9IEZXX0FDQ0VQVCkKKwkJcmV0dXJuIHJlczsKKyNlbmRpZgorCisJZnJhbWV0eXBlID0gc2tiLT5kYXRhWzJdOworCWxjaSA9ICgoc2tiLT5kYXRhWzBdIDw8IDgpICYgMHhGMDApICsgKChza2ItPmRhdGFbMV0gPDwgMCkgJiAweDBGRik7CisJc3JjX2FkZHIgID0gKHJvc2VfYWRkcmVzcyAqKShza2ItPmRhdGEgKyA5KTsKKwlkZXN0X2FkZHIgPSAocm9zZV9hZGRyZXNzICopKHNrYi0+ZGF0YSArIDQpOworCisJc3Bpbl9sb2NrX2JoKCZyb3NlX25vZGVfbGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnJvc2VfbmVpZ2hfbGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnJvc2Vfcm91dGVfbGlzdF9sb2NrKTsKKworCXJvc2VfbmVpZ2ggPSByb3NlX25laWdoX2xpc3Q7CisJd2hpbGUgKHJvc2VfbmVpZ2ggIT0gTlVMTCkgeworCQlpZiAoYXgyNWNtcCgmYXgyNS0+ZGVzdF9hZGRyLCAmcm9zZV9uZWlnaC0+Y2FsbHNpZ24pID09IDAgJiYKKwkJICAgIGF4MjUtPmF4MjVfZGV2LT5kZXYgPT0gcm9zZV9uZWlnaC0+ZGV2KQorCQkJYnJlYWs7CisJCXJvc2VfbmVpZ2ggPSByb3NlX25laWdoLT5uZXh0OworCX0KKworCWlmIChyb3NlX25laWdoID09IE5VTEwpIHsKKwkJcHJpbnRrKCJyb3NlX3JvdXRlIDogdW5rbm93biBuZWlnaGJvdXIgb3IgZGV2aWNlICVzXG4iLAorCQkgICAgICAgYXgyYXNjKCZheDI1LT5kZXN0X2FkZHIpKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKglPYnZpb3VzbHkgdGhlIGxpbmsgaXMgd29ya2luZywgaGFsdCB0aGUgZnRpbWVyLgorCSAqLworCXJvc2Vfc3RvcF9mdGltZXIocm9zZV9uZWlnaCk7CisKKwkvKgorCSAqCUxDSSBvZiB6ZXJvIGlzIGFsd2F5cyBmb3IgdXMsIGFuZCBpdHMgYWx3YXlzIGEgcmVzdGFydAorCSAqIAlmcmFtZS4KKwkgKi8KKwlpZiAobGNpID09IDApIHsKKwkJcm9zZV9saW5rX3J4X3Jlc3RhcnQoc2tiLCByb3NlX25laWdoLCBmcmFtZXR5cGUpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqCUZpbmQgYW4gZXhpc3Rpbmcgc29ja2V0LgorCSAqLworCWlmICgoc2sgPSByb3NlX2ZpbmRfc29ja2V0KGxjaSwgcm9zZV9uZWlnaCkpICE9IE5VTEwpIHsKKwkJaWYgKGZyYW1ldHlwZSA9PSBST1NFX0NBTExfUkVRVUVTVCkgeworCQkJc3RydWN0IHJvc2Vfc29jayAqcm9zZSA9IHJvc2Vfc2soc2spOworCisJCQkvKiBSZW1vdmUgYW4gZXhpc3RpbmcgdW51c2VkIHNvY2tldCAqLworCQkJcm9zZV9jbGVhcl9xdWV1ZXMoc2spOworCQkJcm9zZS0+Y2F1c2UJID0gUk9TRV9ORVRXT1JLX0NPTkdFU1RJT047CisJCQlyb3NlLT5kaWFnbm9zdGljID0gMDsKKwkJCXJvc2UtPm5laWdoYm91ci0+dXNlLS07CisJCQlyb3NlLT5uZWlnaGJvdXIJID0gTlVMTDsKKwkJCXJvc2UtPmxjaQkgPSAwOworCQkJcm9zZS0+c3RhdGUJID0gUk9TRV9TVEFURV8wOworCQkJc2stPnNrX3N0YXRlCSA9IFRDUF9DTE9TRTsKKwkJCXNrLT5za19lcnIJID0gMDsKKwkJCXNrLT5za19zaHV0ZG93bgkgfD0gU0VORF9TSFVURE9XTjsKKwkJCWlmICghc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKSB7CisJCQkJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisJCQkJc29ja19zZXRfZmxhZyhzaywgU09DS19ERUFEKTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJCQlyZXMgPSByb3NlX3Byb2Nlc3NfcnhfZnJhbWUoc2ssIHNrYik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qCisJICoJSXMgaXMgYSBDYWxsIFJlcXVlc3QgYW5kIGlzIGl0IGZvciB1cyA/CisJICovCisJaWYgKGZyYW1ldHlwZSA9PSBST1NFX0NBTExfUkVRVUVTVCkKKwkJaWYgKChkZXYgPSByb3NlX2Rldl9nZXQoZGVzdF9hZGRyKSkgIT0gTlVMTCkgeworCQkJcmVzID0gcm9zZV9yeF9jYWxsX3JlcXVlc3Qoc2tiLCBkZXYsIHJvc2VfbmVpZ2gsIGxjaSk7CisJCQlkZXZfcHV0KGRldik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJaWYgKCFzeXNjdGxfcm9zZV9yb3V0aW5nX2NvbnRyb2wpIHsKKwkJcm9zZV90cmFuc21pdF9jbGVhcl9yZXF1ZXN0KHJvc2VfbmVpZ2gsIGxjaSwgUk9TRV9OT1RfT0JUQUlOQUJMRSwgMCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICoJUm91dGUgaXQgdG8gdGhlIG5leHQgaW4gbGluZSBpZiB3ZSBoYXZlIGFuIGVudHJ5IGZvciBpdC4KKwkgKi8KKwlyb3NlX3JvdXRlID0gcm9zZV9yb3V0ZV9saXN0OworCXdoaWxlIChyb3NlX3JvdXRlICE9IE5VTEwpIHsKKwkJaWYgKHJvc2Vfcm91dGUtPmxjaTEgPT0gbGNpICYmCisJCSAgICByb3NlX3JvdXRlLT5uZWlnaDEgPT0gcm9zZV9uZWlnaCkgeworCQkJaWYgKGZyYW1ldHlwZSA9PSBST1NFX0NBTExfUkVRVUVTVCkgeworCQkJCS8qIEY2RkJCIC0gUmVtb3ZlIGFuIGV4aXN0aW5nIHVudXNlZCByb3V0ZSAqLworCQkJCXJvc2VfcmVtb3ZlX3JvdXRlKHJvc2Vfcm91dGUpOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChyb3NlX3JvdXRlLT5uZWlnaDIgIT0gTlVMTCkgeworCQkJCXNrYi0+ZGF0YVswXSAmPSAweEYwOworCQkJCXNrYi0+ZGF0YVswXSB8PSAocm9zZV9yb3V0ZS0+bGNpMiA+PiA4KSAmIDB4MEY7CisJCQkJc2tiLT5kYXRhWzFdICA9IChyb3NlX3JvdXRlLT5sY2kyID4+IDApICYgMHhGRjsKKwkJCQlyb3NlX3RyYW5zbWl0X2xpbmsoc2tiLCByb3NlX3JvdXRlLT5uZWlnaDIpOworCQkJCWlmIChmcmFtZXR5cGUgPT0gUk9TRV9DTEVBUl9DT05GSVJNQVRJT04pCisJCQkJCXJvc2VfcmVtb3ZlX3JvdXRlKHJvc2Vfcm91dGUpOworCQkJCXJlcyA9IDE7CisJCQkJZ290byBvdXQ7CisJCQl9IGVsc2UgeworCQkJCWlmIChmcmFtZXR5cGUgPT0gUk9TRV9DTEVBUl9DT05GSVJNQVRJT04pCisJCQkJCXJvc2VfcmVtb3ZlX3JvdXRlKHJvc2Vfcm91dGUpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJCWlmIChyb3NlX3JvdXRlLT5sY2kyID09IGxjaSAmJgorCQkgICAgcm9zZV9yb3V0ZS0+bmVpZ2gyID09IHJvc2VfbmVpZ2gpIHsKKwkJCWlmIChmcmFtZXR5cGUgPT0gUk9TRV9DQUxMX1JFUVVFU1QpIHsKKwkJCQkvKiBGNkZCQiAtIFJlbW92ZSBhbiBleGlzdGluZyB1bnVzZWQgcm91dGUgKi8KKwkJCQlyb3NlX3JlbW92ZV9yb3V0ZShyb3NlX3JvdXRlKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAocm9zZV9yb3V0ZS0+bmVpZ2gxICE9IE5VTEwpIHsKKwkJCQlza2ItPmRhdGFbMF0gJj0gMHhGMDsKKwkJCQlza2ItPmRhdGFbMF0gfD0gKHJvc2Vfcm91dGUtPmxjaTEgPj4gOCkgJiAweDBGOworCQkJCXNrYi0+ZGF0YVsxXSAgPSAocm9zZV9yb3V0ZS0+bGNpMSA+PiAwKSAmIDB4RkY7CisJCQkJcm9zZV90cmFuc21pdF9saW5rKHNrYiwgcm9zZV9yb3V0ZS0+bmVpZ2gxKTsKKwkJCQlpZiAoZnJhbWV0eXBlID09IFJPU0VfQ0xFQVJfQ09ORklSTUFUSU9OKQorCQkJCQlyb3NlX3JlbW92ZV9yb3V0ZShyb3NlX3JvdXRlKTsKKwkJCQlyZXMgPSAxOworCQkJCWdvdG8gb3V0OworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZnJhbWV0eXBlID09IFJPU0VfQ0xFQVJfQ09ORklSTUFUSU9OKQorCQkJCQlyb3NlX3JlbW92ZV9yb3V0ZShyb3NlX3JvdXRlKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlyb3NlX3JvdXRlID0gcm9zZV9yb3V0ZS0+bmV4dDsKKwl9CisKKwkvKgorCSAqCVdlIGtub3cgdGhhdDoKKwkgKgkxLiBUaGUgZnJhbWUgaXNuJ3QgZm9yIHVzLAorCSAqCTIuIEl0IGlzbid0ICJvd25lZCIgYnkgYW55IGV4aXN0aW5nIHJvdXRlLgorCSAqLworCWlmIChmcmFtZXR5cGUgIT0gUk9TRV9DQUxMX1JFUVVFU1QpCS8qIFhYWCAqLworCQlyZXR1cm4gMDsKKworCWxlbiAgPSAoKChza2ItPmRhdGFbM10gPj4gNCkgJiAweDBGKSArIDEpIC8gMjsKKwlsZW4gKz0gKCgoc2tiLT5kYXRhWzNdID4+IDApICYgMHgwRikgKyAxKSAvIDI7CisKKwltZW1zZXQoJmZhY2lsaXRpZXMsIDB4MDAsIHNpemVvZihzdHJ1Y3Qgcm9zZV9mYWNpbGl0aWVzX3N0cnVjdCkpOworCisJaWYgKCFyb3NlX3BhcnNlX2ZhY2lsaXRpZXMoc2tiLT5kYXRhICsgbGVuICsgNCwgJmZhY2lsaXRpZXMpKSB7CisJCXJvc2VfdHJhbnNtaXRfY2xlYXJfcmVxdWVzdChyb3NlX25laWdoLCBsY2ksIFJPU0VfSU5WQUxJRF9GQUNJTElUWSwgNzYpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqCUNoZWNrIGZvciByb3V0aW5nIGxvb3BzLgorCSAqLworCXJvc2Vfcm91dGUgPSByb3NlX3JvdXRlX2xpc3Q7CisJd2hpbGUgKHJvc2Vfcm91dGUgIT0gTlVMTCkgeworCQlpZiAocm9zZV9yb3V0ZS0+cmFuZCA9PSBmYWNpbGl0aWVzLnJhbmQgJiYKKwkJICAgIHJvc2VjbXAoc3JjX2FkZHIsICZyb3NlX3JvdXRlLT5zcmNfYWRkcikgPT0gMCAmJgorCQkgICAgYXgyNWNtcCgmZmFjaWxpdGllcy5kZXN0X2NhbGwsICZyb3NlX3JvdXRlLT5zcmNfY2FsbCkgPT0gMCAmJgorCQkgICAgYXgyNWNtcCgmZmFjaWxpdGllcy5zb3VyY2VfY2FsbCwgJnJvc2Vfcm91dGUtPmRlc3RfY2FsbCkgPT0gMCkgeworCQkJcm9zZV90cmFuc21pdF9jbGVhcl9yZXF1ZXN0KHJvc2VfbmVpZ2gsIGxjaSwgUk9TRV9OT1RfT0JUQUlOQUJMRSwgMTIwKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJvc2Vfcm91dGUgPSByb3NlX3JvdXRlLT5uZXh0OworCX0KKworCWlmICgobmV3X25laWdoID0gcm9zZV9nZXRfbmVpZ2goZGVzdF9hZGRyLCAmY2F1c2UsICZkaWFnbm9zdGljKSkgPT0gTlVMTCkgeworCQlyb3NlX3RyYW5zbWl0X2NsZWFyX3JlcXVlc3Qocm9zZV9uZWlnaCwgbGNpLCBjYXVzZSwgZGlhZ25vc3RpYyk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICgobmV3X2xjaSA9IHJvc2VfbmV3X2xjaShuZXdfbmVpZ2gpKSA9PSAwKSB7CisJCXJvc2VfdHJhbnNtaXRfY2xlYXJfcmVxdWVzdChyb3NlX25laWdoLCBsY2ksIFJPU0VfTkVUV09SS19DT05HRVNUSU9OLCA3MSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICgocm9zZV9yb3V0ZSA9IGttYWxsb2Moc2l6ZW9mKCpyb3NlX3JvdXRlKSwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwkJcm9zZV90cmFuc21pdF9jbGVhcl9yZXF1ZXN0KHJvc2VfbmVpZ2gsIGxjaSwgUk9TRV9ORVRXT1JLX0NPTkdFU1RJT04sIDEyMCk7CisJCWdvdG8gb3V0OworCX0KKworCXJvc2Vfcm91dGUtPmxjaTEgICAgICA9IGxjaTsKKwlyb3NlX3JvdXRlLT5zcmNfYWRkciAgPSAqc3JjX2FkZHI7CisJcm9zZV9yb3V0ZS0+ZGVzdF9hZGRyID0gKmRlc3RfYWRkcjsKKwlyb3NlX3JvdXRlLT5zcmNfY2FsbCAgPSBmYWNpbGl0aWVzLmRlc3RfY2FsbDsKKwlyb3NlX3JvdXRlLT5kZXN0X2NhbGwgPSBmYWNpbGl0aWVzLnNvdXJjZV9jYWxsOworCXJvc2Vfcm91dGUtPnJhbmQgICAgICA9IGZhY2lsaXRpZXMucmFuZDsKKwlyb3NlX3JvdXRlLT5uZWlnaDEgICAgPSByb3NlX25laWdoOworCXJvc2Vfcm91dGUtPmxjaTIgICAgICA9IG5ld19sY2k7CisJcm9zZV9yb3V0ZS0+bmVpZ2gyICAgID0gbmV3X25laWdoOworCisJcm9zZV9yb3V0ZS0+bmVpZ2gxLT51c2UrKzsKKwlyb3NlX3JvdXRlLT5uZWlnaDItPnVzZSsrOworCisJcm9zZV9yb3V0ZS0+bmV4dCA9IHJvc2Vfcm91dGVfbGlzdDsKKwlyb3NlX3JvdXRlX2xpc3QgID0gcm9zZV9yb3V0ZTsKKworCXNrYi0+ZGF0YVswXSAmPSAweEYwOworCXNrYi0+ZGF0YVswXSB8PSAocm9zZV9yb3V0ZS0+bGNpMiA+PiA4KSAmIDB4MEY7CisJc2tiLT5kYXRhWzFdICA9IChyb3NlX3JvdXRlLT5sY2kyID4+IDApICYgMHhGRjsKKworCXJvc2VfdHJhbnNtaXRfbGluayhza2IsIHJvc2Vfcm91dGUtPm5laWdoMik7CisJcmVzID0gMTsKKworb3V0OgorCXNwaW5fdW5sb2NrX2JoKCZyb3NlX3JvdXRlX2xpc3RfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnJvc2VfbmVpZ2hfbGlzdF9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmcm9zZV9ub2RlX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gcmVzOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworc3RhdGljIHZvaWQgKnJvc2Vfbm9kZV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHJvc2Vfbm9kZSAqcm9zZV9ub2RlOworCWludCBpID0gMTsKKworCXNwaW5fbG9ja19iaCgmcm9zZV9uZWlnaF9saXN0X2xvY2spOworCWlmICgqcG9zID09IDApCisJCXJldHVybiBTRVFfU1RBUlRfVE9LRU47CisKKwlmb3IgKHJvc2Vfbm9kZSA9IHJvc2Vfbm9kZV9saXN0OyByb3NlX25vZGUgJiYgaSA8ICpwb3M7IAorCSAgICAgcm9zZV9ub2RlID0gcm9zZV9ub2RlLT5uZXh0LCArK2kpOworCisJcmV0dXJuIChpID09ICpwb3MpID8gcm9zZV9ub2RlIDogTlVMTDsKK30KKworc3RhdGljIHZvaWQgKnJvc2Vfbm9kZV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwkrKypwb3M7CisJCisJcmV0dXJuICh2ID09IFNFUV9TVEFSVF9UT0tFTikgPyByb3NlX25vZGVfbGlzdCAKKwkJOiAoKHN0cnVjdCByb3NlX25vZGUgKil2KS0+bmV4dDsKK30KKworc3RhdGljIHZvaWQgcm9zZV9ub2RlX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3Bpbl91bmxvY2tfYmgoJnJvc2VfbmVpZ2hfbGlzdF9sb2NrKTsKK30KKworc3RhdGljIGludCByb3NlX25vZGVfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpbnQgaTsKKworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKKwkJc2VxX3B1dHMoc2VxLCAiYWRkcmVzcyAgICBtYXNrIG4gbmVpZ2ggbmVpZ2ggbmVpZ2hcbiIpOworCWVsc2UgeworCQljb25zdCBzdHJ1Y3Qgcm9zZV9ub2RlICpyb3NlX25vZGUgPSB2OworCQkvKiBpZiAocm9zZV9ub2RlLT5sb29wYmFjaykgeworCQkJc2VxX3ByaW50ZihzZXEsICIlLTEwcyAlMDRkIDEgbG9vcGJhY2tcbiIsCisJCQkJcm9zZTJhc2MoJnJvc2Vfbm9kZS0+YWRkcmVzcyksCisJCQkJcm9zZV9ub2RlLT5tYXNrKTsKKwkJfSBlbHNlIHsgKi8KKwkJCXNlcV9wcmludGYoc2VxLCAiJS0xMHMgJTA0ZCAlZCIsCisJCQkJcm9zZTJhc2MoJnJvc2Vfbm9kZS0+YWRkcmVzcyksCisJCQkJcm9zZV9ub2RlLT5tYXNrLAorCQkJCXJvc2Vfbm9kZS0+Y291bnQpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgcm9zZV9ub2RlLT5jb3VudDsgaSsrKQorCQkJCXNlcV9wcmludGYoc2VxLCAiICUwNWQiLAorCQkJCQlyb3NlX25vZGUtPm5laWdoYm91cltpXS0+bnVtYmVyKTsKKworCQkJc2VxX3B1dHMoc2VxLCAiXG4iKTsKKwkJLyogfSAqLworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyByb3NlX25vZGVfc2Vxb3BzID0geworCS5zdGFydCA9IHJvc2Vfbm9kZV9zdGFydCwKKwkubmV4dCA9IHJvc2Vfbm9kZV9uZXh0LAorCS5zdG9wID0gcm9zZV9ub2RlX3N0b3AsCisJLnNob3cgPSByb3NlX25vZGVfc2hvdywKK307CisKK3N0YXRpYyBpbnQgcm9zZV9ub2Rlc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmcm9zZV9ub2RlX3NlcW9wcyk7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgcm9zZV9ub2Rlc19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gcm9zZV9ub2Rlc19vcGVuLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIHZvaWQgKnJvc2VfbmVpZ2hfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCByb3NlX25laWdoICpyb3NlX25laWdoOworCWludCBpID0gMTsKKworCXNwaW5fbG9ja19iaCgmcm9zZV9uZWlnaF9saXN0X2xvY2spOworCWlmICgqcG9zID09IDApCisJCXJldHVybiBTRVFfU1RBUlRfVE9LRU47CisKKwlmb3IgKHJvc2VfbmVpZ2ggPSByb3NlX25laWdoX2xpc3Q7IHJvc2VfbmVpZ2ggJiYgaSA8ICpwb3M7IAorCSAgICAgcm9zZV9uZWlnaCA9IHJvc2VfbmVpZ2gtPm5leHQsICsraSk7CisKKwlyZXR1cm4gKGkgPT0gKnBvcykgPyByb3NlX25laWdoIDogTlVMTDsKK30KKworc3RhdGljIHZvaWQgKnJvc2VfbmVpZ2hfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJKysqcG9zOworCQorCXJldHVybiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pID8gcm9zZV9uZWlnaF9saXN0IAorCQk6ICgoc3RydWN0IHJvc2VfbmVpZ2ggKil2KS0+bmV4dDsKK30KKworc3RhdGljIHZvaWQgcm9zZV9uZWlnaF9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXNwaW5fdW5sb2NrX2JoKCZyb3NlX25laWdoX2xpc3RfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgcm9zZV9uZWlnaF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWludCBpOworCisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlzZXFfcHV0cyhzZXEsIAorCQkJICJhZGRyICBjYWxsc2lnbiAgZGV2ICBjb3VudCB1c2UgbW9kZSByZXN0YXJ0ICB0MCAgdGYgZGlnaXBlYXRlcnNcbiIpOworCWVsc2UgeworCQlzdHJ1Y3Qgcm9zZV9uZWlnaCAqcm9zZV9uZWlnaCA9IHY7CisKKwkJLyogaWYgKCFyb3NlX25laWdoLT5sb29wYmFjaykgeyAqLworCQlzZXFfcHJpbnRmKHNlcSwgIiUwNWQgJS05cyAlLTRzICAgJTNkICUzZCAgJTNzICAgICAlM3MgJTNsdSAlM2x1IiwKKwkJCSAgIHJvc2VfbmVpZ2gtPm51bWJlciwKKwkJCSAgIChyb3NlX25laWdoLT5sb29wYmFjaykgPyAiUlNMT09QLTAiIDogYXgyYXNjKCZyb3NlX25laWdoLT5jYWxsc2lnbiksCisJCQkgICByb3NlX25laWdoLT5kZXYgPyByb3NlX25laWdoLT5kZXYtPm5hbWUgOiAiPz8/IiwKKwkJCSAgIHJvc2VfbmVpZ2gtPmNvdW50LAorCQkJICAgcm9zZV9uZWlnaC0+dXNlLAorCQkJICAgKHJvc2VfbmVpZ2gtPmRjZV9tb2RlKSA/ICJEQ0UiIDogIkRURSIsCisJCQkgICAocm9zZV9uZWlnaC0+cmVzdGFydGVkKSA/ICJ5ZXMiIDogIm5vIiwKKwkJCSAgIGF4MjVfZGlzcGxheV90aW1lcigmcm9zZV9uZWlnaC0+dDB0aW1lcikgLyBIWiwKKwkJCSAgIGF4MjVfZGlzcGxheV90aW1lcigmcm9zZV9uZWlnaC0+ZnRpbWVyKSAgLyBIWik7CisKKwkJaWYgKHJvc2VfbmVpZ2gtPmRpZ2lwZWF0ICE9IE5VTEwpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCByb3NlX25laWdoLT5kaWdpcGVhdC0+bmRpZ2k7IGkrKykKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiAlcyIsIGF4MmFzYygmcm9zZV9uZWlnaC0+ZGlnaXBlYXQtPmNhbGxzW2ldKSk7CisJCX0KKworCQlzZXFfcHV0cyhzZXEsICJcbiIpOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHJvc2VfbmVpZ2hfc2Vxb3BzID0geworCS5zdGFydCA9IHJvc2VfbmVpZ2hfc3RhcnQsCisJLm5leHQgPSByb3NlX25laWdoX25leHQsCisJLnN0b3AgPSByb3NlX25laWdoX3N0b3AsCisJLnNob3cgPSByb3NlX25laWdoX3Nob3csCit9OworCitzdGF0aWMgaW50IHJvc2VfbmVpZ2hfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJnJvc2VfbmVpZ2hfc2Vxb3BzKTsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByb3NlX25laWdoX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSByb3NlX25laWdoX29wZW4sCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworCisKK3N0YXRpYyB2b2lkICpyb3NlX3JvdXRlX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3Qgcm9zZV9yb3V0ZSAqcm9zZV9yb3V0ZTsKKwlpbnQgaSA9IDE7CisKKwlzcGluX2xvY2tfYmgoJnJvc2Vfcm91dGVfbGlzdF9sb2NrKTsKKwlpZiAoKnBvcyA9PSAwKQorCQlyZXR1cm4gU0VRX1NUQVJUX1RPS0VOOworCisJZm9yIChyb3NlX3JvdXRlID0gcm9zZV9yb3V0ZV9saXN0OyByb3NlX3JvdXRlICYmIGkgPCAqcG9zOyAKKwkgICAgIHJvc2Vfcm91dGUgPSByb3NlX3JvdXRlLT5uZXh0LCArK2kpOworCisJcmV0dXJuIChpID09ICpwb3MpID8gcm9zZV9yb3V0ZSA6IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICpyb3NlX3JvdXRlX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCSsrKnBvczsKKwkKKwlyZXR1cm4gKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSA/IHJvc2Vfcm91dGVfbGlzdCAKKwkJOiAoKHN0cnVjdCByb3NlX3JvdXRlICopdiktPm5leHQ7Cit9CisKK3N0YXRpYyB2b2lkIHJvc2Vfcm91dGVfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzcGluX3VubG9ja19iaCgmcm9zZV9yb3V0ZV9saXN0X2xvY2spOworfQorCitzdGF0aWMgaW50IHJvc2Vfcm91dGVfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXNlcV9wdXRzKHNlcSwgCisJCQkgImxjaSAgYWRkcmVzcyAgICAgY2FsbHNpZ24gICBuZWlnaCAgPC0+IGxjaSAgYWRkcmVzcyAgICAgY2FsbHNpZ24gICBuZWlnaFxuIik7CisJZWxzZSB7CisJCXN0cnVjdCByb3NlX3JvdXRlICpyb3NlX3JvdXRlID0gdjsKKworCQlpZiAocm9zZV9yb3V0ZS0+bmVpZ2gxKSAKKwkJCXNlcV9wcmludGYoc2VxLAorCQkJCSAgICIlMy4zWCAgJS0xMHMgICUtOXMgICUwNWQgICAgICAiLAorCQkJCSAgIHJvc2Vfcm91dGUtPmxjaTEsCisJCQkJICAgcm9zZTJhc2MoJnJvc2Vfcm91dGUtPnNyY19hZGRyKSwKKwkJCQkgICBheDJhc2MoJnJvc2Vfcm91dGUtPnNyY19jYWxsKSwKKwkJCQkgICByb3NlX3JvdXRlLT5uZWlnaDEtPm51bWJlcik7CisJCWVsc2UgCisJCQlzZXFfcHV0cyhzZXEsIAorCQkJCSAiMDAwICAqICAgICAgICAgICAqICAgICAgICAgIDAwMDAwICAgICAgIik7CisKKwkJaWYgKHJvc2Vfcm91dGUtPm5laWdoMikgCisJCQlzZXFfcHJpbnRmKHNlcSwKKwkJCQkgICAiJTMuM1ggICUtMTBzICAlLTlzICAlMDVkXG4iLAorCQkJCXJvc2Vfcm91dGUtPmxjaTIsCisJCQkJcm9zZTJhc2MoJnJvc2Vfcm91dGUtPmRlc3RfYWRkciksCisJCQkJYXgyYXNjKCZyb3NlX3JvdXRlLT5kZXN0X2NhbGwpLAorCQkJCXJvc2Vfcm91dGUtPm5laWdoMi0+bnVtYmVyKTsKKwkJIGVsc2UgCisJCQkgc2VxX3B1dHMoc2VxLAorCQkJCSAgIjAwMCAgKiAgICAgICAgICAgKiAgICAgICAgICAwMDAwMFxuIik7CisJCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyByb3NlX3JvdXRlX3NlcW9wcyA9IHsKKwkuc3RhcnQgPSByb3NlX3JvdXRlX3N0YXJ0LAorCS5uZXh0ID0gcm9zZV9yb3V0ZV9uZXh0LAorCS5zdG9wID0gcm9zZV9yb3V0ZV9zdG9wLAorCS5zaG93ID0gcm9zZV9yb3V0ZV9zaG93LAorfTsKKworc3RhdGljIGludCByb3NlX3JvdXRlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZyb3NlX3JvdXRlX3NlcW9wcyk7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgcm9zZV9yb3V0ZXNfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IHJvc2Vfcm91dGVfb3BlbiwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCisvKgorICoJUmVsZWFzZSBhbGwgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBST1NFIHJvdXRpbmcgc3RydWN0dXJlcy4KKyAqLwordm9pZCBfX2V4aXQgcm9zZV9ydF9mcmVlKHZvaWQpCit7CisJc3RydWN0IHJvc2VfbmVpZ2ggKnMsICpyb3NlX25laWdoID0gcm9zZV9uZWlnaF9saXN0OworCXN0cnVjdCByb3NlX25vZGUgICp0LCAqcm9zZV9ub2RlICA9IHJvc2Vfbm9kZV9saXN0OworCXN0cnVjdCByb3NlX3JvdXRlICp1LCAqcm9zZV9yb3V0ZSA9IHJvc2Vfcm91dGVfbGlzdDsKKworCXdoaWxlIChyb3NlX25laWdoICE9IE5VTEwpIHsKKwkJcyAgICAgICAgICA9IHJvc2VfbmVpZ2g7CisJCXJvc2VfbmVpZ2ggPSByb3NlX25laWdoLT5uZXh0OworCisJCXJvc2VfcmVtb3ZlX25laWdoKHMpOworCX0KKworCXdoaWxlIChyb3NlX25vZGUgIT0gTlVMTCkgeworCQl0ICAgICAgICAgPSByb3NlX25vZGU7CisJCXJvc2Vfbm9kZSA9IHJvc2Vfbm9kZS0+bmV4dDsKKworCQlyb3NlX3JlbW92ZV9ub2RlKHQpOworCX0KKworCXdoaWxlIChyb3NlX3JvdXRlICE9IE5VTEwpIHsKKwkJdSAgICAgICAgICA9IHJvc2Vfcm91dGU7CisJCXJvc2Vfcm91dGUgPSByb3NlX3JvdXRlLT5uZXh0OworCisJCXJvc2VfcmVtb3ZlX3JvdXRlKHUpOworCX0KK30KZGlmZiAtLWdpdCBhL25ldC9yb3NlL3Jvc2Vfc3Vici5jIGIvbmV0L3Jvc2Uvcm9zZV9zdWJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RiN2UxYwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yb3NlL3Jvc2Vfc3Vici5jCkBAIC0wLDAgKzEsNTE5IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIEpvbmF0aGFuIE5heWxvciBHNEtMWCAoZzRrbHhAZzRrbHguZGVtb24uY28udWspCisgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPG5ldC9heDI1Lmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bmV0L3Jvc2UuaD4KKworc3RhdGljIGludCByb3NlX2NyZWF0ZV9mYWNpbGl0aWVzKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgc3RydWN0IHJvc2Vfc29jayAqcm9zZSk7CisKKy8qCisgKglUaGlzIHJvdXRpbmUgcHVyZ2VzIGFsbCBvZiB0aGUgcXVldWVzIG9mIGZyYW1lcy4KKyAqLwordm9pZCByb3NlX2NsZWFyX3F1ZXVlcyhzdHJ1Y3Qgc29jayAqc2spCit7CisJc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfd3JpdGVfcXVldWUpOworCXNrYl9xdWV1ZV9wdXJnZSgmcm9zZV9zayhzayktPmFja19xdWV1ZSk7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgcHVyZ2VzIHRoZSBpbnB1dCBxdWV1ZSBvZiB0aG9zZSBmcmFtZXMgdGhhdCBoYXZlIGJlZW4KKyAqIGFja25vd2xlZGdlZC4gVGhpcyByZXBsYWNlcyB0aGUgYm94ZXMgbGFiZWxsZWQgIlYoYSkgPC0gTihyKSIgb24gdGhlCisgKiBTREwgZGlhZ3JhbS4KKyAqLwordm9pZCByb3NlX2ZyYW1lc19hY2tlZChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIHNob3J0IG5yKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHJvc2Vfc29jayAqcm9zZSA9IHJvc2Vfc2soc2spOworCisJLyoKKwkgKiBSZW1vdmUgYWxsIHRoZSBhY2stZWQgZnJhbWVzIGZyb20gdGhlIGFjayBxdWV1ZS4KKwkgKi8KKwlpZiAocm9zZS0+dmEgIT0gbnIpIHsKKwkJd2hpbGUgKHNrYl9wZWVrKCZyb3NlLT5hY2tfcXVldWUpICE9IE5VTEwgJiYgcm9zZS0+dmEgIT0gbnIpIHsKKwkJCXNrYiA9IHNrYl9kZXF1ZXVlKCZyb3NlLT5hY2tfcXVldWUpOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyb3NlLT52YSA9IChyb3NlLT52YSArIDEpICUgUk9TRV9NT0RVTFVTOworCQl9CisJfQorfQorCit2b2lkIHJvc2VfcmVxdWV1ZV9mcmFtZXMoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBza19idWZmICpza2IsICpza2JfcHJldiA9IE5VTEw7CisKKwkvKgorCSAqIFJlcXVldWUgYWxsIHRoZSB1bi1hY2stZWQgZnJhbWVzIG9uIHRoZSBvdXRwdXQgcXVldWUgdG8gYmUgcGlja2VkCisJICogdXAgYnkgcm9zZV9raWNrLiBUaGlzIGFycmFuZ2VtZW50IGhhbmRsZXMgdGhlIHBvc3NpYmlsaXR5IG9mIGFuCisJICogZW1wdHkgb3V0cHV0IHF1ZXVlLgorCSAqLworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnJvc2Vfc2soc2spLT5hY2tfcXVldWUpKSAhPSBOVUxMKSB7CisJCWlmIChza2JfcHJldiA9PSBOVUxMKQorCQkJc2tiX3F1ZXVlX2hlYWQoJnNrLT5za193cml0ZV9xdWV1ZSwgc2tiKTsKKwkJZWxzZQorCQkJc2tiX2FwcGVuZChza2JfcHJldiwgc2tiKTsKKwkJc2tiX3ByZXYgPSBza2I7CisJfQorfQorCisvKgorICoJVmFsaWRhdGUgdGhhdCB0aGUgdmFsdWUgb2YgbnIgaXMgYmV0d2VlbiB2YSBhbmQgdnMuIFJldHVybiB0cnVlIG9yCisgKglmYWxzZSBmb3IgdGVzdGluZy4KKyAqLworaW50IHJvc2VfdmFsaWRhdGVfbnIoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBzaG9ydCBucikKK3sKKwlzdHJ1Y3Qgcm9zZV9zb2NrICpyb3NlID0gcm9zZV9zayhzayk7CisJdW5zaWduZWQgc2hvcnQgdmMgPSByb3NlLT52YTsKKworCXdoaWxlICh2YyAhPSByb3NlLT52cykgeworCQlpZiAobnIgPT0gdmMpIHJldHVybiAxOworCQl2YyA9ICh2YyArIDEpICUgUk9TRV9NT0RVTFVTOworCX0KKworCXJldHVybiBuciA9PSByb3NlLT52czsKK30KKworLyoKKyAqICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gdGhlIHBhY2tldCBsYXllciBpbnRlcm5hbGx5IGdlbmVyYXRlcyBhCisgKiAgY29udHJvbCBmcmFtZS4KKyAqLwordm9pZCByb3NlX3dyaXRlX2ludGVybmFsKHN0cnVjdCBzb2NrICpzaywgaW50IGZyYW1ldHlwZSkKK3sKKwlzdHJ1Y3Qgcm9zZV9zb2NrICpyb3NlID0gcm9zZV9zayhzayk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyICAqZHB0cjsKKwl1bnNpZ25lZCBjaGFyICBsY2kxLCBsY2kyOworCWNoYXIgYnVmZmVyWzEwMF07CisJaW50IGxlbiwgZmFjbGVuID0gMDsKKworCWxlbiA9IEFYMjVfQlBRX0hFQURFUl9MRU4gKyBBWDI1X01BWF9IRUFERVJfTEVOICsgUk9TRV9NSU5fTEVOICsgMTsKKworCXN3aXRjaCAoZnJhbWV0eXBlKSB7CisJY2FzZSBST1NFX0NBTExfUkVRVUVTVDoKKwkJbGVuICAgKz0gMSArIFJPU0VfQUREUl9MRU4gKyBST1NFX0FERFJfTEVOOworCQlmYWNsZW4gPSByb3NlX2NyZWF0ZV9mYWNpbGl0aWVzKGJ1ZmZlciwgcm9zZSk7CisJCWxlbiAgICs9IGZhY2xlbjsKKwkJYnJlYWs7CisJY2FzZSBST1NFX0NBTExfQUNDRVBURUQ6CisJY2FzZSBST1NFX0NMRUFSX1JFUVVFU1Q6CisJY2FzZSBST1NFX1JFU0VUX1JFUVVFU1Q6CisJCWxlbiAgICs9IDI7CisJCWJyZWFrOworCX0KKworCWlmICgoc2tiID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJCXJldHVybjsKKworCS8qCisJICoJU3BhY2UgZm9yIEFYLjI1IGhlYWRlciBhbmQgUElELgorCSAqLworCXNrYl9yZXNlcnZlKHNrYiwgQVgyNV9CUFFfSEVBREVSX0xFTiArIEFYMjVfTUFYX0hFQURFUl9MRU4gKyAxKTsKKworCWRwdHIgPSBza2JfcHV0KHNrYiwgc2tiX3RhaWxyb29tKHNrYikpOworCisJbGNpMSA9IChyb3NlLT5sY2kgPj4gOCkgJiAweDBGOworCWxjaTIgPSAocm9zZS0+bGNpID4+IDApICYgMHhGRjsKKworCXN3aXRjaCAoZnJhbWV0eXBlKSB7CisJY2FzZSBST1NFX0NBTExfUkVRVUVTVDoKKwkJKmRwdHIrKyA9IFJPU0VfR0ZJIHwgbGNpMTsKKwkJKmRwdHIrKyA9IGxjaTI7CisJCSpkcHRyKysgPSBmcmFtZXR5cGU7CisJCSpkcHRyKysgPSAweEFBOworCQltZW1jcHkoZHB0ciwgJnJvc2UtPmRlc3RfYWRkciwgIFJPU0VfQUREUl9MRU4pOworCQlkcHRyICAgKz0gUk9TRV9BRERSX0xFTjsKKwkJbWVtY3B5KGRwdHIsICZyb3NlLT5zb3VyY2VfYWRkciwgUk9TRV9BRERSX0xFTik7CisJCWRwdHIgICArPSBST1NFX0FERFJfTEVOOworCQltZW1jcHkoZHB0ciwgYnVmZmVyLCBmYWNsZW4pOworCQlkcHRyICAgKz0gZmFjbGVuOworCQlicmVhazsKKworCWNhc2UgUk9TRV9DQUxMX0FDQ0VQVEVEOgorCQkqZHB0cisrID0gUk9TRV9HRkkgfCBsY2kxOworCQkqZHB0cisrID0gbGNpMjsKKwkJKmRwdHIrKyA9IGZyYW1ldHlwZTsKKwkJKmRwdHIrKyA9IDB4MDA7CQkvKiBBZGRyZXNzIGxlbmd0aCAqLworCQkqZHB0cisrID0gMDsJCS8qIEZhY2lsaXRpZXMgbGVuZ3RoICovCisJCWJyZWFrOworCisJY2FzZSBST1NFX0NMRUFSX1JFUVVFU1Q6CisJCSpkcHRyKysgPSBST1NFX0dGSSB8IGxjaTE7CisJCSpkcHRyKysgPSBsY2kyOworCQkqZHB0cisrID0gZnJhbWV0eXBlOworCQkqZHB0cisrID0gcm9zZS0+Y2F1c2U7CisJCSpkcHRyKysgPSByb3NlLT5kaWFnbm9zdGljOworCQlicmVhazsKKworCWNhc2UgUk9TRV9SRVNFVF9SRVFVRVNUOgorCQkqZHB0cisrID0gUk9TRV9HRkkgfCBsY2kxOworCQkqZHB0cisrID0gbGNpMjsKKwkJKmRwdHIrKyA9IGZyYW1ldHlwZTsKKwkJKmRwdHIrKyA9IFJPU0VfRFRFX09SSUdJTkFURUQ7CisJCSpkcHRyKysgPSAwOworCQlicmVhazsKKworCWNhc2UgUk9TRV9SUjoKKwljYXNlIFJPU0VfUk5SOgorCQkqZHB0cisrID0gUk9TRV9HRkkgfCBsY2kxOworCQkqZHB0cisrID0gbGNpMjsKKwkJKmRwdHIgICA9IGZyYW1ldHlwZTsKKwkJKmRwdHIrKyB8PSAocm9zZS0+dnIgPDwgNSkgJiAweEUwOworCQlicmVhazsKKworCWNhc2UgUk9TRV9DTEVBUl9DT05GSVJNQVRJT046CisJY2FzZSBST1NFX1JFU0VUX0NPTkZJUk1BVElPTjoKKwkJKmRwdHIrKyA9IFJPU0VfR0ZJIHwgbGNpMTsKKwkJKmRwdHIrKyA9IGxjaTI7CisJCSpkcHRyKysgID0gZnJhbWV0eXBlOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiUk9TRTogcm9zZV93cml0ZV9pbnRlcm5hbCAtIGludmFsaWQgZnJhbWV0eXBlICUwMlhcbiIsIGZyYW1ldHlwZSk7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorCisJcm9zZV90cmFuc21pdF9saW5rKHNrYiwgcm9zZS0+bmVpZ2hib3VyKTsKK30KKworaW50IHJvc2VfZGVjb2RlKHN0cnVjdCBza19idWZmICpza2IsIGludCAqbnMsIGludCAqbnIsIGludCAqcSwgaW50ICpkLCBpbnQgKm0pCit7CisJdW5zaWduZWQgY2hhciAqZnJhbWU7CisKKwlmcmFtZSA9IHNrYi0+ZGF0YTsKKworCSpucyA9ICpuciA9ICpxID0gKmQgPSAqbSA9IDA7CisKKwlzd2l0Y2ggKGZyYW1lWzJdKSB7CisJY2FzZSBST1NFX0NBTExfUkVRVUVTVDoKKwljYXNlIFJPU0VfQ0FMTF9BQ0NFUFRFRDoKKwljYXNlIFJPU0VfQ0xFQVJfUkVRVUVTVDoKKwljYXNlIFJPU0VfQ0xFQVJfQ09ORklSTUFUSU9OOgorCWNhc2UgUk9TRV9SRVNFVF9SRVFVRVNUOgorCWNhc2UgUk9TRV9SRVNFVF9DT05GSVJNQVRJT046CisJCXJldHVybiBmcmFtZVsyXTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAoKGZyYW1lWzJdICYgMHgxRikgPT0gUk9TRV9SUiAgfHwKKwkgICAgKGZyYW1lWzJdICYgMHgxRikgPT0gUk9TRV9STlIpIHsKKwkJKm5yID0gKGZyYW1lWzJdID4+IDUpICYgMHgwNzsKKwkJcmV0dXJuIGZyYW1lWzJdICYgMHgxRjsKKwl9CisKKwlpZiAoKGZyYW1lWzJdICYgMHgwMSkgPT0gUk9TRV9EQVRBKSB7CisJCSpxICA9IChmcmFtZVswXSAmIFJPU0VfUV9CSVQpID09IFJPU0VfUV9CSVQ7CisJCSpkICA9IChmcmFtZVswXSAmIFJPU0VfRF9CSVQpID09IFJPU0VfRF9CSVQ7CisJCSptICA9IChmcmFtZVsyXSAmIFJPU0VfTV9CSVQpID09IFJPU0VfTV9CSVQ7CisJCSpuciA9IChmcmFtZVsyXSA+PiA1KSAmIDB4MDc7CisJCSpucyA9IChmcmFtZVsyXSA+PiAxKSAmIDB4MDc7CisJCXJldHVybiBST1NFX0RBVEE7CisJfQorCisJcmV0dXJuIFJPU0VfSUxMRUdBTDsKK30KKworc3RhdGljIGludCByb3NlX3BhcnNlX25hdGlvbmFsKHVuc2lnbmVkIGNoYXIgKnAsIHN0cnVjdCByb3NlX2ZhY2lsaXRpZXNfc3RydWN0ICpmYWNpbGl0aWVzLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnB0OworCXVuc2lnbmVkIGNoYXIgbCwgbGcsIG4gPSAwOworCWludCBmYWNfbmF0aW9uYWxfZGlnaXNfcmVjZWl2ZWQgPSAwOworCisJZG8geworCQlzd2l0Y2ggKCpwICYgMHhDMCkgeworCQljYXNlIDB4MDA6CisJCQlwICAgKz0gMjsKKwkJCW4gICArPSAyOworCQkJbGVuIC09IDI7CisJCQlicmVhazsKKworCQljYXNlIDB4NDA6CisJCQlpZiAoKnAgPT0gRkFDX05BVElPTkFMX1JBTkQpCisJCQkJZmFjaWxpdGllcy0+cmFuZCA9ICgocFsxXSA8PCA4KSAmIDB4RkYwMCkgKyAoKHBbMl0gPDwgMCkgJiAweDAwRkYpOworCQkJcCAgICs9IDM7CisJCQluICAgKz0gMzsKKwkJCWxlbiAtPSAzOworCQkJYnJlYWs7CisKKwkJY2FzZSAweDgwOgorCQkJcCAgICs9IDQ7CisJCQluICAgKz0gNDsKKwkJCWxlbiAtPSA0OworCQkJYnJlYWs7CisKKwkJY2FzZSAweEMwOgorCQkJbCA9IHBbMV07CisJCQlpZiAoKnAgPT0gRkFDX05BVElPTkFMX0RFU1RfRElHSSkgeworCQkJCWlmICghZmFjX25hdGlvbmFsX2RpZ2lzX3JlY2VpdmVkKSB7CisJCQkJCW1lbWNweSgmZmFjaWxpdGllcy0+c291cmNlX2RpZ2lzWzBdLCBwICsgMiwgQVgyNV9BRERSX0xFTik7CisJCQkJCWZhY2lsaXRpZXMtPnNvdXJjZV9uZGlnaXMgPSAxOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKCpwID09IEZBQ19OQVRJT05BTF9TUkNfRElHSSkgeworCQkJCWlmICghZmFjX25hdGlvbmFsX2RpZ2lzX3JlY2VpdmVkKSB7CisJCQkJCW1lbWNweSgmZmFjaWxpdGllcy0+ZGVzdF9kaWdpc1swXSwgcCArIDIsIEFYMjVfQUREUl9MRU4pOworCQkJCQlmYWNpbGl0aWVzLT5kZXN0X25kaWdpcyA9IDE7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAoKnAgPT0gRkFDX05BVElPTkFMX0ZBSUxfQ0FMTCkgeworCQkJCW1lbWNweSgmZmFjaWxpdGllcy0+ZmFpbF9jYWxsLCBwICsgMiwgQVgyNV9BRERSX0xFTik7CisJCQl9CisJCQllbHNlIGlmICgqcCA9PSBGQUNfTkFUSU9OQUxfRkFJTF9BREQpIHsKKwkJCQltZW1jcHkoJmZhY2lsaXRpZXMtPmZhaWxfYWRkciwgcCArIDMsIFJPU0VfQUREUl9MRU4pOworCQkJfQorCQkJZWxzZSBpZiAoKnAgPT0gRkFDX05BVElPTkFMX0RJR0lTKSB7CisJCQkJZmFjX25hdGlvbmFsX2RpZ2lzX3JlY2VpdmVkID0gMTsKKwkJCQlmYWNpbGl0aWVzLT5zb3VyY2VfbmRpZ2lzID0gMDsKKwkJCQlmYWNpbGl0aWVzLT5kZXN0X25kaWdpcyAgID0gMDsKKwkJCQlmb3IgKHB0ID0gcCArIDIsIGxnID0gMCA7IGxnIDwgbCA7IHB0ICs9IEFYMjVfQUREUl9MRU4sIGxnICs9IEFYMjVfQUREUl9MRU4pIHsKKwkJCQkJaWYgKHB0WzZdICYgQVgyNV9IQklUKQorCQkJCQkJbWVtY3B5KCZmYWNpbGl0aWVzLT5kZXN0X2RpZ2lzW2ZhY2lsaXRpZXMtPmRlc3RfbmRpZ2lzKytdLCBwdCwgQVgyNV9BRERSX0xFTik7CisJCQkJCWVsc2UKKwkJCQkJCW1lbWNweSgmZmFjaWxpdGllcy0+c291cmNlX2RpZ2lzW2ZhY2lsaXRpZXMtPnNvdXJjZV9uZGlnaXMrK10sIHB0LCBBWDI1X0FERFJfTEVOKTsKKwkJCQl9CisJCQl9CisJCQlwICAgKz0gbCArIDI7CisJCQluICAgKz0gbCArIDI7CisJCQlsZW4gLT0gbCArIDI7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKCpwICE9IDB4MDAgJiYgbGVuID4gMCk7CisKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCByb3NlX3BhcnNlX2NjaXR0KHVuc2lnbmVkIGNoYXIgKnAsIHN0cnVjdCByb3NlX2ZhY2lsaXRpZXNfc3RydWN0ICpmYWNpbGl0aWVzLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgbCwgbiA9IDA7CisJY2hhciBjYWxsc2lnblsxMV07CisKKwlkbyB7CisJCXN3aXRjaCAoKnAgJiAweEMwKSB7CisJCWNhc2UgMHgwMDoKKwkJCXAgICArPSAyOworCQkJbiAgICs9IDI7CisJCQlsZW4gLT0gMjsKKwkJCWJyZWFrOworCisJCWNhc2UgMHg0MDoKKwkJCXAgICArPSAzOworCQkJbiAgICs9IDM7CisJCQlsZW4gLT0gMzsKKwkJCWJyZWFrOworCisJCWNhc2UgMHg4MDoKKwkJCXAgICArPSA0OworCQkJbiAgICs9IDQ7CisJCQlsZW4gLT0gNDsKKwkJCWJyZWFrOworCisJCWNhc2UgMHhDMDoKKwkJCWwgPSBwWzFdOworCQkJaWYgKCpwID09IEZBQ19DQ0lUVF9ERVNUX05TQVApIHsKKwkJCQltZW1jcHkoJmZhY2lsaXRpZXMtPnNvdXJjZV9hZGRyLCBwICsgNywgUk9TRV9BRERSX0xFTik7CisJCQkJbWVtY3B5KGNhbGxzaWduLCBwICsgMTIsICAgbCAtIDEwKTsKKwkJCQljYWxsc2lnbltsIC0gMTBdID0gJ1wwJzsKKwkJCQlmYWNpbGl0aWVzLT5zb3VyY2VfY2FsbCA9ICphc2MyYXgoY2FsbHNpZ24pOworCQkJfQorCQkJaWYgKCpwID09IEZBQ19DQ0lUVF9TUkNfTlNBUCkgeworCQkJCW1lbWNweSgmZmFjaWxpdGllcy0+ZGVzdF9hZGRyLCBwICsgNywgUk9TRV9BRERSX0xFTik7CisJCQkJbWVtY3B5KGNhbGxzaWduLCBwICsgMTIsIGwgLSAxMCk7CisJCQkJY2FsbHNpZ25bbCAtIDEwXSA9ICdcMCc7CisJCQkJZmFjaWxpdGllcy0+ZGVzdF9jYWxsID0gKmFzYzJheChjYWxsc2lnbik7CisJCQl9CisJCQlwICAgKz0gbCArIDI7CisJCQluICAgKz0gbCArIDI7CisJCQlsZW4gLT0gbCArIDI7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKCpwICE9IDB4MDAgJiYgbGVuID4gMCk7CisKKwlyZXR1cm4gbjsKK30KKworaW50IHJvc2VfcGFyc2VfZmFjaWxpdGllcyh1bnNpZ25lZCBjaGFyICpwLAorCXN0cnVjdCByb3NlX2ZhY2lsaXRpZXNfc3RydWN0ICpmYWNpbGl0aWVzKQoreworCWludCBmYWNpbGl0aWVzX2xlbiwgbGVuOworCisJZmFjaWxpdGllc19sZW4gPSAqcCsrOworCisJaWYgKGZhY2lsaXRpZXNfbGVuID09IDApCisJCXJldHVybiAwOworCisJd2hpbGUgKGZhY2lsaXRpZXNfbGVuID4gMCkgeworCQlpZiAoKnAgPT0gMHgwMCkgeworCQkJZmFjaWxpdGllc19sZW4tLTsKKwkJCXArKzsKKworCQkJc3dpdGNoICgqcCkgeworCQkJY2FzZSBGQUNfTkFUSU9OQUw6CQkvKiBOYXRpb25hbCAqLworCQkJCWxlbiA9IHJvc2VfcGFyc2VfbmF0aW9uYWwocCArIDEsIGZhY2lsaXRpZXMsIGZhY2lsaXRpZXNfbGVuIC0gMSk7CisJCQkJZmFjaWxpdGllc19sZW4gLT0gbGVuICsgMTsKKwkJCQlwICs9IGxlbiArIDE7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRkFDX0NDSVRUOgkJLyogQ0NJVFQgKi8KKwkJCQlsZW4gPSByb3NlX3BhcnNlX2NjaXR0KHAgKyAxLCBmYWNpbGl0aWVzLCBmYWNpbGl0aWVzX2xlbiAtIDEpOworCQkJCWZhY2lsaXRpZXNfbGVuIC09IGxlbiArIDE7CisJCQkJcCArPSBsZW4gKyAxOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhLRVJOX0RFQlVHICJST1NFOiByb3NlX3BhcnNlX2ZhY2lsaXRpZXMgLSB1bmtub3duIGZhY2lsaXRpZXMgZmFtaWx5ICUwMlhcbiIsICpwKTsKKwkJCQlmYWNpbGl0aWVzX2xlbi0tOworCQkJCXArKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlCisJCQlicmVhazsJLyogRXJyb3IgaW4gZmFjaWxpdGllcyBmb3JtYXQgKi8KKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCByb3NlX2NyZWF0ZV9mYWNpbGl0aWVzKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgc3RydWN0IHJvc2Vfc29jayAqcm9zZSkKK3sKKwl1bnNpZ25lZCBjaGFyICpwID0gYnVmZmVyICsgMTsKKwljaGFyICpjYWxsc2lnbjsKKwlpbnQgbGVuLCBuYjsKKworCS8qIE5hdGlvbmFsIEZhY2lsaXRpZXMgKi8KKwlpZiAocm9zZS0+cmFuZCAhPSAwIHx8IHJvc2UtPnNvdXJjZV9uZGlnaXMgPT0gMSB8fCByb3NlLT5kZXN0X25kaWdpcyA9PSAxKSB7CisJCSpwKysgPSAweDAwOworCQkqcCsrID0gRkFDX05BVElPTkFMOworCisJCWlmIChyb3NlLT5yYW5kICE9IDApIHsKKwkJCSpwKysgPSBGQUNfTkFUSU9OQUxfUkFORDsKKwkJCSpwKysgPSAocm9zZS0+cmFuZCA+PiA4KSAmIDB4RkY7CisJCQkqcCsrID0gKHJvc2UtPnJhbmQgPj4gMCkgJiAweEZGOworCQl9CisKKwkJLyogU2VudCBiZWZvcmUgb2xkZXIgZmFjaWxpdGllcyAqLworCQlpZiAoKHJvc2UtPnNvdXJjZV9uZGlnaXMgPiAwKSB8fCAocm9zZS0+ZGVzdF9uZGlnaXMgPiAwKSkgeworCQkJaW50IG1heGRpZ2kgPSAwOworCQkJKnArKyA9IEZBQ19OQVRJT05BTF9ESUdJUzsKKwkJCSpwKysgPSBBWDI1X0FERFJfTEVOICogKHJvc2UtPnNvdXJjZV9uZGlnaXMgKyByb3NlLT5kZXN0X25kaWdpcyk7CisJCQlmb3IgKG5iID0gMCA7IG5iIDwgcm9zZS0+c291cmNlX25kaWdpcyA7IG5iKyspIHsKKwkJCQlpZiAoKyttYXhkaWdpID49IFJPU0VfTUFYX0RJR0lTKQorCQkJCQlicmVhazsKKwkJCQltZW1jcHkocCwgJnJvc2UtPnNvdXJjZV9kaWdpc1tuYl0sIEFYMjVfQUREUl9MRU4pOworCQkJCXBbNl0gfD0gQVgyNV9IQklUOworCQkJCXAgKz0gQVgyNV9BRERSX0xFTjsKKwkJCX0KKwkJCWZvciAobmIgPSAwIDsgbmIgPCByb3NlLT5kZXN0X25kaWdpcyA7IG5iKyspIHsKKwkJCQlpZiAoKyttYXhkaWdpID49IFJPU0VfTUFYX0RJR0lTKQorCQkJCQlicmVhazsKKwkJCQltZW1jcHkocCwgJnJvc2UtPmRlc3RfZGlnaXNbbmJdLCBBWDI1X0FERFJfTEVOKTsKKwkJCQlwWzZdICY9IH5BWDI1X0hCSVQ7CisJCQkJcCArPSBBWDI1X0FERFJfTEVOOworCQkJfQorCQl9CisKKwkJLyogRm9yIGNvbXBhdGliaWxpdHkgKi8KKwkJaWYgKHJvc2UtPnNvdXJjZV9uZGlnaXMgPiAwKSB7CisJCQkqcCsrID0gRkFDX05BVElPTkFMX1NSQ19ESUdJOworCQkJKnArKyA9IEFYMjVfQUREUl9MRU47CisJCQltZW1jcHkocCwgJnJvc2UtPnNvdXJjZV9kaWdpc1swXSwgQVgyNV9BRERSX0xFTik7CisJCQlwICAgKz0gQVgyNV9BRERSX0xFTjsKKwkJfQorCisJCS8qIEZvciBjb21wYXRpYmlsaXR5ICovCisJCWlmIChyb3NlLT5kZXN0X25kaWdpcyA+IDApIHsKKwkJCSpwKysgPSBGQUNfTkFUSU9OQUxfREVTVF9ESUdJOworCQkJKnArKyA9IEFYMjVfQUREUl9MRU47CisJCQltZW1jcHkocCwgJnJvc2UtPmRlc3RfZGlnaXNbMF0sIEFYMjVfQUREUl9MRU4pOworCQkJcCAgICs9IEFYMjVfQUREUl9MRU47CisJCX0KKwl9CisKKwkqcCsrID0gMHgwMDsKKwkqcCsrID0gRkFDX0NDSVRUOworCisJKnArKyA9IEZBQ19DQ0lUVF9ERVNUX05TQVA7CisKKwljYWxsc2lnbiA9IGF4MmFzYygmcm9zZS0+ZGVzdF9jYWxsKTsKKworCSpwKysgPSBzdHJsZW4oY2FsbHNpZ24pICsgMTA7CisJKnArKyA9IChzdHJsZW4oY2FsbHNpZ24pICsgOSkgKiAyOwkJLyogPz8/ICovCisKKwkqcCsrID0gMHg0NzsgKnArKyA9IDB4MDA7ICpwKysgPSAweDExOworCSpwKysgPSBST1NFX0FERFJfTEVOICogMjsKKwltZW1jcHkocCwgJnJvc2UtPmRlc3RfYWRkciwgUk9TRV9BRERSX0xFTik7CisJcCAgICs9IFJPU0VfQUREUl9MRU47CisKKwltZW1jcHkocCwgY2FsbHNpZ24sIHN0cmxlbihjYWxsc2lnbikpOworCXAgICArPSBzdHJsZW4oY2FsbHNpZ24pOworCisJKnArKyA9IEZBQ19DQ0lUVF9TUkNfTlNBUDsKKworCWNhbGxzaWduID0gYXgyYXNjKCZyb3NlLT5zb3VyY2VfY2FsbCk7CisKKwkqcCsrID0gc3RybGVuKGNhbGxzaWduKSArIDEwOworCSpwKysgPSAoc3RybGVuKGNhbGxzaWduKSArIDkpICogMjsJCS8qID8/PyAqLworCisJKnArKyA9IDB4NDc7ICpwKysgPSAweDAwOyAqcCsrID0gMHgxMTsKKwkqcCsrID0gUk9TRV9BRERSX0xFTiAqIDI7CisJbWVtY3B5KHAsICZyb3NlLT5zb3VyY2VfYWRkciwgUk9TRV9BRERSX0xFTik7CisJcCAgICs9IFJPU0VfQUREUl9MRU47CisKKwltZW1jcHkocCwgY2FsbHNpZ24sIHN0cmxlbihjYWxsc2lnbikpOworCXAgICArPSBzdHJsZW4oY2FsbHNpZ24pOworCisJbGVuICAgICAgID0gcCAtIGJ1ZmZlcjsKKwlidWZmZXJbMF0gPSBsZW4gLSAxOworCisJcmV0dXJuIGxlbjsKK30KKwordm9pZCByb3NlX2Rpc2Nvbm5lY3Qoc3RydWN0IHNvY2sgKnNrLCBpbnQgcmVhc29uLCBpbnQgY2F1c2UsIGludCBkaWFnbm9zdGljKQoreworCXN0cnVjdCByb3NlX3NvY2sgKnJvc2UgPSByb3NlX3NrKHNrKTsKKworCXJvc2Vfc3RvcF90aW1lcihzayk7CisJcm9zZV9zdG9wX2lkbGV0aW1lcihzayk7CisKKwlyb3NlX2NsZWFyX3F1ZXVlcyhzayk7CisKKwlyb3NlLT5sY2kgICA9IDA7CisJcm9zZS0+c3RhdGUgPSBST1NFX1NUQVRFXzA7CisKKwlpZiAoY2F1c2UgIT0gLTEpCisJCXJvc2UtPmNhdXNlID0gY2F1c2U7CisKKwlpZiAoZGlhZ25vc3RpYyAhPSAtMSkKKwkJcm9zZS0+ZGlhZ25vc3RpYyA9IGRpYWdub3N0aWM7CisKKwlzay0+c2tfc3RhdGUgICAgID0gVENQX0NMT1NFOworCXNrLT5za19lcnIgICAgICAgPSByZWFzb247CisJc2stPnNrX3NodXRkb3duIHw9IFNFTkRfU0hVVERPV047CisKKwlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkgeworCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKKwkJc29ja19zZXRfZmxhZyhzaywgU09DS19ERUFEKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9uZXQvcm9zZS9yb3NlX3RpbWVyLmMgYi9uZXQvcm9zZS9yb3NlX3RpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRkZDQ0MAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yb3NlL3Jvc2VfdGltZXIuYwpAQCAtMCwwICsxLDIxNiBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQ29weXJpZ2h0IChDKSBKb25hdGhhbiBOYXlsb3IgRzRLTFggKGc0a2x4QGc0a2x4LmRlbW9uLmNvLnVrKQorICogQ29weXJpZ2h0IChDKSAyMDAyIFJhbGYgQmFlY2hsZSBETzFHUkIgKHJhbGZAZ251Lm9yZykKKyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxuZXQvYXgyNS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPG5ldC9yb3NlLmg+CisKK3N0YXRpYyB2b2lkIHJvc2VfaGVhcnRiZWF0X2V4cGlyeSh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyB2b2lkIHJvc2VfdGltZXJfZXhwaXJ5KHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgcm9zZV9pZGxldGltZXJfZXhwaXJ5KHVuc2lnbmVkIGxvbmcpOworCit2b2lkIHJvc2Vfc3RhcnRfaGVhcnRiZWF0KHN0cnVjdCBzb2NrICpzaykKK3sKKwlkZWxfdGltZXIoJnNrLT5za190aW1lcik7CisKKwlzay0+c2tfdGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZylzazsKKwlzay0+c2tfdGltZXIuZnVuY3Rpb24gPSAmcm9zZV9oZWFydGJlYXRfZXhwaXJ5OworCXNrLT5za190aW1lci5leHBpcmVzICA9IGppZmZpZXMgKyA1ICogSFo7CisKKwlhZGRfdGltZXIoJnNrLT5za190aW1lcik7Cit9CisKK3ZvaWQgcm9zZV9zdGFydF90MXRpbWVyKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3Qgcm9zZV9zb2NrICpyb3NlID0gcm9zZV9zayhzayk7CisKKwlkZWxfdGltZXIoJnJvc2UtPnRpbWVyKTsKKworCXJvc2UtPnRpbWVyLmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpc2s7CisJcm9zZS0+dGltZXIuZnVuY3Rpb24gPSAmcm9zZV90aW1lcl9leHBpcnk7CisJcm9zZS0+dGltZXIuZXhwaXJlcyAgPSBqaWZmaWVzICsgcm9zZS0+dDE7CisKKwlhZGRfdGltZXIoJnJvc2UtPnRpbWVyKTsKK30KKwordm9pZCByb3NlX3N0YXJ0X3QydGltZXIoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCByb3NlX3NvY2sgKnJvc2UgPSByb3NlX3NrKHNrKTsKKworCWRlbF90aW1lcigmcm9zZS0+dGltZXIpOworCisJcm9zZS0+dGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZylzazsKKwlyb3NlLT50aW1lci5mdW5jdGlvbiA9ICZyb3NlX3RpbWVyX2V4cGlyeTsKKwlyb3NlLT50aW1lci5leHBpcmVzICA9IGppZmZpZXMgKyByb3NlLT50MjsKKworCWFkZF90aW1lcigmcm9zZS0+dGltZXIpOworfQorCit2b2lkIHJvc2Vfc3RhcnRfdDN0aW1lcihzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHJvc2Vfc29jayAqcm9zZSA9IHJvc2Vfc2soc2spOworCisJZGVsX3RpbWVyKCZyb3NlLT50aW1lcik7CisKKwlyb3NlLT50aW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKXNrOworCXJvc2UtPnRpbWVyLmZ1bmN0aW9uID0gJnJvc2VfdGltZXJfZXhwaXJ5OworCXJvc2UtPnRpbWVyLmV4cGlyZXMgID0gamlmZmllcyArIHJvc2UtPnQzOworCisJYWRkX3RpbWVyKCZyb3NlLT50aW1lcik7Cit9CisKK3ZvaWQgcm9zZV9zdGFydF9oYnRpbWVyKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3Qgcm9zZV9zb2NrICpyb3NlID0gcm9zZV9zayhzayk7CisKKwlkZWxfdGltZXIoJnJvc2UtPnRpbWVyKTsKKworCXJvc2UtPnRpbWVyLmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpc2s7CisJcm9zZS0+dGltZXIuZnVuY3Rpb24gPSAmcm9zZV90aW1lcl9leHBpcnk7CisJcm9zZS0+dGltZXIuZXhwaXJlcyAgPSBqaWZmaWVzICsgcm9zZS0+aGI7CisKKwlhZGRfdGltZXIoJnJvc2UtPnRpbWVyKTsKK30KKwordm9pZCByb3NlX3N0YXJ0X2lkbGV0aW1lcihzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHJvc2Vfc29jayAqcm9zZSA9IHJvc2Vfc2soc2spOworCisJZGVsX3RpbWVyKCZyb3NlLT5pZGxldGltZXIpOworCisJaWYgKHJvc2UtPmlkbGUgPiAwKSB7CisJCXJvc2UtPmlkbGV0aW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKXNrOworCQlyb3NlLT5pZGxldGltZXIuZnVuY3Rpb24gPSAmcm9zZV9pZGxldGltZXJfZXhwaXJ5OworCQlyb3NlLT5pZGxldGltZXIuZXhwaXJlcyAgPSBqaWZmaWVzICsgcm9zZS0+aWRsZTsKKworCQlhZGRfdGltZXIoJnJvc2UtPmlkbGV0aW1lcik7CisJfQorfQorCit2b2lkIHJvc2Vfc3RvcF9oZWFydGJlYXQoc3RydWN0IHNvY2sgKnNrKQoreworCWRlbF90aW1lcigmc2stPnNrX3RpbWVyKTsKK30KKwordm9pZCByb3NlX3N0b3BfdGltZXIoc3RydWN0IHNvY2sgKnNrKQoreworCWRlbF90aW1lcigmcm9zZV9zayhzayktPnRpbWVyKTsKK30KKwordm9pZCByb3NlX3N0b3BfaWRsZXRpbWVyKHN0cnVjdCBzb2NrICpzaykKK3sKKwlkZWxfdGltZXIoJnJvc2Vfc2soc2spLT5pZGxldGltZXIpOworfQorCitzdGF0aWMgdm9pZCByb3NlX2hlYXJ0YmVhdF9leHBpcnkodW5zaWduZWQgbG9uZyBwYXJhbSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSAoc3RydWN0IHNvY2sgKilwYXJhbTsKKwlzdHJ1Y3Qgcm9zZV9zb2NrICpyb3NlID0gcm9zZV9zayhzayk7CisKKwliaF9sb2NrX3NvY2soc2spOworCXN3aXRjaCAocm9zZS0+c3RhdGUpIHsKKwljYXNlIFJPU0VfU1RBVEVfMDoKKwkJLyogTWFnaWMgaGVyZTogSWYgd2UgbGlzdGVuKCkgYW5kIGEgbmV3IGxpbmsgZGllcyBiZWZvcmUgaXQKKwkJICAgaXMgYWNjZXB0ZWQoKSBpdCBpc24ndCAnZGVhZCcgc28gZG9lc24ndCBnZXQgcmVtb3ZlZC4gKi8KKwkJaWYgKHNvY2tfZmxhZyhzaywgU09DS19ERVNUUk9ZKSB8fAorCQkgICAgKHNrLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOICYmIHNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkpIHsKKwkJCXJvc2VfZGVzdHJveV9zb2NrZXQoc2spOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCisJY2FzZSBST1NFX1NUQVRFXzM6CisJCS8qCisJCSAqIENoZWNrIGZvciB0aGUgc3RhdGUgb2YgdGhlIHJlY2VpdmUgYnVmZmVyLgorCQkgKi8KKwkJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPCAoc2stPnNrX3JjdmJ1ZiAvIDIpICYmCisJCSAgICAocm9zZS0+Y29uZGl0aW9uICYgUk9TRV9DT05EX09XTl9SWF9CVVNZKSkgeworCQkJcm9zZS0+Y29uZGl0aW9uICY9IH5ST1NFX0NPTkRfT1dOX1JYX0JVU1k7CisJCQlyb3NlLT5jb25kaXRpb24gJj0gflJPU0VfQ09ORF9BQ0tfUEVORElORzsKKwkJCXJvc2UtPnZsICAgICAgICAgPSByb3NlLT52cjsKKwkJCXJvc2Vfd3JpdGVfaW50ZXJuYWwoc2ssIFJPU0VfUlIpOworCQkJcm9zZV9zdG9wX3RpbWVyKHNrKTsJLyogSEIgKi8KKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKworCXJvc2Vfc3RhcnRfaGVhcnRiZWF0KHNrKTsKKwliaF91bmxvY2tfc29jayhzayk7Cit9CisKK3N0YXRpYyB2b2lkIHJvc2VfdGltZXJfZXhwaXJ5KHVuc2lnbmVkIGxvbmcgcGFyYW0pCit7CisJc3RydWN0IHNvY2sgKnNrID0gKHN0cnVjdCBzb2NrICopcGFyYW07CisJc3RydWN0IHJvc2Vfc29jayAqcm9zZSA9IHJvc2Vfc2soc2spOworCisJYmhfbG9ja19zb2NrKHNrKTsKKwlzd2l0Y2ggKHJvc2UtPnN0YXRlKSB7CisJY2FzZSBST1NFX1NUQVRFXzE6CS8qIFQxICovCisJY2FzZSBST1NFX1NUQVRFXzQ6CS8qIFQyICovCisJCXJvc2Vfd3JpdGVfaW50ZXJuYWwoc2ssIFJPU0VfQ0xFQVJfUkVRVUVTVCk7CisJCXJvc2UtPnN0YXRlID0gUk9TRV9TVEFURV8yOworCQlyb3NlX3N0YXJ0X3QzdGltZXIoc2spOworCQlicmVhazsKKworCWNhc2UgUk9TRV9TVEFURV8yOgkvKiBUMyAqLworCQlyb3NlLT5uZWlnaGJvdXItPnVzZS0tOworCQlyb3NlX2Rpc2Nvbm5lY3Qoc2ssIEVUSU1FRE9VVCwgLTEsIC0xKTsKKwkJYnJlYWs7CisKKwljYXNlIFJPU0VfU1RBVEVfMzoJLyogSEIgKi8KKwkJaWYgKHJvc2UtPmNvbmRpdGlvbiAmIFJPU0VfQ09ORF9BQ0tfUEVORElORykgeworCQkJcm9zZS0+Y29uZGl0aW9uICY9IH5ST1NFX0NPTkRfQUNLX1BFTkRJTkc7CisJCQlyb3NlX2VucXVpcnlfcmVzcG9uc2Uoc2spOworCQl9CisJCWJyZWFrOworCX0KKwliaF91bmxvY2tfc29jayhzayk7Cit9CisKK3N0YXRpYyB2b2lkIHJvc2VfaWRsZXRpbWVyX2V4cGlyeSh1bnNpZ25lZCBsb25nIHBhcmFtKQoreworCXN0cnVjdCBzb2NrICpzayA9IChzdHJ1Y3Qgc29jayAqKXBhcmFtOworCisJYmhfbG9ja19zb2NrKHNrKTsKKwlyb3NlX2NsZWFyX3F1ZXVlcyhzayk7CisKKwlyb3NlX3dyaXRlX2ludGVybmFsKHNrLCBST1NFX0NMRUFSX1JFUVVFU1QpOworCXJvc2Vfc2soc2spLT5zdGF0ZSA9IFJPU0VfU1RBVEVfMjsKKworCXJvc2Vfc3RhcnRfdDN0aW1lcihzayk7CisKKwlzay0+c2tfc3RhdGUgICAgID0gVENQX0NMT1NFOworCXNrLT5za19lcnIgICAgICAgPSAwOworCXNrLT5za19zaHV0ZG93biB8PSBTRU5EX1NIVVRET1dOOworCisJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpIHsKKwkJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfREVBRCk7CisJfQorCWJoX3VubG9ja19zb2NrKHNrKTsKK30KZGlmZiAtLWdpdCBhL25ldC9yb3NlL3N5c2N0bF9uZXRfcm9zZS5jIGIvbmV0L3Jvc2Uvc3lzY3RsX25ldF9yb3NlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU0OGM3YwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yb3NlL3N5c2N0bF9uZXRfcm9zZS5jCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYgTWlrZSBTaGF2ZXIgKHNoYXZlckB6ZXJva25vd2xlZGdlLmNvbSkKKyAqLworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPG5ldC9heDI1Lmg+CisjaW5jbHVkZSA8bmV0L3Jvc2UuaD4KKworc3RhdGljIGludCBtaW5fdGltZXJbXSAgPSB7MSAqIEhafTsKK3N0YXRpYyBpbnQgbWF4X3RpbWVyW10gID0gezMwMCAqIEhafTsKK3N0YXRpYyBpbnQgbWluX2lkbGVbXSAgID0gezAgKiBIWn07CitzdGF0aWMgaW50IG1heF9pZGxlW10gICA9IHs2NTUzNSAqIEhafTsKK3N0YXRpYyBpbnQgbWluX3JvdXRlWzFdLCAgICAgICBtYXhfcm91dGVbXSA9IHsxfTsKK3N0YXRpYyBpbnQgbWluX2Z0aW1lcltdID0gezYwICogSFp9Oworc3RhdGljIGludCBtYXhfZnRpbWVyW10gPSB7NjAwICogSFp9Oworc3RhdGljIGludCBtaW5fbWF4dmNzW10gPSB7MX0sIG1heF9tYXh2Y3NbXSA9IHsyNTR9Oworc3RhdGljIGludCBtaW5fd2luZG93W10gPSB7MX0sIG1heF93aW5kb3dbXSA9IHs3fTsKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpyb3NlX3RhYmxlX2hlYWRlcjsKKworc3RhdGljIGN0bF90YWJsZSByb3NlX3RhYmxlW10gPSB7CisgICAgICAgIHsKKwkJLmN0bF9uYW1lCT0gTkVUX1JPU0VfUkVTVEFSVF9SRVFVRVNUX1RJTUVPVVQsCisJCS5wcm9jbmFtZQk9ICJyZXN0YXJ0X3JlcXVlc3RfdGltZW91dCIsCisJCS5kYXRhCQk9ICZzeXNjdGxfcm9zZV9yZXN0YXJ0X3JlcXVlc3RfdGltZW91dCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl90aW1lciwKKwkJLmV4dHJhMgkJPSAmbWF4X3RpbWVyCisJfSwKKyAgICAgICAgeworCQkuY3RsX25hbWUJPSBORVRfUk9TRV9DQUxMX1JFUVVFU1RfVElNRU9VVCwKKwkJLnByb2NuYW1lCT0gImNhbGxfcmVxdWVzdF90aW1lb3V0IiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9yb3NlX2NhbGxfcmVxdWVzdF90aW1lb3V0LAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmbWluX3RpbWVyLAorCQkuZXh0cmEyCQk9ICZtYXhfdGltZXIKKwl9LAorICAgICAgICB7CisJCS5jdGxfbmFtZQk9IE5FVF9ST1NFX1JFU0VUX1JFUVVFU1RfVElNRU9VVCwKKwkJLnByb2NuYW1lCT0gInJlc2V0X3JlcXVlc3RfdGltZW91dCIsCisJCS5kYXRhCQk9ICZzeXNjdGxfcm9zZV9yZXNldF9yZXF1ZXN0X3RpbWVvdXQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZtaW5fdGltZXIsCisJCS5leHRyYTIJCT0gJm1heF90aW1lcgorCX0sCisgICAgICAgIHsKKwkJLmN0bF9uYW1lCT0gTkVUX1JPU0VfQ0xFQVJfUkVRVUVTVF9USU1FT1VULAorCQkucHJvY25hbWUJPSAiY2xlYXJfcmVxdWVzdF90aW1lb3V0IiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9yb3NlX2NsZWFyX3JlcXVlc3RfdGltZW91dCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl90aW1lciwKKwkJLmV4dHJhMgkJPSAmbWF4X3RpbWVyCisJfSwKKyAgICAgICAgeworCQkuY3RsX25hbWUJPSBORVRfUk9TRV9OT19BQ1RJVklUWV9USU1FT1VULAorCQkucHJvY25hbWUJPSAibm9fYWN0aXZpdHlfdGltZW91dCIsCisJCS5kYXRhCQk9ICZzeXNjdGxfcm9zZV9ub19hY3Rpdml0eV90aW1lb3V0LAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmbWluX2lkbGUsCisJCS5leHRyYTIJCT0gJm1heF9pZGxlCisJfSwKKyAgICAgICAgeworCQkuY3RsX25hbWUJPSBORVRfUk9TRV9BQ0tfSE9MRF9CQUNLX1RJTUVPVVQsCisJCS5wcm9jbmFtZQk9ICJhY2tub3dsZWRnZV9ob2xkX2JhY2tfdGltZW91dCIsCisJCS5kYXRhCQk9ICZzeXNjdGxfcm9zZV9hY2tfaG9sZF9iYWNrX3RpbWVvdXQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZtaW5fdGltZXIsCisJCS5leHRyYTIJCT0gJm1heF90aW1lcgorCX0sCisgICAgICAgIHsKKwkJLmN0bF9uYW1lCT0gTkVUX1JPU0VfUk9VVElOR19DT05UUk9MLAorCQkucHJvY25hbWUJPSAicm91dGluZ19jb250cm9sIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9yb3NlX3JvdXRpbmdfY29udHJvbCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl9yb3V0ZSwKKwkJLmV4dHJhMgkJPSAmbWF4X3JvdXRlCisJfSwKKyAgICAgICAgeworCQkuY3RsX25hbWUJPSBORVRfUk9TRV9MSU5LX0ZBSUxfVElNRU9VVCwKKwkJLnByb2NuYW1lCT0gImxpbmtfZmFpbF90aW1lb3V0IiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9yb3NlX2xpbmtfZmFpbF90aW1lb3V0LAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmbWluX2Z0aW1lciwKKwkJLmV4dHJhMgkJPSAmbWF4X2Z0aW1lcgorCX0sCisgICAgICAgIHsKKwkJLmN0bF9uYW1lCT0gTkVUX1JPU0VfTUFYX1ZDUywKKwkJLnByb2NuYW1lCT0gIm1heGltdW1fdmlydHVhbF9jaXJjdWl0cyIsCisJCS5kYXRhCQk9ICZzeXNjdGxfcm9zZV9tYXhpbXVtX3ZjcywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm1pbl9tYXh2Y3MsCisJCS5leHRyYTIJCT0gJm1heF9tYXh2Y3MKKwl9LAorICAgICAgICB7CisJCS5jdGxfbmFtZQk9IE5FVF9ST1NFX1dJTkRPV19TSVpFLAorCQkucHJvY25hbWUJPSAid2luZG93X3NpemUiLAorCQkuZGF0YQkJPSAmc3lzY3RsX3Jvc2Vfd2luZG93X3NpemUsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZtaW5fd2luZG93LAorCQkuZXh0cmEyCQk9ICZtYXhfd2luZG93CisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIGN0bF90YWJsZSByb3NlX2Rpcl90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX1JPU0UsCisJCS5wcm9jbmFtZQk9ICJyb3NlIiwKKwkJLm1vZGUJCT0gMDU1NSwKKwkJLmNoaWxkCQk9IHJvc2VfdGFibGUKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCitzdGF0aWMgY3RsX3RhYmxlIHJvc2Vfcm9vdF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX05FVCwKKwkJLnByb2NuYW1lCT0gIm5ldCIsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSByb3NlX2Rpcl90YWJsZQorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3ZvaWQgX19pbml0IHJvc2VfcmVnaXN0ZXJfc3lzY3RsKHZvaWQpCit7CisJcm9zZV90YWJsZV9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUocm9zZV9yb290X3RhYmxlLCAxKTsKK30KKwordm9pZCByb3NlX3VucmVnaXN0ZXJfc3lzY3RsKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUocm9zZV90YWJsZV9oZWFkZXIpOworfQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL01ha2VmaWxlIGIvbmV0L3J4cnBjL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZmNiNmYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcnhycGMvTWFrZWZpbGUKQEAgLTAsMCArMSwyNSBAQAorIworIyBNYWtlZmlsZSBmb3IgTGludXgga2VybmVsIFJ4IFJQQworIworCisjQ0ZMQUdTICs9IC1maW5zdHJ1bWVudC1mdW5jdGlvbnMKKworcnhycGMtb2JqcyA6PSBcCisJY2FsbC5vIFwKKwljb25uZWN0aW9uLm8gXAorCWtyeGlvZC5vIFwKKwlrcnhzZWNkLm8gXAorCWtyeHRpbW9kLm8gXAorCW1haW4ubyBcCisJcGVlci5vIFwKKwlyeHJwY19zeW1zLm8gXAorCXRyYW5zcG9ydC5vCisKK2lmZXEgKCQoQ09ORklHX1BST0NfRlMpLHkpCityeHJwYy1vYmpzICs9IHByb2MubworZW5kaWYKK2lmZXEgKCQoQ09ORklHX1NZU0NUTCkseSkKK3J4cnBjLW9ianMgKz0gc3lzY3RsLm8KK2VuZGlmCisKK29iai0kKENPTkZJR19SWFJQQykgOj0gcnhycGMubwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2NhbGwuYyBiL25ldC9yeHJwYy9jYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNmZDRjYQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy9jYWxsLmMKQEAgLTAsMCArMSwyMjc4IEBACisvKiBjYWxsLmM6IFJ4IGNhbGwgcm91dGluZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPHJ4cnBjL3J4cnBjLmg+CisjaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8cnhycGMvcGVlci5oPgorI2luY2x1ZGUgPHJ4cnBjL2Nvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxyeHJwYy9jYWxsLmg+CisjaW5jbHVkZSA8cnhycGMvbWVzc2FnZS5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK19fUlhBQ0NUX0RFQ0woYXRvbWljX3QgcnhycGNfY2FsbF9jb3VudCk7CitfX1JYQUNDVF9ERUNMKGF0b21pY190IHJ4cnBjX21lc3NhZ2VfY291bnQpOworCitMSVNUX0hFQUQocnhycGNfY2FsbHMpOworREVDTEFSRV9SV1NFTShyeHJwY19jYWxsc19zZW0pOworCit1bnNpZ25lZCByeHJwY19jYWxsX3Jjdl90aW1lb3V0CQkJPSBIWi8zOworc3RhdGljIHVuc2lnbmVkIHJ4cnBjX2NhbGxfYWNrc190aW1lb3V0CQk9IEhaLzM7CitzdGF0aWMgdW5zaWduZWQgcnhycGNfY2FsbF9kZnJfYWNrX3RpbWVvdXQJPSBIWi8yMDsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCByeHJwY19jYWxsX21heF9yZXNlbmQJPSBIWi8xMDsKKworY29uc3QgY2hhciAqcnhycGNfY2FsbF9zdGF0ZXNbXSA9IHsKKwkiQ09NUExFVEUiLAorCSJFUlJPUiIsCisJIlNSVlJfUkNWX09QSUQiLAorCSJTUlZSX1JDVl9BUkdTIiwKKwkiU1JWUl9HT1RfQVJHUyIsCisJIlNSVlJfU05EX1JFUExZIiwKKwkiU1JWUl9SQ1ZfRklOQUxfQUNLIiwKKwkiQ0xOVF9TTkRfQVJHUyIsCisJIkNMTlRfUkNWX1JFUExZIiwKKwkiQ0xOVF9HT1RfUkVQTFkiCit9OworCitjb25zdCBjaGFyICpyeHJwY19jYWxsX2Vycm9yX3N0YXRlc1tdID0geworCSJOT19FUlJPUiIsCisJIkxPQ0FMX0FCT1JUIiwKKwkiUEVFUl9BQk9SVCIsCisJIkxPQ0FMX0VSUk9SIiwKKwkiUkVNT1RFX0VSUk9SIgorfTsKKworY29uc3QgY2hhciAqcnhycGNfcGt0c1tdID0geworCSI/MDAiLAorCSJkYXRhIiwgImFjayIsICJidXN5IiwgImFib3J0IiwgImFja2FsbCIsICJjaGFsbCIsICJyZXNwIiwgImRlYnVnIiwKKwkiPzA5IiwgIj8xMCIsICI/MTEiLCAiPzEyIiwgIj8xMyIsICI/MTQiLCAiPzE1IgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnJ4cnBjX2Fja3NbXSA9IHsKKwkiLS0tIiwgIlJFUSIsICJEVVAiLCAiU0VRIiwgIldJTiIsICJNRU0iLCAiUE5HIiwgIlBOUiIsICJETFkiLCAiSURMIiwKKwkiLT8tIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgX2Fja3R5cGVbXSA9ICJOQS0iOworCitzdGF0aWMgdm9pZCByeHJwY19jYWxsX3JlY2VpdmVfcGFja2V0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsKTsKK3N0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfcmVjZWl2ZV9kYXRhX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkJICAgc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZyk7CitzdGF0aWMgdm9pZCByeHJwY19jYWxsX3JlY2VpdmVfYWNrX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkJICBzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnKTsKK3N0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfZGVmaW5pdGl2ZWx5X0FDSyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkJcnhycGNfc2VxX3QgaGlnZXN0KTsKK3N0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfcmVzZW5kKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCByeHJwY19zZXFfdCBoaWdoZXN0KTsKK3N0YXRpYyBpbnQgX19yeHJwY19jYWxsX3JlYWRfZGF0YShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCk7CisKK3N0YXRpYyBpbnQgcnhycGNfY2FsbF9yZWNvcmRfQUNLKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJCSBzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnLAorCQkJCSByeHJwY19zZXFfdCBzZXEsCisJCQkJIHNpemVfdCBjb3VudCk7CisKK3N0YXRpYyBpbnQgcnhycGNfY2FsbF9mbHVzaChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCk7CisKKyNkZWZpbmUgX3N0YXRlKGNhbGwpIFwKKwlfZGVidWcoIltbWyBzdGF0ZSAlcyBdXV0iLCByeHJwY19jYWxsX3N0YXRlc1tjYWxsLT5hcHBfY2FsbF9zdGF0ZV0pOworCitzdGF0aWMgdm9pZCByeHJwY19jYWxsX2RlZmF1bHRfYXR0bl9mdW5jKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCXdha2VfdXAoJmNhbGwtPndhaXRxKTsKK30KKworc3RhdGljIHZvaWQgcnhycGNfY2FsbF9kZWZhdWx0X2Vycm9yX2Z1bmMoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJd2FrZV91cCgmY2FsbC0+d2FpdHEpOworfQorCitzdGF0aWMgdm9pZCByeHJwY19jYWxsX2RlZmF1bHRfYWVtYXBfZnVuYyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwlzd2l0Y2ggKGNhbGwtPmFwcF9lcnJfc3RhdGUpIHsKKwljYXNlIFJYUlBDX0VTVEFURV9MT0NBTF9BQk9SVDoKKwkJY2FsbC0+YXBwX2Fib3J0X2NvZGUgPSAtY2FsbC0+YXBwX2Vycm5vOworCWNhc2UgUlhSUENfRVNUQVRFX1BFRVJfQUJPUlQ6CisJCWNhbGwtPmFwcF9lcnJubyA9IC1FQ09OTkFCT1JURUQ7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX3J4cnBjX2NhbGxfYWNrc190aW1lb3V0KHVuc2lnbmVkIGxvbmcgX2NhbGwpCit7CisJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwgPSAoc3RydWN0IHJ4cnBjX2NhbGwgKikgX2NhbGw7CisKKwlfZGVidWcoIkFDS1MgVElNRU9VVCAlMDVsdSIsIGppZmZpZXMgLSBjYWxsLT5jamlmKTsKKworCWNhbGwtPmZsYWdzIHw9IFJYUlBDX0NBTExfQUNLU19USU1POworCXJ4cnBjX2tyeGlvZF9xdWV1ZV9jYWxsKGNhbGwpOworfQorCitzdGF0aWMgdm9pZCBfX3J4cnBjX2NhbGxfcmN2X3RpbWVvdXQodW5zaWduZWQgbG9uZyBfY2FsbCkKK3sKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9IChzdHJ1Y3QgcnhycGNfY2FsbCAqKSBfY2FsbDsKKworCV9kZWJ1ZygiUkNWIFRJTUVPVVQgJTA1bHUiLCBqaWZmaWVzIC0gY2FsbC0+Y2ppZik7CisKKwljYWxsLT5mbGFncyB8PSBSWFJQQ19DQUxMX1JDVl9USU1POworCXJ4cnBjX2tyeGlvZF9xdWV1ZV9jYWxsKGNhbGwpOworfQorCitzdGF0aWMgdm9pZCBfX3J4cnBjX2NhbGxfYWNrcl90aW1lb3V0KHVuc2lnbmVkIGxvbmcgX2NhbGwpCit7CisJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwgPSAoc3RydWN0IHJ4cnBjX2NhbGwgKikgX2NhbGw7CisKKwlfZGVidWcoIkFDS1IgVElNRU9VVCAlMDVsdSIsamlmZmllcyAtIGNhbGwtPmNqaWYpOworCisJY2FsbC0+ZmxhZ3MgfD0gUlhSUENfQ0FMTF9BQ0tSX1RJTU87CisJcnhycGNfa3J4aW9kX3F1ZXVlX2NhbGwoY2FsbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjYWxjdWxhdGUgYSB0aW1lb3V0IGJhc2VkIG9uIGFuIFJUVCB2YWx1ZQorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19yeHJwY19ydHRfYmFzZWRfdGltZW91dChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZXhwaXJ5ID0gY2FsbC0+Y29ubi0+cGVlci0+cnR0IC8gKDEwMDAwMDAgLyBIWik7CisKKwlleHBpcnkgKz0gMTA7CisJaWYgKGV4cGlyeSA8IEhaIC8gMjUpCisJCWV4cGlyeSA9IEhaIC8gMjU7CisJaWYgKGV4cGlyeSA+IEhaKQorCQlleHBpcnkgPSBIWjsKKworCV9sZWF2ZSgiID0gJWx1IGppZmZpZXMiLCBleHBpcnkpOworCXJldHVybiBqaWZmaWVzICsgZXhwaXJ5OworfSAvKiBlbmQgX19yeHJwY19ydHRfYmFzZWRfdGltZW91dCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjcmVhdGUgYSBuZXcgY2FsbCByZWNvcmQKKyAqLworc3RhdGljIGlubGluZSBpbnQgX19yeHJwY19jcmVhdGVfY2FsbChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKKwkJCQkgICAgICBzdHJ1Y3QgcnhycGNfY2FsbCAqKl9jYWxsKQoreworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCisJX2VudGVyKCIlcCIsIGNvbm4pOworCisJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpc2UgYSBjYWxsIHJlY29yZCAqLworCWNhbGwgPSAoc3RydWN0IHJ4cnBjX2NhbGwgKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWlmICghY2FsbCkgeworCQlfbGVhdmUoIiBFTk9NRU0iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYXRvbWljX3NldCgmY2FsbC0+dXNhZ2UsIDEpOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmY2FsbC0+d2FpdHEpOworCXNwaW5fbG9ja19pbml0KCZjYWxsLT5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmY2FsbC0+bGluayk7CisJSU5JVF9MSVNUX0hFQUQoJmNhbGwtPmFja3NfcGVuZHEpOworCUlOSVRfTElTVF9IRUFEKCZjYWxsLT5yY3ZfcmVjZWl2ZXEpOworCUlOSVRfTElTVF9IRUFEKCZjYWxsLT5yY3Zfa3J4aW9kcV9sayk7CisJSU5JVF9MSVNUX0hFQUQoJmNhbGwtPmFwcF9yZWFkeXEpOworCUlOSVRfTElTVF9IRUFEKCZjYWxsLT5hcHBfdW5yZWFkeXEpOworCUlOSVRfTElTVF9IRUFEKCZjYWxsLT5hcHBfbGluayk7CisJSU5JVF9MSVNUX0hFQUQoJmNhbGwtPmFwcF9hdHRuX2xpbmspOworCisJaW5pdF90aW1lcigmY2FsbC0+YWNrc190aW1lb3V0KTsKKwljYWxsLT5hY2tzX3RpbWVvdXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBjYWxsOworCWNhbGwtPmFja3NfdGltZW91dC5mdW5jdGlvbiA9IF9fcnhycGNfY2FsbF9hY2tzX3RpbWVvdXQ7CisKKwlpbml0X3RpbWVyKCZjYWxsLT5yY3ZfdGltZW91dCk7CisJY2FsbC0+cmN2X3RpbWVvdXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBjYWxsOworCWNhbGwtPnJjdl90aW1lb3V0LmZ1bmN0aW9uID0gX19yeHJwY19jYWxsX3Jjdl90aW1lb3V0OworCisJaW5pdF90aW1lcigmY2FsbC0+YWNrcl9kZnJfdGltbyk7CisJY2FsbC0+YWNrcl9kZnJfdGltby5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGNhbGw7CisJY2FsbC0+YWNrcl9kZnJfdGltby5mdW5jdGlvbiA9IF9fcnhycGNfY2FsbF9hY2tyX3RpbWVvdXQ7CisKKwljYWxsLT5jb25uID0gY29ubjsKKwljYWxsLT5hY2tyX3dpbl9ib3QgPSAxOworCWNhbGwtPmFja3Jfd2luX3RvcCA9IGNhbGwtPmFja3Jfd2luX2JvdCArIFJYUlBDX0NBTExfQUNLX1dJTkRPV19TSVpFIC0gMTsKKwljYWxsLT5hY2tyX3ByZXZfc2VxID0gMDsKKwljYWxsLT5hcHBfbWFyayA9IFJYUlBDX0FQUF9NQVJLX0VPRjsKKwljYWxsLT5hcHBfYXR0bl9mdW5jID0gcnhycGNfY2FsbF9kZWZhdWx0X2F0dG5fZnVuYzsKKwljYWxsLT5hcHBfZXJyb3JfZnVuYyA9IHJ4cnBjX2NhbGxfZGVmYXVsdF9lcnJvcl9mdW5jOworCWNhbGwtPmFwcF9hZW1hcF9mdW5jID0gcnhycGNfY2FsbF9kZWZhdWx0X2FlbWFwX2Z1bmM7CisJY2FsbC0+YXBwX3Njcl9hbGxvYyA9IGNhbGwtPmFwcF9zY3JhdGNoOworCisJY2FsbC0+Y2ppZiA9IGppZmZpZXM7CisKKwlfbGVhdmUoIiA9IDAgKCVwKSIsIGNhbGwpOworCisJKl9jYWxsID0gY2FsbDsKKworCXJldHVybiAwOworfSAvKiBlbmQgX19yeHJwY19jcmVhdGVfY2FsbCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjcmVhdGUgYSBuZXcgY2FsbCByZWNvcmQgZm9yIG91dGdvaW5nIGNhbGxzCisgKi8KK2ludCByeHJwY19jcmVhdGVfY2FsbChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKKwkJICAgICAgcnhycGNfY2FsbF9hdHRuX2Z1bmNfdCBhdHRuLAorCQkgICAgICByeHJwY19jYWxsX2Vycm9yX2Z1bmNfdCBlcnJvciwKKwkJICAgICAgcnhycGNfY2FsbF9hZW1hcF9mdW5jX3QgYWVtYXAsCisJCSAgICAgIHN0cnVjdCByeHJwY19jYWxsICoqX2NhbGwpCit7CisJREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKKworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCWludCByZXQsIGNpeCwgbG9vcDsKKworCV9lbnRlcigiJXAiLCBjb25uKTsKKworCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIGEgY2FsbCByZWNvcmQgKi8KKwlyZXQgPSBfX3J4cnBjX2NyZWF0ZV9jYWxsKGNvbm4sICZjYWxsKTsKKwlpZiAocmV0IDwgMCkgeworCQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwljYWxsLT5hcHBfY2FsbF9zdGF0ZSA9IFJYUlBDX0NTVEFURV9DTE5UX1NORF9BUkdTOworCWlmIChhdHRuKQorCQljYWxsLT5hcHBfYXR0bl9mdW5jID0gYXR0bjsKKwlpZiAoZXJyb3IpCisJCWNhbGwtPmFwcF9lcnJvcl9mdW5jID0gZXJyb3I7CisJaWYgKGFlbWFwKQorCQljYWxsLT5hcHBfYWVtYXBfZnVuYyA9IGFlbWFwOworCisJX3N0YXRlKGNhbGwpOworCisJc3Bpbl9sb2NrKCZjb25uLT5sb2NrKTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCWFkZF93YWl0X3F1ZXVlKCZjb25uLT5jaGFud2FpdCwgJm15c2VsZik7CisKKyB0cnlfYWdhaW46CisJLyogdHJ5IHRvIGZpbmQgYW4gdW51c2VkIGNoYW5uZWwgKi8KKwlmb3IgKGNpeCA9IDA7IGNpeCA8IDQ7IGNpeCsrKQorCQlpZiAoIWNvbm4tPmNoYW5uZWxzW2NpeF0pCisJCQlnb3RvIG9idGFpbmVkX2NoYW47CisKKwkvKiBubyBmcmVlIGNoYW5uZWxzIC0gd2FpdCBmb3Igb25lIHRvIGJlY29tZSBhdmFpbGFibGUgKi8KKwlyZXQgPSAtRUlOVFI7CisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlnb3RvIGVycm9yX3Vud2FpdDsKKworCXNwaW5fdW5sb2NrKCZjb25uLT5sb2NrKTsKKworCXNjaGVkdWxlKCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCXNwaW5fbG9jaygmY29ubi0+bG9jayk7CisJZ290byB0cnlfYWdhaW47CisKKwkvKiBnb3QgYSBjaGFubmVsIC0gbm93IGF0dGFjaCB0byB0aGUgY29ubmVjdGlvbiAqLworIG9idGFpbmVkX2NoYW46CisJcmVtb3ZlX3dhaXRfcXVldWUoJmNvbm4tPmNoYW53YWl0LCAmbXlzZWxmKTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCisJLyogY29uY29jdCBhIHVuaXF1ZSBjYWxsIG51bWJlciAqLworIG5leHRfY2FsbGlkOgorCWNhbGwtPmNhbGxfaWQgPSBodG9ubCgrK2Nvbm4tPmNhbGxfY291bnRlcik7CisJZm9yIChsb29wID0gMDsgbG9vcCA8IDQ7IGxvb3ArKykKKwkJaWYgKGNvbm4tPmNoYW5uZWxzW2xvb3BdICYmCisJCSAgICBjb25uLT5jaGFubmVsc1tsb29wXS0+Y2FsbF9pZCA9PSBjYWxsLT5jYWxsX2lkKQorCQkJZ290byBuZXh0X2NhbGxpZDsKKworCXJ4cnBjX2dldF9jb25uZWN0aW9uKGNvbm4pOworCWNvbm4tPmNoYW5uZWxzW2NpeF0gPSBjYWxsOyAvKiBhc3NpZ24gX2FmdGVyXyBkb25lIGNhbGxpZCBjaGVjayBsb29wICovCisJZG9fZ2V0dGltZW9mZGF5KCZjb25uLT5hdGltZSk7CisJY2FsbC0+Y2hhbl9peCA9IGh0b25sKGNpeCk7CisKKwlzcGluX3VubG9jaygmY29ubi0+bG9jayk7CisKKwlkb3duX3dyaXRlKCZyeHJwY19jYWxsc19zZW0pOworCWxpc3RfYWRkX3RhaWwoJmNhbGwtPmNhbGxfbGluaywgJnJ4cnBjX2NhbGxzKTsKKwl1cF93cml0ZSgmcnhycGNfY2FsbHNfc2VtKTsKKworCV9fUlhBQ0NUKGF0b21pY19pbmMoJnJ4cnBjX2NhbGxfY291bnQpKTsKKwkqX2NhbGwgPSBjYWxsOworCisJX2xlYXZlKCIgPSAwIChjYWxsPSVwIGNpeD0ldSkiLCBjYWxsLCBjaXgpOworCXJldHVybiAwOworCisgZXJyb3JfdW53YWl0OgorCXJlbW92ZV93YWl0X3F1ZXVlKCZjb25uLT5jaGFud2FpdCwgJm15c2VsZik7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlzcGluX3VubG9jaygmY29ubi0+bG9jayk7CisKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGNhbGwpOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9IC8qIGVuZCByeHJwY19jcmVhdGVfY2FsbCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjcmVhdGUgYSBuZXcgY2FsbCByZWNvcmQgZm9yIGluY29taW5nIGNhbGxzCisgKi8KK2ludCByeHJwY19pbmNvbWluZ19jYWxsKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAorCQkJc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZywKKwkJCXN0cnVjdCByeHJwY19jYWxsICoqX2NhbGwpCit7CisJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7CisJdW5zaWduZWQgY2l4OworCWludCByZXQ7CisKKwljaXggPSBudG9obChtc2ctPmhkci5jaWQpICYgUlhSUENfQ0hBTk5FTE1BU0s7CisKKwlfZW50ZXIoIiVwLCV1LCV1IiwgY29ubiwgbnRvaGwobXNnLT5oZHIuY2FsbE51bWJlciksIGNpeCk7CisKKwkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGlzZSBhIGNhbGwgcmVjb3JkICovCisJcmV0ID0gX19yeHJwY19jcmVhdGVfY2FsbChjb25uLCAmY2FsbCk7CisJaWYgKHJldCA8IDApIHsKKwkJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJY2FsbC0+cGt0X3Jjdl9jb3VudCA9IDE7CisJY2FsbC0+YXBwX2NhbGxfc3RhdGUgPSBSWFJQQ19DU1RBVEVfU1JWUl9SQ1ZfT1BJRDsKKwljYWxsLT5hcHBfbWFyayA9IHNpemVvZih1aW50MzJfdCk7CisKKwlfc3RhdGUoY2FsbCk7CisKKwkvKiBhdHRhY2ggdG8gdGhlIGNvbm5lY3Rpb24gKi8KKwlyZXQgPSAtRUJVU1k7CisJY2FsbC0+Y2hhbl9peCA9IGh0b25sKGNpeCk7CisJY2FsbC0+Y2FsbF9pZCA9IG1zZy0+aGRyLmNhbGxOdW1iZXI7CisKKwlzcGluX2xvY2soJmNvbm4tPmxvY2spOworCisJaWYgKCFjb25uLT5jaGFubmVsc1tjaXhdIHx8CisJICAgIGNvbm4tPmNoYW5uZWxzW2NpeF0tPmFwcF9jYWxsX3N0YXRlID09IFJYUlBDX0NTVEFURV9DT01QTEVURSB8fAorCSAgICBjb25uLT5jaGFubmVsc1tjaXhdLT5hcHBfY2FsbF9zdGF0ZSA9PSBSWFJQQ19DU1RBVEVfRVJST1IKKwkgICAgKSB7CisJCWNvbm4tPmNoYW5uZWxzW2NpeF0gPSBjYWxsOworCQlyeHJwY19nZXRfY29ubmVjdGlvbihjb25uKTsKKwkJcmV0ID0gMDsKKwl9CisKKwlzcGluX3VubG9jaygmY29ubi0+bG9jayk7CisKKwlpZiAocmV0IDwgMCkgeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGNhbGwpOworCQljYWxsID0gTlVMTDsKKwl9CisKKwlpZiAocmV0ID09IDApIHsKKwkJZG93bl93cml0ZSgmcnhycGNfY2FsbHNfc2VtKTsKKwkJbGlzdF9hZGRfdGFpbCgmY2FsbC0+Y2FsbF9saW5rLCAmcnhycGNfY2FsbHMpOworCQl1cF93cml0ZSgmcnhycGNfY2FsbHNfc2VtKTsKKwkJX19SWEFDQ1QoYXRvbWljX2luYygmcnhycGNfY2FsbF9jb3VudCkpOworCQkqX2NhbGwgPSBjYWxsOworCX0KKworCV9sZWF2ZSgiID0gJWQgWyVwXSIsIHJldCwgY2FsbCk7CisJcmV0dXJuIHJldDsKK30gLyogZW5kIHJ4cnBjX2luY29taW5nX2NhbGwoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZnJlZSBhIGNhbGwgcmVjb3JkCisgKi8KK3ZvaWQgcnhycGNfcHV0X2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4gPSBjYWxsLT5jb25uOworCXN0cnVjdCByeHJwY19tZXNzYWdlICptc2c7CisKKwlfZW50ZXIoIiVwe3U9JWR9IixjYWxsLGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSkpOworCisJLyogc2FuaXR5IGNoZWNrICovCisJaWYgKGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSkgPD0gMCkKKwkJQlVHKCk7CisKKwkvKiB0byBwcmV2ZW50IGEgcmFjZSwgdGhlIGRlY3JlbWVudCBhbmQgdGhlIGRlLWxpc3QgbXVzdCBiZSBlZmZlY3RpdmVseQorCSAqIGF0b21pYyAqLworCXNwaW5fbG9jaygmY29ubi0+bG9jayk7CisJaWYgKGxpa2VseSghYXRvbWljX2RlY19hbmRfdGVzdCgmY2FsbC0+dXNhZ2UpKSkgeworCQlzcGluX3VubG9jaygmY29ubi0+bG9jayk7CisJCV9sZWF2ZSgiIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoY29ubi0+Y2hhbm5lbHNbbnRvaGwoY2FsbC0+Y2hhbl9peCldID09IGNhbGwpCisJCWNvbm4tPmNoYW5uZWxzW250b2hsKGNhbGwtPmNoYW5faXgpXSA9IE5VTEw7CisKKwlzcGluX3VubG9jaygmY29ubi0+bG9jayk7CisKKwl3YWtlX3VwKCZjb25uLT5jaGFud2FpdCk7CisKKwlyeHJwY19wdXRfY29ubmVjdGlvbihjb25uKTsKKworCS8qIGNsZWFyIHRoZSB0aW1lcnMgYW5kIGRlcXVldWUgZnJvbSBrcnhpb2QgKi8KKwlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrc190aW1lb3V0KTsKKwlkZWxfdGltZXJfc3luYygmY2FsbC0+cmN2X3RpbWVvdXQpOworCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5hY2tyX2Rmcl90aW1vKTsKKworCXJ4cnBjX2tyeGlvZF9kZXF1ZXVlX2NhbGwoY2FsbCk7CisKKwkvKiBjbGVhbiB1cCB0aGUgY29udGVudHMgb2YgdGhlIHN0cnVjdCAqLworCWlmIChjYWxsLT5zbmRfbmV4dG1zZykKKwkJcnhycGNfcHV0X21lc3NhZ2UoY2FsbC0+c25kX25leHRtc2cpOworCisJaWYgKGNhbGwtPnNuZF9waW5nKQorCQlyeHJwY19wdXRfbWVzc2FnZShjYWxsLT5zbmRfcGluZyk7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmNhbGwtPmFja3NfcGVuZHEpKSB7CisJCW1zZyA9IGxpc3RfZW50cnkoY2FsbC0+YWNrc19wZW5kcS5uZXh0LAorCQkJCSBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7CisJCWxpc3RfZGVsKCZtc2ctPmxpbmspOworCQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOworCX0KKworCXdoaWxlICghbGlzdF9lbXB0eSgmY2FsbC0+cmN2X3JlY2VpdmVxKSkgeworCQltc2cgPSBsaXN0X2VudHJ5KGNhbGwtPnJjdl9yZWNlaXZlcS5uZXh0LAorCQkJCSBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7CisJCWxpc3RfZGVsKCZtc2ctPmxpbmspOworCQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOworCX0KKworCXdoaWxlICghbGlzdF9lbXB0eSgmY2FsbC0+YXBwX3JlYWR5cSkpIHsKKwkJbXNnID0gbGlzdF9lbnRyeShjYWxsLT5hcHBfcmVhZHlxLm5leHQsCisJCQkJIHN0cnVjdCByeHJwY19tZXNzYWdlLCBsaW5rKTsKKwkJbGlzdF9kZWwoJm1zZy0+bGluayk7CisJCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7CisJfQorCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZjYWxsLT5hcHBfdW5yZWFkeXEpKSB7CisJCW1zZyA9IGxpc3RfZW50cnkoY2FsbC0+YXBwX3VucmVhZHlxLm5leHQsCisJCQkJIHN0cnVjdCByeHJwY19tZXNzYWdlLCBsaW5rKTsKKwkJbGlzdF9kZWwoJm1zZy0+bGluayk7CisJCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7CisJfQorCisJbW9kdWxlX3B1dChjYWxsLT5vd25lcik7CisKKwlkb3duX3dyaXRlKCZyeHJwY19jYWxsc19zZW0pOworCWxpc3RfZGVsKCZjYWxsLT5jYWxsX2xpbmspOworCXVwX3dyaXRlKCZyeHJwY19jYWxsc19zZW0pOworCisJX19SWEFDQ1QoYXRvbWljX2RlYygmcnhycGNfY2FsbF9jb3VudCkpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgY2FsbCk7CisKKwlfbGVhdmUoIiBbZGVzdHJveWVkXSIpOworfSAvKiBlbmQgcnhycGNfcHV0X2NhbGwoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogYWN0dWFsbHkgZ2VuZXJhdGUgYSBub3JtYWwgQUNLCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9fcnhycGNfY2FsbF9nZW5fbm9ybWFsX0FDSyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkJICAgICAgcnhycGNfc2VxX3Qgc2VxKQoreworCXN0cnVjdCByeHJwY19tZXNzYWdlICptc2c7CisJc3RydWN0IGt2ZWMgZGlvdlszXTsKKwlfX2JlMzIgYXV4WzRdOworCWludCBkZWx0YSwgcmV0OworCisJLyogQUNLcyBkZWZhdWx0IHRvIERFTEFZICovCisJaWYgKCFjYWxsLT5hY2tyLnJlYXNvbikKKwkJY2FsbC0+YWNrci5yZWFzb24gPSBSWFJQQ19BQ0tfREVMQVk7CisKKwlfcHJvdG8oIlJ4ICUwNWx1IFNlbmRpbmcgQUNLIHsgbT0laHUgZj0jJXUgcD0jJXUgcz0lJSV1IHI9JXMgbj0ldSB9IiwKKwkgICAgICAgamlmZmllcyAtIGNhbGwtPmNqaWYsCisJICAgICAgIG50b2hzKGNhbGwtPmFja3IubWF4U2tldyksCisJICAgICAgIG50b2hsKGNhbGwtPmFja3IuZmlyc3RQYWNrZXQpLAorCSAgICAgICBudG9obChjYWxsLT5hY2tyLnByZXZpb3VzUGFja2V0KSwKKwkgICAgICAgbnRvaGwoY2FsbC0+YWNrci5zZXJpYWwpLAorCSAgICAgICByeHJwY19hY2tzW2NhbGwtPmFja3IucmVhc29uXSwKKwkgICAgICAgY2FsbC0+YWNrci5uQWNrcyk7CisKKwlhdXhbMF0gPSBodG9ubChjYWxsLT5jb25uLT5wZWVyLT5pZl9tdHUpOwkvKiBpbnRlcmZhY2UgTVRVICovCisJYXV4WzFdID0gaHRvbmwoMTQ0NCk7CQkJCS8qIG1heCBNVFUgKi8KKwlhdXhbMl0gPSBodG9ubCgxNik7CQkJCS8qIHJ3aW5kICovCisJYXV4WzNdID0gaHRvbmwoNCk7CQkJCS8qIG1heCBwYWNrZXRzICovCisKKwlkaW92WzBdLmlvdl9sZW4gID0gc2l6ZW9mKHN0cnVjdCByeHJwY19hY2twYWNrZXQpOworCWRpb3ZbMF0uaW92X2Jhc2UgPSAmY2FsbC0+YWNrcjsKKwlkaW92WzFdLmlvdl9sZW4gID0gY2FsbC0+YWNrcl9wZW5kX2NudCArIDM7CisJZGlvdlsxXS5pb3ZfYmFzZSA9IGNhbGwtPmFja3JfYXJyYXk7CisJZGlvdlsyXS5pb3ZfbGVuICA9IHNpemVvZihhdXgpOworCWRpb3ZbMl0uaW92X2Jhc2UgPSAmYXV4OworCisJLyogYnVpbGQgYW5kIHNlbmQgdGhlIG1lc3NhZ2UgKi8KKwlyZXQgPSByeHJwY19jb25uX25ld21zZyhjYWxsLT5jb25uLGNhbGwsIFJYUlBDX1BBQ0tFVF9UWVBFX0FDSywKKwkJCQkzLCBkaW92LCBHRlBfS0VSTkVMLCAmbXNnKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwltc2ctPnNlcSA9IHNlcTsKKwltc2ctPmhkci5zZXEgPSBodG9ubChzZXEpOworCW1zZy0+aGRyLmZsYWdzIHw9IFJYUlBDX1NMT1dfU1RBUlRfT0s7CisKKwlyZXQgPSByeHJwY19jb25uX3NlbmRtc2coY2FsbC0+Y29ubiwgbXNnKTsKKwlyeHJwY19wdXRfbWVzc2FnZShtc2cpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwljYWxsLT5wa3Rfc25kX2NvdW50Kys7CisKKwkvKiBjb3VudCBob3cgbWFueSBhY3R1YWwgQUNLcyB0aGVyZSB3ZXJlIGF0IHRoZSBmcm9udCAqLworCWZvciAoZGVsdGEgPSAwOyBkZWx0YSA8IGNhbGwtPmFja3JfcGVuZF9jbnQ7IGRlbHRhKyspCisJCWlmIChjYWxsLT5hY2tyX2FycmF5W2RlbHRhXSAhPSBSWFJQQ19BQ0tfVFlQRV9BQ0spCisJCQlicmVhazsKKworCWNhbGwtPmFja3JfcGVuZF9jbnQgLT0gZGVsdGE7IC8qIGFsbCBBQ0snZCB0byB0aGlzIHBvaW50ICovCisKKwkvKiBjcmFuayB0aGUgQUNLIHdpbmRvdyBhcm91bmQgKi8KKwlpZiAoZGVsdGEgPT0gMCkgeworCQkvKiB1bi1BQ0snZCB3aW5kb3cgKi8KKwl9CisJZWxzZSBpZiAoZGVsdGEgPCBSWFJQQ19DQUxMX0FDS19XSU5ET1dfU0laRSkgeworCQkvKiBwYXJ0aWFsbHkgQUNLJ2Qgd2luZG93CisJCSAqIC0gc2h1ZmZsZSBkb3duIHRvIGF2b2lkIGxvc2luZyBvdXQtb2Ytc2VxdWVuY2UgcGFja2V0cworCQkgKi8KKwkJY2FsbC0+YWNrcl93aW5fYm90ICs9IGRlbHRhOworCQljYWxsLT5hY2tyX3dpbl90b3AgKz0gZGVsdGE7CisKKwkJbWVtbW92ZSgmY2FsbC0+YWNrcl9hcnJheVswXSwKKwkJCSZjYWxsLT5hY2tyX2FycmF5W2RlbHRhXSwKKwkJCWNhbGwtPmFja3JfcGVuZF9jbnQpOworCisJCW1lbXNldCgmY2FsbC0+YWNrcl9hcnJheVtjYWxsLT5hY2tyX3BlbmRfY250XSwKKwkJICAgICAgIFJYUlBDX0FDS19UWVBFX05BQ0ssCisJCSAgICAgICBzaXplb2YoY2FsbC0+YWNrcl9hcnJheSkgLSBjYWxsLT5hY2tyX3BlbmRfY250KTsKKwl9CisJZWxzZSB7CisJCS8qIGZ1bGx5IEFDSydkIHdpbmRvdworCQkgKiAtIGp1c3QgY2xlYXIgdGhlIHdob2xlIHRoaW5nCisJCSAqLworCQltZW1zZXQoJmNhbGwtPmFja3JfYXJyYXksCisJCSAgICAgICBSWFJQQ19BQ0tfVFlQRV9OQUNLLAorCQkgICAgICAgc2l6ZW9mKGNhbGwtPmFja3JfYXJyYXkpKTsKKwl9CisKKwkvKiBjbGVhciB0aGlzIEFDSyAqLworCW1lbXNldCgmY2FsbC0+YWNrciwgMCwgc2l6ZW9mKGNhbGwtPmFja3IpKTsKKworIG91dDoKKwlpZiAoIWNhbGwtPmFwcF9jYWxsX3N0YXRlKQorCQlwcmludGsoIl9fXyBTVEFURSAwIF9fX1xuIik7CisJcmV0dXJuIHJldDsKK30gLyogZW5kIF9fcnhycGNfY2FsbF9nZW5fbm9ybWFsX0FDSygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBub3RlIHRoZSByZWNlcHRpb24gb2YgYSBwYWNrZXQgaW4gdGhlIGNhbGwncyBBQ0sgcmVjb3JkcyBhbmQgZ2VuZXJhdGUgYW4KKyAqIGFwcHJvcHJpYXRlIEFDSyBwYWNrZXQgaWYgbmVjZXNzYXJ5CisgKiAtIHJldHVybnMgMCBpZiBwYWNrZXQgc2hvdWxkIGJlIHByb2Nlc3NlZCwgMSBpZiBwYWNrZXQgc2hvdWxkIGJlIGlnbm9yZWQKKyAqICAgYW5kIC12ZSBvbiBhbiBlcnJvcgorICovCitzdGF0aWMgaW50IHJ4cnBjX2NhbGxfZ2VuZXJhdGVfQUNLKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJCSAgIHN0cnVjdCByeHJwY19oZWFkZXIgKmhkciwKKwkJCQkgICBzdHJ1Y3QgcnhycGNfYWNrcGFja2V0ICphY2spCit7CisJc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZzsKKwlyeHJwY19zZXFfdCBzZXE7CisJdW5zaWduZWQgb2Zmc2V0OworCWludCByZXQgPSAwLCBlcnI7CisJdTggc3BlY2lhbF9BQ0ssIGRvX0FDSywgZm9yY2U7CisKKwlfZW50ZXIoIiVwLCVwIHsgc2VxPSVkIHRwPSVkIGZsPSUwMnggfSIsCisJICAgICAgIGNhbGwsIGhkciwgbnRvaGwoaGRyLT5zZXEpLCBoZHItPnR5cGUsIGhkci0+ZmxhZ3MpOworCisJc2VxID0gbnRvaGwoaGRyLT5zZXEpOworCW9mZnNldCA9IHNlcSAtIGNhbGwtPmFja3Jfd2luX2JvdDsKKwlkb19BQ0sgPSBSWFJQQ19BQ0tfREVMQVk7CisJc3BlY2lhbF9BQ0sgPSAwOworCWZvcmNlID0gKHNlcSA9PSAxKTsKKworCWlmIChjYWxsLT5hY2tyX2hpZ2hfc2VxIDwgc2VxKQorCQljYWxsLT5hY2tyX2hpZ2hfc2VxID0gc2VxOworCisJLyogZGVhbCB3aXRoIGdlbmVyYXRpb24gb2Ygb2J2aW91cyBzcGVjaWFsIEFDS3MgZmlyc3QgKi8KKwlpZiAoYWNrICYmIGFjay0+cmVhc29uID09IFJYUlBDX0FDS19QSU5HKSB7CisJCXNwZWNpYWxfQUNLID0gUlhSUENfQUNLX1BJTkdfUkVTUE9OU0U7CisJCXJldCA9IDE7CisJCWdvdG8gZ2VuX0FDSzsKKwl9CisKKwlpZiAoc2VxIDwgY2FsbC0+YWNrcl93aW5fYm90KSB7CisJCXNwZWNpYWxfQUNLID0gUlhSUENfQUNLX0RVUExJQ0FURTsKKwkJcmV0ID0gMTsKKwkJZ290byBnZW5fQUNLOworCX0KKworCWlmIChzZXEgPj0gY2FsbC0+YWNrcl93aW5fdG9wKSB7CisJCXNwZWNpYWxfQUNLID0gUlhSUENfQUNLX0VYQ0VFRFNfV0lORE9XOworCQlyZXQgPSAxOworCQlnb3RvIGdlbl9BQ0s7CisJfQorCisJaWYgKGNhbGwtPmFja3JfYXJyYXlbb2Zmc2V0XSAhPSBSWFJQQ19BQ0tfVFlQRV9OQUNLKSB7CisJCXNwZWNpYWxfQUNLID0gUlhSUENfQUNLX0RVUExJQ0FURTsKKwkJcmV0ID0gMTsKKwkJZ290byBnZW5fQUNLOworCX0KKworCS8qIG9rYXkuLi4gaXQncyBhIG5vcm1hbCBkYXRhIHBhY2tldCBpbnNpZGUgdGhlIEFDSyB3aW5kb3cgKi8KKwljYWxsLT5hY2tyX2FycmF5W29mZnNldF0gPSBSWFJQQ19BQ0tfVFlQRV9BQ0s7CisKKwlpZiAob2Zmc2V0IDwgY2FsbC0+YWNrcl9wZW5kX2NudCkgeworCX0KKwllbHNlIGlmIChvZmZzZXQgPiBjYWxsLT5hY2tyX3BlbmRfY250KSB7CisJCWRvX0FDSyA9IFJYUlBDX0FDS19PVVRfT0ZfU0VRVUVOQ0U7CisJCWNhbGwtPmFja3JfcGVuZF9jbnQgPSBvZmZzZXQ7CisJCWdvdG8gZ2VuX0FDSzsKKwl9CisKKwlpZiAoaGRyLT5mbGFncyAmIFJYUlBDX1JFUVVFU1RfQUNLKSB7CisJCWRvX0FDSyA9IFJYUlBDX0FDS19SRVFVRVNURUQ7CisJfQorCisJLyogZ2VuZXJhdGUgYW4gQUNLIG9uIHRoZSBmaW5hbCBwYWNrZXQgb2YgYSByZXBseSBqdXN0IHJlY2VpdmVkICovCisJaWYgKGhkci0+ZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCkgeworCQlpZiAoY2FsbC0+Y29ubi0+b3V0X2NsaWVudGZsYWcpCisJCQlmb3JjZSA9IDE7CisJfQorCWVsc2UgaWYgKCEoaGRyLT5mbGFncyAmIFJYUlBDX01PUkVfUEFDS0VUUykpIHsKKwkJZG9fQUNLID0gUlhSUENfQUNLX1JFUVVFU1RFRDsKKwl9CisKKwkvKiByZS1BQ0sgcGFja2V0cyBwcmV2aW91c2x5IHJlY2VpdmVkIG91dC1vZi1vcmRlciAqLworCWZvciAob2Zmc2V0Kys7IG9mZnNldCA8IFJYUlBDX0NBTExfQUNLX1dJTkRPV19TSVpFOyBvZmZzZXQrKykKKwkJaWYgKGNhbGwtPmFja3JfYXJyYXlbb2Zmc2V0XSAhPSBSWFJQQ19BQ0tfVFlQRV9BQ0spCisJCQlicmVhazsKKworCWNhbGwtPmFja3JfcGVuZF9jbnQgPSBvZmZzZXQ7CisKKwkvKiBnZW5lcmF0ZSBhbiBBQ0sgaWYgd2UgZmlsbCB1cCB0aGUgd2luZG93ICovCisJaWYgKGNhbGwtPmFja3JfcGVuZF9jbnQgPj0gUlhSUENfQ0FMTF9BQ0tfV0lORE9XX1NJWkUpCisJCWZvcmNlID0gMTsKKworIGdlbl9BQ0s6CisJX2RlYnVnKCIlMDVsdSBBQ0tzIHBlbmQ9JXUgbm9ybT0lcyBzcGVjaWFsPSVzJXMiLAorCSAgICAgICBqaWZmaWVzIC0gY2FsbC0+Y2ppZiwKKwkgICAgICAgY2FsbC0+YWNrcl9wZW5kX2NudCwKKwkgICAgICAgcnhycGNfYWNrc1tkb19BQ0tdLAorCSAgICAgICByeHJwY19hY2tzW3NwZWNpYWxfQUNLXSwKKwkgICAgICAgZm9yY2UgPyAiIGltbWVkaWF0ZSIgOgorCSAgICAgICBkb19BQ0sgPT0gUlhSUENfQUNLX1JFUVVFU1RFRCA/ICIgbWVyZ2UtcmVxIiA6CisJICAgICAgIGhkci0+ZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCA/ICIgZmluYWxpc2UiIDoKKwkgICAgICAgIiBkZWZlciIKKwkgICAgICAgKTsKKworCS8qIHNlbmQgYW55IHBlbmRpbmcgbm9ybWFsIEFDS3MgaWYgbmVlZCBiZSAqLworCWlmIChjYWxsLT5hY2tyX3BlbmRfY250ID4gMCkgeworCQkvKiBmaWxsIG91dCB0aGUgYXBwcm9wcmlhdGUgZm9ybSAqLworCQljYWxsLT5hY2tyLmJ1ZmZlclNwYWNlCT0gaHRvbnMoUlhSUENfQ0FMTF9BQ0tfV0lORE9XX1NJWkUpOworCQljYWxsLT5hY2tyLm1heFNrZXcJPSBodG9ucyhtaW4oY2FsbC0+YWNrcl9oaWdoX3NlcSAtIHNlcSwKKwkJCQkJCSAgICA2NTUzNVUpKTsKKwkJY2FsbC0+YWNrci5maXJzdFBhY2tldAk9IGh0b25sKGNhbGwtPmFja3Jfd2luX2JvdCk7CisJCWNhbGwtPmFja3IucHJldmlvdXNQYWNrZXQgPSBjYWxsLT5hY2tyX3ByZXZfc2VxOworCQljYWxsLT5hY2tyLnNlcmlhbAk9IGhkci0+c2VyaWFsOworCQljYWxsLT5hY2tyLm5BY2tzCT0gY2FsbC0+YWNrcl9wZW5kX2NudDsKKworCQlpZiAoZG9fQUNLID09IFJYUlBDX0FDS19SRVFVRVNURUQpCisJCQljYWxsLT5hY2tyLnJlYXNvbiA9IGRvX0FDSzsKKworCQkvKiBnZW5lcmF0ZSB0aGUgQUNLIGltbWVkaWF0ZWx5IGlmIG5lY2Vzc2FyeSAqLworCQlpZiAoc3BlY2lhbF9BQ0sgfHwgZm9yY2UpIHsKKwkJCWVyciA9IF9fcnhycGNfY2FsbF9nZW5fbm9ybWFsX0FDSygKKwkJCQljYWxsLCBkb19BQ0sgPT0gUlhSUENfQUNLX0RFTEFZID8gMCA6IHNlcSk7CisJCQlpZiAoZXJyIDwgMCkgeworCQkJCXJldCA9IGVycjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0KKworCWlmIChjYWxsLT5hY2tyLnJlYXNvbiA9PSBSWFJQQ19BQ0tfUkVRVUVTVEVEKQorCQljYWxsLT5hY2tyX2Rmcl9zZXEgPSBzZXE7CisKKwkvKiBzdGFydCB0aGUgQUNLIHRpbWVyIGlmIG5vdCBydW5uaW5nIGlmIHRoZXJlIGFyZSBhbnkgcGVuZGluZyBkZWZlcnJlZAorCSAqIEFDS3MgKi8KKwlpZiAoY2FsbC0+YWNrcl9wZW5kX2NudCA+IDAgJiYKKwkgICAgY2FsbC0+YWNrci5yZWFzb24gIT0gUlhSUENfQUNLX1JFUVVFU1RFRCAmJgorCSAgICAhdGltZXJfcGVuZGluZygmY2FsbC0+YWNrcl9kZnJfdGltbykKKwkgICAgKSB7CisJCXVuc2lnbmVkIGxvbmcgdGltbzsKKworCQl0aW1vID0gcnhycGNfY2FsbF9kZnJfYWNrX3RpbWVvdXQgKyBqaWZmaWVzOworCisJCV9kZWJ1ZygiU1RBUlQgQUNLUiBUSU1FUiBmb3IgY2o9JWx1IiwgdGltbyAtIGNhbGwtPmNqaWYpOworCisJCXNwaW5fbG9jaygmY2FsbC0+bG9jayk7CisJCW1vZF90aW1lcigmY2FsbC0+YWNrcl9kZnJfdGltbywgdGltbyk7CisJCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKKwl9CisJZWxzZSBpZiAoKGNhbGwtPmFja3JfcGVuZF9jbnQgPT0gMCB8fAorCQkgIGNhbGwtPmFja3IucmVhc29uID09IFJYUlBDX0FDS19SRVFVRVNURUQpICYmCisJCSB0aW1lcl9wZW5kaW5nKCZjYWxsLT5hY2tyX2Rmcl90aW1vKQorCQkgKSB7CisJCS8qIHN0b3AgdGltZXIgaWYgbm8gcGVuZGluZyBBQ0tzICovCisJCV9kZWJ1ZygiQ0xFQVIgQUNLUiBUSU1FUiIpOworCQlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrcl9kZnJfdGltbyk7CisJfQorCisJLyogc2VuZCBhIHNwZWNpYWwgQUNLIGlmIG9uZSBpcyByZXF1aXJlZCAqLworCWlmIChzcGVjaWFsX0FDSykgeworCQlzdHJ1Y3QgcnhycGNfYWNrcGFja2V0IGFjazsKKwkJc3RydWN0IGt2ZWMgZGlvdlsyXTsKKwkJdWludDhfdCBhY2tzWzFdID0geyBSWFJQQ19BQ0tfVFlQRV9BQ0sgfTsKKworCQkvKiBmaWxsIG91dCB0aGUgYXBwcm9wcmlhdGUgZm9ybSAqLworCQlhY2suYnVmZmVyU3BhY2UJPSBodG9ucyhSWFJQQ19DQUxMX0FDS19XSU5ET1dfU0laRSk7CisJCWFjay5tYXhTa2V3CT0gaHRvbnMobWluKGNhbGwtPmFja3JfaGlnaF9zZXEgLSBzZXEsCisJCQkJCSAgICA2NTUzNVUpKTsKKwkJYWNrLmZpcnN0UGFja2V0CT0gaHRvbmwoY2FsbC0+YWNrcl93aW5fYm90KTsKKwkJYWNrLnByZXZpb3VzUGFja2V0ID0gY2FsbC0+YWNrcl9wcmV2X3NlcTsKKwkJYWNrLnNlcmlhbAk9IGhkci0+c2VyaWFsOworCQlhY2sucmVhc29uCT0gc3BlY2lhbF9BQ0s7CisJCWFjay5uQWNrcwk9IDA7CisKKwkJX3Byb3RvKCJSeCBTZW5kaW5nIHMtQUNLIgorCQkgICAgICAgIiB7IG09JWh1IGY9IyV1IHA9IyV1IHM9JSUldSByPSVzIG49JXUgfSIsCisJCSAgICAgICBudG9ocyhhY2subWF4U2tldyksCisJCSAgICAgICBudG9obChhY2suZmlyc3RQYWNrZXQpLAorCQkgICAgICAgbnRvaGwoYWNrLnByZXZpb3VzUGFja2V0KSwKKwkJICAgICAgIG50b2hsKGFjay5zZXJpYWwpLAorCQkgICAgICAgcnhycGNfYWNrc1thY2sucmVhc29uXSwKKwkJICAgICAgIGFjay5uQWNrcyk7CisKKwkJZGlvdlswXS5pb3ZfbGVuICA9IHNpemVvZihzdHJ1Y3QgcnhycGNfYWNrcGFja2V0KTsKKwkJZGlvdlswXS5pb3ZfYmFzZSA9ICZhY2s7CisJCWRpb3ZbMV0uaW92X2xlbiAgPSBzaXplb2YoYWNrcyk7CisJCWRpb3ZbMV0uaW92X2Jhc2UgPSBhY2tzOworCisJCS8qIGJ1aWxkIGFuZCBzZW5kIHRoZSBtZXNzYWdlICovCisJCWVyciA9IHJ4cnBjX2Nvbm5fbmV3bXNnKGNhbGwtPmNvbm4sY2FsbCwgUlhSUENfUEFDS0VUX1RZUEVfQUNLLAorCQkJCQloZHItPnNlcSA/IDIgOiAxLCBkaW92LAorCQkJCQlHRlBfS0VSTkVMLAorCQkJCQkmbXNnKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXJldCA9IGVycjsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJbXNnLT5zZXEgPSBzZXE7CisJCW1zZy0+aGRyLnNlcSA9IGh0b25sKHNlcSk7CisJCW1zZy0+aGRyLmZsYWdzIHw9IFJYUlBDX1NMT1dfU1RBUlRfT0s7CisKKwkJZXJyID0gcnhycGNfY29ubl9zZW5kbXNnKGNhbGwtPmNvbm4sIG1zZyk7CisJCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlyZXQgPSBlcnI7CisJCQlnb3RvIG91dDsKKwkJfQorCQljYWxsLT5wa3Rfc25kX2NvdW50Kys7CisJfQorCisgb3V0OgorCWlmIChoZHItPnNlcSkKKwkJY2FsbC0+YWNrcl9wcmV2X3NlcSA9IGhkci0+c2VxOworCisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30gLyogZW5kIHJ4cnBjX2NhbGxfZ2VuZXJhdGVfQUNLKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGhhbmRsZSB3b3JrIHRvIGJlIGRvbmUgb24gYSBjYWxsCisgKiAtIGluY2x1ZGVzIHBhY2tldCByZWNlcHRpb24gYW5kIHRpbWVvdXQgcHJvY2Vzc2luZworICovCit2b2lkIHJ4cnBjX2NhbGxfZG9fc3R1ZmYoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJX2VudGVyKCIlcHtmbGFncz0lbHh9IiwgY2FsbCwgY2FsbC0+ZmxhZ3MpOworCisJLyogaGFuZGxlIHBhY2tldCByZWNlcHRpb24gKi8KKwlpZiAoY2FsbC0+ZmxhZ3MgJiBSWFJQQ19DQUxMX1JDVl9QS1QpIHsKKwkJX2RlYnVnKCItIHJlY2VpdmUgcGFja2V0Iik7CisJCWNhbGwtPmZsYWdzICY9IH5SWFJQQ19DQUxMX1JDVl9QS1Q7CisJCXJ4cnBjX2NhbGxfcmVjZWl2ZV9wYWNrZXQoY2FsbCk7CisJfQorCisJLyogaGFuZGxlIG92ZXJkdWUgQUNLcyAqLworCWlmIChjYWxsLT5mbGFncyAmIFJYUlBDX0NBTExfQUNLU19USU1PKSB7CisJCV9kZWJ1ZygiLSBvdmVyZHVlIEFDSyB0aW1lb3V0Iik7CisJCWNhbGwtPmZsYWdzICY9IH5SWFJQQ19DQUxMX0FDS1NfVElNTzsKKwkJcnhycGNfY2FsbF9yZXNlbmQoY2FsbCwgY2FsbC0+c25kX3NlcV9jb3VudCk7CisJfQorCisJLyogaGFuZGxlIGxhY2sgb2YgcmVjZXB0aW9uICovCisJaWYgKGNhbGwtPmZsYWdzICYgUlhSUENfQ0FMTF9SQ1ZfVElNTykgeworCQlfZGVidWcoIi0gcmVjZXB0aW9uIHRpbWVvdXQiKTsKKwkJY2FsbC0+ZmxhZ3MgJj0gflJYUlBDX0NBTExfUkNWX1RJTU87CisJCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgLUVJTyk7CisJfQorCisJLyogaGFuZGxlIGRlZmVycmVkIEFDS3MgKi8KKwlpZiAoY2FsbC0+ZmxhZ3MgJiBSWFJQQ19DQUxMX0FDS1JfVElNTyB8fAorCSAgICAoY2FsbC0+YWNrci5uQWNrcyA+IDAgJiYgY2FsbC0+YWNrci5yZWFzb24gPT0gUlhSUENfQUNLX1JFUVVFU1RFRCkKKwkgICAgKSB7CisJCV9kZWJ1ZygiLSBkZWZlcnJlZCBBQ0sgdGltZW91dDogY2o9JTA1bHUgcj0lcyBuPSV1IiwKKwkJICAgICAgIGppZmZpZXMgLSBjYWxsLT5jamlmLAorCQkgICAgICAgcnhycGNfYWNrc1tjYWxsLT5hY2tyLnJlYXNvbl0sCisJCSAgICAgICBjYWxsLT5hY2tyLm5BY2tzKTsKKworCQljYWxsLT5mbGFncyAmPSB+UlhSUENfQ0FMTF9BQ0tSX1RJTU87CisKKwkJaWYgKGNhbGwtPmFja3IubkFja3MgPiAwICYmCisJCSAgICBjYWxsLT5hcHBfY2FsbF9zdGF0ZSAhPSBSWFJQQ19DU1RBVEVfRVJST1IpIHsKKwkJCS8qIGdlbmVyYXRlIEFDSyAqLworCQkJX19yeHJwY19jYWxsX2dlbl9ub3JtYWxfQUNLKGNhbGwsIGNhbGwtPmFja3JfZGZyX3NlcSk7CisJCQljYWxsLT5hY2tyX2Rmcl9zZXEgPSAwOworCQl9CisJfQorCisJX2xlYXZlKCIiKTsKKworfSAvKiBlbmQgcnhycGNfY2FsbF9kb19zdHVmZigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBzZW5kIGFuIGFib3J0IG1lc3NhZ2UgYXQgY2FsbCBvciBjb25uZWN0aW9uIGxldmVsCisgKiAtIG11c3QgYmUgY2FsbGVkIHdpdGggY2FsbC0+bG9jayBoZWxkCisgKiAtIHRoZSBzdXBwbGllZCBlcnJvciBjb2RlIGlzIHNlbnQgYXMgdGhlIHBhY2tldCBkYXRhCisgKi8KK3N0YXRpYyBpbnQgX19yeHJwY19jYWxsX2Fib3J0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBpbnQgZXJybm8pCit7CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4gPSBjYWxsLT5jb25uOworCXN0cnVjdCByeHJwY19tZXNzYWdlICptc2c7CisJc3RydWN0IGt2ZWMgZGlvdlsxXTsKKwlpbnQgcmV0OworCV9fYmUzMiBfZXJyb3I7CisKKwlfZW50ZXIoIiVweyUwOHh9LCVweyVkfSwlZCIsCisJICAgICAgIGNvbm4sIG50b2hsKGNvbm4tPmNvbm5faWQpLCBjYWxsLCBudG9obChjYWxsLT5jYWxsX2lkKSwgZXJybm8pOworCisJLyogaWYgdGhpcyBjYWxsIGlzIGFscmVhZHkgYWJvcnRlZCwgdGhlbiBqdXN0IHdha2UgdXAgYW55IHdhaXRlcnMgKi8KKwlpZiAoY2FsbC0+YXBwX2NhbGxfc3RhdGUgPT0gUlhSUENfQ1NUQVRFX0VSUk9SKSB7CisJCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKKwkJY2FsbC0+YXBwX2Vycm9yX2Z1bmMoY2FsbCk7CisJCV9sZWF2ZSgiID0gMCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyeHJwY19nZXRfY2FsbChjYWxsKTsKKworCS8qIGNoYW5nZSB0aGUgc3RhdGUgX3dpdGhfIHRoZSBsb2NrIHN0aWxsIGhlbGQgKi8KKwljYWxsLT5hcHBfY2FsbF9zdGF0ZQk9IFJYUlBDX0NTVEFURV9FUlJPUjsKKwljYWxsLT5hcHBfZXJyX3N0YXRlCT0gUlhSUENfRVNUQVRFX0xPQ0FMX0FCT1JUOworCWNhbGwtPmFwcF9lcnJubwkJPSBlcnJubzsKKwljYWxsLT5hcHBfbWFyawkJPSBSWFJQQ19BUFBfTUFSS19FT0Y7CisJY2FsbC0+YXBwX3JlYWRfYnVmCT0gTlVMTDsKKwljYWxsLT5hcHBfYXN5bmNfcmVhZAk9IDA7CisKKwlfc3RhdGUoY2FsbCk7CisKKwkvKiBhc2sgdGhlIGFwcCB0byB0cmFuc2xhdGUgdGhlIGVycm9yIGNvZGUgKi8KKwljYWxsLT5hcHBfYWVtYXBfZnVuYyhjYWxsKTsKKworCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKKworCS8qIGZsdXNoIGFueSBvdXRzdGFuZGluZyBBQ0tzICovCisJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja3NfdGltZW91dCk7CisJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPnJjdl90aW1lb3V0KTsKKwlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrcl9kZnJfdGltbyk7CisKKwlpZiAocnhycGNfY2FsbF9pc19hY2tfcGVuZGluZyhjYWxsKSkKKwkJX19yeHJwY19jYWxsX2dlbl9ub3JtYWxfQUNLKGNhbGwsIDApOworCisJLyogc2VuZCB0aGUgYWJvcnQgcGFja2V0IG9ubHkgaWYgd2UgYWN0dWFsbHkgdHJhZGVkIHNvbWUgb3RoZXIKKwkgKiBwYWNrZXRzICovCisJcmV0ID0gMDsKKwlpZiAoY2FsbC0+cGt0X3NuZF9jb3VudCB8fCBjYWxsLT5wa3RfcmN2X2NvdW50KSB7CisJCS8qIGFjdHVhbGx5IHNlbmQgdGhlIGFib3J0ICovCisJCV9wcm90bygiUnggU2VuZGluZyBDYWxsIEFCT1JUIHsgZGF0YT0lZCB9IiwKKwkJICAgICAgIGNhbGwtPmFwcF9hYm9ydF9jb2RlKTsKKworCQlfZXJyb3IgPSBodG9ubChjYWxsLT5hcHBfYWJvcnRfY29kZSk7CisKKwkJZGlvdlswXS5pb3ZfbGVuICA9IHNpemVvZihfZXJyb3IpOworCQlkaW92WzBdLmlvdl9iYXNlID0gJl9lcnJvcjsKKworCQlyZXQgPSByeHJwY19jb25uX25ld21zZyhjb25uLCBjYWxsLCBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVCwKKwkJCQkJMSwgZGlvdiwgR0ZQX0tFUk5FTCwgJm1zZyk7CisJCWlmIChyZXQgPT0gMCkgeworCQkJcmV0ID0gcnhycGNfY29ubl9zZW5kbXNnKGNvbm4sIG1zZyk7CisJCQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOworCQl9CisJfQorCisJLyogdGVsbCB0aGUgYXBwIGxheWVyIHRvIGxldCBnbyAqLworCWNhbGwtPmFwcF9lcnJvcl9mdW5jKGNhbGwpOworCisJcnhycGNfcHV0X2NhbGwoY2FsbCk7CisKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfSAvKiBlbmQgX19yeHJwY19jYWxsX2Fib3J0KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHNlbmQgYW4gYWJvcnQgbWVzc2FnZSBhdCBjYWxsIG9yIGNvbm5lY3Rpb24gbGV2ZWwKKyAqIC0gdGhlIHN1cHBsaWVkIGVycm9yIGNvZGUgaXMgc2VudCBhcyB0aGUgcGFja2V0IGRhdGEKKyAqLworaW50IHJ4cnBjX2NhbGxfYWJvcnQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIGludCBlcnJvcikKK3sKKwlzcGluX2xvY2soJmNhbGwtPmxvY2spOworCisJcmV0dXJuIF9fcnhycGNfY2FsbF9hYm9ydChjYWxsLCBlcnJvcik7CisKK30gLyogZW5kIHJ4cnBjX2NhbGxfYWJvcnQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogcHJvY2VzcyBwYWNrZXRzIHdhaXRpbmcgZm9yIHRoaXMgY2FsbAorICovCitzdGF0aWMgdm9pZCByeHJwY19jYWxsX3JlY2VpdmVfcGFja2V0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCXN0cnVjdCByeHJwY19tZXNzYWdlICptc2c7CisJc3RydWN0IGxpc3RfaGVhZCAqX3A7CisKKwlfZW50ZXIoIiVwIiwgY2FsbCk7CisKKwlyeHJwY19nZXRfY2FsbChjYWxsKTsgLyogbXVzdCBub3QgZ28gYXdheSB0b28gc29vbiBpZiBhYm9ydGVkIGJ5CisJCQkgICAgICAgKiBhcHAtbGF5ZXIgKi8KKworCXdoaWxlICghbGlzdF9lbXB0eSgmY2FsbC0+cmN2X3JlY2VpdmVxKSkgeworCQkvKiB0cnkgdG8gZ2V0IG5leHQgcGFja2V0ICovCisJCV9wID0gTlVMTDsKKwkJc3Bpbl9sb2NrKCZjYWxsLT5sb2NrKTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZjYWxsLT5yY3ZfcmVjZWl2ZXEpKSB7CisJCQlfcCA9IGNhbGwtPnJjdl9yZWNlaXZlcS5uZXh0OworCQkJbGlzdF9kZWxfaW5pdChfcCk7CisJCX0KKwkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOworCisJCWlmICghX3ApCisJCQlicmVhazsKKworCQltc2cgPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7CisKKwkJX3Byb3RvKCJSeCAlMDVsdSBSZWNlaXZlZCAlcyBwYWNrZXQgKCUlJXUsIyV1LCVjJWMlYyVjJWMpIiwKKwkJICAgICAgIGppZmZpZXMgLSBjYWxsLT5jamlmLAorCQkgICAgICAgcnhycGNfcGt0c1ttc2ctPmhkci50eXBlXSwKKwkJICAgICAgIG50b2hsKG1zZy0+aGRyLnNlcmlhbCksCisJCSAgICAgICBtc2ctPnNlcSwKKwkJICAgICAgIG1zZy0+aGRyLmZsYWdzICYgUlhSUENfSlVNQk9fUEFDS0VUCT8gJ2onIDogJy0nLAorCQkgICAgICAgbXNnLT5oZHIuZmxhZ3MgJiBSWFJQQ19NT1JFX1BBQ0tFVFMJPyAnbScgOiAnLScsCisJCSAgICAgICBtc2ctPmhkci5mbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUCT8gJ2wnIDogJy0nLAorCQkgICAgICAgbXNnLT5oZHIuZmxhZ3MgJiBSWFJQQ19SRVFVRVNUX0FDSwk/ICdyJyA6ICctJywKKwkJICAgICAgIG1zZy0+aGRyLmZsYWdzICYgUlhSUENfQ0xJRU5UX0lOSVRJQVRFRAk/ICdDJyA6ICdTJworCQkgICAgICAgKTsKKworCQlzd2l0Y2ggKG1zZy0+aGRyLnR5cGUpIHsKKwkJCS8qIGRlYWwgd2l0aCBkYXRhIHBhY2tldHMgKi8KKwkJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBOgorCQkJLyogQUNLIHRoZSBwYWNrZXQgaWYgbmVjZXNzYXJ5ICovCisJCQlzd2l0Y2ggKHJ4cnBjX2NhbGxfZ2VuZXJhdGVfQUNLKGNhbGwsICZtc2ctPmhkciwKKwkJCQkJCQlOVUxMKSkgeworCQkJY2FzZSAwOiAvKiB1c2VmdWwgcGFja2V0ICovCisJCQkJcnhycGNfY2FsbF9yZWNlaXZlX2RhdGFfcGFja2V0KGNhbGwsIG1zZyk7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6IC8qIGR1cGxpY2F0ZSBvciBvdXQtb2Ytd2luZG93IHBhY2tldCAqLworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJYnJlYWs7CisKKwkJCS8qIGRlYWwgd2l0aCBBQ0sgcGFja2V0cyAqLworCQljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0FDSzoKKwkJCXJ4cnBjX2NhbGxfcmVjZWl2ZV9hY2tfcGFja2V0KGNhbGwsIG1zZyk7CisJCQlicmVhazsKKworCQkJLyogZGVhbCB3aXRoIGFib3J0IHBhY2tldHMgKi8KKwkJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVDogeworCQkJX19iZTMyIF9kYnVmLCAqZHA7CisKKwkJCWRwID0gc2tiX2hlYWRlcl9wb2ludGVyKG1zZy0+cGt0LCBtc2ctPm9mZnNldCwKKwkJCQkJCXNpemVvZihfZGJ1ZiksICZfZGJ1Zik7CisJCQlpZiAoZHAgPT0gTlVMTCkKKwkJCQlwcmludGsoIlJ4IFJlY2VpdmVkIHNob3J0IEFCT1JUIHBhY2tldFxuIik7CisKKwkJCV9wcm90bygiUnggUmVjZWl2ZWQgQ2FsbCBBQk9SVCB7IGRhdGE9JWQgfSIsCisJCQkgICAgICAgKGRwID8gbnRvaGwoKmRwKSA6IDApKTsKKworCQkJc3Bpbl9sb2NrKCZjYWxsLT5sb2NrKTsKKwkJCWNhbGwtPmFwcF9jYWxsX3N0YXRlCT0gUlhSUENfQ1NUQVRFX0VSUk9SOworCQkJY2FsbC0+YXBwX2Vycl9zdGF0ZQk9IFJYUlBDX0VTVEFURV9QRUVSX0FCT1JUOworCQkJY2FsbC0+YXBwX2Fib3J0X2NvZGUJPSAoZHAgPyBudG9obCgqZHApIDogMCk7CisJCQljYWxsLT5hcHBfZXJybm8JCT0gLUVDT05OQUJPUlRFRDsKKwkJCWNhbGwtPmFwcF9tYXJrCQk9IFJYUlBDX0FQUF9NQVJLX0VPRjsKKwkJCWNhbGwtPmFwcF9yZWFkX2J1Zgk9IE5VTEw7CisJCQljYWxsLT5hcHBfYXN5bmNfcmVhZAk9IDA7CisKKwkJCS8qIGFzayB0aGUgYXBwIHRvIHRyYW5zbGF0ZSB0aGUgZXJyb3IgY29kZSAqLworCQkJY2FsbC0+YXBwX2FlbWFwX2Z1bmMoY2FsbCk7CisJCQlfc3RhdGUoY2FsbCk7CisJCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7CisJCQljYWxsLT5hcHBfZXJyb3JfZnVuYyhjYWxsKTsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCQkvKiBkZWFsIHdpdGggb3RoZXIgcGFja2V0IHR5cGVzICovCisJCQlfcHJvdG8oIlJ4IFVuc3VwcG9ydGVkIHBhY2tldCB0eXBlICV1ICgjJXUpIiwKKwkJCSAgICAgICBtc2ctPmhkci50eXBlLCBtc2ctPnNlcSk7CisJCQlicmVhazsKKwkJfQorCisJCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7CisJfQorCisgb3V0OgorCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworCV9sZWF2ZSgiIik7Cit9IC8qIGVuZCByeHJwY19jYWxsX3JlY2VpdmVfcGFja2V0KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHByb2Nlc3MgbmV4dCBkYXRhIHBhY2tldAorICogLSBhcyB0aGUgbmV4dCBkYXRhIHBhY2tldCBhcnJpdmVzOgorICogICAtIGl0IGlzIHF1ZXVlZCBvbiBhcHBfcmVhZHlxIF9pZl8gaXQgaXMgdGhlIG5leHQgb25lIGV4cGVjdGVkCisgKiAgICAgKGFwcF9yZWFkeV9zZXErMSkKKyAqICAgLSBpdCBpcyBxdWV1ZWQgb24gYXBwX3VucmVhZHlxIF9pZl8gaXQgaXMgbm90IHRoZSBuZXh0IG9uZSBleHBlY3RlZAorICogICAtIGlmIGEgcGFja2V0IHBsYWNlZCBvbiBhcHBfcmVhZHlxIGNvbXBsZXRlbHkgZmlsbHMgYSBob2xlIGxlYWRpbmcgdXAgdG8KKyAqICAgICB0aGUgZmlyc3QgcGFja2V0IG9uIGFwcF91bnJlYWR5cSwgdGhlbiBwYWNrZXRzIG5vdyBpbiBzZXF1ZW5jZSBhcmUKKyAqICAgICB0cmFuZmVycmVkIHRvIGFwcF9yZWFkeXEKKyAqIC0gdGhlIGFwcGxpY2F0aW9uIGxheWVyIGNhbiBvbmx5IHNlZSBwYWNrZXRzIG9uIGFwcF9yZWFkeXEKKyAqICAgKGFwcF9yZWFkeV9xdHkgYnl0ZXMpCisgKiAtIHRoZSBhcHBsaWNhdGlvbiBsYXllciBpcyBwcm9kZGVkIGV2ZXJ5IHRpbWUgYSBuZXcgcGFja2V0IGFycml2ZXMKKyAqLworc3RhdGljIHZvaWQgcnhycGNfY2FsbF9yZWNlaXZlX2RhdGFfcGFja2V0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJCQkgICBzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnKQoreworCWNvbnN0IHN0cnVjdCByeHJwY19vcGVyYXRpb24gKm9wdGJsLCAqb3A7CisJc3RydWN0IHJ4cnBjX21lc3NhZ2UgKnBtc2c7CisJc3RydWN0IGxpc3RfaGVhZCAqX3A7CisJaW50IHJldCwgbG8sIGhpLCBybXRpbW87CisJX19iZTMyIG9waWQ7CisKKwlfZW50ZXIoIiVweyV1fSwlcHsldX0iLCBjYWxsLCBudG9obChjYWxsLT5jYWxsX2lkKSwgbXNnLCBtc2ctPnNlcSk7CisKKwlyeHJwY19nZXRfbWVzc2FnZShtc2cpOworCisJLyogYWRkIHRvIHRoZSB1bnJlYWR5IHF1ZXVlIGlmIHdlJ2QgaGF2ZSB0byBjcmVhdGUgYSBob2xlIGluIHRoZSByZWFkeQorCSAqIHF1ZXVlIG90aGVyd2lzZSAqLworCWlmIChtc2ctPnNlcSAhPSBjYWxsLT5hcHBfcmVhZHlfc2VxICsgMSkgeworCQlfZGVidWcoIkNhbGwgYWRkIHBhY2tldCAlZCB0byB1bnJlYWR5cSIsIG1zZy0+c2VxKTsKKworCQkvKiBpbnNlcnQgaW4gc2VxIG9yZGVyICovCisJCWxpc3RfZm9yX2VhY2goX3AsICZjYWxsLT5hcHBfdW5yZWFkeXEpIHsKKwkJCXBtc2cgPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7CisJCQlpZiAocG1zZy0+c2VxID4gbXNnLT5zZXEpCisJCQkJYnJlYWs7CisJCX0KKworCQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpbmssIF9wKTsKKworCQlfbGVhdmUoIiBbdW5yZWFkeXFdIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBuZXh0IGluIHNlcXVlbmNlIC0gc2ltcGx5IGFwcGVuZCBpbnRvIHRoZSBjYWxsJ3MgcmVhZHkgcXVldWUgKi8KKwlfZGVidWcoIkNhbGwgYWRkIHBhY2tldCAlZCB0byByZWFkeXEgKCslWmQgPT4gJVpkIGJ5dGVzKSIsCisJICAgICAgIG1zZy0+c2VxLCBtc2ctPmRzaXplLCBjYWxsLT5hcHBfcmVhZHlfcXR5KTsKKworCXNwaW5fbG9jaygmY2FsbC0+bG9jayk7CisJY2FsbC0+YXBwX3JlYWR5X3NlcSA9IG1zZy0+c2VxOworCWNhbGwtPmFwcF9yZWFkeV9xdHkgKz0gbXNnLT5kc2l6ZTsKKwlsaXN0X2FkZF90YWlsKCZtc2ctPmxpbmssICZjYWxsLT5hcHBfcmVhZHlxKTsKKworCS8qIG1vdmUgdW5yZWFkeSBwYWNrZXRzIHRvIHRoZSByZWFkeXEgaWYgd2UgZ290IHJpZCBvZiBhIGhvbGUgKi8KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmNhbGwtPmFwcF91bnJlYWR5cSkpIHsKKwkJcG1zZyA9IGxpc3RfZW50cnkoY2FsbC0+YXBwX3VucmVhZHlxLm5leHQsCisJCQkJICBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7CisKKwkJaWYgKHBtc2ctPnNlcSAhPSBjYWxsLT5hcHBfcmVhZHlfc2VxICsgMSkKKwkJCWJyZWFrOworCisJCS8qIG5leHQgaW4gc2VxdWVuY2UgLSBqdXN0IG1vdmUgbGlzdC10by1saXN0ICovCisJCV9kZWJ1ZygiQ2FsbCB0cmFuc2ZlciBwYWNrZXQgJWQgdG8gcmVhZHlxICgrJVpkID0+ICVaZCBieXRlcykiLAorCQkgICAgICAgcG1zZy0+c2VxLCBwbXNnLT5kc2l6ZSwgY2FsbC0+YXBwX3JlYWR5X3F0eSk7CisKKwkJY2FsbC0+YXBwX3JlYWR5X3NlcSA9IHBtc2ctPnNlcTsKKwkJY2FsbC0+YXBwX3JlYWR5X3F0eSArPSBwbXNnLT5kc2l6ZTsKKwkJbGlzdF9kZWxfaW5pdCgmcG1zZy0+bGluayk7CisJCWxpc3RfYWRkX3RhaWwoJnBtc2ctPmxpbmssICZjYWxsLT5hcHBfcmVhZHlxKTsKKwl9CisKKwkvKiBzZWUgaWYgd2UndmUgZ290IHRoZSBsYXN0IHBhY2tldCB5ZXQgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmNhbGwtPmFwcF9yZWFkeXEpKSB7CisJCXBtc2cgPSBsaXN0X2VudHJ5KGNhbGwtPmFwcF9yZWFkeXEucHJldiwKKwkJCQkgIHN0cnVjdCByeHJwY19tZXNzYWdlLCBsaW5rKTsKKwkJaWYgKHBtc2ctPmhkci5mbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUKSB7CisJCQljYWxsLT5hcHBfbGFzdF9yY3YgPSAxOworCQkJX2RlYnVnKCJMYXN0IHBhY2tldCBvbiByZWFkeXEiKTsKKwkJfQorCX0KKworCXN3aXRjaCAoY2FsbC0+YXBwX2NhbGxfc3RhdGUpIHsKKwkJLyogZG8gbm90aGluZyBpZiBjYWxsIGFscmVhZHkgYWJvcnRlZCAqLworCWNhc2UgUlhSUENfQ1NUQVRFX0VSUk9SOgorCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7CisJCV9sZWF2ZSgiIFtlcnJvcl0iKTsKKwkJcmV0dXJuOworCisJCS8qIGV4dHJhY3QgdGhlIG9wZXJhdGlvbiBJRCBmcm9tIGFuIGluY29taW5nIGNhbGwgaWYgdGhhdCdzIG5vdAorCQkgKiB5ZXQgYmVlbiBkb25lICovCisJY2FzZSBSWFJQQ19DU1RBVEVfU1JWUl9SQ1ZfT1BJRDoKKwkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOworCisJCS8qIGhhbmRsZSBhcyB5ZXQgaW5zdWZmaWNpZW50IGRhdGEgZm9yIHRoZSBvcGVyYXRpb24gSUQgKi8KKwkJaWYgKGNhbGwtPmFwcF9yZWFkeV9xdHkgPCA0KSB7CisJCQlpZiAoY2FsbC0+YXBwX2xhc3RfcmN2KQorCQkJCS8qIHRyb3VibGUgLSBsYXN0IHBhY2tldCBzZWVuICovCisJCQkJcnhycGNfY2FsbF9hYm9ydChjYWxsLCAtRUlOVkFMKTsKKworCQkJX2xlYXZlKCIiKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIHB1bGwgdGhlIG9wZXJhdGlvbiBJRCBvdXQgb2YgdGhlIGJ1ZmZlciAqLworCQlyZXQgPSByeHJwY19jYWxsX3JlYWRfZGF0YShjYWxsLCAmb3BpZCwgc2l6ZW9mKG9waWQpLCAwKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50aygiVW5leHBlY3RlZCBlcnJvciBmcm9tIHJlYWQtZGF0YTogJWRcbiIsIHJldCk7CisJCQlpZiAoY2FsbC0+YXBwX2NhbGxfc3RhdGUgIT0gUlhSUENfQ1NUQVRFX0VSUk9SKQorCQkJCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKKwkJCV9sZWF2ZSgiIik7CisJCQlyZXR1cm47CisJCX0KKwkJY2FsbC0+YXBwX29wY29kZSA9IG50b2hsKG9waWQpOworCisJCS8qIGxvY2F0ZSB0aGUgb3BlcmF0aW9uIGluIHRoZSBhdmFpbGFibGUgb3BzIHRhYmxlICovCisJCW9wdGJsID0gY2FsbC0+Y29ubi0+c2VydmljZS0+b3BzX2JlZ2luOworCQlsbyA9IDA7CisJCWhpID0gY2FsbC0+Y29ubi0+c2VydmljZS0+b3BzX2VuZCAtIG9wdGJsOworCisJCXdoaWxlIChsbyA8IGhpKSB7CisJCQlpbnQgbWlkID0gKGhpICsgbG8pIC8gMjsKKwkJCW9wID0gJm9wdGJsW21pZF07CisJCQlpZiAoY2FsbC0+YXBwX29wY29kZSA9PSBvcC0+aWQpCisJCQkJZ290byBmb3VuZF9vcDsKKwkJCWlmIChjYWxsLT5hcHBfb3Bjb2RlID4gb3AtPmlkKQorCQkJCWxvID0gbWlkICsgMTsKKwkJCWVsc2UKKwkJCQloaSA9IG1pZDsKKwkJfQorCisJCS8qIHNlYXJjaCBmYWlsZWQgKi8KKwkJa3Byb3RvKCJSeCBDbGllbnQgcmVxdWVzdGVkIG9wZXJhdGlvbiAlZCBmcm9tICVzIHNlcnZpY2UiLAorCQkgICAgICAgY2FsbC0+YXBwX29wY29kZSwgY2FsbC0+Y29ubi0+c2VydmljZS0+bmFtZSk7CisJCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgLUVJTlZBTCk7CisJCV9sZWF2ZSgiIFtpbnZhbF0iKTsKKwkJcmV0dXJuOworCisJZm91bmRfb3A6CisJCV9wcm90bygiUnggQ2xpZW50IHJlcXVlc3RlZCBvcGVyYXRpb24gJXMgZnJvbSAlcyBzZXJ2aWNlIiwKKwkJICAgICAgIG9wLT5uYW1lLCBjYWxsLT5jb25uLT5zZXJ2aWNlLT5uYW1lKTsKKworCQkvKiB3ZSdyZSBub3cgd2FpdGluZyBmb3IgdGhlIGFyZ3VtZW50IGJsb2NrICh1bmxlc3MgdGhlIGNhbGwKKwkJICogd2FzIGFib3J0ZWQpICovCisJCXNwaW5fbG9jaygmY2FsbC0+bG9jayk7CisJCWlmIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSA9PSBSWFJQQ19DU1RBVEVfU1JWUl9SQ1ZfT1BJRCB8fAorCQkgICAgY2FsbC0+YXBwX2NhbGxfc3RhdGUgPT0gUlhSUENfQ1NUQVRFX1NSVlJfU05EX1JFUExZKSB7CisJCQlpZiAoIWNhbGwtPmFwcF9sYXN0X3JjdikKKwkJCQljYWxsLT5hcHBfY2FsbF9zdGF0ZSA9CisJCQkJCVJYUlBDX0NTVEFURV9TUlZSX1JDVl9BUkdTOworCQkJZWxzZSBpZiAoY2FsbC0+YXBwX3JlYWR5X3F0eSA+IDApCisJCQkJY2FsbC0+YXBwX2NhbGxfc3RhdGUgPQorCQkJCQlSWFJQQ19DU1RBVEVfU1JWUl9HT1RfQVJHUzsKKwkJCWVsc2UKKwkJCQljYWxsLT5hcHBfY2FsbF9zdGF0ZSA9CisJCQkJCVJYUlBDX0NTVEFURV9TUlZSX1NORF9SRVBMWTsKKwkJCWNhbGwtPmFwcF9tYXJrID0gb3AtPmFzaXplOworCQkJY2FsbC0+YXBwX3VzZXIgPSBvcC0+dXNlcjsKKwkJfQorCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7CisKKwkJX3N0YXRlKGNhbGwpOworCQlicmVhazsKKworCWNhc2UgUlhSUENfQ1NUQVRFX1NSVlJfUkNWX0FSR1M6CisJCS8qIGNoYW5nZSBzdGF0ZSBpZiBqdXN0IHJlY2VpdmVkIGxhc3QgcGFja2V0IG9mIGFyZyBibG9jayAqLworCQlpZiAoY2FsbC0+YXBwX2xhc3RfcmN2KQorCQkJY2FsbC0+YXBwX2NhbGxfc3RhdGUgPSBSWFJQQ19DU1RBVEVfU1JWUl9HT1RfQVJHUzsKKwkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOworCisJCV9zdGF0ZShjYWxsKTsKKwkJYnJlYWs7CisKKwljYXNlIFJYUlBDX0NTVEFURV9DTE5UX1JDVl9SRVBMWToKKwkJLyogY2hhbmdlIHN0YXRlIGlmIGp1c3QgcmVjZWl2ZWQgbGFzdCBwYWNrZXQgb2YgcmVwbHkgYmxvY2sgKi8KKwkJcm10aW1vID0gMDsKKwkJaWYgKGNhbGwtPmFwcF9sYXN0X3JjdikgeworCQkJY2FsbC0+YXBwX2NhbGxfc3RhdGUgPSBSWFJQQ19DU1RBVEVfQ0xOVF9HT1RfUkVQTFk7CisJCQlybXRpbW8gPSAxOworCQl9CisJCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKKworCQlpZiAocm10aW1vKSB7CisJCQlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrc190aW1lb3V0KTsKKwkJCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5yY3ZfdGltZW91dCk7CisJCQlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrcl9kZnJfdGltbyk7CisJCX0KKworCQlfc3RhdGUoY2FsbCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogZGVhbCB3aXRoIGRhdGEgcmVjZXB0aW9uIGluIGFuIHVuZXhwZWN0ZWQgc3RhdGUgKi8KKwkJcHJpbnRrKCJVbmV4cGVjdGVkIHN0YXRlIFtbWyAldSBdXV1cbiIsIGNhbGwtPmFwcF9jYWxsX3N0YXRlKTsKKwkJX19yeHJwY19jYWxsX2Fib3J0KGNhbGwsIC1FQkFETVNHKTsKKwkJX2xlYXZlKCIiKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSA9PSBSWFJQQ19DU1RBVEVfQ0xOVF9SQ1ZfUkVQTFkgJiYKKwkgICAgY2FsbC0+YXBwX2xhc3RfcmN2KQorCQlCVUcoKTsKKworCS8qIG90aGVyd2lzZSBqdXN0IGludm9rZSB0aGUgZGF0YSBmdW5jdGlvbiB3aGVuZXZlciB3ZSBjYW4gc2F0aXNmeSBpdHMgZGVzaXJlIGZvciBtb3JlCisJICogZGF0YQorCSAqLworCV9wcm90bygiUnggUmVjZWl2ZWQgT3AgRGF0YTogc3Q9JXUgcXR5PSVadSBtaz0lWnUlcyIsCisJICAgICAgIGNhbGwtPmFwcF9jYWxsX3N0YXRlLCBjYWxsLT5hcHBfcmVhZHlfcXR5LCBjYWxsLT5hcHBfbWFyaywKKwkgICAgICAgY2FsbC0+YXBwX2xhc3RfcmN2ID8gIiBsYXN0LXJjdmQiIDogIiIpOworCisJc3Bpbl9sb2NrKCZjYWxsLT5sb2NrKTsKKworCXJldCA9IF9fcnhycGNfY2FsbF9yZWFkX2RhdGEoY2FsbCk7CisJc3dpdGNoIChyZXQpIHsKKwljYXNlIDA6CisJCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKKwkJY2FsbC0+YXBwX2F0dG5fZnVuYyhjYWxsKTsKKwkJYnJlYWs7CisJY2FzZSAtRUFHQUlOOgorCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7CisJCWJyZWFrOworCWNhc2UgLUVDT05OQUJPUlRFRDoKKwkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlfX3J4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKKwkJYnJlYWs7CisJfQorCisJX3N0YXRlKGNhbGwpOworCisJX2xlYXZlKCIiKTsKKworfSAvKiBlbmQgcnhycGNfY2FsbF9yZWNlaXZlX2RhdGFfcGFja2V0KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHJlY2VpdmVkIGFuIEFDSyBwYWNrZXQKKyAqLworc3RhdGljIHZvaWQgcnhycGNfY2FsbF9yZWNlaXZlX2Fja19wYWNrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJCSAgc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZykKK3sKKwlzdHJ1Y3QgcnhycGNfYWNrcGFja2V0IF9hY2ssICphcDsKKwlyeHJwY19zZXJpYWxfbmV0X3Qgc2VyaWFsOworCXJ4cnBjX3NlcV90IHNlcTsKKwlpbnQgcmV0OworCisJX2VudGVyKCIlcHsldX0sJXB7JXV9IiwgY2FsbCwgbnRvaGwoY2FsbC0+Y2FsbF9pZCksIG1zZywgbXNnLT5zZXEpOworCisJLyogZXh0cmFjdCB0aGUgYmFzaWMgQUNLIHJlY29yZCAqLworCWFwID0gc2tiX2hlYWRlcl9wb2ludGVyKG1zZy0+cGt0LCBtc2ctPm9mZnNldCwgc2l6ZW9mKF9hY2spLCAmX2Fjayk7CisJaWYgKGFwID09IE5VTEwpIHsKKwkJcHJpbnRrKCJSeCBSZWNlaXZlZCBzaG9ydCBBQ0sgcGFja2V0XG4iKTsKKwkJcmV0dXJuOworCX0KKwltc2ctPm9mZnNldCArPSBzaXplb2YoX2Fjayk7CisKKwlzZXJpYWwgPSBhcC0+c2VyaWFsOworCXNlcSA9IG50b2hsKGFwLT5maXJzdFBhY2tldCk7CisKKwlfcHJvdG8oIlJ4IFJlY2VpdmVkIEFDSyAlJSVkIHsgYj0laHUgbT0laHUgZj0ldSBwPSV1IHM9JXUgcj0lcyBuPSV1IH0iLAorCSAgICAgICBudG9obChtc2ctPmhkci5zZXJpYWwpLAorCSAgICAgICBudG9ocyhhcC0+YnVmZmVyU3BhY2UpLAorCSAgICAgICBudG9ocyhhcC0+bWF4U2tldyksCisJICAgICAgIHNlcSwKKwkgICAgICAgbnRvaGwoYXAtPnByZXZpb3VzUGFja2V0KSwKKwkgICAgICAgbnRvaGwoc2VyaWFsKSwKKwkgICAgICAgcnhycGNfYWNrc1thcC0+cmVhc29uXSwKKwkgICAgICAgY2FsbC0+YWNrci5uQWNrcworCSAgICAgICApOworCisJLyogY2hlY2sgdGhlIG90aGVyIHNpZGUgaXNuJ3QgQUNLJ2luZyBhIHNlcXVlbmNlIG51bWJlciBJIGhhdmVuJ3Qgc2VudAorCSAqIHlldCAqLworCWlmIChhcC0+bkFja3MgPiAwICYmCisJICAgIChzZXEgPiBjYWxsLT5zbmRfc2VxX2NvdW50IHx8CisJICAgICBzZXEgKyBhcC0+bkFja3MgLSAxID4gY2FsbC0+c25kX3NlcV9jb3VudCkpIHsKKwkJcHJpbnRrKCJSZWNlaXZlZCBBQ0sgKCMldS0jJXUpIGZvciB1bnNlbnQgcGFja2V0XG4iLAorCQkgICAgICAgc2VxLCBzZXEgKyBhcC0+bkFja3MgLSAxKTsKKwkJcnhycGNfY2FsbF9hYm9ydChjYWxsLCAtRUlOVkFMKTsKKwkJX2xlYXZlKCIiKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGRlYWwgd2l0aCBSVFQgY2FsY3VsYXRpb24gKi8KKwlpZiAoc2VyaWFsKSB7CisJCXN0cnVjdCByeHJwY19tZXNzYWdlICpydHRtc2c7CisKKwkJLyogZmluZCB0aGUgcHJvbXB0aW5nIHBhY2tldCAqLworCQlzcGluX2xvY2soJmNhbGwtPmxvY2spOworCQlpZiAoY2FsbC0+c25kX3BpbmcgJiYgY2FsbC0+c25kX3BpbmctPmhkci5zZXJpYWwgPT0gc2VyaWFsKSB7CisJCQkvKiBpdCB3YXMgYSBwaW5nIHBhY2tldCAqLworCQkJcnR0bXNnID0gY2FsbC0+c25kX3Bpbmc7CisJCQljYWxsLT5zbmRfcGluZyA9IE5VTEw7CisJCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7CisKKwkJCWlmIChydHRtc2cpIHsKKwkJCQlydHRtc2ctPnJ0dGRvbmUgPSAxOworCQkJCXJ4cnBjX3BlZXJfY2FsY3VsYXRlX3J0dChjYWxsLT5jb25uLT5wZWVyLAorCQkJCQkJCSBydHRtc2csIG1zZyk7CisJCQkJcnhycGNfcHV0X21lc3NhZ2UocnR0bXNnKTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKl9wOworCisJCQkvKiBpdCBvdWdodCB0byBiZSBhIGRhdGEgcGFja2V0IC0gbG9vayBpbiB0aGUgcGVuZGluZworCQkJICogQUNLIGxpc3QgKi8KKwkJCWxpc3RfZm9yX2VhY2goX3AsICZjYWxsLT5hY2tzX3BlbmRxKSB7CisJCQkJcnR0bXNnID0gbGlzdF9lbnRyeShfcCwgc3RydWN0IHJ4cnBjX21lc3NhZ2UsCisJCQkJCQkgICAgbGluayk7CisJCQkJaWYgKHJ0dG1zZy0+aGRyLnNlcmlhbCA9PSBzZXJpYWwpIHsKKwkJCQkJaWYgKHJ0dG1zZy0+cnR0ZG9uZSkKKwkJCQkJCS8qIG5ldmVyIGRvIFJUVCB0d2ljZSB3aXRob3V0CisJCQkJCQkgKiByZXNlbmRpbmcgKi8KKwkJCQkJCWJyZWFrOworCisJCQkJCXJ0dG1zZy0+cnR0ZG9uZSA9IDE7CisJCQkJCXJ4cnBjX3BlZXJfY2FsY3VsYXRlX3J0dCgKKwkJCQkJCWNhbGwtPmNvbm4tPnBlZXIsIHJ0dG1zZywgbXNnKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOworCQl9CisJfQorCisJc3dpdGNoIChhcC0+cmVhc29uKSB7CisJCS8qIGRlYWwgd2l0aCBuZWdhdGl2ZS9wb3NpdGl2ZSBhY2tub3dsZWRnZW1lbnQgb2YgZGF0YQorCQkgKiBwYWNrZXRzICovCisJY2FzZSBSWFJQQ19BQ0tfUkVRVUVTVEVEOgorCWNhc2UgUlhSUENfQUNLX0RFTEFZOgorCWNhc2UgUlhSUENfQUNLX0lETEU6CisJCXJ4cnBjX2NhbGxfZGVmaW5pdGl2ZWx5X0FDSyhjYWxsLCBzZXEgLSAxKTsKKworCWNhc2UgUlhSUENfQUNLX0RVUExJQ0FURToKKwljYXNlIFJYUlBDX0FDS19PVVRfT0ZfU0VRVUVOQ0U6CisJY2FzZSBSWFJQQ19BQ0tfRVhDRUVEU19XSU5ET1c6CisJCWNhbGwtPnNuZF9yZXNlbmRfY250ID0gMDsKKwkJcmV0ID0gcnhycGNfY2FsbF9yZWNvcmRfQUNLKGNhbGwsIG1zZywgc2VxLCBhcC0+bkFja3MpOworCQlpZiAocmV0IDwgMCkKKwkJCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKKwkJYnJlYWs7CisKKwkJLyogcmVzcG9uZCB0byBwaW5nIHBhY2tldHMgaW1tZWRpYXRlbHkgKi8KKwljYXNlIFJYUlBDX0FDS19QSU5HOgorCQlyeHJwY19jYWxsX2dlbmVyYXRlX0FDSyhjYWxsLCAmbXNnLT5oZHIsIGFwKTsKKwkJYnJlYWs7CisKKwkJLyogb25seSByZWNvcmQgUlRUIG9uIHBpbmcgcmVzcG9uc2UgcGFja2V0cyAqLworCWNhc2UgUlhSUENfQUNLX1BJTkdfUkVTUE9OU0U6CisJCWlmIChjYWxsLT5zbmRfcGluZykgeworCQkJc3RydWN0IHJ4cnBjX21lc3NhZ2UgKnJ0dG1zZzsKKworCQkJLyogb25seSBkbyBSVFQgc3R1ZmYgaWYgdGhlIHJlc3BvbnNlIG1hdGNoZXMgdGhlCisJCQkgKiByZXRhaW5lZCBwaW5nICovCisJCQlydHRtc2cgPSBOVUxMOworCQkJc3Bpbl9sb2NrKCZjYWxsLT5sb2NrKTsKKwkJCWlmIChjYWxsLT5zbmRfcGluZyAmJgorCQkJICAgIGNhbGwtPnNuZF9waW5nLT5oZHIuc2VyaWFsID09IGFwLT5zZXJpYWwpIHsKKwkJCQlydHRtc2cgPSBjYWxsLT5zbmRfcGluZzsKKwkJCQljYWxsLT5zbmRfcGluZyA9IE5VTEw7CisJCQl9CisJCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7CisKKwkJCWlmIChydHRtc2cpIHsKKwkJCQlydHRtc2ctPnJ0dGRvbmUgPSAxOworCQkJCXJ4cnBjX3BlZXJfY2FsY3VsYXRlX3J0dChjYWxsLT5jb25uLT5wZWVyLAorCQkJCQkJCSBydHRtc2csIG1zZyk7CisJCQkJcnhycGNfcHV0X21lc3NhZ2UocnR0bXNnKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50aygiVW5zdXBwb3J0ZWQgQUNLIHJlYXNvbiAldVxuIiwgYXAtPnJlYXNvbik7CisJCWJyZWFrOworCX0KKworCV9sZWF2ZSgiIik7Cit9IC8qIGVuZCByeHJwY19jYWxsX3JlY2VpdmVfYWNrX3BhY2tldCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiByZWNvcmQgZGVmaW5pdGl2ZSBBQ0tzIGZvciBhbGwgbWVzc2FnZXMgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgb25lIHdpdGggdGhlCisgKiAnaGlnaGVzdCcgc2VxCisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfZGVmaW5pdGl2ZWx5X0FDSyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkJcnhycGNfc2VxX3QgaGlnaGVzdCkKK3sKKwlzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnOworCWludCBub3dfY29tcGxldGU7CisKKwlfZW50ZXIoIiVwe2Fkcz0ldX0sJXUiLCBjYWxsLCBjYWxsLT5hY2tzX2RmdHZfc2VxLCBoaWdoZXN0KTsKKworCXdoaWxlIChjYWxsLT5hY2tzX2RmdHZfc2VxIDwgaGlnaGVzdCkgeworCQljYWxsLT5hY2tzX2RmdHZfc2VxKys7CisKKwkJX3Byb3RvKCJEZWZpbml0aXZlIEFDSyBvbiBwYWNrZXQgIyV1IiwgY2FsbC0+YWNrc19kZnR2X3NlcSk7CisKKwkJLyogZGlzY2FyZCB0aG9zZSBhdCBmcm9udCBvZiBxdWV1ZSB1bnRpbCBtZXNzYWdlIHdpdGggaGlnaGVzdAorCQkgKiBBQ0sgaXMgZm91bmQgKi8KKwkJc3Bpbl9sb2NrKCZjYWxsLT5sb2NrKTsKKwkJbXNnID0gTlVMTDsKKwkJaWYgKCFsaXN0X2VtcHR5KCZjYWxsLT5hY2tzX3BlbmRxKSkgeworCQkJbXNnID0gbGlzdF9lbnRyeShjYWxsLT5hY2tzX3BlbmRxLm5leHQsCisJCQkJCSBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7CisJCQlsaXN0X2RlbF9pbml0KCZtc2ctPmxpbmspOyAvKiBkZXF1ZXVlICovCisJCQlpZiAobXNnLT5zdGF0ZSA9PSBSWFJQQ19NU0dfU0VOVCkKKwkJCQljYWxsLT5hY2tzX3BlbmRfY250LS07CisJCX0KKwkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOworCisJCS8qIGluc2FuaXR5IGNoZWNrICovCisJCWlmICghbXNnKQorCQkJcGFuaWMoIiVzKCk6IGFja3NfcGVuZHEgdW5leHBlY3RlZGx5IGVtcHR5XG4iLAorCQkJICAgICAgX19GVU5DVElPTl9fKTsKKworCQlpZiAobXNnLT5zZXEgIT0gY2FsbC0+YWNrc19kZnR2X3NlcSkKKwkJCXBhbmljKCIlcygpOiBQYWNrZXQgIyV1IGV4cGVjdGVkIGF0IGZyb250IG9mIGFja3NfcGVuZHEiCisJCQkgICAgICAiICgjJXUgZm91bmQpXG4iLAorCQkJICAgICAgX19GVU5DVElPTl9fLCBjYWxsLT5hY2tzX2RmdHZfc2VxLCBtc2ctPnNlcSk7CisKKwkJLyogZGlzY2FyZCB0aGUgbWVzc2FnZSAqLworCQltc2ctPnN0YXRlID0gUlhSUENfTVNHX0RPTkU7CisJCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7CisJfQorCisJLyogaWYgYWxsIHNlbnQgcGFja2V0cyBhcmUgZGVmaW5pdGl2ZWx5IEFDSydkIHRoZW4gcHJvZCBhbnkgc2xlZXBlcnMganVzdCBpbiBjYXNlICovCisJbm93X2NvbXBsZXRlID0gMDsKKwlzcGluX2xvY2soJmNhbGwtPmxvY2spOworCWlmIChjYWxsLT5hY2tzX2RmdHZfc2VxID09IGNhbGwtPnNuZF9zZXFfY291bnQpIHsKKwkJaWYgKGNhbGwtPmFwcF9jYWxsX3N0YXRlICE9IFJYUlBDX0NTVEFURV9DT01QTEVURSkgeworCQkJY2FsbC0+YXBwX2NhbGxfc3RhdGUgPSBSWFJQQ19DU1RBVEVfQ09NUExFVEU7CisJCQlfc3RhdGUoY2FsbCk7CisJCQlub3dfY29tcGxldGUgPSAxOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKKworCWlmIChub3dfY29tcGxldGUpIHsKKwkJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja3NfdGltZW91dCk7CisJCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5yY3ZfdGltZW91dCk7CisJCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5hY2tyX2Rmcl90aW1vKTsKKwkJY2FsbC0+YXBwX2F0dG5fZnVuYyhjYWxsKTsKKwl9CisKKwlfbGVhdmUoIiIpOworfSAvKiBlbmQgcnhycGNfY2FsbF9kZWZpbml0aXZlbHlfQUNLKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHJlY29yZCB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBBQ0tzL05BS3MKKyAqLworc3RhdGljIGludCByeHJwY19jYWxsX3JlY29yZF9BQ0soc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJIHN0cnVjdCByeHJwY19tZXNzYWdlICptc2csCisJCQkJIHJ4cnBjX3NlcV90IHNlcSwKKwkJCQkgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCByeHJwY19tZXNzYWdlICpkbXNnOworCXN0cnVjdCBsaXN0X2hlYWQgKl9wOworCXJ4cnBjX3NlcV90IGhpZ2hlc3Q7CisJdW5zaWduZWQgaXg7CisJc2l6ZV90IGNodW5rOworCWNoYXIgcmVzZW5kLCBub3dfY29tcGxldGU7CisJdTggYWNrc1sxNl07CisKKwlfZW50ZXIoIiVwe2FwYz0ldSBhZHM9JXV9LCVwLCV1LCVadSIsCisJICAgICAgIGNhbGwsIGNhbGwtPmFja3NfcGVuZF9jbnQsIGNhbGwtPmFja3NfZGZ0dl9zZXEsCisJICAgICAgIG1zZywgc2VxLCBjb3VudCk7CisKKwkvKiBoYW5kbGUgcmUtQUNLJ2luZyBvZiBkZWZpbml0aXZlbHkgQUNLJ2QgcGFja2V0cyAobWF5IGJlIG91dC1vZi1vcmRlcgorCSAqIEFDS3MpICovCisJaWYgKHNlcSA8PSBjYWxsLT5hY2tzX2RmdHZfc2VxKSB7CisJCXVuc2lnbmVkIGRlbHRhID0gY2FsbC0+YWNrc19kZnR2X3NlcSAtIHNlcTsKKworCQlpZiAoY291bnQgPD0gZGVsdGEpIHsKKwkJCV9sZWF2ZSgiID0gMCBbYWxsIGRlZmluaXRpdmVseSBBQ0snZF0iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJc2VxICs9IGRlbHRhOworCQljb3VudCAtPSBkZWx0YTsKKwkJbXNnLT5vZmZzZXQgKz0gZGVsdGE7CisJfQorCisJaGlnaGVzdCA9IHNlcSArIGNvdW50IC0gMTsKKwlyZXNlbmQgPSAwOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJLyogZXh0cmFjdCB1cCB0byAxNiBBQ0sgc2xvdHMgYXQgYSB0aW1lICovCisJCWNodW5rID0gbWluKGNvdW50LCBzaXplb2YoYWNrcykpOworCQljb3VudCAtPSBjaHVuazsKKworCQltZW1zZXQoYWNrcywgMiwgc2l6ZW9mKGFja3MpKTsKKworCQlpZiAoc2tiX2NvcHlfYml0cyhtc2ctPnBrdCwgbXNnLT5vZmZzZXQsICZhY2tzLCBjaHVuaykgPCAwKSB7CisJCQlwcmludGsoIlJ4IFJlY2VpdmVkIHNob3J0IEFDSyBwYWNrZXRcbiIpOworCQkJX2xlYXZlKCIgPSAtRUlOVkFMIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQltc2ctPm9mZnNldCArPSBjaHVuazsKKworCQkvKiBjaGVjayB0aGF0IHRoZSBBQ0sgc2V0IGlzIHZhbGlkICovCisJCWZvciAoaXggPSAwOyBpeCA8IGNodW5rOyBpeCsrKSB7CisJCQlzd2l0Y2ggKGFja3NbaXhdKSB7CisJCQljYXNlIFJYUlBDX0FDS19UWVBFX0FDSzoKKwkJCQlicmVhazsKKwkJCWNhc2UgUlhSUENfQUNLX1RZUEVfTkFDSzoKKwkJCQlyZXNlbmQgPSAxOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoIlJ4IFJlY2VpdmVkIHVuc3VwcG9ydGVkIEFDSyBzdGF0ZSIKKwkJCQkgICAgICAgIiAldVxuIiwgYWNrc1tpeF0pOworCQkJCV9sZWF2ZSgiID0gLUVJTlZBTCIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisKKwkJX3Byb3RvKCJSeCBBQ0sgb2YgcGFja2V0cyAjJXUtIyV1ICIKKwkJICAgICAgICJbJWMlYyVjJWMlYyVjJWMlYyVjJWMlYyVjJWMlYyVjJWNdIChwZW5kPSV1KSIsCisJCSAgICAgICBzZXEsICh1bnNpZ25lZCkgKHNlcSArIGNodW5rIC0gMSksCisJCSAgICAgICBfYWNrdHlwZVthY2tzWzB4MF1dLAorCQkgICAgICAgX2Fja3R5cGVbYWNrc1sweDFdXSwKKwkJICAgICAgIF9hY2t0eXBlW2Fja3NbMHgyXV0sCisJCSAgICAgICBfYWNrdHlwZVthY2tzWzB4M11dLAorCQkgICAgICAgX2Fja3R5cGVbYWNrc1sweDRdXSwKKwkJICAgICAgIF9hY2t0eXBlW2Fja3NbMHg1XV0sCisJCSAgICAgICBfYWNrdHlwZVthY2tzWzB4Nl1dLAorCQkgICAgICAgX2Fja3R5cGVbYWNrc1sweDddXSwKKwkJICAgICAgIF9hY2t0eXBlW2Fja3NbMHg4XV0sCisJCSAgICAgICBfYWNrdHlwZVthY2tzWzB4OV1dLAorCQkgICAgICAgX2Fja3R5cGVbYWNrc1sweEFdXSwKKwkJICAgICAgIF9hY2t0eXBlW2Fja3NbMHhCXV0sCisJCSAgICAgICBfYWNrdHlwZVthY2tzWzB4Q11dLAorCQkgICAgICAgX2Fja3R5cGVbYWNrc1sweERdXSwKKwkJICAgICAgIF9hY2t0eXBlW2Fja3NbMHhFXV0sCisJCSAgICAgICBfYWNrdHlwZVthY2tzWzB4Rl1dLAorCQkgICAgICAgY2FsbC0+YWNrc19wZW5kX2NudAorCQkgICAgICAgKTsKKworCQkvKiBtYXJrIHRoZSBwYWNrZXRzIGluIHRoZSBBQ0sgcXVldWUgYXMgYmVpbmcgcHJvdmlzaW9uYWxseQorCQkgKiBBQ0snZCAqLworCQlpeCA9IDA7CisJCXNwaW5fbG9jaygmY2FsbC0+bG9jayk7CisKKwkJLyogZmluZCB0aGUgZmlyc3QgcGFja2V0IEFDSydkL05BSydkIGhlcmUgKi8KKwkJbGlzdF9mb3JfZWFjaChfcCwgJmNhbGwtPmFja3NfcGVuZHEpIHsKKwkJCWRtc2cgPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7CisJCQlpZiAoZG1zZy0+c2VxID09IHNlcSkKKwkJCQlnb3RvIGZvdW5kX2ZpcnN0OworCQkJX2RlYnVnKCItICV1OiBza2lwcGluZyAjJXUiLCBpeCwgZG1zZy0+c2VxKTsKKwkJfQorCQlnb3RvIGJhZF9xdWV1ZTsKKworCWZvdW5kX2ZpcnN0OgorCQlkbyB7CisJCQlfZGVidWcoIi0gJXU6IHByb2Nlc3NpbmcgIyV1ICglYykgYXBjPSV1IiwKKwkJCSAgICAgICBpeCwgZG1zZy0+c2VxLCBfYWNrdHlwZVthY2tzW2l4XV0sCisJCQkgICAgICAgY2FsbC0+YWNrc19wZW5kX2NudCk7CisKKwkJCWlmIChhY2tzW2l4XSA9PSBSWFJQQ19BQ0tfVFlQRV9BQ0spIHsKKwkJCQlpZiAoZG1zZy0+c3RhdGUgPT0gUlhSUENfTVNHX1NFTlQpCisJCQkJCWNhbGwtPmFja3NfcGVuZF9jbnQtLTsKKwkJCQlkbXNnLT5zdGF0ZSA9IFJYUlBDX01TR19BQ0tFRDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWlmIChkbXNnLT5zdGF0ZSA9PSBSWFJQQ19NU0dfQUNLRUQpCisJCQkJCWNhbGwtPmFja3NfcGVuZF9jbnQrKzsKKwkJCQlkbXNnLT5zdGF0ZSA9IFJYUlBDX01TR19TRU5UOworCQkJfQorCQkJaXgrKzsKKwkJCXNlcSsrOworCisJCQlfcCA9IGRtc2ctPmxpbmsubmV4dDsKKwkJCWRtc2cgPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7CisJCX0gd2hpbGUoaXggPCBjaHVuayAmJgorCQkJX3AgIT0gJmNhbGwtPmFja3NfcGVuZHEgJiYKKwkJCWRtc2ctPnNlcSA9PSBzZXEpOworCisJCWlmIChpeCA8IGNodW5rKQorCQkJZ290byBiYWRfcXVldWU7CisKKwkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOworCX0KKworCWlmIChyZXNlbmQpCisJCXJ4cnBjX2NhbGxfcmVzZW5kKGNhbGwsIGhpZ2hlc3QpOworCisJLyogaWYgYWxsIHBhY2tldHMgYXJlIHByb3Zpc2lvbmFsbHkgQUNLJ2QsIHRoZW4gd2FrZSB1cCBhbnlvbmUgd2hvJ3MKKwkgKiB3YWl0aW5nIGZvciB0aGF0ICovCisJbm93X2NvbXBsZXRlID0gMDsKKwlzcGluX2xvY2soJmNhbGwtPmxvY2spOworCWlmIChjYWxsLT5hY2tzX3BlbmRfY250ID09IDApIHsKKwkJaWYgKGNhbGwtPmFwcF9jYWxsX3N0YXRlID09IFJYUlBDX0NTVEFURV9TUlZSX1JDVl9GSU5BTF9BQ0spIHsKKwkJCWNhbGwtPmFwcF9jYWxsX3N0YXRlID0gUlhSUENfQ1NUQVRFX0NPTVBMRVRFOworCQkJX3N0YXRlKGNhbGwpOworCQl9CisJCW5vd19jb21wbGV0ZSA9IDE7CisJfQorCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKKworCWlmIChub3dfY29tcGxldGUpIHsKKwkJX2RlYnVnKCItIHdha2UgdXAgd2FpdGVycyIpOworCQlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrc190aW1lb3V0KTsKKwkJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPnJjdl90aW1lb3V0KTsKKwkJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja3JfZGZyX3RpbW8pOworCQljYWxsLT5hcHBfYXR0bl9mdW5jKGNhbGwpOworCX0KKworCV9sZWF2ZSgiID0gMCAoYXBjPSV1KSIsIGNhbGwtPmFja3NfcGVuZF9jbnQpOworCXJldHVybiAwOworCisgYmFkX3F1ZXVlOgorCXBhbmljKCIlcygpOiBhY2tzX3BlbmRxIGluIGJhZCBzdGF0ZSAocGFja2V0ICMldSBhYnNlbnQpXG4iLAorCSAgICAgIF9fRlVOQ1RJT05fXywgc2VxKTsKKworfSAvKiBlbmQgcnhycGNfY2FsbF9yZWNvcmRfQUNLKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHRyYW5zZmVyIGRhdGEgZnJvbSB0aGUgcmVhZHkgcGFja2V0IHF1ZXVlIHRvIHRoZSBhc3luY2hyb25vdXMgcmVhZCBidWZmZXIKKyAqIC0gc2luY2UgdGhpcyBmdW5jIGlzIHRoZSBvbmx5IG9uZSBnb2luZyB0byBsb29rIGF0IHBhY2tldHMgcXVldWVkIG9uCisgKiAgIGFwcF9yZWFkeXEsIHdlIGRvbid0IG5lZWQgYSBsb2NrIHRvIG1vZGlmeSBvciBhY2Nlc3MgdGhlbSwgb25seSB0byBtb2RpZnkKKyAqICAgdGhlIHF1ZXVlIHBvaW50ZXJzCisgKiAtIGNhbGxlZCB3aXRoIGNhbGwtPmxvY2sgaGVsZAorICogLSB0aGUgYnVmZmVyIG11c3QgYmUgaW4ga2VybmVsIHNwYWNlCisgKiAtIHJldHVybnM6CisgKgkwIGlmIGJ1ZmZlciBmaWxsZWQKKyAqCS1FQUdBSU4gaWYgYnVmZmVyIG5vdCBmaWxsZWQgYW5kIG1vcmUgZGF0YSB0byBjb21lCisgKgktRUJBRE1TRyBpZiBsYXN0IHBhY2tldCByZWNlaXZlZCBhbmQgaW5zdWZmaWNpZW50IGRhdGEgbGVmdAorICoJLUVDT05OQUJPUlRFRCBpZiB0aGUgY2FsbCBoYXMgaW4gYW4gZXJyb3Igc3RhdGUKKyAqLworc3RhdGljIGludCBfX3J4cnBjX2NhbGxfcmVhZF9kYXRhKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCXN0cnVjdCByeHJwY19tZXNzYWdlICptc2c7CisJc2l6ZV90IHF0eTsKKwlpbnQgcmV0OworCisJX2VudGVyKCIlcHthcz0lZCBidWY9JXAgcXR5PSVadS8lWnV9IiwKKwkgICAgICAgY2FsbCwKKwkgICAgICAgY2FsbC0+YXBwX2FzeW5jX3JlYWQsIGNhbGwtPmFwcF9yZWFkX2J1ZiwKKwkgICAgICAgY2FsbC0+YXBwX3JlYWR5X3F0eSwgY2FsbC0+YXBwX21hcmspOworCisJLyogY2hlY2sgdGhlIHN0YXRlICovCisJc3dpdGNoIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSkgeworCWNhc2UgUlhSUENfQ1NUQVRFX1NSVlJfUkNWX0FSR1M6CisJY2FzZSBSWFJQQ19DU1RBVEVfQ0xOVF9SQ1ZfUkVQTFk6CisJCWlmIChjYWxsLT5hcHBfbGFzdF9yY3YpIHsKKwkJCXByaW50aygiJXMoJXAsJXAsJVpkKToiCisJCQkgICAgICAgIiBJbmNvbnNpc3RlbnQgY2FsbCBzdGF0ZSAoJXMsIGxhc3QgcGt0KSIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLAorCQkJICAgICAgIGNhbGwsIGNhbGwtPmFwcF9yZWFkX2J1ZiwgY2FsbC0+YXBwX21hcmssCisJCQkgICAgICAgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+YXBwX2NhbGxfc3RhdGVdKTsKKwkJCUJVRygpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSWFJQQ19DU1RBVEVfU1JWUl9SQ1ZfT1BJRDoKKwljYXNlIFJYUlBDX0NTVEFURV9TUlZSX0dPVF9BUkdTOgorCWNhc2UgUlhSUENfQ1NUQVRFX0NMTlRfR09UX1JFUExZOgorCQlicmVhazsKKworCWNhc2UgUlhSUENfQ1NUQVRFX1NSVlJfU05EX1JFUExZOgorCQlpZiAoIWNhbGwtPmFwcF9sYXN0X3JjdikgeworCQkJcHJpbnRrKCIlcyglcCwlcCwlWmQpOiIKKwkJCSAgICAgICAiIEluY29uc2lzdGVudCBjYWxsIHN0YXRlICglcywgbm90IGxhc3QgcGt0KSIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLAorCQkJICAgICAgIGNhbGwsIGNhbGwtPmFwcF9yZWFkX2J1ZiwgY2FsbC0+YXBwX21hcmssCisJCQkgICAgICAgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+YXBwX2NhbGxfc3RhdGVdKTsKKwkJCUJVRygpOworCQl9CisJCV9kZWJ1ZygiVHJ5aW5nIHRvIHJlYWQgZGF0YSBmcm9tIGNhbGwgaW4gU05EX1JFUExZIHN0YXRlIik7CisJCWJyZWFrOworCisJY2FzZSBSWFJQQ19DU1RBVEVfRVJST1I6CisJCV9sZWF2ZSgiID0gLUVDT05OQUJPUlRFRCIpOworCQlyZXR1cm4gLUVDT05OQUJPUlRFRDsKKworCWRlZmF1bHQ6CisJCXByaW50aygicmVhZGluZyBpbiB1bmV4cGVjdGVkIHN0YXRlIFtbWyAldSBdXV1cbiIsCisJCSAgICAgICBjYWxsLT5hcHBfY2FsbF9zdGF0ZSk7CisJCUJVRygpOworCX0KKworCS8qIGhhbmRsZSB0aGUgY2FzZSBvZiBub3QgaGF2aW5nIGFuIGFzeW5jIGJ1ZmZlciAqLworCWlmICghY2FsbC0+YXBwX2FzeW5jX3JlYWQpIHsKKwkJaWYgKGNhbGwtPmFwcF9tYXJrID09IFJYUlBDX0FQUF9NQVJLX0VPRikgeworCQkJcmV0ID0gY2FsbC0+YXBwX2xhc3RfcmN2ID8gMCA6IC1FQUdBSU47CisJCX0KKwkJZWxzZSB7CisJCQlpZiAoY2FsbC0+YXBwX21hcmsgPj0gY2FsbC0+YXBwX3JlYWR5X3F0eSkgeworCQkJCWNhbGwtPmFwcF9tYXJrID0gUlhSUENfQVBQX01BUktfRU9GOworCQkJCXJldCA9IDA7CisJCQl9CisJCQllbHNlIHsKKwkJCQlyZXQgPSBjYWxsLT5hcHBfbGFzdF9yY3YgPyAtRUJBRE1TRyA6IC1FQUdBSU47CisJCQl9CisJCX0KKworCQlfbGVhdmUoIiA9ICVkIFtubyBidWZdIiwgcmV0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZjYWxsLT5hcHBfcmVhZHlxKSAmJiBjYWxsLT5hcHBfbWFyayA+IDApIHsKKwkJbXNnID0gbGlzdF9lbnRyeShjYWxsLT5hcHBfcmVhZHlxLm5leHQsCisJCQkJIHN0cnVjdCByeHJwY19tZXNzYWdlLCBsaW5rKTsKKworCQkvKiBkcmFnIGFzIG11Y2ggZGF0YSBhcyB3ZSBuZWVkIG91dCBvZiB0aGlzIHBhY2tldCAqLworCQlxdHkgPSBtaW4oY2FsbC0+YXBwX21hcmssIG1zZy0+ZHNpemUpOworCisJCV9kZWJ1ZygicmVhZGluZyAlWnUgZnJvbSBza2I9JXAgb2ZmPSVsdSIsCisJCSAgICAgICBxdHksIG1zZy0+cGt0LCBtc2ctPm9mZnNldCk7CisKKwkJaWYgKGNhbGwtPmFwcF9yZWFkX2J1ZikKKwkJCWlmIChza2JfY29weV9iaXRzKG1zZy0+cGt0LCBtc2ctPm9mZnNldCwKKwkJCQkJICBjYWxsLT5hcHBfcmVhZF9idWYsIHF0eSkgPCAwKQorCQkJCXBhbmljKCIlczogRmFpbGVkIHRvIGNvcHkgZGF0YSBmcm9tIHBhY2tldDoiCisJCQkJICAgICAgIiAoJXAsJXAsJVpkKSIsCisJCQkJICAgICAgX19GVU5DVElPTl9fLAorCQkJCSAgICAgIGNhbGwsIGNhbGwtPmFwcF9yZWFkX2J1ZiwgcXR5KTsKKworCQkvKiBpZiB0aGF0IHBhY2tldCBpcyBub3cgZW1wdHksIGRpc2NhcmQgaXQgKi8KKwkJY2FsbC0+YXBwX3JlYWR5X3F0eSAtPSBxdHk7CisJCW1zZy0+ZHNpemUgLT0gcXR5OworCisJCWlmIChtc2ctPmRzaXplID09IDApIHsKKwkJCWxpc3RfZGVsX2luaXQoJm1zZy0+bGluayk7CisJCQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOworCQl9CisJCWVsc2UgeworCQkJbXNnLT5vZmZzZXQgKz0gcXR5OworCQl9CisKKwkJY2FsbC0+YXBwX21hcmsgLT0gcXR5OworCQlpZiAoY2FsbC0+YXBwX3JlYWRfYnVmKQorCQkJY2FsbC0+YXBwX3JlYWRfYnVmICs9IHF0eTsKKwl9CisKKwlpZiAoY2FsbC0+YXBwX21hcmsgPT0gMCkgeworCQljYWxsLT5hcHBfYXN5bmNfcmVhZCA9IDA7CisJCWNhbGwtPmFwcF9tYXJrID0gUlhSUENfQVBQX01BUktfRU9GOworCQljYWxsLT5hcHBfcmVhZF9idWYgPSBOVUxMOworCisJCS8qIGFkanVzdCB0aGUgc3RhdGUgaWYgdXNlZCB1cCBhbGwgcGFja2V0cyAqLworCQlpZiAobGlzdF9lbXB0eSgmY2FsbC0+YXBwX3JlYWR5cSkgJiYgY2FsbC0+YXBwX2xhc3RfcmN2KSB7CisJCQlzd2l0Y2ggKGNhbGwtPmFwcF9jYWxsX3N0YXRlKSB7CisJCQljYXNlIFJYUlBDX0NTVEFURV9TUlZSX1JDVl9PUElEOgorCQkJCWNhbGwtPmFwcF9jYWxsX3N0YXRlID0gUlhSUENfQ1NUQVRFX1NSVlJfU05EX1JFUExZOworCQkJCWNhbGwtPmFwcF9tYXJrID0gUlhSUENfQVBQX01BUktfRU9GOworCQkJCV9zdGF0ZShjYWxsKTsKKwkJCQlkZWxfdGltZXJfc3luYygmY2FsbC0+cmN2X3RpbWVvdXQpOworCQkJCWJyZWFrOworCQkJY2FzZSBSWFJQQ19DU1RBVEVfU1JWUl9HT1RfQVJHUzoKKwkJCQljYWxsLT5hcHBfY2FsbF9zdGF0ZSA9IFJYUlBDX0NTVEFURV9TUlZSX1NORF9SRVBMWTsKKwkJCQlfc3RhdGUoY2FsbCk7CisJCQkJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPnJjdl90aW1lb3V0KTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJY2FsbC0+YXBwX2NhbGxfc3RhdGUgPSBSWFJQQ19DU1RBVEVfQ09NUExFVEU7CisJCQkJX3N0YXRlKGNhbGwpOworCQkJCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5hY2tzX3RpbWVvdXQpOworCQkJCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5hY2tyX2Rmcl90aW1vKTsKKwkJCQlkZWxfdGltZXJfc3luYygmY2FsbC0+cmN2X3RpbWVvdXQpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJX2xlYXZlKCIgPSAwIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChjYWxsLT5hcHBfbGFzdF9yY3YpIHsKKwkJX2RlYnVnKCJJbnN1ZmZpY2llbnQgZGF0YSAoJVp1LyVadSkiLAorCQkgICAgICAgY2FsbC0+YXBwX3JlYWR5X3F0eSwgY2FsbC0+YXBwX21hcmspOworCQljYWxsLT5hcHBfYXN5bmNfcmVhZCA9IDA7CisJCWNhbGwtPmFwcF9tYXJrID0gUlhSUENfQVBQX01BUktfRU9GOworCQljYWxsLT5hcHBfcmVhZF9idWYgPSBOVUxMOworCisJCV9sZWF2ZSgiID0gLUVCQURNU0ciKTsKKwkJcmV0dXJuIC1FQkFETVNHOworCX0KKworCV9sZWF2ZSgiID0gLUVBR0FJTiIpOworCXJldHVybiAtRUFHQUlOOworfSAvKiBlbmQgX19yeHJwY19jYWxsX3JlYWRfZGF0YSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBhdHRlbXB0IHRvIHJlYWQgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgZGF0YSBmcm9tIHRoZSBjYWxsJ3MgcmVhZHkgcXVldWUKKyAqIGludG8gdGhlIGJ1ZmZlciBwcm92aWRlZAorICogLSBzaW5jZSB0aGlzIGZ1bmMgaXMgdGhlIG9ubHkgb25lIGdvaW5nIHRvIGxvb2sgYXQgcGFja2V0cyBxdWV1ZWQgb24KKyAqICAgYXBwX3JlYWR5cSwgd2UgZG9uJ3QgbmVlZCBhIGxvY2sgdG8gbW9kaWZ5IG9yIGFjY2VzcyB0aGVtLCBvbmx5IHRvIG1vZGlmeQorICogICB0aGUgcXVldWUgcG9pbnRlcnMKKyAqIC0gaWYgdGhlIGJ1ZmZlciBwb2ludGVyIGlzIE5VTEwsIHRoZW4gZGF0YSBpcyBtZXJlbHkgZHJhaW5lZCwgbm90IGNvcGllZAorICogLSBpZiBmbGFncyZSWFJQQ19DQUxMX1JFQURfQkxPQ0ssIHRoZW4gdGhlIGZ1bmN0aW9uIHdpbGwgd2FpdCB1bnRpbCB0aGVyZSBpcworICogICBlbm91Z2ggZGF0YSBvciBhbiBlcnJvciB3aWxsIGJlIGdlbmVyYXRlZAorICogICAtIG5vdGUgdGhhdCB0aGUgY2FsbGVyIG11c3QgaGF2ZSBhZGRlZCB0aGUgY2FsbGluZyB0YXNrIHRvIHRoZSBjYWxsJ3Mgd2FpdAorICogICAgIHF1ZXVlIGJlZm9yZWhhbmQKKyAqIC0gaWYgZmxhZ3MmUlhSUENfQ0FMTF9SRUFEX0FMTCwgdGhlbiBhbiBlcnJvciB3aWxsIGJlIGdlbmVyYXRlZCBpZiB0aGlzCisgKiAgIGZ1bmN0aW9uIGRvZXNuJ3QgcmVhZCBhbGwgYXZhaWxhYmxlIGRhdGEKKyAqLworaW50IHJ4cnBjX2NhbGxfcmVhZF9kYXRhKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlpbnQgcmV0OworCisJX2VudGVyKCIlcHthcnE9JVp1fSwlcCwlWmQsJXgiLAorCSAgICAgICBjYWxsLCBjYWxsLT5hcHBfcmVhZHlfcXR5LCBidWZmZXIsIHNpemUsIGZsYWdzKTsKKworCXNwaW5fbG9jaygmY2FsbC0+bG9jayk7CisKKwlpZiAodW5saWtlbHkoISFjYWxsLT5hcHBfcmVhZF9idWYpKSB7CisJCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKKwkJX2xlYXZlKCIgPSAtRUJVU1kiKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwljYWxsLT5hcHBfbWFyayA9IHNpemU7CisJY2FsbC0+YXBwX3JlYWRfYnVmID0gYnVmZmVyOworCWNhbGwtPmFwcF9hc3luY19yZWFkID0gMTsKKwljYWxsLT5hcHBfcmVhZF9jb3VudCsrOworCisJLyogcmVhZCBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUgKi8KKwlyZXQgPSBfX3J4cnBjX2NhbGxfcmVhZF9kYXRhKGNhbGwpOworCXN3aXRjaCAocmV0KSB7CisJY2FzZSAwOgorCQlpZiAoZmxhZ3MgJiBSWFJQQ19DQUxMX1JFQURfQUxMICYmCisJCSAgICAoIWNhbGwtPmFwcF9sYXN0X3JjdiB8fCBjYWxsLT5hcHBfcmVhZHlfcXR5ID4gMCkpIHsKKwkJCV9sZWF2ZSgiID0gLUVCQURNU0ciKTsKKwkJCV9fcnhycGNfY2FsbF9hYm9ydChjYWxsLCAtRUJBRE1TRyk7CisJCQlyZXR1cm4gLUVCQURNU0c7CisJCX0KKworCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7CisJCWNhbGwtPmFwcF9hdHRuX2Z1bmMoY2FsbCk7CisJCV9sZWF2ZSgiID0gMCIpOworCQlyZXR1cm4gcmV0OworCisJY2FzZSAtRUNPTk5BQk9SVEVEOgorCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7CisJCV9sZWF2ZSgiID0gJWQgW2Fib3J0ZWRdIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKworCWRlZmF1bHQ6CisJCV9fcnhycGNfY2FsbF9hYm9ydChjYWxsLCByZXQpOworCQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKworCWNhc2UgLUVBR0FJTjoKKwkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOworCisJCWlmICghKGZsYWdzICYgUlhSUENfQ0FMTF9SRUFEX0JMT0NLKSkgeworCQkJX2xlYXZlKCIgPSAtRUFHQUlOIik7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCisJCS8qIHdhaXQgZm9yIHRoZSBkYXRhIHRvIGFycml2ZSAqLworCQlfZGVidWcoImJsb2NraW5nIGZvciBkYXRhIGFycml2YWwiKTsKKworCQlmb3IgKDs7KSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJaWYgKCFjYWxsLT5hcHBfYXN5bmNfcmVhZCB8fCBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlicmVhazsKKwkJCXNjaGVkdWxlKCk7CisJCX0KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCV9sZWF2ZSgiID0gLUVJTlRSIik7CisJCQlyZXR1cm4gLUVJTlRSOworCQl9CisKKwkJaWYgKGNhbGwtPmFwcF9jYWxsX3N0YXRlID09IFJYUlBDX0NTVEFURV9FUlJPUikgeworCQkJX2xlYXZlKCIgPSAtRUNPTk5BQk9SVEVEIik7CisJCQlyZXR1cm4gLUVDT05OQUJPUlRFRDsKKwkJfQorCisJCV9sZWF2ZSgiID0gMCIpOworCQlyZXR1cm4gMDsKKwl9CisKK30gLyogZW5kIHJ4cnBjX2NhbGxfcmVhZF9kYXRhKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHdyaXRlIGRhdGEgdG8gYSBjYWxsCisgKiAtIHRoZSBkYXRhIG1heSBub3QgYmUgc2VudCBpbW1lZGlhdGVseSBpZiBpdCBkb2Vzbid0IGZpbGwgYSBidWZmZXIKKyAqIC0gaWYgd2UgY2FuJ3QgcXVldWUgYWxsIHRoZSBkYXRhIGZvciBidWZmZXJpbmcgbm93LCBzaW92W10gd2lsbCBoYXZlIGJlZW4KKyAqICAgYWRqdXN0ZWQgdG8gdGFrZSBhY2NvdW50IG9mIHdoYXQgaGFzIGJlZW4gc2VudAorICovCitpbnQgcnhycGNfY2FsbF93cml0ZV9kYXRhKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJICBzaXplX3Qgc2lvYywKKwkJCSAgc3RydWN0IGt2ZWMgKnNpb3YsCisJCQkgIHU4IHJ4aGRyX2ZsYWdzLAorCQkJICBpbnQgYWxsb2NfZmxhZ3MsCisJCQkgIGludCBkdXBfZGF0YSwKKwkJCSAgc2l6ZV90ICpzaXplX3NlbnQpCit7CisJc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZzsKKwlzdHJ1Y3Qga3ZlYyAqc3B0cjsKKwlzaXplX3Qgc3BhY2UsIHNpemUsIGNodW5rLCB0bXA7CisJY2hhciAqYnVmOworCWludCByZXQ7CisKKwlfZW50ZXIoIiVwLCVadSwlcCwlMDJ4LCV4LCVkLCVwIiwKKwkgICAgICAgY2FsbCwgc2lvYywgc2lvdiwgcnhoZHJfZmxhZ3MsIGFsbG9jX2ZsYWdzLCBkdXBfZGF0YSwKKwkgICAgICAgc2l6ZV9zZW50KTsKKworCSpzaXplX3NlbnQgPSAwOworCXNpemUgPSAwOworCXJldCA9IC1FSU5WQUw7CisKKwkvKiBjYW4ndCBzZW5kIG1vcmUgaWYgd2UndmUgc2VudCBsYXN0IHBhY2tldCBmcm9tIHRoaXMgZW5kICovCisJc3dpdGNoIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSkgeworCWNhc2UgUlhSUENfQ1NUQVRFX1NSVlJfU05EX1JFUExZOgorCWNhc2UgUlhSUENfQ1NUQVRFX0NMTlRfU05EX0FSR1M6CisJCWJyZWFrOworCWNhc2UgUlhSUENfQ1NUQVRFX0VSUk9SOgorCQlyZXQgPSBjYWxsLT5hcHBfZXJybm87CisJZGVmYXVsdDoKKwkJZ290byBvdXQ7CisJfQorCisJLyogY2FsY3VsYXRlIGhvdyBtdWNoIGRhdGEgd2UndmUgYmVlbiBnaXZlbiAqLworCXNwdHIgPSBzaW92OworCWZvciAoOyBzaW9jID4gMDsgc3B0cisrLCBzaW9jLS0pIHsKKwkJaWYgKCFzcHRyLT5pb3ZfbGVuKQorCQkJY29udGludWU7CisKKwkJaWYgKCFzcHRyLT5pb3ZfYmFzZSkKKwkJCWdvdG8gb3V0OworCisJCXNpemUgKz0gc3B0ci0+aW92X2xlbjsKKwl9CisKKwlfZGVidWcoIi0gc2l6ZT0lWnUgbXR1PSVadSIsIHNpemUsIGNhbGwtPmNvbm4tPm10dV9zaXplKTsKKworCWRvIHsKKwkJLyogbWFrZSBzdXJlIHRoZXJlJ3MgYSBtZXNzYWdlIHVuZGVyIGNvbnN0cnVjdGlvbiAqLworCQlpZiAoIWNhbGwtPnNuZF9uZXh0bXNnKSB7CisJCQkvKiBubyAtIGFsbG9jYXRlIGEgbWVzc2FnZSB3aXRoIG5vIGRhdGEgeWV0IGF0dGFjaGVkICovCisJCQlyZXQgPSByeHJwY19jb25uX25ld21zZyhjYWxsLT5jb25uLCBjYWxsLAorCQkJCQkJUlhSUENfUEFDS0VUX1RZUEVfREFUQSwKKwkJCQkJCTAsIE5VTEwsIGFsbG9jX2ZsYWdzLAorCQkJCQkJJmNhbGwtPnNuZF9uZXh0bXNnKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gb3V0OworCQkJX2RlYnVnKCItIGFsbG9jYXRlZCBuZXcgbWVzc2FnZSBbZHM9JVp1XSIsCisJCQkgICAgICAgY2FsbC0+c25kX25leHRtc2ctPmRzaXplKTsKKwkJfQorCisJCW1zZyA9IGNhbGwtPnNuZF9uZXh0bXNnOworCQltc2ctPmhkci5mbGFncyB8PSByeGhkcl9mbGFnczsKKworCQkvKiBkZWFsIHdpdGggemVyby1sZW5ndGggdGVybWluYWwgcGFja2V0ICovCisJCWlmIChzaXplID09IDApIHsKKwkJCWlmIChyeGhkcl9mbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUKSB7CisJCQkJcmV0ID0gcnhycGNfY2FsbF9mbHVzaChjYWxsKTsKKwkJCQlpZiAocmV0IDwgMCkKKwkJCQkJZ290byBvdXQ7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8qIHdvcmsgb3V0IGhvdyBtdWNoIHNwYWNlIGN1cnJlbnQgcGFja2V0IGhhcyBhdmFpbGFibGUgKi8KKwkJc3BhY2UgPSBjYWxsLT5jb25uLT5tdHVfc2l6ZSAtIG1zZy0+ZHNpemU7CisJCWNodW5rID0gbWluKHNwYWNlLCBzaXplKTsKKworCQlfZGVidWcoIi0gW2JlZm9yZV0gc3BhY2U9JVp1IGNodW5rPSVadSIsIHNwYWNlLCBjaHVuayk7CisKKwkJd2hpbGUgKCFzaW92LT5pb3ZfbGVuKQorCQkJc2lvdisrOworCisJCS8qIGlmIHdlIGFyZSBnb2luZyB0byBoYXZlIHRvIGR1cGxpY2F0ZSB0aGUgZGF0YSB0aGVuIGNvYWxlc2NlCisJCSAqIGl0IHRvbyAqLworCQlpZiAoZHVwX2RhdGEpIHsKKwkJCS8qIGRvbid0IGFsbG9jYXRlIG1vcmUgdGhhdCAxIHBhZ2UgYXQgYSB0aW1lICovCisJCQlpZiAoY2h1bmsgPiBQQUdFX1NJWkUpCisJCQkJY2h1bmsgPSBQQUdFX1NJWkU7CisKKwkJCS8qIGFsbG9jYXRlIGEgZGF0YSBidWZmZXIgYW5kIGF0dGFjaCB0byB0aGUgbWVzc2FnZSAqLworCQkJYnVmID0ga21hbGxvYyhjaHVuaywgYWxsb2NfZmxhZ3MpOworCQkJaWYgKHVubGlrZWx5KCFidWYpKSB7CisJCQkJaWYgKG1zZy0+ZHNpemUgPT0KKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCByeHJwY19oZWFkZXIpKSB7CisJCQkJCS8qIGRpc2NhcmQgYW4gZW1wdHkgbXNnIGFuZCB3aW5kIGJhY2sKKwkJCQkJICogdGhlIHNlcSBjb3VudGVyICovCisJCQkJCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7CisJCQkJCWNhbGwtPnNuZF9uZXh0bXNnID0gTlVMTDsKKwkJCQkJY2FsbC0+c25kX3NlcV9jb3VudC0tOworCQkJCX0KKworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCXRtcCA9IG1zZy0+ZGNvdW50Kys7CisJCQlzZXRfYml0KHRtcCwgJm1zZy0+ZGZyZWUpOworCQkJbXNnLT5kYXRhW3RtcF0uaW92X2Jhc2UgPSBidWY7CisJCQltc2ctPmRhdGFbdG1wXS5pb3ZfbGVuID0gY2h1bms7CisJCQltc2ctPmRzaXplICs9IGNodW5rOworCQkJKnNpemVfc2VudCArPSBjaHVuazsKKwkJCXNpemUgLT0gY2h1bms7CisKKwkJCS8qIGxvYWQgdGhlIGJ1ZmZlciB3aXRoIGRhdGEgKi8KKwkJCXdoaWxlIChjaHVuayA+IDApIHsKKwkJCQl0bXAgPSBtaW4oY2h1bmssIHNpb3YtPmlvdl9sZW4pOworCQkJCW1lbWNweShidWYsIHNpb3YtPmlvdl9iYXNlLCB0bXApOworCQkJCWJ1ZiArPSB0bXA7CisJCQkJc2lvdi0+aW92X2Jhc2UgKz0gdG1wOworCQkJCXNpb3YtPmlvdl9sZW4gLT0gdG1wOworCQkJCWlmICghc2lvdi0+aW92X2xlbikKKwkJCQkJc2lvdisrOworCQkJCWNodW5rIC09IHRtcDsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCS8qIHdlIHdhbnQgdG8gYXR0YWNoIHRoZSBzdXBwbGllZCBidWZmZXJzIGRpcmVjdGx5ICovCisJCQl3aGlsZSAoY2h1bmsgPiAwICYmCisJCQkgICAgICAgbXNnLT5kY291bnQgPCBSWFJQQ19NU0dfTUFYX0lPQ1MpIHsKKwkJCQl0bXAgPSBtc2ctPmRjb3VudCsrOworCQkJCW1zZy0+ZGF0YVt0bXBdLmlvdl9iYXNlID0gc2lvdi0+aW92X2Jhc2U7CisJCQkJbXNnLT5kYXRhW3RtcF0uaW92X2xlbiA9IHNpb3YtPmlvdl9sZW47CisJCQkJbXNnLT5kc2l6ZSArPSBzaW92LT5pb3ZfbGVuOworCQkJCSpzaXplX3NlbnQgKz0gc2lvdi0+aW92X2xlbjsKKwkJCQlzaXplIC09IHNpb3YtPmlvdl9sZW47CisJCQkJY2h1bmsgLT0gc2lvdi0+aW92X2xlbjsKKwkJCQlzaW92Kys7CisJCQl9CisJCX0KKworCQlfZGVidWcoIi0gW2xvYWRlZF0gY2h1bms9JVp1IHNpemU9JVp1IiwgY2h1bmssIHNpemUpOworCisJCS8qIGRpc3BhdGNoIHRoZSBtZXNzYWdlIHdoZW4gZnVsbCwgZmluYWwgb3IgcmVxdWVzdGluZyBBQ0sgKi8KKwkJaWYgKG1zZy0+ZHNpemUgPj0gY2FsbC0+Y29ubi0+bXR1X3NpemUgfHwgcnhoZHJfZmxhZ3MpIHsKKwkJCXJldCA9IHJ4cnBjX2NhbGxfZmx1c2goY2FsbCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCisJfSB3aGlsZShzaXplID4gMCk7CisKKwlyZXQgPSAwOworIG91dDoKKwlfbGVhdmUoIiA9ICVkICglWmQgcXVldWVkLCAlWmQgcmVtKSIsIHJldCwgKnNpemVfc2VudCwgc2l6ZSk7CisJcmV0dXJuIHJldDsKKworfSAvKiBlbmQgcnhycGNfY2FsbF93cml0ZV9kYXRhKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGZsdXNoIG91dHN0YW5kaW5nIHBhY2tldHMgdG8gdGhlIG5ldHdvcmsKKyAqLworc3RhdGljIGludCByeHJwY19jYWxsX2ZsdXNoKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCXN0cnVjdCByeHJwY19tZXNzYWdlICptc2c7CisJaW50IHJldCA9IDA7CisKKwlfZW50ZXIoIiVwIiwgY2FsbCk7CisKKwlyeHJwY19nZXRfY2FsbChjYWxsKTsKKworCS8qIGlmIHRoZXJlJ3MgYSBwYWNrZXQgdW5kZXIgY29uc3RydWN0aW9uLCB0aGVuIGRpc3BhdGNoIGl0IG5vdyAqLworCWlmIChjYWxsLT5zbmRfbmV4dG1zZykgeworCQltc2cgPSBjYWxsLT5zbmRfbmV4dG1zZzsKKwkJY2FsbC0+c25kX25leHRtc2cgPSBOVUxMOworCisJCWlmIChtc2ctPmhkci5mbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUKSB7CisJCQltc2ctPmhkci5mbGFncyAmPSB+UlhSUENfTU9SRV9QQUNLRVRTOworCQkJaWYgKGNhbGwtPmFwcF9jYWxsX3N0YXRlICE9IFJYUlBDX0NTVEFURV9DTE5UX1NORF9BUkdTKQorCQkJCW1zZy0+aGRyLmZsYWdzIHw9IFJYUlBDX1JFUVVFU1RfQUNLOworCQl9CisJCWVsc2UgeworCQkJbXNnLT5oZHIuZmxhZ3MgfD0gUlhSUENfTU9SRV9QQUNLRVRTOworCQl9CisKKwkJX3Byb3RvKCJTZW5kaW5nIERBVEEgbWVzc2FnZSB7IGRzPSVadSBkYz0ldSBkZj0lMDJsdSB9IiwKKwkJICAgICAgIG1zZy0+ZHNpemUsIG1zZy0+ZGNvdW50LCBtc2ctPmRmcmVlKTsKKworCQkvKiBxdWV1ZSBhbmQgYWRqdXN0IGNhbGwgc3RhdGUgKi8KKwkJc3Bpbl9sb2NrKCZjYWxsLT5sb2NrKTsKKwkJbGlzdF9hZGRfdGFpbCgmbXNnLT5saW5rLCAmY2FsbC0+YWNrc19wZW5kcSk7CisKKwkJLyogZGVjaWRlIHdoYXQgdG8gZG8gZGVwZW5kaW5nIG9uIGN1cnJlbnQgc3RhdGUgYW5kIGlmIHRoaXMgaXMKKwkJICogdGhlIGxhc3QgcGFja2V0ICovCisJCXJldCA9IC1FSU5WQUw7CisJCXN3aXRjaCAoY2FsbC0+YXBwX2NhbGxfc3RhdGUpIHsKKwkJY2FzZSBSWFJQQ19DU1RBVEVfU1JWUl9TTkRfUkVQTFk6CisJCQlpZiAobXNnLT5oZHIuZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCkgeworCQkJCWNhbGwtPmFwcF9jYWxsX3N0YXRlID0KKwkJCQkJUlhSUENfQ1NUQVRFX1NSVlJfUkNWX0ZJTkFMX0FDSzsKKwkJCQlfc3RhdGUoY2FsbCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJYUlBDX0NTVEFURV9DTE5UX1NORF9BUkdTOgorCQkJaWYgKG1zZy0+aGRyLmZsYWdzICYgUlhSUENfTEFTVF9QQUNLRVQpIHsKKwkJCQljYWxsLT5hcHBfY2FsbF9zdGF0ZSA9CisJCQkJCVJYUlBDX0NTVEFURV9DTE5UX1JDVl9SRVBMWTsKKwkJCQlfc3RhdGUoY2FsbCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJYUlBDX0NTVEFURV9FUlJPUjoKKwkJCXJldCA9IGNhbGwtPmFwcF9lcnJubzsKKwkJZGVmYXVsdDoKKwkJCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJY2FsbC0+YWNrc19wZW5kX2NudCsrOworCisJCW1vZF90aW1lcigmY2FsbC0+YWNrc190aW1lb3V0LAorCQkJICBfX3J4cnBjX3J0dF9iYXNlZF90aW1lb3V0KGNhbGwsCisJCQkJCQkgICAgcnhycGNfY2FsbF9hY2tzX3RpbWVvdXQpKTsKKworCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7CisKKwkJcmV0ID0gcnhycGNfY29ubl9zZW5kbXNnKGNhbGwtPmNvbm4sIG1zZyk7CisJCWlmIChyZXQgPT0gMCkKKwkJCWNhbGwtPnBrdF9zbmRfY291bnQrKzsKKwl9CisKKyBvdXQ6CisJcnhycGNfcHV0X2NhbGwoY2FsbCk7CisKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCit9IC8qIGVuZCByeHJwY19jYWxsX2ZsdXNoKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHJlc2VuZCBOQUsnZCBvciB1bmFja25vd2xlZGdlZCBwYWNrZXRzIHVwIHRvIHRoZSBoaWdoZXN0IG9uZSBzcGVjaWZpZWQKKyAqLworc3RhdGljIHZvaWQgcnhycGNfY2FsbF9yZXNlbmQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHJ4cnBjX3NlcV90IGhpZ2hlc3QpCit7CisJc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZzsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKKwlyeHJwY19zZXFfdCBzZXEgPSAwOworCisJX2VudGVyKCIlcCwldSIsIGNhbGwsIGhpZ2hlc3QpOworCisJX3Byb3RvKCJSeCBSZXNlbmQgcmVxdWlyZWQiKTsKKworCS8qIGhhbmRsZSB0b28gbWFueSByZXNlbmRzICovCisJaWYgKGNhbGwtPnNuZF9yZXNlbmRfY250ID49IHJ4cnBjX2NhbGxfbWF4X3Jlc2VuZCkgeworCQlfZGVidWcoIkFib3J0aW5nIGR1ZSB0byB0b28gbWFueSByZXNlbmRzIChyY3Y9JWQpIiwKKwkJICAgICAgIGNhbGwtPnBrdF9yY3ZfY291bnQpOworCQlyeHJwY19jYWxsX2Fib3J0KGNhbGwsCisJCQkJIGNhbGwtPnBrdF9yY3ZfY291bnQgPiAwID8gLUVJTyA6IC1FVElNRURPVVQpOworCQlfbGVhdmUoIiIpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrKCZjYWxsLT5sb2NrKTsKKwljYWxsLT5zbmRfcmVzZW5kX2NudCsrOworCWZvciAoOzspIHsKKwkJLyogZGV0ZXJtaW5lIHdoaWNoIHRoZSBuZXh0IHBhY2tldCB3ZSBtaWdodCBuZWVkIHRvIEFDSyBpcyAqLworCQlpZiAoc2VxIDw9IGNhbGwtPmFja3NfZGZ0dl9zZXEpCisJCQlzZXEgPSBjYWxsLT5hY2tzX2RmdHZfc2VxOworCQlzZXErKzsKKworCQlpZiAoc2VxID4gaGlnaGVzdCkKKwkJCWJyZWFrOworCisJCS8qIGxvb2sgZm9yIHRoZSBwYWNrZXQgaW4gdGhlIHBlbmRpbmctQUNLIHF1ZXVlICovCisJCWxpc3RfZm9yX2VhY2goX3AsICZjYWxsLT5hY2tzX3BlbmRxKSB7CisJCQltc2cgPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7CisJCQlpZiAobXNnLT5zZXEgPT0gc2VxKQorCQkJCWdvdG8gZm91bmRfbXNnOworCQl9CisKKwkJcGFuaWMoIiVzKCVwLCVkKToiCisJCSAgICAgICIgSW5jb25zaXN0ZW50IHBlbmRpbmctQUNLIHF1ZXVlIChkcz0ldSBzYz0ldSBzcT0ldSlcbiIsCisJCSAgICAgIF9fRlVOQ1RJT05fXywgY2FsbCwgaGlnaGVzdCwKKwkJICAgICAgY2FsbC0+YWNrc19kZnR2X3NlcSwgY2FsbC0+c25kX3NlcV9jb3VudCwgc2VxKTsKKworCWZvdW5kX21zZzoKKwkJaWYgKG1zZy0+c3RhdGUgIT0gUlhSUENfTVNHX1NFTlQpCisJCQljb250aW51ZTsgLyogb25seSB1bi1BQ0snZCBwYWNrZXRzICovCisKKwkJcnhycGNfZ2V0X21lc3NhZ2UobXNnKTsKKwkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOworCisJCS8qIHNlbmQgZWFjaCBtZXNzYWdlIGFnYWluIChhbmQgaWdub3JlIGFueSBlcnJvcnMgd2UgbWlnaHQKKwkJICogaW5jdXIpICovCisJCV9wcm90bygiUmVzZW5kaW5nIERBVEEgbWVzc2FnZSB7IGRzPSVadSBkYz0ldSBkZj0lMDJsdSB9IiwKKwkJICAgICAgIG1zZy0+ZHNpemUsIG1zZy0+ZGNvdW50LCBtc2ctPmRmcmVlKTsKKworCQlpZiAocnhycGNfY29ubl9zZW5kbXNnKGNhbGwtPmNvbm4sIG1zZykgPT0gMCkKKwkJCWNhbGwtPnBrdF9zbmRfY291bnQrKzsKKworCQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOworCisJCXNwaW5fbG9jaygmY2FsbC0+bG9jayk7CisJfQorCisJLyogcmVzZXQgdGhlIHRpbWVvdXQgKi8KKwltb2RfdGltZXIoJmNhbGwtPmFja3NfdGltZW91dCwKKwkJICBfX3J4cnBjX3J0dF9iYXNlZF90aW1lb3V0KGNhbGwsIHJ4cnBjX2NhbGxfYWNrc190aW1lb3V0KSk7CisKKwlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7CisKKwlfbGVhdmUoIiIpOworfSAvKiBlbmQgcnhycGNfY2FsbF9yZXNlbmQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogaGFuZGxlIGFuIElDTVAgZXJyb3IgYmVpbmcgYXBwbGllZCB0byBhIGNhbGwKKyAqLwordm9pZCByeHJwY19jYWxsX2hhbmRsZV9lcnJvcihzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgaW50IGxvY2FsLCBpbnQgZXJybm8pCit7CisJX2VudGVyKCIlcHsldX0sJWQiLCBjYWxsLCBudG9obChjYWxsLT5jYWxsX2lkKSwgZXJybm8pOworCisJLyogaWYgdGhpcyBjYWxsIGlzIGFscmVhZHkgYWJvcnRlZCwgdGhlbiBqdXN0IHdha2UgdXAgYW55IHdhaXRlcnMgKi8KKwlpZiAoY2FsbC0+YXBwX2NhbGxfc3RhdGUgPT0gUlhSUENfQ1NUQVRFX0VSUk9SKSB7CisJCWNhbGwtPmFwcF9lcnJvcl9mdW5jKGNhbGwpOworCX0KKwllbHNlIHsKKwkJLyogdGVsbCB0aGUgYXBwIGxheWVyIHdoYXQgaGFwcGVuZWQgKi8KKwkJc3Bpbl9sb2NrKCZjYWxsLT5sb2NrKTsKKwkJY2FsbC0+YXBwX2NhbGxfc3RhdGUgPSBSWFJQQ19DU1RBVEVfRVJST1I7CisJCV9zdGF0ZShjYWxsKTsKKwkJaWYgKGxvY2FsKQorCQkJY2FsbC0+YXBwX2Vycl9zdGF0ZSA9IFJYUlBDX0VTVEFURV9MT0NBTF9FUlJPUjsKKwkJZWxzZQorCQkJY2FsbC0+YXBwX2Vycl9zdGF0ZSA9IFJYUlBDX0VTVEFURV9SRU1PVEVfRVJST1I7CisJCWNhbGwtPmFwcF9lcnJubwkJPSBlcnJubzsKKwkJY2FsbC0+YXBwX21hcmsJCT0gUlhSUENfQVBQX01BUktfRU9GOworCQljYWxsLT5hcHBfcmVhZF9idWYJPSBOVUxMOworCQljYWxsLT5hcHBfYXN5bmNfcmVhZAk9IDA7CisKKwkJLyogbWFwIHRoZSBlcnJvciAqLworCQljYWxsLT5hcHBfYWVtYXBfZnVuYyhjYWxsKTsKKworCQlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrc190aW1lb3V0KTsKKwkJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPnJjdl90aW1lb3V0KTsKKwkJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja3JfZGZyX3RpbW8pOworCisJCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKKworCQljYWxsLT5hcHBfZXJyb3JfZnVuYyhjYWxsKTsKKwl9CisKKwlfbGVhdmUoIiIpOworfSAvKiBlbmQgcnhycGNfY2FsbF9oYW5kbGVfZXJyb3IoKSAqLwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2Nvbm5lY3Rpb24uYyBiL25ldC9yeHJwYy9jb25uZWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0NjNjNwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy9jb25uZWN0aW9uLmMKQEAgLTAsMCArMSw3NzggQEAKKy8qIGNvbm5lY3Rpb24uYzogUnggY29ubmVjdGlvbiByb3V0aW5lcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8cnhycGMvcnhycGMuaD4KKyNpbmNsdWRlIDxyeHJwYy90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxyeHJwYy9wZWVyLmg+CisjaW5jbHVkZSA8cnhycGMvY29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KKyNpbmNsdWRlIDxyeHJwYy9tZXNzYWdlLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworX19SWEFDQ1RfREVDTChhdG9taWNfdCByeHJwY19jb25uZWN0aW9uX2NvdW50KTsKKworTElTVF9IRUFEKHJ4cnBjX2Nvbm5zKTsKK0RFQ0xBUkVfUldTRU0ocnhycGNfY29ubnNfc2VtKTsKK3Vuc2lnbmVkIGxvbmcgcnhycGNfY29ubl90aW1lb3V0ID0gNjAgKiA2MDsKKworc3RhdGljIHZvaWQgcnhycGNfY29ubl9kb190aW1lb3V0KHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKTsKKworc3RhdGljIHZvaWQgX19yeHJwY19jb25uX3RpbWVvdXQocnhycGNfdGltZXJfdCAqdGltZXIpCit7CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4gPQorCQlsaXN0X2VudHJ5KHRpbWVyLCBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgdGltZW91dCk7CisKKwlfZGVidWcoIlJ4IENPTk4gVElNRU9VVCBbJXB7dT0lZH1dIiwgY29ubiwgYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKSk7CisKKwlyeHJwY19jb25uX2RvX3RpbWVvdXQoY29ubik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnhycGNfdGltZXJfb3BzIHJ4cnBjX2Nvbm5fdGltZXJfb3BzID0geworCS50aW1lZF9vdXQJPSBfX3J4cnBjX2Nvbm5fdGltZW91dCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiByZWNvcmQKKyAqLworc3RhdGljIGlubGluZSBpbnQgX19yeHJwY19jcmVhdGVfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfcGVlciAqcGVlciwKKwkJCQkJICAgIHN0cnVjdCByeHJwY19jb25uZWN0aW9uICoqX2Nvbm4pCit7CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm47CisKKwlfZW50ZXIoIiVwIixwZWVyKTsKKworCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIGEgY29ubmVjdGlvbiByZWNvcmQgKi8KKwljb25uID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNvbm4pIHsKKwkJX2xlYXZlKCIgPSAtRU5PTUVNIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChjb25uLCAwLCBzaXplb2Yoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24pKTsKKwlhdG9taWNfc2V0KCZjb25uLT51c2FnZSwgMSk7CisKKwlJTklUX0xJU1RfSEVBRCgmY29ubi0+bGluayk7CisJSU5JVF9MSVNUX0hFQUQoJmNvbm4tPmlkX2xpbmspOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNvbm4tPmNoYW53YWl0KTsKKwlzcGluX2xvY2tfaW5pdCgmY29ubi0+bG9jayk7CisJcnhycGNfdGltZXJfaW5pdCgmY29ubi0+dGltZW91dCwgJnJ4cnBjX2Nvbm5fdGltZXJfb3BzKTsKKworCWRvX2dldHRpbWVvZmRheSgmY29ubi0+YXRpbWUpOworCWNvbm4tPm10dV9zaXplID0gMTAyNDsKKwljb25uLT5wZWVyID0gcGVlcjsKKwljb25uLT50cmFucyA9IHBlZXItPnRyYW5zOworCisJX19SWEFDQ1QoYXRvbWljX2luYygmcnhycGNfY29ubmVjdGlvbl9jb3VudCkpOworCSpfY29ubiA9IGNvbm47CisJX2xlYXZlKCIgPSAwICglcCkiLCBjb25uKTsKKworCXJldHVybiAwOworfSAvKiBlbmQgX19yeHJwY19jcmVhdGVfY29ubmVjdGlvbigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiByZWNvcmQgZm9yIG91dGdvaW5nIGNvbm5lY3Rpb25zCisgKi8KK2ludCByeHJwY19jcmVhdGVfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucywKKwkJCSAgICBfX2JlMTYgcG9ydCwKKwkJCSAgICBfX2JlMzIgYWRkciwKKwkJCSAgICB1aW50MTZfdCBzZXJ2aWNlX2lkLAorCQkJICAgIHZvaWQgKnNlY3VyaXR5LAorCQkJICAgIHN0cnVjdCByeHJwY19jb25uZWN0aW9uICoqX2Nvbm4pCit7CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNhbmRpZGF0ZSwgKmNvbm47CisJc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXI7CisJc3RydWN0IGxpc3RfaGVhZCAqX3A7CisJX19iZTMyIGNvbm5pZDsKKwlpbnQgcmV0OworCisJX2VudGVyKCIlcHslaHV9LCV1LCVodSIsIHRyYW5zLCB0cmFucy0+cG9ydCwgbnRvaHMocG9ydCksIHNlcnZpY2VfaWQpOworCisJLyogZ2V0IGEgcGVlciByZWNvcmQgKi8KKwlyZXQgPSByeHJwY19wZWVyX2xvb2t1cCh0cmFucywgYWRkciwgJnBlZXIpOworCWlmIChyZXQgPCAwKSB7CisJCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIGEgY29ubmVjdGlvbiByZWNvcmQgKi8KKwlyZXQgPSBfX3J4cnBjX2NyZWF0ZV9jb25uZWN0aW9uKHBlZXIsICZjYW5kaWRhdGUpOworCWlmIChyZXQgPCAwKSB7CisJCXJ4cnBjX3B1dF9wZWVyKHBlZXIpOworCQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBmaWxsIGluIHRoZSBzcGVjaWZpYyBiaXRzICovCisJY2FuZGlkYXRlLT5hZGRyLnNpbl9mYW1pbHkJPSBBRl9JTkVUOworCWNhbmRpZGF0ZS0+YWRkci5zaW5fcG9ydAk9IHBvcnQ7CisJY2FuZGlkYXRlLT5hZGRyLnNpbl9hZGRyLnNfYWRkcgk9IGFkZHI7CisKKwljYW5kaWRhdGUtPmluX2Vwb2NoCQk9IHJ4cnBjX2Vwb2NoOworCWNhbmRpZGF0ZS0+b3V0X2Vwb2NoCQk9IHJ4cnBjX2Vwb2NoOworCWNhbmRpZGF0ZS0+aW5fY2xpZW50ZmxhZwk9IDA7CisJY2FuZGlkYXRlLT5vdXRfY2xpZW50ZmxhZwk9IFJYUlBDX0NMSUVOVF9JTklUSUFURUQ7CisJY2FuZGlkYXRlLT5zZXJ2aWNlX2lkCQk9IGh0b25zKHNlcnZpY2VfaWQpOworCisJLyogaW52ZW50IGEgdW5pcXVlIGNvbm5lY3Rpb24gSUQgKi8KKwl3cml0ZV9sb2NrKCZwZWVyLT5jb25uX2lkbG9jayk7CisKKyB0cnlfbmV4dF9pZDoKKwljb25uaWQgPSBodG9ubChwZWVyLT5jb25uX2lkY291bnRlciAmIFJYUlBDX0NJRE1BU0spOworCXBlZXItPmNvbm5faWRjb3VudGVyICs9IFJYUlBDX01BWENBTExTOworCisJbGlzdF9mb3JfZWFjaChfcCwgJnBlZXItPmNvbm5faWRsaXN0KSB7CisJCWNvbm4gPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgaWRfbGluayk7CisJCWlmIChjb25uaWQgPT0gY29ubi0+Y29ubl9pZCkKKwkJCWdvdG8gdHJ5X25leHRfaWQ7CisJCWlmIChjb25uaWQgPiBjb25uLT5jb25uX2lkKQorCQkJYnJlYWs7CisJfQorCisJX2RlYnVnKCJzZWxlY3RlZCBjYW5kaWRhdGUgY29ubiBJRCAleC4ldSIsCisJICAgICAgIG50b2hsKHBlZXItPmFkZHIuc19hZGRyKSwgbnRvaGwoY29ubmlkKSk7CisKKwljYW5kaWRhdGUtPmNvbm5faWQgPSBjb25uaWQ7CisJbGlzdF9hZGRfdGFpbCgmY2FuZGlkYXRlLT5pZF9saW5rLCBfcCk7CisKKwl3cml0ZV91bmxvY2soJnBlZXItPmNvbm5faWRsb2NrKTsKKworCS8qIGF0dGFjaCB0byBwZWVyICovCisJY2FuZGlkYXRlLT5wZWVyID0gcGVlcjsKKworCXdyaXRlX2xvY2soJnBlZXItPmNvbm5fbG9jayk7CisKKwkvKiBzZWFyY2ggdGhlIHBlZXIncyB0cmFuc3BvcnQgZ3JhdmV5YXJkIGxpc3QgKi8KKwlzcGluX2xvY2soJnBlZXItPmNvbm5fZ3lsb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKF9wLCAmcGVlci0+Y29ubl9ncmF2ZXlhcmQpIHsKKwkJY29ubiA9IGxpc3RfZW50cnkoX3AsIHN0cnVjdCByeHJwY19jb25uZWN0aW9uLCBsaW5rKTsKKwkJaWYgKGNvbm4tPmFkZHIuc2luX3BvcnQJPT0gY2FuZGlkYXRlLT5hZGRyLnNpbl9wb3J0CSYmCisJCSAgICBjb25uLT5zZWN1cml0eV9peAk9PSBjYW5kaWRhdGUtPnNlY3VyaXR5X2l4CSYmCisJCSAgICBjb25uLT5zZXJ2aWNlX2lkCT09IGNhbmRpZGF0ZS0+c2VydmljZV9pZAkmJiAKKwkJICAgIGNvbm4tPmluX2NsaWVudGZsYWcJPT0gMCkKKwkJCWdvdG8gZm91bmRfaW5fZ3JhdmV5YXJkOworCX0KKwlzcGluX3VubG9jaygmcGVlci0+Y29ubl9neWxvY2spOworCisJLyogcGljayB0aGUgbmV3IGNhbmRpZGF0ZSAqLworCV9kZWJ1ZygiY3JlYXRlZCBjb25uZWN0aW9uOiB7JTA4eH0gW291dF0iLCBudG9obChjYW5kaWRhdGUtPmNvbm5faWQpKTsKKwlhdG9taWNfaW5jKCZwZWVyLT5jb25uX2NvdW50KTsKKwljb25uID0gY2FuZGlkYXRlOworCWNhbmRpZGF0ZSA9IE5VTEw7CisKKyBtYWtlX2FjdGl2ZToKKwlsaXN0X2FkZF90YWlsKCZjb25uLT5saW5rLCAmcGVlci0+Y29ubl9hY3RpdmUpOworCXdyaXRlX3VubG9jaygmcGVlci0+Y29ubl9sb2NrKTsKKworCWlmIChjYW5kaWRhdGUpIHsKKwkJd3JpdGVfbG9jaygmcGVlci0+Y29ubl9pZGxvY2spOworCQlsaXN0X2RlbCgmY2FuZGlkYXRlLT5pZF9saW5rKTsKKwkJd3JpdGVfdW5sb2NrKCZwZWVyLT5jb25uX2lkbG9jayk7CisKKwkJX19SWEFDQ1QoYXRvbWljX2RlYygmcnhycGNfY29ubmVjdGlvbl9jb3VudCkpOworCQlrZnJlZShjYW5kaWRhdGUpOworCX0KKwllbHNlIHsKKwkJZG93bl93cml0ZSgmcnhycGNfY29ubnNfc2VtKTsKKwkJbGlzdF9hZGRfdGFpbCgmY29ubi0+cHJvY19saW5rLCAmcnhycGNfY29ubnMpOworCQl1cF93cml0ZSgmcnhycGNfY29ubnNfc2VtKTsKKwl9CisKKwkqX2Nvbm4gPSBjb25uOworCV9sZWF2ZSgiID0gMCAoJXApIiwgY29ubik7CisKKwlyZXR1cm4gMDsKKworCS8qIGhhbmRsZSByZXN1cnJlY3RpbmcgYSBjb25uZWN0aW9uIGZyb20gdGhlIGdyYXZleWFyZCAqLworIGZvdW5kX2luX2dyYXZleWFyZDoKKwlfZGVidWcoInJlc3VycmVjdGluZyBjb25uZWN0aW9uOiB7JTA4eH0gW291dF0iLCBudG9obChjb25uLT5jb25uX2lkKSk7CisJcnhycGNfZ2V0X2Nvbm5lY3Rpb24oY29ubik7CisJcnhycGNfa3J4dGltb2RfZGVsX3RpbWVyKCZjb25uLT50aW1lb3V0KTsKKwlsaXN0X2RlbF9pbml0KCZjb25uLT5saW5rKTsKKwlzcGluX3VubG9jaygmcGVlci0+Y29ubl9neWxvY2spOworCWdvdG8gbWFrZV9hY3RpdmU7Cit9IC8qIGVuZCByeHJwY19jcmVhdGVfY29ubmVjdGlvbigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBsb29rdXAgdGhlIGNvbm5lY3Rpb24gZm9yIGFuIGluY29taW5nIHBhY2tldAorICogLSBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiByZWNvcmQgZm9yIHVucmVjb3JkZWQgaW5jb21pbmcgY29ubmVjdGlvbnMKKyAqLworaW50IHJ4cnBjX2Nvbm5lY3Rpb25fbG9va3VwKHN0cnVjdCByeHJwY19wZWVyICpwZWVyLAorCQkJICAgIHN0cnVjdCByeHJwY19tZXNzYWdlICptc2csCisJCQkgICAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKipfY29ubikKK3sKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwgKmNhbmRpZGF0ZSA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqX3A7CisJaW50IHJldCwgZnJlc2ggPSAwOworCV9fYmUzMiB4X2Vwb2NoLCB4X2Nvbm5pZDsKKwlfX2JlMTYgeF9wb3J0LCB4X3NlcnZpZDsKKwlfX3UzMiB4X3NlY2l4OworCXU4IHhfY2xmbGFnOworCisJX2VudGVyKCIlcHt7JWh1fX0sJXUsJWh1IiwKKwkgICAgICAgcGVlciwKKwkgICAgICAgcGVlci0+dHJhbnMtPnBvcnQsCisJICAgICAgIG50b2hzKG1zZy0+cGt0LT5oLnVoLT5zb3VyY2UpLAorCSAgICAgICBudG9ocyhtc2ctPmhkci5zZXJ2aWNlSWQpKTsKKworCXhfcG9ydAkJPSBtc2ctPnBrdC0+aC51aC0+c291cmNlOworCXhfZXBvY2gJCT0gbXNnLT5oZHIuZXBvY2g7CisJeF9jbGZsYWcJPSBtc2ctPmhkci5mbGFncyAmIFJYUlBDX0NMSUVOVF9JTklUSUFURUQ7CisJeF9jb25uaWQJPSBodG9ubChudG9obChtc2ctPmhkci5jaWQpICYgUlhSUENfQ0lETUFTSyk7CisJeF9zZXJ2aWQJPSBtc2ctPmhkci5zZXJ2aWNlSWQ7CisJeF9zZWNpeAkJPSBtc2ctPmhkci5zZWN1cml0eUluZGV4OworCisJLyogW2NvbW1vbiBjYXNlXSBzZWFyY2ggdGhlIHRyYW5zcG9ydCdzIGFjdGl2ZSBsaXN0IGZpcnN0ICovCisJcmVhZF9sb2NrKCZwZWVyLT5jb25uX2xvY2spOworCWxpc3RfZm9yX2VhY2goX3AsICZwZWVyLT5jb25uX2FjdGl2ZSkgeworCQljb25uID0gbGlzdF9lbnRyeShfcCwgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24sIGxpbmspOworCQlpZiAoY29ubi0+YWRkci5zaW5fcG9ydAkJPT0geF9wb3J0CSYmCisJCSAgICBjb25uLT5pbl9lcG9jaAkJPT0geF9lcG9jaAkmJgorCQkgICAgY29ubi0+Y29ubl9pZAkJPT0geF9jb25uaWQJJiYKKwkJICAgIGNvbm4tPnNlY3VyaXR5X2l4CQk9PSB4X3NlY2l4CSYmCisJCSAgICBjb25uLT5zZXJ2aWNlX2lkCQk9PSB4X3NlcnZpZAkmJiAKKwkJICAgIGNvbm4tPmluX2NsaWVudGZsYWcJCT09IHhfY2xmbGFnKQorCQkJZ290byBmb3VuZF9hY3RpdmU7CisJfQorCXJlYWRfdW5sb2NrKCZwZWVyLT5jb25uX2xvY2spOworCisJLyogW3VuY29tbW9uIGNhc2VdIG5vdCBhY3RpdmUgCisJICogLSBjcmVhdGUgYSBjYW5kaWRhdGUgZm9yIGEgbmV3IHJlY29yZCBpZiBhbiBpbmJvdW5kIGNvbm5lY3Rpb24KKwkgKiAtIG9ubHkgZXhhbWluZSB0aGUgZ3JhdmV5YXJkIGZvciBhbiBvdXRib3VuZCBjb25uZWN0aW9uCisJICovCisJaWYgKHhfY2xmbGFnKSB7CisJCXJldCA9IF9fcnhycGNfY3JlYXRlX2Nvbm5lY3Rpb24ocGVlciwgJmNhbmRpZGF0ZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQkvKiBmaWxsIGluIHRoZSBzcGVjaWZpY3MgKi8KKwkJY2FuZGlkYXRlLT5hZGRyLnNpbl9mYW1pbHkJPSBBRl9JTkVUOworCQljYW5kaWRhdGUtPmFkZHIuc2luX3BvcnQJPSB4X3BvcnQ7CisJCWNhbmRpZGF0ZS0+YWRkci5zaW5fYWRkci5zX2FkZHIgPSBtc2ctPnBrdC0+bmguaXBoLT5zYWRkcjsKKwkJY2FuZGlkYXRlLT5pbl9lcG9jaAkJPSB4X2Vwb2NoOworCQljYW5kaWRhdGUtPm91dF9lcG9jaAkJPSB4X2Vwb2NoOworCQljYW5kaWRhdGUtPmluX2NsaWVudGZsYWcJPSBSWFJQQ19DTElFTlRfSU5JVElBVEVEOworCQljYW5kaWRhdGUtPm91dF9jbGllbnRmbGFnCT0gMDsKKwkJY2FuZGlkYXRlLT5jb25uX2lkCQk9IHhfY29ubmlkOworCQljYW5kaWRhdGUtPnNlcnZpY2VfaWQJCT0geF9zZXJ2aWQ7CisJCWNhbmRpZGF0ZS0+c2VjdXJpdHlfaXgJCT0geF9zZWNpeDsKKwl9CisKKwkvKiBzZWFyY2ggdGhlIGFjdGl2ZSBsaXN0IGFnYWluLCBqdXN0IGluIGNhc2UgaXQgYXBwZWFyZWQgd2hpbHN0IHdlCisJICogd2VyZSBidXN5ICovCisJd3JpdGVfbG9jaygmcGVlci0+Y29ubl9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKF9wLCAmcGVlci0+Y29ubl9hY3RpdmUpIHsKKwkJY29ubiA9IGxpc3RfZW50cnkoX3AsIHN0cnVjdCByeHJwY19jb25uZWN0aW9uLCBsaW5rKTsKKwkJaWYgKGNvbm4tPmFkZHIuc2luX3BvcnQJCT09IHhfcG9ydAkmJgorCQkgICAgY29ubi0+aW5fZXBvY2gJCT09IHhfZXBvY2gJJiYKKwkJICAgIGNvbm4tPmNvbm5faWQJCT09IHhfY29ubmlkCSYmCisJCSAgICBjb25uLT5zZWN1cml0eV9peAkJPT0geF9zZWNpeAkmJgorCQkgICAgY29ubi0+c2VydmljZV9pZAkJPT0geF9zZXJ2aWQJJiYgCisJCSAgICBjb25uLT5pbl9jbGllbnRmbGFnCQk9PSB4X2NsZmxhZykKKwkJCWdvdG8gZm91bmRfYWN0aXZlX3NlY29uZF9jaGFuY2U7CisJfQorCisJLyogc2VhcmNoIHRoZSB0cmFuc3BvcnQncyBncmF2ZXlhcmQgbGlzdCAqLworCXNwaW5fbG9jaygmcGVlci0+Y29ubl9neWxvY2spOworCWxpc3RfZm9yX2VhY2goX3AsICZwZWVyLT5jb25uX2dyYXZleWFyZCkgeworCQljb25uID0gbGlzdF9lbnRyeShfcCwgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24sIGxpbmspOworCQlpZiAoY29ubi0+YWRkci5zaW5fcG9ydAkJPT0geF9wb3J0CSYmCisJCSAgICBjb25uLT5pbl9lcG9jaAkJPT0geF9lcG9jaAkmJgorCQkgICAgY29ubi0+Y29ubl9pZAkJPT0geF9jb25uaWQJJiYKKwkJICAgIGNvbm4tPnNlY3VyaXR5X2l4CQk9PSB4X3NlY2l4CSYmCisJCSAgICBjb25uLT5zZXJ2aWNlX2lkCQk9PSB4X3NlcnZpZAkmJiAKKwkJICAgIGNvbm4tPmluX2NsaWVudGZsYWcJCT09IHhfY2xmbGFnKQorCQkJZ290byBmb3VuZF9pbl9ncmF2ZXlhcmQ7CisJfQorCXNwaW5fdW5sb2NrKCZwZWVyLT5jb25uX2d5bG9jayk7CisKKwkvKiBvdXRib3VuZCBjb25uZWN0aW9ucyBhcmVuJ3QgY3JlYXRlZCBoZXJlICovCisJaWYgKCF4X2NsZmxhZykgeworCQl3cml0ZV91bmxvY2soJnBlZXItPmNvbm5fbG9jayk7CisJCV9sZWF2ZSgiID0gLUVOT0VOVCIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwkvKiB3ZSBjYW4gbm93IGFkZCB0aGUgbmV3IGNhbmRpZGF0ZSB0byB0aGUgbGlzdCAqLworCV9kZWJ1ZygiY3JlYXRlZCBjb25uZWN0aW9uOiB7JTA4eH0gW2luXSIsIG50b2hsKGNhbmRpZGF0ZS0+Y29ubl9pZCkpOworCXJ4cnBjX2dldF9wZWVyKHBlZXIpOworCWNvbm4gPSBjYW5kaWRhdGU7CisJY2FuZGlkYXRlID0gTlVMTDsKKwlhdG9taWNfaW5jKCZwZWVyLT5jb25uX2NvdW50KTsKKwlmcmVzaCA9IDE7CisKKyBtYWtlX2FjdGl2ZToKKwlsaXN0X2FkZF90YWlsKCZjb25uLT5saW5rLCAmcGVlci0+Y29ubl9hY3RpdmUpOworCisgc3VjY2Vzc191d2ZyZWU6CisJd3JpdGVfdW5sb2NrKCZwZWVyLT5jb25uX2xvY2spOworCisJaWYgKGNhbmRpZGF0ZSkgeworCQl3cml0ZV9sb2NrKCZwZWVyLT5jb25uX2lkbG9jayk7CisJCWxpc3RfZGVsKCZjYW5kaWRhdGUtPmlkX2xpbmspOworCQl3cml0ZV91bmxvY2soJnBlZXItPmNvbm5faWRsb2NrKTsKKworCQlfX1JYQUNDVChhdG9taWNfZGVjKCZyeHJwY19jb25uZWN0aW9uX2NvdW50KSk7CisJCWtmcmVlKGNhbmRpZGF0ZSk7CisJfQorCisJaWYgKGZyZXNoKSB7CisJCWRvd25fd3JpdGUoJnJ4cnBjX2Nvbm5zX3NlbSk7CisJCWxpc3RfYWRkX3RhaWwoJmNvbm4tPnByb2NfbGluaywgJnJ4cnBjX2Nvbm5zKTsKKwkJdXBfd3JpdGUoJnJ4cnBjX2Nvbm5zX3NlbSk7CisJfQorCisgc3VjY2VzczoKKwkqX2Nvbm4gPSBjb25uOworCV9sZWF2ZSgiID0gMCAoJXApIiwgY29ubik7CisJcmV0dXJuIDA7CisKKwkvKiBoYW5kbGUgdGhlIGNvbm5lY3Rpb24gYmVpbmcgZm91bmQgaW4gdGhlIGFjdGl2ZSBsaXN0IHN0cmFpZ2h0IG9mZiAqLworIGZvdW5kX2FjdGl2ZToKKwlyeHJwY19nZXRfY29ubmVjdGlvbihjb25uKTsKKwlyZWFkX3VubG9jaygmcGVlci0+Y29ubl9sb2NrKTsKKwlnb3RvIHN1Y2Nlc3M7CisKKwkvKiBoYW5kbGUgcmVzdXJyZWN0aW5nIGEgY29ubmVjdGlvbiBmcm9tIHRoZSBncmF2ZXlhcmQgKi8KKyBmb3VuZF9pbl9ncmF2ZXlhcmQ6CisJX2RlYnVnKCJyZXN1cnJlY3RpbmcgY29ubmVjdGlvbjogeyUwOHh9IFtpbl0iLCBudG9obChjb25uLT5jb25uX2lkKSk7CisJcnhycGNfZ2V0X3BlZXIocGVlcik7CisJcnhycGNfZ2V0X2Nvbm5lY3Rpb24oY29ubik7CisJcnhycGNfa3J4dGltb2RfZGVsX3RpbWVyKCZjb25uLT50aW1lb3V0KTsKKwlsaXN0X2RlbF9pbml0KCZjb25uLT5saW5rKTsKKwlzcGluX3VubG9jaygmcGVlci0+Y29ubl9neWxvY2spOworCWdvdG8gbWFrZV9hY3RpdmU7CisKKwkvKiBoYW5kbGUgZmluZGluZyB0aGUgY29ubmVjdGlvbiBvbiB0aGUgc2Vjb25kIHRpbWUgdGhyb3VnaCB0aGUgYWN0aXZlCisJICogbGlzdCAqLworIGZvdW5kX2FjdGl2ZV9zZWNvbmRfY2hhbmNlOgorCXJ4cnBjX2dldF9jb25uZWN0aW9uKGNvbm4pOworCWdvdG8gc3VjY2Vzc191d2ZyZWU7CisKK30gLyogZW5kIHJ4cnBjX2Nvbm5lY3Rpb25fbG9va3VwKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGZpbmlzaCB1c2luZyBhIGNvbm5lY3Rpb24gcmVjb3JkCisgKiAtIGl0IHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gdGhlIHBlZXIncyBjb25uZWN0aW9uIGdyYXZleWFyZCB3aGVuIHJlZmNvdW50CisgKiAgIHJlYWNoZXMgMAorICovCit2b2lkIHJ4cnBjX3B1dF9jb25uZWN0aW9uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQoreworCXN0cnVjdCByeHJwY19wZWVyICpwZWVyOworCisJaWYgKCFjb25uKQorCQlyZXR1cm47CisKKwlfZW50ZXIoIiVwe3U9JWQgcD0laHV9IiwKKwkgICAgICAgY29ubiwgYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKSwgbnRvaHMoY29ubi0+YWRkci5zaW5fcG9ydCkpOworCisJcGVlciA9IGNvbm4tPnBlZXI7CisJc3Bpbl9sb2NrKCZwZWVyLT5jb25uX2d5bG9jayk7CisKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlpZiAoYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKSA8PSAwKQorCQlCVUcoKTsKKworCWlmIChsaWtlbHkoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmNvbm4tPnVzYWdlKSkpIHsKKwkJc3Bpbl91bmxvY2soJnBlZXItPmNvbm5fZ3lsb2NrKTsKKwkJX2xlYXZlKCIiKTsKKwkJcmV0dXJuOworCX0KKworCS8qIG1vdmUgdG8gZ3JhdmV5YXJkIHF1ZXVlICovCisJX2RlYnVnKCJidXJ5aW5nIGNvbm5lY3Rpb246IHslMDh4fSIsIG50b2hsKGNvbm4tPmNvbm5faWQpKTsKKwlsaXN0X2RlbCgmY29ubi0+bGluayk7CisJbGlzdF9hZGRfdGFpbCgmY29ubi0+bGluaywgJnBlZXItPmNvbm5fZ3JhdmV5YXJkKTsKKworCXJ4cnBjX2tyeHRpbW9kX2FkZF90aW1lcigmY29ubi0+dGltZW91dCwgcnhycGNfY29ubl90aW1lb3V0ICogSFopOworCisJc3Bpbl91bmxvY2soJnBlZXItPmNvbm5fZ3lsb2NrKTsKKworCXJ4cnBjX3B1dF9wZWVyKGNvbm4tPnBlZXIpOworCisJX2xlYXZlKCIgW2tpbGxlZF0iKTsKK30gLyogZW5kIHJ4cnBjX3B1dF9jb25uZWN0aW9uKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGZyZWUgYSBjb25uZWN0aW9uIHJlY29yZAorICovCitzdGF0aWMgdm9pZCByeHJwY19jb25uX2RvX3RpbWVvdXQoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXI7CisKKwlfZW50ZXIoIiVwe3U9JWQgcD0laHV9IiwKKwkgICAgICAgY29ubiwgYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKSwgbnRvaHMoY29ubi0+YWRkci5zaW5fcG9ydCkpOworCisJcGVlciA9IGNvbm4tPnBlZXI7CisKKwlpZiAoYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKSA8IDApCisJCUJVRygpOworCisJLyogcmVtb3ZlIGZyb20gZ3JhdmV5YXJkIGlmIHN0aWxsIGRlYWQgKi8KKwlzcGluX2xvY2soJnBlZXItPmNvbm5fZ3lsb2NrKTsKKwlpZiAoYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKSA9PSAwKSB7CisJCWxpc3RfZGVsX2luaXQoJmNvbm4tPmxpbmspOworCX0KKwllbHNlIHsKKwkJY29ubiA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrKCZwZWVyLT5jb25uX2d5bG9jayk7CisKKwlpZiAoIWNvbm4pIHsKKwkJX2xlYXZlKCIiKTsKKwkJcmV0dXJuOyAvKiByZXN1cnJlY3RlZCAqLworCX0KKworCV9kZWJ1ZygiLS0tIERlc3Ryb3lpbmcgQ29ubmVjdGlvbiAlcHslMDh4fSAtLS0iLAorCSAgICAgICBjb25uLCBudG9obChjb25uLT5jb25uX2lkKSk7CisKKwlkb3duX3dyaXRlKCZyeHJwY19jb25uc19zZW0pOworCWxpc3RfZGVsKCZjb25uLT5wcm9jX2xpbmspOworCXVwX3dyaXRlKCZyeHJwY19jb25uc19zZW0pOworCisJd3JpdGVfbG9jaygmcGVlci0+Y29ubl9pZGxvY2spOworCWxpc3RfZGVsKCZjb25uLT5pZF9saW5rKTsKKwl3cml0ZV91bmxvY2soJnBlZXItPmNvbm5faWRsb2NrKTsKKworCV9fUlhBQ0NUKGF0b21pY19kZWMoJnJ4cnBjX2Nvbm5lY3Rpb25fY291bnQpKTsKKwlrZnJlZShjb25uKTsKKworCS8qIGlmIHRoZSBncmF2ZXlhcmQgaXMgbm93IGVtcHR5LCB3YWtlIHVwIGFueW9uZSB3YWl0aW5nIGZvciB0aGF0ICovCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnBlZXItPmNvbm5fY291bnQpKQorCQl3YWtlX3VwKCZwZWVyLT5jb25uX2d5X3dhaXRxKTsKKworCV9sZWF2ZSgiIFtkZXN0cm95ZWRdIik7Cit9IC8qIGVuZCByeHJwY19jb25uX2RvX3RpbWVvdXQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogY2xlYXIgYWxsIGNvbm5lY3Rpb24gcmVjb3JkcyBmcm9tIGEgcGVlciBlbmRwb2ludAorICovCit2b2lkIHJ4cnBjX2Nvbm5fY2xlYXJhbGwoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIpCit7CisJREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKKworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOworCWludCBlcnI7CisKKwlfZW50ZXIoIiVwIiwgcGVlcik7CisKKwkvKiB0aGVyZSBzaG91bGRuJ3QgYmUgYW55IGFjdGl2ZSBjb25ucyByZW1haW5pbmcgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJnBlZXItPmNvbm5fYWN0aXZlKSkKKwkJQlVHKCk7CisKKwkvKiBtYW51YWxseSB0aW1lb3V0IGFsbCBjb25ucyBpbiB0aGUgZ3JhdmV5YXJkICovCisJc3Bpbl9sb2NrKCZwZWVyLT5jb25uX2d5bG9jayk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZwZWVyLT5jb25uX2dyYXZleWFyZCkpIHsKKwkJY29ubiA9IGxpc3RfZW50cnkocGVlci0+Y29ubl9ncmF2ZXlhcmQubmV4dCwKKwkJCQkgIHN0cnVjdCByeHJwY19jb25uZWN0aW9uLCBsaW5rKTsKKwkJZXJyID0gcnhycGNfa3J4dGltb2RfZGVsX3RpbWVyKCZjb25uLT50aW1lb3V0KTsKKwkJc3Bpbl91bmxvY2soJnBlZXItPmNvbm5fZ3lsb2NrKTsKKworCQlpZiAoZXJyID09IDApCisJCQlyeHJwY19jb25uX2RvX3RpbWVvdXQoY29ubik7CisKKwkJc3Bpbl9sb2NrKCZwZWVyLT5jb25uX2d5bG9jayk7CisJfQorCXNwaW5fdW5sb2NrKCZwZWVyLT5jb25uX2d5bG9jayk7CisKKwkvKiB3YWl0IGZvciB0aGUgdGhlIGNvbm4gZ3JhdmV5YXJkIHRvIGJlIGNvbXBsZXRlbHkgY2xlYXJlZCAqLworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlhZGRfd2FpdF9xdWV1ZSgmcGVlci0+Y29ubl9neV93YWl0cSwgJm15c2VsZik7CisKKwl3aGlsZSAoYXRvbWljX3JlYWQoJnBlZXItPmNvbm5fY291bnQpICE9IDApIHsKKwkJc2NoZWR1bGUoKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCX0KKworCXJlbW92ZV93YWl0X3F1ZXVlKCZwZWVyLT5jb25uX2d5X3dhaXRxLCAmbXlzZWxmKTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCisJX2xlYXZlKCIiKTsKK30gLyogZW5kIHJ4cnBjX2Nvbm5fY2xlYXJhbGwoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogYWxsb2NhdGUgYW5kIHByZXBhcmUgYSBtZXNzYWdlIGZvciBzZW5kaW5nIG91dCB0aHJvdWdoIHRoZSB0cmFuc3BvcnQKKyAqIGVuZHBvaW50CisgKi8KK2ludCByeHJwY19jb25uX25ld21zZyhzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKKwkJICAgICAgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCSAgICAgIHVpbnQ4X3QgdHlwZSwKKwkJICAgICAgaW50IGRjb3VudCwKKwkJICAgICAgc3RydWN0IGt2ZWMgZGlvdltdLAorCQkgICAgICBpbnQgYWxsb2NfZmxhZ3MsCisJCSAgICAgIHN0cnVjdCByeHJwY19tZXNzYWdlICoqX21zZykKK3sKKwlzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnOworCWludCBsb29wOworCisJX2VudGVyKCIlcHslZH0sJXAsJXUiLCBjb25uLCBudG9ocyhjb25uLT5hZGRyLnNpbl9wb3J0KSwgY2FsbCwgdHlwZSk7CisKKwlpZiAoZGNvdW50ID4gMykgeworCQlfbGVhdmUoIiA9IC1FSU5WQUwiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXNnID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJ4cnBjX21lc3NhZ2UpLCBhbGxvY19mbGFncyk7CisJaWYgKCFtc2cpIHsKKwkJX2xlYXZlKCIgPSAtRU5PTUVNIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChtc2csIDAsIHNpemVvZigqbXNnKSk7CisJYXRvbWljX3NldCgmbXNnLT51c2FnZSwgMSk7CisKKwlJTklUX0xJU1RfSEVBRCgmbXNnLT5saW5rKTsKKworCW1zZy0+c3RhdGUgPSBSWFJQQ19NU0dfUFJFUEFSRUQ7CisKKwltc2ctPmhkci5lcG9jaAkJPSBjb25uLT5vdXRfZXBvY2g7CisJbXNnLT5oZHIuY2lkCQk9IGNvbm4tPmNvbm5faWQgfCAoY2FsbCA/IGNhbGwtPmNoYW5faXggOiAwKTsKKwltc2ctPmhkci5jYWxsTnVtYmVyCT0gY2FsbCA/IGNhbGwtPmNhbGxfaWQgOiAwOworCW1zZy0+aGRyLnR5cGUJCT0gdHlwZTsKKwltc2ctPmhkci5mbGFncwkJPSBjb25uLT5vdXRfY2xpZW50ZmxhZzsKKwltc2ctPmhkci5zZWN1cml0eUluZGV4CT0gY29ubi0+c2VjdXJpdHlfaXg7CisJbXNnLT5oZHIuc2VydmljZUlkCT0gY29ubi0+c2VydmljZV9pZDsKKworCS8qIGdlbmVyYXRlIHNlcXVlbmNlIG51bWJlcnMgZm9yIGRhdGEgcGFja2V0cyAqLworCWlmIChjYWxsKSB7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0RBVEE6CisJCQltc2ctPnNlcSA9ICsrY2FsbC0+c25kX3NlcV9jb3VudDsKKwkJCW1zZy0+aGRyLnNlcSA9IGh0b25sKG1zZy0+c2VxKTsKKwkJCWJyZWFrOworCQljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0FDSzoKKwkJCS8qIEFDSyBzZXF1ZW5jZSBudW1iZXJzIGFyZSBjb21wbGljYXRlZC4gVGhlIGZvbGxvd2luZworCQkJICogbWF5IGJlIHdyb25nOgorCQkJICogLSBqdW1ibyBwYWNrZXQgQUNLcyBzaG91bGQgaGF2ZSBhIHNlcSBudW1iZXIKKwkJCSAqIC0gbm9ybWFsIEFDS3Mgc2hvdWxkIG5vdAorCQkJICovCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCW1zZy0+ZGNvdW50ID0gZGNvdW50ICsgMTsKKwltc2ctPmRzaXplID0gc2l6ZW9mKG1zZy0+aGRyKTsKKwltc2ctPmRhdGFbMF0uaW92X2xlbiA9IHNpemVvZihtc2ctPmhkcik7CisJbXNnLT5kYXRhWzBdLmlvdl9iYXNlID0gJm1zZy0+aGRyOworCisJZm9yIChsb29wPTA7IGxvb3AgPCBkY291bnQ7IGxvb3ArKykgeworCQltc2ctPmRzaXplICs9IGRpb3ZbbG9vcF0uaW92X2xlbjsKKwkJbXNnLT5kYXRhW2xvb3ArMV0uaW92X2xlbiAgPSBkaW92W2xvb3BdLmlvdl9sZW47CisJCW1zZy0+ZGF0YVtsb29wKzFdLmlvdl9iYXNlID0gZGlvdltsb29wXS5pb3ZfYmFzZTsKKwl9CisKKwlfX1JYQUNDVChhdG9taWNfaW5jKCZyeHJwY19tZXNzYWdlX2NvdW50KSk7CisJKl9tc2cgPSBtc2c7CisJX2xlYXZlKCIgPSAwICglcCkgIyVkIiwgbXNnLCBhdG9taWNfcmVhZCgmcnhycGNfbWVzc2FnZV9jb3VudCkpOworCXJldHVybiAwOworfSAvKiBlbmQgcnhycGNfY29ubl9uZXdtc2coKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZnJlZSBhIG1lc3NhZ2UKKyAqLwordm9pZCBfX3J4cnBjX3B1dF9tZXNzYWdlKHN0cnVjdCByeHJwY19tZXNzYWdlICptc2cpCit7CisJaW50IGxvb3A7CisKKwlfZW50ZXIoIiVwICMlZCIsIG1zZywgYXRvbWljX3JlYWQoJnJ4cnBjX21lc3NhZ2VfY291bnQpKTsKKworCWlmIChtc2ctPnBrdCkKKwkJa2ZyZWVfc2tiKG1zZy0+cGt0KTsKKwlyeHJwY19wdXRfY29ubmVjdGlvbihtc2ctPmNvbm4pOworCisJZm9yIChsb29wID0gMDsgbG9vcCA8IDg7IGxvb3ArKykKKwkJaWYgKHRlc3RfYml0KGxvb3AsICZtc2ctPmRmcmVlKSkKKwkJCWtmcmVlKG1zZy0+ZGF0YVtsb29wXS5pb3ZfYmFzZSk7CisKKwlfX1JYQUNDVChhdG9taWNfZGVjKCZyeHJwY19tZXNzYWdlX2NvdW50KSk7CisJa2ZyZWUobXNnKTsKKworCV9sZWF2ZSgiIik7Cit9IC8qIGVuZCBfX3J4cnBjX3B1dF9tZXNzYWdlKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHNlbmQgYSBtZXNzYWdlIG91dCB0aHJvdWdoIHRoZSB0cmFuc3BvcnQgZW5kcG9pbnQKKyAqLworaW50IHJ4cnBjX2Nvbm5fc2VuZG1zZyhzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKKwkJICAgICAgIHN0cnVjdCByeHJwY19tZXNzYWdlICptc2cpCit7CisJc3RydWN0IG1zZ2hkciBtc2doZHI7CisJaW50IHJldDsKKworCV9lbnRlcigiJXB7JWR9IiwgY29ubiwgbnRvaHMoY29ubi0+YWRkci5zaW5fcG9ydCkpOworCisJLyogZmlsbCBpbiBzb21lIGZpZWxkcyBpbiB0aGUgaGVhZGVyICovCisJc3Bpbl9sb2NrKCZjb25uLT5sb2NrKTsKKwltc2ctPmhkci5zZXJpYWwgPSBodG9ubCgrK2Nvbm4tPnNlcmlhbF9jb3VudGVyKTsKKwltc2ctPnJ0dGRvbmUgPSAwOworCXNwaW5fdW5sb2NrKCZjb25uLT5sb2NrKTsKKworCS8qIHNldCB1cCB0aGUgbWVzc2FnZSB0byBiZSB0cmFuc21pdHRlZCAqLworCW1zZ2hkci5tc2dfbmFtZQkJPSAmY29ubi0+YWRkcjsKKwltc2doZHIubXNnX25hbWVsZW4JPSBzaXplb2YoY29ubi0+YWRkcik7CisJbXNnaGRyLm1zZ19jb250cm9sCT0gTlVMTDsKKwltc2doZHIubXNnX2NvbnRyb2xsZW4JPSAwOworCW1zZ2hkci5tc2dfZmxhZ3MJPSBNU0dfQ09ORklSTSB8IE1TR19ET05UV0FJVDsKKworCV9uZXQoIlNlbmRpbmcgbWVzc2FnZSB0eXBlICVkIG9mICVaZCBieXRlcyB0byAlMDh4OiVkIiwKKwkgICAgIG1zZy0+aGRyLnR5cGUsCisJICAgICBtc2ctPmRzaXplLAorCSAgICAgbnRvaGwoY29ubi0+YWRkci5zaW5fYWRkci5zX2FkZHIpLAorCSAgICAgbnRvaHMoY29ubi0+YWRkci5zaW5fcG9ydCkpOworCisJLyogc2VuZCB0aGUgbWVzc2FnZSAqLworCXJldCA9IGtlcm5lbF9zZW5kbXNnKGNvbm4tPnRyYW5zLT5zb2NrZXQsICZtc2doZHIsCisJCQkgICAgIG1zZy0+ZGF0YSwgbXNnLT5kY291bnQsIG1zZy0+ZHNpemUpOworCWlmIChyZXQgPCAwKSB7CisJCW1zZy0+c3RhdGUgPSBSWFJQQ19NU0dfRVJST1I7CisJfSBlbHNlIHsKKwkJbXNnLT5zdGF0ZSA9IFJYUlBDX01TR19TRU5UOworCQlyZXQgPSAwOworCisJCXNwaW5fbG9jaygmY29ubi0+bG9jayk7CisJCWRvX2dldHRpbWVvZmRheSgmY29ubi0+YXRpbWUpOworCQltc2ctPnN0YW1wID0gY29ubi0+YXRpbWU7CisJCXNwaW5fdW5sb2NrKCZjb25uLT5sb2NrKTsKKwl9CisKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9IC8qIGVuZCByeHJwY19jb25uX3NlbmRtc2coKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZGVhbCB3aXRoIGEgc3Vic2VxdWVudCBjYWxsIHBhY2tldAorICovCitpbnQgcnhycGNfY29ubl9yZWNlaXZlX2NhbGxfcGFja2V0KHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAorCQkJCSAgIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJCSAgIHN0cnVjdCByeHJwY19tZXNzYWdlICptc2cpCit7CisJc3RydWN0IHJ4cnBjX21lc3NhZ2UgKnBtc2c7CisJc3RydWN0IGxpc3RfaGVhZCAqX3A7CisJdW5zaWduZWQgY2l4LCBzZXE7CisJaW50IHJldCA9IDA7CisKKwlfZW50ZXIoIiVwLCVwLCVwIiwgY29ubiwgY2FsbCwgbXNnKTsKKworCWlmICghY2FsbCkgeworCQljaXggPSBudG9obChtc2ctPmhkci5jaWQpICYgUlhSUENfQ0hBTk5FTE1BU0s7CisKKwkJc3Bpbl9sb2NrKCZjb25uLT5sb2NrKTsKKwkJY2FsbCA9IGNvbm4tPmNoYW5uZWxzW2NpeF07CisKKwkJaWYgKCFjYWxsIHx8IGNhbGwtPmNhbGxfaWQgIT0gbXNnLT5oZHIuY2FsbE51bWJlcikgeworCQkJc3Bpbl91bmxvY2soJmNvbm4tPmxvY2spOworCQkJcnhycGNfdHJhbnNfaW1tZWRpYXRlX2Fib3J0KGNvbm4tPnRyYW5zLCBtc2csIC1FTk9FTlQpOworCQkJZ290byBvdXQ7CisJCX0KKwkJZWxzZSB7CisJCQlyeHJwY19nZXRfY2FsbChjYWxsKTsKKwkJCXNwaW5fdW5sb2NrKCZjb25uLT5sb2NrKTsKKwkJfQorCX0KKwllbHNlIHsKKwkJcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisJfQorCisJX3Byb3RvKCJSZWNlaXZlZCBwYWNrZXQgJSUldSBbJXVdIG9uIGNhbGwgJWh1OiV1OiV1IiwKKwkgICAgICAgbnRvaGwobXNnLT5oZHIuc2VyaWFsKSwKKwkgICAgICAgbnRvaGwobXNnLT5oZHIuc2VxKSwKKwkgICAgICAgbnRvaHMobXNnLT5oZHIuc2VydmljZUlkKSwKKwkgICAgICAgbnRvaGwoY29ubi0+Y29ubl9pZCksCisJICAgICAgIG50b2hsKGNhbGwtPmNhbGxfaWQpKTsKKworCWNhbGwtPnBrdF9yY3ZfY291bnQrKzsKKworCWlmIChtc2ctPnBrdC0+ZHN0ICYmIG1zZy0+cGt0LT5kc3QtPmRldikKKwkJY29ubi0+cGVlci0+aWZfbXR1ID0KKwkJCW1zZy0+cGt0LT5kc3QtPmRldi0+bXR1IC0KKwkJCW1zZy0+cGt0LT5kc3QtPmRldi0+aGFyZF9oZWFkZXJfbGVuOworCisJLyogcXVldWUgb24gdGhlIGNhbGwgaW4gc2VxIG9yZGVyICovCisJcnhycGNfZ2V0X21lc3NhZ2UobXNnKTsKKwlzZXEgPSBtc2ctPnNlcTsKKworCXNwaW5fbG9jaygmY2FsbC0+bG9jayk7CisJbGlzdF9mb3JfZWFjaChfcCwgJmNhbGwtPnJjdl9yZWNlaXZlcSkgeworCQlwbXNnID0gbGlzdF9lbnRyeShfcCwgc3RydWN0IHJ4cnBjX21lc3NhZ2UsIGxpbmspOworCQlpZiAocG1zZy0+c2VxID4gc2VxKQorCQkJYnJlYWs7CisJfQorCWxpc3RfYWRkX3RhaWwoJm1zZy0+bGluaywgX3ApOworCisJLyogcmVzZXQgdGhlIGFjdGl2aXR5IHRpbWVvdXQgKi8KKwljYWxsLT5mbGFncyB8PSBSWFJQQ19DQUxMX1JDVl9QS1Q7CisJbW9kX3RpbWVyKCZjYWxsLT5yY3ZfdGltZW91dCxqaWZmaWVzICsgcnhycGNfY2FsbF9yY3ZfdGltZW91dCAqIEhaKTsKKworCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKKworCXJ4cnBjX2tyeGlvZF9xdWV1ZV9jYWxsKGNhbGwpOworCisJcnhycGNfcHV0X2NhbGwoY2FsbCk7Cisgb3V0OgorCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9IC8qIGVuZCByeHJwY19jb25uX3JlY2VpdmVfY2FsbF9wYWNrZXQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogaGFuZGxlIGFuIElDTVAgZXJyb3IgYmVpbmcgYXBwbGllZCB0byBhIGNvbm5lY3Rpb24KKyAqLwordm9pZCByeHJwY19jb25uX2hhbmRsZV9lcnJvcihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKKwkJCSAgICAgaW50IGxvY2FsLCBpbnQgZXJybm8pCit7CisJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGxzWzRdOworCWludCBsb29wOworCisJX2VudGVyKCIlcHslZH0sJWQiLCBjb25uLCBudG9ocyhjb25uLT5hZGRyLnNpbl9wb3J0KSwgZXJybm8pOworCisJLyogZ2V0IGEgcmVmIHRvIGFsbCBteSBjYWxscyBpbiBvbmUgZ28gKi8KKwltZW1zZXQoY2FsbHMsIDAsIHNpemVvZihjYWxscykpOworCXNwaW5fbG9jaygmY29ubi0+bG9jayk7CisKKwlmb3IgKGxvb3AgPSAzOyBsb29wID49IDA7IGxvb3AtLSkgeworCQlpZiAoY29ubi0+Y2hhbm5lbHNbbG9vcF0pIHsKKwkJCWNhbGxzW2xvb3BdID0gY29ubi0+Y2hhbm5lbHNbbG9vcF07CisJCQlyeHJwY19nZXRfY2FsbChjYWxsc1tsb29wXSk7CisJCX0KKwl9CisKKwlzcGluX3VubG9jaygmY29ubi0+bG9jayk7CisKKwkvKiBub3cga2ljayB0aGVtIGFsbCAqLworCWZvciAobG9vcCA9IDM7IGxvb3AgPj0gMDsgbG9vcC0tKSB7CisJCWlmIChjYWxsc1tsb29wXSkgeworCQkJcnhycGNfY2FsbF9oYW5kbGVfZXJyb3IoY2FsbHNbbG9vcF0sIGxvY2FsLCBlcnJubyk7CisJCQlyeHJwY19wdXRfY2FsbChjYWxsc1tsb29wXSk7CisJCX0KKwl9CisKKwlfbGVhdmUoIiIpOworfSAvKiBlbmQgcnhycGNfY29ubl9oYW5kbGVfZXJyb3IoKSAqLwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2ludGVybmFsLmggYi9uZXQvcnhycGMvaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGU1MmY2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3J4cnBjL2ludGVybmFsLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qIGludGVybmFsLmg6IGludGVybmFsIFJ4IFJQQyBzdHVmZgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiAgIERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pLgorICovCisKKyNpZm5kZWYgUlhSUENfSU5URVJOQUxfSAorI2RlZmluZSBSWFJQQ19JTlRFUk5BTF9ICisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisvKgorICogZGVidWcgYWNjb3VudGluZworICovCisjaWYgMQorI2RlZmluZSBfX1JYQUNDVF9ERUNMKFgpIFgKKyNkZWZpbmUgX19SWEFDQ1QoWCkgZG8geyBYOyB9IHdoaWxlKDApIAorI2Vsc2UKKyNkZWZpbmUgX19SWEFDQ1RfREVDTChYKQorI2RlZmluZSBfX1JYQUNDVChYKSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCitfX1JYQUNDVF9ERUNMKGV4dGVybiBhdG9taWNfdCByeHJwY190cmFuc3BvcnRfY291bnQpOworX19SWEFDQ1RfREVDTChleHRlcm4gYXRvbWljX3QgcnhycGNfcGVlcl9jb3VudCk7CitfX1JYQUNDVF9ERUNMKGV4dGVybiBhdG9taWNfdCByeHJwY19jb25uZWN0aW9uX2NvdW50KTsKK19fUlhBQ0NUX0RFQ0woZXh0ZXJuIGF0b21pY190IHJ4cnBjX2NhbGxfY291bnQpOworX19SWEFDQ1RfREVDTChleHRlcm4gYXRvbWljX3QgcnhycGNfbWVzc2FnZV9jb3VudCk7CisKKy8qCisgKiBkZWJ1ZyB0cmFjaW5nCisgKi8KKyNkZWZpbmUga2VudGVyKEZNVCwgYS4uLikJcHJpbnRrKCI9PT4gJXMoIkZNVCIpXG4iLF9fRlVOQ1RJT05fXyAsICMjYSkKKyNkZWZpbmUga2xlYXZlKEZNVCwgYS4uLikJcHJpbnRrKCI8PT0gJXMoKSJGTVQiXG4iLF9fRlVOQ1RJT05fXyAsICMjYSkKKyNkZWZpbmUga2RlYnVnKEZNVCwgYS4uLikJcHJpbnRrKCIgICAgIkZNVCJcbiIgLCAjI2EpCisjZGVmaW5lIGtwcm90byhGTVQsIGEuLi4pCXByaW50aygiIyMjICJGTVQiXG4iICwgIyNhKQorI2RlZmluZSBrbmV0KEZNVCwgYS4uLikJCXByaW50aygiICAgICJGTVQiXG4iICwgIyNhKQorCisjaWYgMAorI2RlZmluZSBfZW50ZXIoRk1ULCBhLi4uKQlrZW50ZXIoRk1UICwgIyNhKQorI2RlZmluZSBfbGVhdmUoRk1ULCBhLi4uKQlrbGVhdmUoRk1UICwgIyNhKQorI2RlZmluZSBfZGVidWcoRk1ULCBhLi4uKQlrZGVidWcoRk1UICwgIyNhKQorI2RlZmluZSBfcHJvdG8oRk1ULCBhLi4uKQlrcHJvdG8oRk1UICwgIyNhKQorI2RlZmluZSBfbmV0KEZNVCwgYS4uLikJCWtuZXQoRk1UICwgIyNhKQorI2Vsc2UKKyNkZWZpbmUgX2VudGVyKEZNVCwgYS4uLikJZG8geyBpZiAocnhycGNfa3RyYWNlKSBrZW50ZXIoRk1UICwgIyNhKTsgfSB3aGlsZSgwKQorI2RlZmluZSBfbGVhdmUoRk1ULCBhLi4uKQlkbyB7IGlmIChyeHJwY19rdHJhY2UpIGtsZWF2ZShGTVQgLCAjI2EpOyB9IHdoaWxlKDApCisjZGVmaW5lIF9kZWJ1ZyhGTVQsIGEuLi4pCWRvIHsgaWYgKHJ4cnBjX2tkZWJ1Zykga2RlYnVnKEZNVCAsICMjYSk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgX3Byb3RvKEZNVCwgYS4uLikJZG8geyBpZiAocnhycGNfa3Byb3RvKSBrcHJvdG8oRk1UICwgIyNhKTsgfSB3aGlsZSgwKQorI2RlZmluZSBfbmV0KEZNVCwgYS4uLikJCWRvIHsgaWYgKHJ4cnBjX2tuZXQpICAga25ldCAgKEZNVCAsICMjYSk7IH0gd2hpbGUoMCkKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgcnhycGNfZGlzY2FyZF9teV9zaWduYWxzKHZvaWQpCit7CisJd2hpbGUgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCXNpZ2luZm9fdCBzaW5mbzsKKworCQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkJZGVxdWV1ZV9zaWduYWwoY3VycmVudCwgJmN1cnJlbnQtPmJsb2NrZWQsICZzaW5mbyk7CisJCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJfQorfQorCisvKgorICogY2FsbC5jCisgKi8KK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHJ4cnBjX2NhbGxzOworZXh0ZXJuIHN0cnVjdCByd19zZW1hcGhvcmUgcnhycGNfY2FsbHNfc2VtOworCisvKgorICogY29ubmVjdGlvbi5jCisgKi8KK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHJ4cnBjX2Nvbm5zOworZXh0ZXJuIHN0cnVjdCByd19zZW1hcGhvcmUgcnhycGNfY29ubnNfc2VtOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcnhycGNfY29ubl90aW1lb3V0OworCitleHRlcm4gdm9pZCByeHJwY19jb25uX2NsZWFyYWxsKHN0cnVjdCByeHJwY19wZWVyICpwZWVyKTsKKworLyoKKyAqIHBlZXIuYworICovCitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCByeHJwY19wZWVyczsKK2V4dGVybiBzdHJ1Y3Qgcndfc2VtYXBob3JlIHJ4cnBjX3BlZXJzX3NlbTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHJ4cnBjX3BlZXJfdGltZW91dDsKKworZXh0ZXJuIHZvaWQgcnhycGNfcGVlcl9jYWxjdWxhdGVfcnR0KHN0cnVjdCByeHJwY19wZWVyICpwZWVyLAorCQkJCSAgICAgc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZywKKwkJCQkgICAgIHN0cnVjdCByeHJwY19tZXNzYWdlICpyZXNwKTsKKworZXh0ZXJuIHZvaWQgcnhycGNfcGVlcl9jbGVhcmFsbChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucyk7CisKKworLyoKKyAqIHByb2MuYworICovCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK2V4dGVybiBpbnQgcnhycGNfcHJvY19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgcnhycGNfcHJvY19jbGVhbnVwKHZvaWQpOworI2VuZGlmCisKKy8qCisgKiB0cmFuc3BvcnQuYworICovCitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCByeHJwY19wcm9jX3RyYW5zcG9ydHM7CitleHRlcm4gc3RydWN0IHJ3X3NlbWFwaG9yZSByeHJwY19wcm9jX3RyYW5zcG9ydHNfc2VtOworCisjZW5kaWYgLyogUlhSUENfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2tyeGlvZC5jIGIvbmV0L3J4cnBjL2tyeGlvZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNTM3ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcnhycGMva3J4aW9kLmMKQEAgLTAsMCArMSwyNjEgQEAKKy8qIGtyeGlvZC5jOiBSeCBJL08gZGFlbW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxyeHJwYy9rcnhpb2QuaD4KKyNpbmNsdWRlIDxyeHJwYy90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxyeHJwYy9wZWVyLmg+CisjaW5jbHVkZSA8cnhycGMvY2FsbC5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChyeHJwY19rcnhpb2Rfc2xlZXBxKTsKK3N0YXRpYyBERUNMQVJFX0NPTVBMRVRJT04ocnhycGNfa3J4aW9kX2RlYWQpOworCitzdGF0aWMgYXRvbWljX3QgcnhycGNfa3J4aW9kX3Fjb3VudCA9IEFUT01JQ19JTklUKDApOworCitzdGF0aWMgTElTVF9IRUFEKHJ4cnBjX2tyeGlvZF90cmFuc3BvcnRxKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socnhycGNfa3J4aW9kX3RyYW5zcG9ydHFfbG9jayk7CisKK3N0YXRpYyBMSVNUX0hFQUQocnhycGNfa3J4aW9kX2NhbGxxKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socnhycGNfa3J4aW9kX2NhbGxxX2xvY2spOworCitzdGF0aWMgdm9sYXRpbGUgaW50IHJ4cnBjX2tyeGlvZF9kaWU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBSeCBJL08gZGFlbW9uCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfa3J4aW9kKHZvaWQgKmFyZykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRShrcnhpb2QsY3VycmVudCk7CisKKwlwcmludGsoIlN0YXJ0ZWQga3J4aW9kICVkXG4iLGN1cnJlbnQtPnBpZCk7CisKKwlkYWVtb25pemUoImtyeGlvZCIpOworCisJLyogbG9vcCBhcm91bmQgd2FpdGluZyBmb3Igd29yayB0byBkbyAqLworCWRvIHsKKwkJLyogd2FpdCBmb3Igd29yayBvciB0byBiZSB0b2xkIHRvIGV4aXQgKi8KKwkJX2RlYnVnKCIjIyMgQmVnaW4gV2FpdCIpOworCQlpZiAoIWF0b21pY19yZWFkKCZyeHJwY19rcnhpb2RfcWNvdW50KSkgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQkJYWRkX3dhaXRfcXVldWUoJnJ4cnBjX2tyeGlvZF9zbGVlcHEsICZrcnhpb2QpOworCisJCQlmb3IgKDs7KSB7CisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCQlpZiAoYXRvbWljX3JlYWQoJnJ4cnBjX2tyeGlvZF9xY291bnQpIHx8CisJCQkJICAgIHJ4cnBjX2tyeGlvZF9kaWUgfHwKKwkJCQkgICAgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJCWJyZWFrOworCisJCQkJc2NoZWR1bGUoKTsKKwkJCX0KKworCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnJ4cnBjX2tyeGlvZF9zbGVlcHEsICZrcnhpb2QpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJfQorCQlfZGVidWcoIiMjIyBFbmQgV2FpdCIpOworCisJCS8qIGRvIHdvcmsgaWYgYmVlbiBnaXZlbiBzb21lIHRvIGRvICovCisJCV9kZWJ1ZygiIyMjIEJlZ2luIFdvcmsiKTsKKworCQkvKiBzZWUgaWYgdGhlcmUncyBhIHRyYW5zcG9ydCBpbiBuZWVkIG9mIGF0dGVudGlvbiAqLworCQlpZiAoIWxpc3RfZW1wdHkoJnJ4cnBjX2tyeGlvZF90cmFuc3BvcnRxKSkgeworCQkJc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMgPSBOVUxMOworCisJCQlzcGluX2xvY2tfaXJxKCZyeHJwY19rcnhpb2RfdHJhbnNwb3J0cV9sb2NrKTsKKworCQkJaWYgKCFsaXN0X2VtcHR5KCZyeHJwY19rcnhpb2RfdHJhbnNwb3J0cSkpIHsKKwkJCQl0cmFucyA9IGxpc3RfZW50cnkoCisJCQkJCXJ4cnBjX2tyeGlvZF90cmFuc3BvcnRxLm5leHQsCisJCQkJCXN0cnVjdCByeHJwY190cmFuc3BvcnQsCisJCQkJCWtyeGlvZHFfbGluayk7CisKKwkJCQlsaXN0X2RlbF9pbml0KCZ0cmFucy0+a3J4aW9kcV9saW5rKTsKKwkJCQlhdG9taWNfZGVjKCZyeHJwY19rcnhpb2RfcWNvdW50KTsKKworCQkJCS8qIG1ha2Ugc3VyZSBpdCBoYXNuJ3QgZ29uZSBhd2F5IGFuZCBkb2Vzbid0IGdvCisJCQkJICogYXdheSAqLworCQkJCWlmIChhdG9taWNfcmVhZCgmdHJhbnMtPnVzYWdlKT4wKQorCQkJCQlyeHJwY19nZXRfdHJhbnNwb3J0KHRyYW5zKTsKKwkJCQllbHNlCisJCQkJCXRyYW5zID0gTlVMTDsKKwkJCX0KKworCQkJc3Bpbl91bmxvY2tfaXJxKCZyeHJwY19rcnhpb2RfdHJhbnNwb3J0cV9sb2NrKTsKKworCQkJaWYgKHRyYW5zKSB7CisJCQkJcnhycGNfdHJhbnNfcmVjZWl2ZV9wYWNrZXQodHJhbnMpOworCQkJCXJ4cnBjX3B1dF90cmFuc3BvcnQodHJhbnMpOworCQkJfQorCQl9CisKKwkJLyogc2VlIGlmIHRoZXJlJ3MgYSBjYWxsIGluIG5lZWQgb2YgYXR0ZW50aW9uICovCisJCWlmICghbGlzdF9lbXB0eSgmcnhycGNfa3J4aW9kX2NhbGxxKSkgeworCQkJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwgPSBOVUxMOworCisJCQlzcGluX2xvY2tfaXJxKCZyeHJwY19rcnhpb2RfY2FsbHFfbG9jayk7CisKKwkJCWlmICghbGlzdF9lbXB0eSgmcnhycGNfa3J4aW9kX2NhbGxxKSkgeworCQkJCWNhbGwgPSBsaXN0X2VudHJ5KHJ4cnBjX2tyeGlvZF9jYWxscS5uZXh0LAorCQkJCQkJICBzdHJ1Y3QgcnhycGNfY2FsbCwKKwkJCQkJCSAgcmN2X2tyeGlvZHFfbGspOworCQkJCWxpc3RfZGVsX2luaXQoJmNhbGwtPnJjdl9rcnhpb2RxX2xrKTsKKwkJCQlhdG9taWNfZGVjKCZyeHJwY19rcnhpb2RfcWNvdW50KTsKKworCQkJCS8qIG1ha2Ugc3VyZSBpdCBoYXNuJ3QgZ29uZSBhd2F5IGFuZCBkb2Vzbid0IGdvCisJCQkJICogYXdheSAqLworCQkJCWlmIChhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpID4gMCkgeworCQkJCQlfZGVidWcoIkBAQCBLUlhJT0QiCisJCQkJCSAgICAgICAiIEJlZ2luIEF0dGVuZCBDYWxsICVwIiwgY2FsbCk7CisJCQkJCXJ4cnBjX2dldF9jYWxsKGNhbGwpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJY2FsbCA9IE5VTEw7CisJCQkJfQorCQkJfQorCisJCQlzcGluX3VubG9ja19pcnEoJnJ4cnBjX2tyeGlvZF9jYWxscV9sb2NrKTsKKworCQkJaWYgKGNhbGwpIHsKKwkJCQlyeHJwY19jYWxsX2RvX3N0dWZmKGNhbGwpOworCQkJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworCQkJCV9kZWJ1ZygiQEBAIEtSWElPRCBFbmQgQXR0ZW5kIENhbGwgJXAiLCBjYWxsKTsKKwkJCX0KKwkJfQorCisJCV9kZWJ1ZygiIyMjIEVuZCBXb3JrIik7CisKKwkJdHJ5X3RvX2ZyZWV6ZShQRl9GUkVFWkUpOworCisgICAgICAgICAgICAgICAgLyogZGlzY2FyZCBwZW5kaW5nIHNpZ25hbHMgKi8KKwkJcnhycGNfZGlzY2FyZF9teV9zaWduYWxzKCk7CisKKwl9IHdoaWxlICghcnhycGNfa3J4aW9kX2RpZSk7CisKKwkvKiBhbmQgdGhhdCdzIGFsbCAqLworCWNvbXBsZXRlX2FuZF9leGl0KCZyeHJwY19rcnhpb2RfZGVhZCwgMCk7CisKK30gLyogZW5kIHJ4cnBjX2tyeGlvZCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBzdGFydCB1cCBhIGtyeGlvZCBkYWVtb24KKyAqLworaW50IF9faW5pdCByeHJwY19rcnhpb2RfaW5pdCh2b2lkKQoreworCXJldHVybiBrZXJuZWxfdGhyZWFkKHJ4cnBjX2tyeGlvZCwgTlVMTCwgMCk7CisKK30gLyogZW5kIHJ4cnBjX2tyeGlvZF9pbml0KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGtpbGwgdGhlIGtyeGlvZCBkYWVtb24gYW5kIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlCisgKi8KK3ZvaWQgcnhycGNfa3J4aW9kX2tpbGwodm9pZCkKK3sKKwlyeHJwY19rcnhpb2RfZGllID0gMTsKKwl3YWtlX3VwX2FsbCgmcnhycGNfa3J4aW9kX3NsZWVwcSk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmcnhycGNfa3J4aW9kX2RlYWQpOworCit9IC8qIGVuZCByeHJwY19rcnhpb2Rfa2lsbCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBxdWV1ZSBhIHRyYW5zcG9ydCBmb3IgYXR0ZW50aW9uIGJ5IGtyeGlvZAorICovCit2b2lkIHJ4cnBjX2tyeGlvZF9xdWV1ZV90cmFuc3BvcnQoc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCV9lbnRlcigiIik7CisKKwlpZiAobGlzdF9lbXB0eSgmdHJhbnMtPmtyeGlvZHFfbGluaykpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cnBjX2tyeGlvZF90cmFuc3BvcnRxX2xvY2ssIGZsYWdzKTsKKworCQlpZiAobGlzdF9lbXB0eSgmdHJhbnMtPmtyeGlvZHFfbGluaykpIHsKKwkJCWlmIChhdG9taWNfcmVhZCgmdHJhbnMtPnVzYWdlKSA+IDApIHsKKwkJCQlsaXN0X2FkZF90YWlsKCZ0cmFucy0+a3J4aW9kcV9saW5rLAorCQkJCQkgICAgICAmcnhycGNfa3J4aW9kX3RyYW5zcG9ydHEpOworCQkJCWF0b21pY19pbmMoJnJ4cnBjX2tyeGlvZF9xY291bnQpOworCQkJfQorCQl9CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhycGNfa3J4aW9kX3RyYW5zcG9ydHFfbG9jaywgZmxhZ3MpOworCQl3YWtlX3VwX2FsbCgmcnhycGNfa3J4aW9kX3NsZWVwcSk7CisJfQorCisJX2xlYXZlKCIiKTsKKworfSAvKiBlbmQgcnhycGNfa3J4aW9kX3F1ZXVlX3RyYW5zcG9ydCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBkZXF1ZXVlIGEgdHJhbnNwb3J0IGZyb20ga3J4aW9kJ3MgYXR0ZW50aW9uIHF1ZXVlCisgKi8KK3ZvaWQgcnhycGNfa3J4aW9kX2RlcXVldWVfdHJhbnNwb3J0KHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlfZW50ZXIoIiIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cnBjX2tyeGlvZF90cmFuc3BvcnRxX2xvY2ssIGZsYWdzKTsKKwlpZiAoIWxpc3RfZW1wdHkoJnRyYW5zLT5rcnhpb2RxX2xpbmspKSB7CisJCWxpc3RfZGVsX2luaXQoJnRyYW5zLT5rcnhpb2RxX2xpbmspOworCQlhdG9taWNfZGVjKCZyeHJwY19rcnhpb2RfcWNvdW50KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhycGNfa3J4aW9kX3RyYW5zcG9ydHFfbG9jaywgZmxhZ3MpOworCisJX2xlYXZlKCIiKTsKKworfSAvKiBlbmQgcnhycGNfa3J4aW9kX2RlcXVldWVfdHJhbnNwb3J0KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHF1ZXVlIGEgY2FsbCBmb3IgYXR0ZW50aW9uIGJ5IGtyeGlvZAorICovCit2b2lkIHJ4cnBjX2tyeGlvZF9xdWV1ZV9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobGlzdF9lbXB0eSgmY2FsbC0+cmN2X2tyeGlvZHFfbGspKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZyeHJwY19rcnhpb2RfY2FsbHFfbG9jaywgZmxhZ3MpOworCQlpZiAoYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSA+IDApIHsKKwkJCWxpc3RfYWRkX3RhaWwoJmNhbGwtPnJjdl9rcnhpb2RxX2xrLAorCQkJCSAgICAgICZyeHJwY19rcnhpb2RfY2FsbHEpOworCQkJYXRvbWljX2luYygmcnhycGNfa3J4aW9kX3Fjb3VudCk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhycGNfa3J4aW9kX2NhbGxxX2xvY2ssIGZsYWdzKTsKKwl9CisJd2FrZV91cF9hbGwoJnJ4cnBjX2tyeGlvZF9zbGVlcHEpOworCit9IC8qIGVuZCByeHJwY19rcnhpb2RfcXVldWVfY2FsbCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBkZXF1ZXVlIGEgY2FsbCBmcm9tIGtyeGlvZCdzIGF0dGVudGlvbiBxdWV1ZQorICovCit2b2lkIHJ4cnBjX2tyeGlvZF9kZXF1ZXVlX2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyeHJwY19rcnhpb2RfY2FsbHFfbG9jaywgZmxhZ3MpOworCWlmICghbGlzdF9lbXB0eSgmY2FsbC0+cmN2X2tyeGlvZHFfbGspKSB7CisJCWxpc3RfZGVsX2luaXQoJmNhbGwtPnJjdl9rcnhpb2RxX2xrKTsKKwkJYXRvbWljX2RlYygmcnhycGNfa3J4aW9kX3Fjb3VudCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cnBjX2tyeGlvZF9jYWxscV9sb2NrLCBmbGFncyk7CisKK30gLyogZW5kIHJ4cnBjX2tyeGlvZF9kZXF1ZXVlX2NhbGwoKSAqLwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2tyeHNlY2QuYyBiL25ldC9yeHJwYy9rcnhzZWNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAyMGM4OQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy9rcnhzZWNkLmMKQEAgLTAsMCArMSwyNzAgQEAKKy8qIGtyeHNlY2QuYzogUnggc2VjdXJpdHkgZGFlbW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgZGFlbW9uIGRlYWxzIHdpdGg6CisgKiAtIGNvbnN1bHRpbmcgdGhlIGFwcGxpY2F0aW9uIGFzIHRvIHdoZXRoZXIgaW5ib3VuZCBwZWVycyBhbmQgY2FsbHMgc2hvdWxkIGJlIGF1dGhvcmlzZWQKKyAqIC0gZ2VuZXJhdGluZyBzZWN1cml0eSBjaGFsbGVuZ2VzIGZvciBpbmJvdW5kIGNvbm5lY3Rpb25zCisgKiAtIHJlc3BvbmRpbmcgdG8gc2VjdXJpdHkgY2hhbGxlbmdlcyBvbiBvdXRib3VuZCBjb25uZWN0aW9ucworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxyeHJwYy9rcnhzZWNkLmg+CisjaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8cnhycGMvY29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPHJ4cnBjL21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxyeHJwYy9wZWVyLmg+CisjaW5jbHVkZSA8cnhycGMvY2FsbC5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQocnhycGNfa3J4c2VjZF9zbGVlcHEpOworc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihyeHJwY19rcnhzZWNkX2RlYWQpOworc3RhdGljIHZvbGF0aWxlIGludCByeHJwY19rcnhzZWNkX2RpZTsKKworc3RhdGljIGF0b21pY190IHJ4cnBjX2tyeHNlY2RfcWNvdW50OworCisvKiBxdWV1ZSBvZiB1bnByb2Nlc3NlZCBpbmJvdW5kIG1lc3NhZ2VzIHdpdGggc2Vxbm8gIzEgYW5kCisgKiBSWFJQQ19DTElFTlRfSU5JVElBVEVEIGZsYWcgc2V0ICovCitzdGF0aWMgTElTVF9IRUFEKHJ4cnBjX2tyeHNlY2RfaW5pdG1zZ3EpOworc3RhdGljIERFRklORV9TUElOTE9DSyhyeHJwY19rcnhzZWNkX2luaXRtc2dxX2xvY2spOworCitzdGF0aWMgdm9pZCByeHJwY19rcnhzZWNkX3Byb2Nlc3NfaW5jb21pbmdfY2FsbChzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFJ4IHNlY3VyaXR5IGRhZW1vbgorICovCitzdGF0aWMgaW50IHJ4cnBjX2tyeHNlY2Qodm9pZCAqYXJnKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKGtyeHNlY2QsIGN1cnJlbnQpOworCisJaW50IGRpZTsKKworCXByaW50aygiU3RhcnRlZCBrcnhzZWNkICVkXG4iLCBjdXJyZW50LT5waWQpOworCisJZGFlbW9uaXplKCJrcnhzZWNkIik7CisKKwkvKiBsb29wIGFyb3VuZCB3YWl0aW5nIGZvciB3b3JrIHRvIGRvICovCisJZG8geworCQkvKiB3YWl0IGZvciB3b3JrIG9yIHRvIGJlIHRvbGQgdG8gZXhpdCAqLworCQlfZGVidWcoIiMjIyBCZWdpbiBXYWl0Iik7CisJCWlmICghYXRvbWljX3JlYWQoJnJ4cnBjX2tyeHNlY2RfcWNvdW50KSkgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQkJYWRkX3dhaXRfcXVldWUoJnJ4cnBjX2tyeHNlY2Rfc2xlZXBxLCAma3J4c2VjZCk7CisKKwkJCWZvciAoOzspIHsKKwkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJCWlmIChhdG9taWNfcmVhZCgmcnhycGNfa3J4c2VjZF9xY291bnQpIHx8CisJCQkJICAgIHJ4cnBjX2tyeHNlY2RfZGllIHx8CisJCQkJICAgIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCQlicmVhazsKKworCQkJCXNjaGVkdWxlKCk7CisJCQl9CisKKwkJCXJlbW92ZV93YWl0X3F1ZXVlKCZyeHJwY19rcnhzZWNkX3NsZWVwcSwgJmtyeHNlY2QpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJfQorCQlkaWUgPSByeHJwY19rcnhzZWNkX2RpZTsKKwkJX2RlYnVnKCIjIyMgRW5kIFdhaXQiKTsKKworCQkvKiBzZWUgaWYgdGhlcmUncmUgaW5jb21pbmcgY2FsbHMgaW4gbmVlZCBvZiBhdXRoZW50aWNhdGluZyAqLworCQlfZGVidWcoIiMjIyBCZWdpbiBJbmJvdW5kIENhbGxzIik7CisKKwkJaWYgKCFsaXN0X2VtcHR5KCZyeHJwY19rcnhzZWNkX2luaXRtc2dxKSkgeworCQkJc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZyA9IE5VTEw7CisKKwkJCXNwaW5fbG9jaygmcnhycGNfa3J4c2VjZF9pbml0bXNncV9sb2NrKTsKKworCQkJaWYgKCFsaXN0X2VtcHR5KCZyeHJwY19rcnhzZWNkX2luaXRtc2dxKSkgeworCQkJCW1zZyA9IGxpc3RfZW50cnkocnhycGNfa3J4c2VjZF9pbml0bXNncS5uZXh0LAorCQkJCQkJIHN0cnVjdCByeHJwY19tZXNzYWdlLCBsaW5rKTsKKwkJCQlsaXN0X2RlbF9pbml0KCZtc2ctPmxpbmspOworCQkJCWF0b21pY19kZWMoJnJ4cnBjX2tyeHNlY2RfcWNvdW50KTsKKwkJCX0KKworCQkJc3Bpbl91bmxvY2soJnJ4cnBjX2tyeHNlY2RfaW5pdG1zZ3FfbG9jayk7CisKKwkJCWlmIChtc2cpIHsKKwkJCQlyeHJwY19rcnhzZWNkX3Byb2Nlc3NfaW5jb21pbmdfY2FsbChtc2cpOworCQkJCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7CisJCQl9CisJCX0KKworCQlfZGVidWcoIiMjIyBFbmQgSW5ib3VuZCBDYWxscyIpOworCisJCXRyeV90b19mcmVlemUoUEZfRlJFRVpFKTsKKworICAgICAgICAgICAgICAgIC8qIGRpc2NhcmQgcGVuZGluZyBzaWduYWxzICovCisJCXJ4cnBjX2Rpc2NhcmRfbXlfc2lnbmFscygpOworCisJfSB3aGlsZSAoIWRpZSk7CisKKwkvKiBhbmQgdGhhdCdzIGFsbCAqLworCWNvbXBsZXRlX2FuZF9leGl0KCZyeHJwY19rcnhzZWNkX2RlYWQsIDApOworCit9IC8qIGVuZCByeHJwY19rcnhzZWNkKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHN0YXJ0IHVwIGEga3J4c2VjZCBkYWVtb24KKyAqLworaW50IF9faW5pdCByeHJwY19rcnhzZWNkX2luaXQodm9pZCkKK3sKKwlyZXR1cm4ga2VybmVsX3RocmVhZChyeHJwY19rcnhzZWNkLCBOVUxMLCAwKTsKKworfSAvKiBlbmQgcnhycGNfa3J4c2VjZF9pbml0KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGtpbGwgdGhlIGtyeHNlY2QgZGFlbW9uIGFuZCB3YWl0IGZvciBpdCB0byBjb21wbGV0ZQorICovCit2b2lkIHJ4cnBjX2tyeHNlY2Rfa2lsbCh2b2lkKQoreworCXJ4cnBjX2tyeHNlY2RfZGllID0gMTsKKwl3YWtlX3VwX2FsbCgmcnhycGNfa3J4c2VjZF9zbGVlcHEpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJnJ4cnBjX2tyeHNlY2RfZGVhZCk7CisKK30gLyogZW5kIHJ4cnBjX2tyeHNlY2Rfa2lsbCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjbGVhciBhbGwgcGVuZGluZyBpbmNvbWluZyBjYWxscyBmb3IgdGhlIHNwZWNpZmllZCB0cmFuc3BvcnQKKyAqLwordm9pZCByeHJwY19rcnhzZWNkX2NsZWFyX3RyYW5zcG9ydChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucykKK3sKKwlMSVNUX0hFQUQodG1wKTsKKworCXN0cnVjdCByeHJwY19tZXNzYWdlICptc2c7CisJc3RydWN0IGxpc3RfaGVhZCAqX3AsICpfbjsKKworCV9lbnRlcigiJXAiLHRyYW5zKTsKKworCS8qIG1vdmUgYWxsIHRoZSBtZXNzYWdlcyBmb3IgdGhpcyB0cmFuc3BvcnQgb250byBhIHRlbXAgbGlzdCAqLworCXNwaW5fbG9jaygmcnhycGNfa3J4c2VjZF9pbml0bXNncV9sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShfcCwgX24sICZyeHJwY19rcnhzZWNkX2luaXRtc2dxKSB7CisJCW1zZyA9IGxpc3RfZW50cnkoX3AsIHN0cnVjdCByeHJwY19tZXNzYWdlLCBsaW5rKTsKKwkJaWYgKG1zZy0+dHJhbnMgPT0gdHJhbnMpIHsKKwkJCWxpc3RfZGVsKCZtc2ctPmxpbmspOworCQkJbGlzdF9hZGRfdGFpbCgmbXNnLT5saW5rLCAmdG1wKTsKKwkJCWF0b21pY19kZWMoJnJ4cnBjX2tyeHNlY2RfcWNvdW50KTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrKCZyeHJwY19rcnhzZWNkX2luaXRtc2dxX2xvY2spOworCisJLyogemFwIGFsbCBtZXNzYWdlcyBvbiB0aGUgdGVtcCBsaXN0ICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZ0bXApKSB7CisJCW1zZyA9IGxpc3RfZW50cnkodG1wLm5leHQsIHN0cnVjdCByeHJwY19tZXNzYWdlLCBsaW5rKTsKKwkJbGlzdF9kZWxfaW5pdCgmbXNnLT5saW5rKTsKKwkJcnhycGNfcHV0X21lc3NhZ2UobXNnKTsKKwl9CisKKwlfbGVhdmUoIiIpOworfSAvKiBlbmQgcnhycGNfa3J4c2VjZF9jbGVhcl90cmFuc3BvcnQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogcXVldWUgYSBtZXNzYWdlIG9uIHRoZSBpbmNvbWluZyBjYWxscyBsaXN0CisgKi8KK3ZvaWQgcnhycGNfa3J4c2VjZF9xdWV1ZV9pbmNvbWluZ19jYWxsKHN0cnVjdCByeHJwY19tZXNzYWdlICptc2cpCit7CisJX2VudGVyKCIlcCIsIG1zZyk7CisKKwkvKiBxdWV1ZSBmb3IgcHJvY2Vzc2luZyBieSBrcnhzZWNkICovCisJc3Bpbl9sb2NrKCZyeHJwY19rcnhzZWNkX2luaXRtc2dxX2xvY2spOworCisJaWYgKCFyeHJwY19rcnhzZWNkX2RpZSkgeworCQlyeHJwY19nZXRfbWVzc2FnZShtc2cpOworCQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpbmssICZyeHJwY19rcnhzZWNkX2luaXRtc2dxKTsKKwkJYXRvbWljX2luYygmcnhycGNfa3J4c2VjZF9xY291bnQpOworCX0KKworCXNwaW5fdW5sb2NrKCZyeHJwY19rcnhzZWNkX2luaXRtc2dxX2xvY2spOworCisJd2FrZV91cCgmcnhycGNfa3J4c2VjZF9zbGVlcHEpOworCisJX2xlYXZlKCIiKTsKK30gLyogZW5kIHJ4cnBjX2tyeHNlY2RfcXVldWVfaW5jb21pbmdfY2FsbCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBwcm9jZXNzIHRoZSBpbml0aWFsIG1lc3NhZ2Ugb2YgYW4gaW5jb21pbmcgY2FsbAorICovCit2b2lkIHJ4cnBjX2tyeHNlY2RfcHJvY2Vzc19pbmNvbWluZ19jYWxsKHN0cnVjdCByeHJwY19tZXNzYWdlICptc2cpCit7CisJc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMgPSBtc2ctPnRyYW5zOworCXN0cnVjdCByeHJwY19zZXJ2aWNlICpzcnY7CisJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7CisJc3RydWN0IGxpc3RfaGVhZCAqX3A7CisJdW5zaWduZWQgc2hvcnQgc2lkOworCWludCByZXQ7CisKKwlfZW50ZXIoIiVwe3RyPSVwfSIsIG1zZywgdHJhbnMpOworCisJcmV0ID0gcnhycGNfaW5jb21pbmdfY2FsbChtc2ctPmNvbm4sIG1zZywgJmNhbGwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIGZpbmQgdGhlIG1hdGNoaW5nIHNlcnZpY2Ugb24gdGhlIHRyYW5zcG9ydCAqLworCXNpZCA9IG50b2hzKG1zZy0+aGRyLnNlcnZpY2VJZCk7CisJc3J2ID0gTlVMTDsKKworCXNwaW5fbG9jaygmdHJhbnMtPmxvY2spOworCWxpc3RfZm9yX2VhY2goX3AsICZ0cmFucy0+c2VydmljZXMpIHsKKwkJc3J2ID0gbGlzdF9lbnRyeShfcCwgc3RydWN0IHJ4cnBjX3NlcnZpY2UsIGxpbmspOworCQlpZiAoc3J2LT5zZXJ2aWNlX2lkID09IHNpZCAmJiB0cnlfbW9kdWxlX2dldChzcnYtPm93bmVyKSkgeworCQkJLyogZm91bmQgYSBtYXRjaCAobWFkZSBzdXJlIGl0IHdvbid0IHZhbmlzaCkgKi8KKwkJCV9kZWJ1ZygiZm91bmQgc2VydmljZSAnJXMnIiwgc3J2LT5uYW1lKTsKKwkJCWNhbGwtPm93bmVyID0gc3J2LT5vd25lcjsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZ0cmFucy0+bG9jayk7CisKKwkvKiByZXBvcnQgdGhlIG5ldyBjb25uZWN0aW9uCisJICogLSB0aGUgZnVuYyBtdXN0IGluYyB0aGUgY2FsbCdzIHVzYWdlIGNvdW50IHRvIGtlZXAgaXQKKwkgKi8KKwlyZXQgPSAtRU5PRU5UOworCWlmIChfcCAhPSAmdHJhbnMtPnNlcnZpY2VzKSB7CisJCS8qIGF0dGVtcHQgdG8gYWNjZXB0IHRoZSBjYWxsICovCisJCWNhbGwtPmNvbm4tPnNlcnZpY2UgPSBzcnY7CisJCWNhbGwtPmFwcF9hdHRuX2Z1bmMgPSBzcnYtPmF0dG5fZnVuYzsKKwkJY2FsbC0+YXBwX2Vycm9yX2Z1bmMgPSBzcnYtPmVycm9yX2Z1bmM7CisJCWNhbGwtPmFwcF9hZW1hcF9mdW5jID0gc3J2LT5hZW1hcF9mdW5jOworCisJCXJldCA9IHNydi0+bmV3X2NhbGwoY2FsbCk7CisKKwkJLyogc2VuZCBhbiBhYm9ydCBpZiBhbiBlcnJvciBvY2N1cnJlZCAqLworCQlpZiAocmV0IDwgMCkgeworCQkJcnhycGNfY2FsbF9hYm9ydChjYWxsLCByZXQpOworCQl9CisJCWVsc2UgeworCQkJLyogZm9ybWFsbHkgcmVjZWl2ZSBhbmQgQUNLIHRoZSBuZXcgcGFja2V0ICovCisJCQlyZXQgPSByeHJwY19jb25uX3JlY2VpdmVfY2FsbF9wYWNrZXQoY2FsbC0+Y29ubiwKKwkJCQkJCQkgICAgIGNhbGwsIG1zZyk7CisJCX0KKwl9CisKKwlyeHJwY19wdXRfY2FsbChjYWxsKTsKKyBvdXQ6CisJaWYgKHJldCA8IDApCisJCXJ4cnBjX3RyYW5zX2ltbWVkaWF0ZV9hYm9ydCh0cmFucywgbXNnLCByZXQpOworCisJX2xlYXZlKCIgKCVkKSIsIHJldCk7Cit9IC8qIGVuZCByeHJwY19rcnhzZWNkX3Byb2Nlc3NfaW5jb21pbmdfY2FsbCgpICovCmRpZmYgLS1naXQgYS9uZXQvcnhycGMva3J4dGltb2QuYyBiL25ldC9yeHJwYy9rcnh0aW1vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OWMyYjAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcnhycGMva3J4dGltb2QuYwpAQCAtMCwwICsxLDIwMyBAQAorLyoga3J4dGltb2QuYzogUlhSUEMgdGltZW91dCBkYWVtb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxyeHJwYy9yeHJwYy5oPgorI2luY2x1ZGUgPHJ4cnBjL2tyeHRpbW9kLmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihrcnh0aW1vZF9hbGl2ZSk7CitzdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGtyeHRpbW9kX2RlYWQpOworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGtyeHRpbW9kX3NsZWVwcSk7CitzdGF0aWMgaW50IGtyeHRpbW9kX2RpZTsKKworc3RhdGljIExJU1RfSEVBRChrcnh0aW1vZF9saXN0KTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soa3J4dGltb2RfbG9jayk7CisKK3N0YXRpYyBpbnQga3J4dGltb2Qodm9pZCAqYXJnKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHN0YXJ0IHRoZSB0aW1lb3V0IGRhZW1vbgorICovCitpbnQgcnhycGNfa3J4dGltb2Rfc3RhcnQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0ga2VybmVsX3RocmVhZChrcnh0aW1vZCwgTlVMTCwgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZrcnh0aW1vZF9hbGl2ZSk7CisKKwlyZXR1cm4gcmV0OworfSAvKiBlbmQgcnhycGNfa3J4dGltb2Rfc3RhcnQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogc3RvcCB0aGUgdGltZW91dCBkYWVtb24KKyAqLwordm9pZCByeHJwY19rcnh0aW1vZF9raWxsKHZvaWQpCit7CisJLyogZ2V0IHJpZCBvZiBteSBkYWVtb24gKi8KKwlrcnh0aW1vZF9kaWUgPSAxOworCXdha2VfdXAoJmtyeHRpbW9kX3NsZWVwcSk7CisJd2FpdF9mb3JfY29tcGxldGlvbigma3J4dGltb2RfZGVhZCk7CisKK30gLyogZW5kIHJ4cnBjX2tyeHRpbW9kX2tpbGwoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogdGltZW91dCBwcm9jZXNzaW5nIGRhZW1vbgorICovCitzdGF0aWMgaW50IGtyeHRpbW9kKHZvaWQgKmFyZykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsIGN1cnJlbnQpOworCisJcnhycGNfdGltZXJfdCAqdGltZXI7CisKKwlwcmludGsoIlN0YXJ0ZWQga3J4dGltb2QgJWRcbiIsIGN1cnJlbnQtPnBpZCk7CisKKwlkYWVtb25pemUoImtyeHRpbW9kIik7CisKKwljb21wbGV0ZSgma3J4dGltb2RfYWxpdmUpOworCisJLyogbG9vcCBhcm91bmQgbG9va2luZyBmb3IgdGhpbmdzIHRvIGF0dGVuZCB0byAqLworIGxvb3A6CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlhZGRfd2FpdF9xdWV1ZSgma3J4dGltb2Rfc2xlZXBxLCAmbXlzZWxmKTsKKworCWZvciAoOzspIHsKKwkJdW5zaWduZWQgbG9uZyBqaWY7CisJCXNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwkJLyogZGVhbCB3aXRoIHRoZSBzZXJ2ZXIgYmVpbmcgYXNrZWQgdG8gZGllICovCisJCWlmIChrcnh0aW1vZF9kaWUpIHsKKwkJCXJlbW92ZV93YWl0X3F1ZXVlKCZrcnh0aW1vZF9zbGVlcHEsICZteXNlbGYpOworCQkJX2xlYXZlKCIiKTsKKwkJCWNvbXBsZXRlX2FuZF9leGl0KCZrcnh0aW1vZF9kZWFkLCAwKTsKKwkJfQorCisJCXRyeV90b19mcmVlemUoUEZfRlJFRVpFKTsKKworCQkvKiBkaXNjYXJkIHBlbmRpbmcgc2lnbmFscyAqLworCQlyeHJwY19kaXNjYXJkX215X3NpZ25hbHMoKTsKKworCQkvKiB3b3JrIG91dCB0aGUgdGltZSB0byBlbGFwc2UgYmVmb3JlIHRoZSBuZXh0IGV2ZW50ICovCisJCXNwaW5fbG9jaygma3J4dGltb2RfbG9jayk7CisJCWlmIChsaXN0X2VtcHR5KCZrcnh0aW1vZF9saXN0KSkgeworCQkJdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOworCQl9CisJCWVsc2UgeworCQkJdGltZXIgPSBsaXN0X2VudHJ5KGtyeHRpbW9kX2xpc3QubmV4dCwKKwkJCQkJICAgcnhycGNfdGltZXJfdCwgbGluayk7CisJCQl0aW1lb3V0ID0gdGltZXItPnRpbW9famlmOworCQkJamlmID0gamlmZmllczsKKworCQkJaWYgKHRpbWVfYmVmb3JlX2VxKCh1bnNpZ25lZCBsb25nKSB0aW1lb3V0LCBqaWYpKQorCQkJCWdvdG8gaW1tZWRpYXRlOworCisJCQllbHNlIHsKKwkJCQl0aW1lb3V0ID0gKGxvbmcpIHRpbWVvdXQgLSAobG9uZykgamlmZmllczsKKwkJCX0KKwkJfQorCQlzcGluX3VubG9jaygma3J4dGltb2RfbG9jayk7CisKKwkJc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCX0KKworCS8qIHRoZSB0aGluZyBvbiB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlIG5lZWRzIHByb2Nlc3NpbmcKKwkgKiAtIHdlIGNvbWUgaGVyZSB3aXRoIHRoZSBsb2NrIGhlbGQgYW5kIHRpbWVyIHBvaW50aW5nIHRvIHRoZSBleHBpcmVkCisJICogICBlbnRyeQorCSAqLworIGltbWVkaWF0ZToKKwlyZW1vdmVfd2FpdF9xdWV1ZSgma3J4dGltb2Rfc2xlZXBxLCAmbXlzZWxmKTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCisJX2RlYnVnKCJAQEAgQmVnaW4gVGltZW91dCBvZiAlcCIsIHRpbWVyKTsKKworCS8qIGRlcXVldWUgdGhlIHRpbWVyICovCisJbGlzdF9kZWxfaW5pdCgmdGltZXItPmxpbmspOworCXNwaW5fdW5sb2NrKCZrcnh0aW1vZF9sb2NrKTsKKworCS8qIGNhbGwgdGhlIHRpbWVvdXQgZnVuY3Rpb24gKi8KKwl0aW1lci0+b3BzLT50aW1lZF9vdXQodGltZXIpOworCisJX2RlYnVnKCJAQEAgRW5kIFRpbWVvdXQiKTsKKwlnb3RvIGxvb3A7CisKK30gLyogZW5kIGtyeHRpbW9kKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIChyZS0pcXVldWUgYSB0aW1lcgorICovCit2b2lkIHJ4cnBjX2tyeHRpbW9kX2FkZF90aW1lcihyeHJwY190aW1lcl90ICp0aW1lciwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKl9wOworCXJ4cnBjX3RpbWVyX3QgKnB0aW1lcjsKKworCV9lbnRlcigiJXAsJWx1IiwgdGltZXIsIHRpbWVvdXQpOworCisJc3Bpbl9sb2NrKCZrcnh0aW1vZF9sb2NrKTsKKworCWxpc3RfZGVsKCZ0aW1lci0+bGluayk7CisKKwkvKiB0aGUgdGltZXIgd2FzIGRlZmVycmVkIG9yIHJlc2V0IC0gcHV0IGl0IGJhY2sgaW4gdGhlIHF1ZXVlIGF0IHRoZQorCSAqIHJpZ2h0IHBsYWNlICovCisJdGltZXItPnRpbW9famlmID0gamlmZmllcyArIHRpbWVvdXQ7CisKKwlsaXN0X2Zvcl9lYWNoKF9wLCAma3J4dGltb2RfbGlzdCkgeworCQlwdGltZXIgPSBsaXN0X2VudHJ5KF9wLCByeHJwY190aW1lcl90LCBsaW5rKTsKKwkJaWYgKHRpbWVfYmVmb3JlKHRpbWVyLT50aW1vX2ppZiwgcHRpbWVyLT50aW1vX2ppZikpCisJCQlicmVhazsKKwl9CisKKwlsaXN0X2FkZF90YWlsKCZ0aW1lci0+bGluaywgX3ApOyAvKiBpbnNlcnQgYmVmb3JlIHN0b3BwaW5nIHBvaW50ICovCisKKwlzcGluX3VubG9jaygma3J4dGltb2RfbG9jayk7CisKKwl3YWtlX3VwKCZrcnh0aW1vZF9zbGVlcHEpOworCisJX2xlYXZlKCIiKTsKK30gLyogZW5kIHJ4cnBjX2tyeHRpbW9kX2FkZF90aW1lcigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBkZXF1ZXVlIGEgdGltZXIKKyAqIC0gcmV0dXJucyAwIGlmIHRoZSB0aW1lciB3YXMgZGVsZXRlZCBvciAtRU5PRU5UIGlmIGl0IHdhc24ndCBxdWV1ZWQKKyAqLworaW50IHJ4cnBjX2tyeHRpbW9kX2RlbF90aW1lcihyeHJwY190aW1lcl90ICp0aW1lcikKK3sKKwlpbnQgcmV0ID0gMDsKKworCV9lbnRlcigiJXAiLCB0aW1lcik7CisKKwlzcGluX2xvY2soJmtyeHRpbW9kX2xvY2spOworCisJaWYgKGxpc3RfZW1wdHkoJnRpbWVyLT5saW5rKSkKKwkJcmV0ID0gLUVOT0VOVDsKKwllbHNlCisJCWxpc3RfZGVsX2luaXQoJnRpbWVyLT5saW5rKTsKKworCXNwaW5fdW5sb2NrKCZrcnh0aW1vZF9sb2NrKTsKKworCXdha2VfdXAoJmtyeHRpbW9kX3NsZWVwcSk7CisKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfSAvKiBlbmQgcnhycGNfa3J4dGltb2RfZGVsX3RpbWVyKCkgKi8KZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9tYWluLmMgYi9uZXQvcnhycGMvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZmRjYmMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcnhycGMvbWFpbi5jCkBAIC0wLDAgKzEsMTgwIEBACisvKiBtYWluLmM6IFJ4IFJQQyBpbnRlcmZhY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPHJ4cnBjL3J4cnBjLmg+CisjaW5jbHVkZSA8cnhycGMva3J4aW9kLmg+CisjaW5jbHVkZSA8cnhycGMva3J4c2VjZC5oPgorI2luY2x1ZGUgPHJ4cnBjL2tyeHRpbW9kLmg+CisjaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8cnhycGMvY29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KKyNpbmNsdWRlIDxyeHJwYy9tZXNzYWdlLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJSeCBSUEMgaW1wbGVtZW50YXRpb24iKTsKK01PRFVMRV9BVVRIT1IoIlJlZCBIYXQsIEluYy4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworX19iZTMyIHJ4cnBjX2Vwb2NoOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogaW5pdGlhbGlzZSB0aGUgUnggbW9kdWxlCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHJ4cnBjX2luaXRpYWxpc2Uodm9pZCkKK3sKKwlpbnQgcmV0OworCisJLyogbXkgZXBvY2ggdmFsdWUgKi8KKwlyeHJwY19lcG9jaCA9IGh0b25sKHh0aW1lLnR2X3NlYyk7CisKKwkvKiByZWdpc3RlciB0aGUgL3Byb2MgaW50ZXJmYWNlICovCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlyZXQgPSByeHJwY19wcm9jX2luaXQoKTsKKwlpZiAocmV0PDApCisJCXJldHVybiByZXQ7CisjZW5kaWYKKworCS8qIHJlZ2lzdGVyIHRoZSBzeXNjdGwgZmlsZXMgKi8KKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJcmV0ID0gcnhycGNfc3lzY3RsX2luaXQoKTsKKwlpZiAocmV0PDApCisJCWdvdG8gZXJyb3JfcHJvYzsKKyNlbmRpZgorCisJLyogc3RhcnQgdGhlIGtyeHRpbW9kIGRhZW1vbiAqLworCXJldCA9IHJ4cnBjX2tyeHRpbW9kX3N0YXJ0KCk7CisJaWYgKHJldDwwKQorCQlnb3RvIGVycm9yX3N5c2N0bDsKKworCS8qIHN0YXJ0IHRoZSBrcnhpb2QgZGFlbW9uICovCisJcmV0ID0gcnhycGNfa3J4aW9kX2luaXQoKTsKKwlpZiAocmV0PDApCisJCWdvdG8gZXJyb3Jfa3J4dGltb2Q7CisKKwkvKiBzdGFydCB0aGUga3J4c2VjZCBkYWVtb24gKi8KKwlyZXQgPSByeHJwY19rcnhzZWNkX2luaXQoKTsKKwlpZiAocmV0PDApCisJCWdvdG8gZXJyb3Jfa3J4aW9kOworCisJa2RlYnVnKCJcblxuIik7CisKKwlyZXR1cm4gMDsKKworIGVycm9yX2tyeGlvZDoKKwlyeHJwY19rcnhpb2Rfa2lsbCgpOworIGVycm9yX2tyeHRpbW9kOgorCXJ4cnBjX2tyeHRpbW9kX2tpbGwoKTsKKyBlcnJvcl9zeXNjdGw6CisjaWZkZWYgQ09ORklHX1NZU0NUTAorCXJ4cnBjX3N5c2N0bF9jbGVhbnVwKCk7CisjZW5kaWYKKyBlcnJvcl9wcm9jOgorI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJcnhycGNfcHJvY19jbGVhbnVwKCk7CisjZW5kaWYKKwlyZXR1cm4gcmV0OworfSAvKiBlbmQgcnhycGNfaW5pdGlhbGlzZSgpICovCisKK21vZHVsZV9pbml0KHJ4cnBjX2luaXRpYWxpc2UpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogY2xlYW4gdXAgdGhlIFJ4IG1vZHVsZQorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgcnhycGNfY2xlYW51cCh2b2lkKQoreworCWtlbnRlcigiIik7CisKKwlfX1JYQUNDVChwcmludGsoIk91dHN0YW5kaW5nIE1lc3NhZ2VzICAgOiAlZFxuIiwKKwkJCWF0b21pY19yZWFkKCZyeHJwY19tZXNzYWdlX2NvdW50KSkpOworCV9fUlhBQ0NUKHByaW50aygiT3V0c3RhbmRpbmcgQ2FsbHMgICAgICA6ICVkXG4iLAorCQkJYXRvbWljX3JlYWQoJnJ4cnBjX2NhbGxfY291bnQpKSk7CisJX19SWEFDQ1QocHJpbnRrKCJPdXRzdGFuZGluZyBDb25uZWN0aW9uczogJWRcbiIsCisJCQlhdG9taWNfcmVhZCgmcnhycGNfY29ubmVjdGlvbl9jb3VudCkpKTsKKwlfX1JYQUNDVChwcmludGsoIk91dHN0YW5kaW5nIFBlZXJzICAgICAgOiAlZFxuIiwKKwkJCWF0b21pY19yZWFkKCZyeHJwY19wZWVyX2NvdW50KSkpOworCV9fUlhBQ0NUKHByaW50aygiT3V0c3RhbmRpbmcgVHJhbnNwb3J0cyA6ICVkXG4iLAorCQkJYXRvbWljX3JlYWQoJnJ4cnBjX3RyYW5zcG9ydF9jb3VudCkpKTsKKworCXJ4cnBjX2tyeHNlY2Rfa2lsbCgpOworCXJ4cnBjX2tyeGlvZF9raWxsKCk7CisJcnhycGNfa3J4dGltb2Rfa2lsbCgpOworI2lmZGVmIENPTkZJR19TWVNDVEwKKwlyeHJwY19zeXNjdGxfY2xlYW51cCgpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlyeHJwY19wcm9jX2NsZWFudXAoKTsKKyNlbmRpZgorCisJX19SWEFDQ1QocHJpbnRrKCJPdXRzdGFuZGluZyBNZXNzYWdlcyAgIDogJWRcbiIsCisJCQlhdG9taWNfcmVhZCgmcnhycGNfbWVzc2FnZV9jb3VudCkpKTsKKwlfX1JYQUNDVChwcmludGsoIk91dHN0YW5kaW5nIENhbGxzICAgICAgOiAlZFxuIiwKKwkJCWF0b21pY19yZWFkKCZyeHJwY19jYWxsX2NvdW50KSkpOworCV9fUlhBQ0NUKHByaW50aygiT3V0c3RhbmRpbmcgQ29ubmVjdGlvbnM6ICVkXG4iLAorCQkJYXRvbWljX3JlYWQoJnJ4cnBjX2Nvbm5lY3Rpb25fY291bnQpKSk7CisJX19SWEFDQ1QocHJpbnRrKCJPdXRzdGFuZGluZyBQZWVycyAgICAgIDogJWRcbiIsCisJCQlhdG9taWNfcmVhZCgmcnhycGNfcGVlcl9jb3VudCkpKTsKKwlfX1JYQUNDVChwcmludGsoIk91dHN0YW5kaW5nIFRyYW5zcG9ydHMgOiAlZFxuIiwKKwkJCWF0b21pY19yZWFkKCZyeHJwY190cmFuc3BvcnRfY291bnQpKSk7CisKKwlrbGVhdmUoIiIpOworfSAvKiBlbmQgcnhycGNfY2xlYW51cCgpICovCisKK21vZHVsZV9leGl0KHJ4cnBjX2NsZWFudXApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogY2xlYXIgdGhlIGRlYWQgc3BhY2UgYmV0d2VlbiB0YXNrX3N0cnVjdCBhbmQga2VybmVsIHN0YWNrCisgKiAtIGNhbGxlZCBieSBzdXBwbHlpbmcgLWZpbnN0cnVtZW50LWZ1bmN0aW9ucyB0byBnY2MKKyAqLworI2lmIDAKK3ZvaWQgX19jeWdfcHJvZmlsZV9mdW5jX2VudGVyICh2b2lkICp0aGlzX2ZuLCB2b2lkICpjYWxsX3NpdGUpCitfX2F0dHJpYnV0ZV9fKChub19pbnN0cnVtZW50X2Z1bmN0aW9uKSk7CisKK3ZvaWQgX19jeWdfcHJvZmlsZV9mdW5jX2VudGVyICh2b2lkICp0aGlzX2ZuLCB2b2lkICpjYWxsX3NpdGUpCit7CisgICAgICAgYXNtIHZvbGF0aWxlKCIgIG1vdmwgICAgJSVlc3AsJSVlZGkgICAgIFxuIgorICAgICAgICAgICAgICAgICAgICAiICBhbmRsICAgICUwLCUlZWRpICAgICAgICBcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgYWRkbCAgICAlMSwlJWVkaSAgICAgICAgXG4iCisgICAgICAgICAgICAgICAgICAgICIgIG1vdmwgICAgJSVlc3AsJSVlY3ggICAgIFxuIgorICAgICAgICAgICAgICAgICAgICAiICBzdWJsICAgICUlZWRpLCUlZWN4ICAgICBcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgc2hybCAgICAkMiwlJWVjeCAgICAgICAgXG4iCisgICAgICAgICAgICAgICAgICAgICIgIG1vdmwgICAgJDB4ZWRlZGVkZWQsJSVlYXggICAgIFxuIgorICAgICAgICAgICAgICAgICAgICAiICByZXAgc3Rvc2wgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgICAgICA6ICJpIih+KFRIUkVBRF9TSVpFLTEpKSwgImkiKHNpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pKQorICAgICAgICAgICAgICAgICAgICA6ICJlYXgiLCAiZWN4IiwgImVkaSIsICJtZW1vcnkiLCAiY2MiCisgICAgICAgICAgICAgICAgICAgICk7Cit9CisKK3ZvaWQgX19jeWdfcHJvZmlsZV9mdW5jX2V4aXQodm9pZCAqdGhpc19mbiwgdm9pZCAqY2FsbF9zaXRlKQorX19hdHRyaWJ1dGVfXygobm9faW5zdHJ1bWVudF9mdW5jdGlvbikpOworCit2b2lkIF9fY3lnX3Byb2ZpbGVfZnVuY19leGl0KHZvaWQgKnRoaXNfZm4sIHZvaWQgKmNhbGxfc2l0ZSkKK3sKKyAgICAgICBhc20gdm9sYXRpbGUoIiAgbW92bCAgICAlJWVzcCwlJWVkaSAgICAgXG4iCisgICAgICAgICAgICAgICAgICAgICIgIGFuZGwgICAgJTAsJSVlZGkgICAgICAgIFxuIgorICAgICAgICAgICAgICAgICAgICAiICBhZGRsICAgICUxLCUlZWRpICAgICAgICBcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgbW92bCAgICAlJWVzcCwlJWVjeCAgICAgXG4iCisgICAgICAgICAgICAgICAgICAgICIgIHN1YmwgICAgJSVlZGksJSVlY3ggICAgIFxuIgorICAgICAgICAgICAgICAgICAgICAiICBzaHJsICAgICQyLCUlZWN4ICAgICAgICBcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgbW92bCAgICAkMHhkYWRhZGFkYSwlJWVheCAgICAgXG4iCisgICAgICAgICAgICAgICAgICAgICIgIHJlcCBzdG9zbCAgICAgICAgICAgICAgIFxuIgorICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgICAgIDogImkiKH4oVEhSRUFEX1NJWkUtMSkpLCAiaSIoc2l6ZW9mKHN0cnVjdCB0aHJlYWRfaW5mbykpCisgICAgICAgICAgICAgICAgICAgIDogImVheCIsICJlY3giLCAiZWRpIiwgIm1lbW9yeSIsICJjYyIKKyAgICAgICAgICAgICAgICAgICAgKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3BlZXIuYyBiL25ldC9yeHJwYy9wZWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQzOGY1YgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy9wZWVyLmMKQEAgLTAsMCArMSwzOTkgQEAKKy8qIHBlZXIuYzogUnggUlBDIHBlZXIgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8cnhycGMvcnhycGMuaD4KKyNpbmNsdWRlIDxyeHJwYy90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxyeHJwYy9wZWVyLmg+CisjaW5jbHVkZSA8cnhycGMvY29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KKyNpbmNsdWRlIDxyeHJwYy9tZXNzYWdlLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworX19SWEFDQ1RfREVDTChhdG9taWNfdCByeHJwY19wZWVyX2NvdW50KTsKK0xJU1RfSEVBRChyeHJwY19wZWVycyk7CitERUNMQVJFX1JXU0VNKHJ4cnBjX3BlZXJzX3NlbSk7Cit1bnNpZ25lZCBsb25nIHJ4cnBjX3BlZXJfdGltZW91dCA9IDEyICogNjAgKiA2MDsKKworc3RhdGljIHZvaWQgcnhycGNfcGVlcl9kb190aW1lb3V0KHN0cnVjdCByeHJwY19wZWVyICpwZWVyKTsKKworc3RhdGljIHZvaWQgX19yeHJwY19wZWVyX3RpbWVvdXQocnhycGNfdGltZXJfdCAqdGltZXIpCit7CisJc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIgPQorCQlsaXN0X2VudHJ5KHRpbWVyLCBzdHJ1Y3QgcnhycGNfcGVlciwgdGltZW91dCk7CisKKwlfZGVidWcoIlJ4IFBFRVIgVElNRU9VVCBbJXB7dT0lZH1dIiwgcGVlciwgYXRvbWljX3JlYWQoJnBlZXItPnVzYWdlKSk7CisKKwlyeHJwY19wZWVyX2RvX3RpbWVvdXQocGVlcik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnhycGNfdGltZXJfb3BzIHJ4cnBjX3BlZXJfdGltZXJfb3BzID0geworCS50aW1lZF9vdXQJPSBfX3J4cnBjX3BlZXJfdGltZW91dCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjcmVhdGUgYSBwZWVyIHJlY29yZAorICovCitzdGF0aWMgaW50IF9fcnhycGNfY3JlYXRlX3BlZXIoc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMsIF9fYmUzMiBhZGRyLAorCQkJICAgICAgIHN0cnVjdCByeHJwY19wZWVyICoqX3BlZXIpCit7CisJc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXI7CisKKwlfZW50ZXIoIiVwLCUwOHgiLCB0cmFucywgbnRvaGwoYWRkcikpOworCisJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpc2UgYSBwZWVyIHJlY29yZCAqLworCXBlZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnhycGNfcGVlciksIEdGUF9LRVJORUwpOworCWlmICghcGVlcikgeworCQlfbGVhdmUoIiA9IC1FTk9NRU0iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KHBlZXIsIDAsIHNpemVvZihzdHJ1Y3QgcnhycGNfcGVlcikpOworCWF0b21pY19zZXQoJnBlZXItPnVzYWdlLCAxKTsKKworCUlOSVRfTElTVF9IRUFEKCZwZWVyLT5saW5rKTsKKwlJTklUX0xJU1RfSEVBRCgmcGVlci0+cHJvY19saW5rKTsKKwlJTklUX0xJU1RfSEVBRCgmcGVlci0+Y29ubl9pZGxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZwZWVyLT5jb25uX2FjdGl2ZSk7CisJSU5JVF9MSVNUX0hFQUQoJnBlZXItPmNvbm5fZ3JhdmV5YXJkKTsKKwlzcGluX2xvY2tfaW5pdCgmcGVlci0+Y29ubl9neWxvY2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBlZXItPmNvbm5fZ3lfd2FpdHEpOworCXJ3bG9ja19pbml0KCZwZWVyLT5jb25uX2lkbG9jayk7CisJcndsb2NrX2luaXQoJnBlZXItPmNvbm5fbG9jayk7CisJYXRvbWljX3NldCgmcGVlci0+Y29ubl9jb3VudCwgMCk7CisJc3Bpbl9sb2NrX2luaXQoJnBlZXItPmxvY2spOworCXJ4cnBjX3RpbWVyX2luaXQoJnBlZXItPnRpbWVvdXQsICZyeHJwY19wZWVyX3RpbWVyX29wcyk7CisKKwlwZWVyLT5hZGRyLnNfYWRkciA9IGFkZHI7CisKKwlwZWVyLT50cmFucyA9IHRyYW5zOworCXBlZXItPm9wcyA9IHRyYW5zLT5wZWVyX29wczsKKworCV9fUlhBQ0NUKGF0b21pY19pbmMoJnJ4cnBjX3BlZXJfY291bnQpKTsKKwkqX3BlZXIgPSBwZWVyOworCV9sZWF2ZSgiID0gMCAoJXApIiwgcGVlcik7CisKKwlyZXR1cm4gMDsKK30gLyogZW5kIF9fcnhycGNfY3JlYXRlX3BlZXIoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZmluZCBhIHBlZXIgcmVjb3JkIG9uIHRoZSBzcGVjaWZpZWQgdHJhbnNwb3J0CisgKiAtIHJldHVybnMgKGlmIHN1Y2Nlc3NmdWwpIHdpdGggcGVlciByZWNvcmQgdXNhZ2UgaW5jcmVtZW50ZWQKKyAqIC0gcmVzdXJyZWN0cyBpdCBmcm9tIHRoZSBncmF2ZXlhcmQgaWYgZm91bmQgdGhlcmUKKyAqLworaW50IHJ4cnBjX3BlZXJfbG9va3VwKHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zLCBfX2JlMzIgYWRkciwKKwkJICAgICAgc3RydWN0IHJ4cnBjX3BlZXIgKipfcGVlcikKK3sKKwlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlciwgKmNhbmRpZGF0ZSA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqX3A7CisJaW50IHJldDsKKworCV9lbnRlcigiJXB7JWh1fSwlMDh4IiwgdHJhbnMsIHRyYW5zLT5wb3J0LCBudG9obChhZGRyKSk7CisKKwkvKiBbY29tbW9uIGNhc2VdIHNlYXJjaCB0aGUgdHJhbnNwb3J0J3MgYWN0aXZlIGxpc3QgZmlyc3QgKi8KKwlyZWFkX2xvY2soJnRyYW5zLT5wZWVyX2xvY2spOworCWxpc3RfZm9yX2VhY2goX3AsICZ0cmFucy0+cGVlcl9hY3RpdmUpIHsKKwkJcGVlciA9IGxpc3RfZW50cnkoX3AsIHN0cnVjdCByeHJwY19wZWVyLCBsaW5rKTsKKwkJaWYgKHBlZXItPmFkZHIuc19hZGRyID09IGFkZHIpCisJCQlnb3RvIGZvdW5kX2FjdGl2ZTsKKwl9CisJcmVhZF91bmxvY2soJnRyYW5zLT5wZWVyX2xvY2spOworCisJLyogW3VuY29tbW9uIGNhc2VdIG5vdCBhY3RpdmUgLSBjcmVhdGUgYSBjYW5kaWRhdGUgZm9yIGEgbmV3IHJlY29yZCAqLworCXJldCA9IF9fcnhycGNfY3JlYXRlX3BlZXIodHJhbnMsIGFkZHIsICZjYW5kaWRhdGUpOworCWlmIChyZXQgPCAwKSB7CisJCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIHNlYXJjaCB0aGUgYWN0aXZlIGxpc3QgYWdhaW4sIGp1c3QgaW4gY2FzZSBpdCBhcHBlYXJlZCB3aGlsc3Qgd2UKKwkgKiB3ZXJlIGJ1c3kgKi8KKwl3cml0ZV9sb2NrKCZ0cmFucy0+cGVlcl9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKF9wLCAmdHJhbnMtPnBlZXJfYWN0aXZlKSB7CisJCXBlZXIgPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgcnhycGNfcGVlciwgbGluayk7CisJCWlmIChwZWVyLT5hZGRyLnNfYWRkciA9PSBhZGRyKQorCQkJZ290byBmb3VuZF9hY3RpdmVfc2Vjb25kX2NoYW5jZTsKKwl9CisKKwkvKiBzZWFyY2ggdGhlIHRyYW5zcG9ydCdzIGdyYXZleWFyZCBsaXN0ICovCisJc3Bpbl9sb2NrKCZ0cmFucy0+cGVlcl9neWxvY2spOworCWxpc3RfZm9yX2VhY2goX3AsICZ0cmFucy0+cGVlcl9ncmF2ZXlhcmQpIHsKKwkJcGVlciA9IGxpc3RfZW50cnkoX3AsIHN0cnVjdCByeHJwY19wZWVyLCBsaW5rKTsKKwkJaWYgKHBlZXItPmFkZHIuc19hZGRyID09IGFkZHIpCisJCQlnb3RvIGZvdW5kX2luX2dyYXZleWFyZDsKKwl9CisJc3Bpbl91bmxvY2soJnRyYW5zLT5wZWVyX2d5bG9jayk7CisKKwkvKiB3ZSBjYW4gbm93IGFkZCB0aGUgbmV3IGNhbmRpZGF0ZSB0byB0aGUgbGlzdAorCSAqIC0gdGVsbCB0aGUgYXBwbGljYXRpb24gbGF5ZXIgdGhhdCB0aGlzIHBlZXIgaGFzIGJlZW4gYWRkZWQKKwkgKi8KKwlyeHJwY19nZXRfdHJhbnNwb3J0KHRyYW5zKTsKKwlwZWVyID0gY2FuZGlkYXRlOworCWNhbmRpZGF0ZSA9IE5VTEw7CisKKwlpZiAocGVlci0+b3BzICYmIHBlZXItPm9wcy0+YWRkaW5nKSB7CisJCXJldCA9IHBlZXItPm9wcy0+YWRkaW5nKHBlZXIpOworCQlpZiAocmV0IDwgMCkgeworCQkJd3JpdGVfdW5sb2NrKCZ0cmFucy0+cGVlcl9sb2NrKTsKKwkJCV9fUlhBQ0NUKGF0b21pY19kZWMoJnJ4cnBjX3BlZXJfY291bnQpKTsKKwkJCWtmcmVlKHBlZXIpOworCQkJcnhycGNfcHV0X3RyYW5zcG9ydCh0cmFucyk7CisJCQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlhdG9taWNfaW5jKCZ0cmFucy0+cGVlcl9jb3VudCk7CisKKyBtYWtlX2FjdGl2ZToKKwlsaXN0X2FkZF90YWlsKCZwZWVyLT5saW5rLCAmdHJhbnMtPnBlZXJfYWN0aXZlKTsKKworIHN1Y2Nlc3NfdXdmcmVlOgorCXdyaXRlX3VubG9jaygmdHJhbnMtPnBlZXJfbG9jayk7CisKKwlpZiAoY2FuZGlkYXRlKSB7CisJCV9fUlhBQ0NUKGF0b21pY19kZWMoJnJ4cnBjX3BlZXJfY291bnQpKTsKKwkJa2ZyZWUoY2FuZGlkYXRlKTsKKwl9CisKKwlpZiAobGlzdF9lbXB0eSgmcGVlci0+cHJvY19saW5rKSkgeworCQlkb3duX3dyaXRlKCZyeHJwY19wZWVyc19zZW0pOworCQlsaXN0X2FkZF90YWlsKCZwZWVyLT5wcm9jX2xpbmssICZyeHJwY19wZWVycyk7CisJCXVwX3dyaXRlKCZyeHJwY19wZWVyc19zZW0pOworCX0KKworIHN1Y2Nlc3M6CisJKl9wZWVyID0gcGVlcjsKKworCV9sZWF2ZSgiID0gMCAoJXB7dT0lZCBjYz0lZH0pIiwKKwkgICAgICAgcGVlciwKKwkgICAgICAgYXRvbWljX3JlYWQoJnBlZXItPnVzYWdlKSwKKwkgICAgICAgYXRvbWljX3JlYWQoJnBlZXItPmNvbm5fY291bnQpKTsKKwlyZXR1cm4gMDsKKworCS8qIGhhbmRsZSB0aGUgcGVlciBiZWluZyBmb3VuZCBpbiB0aGUgYWN0aXZlIGxpc3Qgc3RyYWlnaHQgb2ZmICovCisgZm91bmRfYWN0aXZlOgorCXJ4cnBjX2dldF9wZWVyKHBlZXIpOworCXJlYWRfdW5sb2NrKCZ0cmFucy0+cGVlcl9sb2NrKTsKKwlnb3RvIHN1Y2Nlc3M7CisKKwkvKiBoYW5kbGUgcmVzdXJyZWN0aW5nIGEgcGVlciBmcm9tIHRoZSBncmF2ZXlhcmQgKi8KKyBmb3VuZF9pbl9ncmF2ZXlhcmQ6CisJcnhycGNfZ2V0X3BlZXIocGVlcik7CisJcnhycGNfZ2V0X3RyYW5zcG9ydChwZWVyLT50cmFucyk7CisJcnhycGNfa3J4dGltb2RfZGVsX3RpbWVyKCZwZWVyLT50aW1lb3V0KTsKKwlsaXN0X2RlbF9pbml0KCZwZWVyLT5saW5rKTsKKwlzcGluX3VubG9jaygmdHJhbnMtPnBlZXJfZ3lsb2NrKTsKKwlnb3RvIG1ha2VfYWN0aXZlOworCisJLyogaGFuZGxlIGZpbmRpbmcgdGhlIHBlZXIgb24gdGhlIHNlY29uZCB0aW1lIHRocm91Z2ggdGhlIGFjdGl2ZQorCSAqIGxpc3QgKi8KKyBmb3VuZF9hY3RpdmVfc2Vjb25kX2NoYW5jZToKKwlyeHJwY19nZXRfcGVlcihwZWVyKTsKKwlnb3RvIHN1Y2Nlc3NfdXdmcmVlOworCit9IC8qIGVuZCByeHJwY19wZWVyX2xvb2t1cCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBmaW5pc2ggd2l0aCBhIHBlZXIgcmVjb3JkCisgKiAtIGl0IGdldHMgc2VudCB0byB0aGUgZ3JhdmV5YXJkIGZyb20gd2hlcmUgaXQgY2FuIGJlIHJlc3VycmVjdGVkIG9yIHRpbWVkCisgKiAgIG91dAorICovCit2b2lkIHJ4cnBjX3B1dF9wZWVyKHN0cnVjdCByeHJwY19wZWVyICpwZWVyKQoreworCXN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zID0gcGVlci0+dHJhbnM7CisKKwlfZW50ZXIoIiVwe2NjPSVkIGE9JTA4eH0iLAorCSAgICAgICBwZWVyLAorCSAgICAgICBhdG9taWNfcmVhZCgmcGVlci0+Y29ubl9jb3VudCksCisJICAgICAgIG50b2hsKHBlZXItPmFkZHIuc19hZGRyKSk7CisKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlpZiAoYXRvbWljX3JlYWQoJnBlZXItPnVzYWdlKSA8PSAwKQorCQlCVUcoKTsKKworCXdyaXRlX2xvY2soJnRyYW5zLT5wZWVyX2xvY2spOworCXNwaW5fbG9jaygmdHJhbnMtPnBlZXJfZ3lsb2NrKTsKKwlpZiAobGlrZWx5KCFhdG9taWNfZGVjX2FuZF90ZXN0KCZwZWVyLT51c2FnZSkpKSB7CisJCXNwaW5fdW5sb2NrKCZ0cmFucy0+cGVlcl9neWxvY2spOworCQl3cml0ZV91bmxvY2soJnRyYW5zLT5wZWVyX2xvY2spOworCQlfbGVhdmUoIiIpOworCQlyZXR1cm47CisJfQorCisJLyogbW92ZSB0byBncmF2ZXlhcmQgcXVldWUgKi8KKwlsaXN0X2RlbCgmcGVlci0+bGluayk7CisJd3JpdGVfdW5sb2NrKCZ0cmFucy0+cGVlcl9sb2NrKTsKKworCWxpc3RfYWRkX3RhaWwoJnBlZXItPmxpbmssICZ0cmFucy0+cGVlcl9ncmF2ZXlhcmQpOworCisJQlVHX09OKCFsaXN0X2VtcHR5KCZwZWVyLT5jb25uX2FjdGl2ZSkpOworCisJcnhycGNfa3J4dGltb2RfYWRkX3RpbWVyKCZwZWVyLT50aW1lb3V0LCByeHJwY19wZWVyX3RpbWVvdXQgKiBIWik7CisKKwlzcGluX3VubG9jaygmdHJhbnMtPnBlZXJfZ3lsb2NrKTsKKworCXJ4cnBjX3B1dF90cmFuc3BvcnQodHJhbnMpOworCisJX2xlYXZlKCIgW2tpbGxlZF0iKTsKK30gLyogZW5kIHJ4cnBjX3B1dF9wZWVyKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGhhbmRsZSBhIHBlZXIgdGltaW5nIG91dCBpbiB0aGUgZ3JhdmV5YXJkCisgKiAtIGNhbGxlZCBmcm9tIGtyeHRpbW9kCisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX3BlZXJfZG9fdGltZW91dChzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcikKK3sKKwlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucyA9IHBlZXItPnRyYW5zOworCisJX2VudGVyKCIlcHt1PSVkIGNjPSVkIGE9JTA4eH0iLAorCSAgICAgICBwZWVyLAorCSAgICAgICBhdG9taWNfcmVhZCgmcGVlci0+dXNhZ2UpLAorCSAgICAgICBhdG9taWNfcmVhZCgmcGVlci0+Y29ubl9jb3VudCksCisJICAgICAgIG50b2hsKHBlZXItPmFkZHIuc19hZGRyKSk7CisKKwlCVUdfT04oYXRvbWljX3JlYWQoJnBlZXItPnVzYWdlKSA8IDApOworCisJLyogcmVtb3ZlIGZyb20gZ3JhdmV5YXJkIGlmIHN0aWxsIGRlYWQgKi8KKwlzcGluX2xvY2soJnRyYW5zLT5wZWVyX2d5bG9jayk7CisJaWYgKGF0b21pY19yZWFkKCZwZWVyLT51c2FnZSkgPT0gMCkKKwkJbGlzdF9kZWxfaW5pdCgmcGVlci0+bGluayk7CisJZWxzZQorCQlwZWVyID0gTlVMTDsKKwlzcGluX3VubG9jaygmdHJhbnMtPnBlZXJfZ3lsb2NrKTsKKworCWlmICghcGVlcikgeworCQlfbGVhdmUoIiIpOworCQlyZXR1cm47IC8qIHJlc3VycmVjdGVkICovCisJfQorCisJLyogY2xlYXIgYWxsIGNvbm5lY3Rpb25zIG9uIHRoaXMgcGVlciAqLworCXJ4cnBjX2Nvbm5fY2xlYXJhbGwocGVlcik7CisKKwlCVUdfT04oIWxpc3RfZW1wdHkoJnBlZXItPmNvbm5fYWN0aXZlKSk7CisJQlVHX09OKCFsaXN0X2VtcHR5KCZwZWVyLT5jb25uX2dyYXZleWFyZCkpOworCisJLyogaW5mb3JtIHRoZSBhcHBsaWNhdGlvbiBsYXllciAqLworCWlmIChwZWVyLT5vcHMgJiYgcGVlci0+b3BzLT5kaXNjYXJkaW5nKQorCQlwZWVyLT5vcHMtPmRpc2NhcmRpbmcocGVlcik7CisKKwlpZiAoIWxpc3RfZW1wdHkoJnBlZXItPnByb2NfbGluaykpIHsKKwkJZG93bl93cml0ZSgmcnhycGNfcGVlcnNfc2VtKTsKKwkJbGlzdF9kZWwoJnBlZXItPnByb2NfbGluayk7CisJCXVwX3dyaXRlKCZyeHJwY19wZWVyc19zZW0pOworCX0KKworCV9fUlhBQ0NUKGF0b21pY19kZWMoJnJ4cnBjX3BlZXJfY291bnQpKTsKKwlrZnJlZShwZWVyKTsKKworCS8qIGlmIHRoZSBncmF2ZXlhcmQgaXMgbm93IGVtcHR5LCB3YWtlIHVwIGFueW9uZSB3YWl0aW5nIGZvciB0aGF0ICovCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnRyYW5zLT5wZWVyX2NvdW50KSkKKwkJd2FrZV91cCgmdHJhbnMtPnBlZXJfZ3lfd2FpdHEpOworCisJX2xlYXZlKCIgW2Rlc3Ryb3llZF0iKTsKK30gLyogZW5kIHJ4cnBjX3BlZXJfZG9fdGltZW91dCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjbGVhciBhbGwgcGVlciByZWNvcmRzIGZyb20gYSB0cmFuc3BvcnQgZW5kcG9pbnQKKyAqLwordm9pZCByeHJwY19wZWVyX2NsZWFyYWxsKHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZixjdXJyZW50KTsKKworCXN0cnVjdCByeHJwY19wZWVyICpwZWVyOworCWludCBlcnI7CisKKwlfZW50ZXIoIiVwIix0cmFucyk7CisKKwkvKiB0aGVyZSBzaG91bGRuJ3QgYmUgYW55IGFjdGl2ZSBwZWVycyByZW1haW5pbmcgKi8KKwlCVUdfT04oIWxpc3RfZW1wdHkoJnRyYW5zLT5wZWVyX2FjdGl2ZSkpOworCisJLyogbWFudWFsbHkgdGltZW91dCBhbGwgcGVlcnMgaW4gdGhlIGdyYXZleWFyZCAqLworCXNwaW5fbG9jaygmdHJhbnMtPnBlZXJfZ3lsb2NrKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnRyYW5zLT5wZWVyX2dyYXZleWFyZCkpIHsKKwkJcGVlciA9IGxpc3RfZW50cnkodHJhbnMtPnBlZXJfZ3JhdmV5YXJkLm5leHQsCisJCQkJICBzdHJ1Y3QgcnhycGNfcGVlciwgbGluayk7CisJCV9kZWJ1ZygiQ2xlYXJpbmcgcGVlciAlcFxuIiwgcGVlcik7CisJCWVyciA9IHJ4cnBjX2tyeHRpbW9kX2RlbF90aW1lcigmcGVlci0+dGltZW91dCk7CisJCXNwaW5fdW5sb2NrKCZ0cmFucy0+cGVlcl9neWxvY2spOworCisJCWlmIChlcnIgPT0gMCkKKwkJCXJ4cnBjX3BlZXJfZG9fdGltZW91dChwZWVyKTsKKworCQlzcGluX2xvY2soJnRyYW5zLT5wZWVyX2d5bG9jayk7CisJfQorCXNwaW5fdW5sb2NrKCZ0cmFucy0+cGVlcl9neWxvY2spOworCisJLyogd2FpdCBmb3IgdGhlIHRoZSBwZWVyIGdyYXZleWFyZCB0byBiZSBjb21wbGV0ZWx5IGNsZWFyZWQgKi8KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJYWRkX3dhaXRfcXVldWUoJnRyYW5zLT5wZWVyX2d5X3dhaXRxLCAmbXlzZWxmKTsKKworCXdoaWxlIChhdG9taWNfcmVhZCgmdHJhbnMtPnBlZXJfY291bnQpICE9IDApIHsKKwkJc2NoZWR1bGUoKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCX0KKworCXJlbW92ZV93YWl0X3F1ZXVlKCZ0cmFucy0+cGVlcl9neV93YWl0cSwgJm15c2VsZik7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCV9sZWF2ZSgiIik7Cit9IC8qIGVuZCByeHJwY19wZWVyX2NsZWFyYWxsKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGNhbGN1bGF0ZSBhbmQgY2FjaGUgdGhlIFJvdW5kLVRyaXAtVGltZSBmb3IgYSBtZXNzYWdlIGFuZCBpdHMgcmVzcG9uc2UKKyAqLwordm9pZCByeHJwY19wZWVyX2NhbGN1bGF0ZV9ydHQoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIsCisJCQkgICAgICBzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnLAorCQkJICAgICAgc3RydWN0IHJ4cnBjX21lc3NhZ2UgKnJlc3ApCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHJ0dDsKKwlpbnQgbG9vcDsKKworCV9lbnRlcigiJXAsJXAsJXAiLCBwZWVyLCBtc2csIHJlc3ApOworCisJLyogY2FsY3VsYXRlIHRoZSBsYXRlc3QgUlRUICovCisJcnR0ID0gcmVzcC0+c3RhbXAudHZfc2VjIC0gbXNnLT5zdGFtcC50dl9zZWM7CisJcnR0ICo9IDEwMDAwMDBVTDsKKwlydHQgKz0gcmVzcC0+c3RhbXAudHZfdXNlYyAtIG1zZy0+c3RhbXAudHZfdXNlYzsKKworCS8qIGFkZCB0byBjYWNoZSAqLworCXBlZXItPnJ0dF9jYWNoZVtwZWVyLT5ydHRfcG9pbnRdID0gcnR0OworCXBlZXItPnJ0dF9wb2ludCsrOworCXBlZXItPnJ0dF9wb2ludCAlPSBSWFJQQ19SVFRfQ0FDSEVfU0laRTsKKworCWlmIChwZWVyLT5ydHRfdXNhZ2UgPCBSWFJQQ19SVFRfQ0FDSEVfU0laRSkKKwkJcGVlci0+cnR0X3VzYWdlKys7CisKKwkvKiByZWNhbGN1bGF0ZSBSVFQgKi8KKwlydHQgPSAwOworCWZvciAobG9vcCA9IHBlZXItPnJ0dF91c2FnZSAtIDE7IGxvb3AgPj0gMDsgbG9vcC0tKQorCQlydHQgKz0gcGVlci0+cnR0X2NhY2hlW2xvb3BdOworCisJZG9fZGl2KHJ0dCwgcGVlci0+cnR0X3VzYWdlKTsKKwlwZWVyLT5ydHQgPSBydHQ7CisKKwlfbGVhdmUoIiBSVFQ9JWx1LiVsdW1zIiwKKwkgICAgICAgKGxvbmcpIChwZWVyLT5ydHQgLyAxMDAwKSwgKGxvbmcpIChwZWVyLT5ydHQgJSAxMDAwKSk7CisKK30gLyogZW5kIHJ4cnBjX3BlZXJfY2FsY3VsYXRlX3J0dCgpICovCmRpZmYgLS1naXQgYS9uZXQvcnhycGMvcHJvYy5jIGIvbmV0L3J4cnBjL3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjVlY2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3J4cnBjL3Byb2MuYwpAQCAtMCwwICsxLDYxNyBAQAorLyogcHJvYy5jOiAvcHJvYyBpbnRlcmZhY2UgZm9yIFJ4UlBDCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxyeHJwYy9yeHJwYy5oPgorI2luY2x1ZGUgPHJ4cnBjL3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHJ4cnBjL3BlZXIuaD4KKyNpbmNsdWRlIDxyeHJwYy9jb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8cnhycGMvY2FsbC5oPgorI2luY2x1ZGUgPHJ4cnBjL21lc3NhZ2UuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3J4cnBjOworCitzdGF0aWMgaW50IHJ4cnBjX3Byb2NfdHJhbnNwb3J0c19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyB2b2lkICpyeHJwY19wcm9jX3RyYW5zcG9ydHNfc3RhcnQoc3RydWN0IHNlcV9maWxlICpwLCBsb2ZmX3QgKnBvcyk7CitzdGF0aWMgdm9pZCAqcnhycGNfcHJvY190cmFuc3BvcnRzX25leHQoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2LCBsb2ZmX3QgKnBvcyk7CitzdGF0aWMgdm9pZCByeHJwY19wcm9jX3RyYW5zcG9ydHNfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpOworc3RhdGljIGludCByeHJwY19wcm9jX3RyYW5zcG9ydHNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpOworCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHJ4cnBjX3Byb2NfdHJhbnNwb3J0c19vcHMgPSB7CisJLnN0YXJ0CT0gcnhycGNfcHJvY190cmFuc3BvcnRzX3N0YXJ0LAorCS5uZXh0CT0gcnhycGNfcHJvY190cmFuc3BvcnRzX25leHQsCisJLnN0b3AJPSByeHJwY19wcm9jX3RyYW5zcG9ydHNfc3RvcCwKKwkuc2hvdwk9IHJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zaG93LAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnhycGNfcHJvY190cmFuc3BvcnRzX2ZvcHMgPSB7CisJLm9wZW4JCT0gcnhycGNfcHJvY190cmFuc3BvcnRzX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgcnhycGNfcHJvY19wZWVyc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyB2b2lkICpyeHJwY19wcm9jX3BlZXJzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcCwgbG9mZl90ICpwb3MpOworc3RhdGljIHZvaWQgKnJ4cnBjX3Byb2NfcGVlcnNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKTsKK3N0YXRpYyB2b2lkIHJ4cnBjX3Byb2NfcGVlcnNfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpOworc3RhdGljIGludCByeHJwY19wcm9jX3BlZXJzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KTsKKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyByeHJwY19wcm9jX3BlZXJzX29wcyA9IHsKKwkuc3RhcnQJPSByeHJwY19wcm9jX3BlZXJzX3N0YXJ0LAorCS5uZXh0CT0gcnhycGNfcHJvY19wZWVyc19uZXh0LAorCS5zdG9wCT0gcnhycGNfcHJvY19wZWVyc19zdG9wLAorCS5zaG93CT0gcnhycGNfcHJvY19wZWVyc19zaG93LAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnhycGNfcHJvY19wZWVyc19mb3BzID0geworCS5vcGVuCQk9IHJ4cnBjX3Byb2NfcGVlcnNfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCByeHJwY19wcm9jX2Nvbm5zX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIHZvaWQgKnJ4cnBjX3Byb2NfY29ubnNfc3RhcnQoc3RydWN0IHNlcV9maWxlICpwLCBsb2ZmX3QgKnBvcyk7CitzdGF0aWMgdm9pZCAqcnhycGNfcHJvY19jb25uc19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdiwgbG9mZl90ICpwb3MpOworc3RhdGljIHZvaWQgcnhycGNfcHJvY19jb25uc19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdik7CitzdGF0aWMgaW50IHJ4cnBjX3Byb2NfY29ubnNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpOworCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHJ4cnBjX3Byb2NfY29ubnNfb3BzID0geworCS5zdGFydAk9IHJ4cnBjX3Byb2NfY29ubnNfc3RhcnQsCisJLm5leHQJPSByeHJwY19wcm9jX2Nvbm5zX25leHQsCisJLnN0b3AJPSByeHJwY19wcm9jX2Nvbm5zX3N0b3AsCisJLnNob3cJPSByeHJwY19wcm9jX2Nvbm5zX3Nob3csCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByeHJwY19wcm9jX2Nvbm5zX2ZvcHMgPSB7CisJLm9wZW4JCT0gcnhycGNfcHJvY19jb25uc19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IHJ4cnBjX3Byb2NfY2FsbHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgdm9pZCAqcnhycGNfcHJvY19jYWxsc19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIGxvZmZfdCAqcG9zKTsKK3N0YXRpYyB2b2lkICpyeHJwY19wcm9jX2NhbGxzX25leHQoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2LCBsb2ZmX3QgKnBvcyk7CitzdGF0aWMgdm9pZCByeHJwY19wcm9jX2NhbGxzX3N0b3Aoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KTsKK3N0YXRpYyBpbnQgcnhycGNfcHJvY19jYWxsc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdik7CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcnhycGNfcHJvY19jYWxsc19vcHMgPSB7CisJLnN0YXJ0CT0gcnhycGNfcHJvY19jYWxsc19zdGFydCwKKwkubmV4dAk9IHJ4cnBjX3Byb2NfY2FsbHNfbmV4dCwKKwkuc3RvcAk9IHJ4cnBjX3Byb2NfY2FsbHNfc3RvcCwKKwkuc2hvdwk9IHJ4cnBjX3Byb2NfY2FsbHNfc2hvdywKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJ4cnBjX3Byb2NfY2FsbHNfZm9wcyA9IHsKKwkub3BlbgkJPSByeHJwY19wcm9jX2NhbGxzX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpyeHJwY19jYWxsX3N0YXRlczdbXSA9IHsKKwkiY29tcGxldCIsCisJImVycm9yICAiLAorCSJyY3Zfb3AgIiwKKwkicmN2X2FyZyIsCisJImdvdF9hcmciLAorCSJzbmRfcnBsIiwKKwkiZmluX2FjayIsCisJInNuZF9hcmciLAorCSJyY3ZfcnBsIiwKKwkiZ290X3JwbCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpyeHJwY19jYWxsX2Vycm9yX3N0YXRlczdbXSA9IHsKKwkibm9fZXJyICIsCisJImxvY19hYnQiLAorCSJybXRfYWJ0IiwKKwkibG9jX2VyciIsCisJInJtdF9lcnIiCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogaW5pdGlhbGlzZSB0aGUgL3Byb2MvbmV0L3J4cnBjLyBkaXJlY3RvcnkKKyAqLworaW50IHJ4cnBjX3Byb2NfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcDsKKworCXByb2NfcnhycGMgPSBwcm9jX21rZGlyKCJyeHJwYyIsIHByb2NfbmV0KTsKKwlpZiAoIXByb2NfcnhycGMpCisJCWdvdG8gZXJyb3I7CisJcHJvY19yeHJwYy0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCXAgPSBjcmVhdGVfcHJvY19lbnRyeSgiY2FsbHMiLCAwLCBwcm9jX3J4cnBjKTsKKwlpZiAoIXApCisJCWdvdG8gZXJyb3JfcHJvYzsKKwlwLT5wcm9jX2ZvcHMgPSAmcnhycGNfcHJvY19jYWxsc19mb3BzOworCXAtPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwlwID0gY3JlYXRlX3Byb2NfZW50cnkoImNvbm5lY3Rpb25zIiwgMCwgcHJvY19yeHJwYyk7CisJaWYgKCFwKQorCQlnb3RvIGVycm9yX2NhbGxzOworCXAtPnByb2NfZm9wcyA9ICZyeHJwY19wcm9jX2Nvbm5zX2ZvcHM7CisJcC0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCXAgPSBjcmVhdGVfcHJvY19lbnRyeSgicGVlcnMiLCAwLCBwcm9jX3J4cnBjKTsKKwlpZiAoIXApCisJCWdvdG8gZXJyb3JfY2FsbHM7CisJcC0+cHJvY19mb3BzID0gJnJ4cnBjX3Byb2NfcGVlcnNfZm9wczsKKwlwLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJ0cmFuc3BvcnRzIiwgMCwgcHJvY19yeHJwYyk7CisJaWYgKCFwKQorCQlnb3RvIGVycm9yX2Nvbm5zOworCXAtPnByb2NfZm9wcyA9ICZyeHJwY19wcm9jX3RyYW5zcG9ydHNfZm9wczsKKwlwLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJcmV0dXJuIDA7CisKKyBlcnJvcl9jb25uczoKKwlyZW1vdmVfcHJvY19lbnRyeSgiY29ubmVjdGlvbnMiLCBwcm9jX3J4cnBjKTsKKyBlcnJvcl9jYWxsczoKKwlyZW1vdmVfcHJvY19lbnRyeSgiY2FsbHMiLCBwcm9jX3J4cnBjKTsKKyBlcnJvcl9wcm9jOgorCXJlbW92ZV9wcm9jX2VudHJ5KCJyeHJwYyIsIHByb2NfbmV0KTsKKyBlcnJvcjoKKwlyZXR1cm4gLUVOT01FTTsKK30gLyogZW5kIHJ4cnBjX3Byb2NfaW5pdCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjbGVhbiB1cCB0aGUgL3Byb2MvbmV0L3J4cnBjLyBkaXJlY3RvcnkKKyAqLwordm9pZCByeHJwY19wcm9jX2NsZWFudXAodm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeSgidHJhbnNwb3J0cyIsIHByb2NfcnhycGMpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJwZWVycyIsIHByb2NfcnhycGMpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJjb25uZWN0aW9ucyIsIHByb2NfcnhycGMpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJjYWxscyIsIHByb2NfcnhycGMpOworCisJcmVtb3ZlX3Byb2NfZW50cnkoInJ4cnBjIiwgcHJvY19uZXQpOworCit9IC8qIGVuZCByeHJwY19wcm9jX2NsZWFudXAoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogb3BlbiAiL3Byb2MvbmV0L3J4cnBjL3RyYW5zcG9ydHMiIHdoaWNoIHByb3ZpZGVzIGEgc3VtbWFyeSBvZiBleHRhbnQgdHJhbnNwb3J0cworICovCitzdGF0aWMgaW50IHJ4cnBjX3Byb2NfdHJhbnNwb3J0c19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzZXFfZmlsZSAqbTsKKwlpbnQgcmV0OworCisJcmV0ID0gc2VxX29wZW4oZmlsZSwgJnJ4cnBjX3Byb2NfdHJhbnNwb3J0c19vcHMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwltLT5wcml2YXRlID0gUERFKGlub2RlKS0+ZGF0YTsKKworCXJldHVybiAwOworfSAvKiBlbmQgcnhycGNfcHJvY190cmFuc3BvcnRzX29wZW4oKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogc2V0IHVwIHRoZSBpdGVyYXRvciB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIHRyYW5zcG9ydHMgbGlzdCBhbmQgcmV0dXJuIHRoZSBmaXJzdCBpdGVtCisgKi8KK3N0YXRpYyB2b2lkICpyeHJwY19wcm9jX3RyYW5zcG9ydHNfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKl9wb3MpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqX3A7CisJbG9mZl90IHBvcyA9ICpfcG9zOworCisJLyogbG9jayB0aGUgbGlzdCBhZ2FpbnN0IG1vZGlmaWNhdGlvbiAqLworCWRvd25fcmVhZCgmcnhycGNfcHJvY190cmFuc3BvcnRzX3NlbSk7CisKKwkvKiBhbGxvdyBmb3IgdGhlIGhlYWRlciBsaW5lICovCisJaWYgKCFwb3MpCisJCXJldHVybiBTRVFfU1RBUlRfVE9LRU47CisJcG9zLS07CisKKwkvKiBmaW5kIHRoZSBuJ3RoIGVsZW1lbnQgaW4gdGhlIGxpc3QgKi8KKwlsaXN0X2Zvcl9lYWNoKF9wLCAmcnhycGNfcHJvY190cmFuc3BvcnRzKQorCQlpZiAoIXBvcy0tKQorCQkJYnJlYWs7CisKKwlyZXR1cm4gX3AgIT0gJnJ4cnBjX3Byb2NfdHJhbnNwb3J0cyA/IF9wIDogTlVMTDsKK30gLyogZW5kIHJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zdGFydCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBtb3ZlIHRvIG5leHQgY2FsbCBpbiB0cmFuc3BvcnRzIGxpc3QKKyAqLworc3RhdGljIHZvaWQgKnJ4cnBjX3Byb2NfdHJhbnNwb3J0c19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqX3A7CisKKwkoKnBvcykrKzsKKworCV9wID0gdjsKKwlfcCA9ICh2ID09IFNFUV9TVEFSVF9UT0tFTikgPyByeHJwY19wcm9jX3RyYW5zcG9ydHMubmV4dCA6IF9wLT5uZXh0OworCisJcmV0dXJuIF9wICE9ICZyeHJwY19wcm9jX3RyYW5zcG9ydHMgPyBfcCA6IE5VTEw7Cit9IC8qIGVuZCByeHJwY19wcm9jX3RyYW5zcG9ydHNfbmV4dCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjbGVhbiB1cCBhZnRlciByZWFkaW5nIGZyb20gdGhlIHRyYW5zcG9ydHMgbGlzdAorICovCitzdGF0aWMgdm9pZCByeHJwY19wcm9jX3RyYW5zcG9ydHNfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCit7CisJdXBfcmVhZCgmcnhycGNfcHJvY190cmFuc3BvcnRzX3NlbSk7CisKK30gLyogZW5kIHJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zdG9wKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGRpc3BsYXkgYSBoZWFkZXIgbGluZSBmb2xsb3dlZCBieSBhIGxvYWQgb2YgY2FsbCBsaW5lcworICovCitzdGF0aWMgaW50IHJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucyA9CisJCWxpc3RfZW50cnkodiwgc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCwgcHJvY19saW5rKTsKKworCS8qIGRpc3BsYXkgaGVhZGVyIG9uIGxpbmUgMSAqLworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlzZXFfcHV0cyhtLCAiTE9DQUwgVVNFXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZGlzcGxheSBvbmUgdHJhbnNwb3J0IHBlciBsaW5lIG9uIHN1YnNlcXVlbnQgbGluZXMgKi8KKwlzZXFfcHJpbnRmKG0sICIlNWh1ICUzZFxuIiwKKwkJICAgdHJhbnMtPnBvcnQsCisJCSAgIGF0b21pY19yZWFkKCZ0cmFucy0+dXNhZ2UpCisJCSAgICk7CisKKwlyZXR1cm4gMDsKK30gLyogZW5kIHJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zaG93KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIG9wZW4gIi9wcm9jL25ldC9yeHJwYy9wZWVycyIgd2hpY2ggcHJvdmlkZXMgYSBzdW1tYXJ5IG9mIGV4dGFudCBwZWVycworICovCitzdGF0aWMgaW50IHJ4cnBjX3Byb2NfcGVlcnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKm07CisJaW50IHJldDsKKworCXJldCA9IHNlcV9vcGVuKGZpbGUsICZyeHJwY19wcm9jX3BlZXJzX29wcyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwltID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCW0tPnByaXZhdGUgPSBQREUoaW5vZGUpLT5kYXRhOworCisJcmV0dXJuIDA7Cit9IC8qIGVuZCByeHJwY19wcm9jX3BlZXJzX29wZW4oKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogc2V0IHVwIHRoZSBpdGVyYXRvciB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIHBlZXJzIGxpc3QgYW5kIHJldHVybiB0aGUKKyAqIGZpcnN0IGl0ZW0KKyAqLworc3RhdGljIHZvaWQgKnJ4cnBjX3Byb2NfcGVlcnNfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKl9wb3MpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqX3A7CisJbG9mZl90IHBvcyA9ICpfcG9zOworCisJLyogbG9jayB0aGUgbGlzdCBhZ2FpbnN0IG1vZGlmaWNhdGlvbiAqLworCWRvd25fcmVhZCgmcnhycGNfcGVlcnNfc2VtKTsKKworCS8qIGFsbG93IGZvciB0aGUgaGVhZGVyIGxpbmUgKi8KKwlpZiAoIXBvcykKKwkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKKwlwb3MtLTsKKworCS8qIGZpbmQgdGhlIG4ndGggZWxlbWVudCBpbiB0aGUgbGlzdCAqLworCWxpc3RfZm9yX2VhY2goX3AsICZyeHJwY19wZWVycykKKwkJaWYgKCFwb3MtLSkKKwkJCWJyZWFrOworCisJcmV0dXJuIF9wICE9ICZyeHJwY19wZWVycyA/IF9wIDogTlVMTDsKK30gLyogZW5kIHJ4cnBjX3Byb2NfcGVlcnNfc3RhcnQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogbW92ZSB0byBuZXh0IGNvbm4gaW4gcGVlcnMgbGlzdAorICovCitzdGF0aWMgdm9pZCAqcnhycGNfcHJvY19wZWVyc19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqX3A7CisKKwkoKnBvcykrKzsKKworCV9wID0gdjsKKwlfcCA9ICh2ID09IFNFUV9TVEFSVF9UT0tFTikgPyByeHJwY19wZWVycy5uZXh0IDogX3AtPm5leHQ7CisKKwlyZXR1cm4gX3AgIT0gJnJ4cnBjX3BlZXJzID8gX3AgOiBOVUxMOworfSAvKiBlbmQgcnhycGNfcHJvY19wZWVyc19uZXh0KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGNsZWFuIHVwIGFmdGVyIHJlYWRpbmcgZnJvbSB0aGUgcGVlcnMgbGlzdAorICovCitzdGF0aWMgdm9pZCByeHJwY19wcm9jX3BlZXJzX3N0b3Aoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQoreworCXVwX3JlYWQoJnJ4cnBjX3BlZXJzX3NlbSk7CisKK30gLyogZW5kIHJ4cnBjX3Byb2NfcGVlcnNfc3RvcCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBkaXNwbGF5IGEgaGVhZGVyIGxpbmUgZm9sbG93ZWQgYnkgYSBsb2FkIG9mIGNvbm4gbGluZXMKKyAqLworc3RhdGljIGludCByeHJwY19wcm9jX3BlZXJzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXN0cnVjdCByeHJwY19wZWVyICpwZWVyID0gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgcnhycGNfcGVlciwgcHJvY19saW5rKTsKKwlzaWduZWQgbG9uZyB0aW1lb3V0OworCisJLyogZGlzcGxheSBoZWFkZXIgb24gbGluZSAxICovCisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CisJCXNlcV9wdXRzKG0sICJMT0NBTCBSRU1PVEUgICBVU0FHRSBDT05OUyAgVElNRU9VVCIKKwkJCSAiICAgTVRVIFJUVCh1UylcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBkaXNwbGF5IG9uZSBwZWVyIHBlciBsaW5lIG9uIHN1YnNlcXVlbnQgbGluZXMgKi8KKwl0aW1lb3V0ID0gMDsKKwlpZiAoIWxpc3RfZW1wdHkoJnBlZXItPnRpbWVvdXQubGluaykpCisJCXRpbWVvdXQgPSAoc2lnbmVkIGxvbmcpIHBlZXItPnRpbWVvdXQudGltb19qaWYgLQorCQkJKHNpZ25lZCBsb25nKSBqaWZmaWVzOworCisJc2VxX3ByaW50ZihtLCAiJTVodSAlMDh4ICU1ZCAlNWQgJThsZCAlNVp1ICU3bHVcbiIsCisJCSAgIHBlZXItPnRyYW5zLT5wb3J0LAorCQkgICBudG9obChwZWVyLT5hZGRyLnNfYWRkciksCisJCSAgIGF0b21pY19yZWFkKCZwZWVyLT51c2FnZSksCisJCSAgIGF0b21pY19yZWFkKCZwZWVyLT5jb25uX2NvdW50KSwKKwkJICAgdGltZW91dCwKKwkJICAgcGVlci0+aWZfbXR1LAorCQkgICAobG9uZykgcGVlci0+cnR0CisJCSAgICk7CisKKwlyZXR1cm4gMDsKK30gLyogZW5kIHJ4cnBjX3Byb2NfcGVlcnNfc2hvdygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBvcGVuICIvcHJvYy9uZXQvcnhycGMvY29ubmVjdGlvbnMiIHdoaWNoIHByb3ZpZGVzIGEgc3VtbWFyeSBvZiBleHRhbnQKKyAqIGNvbm5lY3Rpb25zCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfcHJvY19jb25uc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzZXFfZmlsZSAqbTsKKwlpbnQgcmV0OworCisJcmV0ID0gc2VxX29wZW4oZmlsZSwgJnJ4cnBjX3Byb2NfY29ubnNfb3BzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJbS0+cHJpdmF0ZSA9IFBERShpbm9kZSktPmRhdGE7CisKKwlyZXR1cm4gMDsKK30gLyogZW5kIHJ4cnBjX3Byb2NfY29ubnNfb3BlbigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBzZXQgdXAgdGhlIGl0ZXJhdG9yIHRvIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgY29ubnMgbGlzdCBhbmQgcmV0dXJuIHRoZQorICogZmlyc3QgaXRlbQorICovCitzdGF0aWMgdm9pZCAqcnhycGNfcHJvY19jb25uc19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqX3BvcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKKwlsb2ZmX3QgcG9zID0gKl9wb3M7CisKKwkvKiBsb2NrIHRoZSBsaXN0IGFnYWluc3QgbW9kaWZpY2F0aW9uICovCisJZG93bl9yZWFkKCZyeHJwY19jb25uc19zZW0pOworCisJLyogYWxsb3cgZm9yIHRoZSBoZWFkZXIgbGluZSAqLworCWlmICghcG9zKQorCQlyZXR1cm4gU0VRX1NUQVJUX1RPS0VOOworCXBvcy0tOworCisJLyogZmluZCB0aGUgbid0aCBlbGVtZW50IGluIHRoZSBsaXN0ICovCisJbGlzdF9mb3JfZWFjaChfcCwgJnJ4cnBjX2Nvbm5zKQorCQlpZiAoIXBvcy0tKQorCQkJYnJlYWs7CisKKwlyZXR1cm4gX3AgIT0gJnJ4cnBjX2Nvbm5zID8gX3AgOiBOVUxMOworfSAvKiBlbmQgcnhycGNfcHJvY19jb25uc19zdGFydCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBtb3ZlIHRvIG5leHQgY29ubiBpbiBjb25ucyBsaXN0CisgKi8KK3N0YXRpYyB2b2lkICpyeHJwY19wcm9jX2Nvbm5zX25leHQoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKKworCSgqcG9zKSsrOworCisJX3AgPSB2OworCV9wID0gKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSA/IHJ4cnBjX2Nvbm5zLm5leHQgOiBfcC0+bmV4dDsKKworCXJldHVybiBfcCAhPSAmcnhycGNfY29ubnMgPyBfcCA6IE5VTEw7Cit9IC8qIGVuZCByeHJwY19wcm9jX2Nvbm5zX25leHQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogY2xlYW4gdXAgYWZ0ZXIgcmVhZGluZyBmcm9tIHRoZSBjb25ucyBsaXN0CisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX3Byb2NfY29ubnNfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCit7CisJdXBfcmVhZCgmcnhycGNfY29ubnNfc2VtKTsKKworfSAvKiBlbmQgcnhycGNfcHJvY19jb25uc19zdG9wKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGRpc3BsYXkgYSBoZWFkZXIgbGluZSBmb2xsb3dlZCBieSBhIGxvYWQgb2YgY29ubiBsaW5lcworICovCitzdGF0aWMgaW50IHJ4cnBjX3Byb2NfY29ubnNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm47CisJc2lnbmVkIGxvbmcgdGltZW91dDsKKworCWNvbm4gPSBsaXN0X2VudHJ5KHYsIHN0cnVjdCByeHJwY19jb25uZWN0aW9uLCBwcm9jX2xpbmspOworCisJLyogZGlzcGxheSBoZWFkZXIgb24gbGluZSAxICovCisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CisJCXNlcV9wdXRzKG0sCisJCQkgIkxPQ0FMIFJFTU9URSAgIFJQT1JUIFNSVkMgQ09OTiAgICAgRU5EIFNFUklBTE5PICIKKwkJCSAiQ0FMTE5PICAgICBNVFUgIFRJTUVPVVQiCisJCQkgIlxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIGRpc3BsYXkgb25lIGNvbm4gcGVyIGxpbmUgb24gc3Vic2VxdWVudCBsaW5lcyAqLworCXRpbWVvdXQgPSAwOworCWlmICghbGlzdF9lbXB0eSgmY29ubi0+dGltZW91dC5saW5rKSkKKwkJdGltZW91dCA9IChzaWduZWQgbG9uZykgY29ubi0+dGltZW91dC50aW1vX2ppZiAtCisJCQkoc2lnbmVkIGxvbmcpIGppZmZpZXM7CisKKwlzZXFfcHJpbnRmKG0sCisJCSAgICIlNWh1ICUwOHggJTVodSAlMDRoeCAlMDh4ICUtMy4zcyAlMDh4ICUwOHggJTVadSAlOGxkXG4iLAorCQkgICBjb25uLT50cmFucy0+cG9ydCwKKwkJICAgbnRvaGwoY29ubi0+YWRkci5zaW5fYWRkci5zX2FkZHIpLAorCQkgICBudG9ocyhjb25uLT5hZGRyLnNpbl9wb3J0KSwKKwkJICAgbnRvaHMoY29ubi0+c2VydmljZV9pZCksCisJCSAgIG50b2hsKGNvbm4tPmNvbm5faWQpLAorCQkgICBjb25uLT5vdXRfY2xpZW50ZmxhZyA/ICJDTFQiIDogIlNSViIsCisJCSAgIGNvbm4tPnNlcmlhbF9jb3VudGVyLAorCQkgICBjb25uLT5jYWxsX2NvdW50ZXIsCisJCSAgIGNvbm4tPm10dV9zaXplLAorCQkgICB0aW1lb3V0CisJCSAgICk7CisKKwlyZXR1cm4gMDsKK30gLyogZW5kIHJ4cnBjX3Byb2NfY29ubnNfc2hvdygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBvcGVuICIvcHJvYy9uZXQvcnhycGMvY2FsbHMiIHdoaWNoIHByb3ZpZGVzIGEgc3VtbWFyeSBvZiBleHRhbnQgY2FsbHMKKyAqLworc3RhdGljIGludCByeHJwY19wcm9jX2NhbGxzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNlcV9maWxlICptOworCWludCByZXQ7CisKKwlyZXQgPSBzZXFfb3BlbihmaWxlLCAmcnhycGNfcHJvY19jYWxsc19vcHMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwltLT5wcml2YXRlID0gUERFKGlub2RlKS0+ZGF0YTsKKworCXJldHVybiAwOworfSAvKiBlbmQgcnhycGNfcHJvY19jYWxsc19vcGVuKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHNldCB1cCB0aGUgaXRlcmF0b3IgdG8gc3RhcnQgcmVhZGluZyBmcm9tIHRoZSBjYWxscyBsaXN0IGFuZCByZXR1cm4gdGhlCisgKiBmaXJzdCBpdGVtCisgKi8KK3N0YXRpYyB2b2lkICpyeHJwY19wcm9jX2NhbGxzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpfcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKl9wOworCWxvZmZfdCBwb3MgPSAqX3BvczsKKworCS8qIGxvY2sgdGhlIGxpc3QgYWdhaW5zdCBtb2RpZmljYXRpb24gKi8KKwlkb3duX3JlYWQoJnJ4cnBjX2NhbGxzX3NlbSk7CisKKwkvKiBhbGxvdyBmb3IgdGhlIGhlYWRlciBsaW5lICovCisJaWYgKCFwb3MpCisJCXJldHVybiBTRVFfU1RBUlRfVE9LRU47CisJcG9zLS07CisKKwkvKiBmaW5kIHRoZSBuJ3RoIGVsZW1lbnQgaW4gdGhlIGxpc3QgKi8KKwlsaXN0X2Zvcl9lYWNoKF9wLCAmcnhycGNfY2FsbHMpCisJCWlmICghcG9zLS0pCisJCQlicmVhazsKKworCXJldHVybiBfcCAhPSAmcnhycGNfY2FsbHMgPyBfcCA6IE5VTEw7Cit9IC8qIGVuZCByeHJwY19wcm9jX2NhbGxzX3N0YXJ0KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIG1vdmUgdG8gbmV4dCBjYWxsIGluIGNhbGxzIGxpc3QKKyAqLworc3RhdGljIHZvaWQgKnJ4cnBjX3Byb2NfY2FsbHNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKl9wOworCisJKCpwb3MpKys7CisKKwlfcCA9IHY7CisJX3AgPSAodiA9PSBTRVFfU1RBUlRfVE9LRU4pID8gcnhycGNfY2FsbHMubmV4dCA6IF9wLT5uZXh0OworCisJcmV0dXJuIF9wICE9ICZyeHJwY19jYWxscyA/IF9wIDogTlVMTDsKK30gLyogZW5kIHJ4cnBjX3Byb2NfY2FsbHNfbmV4dCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjbGVhbiB1cCBhZnRlciByZWFkaW5nIGZyb20gdGhlIGNhbGxzIGxpc3QKKyAqLworc3RhdGljIHZvaWQgcnhycGNfcHJvY19jYWxsc19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikKK3sKKwl1cF9yZWFkKCZyeHJwY19jYWxsc19zZW0pOworCit9IC8qIGVuZCByeHJwY19wcm9jX2NhbGxzX3N0b3AoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZGlzcGxheSBhIGhlYWRlciBsaW5lIGZvbGxvd2VkIGJ5IGEgbG9hZCBvZiBjYWxsIGxpbmVzCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfcHJvY19jYWxsc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9IGxpc3RfZW50cnkodiwgc3RydWN0IHJ4cnBjX2NhbGwsIGNhbGxfbGluayk7CisKKwkvKiBkaXNwbGF5IGhlYWRlciBvbiBsaW5lIDEgKi8KKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJc2VxX3B1dHMobSwKKwkJCSAiTE9DQUwgUkVNT1QgU1JWQyBDT05OICAgICBDQUxMICAgICBESVIgVVNFICIKKwkJCSAiIEwgU1RBVEUgICBPUENPREUgQUJPUlQgICAgRVJSTk9cbiIKKwkJCSApOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBkaXNwbGF5IG9uZSBjYWxsIHBlciBsaW5lIG9uIHN1YnNlcXVlbnQgbGluZXMgKi8KKwlzZXFfcHJpbnRmKG0sCisJCSAgICIlNWh1ICU1aHUgJTA0aHggJTA4eCAlMDh4ICVzICUzdSVjIgorCQkgICAiICVjICUtNy43cyAlNmQgJTA4eCAlNWRcbiIsCisJCSAgIGNhbGwtPmNvbm4tPnRyYW5zLT5wb3J0LAorCQkgICBudG9ocyhjYWxsLT5jb25uLT5hZGRyLnNpbl9wb3J0KSwKKwkJICAgbnRvaHMoY2FsbC0+Y29ubi0+c2VydmljZV9pZCksCisJCSAgIG50b2hsKGNhbGwtPmNvbm4tPmNvbm5faWQpLAorCQkgICBudG9obChjYWxsLT5jYWxsX2lkKSwKKwkJICAgY2FsbC0+Y29ubi0+c2VydmljZSA/ICJTVkMiIDogIkNMVCIsCisJCSAgIGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSksCisJCSAgIHdhaXRxdWV1ZV9hY3RpdmUoJmNhbGwtPndhaXRxKSA/ICd3JyA6ICcgJywKKwkJICAgY2FsbC0+YXBwX2xhc3RfcmN2ID8gJ1knIDogJy0nLAorCQkgICAoY2FsbC0+YXBwX2NhbGxfc3RhdGUhPVJYUlBDX0NTVEFURV9FUlJPUiA/CisJCSAgICByeHJwY19jYWxsX3N0YXRlczdbY2FsbC0+YXBwX2NhbGxfc3RhdGVdIDoKKwkJICAgIHJ4cnBjX2NhbGxfZXJyb3Jfc3RhdGVzN1tjYWxsLT5hcHBfZXJyX3N0YXRlXSksCisJCSAgIGNhbGwtPmFwcF9vcGNvZGUsCisJCSAgIGNhbGwtPmFwcF9hYm9ydF9jb2RlLAorCQkgICBjYWxsLT5hcHBfZXJybm8KKwkJICAgKTsKKworCXJldHVybiAwOworfSAvKiBlbmQgcnhycGNfcHJvY19jYWxsc19zaG93KCkgKi8KZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9yeHJwY19zeW1zLmMgYi9uZXQvcnhycGMvcnhycGNfc3ltcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YWRmMTYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcnhycGMvcnhycGNfc3ltcy5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIHJ4cnBjX3N5bXMuYzogZXhwb3J0ZWQgUnggUlBDIGxheWVyIGludGVyZmFjZSBzeW1ib2xzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPHJ4cnBjL3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHJ4cnBjL2Nvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxyeHJwYy9jYWxsLmg+CisjaW5jbHVkZSA8cnhycGMva3J4aW9kLmg+CisKKy8qIGNhbGwuYyAqLworRVhQT1JUX1NZTUJPTChyeHJwY19jcmVhdGVfY2FsbCk7CitFWFBPUlRfU1lNQk9MKHJ4cnBjX3B1dF9jYWxsKTsKK0VYUE9SVF9TWU1CT0wocnhycGNfY2FsbF9hYm9ydCk7CitFWFBPUlRfU1lNQk9MKHJ4cnBjX2NhbGxfcmVhZF9kYXRhKTsKK0VYUE9SVF9TWU1CT0wocnhycGNfY2FsbF93cml0ZV9kYXRhKTsKKworLyogY29ubmVjdGlvbi5jICovCitFWFBPUlRfU1lNQk9MKHJ4cnBjX2NyZWF0ZV9jb25uZWN0aW9uKTsKK0VYUE9SVF9TWU1CT0wocnhycGNfcHV0X2Nvbm5lY3Rpb24pOworCisvKiB0cmFuc3BvcnQuYyAqLworRVhQT1JUX1NZTUJPTChyeHJwY19jcmVhdGVfdHJhbnNwb3J0KTsKK0VYUE9SVF9TWU1CT0wocnhycGNfcHV0X3RyYW5zcG9ydCk7CitFWFBPUlRfU1lNQk9MKHJ4cnBjX2FkZF9zZXJ2aWNlKTsKK0VYUE9SVF9TWU1CT0wocnhycGNfZGVsX3NlcnZpY2UpOwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3N5c2N0bC5jIGIvbmV0L3J4cnBjL3N5c2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZjk4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcnhycGMvc3lzY3RsLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qIHN5c2N0bC5jOiBSeCBSUEMgY29udHJvbAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8cnhycGMvdHlwZXMuaD4KKyNpbmNsdWRlIDxyeHJwYy9yeHJwYy5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK2ludCByeHJwY19rdHJhY2U7CitpbnQgcnhycGNfa2RlYnVnOworaW50IHJ4cnBjX2twcm90bzsKK2ludCByeHJwY19rbmV0OworCisjaWZkZWYgQ09ORklHX1NZU0NUTAorc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpyeHJwY19zeXNjdGwgPSBOVUxMOworCitzdGF0aWMgY3RsX3RhYmxlIHJ4cnBjX3N5c2N0bF90YWJsZVtdID0geworICAgICAgICB7CisJCS5jdGxfbmFtZQk9IDEsCisJCS5wcm9jbmFtZQk9ICJrZGVidWciLAorCQkuZGF0YQkJPSAmcnhycGNfa2RlYnVnLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKKwl9LAorICAgICAgICB7CisJCS5jdGxfbmFtZQk9IDIsCisJCS5wcm9jbmFtZQk9ICJrdHJhY2UiLAorCQkuZGF0YQkJPSAmcnhycGNfa3RyYWNlLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKKwl9LAorICAgICAgICB7CisJCS5jdGxfbmFtZQk9IDMsCisJCS5wcm9jbmFtZQk9ICJrcHJvdG8iLAorCQkuZGF0YQkJPSAmcnhycGNfa3Byb3RvLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKKwl9LAorICAgICAgICB7CisJCS5jdGxfbmFtZQk9IDQsCisJCS5wcm9jbmFtZQk9ICJrbmV0IiwKKwkJLmRhdGEJCT0gJnJ4cnBjX2tuZXQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisgICAgICAgIHsKKwkJLmN0bF9uYW1lCT0gNSwKKwkJLnByb2NuYW1lCT0gInBlZXJ0aW1vIiwKKwkJLmRhdGEJCT0gJnJ4cnBjX3BlZXJfdGltZW91dCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgbG9uZyksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb3Vsb25ndmVjX21pbm1heAorCX0sCisgICAgICAgIHsKKwkJLmN0bF9uYW1lCT0gNiwKKwkJLnByb2NuYW1lCT0gImNvbm50aW1vIiwKKwkJLmRhdGEJCT0gJnJ4cnBjX2Nvbm5fdGltZW91dCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgbG9uZyksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb3Vsb25ndmVjX21pbm1heAorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3N0YXRpYyBjdGxfdGFibGUgcnhycGNfZGlyX3N5c2N0bF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gMSwKKwkJLnByb2NuYW1lCT0gInJ4cnBjIiwKKwkJLm1heGxlbgkJPSAwLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gcnhycGNfc3lzY3RsX3RhYmxlCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKyNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBpbml0aWFsaXNlIHRoZSBzeXNjdGwgc3R1ZmYgZm9yIFJ4IFJQQworICovCitpbnQgcnhycGNfc3lzY3RsX2luaXQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJcnhycGNfc3lzY3RsID0gcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHJ4cnBjX2Rpcl9zeXNjdGxfdGFibGUsIDApOworCWlmICghcnhycGNfc3lzY3RsKQorCQlyZXR1cm4gLUVOT01FTTsKKyNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCisKKwlyZXR1cm4gMDsKK30gLyogZW5kIHJ4cnBjX3N5c2N0bF9pbml0KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGNsZWFuIHVwIHRoZSBzeXNjdGwgc3R1ZmYgZm9yIFJ4IFJQQworICovCit2b2lkIHJ4cnBjX3N5c2N0bF9jbGVhbnVwKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1NZU0NUTAorCWlmIChyeHJwY19zeXNjdGwpIHsKKwkJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUocnhycGNfc3lzY3RsKTsKKwkJcnhycGNfc3lzY3RsID0gTlVMTDsKKwl9CisjZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLworCit9IC8qIGVuZCByeHJwY19zeXNjdGxfY2xlYW51cCgpICovCmRpZmYgLS1naXQgYS9uZXQvcnhycGMvdHJhbnNwb3J0LmMgYi9uZXQvcnhycGMvdHJhbnNwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJjZTc3OQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy90cmFuc3BvcnQuYwpAQCAtMCwwICsxLDg1NCBAQAorLyogdHJhbnNwb3J0LmM6IFJ4IFRyYW5zcG9ydCByb3V0aW5lcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8cnhycGMvcGVlci5oPgorI2luY2x1ZGUgPHJ4cnBjL2Nvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxyeHJwYy9jYWxsLmg+CisjaW5jbHVkZSA8cnhycGMvbWVzc2FnZS5oPgorI2luY2x1ZGUgPHJ4cnBjL2tyeGlvZC5oPgorI2luY2x1ZGUgPHJ4cnBjL2tyeHNlY2QuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L2ljbXAuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQgKENPTkZJR19JUFY2X01PRFVMRSkKKyNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CS8qIHRoaXMgc2hvdWxkIF9yZWFsbHlfIGJlIGluIGVycnF1ZXVlLmguLiAqLworI2VuZGlmCisjaW5jbHVkZSA8bGludXgvZXJycXVldWUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0cnVjdCBlcnJvcm1zZyB7CisJc3RydWN0IGNtc2doZHIJCQljbXNnOwkJLyogY29udHJvbCBtZXNzYWdlIGhlYWRlciAqLworCXN0cnVjdCBzb2NrX2V4dGVuZGVkX2VycgllZTsJCS8qIGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uICovCisJc3RydWN0IHNvY2thZGRyX2luCQlpY21wX3NyYzsJLyogSUNNUCBwYWNrZXQgc291cmNlIGFkZHJlc3MgKi8KK307CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socnhycGNfdHJhbnNwb3J0c19sb2NrKTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHJ4cnBjX3RyYW5zcG9ydHMgPSBMSVNUX0hFQURfSU5JVChyeHJwY190cmFuc3BvcnRzKTsKKworX19SWEFDQ1RfREVDTChhdG9taWNfdCByeHJwY190cmFuc3BvcnRfY291bnQpOworTElTVF9IRUFEKHJ4cnBjX3Byb2NfdHJhbnNwb3J0cyk7CitERUNMQVJFX1JXU0VNKHJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zZW0pOworCitzdGF0aWMgdm9pZCByeHJwY19kYXRhX3JlYWR5KHN0cnVjdCBzb2NrICpzaywgaW50IGNvdW50KTsKK3N0YXRpYyB2b2lkIHJ4cnBjX2Vycm9yX3JlcG9ydChzdHJ1Y3Qgc29jayAqc2spOworc3RhdGljIGludCByeHJwY190cmFuc19yZWNlaXZlX25ld19jYWxsKHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zLAorCQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICptc2dxKTsKK3N0YXRpYyB2b2lkIHJ4cnBjX3RyYW5zX3JlY2VpdmVfZXJyb3JfcmVwb3J0KHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGNyZWF0ZSBhIG5ldyB0cmFuc3BvcnQgZW5kcG9pbnQgdXNpbmcgdGhlIHNwZWNpZmllZCBVRFAgcG9ydAorICovCitpbnQgcnhycGNfY3JlYXRlX3RyYW5zcG9ydCh1bnNpZ25lZCBzaG9ydCBwb3J0LAorCQkJICAgc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqKl90cmFucykKK3sKKwlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFuczsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCW1tX3NlZ21lbnRfdCBvbGRmczsKKwlzdHJ1Y3Qgc29jayAqc29jazsKKwlpbnQgcmV0LCBvcHQ7CisKKwlfZW50ZXIoIiVodSIsIHBvcnQpOworCisJdHJhbnMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0cmFucykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQodHJhbnMsIDAsIHNpemVvZihzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0KSk7CisJYXRvbWljX3NldCgmdHJhbnMtPnVzYWdlLCAxKTsKKwlJTklUX0xJU1RfSEVBRCgmdHJhbnMtPnNlcnZpY2VzKTsKKwlJTklUX0xJU1RfSEVBRCgmdHJhbnMtPmxpbmspOworCUlOSVRfTElTVF9IRUFEKCZ0cmFucy0+a3J4aW9kcV9saW5rKTsKKwlzcGluX2xvY2tfaW5pdCgmdHJhbnMtPmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZ0cmFucy0+cGVlcl9hY3RpdmUpOworCUlOSVRfTElTVF9IRUFEKCZ0cmFucy0+cGVlcl9ncmF2ZXlhcmQpOworCXNwaW5fbG9ja19pbml0KCZ0cmFucy0+cGVlcl9neWxvY2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRyYW5zLT5wZWVyX2d5X3dhaXRxKTsKKwlyd2xvY2tfaW5pdCgmdHJhbnMtPnBlZXJfbG9jayk7CisJYXRvbWljX3NldCgmdHJhbnMtPnBlZXJfY291bnQsIDApOworCXRyYW5zLT5wb3J0ID0gcG9ydDsKKworCS8qIGNyZWF0ZSBhIFVEUCBzb2NrZXQgdG8gYmUgbXkgYWN0dWFsIHRyYW5zcG9ydCBlbmRwb2ludCAqLworCXJldCA9IHNvY2tfY3JlYXRlX2tlcm4oUEZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFAsICZ0cmFucy0+c29ja2V0KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIHVzZSB0aGUgc3BlY2lmaWVkIHBvcnQgKi8KKwlpZiAocG9ydCkgeworCQltZW1zZXQoJnNpbiwgMCwgc2l6ZW9mKHNpbikpOworCQlzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCXNpbi5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCQlyZXQgPSB0cmFucy0+c29ja2V0LT5vcHMtPmJpbmQodHJhbnMtPnNvY2tldCwKKwkJCQkJICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNpbiwKKwkJCQkJICAgICAgIHNpemVvZihzaW4pKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycm9yOworCX0KKworCW9wdCA9IDE7CisJb2xkZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwlyZXQgPSB0cmFucy0+c29ja2V0LT5vcHMtPnNldHNvY2tvcHQodHJhbnMtPnNvY2tldCwgU09MX0lQLCBJUF9SRUNWRVJSLAorCQkJCQkgICAgIChjaGFyICopICZvcHQsIHNpemVvZihvcHQpKTsKKwlzZXRfZnMob2xkZnMpOworCisJc3Bpbl9sb2NrKCZyeHJwY190cmFuc3BvcnRzX2xvY2spOworCWxpc3RfYWRkKCZ0cmFucy0+bGluaywgJnJ4cnBjX3RyYW5zcG9ydHMpOworCXNwaW5fdW5sb2NrKCZyeHJwY190cmFuc3BvcnRzX2xvY2spOworCisJLyogc2V0IHRoZSBzb2NrZXQgdXAgKi8KKwlzb2NrID0gdHJhbnMtPnNvY2tldC0+c2s7CisJc29jay0+c2tfdXNlcl9kYXRhCT0gdHJhbnM7CisJc29jay0+c2tfZGF0YV9yZWFkeQk9IHJ4cnBjX2RhdGFfcmVhZHk7CisJc29jay0+c2tfZXJyb3JfcmVwb3J0CT0gcnhycGNfZXJyb3JfcmVwb3J0OworCisJZG93bl93cml0ZSgmcnhycGNfcHJvY190cmFuc3BvcnRzX3NlbSk7CisJbGlzdF9hZGRfdGFpbCgmdHJhbnMtPnByb2NfbGluaywgJnJ4cnBjX3Byb2NfdHJhbnNwb3J0cyk7CisJdXBfd3JpdGUoJnJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zZW0pOworCisJX19SWEFDQ1QoYXRvbWljX2luYygmcnhycGNfdHJhbnNwb3J0X2NvdW50KSk7CisKKwkqX3RyYW5zID0gdHJhbnM7CisJX2xlYXZlKCIgPSAwICglcCkiLCB0cmFucyk7CisJcmV0dXJuIDA7CisKKyBlcnJvcjoKKwkvKiBmaW5pc2ggY2xlYW5pbmcgdXAgdGhlIHRyYW5zcG9ydCAobm90IHJlYWxseSBuZWVkZWQgaGVyZSwgYnV0Li4uKSAqLworCWlmICh0cmFucy0+c29ja2V0KQorCQl0cmFucy0+c29ja2V0LT5vcHMtPnNodXRkb3duKHRyYW5zLT5zb2NrZXQsIDIpOworCisJLyogY2xvc2UgdGhlIHNvY2tldCAqLworCWlmICh0cmFucy0+c29ja2V0KSB7CisJCXRyYW5zLT5zb2NrZXQtPnNrLT5za191c2VyX2RhdGEgPSBOVUxMOworCQlzb2NrX3JlbGVhc2UodHJhbnMtPnNvY2tldCk7CisJCXRyYW5zLT5zb2NrZXQgPSBOVUxMOworCX0KKworCWtmcmVlKHRyYW5zKTsKKworCisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30gLyogZW5kIHJ4cnBjX2NyZWF0ZV90cmFuc3BvcnQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZGVzdHJveSBhIHRyYW5zcG9ydCBlbmRwb2ludAorICovCit2b2lkIHJ4cnBjX3B1dF90cmFuc3BvcnQoc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMpCit7CisJX2VudGVyKCIlcHt1PSVkIHA9JWh1fSIsCisJICAgICAgIHRyYW5zLCBhdG9taWNfcmVhZCgmdHJhbnMtPnVzYWdlKSwgdHJhbnMtPnBvcnQpOworCisJQlVHX09OKGF0b21pY19yZWFkKCZ0cmFucy0+dXNhZ2UpIDw9IDApOworCisJLyogdG8gcHJldmVudCBhIHJhY2UsIHRoZSBkZWNyZW1lbnQgYW5kIHRoZSBkZXF1ZXVlIG11c3QgYmUKKwkgKiBlZmZlY3RpdmVseSBhdG9taWMgKi8KKwlzcGluX2xvY2soJnJ4cnBjX3RyYW5zcG9ydHNfbG9jayk7CisJaWYgKGxpa2VseSghYXRvbWljX2RlY19hbmRfdGVzdCgmdHJhbnMtPnVzYWdlKSkpIHsKKwkJc3Bpbl91bmxvY2soJnJ4cnBjX3RyYW5zcG9ydHNfbG9jayk7CisJCV9sZWF2ZSgiIik7CisJCXJldHVybjsKKwl9CisKKwlsaXN0X2RlbCgmdHJhbnMtPmxpbmspOworCXNwaW5fdW5sb2NrKCZyeHJwY190cmFuc3BvcnRzX2xvY2spOworCisJLyogZmluaXNoIGNsZWFuaW5nIHVwIHRoZSB0cmFuc3BvcnQgKi8KKwlpZiAodHJhbnMtPnNvY2tldCkKKwkJdHJhbnMtPnNvY2tldC0+b3BzLT5zaHV0ZG93bih0cmFucy0+c29ja2V0LCAyKTsKKworCXJ4cnBjX2tyeHNlY2RfY2xlYXJfdHJhbnNwb3J0KHRyYW5zKTsKKwlyeHJwY19rcnhpb2RfZGVxdWV1ZV90cmFuc3BvcnQodHJhbnMpOworCisJLyogZGlzY2FyZCBhbGwgcGVlciBpbmZvcm1hdGlvbiAqLworCXJ4cnBjX3BlZXJfY2xlYXJhbGwodHJhbnMpOworCisJZG93bl93cml0ZSgmcnhycGNfcHJvY190cmFuc3BvcnRzX3NlbSk7CisJbGlzdF9kZWwoJnRyYW5zLT5wcm9jX2xpbmspOworCXVwX3dyaXRlKCZyeHJwY19wcm9jX3RyYW5zcG9ydHNfc2VtKTsKKwlfX1JYQUNDVChhdG9taWNfZGVjKCZyeHJwY190cmFuc3BvcnRfY291bnQpKTsKKworCS8qIGNsb3NlIHRoZSBzb2NrZXQgKi8KKwlpZiAodHJhbnMtPnNvY2tldCkgeworCQl0cmFucy0+c29ja2V0LT5zay0+c2tfdXNlcl9kYXRhID0gTlVMTDsKKwkJc29ja19yZWxlYXNlKHRyYW5zLT5zb2NrZXQpOworCQl0cmFucy0+c29ja2V0ID0gTlVMTDsKKwl9CisKKwlrZnJlZSh0cmFucyk7CisKKwlfbGVhdmUoIiIpOworfSAvKiBlbmQgcnhycGNfcHV0X3RyYW5zcG9ydCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBhZGQgYSBzZXJ2aWNlIHRvIGEgdHJhbnNwb3J0IHRvIGJlIGxpc3RlbmVkIHVwb24KKyAqLworaW50IHJ4cnBjX2FkZF9zZXJ2aWNlKHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zLAorCQkgICAgICBzdHJ1Y3QgcnhycGNfc2VydmljZSAqbmV3c3J2KQoreworCXN0cnVjdCByeHJwY19zZXJ2aWNlICpzcnY7CisJc3RydWN0IGxpc3RfaGVhZCAqX3A7CisJaW50IHJldCA9IC1FRVhJU1Q7CisKKwlfZW50ZXIoIiVweyVodX0sJXB7JWh1fSIsCisJICAgICAgIHRyYW5zLCB0cmFucy0+cG9ydCwgbmV3c3J2LCBuZXdzcnYtPnNlcnZpY2VfaWQpOworCisJLyogdmVyaWZ5IHRoYXQgdGhlIHNlcnZpY2UgSUQgaXMgbm90IGFscmVhZHkgcHJlc2VudCAqLworCXNwaW5fbG9jaygmdHJhbnMtPmxvY2spOworCisJbGlzdF9mb3JfZWFjaChfcCwgJnRyYW5zLT5zZXJ2aWNlcykgeworCQlzcnYgPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgcnhycGNfc2VydmljZSwgbGluayk7CisJCWlmIChzcnYtPnNlcnZpY2VfaWQgPT0gbmV3c3J2LT5zZXJ2aWNlX2lkKQorCQkJZ290byBvdXQ7CisJfQorCisJLyogb2theSAtIGFkZCB0aGUgdHJhbnNwb3J0IHRvIHRoZSBsaXN0ICovCisJbGlzdF9hZGRfdGFpbCgmbmV3c3J2LT5saW5rLCAmdHJhbnMtPnNlcnZpY2VzKTsKKwlyeHJwY19nZXRfdHJhbnNwb3J0KHRyYW5zKTsKKwlyZXQgPSAwOworCisgb3V0OgorCXNwaW5fdW5sb2NrKCZ0cmFucy0+bG9jayk7CisKKwlfbGVhdmUoIj0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9IC8qIGVuZCByeHJwY19hZGRfc2VydmljZSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiByZW1vdmUgYSBzZXJ2aWNlIGZyb20gYSB0cmFuc3BvcnQKKyAqLwordm9pZCByeHJwY19kZWxfc2VydmljZShzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucywgc3RydWN0IHJ4cnBjX3NlcnZpY2UgKnNydikKK3sKKwlfZW50ZXIoIiVweyVodX0sJXB7JWh1fSIsIHRyYW5zLCB0cmFucy0+cG9ydCwgc3J2LCBzcnYtPnNlcnZpY2VfaWQpOworCisJc3Bpbl9sb2NrKCZ0cmFucy0+bG9jayk7CisJbGlzdF9kZWwoJnNydi0+bGluayk7CisJc3Bpbl91bmxvY2soJnRyYW5zLT5sb2NrKTsKKworCXJ4cnBjX3B1dF90cmFuc3BvcnQodHJhbnMpOworCisJX2xlYXZlKCIiKTsKK30gLyogZW5kIHJ4cnBjX2RlbF9zZXJ2aWNlKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIElORVQgY2FsbGJhY2sgd2hlbiBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkIG9uIHRoZSBzb2NrZXQuCisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2RhdGFfcmVhZHkoc3RydWN0IHNvY2sgKnNrLCBpbnQgY291bnQpCit7CisJc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnM7CisKKwlfZW50ZXIoIiVwe3Q9JXB9LCVkIiwgc2ssIHNrLT5za191c2VyX2RhdGEsIGNvdW50KTsKKworCS8qIHF1ZXVlIHRoZSB0cmFuc3BvcnQgZm9yIGF0dGVudGlvbiBieSBrcnhpb2QgKi8KKwl0cmFucyA9IChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICopIHNrLT5za191c2VyX2RhdGE7CisJaWYgKHRyYW5zKQorCQlyeHJwY19rcnhpb2RfcXVldWVfdHJhbnNwb3J0KHRyYW5zKTsKKworCS8qIHdha2UgdXAgYW55b25lIHdhaXRpbmcgb24gdGhlIHNvY2tldCAqLworCWlmIChzay0+c2tfc2xlZXAgJiYgd2FpdHF1ZXVlX2FjdGl2ZShzay0+c2tfc2xlZXApKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoc2stPnNrX3NsZWVwKTsKKworCV9sZWF2ZSgiIik7Cit9IC8qIGVuZCByeHJwY19kYXRhX3JlYWR5KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIElORVQgY2FsbGJhY2sgd2hlbiBhbiBJQ01QIGVycm9yIHBhY2tldCBpcyByZWNlaXZlZAorICogLSBzay0+ZXJyIGlzIGVycm9yIChFSE9TVFVOUkVBQ0gsIEVQUk9UTyBvciBFTVNHU0laRSkKKyAqLworc3RhdGljIHZvaWQgcnhycGNfZXJyb3JfcmVwb3J0KHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFuczsKKworCV9lbnRlcigiJXB7dD0lcH0iLCBzaywgc2stPnNrX3VzZXJfZGF0YSk7CisKKwkvKiBxdWV1ZSB0aGUgdHJhbnNwb3J0IGZvciBhdHRlbnRpb24gYnkga3J4aW9kICovCisJdHJhbnMgPSAoc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqKSBzay0+c2tfdXNlcl9kYXRhOworCWlmICh0cmFucykgeworCQl0cmFucy0+ZXJyb3JfcmN2ZCA9IDE7CisJCXJ4cnBjX2tyeGlvZF9xdWV1ZV90cmFuc3BvcnQodHJhbnMpOworCX0KKworCS8qIHdha2UgdXAgYW55b25lIHdhaXRpbmcgb24gdGhlIHNvY2tldCAqLworCWlmIChzay0+c2tfc2xlZXAgJiYgd2FpdHF1ZXVlX2FjdGl2ZShzay0+c2tfc2xlZXApKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoc2stPnNrX3NsZWVwKTsKKworCV9sZWF2ZSgiIik7Cit9IC8qIGVuZCByeHJwY19lcnJvcl9yZXBvcnQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogc3BsaXQgYSBtZXNzYWdlIHVwLCBhbGxvY2F0aW5nIG1lc3NhZ2UgcmVjb3JkcyBhbmQgZmlsbGluZyB0aGVtIGluCisgKiBmcm9tIHRoZSBjb250ZW50cyBvZiBhIHNvY2tldCBidWZmZXIKKyAqLworc3RhdGljIGludCByeHJwY19pbmNvbWluZ19tc2coc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LAorCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbXNncSkKK3sKKwlzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnOworCWludCByZXQ7CisKKwlfZW50ZXIoIiIpOworCisJbXNnID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJ4cnBjX21lc3NhZ2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zZykgeworCQlfbGVhdmUoIiA9IC1FTk9NRU0iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KG1zZywgMCwgc2l6ZW9mKCptc2cpKTsKKwlhdG9taWNfc2V0KCZtc2ctPnVzYWdlLCAxKTsKKwlsaXN0X2FkZF90YWlsKCZtc2ctPmxpbmssbXNncSk7CisKKwkvKiBkaWcgb3V0IHRoZSBSeCByb3V0aW5nIHBhcmFtZXRlcnMgKi8KKwlpZiAoc2tiX2NvcHlfYml0cyhwa3QsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSwKKwkJCSAgJm1zZy0+aGRyLCBzaXplb2YobXNnLT5oZHIpKSA8IDApIHsKKwkJcmV0ID0gLUVCQURNU0c7CisJCWdvdG8gZXJyb3I7CisJfQorCisJbXNnLT50cmFucyA9IHRyYW5zOworCW1zZy0+c3RhdGUgPSBSWFJQQ19NU0dfUkVDRUlWRUQ7CisJbXNnLT5zdGFtcCA9IHBrdC0+c3RhbXA7CisJaWYgKG1zZy0+c3RhbXAudHZfc2VjID09IDApIHsKKwkJZG9fZ2V0dGltZW9mZGF5KCZtc2ctPnN0YW1wKTsgCisJCWlmIChwa3QtPnNrKSAKKwkJCXNvY2tfZW5hYmxlX3RpbWVzdGFtcChwa3QtPnNrKTsKKwl9IAorCW1zZy0+c2VxID0gbnRvaGwobXNnLT5oZHIuc2VxKTsKKworCS8qIGF0dGFjaCB0aGUgcGFja2V0ICovCisJc2tiX2dldChwa3QpOworCW1zZy0+cGt0ID0gcGt0OworCisJbXNnLT5vZmZzZXQgPSBzaXplb2Yoc3RydWN0IHVkcGhkcikgKyBzaXplb2Yoc3RydWN0IHJ4cnBjX2hlYWRlcik7CisJbXNnLT5kc2l6ZSA9IG1zZy0+cGt0LT5sZW4gLSBtc2ctPm9mZnNldDsKKworCV9uZXQoIlJ4IFJlY2VpdmVkIHBhY2tldCBmcm9tICVzICglMDh4OyUwOHgsJTF4LCVkLCVzLCUwMngsJWQsJWQpIiwKKwkgICAgIG1zZy0+aGRyLmZsYWdzICYgUlhSUENfQ0xJRU5UX0lOSVRJQVRFRCA/ICJjbGllbnQiIDogInNlcnZlciIsCisJICAgICBudG9obChtc2ctPmhkci5lcG9jaCksCisJICAgICAobnRvaGwobXNnLT5oZHIuY2lkKSAmIFJYUlBDX0NJRE1BU0spID4+IFJYUlBDX0NJRFNISUZULAorCSAgICAgbnRvaGwobXNnLT5oZHIuY2lkKSAmIFJYUlBDX0NIQU5ORUxNQVNLLAorCSAgICAgbnRvaGwobXNnLT5oZHIuY2FsbE51bWJlciksCisJICAgICByeHJwY19wa3RzW21zZy0+aGRyLnR5cGVdLAorCSAgICAgbXNnLT5oZHIuZmxhZ3MsCisJICAgICBudG9ocyhtc2ctPmhkci5zZXJ2aWNlSWQpLAorCSAgICAgbXNnLT5oZHIuc2VjdXJpdHlJbmRleCk7CisKKwlfX1JYQUNDVChhdG9taWNfaW5jKCZyeHJwY19tZXNzYWdlX2NvdW50KSk7CisKKwkvKiBzcGxpdCBvZmYganVtYm8gcGFja2V0cyAqLworCXdoaWxlIChtc2ctPmhkci50eXBlID09IFJYUlBDX1BBQ0tFVF9UWVBFX0RBVEEgJiYKKwkgICAgICAgbXNnLT5oZHIuZmxhZ3MgJiBSWFJQQ19KVU1CT19QQUNLRVQKKwkgICAgICAgKSB7CisJCXN0cnVjdCByeHJwY19qdW1ib19oZWFkZXIganVtYm87CisJCXN0cnVjdCByeHJwY19tZXNzYWdlICpqdW1ib21zZyA9IG1zZzsKKworCQlfZGVidWcoInNwbGl0IGp1bWJvIHBhY2tldCIpOworCisJCS8qIHF1aWNrIHNhbml0eSBjaGVjayAqLworCQlyZXQgPSAtRUJBRE1TRzsKKwkJaWYgKG1zZy0+ZHNpemUgPAorCQkgICAgUlhSUENfSlVNQk9fREFUQUxFTiArIHNpemVvZihzdHJ1Y3QgcnhycGNfanVtYm9faGVhZGVyKSkKKwkJCWdvdG8gZXJyb3I7CisJCWlmIChtc2ctPmhkci5mbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBkaWcgb3V0IHRoZSBzZWNvbmRhcnkgaGVhZGVyICovCisJCWlmIChza2JfY29weV9iaXRzKHBrdCwgbXNnLT5vZmZzZXQgKyBSWFJQQ19KVU1CT19EQVRBTEVOLAorCQkJCSAgJmp1bWJvLCBzaXplb2YoanVtYm8pKSA8IDApCisJCQlnb3RvIGVycm9yOworCisJCS8qIGFsbG9jYXRlIGEgbmV3IG1lc3NhZ2UgcmVjb3JkICovCisJCXJldCA9IC1FTk9NRU07CisJCW1zZyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCByeHJwY19tZXNzYWdlKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghbXNnKQorCQkJZ290byBlcnJvcjsKKworCQltZW1jcHkobXNnLCBqdW1ib21zZywgc2l6ZW9mKCptc2cpKTsKKwkJbGlzdF9hZGRfdGFpbCgmbXNnLT5saW5rLCBtc2dxKTsKKworCQkvKiBhZGp1c3QgdGhlIGp1bWJvIHBhY2tldCAqLworCQlqdW1ib21zZy0+ZHNpemUgPSBSWFJQQ19KVU1CT19EQVRBTEVOOworCisJCS8qIGF0dGFjaCB0aGUgcGFja2V0IGhlcmUgdG9vICovCisJCXNrYl9nZXQocGt0KTsKKworCQkvKiBhZGp1c3QgdGhlIHBhcmFtZXRlcnMgKi8KKwkJbXNnLT5zZXErKzsKKwkJbXNnLT5oZHIuc2VxID0gaHRvbmwobXNnLT5zZXEpOworCQltc2ctPmhkci5zZXJpYWwgPSBodG9ubChudG9obChtc2ctPmhkci5zZXJpYWwpICsgMSk7CisJCW1zZy0+b2Zmc2V0ICs9IFJYUlBDX0pVTUJPX0RBVEFMRU4gKworCQkJc2l6ZW9mKHN0cnVjdCByeHJwY19qdW1ib19oZWFkZXIpOworCQltc2ctPmRzaXplIC09IFJYUlBDX0pVTUJPX0RBVEFMRU4gKworCQkJc2l6ZW9mKHN0cnVjdCByeHJwY19qdW1ib19oZWFkZXIpOworCQltc2ctPmhkci5mbGFncyA9IGp1bWJvLmZsYWdzOworCQltc2ctPmhkci5fcnN2ZCA9IGp1bWJvLl9yc3ZkOworCisJCV9uZXQoIlJ4IFNwbGl0IGp1bWJvIHBhY2tldCBmcm9tICVzIgorCQkgICAgICIgKCUwOHg7JTA4eCwlMXgsJWQsJXMsJTAyeCwlZCwlZCkiLAorCQkgICAgIG1zZy0+aGRyLmZsYWdzICYgUlhSUENfQ0xJRU5UX0lOSVRJQVRFRCA/ICJjbGllbnQiIDogInNlcnZlciIsCisJCSAgICAgbnRvaGwobXNnLT5oZHIuZXBvY2gpLAorCQkgICAgIChudG9obChtc2ctPmhkci5jaWQpICYgUlhSUENfQ0lETUFTSykgPj4gUlhSUENfQ0lEU0hJRlQsCisJCSAgICAgbnRvaGwobXNnLT5oZHIuY2lkKSAmIFJYUlBDX0NIQU5ORUxNQVNLLAorCQkgICAgIG50b2hsKG1zZy0+aGRyLmNhbGxOdW1iZXIpLAorCQkgICAgIHJ4cnBjX3BrdHNbbXNnLT5oZHIudHlwZV0sCisJCSAgICAgbXNnLT5oZHIuZmxhZ3MsCisJCSAgICAgbnRvaHMobXNnLT5oZHIuc2VydmljZUlkKSwKKwkJICAgICBtc2ctPmhkci5zZWN1cml0eUluZGV4KTsKKworCQlfX1JYQUNDVChhdG9taWNfaW5jKCZyeHJwY19tZXNzYWdlX2NvdW50KSk7CisJfQorCisJX2xlYXZlKCIgPSAwICMlZCIsIGF0b21pY19yZWFkKCZyeHJwY19tZXNzYWdlX2NvdW50KSk7CisJcmV0dXJuIDA7CisKKyBlcnJvcjoKKwl3aGlsZSAoIWxpc3RfZW1wdHkobXNncSkpIHsKKwkJbXNnID0gbGlzdF9lbnRyeShtc2dxLT5uZXh0LCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7CisJCWxpc3RfZGVsX2luaXQoJm1zZy0+bGluayk7CisKKwkJcnhycGNfcHV0X21lc3NhZ2UobXNnKTsKKwl9CisKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfSAvKiBlbmQgcnhycGNfaW5jb21pbmdfbXNnKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGFjY2VwdCBhIG5ldyBjYWxsCisgKiAtIGNhbGxlZCBmcm9tIGtyeGlvZCBpbiBwcm9jZXNzIGNvbnRleHQKKyAqLwordm9pZCByeHJwY190cmFuc19yZWNlaXZlX3BhY2tldChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucykKK3sKKwlzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnOworCXN0cnVjdCByeHJwY19wZWVyICpwZWVyOworCXN0cnVjdCBza19idWZmICpwa3Q7CisJaW50IHJldDsKKwlfX2JlMzIgYWRkcjsKKwlfX2JlMTYgcG9ydDsKKworCUxJU1RfSEVBRChtc2dxKTsKKworCV9lbnRlcigiJXB7JWR9IiwgdHJhbnMsIHRyYW5zLT5wb3J0KTsKKworCWZvciAoOzspIHsKKwkJLyogZGVhbCB3aXRoIG91dHN0YW50aW5nIGVycm9ycyBmaXJzdCAqLworCQlpZiAodHJhbnMtPmVycm9yX3JjdmQpCisJCQlyeHJwY190cmFuc19yZWNlaXZlX2Vycm9yX3JlcG9ydCh0cmFucyk7CisKKwkJLyogYXR0ZW1wdCB0byByZWNlaXZlIGEgcGFja2V0ICovCisJCXBrdCA9IHNrYl9yZWN2X2RhdGFncmFtKHRyYW5zLT5zb2NrZXQtPnNrLCAwLCAxLCAmcmV0KTsKKwkJaWYgKCFwa3QpIHsKKwkJCWlmIChyZXQgPT0gLUVBR0FJTikgeworCQkJCV9sZWF2ZSgiIEVBR0FJTiIpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLyogYW4gaWNtcCBlcnJvciBtYXkgaGF2ZSBvY2N1cnJlZCAqLworCQkJcnhycGNfa3J4aW9kX3F1ZXVlX3RyYW5zcG9ydCh0cmFucyk7CisJCQlfbGVhdmUoIiBlcnJvciAlZFxuIiwgcmV0KTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIHdlJ2xsIHByb2JhYmx5IG5lZWQgdG8gY2hlY2tzdW0gaXQgKGRpZG4ndCBjYWxsCisJCSAqIHNvY2tfcmVjdm1zZykgKi8KKwkJaWYgKHBrdC0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1VOTkVDRVNTQVJZKSB7CisJCQlpZiAoKHVuc2lnbmVkIHNob3J0KQorCQkJICAgIGNzdW1fZm9sZChza2JfY2hlY2tzdW0ocGt0LCAwLCBwa3QtPmxlbiwKKwkJCQkJCSAgIHBrdC0+Y3N1bSkpKSB7CisJCQkJa2ZyZWVfc2tiKHBrdCk7CisJCQkJcnhycGNfa3J4aW9kX3F1ZXVlX3RyYW5zcG9ydCh0cmFucyk7CisJCQkJX2xlYXZlKCIgQ1NVTSBmYWlsZWQiKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQlhZGRyID0gcGt0LT5uaC5pcGgtPnNhZGRyOworCQlwb3J0ID0gcGt0LT5oLnVoLT5zb3VyY2U7CisKKwkJX25ldCgiUnggUmVjZWl2ZWQgVURQIHBhY2tldCBmcm9tICUwOHg6JTA0aHUiLAorCQkgICAgIG50b2hsKGFkZHIpLCBudG9ocyhwb3J0KSk7CisKKwkJLyogdW5tYXJzaGFsbCB0aGUgUnggcGFyYW1ldGVycyBhbmQgc3BsaXQganVtYm8gcGFja2V0cyAqLworCQlyZXQgPSByeHJwY19pbmNvbWluZ19tc2codHJhbnMsIHBrdCwgJm1zZ3EpOworCQlpZiAocmV0IDwgMCkgeworCQkJa2ZyZWVfc2tiKHBrdCk7CisJCQlyeHJwY19rcnhpb2RfcXVldWVfdHJhbnNwb3J0KHRyYW5zKTsKKwkJCV9sZWF2ZSgiIGJhZCBwYWNrZXQiKTsKKwkJCXJldHVybjsKKwkJfQorCisJCUJVR19PTihsaXN0X2VtcHR5KCZtc2dxKSk7CisKKwkJbXNnID0gbGlzdF9lbnRyeShtc2dxLm5leHQsIHN0cnVjdCByeHJwY19tZXNzYWdlLCBsaW5rKTsKKworCQkvKiBsb2NhdGUgdGhlIHJlY29yZCBmb3IgdGhlIHBlZXIgZnJvbSB3aGljaCBpdAorCQkgKiBvcmlnaW5hdGVkICovCisJCXJldCA9IHJ4cnBjX3BlZXJfbG9va3VwKHRyYW5zLCBhZGRyLCAmcGVlcik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlrZGVidWcoIlJ4IE5vIGNvbm5lY3Rpb25zIGZyb20gdGhhdCBwZWVyIik7CisJCQlyeHJwY190cmFuc19pbW1lZGlhdGVfYWJvcnQodHJhbnMsIG1zZywgLUVJTlZBTCk7CisJCQlnb3RvIGZpbmlzaGVkX21zZzsKKwkJfQorCisJCS8qIHRyeSBhbmQgZmluZCBhIG1hdGNoaW5nIGNvbm5lY3Rpb24gKi8KKwkJcmV0ID0gcnhycGNfY29ubmVjdGlvbl9sb29rdXAocGVlciwgbXNnLCAmbXNnLT5jb25uKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWtkZWJ1ZygiUnggVW5rbm93biBDb25uZWN0aW9uIik7CisJCQlyeHJwY190cmFuc19pbW1lZGlhdGVfYWJvcnQodHJhbnMsIG1zZywgLUVJTlZBTCk7CisJCQlyeHJwY19wdXRfcGVlcihwZWVyKTsKKwkJCWdvdG8gZmluaXNoZWRfbXNnOworCQl9CisJCXJ4cnBjX3B1dF9wZWVyKHBlZXIpOworCisJCS8qIGRlYWwgd2l0aCB0aGUgZmlyc3QgcGFja2V0IG9mIGEgbmV3IGNhbGwgKi8KKwkJaWYgKG1zZy0+aGRyLmZsYWdzICYgUlhSUENfQ0xJRU5UX0lOSVRJQVRFRCAmJgorCQkgICAgbXNnLT5oZHIudHlwZSA9PSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBICYmCisJCSAgICBudG9obChtc2ctPmhkci5zZXEpID09IDEKKwkJICAgICkgeworCQkJX2RlYnVnKCJSeCBOZXcgc2VydmVyIGNhbGwiKTsKKwkJCXJ4cnBjX3RyYW5zX3JlY2VpdmVfbmV3X2NhbGwodHJhbnMsICZtc2dxKTsKKwkJCWdvdG8gZmluaXNoZWRfbXNnOworCQl9CisKKwkJLyogZGVhbCB3aXRoIHN1YnNlcXVlbnQgcGFja2V0KHMpIG9mIGNhbGwgKi8KKwkJX2RlYnVnKCJSeCBDYWxsIHBhY2tldCIpOworCQl3aGlsZSAoIWxpc3RfZW1wdHkoJm1zZ3EpKSB7CisJCQltc2cgPSBsaXN0X2VudHJ5KG1zZ3EubmV4dCwgc3RydWN0IHJ4cnBjX21lc3NhZ2UsIGxpbmspOworCQkJbGlzdF9kZWxfaW5pdCgmbXNnLT5saW5rKTsKKworCQkJcmV0ID0gcnhycGNfY29ubl9yZWNlaXZlX2NhbGxfcGFja2V0KG1zZy0+Y29ubiwgTlVMTCwgbXNnKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJcnhycGNfdHJhbnNfaW1tZWRpYXRlX2Fib3J0KHRyYW5zLCBtc2csIHJldCk7CisJCQkJcnhycGNfcHV0X21lc3NhZ2UobXNnKTsKKwkJCQlnb3RvIGZpbmlzaGVkX21zZzsKKwkJCX0KKworCQkJcnhycGNfcHV0X21lc3NhZ2UobXNnKTsKKwkJfQorCisJCWdvdG8gZmluaXNoZWRfbXNnOworCisJCS8qIGRpc3Bvc2Ugb2YgdGhlIHBhY2tldHMgKi8KKwlmaW5pc2hlZF9tc2c6CisJCXdoaWxlICghbGlzdF9lbXB0eSgmbXNncSkpIHsKKwkJCW1zZyA9IGxpc3RfZW50cnkobXNncS5uZXh0LCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7CisJCQlsaXN0X2RlbF9pbml0KCZtc2ctPmxpbmspOworCisJCQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOworCQl9CisJCWtmcmVlX3NrYihwa3QpOworCX0KKworCV9sZWF2ZSgiIik7CisKK30gLyogZW5kIHJ4cnBjX3RyYW5zX3JlY2VpdmVfcGFja2V0KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGFjY2VwdCBhIG5ldyBjYWxsIGZyb20gYSBjbGllbnQgdHJ5aW5nIHRvIGNvbm5lY3QgdG8gb25lIG9mIG15IHNlcnZpY2VzCisgKiAtIGNhbGxlZCBpbiBwcm9jZXNzIGNvbnRleHQKKyAqLworc3RhdGljIGludCByeHJwY190cmFuc19yZWNlaXZlX25ld19jYWxsKHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zLAorCQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICptc2dxKQoreworCXN0cnVjdCByeHJwY19tZXNzYWdlICptc2c7CisKKwlfZW50ZXIoIiIpOworCisJLyogb25seSBib3RoZXIgd2l0aCB0aGUgZmlyc3QgcGFja2V0ICovCisJbXNnID0gbGlzdF9lbnRyeShtc2dxLT5uZXh0LCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7CisJbGlzdF9kZWxfaW5pdCgmbXNnLT5saW5rKTsKKwlyeHJwY19rcnhzZWNkX3F1ZXVlX2luY29taW5nX2NhbGwobXNnKTsKKwlyeHJwY19wdXRfbWVzc2FnZShtc2cpOworCisJX2xlYXZlKCIgPSAwIik7CisKKwlyZXR1cm4gMDsKK30gLyogZW5kIHJ4cnBjX3RyYW5zX3JlY2VpdmVfbmV3X2NhbGwoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogcGVyZm9ybSBhbiBpbW1lZGlhdGUgYWJvcnQgd2l0aG91dCBjb25uZWN0aW9uIG9yIGNhbGwgc3RydWN0dXJlcworICovCitpbnQgcnhycGNfdHJhbnNfaW1tZWRpYXRlX2Fib3J0KHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zLAorCQkJCXN0cnVjdCByeHJwY19tZXNzYWdlICptc2csCisJCQkJaW50IGVycm9yKQoreworCXN0cnVjdCByeHJwY19oZWFkZXIgYWhkcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCXN0cnVjdCBtc2doZHIgbXNnaGRyOworCXN0cnVjdCBrdmVjIGlvdlsyXTsKKwlfX2JlMzIgX2Vycm9yOworCWludCBsZW4sIHJldDsKKworCV9lbnRlcigiJXAsJXAsJWQiLCB0cmFucywgbXNnLCBlcnJvcik7CisKKwkvKiBkb24ndCBhYm9ydCBhbiBhYm9ydCBwYWNrZXQgKi8KKwlpZiAobXNnLT5oZHIudHlwZSA9PSBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVCkgeworCQlfbGVhdmUoIiA9IDAiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJX2Vycm9yID0gaHRvbmwoLWVycm9yKTsKKworCS8qIHNldCB1cCB0aGUgbWVzc2FnZSB0byBiZSB0cmFuc21pdHRlZCAqLworCW1lbWNweSgmYWhkciwgJm1zZy0+aGRyLCBzaXplb2YoYWhkcikpOworCWFoZHIuZXBvY2gJPSBtc2ctPmhkci5lcG9jaDsKKwlhaGRyLnNlcmlhbAk9IGh0b25sKDEpOworCWFoZHIuc2VxCT0gMDsKKwlhaGRyLnR5cGUJPSBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVDsKKwlhaGRyLmZsYWdzCT0gUlhSUENfTEFTVF9QQUNLRVQ7CisJYWhkci5mbGFncwl8PSB+bXNnLT5oZHIuZmxhZ3MgJiBSWFJQQ19DTElFTlRfSU5JVElBVEVEOworCisJaW92WzBdLmlvdl9sZW4JPSBzaXplb2YoYWhkcik7CisJaW92WzBdLmlvdl9iYXNlCT0gJmFoZHI7CisJaW92WzFdLmlvdl9sZW4JPSBzaXplb2YoX2Vycm9yKTsKKwlpb3ZbMV0uaW92X2Jhc2UJPSAmX2Vycm9yOworCisJbGVuID0gc2l6ZW9mKGFoZHIpICsgc2l6ZW9mKF9lcnJvcik7CisKKwltZW1zZXQoJnNpbiwwLHNpemVvZihzaW4pKTsKKwlzaW4uc2luX2ZhbWlseQkJPSBBRl9JTkVUOworCXNpbi5zaW5fcG9ydAkJPSBtc2ctPnBrdC0+aC51aC0+c291cmNlOworCXNpbi5zaW5fYWRkci5zX2FkZHIJPSBtc2ctPnBrdC0+bmguaXBoLT5zYWRkcjsKKworCW1zZ2hkci5tc2dfbmFtZQkJPSAmc2luOworCW1zZ2hkci5tc2dfbmFtZWxlbgk9IHNpemVvZihzaW4pOworCW1zZ2hkci5tc2dfY29udHJvbAk9IE5VTEw7CisJbXNnaGRyLm1zZ19jb250cm9sbGVuCT0gMDsKKwltc2doZHIubXNnX2ZsYWdzCT0gTVNHX0RPTlRXQUlUOworCisJX25ldCgiU2VuZGluZyBtZXNzYWdlIHR5cGUgJWQgb2YgJWQgYnl0ZXMgdG8gJTA4eDolZCIsCisJICAgICBhaGRyLnR5cGUsCisJICAgICBsZW4sCisJICAgICBudG9obChzaW4uc2luX2FkZHIuc19hZGRyKSwKKwkgICAgIG50b2hzKHNpbi5zaW5fcG9ydCkpOworCisJLyogc2VuZCB0aGUgbWVzc2FnZSAqLworCXJldCA9IGtlcm5lbF9zZW5kbXNnKHRyYW5zLT5zb2NrZXQsICZtc2doZHIsIGlvdiwgMiwgbGVuKTsKKworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9IC8qIGVuZCByeHJwY190cmFuc19pbW1lZGlhdGVfYWJvcnQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogcmVjZWl2ZSBhbiBJQ01QIGVycm9yIHJlcG9ydCBhbmQgcGVyY29sYXRlIGl0IHRvIGFsbCBjb25uZWN0aW9ucworICogaGVhZGluZyB0byB0aGUgYWZmZWN0ZWQgaG9zdCBvciBwb3J0CisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX3RyYW5zX3JlY2VpdmVfZXJyb3JfcmVwb3J0KHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zKQoreworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisJc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXI7CisJc3RydWN0IGxpc3RfaGVhZCBjb25ucSwgKl9wOworCXN0cnVjdCBlcnJvcm1zZyBlbXNnOworCXN0cnVjdCBtc2doZHIgbXNnOworCV9fYmUxNiBwb3J0OworCWludCBsb2NhbCwgZXJyOworCisJX2VudGVyKCIlcCIsIHRyYW5zKTsKKworCWZvciAoOzspIHsKKwkJdHJhbnMtPmVycm9yX3JjdmQgPSAwOworCisJCS8qIHRyeSBhbmQgcmVjZWl2ZSBhbiBlcnJvciBtZXNzYWdlICovCisJCW1zZy5tc2dfbmFtZQk9ICZzaW47CisJCW1zZy5tc2dfbmFtZWxlbgk9IHNpemVvZihzaW4pOworCQltc2cubXNnX2NvbnRyb2wJPSAmZW1zZzsKKwkJbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGVtc2cpOworCQltc2cubXNnX2ZsYWdzCT0gMDsKKworCQllcnIgPSBrZXJuZWxfcmVjdm1zZyh0cmFucy0+c29ja2V0LCAmbXNnLCBOVUxMLCAwLCAwLAorCQkJCSAgIE1TR19FUlJRVUVVRSB8IE1TR19ET05UV0FJVCB8IE1TR19UUlVOQyk7CisKKwkJaWYgKGVyciA9PSAtRUFHQUlOKSB7CisJCQlfbGVhdmUoIiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKGVyciA8IDApIHsKKwkJCXByaW50aygiJXM6IHVuYWJsZSB0byByZWN2IGFuIGVycm9yIHJlcG9ydDogJWRcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLCBlcnIpOworCQkJX2xlYXZlKCIiKTsKKwkJCXJldHVybjsKKwkJfQorCisJCW1zZy5tc2dfY29udHJvbGxlbiA9IChjaGFyICopIG1zZy5tc2dfY29udHJvbCAtIChjaGFyICopICZlbXNnOworCisJCWlmIChtc2cubXNnX2NvbnRyb2xsZW4gPCBzaXplb2YoZW1zZy5jbXNnKSB8fAorCQkgICAgbXNnLm1zZ19uYW1lbGVuIDwgc2l6ZW9mKHNpbikpIHsKKwkJCXByaW50aygiJXM6IHNob3J0IGNvbnRyb2wgbWVzc2FnZSIKKwkJCSAgICAgICAiIChubGVuPSV1IGNsZW49JVp1IGZsPSV4KVxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sCisJCQkgICAgICAgbXNnLm1zZ19uYW1lbGVuLAorCQkJICAgICAgIG1zZy5tc2dfY29udHJvbGxlbiwKKwkJCSAgICAgICBtc2cubXNnX2ZsYWdzKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJX25ldCgiUnggUmVjZWl2ZWQgY29udHJvbCBtZXNzYWdlIgorCQkgICAgICIgeyBsZW49JVp1IGxldmVsPSV1IHR5cGU9JXUgfSIsCisJCSAgICAgZW1zZy5jbXNnLmNtc2dfbGVuLAorCQkgICAgIGVtc2cuY21zZy5jbXNnX2xldmVsLAorCQkgICAgIGVtc2cuY21zZy5jbXNnX3R5cGUpOworCisJCWlmIChzaW4uc2luX2ZhbWlseSAhPSBBRl9JTkVUKSB7CisJCQlwcmludGsoIlJ4IElnbm9yaW5nIGVycm9yIHJlcG9ydCB3aXRoIG5vbi1JTkVUIGFkZHJlc3MiCisJCQkgICAgICAgIiAoZmFtPSV1KSIsCisJCQkgICAgICAgc2luLnNpbl9mYW1pbHkpOworCQkJY29udGludWU7CisJCX0KKworCQlfbmV0KCJSeCBSZWNlaXZlZCBtZXNzYWdlIHBlcnRhaW5pbmcgdG8gaG9zdCBhZGRyPSV4IHBvcnQ9JWh1IiwKKwkJICAgICBudG9obChzaW4uc2luX2FkZHIuc19hZGRyKSwgbnRvaHMoc2luLnNpbl9wb3J0KSk7CisKKwkJaWYgKGVtc2cuY21zZy5jbXNnX2xldmVsICE9IFNPTF9JUCB8fAorCQkgICAgZW1zZy5jbXNnLmNtc2dfdHlwZSAhPSBJUF9SRUNWRVJSKSB7CisJCQlwcmludGsoIlJ4IElnbm9yaW5nIHVua25vd24gZXJyb3IgcmVwb3J0IgorCQkJICAgICAgICIgeyBsZXZlbD0ldSB0eXBlPSV1IH0iLAorCQkJICAgICAgIGVtc2cuY21zZy5jbXNnX2xldmVsLAorCQkJICAgICAgIGVtc2cuY21zZy5jbXNnX3R5cGUpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobXNnLm1zZ19jb250cm9sbGVuIDwgc2l6ZW9mKGVtc2cuY21zZykgKyBzaXplb2YoZW1zZy5lZSkpIHsKKwkJCXByaW50aygiJXM6IHNob3J0IGVycm9yIG1lc3NhZ2UgKCVadSlcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLCBtc2cubXNnX2NvbnRyb2xsZW4pOworCQkJX2xlYXZlKCIiKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXBvcnQgPSBzaW4uc2luX3BvcnQ7CisKKwkJc3dpdGNoIChlbXNnLmVlLmVlX29yaWdpbikgeworCQljYXNlIFNPX0VFX09SSUdJTl9JQ01QOgorCQkJbG9jYWwgPSAwOworCQkJc3dpdGNoIChlbXNnLmVlLmVlX3R5cGUpIHsKKwkJCWNhc2UgSUNNUF9ERVNUX1VOUkVBQ0g6CisJCQkJc3dpdGNoIChlbXNnLmVlLmVlX2NvZGUpIHsKKwkJCQljYXNlIElDTVBfTkVUX1VOUkVBQ0g6CisJCQkJCV9uZXQoIlJ4IFJlY2VpdmVkIElDTVAgTmV0d29yayBVbnJlYWNoYWJsZSIpOworCQkJCQlwb3J0ID0gMDsKKwkJCQkJZXJyID0gLUVORVRVTlJFQUNIOworCQkJCQlicmVhazsKKwkJCQljYXNlIElDTVBfSE9TVF9VTlJFQUNIOgorCQkJCQlfbmV0KCJSeCBSZWNlaXZlZCBJQ01QIEhvc3QgVW5yZWFjaGFibGUiKTsKKwkJCQkJcG9ydCA9IDA7CisJCQkJCWVyciA9IC1FSE9TVFVOUkVBQ0g7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUNNUF9QT1JUX1VOUkVBQ0g6CisJCQkJCV9uZXQoIlJ4IFJlY2VpdmVkIElDTVAgUG9ydCBVbnJlYWNoYWJsZSIpOworCQkJCQllcnIgPSAtRUNPTk5SRUZVU0VEOworCQkJCQlicmVhazsKKwkJCQljYXNlIElDTVBfTkVUX1VOS05PV046CisJCQkJCV9uZXQoIlJ4IFJlY2VpdmVkIElDTVAgVW5rbm93biBOZXR3b3JrIik7CisJCQkJCXBvcnQgPSAwOworCQkJCQllcnIgPSAtRU5FVFVOUkVBQ0g7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUNNUF9IT1NUX1VOS05PV046CisJCQkJCV9uZXQoIlJ4IFJlY2VpdmVkIElDTVAgVW5rbm93biBIb3N0Iik7CisJCQkJCXBvcnQgPSAwOworCQkJCQllcnIgPSAtRUhPU1RVTlJFQUNIOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlfbmV0KCJSeCBSZWNlaXZlZCBJQ01QIERlc3RVbnJlYWNoIHsgY29kZT0ldSB9IiwKKwkJCQkJICAgICBlbXNnLmVlLmVlX2NvZGUpOworCQkJCQllcnIgPSBlbXNnLmVlLmVlX2Vycm5vOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSUNNUF9USU1FX0VYQ0VFREVEOgorCQkJCV9uZXQoIlJ4IFJlY2VpdmVkIElDTVAgVFRMIEV4Y2VlZGVkIik7CisJCQkJZXJyID0gZW1zZy5lZS5lZV9lcnJubzsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlfcHJvdG8oIlJ4IFJlY2VpdmVkIElDTVAgZXJyb3IgeyB0eXBlPSV1IGNvZGU9JXUgfSIsCisJCQkJICAgICAgIGVtc2cuZWUuZWVfdHlwZSwgZW1zZy5lZS5lZV9jb2RlKTsKKwkJCQllcnIgPSBlbXNnLmVlLmVlX2Vycm5vOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTT19FRV9PUklHSU5fTE9DQUw6CisJCQlfcHJvdG8oIlJ4IFJlY2VpdmVkIGxvY2FsIGVycm9yIHsgZXJyb3I9JWQgfSIsCisJCQkgICAgICAgZW1zZy5lZS5lZV9lcnJubyk7CisJCQlsb2NhbCA9IDE7CisJCQllcnIgPSBlbXNnLmVlLmVlX2Vycm5vOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT19FRV9PUklHSU5fTk9ORToKKwkJY2FzZSBTT19FRV9PUklHSU5fSUNNUDY6CisJCWRlZmF1bHQ6CisJCQlfcHJvdG8oIlJ4IFJlY2VpdmVkIGVycm9yIHJlcG9ydCB7IG9yaWc9JXUgfSIsCisJCQkgICAgICAgZW1zZy5lZS5lZV9vcmlnaW4pOworCQkJbG9jYWwgPSAwOworCQkJZXJyID0gZW1zZy5lZS5lZV9lcnJubzsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogZmluZCBhbGwgdGhlIGNvbm5lY3Rpb25zIGJldHdlZW4gdGhpcyB0cmFuc3BvcnQgYW5kIHRoZQorCQkgKiBhZmZlY3RlZCBkZXN0aW5hdGlvbiAqLworCQlJTklUX0xJU1RfSEVBRCgmY29ubnEpOworCisJCWlmIChyeHJwY19wZWVyX2xvb2t1cCh0cmFucywgc2luLnNpbl9hZGRyLnNfYWRkciwKKwkJCQkgICAgICAmcGVlcikgPT0gMCkgeworCQkJcmVhZF9sb2NrKCZwZWVyLT5jb25uX2xvY2spOworCQkJbGlzdF9mb3JfZWFjaChfcCwgJnBlZXItPmNvbm5fYWN0aXZlKSB7CisJCQkJY29ubiA9IGxpc3RfZW50cnkoX3AsIHN0cnVjdCByeHJwY19jb25uZWN0aW9uLAorCQkJCQkJICBsaW5rKTsKKwkJCQlpZiAocG9ydCAmJiBjb25uLT5hZGRyLnNpbl9wb3J0ICE9IHBvcnQpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICghbGlzdF9lbXB0eSgmY29ubi0+ZXJyX2xpbmspKQorCQkJCQljb250aW51ZTsKKworCQkJCXJ4cnBjX2dldF9jb25uZWN0aW9uKGNvbm4pOworCQkJCWxpc3RfYWRkX3RhaWwoJmNvbm4tPmVycl9saW5rLCAmY29ubnEpOworCQkJfQorCQkJcmVhZF91bmxvY2soJnBlZXItPmNvbm5fbG9jayk7CisKKwkJCS8qIHNlcnZpY2UgYWxsIHRob3NlIGNvbm5lY3Rpb25zICovCisJCQl3aGlsZSAoIWxpc3RfZW1wdHkoJmNvbm5xKSkgeworCQkJCWNvbm4gPSBsaXN0X2VudHJ5KGNvbm5xLm5leHQsCisJCQkJCQkgIHN0cnVjdCByeHJwY19jb25uZWN0aW9uLAorCQkJCQkJICBlcnJfbGluayk7CisJCQkJbGlzdF9kZWwoJmNvbm4tPmVycl9saW5rKTsKKworCQkJCXJ4cnBjX2Nvbm5faGFuZGxlX2Vycm9yKGNvbm4sIGxvY2FsLCBlcnIpOworCisJCQkJcnhycGNfcHV0X2Nvbm5lY3Rpb24oY29ubik7CisJCQl9CisKKwkJCXJ4cnBjX3B1dF9wZWVyKHBlZXIpOworCQl9CisJfQorCisJX2xlYXZlKCIiKTsKKwlyZXR1cm47Cit9IC8qIGVuZCByeHJwY190cmFuc19yZWNlaXZlX2Vycm9yX3JlcG9ydCgpICovCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvS2NvbmZpZyBiL25ldC9zY2hlZC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMWQ5MDIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2NoZWQvS2NvbmZpZwpAQCAtMCwwICsxLDUwOCBAQAorIworIyBUcmFmZmljIGNvbnRyb2wgY29uZmlndXJhdGlvbi4KKyMgCitjaG9pY2UKKwlwcm9tcHQgIlBhY2tldCBzY2hlZHVsZXIgY2xvY2sgc291cmNlIgorCWRlcGVuZHMgb24gTkVUX1NDSEVECisJZGVmYXVsdCBORVRfU0NIX0NMS19KSUZGSUVTCisJaGVscAorCSAgUGFja2V0IHNjaGVkdWxlcnMgbmVlZCBhIG1vbm90b25pYyBjbG9jayB0aGF0IGluY3JlbWVudHMgYXQgYSBzdGF0aWMKKwkgIHJhdGUuIFRoZSBrZXJuZWwgcHJvdmlkZXMgc2V2ZXJhbCBzdWl0YWJsZSBpbnRlcmZhY2VzLCBlYWNoIHdpdGgKKwkgIGRpZmZlcmVudCBwcm9wZXJ0aWVzOgorCSAgCisJICAtIGhpZ2ggcmVzb2x1dGlvbiAodXMgb3IgYmV0dGVyKQorCSAgLSBmYXN0IHRvIHJlYWQgKG1pbmltYWwgbG9ja2luZywgbm8gaS9vIGFjY2VzcykKKwkgIC0gc3luY2hyb25pemVkIG9uIGFsbCBwcm9jZXNzb3JzCisJICAtIGhhbmRsZXMgY3B1IGNsb2NrIGZyZXF1ZW5jeSBjaGFuZ2VzCisKKwkgIGJ1dCBub3RoaW5nIHByb3ZpZGVzIGFsbCBvZiB0aGUgYWJvdmUuCisKK2NvbmZpZyBORVRfU0NIX0NMS19KSUZGSUVTCisJYm9vbCAiVGltZXIgaW50ZXJydXB0IgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSB0aW1lciBpbnRlcnJ1cHQgKGppZmZpZXMpIGFzIGNsb2NrCisJICBzb3VyY2UuIFRoaXMgY2xvY2sgc291cmNlIGlzIGZhc3QsIHN5bmNocm9uaXplZCBvbiBhbGwgcHJvY2Vzc29ycyBhbmQKKwkgIGhhbmRsZXMgY3B1IGNsb2NrIGZyZXF1ZW5jeSBjaGFuZ2VzLCBidXQgaXRzIHJlc29sdXRpb24gaXMgdG9vIGxvdworCSAgZm9yIGFjY3VyYXRlIHNoYXBpbmcgZXhjZXB0IGF0IHZlcnkgbG93IHNwZWVkLgorCitjb25maWcgTkVUX1NDSF9DTEtfR0VUVElNRU9GREFZCisJYm9vbCAiZ2V0dGltZW9mZGF5IgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGdldHRpbWVvZmRheSBhcyBjbG9jayBzb3VyY2UuIFRoaXMgY2xvY2sKKwkgIHNvdXJjZSBoYXMgaGlnaCByZXNvbHV0aW9uLCBpcyBzeW5jaHJvbml6ZWQgb24gYWxsIHByb2Nlc3NvcnMgYW5kCisJICBoYW5kbGVzIGNwdSBjbG9jayBmcmVxdWVuY3kgY2hhbmdlcywgYnV0IGl0IGlzIHNsb3cuCisKKwkgIENob29zZSB0aGlzIGlmIHlvdSBuZWVkIGEgaGlnaCByZXNvbHV0aW9uIGNsb2NrIHNvdXJjZSBidXQgY2FuJ3QgdXNlCisJICB0aGUgQ1BVJ3MgY3ljbGUgY291bnRlci4KKworY29uZmlnIE5FVF9TQ0hfQ0xLX0NQVQorCWJvb2wgIkNQVSBjeWNsZSBjb3VudGVyIgorCWRlcGVuZHMgb24gWDg2X1RTQyB8fCBYODZfNjQgfHwgQUxQSEEgfHwgU1BBUkM2NCB8fCBQUEM2NCB8fCBJQTY0CisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIENQVSdzIGN5Y2xlIGNvdW50ZXIgYXMgY2xvY2sgc291cmNlLgorCSAgVGhpcyBpcyBhIGNoZWFwIGFuZCBoaWdoIHJlc29sdXRpb24gY2xvY2sgc291cmNlLCBidXQgb24gc29tZQorCSAgYXJjaGl0ZWN0dXJlcyBpdCBpcyBub3Qgc3luY2hyb25pemVkIG9uIGFsbCBwcm9jZXNzb3JzIGFuZCBkb2Vzbid0CisJICBoYW5kbGUgY3B1IGNsb2NrIGZyZXF1ZW5jeSBjaGFuZ2VzLgorCisJICBUaGUgdXNlYWJsZSBjeWNsZSBjb3VudGVycyBhcmU6CisKKwkgIAl4ODYveDg2XzY0CS0gVGltZXN0YW1wIENvdW50ZXIKKwkJYWxwaGEJCS0gQ3ljbGUgQ291bnRlcgorCQlzcGFyYzY0CQktICV0aWNrcyByZWdpc3RlcgorCQlwcGM2NAkJLSBUaW1lIGJhc2UKKwkJaWE2NAkJLSBJbnRlcnZhbCBUaW1lIENvdW50ZXIKKworCSAgQ2hvb3NlIHRoaXMgaWYgeW91ciBDUFUncyBjeWNsZSBjb3VudGVyIGlzIHdvcmtpbmcgcHJvcGVybHkuCisKK2VuZGNob2ljZQorCitjb25maWcgTkVUX1NDSF9DQlEKKwl0cmlzdGF0ZSAiQ0JRIHBhY2tldCBzY2hlZHVsZXIiCisJZGVwZW5kcyBvbiBORVRfU0NIRUQKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgQ2xhc3MtQmFzZWQgUXVldWVpbmcgKENCUSkgcGFja2V0CisJICBzY2hlZHVsaW5nIGFsZ29yaXRobSBmb3Igc29tZSBvZiB5b3VyIG5ldHdvcmsgZGV2aWNlcy4gIFRoaXMKKwkgIGFsZ29yaXRobSBjbGFzc2lmaWVzIHRoZSB3YWl0aW5nIHBhY2tldHMgaW50byBhIHRyZWUtbGlrZSBoaWVyYXJjaHkKKwkgIG9mIGNsYXNzZXM7IHRoZSBsZWF2ZXMgb2YgdGhpcyB0cmVlIGFyZSBpbiB0dXJuIHNjaGVkdWxlZCBieQorCSAgc2VwYXJhdGUgYWxnb3JpdGhtcyAoY2FsbGVkICJkaXNjaXBsaW5lcyIgaW4gdGhpcyBjb250ZXh0KS4KKworCSAgU2VlIHRoZSB0b3Agb2YgPGZpbGU6bmV0L3NjaGVkL3NjaF9jYnEuYz4gZm9yIHJlZmVyZW5jZXMgYWJvdXQgdGhlCisJICBDQlEgYWxnb3JpdGhtLgorCisJICBDQlEgaXMgYSBjb21tb25seSB1c2VkIHNjaGVkdWxlciwgc28gaWYgeW91J3JlIHVuc3VyZSwgeW91IHNob3VsZAorCSAgc2F5IFkgaGVyZS4gVGhlbiBzYXkgWSB0byBhbGwgdGhlIHF1ZXVlaW5nIGFsZ29yaXRobXMgYmVsb3cgdGhhdCB5b3UKKwkgIHdhbnQgdG8gdXNlIGFzIENCUSBkaXNjaXBsaW5lcy4gIFRoZW4gc2F5IFkgdG8gIlBhY2tldCBjbGFzc2lmaWVyCisJICBBUEkiIGFuZCBzYXkgWSB0byBhbGwgdGhlIGNsYXNzaWZpZXJzIHlvdSB3YW50IHRvIHVzZTsgYSBjbGFzc2lmaWVyCisJICBpcyBhIHJvdXRpbmUgdGhhdCBhbGxvd3MgeW91IHRvIHNvcnQgeW91ciBvdXRnb2luZyB0cmFmZmljIGludG8KKwkgIGNsYXNzZXMgYmFzZWQgb24gYSBjZXJ0YWluIGNyaXRlcmlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNjaF9jYnEuCisKK2NvbmZpZyBORVRfU0NIX0hUQgorCXRyaXN0YXRlICJIVEIgcGFja2V0IHNjaGVkdWxlciIKKwlkZXBlbmRzIG9uIE5FVF9TQ0hFRAorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBIaWVyYXJjaGljYWwgVG9rZW4gQnVja2V0cyAoSFRCKQorCSAgcGFja2V0IHNjaGVkdWxpbmcgYWxnb3JpdGhtIGZvciBzb21lIG9mIHlvdXIgbmV0d29yayBkZXZpY2VzLiBTZWUKKwkgIDxodHRwOi8vbHV4aWsuY2RpLmN6L35kZXZpay9xb3MvaHRiLz4gZm9yIGNvbXBsZXRlIG1hbnVhbCBhbmQKKwkgIGluLWRlcHRoIGFydGljbGVzLgorCisJICBIVEIgaXMgdmVyeSBzaW1pbGFyIHRvIHRoZSBDQlEgcmVnYXJkaW5nIGl0cyBnb2FscyBob3dldmVyIGlzIGhhcyAKKwkgIGRpZmZlcmVudCBwcm9wZXJ0aWVzIGFuZCBkaWZmZXJlbnQgYWxnb3JpdGhtLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2NoX2h0Yi4KKworY29uZmlnIE5FVF9TQ0hfSEZTQworCXRyaXN0YXRlICJIRlNDIHBhY2tldCBzY2hlZHVsZXIiCisJZGVwZW5kcyBvbiBORVRfU0NIRUQKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgSGllcmFyY2hpY2FsIEZhaXIgU2VydmljZSBDdXJ2ZQorCSAgKEhGU0MpIHBhY2tldCBzY2hlZHVsaW5nIGFsZ29yaXRobSBmb3Igc29tZSBvZiB5b3VyIG5ldHdvcmsgZGV2aWNlcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNjaF9oZnNjLgorCisjdHJpc3RhdGUgJyAgSC1QRlEgcGFja2V0IHNjaGVkdWxlcicgQ09ORklHX05FVF9TQ0hfSFBGUQorY29uZmlnIE5FVF9TQ0hfQVRNCisJdHJpc3RhdGUgIkFUTSBwc2V1ZG8tc2NoZWR1bGVyIgorCWRlcGVuZHMgb24gTkVUX1NDSEVEICYmIEFUTQorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBBVE0gcHNldWRvLXNjaGVkdWxlci4gIFRoaXMKKwkgIHByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciBpbnZva2luZyBjbGFzc2lmaWVycyAoYWthICJmaWx0ZXJzIiksIHdoaWNoCisJICBpbiB0dXJuIHNlbGVjdCBjbGFzc2VzIG9mIHRoaXMgcXVldWluZyBkaXNjaXBsaW5lLiAgRWFjaCBjbGFzcyBtYXBzCisJICB0aGUgZmxvdyhzKSBpdCBpcyBoYW5kbGluZyB0byBhIGdpdmVuIHZpcnR1YWwgY2lyY3VpdCAoc2VlIHRoZSB0b3Agb2YKKwkgIDxmaWxlOm5ldC9zY2hlZC9zY2hfYXRtLmM+KS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNjaF9hdG0uCisKK2NvbmZpZyBORVRfU0NIX1BSSU8KKwl0cmlzdGF0ZSAiVGhlIHNpbXBsZXN0IFBSSU8gcHNldWRvc2NoZWR1bGVyIgorCWRlcGVuZHMgb24gTkVUX1NDSEVECisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYW4gbi1iYW5kIHByaW9yaXR5IHF1ZXVlIHBhY2tldAorCSAgInNjaGVkdWxlciIgZm9yIHNvbWUgb2YgeW91ciBuZXR3b3JrIGRldmljZXMgb3IgYXMgYSBsZWFmIGRpc2NpcGxpbmUKKwkgIGZvciB0aGUgQ0JRIHNjaGVkdWxpbmcgYWxnb3JpdGhtLiBJZiB1bnN1cmUsIHNheSBZLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2NoX3ByaW8uCisKK2NvbmZpZyBORVRfU0NIX1JFRAorCXRyaXN0YXRlICJSRUQgcXVldWUiCisJZGVwZW5kcyBvbiBORVRfU0NIRUQKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgUmFuZG9tIEVhcmx5IERldGVjdGlvbiAoUkVEKQorCSAgcGFja2V0IHNjaGVkdWxpbmcgYWxnb3JpdGhtIGZvciBzb21lIG9mIHlvdXIgbmV0d29yayBkZXZpY2VzIChzZWUKKwkgIHRoZSB0b3Agb2YgPGZpbGU6bmV0L3NjaGVkL3NjaF9yZWQuYz4gZm9yIGRldGFpbHMgYW5kIHJlZmVyZW5jZXMKKwkgIGFib3V0IHRoZSBhbGdvcml0aG0pLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2NoX3JlZC4KKworY29uZmlnIE5FVF9TQ0hfU0ZRCisJdHJpc3RhdGUgIlNGUSBxdWV1ZSIKKwlkZXBlbmRzIG9uIE5FVF9TQ0hFRAorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBTdG9jaGFzdGljIEZhaXJuZXNzIFF1ZXVlaW5nIChTRlEpCisJICBwYWNrZXQgc2NoZWR1bGluZyBhbGdvcml0aG0gZm9yIHNvbWUgb2YgeW91ciBuZXR3b3JrIGRldmljZXMgb3IgYXMgYQorCSAgbGVhZiBkaXNjaXBsaW5lIGZvciB0aGUgQ0JRIHNjaGVkdWxpbmcgYWxnb3JpdGhtIChzZWUgdGhlIHRvcCBvZgorCSAgPGZpbGU6bmV0L3NjaGVkL3NjaF9zZnEuYz4gZm9yIGRldGFpbHMgYW5kIHJlZmVyZW5jZXMgYWJvdXQgdGhlIFNGUQorCSAgYWxnb3JpdGhtKS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNjaF9zZnEuCisKK2NvbmZpZyBORVRfU0NIX1RFUUwKKwl0cmlzdGF0ZSAiVEVRTCBxdWV1ZSIKKwlkZXBlbmRzIG9uIE5FVF9TQ0hFRAorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBUcnVlIExpbmsgRXF1YWxpemVyIChUTEUpIHBhY2tldAorCSAgc2NoZWR1bGluZyBhbGdvcml0aG0gZm9yIHNvbWUgb2YgeW91ciBuZXR3b3JrIGRldmljZXMgb3IgYXMgYSBsZWFmCisJICBkaXNjaXBsaW5lIGZvciB0aGUgQ0JRIHNjaGVkdWxpbmcgYWxnb3JpdGhtLiBUaGlzIHF1ZXVlaW5nCisJICBkaXNjaXBsaW5lIGFsbG93cyB0aGUgY29tYmluYXRpb24gb2Ygc2V2ZXJhbCBwaHlzaWNhbCBkZXZpY2VzIGludG8KKwkgIG9uZSB2aXJ0dWFsIGRldmljZS4gKHNlZSB0aGUgdG9wIG9mIDxmaWxlOm5ldC9zY2hlZC9zY2hfdGVxbC5jPiBmb3IKKwkgIGRldGFpbHMpLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2NoX3RlcWwuCisKK2NvbmZpZyBORVRfU0NIX1RCRgorCXRyaXN0YXRlICJUQkYgcXVldWUiCisJZGVwZW5kcyBvbiBORVRfU0NIRUQKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgU2ltcGxlIFRva2VuIEJ1Y2tldCBGaWx0ZXIgKFRCRikKKwkgIHBhY2tldCBzY2hlZHVsaW5nIGFsZ29yaXRobSBmb3Igc29tZSBvZiB5b3VyIG5ldHdvcmsgZGV2aWNlcyBvciBhcyBhCisJICBsZWFmIGRpc2NpcGxpbmUgZm9yIHRoZSBDQlEgc2NoZWR1bGluZyBhbGdvcml0aG0gKHNlZSB0aGUgdG9wIG9mCisJICA8ZmlsZTpuZXQvc2NoZWQvc2NoX3RiZi5jPiBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgVEJGIGFsZ29yaXRobSkuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzY2hfdGJmLgorCitjb25maWcgTkVUX1NDSF9HUkVECisJdHJpc3RhdGUgIkdSRUQgcXVldWUiCisJZGVwZW5kcyBvbiBORVRfU0NIRUQKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgR2VuZXJpYyBSYW5kb20gRWFybHkgRGV0ZWN0aW9uCisJICAoUkVEKSBwYWNrZXQgc2NoZWR1bGluZyBhbGdvcml0aG0gZm9yIHNvbWUgb2YgeW91ciBuZXR3b3JrIGRldmljZXMKKwkgIChzZWUgdGhlIHRvcCBvZiA8ZmlsZTpuZXQvc2NoZWQvc2NoX3JlZC5jPiBmb3IgZGV0YWlscyBhbmQKKwkgIHJlZmVyZW5jZXMgYWJvdXQgdGhlIGFsZ29yaXRobSkuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzY2hfZ3JlZC4KKworY29uZmlnIE5FVF9TQ0hfRFNNQVJLCisJdHJpc3RhdGUgIkRpZmZzZXJ2IGZpZWxkIG1hcmtlciIKKwlkZXBlbmRzIG9uIE5FVF9TQ0hFRAorCWhlbHAKKwkgIFNheSBZIGlmIHlvdSB3YW50IHRvIHNjaGVkdWxlIHBhY2tldHMgYWNjb3JkaW5nIHRvIHRoZQorCSAgRGlmZmVyZW50aWF0ZWQgU2VydmljZXMgYXJjaGl0ZWN0dXJlIHByb3Bvc2VkIGluIFJGQyAyNDc1LgorCSAgVGVjaG5pY2FsIGluZm9ybWF0aW9uIG9uIHRoaXMgbWV0aG9kLCB3aXRoIHBvaW50ZXJzIHRvIGFzc29jaWF0ZWQKKwkgIFJGQ3MsIGlzIGF2YWlsYWJsZSBhdCA8aHR0cDovL3d3dy5ndGEudWZyai5ici9kaWZmc2Vydi8+LgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2NoX2RzbWFyay4KKworY29uZmlnIE5FVF9TQ0hfTkVURU0KKwl0cmlzdGF0ZSAiTmV0d29yayBlbXVsYXRvciIKKwlkZXBlbmRzIG9uIE5FVF9TQ0hFRAorCWhlbHAKKwkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGVtdWxhdGUgbmV0d29yayBkZWxheSwgbG9zcywgYW5kIHBhY2tldAorCSAgcmUtb3JkZXJpbmcuIFRoaXMgaXMgb2Z0ZW4gdXNlZnVsIHRvIHNpbXVsYXRlIG5ldHdvcmtzIHdoZW4KKwkgIHRlc3RpbmcgYXBwbGljYXRpb25zIG9yIHByb3RvY29scy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc2NoX25ldGVtLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVUX1NDSF9JTkdSRVNTCisJdHJpc3RhdGUgIkluZ3Jlc3MgUWRpc2MiCisJZGVwZW5kcyBvbiBORVRfU0NIRUQgCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGJlIGFibGUgdG8gcG9saWNlIGluY29taW5nIGJhbmR3aWR0aAorCSAgYW5kIGRyb3AgcGFja2V0cyB3aGVuIHRoaXMgYmFuZHdpZHRoIGV4Y2VlZHMgeW91ciBkZXNpcmVkIHJhdGUuCisJICBJZiB1bnN1cmUsIHNheSBZLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2NoX2luZ3Jlc3MuCisKK2NvbmZpZyBORVRfUU9TCisJYm9vbCAiUW9TIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfU0NIRUQKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgUXVhbGl0eSBPZiBTZXJ2aWNlIHNjaGVkdWxpbmcKKwkgIGZlYXR1cmVzLCB3aGljaCBtZWFucyB0aGF0IHlvdSB3aWxsIGJlIGFibGUgdG8gcmVxdWVzdCBjZXJ0YWluCisJICByYXRlLW9mLWZsb3cgbGltaXRzIGZvciB5b3VyIG5ldHdvcmsgZGV2aWNlcy4KKworCSAgVGhpcyBRdWFsaXR5IG9mIFNlcnZpY2UgKFFvUykgc3VwcG9ydCB3aWxsIGVuYWJsZSB5b3UgdG8gdXNlCisJICBEaWZmZXJlbnRpYXRlZCBTZXJ2aWNlcyAoZGlmZnNlcnYpIGFuZCBSZXNvdXJjZSBSZXNlcnZhdGlvbiBQcm90b2NvbAorCSAgKFJTVlApIG9uIHlvdXIgTGludXggcm91dGVyIGlmIHlvdSBhbHNvIHNheSBZIHRvICJQYWNrZXQgY2xhc3NpZmllcgorCSAgQVBJIiBhbmQgdG8gc29tZSBjbGFzc2lmaWVycyBiZWxvdy4gRG9jdW1lbnRhdGlvbiBhbmQgc29mdHdhcmUgaXMgYXQKKwkgIDxodHRwOi8vZGlmZnNlcnYuc291cmNlZm9yZ2UubmV0Lz4uCisKKwkgIE5vdGUgdGhhdCB0aGUgYW5zd2VyIHRvIHRoaXMgcXVlc3Rpb24gd29uJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZQorCSAga2VybmVsOiBzYXlpbmcgTiB3aWxsIGp1c3QgY2F1c2UgdGhlIGNvbmZpZ3VyYXRvciB0byBza2lwIGFsbAorCSAgdGhlIHF1ZXN0aW9ucyBhYm91dCBRb1Mgc3VwcG9ydC4KKworY29uZmlnIE5FVF9FU1RJTUFUT1IKKwlib29sICJSYXRlIGVzdGltYXRvciIKKwlkZXBlbmRzIG9uIE5FVF9RT1MKKwloZWxwCisJICBJbiBvcmRlciBmb3IgUXVhbGl0eSBvZiBTZXJ2aWNlIHNjaGVkdWxpbmcgdG8gd29yaywgdGhlIGN1cnJlbnQKKwkgIHJhdGUtb2YtZmxvdyBmb3IgYSBuZXR3b3JrIGRldmljZSBoYXMgdG8gYmUgZXN0aW1hdGVkOyBpZiB5b3Ugc2F5IFkKKwkgIGhlcmUsIHRoZSBrZXJuZWwgd2lsbCBkbyBqdXN0IHRoYXQuCisKK2NvbmZpZyBORVRfQ0xTCisJYm9vbCAiUGFja2V0IGNsYXNzaWZpZXIgQVBJIgorCWRlcGVuZHMgb24gTkVUX1NDSEVECisJLS0taGVscC0tLQorCSAgVGhlIENCUSBzY2hlZHVsaW5nIGFsZ29yaXRobSByZXF1aXJlcyB0aGF0IG5ldHdvcmsgcGFja2V0cyB3aGljaCBhcmUKKwkgIHNjaGVkdWxlZCB0byBiZSBzZW50IG91dCBvdmVyIGEgbmV0d29yayBkZXZpY2UgYmUgY2xhc3NpZmllZAorCSAgYWNjb3JkaW5nIHRvIHNvbWUgY3JpdGVyaW9uLiBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgZ2V0IGEKKwkgIGNob2ljZSBvZiBzZXZlcmFsIGRpZmZlcmVudCBwYWNrZXQgY2xhc3NpZmllcnMgd2l0aCB0aGUgZm9sbG93aW5nCisJICBxdWVzdGlvbnMuCisKKwkgIFRoaXMgd2lsbCBlbmFibGUgeW91IHRvIHVzZSBEaWZmZXJlbnRpYXRlZCBTZXJ2aWNlcyAoZGlmZnNlcnYpIGFuZAorCSAgUmVzb3VyY2UgUmVzZXJ2YXRpb24gUHJvdG9jb2wgKFJTVlApIG9uIHlvdXIgTGludXggcm91dGVyLgorCSAgRG9jdW1lbnRhdGlvbiBhbmQgc29mdHdhcmUgaXMgYXQKKwkgIDxodHRwOi8vZGlmZnNlcnYuc291cmNlZm9yZ2UubmV0Lz4uCisKK2NvbmZpZyBORVRfQ0xTX0JBU0lDCisJdHJpc3RhdGUgIkJhc2ljIGNsYXNzaWZpZXIiCisJZGVwZW5kcyBvbiBORVRfQ0xTCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIGNsYXNzaWZ5IHBhY2tldHMgdXNpbmcKKwkgIG9ubHkgZXh0ZW5kZWQgbWF0Y2hlcyBhbmQgYWN0aW9ucy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGNsc19iYXNpYy4KKworY29uZmlnIE5FVF9DTFNfVENJTkRFWAorCXRyaXN0YXRlICJUQyBpbmRleCBjbGFzc2lmaWVyIgorCWRlcGVuZHMgb24gTkVUX0NMUworCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIGNsYXNzaWZ5IG91dGdvaW5nIHBhY2tldHMKKwkgIGFjY29yZGluZyB0byB0aGUgdGNfaW5kZXggZmllbGQgb2YgdGhlIHNrYi4gWW91IHdpbGwgd2FudCB0aGlzCisJICBmZWF0dXJlIGlmIHlvdSB3YW50IHRvIGltcGxlbWVudCBEaWZmZXJlbnRpYXRlZCBTZXJ2aWNlcyB1c2luZworCSAgc2NoX2RzbWFyay4gSWYgdW5zdXJlLCBzYXkgWS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGNsc190Y2luZGV4LgorCitjb25maWcgTkVUX0NMU19ST1VURTQKKwl0cmlzdGF0ZSAiUm91dGluZyB0YWJsZSBiYXNlZCBjbGFzc2lmaWVyIgorCWRlcGVuZHMgb24gTkVUX0NMUworCXNlbGVjdCBORVRfQ0xTX1JPVVRFCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGJlIGFibGUgdG8gY2xhc3NpZnkgb3V0Z29pbmcgcGFja2V0cworCSAgYWNjb3JkaW5nIHRvIHRoZSByb3V0ZSB0YWJsZSBlbnRyeSB0aGV5IG1hdGNoZWQuIElmIHVuc3VyZSwgc2F5IFkuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjbHNfcm91dGUuCisKK2NvbmZpZyBORVRfQ0xTX1JPVVRFCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgTkVUX0NMU19GVworCXRyaXN0YXRlICJGaXJld2FsbCBiYXNlZCBjbGFzc2lmaWVyIgorCWRlcGVuZHMgb24gTkVUX0NMUworCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIGNsYXNzaWZ5IG91dGdvaW5nIHBhY2tldHMKKwkgIGFjY29yZGluZyB0byBmaXJld2FsbCBjcml0ZXJpYSB5b3Ugc3BlY2lmaWVkLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY2xzX2Z3LgorCitjb25maWcgTkVUX0NMU19VMzIKKwl0cmlzdGF0ZSAiVTMyIGNsYXNzaWZpZXIiCisJZGVwZW5kcyBvbiBORVRfQ0xTCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGJlIGFibGUgdG8gY2xhc3NpZnkgb3V0Z29pbmcgcGFja2V0cworCSAgYWNjb3JkaW5nIHRvIHRoZWlyIGRlc3RpbmF0aW9uIGFkZHJlc3MuIElmIHVuc3VyZSwgc2F5IFkuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjbHNfdTMyLgorCitjb25maWcgQ0xTX1UzMl9QRVJGCisJYm9vbCAiVTMyIGNsYXNzaWZpZXIgcGVyZm9ybWFuY2UgY291bnRlcnMiCisJZGVwZW5kcyBvbiBORVRfQ0xTX1UzMgorCWhlbHAKKwkgIGdhdGhlcnMgc3RhdHMgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIHR1bmUgdTMyIGNsYXNzaWZpZXIgcGVyZm9ybWFuY2UuCisJICBSZXF1aXJlcyBhIG5ldyBpcHJvdXRlMgorCSAgWW91IE1VU1QgTk9UIHR1cm4gdGhpcyBvbiBpZiB5b3UgZG9udCBoYXZlIGFuIHVwZGF0ZSBpcHJvdXRlMi4KKworY29uZmlnIE5FVF9DTFNfSU5ECisJYm9vbCAiY2xhc3NpZnkgaW5wdXQgZGV2aWNlIChzbG93cyB0aGluZ3MgdTMyL2Z3KSAiCisJZGVwZW5kcyBvbiBORVRfQ0xTX1UzMiB8fCBORVRfQ0xTX0ZXCisJaGVscAorCSAgVGhpcyBvcHRpb24gd2lsbCBiZSBraWxsZWQgZXZlbnR1YWxseSB3aGVuIGEgCisgICAgICAgICAgbWV0YWRhdGEgYWN0aW9uIGFwcGVhcnMgYmVjYXVzZSBpdCBzbG93cyB0aGluZ3MgYSBsaXR0bGUKKyAgICAgICAgICBBdmFpbGFibGUgb25seSBmb3IgdTMyIGFuZCBmdyBjbGFzc2lmaWVycy4KKwkgIFJlcXVpcmVzIGEgbmV3IGlwcm91dGUyCisJICBZb3UgTVVTVCBOT1QgdHVybiB0aGlzIG9uIGlmIHlvdSBkb250IGhhdmUgYW4gdXBkYXRlIGlwcm91dGUyLgorCitjb25maWcgQ0xTX1UzMl9NQVJLCisJYm9vbCAiVXNlIG5mbWFyayBhcyBhIGtleSBpbiBVMzIgY2xhc3NpZmllciIKKwlkZXBlbmRzIG9uIE5FVF9DTFNfVTMyICYmIE5FVEZJTFRFUgorCWhlbHAKKwkgIFRoaXMgYWxsb3dzIHlvdSB0byBtYXRjaCBtYXJrIGluIGEgdTMyIGZpbHRlci4KKwkgIEV4YW1wbGU6CisJICB0YyBmaWx0ZXIgYWRkIGRldiBldGgwIHByb3RvY29sIGlwIHBhcmVudCAxOjAgcHJpbyA1IHUzMiBcCisJCW1hdGNoIG1hcmsgMHgwMDkwIDB4ZmZmZiBcCisJCW1hdGNoIGlwIGRzdCA0LjQuNC40IFwKKwkJZmxvd2lkIDE6OTAKKwkgIFlvdSBtdXN0IHVzZSBhIG5ldyBpcHJvdXRlMiB0byB1c2UgdGhpcyBmZWF0dXJlLgorCitjb25maWcgTkVUX0NMU19SU1ZQCisJdHJpc3RhdGUgIlNwZWNpYWwgUlNWUCBjbGFzc2lmaWVyIgorCWRlcGVuZHMgb24gTkVUX0NMUyAmJiBORVRfUU9TCisJLS0taGVscC0tLQorCSAgVGhlIFJlc291cmNlIFJlc2VydmF0aW9uIFByb3RvY29sIChSU1ZQKSBwZXJtaXRzIGVuZCBzeXN0ZW1zIHRvCisJICByZXF1ZXN0IGEgbWluaW11bSBhbmQgbWF4aW11bSBkYXRhIGZsb3cgcmF0ZSBmb3IgYSBjb25uZWN0aW9uOyB0aGlzCisJICBpcyBpbXBvcnRhbnQgZm9yIHJlYWwgdGltZSBkYXRhIHN1Y2ggYXMgc3RyZWFtaW5nIHNvdW5kIG9yIHZpZGVvLgorCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gY2xhc3NpZnkgb3V0Z29pbmcgcGFja2V0cyBiYXNlZAorCSAgb24gdGhlaXIgUlNWUCByZXF1ZXN0cy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGNsc19yc3ZwLgorCitjb25maWcgTkVUX0NMU19SU1ZQNgorCXRyaXN0YXRlICJTcGVjaWFsIFJTVlAgY2xhc3NpZmllciBmb3IgSVB2NiIKKwlkZXBlbmRzIG9uIE5FVF9DTFMgJiYgTkVUX1FPUworCS0tLWhlbHAtLS0KKwkgIFRoZSBSZXNvdXJjZSBSZXNlcnZhdGlvbiBQcm90b2NvbCAoUlNWUCkgcGVybWl0cyBlbmQgc3lzdGVtcyB0bworCSAgcmVxdWVzdCBhIG1pbmltdW0gYW5kIG1heGltdW0gZGF0YSBmbG93IHJhdGUgZm9yIGEgY29ubmVjdGlvbjsgdGhpcworCSAgaXMgaW1wb3J0YW50IGZvciByZWFsIHRpbWUgZGF0YSBzdWNoIGFzIHN0cmVhbWluZyBzb3VuZCBvciB2aWRlby4KKworCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIGNsYXNzaWZ5IG91dGdvaW5nIHBhY2tldHMgYmFzZWQKKwkgIG9uIHRoZWlyIFJTVlAgcmVxdWVzdHMgYW5kIHlvdSBhcmUgdXNpbmcgdGhlIG5ldyBJbnRlcm5ldCBQcm90b2NvbAorCSAgSVB2NiBhcyBvcHBvc2VkIHRvIHRoZSBvbGRlciBhbmQgbW9yZSBjb21tb24gSVB2NC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGNsc19yc3ZwNi4KKworY29uZmlnIE5FVF9FTUFUQ0gKKwlib29sICJFeHRlbmRlZCBNYXRjaGVzIgorCWRlcGVuZHMgb24gTkVUX0NMUworCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGV4dGVuZGVkIG1hdGNoZXMgb24gdG9wIG9mIGNsYXNzaWZpZXJzCisJICBhbmQgc2VsZWN0IHRoZSBleHRlbmRlZCBtYXRjaGVzIGJlbG93LgorCisJICBFeHRlbmRlZCBtYXRjaGVzIGFyZSBzbWFsbCBjbGFzc2lmaWNhdGlvbiBoZWxwZXJzIG5vdCB3b3J0aCB3cml0aW5nCisJICBhIHNlcGFyYXRlIGNsYXNzaWZpZXIuCisKKwkgIFlvdSBtdXN0IGhhdmUgYSByZWNlbnQgdmVyc2lvbiBvZiB0aGUgaXByb3V0ZTIgdG9vbHMgaW4gb3JkZXIgdG8gdXNlCisJICBleHRlbmRlZCBtYXRjaGVzLgorCitjb25maWcgTkVUX0VNQVRDSF9TVEFDSworCWludCAiU3RhY2sgc2l6ZSIKKwlkZXBlbmRzIG9uIE5FVF9FTUFUQ0gKKwlkZWZhdWx0ICIzMiIKKwktLS1oZWxwLS0tCisJICBTaXplIG9mIHRoZSBsb2NhbCBzdGFjayB2YXJpYWJsZSB1c2VkIHdoaWxlIGV2YWx1YXRpbmcgdGhlIHRyZWUgb2YKKwkgIGVtYXRjaGVzLiBMaW1pdHMgdGhlIGRlcHRoIG9mIHRoZSB0cmVlLCBpLmUuIHRoZSBudW1iZXIgb2YKKwkgIGVuY2Fwc3VsYXRlZCBwcmVjZWRlbmNlcy4gRXZlcnkgbGV2ZWwgcmVxdWlyZXMgNCBieXRlcyBvZiBhZGR0aW9uYWwKKwkgIHN0YWNrIHNwYWNlLgorCitjb25maWcgTkVUX0VNQVRDSF9DTVAKKwl0cmlzdGF0ZSAiU2ltcGxlIHBhY2tldCBkYXRhIGNvbXBhcmlzb24iCisJZGVwZW5kcyBvbiBORVRfRU1BVENICisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIGNsYXNzaWZ5IHBhY2tldHMgYmFzZWQgb24KKwkgIHNpbXBsZSBwYWNrZXQgZGF0YSBjb21wYXJpc29ucyBmb3IgOCwgMTYsIGFuZCAzMmJpdCB2YWx1ZXMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBlbV9jbXAuCisKK2NvbmZpZyBORVRfRU1BVENIX05CWVRFCisJdHJpc3RhdGUgIk11bHRpIGJ5dGUgY29tcGFyaXNvbiIKKwlkZXBlbmRzIG9uIE5FVF9FTUFUQ0gKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gY2xhc3NpZnkgcGFja2V0cyBiYXNlZCBvbgorCSAgbXVsdGlwbGUgYnl0ZSBjb21wYXJpc29ucyBtYWlubHkgdXNlZnVsIGZvciBJUHY2IGFkZHJlc3MgY29tcGFyaXNvbnMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBlbV9uYnl0ZS4KKworY29uZmlnIE5FVF9FTUFUQ0hfVTMyCisJdHJpc3RhdGUgIlUzMiBoYXNoaW5nIGtleSIKKwlkZXBlbmRzIG9uIE5FVF9FTUFUQ0gKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gY2xhc3NpZnkgcGFja2V0cyB1c2luZworCSAgdGhlIGZhbW91cyB1MzIga2V5IGluIGNvbWJpbmF0aW9uIHdpdGggbG9naWMgcmVsYXRpb25zLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZW1fdTMyLgorCitjb25maWcgTkVUX0VNQVRDSF9NRVRBCisJdHJpc3RhdGUgIk1ldGFkYXRhIgorCWRlcGVuZHMgb24gTkVUX0VNQVRDSAorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYmUgYWJsdCB0byBjbGFzc2lmeSBwYWNrZXRzIGJhc2VkIG9uCisJICBtZXRhZGF0YSBzdWNoIGFzIGxvYWQgYXZlcmFnZSwgbmV0ZmlsdGVyIGF0dHJpYnV0ZXMsIHNvY2tldAorCSAgYXR0cmlidXRlcyBhbmQgcm91dGluZyBkZWNpc2lvbnMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBlbV9tZXRhLgorCitjb25maWcgTkVUX0NMU19BQ1QKKwlib29sICJQYWNrZXQgQUNUSU9OIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIE5FVF9DTFMgJiYgTkVUX1FPUworCS0tLWhlbHAtLS0KKwlUaGlzIG9wdGlvbiByZXF1aXJlcyB5b3UgaGF2ZSBhIG5ldyBpcHJvdXRlMi4gSXQgZW5hYmxlcworCXRjIGV4dGVuc2lvbnMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCB0YyBjbGFzc2lmaWVycy4KKwkgIFlvdSBNVVNUIE5PVCB0dXJuIHRoaXMgb24gaWYgeW91IGRvbnQgaGF2ZSBhbiB1cGRhdGUgaXByb3V0ZTIuCisKK2NvbmZpZyBORVRfQUNUX1BPTElDRQorCXRyaXN0YXRlICJQb2xpY2luZyBBY3Rpb25zIgorICAgICAgICBkZXBlbmRzIG9uIE5FVF9DTFNfQUNUIAorICAgICAgICAtLS1oZWxwLS0tCisgICAgICAgIElmIHlvdSBhcmUgdXNpbmcgYSBuZXdlciBpcHJvdXRlMiBzZWxlY3QgdGhpcyBvbmUsIG90aGVyd2lzZSB1c2Ugb25lCisJYmVsb3cgdG8gc2VsZWN0IGEgcG9saWNlci4KKwkgIFlvdSBNVVNUIE5PVCB0dXJuIHRoaXMgb24gaWYgeW91IGRvbnQgaGF2ZSBhbiB1cGRhdGUgaXByb3V0ZTIuCisKK2NvbmZpZyBORVRfQUNUX0dBQ1QKKyAgICAgICAgdHJpc3RhdGUgImdlbmVyaWMgQWN0aW9ucyIKKyAgICAgICAgZGVwZW5kcyBvbiBORVRfQ0xTX0FDVAorICAgICAgICAtLS1oZWxwLS0tCisgICAgICAgIFlvdSBtdXN0IGhhdmUgbmV3IGlwcm91dGUyIHRvIHVzZSB0aGlzIGZlYXR1cmUuCisgICAgICAgIFRoaXMgYWRkcyBzaW1wbGUgZmlsdGVyaW5nIGFjdGlvbnMgbGlrZSBkcm9wLCBhY2NlcHQgZXRjLgorCitjb25maWcgR0FDVF9QUk9CCisgICAgICAgIGJvb2wgImdlbmVyaWMgQWN0aW9ucyBwcm9iYWJpbGl0eSIKKyAgICAgICAgZGVwZW5kcyBvbiBORVRfQUNUX0dBQ1QKKyAgICAgICAgLS0taGVscC0tLQorICAgICAgICBBbGxvd3MgZ2VuZXJpYyBhY3Rpb25zIHRvIGJlIHJhbmRvbWx5IG9yIGRldGVybWluaXN0aWNhbGx5IHVzZWQuCisKK2NvbmZpZyBORVRfQUNUX01JUlJFRAorICAgICAgICB0cmlzdGF0ZSAiUGFja2V0IEluL0VncmVzcyByZWRpcmVjdG9uL21pcnJvciBBY3Rpb25zIgorICAgICAgICBkZXBlbmRzIG9uIE5FVF9DTFNfQUNUCisgICAgICAgIC0tLWhlbHAtLS0KKyAgICAgICAgcmVxdWlyZXMgbmV3IGlwcm91dGUyCisgICAgICAgIFRoaXMgYWxsb3dzIHBhY2tldHMgdG8gYmUgbWlycm9yZWQgb3IgcmVkaXJlY3RlZCB0byBuZXRkZXZpY2VzCisKK2NvbmZpZyBORVRfQUNUX0lQVAorICAgICAgICB0cmlzdGF0ZSAiaXB0YWJsZXMgQWN0aW9ucyIKKyAgICAgICAgZGVwZW5kcyBvbiBORVRfQ0xTX0FDVCAmJiBORVRGSUxURVIgJiYgSVBfTkZfSVBUQUJMRVMKKyAgICAgICAgLS0taGVscC0tLQorICAgICAgICByZXF1aXJlcyBuZXcgaXByb3V0ZTIKKyAgICAgICAgVGhpcyBhbGxvd3MgaXB0YWJsZXMgdGFyZ2V0cyB0byBiZSB1c2VkIGJ5IHRjIGZpbHRlcnMKKworY29uZmlnIE5FVF9BQ1RfUEVESVQKKyAgICAgICAgdHJpc3RhdGUgIkdlbmVyaWMgUGFja2V0IEVkaXRvciBBY3Rpb25zIgorICAgICAgICBkZXBlbmRzIG9uIE5FVF9DTFNfQUNUCisgICAgICAgIC0tLWhlbHAtLS0KKyAgICAgICAgcmVxdWlyZXMgbmV3IGlwcm91dGUyCisgICAgICAgIFRoaXMgYWxsb3dzIGZvciBwYWNrZXRzIHRvIGJlIGdlbmVyaWNhbGx5IGVkaXRlZAorCitjb25maWcgTkVUX0NMU19QT0xJQ0UKKwlib29sICJUcmFmZmljIHBvbGljaW5nIChuZWVkZWQgZm9yIGluL2VncmVzcykiCisJZGVwZW5kcyBvbiBORVRfQ0xTICYmIE5FVF9RT1MgJiYgTkVUX0NMU19BQ1QhPXkKKwloZWxwCisJICBTYXkgWSB0byBzdXBwb3J0IHRyYWZmaWMgcG9saWNpbmcgKGJhbmR3aWR0aCBsaW1pdHMpLiAgTmVlZGVkIGZvcgorCSAgaW5ncmVzcyBhbmQgZWdyZXNzIHJhdGUgbGltaXRpbmcuCisKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9NYWtlZmlsZSBiL25ldC9zY2hlZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzFlNTU3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjaGVkL01ha2VmaWxlCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBUcmFmZmljIENvbnRyb2wgVW5pdC4KKyMKKworb2JqLXkJOj0gc2NoX2dlbmVyaWMubworCitvYmotJChDT05GSUdfTkVUX1NDSEVEKQkJKz0gc2NoX2FwaS5vIHNjaF9maWZvLm8KK29iai0kKENPTkZJR19ORVRfQ0xTKQkJKz0gY2xzX2FwaS5vCitvYmotJChDT05GSUdfTkVUX0NMU19BQ1QpICAgICAgICs9IGFjdF9hcGkubworb2JqLSQoQ09ORklHX05FVF9BQ1RfUE9MSUNFKQkrPSBwb2xpY2Uubworb2JqLSQoQ09ORklHX05FVF9DTFNfUE9MSUNFKQkrPSBwb2xpY2Uubworb2JqLSQoQ09ORklHX05FVF9BQ1RfR0FDVCkgICAgICArPSBnYWN0Lm8KK29iai0kKENPTkZJR19ORVRfQUNUX01JUlJFRCkgICAgKz0gbWlycmVkLm8KK29iai0kKENPTkZJR19ORVRfQUNUX0lQVCkgICAgICAgKz0gaXB0Lm8KK29iai0kKENPTkZJR19ORVRfQUNUX1BFRElUKSAgICAgKz0gcGVkaXQubworb2JqLSQoQ09ORklHX05FVF9TQ0hfQ0JRKQkrPSBzY2hfY2JxLm8KK29iai0kKENPTkZJR19ORVRfU0NIX0hUQikJKz0gc2NoX2h0Yi5vCitvYmotJChDT05GSUdfTkVUX1NDSF9IUEZRKQkrPSBzY2hfaHBmcS5vCitvYmotJChDT05GSUdfTkVUX1NDSF9IRlNDKQkrPSBzY2hfaGZzYy5vCitvYmotJChDT05GSUdfTkVUX1NDSF9SRUQpCSs9IHNjaF9yZWQubworb2JqLSQoQ09ORklHX05FVF9TQ0hfR1JFRCkJKz0gc2NoX2dyZWQubworb2JqLSQoQ09ORklHX05FVF9TQ0hfSU5HUkVTUykJKz0gc2NoX2luZ3Jlc3MubyAKK29iai0kKENPTkZJR19ORVRfU0NIX0RTTUFSSykJKz0gc2NoX2RzbWFyay5vCitvYmotJChDT05GSUdfTkVUX1NDSF9TRlEpCSs9IHNjaF9zZnEubworb2JqLSQoQ09ORklHX05FVF9TQ0hfVEJGKQkrPSBzY2hfdGJmLm8KK29iai0kKENPTkZJR19ORVRfU0NIX1RFUUwpCSs9IHNjaF90ZXFsLm8KK29iai0kKENPTkZJR19ORVRfU0NIX1BSSU8pCSs9IHNjaF9wcmlvLm8KK29iai0kKENPTkZJR19ORVRfU0NIX0FUTSkJKz0gc2NoX2F0bS5vCitvYmotJChDT05GSUdfTkVUX1NDSF9ORVRFTSkJKz0gc2NoX25ldGVtLm8KK29iai0kKENPTkZJR19ORVRfQ0xTX1UzMikJKz0gY2xzX3UzMi5vCitvYmotJChDT05GSUdfTkVUX0NMU19ST1VURTQpCSs9IGNsc19yb3V0ZS5vCitvYmotJChDT05GSUdfTkVUX0NMU19GVykJKz0gY2xzX2Z3Lm8KK29iai0kKENPTkZJR19ORVRfQ0xTX1JTVlApCSs9IGNsc19yc3ZwLm8KK29iai0kKENPTkZJR19ORVRfQ0xTX1RDSU5ERVgpCSs9IGNsc190Y2luZGV4Lm8KK29iai0kKENPTkZJR19ORVRfQ0xTX1JTVlA2KQkrPSBjbHNfcnN2cDYubworb2JqLSQoQ09ORklHX05FVF9DTFNfQkFTSUMpCSs9IGNsc19iYXNpYy5vCitvYmotJChDT05GSUdfTkVUX0VNQVRDSCkJKz0gZW1hdGNoLm8KK29iai0kKENPTkZJR19ORVRfRU1BVENIX0NNUCkJKz0gZW1fY21wLm8KK29iai0kKENPTkZJR19ORVRfRU1BVENIX05CWVRFKQkrPSBlbV9uYnl0ZS5vCitvYmotJChDT05GSUdfTkVUX0VNQVRDSF9VMzIpCSs9IGVtX3UzMi5vCitvYmotJChDT05GSUdfTkVUX0VNQVRDSF9NRVRBKQkrPSBlbV9tZXRhLm8KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfYXBpLmMgYi9uZXQvc2NoZWQvYWN0X2FwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNmNjMzcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2NoZWQvYWN0X2FwaS5jCkBAIC0wLDAgKzEsODk0IEBACisvKgorICogbmV0L3NjaGVkL2FjdF9hcGkuYwlQYWNrZXQgYWN0aW9uIEFQSS4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3I6CUphbWFsIEhhZGkgU2FsaW0KKyAqCisgKgorICovCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvc2NoX2dlbmVyaWMuaD4KKyNpbmNsdWRlIDxuZXQvYWN0X2FwaS5oPgorCisjaWYgMSAvKiBjb250cm9sICovCisjZGVmaW5lIERQUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQsICMjYXJncykKKyNlbHNlCisjZGVmaW5lIERQUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgMCAvKiBkYXRhICovCisjZGVmaW5lIEQyUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0LCAjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBEMlBSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCB0Y19hY3Rpb25fb3BzICphY3RfYmFzZSA9IE5VTEw7CitzdGF0aWMgREVGSU5FX1JXTE9DSyhhY3RfbW9kX2xvY2spOworCitpbnQgdGNmX3JlZ2lzdGVyX2FjdGlvbihzdHJ1Y3QgdGNfYWN0aW9uX29wcyAqYWN0KQoreworCXN0cnVjdCB0Y19hY3Rpb25fb3BzICphLCAqKmFwOworCisJd3JpdGVfbG9jaygmYWN0X21vZF9sb2NrKTsKKwlmb3IgKGFwID0gJmFjdF9iYXNlOyAoYSA9ICphcCkgIT0gTlVMTDsgYXAgPSAmYS0+bmV4dCkgeworCQlpZiAoYWN0LT50eXBlID09IGEtPnR5cGUgfHwgKHN0cmNtcChhY3QtPmtpbmQsIGEtPmtpbmQpID09IDApKSB7CisJCQl3cml0ZV91bmxvY2soJmFjdF9tb2RfbG9jayk7CisJCQlyZXR1cm4gLUVFWElTVDsKKwkJfQorCX0KKwlhY3QtPm5leHQgPSBOVUxMOworCSphcCA9IGFjdDsKKwl3cml0ZV91bmxvY2soJmFjdF9tb2RfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK2ludCB0Y2ZfdW5yZWdpc3Rlcl9hY3Rpb24oc3RydWN0IHRjX2FjdGlvbl9vcHMgKmFjdCkKK3sKKwlzdHJ1Y3QgdGNfYWN0aW9uX29wcyAqYSwgKiphcDsKKwlpbnQgZXJyID0gLUVOT0VOVDsKKworCXdyaXRlX2xvY2soJmFjdF9tb2RfbG9jayk7CisJZm9yIChhcCA9ICZhY3RfYmFzZTsgKGEgPSAqYXApICE9IE5VTEw7IGFwID0gJmEtPm5leHQpCisJCWlmIChhID09IGFjdCkKKwkJCWJyZWFrOworCWlmIChhKSB7CisJCSphcCA9IGEtPm5leHQ7CisJCWEtPm5leHQgPSBOVUxMOworCQllcnIgPSAwOworCX0KKwl3cml0ZV91bmxvY2soJmFjdF9tb2RfbG9jayk7CisJcmV0dXJuIGVycjsKK30KKworLyogbG9va3VwIGJ5IG5hbWUgKi8KK3N0YXRpYyBzdHJ1Y3QgdGNfYWN0aW9uX29wcyAqdGNfbG9va3VwX2FjdGlvbl9uKGNoYXIgKmtpbmQpCit7CisJc3RydWN0IHRjX2FjdGlvbl9vcHMgKmEgPSBOVUxMOworCisJaWYgKGtpbmQpIHsKKwkJcmVhZF9sb2NrKCZhY3RfbW9kX2xvY2spOworCQlmb3IgKGEgPSBhY3RfYmFzZTsgYTsgYSA9IGEtPm5leHQpIHsKKwkJCWlmIChzdHJjbXAoa2luZCwgYS0+a2luZCkgPT0gMCkgeworCQkJCWlmICghdHJ5X21vZHVsZV9nZXQoYS0+b3duZXIpKSB7CisJCQkJCXJlYWRfdW5sb2NrKCZhY3RfbW9kX2xvY2spOworCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmVhZF91bmxvY2soJmFjdF9tb2RfbG9jayk7CisJfQorCXJldHVybiBhOworfQorCisvKiBsb29rdXAgYnkgcnRhdHRyICovCitzdGF0aWMgc3RydWN0IHRjX2FjdGlvbl9vcHMgKnRjX2xvb2t1cF9hY3Rpb24oc3RydWN0IHJ0YXR0ciAqa2luZCkKK3sKKwlzdHJ1Y3QgdGNfYWN0aW9uX29wcyAqYSA9IE5VTEw7CisKKwlpZiAoa2luZCkgeworCQlyZWFkX2xvY2soJmFjdF9tb2RfbG9jayk7CisJCWZvciAoYSA9IGFjdF9iYXNlOyBhOyBhID0gYS0+bmV4dCkgeworCQkJaWYgKHJ0YXR0cl9zdHJjbXAoa2luZCwgYS0+a2luZCkgPT0gMCkgeworCQkJCWlmICghdHJ5X21vZHVsZV9nZXQoYS0+b3duZXIpKSB7CisJCQkJCXJlYWRfdW5sb2NrKCZhY3RfbW9kX2xvY2spOworCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmVhZF91bmxvY2soJmFjdF9tb2RfbG9jayk7CisJfQorCXJldHVybiBhOworfQorCisjaWYgMAorLyogbG9va3VwIGJ5IGlkICovCitzdGF0aWMgc3RydWN0IHRjX2FjdGlvbl9vcHMgKnRjX2xvb2t1cF9hY3Rpb25faWQodTMyIHR5cGUpCit7CisJc3RydWN0IHRjX2FjdGlvbl9vcHMgKmEgPSBOVUxMOworCisJaWYgKHR5cGUpIHsKKwkJcmVhZF9sb2NrKCZhY3RfbW9kX2xvY2spOworCQlmb3IgKGEgPSBhY3RfYmFzZTsgYTsgYSA9IGEtPm5leHQpIHsKKwkJCWlmIChhLT50eXBlID09IHR5cGUpIHsKKwkJCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGEtPm93bmVyKSkgeworCQkJCQlyZWFkX3VubG9jaygmYWN0X21vZF9sb2NrKTsKKwkJCQkJcmV0dXJuIE5VTEw7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJlYWRfdW5sb2NrKCZhY3RfbW9kX2xvY2spOworCX0KKwlyZXR1cm4gYTsKK30KKyNlbmRpZgorCitpbnQgdGNmX2FjdGlvbl9leGVjKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmFjdCwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRjZl9yZXN1bHQgKnJlcykKK3sKKwlzdHJ1Y3QgdGNfYWN0aW9uICphOworCWludCByZXQgPSAtMTsKKworCWlmIChza2ItPnRjX3ZlcmQgJiBUQ19OQ0xTKSB7CisJCXNrYi0+dGNfdmVyZCA9IENMUl9UQ19OQ0xTKHNrYi0+dGNfdmVyZCk7CisJCUQyUFJJTlRLKCIoJXApdGNmX2FjdGlvbl9leGVjOiBjbGVhcmVkIFRDX05DTFMgaW4gJXMgb3V0ICVzXG4iLAorCQkgICAgICAgICBza2IsIHNrYi0+aW5wdXRfZGV2ID8gc2tiLT5pbnB1dF9kZXYtPm5hbWUgOiAieHh4IiwKKwkJICAgICAgICAgc2tiLT5kZXYtPm5hbWUpOworCQlyZXQgPSBUQ19BQ1RfT0s7CisJCWdvdG8gZXhlY19kb25lOworCX0KKwl3aGlsZSAoKGEgPSBhY3QpICE9IE5VTEwpIHsKK3JlcGVhdDoKKwkJaWYgKGEtPm9wcyAmJiBhLT5vcHMtPmFjdCkgeworCQkJcmV0ID0gYS0+b3BzLT5hY3QoJnNrYiwgYSk7CisJCQlpZiAoVENfTVVOR0VEICYgc2tiLT50Y192ZXJkKSB7CisJCQkJLyogY29waWVkIGFscmVhZHksIGFsbG93IHRyYW1wbGluZyAqLworCQkJCXNrYi0+dGNfdmVyZCA9IFNFVF9UQ19PSzJNVU5HRShza2ItPnRjX3ZlcmQpOworCQkJCXNrYi0+dGNfdmVyZCA9IENMUl9UQ19NVU5HRUQoc2tiLT50Y192ZXJkKTsKKwkJCX0KKwkJCWlmIChyZXQgIT0gVENfQUNUX1BJUEUpCisJCQkJZ290byBleGVjX2RvbmU7CisJCQlpZiAocmV0ID09IFRDX0FDVF9SRVBFQVQpCisJCQkJZ290byByZXBlYXQ7CS8qIHdlIG5lZWQgYSB0dGwgLSBKSFMgKi8KKwkJfQorCQlhY3QgPSBhLT5uZXh0OworCX0KK2V4ZWNfZG9uZToKKwlpZiAoc2tiLT50Y19jbGFzc2lkID4gMCkgeworCQlyZXMtPmNsYXNzaWQgPSBza2ItPnRjX2NsYXNzaWQ7CisJCXJlcy0+Y2xhc3MgPSAwOworCQlza2ItPnRjX2NsYXNzaWQgPSAwOworCX0KKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHRjZl9hY3Rpb25fZGVzdHJveShzdHJ1Y3QgdGNfYWN0aW9uICphY3QsIGludCBiaW5kKQoreworCXN0cnVjdCB0Y19hY3Rpb24gKmE7CisKKwlmb3IgKGEgPSBhY3Q7IGE7IGEgPSBhY3QpIHsKKwkJaWYgKGEtPm9wcyAmJiBhLT5vcHMtPmNsZWFudXApIHsKKwkJCURQUklOVEsoInRjZl9hY3Rpb25fZGVzdHJveSBkZXN0cm95aW5nICVwIG5leHQgJXBcbiIsCisJCQkgICAgICAgIGEsIGEtPm5leHQpOworCQkJaWYgKGEtPm9wcy0+Y2xlYW51cChhLCBiaW5kKSA9PSBBQ1RfUF9ERUxFVEVEKQorCQkJCW1vZHVsZV9wdXQoYS0+b3BzLT5vd25lcik7CisJCQlhY3QgPSBhY3QtPm5leHQ7CisJCQlrZnJlZShhKTsKKwkJfSBlbHNlIHsgLypGSVhNRTogUmVtb3ZlIGxhdGVyIC0gY2F0Y2ggaW5zZXJ0aW9uIGJ1Z3MqLworCQkJcHJpbnRrKCJ0Y2ZfYWN0aW9uX2Rlc3Ryb3k6IEJVRz8gZGVzdHJveWluZyBOVUxMIG9wc1xuIik7CisJCQlhY3QgPSBhY3QtPm5leHQ7CisJCQlrZnJlZShhKTsKKwkJfQorCX0KK30KKworaW50Cit0Y2ZfYWN0aW9uX2R1bXBfb2xkKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kLCBpbnQgcmVmKQoreworCWludCBlcnIgPSAtRUlOVkFMOworCisJaWYgKGEtPm9wcyA9PSBOVUxMIHx8IGEtPm9wcy0+ZHVtcCA9PSBOVUxMKQorCQlyZXR1cm4gZXJyOworCXJldHVybiBhLT5vcHMtPmR1bXAoc2tiLCBhLCBiaW5kLCByZWYpOworfQorCitpbnQKK3RjZl9hY3Rpb25fZHVtcF8xKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kLCBpbnQgcmVmKQoreworCWludCBlcnIgPSAtRUlOVkFMOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJc3RydWN0IHJ0YXR0ciAqcjsKKworCWlmIChhLT5vcHMgPT0gTlVMTCB8fCBhLT5vcHMtPmR1bXAgPT0gTlVMTCkKKwkJcmV0dXJuIGVycjsKKworCVJUQV9QVVQoc2tiLCBUQ0FfS0lORCwgSUZOQU1TSVosIGEtPm9wcy0+a2luZCk7CisJaWYgKHRjZl9hY3Rpb25fY29weV9zdGF0cyhza2IsIGEsIDApKQorCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOworCXIgPSAoc3RydWN0IHJ0YXR0ciopIHNrYi0+dGFpbDsKKwlSVEFfUFVUKHNrYiwgVENBX09QVElPTlMsIDAsIE5VTEwpOworCWlmICgoZXJyID0gdGNmX2FjdGlvbl9kdW1wX29sZChza2IsIGEsIGJpbmQsIHJlZikpID4gMCkgeworCQlyLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4KilyOworCQlyZXR1cm4gZXJyOworCX0KKworcnRhdHRyX2ZhaWx1cmU6CisJc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlyZXR1cm4gLTE7Cit9CisKK2ludAordGNmX2FjdGlvbl9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmFjdCwgaW50IGJpbmQsIGludCByZWYpCit7CisJc3RydWN0IHRjX2FjdGlvbiAqYTsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXN0cnVjdCBydGF0dHIgKnIgOworCisJd2hpbGUgKChhID0gYWN0KSAhPSBOVUxMKSB7CisJCXIgPSAoc3RydWN0IHJ0YXR0ciopIHNrYi0+dGFpbDsKKwkJYWN0ID0gYS0+bmV4dDsKKwkJUlRBX1BVVChza2IsIGEtPm9yZGVyLCAwLCBOVUxMKTsKKwkJZXJyID0gdGNmX2FjdGlvbl9kdW1wXzEoc2tiLCBhLCBiaW5kLCByZWYpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CisJCXItPnJ0YV9sZW4gPSBza2ItPnRhaWwgLSAodTgqKXI7CisJfQorCisJcmV0dXJuIDA7CisKK3J0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC1lcnI7Cit9CisKK3N0cnVjdCB0Y19hY3Rpb24gKnRjZl9hY3Rpb25faW5pdF8xKHN0cnVjdCBydGF0dHIgKnJ0YSwgc3RydWN0IHJ0YXR0ciAqZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqbmFtZSwgaW50IG92ciwgaW50IGJpbmQsIGludCAqZXJyKQoreworCXN0cnVjdCB0Y19hY3Rpb24gKmE7CisJc3RydWN0IHRjX2FjdGlvbl9vcHMgKmFfbzsKKwljaGFyIGFjdF9uYW1lW0lGTkFNU0laXTsKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfQUNUX01BWCsxXTsKKwlzdHJ1Y3QgcnRhdHRyICpraW5kOworCisJKmVyciA9IC1FSU5WQUw7CisKKwlpZiAobmFtZSA9PSBOVUxMKSB7CisJCWlmIChydGF0dHJfcGFyc2VfbmVzdGVkKHRiLCBUQ0FfQUNUX01BWCwgcnRhKSA8IDApCisJCQlnb3RvIGVycl9vdXQ7CisJCWtpbmQgPSB0YltUQ0FfQUNUX0tJTkQtMV07CisJCWlmIChraW5kID09IE5VTEwpCisJCQlnb3RvIGVycl9vdXQ7CisJCWlmIChydGF0dHJfc3RybGNweShhY3RfbmFtZSwga2luZCwgSUZOQU1TSVopID49IElGTkFNU0laKQorCQkJZ290byBlcnJfb3V0OworCX0gZWxzZSB7CisJCWlmIChzdHJsY3B5KGFjdF9uYW1lLCBuYW1lLCBJRk5BTVNJWikgPj0gSUZOQU1TSVopCisJCQlnb3RvIGVycl9vdXQ7CisJfQorCisJYV9vID0gdGNfbG9va3VwX2FjdGlvbl9uKGFjdF9uYW1lKTsKKwlpZiAoYV9vID09IE5VTEwpIHsKKyNpZmRlZiBDT05GSUdfS01PRAorCQlydG5sX3VubG9jaygpOworCQlyZXF1ZXN0X21vZHVsZShhY3RfbmFtZSk7CisJCXJ0bmxfbG9jaygpOworCisJCWFfbyA9IHRjX2xvb2t1cF9hY3Rpb25fbihhY3RfbmFtZSk7CisKKwkJLyogV2UgZHJvcHBlZCB0aGUgUlROTCBzZW1hcGhvcmUgaW4gb3JkZXIgdG8KKwkJICogcGVyZm9ybSB0aGUgbW9kdWxlIGxvYWQuICBTbywgZXZlbiBpZiB3ZQorCQkgKiBzdWNjZWVkZWQgaW4gbG9hZGluZyB0aGUgbW9kdWxlIHdlIGhhdmUgdG8KKwkJICogdGVsbCB0aGUgY2FsbGVyIHRvIHJlcGxheSB0aGUgcmVxdWVzdC4gIFdlCisJCSAqIGluZGljYXRlIHRoaXMgdXNpbmcgLUVBR0FJTi4KKwkJICovCisJCWlmIChhX28gIT0gTlVMTCkgeworCQkJKmVyciA9IC1FQUdBSU47CisJCQlnb3RvIGVycl9tb2Q7CisJCX0KKyNlbmRpZgorCQlnb3RvIGVycl9vdXQ7CisJfQorCisJKmVyciA9IC1FTk9NRU07CisJYSA9IGttYWxsb2Moc2l6ZW9mKCphKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGEgPT0gTlVMTCkKKwkJZ290byBlcnJfbW9kOworCW1lbXNldChhLCAwLCBzaXplb2YoKmEpKTsKKworCS8qIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yIHBvbGljZXIgKi8KKwlpZiAobmFtZSA9PSBOVUxMKQorCQkqZXJyID0gYV9vLT5pbml0KHRiW1RDQV9BQ1RfT1BUSU9OUy0xXSwgZXN0LCBhLCBvdnIsIGJpbmQpOworCWVsc2UKKwkJKmVyciA9IGFfby0+aW5pdChydGEsIGVzdCwgYSwgb3ZyLCBiaW5kKTsKKwlpZiAoKmVyciA8IDApCisJCWdvdG8gZXJyX2ZyZWU7CisKKwkvKiBtb2R1bGUgY291bnQgZ29lcyB1cCBvbmx5IHdoZW4gYnJhbmQgbmV3IHBvbGljeSBpcyBjcmVhdGVkCisJICAgaWYgaXQgZXhpc3RzIGFuZCBpcyBvbmx5IGJvdW5kIHRvIGluIGFfby0+aW5pdCgpIHRoZW4KKwkgICBBQ1RfUF9DUkVBVEVEIGlzIG5vdCByZXR1cm5lZCAoYSB6ZXJvIGlzKS4KKwkqLworCWlmICgqZXJyICE9IEFDVF9QX0NSRUFURUQpCisJCW1vZHVsZV9wdXQoYV9vLT5vd25lcik7CisJYS0+b3BzID0gYV9vOworCURQUklOVEsoInRjZl9hY3Rpb25faW5pdF8xOiBzdWNjZXNzZnVsbCAlc1xuIiwgYWN0X25hbWUpOworCisJKmVyciA9IDA7CisJcmV0dXJuIGE7CisKK2Vycl9mcmVlOgorCWtmcmVlKGEpOworZXJyX21vZDoKKwltb2R1bGVfcHV0KGFfby0+b3duZXIpOworZXJyX291dDoKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IHRjX2FjdGlvbiAqdGNmX2FjdGlvbl9pbml0KHN0cnVjdCBydGF0dHIgKnJ0YSwgc3RydWN0IHJ0YXR0ciAqZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKm5hbWUsIGludCBvdnIsIGludCBiaW5kLCBpbnQgKmVycikKK3sKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfQUNUX01BWF9QUklPKzFdOworCXN0cnVjdCB0Y19hY3Rpb24gKmhlYWQgPSBOVUxMLCAqYWN0LCAqYWN0X3ByZXYgPSBOVUxMOworCWludCBpOworCisJaWYgKHJ0YXR0cl9wYXJzZV9uZXN0ZWQodGIsIFRDQV9BQ1RfTUFYX1BSSU8sIHJ0YSkgPCAwKSB7CisJCSplcnIgPSAtRUlOVkFMOworCQlyZXR1cm4gaGVhZDsKKwl9CisKKwlmb3IgKGk9MDsgaSA8IFRDQV9BQ1RfTUFYX1BSSU8gJiYgdGJbaV07IGkrKykgeworCQlhY3QgPSB0Y2ZfYWN0aW9uX2luaXRfMSh0YltpXSwgZXN0LCBuYW1lLCBvdnIsIGJpbmQsIGVycik7CisJCWlmIChhY3QgPT0gTlVMTCkKKwkJCWdvdG8gZXJyOworCQlhY3QtPm9yZGVyID0gaSsxOworCisJCWlmIChoZWFkID09IE5VTEwpCisJCQloZWFkID0gYWN0OworCQllbHNlCisJCQlhY3RfcHJldi0+bmV4dCA9IGFjdDsKKwkJYWN0X3ByZXYgPSBhY3Q7CisJfQorCXJldHVybiBoZWFkOworCitlcnI6CisJaWYgKGhlYWQgIT0gTlVMTCkKKwkJdGNmX2FjdGlvbl9kZXN0cm95KGhlYWQsIGJpbmQpOworCXJldHVybiBOVUxMOworfQorCitpbnQgdGNmX2FjdGlvbl9jb3B5X3N0YXRzKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsCisJCQkgIGludCBjb21wYXRfbW9kZSkKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgZ25ldF9kdW1wIGQ7CisJc3RydWN0IHRjZl9hY3RfaGRyICpoID0gYS0+cHJpdjsKKwkKKwlpZiAoaCA9PSBOVUxMKQorCQlnb3RvIGVycm91dDsKKworCS8qIGNvbXBhdF9tb2RlIGJlaW5nIHRydWUgc3BlY2lmaWVzIGEgY2FsbCB0aGF0IGlzIHN1cHBvc2VkCisJICogdG8gYWRkIGFkZGl0aW9uYWwgYmFja3dhcmQgY29tcGF0aWJsaXR5IHN0YXRpc3RpYyBUTFZzLgorCSAqLworCWlmIChjb21wYXRfbW9kZSkgeworCQlpZiAoYS0+dHlwZSA9PSBUQ0FfT0xEX0NPTVBBVCkKKwkJCWVyciA9IGduZXRfc3RhdHNfc3RhcnRfY29weV9jb21wYXQoc2tiLCAwLAorCQkJCVRDQV9TVEFUUywgVENBX1hTVEFUUywgaC0+c3RhdHNfbG9jaywgJmQpOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwkJZXJyID0gZ25ldF9zdGF0c19zdGFydF9jb3B5KHNrYiwgVENBX0FDVF9TVEFUUywKKwkJCWgtPnN0YXRzX2xvY2ssICZkKTsKKworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm91dDsKKworCWlmIChhLT5vcHMgIT0gTlVMTCAmJiBhLT5vcHMtPmdldF9zdGF0cyAhPSBOVUxMKQorCQlpZiAoYS0+b3BzLT5nZXRfc3RhdHMoc2tiLCBhKSA8IDApCisJCQlnb3RvIGVycm91dDsKKworCWlmIChnbmV0X3N0YXRzX2NvcHlfYmFzaWMoJmQsICZoLT5ic3RhdHMpIDwgMCB8fAorI2lmZGVmIENPTkZJR19ORVRfRVNUSU1BVE9SCisJICAgIGduZXRfc3RhdHNfY29weV9yYXRlX2VzdCgmZCwgJmgtPnJhdGVfZXN0KSA8IDAgfHwKKyNlbmRpZgorCSAgICBnbmV0X3N0YXRzX2NvcHlfcXVldWUoJmQsICZoLT5xc3RhdHMpIDwgMCkKKwkJZ290byBlcnJvdXQ7CisKKwlpZiAoZ25ldF9zdGF0c19maW5pc2hfY29weSgmZCkgPCAwKQorCQlnb3RvIGVycm91dDsKKworCXJldHVybiAwOworCitlcnJvdXQ6CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50Cit0Y2FfZ2V0X2ZpbGwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjX2FjdGlvbiAqYSwgdTMyIHBpZCwgdTMyIHNlcSwKKyAgICAgICAgICAgICB1bnNpZ25lZCBmbGFncywgaW50IGV2ZW50LCBpbnQgYmluZCwgaW50IHJlZikKK3sKKwlzdHJ1Y3QgdGNhbXNnICp0OworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJc3RydWN0IHJ0YXR0ciAqeDsKKworCW5saCA9IE5MTVNHX1BVVChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCp0KSk7CisJbmxoLT5ubG1zZ19mbGFncyA9IGZsYWdzOworCXQgPSBOTE1TR19EQVRBKG5saCk7CisJdC0+dGNhX2ZhbWlseSA9IEFGX1VOU1BFQzsKKwkKKwl4ID0gKHN0cnVjdCBydGF0dHIqKSBza2ItPnRhaWw7CisJUlRBX1BVVChza2IsIFRDQV9BQ1RfVEFCLCAwLCBOVUxMKTsKKworCWlmICh0Y2ZfYWN0aW9uX2R1bXAoc2tiLCBhLCBiaW5kLCByZWYpIDwgMCkKKwkJZ290byBydGF0dHJfZmFpbHVyZTsKKworCXgtPnJ0YV9sZW4gPSBza2ItPnRhaWwgLSAodTgqKXg7CisJCisJbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCXJldHVybiBza2ItPmxlbjsKKworcnRhdHRyX2ZhaWx1cmU6CitubG1zZ19mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50CithY3RfZ2V0X25vdGlmeSh1MzIgcGlkLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBlcnIgPSAwOworCisJc2tiID0gYWxsb2Nfc2tiKE5MTVNHX0dPT0RTSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9CVUZTOworCWlmICh0Y2FfZ2V0X2ZpbGwoc2tiLCBhLCBwaWQsIG4tPm5sbXNnX3NlcSwgMCwgZXZlbnQsIDAsIDApIDw9IDApIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwllcnIgPSBuZXRsaW5rX3VuaWNhc3QocnRubCwgc2tiLCBwaWQsIE1TR19ET05UV0FJVCk7CisJaWYgKGVyciA+IDApCisJCWVyciA9IDA7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCB0Y19hY3Rpb24gKgordGNmX2FjdGlvbl9nZXRfMShzdHJ1Y3QgcnRhdHRyICpydGEsIHN0cnVjdCBubG1zZ2hkciAqbiwgdTMyIHBpZCwgaW50ICplcnIpCit7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX0FDVF9NQVgrMV07CisJc3RydWN0IHRjX2FjdGlvbiAqYTsKKwlpbnQgaW5kZXg7CisKKwkqZXJyID0gLUVJTlZBTDsKKwlpZiAocnRhdHRyX3BhcnNlX25lc3RlZCh0YiwgVENBX0FDVF9NQVgsIHJ0YSkgPCAwKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICh0YltUQ0FfQUNUX0lOREVYIC0gMV0gPT0gTlVMTCB8fAorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfQUNUX0lOREVYIC0gMV0pIDwgc2l6ZW9mKGluZGV4KSkKKwkJcmV0dXJuIE5VTEw7CisJaW5kZXggPSAqKGludCAqKVJUQV9EQVRBKHRiW1RDQV9BQ1RfSU5ERVggLSAxXSk7CisKKwkqZXJyID0gLUVOT01FTTsKKwlhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHRjX2FjdGlvbiksIEdGUF9LRVJORUwpOworCWlmIChhID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCW1lbXNldChhLCAwLCBzaXplb2Yoc3RydWN0IHRjX2FjdGlvbikpOworCisJKmVyciA9IC1FSU5WQUw7CisJYS0+b3BzID0gdGNfbG9va3VwX2FjdGlvbih0YltUQ0FfQUNUX0tJTkQgLSAxXSk7CisJaWYgKGEtPm9wcyA9PSBOVUxMKQorCQlnb3RvIGVycl9mcmVlOworCWlmIChhLT5vcHMtPmxvb2t1cCA9PSBOVUxMKQorCQlnb3RvIGVycl9tb2Q7CisJKmVyciA9IC1FTk9FTlQ7CisJaWYgKGEtPm9wcy0+bG9va3VwKGEsIGluZGV4KSA9PSAwKQorCQlnb3RvIGVycl9tb2Q7CisKKwltb2R1bGVfcHV0KGEtPm9wcy0+b3duZXIpOworCSplcnIgPSAwOworCXJldHVybiBhOworZXJyX21vZDoKKwltb2R1bGVfcHV0KGEtPm9wcy0+b3duZXIpOworZXJyX2ZyZWU6CisJa2ZyZWUoYSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfYShzdHJ1Y3QgdGNfYWN0aW9uICphY3QpCit7CisJc3RydWN0IHRjX2FjdGlvbiAqYTsKKworCWZvciAoYSA9IGFjdDsgYTsgYSA9IGFjdCkgeworCQlhY3QgPSBhLT5uZXh0OworCQlrZnJlZShhKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGNfYWN0aW9uICpjcmVhdGVfYShpbnQgaSkKK3sKKwlzdHJ1Y3QgdGNfYWN0aW9uICphY3Q7CisKKwlhY3QgPSBrbWFsbG9jKHNpemVvZigqYWN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFjdCA9PSBOVUxMKSB7CisJCXByaW50aygiY3JlYXRlX2E6IGZhaWxlZCB0byBhbGxvYyFcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KGFjdCwgMCwgc2l6ZW9mKCphY3QpKTsKKwlhY3QtPm9yZGVyID0gaTsKKwlyZXR1cm4gYWN0OworfQorCitzdGF0aWMgaW50IHRjYV9hY3Rpb25fZmx1c2goc3RydWN0IHJ0YXR0ciAqcnRhLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHUzMiBwaWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyICpiOworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCXN0cnVjdCB0Y2Ftc2cgKnQ7CisJc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgZGNiOworCXN0cnVjdCBydGF0dHIgKng7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX0FDVF9NQVgrMV07CisJc3RydWN0IHJ0YXR0ciAqa2luZDsKKwlzdHJ1Y3QgdGNfYWN0aW9uICphID0gY3JlYXRlX2EoMCk7CisJaW50IGVyciA9IC1FSU5WQUw7CisKKwlpZiAoYSA9PSBOVUxMKSB7CisJCXByaW50aygidGNhX2FjdGlvbl9mbHVzaDogY291bGRudCBjcmVhdGUgdGNfYWN0aW9uXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlza2IgPSBhbGxvY19za2IoTkxNU0dfR09PRFNJWkUsIEdGUF9LRVJORUwpOworCWlmICghc2tiKSB7CisJCXByaW50aygidGNhX2FjdGlvbl9mbHVzaDogZmFpbGVkIHNrYiBhbGxvY1xuIik7CisJCWtmcmVlKGEpOworCQlyZXR1cm4gLUVOT0JVRlM7CisJfQorCisJYiA9ICh1bnNpZ25lZCBjaGFyICopc2tiLT50YWlsOworCisJaWYgKHJ0YXR0cl9wYXJzZV9uZXN0ZWQodGIsIFRDQV9BQ1RfTUFYLCBydGEpIDwgMCkKKwkJZ290byBlcnJfb3V0OworCisJa2luZCA9IHRiW1RDQV9BQ1RfS0lORC0xXTsKKwlhLT5vcHMgPSB0Y19sb29rdXBfYWN0aW9uKGtpbmQpOworCWlmIChhLT5vcHMgPT0gTlVMTCkKKwkJZ290byBlcnJfb3V0OworCisJbmxoID0gTkxNU0dfUFVUKHNrYiwgcGlkLCBuLT5ubG1zZ19zZXEsIFJUTV9ERUxBQ1RJT04sIHNpemVvZigqdCkpOworCXQgPSBOTE1TR19EQVRBKG5saCk7CisJdC0+dGNhX2ZhbWlseSA9IEFGX1VOU1BFQzsKKworCXggPSAoc3RydWN0IHJ0YXR0ciAqKSBza2ItPnRhaWw7CisJUlRBX1BVVChza2IsIFRDQV9BQ1RfVEFCLCAwLCBOVUxMKTsKKworCWVyciA9IGEtPm9wcy0+d2Fsayhza2IsICZkY2IsIFJUTV9ERUxBQ1RJT04sIGEpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOworCisJeC0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtICh1OCAqKSB4OworCisJbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCW5saC0+bmxtc2dfZmxhZ3MgfD0gTkxNX0ZfUk9PVDsKKwltb2R1bGVfcHV0KGEtPm9wcy0+b3duZXIpOworCWtmcmVlKGEpOworCWVyciA9IHJ0bmV0bGlua19zZW5kKHNrYiwgcGlkLCBSVE1HUlBfVEMsIG4tPm5sbXNnX2ZsYWdzJk5MTV9GX0VDSE8pOworCWlmIChlcnIgPiAwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBlcnI7CisKK3J0YXR0cl9mYWlsdXJlOgorCW1vZHVsZV9wdXQoYS0+b3BzLT5vd25lcik7CitubG1zZ19mYWlsdXJlOgorZXJyX291dDoKKwlrZnJlZV9za2Ioc2tiKTsKKwlrZnJlZShhKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50Cit0Y2FfYWN0aW9uX2dkKHN0cnVjdCBydGF0dHIgKnJ0YSwgc3RydWN0IG5sbXNnaGRyICpuLCB1MzIgcGlkLCBpbnQgZXZlbnQpCit7CisJaW50IGksIHJldCA9IDA7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX0FDVF9NQVhfUFJJTysxXTsKKwlzdHJ1Y3QgdGNfYWN0aW9uICpoZWFkID0gTlVMTCwgKmFjdCwgKmFjdF9wcmV2ID0gTlVMTDsKKworCWlmIChydGF0dHJfcGFyc2VfbmVzdGVkKHRiLCBUQ0FfQUNUX01BWF9QUklPLCBydGEpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZXZlbnQgPT0gUlRNX0RFTEFDVElPTiAmJiBuLT5ubG1zZ19mbGFncyZOTE1fRl9ST09UKSB7CisJCWlmICh0YlswXSAhPSBOVUxMICYmIHRiWzFdID09IE5VTEwpCisJCQlyZXR1cm4gdGNhX2FjdGlvbl9mbHVzaCh0YlswXSwgbiwgcGlkKTsKKwl9CisKKwlmb3IgKGk9MDsgaSA8IFRDQV9BQ1RfTUFYX1BSSU8gJiYgdGJbaV07IGkrKykgeworCQlhY3QgPSB0Y2ZfYWN0aW9uX2dldF8xKHRiW2ldLCBuLCBwaWQsICZyZXQpOworCQlpZiAoYWN0ID09IE5VTEwpCisJCQlnb3RvIGVycjsKKwkJYWN0LT5vcmRlciA9IGkrMTsKKworCQlpZiAoaGVhZCA9PSBOVUxMKQorCQkJaGVhZCA9IGFjdDsKKwkJZWxzZQorCQkJYWN0X3ByZXYtPm5leHQgPSBhY3Q7CisJCWFjdF9wcmV2ID0gYWN0OworCX0KKworCWlmIChldmVudCA9PSBSVE1fR0VUQUNUSU9OKQorCQlyZXQgPSBhY3RfZ2V0X25vdGlmeShwaWQsIG4sIGhlYWQsIGV2ZW50KTsKKwllbHNlIHsgLyogZGVsZXRlICovCisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJc2tiID0gYWxsb2Nfc2tiKE5MTVNHX0dPT0RTSVpFLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFza2IpIHsKKwkJCXJldCA9IC1FTk9CVUZTOworCQkJZ290byBlcnI7CisJCX0KKworCQlpZiAodGNhX2dldF9maWxsKHNrYiwgaGVhZCwgcGlkLCBuLT5ubG1zZ19zZXEsIDAsIGV2ZW50LAorCQkgICAgICAgICAgICAgICAgIDAsIDEpIDw9IDApIHsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJLyogbm93IGRvIHRoZSBkZWxldGUgKi8KKwkJdGNmX2FjdGlvbl9kZXN0cm95KGhlYWQsIDApOworCQlyZXQgPSBydG5ldGxpbmtfc2VuZChza2IsIHBpZCwgUlRNR1JQX1RDLAorCQkgICAgICAgICAgICAgICAgICAgICBuLT5ubG1zZ19mbGFncyZOTE1fRl9FQ0hPKTsKKwkJaWYgKHJldCA+IDApCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIHJldDsKKwl9CitlcnI6CisJY2xlYW51cF9hKGhlYWQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGNmX2FkZF9ub3RpZnkoc3RydWN0IHRjX2FjdGlvbiAqYSwgdTMyIHBpZCwgdTMyIHNlcSwgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmbGFncykKK3sKKwlzdHJ1Y3QgdGNhbXNnICp0OworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHJ0YXR0ciAqeDsKKwl1bnNpZ25lZCBjaGFyICpiOworCWludCBlcnIgPSAwOworCisJc2tiID0gYWxsb2Nfc2tiKE5MTVNHX0dPT0RTSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJYiA9ICh1bnNpZ25lZCBjaGFyICopc2tiLT50YWlsOworCisJbmxoID0gTkxNU0dfUFVUKHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKnQpKTsKKwlubGgtPm5sbXNnX2ZsYWdzID0gZmxhZ3M7CisJdCA9IE5MTVNHX0RBVEEobmxoKTsKKwl0LT50Y2FfZmFtaWx5ID0gQUZfVU5TUEVDOworCQorCXggPSAoc3RydWN0IHJ0YXR0ciopIHNrYi0+dGFpbDsKKwlSVEFfUFVUKHNrYiwgVENBX0FDVF9UQUIsIDAsIE5VTEwpOworCisJaWYgKHRjZl9hY3Rpb25fZHVtcChza2IsIGEsIDAsIDApIDwgMCkKKwkJZ290byBydGF0dHJfZmFpbHVyZTsKKworCXgtPnJ0YV9sZW4gPSBza2ItPnRhaWwgLSAodTgqKXg7CisJCisJbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCU5FVExJTktfQ0Ioc2tiKS5kc3RfZ3JvdXBzID0gUlRNR1JQX1RDOworCQorCWVyciA9IHJ0bmV0bGlua19zZW5kKHNrYiwgcGlkLCBSVE1HUlBfVEMsIGZsYWdzJk5MTV9GX0VDSE8pOworCWlmIChlcnIgPiAwKQorCQllcnIgPSAwOworCXJldHVybiBlcnI7CisKK3J0YXR0cl9mYWlsdXJlOgorbmxtc2dfZmFpbHVyZToKKwlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCXJldHVybiAtMTsKK30KKworCQorc3RhdGljIGludAordGNmX2FjdGlvbl9hZGQoc3RydWN0IHJ0YXR0ciAqcnRhLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHUzMiBwaWQsIGludCBvdnIpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHRjX2FjdGlvbiAqYWN0OworCXN0cnVjdCB0Y19hY3Rpb24gKmE7CisJdTMyIHNlcSA9IG4tPm5sbXNnX3NlcTsKKworCWFjdCA9IHRjZl9hY3Rpb25faW5pdChydGEsIE5VTEwsIE5VTEwsIG92ciwgMCwgJnJldCk7CisJaWYgKGFjdCA9PSBOVUxMKQorCQlnb3RvIGRvbmU7CisKKwkvKiBkdW1wIHRoZW4gZnJlZSBhbGwgdGhlIGFjdGlvbnMgYWZ0ZXIgdXBkYXRlOyBpbnNlcnRlZCBwb2xpY3kKKwkgKiBzdGF5cyBpbnRhY3QKKwkgKiAqLworCXJldCA9IHRjZl9hZGRfbm90aWZ5KGFjdCwgcGlkLCBzZXEsIFJUTV9ORVdBQ1RJT04sIG4tPm5sbXNnX2ZsYWdzKTsKKwlmb3IgKGEgPSBhY3Q7IGE7IGEgPSBhY3QpIHsKKwkJYWN0ID0gYS0+bmV4dDsKKwkJa2ZyZWUoYSk7CisJfQorZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRjX2N0bF9hY3Rpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJc3RydWN0IHJ0YXR0ciAqKnRjYSA9IGFyZzsKKwl1MzIgcGlkID0gc2tiID8gTkVUTElOS19DQihza2IpLnBpZCA6IDA7CisJaW50IHJldCA9IDAsIG92ciA9IDA7CisKKwlpZiAodGNhW1RDQV9BQ1RfVEFCLTFdID09IE5VTEwpIHsKKwkJcHJpbnRrKCJ0Y19jdGxfYWN0aW9uOiByZWNlaXZlZCBOTyBhY3Rpb24gYXR0cmlic1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIG4tPm5sbXNnX2ZsYWdzJk5MTV9GX0NSRUFURQorCSAqICovCisJc3dpdGNoIChuLT5ubG1zZ190eXBlKSB7CisJY2FzZSBSVE1fTkVXQUNUSU9OOgorCQkvKiB3ZSBhcmUgZ29pbmcgdG8gYXNzdW1lIGFsbCBvdGhlciBmbGFncworCQkgKiBpbXBseSBjcmVhdGUgb25seSBpZiBpdCBkb2VzbnQgZXhpc3QKKwkJICogTm90ZSB0aGF0IENSRUFURSB8IEVYQ0wgaW1wbGllcyB0aGF0CisJCSAqIGJ1dCBzaW5jZSB3ZSB3YW50IGF2b2lkIGFtYmlndWl0eSAoZWcgd2hlbiBmbGFncworCQkgKiBpcyB6ZXJvKSB0aGVuIGp1c3Qgc2V0IHRoaXMKKwkJICovCisJCWlmIChuLT5ubG1zZ19mbGFncyZOTE1fRl9SRVBMQUNFKQorCQkJb3ZyID0gMTsKK3JlcGxheToKKwkJcmV0ID0gdGNmX2FjdGlvbl9hZGQodGNhW1RDQV9BQ1RfVEFCLTFdLCBuLCBwaWQsIG92cik7CisJCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJCWdvdG8gcmVwbGF5OworCQlicmVhazsKKwljYXNlIFJUTV9ERUxBQ1RJT046CisJCXJldCA9IHRjYV9hY3Rpb25fZ2QodGNhW1RDQV9BQ1RfVEFCLTFdLCBuLCBwaWQsIFJUTV9ERUxBQ1RJT04pOworCQlicmVhazsKKwljYXNlIFJUTV9HRVRBQ1RJT046CisJCXJldCA9IHRjYV9hY3Rpb25fZ2QodGNhW1RDQV9BQ1RfVEFCLTFdLCBuLCBwaWQsIFJUTV9HRVRBQ1RJT04pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY2hhciAqCitmaW5kX2R1bXBfa2luZChzdHJ1Y3Qgbmxtc2doZHIgKm4pCit7CisJc3RydWN0IHJ0YXR0ciAqdGIxLCAqdGIyW1RDQV9BQ1RfTUFYKzFdOworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9BQ1RfTUFYX1BSSU8gKyAxXTsKKwlzdHJ1Y3QgcnRhdHRyICpydGFbVENBQV9NQVggKyAxXTsKKwlzdHJ1Y3QgcnRhdHRyICpraW5kOworCWludCBtaW5fbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgdGNhbXNnKSk7CisJaW50IGF0dHJsZW4gPSBuLT5ubG1zZ19sZW4gLSBOTE1TR19BTElHTihtaW5fbGVuKTsKKwlzdHJ1Y3QgcnRhdHRyICphdHRyID0gKHZvaWQgKikgbiArIE5MTVNHX0FMSUdOKG1pbl9sZW4pOworCisJaWYgKHJ0YXR0cl9wYXJzZShydGEsIFRDQUFfTUFYLCBhdHRyLCBhdHRybGVuKSA8IDApCisJCXJldHVybiBOVUxMOworCXRiMSA9IHJ0YVtUQ0FfQUNUX1RBQiAtIDFdOworCWlmICh0YjEgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAocnRhdHRyX3BhcnNlKHRiLCBUQ0FfQUNUX01BWF9QUklPLCBSVEFfREFUQSh0YjEpLAorCSAgICAgICAgICAgICAgICAgTkxNU0dfQUxJR04oUlRBX1BBWUxPQUQodGIxKSkpIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHRiWzBdID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaWYgKHJ0YXR0cl9wYXJzZSh0YjIsIFRDQV9BQ1RfTUFYLCBSVEFfREFUQSh0YlswXSksCisJICAgICAgICAgICAgICAgICBSVEFfUEFZTE9BRCh0YlswXSkpIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisJa2luZCA9IHRiMltUQ0FfQUNUX0tJTkQtMV07CisKKwlyZXR1cm4gKGNoYXIgKikgUlRBX0RBVEEoa2luZCk7Cit9CisKK3N0YXRpYyBpbnQKK3RjX2R1bXBfYWN0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXN0cnVjdCBydGF0dHIgKng7CisJc3RydWN0IHRjX2FjdGlvbl9vcHMgKmFfbzsKKwlzdHJ1Y3QgdGNfYWN0aW9uIGE7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHRjYW1zZyAqdCA9IChzdHJ1Y3QgdGNhbXNnICopIE5MTVNHX0RBVEEoY2ItPm5saCk7CisJY2hhciAqa2luZCA9IGZpbmRfZHVtcF9raW5kKGNiLT5ubGgpOworCisJaWYgKGtpbmQgPT0gTlVMTCkgeworCQlwcmludGsoInRjX2R1bXBfYWN0aW9uOiBhY3Rpb24gYmFkIGtpbmRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlhX28gPSB0Y19sb29rdXBfYWN0aW9uX24oa2luZCk7CisJaWYgKGFfbyA9PSBOVUxMKSB7CisJCXByaW50aygiZmFpbGVkIHRvIGZpbmQgJXNcbiIsIGtpbmQpOworCQlyZXR1cm4gMDsKKwl9CisKKwltZW1zZXQoJmEsIDAsIHNpemVvZihzdHJ1Y3QgdGNfYWN0aW9uKSk7CisJYS5vcHMgPSBhX287CisKKwlpZiAoYV9vLT53YWxrID09IE5VTEwpIHsKKwkJcHJpbnRrKCJ0Y19kdW1wX2FjdGlvbjogJXMgIWNhcGFibGUgb2YgZHVtcGluZyB0YWJsZVxuIiwga2luZCk7CisJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CisJfQorCisJbmxoID0gTkxNU0dfUFVUKHNrYiwgTkVUTElOS19DQihjYi0+c2tiKS5waWQsIGNiLT5ubGgtPm5sbXNnX3NlcSwKKwkgICAgICAgICAgICAgICAgY2ItPm5saC0+bmxtc2dfdHlwZSwgc2l6ZW9mKCp0KSk7CisJdCA9IE5MTVNHX0RBVEEobmxoKTsKKwl0LT50Y2FfZmFtaWx5ID0gQUZfVU5TUEVDOworCisJeCA9IChzdHJ1Y3QgcnRhdHRyICopIHNrYi0+dGFpbDsKKwlSVEFfUFVUKHNrYiwgVENBX0FDVF9UQUIsIDAsIE5VTEwpOworCisJcmV0ID0gYV9vLT53YWxrKHNrYiwgY2IsIFJUTV9HRVRBQ1RJT04sICZhKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBydGF0dHJfZmFpbHVyZTsKKworCWlmIChyZXQgPiAwKSB7CisJCXgtPnJ0YV9sZW4gPSBza2ItPnRhaWwgLSAodTggKikgeDsKKwkJcmV0ID0gc2tiLT5sZW47CisJfSBlbHNlCisJCXNrYl90cmltKHNrYiwgKHU4Kil4IC0gc2tiLT5kYXRhKTsKKworCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlpZiAoTkVUTElOS19DQihjYi0+c2tiKS5waWQgJiYgcmV0KQorCQlubGgtPm5sbXNnX2ZsYWdzIHw9IE5MTV9GX01VTFRJOworCW1vZHVsZV9wdXQoYV9vLT5vd25lcik7CisJcmV0dXJuIHNrYi0+bGVuOworCitydGF0dHJfZmFpbHVyZToKK25sbXNnX2ZhaWx1cmU6CisJbW9kdWxlX3B1dChhX28tPm93bmVyKTsKKwlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCXJldHVybiBza2ItPmxlbjsKK30KKworc3RhdGljIGludCBfX2luaXQgdGNfYWN0aW9uX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcnRuZXRsaW5rX2xpbmsgKmxpbmtfcCA9IHJ0bmV0bGlua19saW5rc1tQRl9VTlNQRUNdOworCisJaWYgKGxpbmtfcCkgeworCQlsaW5rX3BbUlRNX05FV0FDVElPTi1SVE1fQkFTRV0uZG9pdCA9IHRjX2N0bF9hY3Rpb247CisJCWxpbmtfcFtSVE1fREVMQUNUSU9OLVJUTV9CQVNFXS5kb2l0ID0gdGNfY3RsX2FjdGlvbjsKKwkJbGlua19wW1JUTV9HRVRBQ1RJT04tUlRNX0JBU0VdLmRvaXQgPSB0Y19jdGxfYWN0aW9uOworCQlsaW5rX3BbUlRNX0dFVEFDVElPTi1SVE1fQkFTRV0uZHVtcGl0ID0gdGNfZHVtcF9hY3Rpb247CisJfQorCisJcHJpbnRrKCJUQyBjbGFzc2lmaWVyIGFjdGlvbiAoYnVncyB0byBuZXRkZXZAb3NzLnNnaS5jb20gY2MgIgorCSAgICAgICAiaGFkaUBjeWJlcnVzLmNhKVxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N1YnN5c19pbml0Y2FsbCh0Y19hY3Rpb25faW5pdCk7CisKK0VYUE9SVF9TWU1CT0wodGNmX3JlZ2lzdGVyX2FjdGlvbik7CitFWFBPUlRfU1lNQk9MKHRjZl91bnJlZ2lzdGVyX2FjdGlvbik7CitFWFBPUlRfU1lNQk9MKHRjZl9hY3Rpb25fZXhlYyk7CitFWFBPUlRfU1lNQk9MKHRjZl9hY3Rpb25fZHVtcF8xKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfYXBpLmMgYi9uZXQvc2NoZWQvY2xzX2FwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZTY2YzMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2NoZWQvY2xzX2FwaS5jCkBAIC0wLDAgKzEsNjQyIEBACisvKgorICogbmV0L3NjaGVkL2Nsc19hcGkuYwlQYWNrZXQgY2xhc3NpZmllciBBUEkuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqIENoYW5nZXM6CisgKgorICogRWR1YXJkbyBKLiBCbGFuY28gPGVqYnNAbmV0bGFicy5jb20udXk+IDo5OTAyMjI6IGttb2Qgc3VwcG9ydAorICoKKyAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgorI2luY2x1ZGUgPG5ldC9wa3RfY2xzLmg+CisKKyNpZiAwIC8qIGNvbnRyb2wgKi8KKyNkZWZpbmUgRFBSSU5USyhmb3JtYXQsYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0LCMjYXJncykKKyNlbHNlCisjZGVmaW5lIERQUklOVEsoZm9ybWF0LGFyZ3MuLi4pCisjZW5kaWYKKworLyogVGhlIGxpc3Qgb2YgYWxsIGluc3RhbGxlZCBjbGFzc2lmaWVyIHR5cGVzICovCisKK3N0YXRpYyBzdHJ1Y3QgdGNmX3Byb3RvX29wcyAqdGNmX3Byb3RvX2Jhc2U7CisKKy8qIFByb3RlY3RzIGxpc3Qgb2YgcmVnaXN0ZXJlZCBUQyBtb2R1bGVzLiBJdCBpcyBwdXJlIFNNUCBsb2NrLiAqLworc3RhdGljIERFRklORV9SV0xPQ0soY2xzX21vZF9sb2NrKTsKKworLyogRmluZCBjbGFzc2lmaWVyIHR5cGUgYnkgc3RyaW5nIG5hbWUgKi8KKworc3RhdGljIHN0cnVjdCB0Y2ZfcHJvdG9fb3BzICogdGNmX3Byb3RvX2xvb2t1cF9vcHMoc3RydWN0IHJ0YXR0ciAqa2luZCkKK3sKKwlzdHJ1Y3QgdGNmX3Byb3RvX29wcyAqdCA9IE5VTEw7CisKKwlpZiAoa2luZCkgeworCQlyZWFkX2xvY2soJmNsc19tb2RfbG9jayk7CisJCWZvciAodCA9IHRjZl9wcm90b19iYXNlOyB0OyB0ID0gdC0+bmV4dCkgeworCQkJaWYgKHJ0YXR0cl9zdHJjbXAoa2luZCwgdC0+a2luZCkgPT0gMCkgeworCQkJCWlmICghdHJ5X21vZHVsZV9nZXQodC0+b3duZXIpKQorCQkJCQl0ID0gTlVMTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZWFkX3VubG9jaygmY2xzX21vZF9sb2NrKTsKKwl9CisJcmV0dXJuIHQ7Cit9CisKKy8qIFJlZ2lzdGVyKHVucmVnaXN0ZXIpIG5ldyBjbGFzc2lmaWVyIHR5cGUgKi8KKworaW50IHJlZ2lzdGVyX3RjZl9wcm90b19vcHMoc3RydWN0IHRjZl9wcm90b19vcHMgKm9wcykKK3sKKwlzdHJ1Y3QgdGNmX3Byb3RvX29wcyAqdCwgKip0cDsKKwlpbnQgcmMgPSAtRUVYSVNUOworCisJd3JpdGVfbG9jaygmY2xzX21vZF9sb2NrKTsKKwlmb3IgKHRwID0gJnRjZl9wcm90b19iYXNlOyAodCA9ICp0cCkgIT0gTlVMTDsgdHAgPSAmdC0+bmV4dCkKKwkJaWYgKCFzdHJjbXAob3BzLT5raW5kLCB0LT5raW5kKSkKKwkJCWdvdG8gb3V0OworCisJb3BzLT5uZXh0ID0gTlVMTDsKKwkqdHAgPSBvcHM7CisJcmMgPSAwOworb3V0OgorCXdyaXRlX3VubG9jaygmY2xzX21vZF9sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCB1bnJlZ2lzdGVyX3RjZl9wcm90b19vcHMoc3RydWN0IHRjZl9wcm90b19vcHMgKm9wcykKK3sKKwlzdHJ1Y3QgdGNmX3Byb3RvX29wcyAqdCwgKip0cDsKKwlpbnQgcmMgPSAtRU5PRU5UOworCisJd3JpdGVfbG9jaygmY2xzX21vZF9sb2NrKTsKKwlmb3IgKHRwID0gJnRjZl9wcm90b19iYXNlOyAodD0qdHApICE9IE5VTEw7IHRwID0gJnQtPm5leHQpCisJCWlmICh0ID09IG9wcykKKwkJCWJyZWFrOworCisJaWYgKCF0KQorCQlnb3RvIG91dDsKKwkqdHAgPSB0LT5uZXh0OworCXJjID0gMDsKK291dDoKKwl3cml0ZV91bmxvY2soJmNsc19tb2RfbG9jayk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHRmaWx0ZXJfbm90aWZ5KHN0cnVjdCBza19idWZmICpvc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sCisJCQkgIHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1bnNpZ25lZCBsb25nIGZoLCBpbnQgZXZlbnQpOworCisKKy8qIFNlbGVjdCBuZXcgcHJpbyB2YWx1ZSBmcm9tIHRoZSByYW5nZSwgbWFuYWdlZCBieSBrZXJuZWwuICovCisKK3N0YXRpYyBfX2lubGluZV9fIHUzMiB0Y2ZfYXV0b19wcmlvKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwKQoreworCXUzMiBmaXJzdCA9IFRDX0hfTUFLRSgweEMwMDAwMDAwVSwwVSk7CisKKwlpZiAodHApCisJCWZpcnN0ID0gdHAtPnByaW8tMTsKKworCXJldHVybiBmaXJzdDsKK30KKworLyogQWRkL2NoYW5nZS9kZWxldGUvZ2V0IGEgZmlsdGVyIG5vZGUgKi8KKworc3RhdGljIGludCB0Y19jdGxfdGZpbHRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcnRhdHRyICoqdGNhOworCXN0cnVjdCB0Y21zZyAqdDsKKwl1MzIgcHJvdG9jb2w7CisJdTMyIHByaW87CisJdTMyIG5wcmlvOworCXUzMiBwYXJlbnQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgUWRpc2MgICpxOworCXN0cnVjdCB0Y2ZfcHJvdG8gKipiYWNrLCAqKmNoYWluOworCXN0cnVjdCB0Y2ZfcHJvdG8gKnRwOworCXN0cnVjdCB0Y2ZfcHJvdG9fb3BzICp0cF9vcHM7CisJc3RydWN0IFFkaXNjX2NsYXNzX29wcyAqY29wczsKKwl1bnNpZ25lZCBsb25nIGNsOworCXVuc2lnbmVkIGxvbmcgZmg7CisJaW50IGVycjsKKworcmVwbGF5OgorCXRjYSA9IGFyZzsKKwl0ID0gTkxNU0dfREFUQShuKTsKKwlwcm90b2NvbCA9IFRDX0hfTUlOKHQtPnRjbV9pbmZvKTsKKwlwcmlvID0gVENfSF9NQUoodC0+dGNtX2luZm8pOworCW5wcmlvID0gcHJpbzsKKwlwYXJlbnQgPSB0LT50Y21fcGFyZW50OworCWNsID0gMDsKKworCWlmIChwcmlvID09IDApIHsKKwkJLyogSWYgbm8gcHJpb3JpdHkgaXMgZ2l2ZW4sIHVzZXIgd2FudHMgd2UgYWxsb2NhdGVkIGl0LiAqLworCQlpZiAobi0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXVEZJTFRFUiB8fCAhKG4tPm5sbXNnX2ZsYWdzJk5MTV9GX0NSRUFURSkpCisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJcHJpbyA9IFRDX0hfTUFLRSgweDgwMDAwMDAwVSwwVSk7CisJfQorCisJLyogRmluZCBoZWFkIG9mIGZpbHRlciBjaGFpbi4gKi8KKworCS8qIEZpbmQgbGluayAqLworCWlmICgoZGV2ID0gX19kZXZfZ2V0X2J5X2luZGV4KHQtPnRjbV9pZmluZGV4KSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBGaW5kIHFkaXNjICovCisJaWYgKCFwYXJlbnQpIHsKKwkJcSA9IGRldi0+cWRpc2Nfc2xlZXBpbmc7CisJCXBhcmVudCA9IHEtPmhhbmRsZTsKKwl9IGVsc2UgaWYgKChxID0gcWRpc2NfbG9va3VwKGRldiwgVENfSF9NQUoodC0+dGNtX3BhcmVudCkpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIElzIGl0IGNsYXNzZnVsPyAqLworCWlmICgoY29wcyA9IHEtPm9wcy0+Y2xfb3BzKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIERvIHdlIHNlYXJjaCBmb3IgZmlsdGVyLCBhdHRhY2hlZCB0byBjbGFzcz8gKi8KKwlpZiAoVENfSF9NSU4ocGFyZW50KSkgeworCQljbCA9IGNvcHMtPmdldChxLCBwYXJlbnQpOworCQlpZiAoY2wgPT0gMCkKKwkJCXJldHVybiAtRU5PRU5UOworCX0KKworCS8qIEFuZCB0aGUgbGFzdCBzdHJva2UgKi8KKwljaGFpbiA9IGNvcHMtPnRjZl9jaGFpbihxLCBjbCk7CisJZXJyID0gLUVJTlZBTDsKKwlpZiAoY2hhaW4gPT0gTlVMTCkKKwkJZ290byBlcnJvdXQ7CisKKwkvKiBDaGVjayB0aGUgY2hhaW4gZm9yIGV4aXN0ZW5jZSBvZiBwcm90by10Y2Ygd2l0aCB0aGlzIHByaW9yaXR5ICovCisJZm9yIChiYWNrID0gY2hhaW47ICh0cD0qYmFjaykgIT0gTlVMTDsgYmFjayA9ICZ0cC0+bmV4dCkgeworCQlpZiAodHAtPnByaW8gPj0gcHJpbykgeworCQkJaWYgKHRwLT5wcmlvID09IHByaW8pIHsKKwkJCQlpZiAoIW5wcmlvIHx8ICh0cC0+cHJvdG9jb2wgIT0gcHJvdG9jb2wgJiYgcHJvdG9jb2wpKQorCQkJCQlnb3RvIGVycm91dDsKKwkJCX0gZWxzZQorCQkJCXRwID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHRwID09IE5VTEwpIHsKKwkJLyogUHJvdG8tdGNmIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgbmV3IG9uZSAqLworCisJCWlmICh0Y2FbVENBX0tJTkQtMV0gPT0gTlVMTCB8fCAhcHJvdG9jb2wpCisJCQlnb3RvIGVycm91dDsKKworCQllcnIgPSAtRU5PRU5UOworCQlpZiAobi0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXVEZJTFRFUiB8fCAhKG4tPm5sbXNnX2ZsYWdzJk5MTV9GX0NSRUFURSkpCisJCQlnb3RvIGVycm91dDsKKworCisJCS8qIENyZWF0ZSBuZXcgcHJvdG8gdGNmICovCisKKwkJZXJyID0gLUVOT0JVRlM7CisJCWlmICgodHAgPSBrbWFsbG9jKHNpemVvZigqdHApLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJCWdvdG8gZXJyb3V0OworCQllcnIgPSAtRUlOVkFMOworCQl0cF9vcHMgPSB0Y2ZfcHJvdG9fbG9va3VwX29wcyh0Y2FbVENBX0tJTkQtMV0pOworCQlpZiAodHBfb3BzID09IE5VTEwpIHsKKyNpZmRlZiBDT05GSUdfS01PRAorCQkJc3RydWN0IHJ0YXR0ciAqa2luZCA9IHRjYVtUQ0FfS0lORC0xXTsKKwkJCWNoYXIgbmFtZVtJRk5BTVNJWl07CisKKwkJCWlmIChraW5kICE9IE5VTEwgJiYKKwkJCSAgICBydGF0dHJfc3RybGNweShuYW1lLCBraW5kLCBJRk5BTVNJWikgPCBJRk5BTVNJWikgeworCQkJCXJ0bmxfdW5sb2NrKCk7CisJCQkJcmVxdWVzdF9tb2R1bGUoImNsc18lcyIsIG5hbWUpOworCQkJCXJ0bmxfbG9jaygpOworCQkJCXRwX29wcyA9IHRjZl9wcm90b19sb29rdXBfb3BzKGtpbmQpOworCQkJCS8qIFdlIGRyb3BwZWQgdGhlIFJUTkwgc2VtYXBob3JlIGluIG9yZGVyIHRvCisJCQkJICogcGVyZm9ybSB0aGUgbW9kdWxlIGxvYWQuICBTbywgZXZlbiBpZiB3ZQorCQkJCSAqIHN1Y2NlZWRlZCBpbiBsb2FkaW5nIHRoZSBtb2R1bGUgd2UgaGF2ZSB0bworCQkJCSAqIHJlcGxheSB0aGUgcmVxdWVzdC4gIFdlIGluZGljYXRlIHRoaXMgdXNpbmcKKwkJCQkgKiAtRUFHQUlOLgorCQkJCSAqLworCQkJCWlmICh0cF9vcHMgIT0gTlVMTCkgeworCQkJCQltb2R1bGVfcHV0KHRwX29wcy0+b3duZXIpOworCQkJCQllcnIgPSAtRUFHQUlOOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQkJa2ZyZWUodHApOworCQkJZ290byBlcnJvdXQ7CisJCX0KKwkJbWVtc2V0KHRwLCAwLCBzaXplb2YoKnRwKSk7CisJCXRwLT5vcHMgPSB0cF9vcHM7CisJCXRwLT5wcm90b2NvbCA9IHByb3RvY29sOworCQl0cC0+cHJpbyA9IG5wcmlvID8gOiB0Y2ZfYXV0b19wcmlvKCpiYWNrKTsKKwkJdHAtPnEgPSBxOworCQl0cC0+Y2xhc3NpZnkgPSB0cF9vcHMtPmNsYXNzaWZ5OworCQl0cC0+Y2xhc3NpZCA9IHBhcmVudDsKKwkJaWYgKChlcnIgPSB0cF9vcHMtPmluaXQodHApKSAhPSAwKSB7CisJCQltb2R1bGVfcHV0KHRwX29wcy0+b3duZXIpOworCQkJa2ZyZWUodHApOworCQkJZ290byBlcnJvdXQ7CisJCX0KKworCQlxZGlzY19sb2NrX3RyZWUoZGV2KTsKKwkJdHAtPm5leHQgPSAqYmFjazsKKwkJKmJhY2sgPSB0cDsKKwkJcWRpc2NfdW5sb2NrX3RyZWUoZGV2KTsKKworCX0gZWxzZSBpZiAodGNhW1RDQV9LSU5ELTFdICYmIHJ0YXR0cl9zdHJjbXAodGNhW1RDQV9LSU5ELTFdLCB0cC0+b3BzLT5raW5kKSkKKwkJZ290byBlcnJvdXQ7CisKKwlmaCA9IHRwLT5vcHMtPmdldCh0cCwgdC0+dGNtX2hhbmRsZSk7CisKKwlpZiAoZmggPT0gMCkgeworCQlpZiAobi0+bmxtc2dfdHlwZSA9PSBSVE1fREVMVEZJTFRFUiAmJiB0LT50Y21faGFuZGxlID09IDApIHsKKwkJCXFkaXNjX2xvY2tfdHJlZShkZXYpOworCQkJKmJhY2sgPSB0cC0+bmV4dDsKKwkJCXFkaXNjX3VubG9ja190cmVlKGRldik7CisKKwkJCXRmaWx0ZXJfbm90aWZ5KHNrYiwgbiwgdHAsIGZoLCBSVE1fREVMVEZJTFRFUik7CisJCQl0Y2ZfZGVzdHJveSh0cCk7CisJCQllcnIgPSAwOworCQkJZ290byBlcnJvdXQ7CisJCX0KKworCQllcnIgPSAtRU5PRU5UOworCQlpZiAobi0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXVEZJTFRFUiB8fCAhKG4tPm5sbXNnX2ZsYWdzJk5MTV9GX0NSRUFURSkpCisJCQlnb3RvIGVycm91dDsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKG4tPm5sbXNnX3R5cGUpIHsKKwkJY2FzZSBSVE1fTkVXVEZJTFRFUjoJCisJCQllcnIgPSAtRUVYSVNUOworCQkJaWYgKG4tPm5sbXNnX2ZsYWdzJk5MTV9GX0VYQ0wpCisJCQkJZ290byBlcnJvdXQ7CisJCQlicmVhazsKKwkJY2FzZSBSVE1fREVMVEZJTFRFUjoKKwkJCWVyciA9IHRwLT5vcHMtPmRlbGV0ZSh0cCwgZmgpOworCQkJaWYgKGVyciA9PSAwKQorCQkJCXRmaWx0ZXJfbm90aWZ5KHNrYiwgbiwgdHAsIGZoLCBSVE1fREVMVEZJTFRFUik7CisJCQlnb3RvIGVycm91dDsKKwkJY2FzZSBSVE1fR0VUVEZJTFRFUjoKKwkJCWVyciA9IHRmaWx0ZXJfbm90aWZ5KHNrYiwgbiwgdHAsIGZoLCBSVE1fTkVXVEZJTFRFUik7CisJCQlnb3RvIGVycm91dDsKKwkJZGVmYXVsdDoKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIGVycm91dDsKKwkJfQorCX0KKworCWVyciA9IHRwLT5vcHMtPmNoYW5nZSh0cCwgY2wsIHQtPnRjbV9oYW5kbGUsIHRjYSwgJmZoKTsKKwlpZiAoZXJyID09IDApCisJCXRmaWx0ZXJfbm90aWZ5KHNrYiwgbiwgdHAsIGZoLCBSVE1fTkVXVEZJTFRFUik7CisKK2Vycm91dDoKKwlpZiAoY2wpCisJCWNvcHMtPnB1dChxLCBjbCk7CisJaWYgKGVyciA9PSAtRUFHQUlOKQorCQkvKiBSZXBsYXkgdGhlIHJlcXVlc3QuICovCisJCWdvdG8gcmVwbGF5OworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK3RjZl9maWxsX25vZGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgZmgsCisJICAgICAgdTMyIHBpZCwgdTMyIHNlcSwgdW5zaWduZWQgZmxhZ3MsIGludCBldmVudCkKK3sKKwlzdHJ1Y3QgdGNtc2cgKnRjbTsKKwlzdHJ1Y3Qgbmxtc2doZHIgICpubGg7CisJdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisKKwlubGggPSBOTE1TR19QVVQoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqdGNtKSk7CisJbmxoLT5ubG1zZ19mbGFncyA9IGZsYWdzOworCXRjbSA9IE5MTVNHX0RBVEEobmxoKTsKKwl0Y20tPnRjbV9mYW1pbHkgPSBBRl9VTlNQRUM7CisJdGNtLT50Y21faWZpbmRleCA9IHRwLT5xLT5kZXYtPmlmaW5kZXg7CisJdGNtLT50Y21fcGFyZW50ID0gdHAtPmNsYXNzaWQ7CisJdGNtLT50Y21faW5mbyA9IFRDX0hfTUFLRSh0cC0+cHJpbywgdHAtPnByb3RvY29sKTsKKwlSVEFfUFVUKHNrYiwgVENBX0tJTkQsIElGTkFNU0laLCB0cC0+b3BzLT5raW5kKTsKKwl0Y20tPnRjbV9oYW5kbGUgPSBmaDsKKwlpZiAoUlRNX0RFTFRGSUxURVIgIT0gZXZlbnQpIHsKKwkJdGNtLT50Y21faGFuZGxlID0gMDsKKwkJaWYgKHRwLT5vcHMtPmR1bXAgJiYgdHAtPm9wcy0+ZHVtcCh0cCwgZmgsIHNrYiwgdGNtKSA8IDApCisJCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOworCX0KKwlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJcmV0dXJuIHNrYi0+bGVuOworCitubG1zZ19mYWlsdXJlOgorcnRhdHRyX2ZhaWx1cmU6CisJc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgdGZpbHRlcl9ub3RpZnkoc3RydWN0IHNrX2J1ZmYgKm9za2IsIHN0cnVjdCBubG1zZ2hkciAqbiwKKwkJCSAgc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgZmgsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUzMiBwaWQgPSBvc2tiID8gTkVUTElOS19DQihvc2tiKS5waWQgOiAwOworCisJc2tiID0gYWxsb2Nfc2tiKE5MTVNHX0dPT0RTSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJaWYgKHRjZl9maWxsX25vZGUoc2tiLCB0cCwgZmgsIHBpZCwgbi0+bmxtc2dfc2VxLCAwLCBldmVudCkgPD0gMCkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJ0bmV0bGlua19zZW5kKHNrYiwgcGlkLCBSVE1HUlBfVEMsIG4tPm5sbXNnX2ZsYWdzJk5MTV9GX0VDSE8pOworfQorCitzdHJ1Y3QgdGNmX2R1bXBfYXJncworeworCXN0cnVjdCB0Y2Zfd2Fsa2VyIHc7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2I7Cit9OworCitzdGF0aWMgaW50IHRjZl9ub2RlX2R1bXAoc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgbiwgc3RydWN0IHRjZl93YWxrZXIgKmFyZykKK3sKKwlzdHJ1Y3QgdGNmX2R1bXBfYXJncyAqYSA9ICh2b2lkKilhcmc7CisKKwlyZXR1cm4gdGNmX2ZpbGxfbm9kZShhLT5za2IsIHRwLCBuLCBORVRMSU5LX0NCKGEtPmNiLT5za2IpLnBpZCwKKwkJCSAgICAgYS0+Y2ItPm5saC0+bmxtc2dfc2VxLCBOTE1fRl9NVUxUSSwgUlRNX05FV1RGSUxURVIpOworfQorCitzdGF0aWMgaW50IHRjX2R1bXBfdGZpbHRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJaW50IHQ7CisJaW50IHNfdDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBRZGlzYyAqcTsKKwlzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgKipjaGFpbjsKKwlzdHJ1Y3QgdGNtc2cgKnRjbSA9IChzdHJ1Y3QgdGNtc2cqKU5MTVNHX0RBVEEoY2ItPm5saCk7CisJdW5zaWduZWQgbG9uZyBjbCA9IDA7CisJc3RydWN0IFFkaXNjX2NsYXNzX29wcyAqY29wczsKKwlzdHJ1Y3QgdGNmX2R1bXBfYXJncyBhcmc7CisKKwlpZiAoY2ItPm5saC0+bmxtc2dfbGVuIDwgTkxNU0dfTEVOR1RIKHNpemVvZigqdGNtKSkpCisJCXJldHVybiBza2ItPmxlbjsKKwlpZiAoKGRldiA9IGRldl9nZXRfYnlfaW5kZXgodGNtLT50Y21faWZpbmRleCkpID09IE5VTEwpCisJCXJldHVybiBza2ItPmxlbjsKKworCXJlYWRfbG9ja19iaCgmcWRpc2NfdHJlZV9sb2NrKTsKKwlpZiAoIXRjbS0+dGNtX3BhcmVudCkKKwkJcSA9IGRldi0+cWRpc2Nfc2xlZXBpbmc7CisJZWxzZQorCQlxID0gcWRpc2NfbG9va3VwKGRldiwgVENfSF9NQUoodGNtLT50Y21fcGFyZW50KSk7CisJaWYgKCFxKQorCQlnb3RvIG91dDsKKwlpZiAoKGNvcHMgPSBxLT5vcHMtPmNsX29wcykgPT0gTlVMTCkKKwkJZ290byBlcnJvdXQ7CisJaWYgKFRDX0hfTUlOKHRjbS0+dGNtX3BhcmVudCkpIHsKKwkJY2wgPSBjb3BzLT5nZXQocSwgdGNtLT50Y21fcGFyZW50KTsKKwkJaWYgKGNsID09IDApCisJCQlnb3RvIGVycm91dDsKKwl9CisJY2hhaW4gPSBjb3BzLT50Y2ZfY2hhaW4ocSwgY2wpOworCWlmIChjaGFpbiA9PSBOVUxMKQorCQlnb3RvIGVycm91dDsKKworCXNfdCA9IGNiLT5hcmdzWzBdOworCisJZm9yICh0cD0qY2hhaW4sIHQ9MDsgdHA7IHRwID0gdHAtPm5leHQsIHQrKykgeworCQlpZiAodCA8IHNfdCkgY29udGludWU7CisJCWlmIChUQ19IX01BSih0Y20tPnRjbV9pbmZvKSAmJgorCQkgICAgVENfSF9NQUoodGNtLT50Y21faW5mbykgIT0gdHAtPnByaW8pCisJCQljb250aW51ZTsKKwkJaWYgKFRDX0hfTUlOKHRjbS0+dGNtX2luZm8pICYmCisJCSAgICBUQ19IX01JTih0Y20tPnRjbV9pbmZvKSAhPSB0cC0+cHJvdG9jb2wpCisJCQljb250aW51ZTsKKwkJaWYgKHQgPiBzX3QpCisJCQltZW1zZXQoJmNiLT5hcmdzWzFdLCAwLCBzaXplb2YoY2ItPmFyZ3MpLXNpemVvZihjYi0+YXJnc1swXSkpOworCQlpZiAoY2ItPmFyZ3NbMV0gPT0gMCkgeworCQkJaWYgKHRjZl9maWxsX25vZGUoc2tiLCB0cCwgMCwgTkVUTElOS19DQihjYi0+c2tiKS5waWQsCisJCQkJCSAgY2ItPm5saC0+bmxtc2dfc2VxLCBOTE1fRl9NVUxUSSwgUlRNX05FV1RGSUxURVIpIDw9IDApIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNiLT5hcmdzWzFdID0gMTsKKwkJfQorCQlpZiAodHAtPm9wcy0+d2FsayA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWFyZy53LmZuID0gdGNmX25vZGVfZHVtcDsKKwkJYXJnLnNrYiA9IHNrYjsKKwkJYXJnLmNiID0gY2I7CisJCWFyZy53LnN0b3AgPSAwOworCQlhcmcudy5za2lwID0gY2ItPmFyZ3NbMV0tMTsKKwkJYXJnLncuY291bnQgPSAwOworCQl0cC0+b3BzLT53YWxrKHRwLCAmYXJnLncpOworCQljYi0+YXJnc1sxXSA9IGFyZy53LmNvdW50KzE7CisJCWlmIChhcmcudy5zdG9wKQorCQkJYnJlYWs7CisJfQorCisJY2ItPmFyZ3NbMF0gPSB0OworCitlcnJvdXQ6CisJaWYgKGNsKQorCQljb3BzLT5wdXQocSwgY2wpOworb3V0OgorCXJlYWRfdW5sb2NrX2JoKCZxZGlzY190cmVlX2xvY2spOworCWRldl9wdXQoZGV2KTsKKwlyZXR1cm4gc2tiLT5sZW47Cit9CisKK3ZvaWQKK3RjZl9leHRzX2Rlc3Ryb3koc3RydWN0IHRjZl9wcm90byAqdHAsIHN0cnVjdCB0Y2ZfZXh0cyAqZXh0cykKK3sKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKKwlpZiAoZXh0cy0+YWN0aW9uKSB7CisJCXRjZl9hY3Rpb25fZGVzdHJveShleHRzLT5hY3Rpb24sIFRDQV9BQ1RfVU5CSU5EKTsKKwkJZXh0cy0+YWN0aW9uID0gTlVMTDsKKwl9CisjZWxpZiBkZWZpbmVkIENPTkZJR19ORVRfQ0xTX1BPTElDRQorCWlmIChleHRzLT5wb2xpY2UpIHsKKwkJdGNmX3BvbGljZV9yZWxlYXNlKGV4dHMtPnBvbGljZSwgVENBX0FDVF9VTkJJTkQpOworCQlleHRzLT5wb2xpY2UgPSBOVUxMOworCX0KKyNlbmRpZgorfQorCisKK2ludAordGNmX2V4dHNfdmFsaWRhdGUoc3RydWN0IHRjZl9wcm90byAqdHAsIHN0cnVjdCBydGF0dHIgKip0YiwKKwkgICAgICAgICAgc3RydWN0IHJ0YXR0ciAqcmF0ZV90bHYsIHN0cnVjdCB0Y2ZfZXh0cyAqZXh0cywKKwkgICAgICAgICAgc3RydWN0IHRjZl9leHRfbWFwICptYXApCit7CisJbWVtc2V0KGV4dHMsIDAsIHNpemVvZigqZXh0cykpOworCQorI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAorCXsKKwkJaW50IGVycjsKKwkJc3RydWN0IHRjX2FjdGlvbiAqYWN0OworCisJCWlmIChtYXAtPnBvbGljZSAmJiB0YlttYXAtPnBvbGljZS0xXSkgeworCQkJYWN0ID0gdGNmX2FjdGlvbl9pbml0XzEodGJbbWFwLT5wb2xpY2UtMV0sIHJhdGVfdGx2LCAicG9saWNlIiwKKwkJCQlUQ0FfQUNUX05PUkVQTEFDRSwgVENBX0FDVF9CSU5ELCAmZXJyKTsKKwkJCWlmIChhY3QgPT0gTlVMTCkKKwkJCQlyZXR1cm4gZXJyOworCisJCQlhY3QtPnR5cGUgPSBUQ0FfT0xEX0NPTVBBVDsKKwkJCWV4dHMtPmFjdGlvbiA9IGFjdDsKKwkJfSBlbHNlIGlmIChtYXAtPmFjdGlvbiAmJiB0YlttYXAtPmFjdGlvbi0xXSkgeworCQkJYWN0ID0gdGNmX2FjdGlvbl9pbml0KHRiW21hcC0+YWN0aW9uLTFdLCByYXRlX3RsdiwgTlVMTCwKKwkJCQlUQ0FfQUNUX05PUkVQTEFDRSwgVENBX0FDVF9CSU5ELCAmZXJyKTsKKwkJCWlmIChhY3QgPT0gTlVMTCkKKwkJCQlyZXR1cm4gZXJyOworCisJCQlleHRzLT5hY3Rpb24gPSBhY3Q7CisJCX0KKwl9CisjZWxpZiBkZWZpbmVkIENPTkZJR19ORVRfQ0xTX1BPTElDRQorCWlmIChtYXAtPnBvbGljZSAmJiB0YlttYXAtPnBvbGljZS0xXSkgeworCQlzdHJ1Y3QgdGNmX3BvbGljZSAqcDsKKwkJCisJCXAgPSB0Y2ZfcG9saWNlX2xvY2F0ZSh0YlttYXAtPnBvbGljZS0xXSwgcmF0ZV90bHYpOworCQlpZiAocCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJZXh0cy0+cG9saWNlID0gcDsKKwl9IGVsc2UgaWYgKG1hcC0+YWN0aW9uICYmIHRiW21hcC0+YWN0aW9uLTFdKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisjZWxzZQorCWlmICgobWFwLT5hY3Rpb24gJiYgdGJbbWFwLT5hY3Rpb24tMV0pIHx8CisJICAgIChtYXAtPnBvbGljZSAmJiB0YlttYXAtPnBvbGljZS0xXSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK3RjZl9leHRzX2NoYW5nZShzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgc3RydWN0IHRjZl9leHRzICpkc3QsCisJICAgICAgICBzdHJ1Y3QgdGNmX2V4dHMgKnNyYykKK3sKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKKwlpZiAoc3JjLT5hY3Rpb24pIHsKKwkJc3RydWN0IHRjX2FjdGlvbiAqYWN0OworCQl0Y2ZfdHJlZV9sb2NrKHRwKTsKKwkJYWN0ID0geGNoZygmZHN0LT5hY3Rpb24sIHNyYy0+YWN0aW9uKTsKKwkJdGNmX3RyZWVfdW5sb2NrKHRwKTsKKwkJaWYgKGFjdCkKKwkJCXRjZl9hY3Rpb25fZGVzdHJveShhY3QsIFRDQV9BQ1RfVU5CSU5EKTsKKwl9CisjZWxpZiBkZWZpbmVkIENPTkZJR19ORVRfQ0xTX1BPTElDRQorCWlmIChzcmMtPnBvbGljZSkgeworCQlzdHJ1Y3QgdGNmX3BvbGljZSAqcDsKKwkJdGNmX3RyZWVfbG9jayh0cCk7CisJCXAgPSB4Y2hnKCZkc3QtPnBvbGljZSwgc3JjLT5wb2xpY2UpOworCQl0Y2ZfdHJlZV91bmxvY2sodHApOworCQlpZiAocCkKKwkJCXRjZl9wb2xpY2VfcmVsZWFzZShwLCBUQ0FfQUNUX1VOQklORCk7CisJfQorI2VuZGlmCit9CisKK2ludAordGNmX2V4dHNfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNmX2V4dHMgKmV4dHMsCisJICAgICAgc3RydWN0IHRjZl9leHRfbWFwICptYXApCit7CisjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCisJaWYgKG1hcC0+YWN0aW9uICYmIGV4dHMtPmFjdGlvbikgeworCQkvKgorCQkgKiBhZ2FpbiBmb3IgYmFja3dhcmQgY29tcGF0aWJsZSBtb2RlIC0gd2Ugd2FudAorCQkgKiB0byB3b3JrIHdpdGggYm90aCBvbGQgYW5kIG5ldyBtb2RlcyBvZiBlbnRlcmluZworCQkgKiB0YyBkYXRhIGV2ZW4gaWYgaXByb3V0ZTIgIHdhcyBuZXdlciAtIGpocworCQkgKi8KKwkJc3RydWN0IHJ0YXR0ciAqIHBfcnRhID0gKHN0cnVjdCBydGF0dHIqKSBza2ItPnRhaWw7CisKKwkJaWYgKGV4dHMtPmFjdGlvbi0+dHlwZSAhPSBUQ0FfT0xEX0NPTVBBVCkgeworCQkJUlRBX1BVVChza2IsIG1hcC0+YWN0aW9uLCAwLCBOVUxMKTsKKwkJCWlmICh0Y2ZfYWN0aW9uX2R1bXAoc2tiLCBleHRzLT5hY3Rpb24sIDAsIDApIDwgMCkKKwkJCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOworCQkJcF9ydGEtPnJ0YV9sZW4gPSBza2ItPnRhaWwgLSAodTgqKXBfcnRhOworCQl9IGVsc2UgaWYgKG1hcC0+cG9saWNlKSB7CisJCQlSVEFfUFVUKHNrYiwgbWFwLT5wb2xpY2UsIDAsIE5VTEwpOworCQkJaWYgKHRjZl9hY3Rpb25fZHVtcF9vbGQoc2tiLCBleHRzLT5hY3Rpb24sIDAsIDApIDwgMCkKKwkJCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOworCQkJcF9ydGEtPnJ0YV9sZW4gPSBza2ItPnRhaWwgLSAodTgqKXBfcnRhOworCQl9CisJfQorI2VsaWYgZGVmaW5lZCBDT05GSUdfTkVUX0NMU19QT0xJQ0UKKwlpZiAobWFwLT5wb2xpY2UgJiYgZXh0cy0+cG9saWNlKSB7CisJCXN0cnVjdCBydGF0dHIgKiBwX3J0YSA9IChzdHJ1Y3QgcnRhdHRyKikgc2tiLT50YWlsOworCisJCVJUQV9QVVQoc2tiLCBtYXAtPnBvbGljZSwgMCwgTlVMTCk7CisKKwkJaWYgKHRjZl9wb2xpY2VfZHVtcChza2IsIGV4dHMtPnBvbGljZSkgPCAwKQorCQkJZ290byBydGF0dHJfZmFpbHVyZTsKKworCQlwX3J0YS0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtICh1OCopcF9ydGE7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7CitydGF0dHJfZmFpbHVyZTogX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpCisJcmV0dXJuIC0xOworfQorCitpbnQKK3RjZl9leHRzX2R1bXBfc3RhdHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjZl9leHRzICpleHRzLAorCSAgICAgICAgICAgIHN0cnVjdCB0Y2ZfZXh0X21hcCAqbWFwKQoreworI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAorCWlmIChleHRzLT5hY3Rpb24pCisJCWlmICh0Y2ZfYWN0aW9uX2NvcHlfc3RhdHMoc2tiLCBleHRzLT5hY3Rpb24sIDEpIDwgMCkKKwkJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CisjZWxpZiBkZWZpbmVkIENPTkZJR19ORVRfQ0xTX1BPTElDRQorCWlmIChleHRzLT5wb2xpY2UpCisJCWlmICh0Y2ZfcG9saWNlX2R1bXBfc3RhdHMoc2tiLCBleHRzLT5wb2xpY2UpIDwgMCkKKwkJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CisjZW5kaWYKKwlyZXR1cm4gMDsKK3J0YXR0cl9mYWlsdXJlOiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHRjX2ZpbHRlcl9pbml0KHZvaWQpCit7CisJc3RydWN0IHJ0bmV0bGlua19saW5rICpsaW5rX3AgPSBydG5ldGxpbmtfbGlua3NbUEZfVU5TUEVDXTsKKworCS8qIFNldHVwIHJ0bmV0bGluayBsaW5rcy4gSXQgaXMgbWFkZSBoZXJlIHRvIGF2b2lkCisJICAgZXhwb3J0aW5nIGxhcmdlIG51bWJlciBvZiBwdWJsaWMgc3ltYm9scy4KKwkgKi8KKworCWlmIChsaW5rX3ApIHsKKwkJbGlua19wW1JUTV9ORVdURklMVEVSLVJUTV9CQVNFXS5kb2l0ID0gdGNfY3RsX3RmaWx0ZXI7CisJCWxpbmtfcFtSVE1fREVMVEZJTFRFUi1SVE1fQkFTRV0uZG9pdCA9IHRjX2N0bF90ZmlsdGVyOworCQlsaW5rX3BbUlRNX0dFVFRGSUxURVItUlRNX0JBU0VdLmRvaXQgPSB0Y19jdGxfdGZpbHRlcjsKKwkJbGlua19wW1JUTV9HRVRURklMVEVSLVJUTV9CQVNFXS5kdW1waXQgPSB0Y19kdW1wX3RmaWx0ZXI7CisJfQorCXJldHVybiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwodGNfZmlsdGVyX2luaXQpOworCitFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX3RjZl9wcm90b19vcHMpOworRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX3RjZl9wcm90b19vcHMpOworRVhQT1JUX1NZTUJPTCh0Y2ZfZXh0c192YWxpZGF0ZSk7CitFWFBPUlRfU1lNQk9MKHRjZl9leHRzX2Rlc3Ryb3kpOworRVhQT1JUX1NZTUJPTCh0Y2ZfZXh0c19jaGFuZ2UpOworRVhQT1JUX1NZTUJPTCh0Y2ZfZXh0c19kdW1wKTsKK0VYUE9SVF9TWU1CT0wodGNmX2V4dHNfZHVtcF9zdGF0cyk7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX2Jhc2ljLmMgYi9uZXQvc2NoZWQvY2xzX2Jhc2ljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQyZDQ0MQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY2hlZC9jbHNfYmFzaWMuYwpAQCAtMCwwICsxLDMwMyBAQAorLyoKKyAqIG5ldC9zY2hlZC9jbHNfYmFzaWMuYwlCYXNpYyBQYWNrZXQgQ2xhc3NpZmllci4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglUaG9tYXMgR3JhZiA8dGdyYWZAc3V1Zy5jaD4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvYWN0X2FwaS5oPgorI2luY2x1ZGUgPG5ldC9wa3RfY2xzLmg+CisKK3N0cnVjdCBiYXNpY19oZWFkCit7CisJdTMyCQkJaGdlbmVyYXRvcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWZsaXN0OworfTsKKworc3RydWN0IGJhc2ljX2ZpbHRlcgoreworCXUzMgkJCWhhbmRsZTsKKwlzdHJ1Y3QgdGNmX2V4dHMJCWV4dHM7CisJc3RydWN0IHRjZl9lbWF0Y2hfdHJlZQllbWF0Y2hlczsKKwlzdHJ1Y3QgdGNmX3Jlc3VsdAlyZXM7CisJc3RydWN0IGxpc3RfaGVhZAlsaW5rOworfTsKKworc3RhdGljIHN0cnVjdCB0Y2ZfZXh0X21hcCBiYXNpY19leHRfbWFwID0geworCS5hY3Rpb24gPSBUQ0FfQkFTSUNfQUNULAorCS5wb2xpY2UgPSBUQ0FfQkFTSUNfUE9MSUNFCit9OworCitzdGF0aWMgaW50IGJhc2ljX2NsYXNzaWZ5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLAorCQkJICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQoreworCWludCByOworCXN0cnVjdCBiYXNpY19oZWFkICpoZWFkID0gKHN0cnVjdCBiYXNpY19oZWFkICopIHRwLT5yb290OworCXN0cnVjdCBiYXNpY19maWx0ZXIgKmY7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGYsICZoZWFkLT5mbGlzdCwgbGluaykgeworCQlpZiAoIXRjZl9lbV90cmVlX21hdGNoKHNrYiwgJmYtPmVtYXRjaGVzLCBOVUxMKSkKKwkJCWNvbnRpbnVlOworCQkqcmVzID0gZi0+cmVzOworCQlyID0gdGNmX2V4dHNfZXhlYyhza2IsICZmLT5leHRzLCByZXMpOworCQlpZiAociA8IDApCisJCQljb250aW51ZTsKKwkJcmV0dXJuIHI7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYmFzaWNfZ2V0KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1MzIgaGFuZGxlKQoreworCXVuc2lnbmVkIGxvbmcgbCA9IDBVTDsKKwlzdHJ1Y3QgYmFzaWNfaGVhZCAqaGVhZCA9IChzdHJ1Y3QgYmFzaWNfaGVhZCAqKSB0cC0+cm9vdDsKKwlzdHJ1Y3QgYmFzaWNfZmlsdGVyICpmOworCisJaWYgKGhlYWQgPT0gTlVMTCkKKwkJcmV0dXJuIDBVTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZiwgJmhlYWQtPmZsaXN0LCBsaW5rKQorCQlpZiAoZi0+aGFuZGxlID09IGhhbmRsZSkKKwkJCWwgPSAodW5zaWduZWQgbG9uZykgZjsKKworCXJldHVybiBsOworfQorCitzdGF0aWMgdm9pZCBiYXNpY19wdXQoc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgZikKK3sKK30KKworc3RhdGljIGludCBiYXNpY19pbml0KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmFzaWNfZGVsZXRlX2ZpbHRlcihzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKKwkJCQkgICAgICAgc3RydWN0IGJhc2ljX2ZpbHRlciAqZikKK3sKKwl0Y2ZfdW5iaW5kX2ZpbHRlcih0cCwgJmYtPnJlcyk7CisJdGNmX2V4dHNfZGVzdHJveSh0cCwgJmYtPmV4dHMpOworCXRjZl9lbV90cmVlX2Rlc3Ryb3kodHAsICZmLT5lbWF0Y2hlcyk7CisJa2ZyZWUoZik7Cit9CisKK3N0YXRpYyB2b2lkIGJhc2ljX2Rlc3Ryb3koc3RydWN0IHRjZl9wcm90byAqdHApCit7CisJc3RydWN0IGJhc2ljX2hlYWQgKmhlYWQgPSAoc3RydWN0IGJhc2ljX2hlYWQgKikgeGNoZygmdHAtPnJvb3QsIE5VTEwpOworCXN0cnVjdCBiYXNpY19maWx0ZXIgKmYsICpuOworCQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmLCBuLCAmaGVhZC0+Zmxpc3QsIGxpbmspIHsKKwkJbGlzdF9kZWwoJmYtPmxpbmspOworCQliYXNpY19kZWxldGVfZmlsdGVyKHRwLCBmKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYmFzaWNfZGVsZXRlKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYmFzaWNfaGVhZCAqaGVhZCA9IChzdHJ1Y3QgYmFzaWNfaGVhZCAqKSB0cC0+cm9vdDsKKwlzdHJ1Y3QgYmFzaWNfZmlsdGVyICp0LCAqZiA9IChzdHJ1Y3QgYmFzaWNfZmlsdGVyICopIGFyZzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJmhlYWQtPmZsaXN0LCBsaW5rKQorCQlpZiAodCA9PSBmKSB7CisJCQl0Y2ZfdHJlZV9sb2NrKHRwKTsKKwkJCWxpc3RfZGVsKCZ0LT5saW5rKTsKKwkJCXRjZl90cmVlX3VubG9jayh0cCk7CisJCQliYXNpY19kZWxldGVfZmlsdGVyKHRwLCB0KTsKKwkJCXJldHVybiAwOworCQl9CisKKwlyZXR1cm4gLUVOT0VOVDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYmFzaWNfc2V0X3Bhcm1zKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCBzdHJ1Y3QgYmFzaWNfZmlsdGVyICpmLAorCQkJCSAgdW5zaWduZWQgbG9uZyBiYXNlLCBzdHJ1Y3QgcnRhdHRyICoqdGIsCisJCQkJICBzdHJ1Y3QgcnRhdHRyICplc3QpCit7CisJaW50IGVyciA9IC1FSU5WQUw7CisJc3RydWN0IHRjZl9leHRzIGU7CisJc3RydWN0IHRjZl9lbWF0Y2hfdHJlZSB0OworCisJaWYgKHRiW1RDQV9CQVNJQ19DTEFTU0lELTFdKQorCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX0JBU0lDX0NMQVNTSUQtMV0pIDwgc2l6ZW9mKHUzMikpCisJCQlyZXR1cm4gZXJyOworCisJZXJyID0gdGNmX2V4dHNfdmFsaWRhdGUodHAsIHRiLCBlc3QsICZlLCAmYmFzaWNfZXh0X21hcCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSB0Y2ZfZW1fdHJlZV92YWxpZGF0ZSh0cCwgdGJbVENBX0JBU0lDX0VNQVRDSEVTLTFdLCAmdCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3V0OworCisJaWYgKHRiW1RDQV9CQVNJQ19DTEFTU0lELTFdKSB7CisJCWYtPnJlcy5jbGFzc2lkID0gKih1MzIqKVJUQV9EQVRBKHRiW1RDQV9CQVNJQ19DTEFTU0lELTFdKTsKKwkJdGNmX2JpbmRfZmlsdGVyKHRwLCAmZi0+cmVzLCBiYXNlKTsKKwl9CisKKwl0Y2ZfZXh0c19jaGFuZ2UodHAsICZmLT5leHRzLCAmZSk7CisJdGNmX2VtX3RyZWVfY2hhbmdlKHRwLCAmZi0+ZW1hdGNoZXMsICZ0KTsKKworCXJldHVybiAwOworZXJyb3V0OgorCXRjZl9leHRzX2Rlc3Ryb3kodHAsICZlKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGJhc2ljX2NoYW5nZShzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBiYXNlLCB1MzIgaGFuZGxlLAorCQkgICAgICAgIHN0cnVjdCBydGF0dHIgKip0Y2EsIHVuc2lnbmVkIGxvbmcgKmFyZykKK3sKKwlpbnQgZXJyID0gLUVJTlZBTDsKKwlzdHJ1Y3QgYmFzaWNfaGVhZCAqaGVhZCA9IChzdHJ1Y3QgYmFzaWNfaGVhZCAqKSB0cC0+cm9vdDsKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfQkFTSUNfTUFYXTsKKwlzdHJ1Y3QgYmFzaWNfZmlsdGVyICpmID0gKHN0cnVjdCBiYXNpY19maWx0ZXIgKikgKmFyZzsKKworCWlmICh0Y2FbVENBX09QVElPTlMtMV0gPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocnRhdHRyX3BhcnNlX25lc3RlZCh0YiwgVENBX0JBU0lDX01BWCwgdGNhW1RDQV9PUFRJT05TLTFdKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGYgIT0gTlVMTCkgeworCQlpZiAoaGFuZGxlICYmIGYtPmhhbmRsZSAhPSBoYW5kbGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGJhc2ljX3NldF9wYXJtcyh0cCwgZiwgYmFzZSwgdGIsIHRjYVtUQ0FfUkFURS0xXSk7CisJfQorCisJZXJyID0gLUVOT0JVRlM7CisJaWYgKGhlYWQgPT0gTlVMTCkgeworCQloZWFkID0ga21hbGxvYyhzaXplb2YoKmhlYWQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGhlYWQgPT0gTlVMTCkKKwkJCWdvdG8gZXJyb3V0OworCisJCW1lbXNldChoZWFkLCAwLCBzaXplb2YoKmhlYWQpKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmhlYWQtPmZsaXN0KTsKKwkJdHAtPnJvb3QgPSBoZWFkOworCX0KKworCWYgPSBrbWFsbG9jKHNpemVvZigqZiksIEdGUF9LRVJORUwpOworCWlmIChmID09IE5VTEwpCisJCWdvdG8gZXJyb3V0OworCW1lbXNldChmLCAwLCBzaXplb2YoKmYpKTsKKworCWVyciA9IC1FSU5WQUw7CisJaWYgKGhhbmRsZSkKKwkJZi0+aGFuZGxlID0gaGFuZGxlOworCWVsc2UgeworCQlpbnQgaSA9IDB4ODAwMDAwMDA7CisJCWRvIHsKKwkJCWlmICgrK2hlYWQtPmhnZW5lcmF0b3IgPT0gMHg3RkZGRkZGRikKKwkJCQloZWFkLT5oZ2VuZXJhdG9yID0gMTsKKwkJfSB3aGlsZSAoLS1pID4gMCAmJiBiYXNpY19nZXQodHAsIGhlYWQtPmhnZW5lcmF0b3IpKTsKKworCQlpZiAoaSA8PSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkluc3VmZmljaWVudCBudW1iZXIgb2YgaGFuZGxlc1xuIik7CisJCQlnb3RvIGVycm91dDsKKwkJfQorCisJCWYtPmhhbmRsZSA9IGhlYWQtPmhnZW5lcmF0b3I7CisJfQorCisJZXJyID0gYmFzaWNfc2V0X3Bhcm1zKHRwLCBmLCBiYXNlLCB0YiwgdGNhW1RDQV9SQVRFLTFdKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvdXQ7CisKKwl0Y2ZfdHJlZV9sb2NrKHRwKTsKKwlsaXN0X2FkZCgmZi0+bGluaywgJmhlYWQtPmZsaXN0KTsKKwl0Y2ZfdHJlZV91bmxvY2sodHApOworCSphcmcgPSAodW5zaWduZWQgbG9uZykgZjsKKworCXJldHVybiAwOworZXJyb3V0OgorCWlmICgqYXJnID09IDBVTCAmJiBmKQorCQlrZnJlZShmKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGJhc2ljX3dhbGsoc3RydWN0IHRjZl9wcm90byAqdHAsIHN0cnVjdCB0Y2Zfd2Fsa2VyICphcmcpCit7CisJc3RydWN0IGJhc2ljX2hlYWQgKmhlYWQgPSAoc3RydWN0IGJhc2ljX2hlYWQgKikgdHAtPnJvb3Q7CisJc3RydWN0IGJhc2ljX2ZpbHRlciAqZjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZiwgJmhlYWQtPmZsaXN0LCBsaW5rKSB7CisJCWlmIChhcmctPmNvdW50IDwgYXJnLT5za2lwKQorCQkJZ290byBza2lwOworCisJCWlmIChhcmctPmZuKHRwLCAodW5zaWduZWQgbG9uZykgZiwgYXJnKSA8IDApIHsKKwkJCWFyZy0+c3RvcCA9IDE7CisJCQlicmVhazsKKwkJfQorc2tpcDoKKwkJYXJnLT5jb3VudCsrOworCX0KK30KKworc3RhdGljIGludCBiYXNpY19kdW1wKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1bnNpZ25lZCBsb25nIGZoLAorCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNtc2cgKnQpCit7CisJc3RydWN0IGJhc2ljX2ZpbHRlciAqZiA9IChzdHJ1Y3QgYmFzaWNfZmlsdGVyICopIGZoOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJc3RydWN0IHJ0YXR0ciAqcnRhOworCisJaWYgKGYgPT0gTlVMTCkKKwkJcmV0dXJuIHNrYi0+bGVuOworCisJdC0+dGNtX2hhbmRsZSA9IGYtPmhhbmRsZTsKKworCXJ0YSA9IChzdHJ1Y3QgcnRhdHRyICopIGI7CisJUlRBX1BVVChza2IsIFRDQV9PUFRJT05TLCAwLCBOVUxMKTsKKworCWlmICh0Y2ZfZXh0c19kdW1wKHNrYiwgJmYtPmV4dHMsICZiYXNpY19leHRfbWFwKSA8IDAgfHwKKwkgICAgdGNmX2VtX3RyZWVfZHVtcChza2IsICZmLT5lbWF0Y2hlcywgVENBX0JBU0lDX0VNQVRDSEVTKSA8IDApCisJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CisKKwlydGEtPnJ0YV9sZW4gPSAoc2tiLT50YWlsIC0gYik7CisJcmV0dXJuIHNrYi0+bGVuOworCitydGF0dHJfZmFpbHVyZToKKwlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHN0cnVjdCB0Y2ZfcHJvdG9fb3BzIGNsc19iYXNpY19vcHMgPSB7CisJLmtpbmQJCT0JImJhc2ljIiwKKwkuY2xhc3NpZnkJPQliYXNpY19jbGFzc2lmeSwKKwkuaW5pdAkJPQliYXNpY19pbml0LAorCS5kZXN0cm95CT0JYmFzaWNfZGVzdHJveSwKKwkuZ2V0CQk9CWJhc2ljX2dldCwKKwkucHV0CQk9CWJhc2ljX3B1dCwKKwkuY2hhbmdlCQk9CWJhc2ljX2NoYW5nZSwKKwkuZGVsZXRlCQk9CWJhc2ljX2RlbGV0ZSwKKwkud2FsawkJPQliYXNpY193YWxrLAorCS5kdW1wCQk9CWJhc2ljX2R1bXAsCisJLm93bmVyCQk9CVRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9iYXNpYyh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl90Y2ZfcHJvdG9fb3BzKCZjbHNfYmFzaWNfb3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfYmFzaWModm9pZCkgCit7CisJdW5yZWdpc3Rlcl90Y2ZfcHJvdG9fb3BzKCZjbHNfYmFzaWNfb3BzKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9iYXNpYykKK21vZHVsZV9leGl0KGV4aXRfYmFzaWMpCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfZncuYyBiL25ldC9zY2hlZC9jbHNfZncuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGZjODNhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjaGVkL2Nsc19mdy5jCkBAIC0wLDAgKzEsMzc4IEBACisvKgorICogbmV0L3NjaGVkL2Nsc19mdy5jCUNsYXNzaWZpZXIgbWFwcGluZyBpcGNoYWlucycgZndtYXJrIHRvIHRyYWZmaWMgY2xhc3MuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqIENoYW5nZXM6CisgKiBLYXJsaXMgUGVpc2VuaWVrcyA8a2FybGlzQG10Lmx2PiA6IDk5MDQxNSA6IGZ3X3dhbGsgb2ZmIGJ5IG9uZQorICogS2FybGlzIFBlaXNlbmlla3MgPGthcmxpc0BtdC5sdj4gOiA5OTA0MTUgOiBmd19kZWxldGUga2lsbGVkIGFsbCB0aGUgZmlsdGVyIChhbmQga2VybmVsKS4KKyAqIEFsZXggPGFsZXhAcGlsb3Rzb2Z0LmNvbT4gOiAyMDA0eHh5eTogQWRkZWQgQWN0aW9uIGV4dGVuc2lvbgorICoKKyAqIEpIUzogV2Ugc2hvdWxkIHJlbW92ZSB0aGUgQ09ORklHX05FVF9DTFNfSU5EIGZyb20gaGVyZQorICogZXZlbnR1YWxseSB3aGVuIHRoZSBtZXRhIG1hdGNoIGV4dGVuc2lvbiBpcyBtYWRlIGF2YWlsYWJsZQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvYWN0X2FwaS5oPgorI2luY2x1ZGUgPG5ldC9wa3RfY2xzLmg+CisKK3N0cnVjdCBmd19oZWFkCit7CisJc3RydWN0IGZ3X2ZpbHRlciAqaHRbMjU2XTsKK307CisKK3N0cnVjdCBmd19maWx0ZXIKK3sKKwlzdHJ1Y3QgZndfZmlsdGVyCSpuZXh0OworCXUzMgkJCWlkOworCXN0cnVjdCB0Y2ZfcmVzdWx0CXJlczsKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19JTkQKKwljaGFyCQkJaW5kZXZbSUZOQU1TSVpdOworI2VuZGlmIC8qIENPTkZJR19ORVRfQ0xTX0lORCAqLworCXN0cnVjdCB0Y2ZfZXh0cwkJZXh0czsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGNmX2V4dF9tYXAgZndfZXh0X21hcCA9IHsKKwkuYWN0aW9uID0gVENBX0ZXX0FDVCwKKwkucG9saWNlID0gVENBX0ZXX1BPTElDRQorfTsKKworc3RhdGljIF9faW5saW5lX18gaW50IGZ3X2hhc2godTMyIGhhbmRsZSkKK3sKKwlyZXR1cm4gaGFuZGxlJjB4RkY7Cit9CisKK3N0YXRpYyBpbnQgZndfY2xhc3NpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjZl9wcm90byAqdHAsCisJCQkgIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCit7CisJc3RydWN0IGZ3X2hlYWQgKmhlYWQgPSAoc3RydWN0IGZ3X2hlYWQqKXRwLT5yb290OworCXN0cnVjdCBmd19maWx0ZXIgKmY7CisJaW50IHI7CisjaWZkZWYgQ09ORklHX05FVEZJTFRFUgorCXUzMiBpZCA9IHNrYi0+bmZtYXJrOworI2Vsc2UKKwl1MzIgaWQgPSAwOworI2VuZGlmCisKKwlpZiAoaGVhZCAhPSBOVUxMKSB7CisJCWZvciAoZj1oZWFkLT5odFtmd19oYXNoKGlkKV07IGY7IGY9Zi0+bmV4dCkgeworCQkJaWYgKGYtPmlkID09IGlkKSB7CisJCQkJKnJlcyA9IGYtPnJlczsKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19JTkQKKwkJCQlpZiAoIXRjZl9tYXRjaF9pbmRldihza2IsIGYtPmluZGV2KSkKKwkJCQkJY29udGludWU7CisjZW5kaWYgLyogQ09ORklHX05FVF9DTFNfSU5EICovCisJCQkJciA9IHRjZl9leHRzX2V4ZWMoc2tiLCAmZi0+ZXh0cywgcmVzKTsKKwkJCQlpZiAociA8IDApCisJCQkJCWNvbnRpbnVlOworCisJCQkJcmV0dXJuIHI7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBvbGQgbWV0aG9kICovCisJCWlmIChpZCAmJiAoVENfSF9NQUooaWQpID09IDAgfHwgIShUQ19IX01BSihpZF50cC0+cS0+aGFuZGxlKSkpKSB7CisJCQlyZXMtPmNsYXNzaWQgPSBpZDsKKwkJCXJlcy0+Y2xhc3MgPSAwOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZ3X2dldChzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdTMyIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgZndfaGVhZCAqaGVhZCA9IChzdHJ1Y3QgZndfaGVhZCopdHAtPnJvb3Q7CisJc3RydWN0IGZ3X2ZpbHRlciAqZjsKKworCWlmIChoZWFkID09IE5VTEwpCisJCXJldHVybiAwOworCisJZm9yIChmPWhlYWQtPmh0W2Z3X2hhc2goaGFuZGxlKV07IGY7IGY9Zi0+bmV4dCkgeworCQlpZiAoZi0+aWQgPT0gaGFuZGxlKQorCQkJcmV0dXJuICh1bnNpZ25lZCBsb25nKWY7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmd19wdXQoc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgZikKK3sKK30KKworc3RhdGljIGludCBmd19pbml0KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2Z3X2RlbGV0ZV9maWx0ZXIoc3RydWN0IHRjZl9wcm90byAqdHAsIHN0cnVjdCBmd19maWx0ZXIgKmYpCit7CisJdGNmX3VuYmluZF9maWx0ZXIodHAsICZmLT5yZXMpOworCXRjZl9leHRzX2Rlc3Ryb3kodHAsICZmLT5leHRzKTsKKwlrZnJlZShmKTsKK30KKworc3RhdGljIHZvaWQgZndfZGVzdHJveShzdHJ1Y3QgdGNmX3Byb3RvICp0cCkKK3sKKwlzdHJ1Y3QgZndfaGVhZCAqaGVhZCA9IChzdHJ1Y3QgZndfaGVhZCopeGNoZygmdHAtPnJvb3QsIE5VTEwpOworCXN0cnVjdCBmd19maWx0ZXIgKmY7CisJaW50IGg7CisKKwlpZiAoaGVhZCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlmb3IgKGg9MDsgaDwyNTY7IGgrKykgeworCQl3aGlsZSAoKGY9aGVhZC0+aHRbaF0pICE9IE5VTEwpIHsKKwkJCWhlYWQtPmh0W2hdID0gZi0+bmV4dDsKKwkJCWZ3X2RlbGV0ZV9maWx0ZXIodHAsIGYpOworCQl9CisJfQorCWtmcmVlKGhlYWQpOworfQorCitzdGF0aWMgaW50IGZ3X2RlbGV0ZShzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGZ3X2hlYWQgKmhlYWQgPSAoc3RydWN0IGZ3X2hlYWQqKXRwLT5yb290OworCXN0cnVjdCBmd19maWx0ZXIgKmYgPSAoc3RydWN0IGZ3X2ZpbHRlciopYXJnOworCXN0cnVjdCBmd19maWx0ZXIgKipmcDsKKworCWlmIChoZWFkID09IE5VTEwgfHwgZiA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWZvciAoZnA9JmhlYWQtPmh0W2Z3X2hhc2goZi0+aWQpXTsgKmZwOyBmcCA9ICYoKmZwKS0+bmV4dCkgeworCQlpZiAoKmZwID09IGYpIHsKKwkJCXRjZl90cmVlX2xvY2sodHApOworCQkJKmZwID0gZi0+bmV4dDsKKwkJCXRjZl90cmVlX3VubG9jayh0cCk7CisJCQlmd19kZWxldGVfZmlsdGVyKHRwLCBmKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorb3V0OgorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50Citmd19jaGFuZ2VfYXR0cnMoc3RydWN0IHRjZl9wcm90byAqdHAsIHN0cnVjdCBmd19maWx0ZXIgKmYsCisJc3RydWN0IHJ0YXR0ciAqKnRiLCBzdHJ1Y3QgcnRhdHRyICoqdGNhLCB1bnNpZ25lZCBsb25nIGJhc2UpCit7CisJc3RydWN0IHRjZl9leHRzIGU7CisJaW50IGVycjsKKworCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKHRwLCB0YiwgdGNhW1RDQV9SQVRFLTFdLCAmZSwgJmZ3X2V4dF9tYXApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gLUVJTlZBTDsKKwlpZiAodGJbVENBX0ZXX0NMQVNTSUQtMV0pIHsKKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9GV19DTEFTU0lELTFdKSAhPSBzaXplb2YodTMyKSkKKwkJCWdvdG8gZXJyb3V0OworCQlmLT5yZXMuY2xhc3NpZCA9ICoodTMyKilSVEFfREFUQSh0YltUQ0FfRldfQ0xBU1NJRC0xXSk7CisJCXRjZl9iaW5kX2ZpbHRlcih0cCwgJmYtPnJlcywgYmFzZSk7CisJfQorCisjaWZkZWYgQ09ORklHX05FVF9DTFNfSU5ECisJaWYgKHRiW1RDQV9GV19JTkRFVi0xXSkgeworCQllcnIgPSB0Y2ZfY2hhbmdlX2luZGV2KHRwLCBmLT5pbmRldiwgdGJbVENBX0ZXX0lOREVWLTFdKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVycm91dDsKKwl9CisjZW5kaWYgLyogQ09ORklHX05FVF9DTFNfSU5EICovCisKKwl0Y2ZfZXh0c19jaGFuZ2UodHAsICZmLT5leHRzLCAmZSk7CisKKwlyZXR1cm4gMDsKK2Vycm91dDoKKwl0Y2ZfZXh0c19kZXN0cm95KHRwLCAmZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBmd19jaGFuZ2Uoc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJICAgICB1MzIgaGFuZGxlLAorCQkgICAgIHN0cnVjdCBydGF0dHIgKip0Y2EsCisJCSAgICAgdW5zaWduZWQgbG9uZyAqYXJnKQoreworCXN0cnVjdCBmd19oZWFkICpoZWFkID0gKHN0cnVjdCBmd19oZWFkKil0cC0+cm9vdDsKKwlzdHJ1Y3QgZndfZmlsdGVyICpmID0gKHN0cnVjdCBmd19maWx0ZXIgKikgKmFyZzsKKwlzdHJ1Y3QgcnRhdHRyICpvcHQgPSB0Y2FbVENBX09QVElPTlMtMV07CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX0ZXX01BWF07CisJaW50IGVycjsKKworCWlmICghb3B0KQorCQlyZXR1cm4gaGFuZGxlID8gLUVJTlZBTCA6IDA7CisKKwlpZiAocnRhdHRyX3BhcnNlX25lc3RlZCh0YiwgVENBX0ZXX01BWCwgb3B0KSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGYgIT0gTlVMTCkgeworCQlpZiAoZi0+aWQgIT0gaGFuZGxlICYmIGhhbmRsZSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gZndfY2hhbmdlX2F0dHJzKHRwLCBmLCB0YiwgdGNhLCBiYXNlKTsKKwl9CisKKwlpZiAoIWhhbmRsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaGVhZCA9PSBOVUxMKSB7CisJCWhlYWQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZndfaGVhZCksIEdGUF9LRVJORUwpOworCQlpZiAoaGVhZCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9CVUZTOworCQltZW1zZXQoaGVhZCwgMCwgc2l6ZW9mKCpoZWFkKSk7CisKKwkJdGNmX3RyZWVfbG9jayh0cCk7CisJCXRwLT5yb290ID0gaGVhZDsKKwkJdGNmX3RyZWVfdW5sb2NrKHRwKTsKKwl9CisKKwlmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZ3X2ZpbHRlciksIEdGUF9LRVJORUwpOworCWlmIChmID09IE5VTEwpCisJCXJldHVybiAtRU5PQlVGUzsKKwltZW1zZXQoZiwgMCwgc2l6ZW9mKCpmKSk7CisKKwlmLT5pZCA9IGhhbmRsZTsKKworCWVyciA9IGZ3X2NoYW5nZV9hdHRycyh0cCwgZiwgdGIsIHRjYSwgYmFzZSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3V0OworCisJZi0+bmV4dCA9IGhlYWQtPmh0W2Z3X2hhc2goaGFuZGxlKV07CisJdGNmX3RyZWVfbG9jayh0cCk7CisJaGVhZC0+aHRbZndfaGFzaChoYW5kbGUpXSA9IGY7CisJdGNmX3RyZWVfdW5sb2NrKHRwKTsKKworCSphcmcgPSAodW5zaWduZWQgbG9uZylmOworCXJldHVybiAwOworCitlcnJvdXQ6CisJaWYgKGYpCisJCWtmcmVlKGYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGZ3X3dhbGsoc3RydWN0IHRjZl9wcm90byAqdHAsIHN0cnVjdCB0Y2Zfd2Fsa2VyICphcmcpCit7CisJc3RydWN0IGZ3X2hlYWQgKmhlYWQgPSAoc3RydWN0IGZ3X2hlYWQqKXRwLT5yb290OworCWludCBoOworCisJaWYgKGhlYWQgPT0gTlVMTCkKKwkJYXJnLT5zdG9wID0gMTsKKworCWlmIChhcmctPnN0b3ApCisJCXJldHVybjsKKworCWZvciAoaCA9IDA7IGggPCAyNTY7IGgrKykgeworCQlzdHJ1Y3QgZndfZmlsdGVyICpmOworCisJCWZvciAoZiA9IGhlYWQtPmh0W2hdOyBmOyBmID0gZi0+bmV4dCkgeworCQkJaWYgKGFyZy0+Y291bnQgPCBhcmctPnNraXApIHsKKwkJCQlhcmctPmNvdW50Kys7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoYXJnLT5mbih0cCwgKHVuc2lnbmVkIGxvbmcpZiwgYXJnKSA8IDApIHsKKwkJCQlhcmctPnN0b3AgPSAxOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWFyZy0+Y291bnQrKzsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBmd19kdW1wKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1bnNpZ25lZCBsb25nIGZoLAorCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNtc2cgKnQpCit7CisJc3RydWN0IGZ3X2ZpbHRlciAqZiA9IChzdHJ1Y3QgZndfZmlsdGVyKilmaDsKKwl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3QgcnRhdHRyICpydGE7CisKKwlpZiAoZiA9PSBOVUxMKQorCQlyZXR1cm4gc2tiLT5sZW47CisKKwl0LT50Y21faGFuZGxlID0gZi0+aWQ7CisKKwlpZiAoIWYtPnJlcy5jbGFzc2lkICYmICF0Y2ZfZXh0c19pc19hdmFpbGFibGUoJmYtPmV4dHMpKQorCQlyZXR1cm4gc2tiLT5sZW47CisKKwlydGEgPSAoc3RydWN0IHJ0YXR0ciopYjsKKwlSVEFfUFVUKHNrYiwgVENBX09QVElPTlMsIDAsIE5VTEwpOworCisJaWYgKGYtPnJlcy5jbGFzc2lkKQorCQlSVEFfUFVUKHNrYiwgVENBX0ZXX0NMQVNTSUQsIDQsICZmLT5yZXMuY2xhc3NpZCk7CisjaWZkZWYgQ09ORklHX05FVF9DTFNfSU5ECisJaWYgKHN0cmxlbihmLT5pbmRldikpCisJCVJUQV9QVVQoc2tiLCBUQ0FfRldfSU5ERVYsIElGTkFNU0laLCBmLT5pbmRldik7CisjZW5kaWYgLyogQ09ORklHX05FVF9DTFNfSU5EICovCisKKwlpZiAodGNmX2V4dHNfZHVtcChza2IsICZmLT5leHRzLCAmZndfZXh0X21hcCkgPCAwKQorCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOworCisJcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gYjsKKworCWlmICh0Y2ZfZXh0c19kdW1wX3N0YXRzKHNrYiwgJmYtPmV4dHMsICZmd19leHRfbWFwKSA8IDApCisJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CisKKwlyZXR1cm4gc2tiLT5sZW47CisKK3J0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgc3RydWN0IHRjZl9wcm90b19vcHMgY2xzX2Z3X29wcyA9IHsKKwkubmV4dAkJPQlOVUxMLAorCS5raW5kCQk9CSJmdyIsCisJLmNsYXNzaWZ5CT0JZndfY2xhc3NpZnksCisJLmluaXQJCT0JZndfaW5pdCwKKwkuZGVzdHJveQk9CWZ3X2Rlc3Ryb3ksCisJLmdldAkJPQlmd19nZXQsCisJLnB1dAkJPQlmd19wdXQsCisJLmNoYW5nZQkJPQlmd19jaGFuZ2UsCisJLmRlbGV0ZQkJPQlmd19kZWxldGUsCisJLndhbGsJCT0JZndfd2FsaywKKwkuZHVtcAkJPQlmd19kdW1wLAorCS5vd25lcgkJPQlUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZncodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfdGNmX3Byb3RvX29wcygmY2xzX2Z3X29wcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2Z3KHZvaWQpIAoreworCXVucmVnaXN0ZXJfdGNmX3Byb3RvX29wcygmY2xzX2Z3X29wcyk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfZncpCittb2R1bGVfZXhpdChleGl0X2Z3KQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19yb3V0ZS5jIGIvbmV0L3NjaGVkL2Nsc19yb3V0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyOTk2YWMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2NoZWQvY2xzX3JvdXRlLmMKQEAgLTAsMCArMSw2MzkgQEAKKy8qCisgKiBuZXQvc2NoZWQvY2xzX3JvdXRlLmMJUk9VVEU0IGNsYXNzaWZpZXIuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9hY3RfYXBpLmg+CisjaW5jbHVkZSA8bmV0L3BrdF9jbHMuaD4KKworLyoKKyAgIDEuIEZvciBub3cgd2UgYXNzdW1lIHRoYXQgcm91dGUgdGFncyA8IDI1Ni4KKyAgICAgIEl0IGFsbG93cyB0byB1c2UgZGlyZWN0IHRhYmxlIGxvb2t1cHMsIGluc3RlYWQgb2YgaGFzaCB0YWJsZXMuCisgICAyLiBGb3Igbm93IHdlIGFzc3VtZSB0aGF0ICJmcm9tIFRBRyIgYW5kICJmcm9tZGV2IERFViIgc3RhdGVtZW50cworICAgICAgYXJlIG11dHVhbGx5ICBleGNsdXNpdmUuCisgICAzLiAidG8gVEFHIGZyb20gQU5ZIiBoYXMgaGlnaGVyIHByaW9yaXR5LCB0aGFuICJ0byBBTlkgZnJvbSBYWFgiCisgKi8KKworc3RydWN0IHJvdXRlNF9mYXN0bWFwCit7CisJc3RydWN0IHJvdXRlNF9maWx0ZXIJKmZpbHRlcjsKKwl1MzIJCQlpZDsKKwlpbnQJCQlpaWY7Cit9OworCitzdHJ1Y3Qgcm91dGU0X2hlYWQKK3sKKwlzdHJ1Y3Qgcm91dGU0X2Zhc3RtYXAJZmFzdG1hcFsxNl07CisJc3RydWN0IHJvdXRlNF9idWNrZXQJKnRhYmxlWzI1NisxXTsKK307CisKK3N0cnVjdCByb3V0ZTRfYnVja2V0Cit7CisJLyogMTYgRlJPTSBidWNrZXRzICsgMTYgSUlGIGJ1Y2tldHMgKyAxIHdpbGRjYXJkIGJ1Y2tldCAqLworCXN0cnVjdCByb3V0ZTRfZmlsdGVyCSpodFsxNisxNisxXTsKK307CisKK3N0cnVjdCByb3V0ZTRfZmlsdGVyCit7CisJc3RydWN0IHJvdXRlNF9maWx0ZXIJKm5leHQ7CisJdTMyCQkJaWQ7CisJaW50CQkJaWlmOworCisJc3RydWN0IHRjZl9yZXN1bHQJcmVzOworCXN0cnVjdCB0Y2ZfZXh0cwkJZXh0czsKKwl1MzIJCQloYW5kbGU7CisJc3RydWN0IHJvdXRlNF9idWNrZXQJKmJrdDsKK307CisKKyNkZWZpbmUgUk9VVEU0X0ZBSUxVUkUgKChzdHJ1Y3Qgcm91dGU0X2ZpbHRlciopKC0xTCkpCisKK3N0YXRpYyBzdHJ1Y3QgdGNmX2V4dF9tYXAgcm91dGVfZXh0X21hcCA9IHsKKwkucG9saWNlID0gVENBX1JPVVRFNF9QT0xJQ0UsCisJLmFjdGlvbiA9IFRDQV9ST1VURTRfQUNUCit9OworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcm91dGU0X2Zhc3RtYXBfaGFzaCh1MzIgaWQsIGludCBpaWYpCit7CisJcmV0dXJuIGlkJjB4RjsKK30KKworc3RhdGljIGlubGluZQordm9pZCByb3V0ZTRfcmVzZXRfZmFzdG1hcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgcm91dGU0X2hlYWQgKmhlYWQsIHUzMiBpZCkKK3sKKwlzcGluX2xvY2tfYmgoJmRldi0+cXVldWVfbG9jayk7CisJbWVtc2V0KGhlYWQtPmZhc3RtYXAsIDAsIHNpemVvZihoZWFkLT5mYXN0bWFwKSk7CisJc3Bpbl91bmxvY2tfYmgoJmRldi0+cXVldWVfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5saW5lX18KK3JvdXRlNF9zZXRfZmFzdG1hcChzdHJ1Y3Qgcm91dGU0X2hlYWQgKmhlYWQsIHUzMiBpZCwgaW50IGlpZiwKKwkJICAgc3RydWN0IHJvdXRlNF9maWx0ZXIgKmYpCit7CisJaW50IGggPSByb3V0ZTRfZmFzdG1hcF9oYXNoKGlkLCBpaWYpOworCWhlYWQtPmZhc3RtYXBbaF0uaWQgPSBpZDsKKwloZWFkLT5mYXN0bWFwW2hdLmlpZiA9IGlpZjsKKwloZWFkLT5mYXN0bWFwW2hdLmZpbHRlciA9IGY7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCByb3V0ZTRfaGFzaF90byh1MzIgaWQpCit7CisJcmV0dXJuIGlkJjB4RkY7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCByb3V0ZTRfaGFzaF9mcm9tKHUzMiBpZCkKK3sKKwlyZXR1cm4gKGlkPj4xNikmMHhGOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcm91dGU0X2hhc2hfaWlmKGludCBpaWYpCit7CisJcmV0dXJuIDE2ICsgKChpaWY+PjE2KSYweEYpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcm91dGU0X2hhc2hfd2lsZCh2b2lkKQoreworCXJldHVybiAzMjsKK30KKworI2RlZmluZSBST1VURTRfQVBQTFlfUkVTVUxUKCkJCQkJCVwKK3sJCQkJCQkJCVwKKwkqcmVzID0gZi0+cmVzOwkJCQkJCVwKKwlpZiAodGNmX2V4dHNfaXNfYXZhaWxhYmxlKCZmLT5leHRzKSkgewkJCVwKKwkJaW50IHIgPSB0Y2ZfZXh0c19leGVjKHNrYiwgJmYtPmV4dHMsIHJlcyk7CVwKKwkJaWYgKHIgPCAwKSB7CQkJCQlcCisJCQlkb250X2NhY2hlID0gMTsJCQkJXAorCQkJY29udGludWU7CQkJCVwKKwkJfQkJCQkJCVwKKwkJcmV0dXJuIHI7CQkJCQlcCisJfSBlbHNlIGlmICghZG9udF9jYWNoZSkJCQkJCVwKKwkJcm91dGU0X3NldF9mYXN0bWFwKGhlYWQsIGlkLCBpaWYsIGYpOwkJXAorCXJldHVybiAwOwkJCQkJCVwKK30KKworc3RhdGljIGludCByb3V0ZTRfY2xhc3NpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjZl9wcm90byAqdHAsCisJCQkgICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQoreworCXN0cnVjdCByb3V0ZTRfaGVhZCAqaGVhZCA9IChzdHJ1Y3Qgcm91dGU0X2hlYWQqKXRwLT5yb290OworCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKKwlzdHJ1Y3Qgcm91dGU0X2J1Y2tldCAqYjsKKwlzdHJ1Y3Qgcm91dGU0X2ZpbHRlciAqZjsKKwl1MzIgaWQsIGg7CisJaW50IGlpZiwgZG9udF9jYWNoZSA9IDA7CisKKwlpZiAoKGRzdCA9IHNrYi0+ZHN0KSA9PSBOVUxMKQorCQlnb3RvIGZhaWx1cmU7CisKKwlpZCA9IGRzdC0+dGNsYXNzaWQ7CisJaWYgKGhlYWQgPT0gTlVMTCkKKwkJZ290byBvbGRfbWV0aG9kOworCisJaWlmID0gKChzdHJ1Y3QgcnRhYmxlKilkc3QpLT5mbC5paWY7CisKKwloID0gcm91dGU0X2Zhc3RtYXBfaGFzaChpZCwgaWlmKTsKKwlpZiAoaWQgPT0gaGVhZC0+ZmFzdG1hcFtoXS5pZCAmJgorCSAgICBpaWYgPT0gaGVhZC0+ZmFzdG1hcFtoXS5paWYgJiYKKwkgICAgKGYgPSBoZWFkLT5mYXN0bWFwW2hdLmZpbHRlcikgIT0gTlVMTCkgeworCQlpZiAoZiA9PSBST1VURTRfRkFJTFVSRSkKKwkJCWdvdG8gZmFpbHVyZTsKKworCQkqcmVzID0gZi0+cmVzOworCQlyZXR1cm4gMDsKKwl9CisKKwloID0gcm91dGU0X2hhc2hfdG8oaWQpOworCityZXN0YXJ0OgorCWlmICgoYiA9IGhlYWQtPnRhYmxlW2hdKSAhPSBOVUxMKSB7CisJCWZvciAoZiA9IGItPmh0W3JvdXRlNF9oYXNoX2Zyb20oaWQpXTsgZjsgZiA9IGYtPm5leHQpCisJCQlpZiAoZi0+aWQgPT0gaWQpCisJCQkJUk9VVEU0X0FQUExZX1JFU1VMVCgpOworCisJCWZvciAoZiA9IGItPmh0W3JvdXRlNF9oYXNoX2lpZihpaWYpXTsgZjsgZiA9IGYtPm5leHQpCisJCQlpZiAoZi0+aWlmID09IGlpZikKKwkJCQlST1VURTRfQVBQTFlfUkVTVUxUKCk7CisKKwkJZm9yIChmID0gYi0+aHRbcm91dGU0X2hhc2hfd2lsZCgpXTsgZjsgZiA9IGYtPm5leHQpCisJCQlST1VURTRfQVBQTFlfUkVTVUxUKCk7CisKKwl9CisJaWYgKGggPCAyNTYpIHsKKwkJaCA9IDI1NjsKKwkJaWQgJj0gfjB4RkZGRjsKKwkJZ290byByZXN0YXJ0OworCX0KKworCWlmICghZG9udF9jYWNoZSkKKwkJcm91dGU0X3NldF9mYXN0bWFwKGhlYWQsIGlkLCBpaWYsIFJPVVRFNF9GQUlMVVJFKTsKK2ZhaWx1cmU6CisJcmV0dXJuIC0xOworCitvbGRfbWV0aG9kOgorCWlmIChpZCAmJiAoVENfSF9NQUooaWQpID09IDAgfHwKKwkJICAgIShUQ19IX01BSihpZF50cC0+cS0+aGFuZGxlKSkpKSB7CisJCXJlcy0+Y2xhc3NpZCA9IGlkOworCQlyZXMtPmNsYXNzID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSB1MzIgdG9faGFzaCh1MzIgaWQpCit7CisJdTMyIGggPSBpZCYweEZGOworCWlmIChpZCYweDgwMDApCisJCWggKz0gMjU2OworCXJldHVybiBoOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBmcm9tX2hhc2godTMyIGlkKQoreworCWlkICY9IDB4RkZGRjsKKwlpZiAoaWQgPT0gMHhGRkZGKQorCQlyZXR1cm4gMzI7CisJaWYgKCEoaWQgJiAweDgwMDApKSB7CisJCWlmIChpZCA+IDI1NSkKKwkJCXJldHVybiAyNTY7CisJCXJldHVybiBpZCYweEY7CisJfQorCXJldHVybiAxNiArIChpZCYweEYpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyByb3V0ZTRfZ2V0KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1MzIgaGFuZGxlKQoreworCXN0cnVjdCByb3V0ZTRfaGVhZCAqaGVhZCA9IChzdHJ1Y3Qgcm91dGU0X2hlYWQqKXRwLT5yb290OworCXN0cnVjdCByb3V0ZTRfYnVja2V0ICpiOworCXN0cnVjdCByb3V0ZTRfZmlsdGVyICpmOworCXVuc2lnbmVkIGgxLCBoMjsKKworCWlmICghaGVhZCkKKwkJcmV0dXJuIDA7CisKKwloMSA9IHRvX2hhc2goaGFuZGxlKTsKKwlpZiAoaDEgPiAyNTYpCisJCXJldHVybiAwOworCisJaDIgPSBmcm9tX2hhc2goaGFuZGxlPj4xNik7CisJaWYgKGgyID4gMzIpCisJCXJldHVybiAwOworCisJaWYgKChiID0gaGVhZC0+dGFibGVbaDFdKSAhPSBOVUxMKSB7CisJCWZvciAoZiA9IGItPmh0W2gyXTsgZjsgZiA9IGYtPm5leHQpCisJCQlpZiAoZi0+aGFuZGxlID09IGhhbmRsZSkKKwkJCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpZjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJvdXRlNF9wdXQoc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgZikKK3sKK30KKworc3RhdGljIGludCByb3V0ZTRfaW5pdChzdHJ1Y3QgdGNmX3Byb3RvICp0cCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCityb3V0ZTRfZGVsZXRlX2ZpbHRlcihzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgc3RydWN0IHJvdXRlNF9maWx0ZXIgKmYpCit7CisJdGNmX3VuYmluZF9maWx0ZXIodHAsICZmLT5yZXMpOworCXRjZl9leHRzX2Rlc3Ryb3kodHAsICZmLT5leHRzKTsKKwlrZnJlZShmKTsKK30KKworc3RhdGljIHZvaWQgcm91dGU0X2Rlc3Ryb3koc3RydWN0IHRjZl9wcm90byAqdHApCit7CisJc3RydWN0IHJvdXRlNF9oZWFkICpoZWFkID0geGNoZygmdHAtPnJvb3QsIE5VTEwpOworCWludCBoMSwgaDI7CisKKwlpZiAoaGVhZCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlmb3IgKGgxPTA7IGgxPD0yNTY7IGgxKyspIHsKKwkJc3RydWN0IHJvdXRlNF9idWNrZXQgKmI7CisKKwkJaWYgKChiID0gaGVhZC0+dGFibGVbaDFdKSAhPSBOVUxMKSB7CisJCQlmb3IgKGgyPTA7IGgyPD0zMjsgaDIrKykgeworCQkJCXN0cnVjdCByb3V0ZTRfZmlsdGVyICpmOworCisJCQkJd2hpbGUgKChmID0gYi0+aHRbaDJdKSAhPSBOVUxMKSB7CisJCQkJCWItPmh0W2gyXSA9IGYtPm5leHQ7CisJCQkJCXJvdXRlNF9kZWxldGVfZmlsdGVyKHRwLCBmKTsKKwkJCQl9CisJCQl9CisJCQlrZnJlZShiKTsKKwkJfQorCX0KKwlrZnJlZShoZWFkKTsKK30KKworc3RhdGljIGludCByb3V0ZTRfZGVsZXRlKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgcm91dGU0X2hlYWQgKmhlYWQgPSAoc3RydWN0IHJvdXRlNF9oZWFkKil0cC0+cm9vdDsKKwlzdHJ1Y3Qgcm91dGU0X2ZpbHRlciAqKmZwLCAqZiA9IChzdHJ1Y3Qgcm91dGU0X2ZpbHRlciopYXJnOworCXVuc2lnbmVkIGggPSAwOworCXN0cnVjdCByb3V0ZTRfYnVja2V0ICpiOworCWludCBpOworCisJaWYgKCFoZWFkIHx8ICFmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWggPSBmLT5oYW5kbGU7CisJYiA9IGYtPmJrdDsKKworCWZvciAoZnAgPSAmYi0+aHRbZnJvbV9oYXNoKGg+PjE2KV07ICpmcDsgZnAgPSAmKCpmcCktPm5leHQpIHsKKwkJaWYgKCpmcCA9PSBmKSB7CisJCQl0Y2ZfdHJlZV9sb2NrKHRwKTsKKwkJCSpmcCA9IGYtPm5leHQ7CisJCQl0Y2ZfdHJlZV91bmxvY2sodHApOworCisJCQlyb3V0ZTRfcmVzZXRfZmFzdG1hcCh0cC0+cS0+ZGV2LCBoZWFkLCBmLT5pZCk7CisJCQlyb3V0ZTRfZGVsZXRlX2ZpbHRlcih0cCwgZik7CisKKwkJCS8qIFN0cmlwIHRyZWUgKi8KKworCQkJZm9yIChpPTA7IGk8PTMyOyBpKyspCisJCQkJaWYgKGItPmh0W2ldKQorCQkJCQlyZXR1cm4gMDsKKworCQkJLyogT0ssIHNlc3Npb24gaGFzIG5vIGZsb3dzICovCisJCQl0Y2ZfdHJlZV9sb2NrKHRwKTsKKwkJCWhlYWQtPnRhYmxlW3RvX2hhc2goaCldID0gTlVMTDsKKwkJCXRjZl90cmVlX3VubG9jayh0cCk7CisKKwkJCWtmcmVlKGIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcm91dGU0X3NldF9wYXJtcyhzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBiYXNlLAorCXN0cnVjdCByb3V0ZTRfZmlsdGVyICpmLCB1MzIgaGFuZGxlLCBzdHJ1Y3Qgcm91dGU0X2hlYWQgKmhlYWQsCisJc3RydWN0IHJ0YXR0ciAqKnRiLCBzdHJ1Y3QgcnRhdHRyICplc3QsIGludCBuZXcpCit7CisJaW50IGVycjsKKwl1MzIgaWQgPSAwLCB0byA9IDAsIG5oYW5kbGUgPSAweDgwMDA7CisJc3RydWN0IHJvdXRlNF9maWx0ZXIgKmZwOworCXVuc2lnbmVkIGludCBoMTsKKwlzdHJ1Y3Qgcm91dGU0X2J1Y2tldCAqYjsKKwlzdHJ1Y3QgdGNmX2V4dHMgZTsKKworCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKHRwLCB0YiwgZXN0LCAmZSwgJnJvdXRlX2V4dF9tYXApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gLUVJTlZBTDsKKwlpZiAodGJbVENBX1JPVVRFNF9DTEFTU0lELTFdKQorCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX1JPVVRFNF9DTEFTU0lELTFdKSA8IHNpemVvZih1MzIpKQorCQkJZ290byBlcnJvdXQ7CisKKwlpZiAodGJbVENBX1JPVVRFNF9UTy0xXSkgeworCQlpZiAobmV3ICYmIGhhbmRsZSAmIDB4ODAwMCkKKwkJCWdvdG8gZXJyb3V0OworCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX1JPVVRFNF9UTy0xXSkgPCBzaXplb2YodTMyKSkKKwkJCWdvdG8gZXJyb3V0OworCQl0byA9ICoodTMyKilSVEFfREFUQSh0YltUQ0FfUk9VVEU0X1RPLTFdKTsKKwkJaWYgKHRvID4gMHhGRikKKwkJCWdvdG8gZXJyb3V0OworCQluaGFuZGxlID0gdG87CisJfQorCisJaWYgKHRiW1RDQV9ST1VURTRfRlJPTS0xXSkgeworCQlpZiAodGJbVENBX1JPVVRFNF9JSUYtMV0pCisJCQlnb3RvIGVycm91dDsKKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9ST1VURTRfRlJPTS0xXSkgPCBzaXplb2YodTMyKSkKKwkJCWdvdG8gZXJyb3V0OworCQlpZCA9ICoodTMyKilSVEFfREFUQSh0YltUQ0FfUk9VVEU0X0ZST00tMV0pOworCQlpZiAoaWQgPiAweEZGKQorCQkJZ290byBlcnJvdXQ7CisJCW5oYW5kbGUgfD0gaWQgPDwgMTY7CisJfSBlbHNlIGlmICh0YltUQ0FfUk9VVEU0X0lJRi0xXSkgeworCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX1JPVVRFNF9JSUYtMV0pIDwgc2l6ZW9mKHUzMikpCisJCQlnb3RvIGVycm91dDsKKwkJaWQgPSAqKHUzMiopUlRBX0RBVEEodGJbVENBX1JPVVRFNF9JSUYtMV0pOworCQlpZiAoaWQgPiAweDdGRkYpCisJCQlnb3RvIGVycm91dDsKKwkJbmhhbmRsZSB8PSAoaWQgfCAweDgwMDApIDw8IDE2OworCX0gZWxzZQorCQluaGFuZGxlIHw9IDB4RkZGRiA8PCAxNjsKKworCWlmIChoYW5kbGUgJiYgbmV3KSB7CisJCW5oYW5kbGUgfD0gaGFuZGxlICYgMHg3RjAwOworCQlpZiAobmhhbmRsZSAhPSBoYW5kbGUpCisJCQlnb3RvIGVycm91dDsKKwl9CisKKwloMSA9IHRvX2hhc2gobmhhbmRsZSk7CisJaWYgKChiID0gaGVhZC0+dGFibGVbaDFdKSA9PSBOVUxMKSB7CisJCWVyciA9IC1FTk9CVUZTOworCQliID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJvdXRlNF9idWNrZXQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGIgPT0gTlVMTCkKKwkJCWdvdG8gZXJyb3V0OworCQltZW1zZXQoYiwgMCwgc2l6ZW9mKCpiKSk7CisKKwkJdGNmX3RyZWVfbG9jayh0cCk7CisJCWhlYWQtPnRhYmxlW2gxXSA9IGI7CisJCXRjZl90cmVlX3VubG9jayh0cCk7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgaW50IGgyID0gZnJvbV9oYXNoKG5oYW5kbGUgPj4gMTYpOworCQllcnIgPSAtRUVYSVNUOworCQlmb3IgKGZwID0gYi0+aHRbaDJdOyBmcDsgZnAgPSBmcC0+bmV4dCkKKwkJCWlmIChmcC0+aGFuZGxlID09IGYtPmhhbmRsZSkKKwkJCQlnb3RvIGVycm91dDsKKwl9CisKKwl0Y2ZfdHJlZV9sb2NrKHRwKTsKKwlpZiAodGJbVENBX1JPVVRFNF9UTy0xXSkKKwkJZi0+aWQgPSB0bzsKKworCWlmICh0YltUQ0FfUk9VVEU0X0ZST00tMV0pCisJCWYtPmlkID0gdG8gfCBpZDw8MTY7CisJZWxzZSBpZiAodGJbVENBX1JPVVRFNF9JSUYtMV0pCisJCWYtPmlpZiA9IGlkOworCisJZi0+aGFuZGxlID0gbmhhbmRsZTsKKwlmLT5ia3QgPSBiOworCXRjZl90cmVlX3VubG9jayh0cCk7CisKKwlpZiAodGJbVENBX1JPVVRFNF9DTEFTU0lELTFdKSB7CisJCWYtPnJlcy5jbGFzc2lkID0gKih1MzIqKVJUQV9EQVRBKHRiW1RDQV9ST1VURTRfQ0xBU1NJRC0xXSk7CisJCXRjZl9iaW5kX2ZpbHRlcih0cCwgJmYtPnJlcywgYmFzZSk7CisJfQorCisJdGNmX2V4dHNfY2hhbmdlKHRwLCAmZi0+ZXh0cywgJmUpOworCisJcmV0dXJuIDA7CitlcnJvdXQ6CisJdGNmX2V4dHNfZGVzdHJveSh0cCwgJmUpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcm91dGU0X2NoYW5nZShzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBiYXNlLAorCQkgICAgICAgdTMyIGhhbmRsZSwKKwkJICAgICAgIHN0cnVjdCBydGF0dHIgKip0Y2EsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICphcmcpCit7CisJc3RydWN0IHJvdXRlNF9oZWFkICpoZWFkID0gdHAtPnJvb3Q7CisJc3RydWN0IHJvdXRlNF9maWx0ZXIgKmYsICpmMSwgKipmcDsKKwlzdHJ1Y3Qgcm91dGU0X2J1Y2tldCAqYjsKKwlzdHJ1Y3QgcnRhdHRyICpvcHQgPSB0Y2FbVENBX09QVElPTlMtMV07CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX1JPVVRFNF9NQVhdOworCXVuc2lnbmVkIGludCBoLCB0aDsKKwl1MzIgb2xkX2hhbmRsZSA9IDA7CisJaW50IGVycjsKKworCWlmIChvcHQgPT0gTlVMTCkKKwkJcmV0dXJuIGhhbmRsZSA/IC1FSU5WQUwgOiAwOworCisJaWYgKHJ0YXR0cl9wYXJzZV9uZXN0ZWQodGIsIFRDQV9ST1VURTRfTUFYLCBvcHQpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKGYgPSAoc3RydWN0IHJvdXRlNF9maWx0ZXIqKSphcmcpICE9IE5VTEwpIHsKKwkJaWYgKGYtPmhhbmRsZSAhPSBoYW5kbGUgJiYgaGFuZGxlKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGYtPmJrdCkKKwkJCW9sZF9oYW5kbGUgPSBmLT5oYW5kbGU7CisKKwkJZXJyID0gcm91dGU0X3NldF9wYXJtcyh0cCwgYmFzZSwgZiwgaGFuZGxlLCBoZWFkLCB0YiwKKwkJCXRjYVtUQ0FfUkFURS0xXSwgMCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKworCQlnb3RvIHJlaW5zZXJ0OworCX0KKworCWVyciA9IC1FTk9CVUZTOworCWlmIChoZWFkID09IE5VTEwpIHsKKwkJaGVhZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCByb3V0ZTRfaGVhZCksIEdGUF9LRVJORUwpOworCQlpZiAoaGVhZCA9PSBOVUxMKQorCQkJZ290byBlcnJvdXQ7CisJCW1lbXNldChoZWFkLCAwLCBzaXplb2Yoc3RydWN0IHJvdXRlNF9oZWFkKSk7CisKKwkJdGNmX3RyZWVfbG9jayh0cCk7CisJCXRwLT5yb290ID0gaGVhZDsKKwkJdGNmX3RyZWVfdW5sb2NrKHRwKTsKKwl9CisKKwlmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJvdXRlNF9maWx0ZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZiA9PSBOVUxMKQorCQlnb3RvIGVycm91dDsKKwltZW1zZXQoZiwgMCwgc2l6ZW9mKCpmKSk7CisKKwllcnIgPSByb3V0ZTRfc2V0X3Bhcm1zKHRwLCBiYXNlLCBmLCBoYW5kbGUsIGhlYWQsIHRiLAorCQl0Y2FbVENBX1JBVEUtMV0sIDEpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm91dDsKKworcmVpbnNlcnQ6CisJaCA9IGZyb21faGFzaChmLT5oYW5kbGUgPj4gMTYpOworCWZvciAoZnAgPSAmZi0+Ymt0LT5odFtoXTsgKGYxPSpmcCkgIT0gTlVMTDsgZnAgPSAmZjEtPm5leHQpCisJCWlmIChmLT5oYW5kbGUgPCBmMS0+aGFuZGxlKQorCQkJYnJlYWs7CisKKwlmLT5uZXh0ID0gZjE7CisJdGNmX3RyZWVfbG9jayh0cCk7CisJKmZwID0gZjsKKworCWlmIChvbGRfaGFuZGxlICYmIGYtPmhhbmRsZSAhPSBvbGRfaGFuZGxlKSB7CisJCXRoID0gdG9faGFzaChvbGRfaGFuZGxlKTsKKwkJaCA9IGZyb21faGFzaChvbGRfaGFuZGxlID4+IDE2KTsKKwkJaWYgKChiID0gaGVhZC0+dGFibGVbdGhdKSAhPSBOVUxMKSB7CisJCQlmb3IgKGZwID0gJmItPmh0W2hdOyAqZnA7IGZwID0gJigqZnApLT5uZXh0KSB7CisJCQkJaWYgKCpmcCA9PSBmKSB7CisJCQkJCSpmcCA9IGYtPm5leHQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwl0Y2ZfdHJlZV91bmxvY2sodHApOworCisJcm91dGU0X3Jlc2V0X2Zhc3RtYXAodHAtPnEtPmRldiwgaGVhZCwgZi0+aWQpOworCSphcmcgPSAodW5zaWduZWQgbG9uZylmOworCXJldHVybiAwOworCitlcnJvdXQ6CisJaWYgKGYpCisJCWtmcmVlKGYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHJvdXRlNF93YWxrKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCBzdHJ1Y3QgdGNmX3dhbGtlciAqYXJnKQoreworCXN0cnVjdCByb3V0ZTRfaGVhZCAqaGVhZCA9IHRwLT5yb290OworCXVuc2lnbmVkIGgsIGgxOworCisJaWYgKGhlYWQgPT0gTlVMTCkKKwkJYXJnLT5zdG9wID0gMTsKKworCWlmIChhcmctPnN0b3ApCisJCXJldHVybjsKKworCWZvciAoaCA9IDA7IGggPD0gMjU2OyBoKyspIHsKKwkJc3RydWN0IHJvdXRlNF9idWNrZXQgKmIgPSBoZWFkLT50YWJsZVtoXTsKKworCQlpZiAoYikgeworCQkJZm9yIChoMSA9IDA7IGgxIDw9IDMyOyBoMSsrKSB7CisJCQkJc3RydWN0IHJvdXRlNF9maWx0ZXIgKmY7CisKKwkJCQlmb3IgKGYgPSBiLT5odFtoMV07IGY7IGYgPSBmLT5uZXh0KSB7CisJCQkJCWlmIChhcmctPmNvdW50IDwgYXJnLT5za2lwKSB7CisJCQkJCQlhcmctPmNvdW50Kys7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlpZiAoYXJnLT5mbih0cCwgKHVuc2lnbmVkIGxvbmcpZiwgYXJnKSA8IDApIHsKKwkJCQkJCWFyZy0+c3RvcCA9IDE7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQkJYXJnLT5jb3VudCsrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGludCByb3V0ZTRfZHVtcChzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBmaCwKKwkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y21zZyAqdCkKK3sKKwlzdHJ1Y3Qgcm91dGU0X2ZpbHRlciAqZiA9IChzdHJ1Y3Qgcm91dGU0X2ZpbHRlciopZmg7CisJdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJc3RydWN0IHJ0YXR0ciAqcnRhOworCXUzMiBpZDsKKworCWlmIChmID09IE5VTEwpCisJCXJldHVybiBza2ItPmxlbjsKKworCXQtPnRjbV9oYW5kbGUgPSBmLT5oYW5kbGU7CisKKwlydGEgPSAoc3RydWN0IHJ0YXR0ciopYjsKKwlSVEFfUFVUKHNrYiwgVENBX09QVElPTlMsIDAsIE5VTEwpOworCisJaWYgKCEoZi0+aGFuZGxlJjB4ODAwMCkpIHsKKwkJaWQgPSBmLT5pZCYweEZGOworCQlSVEFfUFVUKHNrYiwgVENBX1JPVVRFNF9UTywgc2l6ZW9mKGlkKSwgJmlkKTsKKwl9CisJaWYgKGYtPmhhbmRsZSYweDgwMDAwMDAwKSB7CisJCWlmICgoZi0+aGFuZGxlPj4xNikgIT0gMHhGRkZGKQorCQkJUlRBX1BVVChza2IsIFRDQV9ST1VURTRfSUlGLCBzaXplb2YoZi0+aWlmKSwgJmYtPmlpZik7CisJfSBlbHNlIHsKKwkJaWQgPSBmLT5pZD4+MTY7CisJCVJUQV9QVVQoc2tiLCBUQ0FfUk9VVEU0X0ZST00sIHNpemVvZihpZCksICZpZCk7CisJfQorCWlmIChmLT5yZXMuY2xhc3NpZCkKKwkJUlRBX1BVVChza2IsIFRDQV9ST1VURTRfQ0xBU1NJRCwgNCwgJmYtPnJlcy5jbGFzc2lkKTsKKworCWlmICh0Y2ZfZXh0c19kdW1wKHNrYiwgJmYtPmV4dHMsICZyb3V0ZV9leHRfbWFwKSA8IDApCisJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CisKKwlydGEtPnJ0YV9sZW4gPSBza2ItPnRhaWwgLSBiOworCisJaWYgKHRjZl9leHRzX2R1bXBfc3RhdHMoc2tiLCAmZi0+ZXh0cywgJnJvdXRlX2V4dF9tYXApIDwgMCkKKwkJZ290byBydGF0dHJfZmFpbHVyZTsKKworCXJldHVybiBza2ItPmxlbjsKKworcnRhdHRyX2ZhaWx1cmU6CisJc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGNmX3Byb3RvX29wcyBjbHNfcm91dGU0X29wcyA9IHsKKwkubmV4dAkJPQlOVUxMLAorCS5raW5kCQk9CSJyb3V0ZSIsCisJLmNsYXNzaWZ5CT0Jcm91dGU0X2NsYXNzaWZ5LAorCS5pbml0CQk9CXJvdXRlNF9pbml0LAorCS5kZXN0cm95CT0Jcm91dGU0X2Rlc3Ryb3ksCisJLmdldAkJPQlyb3V0ZTRfZ2V0LAorCS5wdXQJCT0Jcm91dGU0X3B1dCwKKwkuY2hhbmdlCQk9CXJvdXRlNF9jaGFuZ2UsCisJLmRlbGV0ZQkJPQlyb3V0ZTRfZGVsZXRlLAorCS53YWxrCQk9CXJvdXRlNF93YWxrLAorCS5kdW1wCQk9CXJvdXRlNF9kdW1wLAorCS5vd25lcgkJPQlUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcm91dGU0KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX3RjZl9wcm90b19vcHMoJmNsc19yb3V0ZTRfb3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfcm91dGU0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl90Y2ZfcHJvdG9fb3BzKCZjbHNfcm91dGU0X29wcyk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfcm91dGU0KQorbW9kdWxlX2V4aXQoZXhpdF9yb3V0ZTQpCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX3JzdnAuYyBiL25ldC9zY2hlZC9jbHNfcnN2cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMjYxMzcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2NoZWQvY2xzX3JzdnAuYwpAQCAtMCwwICsxLDQzIEBACisvKgorICogbmV0L3NjaGVkL2Nsc19yc3ZwLmMJU3BlY2lhbCBSU1ZQIHBhY2tldCBjbGFzc2lmaWVyIGZvciBJUHY0LgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvYWN0X2FwaS5oPgorI2luY2x1ZGUgPG5ldC9wa3RfY2xzLmg+CisKKyNkZWZpbmUgUlNWUF9EU1RfTEVOCTEKKyNkZWZpbmUgUlNWUF9JRAkJInJzdnAiCisjZGVmaW5lIFJTVlBfT1BTCWNsc19yc3ZwX29wcworCisjaW5jbHVkZSAiY2xzX3JzdnAuaCIKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfcnN2cC5oIGIvbmV0L3NjaGVkL2Nsc19yc3ZwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMyZmI5MQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY2hlZC9jbHNfcnN2cC5oCkBAIC0wLDAgKzEsNjY3IEBACisvKgorICogbmV0L3NjaGVkL2Nsc19yc3ZwLmgJVGVtcGxhdGUgZmlsZSBmb3IgUlNWUHZbNDZdIGNsYXNzaWZpZXJzLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqLworCisvKgorICAgQ29tcGFyaW5nIHRvIGdlbmVyYWwgcGFja2V0IGNsYXNzaWZpY2F0aW9uIHByb2JsZW0sCisgICBSU1ZQIG5lZWRzIG9ubHkgc2V2YXJhbCByZWxhdGl2ZWx5IHNpbXBsZSBydWxlczoKKworICAgKiAoZHN0LCBwcm90b2NvbCkgYXJlIGFsd2F5cyBzcGVjaWZpZWQsCisgICAgIHNvIHRoYXQgd2UgYXJlIGFibGUgdG8gaGFzaCB0aGVtLgorICAgKiBzcmMgbWF5IGJlIGV4YWN0LCBvciBtYXkgYmUgd2lsZGNhcmQsIHNvIHRoYXQKKyAgICAgd2UgY2FuIGtlZXAgYSBoYXNoIHRhYmxlIHBsdXMgb25lIHdpbGRjYXJkIGVudHJ5LgorICAgKiBzb3VyY2UgcG9ydCAob3IgZmxvdyBsYWJlbCkgaXMgaW1wb3J0YW50IG9ubHkgaWYgc3JjIGlzIGdpdmVuLgorCisgICBJTVBMRU1FTlRBVElPTi4KKworICAgV2UgdXNlIGEgdHdvIGxldmVsIGhhc2ggdGFibGU6IFRoZSB0b3AgbGV2ZWwgaXMga2V5ZWQgYnkKKyAgIGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kIHByb3RvY29sIElELCBldmVyeSBidWNrZXQgY29udGFpbnMgYSBsaXN0CisgICBvZiAicnN2cCBzZXNzaW9ucyIsIGlkZW50aWZpZWQgYnkgZGVzdGluYXRpb24gYWRkcmVzcywgcHJvdG9jb2wgYW5kCisgICBEUEkoPSJEZXN0aW5hdGlvbiBQb3J0IElEIik6IHRyaXBsZSAoa2V5LCBtYXNrLCBvZmZzZXQpLgorCisgICBFdmVyeSBidWNrZXQgaGFzIGEgc21hbGxlciBoYXNoIHRhYmxlIGtleWVkIGJ5IHNvdXJjZSBhZGRyZXNzCisgICAoY2YuIFJTVlAgZmxvd3NwZWMpIGFuZCBvbmUgd2lsZGNhcmQgZW50cnkgZm9yIHdpbGRjYXJkIHJlc2VydmF0aW9ucy4KKyAgIEV2ZXJ5IGJ1Y2tldCBpcyBhZ2FpbiBhIGxpc3Qgb2YgIlJTVlAgZmxvd3MiLCBzZWxlY3RlZCBieQorICAgc291cmNlIGFkZHJlc3MgYW5kIFNQSSg9IlNvdXJjZSBQb3J0IElEIiBoZXJlIHJhdGhlciB0aGFuCisgICAic2VjdXJpdHkgcGFyYW1ldGVyIGluZGV4Iik6IHRyaXBsZSAoa2V5LCBtYXNrLCBvZmZzZXQpLgorCisKKyAgIE5PVEUgMS4gQWxsIHRoZSBwYWNrZXRzIHdpdGggSVB2NiBleHRlbnNpb24gaGVhZGVycyAoYnV0IEFIIGFuZCBFU1ApCisgICBhbmQgYWxsIGZyYWdtZW50ZWQgcGFja2V0cyBnbyB0byB0aGUgYmVzdC1lZmZvcnQgdHJhZmZpYyBjbGFzcy4KKworCisgICBOT1RFIDIuIFR3byAicG9ydCBpZCIncyBzZWVtcyB0byBiZSByZWR1bmRhbnQsIHJmYzIyMDcgcmVxdWlyZXMKKyAgIG9ubHkgb25lICJHZW5lcmFsaXplZCBQb3J0IElkZW50aWZpZXIiLiBTbyB0aGF0IGZvciBjbGFzc2ljCisgICBhaCwgZXNwIChhbmQgdWRwLHRjcCkgYm90aCAqcGkgc2hvdWxkIGNvaW5jaWRlIG9yIG9uZSBvZiB0aGVtCisgICBzaG91bGQgYmUgd2lsZGNhcmQuCisKKyAgIEF0IGZpcnN0IHNpZ2h0LCB0aGlzIHJlZHVuZGFuY3kgaXMganVzdCBhIHdhc3RlIG9mIENQVQorICAgcmVzb3VyY2VzLiBCdXQgRFBJIGFuZCBTUEkgYWRkIHRoZSBwb3NzaWJpbGl0eSB0byBhc3NpZ24gZGlmZmVyZW50CisgICBwcmlvcml0aWVzIHRvIEdQSXMuIExvb2sgYWxzbyBhdCBub3RlIDQgYWJvdXQgdHVubmVscyBiZWxvdy4KKworCisgICBOT1RFIDMuIE9uZSBjb21wbGljYXRpb24gaXMgdGhlIGNhc2Ugb2YgdHVubmVsZWQgcGFja2V0cy4KKyAgIFdlIGltcGxlbWVudCBpdCBhcyBmb2xsb3dpbmc6IGlmIHRoZSBmaXJzdCBsb29rdXAKKyAgIG1hdGNoZXMgYSBzcGVjaWFsIHNlc3Npb24gd2l0aCAidHVubmVsaGRyIiB2YWx1ZSBub3QgemVybywKKyAgIGZsb3dpZCBkb2Vzbid0IGNvbnRhaW4gdGhlIHRydWUgZmxvdyBJRCwgYnV0IHRoZSB0dW5uZWwgSUQgKDEuLi4yNTUpLgorICAgSW4gdGhpcyBjYXNlLCB3ZSBwdWxsIHR1bm5lbGhkciBieXRlcyBhbmQgcmVzdGFydCBsb29rdXAKKyAgIHdpdGggdHVubmVsIElEIGFkZGVkIHRvIHRoZSBsaXN0IG9mIGtleXMuIFNpbXBsZSBhbmQgc3R1cGlkIDgpOCkKKyAgIEl0J3MgZW5vdWdoIGZvciBQSU1SRUcgYW5kIElQSVAuCisKKworICAgTk9URSA0LiBUd28gR1BJcyBtYWtlIGl0IHBvc3NpYmxlIHRvIHBhcnNlIGV2ZW4gR1JFIHBhY2tldHMuCisgICBGLmUuIERQSSBjYW4gc2VsZWN0IEVUSF9QX0lQIChhbmQgbmVjZXNzYXJ5IGZsYWdzIHRvIG1ha2UKKyAgIHR1bm5lbGhkciBjb3JyZWN0KSBpbiBHUkUgcHJvdG9jb2wgZmllbGQgYW5kIFNQSSBtYXRjaGVzCisgICBHUkUga2V5LiBJcyBpdCBub3QgbmljZT8gOCk4KQorCisKKyAgIFdlbGwsIGFzIHJlc3VsdCwgZGVzcGl0ZSBpdHMgc2ltcGxpY2l0eSwgd2UgZ2V0IGEgcHJldHR5CisgICBwb3dlcmZ1bCBjbGFzc2lmaWNhdGlvbiBlbmdpbmUuICAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKK3N0cnVjdCByc3ZwX2hlYWQKK3sKKwl1MzIJCQl0bWFwWzI1Ni8zMl07CisJdTMyCQkJaGdlbmVyYXRvcjsKKwl1OAkJCXRnZW5lcmF0b3I7CisJc3RydWN0IHJzdnBfc2Vzc2lvbgkqaHRbMjU2XTsKK307CisKK3N0cnVjdCByc3ZwX3Nlc3Npb24KK3sKKwlzdHJ1Y3QgcnN2cF9zZXNzaW9uCSpuZXh0OworCXUzMgkJCWRzdFtSU1ZQX0RTVF9MRU5dOworCXN0cnVjdCB0Y19yc3ZwX2dwaSAJZHBpOworCXU4CQkJcHJvdG9jb2w7CisJdTgJCQl0dW5uZWxpZDsKKwkvKiAxNiAoc3JjLHNwb3J0KSBoYXNoIHNsb3RzLCBhbmQgb25lIHdpbGRjYXJkIHNvdXJjZSBzbG90ICovCisJc3RydWN0IHJzdnBfZmlsdGVyCSpodFsxNisxXTsKK307CisKKworc3RydWN0IHJzdnBfZmlsdGVyCit7CisJc3RydWN0IHJzdnBfZmlsdGVyCSpuZXh0OworCXUzMgkJCXNyY1tSU1ZQX0RTVF9MRU5dOworCXN0cnVjdCB0Y19yc3ZwX2dwaQlzcGk7CisJdTgJCQl0dW5uZWxoZHI7CisKKwlzdHJ1Y3QgdGNmX3Jlc3VsdAlyZXM7CisJc3RydWN0IHRjZl9leHRzCQlleHRzOworCisJdTMyCQkJaGFuZGxlOworCXN0cnVjdCByc3ZwX3Nlc3Npb24JKnNlc3M7Cit9OworCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBoYXNoX2RzdCh1MzIgKmRzdCwgdTggcHJvdG9jb2wsIHU4IHR1bm5lbGlkKQoreworCXVuc2lnbmVkIGggPSBkc3RbUlNWUF9EU1RfTEVOLTFdOworCWggXj0gaD4+MTY7CisJaCBePSBoPj44OworCXJldHVybiAoaCBeIHByb3RvY29sIF4gdHVubmVsaWQpICYgMHhGRjsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaGFzaF9zcmModTMyICpzcmMpCit7CisJdW5zaWduZWQgaCA9IHNyY1tSU1ZQX0RTVF9MRU4tMV07CisJaCBePSBoPj4xNjsKKwloIF49IGg+Pjg7CisJaCBePSBoPj40OworCXJldHVybiBoICYgMHhGOworfQorCitzdGF0aWMgc3RydWN0IHRjZl9leHRfbWFwIHJzdnBfZXh0X21hcCA9IHsKKwkucG9saWNlID0gVENBX1JTVlBfUE9MSUNFLAorCS5hY3Rpb24gPSBUQ0FfUlNWUF9BQ1QKK307CisKKyNkZWZpbmUgUlNWUF9BUFBMWV9SRVNVTFQoKQkJCQlcCit7CQkJCQkJCVwKKwlpbnQgciA9IHRjZl9leHRzX2V4ZWMoc2tiLCAmZi0+ZXh0cywgcmVzKTsJXAorCWlmIChyIDwgMCkJCQkJCVwKKwkJY29udGludWU7CQkJCVwKKwllbHNlIGlmIChyID4gMCkJCQkJCVwKKwkJcmV0dXJuIHI7CQkJCVwKK30KKwkKK3N0YXRpYyBpbnQgcnN2cF9jbGFzc2lmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKKwkJCSBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQoreworCXN0cnVjdCByc3ZwX3Nlc3Npb24gKipzaHQgPSAoKHN0cnVjdCByc3ZwX2hlYWQqKXRwLT5yb290KS0+aHQ7CisJc3RydWN0IHJzdnBfc2Vzc2lvbiAqczsKKwlzdHJ1Y3QgcnN2cF9maWx0ZXIgKmY7CisJdW5zaWduZWQgaDEsIGgyOworCXUzMiAqZHN0LCAqc3JjOworCXU4IHByb3RvY29sOworCXU4IHR1bm5lbGlkID0gMDsKKwl1OCAqeHBydDsKKyNpZiBSU1ZQX0RTVF9MRU4gPT0gNAorCXN0cnVjdCBpcHY2aGRyICpuaHB0ciA9IHNrYi0+bmguaXB2Nmg7CisjZWxzZQorCXN0cnVjdCBpcGhkciAqbmhwdHIgPSBza2ItPm5oLmlwaDsKKyNlbmRpZgorCityZXN0YXJ0OgorCisjaWYgUlNWUF9EU1RfTEVOID09IDQKKwlzcmMgPSAmbmhwdHItPnNhZGRyLnM2X2FkZHIzMlswXTsKKwlkc3QgPSAmbmhwdHItPmRhZGRyLnM2X2FkZHIzMlswXTsKKwlwcm90b2NvbCA9IG5ocHRyLT5uZXh0aGRyOworCXhwcnQgPSAoKHU4KiluaHB0cikgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworI2Vsc2UKKwlzcmMgPSAmbmhwdHItPnNhZGRyOworCWRzdCA9ICZuaHB0ci0+ZGFkZHI7CisJcHJvdG9jb2wgPSBuaHB0ci0+cHJvdG9jb2w7CisJeHBydCA9ICgodTgqKW5ocHRyKSArIChuaHB0ci0+aWhsPDwyKTsKKwlpZiAobmhwdHItPmZyYWdfb2ZmJl9fY29uc3RhbnRfaHRvbnMoSVBfTUZ8SVBfT0ZGU0VUKSkKKwkJcmV0dXJuIC0xOworI2VuZGlmCisKKwloMSA9IGhhc2hfZHN0KGRzdCwgcHJvdG9jb2wsIHR1bm5lbGlkKTsKKwloMiA9IGhhc2hfc3JjKHNyYyk7CisKKwlmb3IgKHMgPSBzaHRbaDFdOyBzOyBzID0gcy0+bmV4dCkgeworCQlpZiAoZHN0W1JTVlBfRFNUX0xFTi0xXSA9PSBzLT5kc3RbUlNWUF9EU1RfTEVOLTFdICYmCisJCSAgICBwcm90b2NvbCA9PSBzLT5wcm90b2NvbCAmJgorCQkgICAgIShzLT5kcGkubWFzayAmICgqKHUzMiopKHhwcnQrcy0+ZHBpLm9mZnNldClecy0+ZHBpLmtleSkpCisjaWYgUlNWUF9EU1RfTEVOID09IDQKKwkJICAgICYmIGRzdFswXSA9PSBzLT5kc3RbMF0KKwkJICAgICYmIGRzdFsxXSA9PSBzLT5kc3RbMV0KKwkJICAgICYmIGRzdFsyXSA9PSBzLT5kc3RbMl0KKyNlbmRpZgorCQkgICAgJiYgdHVubmVsaWQgPT0gcy0+dHVubmVsaWQpIHsKKworCQkJZm9yIChmID0gcy0+aHRbaDJdOyBmOyBmID0gZi0+bmV4dCkgeworCQkJCWlmIChzcmNbUlNWUF9EU1RfTEVOLTFdID09IGYtPnNyY1tSU1ZQX0RTVF9MRU4tMV0gJiYKKwkJCQkgICAgIShmLT5zcGkubWFzayAmICgqKHUzMiopKHhwcnQrZi0+c3BpLm9mZnNldCleZi0+c3BpLmtleSkpCisjaWYgUlNWUF9EU1RfTEVOID09IDQKKwkJCQkgICAgJiYgc3JjWzBdID09IGYtPnNyY1swXQorCQkJCSAgICAmJiBzcmNbMV0gPT0gZi0+c3JjWzFdCisJCQkJICAgICYmIHNyY1syXSA9PSBmLT5zcmNbMl0KKyNlbmRpZgorCQkJCSAgICApIHsKKwkJCQkJKnJlcyA9IGYtPnJlczsKKwkJCQkJUlNWUF9BUFBMWV9SRVNVTFQoKTsKKworbWF0Y2hlZDoKKwkJCQkJaWYgKGYtPnR1bm5lbGhkciA9PSAwKQorCQkJCQkJcmV0dXJuIDA7CisKKwkJCQkJdHVubmVsaWQgPSBmLT5yZXMuY2xhc3NpZDsKKwkJCQkJbmhwdHIgPSAodm9pZCopKHhwcnQgKyBmLT50dW5uZWxoZHIgLSBzaXplb2YoKm5ocHRyKSk7CisJCQkJCWdvdG8gcmVzdGFydDsKKwkJCQl9CisJCQl9CisKKwkJCS8qIEFuZCB3aWxkY2FyZCBidWNrZXQuLi4gKi8KKwkJCWZvciAoZiA9IHMtPmh0WzE2XTsgZjsgZiA9IGYtPm5leHQpIHsKKwkJCQkqcmVzID0gZi0+cmVzOworCQkJCVJTVlBfQVBQTFlfUkVTVUxUKCk7CisJCQkJZ290byBtYXRjaGVkOworCQkJfQorCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcnN2cF9nZXQoc3RydWN0IHRjZl9wcm90byAqdHAsIHUzMiBoYW5kbGUpCit7CisJc3RydWN0IHJzdnBfc2Vzc2lvbiAqKnNodCA9ICgoc3RydWN0IHJzdnBfaGVhZCopdHAtPnJvb3QpLT5odDsKKwlzdHJ1Y3QgcnN2cF9zZXNzaW9uICpzOworCXN0cnVjdCByc3ZwX2ZpbHRlciAqZjsKKwl1bnNpZ25lZCBoMSA9IGhhbmRsZSYweEZGOworCXVuc2lnbmVkIGgyID0gKGhhbmRsZT4+OCkmMHhGRjsKKworCWlmIChoMiA+IDE2KQorCQlyZXR1cm4gMDsKKworCWZvciAocyA9IHNodFtoMV07IHM7IHMgPSBzLT5uZXh0KSB7CisJCWZvciAoZiA9IHMtPmh0W2gyXTsgZjsgZiA9IGYtPm5leHQpIHsKKwkJCWlmIChmLT5oYW5kbGUgPT0gaGFuZGxlKQorCQkJCXJldHVybiAodW5zaWduZWQgbG9uZylmOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByc3ZwX3B1dChzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBmKQoreworfQorCitzdGF0aWMgaW50IHJzdnBfaW5pdChzdHJ1Y3QgdGNmX3Byb3RvICp0cCkKK3sKKwlzdHJ1Y3QgcnN2cF9oZWFkICpkYXRhOworCisJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCByc3ZwX2hlYWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGF0YSkgeworCQltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCByc3ZwX2hlYWQpKTsKKwkJdHAtPnJvb3QgPSBkYXRhOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FTk9CVUZTOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3JzdnBfZGVsZXRlX2ZpbHRlcihzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgc3RydWN0IHJzdnBfZmlsdGVyICpmKQoreworCXRjZl91bmJpbmRfZmlsdGVyKHRwLCAmZi0+cmVzKTsKKwl0Y2ZfZXh0c19kZXN0cm95KHRwLCAmZi0+ZXh0cyk7CisJa2ZyZWUoZik7Cit9CisKK3N0YXRpYyB2b2lkIHJzdnBfZGVzdHJveShzdHJ1Y3QgdGNmX3Byb3RvICp0cCkKK3sKKwlzdHJ1Y3QgcnN2cF9oZWFkICpkYXRhID0geGNoZygmdHAtPnJvb3QsIE5VTEwpOworCXN0cnVjdCByc3ZwX3Nlc3Npb24gKipzaHQ7CisJaW50IGgxLCBoMjsKKworCWlmIChkYXRhID09IE5VTEwpCisJCXJldHVybjsKKworCXNodCA9IGRhdGEtPmh0OworCisJZm9yIChoMT0wOyBoMTwyNTY7IGgxKyspIHsKKwkJc3RydWN0IHJzdnBfc2Vzc2lvbiAqczsKKworCQl3aGlsZSAoKHMgPSBzaHRbaDFdKSAhPSBOVUxMKSB7CisJCQlzaHRbaDFdID0gcy0+bmV4dDsKKworCQkJZm9yIChoMj0wOyBoMjw9MTY7IGgyKyspIHsKKwkJCQlzdHJ1Y3QgcnN2cF9maWx0ZXIgKmY7CisKKwkJCQl3aGlsZSAoKGYgPSBzLT5odFtoMl0pICE9IE5VTEwpIHsKKwkJCQkJcy0+aHRbaDJdID0gZi0+bmV4dDsKKwkJCQkJcnN2cF9kZWxldGVfZmlsdGVyKHRwLCBmKTsKKwkJCQl9CisJCQl9CisJCQlrZnJlZShzKTsKKwkJfQorCX0KKwlrZnJlZShkYXRhKTsKK30KKworc3RhdGljIGludCByc3ZwX2RlbGV0ZShzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHJzdnBfZmlsdGVyICoqZnAsICpmID0gKHN0cnVjdCByc3ZwX2ZpbHRlciopYXJnOworCXVuc2lnbmVkIGggPSBmLT5oYW5kbGU7CisJc3RydWN0IHJzdnBfc2Vzc2lvbiAqKnNwOworCXN0cnVjdCByc3ZwX3Nlc3Npb24gKnMgPSBmLT5zZXNzOworCWludCBpOworCisJZm9yIChmcCA9ICZzLT5odFsoaD4+OCkmMHhGRl07ICpmcDsgZnAgPSAmKCpmcCktPm5leHQpIHsKKwkJaWYgKCpmcCA9PSBmKSB7CisJCQl0Y2ZfdHJlZV9sb2NrKHRwKTsKKwkJCSpmcCA9IGYtPm5leHQ7CisJCQl0Y2ZfdHJlZV91bmxvY2sodHApOworCQkJcnN2cF9kZWxldGVfZmlsdGVyKHRwLCBmKTsKKworCQkJLyogU3RyaXAgdHJlZSAqLworCisJCQlmb3IgKGk9MDsgaTw9MTY7IGkrKykKKwkJCQlpZiAocy0+aHRbaV0pCisJCQkJCXJldHVybiAwOworCisJCQkvKiBPSywgc2Vzc2lvbiBoYXMgbm8gZmxvd3MgKi8KKwkJCWZvciAoc3AgPSAmKChzdHJ1Y3QgcnN2cF9oZWFkKil0cC0+cm9vdCktPmh0W2gmMHhGRl07CisJCQkgICAgICpzcDsgc3AgPSAmKCpzcCktPm5leHQpIHsKKwkJCQlpZiAoKnNwID09IHMpIHsKKwkJCQkJdGNmX3RyZWVfbG9jayh0cCk7CisJCQkJCSpzcCA9IHMtPm5leHQ7CisJCQkJCXRjZl90cmVlX3VubG9jayh0cCk7CisKKwkJCQkJa2ZyZWUocyk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBnZW5faGFuZGxlKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1bnNpZ25lZCBzYWx0KQoreworCXN0cnVjdCByc3ZwX2hlYWQgKmRhdGEgPSB0cC0+cm9vdDsKKwlpbnQgaSA9IDB4RkZGRjsKKworCXdoaWxlIChpLS0gPiAwKSB7CisJCXUzMiBoOworCQlpZiAoKGRhdGEtPmhnZW5lcmF0b3IgKz0gMHgxMDAwMCkgPT0gMCkKKwkJCWRhdGEtPmhnZW5lcmF0b3IgPSAweDEwMDAwOworCQloID0gZGF0YS0+aGdlbmVyYXRvcnxzYWx0OworCQlpZiAocnN2cF9nZXQodHAsIGgpID09IDApCisJCQlyZXR1cm4gaDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHVubmVsX2J0cyhzdHJ1Y3QgcnN2cF9oZWFkICpkYXRhKQoreworCWludCBuID0gZGF0YS0+dGdlbmVyYXRvcj4+NTsKKwl1MzIgYiA9IDE8PChkYXRhLT50Z2VuZXJhdG9yJjB4MUYpOworCQorCWlmIChkYXRhLT50bWFwW25dJmIpCisJCXJldHVybiAwOworCWRhdGEtPnRtYXBbbl0gfD0gYjsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgdHVubmVsX3JlY3ljbGUoc3RydWN0IHJzdnBfaGVhZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcnN2cF9zZXNzaW9uICoqc2h0ID0gZGF0YS0+aHQ7CisJdTMyIHRtYXBbMjU2LzMyXTsKKwlpbnQgaDEsIGgyOworCisJbWVtc2V0KHRtYXAsIDAsIHNpemVvZih0bWFwKSk7CisKKwlmb3IgKGgxPTA7IGgxPDI1NjsgaDErKykgeworCQlzdHJ1Y3QgcnN2cF9zZXNzaW9uICpzOworCQlmb3IgKHMgPSBzaHRbaDFdOyBzOyBzID0gcy0+bmV4dCkgeworCQkJZm9yIChoMj0wOyBoMjw9MTY7IGgyKyspIHsKKwkJCQlzdHJ1Y3QgcnN2cF9maWx0ZXIgKmY7CisKKwkJCQlmb3IgKGYgPSBzLT5odFtoMl07IGY7IGYgPSBmLT5uZXh0KSB7CisJCQkJCWlmIChmLT50dW5uZWxoZHIgPT0gMCkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlkYXRhLT50Z2VuZXJhdG9yID0gZi0+cmVzLmNsYXNzaWQ7CisJCQkJCXR1bm5lbF9idHMoZGF0YSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJbWVtY3B5KGRhdGEtPnRtYXAsIHRtYXAsIHNpemVvZih0bWFwKSk7Cit9CisKK3N0YXRpYyB1MzIgZ2VuX3R1bm5lbChzdHJ1Y3QgcnN2cF9oZWFkICpkYXRhKQoreworCWludCBpLCBrOworCisJZm9yIChrPTA7IGs8MjsgaysrKSB7CisJCWZvciAoaT0yNTU7IGk+MDsgaS0tKSB7CisJCQlpZiAoKytkYXRhLT50Z2VuZXJhdG9yID09IDApCisJCQkJZGF0YS0+dGdlbmVyYXRvciA9IDE7CisJCQlpZiAodHVubmVsX2J0cyhkYXRhKSkKKwkJCQlyZXR1cm4gZGF0YS0+dGdlbmVyYXRvcjsKKwkJfQorCQl0dW5uZWxfcmVjeWNsZShkYXRhKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnN2cF9jaGFuZ2Uoc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJICAgICAgIHUzMiBoYW5kbGUsCisJCSAgICAgICBzdHJ1Y3QgcnRhdHRyICoqdGNhLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyAqYXJnKQoreworCXN0cnVjdCByc3ZwX2hlYWQgKmRhdGEgPSB0cC0+cm9vdDsKKwlzdHJ1Y3QgcnN2cF9maWx0ZXIgKmYsICoqZnA7CisJc3RydWN0IHJzdnBfc2Vzc2lvbiAqcywgKipzcDsKKwlzdHJ1Y3QgdGNfcnN2cF9waW5mbyAqcGluZm8gPSBOVUxMOworCXN0cnVjdCBydGF0dHIgKm9wdCA9IHRjYVtUQ0FfT1BUSU9OUy0xXTsKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfUlNWUF9NQVhdOworCXN0cnVjdCB0Y2ZfZXh0cyBlOworCXVuc2lnbmVkIGgxLCBoMjsKKwl1MzIgKmRzdDsKKwlpbnQgZXJyOworCisJaWYgKG9wdCA9PSBOVUxMKQorCQlyZXR1cm4gaGFuZGxlID8gLUVJTlZBTCA6IDA7CisKKwlpZiAocnRhdHRyX3BhcnNlX25lc3RlZCh0YiwgVENBX1JTVlBfTUFYLCBvcHQpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZSh0cCwgdGIsIHRjYVtUQ0FfUkFURS0xXSwgJmUsICZyc3ZwX2V4dF9tYXApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKChmID0gKHN0cnVjdCByc3ZwX2ZpbHRlciopKmFyZykgIT0gTlVMTCkgeworCQkvKiBOb2RlIGV4aXN0czogYWRqdXN0IG9ubHkgY2xhc3NpZCAqLworCisJCWlmIChmLT5oYW5kbGUgIT0gaGFuZGxlICYmIGhhbmRsZSkKKwkJCWdvdG8gZXJyb3V0MjsKKwkJaWYgKHRiW1RDQV9SU1ZQX0NMQVNTSUQtMV0pIHsKKwkJCWYtPnJlcy5jbGFzc2lkID0gKih1MzIqKVJUQV9EQVRBKHRiW1RDQV9SU1ZQX0NMQVNTSUQtMV0pOworCQkJdGNmX2JpbmRfZmlsdGVyKHRwLCAmZi0+cmVzLCBiYXNlKTsKKwkJfQorCisJCXRjZl9leHRzX2NoYW5nZSh0cCwgJmYtPmV4dHMsICZlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogTm93IG1vcmUgc2VyaW91cyBwYXJ0Li4uICovCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoaGFuZGxlKQorCQlnb3RvIGVycm91dDI7CisJaWYgKHRiW1RDQV9SU1ZQX0RTVC0xXSA9PSBOVUxMKQorCQlnb3RvIGVycm91dDI7CisKKwllcnIgPSAtRU5PQlVGUzsKKwlmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJzdnBfZmlsdGVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGYgPT0gTlVMTCkKKwkJZ290byBlcnJvdXQyOworCisJbWVtc2V0KGYsIDAsIHNpemVvZigqZikpOworCWgyID0gMTY7CisJaWYgKHRiW1RDQV9SU1ZQX1NSQy0xXSkgeworCQllcnIgPSAtRUlOVkFMOworCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX1JTVlBfU1JDLTFdKSAhPSBzaXplb2YoZi0+c3JjKSkKKwkJCWdvdG8gZXJyb3V0OworCQltZW1jcHkoZi0+c3JjLCBSVEFfREFUQSh0YltUQ0FfUlNWUF9TUkMtMV0pLCBzaXplb2YoZi0+c3JjKSk7CisJCWgyID0gaGFzaF9zcmMoZi0+c3JjKTsKKwl9CisJaWYgKHRiW1RDQV9SU1ZQX1BJTkZPLTFdKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfUlNWUF9QSU5GTy0xXSkgPCBzaXplb2Yoc3RydWN0IHRjX3JzdnBfcGluZm8pKQorCQkJZ290byBlcnJvdXQ7CisJCXBpbmZvID0gUlRBX0RBVEEodGJbVENBX1JTVlBfUElORk8tMV0pOworCQlmLT5zcGkgPSBwaW5mby0+c3BpOworCQlmLT50dW5uZWxoZHIgPSBwaW5mby0+dHVubmVsaGRyOworCX0KKwlpZiAodGJbVENBX1JTVlBfQ0xBU1NJRC0xXSkgeworCQllcnIgPSAtRUlOVkFMOworCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX1JTVlBfQ0xBU1NJRC0xXSkgIT0gNCkKKwkJCWdvdG8gZXJyb3V0OworCQlmLT5yZXMuY2xhc3NpZCA9ICoodTMyKilSVEFfREFUQSh0YltUQ0FfUlNWUF9DTEFTU0lELTFdKTsKKwl9CisKKwllcnIgPSAtRUlOVkFMOworCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfUlNWUF9EU1QtMV0pICE9IHNpemVvZihmLT5zcmMpKQorCQlnb3RvIGVycm91dDsKKwlkc3QgPSBSVEFfREFUQSh0YltUQ0FfUlNWUF9EU1QtMV0pOworCWgxID0gaGFzaF9kc3QoZHN0LCBwaW5mbyA/IHBpbmZvLT5wcm90b2NvbCA6IDAsIHBpbmZvID8gcGluZm8tPnR1bm5lbGlkIDogMCk7CisKKwllcnIgPSAtRU5PTUVNOworCWlmICgoZi0+aGFuZGxlID0gZ2VuX2hhbmRsZSh0cCwgaDEgfCAoaDI8PDgpKSkgPT0gMCkKKwkJZ290byBlcnJvdXQ7CisKKwlpZiAoZi0+dHVubmVsaGRyKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWlmIChmLT5yZXMuY2xhc3NpZCA+IDI1NSkKKwkJCWdvdG8gZXJyb3V0OworCisJCWVyciA9IC1FTk9NRU07CisJCWlmIChmLT5yZXMuY2xhc3NpZCA9PSAwICYmCisJCSAgICAoZi0+cmVzLmNsYXNzaWQgPSBnZW5fdHVubmVsKGRhdGEpKSA9PSAwKQorCQkJZ290byBlcnJvdXQ7CisJfQorCisJZm9yIChzcCA9ICZkYXRhLT5odFtoMV07IChzPSpzcCkgIT0gTlVMTDsgc3AgPSAmcy0+bmV4dCkgeworCQlpZiAoZHN0W1JTVlBfRFNUX0xFTi0xXSA9PSBzLT5kc3RbUlNWUF9EU1RfTEVOLTFdICYmCisJCSAgICBwaW5mbyAmJiBwaW5mby0+cHJvdG9jb2wgPT0gcy0+cHJvdG9jb2wgJiYKKwkJICAgIG1lbWNtcCgmcGluZm8tPmRwaSwgJnMtPmRwaSwgc2l6ZW9mKHMtPmRwaSkpID09IDAKKyNpZiBSU1ZQX0RTVF9MRU4gPT0gNAorCQkgICAgJiYgZHN0WzBdID09IHMtPmRzdFswXQorCQkgICAgJiYgZHN0WzFdID09IHMtPmRzdFsxXQorCQkgICAgJiYgZHN0WzJdID09IHMtPmRzdFsyXQorI2VuZGlmCisJCSAgICAmJiBwaW5mby0+dHVubmVsaWQgPT0gcy0+dHVubmVsaWQpIHsKKworaW5zZXJ0OgorCQkJLyogT0ssIHdlIGZvdW5kIGFwcHJvcHJpYXRlIHNlc3Npb24gKi8KKworCQkJZnAgPSAmcy0+aHRbaDJdOworCisJCQlmLT5zZXNzID0gczsKKwkJCWlmIChmLT50dW5uZWxoZHIgPT0gMCkKKwkJCQl0Y2ZfYmluZF9maWx0ZXIodHAsICZmLT5yZXMsIGJhc2UpOworCisJCQl0Y2ZfZXh0c19jaGFuZ2UodHAsICZmLT5leHRzLCAmZSk7CisKKwkJCWZvciAoZnAgPSAmcy0+aHRbaDJdOyAqZnA7IGZwID0gJigqZnApLT5uZXh0KQorCQkJCWlmICgoKCpmcCktPnNwaS5tYXNrJmYtPnNwaS5tYXNrKSAhPSBmLT5zcGkubWFzaykKKwkJCQkJYnJlYWs7CisJCQlmLT5uZXh0ID0gKmZwOworCQkJd21iKCk7CisJCQkqZnAgPSBmOworCisJCQkqYXJnID0gKHVuc2lnbmVkIGxvbmcpZjsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogTm8gc2Vzc2lvbiBmb3VuZC4gQ3JlYXRlIG5ldyBvbmUuICovCisKKwllcnIgPSAtRU5PQlVGUzsKKwlzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJzdnBfc2Vzc2lvbiksIEdGUF9LRVJORUwpOworCWlmIChzID09IE5VTEwpCisJCWdvdG8gZXJyb3V0OworCW1lbXNldChzLCAwLCBzaXplb2YoKnMpKTsKKwltZW1jcHkocy0+ZHN0LCBkc3QsIHNpemVvZihzLT5kc3QpKTsKKworCWlmIChwaW5mbykgeworCQlzLT5kcGkgPSBwaW5mby0+ZHBpOworCQlzLT5wcm90b2NvbCA9IHBpbmZvLT5wcm90b2NvbDsKKwkJcy0+dHVubmVsaWQgPSBwaW5mby0+dHVubmVsaWQ7CisJfQorCWZvciAoc3AgPSAmZGF0YS0+aHRbaDFdOyAqc3A7IHNwID0gJigqc3ApLT5uZXh0KSB7CisJCWlmICgoKCpzcCktPmRwaS5tYXNrJnMtPmRwaS5tYXNrKSAhPSBzLT5kcGkubWFzaykKKwkJCWJyZWFrOworCX0KKwlzLT5uZXh0ID0gKnNwOworCXdtYigpOworCSpzcCA9IHM7CisJCisJZ290byBpbnNlcnQ7CisKK2Vycm91dDoKKwlpZiAoZikKKwkJa2ZyZWUoZik7CitlcnJvdXQyOgorCXRjZl9leHRzX2Rlc3Ryb3kodHAsICZlKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCByc3ZwX3dhbGsoc3RydWN0IHRjZl9wcm90byAqdHAsIHN0cnVjdCB0Y2Zfd2Fsa2VyICphcmcpCit7CisJc3RydWN0IHJzdnBfaGVhZCAqaGVhZCA9IHRwLT5yb290OworCXVuc2lnbmVkIGgsIGgxOworCisJaWYgKGFyZy0+c3RvcCkKKwkJcmV0dXJuOworCisJZm9yIChoID0gMDsgaCA8IDI1NjsgaCsrKSB7CisJCXN0cnVjdCByc3ZwX3Nlc3Npb24gKnM7CisKKwkJZm9yIChzID0gaGVhZC0+aHRbaF07IHM7IHMgPSBzLT5uZXh0KSB7CisJCQlmb3IgKGgxID0gMDsgaDEgPD0gMTY7IGgxKyspIHsKKwkJCQlzdHJ1Y3QgcnN2cF9maWx0ZXIgKmY7CisKKwkJCQlmb3IgKGYgPSBzLT5odFtoMV07IGY7IGYgPSBmLT5uZXh0KSB7CisJCQkJCWlmIChhcmctPmNvdW50IDwgYXJnLT5za2lwKSB7CisJCQkJCQlhcmctPmNvdW50Kys7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlpZiAoYXJnLT5mbih0cCwgKHVuc2lnbmVkIGxvbmcpZiwgYXJnKSA8IDApIHsKKwkJCQkJCWFyZy0+c3RvcCA9IDE7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQkJYXJnLT5jb3VudCsrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGludCByc3ZwX2R1bXAoc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgZmgsCisJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjbXNnICp0KQoreworCXN0cnVjdCByc3ZwX2ZpbHRlciAqZiA9IChzdHJ1Y3QgcnN2cF9maWx0ZXIqKWZoOworCXN0cnVjdCByc3ZwX3Nlc3Npb24gKnM7CisJdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJc3RydWN0IHJ0YXR0ciAqcnRhOworCXN0cnVjdCB0Y19yc3ZwX3BpbmZvIHBpbmZvOworCisJaWYgKGYgPT0gTlVMTCkKKwkJcmV0dXJuIHNrYi0+bGVuOworCXMgPSBmLT5zZXNzOworCisJdC0+dGNtX2hhbmRsZSA9IGYtPmhhbmRsZTsKKworCisJcnRhID0gKHN0cnVjdCBydGF0dHIqKWI7CisJUlRBX1BVVChza2IsIFRDQV9PUFRJT05TLCAwLCBOVUxMKTsKKworCVJUQV9QVVQoc2tiLCBUQ0FfUlNWUF9EU1QsIHNpemVvZihzLT5kc3QpLCAmcy0+ZHN0KTsKKwlwaW5mby5kcGkgPSBzLT5kcGk7CisJcGluZm8uc3BpID0gZi0+c3BpOworCXBpbmZvLnByb3RvY29sID0gcy0+cHJvdG9jb2w7CisJcGluZm8udHVubmVsaWQgPSBzLT50dW5uZWxpZDsKKwlwaW5mby50dW5uZWxoZHIgPSBmLT50dW5uZWxoZHI7CisJUlRBX1BVVChza2IsIFRDQV9SU1ZQX1BJTkZPLCBzaXplb2YocGluZm8pLCAmcGluZm8pOworCWlmIChmLT5yZXMuY2xhc3NpZCkKKwkJUlRBX1BVVChza2IsIFRDQV9SU1ZQX0NMQVNTSUQsIDQsICZmLT5yZXMuY2xhc3NpZCk7CisJaWYgKCgoZi0+aGFuZGxlPj44KSYweEZGKSAhPSAxNikKKwkJUlRBX1BVVChza2IsIFRDQV9SU1ZQX1NSQywgc2l6ZW9mKGYtPnNyYyksIGYtPnNyYyk7CisKKwlpZiAodGNmX2V4dHNfZHVtcChza2IsICZmLT5leHRzLCAmcnN2cF9leHRfbWFwKSA8IDApCisJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CisKKwlydGEtPnJ0YV9sZW4gPSBza2ItPnRhaWwgLSBiOworCisJaWYgKHRjZl9leHRzX2R1bXBfc3RhdHMoc2tiLCAmZi0+ZXh0cywgJnJzdnBfZXh0X21hcCkgPCAwKQorCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOworCXJldHVybiBza2ItPmxlbjsKKworcnRhdHRyX2ZhaWx1cmU6CisJc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGNmX3Byb3RvX29wcyBSU1ZQX09QUyA9IHsKKwkubmV4dAkJPQlOVUxMLAorCS5raW5kCQk9CVJTVlBfSUQsCisJLmNsYXNzaWZ5CT0JcnN2cF9jbGFzc2lmeSwKKwkuaW5pdAkJPQlyc3ZwX2luaXQsCisJLmRlc3Ryb3kJPQlyc3ZwX2Rlc3Ryb3ksCisJLmdldAkJPQlyc3ZwX2dldCwKKwkucHV0CQk9CXJzdnBfcHV0LAorCS5jaGFuZ2UJCT0JcnN2cF9jaGFuZ2UsCisJLmRlbGV0ZQkJPQlyc3ZwX2RlbGV0ZSwKKwkud2FsawkJPQlyc3ZwX3dhbGssCisJLmR1bXAJCT0JcnN2cF9kdW1wLAorCS5vd25lcgkJPQlUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcnN2cCh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl90Y2ZfcHJvdG9fb3BzKCZSU1ZQX09QUyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3JzdnAodm9pZCkgCit7CisJdW5yZWdpc3Rlcl90Y2ZfcHJvdG9fb3BzKCZSU1ZQX09QUyk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfcnN2cCkKK21vZHVsZV9leGl0KGV4aXRfcnN2cCkKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfcnN2cDYuYyBiL25ldC9zY2hlZC9jbHNfcnN2cDYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGU1MWY3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjaGVkL2Nsc19yc3ZwNi5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBuZXQvc2NoZWQvY2xzX3JzdnA2LmMJU3BlY2lhbCBSU1ZQIHBhY2tldCBjbGFzc2lmaWVyIGZvciBJUHY2LgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2FjdF9hcGkuaD4KKyNpbmNsdWRlIDxuZXQvcGt0X2Nscy5oPgorCisjZGVmaW5lIFJTVlBfRFNUX0xFTgk0CisjZGVmaW5lIFJTVlBfSUQJCSJyc3ZwNiIKKyNkZWZpbmUgUlNWUF9PUFMJY2xzX3JzdnA2X29wcworCisjaW5jbHVkZSAiY2xzX3JzdnAuaCIKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfdGNpbmRleC5jIGIvbmV0L3NjaGVkL2Nsc190Y2luZGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA0ZDlkOAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY2hlZC9jbHNfdGNpbmRleC5jCkBAIC0wLDAgKzEsNTM3IEBACisvKgorICogbmV0L3NjaGVkL2Nsc190Y2luZGV4LmMJUGFja2V0IGNsYXNzaWZpZXIgZm9yIHNrYi0+dGNfaW5kZXgKKyAqCisgKiBXcml0dGVuIDE5OTgsMTk5OSBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIEVQRkwgSUNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvYWN0X2FwaS5oPgorI2luY2x1ZGUgPG5ldC9wa3RfY2xzLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisKKworLyoKKyAqIE5vdCBxdWl0ZSBzdXJlIGlmIHdlIG5lZWQgYWxsIHRoZSB4Y2hncyBBbGV4ZXkgdXNlcyB3aGVuIGFjY2Vzc2luZyB0aGluZ3MuCisgKiBDYW4gYWx3YXlzIGFkZCB0aGVtIGxhdGVyIC4uLiA6KQorICovCisKKy8qCisgKiBQYXNzaW5nIHBhcmFtZXRlcnMgdG8gdGhlIHJvb3Qgc2VlbXMgdG8gYmUgZG9uZSBtb3JlIGF3a3dhcmRseSB0aGFuIHJlYWxseQorICogbmVjZXNzYXJ5LiBBdCBsZWFzdCwgdTMyIGRvZXNuJ3Qgc2VlbSB0byB1c2Ugc3VjaCBkaXJ0eSBoYWNrcy4gVG8gYmUKKyAqIHZlcmlmaWVkLiBGSVhNRS4KKyAqLworCisjZGVmaW5lIFBFUkZFQ1RfSEFTSF9USFJFU0hPTEQJNjQJLyogdXNlIHBlcmZlY3QgaGFzaCBpZiBub3QgYmlnZ2VyICovCisjZGVmaW5lIERFRkFVTFRfSEFTSF9TSVpFCTY0CS8qIG9wdGltaXplZCBmb3IgZGlmZnNlcnYgKi8KKworCisjaWYgMSAvKiBjb250cm9sICovCisjZGVmaW5lIERQUklOVEsoZm9ybWF0LGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCwjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBEUFJJTlRLKGZvcm1hdCxhcmdzLi4uKQorI2VuZGlmCisKKyNpZiAwIC8qIGRhdGEgKi8KKyNkZWZpbmUgRDJQUklOVEsoZm9ybWF0LGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCwjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBEMlBSSU5USyhmb3JtYXQsYXJncy4uLikKKyNlbmRpZgorCisKKyNkZWZpbmUJUFJJVih0cCkJKChzdHJ1Y3QgdGNpbmRleF9kYXRhICopICh0cCktPnJvb3QpCisKKworc3RydWN0IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdCB7CisJc3RydWN0IHRjZl9leHRzCQlleHRzOworCXN0cnVjdCB0Y2ZfcmVzdWx0CXJlczsKK307CisKK3N0cnVjdCB0Y2luZGV4X2ZpbHRlciB7CisJdTE2IGtleTsKKwlzdHJ1Y3QgdGNpbmRleF9maWx0ZXJfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3QgdGNpbmRleF9maWx0ZXIgKm5leHQ7Cit9OworCisKK3N0cnVjdCB0Y2luZGV4X2RhdGEgeworCXN0cnVjdCB0Y2luZGV4X2ZpbHRlcl9yZXN1bHQgKnBlcmZlY3Q7IC8qIHBlcmZlY3QgaGFzaDsgTlVMTCBpZiBub25lICovCisJc3RydWN0IHRjaW5kZXhfZmlsdGVyICoqaDsgLyogaW1wZXJmZWN0IGhhc2g7IG9ubHkgdXNlZCBpZiAhcGVyZmVjdDsKKwkJCQkgICAgICBOVUxMIGlmIHVudXNlZCAqLworCXUxNiBtYXNrOwkJLyogQU5EIGtleSB3aXRoIG1hc2sgKi8KKwlpbnQgc2hpZnQ7CQkvKiBzaGlmdCBBTkRlZCBrZXkgdG8gdGhlIHJpZ2h0ICovCisJaW50IGhhc2g7CQkvKiBoYXNoIHRhYmxlIHNpemU7IDAgaWYgdW5kZWZpbmVkICovCisJaW50IGFsbG9jX2hhc2g7CQkvKiBhbGxvY2F0ZWQgc2l6ZSAqLworCWludCBmYWxsX3Rocm91Z2g7CS8qIDA6IG9ubHkgY2xhc3NpZnkgaWYgZXhwbGljaXQgbWF0Y2ggKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgdGNmX2V4dF9tYXAgdGNpbmRleF9leHRfbWFwID0geworCS5wb2xpY2UgPSBUQ0FfVENJTkRFWF9QT0xJQ0UsCisJLmFjdGlvbiA9IFRDQV9UQ0lOREVYX0FDVAorfTsKKworc3RhdGljIGlubGluZSBpbnQKK3RjaW5kZXhfZmlsdGVyX2lzX3NldChzdHJ1Y3QgdGNpbmRleF9maWx0ZXJfcmVzdWx0ICpyKQoreworCXJldHVybiB0Y2ZfZXh0c19pc19wcmVkaWNhdGl2ZSgmci0+ZXh0cykgfHwgci0+cmVzLmNsYXNzaWQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGNpbmRleF9maWx0ZXJfcmVzdWx0ICoKK3RjaW5kZXhfbG9va3VwKHN0cnVjdCB0Y2luZGV4X2RhdGEgKnAsIHUxNiBrZXkpCit7CisJc3RydWN0IHRjaW5kZXhfZmlsdGVyICpmOworCisJaWYgKHAtPnBlcmZlY3QpCisJCXJldHVybiB0Y2luZGV4X2ZpbHRlcl9pc19zZXQocC0+cGVyZmVjdCArIGtleSkgPworCQkJcC0+cGVyZmVjdCArIGtleSA6IE5VTEw7CisJZWxzZSBpZiAocC0+aCkgeworCQlmb3IgKGYgPSBwLT5oW2tleSAlIHAtPmhhc2hdOyBmOyBmID0gZi0+bmV4dCkKKwkJCWlmIChmLT5rZXkgPT0ga2V5KQorCQkJCXJldHVybiAmZi0+cmVzdWx0OworCX0KKworCXJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyBpbnQgdGNpbmRleF9jbGFzc2lmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKKwkJCSAgICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQoreworCXN0cnVjdCB0Y2luZGV4X2RhdGEgKnAgPSBQUklWKHRwKTsKKwlzdHJ1Y3QgdGNpbmRleF9maWx0ZXJfcmVzdWx0ICpmOworCWludCBrZXkgPSAoc2tiLT50Y19pbmRleCAmIHAtPm1hc2spID4+IHAtPnNoaWZ0OworCisJRDJQUklOVEsoInRjaW5kZXhfY2xhc3NpZnkoc2tiICVwLHRwICVwLHJlcyAlcCkscCAlcFxuIixza2IsdHAscmVzLHApOworCisJZiA9IHRjaW5kZXhfbG9va3VwKHAsIGtleSk7CisJaWYgKCFmKSB7CisJCWlmICghcC0+ZmFsbF90aHJvdWdoKQorCQkJcmV0dXJuIC0xOworCQlyZXMtPmNsYXNzaWQgPSBUQ19IX01BS0UoVENfSF9NQUoodHAtPnEtPmhhbmRsZSksIGtleSk7CisJCXJlcy0+Y2xhc3MgPSAwOworCQlEMlBSSU5USygiYWxnIDB4JXhcbiIscmVzLT5jbGFzc2lkKTsKKwkJcmV0dXJuIDA7CisJfQorCSpyZXMgPSBmLT5yZXM7CisJRDJQUklOVEsoIm1hcCAweCV4XG4iLHJlcy0+Y2xhc3NpZCk7CisKKwlyZXR1cm4gdGNmX2V4dHNfZXhlYyhza2IsICZmLT5leHRzLCByZXMpOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRjaW5kZXhfZ2V0KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1MzIgaGFuZGxlKQoreworCXN0cnVjdCB0Y2luZGV4X2RhdGEgKnAgPSBQUklWKHRwKTsKKwlzdHJ1Y3QgdGNpbmRleF9maWx0ZXJfcmVzdWx0ICpyOworCisJRFBSSU5USygidGNpbmRleF9nZXQodHAgJXAsaGFuZGxlIDB4JTA4eClcbiIsdHAsaGFuZGxlKTsKKwlpZiAocC0+cGVyZmVjdCAmJiBoYW5kbGUgPj0gcC0+YWxsb2NfaGFzaCkKKwkJcmV0dXJuIDA7CisJciA9IHRjaW5kZXhfbG9va3VwKHAsIGhhbmRsZSk7CisJcmV0dXJuIHIgJiYgdGNpbmRleF9maWx0ZXJfaXNfc2V0KHIpID8gKHVuc2lnbmVkIGxvbmcpIHIgOiAwVUw7Cit9CisKKworc3RhdGljIHZvaWQgdGNpbmRleF9wdXQoc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgZikKK3sKKwlEUFJJTlRLKCJ0Y2luZGV4X3B1dCh0cCAlcCxmIDB4JWx4KVxuIix0cCxmKTsKK30KKworCitzdGF0aWMgaW50IHRjaW5kZXhfaW5pdChzdHJ1Y3QgdGNmX3Byb3RvICp0cCkKK3sKKwlzdHJ1Y3QgdGNpbmRleF9kYXRhICpwOworCisJRFBSSU5USygidGNpbmRleF9pbml0KHRwICVwKVxuIix0cCk7CisJcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0Y2luZGV4X2RhdGEpLEdGUF9LRVJORUwpOworCWlmICghcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7CisJcC0+bWFzayA9IDB4ZmZmZjsKKwlwLT5oYXNoID0gREVGQVVMVF9IQVNIX1NJWkU7CisJcC0+ZmFsbF90aHJvdWdoID0gMTsKKworCXRwLT5yb290ID0gcDsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CitfX3RjaW5kZXhfZGVsZXRlKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1bnNpZ25lZCBsb25nIGFyZywgaW50IGxvY2spCit7CisJc3RydWN0IHRjaW5kZXhfZGF0YSAqcCA9IFBSSVYodHApOworCXN0cnVjdCB0Y2luZGV4X2ZpbHRlcl9yZXN1bHQgKnIgPSAoc3RydWN0IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdCAqKSBhcmc7CisJc3RydWN0IHRjaW5kZXhfZmlsdGVyICpmID0gTlVMTDsKKworCURQUklOVEsoInRjaW5kZXhfZGVsZXRlKHRwICVwLGFyZyAweCVseCkscCAlcCxmICVwXG4iLHRwLGFyZyxwLGYpOworCWlmIChwLT5wZXJmZWN0KSB7CisJCWlmICghci0+cmVzLmNsYXNzKQorCQkJcmV0dXJuIC1FTk9FTlQ7CisJfSBlbHNlIHsKKwkJaW50IGk7CisJCXN0cnVjdCB0Y2luZGV4X2ZpbHRlciAqKndhbGsgPSBOVUxMOworCisJCWZvciAoaSA9IDA7IGkgPCBwLT5oYXNoOyBpKyspCisJCQlmb3IgKHdhbGsgPSBwLT5oK2k7ICp3YWxrOyB3YWxrID0gJigqd2FsayktPm5leHQpCisJCQkJaWYgKCYoKndhbGspLT5yZXN1bHQgPT0gcikKKwkJCQkJZ290byBmb3VuZDsKKwkJcmV0dXJuIC1FTk9FTlQ7CisKK2ZvdW5kOgorCQlmID0gKndhbGs7CisJCWlmIChsb2NrKQorCQkJdGNmX3RyZWVfbG9jayh0cCk7CisJCSp3YWxrID0gZi0+bmV4dDsKKwkJaWYgKGxvY2spCisJCQl0Y2ZfdHJlZV91bmxvY2sodHApOworCX0KKwl0Y2ZfdW5iaW5kX2ZpbHRlcih0cCwgJnItPnJlcyk7CisJdGNmX2V4dHNfZGVzdHJveSh0cCwgJnItPmV4dHMpOworCWlmIChmKQorCQlrZnJlZShmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0Y2luZGV4X2RlbGV0ZShzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIF9fdGNpbmRleF9kZWxldGUodHAsIGFyZywgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cit2YWxpZF9wZXJmZWN0X2hhc2goc3RydWN0IHRjaW5kZXhfZGF0YSAqcCkKK3sKKwlyZXR1cm4gIHAtPmhhc2ggPiAocC0+bWFzayA+PiBwLT5zaGlmdCk7Cit9CisKK3N0YXRpYyBpbnQKK3RjaW5kZXhfc2V0X3Bhcm1zKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1bnNpZ25lZCBsb25nIGJhc2UsIHUzMiBoYW5kbGUsCisJCSAgc3RydWN0IHRjaW5kZXhfZGF0YSAqcCwgc3RydWN0IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdCAqciwKKwkJICBzdHJ1Y3QgcnRhdHRyICoqdGIsIHN0cnVjdCBydGF0dHIgKmVzdCkKK3sKKwlpbnQgZXJyLCBiYWxsb2MgPSAwOworCXN0cnVjdCB0Y2luZGV4X2ZpbHRlcl9yZXN1bHQgbmV3X2ZpbHRlcl9yZXN1bHQsICpvbGRfciA9IHI7CisJc3RydWN0IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdCBjcjsKKwlzdHJ1Y3QgdGNpbmRleF9kYXRhIGNwOworCXN0cnVjdCB0Y2luZGV4X2ZpbHRlciAqZiA9IE5VTEw7IC8qIG1ha2UgZ2NjIGJlaGF2ZSAqLworCXN0cnVjdCB0Y2ZfZXh0cyBlOworCisJZXJyID0gdGNmX2V4dHNfdmFsaWRhdGUodHAsIHRiLCBlc3QsICZlLCAmdGNpbmRleF9leHRfbWFwKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwkKKwltZW1jcHkoJmNwLCBwLCBzaXplb2YoY3ApKTsKKwltZW1zZXQoJm5ld19maWx0ZXJfcmVzdWx0LCAwLCBzaXplb2YobmV3X2ZpbHRlcl9yZXN1bHQpKTsKKworCWlmIChvbGRfcikKKwkJbWVtY3B5KCZjciwgciwgc2l6ZW9mKGNyKSk7CisJZWxzZQorCQltZW1zZXQoJmNyLCAwLCBzaXplb2YoY3IpKTsKKworCWVyciA9IC1FSU5WQUw7CisJaWYgKHRiW1RDQV9UQ0lOREVYX0hBU0gtMV0pIHsKKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9UQ0lOREVYX0hBU0gtMV0pIDwgc2l6ZW9mKHUzMikpCisJCQlnb3RvIGVycm91dDsKKwkJY3AuaGFzaCA9ICoodTMyICopIFJUQV9EQVRBKHRiW1RDQV9UQ0lOREVYX0hBU0gtMV0pOworCX0KKworCWlmICh0YltUQ0FfVENJTkRFWF9NQVNLLTFdKSB7CisJCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfVENJTkRFWF9NQVNLLTFdKSA8IHNpemVvZih1MTYpKQorCQkJZ290byBlcnJvdXQ7CisJCWNwLm1hc2sgPSAqKHUxNiAqKSBSVEFfREFUQSh0YltUQ0FfVENJTkRFWF9NQVNLLTFdKTsKKwl9CisKKwlpZiAodGJbVENBX1RDSU5ERVhfU0hJRlQtMV0pIHsKKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9UQ0lOREVYX1NISUZULTFdKSA8IHNpemVvZih1MTYpKQorCQkJZ290byBlcnJvdXQ7CisJCWNwLnNoaWZ0ID0gKih1MTYgKikgUlRBX0RBVEEodGJbVENBX1RDSU5ERVhfU0hJRlQtMV0pOworCX0KKworCWVyciA9IC1FQlVTWTsKKwkvKiBIYXNoIGFscmVhZHkgYWxsb2NhdGVkLCBtYWtlIHN1cmUgdGhhdCB3ZSBzdGlsbCBtZWV0IHRoZQorCSAqIHJlcXVpcmVtZW50cyBmb3IgdGhlIGFsbG9jYXRlZCBoYXNoLgorCSAqLworCWlmIChjcC5wZXJmZWN0KSB7CisJCWlmICghdmFsaWRfcGVyZmVjdF9oYXNoKCZjcCkgfHwKKwkJICAgIGNwLmhhc2ggPiBjcC5hbGxvY19oYXNoKQorCQkJZ290byBlcnJvdXQ7CisJfSBlbHNlIGlmIChjcC5oICYmIGNwLmhhc2ggIT0gY3AuYWxsb2NfaGFzaCkKKwkJZ290byBlcnJvdXQ7CisKKwllcnIgPSAtRUlOVkFMOworCWlmICh0YltUQ0FfVENJTkRFWF9GQUxMX1RIUk9VR0gtMV0pIHsKKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9UQ0lOREVYX0ZBTExfVEhST1VHSC0xXSkgPCBzaXplb2YodTMyKSkKKwkJCWdvdG8gZXJyb3V0OworCQljcC5mYWxsX3Rocm91Z2ggPQorCQkJKih1MzIgKikgUlRBX0RBVEEodGJbVENBX1RDSU5ERVhfRkFMTF9USFJPVUdILTFdKTsKKwl9CisKKwlpZiAoIWNwLmhhc2gpIHsKKwkJLyogSGFzaCBub3Qgc3BlY2lmaWVkLCB1c2UgcGVyZmVjdCBoYXNoIGlmIHRoZSB1cHBlciBsaW1pdAorCQkgKiBvZiB0aGUgaGFzaGluZyBpbmRleCBpcyBiZWxvdyB0aGUgdGhyZXNob2xkLgorCQkgKi8KKwkJaWYgKChjcC5tYXNrID4+IGNwLnNoaWZ0KSA8IFBFUkZFQ1RfSEFTSF9USFJFU0hPTEQpCisJCQljcC5oYXNoID0gKGNwLm1hc2sgPj4gY3Auc2hpZnQpKzE7CisJCWVsc2UKKwkJCWNwLmhhc2ggPSBERUZBVUxUX0hBU0hfU0laRTsKKwl9CisKKwlpZiAoIWNwLnBlcmZlY3QgJiYgIWNwLmgpCisJCWNwLmFsbG9jX2hhc2ggPSBjcC5oYXNoOworCisJLyogTm90ZTogdGhpcyBjb3VsZCBiZSBhcyByZXN0cmljdGl2ZSBhcyBpZiAoaGFuZGxlICYgfihtYXNrID4+IHNoaWZ0KSkKKwkgKiBidXQgdGhlbiwgd2UnZCBmYWlsIGhhbmRsZXMgdGhhdCBtYXkgYmVjb21lIHZhbGlkIGFmdGVyIHNvbWUgZnV0dXJlCisJICogbWFzayBjaGFuZ2UuIFdoaWxlIHRoaXMgaXMgZXh0cmVtZWx5IHVubGlrZWx5IHRvIGV2ZXIgbWF0dGVyLAorCSAqIHRoZSBjaGVjayBiZWxvdyBpcyBzYWZlciAoYW5kIGFsc28gbW9yZSBiYWNrd2FyZHMtY29tcGF0aWJsZSkuCisJICovCisJaWYgKGNwLnBlcmZlY3QgfHwgdmFsaWRfcGVyZmVjdF9oYXNoKCZjcCkpCisJCWlmIChoYW5kbGUgPj0gY3AuYWxsb2NfaGFzaCkKKwkJCWdvdG8gZXJyb3V0OworCisKKwllcnIgPSAtRU5PTUVNOworCWlmICghY3AucGVyZmVjdCAmJiAhY3AuaCkgeworCQlpZiAodmFsaWRfcGVyZmVjdF9oYXNoKCZjcCkpIHsKKwkJCWNwLnBlcmZlY3QgPSBrbWFsbG9jKGNwLmhhc2ggKiBzaXplb2YoKnIpLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghY3AucGVyZmVjdCkKKwkJCQlnb3RvIGVycm91dDsKKwkJCW1lbXNldChjcC5wZXJmZWN0LCAwLCBjcC5oYXNoICogc2l6ZW9mKCpyKSk7CisJCQliYWxsb2MgPSAxOworCQl9IGVsc2UgeworCQkJY3AuaCA9IGttYWxsb2MoY3AuaGFzaCAqIHNpemVvZihmKSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWNwLmgpCisJCQkJZ290byBlcnJvdXQ7CisJCQltZW1zZXQoY3AuaCwgMCwgY3AuaGFzaCAqIHNpemVvZihmKSk7CisJCQliYWxsb2MgPSAyOworCQl9CisJfQorCisJaWYgKGNwLnBlcmZlY3QpCisJCXIgPSBjcC5wZXJmZWN0ICsgaGFuZGxlOworCWVsc2UKKwkJciA9IHRjaW5kZXhfbG9va3VwKCZjcCwgaGFuZGxlKSA/IDogJm5ld19maWx0ZXJfcmVzdWx0OworCisJaWYgKHIgPT0gJm5ld19maWx0ZXJfcmVzdWx0KSB7CisJCWYgPSBrbWFsbG9jKHNpemVvZigqZiksIEdGUF9LRVJORUwpOworCQlpZiAoIWYpCisJCQlnb3RvIGVycm91dF9hbGxvYzsKKwkJbWVtc2V0KGYsIDAsIHNpemVvZigqZikpOworIAl9CisKKwlpZiAodGJbVENBX1RDSU5ERVhfQ0xBU1NJRC0xXSkgeworCQljci5yZXMuY2xhc3NpZCA9ICoodTMyICopIFJUQV9EQVRBKHRiW1RDQV9UQ0lOREVYX0NMQVNTSUQtMV0pOworCQl0Y2ZfYmluZF9maWx0ZXIodHAsICZjci5yZXMsIGJhc2UpOworIAl9CisKKwl0Y2ZfZXh0c19jaGFuZ2UodHAsICZjci5leHRzLCAmZSk7CisKKwl0Y2ZfdHJlZV9sb2NrKHRwKTsKKwlpZiAob2xkX3IgJiYgb2xkX3IgIT0gcikKKwkJbWVtc2V0KG9sZF9yLCAwLCBzaXplb2YoKm9sZF9yKSk7CisKKwltZW1jcHkocCwgJmNwLCBzaXplb2YoY3ApKTsKKwltZW1jcHkociwgJmNyLCBzaXplb2YoY3IpKTsKKworCWlmIChyID09ICZuZXdfZmlsdGVyX3Jlc3VsdCkgeworCQlzdHJ1Y3QgdGNpbmRleF9maWx0ZXIgKipmcDsKKworCQlmLT5rZXkgPSBoYW5kbGU7CisJCWYtPnJlc3VsdCA9IG5ld19maWx0ZXJfcmVzdWx0OworCQlmLT5uZXh0ID0gTlVMTDsKKwkJZm9yIChmcCA9IHAtPmgrKGhhbmRsZSAlIHAtPmhhc2gpOyAqZnA7IGZwID0gJigqZnApLT5uZXh0KQorCQkJLyogbm90aGluZyAqLzsKKwkJKmZwID0gZjsKKyAJfQorCXRjZl90cmVlX3VubG9jayh0cCk7CisKKwlyZXR1cm4gMDsKKworZXJyb3V0X2FsbG9jOgorCWlmIChiYWxsb2MgPT0gMSkKKwkJa2ZyZWUoY3AucGVyZmVjdCk7CisJZWxzZSBpZiAoYmFsbG9jID09IDIpCisJCWtmcmVlKGNwLmgpOworZXJyb3V0OgorCXRjZl9leHRzX2Rlc3Ryb3kodHAsICZlKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50Cit0Y2luZGV4X2NoYW5nZShzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBiYXNlLCB1MzIgaGFuZGxlLAorCSAgICAgICBzdHJ1Y3QgcnRhdHRyICoqdGNhLCB1bnNpZ25lZCBsb25nICphcmcpCit7CisJc3RydWN0IHJ0YXR0ciAqb3B0ID0gdGNhW1RDQV9PUFRJT05TLTFdOworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9UQ0lOREVYX01BWF07CisJc3RydWN0IHRjaW5kZXhfZGF0YSAqcCA9IFBSSVYodHApOworCXN0cnVjdCB0Y2luZGV4X2ZpbHRlcl9yZXN1bHQgKnIgPSAoc3RydWN0IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdCAqKSAqYXJnOworCisJRFBSSU5USygidGNpbmRleF9jaGFuZ2UodHAgJXAsaGFuZGxlIDB4JTA4eCx0Y2EgJXAsYXJnICVwKSxvcHQgJXAsIgorCSAgICAicCAlcCxyICVwLCphcmcgMHglbHhcbiIsCisJICAgIHRwLCBoYW5kbGUsIHRjYSwgYXJnLCBvcHQsIHAsIHIsIGFyZyA/ICphcmcgOiAwTCk7CisKKwlpZiAoIW9wdCkKKwkJcmV0dXJuIDA7CisKKwlpZiAocnRhdHRyX3BhcnNlX25lc3RlZCh0YiwgVENBX1RDSU5ERVhfTUFYLCBvcHQpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gdGNpbmRleF9zZXRfcGFybXModHAsIGJhc2UsIGhhbmRsZSwgcCwgciwgdGIsIHRjYVtUQ0FfUkFURS0xXSk7Cit9CisKKworc3RhdGljIHZvaWQgdGNpbmRleF93YWxrKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCBzdHJ1Y3QgdGNmX3dhbGtlciAqd2Fsa2VyKQoreworCXN0cnVjdCB0Y2luZGV4X2RhdGEgKnAgPSBQUklWKHRwKTsKKwlzdHJ1Y3QgdGNpbmRleF9maWx0ZXIgKmYsKm5leHQ7CisJaW50IGk7CisKKwlEUFJJTlRLKCJ0Y2luZGV4X3dhbGsodHAgJXAsd2Fsa2VyICVwKSxwICVwXG4iLHRwLHdhbGtlcixwKTsKKwlpZiAocC0+cGVyZmVjdCkgeworCQlmb3IgKGkgPSAwOyBpIDwgcC0+aGFzaDsgaSsrKSB7CisJCQlpZiAoIXAtPnBlcmZlY3RbaV0ucmVzLmNsYXNzKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHdhbGtlci0+Y291bnQgPj0gd2Fsa2VyLT5za2lwKSB7CisJCQkJaWYgKHdhbGtlci0+Zm4odHAsCisJCQkJICAgICh1bnNpZ25lZCBsb25nKSAocC0+cGVyZmVjdCtpKSwgd2Fsa2VyKQorCQkJCSAgICAgPCAwKSB7CisJCQkJCXdhbGtlci0+c3RvcCA9IDE7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQl3YWxrZXItPmNvdW50Kys7CisJCX0KKwl9CisJaWYgKCFwLT5oKQorCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IHAtPmhhc2g7IGkrKykgeworCQlmb3IgKGYgPSBwLT5oW2ldOyBmOyBmID0gbmV4dCkgeworCQkJbmV4dCA9IGYtPm5leHQ7CisJCQlpZiAod2Fsa2VyLT5jb3VudCA+PSB3YWxrZXItPnNraXApIHsKKwkJCQlpZiAod2Fsa2VyLT5mbih0cCwodW5zaWduZWQgbG9uZykgJmYtPnJlc3VsdCwKKwkJCQkgICAgd2Fsa2VyKSA8IDApIHsKKwkJCQkJd2Fsa2VyLT5zdG9wID0gMTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJCXdhbGtlci0+Y291bnQrKzsKKwkJfQorCX0KK30KKworCitzdGF0aWMgaW50IHRjaW5kZXhfZGVzdHJveV9lbGVtZW50KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLAorICAgIHVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgdGNmX3dhbGtlciAqd2Fsa2VyKQoreworCXJldHVybiBfX3RjaW5kZXhfZGVsZXRlKHRwLCBhcmcsIDApOworfQorCisKK3N0YXRpYyB2b2lkIHRjaW5kZXhfZGVzdHJveShzdHJ1Y3QgdGNmX3Byb3RvICp0cCkKK3sKKwlzdHJ1Y3QgdGNpbmRleF9kYXRhICpwID0gUFJJVih0cCk7CisJc3RydWN0IHRjZl93YWxrZXIgd2Fsa2VyOworCisJRFBSSU5USygidGNpbmRleF9kZXN0cm95KHRwICVwKSxwICVwXG4iLHRwLHApOworCXdhbGtlci5jb3VudCA9IDA7CisJd2Fsa2VyLnNraXAgPSAwOworCXdhbGtlci5mbiA9ICZ0Y2luZGV4X2Rlc3Ryb3lfZWxlbWVudDsKKwl0Y2luZGV4X3dhbGsodHAsJndhbGtlcik7CisJaWYgKHAtPnBlcmZlY3QpCisJCWtmcmVlKHAtPnBlcmZlY3QpOworCWlmIChwLT5oKQorCQlrZnJlZShwLT5oKTsKKwlrZnJlZShwKTsKKwl0cC0+cm9vdCA9IE5VTEw7Cit9CisKKworc3RhdGljIGludCB0Y2luZGV4X2R1bXAoc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgZmgsCisgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjbXNnICp0KQoreworCXN0cnVjdCB0Y2luZGV4X2RhdGEgKnAgPSBQUklWKHRwKTsKKwlzdHJ1Y3QgdGNpbmRleF9maWx0ZXJfcmVzdWx0ICpyID0gKHN0cnVjdCB0Y2luZGV4X2ZpbHRlcl9yZXN1bHQgKikgZmg7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3QgcnRhdHRyICpydGE7CisKKwlEUFJJTlRLKCJ0Y2luZGV4X2R1bXAodHAgJXAsZmggMHglbHgsc2tiICVwLHQgJXApLHAgJXAsciAlcCxiICVwXG4iLAorCSAgICB0cCxmaCxza2IsdCxwLHIsYik7CisJRFBSSU5USygicC0+cGVyZmVjdCAlcCBwLT5oICVwXG4iLHAtPnBlcmZlY3QscC0+aCk7CisJcnRhID0gKHN0cnVjdCBydGF0dHIgKikgYjsKKwlSVEFfUFVUKHNrYixUQ0FfT1BUSU9OUywwLE5VTEwpOworCWlmICghZmgpIHsKKwkJdC0+dGNtX2hhbmRsZSA9IH4wOyAvKiB3aGF0ZXZlciAuLi4gKi8KKwkJUlRBX1BVVChza2IsVENBX1RDSU5ERVhfSEFTSCxzaXplb2YocC0+aGFzaCksJnAtPmhhc2gpOworCQlSVEFfUFVUKHNrYixUQ0FfVENJTkRFWF9NQVNLLHNpemVvZihwLT5tYXNrKSwmcC0+bWFzayk7CisJCVJUQV9QVVQoc2tiLFRDQV9UQ0lOREVYX1NISUZULHNpemVvZihwLT5zaGlmdCksJnAtPnNoaWZ0KTsKKwkJUlRBX1BVVChza2IsVENBX1RDSU5ERVhfRkFMTF9USFJPVUdILHNpemVvZihwLT5mYWxsX3Rocm91Z2gpLAorCQkgICAgJnAtPmZhbGxfdGhyb3VnaCk7CisJCXJ0YS0+cnRhX2xlbiA9IHNrYi0+dGFpbC1iOworCX0gZWxzZSB7CisJCWlmIChwLT5wZXJmZWN0KSB7CisJCQl0LT50Y21faGFuZGxlID0gci1wLT5wZXJmZWN0OworCQl9IGVsc2UgeworCQkJc3RydWN0IHRjaW5kZXhfZmlsdGVyICpmOworCQkJaW50IGk7CisKKwkJCXQtPnRjbV9oYW5kbGUgPSAwOworCQkJZm9yIChpID0gMDsgIXQtPnRjbV9oYW5kbGUgJiYgaSA8IHAtPmhhc2g7IGkrKykgeworCQkJCWZvciAoZiA9IHAtPmhbaV07ICF0LT50Y21faGFuZGxlICYmIGY7CisJCQkJICAgICBmID0gZi0+bmV4dCkgeworCQkJCQlpZiAoJmYtPnJlc3VsdCA9PSByKQorCQkJCQkJdC0+dGNtX2hhbmRsZSA9IGYtPmtleTsKKwkJCQl9CisJCQl9CisJCX0KKwkJRFBSSU5USygiaGFuZGxlID0gJWRcbiIsdC0+dGNtX2hhbmRsZSk7CisJCWlmIChyLT5yZXMuY2xhc3MpCisJCQlSVEFfUFVUKHNrYiwgVENBX1RDSU5ERVhfQ0xBU1NJRCwgNCwgJnItPnJlcy5jbGFzc2lkKTsKKworCQlpZiAodGNmX2V4dHNfZHVtcChza2IsICZyLT5leHRzLCAmdGNpbmRleF9leHRfbWFwKSA8IDApCisJCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOworCQlydGEtPnJ0YV9sZW4gPSBza2ItPnRhaWwtYjsKKworCQlpZiAodGNmX2V4dHNfZHVtcF9zdGF0cyhza2IsICZyLT5leHRzLCAmdGNpbmRleF9leHRfbWFwKSA8IDApCisJCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOworCX0KKwkKKwlyZXR1cm4gc2tiLT5sZW47CisKK3J0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgc3RydWN0IHRjZl9wcm90b19vcHMgY2xzX3RjaW5kZXhfb3BzID0geworCS5uZXh0CQk9CU5VTEwsCisJLmtpbmQJCT0JInRjaW5kZXgiLAorCS5jbGFzc2lmeQk9CXRjaW5kZXhfY2xhc3NpZnksCisJLmluaXQJCT0JdGNpbmRleF9pbml0LAorCS5kZXN0cm95CT0JdGNpbmRleF9kZXN0cm95LAorCS5nZXQJCT0JdGNpbmRleF9nZXQsCisJLnB1dAkJPQl0Y2luZGV4X3B1dCwKKwkuY2hhbmdlCQk9CXRjaW5kZXhfY2hhbmdlLAorCS5kZWxldGUJCT0JdGNpbmRleF9kZWxldGUsCisJLndhbGsJCT0JdGNpbmRleF93YWxrLAorCS5kdW1wCQk9CXRjaW5kZXhfZHVtcCwKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3RjaW5kZXgodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfdGNmX3Byb3RvX29wcygmY2xzX3RjaW5kZXhfb3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfdGNpbmRleCh2b2lkKSAKK3sKKwl1bnJlZ2lzdGVyX3RjZl9wcm90b19vcHMoJmNsc190Y2luZGV4X29wcyk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfdGNpbmRleCkKK21vZHVsZV9leGl0KGV4aXRfdGNpbmRleCkKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfdTMyLmMgYi9uZXQvc2NoZWQvY2xzX3UzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NGI4N2QKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2NoZWQvY2xzX3UzMi5jCkBAIC0wLDAgKzEsODI4IEBACisvKgorICogbmV0L3NjaGVkL2Nsc191MzIuYwlVZ2x5IChvciBVbml2ZXJzYWwpIDMyYml0IGtleSBQYWNrZXQgQ2xhc3NpZmllci4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKgorICoJVGhlIGZpbHRlcnMgYXJlIHBhY2tlZCB0byBoYXNoIHRhYmxlcyBvZiBrZXkgbm9kZXMKKyAqCXdpdGggYSBzZXQgb2YgMzJiaXQga2V5L21hc2sgcGFpcnMgYXQgZXZlcnkgbm9kZS4KKyAqCU5vZGVzIHJlZmVyZW5jZSBuZXh0IGxldmVsIGhhc2ggdGFibGVzIGV0Yy4KKyAqCisgKglUaGlzIHNjaGVtZSBpcyB0aGUgYmVzdCB1bml2ZXJzYWwgY2xhc3NpZmllciBJIG1hbmFnZWQgdG8KKyAqCWludmVudDsgaXQgaXMgbm90IHN1cGVyLWZhc3QsIGJ1dCBpdCBpcyBub3Qgc2xvdyAocHJvdmlkZWQgeW91CisgKglwcm9ncmFtIGl0IGNvcnJlY3RseSksIGFuZCBnZW5lcmFsIGVub3VnaC4gIEFuZCBpdHMgcmVsYXRpdmUKKyAqCXNwZWVkIGdyb3dzIGFzIHRoZSBudW1iZXIgb2YgcnVsZXMgYmVjb21lcyBsYXJnZXIuCisgKgorICoJSXQgc2VlbXMgdGhhdCBpdCByZXByZXNlbnRzIHRoZSBiZXN0IG1pZGRsZSBwb2ludCBiZXR3ZWVuCisgKglzcGVlZCBhbmQgbWFuYWdlYWJpbGl0eSBib3RoIGJ5IGh1bWFuIGFuZCBieSBtYWNoaW5lLgorICoKKyAqCUl0IGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvciBsaW5rIHNoYXJpbmcgY29tYmluZWQgd2l0aCBRb1M7CisgKglwdXJlIFJTVlAgZG9lc24ndCBuZWVkIHN1Y2ggYSBnZW5lcmFsIGFwcHJvYWNoIGFuZCBjYW4gdXNlCisgKgltdWNoIHNpbXBsZXIgKGFuZCBmYXN0ZXIpIHNjaGVtZXMsIHNvcnQgb2YgY2xzX3JzdnAuYy4KKyAqCisgKglKSFM6IFdlIHNob3VsZCByZW1vdmUgdGhlIENPTkZJR19ORVRfQ0xTX0lORCBmcm9tIGhlcmUKKyAqCWV2ZW50dWFsbHkgd2hlbiB0aGUgbWV0YSBtYXRjaCBleHRlbnNpb24gaXMgbWFkZSBhdmFpbGFibGUKKyAqCisgKgluZm1hcmsgbWF0Y2ggYWRkZWQgYnkgQ2F0YWxpbih1eCBha2EgRGlubykgQk9JRSA8Y2F0YWIgYXQgdW1icmVsbGEucm8+CisgKi8KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2FjdF9hcGkuaD4KKyNpbmNsdWRlIDxuZXQvcGt0X2Nscy5oPgorCitzdHJ1Y3QgdGNfdV9rbm9kZQoreworCXN0cnVjdCB0Y191X2tub2RlCSpuZXh0OworCXUzMgkJCWhhbmRsZTsKKwlzdHJ1Y3QgdGNfdV9obm9kZQkqaHRfdXA7CisJc3RydWN0IHRjZl9leHRzCQlleHRzOworI2lmZGVmIENPTkZJR19ORVRfQ0xTX0lORAorCWNoYXIgICAgICAgICAgICAgICAgICAgICBpbmRldltJRk5BTVNJWl07CisjZW5kaWYKKwl1OAkJCWZzaGlmdDsKKwlzdHJ1Y3QgdGNmX3Jlc3VsdAlyZXM7CisJc3RydWN0IHRjX3VfaG5vZGUJKmh0X2Rvd247CisjaWZkZWYgQ09ORklHX0NMU19VMzJfUEVSRgorCXN0cnVjdCB0Y191MzJfcGNudAkqcGY7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ0xTX1UzMl9NQVJLCisJc3RydWN0IHRjX3UzMl9tYXJrCW1hcms7CisjZW5kaWYKKwlzdHJ1Y3QgdGNfdTMyX3NlbAlzZWw7Cit9OworCitzdHJ1Y3QgdGNfdV9obm9kZQoreworCXN0cnVjdCB0Y191X2hub2RlCSpuZXh0OworCXUzMgkJCWhhbmRsZTsKKwl1MzIJCQlwcmlvOworCXN0cnVjdCB0Y191X2NvbW1vbgkqdHBfYzsKKwlpbnQJCQlyZWZjbnQ7CisJdW5zaWduZWQJCWRpdmlzb3I7CisJc3RydWN0IHRjX3Vfa25vZGUJKmh0WzFdOworfTsKKworc3RydWN0IHRjX3VfY29tbW9uCit7CisJc3RydWN0IHRjX3VfY29tbW9uCSpuZXh0OworCXN0cnVjdCB0Y191X2hub2RlCSpobGlzdDsKKwlzdHJ1Y3QgUWRpc2MJCSpxOworCWludAkJCXJlZmNudDsKKwl1MzIJCQloZ2VuZXJhdG9yOworfTsKKworc3RhdGljIHN0cnVjdCB0Y2ZfZXh0X21hcCB1MzJfZXh0X21hcCA9IHsKKwkuYWN0aW9uID0gVENBX1UzMl9BQ1QsCisJLnBvbGljZSA9IFRDQV9VMzJfUE9MSUNFCit9OworCitzdGF0aWMgc3RydWN0IHRjX3VfY29tbW9uICp1MzJfbGlzdDsKKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgdTMyX2hhc2hfZm9sZCh1MzIga2V5LCBzdHJ1Y3QgdGNfdTMyX3NlbCAqc2VsLCB1OCBmc2hpZnQpCit7CisJdW5zaWduZWQgaCA9IChrZXkgJiBzZWwtPmhtYXNrKT4+ZnNoaWZ0OworCisJcmV0dXJuIGg7Cit9CisKK3N0YXRpYyBpbnQgdTMyX2NsYXNzaWZ5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQoreworCXN0cnVjdCB7CisJCXN0cnVjdCB0Y191X2tub2RlICprbm9kZTsKKwkJdTgJCSAgKnB0cjsKKwl9IHN0YWNrW1RDX1UzMl9NQVhERVBUSF07CisKKwlzdHJ1Y3QgdGNfdV9obm9kZSAqaHQgPSAoc3RydWN0IHRjX3VfaG5vZGUqKXRwLT5yb290OworCXU4ICpwdHIgPSBza2ItPm5oLnJhdzsKKwlzdHJ1Y3QgdGNfdV9rbm9kZSAqbjsKKwlpbnQgc2RlcHRoID0gMDsKKwlpbnQgb2ZmMiA9IDA7CisJaW50IHNlbCA9IDA7CisjaWZkZWYgQ09ORklHX0NMU19VMzJfUEVSRgorCWludCBqOworI2VuZGlmCisJaW50IGksIHI7CisKK25leHRfaHQ6CisJbiA9IGh0LT5odFtzZWxdOworCituZXh0X2tub2RlOgorCWlmIChuKSB7CisJCXN0cnVjdCB0Y191MzJfa2V5ICprZXkgPSBuLT5zZWwua2V5czsKKworI2lmZGVmIENPTkZJR19DTFNfVTMyX1BFUkYKKwkJbi0+cGYtPnJjbnQgKz0xOworCQlqID0gMDsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NMU19VMzJfTUFSSworCQlpZiAoKHNrYi0+bmZtYXJrICYgbi0+bWFyay5tYXNrKSAhPSBuLT5tYXJrLnZhbCkgeworCQkJbiA9IG4tPm5leHQ7CisJCQlnb3RvIG5leHRfa25vZGU7CisJCX0gZWxzZSB7CisJCQluLT5tYXJrLnN1Y2Nlc3MrKzsKKwkJfQorI2VuZGlmCisKKwkJZm9yIChpID0gbi0+c2VsLm5rZXlzOyBpPjA7IGktLSwga2V5KyspIHsKKworCQkJaWYgKCgqKHUzMiopKHB0citrZXktPm9mZisob2ZmMiZrZXktPm9mZm1hc2spKV5rZXktPnZhbCkma2V5LT5tYXNrKSB7CisJCQkJbiA9IG4tPm5leHQ7CisJCQkJZ290byBuZXh0X2tub2RlOworCQkJfQorI2lmZGVmIENPTkZJR19DTFNfVTMyX1BFUkYKKwkJCW4tPnBmLT5rY250c1tqXSArPTE7CisJCQlqKys7CisjZW5kaWYKKwkJfQorCQlpZiAobi0+aHRfZG93biA9PSBOVUxMKSB7CitjaGVja190ZXJtaW5hbDoKKwkJCWlmIChuLT5zZWwuZmxhZ3MmVENfVTMyX1RFUk1JTkFMKSB7CisKKwkJCQkqcmVzID0gbi0+cmVzOworI2lmZGVmIENPTkZJR19ORVRfQ0xTX0lORAorCQkJCWlmICghdGNmX21hdGNoX2luZGV2KHNrYiwgbi0+aW5kZXYpKSB7CisJCQkJCW4gPSBuLT5uZXh0OworCQkJCQlnb3RvIG5leHRfa25vZGU7CisJCQkJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NMU19VMzJfUEVSRgorCQkJCW4tPnBmLT5yaGl0ICs9MTsKKyNlbmRpZgorCQkJCXIgPSB0Y2ZfZXh0c19leGVjKHNrYiwgJm4tPmV4dHMsIHJlcyk7CisJCQkJaWYgKHIgPCAwKSB7CisJCQkJCW4gPSBuLT5uZXh0OworCQkJCQlnb3RvIG5leHRfa25vZGU7CisJCQkJfQorCisJCQkJcmV0dXJuIHI7CisJCQl9CisJCQluID0gbi0+bmV4dDsKKwkJCWdvdG8gbmV4dF9rbm9kZTsKKwkJfQorCisJCS8qIFBVU0ggKi8KKwkJaWYgKHNkZXB0aCA+PSBUQ19VMzJfTUFYREVQVEgpCisJCQlnb3RvIGRlYWRsb29wOworCQlzdGFja1tzZGVwdGhdLmtub2RlID0gbjsKKwkJc3RhY2tbc2RlcHRoXS5wdHIgPSBwdHI7CisJCXNkZXB0aCsrOworCisJCWh0ID0gbi0+aHRfZG93bjsKKwkJc2VsID0gMDsKKwkJaWYgKGh0LT5kaXZpc29yKQorCQkJc2VsID0gaHQtPmRpdmlzb3ImdTMyX2hhc2hfZm9sZCgqKHUzMiopKHB0cituLT5zZWwuaG9mZiksICZuLT5zZWwsbi0+ZnNoaWZ0KTsKKworCQlpZiAoIShuLT5zZWwuZmxhZ3MmKFRDX1UzMl9WQVJPRkZTRVR8VENfVTMyX09GRlNFVHxUQ19VMzJfRUFUKSkpCisJCQlnb3RvIG5leHRfaHQ7CisKKwkJaWYgKG4tPnNlbC5mbGFncyYoVENfVTMyX09GRlNFVHxUQ19VMzJfVkFST0ZGU0VUKSkgeworCQkJb2ZmMiA9IG4tPnNlbC5vZmYgKyAzOworCQkJaWYgKG4tPnNlbC5mbGFncyZUQ19VMzJfVkFST0ZGU0VUKQorCQkJCW9mZjIgKz0gbnRvaHMobi0+c2VsLm9mZm1hc2sgJiAqKHUxNiopKHB0cituLT5zZWwub2Zmb2ZmKSkgPj5uLT5zZWwub2Zmc2hpZnQ7CisJCQlvZmYyICY9IH4zOworCQl9CisJCWlmIChuLT5zZWwuZmxhZ3MmVENfVTMyX0VBVCkgeworCQkJcHRyICs9IG9mZjI7CisJCQlvZmYyID0gMDsKKwkJfQorCisJCWlmIChwdHIgPCBza2ItPnRhaWwpCisJCQlnb3RvIG5leHRfaHQ7CisJfQorCisJLyogUE9QICovCisJaWYgKHNkZXB0aC0tKSB7CisJCW4gPSBzdGFja1tzZGVwdGhdLmtub2RlOworCQlodCA9IG4tPmh0X3VwOworCQlwdHIgPSBzdGFja1tzZGVwdGhdLnB0cjsKKwkJZ290byBjaGVja190ZXJtaW5hbDsKKwl9CisJcmV0dXJuIC0xOworCitkZWFkbG9vcDoKKwlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQlwcmludGsoImNsc191MzI6IGRlYWQgbG9vcFxuIik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgdGNfdV9obm9kZSAqCit1MzJfbG9va3VwX2h0KHN0cnVjdCB0Y191X2NvbW1vbiAqdHBfYywgdTMyIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgdGNfdV9obm9kZSAqaHQ7CisKKwlmb3IgKGh0ID0gdHBfYy0+aGxpc3Q7IGh0OyBodCA9IGh0LT5uZXh0KQorCQlpZiAoaHQtPmhhbmRsZSA9PSBoYW5kbGUpCisJCQlicmVhazsKKworCXJldHVybiBodDsKK30KKworc3RhdGljIF9faW5saW5lX18gc3RydWN0IHRjX3Vfa25vZGUgKgordTMyX2xvb2t1cF9rZXkoc3RydWN0IHRjX3VfaG5vZGUgKmh0LCB1MzIgaGFuZGxlKQoreworCXVuc2lnbmVkIHNlbDsKKwlzdHJ1Y3QgdGNfdV9rbm9kZSAqbiA9IE5VTEw7CisKKwlzZWwgPSBUQ19VMzJfSEFTSChoYW5kbGUpOworCWlmIChzZWwgPiBodC0+ZGl2aXNvcikKKwkJZ290byBvdXQ7CisKKwlmb3IgKG4gPSBodC0+aHRbc2VsXTsgbjsgbiA9IG4tPm5leHQpCisJCWlmIChuLT5oYW5kbGUgPT0gaGFuZGxlKQorCQkJYnJlYWs7CitvdXQ6CisJcmV0dXJuIG47Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgdTMyX2dldChzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdTMyIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgdGNfdV9obm9kZSAqaHQ7CisJc3RydWN0IHRjX3VfY29tbW9uICp0cF9jID0gdHAtPmRhdGE7CisKKwlpZiAoVENfVTMyX0hUSUQoaGFuZGxlKSA9PSBUQ19VMzJfUk9PVCkKKwkJaHQgPSB0cC0+cm9vdDsKKwllbHNlCisJCWh0ID0gdTMyX2xvb2t1cF9odCh0cF9jLCBUQ19VMzJfSFRJRChoYW5kbGUpKTsKKworCWlmICghaHQpCisJCXJldHVybiAwOworCisJaWYgKFRDX1UzMl9LRVkoaGFuZGxlKSA9PSAwKQorCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpaHQ7CisKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpdTMyX2xvb2t1cF9rZXkoaHQsIGhhbmRsZSk7Cit9CisKK3N0YXRpYyB2b2lkIHUzMl9wdXQoc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgZikKK3sKK30KKworc3RhdGljIHUzMiBnZW5fbmV3X2h0aWQoc3RydWN0IHRjX3VfY29tbW9uICp0cF9jKQoreworCWludCBpID0gMHg4MDA7CisKKwlkbyB7CisJCWlmICgrK3RwX2MtPmhnZW5lcmF0b3IgPT0gMHg3RkYpCisJCQl0cF9jLT5oZ2VuZXJhdG9yID0gMTsKKwl9IHdoaWxlICgtLWk+MCAmJiB1MzJfbG9va3VwX2h0KHRwX2MsICh0cF9jLT5oZ2VuZXJhdG9yfDB4ODAwKTw8MjApKTsKKworCXJldHVybiBpID4gMCA/ICh0cF9jLT5oZ2VuZXJhdG9yfDB4ODAwKTw8MjAgOiAwOworfQorCitzdGF0aWMgaW50IHUzMl9pbml0KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwKQoreworCXN0cnVjdCB0Y191X2hub2RlICpyb290X2h0OworCXN0cnVjdCB0Y191X2NvbW1vbiAqdHBfYzsKKworCWZvciAodHBfYyA9IHUzMl9saXN0OyB0cF9jOyB0cF9jID0gdHBfYy0+bmV4dCkKKwkJaWYgKHRwX2MtPnEgPT0gdHAtPnEpCisJCQlicmVhazsKKworCXJvb3RfaHQgPSBrbWFsbG9jKHNpemVvZigqcm9vdF9odCksIEdGUF9LRVJORUwpOworCWlmIChyb290X2h0ID09IE5VTEwpCisJCXJldHVybiAtRU5PQlVGUzsKKworCW1lbXNldChyb290X2h0LCAwLCBzaXplb2YoKnJvb3RfaHQpKTsKKwlyb290X2h0LT5kaXZpc29yID0gMDsKKwlyb290X2h0LT5yZWZjbnQrKzsKKwlyb290X2h0LT5oYW5kbGUgPSB0cF9jID8gZ2VuX25ld19odGlkKHRwX2MpIDogMHg4MDAwMDAwMDsKKwlyb290X2h0LT5wcmlvID0gdHAtPnByaW87CisKKwlpZiAodHBfYyA9PSBOVUxMKSB7CisJCXRwX2MgPSBrbWFsbG9jKHNpemVvZigqdHBfYyksIEdGUF9LRVJORUwpOworCQlpZiAodHBfYyA9PSBOVUxMKSB7CisJCQlrZnJlZShyb290X2h0KTsKKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCQltZW1zZXQodHBfYywgMCwgc2l6ZW9mKCp0cF9jKSk7CisJCXRwX2MtPnEgPSB0cC0+cTsKKwkJdHBfYy0+bmV4dCA9IHUzMl9saXN0OworCQl1MzJfbGlzdCA9IHRwX2M7CisJfQorCisJdHBfYy0+cmVmY250Kys7CisJcm9vdF9odC0+bmV4dCA9IHRwX2MtPmhsaXN0OworCXRwX2MtPmhsaXN0ID0gcm9vdF9odDsKKwlyb290X2h0LT50cF9jID0gdHBfYzsKKworCXRwLT5yb290ID0gcm9vdF9odDsKKwl0cC0+ZGF0YSA9IHRwX2M7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdTMyX2Rlc3Ryb3lfa2V5KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCBzdHJ1Y3QgdGNfdV9rbm9kZSAqbikKK3sKKwl0Y2ZfdW5iaW5kX2ZpbHRlcih0cCwgJm4tPnJlcyk7CisJdGNmX2V4dHNfZGVzdHJveSh0cCwgJm4tPmV4dHMpOworCWlmIChuLT5odF9kb3duKQorCQluLT5odF9kb3duLT5yZWZjbnQtLTsKKyNpZmRlZiBDT05GSUdfQ0xTX1UzMl9QRVJGCisJaWYgKG4gJiYgKE5VTEwgIT0gbi0+cGYpKQorCQlrZnJlZShuLT5wZik7CisjZW5kaWYKKwlrZnJlZShuKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1MzJfZGVsZXRlX2tleShzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgc3RydWN0IHRjX3Vfa25vZGUqIGtleSkKK3sKKwlzdHJ1Y3QgdGNfdV9rbm9kZSAqKmtwOworCXN0cnVjdCB0Y191X2hub2RlICpodCA9IGtleS0+aHRfdXA7CisKKwlpZiAoaHQpIHsKKwkJZm9yIChrcCA9ICZodC0+aHRbVENfVTMyX0hBU0goa2V5LT5oYW5kbGUpXTsgKmtwOyBrcCA9ICYoKmtwKS0+bmV4dCkgeworCQkJaWYgKCprcCA9PSBrZXkpIHsKKwkJCQl0Y2ZfdHJlZV9sb2NrKHRwKTsKKwkJCQkqa3AgPSBrZXktPm5leHQ7CisJCQkJdGNmX3RyZWVfdW5sb2NrKHRwKTsKKworCQkJCXUzMl9kZXN0cm95X2tleSh0cCwga2V5KTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKwlCVUdfVFJBUCgwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdTMyX2NsZWFyX2hub2RlKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCBzdHJ1Y3QgdGNfdV9obm9kZSAqaHQpCit7CisJc3RydWN0IHRjX3Vfa25vZGUgKm47CisJdW5zaWduZWQgaDsKKworCWZvciAoaD0wOyBoPD1odC0+ZGl2aXNvcjsgaCsrKSB7CisJCXdoaWxlICgobiA9IGh0LT5odFtoXSkgIT0gTlVMTCkgeworCQkJaHQtPmh0W2hdID0gbi0+bmV4dDsKKworCQkJdTMyX2Rlc3Ryb3lfa2V5KHRwLCBuKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCB1MzJfZGVzdHJveV9obm9kZShzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgc3RydWN0IHRjX3VfaG5vZGUgKmh0KQoreworCXN0cnVjdCB0Y191X2NvbW1vbiAqdHBfYyA9IHRwLT5kYXRhOworCXN0cnVjdCB0Y191X2hub2RlICoqaG47CisKKwlCVUdfVFJBUCghaHQtPnJlZmNudCk7CisKKwl1MzJfY2xlYXJfaG5vZGUodHAsIGh0KTsKKworCWZvciAoaG4gPSAmdHBfYy0+aGxpc3Q7ICpobjsgaG4gPSAmKCpobiktPm5leHQpIHsKKwkJaWYgKCpobiA9PSBodCkgeworCQkJKmhuID0gaHQtPm5leHQ7CisJCQlrZnJlZShodCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCUJVR19UUkFQKDApOworCXJldHVybiAtRU5PRU5UOworfQorCitzdGF0aWMgdm9pZCB1MzJfZGVzdHJveShzdHJ1Y3QgdGNmX3Byb3RvICp0cCkKK3sKKwlzdHJ1Y3QgdGNfdV9jb21tb24gKnRwX2MgPSB0cC0+ZGF0YTsKKwlzdHJ1Y3QgdGNfdV9obm9kZSAqcm9vdF9odCA9IHhjaGcoJnRwLT5yb290LCBOVUxMKTsKKworCUJVR19UUkFQKHJvb3RfaHQgIT0gTlVMTCk7CisKKwlpZiAocm9vdF9odCAmJiAtLXJvb3RfaHQtPnJlZmNudCA9PSAwKQorCQl1MzJfZGVzdHJveV9obm9kZSh0cCwgcm9vdF9odCk7CisKKwlpZiAoLS10cF9jLT5yZWZjbnQgPT0gMCkgeworCQlzdHJ1Y3QgdGNfdV9obm9kZSAqaHQ7CisJCXN0cnVjdCB0Y191X2NvbW1vbiAqKnRwX2NwOworCisJCWZvciAodHBfY3AgPSAmdTMyX2xpc3Q7ICp0cF9jcDsgdHBfY3AgPSAmKCp0cF9jcCktPm5leHQpIHsKKwkJCWlmICgqdHBfY3AgPT0gdHBfYykgeworCQkJCSp0cF9jcCA9IHRwX2MtPm5leHQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlmb3IgKGh0PXRwX2MtPmhsaXN0OyBodDsgaHQgPSBodC0+bmV4dCkKKwkJCXUzMl9jbGVhcl9obm9kZSh0cCwgaHQpOworCisJCXdoaWxlICgoaHQgPSB0cF9jLT5obGlzdCkgIT0gTlVMTCkgeworCQkJdHBfYy0+aGxpc3QgPSBodC0+bmV4dDsKKworCQkJQlVHX1RSQVAoaHQtPnJlZmNudCA9PSAwKTsKKworCQkJa2ZyZWUoaHQpOworCQl9OworCisJCWtmcmVlKHRwX2MpOworCX0KKworCXRwLT5kYXRhID0gTlVMTDsKK30KKworc3RhdGljIGludCB1MzJfZGVsZXRlKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgdGNfdV9obm9kZSAqaHQgPSAoc3RydWN0IHRjX3VfaG5vZGUqKWFyZzsKKworCWlmIChodCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWlmIChUQ19VMzJfS0VZKGh0LT5oYW5kbGUpKQorCQlyZXR1cm4gdTMyX2RlbGV0ZV9rZXkodHAsIChzdHJ1Y3QgdGNfdV9rbm9kZSopaHQpOworCisJaWYgKHRwLT5yb290ID09IGh0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgtLWh0LT5yZWZjbnQgPT0gMCkKKwkJdTMyX2Rlc3Ryb3lfaG5vZGUodHAsIGh0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIGdlbl9uZXdfa2lkKHN0cnVjdCB0Y191X2hub2RlICpodCwgdTMyIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgdGNfdV9rbm9kZSAqbjsKKwl1bnNpZ25lZCBpID0gMHg3RkY7CisKKwlmb3IgKG49aHQtPmh0W1RDX1UzMl9IQVNIKGhhbmRsZSldOyBuOyBuID0gbi0+bmV4dCkKKwkJaWYgKGkgPCBUQ19VMzJfTk9ERShuLT5oYW5kbGUpKQorCQkJaSA9IFRDX1UzMl9OT0RFKG4tPmhhbmRsZSk7CisJaSsrOworCisJcmV0dXJuIGhhbmRsZXwoaT4weEZGRiA/IDB4RkZGIDogaSk7Cit9CisKK3N0YXRpYyBpbnQgdTMyX3NldF9wYXJtcyhzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBiYXNlLAorCQkJIHN0cnVjdCB0Y191X2hub2RlICpodCwKKwkJCSBzdHJ1Y3QgdGNfdV9rbm9kZSAqbiwgc3RydWN0IHJ0YXR0ciAqKnRiLAorCQkJIHN0cnVjdCBydGF0dHIgKmVzdCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB0Y2ZfZXh0cyBlOworCisJZXJyID0gdGNmX2V4dHNfdmFsaWRhdGUodHAsIHRiLCBlc3QsICZlLCAmdTMyX2V4dF9tYXApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gLUVJTlZBTDsKKwlpZiAodGJbVENBX1UzMl9MSU5LLTFdKSB7CisJCXUzMiBoYW5kbGUgPSAqKHUzMiopUlRBX0RBVEEodGJbVENBX1UzMl9MSU5LLTFdKTsKKwkJc3RydWN0IHRjX3VfaG5vZGUgKmh0X2Rvd24gPSBOVUxMOworCisJCWlmIChUQ19VMzJfS0VZKGhhbmRsZSkpCisJCQlnb3RvIGVycm91dDsKKworCQlpZiAoaGFuZGxlKSB7CisJCQlodF9kb3duID0gdTMyX2xvb2t1cF9odChodC0+dHBfYywgaGFuZGxlKTsKKworCQkJaWYgKGh0X2Rvd24gPT0gTlVMTCkKKwkJCQlnb3RvIGVycm91dDsKKwkJCWh0X2Rvd24tPnJlZmNudCsrOworCQl9CisKKwkJdGNmX3RyZWVfbG9jayh0cCk7CisJCWh0X2Rvd24gPSB4Y2hnKCZuLT5odF9kb3duLCBodF9kb3duKTsKKwkJdGNmX3RyZWVfdW5sb2NrKHRwKTsKKworCQlpZiAoaHRfZG93bikKKwkJCWh0X2Rvd24tPnJlZmNudC0tOworCX0KKwlpZiAodGJbVENBX1UzMl9DTEFTU0lELTFdKSB7CisJCW4tPnJlcy5jbGFzc2lkID0gKih1MzIqKVJUQV9EQVRBKHRiW1RDQV9VMzJfQ0xBU1NJRC0xXSk7CisJCXRjZl9iaW5kX2ZpbHRlcih0cCwgJm4tPnJlcywgYmFzZSk7CisJfQorCisjaWZkZWYgQ09ORklHX05FVF9DTFNfSU5ECisJaWYgKHRiW1RDQV9VMzJfSU5ERVYtMV0pIHsKKwkJaW50IGVyciA9IHRjZl9jaGFuZ2VfaW5kZXYodHAsIG4tPmluZGV2LCB0YltUQ0FfVTMyX0lOREVWLTFdKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVycm91dDsKKwl9CisjZW5kaWYKKwl0Y2ZfZXh0c19jaGFuZ2UodHAsICZuLT5leHRzLCAmZSk7CisKKwlyZXR1cm4gMDsKK2Vycm91dDoKKwl0Y2ZfZXh0c19kZXN0cm95KHRwLCAmZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB1MzJfY2hhbmdlKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1bnNpZ25lZCBsb25nIGJhc2UsIHUzMiBoYW5kbGUsCisJCSAgICAgIHN0cnVjdCBydGF0dHIgKip0Y2EsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgKmFyZykKK3sKKwlzdHJ1Y3QgdGNfdV9jb21tb24gKnRwX2MgPSB0cC0+ZGF0YTsKKwlzdHJ1Y3QgdGNfdV9obm9kZSAqaHQ7CisJc3RydWN0IHRjX3Vfa25vZGUgKm47CisJc3RydWN0IHRjX3UzMl9zZWwgKnM7CisJc3RydWN0IHJ0YXR0ciAqb3B0ID0gdGNhW1RDQV9PUFRJT05TLTFdOworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9VMzJfTUFYXTsKKwl1MzIgaHRpZDsKKwlpbnQgZXJyOworCisJaWYgKG9wdCA9PSBOVUxMKQorCQlyZXR1cm4gaGFuZGxlID8gLUVJTlZBTCA6IDA7CisKKwlpZiAocnRhdHRyX3BhcnNlX25lc3RlZCh0YiwgVENBX1UzMl9NQVgsIG9wdCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgobiA9IChzdHJ1Y3QgdGNfdV9rbm9kZSopKmFyZykgIT0gTlVMTCkgeworCQlpZiAoVENfVTMyX0tFWShuLT5oYW5kbGUpID09IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyZXR1cm4gdTMyX3NldF9wYXJtcyh0cCwgYmFzZSwgbi0+aHRfdXAsIG4sIHRiLCB0Y2FbVENBX1JBVEUtMV0pOworCX0KKworCWlmICh0YltUQ0FfVTMyX0RJVklTT1ItMV0pIHsKKwkJdW5zaWduZWQgZGl2aXNvciA9ICoodW5zaWduZWQqKVJUQV9EQVRBKHRiW1RDQV9VMzJfRElWSVNPUi0xXSk7CisKKwkJaWYgKC0tZGl2aXNvciA+IDB4MTAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChUQ19VMzJfS0VZKGhhbmRsZSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGhhbmRsZSA9PSAwKSB7CisJCQloYW5kbGUgPSBnZW5fbmV3X2h0aWQodHAtPmRhdGEpOworCQkJaWYgKGhhbmRsZSA9PSAwKQorCQkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWh0ID0ga21hbGxvYyhzaXplb2YoKmh0KSArIGRpdmlzb3Iqc2l6ZW9mKHZvaWQqKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChodCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9CVUZTOworCQltZW1zZXQoaHQsIDAsIHNpemVvZigqaHQpICsgZGl2aXNvcipzaXplb2Yodm9pZCopKTsKKwkJaHQtPnRwX2MgPSB0cF9jOworCQlodC0+cmVmY250ID0gMDsKKwkJaHQtPmRpdmlzb3IgPSBkaXZpc29yOworCQlodC0+aGFuZGxlID0gaGFuZGxlOworCQlodC0+cHJpbyA9IHRwLT5wcmlvOworCQlodC0+bmV4dCA9IHRwX2MtPmhsaXN0OworCQl0cF9jLT5obGlzdCA9IGh0OworCQkqYXJnID0gKHVuc2lnbmVkIGxvbmcpaHQ7CisJCXJldHVybiAwOworCX0KKworCWlmICh0YltUQ0FfVTMyX0hBU0gtMV0pIHsKKwkJaHRpZCA9ICoodW5zaWduZWQqKVJUQV9EQVRBKHRiW1RDQV9VMzJfSEFTSC0xXSk7CisJCWlmIChUQ19VMzJfSFRJRChodGlkKSA9PSBUQ19VMzJfUk9PVCkgeworCQkJaHQgPSB0cC0+cm9vdDsKKwkJCWh0aWQgPSBodC0+aGFuZGxlOworCQl9IGVsc2UgeworCQkJaHQgPSB1MzJfbG9va3VwX2h0KHRwLT5kYXRhLCBUQ19VMzJfSFRJRChodGlkKSk7CisJCQlpZiAoaHQgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCWh0ID0gdHAtPnJvb3Q7CisJCWh0aWQgPSBodC0+aGFuZGxlOworCX0KKworCWlmIChodC0+ZGl2aXNvciA8IFRDX1UzMl9IQVNIKGh0aWQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChoYW5kbGUpIHsKKwkJaWYgKFRDX1UzMl9IVElEKGhhbmRsZSkgJiYgVENfVTMyX0hUSUQoaGFuZGxlXmh0aWQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWhhbmRsZSA9IGh0aWQgfCBUQ19VMzJfTk9ERShoYW5kbGUpOworCX0gZWxzZQorCQloYW5kbGUgPSBnZW5fbmV3X2tpZChodCwgaHRpZCk7CisKKwlpZiAodGJbVENBX1UzMl9TRUwtMV0gPT0gMCB8fAorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfVTMyX1NFTC0xXSkgPCBzaXplb2Yoc3RydWN0IHRjX3UzMl9zZWwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXMgPSBSVEFfREFUQSh0YltUQ0FfVTMyX1NFTC0xXSk7CisKKwluID0ga21hbGxvYyhzaXplb2YoKm4pICsgcy0+bmtleXMqc2l6ZW9mKHN0cnVjdCB0Y191MzJfa2V5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKG4gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJbWVtc2V0KG4sIDAsIHNpemVvZigqbikgKyBzLT5ua2V5cypzaXplb2Yoc3RydWN0IHRjX3UzMl9rZXkpKTsKKyNpZmRlZiBDT05GSUdfQ0xTX1UzMl9QRVJGCisJbi0+cGYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdGNfdTMyX3BjbnQpICsgcy0+bmtleXMqc2l6ZW9mKHU2NCksIEdGUF9LRVJORUwpOworCWlmIChuLT5wZiA9PSBOVUxMKSB7CisJCWtmcmVlKG4pOworCQlyZXR1cm4gLUVOT0JVRlM7CisJfQorCW1lbXNldChuLT5wZiwgMCwgc2l6ZW9mKHN0cnVjdCB0Y191MzJfcGNudCkgKyBzLT5ua2V5cypzaXplb2YodTY0KSk7CisjZW5kaWYKKworCW1lbWNweSgmbi0+c2VsLCBzLCBzaXplb2YoKnMpICsgcy0+bmtleXMqc2l6ZW9mKHN0cnVjdCB0Y191MzJfa2V5KSk7CisJbi0+aHRfdXAgPSBodDsKKwluLT5oYW5kbGUgPSBoYW5kbGU7Cit7CisJdTggaSA9IDA7CisJdTMyIG1hc2sgPSBzLT5obWFzazsKKwlpZiAobWFzaykgeworCQl3aGlsZSAoIShtYXNrICYgMSkpIHsKKwkJCWkrKzsKKwkJCW1hc2s+Pj0xOworCQl9CisJfQorCW4tPmZzaGlmdCA9IGk7Cit9CisKKyNpZmRlZiBDT05GSUdfQ0xTX1UzMl9NQVJLCisJaWYgKHRiW1RDQV9VMzJfTUFSSy0xXSkgeworCQlzdHJ1Y3QgdGNfdTMyX21hcmsgKm1hcms7CisKKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9VMzJfTUFSSy0xXSkgPCBzaXplb2Yoc3RydWN0IHRjX3UzMl9tYXJrKSkgeworI2lmZGVmIENPTkZJR19DTFNfVTMyX1BFUkYKKwkJCWtmcmVlKG4tPnBmKTsKKyNlbmRpZgorCQkJa2ZyZWUobik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQltYXJrID0gUlRBX0RBVEEodGJbVENBX1UzMl9NQVJLLTFdKTsKKwkJbWVtY3B5KCZuLT5tYXJrLCBtYXJrLCBzaXplb2Yoc3RydWN0IHRjX3UzMl9tYXJrKSk7CisJCW4tPm1hcmsuc3VjY2VzcyA9IDA7CisJfQorI2VuZGlmCisKKwllcnIgPSB1MzJfc2V0X3Bhcm1zKHRwLCBiYXNlLCBodCwgbiwgdGIsIHRjYVtUQ0FfUkFURS0xXSk7CisJaWYgKGVyciA9PSAwKSB7CisJCXN0cnVjdCB0Y191X2tub2RlICoqaW5zOworCQlmb3IgKGlucyA9ICZodC0+aHRbVENfVTMyX0hBU0goaGFuZGxlKV07ICppbnM7IGlucyA9ICYoKmlucyktPm5leHQpCisJCQlpZiAoVENfVTMyX05PREUoaGFuZGxlKSA8IFRDX1UzMl9OT0RFKCgqaW5zKS0+aGFuZGxlKSkKKwkJCQlicmVhazsKKworCQluLT5uZXh0ID0gKmluczsKKwkJd21iKCk7CisJCSppbnMgPSBuOworCisJCSphcmcgPSAodW5zaWduZWQgbG9uZyluOworCQlyZXR1cm4gMDsKKwl9CisjaWZkZWYgQ09ORklHX0NMU19VMzJfUEVSRgorCWlmIChuICYmIChOVUxMICE9IG4tPnBmKSkKKwkJa2ZyZWUobi0+cGYpOworI2VuZGlmCisJa2ZyZWUobik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgdTMyX3dhbGsoc3RydWN0IHRjZl9wcm90byAqdHAsIHN0cnVjdCB0Y2Zfd2Fsa2VyICphcmcpCit7CisJc3RydWN0IHRjX3VfY29tbW9uICp0cF9jID0gdHAtPmRhdGE7CisJc3RydWN0IHRjX3VfaG5vZGUgKmh0OworCXN0cnVjdCB0Y191X2tub2RlICpuOworCXVuc2lnbmVkIGg7CisKKwlpZiAoYXJnLT5zdG9wKQorCQlyZXR1cm47CisKKwlmb3IgKGh0ID0gdHBfYy0+aGxpc3Q7IGh0OyBodCA9IGh0LT5uZXh0KSB7CisJCWlmIChodC0+cHJpbyAhPSB0cC0+cHJpbykKKwkJCWNvbnRpbnVlOworCQlpZiAoYXJnLT5jb3VudCA+PSBhcmctPnNraXApIHsKKwkJCWlmIChhcmctPmZuKHRwLCAodW5zaWduZWQgbG9uZylodCwgYXJnKSA8IDApIHsKKwkJCQlhcmctPnN0b3AgPSAxOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQlhcmctPmNvdW50Kys7CisJCWZvciAoaCA9IDA7IGggPD0gaHQtPmRpdmlzb3I7IGgrKykgeworCQkJZm9yIChuID0gaHQtPmh0W2hdOyBuOyBuID0gbi0+bmV4dCkgeworCQkJCWlmIChhcmctPmNvdW50IDwgYXJnLT5za2lwKSB7CisJCQkJCWFyZy0+Y291bnQrKzsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmIChhcmctPmZuKHRwLCAodW5zaWduZWQgbG9uZyluLCBhcmcpIDwgMCkgeworCQkJCQlhcmctPnN0b3AgPSAxOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWFyZy0+Y291bnQrKzsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGludCB1MzJfZHVtcChzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBmaCwKKwkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNtc2cgKnQpCit7CisJc3RydWN0IHRjX3Vfa25vZGUgKm4gPSAoc3RydWN0IHRjX3Vfa25vZGUqKWZoOworCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCXN0cnVjdCBydGF0dHIgKnJ0YTsKKworCWlmIChuID09IE5VTEwpCisJCXJldHVybiBza2ItPmxlbjsKKworCXQtPnRjbV9oYW5kbGUgPSBuLT5oYW5kbGU7CisKKwlydGEgPSAoc3RydWN0IHJ0YXR0ciopYjsKKwlSVEFfUFVUKHNrYiwgVENBX09QVElPTlMsIDAsIE5VTEwpOworCisJaWYgKFRDX1UzMl9LRVkobi0+aGFuZGxlKSA9PSAwKSB7CisJCXN0cnVjdCB0Y191X2hub2RlICpodCA9IChzdHJ1Y3QgdGNfdV9obm9kZSopZmg7CisJCXUzMiBkaXZpc29yID0gaHQtPmRpdmlzb3IrMTsKKwkJUlRBX1BVVChza2IsIFRDQV9VMzJfRElWSVNPUiwgNCwgJmRpdmlzb3IpOworCX0gZWxzZSB7CisJCVJUQV9QVVQoc2tiLCBUQ0FfVTMyX1NFTCwKKwkJCXNpemVvZihuLT5zZWwpICsgbi0+c2VsLm5rZXlzKnNpemVvZihzdHJ1Y3QgdGNfdTMyX2tleSksCisJCQkmbi0+c2VsKTsKKwkJaWYgKG4tPmh0X3VwKSB7CisJCQl1MzIgaHRpZCA9IG4tPmhhbmRsZSAmIDB4RkZGRkYwMDA7CisJCQlSVEFfUFVUKHNrYiwgVENBX1UzMl9IQVNILCA0LCAmaHRpZCk7CisJCX0KKwkJaWYgKG4tPnJlcy5jbGFzc2lkKQorCQkJUlRBX1BVVChza2IsIFRDQV9VMzJfQ0xBU1NJRCwgNCwgJm4tPnJlcy5jbGFzc2lkKTsKKwkJaWYgKG4tPmh0X2Rvd24pCisJCQlSVEFfUFVUKHNrYiwgVENBX1UzMl9MSU5LLCA0LCAmbi0+aHRfZG93bi0+aGFuZGxlKTsKKworI2lmZGVmIENPTkZJR19DTFNfVTMyX01BUksKKwkJaWYgKG4tPm1hcmsudmFsIHx8IG4tPm1hcmsubWFzaykKKwkJCVJUQV9QVVQoc2tiLCBUQ0FfVTMyX01BUkssIHNpemVvZihuLT5tYXJrKSwgJm4tPm1hcmspOworI2VuZGlmCisKKwkJaWYgKHRjZl9leHRzX2R1bXAoc2tiLCAmbi0+ZXh0cywgJnUzMl9leHRfbWFwKSA8IDApCisJCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOworCisjaWZkZWYgQ09ORklHX05FVF9DTFNfSU5ECisJCWlmKHN0cmxlbihuLT5pbmRldikpCisJCQlSVEFfUFVUKHNrYiwgVENBX1UzMl9JTkRFViwgSUZOQU1TSVosIG4tPmluZGV2KTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DTFNfVTMyX1BFUkYKKwkJUlRBX1BVVChza2IsIFRDQV9VMzJfUENOVCwgCisJCXNpemVvZihzdHJ1Y3QgdGNfdTMyX3BjbnQpICsgbi0+c2VsLm5rZXlzKnNpemVvZih1NjQpLAorCQkJbi0+cGYpOworI2VuZGlmCisJfQorCisJcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlpZiAoVENfVTMyX0tFWShuLT5oYW5kbGUpKQorCQlpZiAodGNmX2V4dHNfZHVtcF9zdGF0cyhza2IsICZuLT5leHRzLCAmdTMyX2V4dF9tYXApIDwgMCkKKwkJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CisJcmV0dXJuIHNrYi0+bGVuOworCitydGF0dHJfZmFpbHVyZToKKwlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHN0cnVjdCB0Y2ZfcHJvdG9fb3BzIGNsc191MzJfb3BzID0geworCS5uZXh0CQk9CU5VTEwsCisJLmtpbmQJCT0JInUzMiIsCisJLmNsYXNzaWZ5CT0JdTMyX2NsYXNzaWZ5LAorCS5pbml0CQk9CXUzMl9pbml0LAorCS5kZXN0cm95CT0JdTMyX2Rlc3Ryb3ksCisJLmdldAkJPQl1MzJfZ2V0LAorCS5wdXQJCT0JdTMyX3B1dCwKKwkuY2hhbmdlCQk9CXUzMl9jaGFuZ2UsCisJLmRlbGV0ZQkJPQl1MzJfZGVsZXRlLAorCS53YWxrCQk9CXUzMl93YWxrLAorCS5kdW1wCQk9CXUzMl9kdW1wLAorCS5vd25lcgkJPQlUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdTMyKHZvaWQpCit7CisJcHJpbnRrKCJ1MzIgY2xhc3NpZmllclxuIik7CisjaWZkZWYgQ09ORklHX0NMU19VMzJfUEVSRgorCXByaW50aygiICAgIFBlcmZvbWFuY2UgY291bnRlcnMgb25cbiIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX05FVF9DTFNfUE9MSUNFCisJcHJpbnRrKCIgICAgT0xEIHBvbGljZXIgb24gXG4iKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ORVRfQ0xTX0lORAorCXByaW50aygiICAgIGlucHV0IGRldmljZSBjaGVjayBvbiBcbiIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCisJcHJpbnRrKCIgICAgQWN0aW9ucyBjb25maWd1cmVkIFxuIik7CisjZW5kaWYKKwlyZXR1cm4gcmVnaXN0ZXJfdGNmX3Byb3RvX29wcygmY2xzX3UzMl9vcHMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF91MzIodm9pZCkgCit7CisJdW5yZWdpc3Rlcl90Y2ZfcHJvdG9fb3BzKCZjbHNfdTMyX29wcyk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfdTMyKQorbW9kdWxlX2V4aXQoZXhpdF91MzIpCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvZW1fY21wLmMgYi9uZXQvc2NoZWQvZW1fY21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYxZjAwZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY2hlZC9lbV9jbXAuYwpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIG5ldC9zY2hlZC9lbV9jbXAuYwlTaW1wbGUgcGFja2V0IGRhdGEgY29tcGFyaXNvbiBlbWF0Y2gKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglUaG9tYXMgR3JhZiA8dGdyYWZAc3V1Zy5jaD4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC90Y19lbWF0Y2gvdGNfZW1fY21wLmg+CisjaW5jbHVkZSA8bmV0L3BrdF9jbHMuaD4KKworc3RhdGljIGlubGluZSBpbnQgY21wX25lZWRzX3RyYW5zZm9ybWF0aW9uKHN0cnVjdCB0Y2ZfZW1fY21wICpjbXApCit7CisJcmV0dXJuIHVubGlrZWx5KGNtcC0+ZmxhZ3MgJiBUQ0ZfRU1fQ01QX1RSQU5TKTsKK30KKworc3RhdGljIGludCBlbV9jbXBfbWF0Y2goc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjZl9lbWF0Y2ggKmVtLAorCQkJc3RydWN0IHRjZl9wa3RfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgdGNmX2VtX2NtcCAqY21wID0gKHN0cnVjdCB0Y2ZfZW1fY21wICopIGVtLT5kYXRhOworCXVuc2lnbmVkIGNoYXIgKnB0ciA9IHRjZl9nZXRfYmFzZV9wdHIoc2tiLCBjbXAtPmxheWVyKSArIGNtcC0+b2ZmOworCXUzMiB2YWwgPSAwOworCisJaWYgKCF0Y2ZfdmFsaWRfb2Zmc2V0KHNrYiwgcHRyLCBjbXAtPmFsaWduKSkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGNtcC0+YWxpZ24pIHsKKwkJY2FzZSBUQ0ZfRU1fQUxJR05fVTg6CisJCQl2YWwgPSAqcHRyOworCQkJYnJlYWs7CisKKwkJY2FzZSBUQ0ZfRU1fQUxJR05fVTE2OgorCQkJdmFsID0gKnB0ciA8PCA4OworCQkJdmFsIHw9ICoocHRyKzEpOworCisJCQlpZiAoY21wX25lZWRzX3RyYW5zZm9ybWF0aW9uKGNtcCkpCisJCQkJdmFsID0gYmUxNl90b19jcHUodmFsKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVENGX0VNX0FMSUdOX1UzMjoKKwkJCS8qIFdvcnRoIGNoZWNraW5nIGJvdW5kcmllcz8gVGhlIGJyYW5jaGluZyBzZWVtcworCQkJICogdG8gZ2V0IHdvcnNlLiBWaXNpdCBhZ2Fpbi4gKi8KKwkJCXZhbCA9ICpwdHIgPDwgMjQ7CisJCQl2YWwgfD0gKihwdHIrMSkgPDwgMTY7CisJCQl2YWwgfD0gKihwdHIrMikgPDwgODsKKwkJCXZhbCB8PSAqKHB0ciszKTsKKworCQkJaWYgKGNtcF9uZWVkc190cmFuc2Zvcm1hdGlvbihjbXApKQorCQkJCXZhbCA9IGJlMzJfdG9fY3B1KHZhbCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKGNtcC0+bWFzaykKKwkJdmFsICY9IGNtcC0+bWFzazsKKworCXN3aXRjaCAoY21wLT5vcG5kKSB7CisJCWNhc2UgVENGX0VNX09QTkRfRVE6CisJCQlyZXR1cm4gdmFsID09IGNtcC0+dmFsOworCQljYXNlIFRDRl9FTV9PUE5EX0xUOgorCQkJcmV0dXJuIHZhbCA8IGNtcC0+dmFsOworCQljYXNlIFRDRl9FTV9PUE5EX0dUOgorCQkJcmV0dXJuIHZhbCA+IGNtcC0+dmFsOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHRjZl9lbWF0Y2hfb3BzIGVtX2NtcF9vcHMgPSB7CisJLmtpbmQJICA9IFRDRl9FTV9DTVAsCisJLmRhdGFsZW4gID0gc2l6ZW9mKHN0cnVjdCB0Y2ZfZW1fY21wKSwKKwkubWF0Y2gJICA9IGVtX2NtcF9tYXRjaCwKKwkub3duZXIJICA9IFRISVNfTU9EVUxFLAorCS5saW5rCSAgPSBMSVNUX0hFQURfSU5JVChlbV9jbXBfb3BzLmxpbmspCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2VtX2NtcCh2b2lkKQoreworCXJldHVybiB0Y2ZfZW1fcmVnaXN0ZXIoJmVtX2NtcF9vcHMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9lbV9jbXAodm9pZCkgCit7CisJdGNmX2VtX3VucmVnaXN0ZXIoJmVtX2NtcF9vcHMpOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGluaXRfZW1fY21wKTsKK21vZHVsZV9leGl0KGV4aXRfZW1fY21wKTsKKwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2VtX21ldGEuYyBiL25ldC9zY2hlZC9lbV9tZXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFlZWFmNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY2hlZC9lbV9tZXRhLmMKQEAgLTAsMCArMSw2NjEgQEAKKy8qCisgKiBuZXQvc2NoZWQvZW1fbWV0YS5jCU1ldGFkYXRhIGVtYXRjaAorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CVRob21hcyBHcmFmIDx0Z3JhZkBzdXVnLmNoPgorICoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAKKyAqIAlUaGUgbWV0YWRhdGEgZW1hdGNoIGNvbXBhcmVzIHR3byBtZXRhIG9iamVjdHMgd2hlcmUgZWFjaCBvYmplY3QKKyAqIAlyZXByZXNlbnRzIGVpdGhlciBhIG1ldGEgdmFsdWUgc3RvcmVkIGluIHRoZSBrZXJuZWwgb3IgYSBzdGF0aWMKKyAqIAl2YWx1ZSBwcm92aWRlZCBieSB1c2Vyc3BhY2UuIFRoZSBvYmplY3RzIGFyZSBub3QgcHJvdmlkZWQgYnkKKyAqIAl1c2Vyc3BhY2UgaXRzZWxmIGJ1dCByYXRoZXIgYSBkZWZpbml0aW9uIHByb3ZpZGluZyB0aGUgaW5mb3JtYXRpb24KKyAqIAl0byBidWlsZCB0aGVtLiBFdmVyeSBvYmplY3QgaXMgb2YgYSBjZXJ0YWluIHR5cGUgd2hpY2ggbXVzdCBiZQorICogCWVxdWFsIHRvIHRoZSBvYmplY3QgaXQgaXMgYmVpbmcgY29tcGFyZWQgdG8uCisgKgorICogCVRoZSBkZWZpbml0aW9uIG9mIGEgb2JqZWN0cyBjb25pc3RzIG9mIHRoZSB0eXBlIChtZXRhIHR5cGUpLCBhCisgKiAJaWRlbnRpZmllciAobWV0YSBpZCkgYW5kIGFkZGl0aW9uYWwgdHlwZSBzcGVjaWZpYyBpbmZvcm1hdGlvbi4KKyAqIAlUaGUgbWV0YSBpZCBpcyBlaXRoZXIgVENGX01FVEFfVFlQRV9WQUxVRSBmb3IgdmFsdWVzIHByb3ZpZGVkIGJ5CisgKiAJdXNlcnNwYWNlIG9yIGEgaW5kZXggdG8gdGhlIG1ldGEgb3BlcmF0aW9ucyB0YWJsZSBjb25zaXN0aW5nIG9mCisgKiAJZnVuY3Rpb24gcG9pbnRlcnMgdG8gdHlwZSBzcGVjaWZpYyBtZXRhIGRhdGEgY29sbGVjdG9ycyByZXR1cm5pbmcKKyAqIAl0aGUgdmFsdWUgb2YgdGhlIHJlcXVlc3RlZCBtZXRhIHZhbHVlLgorICoKKyAqIAkgICAgICAgICBsdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ2YWx1ZQorICogCSAgICAgICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rCisgKiAJICAgICAgfCB0eXBlOiBJTlQgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHlwZTogSU5UIHwKKyAqIAkgZGVmICB8IGlkOiBJTkRFViB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpZDogVkFMVUUgfAorICogCSAgICAgIHwgZGF0YTogICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRhdGE6IDMgICB8CisgKiAJICAgICAgKy0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKyAqIAkgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogCSAgICAgICAgICAgIC0tLT4gbWV0YV9vcHNbSU5UXVtJTkRFVl0oLi4uKSAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIAkgICAgICAgICAgICAtLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogCSAgICAgICAgICAgIFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWCisgKiAJICAgICAgKy0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKyAqIAkgICAgICB8IHR5cGU6IElOVCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0eXBlOiBJTlQgfAorICogCSBvYmogIHwgaWQ6IElOREVWIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlkOiBWQUxVRSB8CisgKiAJICAgICAgfCBkYXRhOiAyICAgfDwtLWRhdGEgZ290IGZpbGxlZCBvdXQgICAgIHwgZGF0YTogMyAgIHwKKyAqIAkgICAgICArLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKworICogCSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIAkgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLT4gMiAgZXF1YWxzIDMgPC0tLS0tLS0tLS0tLS0tCisgKgorICogCVRoaXMgaXMgYSBzaW1wbGlmaWVkIHNjaGVtYSwgdGhlIGNvbXBsZXhpdHkgdmFyaWVzIGRlcGVuZGluZworICogCW9uIHRoZSBtZXRhIHR5cGUuIE9idmlvdXNseSwgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBtdXN0IGFsc28KKyAqIAliZSBwcm92aWRlZCBmb3Igbm9uLW51bWVyaWMgdHlwZXMuCisgKgorICogCUFkZGl0aW9uYWx5LCB0eXBlIGRlcGVuZGFudCBtb2RpZmllcnMgc3VjaCBhcyBzaGlmdCBvcGVyYXRvcnMKKyAqIAlvciBtYXNrIG1heSBiZSBhcHBsaWVkIHRvIGV4dGVuZCB0aGUgZnVuY3Rpb25hbGl5LiBBcyBvZiBub3csCisgKiAJdGhlIHZhcmlhYmxlIGxlbmd0aCB0eXBlIHN1cHBvcnRzIHNoaWZ0aW5nIHRoZSBieXRlIHN0cmluZyB0bworICogCXRoZSByaWdodCwgZWF0aW5nIHVwIGFueSBudW1iZXIgb2Ygb2N0ZXRzIGFuZCB0aHVzIHN1cHBvcnRpbmcKKyAqIAl3aWxkY2FyZCBpbnRlcmZhY2UgbmFtZSBjb21wYXJpc29ucyBzdWNoIGFzICJwcHAlIiBtYXRjaGluZworICogCXBwcDAuLjkuCisgKgorICogCU5PVEU6IENlcnRhaW4gbWV0YSB2YWx1ZXMgZGVwZW5kIG9uIG90aGVyIHN1YnN5c3RlbXMgYW5kIGFyZQorICogCSAgICAgIG9ubHkgYXZhaWxhYmxlIGlmIHRoYXQgc3Vic3l0ZW0gaXMgZW5hYmxlZCBpbiB0aGUga2VybmVsLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvdGNfZW1hdGNoL3RjX2VtX21ldGEuaD4KKyNpbmNsdWRlIDxuZXQvZHN0Lmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L3BrdF9jbHMuaD4KKworc3RydWN0IG1ldGFfb2JqCit7CisJdW5zaWduZWQgbG9uZwkJdmFsdWU7CisJdW5zaWduZWQgaW50CQlsZW47Cit9OworCitzdHJ1Y3QgbWV0YV92YWx1ZQoreworCXN0cnVjdCB0Y2ZfbWV0YV92YWwJaGRyOworCXVuc2lnbmVkIGxvbmcJCXZhbDsKKwl1bnNpZ25lZCBpbnQJCWxlbjsKK307CisKK3N0cnVjdCBtZXRhX21hdGNoCit7CisJc3RydWN0IG1ldGFfdmFsdWUJbHZhbHVlOworCXN0cnVjdCBtZXRhX3ZhbHVlCXJ2YWx1ZTsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IG1ldGFfaWQoc3RydWN0IG1ldGFfdmFsdWUgKnYpCit7CisJcmV0dXJuIFRDRl9NRVRBX0lEKHYtPmhkci5raW5kKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbWV0YV90eXBlKHN0cnVjdCBtZXRhX3ZhbHVlICp2KQoreworCXJldHVybiBUQ0ZfTUVUQV9UWVBFKHYtPmhkci5raW5kKTsKK30KKworI2RlZmluZSBNRVRBX0NPTExFQ1RPUihGVU5DKSBzdGF0aWMgdm9pZCBtZXRhXyMjRlVOQyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBcCisJc3RydWN0IHRjZl9wa3RfaW5mbyAqaW5mbywgc3RydWN0IG1ldGFfdmFsdWUgKnYsIFwKKwlzdHJ1Y3QgbWV0YV9vYmogKmRzdCwgaW50ICplcnIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3lzdGVtIHN0YXR1cyAmIG1pc2MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTUVUQV9DT0xMRUNUT1IoaW50X3JhbmRvbSkKK3sKKwlnZXRfcmFuZG9tX2J5dGVzKCZkc3QtPnZhbHVlLCBzaXplb2YoZHN0LT52YWx1ZSkpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZml4ZWRfbG9hZGF2ZyhpbnQgbG9hZCkKK3sKKwlpbnQgcm5kX2xvYWQgPSBsb2FkICsgKEZJWEVEXzEvMjAwKTsKKwlpbnQgcm5kX2ZyYWMgPSAoKHJuZF9sb2FkICYgKEZJWEVEXzEtMSkpICogMTAwKSA+PiBGU0hJRlQ7CisKKwlyZXR1cm4gKChybmRfbG9hZCA+PiBGU0hJRlQpICogMTAwKSArIHJuZF9mcmFjOworfQorCitNRVRBX0NPTExFQ1RPUihpbnRfbG9hZGF2Z18wKQoreworCWRzdC0+dmFsdWUgPSBmaXhlZF9sb2FkYXZnKGF2ZW5ydW5bMF0pOworfQorCitNRVRBX0NPTExFQ1RPUihpbnRfbG9hZGF2Z18xKQoreworCWRzdC0+dmFsdWUgPSBmaXhlZF9sb2FkYXZnKGF2ZW5ydW5bMV0pOworfQorCitNRVRBX0NPTExFQ1RPUihpbnRfbG9hZGF2Z18yKQoreworCWRzdC0+dmFsdWUgPSBmaXhlZF9sb2FkYXZnKGF2ZW5ydW5bMl0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERldmljZSBuYW1lcyAmIGluZGljZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGlubGluZSBpbnQgaW50X2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbWV0YV9vYmogKmRzdCkKK3sKKwlpZiAodW5saWtlbHkoZGV2ID09IE5VTEwpKQorCQlyZXR1cm4gLTE7CisKKwlkc3QtPnZhbHVlID0gZGV2LT5pZmluZGV4OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCB2YXJfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBtZXRhX29iaiAqZHN0KQoreworCWlmICh1bmxpa2VseShkZXYgPT0gTlVMTCkpCisJCXJldHVybiAtMTsKKworCWRzdC0+dmFsdWUgPSAodW5zaWduZWQgbG9uZykgZGV2LT5uYW1lOworCWRzdC0+bGVuID0gc3RybGVuKGRldi0+bmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK01FVEFfQ09MTEVDVE9SKGludF9kZXYpCit7CisJKmVyciA9IGludF9kZXYoc2tiLT5kZXYsIGRzdCk7Cit9CisKK01FVEFfQ09MTEVDVE9SKHZhcl9kZXYpCit7CisJKmVyciA9IHZhcl9kZXYoc2tiLT5kZXYsIGRzdCk7Cit9CisKK01FVEFfQ09MTEVDVE9SKGludF9pbmRldikKK3sKKwkqZXJyID0gaW50X2Rldihza2ItPmlucHV0X2RldiwgZHN0KTsKK30KKworTUVUQV9DT0xMRUNUT1IodmFyX2luZGV2KQoreworCSplcnIgPSB2YXJfZGV2KHNrYi0+aW5wdXRfZGV2LCBkc3QpOworfQorCitNRVRBX0NPTExFQ1RPUihpbnRfcmVhbGRldikKK3sKKwkqZXJyID0gaW50X2Rldihza2ItPnJlYWxfZGV2LCBkc3QpOworfQorCitNRVRBX0NPTExFQ1RPUih2YXJfcmVhbGRldikKK3sKKwkqZXJyID0gdmFyX2Rldihza2ItPnJlYWxfZGV2LCBkc3QpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHNrYiBhdHRyaWJ1dGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK01FVEFfQ09MTEVDVE9SKGludF9wcmlvcml0eSkKK3sKKwlkc3QtPnZhbHVlID0gc2tiLT5wcmlvcml0eTsKK30KKworTUVUQV9DT0xMRUNUT1IoaW50X3Byb3RvY29sKQoreworCS8qIExldCB1c2Vyc3BhY2UgdGFrZSBjYXJlIG9mIHRoZSBieXRlIG9yZGVyaW5nICovCisJZHN0LT52YWx1ZSA9IHNrYi0+cHJvdG9jb2w7Cit9CisKK01FVEFfQ09MTEVDVE9SKGludF9zZWN1cml0eSkKK3sKKwlkc3QtPnZhbHVlID0gc2tiLT5zZWN1cml0eTsKK30KKworTUVUQV9DT0xMRUNUT1IoaW50X3BrdHR5cGUpCit7CisJZHN0LT52YWx1ZSA9IHNrYi0+cGt0X3R5cGU7Cit9CisKK01FVEFfQ09MTEVDVE9SKGludF9wa3RsZW4pCit7CisJZHN0LT52YWx1ZSA9IHNrYi0+bGVuOworfQorCitNRVRBX0NPTExFQ1RPUihpbnRfZGF0YWxlbikKK3sKKwlkc3QtPnZhbHVlID0gc2tiLT5kYXRhX2xlbjsKK30KKworTUVUQV9DT0xMRUNUT1IoaW50X21hY2xlbikKK3sKKwlkc3QtPnZhbHVlID0gc2tiLT5tYWNfbGVuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5ldGZpbHRlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgQ09ORklHX05FVEZJTFRFUgorTUVUQV9DT0xMRUNUT1IoaW50X25mbWFyaykKK3sKKwlkc3QtPnZhbHVlID0gc2tiLT5uZm1hcms7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUcmFmZmljIENvbnRyb2wKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTUVUQV9DT0xMRUNUT1IoaW50X3RjaW5kZXgpCit7CisJZHN0LT52YWx1ZSA9IHNrYi0+dGNfaW5kZXg7Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKK01FVEFfQ09MTEVDVE9SKGludF90Y3ZlcmQpCit7CisJZHN0LT52YWx1ZSA9IHNrYi0+dGNfdmVyZDsKK30KKworTUVUQV9DT0xMRUNUT1IoaW50X3RjY2xhc3NpZCkKK3sKKwlkc3QtPnZhbHVlID0gc2tiLT50Y19jbGFzc2lkOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgQ09ORklHX05FVF9DTFNfUk9VVEUKK01FVEFfQ09MTEVDVE9SKGludF9ydGNsYXNzaWQpCit7CisJaWYgKHVubGlrZWx5KHNrYi0+ZHN0ID09IE5VTEwpKQorCQkqZXJyID0gLTE7CisJZWxzZQorCQlkc3QtPnZhbHVlID0gc2tiLT5kc3QtPnRjbGFzc2lkOworfQorI2VuZGlmCisKK01FVEFfQ09MTEVDVE9SKGludF9ydGlpZikKK3sKKwlpZiAodW5saWtlbHkoc2tiLT5kc3QgPT0gTlVMTCkpCisJCSplcnIgPSAtMTsKKwllbHNlCisJCWRzdC0+dmFsdWUgPSAoKHN0cnVjdCBydGFibGUqKSBza2ItPmRzdCktPmZsLmlpZjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNZXRhIHZhbHVlIGNvbGxlY3RvcnMgYXNzaWdubWVudCB0YWJsZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgbWV0YV9vcHMKK3sKKwl2b2lkCQkoKmdldCkoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IHRjZl9wa3RfaW5mbyAqLAorCQkJICAgICAgIHN0cnVjdCBtZXRhX3ZhbHVlICosIHN0cnVjdCBtZXRhX29iaiAqLCBpbnQgKik7Cit9OworCisvKiBNZXRhIHZhbHVlIG9wZXJhdGlvbnMgdGFibGUgbGlzdGluZyBhbGwgbWV0YSB2YWx1ZSBjb2xsZWN0b3JzIGFuZAorICogYXNzaWducyB0aGVtIHRvIGEgdHlwZSBhbmQgbWV0YSBpZC4gKi8KK3N0YXRpYyBzdHJ1Y3QgbWV0YV9vcHMgX19tZXRhX29wc1tUQ0ZfTUVUQV9UWVBFX01BWCsxXVtUQ0ZfTUVUQV9JRF9NQVgrMV0gPSB7CisJW1RDRl9NRVRBX1RZUEVfVkFSXSA9IHsKKwkJW1RDRl9NRVRBX0lEX0RFVl0JPSB7IC5nZXQgPSBtZXRhX3Zhcl9kZXYgfSwKKwkJW1RDRl9NRVRBX0lEX0lOREVWXQk9IHsgLmdldCA9IG1ldGFfdmFyX2luZGV2IH0sCisJCVtUQ0ZfTUVUQV9JRF9SRUFMREVWXQk9IHsgLmdldCA9IG1ldGFfdmFyX3JlYWxkZXYgfQorCX0sCisJW1RDRl9NRVRBX1RZUEVfSU5UXSA9IHsKKwkJW1RDRl9NRVRBX0lEX1JBTkRPTV0JPSB7IC5nZXQgPSBtZXRhX2ludF9yYW5kb20gfSwKKwkJW1RDRl9NRVRBX0lEX0xPQURBVkdfMF0JPSB7IC5nZXQgPSBtZXRhX2ludF9sb2FkYXZnXzAgfSwKKwkJW1RDRl9NRVRBX0lEX0xPQURBVkdfMV0JPSB7IC5nZXQgPSBtZXRhX2ludF9sb2FkYXZnXzEgfSwKKwkJW1RDRl9NRVRBX0lEX0xPQURBVkdfMl0JPSB7IC5nZXQgPSBtZXRhX2ludF9sb2FkYXZnXzIgfSwKKwkJW1RDRl9NRVRBX0lEX0RFVl0JPSB7IC5nZXQgPSBtZXRhX2ludF9kZXYgfSwKKwkJW1RDRl9NRVRBX0lEX0lOREVWXQk9IHsgLmdldCA9IG1ldGFfaW50X2luZGV2IH0sCisJCVtUQ0ZfTUVUQV9JRF9SRUFMREVWXQk9IHsgLmdldCA9IG1ldGFfaW50X3JlYWxkZXYgfSwKKwkJW1RDRl9NRVRBX0lEX1BSSU9SSVRZXQk9IHsgLmdldCA9IG1ldGFfaW50X3ByaW9yaXR5IH0sCisJCVtUQ0ZfTUVUQV9JRF9QUk9UT0NPTF0JPSB7IC5nZXQgPSBtZXRhX2ludF9wcm90b2NvbCB9LAorCQlbVENGX01FVEFfSURfU0VDVVJJVFldCT0geyAuZ2V0ID0gbWV0YV9pbnRfc2VjdXJpdHkgfSwKKwkJW1RDRl9NRVRBX0lEX1BLVFRZUEVdCT0geyAuZ2V0ID0gbWV0YV9pbnRfcGt0dHlwZSB9LAorCQlbVENGX01FVEFfSURfUEtUTEVOXQk9IHsgLmdldCA9IG1ldGFfaW50X3BrdGxlbiB9LAorCQlbVENGX01FVEFfSURfREFUQUxFTl0JPSB7IC5nZXQgPSBtZXRhX2ludF9kYXRhbGVuIH0sCisJCVtUQ0ZfTUVUQV9JRF9NQUNMRU5dCT0geyAuZ2V0ID0gbWV0YV9pbnRfbWFjbGVuIH0sCisjaWZkZWYgQ09ORklHX05FVEZJTFRFUgorCQlbVENGX01FVEFfSURfTkZNQVJLXQk9IHsgLmdldCA9IG1ldGFfaW50X25mbWFyayB9LAorI2VuZGlmCisJCVtUQ0ZfTUVUQV9JRF9UQ0lOREVYXQk9IHsgLmdldCA9IG1ldGFfaW50X3RjaW5kZXggfSwKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKKwkJW1RDRl9NRVRBX0lEX1RDVkVSRElDVF0JPSB7IC5nZXQgPSBtZXRhX2ludF90Y3ZlcmQgfSwKKwkJW1RDRl9NRVRBX0lEX1RDQ0xBU1NJRF0JPSB7IC5nZXQgPSBtZXRhX2ludF90Y2NsYXNzaWQgfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ORVRfQ0xTX1JPVVRFCisJCVtUQ0ZfTUVUQV9JRF9SVENMQVNTSURdCT0geyAuZ2V0ID0gbWV0YV9pbnRfcnRjbGFzc2lkIH0sCisjZW5kaWYKKwkJW1RDRl9NRVRBX0lEX1JUSUlGXQk9IHsgLmdldCA9IG1ldGFfaW50X3J0aWlmIH0KKwl9Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtZXRhX29wcyAqIG1ldGFfb3BzKHN0cnVjdCBtZXRhX3ZhbHVlICp2YWwpCit7CisJcmV0dXJuICZfX21ldGFfb3BzW21ldGFfdHlwZSh2YWwpXVttZXRhX2lkKHZhbCldOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFR5cGUgc3BlY2lmaWMgb3BlcmF0aW9ucyBmb3IgVENGX01FVEFfVFlQRV9WQVIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBtZXRhX3Zhcl9jb21wYXJlKHN0cnVjdCBtZXRhX29iaiAqYSwgc3RydWN0IG1ldGFfb2JqICpiKQoreworCWludCByID0gYS0+bGVuIC0gYi0+bGVuOworCisJaWYgKHIgPT0gMCkKKwkJciA9IG1lbWNtcCgodm9pZCAqKSBhLT52YWx1ZSwgKHZvaWQgKikgYi0+dmFsdWUsIGEtPmxlbik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBtZXRhX3Zhcl9jaGFuZ2Uoc3RydWN0IG1ldGFfdmFsdWUgKmRzdCwgc3RydWN0IHJ0YXR0ciAqcnRhKQoreworCWludCBsZW4gPSBSVEFfUEFZTE9BRChydGEpOworCisJZHN0LT52YWwgPSAodW5zaWduZWQgbG9uZykga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmIChkc3QtPnZhbCA9PSAwVUwpCisJCXJldHVybiAtRU5PTUVNOworCW1lbWNweSgodm9pZCAqKSBkc3QtPnZhbCwgUlRBX0RBVEEocnRhKSwgbGVuKTsKKwlkc3QtPmxlbiA9IGxlbjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbWV0YV92YXJfZGVzdHJveShzdHJ1Y3QgbWV0YV92YWx1ZSAqdikKK3sKKwlpZiAodi0+dmFsKQorCQlrZnJlZSgodm9pZCAqKSB2LT52YWwpOworfQorCitzdGF0aWMgdm9pZCBtZXRhX3Zhcl9hcHBseV9leHRyYXMoc3RydWN0IG1ldGFfdmFsdWUgKnYsCisJCQkJICBzdHJ1Y3QgbWV0YV9vYmogKmRzdCkKK3sKKwlpbnQgc2hpZnQgPSB2LT5oZHIuc2hpZnQ7CisKKwlpZiAoc2hpZnQgJiYgc2hpZnQgPCBkc3QtPmxlbikKKwkJZHN0LT5sZW4gLT0gc2hpZnQ7Cit9CisKK3N0YXRpYyBpbnQgbWV0YV92YXJfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbWV0YV92YWx1ZSAqdiwgaW50IHRsdikKK3sKKwlpZiAodi0+dmFsICYmIHYtPmxlbikKKwkJUlRBX1BVVChza2IsIHRsdiwgdi0+bGVuLCAodm9pZCAqKSB2LT52YWwpOworCXJldHVybiAwOworCitydGF0dHJfZmFpbHVyZToKKwlyZXR1cm4gLTE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVHlwZSBzcGVjaWZpYyBvcGVyYXRpb25zIGZvciBUQ0ZfTUVUQV9UWVBFX0lOVAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IG1ldGFfaW50X2NvbXBhcmUoc3RydWN0IG1ldGFfb2JqICphLCBzdHJ1Y3QgbWV0YV9vYmogKmIpCit7CisJLyogTGV0IGdjYyBvcHRpbWl6ZSBpdCwgdGhlIHVubGlrZWx5IGlzIG5vdCByZWFsbHkgYmFzZWQgb24KKwkgKiBzb21lIG51bWJlcnMgYnV0IGp1bXAgZnJlZSBjb2RlIGZvciBtaXNtYXRjaGVzIHNlZW1zCisJICogbW9yZSBsb2dpY2FsLiAqLworCWlmICh1bmxpa2VseShhID09IGIpKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmIChhIDwgYikKKwkJcmV0dXJuIC0xOworCWVsc2UKKwkJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbWV0YV9pbnRfY2hhbmdlKHN0cnVjdCBtZXRhX3ZhbHVlICpkc3QsIHN0cnVjdCBydGF0dHIgKnJ0YSkKK3sKKwlpZiAoUlRBX1BBWUxPQUQocnRhKSA+PSBzaXplb2YodW5zaWduZWQgbG9uZykpIHsKKwkJZHN0LT52YWwgPSAqKHVuc2lnbmVkIGxvbmcgKikgUlRBX0RBVEEocnRhKTsKKwkJZHN0LT5sZW4gPSBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJfSBlbHNlIGlmIChSVEFfUEFZTE9BRChydGEpID09IHNpemVvZih1MzIpKSB7CisJCWRzdC0+dmFsID0gKih1MzIgKikgUlRBX0RBVEEocnRhKTsKKwkJZHN0LT5sZW4gPSBzaXplb2YodTMyKTsKKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbWV0YV9pbnRfYXBwbHlfZXh0cmFzKHN0cnVjdCBtZXRhX3ZhbHVlICp2LAorCQkJCSAgc3RydWN0IG1ldGFfb2JqICpkc3QpCit7CisJaWYgKHYtPmhkci5zaGlmdCkKKwkJZHN0LT52YWx1ZSA+Pj0gdi0+aGRyLnNoaWZ0OworCisJaWYgKHYtPnZhbCkKKwkJZHN0LT52YWx1ZSAmPSB2LT52YWw7Cit9CisKK3N0YXRpYyBpbnQgbWV0YV9pbnRfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbWV0YV92YWx1ZSAqdiwgaW50IHRsdikKK3sKKwlpZiAodi0+bGVuID09IHNpemVvZih1bnNpZ25lZCBsb25nKSkKKwkJUlRBX1BVVChza2IsIHRsdiwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCAmdi0+dmFsKTsKKwllbHNlIGlmICh2LT5sZW4gPT0gc2l6ZW9mKHUzMikpIHsKKwkJdTMyIGQgPSB2LT52YWw7CisJCVJUQV9QVVQoc2tiLCB0bHYsIHNpemVvZihkKSwgJmQpOworCX0KKworCXJldHVybiAwOworCitydGF0dHJfZmFpbHVyZToKKwlyZXR1cm4gLTE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVHlwZSBzcGVjaWZpYyBvcGVyYXRpb25zIHRhYmxlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBtZXRhX3R5cGVfb3BzCit7CisJdm9pZAkoKmRlc3Ryb3kpKHN0cnVjdCBtZXRhX3ZhbHVlICopOworCWludAkoKmNvbXBhcmUpKHN0cnVjdCBtZXRhX29iaiAqLCBzdHJ1Y3QgbWV0YV9vYmogKik7CisJaW50CSgqY2hhbmdlKShzdHJ1Y3QgbWV0YV92YWx1ZSAqLCBzdHJ1Y3QgcnRhdHRyICopOworCXZvaWQJKCphcHBseV9leHRyYXMpKHN0cnVjdCBtZXRhX3ZhbHVlICosIHN0cnVjdCBtZXRhX29iaiAqKTsKKwlpbnQJKCpkdW1wKShzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbWV0YV92YWx1ZSAqLCBpbnQpOworfTsKKworc3RhdGljIHN0cnVjdCBtZXRhX3R5cGVfb3BzIF9fbWV0YV90eXBlX29wc1tUQ0ZfTUVUQV9UWVBFX01BWCsxXSA9IHsKKwlbVENGX01FVEFfVFlQRV9WQVJdID0geworCQkuZGVzdHJveSA9IG1ldGFfdmFyX2Rlc3Ryb3ksCisJCS5jb21wYXJlID0gbWV0YV92YXJfY29tcGFyZSwKKwkJLmNoYW5nZSA9IG1ldGFfdmFyX2NoYW5nZSwKKwkJLmFwcGx5X2V4dHJhcyA9IG1ldGFfdmFyX2FwcGx5X2V4dHJhcywKKwkJLmR1bXAgPSBtZXRhX3Zhcl9kdW1wCisJfSwKKwlbVENGX01FVEFfVFlQRV9JTlRdID0geworCQkuY29tcGFyZSA9IG1ldGFfaW50X2NvbXBhcmUsCisJCS5jaGFuZ2UgPSBtZXRhX2ludF9jaGFuZ2UsCisJCS5hcHBseV9leHRyYXMgPSBtZXRhX2ludF9hcHBseV9leHRyYXMsCisJCS5kdW1wID0gbWV0YV9pbnRfZHVtcAorCX0KK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1ldGFfdHlwZV9vcHMgKiBtZXRhX3R5cGVfb3BzKHN0cnVjdCBtZXRhX3ZhbHVlICp2KQoreworCXJldHVybiAmX19tZXRhX3R5cGVfb3BzW21ldGFfdHlwZSh2KV07Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29yZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW5saW5lIGludCBtZXRhX2dldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNmX3BrdF9pbmZvICppbmZvLCAKKwkJCSAgIHN0cnVjdCBtZXRhX3ZhbHVlICp2LCBzdHJ1Y3QgbWV0YV9vYmogKmRzdCkKK3sKKwlpbnQgZXJyID0gMDsKKworCWlmIChtZXRhX2lkKHYpID09IFRDRl9NRVRBX0lEX1ZBTFVFKSB7CisJCWRzdC0+dmFsdWUgPSB2LT52YWw7CisJCWRzdC0+bGVuID0gdi0+bGVuOworCQlyZXR1cm4gMDsKKwl9CisKKwltZXRhX29wcyh2KS0+Z2V0KHNrYiwgaW5mbywgdiwgZHN0LCAmZXJyKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmIChtZXRhX3R5cGVfb3BzKHYpLT5hcHBseV9leHRyYXMpCisJICAgIG1ldGFfdHlwZV9vcHModiktPmFwcGx5X2V4dHJhcyh2LCBkc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW1fbWV0YV9tYXRjaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNmX2VtYXRjaCAqbSwKKwkJCSBzdHJ1Y3QgdGNmX3BrdF9pbmZvICppbmZvKQoreworCWludCByOworCXN0cnVjdCBtZXRhX21hdGNoICptZXRhID0gKHN0cnVjdCBtZXRhX21hdGNoICopIG0tPmRhdGE7CisJc3RydWN0IG1ldGFfb2JqIGxfdmFsdWUsIHJfdmFsdWU7CisKKwlpZiAobWV0YV9nZXQoc2tiLCBpbmZvLCAmbWV0YS0+bHZhbHVlLCAmbF92YWx1ZSkgPCAwIHx8CisJICAgIG1ldGFfZ2V0KHNrYiwgaW5mbywgJm1ldGEtPnJ2YWx1ZSwgJnJfdmFsdWUpIDwgMCkKKwkJcmV0dXJuIDA7CisKKwlyID0gbWV0YV90eXBlX29wcygmbWV0YS0+bHZhbHVlKS0+Y29tcGFyZSgmbF92YWx1ZSwgJnJfdmFsdWUpOworCisJc3dpdGNoIChtZXRhLT5sdmFsdWUuaGRyLm9wKSB7CisJCWNhc2UgVENGX0VNX09QTkRfRVE6CisJCQlyZXR1cm4gIXI7CisJCWNhc2UgVENGX0VNX09QTkRfTFQ6CisJCQlyZXR1cm4gciA8IDA7CisJCWNhc2UgVENGX0VNX09QTkRfR1Q6CisJCQlyZXR1cm4gciA+IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZXRhX2RlbGV0ZShzdHJ1Y3QgbWV0YV9tYXRjaCAqbWV0YSkKK3sKKwlzdHJ1Y3QgbWV0YV90eXBlX29wcyAqb3BzID0gbWV0YV90eXBlX29wcygmbWV0YS0+bHZhbHVlKTsKKworCWlmIChvcHMgJiYgb3BzLT5kZXN0cm95KSB7CisJCW9wcy0+ZGVzdHJveSgmbWV0YS0+bHZhbHVlKTsKKwkJb3BzLT5kZXN0cm95KCZtZXRhLT5ydmFsdWUpOworCX0KKworCWtmcmVlKG1ldGEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBtZXRhX2NoYW5nZV9kYXRhKHN0cnVjdCBtZXRhX3ZhbHVlICpkc3QsIHN0cnVjdCBydGF0dHIgKnJ0YSkKK3sKKwlpZiAocnRhKSB7CisJCWlmIChSVEFfUEFZTE9BRChydGEpID09IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyZXR1cm4gbWV0YV90eXBlX29wcyhkc3QpLT5jaGFuZ2UoZHN0LCBydGEpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBtZXRhX2lzX3N1cHBvcnRlZChzdHJ1Y3QgbWV0YV92YWx1ZSAqdmFsKQoreworCXJldHVybiAoIW1ldGFfaWQodmFsKSB8fCBtZXRhX29wcyh2YWwpLT5nZXQpOworfQorCitzdGF0aWMgaW50IGVtX21ldGFfY2hhbmdlKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB2b2lkICpkYXRhLCBpbnQgbGVuLAorCQkJICBzdHJ1Y3QgdGNmX2VtYXRjaCAqbSkKK3sKKwlpbnQgZXJyID0gLUVJTlZBTDsKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfRU1fTUVUQV9NQVhdOworCXN0cnVjdCB0Y2ZfbWV0YV9oZHIgKmhkcjsKKwlzdHJ1Y3QgbWV0YV9tYXRjaCAqbWV0YSA9IE5VTEw7CisJCisJaWYgKHJ0YXR0cl9wYXJzZSh0YiwgVENBX0VNX01FVEFfTUFYLCBkYXRhLCBsZW4pIDwgMCkKKwkJZ290byBlcnJvdXQ7CisKKwlpZiAodGJbVENBX0VNX01FVEFfSERSLTFdID09IE5VTEwgfHwKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX0VNX01FVEFfSERSLTFdKSA8IHNpemVvZigqaGRyKSkKKwkJZ290byBlcnJvdXQ7CisJaGRyID0gUlRBX0RBVEEodGJbVENBX0VNX01FVEFfSERSLTFdKTsKKworCWlmIChUQ0ZfTUVUQV9UWVBFKGhkci0+bGVmdC5raW5kKSAhPSBUQ0ZfTUVUQV9UWVBFKGhkci0+cmlnaHQua2luZCkgfHwKKwkgICAgVENGX01FVEFfVFlQRShoZHItPmxlZnQua2luZCkgPiBUQ0ZfTUVUQV9UWVBFX01BWCB8fAorCSAgICBUQ0ZfTUVUQV9JRChoZHItPmxlZnQua2luZCkgPiBUQ0ZfTUVUQV9JRF9NQVggfHwKKwkgICAgVENGX01FVEFfSUQoaGRyLT5yaWdodC5raW5kKSA+IFRDRl9NRVRBX0lEX01BWCkKKwkJZ290byBlcnJvdXQ7CisKKwltZXRhID0ga21hbGxvYyhzaXplb2YoKm1ldGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAobWV0YSA9PSBOVUxMKQorCQlnb3RvIGVycm91dDsKKwltZW1zZXQobWV0YSwgMCwgc2l6ZW9mKCptZXRhKSk7CisKKwltZW1jcHkoJm1ldGEtPmx2YWx1ZS5oZHIsICZoZHItPmxlZnQsIHNpemVvZihoZHItPmxlZnQpKTsKKwltZW1jcHkoJm1ldGEtPnJ2YWx1ZS5oZHIsICZoZHItPnJpZ2h0LCBzaXplb2YoaGRyLT5yaWdodCkpOworCisJaWYgKCFtZXRhX2lzX3N1cHBvcnRlZCgmbWV0YS0+bHZhbHVlKSB8fAorCSAgICAhbWV0YV9pc19zdXBwb3J0ZWQoJm1ldGEtPnJ2YWx1ZSkpIHsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gZXJyb3V0OworCX0KKworCWlmIChtZXRhX2NoYW5nZV9kYXRhKCZtZXRhLT5sdmFsdWUsIHRiW1RDQV9FTV9NRVRBX0xWQUxVRS0xXSkgPCAwIHx8CisJICAgIG1ldGFfY2hhbmdlX2RhdGEoJm1ldGEtPnJ2YWx1ZSwgdGJbVENBX0VNX01FVEFfUlZBTFVFLTFdKSA8IDApCisJCWdvdG8gZXJyb3V0OworCisJbS0+ZGF0YWxlbiA9IHNpemVvZigqbWV0YSk7CisJbS0+ZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtZXRhOworCisJZXJyID0gMDsKK2Vycm91dDoKKwlpZiAoZXJyICYmIG1ldGEpCisJCW1ldGFfZGVsZXRlKG1ldGEpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGVtX21ldGFfZGVzdHJveShzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgc3RydWN0IHRjZl9lbWF0Y2ggKm0pCit7CisJaWYgKG0pCisJCW1ldGFfZGVsZXRlKChzdHJ1Y3QgbWV0YV9tYXRjaCAqKSBtLT5kYXRhKTsKK30KKworc3RhdGljIGludCBlbV9tZXRhX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjZl9lbWF0Y2ggKmVtKQoreworCXN0cnVjdCBtZXRhX21hdGNoICptZXRhID0gKHN0cnVjdCBtZXRhX21hdGNoICopIGVtLT5kYXRhOworCXN0cnVjdCB0Y2ZfbWV0YV9oZHIgaGRyOworCXN0cnVjdCBtZXRhX3R5cGVfb3BzICpvcHM7CisKKwltZW1zZXQoJmhkciwgMCwgc2l6ZW9mKGhkcikpOworCW1lbWNweSgmaGRyLmxlZnQsICZtZXRhLT5sdmFsdWUuaGRyLCBzaXplb2YoaGRyLmxlZnQpKTsKKwltZW1jcHkoJmhkci5yaWdodCwgJm1ldGEtPnJ2YWx1ZS5oZHIsIHNpemVvZihoZHIucmlnaHQpKTsKKworCVJUQV9QVVQoc2tiLCBUQ0FfRU1fTUVUQV9IRFIsIHNpemVvZihoZHIpLCAmaGRyKTsKKworCW9wcyA9IG1ldGFfdHlwZV9vcHMoJm1ldGEtPmx2YWx1ZSk7CisJaWYgKG9wcy0+ZHVtcChza2IsICZtZXRhLT5sdmFsdWUsIFRDQV9FTV9NRVRBX0xWQUxVRSkgPCAwIHx8CisJICAgIG9wcy0+ZHVtcChza2IsICZtZXRhLT5ydmFsdWUsIFRDQV9FTV9NRVRBX1JWQUxVRSkgPCAwKQorCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOworCisJcmV0dXJuIDA7CisKK3J0YXR0cl9mYWlsdXJlOgorCXJldHVybiAtMTsKK30JCQorCitzdGF0aWMgc3RydWN0IHRjZl9lbWF0Y2hfb3BzIGVtX21ldGFfb3BzID0geworCS5raW5kCSAgPSBUQ0ZfRU1fTUVUQSwKKwkuY2hhbmdlCSAgPSBlbV9tZXRhX2NoYW5nZSwKKwkubWF0Y2gJICA9IGVtX21ldGFfbWF0Y2gsCisJLmRlc3Ryb3kgID0gZW1fbWV0YV9kZXN0cm95LAorCS5kdW1wCSAgPSBlbV9tZXRhX2R1bXAsCisJLm93bmVyCSAgPSBUSElTX01PRFVMRSwKKwkubGluawkgID0gTElTVF9IRUFEX0lOSVQoZW1fbWV0YV9vcHMubGluaykKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZW1fbWV0YSh2b2lkKQoreworCXJldHVybiB0Y2ZfZW1fcmVnaXN0ZXIoJmVtX21ldGFfb3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfZW1fbWV0YSh2b2lkKSAKK3sKKwl0Y2ZfZW1fdW5yZWdpc3RlcigmZW1fbWV0YV9vcHMpOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGluaXRfZW1fbWV0YSk7Cittb2R1bGVfZXhpdChleGl0X2VtX21ldGEpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2VtX25ieXRlLmMgYi9uZXQvc2NoZWQvZW1fbmJ5dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWVhOTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjaGVkL2VtX25ieXRlLmMKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIG5ldC9zY2hlZC9lbV9uYnl0ZS5jCU4tQnl0ZSBlbWF0Y2gKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglUaG9tYXMgR3JhZiA8dGdyYWZAc3V1Zy5jaD4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3RjX2VtYXRjaC90Y19lbV9uYnl0ZS5oPgorI2luY2x1ZGUgPG5ldC9wa3RfY2xzLmg+CisKK3N0cnVjdCBuYnl0ZV9kYXRhCit7CisJc3RydWN0IHRjZl9lbV9uYnl0ZQloZHI7CisJY2hhcgkJCXBhdHRlcm5bMF07Cit9OworCQorc3RhdGljIGludCBlbV9uYnl0ZV9jaGFuZ2Uoc3RydWN0IHRjZl9wcm90byAqdHAsIHZvaWQgKmRhdGEsIGludCBkYXRhX2xlbiwKKwkJCSAgIHN0cnVjdCB0Y2ZfZW1hdGNoICplbSkKK3sKKwlzdHJ1Y3QgdGNmX2VtX25ieXRlICpuYnl0ZSA9IGRhdGE7CisKKwlpZiAoZGF0YV9sZW4gPCBzaXplb2YoKm5ieXRlKSB8fAorCSAgICBkYXRhX2xlbiA8IChzaXplb2YoKm5ieXRlKSArIG5ieXRlLT5sZW4pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVtLT5kYXRhbGVuID0gc2l6ZW9mKCpuYnl0ZSkgKyBuYnl0ZS0+bGVuOworCWVtLT5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGttYWxsb2MoZW0tPmRhdGFsZW4sIEdGUF9LRVJORUwpOworCWlmIChlbS0+ZGF0YSA9PSAwVUwpCisJCXJldHVybiAtRU5PQlVGUzsKKworCW1lbWNweSgodm9pZCAqKSBlbS0+ZGF0YSwgZGF0YSwgZW0tPmRhdGFsZW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW1fbmJ5dGVfbWF0Y2goc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjZl9lbWF0Y2ggKmVtLAorCQkJICBzdHJ1Y3QgdGNmX3BrdF9pbmZvICppbmZvKQoreworCXN0cnVjdCBuYnl0ZV9kYXRhICpuYnl0ZSA9IChzdHJ1Y3QgbmJ5dGVfZGF0YSAqKSBlbS0+ZGF0YTsKKwl1bnNpZ25lZCBjaGFyICpwdHIgPSB0Y2ZfZ2V0X2Jhc2VfcHRyKHNrYiwgbmJ5dGUtPmhkci5sYXllcik7CisKKwlwdHIgKz0gbmJ5dGUtPmhkci5vZmY7CisKKwlpZiAoIXRjZl92YWxpZF9vZmZzZXQoc2tiLCBwdHIsIG5ieXRlLT5oZHIubGVuKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gIW1lbWNtcChwdHIgKyBuYnl0ZS0+aGRyLm9mZiwgbmJ5dGUtPnBhdHRlcm4sIG5ieXRlLT5oZHIubGVuKTsKK30KKworc3RhdGljIHN0cnVjdCB0Y2ZfZW1hdGNoX29wcyBlbV9uYnl0ZV9vcHMgPSB7CisJLmtpbmQJICA9IFRDRl9FTV9OQllURSwKKwkuY2hhbmdlCSAgPSBlbV9uYnl0ZV9jaGFuZ2UsCisJLm1hdGNoCSAgPSBlbV9uYnl0ZV9tYXRjaCwKKwkub3duZXIJICA9IFRISVNfTU9EVUxFLAorCS5saW5rCSAgPSBMSVNUX0hFQURfSU5JVChlbV9uYnl0ZV9vcHMubGluaykKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZW1fbmJ5dGUodm9pZCkKK3sKKwlyZXR1cm4gdGNmX2VtX3JlZ2lzdGVyKCZlbV9uYnl0ZV9vcHMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9lbV9uYnl0ZSh2b2lkKSAKK3sKKwl0Y2ZfZW1fdW5yZWdpc3RlcigmZW1fbmJ5dGVfb3BzKTsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChpbml0X2VtX25ieXRlKTsKK21vZHVsZV9leGl0KGV4aXRfZW1fbmJ5dGUpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2VtX3UzMi5jIGIvbmV0L3NjaGVkL2VtX3UzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZTdlNTEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2NoZWQvZW1fdTMyLmMKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIG5ldC9zY2hlZC9lbV91MzIuYwlVMzIgRW1hdGNoCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKgkJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqIEJhc2VkIG9uIG5ldC9zY2hlZC9jbHNfdTMyLmMKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvcGt0X2Nscy5oPgorCitzdGF0aWMgaW50IGVtX3UzMl9tYXRjaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNmX2VtYXRjaCAqZW0sCisJCQlzdHJ1Y3QgdGNmX3BrdF9pbmZvICppbmZvKQoreworCXN0cnVjdCB0Y191MzJfa2V5ICprZXkgPSAoc3RydWN0IHRjX3UzMl9rZXkgKikgZW0tPmRhdGE7CisJdW5zaWduZWQgY2hhciAqcHRyID0gc2tiLT5uaC5yYXc7CisJCisJaWYgKGluZm8pIHsKKwkJaWYgKGluZm8tPnB0cikKKwkJCXB0ciA9IGluZm8tPnB0cjsKKwkJcHRyICs9IChpbmZvLT5uZXh0aGRyICYga2V5LT5vZmZtYXNrKTsKKwl9CisKKwlwdHIgKz0ga2V5LT5vZmY7CisKKwlpZiAoIXRjZl92YWxpZF9vZmZzZXQoc2tiLCBwdHIsIHNpemVvZih1MzIpKSkKKwkJcmV0dXJuIDA7CisJCisJcmV0dXJuICEoKCgqKHUzMiopIHB0cikgIF4ga2V5LT52YWwpICYga2V5LT5tYXNrKTsKK30KKworc3RhdGljIHN0cnVjdCB0Y2ZfZW1hdGNoX29wcyBlbV91MzJfb3BzID0geworCS5raW5kCSAgPSBUQ0ZfRU1fVTMyLAorCS5kYXRhbGVuICA9IHNpemVvZihzdHJ1Y3QgdGNfdTMyX2tleSksCisJLm1hdGNoCSAgPSBlbV91MzJfbWF0Y2gsCisJLm93bmVyCSAgPSBUSElTX01PRFVMRSwKKwkubGluawkgID0gTElTVF9IRUFEX0lOSVQoZW1fdTMyX29wcy5saW5rKQorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9lbV91MzIodm9pZCkKK3sKKwlyZXR1cm4gdGNmX2VtX3JlZ2lzdGVyKCZlbV91MzJfb3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfZW1fdTMyKHZvaWQpIAoreworCXRjZl9lbV91bnJlZ2lzdGVyKCZlbV91MzJfb3BzKTsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChpbml0X2VtX3UzMik7Cittb2R1bGVfZXhpdChleGl0X2VtX3UzMik7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvZW1hdGNoLmMgYi9uZXQvc2NoZWQvZW1hdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJmZTJlNwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY2hlZC9lbWF0Y2guYwpAQCAtMCwwICsxLDUyNCBAQAorLyoKKyAqIG5ldC9zY2hlZC9lbWF0Y2guYwkJRXh0ZW5kZWQgTWF0Y2ggQVBJCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBBbiBleHRlbmRlZCBtYXRjaCAoZW1hdGNoKSBpcyBhIHNtYWxsIGNsYXNzaWZpY2F0aW9uIHRvb2wgbm90IHdvcnRoCisgKiB3cml0aW5nIGEgZnVsbCBjbGFzc2lmaWVyIGZvci4gRW1hdGNoZXMgY2FuIGJlIGludGVyY29ubmVjdGVkIHRvIGZvcm0KKyAqIGEgbG9naWMgZXhwcmVzc2lvbiBhbmQgZ2V0IGF0dGFjaGVkIHRvIGNsYXNzaWZpZXJzIHRvIGV4dGVuZCB0aGVpcgorICogZnVuY3Rpb25hdGxpdHkuCisgKgorICogVGhlIHVzZXJzcGFjZSBwYXJ0IHRyYW5zZm9ybXMgdGhlIGxvZ2ljIGV4cHJlc3Npb25zIGludG8gYW4gYXJyYXkKKyAqIGNvbnNpc3Rpbmcgb2YgbXVsdGlwbGUgc2VxdWVuY2VzIG9mIGludGVyY29ubmVjdGVkIGVtYXRjaGVzIHNlcGFyYXRlZAorICogYnkgbWFya2Vycy4gUHJlY2VkZW5jZSBpcyBpbXBsZW1lbnRlZCBieSBhIHNwZWNpYWwgZW1hdGNoIGtpbmQKKyAqIHJlZmVyZW5jaW5nIGEgc2VxdWVuY2UgYmV5b25kIHRoZSBtYXJrZXIgb2YgdGhlIGN1cnJlbnQgc2VxdWVuY2UKKyAqIGNhdXNpbmcgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHNlcXVlbmNlIHRvIGJlIHB1c2hlZCBvbnRvIGEgc3RhY2sKKyAqIHRvIGFsbG93IHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBwb3NpdGlvbiByZWZlcmVuY2VkCisgKiBpbiB0aGUgc3BlY2lhbCBlbWF0Y2guIE1hdGNoaW5nIGNvbnRpbnVlcyBpbiB0aGUgbmV3IHNlcXVlbmNlIHVudGlsIGEKKyAqIG1hcmtlciBpcyByZWFjaGVkIGNhdXNpbmcgdGhlIHBvc2l0aW9uIHRvIGJlIHJlc3RvcmVkIGZyb20gdGhlIHN0YWNrLgorICoKKyAqIEV4YW1wbGU6CisgKiAgICAgICAgICBBIEFORCAoQjEgT1IgQjIpIEFORCBDIEFORCBECisgKgorICogICAgICAgICAgICAgIC0tLS0tLS0+LVBVU0gtLS0tLS0tCisgKiAgICAtLT4tLSAgICAvICAgICAgICAgLS0+LS0gICAgICBcICAgLS0+LS0KKyAqICAgLyAgICAgXCAgLyAgICAgICAgIC8gICAgIFwgICAgICBcIC8gICAgIFwKKyAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0rCisgKiB8IEEgQU5EIHwgQiBBTkQgfCBDIEFORCB8IEQgRU5EIHwgQjEgT1IgfCBCMiBFTkQgfAorICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLSsKKyAqICAgICAgICAgICAgICAgICAgICBcICAgICAgICAgICAgICAgICAgICAgIC8KKyAqICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS08LVBPUC0tLS0tLS0tLQorICoKKyAqIHdoZXJlIEIgaXMgYSB2aXJ0dWFsIGVtYXRjaCByZWZlcmVuY2luZyB0byBzZXF1ZW5jZSBzdGFydGluZyB3aXRoIEIxLgorICogCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIEhvdyB0byB3cml0ZSBhbiBlbWF0Y2ggaW4gNjAgc2Vjb25kcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAKKyAqICAgMSkgUHJvdmlkZSBhIG1hdGNoZXIgZnVuY3Rpb246CisgKiAgICAgIHN0YXRpYyBpbnQgbXlfbWF0Y2goc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjZl9lbWF0Y2ggKm0sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRjZl9wa3RfaW5mbyAqaW5mbykKKyAqICAgICAgeworICogICAgICAJc3RydWN0IG15ZGF0YSAqZCA9IChzdHJ1Y3QgbXlkYXRhICopIG0tPmRhdGE7CisgKgorICogICAgICAJaWYgKC4uLm1hdGNoaW5nIGdvZXMgaGVyZS4uLikKKyAqICAgICAgCQlyZXR1cm4gMTsKKyAqICAgICAgCWVsc2UKKyAqICAgICAgCQlyZXR1cm4gMDsKKyAqICAgICAgfQorICoKKyAqICAgMikgRmlsbCBvdXQgYSBzdHJ1Y3QgdGNmX2VtYXRjaF9vcHM6CisgKiAgICAgIHN0YXRpYyBzdHJ1Y3QgdGNmX2VtYXRjaF9vcHMgbXlfb3BzID0geworICogICAgICAJLmtpbmQgPSB1bmlxdWUgaWQsCisgKiAgICAgIAkuZGF0YWxlbiA9IHNpemVvZihzdHJ1Y3QgbXlkYXRhKSwKKyAqICAgICAgCS5tYXRjaCA9IG15X21hdGNoLAorICogICAgICAJLm93bmVyID0gVEhJU19NT0RVTEUsCisgKiAgICAgIH07CisgKgorICogICAzKSBSZWdpc3Rlci9VbnJlZ2lzdGVyIHlvdXIgZW1hdGNoOgorICogICAgICBzdGF0aWMgaW50IF9faW5pdCBpbml0X215X2VtYXRjaCh2b2lkKQorICogICAgICB7CisgKiAgICAgIAlyZXR1cm4gdGNmX2VtX3JlZ2lzdGVyKCZteV9vcHMpOworICogICAgICB9CisgKgorICogICAgICBzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9teV9lbWF0Y2godm9pZCkKKyAqICAgICAgeworICogICAgICAJcmV0dXJuIHRjZl9lbV91bnJlZ2lzdGVyKCZteV9vcHMpOworICogICAgICB9CisgKgorICogICAgICBtb2R1bGVfaW5pdChpbml0X215X2VtYXRjaCk7CisgKiAgICAgIG1vZHVsZV9leGl0KGV4aXRfbXlfZW1hdGNoKTsKKyAqCisgKiAgIDQpIEJ5IG5vdyB5b3Ugc2hvdWxkIGhhdmUgdHdvIG1vcmUgc2Vjb25kcyBsZWZ0LCBiYXJlbHkgZW5vdWdoIHRvCisgKiAgICAgIG9wZW4gdXAgYSBiZWVyIHRvIHdhdGNoIHRoZSBjb21waWxhdGlvbiBnb2luZy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvcGt0X2Nscy5oPgorI2luY2x1ZGUgPGNvbmZpZy9uZXQvZW1hdGNoL3N0YWNrLmg+CisKK3N0YXRpYyBMSVNUX0hFQUQoZW1hdGNoX29wcyk7CitzdGF0aWMgREVGSU5FX1JXTE9DSyhlbWF0Y2hfbW9kX2xvY2spOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0Y2ZfZW1hdGNoX29wcyAqIHRjZl9lbV9sb29rdXAodTE2IGtpbmQpCit7CisJc3RydWN0IHRjZl9lbWF0Y2hfb3BzICplID0gTlVMTDsKKworCXJlYWRfbG9jaygmZW1hdGNoX21vZF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGUsICZlbWF0Y2hfb3BzLCBsaW5rKSB7CisJCWlmIChraW5kID09IGUtPmtpbmQpIHsKKwkJCWlmICghdHJ5X21vZHVsZV9nZXQoZS0+b3duZXIpKQorCQkJCWUgPSBOVUxMOworCQkJcmVhZF91bmxvY2soJmVtYXRjaF9tb2RfbG9jayk7CisJCQlyZXR1cm4gZTsKKwkJfQorCX0KKwlyZWFkX3VubG9jaygmZW1hdGNoX21vZF9sb2NrKTsKKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIHRjZl9lbV9yZWdpc3RlciAtIHJlZ2lzdGVyIGFuIGV4dGVuZGVkIG1hdGNoCisgKiAKKyAqIEBvcHM6IGVtYXRjaCBvcGVyYXRpb25zIGxvb2t1cCB0YWJsZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYnkgZW1hdGNoZXMgdG8gYW5ub3VuY2UgdGhlaXIgcHJlc2VuY2UuCisgKiBUaGUgZ2l2ZW4gQG9wcyBtdXN0IGhhdmUga2luZCBzZXQgdG8gYSB1bmlxdWUgaWRlbnRpZmllciBhbmQgdGhlCisgKiBjYWxsYmFjayBtYXRjaCgpIG11c3QgYmUgaW1wbGVtZW50ZWQuIEFsbCBvdGhlciBjYWxsYmFja3MgYXJlIG9wdGlvbmFsCisgKiBhbmQgYSBmYWxsYmFjayBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIGluc3RlYWQuCisgKgorICogUmV0dXJucyAtRUVYSVNUUyBpZiBhbiBlbWF0Y2ggb2YgdGhlIHNhbWUga2luZCBoYXMgYWxyZWFkeSByZWdpc3RlcmVkLgorICovCitpbnQgdGNmX2VtX3JlZ2lzdGVyKHN0cnVjdCB0Y2ZfZW1hdGNoX29wcyAqb3BzKQoreworCWludCBlcnIgPSAtRUVYSVNUOworCXN0cnVjdCB0Y2ZfZW1hdGNoX29wcyAqZTsKKworCWlmIChvcHMtPm1hdGNoID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJd3JpdGVfbG9jaygmZW1hdGNoX21vZF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGUsICZlbWF0Y2hfb3BzLCBsaW5rKQorCQlpZiAob3BzLT5raW5kID09IGUtPmtpbmQpCisJCQlnb3RvIGVycm91dDsKKworCWxpc3RfYWRkX3RhaWwoJm9wcy0+bGluaywgJmVtYXRjaF9vcHMpOworCWVyciA9IDA7CitlcnJvdXQ6CisJd3JpdGVfdW5sb2NrKCZlbWF0Y2hfbW9kX2xvY2spOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogdGNmX2VtX3VucmVnaXN0ZXIgLSB1bnJlZ3N0ZXIgYW5kIGV4dGVuZGVkIG1hdGNoCisgKgorICogQG9wczogZW1hdGNoIG9wZXJhdGlvbnMgbG9va3VwIHRhYmxlCisgKgorICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBieSBlbWF0Y2hlcyB0byBhbm5vdW5jZSB0aGVpciBkaXNhcHBlYXJhbmNlCisgKiBmb3IgZXhhbXBsZXMgd2hlbiB0aGUgbW9kdWxlIGdldHMgdW5sb2FkZWQuIFRoZSBAb3BzIHBhcmFtZXRlciBtdXN0IGJlCisgKiB0aGUgc2FtZSBhcyB0aGUgb25lIHVzZWQgZm9yIHJlZ2lzdHJhdGlvbi4KKyAqCisgKiBSZXR1cm5zIC1FTk9FTlQgaWYgbm8gbWF0Y2hpbmcgZW1hdGNoIHdhcyBmb3VuZC4KKyAqLworaW50IHRjZl9lbV91bnJlZ2lzdGVyKHN0cnVjdCB0Y2ZfZW1hdGNoX29wcyAqb3BzKQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCB0Y2ZfZW1hdGNoX29wcyAqZTsKKworCXdyaXRlX2xvY2soJmVtYXRjaF9tb2RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlLCAmZW1hdGNoX29wcywgbGluaykgeworCQlpZiAoZSA9PSBvcHMpIHsKKwkJCWxpc3RfZGVsKCZlLT5saW5rKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJZXJyID0gLUVOT0VOVDsKK291dDoKKwl3cml0ZV91bmxvY2soJmVtYXRjaF9tb2RfbG9jayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdGNmX2VtYXRjaCAqIHRjZl9lbV9nZXRfbWF0Y2goc3RydWN0IHRjZl9lbWF0Y2hfdHJlZSAqdHJlZSwKKwkJCQkJCSAgIGludCBpbmRleCkKK3sKKwlyZXR1cm4gJnRyZWUtPm1hdGNoZXNbaW5kZXhdOworfQorCisKK3N0YXRpYyBpbnQgdGNmX2VtX3ZhbGlkYXRlKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLAorCQkJICAgc3RydWN0IHRjZl9lbWF0Y2hfdHJlZV9oZHIgKnRyZWVfaGRyLAorCQkJICAgc3RydWN0IHRjZl9lbWF0Y2ggKmVtLCBzdHJ1Y3QgcnRhdHRyICpydGEsIGludCBpZHgpCit7CisJaW50IGVyciA9IC1FSU5WQUw7CisJc3RydWN0IHRjZl9lbWF0Y2hfaGRyICplbV9oZHIgPSBSVEFfREFUQShydGEpOworCWludCBkYXRhX2xlbiA9IFJUQV9QQVlMT0FEKHJ0YSkgLSBzaXplb2YoKmVtX2hkcik7CisJdm9pZCAqZGF0YSA9ICh2b2lkICopIGVtX2hkciArIHNpemVvZigqZW1faGRyKTsKKworCWlmICghVENGX0VNX1JFTF9WQUxJRChlbV9oZHItPmZsYWdzKSkKKwkJZ290byBlcnJvdXQ7CisKKwlpZiAoZW1faGRyLT5raW5kID09IFRDRl9FTV9DT05UQUlORVIpIHsKKwkJLyogU3BlY2lhbCBlbWF0Y2ggY2FsbGVkICJjb250YWluZXIiLCBjYXJyaWVzIGFuIGluZGV4CisJCSAqIHJlZmVyZW5jaW5nIGFuIGV4dGVybmFsIGVtYXRjaCBzZXF1ZW5jZS4gKi8KKwkJdTMyIHJlZjsKKworCQlpZiAoZGF0YV9sZW4gPCBzaXplb2YocmVmKSkKKwkJCWdvdG8gZXJyb3V0OworCQlyZWYgPSAqKHUzMiAqKSBkYXRhOworCisJCWlmIChyZWYgPj0gdHJlZV9oZHItPm5tYXRjaGVzKQorCQkJZ290byBlcnJvdXQ7CisKKwkJLyogV2UgZG8gbm90IGFsbG93IGJhY2t3YXJkIGp1bXBzIHRvIGF2b2lkIGxvb3BzIGFuZCBqdW1wcworCQkgKiB0byBvdXIgb3duIHBvc2l0aW9uIGFyZSBvZiBjb3Vyc2UgaWxsZWdhbC4gKi8KKwkJaWYgKHJlZiA8PSBpZHgpCisJCQlnb3RvIGVycm91dDsKKworCQkKKwkJZW0tPmRhdGEgPSByZWY7CisJfSBlbHNlIHsKKwkJLyogTm90ZTogVGhpcyBsb29rdXAgd2lsbCBpbmNyZWFzZSB0aGUgbW9kdWxlIHJlZmNudAorCQkgKiBvZiB0aGUgZW1hdGNoIG1vZHVsZSByZWZlcmVuY2VkLiBJbiBjYXNlIG9mIGEgZmFpbHVyZSwKKwkJICogYSBkZXN0cm95IGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgdW5kZXJseWluZyBsYXllcgorCQkgKiB3aGljaCBhdXRvbWF0aWNhbGx5IHJlbGVhc2VzIHRoZSByZWZlcmVuY2UgYWdhaW4sIHRoZXJlZm9yZQorCQkgKiB0aGUgbW9kdWxlIE1VU1Qgbm90IGJlIGdpdmVuIGJhY2sgdW5kZXIgYW55IGNpcmN1bXN0YW5jZXMKKwkJICogaGVyZS4gQmUgYXdhcmUsIHRoZSBkZXN0cm95IGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUKKwkJICogbW9kdWxlIGlzIGhlbGQgaWYgdGhlIG9wcyBmaWVsZCBpcyBub24gemVyby4gKi8KKwkJZW0tPm9wcyA9IHRjZl9lbV9sb29rdXAoZW1faGRyLT5raW5kKTsKKworCQlpZiAoZW0tPm9wcyA9PSBOVUxMKSB7CisJCQllcnIgPSAtRU5PRU5UOworCQkJZ290byBlcnJvdXQ7CisJCX0KKworCQkvKiBlbWF0Y2ggbW9kdWxlIHByb3ZpZGVzIGV4cGVjdGVkIGxlbmd0aCBvZiBkYXRhLCBzbyB3ZQorCQkgKiBjYW4gZG8gYSBiYXNpYyBzYW5pdHkgY2hlY2suICovCisJCWlmIChlbS0+b3BzLT5kYXRhbGVuICYmIGRhdGFfbGVuIDwgZW0tPm9wcy0+ZGF0YWxlbikKKwkJCWdvdG8gZXJyb3V0OworCisJCWlmIChlbS0+b3BzLT5jaGFuZ2UpIHsKKwkJCWVyciA9IGVtLT5vcHMtPmNoYW5nZSh0cCwgZGF0YSwgZGF0YV9sZW4sIGVtKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCWdvdG8gZXJyb3V0OworCQl9IGVsc2UgaWYgKGRhdGFfbGVuID4gMCkgeworCQkJLyogZW1hdGNoIG1vZHVsZSBkb2Vzbid0IHByb3ZpZGUgYW4gb3duIGNoYW5nZQorCQkJICogcHJvY2VkdXJlIGFuZCBleHBlY3RzIHVzIHRvIGFsbG9jYXRlIGFuZCBjb3B5CisJCQkgKiB0aGUgZW1hdGNoIGRhdGEuCisJCQkgKgorCQkJICogVENGX0VNX1NJTVBMRSBtYXkgYmUgc3BlY2lmaWVkIHN0YXRpbmcgdGhhdCB0aGUKKwkJCSAqIGRhdGEgb25seSBjb25zaXN0cyBvZiBhIHUzMiBpbnRlZ2VyIGFuZCB0aGUgbW9kdWxlCisJCQkgKiBkb2VzIG5vdCBleHBlY3RlZCBhIG1lbW9yeSByZWZlcmVuY2UgYnV0IHJhdGhlcgorCQkJICogdGhlIHZhbHVlIGNhcnJpZWQuICovCisJCQlpZiAoZW1faGRyLT5mbGFncyAmIFRDRl9FTV9TSU1QTEUpIHsKKwkJCQlpZiAoZGF0YV9sZW4gPCBzaXplb2YodTMyKSkKKwkJCQkJZ290byBlcnJvdXQ7CisJCQkJZW0tPmRhdGEgPSAqKHUzMiAqKSBkYXRhOworCQkJfSBlbHNlIHsKKwkJCQl2b2lkICp2ID0ga21hbGxvYyhkYXRhX2xlbiwgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKHYgPT0gTlVMTCkgeworCQkJCQllcnIgPSAtRU5PQlVGUzsKKwkJCQkJZ290byBlcnJvdXQ7CisJCQkJfQorCQkJCW1lbWNweSh2LCBkYXRhLCBkYXRhX2xlbik7CisJCQkJZW0tPmRhdGEgPSAodW5zaWduZWQgbG9uZykgdjsKKwkJCX0KKwkJfQorCX0KKworCWVtLT5tYXRjaGlkID0gZW1faGRyLT5tYXRjaGlkOworCWVtLT5mbGFncyA9IGVtX2hkci0+ZmxhZ3M7CisJZW0tPmRhdGFsZW4gPSBkYXRhX2xlbjsKKworCWVyciA9IDA7CitlcnJvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB0Y2ZfZW1fdHJlZV92YWxpZGF0ZSAtIHZhbGlkYXRlIGVtYXRjaCBjb25maWcgVExWIGFuZCBidWlsZCBlbWF0Y2ggdHJlZQorICoKKyAqIEB0cDogY2xhc3NpZmllciBraW5kIGhhbmRsZQorICogQHJ0YTogZW1hdGNoIHRyZWUgY29uZmlndXJhdGlvbiBUTFYKKyAqIEB0cmVlOiBkZXN0aW5hdGlvbiBlbWF0Y2ggdHJlZSB2YXJpYWJsZSB0byBzdG9yZSB0aGUgcmVzdWx0aW5nCisgKiAgICAgICAgZW1hdGNoIHRyZWUuCisgKgorICogVGhpcyBmdW5jdGlvbiB2YWxpZGF0ZXMgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gVExWIEBydGEgYW5kIGJ1aWxkcyBhbgorICogZW1hdGNoIHRyZWUgaW4gQHRyZWUuIFRoZSByZXN1bHRpbmcgdHJlZSBtdXN0IGxhdGVyIGJlIGNvcGllZCBpbnRvCisgKiB0aGUgcHJpdmF0ZSBjbGFzc2lmaWVyIGRhdGEgdXNpbmcgdGNmX2VtX3RyZWVfY2hhbmdlKCkuIFlvdSBNVVNUIE5PVAorICogcHJvdmlkZSB0aGUgZW1hdGNoIHRyZWUgdmFyaWFibGUgb2YgdGhlIHByaXZhdGUgY2xhc3NpZmllciBkYXRhIGRpcmVjdGx5LAorICogdGhlIGNoYW5nZXMgd291bGQgbm90IGJlIGxvY2tlZCBwcm9wZXJseS4KKyAqCisgKiBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpZiB0aGUgY29uZmlndXJhdGlvbiBUTFYgY29udGFpbnMgZXJyb3JzLgorICovCitpbnQgdGNmX2VtX3RyZWVfdmFsaWRhdGUoc3RydWN0IHRjZl9wcm90byAqdHAsIHN0cnVjdCBydGF0dHIgKnJ0YSwKKwkJCSBzdHJ1Y3QgdGNmX2VtYXRjaF90cmVlICp0cmVlKQoreworCWludCBpZHgsIGxpc3RfbGVuLCBtYXRjaGVzX2xlbiwgZXJyID0gLUVJTlZBTDsKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfRU1BVENIX1RSRUVfTUFYXTsKKwlzdHJ1Y3QgcnRhdHRyICpydF9tYXRjaCwgKnJ0X2hkciwgKnJ0X2xpc3Q7CisJc3RydWN0IHRjZl9lbWF0Y2hfdHJlZV9oZHIgKnRyZWVfaGRyOworCXN0cnVjdCB0Y2ZfZW1hdGNoICplbTsKKworCWlmIChydGF0dHJfcGFyc2VfbmVzdGVkKHRiLCBUQ0FfRU1BVENIX1RSRUVfTUFYLCBydGEpIDwgMCkKKwkJZ290byBlcnJvdXQ7CisKKwlydF9oZHIgPSB0YltUQ0FfRU1BVENIX1RSRUVfSERSLTFdOworCXJ0X2xpc3QgPSB0YltUQ0FfRU1BVENIX1RSRUVfTElTVC0xXTsKKworCWlmIChydF9oZHIgPT0gTlVMTCB8fCBydF9saXN0ID09IE5VTEwpCisJCWdvdG8gZXJyb3V0OworCisJaWYgKFJUQV9QQVlMT0FEKHJ0X2hkcikgPCBzaXplb2YoKnRyZWVfaGRyKSB8fAorCSAgICBSVEFfUEFZTE9BRChydF9saXN0KSA8IHNpemVvZigqcnRfbWF0Y2gpKQorCQlnb3RvIGVycm91dDsKKworCXRyZWVfaGRyID0gUlRBX0RBVEEocnRfaGRyKTsKKwltZW1jcHkoJnRyZWUtPmhkciwgdHJlZV9oZHIsIHNpemVvZigqdHJlZV9oZHIpKTsKKworCXJ0X21hdGNoID0gUlRBX0RBVEEocnRfbGlzdCk7CisJbGlzdF9sZW4gPSBSVEFfUEFZTE9BRChydF9saXN0KTsKKwltYXRjaGVzX2xlbiA9IHRyZWVfaGRyLT5ubWF0Y2hlcyAqIHNpemVvZigqZW0pOworCisJdHJlZS0+bWF0Y2hlcyA9IGttYWxsb2MobWF0Y2hlc19sZW4sIEdGUF9LRVJORUwpOworCWlmICh0cmVlLT5tYXRjaGVzID09IE5VTEwpCisJCWdvdG8gZXJyb3V0OworCW1lbXNldCh0cmVlLT5tYXRjaGVzLCAwLCBtYXRjaGVzX2xlbik7CisKKwkvKiBXZSBkbyBub3QgdXNlIHJ0YXR0cl9wYXJzZV9uZXN0ZWQgaGVyZSBiZWNhdXNlIHRoZSBtYXhpbXVtCisJICogbnVtYmVyIG9mIGF0dHJpYnV0ZXMgaXMgdW5rbm93bi4gVGhpcyBzYXZlcyB1cyB0aGUgYWxsb2NhdGlvbgorCSAqIGZvciBhIHRiIGJ1ZmZlciB3aGljaCB3b3VsZCBzZXJ2ZSBubyBwdXJwb3NlIGF0IGFsbC4KKwkgKiAKKwkgKiBUaGUgYXJyYXkgb2YgcnQgYXR0cmlidXRlcyBpcyBwYXJzZWQgaW4gdGhlIG9yZGVyIGFzIHRoZXkgYXJlCisJICogcHJvdmlkZWQsIHRoZWlyIHR5cGUgbXVzdCBiZSBpbmNyZW1lbnRhbCBmcm9tIDEgdG8gbi4gRXZlbgorCSAqIGlmIGl0IGRvZXMgbm90IHNlcnZlIGFueSByZWFsIHB1cnBvc2UsIGEgZmFpbHVyZSBvZiBzdGlja2luZworCSAqIHRvIHRoaXMgcG9saWN5IHdpbGwgcmVzdWx0IGluIHBhcnNpbmcgZmFpbHVyZS4gKi8KKwlmb3IgKGlkeCA9IDA7IFJUQV9PSyhydF9tYXRjaCwgbGlzdF9sZW4pOyBpZHgrKykgeworCQllcnIgPSAtRUlOVkFMOworCisJCWlmIChydF9tYXRjaC0+cnRhX3R5cGUgIT0gKGlkeCArIDEpKQorCQkJZ290byBlcnJvdXRfYWJvcnQ7CisKKwkJaWYgKGlkeCA+PSB0cmVlX2hkci0+bm1hdGNoZXMpCisJCQlnb3RvIGVycm91dF9hYm9ydDsKKworCQlpZiAoUlRBX1BBWUxPQUQocnRfbWF0Y2gpIDwgc2l6ZW9mKHN0cnVjdCB0Y2ZfZW1hdGNoX2hkcikpCisJCQlnb3RvIGVycm91dF9hYm9ydDsKKworCQllbSA9IHRjZl9lbV9nZXRfbWF0Y2godHJlZSwgaWR4KTsKKworCQllcnIgPSB0Y2ZfZW1fdmFsaWRhdGUodHAsIHRyZWVfaGRyLCBlbSwgcnRfbWF0Y2gsIGlkeCk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnJvdXRfYWJvcnQ7CisKKwkJcnRfbWF0Y2ggPSBSVEFfTkVYVChydF9tYXRjaCwgbGlzdF9sZW4pOworCX0KKworCS8qIENoZWNrIGlmIHRoZSBudW1iZXIgb2YgbWF0Y2hlcyBwcm92aWRlZCBieSB1c2Vyc3BhY2UgYWN0dWFsbHkKKwkgKiBjb21wbGllcyB3aXRoIHRoZSBhcnJheSBvZiBtYXRjaGVzLiBUaGUgbnVtYmVyIHdhcyB1c2VkIGZvcgorCSAqIHRoZSB2YWxpZGF0aW9uIG9mIHJlZmVyZW5jZXMgYW5kIGEgbWlzbWF0Y2ggY291bGQgbGVhZCB0bworCSAqIHVuZGVmaW5lZCByZWZlcmVuY2VzIGR1cmluZyB0aGUgbWF0Y2hpbmcgcHJvY2Vzcy4gKi8KKwlpZiAoaWR4ICE9IHRyZWVfaGRyLT5ubWF0Y2hlcykgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycm91dF9hYm9ydDsKKwl9CisKKwllcnIgPSAwOworZXJyb3V0OgorCXJldHVybiBlcnI7CisKK2Vycm91dF9hYm9ydDoKKwl0Y2ZfZW1fdHJlZV9kZXN0cm95KHRwLCB0cmVlKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIHRjZl9lbV90cmVlX2Rlc3Ryb3kgLSBkZXN0cm95IGFuIGVtYXRjaCB0cmVlCisgKgorICogQHRwOiBjbGFzc2lmaWVyIGtpbmQgaGFuZGxlCisgKiBAdHJlZTogZW1hdGNoIHRyZWUgdG8gYmUgZGVsZXRlZAorICoKKyAqIFRoaXMgZnVuY3Rpb25zIGRlc3Ryb3lzIGFuIGVtYXRjaCB0cmVlIHByZXZpb3VzbHkgY3JlYXRlZCBieQorICogdGNmX2VtX3RyZWVfdmFsaWRhdGUoKS90Y2ZfZW1fdHJlZV9jaGFuZ2UoKS4gWW91IG11c3QgZW5zdXJlIHRoYXQKKyAqIHRoZSBlbWF0Y2ggdHJlZSBpcyBub3QgaW4gdXNlIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKi8KK3ZvaWQgdGNmX2VtX3RyZWVfZGVzdHJveShzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgc3RydWN0IHRjZl9lbWF0Y2hfdHJlZSAqdHJlZSkKK3sKKwlpbnQgaTsKKworCWlmICh0cmVlLT5tYXRjaGVzID09IE5VTEwpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCB0cmVlLT5oZHIubm1hdGNoZXM7IGkrKykgeworCQlzdHJ1Y3QgdGNmX2VtYXRjaCAqZW0gPSB0Y2ZfZW1fZ2V0X21hdGNoKHRyZWUsIGkpOworCisJCWlmIChlbS0+b3BzKSB7CisJCQlpZiAoZW0tPm9wcy0+ZGVzdHJveSkKKwkJCQllbS0+b3BzLT5kZXN0cm95KHRwLCBlbSk7CisJCQllbHNlIGlmICghdGNmX2VtX2lzX3NpbXBsZShlbSkgJiYgZW0tPmRhdGEpCisJCQkJa2ZyZWUoKHZvaWQgKikgZW0tPmRhdGEpOworCQkJbW9kdWxlX3B1dChlbS0+b3BzLT5vd25lcik7CisJCX0KKwl9CisJCisJdHJlZS0+aGRyLm5tYXRjaGVzID0gMDsKKwlrZnJlZSh0cmVlLT5tYXRjaGVzKTsKK30KKworLyoqCisgKiB0Y2ZfZW1fdHJlZV9kdW1wIC0gZHVtcCBlbWF0Y2ggdHJlZSBpbnRvIGEgcnRubCBtZXNzYWdlCisgKgorICogQHNrYjogc2tiIGhvbGRpbmcgdGhlIHJ0bmwgbWVzc2FnZQorICogQHQ6IGVtYXRjaCB0cmVlIHRvIGJlIGR1bXBlZAorICogQHRsdjogVExWIHR5cGUgdG8gYmUgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgdHJlZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gZHVtcHMgYSBlbWF0Y2ggdHJlZSBpbnRvIGEgcnRubCBtZXNzYWdlLiBJdCBpcyB2YWxpZCB0bworICogY2FsbCB0aGlzIGZ1bmN0aW9uIHdoaWxlIHRoZSBlbWF0Y2ggdHJlZSBpcyBpbiB1c2UuCisgKgorICogUmV0dXJucyAtMSBpZiB0aGUgc2tiIHRhaWxyb29tIGlzIGluc3VmZmljaWVudC4KKyAqLworaW50IHRjZl9lbV90cmVlX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjZl9lbWF0Y2hfdHJlZSAqdHJlZSwgaW50IHRsdikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcnRhdHRyICogdG9wX3N0YXJ0ID0gKHN0cnVjdCBydGF0dHIqKSBza2ItPnRhaWw7CisJc3RydWN0IHJ0YXR0ciAqIGxpc3Rfc3RhcnQ7CisKKwlSVEFfUFVUKHNrYiwgdGx2LCAwLCBOVUxMKTsKKwlSVEFfUFVUKHNrYiwgVENBX0VNQVRDSF9UUkVFX0hEUiwgc2l6ZW9mKHRyZWUtPmhkciksICZ0cmVlLT5oZHIpOworCisJbGlzdF9zdGFydCA9IChzdHJ1Y3QgcnRhdHRyICopIHNrYi0+dGFpbDsKKwlSVEFfUFVUKHNrYiwgVENBX0VNQVRDSF9UUkVFX0xJU1QsIDAsIE5VTEwpOworCisJZm9yIChpID0gMDsgaSA8IHRyZWUtPmhkci5ubWF0Y2hlczsgaSsrKSB7CisJCXN0cnVjdCBydGF0dHIgKm1hdGNoX3N0YXJ0ID0gKHN0cnVjdCBydGF0dHIqKSBza2ItPnRhaWw7CisJCXN0cnVjdCB0Y2ZfZW1hdGNoICplbSA9IHRjZl9lbV9nZXRfbWF0Y2godHJlZSwgaSk7CisJCXN0cnVjdCB0Y2ZfZW1hdGNoX2hkciBlbV9oZHIgPSB7CisJCQkua2luZCA9IGVtLT5vcHMgPyBlbS0+b3BzLT5raW5kIDogVENGX0VNX0NPTlRBSU5FUiwKKwkJCS5tYXRjaGlkID0gZW0tPm1hdGNoaWQsCisJCQkuZmxhZ3MgPSBlbS0+ZmxhZ3MKKwkJfTsKKworCQlSVEFfUFVUKHNrYiwgaSsxLCBzaXplb2YoZW1faGRyKSwgJmVtX2hkcik7CisKKwkJaWYgKGVtLT5vcHMgJiYgZW0tPm9wcy0+ZHVtcCkgeworCQkJaWYgKGVtLT5vcHMtPmR1bXAoc2tiLCBlbSkgPCAwKQorCQkJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CisJCX0gZWxzZSBpZiAodGNmX2VtX2lzX2NvbnRhaW5lcihlbSkgfHwgdGNmX2VtX2lzX3NpbXBsZShlbSkpIHsKKwkJCXUzMiB1ID0gZW0tPmRhdGE7CisJCQlSVEFfUFVUX05PSERSKHNrYiwgc2l6ZW9mKHUpLCAmdSk7CisJCX0gZWxzZSBpZiAoZW0tPmRhdGFsZW4gPiAwKQorCQkJUlRBX1BVVF9OT0hEUihza2IsIGVtLT5kYXRhbGVuLCAodm9pZCAqKSBlbS0+ZGF0YSk7CisKKwkJbWF0Y2hfc3RhcnQtPnJ0YV9sZW4gPSBza2ItPnRhaWwgLSAodTgqKSBtYXRjaF9zdGFydDsKKwl9CisKKwlsaXN0X3N0YXJ0LT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4ICopIGxpc3Rfc3RhcnQ7CisJdG9wX3N0YXJ0LT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4ICopIHRvcF9zdGFydDsKKworCXJldHVybiAwOworCitydGF0dHJfZmFpbHVyZToKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRjZl9lbV9tYXRjaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNmX2VtYXRjaCAqZW0sCisJCQkgICAgICAgc3RydWN0IHRjZl9wa3RfaW5mbyAqaW5mbykKK3sKKwlpbnQgciA9IGVtLT5vcHMtPm1hdGNoKHNrYiwgZW0sIGluZm8pOworCXJldHVybiB0Y2ZfZW1faXNfaW52ZXJ0ZWQoZW0pID8gIXIgOiByOworfQorCisvKiBEbyBub3QgdXNlIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHksIHVzZSB0Y2ZfZW1fdHJlZV9tYXRjaCBpbnN0ZWFkICovCitpbnQgX190Y2ZfZW1fdHJlZV9tYXRjaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNmX2VtYXRjaF90cmVlICp0cmVlLAorCQkJc3RydWN0IHRjZl9wa3RfaW5mbyAqaW5mbykKK3sKKwlpbnQgc3RhY2twID0gMCwgbWF0Y2hfaWR4ID0gMCwgcmVzID0gMDsKKwlzdHJ1Y3QgdGNmX2VtYXRjaCAqY3VyX21hdGNoOworCWludCBzdGFja1tDT05GSUdfTkVUX0VNQVRDSF9TVEFDS107CisKK3Byb2NlZWQ6CisJd2hpbGUgKG1hdGNoX2lkeCA8IHRyZWUtPmhkci5ubWF0Y2hlcykgeworCQljdXJfbWF0Y2ggPSB0Y2ZfZW1fZ2V0X21hdGNoKHRyZWUsIG1hdGNoX2lkeCk7CisKKwkJaWYgKHRjZl9lbV9pc19jb250YWluZXIoY3VyX21hdGNoKSkgeworCQkJaWYgKHVubGlrZWx5KHN0YWNrcCA+PSBDT05GSUdfTkVUX0VNQVRDSF9TVEFDSykpCisJCQkJZ290byBzdGFja19vdmVyZmxvdzsKKworCQkJc3RhY2tbc3RhY2twKytdID0gbWF0Y2hfaWR4OworCQkJbWF0Y2hfaWR4ID0gY3VyX21hdGNoLT5kYXRhOworCQkJZ290byBwcm9jZWVkOworCQl9CisKKwkJcmVzID0gdGNmX2VtX21hdGNoKHNrYiwgY3VyX21hdGNoLCBpbmZvKTsKKworCQlpZiAodGNmX2VtX2Vhcmx5X2VuZChjdXJfbWF0Y2gsIHJlcykpCisJCQlicmVhazsKKworCQltYXRjaF9pZHgrKzsKKwl9CisKK3BvcF9zdGFjazoKKwlpZiAoc3RhY2twID4gMCkgeworCQltYXRjaF9pZHggPSBzdGFja1stLXN0YWNrcF07CisJCWN1cl9tYXRjaCA9IHRjZl9lbV9nZXRfbWF0Y2godHJlZSwgbWF0Y2hfaWR4KTsKKworCQlpZiAodGNmX2VtX2Vhcmx5X2VuZChjdXJfbWF0Y2gsIHJlcykpCisJCQlnb3RvIHBvcF9zdGFjazsKKwkJZWxzZSB7CisJCQltYXRjaF9pZHgrKzsKKwkJCWdvdG8gcHJvY2VlZDsKKwkJfQorCX0KKworCXJldHVybiByZXM7CisKK3N0YWNrX292ZXJmbG93OgorCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCXByaW50aygiTG9jYWwgc3RhY2sgb3ZlcmZsb3csIGluY3JlYXNlIE5FVF9FTUFUQ0hfU1RBQ0tcbiIpOworCXJldHVybiAtMTsKK30KKworRVhQT1JUX1NZTUJPTCh0Y2ZfZW1fcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTCh0Y2ZfZW1fdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKHRjZl9lbV90cmVlX3ZhbGlkYXRlKTsKK0VYUE9SVF9TWU1CT0wodGNmX2VtX3RyZWVfZGVzdHJveSk7CitFWFBPUlRfU1lNQk9MKHRjZl9lbV90cmVlX2R1bXApOworRVhQT1JUX1NZTUJPTChfX3RjZl9lbV90cmVlX21hdGNoKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9lc3RpbWF0b3IuYyBiL25ldC9zY2hlZC9lc3RpbWF0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDNhZTAzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjaGVkL2VzdGltYXRvci5jCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogbmV0L3NjaGVkL2VzdGltYXRvci5jCVNpbXBsZSByYXRlIGVzdGltYXRvci4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKi8KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CisKKy8qCisgICBUaGlzIGNvZGUgaXMgTk9UIGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIHN0YXRpc3RpY3MgY29sbGVjdGlvbiwKKyAgIGl0cyBwdXJwb3NlIGlzIHRvIHByb3ZpZGUgYSBiYXNlIGZvciBzdGF0aXN0aWNhbCBtdWx0aXBsZXhpbmcKKyAgIGZvciBjb250cm9sbGVkIGxvYWQgc2VydmljZS4KKyAgIElmIHlvdSBuZWVkIG9ubHkgc3RhdGlzdGljcywgcnVuIGEgdXNlciBsZXZlbCBkYWVtb24gd2hpY2gKKyAgIHBlcmlvZGljYWxseSByZWFkcyBieXRlIGNvdW50ZXJzLgorCisgICBVbmZvcnR1bmF0ZWx5LCByYXRlIGVzdGltYXRpb24gaXMgbm90IGEgdmVyeSBlYXN5IHRhc2suCisgICBGLmUuIEkgZGlkIG5vdCBmaW5kIGEgc2ltcGxlIHdheSB0byBlc3RpbWF0ZSB0aGUgY3VycmVudCBwZWFrIHJhdGUKKyAgIGFuZCBldmVuIGZhaWxlZCB0byBmb3JtdWxhdGUgdGhlIHByb2JsZW0gOCk4KQorCisgICBTbyBJIHByZWZlcnJlZCBub3QgdG8gYnVpbHQgYW4gZXN0aW1hdG9yIGludG8gdGhlIHNjaGVkdWxlciwKKyAgIGJ1dCBydW4gdGhpcyB0YXNrIHNlcGFyYXRlbHkuCisgICBJZGVhbGx5LCBpdCBzaG91bGQgYmUga2VybmVsIHRocmVhZChzKSwgYnV0IGZvciBub3cgaXQgcnVucworICAgZnJvbSB0aW1lcnMsIHdoaWNoIHB1dHMgYXBwYXJlbnQgdG9wIGJvdW5kcyBvbiB0aGUgbnVtYmVyIG9mIHJhdGVkCisgICBmbG93cywgaGFzIG1pbmltYWwgb3ZlcmhlYWQgb24gc21hbGwsIGJ1dCBpcyBlbm91Z2gKKyAgIHRvIGhhbmRsZSBjb250cm9sbGVkIGxvYWQgc2VydmljZSwgc2V0cyBvZiBhZ2dyZWdhdGVzLgorCisgICBXZSBtZWFzdXJlIHJhdGUgb3ZlciBBPSgxPDxpbnRlcnZhbCkgc2Vjb25kcyBhbmQgZXZhbHVhdGUgRVdNQToKKworICAgYXZyYXRlID0gYXZyYXRlKigxLVcpICsgcmF0ZSpXCisKKyAgIHdoZXJlIFcgaXMgY2hvc2VuIGFzIG5lZ2F0aXZlIHBvd2VyIG9mIDI6IFcgPSAyXigtZXdtYV9sb2cpCisKKyAgIFRoZSByZXN1bHRpbmcgdGltZSBjb25zdGFudCBpczoKKworICAgVCA9IEEvKC1sbigxLVcpKQorCisKKyAgIE5PVEVTLgorCisgICAqIFRoZSBzdG9yZWQgdmFsdWUgZm9yIGF2YnBzIGlzIHNjYWxlZCBieSAyXjUsIHNvIHRoYXQgbWF4aW1hbAorICAgICByYXRlIGlzIH4xR2JpdCwgYXZwcHMgaXMgc2NhbGVkIGJ5IDJeMTAuCisKKyAgICogTWluaW1hbCBpbnRlcnZhbCBpcyBIWi80PTI1MG1zZWMgKGl0IGlzIHRoZSBncmVhdGVzdCBjb21tb24gZGl2aXNvcgorICAgICBmb3IgSFo9MTAwIGFuZCBIWj0xMDI0IDgpKSwgbWF4aW1hbCBpbnRlcnZhbAorICAgICBpcyAoSFoqMl5FU1RfTUFYX0lOVEVSVkFMKS80ID0gOHNlYy4gU2hvcnRlciBpbnRlcnZhbHMKKyAgICAgYXJlIHRvbyBleHBlbnNpdmUsIGxvbmdlciBvbmVzIGNhbiBiZSBpbXBsZW1lbnRlZAorICAgICBhdCB1c2VyIGxldmVsIHBhaW5sZXNzbHkuCisgKi8KKworI2RlZmluZSBFU1RfTUFYX0lOVEVSVkFMCTUKKworc3RydWN0IHFkaXNjX2VzdGltYXRvcgoreworCXN0cnVjdCBxZGlzY19lc3RpbWF0b3IJKm5leHQ7CisJc3RydWN0IHRjX3N0YXRzCQkqc3RhdHM7CisJc3BpbmxvY2tfdAkJKnN0YXRzX2xvY2s7CisJdW5zaWduZWQJCWludGVydmFsOworCWludAkJCWV3bWFfbG9nOworCXU2NAkJCWxhc3RfYnl0ZXM7CisJdTMyCQkJbGFzdF9wYWNrZXRzOworCXUzMgkJCWF2cHBzOworCXUzMgkJCWF2YnBzOworfTsKKworc3RydWN0IHFkaXNjX2VzdGltYXRvcl9oZWFkCit7CisJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CisJc3RydWN0IHFkaXNjX2VzdGltYXRvcgkqbGlzdDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcWRpc2NfZXN0aW1hdG9yX2hlYWQgZWxpc3RbRVNUX01BWF9JTlRFUlZBTCsxXTsKKworLyogRXN0aW1hdG9yIGFycmF5IGxvY2sgKi8KK3N0YXRpYyBERUZJTkVfUldMT0NLKGVzdF9sb2NrKTsKKworc3RhdGljIHZvaWQgZXN0X3RpbWVyKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBpZHggPSAoaW50KWFyZzsKKwlzdHJ1Y3QgcWRpc2NfZXN0aW1hdG9yICplOworCisJcmVhZF9sb2NrKCZlc3RfbG9jayk7CisJZm9yIChlID0gZWxpc3RbaWR4XS5saXN0OyBlOyBlID0gZS0+bmV4dCkgeworCQlzdHJ1Y3QgdGNfc3RhdHMgKnN0ID0gZS0+c3RhdHM7CisJCXU2NCBuYnl0ZXM7CisJCXUzMiBucGFja2V0czsKKwkJdTMyIHJhdGU7CisKKwkJc3Bpbl9sb2NrKGUtPnN0YXRzX2xvY2spOworCQluYnl0ZXMgPSBzdC0+Ynl0ZXM7CisJCW5wYWNrZXRzID0gc3QtPnBhY2tldHM7CisJCXJhdGUgPSAobmJ5dGVzIC0gZS0+bGFzdF9ieXRlcyk8PCg3IC0gaWR4KTsKKwkJZS0+bGFzdF9ieXRlcyA9IG5ieXRlczsKKwkJZS0+YXZicHMgKz0gKChsb25nKXJhdGUgLSAobG9uZyllLT5hdmJwcykgPj4gZS0+ZXdtYV9sb2c7CisJCXN0LT5icHMgPSAoZS0+YXZicHMrMHhGKT4+NTsKKworCQlyYXRlID0gKG5wYWNrZXRzIC0gZS0+bGFzdF9wYWNrZXRzKTw8KDEyIC0gaWR4KTsKKwkJZS0+bGFzdF9wYWNrZXRzID0gbnBhY2tldHM7CisJCWUtPmF2cHBzICs9ICgobG9uZylyYXRlIC0gKGxvbmcpZS0+YXZwcHMpID4+IGUtPmV3bWFfbG9nOworCQllLT5zdGF0cy0+cHBzID0gKGUtPmF2cHBzKzB4MUZGKT4+MTA7CisJCXNwaW5fdW5sb2NrKGUtPnN0YXRzX2xvY2spOworCX0KKworCW1vZF90aW1lcigmZWxpc3RbaWR4XS50aW1lciwgamlmZmllcyArICgoSFo8PGlkeCkvNCkpOworCXJlYWRfdW5sb2NrKCZlc3RfbG9jayk7Cit9CisKK2ludCBxZGlzY19uZXdfZXN0aW1hdG9yKHN0cnVjdCB0Y19zdGF0cyAqc3RhdHMsIHNwaW5sb2NrX3QgKnN0YXRzX2xvY2ssIHN0cnVjdCBydGF0dHIgKm9wdCkKK3sKKwlzdHJ1Y3QgcWRpc2NfZXN0aW1hdG9yICplc3Q7CisJc3RydWN0IHRjX2VzdGltYXRvciAqcGFybSA9IFJUQV9EQVRBKG9wdCk7CisKKwlpZiAoUlRBX1BBWUxPQUQob3B0KSA8IHNpemVvZigqcGFybSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBhcm0tPmludGVydmFsIDwgLTIgfHwgcGFybS0+aW50ZXJ2YWwgPiAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVzdCA9IGttYWxsb2Moc2l6ZW9mKCplc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZXN0ID09IE5VTEwpCisJCXJldHVybiAtRU5PQlVGUzsKKworCW1lbXNldChlc3QsIDAsIHNpemVvZigqZXN0KSk7CisJZXN0LT5pbnRlcnZhbCA9IHBhcm0tPmludGVydmFsICsgMjsKKwllc3QtPnN0YXRzID0gc3RhdHM7CisJZXN0LT5zdGF0c19sb2NrID0gc3RhdHNfbG9jazsKKwllc3QtPmV3bWFfbG9nID0gcGFybS0+ZXdtYV9sb2c7CisJZXN0LT5sYXN0X2J5dGVzID0gc3RhdHMtPmJ5dGVzOworCWVzdC0+YXZicHMgPSBzdGF0cy0+YnBzPDw1OworCWVzdC0+bGFzdF9wYWNrZXRzID0gc3RhdHMtPnBhY2tldHM7CisJZXN0LT5hdnBwcyA9IHN0YXRzLT5wcHM8PDEwOworCisJZXN0LT5uZXh0ID0gZWxpc3RbZXN0LT5pbnRlcnZhbF0ubGlzdDsKKwlpZiAoZXN0LT5uZXh0ID09IE5VTEwpIHsKKwkJaW5pdF90aW1lcigmZWxpc3RbZXN0LT5pbnRlcnZhbF0udGltZXIpOworCQllbGlzdFtlc3QtPmludGVydmFsXS50aW1lci5kYXRhID0gZXN0LT5pbnRlcnZhbDsKKwkJZWxpc3RbZXN0LT5pbnRlcnZhbF0udGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoKEhaPDxlc3QtPmludGVydmFsKS80KTsKKwkJZWxpc3RbZXN0LT5pbnRlcnZhbF0udGltZXIuZnVuY3Rpb24gPSBlc3RfdGltZXI7CisJCWFkZF90aW1lcigmZWxpc3RbZXN0LT5pbnRlcnZhbF0udGltZXIpOworCX0KKwl3cml0ZV9sb2NrX2JoKCZlc3RfbG9jayk7CisJZWxpc3RbZXN0LT5pbnRlcnZhbF0ubGlzdCA9IGVzdDsKKwl3cml0ZV91bmxvY2tfYmgoJmVzdF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBxZGlzY19raWxsX2VzdGltYXRvcihzdHJ1Y3QgdGNfc3RhdHMgKnN0YXRzKQoreworCWludCBpZHg7CisJc3RydWN0IHFkaXNjX2VzdGltYXRvciAqZXN0LCAqKnBlc3Q7CisKKwlmb3IgKGlkeD0wOyBpZHggPD0gRVNUX01BWF9JTlRFUlZBTDsgaWR4KyspIHsKKwkJaW50IGtpbGxlZCA9IDA7CisJCXBlc3QgPSAmZWxpc3RbaWR4XS5saXN0OworCQl3aGlsZSAoKGVzdD0qcGVzdCkgIT0gTlVMTCkgeworCQkJaWYgKGVzdC0+c3RhdHMgIT0gc3RhdHMpIHsKKwkJCQlwZXN0ID0gJmVzdC0+bmV4dDsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJd3JpdGVfbG9ja19iaCgmZXN0X2xvY2spOworCQkJKnBlc3QgPSBlc3QtPm5leHQ7CisJCQl3cml0ZV91bmxvY2tfYmgoJmVzdF9sb2NrKTsKKworCQkJa2ZyZWUoZXN0KTsKKwkJCWtpbGxlZCsrOworCQl9CisJCWlmIChraWxsZWQgJiYgZWxpc3RbaWR4XS5saXN0ID09IE5VTEwpCisJCQlkZWxfdGltZXIoJmVsaXN0W2lkeF0udGltZXIpOworCX0KK30KKworRVhQT1JUX1NZTUJPTChxZGlzY19raWxsX2VzdGltYXRvcik7CitFWFBPUlRfU1lNQk9MKHFkaXNjX25ld19lc3RpbWF0b3IpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2dhY3QuYyBiL25ldC9zY2hlZC9nYWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxMWM4OQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY2hlZC9nYWN0LmMKQEAgLTAsMCArMSwyMzEgQEAKKy8qCisgKiBuZXQvc2NoZWQvZ2FjdC5jCUdlbmVyaWMgYWN0aW9ucworICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIGNvcHlyaWdodCAJSmFtYWwgSGFkaSBTYWxpbSAoMjAwMi00KQorICoKKyAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjX2FjdC90Y19nYWN0Lmg+CisjaW5jbHVkZSA8bmV0L3RjX2FjdC90Y19nYWN0Lmg+CisKKy8qIHVzZSBnZW5lcmljIGhhc2ggdGFibGUgKi8KKyNkZWZpbmUgTVlfVEFCX1NJWkUJMTYKKyNkZWZpbmUgTVlfVEFCX01BU0sJMTUKKworc3RhdGljIHUzMiBpZHhfZ2VuOworc3RhdGljIHN0cnVjdCB0Y2ZfZ2FjdCAqdGNmX2dhY3RfaHRbTVlfVEFCX1NJWkVdOworc3RhdGljIERFRklORV9SV0xPQ0soZ2FjdF9sb2NrKTsKKworLyogb3Zld3JyaWRlIHRoZSBkZWZhdWx0cyAqLworI2RlZmluZSB0Y2Zfc3QJCXRjZl9nYWN0CisjZGVmaW5lIHRjX3N0CQl0Y19nYWN0CisjZGVmaW5lIHRjZl90X2xvY2sJZ2FjdF9sb2NrCisjZGVmaW5lIHRjZl9odAkJdGNmX2dhY3RfaHQKKworI2RlZmluZSBDT05GSUdfTkVUX0FDVF9JTklUIDEKKyNpbmNsdWRlIDxuZXQvcGt0X2FjdC5oPgorCisjaWZkZWYgQ09ORklHX0dBQ1RfUFJPQgorc3RhdGljIGludCBnYWN0X25ldF9yYW5kKHN0cnVjdCB0Y2ZfZ2FjdCAqcCkKK3sKKwlpZiAobmV0X3JhbmRvbSgpJXAtPnB2YWwpCisJCXJldHVybiBwLT5hY3Rpb247CisJcmV0dXJuIHAtPnBhY3Rpb247Cit9CisKK3N0YXRpYyBpbnQgZ2FjdF9kZXRlcm0oc3RydWN0IHRjZl9nYWN0ICpwKQoreworCWlmIChwLT5ic3RhdHMucGFja2V0cyVwLT5wdmFsKQorCQlyZXR1cm4gcC0+YWN0aW9uOworCXJldHVybiBwLT5wYWN0aW9uOworfQorCit0eXBlZGVmIGludCAoKmdfcmFuZCkoc3RydWN0IHRjZl9nYWN0ICpwKTsKK3N0YXRpYyBnX3JhbmQgZ2FjdF9yYW5kW01BWF9SQU5EXT0geyBOVUxMLCBnYWN0X25ldF9yYW5kLCBnYWN0X2RldGVybSB9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgdGNmX2dhY3RfaW5pdChzdHJ1Y3QgcnRhdHRyICpydGEsIHN0cnVjdCBydGF0dHIgKmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGNfYWN0aW9uICphLCBpbnQgb3ZyLCBpbnQgYmluZCkKK3sKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfR0FDVF9NQVhdOworCXN0cnVjdCB0Y19nYWN0ICpwYXJtOworCXN0cnVjdCB0Y2ZfZ2FjdCAqcDsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChydGEgPT0gTlVMTCB8fCBydGF0dHJfcGFyc2VfbmVzdGVkKHRiLCBUQ0FfR0FDVF9NQVgsIHJ0YSkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh0YltUQ0FfR0FDVF9QQVJNUyAtIDFdID09IE5VTEwgfHwKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX0dBQ1RfUEFSTVMgLSAxXSkgPCBzaXplb2YoKnBhcm0pKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwYXJtID0gUlRBX0RBVEEodGJbVENBX0dBQ1RfUEFSTVMgLSAxXSk7CisKKwlpZiAodGJbVENBX0dBQ1RfUFJPQi0xXSAhPSBOVUxMKQorI2lmZGVmIENPTkZJR19HQUNUX1BST0IKKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9HQUNUX1BST0ItMV0pIDwgc2l6ZW9mKHN0cnVjdCB0Y19nYWN0X3ApKQorCQkJcmV0dXJuIC1FSU5WQUw7CisjZWxzZQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisjZW5kaWYKKworCXAgPSB0Y2ZfaGFzaF9jaGVjayhwYXJtLT5pbmRleCwgYSwgb3ZyLCBiaW5kKTsKKwlpZiAocCA9PSBOVUxMKSB7CisJCXAgPSB0Y2ZfaGFzaF9jcmVhdGUocGFybS0+aW5kZXgsIGVzdCwgYSwgc2l6ZW9mKCpwKSwgb3ZyLCBiaW5kKTsKKwkJaWYgKHAgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlyZXQgPSBBQ1RfUF9DUkVBVEVEOworCX0gZWxzZSB7CisJCWlmICghb3ZyKSB7CisJCQl0Y2ZfaGFzaF9yZWxlYXNlKHAsIGJpbmQpOworCQkJcmV0dXJuIC1FRVhJU1Q7CisJCX0KKwl9CisKKwlzcGluX2xvY2tfYmgoJnAtPmxvY2spOworCXAtPmFjdGlvbiA9IHBhcm0tPmFjdGlvbjsKKyNpZmRlZiBDT05GSUdfR0FDVF9QUk9CCisJaWYgKHRiW1RDQV9HQUNUX1BST0ItMV0gIT0gTlVMTCkgeworCQlzdHJ1Y3QgdGNfZ2FjdF9wICpwX3Bhcm0gPSBSVEFfREFUQSh0YltUQ0FfR0FDVF9QUk9CLTFdKTsKKwkJcC0+cGFjdGlvbiA9IHBfcGFybS0+cGFjdGlvbjsKKwkJcC0+cHZhbCAgICA9IHBfcGFybS0+cHZhbDsKKwkJcC0+cHR5cGUgICA9IHBfcGFybS0+cHR5cGU7CisJfQorI2VuZGlmCisJc3Bpbl91bmxvY2tfYmgoJnAtPmxvY2spOworCWlmIChyZXQgPT0gQUNUX1BfQ1JFQVRFRCkKKwkJdGNmX2hhc2hfaW5zZXJ0KHApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3RjZl9nYWN0X2NsZWFudXAoc3RydWN0IHRjX2FjdGlvbiAqYSwgaW50IGJpbmQpCit7CisJc3RydWN0IHRjZl9nYWN0ICpwID0gUFJJVihhLCBnYWN0KTsKKworCWlmIChwICE9IE5VTEwpCisJCXJldHVybiB0Y2ZfaGFzaF9yZWxlYXNlKHAsIGJpbmQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0Y2ZfZ2FjdChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEpCit7CisJc3RydWN0IHRjZl9nYWN0ICpwID0gUFJJVihhLCBnYWN0KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKnBza2I7CisJaW50IGFjdGlvbiA9IFRDX0FDVF9TSE9UOworCisJc3Bpbl9sb2NrKCZwLT5sb2NrKTsKKyNpZmRlZiBDT05GSUdfR0FDVF9QUk9CCisJaWYgKHAtPnB0eXBlICYmIGdhY3RfcmFuZFtwLT5wdHlwZV0gIT0gTlVMTCkKKwkJYWN0aW9uID0gZ2FjdF9yYW5kW3AtPnB0eXBlXShwKTsKKwllbHNlCisJCWFjdGlvbiA9IHAtPmFjdGlvbjsKKyNlbHNlCisJYWN0aW9uID0gcC0+YWN0aW9uOworI2VuZGlmCisJcC0+YnN0YXRzLmJ5dGVzICs9IHNrYi0+bGVuOworCXAtPmJzdGF0cy5wYWNrZXRzKys7CisJaWYgKGFjdGlvbiA9PSBUQ19BQ1RfU0hPVCkKKwkJcC0+cXN0YXRzLmRyb3BzKys7CisJcC0+dG0ubGFzdHVzZSA9IGppZmZpZXM7CisJc3Bpbl91bmxvY2soJnAtPmxvY2spOworCisJcmV0dXJuIGFjdGlvbjsKK30KKworc3RhdGljIGludAordGNmX2dhY3RfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLCBpbnQgYmluZCwgaW50IHJlZikKK3sKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXN0cnVjdCB0Y19nYWN0IG9wdDsKKwlzdHJ1Y3QgdGNmX2dhY3QgKnAgPSBQUklWKGEsIGdhY3QpOworCXN0cnVjdCB0Y2ZfdCB0OworCisJb3B0LmluZGV4ID0gcC0+aW5kZXg7CisJb3B0LnJlZmNudCA9IHAtPnJlZmNudCAtIHJlZjsKKwlvcHQuYmluZGNudCA9IHAtPmJpbmRjbnQgLSBiaW5kOworCW9wdC5hY3Rpb24gPSBwLT5hY3Rpb247CisJUlRBX1BVVChza2IsIFRDQV9HQUNUX1BBUk1TLCBzaXplb2Yob3B0KSwgJm9wdCk7CisjaWZkZWYgQ09ORklHX0dBQ1RfUFJPQgorCWlmIChwLT5wdHlwZSkgeworCQlzdHJ1Y3QgdGNfZ2FjdF9wIHBfb3B0OworCQlwX29wdC5wYWN0aW9uID0gcC0+cGFjdGlvbjsKKwkJcF9vcHQucHZhbCA9IHAtPnB2YWw7CisJCXBfb3B0LnB0eXBlID0gcC0+cHR5cGU7CisJCVJUQV9QVVQoc2tiLCBUQ0FfR0FDVF9QUk9CLCBzaXplb2YocF9vcHQpLCAmcF9vcHQpOworCX0KKyNlbmRpZgorCXQuaW5zdGFsbCA9IGppZmZpZXNfdG9fY2xvY2tfdChqaWZmaWVzIC0gcC0+dG0uaW5zdGFsbCk7CisJdC5sYXN0dXNlID0gamlmZmllc190b19jbG9ja190KGppZmZpZXMgLSBwLT50bS5sYXN0dXNlKTsKKwl0LmV4cGlyZXMgPSBqaWZmaWVzX3RvX2Nsb2NrX3QocC0+dG0uZXhwaXJlcyk7CisJUlRBX1BVVChza2IsIFRDQV9HQUNUX1RNLCBzaXplb2YodCksICZ0KTsKKwlyZXR1cm4gc2tiLT5sZW47CisKKyAgICAgIHJ0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgc3RydWN0IHRjX2FjdGlvbl9vcHMgYWN0X2dhY3Rfb3BzID0geworCS5raW5kCQk9CSJnYWN0IiwKKwkudHlwZQkJPQlUQ0FfQUNUX0dBQ1QsCisJLmNhcGFiCQk9CVRDQV9DQVBfTk9ORSwKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCisJLmFjdAkJPQl0Y2ZfZ2FjdCwKKwkuZHVtcAkJPQl0Y2ZfZ2FjdF9kdW1wLAorCS5jbGVhbnVwCT0JdGNmX2dhY3RfY2xlYW51cCwKKwkubG9va3VwCQk9CXRjZl9oYXNoX3NlYXJjaCwKKwkuaW5pdAkJPQl0Y2ZfZ2FjdF9pbml0LAorCS53YWxrCQk9CXRjZl9nZW5lcmljX3dhbGtlcgorfTsKKworTU9EVUxFX0FVVEhPUigiSmFtYWwgSGFkaSBTYWxpbSgyMDAyLTQpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkdlbmVyaWMgQ2xhc3NpZmllciBhY3Rpb25zIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgX19pbml0CitnYWN0X2luaXRfbW9kdWxlKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0dBQ1RfUFJPQgorCXByaW50aygiR0FDVCBwcm9iYWJpbGl0eSBvblxuIik7CisjZWxzZQorCXByaW50aygiR0FDVCBwcm9iYWJpbGl0eSBOT1Qgb25cbiIpOworI2VuZGlmCisJcmV0dXJuIHRjZl9yZWdpc3Rlcl9hY3Rpb24oJmFjdF9nYWN0X29wcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorZ2FjdF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXRjZl91bnJlZ2lzdGVyX2FjdGlvbigmYWN0X2dhY3Rfb3BzKTsKK30KKworbW9kdWxlX2luaXQoZ2FjdF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChnYWN0X2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9pcHQuYyBiL25ldC9zY2hlZC9pcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTE0ZDk5Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjaGVkL2lwdC5jCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICogbmV0L3NjaGVkL2lwdC5jCWlwdGFibGVzIHRhcmdldCBpbnRlcmZhY2UKKyAqCisgKlRPRE86IEFkZCBvdGhlciB0YWJsZXMuIEZvciBub3cgd2Ugb25seSBzdXBwb3J0IHRoZSBpcHY0IHRhYmxlIHRhcmdldHMKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDb3B5cmlnaHQ6CUphbWFsIEhhZGkgU2FsaW0gKDIwMDItNCkKKyAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGNfYWN0L3RjX2lwdC5oPgorI2luY2x1ZGUgPG5ldC90Y19hY3QvdGNfaXB0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKworLyogdXNlIGdlbmVyaWMgaGFzaCB0YWJsZSAqLworI2RlZmluZSBNWV9UQUJfU0laRSAgICAgMTYKKyNkZWZpbmUgTVlfVEFCX01BU0sgICAgIDE1CisKK3N0YXRpYyB1MzIgaWR4X2dlbjsKK3N0YXRpYyBzdHJ1Y3QgdGNmX2lwdCAqdGNmX2lwdF9odFtNWV9UQUJfU0laRV07CisvKiBpcHQgaGFzaCB0YWJsZSBsb2NrICovCitzdGF0aWMgREVGSU5FX1JXTE9DSyhpcHRfbG9jayk7CisKKy8qIG92ZXdycmlkZSB0aGUgZGVmYXVsdHMgKi8KKyNkZWZpbmUgdGNmX3N0CQl0Y2ZfaXB0CisjZGVmaW5lIHRjZl90X2xvY2sJaXB0X2xvY2sKKyNkZWZpbmUgdGNmX2h0CQl0Y2ZfaXB0X2h0CisKKyNkZWZpbmUgQ09ORklHX05FVF9BQ1RfSU5JVAorI2luY2x1ZGUgPG5ldC9wa3RfYWN0Lmg+CisKK3N0YXRpYyBpbnQKK2lwdF9pbml0X3RhcmdldChzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdCwgY2hhciAqdGFibGUsIHVuc2lnbmVkIGludCBob29rKQoreworCXN0cnVjdCBpcHRfdGFyZ2V0ICp0YXJnZXQ7CisJaW50IHJldCA9IDA7CisKKwl0YXJnZXQgPSBpcHRfZmluZF90YXJnZXQodC0+dS51c2VyLm5hbWUsIHQtPnUudXNlci5yZXZpc2lvbik7CisJaWYgKCF0YXJnZXQpCisJCXJldHVybiAtRU5PRU5UOworCisJRFBSSU5USygiaXB0X2luaXRfdGFyZ2V0OiBmb3VuZCAlc1xuIiwgdGFyZ2V0LT5uYW1lKTsKKwl0LT51Lmtlcm5lbC50YXJnZXQgPSB0YXJnZXQ7CisKKwlpZiAodC0+dS5rZXJuZWwudGFyZ2V0LT5jaGVja2VudHJ5CisJICAgICYmICF0LT51Lmtlcm5lbC50YXJnZXQtPmNoZWNrZW50cnkodGFibGUsIE5VTEwsIHQtPmRhdGEsCisJCQkJCSAgICAgICB0LT51LnRhcmdldF9zaXplIC0gc2l6ZW9mKCp0KSwKKwkJCQkJICAgICAgIGhvb2spKSB7CisJCURQUklOVEsoImlwdF9pbml0X3RhcmdldDogY2hlY2sgZmFpbGVkIGZvciBgJXMnLlxuIiwKKwkJCXQtPnUua2VybmVsLnRhcmdldC0+bmFtZSk7CisJCW1vZHVsZV9wdXQodC0+dS5rZXJuZWwudGFyZ2V0LT5tZSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2lwdF9kZXN0cm95X3RhcmdldChzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdCkKK3sKKwlpZiAodC0+dS5rZXJuZWwudGFyZ2V0LT5kZXN0cm95KQorCQl0LT51Lmtlcm5lbC50YXJnZXQtPmRlc3Ryb3kodC0+ZGF0YSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPnUudGFyZ2V0X3NpemUgLSBzaXplb2YoKnQpKTsKKyAgICAgICAgbW9kdWxlX3B1dCh0LT51Lmtlcm5lbC50YXJnZXQtPm1lKTsKK30KKworc3RhdGljIGludAordGNmX2lwdF9yZWxlYXNlKHN0cnVjdCB0Y2ZfaXB0ICpwLCBpbnQgYmluZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpZiAocCkgeworCQlpZiAoYmluZCkKKwkJCXAtPmJpbmRjbnQtLTsKKwkJcC0+cmVmY250LS07CisJCWlmIChwLT5iaW5kY250IDw9IDAgJiYgcC0+cmVmY250IDw9IDApIHsKKwkJCWlwdF9kZXN0cm95X3RhcmdldChwLT50KTsKKwkJCWtmcmVlKHAtPnRuYW1lKTsKKwkJCWtmcmVlKHAtPnQpOworCQkJdGNmX2hhc2hfZGVzdHJveShwKTsKKwkJCXJldCA9IEFDVF9QX0RFTEVURUQ7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAordGNmX2lwdF9pbml0KHN0cnVjdCBydGF0dHIgKnJ0YSwgc3RydWN0IHJ0YXR0ciAqZXN0LCBzdHJ1Y3QgdGNfYWN0aW9uICphLAorICAgICAgICAgICAgIGludCBvdnIsIGludCBiaW5kKQoreworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9JUFRfTUFYXTsKKwlzdHJ1Y3QgdGNmX2lwdCAqcDsKKwlzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdGQsICp0OworCWNoYXIgKnRuYW1lOworCWludCByZXQgPSAwLCBlcnI7CisJdTMyIGhvb2sgPSAwOworCXUzMiBpbmRleCA9IDA7CisKKwlpZiAocnRhID09IE5VTEwgfHwgcnRhdHRyX3BhcnNlX25lc3RlZCh0YiwgVENBX0lQVF9NQVgsIHJ0YSkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh0YltUQ0FfSVBUX0hPT0stMV0gPT0gTlVMTCB8fAorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfSVBUX0hPT0stMV0pIDwgc2l6ZW9mKHUzMikpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh0YltUQ0FfSVBUX1RBUkctMV0gPT0gTlVMTCB8fAorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfSVBUX1RBUkctMV0pIDwgc2l6ZW9mKCp0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdGQgPSAoc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKilSVEFfREFUQSh0YltUQ0FfSVBUX1RBUkctMV0pOworCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfSVBUX1RBUkctMV0pIDwgdGQtPnUudGFyZ2V0X3NpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRiW1RDQV9JUFRfSU5ERVgtMV0gIT0gTlVMTCAmJgorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfSVBUX0lOREVYLTFdKSA+PSBzaXplb2YodTMyKSkKKwkJaW5kZXggPSAqKHUzMiAqKVJUQV9EQVRBKHRiW1RDQV9JUFRfSU5ERVgtMV0pOworCisJcCA9IHRjZl9oYXNoX2NoZWNrKGluZGV4LCBhLCBvdnIsIGJpbmQpOworCWlmIChwID09IE5VTEwpIHsKKwkJcCA9IHRjZl9oYXNoX2NyZWF0ZShpbmRleCwgZXN0LCBhLCBzaXplb2YoKnApLCBvdnIsIGJpbmQpOworCQlpZiAocCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXJldCA9IEFDVF9QX0NSRUFURUQ7CisJfSBlbHNlIHsKKwkJaWYgKCFvdnIpIHsKKwkJCXRjZl9pcHRfcmVsZWFzZShwLCBiaW5kKTsKKwkJCXJldHVybiAtRUVYSVNUOworCQl9CisJfQorCisJaG9vayA9ICoodTMyICopUlRBX0RBVEEodGJbVENBX0lQVF9IT09LLTFdKTsKKworCWVyciA9IC1FTk9NRU07CisJdG5hbWUgPSBrbWFsbG9jKElGTkFNU0laLCBHRlBfS0VSTkVMKTsKKwlpZiAodG5hbWUgPT0gTlVMTCkKKwkJZ290byBlcnIxOworCWlmICh0YltUQ0FfSVBUX1RBQkxFIC0gMV0gPT0gTlVMTCB8fAorCSAgICBydGF0dHJfc3RybGNweSh0bmFtZSwgdGJbVENBX0lQVF9UQUJMRS0xXSwgSUZOQU1TSVopID49IElGTkFNU0laKQorCQlzdHJjcHkodG5hbWUsICJtYW5nbGUiKTsKKworCXQgPSBrbWFsbG9jKHRkLT51LnRhcmdldF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAodCA9PSBOVUxMKQorCQlnb3RvIGVycjI7CisJbWVtY3B5KHQsIHRkLCB0ZC0+dS50YXJnZXRfc2l6ZSk7CisKKwlpZiAoKGVyciA9IGlwdF9pbml0X3RhcmdldCh0LCB0bmFtZSwgaG9vaykpIDwgMCkKKwkJZ290byBlcnIzOworCisJc3Bpbl9sb2NrX2JoKCZwLT5sb2NrKTsKKwlpZiAocmV0ICE9IEFDVF9QX0NSRUFURUQpIHsKKwkJaXB0X2Rlc3Ryb3lfdGFyZ2V0KHAtPnQpOworCQlrZnJlZShwLT50bmFtZSk7CisJCWtmcmVlKHAtPnQpOworCX0KKwlwLT50bmFtZSA9IHRuYW1lOworCXAtPnQgICAgID0gdDsKKwlwLT5ob29rICA9IGhvb2s7CisJc3Bpbl91bmxvY2tfYmgoJnAtPmxvY2spOworCWlmIChyZXQgPT0gQUNUX1BfQ1JFQVRFRCkKKwkJdGNmX2hhc2hfaW5zZXJ0KHApOworCXJldHVybiByZXQ7CisKK2VycjM6CisJa2ZyZWUodCk7CitlcnIyOgorCWtmcmVlKHRuYW1lKTsKK2VycjE6CisJa2ZyZWUocCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAordGNmX2lwdF9jbGVhbnVwKHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kKQoreworCXN0cnVjdCB0Y2ZfaXB0ICpwID0gUFJJVihhLCBpcHQpOworCXJldHVybiB0Y2ZfaXB0X3JlbGVhc2UocCwgYmluZCk7Cit9CisKK3N0YXRpYyBpbnQKK3RjZl9pcHQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphKQoreworCWludCByZXQgPSAwLCByZXN1bHQgPSAwOworCXN0cnVjdCB0Y2ZfaXB0ICpwID0gUFJJVihhLCBpcHQpOworCXN0cnVjdCBza19idWZmICpza2IgPSAqcHNrYjsKKworCWlmIChza2JfY2xvbmVkKHNrYikpIHsKKwkJaWYgKHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCAwLCBHRlBfQVRPTUlDKSkKKwkJCXJldHVybiBUQ19BQ1RfVU5TUEVDOworCX0KKworCXNwaW5fbG9jaygmcC0+bG9jayk7CisKKwlwLT50bS5sYXN0dXNlID0gamlmZmllczsKKwlwLT5ic3RhdHMuYnl0ZXMgKz0gc2tiLT5sZW47CisJcC0+YnN0YXRzLnBhY2tldHMrKzsKKworCS8qIHllcywgd2UgaGF2ZSB0byB3b3JyeSBhYm91dCBib3RoIGluIGFuZCBvdXQgZGV2CisJIHdvcnJ5IGxhdGVyIC0gZGFuZ2VyIC0gdGhpcyBBUEkgc2VlbXMgdG8gaGF2ZSBjaGFuZ2VkCisJIGZyb20gZWFybGllciBrZXJuZWxzICovCisKKwlyZXQgPSBwLT50LT51Lmtlcm5lbC50YXJnZXQtPnRhcmdldCgmc2tiLCBza2ItPmRldiwgTlVMTCwKKwkJCQkJICAgIHAtPmhvb2ssIHAtPnQtPmRhdGEsIE5VTEwpOworCXN3aXRjaCAocmV0KSB7CisJY2FzZSBORl9BQ0NFUFQ6CisJCXJlc3VsdCA9IFRDX0FDVF9PSzsKKwkJYnJlYWs7CisJY2FzZSBORl9EUk9QOgorCQlyZXN1bHQgPSBUQ19BQ1RfU0hPVDsKKwkJcC0+cXN0YXRzLmRyb3BzKys7CisJCWJyZWFrOworCWNhc2UgSVBUX0NPTlRJTlVFOgorCQlyZXN1bHQgPSBUQ19BQ1RfUElQRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50aygiQm9ndXMgbmV0ZmlsdGVyIGNvZGUgJWQgYXNzdW1lIEFDQ0VQVFxuIiwgcmV0KTsKKwkJcmVzdWx0ID0gVENfUE9MSUNFX09LOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJnAtPmxvY2spOworCXJldHVybiByZXN1bHQ7CisKK30KKworc3RhdGljIGludAordGNmX2lwdF9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kLCBpbnQgcmVmKQoreworCXN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICp0OworCXN0cnVjdCB0Y2ZfdCB0bTsKKwlzdHJ1Y3QgdGNfY250IGM7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3QgdGNmX2lwdCAqcCA9IFBSSVYoYSwgaXB0KTsKKworCS8qIGZvciBzaW1wbGUgdGFyZ2V0cyBrZXJuZWwgc2l6ZSA9PSB1c2VyIHNpemUKKwkqKiB1c2VyIG5hbWUgPSB0YXJnZXQgbmFtZQorCSoqIGZvciBmb29scHJvb2YgeW91IG5lZWQgdG8gbm90IGFzc3VtZSB0aGlzCisJKi8KKworCXQgPSBrbWFsbG9jKHAtPnQtPnUudXNlci50YXJnZXRfc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKHQgPT0gTlVMTCkKKwkJZ290byBydGF0dHJfZmFpbHVyZTsKKworCWMuYmluZGNudCA9IHAtPmJpbmRjbnQgLSBiaW5kOworCWMucmVmY250ID0gcC0+cmVmY250IC0gcmVmOworCW1lbWNweSh0LCBwLT50LCBwLT50LT51LnVzZXIudGFyZ2V0X3NpemUpOworCXN0cmNweSh0LT51LnVzZXIubmFtZSwgcC0+dC0+dS5rZXJuZWwudGFyZ2V0LT5uYW1lKTsKKworCURQUklOVEsoIlx0dGNmX2lwdF9kdW1wIHRhYmxlbmFtZSAlcyBsZW5ndGggJWRcbiIsIHAtPnRuYW1lLAorCQlzdHJsZW4ocC0+dG5hbWUpKTsKKwlEUFJJTlRLKCJcdGR1bXAgdGFyZ2V0IG5hbWUgJXMgc2l6ZSAlZCBzaXplIHVzZXIgJWQgIgorCSAgICAgICAgImRhdGFbMF0gJXggZGF0YVsxXSAleFxuIiwgcC0+dC0+dS5rZXJuZWwudGFyZ2V0LT5uYW1lLAorCSAgICAgICAgcC0+dC0+dS50YXJnZXRfc2l6ZSwgcC0+dC0+dS51c2VyLnRhcmdldF9zaXplLAorCSAgICAgICAgcC0+dC0+ZGF0YVswXSwgcC0+dC0+ZGF0YVsxXSk7CisJUlRBX1BVVChza2IsIFRDQV9JUFRfVEFSRywgcC0+dC0+dS51c2VyLnRhcmdldF9zaXplLCB0KTsKKwlSVEFfUFVUKHNrYiwgVENBX0lQVF9JTkRFWCwgNCwgJnAtPmluZGV4KTsKKwlSVEFfUFVUKHNrYiwgVENBX0lQVF9IT09LLCA0LCAmcC0+aG9vayk7CisJUlRBX1BVVChza2IsIFRDQV9JUFRfQ05ULCBzaXplb2Yoc3RydWN0IHRjX2NudCksICZjKTsKKwlSVEFfUFVUKHNrYiwgVENBX0lQVF9UQUJMRSwgSUZOQU1TSVosIHAtPnRuYW1lKTsKKwl0bS5pbnN0YWxsID0gamlmZmllc190b19jbG9ja190KGppZmZpZXMgLSBwLT50bS5pbnN0YWxsKTsKKwl0bS5sYXN0dXNlID0gamlmZmllc190b19jbG9ja190KGppZmZpZXMgLSBwLT50bS5sYXN0dXNlKTsKKwl0bS5leHBpcmVzID0gamlmZmllc190b19jbG9ja190KHAtPnRtLmV4cGlyZXMpOworCVJUQV9QVVQoc2tiLCBUQ0FfSVBUX1RNLCBzaXplb2YgKHRtKSwgJnRtKTsKKwlrZnJlZSh0KTsKKwlyZXR1cm4gc2tiLT5sZW47CisKKyAgICAgIHJ0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJa2ZyZWUodCk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgc3RydWN0IHRjX2FjdGlvbl9vcHMgYWN0X2lwdF9vcHMgPSB7CisJLmtpbmQJCT0JImlwdCIsCisJLnR5cGUJCT0JVENBX0FDVF9JUFQsCisJLmNhcGFiCQk9CVRDQV9DQVBfTk9ORSwKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCisJLmFjdAkJPQl0Y2ZfaXB0LAorCS5kdW1wCQk9CXRjZl9pcHRfZHVtcCwKKwkuY2xlYW51cAk9CXRjZl9pcHRfY2xlYW51cCwKKwkubG9va3VwCQk9CXRjZl9oYXNoX3NlYXJjaCwKKwkuaW5pdAkJPQl0Y2ZfaXB0X2luaXQsCisJLndhbGsJCT0JdGNmX2dlbmVyaWNfd2Fsa2VyCit9OworCitNT0RVTEVfQVVUSE9SKCJKYW1hbCBIYWRpIFNhbGltKDIwMDItNCkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSXB0YWJsZXMgdGFyZ2V0IGFjdGlvbnMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBfX2luaXQKK2lwdF9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiB0Y2ZfcmVnaXN0ZXJfYWN0aW9uKCZhY3RfaXB0X29wcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAoraXB0X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdGNmX3VucmVnaXN0ZXJfYWN0aW9uKCZhY3RfaXB0X29wcyk7Cit9CisKK21vZHVsZV9pbml0KGlwdF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChpcHRfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL21pcnJlZC5jIGIvbmV0L3NjaGVkL21pcnJlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMDljZTMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2NoZWQvbWlycmVkLmMKQEAgLTAsMCArMSwyNzYgQEAKKy8qCisgKiBuZXQvc2NoZWQvbWlycmVkLmMJcGFja2V0IG1pcnJvcmluZyBhbmQgcmVkaXJlY3QgYWN0aW9ucworICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUphbWFsIEhhZGkgU2FsaW0gKDIwMDItNCkKKyAqCisgKiBUT0RPOiBBZGQgaW5ncmVzcyBzdXBwb3J0IChhbmQgc29ja2V0IHJlZGlyZWN0IHN1cHBvcnQpCisgKgorICovCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjX2FjdC90Y19taXJyZWQuaD4KKyNpbmNsdWRlIDxuZXQvdGNfYWN0L3RjX21pcnJlZC5oPgorCisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKworCisvKiB1c2UgZ2VuZXJpYyBoYXNoIHRhYmxlICovCisjZGVmaW5lIE1ZX1RBQl9TSVpFICAgICA4CisjZGVmaW5lIE1ZX1RBQl9NQVNLICAgICAoTVlfVEFCX1NJWkUgLSAxKQorc3RhdGljIHUzMiBpZHhfZ2VuOworc3RhdGljIHN0cnVjdCB0Y2ZfbWlycmVkICp0Y2ZfbWlycmVkX2h0W01ZX1RBQl9TSVpFXTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKG1pcnJlZF9sb2NrKTsKKworLyogb3Zld3JyaWRlIHRoZSBkZWZhdWx0cyAqLworI2RlZmluZSB0Y2Zfc3QJCXRjZl9taXJyZWQKKyNkZWZpbmUgdGNfc3QJCXRjX21pcnJlZAorI2RlZmluZSB0Y2ZfdF9sb2NrCW1pcnJlZF9sb2NrCisjZGVmaW5lIHRjZl9odAkJdGNmX21pcnJlZF9odAorCisjZGVmaW5lIENPTkZJR19ORVRfQUNUX0lOSVQgMQorI2luY2x1ZGUgPG5ldC9wa3RfYWN0Lmg+CisKK3N0YXRpYyBpbmxpbmUgaW50Cit0Y2ZfbWlycmVkX3JlbGVhc2Uoc3RydWN0IHRjZl9taXJyZWQgKnAsIGludCBiaW5kKQoreworCWlmIChwKSB7CisJCWlmIChiaW5kKQorCQkJcC0+YmluZGNudC0tOworCQlwLT5yZWZjbnQtLTsKKwkJaWYoIXAtPmJpbmRjbnQgJiYgcC0+cmVmY250IDw9IDApIHsKKwkJCWRldl9wdXQocC0+ZGV2KTsKKwkJCXRjZl9oYXNoX2Rlc3Ryb3kocCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordGNmX21pcnJlZF9pbml0KHN0cnVjdCBydGF0dHIgKnJ0YSwgc3RydWN0IHJ0YXR0ciAqZXN0LCBzdHJ1Y3QgdGNfYWN0aW9uICphLAorICAgICAgICAgICAgICAgIGludCBvdnIsIGludCBiaW5kKQoreworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9NSVJSRURfTUFYXTsKKwlzdHJ1Y3QgdGNfbWlycmVkICpwYXJtOworCXN0cnVjdCB0Y2ZfbWlycmVkICpwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCWludCByZXQgPSAwOworCWludCBva19wdXNoID0gMDsKKworCWlmIChydGEgPT0gTlVMTCB8fCBydGF0dHJfcGFyc2VfbmVzdGVkKHRiLCBUQ0FfTUlSUkVEX01BWCwgcnRhKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRiW1RDQV9NSVJSRURfUEFSTVMtMV0gPT0gTlVMTCB8fAorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfTUlSUkVEX1BBUk1TLTFdKSA8IHNpemVvZigqcGFybSkpCisJCXJldHVybiAtRUlOVkFMOworCXBhcm0gPSBSVEFfREFUQSh0YltUQ0FfTUlSUkVEX1BBUk1TLTFdKTsKKworCWlmIChwYXJtLT5pZmluZGV4KSB7CisJCWRldiA9IF9fZGV2X2dldF9ieV9pbmRleChwYXJtLT5pZmluZGV4KTsKKwkJaWYgKGRldiA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCXN3aXRjaCAoZGV2LT50eXBlKSB7CisJCQljYXNlIEFSUEhSRF9UVU5ORUw6CisJCQljYXNlIEFSUEhSRF9UVU5ORUw2OgorCQkJY2FzZSBBUlBIUkRfU0lUOgorCQkJY2FzZSBBUlBIUkRfSVBHUkU6CisJCQljYXNlIEFSUEhSRF9WT0lEOgorCQkJY2FzZSBBUlBIUkRfTk9ORToKKwkJCQlva19wdXNoID0gMDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJb2tfcHVzaCA9IDE7CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlwID0gdGNmX2hhc2hfY2hlY2socGFybS0+aW5kZXgsIGEsIG92ciwgYmluZCk7CisJaWYgKHAgPT0gTlVMTCkgeworCQlpZiAoIXBhcm0tPmlmaW5kZXgpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcCA9IHRjZl9oYXNoX2NyZWF0ZShwYXJtLT5pbmRleCwgZXN0LCBhLCBzaXplb2YoKnApLCBvdnIsIGJpbmQpOworCQlpZiAocCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXJldCA9IEFDVF9QX0NSRUFURUQ7CisJfSBlbHNlIHsKKwkJaWYgKCFvdnIpIHsKKwkJCXRjZl9taXJyZWRfcmVsZWFzZShwLCBiaW5kKTsKKwkJCXJldHVybiAtRUVYSVNUOworCQl9CisJfQorCisJc3Bpbl9sb2NrX2JoKCZwLT5sb2NrKTsKKwlwLT5hY3Rpb24gPSBwYXJtLT5hY3Rpb247CisJcC0+ZWFjdGlvbiA9IHBhcm0tPmVhY3Rpb247CisJaWYgKHBhcm0tPmlmaW5kZXgpIHsKKwkJcC0+aWZpbmRleCA9IHBhcm0tPmlmaW5kZXg7CisJCWlmIChyZXQgIT0gQUNUX1BfQ1JFQVRFRCkKKwkJCWRldl9wdXQocC0+ZGV2KTsKKwkJcC0+ZGV2ID0gZGV2OworCQlkZXZfaG9sZChkZXYpOworCQlwLT5va19wdXNoID0gb2tfcHVzaDsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnAtPmxvY2spOworCWlmIChyZXQgPT0gQUNUX1BfQ1JFQVRFRCkKKwkJdGNmX2hhc2hfaW5zZXJ0KHApOworCisJRFBSSU5USygidGNmX21pcnJlZF9pbml0IGluZGV4ICVkIGFjdGlvbiAlZCBlYWN0aW9uICVkIGRldmljZSAlcyAiCisJICAgICAgICAiaWZpbmRleCAlZFxuIiwgcGFybS0+aW5kZXgsIHBhcm0tPmFjdGlvbiwgcGFybS0+ZWFjdGlvbiwKKwkgICAgICAgIGRldi0+bmFtZSwgcGFybS0+aWZpbmRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAordGNmX21pcnJlZF9jbGVhbnVwKHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kKQoreworCXN0cnVjdCB0Y2ZfbWlycmVkICpwID0gUFJJVihhLCBtaXJyZWQpOworCisJaWYgKHAgIT0gTlVMTCkKKwkJcmV0dXJuIHRjZl9taXJyZWRfcmVsZWFzZShwLCBiaW5kKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordGNmX21pcnJlZChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEpCit7CisJc3RydWN0IHRjZl9taXJyZWQgKnAgPSBQUklWKGEsIG1pcnJlZCk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpwc2tiOworCXUzMiBhdCA9IEdfVENfQVQoc2tiLT50Y192ZXJkKTsKKworCXNwaW5fbG9jaygmcC0+bG9jayk7CisKKwlkZXYgPSBwLT5kZXY7CisJcC0+dG0ubGFzdHVzZSA9IGppZmZpZXM7CisKKwlpZiAoIShkZXYtPmZsYWdzJklGRl9VUCkgKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoIm1pcnJlZCB0byBIb3VzdG9uOiBkZXZpY2UgJXMgaXMgZ29uZSFcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKK2JhZF9taXJyZWQ6CisJCWlmIChza2IyICE9IE5VTEwpCisJCQlrZnJlZV9za2Ioc2tiMik7CisJCXAtPnFzdGF0cy5vdmVybGltaXRzKys7CisJCXAtPmJzdGF0cy5ieXRlcyArPSBza2ItPmxlbjsKKwkJcC0+YnN0YXRzLnBhY2tldHMrKzsKKwkJc3Bpbl91bmxvY2soJnAtPmxvY2spOworCQkvKiBzaG91bGQgd2UgYmUgYXNraW5nIGZvciBwYWNrZXQgdG8gYmUgZHJvcHBlZD8KKwkJICogbWF5IG1ha2Ugc2Vuc2UgZm9yIHJlZGlyZWN0IGNhc2Ugb25seQorCQkqLworCQlyZXR1cm4gVENfQUNUX1NIT1Q7CisJfQorCisJc2tiMiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCWlmIChza2IyID09IE5VTEwpCisJCWdvdG8gYmFkX21pcnJlZDsKKwlpZiAocC0+ZWFjdGlvbiAhPSBUQ0FfRUdSRVNTX01JUlJPUiAmJiBwLT5lYWN0aW9uICE9IFRDQV9FR1JFU1NfUkVESVIpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50aygidGNmX21pcnJlZCB1bmtub3duIGFjdGlvbiAlZFxuIiwgcC0+ZWFjdGlvbik7CisJCWdvdG8gYmFkX21pcnJlZDsKKwl9CisKKwlwLT5ic3RhdHMuYnl0ZXMgKz0gc2tiMi0+bGVuOworCXAtPmJzdGF0cy5wYWNrZXRzKys7CisJaWYgKCEoYXQgJiBBVF9FR1JFU1MpKQorCQlpZiAocC0+b2tfcHVzaCkKKwkJCXNrYl9wdXNoKHNrYjIsIHNrYjItPmRldi0+aGFyZF9oZWFkZXJfbGVuKTsKKworCS8qIG1pcnJvciBpcyBhbHdheXMgc3dhbGxvd2VkICovCisJaWYgKHAtPmVhY3Rpb24gIT0gVENBX0VHUkVTU19NSVJST1IpCisJCXNrYjItPnRjX3ZlcmQgPSBTRVRfVENfRlJPTShza2IyLT50Y192ZXJkLCBhdCk7CisKKwlza2IyLT5kZXYgPSBkZXY7CisJc2tiMi0+aW5wdXRfZGV2ID0gc2tiLT5kZXY7CisJZGV2X3F1ZXVlX3htaXQoc2tiMik7CisJc3Bpbl91bmxvY2soJnAtPmxvY2spOworCXJldHVybiBwLT5hY3Rpb247Cit9CisKK3N0YXRpYyBpbnQKK3RjZl9taXJyZWRfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLCBpbnQgYmluZCwgaW50IHJlZikKK3sKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXN0cnVjdCB0Y19taXJyZWQgb3B0OworCXN0cnVjdCB0Y2ZfbWlycmVkICpwID0gUFJJVihhLCBtaXJyZWQpOworCXN0cnVjdCB0Y2ZfdCB0OworCisJb3B0LmluZGV4ID0gcC0+aW5kZXg7CisJb3B0LmFjdGlvbiA9IHAtPmFjdGlvbjsKKwlvcHQucmVmY250ID0gcC0+cmVmY250IC0gcmVmOworCW9wdC5iaW5kY250ID0gcC0+YmluZGNudCAtIGJpbmQ7CisJb3B0LmVhY3Rpb24gPSBwLT5lYWN0aW9uOworCW9wdC5pZmluZGV4ID0gcC0+aWZpbmRleDsKKwlEUFJJTlRLKCJ0Y2ZfbWlycmVkX2R1bXAgaW5kZXggJWQgYWN0aW9uICVkIGVhY3Rpb24gJWQgaWZpbmRleCAlZFxuIiwKKwkgICAgICAgICBwLT5pbmRleCwgcC0+YWN0aW9uLCBwLT5lYWN0aW9uLCBwLT5pZmluZGV4KTsKKwlSVEFfUFVUKHNrYiwgVENBX01JUlJFRF9QQVJNUywgc2l6ZW9mKG9wdCksICZvcHQpOworCXQuaW5zdGFsbCA9IGppZmZpZXNfdG9fY2xvY2tfdChqaWZmaWVzIC0gcC0+dG0uaW5zdGFsbCk7CisJdC5sYXN0dXNlID0gamlmZmllc190b19jbG9ja190KGppZmZpZXMgLSBwLT50bS5sYXN0dXNlKTsKKwl0LmV4cGlyZXMgPSBqaWZmaWVzX3RvX2Nsb2NrX3QocC0+dG0uZXhwaXJlcyk7CisJUlRBX1BVVChza2IsIFRDQV9NSVJSRURfVE0sIHNpemVvZih0KSwgJnQpOworCXJldHVybiBza2ItPmxlbjsKKworICAgICAgcnRhdHRyX2ZhaWx1cmU6CisJc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGNfYWN0aW9uX29wcyBhY3RfbWlycmVkX29wcyA9IHsKKwkua2luZAkJPQkibWlycmVkIiwKKwkudHlwZQkJPQlUQ0FfQUNUX01JUlJFRCwKKwkuY2FwYWIJCT0JVENBX0NBUF9OT05FLAorCS5vd25lcgkJPQlUSElTX01PRFVMRSwKKwkuYWN0CQk9CXRjZl9taXJyZWQsCisJLmR1bXAJCT0JdGNmX21pcnJlZF9kdW1wLAorCS5jbGVhbnVwCT0JdGNmX21pcnJlZF9jbGVhbnVwLAorCS5sb29rdXAJCT0JdGNmX2hhc2hfc2VhcmNoLAorCS5pbml0CQk9CXRjZl9taXJyZWRfaW5pdCwKKwkud2FsawkJPQl0Y2ZfZ2VuZXJpY193YWxrZXIKK307CisKK01PRFVMRV9BVVRIT1IoIkphbWFsIEhhZGkgU2FsaW0oMjAwMikiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGV2aWNlIE1pcnJvci9yZWRpcmVjdCBhY3Rpb25zIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgX19pbml0CittaXJyZWRfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlwcmludGsoIk1pcnJvci9yZWRpcmVjdCBhY3Rpb24gb25cbiIpOworCXJldHVybiB0Y2ZfcmVnaXN0ZXJfYWN0aW9uKCZhY3RfbWlycmVkX29wcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorbWlycmVkX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdGNmX3VucmVnaXN0ZXJfYWN0aW9uKCZhY3RfbWlycmVkX29wcyk7Cit9CisKK21vZHVsZV9pbml0KG1pcnJlZF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChtaXJyZWRfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3BlZGl0LmMgYi9uZXQvc2NoZWQvcGVkaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzhiZTZhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjaGVkL3BlZGl0LmMKQEAgLTAsMCArMSwyODggQEAKKy8qCisgKiBuZXQvc2NoZWQvcGVkaXQuYwlHZW5lcmljIHBhY2tldCBlZGl0b3IKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglKYW1hbCBIYWRpIFNhbGltICgyMDAyLTQpCisgKi8KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGNfYWN0L3RjX3BlZGl0Lmg+CisjaW5jbHVkZSA8bmV0L3RjX2FjdC90Y19wZWRpdC5oPgorCisKKyNkZWZpbmUgUEVESVRfREVCIDEKKworLyogdXNlIGdlbmVyaWMgaGFzaCB0YWJsZSAqLworI2RlZmluZSBNWV9UQUJfU0laRSAgICAgMTYKKyNkZWZpbmUgTVlfVEFCX01BU0sgICAgIDE1CitzdGF0aWMgdTMyIGlkeF9nZW47CitzdGF0aWMgc3RydWN0IHRjZl9wZWRpdCAqdGNmX3BlZGl0X2h0W01ZX1RBQl9TSVpFXTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKHBlZGl0X2xvY2spOworCisjZGVmaW5lIHRjZl9zdAkJdGNmX3BlZGl0CisjZGVmaW5lIHRjX3N0CQl0Y19wZWRpdAorI2RlZmluZSB0Y2ZfdF9sb2NrCXBlZGl0X2xvY2sKKyNkZWZpbmUgdGNmX2h0CQl0Y2ZfcGVkaXRfaHQKKworI2RlZmluZSBDT05GSUdfTkVUX0FDVF9JTklUIDEKKyNpbmNsdWRlIDxuZXQvcGt0X2FjdC5oPgorCitzdGF0aWMgaW50Cit0Y2ZfcGVkaXRfaW5pdChzdHJ1Y3QgcnRhdHRyICpydGEsIHN0cnVjdCBydGF0dHIgKmVzdCwgc3RydWN0IHRjX2FjdGlvbiAqYSwKKyAgICAgICAgICAgICAgIGludCBvdnIsIGludCBiaW5kKQoreworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9QRURJVF9NQVhdOworCXN0cnVjdCB0Y19wZWRpdCAqcGFybTsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgdGNmX3BlZGl0ICpwOworCXN0cnVjdCB0Y19wZWRpdF9rZXkgKmtleXMgPSBOVUxMOworCWludCBrc2l6ZTsKKworCWlmIChydGEgPT0gTlVMTCB8fCBydGF0dHJfcGFyc2VfbmVzdGVkKHRiLCBUQ0FfUEVESVRfTUFYLCBydGEpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGJbVENBX1BFRElUX1BBUk1TIC0gMV0gPT0gTlVMTCB8fAorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfUEVESVRfUEFSTVMtMV0pIDwgc2l6ZW9mKCpwYXJtKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcGFybSA9IFJUQV9EQVRBKHRiW1RDQV9QRURJVF9QQVJNUy0xXSk7CisJa3NpemUgPSBwYXJtLT5ua2V5cyAqIHNpemVvZihzdHJ1Y3QgdGNfcGVkaXRfa2V5KTsKKwlpZiAoUlRBX1BBWUxPQUQodGJbVENBX1BFRElUX1BBUk1TLTFdKSA8IHNpemVvZigqcGFybSkgKyBrc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwID0gdGNmX2hhc2hfY2hlY2socGFybS0+aW5kZXgsIGEsIG92ciwgYmluZCk7CisJaWYgKHAgPT0gTlVMTCkgeworCQlpZiAoIXBhcm0tPm5rZXlzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXAgPSB0Y2ZfaGFzaF9jcmVhdGUocGFybS0+aW5kZXgsIGVzdCwgYSwgc2l6ZW9mKCpwKSwgb3ZyLCBiaW5kKTsKKwkJaWYgKHAgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlrZXlzID0ga21hbGxvYyhrc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmIChrZXlzID09IE5VTEwpIHsKKwkJCWtmcmVlKHApOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJcmV0ID0gQUNUX1BfQ1JFQVRFRDsKKwl9IGVsc2UgeworCQlpZiAoIW92cikgeworCQkJdGNmX2hhc2hfcmVsZWFzZShwLCBiaW5kKTsKKwkJCXJldHVybiAtRUVYSVNUOworCQl9CisJCWlmIChwLT5ua2V5cyAmJiBwLT5ua2V5cyAhPSBwYXJtLT5ua2V5cykgeworCQkJa2V5cyA9IGttYWxsb2Moa3NpemUsIEdGUF9LRVJORUwpOworCQkJaWYgKGtleXMgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCXNwaW5fbG9ja19iaCgmcC0+bG9jayk7CisJcC0+ZmxhZ3MgPSBwYXJtLT5mbGFnczsKKwlwLT5hY3Rpb24gPSBwYXJtLT5hY3Rpb247CisJaWYgKGtleXMpIHsKKwkJa2ZyZWUocC0+a2V5cyk7CisJCXAtPmtleXMgPSBrZXlzOworCQlwLT5ua2V5cyA9IHBhcm0tPm5rZXlzOworCX0KKwltZW1jcHkocC0+a2V5cywgcGFybS0+a2V5cywga3NpemUpOworCXNwaW5fdW5sb2NrX2JoKCZwLT5sb2NrKTsKKwlpZiAocmV0ID09IEFDVF9QX0NSRUFURUQpCisJCXRjZl9oYXNoX2luc2VydChwKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50Cit0Y2ZfcGVkaXRfY2xlYW51cChzdHJ1Y3QgdGNfYWN0aW9uICphLCBpbnQgYmluZCkKK3sKKwlzdHJ1Y3QgdGNmX3BlZGl0ICpwID0gUFJJVihhLCBwZWRpdCk7CisKKwlpZiAocCAhPSBOVUxMKSB7CisJCXN0cnVjdCB0Y19wZWRpdF9rZXkgKmtleXMgPSBwLT5rZXlzOworCQlpZiAodGNmX2hhc2hfcmVsZWFzZShwLCBiaW5kKSkgeworCQkJa2ZyZWUoa2V5cyk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordGNmX3BlZGl0KHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IHRjX2FjdGlvbiAqYSkKK3sKKwlzdHJ1Y3QgdGNmX3BlZGl0ICpwID0gUFJJVihhLCBwZWRpdCk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpwc2tiOworCWludCBpLCBtdW5nZWQgPSAwOworCXU4ICpwcHRyOworCisJaWYgKCEoc2tiLT50Y192ZXJkICYgVENfT0syTVVOR0UpKSB7CisJCS8qIHNob3VsZCB3ZSBzZXQgc2tiLT5jbG9uZWQ/ICovCisJCWlmIChwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgMCwgR0ZQX0FUT01JQykpIHsKKwkJCXJldHVybiBwLT5hY3Rpb247CisJCX0KKwl9CisKKwlwcHRyID0gc2tiLT5uaC5yYXc7CisKKwlzcGluX2xvY2soJnAtPmxvY2spOworCisJcC0+dG0ubGFzdHVzZSA9IGppZmZpZXM7CisKKwlpZiAocC0+bmtleXMgPiAwKSB7CisJCXN0cnVjdCB0Y19wZWRpdF9rZXkgKnRrZXkgPSBwLT5rZXlzOworCisJCWZvciAoaSA9IHAtPm5rZXlzOyBpID4gMDsgaS0tLCB0a2V5KyspIHsKKwkJCXUzMiAqcHRyOworCQkJaW50IG9mZnNldCA9IHRrZXktPm9mZjsKKworCQkJaWYgKHRrZXktPm9mZm1hc2spIHsKKwkJCQlpZiAoc2tiLT5sZW4gPiB0a2V5LT5hdCkgeworCQkJCQkgY2hhciAqaiA9IHBwdHIgKyB0a2V5LT5hdDsKKwkJCQkJIG9mZnNldCArPSAoKCpqICYgdGtleS0+b2ZmbWFzaykgPj4gCisJCQkJCSAgICAgICAgICAgdGtleS0+c2hpZnQpOworCQkJCX0gZWxzZSB7CisJCQkJCWdvdG8gYmFkOworCQkJCX0KKwkJCX0KKworCQkJaWYgKG9mZnNldCAlIDQpIHsKKwkJCQlwcmludGsoIm9mZnNldCBtdXN0IGJlIG9uIDMyIGJpdCBib3VuZGFyaWVzXG4iKTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmIChza2ItPmxlbiA8IDAgfHwgKG9mZnNldCA+IDAgJiYgb2Zmc2V0ID4gc2tiLT5sZW4pKSB7CisJCQkJcHJpbnRrKCJvZmZzZXQgJWQgY2FudCBleGNlZWQgcGt0IGxlbmd0aCAlZFxuIiwKKwkJCQkgICAgICAgb2Zmc2V0LCBza2ItPmxlbik7CisJCQkJZ290byBiYWQ7CisJCQl9CisKKwkJCXB0ciA9ICh1MzIgKikocHB0citvZmZzZXQpOworCQkJLyoganVzdCBkbyBpdCwgYmFieSAqLworCQkJKnB0ciA9ICgoKnB0ciAmIHRrZXktPm1hc2spIF4gdGtleS0+dmFsKTsKKwkJCW11bmdlZCsrOworCQl9CisJCQorCQlpZiAobXVuZ2VkKQorCQkJc2tiLT50Y192ZXJkID0gU0VUX1RDX01VTkdFRChza2ItPnRjX3ZlcmQpOworCQlnb3RvIGRvbmU7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJwZWRpdCBCVUc6IGluZGV4ICVkXG4iLHAtPmluZGV4KTsKKwl9CisKK2JhZDoKKwlwLT5xc3RhdHMub3ZlcmxpbWl0cysrOworZG9uZToKKwlwLT5ic3RhdHMuYnl0ZXMgKz0gc2tiLT5sZW47CisJcC0+YnN0YXRzLnBhY2tldHMrKzsKKwlzcGluX3VubG9jaygmcC0+bG9jayk7CisJcmV0dXJuIHAtPmFjdGlvbjsKK30KKworc3RhdGljIGludAordGNmX3BlZGl0X2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjX2FjdGlvbiAqYSxpbnQgYmluZCwgaW50IHJlZikKK3sKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXN0cnVjdCB0Y19wZWRpdCAqb3B0OworCXN0cnVjdCB0Y2ZfcGVkaXQgKnAgPSBQUklWKGEsIHBlZGl0KTsKKwlzdHJ1Y3QgdGNmX3QgdDsKKwlpbnQgczsgCisJCQorCXMgPSBzaXplb2YoKm9wdCkgKyBwLT5ua2V5cyAqIHNpemVvZihzdHJ1Y3QgdGNfcGVkaXRfa2V5KTsKKworCS8qIG5ldGxpbmsgc3BpbmxvY2tzIGhlbGQgYWJvdmUgdXMgLSBtdXN0IHVzZSBBVE9NSUMgKi8KKwlvcHQgPSBrbWFsbG9jKHMsIEdGUF9BVE9NSUMpOworCWlmIChvcHQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9CVUZTOworCW1lbXNldChvcHQsIDAsIHMpOworCisJbWVtY3B5KG9wdC0+a2V5cywgcC0+a2V5cywgcC0+bmtleXMgKiBzaXplb2Yoc3RydWN0IHRjX3BlZGl0X2tleSkpOworCW9wdC0+aW5kZXggPSBwLT5pbmRleDsKKwlvcHQtPm5rZXlzID0gcC0+bmtleXM7CisJb3B0LT5mbGFncyA9IHAtPmZsYWdzOworCW9wdC0+YWN0aW9uID0gcC0+YWN0aW9uOworCW9wdC0+cmVmY250ID0gcC0+cmVmY250IC0gcmVmOworCW9wdC0+YmluZGNudCA9IHAtPmJpbmRjbnQgLSBiaW5kOworCisKKyNpZmRlZiBQRURJVF9ERUIKKwl7ICAgICAgICAgICAgICAgIAorCQkvKiBEZWJ1ZyAtIGdldCByaWQgb2YgbGF0ZXIgKi8KKwkJaW50IGk7CisJCXN0cnVjdCB0Y19wZWRpdF9rZXkgKmtleSA9IG9wdC0+a2V5czsKKworCQlmb3IgKGk9MDsgaTxvcHQtPm5rZXlzOyBpKyssIGtleSsrKSB7CisJCQlwcmludGsoICJcbiBrZXkgIyVkIixpKTsKKwkJCXByaW50ayggIiAgYXQgJWQ6IHZhbCAlMDh4IG1hc2sgJTA4eCIsCisJCQkodW5zaWduZWQgaW50KWtleS0+b2ZmLAorCQkJKHVuc2lnbmVkIGludClrZXktPnZhbCwKKwkJCSh1bnNpZ25lZCBpbnQpa2V5LT5tYXNrKTsKKwkJfQorCX0KKyNlbmRpZgorCisJUlRBX1BVVChza2IsIFRDQV9QRURJVF9QQVJNUywgcywgb3B0KTsKKwl0Lmluc3RhbGwgPSBqaWZmaWVzX3RvX2Nsb2NrX3QoamlmZmllcyAtIHAtPnRtLmluc3RhbGwpOworCXQubGFzdHVzZSA9IGppZmZpZXNfdG9fY2xvY2tfdChqaWZmaWVzIC0gcC0+dG0ubGFzdHVzZSk7CisJdC5leHBpcmVzID0gamlmZmllc190b19jbG9ja190KHAtPnRtLmV4cGlyZXMpOworCVJUQV9QVVQoc2tiLCBUQ0FfUEVESVRfVE0sIHNpemVvZih0KSwgJnQpOworCXJldHVybiBza2ItPmxlbjsKKworcnRhdHRyX2ZhaWx1cmU6CisJc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYworc3RydWN0IHRjX2FjdGlvbl9vcHMgYWN0X3BlZGl0X29wcyA9IHsKKwkua2luZAkJPQkicGVkaXQiLAorCS50eXBlCQk9CVRDQV9BQ1RfUEVESVQsCisJLmNhcGFiCQk9CVRDQV9DQVBfTk9ORSwKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCisJLmFjdAkJPQl0Y2ZfcGVkaXQsCisJLmR1bXAJCT0JdGNmX3BlZGl0X2R1bXAsCisJLmNsZWFudXAJPQl0Y2ZfcGVkaXRfY2xlYW51cCwKKwkubG9va3VwCQk9CXRjZl9oYXNoX3NlYXJjaCwKKwkuaW5pdAkJPQl0Y2ZfcGVkaXRfaW5pdCwKKwkud2FsawkJPQl0Y2ZfZ2VuZXJpY193YWxrZXIKK307CisKK01PRFVMRV9BVVRIT1IoIkphbWFsIEhhZGkgU2FsaW0oMjAwMi00KSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJHZW5lcmljIFBhY2tldCBFZGl0b3IgYWN0aW9ucyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IF9faW5pdAorcGVkaXRfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gdGNmX3JlZ2lzdGVyX2FjdGlvbigmYWN0X3BlZGl0X29wcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorcGVkaXRfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl0Y2ZfdW5yZWdpc3Rlcl9hY3Rpb24oJmFjdF9wZWRpdF9vcHMpOworfQorCittb2R1bGVfaW5pdChwZWRpdF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChwZWRpdF9jbGVhbnVwX21vZHVsZSk7CisKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9wb2xpY2UuYyBiL25ldC9zY2hlZC9wb2xpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDM1NDVmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjaGVkL3BvbGljZS5jCkBAIC0wLDAgKzEsNjEyIEBACisvKgorICogbmV0L3NjaGVkL3BvbGljZS5jCUlucHV0IHBvbGljZSBmaWx0ZXIuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICogCQlKIEhhZGkgU2FsaW0gKGFjdGlvbiBjaGFuZ2VzKQorICovCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9hY3RfYXBpLmg+CisKKyNkZWZpbmUgTDJUKHAsTCkgICAoKHApLT5SX3RhYi0+ZGF0YVsoTCk+PihwKS0+Ul90YWItPnJhdGUuY2VsbF9sb2ddKQorI2RlZmluZSBMMlRfUChwLEwpICgocCktPlBfdGFiLT5kYXRhWyhMKT4+KHApLT5QX3RhYi0+cmF0ZS5jZWxsX2xvZ10pCisjZGVmaW5lIFBSSVYoYSkgKChzdHJ1Y3QgdGNmX3BvbGljZSAqKSAoYSktPnByaXYpCisKKy8qIHVzZSBnZW5lcmljIGhhc2ggdGFibGUgKi8KKyNkZWZpbmUgTVlfVEFCX1NJWkUgICAgIDE2CisjZGVmaW5lIE1ZX1RBQl9NQVNLICAgICAxNQorc3RhdGljIHUzMiBpZHhfZ2VuOworc3RhdGljIHN0cnVjdCB0Y2ZfcG9saWNlICp0Y2ZfcG9saWNlX2h0W01ZX1RBQl9TSVpFXTsKKy8qIFBvbGljZXIgaGFzaCB0YWJsZSBsb2NrICovCitzdGF0aWMgREVGSU5FX1JXTE9DSyhwb2xpY2VfbG9jayk7CisKKy8qIEVhY2ggcG9saWNlciBpcyBzZXJpYWxpemVkIGJ5IGl0cyBpbmRpdmlkdWFsIHNwaW5sb2NrICovCisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIHRjZl9wb2xpY2VfaGFzaCh1MzIgaW5kZXgpCit7CisJcmV0dXJuIGluZGV4JjB4RjsKK30KKworc3RhdGljIF9faW5saW5lX18gc3RydWN0IHRjZl9wb2xpY2UgKiB0Y2ZfcG9saWNlX2xvb2t1cCh1MzIgaW5kZXgpCit7CisJc3RydWN0IHRjZl9wb2xpY2UgKnA7CisKKwlyZWFkX2xvY2soJnBvbGljZV9sb2NrKTsKKwlmb3IgKHAgPSB0Y2ZfcG9saWNlX2h0W3RjZl9wb2xpY2VfaGFzaChpbmRleCldOyBwOyBwID0gcC0+bmV4dCkgeworCQlpZiAocC0+aW5kZXggPT0gaW5kZXgpCisJCQlicmVhazsKKwl9CisJcmVhZF91bmxvY2soJnBvbGljZV9sb2NrKTsKKwlyZXR1cm4gcDsKK30KKworI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAorc3RhdGljIGludCB0Y2ZfZ2VuZXJpY193YWxrZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsIHN0cnVjdCB0Y19hY3Rpb24gKmEpCit7CisJc3RydWN0IHRjZl9wb2xpY2UgKnA7CisJaW50IGVyciA9IDAsIGluZGV4ID0gLTEsIGkgPSAwLCBzX2kgPSAwLCBuX2kgPSAwOworCXN0cnVjdCBydGF0dHIgKnI7CisKKwlyZWFkX2xvY2soJnBvbGljZV9sb2NrKTsKKworCXNfaSA9IGNiLT5hcmdzWzBdOworCisJZm9yIChpID0gMDsgaSA8IE1ZX1RBQl9TSVpFOyBpKyspIHsKKwkJcCA9IHRjZl9wb2xpY2VfaHRbdGNmX3BvbGljZV9oYXNoKGkpXTsKKworCQlmb3IgKDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJCWluZGV4Kys7CisJCQlpZiAoaW5kZXggPCBzX2kpCisJCQkJY29udGludWU7CisJCQlhLT5wcml2ID0gcDsKKwkJCWEtPm9yZGVyID0gaW5kZXg7CisJCQlyID0gKHN0cnVjdCBydGF0dHIqKSBza2ItPnRhaWw7CisJCQlSVEFfUFVUKHNrYiwgYS0+b3JkZXIsIDAsIE5VTEwpOworCQkJaWYgKHR5cGUgPT0gUlRNX0RFTEFDVElPTikKKwkJCQllcnIgPSB0Y2ZfYWN0aW9uX2R1bXBfMShza2IsIGEsIDAsIDEpOworCQkJZWxzZQorCQkJCWVyciA9IHRjZl9hY3Rpb25fZHVtcF8xKHNrYiwgYSwgMCwgMCk7CisJCQlpZiAoZXJyIDwgMCkgeworCQkJCWluZGV4LS07CisJCQkJc2tiX3RyaW0oc2tiLCAodTgqKXIgLSBza2ItPmRhdGEpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCXItPnJ0YV9sZW4gPSBza2ItPnRhaWwgLSAodTgqKXI7CisJCQluX2krKzsKKwkJfQorCX0KK2RvbmU6CisJcmVhZF91bmxvY2soJnBvbGljZV9sb2NrKTsKKwlpZiAobl9pKQorCQljYi0+YXJnc1swXSArPSBuX2k7CisJcmV0dXJuIG5faTsKKworcnRhdHRyX2ZhaWx1cmU6CisJc2tiX3RyaW0oc2tiLCAodTgqKXIgLSBza2ItPmRhdGEpOworCWdvdG8gZG9uZTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3RjZl9oYXNoX3NlYXJjaChzdHJ1Y3QgdGNfYWN0aW9uICphLCB1MzIgaW5kZXgpCit7CisJc3RydWN0IHRjZl9wb2xpY2UgKnAgPSB0Y2ZfcG9saWNlX2xvb2t1cChpbmRleCk7CisKKwlpZiAocCAhPSBOVUxMKSB7CisJCWEtPnByaXYgPSBwOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQlyZXR1cm4gMDsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSB1MzIgdGNmX3BvbGljZV9uZXdfaW5kZXgodm9pZCkKK3sKKwlkbyB7CisJCWlmICgrK2lkeF9nZW4gPT0gMCkKKwkJCWlkeF9nZW4gPSAxOworCX0gd2hpbGUgKHRjZl9wb2xpY2VfbG9va3VwKGlkeF9nZW4pKTsKKworCXJldHVybiBpZHhfZ2VuOworfQorCit2b2lkIHRjZl9wb2xpY2VfZGVzdHJveShzdHJ1Y3QgdGNmX3BvbGljZSAqcCkKK3sKKwl1bnNpZ25lZCBoID0gdGNmX3BvbGljZV9oYXNoKHAtPmluZGV4KTsKKwlzdHJ1Y3QgdGNmX3BvbGljZSAqKnAxcDsKKwkKKwlmb3IgKHAxcCA9ICZ0Y2ZfcG9saWNlX2h0W2hdOyAqcDFwOyBwMXAgPSAmKCpwMXApLT5uZXh0KSB7CisJCWlmICgqcDFwID09IHApIHsKKwkJCXdyaXRlX2xvY2tfYmgoJnBvbGljZV9sb2NrKTsKKwkJCSpwMXAgPSBwLT5uZXh0OworCQkJd3JpdGVfdW5sb2NrX2JoKCZwb2xpY2VfbG9jayk7CisjaWZkZWYgQ09ORklHX05FVF9FU1RJTUFUT1IKKwkJCWdlbl9raWxsX2VzdGltYXRvcigmcC0+YnN0YXRzLCAmcC0+cmF0ZV9lc3QpOworI2VuZGlmCisJCQlpZiAocC0+Ul90YWIpCisJCQkJcWRpc2NfcHV0X3J0YWIocC0+Ul90YWIpOworCQkJaWYgKHAtPlBfdGFiKQorCQkJCXFkaXNjX3B1dF9ydGFiKHAtPlBfdGFiKTsKKwkJCWtmcmVlKHApOworCQkJcmV0dXJuOworCQl9CisJfQorCUJVR19UUkFQKDApOworfQorCisjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCitzdGF0aWMgaW50IHRjZl9hY3RfcG9saWNlX2xvY2F0ZShzdHJ1Y3QgcnRhdHRyICpydGEsIHN0cnVjdCBydGF0dHIgKmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBvdnIsIGludCBiaW5kKQoreworCXVuc2lnbmVkIGg7CisJaW50IHJldCA9IDAsIGVycjsKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfUE9MSUNFX01BWF07CisJc3RydWN0IHRjX3BvbGljZSAqcGFybTsKKwlzdHJ1Y3QgdGNmX3BvbGljZSAqcDsKKwlzdHJ1Y3QgcWRpc2NfcmF0ZV90YWJsZSAqUl90YWIgPSBOVUxMLCAqUF90YWIgPSBOVUxMOworCisJaWYgKHJ0YSA9PSBOVUxMIHx8IHJ0YXR0cl9wYXJzZV9uZXN0ZWQodGIsIFRDQV9QT0xJQ0VfTUFYLCBydGEpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGJbVENBX1BPTElDRV9UQkYtMV0gPT0gTlVMTCB8fAorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfUE9MSUNFX1RCRi0xXSkgIT0gc2l6ZW9mKCpwYXJtKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcGFybSA9IFJUQV9EQVRBKHRiW1RDQV9QT0xJQ0VfVEJGLTFdKTsKKworCWlmICh0YltUQ0FfUE9MSUNFX1JFU1VMVC0xXSAhPSBOVUxMICYmCisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9QT0xJQ0VfUkVTVUxULTFdKSAhPSBzaXplb2YodTMyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHRiW1RDQV9QT0xJQ0VfUkVTVUxULTFdICE9IE5VTEwgJiYKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX1BPTElDRV9SRVNVTFQtMV0pICE9IHNpemVvZih1MzIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwYXJtLT5pbmRleCAmJiAocCA9IHRjZl9wb2xpY2VfbG9va3VwKHBhcm0tPmluZGV4KSkgIT0gTlVMTCkgeworCQlhLT5wcml2ID0gcDsKKwkJaWYgKGJpbmQpIHsKKwkJCXAtPmJpbmRjbnQgKz0gMTsKKwkJCXAtPnJlZmNudCArPSAxOworCQl9CisJCWlmIChvdnIpCisJCQlnb3RvIG92ZXJyaWRlOworCQlyZXR1cm4gcmV0OworCX0KKworCXAgPSBrbWFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUwpOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKKworCXJldCA9IEFDVF9QX0NSRUFURUQ7CisJcC0+cmVmY250ID0gMTsKKwlzcGluX2xvY2tfaW5pdCgmcC0+bG9jayk7CisJcC0+c3RhdHNfbG9jayA9ICZwLT5sb2NrOworCWlmIChiaW5kKQorCQlwLT5iaW5kY250ID0gMTsKK292ZXJyaWRlOgorCWlmIChwYXJtLT5yYXRlLnJhdGUpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJUl90YWIgPSBxZGlzY19nZXRfcnRhYigmcGFybS0+cmF0ZSwgdGJbVENBX1BPTElDRV9SQVRFLTFdKTsKKwkJaWYgKFJfdGFiID09IE5VTEwpCisJCQlnb3RvIGZhaWx1cmU7CisJCWlmIChwYXJtLT5wZWFrcmF0ZS5yYXRlKSB7CisJCQlQX3RhYiA9IHFkaXNjX2dldF9ydGFiKCZwYXJtLT5wZWFrcmF0ZSwKKwkJCQkJICAgICAgIHRiW1RDQV9QT0xJQ0VfUEVBS1JBVEUtMV0pOworCQkJaWYgKHAtPlBfdGFiID09IE5VTEwpIHsKKwkJCQlxZGlzY19wdXRfcnRhYihSX3RhYik7CisJCQkJZ290byBmYWlsdXJlOworCQkJfQorCQl9CisJfQorCS8qIE5vIGZhaWx1cmUgYWxsb3dlZCBhZnRlciB0aGlzIHBvaW50ICovCisJc3Bpbl9sb2NrX2JoKCZwLT5sb2NrKTsKKwlpZiAoUl90YWIgIT0gTlVMTCkgeworCQlxZGlzY19wdXRfcnRhYihwLT5SX3RhYik7CisJCXAtPlJfdGFiID0gUl90YWI7CisJfQorCWlmIChQX3RhYiAhPSBOVUxMKSB7CisJCXFkaXNjX3B1dF9ydGFiKHAtPlBfdGFiKTsKKwkJcC0+UF90YWIgPSBQX3RhYjsKKwl9CisKKwlpZiAodGJbVENBX1BPTElDRV9SRVNVTFQtMV0pCisJCXAtPnJlc3VsdCA9ICoodTMyKilSVEFfREFUQSh0YltUQ0FfUE9MSUNFX1JFU1VMVC0xXSk7CisJcC0+dG9rcyA9IHAtPmJ1cnN0ID0gcGFybS0+YnVyc3Q7CisJcC0+bXR1ID0gcGFybS0+bXR1OworCWlmIChwLT5tdHUgPT0gMCkgeworCQlwLT5tdHUgPSB+MDsKKwkJaWYgKHAtPlJfdGFiKQorCQkJcC0+bXR1ID0gMjU1PDxwLT5SX3RhYi0+cmF0ZS5jZWxsX2xvZzsKKwl9CisJaWYgKHAtPlBfdGFiKQorCQlwLT5wdG9rcyA9IEwyVF9QKHAsIHAtPm10dSk7CisJcC0+YWN0aW9uID0gcGFybS0+YWN0aW9uOworCisjaWZkZWYgQ09ORklHX05FVF9FU1RJTUFUT1IKKwlpZiAodGJbVENBX1BPTElDRV9BVlJBVEUtMV0pCisJCXAtPmV3bWFfcmF0ZSA9ICoodTMyKilSVEFfREFUQSh0YltUQ0FfUE9MSUNFX0FWUkFURS0xXSk7CisJaWYgKGVzdCkKKwkJZ2VuX3JlcGxhY2VfZXN0aW1hdG9yKCZwLT5ic3RhdHMsICZwLT5yYXRlX2VzdCwgcC0+c3RhdHNfbG9jaywgZXN0KTsKKyNlbmRpZgorCisJc3Bpbl91bmxvY2tfYmgoJnAtPmxvY2spOworCWlmIChyZXQgIT0gQUNUX1BfQ1JFQVRFRCkKKwkJcmV0dXJuIHJldDsKKworCVBTQ0hFRF9HRVRfVElNRShwLT50X2MpOworCXAtPmluZGV4ID0gcGFybS0+aW5kZXggPyA6IHRjZl9wb2xpY2VfbmV3X2luZGV4KCk7CisJaCA9IHRjZl9wb2xpY2VfaGFzaChwLT5pbmRleCk7CisJd3JpdGVfbG9ja19iaCgmcG9saWNlX2xvY2spOworCXAtPm5leHQgPSB0Y2ZfcG9saWNlX2h0W2hdOworCXRjZl9wb2xpY2VfaHRbaF0gPSBwOworCXdyaXRlX3VubG9ja19iaCgmcG9saWNlX2xvY2spOworCisJYS0+cHJpdiA9IHA7CisJcmV0dXJuIHJldDsKKworZmFpbHVyZToKKwlpZiAocmV0ID09IEFDVF9QX0NSRUFURUQpCisJCWtmcmVlKHApOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdGNmX2FjdF9wb2xpY2VfY2xlYW51cChzdHJ1Y3QgdGNfYWN0aW9uICphLCBpbnQgYmluZCkKK3sKKwlzdHJ1Y3QgdGNmX3BvbGljZSAqcCA9IFBSSVYoYSk7CisKKwlpZiAocCAhPSBOVUxMKQorCQlyZXR1cm4gdGNmX3BvbGljZV9yZWxlYXNlKHAsIGJpbmQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRjZl9hY3RfcG9saWNlKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IHRjX2FjdGlvbiAqYSkKK3sKKwlwc2NoZWRfdGltZV90IG5vdzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKnBza2I7CisJc3RydWN0IHRjZl9wb2xpY2UgKnAgPSBQUklWKGEpOworCWxvbmcgdG9rczsKKwlsb25nIHB0b2tzID0gMDsKKworCXNwaW5fbG9jaygmcC0+bG9jayk7CisKKwlwLT5ic3RhdHMuYnl0ZXMgKz0gc2tiLT5sZW47CisJcC0+YnN0YXRzLnBhY2tldHMrKzsKKworI2lmZGVmIENPTkZJR19ORVRfRVNUSU1BVE9SCisJaWYgKHAtPmV3bWFfcmF0ZSAmJiBwLT5yYXRlX2VzdC5icHMgPj0gcC0+ZXdtYV9yYXRlKSB7CisJCXAtPnFzdGF0cy5vdmVybGltaXRzKys7CisJCXNwaW5fdW5sb2NrKCZwLT5sb2NrKTsKKwkJcmV0dXJuIHAtPmFjdGlvbjsKKwl9CisjZW5kaWYKKworCWlmIChza2ItPmxlbiA8PSBwLT5tdHUpIHsKKwkJaWYgKHAtPlJfdGFiID09IE5VTEwpIHsKKwkJCXNwaW5fdW5sb2NrKCZwLT5sb2NrKTsKKwkJCXJldHVybiBwLT5yZXN1bHQ7CisJCX0KKworCQlQU0NIRURfR0VUX1RJTUUobm93KTsKKworCQl0b2tzID0gUFNDSEVEX1RESUZGX1NBRkUobm93LCBwLT50X2MsIHAtPmJ1cnN0KTsKKworCQlpZiAocC0+UF90YWIpIHsKKwkJCXB0b2tzID0gdG9rcyArIHAtPnB0b2tzOworCQkJaWYgKHB0b2tzID4gKGxvbmcpTDJUX1AocCwgcC0+bXR1KSkKKwkJCQlwdG9rcyA9IChsb25nKUwyVF9QKHAsIHAtPm10dSk7CisJCQlwdG9rcyAtPSBMMlRfUChwLCBza2ItPmxlbik7CisJCX0KKwkJdG9rcyArPSBwLT50b2tzOworCQlpZiAodG9rcyA+IChsb25nKXAtPmJ1cnN0KQorCQkJdG9rcyA9IHAtPmJ1cnN0OworCQl0b2tzIC09IEwyVChwLCBza2ItPmxlbik7CisKKwkJaWYgKCh0b2tzfHB0b2tzKSA+PSAwKSB7CisJCQlwLT50X2MgPSBub3c7CisJCQlwLT50b2tzID0gdG9rczsKKwkJCXAtPnB0b2tzID0gcHRva3M7CisJCQlzcGluX3VubG9jaygmcC0+bG9jayk7CisJCQlyZXR1cm4gcC0+cmVzdWx0OworCQl9CisJfQorCisJcC0+cXN0YXRzLm92ZXJsaW1pdHMrKzsKKwlzcGluX3VubG9jaygmcC0+bG9jayk7CisJcmV0dXJuIHAtPmFjdGlvbjsKK30KKworc3RhdGljIGludAordGNmX2FjdF9wb2xpY2VfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLCBpbnQgYmluZCwgaW50IHJlZikKK3sKKwl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3QgdGNfcG9saWNlIG9wdDsKKwlzdHJ1Y3QgdGNmX3BvbGljZSAqcCA9IFBSSVYoYSk7CisKKwlvcHQuaW5kZXggPSBwLT5pbmRleDsKKwlvcHQuYWN0aW9uID0gcC0+YWN0aW9uOworCW9wdC5tdHUgPSBwLT5tdHU7CisJb3B0LmJ1cnN0ID0gcC0+YnVyc3Q7CisJb3B0LnJlZmNudCA9IHAtPnJlZmNudCAtIHJlZjsKKwlvcHQuYmluZGNudCA9IHAtPmJpbmRjbnQgLSBiaW5kOworCWlmIChwLT5SX3RhYikKKwkJb3B0LnJhdGUgPSBwLT5SX3RhYi0+cmF0ZTsKKwllbHNlCisJCW1lbXNldCgmb3B0LnJhdGUsIDAsIHNpemVvZihvcHQucmF0ZSkpOworCWlmIChwLT5QX3RhYikKKwkJb3B0LnBlYWtyYXRlID0gcC0+UF90YWItPnJhdGU7CisJZWxzZQorCQltZW1zZXQoJm9wdC5wZWFrcmF0ZSwgMCwgc2l6ZW9mKG9wdC5wZWFrcmF0ZSkpOworCVJUQV9QVVQoc2tiLCBUQ0FfUE9MSUNFX1RCRiwgc2l6ZW9mKG9wdCksICZvcHQpOworCWlmIChwLT5yZXN1bHQpCisJCVJUQV9QVVQoc2tiLCBUQ0FfUE9MSUNFX1JFU1VMVCwgc2l6ZW9mKGludCksICZwLT5yZXN1bHQpOworI2lmZGVmIENPTkZJR19ORVRfRVNUSU1BVE9SCisJaWYgKHAtPmV3bWFfcmF0ZSkKKwkJUlRBX1BVVChza2IsIFRDQV9QT0xJQ0VfQVZSQVRFLCA0LCAmcC0+ZXdtYV9yYXRlKTsKKyNlbmRpZgorCXJldHVybiBza2ItPmxlbjsKKworcnRhdHRyX2ZhaWx1cmU6CisJc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlyZXR1cm4gLTE7Cit9CisKK01PRFVMRV9BVVRIT1IoIkFsZXhleSBLdXpuZXRzb3YiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUG9saWNpbmcgYWN0aW9ucyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgc3RydWN0IHRjX2FjdGlvbl9vcHMgYWN0X3BvbGljZV9vcHMgPSB7CisJLmtpbmQJCT0JInBvbGljZSIsCisJLnR5cGUJCT0JVENBX0lEX1BPTElDRSwKKwkuY2FwYWIJCT0JVENBX0NBUF9OT05FLAorCS5vd25lcgkJPQlUSElTX01PRFVMRSwKKwkuYWN0CQk9CXRjZl9hY3RfcG9saWNlLAorCS5kdW1wCQk9CXRjZl9hY3RfcG9saWNlX2R1bXAsCisJLmNsZWFudXAJPQl0Y2ZfYWN0X3BvbGljZV9jbGVhbnVwLAorCS5sb29rdXAJCT0JdGNmX2hhc2hfc2VhcmNoLAorCS5pbml0CQk9CXRjZl9hY3RfcG9saWNlX2xvY2F0ZSwKKwkud2FsawkJPQl0Y2ZfZ2VuZXJpY193YWxrZXIKK307CisKK3N0YXRpYyBpbnQgX19pbml0Citwb2xpY2VfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gdGNmX3JlZ2lzdGVyX2FjdGlvbigmYWN0X3BvbGljZV9vcHMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3BvbGljZV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXRjZl91bnJlZ2lzdGVyX2FjdGlvbigmYWN0X3BvbGljZV9vcHMpOworfQorCittb2R1bGVfaW5pdChwb2xpY2VfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQocG9saWNlX2NsZWFudXBfbW9kdWxlKTsKKworI2VuZGlmCisKK3N0cnVjdCB0Y2ZfcG9saWNlICogdGNmX3BvbGljZV9sb2NhdGUoc3RydWN0IHJ0YXR0ciAqcnRhLCBzdHJ1Y3QgcnRhdHRyICplc3QpCit7CisJdW5zaWduZWQgaDsKKwlzdHJ1Y3QgdGNmX3BvbGljZSAqcDsKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfUE9MSUNFX01BWF07CisJc3RydWN0IHRjX3BvbGljZSAqcGFybTsKKworCWlmIChydGF0dHJfcGFyc2VfbmVzdGVkKHRiLCBUQ0FfUE9MSUNFX01BWCwgcnRhKSA8IDApCisJCXJldHVybiBOVUxMOworCisJaWYgKHRiW1RDQV9QT0xJQ0VfVEJGLTFdID09IE5VTEwgfHwKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX1BPTElDRV9UQkYtMV0pICE9IHNpemVvZigqcGFybSkpCisJCXJldHVybiBOVUxMOworCisJcGFybSA9IFJUQV9EQVRBKHRiW1RDQV9QT0xJQ0VfVEJGLTFdKTsKKworCWlmIChwYXJtLT5pbmRleCAmJiAocCA9IHRjZl9wb2xpY2VfbG9va3VwKHBhcm0tPmluZGV4KSkgIT0gTlVMTCkgeworCQlwLT5yZWZjbnQrKzsKKwkJcmV0dXJuIHA7CisJfQorCisJcCA9IGttYWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7CisJcC0+cmVmY250ID0gMTsKKwlzcGluX2xvY2tfaW5pdCgmcC0+bG9jayk7CisJcC0+c3RhdHNfbG9jayA9ICZwLT5sb2NrOworCWlmIChwYXJtLT5yYXRlLnJhdGUpIHsKKwkJcC0+Ul90YWIgPSBxZGlzY19nZXRfcnRhYigmcGFybS0+cmF0ZSwgdGJbVENBX1BPTElDRV9SQVRFLTFdKTsKKwkJaWYgKHAtPlJfdGFiID09IE5VTEwpCisJCQlnb3RvIGZhaWx1cmU7CisJCWlmIChwYXJtLT5wZWFrcmF0ZS5yYXRlKSB7CisJCQlwLT5QX3RhYiA9IHFkaXNjX2dldF9ydGFiKCZwYXJtLT5wZWFrcmF0ZSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgdGJbVENBX1BPTElDRV9QRUFLUkFURS0xXSk7CisJCQlpZiAocC0+UF90YWIgPT0gTlVMTCkKKwkJCQlnb3RvIGZhaWx1cmU7CisJCX0KKwl9CisJaWYgKHRiW1RDQV9QT0xJQ0VfUkVTVUxULTFdKSB7CisJCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfUE9MSUNFX1JFU1VMVC0xXSkgIT0gc2l6ZW9mKHUzMikpCisJCQlnb3RvIGZhaWx1cmU7CisJCXAtPnJlc3VsdCA9ICoodTMyKilSVEFfREFUQSh0YltUQ0FfUE9MSUNFX1JFU1VMVC0xXSk7CisJfQorI2lmZGVmIENPTkZJR19ORVRfRVNUSU1BVE9SCisJaWYgKHRiW1RDQV9QT0xJQ0VfQVZSQVRFLTFdKSB7CisJCWlmIChSVEFfUEFZTE9BRCh0YltUQ0FfUE9MSUNFX0FWUkFURS0xXSkgIT0gc2l6ZW9mKHUzMikpCisJCQlnb3RvIGZhaWx1cmU7CisJCXAtPmV3bWFfcmF0ZSA9ICoodTMyKilSVEFfREFUQSh0YltUQ0FfUE9MSUNFX0FWUkFURS0xXSk7CisJfQorI2VuZGlmCisJcC0+dG9rcyA9IHAtPmJ1cnN0ID0gcGFybS0+YnVyc3Q7CisJcC0+bXR1ID0gcGFybS0+bXR1OworCWlmIChwLT5tdHUgPT0gMCkgeworCQlwLT5tdHUgPSB+MDsKKwkJaWYgKHAtPlJfdGFiKQorCQkJcC0+bXR1ID0gMjU1PDxwLT5SX3RhYi0+cmF0ZS5jZWxsX2xvZzsKKwl9CisJaWYgKHAtPlBfdGFiKQorCQlwLT5wdG9rcyA9IEwyVF9QKHAsIHAtPm10dSk7CisJUFNDSEVEX0dFVF9USU1FKHAtPnRfYyk7CisJcC0+aW5kZXggPSBwYXJtLT5pbmRleCA/IDogdGNmX3BvbGljZV9uZXdfaW5kZXgoKTsKKwlwLT5hY3Rpb24gPSBwYXJtLT5hY3Rpb247CisjaWZkZWYgQ09ORklHX05FVF9FU1RJTUFUT1IKKwlpZiAoZXN0KQorCQlnZW5fbmV3X2VzdGltYXRvcigmcC0+YnN0YXRzLCAmcC0+cmF0ZV9lc3QsIHAtPnN0YXRzX2xvY2ssIGVzdCk7CisjZW5kaWYKKwloID0gdGNmX3BvbGljZV9oYXNoKHAtPmluZGV4KTsKKwl3cml0ZV9sb2NrX2JoKCZwb2xpY2VfbG9jayk7CisJcC0+bmV4dCA9IHRjZl9wb2xpY2VfaHRbaF07CisJdGNmX3BvbGljZV9odFtoXSA9IHA7CisJd3JpdGVfdW5sb2NrX2JoKCZwb2xpY2VfbG9jayk7CisJcmV0dXJuIHA7CisKK2ZhaWx1cmU6CisJaWYgKHAtPlJfdGFiKQorCQlxZGlzY19wdXRfcnRhYihwLT5SX3RhYik7CisJa2ZyZWUocCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCB0Y2ZfcG9saWNlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y2ZfcG9saWNlICpwKQoreworCXBzY2hlZF90aW1lX3Qgbm93OworCWxvbmcgdG9rczsKKwlsb25nIHB0b2tzID0gMDsKKworCXNwaW5fbG9jaygmcC0+bG9jayk7CisKKwlwLT5ic3RhdHMuYnl0ZXMgKz0gc2tiLT5sZW47CisJcC0+YnN0YXRzLnBhY2tldHMrKzsKKworI2lmZGVmIENPTkZJR19ORVRfRVNUSU1BVE9SCisJaWYgKHAtPmV3bWFfcmF0ZSAmJiBwLT5yYXRlX2VzdC5icHMgPj0gcC0+ZXdtYV9yYXRlKSB7CisJCXAtPnFzdGF0cy5vdmVybGltaXRzKys7CisJCXNwaW5fdW5sb2NrKCZwLT5sb2NrKTsKKwkJcmV0dXJuIHAtPmFjdGlvbjsKKwl9CisjZW5kaWYKKworCWlmIChza2ItPmxlbiA8PSBwLT5tdHUpIHsKKwkJaWYgKHAtPlJfdGFiID09IE5VTEwpIHsKKwkJCXNwaW5fdW5sb2NrKCZwLT5sb2NrKTsKKwkJCXJldHVybiBwLT5yZXN1bHQ7CisJCX0KKworCQlQU0NIRURfR0VUX1RJTUUobm93KTsKKworCQl0b2tzID0gUFNDSEVEX1RESUZGX1NBRkUobm93LCBwLT50X2MsIHAtPmJ1cnN0KTsKKworCQlpZiAocC0+UF90YWIpIHsKKwkJCXB0b2tzID0gdG9rcyArIHAtPnB0b2tzOworCQkJaWYgKHB0b2tzID4gKGxvbmcpTDJUX1AocCwgcC0+bXR1KSkKKwkJCQlwdG9rcyA9IChsb25nKUwyVF9QKHAsIHAtPm10dSk7CisJCQlwdG9rcyAtPSBMMlRfUChwLCBza2ItPmxlbik7CisJCX0KKwkJdG9rcyArPSBwLT50b2tzOworCQlpZiAodG9rcyA+IChsb25nKXAtPmJ1cnN0KQorCQkJdG9rcyA9IHAtPmJ1cnN0OworCQl0b2tzIC09IEwyVChwLCBza2ItPmxlbik7CisKKwkJaWYgKCh0b2tzfHB0b2tzKSA+PSAwKSB7CisJCQlwLT50X2MgPSBub3c7CisJCQlwLT50b2tzID0gdG9rczsKKwkJCXAtPnB0b2tzID0gcHRva3M7CisJCQlzcGluX3VubG9jaygmcC0+bG9jayk7CisJCQlyZXR1cm4gcC0+cmVzdWx0OworCQl9CisJfQorCisJcC0+cXN0YXRzLm92ZXJsaW1pdHMrKzsKKwlzcGluX3VubG9jaygmcC0+bG9jayk7CisJcmV0dXJuIHAtPmFjdGlvbjsKK30KKworaW50IHRjZl9wb2xpY2VfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNmX3BvbGljZSAqcCkKK3sKKwl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3QgdGNfcG9saWNlIG9wdDsKKworCW9wdC5pbmRleCA9IHAtPmluZGV4OworCW9wdC5hY3Rpb24gPSBwLT5hY3Rpb247CisJb3B0Lm10dSA9IHAtPm10dTsKKwlvcHQuYnVyc3QgPSBwLT5idXJzdDsKKwlpZiAocC0+Ul90YWIpCisJCW9wdC5yYXRlID0gcC0+Ul90YWItPnJhdGU7CisJZWxzZQorCQltZW1zZXQoJm9wdC5yYXRlLCAwLCBzaXplb2Yob3B0LnJhdGUpKTsKKwlpZiAocC0+UF90YWIpCisJCW9wdC5wZWFrcmF0ZSA9IHAtPlBfdGFiLT5yYXRlOworCWVsc2UKKwkJbWVtc2V0KCZvcHQucGVha3JhdGUsIDAsIHNpemVvZihvcHQucGVha3JhdGUpKTsKKwlSVEFfUFVUKHNrYiwgVENBX1BPTElDRV9UQkYsIHNpemVvZihvcHQpLCAmb3B0KTsKKwlpZiAocC0+cmVzdWx0KQorCQlSVEFfUFVUKHNrYiwgVENBX1BPTElDRV9SRVNVTFQsIHNpemVvZihpbnQpLCAmcC0+cmVzdWx0KTsKKyNpZmRlZiBDT05GSUdfTkVUX0VTVElNQVRPUgorCWlmIChwLT5ld21hX3JhdGUpCisJCVJUQV9QVVQoc2tiLCBUQ0FfUE9MSUNFX0FWUkFURSwgNCwgJnAtPmV3bWFfcmF0ZSk7CisjZW5kaWYKKwlyZXR1cm4gc2tiLT5sZW47CisKK3J0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorCitpbnQgdGNmX3BvbGljZV9kdW1wX3N0YXRzKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y2ZfcG9saWNlICpwKQoreworCXN0cnVjdCBnbmV0X2R1bXAgZDsKKwkKKwlpZiAoZ25ldF9zdGF0c19zdGFydF9jb3B5X2NvbXBhdChza2IsIFRDQV9TVEFUUzIsIFRDQV9TVEFUUywKKwkJCVRDQV9YU1RBVFMsIHAtPnN0YXRzX2xvY2ssICZkKSA8IDApCisJCWdvdG8gZXJyb3V0OworCQorCWlmIChnbmV0X3N0YXRzX2NvcHlfYmFzaWMoJmQsICZwLT5ic3RhdHMpIDwgMCB8fAorI2lmZGVmIENPTkZJR19ORVRfRVNUSU1BVE9SCisJICAgIGduZXRfc3RhdHNfY29weV9yYXRlX2VzdCgmZCwgJnAtPnJhdGVfZXN0KSA8IDAgfHwKKyNlbmRpZgorCSAgICBnbmV0X3N0YXRzX2NvcHlfcXVldWUoJmQsICZwLT5xc3RhdHMpIDwgMCkKKwkJZ290byBlcnJvdXQ7CisKKwlpZiAoZ25ldF9zdGF0c19maW5pc2hfY29weSgmZCkgPCAwKQorCQlnb3RvIGVycm91dDsKKworCXJldHVybiAwOworCitlcnJvdXQ6CisJcmV0dXJuIC0xOworfQorCisKK0VYUE9SVF9TWU1CT0wodGNmX3BvbGljZSk7CitFWFBPUlRfU1lNQk9MKHRjZl9wb2xpY2VfZGVzdHJveSk7CitFWFBPUlRfU1lNQk9MKHRjZl9wb2xpY2VfZHVtcCk7CitFWFBPUlRfU1lNQk9MKHRjZl9wb2xpY2VfZHVtcF9zdGF0cyk7CitFWFBPUlRfU1lNQk9MKHRjZl9wb2xpY2VfaGFzaCk7CitFWFBPUlRfU1lNQk9MKHRjZl9wb2xpY2VfaHQpOworRVhQT1JUX1NZTUJPTCh0Y2ZfcG9saWNlX2xvY2F0ZSk7CitFWFBPUlRfU1lNQk9MKHRjZl9wb2xpY2VfbG9va3VwKTsKK0VYUE9SVF9TWU1CT0wodGNmX3BvbGljZV9uZXdfaW5kZXgpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9hcGkuYyBiL25ldC9zY2hlZC9zY2hfYXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMyM2E3NAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY2hlZC9zY2hfYXBpLmMKQEAgLTAsMCArMSwxMjk2IEBACisvKgorICogbmV0L3NjaGVkL3NjaF9hcGkuYwlQYWNrZXQgc2NoZWR1bGVyIEFQSS4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKgorICogRml4ZXM6CisgKgorICogUmFuaSBBc3NhZiA8cmFuaUBtYWdpYy5tZXRhd2lyZS5jb20+IDo5ODA4MDI6IEpJRkZJRVMgYW5kIENQVSBjbG9jayBzb3VyY2VzIGFyZSByZXBhaXJlZC4KKyAqIEVkdWFyZG8gSi4gQmxhbmNvIDxlamJzQG5ldGxhYnMuY29tLnV5PiA6OTkwMjIyOiBrbW9kIHN1cHBvcnQKKyAqIEphbWFsIEhhZGkgU2FsaW0gPGhhZGlAbm9ydGVsbmV0d29ya3MuY29tPjogOTkwNjAxOiBpbmdyZXNzIHN1cHBvcnQKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCitzdGF0aWMgaW50IHFkaXNjX25vdGlmeShzdHJ1Y3Qgc2tfYnVmZiAqb3NrYiwgc3RydWN0IG5sbXNnaGRyICpuLCB1MzIgY2xpZCwKKwkJCXN0cnVjdCBRZGlzYyAqb2xkLCBzdHJ1Y3QgUWRpc2MgKm5ldyk7CitzdGF0aWMgaW50IHRjbGFzc19ub3RpZnkoc3RydWN0IHNrX2J1ZmYgKm9za2IsIHN0cnVjdCBubG1zZ2hkciAqbiwKKwkJCSBzdHJ1Y3QgUWRpc2MgKnEsIHVuc2lnbmVkIGxvbmcgY2wsIGludCBldmVudCk7CisKKy8qCisKKyAgIFNob3J0IHJldmlldy4KKyAgIC0tLS0tLS0tLS0tLS0KKworICAgVGhpcyBmaWxlIGNvbnNpc3RzIG9mIHR3byBpbnRlcnJlbGF0ZWQgcGFydHM6CisKKyAgIDEuIHF1ZXVlaW5nIGRpc2NpcGxpbmVzIG1hbmFnZXIgZnJvbnRlbmQuCisgICAyLiB0cmFmZmljIGNsYXNzZXMgbWFuYWdlciBmcm9udGVuZC4KKworICAgR2VuZXJhbGx5LCBxdWV1ZWluZyBkaXNjaXBsaW5lICgicWRpc2MiKSBpcyBhIGJsYWNrIGJveCwKKyAgIHdoaWNoIGlzIGFibGUgdG8gZW5xdWV1ZSBwYWNrZXRzIGFuZCB0byBkZXF1ZXVlIHRoZW0gKHdoZW4KKyAgIGRldmljZSBpcyByZWFkeSB0byBzZW5kIHNvbWV0aGluZykgaW4gb3JkZXIgYW5kIGF0IHRpbWVzCisgICBkZXRlcm1pbmVkIGJ5IGFsZ29yaXRobSBoaWRkZW4gaW4gaXQuCisKKyAgIHFkaXNjJ3MgYXJlIGRpdmlkZWQgdG8gdHdvIGNhdGVnb3JpZXM6CisgICAtICJxdWV1ZXMiLCB3aGljaCBoYXZlIG5vIGludGVybmFsIHN0cnVjdHVyZSB2aXNpYmxlIGZyb20gb3V0c2lkZS4KKyAgIC0gInNjaGVkdWxlcnMiLCB3aGljaCBzcGxpdCBhbGwgdGhlIHBhY2tldHMgdG8gInRyYWZmaWMgY2xhc3NlcyIsCisgICAgIHVzaW5nICJwYWNrZXQgY2xhc3NpZmllcnMiIChsb29rIGF0IGNsc19hcGkuYykKKworICAgSW4gdHVybiwgY2xhc3NlcyBtYXkgaGF2ZSBjaGlsZCBxZGlzY3MgKGFzIHJ1bGUsIHF1ZXVlcykKKyAgIGF0dGFjaGVkIHRvIHRoZW0gZXRjLiBldGMuIGV0Yy4KKworICAgVGhlIGdvYWwgb2YgdGhlIHJvdXRpbmVzIGluIHRoaXMgZmlsZSBpcyB0byB0cmFuc2xhdGUKKyAgIGluZm9ybWF0aW9uIHN1cHBsaWVkIGJ5IHVzZXIgaW4gdGhlIGZvcm0gb2YgaGFuZGxlcworICAgdG8gbW9yZSBpbnRlbGxpZ2libGUgZm9yIGtlcm5lbCBmb3JtLCB0byBtYWtlIHNvbWUgc2FuaXR5CisgICBjaGVja3MgYW5kIHBhcnQgb2Ygd29yaywgd2hpY2ggaXMgY29tbW9uIHRvIGFsbCBxZGlzY3MKKyAgIGFuZCB0byBwcm92aWRlIHJ0bmV0bGluayBub3RpZmljYXRpb25zLgorCisgICBBbGwgcmVhbCBpbnRlbGxpZ2VudCB3b3JrIGlzIGRvbmUgaW5zaWRlIHFkaXNjIG1vZHVsZXMuCisKKworCisgICBFdmVyeSBkaXNjaXBsaW5lIGhhcyB0d28gbWFqb3Igcm91dGluZXM6IGVucXVldWUgYW5kIGRlcXVldWUuCisKKyAgIC0tLWRlcXVldWUKKworICAgZGVxdWV1ZSB1c3VhbGx5IHJldHVybnMgYSBza2IgdG8gc2VuZC4gSXQgaXMgYWxsb3dlZCB0byByZXR1cm4gTlVMTCwKKyAgIGJ1dCBpdCBkb2VzIG5vdCBtZWFuIHRoYXQgcXVldWUgaXMgZW1wdHksIGl0IGp1c3QgbWVhbnMgdGhhdAorICAgZGlzY2lwbGluZSBkb2VzIG5vdCB3YW50IHRvIHNlbmQgYW55dGhpbmcgdGhpcyB0aW1lLgorICAgUXVldWUgaXMgcmVhbGx5IGVtcHR5IGlmIHEtPnEucWxlbiA9PSAwLgorICAgRm9yIGNvbXBsaWNhdGVkIGRpc2NpcGxpbmVzIHdpdGggbXVsdGlwbGUgcXVldWVzIHEtPnEgaXMgbm90CisgICByZWFsIHBhY2tldCBxdWV1ZSwgYnV0IGhvd2V2ZXIgcS0+cS5xbGVuIG11c3QgYmUgdmFsaWQuCisKKyAgIC0tLWVucXVldWUKKworICAgZW5xdWV1ZSByZXR1cm5zIDAsIGlmIHBhY2tldCB3YXMgZW5xdWV1ZWQgc3VjY2Vzc2Z1bGx5LgorICAgSWYgcGFja2V0ICh0aGlzIG9uZSBvciBhbm90aGVyIG9uZSkgd2FzIGRyb3BwZWQsIGl0IHJldHVybnMKKyAgIG5vdCB6ZXJvIGVycm9yIGNvZGUuCisgICBORVRfWE1JVF9EUk9QIAktIHRoaXMgcGFja2V0IGRyb3BwZWQKKyAgICAgRXhwZWN0ZWQgYWN0aW9uOiBkbyBub3QgYmFja29mZiwgYnV0IHdhaXQgdW50aWwgcXVldWUgd2lsbCBjbGVhci4KKyAgIE5FVF9YTUlUX0NOCSAJLSBwcm9iYWJseSB0aGlzIHBhY2tldCBlbnF1ZXVlZCwgYnV0IGFub3RoZXIgb25lIGRyb3BwZWQuCisgICAgIEV4cGVjdGVkIGFjdGlvbjogYmFja29mZiBvciBpZ25vcmUKKyAgIE5FVF9YTUlUX1BPTElDRUQJLSBkcm9wcGVkIGJ5IHBvbGljZS4KKyAgICAgRXhwZWN0ZWQgYWN0aW9uOiBiYWNrb2ZmIG9yIGVycm9yIHRvIHJlYWwtdGltZSBhcHBzLgorCisgICBBdXhpbGlhcnkgcm91dGluZXM6CisKKyAgIC0tLXJlcXVldWUKKworICAgcmVxdWV1ZXMgb25jZSBkZXF1ZXVlZCBwYWNrZXQuIEl0IGlzIHVzZWQgZm9yIG5vbi1zdGFuZGFyZCBvcgorICAganVzdCBidWdneSBkZXZpY2VzLCB3aGljaCBjYW4gZGVmZXIgb3V0cHV0IGV2ZW4gaWYgZGV2LT50YnVzeT0wLgorCisgICAtLS1yZXNldAorCisgICByZXR1cm5zIHFkaXNjIHRvIGluaXRpYWwgc3RhdGU6IHB1cmdlIGFsbCBidWZmZXJzLCBjbGVhciBhbGwKKyAgIHRpbWVycywgY291bnRlcnMgKGV4Y2VwdCBmb3Igc3RhdGlzdGljcykgZXRjLgorCisgICAtLS1pbml0CisKKyAgIGluaXRpYWxpemVzIG5ld2x5IGNyZWF0ZWQgcWRpc2MuCisKKyAgIC0tLWRlc3Ryb3kKKworICAgZGVzdHJveXMgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSBpbml0IGFuZCBkdXJpbmcgbGlmZXRpbWUgb2YgcWRpc2MuCisKKyAgIC0tLWNoYW5nZQorCisgICBjaGFuZ2VzIHFkaXNjIHBhcmFtZXRlcnMuCisgKi8KKworLyogUHJvdGVjdHMgbGlzdCBvZiByZWdpc3RlcmVkIFRDIG1vZHVsZXMuIEl0IGlzIHB1cmUgU01QIGxvY2suICovCitzdGF0aWMgREVGSU5FX1JXTE9DSyhxZGlzY19tb2RfbG9jayk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJUXVldWVpbmcgZGlzY2lwbGluZXMgbWFuaXB1bGF0aW9uLgkqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIFRoZSBsaXN0IG9mIGFsbCBpbnN0YWxsZWQgcXVldWVpbmcgZGlzY2lwbGluZXMuICovCisKK3N0YXRpYyBzdHJ1Y3QgUWRpc2Nfb3BzICpxZGlzY19iYXNlOworCisvKiBSZWdpc3Rlci91cmVnaXN0ZXIgcXVldWVpbmcgZGlzY2lwbGluZSAqLworCitpbnQgcmVnaXN0ZXJfcWRpc2Moc3RydWN0IFFkaXNjX29wcyAqcW9wcykKK3sKKwlzdHJ1Y3QgUWRpc2Nfb3BzICpxLCAqKnFwOworCWludCByYyA9IC1FRVhJU1Q7CisKKwl3cml0ZV9sb2NrKCZxZGlzY19tb2RfbG9jayk7CisJZm9yIChxcCA9ICZxZGlzY19iYXNlOyAocSA9ICpxcCkgIT0gTlVMTDsgcXAgPSAmcS0+bmV4dCkKKwkJaWYgKCFzdHJjbXAocW9wcy0+aWQsIHEtPmlkKSkKKwkJCWdvdG8gb3V0OworCisJaWYgKHFvcHMtPmVucXVldWUgPT0gTlVMTCkKKwkJcW9wcy0+ZW5xdWV1ZSA9IG5vb3BfcWRpc2Nfb3BzLmVucXVldWU7CisJaWYgKHFvcHMtPnJlcXVldWUgPT0gTlVMTCkKKwkJcW9wcy0+cmVxdWV1ZSA9IG5vb3BfcWRpc2Nfb3BzLnJlcXVldWU7CisJaWYgKHFvcHMtPmRlcXVldWUgPT0gTlVMTCkKKwkJcW9wcy0+ZGVxdWV1ZSA9IG5vb3BfcWRpc2Nfb3BzLmRlcXVldWU7CisKKwlxb3BzLT5uZXh0ID0gTlVMTDsKKwkqcXAgPSBxb3BzOworCXJjID0gMDsKK291dDoKKwl3cml0ZV91bmxvY2soJnFkaXNjX21vZF9sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCB1bnJlZ2lzdGVyX3FkaXNjKHN0cnVjdCBRZGlzY19vcHMgKnFvcHMpCit7CisJc3RydWN0IFFkaXNjX29wcyAqcSwgKipxcDsKKwlpbnQgZXJyID0gLUVOT0VOVDsKKworCXdyaXRlX2xvY2soJnFkaXNjX21vZF9sb2NrKTsKKwlmb3IgKHFwID0gJnFkaXNjX2Jhc2U7IChxPSpxcCkhPU5VTEw7IHFwID0gJnEtPm5leHQpCisJCWlmIChxID09IHFvcHMpCisJCQlicmVhazsKKwlpZiAocSkgeworCQkqcXAgPSBxLT5uZXh0OworCQlxLT5uZXh0ID0gTlVMTDsKKwkJZXJyID0gMDsKKwl9CisJd3JpdGVfdW5sb2NrKCZxZGlzY19tb2RfbG9jayk7CisJcmV0dXJuIGVycjsKK30KKworLyogV2Uga25vdyBoYW5kbGUuIEZpbmQgcWRpc2MgYW1vbmcgYWxsIHFkaXNjJ3MgYXR0YWNoZWQgdG8gZGV2aWNlCisgICAocm9vdCBxZGlzYywgYWxsIGl0cyBjaGlsZHJlbiwgY2hpbGRyZW4gb2YgY2hpbGRyZW4gZXRjLikKKyAqLworCitzdHJ1Y3QgUWRpc2MgKnFkaXNjX2xvb2t1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgaGFuZGxlKQoreworCXN0cnVjdCBRZGlzYyAqcTsKKworCXJlYWRfbG9ja19iaCgmcWRpc2NfdHJlZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHEsICZkZXYtPnFkaXNjX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHEtPmhhbmRsZSA9PSBoYW5kbGUpIHsKKwkJCXJlYWRfdW5sb2NrX2JoKCZxZGlzY190cmVlX2xvY2spOworCQkJcmV0dXJuIHE7CisJCX0KKwl9CisJcmVhZF91bmxvY2tfYmgoJnFkaXNjX3RyZWVfbG9jayk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgUWRpc2MgKnFkaXNjX2xlYWYoc3RydWN0IFFkaXNjICpwLCB1MzIgY2xhc3NpZCkKK3sKKwl1bnNpZ25lZCBsb25nIGNsOworCXN0cnVjdCBRZGlzYyAqbGVhZjsKKwlzdHJ1Y3QgUWRpc2NfY2xhc3Nfb3BzICpjb3BzID0gcC0+b3BzLT5jbF9vcHM7CisKKwlpZiAoY29wcyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwljbCA9IGNvcHMtPmdldChwLCBjbGFzc2lkKTsKKworCWlmIChjbCA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKwlsZWFmID0gY29wcy0+bGVhZihwLCBjbCk7CisJY29wcy0+cHV0KHAsIGNsKTsKKwlyZXR1cm4gbGVhZjsKK30KKworLyogRmluZCBxdWV1ZWluZyBkaXNjaXBsaW5lIGJ5IG5hbWUgKi8KKworc3RhdGljIHN0cnVjdCBRZGlzY19vcHMgKnFkaXNjX2xvb2t1cF9vcHMoc3RydWN0IHJ0YXR0ciAqa2luZCkKK3sKKwlzdHJ1Y3QgUWRpc2Nfb3BzICpxID0gTlVMTDsKKworCWlmIChraW5kKSB7CisJCXJlYWRfbG9jaygmcWRpc2NfbW9kX2xvY2spOworCQlmb3IgKHEgPSBxZGlzY19iYXNlOyBxOyBxID0gcS0+bmV4dCkgeworCQkJaWYgKHJ0YXR0cl9zdHJjbXAoa2luZCwgcS0+aWQpID09IDApIHsKKwkJCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KHEtPm93bmVyKSkKKwkJCQkJcSA9IE5VTEw7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmVhZF91bmxvY2soJnFkaXNjX21vZF9sb2NrKTsKKwl9CisJcmV0dXJuIHE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcWRpc2NfcmF0ZV90YWJsZSAqcWRpc2NfcnRhYl9saXN0OworCitzdHJ1Y3QgcWRpc2NfcmF0ZV90YWJsZSAqcWRpc2NfZ2V0X3J0YWIoc3RydWN0IHRjX3JhdGVzcGVjICpyLCBzdHJ1Y3QgcnRhdHRyICp0YWIpCit7CisJc3RydWN0IHFkaXNjX3JhdGVfdGFibGUgKnJ0YWI7CisKKwlmb3IgKHJ0YWIgPSBxZGlzY19ydGFiX2xpc3Q7IHJ0YWI7IHJ0YWIgPSBydGFiLT5uZXh0KSB7CisJCWlmIChtZW1jbXAoJnJ0YWItPnJhdGUsIHIsIHNpemVvZihzdHJ1Y3QgdGNfcmF0ZXNwZWMpKSA9PSAwKSB7CisJCQlydGFiLT5yZWZjbnQrKzsKKwkJCXJldHVybiBydGFiOworCQl9CisJfQorCisJaWYgKHRhYiA9PSBOVUxMIHx8IHItPnJhdGUgPT0gMCB8fCByLT5jZWxsX2xvZyA9PSAwIHx8IFJUQV9QQVlMT0FEKHRhYikgIT0gMTAyNCkKKwkJcmV0dXJuIE5VTEw7CisKKwlydGFiID0ga21hbGxvYyhzaXplb2YoKnJ0YWIpLCBHRlBfS0VSTkVMKTsKKwlpZiAocnRhYikgeworCQlydGFiLT5yYXRlID0gKnI7CisJCXJ0YWItPnJlZmNudCA9IDE7CisJCW1lbWNweShydGFiLT5kYXRhLCBSVEFfREFUQSh0YWIpLCAxMDI0KTsKKwkJcnRhYi0+bmV4dCA9IHFkaXNjX3J0YWJfbGlzdDsKKwkJcWRpc2NfcnRhYl9saXN0ID0gcnRhYjsKKwl9CisJcmV0dXJuIHJ0YWI7Cit9CisKK3ZvaWQgcWRpc2NfcHV0X3J0YWIoc3RydWN0IHFkaXNjX3JhdGVfdGFibGUgKnRhYikKK3sKKwlzdHJ1Y3QgcWRpc2NfcmF0ZV90YWJsZSAqcnRhYiwgKipydGFicDsKKworCWlmICghdGFiIHx8IC0tdGFiLT5yZWZjbnQpCisJCXJldHVybjsKKworCWZvciAocnRhYnAgPSAmcWRpc2NfcnRhYl9saXN0OyAocnRhYj0qcnRhYnApICE9IE5VTEw7IHJ0YWJwID0gJnJ0YWItPm5leHQpIHsKKwkJaWYgKHJ0YWIgPT0gdGFiKSB7CisJCQkqcnRhYnAgPSBydGFiLT5uZXh0OworCQkJa2ZyZWUocnRhYik7CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKKworLyogQWxsb2NhdGUgYW4gdW5pcXVlIGhhbmRsZSBmcm9tIHNwYWNlIG1hbmFnZWQgYnkga2VybmVsICovCisKK3N0YXRpYyB1MzIgcWRpc2NfYWxsb2NfaGFuZGxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGkgPSAweDEwMDAwOworCXN0YXRpYyB1MzIgYXV0b2hhbmRsZSA9IFRDX0hfTUFLRSgweDgwMDAwMDAwVSwgMCk7CisKKwlkbyB7CisJCWF1dG9oYW5kbGUgKz0gVENfSF9NQUtFKDB4MTAwMDBVLCAwKTsKKwkJaWYgKGF1dG9oYW5kbGUgPT0gVENfSF9NQUtFKFRDX0hfUk9PVCwgMCkpCisJCQlhdXRvaGFuZGxlID0gVENfSF9NQUtFKDB4ODAwMDAwMDBVLCAwKTsKKwl9IHdoaWxlCShxZGlzY19sb29rdXAoZGV2LCBhdXRvaGFuZGxlKSAmJiAtLWkgPiAwKTsKKworCXJldHVybiBpPjAgPyBhdXRvaGFuZGxlIDogMDsKK30KKworLyogQXR0YWNoIHRvcGxldmVsIHFkaXNjIHRvIGRldmljZSBkZXYgKi8KKworc3RhdGljIHN0cnVjdCBRZGlzYyAqCitkZXZfZ3JhZnRfcWRpc2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IFFkaXNjICpxZGlzYykKK3sKKwlzdHJ1Y3QgUWRpc2MgKm9xZGlzYzsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKQorCQlkZXZfZGVhY3RpdmF0ZShkZXYpOworCisJcWRpc2NfbG9ja190cmVlKGRldik7CisJaWYgKHFkaXNjICYmIHFkaXNjLT5mbGFncyZUQ1FfRl9JTkdSRVNTKSB7CisJCW9xZGlzYyA9IGRldi0+cWRpc2NfaW5ncmVzczsKKwkJLyogUHJ1bmUgb2xkIHNjaGVkdWxlciAqLworCQlpZiAob3FkaXNjICYmIGF0b21pY19yZWFkKCZvcWRpc2MtPnJlZmNudCkgPD0gMSkgeworCQkJLyogZGVsZXRlICovCisJCQlxZGlzY19yZXNldChvcWRpc2MpOworCQkJZGV2LT5xZGlzY19pbmdyZXNzID0gTlVMTDsKKwkJfSBlbHNlIHsgIC8qIG5ldyAqLworCQkJZGV2LT5xZGlzY19pbmdyZXNzID0gcWRpc2M7CisJCX0KKworCX0gZWxzZSB7CisKKwkJb3FkaXNjID0gZGV2LT5xZGlzY19zbGVlcGluZzsKKworCQkvKiBQcnVuZSBvbGQgc2NoZWR1bGVyICovCisJCWlmIChvcWRpc2MgJiYgYXRvbWljX3JlYWQoJm9xZGlzYy0+cmVmY250KSA8PSAxKQorCQkJcWRpc2NfcmVzZXQob3FkaXNjKTsKKworCQkvKiAuLi4gYW5kIGdyYWZ0IG5ldyBvbmUgKi8KKwkJaWYgKHFkaXNjID09IE5VTEwpCisJCQlxZGlzYyA9ICZub29wX3FkaXNjOworCQlkZXYtPnFkaXNjX3NsZWVwaW5nID0gcWRpc2M7CisJCWRldi0+cWRpc2MgPSAmbm9vcF9xZGlzYzsKKwl9CisKKwlxZGlzY191bmxvY2tfdHJlZShkZXYpOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApCisJCWRldl9hY3RpdmF0ZShkZXYpOworCisJcmV0dXJuIG9xZGlzYzsKK30KKworCisvKiBHcmFmdCBxZGlzYyAibmV3IiB0byBjbGFzcyAiY2xhc3NpZCIgb2YgcWRpc2MgInBhcmVudCIgb3IKKyAgIHRvIGRldmljZSAiZGV2Ii4KKworICAgT2xkIHFkaXNjIGlzIG5vdCBkZXN0cm95ZWQgYnV0IHJldHVybmVkIGluICpvbGQuCisgKi8KKworc3RhdGljIGludCBxZGlzY19ncmFmdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgUWRpc2MgKnBhcmVudCwKKwkJICAgICAgIHUzMiBjbGFzc2lkLAorCQkgICAgICAgc3RydWN0IFFkaXNjICpuZXcsIHN0cnVjdCBRZGlzYyAqKm9sZCkKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgUWRpc2MgKnEgPSAqb2xkOworCisKKwlpZiAocGFyZW50ID09IE5VTEwpIHsgCisJCWlmIChxICYmIHEtPmZsYWdzJlRDUV9GX0lOR1JFU1MpIHsKKwkJCSpvbGQgPSBkZXZfZ3JhZnRfcWRpc2MoZGV2LCBxKTsKKwkJfSBlbHNlIHsKKwkJCSpvbGQgPSBkZXZfZ3JhZnRfcWRpc2MoZGV2LCBuZXcpOworCQl9CisJfSBlbHNlIHsKKwkJc3RydWN0IFFkaXNjX2NsYXNzX29wcyAqY29wcyA9IHBhcmVudC0+b3BzLT5jbF9vcHM7CisKKwkJZXJyID0gLUVJTlZBTDsKKworCQlpZiAoY29wcykgeworCQkJdW5zaWduZWQgbG9uZyBjbCA9IGNvcHMtPmdldChwYXJlbnQsIGNsYXNzaWQpOworCQkJaWYgKGNsKSB7CisJCQkJZXJyID0gY29wcy0+Z3JhZnQocGFyZW50LCBjbCwgbmV3LCBvbGQpOworCQkJCWlmIChuZXcpCisJCQkJCW5ldy0+cGFyZW50ID0gY2xhc3NpZDsKKwkJCQljb3BzLT5wdXQocGFyZW50LCBjbCk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAgIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIG5ldyBxZGlzYy4KKworICAgUGFyYW1ldGVycyBhcmUgcGFzc2VkIHZpYSBvcHQuCisgKi8KKworc3RhdGljIHN0cnVjdCBRZGlzYyAqCitxZGlzY19jcmVhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGhhbmRsZSwgc3RydWN0IHJ0YXR0ciAqKnRjYSwgaW50ICplcnJwKQoreworCWludCBlcnI7CisJc3RydWN0IHJ0YXR0ciAqa2luZCA9IHRjYVtUQ0FfS0lORC0xXTsKKwl2b2lkICpwID0gTlVMTDsKKwlzdHJ1Y3QgUWRpc2MgKnNjaDsKKwlzdHJ1Y3QgUWRpc2Nfb3BzICpvcHM7CisJaW50IHNpemU7CisKKwlvcHMgPSBxZGlzY19sb29rdXBfb3BzKGtpbmQpOworI2lmZGVmIENPTkZJR19LTU9ECisJaWYgKG9wcyA9PSBOVUxMICYmIGtpbmQgIT0gTlVMTCkgeworCQljaGFyIG5hbWVbSUZOQU1TSVpdOworCQlpZiAocnRhdHRyX3N0cmxjcHkobmFtZSwga2luZCwgSUZOQU1TSVopIDwgSUZOQU1TSVopIHsKKwkJCS8qIFdlIGRyb3BwZWQgdGhlIFJUTkwgc2VtYXBob3JlIGluIG9yZGVyIHRvCisJCQkgKiBwZXJmb3JtIHRoZSBtb2R1bGUgbG9hZC4gIFNvLCBldmVuIGlmIHdlCisJCQkgKiBzdWNjZWVkZWQgaW4gbG9hZGluZyB0aGUgbW9kdWxlIHdlIGhhdmUgdG8KKwkJCSAqIHRlbGwgdGhlIGNhbGxlciB0byByZXBsYXkgdGhlIHJlcXVlc3QuICBXZQorCQkJICogaW5kaWNhdGUgdGhpcyB1c2luZyAtRUFHQUlOLgorCQkJICogV2UgcmVwbGF5IHRoZSByZXF1ZXN0IGJlY2F1c2UgdGhlIGRldmljZSBtYXkKKwkJCSAqIGdvIGF3YXkgaW4gdGhlIG1lYW4gdGltZS4KKwkJCSAqLworCQkJcnRubF91bmxvY2soKTsKKwkJCXJlcXVlc3RfbW9kdWxlKCJzY2hfJXMiLCBuYW1lKTsKKwkJCXJ0bmxfbG9jaygpOworCQkJb3BzID0gcWRpc2NfbG9va3VwX29wcyhraW5kKTsKKwkJCWlmIChvcHMgIT0gTlVMTCkgeworCQkJCS8qIFdlIHdpbGwgdHJ5IGFnYWluIHFkaXNjX2xvb2t1cF9vcHMsCisJCQkJICogc28gZG9uJ3Qga2VlcCBhIHJlZmVyZW5jZS4KKwkJCQkgKi8KKwkJCQltb2R1bGVfcHV0KG9wcy0+b3duZXIpOworCQkJCWVyciA9IC1FQUdBSU47CisJCQkJZ290byBlcnJfb3V0OworCQkJfQorCQl9CisJfQorI2VuZGlmCisKKwllcnIgPSAtRUlOVkFMOworCWlmIChvcHMgPT0gTlVMTCkKKwkJZ290byBlcnJfb3V0OworCisJLyogZW5zdXJlIHRoYXQgdGhlIFFkaXNjIGFuZCB0aGUgcHJpdmF0ZSBkYXRhIGFyZSAzMi1ieXRlIGFsaWduZWQgKi8KKwlzaXplID0gKChzaXplb2YoKnNjaCkgKyBRRElTQ19BTElHTl9DT05TVCkgJiB+UURJU0NfQUxJR05fQ09OU1QpOworCXNpemUgKz0gb3BzLT5wcml2X3NpemUgKyBRRElTQ19BTElHTl9DT05TVDsKKworCXAgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWVyciA9IC1FTk9CVUZTOworCWlmICghcCkKKwkJZ290byBlcnJfb3V0MjsKKwltZW1zZXQocCwgMCwgc2l6ZSk7CisJc2NoID0gKHN0cnVjdCBRZGlzYyAqKSgoKHVuc2lnbmVkIGxvbmcpcCArIFFESVNDX0FMSUdOX0NPTlNUKQorCSAgICAgICAgICAgICAgICAgICAgICAgJiB+UURJU0NfQUxJR05fQ09OU1QpOworCXNjaC0+cGFkZGVkID0gKGNoYXIgKilzY2ggLSAoY2hhciAqKXA7CisKKwlJTklUX0xJU1RfSEVBRCgmc2NoLT5saXN0KTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZzY2gtPnEpOworCisJaWYgKGhhbmRsZSA9PSBUQ19IX0lOR1JFU1MpCisJCXNjaC0+ZmxhZ3MgfD0gVENRX0ZfSU5HUkVTUzsKKworCXNjaC0+b3BzID0gb3BzOworCXNjaC0+ZW5xdWV1ZSA9IG9wcy0+ZW5xdWV1ZTsKKwlzY2gtPmRlcXVldWUgPSBvcHMtPmRlcXVldWU7CisJc2NoLT5kZXYgPSBkZXY7CisJZGV2X2hvbGQoZGV2KTsKKwlhdG9taWNfc2V0KCZzY2gtPnJlZmNudCwgMSk7CisJc2NoLT5zdGF0c19sb2NrID0gJmRldi0+cXVldWVfbG9jazsKKwlpZiAoaGFuZGxlID09IDApIHsKKwkJaGFuZGxlID0gcWRpc2NfYWxsb2NfaGFuZGxlKGRldik7CisJCWVyciA9IC1FTk9NRU07CisJCWlmIChoYW5kbGUgPT0gMCkKKwkJCWdvdG8gZXJyX291dDM7CisJfQorCisJaWYgKGhhbmRsZSA9PSBUQ19IX0lOR1JFU1MpCisgICAgICAgICAgICAgICAgc2NoLT5oYW5kbGUgPVRDX0hfTUFLRShUQ19IX0lOR1JFU1MsIDApOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2NoLT5oYW5kbGUgPSBoYW5kbGU7CisKKwlpZiAoIW9wcy0+aW5pdCB8fCAoZXJyID0gb3BzLT5pbml0KHNjaCwgdGNhW1RDQV9PUFRJT05TLTFdKSkgPT0gMCkgeworCQlxZGlzY19sb2NrX3RyZWUoZGV2KTsKKwkJbGlzdF9hZGRfdGFpbCgmc2NoLT5saXN0LCAmZGV2LT5xZGlzY19saXN0KTsKKwkJcWRpc2NfdW5sb2NrX3RyZWUoZGV2KTsKKworI2lmZGVmIENPTkZJR19ORVRfRVNUSU1BVE9SCisJCWlmICh0Y2FbVENBX1JBVEUtMV0pCisJCQlnZW5fbmV3X2VzdGltYXRvcigmc2NoLT5ic3RhdHMsICZzY2gtPnJhdGVfZXN0LAorCQkJCXNjaC0+c3RhdHNfbG9jaywgdGNhW1RDQV9SQVRFLTFdKTsKKyNlbmRpZgorCQlyZXR1cm4gc2NoOworCX0KK2Vycl9vdXQzOgorCWRldl9wdXQoZGV2KTsKK2Vycl9vdXQyOgorCW1vZHVsZV9wdXQob3BzLT5vd25lcik7CitlcnJfb3V0OgorCSplcnJwID0gZXJyOworCWlmIChwKQorCQlrZnJlZShwKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBxZGlzY19jaGFuZ2Uoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBydGF0dHIgKip0Y2EpCit7CisJaWYgKHRjYVtUQ0FfT1BUSU9OUy0xXSkgeworCQlpbnQgZXJyOworCisJCWlmIChzY2gtPm9wcy0+Y2hhbmdlID09IE5VTEwpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZXJyID0gc2NoLT5vcHMtPmNoYW5nZShzY2gsIHRjYVtUQ0FfT1BUSU9OUy0xXSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKyNpZmRlZiBDT05GSUdfTkVUX0VTVElNQVRPUgorCWlmICh0Y2FbVENBX1JBVEUtMV0pCisJCWdlbl9yZXBsYWNlX2VzdGltYXRvcigmc2NoLT5ic3RhdHMsICZzY2gtPnJhdGVfZXN0LAorCQkJc2NoLT5zdGF0c19sb2NrLCB0Y2FbVENBX1JBVEUtMV0pOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBjaGVja19sb29wX2FyZworeworCXN0cnVjdCBxZGlzY193YWxrZXIgCXc7CisJc3RydWN0IFFkaXNjCQkqcDsKKwlpbnQJCQlkZXB0aDsKK307CisKK3N0YXRpYyBpbnQgY2hlY2tfbG9vcF9mbihzdHJ1Y3QgUWRpc2MgKnEsIHVuc2lnbmVkIGxvbmcgY2wsIHN0cnVjdCBxZGlzY193YWxrZXIgKncpOworCitzdGF0aWMgaW50IGNoZWNrX2xvb3Aoc3RydWN0IFFkaXNjICpxLCBzdHJ1Y3QgUWRpc2MgKnAsIGludCBkZXB0aCkKK3sKKwlzdHJ1Y3QgY2hlY2tfbG9vcF9hcmcJYXJnOworCisJaWYgKHEtPm9wcy0+Y2xfb3BzID09IE5VTEwpCisJCXJldHVybiAwOworCisJYXJnLncuc3RvcCA9IGFyZy53LnNraXAgPSBhcmcudy5jb3VudCA9IDA7CisJYXJnLncuZm4gPSBjaGVja19sb29wX2ZuOworCWFyZy5kZXB0aCA9IGRlcHRoOworCWFyZy5wID0gcDsKKwlxLT5vcHMtPmNsX29wcy0+d2FsayhxLCAmYXJnLncpOworCXJldHVybiBhcmcudy5zdG9wID8gLUVMT09QIDogMDsKK30KKworc3RhdGljIGludAorY2hlY2tfbG9vcF9mbihzdHJ1Y3QgUWRpc2MgKnEsIHVuc2lnbmVkIGxvbmcgY2wsIHN0cnVjdCBxZGlzY193YWxrZXIgKncpCit7CisJc3RydWN0IFFkaXNjICpsZWFmOworCXN0cnVjdCBRZGlzY19jbGFzc19vcHMgKmNvcHMgPSBxLT5vcHMtPmNsX29wczsKKwlzdHJ1Y3QgY2hlY2tfbG9vcF9hcmcgKmFyZyA9IChzdHJ1Y3QgY2hlY2tfbG9vcF9hcmcgKil3OworCisJbGVhZiA9IGNvcHMtPmxlYWYocSwgY2wpOworCWlmIChsZWFmKSB7CisJCWlmIChsZWFmID09IGFyZy0+cCB8fCBhcmctPmRlcHRoID4gNykKKwkJCXJldHVybiAtRUxPT1A7CisJCXJldHVybiBjaGVja19sb29wKGxlYWYsIGFyZy0+cCwgYXJnLT5kZXB0aCArIDEpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERlbGV0ZS9nZXQgcWRpc2MuCisgKi8KKworc3RhdGljIGludCB0Y19nZXRfcWRpc2Moc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJc3RydWN0IHRjbXNnICp0Y20gPSBOTE1TR19EQVRBKG4pOworCXN0cnVjdCBydGF0dHIgKip0Y2EgPSBhcmc7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl1MzIgY2xpZCA9IHRjbS0+dGNtX3BhcmVudDsKKwlzdHJ1Y3QgUWRpc2MgKnEgPSBOVUxMOworCXN0cnVjdCBRZGlzYyAqcCA9IE5VTEw7CisJaW50IGVycjsKKworCWlmICgoZGV2ID0gX19kZXZfZ2V0X2J5X2luZGV4KHRjbS0+dGNtX2lmaW5kZXgpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChjbGlkKSB7CisJCWlmIChjbGlkICE9IFRDX0hfUk9PVCkgeworCQkJaWYgKFRDX0hfTUFKKGNsaWQpICE9IFRDX0hfTUFKKFRDX0hfSU5HUkVTUykpIHsKKwkJCQlpZiAoKHAgPSBxZGlzY19sb29rdXAoZGV2LCBUQ19IX01BSihjbGlkKSkpID09IE5VTEwpCisJCQkJCXJldHVybiAtRU5PRU5UOworCQkJCXEgPSBxZGlzY19sZWFmKHAsIGNsaWQpOworCQkJfSBlbHNlIHsgLyogaW5ncmVzcyAqLworCQkJCXEgPSBkZXYtPnFkaXNjX2luZ3Jlc3M7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCX0gZWxzZSB7CisJCQlxID0gZGV2LT5xZGlzY19zbGVlcGluZzsKKwkJfQorCQlpZiAoIXEpCisJCQlyZXR1cm4gLUVOT0VOVDsKKworCQlpZiAodGNtLT50Y21faGFuZGxlICYmIHEtPmhhbmRsZSAhPSB0Y20tPnRjbV9oYW5kbGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlpZiAoKHEgPSBxZGlzY19sb29rdXAoZGV2LCB0Y20tPnRjbV9oYW5kbGUpKSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJaWYgKHRjYVtUQ0FfS0lORC0xXSAmJiBydGF0dHJfc3RyY21wKHRjYVtUQ0FfS0lORC0xXSwgcS0+b3BzLT5pZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG4tPm5sbXNnX3R5cGUgPT0gUlRNX0RFTFFESVNDKSB7CisJCWlmICghY2xpZCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAocS0+aGFuZGxlID09IDApCisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJaWYgKChlcnIgPSBxZGlzY19ncmFmdChkZXYsIHAsIGNsaWQsIE5VTEwsICZxKSkgIT0gMCkKKwkJCXJldHVybiBlcnI7CisJCWlmIChxKSB7CisJCQlxZGlzY19ub3RpZnkoc2tiLCBuLCBjbGlkLCBxLCBOVUxMKTsKKwkJCXNwaW5fbG9ja19iaCgmZGV2LT5xdWV1ZV9sb2NrKTsKKwkJCXFkaXNjX2Rlc3Ryb3kocSk7CisJCQlzcGluX3VubG9ja19iaCgmZGV2LT5xdWV1ZV9sb2NrKTsKKwkJfQorCX0gZWxzZSB7CisJCXFkaXNjX25vdGlmeShza2IsIG4sIGNsaWQsIE5VTEwsIHEpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAgIENyZWF0ZS9jaGFuZ2UgcWRpc2MuCisgKi8KKworc3RhdGljIGludCB0Y19tb2RpZnlfcWRpc2Moc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJc3RydWN0IHRjbXNnICp0Y207CisJc3RydWN0IHJ0YXR0ciAqKnRjYTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXUzMiBjbGlkOworCXN0cnVjdCBRZGlzYyAqcSwgKnA7CisJaW50IGVycjsKKworcmVwbGF5OgorCS8qIFJlaW5pdCwganVzdCBpbiBjYXNlIHNvbWV0aGluZyB0b3VjaGVzIHRoaXMuICovCisJdGNtID0gTkxNU0dfREFUQShuKTsKKwl0Y2EgPSBhcmc7CisJY2xpZCA9IHRjbS0+dGNtX3BhcmVudDsKKwlxID0gcCA9IE5VTEw7CisKKwlpZiAoKGRldiA9IF9fZGV2X2dldF9ieV9pbmRleCh0Y20tPnRjbV9pZmluZGV4KSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoY2xpZCkgeworCQlpZiAoY2xpZCAhPSBUQ19IX1JPT1QpIHsKKwkJCWlmIChjbGlkICE9IFRDX0hfSU5HUkVTUykgeworCQkJCWlmICgocCA9IHFkaXNjX2xvb2t1cChkZXYsIFRDX0hfTUFKKGNsaWQpKSkgPT0gTlVMTCkKKwkJCQkJcmV0dXJuIC1FTk9FTlQ7CisJCQkJcSA9IHFkaXNjX2xlYWYocCwgY2xpZCk7CisJCQl9IGVsc2UgeyAvKmluZ3Jlc3MgKi8KKwkJCQlxID0gZGV2LT5xZGlzY19pbmdyZXNzOworCQkJfQorCQl9IGVsc2UgeworCQkJcSA9IGRldi0+cWRpc2Nfc2xlZXBpbmc7CisJCX0KKworCQkvKiBJdCBtYXkgYmUgZGVmYXVsdCBxZGlzYywgaWdub3JlIGl0ICovCisJCWlmIChxICYmIHEtPmhhbmRsZSA9PSAwKQorCQkJcSA9IE5VTEw7CisKKwkJaWYgKCFxIHx8ICF0Y20tPnRjbV9oYW5kbGUgfHwgcS0+aGFuZGxlICE9IHRjbS0+dGNtX2hhbmRsZSkgeworCQkJaWYgKHRjbS0+dGNtX2hhbmRsZSkgeworCQkJCWlmIChxICYmICEobi0+bmxtc2dfZmxhZ3MmTkxNX0ZfUkVQTEFDRSkpCisJCQkJCXJldHVybiAtRUVYSVNUOworCQkJCWlmIChUQ19IX01JTih0Y20tPnRjbV9oYW5kbGUpKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlpZiAoKHEgPSBxZGlzY19sb29rdXAoZGV2LCB0Y20tPnRjbV9oYW5kbGUpKSA9PSBOVUxMKQorCQkJCQlnb3RvIGNyZWF0ZV9uX2dyYWZ0OworCQkJCWlmIChuLT5ubG1zZ19mbGFncyZOTE1fRl9FWENMKQorCQkJCQlyZXR1cm4gLUVFWElTVDsKKwkJCQlpZiAodGNhW1RDQV9LSU5ELTFdICYmIHJ0YXR0cl9zdHJjbXAodGNhW1RDQV9LSU5ELTFdLCBxLT5vcHMtPmlkKSkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJaWYgKHEgPT0gcCB8fAorCQkJCSAgICAocCAmJiBjaGVja19sb29wKHEsIHAsIDApKSkKKwkJCQkJcmV0dXJuIC1FTE9PUDsKKwkJCQlhdG9taWNfaW5jKCZxLT5yZWZjbnQpOworCQkJCWdvdG8gZ3JhZnQ7CisJCQl9IGVsc2UgeworCQkJCWlmIChxID09IE5VTEwpCisJCQkJCWdvdG8gY3JlYXRlX25fZ3JhZnQ7CisKKwkJCQkvKiBUaGlzIG1hZ2ljIHRlc3QgcmVxdWlyZXMgZXhwbGFuYXRpb24uCisJCQkJICoKKwkJCQkgKiAgIFdlIGtub3csIHRoYXQgc29tZSBjaGlsZCBxIGlzIGFscmVhZHkKKwkJCQkgKiAgIGF0dGFjaGVkIHRvIHRoaXMgcGFyZW50IGFuZCBoYXZlIGNob2ljZToKKwkJCQkgKiAgIGVpdGhlciB0byBjaGFuZ2UgaXQgb3IgdG8gY3JlYXRlL2dyYWZ0IG5ldyBvbmUuCisJCQkJICoKKwkJCQkgKiAgIDEuIFdlIGFyZSBhbGxvd2VkIHRvIGNyZWF0ZS9ncmFmdCBvbmx5CisJCQkJICogICBpZiBDUkVBVEUgYW5kIFJFUExBQ0UgZmxhZ3MgYXJlIHNldC4KKwkJCQkgKgorCQkJCSAqICAgMi4gSWYgRVhDTCBpcyBzZXQsIHJlcXVlc3RvciB3YW50ZWQgdG8gc2F5LAorCQkJCSAqICAgdGhhdCBxZGlzYyB0Y21faGFuZGxlIGlzIG5vdCBleHBlY3RlZAorCQkJCSAqICAgdG8gZXhpc3QsIHNvIHRoYXQgd2UgY2hvb3NlIGNyZWF0ZS9ncmFmdCB0b28uCisJCQkJICoKKwkJCQkgKiAgIDMuIFRoZSBsYXN0IGNhc2UgaXMgd2hlbiBubyBmbGFncyBhcmUgc2V0LgorCQkJCSAqICAgQWxhcywgaXQgaXMgc29ydCBvZiBob2xlIGluIEFQSSwgd2UKKwkJCQkgKiAgIGNhbm5vdCBkZWNpZGUgd2hhdCB0byBkbyB1bmFtYmlndW91c2x5LgorCQkJCSAqICAgRm9yIG5vdyB3ZSBzZWxlY3QgY3JlYXRlL2dyYWZ0LCBpZgorCQkJCSAqICAgdXNlciBnYXZlIEtJTkQsIHdoaWNoIGRvZXMgbm90IG1hdGNoIGV4aXN0aW5nLgorCQkJCSAqLworCQkJCWlmICgobi0+bmxtc2dfZmxhZ3MmTkxNX0ZfQ1JFQVRFKSAmJgorCQkJCSAgICAobi0+bmxtc2dfZmxhZ3MmTkxNX0ZfUkVQTEFDRSkgJiYKKwkJCQkgICAgKChuLT5ubG1zZ19mbGFncyZOTE1fRl9FWENMKSB8fAorCQkJCSAgICAgKHRjYVtUQ0FfS0lORC0xXSAmJgorCQkJCSAgICAgIHJ0YXR0cl9zdHJjbXAodGNhW1RDQV9LSU5ELTFdLCBxLT5vcHMtPmlkKSkpKQorCQkJCQlnb3RvIGNyZWF0ZV9uX2dyYWZ0OworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKCF0Y20tPnRjbV9oYW5kbGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcSA9IHFkaXNjX2xvb2t1cChkZXYsIHRjbS0+dGNtX2hhbmRsZSk7CisJfQorCisJLyogQ2hhbmdlIHFkaXNjIHBhcmFtZXRlcnMgKi8KKwlpZiAocSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0VOVDsKKwlpZiAobi0+bmxtc2dfZmxhZ3MmTkxNX0ZfRVhDTCkKKwkJcmV0dXJuIC1FRVhJU1Q7CisJaWYgKHRjYVtUQ0FfS0lORC0xXSAmJiBydGF0dHJfc3RyY21wKHRjYVtUQ0FfS0lORC0xXSwgcS0+b3BzLT5pZCkpCisJCXJldHVybiAtRUlOVkFMOworCWVyciA9IHFkaXNjX2NoYW5nZShxLCB0Y2EpOworCWlmIChlcnIgPT0gMCkKKwkJcWRpc2Nfbm90aWZ5KHNrYiwgbiwgY2xpZCwgTlVMTCwgcSk7CisJcmV0dXJuIGVycjsKKworY3JlYXRlX25fZ3JhZnQ6CisJaWYgKCEobi0+bmxtc2dfZmxhZ3MmTkxNX0ZfQ1JFQVRFKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJaWYgKGNsaWQgPT0gVENfSF9JTkdSRVNTKQorCQlxID0gcWRpc2NfY3JlYXRlKGRldiwgdGNtLT50Y21fcGFyZW50LCB0Y2EsICZlcnIpOworICAgICAgICBlbHNlCisJCXEgPSBxZGlzY19jcmVhdGUoZGV2LCB0Y20tPnRjbV9oYW5kbGUsIHRjYSwgJmVycik7CisJaWYgKHEgPT0gTlVMTCkgeworCQlpZiAoZXJyID09IC1FQUdBSU4pCisJCQlnb3RvIHJlcGxheTsKKwkJcmV0dXJuIGVycjsKKwl9CisKK2dyYWZ0OgorCWlmICgxKSB7CisJCXN0cnVjdCBRZGlzYyAqb2xkX3EgPSBOVUxMOworCQllcnIgPSBxZGlzY19ncmFmdChkZXYsIHAsIGNsaWQsIHEsICZvbGRfcSk7CisJCWlmIChlcnIpIHsKKwkJCWlmIChxKSB7CisJCQkJc3Bpbl9sb2NrX2JoKCZkZXYtPnF1ZXVlX2xvY2spOworCQkJCXFkaXNjX2Rlc3Ryb3kocSk7CisJCQkJc3Bpbl91bmxvY2tfYmgoJmRldi0+cXVldWVfbG9jayk7CisJCQl9CisJCQlyZXR1cm4gZXJyOworCQl9CisJCXFkaXNjX25vdGlmeShza2IsIG4sIGNsaWQsIG9sZF9xLCBxKTsKKwkJaWYgKG9sZF9xKSB7CisJCQlzcGluX2xvY2tfYmgoJmRldi0+cXVldWVfbG9jayk7CisJCQlxZGlzY19kZXN0cm95KG9sZF9xKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZkZXYtPnF1ZXVlX2xvY2spOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRjX2ZpbGxfcWRpc2Moc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjICpxLCB1MzIgY2xpZCwKKwkJCSB1MzIgcGlkLCB1MzIgc2VxLCB1bnNpZ25lZCBmbGFncywgaW50IGV2ZW50KQoreworCXN0cnVjdCB0Y21zZyAqdGNtOworCXN0cnVjdCBubG1zZ2hkciAgKm5saDsKKwl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3QgZ25ldF9kdW1wIGQ7CisKKwlubGggPSBOTE1TR19QVVQoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqdGNtKSk7CisJbmxoLT5ubG1zZ19mbGFncyA9IGZsYWdzOworCXRjbSA9IE5MTVNHX0RBVEEobmxoKTsKKwl0Y20tPnRjbV9mYW1pbHkgPSBBRl9VTlNQRUM7CisJdGNtLT50Y21faWZpbmRleCA9IHEtPmRldi0+aWZpbmRleDsKKwl0Y20tPnRjbV9wYXJlbnQgPSBjbGlkOworCXRjbS0+dGNtX2hhbmRsZSA9IHEtPmhhbmRsZTsKKwl0Y20tPnRjbV9pbmZvID0gYXRvbWljX3JlYWQoJnEtPnJlZmNudCk7CisJUlRBX1BVVChza2IsIFRDQV9LSU5ELCBJRk5BTVNJWiwgcS0+b3BzLT5pZCk7CisJaWYgKHEtPm9wcy0+ZHVtcCAmJiBxLT5vcHMtPmR1bXAocSwgc2tiKSA8IDApCisJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CisJcS0+cXN0YXRzLnFsZW4gPSBxLT5xLnFsZW47CisKKwlpZiAoZ25ldF9zdGF0c19zdGFydF9jb3B5X2NvbXBhdChza2IsIFRDQV9TVEFUUzIsIFRDQV9TVEFUUywKKwkJCVRDQV9YU1RBVFMsIHEtPnN0YXRzX2xvY2ssICZkKSA8IDApCisJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CisKKwlpZiAocS0+b3BzLT5kdW1wX3N0YXRzICYmIHEtPm9wcy0+ZHVtcF9zdGF0cyhxLCAmZCkgPCAwKQorCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOworCisJaWYgKGduZXRfc3RhdHNfY29weV9iYXNpYygmZCwgJnEtPmJzdGF0cykgPCAwIHx8CisjaWZkZWYgQ09ORklHX05FVF9FU1RJTUFUT1IKKwkgICAgZ25ldF9zdGF0c19jb3B5X3JhdGVfZXN0KCZkLCAmcS0+cmF0ZV9lc3QpIDwgMCB8fAorI2VuZGlmCisJICAgIGduZXRfc3RhdHNfY29weV9xdWV1ZSgmZCwgJnEtPnFzdGF0cykgPCAwKQorCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOworCQorCWlmIChnbmV0X3N0YXRzX2ZpbmlzaF9jb3B5KCZkKSA8IDApCisJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CisJCisJbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCXJldHVybiBza2ItPmxlbjsKKworbmxtc2dfZmFpbHVyZToKK3J0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHFkaXNjX25vdGlmeShzdHJ1Y3Qgc2tfYnVmZiAqb3NrYiwgc3RydWN0IG5sbXNnaGRyICpuLAorCQkJdTMyIGNsaWQsIHN0cnVjdCBRZGlzYyAqb2xkLCBzdHJ1Y3QgUWRpc2MgKm5ldykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUzMiBwaWQgPSBvc2tiID8gTkVUTElOS19DQihvc2tiKS5waWQgOiAwOworCisJc2tiID0gYWxsb2Nfc2tiKE5MTVNHX0dPT0RTSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJaWYgKG9sZCAmJiBvbGQtPmhhbmRsZSkgeworCQlpZiAodGNfZmlsbF9xZGlzYyhza2IsIG9sZCwgY2xpZCwgcGlkLCBuLT5ubG1zZ19zZXEsIDAsIFJUTV9ERUxRRElTQykgPCAwKQorCQkJZ290byBlcnJfb3V0OworCX0KKwlpZiAobmV3KSB7CisJCWlmICh0Y19maWxsX3FkaXNjKHNrYiwgbmV3LCBjbGlkLCBwaWQsIG4tPm5sbXNnX3NlcSwgb2xkID8gTkxNX0ZfUkVQTEFDRSA6IDAsIFJUTV9ORVdRRElTQykgPCAwKQorCQkJZ290byBlcnJfb3V0OworCX0KKworCWlmIChza2ItPmxlbikKKwkJcmV0dXJuIHJ0bmV0bGlua19zZW5kKHNrYiwgcGlkLCBSVE1HUlBfVEMsIG4tPm5sbXNnX2ZsYWdzJk5MTV9GX0VDSE8pOworCitlcnJfb3V0OgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHRjX2R1bXBfcWRpc2Moc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCWludCBpZHgsIHFfaWR4OworCWludCBzX2lkeCwgc19xX2lkeDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBRZGlzYyAqcTsKKworCXNfaWR4ID0gY2ItPmFyZ3NbMF07CisJc19xX2lkeCA9IHFfaWR4ID0gY2ItPmFyZ3NbMV07CisJcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKwlmb3IgKGRldj1kZXZfYmFzZSwgaWR4PTA7IGRldjsgZGV2ID0gZGV2LT5uZXh0LCBpZHgrKykgeworCQlpZiAoaWR4IDwgc19pZHgpCisJCQljb250aW51ZTsKKwkJaWYgKGlkeCA+IHNfaWR4KQorCQkJc19xX2lkeCA9IDA7CisJCXJlYWRfbG9ja19iaCgmcWRpc2NfdHJlZV9sb2NrKTsKKwkJcV9pZHggPSAwOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHEsICZkZXYtPnFkaXNjX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChxX2lkeCA8IHNfcV9pZHgpIHsKKwkJCQlxX2lkeCsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHRjX2ZpbGxfcWRpc2Moc2tiLCBxLCBxLT5wYXJlbnQsIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLAorCQkJCQkgIGNiLT5ubGgtPm5sbXNnX3NlcSwgTkxNX0ZfTVVMVEksIFJUTV9ORVdRRElTQykgPD0gMCkgeworCQkJCXJlYWRfdW5sb2NrX2JoKCZxZGlzY190cmVlX2xvY2spOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCXFfaWR4Kys7CisJCX0KKwkJcmVhZF91bmxvY2tfYmgoJnFkaXNjX3RyZWVfbG9jayk7CisJfQorCitkb25lOgorCXJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKworCWNiLT5hcmdzWzBdID0gaWR4OworCWNiLT5hcmdzWzFdID0gcV9pZHg7CisKKwlyZXR1cm4gc2tiLT5sZW47Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglUcmFmZmljIGNsYXNzZXMgbWFuaXB1bGF0aW9uLgkJKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKK3N0YXRpYyBpbnQgdGNfY3RsX3RjbGFzcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdGNtc2cgKnRjbSA9IE5MTVNHX0RBVEEobik7CisJc3RydWN0IHJ0YXR0ciAqKnRjYSA9IGFyZzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBRZGlzYyAqcSA9IE5VTEw7CisJc3RydWN0IFFkaXNjX2NsYXNzX29wcyAqY29wczsKKwl1bnNpZ25lZCBsb25nIGNsID0gMDsKKwl1bnNpZ25lZCBsb25nIG5ld19jbDsKKwl1MzIgcGlkID0gdGNtLT50Y21fcGFyZW50OworCXUzMiBjbGlkID0gdGNtLT50Y21faGFuZGxlOworCXUzMiBxaWQgPSBUQ19IX01BSihjbGlkKTsKKwlpbnQgZXJyOworCisJaWYgKChkZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgodGNtLT50Y21faWZpbmRleCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJLyoKKwkgICBwYXJlbnQgPT0gVENfSF9VTlNQRUMgLSB1bnNwZWNpZmllZCBwYXJlbnQuCisJICAgcGFyZW50ID09IFRDX0hfUk9PVCAgIC0gY2xhc3MgaXMgcm9vdCwgd2hpY2ggaGFzIG5vIHBhcmVudC4KKwkgICBwYXJlbnQgPT0gWDowCSAtIHBhcmVudCBpcyByb290IGNsYXNzLgorCSAgIHBhcmVudCA9PSBYOlkJIC0gcGFyZW50IGlzIGEgbm9kZSBpbiBoaWVyYXJjaHkuCisJICAgcGFyZW50ID09IDA6WQkgLSBwYXJlbnQgaXMgWDpZLCB3aGVyZSBYOjAgaXMgcWRpc2MuCisKKwkgICBoYW5kbGUgPT0gMDowCSAtIGdlbmVyYXRlIGhhbmRsZSBmcm9tIGtlcm5lbCBwb29sLgorCSAgIGhhbmRsZSA9PSAwOlkJIC0gY2xhc3MgaXMgWDpZLCB3aGVyZSBYOjAgaXMgcWRpc2MuCisJICAgaGFuZGxlID09IFg6WQkgLSBjbGVhci4KKwkgICBoYW5kbGUgPT0gWDowCSAtIHJvb3QgY2xhc3MuCisJICovCisKKwkvKiBTdGVwIDEuIERldGVybWluZSBxZGlzYyBoYW5kbGUgWDowICovCisKKwlpZiAocGlkICE9IFRDX0hfUk9PVCkgeworCQl1MzIgcWlkMSA9IFRDX0hfTUFKKHBpZCk7CisKKwkJaWYgKHFpZCAmJiBxaWQxKSB7CisJCQkvKiBJZiBib3RoIG1ham9ycyBhcmUga25vd24sIHRoZXkgbXVzdCBiZSBpZGVudGljYWwuICovCisJCQlpZiAocWlkICE9IHFpZDEpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSBpZiAocWlkMSkgeworCQkJcWlkID0gcWlkMTsKKwkJfSBlbHNlIGlmIChxaWQgPT0gMCkKKwkJCXFpZCA9IGRldi0+cWRpc2Nfc2xlZXBpbmctPmhhbmRsZTsKKworCQkvKiBOb3cgcWlkIGlzIGdlbnVpbmUgcWRpc2MgaGFuZGxlIGNvbnNpc3RlbnQKKwkJICAgYm90aCB3aXRoIHBhcmVudCBhbmQgY2hpbGQuCisKKwkJICAgVENfSF9NQUoocGlkKSBzdGlsbCBtYXkgYmUgdW5zcGVjaWZpZWQsIGNvbXBsZXRlIGl0IG5vdy4KKwkJICovCisJCWlmIChwaWQpCisJCQlwaWQgPSBUQ19IX01BS0UocWlkLCBwaWQpOworCX0gZWxzZSB7CisJCWlmIChxaWQgPT0gMCkKKwkJCXFpZCA9IGRldi0+cWRpc2Nfc2xlZXBpbmctPmhhbmRsZTsKKwl9CisKKwkvKiBPSy4gTG9jYXRlIHFkaXNjICovCisJaWYgKChxID0gcWRpc2NfbG9va3VwKGRldiwgcWlkKSkgPT0gTlVMTCkgCisJCXJldHVybiAtRU5PRU5UOworCisJLyogQW4gY2hlY2sgdGhhdCBpdCBzdXBwb3J0cyBjbGFzc2VzICovCisJY29wcyA9IHEtPm9wcy0+Y2xfb3BzOworCWlmIChjb3BzID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogTm93IHRyeSB0byBnZXQgY2xhc3MgKi8KKwlpZiAoY2xpZCA9PSAwKSB7CisJCWlmIChwaWQgPT0gVENfSF9ST09UKQorCQkJY2xpZCA9IHFpZDsKKwl9IGVsc2UKKwkJY2xpZCA9IFRDX0hfTUFLRShxaWQsIGNsaWQpOworCisJaWYgKGNsaWQpCisJCWNsID0gY29wcy0+Z2V0KHEsIGNsaWQpOworCisJaWYgKGNsID09IDApIHsKKwkJZXJyID0gLUVOT0VOVDsKKwkJaWYgKG4tPm5sbXNnX3R5cGUgIT0gUlRNX05FV1RDTEFTUyB8fCAhKG4tPm5sbXNnX2ZsYWdzJk5MTV9GX0NSRUFURSkpCisJCQlnb3RvIG91dDsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKG4tPm5sbXNnX3R5cGUpIHsKKwkJY2FzZSBSVE1fTkVXVENMQVNTOgkKKwkJCWVyciA9IC1FRVhJU1Q7CisJCQlpZiAobi0+bmxtc2dfZmxhZ3MmTkxNX0ZfRVhDTCkKKwkJCQlnb3RvIG91dDsKKwkJCWJyZWFrOworCQljYXNlIFJUTV9ERUxUQ0xBU1M6CisJCQllcnIgPSBjb3BzLT5kZWxldGUocSwgY2wpOworCQkJaWYgKGVyciA9PSAwKQorCQkJCXRjbGFzc19ub3RpZnkoc2tiLCBuLCBxLCBjbCwgUlRNX0RFTFRDTEFTUyk7CisJCQlnb3RvIG91dDsKKwkJY2FzZSBSVE1fR0VUVENMQVNTOgorCQkJZXJyID0gdGNsYXNzX25vdGlmeShza2IsIG4sIHEsIGNsLCBSVE1fTkVXVENMQVNTKTsKKwkJCWdvdG8gb3V0OworCQlkZWZhdWx0OgorCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJbmV3X2NsID0gY2w7CisJZXJyID0gY29wcy0+Y2hhbmdlKHEsIGNsaWQsIHBpZCwgdGNhLCAmbmV3X2NsKTsKKwlpZiAoZXJyID09IDApCisJCXRjbGFzc19ub3RpZnkoc2tiLCBuLCBxLCBuZXdfY2wsIFJUTV9ORVdUQ0xBU1MpOworCitvdXQ6CisJaWYgKGNsKQorCQljb3BzLT5wdXQocSwgY2wpOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IHRjX2ZpbGxfdGNsYXNzKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBRZGlzYyAqcSwKKwkJCSAgdW5zaWduZWQgbG9uZyBjbCwKKwkJCSAgdTMyIHBpZCwgdTMyIHNlcSwgdW5zaWduZWQgZmxhZ3MsIGludCBldmVudCkKK3sKKwlzdHJ1Y3QgdGNtc2cgKnRjbTsKKwlzdHJ1Y3Qgbmxtc2doZHIgICpubGg7CisJdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJc3RydWN0IGduZXRfZHVtcCBkOworCXN0cnVjdCBRZGlzY19jbGFzc19vcHMgKmNsX29wcyA9IHEtPm9wcy0+Y2xfb3BzOworCisJbmxoID0gTkxNU0dfUFVUKHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKnRjbSkpOworCW5saC0+bmxtc2dfZmxhZ3MgPSBmbGFnczsKKwl0Y20gPSBOTE1TR19EQVRBKG5saCk7CisJdGNtLT50Y21fZmFtaWx5ID0gQUZfVU5TUEVDOworCXRjbS0+dGNtX2lmaW5kZXggPSBxLT5kZXYtPmlmaW5kZXg7CisJdGNtLT50Y21fcGFyZW50ID0gcS0+aGFuZGxlOworCXRjbS0+dGNtX2hhbmRsZSA9IHEtPmhhbmRsZTsKKwl0Y20tPnRjbV9pbmZvID0gMDsKKwlSVEFfUFVUKHNrYiwgVENBX0tJTkQsIElGTkFNU0laLCBxLT5vcHMtPmlkKTsKKwlpZiAoY2xfb3BzLT5kdW1wICYmIGNsX29wcy0+ZHVtcChxLCBjbCwgc2tiLCB0Y20pIDwgMCkKKwkJZ290byBydGF0dHJfZmFpbHVyZTsKKworCWlmIChnbmV0X3N0YXRzX3N0YXJ0X2NvcHlfY29tcGF0KHNrYiwgVENBX1NUQVRTMiwgVENBX1NUQVRTLAorCQkJVENBX1hTVEFUUywgcS0+c3RhdHNfbG9jaywgJmQpIDwgMCkKKwkJZ290byBydGF0dHJfZmFpbHVyZTsKKworCWlmIChjbF9vcHMtPmR1bXBfc3RhdHMgJiYgY2xfb3BzLT5kdW1wX3N0YXRzKHEsIGNsLCAmZCkgPCAwKQorCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOworCisJaWYgKGduZXRfc3RhdHNfZmluaXNoX2NvcHkoJmQpIDwgMCkKKwkJZ290byBydGF0dHJfZmFpbHVyZTsKKworCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlyZXR1cm4gc2tiLT5sZW47CisKK25sbXNnX2ZhaWx1cmU6CitydGF0dHJfZmFpbHVyZToKKwlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCB0Y2xhc3Nfbm90aWZ5KHN0cnVjdCBza19idWZmICpvc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sCisJCQkgIHN0cnVjdCBRZGlzYyAqcSwgdW5zaWduZWQgbG9uZyBjbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdTMyIHBpZCA9IG9za2IgPyBORVRMSU5LX0NCKG9za2IpLnBpZCA6IDA7CisKKwlza2IgPSBhbGxvY19za2IoTkxNU0dfR09PRFNJWkUsIEdGUF9LRVJORUwpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwlpZiAodGNfZmlsbF90Y2xhc3Moc2tiLCBxLCBjbCwgcGlkLCBuLT5ubG1zZ19zZXEsIDAsIGV2ZW50KSA8IDApIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBydG5ldGxpbmtfc2VuZChza2IsIHBpZCwgUlRNR1JQX1RDLCBuLT5ubG1zZ19mbGFncyZOTE1fRl9FQ0hPKTsKK30KKworc3RydWN0IHFkaXNjX2R1bXBfYXJncworeworCXN0cnVjdCBxZGlzY193YWxrZXIgdzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYjsKK307CisKK3N0YXRpYyBpbnQgcWRpc2NfY2xhc3NfZHVtcChzdHJ1Y3QgUWRpc2MgKnEsIHVuc2lnbmVkIGxvbmcgY2wsIHN0cnVjdCBxZGlzY193YWxrZXIgKmFyZykKK3sKKwlzdHJ1Y3QgcWRpc2NfZHVtcF9hcmdzICphID0gKHN0cnVjdCBxZGlzY19kdW1wX2FyZ3MgKilhcmc7CisKKwlyZXR1cm4gdGNfZmlsbF90Y2xhc3MoYS0+c2tiLCBxLCBjbCwgTkVUTElOS19DQihhLT5jYi0+c2tiKS5waWQsCisJCQkgICAgICBhLT5jYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLCBSVE1fTkVXVENMQVNTKTsKK30KKworc3RhdGljIGludCB0Y19kdW1wX3RjbGFzcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJaW50IHQ7CisJaW50IHNfdDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBRZGlzYyAqcTsKKwlzdHJ1Y3QgdGNtc2cgKnRjbSA9IChzdHJ1Y3QgdGNtc2cqKU5MTVNHX0RBVEEoY2ItPm5saCk7CisJc3RydWN0IHFkaXNjX2R1bXBfYXJncyBhcmc7CisKKwlpZiAoY2ItPm5saC0+bmxtc2dfbGVuIDwgTkxNU0dfTEVOR1RIKHNpemVvZigqdGNtKSkpCisJCXJldHVybiAwOworCWlmICgoZGV2ID0gZGV2X2dldF9ieV9pbmRleCh0Y20tPnRjbV9pZmluZGV4KSkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlzX3QgPSBjYi0+YXJnc1swXTsKKwl0ID0gMDsKKworCXJlYWRfbG9ja19iaCgmcWRpc2NfdHJlZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHEsICZkZXYtPnFkaXNjX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHQgPCBzX3QgfHwgIXEtPm9wcy0+Y2xfb3BzIHx8CisJCSAgICAodGNtLT50Y21fcGFyZW50ICYmCisJCSAgICAgVENfSF9NQUoodGNtLT50Y21fcGFyZW50KSAhPSBxLT5oYW5kbGUpKSB7CisJCQl0Kys7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAodCA+IHNfdCkKKwkJCW1lbXNldCgmY2ItPmFyZ3NbMV0sIDAsIHNpemVvZihjYi0+YXJncyktc2l6ZW9mKGNiLT5hcmdzWzBdKSk7CisJCWFyZy53LmZuID0gcWRpc2NfY2xhc3NfZHVtcDsKKwkJYXJnLnNrYiA9IHNrYjsKKwkJYXJnLmNiID0gY2I7CisJCWFyZy53LnN0b3AgID0gMDsKKwkJYXJnLncuc2tpcCA9IGNiLT5hcmdzWzFdOworCQlhcmcudy5jb3VudCA9IDA7CisJCXEtPm9wcy0+Y2xfb3BzLT53YWxrKHEsICZhcmcudyk7CisJCWNiLT5hcmdzWzFdID0gYXJnLncuY291bnQ7CisJCWlmIChhcmcudy5zdG9wKQorCQkJYnJlYWs7CisJCXQrKzsKKwl9CisJcmVhZF91bmxvY2tfYmgoJnFkaXNjX3RyZWVfbG9jayk7CisKKwljYi0+YXJnc1swXSA9IHQ7CisKKwlkZXZfcHV0KGRldik7CisJcmV0dXJuIHNrYi0+bGVuOworfQorCisvKiBNYWluIGNsYXNzaWZpZXIgcm91dGluZTogc2NhbnMgY2xhc3NpZmllciBjaGFpbiBhdHRhY2hlZAorICAgdG8gdGhpcyBxZGlzYywgKG9wdGlvbmFsbHkpIHRlc3RzIGZvciBwcm90b2NvbCBhbmQgYXNrcworICAgc3BlY2lmaWMgY2xhc3NpZmllcnMuCisgKi8KK2ludCB0Y19jbGFzc2lmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKKwlzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQoreworCWludCBlcnIgPSAwOworCXUzMiBwcm90b2NvbCA9IHNrYi0+cHJvdG9jb2w7CisjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCisJc3RydWN0IHRjZl9wcm90byAqb3RwID0gdHA7CityZWNsYXNzaWZ5OgorI2VuZGlmCisJcHJvdG9jb2wgPSBza2ItPnByb3RvY29sOworCisJZm9yICggOyB0cDsgdHAgPSB0cC0+bmV4dCkgeworCQlpZiAoKHRwLT5wcm90b2NvbCA9PSBwcm90b2NvbCB8fAorCQkJdHAtPnByb3RvY29sID09IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfQUxMKSkgJiYKKwkJCShlcnIgPSB0cC0+Y2xhc3NpZnkoc2tiLCB0cCwgcmVzKSkgPj0gMCkgeworI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAorCQkJaWYgKCBUQ19BQ1RfUkVDTEFTU0lGWSA9PSBlcnIpIHsKKwkJCQlfX3UzMiB2ZXJkID0gKF9fdTMyKSBHX1RDX1ZFUkQoc2tiLT50Y192ZXJkKTsKKwkJCQl0cCA9IG90cDsKKworCQkJCWlmIChNQVhfUkVDX0xPT1AgPCB2ZXJkKyspIHsKKwkJCQkJcHJpbnRrKCJydWxlIHByaW8gJWQgcHJvdG9jb2wgJTAyeCByZWNsYXNzaWZ5IGlzIGJ1Z2d5IHBhY2tldCBkcm9wcGVkXG4iLAorCQkJCQkJdHAtPnByaW8mMHhmZmZmLCBudG9ocyh0cC0+cHJvdG9jb2wpKTsKKwkJCQkJcmV0dXJuIFRDX0FDVF9TSE9UOworCQkJCX0KKwkJCQlza2ItPnRjX3ZlcmQgPSBTRVRfVENfVkVSRChza2ItPnRjX3ZlcmQsdmVyZCk7CisJCQkJZ290byByZWNsYXNzaWZ5OworCQkJfSBlbHNlIHsKKwkJCQlpZiAoc2tiLT50Y192ZXJkKSAKKwkJCQkJc2tiLT50Y192ZXJkID0gU0VUX1RDX1ZFUkQoc2tiLT50Y192ZXJkLDApOworCQkJCXJldHVybiBlcnI7CisJCQl9CisjZWxzZQorCisJCQlyZXR1cm4gZXJyOworI2VuZGlmCisJCX0KKworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgcHNjaGVkX3VzX3Blcl90aWNrID0gMTsKK3N0YXRpYyBpbnQgcHNjaGVkX3RpY2tfcGVyX3VzID0gMTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgaW50IHBzY2hlZF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXNlcV9wcmludGYoc2VxLCAiJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKKwkJICAgICAgcHNjaGVkX3RpY2tfcGVyX3VzLCBwc2NoZWRfdXNfcGVyX3RpY2ssCisJCSAgICAgIDEwMDAwMDAsIEhaKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBzY2hlZF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwc2NoZWRfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBzY2hlZF9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gcHNjaGVkX29wZW4sCisJLnJlYWQgID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsJCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19ORVRfU0NIX0NMS19DUFUKK3BzY2hlZF90ZGlmZl90IHBzY2hlZF9jbG9ja19wZXJfaHo7CitpbnQgcHNjaGVkX2Nsb2NrX3NjYWxlOworRVhQT1JUX1NZTUJPTChwc2NoZWRfY2xvY2tfcGVyX2h6KTsKK0VYUE9SVF9TWU1CT0wocHNjaGVkX2Nsb2NrX3NjYWxlKTsKKworcHNjaGVkX3RpbWVfdCBwc2NoZWRfdGltZV9iYXNlOworY3ljbGVzX3QgcHNjaGVkX3RpbWVfbWFyazsKK0VYUE9SVF9TWU1CT0wocHNjaGVkX3RpbWVfbWFyayk7CitFWFBPUlRfU1lNQk9MKHBzY2hlZF90aW1lX2Jhc2UpOworCisvKgorICogUGVyaW9kaWNhbGx5IGFkanVzdCBwc2NoZWRfdGltZV9iYXNlIHRvIGF2b2lkIG92ZXJmbG93CisgKiB3aXRoIDMyLWJpdCBnZXRfY3ljbGVzKCkuIFNhZmUgdXAgdG8gNEdIeiBDUFUuCisgKi8KK3N0YXRpYyB2b2lkIHBzY2hlZF90aWNrKHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHBzY2hlZF90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKHBzY2hlZF90aWNrLCAwLCAwKTsKKworc3RhdGljIHZvaWQgcHNjaGVkX3RpY2sodW5zaWduZWQgbG9uZyBkdW1teSkKK3sKKwlpZiAoc2l6ZW9mKGN5Y2xlc190KSA9PSBzaXplb2YodTMyKSkgeworCQlwc2NoZWRfdGltZV90IGR1bW15X3N0YW1wOworCQlQU0NIRURfR0VUX1RJTUUoZHVtbXlfc3RhbXApOworCQlwc2NoZWRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAxKkhaOworCQlhZGRfdGltZXIoJnBzY2hlZF90aW1lcik7CisJfQorfQorCitpbnQgX19pbml0IHBzY2hlZF9jYWxpYnJhdGVfY2xvY2sodm9pZCkKK3sKKwlwc2NoZWRfdGltZV90IHN0YW1wLCBzdGFtcDE7CisJc3RydWN0IHRpbWV2YWwgdHYsIHR2MTsKKwlwc2NoZWRfdGRpZmZfdCBkZWxheTsKKwlsb25nIHJkZWxheTsKKwl1bnNpZ25lZCBsb25nIHN0b3A7CisKKwlwc2NoZWRfdGljaygwKTsKKwlzdG9wID0gamlmZmllcyArIEhaLzEwOworCVBTQ0hFRF9HRVRfVElNRShzdGFtcCk7CisJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHN0b3ApKSB7CisJCWJhcnJpZXIoKTsKKwkJY3B1X3JlbGF4KCk7CisJfQorCVBTQ0hFRF9HRVRfVElNRShzdGFtcDEpOworCWRvX2dldHRpbWVvZmRheSgmdHYxKTsKKworCWRlbGF5ID0gUFNDSEVEX1RESUZGKHN0YW1wMSwgc3RhbXApOworCXJkZWxheSA9IHR2MS50dl91c2VjIC0gdHYudHZfdXNlYzsKKwlyZGVsYXkgKz0gKHR2MS50dl9zZWMgLSB0di50dl9zZWMpKjEwMDAwMDA7CisJaWYgKHJkZWxheSA+IGRlbGF5KQorCQlyZXR1cm4gLTE7CisJZGVsYXkgLz0gcmRlbGF5OworCXBzY2hlZF90aWNrX3Blcl91cyA9IGRlbGF5OworCXdoaWxlICgoZGVsYXk+Pj0xKSAhPSAwKQorCQlwc2NoZWRfY2xvY2tfc2NhbGUrKzsKKwlwc2NoZWRfdXNfcGVyX3RpY2sgPSAxPDxwc2NoZWRfY2xvY2tfc2NhbGU7CisJcHNjaGVkX2Nsb2NrX3Blcl9oeiA9IChwc2NoZWRfdGlja19wZXJfdXMqKDEwMDAwMDAvSFopKT4+cHNjaGVkX2Nsb2NrX3NjYWxlOworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IHBrdHNjaGVkX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcnRuZXRsaW5rX2xpbmsgKmxpbmtfcDsKKworI2lmZGVmIENPTkZJR19ORVRfU0NIX0NMS19DUFUKKwlpZiAocHNjaGVkX2NhbGlicmF0ZV9jbG9jaygpIDwgMCkKKwkJcmV0dXJuIC0xOworI2VsaWYgZGVmaW5lZChDT05GSUdfTkVUX1NDSF9DTEtfSklGRklFUykKKwlwc2NoZWRfdGlja19wZXJfdXMgPSBIWjw8UFNDSEVEX0pTQ0FMRTsKKwlwc2NoZWRfdXNfcGVyX3RpY2sgPSAxMDAwMDAwOworI2VuZGlmCisKKwlsaW5rX3AgPSBydG5ldGxpbmtfbGlua3NbUEZfVU5TUEVDXTsKKworCS8qIFNldHVwIHJ0bmV0bGluayBsaW5rcy4gSXQgaXMgbWFkZSBoZXJlIHRvIGF2b2lkCisJICAgZXhwb3J0aW5nIGxhcmdlIG51bWJlciBvZiBwdWJsaWMgc3ltYm9scy4KKwkgKi8KKworCWlmIChsaW5rX3ApIHsKKwkJbGlua19wW1JUTV9ORVdRRElTQy1SVE1fQkFTRV0uZG9pdCA9IHRjX21vZGlmeV9xZGlzYzsKKwkJbGlua19wW1JUTV9ERUxRRElTQy1SVE1fQkFTRV0uZG9pdCA9IHRjX2dldF9xZGlzYzsKKwkJbGlua19wW1JUTV9HRVRRRElTQy1SVE1fQkFTRV0uZG9pdCA9IHRjX2dldF9xZGlzYzsKKwkJbGlua19wW1JUTV9HRVRRRElTQy1SVE1fQkFTRV0uZHVtcGl0ID0gdGNfZHVtcF9xZGlzYzsKKwkJbGlua19wW1JUTV9ORVdUQ0xBU1MtUlRNX0JBU0VdLmRvaXQgPSB0Y19jdGxfdGNsYXNzOworCQlsaW5rX3BbUlRNX0RFTFRDTEFTUy1SVE1fQkFTRV0uZG9pdCA9IHRjX2N0bF90Y2xhc3M7CisJCWxpbmtfcFtSVE1fR0VUVENMQVNTLVJUTV9CQVNFXS5kb2l0ID0gdGNfY3RsX3RjbGFzczsKKwkJbGlua19wW1JUTV9HRVRUQ0xBU1MtUlRNX0JBU0VdLmR1bXBpdCA9IHRjX2R1bXBfdGNsYXNzOworCX0KKworCXJlZ2lzdGVyX3FkaXNjKCZwZmlmb19xZGlzY19vcHMpOworCXJlZ2lzdGVyX3FkaXNjKCZiZmlmb19xZGlzY19vcHMpOworCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJwc2NoZWQiLCAwLCAmcHNjaGVkX2ZvcHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N1YnN5c19pbml0Y2FsbChwa3RzY2hlZF9pbml0KTsKKworRVhQT1JUX1NZTUJPTChxZGlzY19nZXRfcnRhYik7CitFWFBPUlRfU1lNQk9MKHFkaXNjX3B1dF9ydGFiKTsKK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfcWRpc2MpOworRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX3FkaXNjKTsKK0VYUE9SVF9TWU1CT0wodGNfY2xhc3NpZnkpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9hdG0uYyBiL25ldC9zY2hlZC9zY2hfYXRtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNlYmNlNAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY2hlZC9zY2hfYXRtLmMKQEAgLTAsMCArMSw3MzUgQEAKKy8qIG5ldC9zY2hlZC9zY2hfYXRtLmMgLSBBVE0gVkMgc2VsZWN0aW9uICJxdWV1ZWluZyBkaXNjaXBsaW5lIiAqLworCisvKiBXcml0dGVuIDE5OTgtMjAwMCBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIEVQRkwgSUNBICovCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWNsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+IC8qIGZvciBmcHV0ICovCisjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKworZXh0ZXJuIHN0cnVjdCBzb2NrZXQgKnNvY2tmZF9sb29rdXAoaW50IGZkLCBpbnQgKmVycik7IC8qIEBAQCBmaXggdGhpcyAqLworCisjaWYgMCAvKiBjb250cm9sICovCisjZGVmaW5lIERQUklOVEsoZm9ybWF0LGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCwjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBEUFJJTlRLKGZvcm1hdCxhcmdzLi4uKQorI2VuZGlmCisKKyNpZiAwIC8qIGRhdGEgKi8KKyNkZWZpbmUgRDJQUklOVEsoZm9ybWF0LGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCwjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBEMlBSSU5USyhmb3JtYXQsYXJncy4uLikKKyNlbmRpZgorCisKKy8qCisgKiBUaGUgQVRNIHF1ZXVpbmcgZGlzY2lwbGluZSBwcm92aWRlcyBhIGZyYW1ld29yayBmb3IgaW52b2tpbmcgY2xhc3NpZmllcnMKKyAqIChha2EgImZpbHRlcnMiKSwgd2hpY2ggaW4gdHVybiBzZWxlY3QgY2xhc3NlcyBvZiB0aGlzIHF1ZXVpbmcgZGlzY2lwbGluZS4KKyAqIEVhY2ggY2xhc3MgbWFwcyB0aGUgZmxvdyhzKSBpdCBpcyBoYW5kbGluZyB0byBhIGdpdmVuIFZDLiBNdWx0aXBsZSBjbGFzc2VzCisgKiBtYXkgc2hhcmUgdGhlIHNhbWUgVkMuCisgKgorICogV2hlbiBjcmVhdGluZyBhIGNsYXNzLCBWQ3MgYXJlIHNwZWNpZmllZCBieSBwYXNzaW5nIHRoZSBudW1iZXIgb2YgdGhlIG9wZW4KKyAqIHNvY2tldCBkZXNjcmlwdG9yIGJ5IHdoaWNoIHRoZSBjYWxsaW5nIHByb2Nlc3MgcmVmZXJlbmNlcyB0aGUgVkMuIFRoZSBrZXJuZWwKKyAqIGtlZXBzIHRoZSBWQyBvcGVuIGF0IGxlYXN0IHVudGlsIGFsbCBjbGFzc2VzIHVzaW5nIGl0IGFyZSByZW1vdmVkLgorICoKKyAqIEluIHRoaXMgZmlsZSwgbW9zdCBmdW5jdGlvbnMgYXJlIG5hbWVkIGF0bV90Y18qIHRvIGF2b2lkIGNvbmZ1c2lvbiB3aXRoIGFsbAorICogdGhlIGF0bV8qIGluIG5ldC9hdG0uIFRoaXMgbmFtaW5nIGNvbnZlbnRpb24gZGlmZmVycyBmcm9tIHdoYXQncyB1c2VkIGluIHRoZQorICogcmVzdCBvZiBuZXQvc2NoZWQuCisgKgorICogS25vd24gYnVnczoKKyAqICAtIHNvbWV0aW1lcyBtZXNzZXMgdXAgdGhlIElQIHN0YWNrCisgKiAgLSBhbnkgbWFuaXB1bGF0aW9ucyBiZXNpZGVzIHRoZSBmZXcgb3BlcmF0aW9ucyBkZXNjcmliZWQgaW4gdGhlIFJFQURNRSwgYXJlCisgKiAgICB1bnRlc3RlZCBhbmQgbGlrZWx5IHRvIGNyYXNoIHRoZSBzeXN0ZW0KKyAqICAtIHNob3VsZCBsb2NrIHRoZSBmbG93IHdoaWxlIHRoZXJlIGlzIGRhdGEgaW4gdGhlIHF1ZXVlICg/KQorICovCisKKworI2RlZmluZSBQUklWKHNjaCkgcWRpc2NfcHJpdihzY2gpCisjZGVmaW5lIFZDQzJGTE9XKHZjYykgKChzdHJ1Y3QgYXRtX2Zsb3dfZGF0YSAqKSAoKHZjYyktPnVzZXJfYmFjaykpCisKKworc3RydWN0IGF0bV9mbG93X2RhdGEgeworCXN0cnVjdCBRZGlzYwkJKnE7CQkvKiBGSUZPLCBUQkYsIGV0Yy4gKi8KKwlzdHJ1Y3QgdGNmX3Byb3RvCSpmaWx0ZXJfbGlzdDsKKwlzdHJ1Y3QgYXRtX3ZjYwkJKnZjYzsJCS8qIFZDQzsgTlVMTCBpZiBWQ0MgaXMgY2xvc2VkICovCisJdm9pZCAoKm9sZF9wb3ApKHN0cnVjdCBhdG1fdmNjICp2Y2Msc3RydWN0IHNrX2J1ZmYgKnNrYik7IC8qIGNoYWluaW5nICovCisJc3RydWN0IGF0bV9xZGlzY19kYXRhCSpwYXJlbnQ7CS8qIHBhcmVudCBxZGlzYyAqLworCXN0cnVjdCBzb2NrZXQJCSpzb2NrOwkJLyogZm9yIGNsb3NpbmcgKi8KKwl1MzIJCQljbGFzc2lkOwkvKiB4OnkgdHlwZSBJRCAqLworCWludAkJCXJlZjsJCS8qIHJlZmVyZW5jZSBjb3VudCAqLworCXN0cnVjdCBnbmV0X3N0YXRzX2Jhc2ljCWJzdGF0czsKKwlzdHJ1Y3QgZ25ldF9zdGF0c19xdWV1ZQlxc3RhdHM7CisJc3BpbmxvY2tfdAkJKnN0YXRzX2xvY2s7CisJc3RydWN0IGF0bV9mbG93X2RhdGEJKm5leHQ7CisJc3RydWN0IGF0bV9mbG93X2RhdGEJKmV4Y2VzczsJLyogZmxvdyBmb3IgZXhjZXNzIHRyYWZmaWM7CisJCQkJCQkgICBOVUxMIHRvIHNldCBDTFAgaW5zdGVhZCAqLworCWludAkJCWhkcl9sZW47CisJdW5zaWduZWQgY2hhcgkJaGRyWzBdOwkJLyogaGVhZGVyIGRhdGE7IE1VU1QgQkUgTEFTVCAqLworfTsKKworc3RydWN0IGF0bV9xZGlzY19kYXRhIHsKKwlzdHJ1Y3QgYXRtX2Zsb3dfZGF0YQlsaW5rOwkJLyogdW5jbGFzc2lmaWVkIHNrYnMgZ28gaGVyZSAqLworCXN0cnVjdCBhdG1fZmxvd19kYXRhCSpmbG93czsJCS8qIE5COiAibGluayIgaXMgYWxzbyBvbiB0aGlzCisJCQkJCQkgICBsaXN0ICovCisJc3RydWN0IHRhc2tsZXRfc3RydWN0CXRhc2s7CQkvKiByZXF1ZXVlIHRhc2tsZXQgKi8KK307CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDbGFzcy9mbG93IG9wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKK3N0YXRpYyBpbnQgZmluZF9mbG93KHN0cnVjdCBhdG1fcWRpc2NfZGF0YSAqcWRpc2Msc3RydWN0IGF0bV9mbG93X2RhdGEgKmZsb3cpCit7CisJc3RydWN0IGF0bV9mbG93X2RhdGEgKndhbGs7CisKKwlEUFJJTlRLKCJmaW5kX2Zsb3cocWRpc2MgJXAsZmxvdyAlcClcbiIscWRpc2MsZmxvdyk7CisJZm9yICh3YWxrID0gcWRpc2MtPmZsb3dzOyB3YWxrOyB3YWxrID0gd2Fsay0+bmV4dCkKKwkJaWYgKHdhbGsgPT0gZmxvdykgcmV0dXJuIDE7CisJRFBSSU5USygiZmluZF9mbG93OiBub3QgZm91bmRcbiIpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBhdG1fZmxvd19kYXRhICpsb29rdXBfZmxvdyhzdHJ1Y3QgUWRpc2MgKnNjaCwKKyAgICB1MzIgY2xhc3NpZCkKK3sKKwlzdHJ1Y3QgYXRtX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7CisJc3RydWN0IGF0bV9mbG93X2RhdGEgKmZsb3c7CisKKyAgICAgICAgZm9yIChmbG93ID0gcC0+Zmxvd3M7IGZsb3c7IGZsb3cgPSBmbG93LT5uZXh0KQorCQlpZiAoZmxvdy0+Y2xhc3NpZCA9PSBjbGFzc2lkKSBicmVhazsKKwlyZXR1cm4gZmxvdzsKK30KKworCitzdGF0aWMgaW50IGF0bV90Y19ncmFmdChzdHJ1Y3QgUWRpc2MgKnNjaCx1bnNpZ25lZCBsb25nIGFyZywKKyAgICBzdHJ1Y3QgUWRpc2MgKm5ldyxzdHJ1Y3QgUWRpc2MgKipvbGQpCit7CisJc3RydWN0IGF0bV9xZGlzY19kYXRhICpwID0gUFJJVihzY2gpOworCXN0cnVjdCBhdG1fZmxvd19kYXRhICpmbG93ID0gKHN0cnVjdCBhdG1fZmxvd19kYXRhICopIGFyZzsKKworCURQUklOVEsoImF0bV90Y19ncmFmdChzY2ggJXAsW3FkaXNjICVwXSxmbG93ICVwLG5ldyAlcCxvbGQgJXApXG4iLHNjaCwKKwkgICAgcCxmbG93LG5ldyxvbGQpOworCWlmICghZmluZF9mbG93KHAsZmxvdykpIHJldHVybiAtRUlOVkFMOworCWlmICghbmV3KSBuZXcgPSAmbm9vcF9xZGlzYzsKKwkqb2xkID0geGNoZygmZmxvdy0+cSxuZXcpOworCWlmICgqb2xkKSBxZGlzY19yZXNldCgqb2xkKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBRZGlzYyAqYXRtX3RjX2xlYWYoc3RydWN0IFFkaXNjICpzY2gsdW5zaWduZWQgbG9uZyBjbCkKK3sKKwlzdHJ1Y3QgYXRtX2Zsb3dfZGF0YSAqZmxvdyA9IChzdHJ1Y3QgYXRtX2Zsb3dfZGF0YSAqKSBjbDsKKworCURQUklOVEsoImF0bV90Y19sZWFmKHNjaCAlcCxmbG93ICVwKVxuIixzY2gsZmxvdyk7CisJcmV0dXJuIGZsb3cgPyBmbG93LT5xIDogTlVMTDsKK30KKworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBhdG1fdGNfZ2V0KHN0cnVjdCBRZGlzYyAqc2NoLHUzMiBjbGFzc2lkKQoreworCXN0cnVjdCBhdG1fcWRpc2NfZGF0YSAqcCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IFBSSVYoc2NoKTsKKwlzdHJ1Y3QgYXRtX2Zsb3dfZGF0YSAqZmxvdzsKKworCURQUklOVEsoImF0bV90Y19nZXQoc2NoICVwLFtxZGlzYyAlcF0sY2xhc3NpZCAleClcbiIsc2NoLHAsY2xhc3NpZCk7CisJZmxvdyA9IGxvb2t1cF9mbG93KHNjaCxjbGFzc2lkKTsKKyAgICAgICAgaWYgKGZsb3cpIGZsb3ctPnJlZisrOworCURQUklOVEsoImF0bV90Y19nZXQ6IGZsb3cgJXBcbiIsZmxvdyk7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nKSBmbG93OworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGF0bV90Y19iaW5kX2ZpbHRlcihzdHJ1Y3QgUWRpc2MgKnNjaCwKKyAgICB1bnNpZ25lZCBsb25nIHBhcmVudCwgdTMyIGNsYXNzaWQpCit7CisJcmV0dXJuIGF0bV90Y19nZXQoc2NoLGNsYXNzaWQpOworfQorCisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfZmlsdGVycyhzdHJ1Y3QgYXRtX2Zsb3dfZGF0YSAqZmxvdykKK3sKKwlzdHJ1Y3QgdGNmX3Byb3RvICpmaWx0ZXI7CisKKwl3aGlsZSAoKGZpbHRlciA9IGZsb3ctPmZpbHRlcl9saXN0KSkgeworCQlEUFJJTlRLKCJkZXN0cm95X2ZpbHRlcnM6IGRlc3Ryb3lpbmcgZmlsdGVyICVwXG4iLGZpbHRlcik7CisJCWZsb3ctPmZpbHRlcl9saXN0ID0gZmlsdGVyLT5uZXh0OworCQl0Y2ZfZGVzdHJveShmaWx0ZXIpOworCX0KK30KKworCisvKgorICogYXRtX3RjX3B1dCBoYW5kbGVzIGFsbCBkZXN0cnVjdGlvbnMsIGluY2x1ZGluZyB0aGUgb25lcyB0aGF0IGFyZSBleHBsaWNpdGx5CisgKiByZXF1ZXN0ZWQgKGF0bV90Y19kZXN0cm95LCBldGMuKS4gVGhlIGFzc3VtcHRpb24gaGVyZSBpcyB0aGF0IHdlIG5ldmVyIGRyb3AKKyAqIGFueXRoaW5nIHRoYXQgc3RpbGwgc2VlbXMgdG8gYmUgaW4gdXNlLgorICovCisKK3N0YXRpYyB2b2lkIGF0bV90Y19wdXQoc3RydWN0IFFkaXNjICpzY2gsIHVuc2lnbmVkIGxvbmcgY2wpCit7CisJc3RydWN0IGF0bV9xZGlzY19kYXRhICpwID0gUFJJVihzY2gpOworCXN0cnVjdCBhdG1fZmxvd19kYXRhICpmbG93ID0gKHN0cnVjdCBhdG1fZmxvd19kYXRhICopIGNsOworCXN0cnVjdCBhdG1fZmxvd19kYXRhICoqcHJldjsKKworCURQUklOVEsoImF0bV90Y19wdXQoc2NoICVwLFtxZGlzYyAlcF0sZmxvdyAlcClcbiIsc2NoLHAsZmxvdyk7CisJaWYgKC0tZmxvdy0+cmVmKSByZXR1cm47CisJRFBSSU5USygiYXRtX3RjX3B1dDogZGVzdHJveWluZ1xuIik7CisJZm9yIChwcmV2ID0gJnAtPmZsb3dzOyAqcHJldjsgcHJldiA9ICYoKnByZXYpLT5uZXh0KQorCQlpZiAoKnByZXYgPT0gZmxvdykgYnJlYWs7CisJaWYgKCEqcHJldikgeworCQlwcmludGsoS0VSTl9DUklUICJhdG1fdGNfcHV0OiBjbGFzcyAlcCBub3QgZm91bmRcbiIsZmxvdyk7CisJCXJldHVybjsKKwl9CisJKnByZXYgPSBmbG93LT5uZXh0OworCURQUklOVEsoImF0bV90Y19wdXQ6IHFkaXNjICVwXG4iLGZsb3ctPnEpOworCXFkaXNjX2Rlc3Ryb3koZmxvdy0+cSk7CisJZGVzdHJveV9maWx0ZXJzKGZsb3cpOworCWlmIChmbG93LT5zb2NrKSB7CisJCURQUklOVEsoImF0bV90Y19wdXQ6IGZfY291bnQgJWRcbiIsCisJCSAgICBmaWxlX2NvdW50KGZsb3ctPnNvY2stPmZpbGUpKTsKKwkJZmxvdy0+dmNjLT5wb3AgPSBmbG93LT5vbGRfcG9wOworCQlzb2NrZmRfcHV0KGZsb3ctPnNvY2spOworCX0KKwlpZiAoZmxvdy0+ZXhjZXNzKSBhdG1fdGNfcHV0KHNjaCwodW5zaWduZWQgbG9uZykgZmxvdy0+ZXhjZXNzKTsKKwlpZiAoZmxvdyAhPSAmcC0+bGluaykga2ZyZWUoZmxvdyk7CisJLyoKKwkgKiBJZiBmbG93ID09ICZwLT5saW5rLCB0aGUgcWRpc2Mgbm8gbG9uZ2VyIHdvcmtzIGF0IHRoaXMgcG9pbnQgYW5kCisJICogbmVlZHMgdG8gYmUgcmVtb3ZlZC4gKEJ5IHRoZSBjYWxsZXIgb2YgYXRtX3RjX3B1dC4pCisJICovCit9CisKKworc3RhdGljIHZvaWQgc2NoX2F0bV9wb3Aoc3RydWN0IGF0bV92Y2MgKnZjYyxzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBhdG1fcWRpc2NfZGF0YSAqcCA9IFZDQzJGTE9XKHZjYyktPnBhcmVudDsKKworCUQyUFJJTlRLKCJzY2hfYXRtX3BvcCh2Y2MgJXAsc2tiICVwLFtxZGlzYyAlcF0pXG4iLHZjYyxza2IscCk7CisJVkNDMkZMT1codmNjKS0+b2xkX3BvcCh2Y2Msc2tiKTsKKwl0YXNrbGV0X3NjaGVkdWxlKCZwLT50YXNrKTsKK30KKworc3RhdGljIGNvbnN0IHU4IGxsY19vdWlfaXBbXSA9IHsKKwkweGFhLAkJLyogRFNBUDogbm9uLUlTTyAqLworCTB4YWEsCQkvKiBTU0FQOiBub24tSVNPICovCisJMHgwMywJCS8qIEN0cmw6IFVubnVtYmVyZWQgSW5mb3JtYXRpb24gQ29tbWFuZCBQRFUgKi8KKwkweDAwLAkJLyogT1VJOiBFdGhlclR5cGUgKi8KKwkweDAwLCAweDAwLAorCTB4MDgsIDB4MDAgfTsJLyogRXRoZXJ0eXBlIElQICgwODAwKSAqLworCitzdGF0aWMgaW50IGF0bV90Y19jaGFuZ2Uoc3RydWN0IFFkaXNjICpzY2gsIHUzMiBjbGFzc2lkLCB1MzIgcGFyZW50LAorICAgIHN0cnVjdCBydGF0dHIgKip0Y2EsIHVuc2lnbmVkIGxvbmcgKmFyZykKK3sKKwlzdHJ1Y3QgYXRtX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7CisJc3RydWN0IGF0bV9mbG93X2RhdGEgKmZsb3cgPSAoc3RydWN0IGF0bV9mbG93X2RhdGEgKikgKmFyZzsKKwlzdHJ1Y3QgYXRtX2Zsb3dfZGF0YSAqZXhjZXNzID0gTlVMTDsKKwlzdHJ1Y3QgcnRhdHRyICpvcHQgPSB0Y2FbVENBX09QVElPTlMtMV07CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX0FUTV9NQVhdOworCXN0cnVjdCBzb2NrZXQgKnNvY2s7CisJaW50IGZkLGVycm9yLGhkcl9sZW47CisJdm9pZCAqaGRyOworCisJRFBSSU5USygiYXRtX3RjX2NoYW5nZShzY2ggJXAsW3FkaXNjICVwXSxjbGFzc2lkICV4LHBhcmVudCAleCwiCisJICAgICJmbG93ICVwLG9wdCAlcClcbiIsc2NoLHAsY2xhc3NpZCxwYXJlbnQsZmxvdyxvcHQpOworCS8qCisJICogVGhlIGNvbmNlcHQgb2YgcGFyZW50cyBkb2Vzbid0IGFwcGx5IGZvciB0aGlzIHFkaXNjLgorCSAqLworCWlmIChwYXJlbnQgJiYgcGFyZW50ICE9IFRDX0hfUk9PVCAmJiBwYXJlbnQgIT0gc2NoLT5oYW5kbGUpCisJCXJldHVybiAtRUlOVkFMOworCS8qCisJICogQVRNIGNsYXNzZXMgY2Fubm90IGJlIGNoYW5nZWQuIEluIG9yZGVyIHRvIGNoYW5nZSBwcm9wZXJ0aWVzIG9mIHRoZQorCSAqIEFUTSBjb25uZWN0aW9uLCB0aGF0IHNvY2tldCBuZWVkcyB0byBiZSBtb2RpZmllZCBkaXJlY3RseSAodmlhIHRoZQorCSAqIG5hdGl2ZSBBVE0gQVBJLiBJbiBvcmRlciB0byBzZW5kIGEgZmxvdyB0byBhIGRpZmZlcmVudCBWQywgdGhlIG9sZAorCSAqIGNsYXNzIG5lZWRzIHRvIGJlIHJlbW92ZWQgYW5kIGEgbmV3IG9uZSBhZGRlZC4gKFRoaXMgbWF5IGJlIGNoYW5nZWQKKwkgKiBsYXRlci4pCisJICovCisJaWYgKGZsb3cpIHJldHVybiAtRUJVU1k7CisJaWYgKG9wdCA9PSBOVUxMIHx8IHJ0YXR0cl9wYXJzZV9uZXN0ZWQodGIsIFRDQV9BVE1fTUFYLCBvcHQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXRiW1RDQV9BVE1fRkQtMV0gfHwgUlRBX1BBWUxPQUQodGJbVENBX0FUTV9GRC0xXSkgPCBzaXplb2YoZmQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlmZCA9ICooaW50ICopIFJUQV9EQVRBKHRiW1RDQV9BVE1fRkQtMV0pOworCURQUklOVEsoImF0bV90Y19jaGFuZ2U6IGZkICVkXG4iLGZkKTsKKwlpZiAodGJbVENBX0FUTV9IRFItMV0pIHsKKwkJaGRyX2xlbiA9IFJUQV9QQVlMT0FEKHRiW1RDQV9BVE1fSERSLTFdKTsKKwkJaGRyID0gUlRBX0RBVEEodGJbVENBX0FUTV9IRFItMV0pOworCX0KKwllbHNlIHsKKwkJaGRyX2xlbiA9IFJGQzE0ODNMTENfTEVOOworCQloZHIgPSBOVUxMOyAvKiBkZWZhdWx0IExMQy9TTkFQIGZvciBJUCAqLworCX0KKwlpZiAoIXRiW1RDQV9BVE1fRVhDRVNTLTFdKSBleGNlc3MgPSBOVUxMOworCWVsc2UgeworCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX0FUTV9FWENFU1MtMV0pICE9IHNpemVvZih1MzIpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWV4Y2VzcyA9IChzdHJ1Y3QgYXRtX2Zsb3dfZGF0YSAqKSBhdG1fdGNfZ2V0KHNjaCwKKwkJICAgICoodTMyICopIFJUQV9EQVRBKHRiW1RDQV9BVE1fRVhDRVNTLTFdKSk7CisJCWlmICghZXhjZXNzKSByZXR1cm4gLUVOT0VOVDsKKwl9CisJRFBSSU5USygiYXRtX3RjX2NoYW5nZTogdHlwZSAlZCwgcGF5bG9hZCAlZCwgaGRyX2xlbiAlZFxuIiwKKwkgICAgb3B0LT5ydGFfdHlwZSxSVEFfUEFZTE9BRChvcHQpLGhkcl9sZW4pOworCWlmICghKHNvY2sgPSBzb2NrZmRfbG9va3VwKGZkLCZlcnJvcikpKSByZXR1cm4gZXJyb3I7IC8qIGZfY291bnQrKyAqLworCURQUklOVEsoImF0bV90Y19jaGFuZ2U6IGZfY291bnQgJWRcbiIsZmlsZV9jb3VudChzb2NrLT5maWxlKSk7CisgICAgICAgIGlmIChzb2NrLT5vcHMtPmZhbWlseSAhPSBQRl9BVE1TVkMgJiYgc29jay0+b3BzLT5mYW1pbHkgIT0gUEZfQVRNUFZDKSB7CisJCWVycm9yID0gLUVQUk9UT1RZUEU7CisgICAgICAgICAgICAgICAgZ290byBlcnJfb3V0OworCX0KKwkvKiBAQEAgc2hvdWxkIGNoZWNrIGlmIHRoZSBzb2NrZXQgaXMgcmVhbGx5IG9wZXJhdGlvbmFsIG9yIHdlJ2xsIGNyYXNoCisJICAgb24gdmNjLT5zZW5kICovCisJaWYgKGNsYXNzaWQpIHsKKwkJaWYgKFRDX0hfTUFKKGNsYXNzaWQgXiBzY2gtPmhhbmRsZSkpIHsKKwkJCURQUklOVEsoImF0bV90Y19jaGFuZ2U6IGNsYXNzaWQgbWlzbWF0Y2hcbiIpOworCQkJZXJyb3IgPSAtRUlOVkFMOworCQkJZ290byBlcnJfb3V0OworCQl9CisJCWlmIChmaW5kX2Zsb3cocCxmbG93KSkgeworCQkJZXJyb3IgPSAtRUVYSVNUOworCQkJZ290byBlcnJfb3V0OworCQl9CisJfQorCWVsc2UgeworCQlpbnQgaTsKKwkJdW5zaWduZWQgbG9uZyBjbDsKKworCQlmb3IgKGkgPSAxOyBpIDwgMHg4MDAwOyBpKyspIHsKKwkJCWNsYXNzaWQgPSBUQ19IX01BS0Uoc2NoLT5oYW5kbGUsMHg4MDAwIHwgaSk7CisJCQlpZiAoIShjbCA9IGF0bV90Y19nZXQoc2NoLGNsYXNzaWQpKSkgYnJlYWs7CisJCQlhdG1fdGNfcHV0KHNjaCxjbCk7CisJCX0KKwl9CisJRFBSSU5USygiYXRtX3RjX2NoYW5nZTogbmV3IGlkICV4XG4iLGNsYXNzaWQpOworCWZsb3cgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXRtX2Zsb3dfZGF0YSkraGRyX2xlbixHRlBfS0VSTkVMKTsKKwlEUFJJTlRLKCJhdG1fdGNfY2hhbmdlOiBmbG93ICVwXG4iLGZsb3cpOworCWlmICghZmxvdykgeworCQllcnJvciA9IC1FTk9CVUZTOworCQlnb3RvIGVycl9vdXQ7CisJfQorCW1lbXNldChmbG93LDAsc2l6ZW9mKCpmbG93KSk7CisJZmxvdy0+ZmlsdGVyX2xpc3QgPSBOVUxMOworCWlmICghKGZsb3ctPnEgPSBxZGlzY19jcmVhdGVfZGZsdChzY2gtPmRldiwmcGZpZm9fcWRpc2Nfb3BzKSkpCisJCWZsb3ctPnEgPSAmbm9vcF9xZGlzYzsKKwlEUFJJTlRLKCJhdG1fdGNfY2hhbmdlOiBxZGlzYyAlcFxuIixmbG93LT5xKTsKKwlmbG93LT5zb2NrID0gc29jazsKKyAgICAgICAgZmxvdy0+dmNjID0gQVRNX1NEKHNvY2spOyAvKiBzcGVlZHVwICovCisJZmxvdy0+dmNjLT51c2VyX2JhY2sgPSBmbG93OworICAgICAgICBEUFJJTlRLKCJhdG1fdGNfY2hhbmdlOiB2Y2MgJXBcbiIsZmxvdy0+dmNjKTsKKwlmbG93LT5vbGRfcG9wID0gZmxvdy0+dmNjLT5wb3A7CisJZmxvdy0+cGFyZW50ID0gcDsKKwlmbG93LT52Y2MtPnBvcCA9IHNjaF9hdG1fcG9wOworCWZsb3ctPmNsYXNzaWQgPSBjbGFzc2lkOworCWZsb3ctPnJlZiA9IDE7CisJZmxvdy0+ZXhjZXNzID0gZXhjZXNzOworCWZsb3ctPm5leHQgPSBwLT5saW5rLm5leHQ7CisJcC0+bGluay5uZXh0ID0gZmxvdzsKKwlmbG93LT5oZHJfbGVuID0gaGRyX2xlbjsKKwlpZiAoaGRyKQorCQltZW1jcHkoZmxvdy0+aGRyLGhkcixoZHJfbGVuKTsKKwllbHNlCisJCW1lbWNweShmbG93LT5oZHIsbGxjX291aV9pcCxzaXplb2YobGxjX291aV9pcCkpOworCSphcmcgPSAodW5zaWduZWQgbG9uZykgZmxvdzsKKwlyZXR1cm4gMDsKK2Vycl9vdXQ6CisJaWYgKGV4Y2VzcykgYXRtX3RjX3B1dChzY2gsKHVuc2lnbmVkIGxvbmcpIGV4Y2Vzcyk7CisJc29ja2ZkX3B1dChzb2NrKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworc3RhdGljIGludCBhdG1fdGNfZGVsZXRlKHN0cnVjdCBRZGlzYyAqc2NoLHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBhdG1fcWRpc2NfZGF0YSAqcCA9IFBSSVYoc2NoKTsKKwlzdHJ1Y3QgYXRtX2Zsb3dfZGF0YSAqZmxvdyA9IChzdHJ1Y3QgYXRtX2Zsb3dfZGF0YSAqKSBhcmc7CisKKwlEUFJJTlRLKCJhdG1fdGNfZGVsZXRlKHNjaCAlcCxbcWRpc2MgJXBdLGZsb3cgJXApXG4iLHNjaCxwLGZsb3cpOworCWlmICghZmluZF9mbG93KFBSSVYoc2NoKSxmbG93KSkgcmV0dXJuIC1FSU5WQUw7CisJaWYgKGZsb3ctPmZpbHRlcl9saXN0IHx8IGZsb3cgPT0gJnAtPmxpbmspIHJldHVybiAtRUJVU1k7CisJLyoKKwkgKiBSZWZlcmVuY2UgY291bnQgbXVzdCBiZSAyOiBvbmUgZm9yICJrZWVwYWxpdmUiIChzZXQgYXQgY2xhc3MKKwkgKiBjcmVhdGlvbiksIGFuZCBvbmUgZm9yIHRoZSByZWZlcmVuY2UgaGVsZCB3aGVuIGNhbGxpbmcgZGVsZXRlLgorCSAqLworCWlmIChmbG93LT5yZWYgPCAyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXRtX3RjX2RlbGV0ZTogZmxvdy0+cmVmID09ICVkXG4iLGZsb3ctPnJlZik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoZmxvdy0+cmVmID4gMikgcmV0dXJuIC1FQlVTWTsgLyogY2F0Y2ggcmVmZXJlbmNlcyB2aWEgZXhjZXNzLCBldGMuKi8KKwlhdG1fdGNfcHV0KHNjaCxhcmcpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGF0bV90Y193YWxrKHN0cnVjdCBRZGlzYyAqc2NoLHN0cnVjdCBxZGlzY193YWxrZXIgKndhbGtlcikKK3sKKwlzdHJ1Y3QgYXRtX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7CisJc3RydWN0IGF0bV9mbG93X2RhdGEgKmZsb3c7CisKKwlEUFJJTlRLKCJhdG1fdGNfd2FsayhzY2ggJXAsW3FkaXNjICVwXSx3YWxrZXIgJXApXG4iLHNjaCxwLHdhbGtlcik7CisJaWYgKHdhbGtlci0+c3RvcCkgcmV0dXJuOworCWZvciAoZmxvdyA9IHAtPmZsb3dzOyBmbG93OyBmbG93ID0gZmxvdy0+bmV4dCkgeworCQlpZiAod2Fsa2VyLT5jb3VudCA+PSB3YWxrZXItPnNraXApCisJCQlpZiAod2Fsa2VyLT5mbihzY2gsKHVuc2lnbmVkIGxvbmcpIGZsb3csd2Fsa2VyKSA8IDApIHsKKwkJCQl3YWxrZXItPnN0b3AgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl3YWxrZXItPmNvdW50Kys7CisJfQorfQorCisKK3N0YXRpYyBzdHJ1Y3QgdGNmX3Byb3RvICoqYXRtX3RjX2ZpbmRfdGNmKHN0cnVjdCBRZGlzYyAqc2NoLHVuc2lnbmVkIGxvbmcgY2wpCit7CisJc3RydWN0IGF0bV9xZGlzY19kYXRhICpwID0gUFJJVihzY2gpOworCXN0cnVjdCBhdG1fZmxvd19kYXRhICpmbG93ID0gKHN0cnVjdCBhdG1fZmxvd19kYXRhICopIGNsOworCisJRFBSSU5USygiYXRtX3RjX2ZpbmRfdGNmKHNjaCAlcCxbcWRpc2MgJXBdLGZsb3cgJXApXG4iLHNjaCxwLGZsb3cpOworICAgICAgICByZXR1cm4gZmxvdyA/ICZmbG93LT5maWx0ZXJfbGlzdCA6ICZwLT5saW5rLmZpbHRlcl9saXN0OworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBRZGlzYyBvcGVyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCitzdGF0aWMgaW50IGF0bV90Y19lbnF1ZXVlKHN0cnVjdCBza19idWZmICpza2Isc3RydWN0IFFkaXNjICpzY2gpCit7CisJc3RydWN0IGF0bV9xZGlzY19kYXRhICpwID0gUFJJVihzY2gpOworCXN0cnVjdCBhdG1fZmxvd19kYXRhICpmbG93ID0gTlVMTCA7IC8qIEBAQCAqLworCXN0cnVjdCB0Y2ZfcmVzdWx0IHJlczsKKwlpbnQgcmVzdWx0OworCWludCByZXQgPSBORVRfWE1JVF9QT0xJQ0VEOworCisJRDJQUklOVEsoImF0bV90Y19lbnF1ZXVlKHNrYiAlcCxzY2ggJXAsW3FkaXNjICVwXSlcbiIsc2tiLHNjaCxwKTsKKwlyZXN1bHQgPSBUQ19QT0xJQ0VfT0s7IC8qIGJlIG5pY2UgdG8gZ2NjICovCisJaWYgKFRDX0hfTUFKKHNrYi0+cHJpb3JpdHkpICE9IHNjaC0+aGFuZGxlIHx8CisJICAgICEoZmxvdyA9IChzdHJ1Y3QgYXRtX2Zsb3dfZGF0YSAqKSBhdG1fdGNfZ2V0KHNjaCxza2ItPnByaW9yaXR5KSkpCisJCWZvciAoZmxvdyA9IHAtPmZsb3dzOyBmbG93OyBmbG93ID0gZmxvdy0+bmV4dCkKKwkJCWlmIChmbG93LT5maWx0ZXJfbGlzdCkgeworCQkJCXJlc3VsdCA9IHRjX2NsYXNzaWZ5KHNrYixmbG93LT5maWx0ZXJfbGlzdCwKKwkJCQkgICAgJnJlcyk7CisJCQkJaWYgKHJlc3VsdCA8IDApIGNvbnRpbnVlOworCQkJCWZsb3cgPSAoc3RydWN0IGF0bV9mbG93X2RhdGEgKikgcmVzLmNsYXNzOworCQkJCWlmICghZmxvdykgZmxvdyA9IGxvb2t1cF9mbG93KHNjaCxyZXMuY2xhc3NpZCk7CisJCQkJYnJlYWs7CisJCQl9CisJaWYgKCFmbG93KSBmbG93ID0gJnAtPmxpbms7CisJZWxzZSB7CisJCWlmIChmbG93LT52Y2MpCisJCQlBVE1fU0tCKHNrYiktPmF0bV9vcHRpb25zID0gZmxvdy0+dmNjLT5hdG1fb3B0aW9uczsKKwkJCS8qQEBAIGxvb2tzIGdvb2QgLi4uIGJ1dCBpdCdzIG5vdCBzdXBwb3NlZCB0byB3b3JrIDotKSovCisjaWZkZWYgQ09ORklHX05FVF9DTFNfUE9MSUNFCisJCXN3aXRjaCAocmVzdWx0KSB7CisJCQljYXNlIFRDX1BPTElDRV9TSE9UOgorCQkJCWtmcmVlX3NrYihza2IpOworCQkJCWJyZWFrOworCQkJY2FzZSBUQ19QT0xJQ0VfUkVDTEFTU0lGWToKKwkJCQlpZiAoZmxvdy0+ZXhjZXNzKSBmbG93ID0gZmxvdy0+ZXhjZXNzOworCQkJCWVsc2UgeworCQkJCQlBVE1fU0tCKHNrYiktPmF0bV9vcHRpb25zIHw9CisJCQkJCSAgICBBVE1fQVRNT1BUX0NMUDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQkJY2FzZSBUQ19QT0xJQ0VfT0s6CisJCQkJLyogZmFsbCB0aHJvdWdoICovCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisjZW5kaWYKKwl9CisJaWYgKAorI2lmZGVmIENPTkZJR19ORVRfQ0xTX1BPTElDRQorCSAgICByZXN1bHQgPT0gVENfUE9MSUNFX1NIT1QgfHwKKyNlbmRpZgorCSAgICAocmV0ID0gZmxvdy0+cS0+ZW5xdWV1ZShza2IsZmxvdy0+cSkpICE9IDApIHsKKwkJc2NoLT5xc3RhdHMuZHJvcHMrKzsKKwkJaWYgKGZsb3cpIGZsb3ctPnFzdGF0cy5kcm9wcysrOworCQlyZXR1cm4gcmV0OworCX0KKwlzY2gtPmJzdGF0cy5ieXRlcyArPSBza2ItPmxlbjsKKwlzY2gtPmJzdGF0cy5wYWNrZXRzKys7CisJZmxvdy0+YnN0YXRzLmJ5dGVzICs9IHNrYi0+bGVuOworCWZsb3ctPmJzdGF0cy5wYWNrZXRzKys7CisJLyoKKwkgKiBPa2F5LCB0aGlzIG1heSBzZWVtIHdlaXJkLiBXZSBwcmV0ZW5kIHdlJ3ZlIGRyb3BwZWQgdGhlIHBhY2tldCBpZgorCSAqIGl0IGdvZXMgdmlhIEFUTS4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IHRoZSBvdXRlciBxZGlzYworCSAqIGV4cGVjdHMgdG8gYmUgYWJsZSB0byBxLT5kZXF1ZXVlIHRoZSBwYWNrZXQgbGF0ZXIgb24gaWYgd2UgcmV0dXJuCisJICogc3VjY2VzcyBhdCB0aGlzIHBsYWNlLiBBbHNvLCBzY2gtPnEucWRpc2MgbmVlZHMgdG8gcmVmbGVjdCB3aGV0aGVyCisJICogdGhlcmUgaXMgYSBwYWNrZXQgZWdsaWdpYmxlIGZvciBkZXF1ZXVpbmcgb3Igbm90LiBOb3RlIHRoYXQgdGhlCisJICogc3RhdGlzdGljcyBvZiB0aGUgb3V0ZXIgcWRpc2MgYXJlIG5lY2Vzc2FyaWx5IHdyb25nIGJlY2F1c2Ugb2YgYWxsCisJICogdGhpcy4gVGhlcmUncyBjdXJyZW50bHkgbm8gY29ycmVjdCBzb2x1dGlvbiBmb3IgdGhpcy4KKwkgKi8KKwlpZiAoZmxvdyA9PSAmcC0+bGluaykgeworCQlzY2gtPnEucWxlbisrOworCQlyZXR1cm4gMDsKKwl9CisJdGFza2xldF9zY2hlZHVsZSgmcC0+dGFzayk7CisJcmV0dXJuIE5FVF9YTUlUX0JZUEFTUzsKK30KKworCisvKgorICogRGVxdWV1ZSBwYWNrZXRzIGFuZCBzZW5kIHRoZW0gb3ZlciBBVE0uIE5vdGUgdGhhdCB3ZSBxdWl0ZSBkZWxpYmVyYXRlbHkKKyAqIGF2b2lkIGNoZWNraW5nIG5ldF9kZXZpY2UncyBmbG93IGNvbnRyb2wgaGVyZSwgc2ltcGx5IGJlY2F1c2Ugc2NoX2F0bQorICogdXNlcyBpdHMgb3duIGNoYW5uZWxzLCB3aGljaCBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCBhbnkgQ0xJUC9MQU5FL29yCisgKiBub24tQVRNIGludGVyZmFjZXMuCisgKi8KKworCitzdGF0aWMgdm9pZCBzY2hfYXRtX2RlcXVldWUodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBRZGlzYyAqc2NoID0gKHN0cnVjdCBRZGlzYyAqKSBkYXRhOworCXN0cnVjdCBhdG1fcWRpc2NfZGF0YSAqcCA9IFBSSVYoc2NoKTsKKwlzdHJ1Y3QgYXRtX2Zsb3dfZGF0YSAqZmxvdzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJRDJQUklOVEsoInNjaF9hdG1fZGVxdWV1ZShzY2ggJXAsW3FkaXNjICVwXSlcbiIsc2NoLHApOworCWZvciAoZmxvdyA9IHAtPmxpbmsubmV4dDsgZmxvdzsgZmxvdyA9IGZsb3ctPm5leHQpCisJCS8qCisJCSAqIElmIHRyYWZmaWMgaXMgcHJvcGVybHkgc2hhcGVkLCB0aGlzIHdvbid0IGdlbmVyYXRlIG5hc3R5CisJCSAqIGxpdHRsZSBidXJzdHMuIE90aGVyd2lzZSwgaXQgbWF5IC4uLiAoYnV0IHRoYXQncyBva2F5KQorCQkgKi8KKwkJd2hpbGUgKChza2IgPSBmbG93LT5xLT5kZXF1ZXVlKGZsb3ctPnEpKSkgeworCQkJaWYgKCFhdG1fbWF5X3NlbmQoZmxvdy0+dmNjLHNrYi0+dHJ1ZXNpemUpKSB7CisJCQkJKHZvaWQpIGZsb3ctPnEtPm9wcy0+cmVxdWV1ZShza2IsZmxvdy0+cSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlEMlBSSU5USygiYXRtX3RjX2RlcXVldWU6IHNlbmRpbmcgb24gY2xhc3MgJXBcbiIsZmxvdyk7CisJCQkvKiByZW1vdmUgYW55IExMIGhlYWRlciBzb21lYm9keSBlbHNlIGhhcyBhdHRhY2hlZCAqLworCQkJc2tiX3B1bGwoc2tiLChjaGFyICopIHNrYi0+bmguaXBoLShjaGFyICopIHNrYi0+ZGF0YSk7CisJCQlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCBmbG93LT5oZHJfbGVuKSB7CisJCQkJc3RydWN0IHNrX2J1ZmYgKm5ldzsKKworCQkJCW5ldyA9IHNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYixmbG93LT5oZHJfbGVuKTsKKwkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQkJaWYgKCFuZXcpIGNvbnRpbnVlOworCQkJCXNrYiA9IG5ldzsKKwkJCX0KKwkJCUQyUFJJTlRLKCJzY2hfYXRtX2RlcXVldWU6IGlwICVwLCBkYXRhICVwXG4iLAorCQkJICAgIHNrYi0+bmguaXBoLHNrYi0+ZGF0YSk7CisJCQlBVE1fU0tCKHNrYiktPnZjYyA9IGZsb3ctPnZjYzsKKwkJCW1lbWNweShza2JfcHVzaChza2IsZmxvdy0+aGRyX2xlbiksZmxvdy0+aGRyLAorCQkJICAgIGZsb3ctPmhkcl9sZW4pOworCQkJYXRvbWljX2FkZChza2ItPnRydWVzaXplLAorCQkJCSAgICZza19hdG0oZmxvdy0+dmNjKS0+c2tfd21lbV9hbGxvYyk7CisJCQkvKiBhdG0uYXRtX29wdGlvbnMgYXJlIGFscmVhZHkgc2V0IGJ5IGF0bV90Y19lbnF1ZXVlICovCisJCQkodm9pZCkgZmxvdy0+dmNjLT5zZW5kKGZsb3ctPnZjYyxza2IpOworCQl9Cit9CisKKworc3RhdGljIHN0cnVjdCBza19idWZmICphdG1fdGNfZGVxdWV1ZShzdHJ1Y3QgUWRpc2MgKnNjaCkKK3sKKwlzdHJ1Y3QgYXRtX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCUQyUFJJTlRLKCJhdG1fdGNfZGVxdWV1ZShzY2ggJXAsW3FkaXNjICVwXSlcbiIsc2NoLHApOworCXRhc2tsZXRfc2NoZWR1bGUoJnAtPnRhc2spOworCXNrYiA9IHAtPmxpbmsucS0+ZGVxdWV1ZShwLT5saW5rLnEpOworCWlmIChza2IpIHNjaC0+cS5xbGVuLS07CisJcmV0dXJuIHNrYjsKK30KKworCitzdGF0aWMgaW50IGF0bV90Y19yZXF1ZXVlKHN0cnVjdCBza19idWZmICpza2Isc3RydWN0IFFkaXNjICpzY2gpCit7CisJc3RydWN0IGF0bV9xZGlzY19kYXRhICpwID0gUFJJVihzY2gpOworCWludCByZXQ7CisKKwlEMlBSSU5USygiYXRtX3RjX3JlcXVldWUoc2tiICVwLHNjaCAlcCxbcWRpc2MgJXBdKVxuIixza2Isc2NoLHApOworCXJldCA9IHAtPmxpbmsucS0+b3BzLT5yZXF1ZXVlKHNrYixwLT5saW5rLnEpOworCWlmICghcmV0KSB7CisgICAgICAgIHNjaC0+cS5xbGVuKys7CisgICAgICAgIHNjaC0+cXN0YXRzLnJlcXVldWVzKys7CisgICAgfSBlbHNlIHsKKwkJc2NoLT5xc3RhdHMuZHJvcHMrKzsKKwkJcC0+bGluay5xc3RhdHMuZHJvcHMrKzsKKwl9CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50IGF0bV90Y19kcm9wKHN0cnVjdCBRZGlzYyAqc2NoKQoreworCXN0cnVjdCBhdG1fcWRpc2NfZGF0YSAqcCA9IFBSSVYoc2NoKTsKKwlzdHJ1Y3QgYXRtX2Zsb3dfZGF0YSAqZmxvdzsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJRFBSSU5USygiYXRtX3RjX2Ryb3Aoc2NoICVwLFtxZGlzYyAlcF0pXG4iLHNjaCxwKTsKKwlmb3IgKGZsb3cgPSBwLT5mbG93czsgZmxvdzsgZmxvdyA9IGZsb3ctPm5leHQpCisJCWlmIChmbG93LT5xLT5vcHMtPmRyb3AgJiYgKGxlbiA9IGZsb3ctPnEtPm9wcy0+ZHJvcChmbG93LT5xKSkpCisJCQlyZXR1cm4gbGVuOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYXRtX3RjX2luaXQoc3RydWN0IFFkaXNjICpzY2gsc3RydWN0IHJ0YXR0ciAqb3B0KQoreworCXN0cnVjdCBhdG1fcWRpc2NfZGF0YSAqcCA9IFBSSVYoc2NoKTsKKworCURQUklOVEsoImF0bV90Y19pbml0KHNjaCAlcCxbcWRpc2MgJXBdLG9wdCAlcClcbiIsc2NoLHAsb3B0KTsKKwlwLT5mbG93cyA9ICZwLT5saW5rOworCWlmKCEocC0+bGluay5xID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsJnBmaWZvX3FkaXNjX29wcykpKQorCQlwLT5saW5rLnEgPSAmbm9vcF9xZGlzYzsKKwlEUFJJTlRLKCJhdG1fdGNfaW5pdDogbGluayAoJXApIHFkaXNjICVwXG4iLCZwLT5saW5rLHAtPmxpbmsucSk7CisJcC0+bGluay5maWx0ZXJfbGlzdCA9IE5VTEw7CisJcC0+bGluay52Y2MgPSBOVUxMOworCXAtPmxpbmsuc29jayA9IE5VTEw7CisJcC0+bGluay5jbGFzc2lkID0gc2NoLT5oYW5kbGU7CisJcC0+bGluay5yZWYgPSAxOworCXAtPmxpbmsubmV4dCA9IE5VTEw7CisJdGFza2xldF9pbml0KCZwLT50YXNrLHNjaF9hdG1fZGVxdWV1ZSwodW5zaWduZWQgbG9uZykgc2NoKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBhdG1fdGNfcmVzZXQoc3RydWN0IFFkaXNjICpzY2gpCit7CisJc3RydWN0IGF0bV9xZGlzY19kYXRhICpwID0gUFJJVihzY2gpOworCXN0cnVjdCBhdG1fZmxvd19kYXRhICpmbG93OworCisJRFBSSU5USygiYXRtX3RjX3Jlc2V0KHNjaCAlcCxbcWRpc2MgJXBdKVxuIixzY2gscCk7CisJZm9yIChmbG93ID0gcC0+Zmxvd3M7IGZsb3c7IGZsb3cgPSBmbG93LT5uZXh0KSBxZGlzY19yZXNldChmbG93LT5xKTsKKwlzY2gtPnEucWxlbiA9IDA7Cit9CisKKworc3RhdGljIHZvaWQgYXRtX3RjX2Rlc3Ryb3koc3RydWN0IFFkaXNjICpzY2gpCit7CisJc3RydWN0IGF0bV9xZGlzY19kYXRhICpwID0gUFJJVihzY2gpOworCXN0cnVjdCBhdG1fZmxvd19kYXRhICpmbG93OworCisJRFBSSU5USygiYXRtX3RjX2Rlc3Ryb3koc2NoICVwLFtxZGlzYyAlcF0pXG4iLHNjaCxwKTsKKwkvKiByYWNlcyA/ICovCisJd2hpbGUgKChmbG93ID0gcC0+Zmxvd3MpKSB7CisJCWRlc3Ryb3lfZmlsdGVycyhmbG93KTsKKwkJaWYgKGZsb3ctPnJlZiA+IDEpCisJCQlwcmludGsoS0VSTl9FUlIgImF0bV9kZXN0cm95OiAlcC0+cmVmID0gJWRcbiIsZmxvdywKKwkJCSAgICBmbG93LT5yZWYpOworCQlhdG1fdGNfcHV0KHNjaCwodW5zaWduZWQgbG9uZykgZmxvdyk7CisJCWlmIChwLT5mbG93cyA9PSBmbG93KSB7CisJCQlwcmludGsoS0VSTl9FUlIgImF0bV9kZXN0cm95OiBwdXR0aW5nIGZsb3cgJXAgZGlkbid0ICIKKwkJCSAgICAia2lsbCBpdFxuIixmbG93KTsKKwkJCXAtPmZsb3dzID0gZmxvdy0+bmV4dDsgLyogYnJ1dGUgZm9yY2UgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCXRhc2tsZXRfa2lsbCgmcC0+dGFzayk7Cit9CisKKworc3RhdGljIGludCBhdG1fdGNfZHVtcF9jbGFzcyhzdHJ1Y3QgUWRpc2MgKnNjaCwgdW5zaWduZWQgbG9uZyBjbCwKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNtc2cgKnRjbSkKK3sKKwlzdHJ1Y3QgYXRtX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7CisJc3RydWN0IGF0bV9mbG93X2RhdGEgKmZsb3cgPSAoc3RydWN0IGF0bV9mbG93X2RhdGEgKikgY2w7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3QgcnRhdHRyICpydGE7CisKKwlEUFJJTlRLKCJhdG1fdGNfZHVtcF9jbGFzcyhzY2ggJXAsW3FkaXNjICVwXSxmbG93ICVwLHNrYiAlcCx0Y20gJXApXG4iLAorCSAgICBzY2gscCxmbG93LHNrYix0Y20pOworCWlmICghZmluZF9mbG93KHAsZmxvdykpIHJldHVybiAtRUlOVkFMOworCXRjbS0+dGNtX2hhbmRsZSA9IGZsb3ctPmNsYXNzaWQ7CisJcnRhID0gKHN0cnVjdCBydGF0dHIgKikgYjsKKwlSVEFfUFVUKHNrYixUQ0FfT1BUSU9OUywwLE5VTEwpOworCVJUQV9QVVQoc2tiLFRDQV9BVE1fSERSLGZsb3ctPmhkcl9sZW4sZmxvdy0+aGRyKTsKKwlpZiAoZmxvdy0+dmNjKSB7CisJCXN0cnVjdCBzb2NrYWRkcl9hdG1wdmMgcHZjOworCQlpbnQgc3RhdGU7CisKKwkJcHZjLnNhcF9mYW1pbHkgPSBBRl9BVE1QVkM7CisJCXB2Yy5zYXBfYWRkci5pdGYgPSBmbG93LT52Y2MtPmRldiA/IGZsb3ctPnZjYy0+ZGV2LT5udW1iZXIgOiAtMTsKKwkJcHZjLnNhcF9hZGRyLnZwaSA9IGZsb3ctPnZjYy0+dnBpOworCQlwdmMuc2FwX2FkZHIudmNpID0gZmxvdy0+dmNjLT52Y2k7CisJCVJUQV9QVVQoc2tiLFRDQV9BVE1fQUREUixzaXplb2YocHZjKSwmcHZjKTsKKwkJc3RhdGUgPSBBVE1fVkYyVlMoZmxvdy0+dmNjLT5mbGFncyk7CisJCVJUQV9QVVQoc2tiLFRDQV9BVE1fU1RBVEUsc2l6ZW9mKHN0YXRlKSwmc3RhdGUpOworCX0KKwlpZiAoZmxvdy0+ZXhjZXNzKQorCQlSVEFfUFVUKHNrYixUQ0FfQVRNX0VYQ0VTUyxzaXplb2YodTMyKSwmZmxvdy0+Y2xhc3NpZCk7CisJZWxzZSB7CisJCXN0YXRpYyB1MzIgemVybzsKKworCQlSVEFfUFVUKHNrYixUQ0FfQVRNX0VYQ0VTUyxzaXplb2YoemVybyksJnplcm8pOworCX0KKwlydGEtPnJ0YV9sZW4gPSBza2ItPnRhaWwtYjsKKwlyZXR1cm4gc2tiLT5sZW47CisKK3J0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYixiLXNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorc3RhdGljIGludAorYXRtX3RjX2R1bXBfY2xhc3Nfc3RhdHMoc3RydWN0IFFkaXNjICpzY2gsIHVuc2lnbmVkIGxvbmcgYXJnLAorCXN0cnVjdCBnbmV0X2R1bXAgKmQpCit7CisJc3RydWN0IGF0bV9mbG93X2RhdGEgKmZsb3cgPSAoc3RydWN0IGF0bV9mbG93X2RhdGEgKikgYXJnOworCisJZmxvdy0+cXN0YXRzLnFsZW4gPSBmbG93LT5xLT5xLnFsZW47CisKKwlpZiAoZ25ldF9zdGF0c19jb3B5X2Jhc2ljKGQsICZmbG93LT5ic3RhdHMpIDwgMCB8fAorCSAgICBnbmV0X3N0YXRzX2NvcHlfcXVldWUoZCwgJmZsb3ctPnFzdGF0cykgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1fdGNfZHVtcChzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBRZGlzY19jbGFzc19vcHMgYXRtX2NsYXNzX29wcyA9IHsKKwkuZ3JhZnQJCT0JYXRtX3RjX2dyYWZ0LAorCS5sZWFmCQk9CWF0bV90Y19sZWFmLAorCS5nZXQJCT0JYXRtX3RjX2dldCwKKwkucHV0CQk9CWF0bV90Y19wdXQsCisJLmNoYW5nZQkJPQlhdG1fdGNfY2hhbmdlLAorCS5kZWxldGUJCT0JYXRtX3RjX2RlbGV0ZSwKKwkud2FsawkJPQlhdG1fdGNfd2FsaywKKwkudGNmX2NoYWluCT0JYXRtX3RjX2ZpbmRfdGNmLAorCS5iaW5kX3RjZgk9CWF0bV90Y19iaW5kX2ZpbHRlciwKKwkudW5iaW5kX3RjZgk9CWF0bV90Y19wdXQsCisJLmR1bXAJCT0JYXRtX3RjX2R1bXBfY2xhc3MsCisJLmR1bXBfc3RhdHMJPQlhdG1fdGNfZHVtcF9jbGFzc19zdGF0cywKK307CisKK3N0YXRpYyBzdHJ1Y3QgUWRpc2Nfb3BzIGF0bV9xZGlzY19vcHMgPSB7CisJLm5leHQJCT0JTlVMTCwKKwkuY2xfb3BzCQk9CSZhdG1fY2xhc3Nfb3BzLAorCS5pZAkJPQkiYXRtIiwKKwkucHJpdl9zaXplCT0Jc2l6ZW9mKHN0cnVjdCBhdG1fcWRpc2NfZGF0YSksCisJLmVucXVldWUJPQlhdG1fdGNfZW5xdWV1ZSwKKwkuZGVxdWV1ZQk9CWF0bV90Y19kZXF1ZXVlLAorCS5yZXF1ZXVlCT0JYXRtX3RjX3JlcXVldWUsCisJLmRyb3AJCT0JYXRtX3RjX2Ryb3AsCisJLmluaXQJCT0JYXRtX3RjX2luaXQsCisJLnJlc2V0CQk9CWF0bV90Y19yZXNldCwKKwkuZGVzdHJveQk9CWF0bV90Y19kZXN0cm95LAorCS5jaGFuZ2UJCT0JTlVMTCwKKwkuZHVtcAkJPQlhdG1fdGNfZHVtcCwKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGF0bV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX3FkaXNjKCZhdG1fcWRpc2Nfb3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGF0bV9leGl0KHZvaWQpIAoreworCXVucmVnaXN0ZXJfcWRpc2MoJmF0bV9xZGlzY19vcHMpOworfQorCittb2R1bGVfaW5pdChhdG1faW5pdCkKK21vZHVsZV9leGl0KGF0bV9leGl0KQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9jYnEuYyBiL25ldC9zY2hlZC9zY2hfY2JxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzZTNiOAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY2hlZC9zY2hfY2JxLmMKQEAgLTAsMCArMSwyMTI0IEBACisvKgorICogbmV0L3NjaGVkL3NjaF9jYnEuYwlDbGFzcy1CYXNlZCBRdWV1ZWluZyBkaXNjaXBsaW5lLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgorCisKKy8qCUNsYXNzLUJhc2VkIFF1ZXVlaW5nIChDQlEpIGFsZ29yaXRobS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVNvdXJjZXM6IFsxXSBTYWxseSBGbG95ZCBhbmQgVmFuIEphY29ic29uLCAiTGluay1zaGFyaW5nIGFuZCBSZXNvdXJjZQorCSAgICAgICAgIE1hbmFnZW1lbnQgTW9kZWxzIGZvciBQYWNrZXQgTmV0d29ya3MiLAorCQkgSUVFRS9BQ00gVHJhbnNhY3Rpb25zIG9uIE5ldHdvcmtpbmcsIFZvbC4zLCBOby40LCAxOTk1CisKKwkgICAgICAgICBbMl0gU2FsbHkgRmxveWQsICJOb3RlcyBvbiBDQlEgYW5kIEd1YXJhbnRlZWQgU2VydmljZSIsIDE5OTUKKworCSAgICAgICAgIFszXSBTYWxseSBGbG95ZCwgIk5vdGVzIG9uIENsYXNzLUJhc2VkIFF1ZXVlaW5nOiBTZXR0aW5nCisJCSBQYXJhbWV0ZXJzIiwgMTk5NgorCisJCSBbNF0gU2FsbHkgRmxveWQgYW5kIE1pY2hhZWwgU3BlZXIsICJFeHBlcmltZW50YWwgUmVzdWx0cworCQkgZm9yIENsYXNzLUJhc2VkIFF1ZXVlaW5nIiwgMTk5OCwgbm90IHB1Ymxpc2hlZC4KKworCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlBbGdvcml0aG0gc2tlbGV0b24gd2FzIHRha2VuIGZyb20gTlMgc2ltdWxhdG9yIGNicS5jYy4KKwlJZiBzb21lb25lIHdhbnRzIHRvIGNoZWNrIHRoaXMgY29kZSBhZ2FpbnN0IHRoZSBMQkwgdmVyc2lvbiwKKwloZSBzaG91bGQgdGFrZSBpbnRvIGFjY291bnQgdGhhdCBPTkxZIHRoZSBza2VsZXRvbiB3YXMgYm9ycm93ZWQsCisJdGhlIGltcGxlbWVudGF0aW9uIGlzIGRpZmZlcmVudC4gUGFydGljdWxhcmx5OgorCisJLS0tIFRoZSBXUlIgYWxnb3JpdGhtIGlzIGRpZmZlcmVudC4gT3VyIHZlcnNpb24gbG9va3MgbW9yZQorICAgICAgICByZWFzb25hYmxlIChJIGhvcGUpIGFuZCB3b3JrcyB3aGVuIHF1YW50YSBhcmUgYWxsb3dlZCB0byBiZQorICAgICAgICBsZXNzIHRoYW4gTVRVLCB3aGljaCBpcyBhbHdheXMgdGhlIGNhc2Ugd2hlbiByZWFsIHRpbWUgY2xhc3NlcworICAgICAgICBoYXZlIHNtYWxsIHJhdGVzLiBOb3RlLCB0aGF0IHRoZSBzdGF0ZW1lbnQgb2YgWzNdIGlzCisgICAgICAgIGluY29tcGxldGUsIGRlbGF5IG1heSBhY3R1YWxseSBiZSBlc3RpbWF0ZWQgZXZlbiBpZiBjbGFzcworICAgICAgICBwZXItcm91bmQgYWxsb3RtZW50IGlzIGxlc3MgdGhhbiBNVFUuIE5hbWVseSwgaWYgcGVyLXJvdW5kCisgICAgICAgIGFsbG90bWVudCBpcyBXKnJfaSwgYW5kIHJfMSsuLi4rcl9rID0gciA8IDEKKworCWRlbGF5X2kgPD0gKFtNVFUvKFcqcl9pKV0qVypyICsgVypyICsgaypNVFUpL0IKKworCUluIHRoZSB3b3JzdCBjYXNlIHdlIGhhdmUgSW50U2VydiBlc3RpbWF0ZSB3aXRoIEQgPSBXKnIraypNVFUKKwlhbmQgQyA9IE1UVSpyLiBUaGUgcHJvb2YgKGlmIGNvcnJlY3QgYXQgYWxsKSBpcyB0cml2aWFsLgorCisKKwktLS0gSXQgc2VlbXMgdGhhdCBjYnEtMi4wIGlzIG5vdCB2ZXJ5IGFjY3VyYXRlLiBBdCBsZWFzdCwgSSBjYW5ub3QKKwlpbnRlcnByZXQgc29tZSBwbGFjZXMsIHdoaWNoIGxvb2sgbGlrZSB3cm9uZyB0cmFuc2xhdGlvbnMKKwlmcm9tIE5TLiBBbnlvbmUgaXMgYWR2aXNlZCB0byBmaW5kIHRoZXNlIGRpZmZlcmVuY2VzCisJYW5kIGV4cGxhaW4gdG8gbWUsIHdoeSBJIGFtIHdyb25nIDgpLgorCisJLS0tIExpbnV4IGhhcyBubyBFT0kgZXZlbnQsIHNvIHRoYXQgd2UgY2Fubm90IGVzdGltYXRlIHRydWUgY2xhc3MKKwlpZGxlIHRpbWUuIFdvcmthcm91bmQgaXMgdG8gY29uc2lkZXIgdGhlIG5leHQgZGVxdWV1ZSBldmVudAorCWFzIHNpZ24gdGhhdCBwcmV2aW91cyBwYWNrZXQgaXMgZmluaXNoZWQuIFRoaXMgaXMgd3JvbmcgYmVjYXVzZSBvZgorCWludGVybmFsIGRldmljZSBxdWV1ZWluZywgYnV0IG9uIGEgcGVybWFuZW50bHkgbG9hZGVkIGxpbmsgaXQgaXMgdHJ1ZS4KKwlNb3Jlb3ZlciwgY29tYmluZWQgd2l0aCBjbG9jayBpbnRlZ3JhdG9yLCB0aGlzIHNjaGVtZSBsb29rcworCXZlcnkgY2xvc2UgdG8gYW4gaWRlYWwgc29sdXRpb24uICAqLworCitzdHJ1Y3QgY2JxX3NjaGVkX2RhdGE7CisKKworc3RydWN0IGNicV9jbGFzcworeworCXN0cnVjdCBjYnFfY2xhc3MJKm5leHQ7CQkvKiBoYXNoIHRhYmxlIGxpbmsgKi8KKwlzdHJ1Y3QgY2JxX2NsYXNzCSpuZXh0X2FsaXZlOwkvKiBuZXh0IGNsYXNzIHdpdGggYmFja2xvZyBpbiB0aGlzIHByaW9yaXR5IGJhbmQgKi8KKworLyogUGFyYW1ldGVycyAqLworCXUzMgkJCWNsYXNzaWQ7CisJdW5zaWduZWQgY2hhcgkJcHJpb3JpdHk7CS8qIGNsYXNzIHByaW9yaXR5ICovCisJdW5zaWduZWQgY2hhcgkJcHJpb3JpdHkyOwkvKiBwcmlvcml0eSB0byBiZSB1c2VkIGFmdGVyIG92ZXJsaW1pdCAqLworCXVuc2lnbmVkIGNoYXIJCWV3bWFfbG9nOwkvKiB0aW1lIGNvbnN0YW50IGZvciBpZGxlIHRpbWUgY2FsY3VsYXRpb24gKi8KKwl1bnNpZ25lZCBjaGFyCQlvdmxfc3RyYXRlZ3k7CisjaWZkZWYgQ09ORklHX05FVF9DTFNfUE9MSUNFCisJdW5zaWduZWQgY2hhcgkJcG9saWNlOworI2VuZGlmCisKKwl1MzIJCQlkZWZtYXA7CisKKwkvKiBMaW5rLXNoYXJpbmcgc2NoZWR1bGVyIHBhcmFtZXRlcnMgKi8KKwlsb25nCQkJbWF4aWRsZTsJLyogQ2xhc3MgcGFyYW1ldGVyczogc2VlIGJlbG93LiAqLworCWxvbmcJCQlvZmZ0aW1lOworCWxvbmcJCQltaW5pZGxlOworCXUzMgkJCWF2cGt0OworCXN0cnVjdCBxZGlzY19yYXRlX3RhYmxlCSpSX3RhYjsKKworCS8qIE92ZXJsaW1pdCBzdHJhdGVneSBwYXJhbWV0ZXJzICovCisJdm9pZAkJCSgqb3ZlcmxpbWl0KShzdHJ1Y3QgY2JxX2NsYXNzICpjbCk7CisJbG9uZwkJCXBlbmFsdHk7CisKKwkvKiBHZW5lcmFsIHNjaGVkdWxlciAoV1JSKSBwYXJhbWV0ZXJzICovCisJbG9uZwkJCWFsbG90OworCWxvbmcJCQlxdWFudHVtOwkvKiBBbGxvdG1lbnQgcGVyIFdSUiByb3VuZCAqLworCWxvbmcJCQl3ZWlnaHQ7CQkvKiBSZWxhdGl2ZSBhbGxvdG1lbnQ6IHNlZSBiZWxvdyAqLworCisJc3RydWN0IFFkaXNjCQkqcWRpc2M7CQkvKiBQdHIgdG8gQ0JRIGRpc2NpcGxpbmUgKi8KKwlzdHJ1Y3QgY2JxX2NsYXNzCSpzcGxpdDsJCS8qIFB0ciB0byBzcGxpdCBub2RlICovCisJc3RydWN0IGNicV9jbGFzcwkqc2hhcmU7CQkvKiBQdHIgdG8gTFMgcGFyZW50IGluIHRoZSBjbGFzcyB0cmVlICovCisJc3RydWN0IGNicV9jbGFzcwkqdHBhcmVudDsJLyogUHRyIHRvIHRyZWUgcGFyZW50IGluIHRoZSBjbGFzcyB0cmVlICovCisJc3RydWN0IGNicV9jbGFzcwkqYm9ycm93OwkvKiBOVUxMIGlmIGNsYXNzIGlzIGJhbmR3aWR0aCBsaW1pdGVkOworCQkJCQkJICAgcGFyZW50IG90aGVyd2lzZSAqLworCXN0cnVjdCBjYnFfY2xhc3MJKnNpYmxpbmc7CS8qIFNpYmxpbmcgY2hhaW4gKi8KKwlzdHJ1Y3QgY2JxX2NsYXNzCSpjaGlsZHJlbjsJLyogUG9pbnRlciB0byBjaGlsZHJlbiBjaGFpbiAqLworCisJc3RydWN0IFFkaXNjCQkqcTsJCS8qIEVsZW1lbnRhcnkgcXVldWVpbmcgZGlzY2lwbGluZSAqLworCisKKy8qIFZhcmlhYmxlcyAqLworCXVuc2lnbmVkIGNoYXIJCWNwcmlvcml0eTsJLyogRWZmZWN0aXZlIHByaW9yaXR5ICovCisJdW5zaWduZWQgY2hhcgkJZGVsYXllZDsKKwl1bnNpZ25lZCBjaGFyCQlsZXZlbDsJCS8qIGxldmVsIG9mIHRoZSBjbGFzcyBpbiBoaWVyYXJjaHk6CisJCQkJCQkgICAwIGZvciBsZWFmIGNsYXNzZXMsIGFuZCBtYXhpbWFsCisJCQkJCQkgICBsZXZlbCBvZiBjaGlsZHJlbiArIDEgZm9yIG5vZGVzLgorCQkJCQkJICovCisKKwlwc2NoZWRfdGltZV90CQlsYXN0OwkJLyogTGFzdCBlbmQgb2Ygc2VydmljZSAqLworCXBzY2hlZF90aW1lX3QJCXVuZGVydGltZTsKKwlsb25nCQkJYXZnaWRsZTsKKwlsb25nCQkJZGVmaWNpdDsJLyogU2F2ZWQgZGVmaWNpdCBmb3IgV1JSICovCisJdW5zaWduZWQgbG9uZwkJcGVuYWxpemVkOworCXN0cnVjdCBnbmV0X3N0YXRzX2Jhc2ljIGJzdGF0czsKKwlzdHJ1Y3QgZ25ldF9zdGF0c19xdWV1ZSBxc3RhdHM7CisJc3RydWN0IGduZXRfc3RhdHNfcmF0ZV9lc3QgcmF0ZV9lc3Q7CisJc3BpbmxvY2tfdAkJKnN0YXRzX2xvY2s7CisJc3RydWN0IHRjX2NicV94c3RhdHMJeHN0YXRzOworCisJc3RydWN0IHRjZl9wcm90bwkqZmlsdGVyX2xpc3Q7CisKKwlpbnQJCQlyZWZjbnQ7CisJaW50CQkJZmlsdGVyczsKKworCXN0cnVjdCBjYnFfY2xhc3MgCSpkZWZhdWx0c1tUQ19QUklPX01BWCsxXTsKK307CisKK3N0cnVjdCBjYnFfc2NoZWRfZGF0YQoreworCXN0cnVjdCBjYnFfY2xhc3MJKmNsYXNzZXNbMTZdOwkJLyogSGFzaCB0YWJsZSBvZiBhbGwgY2xhc3NlcyAqLworCWludAkJCW5jbGFzc2VzW1RDX0NCUV9NQVhQUklPKzFdOworCXVuc2lnbmVkCQlxdWFudGFbVENfQ0JRX01BWFBSSU8rMV07CisKKwlzdHJ1Y3QgY2JxX2NsYXNzCWxpbms7CisKKwl1bnNpZ25lZAkJYWN0aXZlbWFzazsKKwlzdHJ1Y3QgY2JxX2NsYXNzCSphY3RpdmVbVENfQ0JRX01BWFBSSU8rMV07CS8qIExpc3Qgb2YgYWxsIGNsYXNzZXMKKwkJCQkJCQkJICAgd2l0aCBiYWNrbG9nICovCisKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19QT0xJQ0UKKwlzdHJ1Y3QgY2JxX2NsYXNzCSpyeF9jbGFzczsKKyNlbmRpZgorCXN0cnVjdCBjYnFfY2xhc3MJKnR4X2NsYXNzOworCXN0cnVjdCBjYnFfY2xhc3MJKnR4X2JvcnJvd2VkOworCWludAkJCXR4X2xlbjsKKwlwc2NoZWRfdGltZV90CQlub3c7CQkvKiBDYWNoZWQgdGltZXN0YW1wICovCisJcHNjaGVkX3RpbWVfdAkJbm93X3J0OwkJLyogQ2FjaGVkIHJlYWwgdGltZSAqLworCXVuc2lnbmVkCQlwbWFzazsKKworCXN0cnVjdCB0aW1lcl9saXN0CWRlbGF5X3RpbWVyOworCXN0cnVjdCB0aW1lcl9saXN0CXdkX3RpbWVyOwkvKiBXYXRjaGRvZyB0aW1lciwKKwkJCQkJCSAgIHN0YXJ0ZWQgd2hlbiBDQlEgaGFzCisJCQkJCQkgICBiYWNrbG9nLCBidXQgY2Fubm90CisJCQkJCQkgICB0cmFuc21pdCBqdXN0IG5vdyAqLworCWxvbmcJCQl3ZF9leHBpcmVzOworCWludAkJCXRvcGxldmVsOworCXUzMgkJCWhnZW5lcmF0b3I7Cit9OworCisKKyNkZWZpbmUgTDJUKGNsLGxlbikJKChjbCktPlJfdGFiLT5kYXRhWyhsZW4pPj4oY2wpLT5SX3RhYi0+cmF0ZS5jZWxsX2xvZ10pCisKKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgY2JxX2hhc2godTMyIGgpCit7CisJaCBePSBoPj44OworCWggXj0gaD4+NDsKKwlyZXR1cm4gaCYweEY7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBjYnFfY2xhc3MgKgorY2JxX2NsYXNzX2xvb2t1cChzdHJ1Y3QgY2JxX3NjaGVkX2RhdGEgKnEsIHUzMiBjbGFzc2lkKQoreworCXN0cnVjdCBjYnFfY2xhc3MgKmNsOworCisJZm9yIChjbCA9IHEtPmNsYXNzZXNbY2JxX2hhc2goY2xhc3NpZCldOyBjbDsgY2wgPSBjbC0+bmV4dCkKKwkJaWYgKGNsLT5jbGFzc2lkID09IGNsYXNzaWQpCisJCQlyZXR1cm4gY2w7CisJcmV0dXJuIE5VTEw7Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19QT0xJQ0UKKworc3RhdGljIHN0cnVjdCBjYnFfY2xhc3MgKgorY2JxX3JlY2xhc3NpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNicV9jbGFzcyAqdGhpcykKK3sKKwlzdHJ1Y3QgY2JxX2NsYXNzICpjbCwgKm5ldzsKKworCWZvciAoY2wgPSB0aGlzLT50cGFyZW50OyBjbDsgY2wgPSBjbC0+dHBhcmVudCkKKwkJaWYgKChuZXcgPSBjbC0+ZGVmYXVsdHNbVENfUFJJT19CRVNURUZGT1JUXSkgIT0gTlVMTCAmJiBuZXcgIT0gdGhpcykKKwkJCXJldHVybiBuZXc7CisKKwlyZXR1cm4gTlVMTDsKK30KKworI2VuZGlmCisKKy8qIENsYXNzaWZ5IHBhY2tldC4gVGhlIHByb2NlZHVyZSBpcyBwcmV0dHkgY29tcGxpY2F0ZWQsIGJ1dAorICAgaXQgYWxsb3dzIHVzIHRvIGNvbWJpbmUgbGluayBzaGFyaW5nIGFuZCBwcmlvcml0eSBzY2hlZHVsaW5nCisgICB0cmFuc3BhcmVudGx5LgorCisgICBOYW1lbHksIHlvdSBjYW4gcHV0IGxpbmsgc2hhcmluZyBydWxlcyAoZi5lLiByb3V0ZSBiYXNlZCkgYXQgcm9vdCBvZiBDQlEsCisgICBzbyB0aGF0IGl0IHJlc29sdmVzIHRvIHNwbGl0IG5vZGVzLiBUaGVuIHBhY2tldHMgYXJlIGNsYXNzaWZpZWQKKyAgIGJ5IGxvZ2ljYWwgcHJpb3JpdHksIG9yIGEgbW9yZSBzcGVjaWZpYyBjbGFzc2lmaWVyIG1heSBiZSBhdHRhY2hlZAorICAgdG8gdGhlIHNwbGl0IG5vZGUuCisgKi8KKworc3RhdGljIHN0cnVjdCBjYnFfY2xhc3MgKgorY2JxX2NsYXNzaWZ5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBRZGlzYyAqc2NoLCBpbnQgKnFlcnIpCit7CisJc3RydWN0IGNicV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCBjYnFfY2xhc3MgKmhlYWQgPSAmcS0+bGluazsKKwlzdHJ1Y3QgY2JxX2NsYXNzICoqZGVmbWFwOworCXN0cnVjdCBjYnFfY2xhc3MgKmNsID0gTlVMTDsKKwl1MzIgcHJpbyA9IHNrYi0+cHJpb3JpdHk7CisJc3RydWN0IHRjZl9yZXN1bHQgcmVzOworCisJLyoKKwkgKiAgU3RlcCAxLiBJZiBza2ItPnByaW9yaXR5IHBvaW50cyB0byBvbmUgb2Ygb3VyIGNsYXNzZXMsIHVzZSBpdC4KKwkgKi8KKwlpZiAoVENfSF9NQUoocHJpb15zY2gtPmhhbmRsZSkgPT0gMCAmJgorCSAgICAoY2wgPSBjYnFfY2xhc3NfbG9va3VwKHEsIHByaW8pKSAhPSBOVUxMKQorCQlyZXR1cm4gY2w7CisKKwkqcWVyciA9IE5FVF9YTUlUX0RST1A7CisJZm9yICg7OykgeworCQlpbnQgcmVzdWx0ID0gMDsKKwkJZGVmbWFwID0gaGVhZC0+ZGVmYXVsdHM7CisKKwkJLyoKKwkJICogU3RlcCAyK24uIEFwcGx5IGNsYXNzaWZpZXIuCisJCSAqLworCQlpZiAoIWhlYWQtPmZpbHRlcl9saXN0IHx8IChyZXN1bHQgPSB0Y19jbGFzc2lmeShza2IsIGhlYWQtPmZpbHRlcl9saXN0LCAmcmVzKSkgPCAwKQorCQkJZ290byBmYWxsYmFjazsKKworCQlpZiAoKGNsID0gKHZvaWQqKXJlcy5jbGFzcykgPT0gTlVMTCkgeworCQkJaWYgKFRDX0hfTUFKKHJlcy5jbGFzc2lkKSkKKwkJCQljbCA9IGNicV9jbGFzc19sb29rdXAocSwgcmVzLmNsYXNzaWQpOworCQkJZWxzZSBpZiAoKGNsID0gZGVmbWFwW3Jlcy5jbGFzc2lkJlRDX1BSSU9fTUFYXSkgPT0gTlVMTCkKKwkJCQljbCA9IGRlZm1hcFtUQ19QUklPX0JFU1RFRkZPUlRdOworCisJCQlpZiAoY2wgPT0gTlVMTCB8fCBjbC0+bGV2ZWwgPj0gaGVhZC0+bGV2ZWwpCisJCQkJZ290byBmYWxsYmFjazsKKwkJfQorCisjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCisJCXN3aXRjaCAocmVzdWx0KSB7CisJCWNhc2UgVENfQUNUX1FVRVVFRDoKKwkJY2FzZSBUQ19BQ1RfU1RPTEVOOiAKKwkJCSpxZXJyID0gTkVUX1hNSVRfU1VDQ0VTUzsKKwkJY2FzZSBUQ19BQ1RfU0hPVDoKKwkJCXJldHVybiBOVUxMOworCQl9CisjZWxpZiBkZWZpbmVkKENPTkZJR19ORVRfQ0xTX1BPTElDRSkKKwkJc3dpdGNoIChyZXN1bHQpIHsKKwkJY2FzZSBUQ19QT0xJQ0VfUkVDTEFTU0lGWToKKwkJCXJldHVybiBjYnFfcmVjbGFzc2lmeShza2IsIGNsKTsKKwkJY2FzZSBUQ19QT0xJQ0VfU0hPVDoKKwkJCXJldHVybiBOVUxMOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCQlpZiAoY2wtPmxldmVsID09IDApCisJCQlyZXR1cm4gY2w7CisKKwkJLyoKKwkJICogU3RlcCAzK24uIElmIGNsYXNzaWZpZXIgc2VsZWN0ZWQgYSBsaW5rIHNoYXJpbmcgY2xhc3MsCisJCSAqCSAgIGFwcGx5IGFnZW5jeSBzcGVjaWZpYyBjbGFzc2lmaWVyLgorCQkgKgkgICBSZXBlYXQgdGhpcyBwcm9jZHVyZSB1bnRpbCB3ZSBoaXQgYSBsZWFmIG5vZGUuCisJCSAqLworCQloZWFkID0gY2w7CisJfQorCitmYWxsYmFjazoKKwljbCA9IGhlYWQ7CisKKwkvKgorCSAqIFN0ZXAgNC4gTm8gc3VjY2Vzcy4uLgorCSAqLworCWlmIChUQ19IX01BSihwcmlvKSA9PSAwICYmCisJICAgICEoY2wgPSBoZWFkLT5kZWZhdWx0c1twcmlvJlRDX1BSSU9fTUFYXSkgJiYKKwkgICAgIShjbCA9IGhlYWQtPmRlZmF1bHRzW1RDX1BSSU9fQkVTVEVGRk9SVF0pKQorCQlyZXR1cm4gaGVhZDsKKworCXJldHVybiBjbDsKK30KKworLyoKKyAgIEEgcGFja2V0IGhhcyBqdXN0IGJlZW4gZW5xdWV1ZWQgb24gdGhlIGVtcHR5IGNsYXNzLgorICAgY2JxX2FjdGl2YXRlX2NsYXNzIGFkZHMgaXQgdG8gdGhlIHRhaWwgb2YgYWN0aXZlIGNsYXNzIGxpc3QKKyAgIG9mIGl0cyBwcmlvcml0eSBiYW5kLgorICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgY2JxX2FjdGl2YXRlX2NsYXNzKHN0cnVjdCBjYnFfY2xhc3MgKmNsKQoreworCXN0cnVjdCBjYnFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoY2wtPnFkaXNjKTsKKwlpbnQgcHJpbyA9IGNsLT5jcHJpb3JpdHk7CisJc3RydWN0IGNicV9jbGFzcyAqY2xfdGFpbDsKKworCWNsX3RhaWwgPSBxLT5hY3RpdmVbcHJpb107CisJcS0+YWN0aXZlW3ByaW9dID0gY2w7CisKKwlpZiAoY2xfdGFpbCAhPSBOVUxMKSB7CisJCWNsLT5uZXh0X2FsaXZlID0gY2xfdGFpbC0+bmV4dF9hbGl2ZTsKKwkJY2xfdGFpbC0+bmV4dF9hbGl2ZSA9IGNsOworCX0gZWxzZSB7CisJCWNsLT5uZXh0X2FsaXZlID0gY2w7CisJCXEtPmFjdGl2ZW1hc2sgfD0gKDE8PHByaW8pOworCX0KK30KKworLyoKKyAgIFVubGluayBjbGFzcyBmcm9tIGFjdGl2ZSBjaGFpbi4KKyAgIE5vdGUgdGhhdCB0aGlzIHNhbWUgcHJvY2VkdXJlIGlzIGRvbmUgZGlyZWN0bHkgaW4gY2JxX2RlcXVldWUqCisgICBkdXJpbmcgcm91bmQtcm9iaW4gcHJvY2VkdXJlLgorICovCisKK3N0YXRpYyB2b2lkIGNicV9kZWFjdGl2YXRlX2NsYXNzKHN0cnVjdCBjYnFfY2xhc3MgKnRoaXMpCit7CisJc3RydWN0IGNicV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdih0aGlzLT5xZGlzYyk7CisJaW50IHByaW8gPSB0aGlzLT5jcHJpb3JpdHk7CisJc3RydWN0IGNicV9jbGFzcyAqY2w7CisJc3RydWN0IGNicV9jbGFzcyAqY2xfcHJldiA9IHEtPmFjdGl2ZVtwcmlvXTsKKworCWRvIHsKKwkJY2wgPSBjbF9wcmV2LT5uZXh0X2FsaXZlOworCQlpZiAoY2wgPT0gdGhpcykgeworCQkJY2xfcHJldi0+bmV4dF9hbGl2ZSA9IGNsLT5uZXh0X2FsaXZlOworCQkJY2wtPm5leHRfYWxpdmUgPSBOVUxMOworCisJCQlpZiAoY2wgPT0gcS0+YWN0aXZlW3ByaW9dKSB7CisJCQkJcS0+YWN0aXZlW3ByaW9dID0gY2xfcHJldjsKKwkJCQlpZiAoY2wgPT0gcS0+YWN0aXZlW3ByaW9dKSB7CisJCQkJCXEtPmFjdGl2ZVtwcmlvXSA9IE5VTEw7CisJCQkJCXEtPmFjdGl2ZW1hc2sgJj0gfigxPDxwcmlvKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKworCQkJY2wgPSBjbF9wcmV2LT5uZXh0X2FsaXZlOworCQkJcmV0dXJuOworCQl9CisJfSB3aGlsZSAoKGNsX3ByZXYgPSBjbCkgIT0gcS0+YWN0aXZlW3ByaW9dKTsKK30KKworc3RhdGljIHZvaWQKK2NicV9tYXJrX3RvcGxldmVsKHN0cnVjdCBjYnFfc2NoZWRfZGF0YSAqcSwgc3RydWN0IGNicV9jbGFzcyAqY2wpCit7CisJaW50IHRvcGxldmVsID0gcS0+dG9wbGV2ZWw7CisKKwlpZiAodG9wbGV2ZWwgPiBjbC0+bGV2ZWwgJiYgIShjbC0+cS0+ZmxhZ3MmVENRX0ZfVEhST1RUTEVEKSkgeworCQlwc2NoZWRfdGltZV90IG5vdzsKKwkJcHNjaGVkX3RkaWZmX3QgaW5jcjsKKworCQlQU0NIRURfR0VUX1RJTUUobm93KTsKKwkJaW5jciA9IFBTQ0hFRF9URElGRihub3csIHEtPm5vd19ydCk7CisJCVBTQ0hFRF9UQUREMihxLT5ub3csIGluY3IsIG5vdyk7CisKKwkJZG8geworCQkJaWYgKFBTQ0hFRF9UTEVTUyhjbC0+dW5kZXJ0aW1lLCBub3cpKSB7CisJCQkJcS0+dG9wbGV2ZWwgPSBjbC0+bGV2ZWw7CisJCQkJcmV0dXJuOworCQkJfQorCQl9IHdoaWxlICgoY2w9Y2wtPmJvcnJvdykgIT0gTlVMTCAmJiB0b3BsZXZlbCA+IGNsLT5sZXZlbCk7CisJfQorfQorCitzdGF0aWMgaW50CitjYnFfZW5xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUWRpc2MgKnNjaCkKK3sKKwlzdHJ1Y3QgY2JxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJaW50IGxlbiA9IHNrYi0+bGVuOworCWludCByZXQ7CisJc3RydWN0IGNicV9jbGFzcyAqY2wgPSBjYnFfY2xhc3NpZnkoc2tiLCBzY2gsICZyZXQpOworCisjaWZkZWYgQ09ORklHX05FVF9DTFNfUE9MSUNFCisJcS0+cnhfY2xhc3MgPSBjbDsKKyNlbmRpZgorCWlmIChjbCA9PSBOVUxMKSB7CisJCWlmIChyZXQgPT0gTkVUX1hNSVRfRFJPUCkKKwkJCXNjaC0+cXN0YXRzLmRyb3BzKys7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gcmV0OworCX0KKworI2lmZGVmIENPTkZJR19ORVRfQ0xTX1BPTElDRQorCWNsLT5xLT5fX3BhcmVudCA9IHNjaDsKKyNlbmRpZgorCWlmICgocmV0ID0gY2wtPnEtPmVucXVldWUoc2tiLCBjbC0+cSkpID09IE5FVF9YTUlUX1NVQ0NFU1MpIHsKKwkJc2NoLT5xLnFsZW4rKzsKKwkJc2NoLT5ic3RhdHMucGFja2V0cysrOworCQlzY2gtPmJzdGF0cy5ieXRlcys9bGVuOworCQljYnFfbWFya190b3BsZXZlbChxLCBjbCk7CisJCWlmICghY2wtPm5leHRfYWxpdmUpCisJCQljYnFfYWN0aXZhdGVfY2xhc3MoY2wpOworCQlyZXR1cm4gcmV0OworCX0KKworCXNjaC0+cXN0YXRzLmRyb3BzKys7CisJY2JxX21hcmtfdG9wbGV2ZWwocSwgY2wpOworCWNsLT5xc3RhdHMuZHJvcHMrKzsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitjYnFfcmVxdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUWRpc2MgKnNjaCkKK3sKKwlzdHJ1Y3QgY2JxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJc3RydWN0IGNicV9jbGFzcyAqY2w7CisJaW50IHJldDsKKworCWlmICgoY2wgPSBxLT50eF9jbGFzcykgPT0gTlVMTCkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJc2NoLT5xc3RhdHMuZHJvcHMrKzsKKwkJcmV0dXJuIE5FVF9YTUlUX0NOOworCX0KKwlxLT50eF9jbGFzcyA9IE5VTEw7CisKKwljYnFfbWFya190b3BsZXZlbChxLCBjbCk7CisKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19QT0xJQ0UKKwlxLT5yeF9jbGFzcyA9IGNsOworCWNsLT5xLT5fX3BhcmVudCA9IHNjaDsKKyNlbmRpZgorCWlmICgocmV0ID0gY2wtPnEtPm9wcy0+cmVxdWV1ZShza2IsIGNsLT5xKSkgPT0gMCkgeworCQlzY2gtPnEucWxlbisrOworCQlzY2gtPnFzdGF0cy5yZXF1ZXVlcysrOworCQlpZiAoIWNsLT5uZXh0X2FsaXZlKQorCQkJY2JxX2FjdGl2YXRlX2NsYXNzKGNsKTsKKwkJcmV0dXJuIDA7CisJfQorCXNjaC0+cXN0YXRzLmRyb3BzKys7CisJY2wtPnFzdGF0cy5kcm9wcysrOworCXJldHVybiByZXQ7Cit9CisKKy8qIE92ZXJsaW1pdCBhY3Rpb25zICovCisKKy8qIFRDX0NCUV9PVkxfQ0xBU1NJQzogKGRlZmF1bHQpIHBlbmFsaXplIGxlYWYgY2xhc3MgYnkgYWRkaW5nIG9mZnRpbWUgKi8KKworc3RhdGljIHZvaWQgY2JxX292bF9jbGFzc2ljKHN0cnVjdCBjYnFfY2xhc3MgKmNsKQoreworCXN0cnVjdCBjYnFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoY2wtPnFkaXNjKTsKKwlwc2NoZWRfdGRpZmZfdCBkZWxheSA9IFBTQ0hFRF9URElGRihjbC0+dW5kZXJ0aW1lLCBxLT5ub3cpOworCisJaWYgKCFjbC0+ZGVsYXllZCkgeworCQlkZWxheSArPSBjbC0+b2ZmdGltZTsKKworCQkvKiAKKwkJICAgQ2xhc3MgZ29lcyB0byBzbGVlcCwgc28gdGhhdCBpdCB3aWxsIGhhdmUgbm8KKwkJICAgY2hhbmNlIHRvIHdvcmsgYXZnaWRsZS4gTGV0J3MgZm9yZ2l2ZSBpdCA4KQorCisJCSAgIEJUVyBjYnEtMi4wIGhhcyBhIGNyYXAgaW4gdGhpcworCQkgICBwbGFjZSwgYXBwYXJlbnRseSB0aGV5IGZvcmdvdCB0byBzaGlmdCBpdCBieSBjbC0+ZXdtYV9sb2cuCisJCSAqLworCQlpZiAoY2wtPmF2Z2lkbGUgPCAwKQorCQkJZGVsYXkgLT0gKC1jbC0+YXZnaWRsZSkgLSAoKC1jbC0+YXZnaWRsZSkgPj4gY2wtPmV3bWFfbG9nKTsKKwkJaWYgKGNsLT5hdmdpZGxlIDwgY2wtPm1pbmlkbGUpCisJCQljbC0+YXZnaWRsZSA9IGNsLT5taW5pZGxlOworCQlpZiAoZGVsYXkgPD0gMCkKKwkJCWRlbGF5ID0gMTsKKwkJUFNDSEVEX1RBREQyKHEtPm5vdywgZGVsYXksIGNsLT51bmRlcnRpbWUpOworCisJCWNsLT54c3RhdHMub3ZlcmFjdGlvbnMrKzsKKwkJY2wtPmRlbGF5ZWQgPSAxOworCX0KKwlpZiAocS0+d2RfZXhwaXJlcyA9PSAwIHx8IHEtPndkX2V4cGlyZXMgPiBkZWxheSkKKwkJcS0+d2RfZXhwaXJlcyA9IGRlbGF5OworCisJLyogRGlydHkgd29yayEgV2UgbXVzdCBzY2hlZHVsZSB3YWtldXBzIGJhc2VkIG9uCisJICAgcmVhbCBhdmFpbGFibGUgcmF0ZSwgcmF0aGVyIHRoYW4gbGVhZiByYXRlLAorCSAgIHdoaWNoIG1heSBiZSB0aW55IChldmVuIHplcm8pLgorCSAqLworCWlmIChxLT50b3BsZXZlbCA9PSBUQ19DQlFfTUFYTEVWRUwpIHsKKwkJc3RydWN0IGNicV9jbGFzcyAqYjsKKwkJcHNjaGVkX3RkaWZmX3QgYmFzZV9kZWxheSA9IHEtPndkX2V4cGlyZXM7CisKKwkJZm9yIChiID0gY2wtPmJvcnJvdzsgYjsgYiA9IGItPmJvcnJvdykgeworCQkJZGVsYXkgPSBQU0NIRURfVERJRkYoYi0+dW5kZXJ0aW1lLCBxLT5ub3cpOworCQkJaWYgKGRlbGF5IDwgYmFzZV9kZWxheSkgeworCQkJCWlmIChkZWxheSA8PSAwKQorCQkJCQlkZWxheSA9IDE7CisJCQkJYmFzZV9kZWxheSA9IGRlbGF5OworCQkJfQorCQl9CisKKwkJcS0+d2RfZXhwaXJlcyA9IGJhc2VfZGVsYXk7CisJfQorfQorCisvKiBUQ19DQlFfT1ZMX1JDTEFTU0lDOiBwZW5hbGl6ZSBieSBvZmZ0aW1lIGNsYXNzZXMgaW4gaGllcmFyY2h5LCB3aGVuCisgICB0aGV5IGdvIG92ZXJsaW1pdAorICovCisKK3N0YXRpYyB2b2lkIGNicV9vdmxfcmNsYXNzaWMoc3RydWN0IGNicV9jbGFzcyAqY2wpCit7CisJc3RydWN0IGNicV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihjbC0+cWRpc2MpOworCXN0cnVjdCBjYnFfY2xhc3MgKnRoaXMgPSBjbDsKKworCWRvIHsKKwkJaWYgKGNsLT5sZXZlbCA+IHEtPnRvcGxldmVsKSB7CisJCQljbCA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKChjbCA9IGNsLT5ib3Jyb3cpICE9IE5VTEwpOworCisJaWYgKGNsID09IE5VTEwpCisJCWNsID0gdGhpczsKKwljYnFfb3ZsX2NsYXNzaWMoY2wpOworfQorCisvKiBUQ19DQlFfT1ZMX0RFTEFZOiBkZWxheSB1bnRpbCBpdCB3aWxsIGdvIHRvIHVuZGVybGltaXQgKi8KKworc3RhdGljIHZvaWQgY2JxX292bF9kZWxheShzdHJ1Y3QgY2JxX2NsYXNzICpjbCkKK3sKKwlzdHJ1Y3QgY2JxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KGNsLT5xZGlzYyk7CisJcHNjaGVkX3RkaWZmX3QgZGVsYXkgPSBQU0NIRURfVERJRkYoY2wtPnVuZGVydGltZSwgcS0+bm93KTsKKworCWlmICghY2wtPmRlbGF5ZWQpIHsKKwkJdW5zaWduZWQgbG9uZyBzY2hlZCA9IGppZmZpZXM7CisKKwkJZGVsYXkgKz0gY2wtPm9mZnRpbWU7CisJCWlmIChjbC0+YXZnaWRsZSA8IDApCisJCQlkZWxheSAtPSAoLWNsLT5hdmdpZGxlKSAtICgoLWNsLT5hdmdpZGxlKSA+PiBjbC0+ZXdtYV9sb2cpOworCQlpZiAoY2wtPmF2Z2lkbGUgPCBjbC0+bWluaWRsZSkKKwkJCWNsLT5hdmdpZGxlID0gY2wtPm1pbmlkbGU7CisJCVBTQ0hFRF9UQUREMihxLT5ub3csIGRlbGF5LCBjbC0+dW5kZXJ0aW1lKTsKKworCQlpZiAoZGVsYXkgPiAwKSB7CisJCQlzY2hlZCArPSBQU0NIRURfVVMySklGRklFKGRlbGF5KSArIGNsLT5wZW5hbHR5OworCQkJY2wtPnBlbmFsaXplZCA9IHNjaGVkOworCQkJY2wtPmNwcmlvcml0eSA9IFRDX0NCUV9NQVhQUklPOworCQkJcS0+cG1hc2sgfD0gKDE8PFRDX0NCUV9NQVhQUklPKTsKKwkJCWlmIChkZWxfdGltZXIoJnEtPmRlbGF5X3RpbWVyKSAmJgorCQkJICAgIChsb25nKShxLT5kZWxheV90aW1lci5leHBpcmVzIC0gc2NoZWQpID4gMCkKKwkJCQlxLT5kZWxheV90aW1lci5leHBpcmVzID0gc2NoZWQ7CisJCQlhZGRfdGltZXIoJnEtPmRlbGF5X3RpbWVyKTsKKwkJCWNsLT5kZWxheWVkID0gMTsKKwkJCWNsLT54c3RhdHMub3ZlcmFjdGlvbnMrKzsKKwkJCXJldHVybjsKKwkJfQorCQlkZWxheSA9IDE7CisJfQorCWlmIChxLT53ZF9leHBpcmVzID09IDAgfHwgcS0+d2RfZXhwaXJlcyA+IGRlbGF5KQorCQlxLT53ZF9leHBpcmVzID0gZGVsYXk7Cit9CisKKy8qIFRDX0NCUV9PVkxfTE9XUFJJTzogcGVuYWxpemUgY2xhc3MgYnkgbG93ZXJpbmcgaXRzIHByaW9yaXR5IGJhbmQgKi8KKworc3RhdGljIHZvaWQgY2JxX292bF9sb3dwcmlvKHN0cnVjdCBjYnFfY2xhc3MgKmNsKQoreworCXN0cnVjdCBjYnFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoY2wtPnFkaXNjKTsKKworCWNsLT5wZW5hbGl6ZWQgPSBqaWZmaWVzICsgY2wtPnBlbmFsdHk7CisKKwlpZiAoY2wtPmNwcmlvcml0eSAhPSBjbC0+cHJpb3JpdHkyKSB7CisJCWNsLT5jcHJpb3JpdHkgPSBjbC0+cHJpb3JpdHkyOworCQlxLT5wbWFzayB8PSAoMTw8Y2wtPmNwcmlvcml0eSk7CisJCWNsLT54c3RhdHMub3ZlcmFjdGlvbnMrKzsKKwl9CisJY2JxX292bF9jbGFzc2ljKGNsKTsKK30KKworLyogVENfQ0JRX09WTF9EUk9QOiBwZW5hbGl6ZSBjbGFzcyBieSBkcm9wcGluZyAqLworCitzdGF0aWMgdm9pZCBjYnFfb3ZsX2Ryb3Aoc3RydWN0IGNicV9jbGFzcyAqY2wpCit7CisJaWYgKGNsLT5xLT5vcHMtPmRyb3ApCisJCWlmIChjbC0+cS0+b3BzLT5kcm9wKGNsLT5xKSkKKwkJCWNsLT5xZGlzYy0+cS5xbGVuLS07CisJY2wtPnhzdGF0cy5vdmVyYWN0aW9ucysrOworCWNicV9vdmxfY2xhc3NpYyhjbCk7Cit9CisKK3N0YXRpYyB2b2lkIGNicV93YXRjaGRvZyh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgUWRpc2MgKnNjaCA9IChzdHJ1Y3QgUWRpc2MqKWFyZzsKKworCXNjaC0+ZmxhZ3MgJj0gflRDUV9GX1RIUk9UVExFRDsKKwluZXRpZl9zY2hlZHVsZShzY2gtPmRldik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNicV91bmRlbGF5X3ByaW8oc3RydWN0IGNicV9zY2hlZF9kYXRhICpxLCBpbnQgcHJpbykKK3sKKwlzdHJ1Y3QgY2JxX2NsYXNzICpjbDsKKwlzdHJ1Y3QgY2JxX2NsYXNzICpjbF9wcmV2ID0gcS0+YWN0aXZlW3ByaW9dOworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKwl1bnNpZ25lZCBsb25nIHNjaGVkID0gbm93OworCisJaWYgKGNsX3ByZXYgPT0gTlVMTCkKKwkJcmV0dXJuIG5vdzsKKworCWRvIHsKKwkJY2wgPSBjbF9wcmV2LT5uZXh0X2FsaXZlOworCQlpZiAoKGxvbmcpKG5vdyAtIGNsLT5wZW5hbGl6ZWQpID4gMCkgeworCQkJY2xfcHJldi0+bmV4dF9hbGl2ZSA9IGNsLT5uZXh0X2FsaXZlOworCQkJY2wtPm5leHRfYWxpdmUgPSBOVUxMOworCQkJY2wtPmNwcmlvcml0eSA9IGNsLT5wcmlvcml0eTsKKwkJCWNsLT5kZWxheWVkID0gMDsKKwkJCWNicV9hY3RpdmF0ZV9jbGFzcyhjbCk7CisKKwkJCWlmIChjbCA9PSBxLT5hY3RpdmVbcHJpb10pIHsKKwkJCQlxLT5hY3RpdmVbcHJpb10gPSBjbF9wcmV2OworCQkJCWlmIChjbCA9PSBxLT5hY3RpdmVbcHJpb10pIHsKKwkJCQkJcS0+YWN0aXZlW3ByaW9dID0gTlVMTDsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCisJCQljbCA9IGNsX3ByZXYtPm5leHRfYWxpdmU7CisJCX0gZWxzZSBpZiAoKGxvbmcpKHNjaGVkIC0gY2wtPnBlbmFsaXplZCkgPiAwKQorCQkJc2NoZWQgPSBjbC0+cGVuYWxpemVkOworCX0gd2hpbGUgKChjbF9wcmV2ID0gY2wpICE9IHEtPmFjdGl2ZVtwcmlvXSk7CisKKwlyZXR1cm4gKGxvbmcpKHNjaGVkIC0gbm93KTsKK30KKworc3RhdGljIHZvaWQgY2JxX3VuZGVsYXkodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IFFkaXNjICpzY2ggPSAoc3RydWN0IFFkaXNjKilhcmc7CisJc3RydWN0IGNicV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCWxvbmcgZGVsYXkgPSAwOworCXVuc2lnbmVkIHBtYXNrOworCisJcG1hc2sgPSBxLT5wbWFzazsKKwlxLT5wbWFzayA9IDA7CisKKwl3aGlsZSAocG1hc2spIHsKKwkJaW50IHByaW8gPSBmZnoofnBtYXNrKTsKKwkJbG9uZyB0bXA7CisKKwkJcG1hc2sgJj0gfigxPDxwcmlvKTsKKworCQl0bXAgPSBjYnFfdW5kZWxheV9wcmlvKHEsIHByaW8pOworCQlpZiAodG1wID4gMCkgeworCQkJcS0+cG1hc2sgfD0gMTw8cHJpbzsKKwkJCWlmICh0bXAgPCBkZWxheSB8fCBkZWxheSA9PSAwKQorCQkJCWRlbGF5ID0gdG1wOworCQl9CisJfQorCisJaWYgKGRlbGF5KSB7CisJCXEtPmRlbGF5X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgZGVsYXk7CisJCWFkZF90aW1lcigmcS0+ZGVsYXlfdGltZXIpOworCX0KKworCXNjaC0+ZmxhZ3MgJj0gflRDUV9GX1RIUk9UVExFRDsKKwluZXRpZl9zY2hlZHVsZShzY2gtPmRldik7Cit9CisKKworI2lmZGVmIENPTkZJR19ORVRfQ0xTX1BPTElDRQorCitzdGF0aWMgaW50IGNicV9yZXNoYXBlX2ZhaWwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjICpjaGlsZCkKK3sKKwlpbnQgbGVuID0gc2tiLT5sZW47CisJc3RydWN0IFFkaXNjICpzY2ggPSBjaGlsZC0+X19wYXJlbnQ7CisJc3RydWN0IGNicV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCBjYnFfY2xhc3MgKmNsID0gcS0+cnhfY2xhc3M7CisKKwlxLT5yeF9jbGFzcyA9IE5VTEw7CisKKwlpZiAoY2wgJiYgKGNsID0gY2JxX3JlY2xhc3NpZnkoc2tiLCBjbCkpICE9IE5VTEwpIHsKKworCQljYnFfbWFya190b3BsZXZlbChxLCBjbCk7CisKKwkJcS0+cnhfY2xhc3MgPSBjbDsKKwkJY2wtPnEtPl9fcGFyZW50ID0gc2NoOworCisJCWlmIChjbC0+cS0+ZW5xdWV1ZShza2IsIGNsLT5xKSA9PSAwKSB7CisJCQlzY2gtPnEucWxlbisrOworCQkJc2NoLT5ic3RhdHMucGFja2V0cysrOworCQkJc2NoLT5ic3RhdHMuYnl0ZXMrPWxlbjsKKwkJCWlmICghY2wtPm5leHRfYWxpdmUpCisJCQkJY2JxX2FjdGl2YXRlX2NsYXNzKGNsKTsKKwkJCXJldHVybiAwOworCQl9CisJCXNjaC0+cXN0YXRzLmRyb3BzKys7CisJCXJldHVybiAwOworCX0KKworCXNjaC0+cXN0YXRzLmRyb3BzKys7CisJcmV0dXJuIC0xOworfQorI2VuZGlmCisKKy8qIAorICAgSXQgaXMgbWlzc2lvbiBjcml0aWNhbCBwcm9jZWR1cmUuCisKKyAgIFdlICJyZWdlbmVyYXRlIiB0b3BsZXZlbCBjdXRvZmYsIGlmIHRyYW5zbWl0dGluZyBjbGFzcworICAgaGFzIGJhY2tsb2cgYW5kIGl0IGlzIG5vdCByZWd1bGF0ZWQuIEl0IGlzIG5vdCBwYXJ0IG9mCisgICBvcmlnaW5hbCBDQlEgZGVzY3JpcHRpb24sIGJ1dCBsb29rcyBtb3JlIHJlYXNvbmFibGUuCisgICBQcm9iYWJseSwgaXQgaXMgd3JvbmcuIFRoaXMgcXVlc3Rpb24gbmVlZHMgZnVydGhlciBpbnZlc3RpZ2F0aW9uLgorKi8KKworc3RhdGljIF9faW5saW5lX18gdm9pZAorY2JxX3VwZGF0ZV90b3BsZXZlbChzdHJ1Y3QgY2JxX3NjaGVkX2RhdGEgKnEsIHN0cnVjdCBjYnFfY2xhc3MgKmNsLAorCQkgICAgc3RydWN0IGNicV9jbGFzcyAqYm9ycm93ZWQpCit7CisJaWYgKGNsICYmIHEtPnRvcGxldmVsID49IGJvcnJvd2VkLT5sZXZlbCkgeworCQlpZiAoY2wtPnEtPnEucWxlbiA+IDEpIHsKKwkJCWRvIHsKKwkJCQlpZiAoUFNDSEVEX0lTX1BBU1RQRVJGRUNUKGJvcnJvd2VkLT51bmRlcnRpbWUpKSB7CisJCQkJCXEtPnRvcGxldmVsID0gYm9ycm93ZWQtPmxldmVsOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfSB3aGlsZSAoKGJvcnJvd2VkPWJvcnJvd2VkLT5ib3Jyb3cpICE9IE5VTEwpOworCQl9CisjaWYgMAkKKwkvKiBJdCBpcyBub3QgbmVjZXNzYXJ5IG5vdy4gVW5jb21tZW50aW5nIGl0CisJICAgd2lsbCBzYXZlIENQVSBjeWNsZXMsIGJ1dCBkZWNyZWFzZSBmYWlybmVzcy4KKwkgKi8KKwkJcS0+dG9wbGV2ZWwgPSBUQ19DQlFfTUFYTEVWRUw7CisjZW5kaWYKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjYnFfdXBkYXRlKHN0cnVjdCBjYnFfc2NoZWRfZGF0YSAqcSkKK3sKKwlzdHJ1Y3QgY2JxX2NsYXNzICp0aGlzID0gcS0+dHhfY2xhc3M7CisJc3RydWN0IGNicV9jbGFzcyAqY2wgPSB0aGlzOworCWludCBsZW4gPSBxLT50eF9sZW47CisKKwlxLT50eF9jbGFzcyA9IE5VTEw7CisKKwlmb3IgKCA7IGNsOyBjbCA9IGNsLT5zaGFyZSkgeworCQlsb25nIGF2Z2lkbGUgPSBjbC0+YXZnaWRsZTsKKwkJbG9uZyBpZGxlOworCisJCWNsLT5ic3RhdHMucGFja2V0cysrOworCQljbC0+YnN0YXRzLmJ5dGVzICs9IGxlbjsKKworCQkvKgorCQkgICAobm93IC0gbGFzdCkgaXMgdG90YWwgdGltZSBiZXR3ZWVuIHBhY2tldCByaWdodCBlZGdlcy4KKwkJICAgKGxhc3RfcGt0bGVuL3JhdGUpIGlzICJ2aXJ0dWFsIiBidXN5IHRpbWUsIHNvIHRoYXQKKworCQkgICAgICAgICBpZGxlID0gKG5vdyAtIGxhc3QpIC0gbGFzdF9wa3RsZW4vcmF0ZQorCQkgKi8KKworCQlpZGxlID0gUFNDSEVEX1RESUZGKHEtPm5vdywgY2wtPmxhc3QpOworCQlpZiAoKHVuc2lnbmVkIGxvbmcpaWRsZSA+IDEyOCoxMDI0KjEwMjQpIHsKKwkJCWF2Z2lkbGUgPSBjbC0+bWF4aWRsZTsKKwkJfSBlbHNlIHsKKwkJCWlkbGUgLT0gTDJUKGNsLCBsZW4pOworCisJCS8qIHRydWVfYXZnaWRsZSA6PSAoMS1XKSp0cnVlX2F2Z2lkbGUgKyBXKmlkbGUsCisJCSAgIHdoZXJlIFc9Ml57LWV3bWFfbG9nfS4gQnV0IGNsLT5hdmdpZGxlIGlzIHNjYWxlZDoKKwkJICAgY2wtPmF2Z2lkbGUgPT0gdHJ1ZV9hdmdpZGxlL1csCisJCSAgIGhlbmNlOgorCQkgKi8KKwkJCWF2Z2lkbGUgKz0gaWRsZSAtIChhdmdpZGxlPj5jbC0+ZXdtYV9sb2cpOworCQl9CisKKwkJaWYgKGF2Z2lkbGUgPD0gMCkgeworCQkJLyogT3ZlcmxpbWl0IG9yIGF0LWxpbWl0ICovCisKKwkJCWlmIChhdmdpZGxlIDwgY2wtPm1pbmlkbGUpCisJCQkJYXZnaWRsZSA9IGNsLT5taW5pZGxlOworCisJCQljbC0+YXZnaWRsZSA9IGF2Z2lkbGU7CisKKwkJCS8qIENhbGN1bGF0ZSBleHBlY3RlZCB0aW1lLCB3aGVuIHRoaXMgY2xhc3MKKwkJCSAgIHdpbGwgYmUgYWxsb3dlZCB0byBzZW5kLgorCQkJICAgSXQgd2lsbCBvY2N1ciwgd2hlbjoKKwkJCSAgICgxLVcpKnRydWVfYXZnaWRsZSArIFcqZGVsYXkgPSAwLCBpLmUuCisJCQkgICBpZGxlID0gKDEvVyAtIDEpKigtdHJ1ZV9hdmdpZGxlKQorCQkJICAgb3IKKwkJCSAgIGlkbGUgPSAoMSAtIFcpKigtY2wtPmF2Z2lkbGUpOworCQkJICovCisJCQlpZGxlID0gKC1hdmdpZGxlKSAtICgoLWF2Z2lkbGUpID4+IGNsLT5ld21hX2xvZyk7CisKKwkJCS8qCisJCQkgICBUaGF0IGlzIG5vdCBhbGwuCisJCQkgICBUbyBtYWludGFpbiB0aGUgcmF0ZSBhbGxvY2F0ZWQgdG8gdGhlIGNsYXNzLAorCQkJICAgd2UgYWRkIHRvIHVuZGVydGltZSB2aXJ0dWFsIGNsb2NrLAorCQkJICAgbmVjZXNzYXJ5IHRvIGNvbXBsZXRlIHRyYW5zbWl0dGVkIHBhY2tldC4KKwkJCSAgIChsZW4vcGh5c19iYW5kd2lkdGggaGFzIGJlZW4gYWxyZWFkeSBwYXNzZWQKKwkJCSAgIHRvIHRoZSBtb21lbnQgb2YgY2JxX3VwZGF0ZSkKKwkJCSAqLworCisJCQlpZGxlIC09IEwyVCgmcS0+bGluaywgbGVuKTsKKwkJCWlkbGUgKz0gTDJUKGNsLCBsZW4pOworCisJCQlQU0NIRURfQVVESVRfVERJRkYoaWRsZSk7CisKKwkJCVBTQ0hFRF9UQUREMihxLT5ub3csIGlkbGUsIGNsLT51bmRlcnRpbWUpOworCQl9IGVsc2UgeworCQkJLyogVW5kZXJsaW1pdCAqLworCisJCQlQU0NIRURfU0VUX1BBU1RQRVJGRUNUKGNsLT51bmRlcnRpbWUpOworCQkJaWYgKGF2Z2lkbGUgPiBjbC0+bWF4aWRsZSkKKwkJCQljbC0+YXZnaWRsZSA9IGNsLT5tYXhpZGxlOworCQkJZWxzZQorCQkJCWNsLT5hdmdpZGxlID0gYXZnaWRsZTsKKwkJfQorCQljbC0+bGFzdCA9IHEtPm5vdzsKKwl9CisKKwljYnFfdXBkYXRlX3RvcGxldmVsKHEsIHRoaXMsIHEtPnR4X2JvcnJvd2VkKTsKK30KKworc3RhdGljIF9faW5saW5lX18gc3RydWN0IGNicV9jbGFzcyAqCitjYnFfdW5kZXJfbGltaXQoc3RydWN0IGNicV9jbGFzcyAqY2wpCit7CisJc3RydWN0IGNicV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihjbC0+cWRpc2MpOworCXN0cnVjdCBjYnFfY2xhc3MgKnRoaXNfY2wgPSBjbDsKKworCWlmIChjbC0+dHBhcmVudCA9PSBOVUxMKQorCQlyZXR1cm4gY2w7CisKKwlpZiAoUFNDSEVEX0lTX1BBU1RQRVJGRUNUKGNsLT51bmRlcnRpbWUpIHx8CisJICAgICFQU0NIRURfVExFU1MocS0+bm93LCBjbC0+dW5kZXJ0aW1lKSkgeworCQljbC0+ZGVsYXllZCA9IDA7CisJCXJldHVybiBjbDsKKwl9CisKKwlkbyB7CisJCS8qIEl0IGlzIHZlcnkgc3VzcGljaW91cyBwbGFjZS4gTm93IG92ZXJsaW1pdAorCQkgICBhY3Rpb24gaXMgZ2VuZXJhdGVkIGZvciBub3QgYm91bmRlZCBjbGFzc2VzCisJCSAgIG9ubHkgaWYgbGluayBpcyBjb21wbGV0ZWx5IGNvbmdlc3RlZC4KKwkJICAgVGhvdWdoIGl0IGlzIGluIGFncmVlIHdpdGggYW5jZXN0b3Itb25seSBwYXJhZGlnbSwKKwkJICAgaXQgbG9va3MgdmVyeSBzdHVwaWQuIFBhcnRpY3VsYXJseSwKKwkJICAgaXQgbWVhbnMgdGhhdCB0aGlzIGNodW5rIG9mIGNvZGUgd2lsbCBlaXRoZXIKKwkJICAgbmV2ZXIgYmUgY2FsbGVkIG9yIHJlc3VsdCBpbiBzdHJvbmcgYW1wbGlmaWNhdGlvbgorCQkgICBvZiBidXJzdGluZXNzLiBEYW5nZXJvdXMsIHNpbGx5LCBhbmQsIGhvd2V2ZXIsCisJCSAgIG5vIGFub3RoZXIgc29sdXRpb24gZXhpc3RzLgorCQkgKi8KKwkJaWYgKChjbCA9IGNsLT5ib3Jyb3cpID09IE5VTEwpIHsKKwkJCXRoaXNfY2wtPnFzdGF0cy5vdmVybGltaXRzKys7CisJCQl0aGlzX2NsLT5vdmVybGltaXQodGhpc19jbCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoY2wtPmxldmVsID4gcS0+dG9wbGV2ZWwpCisJCQlyZXR1cm4gTlVMTDsKKwl9IHdoaWxlICghUFNDSEVEX0lTX1BBU1RQRVJGRUNUKGNsLT51bmRlcnRpbWUpICYmCisJCSBQU0NIRURfVExFU1MocS0+bm93LCBjbC0+dW5kZXJ0aW1lKSk7CisKKwljbC0+ZGVsYXllZCA9IDA7CisJcmV0dXJuIGNsOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3Qgc2tfYnVmZiAqCitjYnFfZGVxdWV1ZV9wcmlvKHN0cnVjdCBRZGlzYyAqc2NoLCBpbnQgcHJpbykKK3sKKwlzdHJ1Y3QgY2JxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJc3RydWN0IGNicV9jbGFzcyAqY2xfdGFpbCwgKmNsX3ByZXYsICpjbDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBkZWZpY2l0OworCisJY2xfdGFpbCA9IGNsX3ByZXYgPSBxLT5hY3RpdmVbcHJpb107CisJY2wgPSBjbF9wcmV2LT5uZXh0X2FsaXZlOworCisJZG8geworCQlkZWZpY2l0ID0gMDsKKworCQkvKiBTdGFydCByb3VuZCAqLworCQlkbyB7CisJCQlzdHJ1Y3QgY2JxX2NsYXNzICpib3Jyb3cgPSBjbDsKKworCQkJaWYgKGNsLT5xLT5xLnFsZW4gJiYKKwkJCSAgICAoYm9ycm93ID0gY2JxX3VuZGVyX2xpbWl0KGNsKSkgPT0gTlVMTCkKKwkJCQlnb3RvIHNraXBfY2xhc3M7CisKKwkJCWlmIChjbC0+ZGVmaWNpdCA8PSAwKSB7CisJCQkJLyogQ2xhc3MgZXhoYXVzdGVkIGl0cyBhbGxvdG1lbnQgcGVyCisJCQkJICAgdGhpcyByb3VuZC4gU3dpdGNoIHRvIHRoZSBuZXh0IG9uZS4KKwkJCQkgKi8KKwkJCQlkZWZpY2l0ID0gMTsKKwkJCQljbC0+ZGVmaWNpdCArPSBjbC0+cXVhbnR1bTsKKwkJCQlnb3RvIG5leHRfY2xhc3M7CisJCQl9CisKKwkJCXNrYiA9IGNsLT5xLT5kZXF1ZXVlKGNsLT5xKTsKKworCQkJLyogQ2xhc3MgZGlkIG5vdCBnaXZlIHVzIGFueSBza2IgOi0oCisJCQkgICBJdCBjb3VsZCBvY2N1ciBldmVuIGlmIGNsLT5xLT5xLnFsZW4gIT0gMCAKKwkJCSAgIGYuZS4gaWYgY2wtPnEgPT0gInRiZiIKKwkJCSAqLworCQkJaWYgKHNrYiA9PSBOVUxMKQorCQkJCWdvdG8gc2tpcF9jbGFzczsKKworCQkJY2wtPmRlZmljaXQgLT0gc2tiLT5sZW47CisJCQlxLT50eF9jbGFzcyA9IGNsOworCQkJcS0+dHhfYm9ycm93ZWQgPSBib3Jyb3c7CisJCQlpZiAoYm9ycm93ICE9IGNsKSB7CisjaWZuZGVmIENCUV9YU1RBVFNfQk9SUk9XU19CWVRFUworCQkJCWJvcnJvdy0+eHN0YXRzLmJvcnJvd3MrKzsKKwkJCQljbC0+eHN0YXRzLmJvcnJvd3MrKzsKKyNlbHNlCisJCQkJYm9ycm93LT54c3RhdHMuYm9ycm93cyArPSBza2ItPmxlbjsKKwkJCQljbC0+eHN0YXRzLmJvcnJvd3MgKz0gc2tiLT5sZW47CisjZW5kaWYKKwkJCX0KKwkJCXEtPnR4X2xlbiA9IHNrYi0+bGVuOworCisJCQlpZiAoY2wtPmRlZmljaXQgPD0gMCkgeworCQkJCXEtPmFjdGl2ZVtwcmlvXSA9IGNsOworCQkJCWNsID0gY2wtPm5leHRfYWxpdmU7CisJCQkJY2wtPmRlZmljaXQgKz0gY2wtPnF1YW50dW07CisJCQl9CisJCQlyZXR1cm4gc2tiOworCitza2lwX2NsYXNzOgorCQkJaWYgKGNsLT5xLT5xLnFsZW4gPT0gMCB8fCBwcmlvICE9IGNsLT5jcHJpb3JpdHkpIHsKKwkJCQkvKiBDbGFzcyBpcyBlbXB0eSBvciBwZW5hbGl6ZWQuCisJCQkJICAgVW5saW5rIGl0IGZyb20gYWN0aXZlIGNoYWluLgorCQkJCSAqLworCQkJCWNsX3ByZXYtPm5leHRfYWxpdmUgPSBjbC0+bmV4dF9hbGl2ZTsKKwkJCQljbC0+bmV4dF9hbGl2ZSA9IE5VTEw7CisKKwkJCQkvKiBEaWQgY2xfdGFpbCBwb2ludCB0byBpdD8gKi8KKwkJCQlpZiAoY2wgPT0gY2xfdGFpbCkgeworCQkJCQkvKiBSZXBhaXIgaXQhICovCisJCQkJCWNsX3RhaWwgPSBjbF9wcmV2OworCisJCQkJCS8qIFdhcyBpdCB0aGUgbGFzdCBjbGFzcyBpbiB0aGlzIGJhbmQ/ICovCisJCQkJCWlmIChjbCA9PSBjbF90YWlsKSB7CisJCQkJCQkvKiBLaWxsIHRoZSBiYW5kISAqLworCQkJCQkJcS0+YWN0aXZlW3ByaW9dID0gTlVMTDsKKwkJCQkJCXEtPmFjdGl2ZW1hc2sgJj0gfigxPDxwcmlvKTsKKwkJCQkJCWlmIChjbC0+cS0+cS5xbGVuKQorCQkJCQkJCWNicV9hY3RpdmF0ZV9jbGFzcyhjbCk7CisJCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQkJfQorCisJCQkJCXEtPmFjdGl2ZVtwcmlvXSA9IGNsX3RhaWw7CisJCQkJfQorCQkJCWlmIChjbC0+cS0+cS5xbGVuKQorCQkJCQljYnFfYWN0aXZhdGVfY2xhc3MoY2wpOworCisJCQkJY2wgPSBjbF9wcmV2OworCQkJfQorCituZXh0X2NsYXNzOgorCQkJY2xfcHJldiA9IGNsOworCQkJY2wgPSBjbC0+bmV4dF9hbGl2ZTsKKwkJfSB3aGlsZSAoY2xfcHJldiAhPSBjbF90YWlsKTsKKwl9IHdoaWxlIChkZWZpY2l0KTsKKworCXEtPmFjdGl2ZVtwcmlvXSA9IGNsX3ByZXY7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIF9faW5saW5lX18gc3RydWN0IHNrX2J1ZmYgKgorY2JxX2RlcXVldWVfMShzdHJ1Y3QgUWRpc2MgKnNjaCkKK3sKKwlzdHJ1Y3QgY2JxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBhY3RpdmVtYXNrOworCisJYWN0aXZlbWFzayA9IHEtPmFjdGl2ZW1hc2smMHhGRjsKKwl3aGlsZSAoYWN0aXZlbWFzaykgeworCQlpbnQgcHJpbyA9IGZmeih+YWN0aXZlbWFzayk7CisJCWFjdGl2ZW1hc2sgJj0gfigxPDxwcmlvKTsKKwkJc2tiID0gY2JxX2RlcXVldWVfcHJpbyhzY2gsIHByaW8pOworCQlpZiAoc2tiKQorCQkJcmV0dXJuIHNrYjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCitjYnFfZGVxdWV1ZShzdHJ1Y3QgUWRpc2MgKnNjaCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBjYnFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlwc2NoZWRfdGltZV90IG5vdzsKKwlwc2NoZWRfdGRpZmZfdCBpbmNyOworCisJUFNDSEVEX0dFVF9USU1FKG5vdyk7CisJaW5jciA9IFBTQ0hFRF9URElGRihub3csIHEtPm5vd19ydCk7CisKKwlpZiAocS0+dHhfY2xhc3MpIHsKKwkJcHNjaGVkX3RkaWZmX3QgaW5jcjI7CisJCS8qIFRpbWUgaW50ZWdyYXRvci4gV2UgY2FsY3VsYXRlIEVPUyB0aW1lCisJCSAgIGJ5IGFkZGluZyBleHBlY3RlZCBwYWNrZXQgdHJhbnNtaXNzaW9uIHRpbWUuCisJCSAgIElmIHJlYWwgdGltZSBpcyBncmVhdGVyLCB3ZSB3YXJwIGFydGlmaWNpYWwgY2xvY2ssCisJCSAgIHNvIHRoYXQ6CisKKwkJICAgY2JxX3RpbWUgPSBtYXgocmVhbF90aW1lLCB3b3JrKTsKKwkJICovCisJCWluY3IyID0gTDJUKCZxLT5saW5rLCBxLT50eF9sZW4pOworCQlQU0NIRURfVEFERChxLT5ub3csIGluY3IyKTsKKwkJY2JxX3VwZGF0ZShxKTsKKwkJaWYgKChpbmNyIC09IGluY3IyKSA8IDApCisJCQlpbmNyID0gMDsKKwl9CisJUFNDSEVEX1RBREQocS0+bm93LCBpbmNyKTsKKwlxLT5ub3dfcnQgPSBub3c7CisKKwlmb3IgKDs7KSB7CisJCXEtPndkX2V4cGlyZXMgPSAwOworCisJCXNrYiA9IGNicV9kZXF1ZXVlXzEoc2NoKTsKKwkJaWYgKHNrYikgeworCQkJc2NoLT5xLnFsZW4tLTsKKwkJCXNjaC0+ZmxhZ3MgJj0gflRDUV9GX1RIUk9UVExFRDsKKwkJCXJldHVybiBza2I7CisJCX0KKworCQkvKiBBbGwgdGhlIGNsYXNzZXMgYXJlIG92ZXJsaW1pdC4KKworCQkgICBJdCBpcyBwb3NzaWJsZSwgaWY6CisKKwkJICAgMS4gU2NoZWR1bGVyIGlzIGVtcHR5LgorCQkgICAyLiBUb3BsZXZlbCBjdXRvZmYgaW5oaWJpdGVkIGJvcnJvd2luZy4KKwkJICAgMy4gUm9vdCBjbGFzcyBpcyBvdmVybGltaXQuCisKKwkJICAgUmVzZXQgMmQgYW5kIDNkIGNvbmRpdGlvbnMgYW5kIHJldHJ5LgorCisJCSAgIE5vdGUsIHRoYXQgTlMgYW5kIGNicS0yLjAgYXJlIGJ1Z2d5LCBwZWVraW5nCisJCSAgIGFuIGFyYml0cmFyeSBjbGFzcyBpcyBhcHByb3ByaWF0ZSBmb3IgYW5jZXN0b3Itb25seQorCQkgICBzaGFyaW5nLCBidXQgbm90IGZvciB0b3BsZXZlbCBhbGdvcml0aG0uCisKKwkJICAgT3VyIHZlcnNpb24gaXMgYmV0dGVyLCBidXQgc2xvd2VyLCBiZWNhdXNlIGl0IHJlcXVpcmVzCisJCSAgIHR3byBwYXNzZXMsIGJ1dCBpdCBpcyB1bmF2b2lkYWJsZSB3aXRoIHRvcC1sZXZlbCBzaGFyaW5nLgorCQkqLworCisJCWlmIChxLT50b3BsZXZlbCA9PSBUQ19DQlFfTUFYTEVWRUwgJiYKKwkJICAgIFBTQ0hFRF9JU19QQVNUUEVSRkVDVChxLT5saW5rLnVuZGVydGltZSkpCisJCQlicmVhazsKKworCQlxLT50b3BsZXZlbCA9IFRDX0NCUV9NQVhMRVZFTDsKKwkJUFNDSEVEX1NFVF9QQVNUUEVSRkVDVChxLT5saW5rLnVuZGVydGltZSk7CisJfQorCisJLyogTm8gcGFja2V0cyBpbiBzY2hlZHVsZXIgb3Igbm9ib2R5IHdhbnRzIHRvIGdpdmUgdGhlbSB0byB1cyA6LSgKKwkgICBTaWdoLi4uIHN0YXJ0IHdhdGNoZG9nIHRpbWVyIGluIHRoZSBsYXN0IGNhc2UuICovCisKKwlpZiAoc2NoLT5xLnFsZW4pIHsKKwkJc2NoLT5xc3RhdHMub3ZlcmxpbWl0cysrOworCQlpZiAocS0+d2RfZXhwaXJlcykgeworCQkJbG9uZyBkZWxheSA9IFBTQ0hFRF9VUzJKSUZGSUUocS0+d2RfZXhwaXJlcyk7CisJCQlpZiAoZGVsYXkgPD0gMCkKKwkJCQlkZWxheSA9IDE7CisJCQltb2RfdGltZXIoJnEtPndkX3RpbWVyLCBqaWZmaWVzICsgZGVsYXkpOworCQkJc2NoLT5mbGFncyB8PSBUQ1FfRl9USFJPVFRMRUQ7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIENCUSBjbGFzcyBtYWludGFuYW5jZSByb3V0aW5lcyAqLworCitzdGF0aWMgdm9pZCBjYnFfYWRqdXN0X2xldmVscyhzdHJ1Y3QgY2JxX2NsYXNzICp0aGlzKQoreworCWlmICh0aGlzID09IE5VTEwpCisJCXJldHVybjsKKworCWRvIHsKKwkJaW50IGxldmVsID0gMDsKKwkJc3RydWN0IGNicV9jbGFzcyAqY2w7CisKKwkJaWYgKChjbCA9IHRoaXMtPmNoaWxkcmVuKSAhPSBOVUxMKSB7CisJCQlkbyB7CisJCQkJaWYgKGNsLT5sZXZlbCA+IGxldmVsKQorCQkJCQlsZXZlbCA9IGNsLT5sZXZlbDsKKwkJCX0gd2hpbGUgKChjbCA9IGNsLT5zaWJsaW5nKSAhPSB0aGlzLT5jaGlsZHJlbik7CisJCX0KKwkJdGhpcy0+bGV2ZWwgPSBsZXZlbCsxOworCX0gd2hpbGUgKCh0aGlzID0gdGhpcy0+dHBhcmVudCkgIT0gTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGNicV9ub3JtYWxpemVfcXVhbnRhKHN0cnVjdCBjYnFfc2NoZWRfZGF0YSAqcSwgaW50IHByaW8pCit7CisJc3RydWN0IGNicV9jbGFzcyAqY2w7CisJdW5zaWduZWQgaDsKKworCWlmIChxLT5xdWFudGFbcHJpb10gPT0gMCkKKwkJcmV0dXJuOworCisJZm9yIChoPTA7IGg8MTY7IGgrKykgeworCQlmb3IgKGNsID0gcS0+Y2xhc3Nlc1toXTsgY2w7IGNsID0gY2wtPm5leHQpIHsKKwkJCS8qIEJVR0dHRy4uLiBCZXdhcmUhIFRoaXMgZXhwcmVzc2lvbiBzdWZmZXIgb2YKKwkJCSAgIGFyaXRobWV0aWMgb3ZlcmZsb3dzIQorCQkJICovCisJCQlpZiAoY2wtPnByaW9yaXR5ID09IHByaW8pIHsKKwkJCQljbC0+cXVhbnR1bSA9IChjbC0+d2VpZ2h0KmNsLT5hbGxvdCpxLT5uY2xhc3Nlc1twcmlvXSkvCisJCQkJCXEtPnF1YW50YVtwcmlvXTsKKwkJCX0KKwkJCWlmIChjbC0+cXVhbnR1bSA8PSAwIHx8IGNsLT5xdWFudHVtPjMyKmNsLT5xZGlzYy0+ZGV2LT5tdHUpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDQlE6IGNsYXNzICUwOHggaGFzIGJhZCBxdWFudHVtPT0lbGQsIHJlcGFpcmVkLlxuIiwgY2wtPmNsYXNzaWQsIGNsLT5xdWFudHVtKTsKKwkJCQljbC0+cXVhbnR1bSA9IGNsLT5xZGlzYy0+ZGV2LT5tdHUvMiArIDE7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNicV9zeW5jX2RlZm1hcChzdHJ1Y3QgY2JxX2NsYXNzICpjbCkKK3sKKwlzdHJ1Y3QgY2JxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KGNsLT5xZGlzYyk7CisJc3RydWN0IGNicV9jbGFzcyAqc3BsaXQgPSBjbC0+c3BsaXQ7CisJdW5zaWduZWQgaDsKKwlpbnQgaTsKKworCWlmIChzcGxpdCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlmb3IgKGk9MDsgaTw9VENfUFJJT19NQVg7IGkrKykgeworCQlpZiAoc3BsaXQtPmRlZmF1bHRzW2ldID09IGNsICYmICEoY2wtPmRlZm1hcCYoMTw8aSkpKQorCQkJc3BsaXQtPmRlZmF1bHRzW2ldID0gTlVMTDsKKwl9CisKKwlmb3IgKGk9MDsgaTw9VENfUFJJT19NQVg7IGkrKykgeworCQlpbnQgbGV2ZWwgPSBzcGxpdC0+bGV2ZWw7CisKKwkJaWYgKHNwbGl0LT5kZWZhdWx0c1tpXSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoaD0wOyBoPDE2OyBoKyspIHsKKwkJCXN0cnVjdCBjYnFfY2xhc3MgKmM7CisKKwkJCWZvciAoYyA9IHEtPmNsYXNzZXNbaF07IGM7IGMgPSBjLT5uZXh0KSB7CisJCQkJaWYgKGMtPnNwbGl0ID09IHNwbGl0ICYmIGMtPmxldmVsIDwgbGV2ZWwgJiYKKwkJCQkgICAgYy0+ZGVmbWFwJigxPDxpKSkgeworCQkJCQlzcGxpdC0+ZGVmYXVsdHNbaV0gPSBjOworCQkJCQlsZXZlbCA9IGMtPmxldmVsOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgY2JxX2NoYW5nZV9kZWZtYXAoc3RydWN0IGNicV9jbGFzcyAqY2wsIHUzMiBzcGxpdGlkLCB1MzIgZGVmLCB1MzIgbWFzaykKK3sKKwlzdHJ1Y3QgY2JxX2NsYXNzICpzcGxpdCA9IE5VTEw7CisKKwlpZiAoc3BsaXRpZCA9PSAwKSB7CisJCWlmICgoc3BsaXQgPSBjbC0+c3BsaXQpID09IE5VTEwpCisJCQlyZXR1cm47CisJCXNwbGl0aWQgPSBzcGxpdC0+Y2xhc3NpZDsKKwl9CisKKwlpZiAoc3BsaXQgPT0gTlVMTCB8fCBzcGxpdC0+Y2xhc3NpZCAhPSBzcGxpdGlkKSB7CisJCWZvciAoc3BsaXQgPSBjbC0+dHBhcmVudDsgc3BsaXQ7IHNwbGl0ID0gc3BsaXQtPnRwYXJlbnQpCisJCQlpZiAoc3BsaXQtPmNsYXNzaWQgPT0gc3BsaXRpZCkKKwkJCQlicmVhazsKKwl9CisKKwlpZiAoc3BsaXQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGNsLT5zcGxpdCAhPSBzcGxpdCkgeworCQljbC0+ZGVmbWFwID0gMDsKKwkJY2JxX3N5bmNfZGVmbWFwKGNsKTsKKwkJY2wtPnNwbGl0ID0gc3BsaXQ7CisJCWNsLT5kZWZtYXAgPSBkZWYmbWFzazsKKwl9IGVsc2UKKwkJY2wtPmRlZm1hcCA9IChjbC0+ZGVmbWFwJn5tYXNrKXwoZGVmJm1hc2spOworCisJY2JxX3N5bmNfZGVmbWFwKGNsKTsKK30KKworc3RhdGljIHZvaWQgY2JxX3VubGlua19jbGFzcyhzdHJ1Y3QgY2JxX2NsYXNzICp0aGlzKQoreworCXN0cnVjdCBjYnFfY2xhc3MgKmNsLCAqKmNscDsKKwlzdHJ1Y3QgY2JxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHRoaXMtPnFkaXNjKTsKKworCWZvciAoY2xwID0gJnEtPmNsYXNzZXNbY2JxX2hhc2godGhpcy0+Y2xhc3NpZCldOyAoY2wgPSAqY2xwKSAhPSBOVUxMOyBjbHAgPSAmY2wtPm5leHQpIHsKKwkJaWYgKGNsID09IHRoaXMpIHsKKwkJCSpjbHAgPSBjbC0+bmV4dDsKKwkJCWNsLT5uZXh0ID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHRoaXMtPnRwYXJlbnQpIHsKKwkJY2xwPSZ0aGlzLT5zaWJsaW5nOworCQljbCA9ICpjbHA7CisJCWRvIHsKKwkJCWlmIChjbCA9PSB0aGlzKSB7CisJCQkJKmNscCA9IGNsLT5zaWJsaW5nOworCQkJCWJyZWFrOworCQkJfQorCQkJY2xwID0gJmNsLT5zaWJsaW5nOworCQl9IHdoaWxlICgoY2wgPSAqY2xwKSAhPSB0aGlzLT5zaWJsaW5nKTsKKworCQlpZiAodGhpcy0+dHBhcmVudC0+Y2hpbGRyZW4gPT0gdGhpcykgeworCQkJdGhpcy0+dHBhcmVudC0+Y2hpbGRyZW4gPSB0aGlzLT5zaWJsaW5nOworCQkJaWYgKHRoaXMtPnNpYmxpbmcgPT0gdGhpcykKKwkJCQl0aGlzLT50cGFyZW50LT5jaGlsZHJlbiA9IE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQlCVUdfVFJBUCh0aGlzLT5zaWJsaW5nID09IHRoaXMpOworCX0KK30KKworc3RhdGljIHZvaWQgY2JxX2xpbmtfY2xhc3Moc3RydWN0IGNicV9jbGFzcyAqdGhpcykKK3sKKwlzdHJ1Y3QgY2JxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHRoaXMtPnFkaXNjKTsKKwl1bnNpZ25lZCBoID0gY2JxX2hhc2godGhpcy0+Y2xhc3NpZCk7CisJc3RydWN0IGNicV9jbGFzcyAqcGFyZW50ID0gdGhpcy0+dHBhcmVudDsKKworCXRoaXMtPnNpYmxpbmcgPSB0aGlzOworCXRoaXMtPm5leHQgPSBxLT5jbGFzc2VzW2hdOworCXEtPmNsYXNzZXNbaF0gPSB0aGlzOworCisJaWYgKHBhcmVudCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAocGFyZW50LT5jaGlsZHJlbiA9PSBOVUxMKSB7CisJCXBhcmVudC0+Y2hpbGRyZW4gPSB0aGlzOworCX0gZWxzZSB7CisJCXRoaXMtPnNpYmxpbmcgPSBwYXJlbnQtPmNoaWxkcmVuLT5zaWJsaW5nOworCQlwYXJlbnQtPmNoaWxkcmVuLT5zaWJsaW5nID0gdGhpczsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2JxX2Ryb3Aoc3RydWN0IFFkaXNjKiBzY2gpCit7CisJc3RydWN0IGNicV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCBjYnFfY2xhc3MgKmNsLCAqY2xfaGVhZDsKKwlpbnQgcHJpbzsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJZm9yIChwcmlvID0gVENfQ0JRX01BWFBSSU87IHByaW8gPj0gMDsgcHJpby0tKSB7CisJCWlmICgoY2xfaGVhZCA9IHEtPmFjdGl2ZVtwcmlvXSkgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCWNsID0gY2xfaGVhZDsKKwkJZG8geworCQkJaWYgKGNsLT5xLT5vcHMtPmRyb3AgJiYgKGxlbiA9IGNsLT5xLT5vcHMtPmRyb3AoY2wtPnEpKSkgeworCQkJCXNjaC0+cS5xbGVuLS07CisJCQkJcmV0dXJuIGxlbjsKKwkJCX0KKwkJfSB3aGlsZSAoKGNsID0gY2wtPm5leHRfYWxpdmUpICE9IGNsX2hlYWQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2NicV9yZXNldChzdHJ1Y3QgUWRpc2MqIHNjaCkKK3sKKwlzdHJ1Y3QgY2JxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJc3RydWN0IGNicV9jbGFzcyAqY2w7CisJaW50IHByaW87CisJdW5zaWduZWQgaDsKKworCXEtPmFjdGl2ZW1hc2sgPSAwOworCXEtPnBtYXNrID0gMDsKKwlxLT50eF9jbGFzcyA9IE5VTEw7CisJcS0+dHhfYm9ycm93ZWQgPSBOVUxMOworCWRlbF90aW1lcigmcS0+d2RfdGltZXIpOworCWRlbF90aW1lcigmcS0+ZGVsYXlfdGltZXIpOworCXEtPnRvcGxldmVsID0gVENfQ0JRX01BWExFVkVMOworCVBTQ0hFRF9HRVRfVElNRShxLT5ub3cpOworCXEtPm5vd19ydCA9IHEtPm5vdzsKKworCWZvciAocHJpbyA9IDA7IHByaW8gPD0gVENfQ0JRX01BWFBSSU87IHByaW8rKykKKwkJcS0+YWN0aXZlW3ByaW9dID0gTlVMTDsKKworCWZvciAoaCA9IDA7IGggPCAxNjsgaCsrKSB7CisJCWZvciAoY2wgPSBxLT5jbGFzc2VzW2hdOyBjbDsgY2wgPSBjbC0+bmV4dCkgeworCQkJcWRpc2NfcmVzZXQoY2wtPnEpOworCisJCQljbC0+bmV4dF9hbGl2ZSA9IE5VTEw7CisJCQlQU0NIRURfU0VUX1BBU1RQRVJGRUNUKGNsLT51bmRlcnRpbWUpOworCQkJY2wtPmF2Z2lkbGUgPSBjbC0+bWF4aWRsZTsKKwkJCWNsLT5kZWZpY2l0ID0gY2wtPnF1YW50dW07CisJCQljbC0+Y3ByaW9yaXR5ID0gY2wtPnByaW9yaXR5OworCQl9CisJfQorCXNjaC0+cS5xbGVuID0gMDsKK30KKworCitzdGF0aWMgaW50IGNicV9zZXRfbHNzKHN0cnVjdCBjYnFfY2xhc3MgKmNsLCBzdHJ1Y3QgdGNfY2JxX2xzc29wdCAqbHNzKQoreworCWlmIChsc3MtPmNoYW5nZSZUQ0ZfQ0JRX0xTU19GTEFHUykgeworCQljbC0+c2hhcmUgPSAobHNzLT5mbGFncyZUQ0ZfQ0JRX0xTU19JU09MQVRFRCkgPyBOVUxMIDogY2wtPnRwYXJlbnQ7CisJCWNsLT5ib3Jyb3cgPSAobHNzLT5mbGFncyZUQ0ZfQ0JRX0xTU19CT1VOREVEKSA/IE5VTEwgOiBjbC0+dHBhcmVudDsKKwl9CisJaWYgKGxzcy0+Y2hhbmdlJlRDRl9DQlFfTFNTX0VXTUEpCisJCWNsLT5ld21hX2xvZyA9IGxzcy0+ZXdtYV9sb2c7CisJaWYgKGxzcy0+Y2hhbmdlJlRDRl9DQlFfTFNTX0FWUEtUKQorCQljbC0+YXZwa3QgPSBsc3MtPmF2cGt0OworCWlmIChsc3MtPmNoYW5nZSZUQ0ZfQ0JRX0xTU19NSU5JRExFKQorCQljbC0+bWluaWRsZSA9IC0obG9uZylsc3MtPm1pbmlkbGU7CisJaWYgKGxzcy0+Y2hhbmdlJlRDRl9DQlFfTFNTX01BWElETEUpIHsKKwkJY2wtPm1heGlkbGUgPSBsc3MtPm1heGlkbGU7CisJCWNsLT5hdmdpZGxlID0gbHNzLT5tYXhpZGxlOworCX0KKwlpZiAobHNzLT5jaGFuZ2UmVENGX0NCUV9MU1NfT0ZGVElNRSkKKwkJY2wtPm9mZnRpbWUgPSBsc3MtPm9mZnRpbWU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNicV9ybXByaW8oc3RydWN0IGNicV9zY2hlZF9kYXRhICpxLCBzdHJ1Y3QgY2JxX2NsYXNzICpjbCkKK3sKKwlxLT5uY2xhc3Nlc1tjbC0+cHJpb3JpdHldLS07CisJcS0+cXVhbnRhW2NsLT5wcmlvcml0eV0gLT0gY2wtPndlaWdodDsKKwljYnFfbm9ybWFsaXplX3F1YW50YShxLCBjbC0+cHJpb3JpdHkpOworfQorCitzdGF0aWMgdm9pZCBjYnFfYWRkcHJpbyhzdHJ1Y3QgY2JxX3NjaGVkX2RhdGEgKnEsIHN0cnVjdCBjYnFfY2xhc3MgKmNsKQoreworCXEtPm5jbGFzc2VzW2NsLT5wcmlvcml0eV0rKzsKKwlxLT5xdWFudGFbY2wtPnByaW9yaXR5XSArPSBjbC0+d2VpZ2h0OworCWNicV9ub3JtYWxpemVfcXVhbnRhKHEsIGNsLT5wcmlvcml0eSk7Cit9CisKK3N0YXRpYyBpbnQgY2JxX3NldF93cnIoc3RydWN0IGNicV9jbGFzcyAqY2wsIHN0cnVjdCB0Y19jYnFfd3Jyb3B0ICp3cnIpCit7CisJc3RydWN0IGNicV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihjbC0+cWRpc2MpOworCisJaWYgKHdyci0+YWxsb3QpCisJCWNsLT5hbGxvdCA9IHdyci0+YWxsb3Q7CisJaWYgKHdyci0+d2VpZ2h0KQorCQljbC0+d2VpZ2h0ID0gd3JyLT53ZWlnaHQ7CisJaWYgKHdyci0+cHJpb3JpdHkpIHsKKwkJY2wtPnByaW9yaXR5ID0gd3JyLT5wcmlvcml0eS0xOworCQljbC0+Y3ByaW9yaXR5ID0gY2wtPnByaW9yaXR5OworCQlpZiAoY2wtPnByaW9yaXR5ID49IGNsLT5wcmlvcml0eTIpCisJCQljbC0+cHJpb3JpdHkyID0gVENfQ0JRX01BWFBSSU8tMTsKKwl9CisKKwljYnFfYWRkcHJpbyhxLCBjbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2JxX3NldF9vdmVybGltaXQoc3RydWN0IGNicV9jbGFzcyAqY2wsIHN0cnVjdCB0Y19jYnFfb3ZsICpvdmwpCit7CisJc3dpdGNoIChvdmwtPnN0cmF0ZWd5KSB7CisJY2FzZSBUQ19DQlFfT1ZMX0NMQVNTSUM6CisJCWNsLT5vdmVybGltaXQgPSBjYnFfb3ZsX2NsYXNzaWM7CisJCWJyZWFrOworCWNhc2UgVENfQ0JRX09WTF9ERUxBWToKKwkJY2wtPm92ZXJsaW1pdCA9IGNicV9vdmxfZGVsYXk7CisJCWJyZWFrOworCWNhc2UgVENfQ0JRX09WTF9MT1dQUklPOgorCQlpZiAob3ZsLT5wcmlvcml0eTItMSA+PSBUQ19DQlFfTUFYUFJJTyB8fAorCQkgICAgb3ZsLT5wcmlvcml0eTItMSA8PSBjbC0+cHJpb3JpdHkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY2wtPnByaW9yaXR5MiA9IG92bC0+cHJpb3JpdHkyLTE7CisJCWNsLT5vdmVybGltaXQgPSBjYnFfb3ZsX2xvd3ByaW87CisJCWJyZWFrOworCWNhc2UgVENfQ0JRX09WTF9EUk9QOgorCQljbC0+b3ZlcmxpbWl0ID0gY2JxX292bF9kcm9wOworCQlicmVhazsKKwljYXNlIFRDX0NCUV9PVkxfUkNMQVNTSUM6CisJCWNsLT5vdmVybGltaXQgPSBjYnFfb3ZsX3JjbGFzc2ljOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJY2wtPnBlbmFsdHkgPSAob3ZsLT5wZW5hbHR5KkhaKS8xMDAwOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX05FVF9DTFNfUE9MSUNFCitzdGF0aWMgaW50IGNicV9zZXRfcG9saWNlKHN0cnVjdCBjYnFfY2xhc3MgKmNsLCBzdHJ1Y3QgdGNfY2JxX3BvbGljZSAqcCkKK3sKKwljbC0+cG9saWNlID0gcC0+cG9saWNlOworCisJaWYgKGNsLT5xLT5oYW5kbGUpIHsKKwkJaWYgKHAtPnBvbGljZSA9PSBUQ19QT0xJQ0VfUkVDTEFTU0lGWSkKKwkJCWNsLT5xLT5yZXNoYXBlX2ZhaWwgPSBjYnFfcmVzaGFwZV9mYWlsOworCQllbHNlCisJCQljbC0+cS0+cmVzaGFwZV9mYWlsID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBjYnFfc2V0X2ZvcHQoc3RydWN0IGNicV9jbGFzcyAqY2wsIHN0cnVjdCB0Y19jYnFfZm9wdCAqZm9wdCkKK3sKKwljYnFfY2hhbmdlX2RlZm1hcChjbCwgZm9wdC0+c3BsaXQsIGZvcHQtPmRlZm1hcCwgZm9wdC0+ZGVmY2hhbmdlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYnFfaW5pdChzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IHJ0YXR0ciAqb3B0KQoreworCXN0cnVjdCBjYnFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfQ0JRX01BWF07CisJc3RydWN0IHRjX3JhdGVzcGVjICpyOworCisJaWYgKHJ0YXR0cl9wYXJzZV9uZXN0ZWQodGIsIFRDQV9DQlFfTUFYLCBvcHQpIDwgMCB8fAorCSAgICB0YltUQ0FfQ0JRX1JUQUItMV0gPT0gTlVMTCB8fCB0YltUQ0FfQ0JRX1JBVEUtMV0gPT0gTlVMTCB8fAorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfQ0JRX1JBVEUtMV0pIDwgc2l6ZW9mKHN0cnVjdCB0Y19yYXRlc3BlYykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRiW1RDQV9DQlFfTFNTT1BULTFdICYmCisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9DQlFfTFNTT1BULTFdKSA8IHNpemVvZihzdHJ1Y3QgdGNfY2JxX2xzc29wdCkpCisJCXJldHVybiAtRUlOVkFMOworCisJciA9IFJUQV9EQVRBKHRiW1RDQV9DQlFfUkFURS0xXSk7CisKKwlpZiAoKHEtPmxpbmsuUl90YWIgPSBxZGlzY19nZXRfcnRhYihyLCB0YltUQ0FfQ0JRX1JUQUItMV0pKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXEtPmxpbmsucmVmY250ID0gMTsKKwlxLT5saW5rLnNpYmxpbmcgPSAmcS0+bGluazsKKwlxLT5saW5rLmNsYXNzaWQgPSBzY2gtPmhhbmRsZTsKKwlxLT5saW5rLnFkaXNjID0gc2NoOworCWlmICghKHEtPmxpbmsucSA9IHFkaXNjX2NyZWF0ZV9kZmx0KHNjaC0+ZGV2LCAmcGZpZm9fcWRpc2Nfb3BzKSkpCisJCXEtPmxpbmsucSA9ICZub29wX3FkaXNjOworCisJcS0+bGluay5wcmlvcml0eSA9IFRDX0NCUV9NQVhQUklPLTE7CisJcS0+bGluay5wcmlvcml0eTIgPSBUQ19DQlFfTUFYUFJJTy0xOworCXEtPmxpbmsuY3ByaW9yaXR5ID0gVENfQ0JRX01BWFBSSU8tMTsKKwlxLT5saW5rLm92bF9zdHJhdGVneSA9IFRDX0NCUV9PVkxfQ0xBU1NJQzsKKwlxLT5saW5rLm92ZXJsaW1pdCA9IGNicV9vdmxfY2xhc3NpYzsKKwlxLT5saW5rLmFsbG90ID0gcHNjaGVkX210dShzY2gtPmRldik7CisJcS0+bGluay5xdWFudHVtID0gcS0+bGluay5hbGxvdDsKKwlxLT5saW5rLndlaWdodCA9IHEtPmxpbmsuUl90YWItPnJhdGUucmF0ZTsKKworCXEtPmxpbmsuZXdtYV9sb2cgPSBUQ19DQlFfREVGX0VXTUE7CisJcS0+bGluay5hdnBrdCA9IHEtPmxpbmsuYWxsb3QvMjsKKwlxLT5saW5rLm1pbmlkbGUgPSAtMHg3RkZGRkZGRjsKKwlxLT5saW5rLnN0YXRzX2xvY2sgPSAmc2NoLT5kZXYtPnF1ZXVlX2xvY2s7CisKKwlpbml0X3RpbWVyKCZxLT53ZF90aW1lcik7CisJcS0+d2RfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXNjaDsKKwlxLT53ZF90aW1lci5mdW5jdGlvbiA9IGNicV93YXRjaGRvZzsKKwlpbml0X3RpbWVyKCZxLT5kZWxheV90aW1lcik7CisJcS0+ZGVsYXlfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXNjaDsKKwlxLT5kZWxheV90aW1lci5mdW5jdGlvbiA9IGNicV91bmRlbGF5OworCXEtPnRvcGxldmVsID0gVENfQ0JRX01BWExFVkVMOworCVBTQ0hFRF9HRVRfVElNRShxLT5ub3cpOworCXEtPm5vd19ydCA9IHEtPm5vdzsKKworCWNicV9saW5rX2NsYXNzKCZxLT5saW5rKTsKKworCWlmICh0YltUQ0FfQ0JRX0xTU09QVC0xXSkKKwkJY2JxX3NldF9sc3MoJnEtPmxpbmssIFJUQV9EQVRBKHRiW1RDQV9DQlFfTFNTT1BULTFdKSk7CisKKwljYnFfYWRkcHJpbyhxLCAmcS0+bGluayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBjYnFfZHVtcF9yYXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjYnFfY2xhc3MgKmNsKQoreworCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCisJUlRBX1BVVChza2IsIFRDQV9DQlFfUkFURSwgc2l6ZW9mKGNsLT5SX3RhYi0+cmF0ZSksICZjbC0+Ul90YWItPnJhdGUpOworCXJldHVybiBza2ItPmxlbjsKKworcnRhdHRyX2ZhaWx1cmU6CisJc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBjYnFfZHVtcF9sc3Moc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNicV9jbGFzcyAqY2wpCit7CisJdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJc3RydWN0IHRjX2NicV9sc3NvcHQgb3B0OworCisJb3B0LmZsYWdzID0gMDsKKwlpZiAoY2wtPmJvcnJvdyA9PSBOVUxMKQorCQlvcHQuZmxhZ3MgfD0gVENGX0NCUV9MU1NfQk9VTkRFRDsKKwlpZiAoY2wtPnNoYXJlID09IE5VTEwpCisJCW9wdC5mbGFncyB8PSBUQ0ZfQ0JRX0xTU19JU09MQVRFRDsKKwlvcHQuZXdtYV9sb2cgPSBjbC0+ZXdtYV9sb2c7CisJb3B0LmxldmVsID0gY2wtPmxldmVsOworCW9wdC5hdnBrdCA9IGNsLT5hdnBrdDsKKwlvcHQubWF4aWRsZSA9IGNsLT5tYXhpZGxlOworCW9wdC5taW5pZGxlID0gKHUzMikoLWNsLT5taW5pZGxlKTsKKwlvcHQub2ZmdGltZSA9IGNsLT5vZmZ0aW1lOworCW9wdC5jaGFuZ2UgPSB+MDsKKwlSVEFfUFVUKHNrYiwgVENBX0NCUV9MU1NPUFQsIHNpemVvZihvcHQpLCAmb3B0KTsKKwlyZXR1cm4gc2tiLT5sZW47CisKK3J0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgY2JxX2R1bXBfd3JyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjYnFfY2xhc3MgKmNsKQoreworCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCXN0cnVjdCB0Y19jYnFfd3Jyb3B0IG9wdDsKKworCW9wdC5mbGFncyA9IDA7CisJb3B0LmFsbG90ID0gY2wtPmFsbG90OworCW9wdC5wcmlvcml0eSA9IGNsLT5wcmlvcml0eSsxOworCW9wdC5jcHJpb3JpdHkgPSBjbC0+Y3ByaW9yaXR5KzE7CisJb3B0LndlaWdodCA9IGNsLT53ZWlnaHQ7CisJUlRBX1BVVChza2IsIFRDQV9DQlFfV1JST1BULCBzaXplb2Yob3B0KSwgJm9wdCk7CisJcmV0dXJuIHNrYi0+bGVuOworCitydGF0dHJfZmFpbHVyZToKKwlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IGNicV9kdW1wX292bChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgY2JxX2NsYXNzICpjbCkKK3sKKwl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3QgdGNfY2JxX292bCBvcHQ7CisKKwlvcHQuc3RyYXRlZ3kgPSBjbC0+b3ZsX3N0cmF0ZWd5OworCW9wdC5wcmlvcml0eTIgPSBjbC0+cHJpb3JpdHkyKzE7CisJb3B0LnBlbmFsdHkgPSAoY2wtPnBlbmFsdHkqMTAwMCkvSFo7CisJUlRBX1BVVChza2IsIFRDQV9DQlFfT1ZMX1NUUkFURUdZLCBzaXplb2Yob3B0KSwgJm9wdCk7CisJcmV0dXJuIHNrYi0+bGVuOworCitydGF0dHJfZmFpbHVyZToKKwlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IGNicV9kdW1wX2ZvcHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNicV9jbGFzcyAqY2wpCit7CisJdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJc3RydWN0IHRjX2NicV9mb3B0IG9wdDsKKworCWlmIChjbC0+c3BsaXQgfHwgY2wtPmRlZm1hcCkgeworCQlvcHQuc3BsaXQgPSBjbC0+c3BsaXQgPyBjbC0+c3BsaXQtPmNsYXNzaWQgOiAwOworCQlvcHQuZGVmbWFwID0gY2wtPmRlZm1hcDsKKwkJb3B0LmRlZmNoYW5nZSA9IH4wOworCQlSVEFfUFVUKHNrYiwgVENBX0NCUV9GT1BULCBzaXplb2Yob3B0KSwgJm9wdCk7CisJfQorCXJldHVybiBza2ItPmxlbjsKKworcnRhdHRyX2ZhaWx1cmU6CisJc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlyZXR1cm4gLTE7Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19QT0xJQ0UKK3N0YXRpYyBfX2lubGluZV9fIGludCBjYnFfZHVtcF9wb2xpY2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNicV9jbGFzcyAqY2wpCit7CisJdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJc3RydWN0IHRjX2NicV9wb2xpY2Ugb3B0OworCisJaWYgKGNsLT5wb2xpY2UpIHsKKwkJb3B0LnBvbGljZSA9IGNsLT5wb2xpY2U7CisJCVJUQV9QVVQoc2tiLCBUQ0FfQ0JRX1BPTElDRSwgc2l6ZW9mKG9wdCksICZvcHQpOworCX0KKwlyZXR1cm4gc2tiLT5sZW47CisKK3J0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgY2JxX2R1bXBfYXR0cihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgY2JxX2NsYXNzICpjbCkKK3sKKwlpZiAoY2JxX2R1bXBfbHNzKHNrYiwgY2wpIDwgMCB8fAorCSAgICBjYnFfZHVtcF9yYXRlKHNrYiwgY2wpIDwgMCB8fAorCSAgICBjYnFfZHVtcF93cnIoc2tiLCBjbCkgPCAwIHx8CisJICAgIGNicV9kdW1wX292bChza2IsIGNsKSA8IDAgfHwKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19QT0xJQ0UKKwkgICAgY2JxX2R1bXBfcG9saWNlKHNrYiwgY2wpIDwgMCB8fAorI2VuZGlmCisJICAgIGNicV9kdW1wX2ZvcHQoc2tiLCBjbCkgPCAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2JxX2R1bXAoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGNicV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCXN0cnVjdCBydGF0dHIgKnJ0YTsKKworCXJ0YSA9IChzdHJ1Y3QgcnRhdHRyKiliOworCVJUQV9QVVQoc2tiLCBUQ0FfT1BUSU9OUywgMCwgTlVMTCk7CisJaWYgKGNicV9kdW1wX2F0dHIoc2tiLCAmcS0+bGluaykgPCAwKQorCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOworCXJ0YS0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJcmV0dXJuIHNrYi0+bGVuOworCitydGF0dHJfZmFpbHVyZToKKwlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludAorY2JxX2R1bXBfc3RhdHMoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBnbmV0X2R1bXAgKmQpCit7CisJc3RydWN0IGNicV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCisJcS0+bGluay54c3RhdHMuYXZnaWRsZSA9IHEtPmxpbmsuYXZnaWRsZTsKKwlyZXR1cm4gZ25ldF9zdGF0c19jb3B5X2FwcChkLCAmcS0+bGluay54c3RhdHMsIHNpemVvZihxLT5saW5rLnhzdGF0cykpOworfQorCitzdGF0aWMgaW50CitjYnFfZHVtcF9jbGFzcyhzdHJ1Y3QgUWRpc2MgKnNjaCwgdW5zaWduZWQgbG9uZyBhcmcsCisJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y21zZyAqdGNtKQoreworCXN0cnVjdCBjYnFfY2xhc3MgKmNsID0gKHN0cnVjdCBjYnFfY2xhc3MqKWFyZzsKKwl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3QgcnRhdHRyICpydGE7CisKKwlpZiAoY2wtPnRwYXJlbnQpCisJCXRjbS0+dGNtX3BhcmVudCA9IGNsLT50cGFyZW50LT5jbGFzc2lkOworCWVsc2UKKwkJdGNtLT50Y21fcGFyZW50ID0gVENfSF9ST09UOworCXRjbS0+dGNtX2hhbmRsZSA9IGNsLT5jbGFzc2lkOworCXRjbS0+dGNtX2luZm8gPSBjbC0+cS0+aGFuZGxlOworCisJcnRhID0gKHN0cnVjdCBydGF0dHIqKWI7CisJUlRBX1BVVChza2IsIFRDQV9PUFRJT05TLCAwLCBOVUxMKTsKKwlpZiAoY2JxX2R1bXBfYXR0cihza2IsIGNsKSA8IDApCisJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CisJcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlyZXR1cm4gc2tiLT5sZW47CisKK3J0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50CitjYnFfZHVtcF9jbGFzc19zdGF0cyhzdHJ1Y3QgUWRpc2MgKnNjaCwgdW5zaWduZWQgbG9uZyBhcmcsCisJc3RydWN0IGduZXRfZHVtcCAqZCkKK3sKKwlzdHJ1Y3QgY2JxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJc3RydWN0IGNicV9jbGFzcyAqY2wgPSAoc3RydWN0IGNicV9jbGFzcyopYXJnOworCisJY2wtPnFzdGF0cy5xbGVuID0gY2wtPnEtPnEucWxlbjsKKwljbC0+eHN0YXRzLmF2Z2lkbGUgPSBjbC0+YXZnaWRsZTsKKwljbC0+eHN0YXRzLnVuZGVydGltZSA9IDA7CisKKwlpZiAoIVBTQ0hFRF9JU19QQVNUUEVSRkVDVChjbC0+dW5kZXJ0aW1lKSkKKwkJY2wtPnhzdGF0cy51bmRlcnRpbWUgPSBQU0NIRURfVERJRkYoY2wtPnVuZGVydGltZSwgcS0+bm93KTsKKworCWlmIChnbmV0X3N0YXRzX2NvcHlfYmFzaWMoZCwgJmNsLT5ic3RhdHMpIDwgMCB8fAorI2lmZGVmIENPTkZJR19ORVRfRVNUSU1BVE9SCisJICAgIGduZXRfc3RhdHNfY29weV9yYXRlX2VzdChkLCAmY2wtPnJhdGVfZXN0KSA8IDAgfHwKKyNlbmRpZgorCSAgICBnbmV0X3N0YXRzX2NvcHlfcXVldWUoZCwgJmNsLT5xc3RhdHMpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIGduZXRfc3RhdHNfY29weV9hcHAoZCwgJmNsLT54c3RhdHMsIHNpemVvZihjbC0+eHN0YXRzKSk7Cit9CisKK3N0YXRpYyBpbnQgY2JxX2dyYWZ0KHN0cnVjdCBRZGlzYyAqc2NoLCB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IFFkaXNjICpuZXcsCisJCSAgICAgc3RydWN0IFFkaXNjICoqb2xkKQoreworCXN0cnVjdCBjYnFfY2xhc3MgKmNsID0gKHN0cnVjdCBjYnFfY2xhc3MqKWFyZzsKKworCWlmIChjbCkgeworCQlpZiAobmV3ID09IE5VTEwpIHsKKwkJCWlmICgobmV3ID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZwZmlmb19xZGlzY19vcHMpKSA9PSBOVUxMKQorCQkJCXJldHVybiAtRU5PQlVGUzsKKwkJfSBlbHNlIHsKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19QT0xJQ0UKKwkJCWlmIChjbC0+cG9saWNlID09IFRDX1BPTElDRV9SRUNMQVNTSUZZKQorCQkJCW5ldy0+cmVzaGFwZV9mYWlsID0gY2JxX3Jlc2hhcGVfZmFpbDsKKyNlbmRpZgorCQl9CisJCXNjaF90cmVlX2xvY2soc2NoKTsKKwkJKm9sZCA9IGNsLT5xOworCQljbC0+cSA9IG5ldzsKKwkJc2NoLT5xLnFsZW4gLT0gKCpvbGQpLT5xLnFsZW47CisJCXFkaXNjX3Jlc2V0KCpvbGQpOworCQlzY2hfdHJlZV91bmxvY2soc2NoKTsKKworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FTk9FTlQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgUWRpc2MgKgorY2JxX2xlYWYoc3RydWN0IFFkaXNjICpzY2gsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBjYnFfY2xhc3MgKmNsID0gKHN0cnVjdCBjYnFfY2xhc3MqKWFyZzsKKworCXJldHVybiBjbCA/IGNsLT5xIDogTlVMTDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2JxX2dldChzdHJ1Y3QgUWRpc2MgKnNjaCwgdTMyIGNsYXNzaWQpCit7CisJc3RydWN0IGNicV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCBjYnFfY2xhc3MgKmNsID0gY2JxX2NsYXNzX2xvb2t1cChxLCBjbGFzc2lkKTsKKworCWlmIChjbCkgeworCQljbC0+cmVmY250Kys7CisJCXJldHVybiAodW5zaWduZWQgbG9uZyljbDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNicV9kZXN0cm95X2ZpbHRlcnMoc3RydWN0IGNicV9jbGFzcyAqY2wpCit7CisJc3RydWN0IHRjZl9wcm90byAqdHA7CisKKwl3aGlsZSAoKHRwID0gY2wtPmZpbHRlcl9saXN0KSAhPSBOVUxMKSB7CisJCWNsLT5maWx0ZXJfbGlzdCA9IHRwLT5uZXh0OworCQl0Y2ZfZGVzdHJveSh0cCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjYnFfZGVzdHJveV9jbGFzcyhzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IGNicV9jbGFzcyAqY2wpCit7CisJc3RydWN0IGNicV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCisJQlVHX1RSQVAoIWNsLT5maWx0ZXJzKTsKKworCWNicV9kZXN0cm95X2ZpbHRlcnMoY2wpOworCXFkaXNjX2Rlc3Ryb3koY2wtPnEpOworCXFkaXNjX3B1dF9ydGFiKGNsLT5SX3RhYik7CisjaWZkZWYgQ09ORklHX05FVF9FU1RJTUFUT1IKKwlnZW5fa2lsbF9lc3RpbWF0b3IoJmNsLT5ic3RhdHMsICZjbC0+cmF0ZV9lc3QpOworI2VuZGlmCisJaWYgKGNsICE9ICZxLT5saW5rKQorCQlrZnJlZShjbCk7Cit9CisKK3N0YXRpYyB2b2lkCitjYnFfZGVzdHJveShzdHJ1Y3QgUWRpc2MqIHNjaCkKK3sKKwlzdHJ1Y3QgY2JxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJc3RydWN0IGNicV9jbGFzcyAqY2w7CisJdW5zaWduZWQgaDsKKworI2lmZGVmIENPTkZJR19ORVRfQ0xTX1BPTElDRQorCXEtPnJ4X2NsYXNzID0gTlVMTDsKKyNlbmRpZgorCS8qCisJICogRmlsdGVycyBtdXN0IGJlIGRlc3Ryb3llZCBmaXJzdCBiZWNhdXNlIHdlIGRvbid0IGRlc3Ryb3kgdGhlCisJICogY2xhc3NlcyBmcm9tIHJvb3QgdG8gbGVhZnMgd2hpY2ggbWVhbnMgdGhhdCBmaWx0ZXJzIGNhbiBzdGlsbAorCSAqIGJlIGJvdW5kIHRvIGNsYXNzZXMgd2hpY2ggaGF2ZSBiZWVuIGRlc3Ryb3llZCBhbHJlYWR5LiAtLVRHUiAnMDQKKwkgKi8KKwlmb3IgKGggPSAwOyBoIDwgMTY7IGgrKykKKwkJZm9yIChjbCA9IHEtPmNsYXNzZXNbaF07IGNsOyBjbCA9IGNsLT5uZXh0KQorCQkJY2JxX2Rlc3Ryb3lfZmlsdGVycyhjbCk7CisKKwlmb3IgKGggPSAwOyBoIDwgMTY7IGgrKykgeworCQlzdHJ1Y3QgY2JxX2NsYXNzICpuZXh0OworCisJCWZvciAoY2wgPSBxLT5jbGFzc2VzW2hdOyBjbDsgY2wgPSBuZXh0KSB7CisJCQluZXh0ID0gY2wtPm5leHQ7CisJCQljYnFfZGVzdHJveV9jbGFzcyhzY2gsIGNsKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgY2JxX3B1dChzdHJ1Y3QgUWRpc2MgKnNjaCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGNicV9jbGFzcyAqY2wgPSAoc3RydWN0IGNicV9jbGFzcyopYXJnOworCisJaWYgKC0tY2wtPnJlZmNudCA9PSAwKSB7CisjaWZkZWYgQ09ORklHX05FVF9DTFNfUE9MSUNFCisJCXN0cnVjdCBjYnFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKworCQlzcGluX2xvY2tfYmgoJnNjaC0+ZGV2LT5xdWV1ZV9sb2NrKTsKKwkJaWYgKHEtPnJ4X2NsYXNzID09IGNsKQorCQkJcS0+cnhfY2xhc3MgPSBOVUxMOworCQlzcGluX3VubG9ja19iaCgmc2NoLT5kZXYtPnF1ZXVlX2xvY2spOworI2VuZGlmCisKKwkJY2JxX2Rlc3Ryb3lfY2xhc3Moc2NoLCBjbCk7CisJfQorfQorCitzdGF0aWMgaW50CitjYnFfY2hhbmdlX2NsYXNzKHN0cnVjdCBRZGlzYyAqc2NoLCB1MzIgY2xhc3NpZCwgdTMyIHBhcmVudGlkLCBzdHJ1Y3QgcnRhdHRyICoqdGNhLAorCQkgdW5zaWduZWQgbG9uZyAqYXJnKQoreworCWludCBlcnI7CisJc3RydWN0IGNicV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCBjYnFfY2xhc3MgKmNsID0gKHN0cnVjdCBjYnFfY2xhc3MqKSphcmc7CisJc3RydWN0IHJ0YXR0ciAqb3B0ID0gdGNhW1RDQV9PUFRJT05TLTFdOworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9DQlFfTUFYXTsKKwlzdHJ1Y3QgY2JxX2NsYXNzICpwYXJlbnQ7CisJc3RydWN0IHFkaXNjX3JhdGVfdGFibGUgKnJ0YWIgPSBOVUxMOworCisJaWYgKG9wdD09TlVMTCB8fCBydGF0dHJfcGFyc2VfbmVzdGVkKHRiLCBUQ0FfQ0JRX01BWCwgb3B0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGJbVENBX0NCUV9PVkxfU1RSQVRFR1ktMV0gJiYKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX0NCUV9PVkxfU1RSQVRFR1ktMV0pIDwgc2l6ZW9mKHN0cnVjdCB0Y19jYnFfb3ZsKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGJbVENBX0NCUV9GT1BULTFdICYmCisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9DQlFfRk9QVC0xXSkgPCBzaXplb2Yoc3RydWN0IHRjX2NicV9mb3B0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGJbVENBX0NCUV9SQVRFLTFdICYmCisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9DQlFfUkFURS0xXSkgPCBzaXplb2Yoc3RydWN0IHRjX3JhdGVzcGVjKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRiW1RDQV9DQlFfTFNTT1BULTFdICYmCisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9DQlFfTFNTT1BULTFdKSA8IHNpemVvZihzdHJ1Y3QgdGNfY2JxX2xzc29wdCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh0YltUQ0FfQ0JRX1dSUk9QVC0xXSAmJgorCSAgICBSVEFfUEFZTE9BRCh0YltUQ0FfQ0JRX1dSUk9QVC0xXSkgPCBzaXplb2Yoc3RydWN0IHRjX2NicV93cnJvcHQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19QT0xJQ0UKKwlpZiAodGJbVENBX0NCUV9QT0xJQ0UtMV0gJiYKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX0NCUV9QT0xJQ0UtMV0pIDwgc2l6ZW9mKHN0cnVjdCB0Y19jYnFfcG9saWNlKSkKKwkJCXJldHVybiAtRUlOVkFMOworI2VuZGlmCisKKwlpZiAoY2wpIHsKKwkJLyogQ2hlY2sgcGFyZW50ICovCisJCWlmIChwYXJlbnRpZCkgeworCQkJaWYgKGNsLT50cGFyZW50ICYmIGNsLT50cGFyZW50LT5jbGFzc2lkICE9IHBhcmVudGlkKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKCFjbC0+dHBhcmVudCAmJiBwYXJlbnRpZCAhPSBUQ19IX1JPT1QpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAodGJbVENBX0NCUV9SQVRFLTFdKSB7CisJCQlydGFiID0gcWRpc2NfZ2V0X3J0YWIoUlRBX0RBVEEodGJbVENBX0NCUV9SQVRFLTFdKSwgdGJbVENBX0NCUV9SVEFCLTFdKTsKKwkJCWlmIChydGFiID09IE5VTEwpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBDaGFuZ2UgY2xhc3MgcGFyYW1ldGVycyAqLworCQlzY2hfdHJlZV9sb2NrKHNjaCk7CisKKwkJaWYgKGNsLT5uZXh0X2FsaXZlICE9IE5VTEwpCisJCQljYnFfZGVhY3RpdmF0ZV9jbGFzcyhjbCk7CisKKwkJaWYgKHJ0YWIpIHsKKwkJCXJ0YWIgPSB4Y2hnKCZjbC0+Ul90YWIsIHJ0YWIpOworCQkJcWRpc2NfcHV0X3J0YWIocnRhYik7CisJCX0KKworCQlpZiAodGJbVENBX0NCUV9MU1NPUFQtMV0pCisJCQljYnFfc2V0X2xzcyhjbCwgUlRBX0RBVEEodGJbVENBX0NCUV9MU1NPUFQtMV0pKTsKKworCQlpZiAodGJbVENBX0NCUV9XUlJPUFQtMV0pIHsKKwkJCWNicV9ybXByaW8ocSwgY2wpOworCQkJY2JxX3NldF93cnIoY2wsIFJUQV9EQVRBKHRiW1RDQV9DQlFfV1JST1BULTFdKSk7CisJCX0KKworCQlpZiAodGJbVENBX0NCUV9PVkxfU1RSQVRFR1ktMV0pCisJCQljYnFfc2V0X292ZXJsaW1pdChjbCwgUlRBX0RBVEEodGJbVENBX0NCUV9PVkxfU1RSQVRFR1ktMV0pKTsKKworI2lmZGVmIENPTkZJR19ORVRfQ0xTX1BPTElDRQorCQlpZiAodGJbVENBX0NCUV9QT0xJQ0UtMV0pCisJCQljYnFfc2V0X3BvbGljZShjbCwgUlRBX0RBVEEodGJbVENBX0NCUV9QT0xJQ0UtMV0pKTsKKyNlbmRpZgorCisJCWlmICh0YltUQ0FfQ0JRX0ZPUFQtMV0pCisJCQljYnFfc2V0X2ZvcHQoY2wsIFJUQV9EQVRBKHRiW1RDQV9DQlFfRk9QVC0xXSkpOworCisJCWlmIChjbC0+cS0+cS5xbGVuKQorCQkJY2JxX2FjdGl2YXRlX2NsYXNzKGNsKTsKKworCQlzY2hfdHJlZV91bmxvY2soc2NoKTsKKworI2lmZGVmIENPTkZJR19ORVRfRVNUSU1BVE9SCisJCWlmICh0Y2FbVENBX1JBVEUtMV0pCisJCQlnZW5fcmVwbGFjZV9lc3RpbWF0b3IoJmNsLT5ic3RhdHMsICZjbC0+cmF0ZV9lc3QsCisJCQkJY2wtPnN0YXRzX2xvY2ssIHRjYVtUQ0FfUkFURS0xXSk7CisjZW5kaWYKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBhcmVudGlkID09IFRDX0hfUk9PVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGJbVENBX0NCUV9XUlJPUFQtMV0gPT0gTlVMTCB8fCB0YltUQ0FfQ0JRX1JBVEUtMV0gPT0gTlVMTCB8fAorCSAgICB0YltUQ0FfQ0JRX0xTU09QVC0xXSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJ0YWIgPSBxZGlzY19nZXRfcnRhYihSVEFfREFUQSh0YltUQ0FfQ0JRX1JBVEUtMV0pLCB0YltUQ0FfQ0JRX1JUQUItMV0pOworCWlmIChydGFiID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNsYXNzaWQpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJaWYgKFRDX0hfTUFKKGNsYXNzaWRec2NoLT5oYW5kbGUpIHx8IGNicV9jbGFzc19sb29rdXAocSwgY2xhc3NpZCkpCisJCQlnb3RvIGZhaWx1cmU7CisJfSBlbHNlIHsKKwkJaW50IGk7CisJCWNsYXNzaWQgPSBUQ19IX01BS0Uoc2NoLT5oYW5kbGUsMHg4MDAwKTsKKworCQlmb3IgKGk9MDsgaTwweDgwMDA7IGkrKykgeworCQkJaWYgKCsrcS0+aGdlbmVyYXRvciA+PSAweDgwMDApCisJCQkJcS0+aGdlbmVyYXRvciA9IDE7CisJCQlpZiAoY2JxX2NsYXNzX2xvb2t1cChxLCBjbGFzc2lkfHEtPmhnZW5lcmF0b3IpID09IE5VTEwpCisJCQkJYnJlYWs7CisJCX0KKwkJZXJyID0gLUVOT1NSOworCQlpZiAoaSA+PSAweDgwMDApCisJCQlnb3RvIGZhaWx1cmU7CisJCWNsYXNzaWQgPSBjbGFzc2lkfHEtPmhnZW5lcmF0b3I7CisJfQorCisJcGFyZW50ID0gJnEtPmxpbms7CisJaWYgKHBhcmVudGlkKSB7CisJCXBhcmVudCA9IGNicV9jbGFzc19sb29rdXAocSwgcGFyZW50aWQpOworCQllcnIgPSAtRUlOVkFMOworCQlpZiAocGFyZW50ID09IE5VTEwpCisJCQlnb3RvIGZhaWx1cmU7CisJfQorCisJZXJyID0gLUVOT0JVRlM7CisJY2wgPSBrbWFsbG9jKHNpemVvZigqY2wpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2wgPT0gTlVMTCkKKwkJZ290byBmYWlsdXJlOworCW1lbXNldChjbCwgMCwgc2l6ZW9mKCpjbCkpOworCWNsLT5SX3RhYiA9IHJ0YWI7CisJcnRhYiA9IE5VTEw7CisJY2wtPnJlZmNudCA9IDE7CisJaWYgKCEoY2wtPnEgPSBxZGlzY19jcmVhdGVfZGZsdChzY2gtPmRldiwgJnBmaWZvX3FkaXNjX29wcykpKQorCQljbC0+cSA9ICZub29wX3FkaXNjOworCWNsLT5jbGFzc2lkID0gY2xhc3NpZDsKKwljbC0+dHBhcmVudCA9IHBhcmVudDsKKwljbC0+cWRpc2MgPSBzY2g7CisJY2wtPmFsbG90ID0gcGFyZW50LT5hbGxvdDsKKwljbC0+cXVhbnR1bSA9IGNsLT5hbGxvdDsKKwljbC0+d2VpZ2h0ID0gY2wtPlJfdGFiLT5yYXRlLnJhdGU7CisJY2wtPnN0YXRzX2xvY2sgPSAmc2NoLT5kZXYtPnF1ZXVlX2xvY2s7CisKKwlzY2hfdHJlZV9sb2NrKHNjaCk7CisJY2JxX2xpbmtfY2xhc3MoY2wpOworCWNsLT5ib3Jyb3cgPSBjbC0+dHBhcmVudDsKKwlpZiAoY2wtPnRwYXJlbnQgIT0gJnEtPmxpbmspCisJCWNsLT5zaGFyZSA9IGNsLT50cGFyZW50OworCWNicV9hZGp1c3RfbGV2ZWxzKHBhcmVudCk7CisJY2wtPm1pbmlkbGUgPSAtMHg3RkZGRkZGRjsKKwljYnFfc2V0X2xzcyhjbCwgUlRBX0RBVEEodGJbVENBX0NCUV9MU1NPUFQtMV0pKTsKKwljYnFfc2V0X3dycihjbCwgUlRBX0RBVEEodGJbVENBX0NCUV9XUlJPUFQtMV0pKTsKKwlpZiAoY2wtPmV3bWFfbG9nPT0wKQorCQljbC0+ZXdtYV9sb2cgPSBxLT5saW5rLmV3bWFfbG9nOworCWlmIChjbC0+bWF4aWRsZT09MCkKKwkJY2wtPm1heGlkbGUgPSBxLT5saW5rLm1heGlkbGU7CisJaWYgKGNsLT5hdnBrdD09MCkKKwkJY2wtPmF2cGt0ID0gcS0+bGluay5hdnBrdDsKKwljbC0+b3ZlcmxpbWl0ID0gY2JxX292bF9jbGFzc2ljOworCWlmICh0YltUQ0FfQ0JRX09WTF9TVFJBVEVHWS0xXSkKKwkJY2JxX3NldF9vdmVybGltaXQoY2wsIFJUQV9EQVRBKHRiW1RDQV9DQlFfT1ZMX1NUUkFURUdZLTFdKSk7CisjaWZkZWYgQ09ORklHX05FVF9DTFNfUE9MSUNFCisJaWYgKHRiW1RDQV9DQlFfUE9MSUNFLTFdKQorCQljYnFfc2V0X3BvbGljZShjbCwgUlRBX0RBVEEodGJbVENBX0NCUV9QT0xJQ0UtMV0pKTsKKyNlbmRpZgorCWlmICh0YltUQ0FfQ0JRX0ZPUFQtMV0pCisJCWNicV9zZXRfZm9wdChjbCwgUlRBX0RBVEEodGJbVENBX0NCUV9GT1BULTFdKSk7CisJc2NoX3RyZWVfdW5sb2NrKHNjaCk7CisKKyNpZmRlZiBDT05GSUdfTkVUX0VTVElNQVRPUgorCWlmICh0Y2FbVENBX1JBVEUtMV0pCisJCWdlbl9uZXdfZXN0aW1hdG9yKCZjbC0+YnN0YXRzLCAmY2wtPnJhdGVfZXN0LAorCQkJY2wtPnN0YXRzX2xvY2ssIHRjYVtUQ0FfUkFURS0xXSk7CisjZW5kaWYKKworCSphcmcgPSAodW5zaWduZWQgbG9uZyljbDsKKwlyZXR1cm4gMDsKKworZmFpbHVyZToKKwlxZGlzY19wdXRfcnRhYihydGFiKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGNicV9kZWxldGUoc3RydWN0IFFkaXNjICpzY2gsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBjYnFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlzdHJ1Y3QgY2JxX2NsYXNzICpjbCA9IChzdHJ1Y3QgY2JxX2NsYXNzKilhcmc7CisKKwlpZiAoY2wtPmZpbHRlcnMgfHwgY2wtPmNoaWxkcmVuIHx8IGNsID09ICZxLT5saW5rKQorCQlyZXR1cm4gLUVCVVNZOworCisJc2NoX3RyZWVfbG9jayhzY2gpOworCisJaWYgKGNsLT5uZXh0X2FsaXZlKQorCQljYnFfZGVhY3RpdmF0ZV9jbGFzcyhjbCk7CisKKwlpZiAocS0+dHhfYm9ycm93ZWQgPT0gY2wpCisJCXEtPnR4X2JvcnJvd2VkID0gcS0+dHhfY2xhc3M7CisJaWYgKHEtPnR4X2NsYXNzID09IGNsKSB7CisJCXEtPnR4X2NsYXNzID0gTlVMTDsKKwkJcS0+dHhfYm9ycm93ZWQgPSBOVUxMOworCX0KKyNpZmRlZiBDT05GSUdfTkVUX0NMU19QT0xJQ0UKKwlpZiAocS0+cnhfY2xhc3MgPT0gY2wpCisJCXEtPnJ4X2NsYXNzID0gTlVMTDsKKyNlbmRpZgorCisJY2JxX3VubGlua19jbGFzcyhjbCk7CisJY2JxX2FkanVzdF9sZXZlbHMoY2wtPnRwYXJlbnQpOworCWNsLT5kZWZtYXAgPSAwOworCWNicV9zeW5jX2RlZm1hcChjbCk7CisKKwljYnFfcm1wcmlvKHEsIGNsKTsKKwlzY2hfdHJlZV91bmxvY2soc2NoKTsKKworCWlmICgtLWNsLT5yZWZjbnQgPT0gMCkKKwkJY2JxX2Rlc3Ryb3lfY2xhc3Moc2NoLCBjbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB0Y2ZfcHJvdG8gKipjYnFfZmluZF90Y2Yoc3RydWN0IFFkaXNjICpzY2gsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBjYnFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlzdHJ1Y3QgY2JxX2NsYXNzICpjbCA9IChzdHJ1Y3QgY2JxX2NsYXNzICopYXJnOworCisJaWYgKGNsID09IE5VTEwpCisJCWNsID0gJnEtPmxpbms7CisKKwlyZXR1cm4gJmNsLT5maWx0ZXJfbGlzdDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2JxX2JpbmRfZmlsdGVyKHN0cnVjdCBRZGlzYyAqc2NoLCB1bnNpZ25lZCBsb25nIHBhcmVudCwKKwkJCQkgICAgIHUzMiBjbGFzc2lkKQoreworCXN0cnVjdCBjYnFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlzdHJ1Y3QgY2JxX2NsYXNzICpwID0gKHN0cnVjdCBjYnFfY2xhc3MqKXBhcmVudDsKKwlzdHJ1Y3QgY2JxX2NsYXNzICpjbCA9IGNicV9jbGFzc19sb29rdXAocSwgY2xhc3NpZCk7CisKKwlpZiAoY2wpIHsKKwkJaWYgKHAgJiYgcC0+bGV2ZWwgPD0gY2wtPmxldmVsKQorCQkJcmV0dXJuIDA7CisJCWNsLT5maWx0ZXJzKys7CisJCXJldHVybiAodW5zaWduZWQgbG9uZyljbDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNicV91bmJpbmRfZmlsdGVyKHN0cnVjdCBRZGlzYyAqc2NoLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY2JxX2NsYXNzICpjbCA9IChzdHJ1Y3QgY2JxX2NsYXNzKilhcmc7CisKKwljbC0+ZmlsdGVycy0tOworfQorCitzdGF0aWMgdm9pZCBjYnFfd2FsayhzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IHFkaXNjX3dhbGtlciAqYXJnKQoreworCXN0cnVjdCBjYnFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwl1bnNpZ25lZCBoOworCisJaWYgKGFyZy0+c3RvcCkKKwkJcmV0dXJuOworCisJZm9yIChoID0gMDsgaCA8IDE2OyBoKyspIHsKKwkJc3RydWN0IGNicV9jbGFzcyAqY2w7CisKKwkJZm9yIChjbCA9IHEtPmNsYXNzZXNbaF07IGNsOyBjbCA9IGNsLT5uZXh0KSB7CisJCQlpZiAoYXJnLT5jb3VudCA8IGFyZy0+c2tpcCkgeworCQkJCWFyZy0+Y291bnQrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChhcmctPmZuKHNjaCwgKHVuc2lnbmVkIGxvbmcpY2wsIGFyZykgPCAwKSB7CisJCQkJYXJnLT5zdG9wID0gMTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlhcmctPmNvdW50Kys7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgUWRpc2NfY2xhc3Nfb3BzIGNicV9jbGFzc19vcHMgPSB7CisJLmdyYWZ0CQk9CWNicV9ncmFmdCwKKwkubGVhZgkJPQljYnFfbGVhZiwKKwkuZ2V0CQk9CWNicV9nZXQsCisJLnB1dAkJPQljYnFfcHV0LAorCS5jaGFuZ2UJCT0JY2JxX2NoYW5nZV9jbGFzcywKKwkuZGVsZXRlCQk9CWNicV9kZWxldGUsCisJLndhbGsJCT0JY2JxX3dhbGssCisJLnRjZl9jaGFpbgk9CWNicV9maW5kX3RjZiwKKwkuYmluZF90Y2YJPQljYnFfYmluZF9maWx0ZXIsCisJLnVuYmluZF90Y2YJPQljYnFfdW5iaW5kX2ZpbHRlciwKKwkuZHVtcAkJPQljYnFfZHVtcF9jbGFzcywKKwkuZHVtcF9zdGF0cwk9CWNicV9kdW1wX2NsYXNzX3N0YXRzLAorfTsKKworc3RhdGljIHN0cnVjdCBRZGlzY19vcHMgY2JxX3FkaXNjX29wcyA9IHsKKwkubmV4dAkJPQlOVUxMLAorCS5jbF9vcHMJCT0JJmNicV9jbGFzc19vcHMsCisJLmlkCQk9CSJjYnEiLAorCS5wcml2X3NpemUJPQlzaXplb2Yoc3RydWN0IGNicV9zY2hlZF9kYXRhKSwKKwkuZW5xdWV1ZQk9CWNicV9lbnF1ZXVlLAorCS5kZXF1ZXVlCT0JY2JxX2RlcXVldWUsCisJLnJlcXVldWUJPQljYnFfcmVxdWV1ZSwKKwkuZHJvcAkJPQljYnFfZHJvcCwKKwkuaW5pdAkJPQljYnFfaW5pdCwKKwkucmVzZXQJCT0JY2JxX3Jlc2V0LAorCS5kZXN0cm95CT0JY2JxX2Rlc3Ryb3ksCisJLmNoYW5nZQkJPQlOVUxMLAorCS5kdW1wCQk9CWNicV9kdW1wLAorCS5kdW1wX3N0YXRzCT0JY2JxX2R1bXBfc3RhdHMsCisJLm93bmVyCQk9CVRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY2JxX21vZHVsZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX3FkaXNjKCZjYnFfcWRpc2Nfb3BzKTsKK30KK3N0YXRpYyB2b2lkIF9fZXhpdCBjYnFfbW9kdWxlX2V4aXQodm9pZCkgCit7CisJdW5yZWdpc3Rlcl9xZGlzYygmY2JxX3FkaXNjX29wcyk7Cit9Cittb2R1bGVfaW5pdChjYnFfbW9kdWxlX2luaXQpCittb2R1bGVfZXhpdChjYnFfbW9kdWxlX2V4aXQpCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2RzbWFyay5jIGIvbmV0L3NjaGVkL3NjaF9kc21hcmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTNkYjlkCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjaGVkL3NjaF9kc21hcmsuYwpAQCAtMCwwICsxLDQ3OSBAQAorLyogbmV0L3NjaGVkL3NjaF9kc21hcmsuYyAtIERpZmZlcmVudGlhdGVkIFNlcnZpY2VzIGZpZWxkIG1hcmtlciAqLworCisvKiBXcml0dGVuIDE5OTgtMjAwMCBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIEVQRkwgSUNBICovCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+IC8qIGZvciBwa3Rfc2NoZWQgKi8KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CisjaW5jbHVkZSA8bmV0L2RzZmllbGQuaD4KKyNpbmNsdWRlIDxuZXQvaW5ldF9lY24uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKworI2lmIDEgLyogY29udHJvbCAqLworI2RlZmluZSBEUFJJTlRLKGZvcm1hdCxhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQsIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgRFBSSU5USyhmb3JtYXQsYXJncy4uLikKKyNlbmRpZgorCisjaWYgMCAvKiBkYXRhICovCisjZGVmaW5lIEQyUFJJTlRLKGZvcm1hdCxhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQsIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgRDJQUklOVEsoZm9ybWF0LGFyZ3MuLi4pCisjZW5kaWYKKworCisjZGVmaW5lIFBSSVYoc2NoKSBxZGlzY19wcml2KHNjaCkKKworCisvKgorICogY2xhc3NpZAljbGFzcwkJbWFya2luZworICogLS0tLS0tLQktLS0tLQkJLS0tLS0tLQorICogICBuL2EJICAwCQluL2EKKyAqICAgeDowCSAgMQkJdXNlIGVudHJ5IFswXQorICogICAuLi4JIC4uLgkJLi4uCisgKiAgIHg6eSB5PjAJIHkrMQkJdXNlIGVudHJ5IFt5XQorICogICAuLi4JIC4uLgkJLi4uCisgKiB4OmluZGljZXMtMQlpbmRpY2VzCQl1c2UgZW50cnkgW2luZGljZXMtMV0KKyAqICAgLi4uCSAuLi4JCS4uLgorICogICB4OnkJIHkrMQkJdXNlIGVudHJ5IFt5ICYgKGluZGljZXMtMSldCisgKiAgIC4uLgkgLi4uCQkuLi4KKyAqIDB4ZmZmZgkweDEwMDAwCQl1c2UgZW50cnkgW2luZGljZXMtMV0KKyAqLworCisKKyNkZWZpbmUgTk9fREVGQVVMVF9JTkRFWAkoMSA8PCAxNikKKworc3RydWN0IGRzbWFya19xZGlzY19kYXRhIHsKKwlzdHJ1Y3QgUWRpc2MJCSpxOworCXN0cnVjdCB0Y2ZfcHJvdG8JKmZpbHRlcl9saXN0OworCV9fdTgJCQkqbWFzazsJLyogIm93bnMiIHRoZSBhcnJheSAqLworCV9fdTgJCQkqdmFsdWU7CisJX191MTYJCQlpbmRpY2VzOworCV9fdTMyCQkJZGVmYXVsdF9pbmRleDsJLyogaW5kZXggcmFuZ2UgaXMgMC4uLjB4ZmZmZiAqLworCWludAkJCXNldF90Y19pbmRleDsKK307CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDbGFzcy9mbG93IG9wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKK3N0YXRpYyBpbnQgZHNtYXJrX2dyYWZ0KHN0cnVjdCBRZGlzYyAqc2NoLHVuc2lnbmVkIGxvbmcgYXJnLAorICAgIHN0cnVjdCBRZGlzYyAqbmV3LHN0cnVjdCBRZGlzYyAqKm9sZCkKK3sKKwlzdHJ1Y3QgZHNtYXJrX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7CisKKwlEUFJJTlRLKCJkc21hcmtfZ3JhZnQoc2NoICVwLFtxZGlzYyAlcF0sbmV3ICVwLG9sZCAlcClcbiIsc2NoLHAsbmV3LAorCSAgICBvbGQpOworCWlmICghbmV3KQorCQluZXcgPSAmbm9vcF9xZGlzYzsKKwlzY2hfdHJlZV9sb2NrKHNjaCk7CisJKm9sZCA9IHhjaGcoJnAtPnEsbmV3KTsKKwlpZiAoKm9sZCkKKwkJcWRpc2NfcmVzZXQoKm9sZCk7CisJc2NoLT5xLnFsZW4gPSAwOworCXNjaF90cmVlX3VubG9jayhzY2gpOyAvKiBAQEAgbW92ZSB1cCA/ICovCisgICAgICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgUWRpc2MgKmRzbWFya19sZWFmKHN0cnVjdCBRZGlzYyAqc2NoLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZHNtYXJrX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7CisKKwlyZXR1cm4gcC0+cTsKK30KKworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkc21hcmtfZ2V0KHN0cnVjdCBRZGlzYyAqc2NoLHUzMiBjbGFzc2lkKQoreworCXN0cnVjdCBkc21hcmtfcWRpc2NfZGF0YSAqcCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IFBSSVYoc2NoKTsKKworCURQUklOVEsoImRzbWFya19nZXQoc2NoICVwLFtxZGlzYyAlcF0sY2xhc3NpZCAleClcbiIsc2NoLHAsY2xhc3NpZCk7CisJcmV0dXJuIFRDX0hfTUlOKGNsYXNzaWQpKzE7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZHNtYXJrX2JpbmRfZmlsdGVyKHN0cnVjdCBRZGlzYyAqc2NoLAorICAgIHVuc2lnbmVkIGxvbmcgcGFyZW50LCB1MzIgY2xhc3NpZCkKK3sKKwlyZXR1cm4gZHNtYXJrX2dldChzY2gsY2xhc3NpZCk7Cit9CisKKworc3RhdGljIHZvaWQgZHNtYXJrX3B1dChzdHJ1Y3QgUWRpc2MgKnNjaCwgdW5zaWduZWQgbG9uZyBjbCkKK3sKK30KKworCitzdGF0aWMgaW50IGRzbWFya19jaGFuZ2Uoc3RydWN0IFFkaXNjICpzY2gsIHUzMiBjbGFzc2lkLCB1MzIgcGFyZW50LAorICAgIHN0cnVjdCBydGF0dHIgKip0Y2EsIHVuc2lnbmVkIGxvbmcgKmFyZykKK3sKKwlzdHJ1Y3QgZHNtYXJrX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7CisJc3RydWN0IHJ0YXR0ciAqb3B0ID0gdGNhW1RDQV9PUFRJT05TLTFdOworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9EU01BUktfTUFYXTsKKworCURQUklOVEsoImRzbWFya19jaGFuZ2Uoc2NoICVwLFtxZGlzYyAlcF0sY2xhc3NpZCAleCxwYXJlbnQgJXgpLCIKKwkgICAgImFyZyAweCVseFxuIixzY2gscCxjbGFzc2lkLHBhcmVudCwqYXJnKTsKKwlpZiAoKmFyZyA+IHAtPmluZGljZXMpCisJCXJldHVybiAtRU5PRU5UOworCWlmICghb3B0IHx8IHJ0YXR0cl9wYXJzZV9uZXN0ZWQodGIsIFRDQV9EU01BUktfTUFYLCBvcHQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodGJbVENBX0RTTUFSS19NQVNLLTFdKSB7CisJCWlmICghUlRBX1BBWUxPQUQodGJbVENBX0RTTUFSS19NQVNLLTFdKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlwLT5tYXNrWyphcmctMV0gPSAqKF9fdTggKikgUlRBX0RBVEEodGJbVENBX0RTTUFSS19NQVNLLTFdKTsKKwl9CisJaWYgKHRiW1RDQV9EU01BUktfVkFMVUUtMV0pIHsKKwkJaWYgKCFSVEFfUEFZTE9BRCh0YltUQ0FfRFNNQVJLX1ZBTFVFLTFdKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlwLT52YWx1ZVsqYXJnLTFdID0gKihfX3U4ICopIFJUQV9EQVRBKHRiW1RDQV9EU01BUktfVkFMVUUtMV0pOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGRzbWFya19kZWxldGUoc3RydWN0IFFkaXNjICpzY2gsdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGRzbWFya19xZGlzY19kYXRhICpwID0gUFJJVihzY2gpOworCisJaWYgKCFhcmcgfHwgYXJnID4gcC0+aW5kaWNlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisJcC0+bWFza1thcmctMV0gPSAweGZmOworCXAtPnZhbHVlW2FyZy0xXSA9IDA7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgZHNtYXJrX3dhbGsoc3RydWN0IFFkaXNjICpzY2gsc3RydWN0IHFkaXNjX3dhbGtlciAqd2Fsa2VyKQoreworCXN0cnVjdCBkc21hcmtfcWRpc2NfZGF0YSAqcCA9IFBSSVYoc2NoKTsKKwlpbnQgaTsKKworCURQUklOVEsoImRzbWFya193YWxrKHNjaCAlcCxbcWRpc2MgJXBdLHdhbGtlciAlcClcbiIsc2NoLHAsd2Fsa2VyKTsKKwlpZiAod2Fsa2VyLT5zdG9wKQorCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IHAtPmluZGljZXM7IGkrKykgeworCQlpZiAocC0+bWFza1tpXSA9PSAweGZmICYmICFwLT52YWx1ZVtpXSkKKwkJCWNvbnRpbnVlOworCQlpZiAod2Fsa2VyLT5jb3VudCA+PSB3YWxrZXItPnNraXApIHsKKwkJCWlmICh3YWxrZXItPmZuKHNjaCwgaSsxLCB3YWxrZXIpIDwgMCkgeworCQkJCXdhbGtlci0+c3RvcCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKyAgICAgICAgICAgICAgICB3YWxrZXItPmNvdW50Kys7CisgICAgICAgIH0KK30KKworCitzdGF0aWMgc3RydWN0IHRjZl9wcm90byAqKmRzbWFya19maW5kX3RjZihzdHJ1Y3QgUWRpc2MgKnNjaCx1bnNpZ25lZCBsb25nIGNsKQoreworCXN0cnVjdCBkc21hcmtfcWRpc2NfZGF0YSAqcCA9IFBSSVYoc2NoKTsKKworCXJldHVybiAmcC0+ZmlsdGVyX2xpc3Q7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFFkaXNjIG9wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKK3N0YXRpYyBpbnQgZHNtYXJrX2VucXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYixzdHJ1Y3QgUWRpc2MgKnNjaCkKK3sKKwlzdHJ1Y3QgZHNtYXJrX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7CisJc3RydWN0IHRjZl9yZXN1bHQgcmVzOworCWludCByZXN1bHQ7CisJaW50IHJldCA9IE5FVF9YTUlUX1BPTElDRUQ7CisKKwlEMlBSSU5USygiZHNtYXJrX2VucXVldWUoc2tiICVwLHNjaCAlcCxbcWRpc2MgJXBdKVxuIixza2Isc2NoLHApOworCWlmIChwLT5zZXRfdGNfaW5kZXgpIHsKKwkJLyogRklYTUU6IFNhZmUgd2l0aCBub24tbGluZWFyIHNrYnM/IC0tUlIgKi8KKwkJc3dpdGNoIChza2ItPnByb3RvY29sKSB7CisJCQljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApOgorCQkJCXNrYi0+dGNfaW5kZXggPSBpcHY0X2dldF9kc2ZpZWxkKHNrYi0+bmguaXBoKQorCQkJCQkmIH5JTkVUX0VDTl9NQVNLOworCQkJCWJyZWFrOworCQkJY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQVjYpOgorCQkJCXNrYi0+dGNfaW5kZXggPSBpcHY2X2dldF9kc2ZpZWxkKHNrYi0+bmguaXB2NmgpCisJCQkJCSYgfklORVRfRUNOX01BU0s7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXNrYi0+dGNfaW5kZXggPSAwOworCQkJCWJyZWFrOworCQl9OworCX0KKwlyZXN1bHQgPSBUQ19QT0xJQ0VfT0s7IC8qIGJlIG5pY2UgdG8gZ2NjICovCisJaWYgKFRDX0hfTUFKKHNrYi0+cHJpb3JpdHkpID09IHNjaC0+aGFuZGxlKSB7CisJCXNrYi0+dGNfaW5kZXggPSBUQ19IX01JTihza2ItPnByaW9yaXR5KTsKKwl9IGVsc2UgeworCQlyZXN1bHQgPSB0Y19jbGFzc2lmeShza2IscC0+ZmlsdGVyX2xpc3QsJnJlcyk7CisJCUQyUFJJTlRLKCJyZXN1bHQgJWQgY2xhc3MgMHglMDR4XG4iLHJlc3VsdCxyZXMuY2xhc3NpZCk7CisJCXN3aXRjaCAocmVzdWx0KSB7CisjaWZkZWYgQ09ORklHX05FVF9DTFNfUE9MSUNFCisJCQljYXNlIFRDX1BPTElDRV9TSE9UOgorCQkJCWtmcmVlX3NrYihza2IpOworCQkJCWJyZWFrOworI2lmIDAKKwkJCWNhc2UgVENfUE9MSUNFX1JFQ0xBU1NJRlk6CisJCQkJLyogRklYTUU6IHdoYXQgdG8gZG8gaGVyZSA/Pz8gKi8KKyNlbmRpZgorI2VuZGlmCisJCQljYXNlIFRDX1BPTElDRV9PSzoKKwkJCQlza2ItPnRjX2luZGV4ID0gVENfSF9NSU4ocmVzLmNsYXNzaWQpOworCQkJCWJyZWFrOworCQkJY2FzZSBUQ19QT0xJQ0VfVU5TUEVDOgorCQkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQkJZGVmYXVsdDoKKwkJCQlpZiAocC0+ZGVmYXVsdF9pbmRleCAhPSBOT19ERUZBVUxUX0lOREVYKQorCQkJCQlza2ItPnRjX2luZGV4ID0gcC0+ZGVmYXVsdF9pbmRleDsKKwkJCQlicmVhazsKKwkJfTsKKwl9CisJaWYgKAorI2lmZGVmIENPTkZJR19ORVRfQ0xTX1BPTElDRQorCSAgICByZXN1bHQgPT0gVENfUE9MSUNFX1NIT1QgfHwKKyNlbmRpZgorCisJICAgICgocmV0ID0gcC0+cS0+ZW5xdWV1ZShza2IscC0+cSkpICE9IDApKSB7CisJCXNjaC0+cXN0YXRzLmRyb3BzKys7CisJCXJldHVybiByZXQ7CisJfQorCXNjaC0+YnN0YXRzLmJ5dGVzICs9IHNrYi0+bGVuOworCXNjaC0+YnN0YXRzLnBhY2tldHMrKzsKKwlzY2gtPnEucWxlbisrOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHN0cnVjdCBza19idWZmICpkc21hcmtfZGVxdWV1ZShzdHJ1Y3QgUWRpc2MgKnNjaCkKK3sKKwlzdHJ1Y3QgZHNtYXJrX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgaW5kZXg7CisKKwlEMlBSSU5USygiZHNtYXJrX2RlcXVldWUoc2NoICVwLFtxZGlzYyAlcF0pXG4iLHNjaCxwKTsKKwlza2IgPSBwLT5xLT5vcHMtPmRlcXVldWUocC0+cSk7CisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCXNjaC0+cS5xbGVuLS07CisJaW5kZXggPSBza2ItPnRjX2luZGV4ICYgKHAtPmluZGljZXMtMSk7CisJRDJQUklOVEsoImluZGV4ICVkLT4lZFxuIixza2ItPnRjX2luZGV4LGluZGV4KTsKKwlzd2l0Y2ggKHNrYi0+cHJvdG9jb2wpIHsKKwkJY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKToKKwkJCWlwdjRfY2hhbmdlX2RzZmllbGQoc2tiLT5uaC5pcGgsCisJCQkgICAgcC0+bWFza1tpbmRleF0scC0+dmFsdWVbaW5kZXhdKTsKKwkJCWJyZWFrOworCQljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVBWNik6CisJCQlpcHY2X2NoYW5nZV9kc2ZpZWxkKHNrYi0+bmguaXB2NmgsCisJCQkgICAgcC0+bWFza1tpbmRleF0scC0+dmFsdWVbaW5kZXhdKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyoKKwkJCSAqIE9ubHkgY29tcGxhaW4gaWYgYSBjaGFuZ2Ugd2FzIGFjdHVhbGx5IGF0dGVtcHRlZC4KKwkJCSAqIFRoaXMgd2F5LCB3ZSBjYW4gc2VuZCBub24tSVAgdHJhZmZpYyB0aHJvdWdoIGRzbWFyaworCQkJICogYW5kIGRvbid0IG5lZWQgeWV0IGFub3RoZXIgcWRpc2MgYXMgYSBieXBhc3MuCisJCQkgKi8KKwkJCWlmIChwLT5tYXNrW2luZGV4XSAhPSAweGZmIHx8IHAtPnZhbHVlW2luZGV4XSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJkc21hcmtfZGVxdWV1ZTogIgorCQkJCSAgICAgICAidW5zdXBwb3J0ZWQgcHJvdG9jb2wgJWRcbiIsCisJCQkJICAgICAgIGh0b25zKHNrYi0+cHJvdG9jb2wpKTsKKwkJCWJyZWFrOworCX07CisJcmV0dXJuIHNrYjsKK30KKworCitzdGF0aWMgaW50IGRzbWFya19yZXF1ZXVlKHN0cnVjdCBza19idWZmICpza2Isc3RydWN0IFFkaXNjICpzY2gpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZHNtYXJrX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7CisKKwlEMlBSSU5USygiZHNtYXJrX3JlcXVldWUoc2tiICVwLHNjaCAlcCxbcWRpc2MgJXBdKVxuIixza2Isc2NoLHApOworICAgICAgICBpZiAoKHJldCA9IHAtPnEtPm9wcy0+cmVxdWV1ZShza2IsIHAtPnEpKSA9PSAwKSB7CisJCXNjaC0+cS5xbGVuKys7CisJCXNjaC0+cXN0YXRzLnJlcXVldWVzKys7CisJCXJldHVybiAwOworCX0KKwlzY2gtPnFzdGF0cy5kcm9wcysrOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludCBkc21hcmtfZHJvcChzdHJ1Y3QgUWRpc2MgKnNjaCkKK3sKKwlzdHJ1Y3QgZHNtYXJrX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7CisJdW5zaWduZWQgaW50IGxlbjsKKwkKKwlEUFJJTlRLKCJkc21hcmtfcmVzZXQoc2NoICVwLFtxZGlzYyAlcF0pXG4iLHNjaCxwKTsKKwlpZiAoIXAtPnEtPm9wcy0+ZHJvcCkKKwkJcmV0dXJuIDA7CisJaWYgKCEobGVuID0gcC0+cS0+b3BzLT5kcm9wKHAtPnEpKSkKKwkJcmV0dXJuIDA7CisJc2NoLT5xLnFsZW4tLTsKKwlyZXR1cm4gbGVuOworfQorCisKK3N0YXRpYyBpbnQgZHNtYXJrX2luaXQoc3RydWN0IFFkaXNjICpzY2gsc3RydWN0IHJ0YXR0ciAqb3B0KQoreworCXN0cnVjdCBkc21hcmtfcWRpc2NfZGF0YSAqcCA9IFBSSVYoc2NoKTsKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfRFNNQVJLX01BWF07CisJX191MTYgdG1wOworCisJRFBSSU5USygiZHNtYXJrX2luaXQoc2NoICVwLFtxZGlzYyAlcF0sb3B0ICVwKVxuIixzY2gscCxvcHQpOworCWlmICghb3B0IHx8CisJICAgIHJ0YXR0cl9wYXJzZSh0YixUQ0FfRFNNQVJLX01BWCxSVEFfREFUQShvcHQpLFJUQV9QQVlMT0FEKG9wdCkpIDwgMCB8fAorCSAgICAhdGJbVENBX0RTTUFSS19JTkRJQ0VTLTFdIHx8CisJICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9EU01BUktfSU5ESUNFUy0xXSkgPCBzaXplb2YoX191MTYpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCXAtPmluZGljZXMgPSAqKF9fdTE2ICopIFJUQV9EQVRBKHRiW1RDQV9EU01BUktfSU5ESUNFUy0xXSk7CisJaWYgKCFwLT5pbmRpY2VzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlmb3IgKHRtcCA9IHAtPmluZGljZXM7IHRtcCAhPSAxOyB0bXAgPj49IDEpIHsKKwkJaWYgKHRtcCAmIDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcC0+ZGVmYXVsdF9pbmRleCA9IE5PX0RFRkFVTFRfSU5ERVg7CisJaWYgKHRiW1RDQV9EU01BUktfREVGQVVMVF9JTkRFWC0xXSkgeworCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX0RTTUFSS19ERUZBVUxUX0lOREVYLTFdKSA8IHNpemVvZihfX3UxNikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcC0+ZGVmYXVsdF9pbmRleCA9CisJCSAgICAqKF9fdTE2ICopIFJUQV9EQVRBKHRiW1RDQV9EU01BUktfREVGQVVMVF9JTkRFWC0xXSk7CisJfQorCXAtPnNldF90Y19pbmRleCA9ICEhdGJbVENBX0RTTUFSS19TRVRfVENfSU5ERVgtMV07CisJcC0+bWFzayA9IGttYWxsb2MocC0+aW5kaWNlcyoyLEdGUF9LRVJORUwpOworCWlmICghcC0+bWFzaykKKwkJcmV0dXJuIC1FTk9NRU07CisJcC0+dmFsdWUgPSBwLT5tYXNrK3AtPmluZGljZXM7CisJbWVtc2V0KHAtPm1hc2ssMHhmZixwLT5pbmRpY2VzKTsKKwltZW1zZXQocC0+dmFsdWUsMCxwLT5pbmRpY2VzKTsKKwlpZiAoIShwLT5xID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZwZmlmb19xZGlzY19vcHMpKSkKKwkJcC0+cSA9ICZub29wX3FkaXNjOworCURQUklOVEsoImRzbWFya19pbml0OiBxZGlzYyAlcFxuIiwmcC0+cSk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgZHNtYXJrX3Jlc2V0KHN0cnVjdCBRZGlzYyAqc2NoKQoreworCXN0cnVjdCBkc21hcmtfcWRpc2NfZGF0YSAqcCA9IFBSSVYoc2NoKTsKKworCURQUklOVEsoImRzbWFya19yZXNldChzY2ggJXAsW3FkaXNjICVwXSlcbiIsc2NoLHApOworCXFkaXNjX3Jlc2V0KHAtPnEpOworCXNjaC0+cS5xbGVuID0gMDsKK30KKworCitzdGF0aWMgdm9pZCBkc21hcmtfZGVzdHJveShzdHJ1Y3QgUWRpc2MgKnNjaCkKK3sKKwlzdHJ1Y3QgZHNtYXJrX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7CisJc3RydWN0IHRjZl9wcm90byAqdHA7CisKKwlEUFJJTlRLKCJkc21hcmtfZGVzdHJveShzY2ggJXAsW3FkaXNjICVwXSlcbiIsc2NoLHApOworCXdoaWxlIChwLT5maWx0ZXJfbGlzdCkgeworCQl0cCA9IHAtPmZpbHRlcl9saXN0OworCQlwLT5maWx0ZXJfbGlzdCA9IHRwLT5uZXh0OworCQl0Y2ZfZGVzdHJveSh0cCk7CisJfQorCXFkaXNjX2Rlc3Ryb3kocC0+cSk7CisJa2ZyZWUocC0+bWFzayk7Cit9CisKKworc3RhdGljIGludCBkc21hcmtfZHVtcF9jbGFzcyhzdHJ1Y3QgUWRpc2MgKnNjaCwgdW5zaWduZWQgbG9uZyBjbCwKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNtc2cgKnRjbSkKK3sKKwlzdHJ1Y3QgZHNtYXJrX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3QgcnRhdHRyICpydGE7CisKKwlEUFJJTlRLKCJkc21hcmtfZHVtcF9jbGFzcyhzY2ggJXAsW3FkaXNjICVwXSxjbGFzcyAlbGRcbiIsc2NoLHAsY2wpOworCWlmICghY2wgfHwgY2wgPiBwLT5pbmRpY2VzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl0Y20tPnRjbV9oYW5kbGUgPSBUQ19IX01BS0UoVENfSF9NQUooc2NoLT5oYW5kbGUpLGNsLTEpOworCXJ0YSA9IChzdHJ1Y3QgcnRhdHRyICopIGI7CisJUlRBX1BVVChza2IsVENBX09QVElPTlMsMCxOVUxMKTsKKwlSVEFfUFVUKHNrYixUQ0FfRFNNQVJLX01BU0ssMSwmcC0+bWFza1tjbC0xXSk7CisJUlRBX1BVVChza2IsVENBX0RTTUFSS19WQUxVRSwxLCZwLT52YWx1ZVtjbC0xXSk7CisJcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsLWI7CisJcmV0dXJuIHNrYi0+bGVuOworCitydGF0dHJfZmFpbHVyZToKKwlza2JfdHJpbShza2IsYi1za2ItPmRhdGEpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBkc21hcmtfZHVtcChzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZHNtYXJrX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3QgcnRhdHRyICpydGE7CisKKwlydGEgPSAoc3RydWN0IHJ0YXR0ciAqKSBiOworCVJUQV9QVVQoc2tiLFRDQV9PUFRJT05TLDAsTlVMTCk7CisJUlRBX1BVVChza2IsVENBX0RTTUFSS19JTkRJQ0VTLHNpemVvZihfX3UxNiksJnAtPmluZGljZXMpOworCWlmIChwLT5kZWZhdWx0X2luZGV4ICE9IE5PX0RFRkFVTFRfSU5ERVgpIHsKKwkJX191MTYgdG1wID0gcC0+ZGVmYXVsdF9pbmRleDsKKworCQlSVEFfUFVUKHNrYixUQ0FfRFNNQVJLX0RFRkFVTFRfSU5ERVgsIHNpemVvZihfX3UxNiksICZ0bXApOworCX0KKwlpZiAocC0+c2V0X3RjX2luZGV4KQorCQlSVEFfUFVUKHNrYiwgVENBX0RTTUFSS19TRVRfVENfSU5ERVgsIDAsIE5VTEwpOworCXJ0YS0+cnRhX2xlbiA9IHNrYi0+dGFpbC1iOworCXJldHVybiBza2ItPmxlbjsKKworcnRhdHRyX2ZhaWx1cmU6CisJc2tiX3RyaW0oc2tiLGItc2tiLT5kYXRhKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgUWRpc2NfY2xhc3Nfb3BzIGRzbWFya19jbGFzc19vcHMgPSB7CisJLmdyYWZ0CQk9CWRzbWFya19ncmFmdCwKKwkubGVhZgkJPQlkc21hcmtfbGVhZiwKKwkuZ2V0CQk9CWRzbWFya19nZXQsCisJLnB1dAkJPQlkc21hcmtfcHV0LAorCS5jaGFuZ2UJCT0JZHNtYXJrX2NoYW5nZSwKKwkuZGVsZXRlCQk9CWRzbWFya19kZWxldGUsCisJLndhbGsJCT0JZHNtYXJrX3dhbGssCisJLnRjZl9jaGFpbgk9CWRzbWFya19maW5kX3RjZiwKKwkuYmluZF90Y2YJPQlkc21hcmtfYmluZF9maWx0ZXIsCisJLnVuYmluZF90Y2YJPQlkc21hcmtfcHV0LAorCS5kdW1wCQk9CWRzbWFya19kdW1wX2NsYXNzLAorfTsKKworc3RhdGljIHN0cnVjdCBRZGlzY19vcHMgZHNtYXJrX3FkaXNjX29wcyA9IHsKKwkubmV4dAkJPQlOVUxMLAorCS5jbF9vcHMJCT0JJmRzbWFya19jbGFzc19vcHMsCisJLmlkCQk9CSJkc21hcmsiLAorCS5wcml2X3NpemUJPQlzaXplb2Yoc3RydWN0IGRzbWFya19xZGlzY19kYXRhKSwKKwkuZW5xdWV1ZQk9CWRzbWFya19lbnF1ZXVlLAorCS5kZXF1ZXVlCT0JZHNtYXJrX2RlcXVldWUsCisJLnJlcXVldWUJPQlkc21hcmtfcmVxdWV1ZSwKKwkuZHJvcAkJPQlkc21hcmtfZHJvcCwKKwkuaW5pdAkJPQlkc21hcmtfaW5pdCwKKwkucmVzZXQJCT0JZHNtYXJrX3Jlc2V0LAorCS5kZXN0cm95CT0JZHNtYXJrX2Rlc3Ryb3ksCisJLmNoYW5nZQkJPQlOVUxMLAorCS5kdW1wCQk9CWRzbWFya19kdW1wLAorCS5vd25lcgkJPQlUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRzbWFya19tb2R1bGVfaW5pdCh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9xZGlzYygmZHNtYXJrX3FkaXNjX29wcyk7Cit9CitzdGF0aWMgdm9pZCBfX2V4aXQgZHNtYXJrX21vZHVsZV9leGl0KHZvaWQpIAoreworCXVucmVnaXN0ZXJfcWRpc2MoJmRzbWFya19xZGlzY19vcHMpOworfQorbW9kdWxlX2luaXQoZHNtYXJrX21vZHVsZV9pbml0KQorbW9kdWxlX2V4aXQoZHNtYXJrX21vZHVsZV9leGl0KQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9maWZvLmMgYi9uZXQvc2NoZWQvc2NoX2ZpZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODg4MzA1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjaGVkL3NjaF9maWZvLmMKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBuZXQvc2NoZWQvc2NoX2ZpZm8uYwlUaGUgc2ltcGxlc3QgRklGTyBxdWV1ZS4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgorCisvKiAxIGJhbmQgRklGTyBwc2V1ZG8tInNjaGVkdWxlciIgKi8KKworc3RydWN0IGZpZm9fc2NoZWRfZGF0YQoreworCXVuc2lnbmVkIGxpbWl0OworfTsKKworc3RhdGljIGludAorYmZpZm9fZW5xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUWRpc2MqIHNjaCkKK3sKKwlzdHJ1Y3QgZmlmb19zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCisJaWYgKHNjaC0+cXN0YXRzLmJhY2tsb2cgKyBza2ItPmxlbiA8PSBxLT5saW1pdCkgeworCQlfX3NrYl9xdWV1ZV90YWlsKCZzY2gtPnEsIHNrYik7CisJCXNjaC0+cXN0YXRzLmJhY2tsb2cgKz0gc2tiLT5sZW47CisJCXNjaC0+YnN0YXRzLmJ5dGVzICs9IHNrYi0+bGVuOworCQlzY2gtPmJzdGF0cy5wYWNrZXRzKys7CisJCXJldHVybiAwOworCX0KKwlzY2gtPnFzdGF0cy5kcm9wcysrOworI2lmZGVmIENPTkZJR19ORVRfQ0xTX1BPTElDRQorCWlmIChzY2gtPnJlc2hhcGVfZmFpbD09TlVMTCB8fCBzY2gtPnJlc2hhcGVfZmFpbChza2IsIHNjaCkpCisjZW5kaWYKKwkJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIE5FVF9YTUlUX0RST1A7Cit9CisKK3N0YXRpYyBpbnQKK2JmaWZvX3JlcXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjKiBzY2gpCit7CisJX19za2JfcXVldWVfaGVhZCgmc2NoLT5xLCBza2IpOworCXNjaC0+cXN0YXRzLmJhY2tsb2cgKz0gc2tiLT5sZW47CisJc2NoLT5xc3RhdHMucmVxdWV1ZXMrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICoKK2JmaWZvX2RlcXVldWUoc3RydWN0IFFkaXNjKiBzY2gpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXNrYiA9IF9fc2tiX2RlcXVldWUoJnNjaC0+cSk7CisJaWYgKHNrYikKKwkJc2NoLT5xc3RhdHMuYmFja2xvZyAtPSBza2ItPmxlbjsKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IAorZmlmb19kcm9wKHN0cnVjdCBRZGlzYyogc2NoKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBfX3NrYl9kZXF1ZXVlX3RhaWwoJnNjaC0+cSk7CisJaWYgKHNrYikgeworCQl1bnNpZ25lZCBpbnQgbGVuID0gc2tiLT5sZW47CisJCXNjaC0+cXN0YXRzLmJhY2tsb2cgLT0gbGVuOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIGxlbjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitmaWZvX3Jlc2V0KHN0cnVjdCBRZGlzYyogc2NoKQoreworCXNrYl9xdWV1ZV9wdXJnZSgmc2NoLT5xKTsKKwlzY2gtPnFzdGF0cy5iYWNrbG9nID0gMDsKK30KKworc3RhdGljIGludAorcGZpZm9fZW5xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUWRpc2MqIHNjaCkKK3sKKwlzdHJ1Y3QgZmlmb19zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCisJaWYgKHNjaC0+cS5xbGVuIDwgcS0+bGltaXQpIHsKKwkJX19za2JfcXVldWVfdGFpbCgmc2NoLT5xLCBza2IpOworCQlzY2gtPmJzdGF0cy5ieXRlcyArPSBza2ItPmxlbjsKKwkJc2NoLT5ic3RhdHMucGFja2V0cysrOworCQlyZXR1cm4gMDsKKwl9CisJc2NoLT5xc3RhdHMuZHJvcHMrKzsKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19QT0xJQ0UKKwlpZiAoc2NoLT5yZXNoYXBlX2ZhaWw9PU5VTEwgfHwgc2NoLT5yZXNoYXBlX2ZhaWwoc2tiLCBzY2gpKQorI2VuZGlmCisJCWtmcmVlX3NrYihza2IpOworCXJldHVybiBORVRfWE1JVF9EUk9QOworfQorCitzdGF0aWMgaW50CitwZmlmb19yZXF1ZXVlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBRZGlzYyogc2NoKQoreworCV9fc2tiX3F1ZXVlX2hlYWQoJnNjaC0+cSwgc2tiKTsKKwlzY2gtPnFzdGF0cy5yZXF1ZXVlcysrOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCitwZmlmb19kZXF1ZXVlKHN0cnVjdCBRZGlzYyogc2NoKQoreworCXJldHVybiBfX3NrYl9kZXF1ZXVlKCZzY2gtPnEpOworfQorCitzdGF0aWMgaW50IGZpZm9faW5pdChzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IHJ0YXR0ciAqb3B0KQoreworCXN0cnVjdCBmaWZvX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisKKwlpZiAob3B0ID09IE5VTEwpIHsKKwkJdW5zaWduZWQgaW50IGxpbWl0ID0gc2NoLT5kZXYtPnR4X3F1ZXVlX2xlbiA/IDogMTsKKworCQlpZiAoc2NoLT5vcHMgPT0gJmJmaWZvX3FkaXNjX29wcykKKwkJCXEtPmxpbWl0ID0gbGltaXQqc2NoLT5kZXYtPm10dTsKKwkJZWxzZQkKKwkJCXEtPmxpbWl0ID0gbGltaXQ7CisJfSBlbHNlIHsKKwkJc3RydWN0IHRjX2ZpZm9fcW9wdCAqY3RsID0gUlRBX0RBVEEob3B0KTsKKwkJaWYgKG9wdC0+cnRhX2xlbiA8IFJUQV9MRU5HVEgoc2l6ZW9mKCpjdGwpKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlxLT5saW1pdCA9IGN0bC0+bGltaXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpZm9fZHVtcChzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZmlmb19zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCXN0cnVjdCB0Y19maWZvX3FvcHQgb3B0OworCisJb3B0LmxpbWl0ID0gcS0+bGltaXQ7CisJUlRBX1BVVChza2IsIFRDQV9PUFRJT05TLCBzaXplb2Yob3B0KSwgJm9wdCk7CisKKwlyZXR1cm4gc2tiLT5sZW47CisKK3J0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorCitzdHJ1Y3QgUWRpc2Nfb3BzIHBmaWZvX3FkaXNjX29wcyA9IHsKKwkubmV4dAkJPQlOVUxMLAorCS5jbF9vcHMJCT0JTlVMTCwKKwkuaWQJCT0JInBmaWZvIiwKKwkucHJpdl9zaXplCT0Jc2l6ZW9mKHN0cnVjdCBmaWZvX3NjaGVkX2RhdGEpLAorCS5lbnF1ZXVlCT0JcGZpZm9fZW5xdWV1ZSwKKwkuZGVxdWV1ZQk9CXBmaWZvX2RlcXVldWUsCisJLnJlcXVldWUJPQlwZmlmb19yZXF1ZXVlLAorCS5kcm9wCQk9CWZpZm9fZHJvcCwKKwkuaW5pdAkJPQlmaWZvX2luaXQsCisJLnJlc2V0CQk9CWZpZm9fcmVzZXQsCisJLmRlc3Ryb3kJPQlOVUxMLAorCS5jaGFuZ2UJCT0JZmlmb19pbml0LAorCS5kdW1wCQk9CWZpZm9fZHVtcCwKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCit9OworCitzdHJ1Y3QgUWRpc2Nfb3BzIGJmaWZvX3FkaXNjX29wcyA9IHsKKwkubmV4dAkJPQlOVUxMLAorCS5jbF9vcHMJCT0JTlVMTCwKKwkuaWQJCT0JImJmaWZvIiwKKwkucHJpdl9zaXplCT0Jc2l6ZW9mKHN0cnVjdCBmaWZvX3NjaGVkX2RhdGEpLAorCS5lbnF1ZXVlCT0JYmZpZm9fZW5xdWV1ZSwKKwkuZGVxdWV1ZQk9CWJmaWZvX2RlcXVldWUsCisJLnJlcXVldWUJPQliZmlmb19yZXF1ZXVlLAorCS5kcm9wCQk9CWZpZm9fZHJvcCwKKwkuaW5pdAkJPQlmaWZvX2luaXQsCisJLnJlc2V0CQk9CWZpZm9fcmVzZXQsCisJLmRlc3Ryb3kJPQlOVUxMLAorCS5jaGFuZ2UJCT0JZmlmb19pbml0LAorCS5kdW1wCQk9CWZpZm9fZHVtcCwKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCit9OworCitFWFBPUlRfU1lNQk9MKGJmaWZvX3FkaXNjX29wcyk7CitFWFBPUlRfU1lNQk9MKHBmaWZvX3FkaXNjX29wcyk7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYyBiL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMDFlMDIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYwpAQCAtMCwwICsxLDYwOSBAQAorLyoKKyAqIG5ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jCUdlbmVyaWMgcGFja2V0IHNjaGVkdWxlciByb3V0aW5lcy4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKiAgICAgICAgICAgICAgSmFtYWwgSGFkaSBTYWxpbSwgPGhhZGlAY3liZXJ1cy5jYT4gOTkwNjAxCisgKiAgICAgICAgICAgICAgLSBJbmdyZXNzIHN1cHBvcnQKKyAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CisKKy8qIE1haW4gdHJhbnNtaXNzaW9uIHF1ZXVlLiAqLworCisvKiBNYWluIHFkaXNjIHN0cnVjdHVyZSBsb2NrLiAKKworICAgSG93ZXZlciwgbW9kaWZpY2F0aW9ucworICAgdG8gZGF0YSwgcGFydGljaXBhdGluZyBpbiBzY2hlZHVsaW5nIG11c3QgYmUgYWRkaXRpb25hbGx5CisgICBwcm90ZWN0ZWQgd2l0aCBkZXYtPnF1ZXVlX2xvY2sgc3BpbmxvY2suCisKKyAgIFRoZSBpZGVhIGlzIHRoZSBmb2xsb3dpbmc6CisgICAtIGVucXVldWUsIGRlcXVldWUgYXJlIHNlcmlhbGl6ZWQgdmlhIHRvcCBsZXZlbCBkZXZpY2UKKyAgICAgc3BpbmxvY2sgZGV2LT5xdWV1ZV9sb2NrLgorICAgLSB0cmVlIHdhbGtpbmcgaXMgcHJvdGVjdGVkIGJ5IHJlYWRfbG9ja19iaChxZGlzY190cmVlX2xvY2spCisgICAgIGFuZCB0aGlzIGxvY2sgaXMgdXNlZCBvbmx5IGluIHByb2Nlc3MgY29udGV4dC4KKyAgIC0gdXBkYXRlcyB0byB0cmVlIGFyZSBtYWRlIHVuZGVyIHJ0bmwgc2VtYXBob3JlIG9yCisgICAgIGZyb20gc29mdGlycSBjb250ZXh0IChfX3FkaXNjX2Rlc3Ryb3kgcmN1LWNhbGxiYWNrKQorICAgICBoZW5jZSB0aGlzIGxvY2sgbmVlZHMgbG9jYWwgYmggZGlzYWJsaW5nLgorCisgICBxZGlzY190cmVlX2xvY2sgbXVzdCBiZSBncmFiYmVkIEJFRk9SRSBkZXYtPnF1ZXVlX2xvY2shCisgKi8KK0RFRklORV9SV0xPQ0socWRpc2NfdHJlZV9sb2NrKTsKKwordm9pZCBxZGlzY19sb2NrX3RyZWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl3cml0ZV9sb2NrX2JoKCZxZGlzY190cmVlX2xvY2spOworCXNwaW5fbG9ja19iaCgmZGV2LT5xdWV1ZV9sb2NrKTsKK30KKwordm9pZCBxZGlzY191bmxvY2tfdHJlZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNwaW5fdW5sb2NrX2JoKCZkZXYtPnF1ZXVlX2xvY2spOworCXdyaXRlX3VubG9ja19iaCgmcWRpc2NfdHJlZV9sb2NrKTsKK30KKworLyogCisgICBkZXYtPnF1ZXVlX2xvY2sgc2VyaWFsaXplcyBxdWV1ZSBhY2Nlc3NlcyBmb3IgdGhpcyBkZXZpY2UKKyAgIEFORCBkZXYtPnFkaXNjIHBvaW50ZXIgaXRzZWxmLgorCisgICBkZXYtPnhtaXRfbG9jayBzZXJpYWxpemVzIGFjY2Vzc2VzIHRvIGRldmljZSBkcml2ZXIuCisKKyAgIGRldi0+cXVldWVfbG9jayBhbmQgZGV2LT54bWl0X2xvY2sgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwKKyAgIGlmIG9uZSBpcyBncmFiYmVkLCBhbm90aGVyIG11c3QgYmUgZnJlZS4KKyAqLworCisKKy8qIEtpY2sgZGV2aWNlLgorICAgTm90ZSwgdGhhdCB0aGlzIHByb2NlZHVyZSBjYW4gYmUgY2FsbGVkIGJ5IGEgd2F0Y2hkb2cgdGltZXIsIHNvIHRoYXQKKyAgIHdlIGRvIG5vdCBjaGVjayBkZXYtPnRidXN5IGZsYWcgaGVyZS4KKworICAgUmV0dXJuczogIDAgIC0gcXVldWUgaXMgZW1wdHkuCisgICAgICAgICAgICA+MCAgLSBxdWV1ZSBpcyBub3QgZW1wdHksIGJ1dCB0aHJvdHRsZWQuCisJICAgIDwwICAtIHF1ZXVlIGlzIG5vdCBlbXB0eS4gRGV2aWNlIGlzIHRocm90dGxlZCwgaWYgZGV2LT50YnVzeSAhPSAwLgorCisgICBOT1RFOiBDYWxsZWQgdW5kZXIgZGV2LT5xdWV1ZV9sb2NrIHdpdGggbG9jYWxseSBkaXNhYmxlZCBCSC4KKyovCisKK2ludCBxZGlzY19yZXN0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IFFkaXNjICpxID0gZGV2LT5xZGlzYzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJLyogRGVxdWV1ZSBwYWNrZXQgKi8KKwlpZiAoKHNrYiA9IHEtPmRlcXVldWUocSkpICE9IE5VTEwpIHsKKwkJdW5zaWduZWQgbm9sb2NrID0gKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0xMVFgpOworCQkvKgorCQkgKiBXaGVuIHRoZSBkcml2ZXIgaGFzIExMVFggc2V0IGl0IGRvZXMgaXRzIG93biBsb2NraW5nCisJCSAqIGluIHN0YXJ0X3htaXQuIE5vIG5lZWQgdG8gYWRkIGFkZGl0aW9uYWwgb3ZlcmhlYWQgYnkKKwkJICogbG9ja2luZyBhZ2Fpbi4gVGhlc2UgY2hlY2tzIGFyZSB3b3J0aCBpdCBiZWNhdXNlCisJCSAqIGV2ZW4gdW5jb25nZXN0ZWQgbG9ja3MgY2FuIGJlIHF1aXRlIGV4cGVuc2l2ZS4KKwkJICogVGhlIGRyaXZlciBjYW4gZG8gdHJ5bG9jayBsaWtlIGhlcmUgdG9vLCBpbiBjYXNlCisJCSAqIG9mIGxvY2sgY29uZ2VzdGlvbiBpdCBzaG91bGQgcmV0dXJuIC0xIGFuZCB0aGUgcGFja2V0CisJCSAqIHdpbGwgYmUgcmVxdWV1ZWQuCisJCSAqLworCQlpZiAoIW5vbG9jaykgeworCQkJaWYgKCFzcGluX3RyeWxvY2soJmRldi0+eG1pdF9sb2NrKSkgeworCQkJY29sbGlzaW9uOgorCQkJCS8qIFNvLCBzb21lb25lIGdyYWJiZWQgdGhlIGRyaXZlci4gKi8KKwkJCQkKKwkJCQkvKiBJdCBtYXkgYmUgdHJhbnNpZW50IGNvbmZpZ3VyYXRpb24gZXJyb3IsCisJCQkJICAgd2hlbiBoYXJkX3N0YXJ0X3htaXQoKSByZWN1cnNlcy4gV2UgZGV0ZWN0CisJCQkJICAgaXQgYnkgY2hlY2tpbmcgeG1pdCBvd25lciBhbmQgZHJvcCB0aGUKKwkJCQkgICBwYWNrZXQgd2hlbiBkZWFkbG9vcCBpcyBkZXRlY3RlZC4KKwkJCQkqLworCQkJCWlmIChkZXYtPnhtaXRfbG9ja19vd25lciA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpIHsKKwkJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiRGVhZCBsb29wIG9uIG5ldGRldmljZSAlcywgZml4IGl0IHVyZ2VudGx5IVxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlfX2dldF9jcHVfdmFyKG5ldGRldl9yeF9zdGF0KS5jcHVfY29sbGlzaW9uKys7CisJCQkJZ290byByZXF1ZXVlOworCQkJfQorCQkJLyogUmVtZW1iZXIgdGhhdCB0aGUgZHJpdmVyIGlzIGdyYWJiZWQgYnkgdXMuICovCisJCQlkZXYtPnhtaXRfbG9ja19vd25lciA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwkJfQorCQkKKwkJeworCQkJLyogQW5kIHJlbGVhc2UgcXVldWUgKi8KKwkJCXNwaW5fdW5sb2NrKCZkZXYtPnF1ZXVlX2xvY2spOworCisJCQlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgeworCQkJCWludCByZXQ7CisJCQkJaWYgKG5ldGRldl9uaXQpCisJCQkJCWRldl9xdWV1ZV94bWl0X25pdChza2IsIGRldik7CisKKwkJCQlyZXQgPSBkZXYtPmhhcmRfc3RhcnRfeG1pdChza2IsIGRldik7CisJCQkJaWYgKHJldCA9PSBORVRERVZfVFhfT0spIHsgCisJCQkJCWlmICghbm9sb2NrKSB7CisJCQkJCQlkZXYtPnhtaXRfbG9ja19vd25lciA9IC0xOworCQkJCQkJc3Bpbl91bmxvY2soJmRldi0+eG1pdF9sb2NrKTsKKwkJCQkJfQorCQkJCQlzcGluX2xvY2soJmRldi0+cXVldWVfbG9jayk7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJaWYgKHJldCA9PSBORVRERVZfVFhfTE9DS0VEICYmIG5vbG9jaykgeworCQkJCQlzcGluX2xvY2soJmRldi0+cXVldWVfbG9jayk7CisJCQkJCWdvdG8gY29sbGlzaW9uOyAKKwkJCQl9CisJCQl9CisKKwkJCS8qIE5FVERFVl9UWF9CVVNZIC0gd2UgbmVlZCB0byByZXF1ZXVlICovCisJCQkvKiBSZWxlYXNlIHRoZSBkcml2ZXIgKi8KKwkJCWlmICghbm9sb2NrKSB7IAorCQkJCWRldi0+eG1pdF9sb2NrX293bmVyID0gLTE7CisJCQkJc3Bpbl91bmxvY2soJmRldi0+eG1pdF9sb2NrKTsKKwkJCX0gCisJCQlzcGluX2xvY2soJmRldi0+cXVldWVfbG9jayk7CisJCQlxID0gZGV2LT5xZGlzYzsKKwkJfQorCisJCS8qIERldmljZSBraWNrZWQgdXMgb3V0IDooCisJCSAgIFRoaXMgaXMgcG9zc2libGUgaW4gdGhyZWUgY2FzZXM6CisKKwkJICAgMC4gZHJpdmVyIGlzIGxvY2tlZAorCQkgICAxLiBmYXN0cm91dGUgaXMgZW5hYmxlZAorCQkgICAyLiBkZXZpY2UgY2Fubm90IGRldGVybWluZSBidXN5IHN0YXRlCisJCSAgICAgIGJlZm9yZSBzdGFydCBvZiB0cmFuc21pc3Npb24gKGYuZS4gZGlhbG91dCkKKwkJICAgMy4gZGV2aWNlIGlzIGJ1Z2d5IChwcHApCisJCSAqLworCityZXF1ZXVlOgorCQlxLT5vcHMtPnJlcXVldWUoc2tiLCBxKTsKKwkJbmV0aWZfc2NoZWR1bGUoZGV2KTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiBxLT5xLnFsZW47Cit9CisKK3N0YXRpYyB2b2lkIGRldl93YXRjaGRvZyh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopYXJnOworCisJc3Bpbl9sb2NrKCZkZXYtPnhtaXRfbG9jayk7CisJaWYgKGRldi0+cWRpc2MgIT0gJm5vb3BfcWRpc2MpIHsKKwkJaWYgKG5ldGlmX2RldmljZV9wcmVzZW50KGRldikgJiYKKwkJICAgIG5ldGlmX3J1bm5pbmcoZGV2KSAmJgorCQkgICAgbmV0aWZfY2Fycmllcl9vayhkZXYpKSB7CisJCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmCisJCQkgICAgKGppZmZpZXMgLSBkZXYtPnRyYW5zX3N0YXJ0KSA+IGRldi0+d2F0Y2hkb2dfdGltZW8pIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJORVRERVYgV0FUQ0hET0c6ICVzOiB0cmFuc21pdCB0aW1lZCBvdXRcbiIsIGRldi0+bmFtZSk7CisJCQkJZGV2LT50eF90aW1lb3V0KGRldik7CisJCQl9CisJCQlpZiAoIW1vZF90aW1lcigmZGV2LT53YXRjaGRvZ190aW1lciwgamlmZmllcyArIGRldi0+d2F0Y2hkb2dfdGltZW8pKQorCQkJCWRldl9ob2xkKGRldik7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmRldi0+eG1pdF9sb2NrKTsKKworCWRldl9wdXQoZGV2KTsKK30KKworc3RhdGljIHZvaWQgZGV2X3dhdGNoZG9nX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbml0X3RpbWVyKCZkZXYtPndhdGNoZG9nX3RpbWVyKTsKKwlkZXYtPndhdGNoZG9nX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJZGV2LT53YXRjaGRvZ190aW1lci5mdW5jdGlvbiA9IGRldl93YXRjaGRvZzsKK30KKwordm9pZCBfX25ldGRldl93YXRjaGRvZ191cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmIChkZXYtPnR4X3RpbWVvdXQpIHsKKwkJaWYgKGRldi0+d2F0Y2hkb2dfdGltZW8gPD0gMCkKKwkJCWRldi0+d2F0Y2hkb2dfdGltZW8gPSA1KkhaOworCQlpZiAoIW1vZF90aW1lcigmZGV2LT53YXRjaGRvZ190aW1lciwgamlmZmllcyArIGRldi0+d2F0Y2hkb2dfdGltZW8pKQorCQkJZGV2X2hvbGQoZGV2KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRldl93YXRjaGRvZ191cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNwaW5fbG9ja19iaCgmZGV2LT54bWl0X2xvY2spOworCV9fbmV0ZGV2X3dhdGNoZG9nX3VwKGRldik7CisJc3Bpbl91bmxvY2tfYmgoJmRldi0+eG1pdF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgZGV2X3dhdGNoZG9nX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzcGluX2xvY2tfYmgoJmRldi0+eG1pdF9sb2NrKTsKKwlpZiAoZGVsX3RpbWVyKCZkZXYtPndhdGNoZG9nX3RpbWVyKSkKKwkJX19kZXZfcHV0KGRldik7CisJc3Bpbl91bmxvY2tfYmgoJmRldi0+eG1pdF9sb2NrKTsKK30KKworLyogIk5PT1AiIHNjaGVkdWxlcjogdGhlIGJlc3Qgc2NoZWR1bGVyLCByZWNvbW1lbmRlZCBmb3IgYWxsIGludGVyZmFjZXMKKyAgIHVuZGVyIGFsbCBjaXJjdW1zdGFuY2VzLiBJdCBpcyBkaWZmaWN1bHQgdG8gaW52ZW50IGFueXRoaW5nIGZhc3RlciBvcgorICAgY2hlYXBlci4KKyAqLworCitzdGF0aWMgaW50Citub29wX2VucXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjICogcWRpc2MpCit7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIE5FVF9YTUlUX0NOOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgorbm9vcF9kZXF1ZXVlKHN0cnVjdCBRZGlzYyAqIHFkaXNjKQoreworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50Citub29wX3JlcXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjKiBxZGlzYykKK3sKKwlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgZGVmZXJyZWQgb3V0cHV0LiBJdCBpcyBidWdneS5cbiIsIHNrYi0+ZGV2LT5uYW1lKTsKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gTkVUX1hNSVRfQ047Cit9CisKK3N0cnVjdCBRZGlzY19vcHMgbm9vcF9xZGlzY19vcHMgPSB7CisJLm5leHQJCT0JTlVMTCwKKwkuY2xfb3BzCQk9CU5VTEwsCisJLmlkCQk9CSJub29wIiwKKwkucHJpdl9zaXplCT0JMCwKKwkuZW5xdWV1ZQk9CW5vb3BfZW5xdWV1ZSwKKwkuZGVxdWV1ZQk9CW5vb3BfZGVxdWV1ZSwKKwkucmVxdWV1ZQk9CW5vb3BfcmVxdWV1ZSwKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCit9OworCitzdHJ1Y3QgUWRpc2Mgbm9vcF9xZGlzYyA9IHsKKwkuZW5xdWV1ZQk9CW5vb3BfZW5xdWV1ZSwKKwkuZGVxdWV1ZQk9CW5vb3BfZGVxdWV1ZSwKKwkuZmxhZ3MJCT0JVENRX0ZfQlVJTFRJTiwKKwkub3BzCQk9CSZub29wX3FkaXNjX29wcywJCisJLmxpc3QJCT0JTElTVF9IRUFEX0lOSVQobm9vcF9xZGlzYy5saXN0KSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgUWRpc2Nfb3BzIG5vcXVldWVfcWRpc2Nfb3BzID0geworCS5uZXh0CQk9CU5VTEwsCisJLmNsX29wcwkJPQlOVUxMLAorCS5pZAkJPQkibm9xdWV1ZSIsCisJLnByaXZfc2l6ZQk9CTAsCisJLmVucXVldWUJPQlub29wX2VucXVldWUsCisJLmRlcXVldWUJPQlub29wX2RlcXVldWUsCisJLnJlcXVldWUJPQlub29wX3JlcXVldWUsCisJLm93bmVyCQk9CVRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIHN0cnVjdCBRZGlzYyBub3F1ZXVlX3FkaXNjID0geworCS5lbnF1ZXVlCT0JTlVMTCwKKwkuZGVxdWV1ZQk9CW5vb3BfZGVxdWV1ZSwKKwkuZmxhZ3MJCT0JVENRX0ZfQlVJTFRJTiwKKwkub3BzCQk9CSZub3F1ZXVlX3FkaXNjX29wcywKKwkubGlzdAkJPQlMSVNUX0hFQURfSU5JVChub3F1ZXVlX3FkaXNjLmxpc3QpLAorfTsKKworCitzdGF0aWMgY29uc3QgdTggcHJpbzJiYW5kW1RDX1BSSU9fTUFYKzFdID0KKwl7IDEsIDIsIDIsIDIsIDEsIDIsIDAsIDAgLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxIH07CisKKy8qIDMtYmFuZCBGSUZPIHF1ZXVlOiBvbGQgc3R5bGUsIGJ1dCBzaG91bGQgYmUgYSBiaXQgZmFzdGVyIHRoYW4KKyAgIGdlbmVyaWMgcHJpbytmaWZvIGNvbWJpbmF0aW9uLgorICovCisKK3N0YXRpYyBpbnQKK3BmaWZvX2Zhc3RfZW5xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUWRpc2MqIHFkaXNjKQoreworCXN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QgPSBxZGlzY19wcml2KHFkaXNjKTsKKworCWxpc3QgKz0gcHJpbzJiYW5kW3NrYi0+cHJpb3JpdHkmVENfUFJJT19NQVhdOworCisJaWYgKGxpc3QtPnFsZW4gPCBxZGlzYy0+ZGV2LT50eF9xdWV1ZV9sZW4pIHsKKwkJX19za2JfcXVldWVfdGFpbChsaXN0LCBza2IpOworCQlxZGlzYy0+cS5xbGVuKys7CisJCXFkaXNjLT5ic3RhdHMuYnl0ZXMgKz0gc2tiLT5sZW47CisJCXFkaXNjLT5ic3RhdHMucGFja2V0cysrOworCQlyZXR1cm4gMDsKKwl9CisJcWRpc2MtPnFzdGF0cy5kcm9wcysrOworCWtmcmVlX3NrYihza2IpOworCXJldHVybiBORVRfWE1JVF9EUk9QOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgorcGZpZm9fZmFzdF9kZXF1ZXVlKHN0cnVjdCBRZGlzYyogcWRpc2MpCit7CisJaW50IHByaW87CisJc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCA9IHFkaXNjX3ByaXYocWRpc2MpOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlmb3IgKHByaW8gPSAwOyBwcmlvIDwgMzsgcHJpbysrLCBsaXN0KyspIHsKKwkJc2tiID0gX19za2JfZGVxdWV1ZShsaXN0KTsKKwkJaWYgKHNrYikgeworCQkJcWRpc2MtPnEucWxlbi0tOworCQkJcmV0dXJuIHNrYjsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludAorcGZpZm9fZmFzdF9yZXF1ZXVlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBRZGlzYyogcWRpc2MpCit7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCA9IHFkaXNjX3ByaXYocWRpc2MpOworCisJbGlzdCArPSBwcmlvMmJhbmRbc2tiLT5wcmlvcml0eSZUQ19QUklPX01BWF07CisKKwlfX3NrYl9xdWV1ZV9oZWFkKGxpc3QsIHNrYik7CisJcWRpc2MtPnEucWxlbisrOworCXFkaXNjLT5xc3RhdHMucmVxdWV1ZXMrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3BmaWZvX2Zhc3RfcmVzZXQoc3RydWN0IFFkaXNjKiBxZGlzYykKK3sKKwlpbnQgcHJpbzsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0ID0gcWRpc2NfcHJpdihxZGlzYyk7CisKKwlmb3IgKHByaW89MDsgcHJpbyA8IDM7IHByaW8rKykKKwkJc2tiX3F1ZXVlX3B1cmdlKGxpc3QrcHJpbyk7CisJcWRpc2MtPnEucWxlbiA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcGZpZm9fZmFzdF9kdW1wKHN0cnVjdCBRZGlzYyAqcWRpc2MsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJc3RydWN0IHRjX3ByaW9fcW9wdCBvcHQ7CisKKwlvcHQuYmFuZHMgPSAzOyAKKwltZW1jcHkoJm9wdC5wcmlvbWFwLCBwcmlvMmJhbmQsIFRDX1BSSU9fTUFYKzEpOworCVJUQV9QVVQoc2tiLCBUQ0FfT1BUSU9OUywgc2l6ZW9mKG9wdCksICZvcHQpOworCXJldHVybiBza2ItPmxlbjsKKworcnRhdHRyX2ZhaWx1cmU6CisJc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgcGZpZm9fZmFzdF9pbml0KHN0cnVjdCBRZGlzYyAqcWRpc2MsIHN0cnVjdCBydGF0dHIgKm9wdCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0ID0gcWRpc2NfcHJpdihxZGlzYyk7CisKKwlmb3IgKGk9MDsgaTwzOyBpKyspCisJCXNrYl9xdWV1ZV9oZWFkX2luaXQobGlzdCtpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IFFkaXNjX29wcyBwZmlmb19mYXN0X29wcyA9IHsKKwkubmV4dAkJPQlOVUxMLAorCS5jbF9vcHMJCT0JTlVMTCwKKwkuaWQJCT0JInBmaWZvX2Zhc3QiLAorCS5wcml2X3NpemUJPQkzICogc2l6ZW9mKHN0cnVjdCBza19idWZmX2hlYWQpLAorCS5lbnF1ZXVlCT0JcGZpZm9fZmFzdF9lbnF1ZXVlLAorCS5kZXF1ZXVlCT0JcGZpZm9fZmFzdF9kZXF1ZXVlLAorCS5yZXF1ZXVlCT0JcGZpZm9fZmFzdF9yZXF1ZXVlLAorCS5pbml0CQk9CXBmaWZvX2Zhc3RfaW5pdCwKKwkucmVzZXQJCT0JcGZpZm9fZmFzdF9yZXNldCwKKwkuZHVtcAkJPQlwZmlmb19mYXN0X2R1bXAsCisJLm93bmVyCQk9CVRISVNfTU9EVUxFLAorfTsKKworc3RydWN0IFFkaXNjICogcWRpc2NfY3JlYXRlX2RmbHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IFFkaXNjX29wcyAqb3BzKQoreworCXZvaWQgKnA7CisJc3RydWN0IFFkaXNjICpzY2g7CisJaW50IHNpemU7CisKKwkvKiBlbnN1cmUgdGhhdCB0aGUgUWRpc2MgYW5kIHRoZSBwcml2YXRlIGRhdGEgYXJlIDMyLWJ5dGUgYWxpZ25lZCAqLworCXNpemUgPSAoKHNpemVvZigqc2NoKSArIFFESVNDX0FMSUdOX0NPTlNUKSAmIH5RRElTQ19BTElHTl9DT05TVCk7CisJc2l6ZSArPSBvcHMtPnByaXZfc2l6ZSArIFFESVNDX0FMSUdOX0NPTlNUOworCisJcCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwKQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQocCwgMCwgc2l6ZSk7CisKKwlzY2ggPSAoc3RydWN0IFFkaXNjICopKCgodW5zaWduZWQgbG9uZylwICsgUURJU0NfQUxJR05fQ09OU1QpIAorCQkJICAgICAgICYgflFESVNDX0FMSUdOX0NPTlNUKTsKKwlzY2gtPnBhZGRlZCA9IChjaGFyICopc2NoIC0gKGNoYXIgKilwOworCisJSU5JVF9MSVNUX0hFQUQoJnNjaC0+bGlzdCk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2NoLT5xKTsKKwlzY2gtPm9wcyA9IG9wczsKKwlzY2gtPmVucXVldWUgPSBvcHMtPmVucXVldWU7CisJc2NoLT5kZXF1ZXVlID0gb3BzLT5kZXF1ZXVlOworCXNjaC0+ZGV2ID0gZGV2OworCWRldl9ob2xkKGRldik7CisJc2NoLT5zdGF0c19sb2NrID0gJmRldi0+cXVldWVfbG9jazsKKwlhdG9taWNfc2V0KCZzY2gtPnJlZmNudCwgMSk7CisJaWYgKCFvcHMtPmluaXQgfHwgb3BzLT5pbml0KHNjaCwgTlVMTCkgPT0gMCkKKwkJcmV0dXJuIHNjaDsKKworCWRldl9wdXQoZGV2KTsKKwlrZnJlZShwKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogVW5kZXIgZGV2LT5xdWV1ZV9sb2NrIGFuZCBCSCEgKi8KKwordm9pZCBxZGlzY19yZXNldChzdHJ1Y3QgUWRpc2MgKnFkaXNjKQoreworCXN0cnVjdCBRZGlzY19vcHMgKm9wcyA9IHFkaXNjLT5vcHM7CisKKwlpZiAob3BzLT5yZXNldCkKKwkJb3BzLT5yZXNldChxZGlzYyk7Cit9CisKKy8qIHRoaXMgaXMgdGhlIHJjdSBjYWxsYmFjayBmdW5jdGlvbiB0byBjbGVhbiB1cCBhIHFkaXNjIHdoZW4gdGhlcmUgCisgKiBhcmUgbm8gZnVydGhlciByZWZlcmVuY2VzIHRvIGl0ICovCisKK3N0YXRpYyB2b2lkIF9fcWRpc2NfZGVzdHJveShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IFFkaXNjICpxZGlzYyA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgUWRpc2MsIHFfcmN1KTsKKwlzdHJ1Y3QgUWRpc2Nfb3BzICAqb3BzID0gcWRpc2MtPm9wczsKKworI2lmZGVmIENPTkZJR19ORVRfRVNUSU1BVE9SCisJZ2VuX2tpbGxfZXN0aW1hdG9yKCZxZGlzYy0+YnN0YXRzLCAmcWRpc2MtPnJhdGVfZXN0KTsKKyNlbmRpZgorCXdyaXRlX2xvY2soJnFkaXNjX3RyZWVfbG9jayk7CisJaWYgKG9wcy0+cmVzZXQpCisJCW9wcy0+cmVzZXQocWRpc2MpOworCWlmIChvcHMtPmRlc3Ryb3kpCisJCW9wcy0+ZGVzdHJveShxZGlzYyk7CisJd3JpdGVfdW5sb2NrKCZxZGlzY190cmVlX2xvY2spOworCW1vZHVsZV9wdXQob3BzLT5vd25lcik7CisKKwlkZXZfcHV0KHFkaXNjLT5kZXYpOworCWtmcmVlKChjaGFyICopIHFkaXNjIC0gcWRpc2MtPnBhZGRlZCk7Cit9CisKKy8qIFVuZGVyIGRldi0+cXVldWVfbG9jayBhbmQgQkghICovCisKK3ZvaWQgcWRpc2NfZGVzdHJveShzdHJ1Y3QgUWRpc2MgKnFkaXNjKQoreworCXN0cnVjdCBsaXN0X2hlYWQgY3FsID0gTElTVF9IRUFEX0lOSVQoY3FsKTsKKwlzdHJ1Y3QgUWRpc2MgKmNxLCAqcSwgKm47CisKKwlpZiAocWRpc2MtPmZsYWdzICYgVENRX0ZfQlVJTFRJTiB8fAorCQkhYXRvbWljX2RlY19hbmRfdGVzdCgmcWRpc2MtPnJlZmNudCkpCisJCXJldHVybjsKKworCWlmICghbGlzdF9lbXB0eSgmcWRpc2MtPmxpc3QpKSB7CisJCWlmIChxZGlzYy0+b3BzLT5jbF9vcHMgPT0gTlVMTCkKKwkJCWxpc3RfZGVsKCZxZGlzYy0+bGlzdCk7CisJCWVsc2UKKwkJCWxpc3RfbW92ZSgmcWRpc2MtPmxpc3QsICZjcWwpOworCX0KKworCS8qIHVubGluayBpbm5lciBxZGlzY3MgZnJvbSBkZXYtPnFkaXNjX2xpc3QgaW1tZWRpYXRlbHkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNxLCAmY3FsLCBsaXN0KQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocSwgbiwgJnFkaXNjLT5kZXYtPnFkaXNjX2xpc3QsIGxpc3QpCisJCQlpZiAoVENfSF9NQUoocS0+cGFyZW50KSA9PSBUQ19IX01BSihjcS0+aGFuZGxlKSkgeworCQkJCWlmIChxLT5vcHMtPmNsX29wcyA9PSBOVUxMKQorCQkJCQlsaXN0X2RlbF9pbml0KCZxLT5saXN0KTsKKwkJCQllbHNlCisJCQkJCWxpc3RfbW92ZV90YWlsKCZxLT5saXN0LCAmY3FsKTsKKwkJCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY3EsIG4sICZjcWwsIGxpc3QpCisJCWxpc3RfZGVsX2luaXQoJmNxLT5saXN0KTsKKworCWNhbGxfcmN1KCZxZGlzYy0+cV9yY3UsIF9fcWRpc2NfZGVzdHJveSk7Cit9CisKK3ZvaWQgZGV2X2FjdGl2YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogTm8gcXVldWVpbmcgZGlzY2lwbGluZSBpcyBhdHRhY2hlZCB0byBkZXZpY2U7CisJICAgY3JlYXRlIGRlZmF1bHQgb25lIGkuZS4gcGZpZm9fZmFzdCBmb3IgZGV2aWNlcywKKwkgICB3aGljaCBuZWVkIHF1ZXVlaW5nIGFuZCBub3F1ZXVlX3FkaXNjIGZvcgorCSAgIHZpcnR1YWwgaW50ZXJmYWNlcworCSAqLworCisJaWYgKGRldi0+cWRpc2Nfc2xlZXBpbmcgPT0gJm5vb3BfcWRpc2MpIHsKKwkJc3RydWN0IFFkaXNjICpxZGlzYzsKKwkJaWYgKGRldi0+dHhfcXVldWVfbGVuKSB7CisJCQlxZGlzYyA9IHFkaXNjX2NyZWF0ZV9kZmx0KGRldiwgJnBmaWZvX2Zhc3Rfb3BzKTsKKwkJCWlmIChxZGlzYyA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGFjdGl2YXRpb24gZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXdyaXRlX2xvY2tfYmgoJnFkaXNjX3RyZWVfbG9jayk7CisJCQlsaXN0X2FkZF90YWlsKCZxZGlzYy0+bGlzdCwgJmRldi0+cWRpc2NfbGlzdCk7CisJCQl3cml0ZV91bmxvY2tfYmgoJnFkaXNjX3RyZWVfbG9jayk7CisJCX0gZWxzZSB7CisJCQlxZGlzYyA9ICAmbm9xdWV1ZV9xZGlzYzsKKwkJfQorCQl3cml0ZV9sb2NrX2JoKCZxZGlzY190cmVlX2xvY2spOworCQlkZXYtPnFkaXNjX3NsZWVwaW5nID0gcWRpc2M7CisJCXdyaXRlX3VubG9ja19iaCgmcWRpc2NfdHJlZV9sb2NrKTsKKwl9CisKKwlzcGluX2xvY2tfYmgoJmRldi0+cXVldWVfbG9jayk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGRldi0+cWRpc2MsIGRldi0+cWRpc2Nfc2xlZXBpbmcpOworCWlmIChkZXYtPnFkaXNjICE9ICZub3F1ZXVlX3FkaXNjKSB7CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQlkZXZfd2F0Y2hkb2dfdXAoZGV2KTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmRldi0+cXVldWVfbG9jayk7Cit9CisKK3ZvaWQgZGV2X2RlYWN0aXZhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgUWRpc2MgKnFkaXNjOworCisJc3Bpbl9sb2NrX2JoKCZkZXYtPnF1ZXVlX2xvY2spOworCXFkaXNjID0gZGV2LT5xZGlzYzsKKwlkZXYtPnFkaXNjID0gJm5vb3BfcWRpc2M7CisKKwlxZGlzY19yZXNldChxZGlzYyk7CisKKwlzcGluX3VubG9ja19iaCgmZGV2LT5xdWV1ZV9sb2NrKTsKKworCWRldl93YXRjaGRvZ19kb3duKGRldik7CisKKwl3aGlsZSAodGVzdF9iaXQoX19MSU5LX1NUQVRFX1NDSEVELCAmZGV2LT5zdGF0ZSkpCisJCXlpZWxkKCk7CisKKwlzcGluX3VubG9ja193YWl0KCZkZXYtPnhtaXRfbG9jayk7Cit9CisKK3ZvaWQgZGV2X2luaXRfc2NoZWR1bGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcWRpc2NfbG9ja190cmVlKGRldik7CisJZGV2LT5xZGlzYyA9ICZub29wX3FkaXNjOworCWRldi0+cWRpc2Nfc2xlZXBpbmcgPSAmbm9vcF9xZGlzYzsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5xZGlzY19saXN0KTsKKwlxZGlzY191bmxvY2tfdHJlZShkZXYpOworCisJZGV2X3dhdGNoZG9nX2luaXQoZGV2KTsKK30KKwordm9pZCBkZXZfc2h1dGRvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgUWRpc2MgKnFkaXNjOworCisJcWRpc2NfbG9ja190cmVlKGRldik7CisJcWRpc2MgPSBkZXYtPnFkaXNjX3NsZWVwaW5nOworCWRldi0+cWRpc2MgPSAmbm9vcF9xZGlzYzsKKwlkZXYtPnFkaXNjX3NsZWVwaW5nID0gJm5vb3BfcWRpc2M7CisJcWRpc2NfZGVzdHJveShxZGlzYyk7CisjaWYgZGVmaW5lZChDT05GSUdfTkVUX1NDSF9JTkdSRVNTKSB8fCBkZWZpbmVkKENPTkZJR19ORVRfU0NIX0lOR1JFU1NfTU9EVUxFKQorICAgICAgICBpZiAoKHFkaXNjID0gZGV2LT5xZGlzY19pbmdyZXNzKSAhPSBOVUxMKSB7CisJCWRldi0+cWRpc2NfaW5ncmVzcyA9IE5VTEw7CisJCXFkaXNjX2Rlc3Ryb3kocWRpc2MpOworICAgICAgICB9CisjZW5kaWYKKwlCVUdfVFJBUCghdGltZXJfcGVuZGluZygmZGV2LT53YXRjaGRvZ190aW1lcikpOworCXFkaXNjX3VubG9ja190cmVlKGRldik7Cit9CisKK0VYUE9SVF9TWU1CT0woX19uZXRkZXZfd2F0Y2hkb2dfdXApOworRVhQT1JUX1NZTUJPTChub29wX3FkaXNjKTsKK0VYUE9SVF9TWU1CT0wobm9vcF9xZGlzY19vcHMpOworRVhQT1JUX1NZTUJPTChxZGlzY19jcmVhdGVfZGZsdCk7CitFWFBPUlRfU1lNQk9MKHFkaXNjX2Rlc3Ryb3kpOworRVhQT1JUX1NZTUJPTChxZGlzY19yZXNldCk7CitFWFBPUlRfU1lNQk9MKHFkaXNjX3Jlc3RhcnQpOworRVhQT1JUX1NZTUJPTChxZGlzY19sb2NrX3RyZWUpOworRVhQT1JUX1NZTUJPTChxZGlzY191bmxvY2tfdHJlZSk7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2dyZWQuYyBiL25ldC9zY2hlZC9zY2hfZ3JlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YzE3MWMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2NoZWQvc2NoX2dyZWQuYwpAQCAtMCwwICsxLDYzMCBAQAorLyoKKyAqIG5ldC9zY2hlZC9zY2hfZ3JlZC5jCUdlbmVyaWMgUmFuZG9tIEVhcmx5IERldGVjdGlvbiBxdWV1ZS4KKyAqCisgKgorICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczogICAgSiBIYWRpIFNhbGltIChoYWRpQGN5YmVydXMuY2EpIDE5OTgtMjAwMgorICoKKyAqICAgICAgICAgICAgIDk5MTEyOTogLSAgQnVnIGZpeCB3aXRoIGdyaW8gbW9kZQorICoJCSAgICAgICAtIGEgYmV0dGVyIHNpbmcuIEF2Z1EgbW9kZSB3aXRoIEdyaW8oV1JFRCkKKyAqCQkgICAgICAgLSBBIGZpbmVyIGdyYWluZWQgVlEgZGVxdWV1ZSBiYXNlZCBvbiBzdWdlc3Rpb24KKyAqCQkgICAgICAgICBmcm9tIFJlbiBMaXUKKyAqCQkgICAgICAgLSBNb3JlIGVycm9yIGNoZWNrcworICoKKyAqCisgKgorICogIEZvciBhbGwgdGhlIGdsb3Jpb3VzIGNvbW1lbnRzIGxvb2sgYXQgQWxleGV5J3Mgc2NoX3JlZC5jCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgorCisjaWYgMSAvKiBjb250cm9sICovCisjZGVmaW5lIERQUklOVEsoZm9ybWF0LGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCwjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBEUFJJTlRLKGZvcm1hdCxhcmdzLi4uKQorI2VuZGlmCisKKyNpZiAwIC8qIGRhdGEgKi8KKyNkZWZpbmUgRDJQUklOVEsoZm9ybWF0LGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCwjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBEMlBSSU5USyhmb3JtYXQsYXJncy4uLikKKyNlbmRpZgorCitzdHJ1Y3QgZ3JlZF9zY2hlZF9kYXRhOworc3RydWN0IGdyZWRfc2NoZWQ7CisKK3N0cnVjdCBncmVkX3NjaGVkX2RhdGEKK3sKKy8qIFBhcmFtZXRlcnMgKi8KKwl1MzIJCWxpbWl0OwkJLyogSEFSRCBtYXhpbWFsIHF1ZXVlIGxlbmd0aAkqLworCXUzMgkJcXRoX21pbjsJLyogTWluIGF2ZXJhZ2UgbGVuZ3RoIHRocmVzaG9sZDogQSBzY2FsZWQgKi8KKwl1MzIJCXF0aF9tYXg7CS8qIE1heCBhdmVyYWdlIGxlbmd0aCB0aHJlc2hvbGQ6IEEgc2NhbGVkICovCisJdTMyICAgICAgCURQOwkJLyogdGhlIGRyb3AgcHJhbWF0ZXJzICovCisJY2hhcgkJV2xvZzsJCS8qIGxvZyhXKQkJKi8KKwljaGFyCQlQbG9nOwkJLyogcmFuZG9tIG51bWJlciBiaXRzCSovCisJdTMyCQlTY2VsbF9tYXg7CisJdTMyCQlSbWFzazsKKwl1MzIJCWJ5dGVzaW47CS8qIGJ5dGVzIHNlZW4gb24gdmlydHVhbFEgc28gZmFyKi8KKwl1MzIJCXBhY2tldHNpbjsJLyogcGFja2V0cyBzZWVuIG9uIHZpcnR1YWxRIHNvIGZhciovCisJdTMyCQliYWNrbG9nOwkvKiBieXRlcyBvbiB0aGUgdmlydHVhbFEgKi8KKwl1MzIJCWZvcmNlZDsJLyogcGFja2V0cyBkcm9wcGVkIGZvciBleGNlZWRpbmcgbGltaXRzICovCisJdTMyCQllYXJseTsJLyogcGFja2V0cyBkcm9wcGVkIGFzIGEgd2FybmluZyAqLworCXUzMgkJb3RoZXI7CS8qIHBhY2tldHMgZHJvcHBlZCBieSBpbnZva2luZyBkcm9wKCkgKi8KKwl1MzIJCXBkcm9wOwkvKiBwYWNrZXRzIGRyb3BwZWQgYmVjYXVzZSB3ZSBleGNlZWRlZCBwaHlzaWNhbCBxdWV1ZSBsaW1pdHMgKi8KKwljaGFyCQlTY2VsbF9sb2c7CisJdTgJCVN0YWJbMjU2XTsKKwl1OCAgICAgICAgICAgICAgcHJpbzsgICAgICAgIC8qIHRoZSBwcmlvIG9mIHRoaXMgdnEgKi8KKworLyogVmFyaWFibGVzICovCisJdW5zaWduZWQgbG9uZwlxYXZlOwkJLyogQXZlcmFnZSBxdWV1ZSBsZW5ndGg6IEEgc2NhbGVkICovCisJaW50CQlxY291bnQ7CQkvKiBQYWNrZXRzIHNpbmNlIGxhc3QgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uICovCisJdTMyCQlxUjsJCS8qIENhY2hlZCByYW5kb20gbnVtYmVyICovCisKKwlwc2NoZWRfdGltZV90CXFpZGxlc3RhcnQ7CS8qIFN0YXJ0IG9mIGlkbGUgcGVyaW9kCSovCit9OworCitzdHJ1Y3QgZ3JlZF9zY2hlZAoreworCXN0cnVjdCBncmVkX3NjaGVkX2RhdGEgKnRhYltNQVhfRFBzXTsKKwl1MzIgCQlEUHM7ICAgCisJdTMyIAkJZGVmOyAKKwl1OCAJCWluaXRkOyAKKwl1OCAJCWdyaW87IAorCXU4IAkJZXFwOyAKK307CisKK3N0YXRpYyBpbnQKK2dyZWRfZW5xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUWRpc2MqIHNjaCkKK3sKKwlwc2NoZWRfdGltZV90IG5vdzsKKwlzdHJ1Y3QgZ3JlZF9zY2hlZF9kYXRhICpxPU5VTEw7CisJc3RydWN0IGdyZWRfc2NoZWQgKnQ9IHFkaXNjX3ByaXYoc2NoKTsKKwl1bnNpZ25lZCBsb25nCXFhdmU9MDsJCisJaW50IGk9MDsKKworCWlmICghdC0+aW5pdGQgJiYgc2tiX3F1ZXVlX2xlbigmc2NoLT5xKSA8IChzY2gtPmRldi0+dHhfcXVldWVfbGVuID8gOiAxKSkgeworCQlEMlBSSU5USygiTk8gR1JFRCBRdWV1ZXMgc2V0dXAgeWV0ISBFbnF1ZXVlZCBhbnl3YXlcbiIpOworCQlnb3RvIGRvX2VucXVldWU7CisJfQorCisKKwlpZiAoICgoc2tiLT50Y19pbmRleCYweGYpID4gKHQtPkRQcyAtMSkpIHx8ICEocT10LT50YWJbc2tiLT50Y19pbmRleCYweGZdKSkgeworCQlwcmludGsoIkdSRUQ6IHNldHRpbmcgdG8gZGVmYXVsdCAoJWQpXG4gIix0LT5kZWYpOworCQlpZiAoIShxPXQtPnRhYlt0LT5kZWZdKSkgeworCQkJRFBSSU5USygiR1JFRDogc2V0dGluZyB0byBkZWZhdWx0IEZBSUxFRCEgZHJvcHBpbmchISAiCisJCQkgICAgIiglZClcbiAiLCB0LT5kZWYpOworCQkJZ290byBkcm9wOworCQl9CisJCS8qIGZpeCB0Y19pbmRleD8gLS1jb3VsZCBiZSBjb250cm92ZXNpYWwgYnV0IG5lZWRlZCBmb3IKKwkJICAgcmVxdWV1ZWluZyAqLworCQlza2ItPnRjX2luZGV4PShza2ItPnRjX2luZGV4JjB4ZmZmZmZmZjApIHwgdC0+ZGVmOworCX0KKworCUQyUFJJTlRLKCJncmVkX2VucXVldWUgdmlydHVhbFEgMHgleCBjbGFzc2lkICV4IGJhY2tsb2cgJWQgIgorCSAgICAiZ2VuZXJhbCBiYWNrbG9nICVkXG4iLHNrYi0+dGNfaW5kZXgmMHhmLHNjaC0+aGFuZGxlLHEtPmJhY2tsb2csCisJICAgIHNjaC0+cXN0YXRzLmJhY2tsb2cpOworCS8qIHN1bSB1cCBhbGwgdGhlIHFhdmVzIG9mIHByaW9zIDw9IHRvIG91cnMgdG8gZ2V0IHRoZSBuZXcgcWF2ZSovCisJaWYgKCF0LT5lcXAgJiYgdC0+Z3JpbykgeworCQlmb3IgKGk9MDtpPHQtPkRQcztpKyspIHsKKwkJCWlmICgoIXQtPnRhYltpXSkgfHwgKGk9PXEtPkRQKSkJCisJCQkJY29udGludWU7IAorCQkJCQorCQkJaWYgKCh0LT50YWJbaV0tPnByaW8gPCBxLT5wcmlvKSAmJiAoUFNDSEVEX0lTX1BBU1RQRVJGRUNUKHQtPnRhYltpXS0+cWlkbGVzdGFydCkpKQorCQkJCXFhdmUgKz10LT50YWJbaV0tPnFhdmU7CisJCX0KKwkJCQorCX0KKworCXEtPnBhY2tldHNpbisrOworCXEtPmJ5dGVzaW4rPXNrYi0+bGVuOworCisJaWYgKHQtPmVxcCAmJiB0LT5ncmlvKSB7CisJCXFhdmU9MDsKKwkJcS0+cWF2ZT10LT50YWJbdC0+ZGVmXS0+cWF2ZTsKKwkJcS0+cWlkbGVzdGFydD10LT50YWJbdC0+ZGVmXS0+cWlkbGVzdGFydDsKKwl9CisKKwlpZiAoIVBTQ0hFRF9JU19QQVNUUEVSRkVDVChxLT5xaWRsZXN0YXJ0KSkgeworCQlsb25nIHVzX2lkbGU7CisJCVBTQ0hFRF9HRVRfVElNRShub3cpOworCQl1c19pZGxlID0gUFNDSEVEX1RESUZGX1NBRkUobm93LCBxLT5xaWRsZXN0YXJ0LCBxLT5TY2VsbF9tYXgpOworCQlQU0NIRURfU0VUX1BBU1RQRVJGRUNUKHEtPnFpZGxlc3RhcnQpOworCisJCXEtPnFhdmUgPj49IHEtPlN0YWJbKHVzX2lkbGU+PnEtPlNjZWxsX2xvZykmMHhGRl07CisJfSBlbHNlIHsKKwkJaWYgKHQtPmVxcCkgeworCQkJcS0+cWF2ZSArPSBzY2gtPnFzdGF0cy5iYWNrbG9nIC0gKHEtPnFhdmUgPj4gcS0+V2xvZyk7CisJCX0gZWxzZSB7CisJCQlxLT5xYXZlICs9IHEtPmJhY2tsb2cgLSAocS0+cWF2ZSA+PiBxLT5XbG9nKTsKKwkJfQorCisJfQorCQorCisJaWYgKHQtPmVxcCAmJiB0LT5ncmlvKSAKKwkJdC0+dGFiW3QtPmRlZl0tPnFhdmU9cS0+cWF2ZTsKKworCWlmICgocS0+cWF2ZStxYXZlKSA8IHEtPnF0aF9taW4pIHsKKwkJcS0+cWNvdW50ID0gLTE7CitlbnF1ZXVlOgorCQlpZiAocS0+YmFja2xvZyArIHNrYi0+bGVuIDw9IHEtPmxpbWl0KSB7CisJCQlxLT5iYWNrbG9nICs9IHNrYi0+bGVuOworZG9fZW5xdWV1ZToKKwkJCV9fc2tiX3F1ZXVlX3RhaWwoJnNjaC0+cSwgc2tiKTsKKwkJCXNjaC0+cXN0YXRzLmJhY2tsb2cgKz0gc2tiLT5sZW47CisJCQlzY2gtPmJzdGF0cy5ieXRlcyArPSBza2ItPmxlbjsKKwkJCXNjaC0+YnN0YXRzLnBhY2tldHMrKzsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJcS0+cGRyb3ArKzsKKwkJfQorCitkcm9wOgorCQlrZnJlZV9za2Ioc2tiKTsKKwkJc2NoLT5xc3RhdHMuZHJvcHMrKzsKKwkJcmV0dXJuIE5FVF9YTUlUX0RST1A7CisJfQorCWlmICgocS0+cWF2ZStxYXZlKSA+PSBxLT5xdGhfbWF4KSB7CisJCXEtPnFjb3VudCA9IC0xOworCQlzY2gtPnFzdGF0cy5vdmVybGltaXRzKys7CisJCXEtPmZvcmNlZCsrOworCQlnb3RvIGRyb3A7CisJfQorCWlmICgrK3EtPnFjb3VudCkgeworCQlpZiAoKCgocWF2ZStxLT5xYXZlKSAtIHEtPnF0aF9taW4pPj5xLT5XbG9nKSpxLT5xY291bnQgPCBxLT5xUikKKwkJCWdvdG8gZW5xdWV1ZTsKKwkJcS0+cWNvdW50ID0gMDsKKwkJcS0+cVIgPSBuZXRfcmFuZG9tKCkmcS0+Um1hc2s7CisJCXNjaC0+cXN0YXRzLm92ZXJsaW1pdHMrKzsKKwkJcS0+ZWFybHkrKzsKKwkJZ290byBkcm9wOworCX0KKwlxLT5xUiA9IG5ldF9yYW5kb20oKSZxLT5SbWFzazsKKwlnb3RvIGVucXVldWU7Cit9CisKK3N0YXRpYyBpbnQKK2dyZWRfcmVxdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUWRpc2MqIHNjaCkKK3sKKwlzdHJ1Y3QgZ3JlZF9zY2hlZF9kYXRhICpxOworCXN0cnVjdCBncmVkX3NjaGVkICp0PSBxZGlzY19wcml2KHNjaCk7CisJcT0gdC0+dGFiWyhza2ItPnRjX2luZGV4JjB4ZildOworLyogZXJyb3IgY2hlY2tpbmcgaGVyZSAtLSBwcm9iYWJseSB1bm5lY2Vzc2FyeSAqLworCVBTQ0hFRF9TRVRfUEFTVFBFUkZFQ1QocS0+cWlkbGVzdGFydCk7CisKKwlfX3NrYl9xdWV1ZV9oZWFkKCZzY2gtPnEsIHNrYik7CisJc2NoLT5xc3RhdHMuYmFja2xvZyArPSBza2ItPmxlbjsKKwlzY2gtPnFzdGF0cy5yZXF1ZXVlcysrOworCXEtPmJhY2tsb2cgKz0gc2tiLT5sZW47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCitncmVkX2RlcXVldWUoc3RydWN0IFFkaXNjKiBzY2gpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgZ3JlZF9zY2hlZF9kYXRhICpxOworCXN0cnVjdCBncmVkX3NjaGVkICp0PSBxZGlzY19wcml2KHNjaCk7CisKKwlza2IgPSBfX3NrYl9kZXF1ZXVlKCZzY2gtPnEpOworCWlmIChza2IpIHsKKwkJc2NoLT5xc3RhdHMuYmFja2xvZyAtPSBza2ItPmxlbjsKKwkJcT0gdC0+dGFiWyhza2ItPnRjX2luZGV4JjB4ZildOworCQlpZiAocSkgeworCQkJcS0+YmFja2xvZyAtPSBza2ItPmxlbjsKKwkJCWlmICghcS0+YmFja2xvZyAmJiAhdC0+ZXFwKQorCQkJCVBTQ0hFRF9HRVRfVElNRShxLT5xaWRsZXN0YXJ0KTsKKwkJfSBlbHNlIHsKKwkJCUQyUFJJTlRLKCJncmVkX2RlcXVldWU6IHNrYiBoYXMgYmFkIHRjaW5kZXggJXhcbiIsc2tiLT50Y19pbmRleCYweGYpOyAKKwkJfQorCQlyZXR1cm4gc2tiOworCX0KKworCWlmICh0LT5lcXApIHsKKwkJCXE9IHQtPnRhYlt0LT5kZWZdOworCQkJaWYgKCFxKQkKKwkJCQlEMlBSSU5USygibm8gZGVmYXVsdCBWUSBzZXQ6IFJlc3VsdHMgd2lsbCBiZSAiCisJCQkJICAgICAgICJzY3Jld2VkIHVwXG4iKTsKKwkJCWVsc2UKKwkJCQlQU0NIRURfR0VUX1RJTUUocS0+cWlkbGVzdGFydCk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ3JlZF9kcm9wKHN0cnVjdCBRZGlzYyogc2NoKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlzdHJ1Y3QgZ3JlZF9zY2hlZF9kYXRhICpxOworCXN0cnVjdCBncmVkX3NjaGVkICp0PSBxZGlzY19wcml2KHNjaCk7CisKKwlza2IgPSBfX3NrYl9kZXF1ZXVlX3RhaWwoJnNjaC0+cSk7CisJaWYgKHNrYikgeworCQl1bnNpZ25lZCBpbnQgbGVuID0gc2tiLT5sZW47CisJCXNjaC0+cXN0YXRzLmJhY2tsb2cgLT0gbGVuOworCQlzY2gtPnFzdGF0cy5kcm9wcysrOworCQlxPSB0LT50YWJbKHNrYi0+dGNfaW5kZXgmMHhmKV07CisJCWlmIChxKSB7CisJCQlxLT5iYWNrbG9nIC09IGxlbjsKKwkJCXEtPm90aGVyKys7CisJCQlpZiAoIXEtPmJhY2tsb2cgJiYgIXQtPmVxcCkKKwkJCQlQU0NIRURfR0VUX1RJTUUocS0+cWlkbGVzdGFydCk7CisJCX0gZWxzZSB7CisJCQlEMlBSSU5USygiZ3JlZF9kZXF1ZXVlOiBza2IgaGFzIGJhZCB0Y2luZGV4ICV4XG4iLHNrYi0+dGNfaW5kZXgmMHhmKTsgCisJCX0KKworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlxPXQtPnRhYlt0LT5kZWZdOworCWlmICghcSkgeworCQlEMlBSSU5USygibm8gZGVmYXVsdCBWUSBzZXQ6IFJlc3VsdHMgbWlnaHQgYmUgc2NyZXdlZCB1cFxuIik7CisJCXJldHVybiAwOworCX0KKworCVBTQ0hFRF9HRVRfVElNRShxLT5xaWRsZXN0YXJ0KTsKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgdm9pZCBncmVkX3Jlc2V0KHN0cnVjdCBRZGlzYyogc2NoKQoreworCWludCBpOworCXN0cnVjdCBncmVkX3NjaGVkX2RhdGEgKnE7CisJc3RydWN0IGdyZWRfc2NoZWQgKnQ9IHFkaXNjX3ByaXYoc2NoKTsKKworCV9fc2tiX3F1ZXVlX3B1cmdlKCZzY2gtPnEpOworCisJc2NoLT5xc3RhdHMuYmFja2xvZyA9IDA7CisKKyAgICAgICAgZm9yIChpPTA7aTx0LT5EUHM7aSsrKSB7CisJICAgICAgICBxPSB0LT50YWJbaV07CisJCWlmICghcSkJCisJCQljb250aW51ZTsgCisJCVBTQ0hFRF9TRVRfUEFTVFBFUkZFQ1QocS0+cWlkbGVzdGFydCk7CisJCXEtPnFhdmUgPSAwOworCQlxLT5xY291bnQgPSAtMTsKKwkJcS0+YmFja2xvZyA9IDA7CisJCXEtPm90aGVyPTA7CisJCXEtPmZvcmNlZD0wOworCQlxLT5wZHJvcD0wOworCQlxLT5lYXJseT0wOworCX0KK30KKworc3RhdGljIGludCBncmVkX2NoYW5nZShzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IHJ0YXR0ciAqb3B0KQoreworCXN0cnVjdCBncmVkX3NjaGVkICp0YWJsZSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlzdHJ1Y3QgZ3JlZF9zY2hlZF9kYXRhICpxOworCXN0cnVjdCB0Y19ncmVkX3FvcHQgKmN0bDsKKwlzdHJ1Y3QgdGNfZ3JlZF9zb3B0ICpzb3B0OworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9HUkVEX1NUQUJdOworCXN0cnVjdCBydGF0dHIgKnRiMltUQ0FfR1JFRF9EUFNdOworCWludCBpOworCisJaWYgKG9wdCA9PSBOVUxMIHx8IHJ0YXR0cl9wYXJzZV9uZXN0ZWQodGIsIFRDQV9HUkVEX1NUQUIsIG9wdCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRiW1RDQV9HUkVEX1BBUk1TLTFdID09IDAgJiYgdGJbVENBX0dSRURfU1RBQi0xXSA9PSAwKSB7CisJCXJ0YXR0cl9wYXJzZV9uZXN0ZWQodGIyLCBUQ0FfR1JFRF9EUFMsIG9wdCk7CisKKwkgICAgaWYgKHRiMltUQ0FfR1JFRF9EUFMtMV0gPT0gMCkgCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzb3B0ID0gUlRBX0RBVEEodGIyW1RDQV9HUkVEX0RQUy0xXSk7CisJCXRhYmxlLT5EUHM9c29wdC0+RFBzOyAgIAorCQl0YWJsZS0+ZGVmPXNvcHQtPmRlZl9EUDsgCisJCXRhYmxlLT5ncmlvPXNvcHQtPmdyaW87IAorCQl0YWJsZS0+aW5pdGQ9MDsKKwkJLyogcHJvYmFibHkgbmVlZCB0byBjbGVhciBhbGwgdGhlIHRhYmxlIERQIGVudHJpZXMgYXMgd2VsbCAqLworCQlyZXR1cm4gMDsKKwkgICAgfQorCisKKwlpZiAoIXRhYmxlLT5EUHMgfHwgdGJbVENBX0dSRURfUEFSTVMtMV0gPT0gMCB8fCB0YltUQ0FfR1JFRF9TVEFCLTFdID09IDAgfHwKKwkJUlRBX1BBWUxPQUQodGJbVENBX0dSRURfUEFSTVMtMV0pIDwgc2l6ZW9mKCpjdGwpIHx8CisJCVJUQV9QQVlMT0FEKHRiW1RDQV9HUkVEX1NUQUItMV0pIDwgMjU2KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwljdGwgPSBSVEFfREFUQSh0YltUQ0FfR1JFRF9QQVJNUy0xXSk7CisJaWYgKGN0bC0+RFAgPiBNQVhfRFBzLTEgKSB7CisJCS8qIG1pc2JlaGF2aW5nIGlzIHB1bmlzaGVkISBQdXQgaW4gdGhlIGRlZmF1bHQgZHJvcCBwcm9iYWJpbGl0eSAqLworCQlEUFJJTlRLKCJcbkdSRUQ6IERQICV1IG5vdCBpbiAgdGhlIHByb3BlciByYW5nZSBmaXhlZC4gTmV3IERQICIKKwkJCSJzZXQgdG8gZGVmYXVsdCBhdCAlZFxuIixjdGwtPkRQLHRhYmxlLT5kZWYpOworCQljdGwtPkRQPXRhYmxlLT5kZWY7CisJfQorCQorCWlmICh0YWJsZS0+dGFiW2N0bC0+RFBdID09IE5VTEwpIHsKKwkJdGFibGUtPnRhYltjdGwtPkRQXT1rbWFsbG9jKHNpemVvZihzdHJ1Y3QgZ3JlZF9zY2hlZF9kYXRhKSwKKwkJCQkJICAgIEdGUF9LRVJORUwpOworCQlpZiAoTlVMTCA9PSB0YWJsZS0+dGFiW2N0bC0+RFBdKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCW1lbXNldCh0YWJsZS0+dGFiW2N0bC0+RFBdLCAwLCAoc2l6ZW9mKHN0cnVjdCBncmVkX3NjaGVkX2RhdGEpKSk7CisJfQorCXE9IHRhYmxlLT50YWJbY3RsLT5EUF07IAorCisJaWYgKHRhYmxlLT5ncmlvKSB7CisJCWlmIChjdGwtPnByaW8gPD0wKSB7CisJCQlpZiAodGFibGUtPmRlZiAmJiB0YWJsZS0+dGFiW3RhYmxlLT5kZWZdKSB7CisJCQkJRFBSSU5USygiXG5HUkVEOiBEUCAldSBkb2VzIG5vdCBoYXZlIGEgcHJpbyIKKwkJCQkJInNldHRpbmcgZGVmYXVsdCB0byAlZFxuIixjdGwtPkRQLAorCQkJCQl0YWJsZS0+dGFiW3RhYmxlLT5kZWZdLT5wcmlvKTsKKwkJCQlxLT5wcmlvPXRhYmxlLT50YWJbdGFibGUtPmRlZl0tPnByaW87CisJCQl9IGVsc2UgeyAKKwkJCQlEUFJJTlRLKCJcbkdSRUQ6IERQICV1IGRvZXMgbm90IGhhdmUgYSBwcmlvIgorCQkJCQkiIHNldHRpbmcgZGVmYXVsdCB0byA4XG4iLGN0bC0+RFApOworCQkJCXEtPnByaW89ODsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXEtPnByaW89Y3RsLT5wcmlvOworCQl9CisJfSBlbHNlIHsKKwkJcS0+cHJpbz04OworCX0KKworCisJcS0+RFA9Y3RsLT5EUDsKKwlxLT5XbG9nID0gY3RsLT5XbG9nOworCXEtPlBsb2cgPSBjdGwtPlBsb2c7CisJcS0+bGltaXQgPSBjdGwtPmxpbWl0OworCXEtPlNjZWxsX2xvZyA9IGN0bC0+U2NlbGxfbG9nOworCXEtPlJtYXNrID0gY3RsLT5QbG9nIDwgMzIgPyAoKDE8PGN0bC0+UGxvZykgLSAxKSA6IH4wVUw7CisJcS0+U2NlbGxfbWF4ID0gKDI1NTw8cS0+U2NlbGxfbG9nKTsKKwlxLT5xdGhfbWluID0gY3RsLT5xdGhfbWluPDxjdGwtPldsb2c7CisJcS0+cXRoX21heCA9IGN0bC0+cXRoX21heDw8Y3RsLT5XbG9nOworCXEtPnFhdmU9MDsKKwlxLT5iYWNrbG9nPTA7CisJcS0+cWNvdW50ID0gLTE7CisJcS0+b3RoZXI9MDsKKwlxLT5mb3JjZWQ9MDsKKwlxLT5wZHJvcD0wOworCXEtPmVhcmx5PTA7CisKKwlQU0NIRURfU0VUX1BBU1RQRVJGRUNUKHEtPnFpZGxlc3RhcnQpOworCW1lbWNweShxLT5TdGFiLCBSVEFfREFUQSh0YltUQ0FfR1JFRF9TVEFCLTFdKSwgMjU2KTsKKworCWlmICggdGFibGUtPmluaXRkICYmIHRhYmxlLT5ncmlvKSB7CisJLyogdGhpcyBsb29rcyB1Z2x5IGJ1dCBpdCdzIG5vdCBpbiB0aGUgZmFzdCBwYXRoICovCisJCWZvciAoaT0wO2k8dGFibGUtPkRQcztpKyspIHsKKwkJCWlmICgoIXRhYmxlLT50YWJbaV0pIHx8IChpPT1xLT5EUCkgKSAgICAKKwkJCQljb250aW51ZTsgCisJCQlpZiAodGFibGUtPnRhYltpXS0+cHJpbyA9PSBxLT5wcmlvICl7CisJCQkJLyogV1JFRCBtb2RlIGRldGVjdGVkICovCisJCQkJdGFibGUtPmVxcD0xOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKCF0YWJsZS0+aW5pdGQpIHsKKwkJdGFibGUtPmluaXRkPTE7CisJCS8qIAorICAgICAgICAJdGhlIGZpcnN0IGVudHJ5IGFsc28gZ29lcyBpbnRvIHRoZSBkZWZhdWx0IHVudGlsCisgICAgICAgIAlvdmVyLXdyaXR0ZW4gCisJCSovCisKKwkJaWYgKHRhYmxlLT50YWJbdGFibGUtPmRlZl0gPT0gTlVMTCkgeworCQkJdGFibGUtPnRhYlt0YWJsZS0+ZGVmXT0KKwkJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZ3JlZF9zY2hlZF9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoTlVMTCA9PSB0YWJsZS0+dGFiW3RhYmxlLT5kZWZdKQorCQkJCXJldHVybiAtRU5PTUVNOworCisJCQltZW1zZXQodGFibGUtPnRhYlt0YWJsZS0+ZGVmXSwgMCwKKwkJCSAgICAgICAoc2l6ZW9mKHN0cnVjdCBncmVkX3NjaGVkX2RhdGEpKSk7CisJCX0KKwkJcT0gdGFibGUtPnRhYlt0YWJsZS0+ZGVmXTsgCisJCXEtPkRQPXRhYmxlLT5kZWY7CisJCXEtPldsb2cgPSBjdGwtPldsb2c7CisJCXEtPlBsb2cgPSBjdGwtPlBsb2c7CisJCXEtPmxpbWl0ID0gY3RsLT5saW1pdDsKKwkJcS0+U2NlbGxfbG9nID0gY3RsLT5TY2VsbF9sb2c7CisJCXEtPlJtYXNrID0gY3RsLT5QbG9nIDwgMzIgPyAoKDE8PGN0bC0+UGxvZykgLSAxKSA6IH4wVUw7CisJCXEtPlNjZWxsX21heCA9ICgyNTU8PHEtPlNjZWxsX2xvZyk7CisJCXEtPnF0aF9taW4gPSBjdGwtPnF0aF9taW48PGN0bC0+V2xvZzsKKwkJcS0+cXRoX21heCA9IGN0bC0+cXRoX21heDw8Y3RsLT5XbG9nOworCisJCWlmICh0YWJsZS0+Z3JpbykKKwkJCXEtPnByaW89dGFibGUtPnRhYltjdGwtPkRQXS0+cHJpbzsKKwkJZWxzZQorCQkJcS0+cHJpbz04OworCisJCXEtPnFjb3VudCA9IC0xOworCQlQU0NIRURfU0VUX1BBU1RQRVJGRUNUKHEtPnFpZGxlc3RhcnQpOworCQltZW1jcHkocS0+U3RhYiwgUlRBX0RBVEEodGJbVENBX0dSRURfU1RBQi0xXSksIDI1Nik7CisJfQorCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQgZ3JlZF9pbml0KHN0cnVjdCBRZGlzYyAqc2NoLCBzdHJ1Y3QgcnRhdHRyICpvcHQpCit7CisJc3RydWN0IGdyZWRfc2NoZWQgKnRhYmxlID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCB0Y19ncmVkX3NvcHQgKnNvcHQ7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX0dSRURfU1RBQl07CisJc3RydWN0IHJ0YXR0ciAqdGIyW1RDQV9HUkVEX0RQU107CisKKwlpZiAob3B0ID09IE5VTEwgfHwgcnRhdHRyX3BhcnNlX25lc3RlZCh0YiwgVENBX0dSRURfU1RBQiwgb3B0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGJbVENBX0dSRURfUEFSTVMtMV0gPT0gMCAmJiB0YltUQ0FfR1JFRF9TVEFCLTFdID09IDApIHsKKwkJcnRhdHRyX3BhcnNlX25lc3RlZCh0YjIsIFRDQV9HUkVEX0RQUywgb3B0KTsKKworCSAgICBpZiAodGIyW1RDQV9HUkVEX0RQUy0xXSA9PSAwKSAKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXNvcHQgPSBSVEFfREFUQSh0YjJbVENBX0dSRURfRFBTLTFdKTsKKwkJdGFibGUtPkRQcz1zb3B0LT5EUHM7ICAgCisJCXRhYmxlLT5kZWY9c29wdC0+ZGVmX0RQOyAKKwkJdGFibGUtPmdyaW89c29wdC0+Z3JpbzsgCisJCXRhYmxlLT5pbml0ZD0wOworCQlyZXR1cm4gMDsKKwl9CisKKwlEUFJJTlRLKCJcbiBHUkVEX0lOSVQgZXJyb3IhXG4iKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBncmVkX2R1bXAoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgbG9uZyBxYXZlOworCXN0cnVjdCBydGF0dHIgKnJ0YTsKKwlzdHJ1Y3QgdGNfZ3JlZF9xb3B0ICpvcHQgPSBOVUxMIDsKKwlzdHJ1Y3QgdGNfZ3JlZF9xb3B0ICpkc3Q7CisJc3RydWN0IGdyZWRfc2NoZWQgKnRhYmxlID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCBncmVkX3NjaGVkX2RhdGEgKnE7CisJaW50IGk7CisJdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisKKwlydGEgPSAoc3RydWN0IHJ0YXR0ciopYjsKKwlSVEFfUFVUKHNrYiwgVENBX09QVElPTlMsIDAsIE5VTEwpOworCisJb3B0PWttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0Y19ncmVkX3FvcHQpKk1BWF9EUHMsIEdGUF9LRVJORUwpOworCisJaWYgKG9wdCAgPT0gTlVMTCkgeworCQlEUFJJTlRLKCJncmVkX2R1bXA6ZmFpbGVkIHRvIG1hbGxvYyBmb3IgJVpkXG4iLAorCQkgICAgc2l6ZW9mKHN0cnVjdCB0Y19ncmVkX3FvcHQpKk1BWF9EUHMpOworCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOworCX0KKworCW1lbXNldChvcHQsIDAsIChzaXplb2Yoc3RydWN0IHRjX2dyZWRfcW9wdCkpKnRhYmxlLT5EUHMpOworCisJaWYgKCF0YWJsZS0+aW5pdGQpIHsKKwkJRFBSSU5USygiTk8gR1JFRCBRdWV1ZXMgc2V0dXAhXG4iKTsKKwl9CisKKwlmb3IgKGk9MDtpPE1BWF9EUHM7aSsrKSB7CisJCWRzdD0gJm9wdFtpXTsgCisJCXE9IHRhYmxlLT50YWJbaV07IAorCisJCWlmICghcSkgeworCQkJLyogaGFjayAtLSBmaXggYXQgc29tZSBwb2ludCB3aXRoIHByb3BlciBtZXNzYWdlCisJCQkgICBUaGlzIGlzIGhvdyB3ZSBpbmRpY2F0ZSB0byB0YyB0aGF0IHRoZXJlIGlzIG5vIFZRCisJCQkgICBhdCB0aGlzIERQICovCisKKwkJCWRzdC0+RFA9TUFYX0RQcytpOworCQkJY29udGludWU7CisJCX0KKworCQlkc3QtPmxpbWl0PXEtPmxpbWl0OworCQlkc3QtPnF0aF9taW49cS0+cXRoX21pbj4+cS0+V2xvZzsKKwkJZHN0LT5xdGhfbWF4PXEtPnF0aF9tYXg+PnEtPldsb2c7CisJCWRzdC0+RFA9cS0+RFA7CisJCWRzdC0+YmFja2xvZz1xLT5iYWNrbG9nOworCQlpZiAocS0+cWF2ZSkgeworCQkJaWYgKHRhYmxlLT5lcXAgJiYgdGFibGUtPmdyaW8pIHsKKwkJCQlxLT5xaWRsZXN0YXJ0PXRhYmxlLT50YWJbdGFibGUtPmRlZl0tPnFpZGxlc3RhcnQ7CisJCQkJcS0+cWF2ZT10YWJsZS0+dGFiW3RhYmxlLT5kZWZdLT5xYXZlOworCQkJfQorCQkJaWYgKCFQU0NIRURfSVNfUEFTVFBFUkZFQ1QocS0+cWlkbGVzdGFydCkpIHsKKwkJCQlsb25nIGlkbGU7CisJCQkJcHNjaGVkX3RpbWVfdCBub3c7CisJCQkJUFNDSEVEX0dFVF9USU1FKG5vdyk7CisJCQkJaWRsZSA9IFBTQ0hFRF9URElGRl9TQUZFKG5vdywgcS0+cWlkbGVzdGFydCwgcS0+U2NlbGxfbWF4KTsKKwkJCQlxYXZlICA9IHEtPnFhdmUgPj4gcS0+U3RhYlsoaWRsZT4+cS0+U2NlbGxfbG9nKSYweEZGXTsKKwkJCQlkc3QtPnFhdmUgPSBxYXZlID4+IHEtPldsb2c7CisKKwkJCX0gZWxzZSB7CisJCQkJZHN0LT5xYXZlID0gcS0+cWF2ZSA+PiBxLT5XbG9nOworCQkJfQorCQl9IGVsc2UgeworCQkJZHN0LT5xYXZlID0gMDsKKwkJfQorCQkKKworCQlkc3QtPldsb2cgPSBxLT5XbG9nOworCQlkc3QtPlBsb2cgPSBxLT5QbG9nOworCQlkc3QtPlNjZWxsX2xvZyA9IHEtPlNjZWxsX2xvZzsKKwkJZHN0LT5vdGhlciA9IHEtPm90aGVyOworCQlkc3QtPmZvcmNlZCA9IHEtPmZvcmNlZDsKKwkJZHN0LT5lYXJseSA9IHEtPmVhcmx5OworCQlkc3QtPnBkcm9wID0gcS0+cGRyb3A7CisJCWRzdC0+cHJpbyA9IHEtPnByaW87CisJCWRzdC0+cGFja2V0cz1xLT5wYWNrZXRzaW47CisJCWRzdC0+Ynl0ZXNpbj1xLT5ieXRlc2luOworCX0KKworCVJUQV9QVVQoc2tiLCBUQ0FfR1JFRF9QQVJNUywgc2l6ZW9mKHN0cnVjdCB0Y19ncmVkX3FvcHQpKk1BWF9EUHMsIG9wdCk7CisJcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gYjsKKworCWtmcmVlKG9wdCk7CisJcmV0dXJuIHNrYi0+bGVuOworCitydGF0dHJfZmFpbHVyZToKKwlpZiAob3B0KQorCQlrZnJlZShvcHQpOworCURQUklOVEsoImdyZWRfZHVtcDogRkFJTFVSRSEhISFcbiIpOworCisvKiBhbHNvIGZyZWUgdGhlIG9wdCBzdHJ1Y3QgaGVyZSAqLworCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBncmVkX2Rlc3Ryb3koc3RydWN0IFFkaXNjICpzY2gpCit7CisJc3RydWN0IGdyZWRfc2NoZWQgKnRhYmxlID0gcWRpc2NfcHJpdihzY2gpOworCWludCBpOworCisJZm9yIChpID0gMDtpIDwgdGFibGUtPkRQczsgaSsrKSB7CisJCWlmICh0YWJsZS0+dGFiW2ldKQorCQkJa2ZyZWUodGFibGUtPnRhYltpXSk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IFFkaXNjX29wcyBncmVkX3FkaXNjX29wcyA9IHsKKwkubmV4dAkJPQlOVUxMLAorCS5jbF9vcHMJCT0JTlVMTCwKKwkuaWQJCT0JImdyZWQiLAorCS5wcml2X3NpemUJPQlzaXplb2Yoc3RydWN0IGdyZWRfc2NoZWQpLAorCS5lbnF1ZXVlCT0JZ3JlZF9lbnF1ZXVlLAorCS5kZXF1ZXVlCT0JZ3JlZF9kZXF1ZXVlLAorCS5yZXF1ZXVlCT0JZ3JlZF9yZXF1ZXVlLAorCS5kcm9wCQk9CWdyZWRfZHJvcCwKKwkuaW5pdAkJPQlncmVkX2luaXQsCisJLnJlc2V0CQk9CWdyZWRfcmVzZXQsCisJLmRlc3Ryb3kJPQlncmVkX2Rlc3Ryb3ksCisJLmNoYW5nZQkJPQlncmVkX2NoYW5nZSwKKwkuZHVtcAkJPQlncmVkX2R1bXAsCisJLm93bmVyCQk9CVRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZ3JlZF9tb2R1bGVfaW5pdCh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9xZGlzYygmZ3JlZF9xZGlzY19vcHMpOworfQorc3RhdGljIHZvaWQgX19leGl0IGdyZWRfbW9kdWxlX2V4aXQodm9pZCkgCit7CisJdW5yZWdpc3Rlcl9xZGlzYygmZ3JlZF9xZGlzY19vcHMpOworfQorbW9kdWxlX2luaXQoZ3JlZF9tb2R1bGVfaW5pdCkKK21vZHVsZV9leGl0KGdyZWRfbW9kdWxlX2V4aXQpCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2hmc2MuYyBiL25ldC9zY2hlZC9zY2hfaGZzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNjc2NGIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2NoZWQvc2NoX2hmc2MuYwpAQCAtMCwwICsxLDE4MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgUGF0cmljayBNY0hhcmR5LCA8a2FiZXJAdHJhc2gubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogMjAwMy0xMC0xNyAtIFBvcnRlZCBmcm9tIGFsdHEKKyAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Ny0xOTk5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBpcyBoZXJlYnkgZ3JhbnRlZCAoaW5jbHVkaW5nIGZvciBjb21tZXJjaWFsIG9yCisgKiBmb3ItcHJvZml0IHVzZSksIHByb3ZpZGVkIHRoYXQgYm90aCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcworICogcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBkZXJpdmF0aXZlCisgKiB3b3Jrcywgb3IgbW9kaWZpZWQgdmVyc2lvbnMsIGFuZCBhbnkgcG9ydGlvbnMgdGhlcmVvZi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIEVYUEVSSU1FTlRBTCBBTkQgSVMgS05PV04gVE8gSEFWRSBCVUdTLCBTT01FIE9GCisgKiBXSElDSCBNQVkgSEFWRSBTRVJJT1VTIENPTlNFUVVFTkNFUy4gIENBUk5FR0lFIE1FTExPTiBQUk9WSURFUyBUSElTCisgKiBTT0ZUV0FSRSBJTiBJVFMgYGBBUyBJUycnIENPTkRJVElPTiwgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIENBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgKiBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKgorICogQ2FybmVnaWUgTWVsbG9uIGVuY291cmFnZXMgKGJ1dCBkb2VzIG5vdCByZXF1aXJlKSB1c2VycyBvZiB0aGlzCisgKiBzb2Z0d2FyZSB0byByZXR1cm4gYW55IGltcHJvdmVtZW50cyBvciBleHRlbnNpb25zIHRoYXQgdGhleSBtYWtlLAorICogYW5kIHRvIGdyYW50IENhcm5lZ2llIE1lbGxvbiB0aGUgcmlnaHRzIHRvIHJlZGlzdHJpYnV0ZSB0aGVzZQorICogY2hhbmdlcyB3aXRob3V0IGVuY3VtYnJhbmNlLgorICovCisvKgorICogSC1GU0MgaXMgZGVzY3JpYmVkIGluIFByb2NlZWRpbmdzIG9mIFNJR0NPTU0nOTcsCisgKiAiQSBIaWVyYXJjaGljYWwgRmFpciBTZXJ2aWNlIEN1cnZlIEFsZ29yaXRobSBmb3IgTGluay1TaGFyaW5nLAorICogUmVhbC1UaW1lIGFuZCBQcmlvcml0eSBTZXJ2aWNlIgorICogYnkgSW9uIFN0b2ljYSwgSHVpIFpoYW5nLCBhbmQgVC4gUy4gRXVnZW5lIE5nLgorICoKKyAqIE9sZWcgQ2hlcmV2a28gPG9sd2lAYXEubWwuY29tLnVhPiBhZGRlZCB0aGUgdXBwZXJsaW1pdCBmb3IgbGluay1zaGFyaW5nLgorICogd2hlbiBhIGNsYXNzIGhhcyBhbiB1cHBlcmxpbWl0LCB0aGUgZml0LXRpbWUgaXMgY29tcHV0ZWQgZnJvbSB0aGUKKyAqIHVwcGVybGltaXQgc2VydmljZSBjdXJ2ZS4gIHRoZSBsaW5rLXNoYXJpbmcgc2NoZWR1bGVyIGRvZXMgbm90IHNjaGVkdWxlCisgKiBhIGNsYXNzIHdob3NlIGZpdC10aW1lIGV4Y2VlZHMgdGhlIGN1cnJlbnQgdGltZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KKyNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CisjaW5jbHVkZSA8bmV0L3BrdF9jbHMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisKKyNkZWZpbmUgSEZTQ19ERUJVRyAxCisKKy8qCisgKiBrZXJuZWwgaW50ZXJuYWwgc2VydmljZSBjdXJ2ZSByZXByZXNlbnRhdGlvbjoKKyAqICAgY29vcmRpbmF0ZXMgYXJlIGdpdmVuIGJ5IDY0IGJpdCB1bnNpZ25lZCBpbnRlZ2Vycy4KKyAqICAgeC1heGlzOiB1bml0IGlzIGNsb2NrIGNvdW50LgorICogICB5LWF4aXM6IHVuaXQgaXMgYnl0ZS4KKyAqCisgKiAgIFRoZSBzZXJ2aWNlIGN1cnZlIHBhcmFtZXRlcnMgYXJlIGNvbnZlcnRlZCB0byB0aGUgaW50ZXJuYWwKKyAqICAgcmVwcmVzZW50YXRpb24uIFRoZSBzbG9wZSB2YWx1ZXMgYXJlIHNjYWxlZCB0byBhdm9pZCBvdmVyZmxvdy4KKyAqICAgdGhlIGludmVyc2Ugc2xvcGUgdmFsdWVzIGFzIHdlbGwgYXMgdGhlIHktcHJvamVjdGlvbiBvZiB0aGUgMXN0CisgKiAgIHNlZ21lbnQgYXJlIGtlcHQgaW4gb3JkZXIgdG8gdG8gYXZvaWQgNjQtYml0IGRpdmlkZSBvcGVyYXRpb25zCisgKiAgIHRoYXQgYXJlIGV4cGVuc2l2ZSBvbiAzMi1iaXQgYXJjaGl0ZWN0dXJlcy4KKyAqLworCitzdHJ1Y3QgaW50ZXJuYWxfc2MKK3sKKwl1NjQJc20xOwkvKiBzY2FsZWQgc2xvcGUgb2YgdGhlIDFzdCBzZWdtZW50ICovCisJdTY0CWlzbTE7CS8qIHNjYWxlZCBpbnZlcnNlLXNsb3BlIG9mIHRoZSAxc3Qgc2VnbWVudCAqLworCXU2NAlkeDsJLyogdGhlIHgtcHJvamVjdGlvbiBvZiB0aGUgMXN0IHNlZ21lbnQgKi8KKwl1NjQJZHk7CS8qIHRoZSB5LXByb2plY3Rpb24gb2YgdGhlIDFzdCBzZWdtZW50ICovCisJdTY0CXNtMjsJLyogc2NhbGVkIHNsb3BlIG9mIHRoZSAybmQgc2VnbWVudCAqLworCXU2NAlpc20yOwkvKiBzY2FsZWQgaW52ZXJzZS1zbG9wZSBvZiB0aGUgMm5kIHNlZ21lbnQgKi8KK307CisKKy8qIHJ1bnRpbWUgc2VydmljZSBjdXJ2ZSAqLworc3RydWN0IHJ1bnRpbWVfc2MKK3sKKwl1NjQJeDsJLyogY3VycmVudCBzdGFydGluZyBwb3NpdGlvbiBvbiB4LWF4aXMgKi8KKwl1NjQJeTsJLyogY3VycmVudCBzdGFydGluZyBwb3NpdGlvbiBvbiB5LWF4aXMgKi8KKwl1NjQJc20xOwkvKiBzY2FsZWQgc2xvcGUgb2YgdGhlIDFzdCBzZWdtZW50ICovCisJdTY0CWlzbTE7CS8qIHNjYWxlZCBpbnZlcnNlLXNsb3BlIG9mIHRoZSAxc3Qgc2VnbWVudCAqLworCXU2NAlkeDsJLyogdGhlIHgtcHJvamVjdGlvbiBvZiB0aGUgMXN0IHNlZ21lbnQgKi8KKwl1NjQJZHk7CS8qIHRoZSB5LXByb2plY3Rpb24gb2YgdGhlIDFzdCBzZWdtZW50ICovCisJdTY0CXNtMjsJLyogc2NhbGVkIHNsb3BlIG9mIHRoZSAybmQgc2VnbWVudCAqLworCXU2NAlpc20yOwkvKiBzY2FsZWQgaW52ZXJzZS1zbG9wZSBvZiB0aGUgMm5kIHNlZ21lbnQgKi8KK307CisKK2VudW0gaGZzY19jbGFzc19mbGFncworeworCUhGU0NfUlNDID0gMHgxLAorCUhGU0NfRlNDID0gMHgyLAorCUhGU0NfVVNDID0gMHg0Cit9OworCitzdHJ1Y3QgaGZzY19jbGFzcworeworCXUzMgkJY2xhc3NpZDsJLyogY2xhc3MgaWQgKi8KKwl1bnNpZ25lZCBpbnQJcmVmY250OwkJLyogdXNhZ2UgY291bnQgKi8KKworCXN0cnVjdCBnbmV0X3N0YXRzX2Jhc2ljIGJzdGF0czsKKwlzdHJ1Y3QgZ25ldF9zdGF0c19xdWV1ZSBxc3RhdHM7CisJc3RydWN0IGduZXRfc3RhdHNfcmF0ZV9lc3QgcmF0ZV9lc3Q7CisJc3BpbmxvY2tfdAkqc3RhdHNfbG9jazsKKwl1bnNpZ25lZCBpbnQJbGV2ZWw7CQkvKiBjbGFzcyBsZXZlbCBpbiBoaWVyYXJjaHkgKi8KKwlzdHJ1Y3QgdGNmX3Byb3RvICpmaWx0ZXJfbGlzdDsJLyogZmlsdGVyIGxpc3QgKi8KKwl1bnNpZ25lZCBpbnQJZmlsdGVyX2NudDsJLyogZmlsdGVyIGNvdW50ICovCisKKwlzdHJ1Y3QgaGZzY19zY2hlZCAqc2NoZWQ7CS8qIHNjaGVkdWxlciBkYXRhICovCisJc3RydWN0IGhmc2NfY2xhc3MgKmNsX3BhcmVudDsJLyogcGFyZW50IGNsYXNzICovCisJc3RydWN0IGxpc3RfaGVhZCBzaWJsaW5nczsJLyogc2libGluZyBjbGFzc2VzICovCisJc3RydWN0IGxpc3RfaGVhZCBjaGlsZHJlbjsJLyogY2hpbGQgY2xhc3NlcyAqLworCXN0cnVjdCBRZGlzYwkqcWRpc2M7CQkvKiBsZWFmIHFkaXNjICovCisKKwlzdHJ1Y3QgcmJfbm9kZSBlbF9ub2RlOwkJLyogcWRpc2MncyBlbGlnaWJsZSB0cmVlIG1lbWJlciAqLworCXN0cnVjdCByYl9yb290IHZ0X3RyZWU7CQkvKiBhY3RpdmUgY2hpbGRyZW4gc29ydGVkIGJ5IGNsX3Z0ICovCisJc3RydWN0IHJiX25vZGUgdnRfbm9kZTsJCS8qIHBhcmVudCdzIHZ0X3RyZWUgbWVtYmVyICovCisJc3RydWN0IHJiX3Jvb3QgY2ZfdHJlZTsJCS8qIGFjdGl2ZSBjaGlsZHJlbiBzb3J0ZWQgYnkgY2xfZiAqLworCXN0cnVjdCByYl9ub2RlIGNmX25vZGU7CQkvKiBwYXJlbnQncyBjZl9oZWFwIG1lbWJlciAqLworCXN0cnVjdCBsaXN0X2hlYWQgaGxpc3Q7CQkvKiBoYXNoIGxpc3QgbWVtYmVyICovCisJc3RydWN0IGxpc3RfaGVhZCBkbGlzdDsJCS8qIGRyb3AgbGlzdCBtZW1iZXIgKi8KKworCXU2NAljbF90b3RhbDsJCS8qIHRvdGFsIHdvcmsgaW4gYnl0ZXMgKi8KKwl1NjQJY2xfY3VtdWw7CQkvKiBjdW11bGF0aXZlIHdvcmsgaW4gYnl0ZXMgZG9uZSBieQorCQkJCQkgICByZWFsLXRpbWUgY3JpdGVyaWEgKi8KKworCXU2NCAJY2xfZDsJCQkvKiBkZWFkbGluZSovCisJdTY0IAljbF9lOwkJCS8qIGVsaWdpYmxlIHRpbWUgKi8KKwl1NjQJY2xfdnQ7CQkJLyogdmlydHVhbCB0aW1lICovCisJdTY0CWNsX2Y7CQkJLyogdGltZSB3aGVuIHRoaXMgY2xhc3Mgd2lsbCBmaXQgZm9yCisJCQkJCSAgIGxpbmstc2hhcmluZywgbWF4KG15ZiwgY2ZtaW4pICovCisJdTY0CWNsX215ZjsJCQkvKiBteSBmaXQtdGltZSAoY2FsY3VsYXRlZCBmcm9tIHRoaXMKKwkJCQkJICAgY2xhc3MncyBvd24gdXBwZXJsaW1pdCBjdXJ2ZSkgKi8KKwl1NjQJY2xfbXlmYWRqOwkJLyogbXkgZml0LXRpbWUgYWRqdXN0bWVudCAodG8gY2FuY2VsCisJCQkJCSAgIGhpc3RvcnkgZGVwZW5kZW5jZSkgKi8KKwl1NjQJY2xfY2ZtaW47CQkvKiBlYXJsaWVzdCBjaGlsZHJlbidzIGZpdC10aW1lICh1c2VkCisJCQkJCSAgIHdpdGggY2xfbXlmIHRvIG9idGFpbiBjbF9mKSAqLworCXU2NAljbF9jdnRtaW47CQkvKiBtaW5pbWFsIHZpcnR1YWwgdGltZSBhbW9uZyB0aGUKKwkJCQkJICAgY2hpbGRyZW4gZml0IGZvciBsaW5rLXNoYXJpbmcKKwkJCQkJICAgKG1vbm90b25pYyB3aXRoaW4gYSBwZXJpb2QpICovCisJdTY0CWNsX3Z0YWRqOwkJLyogaW50cmEtcGVyaW9kIGN1bXVsYXRpdmUgdnQKKwkJCQkJICAgYWRqdXN0bWVudCAqLworCXU2NAljbF92dG9mZjsJCS8qIGludGVyLXBlcmlvZCBjdW11bGF0aXZlIHZ0IG9mZnNldCAqLworCXU2NAljbF9jdnRtYXg7CQkvKiBtYXggY2hpbGQncyB2dCBpbiB0aGUgbGFzdCBwZXJpb2QgKi8KKwl1NjQJY2xfY3Z0b2ZmOwkJLyogY3VtdWxhdGl2ZSBjdnRtYXggb2YgYWxsIHBlcmlvZHMgKi8KKwl1NjQJY2xfcGN2dG9mZjsJCS8qIHBhcmVudCdzIGN2dG9mZiBhdCBpbml0YWxpemF0aW9uCisJCQkJCSAgIHRpbWUgKi8KKworCXN0cnVjdCBpbnRlcm5hbF9zYyBjbF9yc2M7CS8qIGludGVybmFsIHJlYWwtdGltZSBzZXJ2aWNlIGN1cnZlICovCisJc3RydWN0IGludGVybmFsX3NjIGNsX2ZzYzsJLyogaW50ZXJuYWwgZmFpciBzZXJ2aWNlIGN1cnZlICovCisJc3RydWN0IGludGVybmFsX3NjIGNsX3VzYzsJLyogaW50ZXJuYWwgdXBwZXJsaW1pdCBzZXJ2aWNlIGN1cnZlICovCisJc3RydWN0IHJ1bnRpbWVfc2MgY2xfZGVhZGxpbmU7CS8qIGRlYWRsaW5lIGN1cnZlICovCisJc3RydWN0IHJ1bnRpbWVfc2MgY2xfZWxpZ2libGU7CS8qIGVsaWdpYmxlIGN1cnZlICovCisJc3RydWN0IHJ1bnRpbWVfc2MgY2xfdmlydHVhbDsJLyogdmlydHVhbCBjdXJ2ZSAqLworCXN0cnVjdCBydW50aW1lX3NjIGNsX3VsaW1pdDsJLyogdXBwZXJsaW1pdCBjdXJ2ZSAqLworCisJdW5zaWduZWQgbG9uZwljbF9mbGFnczsJLyogd2hpY2ggY3VydmVzIGFyZSB2YWxpZCAqLworCXVuc2lnbmVkIGxvbmcJY2xfdnRwZXJpb2Q7CS8qIHZ0IHBlcmlvZCBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1bnNpZ25lZCBsb25nCWNsX3BhcmVudHBlcmlvZDsvKiBwYXJlbnQncyB2dCBwZXJpb2Qgc2VxdWVuY2UgbnVtYmVyKi8KKwl1bnNpZ25lZCBsb25nCWNsX25hY3RpdmU7CS8qIG51bWJlciBvZiBhY3RpdmUgY2hpbGRyZW4gKi8KK307CisKKyNkZWZpbmUgSEZTQ19IU0laRQkxNgorCitzdHJ1Y3QgaGZzY19zY2hlZAoreworCXUxNglkZWZjbHM7CQkJCS8qIGRlZmF1bHQgY2xhc3MgaWQgKi8KKwlzdHJ1Y3QgaGZzY19jbGFzcyByb290OwkJCS8qIHJvb3QgY2xhc3MgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGNsaGFzaFtIRlNDX0hTSVpFXTsJLyogY2xhc3MgaGFzaCAqLworCXN0cnVjdCByYl9yb290IGVsaWdpYmxlOwkJLyogZWxpZ2libGUgdHJlZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgZHJvcGxpc3Q7CQkvKiBhY3RpdmUgbGVhZiBjbGFzcyBsaXN0IChmb3IKKwkJCQkJCSAgIGRyb3BwaW5nKSAqLworCXN0cnVjdCBza19idWZmX2hlYWQgcmVxdWV1ZTsJCS8qIHJlcXVldWVkIHBhY2tldCAqLworCXN0cnVjdCB0aW1lcl9saXN0IHdkX3RpbWVyOwkJLyogd2F0Y2hkb2cgdGltZXIgKi8KK307CisKKy8qCisgKiBtYWNyb3MKKyAqLworI2lmZGVmIENPTkZJR19ORVRfU0NIX0NMS19HRVRUSU1FT0ZEQVkKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjdW5kZWYgUFNDSEVEX0dFVF9USU1FCisjZGVmaW5lIFBTQ0hFRF9HRVRfVElNRShzdGFtcCkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXN0cnVjdCB0aW1ldmFsIHR2OwkJCQkJCVwKKwlkb19nZXR0aW1lb2ZkYXkoJnR2KTsJCQkJCQlcCisJKHN0YW1wKSA9IDEwMDAwMDBVTEwgKiB0di50dl9zZWMgKyB0di50dl91c2VjOwkJCVwKK30gd2hpbGUgKDApCisjZW5kaWYKKworI2lmIEhGU0NfREVCVUcKKyNkZWZpbmUgQVNTRVJUKGNvbmQpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKHVubGlrZWx5KCEoY29uZCkpKQkJCQkJCVwKKwkJcHJpbnRrKCJhc3NlcnRpb24gJXMgZmFpbGVkIGF0ICVzOiVpICglcylcbiIsCQlcCisJCSAgICAgICAjY29uZCwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pOwlcCit9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgQVNTRVJUKGNvbmQpCisjZW5kaWYgLyogSEZTQ19ERUJVRyAqLworCisjZGVmaW5lCUhUX0lORklOSVRZCTB4ZmZmZmZmZmZmZmZmZmZmZlVMTAkvKiBpbmZpbml0ZSB0aW1lIHZhbHVlICovCisKKworLyoKKyAqIGVsaWdpYmxlIHRyZWUgaG9sZHMgYmFja2xvZ2dlZCBjbGFzc2VzIGJlaW5nIHNvcnRlZCBieSB0aGVpciBlbGlnaWJsZSB0aW1lcy4KKyAqIHRoZXJlIGlzIG9uZSBlbGlnaWJsZSB0cmVlIHBlciBoZnNjIGluc3RhbmNlLgorICovCisKK3N0YXRpYyB2b2lkCitlbHRyZWVfaW5zZXJ0KHN0cnVjdCBoZnNjX2NsYXNzICpjbCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmY2wtPnNjaGVkLT5lbGlnaWJsZS5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBoZnNjX2NsYXNzICpjbDE7CisKKwl3aGlsZSAoKnAgIT0gTlVMTCkgeworCQlwYXJlbnQgPSAqcDsKKwkJY2wxID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgaGZzY19jbGFzcywgZWxfbm9kZSk7CisJCWlmIChjbC0+Y2xfZSA+PSBjbDEtPmNsX2UpCisJCQlwID0gJnBhcmVudC0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OworCX0KKwlyYl9saW5rX25vZGUoJmNsLT5lbF9ub2RlLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmY2wtPmVsX25vZGUsICZjbC0+c2NoZWQtPmVsaWdpYmxlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitlbHRyZWVfcmVtb3ZlKHN0cnVjdCBoZnNjX2NsYXNzICpjbCkKK3sKKwlyYl9lcmFzZSgmY2wtPmVsX25vZGUsICZjbC0+c2NoZWQtPmVsaWdpYmxlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitlbHRyZWVfdXBkYXRlKHN0cnVjdCBoZnNjX2NsYXNzICpjbCkKK3sKKwllbHRyZWVfcmVtb3ZlKGNsKTsKKwllbHRyZWVfaW5zZXJ0KGNsKTsKK30KKworLyogZmluZCB0aGUgY2xhc3Mgd2l0aCB0aGUgbWluaW11bSBkZWFkbGluZSBhbW9uZyB0aGUgZWxpZ2libGUgY2xhc3NlcyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaGZzY19jbGFzcyAqCitlbHRyZWVfZ2V0X21pbmRsKHN0cnVjdCBoZnNjX3NjaGVkICpxLCB1NjQgY3VyX3RpbWUpCit7CisJc3RydWN0IGhmc2NfY2xhc3MgKnAsICpjbCA9IE5VTEw7CisJc3RydWN0IHJiX25vZGUgKm47CisKKwlmb3IgKG4gPSByYl9maXJzdCgmcS0+ZWxpZ2libGUpOyBuICE9IE5VTEw7IG4gPSByYl9uZXh0KG4pKSB7CisJCXAgPSByYl9lbnRyeShuLCBzdHJ1Y3QgaGZzY19jbGFzcywgZWxfbm9kZSk7CisJCWlmIChwLT5jbF9lID4gY3VyX3RpbWUpCisJCQlicmVhazsKKwkJaWYgKGNsID09IE5VTEwgfHwgcC0+Y2xfZCA8IGNsLT5jbF9kKQorCQkJY2wgPSBwOworCX0KKwlyZXR1cm4gY2w7Cit9CisKKy8qIGZpbmQgdGhlIGNsYXNzIHdpdGggbWluaW11bSBlbGlnaWJsZSB0aW1lIGFtb25nIHRoZSBlbGlnaWJsZSBjbGFzc2VzICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBoZnNjX2NsYXNzICoKK2VsdHJlZV9nZXRfbWluZWwoc3RydWN0IGhmc2Nfc2NoZWQgKnEpCit7CisJc3RydWN0IHJiX25vZGUgKm47CisJCisJbiA9IHJiX2ZpcnN0KCZxLT5lbGlnaWJsZSk7CisJaWYgKG4gPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHJiX2VudHJ5KG4sIHN0cnVjdCBoZnNjX2NsYXNzLCBlbF9ub2RlKTsKK30KKworLyoKKyAqIHZ0dHJlZSBob2xkcyBob2xkcyBiYWNrbG9nZ2VkIGNoaWxkIGNsYXNzZXMgYmVpbmcgc29ydGVkIGJ5IHRoZWlyIHZpcnR1YWwKKyAqIHRpbWUuIGVhY2ggaW50ZXJtZWRpYXRlIGNsYXNzIGhhcyBvbmUgdnR0cmVlLgorICovCitzdGF0aWMgdm9pZAordnR0cmVlX2luc2VydChzdHJ1Y3QgaGZzY19jbGFzcyAqY2wpCit7CisJc3RydWN0IHJiX25vZGUgKipwID0gJmNsLT5jbF9wYXJlbnQtPnZ0X3RyZWUucmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgaGZzY19jbGFzcyAqY2wxOworCisJd2hpbGUgKCpwICE9IE5VTEwpIHsKKwkJcGFyZW50ID0gKnA7CisJCWNsMSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGhmc2NfY2xhc3MsIHZ0X25vZGUpOworCQlpZiAoY2wtPmNsX3Z0ID49IGNsMS0+Y2xfdnQpCisJCQlwID0gJnBhcmVudC0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OworCX0KKwlyYl9saW5rX25vZGUoJmNsLT52dF9ub2RlLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmY2wtPnZ0X25vZGUsICZjbC0+Y2xfcGFyZW50LT52dF90cmVlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit2dHRyZWVfcmVtb3ZlKHN0cnVjdCBoZnNjX2NsYXNzICpjbCkKK3sKKwlyYl9lcmFzZSgmY2wtPnZ0X25vZGUsICZjbC0+Y2xfcGFyZW50LT52dF90cmVlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit2dHRyZWVfdXBkYXRlKHN0cnVjdCBoZnNjX2NsYXNzICpjbCkKK3sKKwl2dHRyZWVfcmVtb3ZlKGNsKTsKKwl2dHRyZWVfaW5zZXJ0KGNsKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaGZzY19jbGFzcyAqCit2dHRyZWVfZmlyc3RmaXQoc3RydWN0IGhmc2NfY2xhc3MgKmNsLCB1NjQgY3VyX3RpbWUpCit7CisJc3RydWN0IGhmc2NfY2xhc3MgKnA7CisJc3RydWN0IHJiX25vZGUgKm47CisKKwlmb3IgKG4gPSByYl9maXJzdCgmY2wtPnZ0X3RyZWUpOyBuICE9IE5VTEw7IG4gPSByYl9uZXh0KG4pKSB7CisJCXAgPSByYl9lbnRyeShuLCBzdHJ1Y3QgaGZzY19jbGFzcywgdnRfbm9kZSk7CisJCWlmIChwLT5jbF9mIDw9IGN1cl90aW1lKQorCQkJcmV0dXJuIHA7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogZ2V0IHRoZSBsZWFmIGNsYXNzIHdpdGggdGhlIG1pbmltdW0gdnQgaW4gdGhlIGhpZXJhcmNoeQorICovCitzdGF0aWMgc3RydWN0IGhmc2NfY2xhc3MgKgordnR0cmVlX2dldF9taW52dChzdHJ1Y3QgaGZzY19jbGFzcyAqY2wsIHU2NCBjdXJfdGltZSkKK3sKKwkvKiBpZiByb290LWNsYXNzJ3MgY2ZtaW4gaXMgYmlnZ2VyIHRoYW4gY3VyX3RpbWUgbm90aGluZyB0byBkbyAqLworCWlmIChjbC0+Y2xfY2ZtaW4gPiBjdXJfdGltZSkKKwkJcmV0dXJuIE5VTEw7CisKKwl3aGlsZSAoY2wtPmxldmVsID4gMCkgeworCQljbCA9IHZ0dHJlZV9maXJzdGZpdChjbCwgY3VyX3RpbWUpOworCQlpZiAoY2wgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCQkvKgorCQkgKiB1cGRhdGUgcGFyZW50J3MgY2xfY3Z0bWluLgorCQkgKi8KKwkJaWYgKGNsLT5jbF9wYXJlbnQtPmNsX2N2dG1pbiA8IGNsLT5jbF92dCkKKwkJCWNsLT5jbF9wYXJlbnQtPmNsX2N2dG1pbiA9IGNsLT5jbF92dDsKKwl9CisJcmV0dXJuIGNsOworfQorCitzdGF0aWMgdm9pZAorY2Z0cmVlX2luc2VydChzdHJ1Y3QgaGZzY19jbGFzcyAqY2wpCit7CisJc3RydWN0IHJiX25vZGUgKipwID0gJmNsLT5jbF9wYXJlbnQtPmNmX3RyZWUucmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgaGZzY19jbGFzcyAqY2wxOworCisJd2hpbGUgKCpwICE9IE5VTEwpIHsKKwkJcGFyZW50ID0gKnA7CisJCWNsMSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGhmc2NfY2xhc3MsIGNmX25vZGUpOworCQlpZiAoY2wtPmNsX2YgPj0gY2wxLT5jbF9mKQorCQkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OworCQllbHNlCisJCQlwID0gJnBhcmVudC0+cmJfbGVmdDsKKwl9CisJcmJfbGlua19ub2RlKCZjbC0+Y2Zfbm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJmNsLT5jZl9ub2RlLCAmY2wtPmNsX3BhcmVudC0+Y2ZfdHJlZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY2Z0cmVlX3JlbW92ZShzdHJ1Y3QgaGZzY19jbGFzcyAqY2wpCit7CisJcmJfZXJhc2UoJmNsLT5jZl9ub2RlLCAmY2wtPmNsX3BhcmVudC0+Y2ZfdHJlZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY2Z0cmVlX3VwZGF0ZShzdHJ1Y3QgaGZzY19jbGFzcyAqY2wpCit7CisJY2Z0cmVlX3JlbW92ZShjbCk7CisJY2Z0cmVlX2luc2VydChjbCk7Cit9CisKKy8qCisgKiBzZXJ2aWNlIGN1cnZlIHN1cHBvcnQgZnVuY3Rpb25zCisgKgorICogIGV4dGVybmFsIHNlcnZpY2UgY3VydmUgcGFyYW1ldGVycworICoJbTogYnBzCisgKglkOiB1cworICogIGludGVybmFsIHNlcnZpY2UgY3VydmUgcGFyYW1ldGVycworICoJc206IChieXRlcy9wc2NoZWRfdXMpIDw8IFNNX1NISUZUCisgKglpc206IChwc2NoZWRfdXMvYnl0ZSkgPDwgSVNNX1NISUZUCisgKglkeDogcHNjaGVkX3VzCisgKgorICogQ2xvY2sgc291cmNlIHJlc29sdXRpb24gKENPTkZJR19ORVRfU0NIX0NMS18qKQorICogIEpJRkZJRVM6IGZvciA0ODw9SFo8PTE1MzQgcmVzb2x1dGlvbiBpcyBiZXR3ZWVuIDAuNjN1cyBhbmQgMS4yN3VzLgorICogIENQVTogcmVzb2x1dGlvbiBpcyBiZXR3ZWVuIDAuNXVzIGFuZCAxdXMuCisgKiAgR0VUVElNRU9GREFZOiByZXNvbHV0aW9uIGlzIGV4YWN0bHkgMXVzLgorICoKKyAqIHNtIGFuZCBpc20gYXJlIHNjYWxlZCBpbiBvcmRlciB0byBrZWVwIGVmZmVjdGl2ZSBkaWdpdHMuCisgKiBTTV9TSElGVCBhbmQgSVNNX1NISUZUIGFyZSBzZWxlY3RlZCB0byBrZWVwIGF0IGxlYXN0IDQgZWZmZWN0aXZlCisgKiBkaWdpdHMgaW4gZGVjaW1hbCB1c2luZyB0aGUgZm9sbG93aW5nIHRhYmxlLgorICoKKyAqIE5vdGU6IFdlIGNhbiBhZmZvcmQgdGhlIGFkZGl0aW9uYWwgYWNjdXJhY3kgKGFsdHEgaGZzYyBrZWVwcyBhdCBtb3N0CisgKiAzIGVmZmVjdGl2ZSBkaWdpdHMpIHRoYW5rcyB0byB0aGUgZmFjdCB0aGF0IGxpbnV4IGNsb2NrIGlzIGJvdW5kZWQKKyAqIG11Y2ggbW9yZSB0aWdodGx5LgorICoKKyAqICBiaXRzL3NlYyAgICAgIDEwMEticHMgICAgIDFNYnBzICAgICAxME1icHMgICAgIDEwME1icHMgICAgMUdicHMKKyAqICAtLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIGJ5dGVzLzAuNXVzICAgNi4yNWUtMyAgICA2Mi41ZS0zICAgIDYyNWUtMyAgICAgNjI1MGUtZSAgICA2MjUwMGUtMworICogIGJ5dGVzL3VzICAgICAgMTIuNWUtMyAgICAxMjVlLTMgICAgIDEyNTBlLTMgICAgMTI1MDBlLTMgICAxMjUwMDBlLTMKKyAqICBieXRlcy8xLjI3dXMgIDE1Ljg3NWUtMyAgMTU4Ljc1ZS0zICAxNTg3LjVlLTMgIDE1ODc1ZS0zICAgMTU4NzUwZS0zCisgKgorICogIDAuNXVzL2J5dGUgICAgMTYwICAgICAgICAxNiAgICAgICAgIDEuNiAgICAgICAgMC4xNiAgICAgICAwLjAxNgorICogIHVzL2J5dGUgICAgICAgODAgICAgICAgICA4ICAgICAgICAgIDAuOCAgICAgICAgMC4wOCAgICAgICAwLjAwOAorICogIDEuMjd1cy9ieXRlICAgNjMgICAgICAgICA2LjMgICAgICAgIDAuNjMgICAgICAgMC4wNjMgICAgICAwLjAwNjMKKyAqLworI2RlZmluZQlTTV9TSElGVAkyMAorI2RlZmluZQlJU01fU0hJRlQJMTgKKworI2RlZmluZQlTTV9NQVNLCQkoKDFVTEwgPDwgU01fU0hJRlQpIC0gMSkKKyNkZWZpbmUJSVNNX01BU0sJKCgxVUxMIDw8IElTTV9TSElGVCkgLSAxKQorCitzdGF0aWMgaW5saW5lIHU2NAorc2VnX3gyeSh1NjQgeCwgdTY0IHNtKQoreworCXU2NCB5OworCisJLyoKKwkgKiBjb21wdXRlCisJICoJeSA9IHggKiBzbSA+PiBTTV9TSElGVAorCSAqIGJ1dCBkaXZpZGUgaXQgZm9yIHRoZSB1cHBlciBhbmQgbG93ZXIgYml0cyB0byBhdm9pZCBvdmVyZmxvdworCSAqLworCXkgPSAoeCA+PiBTTV9TSElGVCkgKiBzbSArICgoKHggJiBTTV9NQVNLKSAqIHNtKSA+PiBTTV9TSElGVCk7CisJcmV0dXJuIHk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0CitzZWdfeTJ4KHU2NCB5LCB1NjQgaXNtKQoreworCXU2NCB4OworCisJaWYgKHkgPT0gMCkKKwkJeCA9IDA7CisJZWxzZSBpZiAoaXNtID09IEhUX0lORklOSVRZKQorCQl4ID0gSFRfSU5GSU5JVFk7CisJZWxzZSB7CisJCXggPSAoeSA+PiBJU01fU0hJRlQpICogaXNtCisJCSAgICArICgoKHkgJiBJU01fTUFTSykgKiBpc20pID4+IElTTV9TSElGVCk7CisJfQorCXJldHVybiB4OworfQorCisvKiBDb252ZXJ0IG0gKGJwcykgaW50byBzbSAoYnl0ZXMvcHNjaGVkIHVzKSAqLworc3RhdGljIHU2NAorbTJzbSh1MzIgbSkKK3sKKwl1NjQgc207CisKKwlzbSA9ICgodTY0KW0gPDwgU01fU0hJRlQpOworCXNtICs9IFBTQ0hFRF9KSUZGSUUyVVMoSFopIC0gMTsKKwlkb19kaXYoc20sIFBTQ0hFRF9KSUZGSUUyVVMoSFopKTsKKwlyZXR1cm4gc207Cit9CisKKy8qIGNvbnZlcnQgbSAoYnBzKSBpbnRvIGlzbSAocHNjaGVkIHVzL2J5dGUpICovCitzdGF0aWMgdTY0CittMmlzbSh1MzIgbSkKK3sKKwl1NjQgaXNtOworCisJaWYgKG0gPT0gMCkKKwkJaXNtID0gSFRfSU5GSU5JVFk7CisJZWxzZSB7CisJCWlzbSA9ICgodTY0KVBTQ0hFRF9KSUZGSUUyVVMoSFopIDw8IElTTV9TSElGVCk7CisJCWlzbSArPSBtIC0gMTsKKwkJZG9fZGl2KGlzbSwgbSk7CisJfQorCXJldHVybiBpc207Cit9CisKKy8qIGNvbnZlcnQgZCAodXMpIGludG8gZHggKHBzY2hlZCB1cykgKi8KK3N0YXRpYyB1NjQKK2QyZHgodTMyIGQpCit7CisJdTY0IGR4OworCisJZHggPSAoKHU2NClkICogUFNDSEVEX0pJRkZJRTJVUyhIWikpOworCWR4ICs9IDEwMDAwMDAgLSAxOworCWRvX2RpdihkeCwgMTAwMDAwMCk7CisJcmV0dXJuIGR4OworfQorCisvKiBjb252ZXJ0IHNtIChieXRlcy9wc2NoZWQgdXMpIGludG8gbSAoYnBzKSAqLworc3RhdGljIHUzMgorc20ybSh1NjQgc20pCit7CisJdTY0IG07CisKKwltID0gKHNtICogUFNDSEVEX0pJRkZJRTJVUyhIWikpID4+IFNNX1NISUZUOworCXJldHVybiAodTMyKW07Cit9CisKKy8qIGNvbnZlcnQgZHggKHBzY2hlZCB1cykgaW50byBkICh1cykgKi8KK3N0YXRpYyB1MzIKK2R4MmQodTY0IGR4KQoreworCXU2NCBkOworCisJZCA9IGR4ICogMTAwMDAwMDsKKwlkb19kaXYoZCwgUFNDSEVEX0pJRkZJRTJVUyhIWikpOworCXJldHVybiAodTMyKWQ7Cit9CisKK3N0YXRpYyB2b2lkCitzYzJpc2Moc3RydWN0IHRjX3NlcnZpY2VfY3VydmUgKnNjLCBzdHJ1Y3QgaW50ZXJuYWxfc2MgKmlzYykKK3sKKwlpc2MtPnNtMSAgPSBtMnNtKHNjLT5tMSk7CisJaXNjLT5pc20xID0gbTJpc20oc2MtPm0xKTsKKwlpc2MtPmR4ICAgPSBkMmR4KHNjLT5kKTsKKwlpc2MtPmR5ICAgPSBzZWdfeDJ5KGlzYy0+ZHgsIGlzYy0+c20xKTsKKwlpc2MtPnNtMiAgPSBtMnNtKHNjLT5tMik7CisJaXNjLT5pc20yID0gbTJpc20oc2MtPm0yKTsKK30KKworLyoKKyAqIGluaXRpYWxpemUgdGhlIHJ1bnRpbWUgc2VydmljZSBjdXJ2ZSB3aXRoIHRoZSBnaXZlbiBpbnRlcm5hbAorICogc2VydmljZSBjdXJ2ZSBzdGFydGluZyBhdCAoeCwgeSkuCisgKi8KK3N0YXRpYyB2b2lkCitydHNjX2luaXQoc3RydWN0IHJ1bnRpbWVfc2MgKnJ0c2MsIHN0cnVjdCBpbnRlcm5hbF9zYyAqaXNjLCB1NjQgeCwgdTY0IHkpCit7CisJcnRzYy0+eAkgICA9IHg7CisJcnRzYy0+eSAgICA9IHk7CisJcnRzYy0+c20xICA9IGlzYy0+c20xOworCXJ0c2MtPmlzbTEgPSBpc2MtPmlzbTE7CisJcnRzYy0+ZHggICA9IGlzYy0+ZHg7CisJcnRzYy0+ZHkgICA9IGlzYy0+ZHk7CisJcnRzYy0+c20yICA9IGlzYy0+c20yOworCXJ0c2MtPmlzbTIgPSBpc2MtPmlzbTI7Cit9CisKKy8qCisgKiBjYWxjdWxhdGUgdGhlIHktcHJvamVjdGlvbiBvZiB0aGUgcnVudGltZSBzZXJ2aWNlIGN1cnZlIGJ5IHRoZQorICogZ2l2ZW4geC1wcm9qZWN0aW9uIHZhbHVlCisgKi8KK3N0YXRpYyB1NjQKK3J0c2NfeTJ4KHN0cnVjdCBydW50aW1lX3NjICpydHNjLCB1NjQgeSkKK3sKKwl1NjQgeDsKKworCWlmICh5IDwgcnRzYy0+eSkKKwkJeCA9IHJ0c2MtPng7CisJZWxzZSBpZiAoeSA8PSBydHNjLT55ICsgcnRzYy0+ZHkpIHsKKwkJLyogeCBiZWxvbmdzIHRvIHRoZSAxc3Qgc2VnbWVudCAqLworCQlpZiAocnRzYy0+ZHkgPT0gMCkKKwkJCXggPSBydHNjLT54ICsgcnRzYy0+ZHg7CisJCWVsc2UKKwkJCXggPSBydHNjLT54ICsgc2VnX3kyeCh5IC0gcnRzYy0+eSwgcnRzYy0+aXNtMSk7CisJfSBlbHNlIHsKKwkJLyogeCBiZWxvbmdzIHRvIHRoZSAybmQgc2VnbWVudCAqLworCQl4ID0gcnRzYy0+eCArIHJ0c2MtPmR4CisJCSAgICArIHNlZ195MngoeSAtIHJ0c2MtPnkgLSBydHNjLT5keSwgcnRzYy0+aXNtMik7CisJfQorCXJldHVybiB4OworfQorCitzdGF0aWMgdTY0CitydHNjX3gyeShzdHJ1Y3QgcnVudGltZV9zYyAqcnRzYywgdTY0IHgpCit7CisJdTY0IHk7CisKKwlpZiAoeCA8PSBydHNjLT54KQorCQl5ID0gcnRzYy0+eTsKKwllbHNlIGlmICh4IDw9IHJ0c2MtPnggKyBydHNjLT5keCkKKwkJLyogeSBiZWxvbmdzIHRvIHRoZSAxc3Qgc2VnbWVudCAqLworCQl5ID0gcnRzYy0+eSArIHNlZ194MnkoeCAtIHJ0c2MtPngsIHJ0c2MtPnNtMSk7CisJZWxzZQorCQkvKiB5IGJlbG9uZ3MgdG8gdGhlIDJuZCBzZWdtZW50ICovCisJCXkgPSBydHNjLT55ICsgcnRzYy0+ZHkKKwkJICAgICsgc2VnX3gyeSh4IC0gcnRzYy0+eCAtIHJ0c2MtPmR4LCBydHNjLT5zbTIpOworCXJldHVybiB5OworfQorCisvKgorICogdXBkYXRlIHRoZSBydW50aW1lIHNlcnZpY2UgY3VydmUgYnkgdGFraW5nIHRoZSBtaW5pbXVtIG9mIHRoZSBjdXJyZW50CisgKiBydW50aW1lIHNlcnZpY2UgY3VydmUgYW5kIHRoZSBzZXJ2aWNlIGN1cnZlIHN0YXJ0aW5nIGF0ICh4LCB5KS4KKyAqLworc3RhdGljIHZvaWQKK3J0c2NfbWluKHN0cnVjdCBydW50aW1lX3NjICpydHNjLCBzdHJ1Y3QgaW50ZXJuYWxfc2MgKmlzYywgdTY0IHgsIHU2NCB5KQoreworCXU2NCB5MSwgeTIsIGR4LCBkeTsKKwl1MzIgZHNtOworCisJaWYgKGlzYy0+c20xIDw9IGlzYy0+c20yKSB7CisJCS8qIHNlcnZpY2UgY3VydmUgaXMgY29udmV4ICovCisJCXkxID0gcnRzY194MnkocnRzYywgeCk7CisJCWlmICh5MSA8IHkpCisJCQkvKiB0aGUgY3VycmVudCBydHNjIGlzIHNtYWxsZXIgKi8KKwkJCXJldHVybjsKKwkJcnRzYy0+eCA9IHg7CisJCXJ0c2MtPnkgPSB5OworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBzZXJ2aWNlIGN1cnZlIGlzIGNvbmNhdmUKKwkgKiBjb21wdXRlIHRoZSB0d28geSB2YWx1ZXMgb2YgdGhlIGN1cnJlbnQgcnRzYworCSAqCXkxOiBhdCB4CisJICoJeTI6IGF0ICh4ICsgZHgpCisJICovCisJeTEgPSBydHNjX3gyeShydHNjLCB4KTsKKwlpZiAoeTEgPD0geSkgeworCQkvKiBydHNjIGlzIGJlbG93IGlzYywgbm8gY2hhbmdlIHRvIHJ0c2MgKi8KKwkJcmV0dXJuOworCX0KKworCXkyID0gcnRzY194MnkocnRzYywgeCArIGlzYy0+ZHgpOworCWlmICh5MiA+PSB5ICsgaXNjLT5keSkgeworCQkvKiBydHNjIGlzIGFib3ZlIGlzYywgcmVwbGFjZSBydHNjIGJ5IGlzYyAqLworCQlydHNjLT54ID0geDsKKwkJcnRzYy0+eSA9IHk7CisJCXJ0c2MtPmR4ID0gaXNjLT5keDsKKwkJcnRzYy0+ZHkgPSBpc2MtPmR5OworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiB0aGUgdHdvIGN1cnZlcyBpbnRlcnNlY3QKKwkgKiBjb21wdXRlIHRoZSBvZmZzZXRzIChkeCwgZHkpIHVzaW5nIHRoZSByZXZlcnNlCisJICogZnVuY3Rpb24gb2Ygc2VnX3gyeSgpCisJICoJc2VnX3gyeShkeCwgc20xKSA9PSBzZWdfeDJ5KGR4LCBzbTIpICsgKHkxIC0geSkKKwkgKi8KKwlkeCA9ICh5MSAtIHkpIDw8IFNNX1NISUZUOworCWRzbSA9IGlzYy0+c20xIC0gaXNjLT5zbTI7CisJZG9fZGl2KGR4LCBkc20pOworCS8qCisJICogY2hlY2sgaWYgKHgsIHkxKSBiZWxvbmdzIHRvIHRoZSAxc3Qgc2VnbWVudCBvZiBydHNjLgorCSAqIGlmIHNvLCBhZGQgdGhlIG9mZnNldC4KKwkgKi8KKwlpZiAocnRzYy0+eCArIHJ0c2MtPmR4ID4geCkKKwkJZHggKz0gcnRzYy0+eCArIHJ0c2MtPmR4IC0geDsKKwlkeSA9IHNlZ194MnkoZHgsIGlzYy0+c20xKTsKKworCXJ0c2MtPnggPSB4OworCXJ0c2MtPnkgPSB5OworCXJ0c2MtPmR4ID0gZHg7CisJcnRzYy0+ZHkgPSBkeTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitpbml0X2VkKHN0cnVjdCBoZnNjX2NsYXNzICpjbCwgdW5zaWduZWQgaW50IG5leHRfbGVuKQoreworCXU2NCBjdXJfdGltZTsKKworCVBTQ0hFRF9HRVRfVElNRShjdXJfdGltZSk7CisKKwkvKiB1cGRhdGUgdGhlIGRlYWRsaW5lIGN1cnZlICovCisJcnRzY19taW4oJmNsLT5jbF9kZWFkbGluZSwgJmNsLT5jbF9yc2MsIGN1cl90aW1lLCBjbC0+Y2xfY3VtdWwpOworCisJLyoKKwkgKiB1cGRhdGUgdGhlIGVsaWdpYmxlIGN1cnZlLgorCSAqIGZvciBjb25jYXZlLCBpdCBpcyBlcXVhbCB0byB0aGUgZGVhZGxpbmUgY3VydmUuCisJICogZm9yIGNvbnZleCwgaXQgaXMgYSBsaW5lYXIgY3VydmUgd2l0aCBzbG9wZSBtMi4KKwkgKi8KKwljbC0+Y2xfZWxpZ2libGUgPSBjbC0+Y2xfZGVhZGxpbmU7CisJaWYgKGNsLT5jbF9yc2Muc20xIDw9IGNsLT5jbF9yc2Muc20yKSB7CisJCWNsLT5jbF9lbGlnaWJsZS5keCA9IDA7CisJCWNsLT5jbF9lbGlnaWJsZS5keSA9IDA7CisJfQorCisJLyogY29tcHV0ZSBlIGFuZCBkICovCisJY2wtPmNsX2UgPSBydHNjX3kyeCgmY2wtPmNsX2VsaWdpYmxlLCBjbC0+Y2xfY3VtdWwpOworCWNsLT5jbF9kID0gcnRzY195MngoJmNsLT5jbF9kZWFkbGluZSwgY2wtPmNsX2N1bXVsICsgbmV4dF9sZW4pOworCisJZWx0cmVlX2luc2VydChjbCk7Cit9CisKK3N0YXRpYyB2b2lkCit1cGRhdGVfZWQoc3RydWN0IGhmc2NfY2xhc3MgKmNsLCB1bnNpZ25lZCBpbnQgbmV4dF9sZW4pCit7CisJY2wtPmNsX2UgPSBydHNjX3kyeCgmY2wtPmNsX2VsaWdpYmxlLCBjbC0+Y2xfY3VtdWwpOworCWNsLT5jbF9kID0gcnRzY195MngoJmNsLT5jbF9kZWFkbGluZSwgY2wtPmNsX2N1bXVsICsgbmV4dF9sZW4pOworCisJZWx0cmVlX3VwZGF0ZShjbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAordXBkYXRlX2Qoc3RydWN0IGhmc2NfY2xhc3MgKmNsLCB1bnNpZ25lZCBpbnQgbmV4dF9sZW4pCit7CisJY2wtPmNsX2QgPSBydHNjX3kyeCgmY2wtPmNsX2RlYWRsaW5lLCBjbC0+Y2xfY3VtdWwgKyBuZXh0X2xlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAordXBkYXRlX2NmbWluKHN0cnVjdCBoZnNjX2NsYXNzICpjbCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHJiX2ZpcnN0KCZjbC0+Y2ZfdHJlZSk7CisJc3RydWN0IGhmc2NfY2xhc3MgKnA7CisKKwlpZiAobiA9PSBOVUxMKSB7CisJCWNsLT5jbF9jZm1pbiA9IDA7CisJCXJldHVybjsKKwl9CisJcCA9IHJiX2VudHJ5KG4sIHN0cnVjdCBoZnNjX2NsYXNzLCBjZl9ub2RlKTsKKwljbC0+Y2xfY2ZtaW4gPSBwLT5jbF9mOworfQorCitzdGF0aWMgdm9pZAoraW5pdF92ZihzdHJ1Y3QgaGZzY19jbGFzcyAqY2wsIHVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IGhmc2NfY2xhc3MgKm1heF9jbDsKKwlzdHJ1Y3QgcmJfbm9kZSAqbjsKKwl1NjQgdnQsIGYsIGN1cl90aW1lOworCWludCBnb19hY3RpdmU7CisKKwljdXJfdGltZSA9IDA7CisJZ29fYWN0aXZlID0gMTsKKwlmb3IgKDsgY2wtPmNsX3BhcmVudCAhPSBOVUxMOyBjbCA9IGNsLT5jbF9wYXJlbnQpIHsKKwkJaWYgKGdvX2FjdGl2ZSAmJiBjbC0+Y2xfbmFjdGl2ZSsrID09IDApCisJCQlnb19hY3RpdmUgPSAxOworCQllbHNlCisJCQlnb19hY3RpdmUgPSAwOworCisJCWlmIChnb19hY3RpdmUpIHsKKwkJCW4gPSByYl9sYXN0KCZjbC0+Y2xfcGFyZW50LT52dF90cmVlKTsKKwkJCWlmIChuICE9IE5VTEwpIHsKKwkJCQltYXhfY2wgPSByYl9lbnRyeShuLCBzdHJ1Y3QgaGZzY19jbGFzcyx2dF9ub2RlKTsKKwkJCQkvKgorCQkJCSAqIHNldCB2dCB0byB0aGUgYXZlcmFnZSBvZiB0aGUgbWluIGFuZCBtYXgKKwkJCQkgKiBjbGFzc2VzLiAgaWYgdGhlIHBhcmVudCdzIHBlcmlvZCBkaWRuJ3QKKwkJCQkgKiBjaGFuZ2UsIGRvbid0IGRlY3JlYXNlIHZ0IG9mIHRoZSBjbGFzcy4KKwkJCQkgKi8KKwkJCQl2dCA9IG1heF9jbC0+Y2xfdnQ7CisJCQkJaWYgKGNsLT5jbF9wYXJlbnQtPmNsX2N2dG1pbiAhPSAwKQorCQkJCQl2dCA9IChjbC0+Y2xfcGFyZW50LT5jbF9jdnRtaW4gKyB2dCkvMjsKKworCQkJCWlmIChjbC0+Y2xfcGFyZW50LT5jbF92dHBlcmlvZCAhPQorCQkJCSAgICBjbC0+Y2xfcGFyZW50cGVyaW9kIHx8IHZ0ID4gY2wtPmNsX3Z0KQorCQkJCQljbC0+Y2xfdnQgPSB2dDsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBmaXJzdCBjaGlsZCBmb3IgYSBuZXcgcGFyZW50IGJhY2tsb2cgcGVyaW9kLgorCQkJCSAqIGFkZCBwYXJlbnQncyBjdnRtYXggdG8gY3Z0b2ZmIHRvIG1ha2UgYSBuZXcKKwkJCQkgKiB2dCAodnRvZmYgKyB2dCkgbGFyZ2VyIHRoYW4gdGhlIHZ0IGluIHRoZQorCQkJCSAqIGxhc3QgcGVyaW9kIGZvciBhbGwgY2hpbGRyZW4uCisJCQkJICovCisJCQkJdnQgPSBjbC0+Y2xfcGFyZW50LT5jbF9jdnRtYXg7CisJCQkJY2wtPmNsX3BhcmVudC0+Y2xfY3Z0b2ZmICs9IHZ0OworCQkJCWNsLT5jbF9wYXJlbnQtPmNsX2N2dG1heCA9IDA7CisJCQkJY2wtPmNsX3BhcmVudC0+Y2xfY3Z0bWluID0gMDsKKwkJCQljbC0+Y2xfdnQgPSAwOworCQkJfQorCisJCQljbC0+Y2xfdnRvZmYgPSBjbC0+Y2xfcGFyZW50LT5jbF9jdnRvZmYgLQorCQkJCQkJCWNsLT5jbF9wY3Z0b2ZmOworCisJCQkvKiB1cGRhdGUgdGhlIHZpcnR1YWwgY3VydmUgKi8KKwkJCXZ0ID0gY2wtPmNsX3Z0ICsgY2wtPmNsX3Z0b2ZmOworCQkJcnRzY19taW4oJmNsLT5jbF92aXJ0dWFsLCAmY2wtPmNsX2ZzYywgdnQsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbC0+Y2xfdG90YWwpOworCQkJaWYgKGNsLT5jbF92aXJ0dWFsLnggPT0gdnQpIHsKKwkJCQljbC0+Y2xfdmlydHVhbC54IC09IGNsLT5jbF92dG9mZjsKKwkJCQljbC0+Y2xfdnRvZmYgPSAwOworCQkJfQorCQkJY2wtPmNsX3Z0YWRqID0gMDsKKworCQkJY2wtPmNsX3Z0cGVyaW9kKys7ICAvKiBpbmNyZW1lbnQgdnQgcGVyaW9kICovCisJCQljbC0+Y2xfcGFyZW50cGVyaW9kID0gY2wtPmNsX3BhcmVudC0+Y2xfdnRwZXJpb2Q7CisJCQlpZiAoY2wtPmNsX3BhcmVudC0+Y2xfbmFjdGl2ZSA9PSAwKQorCQkJCWNsLT5jbF9wYXJlbnRwZXJpb2QrKzsKKwkJCWNsLT5jbF9mID0gMDsKKworCQkJdnR0cmVlX2luc2VydChjbCk7CisJCQljZnRyZWVfaW5zZXJ0KGNsKTsKKworCQkJaWYgKGNsLT5jbF9mbGFncyAmIEhGU0NfVVNDKSB7CisJCQkJLyogY2xhc3MgaGFzIHVwcGVyIGxpbWl0IGN1cnZlICovCisJCQkJaWYgKGN1cl90aW1lID09IDApCisJCQkJCVBTQ0hFRF9HRVRfVElNRShjdXJfdGltZSk7CisKKwkJCQkvKiB1cGRhdGUgdGhlIHVsaW1pdCBjdXJ2ZSAqLworCQkJCXJ0c2NfbWluKCZjbC0+Y2xfdWxpbWl0LCAmY2wtPmNsX3VzYywgY3VyX3RpbWUsCisJCQkJICAgICAgICAgY2wtPmNsX3RvdGFsKTsKKwkJCQkvKiBjb21wdXRlIG15ZiAqLworCQkJCWNsLT5jbF9teWYgPSBydHNjX3kyeCgmY2wtPmNsX3VsaW1pdCwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgY2wtPmNsX3RvdGFsKTsKKwkJCQljbC0+Y2xfbXlmYWRqID0gMDsKKwkJCX0KKwkJfQorCisJCWYgPSBtYXgoY2wtPmNsX215ZiwgY2wtPmNsX2NmbWluKTsKKwkJaWYgKGYgIT0gY2wtPmNsX2YpIHsKKwkJCWNsLT5jbF9mID0gZjsKKwkJCWNmdHJlZV91cGRhdGUoY2wpOworCQkJdXBkYXRlX2NmbWluKGNsLT5jbF9wYXJlbnQpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAordXBkYXRlX3ZmKHN0cnVjdCBoZnNjX2NsYXNzICpjbCwgdW5zaWduZWQgaW50IGxlbiwgdTY0IGN1cl90aW1lKQoreworCXU2NCBmOyAvKiAsIG15Zl9ib3VuZCwgZGVsdGE7ICovCisJaW50IGdvX3Bhc3NpdmUgPSAwOworCisJaWYgKGNsLT5xZGlzYy0+cS5xbGVuID09IDAgJiYgY2wtPmNsX2ZsYWdzICYgSEZTQ19GU0MpCisJCWdvX3Bhc3NpdmUgPSAxOworCisJZm9yICg7IGNsLT5jbF9wYXJlbnQgIT0gTlVMTDsgY2wgPSBjbC0+Y2xfcGFyZW50KSB7CisJCWNsLT5jbF90b3RhbCArPSBsZW47CisKKwkJaWYgKCEoY2wtPmNsX2ZsYWdzICYgSEZTQ19GU0MpIHx8IGNsLT5jbF9uYWN0aXZlID09IDApCisJCQljb250aW51ZTsKKworCQlpZiAoZ29fcGFzc2l2ZSAmJiAtLWNsLT5jbF9uYWN0aXZlID09IDApCisJCQlnb19wYXNzaXZlID0gMTsKKwkJZWxzZQorCQkJZ29fcGFzc2l2ZSA9IDA7CisKKwkJaWYgKGdvX3Bhc3NpdmUpIHsKKwkJCS8qIG5vIG1vcmUgYWN0aXZlIGNoaWxkLCBnb2luZyBwYXNzaXZlICovCisKKwkJCS8qIHVwZGF0ZSBjdnRtYXggb2YgdGhlIHBhcmVudCBjbGFzcyAqLworCQkJaWYgKGNsLT5jbF92dCA+IGNsLT5jbF9wYXJlbnQtPmNsX2N2dG1heCkKKwkJCQljbC0+Y2xfcGFyZW50LT5jbF9jdnRtYXggPSBjbC0+Y2xfdnQ7CisKKwkJCS8qIHJlbW92ZSB0aGlzIGNsYXNzIGZyb20gdGhlIHZ0IHRyZWUgKi8KKwkJCXZ0dHJlZV9yZW1vdmUoY2wpOworCisJCQljZnRyZWVfcmVtb3ZlKGNsKTsKKwkJCXVwZGF0ZV9jZm1pbihjbC0+Y2xfcGFyZW50KTsKKworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiB1cGRhdGUgdnQgYW5kIGYKKwkJICovCisJCWNsLT5jbF92dCA9IHJ0c2NfeTJ4KCZjbC0+Y2xfdmlydHVhbCwgY2wtPmNsX3RvdGFsKQorCQkgICAgICAgICAgICAtIGNsLT5jbF92dG9mZiArIGNsLT5jbF92dGFkajsKKworCQkvKgorCQkgKiBpZiB2dCBvZiB0aGUgY2xhc3MgaXMgc21hbGxlciB0aGFuIGN2dG1pbiwKKwkJICogdGhlIGNsYXNzIHdhcyBza2lwcGVkIGluIHRoZSBwYXN0IGR1ZSB0byBub24tZml0LgorCQkgKiBpZiBzbywgd2UgbmVlZCB0byBhZGp1c3QgdnRhZGouCisJCSAqLworCQlpZiAoY2wtPmNsX3Z0IDwgY2wtPmNsX3BhcmVudC0+Y2xfY3Z0bWluKSB7CisJCQljbC0+Y2xfdnRhZGogKz0gY2wtPmNsX3BhcmVudC0+Y2xfY3Z0bWluIC0gY2wtPmNsX3Z0OworCQkJY2wtPmNsX3Z0ID0gY2wtPmNsX3BhcmVudC0+Y2xfY3Z0bWluOworCQl9CisKKwkJLyogdXBkYXRlIHRoZSB2dCB0cmVlICovCisJCXZ0dHJlZV91cGRhdGUoY2wpOworCisJCWlmIChjbC0+Y2xfZmxhZ3MgJiBIRlNDX1VTQykgeworCQkJY2wtPmNsX215ZiA9IGNsLT5jbF9teWZhZGogKyBydHNjX3kyeCgmY2wtPmNsX3VsaW1pdCwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2wtPmNsX3RvdGFsKTsKKyNpZiAwCisJCQkvKgorCQkJICogVGhpcyBjb2RlIGNhdXNlcyBjbGFzc2VzIHRvIHN0YXkgd2F5IHVuZGVyIHRoZWlyCisJCQkgKiBsaW1pdCB3aGVuIG11bHRpcGxlIGNsYXNzZXMgYXJlIHVzZWQgYXQgZ2lnYWJpdAorCQkJICogc3BlZWQuIG5lZWRzIGludmVzdGlnYXRpb24uIC1rYWJlcgorCQkJICovCisJCQkvKgorCQkJICogaWYgbXlmIGxhZ3MgYmVoaW5kIGJ5IG1vcmUgdGhhbiBvbmUgY2xvY2sgdGljaworCQkJICogZnJvbSB0aGUgY3VycmVudCB0aW1lLCBhZGp1c3QgbXlmYWRqIHRvIHByZXZlbnQKKwkJCSAqIGEgcmF0ZS1saW1pdGVkIGNsYXNzIGZyb20gZ29pbmcgZ3JlZWR5LgorCQkJICogaW4gYSBzdGVhZHkgc3RhdGUgdW5kZXIgcmF0ZS1saW1pdGluZywgbXlmCisJCQkgKiBmbHVjdHVhdGVzIHdpdGhpbiBvbmUgY2xvY2sgdGljay4KKwkJCSAqLworCQkJbXlmX2JvdW5kID0gY3VyX3RpbWUgLSBQU0NIRURfSklGRklFMlVTKDEpOworCQkJaWYgKGNsLT5jbF9teWYgPCBteWZfYm91bmQpIHsKKwkJCQlkZWx0YSA9IGN1cl90aW1lIC0gY2wtPmNsX215ZjsKKwkJCQljbC0+Y2xfbXlmYWRqICs9IGRlbHRhOworCQkJCWNsLT5jbF9teWYgKz0gZGVsdGE7CisJCQl9CisjZW5kaWYKKwkJfQorCisJCWYgPSBtYXgoY2wtPmNsX215ZiwgY2wtPmNsX2NmbWluKTsKKwkJaWYgKGYgIT0gY2wtPmNsX2YpIHsKKwkJCWNsLT5jbF9mID0gZjsKKwkJCWNmdHJlZV91cGRhdGUoY2wpOworCQkJdXBkYXRlX2NmbWluKGNsLT5jbF9wYXJlbnQpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorc2V0X2FjdGl2ZShzdHJ1Y3QgaGZzY19jbGFzcyAqY2wsIHVuc2lnbmVkIGludCBsZW4pCit7CisJaWYgKGNsLT5jbF9mbGFncyAmIEhGU0NfUlNDKQorCQlpbml0X2VkKGNsLCBsZW4pOworCWlmIChjbC0+Y2xfZmxhZ3MgJiBIRlNDX0ZTQykKKwkJaW5pdF92ZihjbCwgbGVuKTsKKworCWxpc3RfYWRkX3RhaWwoJmNsLT5kbGlzdCwgJmNsLT5zY2hlZC0+ZHJvcGxpc3QpOworfQorCitzdGF0aWMgdm9pZAorc2V0X3Bhc3NpdmUoc3RydWN0IGhmc2NfY2xhc3MgKmNsKQoreworCWlmIChjbC0+Y2xfZmxhZ3MgJiBIRlNDX1JTQykKKwkJZWx0cmVlX3JlbW92ZShjbCk7CisKKwlsaXN0X2RlbCgmY2wtPmRsaXN0KTsKKworCS8qCisJICogdnR0cmVlIGlzIG5vdyBoYW5kbGVkIGluIHVwZGF0ZV92ZigpIHNvIHRoYXQgdXBkYXRlX3ZmKGNsLCAwLCAwKQorCSAqIG5lZWRzIHRvIGJlIGNhbGxlZCBleHBsaWNpdGx5IHRvIHJlbW92ZSBhIGNsYXNzIGZyb20gdnR0cmVlLgorCSAqLworfQorCisvKgorICogaGFjayB0byBnZXQgbGVuZ3RoIG9mIGZpcnN0IHBhY2tldCBpbiBxdWV1ZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludAorcWRpc2NfcGVla19sZW4oc3RydWN0IFFkaXNjICpzY2gpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJc2tiID0gc2NoLT5kZXF1ZXVlKHNjaCk7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoInFkaXNjX3BlZWtfbGVuOiBub24gd29yay1jb25zZXJ2aW5nIHFkaXNjID9cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJbGVuID0gc2tiLT5sZW47CisJaWYgKHVubGlrZWx5KHNjaC0+b3BzLT5yZXF1ZXVlKHNrYiwgc2NoKSAhPSBORVRfWE1JVF9TVUNDRVNTKSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKCJxZGlzY19wZWVrX2xlbjogZmFpbGVkIHRvIHJlcXVldWVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHZvaWQKK2hmc2NfcHVyZ2VfcXVldWUoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBoZnNjX2NsYXNzICpjbCkKK3sKKwl1bnNpZ25lZCBpbnQgbGVuID0gY2wtPnFkaXNjLT5xLnFsZW47CisKKwlxZGlzY19yZXNldChjbC0+cWRpc2MpOworCWlmIChsZW4gPiAwKSB7CisJCXVwZGF0ZV92ZihjbCwgMCwgMCk7CisJCXNldF9wYXNzaXZlKGNsKTsKKwkJc2NoLT5xLnFsZW4gLT0gbGVuOworCX0KK30KKworc3RhdGljIHZvaWQKK2hmc2NfYWRqdXN0X2xldmVscyhzdHJ1Y3QgaGZzY19jbGFzcyAqY2wpCit7CisJc3RydWN0IGhmc2NfY2xhc3MgKnA7CisJdW5zaWduZWQgaW50IGxldmVsOworCisJZG8geworCQlsZXZlbCA9IDA7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmNsLT5jaGlsZHJlbiwgc2libGluZ3MpIHsKKwkJCWlmIChwLT5sZXZlbCA+IGxldmVsKQorCQkJCWxldmVsID0gcC0+bGV2ZWw7CisJCX0KKwkJY2wtPmxldmVsID0gbGV2ZWwgKyAxOworCX0gd2hpbGUgKChjbCA9IGNsLT5jbF9wYXJlbnQpICE9IE5VTEwpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAoraGZzY19oYXNoKHUzMiBoKQoreworCWggXj0gaCA+PiA4OworCWggXj0gaCA+PiA0OworCisJcmV0dXJuIGggJiAoSEZTQ19IU0laRSAtIDEpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBoZnNjX2NsYXNzICoKK2hmc2NfZmluZF9jbGFzcyh1MzIgY2xhc3NpZCwgc3RydWN0IFFkaXNjICpzY2gpCit7CisJc3RydWN0IGhmc2Nfc2NoZWQgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJc3RydWN0IGhmc2NfY2xhc3MgKmNsOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbCwgJnEtPmNsaGFzaFtoZnNjX2hhc2goY2xhc3NpZCldLCBobGlzdCkgeworCQlpZiAoY2wtPmNsYXNzaWQgPT0gY2xhc3NpZCkKKwkJCXJldHVybiBjbDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitoZnNjX2NoYW5nZV9yc2Moc3RydWN0IGhmc2NfY2xhc3MgKmNsLCBzdHJ1Y3QgdGNfc2VydmljZV9jdXJ2ZSAqcnNjLAorICAgICAgICAgICAgICAgIHU2NCBjdXJfdGltZSkKK3sKKwlzYzJpc2MocnNjLCAmY2wtPmNsX3JzYyk7CisJcnRzY19pbml0KCZjbC0+Y2xfZGVhZGxpbmUsICZjbC0+Y2xfcnNjLCBjdXJfdGltZSwgY2wtPmNsX2N1bXVsKTsKKwljbC0+Y2xfZWxpZ2libGUgPSBjbC0+Y2xfZGVhZGxpbmU7CisJaWYgKGNsLT5jbF9yc2Muc20xIDw9IGNsLT5jbF9yc2Muc20yKSB7CisJCWNsLT5jbF9lbGlnaWJsZS5keCA9IDA7CisJCWNsLT5jbF9lbGlnaWJsZS5keSA9IDA7CisJfQorCWNsLT5jbF9mbGFncyB8PSBIRlNDX1JTQzsKK30KKworc3RhdGljIHZvaWQKK2hmc2NfY2hhbmdlX2ZzYyhzdHJ1Y3QgaGZzY19jbGFzcyAqY2wsIHN0cnVjdCB0Y19zZXJ2aWNlX2N1cnZlICpmc2MpCit7CisJc2MyaXNjKGZzYywgJmNsLT5jbF9mc2MpOworCXJ0c2NfaW5pdCgmY2wtPmNsX3ZpcnR1YWwsICZjbC0+Y2xfZnNjLCBjbC0+Y2xfdnQsIGNsLT5jbF90b3RhbCk7CisJY2wtPmNsX2ZsYWdzIHw9IEhGU0NfRlNDOworfQorCitzdGF0aWMgdm9pZAoraGZzY19jaGFuZ2VfdXNjKHN0cnVjdCBoZnNjX2NsYXNzICpjbCwgc3RydWN0IHRjX3NlcnZpY2VfY3VydmUgKnVzYywKKyAgICAgICAgICAgICAgICB1NjQgY3VyX3RpbWUpCit7CisJc2MyaXNjKHVzYywgJmNsLT5jbF91c2MpOworCXJ0c2NfaW5pdCgmY2wtPmNsX3VsaW1pdCwgJmNsLT5jbF91c2MsIGN1cl90aW1lLCBjbC0+Y2xfdG90YWwpOworCWNsLT5jbF9mbGFncyB8PSBIRlNDX1VTQzsKK30KKworc3RhdGljIGludAoraGZzY19jaGFuZ2VfY2xhc3Moc3RydWN0IFFkaXNjICpzY2gsIHUzMiBjbGFzc2lkLCB1MzIgcGFyZW50aWQsCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcnRhdHRyICoqdGNhLCB1bnNpZ25lZCBsb25nICphcmcpCit7CisJc3RydWN0IGhmc2Nfc2NoZWQgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJc3RydWN0IGhmc2NfY2xhc3MgKmNsID0gKHN0cnVjdCBoZnNjX2NsYXNzICopKmFyZzsKKwlzdHJ1Y3QgaGZzY19jbGFzcyAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgcnRhdHRyICpvcHQgPSB0Y2FbVENBX09QVElPTlMtMV07CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX0hGU0NfTUFYXTsKKwlzdHJ1Y3QgdGNfc2VydmljZV9jdXJ2ZSAqcnNjID0gTlVMTCwgKmZzYyA9IE5VTEwsICp1c2MgPSBOVUxMOworCXU2NCBjdXJfdGltZTsKKworCWlmIChvcHQgPT0gTlVMTCB8fCBydGF0dHJfcGFyc2VfbmVzdGVkKHRiLCBUQ0FfSEZTQ19NQVgsIG9wdCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRiW1RDQV9IRlNDX1JTQy0xXSkgeworCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX0hGU0NfUlNDLTFdKSA8IHNpemVvZigqcnNjKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyc2MgPSBSVEFfREFUQSh0YltUQ0FfSEZTQ19SU0MtMV0pOworCQlpZiAocnNjLT5tMSA9PSAwICYmIHJzYy0+bTIgPT0gMCkKKwkJCXJzYyA9IE5VTEw7CisJfQorCisJaWYgKHRiW1RDQV9IRlNDX0ZTQy0xXSkgeworCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX0hGU0NfRlNDLTFdKSA8IHNpemVvZigqZnNjKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlmc2MgPSBSVEFfREFUQSh0YltUQ0FfSEZTQ19GU0MtMV0pOworCQlpZiAoZnNjLT5tMSA9PSAwICYmIGZzYy0+bTIgPT0gMCkKKwkJCWZzYyA9IE5VTEw7CisJfQorCisJaWYgKHRiW1RDQV9IRlNDX1VTQy0xXSkgeworCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX0hGU0NfVVNDLTFdKSA8IHNpemVvZigqdXNjKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQl1c2MgPSBSVEFfREFUQSh0YltUQ0FfSEZTQ19VU0MtMV0pOworCQlpZiAodXNjLT5tMSA9PSAwICYmIHVzYy0+bTIgPT0gMCkKKwkJCXVzYyA9IE5VTEw7CisJfQorCisJaWYgKGNsICE9IE5VTEwpIHsKKwkJaWYgKHBhcmVudGlkKSB7CisJCQlpZiAoY2wtPmNsX3BhcmVudCAmJiBjbC0+Y2xfcGFyZW50LT5jbGFzc2lkICE9IHBhcmVudGlkKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKGNsLT5jbF9wYXJlbnQgPT0gTlVMTCAmJiBwYXJlbnRpZCAhPSBUQ19IX1JPT1QpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJUFNDSEVEX0dFVF9USU1FKGN1cl90aW1lKTsKKworCQlzY2hfdHJlZV9sb2NrKHNjaCk7CisJCWlmIChyc2MgIT0gTlVMTCkKKwkJCWhmc2NfY2hhbmdlX3JzYyhjbCwgcnNjLCBjdXJfdGltZSk7CisJCWlmIChmc2MgIT0gTlVMTCkKKwkJCWhmc2NfY2hhbmdlX2ZzYyhjbCwgZnNjKTsKKwkJaWYgKHVzYyAhPSBOVUxMKQorCQkJaGZzY19jaGFuZ2VfdXNjKGNsLCB1c2MsIGN1cl90aW1lKTsKKworCQlpZiAoY2wtPnFkaXNjLT5xLnFsZW4gIT0gMCkgeworCQkJaWYgKGNsLT5jbF9mbGFncyAmIEhGU0NfUlNDKQorCQkJCXVwZGF0ZV9lZChjbCwgcWRpc2NfcGVla19sZW4oY2wtPnFkaXNjKSk7CisJCQlpZiAoY2wtPmNsX2ZsYWdzICYgSEZTQ19GU0MpCisJCQkJdXBkYXRlX3ZmKGNsLCAwLCBjdXJfdGltZSk7CisJCX0KKwkJc2NoX3RyZWVfdW5sb2NrKHNjaCk7CisKKyNpZmRlZiBDT05GSUdfTkVUX0VTVElNQVRPUgorCQlpZiAodGNhW1RDQV9SQVRFLTFdKQorCQkJZ2VuX3JlcGxhY2VfZXN0aW1hdG9yKCZjbC0+YnN0YXRzLCAmY2wtPnJhdGVfZXN0LAorCQkJCWNsLT5zdGF0c19sb2NrLCB0Y2FbVENBX1JBVEUtMV0pOworI2VuZGlmCisJCXJldHVybiAwOworCX0KKworCWlmIChwYXJlbnRpZCA9PSBUQ19IX1JPT1QpCisJCXJldHVybiAtRUVYSVNUOworCisJcGFyZW50ID0gJnEtPnJvb3Q7CisJaWYgKHBhcmVudGlkKSB7CisJCXBhcmVudCA9IGhmc2NfZmluZF9jbGFzcyhwYXJlbnRpZCwgc2NoKTsKKwkJaWYgKHBhcmVudCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJaWYgKGNsYXNzaWQgPT0gMCB8fCBUQ19IX01BSihjbGFzc2lkIF4gc2NoLT5oYW5kbGUpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmIChoZnNjX2ZpbmRfY2xhc3MoY2xhc3NpZCwgc2NoKSkKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwlpZiAocnNjID09IE5VTEwgJiYgZnNjID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJY2wgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaGZzY19jbGFzcyksIEdGUF9LRVJORUwpOworCWlmIChjbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0JVRlM7CisJbWVtc2V0KGNsLCAwLCBzaXplb2Yoc3RydWN0IGhmc2NfY2xhc3MpKTsKKworCWlmIChyc2MgIT0gTlVMTCkKKwkJaGZzY19jaGFuZ2VfcnNjKGNsLCByc2MsIDApOworCWlmIChmc2MgIT0gTlVMTCkKKwkJaGZzY19jaGFuZ2VfZnNjKGNsLCBmc2MpOworCWlmICh1c2MgIT0gTlVMTCkKKwkJaGZzY19jaGFuZ2VfdXNjKGNsLCB1c2MsIDApOworCisJY2wtPnJlZmNudCAgICA9IDE7CisJY2wtPmNsYXNzaWQgICA9IGNsYXNzaWQ7CisJY2wtPnNjaGVkICAgICA9IHE7CisJY2wtPmNsX3BhcmVudCA9IHBhcmVudDsKKwljbC0+cWRpc2MgPSBxZGlzY19jcmVhdGVfZGZsdChzY2gtPmRldiwgJnBmaWZvX3FkaXNjX29wcyk7CisJaWYgKGNsLT5xZGlzYyA9PSBOVUxMKQorCQljbC0+cWRpc2MgPSAmbm9vcF9xZGlzYzsKKwljbC0+c3RhdHNfbG9jayA9ICZzY2gtPmRldi0+cXVldWVfbG9jazsKKwlJTklUX0xJU1RfSEVBRCgmY2wtPmNoaWxkcmVuKTsKKwljbC0+dnRfdHJlZSA9IFJCX1JPT1Q7CisJY2wtPmNmX3RyZWUgPSBSQl9ST09UOworCisJc2NoX3RyZWVfbG9jayhzY2gpOworCWxpc3RfYWRkX3RhaWwoJmNsLT5obGlzdCwgJnEtPmNsaGFzaFtoZnNjX2hhc2goY2xhc3NpZCldKTsKKwlsaXN0X2FkZF90YWlsKCZjbC0+c2libGluZ3MsICZwYXJlbnQtPmNoaWxkcmVuKTsKKwlpZiAocGFyZW50LT5sZXZlbCA9PSAwKQorCQloZnNjX3B1cmdlX3F1ZXVlKHNjaCwgcGFyZW50KTsKKwloZnNjX2FkanVzdF9sZXZlbHMocGFyZW50KTsKKwljbC0+Y2xfcGN2dG9mZiA9IHBhcmVudC0+Y2xfY3Z0b2ZmOworCXNjaF90cmVlX3VubG9jayhzY2gpOworCisjaWZkZWYgQ09ORklHX05FVF9FU1RJTUFUT1IKKwlpZiAodGNhW1RDQV9SQVRFLTFdKQorCQlnZW5fbmV3X2VzdGltYXRvcigmY2wtPmJzdGF0cywgJmNsLT5yYXRlX2VzdCwKKwkJCWNsLT5zdGF0c19sb2NrLCB0Y2FbVENBX1JBVEUtMV0pOworI2VuZGlmCisJKmFyZyA9ICh1bnNpZ25lZCBsb25nKWNsOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoraGZzY19kZXN0cm95X2ZpbHRlcnMoc3RydWN0IHRjZl9wcm90byAqKmZsKQoreworCXN0cnVjdCB0Y2ZfcHJvdG8gKnRwOworCisJd2hpbGUgKCh0cCA9ICpmbCkgIT0gTlVMTCkgeworCQkqZmwgPSB0cC0+bmV4dDsKKwkJdGNmX2Rlc3Ryb3kodHApOworCX0KK30KKworc3RhdGljIHZvaWQKK2hmc2NfZGVzdHJveV9jbGFzcyhzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IGhmc2NfY2xhc3MgKmNsKQoreworCXN0cnVjdCBoZnNjX3NjaGVkICpxID0gcWRpc2NfcHJpdihzY2gpOworCisJaGZzY19kZXN0cm95X2ZpbHRlcnMoJmNsLT5maWx0ZXJfbGlzdCk7CisJcWRpc2NfZGVzdHJveShjbC0+cWRpc2MpOworI2lmZGVmIENPTkZJR19ORVRfRVNUSU1BVE9SCisJZ2VuX2tpbGxfZXN0aW1hdG9yKCZjbC0+YnN0YXRzLCAmY2wtPnJhdGVfZXN0KTsKKyNlbmRpZgorCWlmIChjbCAhPSAmcS0+cm9vdCkKKwkJa2ZyZWUoY2wpOworfQorCitzdGF0aWMgaW50CitoZnNjX2RlbGV0ZV9jbGFzcyhzdHJ1Y3QgUWRpc2MgKnNjaCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGhmc2Nfc2NoZWQgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJc3RydWN0IGhmc2NfY2xhc3MgKmNsID0gKHN0cnVjdCBoZnNjX2NsYXNzICopYXJnOworCisJaWYgKGNsLT5sZXZlbCA+IDAgfHwgY2wtPmZpbHRlcl9jbnQgPiAwIHx8IGNsID09ICZxLT5yb290KQorCQlyZXR1cm4gLUVCVVNZOworCisJc2NoX3RyZWVfbG9jayhzY2gpOworCisJbGlzdF9kZWwoJmNsLT5obGlzdCk7CisJbGlzdF9kZWwoJmNsLT5zaWJsaW5ncyk7CisJaGZzY19hZGp1c3RfbGV2ZWxzKGNsLT5jbF9wYXJlbnQpOworCWhmc2NfcHVyZ2VfcXVldWUoc2NoLCBjbCk7CisJaWYgKC0tY2wtPnJlZmNudCA9PSAwKQorCQloZnNjX2Rlc3Ryb3lfY2xhc3Moc2NoLCBjbCk7CisKKwlzY2hfdHJlZV91bmxvY2soc2NoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBoZnNjX2NsYXNzICoKK2hmc2NfY2xhc3NpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjICpzY2gsIGludCAqcWVycikKK3sKKwlzdHJ1Y3QgaGZzY19zY2hlZCAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlzdHJ1Y3QgaGZzY19jbGFzcyAqY2w7CisJc3RydWN0IHRjZl9yZXN1bHQgcmVzOworCXN0cnVjdCB0Y2ZfcHJvdG8gKnRjZjsKKwlpbnQgcmVzdWx0OworCisJaWYgKFRDX0hfTUFKKHNrYi0+cHJpb3JpdHkgXiBzY2gtPmhhbmRsZSkgPT0gMCAmJgorCSAgICAoY2wgPSBoZnNjX2ZpbmRfY2xhc3Moc2tiLT5wcmlvcml0eSwgc2NoKSkgIT0gTlVMTCkKKwkJaWYgKGNsLT5sZXZlbCA9PSAwKQorCQkJcmV0dXJuIGNsOworCisJKnFlcnIgPSBORVRfWE1JVF9EUk9QOworCXRjZiA9IHEtPnJvb3QuZmlsdGVyX2xpc3Q7CisJd2hpbGUgKHRjZiAmJiAocmVzdWx0ID0gdGNfY2xhc3NpZnkoc2tiLCB0Y2YsICZyZXMpKSA+PSAwKSB7CisjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCisJCXN3aXRjaCAocmVzdWx0KSB7CisJCWNhc2UgVENfQUNUX1FVRVVFRDoKKwkJY2FzZSBUQ19BQ1RfU1RPTEVOOiAKKwkJCSpxZXJyID0gTkVUX1hNSVRfU1VDQ0VTUzsKKwkJY2FzZSBUQ19BQ1RfU0hPVDogCisJCQlyZXR1cm4gTlVMTDsKKwkJfQorI2VsaWYgZGVmaW5lZChDT05GSUdfTkVUX0NMU19QT0xJQ0UpCisJCWlmIChyZXN1bHQgPT0gVENfUE9MSUNFX1NIT1QpCisJCQlyZXR1cm4gTlVMTDsKKyNlbmRpZgorCQlpZiAoKGNsID0gKHN0cnVjdCBoZnNjX2NsYXNzICopcmVzLmNsYXNzKSA9PSBOVUxMKSB7CisJCQlpZiAoKGNsID0gaGZzY19maW5kX2NsYXNzKHJlcy5jbGFzc2lkLCBzY2gpKSA9PSBOVUxMKQorCQkJCWJyZWFrOyAvKiBmaWx0ZXIgc2VsZWN0ZWQgaW52YWxpZCBjbGFzc2lkICovCisJCX0KKworCQlpZiAoY2wtPmxldmVsID09IDApCisJCQlyZXR1cm4gY2w7IC8qIGhpdCBsZWFmIGNsYXNzICovCisKKwkJLyogYXBwbHkgaW5uZXIgZmlsdGVyIGNoYWluICovCisJCXRjZiA9IGNsLT5maWx0ZXJfbGlzdDsKKwl9CisKKwkvKiBjbGFzc2lmaWNhdGlvbiBmYWlsZWQsIHRyeSBkZWZhdWx0IGNsYXNzICovCisJY2wgPSBoZnNjX2ZpbmRfY2xhc3MoVENfSF9NQUtFKFRDX0hfTUFKKHNjaC0+aGFuZGxlKSwgcS0+ZGVmY2xzKSwgc2NoKTsKKwlpZiAoY2wgPT0gTlVMTCB8fCBjbC0+bGV2ZWwgPiAwKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBjbDsKK30KKworc3RhdGljIGludAoraGZzY19ncmFmdF9jbGFzcyhzdHJ1Y3QgUWRpc2MgKnNjaCwgdW5zaWduZWQgbG9uZyBhcmcsIHN0cnVjdCBRZGlzYyAqbmV3LAorICAgICAgICAgICAgICAgICBzdHJ1Y3QgUWRpc2MgKipvbGQpCit7CisJc3RydWN0IGhmc2NfY2xhc3MgKmNsID0gKHN0cnVjdCBoZnNjX2NsYXNzICopYXJnOworCisJaWYgKGNsID09IE5VTEwpCisJCXJldHVybiAtRU5PRU5UOworCWlmIChjbC0+bGV2ZWwgPiAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAobmV3ID09IE5VTEwpIHsKKwkJbmV3ID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZwZmlmb19xZGlzY19vcHMpOworCQlpZiAobmV3ID09IE5VTEwpCisJCQluZXcgPSAmbm9vcF9xZGlzYzsKKwl9CisKKwlzY2hfdHJlZV9sb2NrKHNjaCk7CisJaGZzY19wdXJnZV9xdWV1ZShzY2gsIGNsKTsKKwkqb2xkID0geGNoZygmY2wtPnFkaXNjLCBuZXcpOworCXNjaF90cmVlX3VubG9jayhzY2gpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IFFkaXNjICoKK2hmc2NfY2xhc3NfbGVhZihzdHJ1Y3QgUWRpc2MgKnNjaCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGhmc2NfY2xhc3MgKmNsID0gKHN0cnVjdCBoZnNjX2NsYXNzICopYXJnOworCisJaWYgKGNsICE9IE5VTEwgJiYgY2wtPmxldmVsID09IDApCisJCXJldHVybiBjbC0+cWRpc2M7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2hmc2NfZ2V0X2NsYXNzKHN0cnVjdCBRZGlzYyAqc2NoLCB1MzIgY2xhc3NpZCkKK3sKKwlzdHJ1Y3QgaGZzY19jbGFzcyAqY2wgPSBoZnNjX2ZpbmRfY2xhc3MoY2xhc3NpZCwgc2NoKTsKKworCWlmIChjbCAhPSBOVUxMKQorCQljbC0+cmVmY250Kys7CisKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpY2w7Cit9CisKK3N0YXRpYyB2b2lkCitoZnNjX3B1dF9jbGFzcyhzdHJ1Y3QgUWRpc2MgKnNjaCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGhmc2NfY2xhc3MgKmNsID0gKHN0cnVjdCBoZnNjX2NsYXNzICopYXJnOworCisJaWYgKC0tY2wtPnJlZmNudCA9PSAwKQorCQloZnNjX2Rlc3Ryb3lfY2xhc3Moc2NoLCBjbCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitoZnNjX2JpbmRfdGNmKHN0cnVjdCBRZGlzYyAqc2NoLCB1bnNpZ25lZCBsb25nIHBhcmVudCwgdTMyIGNsYXNzaWQpCit7CisJc3RydWN0IGhmc2NfY2xhc3MgKnAgPSAoc3RydWN0IGhmc2NfY2xhc3MgKilwYXJlbnQ7CisJc3RydWN0IGhmc2NfY2xhc3MgKmNsID0gaGZzY19maW5kX2NsYXNzKGNsYXNzaWQsIHNjaCk7CisKKwlpZiAoY2wgIT0gTlVMTCkgeworCQlpZiAocCAhPSBOVUxMICYmIHAtPmxldmVsIDw9IGNsLT5sZXZlbCkKKwkJCXJldHVybiAwOworCQljbC0+ZmlsdGVyX2NudCsrOworCX0KKworCXJldHVybiAodW5zaWduZWQgbG9uZyljbDsKK30KKworc3RhdGljIHZvaWQKK2hmc2NfdW5iaW5kX3RjZihzdHJ1Y3QgUWRpc2MgKnNjaCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGhmc2NfY2xhc3MgKmNsID0gKHN0cnVjdCBoZnNjX2NsYXNzICopYXJnOworCisJY2wtPmZpbHRlcl9jbnQtLTsKK30KKworc3RhdGljIHN0cnVjdCB0Y2ZfcHJvdG8gKioKK2hmc2NfdGNmX2NoYWluKHN0cnVjdCBRZGlzYyAqc2NoLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaGZzY19zY2hlZCAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlzdHJ1Y3QgaGZzY19jbGFzcyAqY2wgPSAoc3RydWN0IGhmc2NfY2xhc3MgKilhcmc7CisKKwlpZiAoY2wgPT0gTlVMTCkKKwkJY2wgPSAmcS0+cm9vdDsKKworCXJldHVybiAmY2wtPmZpbHRlcl9saXN0OworfQorCitzdGF0aWMgaW50CitoZnNjX2R1bXBfc2Moc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGF0dHIsIHN0cnVjdCBpbnRlcm5hbF9zYyAqc2MpCit7CisJc3RydWN0IHRjX3NlcnZpY2VfY3VydmUgdHNjOworCisJdHNjLm0xID0gc20ybShzYy0+c20xKTsKKwl0c2MuZCAgPSBkeDJkKHNjLT5keCk7CisJdHNjLm0yID0gc20ybShzYy0+c20yKTsKKwlSVEFfUFVUKHNrYiwgYXR0ciwgc2l6ZW9mKHRzYyksICZ0c2MpOworCisJcmV0dXJuIHNrYi0+bGVuOworCisgcnRhdHRyX2ZhaWx1cmU6CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIGludAoraGZzY19kdW1wX2N1cnZlcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaGZzY19jbGFzcyAqY2wpCit7CisJaWYgKChjbC0+Y2xfZmxhZ3MgJiBIRlNDX1JTQykgJiYKKwkgICAgKGhmc2NfZHVtcF9zYyhza2IsIFRDQV9IRlNDX1JTQywgJmNsLT5jbF9yc2MpIDwgMCkpCisJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CisKKwlpZiAoKGNsLT5jbF9mbGFncyAmIEhGU0NfRlNDKSAmJgorCSAgICAoaGZzY19kdW1wX3NjKHNrYiwgVENBX0hGU0NfRlNDLCAmY2wtPmNsX2ZzYykgPCAwKSkKKwkJZ290byBydGF0dHJfZmFpbHVyZTsKKworCWlmICgoY2wtPmNsX2ZsYWdzICYgSEZTQ19VU0MpICYmCisJICAgIChoZnNjX2R1bXBfc2Moc2tiLCBUQ0FfSEZTQ19VU0MsICZjbC0+Y2xfdXNjKSA8IDApKQorCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOworCisJcmV0dXJuIHNrYi0+bGVuOworCisgcnRhdHRyX2ZhaWx1cmU6CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50CitoZnNjX2R1bXBfY2xhc3Moc3RydWN0IFFkaXNjICpzY2gsIHVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgICAgICAgICAgIHN0cnVjdCB0Y21zZyAqdGNtKQoreworCXN0cnVjdCBoZnNjX2NsYXNzICpjbCA9IChzdHJ1Y3QgaGZzY19jbGFzcyAqKWFyZzsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXN0cnVjdCBydGF0dHIgKnJ0YSA9IChzdHJ1Y3QgcnRhdHRyICopYjsKKworCXRjbS0+dGNtX3BhcmVudCA9IGNsLT5jbF9wYXJlbnQgPyBjbC0+Y2xfcGFyZW50LT5jbGFzc2lkIDogVENfSF9ST09UOworCXRjbS0+dGNtX2hhbmRsZSA9IGNsLT5jbGFzc2lkOworCWlmIChjbC0+bGV2ZWwgPT0gMCkKKwkJdGNtLT50Y21faW5mbyA9IGNsLT5xZGlzYy0+aGFuZGxlOworCisJUlRBX1BVVChza2IsIFRDQV9PUFRJT05TLCAwLCBOVUxMKTsKKwlpZiAoaGZzY19kdW1wX2N1cnZlcyhza2IsIGNsKSA8IDApCisJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CisJcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlyZXR1cm4gc2tiLT5sZW47CisKKyBydGF0dHJfZmFpbHVyZToKKwlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludAoraGZzY19kdW1wX2NsYXNzX3N0YXRzKHN0cnVjdCBRZGlzYyAqc2NoLCB1bnNpZ25lZCBsb25nIGFyZywKKwlzdHJ1Y3QgZ25ldF9kdW1wICpkKQoreworCXN0cnVjdCBoZnNjX2NsYXNzICpjbCA9IChzdHJ1Y3QgaGZzY19jbGFzcyAqKWFyZzsKKwlzdHJ1Y3QgdGNfaGZzY19zdGF0cyB4c3RhdHM7CisKKwljbC0+cXN0YXRzLnFsZW4gPSBjbC0+cWRpc2MtPnEucWxlbjsKKwl4c3RhdHMubGV2ZWwgICA9IGNsLT5sZXZlbDsKKwl4c3RhdHMucGVyaW9kICA9IGNsLT5jbF92dHBlcmlvZDsKKwl4c3RhdHMud29yayAgICA9IGNsLT5jbF90b3RhbDsKKwl4c3RhdHMucnR3b3JrICA9IGNsLT5jbF9jdW11bDsKKworCWlmIChnbmV0X3N0YXRzX2NvcHlfYmFzaWMoZCwgJmNsLT5ic3RhdHMpIDwgMCB8fAorI2lmZGVmIENPTkZJR19ORVRfRVNUSU1BVE9SCisJICAgIGduZXRfc3RhdHNfY29weV9yYXRlX2VzdChkLCAmY2wtPnJhdGVfZXN0KSA8IDAgfHwKKyNlbmRpZgorCSAgICBnbmV0X3N0YXRzX2NvcHlfcXVldWUoZCwgJmNsLT5xc3RhdHMpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIGduZXRfc3RhdHNfY29weV9hcHAoZCwgJnhzdGF0cywgc2l6ZW9mKHhzdGF0cykpOworfQorCisKKworc3RhdGljIHZvaWQKK2hmc2Nfd2FsayhzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IHFkaXNjX3dhbGtlciAqYXJnKQoreworCXN0cnVjdCBoZnNjX3NjaGVkICpxID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCBoZnNjX2NsYXNzICpjbDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChhcmctPnN0b3ApCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBIRlNDX0hTSVpFOyBpKyspIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjbCwgJnEtPmNsaGFzaFtpXSwgaGxpc3QpIHsKKwkJCWlmIChhcmctPmNvdW50IDwgYXJnLT5za2lwKSB7CisJCQkJYXJnLT5jb3VudCsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGFyZy0+Zm4oc2NoLCAodW5zaWduZWQgbG9uZyljbCwgYXJnKSA8IDApIHsKKwkJCQlhcmctPnN0b3AgPSAxOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWFyZy0+Y291bnQrKzsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK2hmc2Nfd2F0Y2hkb2codW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IFFkaXNjICpzY2ggPSAoc3RydWN0IFFkaXNjICopYXJnOworCisJc2NoLT5mbGFncyAmPSB+VENRX0ZfVEhST1RUTEVEOworCW5ldGlmX3NjaGVkdWxlKHNjaC0+ZGV2KTsKK30KKworc3RhdGljIHZvaWQKK2hmc2Nfc2NoZWR1bGVfd2F0Y2hkb2coc3RydWN0IFFkaXNjICpzY2gsIHU2NCBjdXJfdGltZSkKK3sKKwlzdHJ1Y3QgaGZzY19zY2hlZCAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlzdHJ1Y3QgaGZzY19jbGFzcyAqY2w7CisJdTY0IG5leHRfdGltZSA9IDA7CisJbG9uZyBkZWxheTsKKworCWlmICgoY2wgPSBlbHRyZWVfZ2V0X21pbmVsKHEpKSAhPSBOVUxMKQorCQluZXh0X3RpbWUgPSBjbC0+Y2xfZTsKKwlpZiAocS0+cm9vdC5jbF9jZm1pbiAhPSAwKSB7CisJCWlmIChuZXh0X3RpbWUgPT0gMCB8fCBuZXh0X3RpbWUgPiBxLT5yb290LmNsX2NmbWluKQorCQkJbmV4dF90aW1lID0gcS0+cm9vdC5jbF9jZm1pbjsKKwl9CisJQVNTRVJUKG5leHRfdGltZSAhPSAwKTsKKwlkZWxheSA9IG5leHRfdGltZSAtIGN1cl90aW1lOworCWRlbGF5ID0gUFNDSEVEX1VTMkpJRkZJRShkZWxheSk7CisKKwlzY2gtPmZsYWdzIHw9IFRDUV9GX1RIUk9UVExFRDsKKwltb2RfdGltZXIoJnEtPndkX3RpbWVyLCBqaWZmaWVzICsgZGVsYXkpOworfQorCitzdGF0aWMgaW50CitoZnNjX2luaXRfcWRpc2Moc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBydGF0dHIgKm9wdCkKK3sKKwlzdHJ1Y3QgaGZzY19zY2hlZCAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlzdHJ1Y3QgdGNfaGZzY19xb3B0ICpxb3B0OworCXVuc2lnbmVkIGludCBpOworCisJaWYgKG9wdCA9PSBOVUxMIHx8IFJUQV9QQVlMT0FEKG9wdCkgPCBzaXplb2YoKnFvcHQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlxb3B0ID0gUlRBX0RBVEEob3B0KTsKKworCXNjaC0+c3RhdHNfbG9jayA9ICZzY2gtPmRldi0+cXVldWVfbG9jazsKKworCXEtPmRlZmNscyA9IHFvcHQtPmRlZmNsczsKKwlmb3IgKGkgPSAwOyBpIDwgSEZTQ19IU0laRTsgaSsrKQorCQlJTklUX0xJU1RfSEVBRCgmcS0+Y2xoYXNoW2ldKTsKKwlxLT5lbGlnaWJsZSA9IFJCX1JPT1Q7CisJSU5JVF9MSVNUX0hFQUQoJnEtPmRyb3BsaXN0KTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZxLT5yZXF1ZXVlKTsKKworCXEtPnJvb3QucmVmY250ICA9IDE7CisJcS0+cm9vdC5jbGFzc2lkID0gc2NoLT5oYW5kbGU7CisJcS0+cm9vdC5zY2hlZCAgID0gcTsKKwlxLT5yb290LnFkaXNjID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZwZmlmb19xZGlzY19vcHMpOworCWlmIChxLT5yb290LnFkaXNjID09IE5VTEwpCisJCXEtPnJvb3QucWRpc2MgPSAmbm9vcF9xZGlzYzsKKwlxLT5yb290LnN0YXRzX2xvY2sgPSAmc2NoLT5kZXYtPnF1ZXVlX2xvY2s7CisJSU5JVF9MSVNUX0hFQUQoJnEtPnJvb3QuY2hpbGRyZW4pOworCXEtPnJvb3QudnRfdHJlZSA9IFJCX1JPT1Q7CisJcS0+cm9vdC5jZl90cmVlID0gUkJfUk9PVDsKKworCWxpc3RfYWRkKCZxLT5yb290LmhsaXN0LCAmcS0+Y2xoYXNoW2hmc2NfaGFzaChxLT5yb290LmNsYXNzaWQpXSk7CisKKwlpbml0X3RpbWVyKCZxLT53ZF90aW1lcik7CisJcS0+d2RfdGltZXIuZnVuY3Rpb24gPSBoZnNjX3dhdGNoZG9nOworCXEtPndkX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylzY2g7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraGZzY19jaGFuZ2VfcWRpc2Moc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBydGF0dHIgKm9wdCkKK3sKKwlzdHJ1Y3QgaGZzY19zY2hlZCAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlzdHJ1Y3QgdGNfaGZzY19xb3B0ICpxb3B0OworCisJaWYgKG9wdCA9PSBOVUxMIHx8IFJUQV9QQVlMT0FEKG9wdCkgPCBzaXplb2YoKnFvcHQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlxb3B0ID0gUlRBX0RBVEEob3B0KTsKKworCXNjaF90cmVlX2xvY2soc2NoKTsKKwlxLT5kZWZjbHMgPSBxb3B0LT5kZWZjbHM7CisJc2NoX3RyZWVfdW5sb2NrKHNjaCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2hmc2NfcmVzZXRfY2xhc3Moc3RydWN0IGhmc2NfY2xhc3MgKmNsKQoreworCWNsLT5jbF90b3RhbCAgICAgICAgPSAwOworCWNsLT5jbF9jdW11bCAgICAgICAgPSAwOworCWNsLT5jbF9kICAgICAgICAgICAgPSAwOworCWNsLT5jbF9lICAgICAgICAgICAgPSAwOworCWNsLT5jbF92dCAgICAgICAgICAgPSAwOworCWNsLT5jbF92dGFkaiAgICAgICAgPSAwOworCWNsLT5jbF92dG9mZiAgICAgICAgPSAwOworCWNsLT5jbF9jdnRtaW4gICAgICAgPSAwOworCWNsLT5jbF9jdnRtYXggICAgICAgPSAwOworCWNsLT5jbF9jdnRvZmYgICAgICAgPSAwOworCWNsLT5jbF9wY3Z0b2ZmICAgICAgPSAwOworCWNsLT5jbF92dHBlcmlvZCAgICAgPSAwOworCWNsLT5jbF9wYXJlbnRwZXJpb2QgPSAwOworCWNsLT5jbF9mICAgICAgICAgICAgPSAwOworCWNsLT5jbF9teWYgICAgICAgICAgPSAwOworCWNsLT5jbF9teWZhZGogICAgICAgPSAwOworCWNsLT5jbF9jZm1pbiAgICAgICAgPSAwOworCWNsLT5jbF9uYWN0aXZlICAgICAgPSAwOworCisJY2wtPnZ0X3RyZWUgPSBSQl9ST09UOworCWNsLT5jZl90cmVlID0gUkJfUk9PVDsKKwlxZGlzY19yZXNldChjbC0+cWRpc2MpOworCisJaWYgKGNsLT5jbF9mbGFncyAmIEhGU0NfUlNDKQorCQlydHNjX2luaXQoJmNsLT5jbF9kZWFkbGluZSwgJmNsLT5jbF9yc2MsIDAsIDApOworCWlmIChjbC0+Y2xfZmxhZ3MgJiBIRlNDX0ZTQykKKwkJcnRzY19pbml0KCZjbC0+Y2xfdmlydHVhbCwgJmNsLT5jbF9mc2MsIDAsIDApOworCWlmIChjbC0+Y2xfZmxhZ3MgJiBIRlNDX1VTQykKKwkJcnRzY19pbml0KCZjbC0+Y2xfdWxpbWl0LCAmY2wtPmNsX3VzYywgMCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCitoZnNjX3Jlc2V0X3FkaXNjKHN0cnVjdCBRZGlzYyAqc2NoKQoreworCXN0cnVjdCBoZnNjX3NjaGVkICpxID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCBoZnNjX2NsYXNzICpjbDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBIRlNDX0hTSVpFOyBpKyspIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjbCwgJnEtPmNsaGFzaFtpXSwgaGxpc3QpCisJCQloZnNjX3Jlc2V0X2NsYXNzKGNsKTsKKwl9CisJX19za2JfcXVldWVfcHVyZ2UoJnEtPnJlcXVldWUpOworCXEtPmVsaWdpYmxlID0gUkJfUk9PVDsKKwlJTklUX0xJU1RfSEVBRCgmcS0+ZHJvcGxpc3QpOworCWRlbF90aW1lcigmcS0+d2RfdGltZXIpOworCXNjaC0+ZmxhZ3MgJj0gflRDUV9GX1RIUk9UVExFRDsKKwlzY2gtPnEucWxlbiA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitoZnNjX2Rlc3Ryb3lfcWRpc2Moc3RydWN0IFFkaXNjICpzY2gpCit7CisJc3RydWN0IGhmc2Nfc2NoZWQgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJc3RydWN0IGhmc2NfY2xhc3MgKmNsLCAqbmV4dDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBIRlNDX0hTSVpFOyBpKyspIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNsLCBuZXh0LCAmcS0+Y2xoYXNoW2ldLCBobGlzdCkKKwkJCWhmc2NfZGVzdHJveV9jbGFzcyhzY2gsIGNsKTsKKwl9CisJX19za2JfcXVldWVfcHVyZ2UoJnEtPnJlcXVldWUpOworCWRlbF90aW1lcigmcS0+d2RfdGltZXIpOworfQorCitzdGF0aWMgaW50CitoZnNjX2R1bXBfcWRpc2Moc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGhmc2Nfc2NoZWQgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3QgdGNfaGZzY19xb3B0IHFvcHQ7CisKKwlxb3B0LmRlZmNscyA9IHEtPmRlZmNsczsKKwlSVEFfUFVUKHNrYiwgVENBX09QVElPTlMsIHNpemVvZihxb3B0KSwgJnFvcHQpOworCXJldHVybiBza2ItPmxlbjsKKworIHJ0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50CitoZnNjX2VucXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjICpzY2gpCit7CisJc3RydWN0IGhmc2NfY2xhc3MgKmNsOworCXVuc2lnbmVkIGludCBsZW47CisJaW50IGVycjsKKworCWNsID0gaGZzY19jbGFzc2lmeShza2IsIHNjaCwgJmVycik7CisJaWYgKGNsID09IE5VTEwpIHsKKwkJaWYgKGVyciA9PSBORVRfWE1JVF9EUk9QKQorCQkJc2NoLT5xc3RhdHMuZHJvcHMrKzsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiBlcnI7CisJfQorCisJbGVuID0gc2tiLT5sZW47CisJZXJyID0gY2wtPnFkaXNjLT5lbnF1ZXVlKHNrYiwgY2wtPnFkaXNjKTsKKwlpZiAodW5saWtlbHkoZXJyICE9IE5FVF9YTUlUX1NVQ0NFU1MpKSB7CisJCWNsLT5xc3RhdHMuZHJvcHMrKzsKKwkJc2NoLT5xc3RhdHMuZHJvcHMrKzsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoY2wtPnFkaXNjLT5xLnFsZW4gPT0gMSkKKwkJc2V0X2FjdGl2ZShjbCwgbGVuKTsKKworCWNsLT5ic3RhdHMucGFja2V0cysrOworCWNsLT5ic3RhdHMuYnl0ZXMgKz0gbGVuOworCXNjaC0+YnN0YXRzLnBhY2tldHMrKzsKKwlzY2gtPmJzdGF0cy5ieXRlcyArPSBsZW47CisJc2NoLT5xLnFsZW4rKzsKKworCXJldHVybiBORVRfWE1JVF9TVUNDRVNTOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgoraGZzY19kZXF1ZXVlKHN0cnVjdCBRZGlzYyAqc2NoKQoreworCXN0cnVjdCBoZnNjX3NjaGVkICpxID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCBoZnNjX2NsYXNzICpjbDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXU2NCBjdXJfdGltZTsKKwl1bnNpZ25lZCBpbnQgbmV4dF9sZW47CisJaW50IHJlYWx0aW1lID0gMDsKKworCWlmIChzY2gtPnEucWxlbiA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKHNrYiA9IF9fc2tiX2RlcXVldWUoJnEtPnJlcXVldWUpKSkKKwkJZ290byBvdXQ7CisKKwlQU0NIRURfR0VUX1RJTUUoY3VyX3RpbWUpOworCisJLyoKKwkgKiBpZiB0aGVyZSBhcmUgZWxpZ2libGUgY2xhc3NlcywgdXNlIHJlYWwtdGltZSBjcml0ZXJpYS4KKwkgKiBmaW5kIHRoZSBjbGFzcyB3aXRoIHRoZSBtaW5pbXVtIGRlYWRsaW5lIGFtb25nCisJICogdGhlIGVsaWdpYmxlIGNsYXNzZXMuCisJICovCisJaWYgKChjbCA9IGVsdHJlZV9nZXRfbWluZGwocSwgY3VyX3RpbWUpKSAhPSBOVUxMKSB7CisJCXJlYWx0aW1lID0gMTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiB1c2UgbGluay1zaGFyaW5nIGNyaXRlcmlhCisJCSAqIGdldCB0aGUgY2xhc3Mgd2l0aCB0aGUgbWluaW11bSB2dCBpbiB0aGUgaGllcmFyY2h5CisJCSAqLworCQljbCA9IHZ0dHJlZV9nZXRfbWludnQoJnEtPnJvb3QsIGN1cl90aW1lKTsKKwkJaWYgKGNsID09IE5VTEwpIHsKKwkJCXNjaC0+cXN0YXRzLm92ZXJsaW1pdHMrKzsKKwkJCWhmc2Nfc2NoZWR1bGVfd2F0Y2hkb2coc2NoLCBjdXJfdGltZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCXNrYiA9IGNsLT5xZGlzYy0+ZGVxdWV1ZShjbC0+cWRpc2MpOworCWlmIChza2IgPT0gTlVMTCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKCJIRlNDOiBOb24td29yay1jb25zZXJ2aW5nIHFkaXNjID9cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl1cGRhdGVfdmYoY2wsIHNrYi0+bGVuLCBjdXJfdGltZSk7CisJaWYgKHJlYWx0aW1lKQorCQljbC0+Y2xfY3VtdWwgKz0gc2tiLT5sZW47CisKKwlpZiAoY2wtPnFkaXNjLT5xLnFsZW4gIT0gMCkgeworCQlpZiAoY2wtPmNsX2ZsYWdzICYgSEZTQ19SU0MpIHsKKwkJCS8qIHVwZGF0ZSBlZCAqLworCQkJbmV4dF9sZW4gPSBxZGlzY19wZWVrX2xlbihjbC0+cWRpc2MpOworCQkJaWYgKHJlYWx0aW1lKQorCQkJCXVwZGF0ZV9lZChjbCwgbmV4dF9sZW4pOworCQkJZWxzZQorCQkJCXVwZGF0ZV9kKGNsLCBuZXh0X2xlbik7CisJCX0KKwl9IGVsc2UgeworCQkvKiB0aGUgY2xhc3MgYmVjb21lcyBwYXNzaXZlICovCisJCXNldF9wYXNzaXZlKGNsKTsKKwl9CisKKyBvdXQ6CisJc2NoLT5mbGFncyAmPSB+VENRX0ZfVEhST1RUTEVEOworCXNjaC0+cS5xbGVuLS07CisKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgaW50CitoZnNjX3JlcXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjICpzY2gpCit7CisJc3RydWN0IGhmc2Nfc2NoZWQgKnEgPSBxZGlzY19wcml2KHNjaCk7CisKKwlfX3NrYl9xdWV1ZV9oZWFkKCZxLT5yZXF1ZXVlLCBza2IpOworCXNjaC0+cS5xbGVuKys7CisJc2NoLT5xc3RhdHMucmVxdWV1ZXMrKzsKKwlyZXR1cm4gTkVUX1hNSVRfU1VDQ0VTUzsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAoraGZzY19kcm9wKHN0cnVjdCBRZGlzYyAqc2NoKQoreworCXN0cnVjdCBoZnNjX3NjaGVkICpxID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCBoZnNjX2NsYXNzICpjbDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbCwgJnEtPmRyb3BsaXN0LCBkbGlzdCkgeworCQlpZiAoY2wtPnFkaXNjLT5vcHMtPmRyb3AgIT0gTlVMTCAmJgorCQkgICAgKGxlbiA9IGNsLT5xZGlzYy0+b3BzLT5kcm9wKGNsLT5xZGlzYykpID4gMCkgeworCQkJaWYgKGNsLT5xZGlzYy0+cS5xbGVuID09IDApIHsKKwkJCQl1cGRhdGVfdmYoY2wsIDAsIDApOworCQkJCXNldF9wYXNzaXZlKGNsKTsKKwkJCX0gZWxzZSB7CisJCQkJbGlzdF9tb3ZlX3RhaWwoJmNsLT5kbGlzdCwgJnEtPmRyb3BsaXN0KTsKKwkJCX0KKwkJCWNsLT5xc3RhdHMuZHJvcHMrKzsKKwkJCXNjaC0+cXN0YXRzLmRyb3BzKys7CisJCQlzY2gtPnEucWxlbi0tOworCQkJcmV0dXJuIGxlbjsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBRZGlzY19jbGFzc19vcHMgaGZzY19jbGFzc19vcHMgPSB7CisJLmNoYW5nZQkJPSBoZnNjX2NoYW5nZV9jbGFzcywKKwkuZGVsZXRlCQk9IGhmc2NfZGVsZXRlX2NsYXNzLAorCS5ncmFmdAkJPSBoZnNjX2dyYWZ0X2NsYXNzLAorCS5sZWFmCQk9IGhmc2NfY2xhc3NfbGVhZiwKKwkuZ2V0CQk9IGhmc2NfZ2V0X2NsYXNzLAorCS5wdXQJCT0gaGZzY19wdXRfY2xhc3MsCisJLmJpbmRfdGNmCT0gaGZzY19iaW5kX3RjZiwKKwkudW5iaW5kX3RjZgk9IGhmc2NfdW5iaW5kX3RjZiwKKwkudGNmX2NoYWluCT0gaGZzY190Y2ZfY2hhaW4sCisJLmR1bXAJCT0gaGZzY19kdW1wX2NsYXNzLAorCS5kdW1wX3N0YXRzCT0gaGZzY19kdW1wX2NsYXNzX3N0YXRzLAorCS53YWxrCQk9IGhmc2Nfd2FsaworfTsKKworc3RhdGljIHN0cnVjdCBRZGlzY19vcHMgaGZzY19xZGlzY19vcHMgPSB7CisJLmlkCQk9ICJoZnNjIiwKKwkuaW5pdAkJPSBoZnNjX2luaXRfcWRpc2MsCisJLmNoYW5nZQkJPSBoZnNjX2NoYW5nZV9xZGlzYywKKwkucmVzZXQJCT0gaGZzY19yZXNldF9xZGlzYywKKwkuZGVzdHJveQk9IGhmc2NfZGVzdHJveV9xZGlzYywKKwkuZHVtcAkJPSBoZnNjX2R1bXBfcWRpc2MsCisJLmVucXVldWUJPSBoZnNjX2VucXVldWUsCisJLmRlcXVldWUJPSBoZnNjX2RlcXVldWUsCisJLnJlcXVldWUJPSBoZnNjX3JlcXVldWUsCisJLmRyb3AJCT0gaGZzY19kcm9wLAorCS5jbF9vcHMJCT0gJmhmc2NfY2xhc3Nfb3BzLAorCS5wcml2X3NpemUJPSBzaXplb2Yoc3RydWN0IGhmc2Nfc2NoZWQpLAorCS5vd25lcgkJPSBUSElTX01PRFVMRQorfTsKKworc3RhdGljIGludCBfX2luaXQKK2hmc2NfaW5pdCh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9xZGlzYygmaGZzY19xZGlzY19vcHMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2hmc2NfY2xlYW51cCh2b2lkKQoreworCXVucmVnaXN0ZXJfcWRpc2MoJmhmc2NfcWRpc2Nfb3BzKTsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX2luaXQoaGZzY19pbml0KTsKK21vZHVsZV9leGl0KGhmc2NfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2h0Yi5jIGIvbmV0L3NjaGVkL3NjaF9odGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODU5MzVlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjaGVkL3NjaF9odGIuYwpAQCAtMCwwICsxLDE3NTkgQEAKKy8qIHZpbTogdHM9OCBzdz04CisgKiBuZXQvc2NoZWQvc2NoX2h0Yi5jCUhpZXJhcmNoaWNhbCB0b2tlbiBidWNrZXQsIGZlZWQgdHJlZSB2ZXJzaW9uCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJTWFydGluIERldmVyYSwgPGRldmlrQGNkaS5jej4KKyAqCisgKiBDcmVkaXRzIChpbiB0aW1lIG9yZGVyKSBmb3Igb2xkZXIgSFRCIHZlcnNpb25zOgorICogICAgICAgICAgICAgIFN0ZWYgQ29lbmUgPHN0ZWYuY29lbmVAZG9jdW0ub3JnPgorICoJCQlIVEIgc3VwcG9ydCBhdCBMQVJUQyBtYWlsaW5nIGxpc3QKKyAqCQlPbmRyZWogS3JhdXMsIDxrcmF1c29AYmFyci5jej4gCisgKgkJCWZvdW5kIG1pc3NpbmcgSU5JVF9RRElTQyhodGIpCisgKgkJVmxhZGltaXIgU21lbGhhdXMsIEFhbWVyIEFraHRlciwgQmVydCBIdWJlcnQKKyAqCQkJaGVscGVkIGEgbG90IHRvIGxvY2F0ZSBuYXN0eSBjbGFzcyBzdGFsbCBidWcKKyAqCQlBbmRpIEtsZWVuLCBKYW1hbCBIYWRpLCBCZXJ0IEh1YmVydAorICoJCQljb2RlIHJldmlldyBhbmQgaGVscGZ1bCBjb21tZW50cyBvbiBzaGFwaW5nCisgKgkJVG9tYXN6IFdyb25hLCA8dHdAZXRlci50eW0ucGw+CisgKgkJCWNyZWF0ZWQgdGVzdCBjYXNlIHNvIHRoYXQgSSB3YXMgYWJsZSB0byBmaXggbmFzdHkgYnVnCisgKgkJV2lsZnJpZWQgV2Vpc3NtYW5uCisgKgkJCXNwb3R0ZWQgYnVnIGluIGRlcXVldWUgY29kZSBhbmQgaGVscGVkIHdpdGggZml4CisgKgkJSmlyaSBGb2p0YXNlaworICoJCQlmaXhlZCByZXF1ZXVlIHJvdXRpbmUKKyAqCQlhbmQgbWFueSBvdGhlcnMuIHRoYW5rcy4KKyAqCisgKiAkSWQ6IHNjaF9odGIuYyx2IDEuMjUgMjAwMy8xMi8wNyAxMTowODoyNSBkZXZpayBFeHAgZGV2aWsgJAorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CisKKy8qIEhUQiBhbGdvcml0aG0uCisgICAgQXV0aG9yOiBkZXZpa0BjZGkuY3oKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBIVEIgaXMgbGlrZSBUQkYgd2l0aCBtdWx0aXBsZSBjbGFzc2VzLiBJdCBpcyBhbHNvIHNpbWlsYXIgdG8gQ0JRIGJlY2F1c2UKKyAgICBpdCBhbGxvd3MgdG8gYXNzaWduIHByaW9yaXR5IHRvIGVhY2ggY2xhc3MgaW4gaGllcmFyY2h5LiAKKyAgICBJbiBmYWN0IGl0IGlzIGFub3RoZXIgaW1wbGVtZW50YXRpb24gb2YgRmxveWQncyBmb3JtYWwgc2hhcmluZy4KKworICAgIExldmVsczoKKyAgICBFYWNoIGNsYXNzIGlzIGFzc2lnbmVkIGxldmVsLiBMZWFmIGhhcyBBTFdBWVMgbGV2ZWwgMCBhbmQgcm9vdCAKKyAgICBjbGFzc2VzIGhhdmUgbGV2ZWwgVENfSFRCX01BWERFUFRILTEuIEludGVyaW9yIG5vZGVzIGhhcyBsZXZlbAorICAgIG9uZSBsZXNzIHRoYW4gdGhlaXIgcGFyZW50LgorKi8KKworI2RlZmluZSBIVEJfSFNJWkUgMTYJLyogY2xhc3NpZCBoYXNoIHNpemUgKi8KKyNkZWZpbmUgSFRCX0VXTUFDIDIJLyogcmF0ZSBhdmVyYWdlIG92ZXIgSFRCX0VXTUFDKkhUQl9IU0laRSBzZWMgKi8KKyN1bmRlZiBIVEJfREVCVUcJLyogY29tcGlsZSBkZWJ1Z2dpbmcgc3VwcG9ydCAoYWN0aXZhdGVkIGJ5IHRjIHRvb2wpICovCisjZGVmaW5lIEhUQl9SQVRFQ00gMSAgICAvKiB3aGV0aGVyIHRvIHVzZSByYXRlIGNvbXB1dGVyICovCisjZGVmaW5lIEhUQl9IWVNURVJFU0lTIDEvKiB3aGV0aGVyIHRvIHVzZSBtb2RlIGh5c3RlcmVzaXMgZm9yIHNwZWVkdXAgKi8KKyNkZWZpbmUgSFRCX1FMT0NLKFMpIHNwaW5fbG9ja19iaCgmKFMpLT5kZXYtPnF1ZXVlX2xvY2spCisjZGVmaW5lIEhUQl9RVU5MT0NLKFMpIHNwaW5fdW5sb2NrX2JoKCYoUyktPmRldi0+cXVldWVfbG9jaykKKyNkZWZpbmUgSFRCX1ZFUiAweDMwMDExCS8qIG1ham9yIG11c3QgYmUgbWF0Y2hlZCB3aXRoIG51bWJlciBzdXBsaWVkIGJ5IFRDIGFzIHZlcnNpb24gKi8KKworI2lmIEhUQl9WRVIgPj4gMTYgIT0gVENfSFRCX1BST1RPVkVSCisjZXJyb3IgIk1pc21hdGNoZWQgc2NoX2h0Yi5jIGFuZCBwa3Rfc2NoLmgiCisjZW5kaWYKKworLyogZGVidWdnaW5nIHN1cHBvcnQ7IFMgaXMgc3Vic3lzdGVtLCB0aGVzZSBhcmUgZGVmaW5lZDoKKyAgMCAtIG5ldGxpbmsgbWVzc2FnZXMKKyAgMSAtIGVucXVldWUKKyAgMiAtIGRyb3AgJiByZXF1ZXVlCisgIDMgLSBkZXF1ZXVlIG1haW4KKyAgNCAtIGRlcXVldWUgb25lIHByaW8gRFJSIHBhcnQKKyAgNSAtIGRlcXVldWUgY2xhc3MgYWNjb3VudGluZworICA2IC0gY2xhc3Mgb3ZlcmxpbWl0IHN0YXR1cyBjb21wdXRhdGlvbgorICA3IC0gaGludCB0cmVlCisgIDggLSBldmVudCBxdWV1ZQorIDEwIC0gcmF0ZSBlc3RpbWF0b3IKKyAxMSAtIGNsYXNzaWZpZXIgCisgMTIgLSBmYXN0IGRlcXVldWUgY2FjaGUKKworIEwgaXMgbGV2ZWw7IDAgPSBub25lLCAxID0gYmFzaWMgaW5mbywgMiA9IGRldGFpbGVkLCAzID0gZnVsbAorIHEtPmRlYnVnIHVpbnQzMiBjb250YWlucyAxNiAyLWJpdCBmaWVsZHMgb25lIGZvciBzdWJzeXN0ZW0gc3RhcnRpbmcKKyBmcm9tIExTQgorICovCisjaWZkZWYgSFRCX0RFQlVHCisjZGVmaW5lIEhUQl9EQkdfQ09ORChTLEwpICgoKHEtPmRlYnVnPj4oMipTKSkmMykgPj0gTCkKKyNkZWZpbmUgSFRCX0RCRyhTLEwsRk1ULEFSRy4uLikgaWYgKEhUQl9EQkdfQ09ORChTLEwpKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgRk1ULCMjQVJHKQorI2RlZmluZSBIVEJfQ0hDTChjbCkgQlVHX1RSQVAoKGNsKS0+bWFnaWMgPT0gSFRCX0NNQUdJQykKKyNkZWZpbmUgSFRCX1BBU1NRIHEsCisjZGVmaW5lIEhUQl9BUkdRIHN0cnVjdCBodGJfc2NoZWQgKnEsCisjZGVmaW5lIHN0YXRpYworI3VuZGVmIF9faW5saW5lX18KKyNkZWZpbmUgX19pbmxpbmVfXworI3VuZGVmIGlubGluZQorI2RlZmluZSBpbmxpbmUKKyNkZWZpbmUgSFRCX0NNQUdJQyAweEZFRkFGRUYxCisjZGVmaW5lIGh0Yl9zYWZlX3JiX2VyYXNlKE4sUikgZG8geyBCVUdfVFJBUCgoTiktPnJiX2NvbG9yICE9IC0xKTsgXAorCQlpZiAoKE4pLT5yYl9jb2xvciA9PSAtMSkgYnJlYWs7IFwKKwkJcmJfZXJhc2UoTixSKTsgXAorCQkoTiktPnJiX2NvbG9yID0gLTE7IH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBIVEJfREJHX0NPTkQoUyxMKSAoMCkKKyNkZWZpbmUgSFRCX0RCRyhTLEwsRk1ULEFSRy4uLikKKyNkZWZpbmUgSFRCX1BBU1NRCisjZGVmaW5lIEhUQl9BUkdRCisjZGVmaW5lIEhUQl9DSENMKGNsKQorI2RlZmluZSBodGJfc2FmZV9yYl9lcmFzZShOLFIpIHJiX2VyYXNlKE4sUikKKyNlbmRpZgorCisKKy8qIHVzZWQgaW50ZXJuYWx5IHRvIGtlZXAgc3RhdHVzIG9mIHNpbmdsZSBjbGFzcyAqLworZW51bSBodGJfY21vZGUgeworICAgIEhUQl9DQU5UX1NFTkQsCQkvKiBjbGFzcyBjYW4ndCBzZW5kIGFuZCBjYW4ndCBib3Jyb3cgKi8KKyAgICBIVEJfTUFZX0JPUlJPVywJCS8qIGNsYXNzIGNhbid0IHNlbmQgYnV0IG1heSBib3Jyb3cgKi8KKyAgICBIVEJfQ0FOX1NFTkQJCS8qIGNsYXNzIGNhbiBzZW5kICovCit9OworCisvKiBpbnRlcmlvciAmIGxlYWYgbm9kZXM7IHByb3BzIHNwZWNpZmljIHRvIGxlYXZlcyBhcmUgbWFya2VkIEw6ICovCitzdHJ1Y3QgaHRiX2NsYXNzCit7CisjaWZkZWYgSFRCX0RFQlVHCisJdW5zaWduZWQgbWFnaWM7CisjZW5kaWYKKyAgICAvKiBnZW5lcmFsIGNsYXNzIHBhcmFtZXRlcnMgKi8KKyAgICB1MzIgY2xhc3NpZDsKKyAgICBzdHJ1Y3QgZ25ldF9zdGF0c19iYXNpYyBic3RhdHM7CisgICAgc3RydWN0IGduZXRfc3RhdHNfcXVldWUgcXN0YXRzOworICAgIHN0cnVjdCBnbmV0X3N0YXRzX3JhdGVfZXN0IHJhdGVfZXN0OworICAgIHN0cnVjdCB0Y19odGJfeHN0YXRzIHhzdGF0czsvKiBvdXIgc3BlY2lhbCBzdGF0cyAqLworICAgIGludCByZWZjbnQ7CQkJLyogdXNhZ2UgY291bnQgb2YgdGhpcyBjbGFzcyAqLworCisjaWZkZWYgSFRCX1JBVEVDTQorICAgIC8qIHJhdGUgbWVhc3VyZW1lbnQgY291bnRlcnMgKi8KKyAgICB1bnNpZ25lZCBsb25nIHJhdGVfYnl0ZXMsc3VtX2J5dGVzOworICAgIHVuc2lnbmVkIGxvbmcgcmF0ZV9wYWNrZXRzLHN1bV9wYWNrZXRzOworI2VuZGlmCisKKyAgICAvKiB0b3BvbG9neSAqLworICAgIGludCBsZXZlbDsJCQkvKiBvdXIgbGV2ZWwgKHNlZSBhYm92ZSkgKi8KKyAgICBzdHJ1Y3QgaHRiX2NsYXNzICpwYXJlbnQ7CS8qIHBhcmVudCBjbGFzcyAqLworICAgIHN0cnVjdCBsaXN0X2hlYWQgaGxpc3Q7CS8qIGNsYXNzaWQgaGFzaCBsaXN0IGl0ZW0gKi8KKyAgICBzdHJ1Y3QgbGlzdF9oZWFkIHNpYmxpbmc7CS8qIHNpYmxpbmcgbGlzdCBpdGVtICovCisgICAgc3RydWN0IGxpc3RfaGVhZCBjaGlsZHJlbjsJLyogY2hpbGRyZW4gbGlzdCAqLworCisgICAgdW5pb24geworCSAgICBzdHJ1Y3QgaHRiX2NsYXNzX2xlYWYgeworCQkgICAgc3RydWN0IFFkaXNjICpxOworCQkgICAgaW50IHByaW87CisJCSAgICBpbnQgYXByaW87CQorCQkgICAgaW50IHF1YW50dW07CisJCSAgICBpbnQgZGVmaWNpdFtUQ19IVEJfTUFYREVQVEhdOworCQkgICAgc3RydWN0IGxpc3RfaGVhZCBkcm9wX2xpc3Q7CisJICAgIH0gbGVhZjsKKwkgICAgc3RydWN0IGh0Yl9jbGFzc19pbm5lciB7CisJCSAgICBzdHJ1Y3QgcmJfcm9vdCBmZWVkW1RDX0hUQl9OVU1QUklPXTsgLyogZmVlZCB0cmVlcyAqLworCQkgICAgc3RydWN0IHJiX25vZGUgKnB0cltUQ19IVEJfTlVNUFJJT107IC8qIGN1cnJlbnQgY2xhc3MgcHRyICovCisgICAgICAgICAgICAvKiBXaGVuIGNsYXNzIGNoYW5nZXMgZnJvbSBzdGF0ZSAxLT4yIGFuZCBkaXNjb25uZWN0cyBmcm9tIAorICAgICAgICAgICAgICAgcGFyZW50J3MgZmVlZCB0aGVuIHdlIGxvc3QgcHRyIHZhbHVlIGFuZCBzdGFydCBmcm9tIHRoZQorICAgICAgICAgICAgICBmaXJzdCBjaGlsZCBhZ2Fpbi4gSGVyZSB3ZSBzdG9yZSBjbGFzc2lkIG9mIHRoZQorICAgICAgICAgICAgICBsYXN0IHZhbGlkIHB0ciAodXNlZCB3aGVuIHB0ciBpcyBOVUxMKS4gKi8KKyAgICAgICAgICAgICAgdTMyIGxhc3RfcHRyX2lkW1RDX0hUQl9OVU1QUklPXTsKKwkgICAgfSBpbm5lcjsKKyAgICB9IHVuOworICAgIHN0cnVjdCByYl9ub2RlIG5vZGVbVENfSFRCX05VTVBSSU9dOyAvKiBub2RlIGZvciBzZWxmIG9yIGZlZWQgdHJlZSAqLworICAgIHN0cnVjdCByYl9ub2RlIHBxX25vZGU7CQkgLyogbm9kZSBmb3IgZXZlbnQgcXVldWUgKi8KKyAgICB1bnNpZ25lZCBsb25nIHBxX2tleTsJLyogdGhlIHNhbWUgdHlwZSBhcyBqaWZmaWVzIGdsb2JhbCAqLworICAgIAorICAgIGludCBwcmlvX2FjdGl2aXR5OwkJLyogZm9yIHdoaWNoIHByaW9zIGFyZSB3ZSBhY3RpdmUgKi8KKyAgICBlbnVtIGh0Yl9jbW9kZSBjbW9kZTsJLyogY3VycmVudCBtb2RlIG9mIHRoZSBjbGFzcyAqLworCisgICAgLyogY2xhc3MgYXR0YWNoZWQgZmlsdGVycyAqLworICAgIHN0cnVjdCB0Y2ZfcHJvdG8gKmZpbHRlcl9saXN0OworICAgIGludCBmaWx0ZXJfY250OworCisgICAgaW50IHdhcm5lZDsJCS8qIG9ubHkgb25lIHdhcm5pbmcgYWJvdXQgbm9uIHdvcmsgY29uc2VydmluZyAuLiAqLworCisgICAgLyogdG9rZW4gYnVja2V0IHBhcmFtZXRlcnMgKi8KKyAgICBzdHJ1Y3QgcWRpc2NfcmF0ZV90YWJsZSAqcmF0ZTsJLyogcmF0ZSB0YWJsZSBvZiB0aGUgY2xhc3MgaXRzZWxmICovCisgICAgc3RydWN0IHFkaXNjX3JhdGVfdGFibGUgKmNlaWw7CS8qIGNlaWxpbmcgcmF0ZSAobGltaXRzIGJvcnJvd3MgdG9vKSAqLworICAgIGxvbmcgYnVmZmVyLGNidWZmZXI7CQkvKiB0b2tlbiBidWNrZXQgZGVwdGgvcmF0ZSAqLworICAgIGxvbmcgbWJ1ZmZlcjsJCQkvKiBtYXggd2FpdCB0aW1lICovCisgICAgbG9uZyB0b2tlbnMsY3Rva2VuczsJCS8qIGN1cnJlbnQgbnVtYmVyIG9mIHRva2VucyAqLworICAgIHBzY2hlZF90aW1lX3QgdF9jOwkJCS8qIGNoZWNrcG9pbnQgdGltZSAqLworfTsKKworLyogVE9ETzogbWF5YmUgY29tcHV0ZSByYXRlIHdoZW4gc2l6ZSBpcyB0b28gbGFyZ2UgLi4gb3IgZHJvcCA/ICovCitzdGF0aWMgX19pbmxpbmVfXyBsb25nIEwyVChzdHJ1Y3QgaHRiX2NsYXNzICpjbCxzdHJ1Y3QgcWRpc2NfcmF0ZV90YWJsZSAqcmF0ZSwKKwlpbnQgc2l6ZSkKK3sgCisgICAgaW50IHNsb3QgPSBzaXplID4+IHJhdGUtPnJhdGUuY2VsbF9sb2c7CisgICAgaWYgKHNsb3QgPiAyNTUpIHsKKwljbC0+eHN0YXRzLmdpYW50cysrOworCXNsb3QgPSAyNTU7CisgICAgfQorICAgIHJldHVybiByYXRlLT5kYXRhW3Nsb3RdOworfQorCitzdHJ1Y3QgaHRiX3NjaGVkCit7CisgICAgc3RydWN0IGxpc3RfaGVhZCByb290OwkJCS8qIHJvb3QgY2xhc3NlcyBsaXN0ICovCisgICAgc3RydWN0IGxpc3RfaGVhZCBoYXNoW0hUQl9IU0laRV07CQkvKiBoYXNoZWQgYnkgY2xhc3NpZCAqLworICAgIHN0cnVjdCBsaXN0X2hlYWQgZHJvcHNbVENfSFRCX05VTVBSSU9dOwkvKiBhY3RpdmUgbGVhdmVzIChmb3IgZHJvcHMpICovCisgICAgCisgICAgLyogc2VsZiBsaXN0IC0gcm9vdHMgb2Ygc2VsZiBnZW5lcmF0aW5nIHRyZWUgKi8KKyAgICBzdHJ1Y3QgcmJfcm9vdCByb3dbVENfSFRCX01BWERFUFRIXVtUQ19IVEJfTlVNUFJJT107CisgICAgaW50IHJvd19tYXNrW1RDX0hUQl9NQVhERVBUSF07CisgICAgc3RydWN0IHJiX25vZGUgKnB0cltUQ19IVEJfTUFYREVQVEhdW1RDX0hUQl9OVU1QUklPXTsKKyAgICB1MzIgbGFzdF9wdHJfaWRbVENfSFRCX01BWERFUFRIXVtUQ19IVEJfTlVNUFJJT107CisKKyAgICAvKiBzZWxmIHdhaXQgbGlzdCAtIHJvb3RzIG9mIHdhaXQgUFFzIHBlciByb3cgKi8KKyAgICBzdHJ1Y3QgcmJfcm9vdCB3YWl0X3BxW1RDX0hUQl9NQVhERVBUSF07CisKKyAgICAvKiB0aW1lIG9mIG5lYXJlc3QgZXZlbnQgcGVyIGxldmVsIChyb3cpICovCisgICAgdW5zaWduZWQgbG9uZyBuZWFyX2V2X2NhY2hlW1RDX0hUQl9NQVhERVBUSF07CisKKyAgICAvKiBjYWNoZWQgdmFsdWUgb2YgamlmZmllcyBpbiBkZXF1ZXVlICovCisgICAgdW5zaWduZWQgbG9uZyBqaWZmaWVzOworCisgICAgLyogd2hldGhlciB3ZSBoaXQgbm9uLXdvcmsgY29uc2VydmluZyBjbGFzcyBkdXJpbmcgdGhpcyBkZXF1ZXVlOyB3ZSB1c2UgKi8KKyAgICBpbnQgbndjX2hpdDsJLyogdGhpcyB0byBkaXNhYmxlIG1pbmRlbGF5IGNvbXBsYWludCBpbiBkZXF1ZXVlICovCisKKyAgICBpbnQgZGVmY2xzOwkJLyogY2xhc3Mgd2hlcmUgdW5jbGFzc2lmaWVkIGZsb3dzIGdvIHRvICovCisgICAgdTMyIGRlYnVnOwkJLyogc3Vic3lzdGVtIGRlYnVnIGxldmVscyAqLworCisgICAgLyogZmlsdGVycyBmb3IgcWRpc2MgaXRzZWxmICovCisgICAgc3RydWN0IHRjZl9wcm90byAqZmlsdGVyX2xpc3Q7CisgICAgaW50IGZpbHRlcl9jbnQ7CisKKyAgICBpbnQgcmF0ZTJxdWFudHVtOwkJLyogcXVhbnQgPSByYXRlIC8gcmF0ZTJxdWFudHVtICovCisgICAgcHNjaGVkX3RpbWVfdCBub3c7CQkvKiBjYWNoZWQgZGVxdWV1ZSB0aW1lICovCisgICAgc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CS8qIHNlbmQgZGVsYXkgdGltZXIgKi8KKyNpZmRlZiBIVEJfUkFURUNNCisgICAgc3RydWN0IHRpbWVyX2xpc3QgcnR0aW07CS8qIHJhdGUgY29tcHV0ZXIgdGltZXIgKi8KKyAgICBpbnQgcmVjbXBfYnVja2V0OwkJLyogd2hpY2ggaGFzaCBidWNrZXQgdG8gcmVjb21wdXRlIG5leHQgKi8KKyNlbmRpZgorICAgIAorICAgIC8qIG5vbiBzaGFwZWQgc2ticzsgbGV0IHRoZW0gZ28gZGlyZWN0bHkgdGhydSAqLworICAgIHN0cnVjdCBza19idWZmX2hlYWQgZGlyZWN0X3F1ZXVlOworICAgIGludCBkaXJlY3RfcWxlbjsgIC8qIG1heCBxbGVuIG9mIGFib3ZlICovCisKKyAgICBsb25nIGRpcmVjdF9wa3RzOworfTsKKworLyogY29tcHV0ZSBoYXNoIG9mIHNpemUgSFRCX0hTSVpFIGZvciBnaXZlbiBoYW5kbGUgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCBodGJfaGFzaCh1MzIgaCkgCit7CisjaWYgSFRCX0hTSVpFICE9IDE2CisgI2Vycm9yICJEZWNsYXJlIG5ldyBoYXNoIGZvciB5b3VyIEhUQl9IU0laRSIKKyNlbmRpZgorICAgIGggXj0gaD4+ODsJLyogc3RvbGVuIGZyb20gY2JxX2hhc2ggKi8KKyAgICBoIF49IGg+PjQ7CisgICAgcmV0dXJuIGggJiAweGY7Cit9CisKKy8qIGZpbmQgY2xhc3MgaW4gZ2xvYmFsIGhhc2ggdGFibGUgdXNpbmcgZ2l2ZW4gaGFuZGxlICovCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgaHRiX2NsYXNzICpodGJfZmluZCh1MzIgaGFuZGxlLCBzdHJ1Y3QgUWRpc2MgKnNjaCkKK3sKKwlzdHJ1Y3QgaHRiX3NjaGVkICpxID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJaWYgKFRDX0hfTUFKKGhhbmRsZSkgIT0gc2NoLT5oYW5kbGUpIAorCQlyZXR1cm4gTlVMTDsKKwkKKwlsaXN0X2Zvcl9lYWNoIChwLHEtPmhhc2graHRiX2hhc2goaGFuZGxlKSkgeworCQlzdHJ1Y3QgaHRiX2NsYXNzICpjbCA9IGxpc3RfZW50cnkocCxzdHJ1Y3QgaHRiX2NsYXNzLGhsaXN0KTsKKwkJaWYgKGNsLT5jbGFzc2lkID09IGhhbmRsZSkKKwkJCXJldHVybiBjbDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogaHRiX2NsYXNzaWZ5IC0gY2xhc3NpZnkgYSBwYWNrZXQgaW50byBjbGFzcworICoKKyAqIEl0IHJldHVybnMgTlVMTCBpZiB0aGUgcGFja2V0IHNob3VsZCBiZSBkcm9wcGVkIG9yIC0xIGlmIHRoZSBwYWNrZXQKKyAqIHNob3VsZCBiZSBwYXNzZWQgZGlyZWN0bHkgdGhydS4gSW4gYWxsIG90aGVyIGNhc2VzIGxlYWYgY2xhc3MgaXMgcmV0dXJuZWQuCisgKiBXZSBhbGxvdyBkaXJlY3QgY2xhc3Mgc2VsZWN0aW9uIGJ5IGNsYXNzaWQgaW4gcHJpb3JpdHkuIFRoZSB3ZSBleGFtaW5lCisgKiBmaWx0ZXJzIGluIHFkaXNjIGFuZCBpbiBpbm5lciBub2RlcyAoaWYgaGlnaGVyIGZpbHRlciBwb2ludHMgdG8gdGhlIGlubmVyCisgKiBub2RlKS4gSWYgd2UgZW5kIHVwIHdpdGggY2xhc3NpZCBNQUpPUjowIHdlIGVucXVldWUgdGhlIHNrYiBpbnRvIHNwZWNpYWwKKyAqIGludGVybmFsIGZpZm8gKGRpcmVjdCkuIFRoZXNlIHBhY2tldHMgdGhlbiBnbyBkaXJlY3RseSB0aHJ1LiBJZiB3ZSBzdGlsbCAKKyAqIGhhdmUgbm8gdmFsaWQgbGVhZiB3ZSB0cnkgdG8gdXNlIE1BSk9SOmRlZmF1bHQgbGVhZi4gSXQgc3RpbGwgdW5zdWNjZXNzZnVsbAorICogdGhlbiBmaW5pc2ggYW5kIHJldHVybiBkaXJlY3QgcXVldWUuCisgKi8KKyNkZWZpbmUgSFRCX0RJUkVDVCAoc3RydWN0IGh0Yl9jbGFzcyopLTEKK3N0YXRpYyBpbmxpbmUgdTMyIGh0Yl9jbGFzc2lkKHN0cnVjdCBodGJfY2xhc3MgKmNsKQoreworCXJldHVybiAoY2wgJiYgY2wgIT0gSFRCX0RJUkVDVCkgPyBjbC0+Y2xhc3NpZCA6IFRDX0hfVU5TUEVDOworfQorCitzdGF0aWMgc3RydWN0IGh0Yl9jbGFzcyAqaHRiX2NsYXNzaWZ5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBRZGlzYyAqc2NoLCBpbnQgKnFlcnIpCit7CisJc3RydWN0IGh0Yl9zY2hlZCAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlzdHJ1Y3QgaHRiX2NsYXNzICpjbDsKKwlzdHJ1Y3QgdGNmX3Jlc3VsdCByZXM7CisJc3RydWN0IHRjZl9wcm90byAqdGNmOworCWludCByZXN1bHQ7CisKKwkvKiBhbGxvdyB0byBzZWxlY3QgY2xhc3MgYnkgc2V0dGluZyBza2ItPnByaW9yaXR5IHRvIHZhbGlkIGNsYXNzaWQ7CisJICAgbm90ZSB0aGF0IG5mbWFyayBjYW4gYmUgdXNlZCB0b28gYnkgYXR0YWNoaW5nIGZpbHRlciBmdyB3aXRoIG5vCisJICAgcnVsZXMgaW4gaXQgKi8KKwlpZiAoc2tiLT5wcmlvcml0eSA9PSBzY2gtPmhhbmRsZSkKKwkJcmV0dXJuIEhUQl9ESVJFQ1Q7ICAvKiBYOjAgKGRpcmVjdCBmbG93KSBzZWxlY3RlZCAqLworCWlmICgoY2wgPSBodGJfZmluZChza2ItPnByaW9yaXR5LHNjaCkpICE9IE5VTEwgJiYgY2wtPmxldmVsID09IDApIAorCQlyZXR1cm4gY2w7CisKKwkqcWVyciA9IE5FVF9YTUlUX0RST1A7CisJdGNmID0gcS0+ZmlsdGVyX2xpc3Q7CisJd2hpbGUgKHRjZiAmJiAocmVzdWx0ID0gdGNfY2xhc3NpZnkoc2tiLCB0Y2YsICZyZXMpKSA+PSAwKSB7CisjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCisJCXN3aXRjaCAocmVzdWx0KSB7CisJCWNhc2UgVENfQUNUX1FVRVVFRDoKKwkJY2FzZSBUQ19BQ1RfU1RPTEVOOiAKKwkJCSpxZXJyID0gTkVUX1hNSVRfU1VDQ0VTUzsKKwkJY2FzZSBUQ19BQ1RfU0hPVDoKKwkJCXJldHVybiBOVUxMOworCQl9CisjZWxpZiBkZWZpbmVkKENPTkZJR19ORVRfQ0xTX1BPTElDRSkKKwkJaWYgKHJlc3VsdCA9PSBUQ19QT0xJQ0VfU0hPVCkKKwkJCXJldHVybiBIVEJfRElSRUNUOworI2VuZGlmCisJCWlmICgoY2wgPSAodm9pZCopcmVzLmNsYXNzKSA9PSBOVUxMKSB7CisJCQlpZiAocmVzLmNsYXNzaWQgPT0gc2NoLT5oYW5kbGUpCisJCQkJcmV0dXJuIEhUQl9ESVJFQ1Q7ICAvKiBYOjAgKGRpcmVjdCBmbG93KSAqLworCQkJaWYgKChjbCA9IGh0Yl9maW5kKHJlcy5jbGFzc2lkLHNjaCkpID09IE5VTEwpCisJCQkJYnJlYWs7IC8qIGZpbHRlciBzZWxlY3RlZCBpbnZhbGlkIGNsYXNzaWQgKi8KKwkJfQorCQlpZiAoIWNsLT5sZXZlbCkKKwkJCXJldHVybiBjbDsgLyogd2UgaGl0IGxlYWY7IHJldHVybiBpdCAqLworCisJCS8qIHdlIGhhdmUgZ290IGlubmVyIGNsYXNzOyBhcHBseSBpbm5lciBmaWx0ZXIgY2hhaW4gKi8KKwkJdGNmID0gY2wtPmZpbHRlcl9saXN0OworCX0KKwkvKiBjbGFzc2lmaWNhdGlvbiBmYWlsZWQ7IHRyeSB0byB1c2UgZGVmYXVsdCBjbGFzcyAqLworCWNsID0gaHRiX2ZpbmQoVENfSF9NQUtFKFRDX0hfTUFKKHNjaC0+aGFuZGxlKSxxLT5kZWZjbHMpLHNjaCk7CisJaWYgKCFjbCB8fCBjbC0+bGV2ZWwpCisJCXJldHVybiBIVEJfRElSRUNUOyAvKiBiYWQgZGVmYXVsdCAuLiB0aGlzIGlzIHNhZmUgYmV0ICovCisJcmV0dXJuIGNsOworfQorCisjaWZkZWYgSFRCX0RFQlVHCitzdGF0aWMgdm9pZCBodGJfbmV4dF9yYl9ub2RlKHN0cnVjdCByYl9ub2RlICoqbik7CisjZGVmaW5lIEhUQl9EVU1UUkVFKHJvb3QsbWVtYikgaWYocm9vdCkgeyBcCisJc3RydWN0IHJiX25vZGUgKm4gPSAocm9vdCktPnJiX25vZGU7IFwKKwl3aGlsZSAobi0+cmJfbGVmdCkgbiA9IG4tPnJiX2xlZnQ7IFwKKwl3aGlsZSAobikgeyBcCisJCXN0cnVjdCBodGJfY2xhc3MgKmNsID0gcmJfZW50cnkobiwgc3RydWN0IGh0Yl9jbGFzcywgbWVtYik7IFwKKwkJcHJpbnRrKCIgJXgiLGNsLT5jbGFzc2lkKTsgaHRiX25leHRfcmJfbm9kZSAoJm4pOyBcCisJfSB9CisKK3N0YXRpYyB2b2lkIGh0Yl9kZWJ1Z19kdW1wIChzdHJ1Y3QgaHRiX3NjaGVkICpxKQoreworCWludCBpLHA7CisJcHJpbnRrKEtFUk5fREVCVUcgImh0YipnIGo9JWx1IGxqPSVsdVxuIixqaWZmaWVzLHEtPmppZmZpZXMpOworCS8qIHJvd3MgKi8KKwlmb3IgKGk9VENfSFRCX01BWERFUFRILTE7aT49MDtpLS0pIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImh0YipyJWQgbT0leCIsaSxxLT5yb3dfbWFza1tpXSk7CisJCWZvciAocD0wO3A8VENfSFRCX05VTVBSSU87cCsrKSB7CisJCQlpZiAoIXEtPnJvd1tpXVtwXS5yYl9ub2RlKSBjb250aW51ZTsKKwkJCXByaW50aygiIHAlZDoiLHApOworCQkJSFRCX0RVTVRSRUUocS0+cm93W2ldK3Asbm9kZVtwXSk7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworCX0KKwkvKiBjbGFzc2VzICovCisJZm9yIChpID0gMDsgaSA8IEhUQl9IU0laRTsgaSsrKSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJCWxpc3RfZm9yX2VhY2ggKGwscS0+aGFzaCtpKSB7CisJCQlzdHJ1Y3QgaHRiX2NsYXNzICpjbCA9IGxpc3RfZW50cnkobCxzdHJ1Y3QgaHRiX2NsYXNzLGhsaXN0KTsKKwkJCWxvbmcgZGlmZiA9IFBTQ0hFRF9URElGRl9TQUZFKHEtPm5vdywgY2wtPnRfYywgKHUzMiljbC0+bWJ1ZmZlcik7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiaHRiKmMleCBtPSVkIHQ9JWxkIGM9JWxkIHBxPSVsdSBkZj0lbGQgcWw9JWQgIgorCQkJCQkicGE9JXggZjoiLAorCQkJCWNsLT5jbGFzc2lkLGNsLT5jbW9kZSxjbC0+dG9rZW5zLGNsLT5jdG9rZW5zLAorCQkJCWNsLT5wcV9ub2RlLnJiX2NvbG9yPT0tMT8wOmNsLT5wcV9rZXksZGlmZiwKKwkJCQljbC0+bGV2ZWw/MDpjbC0+dW4ubGVhZi5xLT5xLnFsZW4sY2wtPnByaW9fYWN0aXZpdHkpOworCQkJaWYgKGNsLT5sZXZlbCkKKwkJCWZvciAocD0wO3A8VENfSFRCX05VTVBSSU87cCsrKSB7CisJCQkJaWYgKCFjbC0+dW4uaW5uZXIuZmVlZFtwXS5yYl9ub2RlKSBjb250aW51ZTsKKwkJCQlwcmludGsoIiBwJWQgYT0leDoiLHAsY2wtPnVuLmlubmVyLnB0cltwXT9yYl9lbnRyeShjbC0+dW4uaW5uZXIucHRyW3BdLCBzdHJ1Y3QgaHRiX2NsYXNzLG5vZGVbcF0pLT5jbGFzc2lkOjApOworCQkJCUhUQl9EVU1UUkVFKGNsLT51bi5pbm5lci5mZWVkK3Asbm9kZVtwXSk7CisJCQl9CisJCQlwcmludGsoIlxuIik7CisJCX0KKwl9Cit9CisjZW5kaWYKKy8qKgorICogaHRiX2FkZF90b19pZF90cmVlIC0gYWRkcyBjbGFzcyB0byB0aGUgcm91bmQgcm9iaW4gbGlzdAorICoKKyAqIFJvdXRpbmUgYWRkcyBjbGFzcyB0byB0aGUgbGlzdCAoYWN0dWFsbHkgdHJlZSkgc29ydGVkIGJ5IGNsYXNzaWQuCisgKiBNYWtlIHN1cmUgdGhhdCBjbGFzcyBpcyBub3QgYWxyZWFkeSBvbiBzdWNoIGxpc3QgZm9yIGdpdmVuIHByaW8uCisgKi8KK3N0YXRpYyB2b2lkIGh0Yl9hZGRfdG9faWRfdHJlZSAoSFRCX0FSR1Egc3RydWN0IHJiX3Jvb3QgKnJvb3QsCisJCXN0cnVjdCBodGJfY2xhc3MgKmNsLGludCBwcmlvKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZyb290LT5yYl9ub2RlLCAqcGFyZW50ID0gTlVMTDsKKwlIVEJfREJHKDcsMywiaHRiX2FkZF9pZF90cmVlIGNsPSVYIHByaW89JWRcbiIsY2wtPmNsYXNzaWQscHJpbyk7CisjaWZkZWYgSFRCX0RFQlVHCisJaWYgKGNsLT5ub2RlW3ByaW9dLnJiX2NvbG9yICE9IC0xKSB7IEJVR19UUkFQKDApOyByZXR1cm47IH0KKwlIVEJfQ0hDTChjbCk7CisJaWYgKCpwKSB7CisJCXN0cnVjdCBodGJfY2xhc3MgKnggPSByYl9lbnRyeSgqcCxzdHJ1Y3QgaHRiX2NsYXNzLG5vZGVbcHJpb10pOworCQlIVEJfQ0hDTCh4KTsKKwl9CisjZW5kaWYKKwl3aGlsZSAoKnApIHsKKwkJc3RydWN0IGh0Yl9jbGFzcyAqYzsgcGFyZW50ID0gKnA7CisJCWMgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBodGJfY2xhc3MsIG5vZGVbcHJpb10pOworCQlIVEJfQ0hDTChjKTsKKwkJaWYgKGNsLT5jbGFzc2lkID4gYy0+Y2xhc3NpZCkKKwkJCXAgPSAmcGFyZW50LT5yYl9yaWdodDsKKwkJZWxzZSAKKwkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OworCX0KKwlyYl9saW5rX25vZGUoJmNsLT5ub2RlW3ByaW9dLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmY2wtPm5vZGVbcHJpb10sIHJvb3QpOworfQorCisvKioKKyAqIGh0Yl9hZGRfdG9fd2FpdF90cmVlIC0gYWRkcyBjbGFzcyB0byB0aGUgZXZlbnQgcXVldWUgd2l0aCBkZWxheQorICoKKyAqIFRoZSBjbGFzcyBpcyBhZGRlZCB0byBwcmlvcml0eSBldmVudCBxdWV1ZSB0byBpbmRpY2F0ZSB0aGF0IGNsYXNzIHdpbGwKKyAqIGNoYW5nZSBpdHMgbW9kZSBpbiBjbC0+cHFfa2V5IG1pY3Jvc2Vjb25kcy4gTWFrZSBzdXJlIHRoYXQgY2xhc3MgaXMgbm90CisgKiBhbHJlYWR5IGluIHRoZSBxdWV1ZS4KKyAqLworc3RhdGljIHZvaWQgaHRiX2FkZF90b193YWl0X3RyZWUgKHN0cnVjdCBodGJfc2NoZWQgKnEsCisJCXN0cnVjdCBodGJfY2xhc3MgKmNsLGxvbmcgZGVsYXksaW50IGRlYnVnX2hpbnQpCit7CisJc3RydWN0IHJiX25vZGUgKipwID0gJnEtPndhaXRfcHFbY2wtPmxldmVsXS5yYl9ub2RlLCAqcGFyZW50ID0gTlVMTDsKKwlIVEJfREJHKDcsMywiaHRiX2FkZF93dCBjbD0lWCBrZXk9JWx1XG4iLGNsLT5jbGFzc2lkLGNsLT5wcV9rZXkpOworI2lmZGVmIEhUQl9ERUJVRworCWlmIChjbC0+cHFfbm9kZS5yYl9jb2xvciAhPSAtMSkgeyBCVUdfVFJBUCgwKTsgcmV0dXJuOyB9CisJSFRCX0NIQ0woY2wpOworCWlmICgoZGVsYXkgPD0gMCB8fCBkZWxheSA+IGNsLT5tYnVmZmVyKSAmJiBuZXRfcmF0ZWxpbWl0KCkpCisJCXByaW50ayhLRVJOX0VSUiAiSFRCOiBzdXNwaWNpb3VzIGRlbGF5IGluIHdhaXRfdHJlZSBkPSVsZCBjbD0lWCBoPSVkXG4iLGRlbGF5LGNsLT5jbGFzc2lkLGRlYnVnX2hpbnQpOworI2VuZGlmCisJY2wtPnBxX2tleSA9IHEtPmppZmZpZXMgKyBQU0NIRURfVVMySklGRklFKGRlbGF5KTsKKwlpZiAoY2wtPnBxX2tleSA9PSBxLT5qaWZmaWVzKQorCQljbC0+cHFfa2V5Kys7CisKKwkvKiB1cGRhdGUgdGhlIG5lYXJlc3QgZXZlbnQgY2FjaGUgKi8KKwlpZiAodGltZV9hZnRlcihxLT5uZWFyX2V2X2NhY2hlW2NsLT5sZXZlbF0sIGNsLT5wcV9rZXkpKQorCQlxLT5uZWFyX2V2X2NhY2hlW2NsLT5sZXZlbF0gPSBjbC0+cHFfa2V5OworCQorCXdoaWxlICgqcCkgeworCQlzdHJ1Y3QgaHRiX2NsYXNzICpjOyBwYXJlbnQgPSAqcDsKKwkJYyA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGh0Yl9jbGFzcywgcHFfbm9kZSk7CisJCWlmICh0aW1lX2FmdGVyX2VxKGNsLT5wcV9rZXksIGMtPnBxX2tleSkpCisJCQlwID0gJnBhcmVudC0+cmJfcmlnaHQ7CisJCWVsc2UgCisJCQlwID0gJnBhcmVudC0+cmJfbGVmdDsKKwl9CisJcmJfbGlua19ub2RlKCZjbC0+cHFfbm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJmNsLT5wcV9ub2RlLCAmcS0+d2FpdF9wcVtjbC0+bGV2ZWxdKTsKK30KKworLyoqCisgKiBodGJfbmV4dF9yYl9ub2RlIC0gZmluZHMgbmV4dCBub2RlIGluIGJpbmFyeSB0cmVlCisgKgorICogV2hlbiB3ZSBhcmUgcGFzdCBsYXN0IGtleSB3ZSByZXR1cm4gTlVMTC4KKyAqIEF2ZXJhZ2UgY29tcGxleGl0eSBpcyAyIHN0ZXBzIHBlciBjYWxsLgorICovCitzdGF0aWMgdm9pZCBodGJfbmV4dF9yYl9ub2RlKHN0cnVjdCByYl9ub2RlICoqbikKK3sKKwkqbiA9IHJiX25leHQoKm4pOworfQorCisvKioKKyAqIGh0Yl9hZGRfY2xhc3NfdG9fcm93IC0gYWRkIGNsYXNzIHRvIGl0cyByb3cKKyAqCisgKiBUaGUgY2xhc3MgaXMgYWRkZWQgdG8gcm93IGF0IHByaW9yaXRpZXMgbWFya2VkIGluIG1hc2suCisgKiBJdCBkb2VzIG5vdGhpbmcgaWYgbWFzayA9PSAwLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaHRiX2FkZF9jbGFzc190b19yb3coc3RydWN0IGh0Yl9zY2hlZCAqcSwgCisJCXN0cnVjdCBodGJfY2xhc3MgKmNsLGludCBtYXNrKQoreworCUhUQl9EQkcoNywyLCJodGJfYWRkcm93IGNsPSVYIG1hc2s9JVggcm1hc2s9JVhcbiIsCisJCQljbC0+Y2xhc3NpZCxtYXNrLHEtPnJvd19tYXNrW2NsLT5sZXZlbF0pOworCUhUQl9DSENMKGNsKTsKKwlxLT5yb3dfbWFza1tjbC0+bGV2ZWxdIHw9IG1hc2s7CisJd2hpbGUgKG1hc2spIHsKKwkJaW50IHByaW8gPSBmZnoofm1hc2spOworCQltYXNrICY9IH4oMSA8PCBwcmlvKTsKKwkJaHRiX2FkZF90b19pZF90cmVlKEhUQl9QQVNTUSBxLT5yb3dbY2wtPmxldmVsXStwcmlvLGNsLHByaW8pOworCX0KK30KKworLyoqCisgKiBodGJfcmVtb3ZlX2NsYXNzX2Zyb21fcm93IC0gcmVtb3ZlcyBjbGFzcyBmcm9tIGl0cyByb3cKKyAqCisgKiBUaGUgY2xhc3MgaXMgcmVtb3ZlZCBmcm9tIHJvdyBhdCBwcmlvcml0aWVzIG1hcmtlZCBpbiBtYXNrLgorICogSXQgZG9lcyBub3RoaW5nIGlmIG1hc2sgPT0gMC4KKyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBodGJfcmVtb3ZlX2NsYXNzX2Zyb21fcm93KHN0cnVjdCBodGJfc2NoZWQgKnEsCisJCXN0cnVjdCBodGJfY2xhc3MgKmNsLGludCBtYXNrKQoreworCWludCBtID0gMDsKKwlIVEJfQ0hDTChjbCk7CisJd2hpbGUgKG1hc2spIHsKKwkJaW50IHByaW8gPSBmZnoofm1hc2spOworCQltYXNrICY9IH4oMSA8PCBwcmlvKTsKKwkJaWYgKHEtPnB0cltjbC0+bGV2ZWxdW3ByaW9dID09IGNsLT5ub2RlK3ByaW8pCisJCQlodGJfbmV4dF9yYl9ub2RlKHEtPnB0cltjbC0+bGV2ZWxdK3ByaW8pOworCQlodGJfc2FmZV9yYl9lcmFzZShjbC0+bm9kZSArIHByaW8scS0+cm93W2NsLT5sZXZlbF0rcHJpbyk7CisJCWlmICghcS0+cm93W2NsLT5sZXZlbF1bcHJpb10ucmJfbm9kZSkgCisJCQltIHw9IDEgPDwgcHJpbzsKKwl9CisJSFRCX0RCRyg3LDIsImh0Yl9kZWxyb3cgY2w9JVggbWFzaz0lWCBybWFzaz0lWCBtYXNrZGVsPSVYXG4iLAorCQkJY2wtPmNsYXNzaWQsbWFzayxxLT5yb3dfbWFza1tjbC0+bGV2ZWxdLG0pOworCXEtPnJvd19tYXNrW2NsLT5sZXZlbF0gJj0gfm07Cit9CisKKy8qKgorICogaHRiX2FjdGl2YXRlX3ByaW9zIC0gY3JlYXRlcyBhY3RpdmUgY2xhc3NlJ3MgZmVlZCBjaGFpbgorICoKKyAqIFRoZSBjbGFzcyBpcyBjb25uZWN0ZWQgdG8gYW5jZXN0b3JzIGFuZC9vciBhcHByb3ByaWF0ZSByb3dzCisgKiBmb3IgcHJpb3JpdGllcyBpdCBpcyBwYXJ0aWNpcGF0aW5nIG9uLiBjbC0+Y21vZGUgbXVzdCBiZSBuZXcgCisgKiAoYWN0aXZhdGVkKSBtb2RlLiBJdCBkb2VzIG5vdGhpbmcgaWYgY2wtPnByaW9fYWN0aXZpdHkgPT0gMC4KKyAqLworc3RhdGljIHZvaWQgaHRiX2FjdGl2YXRlX3ByaW9zKHN0cnVjdCBodGJfc2NoZWQgKnEsc3RydWN0IGh0Yl9jbGFzcyAqY2wpCit7CisJc3RydWN0IGh0Yl9jbGFzcyAqcCA9IGNsLT5wYXJlbnQ7CisJbG9uZyBtLG1hc2sgPSBjbC0+cHJpb19hY3Rpdml0eTsKKwlIVEJfREJHKDcsMiwiaHRiX2FjdF9wcmlvcyBjbD0lWCBtYXNrPSVsWCBjbW9kZT0lZFxuIixjbC0+Y2xhc3NpZCxtYXNrLGNsLT5jbW9kZSk7CisJSFRCX0NIQ0woY2wpOworCisJd2hpbGUgKGNsLT5jbW9kZSA9PSBIVEJfTUFZX0JPUlJPVyAmJiBwICYmIG1hc2spIHsKKwkJSFRCX0NIQ0wocCk7CisJCW0gPSBtYXNrOyB3aGlsZSAobSkgeworCQkJaW50IHByaW8gPSBmZnoofm0pOworCQkJbSAmPSB+KDEgPDwgcHJpbyk7CisJCQkKKwkJCWlmIChwLT51bi5pbm5lci5mZWVkW3ByaW9dLnJiX25vZGUpCisJCQkJLyogcGFyZW50IGFscmVhZHkgaGFzIGl0cyBmZWVkIGluIHVzZSBzbyB0aGF0CisJCQkJICAgcmVzZXQgYml0IGluIG1hc2sgYXMgcGFyZW50IGlzIGFscmVhZHkgb2sgKi8KKwkJCQltYXNrICY9IH4oMSA8PCBwcmlvKTsKKwkJCQorCQkJaHRiX2FkZF90b19pZF90cmVlKEhUQl9QQVNTUSBwLT51bi5pbm5lci5mZWVkK3ByaW8sY2wscHJpbyk7CisJCX0KKwkJSFRCX0RCRyg3LDMsImh0Yl9hY3RfcHJfYWZ0IHA9JVggcGFjdD0lWCBtYXNrPSVsWCBwbW9kZT0lZFxuIiwKKwkJCQlwLT5jbGFzc2lkLHAtPnByaW9fYWN0aXZpdHksbWFzayxwLT5jbW9kZSk7CisJCXAtPnByaW9fYWN0aXZpdHkgfD0gbWFzazsKKwkJY2wgPSBwOyBwID0gY2wtPnBhcmVudDsKKwkJSFRCX0NIQ0woY2wpOworCX0KKwlpZiAoY2wtPmNtb2RlID09IEhUQl9DQU5fU0VORCAmJiBtYXNrKQorCQlodGJfYWRkX2NsYXNzX3RvX3JvdyhxLGNsLG1hc2spOworfQorCisvKioKKyAqIGh0Yl9kZWFjdGl2YXRlX3ByaW9zIC0gcmVtb3ZlIGNsYXNzIGZyb20gZmVlZCBjaGFpbgorICoKKyAqIGNsLT5jbW9kZSBtdXN0IHJlcHJlc2VudCBvbGQgbW9kZSAoYmVmb3JlIGRlYWN0aXZhdGlvbikuIEl0IGRvZXMgCisgKiBub3RoaW5nIGlmIGNsLT5wcmlvX2FjdGl2aXR5ID09IDAuIENsYXNzIGlzIHJlbW92ZWQgZnJvbSBhbGwgZmVlZAorICogY2hhaW5zIGFuZCByb3dzLgorICovCitzdGF0aWMgdm9pZCBodGJfZGVhY3RpdmF0ZV9wcmlvcyhzdHJ1Y3QgaHRiX3NjaGVkICpxLCBzdHJ1Y3QgaHRiX2NsYXNzICpjbCkKK3sKKwlzdHJ1Y3QgaHRiX2NsYXNzICpwID0gY2wtPnBhcmVudDsKKwlsb25nIG0sbWFzayA9IGNsLT5wcmlvX2FjdGl2aXR5OworCUhUQl9EQkcoNywyLCJodGJfZGVhY3RfcHJpb3MgY2w9JVggbWFzaz0lbFggY21vZGU9JWRcbiIsY2wtPmNsYXNzaWQsbWFzayxjbC0+Y21vZGUpOworCUhUQl9DSENMKGNsKTsKKworCXdoaWxlIChjbC0+Y21vZGUgPT0gSFRCX01BWV9CT1JST1cgJiYgcCAmJiBtYXNrKSB7CisJCW0gPSBtYXNrOyBtYXNrID0gMDsgCisJCXdoaWxlIChtKSB7CisJCQlpbnQgcHJpbyA9IGZmeih+bSk7CisJCQltICY9IH4oMSA8PCBwcmlvKTsKKwkJCQorCQkJaWYgKHAtPnVuLmlubmVyLnB0cltwcmlvXSA9PSBjbC0+bm9kZStwcmlvKSB7CisJCQkJLyogd2UgYXJlIHJlbW92aW5nIGNoaWxkIHdoaWNoIGlzIHBvaW50ZWQgdG8gZnJvbQorCQkJCSAgIHBhcmVudCBmZWVkIC0gZm9yZ2V0IHRoZSBwb2ludGVyIGJ1dCByZW1lbWJlcgorCQkJCSAgIGNsYXNzaWQgKi8KKwkJCQlwLT51bi5pbm5lci5sYXN0X3B0cl9pZFtwcmlvXSA9IGNsLT5jbGFzc2lkOworCQkJCXAtPnVuLmlubmVyLnB0cltwcmlvXSA9IE5VTEw7CisJCQl9CisJCQkKKwkJCWh0Yl9zYWZlX3JiX2VyYXNlKGNsLT5ub2RlICsgcHJpbyxwLT51bi5pbm5lci5mZWVkICsgcHJpbyk7CisJCQkKKwkJCWlmICghcC0+dW4uaW5uZXIuZmVlZFtwcmlvXS5yYl9ub2RlKSAKKwkJCQltYXNrIHw9IDEgPDwgcHJpbzsKKwkJfQorCQlIVEJfREJHKDcsMywiaHRiX2RlYWN0X3ByX2FmdCBwPSVYIHBhY3Q9JVggbWFzaz0lbFggcG1vZGU9JWRcbiIsCisJCQkJcC0+Y2xhc3NpZCxwLT5wcmlvX2FjdGl2aXR5LG1hc2sscC0+Y21vZGUpOworCQlwLT5wcmlvX2FjdGl2aXR5ICY9IH5tYXNrOworCQljbCA9IHA7IHAgPSBjbC0+cGFyZW50OworCQlIVEJfQ0hDTChjbCk7CisJfQorCWlmIChjbC0+Y21vZGUgPT0gSFRCX0NBTl9TRU5EICYmIG1hc2spIAorCQlodGJfcmVtb3ZlX2NsYXNzX2Zyb21fcm93KHEsY2wsbWFzayk7Cit9CisKKy8qKgorICogaHRiX2NsYXNzX21vZGUgLSBjb21wdXRlcyBhbmQgcmV0dXJucyBjdXJyZW50IGNsYXNzIG1vZGUKKyAqCisgKiBJdCBjb21wdXRlcyBjbCdzIG1vZGUgYXQgdGltZSBjbC0+dF9jK2RpZmYgYW5kIHJldHVybnMgaXQuIElmIG1vZGUKKyAqIGlzIG5vdCBIVEJfQ0FOX1NFTkQgdGhlbiBjbC0+cHFfa2V5IGlzIHVwZGF0ZWQgdG8gdGltZSBkaWZmZXJlbmNlCisgKiBmcm9tIG5vdyB0byB0aW1lIHdoZW4gY2wgd2lsbCBjaGFuZ2UgaXRzIHN0YXRlLiAKKyAqIEFsc28gaXQgaXMgd29ydGggdG8gbm90ZSB0aGF0IGNsYXNzIG1vZGUgZG9lc24ndCBjaGFuZ2Ugc2ltcGx5CisgKiBhdCBjbC0+e2MsfXRva2VucyA9PSAwIGJ1dCB0aGVyZSBjYW4gcmF0aGVyIGJlIGh5c3RlcmVzaXMgb2YgCisgKiAwIC4uIC1jbC0+e2MsfWJ1ZmZlciByYW5nZS4gSXQgaXMgbWVhbnQgdG8gbGltaXQgbnVtYmVyIG9mCisgKiBtb2RlIHRyYW5zaXRpb25zIHBlciB0aW1lIHVuaXQuIFRoZSBzcGVlZCBnYWluIGlzIGFib3V0IDEvNi4KKyAqLworc3RhdGljIF9faW5saW5lX18gZW51bSBodGJfY21vZGUgCitodGJfY2xhc3NfbW9kZShzdHJ1Y3QgaHRiX2NsYXNzICpjbCxsb25nICpkaWZmKQoreworICAgIGxvbmcgdG9rczsKKworICAgIGlmICgodG9rcyA9IChjbC0+Y3Rva2VucyArICpkaWZmKSkgPCAoCisjaWYgSFRCX0hZU1RFUkVTSVMKKwkgICAgY2wtPmNtb2RlICE9IEhUQl9DQU5UX1NFTkQgPyAtY2wtPmNidWZmZXIgOgorI2VuZGlmCisgICAgICAgCSAgICAwKSkgeworCSAgICAqZGlmZiA9IC10b2tzOworCSAgICByZXR1cm4gSFRCX0NBTlRfU0VORDsKKyAgICB9CisgICAgaWYgKCh0b2tzID0gKGNsLT50b2tlbnMgKyAqZGlmZikpID49ICgKKyNpZiBIVEJfSFlTVEVSRVNJUworCSAgICBjbC0+Y21vZGUgPT0gSFRCX0NBTl9TRU5EID8gLWNsLT5idWZmZXIgOgorI2VuZGlmCisJICAgIDApKQorCSAgICByZXR1cm4gSFRCX0NBTl9TRU5EOworCisgICAgKmRpZmYgPSAtdG9rczsKKyAgICByZXR1cm4gSFRCX01BWV9CT1JST1c7Cit9CisKKy8qKgorICogaHRiX2NoYW5nZV9jbGFzc19tb2RlIC0gY2hhbmdlcyBjbGFzc2UncyBtb2RlCisgKgorICogVGhpcyBzaG91bGQgYmUgdGhlIG9ubHkgd2F5IGhvdyB0byBjaGFuZ2UgY2xhc3NlJ3MgbW9kZSB1bmRlciBub3JtYWwKKyAqIGNpcnN1bXN0YW5jZXMuIFJvdXRpbmUgd2lsbCB1cGRhdGUgZmVlZCBsaXN0cyBsaW5rYWdlLCBjaGFuZ2UgbW9kZQorICogYW5kIGFkZCBjbGFzcyB0byB0aGUgd2FpdCBldmVudCBxdWV1ZSBpZiBhcHByb3ByaWF0ZS4gTmV3IG1vZGUgc2hvdWxkCisgKiBiZSBkaWZmZXJlbnQgZnJvbSBvbGQgb25lIGFuZCBjbC0+cHFfa2V5IGhhcyB0byBiZSB2YWxpZCBpZiBjaGFuZ2luZworICogdG8gbW9kZSBvdGhlciB0aGFuIEhUQl9DQU5fU0VORCAoc2VlIGh0Yl9hZGRfdG9fd2FpdF90cmVlKS4KKyAqLworc3RhdGljIHZvaWQgCitodGJfY2hhbmdlX2NsYXNzX21vZGUoc3RydWN0IGh0Yl9zY2hlZCAqcSwgc3RydWN0IGh0Yl9jbGFzcyAqY2wsIGxvbmcgKmRpZmYpCit7IAorCWVudW0gaHRiX2Ntb2RlIG5ld19tb2RlID0gaHRiX2NsYXNzX21vZGUoY2wsZGlmZik7CisJCisJSFRCX0NIQ0woY2wpOworCUhUQl9EQkcoNywxLCJodGJfY2hnaW5nX2NsbW9kZSAlZC0+JWQgY2w9JVhcbiIsY2wtPmNtb2RlLG5ld19tb2RlLGNsLT5jbGFzc2lkKTsKKworCWlmIChuZXdfbW9kZSA9PSBjbC0+Y21vZGUpCisJCXJldHVybjsJCisJCisJaWYgKGNsLT5wcmlvX2FjdGl2aXR5KSB7IC8qIG5vdCBuZWNlc3Nhcnk6IHNwZWVkIG9wdGltaXphdGlvbiAqLworCQlpZiAoY2wtPmNtb2RlICE9IEhUQl9DQU5UX1NFTkQpIAorCQkJaHRiX2RlYWN0aXZhdGVfcHJpb3MocSxjbCk7CisJCWNsLT5jbW9kZSA9IG5ld19tb2RlOworCQlpZiAobmV3X21vZGUgIT0gSFRCX0NBTlRfU0VORCkgCisJCQlodGJfYWN0aXZhdGVfcHJpb3MocSxjbCk7CisJfSBlbHNlIAorCQljbC0+Y21vZGUgPSBuZXdfbW9kZTsKK30KKworLyoqCisgKiBodGJfYWN0aXZhdGUgLSBpbnNlcnRzIGxlYWYgY2wgaW50byBhcHByb3ByaWF0ZSBhY3RpdmUgZmVlZHMgCisgKgorICogUm91dGluZSBsZWFybnMgKG5ldykgcHJpb3JpdHkgb2YgbGVhZiBhbmQgYWN0aXZhdGVzIGZlZWQgY2hhaW4KKyAqIGZvciB0aGUgcHJpby4gSXQgY2FuIGJlIGNhbGxlZCBvbiBhbHJlYWR5IGFjdGl2ZSBsZWFmIHNhZmVseS4KKyAqIEl0IGFsc28gYWRkcyBsZWFmIGludG8gZHJvcGxpc3QuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgaHRiX2FjdGl2YXRlKHN0cnVjdCBodGJfc2NoZWQgKnEsc3RydWN0IGh0Yl9jbGFzcyAqY2wpCit7CisJQlVHX1RSQVAoIWNsLT5sZXZlbCAmJiBjbC0+dW4ubGVhZi5xICYmIGNsLT51bi5sZWFmLnEtPnEucWxlbik7CisJSFRCX0NIQ0woY2wpOworCWlmICghY2wtPnByaW9fYWN0aXZpdHkpIHsKKwkJY2wtPnByaW9fYWN0aXZpdHkgPSAxIDw8IChjbC0+dW4ubGVhZi5hcHJpbyA9IGNsLT51bi5sZWFmLnByaW8pOworCQlodGJfYWN0aXZhdGVfcHJpb3MocSxjbCk7CisJCWxpc3RfYWRkX3RhaWwoJmNsLT51bi5sZWFmLmRyb3BfbGlzdCxxLT5kcm9wcytjbC0+dW4ubGVhZi5hcHJpbyk7CisJfQorfQorCisvKioKKyAqIGh0Yl9kZWFjdGl2YXRlIC0gcmVtb3ZlIGxlYWYgY2wgZnJvbSBhY3RpdmUgZmVlZHMgCisgKgorICogTWFrZSBzdXJlIHRoYXQgbGVhZiBpcyBhY3RpdmUuIEluIHRoZSBvdGhlciB3b3JkcyBpdCBjYW4ndCBiZSBjYWxsZWQKKyAqIHdpdGggbm9uLWFjdGl2ZSBsZWFmLiBJdCBhbHNvIHJlbW92ZXMgY2xhc3MgZnJvbSB0aGUgZHJvcCBsaXN0LgorICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIAoraHRiX2RlYWN0aXZhdGUoc3RydWN0IGh0Yl9zY2hlZCAqcSxzdHJ1Y3QgaHRiX2NsYXNzICpjbCkKK3sKKwlCVUdfVFJBUChjbC0+cHJpb19hY3Rpdml0eSk7CisJSFRCX0NIQ0woY2wpOworCWh0Yl9kZWFjdGl2YXRlX3ByaW9zKHEsY2wpOworCWNsLT5wcmlvX2FjdGl2aXR5ID0gMDsKKwlsaXN0X2RlbF9pbml0KCZjbC0+dW4ubGVhZi5kcm9wX2xpc3QpOworfQorCitzdGF0aWMgaW50IGh0Yl9lbnF1ZXVlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBRZGlzYyAqc2NoKQoreworICAgIGludCByZXQ7CisgICAgc3RydWN0IGh0Yl9zY2hlZCAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKyAgICBzdHJ1Y3QgaHRiX2NsYXNzICpjbCA9IGh0Yl9jbGFzc2lmeShza2Isc2NoLCZyZXQpOworCisgICAgaWYgKGNsID09IEhUQl9ESVJFQ1QpIHsKKwkvKiBlbnF1ZXVlIHRvIGhlbHBlciBxdWV1ZSAqLworCWlmIChxLT5kaXJlY3RfcXVldWUucWxlbiA8IHEtPmRpcmVjdF9xbGVuKSB7CisJICAgIF9fc2tiX3F1ZXVlX3RhaWwoJnEtPmRpcmVjdF9xdWV1ZSwgc2tiKTsKKwkgICAgcS0+ZGlyZWN0X3BrdHMrKzsKKwl9CisjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCisgICAgfSBlbHNlIGlmICghY2wpIHsKKwlpZiAocmV0ID09IE5FVF9YTUlUX0RST1ApCisJCXNjaC0+cXN0YXRzLmRyb3BzKys7CisJa2ZyZWVfc2tiIChza2IpOworCXJldHVybiByZXQ7CisjZW5kaWYKKyAgICB9IGVsc2UgaWYgKGNsLT51bi5sZWFmLnEtPmVucXVldWUoc2tiLCBjbC0+dW4ubGVhZi5xKSAhPSBORVRfWE1JVF9TVUNDRVNTKSB7CisJc2NoLT5xc3RhdHMuZHJvcHMrKzsKKwljbC0+cXN0YXRzLmRyb3BzKys7CisJcmV0dXJuIE5FVF9YTUlUX0RST1A7CisgICAgfSBlbHNlIHsKKwljbC0+YnN0YXRzLnBhY2tldHMrKzsgY2wtPmJzdGF0cy5ieXRlcyArPSBza2ItPmxlbjsKKwlodGJfYWN0aXZhdGUgKHEsY2wpOworICAgIH0KKworICAgIHNjaC0+cS5xbGVuKys7CisgICAgc2NoLT5ic3RhdHMucGFja2V0cysrOyBzY2gtPmJzdGF0cy5ieXRlcyArPSBza2ItPmxlbjsKKyAgICBIVEJfREJHKDEsMSwiaHRiX2VucV9vayBjbD0lWCBza2I9JXBcbiIsKGNsICYmIGNsICE9IEhUQl9ESVJFQ1QpP2NsLT5jbGFzc2lkOjAsc2tiKTsKKyAgICByZXR1cm4gTkVUX1hNSVRfU1VDQ0VTUzsKK30KKworLyogVE9ETzogcmVxdWV1aW5nIHBhY2tldCBjaGFyZ2VzIGl0IHRvIHBvbGljZXJzIGFnYWluICEhICovCitzdGF0aWMgaW50IGh0Yl9yZXF1ZXVlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBRZGlzYyAqc2NoKQoreworICAgIHN0cnVjdCBodGJfc2NoZWQgKnEgPSBxZGlzY19wcml2KHNjaCk7CisgICAgaW50IHJldCA9ICBORVRfWE1JVF9TVUNDRVNTOworICAgIHN0cnVjdCBodGJfY2xhc3MgKmNsID0gaHRiX2NsYXNzaWZ5KHNrYixzY2gsICZyZXQpOworICAgIHN0cnVjdCBza19idWZmICp0c2tiOworCisgICAgaWYgKGNsID09IEhUQl9ESVJFQ1QgfHwgIWNsKSB7CisJLyogZW5xdWV1ZSB0byBoZWxwZXIgcXVldWUgKi8KKwlpZiAocS0+ZGlyZWN0X3F1ZXVlLnFsZW4gPCBxLT5kaXJlY3RfcWxlbiAmJiBjbCkgeworCSAgICBfX3NrYl9xdWV1ZV9oZWFkKCZxLT5kaXJlY3RfcXVldWUsIHNrYik7CisJfSBlbHNlIHsKKyAgICAgICAgICAgIF9fc2tiX3F1ZXVlX2hlYWQoJnEtPmRpcmVjdF9xdWV1ZSwgc2tiKTsKKyAgICAgICAgICAgIHRza2IgPSBfX3NrYl9kZXF1ZXVlX3RhaWwoJnEtPmRpcmVjdF9xdWV1ZSk7CisgICAgICAgICAgICBrZnJlZV9za2IgKHRza2IpOworICAgICAgICAgICAgc2NoLT5xc3RhdHMuZHJvcHMrKzsKKyAgICAgICAgICAgIHJldHVybiBORVRfWE1JVF9DTjsJCisJfQorICAgIH0gZWxzZSBpZiAoY2wtPnVuLmxlYWYucS0+b3BzLT5yZXF1ZXVlKHNrYiwgY2wtPnVuLmxlYWYucSkgIT0gTkVUX1hNSVRfU1VDQ0VTUykgeworCXNjaC0+cXN0YXRzLmRyb3BzKys7CisJY2wtPnFzdGF0cy5kcm9wcysrOworCXJldHVybiBORVRfWE1JVF9EUk9QOworICAgIH0gZWxzZSAKKwkgICAgaHRiX2FjdGl2YXRlIChxLGNsKTsKKworICAgIHNjaC0+cS5xbGVuKys7CisgICAgc2NoLT5xc3RhdHMucmVxdWV1ZXMrKzsKKyAgICBIVEJfREJHKDEsMSwiaHRiX3JlcV9vayBjbD0lWCBza2I9JXBcbiIsKGNsICYmIGNsICE9IEhUQl9ESVJFQ1QpP2NsLT5jbGFzc2lkOjAsc2tiKTsKKyAgICByZXR1cm4gTkVUX1hNSVRfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgaHRiX3RpbWVyKHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgIHN0cnVjdCBRZGlzYyAqc2NoID0gKHN0cnVjdCBRZGlzYyopYXJnOworICAgIHNjaC0+ZmxhZ3MgJj0gflRDUV9GX1RIUk9UVExFRDsKKyAgICB3bWIoKTsKKyAgICBuZXRpZl9zY2hlZHVsZShzY2gtPmRldik7Cit9CisKKyNpZmRlZiBIVEJfUkFURUNNCisjZGVmaW5lIFJUX0dFTihELFIpIFIrPUQtKFIvSFRCX0VXTUFDKTtEPTAKK3N0YXRpYyB2b2lkIGh0Yl9yYXRlX3RpbWVyKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBRZGlzYyAqc2NoID0gKHN0cnVjdCBRZGlzYyopYXJnOworCXN0cnVjdCBodGJfc2NoZWQgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworCS8qIGxvY2sgcXVldWUgc28gdGhhdCB3ZSBjYW4gbXVjayB3aXRoIGl0ICovCisJSFRCX1FMT0NLKHNjaCk7CisJSFRCX0RCRygxMCwxLCJodGJfcnR0bXIgaj0lbGRcbiIsamlmZmllcyk7CisKKwlxLT5ydHRpbS5leHBpcmVzID0gamlmZmllcyArIEhaOworCWFkZF90aW1lcigmcS0+cnR0aW0pOworCisJLyogc2NhbiBhbmQgcmVjb21wdXRlIG9uZSBidWNrZXQgYXQgdGltZSAqLworCWlmICgrK3EtPnJlY21wX2J1Y2tldCA+PSBIVEJfSFNJWkUpIAorCQlxLT5yZWNtcF9idWNrZXQgPSAwOworCWxpc3RfZm9yX2VhY2ggKHAscS0+aGFzaCtxLT5yZWNtcF9idWNrZXQpIHsKKwkJc3RydWN0IGh0Yl9jbGFzcyAqY2wgPSBsaXN0X2VudHJ5KHAsc3RydWN0IGh0Yl9jbGFzcyxobGlzdCk7CisJCUhUQl9EQkcoMTAsMiwiaHRiX3J0dG1yX2NsIGNsPSVYIHNieXRlPSVsdSBzcGt0PSVsdVxuIiwKKwkJCQljbC0+Y2xhc3NpZCxjbC0+c3VtX2J5dGVzLGNsLT5zdW1fcGFja2V0cyk7CisJCVJUX0dFTiAoY2wtPnN1bV9ieXRlcyxjbC0+cmF0ZV9ieXRlcyk7CisJCVJUX0dFTiAoY2wtPnN1bV9wYWNrZXRzLGNsLT5yYXRlX3BhY2tldHMpOworCX0KKwlIVEJfUVVOTE9DSyhzY2gpOworfQorI2VuZGlmCisKKy8qKgorICogaHRiX2NoYXJnZV9jbGFzcyAtIGNoYXJnZXMgYW1vdW50ICJieXRlcyIgdG8gbGVhZiBhbmQgYW5jZXN0b3JzCisgKgorICogUm91dGluZSBhc3N1bWVzIHRoYXQgcGFja2V0ICJieXRlcyIgbG9uZyB3YXMgZGVxdWV1ZWQgZnJvbSBsZWFmIGNsCisgKiBib3Jyb3dpbmcgZnJvbSAibGV2ZWwiLiBJdCBhY2NvdW50cyBieXRlcyB0byBjZWlsIGxlYWt5IGJ1Y2tldCBmb3IKKyAqIGxlYWYgYW5kIGFsbCBhbmNlc3RvcnMgYW5kIHRvIHJhdGUgYnVja2V0IGZvciBhbmNlc3RvcnMgYXQgbGV2ZWxzCisgKiAibGV2ZWwiIGFuZCBoaWdoZXIuIEl0IGFsc28gaGFuZGxlcyBwb3NzaWJsZSBjaGFuZ2Ugb2YgbW9kZSByZXN1bHRpbmcKKyAqIGZyb20gdGhlIHVwZGF0ZS4gTm90ZSB0aGF0IG1vZGUgY2FuIGFsc28gaW5jcmVhc2UgaGVyZSAoTUFZX0JPUlJPVyB0bworICogQ0FOX1NFTkQpIGJlY2F1c2Ugd2UgY2FuIHVzZSBtb3JlIHByZWNpc2UgY2xvY2sgdGhhdCBldmVudCBxdWV1ZSBoZXJlLgorICogSW4gc3VjaCBjYXNlIHdlIHJlbW92ZSBjbGFzcyBmcm9tIGV2ZW50IHF1ZXVlIGZpcnN0LgorICovCitzdGF0aWMgdm9pZCBodGJfY2hhcmdlX2NsYXNzKHN0cnVjdCBodGJfc2NoZWQgKnEsc3RydWN0IGh0Yl9jbGFzcyAqY2wsCisJCWludCBsZXZlbCxpbnQgYnl0ZXMpCit7CQorCWxvbmcgdG9rcyxkaWZmOworCWVudW0gaHRiX2Ntb2RlIG9sZF9tb2RlOworCUhUQl9EQkcoNSwxLCJodGJfY2hyZ19jbCBjbD0lWCBsZXY9JWQgbGVuPSVkXG4iLGNsLT5jbGFzc2lkLGxldmVsLGJ5dGVzKTsKKworI2RlZmluZSBIVEJfQUNDTlQoVCxCLFIpIHRva3MgPSBkaWZmICsgY2wtPlQ7IFwKKwlpZiAodG9rcyA+IGNsLT5CKSB0b2tzID0gY2wtPkI7IFwKKwl0b2tzIC09IEwyVChjbCwgY2wtPlIsIGJ5dGVzKTsgXAorCWlmICh0b2tzIDw9IC1jbC0+bWJ1ZmZlcikgdG9rcyA9IDEtY2wtPm1idWZmZXI7IFwKKwljbC0+VCA9IHRva3MKKworCXdoaWxlIChjbCkgeworCQlIVEJfQ0hDTChjbCk7CisJCWRpZmYgPSBQU0NIRURfVERJRkZfU0FGRShxLT5ub3csIGNsLT50X2MsICh1MzIpY2wtPm1idWZmZXIpOworI2lmZGVmIEhUQl9ERUJVRworCQlpZiAoZGlmZiA+IGNsLT5tYnVmZmVyIHx8IGRpZmYgPCAwIHx8IFBTQ0hFRF9UTEVTUyhxLT5ub3csIGNsLT50X2MpKSB7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCXByaW50ayhLRVJOX0VSUiAiSFRCOiBiYWQgZGlmZiBpbiBjaGFyZ2UsIGNsPSVYIGRpZmY9JWxYIG5vdz0lTHUgdGhlbj0lTHUgaj0lbHVcbiIsCisJCQkJICAgICAgIGNsLT5jbGFzc2lkLCBkaWZmLAorI2lmZGVmIENPTkZJR19ORVRfU0NIX0NMS19HRVRUSU1FT0ZEQVkKKwkJCQkgICAgICAgcS0+bm93LnR2X3NlYyAqIDEwMDAwMDBVTEwgKyBxLT5ub3cudHZfdXNlYywKKwkJCQkgICAgICAgY2wtPnRfYy50dl9zZWMgKiAxMDAwMDAwVUxMICsgY2wtPnRfYy50dl91c2VjLAorI2Vsc2UKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcS0+bm93LAorCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBjbC0+dF9jLAorI2VuZGlmCisJCQkJICAgICAgIHEtPmppZmZpZXMpOworCQkJZGlmZiA9IDEwMDA7CisJCX0KKyNlbmRpZgorCQlpZiAoY2wtPmxldmVsID49IGxldmVsKSB7CisJCQlpZiAoY2wtPmxldmVsID09IGxldmVsKSBjbC0+eHN0YXRzLmxlbmRzKys7CisJCQlIVEJfQUNDTlQgKHRva2VucyxidWZmZXIscmF0ZSk7CisJCX0gZWxzZSB7CisJCQljbC0+eHN0YXRzLmJvcnJvd3MrKzsKKwkJCWNsLT50b2tlbnMgKz0gZGlmZjsgLyogd2UgbW92ZWQgdF9jOyB1cGRhdGUgdG9rZW5zICovCisJCX0KKwkJSFRCX0FDQ05UIChjdG9rZW5zLGNidWZmZXIsY2VpbCk7CisJCWNsLT50X2MgPSBxLT5ub3c7CisJCUhUQl9EQkcoNSwyLCJodGJfY2hyZ19jbHAgY2w9JVggZGlmZj0lbGQgdG9rPSVsZCBjdG9rPSVsZFxuIixjbC0+Y2xhc3NpZCxkaWZmLGNsLT50b2tlbnMsY2wtPmN0b2tlbnMpOworCisJCW9sZF9tb2RlID0gY2wtPmNtb2RlOyBkaWZmID0gMDsKKwkJaHRiX2NoYW5nZV9jbGFzc19tb2RlKHEsY2wsJmRpZmYpOworCQlpZiAob2xkX21vZGUgIT0gY2wtPmNtb2RlKSB7CisJCQlpZiAob2xkX21vZGUgIT0gSFRCX0NBTl9TRU5EKQorCQkJCWh0Yl9zYWZlX3JiX2VyYXNlKCZjbC0+cHFfbm9kZSxxLT53YWl0X3BxK2NsLT5sZXZlbCk7CisJCQlpZiAoY2wtPmNtb2RlICE9IEhUQl9DQU5fU0VORCkKKwkJCQlodGJfYWRkX3RvX3dhaXRfdHJlZSAocSxjbCxkaWZmLDEpOworCQl9CisJCQorI2lmZGVmIEhUQl9SQVRFQ00KKwkJLyogdXBkYXRlIHJhdGUgY291bnRlcnMgKi8KKwkJY2wtPnN1bV9ieXRlcyArPSBieXRlczsgY2wtPnN1bV9wYWNrZXRzKys7CisjZW5kaWYKKworCQkvKiB1cGRhdGUgYnl0ZSBzdGF0cyBleGNlcHQgZm9yIGxlYXZlcyB3aGljaCBhcmUgYWxyZWFkeSB1cGRhdGVkICovCisJCWlmIChjbC0+bGV2ZWwpIHsKKwkJCWNsLT5ic3RhdHMuYnl0ZXMgKz0gYnl0ZXM7CisJCQljbC0+YnN0YXRzLnBhY2tldHMrKzsKKwkJfQorCQljbCA9IGNsLT5wYXJlbnQ7CisJfQorfQorCisvKioKKyAqIGh0Yl9kb19ldmVudHMgLSBtYWtlIG1vZGUgY2hhbmdlcyB0byBjbGFzc2VzIGF0IHRoZSBsZXZlbAorICoKKyAqIFNjYW5zIGV2ZW50IHF1ZXVlIGZvciBwZW5kaW5nIGV2ZW50cyBhbmQgYXBwbGllcyB0aGVtLiBSZXR1cm5zIGppZmZpZXMgdG8KKyAqIG5leHQgcGVuZGluZyBldmVudCAoMCBmb3Igbm8gZXZlbnQgaW4gcHEpLgorICogTm90ZTogQXBsaWVkIGFyZSBldmVudHMgd2hvc2UgaGF2ZSBjbC0+cHFfa2V5IDw9IGppZmZpZXMuCisgKi8KK3N0YXRpYyBsb25nIGh0Yl9kb19ldmVudHMoc3RydWN0IGh0Yl9zY2hlZCAqcSxpbnQgbGV2ZWwpCit7CisJaW50IGk7CisJSFRCX0RCRyg4LDEsImh0Yl9kb19ldmVudHMgbD0lZCByb290PSVwIHJtYXNrPSVYXG4iLAorCQkJbGV2ZWwscS0+d2FpdF9wcVtsZXZlbF0ucmJfbm9kZSxxLT5yb3dfbWFza1tsZXZlbF0pOworCWZvciAoaSA9IDA7IGkgPCA1MDA7IGkrKykgeworCQlzdHJ1Y3QgaHRiX2NsYXNzICpjbDsKKwkJbG9uZyBkaWZmOworCQlzdHJ1Y3QgcmJfbm9kZSAqcCA9IHEtPndhaXRfcHFbbGV2ZWxdLnJiX25vZGU7CisJCWlmICghcCkgcmV0dXJuIDA7CisJCXdoaWxlIChwLT5yYl9sZWZ0KSBwID0gcC0+cmJfbGVmdDsKKworCQljbCA9IHJiX2VudHJ5KHAsIHN0cnVjdCBodGJfY2xhc3MsIHBxX25vZGUpOworCQlpZiAodGltZV9hZnRlcihjbC0+cHFfa2V5LCBxLT5qaWZmaWVzKSkgeworCQkJSFRCX0RCRyg4LDMsImh0Yl9kb19ldl9yZXQgZGVsYXk9JWxkXG4iLGNsLT5wcV9rZXkgLSBxLT5qaWZmaWVzKTsKKwkJCXJldHVybiBjbC0+cHFfa2V5IC0gcS0+amlmZmllczsKKwkJfQorCQlodGJfc2FmZV9yYl9lcmFzZShwLHEtPndhaXRfcHErbGV2ZWwpOworCQlkaWZmID0gUFNDSEVEX1RESUZGX1NBRkUocS0+bm93LCBjbC0+dF9jLCAodTMyKWNsLT5tYnVmZmVyKTsKKyNpZmRlZiBIVEJfREVCVUcKKwkJaWYgKGRpZmYgPiBjbC0+bWJ1ZmZlciB8fCBkaWZmIDwgMCB8fCBQU0NIRURfVExFU1MocS0+bm93LCBjbC0+dF9jKSkgeworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQlwcmludGsoS0VSTl9FUlIgIkhUQjogYmFkIGRpZmYgaW4gZXZlbnRzLCBjbD0lWCBkaWZmPSVsWCBub3c9JUx1IHRoZW49JUx1IGo9JWx1XG4iLAorCQkJCSAgICAgICBjbC0+Y2xhc3NpZCwgZGlmZiwKKyNpZmRlZiBDT05GSUdfTkVUX1NDSF9DTEtfR0VUVElNRU9GREFZCisJCQkJICAgICAgIHEtPm5vdy50dl9zZWMgKiAxMDAwMDAwVUxMICsgcS0+bm93LnR2X3VzZWMsCisJCQkJICAgICAgIGNsLT50X2MudHZfc2VjICogMTAwMDAwMFVMTCArIGNsLT50X2MudHZfdXNlYywKKyNlbHNlCisJCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHEtPm5vdywKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgY2wtPnRfYywKKyNlbmRpZgorCQkJCSAgICAgICBxLT5qaWZmaWVzKTsKKwkJCWRpZmYgPSAxMDAwOworCQl9CisjZW5kaWYKKwkJaHRiX2NoYW5nZV9jbGFzc19tb2RlKHEsY2wsJmRpZmYpOworCQlpZiAoY2wtPmNtb2RlICE9IEhUQl9DQU5fU0VORCkKKwkJCWh0Yl9hZGRfdG9fd2FpdF90cmVlIChxLGNsLGRpZmYsMik7CisJfQorCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImh0YjogdG9vIG1hbnkgZXZlbnRzICFcbiIpOworCXJldHVybiBIWi8xMDsKK30KKworLyogUmV0dXJucyBjbGFzcy0+bm9kZStwcmlvIGZyb20gaWQtdHJlZSB3aGVyZSBjbGFzc2UncyBpZCBpcyA+PSBpZC4gTlVMTAorICAgaXMgbm8gc3VjaCBvbmUgZXhpc3RzLiAqLworc3RhdGljIHN0cnVjdCByYl9ub2RlICoKK2h0Yl9pZF9maW5kX25leHRfdXBwZXIoaW50IHByaW8sc3RydWN0IHJiX25vZGUgKm4sdTMyIGlkKQoreworCXN0cnVjdCByYl9ub2RlICpyID0gTlVMTDsKKwl3aGlsZSAobikgeworCQlzdHJ1Y3QgaHRiX2NsYXNzICpjbCA9IHJiX2VudHJ5KG4sc3RydWN0IGh0Yl9jbGFzcyxub2RlW3ByaW9dKTsKKwkJaWYgKGlkID09IGNsLT5jbGFzc2lkKSByZXR1cm4gbjsKKwkJCisJCWlmIChpZCA+IGNsLT5jbGFzc2lkKSB7CisJCQluID0gbi0+cmJfcmlnaHQ7CisJCX0gZWxzZSB7CisJCQlyID0gbjsKKwkJCW4gPSBuLT5yYl9sZWZ0OworCQl9CisJfQorCXJldHVybiByOworfQorCisvKioKKyAqIGh0Yl9sb29rdXBfbGVhZiAtIHJldHVybnMgbmV4dCBsZWFmIGNsYXNzIGluIERSUiBvcmRlcgorICoKKyAqIEZpbmQgbGVhZiB3aGVyZSBjdXJyZW50IGZlZWQgcG9pbnRlcnMgcG9pbnRzIHRvLgorICovCitzdGF0aWMgc3RydWN0IGh0Yl9jbGFzcyAqCitodGJfbG9va3VwX2xlYWYoSFRCX0FSR1Egc3RydWN0IHJiX3Jvb3QgKnRyZWUsaW50IHByaW8sc3RydWN0IHJiX25vZGUgKipwcHRyLHUzMiAqcGlkKQoreworCWludCBpOworCXN0cnVjdCB7CisJCXN0cnVjdCByYl9ub2RlICpyb290OworCQlzdHJ1Y3QgcmJfbm9kZSAqKnBwdHI7CisJCXUzMiAqcGlkOworCX0gc3RrW1RDX0hUQl9NQVhERVBUSF0sKnNwID0gc3RrOworCQorCUJVR19UUkFQKHRyZWUtPnJiX25vZGUpOworCXNwLT5yb290ID0gdHJlZS0+cmJfbm9kZTsKKwlzcC0+cHB0ciA9IHBwdHI7CisJc3AtPnBpZCA9IHBpZDsKKworCWZvciAoaSA9IDA7IGkgPCA2NTUzNTsgaSsrKSB7CisJCUhUQl9EQkcoNCwyLCJodGJfbGxlYWYgcHRyPSVwIHBpZD0lWFxuIiwqc3AtPnBwdHIsKnNwLT5waWQpOworCQkKKwkJaWYgKCEqc3AtPnBwdHIgJiYgKnNwLT5waWQpIHsgCisJCQkvKiBwdHIgd2FzIGludmFsaWRhdGVkIGJ1dCBpZCBpcyB2YWxpZCAtIHRyeSB0byByZWNvdmVyIAorCQkJICAgdGhlIG9yaWdpbmFsIG9yIG5leHQgcHRyICovCisJCQkqc3AtPnBwdHIgPSBodGJfaWRfZmluZF9uZXh0X3VwcGVyKHByaW8sc3AtPnJvb3QsKnNwLT5waWQpOworCQl9CisJCSpzcC0+cGlkID0gMDsgLyogcHRyIGlzIHZhbGlkIG5vdyBzbyB0aGF0IHJlbW92ZSB0aGlzIGhpbnQgYXMgaXQKKwkJCSAgICAgICAgIGNhbiBiZWNvbWUgb3V0IG9mIGRhdGUgcXVpY2tseSAqLworCQlpZiAoISpzcC0+cHB0cikgeyAvKiB3ZSBhcmUgYXQgcmlnaHQgZW5kOyByZXdpbmQgJiBnbyB1cCAqLworCQkJKnNwLT5wcHRyID0gc3AtPnJvb3Q7CisJCQl3aGlsZSAoKCpzcC0+cHB0ciktPnJiX2xlZnQpIAorCQkJCSpzcC0+cHB0ciA9ICgqc3AtPnBwdHIpLT5yYl9sZWZ0OworCQkJaWYgKHNwID4gc3RrKSB7CisJCQkJc3AtLTsKKwkJCQlCVUdfVFJBUCgqc3AtPnBwdHIpOyBpZighKnNwLT5wcHRyKSByZXR1cm4gTlVMTDsKKwkJCQlodGJfbmV4dF9yYl9ub2RlIChzcC0+cHB0cik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgaHRiX2NsYXNzICpjbDsKKwkJCWNsID0gcmJfZW50cnkoKnNwLT5wcHRyLHN0cnVjdCBodGJfY2xhc3Msbm9kZVtwcmlvXSk7CisJCQlIVEJfQ0hDTChjbCk7CisJCQlpZiAoIWNsLT5sZXZlbCkgCisJCQkJcmV0dXJuIGNsOworCQkJKCsrc3ApLT5yb290ID0gY2wtPnVuLmlubmVyLmZlZWRbcHJpb10ucmJfbm9kZTsKKwkJCXNwLT5wcHRyID0gY2wtPnVuLmlubmVyLnB0citwcmlvOworCQkJc3AtPnBpZCA9IGNsLT51bi5pbm5lci5sYXN0X3B0cl9pZCtwcmlvOworCQl9CisJfQorCUJVR19UUkFQKDApOworCXJldHVybiBOVUxMOworfQorCisvKiBkZXF1ZXVlcyBwYWNrZXQgYXQgZ2l2ZW4gcHJpb3JpdHkgYW5kIGxldmVsOyBjYWxsIG9ubHkgaWYKKyAgIHlvdSBhcmUgc3VyZSB0aGF0IHRoZXJlIGlzIGFjdGl2ZSBjbGFzcyBhdCBwcmlvL2xldmVsICovCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgoraHRiX2RlcXVldWVfdHJlZShzdHJ1Y3QgaHRiX3NjaGVkICpxLGludCBwcmlvLGludCBsZXZlbCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlzdHJ1Y3QgaHRiX2NsYXNzICpjbCwqc3RhcnQ7CisJLyogbG9vayBpbml0aWFsIGNsYXNzIHVwIGluIHRoZSByb3cgKi8KKwlzdGFydCA9IGNsID0gaHRiX2xvb2t1cF9sZWFmIChIVEJfUEFTU1EgcS0+cm93W2xldmVsXStwcmlvLHByaW8sCisJCQlxLT5wdHJbbGV2ZWxdK3ByaW8scS0+bGFzdF9wdHJfaWRbbGV2ZWxdK3ByaW8pOworCQorCWRvIHsKK25leHQ6CisJCUJVR19UUkFQKGNsKTsgCisJCWlmICghY2wpIHJldHVybiBOVUxMOworCQlIVEJfREJHKDQsMSwiaHRiX2RlcV90ciBwcmlvPSVkIGxldj0lZCBjbD0lWCBkZWZpYz0lZFxuIiwKKwkJCQlwcmlvLGxldmVsLGNsLT5jbGFzc2lkLGNsLT51bi5sZWFmLmRlZmljaXRbbGV2ZWxdKTsKKworCQkvKiBjbGFzcyBjYW4gYmUgZW1wdHkgLSBpdCBpcyB1bmxpa2VseSBidXQgY2FuIGJlIHRydWUgaWYgbGVhZgorCQkgICBxZGlzYyBkcm9wcyBwYWNrZXRzIGluIGVucXVldWUgcm91dGluZSBvciBpZiBzb21lb25lIHVzZWQKKwkJICAgZ3JhZnQgb3BlcmF0aW9uIG9uIHRoZSBsZWFmIHNpbmNlIGxhc3QgZGVxdWV1ZTsgCisJCSAgIHNpbXBseSBkZWFjdGl2YXRlIGFuZCBza2lwIHN1Y2ggY2xhc3MgKi8KKwkJaWYgKHVubGlrZWx5KGNsLT51bi5sZWFmLnEtPnEucWxlbiA9PSAwKSkgeworCQkJc3RydWN0IGh0Yl9jbGFzcyAqbmV4dDsKKwkJCWh0Yl9kZWFjdGl2YXRlKHEsY2wpOworCisJCQkvKiByb3cvbGV2ZWwgbWlnaHQgYmVjb21lIGVtcHR5ICovCisJCQlpZiAoKHEtPnJvd19tYXNrW2xldmVsXSAmICgxIDw8IHByaW8pKSA9PSAwKQorCQkJCXJldHVybiBOVUxMOyAKKwkJCQorCQkJbmV4dCA9IGh0Yl9sb29rdXBfbGVhZiAoSFRCX1BBU1NRIHEtPnJvd1tsZXZlbF0rcHJpbywKKwkJCQkJcHJpbyxxLT5wdHJbbGV2ZWxdK3ByaW8scS0+bGFzdF9wdHJfaWRbbGV2ZWxdK3ByaW8pOworCisJCQlpZiAoY2wgPT0gc3RhcnQpIC8qIGZpeCBzdGFydCBpZiB3ZSBqdXN0IGRlbGV0ZWQgaXQgKi8KKwkJCQlzdGFydCA9IG5leHQ7CisJCQljbCA9IG5leHQ7CisJCQlnb3RvIG5leHQ7CisJCX0KKwkKKwkJaWYgKGxpa2VseSgoc2tiID0gY2wtPnVuLmxlYWYucS0+ZGVxdWV1ZShjbC0+dW4ubGVhZi5xKSkgIT0gTlVMTCkpIAorCQkJYnJlYWs7CisJCWlmICghY2wtPndhcm5lZCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaHRiOiBjbGFzcyAlWCBpc24ndCB3b3JrIGNvbnNlcnZpbmcgPyFcbiIsY2wtPmNsYXNzaWQpOworCQkJY2wtPndhcm5lZCA9IDE7CisJCX0KKwkJcS0+bndjX2hpdCsrOworCQlodGJfbmV4dF9yYl9ub2RlKChsZXZlbD9jbC0+cGFyZW50LT51bi5pbm5lci5wdHI6cS0+cHRyWzBdKStwcmlvKTsKKwkJY2wgPSBodGJfbG9va3VwX2xlYWYgKEhUQl9QQVNTUSBxLT5yb3dbbGV2ZWxdK3ByaW8scHJpbyxxLT5wdHJbbGV2ZWxdK3ByaW8sCisJCQkJcS0+bGFzdF9wdHJfaWRbbGV2ZWxdK3ByaW8pOworCisJfSB3aGlsZSAoY2wgIT0gc3RhcnQpOworCisJaWYgKGxpa2VseShza2IgIT0gTlVMTCkpIHsKKwkJaWYgKChjbC0+dW4ubGVhZi5kZWZpY2l0W2xldmVsXSAtPSBza2ItPmxlbikgPCAwKSB7CisJCQlIVEJfREJHKDQsMiwiaHRiX25leHRfY2wgb2xkcHRyPSVwIHF1YW50X2FkZD0lZFxuIiwKKwkJCQlsZXZlbD9jbC0+cGFyZW50LT51bi5pbm5lci5wdHJbcHJpb106cS0+cHRyWzBdW3ByaW9dLGNsLT51bi5sZWFmLnF1YW50dW0pOworCQkJY2wtPnVuLmxlYWYuZGVmaWNpdFtsZXZlbF0gKz0gY2wtPnVuLmxlYWYucXVhbnR1bTsKKwkJCWh0Yl9uZXh0X3JiX25vZGUoKGxldmVsP2NsLT5wYXJlbnQtPnVuLmlubmVyLnB0cjpxLT5wdHJbMF0pK3ByaW8pOworCQl9CisJCS8qIHRoaXMgdXNlZCB0byBiZSBhZnRlciBjaGFyZ2VfY2xhc3MgYnV0IHRoaXMgY29uc3RlbGF0aW9uCisJCSAgIGdpdmVzIHVzIHNsaWdodGx5IGJldHRlciBwZXJmb3JtYW5jZSAqLworCQlpZiAoIWNsLT51bi5sZWFmLnEtPnEucWxlbikKKwkJCWh0Yl9kZWFjdGl2YXRlIChxLGNsKTsKKwkJaHRiX2NoYXJnZV9jbGFzcyAocSxjbCxsZXZlbCxza2ItPmxlbik7CisJfQorCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyB2b2lkIGh0Yl9kZWxheV9ieShzdHJ1Y3QgUWRpc2MgKnNjaCxsb25nIGRlbGF5KQoreworCXN0cnVjdCBodGJfc2NoZWQgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJaWYgKGRlbGF5IDw9IDApIGRlbGF5ID0gMTsKKwlpZiAodW5saWtlbHkoZGVsYXkgPiA1KkhaKSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiSFRCIGRlbGF5ICVsZCA+IDVzZWNcbiIsIGRlbGF5KTsKKwkJZGVsYXkgPSA1KkhaOworCX0KKwkvKiB3aHkgZG9uJ3QgdXNlIGppZmZpZXMgaGVyZSA/IGJlY2F1c2UgZXhwaXJlcyBjYW4gYmUgaW4gcGFzdCAqLworCW1vZF90aW1lcigmcS0+dGltZXIsIHEtPmppZmZpZXMgKyBkZWxheSk7CisJc2NoLT5mbGFncyB8PSBUQ1FfRl9USFJPVFRMRUQ7CisJc2NoLT5xc3RhdHMub3ZlcmxpbWl0cysrOworCUhUQl9EQkcoMywxLCJodGJfZGVxIHRfZGVsYXk9JWxkXG4iLGRlbGF5KTsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICpodGJfZGVxdWV1ZShzdHJ1Y3QgUWRpc2MgKnNjaCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlzdHJ1Y3QgaHRiX3NjaGVkICpxID0gcWRpc2NfcHJpdihzY2gpOworCWludCBsZXZlbDsKKwlsb25nIG1pbl9kZWxheTsKKyNpZmRlZiBIVEJfREVCVUcKKwlpbnQgZXZzX3VzZWQgPSAwOworI2VuZGlmCisKKwlxLT5qaWZmaWVzID0gamlmZmllczsKKwlIVEJfREJHKDMsMSwiaHRiX2RlcSBkaXJjbnQ9JWQgcWxlbj0lZFxuIixza2JfcXVldWVfbGVuKCZxLT5kaXJlY3RfcXVldWUpLAorCQkJc2NoLT5xLnFsZW4pOworCisJLyogdHJ5IHRvIGRlcXVldWUgZGlyZWN0IHBhY2tldHMgYXMgaGlnaCBwcmlvICghKSB0byBtaW5pbWl6ZSBjcHUgd29yayAqLworCWlmICgoc2tiID0gX19za2JfZGVxdWV1ZSgmcS0+ZGlyZWN0X3F1ZXVlKSkgIT0gTlVMTCkgeworCQlzY2gtPmZsYWdzICY9IH5UQ1FfRl9USFJPVFRMRUQ7CisJCXNjaC0+cS5xbGVuLS07CisJCXJldHVybiBza2I7CisJfQorCisJaWYgKCFzY2gtPnEucWxlbikgZ290byBmaW47CisJUFNDSEVEX0dFVF9USU1FKHEtPm5vdyk7CisKKwltaW5fZGVsYXkgPSBMT05HX01BWDsKKwlxLT5ud2NfaGl0ID0gMDsKKwlmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBUQ19IVEJfTUFYREVQVEg7IGxldmVsKyspIHsKKwkJLyogY29tbW9uIGNhc2Ugb3B0aW1pemF0aW9uIC0gc2tpcCBldmVudCBoYW5kbGVyIHF1aWNrbHkgKi8KKwkJaW50IG07CisJCWxvbmcgZGVsYXk7CisJCWlmICh0aW1lX2FmdGVyX2VxKHEtPmppZmZpZXMsIHEtPm5lYXJfZXZfY2FjaGVbbGV2ZWxdKSkgeworCQkJZGVsYXkgPSBodGJfZG9fZXZlbnRzKHEsbGV2ZWwpOworCQkJcS0+bmVhcl9ldl9jYWNoZVtsZXZlbF0gPSBxLT5qaWZmaWVzICsgKGRlbGF5ID8gZGVsYXkgOiBIWik7CisjaWZkZWYgSFRCX0RFQlVHCisJCQlldnNfdXNlZCsrOworI2VuZGlmCisJCX0gZWxzZQorCQkJZGVsYXkgPSBxLT5uZWFyX2V2X2NhY2hlW2xldmVsXSAtIHEtPmppZmZpZXM7CQorCQkKKwkJaWYgKGRlbGF5ICYmIG1pbl9kZWxheSA+IGRlbGF5KSAKKwkJCW1pbl9kZWxheSA9IGRlbGF5OworCQltID0gfnEtPnJvd19tYXNrW2xldmVsXTsKKwkJd2hpbGUgKG0gIT0gKGludCkoLTEpKSB7CisJCQlpbnQgcHJpbyA9IGZmeiAobSk7CisJCQltIHw9IDEgPDwgcHJpbzsKKwkJCXNrYiA9IGh0Yl9kZXF1ZXVlX3RyZWUocSxwcmlvLGxldmVsKTsKKwkJCWlmIChsaWtlbHkoc2tiICE9IE5VTEwpKSB7CisJCQkJc2NoLT5xLnFsZW4tLTsKKwkJCQlzY2gtPmZsYWdzICY9IH5UQ1FfRl9USFJPVFRMRUQ7CisJCQkJZ290byBmaW47CisJCQl9CisJCX0KKwl9CisjaWZkZWYgSFRCX0RFQlVHCisJaWYgKCFxLT5ud2NfaGl0ICYmIG1pbl9kZWxheSA+PSAxMCpIWiAmJiBuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJaWYgKG1pbl9kZWxheSA9PSBMT05HX01BWCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJIVEI6IGRlcXVldWUgYnVnICglZCwlbHUsJWx1KSwgcmVwb3J0IGl0IHBsZWFzZSAhXG4iLAorCQkJCQlldnNfdXNlZCxxLT5qaWZmaWVzLGppZmZpZXMpOworCQkJaHRiX2RlYnVnX2R1bXAocSk7CisJCX0gZWxzZSAKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkhUQjogbWluZGVsYXk9JWxkLCBzb21lIGNsYXNzIGhhcyAiCisJCQkJCSJ0b28gc21hbGwgcmF0ZVxuIixtaW5fZGVsYXkpOworCX0KKyNlbmRpZgorCWh0Yl9kZWxheV9ieSAoc2NoLG1pbl9kZWxheSA+IDUqSFogPyA1KkhaIDogbWluX2RlbGF5KTsKK2ZpbjoKKwlIVEJfREJHKDMsMSwiaHRiX2RlcV9lbmQgJXMgaj0lbHUgc2tiPSVwXG4iLHNjaC0+ZGV2LT5uYW1lLHEtPmppZmZpZXMsc2tiKTsKKwlyZXR1cm4gc2tiOworfQorCisvKiB0cnkgdG8gZHJvcCBmcm9tIGVhY2ggY2xhc3MgKGJ5IHByaW8pIHVudGlsIG9uZSBzdWNjZWVkICovCitzdGF0aWMgdW5zaWduZWQgaW50IGh0Yl9kcm9wKHN0cnVjdCBRZGlzYyogc2NoKQoreworCXN0cnVjdCBodGJfc2NoZWQgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJaW50IHByaW87CisKKwlmb3IgKHByaW8gPSBUQ19IVEJfTlVNUFJJTyAtIDE7IHByaW8gPj0gMDsgcHJpby0tKSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJCWxpc3RfZm9yX2VhY2ggKHAscS0+ZHJvcHMrcHJpbykgeworCQkJc3RydWN0IGh0Yl9jbGFzcyAqY2wgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBodGJfY2xhc3MsCisJCQkJCQkJICB1bi5sZWFmLmRyb3BfbGlzdCk7CisJCQl1bnNpZ25lZCBpbnQgbGVuOworCQkJaWYgKGNsLT51bi5sZWFmLnEtPm9wcy0+ZHJvcCAmJiAKKwkJCQkobGVuID0gY2wtPnVuLmxlYWYucS0+b3BzLT5kcm9wKGNsLT51bi5sZWFmLnEpKSkgeworCQkJCXNjaC0+cS5xbGVuLS07CisJCQkJaWYgKCFjbC0+dW4ubGVhZi5xLT5xLnFsZW4pCisJCQkJCWh0Yl9kZWFjdGl2YXRlIChxLGNsKTsKKwkJCQlyZXR1cm4gbGVuOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiByZXNldCBhbGwgY2xhc3NlcyAqLworLyogYWx3YXlzIGNhbGVkIHVuZGVyIEJIICYgcXVldWUgbG9jayAqLworc3RhdGljIHZvaWQgaHRiX3Jlc2V0KHN0cnVjdCBRZGlzYyogc2NoKQoreworCXN0cnVjdCBodGJfc2NoZWQgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJaW50IGk7CisJSFRCX0RCRygwLDEsImh0Yl9yZXNldCBzY2g9JXAsIGhhbmRsZT0lWFxuIixzY2gsc2NoLT5oYW5kbGUpOworCisJZm9yIChpID0gMDsgaSA8IEhUQl9IU0laRTsgaSsrKSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJCWxpc3RfZm9yX2VhY2ggKHAscS0+aGFzaCtpKSB7CisJCQlzdHJ1Y3QgaHRiX2NsYXNzICpjbCA9IGxpc3RfZW50cnkocCxzdHJ1Y3QgaHRiX2NsYXNzLGhsaXN0KTsKKwkJCWlmIChjbC0+bGV2ZWwpCisJCQkJbWVtc2V0KCZjbC0+dW4uaW5uZXIsMCxzaXplb2YoY2wtPnVuLmlubmVyKSk7CisJCQllbHNlIHsKKwkJCQlpZiAoY2wtPnVuLmxlYWYucSkgCisJCQkJCXFkaXNjX3Jlc2V0KGNsLT51bi5sZWFmLnEpOworCQkJCUlOSVRfTElTVF9IRUFEKCZjbC0+dW4ubGVhZi5kcm9wX2xpc3QpOworCQkJfQorCQkJY2wtPnByaW9fYWN0aXZpdHkgPSAwOworCQkJY2wtPmNtb2RlID0gSFRCX0NBTl9TRU5EOworI2lmZGVmIEhUQl9ERUJVRworCQkJY2wtPnBxX25vZGUucmJfY29sb3IgPSAtMTsKKwkJCW1lbXNldChjbC0+bm9kZSwyNTUsc2l6ZW9mKGNsLT5ub2RlKSk7CisjZW5kaWYKKworCQl9CisJfQorCXNjaC0+ZmxhZ3MgJj0gflRDUV9GX1RIUk9UVExFRDsKKwlkZWxfdGltZXIoJnEtPnRpbWVyKTsKKwlfX3NrYl9xdWV1ZV9wdXJnZSgmcS0+ZGlyZWN0X3F1ZXVlKTsKKwlzY2gtPnEucWxlbiA9IDA7CisJbWVtc2V0KHEtPnJvdywwLHNpemVvZihxLT5yb3cpKTsKKwltZW1zZXQocS0+cm93X21hc2ssMCxzaXplb2YocS0+cm93X21hc2spKTsKKwltZW1zZXQocS0+d2FpdF9wcSwwLHNpemVvZihxLT53YWl0X3BxKSk7CisJbWVtc2V0KHEtPnB0ciwwLHNpemVvZihxLT5wdHIpKTsKKwlmb3IgKGkgPSAwOyBpIDwgVENfSFRCX05VTVBSSU87IGkrKykKKwkJSU5JVF9MSVNUX0hFQUQocS0+ZHJvcHMraSk7Cit9CisKK3N0YXRpYyBpbnQgaHRiX2luaXQoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBydGF0dHIgKm9wdCkKK3sKKwlzdHJ1Y3QgaHRiX3NjaGVkICpxID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCBydGF0dHIgKnRiW1RDQV9IVEJfSU5JVF07CisJc3RydWN0IHRjX2h0Yl9nbG9iICpnb3B0OworCWludCBpOworI2lmZGVmIEhUQl9ERUJVRworCXByaW50ayhLRVJOX0lORk8gIkhUQiBpbml0LCBrZXJuZWwgcGFydCB2ZXJzaW9uICVkLiVkXG4iLAorCQkJICBIVEJfVkVSID4+IDE2LEhUQl9WRVIgJiAweGZmZmYpOworI2VuZGlmCisJaWYgKCFvcHQgfHwgcnRhdHRyX3BhcnNlX25lc3RlZCh0YiwgVENBX0hUQl9JTklULCBvcHQpIHx8CisJCQl0YltUQ0FfSFRCX0lOSVQtMV0gPT0gTlVMTCB8fAorCQkJUlRBX1BBWUxPQUQodGJbVENBX0hUQl9JTklULTFdKSA8IHNpemVvZigqZ29wdCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJIVEI6IGhleSBwcm9iYWJseSB5b3UgaGF2ZSBiYWQgdGMgdG9vbCA/XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWdvcHQgPSBSVEFfREFUQSh0YltUQ0FfSFRCX0lOSVQtMV0pOworCWlmIChnb3B0LT52ZXJzaW9uICE9IEhUQl9WRVIgPj4gMTYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJIVEI6IG5lZWQgdGMvaHRiIHZlcnNpb24gJWQgKG1pbm9yIGlzICVkKSwgeW91IGhhdmUgJWRcbiIsCisJCQkJSFRCX1ZFUiA+PiAxNixIVEJfVkVSICYgMHhmZmZmLGdvcHQtPnZlcnNpb24pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcS0+ZGVidWcgPSBnb3B0LT5kZWJ1ZzsKKwlIVEJfREJHKDAsMSwiaHRiX2luaXQgc2NoPSVwIGhhbmRsZT0lWCByMnE9JWRcbiIsc2NoLHNjaC0+aGFuZGxlLGdvcHQtPnJhdGUycXVhbnR1bSk7CisKKwlJTklUX0xJU1RfSEVBRCgmcS0+cm9vdCk7CisJZm9yIChpID0gMDsgaSA8IEhUQl9IU0laRTsgaSsrKQorCQlJTklUX0xJU1RfSEVBRChxLT5oYXNoK2kpOworCWZvciAoaSA9IDA7IGkgPCBUQ19IVEJfTlVNUFJJTzsgaSsrKQorCQlJTklUX0xJU1RfSEVBRChxLT5kcm9wcytpKTsKKworCWluaXRfdGltZXIoJnEtPnRpbWVyKTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZxLT5kaXJlY3RfcXVldWUpOworCisJcS0+ZGlyZWN0X3FsZW4gPSBzY2gtPmRldi0+dHhfcXVldWVfbGVuOworCWlmIChxLT5kaXJlY3RfcWxlbiA8IDIpIC8qIHNvbWUgZGV2aWNlcyBoYXZlIHplcm8gdHhfcXVldWVfbGVuICovCisJCXEtPmRpcmVjdF9xbGVuID0gMjsKKwlxLT50aW1lci5mdW5jdGlvbiA9IGh0Yl90aW1lcjsKKwlxLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpc2NoOworCisjaWZkZWYgSFRCX1JBVEVDTQorCWluaXRfdGltZXIoJnEtPnJ0dGltKTsKKwlxLT5ydHRpbS5mdW5jdGlvbiA9IGh0Yl9yYXRlX3RpbWVyOworCXEtPnJ0dGltLmRhdGEgPSAodW5zaWduZWQgbG9uZylzY2g7CisJcS0+cnR0aW0uZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKwlhZGRfdGltZXIoJnEtPnJ0dGltKTsKKyNlbmRpZgorCWlmICgocS0+cmF0ZTJxdWFudHVtID0gZ29wdC0+cmF0ZTJxdWFudHVtKSA8IDEpCisJCXEtPnJhdGUycXVhbnR1bSA9IDE7CisJcS0+ZGVmY2xzID0gZ29wdC0+ZGVmY2xzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHRiX2R1bXAoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGh0Yl9zY2hlZCAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3QgcnRhdHRyICpydGE7CisJc3RydWN0IHRjX2h0Yl9nbG9iIGdvcHQ7CisJSFRCX0RCRygwLDEsImh0Yl9kdW1wIHNjaD0lcCwgaGFuZGxlPSVYXG4iLHNjaCxzY2gtPmhhbmRsZSk7CisJSFRCX1FMT0NLKHNjaCk7CisJZ29wdC5kaXJlY3RfcGt0cyA9IHEtPmRpcmVjdF9wa3RzOworCisjaWZkZWYgSFRCX0RFQlVHCisJaWYgKEhUQl9EQkdfQ09ORCgwLDIpKQorCQlodGJfZGVidWdfZHVtcChxKTsKKyNlbmRpZgorCWdvcHQudmVyc2lvbiA9IEhUQl9WRVI7CisJZ29wdC5yYXRlMnF1YW50dW0gPSBxLT5yYXRlMnF1YW50dW07CisJZ29wdC5kZWZjbHMgPSBxLT5kZWZjbHM7CisJZ29wdC5kZWJ1ZyA9IHEtPmRlYnVnOworCXJ0YSA9IChzdHJ1Y3QgcnRhdHRyKiliOworCVJUQV9QVVQoc2tiLCBUQ0FfT1BUSU9OUywgMCwgTlVMTCk7CisJUlRBX1BVVChza2IsIFRDQV9IVEJfSU5JVCwgc2l6ZW9mKGdvcHQpLCAmZ29wdCk7CisJcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlIVEJfUVVOTE9DSyhzY2gpOworCXJldHVybiBza2ItPmxlbjsKK3J0YXR0cl9mYWlsdXJlOgorCUhUQl9RVU5MT0NLKHNjaCk7CisJc2tiX3RyaW0oc2tiLCBza2ItPnRhaWwgLSBza2ItPmRhdGEpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBodGJfZHVtcF9jbGFzcyhzdHJ1Y3QgUWRpc2MgKnNjaCwgdW5zaWduZWQgbG9uZyBhcmcsCisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjbXNnICp0Y20pCit7CisjaWZkZWYgSFRCX0RFQlVHCisJc3RydWN0IGh0Yl9zY2hlZCAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKyNlbmRpZgorCXN0cnVjdCBodGJfY2xhc3MgKmNsID0gKHN0cnVjdCBodGJfY2xhc3MqKWFyZzsKKwl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3QgcnRhdHRyICpydGE7CisJc3RydWN0IHRjX2h0Yl9vcHQgb3B0OworCisJSFRCX0RCRygwLDEsImh0Yl9kdW1wX2NsYXNzIGhhbmRsZT0lWCBjbGlkPSVYXG4iLHNjaC0+aGFuZGxlLGNsLT5jbGFzc2lkKTsKKworCUhUQl9RTE9DSyhzY2gpOworCXRjbS0+dGNtX3BhcmVudCA9IGNsLT5wYXJlbnQgPyBjbC0+cGFyZW50LT5jbGFzc2lkIDogVENfSF9ST09UOworCXRjbS0+dGNtX2hhbmRsZSA9IGNsLT5jbGFzc2lkOworCWlmICghY2wtPmxldmVsICYmIGNsLT51bi5sZWFmLnEpCisJCXRjbS0+dGNtX2luZm8gPSBjbC0+dW4ubGVhZi5xLT5oYW5kbGU7CisKKwlydGEgPSAoc3RydWN0IHJ0YXR0ciopYjsKKwlSVEFfUFVUKHNrYiwgVENBX09QVElPTlMsIDAsIE5VTEwpOworCisJbWVtc2V0ICgmb3B0LDAsc2l6ZW9mKG9wdCkpOworCisJb3B0LnJhdGUgPSBjbC0+cmF0ZS0+cmF0ZTsgb3B0LmJ1ZmZlciA9IGNsLT5idWZmZXI7CisJb3B0LmNlaWwgPSBjbC0+Y2VpbC0+cmF0ZTsgb3B0LmNidWZmZXIgPSBjbC0+Y2J1ZmZlcjsKKwlvcHQucXVhbnR1bSA9IGNsLT51bi5sZWFmLnF1YW50dW07IG9wdC5wcmlvID0gY2wtPnVuLmxlYWYucHJpbzsKKwlvcHQubGV2ZWwgPSBjbC0+bGV2ZWw7IAorCVJUQV9QVVQoc2tiLCBUQ0FfSFRCX1BBUk1TLCBzaXplb2Yob3B0KSwgJm9wdCk7CisJcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlIVEJfUVVOTE9DSyhzY2gpOworCXJldHVybiBza2ItPmxlbjsKK3J0YXR0cl9mYWlsdXJlOgorCUhUQl9RVU5MT0NLKHNjaCk7CisJc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQKK2h0Yl9kdW1wX2NsYXNzX3N0YXRzKHN0cnVjdCBRZGlzYyAqc2NoLCB1bnNpZ25lZCBsb25nIGFyZywKKwlzdHJ1Y3QgZ25ldF9kdW1wICpkKQoreworCXN0cnVjdCBodGJfY2xhc3MgKmNsID0gKHN0cnVjdCBodGJfY2xhc3MqKWFyZzsKKworI2lmZGVmIEhUQl9SQVRFQ00KKwljbC0+cmF0ZV9lc3QuYnBzID0gY2wtPnJhdGVfYnl0ZXMvKEhUQl9FV01BQypIVEJfSFNJWkUpOworCWNsLT5yYXRlX2VzdC5wcHMgPSBjbC0+cmF0ZV9wYWNrZXRzLyhIVEJfRVdNQUMqSFRCX0hTSVpFKTsKKyNlbmRpZgorCisJaWYgKCFjbC0+bGV2ZWwgJiYgY2wtPnVuLmxlYWYucSkKKwkJY2wtPnFzdGF0cy5xbGVuID0gY2wtPnVuLmxlYWYucS0+cS5xbGVuOworCWNsLT54c3RhdHMudG9rZW5zID0gY2wtPnRva2VuczsKKwljbC0+eHN0YXRzLmN0b2tlbnMgPSBjbC0+Y3Rva2VuczsKKworCWlmIChnbmV0X3N0YXRzX2NvcHlfYmFzaWMoZCwgJmNsLT5ic3RhdHMpIDwgMCB8fAorCSAgICBnbmV0X3N0YXRzX2NvcHlfcmF0ZV9lc3QoZCwgJmNsLT5yYXRlX2VzdCkgPCAwIHx8CisJICAgIGduZXRfc3RhdHNfY29weV9xdWV1ZShkLCAmY2wtPnFzdGF0cykgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gZ25ldF9zdGF0c19jb3B5X2FwcChkLCAmY2wtPnhzdGF0cywgc2l6ZW9mKGNsLT54c3RhdHMpKTsKK30KKworc3RhdGljIGludCBodGJfZ3JhZnQoc3RydWN0IFFkaXNjICpzY2gsIHVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgUWRpc2MgKm5ldywKKwlzdHJ1Y3QgUWRpc2MgKipvbGQpCit7CisJc3RydWN0IGh0Yl9jbGFzcyAqY2wgPSAoc3RydWN0IGh0Yl9jbGFzcyopYXJnOworCisJaWYgKGNsICYmICFjbC0+bGV2ZWwpIHsKKwkJaWYgKG5ldyA9PSBOVUxMICYmIChuZXcgPSBxZGlzY19jcmVhdGVfZGZsdChzY2gtPmRldiwgCisJCQkJCSZwZmlmb19xZGlzY19vcHMpKSA9PSBOVUxMKQorCQkJCQlyZXR1cm4gLUVOT0JVRlM7CisJCXNjaF90cmVlX2xvY2soc2NoKTsKKwkJaWYgKCgqb2xkID0geGNoZygmY2wtPnVuLmxlYWYucSwgbmV3KSkgIT0gTlVMTCkgeworCQkJaWYgKGNsLT5wcmlvX2FjdGl2aXR5KQorCQkJCWh0Yl9kZWFjdGl2YXRlIChxZGlzY19wcml2KHNjaCksY2wpOworCisJCQkvKiBUT0RPOiBpcyBpdCBjb3JyZWN0ID8gV2h5IENCUSBkb2Vzbid0IGRvIGl0ID8gKi8KKwkJCXNjaC0+cS5xbGVuIC09ICgqb2xkKS0+cS5xbGVuOwkKKwkJCXFkaXNjX3Jlc2V0KCpvbGQpOworCQl9CisJCXNjaF90cmVlX3VubG9jayhzY2gpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FTk9FTlQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgUWRpc2MgKiBodGJfbGVhZihzdHJ1Y3QgUWRpc2MgKnNjaCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGh0Yl9jbGFzcyAqY2wgPSAoc3RydWN0IGh0Yl9jbGFzcyopYXJnOworCXJldHVybiAoY2wgJiYgIWNsLT5sZXZlbCkgPyBjbC0+dW4ubGVhZi5xIDogTlVMTDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHRiX2dldChzdHJ1Y3QgUWRpc2MgKnNjaCwgdTMyIGNsYXNzaWQpCit7CisjaWZkZWYgSFRCX0RFQlVHCisJc3RydWN0IGh0Yl9zY2hlZCAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKyNlbmRpZgorCXN0cnVjdCBodGJfY2xhc3MgKmNsID0gaHRiX2ZpbmQoY2xhc3NpZCxzY2gpOworCUhUQl9EQkcoMCwxLCJodGJfZ2V0IGNsaWQ9JVggcT0lcCBjbD0lcCByZWY9JWRcbiIsY2xhc3NpZCxxLGNsLGNsP2NsLT5yZWZjbnQ6MCk7CisJaWYgKGNsKSAKKwkJY2wtPnJlZmNudCsrOworCXJldHVybiAodW5zaWduZWQgbG9uZyljbDsKK30KKworc3RhdGljIHZvaWQgaHRiX2Rlc3Ryb3lfZmlsdGVycyhzdHJ1Y3QgdGNmX3Byb3RvICoqZmwpCit7CisJc3RydWN0IHRjZl9wcm90byAqdHA7CisKKwl3aGlsZSAoKHRwID0gKmZsKSAhPSBOVUxMKSB7CisJCSpmbCA9IHRwLT5uZXh0OworCQl0Y2ZfZGVzdHJveSh0cCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBodGJfZGVzdHJveV9jbGFzcyhzdHJ1Y3QgUWRpc2MqIHNjaCxzdHJ1Y3QgaHRiX2NsYXNzICpjbCkKK3sKKwlzdHJ1Y3QgaHRiX3NjaGVkICpxID0gcWRpc2NfcHJpdihzY2gpOworCUhUQl9EQkcoMCwxLCJodGJfZGVzdHJ5Y2xzIGNsaWQ9JVggcmVmPSVkXG4iLCBjbD9jbC0+Y2xhc3NpZDowLGNsP2NsLT5yZWZjbnQ6MCk7CisJaWYgKCFjbC0+bGV2ZWwpIHsKKwkJQlVHX1RSQVAoY2wtPnVuLmxlYWYucSk7CisJCXNjaC0+cS5xbGVuIC09IGNsLT51bi5sZWFmLnEtPnEucWxlbjsKKwkJcWRpc2NfZGVzdHJveShjbC0+dW4ubGVhZi5xKTsKKwl9CisJcWRpc2NfcHV0X3J0YWIoY2wtPnJhdGUpOworCXFkaXNjX3B1dF9ydGFiKGNsLT5jZWlsKTsKKwkKKwlodGJfZGVzdHJveV9maWx0ZXJzICgmY2wtPmZpbHRlcl9saXN0KTsKKwkKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmNsLT5jaGlsZHJlbikpIAorCQlodGJfZGVzdHJveV9jbGFzcyAoc2NoLGxpc3RfZW50cnkoY2wtPmNoaWxkcmVuLm5leHQsCisJCQkJCXN0cnVjdCBodGJfY2xhc3Msc2libGluZykpOworCisJLyogbm90ZTogdGhpcyBkZWxldGUgbWF5IGhhcHBlbiB0d2ljZSAoc2VlIGh0Yl9kZWxldGUpICovCisJbGlzdF9kZWwoJmNsLT5obGlzdCk7CisJbGlzdF9kZWwoJmNsLT5zaWJsaW5nKTsKKwkKKwlpZiAoY2wtPnByaW9fYWN0aXZpdHkpCisJCWh0Yl9kZWFjdGl2YXRlIChxLGNsKTsKKwkKKwlpZiAoY2wtPmNtb2RlICE9IEhUQl9DQU5fU0VORCkKKwkJaHRiX3NhZmVfcmJfZXJhc2UoJmNsLT5wcV9ub2RlLHEtPndhaXRfcHErY2wtPmxldmVsKTsKKwkKKwlrZnJlZShjbCk7Cit9CisKKy8qIGFsd2F5cyBjYWxlZCB1bmRlciBCSCAmIHF1ZXVlIGxvY2sgKi8KK3N0YXRpYyB2b2lkIGh0Yl9kZXN0cm95KHN0cnVjdCBRZGlzYyogc2NoKQoreworCXN0cnVjdCBodGJfc2NoZWQgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJSFRCX0RCRygwLDEsImh0Yl9kZXN0cm95IHE9JXBcbiIscSk7CisKKwlkZWxfdGltZXJfc3luYyAoJnEtPnRpbWVyKTsKKyNpZmRlZiBIVEJfUkFURUNNCisJZGVsX3RpbWVyX3N5bmMgKCZxLT5ydHRpbSk7CisjZW5kaWYKKwkvKiBUaGlzIGxpbmUgdXNlZCB0byBiZSBhZnRlciBodGJfZGVzdHJveV9jbGFzcyBjYWxsIGJlbG93CisJICAgYW5kIHN1cnByaXNpbmdseSBpdCB3b3JrZWQgaW4gMi40LiBCdXQgaXQgbXVzdCBwcmVjZWRlIGl0IAorCSAgIGJlY2F1c2UgZmlsdGVyIG5lZWQgaXRzIHRhcmdldCBjbGFzcyBhbGl2ZSB0byBiZSBhYmxlIHRvIGNhbGwKKwkgICB1bmJpbmRfZmlsdGVyIG9uIGl0ICh3aXRob3V0IE9vcHMpLiAqLworCWh0Yl9kZXN0cm95X2ZpbHRlcnMoJnEtPmZpbHRlcl9saXN0KTsKKwkKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnEtPnJvb3QpKSAKKwkJaHRiX2Rlc3Ryb3lfY2xhc3MgKHNjaCxsaXN0X2VudHJ5KHEtPnJvb3QubmV4dCwKKwkJCQkJc3RydWN0IGh0Yl9jbGFzcyxzaWJsaW5nKSk7CisKKwlfX3NrYl9xdWV1ZV9wdXJnZSgmcS0+ZGlyZWN0X3F1ZXVlKTsKK30KKworc3RhdGljIGludCBodGJfZGVsZXRlKHN0cnVjdCBRZGlzYyAqc2NoLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaHRiX3NjaGVkICpxID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCBodGJfY2xhc3MgKmNsID0gKHN0cnVjdCBodGJfY2xhc3MqKWFyZzsKKwlIVEJfREJHKDAsMSwiaHRiX2RlbGV0ZSBxPSVwIGNsPSVYIHJlZj0lZFxuIixxLGNsP2NsLT5jbGFzc2lkOjAsY2w/Y2wtPnJlZmNudDowKTsKKworCS8vIFRPRE86IHdoeSBkb24ndCBhbGxvdyB0byBkZWxldGUgc3VidHJlZSA/IHJlZmVyZW5jZXMgPyBkb2VzCisJLy8gdGMgc3Vic3lzIHF1YXJhbnRlZSB1cyB0aGF0IGluIGh0Yl9kZXN0cm95IGl0IGhvbGRzIG5vIGNsYXNzCisJLy8gcmVmcyBzbyB0aGF0IHdlIGNhbiByZW1vdmUgY2hpbGRyZW4gc2FmZWx5IHRoZXJlID8KKwlpZiAoIWxpc3RfZW1wdHkoJmNsLT5jaGlsZHJlbikgfHwgY2wtPmZpbHRlcl9jbnQpCisJCXJldHVybiAtRUJVU1k7CisJCisJc2NoX3RyZWVfbG9jayhzY2gpOworCQorCS8qIGRlbGV0ZSBmcm9tIGhhc2ggYW5kIGFjdGl2ZTsgcmVtYWluZGVyIGluIGRlc3Ryb3lfY2xhc3MgKi8KKwlsaXN0X2RlbF9pbml0KCZjbC0+aGxpc3QpOworCWlmIChjbC0+cHJpb19hY3Rpdml0eSkKKwkJaHRiX2RlYWN0aXZhdGUgKHEsY2wpOworCisJaWYgKC0tY2wtPnJlZmNudCA9PSAwKQorCQlodGJfZGVzdHJveV9jbGFzcyhzY2gsY2wpOworCisJc2NoX3RyZWVfdW5sb2NrKHNjaCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGh0Yl9wdXQoc3RydWN0IFFkaXNjICpzY2gsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworI2lmZGVmIEhUQl9ERUJVRworCXN0cnVjdCBodGJfc2NoZWQgKnEgPSBxZGlzY19wcml2KHNjaCk7CisjZW5kaWYKKwlzdHJ1Y3QgaHRiX2NsYXNzICpjbCA9IChzdHJ1Y3QgaHRiX2NsYXNzKilhcmc7CisJSFRCX0RCRygwLDEsImh0Yl9wdXQgcT0lcCBjbD0lWCByZWY9JWRcbiIscSxjbD9jbC0+Y2xhc3NpZDowLGNsP2NsLT5yZWZjbnQ6MCk7CisKKwlpZiAoLS1jbC0+cmVmY250ID09IDApCisJCWh0Yl9kZXN0cm95X2NsYXNzKHNjaCxjbCk7Cit9CisKK3N0YXRpYyBpbnQgaHRiX2NoYW5nZV9jbGFzcyhzdHJ1Y3QgUWRpc2MgKnNjaCwgdTMyIGNsYXNzaWQsIAorCQl1MzIgcGFyZW50aWQsIHN0cnVjdCBydGF0dHIgKip0Y2EsIHVuc2lnbmVkIGxvbmcgKmFyZykKK3sKKwlpbnQgZXJyID0gLUVJTlZBTDsKKwlzdHJ1Y3QgaHRiX3NjaGVkICpxID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCBodGJfY2xhc3MgKmNsID0gKHN0cnVjdCBodGJfY2xhc3MqKSphcmcsKnBhcmVudDsKKwlzdHJ1Y3QgcnRhdHRyICpvcHQgPSB0Y2FbVENBX09QVElPTlMtMV07CisJc3RydWN0IHFkaXNjX3JhdGVfdGFibGUgKnJ0YWIgPSBOVUxMLCAqY3RhYiA9IE5VTEw7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX0hUQl9SVEFCXTsKKwlzdHJ1Y3QgdGNfaHRiX29wdCAqaG9wdDsKKworCS8qIGV4dHJhY3QgYWxsIHN1YmF0dHJzIGZyb20gb3B0IGF0dHIgKi8KKwlpZiAoIW9wdCB8fCBydGF0dHJfcGFyc2VfbmVzdGVkKHRiLCBUQ0FfSFRCX1JUQUIsIG9wdCkgfHwKKwkJCXRiW1RDQV9IVEJfUEFSTVMtMV0gPT0gTlVMTCB8fAorCQkJUlRBX1BBWUxPQUQodGJbVENBX0hUQl9QQVJNUy0xXSkgPCBzaXplb2YoKmhvcHQpKQorCQlnb3RvIGZhaWx1cmU7CisJCisJcGFyZW50ID0gcGFyZW50aWQgPT0gVENfSF9ST09UID8gTlVMTCA6IGh0Yl9maW5kIChwYXJlbnRpZCxzY2gpOworCisJaG9wdCA9IFJUQV9EQVRBKHRiW1RDQV9IVEJfUEFSTVMtMV0pOworCUhUQl9EQkcoMCwxLCJodGJfY2hnIGNsPSVwKCVYKSwgY2xpZD0lWCwgcGFyaWQ9JVgsIG9wdC9wcmlvPSVkLCByYXRlPSV1LCBidWZmPSVkLCBxdWFudD0lZFxuIiwgY2wsY2w/Y2wtPmNsYXNzaWQ6MCxjbGFzc2lkLHBhcmVudGlkLChpbnQpaG9wdC0+cHJpbyxob3B0LT5yYXRlLnJhdGUsaG9wdC0+YnVmZmVyLGhvcHQtPnF1YW50dW0pOworCXJ0YWIgPSBxZGlzY19nZXRfcnRhYigmaG9wdC0+cmF0ZSwgdGJbVENBX0hUQl9SVEFCLTFdKTsKKwljdGFiID0gcWRpc2NfZ2V0X3J0YWIoJmhvcHQtPmNlaWwsIHRiW1RDQV9IVEJfQ1RBQi0xXSk7CisJaWYgKCFydGFiIHx8ICFjdGFiKSBnb3RvIGZhaWx1cmU7CisKKwlpZiAoIWNsKSB7IC8qIG5ldyBjbGFzcyAqLworCQlzdHJ1Y3QgUWRpc2MgKm5ld19xOworCQkvKiBjaGVjayBmb3IgdmFsaWQgY2xhc3NpZCAqLworCQlpZiAoIWNsYXNzaWQgfHwgVENfSF9NQUooY2xhc3NpZF5zY2gtPmhhbmRsZSkgfHwgaHRiX2ZpbmQoY2xhc3NpZCxzY2gpKQorCQkJZ290byBmYWlsdXJlOworCisJCS8qIGNoZWNrIG1heGltYWwgZGVwdGggKi8KKwkJaWYgKHBhcmVudCAmJiBwYXJlbnQtPnBhcmVudCAmJiBwYXJlbnQtPnBhcmVudC0+bGV2ZWwgPCAyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImh0YjogdHJlZSBpcyB0b28gZGVlcFxuIik7CisJCQlnb3RvIGZhaWx1cmU7CisJCX0KKwkJZXJyID0gLUVOT0JVRlM7CisJCWlmICgoY2wgPSBrbWFsbG9jKHNpemVvZigqY2wpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJCWdvdG8gZmFpbHVyZTsKKwkJCisJCW1lbXNldChjbCwgMCwgc2l6ZW9mKCpjbCkpOworCQljbC0+cmVmY250ID0gMTsKKwkJSU5JVF9MSVNUX0hFQUQoJmNsLT5zaWJsaW5nKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmNsLT5obGlzdCk7CisJCUlOSVRfTElTVF9IRUFEKCZjbC0+Y2hpbGRyZW4pOworCQlJTklUX0xJU1RfSEVBRCgmY2wtPnVuLmxlYWYuZHJvcF9saXN0KTsKKyNpZmRlZiBIVEJfREVCVUcKKwkJY2wtPm1hZ2ljID0gSFRCX0NNQUdJQzsKKyNlbmRpZgorCisJCS8qIGNyZWF0ZSBsZWFmIHFkaXNjIGVhcmx5IGJlY2F1c2UgaXQgdXNlcyBrbWFsbG9jKEdGUF9LRVJORUwpCisJCSAgIHNvIHRoYXQgY2FuJ3QgYmUgdXNlZCBpbnNpZGUgb2Ygc2NoX3RyZWVfbG9jaworCQkgICAtLSB0aGFua3MgdG8gS2FybGlzIFBlaXNlbmlla3MgKi8KKwkJbmV3X3EgPSBxZGlzY19jcmVhdGVfZGZsdChzY2gtPmRldiwgJnBmaWZvX3FkaXNjX29wcyk7CisJCXNjaF90cmVlX2xvY2soc2NoKTsKKwkJaWYgKHBhcmVudCAmJiAhcGFyZW50LT5sZXZlbCkgeworCQkJLyogdHVybiBwYXJlbnQgaW50byBpbm5lciBub2RlICovCisJCQlzY2gtPnEucWxlbiAtPSBwYXJlbnQtPnVuLmxlYWYucS0+cS5xbGVuOworCQkJcWRpc2NfZGVzdHJveSAocGFyZW50LT51bi5sZWFmLnEpOworCQkJaWYgKHBhcmVudC0+cHJpb19hY3Rpdml0eSkgCisJCQkJaHRiX2RlYWN0aXZhdGUgKHEscGFyZW50KTsKKworCQkJLyogcmVtb3ZlIGZyb20gZXZ0IGxpc3QgYmVjYXVzZSBvZiBsZXZlbCBjaGFuZ2UgKi8KKwkJCWlmIChwYXJlbnQtPmNtb2RlICE9IEhUQl9DQU5fU0VORCkgeworCQkJCWh0Yl9zYWZlX3JiX2VyYXNlKCZwYXJlbnQtPnBxX25vZGUscS0+d2FpdF9wcSAvKiswKi8pOworCQkJCXBhcmVudC0+Y21vZGUgPSBIVEJfQ0FOX1NFTkQ7CisJCQl9CisJCQlwYXJlbnQtPmxldmVsID0gKHBhcmVudC0+cGFyZW50ID8gcGFyZW50LT5wYXJlbnQtPmxldmVsCisJCQkJCTogVENfSFRCX01BWERFUFRIKSAtIDE7CisJCQltZW1zZXQgKCZwYXJlbnQtPnVuLmlubmVyLDAsc2l6ZW9mKHBhcmVudC0+dW4uaW5uZXIpKTsKKwkJfQorCQkvKiBsZWFmICh3ZSkgbmVlZHMgZWxlbWVudGFyeSBxZGlzYyAqLworCQljbC0+dW4ubGVhZi5xID0gbmV3X3EgPyBuZXdfcSA6ICZub29wX3FkaXNjOworCisJCWNsLT5jbGFzc2lkID0gY2xhc3NpZDsgY2wtPnBhcmVudCA9IHBhcmVudDsKKworCQkvKiBzZXQgY2xhc3MgdG8gYmUgaW4gSFRCX0NBTl9TRU5EIHN0YXRlICovCisJCWNsLT50b2tlbnMgPSBob3B0LT5idWZmZXI7CisJCWNsLT5jdG9rZW5zID0gaG9wdC0+Y2J1ZmZlcjsKKwkJY2wtPm1idWZmZXIgPSA2MDAwMDAwMDsgLyogMW1pbiAqLworCQlQU0NIRURfR0VUX1RJTUUoY2wtPnRfYyk7CisJCWNsLT5jbW9kZSA9IEhUQl9DQU5fU0VORDsKKworCQkvKiBhdHRhY2ggdG8gdGhlIGhhc2ggbGlzdCBhbmQgcGFyZW50J3MgZmFtaWx5ICovCisJCWxpc3RfYWRkX3RhaWwoJmNsLT5obGlzdCwgcS0+aGFzaCtodGJfaGFzaChjbGFzc2lkKSk7CisJCWxpc3RfYWRkX3RhaWwoJmNsLT5zaWJsaW5nLCBwYXJlbnQgPyAmcGFyZW50LT5jaGlsZHJlbiA6ICZxLT5yb290KTsKKyNpZmRlZiBIVEJfREVCVUcKKwkJeyAKKwkJCWludCBpOworCQkJZm9yIChpID0gMDsgaSA8IFRDX0hUQl9OVU1QUklPOyBpKyspIGNsLT5ub2RlW2ldLnJiX2NvbG9yID0gLTE7CisJCQljbC0+cHFfbm9kZS5yYl9jb2xvciA9IC0xOworCQl9CisjZW5kaWYKKwl9IGVsc2Ugc2NoX3RyZWVfbG9jayhzY2gpOworCisJLyogaXQgdXNlZCB0byBiZSBhIG5hc3R5IGJ1ZyBoZXJlLCB3ZSBoYXZlIHRvIGNoZWNrIHRoYXQgbm9kZQorICAgICAgICAgICBpcyByZWFsbHkgbGVhZiBiZWZvcmUgY2hhbmdpbmcgY2wtPnVuLmxlYWYgISAqLworCWlmICghY2wtPmxldmVsKSB7CisJCWNsLT51bi5sZWFmLnF1YW50dW0gPSBydGFiLT5yYXRlLnJhdGUgLyBxLT5yYXRlMnF1YW50dW07CisJCWlmICghaG9wdC0+cXVhbnR1bSAmJiBjbC0+dW4ubGVhZi5xdWFudHVtIDwgMTAwMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSFRCOiBxdWFudHVtIG9mIGNsYXNzICVYIGlzIHNtYWxsLiBDb25zaWRlciByMnEgY2hhbmdlLlxuIiwgY2wtPmNsYXNzaWQpOworCQkJY2wtPnVuLmxlYWYucXVhbnR1bSA9IDEwMDA7CisJCX0KKwkJaWYgKCFob3B0LT5xdWFudHVtICYmIGNsLT51bi5sZWFmLnF1YW50dW0gPiAyMDAwMDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkhUQjogcXVhbnR1bSBvZiBjbGFzcyAlWCBpcyBiaWcuIENvbnNpZGVyIHIycSBjaGFuZ2UuXG4iLCBjbC0+Y2xhc3NpZCk7CisJCQljbC0+dW4ubGVhZi5xdWFudHVtID0gMjAwMDAwOworCQl9CisJCWlmIChob3B0LT5xdWFudHVtKQorCQkJY2wtPnVuLmxlYWYucXVhbnR1bSA9IGhvcHQtPnF1YW50dW07CisJCWlmICgoY2wtPnVuLmxlYWYucHJpbyA9IGhvcHQtPnByaW8pID49IFRDX0hUQl9OVU1QUklPKQorCQkJY2wtPnVuLmxlYWYucHJpbyA9IFRDX0hUQl9OVU1QUklPIC0gMTsKKwl9CisKKwljbC0+YnVmZmVyID0gaG9wdC0+YnVmZmVyOworCWNsLT5jYnVmZmVyID0gaG9wdC0+Y2J1ZmZlcjsKKwlpZiAoY2wtPnJhdGUpIHFkaXNjX3B1dF9ydGFiKGNsLT5yYXRlKTsgY2wtPnJhdGUgPSBydGFiOworCWlmIChjbC0+Y2VpbCkgcWRpc2NfcHV0X3J0YWIoY2wtPmNlaWwpOyBjbC0+Y2VpbCA9IGN0YWI7CisJc2NoX3RyZWVfdW5sb2NrKHNjaCk7CisKKwkqYXJnID0gKHVuc2lnbmVkIGxvbmcpY2w7CisJcmV0dXJuIDA7CisKK2ZhaWx1cmU6CisJaWYgKHJ0YWIpIHFkaXNjX3B1dF9ydGFiKHJ0YWIpOworCWlmIChjdGFiKSBxZGlzY19wdXRfcnRhYihjdGFiKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IHRjZl9wcm90byAqKmh0Yl9maW5kX3RjZihzdHJ1Y3QgUWRpc2MgKnNjaCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGh0Yl9zY2hlZCAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlzdHJ1Y3QgaHRiX2NsYXNzICpjbCA9IChzdHJ1Y3QgaHRiX2NsYXNzICopYXJnOworCXN0cnVjdCB0Y2ZfcHJvdG8gKipmbCA9IGNsID8gJmNsLT5maWx0ZXJfbGlzdCA6ICZxLT5maWx0ZXJfbGlzdDsKKwlIVEJfREJHKDAsMiwiaHRiX3RjZiBxPSVwIGNsaWQ9JVggZnJlZj0lZCBmbD0lcFxuIixxLGNsP2NsLT5jbGFzc2lkOjAsY2w/Y2wtPmZpbHRlcl9jbnQ6cS0+ZmlsdGVyX2NudCwqZmwpOworCXJldHVybiBmbDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHRiX2JpbmRfZmlsdGVyKHN0cnVjdCBRZGlzYyAqc2NoLCB1bnNpZ25lZCBsb25nIHBhcmVudCwKKwl1MzIgY2xhc3NpZCkKK3sKKwlzdHJ1Y3QgaHRiX3NjaGVkICpxID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCBodGJfY2xhc3MgKmNsID0gaHRiX2ZpbmQgKGNsYXNzaWQsc2NoKTsKKwlIVEJfREJHKDAsMiwiaHRiX2JpbmQgcT0lcCBjbGlkPSVYIGNsPSVwIGZyZWY9JWRcbiIscSxjbGFzc2lkLGNsLGNsP2NsLT5maWx0ZXJfY250OnEtPmZpbHRlcl9jbnQpOworCS8qaWYgKGNsICYmICFjbC0+bGV2ZWwpIHJldHVybiAwOworCSAgVGhlIGxpbmUgYWJvdmUgdXNlZCB0byBiZSB0aGVyZSB0byBwcmV2ZW50IGF0dGFjaGluZyBmaWx0ZXJzIHRvIAorCSAgbGVhdmVzLiBCdXQgYXQgbGVhc3QgdGNfaW5kZXggZmlsdGVyIHVzZXMgdGhpcyBqdXN0IHRvIGdldCBjbGFzcyAKKwkgIGZvciBvdGhlciByZWFzb25zIHNvIHRoYXQgd2UgaGF2ZSB0byBhbGxvdyBmb3IgaXQuCisJICAtLS0tCisJICAxOS42LjIwMDIgQXMgV2VybmVyIGV4cGxhaW5lZCBpdCBpcyBvayAtIGJpbmQgZmlsdGVyIGlzIGp1c3QKKwkgIGFub3RoZXIgd2F5IHRvICJsb2NrIiB0aGUgY2xhc3MgLSB1bmxpa2UgImdldCIgdGhpcyBsb2NrIGNhbgorCSAgYmUgYnJva2VuIGJ5IGNsYXNzIGR1cmluZyBkZXN0cm95IElJVUMuCisJICovCisJaWYgKGNsKSAKKwkJY2wtPmZpbHRlcl9jbnQrKzsgCisJZWxzZSAKKwkJcS0+ZmlsdGVyX2NudCsrOworCXJldHVybiAodW5zaWduZWQgbG9uZyljbDsKK30KKworc3RhdGljIHZvaWQgaHRiX3VuYmluZF9maWx0ZXIoc3RydWN0IFFkaXNjICpzY2gsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBodGJfc2NoZWQgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJc3RydWN0IGh0Yl9jbGFzcyAqY2wgPSAoc3RydWN0IGh0Yl9jbGFzcyAqKWFyZzsKKwlIVEJfREJHKDAsMiwiaHRiX3VuYmluZCBxPSVwIGNsPSVwIGZyZWY9JWRcbiIscSxjbCxjbD9jbC0+ZmlsdGVyX2NudDpxLT5maWx0ZXJfY250KTsKKwlpZiAoY2wpIAorCQljbC0+ZmlsdGVyX2NudC0tOyAKKwllbHNlIAorCQlxLT5maWx0ZXJfY250LS07Cit9CisKK3N0YXRpYyB2b2lkIGh0Yl93YWxrKHN0cnVjdCBRZGlzYyAqc2NoLCBzdHJ1Y3QgcWRpc2Nfd2Fsa2VyICphcmcpCit7CisJc3RydWN0IGh0Yl9zY2hlZCAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlpbnQgaTsKKworCWlmIChhcmctPnN0b3ApCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBIVEJfSFNJWkU7IGkrKykgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCQlsaXN0X2Zvcl9lYWNoIChwLHEtPmhhc2graSkgeworCQkJc3RydWN0IGh0Yl9jbGFzcyAqY2wgPSBsaXN0X2VudHJ5KHAsc3RydWN0IGh0Yl9jbGFzcyxobGlzdCk7CisJCQlpZiAoYXJnLT5jb3VudCA8IGFyZy0+c2tpcCkgeworCQkJCWFyZy0+Y291bnQrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChhcmctPmZuKHNjaCwgKHVuc2lnbmVkIGxvbmcpY2wsIGFyZykgPCAwKSB7CisJCQkJYXJnLT5zdG9wID0gMTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlhcmctPmNvdW50Kys7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgUWRpc2NfY2xhc3Nfb3BzIGh0Yl9jbGFzc19vcHMgPSB7CisJLmdyYWZ0CQk9CWh0Yl9ncmFmdCwKKwkubGVhZgkJPQlodGJfbGVhZiwKKwkuZ2V0CQk9CWh0Yl9nZXQsCisJLnB1dAkJPQlodGJfcHV0LAorCS5jaGFuZ2UJCT0JaHRiX2NoYW5nZV9jbGFzcywKKwkuZGVsZXRlCQk9CWh0Yl9kZWxldGUsCisJLndhbGsJCT0JaHRiX3dhbGssCisJLnRjZl9jaGFpbgk9CWh0Yl9maW5kX3RjZiwKKwkuYmluZF90Y2YJPQlodGJfYmluZF9maWx0ZXIsCisJLnVuYmluZF90Y2YJPQlodGJfdW5iaW5kX2ZpbHRlciwKKwkuZHVtcAkJPQlodGJfZHVtcF9jbGFzcywKKwkuZHVtcF9zdGF0cwk9CWh0Yl9kdW1wX2NsYXNzX3N0YXRzLAorfTsKKworc3RhdGljIHN0cnVjdCBRZGlzY19vcHMgaHRiX3FkaXNjX29wcyA9IHsKKwkubmV4dAkJPQlOVUxMLAorCS5jbF9vcHMJCT0JJmh0Yl9jbGFzc19vcHMsCisJLmlkCQk9CSJodGIiLAorCS5wcml2X3NpemUJPQlzaXplb2Yoc3RydWN0IGh0Yl9zY2hlZCksCisJLmVucXVldWUJPQlodGJfZW5xdWV1ZSwKKwkuZGVxdWV1ZQk9CWh0Yl9kZXF1ZXVlLAorCS5yZXF1ZXVlCT0JaHRiX3JlcXVldWUsCisJLmRyb3AJCT0JaHRiX2Ryb3AsCisJLmluaXQJCT0JaHRiX2luaXQsCisJLnJlc2V0CQk9CWh0Yl9yZXNldCwKKwkuZGVzdHJveQk9CWh0Yl9kZXN0cm95LAorCS5jaGFuZ2UJCT0JTlVMTCAvKiBodGJfY2hhbmdlICovLAorCS5kdW1wCQk9CWh0Yl9kdW1wLAorCS5vd25lcgkJPQlUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGh0Yl9tb2R1bGVfaW5pdCh2b2lkKQoreworICAgIHJldHVybiByZWdpc3Rlcl9xZGlzYygmaHRiX3FkaXNjX29wcyk7Cit9CitzdGF0aWMgdm9pZCBfX2V4aXQgaHRiX21vZHVsZV9leGl0KHZvaWQpIAoreworICAgIHVucmVnaXN0ZXJfcWRpc2MoJmh0Yl9xZGlzY19vcHMpOworfQorbW9kdWxlX2luaXQoaHRiX21vZHVsZV9pbml0KQorbW9kdWxlX2V4aXQoaHRiX21vZHVsZV9leGl0KQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9pbmdyZXNzLmMgYi9uZXQvc2NoZWQvc2NoX2luZ3Jlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWRjMzJhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjaGVkL3NjaF9pbmdyZXNzLmMKQEAgLTAsMCArMSw0MzYgQEAKKy8qIG5ldC9zY2hlZC9zY2hfaW5ncmVzcy5jIC0gSW5ncmVzcyBxZGlzYyAKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6ICAgICBKYW1hbCBIYWRpIFNhbGltIDE5OTkKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisKKyN1bmRlZiBERUJVR19JTkdSRVNTCisKKyNpZmRlZiBERUJVR19JTkdSRVNTICAvKiBjb250cm9sICovCisjZGVmaW5lIERQUklOVEsoZm9ybWF0LGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCwjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBEUFJJTlRLKGZvcm1hdCxhcmdzLi4uKQorI2VuZGlmCisKKyNpZiAwICAvKiBkYXRhICovCisjZGVmaW5lIEQyUFJJTlRLKGZvcm1hdCxhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQsIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgRDJQUklOVEsoZm9ybWF0LGFyZ3MuLi4pCisjZW5kaWYKKworCisjZGVmaW5lIFBSSVYoc2NoKSBxZGlzY19wcml2KHNjaCkKKworCisvKiBUaGFua3MgdG8gRG9yb24gT3ogZm9yIHRoaXMgaGFjaworKi8KKyNpZm5kZWYgQ09ORklHX05FVF9DTFNfQUNUCisjaWZkZWYgQ09ORklHX05FVEZJTFRFUgorc3RhdGljIGludCBuZl9yZWdpc3RlcmVkOyAKKyNlbmRpZgorI2VuZGlmCisKK3N0cnVjdCBpbmdyZXNzX3FkaXNjX2RhdGEgeworCXN0cnVjdCBRZGlzYwkJKnE7CisJc3RydWN0IHRjZl9wcm90bwkqZmlsdGVyX2xpc3Q7Cit9OworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2xhc3MvZmxvdyBvcGVyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCitzdGF0aWMgaW50IGluZ3Jlc3NfZ3JhZnQoc3RydWN0IFFkaXNjICpzY2gsdW5zaWduZWQgbG9uZyBhcmcsCisgICAgc3RydWN0IFFkaXNjICpuZXcsc3RydWN0IFFkaXNjICoqb2xkKQoreworI2lmZGVmIERFQlVHX0lOR1JFU1MKKwlzdHJ1Y3QgaW5ncmVzc19xZGlzY19kYXRhICpwID0gUFJJVihzY2gpOworI2VuZGlmCisKKwlEUFJJTlRLKCJpbmdyZXNzX2dyYWZ0KHNjaCAlcCxbcWRpc2MgJXBdLG5ldyAlcCxvbGQgJXApXG4iLAorCQlzY2gsIHAsIG5ldywgb2xkKTsKKwlEUFJJTlRLKCJcbiBpbmdyZXNzX2dyYWZ0OiBZb3UgY2Fubm90IGFkZCBxZGlzY3MgdG8gY2xhc3NlcyIpOworICAgICAgICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgc3RydWN0IFFkaXNjICppbmdyZXNzX2xlYWYoc3RydWN0IFFkaXNjICpzY2gsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGluZ3Jlc3NfZ2V0KHN0cnVjdCBRZGlzYyAqc2NoLHUzMiBjbGFzc2lkKQoreworI2lmZGVmIERFQlVHX0lOR1JFU1MKKwlzdHJ1Y3QgaW5ncmVzc19xZGlzY19kYXRhICpwID0gUFJJVihzY2gpOworI2VuZGlmCisJRFBSSU5USygiaW5ncmVzc19nZXQoc2NoICVwLFtxZGlzYyAlcF0sY2xhc3NpZCAleClcbiIsIHNjaCwgcCwgY2xhc3NpZCk7CisJcmV0dXJuIFRDX0hfTUlOKGNsYXNzaWQpICsgMTsKK30KKworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbmdyZXNzX2JpbmRfZmlsdGVyKHN0cnVjdCBRZGlzYyAqc2NoLAorICAgIHVuc2lnbmVkIGxvbmcgcGFyZW50LCB1MzIgY2xhc3NpZCkKK3sKKwlyZXR1cm4gaW5ncmVzc19nZXQoc2NoLCBjbGFzc2lkKTsKK30KKworCitzdGF0aWMgdm9pZCBpbmdyZXNzX3B1dChzdHJ1Y3QgUWRpc2MgKnNjaCwgdW5zaWduZWQgbG9uZyBjbCkKK3sKK30KKworCitzdGF0aWMgaW50IGluZ3Jlc3NfY2hhbmdlKHN0cnVjdCBRZGlzYyAqc2NoLCB1MzIgY2xhc3NpZCwgdTMyIHBhcmVudCwKKyAgICBzdHJ1Y3QgcnRhdHRyICoqdGNhLCB1bnNpZ25lZCBsb25nICphcmcpCit7CisjaWZkZWYgREVCVUdfSU5HUkVTUworCXN0cnVjdCBpbmdyZXNzX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7CisjZW5kaWYKKwlEUFJJTlRLKCJpbmdyZXNzX2NoYW5nZShzY2ggJXAsW3FkaXNjICVwXSxjbGFzc2lkICV4LHBhcmVudCAleCksIgorCQkiYXJnIDB4JWx4XG4iLCBzY2gsIHAsIGNsYXNzaWQsIHBhcmVudCwgKmFyZyk7CisJRFBSSU5USygiTm8gZWZmZWN0LiBzY2hfaW5ncmVzcyBkb2Vzbid0IG1haW50YWluIGNsYXNzZXMgYXQgdGhlIG1vbWVudCIpOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIHZvaWQgaW5ncmVzc193YWxrKHN0cnVjdCBRZGlzYyAqc2NoLHN0cnVjdCBxZGlzY193YWxrZXIgKndhbGtlcikKK3sKKyNpZmRlZiBERUJVR19JTkdSRVNTCisJc3RydWN0IGluZ3Jlc3NfcWRpc2NfZGF0YSAqcCA9IFBSSVYoc2NoKTsKKyNlbmRpZgorCURQUklOVEsoImluZ3Jlc3Nfd2FsayhzY2ggJXAsW3FkaXNjICVwXSx3YWxrZXIgJXApXG4iLCBzY2gsIHAsIHdhbGtlcik7CisJRFBSSU5USygiTm8gZWZmZWN0LiBzY2hfaW5ncmVzcyBkb2Vzbid0IG1haW50YWluIGNsYXNzZXMgYXQgdGhlIG1vbWVudCIpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgdGNmX3Byb3RvICoqaW5ncmVzc19maW5kX3RjZihzdHJ1Y3QgUWRpc2MgKnNjaCx1bnNpZ25lZCBsb25nIGNsKQoreworCXN0cnVjdCBpbmdyZXNzX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7CisKKwlyZXR1cm4gJnAtPmZpbHRlcl9saXN0OworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBRZGlzYyBvcGVyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCitzdGF0aWMgaW50IGluZ3Jlc3NfZW5xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLHN0cnVjdCBRZGlzYyAqc2NoKQoreworCXN0cnVjdCBpbmdyZXNzX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7CisJc3RydWN0IHRjZl9yZXN1bHQgcmVzOworCWludCByZXN1bHQ7CisKKwlEMlBSSU5USygiaW5ncmVzc19lbnF1ZXVlKHNrYiAlcCxzY2ggJXAsW3FkaXNjICVwXSlcbiIsIHNrYiwgc2NoLCBwKTsKKwlyZXN1bHQgPSB0Y19jbGFzc2lmeShza2IsIHAtPmZpbHRlcl9saXN0LCAmcmVzKTsKKwlEMlBSSU5USygicmVzdWx0ICVkIGNsYXNzIDB4JTA0eFxuIiwgcmVzdWx0LCByZXMuY2xhc3NpZCk7CisJLyoKKwkgKiBVbmxpa2Ugbm9ybWFsICJlbnF1ZXVlIiBmdW5jdGlvbnMsIGluZ3Jlc3NfZW5xdWV1ZSByZXR1cm5zIGEKKwkgKiBmaXJld2FsbCBGV18qIGNvZGUuCisJICovCisjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCisJc2NoLT5ic3RhdHMucGFja2V0cysrOworCXNjaC0+YnN0YXRzLmJ5dGVzICs9IHNrYi0+bGVuOworCXN3aXRjaCAocmVzdWx0KSB7CisJCWNhc2UgVENfQUNUX1NIT1Q6CisJCQlyZXN1bHQgPSBUQ19BQ1RfU0hPVDsKKwkJCXNjaC0+cXN0YXRzLmRyb3BzKys7CisJCQlicmVhazsKKwkJY2FzZSBUQ19BQ1RfU1RPTEVOOgorCQljYXNlIFRDX0FDVF9RVUVVRUQ6CisJCQlyZXN1bHQgPSBUQ19BQ1RfU1RPTEVOOworCQkJYnJlYWs7CisJCWNhc2UgVENfQUNUX1JFQ0xBU1NJRlk6IAorCQljYXNlIFRDX0FDVF9PSzoKKwkJY2FzZSBUQ19BQ1RfVU5TUEVDOgorCQlkZWZhdWx0OgorCQkJc2tiLT50Y19pbmRleCA9IFRDX0hfTUlOKHJlcy5jbGFzc2lkKTsKKwkJCXJlc3VsdCA9IFRDX0FDVF9PSzsKKwkJCWJyZWFrOworCX07CisvKiBiYWNrd2FyZCBjb21wYXQgKi8KKyNlbHNlCisjaWZkZWYJQ09ORklHX05FVF9DTFNfUE9MSUNFICAKKwlzd2l0Y2ggKHJlc3VsdCkgeworCQljYXNlIFRDX1BPTElDRV9TSE9UOgorCQlyZXN1bHQgPSBORl9EUk9QOworCQlzY2gtPnFzdGF0cy5kcm9wcysrOworCQlicmVhazsKKwkJY2FzZSBUQ19QT0xJQ0VfUkVDTEFTU0lGWTogLyogRFNDUCByZW1hcmtpbmcgaGVyZSA/ICovCisJCWNhc2UgVENfUE9MSUNFX09LOgorCQljYXNlIFRDX1BPTElDRV9VTlNQRUM6CisJCWRlZmF1bHQ6CisJCXNjaC0+YnN0YXRzLnBhY2tldHMrKzsKKwkJc2NoLT5ic3RhdHMuYnl0ZXMgKz0gc2tiLT5sZW47CisJCXJlc3VsdCA9IE5GX0FDQ0VQVDsKKwkJYnJlYWs7CisJfTsKKworI2Vsc2UKKwlEMlBSSU5USygiT3ZlcnJpZGluZyByZXN1bHQgdG8gQUNDRVBUXG4iKTsKKwlyZXN1bHQgPSBORl9BQ0NFUFQ7CisJc2NoLT5ic3RhdHMucGFja2V0cysrOworCXNjaC0+YnN0YXRzLmJ5dGVzICs9IHNrYi0+bGVuOworI2VuZGlmCisjZW5kaWYKKworCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIHN0cnVjdCBza19idWZmICppbmdyZXNzX2RlcXVldWUoc3RydWN0IFFkaXNjICpzY2gpCit7CisvKgorCXN0cnVjdCBpbmdyZXNzX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7CisJRDJQUklOVEsoImluZ3Jlc3NfZGVxdWV1ZShzY2ggJXAsW3FkaXNjICVwXSlcbiIsc2NoLFBSSVYocCkpOworKi8KKwlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgaW50IGluZ3Jlc3NfcmVxdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLHN0cnVjdCBRZGlzYyAqc2NoKQoreworLyoKKwlzdHJ1Y3QgaW5ncmVzc19xZGlzY19kYXRhICpwID0gUFJJVihzY2gpOworCUQyUFJJTlRLKCJpbmdyZXNzX3JlcXVldWUoc2tiICVwLHNjaCAlcCxbcWRpc2MgJXBdKVxuIixza2Isc2NoLFBSSVYocCkpOworKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBpbmdyZXNzX2Ryb3Aoc3RydWN0IFFkaXNjICpzY2gpCit7CisjaWZkZWYgREVCVUdfSU5HUkVTUworCXN0cnVjdCBpbmdyZXNzX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7CisjZW5kaWYKKwlEUFJJTlRLKCJpbmdyZXNzX2Ryb3Aoc2NoICVwLFtxZGlzYyAlcF0pXG4iLCBzY2gsIHApOworCXJldHVybiAwOworfQorCisjaWZuZGVmIENPTkZJR19ORVRfQ0xTX0FDVAorI2lmZGVmIENPTkZJR19ORVRGSUxURVIKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2luZ19ob29rKHVuc2lnbmVkIGludCBob29rLCBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dGRldiwKKwkgICAgICAgICAgICAgICAgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwkKKwlzdHJ1Y3QgUWRpc2MgKnE7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpwc2tiOworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CisJaW50IGZ3cmVzPU5GX0FDQ0VQVDsKKworCURQUklOVEsoImluZ19ob29rOiBza2IgJXMgZGV2PSVzIGxlbj0ldVxuIiwKKwkJc2tiLT5zayA/ICIob3duZWQpIiA6ICIodW5vd25lZCkiLAorCQlza2ItPmRldiA/ICgqcHNrYiktPmRldi0+bmFtZSA6ICIobm8gZGV2KSIsCisJCXNrYi0+bGVuKTsKKworLyogCityZXZpc2l0IGxhdGVyOiBVc2UgYSBwcml2YXRlIHNpbmNlIGxvY2sgZGV2LT5xdWV1ZV9sb2NrIGlzIGFsc28KK3VzZWQgb24gdGhlIGVncmVzcyAobWlnaHQgc2xvdyB0aGluZ3MgZm9yIGFuIGlvdGEpCisqLworCisJaWYgKGRldi0+cWRpc2NfaW5ncmVzcykgeworCQlzcGluX2xvY2soJmRldi0+cXVldWVfbG9jayk7CisJCWlmICgocSA9IGRldi0+cWRpc2NfaW5ncmVzcykgIT0gTlVMTCkKKwkJCWZ3cmVzID0gcS0+ZW5xdWV1ZShza2IsIHEpOworCQlzcGluX3VubG9jaygmZGV2LT5xdWV1ZV9sb2NrKTsKKyAgICAgICAgfQorCQkJCisJcmV0dXJuIGZ3cmVzOworfQorCisvKiBhZnRlciBpcHRfZmlsdGVyICovCitzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIGluZ19vcHMgPSB7CisJLmhvb2sgICAgICAgICAgID0gaW5nX2hvb2ssCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5wZiAgICAgICAgICAgICA9IFBGX0lORVQsCisJLmhvb2tudW0gICAgICAgID0gTkZfSVBfUFJFX1JPVVRJTkcsCisJLnByaW9yaXR5ICAgICAgID0gTkZfSVBfUFJJX0ZJTFRFUiArIDEsCit9OworCitzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIGluZzZfb3BzID0geworCS5ob29rICAgICAgICAgICA9IGluZ19ob29rLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucGYgICAgICAgICAgICAgPSBQRl9JTkVUNiwKKwkuaG9va251bSAgICAgICAgPSBORl9JUDZfUFJFX1JPVVRJTkcsCisJLnByaW9yaXR5ICAgICAgID0gTkZfSVA2X1BSSV9GSUxURVIgKyAxLAorfTsKKworI2VuZGlmCisjZW5kaWYKKworc3RhdGljIGludCBpbmdyZXNzX2luaXQoc3RydWN0IFFkaXNjICpzY2gsc3RydWN0IHJ0YXR0ciAqb3B0KQoreworCXN0cnVjdCBpbmdyZXNzX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7CisKKy8qIE1ha2Ugc3VyZSBlaXRoZXIgbmV0ZmlsdGVyIG9yIHByZWZlcmFibHkgQ0xTX0FDVCBpcworKiBjb21waWxlZCBpbiAqLworI2lmbmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKKyNpZm5kZWYgQ09ORklHX05FVEZJTFRFUgorCXByaW50aygiWW91IE1VU1QgY29tcGlsZSBjbGFzc2lmaWVyIGFjdGlvbnMgaW50byB0aGUga2VybmVsXG4iKTsKKwlyZXR1cm4gLUVJTlZBTDsKKyNlbHNlCisJcHJpbnRrKCJJbmdyZXNzIHNjaGVkdWxlcjogQ2xhc3NpZmllciBhY3Rpb25zIHByZWZlcmVkIG92ZXIgbmV0ZmlsdGVyXG4iKTsKKyNlbmRpZgorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2lmbmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSCisJaWYgKCFuZl9yZWdpc3RlcmVkKSB7CisJCWlmIChuZl9yZWdpc3Rlcl9ob29rKCZpbmdfb3BzKSA8IDApIHsKKwkJCXByaW50aygiaW5ncmVzcyBxZGlzYyByZWdpc3RyYXRpb24gZXJyb3IgXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCW5mX3JlZ2lzdGVyZWQrKzsKKworCQlpZiAobmZfcmVnaXN0ZXJfaG9vaygmaW5nNl9vcHMpIDwgMCkgeworCQkJcHJpbnRrKCJJUHY2IGluZ3Jlc3MgcWRpc2MgcmVnaXN0cmF0aW9uIGVycm9yLCAiIFwKKwkJCSAgICAiZGlzYWJsaW5nIElQdjYgc3VwcG9ydC5cbiIpOworCQl9IGVsc2UKKwkJCW5mX3JlZ2lzdGVyZWQrKzsKKwl9CisjZW5kaWYKKyNlbmRpZgorCisJRFBSSU5USygiaW5ncmVzc19pbml0KHNjaCAlcCxbcWRpc2MgJXBdLG9wdCAlcClcbiIsc2NoLHAsb3B0KTsKKwlwLT5xID0gJm5vb3BfcWRpc2M7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgaW5ncmVzc19yZXNldChzdHJ1Y3QgUWRpc2MgKnNjaCkKK3sKKwlzdHJ1Y3QgaW5ncmVzc19xZGlzY19kYXRhICpwID0gUFJJVihzY2gpOworCisJRFBSSU5USygiaW5ncmVzc19yZXNldChzY2ggJXAsW3FkaXNjICVwXSlcbiIsIHNjaCwgcCk7CisKKy8qCisjaWYgMAorKi8KKy8qIGZvciBmdXR1cmUgdXNlICovCisJcWRpc2NfcmVzZXQocC0+cSk7CisvKgorI2VuZGlmCisqLworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBpbmdyZXNzX2Rlc3Ryb3koc3RydWN0IFFkaXNjICpzY2gpCit7CisJc3RydWN0IGluZ3Jlc3NfcWRpc2NfZGF0YSAqcCA9IFBSSVYoc2NoKTsKKwlzdHJ1Y3QgdGNmX3Byb3RvICp0cDsKKworCURQUklOVEsoImluZ3Jlc3NfZGVzdHJveShzY2ggJXAsW3FkaXNjICVwXSlcbiIsIHNjaCwgcCk7CisJd2hpbGUgKHAtPmZpbHRlcl9saXN0KSB7CisJCXRwID0gcC0+ZmlsdGVyX2xpc3Q7CisJCXAtPmZpbHRlcl9saXN0ID0gdHAtPm5leHQ7CisJCXRjZl9kZXN0cm95KHRwKTsKKwl9CisjaWYgMAorLyogZm9yIGZ1dHVyZSB1c2UgKi8KKwlxZGlzY19kZXN0cm95KHAtPnEpOworI2VuZGlmCit9CisKKworc3RhdGljIGludCBpbmdyZXNzX2R1bXAoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3QgcnRhdHRyICpydGE7CisKKwlydGEgPSAoc3RydWN0IHJ0YXR0ciAqKSBiOworCVJUQV9QVVQoc2tiLCBUQ0FfT1BUSU9OUywgMCwgTlVMTCk7CisJcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlyZXR1cm4gc2tiLT5sZW47CisKK3J0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgc3RydWN0IFFkaXNjX2NsYXNzX29wcyBpbmdyZXNzX2NsYXNzX29wcyA9IHsKKwkuZ3JhZnQJCT0JaW5ncmVzc19ncmFmdCwKKwkubGVhZgkJPQlpbmdyZXNzX2xlYWYsCisJLmdldAkJPQlpbmdyZXNzX2dldCwKKwkucHV0CQk9CWluZ3Jlc3NfcHV0LAorCS5jaGFuZ2UJCT0JaW5ncmVzc19jaGFuZ2UsCisJLmRlbGV0ZQkJPQlOVUxMLAorCS53YWxrCQk9CWluZ3Jlc3Nfd2FsaywKKwkudGNmX2NoYWluCT0JaW5ncmVzc19maW5kX3RjZiwKKwkuYmluZF90Y2YJPQlpbmdyZXNzX2JpbmRfZmlsdGVyLAorCS51bmJpbmRfdGNmCT0JaW5ncmVzc19wdXQsCisJLmR1bXAJCT0JTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgUWRpc2Nfb3BzIGluZ3Jlc3NfcWRpc2Nfb3BzID0geworCS5uZXh0CQk9CU5VTEwsCisJLmNsX29wcwkJPQkmaW5ncmVzc19jbGFzc19vcHMsCisJLmlkCQk9CSJpbmdyZXNzIiwKKwkucHJpdl9zaXplCT0Jc2l6ZW9mKHN0cnVjdCBpbmdyZXNzX3FkaXNjX2RhdGEpLAorCS5lbnF1ZXVlCT0JaW5ncmVzc19lbnF1ZXVlLAorCS5kZXF1ZXVlCT0JaW5ncmVzc19kZXF1ZXVlLAorCS5yZXF1ZXVlCT0JaW5ncmVzc19yZXF1ZXVlLAorCS5kcm9wCQk9CWluZ3Jlc3NfZHJvcCwKKwkuaW5pdAkJPQlpbmdyZXNzX2luaXQsCisJLnJlc2V0CQk9CWluZ3Jlc3NfcmVzZXQsCisJLmRlc3Ryb3kJPQlpbmdyZXNzX2Rlc3Ryb3ksCisJLmNoYW5nZQkJPQlOVUxMLAorCS5kdW1wCQk9CWluZ3Jlc3NfZHVtcCwKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbmdyZXNzX21vZHVsZV9pbml0KHZvaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoKHJldCA9IHJlZ2lzdGVyX3FkaXNjKCZpbmdyZXNzX3FkaXNjX29wcykpIDwgMCkgeworCQlwcmludGsoIlVuYWJsZSB0byByZWdpc3RlciBJbmdyZXNzIHFkaXNjXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIHZvaWQgX19leGl0IGluZ3Jlc3NfbW9kdWxlX2V4aXQodm9pZCkgCit7CisJdW5yZWdpc3Rlcl9xZGlzYygmaW5ncmVzc19xZGlzY19vcHMpOworI2lmbmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSCisJaWYgKG5mX3JlZ2lzdGVyZWQpIHsKKwkJbmZfdW5yZWdpc3Rlcl9ob29rKCZpbmdfb3BzKTsKKwkJaWYgKG5mX3JlZ2lzdGVyZWQgPiAxKQorCQkJbmZfdW5yZWdpc3Rlcl9ob29rKCZpbmc2X29wcyk7CisJfQorI2VuZGlmCisjZW5kaWYKK30KK21vZHVsZV9pbml0KGluZ3Jlc3NfbW9kdWxlX2luaXQpCittb2R1bGVfZXhpdChpbmdyZXNzX21vZHVsZV9leGl0KQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9uZXRlbS5jIGIvbmV0L3NjaGVkL3NjaF9uZXRlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYzI5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2NoZWQvc2NoX25ldGVtLmMKQEAgLTAsMCArMSw1OTggQEAKKy8qCisgKiBuZXQvc2NoZWQvc2NoX25ldGVtLmMJTmV0d29yayBlbXVsYXRvcgorICoKKyAqIAkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIAkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgCQlNYW55IG9mIHRoZSBhbGdvcml0aG1zIGFuZCBpZGVhcyBmb3IgdGhpcyBjYW1lIGZyb20KKyAqCQlOSVNUIE5ldCB3aGljaCBpcyBub3QgY29weXJpZ2h0ZWQuIAorICoKKyAqIEF1dGhvcnM6CVN0ZXBoZW4gSGVtbWluZ2VyIDxzaGVtbWluZ2VyQG9zZGwub3JnPgorICoJCUNhdGFsaW4odXggYWthIERpbm8pIEJPSUUgPGNhdGFiIGF0IHVtYnJlbGxhIGRvdCBybz4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorCisjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgorCisvKglOZXR3b3JrIEVtdWxhdGlvbiBRdWV1aW5nIGFsZ29yaXRobS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVNvdXJjZXM6IFsxXSBNYXJrIENhcnNvbiwgRGFycmluIFNhbnRheSwgIk5JU1QgTmV0IC0gQSBMaW51eC1iYXNlZAorCQkgTmV0d29yayBFbXVsYXRpb24gVG9vbAorCQkgWzJdIEx1aWdpIFJpenpvLCBEdW1teU5ldCBmb3IgRnJlZUJTRAorCisJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCSBUaGlzIHN0YXJ0ZWQgb3V0IGFzIGEgc2ltcGxlIHdheSB0byBkZWxheSBvdXRnb2luZyBwYWNrZXRzIHRvCisJIHRlc3QgVENQIGJ1dCBoYXMgZ3Jvd24gdG8gaW5jbHVkZSBtb3N0IG9mIHRoZSBmdW5jdGlvbmFsaXR5CisJIG9mIGEgZnVsbCBibG93biBuZXR3b3JrIGVtdWxhdG9yIGxpa2UgTklTVG5ldC4gSXQgY2FuIGRlbGF5CisJIHBhY2tldHMgYW5kIGFkZCByYW5kb20gaml0dGVyIChhbmQgY29ycmVsYXRpb24pLiBUaGUgcmFuZG9tCisJIGRpc3RyaWJ1dGlvbiBjYW4gYmUgbG9hZGVkIGZyb20gYSB0YWJsZSBhcyB3ZWxsIHRvIHByb3ZpZGUKKwkgbm9ybWFsLCBQYXJldG8sIG9yIGV4cGVyaW1lbnRhbCBjdXJ2ZXMuIFBhY2tldCBsb3NzLAorCSBkdXBsaWNhdGlvbiwgYW5kIHJlb3JkZXJpbmcgY2FuIGFsc28gYmUgZW11bGF0ZWQuCisKKwkgVGhpcyBxZGlzYyBkb2VzIG5vdCBkbyBjbGFzc2lmaWNhdGlvbiB0aGF0IGNhbiBiZSBoYW5kbGVkIGluCisJIGxheWVyaW5nIG90aGVyIGRpc2NpcGxpbmVzLiAgSXQgZG9lcyBub3QgbmVlZCB0byBkbyBiYW5kd2lkdGgKKwkgY29udHJvbCBlaXRoZXIgc2luY2UgdGhhdCBjYW4gYmUgaGFuZGxlZCBieSB1c2luZyB0b2tlbgorCSBidWNrZXQgb3Igb3RoZXIgcmF0ZSBjb250cm9sLgorCisJIFRoZSBzaW11bGF0b3IgaXMgbGltaXRlZCBieSB0aGUgTGludXggdGltZXIgcmVzb2x1dGlvbgorCSBhbmQgd2lsbCBjcmVhdGUgcGFja2V0IGJ1cnN0cyBvbiB0aGUgSFogYm91bmRhcnkgKDFtcykuCisqLworCitzdHJ1Y3QgbmV0ZW1fc2NoZWRfZGF0YSB7CisJc3RydWN0IFFkaXNjCSpxZGlzYzsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGRlbGF5ZWQ7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisKKwl1MzIgbGF0ZW5jeTsKKwl1MzIgbG9zczsKKwl1MzIgbGltaXQ7CisJdTMyIGNvdW50ZXI7CisJdTMyIGdhcDsKKwl1MzIgaml0dGVyOworCXUzMiBkdXBsaWNhdGU7CisKKwlzdHJ1Y3QgY3JuZHN0YXRlIHsKKwkJdW5zaWduZWQgbG9uZyBsYXN0OworCQl1bnNpZ25lZCBsb25nIHJobzsKKwl9IGRlbGF5X2NvciwgbG9zc19jb3IsIGR1cF9jb3I7CisKKwlzdHJ1Y3QgZGlzdHRhYmxlIHsKKwkJdTMyICBzaXplOworCQlzMTYgdGFibGVbMF07CisJfSAqZGVsYXlfZGlzdDsKK307CisKKy8qIFRpbWUgc3RhbXAgcHV0IGludG8gc29ja2V0IGJ1ZmZlciBjb250cm9sIGJsb2NrICovCitzdHJ1Y3QgbmV0ZW1fc2tiX2NiIHsKKwlwc2NoZWRfdGltZV90CXRpbWVfdG9fc2VuZDsKK307CisKKy8qIGluaXRfY3JhbmRvbSAtIGluaXRpYWxpemUgY29ycmVsYXRlZCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICogVXNlIGVudHJvcHkgc291cmNlIGZvciBpbml0aWFsIHNlZWQuCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfY3JhbmRvbShzdHJ1Y3QgY3JuZHN0YXRlICpzdGF0ZSwgdW5zaWduZWQgbG9uZyByaG8pCit7CisJc3RhdGUtPnJobyA9IHJobzsKKwlzdGF0ZS0+bGFzdCA9IG5ldF9yYW5kb20oKTsKK30KKworLyogZ2V0X2NyYW5kb20gLSBjb3JyZWxhdGVkIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgKiBOZXh0IG51bWJlciBkZXBlbmRzIG9uIGxhc3QgdmFsdWUuCisgKiByaG8gaXMgc2NhbGVkIHRvIGF2b2lkIGZsb2F0aW5nIHBvaW50LgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfY3JhbmRvbShzdHJ1Y3QgY3JuZHN0YXRlICpzdGF0ZSkKK3sKKwl1NjQgdmFsdWUsIHJobzsKKwl1bnNpZ25lZCBsb25nIGFuc3dlcjsKKworCWlmIChzdGF0ZS0+cmhvID09IDApCS8qIG5vIGNvcnJlbGxhdGlvbiAqLworCQlyZXR1cm4gbmV0X3JhbmRvbSgpOworCisJdmFsdWUgPSBuZXRfcmFuZG9tKCk7CisJcmhvID0gKHU2NClzdGF0ZS0+cmhvICsgMTsKKwlhbnN3ZXIgPSAodmFsdWUgKiAoKDF1bGw8PDMyKSAtIHJobykgKyBzdGF0ZS0+bGFzdCAqIHJobykgPj4gMzI7CisJc3RhdGUtPmxhc3QgPSBhbnN3ZXI7CisJcmV0dXJuIGFuc3dlcjsKK30KKworLyogdGFibGVkaXN0IC0gcmV0dXJuIGEgcHNldWRvLXJhbmRvbWx5IGRpc3RyaWJ1dGVkIHZhbHVlIHdpdGggbWVhbiBtdSBhbmQKKyAqIHN0ZCBkZXZpYXRpb24gc2lnbWEuICBVc2VzIHRhYmxlIGxvb2t1cCB0byBhcHByb3hpbWF0ZSB0aGUgZGVzaXJlZAorICogZGlzdHJpYnV0aW9uLCBhbmQgYSB1bmlmb3JtbHktZGlzdHJpYnV0ZWQgcHNldWRvLXJhbmRvbSBzb3VyY2UuCisgKi8KK3N0YXRpYyBsb25nIHRhYmxlZGlzdCh1bnNpZ25lZCBsb25nIG11LCBsb25nIHNpZ21hLCAKKwkJICAgICAgc3RydWN0IGNybmRzdGF0ZSAqc3RhdGUsIGNvbnN0IHN0cnVjdCBkaXN0dGFibGUgKmRpc3QpCit7CisJbG9uZyB0LCB4OworCXVuc2lnbmVkIGxvbmcgcm5kOworCisJaWYgKHNpZ21hID09IDApCisJCXJldHVybiBtdTsKKworCXJuZCA9IGdldF9jcmFuZG9tKHN0YXRlKTsKKworCS8qIGRlZmF1bHQgdW5pZm9ybSBkaXN0cmlidXRpb24gKi8KKwlpZiAoZGlzdCA9PSBOVUxMKSAKKwkJcmV0dXJuIChybmQgJSAoMipzaWdtYSkpIC0gc2lnbWEgKyBtdTsKKworCXQgPSBkaXN0LT50YWJsZVtybmQgJSBkaXN0LT5zaXplXTsKKwl4ID0gKHNpZ21hICUgTkVURU1fRElTVF9TQ0FMRSkgKiB0OworCWlmICh4ID49IDApCisJCXggKz0gTkVURU1fRElTVF9TQ0FMRS8yOworCWVsc2UKKwkJeCAtPSBORVRFTV9ESVNUX1NDQUxFLzI7CisKKwlyZXR1cm4gIHggLyBORVRFTV9ESVNUX1NDQUxFICsgKHNpZ21hIC8gTkVURU1fRElTVF9TQ0FMRSkgKiB0ICsgbXU7Cit9CisKKy8qIFB1dCBza2IgaW4gdGhlIHByaXZhdGUgZGVsYXllZCBxdWV1ZS4gKi8KK3N0YXRpYyBpbnQgZGVsYXlfc2tiKHN0cnVjdCBRZGlzYyAqc2NoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZXRlbV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCBuZXRlbV9za2JfY2IgKmNiID0gKHN0cnVjdCBuZXRlbV9za2JfY2IgKilza2ItPmNiOworCXBzY2hlZF90ZGlmZl90IHRkOworCXBzY2hlZF90aW1lX3Qgbm93OworCQorCVBTQ0hFRF9HRVRfVElNRShub3cpOworCXRkID0gdGFibGVkaXN0KHEtPmxhdGVuY3ksIHEtPmppdHRlciwgJnEtPmRlbGF5X2NvciwgcS0+ZGVsYXlfZGlzdCk7CisJUFNDSEVEX1RBREQyKG5vdywgdGQsIGNiLT50aW1lX3RvX3NlbmQpOworCQorCS8qIEFsd2F5cyBxdWV1ZSBhdCB0YWlsIHRvIGtlZXAgcGFja2V0cyBpbiBvcmRlciAqLworCWlmIChsaWtlbHkocS0+ZGVsYXllZC5xbGVuIDwgcS0+bGltaXQpKSB7CisJCV9fc2tiX3F1ZXVlX3RhaWwoJnEtPmRlbGF5ZWQsIHNrYik7CisJCWlmICghdGltZXJfcGVuZGluZygmcS0+dGltZXIpKSB7CisJCQlxLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIFBTQ0hFRF9VUzJKSUZGSUUodGQpOworCQkJYWRkX3RpbWVyKCZxLT50aW1lcik7CisJCX0KKwkJcmV0dXJuIE5FVF9YTUlUX1NVQ0NFU1M7CisJfQorCisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIE5FVF9YTUlUX0RST1A7Cit9CisKK3N0YXRpYyBpbnQgbmV0ZW1fZW5xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUWRpc2MgKnNjaCkKK3sKKwlzdHJ1Y3QgbmV0ZW1fc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKKwlpbnQgcmV0OworCisJcHJfZGVidWcoIm5ldGVtX2VucXVldWUgc2tiPSVwIEAlbHVcbiIsIHNrYiwgamlmZmllcyk7CisKKwkvKiBSYW5kb20gcGFja2V0IGRyb3AgMCA9PiBub25lLCB+MCA9PiBhbGwgKi8KKwlpZiAocS0+bG9zcyAmJiBxLT5sb3NzID49IGdldF9jcmFuZG9tKCZxLT5sb3NzX2NvcikpIHsKKwkJcHJfZGVidWcoIm5ldGVtX2VucXVldWU6IHJhbmRvbSBsb3NzXG4iKTsKKwkJc2NoLT5xc3RhdHMuZHJvcHMrKzsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOwkvKiBsaWUgYWJvdXQgbG9zcyBzbyBUQ1AgZG9lc24ndCBrbm93ICovCisJfQorCisJLyogUmFuZG9tIGR1cGxpY2F0aW9uICovCisJaWYgKHEtPmR1cGxpY2F0ZSAmJiBxLT5kdXBsaWNhdGUgPj0gZ2V0X2NyYW5kb20oJnEtPmR1cF9jb3IpCisJICAgICYmIChza2IyID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQykpICE9IE5VTEwpIHsKKwkJcHJfZGVidWcoIm5ldGVtX2VucXVldWU6IGR1cCAlcFxuIiwgc2tiMik7CisKKwkJaWYgKGRlbGF5X3NrYihzY2gsIHNrYjIpKSB7CisJCQlzY2gtPnEucWxlbisrOworCQkJc2NoLT5ic3RhdHMuYnl0ZXMgKz0gc2tiMi0+bGVuOworCQkJc2NoLT5ic3RhdHMucGFja2V0cysrOworCQl9IGVsc2UKKwkJCXNjaC0+cXN0YXRzLmRyb3BzKys7CisJfQorCisJLyogSWYgZG9pbmcgc2ltcGxlIGRlbGF5IHRoZW4gZ2FwID09IDAgc28gYWxsIHBhY2tldHMKKwkgKiBnbyBpbnRvIHRoZSBkZWxheWVkIGhvbGRpbmcgcXVldWUKKwkgKiBvdGhlcndpc2UgaWYgZG9pbmcgb3V0IG9mIG9yZGVyIG9ubHkgIjEgb3V0IG9mIGdhcCIKKwkgKiBwYWNrZXRzIHdpbGwgYmUgZGVsYXllZC4KKwkgKi8KKwlpZiAocS0+Y291bnRlciA8IHEtPmdhcCkgeworCQkrK3EtPmNvdW50ZXI7CisJCXJldCA9IHEtPnFkaXNjLT5lbnF1ZXVlKHNrYiwgcS0+cWRpc2MpOworCX0gZWxzZSB7CisJCXEtPmNvdW50ZXIgPSAwOworCQlyZXQgPSBkZWxheV9za2Ioc2NoLCBza2IpOworCX0KKworCWlmIChsaWtlbHkocmV0ID09IE5FVF9YTUlUX1NVQ0NFU1MpKSB7CisJCXNjaC0+cS5xbGVuKys7CisJCXNjaC0+YnN0YXRzLmJ5dGVzICs9IHNrYi0+bGVuOworCQlzY2gtPmJzdGF0cy5wYWNrZXRzKys7CisJfSBlbHNlCisJCXNjaC0+cXN0YXRzLmRyb3BzKys7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBSZXF1ZXVlIHBhY2tldHMgYnV0IGRvbid0IGNoYW5nZSB0aW1lIHN0YW1wICovCitzdGF0aWMgaW50IG5ldGVtX3JlcXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjICpzY2gpCit7CisJc3RydWN0IG5ldGVtX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJaW50IHJldDsKKworCWlmICgocmV0ID0gcS0+cWRpc2MtPm9wcy0+cmVxdWV1ZShza2IsIHEtPnFkaXNjKSkgPT0gMCkgeworCQlzY2gtPnEucWxlbisrOworCQlzY2gtPnFzdGF0cy5yZXF1ZXVlcysrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmV0ZW1fZHJvcChzdHJ1Y3QgUWRpc2MqIHNjaCkKK3sKKwlzdHJ1Y3QgbmV0ZW1fc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJaWYgKChsZW4gPSBxLT5xZGlzYy0+b3BzLT5kcm9wKHEtPnFkaXNjKSkgIT0gMCkgeworCQlzY2gtPnEucWxlbi0tOworCQlzY2gtPnFzdGF0cy5kcm9wcysrOworCX0KKwlyZXR1cm4gbGVuOworfQorCisvKiBEZXF1ZXVlIHBhY2tldC4KKyAqICBNb3ZlIGFsbCBwYWNrZXRzIHRoYXQgYXJlIHJlYWR5IHRvIHNlbmQgZnJvbSB0aGUgZGVsYXkgaG9sZGluZworICogIGxpc3QgdG8gdGhlIHVuZGVybHlpbmcgcWRpc2MsIHRoZW4ganVzdCBjYWxsIGRlcXVldWUKKyAqLworc3RhdGljIHN0cnVjdCBza19idWZmICpuZXRlbV9kZXF1ZXVlKHN0cnVjdCBRZGlzYyAqc2NoKQoreworCXN0cnVjdCBuZXRlbV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBxLT5xZGlzYy0+ZGVxdWV1ZShxLT5xZGlzYyk7CisJaWYgKHNrYikgCisJCXNjaC0+cS5xbGVuLS07CisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIHZvaWQgbmV0ZW1fd2F0Y2hkb2codW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IFFkaXNjICpzY2ggPSAoc3RydWN0IFFkaXNjICopYXJnOworCXN0cnVjdCBuZXRlbV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzY2gtPmRldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXBzY2hlZF90aW1lX3Qgbm93OworCisJcHJfZGVidWcoIm5ldGVtX3dhdGNoZG9nOiBmaXJlZCBAJWx1XG4iLCBqaWZmaWVzKTsKKworCXNwaW5fbG9ja19iaCgmZGV2LT5xdWV1ZV9sb2NrKTsKKwlQU0NIRURfR0VUX1RJTUUobm93KTsKKworCXdoaWxlICgoc2tiID0gc2tiX3BlZWsoJnEtPmRlbGF5ZWQpKSAhPSBOVUxMKSB7CisJCWNvbnN0IHN0cnVjdCBuZXRlbV9za2JfY2IgKmNiCisJCQk9IChjb25zdCBzdHJ1Y3QgbmV0ZW1fc2tiX2NiICopc2tiLT5jYjsKKwkJbG9uZyBkZWxheSAKKwkJCT0gUFNDSEVEX1VTMkpJRkZJRShQU0NIRURfVERJRkYoY2ItPnRpbWVfdG9fc2VuZCwgbm93KSk7CisJCXByX2RlYnVnKCJuZXRlbV93YXRjaGRvZzogc2tiICVwQCVsdSAlbGRcbiIsCisJCQkgc2tiLCBqaWZmaWVzLCBkZWxheSk7CisKKwkJLyogaWYgbW9yZSB0aW1lIHJlbWFpbmluZz8gKi8KKwkJaWYgKGRlbGF5ID4gMCkgeworCQkJbW9kX3RpbWVyKCZxLT50aW1lciwgamlmZmllcyArIGRlbGF5KTsKKwkJCWJyZWFrOworCQl9CisJCV9fc2tiX3VubGluayhza2IsICZxLT5kZWxheWVkKTsKKworCQlpZiAocS0+cWRpc2MtPmVucXVldWUoc2tiLCBxLT5xZGlzYykpIHsKKwkJCXNjaC0+cS5xbGVuLS07CisJCQlzY2gtPnFzdGF0cy5kcm9wcysrOworCQl9CisJfQorCXFkaXNjX3J1bihkZXYpOworCXNwaW5fdW5sb2NrX2JoKCZkZXYtPnF1ZXVlX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBuZXRlbV9yZXNldChzdHJ1Y3QgUWRpc2MgKnNjaCkKK3sKKwlzdHJ1Y3QgbmV0ZW1fc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKworCXFkaXNjX3Jlc2V0KHEtPnFkaXNjKTsKKwlza2JfcXVldWVfcHVyZ2UoJnEtPmRlbGF5ZWQpOworCisJc2NoLT5xLnFsZW4gPSAwOworCWRlbF90aW1lcl9zeW5jKCZxLT50aW1lcik7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2ZpZm9fbGltaXQoc3RydWN0IFFkaXNjICpxLCBpbnQgbGltaXQpCit7CisgICAgICAgIHN0cnVjdCBydGF0dHIgKnJ0YTsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKworCXJ0YSA9IGttYWxsb2MoUlRBX0xFTkdUSChzaXplb2Yoc3RydWN0IHRjX2ZpZm9fcW9wdCkpLCBHRlBfS0VSTkVMKTsKKwlpZiAocnRhKSB7CisJCXJ0YS0+cnRhX3R5cGUgPSBSVE1fTkVXUURJU0M7CisJCXJ0YS0+cnRhX2xlbiA9IFJUQV9MRU5HVEgoc2l6ZW9mKHN0cnVjdCB0Y19maWZvX3FvcHQpKTsgCisJCSgoc3RydWN0IHRjX2ZpZm9fcW9wdCAqKVJUQV9EQVRBKHJ0YSkpLT5saW1pdCA9IGxpbWl0OworCQkKKwkJcmV0ID0gcS0+b3BzLT5jaGFuZ2UocSwgcnRhKTsKKwkJa2ZyZWUocnRhKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIERpc3RyaWJ1dGlvbiBkYXRhIGlzIGEgdmFyaWFibGUgc2l6ZSBwYXlsb2FkIGNvbnRhaW5pbmcKKyAqIHNpZ25lZCAxNiBiaXQgdmFsdWVzLgorICovCitzdGF0aWMgaW50IGdldF9kaXN0X3RhYmxlKHN0cnVjdCBRZGlzYyAqc2NoLCBjb25zdCBzdHJ1Y3QgcnRhdHRyICphdHRyKQoreworCXN0cnVjdCBuZXRlbV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXVuc2lnbmVkIGxvbmcgbiA9IFJUQV9QQVlMT0FEKGF0dHIpL3NpemVvZihfX3MxNik7CisJY29uc3QgX19zMTYgKmRhdGEgPSBSVEFfREFUQShhdHRyKTsKKwlzdHJ1Y3QgZGlzdHRhYmxlICpkOworCWludCBpOworCisJaWYgKG4gPiA2NTUzNikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkID0ga21hbGxvYyhzaXplb2YoKmQpICsgbipzaXplb2YoZC0+dGFibGVbMF0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWQpCisJCXJldHVybiAtRU5PTUVNOworCisJZC0+c2l6ZSA9IG47CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJZC0+dGFibGVbaV0gPSBkYXRhW2ldOworCQorCXNwaW5fbG9ja19iaCgmc2NoLT5kZXYtPnF1ZXVlX2xvY2spOworCWQgPSB4Y2hnKCZxLT5kZWxheV9kaXN0LCBkKTsKKwlzcGluX3VubG9ja19iaCgmc2NoLT5kZXYtPnF1ZXVlX2xvY2spOworCisJa2ZyZWUoZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2NvcnJlbGF0aW9uKHN0cnVjdCBRZGlzYyAqc2NoLCBjb25zdCBzdHJ1Y3QgcnRhdHRyICphdHRyKQoreworCXN0cnVjdCBuZXRlbV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCWNvbnN0IHN0cnVjdCB0Y19uZXRlbV9jb3JyICpjID0gUlRBX0RBVEEoYXR0cik7CisKKwlpZiAoUlRBX1BBWUxPQUQoYXR0cikgIT0gc2l6ZW9mKCpjKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpbml0X2NyYW5kb20oJnEtPmRlbGF5X2NvciwgYy0+ZGVsYXlfY29ycik7CisJaW5pdF9jcmFuZG9tKCZxLT5sb3NzX2NvciwgYy0+bG9zc19jb3JyKTsKKwlpbml0X2NyYW5kb20oJnEtPmR1cF9jb3IsIGMtPmR1cF9jb3JyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXRlbV9jaGFuZ2Uoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBydGF0dHIgKm9wdCkKK3sKKwlzdHJ1Y3QgbmV0ZW1fc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlzdHJ1Y3QgdGNfbmV0ZW1fcW9wdCAqcW9wdDsKKwlpbnQgcmV0OworCQorCWlmIChvcHQgPT0gTlVMTCB8fCBSVEFfUEFZTE9BRChvcHQpIDwgc2l6ZW9mKCpxb3B0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlxb3B0ID0gUlRBX0RBVEEob3B0KTsKKwlyZXQgPSBzZXRfZmlmb19saW1pdChxLT5xZGlzYywgcW9wdC0+bGltaXQpOworCWlmIChyZXQpIHsKKwkJcHJfZGVidWcoIm5ldGVtOiBjYW4ndCBzZXQgZmlmbyBsaW1pdFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCQorCXEtPmxhdGVuY3kgPSBxb3B0LT5sYXRlbmN5OworCXEtPmppdHRlciA9IHFvcHQtPmppdHRlcjsKKwlxLT5saW1pdCA9IHFvcHQtPmxpbWl0OworCXEtPmdhcCA9IHFvcHQtPmdhcDsKKwlxLT5sb3NzID0gcW9wdC0+bG9zczsKKwlxLT5kdXBsaWNhdGUgPSBxb3B0LT5kdXBsaWNhdGU7CisKKwkvKiBIYW5kbGUgbmVzdGVkIG9wdGlvbnMgYWZ0ZXIgaW5pdGlhbCBxdWV1ZSBvcHRpb25zLgorCSAqIFNob3VsZCBoYXZlIHB1dCBhbGwgb3B0aW9ucyBpbiBuZXN0ZWQgZm9ybWF0IGJ1dCB0b28gbGF0ZSBub3cuCisJICovIAorCWlmIChSVEFfUEFZTE9BRChvcHQpID4gc2l6ZW9mKCpxb3B0KSkgeworCQlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfTkVURU1fTUFYXTsKKwkJaWYgKHJ0YXR0cl9wYXJzZSh0YiwgVENBX05FVEVNX01BWCwgCisJCQkJIFJUQV9EQVRBKG9wdCkgKyBzaXplb2YoKnFvcHQpLAorCQkJCSBSVEFfUEFZTE9BRChvcHQpIC0gc2l6ZW9mKCpxb3B0KSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAodGJbVENBX05FVEVNX0NPUlItMV0pIHsKKwkJCXJldCA9IGdldF9jb3JyZWxhdGlvbihzY2gsIHRiW1RDQV9ORVRFTV9DT1JSLTFdKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWlmICh0YltUQ0FfTkVURU1fREVMQVlfRElTVC0xXSkgeworCQkJcmV0ID0gZ2V0X2Rpc3RfdGFibGUoc2NoLCB0YltUQ0FfTkVURU1fREVMQVlfRElTVC0xXSk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5ldGVtX2luaXQoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBydGF0dHIgKm9wdCkKK3sKKwlzdHJ1Y3QgbmV0ZW1fc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlpbnQgcmV0OworCisJaWYgKCFvcHQpCisJCXJldHVybiAtRUlOVkFMOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcS0+ZGVsYXllZCk7CisJaW5pdF90aW1lcigmcS0+dGltZXIpOworCXEtPnRpbWVyLmZ1bmN0aW9uID0gbmV0ZW1fd2F0Y2hkb2c7CisJcS0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBzY2g7CisJcS0+Y291bnRlciA9IDA7CisKKwlxLT5xZGlzYyA9IHFkaXNjX2NyZWF0ZV9kZmx0KHNjaC0+ZGV2LCAmcGZpZm9fcWRpc2Nfb3BzKTsKKwlpZiAoIXEtPnFkaXNjKSB7CisJCXByX2RlYnVnKCJuZXRlbTogcWRpc2MgY3JlYXRlIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldCA9IG5ldGVtX2NoYW5nZShzY2gsIG9wdCk7CisJaWYgKHJldCkgeworCQlwcl9kZWJ1ZygibmV0ZW06IGNoYW5nZSBmYWlsZWRcbiIpOworCQlxZGlzY19kZXN0cm95KHEtPnFkaXNjKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbmV0ZW1fZGVzdHJveShzdHJ1Y3QgUWRpc2MgKnNjaCkKK3sKKwlzdHJ1Y3QgbmV0ZW1fc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKworCWRlbF90aW1lcl9zeW5jKCZxLT50aW1lcik7CisJcWRpc2NfZGVzdHJveShxLT5xZGlzYyk7CisJa2ZyZWUocS0+ZGVsYXlfZGlzdCk7Cit9CisKK3N0YXRpYyBpbnQgbmV0ZW1fZHVtcChzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwljb25zdCBzdHJ1Y3QgbmV0ZW1fc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3QgcnRhdHRyICpydGEgPSAoc3RydWN0IHJ0YXR0ciAqKSBiOworCXN0cnVjdCB0Y19uZXRlbV9xb3B0IHFvcHQ7CisJc3RydWN0IHRjX25ldGVtX2NvcnIgY29yOworCisJcW9wdC5sYXRlbmN5ID0gcS0+bGF0ZW5jeTsKKwlxb3B0LmppdHRlciA9IHEtPmppdHRlcjsKKwlxb3B0LmxpbWl0ID0gcS0+bGltaXQ7CisJcW9wdC5sb3NzID0gcS0+bG9zczsKKwlxb3B0LmdhcCA9IHEtPmdhcDsKKwlxb3B0LmR1cGxpY2F0ZSA9IHEtPmR1cGxpY2F0ZTsKKwlSVEFfUFVUKHNrYiwgVENBX09QVElPTlMsIHNpemVvZihxb3B0KSwgJnFvcHQpOworCisJY29yLmRlbGF5X2NvcnIgPSBxLT5kZWxheV9jb3IucmhvOworCWNvci5sb3NzX2NvcnIgPSBxLT5sb3NzX2Nvci5yaG87CisJY29yLmR1cF9jb3JyID0gcS0+ZHVwX2Nvci5yaG87CisJUlRBX1BVVChza2IsIFRDQV9ORVRFTV9DT1JSLCBzaXplb2YoY29yKSwgJmNvcik7CisJcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gYjsKKworCXJldHVybiBza2ItPmxlbjsKKworcnRhdHRyX2ZhaWx1cmU6CisJc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgbmV0ZW1fZHVtcF9jbGFzcyhzdHJ1Y3QgUWRpc2MgKnNjaCwgdW5zaWduZWQgbG9uZyBjbCwKKwkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjbXNnICp0Y20pCit7CisJc3RydWN0IG5ldGVtX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisKKwlpZiAoY2wgIT0gMSkgCS8qIG9ubHkgb25lIGNsYXNzICovCisJCXJldHVybiAtRU5PRU5UOworCisJdGNtLT50Y21faGFuZGxlIHw9IFRDX0hfTUlOKDEpOworCXRjbS0+dGNtX2luZm8gPSBxLT5xZGlzYy0+aGFuZGxlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmV0ZW1fZ3JhZnQoc3RydWN0IFFkaXNjICpzY2gsIHVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgUWRpc2MgKm5ldywKKwkJICAgICBzdHJ1Y3QgUWRpc2MgKipvbGQpCit7CisJc3RydWN0IG5ldGVtX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisKKwlpZiAobmV3ID09IE5VTEwpCisJCW5ldyA9ICZub29wX3FkaXNjOworCisJc2NoX3RyZWVfbG9jayhzY2gpOworCSpvbGQgPSB4Y2hnKCZxLT5xZGlzYywgbmV3KTsKKwlxZGlzY19yZXNldCgqb2xkKTsKKwlzY2gtPnEucWxlbiA9IDA7CisJc2NoX3RyZWVfdW5sb2NrKHNjaCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBRZGlzYyAqbmV0ZW1fbGVhZihzdHJ1Y3QgUWRpc2MgKnNjaCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG5ldGVtX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJcmV0dXJuIHEtPnFkaXNjOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBuZXRlbV9nZXQoc3RydWN0IFFkaXNjICpzY2gsIHUzMiBjbGFzc2lkKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBuZXRlbV9wdXQoc3RydWN0IFFkaXNjICpzY2gsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworfQorCitzdGF0aWMgaW50IG5ldGVtX2NoYW5nZV9jbGFzcyhzdHJ1Y3QgUWRpc2MgKnNjaCwgdTMyIGNsYXNzaWQsIHUzMiBwYXJlbnRpZCwgCisJCQkgICAgc3RydWN0IHJ0YXR0ciAqKnRjYSwgdW5zaWduZWQgbG9uZyAqYXJnKQoreworCXJldHVybiAtRU5PU1lTOworfQorCitzdGF0aWMgaW50IG5ldGVtX2RlbGV0ZShzdHJ1Y3QgUWRpc2MgKnNjaCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGVtX3dhbGsoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBxZGlzY193YWxrZXIgKndhbGtlcikKK3sKKwlpZiAoIXdhbGtlci0+c3RvcCkgeworCQlpZiAod2Fsa2VyLT5jb3VudCA+PSB3YWxrZXItPnNraXApCisJCQlpZiAod2Fsa2VyLT5mbihzY2gsIDEsIHdhbGtlcikgPCAwKSB7CisJCQkJd2Fsa2VyLT5zdG9wID0gMTsKKwkJCQlyZXR1cm47CisJCQl9CisJCXdhbGtlci0+Y291bnQrKzsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGNmX3Byb3RvICoqbmV0ZW1fZmluZF90Y2Yoc3RydWN0IFFkaXNjICpzY2gsIHVuc2lnbmVkIGxvbmcgY2wpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgUWRpc2NfY2xhc3Nfb3BzIG5ldGVtX2NsYXNzX29wcyA9IHsKKwkuZ3JhZnQJCT0JbmV0ZW1fZ3JhZnQsCisJLmxlYWYJCT0JbmV0ZW1fbGVhZiwKKwkuZ2V0CQk9CW5ldGVtX2dldCwKKwkucHV0CQk9CW5ldGVtX3B1dCwKKwkuY2hhbmdlCQk9CW5ldGVtX2NoYW5nZV9jbGFzcywKKwkuZGVsZXRlCQk9CW5ldGVtX2RlbGV0ZSwKKwkud2FsawkJPQluZXRlbV93YWxrLAorCS50Y2ZfY2hhaW4JPQluZXRlbV9maW5kX3RjZiwKKwkuZHVtcAkJPQluZXRlbV9kdW1wX2NsYXNzLAorfTsKKworc3RhdGljIHN0cnVjdCBRZGlzY19vcHMgbmV0ZW1fcWRpc2Nfb3BzID0geworCS5pZAkJPQkibmV0ZW0iLAorCS5jbF9vcHMJCT0JJm5ldGVtX2NsYXNzX29wcywKKwkucHJpdl9zaXplCT0Jc2l6ZW9mKHN0cnVjdCBuZXRlbV9zY2hlZF9kYXRhKSwKKwkuZW5xdWV1ZQk9CW5ldGVtX2VucXVldWUsCisJLmRlcXVldWUJPQluZXRlbV9kZXF1ZXVlLAorCS5yZXF1ZXVlCT0JbmV0ZW1fcmVxdWV1ZSwKKwkuZHJvcAkJPQluZXRlbV9kcm9wLAorCS5pbml0CQk9CW5ldGVtX2luaXQsCisJLnJlc2V0CQk9CW5ldGVtX3Jlc2V0LAorCS5kZXN0cm95CT0JbmV0ZW1fZGVzdHJveSwKKwkuY2hhbmdlCQk9CW5ldGVtX2NoYW5nZSwKKwkuZHVtcAkJPQluZXRlbV9kdW1wLAorCS5vd25lcgkJPQlUSElTX01PRFVMRSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgbmV0ZW1fbW9kdWxlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfcWRpc2MoJm5ldGVtX3FkaXNjX29wcyk7Cit9CitzdGF0aWMgdm9pZCBfX2V4aXQgbmV0ZW1fbW9kdWxlX2V4aXQodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX3FkaXNjKCZuZXRlbV9xZGlzY19vcHMpOworfQorbW9kdWxlX2luaXQobmV0ZW1fbW9kdWxlX2luaXQpCittb2R1bGVfZXhpdChuZXRlbV9tb2R1bGVfZXhpdCkKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfcHJpby5jIGIvbmV0L3NjaGVkL3NjaF9wcmlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjMGY0OQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY2hlZC9zY2hfcHJpby5jCkBAIC0wLDAgKzEsNDQ0IEBACisvKgorICogbmV0L3NjaGVkL3NjaF9wcmlvLmMJU2ltcGxlIDMtYmFuZCBwcmlvcml0eSAic2NoZWR1bGVyIi4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKiBGaXhlczogICAgICAgMTk5OTA2MDk6IEogSGFkaSBTYWxpbSA8aGFkaUBub3J0ZWxuZXR3b3Jrcy5jb20+OiAKKyAqICAgICAgICAgICAgICBJbml0IC0tICBFSU5WQUwgd2hlbiBvcHQgdW5kZWZpbmVkCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgorCisKK3N0cnVjdCBwcmlvX3NjaGVkX2RhdGEKK3sKKwlpbnQgYmFuZHM7CisJc3RydWN0IHRjZl9wcm90byAqZmlsdGVyX2xpc3Q7CisJdTggIHByaW8yYmFuZFtUQ19QUklPX01BWCsxXTsKKwlzdHJ1Y3QgUWRpc2MgKnF1ZXVlc1tUQ1FfUFJJT19CQU5EU107Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgUWRpc2MgKgorcHJpb19jbGFzc2lmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUWRpc2MgKnNjaCwgaW50ICpxZXJyKQoreworCXN0cnVjdCBwcmlvX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJdTMyIGJhbmQgPSBza2ItPnByaW9yaXR5OworCXN0cnVjdCB0Y2ZfcmVzdWx0IHJlczsKKworCSpxZXJyID0gTkVUX1hNSVRfRFJPUDsKKwlpZiAoVENfSF9NQUooc2tiLT5wcmlvcml0eSkgIT0gc2NoLT5oYW5kbGUpIHsKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKKwkJc3dpdGNoICh0Y19jbGFzc2lmeShza2IsIHEtPmZpbHRlcl9saXN0LCAmcmVzKSkgeworCQljYXNlIFRDX0FDVF9TVE9MRU46CisJCWNhc2UgVENfQUNUX1FVRVVFRDoKKwkJCSpxZXJyID0gTkVUX1hNSVRfU1VDQ0VTUzsKKwkJY2FzZSBUQ19BQ1RfU0hPVDoKKwkJCXJldHVybiBOVUxMOworCQl9OworCisJCWlmICghcS0+ZmlsdGVyX2xpc3QgKSB7CisjZWxzZQorCQlpZiAoIXEtPmZpbHRlcl9saXN0IHx8IHRjX2NsYXNzaWZ5KHNrYiwgcS0+ZmlsdGVyX2xpc3QsICZyZXMpKSB7CisjZW5kaWYKKwkJCWlmIChUQ19IX01BSihiYW5kKSkKKwkJCQliYW5kID0gMDsKKwkJCXJldHVybiBxLT5xdWV1ZXNbcS0+cHJpbzJiYW5kW2JhbmQmVENfUFJJT19NQVhdXTsKKwkJfQorCQliYW5kID0gcmVzLmNsYXNzaWQ7CisJfQorCWJhbmQgPSBUQ19IX01JTihiYW5kKSAtIDE7CisJaWYgKGJhbmQgPiBxLT5iYW5kcykKKwkJcmV0dXJuIHEtPnF1ZXVlc1txLT5wcmlvMmJhbmRbMF1dOworCisJcmV0dXJuIHEtPnF1ZXVlc1tiYW5kXTsKK30KKworc3RhdGljIGludAorcHJpb19lbnF1ZXVlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBRZGlzYyAqc2NoKQoreworCXN0cnVjdCBRZGlzYyAqcWRpc2M7CisJaW50IHJldDsKKworCXFkaXNjID0gcHJpb19jbGFzc2lmeShza2IsIHNjaCwgJnJldCk7CisjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCisJaWYgKHFkaXNjID09IE5VTEwpIHsKKwkJaWYgKHJldCA9PSBORVRfWE1JVF9EUk9QKQorCQkJc2NoLT5xc3RhdHMuZHJvcHMrKzsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiByZXQ7CisJfQorI2VuZGlmCisKKwlpZiAoKHJldCA9IHFkaXNjLT5lbnF1ZXVlKHNrYiwgcWRpc2MpKSA9PSBORVRfWE1JVF9TVUNDRVNTKSB7CisJCXNjaC0+YnN0YXRzLmJ5dGVzICs9IHNrYi0+bGVuOworCQlzY2gtPmJzdGF0cy5wYWNrZXRzKys7CisJCXNjaC0+cS5xbGVuKys7CisJCXJldHVybiBORVRfWE1JVF9TVUNDRVNTOworCX0KKwlzY2gtPnFzdGF0cy5kcm9wcysrOworCXJldHVybiByZXQ7IAorfQorCisKK3N0YXRpYyBpbnQKK3ByaW9fcmVxdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUWRpc2MqIHNjaCkKK3sKKwlzdHJ1Y3QgUWRpc2MgKnFkaXNjOworCWludCByZXQ7CisKKwlxZGlzYyA9IHByaW9fY2xhc3NpZnkoc2tiLCBzY2gsICZyZXQpOworI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAorCWlmIChxZGlzYyA9PSBOVUxMKSB7CisJCWlmIChyZXQgPT0gTkVUX1hNSVRfRFJPUCkKKwkJCXNjaC0+cXN0YXRzLmRyb3BzKys7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gcmV0OworCX0KKyNlbmRpZgorCisJaWYgKChyZXQgPSBxZGlzYy0+b3BzLT5yZXF1ZXVlKHNrYiwgcWRpc2MpKSA9PSBORVRfWE1JVF9TVUNDRVNTKSB7CisJCXNjaC0+cS5xbGVuKys7CisJCXNjaC0+cXN0YXRzLnJlcXVldWVzKys7CisJCXJldHVybiAwOworCX0KKwlzY2gtPnFzdGF0cy5kcm9wcysrOworCXJldHVybiBORVRfWE1JVF9EUk9QOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCitwcmlvX2RlcXVldWUoc3RydWN0IFFkaXNjKiBzY2gpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgcHJpb19zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCWludCBwcmlvOworCXN0cnVjdCBRZGlzYyAqcWRpc2M7CisKKwlmb3IgKHByaW8gPSAwOyBwcmlvIDwgcS0+YmFuZHM7IHByaW8rKykgeworCQlxZGlzYyA9IHEtPnF1ZXVlc1twcmlvXTsKKwkJc2tiID0gcWRpc2MtPmRlcXVldWUocWRpc2MpOworCQlpZiAoc2tiKSB7CisJCQlzY2gtPnEucWxlbi0tOworCQkJcmV0dXJuIHNrYjsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKKworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHByaW9fZHJvcChzdHJ1Y3QgUWRpc2MqIHNjaCkKK3sKKwlzdHJ1Y3QgcHJpb19zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCWludCBwcmlvOworCXVuc2lnbmVkIGludCBsZW47CisJc3RydWN0IFFkaXNjICpxZGlzYzsKKworCWZvciAocHJpbyA9IHEtPmJhbmRzLTE7IHByaW8gPj0gMDsgcHJpby0tKSB7CisJCXFkaXNjID0gcS0+cXVldWVzW3ByaW9dOworCQlpZiAoKGxlbiA9IHFkaXNjLT5vcHMtPmRyb3AocWRpc2MpKSAhPSAwKSB7CisJCQlzY2gtPnEucWxlbi0tOworCQkJcmV0dXJuIGxlbjsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZAorcHJpb19yZXNldChzdHJ1Y3QgUWRpc2MqIHNjaCkKK3sKKwlpbnQgcHJpbzsKKwlzdHJ1Y3QgcHJpb19zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCisJZm9yIChwcmlvPTA7IHByaW88cS0+YmFuZHM7IHByaW8rKykKKwkJcWRpc2NfcmVzZXQocS0+cXVldWVzW3ByaW9dKTsKKwlzY2gtPnEucWxlbiA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitwcmlvX2Rlc3Ryb3koc3RydWN0IFFkaXNjKiBzY2gpCit7CisJaW50IHByaW87CisJc3RydWN0IHByaW9fc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlzdHJ1Y3QgdGNmX3Byb3RvICp0cDsKKworCXdoaWxlICgodHAgPSBxLT5maWx0ZXJfbGlzdCkgIT0gTlVMTCkgeworCQlxLT5maWx0ZXJfbGlzdCA9IHRwLT5uZXh0OworCQl0Y2ZfZGVzdHJveSh0cCk7CisJfQorCisJZm9yIChwcmlvPTA7IHByaW88cS0+YmFuZHM7IHByaW8rKykKKwkJcWRpc2NfZGVzdHJveShxLT5xdWV1ZXNbcHJpb10pOworfQorCitzdGF0aWMgaW50IHByaW9fdHVuZShzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IHJ0YXR0ciAqb3B0KQoreworCXN0cnVjdCBwcmlvX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJc3RydWN0IHRjX3ByaW9fcW9wdCAqcW9wdCA9IFJUQV9EQVRBKG9wdCk7CisJaW50IGk7CisKKwlpZiAob3B0LT5ydGFfbGVuIDwgUlRBX0xFTkdUSChzaXplb2YoKnFvcHQpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHFvcHQtPmJhbmRzID4gVENRX1BSSU9fQkFORFMgfHwgcW9wdC0+YmFuZHMgPCAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaT0wOyBpPD1UQ19QUklPX01BWDsgaSsrKSB7CisJCWlmIChxb3B0LT5wcmlvbWFwW2ldID49IHFvcHQtPmJhbmRzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2NoX3RyZWVfbG9jayhzY2gpOworCXEtPmJhbmRzID0gcW9wdC0+YmFuZHM7CisJbWVtY3B5KHEtPnByaW8yYmFuZCwgcW9wdC0+cHJpb21hcCwgVENfUFJJT19NQVgrMSk7CisKKwlmb3IgKGk9cS0+YmFuZHM7IGk8VENRX1BSSU9fQkFORFM7IGkrKykgeworCQlzdHJ1Y3QgUWRpc2MgKmNoaWxkID0geGNoZygmcS0+cXVldWVzW2ldLCAmbm9vcF9xZGlzYyk7CisJCWlmIChjaGlsZCAhPSAmbm9vcF9xZGlzYykKKwkJCXFkaXNjX2Rlc3Ryb3koY2hpbGQpOworCX0KKwlzY2hfdHJlZV91bmxvY2soc2NoKTsKKworCWZvciAoaT0wOyBpPD1UQ19QUklPX01BWDsgaSsrKSB7CisJCWludCBiYW5kID0gcS0+cHJpbzJiYW5kW2ldOworCQlpZiAocS0+cXVldWVzW2JhbmRdID09ICZub29wX3FkaXNjKSB7CisJCQlzdHJ1Y3QgUWRpc2MgKmNoaWxkOworCQkJY2hpbGQgPSBxZGlzY19jcmVhdGVfZGZsdChzY2gtPmRldiwgJnBmaWZvX3FkaXNjX29wcyk7CisJCQlpZiAoY2hpbGQpIHsKKwkJCQlzY2hfdHJlZV9sb2NrKHNjaCk7CisJCQkJY2hpbGQgPSB4Y2hnKCZxLT5xdWV1ZXNbYmFuZF0sIGNoaWxkKTsKKworCQkJCWlmIChjaGlsZCAhPSAmbm9vcF9xZGlzYykKKwkJCQkJcWRpc2NfZGVzdHJveShjaGlsZCk7CisJCQkJc2NoX3RyZWVfdW5sb2NrKHNjaCk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJpb19pbml0KHN0cnVjdCBRZGlzYyAqc2NoLCBzdHJ1Y3QgcnRhdHRyICpvcHQpCit7CisJc3RydWN0IHByaW9fc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpPFRDUV9QUklPX0JBTkRTOyBpKyspCisJCXEtPnF1ZXVlc1tpXSA9ICZub29wX3FkaXNjOworCisJaWYgKG9wdCA9PSBOVUxMKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCWludCBlcnI7CisKKwkJaWYgKChlcnI9IHByaW9fdHVuZShzY2gsIG9wdCkpICE9IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmlvX2R1bXAoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHByaW9fc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3QgdGNfcHJpb19xb3B0IG9wdDsKKworCW9wdC5iYW5kcyA9IHEtPmJhbmRzOworCW1lbWNweSgmb3B0LnByaW9tYXAsIHEtPnByaW8yYmFuZCwgVENfUFJJT19NQVgrMSk7CisJUlRBX1BVVChza2IsIFRDQV9PUFRJT05TLCBzaXplb2Yob3B0KSwgJm9wdCk7CisJcmV0dXJuIHNrYi0+bGVuOworCitydGF0dHJfZmFpbHVyZToKKwlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBwcmlvX2dyYWZ0KHN0cnVjdCBRZGlzYyAqc2NoLCB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IFFkaXNjICpuZXcsCisJCSAgICAgIHN0cnVjdCBRZGlzYyAqKm9sZCkKK3sKKwlzdHJ1Y3QgcHJpb19zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXVuc2lnbmVkIGxvbmcgYmFuZCA9IGFyZyAtIDE7CisKKwlpZiAoYmFuZCA+PSBxLT5iYW5kcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobmV3ID09IE5VTEwpCisJCW5ldyA9ICZub29wX3FkaXNjOworCisJc2NoX3RyZWVfbG9jayhzY2gpOworCSpvbGQgPSBxLT5xdWV1ZXNbYmFuZF07CisJcS0+cXVldWVzW2JhbmRdID0gbmV3OworCXNjaC0+cS5xbGVuIC09ICgqb2xkKS0+cS5xbGVuOworCXFkaXNjX3Jlc2V0KCpvbGQpOworCXNjaF90cmVlX3VubG9jayhzY2gpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgUWRpc2MgKgorcHJpb19sZWFmKHN0cnVjdCBRZGlzYyAqc2NoLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcHJpb19zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXVuc2lnbmVkIGxvbmcgYmFuZCA9IGFyZyAtIDE7CisKKwlpZiAoYmFuZCA+PSBxLT5iYW5kcykKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gcS0+cXVldWVzW2JhbmRdOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwcmlvX2dldChzdHJ1Y3QgUWRpc2MgKnNjaCwgdTMyIGNsYXNzaWQpCit7CisJc3RydWN0IHByaW9fc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwl1bnNpZ25lZCBsb25nIGJhbmQgPSBUQ19IX01JTihjbGFzc2lkKTsKKworCWlmIChiYW5kIC0gMSA+PSBxLT5iYW5kcykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGJhbmQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHByaW9fYmluZChzdHJ1Y3QgUWRpc2MgKnNjaCwgdW5zaWduZWQgbG9uZyBwYXJlbnQsIHUzMiBjbGFzc2lkKQoreworCXJldHVybiBwcmlvX2dldChzY2gsIGNsYXNzaWQpOworfQorCisKK3N0YXRpYyB2b2lkIHByaW9fcHV0KHN0cnVjdCBRZGlzYyAqcSwgdW5zaWduZWQgbG9uZyBjbCkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgcHJpb19jaGFuZ2Uoc3RydWN0IFFkaXNjICpzY2gsIHUzMiBoYW5kbGUsIHUzMiBwYXJlbnQsIHN0cnVjdCBydGF0dHIgKip0Y2EsIHVuc2lnbmVkIGxvbmcgKmFyZykKK3sKKwl1bnNpZ25lZCBsb25nIGNsID0gKmFyZzsKKwlzdHJ1Y3QgcHJpb19zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCisJaWYgKGNsIC0gMSA+IHEtPmJhbmRzKQorCQlyZXR1cm4gLUVOT0VOVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmlvX2RlbGV0ZShzdHJ1Y3QgUWRpc2MgKnNjaCwgdW5zaWduZWQgbG9uZyBjbCkKK3sKKwlzdHJ1Y3QgcHJpb19zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCWlmIChjbCAtIDEgPiBxLT5iYW5kcykKKwkJcmV0dXJuIC1FTk9FTlQ7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcmlvX2R1bXBfY2xhc3Moc3RydWN0IFFkaXNjICpzY2gsIHVuc2lnbmVkIGxvbmcgY2wsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICBzdHJ1Y3QgdGNtc2cgKnRjbSkKK3sKKwlzdHJ1Y3QgcHJpb19zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCisJaWYgKGNsIC0gMSA+IHEtPmJhbmRzKQorCQlyZXR1cm4gLUVOT0VOVDsKKwl0Y20tPnRjbV9oYW5kbGUgfD0gVENfSF9NSU4oY2wpOworCWlmIChxLT5xdWV1ZXNbY2wtMV0pCisJCXRjbS0+dGNtX2luZm8gPSBxLT5xdWV1ZXNbY2wtMV0tPmhhbmRsZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJpb193YWxrKHN0cnVjdCBRZGlzYyAqc2NoLCBzdHJ1Y3QgcWRpc2Nfd2Fsa2VyICphcmcpCit7CisJc3RydWN0IHByaW9fc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlpbnQgcHJpbzsKKworCWlmIChhcmctPnN0b3ApCisJCXJldHVybjsKKworCWZvciAocHJpbyA9IDA7IHByaW8gPCBxLT5iYW5kczsgcHJpbysrKSB7CisJCWlmIChhcmctPmNvdW50IDwgYXJnLT5za2lwKSB7CisJCQlhcmctPmNvdW50Kys7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYXJnLT5mbihzY2gsIHByaW8rMSwgYXJnKSA8IDApIHsKKwkJCWFyZy0+c3RvcCA9IDE7CisJCQlicmVhazsKKwkJfQorCQlhcmctPmNvdW50Kys7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHRjZl9wcm90byAqKiBwcmlvX2ZpbmRfdGNmKHN0cnVjdCBRZGlzYyAqc2NoLCB1bnNpZ25lZCBsb25nIGNsKQoreworCXN0cnVjdCBwcmlvX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisKKwlpZiAoY2wpCisJCXJldHVybiBOVUxMOworCXJldHVybiAmcS0+ZmlsdGVyX2xpc3Q7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgUWRpc2NfY2xhc3Nfb3BzIHByaW9fY2xhc3Nfb3BzID0geworCS5ncmFmdAkJPQlwcmlvX2dyYWZ0LAorCS5sZWFmCQk9CXByaW9fbGVhZiwKKwkuZ2V0CQk9CXByaW9fZ2V0LAorCS5wdXQJCT0JcHJpb19wdXQsCisJLmNoYW5nZQkJPQlwcmlvX2NoYW5nZSwKKwkuZGVsZXRlCQk9CXByaW9fZGVsZXRlLAorCS53YWxrCQk9CXByaW9fd2FsaywKKwkudGNmX2NoYWluCT0JcHJpb19maW5kX3RjZiwKKwkuYmluZF90Y2YJPQlwcmlvX2JpbmQsCisJLnVuYmluZF90Y2YJPQlwcmlvX3B1dCwKKwkuZHVtcAkJPQlwcmlvX2R1bXBfY2xhc3MsCit9OworCitzdGF0aWMgc3RydWN0IFFkaXNjX29wcyBwcmlvX3FkaXNjX29wcyA9IHsKKwkubmV4dAkJPQlOVUxMLAorCS5jbF9vcHMJCT0JJnByaW9fY2xhc3Nfb3BzLAorCS5pZAkJPQkicHJpbyIsCisJLnByaXZfc2l6ZQk9CXNpemVvZihzdHJ1Y3QgcHJpb19zY2hlZF9kYXRhKSwKKwkuZW5xdWV1ZQk9CXByaW9fZW5xdWV1ZSwKKwkuZGVxdWV1ZQk9CXByaW9fZGVxdWV1ZSwKKwkucmVxdWV1ZQk9CXByaW9fcmVxdWV1ZSwKKwkuZHJvcAkJPQlwcmlvX2Ryb3AsCisJLmluaXQJCT0JcHJpb19pbml0LAorCS5yZXNldAkJPQlwcmlvX3Jlc2V0LAorCS5kZXN0cm95CT0JcHJpb19kZXN0cm95LAorCS5jaGFuZ2UJCT0JcHJpb190dW5lLAorCS5kdW1wCQk9CXByaW9fZHVtcCwKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwcmlvX21vZHVsZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX3FkaXNjKCZwcmlvX3FkaXNjX29wcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwcmlvX21vZHVsZV9leGl0KHZvaWQpIAoreworCXVucmVnaXN0ZXJfcWRpc2MoJnByaW9fcWRpc2Nfb3BzKTsKK30KKworbW9kdWxlX2luaXQocHJpb19tb2R1bGVfaW5pdCkKK21vZHVsZV9leGl0KHByaW9fbW9kdWxlX2V4aXQpCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfcmVkLmMgYi9uZXQvc2NoZWQvc2NoX3JlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NGQwZTQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2NoZWQvc2NoX3JlZC5jCkBAIC0wLDAgKzEsNDU5IEBACisvKgorICogbmV0L3NjaGVkL3NjaF9yZWQuYwlSYW5kb20gRWFybHkgRGV0ZWN0aW9uIHF1ZXVlLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKiBDaGFuZ2VzOgorICogSiBIYWRpIFNhbGltIDxoYWRpQG5vcnRlbC5jb20+IDk4MDkxNDoJY29tcHV0YXRpb24gZml4ZXMKKyAqIEFsZXhleSBNYWthcmVua28gPG1ha2FyQHBob2VuaXgua2hhcmtvdi51YT4gOTkwODE0OiBxYXZlIG9uIGlkbGUgbGluayB3YXMgY2FsY3VsYXRlZCBpbmNvcnJlY3RseS4KKyAqIEogSGFkaSBTYWxpbSA8aGFkaUBub3J0ZWxuZXR3b3Jrcy5jb20+IDk4MDgxNjogIEVDTiBzdXBwb3J0CQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KKyNpbmNsdWRlIDxuZXQvaW5ldF9lY24uaD4KKyNpbmNsdWRlIDxuZXQvZHNmaWVsZC5oPgorCisKKy8qCVJhbmRvbSBFYXJseSBEZXRlY3Rpb24gKFJFRCkgYWxnb3JpdGhtLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJU291cmNlOiBTYWxseSBGbG95ZCBhbmQgVmFuIEphY29ic29uLCAiUmFuZG9tIEVhcmx5IERldGVjdGlvbiBHYXRld2F5cworCWZvciBDb25nZXN0aW9uIEF2b2lkYW5jZSIsIDE5OTMsIElFRUUvQUNNIFRyYW5zYWN0aW9ucyBvbiBOZXR3b3JraW5nLgorCisJVGhpcyBmaWxlIGNvZGVzIGEgImRpdmlzaW9ubGVzcyIgdmVyc2lvbiBvZiBSRUQgYWxnb3JpdGhtCisJYXMgd3JpdHRlbiBkb3duIGluIEZpZy4xNyBvZiB0aGUgcGFwZXIuCisKK1Nob3J0IGRlc2NyaXB0aW9uLgorLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlXaGVuIGEgbmV3IHBhY2tldCBhcnJpdmVzIHdlIGNhbGN1bGF0ZSB0aGUgYXZlcmFnZSBxdWV1ZSBsZW5ndGg6CisKKwlhdmcgPSAoMS1XKSphdmcgKyBXKmN1cnJlbnRfcXVldWVfbGVuLAorCisJVyBpcyB0aGUgZmlsdGVyIHRpbWUgY29uc3RhbnQgKGNob3NlbiBhcyAyXigtV2xvZykpLCBpdCBjb250cm9scworCXRoZSBpbmVydGlhIG9mIHRoZSBhbGdvcml0aG0uIFRvIGFsbG93IGxhcmdlciBidXJzdHMsIFcgc2hvdWxkIGJlCisJZGVjcmVhc2VkLgorCisJaWYgKGF2ZyA+IHRoX21heCkgLT4gcGFja2V0IG1hcmtlZCAoZHJvcHBlZCkuCisJaWYgKGF2ZyA8IHRoX21pbikgLT4gcGFja2V0IHBhc3Nlcy4KKwlpZiAodGhfbWluIDwgYXZnIDwgdGhfbWF4KSB3ZSBjYWxjdWxhdGUgcHJvYmFiaWxpdHk6CisKKwlQYiA9IG1heF9QICogKGF2ZyAtIHRoX21pbikvKHRoX21heC10aF9taW4pCisKKwlhbmQgbWFyayAoZHJvcCkgcGFja2V0IHdpdGggdGhpcyBwcm9iYWJpbGl0eS4KKwlQYiBjaGFuZ2VzIGZyb20gMCAoYXQgYXZnPT10aF9taW4pIHRvIG1heF9QIChhdmc9PXRoX21heCkuCisJbWF4X1Agc2hvdWxkIGJlIHNtYWxsIChub3QgMSksIHVzdWFsbHkgMC4wMS4uMC4wMiBpcyBnb29kIHZhbHVlLgorCisJbWF4X1AgaXMgY2hvc2VuIGFzIGEgbnVtYmVyLCBzbyB0aGF0IG1heF9QLyh0aF9tYXgtdGhfbWluKQorCWlzIGEgbmVnYXRpdmUgcG93ZXIgb2YgdHdvIGluIG9yZGVyIGFyaXRobWV0aWNzIHRvIGNvbnRhaW4KKwlvbmx5IHNoaWZ0cy4KKworCisJUGFyYW1ldGVycywgc2V0dGFibGUgYnkgdXNlcjoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJbGltaXQJCS0gYnl0ZXMgKG11c3QgYmUgPiBxdGhfbWF4ICsgYnVyc3QpCisKKwlIYXJkIGxpbWl0IG9uIHF1ZXVlIGxlbmd0aCwgc2hvdWxkIGJlIGNob3NlbiA+cXRoX21heAorCXRvIGFsbG93IHBhY2tldCBidXJzdHMuIFRoaXMgcGFyYW1ldGVyIGRvZXMgbm90CisJYWZmZWN0IHRoZSBhbGdvcml0aG1zIGJlaGF2aW91ciBhbmQgY2FuIGJlIGNob3NlbgorCWFyYml0cmFyaWx5IGhpZ2ggKHdlbGwsIGxlc3MgdGhhbiByYW0gc2l6ZSkKKwlSZWFsbHksIHRoaXMgbGltaXQgd2lsbCBuZXZlciBiZSByZWFjaGVkCisJaWYgUkVEIHdvcmtzIGNvcnJlY3RseS4KKworCXF0aF9taW4JCS0gYnl0ZXMgKHNob3VsZCBiZSA8IHF0aF9tYXgvMikKKwlxdGhfbWF4CQktIGJ5dGVzIChzaG91bGQgYmUgYXQgbGVhc3QgMipxdGhfbWluIGFuZCBsZXNzIGxpbWl0KQorCVdsb2cJICAgICAgIAktIGJpdHMgKDwzMikgbG9nKDEvVykuCisJUGxvZwkgICAgICAgCS0gYml0cyAoPDMyKQorCisJUGxvZyBpcyByZWxhdGVkIHRvIG1heF9QIGJ5IGZvcm11bGE6CisKKwltYXhfUCA9IChxdGhfbWF4LXF0aF9taW4pLzJeUGxvZzsKKworCUYuZS4gaWYgcXRoX21heD0xMjhLIGFuZCBxdGhfbWluPTMySywgdGhlbiBQbG9nPTIyCisJY29ycmVzcG9uZHMgdG8gbWF4X1A9MC4wMgorCisJU2NlbGxfbG9nCisJU3RhYgorCisJTG9va3VwIHRhYmxlIGZvciBsb2coKDEtVyleKHQvdF9hdmUpLgorCisKK05PVEVTOgorCitVcHBlciBib3VuZCBvbiBXLgorLS0tLS0tLS0tLS0tLS0tLS0KKworCUlmIHlvdSB3YW50IHRvIGFsbG93IGJ1cnN0cyBvZiBMIHBhY2tldHMgb2Ygc2l6ZSBTLAorCXlvdSBzaG91bGQgY2hvb3NlIFc6CisKKwlMICsgMSAtIHRoX21pbi9TIDwgKDEtKDEtVyleTCkvVworCisJdGhfbWluL1MgPSAzMiAgICAgICAgIHRoX21pbi9TID0gNAorCQkJICAgICAgICAgICAgICAgICAgICAgICAKKwlsb2coVykJTAorCS0xCTMzCisJLTIJMzUKKwktMwkzOQorCS00CTQ2CisJLTUJNTcKKwktNgk3NQorCS03CTEwMQorCS04CTEzNQorCS05CTE5MAorCWV0Yy4KKyAqLworCitzdHJ1Y3QgcmVkX3NjaGVkX2RhdGEKK3sKKy8qIFBhcmFtZXRlcnMgKi8KKwl1MzIJCWxpbWl0OwkJLyogSEFSRCBtYXhpbWFsIHF1ZXVlIGxlbmd0aAkqLworCXUzMgkJcXRoX21pbjsJLyogTWluIGF2ZXJhZ2UgbGVuZ3RoIHRocmVzaG9sZDogQSBzY2FsZWQgKi8KKwl1MzIJCXF0aF9tYXg7CS8qIE1heCBhdmVyYWdlIGxlbmd0aCB0aHJlc2hvbGQ6IEEgc2NhbGVkICovCisJdTMyCQlSbWFzazsKKwl1MzIJCVNjZWxsX21heDsKKwl1bnNpZ25lZCBjaGFyCWZsYWdzOworCWNoYXIJCVdsb2c7CQkvKiBsb2coVykJCSovCisJY2hhcgkJUGxvZzsJCS8qIHJhbmRvbSBudW1iZXIgYml0cwkqLworCWNoYXIJCVNjZWxsX2xvZzsKKwl1OAkJU3RhYlsyNTZdOworCisvKiBWYXJpYWJsZXMgKi8KKwl1bnNpZ25lZCBsb25nCXFhdmU7CQkvKiBBdmVyYWdlIHF1ZXVlIGxlbmd0aDogQSBzY2FsZWQgKi8KKwlpbnQJCXFjb3VudDsJCS8qIFBhY2tldHMgc2luY2UgbGFzdCByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gKi8KKwl1MzIJCXFSOwkJLyogQ2FjaGVkIHJhbmRvbSBudW1iZXIgKi8KKworCXBzY2hlZF90aW1lX3QJcWlkbGVzdGFydDsJLyogU3RhcnQgb2YgaWRsZSBwZXJpb2QJCSovCisJc3RydWN0IHRjX3JlZF94c3RhdHMgc3Q7Cit9OworCitzdGF0aWMgaW50IHJlZF9lY25fbWFyayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmIChza2ItPm5oLnJhdyArIDIwID4gc2tiLT50YWlsKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoc2tiLT5wcm90b2NvbCkgeworCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk6CisJCWlmIChJTkVUX0VDTl9pc19ub3RfZWN0KHNrYi0+bmguaXBoLT50b3MpKQorCQkJcmV0dXJuIDA7CisJCUlQX0VDTl9zZXRfY2Uoc2tiLT5uaC5pcGgpOworCQlyZXR1cm4gMTsKKwljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVBWNik6CisJCWlmIChJTkVUX0VDTl9pc19ub3RfZWN0KGlwdjZfZ2V0X2RzZmllbGQoc2tiLT5uaC5pcHY2aCkpKQorCQkJcmV0dXJuIDA7CisJCUlQNl9FQ05fc2V0X2NlKHNrYi0+bmguaXB2NmgpOworCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3JlZF9lbnF1ZXVlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBRZGlzYyogc2NoKQoreworCXN0cnVjdCByZWRfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKworCXBzY2hlZF90aW1lX3Qgbm93OworCisJaWYgKCFQU0NIRURfSVNfUEFTVFBFUkZFQ1QocS0+cWlkbGVzdGFydCkpIHsKKwkJbG9uZyB1c19pZGxlOworCQlpbnQgIHNoaWZ0OworCisJCVBTQ0hFRF9HRVRfVElNRShub3cpOworCQl1c19pZGxlID0gUFNDSEVEX1RESUZGX1NBRkUobm93LCBxLT5xaWRsZXN0YXJ0LCBxLT5TY2VsbF9tYXgpOworCQlQU0NIRURfU0VUX1BBU1RQRVJGRUNUKHEtPnFpZGxlc3RhcnQpOworCisvKgorICAgVGhlIHByb2JsZW06IGlkZWFsbHksIGF2ZXJhZ2UgbGVuZ3RoIHF1ZXVlIHJlY2FsY3VsdGlvbiBzaG91bGQKKyAgIGJlIGRvbmUgb3ZlciBjb25zdGFudCBjbG9jayBpbnRlcnZhbHMuIFRoaXMgaXMgdG9vIGV4cGVuc2l2ZSwgc28gdGhhdAorICAgdGhlIGNhbGN1bGF0aW9uIGlzIGRyaXZlbiBieSBvdXRnb2luZyBwYWNrZXRzLgorICAgV2hlbiB0aGUgcXVldWUgaXMgaWRsZSB3ZSBoYXZlIHRvIG1vZGVsIHRoaXMgY2xvY2sgYnkgaGFuZC4KKworICAgU0YrVkogcHJvcG9zZWQgdG8gImdlbmVyYXRlIiBtID0gaWRsZXRpbWUvKGF2ZXJhZ2VfcGt0X3NpemUvYmFuZHdpZHRoKQorICAgZHVtbXkgcGFja2V0cyBhcyBhIGJ1cnN0IGFmdGVyIGlkbGUgdGltZSwgaS5lLgorCisgICAgICAgICAgcS0+cWF2ZSAqPSAoMS1XKV5tCisKKyAgIFRoaXMgaXMgYW4gYXBwYXJlbnRseSBvdmVyY29tcGxpY2F0ZWQgc29sdXRpb24gKGYuZS4gd2UgaGF2ZSB0byBwcmVjb21wdXRlCisgICBhIHRhYmxlIHRvIG1ha2UgdGhpcyBjYWxjdWxhdGlvbiBpbiByZWFzb25hYmxlIHRpbWUpCisgICBJIGJlbGlldmUgdGhhdCBhIHNpbXBsZXIgbW9kZWwgbWF5IGJlIHVzZWQgaGVyZSwKKyAgIGJ1dCBpdCBpcyBmaWVsZCBmb3IgZXhwZXJpbWVudHMuCisqLworCQlzaGlmdCA9IHEtPlN0YWJbdXNfaWRsZT4+cS0+U2NlbGxfbG9nXTsKKworCQlpZiAoc2hpZnQpIHsKKwkJCXEtPnFhdmUgPj49IHNoaWZ0OworCQl9IGVsc2UgeworCQkJLyogQXBwcm94aW1hdGUgaW5pdGlhbCBwYXJ0IG9mIGV4cG9uZW50CisJCQkgICB3aXRoIGxpbmVhciBmdW5jdGlvbjoKKwkJCSAgICgxLVcpXm0gfj0gMS1tVyArIC4uLgorCisJCQkgICBTZWVtcywgaXQgaXMgdGhlIGJlc3Qgc29sdXRpb24gdG8KKwkJCSAgIHByb2JsZW0gb2YgdG9vIGNvYXJjZSBleHBvbmVudCB0YWJ1bGF0aW9uLgorCQkJICovCisKKwkJCXVzX2lkbGUgPSAocS0+cWF2ZSAqIHVzX2lkbGUpPj5xLT5TY2VsbF9sb2c7CisJCQlpZiAodXNfaWRsZSA8IHEtPnFhdmUvMikKKwkJCQlxLT5xYXZlIC09IHVzX2lkbGU7CisJCQllbHNlCisJCQkJcS0+cWF2ZSA+Pj0gMTsKKwkJfQorCX0gZWxzZSB7CisJCXEtPnFhdmUgKz0gc2NoLT5xc3RhdHMuYmFja2xvZyAtIChxLT5xYXZlID4+IHEtPldsb2cpOworCQkvKiBOT1RFOgorCQkgICBxLT5xYXZlIGlzIGZpeGVkIHBvaW50IG51bWJlciB3aXRoIHBvaW50IGF0IFdsb2cuCisJCSAgIFRoZSBmb3JtdWxhZSBhYm92ZSBpcyBlcXV2YWxlbnQgdG8gZmxvYXRpbmcgcG9pbnQKKwkJICAgdmVyc2lvbjoKKworCQkgICBxYXZlID0gcWF2ZSooMS1XKSArIHNjaC0+cXN0YXRzLmJhY2tsb2cqVzsKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tQU5LICg5ODA5MjQpCisJCSAqLworCX0KKworCWlmIChxLT5xYXZlIDwgcS0+cXRoX21pbikgeworCQlxLT5xY291bnQgPSAtMTsKK2VucXVldWU6CisJCWlmIChzY2gtPnFzdGF0cy5iYWNrbG9nICsgc2tiLT5sZW4gPD0gcS0+bGltaXQpIHsKKwkJCV9fc2tiX3F1ZXVlX3RhaWwoJnNjaC0+cSwgc2tiKTsKKwkJCXNjaC0+cXN0YXRzLmJhY2tsb2cgKz0gc2tiLT5sZW47CisJCQlzY2gtPmJzdGF0cy5ieXRlcyArPSBza2ItPmxlbjsKKwkJCXNjaC0+YnN0YXRzLnBhY2tldHMrKzsKKwkJCXJldHVybiBORVRfWE1JVF9TVUNDRVNTOworCQl9IGVsc2UgeworCQkJcS0+c3QucGRyb3ArKzsKKwkJfQorCQlrZnJlZV9za2Ioc2tiKTsKKwkJc2NoLT5xc3RhdHMuZHJvcHMrKzsKKwkJcmV0dXJuIE5FVF9YTUlUX0RST1A7CisJfQorCWlmIChxLT5xYXZlID49IHEtPnF0aF9tYXgpIHsKKwkJcS0+cWNvdW50ID0gLTE7CisJCXNjaC0+cXN0YXRzLm92ZXJsaW1pdHMrKzsKK21hcms6CisJCWlmICAoIShxLT5mbGFncyZUQ19SRURfRUNOKSB8fCAhcmVkX2Vjbl9tYXJrKHNrYikpIHsKKwkJCXEtPnN0LmVhcmx5Kys7CisJCQlnb3RvIGRyb3A7CisJCX0KKwkJcS0+c3QubWFya2VkKys7CisJCWdvdG8gZW5xdWV1ZTsKKwl9CisKKwlpZiAoKytxLT5xY291bnQpIHsKKwkJLyogVGhlIGZvcm11bGEgdXNlZCBiZWxvdyBjYXVzZXMgcXVlc3Rpb25zLgorCisJCSAgIE9LLiBxUiBpcyByYW5kb20gbnVtYmVyIGluIHRoZSBpbnRlcnZhbCAwLi5SbWFzaworCQkgICBpLmUuIDAuLigyXlBsb2cpLiBJZiB3ZSB1c2VkIGZsb2F0aW5nIHBvaW50CisJCSAgIGFyaXRobWV0aWNzLCBpdCB3b3VsZCBiZTogKDJeUGxvZykqcm5kX251bSwKKwkJICAgd2hlcmUgcm5kX251bSBpcyBsZXNzIDEuCisKKwkJICAgVGFraW5nIGludG8gYWNjb3VudCwgdGhhdCBxYXZlIGhhdmUgZml4ZWQKKwkJICAgcG9pbnQgYXQgV2xvZywgYW5kIFBsb2cgaXMgcmVsYXRlZCB0byBtYXhfUCBieQorCQkgICBtYXhfUCA9IChxdGhfbWF4LXF0aF9taW4pLzJeUGxvZzsgdHdvIGxpbmVzCisJCSAgIGJlbG93IGhhdmUgdGhlIGZvbGxvd2luZyBmbG9hdGluZyBwb2ludCBlcXVpdmFsZW50OgorCQkgICAKKwkJICAgbWF4X1AqKHFhdmUgLSBxdGhfbWluKS8ocXRoX21heC1xdGhfbWluKSA8IHJuZC9xY291bnQKKworCQkgICBBbnkgcXVlc3Rpb25zPyAtLUFOSyAoOTgwOTI0KQorCQkgKi8KKwkJaWYgKCgocS0+cWF2ZSAtIHEtPnF0aF9taW4pPj5xLT5XbG9nKSpxLT5xY291bnQgPCBxLT5xUikKKwkJCWdvdG8gZW5xdWV1ZTsKKwkJcS0+cWNvdW50ID0gMDsKKwkJcS0+cVIgPSBuZXRfcmFuZG9tKCkmcS0+Um1hc2s7CisJCXNjaC0+cXN0YXRzLm92ZXJsaW1pdHMrKzsKKwkJZ290byBtYXJrOworCX0KKwlxLT5xUiA9IG5ldF9yYW5kb20oKSZxLT5SbWFzazsKKwlnb3RvIGVucXVldWU7CisKK2Ryb3A6CisJa2ZyZWVfc2tiKHNrYik7CisJc2NoLT5xc3RhdHMuZHJvcHMrKzsKKwlyZXR1cm4gTkVUX1hNSVRfQ047Cit9CisKK3N0YXRpYyBpbnQKK3JlZF9yZXF1ZXVlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBRZGlzYyogc2NoKQoreworCXN0cnVjdCByZWRfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKworCVBTQ0hFRF9TRVRfUEFTVFBFUkZFQ1QocS0+cWlkbGVzdGFydCk7CisKKwlfX3NrYl9xdWV1ZV9oZWFkKCZzY2gtPnEsIHNrYik7CisJc2NoLT5xc3RhdHMuYmFja2xvZyArPSBza2ItPmxlbjsKKwlzY2gtPnFzdGF0cy5yZXF1ZXVlcysrOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgorcmVkX2RlcXVldWUoc3RydWN0IFFkaXNjKiBzY2gpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgcmVkX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisKKwlza2IgPSBfX3NrYl9kZXF1ZXVlKCZzY2gtPnEpOworCWlmIChza2IpIHsKKwkJc2NoLT5xc3RhdHMuYmFja2xvZyAtPSBza2ItPmxlbjsKKwkJcmV0dXJuIHNrYjsKKwl9CisJUFNDSEVEX0dFVF9USU1FKHEtPnFpZGxlc3RhcnQpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHJlZF9kcm9wKHN0cnVjdCBRZGlzYyogc2NoKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHJlZF9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCisJc2tiID0gX19za2JfZGVxdWV1ZV90YWlsKCZzY2gtPnEpOworCWlmIChza2IpIHsKKwkJdW5zaWduZWQgaW50IGxlbiA9IHNrYi0+bGVuOworCQlzY2gtPnFzdGF0cy5iYWNrbG9nIC09IGxlbjsKKwkJc2NoLT5xc3RhdHMuZHJvcHMrKzsKKwkJcS0+c3Qub3RoZXIrKzsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiBsZW47CisJfQorCVBTQ0hFRF9HRVRfVElNRShxLT5xaWRsZXN0YXJ0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmVkX3Jlc2V0KHN0cnVjdCBRZGlzYyogc2NoKQoreworCXN0cnVjdCByZWRfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKworCV9fc2tiX3F1ZXVlX3B1cmdlKCZzY2gtPnEpOworCXNjaC0+cXN0YXRzLmJhY2tsb2cgPSAwOworCVBTQ0hFRF9TRVRfUEFTVFBFUkZFQ1QocS0+cWlkbGVzdGFydCk7CisJcS0+cWF2ZSA9IDA7CisJcS0+cWNvdW50ID0gLTE7Cit9CisKK3N0YXRpYyBpbnQgcmVkX2NoYW5nZShzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IHJ0YXR0ciAqb3B0KQoreworCXN0cnVjdCByZWRfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfUkVEX1NUQUJdOworCXN0cnVjdCB0Y19yZWRfcW9wdCAqY3RsOworCisJaWYgKG9wdCA9PSBOVUxMIHx8CisJICAgIHJ0YXR0cl9wYXJzZV9uZXN0ZWQodGIsIFRDQV9SRURfU1RBQiwgb3B0KSB8fAorCSAgICB0YltUQ0FfUkVEX1BBUk1TLTFdID09IDAgfHwgdGJbVENBX1JFRF9TVEFCLTFdID09IDAgfHwKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX1JFRF9QQVJNUy0xXSkgPCBzaXplb2YoKmN0bCkgfHwKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX1JFRF9TVEFCLTFdKSA8IDI1NikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljdGwgPSBSVEFfREFUQSh0YltUQ0FfUkVEX1BBUk1TLTFdKTsKKworCXNjaF90cmVlX2xvY2soc2NoKTsKKwlxLT5mbGFncyA9IGN0bC0+ZmxhZ3M7CisJcS0+V2xvZyA9IGN0bC0+V2xvZzsKKwlxLT5QbG9nID0gY3RsLT5QbG9nOworCXEtPlJtYXNrID0gY3RsLT5QbG9nIDwgMzIgPyAoKDE8PGN0bC0+UGxvZykgLSAxKSA6IH4wVUw7CisJcS0+U2NlbGxfbG9nID0gY3RsLT5TY2VsbF9sb2c7CisJcS0+U2NlbGxfbWF4ID0gKDI1NTw8cS0+U2NlbGxfbG9nKTsKKwlxLT5xdGhfbWluID0gY3RsLT5xdGhfbWluPDxjdGwtPldsb2c7CisJcS0+cXRoX21heCA9IGN0bC0+cXRoX21heDw8Y3RsLT5XbG9nOworCXEtPmxpbWl0ID0gY3RsLT5saW1pdDsKKwltZW1jcHkocS0+U3RhYiwgUlRBX0RBVEEodGJbVENBX1JFRF9TVEFCLTFdKSwgMjU2KTsKKworCXEtPnFjb3VudCA9IC0xOworCWlmIChza2JfcXVldWVfbGVuKCZzY2gtPnEpID09IDApCisJCVBTQ0hFRF9TRVRfUEFTVFBFUkZFQ1QocS0+cWlkbGVzdGFydCk7CisJc2NoX3RyZWVfdW5sb2NrKHNjaCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVkX2luaXQoc3RydWN0IFFkaXNjKiBzY2gsIHN0cnVjdCBydGF0dHIgKm9wdCkKK3sKKwlyZXR1cm4gcmVkX2NoYW5nZShzY2gsIG9wdCk7Cit9CisKK3N0YXRpYyBpbnQgcmVkX2R1bXAoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHJlZF9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCXN0cnVjdCBydGF0dHIgKnJ0YTsKKwlzdHJ1Y3QgdGNfcmVkX3FvcHQgb3B0OworCisJcnRhID0gKHN0cnVjdCBydGF0dHIqKWI7CisJUlRBX1BVVChza2IsIFRDQV9PUFRJT05TLCAwLCBOVUxMKTsKKwlvcHQubGltaXQgPSBxLT5saW1pdDsKKwlvcHQucXRoX21pbiA9IHEtPnF0aF9taW4+PnEtPldsb2c7CisJb3B0LnF0aF9tYXggPSBxLT5xdGhfbWF4Pj5xLT5XbG9nOworCW9wdC5XbG9nID0gcS0+V2xvZzsKKwlvcHQuUGxvZyA9IHEtPlBsb2c7CisJb3B0LlNjZWxsX2xvZyA9IHEtPlNjZWxsX2xvZzsKKwlvcHQuZmxhZ3MgPSBxLT5mbGFnczsKKwlSVEFfUFVUKHNrYiwgVENBX1JFRF9QQVJNUywgc2l6ZW9mKG9wdCksICZvcHQpOworCXJ0YS0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisKKwlyZXR1cm4gc2tiLT5sZW47CisKK3J0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHJlZF9kdW1wX3N0YXRzKHN0cnVjdCBRZGlzYyAqc2NoLCBzdHJ1Y3QgZ25ldF9kdW1wICpkKQoreworCXN0cnVjdCByZWRfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKworCXJldHVybiBnbmV0X3N0YXRzX2NvcHlfYXBwKGQsICZxLT5zdCwgc2l6ZW9mKHEtPnN0KSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgUWRpc2Nfb3BzIHJlZF9xZGlzY19vcHMgPSB7CisJLm5leHQJCT0JTlVMTCwKKwkuY2xfb3BzCQk9CU5VTEwsCisJLmlkCQk9CSJyZWQiLAorCS5wcml2X3NpemUJPQlzaXplb2Yoc3RydWN0IHJlZF9zY2hlZF9kYXRhKSwKKwkuZW5xdWV1ZQk9CXJlZF9lbnF1ZXVlLAorCS5kZXF1ZXVlCT0JcmVkX2RlcXVldWUsCisJLnJlcXVldWUJPQlyZWRfcmVxdWV1ZSwKKwkuZHJvcAkJPQlyZWRfZHJvcCwKKwkuaW5pdAkJPQlyZWRfaW5pdCwKKwkucmVzZXQJCT0JcmVkX3Jlc2V0LAorCS5jaGFuZ2UJCT0JcmVkX2NoYW5nZSwKKwkuZHVtcAkJPQlyZWRfZHVtcCwKKwkuZHVtcF9zdGF0cwk9CXJlZF9kdW1wX3N0YXRzLAorCS5vd25lcgkJPQlUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHJlZF9tb2R1bGVfaW5pdCh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9xZGlzYygmcmVkX3FkaXNjX29wcyk7Cit9CitzdGF0aWMgdm9pZCBfX2V4aXQgcmVkX21vZHVsZV9leGl0KHZvaWQpIAoreworCXVucmVnaXN0ZXJfcWRpc2MoJnJlZF9xZGlzY19vcHMpOworfQorbW9kdWxlX2luaXQocmVkX21vZHVsZV9pbml0KQorbW9kdWxlX2V4aXQocmVkX21vZHVsZV9leGl0KQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9zZnEuYyBiL25ldC9zY2hlZC9zY2hfc2ZxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODczNGJiNwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY2hlZC9zY2hfc2ZxLmMKQEAgLTAsMCArMSw0OTcgQEAKKy8qCisgKiBuZXQvc2NoZWQvc2NoX3NmcS5jCVN0b2NoYXN0aWMgRmFpcm5lc3MgUXVldWVpbmcgZGlzY2lwbGluZS4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KKworCisvKglTdG9jaGFzdGljIEZhaXJuZXNzIFF1ZXVpbmcgYWxnb3JpdGhtLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJU291cmNlOgorCVBhdWwgRS4gTWNLZW5uZXkgIlN0b2NoYXN0aWMgRmFpcm5lc3MgUXVldWluZyIsCisJSUVFRSBJTkZPQ09NTSc5MCBQcm9jZWVkaW5ncywgU2FuIEZyYW5jaXNjbywgMTk5MC4KKworCVBhdWwgRS4gTWNLZW5uZXkgIlN0b2NoYXN0aWMgRmFpcm5lc3MgUXVldWluZyIsCisJIkludGVyd29ya2luZzogUmVzZWFyY2ggYW5kIEV4cGVyaWVuY2UiLCB2LjIsIDE5OTEsIHAuMTEzLTEzMS4KKworCisJU2VlIGFsc286CisJTS4gU2hyZWVkaGFyIGFuZCBHZW9yZ2UgVmFyZ2hlc2UgIkVmZmljaWVudCBGYWlyCisJUXVldWluZyB1c2luZyBEZWZpY2l0IFJvdW5kIFJvYmluIiwgUHJvYy4gU0lHQ09NTSA5NS4KKworCisJVGhpcyBpcyBub3QgdGhlIHRoaW5nIHRoYXQgaXMgdXN1YWxseSBjYWxsZWQgKFcpRlEgbm93YWRheXMuIAorCUl0IGRvZXMgbm90IHVzZSBhbnkgdGltZXN0YW1wIG1lY2hhbmlzbSwgYnV0IGluc3RlYWQKKwlwcm9jZXNzZXMgcXVldWVzIGluIHJvdW5kLXJvYmluIG9yZGVyLgorCisJQURWQU5UQUdFOgorCisJLSBJdCBpcyB2ZXJ5IGNoZWFwLiBCb3RoIENQVSBhbmQgbWVtb3J5IHJlcXVpcmVtZW50cyBhcmUgbWluaW1hbC4KKworCURSQVdCQUNLUzoKKworCS0gIlN0b2NoYXN0aWMiIC0+IEl0IGlzIG5vdCAxMDAlIGZhaXIuIAorCVdoZW4gaGFzaCBjb2xsaXNpb25zIG9jY3VyLCBzZXZlcmFsIGZsb3dzIGFyZSBjb25zaWRlcmVkIGFzIG9uZS4KKworCS0gIlJvdW5kLXJvYmluIiAtPiBJdCBpbnRyb2R1Y2VzIGxhcmdlciBkZWxheXMgdGhhbiB2aXJ0dWFsIGNsb2NrCisJYmFzZWQgc2NoZW1lcywgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgaXNvbGF0aW5nIGludGVyYWN0aXZlCisJdHJhZmZpYwlmcm9tIG5vbi1pbnRlcmFjdGl2ZS4gSXQgbWVhbnMsIHRoYXQgdGhpcyBzY2hlZHVsZXIKKwlzaG91bGQgYmUgdXNlZCBhcyBsZWFmIG9mIENCUSBvciBQMywgd2hpY2ggcHV0IGludGVyYWN0aXZlIHRyYWZmaWMKKwl0byBoaWdoZXIgcHJpb3JpdHkgYmFuZC4KKworCVdlIHN0aWxsIG5lZWQgdHJ1ZSBXRlEgZm9yIHRvcCBsZXZlbCBDU1osIGJ1dCB1c2luZyBXRlEKKwlmb3IgdGhlIGJlc3QgZWZmb3J0IHRyYWZmaWMgaXMgYWJzb2x1dGVseSBwb2ludGxlc3M6CisJU0ZRIGlzIHN1cGVyaW9yIGZvciB0aGlzIHB1cnBvc2UuCisKKwlJTVBMRU1FTlRBVElPTjoKKwlUaGlzIGltcGxlbWVudGF0aW9uIGxpbWl0cyBtYXhpbWFsIHF1ZXVlIGxlbmd0aCB0byAxMjg7CisJbWF4aW1hbCBtdHUgdG8gMl4xNS0xOyBudW1iZXIgb2YgaGFzaCBidWNrZXRzIHRvIDEwMjQuCisJVGhlIG9ubHkgZ29hbCBvZiB0aGlzIHJlc3RyaWN0aW9ucyB3YXMgdGhhdCBhbGwgZGF0YQorCWZpdCBpbnRvIG9uZSA0SyBwYWdlIDotKS4gU3RydWN0IHNmcV9zY2hlZF9kYXRhIGlzCisJb3JnYW5pemVkIGluIGFudGktY2FjaGUgbWFubmVyOiBhbGwgdGhlIGRhdGEgZm9yIGEgYnVja2V0CisJYXJlIHNjYXR0ZXJlZCBvdmVyIGRpZmZlcmVudCBsb2NhdGlvbnMuIFRoaXMgaXMgbm90IGdvb2QsCisJYnV0IGl0IGFsbG93ZWQgbWUgdG8gcHV0IGl0IGludG8gNEsuCisKKwlJdCBpcyBlYXN5IHRvIGluY3JlYXNlIHRoZXNlIHZhbHVlcywgYnV0IG5vdCBpbiBmbGlnaHQuICAqLworCisjZGVmaW5lIFNGUV9ERVBUSAkJMTI4CisjZGVmaW5lIFNGUV9IQVNIX0RJVklTT1IJMTAyNAorCisvKiBUaGlzIHR5cGUgc2hvdWxkIGNvbnRhaW4gYXQgbGVhc3QgU0ZRX0RFUFRIKjIgdmFsdWVzICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgc2ZxX2luZGV4OworCitzdHJ1Y3Qgc2ZxX2hlYWQKK3sKKwlzZnFfaW5kZXgJbmV4dDsKKwlzZnFfaW5kZXgJcHJldjsKK307CisKK3N0cnVjdCBzZnFfc2NoZWRfZGF0YQoreworLyogUGFyYW1ldGVycyAqLworCWludAkJcGVydHVyYl9wZXJpb2Q7CisJdW5zaWduZWQJcXVhbnR1bTsJLyogQWxsb3RtZW50IHBlciByb3VuZDogTVVTVCBCRSA+PSBNVFUgKi8KKwlpbnQJCWxpbWl0OworCisvKiBWYXJpYWJsZXMgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBwZXJ0dXJiX3RpbWVyOworCWludAkJcGVydHVyYmF0aW9uOworCXNmcV9pbmRleAl0YWlsOwkJLyogSW5kZXggb2YgY3VycmVudCBzbG90IGluIHJvdW5kICovCisJc2ZxX2luZGV4CW1heF9kZXB0aDsJLyogTWF4aW1hbCBkZXB0aCAqLworCisJc2ZxX2luZGV4CWh0W1NGUV9IQVNIX0RJVklTT1JdOwkvKiBIYXNoIHRhYmxlICovCisJc2ZxX2luZGV4CW5leHRbU0ZRX0RFUFRIXTsJLyogQWN0aXZlIHNsb3RzIGxpbmsgKi8KKwlzaG9ydAkJYWxsb3RbU0ZRX0RFUFRIXTsJLyogQ3VycmVudCBhbGxvdG1lbnQgcGVyIHNsb3QgKi8KKwl1bnNpZ25lZCBzaG9ydAloYXNoW1NGUV9ERVBUSF07CS8qIEhhc2ggdmFsdWUgaW5kZXhlZCBieSBzbG90cyAqLworCXN0cnVjdCBza19idWZmX2hlYWQJcXNbU0ZRX0RFUFRIXTsJCS8qIFNsb3QgcXVldWUgKi8KKwlzdHJ1Y3Qgc2ZxX2hlYWQJZGVwW1NGUV9ERVBUSCoyXTsJLyogTGlua2VkIGxpc3Qgb2Ygc2xvdHMsIGluZGV4ZWQgYnkgZGVwdGggKi8KK307CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIHNmcV9mb2xkX2hhc2goc3RydWN0IHNmcV9zY2hlZF9kYXRhICpxLCB1MzIgaCwgdTMyIGgxKQoreworCWludCBwZXJ0ID0gcS0+cGVydHVyYmF0aW9uOworCisJLyogSGF2ZSB3ZSBhbnkgcm90YXRpb24gcHJpbWl0aXZlcz8gSWYgbm90LCBXSFk/ICovCisJaCBePSAoaDE8PHBlcnQpIF4gKGgxPj4oMHgxRiAtIHBlcnQpKTsKKwloIF49IGg+PjEwOworCXJldHVybiBoICYgMHgzRkY7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzZnFfaGFzaChzdHJ1Y3Qgc2ZxX3NjaGVkX2RhdGEgKnEsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTMyIGgsIGgyOworCisJc3dpdGNoIChza2ItPnByb3RvY29sKSB7CisJY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKToKKwl7CisJCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisJCWggPSBpcGgtPmRhZGRyOworCQloMiA9IGlwaC0+c2FkZHJeaXBoLT5wcm90b2NvbDsKKwkJaWYgKCEoaXBoLT5mcmFnX29mZiZodG9ucyhJUF9NRnxJUF9PRkZTRVQpKSAmJgorCQkgICAgKGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1AgfHwKKwkJICAgICBpcGgtPnByb3RvY29sID09IElQUFJPVE9fVURQIHx8CisJCSAgICAgaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX0VTUCkpCisJCQloMiBePSAqKCgodTMyKilpcGgpICsgaXBoLT5paGwpOworCQlicmVhazsKKwl9CisJY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQVjYpOgorCXsKKwkJc3RydWN0IGlwdjZoZHIgKmlwaCA9IHNrYi0+bmguaXB2Nmg7CisJCWggPSBpcGgtPmRhZGRyLnM2X2FkZHIzMlszXTsKKwkJaDIgPSBpcGgtPnNhZGRyLnM2X2FkZHIzMlszXV5pcGgtPm5leHRoZHI7CisJCWlmIChpcGgtPm5leHRoZHIgPT0gSVBQUk9UT19UQ1AgfHwKKwkJICAgIGlwaC0+bmV4dGhkciA9PSBJUFBST1RPX1VEUCB8fAorCQkgICAgaXBoLT5uZXh0aGRyID09IElQUFJPVE9fRVNQKQorCQkJaDIgXj0gKih1MzIqKSZpcGhbMV07CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQloID0gKHUzMikodW5zaWduZWQgbG9uZylza2ItPmRzdF5za2ItPnByb3RvY29sOworCQloMiA9ICh1MzIpKHVuc2lnbmVkIGxvbmcpc2tiLT5zazsKKwl9CisJcmV0dXJuIHNmcV9mb2xkX2hhc2gocSwgaCwgaDIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2ZxX2xpbmsoc3RydWN0IHNmcV9zY2hlZF9kYXRhICpxLCBzZnFfaW5kZXggeCkKK3sKKwlzZnFfaW5kZXggcCwgbjsKKwlpbnQgZCA9IHEtPnFzW3hdLnFsZW4gKyBTRlFfREVQVEg7CisKKwlwID0gZDsKKwluID0gcS0+ZGVwW2RdLm5leHQ7CisJcS0+ZGVwW3hdLm5leHQgPSBuOworCXEtPmRlcFt4XS5wcmV2ID0gcDsKKwlxLT5kZXBbcF0ubmV4dCA9IHEtPmRlcFtuXS5wcmV2ID0geDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNmcV9kZWMoc3RydWN0IHNmcV9zY2hlZF9kYXRhICpxLCBzZnFfaW5kZXggeCkKK3sKKwlzZnFfaW5kZXggcCwgbjsKKworCW4gPSBxLT5kZXBbeF0ubmV4dDsKKwlwID0gcS0+ZGVwW3hdLnByZXY7CisJcS0+ZGVwW3BdLm5leHQgPSBuOworCXEtPmRlcFtuXS5wcmV2ID0gcDsKKworCWlmIChuID09IHAgJiYgcS0+bWF4X2RlcHRoID09IHEtPnFzW3hdLnFsZW4gKyAxKQorCQlxLT5tYXhfZGVwdGgtLTsKKworCXNmcV9saW5rKHEsIHgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2ZxX2luYyhzdHJ1Y3Qgc2ZxX3NjaGVkX2RhdGEgKnEsIHNmcV9pbmRleCB4KQoreworCXNmcV9pbmRleCBwLCBuOworCWludCBkOworCisJbiA9IHEtPmRlcFt4XS5uZXh0OworCXAgPSBxLT5kZXBbeF0ucHJldjsKKwlxLT5kZXBbcF0ubmV4dCA9IG47CisJcS0+ZGVwW25dLnByZXYgPSBwOworCWQgPSBxLT5xc1t4XS5xbGVuOworCWlmIChxLT5tYXhfZGVwdGggPCBkKQorCQlxLT5tYXhfZGVwdGggPSBkOworCisJc2ZxX2xpbmsocSwgeCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2ZxX2Ryb3Aoc3RydWN0IFFkaXNjICpzY2gpCit7CisJc3RydWN0IHNmcV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXNmcV9pbmRleCBkID0gcS0+bWF4X2RlcHRoOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgaW50IGxlbjsKKworCS8qIFF1ZXVlIGlzIGZ1bGwhIEZpbmQgdGhlIGxvbmdlc3Qgc2xvdCBhbmQKKwkgICBkcm9wIGEgcGFja2V0IGZyb20gaXQgKi8KKworCWlmIChkID4gMSkgeworCQlzZnFfaW5kZXggeCA9IHEtPmRlcFtkK1NGUV9ERVBUSF0ubmV4dDsKKwkJc2tiID0gcS0+cXNbeF0ucHJldjsKKwkJbGVuID0gc2tiLT5sZW47CisJCV9fc2tiX3VubGluayhza2IsICZxLT5xc1t4XSk7CisJCWtmcmVlX3NrYihza2IpOworCQlzZnFfZGVjKHEsIHgpOworCQlzY2gtPnEucWxlbi0tOworCQlzY2gtPnFzdGF0cy5kcm9wcysrOworCQlyZXR1cm4gbGVuOworCX0KKworCWlmIChkID09IDEpIHsKKwkJLyogSXQgaXMgZGlmZmljdWx0IHRvIGJlbGlldmUsIGJ1dCBBTEwgVEhFIFNMT1RTIEhBVkUgTEVOR1RIIDEuICovCisJCWQgPSBxLT5uZXh0W3EtPnRhaWxdOworCQlxLT5uZXh0W3EtPnRhaWxdID0gcS0+bmV4dFtkXTsKKwkJcS0+YWxsb3RbcS0+bmV4dFtkXV0gKz0gcS0+cXVhbnR1bTsKKwkJc2tiID0gcS0+cXNbZF0ucHJldjsKKwkJbGVuID0gc2tiLT5sZW47CisJCV9fc2tiX3VubGluayhza2IsICZxLT5xc1tkXSk7CisJCWtmcmVlX3NrYihza2IpOworCQlzZnFfZGVjKHEsIGQpOworCQlzY2gtPnEucWxlbi0tOworCQlxLT5odFtxLT5oYXNoW2RdXSA9IFNGUV9ERVBUSDsKKwkJc2NoLT5xc3RhdHMuZHJvcHMrKzsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc2ZxX2VucXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjKiBzY2gpCit7CisJc3RydWN0IHNmcV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXVuc2lnbmVkIGhhc2ggPSBzZnFfaGFzaChxLCBza2IpOworCXNmcV9pbmRleCB4OworCisJeCA9IHEtPmh0W2hhc2hdOworCWlmICh4ID09IFNGUV9ERVBUSCkgeworCQlxLT5odFtoYXNoXSA9IHggPSBxLT5kZXBbU0ZRX0RFUFRIXS5uZXh0OworCQlxLT5oYXNoW3hdID0gaGFzaDsKKwl9CisJX19za2JfcXVldWVfdGFpbCgmcS0+cXNbeF0sIHNrYik7CisJc2ZxX2luYyhxLCB4KTsKKwlpZiAocS0+cXNbeF0ucWxlbiA9PSAxKSB7CQkvKiBUaGUgZmxvdyBpcyBuZXcgKi8KKwkJaWYgKHEtPnRhaWwgPT0gU0ZRX0RFUFRIKSB7CS8qIEl0IGlzIHRoZSBmaXJzdCBmbG93ICovCisJCQlxLT50YWlsID0geDsKKwkJCXEtPm5leHRbeF0gPSB4OworCQkJcS0+YWxsb3RbeF0gPSBxLT5xdWFudHVtOworCQl9IGVsc2UgeworCQkJcS0+bmV4dFt4XSA9IHEtPm5leHRbcS0+dGFpbF07CisJCQlxLT5uZXh0W3EtPnRhaWxdID0geDsKKwkJCXEtPnRhaWwgPSB4OworCQl9CisJfQorCWlmICgrK3NjaC0+cS5xbGVuIDwgcS0+bGltaXQtMSkgeworCQlzY2gtPmJzdGF0cy5ieXRlcyArPSBza2ItPmxlbjsKKwkJc2NoLT5ic3RhdHMucGFja2V0cysrOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZnFfZHJvcChzY2gpOworCXJldHVybiBORVRfWE1JVF9DTjsKK30KKworc3RhdGljIGludAorc2ZxX3JlcXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjKiBzY2gpCit7CisJc3RydWN0IHNmcV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXVuc2lnbmVkIGhhc2ggPSBzZnFfaGFzaChxLCBza2IpOworCXNmcV9pbmRleCB4OworCisJeCA9IHEtPmh0W2hhc2hdOworCWlmICh4ID09IFNGUV9ERVBUSCkgeworCQlxLT5odFtoYXNoXSA9IHggPSBxLT5kZXBbU0ZRX0RFUFRIXS5uZXh0OworCQlxLT5oYXNoW3hdID0gaGFzaDsKKwl9CisJX19za2JfcXVldWVfaGVhZCgmcS0+cXNbeF0sIHNrYik7CisJc2ZxX2luYyhxLCB4KTsKKwlpZiAocS0+cXNbeF0ucWxlbiA9PSAxKSB7CQkvKiBUaGUgZmxvdyBpcyBuZXcgKi8KKwkJaWYgKHEtPnRhaWwgPT0gU0ZRX0RFUFRIKSB7CS8qIEl0IGlzIHRoZSBmaXJzdCBmbG93ICovCisJCQlxLT50YWlsID0geDsKKwkJCXEtPm5leHRbeF0gPSB4OworCQkJcS0+YWxsb3RbeF0gPSBxLT5xdWFudHVtOworCQl9IGVsc2UgeworCQkJcS0+bmV4dFt4XSA9IHEtPm5leHRbcS0+dGFpbF07CisJCQlxLT5uZXh0W3EtPnRhaWxdID0geDsKKwkJCXEtPnRhaWwgPSB4OworCQl9CisJfQorCWlmICgrK3NjaC0+cS5xbGVuIDwgcS0+bGltaXQgLSAxKSB7CisJCXNjaC0+cXN0YXRzLnJlcXVldWVzKys7CisJCXJldHVybiAwOworCX0KKworCXNjaC0+cXN0YXRzLmRyb3BzKys7CisJc2ZxX2Ryb3Aoc2NoKTsKKwlyZXR1cm4gTkVUX1hNSVRfQ047Cit9CisKKworCisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCitzZnFfZGVxdWV1ZShzdHJ1Y3QgUWRpc2MqIHNjaCkKK3sKKwlzdHJ1Y3Qgc2ZxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzZnFfaW5kZXggYSwgb2xkX2E7CisKKwkvKiBObyBhY3RpdmUgc2xvdHMgKi8KKwlpZiAocS0+dGFpbCA9PSBTRlFfREVQVEgpCisJCXJldHVybiBOVUxMOworCisJYSA9IG9sZF9hID0gcS0+bmV4dFtxLT50YWlsXTsKKworCS8qIEdyYWIgcGFja2V0ICovCisJc2tiID0gX19za2JfZGVxdWV1ZSgmcS0+cXNbYV0pOworCXNmcV9kZWMocSwgYSk7CisJc2NoLT5xLnFsZW4tLTsKKworCS8qIElzIHRoZSBzbG90IGVtcHR5PyAqLworCWlmIChxLT5xc1thXS5xbGVuID09IDApIHsKKwkJcS0+aHRbcS0+aGFzaFthXV0gPSBTRlFfREVQVEg7CisJCWEgPSBxLT5uZXh0W2FdOworCQlpZiAoYSA9PSBvbGRfYSkgeworCQkJcS0+dGFpbCA9IFNGUV9ERVBUSDsKKwkJCXJldHVybiBza2I7CisJCX0KKwkJcS0+bmV4dFtxLT50YWlsXSA9IGE7CisJCXEtPmFsbG90W2FdICs9IHEtPnF1YW50dW07CisJfSBlbHNlIGlmICgocS0+YWxsb3RbYV0gLT0gc2tiLT5sZW4pIDw9IDApIHsKKwkJcS0+dGFpbCA9IGE7CisJCWEgPSBxLT5uZXh0W2FdOworCQlxLT5hbGxvdFthXSArPSBxLT5xdWFudHVtOworCX0KKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgdm9pZAorc2ZxX3Jlc2V0KHN0cnVjdCBRZGlzYyogc2NoKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwl3aGlsZSAoKHNrYiA9IHNmcV9kZXF1ZXVlKHNjaCkpICE9IE5VTEwpCisJCWtmcmVlX3NrYihza2IpOworfQorCitzdGF0aWMgdm9pZCBzZnFfcGVydHVyYmF0aW9uKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBRZGlzYyAqc2NoID0gKHN0cnVjdCBRZGlzYyopYXJnOworCXN0cnVjdCBzZnFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKworCXEtPnBlcnR1cmJhdGlvbiA9IG5ldF9yYW5kb20oKSYweDFGOworCisJaWYgKHEtPnBlcnR1cmJfcGVyaW9kKSB7CisJCXEtPnBlcnR1cmJfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBxLT5wZXJ0dXJiX3BlcmlvZDsKKwkJYWRkX3RpbWVyKCZxLT5wZXJ0dXJiX3RpbWVyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2ZxX2NoYW5nZShzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IHJ0YXR0ciAqb3B0KQoreworCXN0cnVjdCBzZnFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlzdHJ1Y3QgdGNfc2ZxX3FvcHQgKmN0bCA9IFJUQV9EQVRBKG9wdCk7CisKKwlpZiAob3B0LT5ydGFfbGVuIDwgUlRBX0xFTkdUSChzaXplb2YoKmN0bCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNjaF90cmVlX2xvY2soc2NoKTsKKwlxLT5xdWFudHVtID0gY3RsLT5xdWFudHVtID8gOiBwc2NoZWRfbXR1KHNjaC0+ZGV2KTsKKwlxLT5wZXJ0dXJiX3BlcmlvZCA9IGN0bC0+cGVydHVyYl9wZXJpb2QqSFo7CisJaWYgKGN0bC0+bGltaXQpCisJCXEtPmxpbWl0ID0gbWluX3QodTMyLCBjdGwtPmxpbWl0LCBTRlFfREVQVEgpOworCisJd2hpbGUgKHNjaC0+cS5xbGVuID49IHEtPmxpbWl0LTEpCisJCXNmcV9kcm9wKHNjaCk7CisKKwlkZWxfdGltZXIoJnEtPnBlcnR1cmJfdGltZXIpOworCWlmIChxLT5wZXJ0dXJiX3BlcmlvZCkgeworCQlxLT5wZXJ0dXJiX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgcS0+cGVydHVyYl9wZXJpb2Q7CisJCWFkZF90aW1lcigmcS0+cGVydHVyYl90aW1lcik7CisJfQorCXNjaF90cmVlX3VubG9jayhzY2gpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNmcV9pbml0KHN0cnVjdCBRZGlzYyAqc2NoLCBzdHJ1Y3QgcnRhdHRyICpvcHQpCit7CisJc3RydWN0IHNmcV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCWludCBpOworCisJaW5pdF90aW1lcigmcS0+cGVydHVyYl90aW1lcik7CisJcS0+cGVydHVyYl90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpc2NoOworCXEtPnBlcnR1cmJfdGltZXIuZnVuY3Rpb24gPSBzZnFfcGVydHVyYmF0aW9uOworCisJZm9yIChpPTA7IGk8U0ZRX0hBU0hfRElWSVNPUjsgaSsrKQorCQlxLT5odFtpXSA9IFNGUV9ERVBUSDsKKwlmb3IgKGk9MDsgaTxTRlFfREVQVEg7IGkrKykgeworCQlza2JfcXVldWVfaGVhZF9pbml0KCZxLT5xc1tpXSk7CisJCXEtPmRlcFtpK1NGUV9ERVBUSF0ubmV4dCA9IGkrU0ZRX0RFUFRIOworCQlxLT5kZXBbaStTRlFfREVQVEhdLnByZXYgPSBpK1NGUV9ERVBUSDsKKwl9CisJcS0+bGltaXQgPSBTRlFfREVQVEg7CisJcS0+bWF4X2RlcHRoID0gMDsKKwlxLT50YWlsID0gU0ZRX0RFUFRIOworCWlmIChvcHQgPT0gTlVMTCkgeworCQlxLT5xdWFudHVtID0gcHNjaGVkX210dShzY2gtPmRldik7CisJCXEtPnBlcnR1cmJfcGVyaW9kID0gMDsKKwl9IGVsc2UgeworCQlpbnQgZXJyID0gc2ZxX2NoYW5nZShzY2gsIG9wdCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwlmb3IgKGk9MDsgaTxTRlFfREVQVEg7IGkrKykKKwkJc2ZxX2xpbmsocSwgaSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNmcV9kZXN0cm95KHN0cnVjdCBRZGlzYyAqc2NoKQoreworCXN0cnVjdCBzZnFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlkZWxfdGltZXIoJnEtPnBlcnR1cmJfdGltZXIpOworfQorCitzdGF0aWMgaW50IHNmcV9kdW1wKHN0cnVjdCBRZGlzYyAqc2NoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBzZnFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYi0+dGFpbDsKKwlzdHJ1Y3QgdGNfc2ZxX3FvcHQgb3B0OworCisJb3B0LnF1YW50dW0gPSBxLT5xdWFudHVtOworCW9wdC5wZXJ0dXJiX3BlcmlvZCA9IHEtPnBlcnR1cmJfcGVyaW9kL0haOworCisJb3B0LmxpbWl0ID0gcS0+bGltaXQ7CisJb3B0LmRpdmlzb3IgPSBTRlFfSEFTSF9ESVZJU09SOworCW9wdC5mbG93cyA9IHEtPmxpbWl0OworCisJUlRBX1BVVChza2IsIFRDQV9PUFRJT05TLCBzaXplb2Yob3B0KSwgJm9wdCk7CisKKwlyZXR1cm4gc2tiLT5sZW47CisKK3J0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgc3RydWN0IFFkaXNjX29wcyBzZnFfcWRpc2Nfb3BzID0geworCS5uZXh0CQk9CU5VTEwsCisJLmNsX29wcwkJPQlOVUxMLAorCS5pZAkJPQkic2ZxIiwKKwkucHJpdl9zaXplCT0Jc2l6ZW9mKHN0cnVjdCBzZnFfc2NoZWRfZGF0YSksCisJLmVucXVldWUJPQlzZnFfZW5xdWV1ZSwKKwkuZGVxdWV1ZQk9CXNmcV9kZXF1ZXVlLAorCS5yZXF1ZXVlCT0Jc2ZxX3JlcXVldWUsCisJLmRyb3AJCT0Jc2ZxX2Ryb3AsCisJLmluaXQJCT0Jc2ZxX2luaXQsCisJLnJlc2V0CQk9CXNmcV9yZXNldCwKKwkuZGVzdHJveQk9CXNmcV9kZXN0cm95LAorCS5jaGFuZ2UJCT0JTlVMTCwKKwkuZHVtcAkJPQlzZnFfZHVtcCwKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzZnFfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfcWRpc2MoJnNmcV9xZGlzY19vcHMpOworfQorc3RhdGljIHZvaWQgX19leGl0IHNmcV9tb2R1bGVfZXhpdCh2b2lkKSAKK3sKKwl1bnJlZ2lzdGVyX3FkaXNjKCZzZnFfcWRpc2Nfb3BzKTsKK30KK21vZHVsZV9pbml0KHNmcV9tb2R1bGVfaW5pdCkKK21vZHVsZV9leGl0KHNmcV9tb2R1bGVfZXhpdCkKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfdGJmLmMgYi9uZXQvc2NoZWQvc2NoX3RiZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiOTcxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2NoZWQvc2NoX3RiZi5jCkBAIC0wLDAgKzEsNTQzIEBACisvKgorICogbmV0L3NjaGVkL3NjaF90YmYuYwlUb2tlbiBCdWNrZXQgRmlsdGVyIHF1ZXVlLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CUFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCQlEbWl0cnkgVG9yb2tob3YgPGR0b3JAbWFpbC5ydT4gLSBhbGxvdyBhdHRhY2hpbmcgaW5uZXIgcWRpc2NzIC0KKyAqCQkJCQkJIG9yaWdpbmFsIGlkZWEgYnkgTWFydGluIERldmVyYQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KKworCisvKglTaW1wbGUgVG9rZW4gQnVja2V0IEZpbHRlci4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVNPVVJDRS4KKwktLS0tLS0tCisKKwlOb25lLgorCisJRGVzY3JpcHRpb24uCisJLS0tLS0tLS0tLS0tCisKKwlBIGRhdGEgZmxvdyBvYmV5cyBUQkYgd2l0aCByYXRlIFIgYW5kIGRlcHRoIEIsIGlmIGZvciBhbnkKKwl0aW1lIGludGVydmFsIHRfaS4uLnRfZiB0aGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGJpdHMKKwlkb2VzIG5vdCBleGNlZWQgQiArIFIqKHRfZi10X2kpLgorCisJUGFja2V0aXplZCB2ZXJzaW9uIG9mIHRoaXMgZGVmaW5pdGlvbjoKKwlUaGUgc2VxdWVuY2Ugb2YgcGFja2V0cyBvZiBzaXplcyBzX2kgc2VydmVkIGF0IG1vbWVudHMgdF9pCisJb2JleXMgVEJGLCBpZiBmb3IgYW55IGk8PWs6CisKKwlzX2krLi4uLitzX2sgPD0gQiArIFIqKHRfayAtIHRfaSkKKworCUFsZ29yaXRobS4KKwktLS0tLS0tLS0tCisKKwlMZXQgTih0X2kpIGJlIEIvUiBpbml0aWFsbHkgYW5kIE4odCkgZ3JvdyBjb250aW51b3VzbHkgd2l0aCB0aW1lIGFzOgorCisJTih0K2RlbHRhKSA9IG1pbntCL1IsIE4odCkgKyBkZWx0YX0KKworCUlmIHRoZSBmaXJzdCBwYWNrZXQgaW4gcXVldWUgaGFzIGxlbmd0aCBTLCBpdCBtYXkgYmUKKwl0cmFuc21pdHRlZCBvbmx5IGF0IHRoZSB0aW1lIHRfKiB3aGVuIFMvUiA8PSBOKHRfKiksCisJYW5kIGluIHRoaXMgY2FzZSBOKHQpIGp1bXBzOgorCisJTih0XyogKyAwKSA9IE4odF8qIC0gMCkgLSBTL1IuCisKKworCisJQWN0dWFsbHksIFFvUyByZXF1aXJlcyB0d28gVEJGIHRvIGJlIGFwcGxpZWQgdG8gYSBkYXRhIHN0cmVhbS4KKwlPbmUgb2YgdGhlbSBjb250cm9scyBzdGVhZHkgc3RhdGUgYnVyc3Qgc2l6ZSwgYW5vdGhlcgorCW9uZSB3aXRoIHJhdGUgUCAocGVhayByYXRlKSBhbmQgZGVwdGggTSAoZXF1YWwgdG8gbGluayBNVFUpCisJbGltaXRzIGJ1cnN0cyBhdCBhIHNtYWxsZXIgdGltZSBzY2FsZS4KKworCUl0IGlzIGVhc3kgdG8gc2VlIHRoYXQgUD5SLCBhbmQgQj5NLiBJZiBQIGlzIGluZmluaXR5LCB0aGlzIGRvdWJsZQorCVRCRiBpcyBlcXVpdmFsZW50IHRvIGEgc2luZ2xlIG9uZS4KKworCVdoZW4gVEJGIHdvcmtzIGluIHJlc2hhcGluZyBtb2RlLCBsYXRlbmN5IGlzIGVzdGltYXRlZCBhczoKKworCWxhdCA9IG1heCAoKEwtQikvUiwgKEwtTSkvUCkKKworCisJTk9URVMuCisJLS0tLS0tCisKKwlJZiBUQkYgdGhyb3R0bGVzLCBpdCBzdGFydHMgYSB3YXRjaGRvZyB0aW1lciwgd2hpY2ggd2lsbCB3YWtlIGl0IHVwCisJd2hlbiBpdCBpcyByZWFkeSB0byB0cmFuc21pdC4KKwlOb3RlIHRoYXQgdGhlIG1pbmltYWwgdGltZXIgcmVzb2x1dGlvbiBpcyAxL0haLgorCUlmIG5vIG5ldyBwYWNrZXRzIGFycml2ZSBkdXJpbmcgdGhpcyBwZXJpb2QsCisJb3IgaWYgdGhlIGRldmljZSBpcyBub3QgYXdha2VuIGJ5IEVPSSBmb3Igc29tZSBwcmV2aW91cyBwYWNrZXQsCisJVEJGIGNhbiBzdG9wIGl0cyBhY3Rpdml0eSBmb3IgMS9IWi4KKworCisJVGhpcyBtZWFucywgdGhhdCB3aXRoIGRlcHRoIEIsIHRoZSBtYXhpbWFsIHJhdGUgaXMKKworCVJfY3JpdCA9IEIqSFoKKworCUYuZS4gZm9yIDEwTWJpdCBldGhlcm5ldCBhbmQgSFo9MTAwIHRoZSBtaW5pbWFsIGFsbG93ZWQgQiBpcyB+MTBLYnl0ZXMuCisKKwlOb3RlIHRoYXQgdGhlIHBlYWsgcmF0ZSBUQkYgaXMgbXVjaCBtb3JlIHRvdWdoOiB3aXRoIE1UVSAxNTAwCisJUF9jcml0ID0gMTUwS2J5dGVzL3NlYy4gU28sIGlmIHlvdSBuZWVkIGdyZWF0ZXIgcGVhaworCXJhdGVzLCB1c2UgYWxwaGEgd2l0aCBIWj0xMDAwIDotKQorCisJV2l0aCBjbGFzc2Z1bCBUQkYsIGxpbWl0IGlzIGp1c3Qga2VwdCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisJSXQgaXMgcGFzc2VkIHRvIHRoZSBkZWZhdWx0IGJmaWZvIHFkaXNjIC0gaWYgdGhlIGlubmVyIHFkaXNjIGlzCisJY2hhbmdlZCB0aGUgbGltaXQgaXMgbm90IGVmZmVjdGl2ZSBhbnltb3JlLgorKi8KKworc3RydWN0IHRiZl9zY2hlZF9kYXRhCit7CisvKiBQYXJhbWV0ZXJzICovCisJdTMyCQlsaW1pdDsJCS8qIE1heGltYWwgbGVuZ3RoIG9mIGJhY2tsb2c6IGJ5dGVzICovCisJdTMyCQlidWZmZXI7CQkvKiBUb2tlbiBidWNrZXQgZGVwdGgvcmF0ZTogTVVTVCBCRSA+PSBNVFUvQiAqLworCXUzMgkJbXR1OworCXUzMgkJbWF4X3NpemU7CisJc3RydWN0IHFkaXNjX3JhdGVfdGFibGUJKlJfdGFiOworCXN0cnVjdCBxZGlzY19yYXRlX3RhYmxlCSpQX3RhYjsKKworLyogVmFyaWFibGVzICovCisJbG9uZwl0b2tlbnM7CQkJLyogQ3VycmVudCBudW1iZXIgb2YgQiB0b2tlbnMgKi8KKwlsb25nCXB0b2tlbnM7CQkvKiBDdXJyZW50IG51bWJlciBvZiBQIHRva2VucyAqLworCXBzY2hlZF90aW1lX3QJdF9jOwkJLyogVGltZSBjaGVjay1wb2ludCAqLworCXN0cnVjdCB0aW1lcl9saXN0IHdkX3RpbWVyOwkvKiBXYXRjaGRvZyB0aW1lciAqLworCXN0cnVjdCBRZGlzYwkqcWRpc2M7CQkvKiBJbm5lciBxZGlzYywgZGVmYXVsdCAtIGJmaWZvIHF1ZXVlICovCit9OworCisjZGVmaW5lIEwyVChxLEwpICAgKChxKS0+Ul90YWItPmRhdGFbKEwpPj4ocSktPlJfdGFiLT5yYXRlLmNlbGxfbG9nXSkKKyNkZWZpbmUgTDJUX1AocSxMKSAoKHEpLT5QX3RhYi0+ZGF0YVsoTCk+PihxKS0+UF90YWItPnJhdGUuY2VsbF9sb2ddKQorCitzdGF0aWMgaW50IHRiZl9lbnF1ZXVlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBRZGlzYyogc2NoKQoreworCXN0cnVjdCB0YmZfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlpbnQgcmV0OworCisJaWYgKHNrYi0+bGVuID4gcS0+bWF4X3NpemUpIHsKKwkJc2NoLT5xc3RhdHMuZHJvcHMrKzsKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19QT0xJQ0UKKwkJaWYgKHNjaC0+cmVzaGFwZV9mYWlsID09IE5VTEwgfHwgc2NoLT5yZXNoYXBlX2ZhaWwoc2tiLCBzY2gpKQorI2VuZGlmCisJCQlrZnJlZV9za2Ioc2tiKTsKKworCQlyZXR1cm4gTkVUX1hNSVRfRFJPUDsKKwl9CisKKwlpZiAoKHJldCA9IHEtPnFkaXNjLT5lbnF1ZXVlKHNrYiwgcS0+cWRpc2MpKSAhPSAwKSB7CisJCXNjaC0+cXN0YXRzLmRyb3BzKys7CisJCXJldHVybiByZXQ7CisJfQorCisJc2NoLT5xLnFsZW4rKzsKKwlzY2gtPmJzdGF0cy5ieXRlcyArPSBza2ItPmxlbjsKKwlzY2gtPmJzdGF0cy5wYWNrZXRzKys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGJmX3JlcXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjKiBzY2gpCit7CisJc3RydWN0IHRiZl9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCWludCByZXQ7CisKKwlpZiAoKHJldCA9IHEtPnFkaXNjLT5vcHMtPnJlcXVldWUoc2tiLCBxLT5xZGlzYykpID09IDApIHsKKwkJc2NoLT5xLnFsZW4rKzsKKwkJc2NoLT5xc3RhdHMucmVxdWV1ZXMrKzsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHRiZl9kcm9wKHN0cnVjdCBRZGlzYyogc2NoKQoreworCXN0cnVjdCB0YmZfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJaWYgKChsZW4gPSBxLT5xZGlzYy0+b3BzLT5kcm9wKHEtPnFkaXNjKSkgIT0gMCkgeworCQlzY2gtPnEucWxlbi0tOworCQlzY2gtPnFzdGF0cy5kcm9wcysrOworCX0KKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgdm9pZCB0YmZfd2F0Y2hkb2codW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IFFkaXNjICpzY2ggPSAoc3RydWN0IFFkaXNjKilhcmc7CisKKwlzY2gtPmZsYWdzICY9IH5UQ1FfRl9USFJPVFRMRUQ7CisJbmV0aWZfc2NoZWR1bGUoc2NoLT5kZXYpOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnRiZl9kZXF1ZXVlKHN0cnVjdCBRZGlzYyogc2NoKQoreworCXN0cnVjdCB0YmZfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc2tiID0gcS0+cWRpc2MtPmRlcXVldWUocS0+cWRpc2MpOworCisJaWYgKHNrYikgeworCQlwc2NoZWRfdGltZV90IG5vdzsKKwkJbG9uZyB0b2tzLCBkZWxheTsKKwkJbG9uZyBwdG9rcyA9IDA7CisJCXVuc2lnbmVkIGludCBsZW4gPSBza2ItPmxlbjsKKworCQlQU0NIRURfR0VUX1RJTUUobm93KTsKKworCQl0b2tzID0gUFNDSEVEX1RESUZGX1NBRkUobm93LCBxLT50X2MsIHEtPmJ1ZmZlcik7CisKKwkJaWYgKHEtPlBfdGFiKSB7CisJCQlwdG9rcyA9IHRva3MgKyBxLT5wdG9rZW5zOworCQkJaWYgKHB0b2tzID4gKGxvbmcpcS0+bXR1KQorCQkJCXB0b2tzID0gcS0+bXR1OworCQkJcHRva3MgLT0gTDJUX1AocSwgbGVuKTsKKwkJfQorCQl0b2tzICs9IHEtPnRva2VuczsKKwkJaWYgKHRva3MgPiAobG9uZylxLT5idWZmZXIpCisJCQl0b2tzID0gcS0+YnVmZmVyOworCQl0b2tzIC09IEwyVChxLCBsZW4pOworCisJCWlmICgodG9rc3xwdG9rcykgPj0gMCkgeworCQkJcS0+dF9jID0gbm93OworCQkJcS0+dG9rZW5zID0gdG9rczsKKwkJCXEtPnB0b2tlbnMgPSBwdG9rczsKKwkJCXNjaC0+cS5xbGVuLS07CisJCQlzY2gtPmZsYWdzICY9IH5UQ1FfRl9USFJPVFRMRUQ7CisJCQlyZXR1cm4gc2tiOworCQl9CisKKwkJZGVsYXkgPSBQU0NIRURfVVMySklGRklFKG1heF90KGxvbmcsIC10b2tzLCAtcHRva3MpKTsKKworCQlpZiAoZGVsYXkgPT0gMCkKKwkJCWRlbGF5ID0gMTsKKworCQltb2RfdGltZXIoJnEtPndkX3RpbWVyLCBqaWZmaWVzK2RlbGF5KTsKKworCQkvKiBNYXliZSB3ZSBoYXZlIGEgc2hvcnRlciBwYWNrZXQgaW4gdGhlIHF1ZXVlLAorCQkgICB3aGljaCBjYW4gYmUgc2VudCBub3cuIEl0IHNvdW5kcyBjb29sLAorCQkgICBidXQsIGhvd2V2ZXIsIHRoaXMgaXMgd3JvbmcgaW4gcHJpbmNpcGxlLgorCQkgICBXZSBNVVNUIE5PVCByZW9yZGVyIHBhY2tldHMgdW5kZXIgdGhlc2UgY2lyY3Vtc3RhbmNlcy4KKworCQkgICBSZWFsbHksIGlmIHdlIHNwbGl0IHRoZSBmbG93IGludG8gaW5kZXBlbmRlbnQKKwkJICAgc3ViZmxvd3MsIGl0IHdvdWxkIGJlIGEgdmVyeSBnb29kIHNvbHV0aW9uLgorCQkgICBUaGlzIGlzIHRoZSBtYWluIGlkZWEgb2YgYWxsIEZRIGFsZ29yaXRobXMKKwkJICAgKGNmLiBDU1osIEhQRlEsIEhGU0MpCisJCSAqLworCisJCWlmIChxLT5xZGlzYy0+b3BzLT5yZXF1ZXVlKHNrYiwgcS0+cWRpc2MpICE9IE5FVF9YTUlUX1NVQ0NFU1MpIHsKKwkJCS8qIFdoZW4gcmVxdWV1ZSBmYWlscyBza2IgaXMgZHJvcHBlZCAqLworCQkJc2NoLT5xLnFsZW4tLTsKKwkJCXNjaC0+cXN0YXRzLmRyb3BzKys7CisJCX0KKworCQlzY2gtPmZsYWdzIHw9IFRDUV9GX1RIUk9UVExFRDsKKwkJc2NoLT5xc3RhdHMub3ZlcmxpbWl0cysrOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgdGJmX3Jlc2V0KHN0cnVjdCBRZGlzYyogc2NoKQoreworCXN0cnVjdCB0YmZfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKworCXFkaXNjX3Jlc2V0KHEtPnFkaXNjKTsKKwlzY2gtPnEucWxlbiA9IDA7CisJUFNDSEVEX0dFVF9USU1FKHEtPnRfYyk7CisJcS0+dG9rZW5zID0gcS0+YnVmZmVyOworCXEtPnB0b2tlbnMgPSBxLT5tdHU7CisJc2NoLT5mbGFncyAmPSB+VENRX0ZfVEhST1RUTEVEOworCWRlbF90aW1lcigmcS0+d2RfdGltZXIpOworfQorCitzdGF0aWMgc3RydWN0IFFkaXNjICp0YmZfY3JlYXRlX2RmbHRfcWRpc2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGxpbWl0KQoreworCXN0cnVjdCBRZGlzYyAqcSA9IHFkaXNjX2NyZWF0ZV9kZmx0KGRldiwgJmJmaWZvX3FkaXNjX29wcyk7CisgICAgICAgIHN0cnVjdCBydGF0dHIgKnJ0YTsKKwlpbnQgcmV0OworCisJaWYgKHEpIHsKKwkJcnRhID0ga21hbGxvYyhSVEFfTEVOR1RIKHNpemVvZihzdHJ1Y3QgdGNfZmlmb19xb3B0KSksIEdGUF9LRVJORUwpOworCQlpZiAocnRhKSB7CisJCQlydGEtPnJ0YV90eXBlID0gUlRNX05FV1FESVNDOworCQkJcnRhLT5ydGFfbGVuID0gUlRBX0xFTkdUSChzaXplb2Yoc3RydWN0IHRjX2ZpZm9fcW9wdCkpOyAKKwkJCSgoc3RydWN0IHRjX2ZpZm9fcW9wdCAqKVJUQV9EQVRBKHJ0YSkpLT5saW1pdCA9IGxpbWl0OworCisJCQlyZXQgPSBxLT5vcHMtPmNoYW5nZShxLCBydGEpOworCQkJa2ZyZWUocnRhKTsKKworCQkJaWYgKHJldCA9PSAwKQorCQkJCXJldHVybiBxOworCQl9CisJCXFkaXNjX2Rlc3Ryb3kocSk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgdGJmX2NoYW5nZShzdHJ1Y3QgUWRpc2MqIHNjaCwgc3RydWN0IHJ0YXR0ciAqb3B0KQoreworCWludCBlcnIgPSAtRUlOVkFMOworCXN0cnVjdCB0YmZfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlzdHJ1Y3QgcnRhdHRyICp0YltUQ0FfVEJGX1BUQUJdOworCXN0cnVjdCB0Y190YmZfcW9wdCAqcW9wdDsKKwlzdHJ1Y3QgcWRpc2NfcmF0ZV90YWJsZSAqcnRhYiA9IE5VTEw7CisJc3RydWN0IHFkaXNjX3JhdGVfdGFibGUgKnB0YWIgPSBOVUxMOworCXN0cnVjdCBRZGlzYyAqY2hpbGQgPSBOVUxMOworCWludCBtYXhfc2l6ZSxuOworCisJaWYgKHJ0YXR0cl9wYXJzZV9uZXN0ZWQodGIsIFRDQV9UQkZfUFRBQiwgb3B0KSB8fAorCSAgICB0YltUQ0FfVEJGX1BBUk1TLTFdID09IE5VTEwgfHwKKwkgICAgUlRBX1BBWUxPQUQodGJbVENBX1RCRl9QQVJNUy0xXSkgPCBzaXplb2YoKnFvcHQpKQorCQlnb3RvIGRvbmU7CisKKwlxb3B0ID0gUlRBX0RBVEEodGJbVENBX1RCRl9QQVJNUy0xXSk7CisJcnRhYiA9IHFkaXNjX2dldF9ydGFiKCZxb3B0LT5yYXRlLCB0YltUQ0FfVEJGX1JUQUItMV0pOworCWlmIChydGFiID09IE5VTEwpCisJCWdvdG8gZG9uZTsKKworCWlmIChxb3B0LT5wZWFrcmF0ZS5yYXRlKSB7CisJCWlmIChxb3B0LT5wZWFrcmF0ZS5yYXRlID4gcW9wdC0+cmF0ZS5yYXRlKQorCQkJcHRhYiA9IHFkaXNjX2dldF9ydGFiKCZxb3B0LT5wZWFrcmF0ZSwgdGJbVENBX1RCRl9QVEFCLTFdKTsKKwkJaWYgKHB0YWIgPT0gTlVMTCkKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwlmb3IgKG4gPSAwOyBuIDwgMjU2OyBuKyspCisJCWlmIChydGFiLT5kYXRhW25dID4gcW9wdC0+YnVmZmVyKSBicmVhazsKKwltYXhfc2l6ZSA9IChuIDw8IHFvcHQtPnJhdGUuY2VsbF9sb2cpLTE7CisJaWYgKHB0YWIpIHsKKwkJaW50IHNpemU7CisKKwkJZm9yIChuID0gMDsgbiA8IDI1NjsgbisrKQorCQkJaWYgKHB0YWItPmRhdGFbbl0gPiBxb3B0LT5tdHUpIGJyZWFrOworCQlzaXplID0gKG4gPDwgcW9wdC0+cGVha3JhdGUuY2VsbF9sb2cpLTE7CisJCWlmIChzaXplIDwgbWF4X3NpemUpIG1heF9zaXplID0gc2l6ZTsKKwl9CisJaWYgKG1heF9zaXplIDwgMCkKKwkJZ290byBkb25lOworCisJaWYgKHEtPnFkaXNjID09ICZub29wX3FkaXNjKSB7CisJCWlmICgoY2hpbGQgPSB0YmZfY3JlYXRlX2RmbHRfcWRpc2Moc2NoLT5kZXYsIHFvcHQtPmxpbWl0KSkgPT0gTlVMTCkKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwlzY2hfdHJlZV9sb2NrKHNjaCk7CisJaWYgKGNoaWxkKSBxLT5xZGlzYyA9IGNoaWxkOworCXEtPmxpbWl0ID0gcW9wdC0+bGltaXQ7CisJcS0+bXR1ID0gcW9wdC0+bXR1OworCXEtPm1heF9zaXplID0gbWF4X3NpemU7CisJcS0+YnVmZmVyID0gcW9wdC0+YnVmZmVyOworCXEtPnRva2VucyA9IHEtPmJ1ZmZlcjsKKwlxLT5wdG9rZW5zID0gcS0+bXR1OworCXJ0YWIgPSB4Y2hnKCZxLT5SX3RhYiwgcnRhYik7CisJcHRhYiA9IHhjaGcoJnEtPlBfdGFiLCBwdGFiKTsKKwlzY2hfdHJlZV91bmxvY2soc2NoKTsKKwllcnIgPSAwOworZG9uZToKKwlpZiAocnRhYikKKwkJcWRpc2NfcHV0X3J0YWIocnRhYik7CisJaWYgKHB0YWIpCisJCXFkaXNjX3B1dF9ydGFiKHB0YWIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdGJmX2luaXQoc3RydWN0IFFkaXNjKiBzY2gsIHN0cnVjdCBydGF0dHIgKm9wdCkKK3sKKwlzdHJ1Y3QgdGJmX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisKKwlpZiAob3B0ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJUFNDSEVEX0dFVF9USU1FKHEtPnRfYyk7CisJaW5pdF90aW1lcigmcS0+d2RfdGltZXIpOworCXEtPndkX3RpbWVyLmZ1bmN0aW9uID0gdGJmX3dhdGNoZG9nOworCXEtPndkX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylzY2g7CisKKwlxLT5xZGlzYyA9ICZub29wX3FkaXNjOworCisJcmV0dXJuIHRiZl9jaGFuZ2Uoc2NoLCBvcHQpOworfQorCitzdGF0aWMgdm9pZCB0YmZfZGVzdHJveShzdHJ1Y3QgUWRpc2MgKnNjaCkKK3sKKwlzdHJ1Y3QgdGJmX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisKKwlkZWxfdGltZXIoJnEtPndkX3RpbWVyKTsKKworCWlmIChxLT5QX3RhYikKKwkJcWRpc2NfcHV0X3J0YWIocS0+UF90YWIpOworCWlmIChxLT5SX3RhYikKKwkJcWRpc2NfcHV0X3J0YWIocS0+Ul90YWIpOworCisJcWRpc2NfZGVzdHJveShxLT5xZGlzYyk7Cit9CisKK3N0YXRpYyBpbnQgdGJmX2R1bXAoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHRiZl9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCXN0cnVjdCBydGF0dHIgKnJ0YTsKKwlzdHJ1Y3QgdGNfdGJmX3FvcHQgb3B0OworCisJcnRhID0gKHN0cnVjdCBydGF0dHIqKWI7CisJUlRBX1BVVChza2IsIFRDQV9PUFRJT05TLCAwLCBOVUxMKTsKKworCW9wdC5saW1pdCA9IHEtPmxpbWl0OworCW9wdC5yYXRlID0gcS0+Ul90YWItPnJhdGU7CisJaWYgKHEtPlBfdGFiKQorCQlvcHQucGVha3JhdGUgPSBxLT5QX3RhYi0+cmF0ZTsKKwllbHNlCisJCW1lbXNldCgmb3B0LnBlYWtyYXRlLCAwLCBzaXplb2Yob3B0LnBlYWtyYXRlKSk7CisJb3B0Lm10dSA9IHEtPm10dTsKKwlvcHQuYnVmZmVyID0gcS0+YnVmZmVyOworCVJUQV9QVVQoc2tiLCBUQ0FfVEJGX1BBUk1TLCBzaXplb2Yob3B0KSwgJm9wdCk7CisJcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gYjsKKworCXJldHVybiBza2ItPmxlbjsKKworcnRhdHRyX2ZhaWx1cmU6CisJc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgdGJmX2R1bXBfY2xhc3Moc3RydWN0IFFkaXNjICpzY2gsIHVuc2lnbmVkIGxvbmcgY2wsCisJCQkgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y21zZyAqdGNtKQoreworCXN0cnVjdCB0YmZfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKworCWlmIChjbCAhPSAxKSAJLyogb25seSBvbmUgY2xhc3MgKi8KKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwl0Y20tPnRjbV9oYW5kbGUgfD0gVENfSF9NSU4oMSk7CisJdGNtLT50Y21faW5mbyA9IHEtPnFkaXNjLT5oYW5kbGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YmZfZ3JhZnQoc3RydWN0IFFkaXNjICpzY2gsIHVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgUWRpc2MgKm5ldywKKwkJICAgICBzdHJ1Y3QgUWRpc2MgKipvbGQpCit7CisJc3RydWN0IHRiZl9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCisJaWYgKG5ldyA9PSBOVUxMKQorCQluZXcgPSAmbm9vcF9xZGlzYzsKKworCXNjaF90cmVlX2xvY2soc2NoKTsKKwkqb2xkID0geGNoZygmcS0+cWRpc2MsIG5ldyk7CisJcWRpc2NfcmVzZXQoKm9sZCk7CisJc2NoLT5xLnFsZW4gPSAwOworCXNjaF90cmVlX3VubG9jayhzY2gpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgUWRpc2MgKnRiZl9sZWFmKHN0cnVjdCBRZGlzYyAqc2NoLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgdGJmX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJcmV0dXJuIHEtPnFkaXNjOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0YmZfZ2V0KHN0cnVjdCBRZGlzYyAqc2NoLCB1MzIgY2xhc3NpZCkKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgdGJmX3B1dChzdHJ1Y3QgUWRpc2MgKnNjaCwgdW5zaWduZWQgbG9uZyBhcmcpCit7Cit9CisKK3N0YXRpYyBpbnQgdGJmX2NoYW5nZV9jbGFzcyhzdHJ1Y3QgUWRpc2MgKnNjaCwgdTMyIGNsYXNzaWQsIHUzMiBwYXJlbnRpZCwgCisJCQkgICAgc3RydWN0IHJ0YXR0ciAqKnRjYSwgdW5zaWduZWQgbG9uZyAqYXJnKQoreworCXJldHVybiAtRU5PU1lTOworfQorCitzdGF0aWMgaW50IHRiZl9kZWxldGUoc3RydWN0IFFkaXNjICpzY2gsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiAtRU5PU1lTOworfQorCitzdGF0aWMgdm9pZCB0YmZfd2FsayhzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IHFkaXNjX3dhbGtlciAqd2Fsa2VyKQoreworCWlmICghd2Fsa2VyLT5zdG9wKSB7CisJCWlmICh3YWxrZXItPmNvdW50ID49IHdhbGtlci0+c2tpcCkKKwkJCWlmICh3YWxrZXItPmZuKHNjaCwgMSwgd2Fsa2VyKSA8IDApIHsKKwkJCQl3YWxrZXItPnN0b3AgPSAxOworCQkJCXJldHVybjsKKwkJCX0KKwkJd2Fsa2VyLT5jb3VudCsrOworCX0KK30KKworc3RhdGljIHN0cnVjdCB0Y2ZfcHJvdG8gKip0YmZfZmluZF90Y2Yoc3RydWN0IFFkaXNjICpzY2gsIHVuc2lnbmVkIGxvbmcgY2wpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgUWRpc2NfY2xhc3Nfb3BzIHRiZl9jbGFzc19vcHMgPQoreworCS5ncmFmdAkJPQl0YmZfZ3JhZnQsCisJLmxlYWYJCT0JdGJmX2xlYWYsCisJLmdldAkJPQl0YmZfZ2V0LAorCS5wdXQJCT0JdGJmX3B1dCwKKwkuY2hhbmdlCQk9CXRiZl9jaGFuZ2VfY2xhc3MsCisJLmRlbGV0ZQkJPQl0YmZfZGVsZXRlLAorCS53YWxrCQk9CXRiZl93YWxrLAorCS50Y2ZfY2hhaW4JPQl0YmZfZmluZF90Y2YsCisJLmR1bXAJCT0JdGJmX2R1bXBfY2xhc3MsCit9OworCitzdGF0aWMgc3RydWN0IFFkaXNjX29wcyB0YmZfcWRpc2Nfb3BzID0geworCS5uZXh0CQk9CU5VTEwsCisJLmNsX29wcwkJPQkmdGJmX2NsYXNzX29wcywKKwkuaWQJCT0JInRiZiIsCisJLnByaXZfc2l6ZQk9CXNpemVvZihzdHJ1Y3QgdGJmX3NjaGVkX2RhdGEpLAorCS5lbnF1ZXVlCT0JdGJmX2VucXVldWUsCisJLmRlcXVldWUJPQl0YmZfZGVxdWV1ZSwKKwkucmVxdWV1ZQk9CXRiZl9yZXF1ZXVlLAorCS5kcm9wCQk9CXRiZl9kcm9wLAorCS5pbml0CQk9CXRiZl9pbml0LAorCS5yZXNldAkJPQl0YmZfcmVzZXQsCisJLmRlc3Ryb3kJPQl0YmZfZGVzdHJveSwKKwkuY2hhbmdlCQk9CXRiZl9jaGFuZ2UsCisJLmR1bXAJCT0JdGJmX2R1bXAsCisJLm93bmVyCQk9CVRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdGJmX21vZHVsZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX3FkaXNjKCZ0YmZfcWRpc2Nfb3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRiZl9tb2R1bGVfZXhpdCh2b2lkKQoreworCXVucmVnaXN0ZXJfcWRpc2MoJnRiZl9xZGlzY19vcHMpOworfQorbW9kdWxlX2luaXQodGJmX21vZHVsZV9pbml0KQorbW9kdWxlX2V4aXQodGJmX21vZHVsZV9leGl0KQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF90ZXFsLmMgYi9uZXQvc2NoZWQvc2NoX3RlcWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2YwMzQyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjaGVkL3NjaF90ZXFsLmMKQEAgLTAsMCArMSw1MTEgQEAKKy8qIG5ldC9zY2hlZC9zY2hfdGVxbC5jCSJUcnVlIiAob3IgInRyaXZpYWwiKSBsaW5rIGVxdWFsaXplci4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgorCisvKgorICAgSG93IHRvIHNldHVwIGl0LgorICAgLS0tLS0tLS0tLS0tLS0tLQorCisgICBBZnRlciBsb2FkaW5nIHRoaXMgbW9kdWxlIHlvdSB3aWxsIGZpbmQgYSBuZXcgZGV2aWNlIHRlcWxOCisgICBhbmQgbmV3IHFkaXNjIHdpdGggdGhlIHNhbWUgbmFtZS4gVG8gam9pbiBhIHNsYXZlIHRvIHRoZSBlcXVhbGl6ZXIKKyAgIHlvdSBzaG91bGQganVzdCBzZXQgdGhpcyBxZGlzYyBvbiBhIGRldmljZSBmLmUuCisKKyAgICMgdGMgcWRpc2MgYWRkIGRldiBldGgwIHJvb3QgdGVxbDAKKyAgICMgdGMgcWRpc2MgYWRkIGRldiBldGgxIHJvb3QgdGVxbDAKKworICAgVGhhdCdzIGFsbC4gRnVsbCBQblAgOCkKKworICAgQXBwbGljYWJpbGl0eS4KKyAgIC0tLS0tLS0tLS0tLS0tCisKKyAgIDEuIFNsYXZlIGRldmljZXMgTVVTVCBiZSBhY3RpdmUgZGV2aWNlcywgaS5lLiwgdGhleSBtdXN0IHJhaXNlIHRoZSB0YnVzeQorICAgICAgc2lnbmFsIGFuZCBnZW5lcmF0ZSBFT0kgZXZlbnRzLiBJZiB5b3Ugd2FudCB0byBlcXVhbGl6ZSB2aXJ0dWFsIGRldmljZXMKKyAgICAgIGxpa2UgdHVubmVscywgdXNlIGEgbm9ybWFsIGVxbCBkZXZpY2UuCisgICAyLiBUaGlzIGRldmljZSBwdXRzIG5vIGxpbWl0YXRpb25zIG9uIHBoeXNpY2FsIHNsYXZlIGNoYXJhY3RlcmlzdGljcworICAgICAgZi5lLiBpdCB3aWxsIGVxdWFsaXplIDk2MDBiYXVkIGxpbmUgYW5kIDEwME1iIGV0aGVybmV0IHBlcmZlY3RseSA6LSkKKyAgICAgIENlcnRhaW5seSwgbGFyZ2UgZGlmZmVyZW5jZSBpbiBsaW5rIHNwZWVkcyB3aWxsIG1ha2UgdGhlIHJlc3VsdGluZworICAgICAgZXFhbGl6ZWQgbGluayB1bnVzYWJsZSwgYmVjYXVzZSBvZiBodWdlIHBhY2tldCByZW9yZGVyaW5nLgorICAgICAgSSBlc3RpbWF0ZSBhbiB1cHBlciB1c2VmdWwgZGlmZmVyZW5jZSBhcyB+MTAgdGltZXMuCisgICAzLiBJZiB0aGUgc2xhdmUgcmVxdWlyZXMgYWRkcmVzcyByZXNvbHV0aW9uLCBvbmx5IHByb3RvY29scyB1c2luZworICAgICAgbmVpZ2hib3VyIGNhY2hlIChJUHY0L0lQdjYpIHdpbGwgd29yayBvdmVyIHRoZSBlcXVhbGl6ZWQgbGluay4KKyAgICAgIE90aGVyIHByb3RvY29scyBhcmUgc3RpbGwgYWxsb3dlZCB0byB1c2UgdGhlIHNsYXZlIGRldmljZSBkaXJlY3RseSwKKyAgICAgIHdoaWNoIHdpbGwgbm90IGJyZWFrIGxvYWQgYmFsYW5jaW5nLCB0aG91Z2ggbmF0aXZlIHNsYXZlCisgICAgICB0cmFmZmljIHdpbGwgaGF2ZSB0aGUgaGlnaGVzdCBwcmlvcml0eS4gICovCisKK3N0cnVjdCB0ZXFsX21hc3RlcgoreworCXN0cnVjdCBRZGlzY19vcHMgcW9wczsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBRZGlzYyAqc2xhdmVzOworCXN0cnVjdCBsaXN0X2hlYWQgbWFzdGVyX2xpc3Q7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7Cit9OworCitzdHJ1Y3QgdGVxbF9zY2hlZF9kYXRhCit7CisJc3RydWN0IFFkaXNjICpuZXh0OworCXN0cnVjdCB0ZXFsX21hc3RlciAqbTsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuY2FjaGU7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCBxOworfTsKKworI2RlZmluZSBORVhUX1NMQVZFKHEpICgoKHN0cnVjdCB0ZXFsX3NjaGVkX2RhdGEqKXFkaXNjX3ByaXYocSkpLT5uZXh0KQorCisjZGVmaW5lIEZNQVNLIChJRkZfQlJPQURDQVNUfElGRl9QT0lOVE9QT0lOVHxJRkZfQlJPQURDQVNUKQorCisvKiAidGVxbCoiIHFkaXNjIHJvdXRpbmVzICovCisKK3N0YXRpYyBpbnQKK3RlcWxfZW5xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUWRpc2MqIHNjaCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2NoLT5kZXY7CisJc3RydWN0IHRlcWxfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKworCV9fc2tiX3F1ZXVlX3RhaWwoJnEtPnEsIHNrYik7CisJaWYgKHEtPnEucWxlbiA8PSBkZXYtPnR4X3F1ZXVlX2xlbikgeworCQlzY2gtPmJzdGF0cy5ieXRlcyArPSBza2ItPmxlbjsKKwkJc2NoLT5ic3RhdHMucGFja2V0cysrOworCQlyZXR1cm4gMDsKKwl9CisKKwlfX3NrYl91bmxpbmsoc2tiLCAmcS0+cSk7CisJa2ZyZWVfc2tiKHNrYik7CisJc2NoLT5xc3RhdHMuZHJvcHMrKzsKKwlyZXR1cm4gTkVUX1hNSVRfRFJPUDsKK30KKworc3RhdGljIGludAordGVxbF9yZXF1ZXVlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBRZGlzYyogc2NoKQoreworCXN0cnVjdCB0ZXFsX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisKKwlfX3NrYl9xdWV1ZV9oZWFkKCZxLT5xLCBza2IpOworCXNjaC0+cXN0YXRzLnJlcXVldWVzKys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCit0ZXFsX2RlcXVldWUoc3RydWN0IFFkaXNjKiBzY2gpCit7CisJc3RydWN0IHRlcWxfc2NoZWRfZGF0YSAqZGF0ID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBfX3NrYl9kZXF1ZXVlKCZkYXQtPnEpOworCWlmIChza2IgPT0gTlVMTCkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqbSA9IGRhdC0+bS0+ZGV2LT5xZGlzYy0+ZGV2OworCQlpZiAobSkgeworCQkJZGF0LT5tLT5zbGF2ZXMgPSBzY2g7CisJCQluZXRpZl93YWtlX3F1ZXVlKG0pOworCQl9CisJfQorCXNjaC0+cS5xbGVuID0gZGF0LT5xLnFsZW4gKyBkYXQtPm0tPmRldi0+cWRpc2MtPnEucWxlbjsKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCit0ZXFsX25laWdoX3JlbGVhc2Uoc3RydWN0IG5laWdoYm91ciAqbikKK3sKKwlpZiAobikKKwkJbmVpZ2hfcmVsZWFzZShuKTsKK30KKworc3RhdGljIHZvaWQKK3RlcWxfcmVzZXQoc3RydWN0IFFkaXNjKiBzY2gpCit7CisJc3RydWN0IHRlcWxfc2NoZWRfZGF0YSAqZGF0ID0gcWRpc2NfcHJpdihzY2gpOworCisJc2tiX3F1ZXVlX3B1cmdlKCZkYXQtPnEpOworCXNjaC0+cS5xbGVuID0gMDsKKwl0ZXFsX25laWdoX3JlbGVhc2UoeGNoZygmZGF0LT5uY2FjaGUsIE5VTEwpKTsKK30KKworc3RhdGljIHZvaWQKK3RlcWxfZGVzdHJveShzdHJ1Y3QgUWRpc2MqIHNjaCkKK3sKKwlzdHJ1Y3QgUWRpc2MgKnEsICpwcmV2OworCXN0cnVjdCB0ZXFsX3NjaGVkX2RhdGEgKmRhdCA9IHFkaXNjX3ByaXYoc2NoKTsKKwlzdHJ1Y3QgdGVxbF9tYXN0ZXIgKm1hc3RlciA9IGRhdC0+bTsKKworCWlmICgocHJldiA9IG1hc3Rlci0+c2xhdmVzKSAhPSBOVUxMKSB7CisJCWRvIHsKKwkJCXEgPSBORVhUX1NMQVZFKHByZXYpOworCQkJaWYgKHEgPT0gc2NoKSB7CisJCQkJTkVYVF9TTEFWRShwcmV2KSA9IE5FWFRfU0xBVkUocSk7CisJCQkJaWYgKHEgPT0gbWFzdGVyLT5zbGF2ZXMpIHsKKwkJCQkJbWFzdGVyLT5zbGF2ZXMgPSBORVhUX1NMQVZFKHEpOworCQkJCQlpZiAocSA9PSBtYXN0ZXItPnNsYXZlcykgeworCQkJCQkJbWFzdGVyLT5zbGF2ZXMgPSBOVUxMOworCQkJCQkJc3Bpbl9sb2NrX2JoKCZtYXN0ZXItPmRldi0+cXVldWVfbG9jayk7CisJCQkJCQlxZGlzY19yZXNldChtYXN0ZXItPmRldi0+cWRpc2MpOworCQkJCQkJc3Bpbl91bmxvY2tfYmgoJm1hc3Rlci0+ZGV2LT5xdWV1ZV9sb2NrKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlza2JfcXVldWVfcHVyZ2UoJmRhdC0+cSk7CisJCQkJdGVxbF9uZWlnaF9yZWxlYXNlKHhjaGcoJmRhdC0+bmNhY2hlLCBOVUxMKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkJCisJCX0gd2hpbGUgKChwcmV2ID0gcSkgIT0gbWFzdGVyLT5zbGF2ZXMpOworCX0KK30KKworc3RhdGljIGludCB0ZXFsX3FkaXNjX2luaXQoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBydGF0dHIgKm9wdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2NoLT5kZXY7CisJc3RydWN0IHRlcWxfbWFzdGVyICptID0gKHN0cnVjdCB0ZXFsX21hc3Rlciopc2NoLT5vcHM7CisJc3RydWN0IHRlcWxfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKworCWlmIChkZXYtPmhhcmRfaGVhZGVyX2xlbiA+IG0tPmRldi0+aGFyZF9oZWFkZXJfbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtLT5kZXYgPT0gZGV2KQorCQlyZXR1cm4gLUVMT09QOworCisJcS0+bSA9IG07CisKKwlza2JfcXVldWVfaGVhZF9pbml0KCZxLT5xKTsKKworCWlmIChtLT5zbGF2ZXMpIHsKKwkJaWYgKG0tPmRldi0+ZmxhZ3MgJiBJRkZfVVApIHsKKwkJCWlmICgobS0+ZGV2LT5mbGFncyZJRkZfUE9JTlRPUE9JTlQgJiYgIShkZXYtPmZsYWdzJklGRl9QT0lOVE9QT0lOVCkpCisJCQkgICAgfHwgKG0tPmRldi0+ZmxhZ3MmSUZGX0JST0FEQ0FTVCAmJiAhKGRldi0+ZmxhZ3MmSUZGX0JST0FEQ0FTVCkpCisJCQkgICAgfHwgKG0tPmRldi0+ZmxhZ3MmSUZGX01VTFRJQ0FTVCAmJiAhKGRldi0+ZmxhZ3MmSUZGX01VTFRJQ0FTVCkpCisJCQkgICAgfHwgZGV2LT5tdHUgPCBtLT5kZXYtPm10dSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfSBlbHNlIHsKKwkJCWlmICghKGRldi0+ZmxhZ3MmSUZGX1BPSU5UT1BPSU5UKSkKKwkJCQltLT5kZXYtPmZsYWdzICY9IH5JRkZfUE9JTlRPUE9JTlQ7CisJCQlpZiAoIShkZXYtPmZsYWdzJklGRl9CUk9BRENBU1QpKQorCQkJCW0tPmRldi0+ZmxhZ3MgJj0gfklGRl9CUk9BRENBU1Q7CisJCQlpZiAoIShkZXYtPmZsYWdzJklGRl9NVUxUSUNBU1QpKQorCQkJCW0tPmRldi0+ZmxhZ3MgJj0gfklGRl9NVUxUSUNBU1Q7CisJCQlpZiAoZGV2LT5tdHUgPCBtLT5kZXYtPm10dSkKKwkJCQltLT5kZXYtPm10dSA9IGRldi0+bXR1OworCQl9CisJCXEtPm5leHQgPSBORVhUX1NMQVZFKG0tPnNsYXZlcyk7CisJCU5FWFRfU0xBVkUobS0+c2xhdmVzKSA9IHNjaDsKKwl9IGVsc2UgeworCQlxLT5uZXh0ID0gc2NoOworCQltLT5zbGF2ZXMgPSBzY2g7CisJCW0tPmRldi0+bXR1ID0gZGV2LT5tdHU7CisJCW0tPmRldi0+ZmxhZ3MgPSAobS0+ZGV2LT5mbGFncyZ+Rk1BU0spfChkZXYtPmZsYWdzJkZNQVNLKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qICJ0ZXFsKiIgbmV0ZGV2aWNlIHJvdXRpbmVzICovCisKK3N0YXRpYyBpbnQKK19fdGVxbF9yZXNvbHZlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBza19idWZmICpza2JfcmVzLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0ZXFsX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KGRldi0+cWRpc2MpOworCXN0cnVjdCBuZWlnaGJvdXIgKm1uID0gc2tiLT5kc3QtPm5laWdoYm91cjsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuID0gcS0+bmNhY2hlOworCisJaWYgKG1uLT50YmwgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG4gJiYgbi0+dGJsID09IG1uLT50YmwgJiYKKwkgICAgbWVtY21wKG4tPnByaW1hcnlfa2V5LCBtbi0+cHJpbWFyeV9rZXksIG1uLT50YmwtPmtleV9sZW4pID09IDApIHsKKwkJYXRvbWljX2luYygmbi0+cmVmY250KTsKKwl9IGVsc2UgeworCQluID0gX19uZWlnaF9sb29rdXBfZXJybm8obW4tPnRibCwgbW4tPnByaW1hcnlfa2V5LCBkZXYpOworCQlpZiAoSVNfRVJSKG4pKQorCQkJcmV0dXJuIFBUUl9FUlIobik7CisJfQorCWlmIChuZWlnaF9ldmVudF9zZW5kKG4sIHNrYl9yZXMpID09IDApIHsKKwkJaW50IGVycjsKKwkJcmVhZF9sb2NrKCZuLT5sb2NrKTsKKwkJZXJyID0gZGV2LT5oYXJkX2hlYWRlcihza2IsIGRldiwgbnRvaHMoc2tiLT5wcm90b2NvbCksIG4tPmhhLCBOVUxMLCBza2ItPmxlbik7CisJCXJlYWRfdW5sb2NrKCZuLT5sb2NrKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCW5laWdoX3JlbGVhc2Uobik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQl0ZXFsX25laWdoX3JlbGVhc2UoeGNoZygmcS0+bmNhY2hlLCBuKSk7CisJCXJldHVybiAwOworCX0KKwluZWlnaF9yZWxlYXNlKG4pOworCXJldHVybiAoc2tiX3JlcyA9PSBOVUxMKSA/IC1FQUdBSU4gOiAxOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQKK3RlcWxfcmVzb2x2ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3Jlcywgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2LT5oYXJkX2hlYWRlciA9PSBOVUxMIHx8CisJICAgIHNrYi0+ZHN0ID09IE5VTEwgfHwKKwkgICAgc2tiLT5kc3QtPm5laWdoYm91ciA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gX190ZXFsX3Jlc29sdmUoc2tiLCBza2JfcmVzLCBkZXYpOworfQorCitzdGF0aWMgaW50IHRlcWxfbWFzdGVyX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGVxbF9tYXN0ZXIgKm1hc3RlciA9ICh2b2lkKilkZXYtPnByaXY7CisJc3RydWN0IFFkaXNjICpzdGFydCwgKnE7CisJaW50IGJ1c3k7CisJaW50IG5vcmVzOworCWludCBsZW4gPSBza2ItPmxlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3JlcyA9IE5VTEw7CisKKwlzdGFydCA9IG1hc3Rlci0+c2xhdmVzOworCityZXN0YXJ0OgorCW5vcmVzID0gMDsKKwlidXN5ID0gMDsKKworCWlmICgocSA9IHN0YXJ0KSA9PSBOVUxMKQorCQlnb3RvIGRyb3A7CisKKwlkbyB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZSA9IHEtPmRldjsKKwkJCisJCWlmIChzbGF2ZS0+cWRpc2Nfc2xlZXBpbmcgIT0gcSkKKwkJCWNvbnRpbnVlOworCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChzbGF2ZSkgfHwgISBuZXRpZl9ydW5uaW5nKHNsYXZlKSkgeworCQkJYnVzeSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCXN3aXRjaCAodGVxbF9yZXNvbHZlKHNrYiwgc2tiX3Jlcywgc2xhdmUpKSB7CisJCWNhc2UgMDoKKwkJCWlmIChzcGluX3RyeWxvY2soJnNsYXZlLT54bWl0X2xvY2spKSB7CisJCQkJc2xhdmUtPnhtaXRfbG9ja19vd25lciA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwkJCQlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoc2xhdmUpICYmCisJCQkJICAgIHNsYXZlLT5oYXJkX3N0YXJ0X3htaXQoc2tiLCBzbGF2ZSkgPT0gMCkgeworCQkJCQlzbGF2ZS0+eG1pdF9sb2NrX293bmVyID0gLTE7CisJCQkJCXNwaW5fdW5sb2NrKCZzbGF2ZS0+eG1pdF9sb2NrKTsKKwkJCQkJbWFzdGVyLT5zbGF2ZXMgPSBORVhUX1NMQVZFKHEpOworCQkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQkJCW1hc3Rlci0+c3RhdHMudHhfcGFja2V0cysrOworCQkJCQltYXN0ZXItPnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCXNsYXZlLT54bWl0X2xvY2tfb3duZXIgPSAtMTsKKwkJCQlzcGluX3VubG9jaygmc2xhdmUtPnhtaXRfbG9jayk7CisJCQl9CisJCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKQorCQkJCWJ1c3kgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCW1hc3Rlci0+c2xhdmVzID0gTkVYVF9TTEFWRShxKTsKKwkJCXJldHVybiAwOworCQlkZWZhdWx0OgorCQkJbm9yZXMgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJX19za2JfcHVsbChza2IsIHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhKTsKKwl9IHdoaWxlICgocSA9IE5FWFRfU0xBVkUocSkpICE9IHN0YXJ0KTsKKworCWlmIChub3JlcyAmJiBza2JfcmVzID09IE5VTEwpIHsKKwkJc2tiX3JlcyA9IHNrYjsKKwkJZ290byByZXN0YXJ0OworCX0KKworCWlmIChidXN5KSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJcmV0dXJuIDE7CisJfQorCW1hc3Rlci0+c3RhdHMudHhfZXJyb3JzKys7CisKK2Ryb3A6CisJbWFzdGVyLT5zdGF0cy50eF9kcm9wcGVkKys7CisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlcWxfbWFzdGVyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgUWRpc2MgKiBxOworCXN0cnVjdCB0ZXFsX21hc3RlciAqbSA9ICh2b2lkKilkZXYtPnByaXY7CisJaW50IG10dSA9IDB4RkZGRTsKKwl1bnNpZ25lZCBmbGFncyA9IElGRl9OT0FSUHxJRkZfTVVMVElDQVNUOworCisJaWYgKG0tPnNsYXZlcyA9PSBOVUxMKQorCQlyZXR1cm4gLUVVTkFUQ0g7CisKKwlmbGFncyA9IEZNQVNLOworCisJcSA9IG0tPnNsYXZlczsKKwlkbyB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZSA9IHEtPmRldjsKKworCQlpZiAoc2xhdmUgPT0gTlVMTCkKKwkJCXJldHVybiAtRVVOQVRDSDsKKworCQlpZiAoc2xhdmUtPm10dSA8IG10dSkKKwkJCW10dSA9IHNsYXZlLT5tdHU7CisJCWlmIChzbGF2ZS0+aGFyZF9oZWFkZXJfbGVuID4gTExfTUFYX0hFQURFUikKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qIElmIGFsbCB0aGUgc2xhdmVzIGFyZSBCUk9BRENBU1QsIG1hc3RlciBpcyBCUk9BRENBU1QKKwkJICAgSWYgYWxsIHRoZSBzbGF2ZXMgYXJlIFB0UCwgbWFzdGVyIGlzIFB0UAorCQkgICBPdGhlcndpc2UsIG1hc3RlciBpcyBOQk1BLgorCQkgKi8KKwkJaWYgKCEoc2xhdmUtPmZsYWdzJklGRl9QT0lOVE9QT0lOVCkpCisJCQlmbGFncyAmPSB+SUZGX1BPSU5UT1BPSU5UOworCQlpZiAoIShzbGF2ZS0+ZmxhZ3MmSUZGX0JST0FEQ0FTVCkpCisJCQlmbGFncyAmPSB+SUZGX0JST0FEQ0FTVDsKKwkJaWYgKCEoc2xhdmUtPmZsYWdzJklGRl9NVUxUSUNBU1QpKQorCQkJZmxhZ3MgJj0gfklGRl9NVUxUSUNBU1Q7CisJfSB3aGlsZSAoKHEgPSBORVhUX1NMQVZFKHEpKSAhPSBtLT5zbGF2ZXMpOworCisJbS0+ZGV2LT5tdHUgPSBtdHU7CisJbS0+ZGV2LT5mbGFncyA9IChtLT5kZXYtPmZsYWdzJn5GTUFTSykgfCBmbGFnczsKKwluZXRpZl9zdGFydF9xdWV1ZShtLT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlcWxfbWFzdGVyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnRlcWxfbWFzdGVyX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRlcWxfbWFzdGVyICptID0gKHZvaWQqKWRldi0+cHJpdjsKKwlyZXR1cm4gJm0tPnN0YXRzOworfQorCitzdGF0aWMgaW50IHRlcWxfbWFzdGVyX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlzdHJ1Y3QgdGVxbF9tYXN0ZXIgKm0gPSAodm9pZCopZGV2LT5wcml2OworCXN0cnVjdCBRZGlzYyAqcTsKKworCWlmIChuZXdfbXR1IDwgNjgpCisJCXJldHVybiAtRUlOVkFMOworCisJcSA9IG0tPnNsYXZlczsKKwlpZiAocSkgeworCQlkbyB7CisJCQlpZiAobmV3X210dSA+IHEtPmRldi0+bXR1KQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9IHdoaWxlICgocT1ORVhUX1NMQVZFKHEpKSAhPSBtLT5zbGF2ZXMpOworCX0KKworCWRldi0+bXR1ID0gbmV3X210dTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5pdCB2b2lkIHRlcWxfbWFzdGVyX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRlcWxfbWFzdGVyICptYXN0ZXIgPSBkZXYtPnByaXY7CisJc3RydWN0IFFkaXNjX29wcyAqb3BzID0gJm1hc3Rlci0+cW9wczsKKworCW1hc3Rlci0+ZGV2CT0gZGV2OworCW9wcy0+cHJpdl9zaXplICA9IHNpemVvZihzdHJ1Y3QgdGVxbF9zY2hlZF9kYXRhKTsKKwkKKwlvcHMtPmVucXVldWUJPQl0ZXFsX2VucXVldWU7CisJb3BzLT5kZXF1ZXVlCT0JdGVxbF9kZXF1ZXVlOworCW9wcy0+cmVxdWV1ZQk9CXRlcWxfcmVxdWV1ZTsKKwlvcHMtPmluaXQJPQl0ZXFsX3FkaXNjX2luaXQ7CisJb3BzLT5yZXNldAk9CXRlcWxfcmVzZXQ7CisJb3BzLT5kZXN0cm95CT0JdGVxbF9kZXN0cm95OworCW9wcy0+b3duZXIJPQlUSElTX01PRFVMRTsKKworCWRldi0+b3BlbgkJPSB0ZXFsX21hc3Rlcl9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gdGVxbF9tYXN0ZXJfeG1pdDsKKwlkZXYtPnN0b3AJCT0gdGVxbF9tYXN0ZXJfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMJCT0gdGVxbF9tYXN0ZXJfc3RhdHM7CisJZGV2LT5jaGFuZ2VfbXR1CQk9IHRlcWxfbWFzdGVyX210dTsKKwlkZXYtPnR5cGUJCT0gQVJQSFJEX1ZPSUQ7CisJZGV2LT5tdHUJCT0gMTUwMDsKKwlkZXYtPnR4X3F1ZXVlX2xlbgk9IDEwMDsKKwlkZXYtPmZsYWdzCQk9IElGRl9OT0FSUDsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbgk9IExMX01BWF9IRUFERVI7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworfQorCitzdGF0aWMgTElTVF9IRUFEKG1hc3Rlcl9kZXZfbGlzdCk7CitzdGF0aWMgaW50IG1heF9lcXVhbGl6ZXJzID0gMTsKK21vZHVsZV9wYXJhbShtYXhfZXF1YWxpemVycywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2VxdWFsaXplcnMsICJNYXggbnVtYmVyIG9mIGxpbmsgZXF1YWxpemVycyIpOworCitzdGF0aWMgaW50IF9faW5pdCB0ZXFsX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgZXJyID0gLUVOT0RFVjsKKworCWZvciAoaSA9IDA7IGkgPCBtYXhfZXF1YWxpemVyczsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJCXN0cnVjdCB0ZXFsX21hc3RlciAqbWFzdGVyOworCisJCWRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IHRlcWxfbWFzdGVyKSwKKwkJCQkgICJ0ZXFsJWQiLCB0ZXFsX21hc3Rlcl9zZXR1cCk7CisJCWlmICghZGV2KSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKGVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpKSkgeworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJCWJyZWFrOworCQl9CisKKwkJbWFzdGVyID0gZGV2LT5wcml2OworCisJCXN0cmxjcHkobWFzdGVyLT5xb3BzLmlkLCBkZXYtPm5hbWUsIElGTkFNU0laKTsKKwkJZXJyID0gcmVnaXN0ZXJfcWRpc2MoJm1hc3Rlci0+cW9wcyk7CisKKwkJaWYgKGVycikgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCQlicmVhazsKKwkJfQorCisJCWxpc3RfYWRkX3RhaWwoJm1hc3Rlci0+bWFzdGVyX2xpc3QsICZtYXN0ZXJfZGV2X2xpc3QpOworCX0KKwlyZXR1cm4gaSA/IDAgOiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0ZXFsX2V4aXQodm9pZCkgCit7CisJc3RydWN0IHRlcWxfbWFzdGVyICptYXN0ZXIsICpueHQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobWFzdGVyLCBueHQsICZtYXN0ZXJfZGV2X2xpc3QsIG1hc3Rlcl9saXN0KSB7CisKKwkJbGlzdF9kZWwoJm1hc3Rlci0+bWFzdGVyX2xpc3QpOworCisJCXVucmVnaXN0ZXJfcWRpc2MoJm1hc3Rlci0+cW9wcyk7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KG1hc3Rlci0+ZGV2KTsKKwkJZnJlZV9uZXRkZXYobWFzdGVyLT5kZXYpOworCX0KK30KKworbW9kdWxlX2luaXQodGVxbF9pbml0KTsKK21vZHVsZV9leGl0KHRlcWxfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL0tjb25maWcgYi9uZXQvc2N0cC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYmE0OWUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2N0cC9LY29uZmlnCkBAIC0wLDAgKzEsODkgQEAKKyMKKyMgU0NUUCBjb25maWd1cmF0aW9uCisjCisKK21lbnUgIlNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIElORVQgJiYgRVhQRVJJTUVOVEFMCisKK2NvbmZpZyBJUF9TQ1RQCisJdHJpc3RhdGUgIlRoZSBTQ1RQIFByb3RvY29sIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gSVBWNiB8fCBJUFY2PW4KKwlzZWxlY3QgQ1JZUFRPIGlmIFNDVFBfSE1BQ19TSEExIHx8IFNDVFBfSE1BQ19NRDUKKwlzZWxlY3QgQ1JZUFRPX0hNQUMgaWYgU0NUUF9ITUFDX1NIQTEgfHwgU0NUUF9ITUFDX01ENQorCXNlbGVjdCBDUllQVE9fU0hBMSBpZiBTQ1RQX0hNQUNfU0hBMQorCXNlbGVjdCBDUllQVE9fTUQ1IGlmIFNDVFBfSE1BQ19NRDUKKwktLS1oZWxwLS0tCisJICBTdHJlYW0gQ29udHJvbCBUcmFuc21pc3Npb24gUHJvdG9jb2wKKworCSAgRnJvbSBSRkMgMjk2MCA8aHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjk2MC50eHQ+LgorCisJICAiU0NUUCBpcyBhIHJlbGlhYmxlIHRyYW5zcG9ydCBwcm90b2NvbCBvcGVyYXRpbmcgb24gdG9wIG9mIGEKKwkgIGNvbm5lY3Rpb25sZXNzIHBhY2tldCBuZXR3b3JrIHN1Y2ggYXMgSVAuICBJdCBvZmZlcnMgdGhlIGZvbGxvd2luZworCSAgc2VydmljZXMgdG8gaXRzIHVzZXJzOgorCisJICAtLSBhY2tub3dsZWRnZWQgZXJyb3ItZnJlZSBub24tZHVwbGljYXRlZCB0cmFuc2ZlciBvZiB1c2VyIGRhdGEsCisJICAtLSBkYXRhIGZyYWdtZW50YXRpb24gdG8gY29uZm9ybSB0byBkaXNjb3ZlcmVkIHBhdGggTVRVIHNpemUsCisJICAtLSBzZXF1ZW5jZWQgZGVsaXZlcnkgb2YgdXNlciBtZXNzYWdlcyB3aXRoaW4gbXVsdGlwbGUgc3RyZWFtcywKKwkgIHdpdGggYW4gb3B0aW9uIGZvciBvcmRlci1vZi1hcnJpdmFsIGRlbGl2ZXJ5IG9mIGluZGl2aWR1YWwgdXNlcgorCSAgbWVzc2FnZXMsCisJICAtLSBvcHRpb25hbCBidW5kbGluZyBvZiBtdWx0aXBsZSB1c2VyIG1lc3NhZ2VzIGludG8gYSBzaW5nbGUgU0NUUAorCSAgcGFja2V0LCBhbmQKKwkgIC0tIG5ldHdvcmstbGV2ZWwgZmF1bHQgdG9sZXJhbmNlIHRocm91Z2ggc3VwcG9ydGluZyBvZiBtdWx0aS0KKwkgIGhvbWluZyBhdCBlaXRoZXIgb3IgYm90aCBlbmRzIG9mIGFuIGFzc29jaWF0aW9uLiIKKworCSAgVG8gY29tcGlsZSB0aGlzIHByb3RvY29sIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNjdHAuCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIFNDVFBfREJHX01TRworCWJvb2wgIlNDVFA6IERlYnVnIG1lc3NhZ2VzIgorCWRlcGVuZHMgb24gSVBfU0NUUAorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSwgdGhpcyB3aWxsIGVuYWJsZSB2ZXJib3NlIGRlYnVnZ2luZyBtZXNzYWdlcy4gCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uICBIb3dldmVyLCBpZiB5b3UgYXJlIHJ1bm5pbmcgaW50byBwcm9ibGVtcywgdXNlIAorCSAgdGhpcyBvcHRpb24gdG8gZ2F0aGVyIGRldGFpbGVkIHRyYWNlIGluZm9ybWF0aW9uCisKK2NvbmZpZyBTQ1RQX0RCR19PQkpDTlQKKwlib29sICJTQ1RQOiBEZWJ1ZyBvYmplY3QgY291bnRzIgorCWRlcGVuZHMgb24gSVBfU0NUUAorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSwgdGhpcyB3aWxsIGVuYWJsZSBkZWJ1Z2dpbmcgc3VwcG9ydCBmb3IgY291bnRpbmcgdGhlIAorCSAgdHlwZSBvZiBvYmplY3RzIHRoYXQgYXJlIGN1cnJlbnRseSBhbGxvY2F0ZWQuICBUaGlzIGlzIHVzZWZ1bCBmb3IgCisJICBpZGVudGlmeWluZyBtZW1vcnkgbGVha3MuICAgSWYgdGhlIC9wcm9jIGZpbGVzeXN0ZW0gaXMgZW5hYmxlZCB0aGlzIAorCSAgZGVidWcgaW5mb3JtYXRpb24gY2FuIGJlIHZpZXdlZCBieSAKKwkgICdjYXQgL3Byb2MvbmV0L3NjdHAvc2N0cF9kYmdfb2JqY250JworCisJICBJZiB1bnN1cmUsIHNheSBOCisKK2Nob2ljZQorCXByb21wdCAiU0NUUDogQ29va2llIEhNQUMgQWxnb3JpdGhtIgorCWRlcGVuZHMgb24gSVBfU0NUUAorCWRlZmF1bHQgU0NUUF9ITUFDX01ENQorCWhlbHAKKwkgIEhNQUMgYWxnb3JpdGhtIHRvIGJlIHVzZWQgZHVyaW5nIGFzc29jaWF0aW9uIGluaXRpYWxpemF0aW9uLiAgSXQKKwkgIGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIHVzZSBITUFDLVNIQTEgb3IgSE1BQy1NRDUuICBTZWUgCisJICBjb25maWd1cmF0aW9uIGZvciBDcnlwdG9ncmFwaGljIEFQSSBhbmQgZW5hYmxlIHRob3NlIGFsZ29yaXRobXMKKyAgICAgICAgICB0byBtYWtlIHVzYWJsZSBieSBTQ1RQLiAKKworY29uZmlnIFNDVFBfSE1BQ19OT05FCisJYm9vbCAiTm9uZSIKKwloZWxwIAorCSAgQ2hvb3NpbmcgdGhpcyBkaXNhYmxlcyB0aGUgdXNlIG9mIGFuIEhNQUMgZHVyaW5nIGFzc29jaWF0aW9uIAorCSAgZXN0YWJsaXNobWVudC4gIEl0IGlzIGFkdmlzZWQgdG8gdXNlIGVpdGhlciBITUFDLU1ENSBvciBITUFDLVNIQTEuCisKK2NvbmZpZyBTQ1RQX0hNQUNfU0hBMQorCWJvb2wgIkhNQUMtU0hBMSIKKwloZWxwIAorCSAgRW5hYmxlIHRoZSB1c2Ugb2YgSE1BQy1TSEExIGR1cmluZyBhc3NvY2lhdGlvbiBlc3RhYmxpc2htZW50LiAgSXQgCisJICBpcyBhZHZpc2VkIHRvIHVzZSBlaXRoZXIgSE1BQy1NRDUgb3IgSE1BQy1TSEExLgorCitjb25maWcgU0NUUF9ITUFDX01ENQorCWJvb2wgIkhNQUMtTUQ1IgorCWhlbHAKKwkgIEVuYWJsZSB0aGUgdXNlIG9mIEhNQUMtTUQ1IGR1cmluZyBhc3NvY2lhdGlvbiBlc3RhYmxpc2htZW50LiAgSXQgaXMgCisJICBhZHZpc2VkIHRvIHVzZSBlaXRoZXIgSE1BQy1NRDUgb3IgSE1BQy1TSEExLgorCitlbmRjaG9pY2UKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL25ldC9zY3RwL01ha2VmaWxlIGIvbmV0L3NjdHAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBjODI4YgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY3RwL01ha2VmaWxlCkBAIC0wLDAgKzEsMTcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIFNDVFAgc3VwcG9ydCBjb2RlLgorIworCitvYmotJChDT05GSUdfSVBfU0NUUCkgKz0gc2N0cC5vCisKK3NjdHAteSA6PSBzbV9zdGF0ZXRhYmxlLm8gc21fc3RhdGVmdW5zLm8gc21fc2lkZWVmZmVjdC5vIFwKKwkgIHByb3RvY29sLm8gZW5kcG9pbnRvbGEubyBhc3NvY2lvbGEubyBcCisJICB0cmFuc3BvcnQubyBjaHVuay5vIHNtX21ha2VfY2h1bmsubyB1bHBldmVudC5vIFwKKwkgIGlucXVldWUubyBvdXRxdWV1ZS5vIHVscHF1ZXVlLm8gY29tbWFuZC5vIFwKKwkgIHRzbm1hcC5vIGJpbmRfYWRkci5vIHNvY2tldC5vIHByaW1pdGl2ZS5vIFwKKwkgIG91dHB1dC5vIGlucHV0Lm8gZGVidWcubyBzc25tYXAubyBwcm9jLm8gY3JjMzJjLm8KKworc2N0cC0kKENPTkZJR19TQ1RQX0RCR19PQkpDTlQpICs9IG9iamNudC5vCitzY3RwLSQoQ09ORklHX1NZU0NUTCkgKz0gc3lzY3RsLm8KKworc2N0cC0kKHN1YnN0IG0seSwkKENPTkZJR19JUFY2KSkJKz0gaXB2Ni5vCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9hc3NvY2lvbGEuYyBiL25ldC9zY3RwL2Fzc29jaW9sYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2Mzg0M2QKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2N0cC9hc3NvY2lvbGEuYwpAQCAtMCwwICsxLDEyMDUgQEAKKy8qIFNDVFAga2VybmVsIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSwgMjAwNAorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgQ2lzY28sIEluYy4KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIE1vdG9yb2xhLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBMYSBNb250ZSBILlAuIFlhcnJvbGwKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgU0NUUCBrZXJuZWwgcmVmZXJlbmNlIEltcGxlbWVudGF0aW9uCisgKgorICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIGFic3RyYWN0aW9uIGZvciBhbiBTQ1RQIGFzc29jaWF0aW9uLgorICoKKyAqIFRoZSBTQ1RQIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoZSBTQ1RQIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0CisgKiB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAqICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogUGxlYXNlIHNlbmQgYW55IGJ1ZyByZXBvcnRzIG9yIGZpeGVzIHlvdSBtYWtlIHRvIHRoZQorICogZW1haWwgYWRkcmVzcyhlcyk6CisgKiAgICBsa3NjdHAgZGV2ZWxvcGVycyA8bGtzY3RwLWRldmVsb3BlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIE9yIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHdlYnNpdGU6CisgKiAgICBodHRwOi8vd3d3LnNmLm5ldC9wcm9qZWN0cy9sa3NjdHAKKyAqCisgKiBXcml0dGVuIG9yIG1vZGlmaWVkIGJ5OgorICogICAgTGEgTW9udGUgSC5QLiBZYXJyb2xsIDxwaWdneUBhY20ub3JnPgorICogICAgS2FybCBLbnV0c29uICAgICAgICAgIDxrYXJsQGF0aGVuYS5jaGljYWdvLmlsLnVzPgorICogICAgSm9uIEdyaW1tICAgICAgICAgICAgIDxqZ3JpbW1AdXMuaWJtLmNvbT4KKyAqICAgIFhpbmdhbmcgR3VvICAgICAgICAgICA8eGluZ2FuZy5ndW9AaW50ZWwuY29tPgorICogICAgSHVpIEh1YW5nICAgICAgICAgICAgIDxodWkuaHVhbmdAbm9raWEuY29tPgorICogICAgU3JpZGhhciBTYW11ZHJhbGEJICAgIDxzcmlAdXMuaWJtLmNvbT4KKyAqICAgIERhaXN5IENoYW5nCSAgICA8ZGFpc3ljQHVzLmlibS5jb20+CisgKiAgICBSeWFuIExheWVyCSAgICA8cm1sYXllckB1cy5pYm0uY29tPgorICogICAgS2V2aW4gR2FvICAgICAgICAgICAgIDxrZXZpbi5nYW9AaW50ZWwuY29tPgorICoKKyAqIEFueSBidWdzIHJlcG9ydGVkIGdpdmVuIHRvIHVzIHdlIHdpbGwgdHJ5IHRvIGZpeC4uLiBhbnkgZml4ZXMgc2hhcmVkIHdpbGwKKyAqIGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBuZXh0IFNDVFAgcmVsZWFzZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L3NjdHAvc2N0cC5oPgorI2luY2x1ZGUgPG5ldC9zY3RwL3NtLmg+CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBpbnRlcm5hbCBmdW5jdGlvbnMuICovCitzdGF0aWMgdm9pZCBzY3RwX2Fzc29jX2JoX3JjdihzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYyk7CisKKworLyogMXN0IExldmVsIEFic3RyYWN0aW9ucy4gKi8KKworLyogSW5pdGlhbGl6ZSBhIG5ldyBhc3NvY2lhdGlvbiBmcm9tIHByb3ZpZGVkIG1lbW9yeS4gKi8KK3N0YXRpYyBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqc2N0cF9hc3NvY2lhdGlvbl9pbml0KHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCQkgIGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwkJCQkJICBjb25zdCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCSAgc2N0cF9zY29wZV90IHNjb3BlLAorCQkJCQkgIGludCBnZnApCit7CisJc3RydWN0IHNjdHBfc29jayAqc3A7CisJaW50IGk7CisKKwkvKiBSZXRyaWV2ZSB0aGUgU0NUUCBwZXIgc29ja2V0IGFyZWEuICAqLworCXNwID0gc2N0cF9zaygoc3RydWN0IHNvY2sgKilzayk7CisKKwkvKiBJbml0IGFsbCB2YXJpYWJsZXMgdG8gYSBrbm93biB2YWx1ZS4gICovCisJbWVtc2V0KGFzb2MsIDAsIHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbikpOworCisJLyogRGlzY2FyZGluZyBjb25zdCBpcyBhcHByb3ByaWF0ZSBoZXJlLiAgKi8KKwlhc29jLT5lcCA9IChzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqKWVwOworCXNjdHBfZW5kcG9pbnRfaG9sZChhc29jLT5lcCk7CisKKwkvKiBIb2xkIHRoZSBzb2NrLiAgKi8KKwlhc29jLT5iYXNlLnNrID0gKHN0cnVjdCBzb2NrICopc2s7CisJc29ja19ob2xkKGFzb2MtPmJhc2Uuc2spOworCisJLyogSW5pdGlhbGl6ZSB0aGUgY29tbW9uIGJhc2Ugc3Vic3RydWN0dXJlLiAgKi8KKwlhc29jLT5iYXNlLnR5cGUgPSBTQ1RQX0VQX1RZUEVfQVNTT0NJQVRJT047CisKKwkvKiBJbml0aWFsaXplIHRoZSBvYmplY3QgaGFuZGxpbmcgZmllbGRzLiAgKi8KKwlhdG9taWNfc2V0KCZhc29jLT5iYXNlLnJlZmNudCwgMSk7CisJYXNvYy0+YmFzZS5kZWFkID0gMDsKKwlhc29jLT5iYXNlLm1hbGxvY2VkID0gMDsKKworCS8qIEluaXRpYWxpemUgdGhlIGJpbmQgYWRkciBhcmVhLiAgKi8KKwlzY3RwX2JpbmRfYWRkcl9pbml0KCZhc29jLT5iYXNlLmJpbmRfYWRkciwgZXAtPmJhc2UuYmluZF9hZGRyLnBvcnQpOworCXJ3bG9ja19pbml0KCZhc29jLT5iYXNlLmFkZHJfbG9jayk7CisKKwlhc29jLT5zdGF0ZSA9IFNDVFBfU1RBVEVfQ0xPU0VEOworCisJLyogU2V0IHRoZXNlIHZhbHVlcyBmcm9tIHRoZSBzb2NrZXQgdmFsdWVzLCBhIGNvbnZlcnNpb24gYmV0d2VlbgorCSAqIG1pbGxzZWNvbnMgdG8gc2Vjb25kcy9taWNyb3NlY29uZHMgbXVzdCBhbHNvIGJlIGRvbmUuCisJICovCisJYXNvYy0+Y29va2llX2xpZmUudHZfc2VjID0gc3AtPmFzc29jcGFyYW1zLnNhc29jX2Nvb2tpZV9saWZlIC8gMTAwMDsKKwlhc29jLT5jb29raWVfbGlmZS50dl91c2VjID0gKHNwLT5hc3NvY3BhcmFtcy5zYXNvY19jb29raWVfbGlmZSAlIDEwMDApCisJCQkJCSogMTAwMDsKKwlhc29jLT5wbXR1ID0gMDsKKwlhc29jLT5mcmFnX3BvaW50ID0gMDsKKworCS8qIFNldCB0aGUgYXNzb2NpYXRpb24gbWF4X3JldHJhbnMgYW5kIFJUTyB2YWx1ZXMgZnJvbSB0aGUKKwkgKiBzb2NrZXQgdmFsdWVzLgorCSAqLworCWFzb2MtPm1heF9yZXRyYW5zID0gc3AtPmFzc29jcGFyYW1zLnNhc29jX2Fzb2NtYXhyeHQ7CisJYXNvYy0+cnRvX2luaXRpYWwgPSBtc2Vjc190b19qaWZmaWVzKHNwLT5ydG9pbmZvLnNydG9faW5pdGlhbCk7CisJYXNvYy0+cnRvX21heCA9IG1zZWNzX3RvX2ppZmZpZXMoc3AtPnJ0b2luZm8uc3J0b19tYXgpOworCWFzb2MtPnJ0b19taW4gPSBtc2Vjc190b19qaWZmaWVzKHNwLT5ydG9pbmZvLnNydG9fbWluKTsKKworCWFzb2MtPm92ZXJhbGxfZXJyb3JfY291bnQgPSAwOworCisJLyogSW5pdGlhbGl6ZSB0aGUgbWF4aW11bSBtdW1iZXIgb2YgbmV3IGRhdGEgcGFja2V0cyB0aGF0IGNhbiBiZSBzZW50CisJICogaW4gYSBidXJzdC4KKwkgKi8KKwlhc29jLT5tYXhfYnVyc3QgPSBzY3RwX21heF9idXJzdDsKKworCS8qIENvcHkgdGhpbmdzIGZyb20gdGhlIGVuZHBvaW50LiAgKi8KKwlmb3IgKGkgPSBTQ1RQX0VWRU5UX1RJTUVPVVRfTk9ORTsgaSA8IFNDVFBfTlVNX1RJTUVPVVRfVFlQRVM7ICsraSkgeworCQlhc29jLT50aW1lb3V0c1tpXSA9IGVwLT50aW1lb3V0c1tpXTsKKwkJaW5pdF90aW1lcigmYXNvYy0+dGltZXJzW2ldKTsKKwkJYXNvYy0+dGltZXJzW2ldLmZ1bmN0aW9uID0gc2N0cF90aW1lcl9ldmVudHNbaV07CisJCWFzb2MtPnRpbWVyc1tpXS5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGFzb2M7CisJfQorCisJLyogUHVsbCBkZWZhdWx0IGluaXRpYWxpemF0aW9uIHZhbHVlcyBmcm9tIHRoZSBzb2NrIG9wdGlvbnMuCisJICogTm90ZTogVGhpcyBhc3N1bWVzIHRoYXQgdGhlIHZhbHVlcyBoYXZlIGFscmVhZHkgYmVlbgorCSAqIHZhbGlkYXRlZCBpbiB0aGUgc29jay4KKwkgKi8KKwlhc29jLT5jLnNpbml0X21heF9pbnN0cmVhbXMgPSBzcC0+aW5pdG1zZy5zaW5pdF9tYXhfaW5zdHJlYW1zOworCWFzb2MtPmMuc2luaXRfbnVtX29zdHJlYW1zICA9IHNwLT5pbml0bXNnLnNpbml0X251bV9vc3RyZWFtczsKKwlhc29jLT5tYXhfaW5pdF9hdHRlbXB0cwk9IHNwLT5pbml0bXNnLnNpbml0X21heF9hdHRlbXB0czsKKworCWFzb2MtPm1heF9pbml0X3RpbWVvID0KKwkJIG1zZWNzX3RvX2ppZmZpZXMoc3AtPmluaXRtc2cuc2luaXRfbWF4X2luaXRfdGltZW8pOworCisJLyogQWxsb2NhdGUgc3RvcmFnZSBmb3IgdGhlIHNzbm1hcCBhZnRlciB0aGUgaW5ib3VuZCBhbmQgb3V0Ym91bmQKKwkgKiBzdHJlYW1zIGhhdmUgYmVlbiBuZWdvdGlhdGVkIGR1cmluZyBJbml0LgorCSAqLworCWFzb2MtPnNzbm1hcCA9IE5VTEw7CisKKwkvKiBTZXQgdGhlIGxvY2FsIHdpbmRvdyBzaXplIGZvciByZWNlaXZlLgorCSAqIFRoaXMgaXMgYWxzbyB0aGUgcmN2YnVmIHNwYWNlIHBlciBhc3NvY2lhdGlvbi4KKwkgKiBSRkMgNiAtIEEgU0NUUCByZWNlaXZlciBNVVNUIGJlIGFibGUgdG8gcmVjZWl2ZSBhIG1pbmltdW0gb2YKKwkgKiAxNTAwIGJ5dGVzIGluIG9uZSBTQ1RQIHBhY2tldC4KKwkgKi8KKwlpZiAoc2stPnNrX3JjdmJ1ZiA8IFNDVFBfREVGQVVMVF9NSU5XSU5ET1cpCisJCWFzb2MtPnJ3bmQgPSBTQ1RQX0RFRkFVTFRfTUlOV0lORE9XOworCWVsc2UKKwkJYXNvYy0+cnduZCA9IHNrLT5za19yY3ZidWY7CisKKwlhc29jLT5hX3J3bmQgPSBhc29jLT5yd25kOworCisJYXNvYy0+cnduZF9vdmVyID0gMDsKKworCS8qIFVzZSBteSBvd24gbWF4IHdpbmRvdyB1bnRpbCBJIGxlYXJuIHNvbWV0aGluZyBiZXR0ZXIuICAqLworCWFzb2MtPnBlZXIucnduZCA9IFNDVFBfREVGQVVMVF9NQVhXSU5ET1c7CisKKwkvKiBTZXQgdGhlIHNuZGJ1ZiBzaXplIGZvciB0cmFuc21pdC4gICovCisJYXNvYy0+c25kYnVmX3VzZWQgPSAwOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmYXNvYy0+d2FpdCk7CisKKwlhc29jLT5jLm15X3Z0YWcgPSBzY3RwX2dlbmVyYXRlX3RhZyhlcCk7CisJYXNvYy0+cGVlci5pLmluaXRfdGFnID0gMDsgICAgIC8qIElOSVQgbmVlZHMgYSB2dGFnIG9mIDAuICovCisJYXNvYy0+Yy5wZWVyX3Z0YWcgPSAwOworCWFzb2MtPmMubXlfdHRhZyAgID0gMDsKKwlhc29jLT5jLnBlZXJfdHRhZyA9IDA7CisJYXNvYy0+Yy5teV9wb3J0ID0gZXAtPmJhc2UuYmluZF9hZGRyLnBvcnQ7CisKKwlhc29jLT5jLmluaXRpYWxfdHNuID0gc2N0cF9nZW5lcmF0ZV90c24oZXApOworCisJYXNvYy0+bmV4dF90c24gPSBhc29jLT5jLmluaXRpYWxfdHNuOworCisJYXNvYy0+Y3Rzbl9hY2tfcG9pbnQgPSBhc29jLT5uZXh0X3RzbiAtIDE7CisJYXNvYy0+YWR2X3BlZXJfYWNrX3BvaW50ID0gYXNvYy0+Y3Rzbl9hY2tfcG9pbnQ7CisJYXNvYy0+aGlnaGVzdF9zYWNrZWQgPSBhc29jLT5jdHNuX2Fja19wb2ludDsKKwlhc29jLT5sYXN0X2N3cl90c24gPSBhc29jLT5jdHNuX2Fja19wb2ludDsKKwlhc29jLT51bmFja19kYXRhID0gMDsKKworCVNDVFBfREVCVUdfUFJJTlRLKCJteWN0c25hcCBmb3IgJXMgSU5JVCBhcyAweCV4LlxuIiwKKwkJCSAgYXNvYy0+ZXAtPmRlYnVnX25hbWUsCisJCQkgIGFzb2MtPmN0c25fYWNrX3BvaW50KTsKKworCS8qIEFERElQIFNlY3Rpb24gNC4xIEFzY29uZiBDaHVuayBQcm9jZWR1cmVzCisJICoKKwkgKiBXaGVuIGFuIGVuZHBvaW50IGhhcyBhbiBBU0NPTkYgc2lnbmFsZWQgY2hhbmdlIHRvIGJlIHNlbnQgdG8gdGhlCisJICogcmVtb3RlIGVuZHBvaW50IGl0IHNob3VsZCBkbyB0aGUgZm9sbG93aW5nOgorCSAqIC4uLgorCSAqIEEyKSBhIHNlcmlhbCBudW1iZXIgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZSBjaHVuay4gVGhlIHNlcmlhbAorCSAqIG51bWJlciBTSE9VTEQgYmUgYSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgbnVtYmVyLiBUaGUgc2VyaWFsCisJICogbnVtYmVycyBTSE9VTEQgYmUgaW5pdGlhbGl6ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZQorCSAqIGFzc29jaWF0aW9uIHRvIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBpbml0aWFsIFRTTi4KKwkgKi8KKwlhc29jLT5hZGRpcF9zZXJpYWwgPSBhc29jLT5jLmluaXRpYWxfdHNuOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmYXNvYy0+YWRkaXBfY2h1bmtzKTsKKworCS8qIE1ha2UgYW4gZW1wdHkgbGlzdCBvZiByZW1vdGUgdHJhbnNwb3J0IGFkZHJlc3Nlcy4gICovCisJSU5JVF9MSVNUX0hFQUQoJmFzb2MtPnBlZXIudHJhbnNwb3J0X2FkZHJfbGlzdCk7CisKKwkvKiBSRkMgMjk2MCA1LjEgTm9ybWFsIEVzdGFibGlzaG1lbnQgb2YgYW4gQXNzb2NpYXRpb24KKwkgKgorCSAqIEFmdGVyIHRoZSByZWNlcHRpb24gb2YgdGhlIGZpcnN0IGRhdGEgY2h1bmsgaW4gYW4KKwkgKiBhc3NvY2lhdGlvbiB0aGUgZW5kcG9pbnQgbXVzdCBpbW1lZGlhdGVseSByZXNwb25kIHdpdGggYQorCSAqIHNhY2sgdG8gYWNrbm93bGVkZ2UgdGhlIGRhdGEgY2h1bmsuICBTdWJzZXF1ZW50CisJICogYWNrbm93bGVkZ2VtZW50cyBzaG91bGQgYmUgZG9uZSBhcyBkZXNjcmliZWQgaW4gU2VjdGlvbgorCSAqIDYuMi4KKwkgKgorCSAqIFtXZSBpbXBsZW1lbnQgdGhpcyBieSB0ZWxsaW5nIGEgbmV3IGFzc29jaWF0aW9uIHRoYXQgaXQKKwkgKiBhbHJlYWR5IHJlY2VpdmVkIG9uZSBwYWNrZXQuXQorCSAqLworCWFzb2MtPnBlZXIuc2Fja19uZWVkZWQgPSAxOworCisJLyogQXNzdW1lIHRoYXQgdGhlIHBlZXIgcmVjb25naXplcyBBU0NPTkYgdW50aWwgcmVwb3J0ZWQgb3RoZXJ3aXNlCisJICogdmlhIGFuIEVSUk9SIGNodW5rLgorCSAqLworCWFzb2MtPnBlZXIuYXNjb25mX2NhcGFibGUgPSAxOworCisJLyogQ3JlYXRlIGFuIGlucHV0IHF1ZXVlLiAgKi8KKwlzY3RwX2lucV9pbml0KCZhc29jLT5iYXNlLmlucXVldWUpOworCXNjdHBfaW5xX3NldF90aF9oYW5kbGVyKCZhc29jLT5iYXNlLmlucXVldWUsCisJCQkJICAgICh2b2lkICgqKSh2b2lkICopKXNjdHBfYXNzb2NfYmhfcmN2LAorCQkJCSAgICBhc29jKTsKKworCS8qIENyZWF0ZSBhbiBvdXRwdXQgcXVldWUuICAqLworCXNjdHBfb3V0cV9pbml0KGFzb2MsICZhc29jLT5vdXRxdWV1ZSk7CisKKwlpZiAoIXNjdHBfdWxwcV9pbml0KCZhc29jLT51bHBxLCBhc29jKSkKKwkJZ290byBmYWlsX2luaXQ7CisKKwkvKiBTZXQgdXAgdGhlIHRzbiB0cmFja2luZy4gKi8KKwlzY3RwX3Rzbm1hcF9pbml0KCZhc29jLT5wZWVyLnRzbl9tYXAsIFNDVFBfVFNOX01BUF9TSVpFLCAwKTsKKworCWFzb2MtPm5lZWRfZWNuZSA9IDA7CisKKwlhc29jLT5hc3NvY19pZCA9IDA7CisKKwkvKiBBc3N1bWUgdGhhdCBwZWVyIHdvdWxkIHN1cHBvcnQgYm90aCBhZGRyZXNzIHR5cGVzIHVubGVzcyB3ZSBhcmUKKwkgKiB0b2xkIG90aGVyd2lzZS4KKwkgKi8KKwlhc29jLT5wZWVyLmlwdjRfYWRkcmVzcyA9IDE7CisJYXNvYy0+cGVlci5pcHY2X2FkZHJlc3MgPSAxOworCUlOSVRfTElTVF9IRUFEKCZhc29jLT5hc29jcyk7CisKKwlhc29jLT5hdXRvY2xvc2UgPSBzcC0+YXV0b2Nsb3NlOworCisJYXNvYy0+ZGVmYXVsdF9zdHJlYW0gPSBzcC0+ZGVmYXVsdF9zdHJlYW07CisJYXNvYy0+ZGVmYXVsdF9wcGlkID0gc3AtPmRlZmF1bHRfcHBpZDsKKwlhc29jLT5kZWZhdWx0X2ZsYWdzID0gc3AtPmRlZmF1bHRfZmxhZ3M7CisJYXNvYy0+ZGVmYXVsdF9jb250ZXh0ID0gc3AtPmRlZmF1bHRfY29udGV4dDsKKwlhc29jLT5kZWZhdWx0X3RpbWV0b2xpdmUgPSBzcC0+ZGVmYXVsdF90aW1ldG9saXZlOworCisJcmV0dXJuIGFzb2M7CisKK2ZhaWxfaW5pdDoKKwlzY3RwX2VuZHBvaW50X3B1dChhc29jLT5lcCk7CisJc29ja19wdXQoYXNvYy0+YmFzZS5zayk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IGFzc29jaWF0aW9uICovCitzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqc2N0cF9hc3NvY2lhdGlvbl9uZXcoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCQkgY29uc3Qgc3RydWN0IHNvY2sgKnNrLAorCQkJCQkgc2N0cF9zY29wZV90IHNjb3BlLCBpbnQgZ2ZwKQoreworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOworCisJYXNvYyA9IHRfbmV3KHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uLCBnZnApOworCWlmICghYXNvYykKKwkJZ290byBmYWlsOworCisJaWYgKCFzY3RwX2Fzc29jaWF0aW9uX2luaXQoYXNvYywgZXAsIHNrLCBzY29wZSwgZ2ZwKSkKKwkJZ290byBmYWlsX2luaXQ7CisKKwlhc29jLT5iYXNlLm1hbGxvY2VkID0gMTsKKwlTQ1RQX0RCR19PQkpDTlRfSU5DKGFzc29jKTsKKworCXJldHVybiBhc29jOworCitmYWlsX2luaXQ6CisJa2ZyZWUoYXNvYyk7CitmYWlsOgorCXJldHVybiBOVUxMOworfQorCisvKiBGcmVlIHRoaXMgYXNzb2NpYXRpb24gaWYgcG9zc2libGUuICBUaGVyZSBtYXkgc3RpbGwgYmUgdXNlcnMsIHNvCisgKiB0aGUgYWN0dWFsIGRlYWxsb2NhdGlvbiBtYXkgYmUgZGVsYXllZC4KKyAqLwordm9pZCBzY3RwX2Fzc29jaWF0aW9uX2ZyZWUoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MpCit7CisJc3RydWN0IHNvY2sgKnNrID0gYXNvYy0+YmFzZS5zazsKKwlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICp0ZW1wOworCWludCBpOworCisJbGlzdF9kZWwoJmFzb2MtPmFzb2NzKTsKKworCS8qIERlY3JlbWVudCB0aGUgYmFja2xvZyB2YWx1ZSBmb3IgYSBUQ1Atc3R5bGUgbGlzdGVuaW5nIHNvY2tldC4gKi8KKwlpZiAoc2N0cF9zdHlsZShzaywgVENQKSAmJiBzY3RwX3NzdGF0ZShzaywgTElTVEVOSU5HKSkKKwkJc2stPnNrX2Fja19iYWNrbG9nLS07CisKKwkvKiBNYXJrIGFzIGRlYWQsIHNvIG90aGVyIHVzZXJzIGNhbiBrbm93IHRoaXMgc3RydWN0dXJlIGlzCisJICogZ29pbmcgYXdheS4KKwkgKi8KKwlhc29jLT5iYXNlLmRlYWQgPSAxOworCisJLyogRGlzcG9zZSBvZiBhbnkgZGF0YSBseWluZyBhcm91bmQgaW4gdGhlIG91dHF1ZXVlLiAqLworCXNjdHBfb3V0cV9mcmVlKCZhc29jLT5vdXRxdWV1ZSk7CisKKwkvKiBEaXNwb3NlIG9mIGFueSBwZW5kaW5nIG1lc3NhZ2VzIGZvciB0aGUgdXBwZXIgbGF5ZXIuICovCisJc2N0cF91bHBxX2ZyZWUoJmFzb2MtPnVscHEpOworCisJLyogRGlzcG9zZSBvZiBhbnkgcGVuZGluZyBjaHVua3Mgb24gdGhlIGlucXVldWUuICovCisJc2N0cF9pbnFfZnJlZSgmYXNvYy0+YmFzZS5pbnF1ZXVlKTsKKworCS8qIEZyZWUgc3NubWFwIHN0b3JhZ2UuICovCisJc2N0cF9zc25tYXBfZnJlZShhc29jLT5zc25tYXApOworCisJLyogQ2xlYW4gdXAgdGhlIGJvdW5kIGFkZHJlc3MgbGlzdC4gKi8KKwlzY3RwX2JpbmRfYWRkcl9mcmVlKCZhc29jLT5iYXNlLmJpbmRfYWRkcik7CisKKwkvKiBEbyB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggYWxsIG9mIG91ciB0aW1lcnMgYW5kCisJICogZGVsZXRlIHRoZW0/ICAgVG8gYmUgc2FmZSB3ZSB3aWxsIHRyeSB0byBkZWxldGUgYWxsLCBidXQgd2UKKwkgKiBzaG91bGQgYmUgYWJsZSB0byBnbyB0aHJvdWdoIGFuZCBtYWtlIGEgZ3Vlc3MgYmFzZWQKKwkgKiBvbiBvdXIgc3RhdGUuCisJICovCisJZm9yIChpID0gU0NUUF9FVkVOVF9USU1FT1VUX05PTkU7IGkgPCBTQ1RQX05VTV9USU1FT1VUX1RZUEVTOyArK2kpIHsKKwkJaWYgKHRpbWVyX3BlbmRpbmcoJmFzb2MtPnRpbWVyc1tpXSkgJiYKKwkJICAgIGRlbF90aW1lcigmYXNvYy0+dGltZXJzW2ldKSkKKwkJCXNjdHBfYXNzb2NpYXRpb25fcHV0KGFzb2MpOworCX0KKworCS8qIEZyZWUgcGVlcidzIGNhY2hlZCBjb29raWUuICovCisJaWYgKGFzb2MtPnBlZXIuY29va2llKSB7CisJCWtmcmVlKGFzb2MtPnBlZXIuY29va2llKTsKKwl9CisKKwkvKiBSZWxlYXNlIHRoZSB0cmFuc3BvcnQgc3RydWN0dXJlcy4gKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCB0ZW1wLCAmYXNvYy0+cGVlci50cmFuc3BvcnRfYWRkcl9saXN0KSB7CisJCXRyYW5zcG9ydCA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQsIHRyYW5zcG9ydHMpOworCQlsaXN0X2RlbChwb3MpOworCQlzY3RwX3RyYW5zcG9ydF9mcmVlKHRyYW5zcG9ydCk7CisJfQorCisJLyogRnJlZSBhbnkgY2FjaGVkIEFTQ09ORl9BQ0sgY2h1bmsuICovCisJaWYgKGFzb2MtPmFkZGlwX2xhc3RfYXNjb25mX2FjaykKKwkJc2N0cF9jaHVua19mcmVlKGFzb2MtPmFkZGlwX2xhc3RfYXNjb25mX2Fjayk7CisKKwkvKiBGcmVlIGFueSBjYWNoZWQgQVNDT05GIGNodW5rLiAqLworCWlmIChhc29jLT5hZGRpcF9sYXN0X2FzY29uZikKKwkJc2N0cF9jaHVua19mcmVlKGFzb2MtPmFkZGlwX2xhc3RfYXNjb25mKTsKKworCXNjdHBfYXNzb2NpYXRpb25fcHV0KGFzb2MpOworfQorCisvKiBDbGVhbnVwIGFuZCBmcmVlIHVwIGFuIGFzc29jaWF0aW9uLiAqLworc3RhdGljIHZvaWQgc2N0cF9hc3NvY2lhdGlvbl9kZXN0cm95KHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKQoreworCVNDVFBfQVNTRVJUKGFzb2MtPmJhc2UuZGVhZCwgIkFzc29jIGlzIG5vdCBkZWFkIiwgcmV0dXJuKTsKKworCXNjdHBfZW5kcG9pbnRfcHV0KGFzb2MtPmVwKTsKKwlzb2NrX3B1dChhc29jLT5iYXNlLnNrKTsKKworCWlmIChhc29jLT5hc3NvY19pZCAhPSAwKSB7CisJCXNwaW5fbG9ja19iaCgmc2N0cF9hc3NvY3NfaWRfbG9jayk7CisJCWlkcl9yZW1vdmUoJnNjdHBfYXNzb2NzX2lkLCBhc29jLT5hc3NvY19pZCk7CisJCXNwaW5fdW5sb2NrX2JoKCZzY3RwX2Fzc29jc19pZF9sb2NrKTsKKwl9CisKKwlpZiAoYXNvYy0+YmFzZS5tYWxsb2NlZCkgeworCQlrZnJlZShhc29jKTsKKwkJU0NUUF9EQkdfT0JKQ05UX0RFQyhhc3NvYyk7CisJfQorfQorCisvKiBDaGFuZ2UgdGhlIHByaW1hcnkgZGVzdGluYXRpb24gYWRkcmVzcyBmb3IgdGhlIHBlZXIuICovCit2b2lkIHNjdHBfYXNzb2Nfc2V0X3ByaW1hcnkoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkgICAgc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisJYXNvYy0+cGVlci5wcmltYXJ5X3BhdGggPSB0cmFuc3BvcnQ7CisKKwkvKiBTZXQgYSBkZWZhdWx0IG1zZ19uYW1lIGZvciBldmVudHMuICovCisJbWVtY3B5KCZhc29jLT5wZWVyLnByaW1hcnlfYWRkciwgJnRyYW5zcG9ydC0+aXBhZGRyLAorCSAgICAgICBzaXplb2YodW5pb24gc2N0cF9hZGRyKSk7CisKKwkvKiBJZiB0aGUgcHJpbWFyeSBwYXRoIGlzIGNoYW5naW5nLCBhc3N1bWUgdGhhdCB0aGUKKwkgKiB1c2VyIHdhbnRzIHRvIHVzZSB0aGlzIG5ldyBwYXRoLgorCSAqLworCWlmICh0cmFuc3BvcnQtPmFjdGl2ZSkKKwkJYXNvYy0+cGVlci5hY3RpdmVfcGF0aCA9IHRyYW5zcG9ydDsKKworCS8qCisJICogU0ZSLUNBQ0MgYWxnb3JpdGhtOgorCSAqIFVwb24gdGhlIHJlY2VpcHQgb2YgYSByZXF1ZXN0IHRvIGNoYW5nZSB0aGUgcHJpbWFyeQorCSAqIGRlc3RpbmF0aW9uIGFkZHJlc3MsIG9uIHRoZSBkYXRhIHN0cnVjdHVyZSBmb3IgdGhlIG5ldworCSAqIHByaW1hcnkgZGVzdGluYXRpb24sIHRoZSBzZW5kZXIgTVVTVCBkbyB0aGUgZm9sbG93aW5nOgorCSAqCisJICogMSkgSWYgQ0hBTkdFT1ZFUl9BQ1RJVkUgaXMgc2V0LCB0aGVuIHRoZXJlIHdhcyBhIHN3aXRjaAorCSAqIHRvIHRoaXMgZGVzdGluYXRpb24gYWRkcmVzcyBlYXJsaWVyLiBUaGUgc2VuZGVyIE1VU1Qgc2V0CisJICogQ1lDTElOR19DSEFOR0VPVkVSIHRvIGluZGljYXRlIHRoYXQgdGhpcyBzd2l0Y2ggaXMgYQorCSAqIGRvdWJsZSBzd2l0Y2ggdG8gdGhlIHNhbWUgZGVzdGluYXRpb24gYWRkcmVzcy4KKwkgKi8KKwlpZiAodHJhbnNwb3J0LT5jYWNjLmNoYW5nZW92ZXJfYWN0aXZlKQorCQl0cmFuc3BvcnQtPmNhY2MuY3ljbGluZ19jaGFuZ2VvdmVyID0gMTsKKworCS8qIDIpIFRoZSBzZW5kZXIgTVVTVCBzZXQgQ0hBTkdFT1ZFUl9BQ1RJVkUgdG8gaW5kaWNhdGUgdGhhdAorCSAqIGEgY2hhbmdlb3ZlciBoYXMgb2NjdXJyZWQuCisJICovCisJdHJhbnNwb3J0LT5jYWNjLmNoYW5nZW92ZXJfYWN0aXZlID0gMTsKKworCS8qIDMpIFRoZSBzZW5kZXIgTVVTVCBzdG9yZSB0aGUgbmV4dCBUU04gdG8gYmUgc2VudCBpbgorCSAqIG5leHRfdHNuX2F0X2NoYW5nZS4KKwkgKi8KKwl0cmFuc3BvcnQtPmNhY2MubmV4dF90c25fYXRfY2hhbmdlID0gYXNvYy0+bmV4dF90c247Cit9CisKKy8qIEFkZCBhIHRyYW5zcG9ydCBhZGRyZXNzIHRvIGFuIGFzc29jaWF0aW9uLiAgKi8KK3N0cnVjdCBzY3RwX3RyYW5zcG9ydCAqc2N0cF9hc3NvY19hZGRfcGVlcihzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkJICAgY29uc3QgdW5pb24gc2N0cF9hZGRyICphZGRyLAorCQkJCQkgICBpbnQgZ2ZwKQoreworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqcGVlcjsKKwlzdHJ1Y3Qgc2N0cF9zb2NrICpzcDsKKwl1bnNpZ25lZCBzaG9ydCBwb3J0OworCisJc3AgPSBzY3RwX3NrKGFzb2MtPmJhc2Uuc2spOworCisJLyogQUZfSU5FVCBhbmQgQUZfSU5FVDYgc2hhcmUgY29tbW9uIHBvcnQgZmllbGQuICovCisJcG9ydCA9IGFkZHItPnY0LnNpbl9wb3J0OworCisJLyogU2V0IHRoZSBwb3J0IGlmIGl0IGhhcyBub3QgYmVlbiBzZXQgeWV0LiAgKi8KKwlpZiAoMCA9PSBhc29jLT5wZWVyLnBvcnQpCisJCWFzb2MtPnBlZXIucG9ydCA9IHBvcnQ7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhIGR1cGxpY2F0ZS4gKi8KKwlwZWVyID0gc2N0cF9hc3NvY19sb29rdXBfcGFkZHIoYXNvYywgYWRkcik7CisJaWYgKHBlZXIpCisJCXJldHVybiBwZWVyOworCisJcGVlciA9IHNjdHBfdHJhbnNwb3J0X25ldyhhZGRyLCBnZnApOworCWlmICghcGVlcikKKwkJcmV0dXJuIE5VTEw7CisKKwlzY3RwX3RyYW5zcG9ydF9zZXRfb3duZXIocGVlciwgYXNvYyk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBwbXR1IG9mIHRoZSB0cmFuc3BvcnQuICovCisJc2N0cF90cmFuc3BvcnRfcG10dShwZWVyKTsKKworCS8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRyYW5zcG9ydCBhZGRyIG9uIHRoaXMgYXNzb2NpYXRpb24sCisJICogaW5pdGlhbGl6ZSB0aGUgYXNzb2NpYXRpb24gUE1UVSB0byB0aGUgcGVlcidzIFBNVFUuCisJICogSWYgbm90IGFuZCB0aGUgY3VycmVudCBhc3NvY2lhdGlvbiBQTVRVIGlzIGhpZ2hlciB0aGFuIHRoZSBuZXcKKwkgKiBwZWVyJ3MgUE1UVSwgcmVzZXQgdGhlIGFzc29jaWF0aW9uIFBNVFUgdG8gdGhlIG5ldyBwZWVyJ3MgUE1UVS4KKwkgKi8KKwlpZiAoYXNvYy0+cG10dSkKKwkJYXNvYy0+cG10dSA9IG1pbl90KGludCwgcGVlci0+cG10dSwgYXNvYy0+cG10dSk7CisJZWxzZQorCQlhc29jLT5wbXR1ID0gcGVlci0+cG10dTsKKworCVNDVFBfREVCVUdfUFJJTlRLKCJzY3RwX2Fzc29jX2FkZF9wZWVyOmFzc29jaWF0aW9uICVwIFBNVFUgc2V0IHRvICIKKwkJCSAgIiVkXG4iLCBhc29jLCBhc29jLT5wbXR1KTsKKworCWFzb2MtPmZyYWdfcG9pbnQgPSBzY3RwX2ZyYWdfcG9pbnQoc3AsIGFzb2MtPnBtdHUpOworCisJLyogVGhlIGFzb2MtPnBlZXIucG9ydCBtaWdodCBub3QgYmUgbWVhbmluZ2Z1bCB5ZXQsIGJ1dAorCSAqIGluaXRpYWxpemUgdGhlIHBhY2tldCBzdHJ1Y3R1cmUgYW55d2F5LgorCSAqLworCXNjdHBfcGFja2V0X2luaXQoJnBlZXItPnBhY2tldCwgcGVlciwgYXNvYy0+YmFzZS5iaW5kX2FkZHIucG9ydCwKKwkJCSBhc29jLT5wZWVyLnBvcnQpOworCisJLyogNy4yLjEgU2xvdy1TdGFydAorCSAqCisJICogbyBUaGUgaW5pdGlhbCBjd25kIGJlZm9yZSBEQVRBIHRyYW5zbWlzc2lvbiBvciBhZnRlciBhIHN1ZmZpY2llbnRseQorCSAqICAgbG9uZyBpZGxlIHBlcmlvZCBNVVNUIGJlIHNldCB0bworCSAqICAgICAgbWluKDQqTVRVLCBtYXgoMipNVFUsIDQzODAgYnl0ZXMpKQorCSAqCisJICogbyBUaGUgaW5pdGlhbCB2YWx1ZSBvZiBzc3RocmVzaCBNQVkgYmUgYXJiaXRyYXJpbHkgaGlnaAorCSAqICAgKGZvciBleGFtcGxlLCBpbXBsZW1lbnRhdGlvbnMgTUFZIHVzZSB0aGUgc2l6ZSBvZiB0aGUKKwkgKiAgIHJlY2VpdmVyIGFkdmVydGlzZWQgd2luZG93KS4KKwkgKi8KKwlwZWVyLT5jd25kID0gbWluKDQqYXNvYy0+cG10dSwgbWF4X3QoX191MzIsIDIqYXNvYy0+cG10dSwgNDM4MCkpOworCisJLyogQXQgdGhpcyBwb2ludCwgd2UgbWF5IG5vdCBoYXZlIHRoZSByZWNlaXZlcidzIGFkdmVydGlzZWQgd2luZG93LAorCSAqIHNvIGluaXRpYWxpemUgc3N0aHJlc2ggdG8gdGhlIGRlZmF1bHQgdmFsdWUgYW5kIGl0IHdpbGwgYmUgc2V0CisJICogbGF0ZXIgd2hlbiB3ZSBwcm9jZXNzIHRoZSBJTklULgorCSAqLworCXBlZXItPnNzdGhyZXNoID0gU0NUUF9ERUZBVUxUX01BWFdJTkRPVzsKKworCXBlZXItPnBhcnRpYWxfYnl0ZXNfYWNrZWQgPSAwOworCXBlZXItPmZsaWdodF9zaXplID0gMDsKKworCS8qIEJ5IGRlZmF1bHQsIGVuYWJsZSBoZWFydGJlYXQgZm9yIHBlZXIgYWRkcmVzcy4gKi8KKwlwZWVyLT5oYl9hbGxvd2VkID0gMTsKKworCS8qIEluaXRpYWxpemUgdGhlIHBlZXIncyBoZWFydGJlYXQgaW50ZXJ2YWwgYmFzZWQgb24gdGhlCisJICogc29jayBjb25maWd1cmVkIHZhbHVlLgorCSAqLworCXBlZXItPmhiX2ludGVydmFsID0gbXNlY3NfdG9famlmZmllcyhzcC0+cGFkZHJwYXJhbS5zcHBfaGJpbnRlcnZhbCk7CisKKwkvKiBTZXQgdGhlIHBhdGggbWF4X3JldHJhbnMuICAqLworCXBlZXItPm1heF9yZXRyYW5zID0gc3AtPnBhZGRycGFyYW0uc3BwX3BhdGhtYXhyeHQ7CisKKwkvKiBTZXQgdGhlIHRyYW5zcG9ydCdzIFJUTy5pbml0aWFsIHZhbHVlICovCisJcGVlci0+cnRvID0gYXNvYy0+cnRvX2luaXRpYWw7CisKKwkvKiBBdHRhY2ggdGhlIHJlbW90ZSB0cmFuc3BvcnQgdG8gb3VyIGFzb2MuICAqLworCWxpc3RfYWRkX3RhaWwoJnBlZXItPnRyYW5zcG9ydHMsICZhc29jLT5wZWVyLnRyYW5zcG9ydF9hZGRyX2xpc3QpOworCisJLyogSWYgd2UgZG8gbm90IHlldCBoYXZlIGEgcHJpbWFyeSBwYXRoLCBzZXQgb25lLiAgKi8KKwlpZiAoIWFzb2MtPnBlZXIucHJpbWFyeV9wYXRoKSB7CisJCXNjdHBfYXNzb2Nfc2V0X3ByaW1hcnkoYXNvYywgcGVlcik7CisJCWFzb2MtPnBlZXIucmV0cmFuX3BhdGggPSBwZWVyOworCX0KKworCWlmIChhc29jLT5wZWVyLmFjdGl2ZV9wYXRoID09IGFzb2MtPnBlZXIucmV0cmFuX3BhdGgpCisJCWFzb2MtPnBlZXIucmV0cmFuX3BhdGggPSBwZWVyOworCisJcmV0dXJuIHBlZXI7Cit9CisKKy8qIERlbGV0ZSBhIHRyYW5zcG9ydCBhZGRyZXNzIGZyb20gYW4gYXNzb2NpYXRpb24uICAqLwordm9pZCBzY3RwX2Fzc29jX2RlbF9wZWVyKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJIGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqYWRkcikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkCSpwb3M7CisJc3RydWN0IGxpc3RfaGVhZAkqdGVtcDsKKwlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQJKnBlZXIgPSBOVUxMOworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydAkqdHJhbnNwb3J0OworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdGVtcCwgJmFzb2MtPnBlZXIudHJhbnNwb3J0X2FkZHJfbGlzdCkgeworCQl0cmFuc3BvcnQgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHNjdHBfdHJhbnNwb3J0LCB0cmFuc3BvcnRzKTsKKwkJaWYgKHNjdHBfY21wX2FkZHJfZXhhY3QoYWRkciwgJnRyYW5zcG9ydC0+aXBhZGRyKSkgeworCQkJcGVlciA9IHRyYW5zcG9ydDsKKwkJCWxpc3RfZGVsKHBvcyk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIFRoZSBhZGRyZXNzIHdlIHdhbnQgZGVsZXRlIGlzIG5vdCBpbiB0aGUgYXNzb2NpYXRpb24uICovCisJaWYgKCFwZWVyKQorCQlyZXR1cm47CisKKwkvKiBHZXQgdGhlIGZpcnN0IHRyYW5zcG9ydCBvZiBhc29jLiAqLyAKKwlwb3MgPSBhc29jLT5wZWVyLnRyYW5zcG9ydF9hZGRyX2xpc3QubmV4dDsKKwl0cmFuc3BvcnQgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHNjdHBfdHJhbnNwb3J0LCB0cmFuc3BvcnRzKTsKKworCS8qIFVwZGF0ZSBhbnkgZW50cmllcyB0aGF0IG1hdGNoIHRoZSBwZWVyIHRvIGJlIGRlbGV0ZWQuICovICAKKwlpZiAoYXNvYy0+cGVlci5wcmltYXJ5X3BhdGggPT0gcGVlcikKKwkJc2N0cF9hc3NvY19zZXRfcHJpbWFyeShhc29jLCB0cmFuc3BvcnQpOworCWlmIChhc29jLT5wZWVyLmFjdGl2ZV9wYXRoID09IHBlZXIpCisJCWFzb2MtPnBlZXIuYWN0aXZlX3BhdGggPSB0cmFuc3BvcnQ7CisJaWYgKGFzb2MtPnBlZXIucmV0cmFuX3BhdGggPT0gcGVlcikKKwkJYXNvYy0+cGVlci5yZXRyYW5fcGF0aCA9IHRyYW5zcG9ydDsKKwlpZiAoYXNvYy0+cGVlci5sYXN0X2RhdGFfZnJvbSA9PSBwZWVyKQorCQlhc29jLT5wZWVyLmxhc3RfZGF0YV9mcm9tID0gdHJhbnNwb3J0OworCisJc2N0cF90cmFuc3BvcnRfZnJlZShwZWVyKTsKK30KKworLyogTG9va3VwIGEgdHJhbnNwb3J0IGJ5IGFkZHJlc3MuICovCitzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnNjdHBfYXNzb2NfbG9va3VwX3BhZGRyKAorCQkJCQljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkJY29uc3QgdW5pb24gc2N0cF9hZGRyICphZGRyZXNzKQoreworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisKKwkvKiBDeWNsZSB0aHJvdWdoIGFsbCB0cmFuc3BvcnRzIHNlYXJjaGluZyBmb3IgYSBwZWVyIGFkZHJlc3MuICovCisKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJmFzb2MtPnBlZXIudHJhbnNwb3J0X2FkZHJfbGlzdCkgeworCQl0ID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCwgdHJhbnNwb3J0cyk7CisJCWlmIChzY3RwX2NtcF9hZGRyX2V4YWN0KGFkZHJlc3MsICZ0LT5pcGFkZHIpKQorCQkJcmV0dXJuIHQ7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIEVuZ2FnZSBpbiB0cmFuc3BvcnQgY29udHJvbCBvcGVyYXRpb25zLgorICogTWFyayB0aGUgdHJhbnNwb3J0IHVwIG9yIGRvd24gYW5kIHNlbmQgYSBub3RpZmljYXRpb24gdG8gdGhlIHVzZXIuCisgKiBTZWxlY3QgYW5kIHVwZGF0ZSB0aGUgbmV3IGFjdGl2ZSBhbmQgcmV0cmFuIHBhdGhzLgorICovCit2b2lkIHNjdHBfYXNzb2NfY29udHJvbF90cmFuc3BvcnQoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJICBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydCwKKwkJCQkgIHNjdHBfdHJhbnNwb3J0X2NtZF90IGNvbW1hbmQsCisJCQkJICBzY3RwX3NuX2Vycm9yX3QgZXJyb3IpCit7CisJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0ID0gTlVMTDsKKwlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKmZpcnN0OworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqc2Vjb25kOworCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJaW50IHNwY19zdGF0ZSA9IDA7CisKKwkvKiBSZWNvcmQgdGhlIHRyYW5zaXRpb24gb24gdGhlIHRyYW5zcG9ydC4gICovCisJc3dpdGNoIChjb21tYW5kKSB7CisJY2FzZSBTQ1RQX1RSQU5TUE9SVF9VUDoKKwkJdHJhbnNwb3J0LT5hY3RpdmUgPSBTQ1RQX0FDVElWRTsKKwkJc3BjX3N0YXRlID0gU0NUUF9BRERSX0FWQUlMQUJMRTsKKwkJYnJlYWs7CisKKwljYXNlIFNDVFBfVFJBTlNQT1JUX0RPV046CisJCXRyYW5zcG9ydC0+YWN0aXZlID0gU0NUUF9JTkFDVElWRTsKKwkJc3BjX3N0YXRlID0gU0NUUF9BRERSX1VOUkVBQ0hBQkxFOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9OworCisJLyogR2VuZXJhdGUgYW5kIHNlbmQgYSBTQ1RQX1BFRVJfQUREUl9DSEFOR0Ugbm90aWZpY2F0aW9uIHRvIHRoZQorCSAqIHVzZXIuCisJICovCisJZXZlbnQgPSBzY3RwX3VscGV2ZW50X21ha2VfcGVlcl9hZGRyX2NoYW5nZShhc29jLAorCQkJCShzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqKSAmdHJhbnNwb3J0LT5pcGFkZHIsCisJCQkJMCwgc3BjX3N0YXRlLCBlcnJvciwgR0ZQX0FUT01JQyk7CisJaWYgKGV2ZW50KQorCQlzY3RwX3VscHFfdGFpbF9ldmVudCgmYXNvYy0+dWxwcSwgZXZlbnQpOworCisJLyogU2VsZWN0IG5ldyBhY3RpdmUgYW5kIHJldHJhbiBwYXRocy4gKi8KKworCS8qIExvb2sgZm9yIHRoZSB0d28gbW9zdCByZWNlbnRseSB1c2VkIGFjdGl2ZSB0cmFuc3BvcnRzLgorCSAqCisJICogVGhpcyBjb2RlIHByb2R1Y2VzIHRoZSB3cm9uZyBvcmRlcmluZyB3aGVuZXZlciBqaWZmaWVzCisJICogcm9sbHMgb3ZlciwgYnV0IHdlIHN0aWxsIGdldCB1c2FibGUgdHJhbnNwb3J0cywgc28gd2UgZG9uJ3QKKwkgKiB3b3JyeSBhYm91dCBpdC4KKwkgKi8KKwlmaXJzdCA9IE5VTEw7IHNlY29uZCA9IE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJmFzb2MtPnBlZXIudHJhbnNwb3J0X2FkZHJfbGlzdCkgeworCQl0ID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCwgdHJhbnNwb3J0cyk7CisKKwkJaWYgKCF0LT5hY3RpdmUpCisJCQljb250aW51ZTsKKwkJaWYgKCFmaXJzdCB8fCB0LT5sYXN0X3RpbWVfaGVhcmQgPiBmaXJzdC0+bGFzdF90aW1lX2hlYXJkKSB7CisJCQlzZWNvbmQgPSBmaXJzdDsKKwkJCWZpcnN0ID0gdDsKKwkJfQorCQlpZiAoIXNlY29uZCB8fCB0LT5sYXN0X3RpbWVfaGVhcmQgPiBzZWNvbmQtPmxhc3RfdGltZV9oZWFyZCkKKwkJCXNlY29uZCA9IHQ7CisJfQorCisJLyogUkZDIDI5NjAgNi40IE11bHRpLUhvbWVkIFNDVFAgRW5kcG9pbnRzCisJICoKKwkgKiBCeSBkZWZhdWx0LCBhbiBlbmRwb2ludCBzaG91bGQgYWx3YXlzIHRyYW5zbWl0IHRvIHRoZQorCSAqIHByaW1hcnkgcGF0aCwgdW5sZXNzIHRoZSBTQ1RQIHVzZXIgZXhwbGljaXRseSBzcGVjaWZpZXMgdGhlCisJICogZGVzdGluYXRpb24gdHJhbnNwb3J0IGFkZHJlc3MgKGFuZCBwb3NzaWJseSBzb3VyY2UKKwkgKiB0cmFuc3BvcnQgYWRkcmVzcykgdG8gdXNlLgorCSAqCisJICogW0lmIHRoZSBwcmltYXJ5IGlzIGFjdGl2ZSBidXQgbm90IG1vc3QgcmVjZW50LCBidW1wIHRoZSBtb3N0CisJICogcmVjZW50bHkgdXNlZCB0cmFuc3BvcnQuXQorCSAqLworCWlmIChhc29jLT5wZWVyLnByaW1hcnlfcGF0aC0+YWN0aXZlICYmCisJICAgIGZpcnN0ICE9IGFzb2MtPnBlZXIucHJpbWFyeV9wYXRoKSB7CisJCXNlY29uZCA9IGZpcnN0OworCQlmaXJzdCA9IGFzb2MtPnBlZXIucHJpbWFyeV9wYXRoOworCX0KKworCS8qIElmIHdlIGZhaWxlZCB0byBmaW5kIGEgdXNhYmxlIHRyYW5zcG9ydCwganVzdCBjYW1wIG9uIHRoZQorCSAqIHByaW1hcnksIGV2ZW4gaWYgaXQgaXMgaW5hY3RpdmUuCisJICovCisJaWYgKCFmaXJzdCkgeworCQlmaXJzdCA9IGFzb2MtPnBlZXIucHJpbWFyeV9wYXRoOworCQlzZWNvbmQgPSBhc29jLT5wZWVyLnByaW1hcnlfcGF0aDsKKwl9CisKKwkvKiBTZXQgdGhlIGFjdGl2ZSBhbmQgcmV0cmFuIHRyYW5zcG9ydHMuICAqLworCWFzb2MtPnBlZXIuYWN0aXZlX3BhdGggPSBmaXJzdDsKKwlhc29jLT5wZWVyLnJldHJhbl9wYXRoID0gc2Vjb25kOworfQorCisvKiBIb2xkIGEgcmVmZXJlbmNlIHRvIGFuIGFzc29jaWF0aW9uLiAqLwordm9pZCBzY3RwX2Fzc29jaWF0aW9uX2hvbGQoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MpCit7CisJYXRvbWljX2luYygmYXNvYy0+YmFzZS5yZWZjbnQpOworfQorCisvKiBSZWxlYXNlIGEgcmVmZXJlbmNlIHRvIGFuIGFzc29jaWF0aW9uIGFuZCBjbGVhbnVwCisgKiBpZiB0aGVyZSBhcmUgbm8gbW9yZSByZWZlcmVuY2VzLgorICovCit2b2lkIHNjdHBfYXNzb2NpYXRpb25fcHV0KHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZhc29jLT5iYXNlLnJlZmNudCkpCisJCXNjdHBfYXNzb2NpYXRpb25fZGVzdHJveShhc29jKTsKK30KKworLyogQWxsb2NhdGUgdGhlIG5leHQgVFNOLCBUcmFuc21pc3Npb24gU2VxdWVuY2UgTnVtYmVyLCBmb3IgdGhlIGdpdmVuCisgKiBhc3NvY2lhdGlvbi4KKyAqLworX191MzIgc2N0cF9hc3NvY2lhdGlvbl9nZXRfbmV4dF90c24oc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MpCit7CisJLyogRnJvbSBTZWN0aW9uIDEuNiBTZXJpYWwgTnVtYmVyIEFyaXRobWV0aWM6CisJICogVHJhbnNtaXNzaW9uIFNlcXVlbmNlIE51bWJlcnMgd3JhcCBhcm91bmQgd2hlbiB0aGV5IHJlYWNoCisJICogMioqMzIgLSAxLiAgVGhhdCBpcywgdGhlIG5leHQgVFNOIGEgREFUQSBjaHVuayBNVVNUIHVzZQorCSAqIGFmdGVyIHRyYW5zbWl0dGluZyBUU04gPSAyKjMyIC0gMSBpcyBUU04gPSAwLgorCSAqLworCV9fdTMyIHJldHZhbCA9IGFzb2MtPm5leHRfdHNuOworCWFzb2MtPm5leHRfdHNuKys7CisJYXNvYy0+dW5hY2tfZGF0YSsrOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogQ29tcGFyZSB0d28gYWRkcmVzc2VzIHRvIHNlZSBpZiB0aGV5IG1hdGNoLiAgV2lsZGNhcmQgYWRkcmVzc2VzCisgKiBvbmx5IG1hdGNoIHRoZW1zZWx2ZXMuCisgKi8KK2ludCBzY3RwX2NtcF9hZGRyX2V4YWN0KGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqc3MxLAorCQkJY29uc3QgdW5pb24gc2N0cF9hZGRyICpzczIpCit7CisJc3RydWN0IHNjdHBfYWYgKmFmOworCisJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhzczEtPnNhLnNhX2ZhbWlseSk7CisJaWYgKHVubGlrZWx5KCFhZikpCisJCXJldHVybiAwOworCisJcmV0dXJuIGFmLT5jbXBfYWRkcihzczEsIHNzMik7Cit9CisKKy8qIFJldHVybiBhbiBlY25lIGNodW5rIHRvIGdldCBwcmVwZW5kZWQgdG8gYSBwYWNrZXQuCisgKiBOb3RlOiAgV2UgYXJlIHNseSBhbmQgcmV0dXJuIGEgc2hhcmVkLCBwcmVhbGxvY2VkIGNodW5rLiAgRklYTUU6CisgKiBObyB3ZSBkb24ndCwgYnV0IHdlIGNvdWxkL3Nob3VsZC4KKyAqLworc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfZ2V0X2VjbmVfcHJlcGVuZChzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYykKK3sKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bms7CisKKwkvKiBTZW5kIEVDTkUgaWYgbmVlZGVkLgorCSAqIE5vdCBiZWluZyBhYmxlIHRvIGFsbG9jYXRlIGEgY2h1bmsgaGVyZSBpcyBub3QgZGVhZGx5LgorCSAqLworCWlmIChhc29jLT5uZWVkX2VjbmUpCisJCWNodW5rID0gc2N0cF9tYWtlX2VjbmUoYXNvYywgYXNvYy0+bGFzdF9lY25lX3Rzbik7CisJZWxzZQorCQljaHVuayA9IE5VTEw7CisKKwlyZXR1cm4gY2h1bms7Cit9CisKKy8qCisgKiBGaW5kIHdoaWNoIHRyYW5zcG9ydCB0aGlzIFRTTiB3YXMgc2VudCBvbi4KKyAqLworc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpzY3RwX2Fzc29jX2xvb2t1cF90c24oc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJCSAgICAgX191MzIgdHNuKQoreworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqYWN0aXZlOworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqbWF0Y2g7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICpwb3M7CisJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rOworCV9fdTMyIGtleSA9IGh0b25sKHRzbik7CisKKwltYXRjaCA9IE5VTEw7CisKKwkvKgorCSAqIEZJWE1FOiBJbiBnZW5lcmFsLCBmaW5kIGEgbW9yZSBlZmZpY2llbnQgZGF0YSBzdHJ1Y3R1cmUgZm9yCisJICogc2VhcmNoaW5nLgorCSAqLworCisJLyoKKwkgKiBUaGUgZ2VuZXJhbCBzdHJhdGVneSBpcyB0byBzZWFyY2ggZWFjaCB0cmFuc3BvcnQncyB0cmFuc21pdHRlZAorCSAqIGxpc3QuICAgUmV0dXJuIHdoaWNoIHRyYW5zcG9ydCB0aGlzIFRTTiBsaXZlcyBvbi4KKwkgKgorCSAqIExldCdzIGJlIGhvcGVmdWwgYW5kIGNoZWNrIHRoZSBhY3RpdmVfcGF0aCBmaXJzdC4KKwkgKiBBbm90aGVyIG9wdGltaXphdGlvbiB3b3VsZCBiZSB0byBrbm93IGlmIHRoZXJlIGlzIG9ubHkgb25lCisJICogb3V0Ym91bmQgcGF0aCBhbmQgbm90IGhhdmUgdG8gbG9vayBmb3IgdGhlIFRTTiBhdCBhbGwuCisJICoKKwkgKi8KKworCWFjdGl2ZSA9IGFzb2MtPnBlZXIuYWN0aXZlX3BhdGg7CisKKwlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmYWN0aXZlLT50cmFuc21pdHRlZCkgeworCQljaHVuayA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBzY3RwX2NodW5rLCB0cmFuc21pdHRlZF9saXN0KTsKKworCQlpZiAoa2V5ID09IGNodW5rLT5zdWJoLmRhdGFfaGRyLT50c24pIHsKKwkJCW1hdGNoID0gYWN0aXZlOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKiBJZiBub3QgZm91bmQsIGdvIHNlYXJjaCBhbGwgdGhlIG90aGVyIHRyYW5zcG9ydHMuICovCisJbGlzdF9mb3JfZWFjaChwb3MsICZhc29jLT5wZWVyLnRyYW5zcG9ydF9hZGRyX2xpc3QpIHsKKwkJdHJhbnNwb3J0ID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCwgdHJhbnNwb3J0cyk7CisKKwkJaWYgKHRyYW5zcG9ydCA9PSBhY3RpdmUpCisJCQlicmVhazsKKwkJbGlzdF9mb3JfZWFjaChlbnRyeSwgJnRyYW5zcG9ydC0+dHJhbnNtaXR0ZWQpIHsKKwkJCWNodW5rID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHNjdHBfY2h1bmssCisJCQkJCSAgIHRyYW5zbWl0dGVkX2xpc3QpOworCQkJaWYgKGtleSA9PSBjaHVuay0+c3ViaC5kYXRhX2hkci0+dHNuKSB7CisJCQkJbWF0Y2ggPSB0cmFuc3BvcnQ7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwl9CitvdXQ6CisJcmV0dXJuIG1hdGNoOworfQorCisvKiBJcyB0aGlzIHRoZSBhc3NvY2lhdGlvbiB3ZSBhcmUgbG9va2luZyBmb3I/ICovCitzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnNjdHBfYXNzb2NfaXNfbWF0Y2goc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJCSAgIGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqbGFkZHIsCisJCQkJCSAgIGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqcGFkZHIpCit7CisJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisKKwlzY3RwX3JlYWRfbG9jaygmYXNvYy0+YmFzZS5hZGRyX2xvY2spOworCisJaWYgKChhc29jLT5iYXNlLmJpbmRfYWRkci5wb3J0ID09IGxhZGRyLT52NC5zaW5fcG9ydCkgJiYKKwkgICAgKGFzb2MtPnBlZXIucG9ydCA9PSBwYWRkci0+djQuc2luX3BvcnQpKSB7CisJCXRyYW5zcG9ydCA9IHNjdHBfYXNzb2NfbG9va3VwX3BhZGRyKGFzb2MsIHBhZGRyKTsKKwkJaWYgKCF0cmFuc3BvcnQpCisJCQlnb3RvIG91dDsKKworCQlpZiAoc2N0cF9iaW5kX2FkZHJfbWF0Y2goJmFzb2MtPmJhc2UuYmluZF9hZGRyLCBsYWRkciwKKwkJCQkJIHNjdHBfc2soYXNvYy0+YmFzZS5zaykpKQorCQkJZ290byBvdXQ7CisJfQorCXRyYW5zcG9ydCA9IE5VTEw7CisKK291dDoKKwlzY3RwX3JlYWRfdW5sb2NrKCZhc29jLT5iYXNlLmFkZHJfbG9jayk7CisJcmV0dXJuIHRyYW5zcG9ydDsKK30KKworLyogRG8gZGVsYXllZCBpbnB1dCBwcm9jZXNzaW5nLiAgVGhpcyBpcyBzY2hlZHVsZWQgYnkgc2N0cF9yY3YoKS4gKi8KK3N0YXRpYyB2b2lkIHNjdHBfYXNzb2NfYmhfcmN2KHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKQoreworCXN0cnVjdCBzY3RwX2VuZHBvaW50ICplcDsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bms7CisJc3RydWN0IHNvY2sgKnNrOworCXN0cnVjdCBzY3RwX2lucSAqaW5xdWV1ZTsKKwlpbnQgc3RhdGU7CisJc2N0cF9zdWJ0eXBlX3Qgc3VidHlwZTsKKwlpbnQgZXJyb3IgPSAwOworCisJLyogVGhlIGFzc29jaWF0aW9uIHNob3VsZCBiZSBoZWxkIHNvIHdlIHNob3VsZCBiZSBzYWZlLiAqLworCWVwID0gYXNvYy0+ZXA7CisJc2sgPSBhc29jLT5iYXNlLnNrOworCisJaW5xdWV1ZSA9ICZhc29jLT5iYXNlLmlucXVldWU7CisJc2N0cF9hc3NvY2lhdGlvbl9ob2xkKGFzb2MpOworCXdoaWxlIChOVUxMICE9IChjaHVuayA9IHNjdHBfaW5xX3BvcChpbnF1ZXVlKSkpIHsKKwkJc3RhdGUgPSBhc29jLT5zdGF0ZTsKKwkJc3VidHlwZSA9IFNDVFBfU1RfQ0hVTksoY2h1bmstPmNodW5rX2hkci0+dHlwZSk7CisKKwkJLyogUmVtZW1iZXIgd2hlcmUgdGhlIGxhc3QgREFUQSBjaHVuayBjYW1lIGZyb20gc28gd2UKKwkJICoga25vdyB3aGVyZSB0byBzZW5kIHRoZSBTQUNLLgorCQkgKi8KKwkJaWYgKHNjdHBfY2h1bmtfaXNfZGF0YShjaHVuaykpCisJCQlhc29jLT5wZWVyLmxhc3RfZGF0YV9mcm9tID0gY2h1bmstPnRyYW5zcG9ydDsKKwkJZWxzZQorCQkJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfSU5DVFJMQ0hVTktTKTsKKworCQlpZiAoY2h1bmstPnRyYW5zcG9ydCkKKwkJCWNodW5rLT50cmFuc3BvcnQtPmxhc3RfdGltZV9oZWFyZCA9IGppZmZpZXM7CisKKwkJLyogUnVuIHRocm91Z2ggdGhlIHN0YXRlIG1hY2hpbmUuICovCisJCWVycm9yID0gc2N0cF9kb19zbShTQ1RQX0VWRU5UX1RfQ0hVTkssIHN1YnR5cGUsCisJCQkJICAgc3RhdGUsIGVwLCBhc29jLCBjaHVuaywgR0ZQX0FUT01JQyk7CisKKwkJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBhc3NvY2lhdGlvbiBpcyBmcmVlZCBpbiByZXNwb25zZSB0bworCQkgKiB0aGUgaW5jb21pbmcgY2h1bmsuICBJZiBzbywgZ2V0IG91dCBvZiB0aGUgd2hpbGUgbG9vcC4KKwkJICovCisJCWlmIChhc29jLT5iYXNlLmRlYWQpCisJCQlicmVhazsKKworCQkvKiBJZiB0aGVyZSBpcyBhbiBlcnJvciBvbiBjaHVuaywgZGlzY2FyZCB0aGlzIHBhY2tldC4gKi8KKwkJaWYgKGVycm9yICYmIGNodW5rKQorCQkJY2h1bmstPnBkaXNjYXJkID0gMTsKKwl9CisJc2N0cF9hc3NvY2lhdGlvbl9wdXQoYXNvYyk7Cit9CisKKy8qIFRoaXMgcm91dGluZSBtb3ZlcyBhbiBhc3NvY2lhdGlvbiBmcm9tIGl0cyBvbGQgc2sgdG8gYSBuZXcgc2suICAqLwordm9pZCBzY3RwX2Fzc29jX21pZ3JhdGUoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzc29jLCBzdHJ1Y3Qgc29jayAqbmV3c2spCit7CisJc3RydWN0IHNjdHBfc29jayAqbmV3c3AgPSBzY3RwX3NrKG5ld3NrKTsKKwlzdHJ1Y3Qgc29jayAqb2xkc2sgPSBhc3NvYy0+YmFzZS5zazsKKworCS8qIERlbGV0ZSB0aGUgYXNzb2NpYXRpb24gZnJvbSB0aGUgb2xkIGVuZHBvaW50J3MgbGlzdCBvZgorCSAqIGFzc29jaWF0aW9ucy4KKwkgKi8KKwlsaXN0X2RlbF9pbml0KCZhc3NvYy0+YXNvY3MpOworCisJLyogRGVjcmVtZW50IHRoZSBiYWNrbG9nIHZhbHVlIGZvciBhIFRDUC1zdHlsZSBzb2NrZXQuICovCisJaWYgKHNjdHBfc3R5bGUob2xkc2ssIFRDUCkpCisJCW9sZHNrLT5za19hY2tfYmFja2xvZy0tOworCisJLyogUmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSBvbGQgZW5kcG9pbnQgYW5kIHRoZSBzb2NrLiAgKi8KKwlzY3RwX2VuZHBvaW50X3B1dChhc3NvYy0+ZXApOworCXNvY2tfcHV0KGFzc29jLT5iYXNlLnNrKTsKKworCS8qIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgbmV3IGVuZHBvaW50LiAgKi8KKwlhc3NvYy0+ZXAgPSBuZXdzcC0+ZXA7CisJc2N0cF9lbmRwb2ludF9ob2xkKGFzc29jLT5lcCk7CisKKwkvKiBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIG5ldyBzb2NrLiAgKi8KKwlhc3NvYy0+YmFzZS5zayA9IG5ld3NrOworCXNvY2tfaG9sZChhc3NvYy0+YmFzZS5zayk7CisKKwkvKiBBZGQgdGhlIGFzc29jaWF0aW9uIHRvIHRoZSBuZXcgZW5kcG9pbnQncyBsaXN0IG9mIGFzc29jaWF0aW9ucy4gICovCisJc2N0cF9lbmRwb2ludF9hZGRfYXNvYyhuZXdzcC0+ZXAsIGFzc29jKTsKK30KKworLyogVXBkYXRlIGFuIGFzc29jaWF0aW9uIChwb3NzaWJseSBmcm9tIHVuZXhwZWN0ZWQgQ09PS0lFLUVDSE8gcHJvY2Vzc2luZykuICAqLwordm9pZCBzY3RwX2Fzc29jX3VwZGF0ZShzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJICAgICAgIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICpuZXcpCit7CisJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICp0ZW1wOworCisJLyogQ29weSBpbiBuZXcgcGFyYW1ldGVycyBvZiBwZWVyLiAqLworCWFzb2MtPmMgPSBuZXctPmM7CisJYXNvYy0+cGVlci5yd25kID0gbmV3LT5wZWVyLnJ3bmQ7CisJYXNvYy0+cGVlci5zYWNrX25lZWRlZCA9IG5ldy0+cGVlci5zYWNrX25lZWRlZDsKKwlhc29jLT5wZWVyLmkgPSBuZXctPnBlZXIuaTsKKwlzY3RwX3Rzbm1hcF9pbml0KCZhc29jLT5wZWVyLnRzbl9tYXAsIFNDVFBfVFNOX01BUF9TSVpFLAorCQkJIGFzb2MtPnBlZXIuaS5pbml0aWFsX3Rzbik7CisKKwkvKiBSZW1vdmUgYW55IHBlZXIgYWRkcmVzc2VzIG5vdCBwcmVzZW50IGluIHRoZSBuZXcgYXNzb2NpYXRpb24uICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdGVtcCwgJmFzb2MtPnBlZXIudHJhbnNwb3J0X2FkZHJfbGlzdCkgeworCQl0cmFucyA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQsIHRyYW5zcG9ydHMpOworCQlpZiAoIXNjdHBfYXNzb2NfbG9va3VwX3BhZGRyKG5ldywgJnRyYW5zLT5pcGFkZHIpKQorCQkJc2N0cF9hc3NvY19kZWxfcGVlcihhc29jLCAmdHJhbnMtPmlwYWRkcik7CisJfQorCisJLyogSWYgdGhlIGNhc2UgaXMgQSAoYXNzb2NpYXRpb24gcmVzdGFydCksIHVzZQorCSAqIGluaXRpYWxfdHNuIGFzIG5leHRfdHNuLiBJZiB0aGUgY2FzZSBpcyBCLCB1c2UKKwkgKiBjdXJyZW50IG5leHRfdHNuIGluIGNhc2UgZGF0YSBzZW50IHRvIHBlZXIKKwkgKiBoYXMgYmVlbiBkaXNjYXJkZWQgYW5kIG5lZWRzIHJldHJhbnNtaXNzaW9uLgorCSAqLworCWlmIChhc29jLT5zdGF0ZSA+PSBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEKSB7CisJCWFzb2MtPm5leHRfdHNuID0gbmV3LT5uZXh0X3RzbjsKKwkJYXNvYy0+Y3Rzbl9hY2tfcG9pbnQgPSBuZXctPmN0c25fYWNrX3BvaW50OworCQlhc29jLT5hZHZfcGVlcl9hY2tfcG9pbnQgPSBuZXctPmFkdl9wZWVyX2Fja19wb2ludDsKKworCQkvKiBSZWluaXRpYWxpemUgU1NOIGZvciBib3RoIGxvY2FsIHN0cmVhbXMKKwkJICogYW5kIHBlZXIncyBzdHJlYW1zLgorCQkgKi8KKwkJc2N0cF9zc25tYXBfY2xlYXIoYXNvYy0+c3NubWFwKTsKKworCX0gZWxzZSB7CisJCS8qIEFkZCBhbnkgcGVlciBhZGRyZXNzZXMgZnJvbSB0aGUgbmV3IGFzc29jaWF0aW9uLiAqLworCQlsaXN0X2Zvcl9lYWNoKHBvcywgJm5ldy0+cGVlci50cmFuc3BvcnRfYWRkcl9saXN0KSB7CisJCQl0cmFucyA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQsCisJCQkJCSAgIHRyYW5zcG9ydHMpOworCQkJaWYgKCFzY3RwX2Fzc29jX2xvb2t1cF9wYWRkcihhc29jLCAmdHJhbnMtPmlwYWRkcikpCisJCQkJc2N0cF9hc3NvY19hZGRfcGVlcihhc29jLCAmdHJhbnMtPmlwYWRkciwKKwkJCQkJCSAgICBHRlBfQVRPTUlDKTsKKwkJfQorCisJCWFzb2MtPmN0c25fYWNrX3BvaW50ID0gYXNvYy0+bmV4dF90c24gLSAxOworCQlhc29jLT5hZHZfcGVlcl9hY2tfcG9pbnQgPSBhc29jLT5jdHNuX2Fja19wb2ludDsKKwkJaWYgKCFhc29jLT5zc25tYXApIHsKKwkJCS8qIE1vdmUgdGhlIHNzbm1hcC4gKi8KKwkJCWFzb2MtPnNzbm1hcCA9IG5ldy0+c3NubWFwOworCQkJbmV3LT5zc25tYXAgPSBOVUxMOworCQl9CisJfQorfQorCisvKiBVcGRhdGUgdGhlIHJldHJhbiBwYXRoIGZvciBzZW5kaW5nIGEgcmV0cmFuc21pdHRlZCBwYWNrZXQuCisgKiBSb3VuZC1yb2JpbiB0aHJvdWdoIHRoZSBhY3RpdmUgdHJhbnNwb3J0cywgZWxzZSByb3VuZC1yb2JpbgorICogdGhyb3VnaCB0aGUgaW5hY3RpdmUgdHJhbnNwb3J0cyBhcyB0aGlzIGlzIHRoZSBuZXh0IGJlc3QgdGhpbmcKKyAqIHdlIGNhbiB0cnkuCisgKi8KK3ZvaWQgc2N0cF9hc3NvY191cGRhdGVfcmV0cmFuX3BhdGgoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MpCit7CisJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0LCAqbmV4dDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJmFzb2MtPnBlZXIudHJhbnNwb3J0X2FkZHJfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisKKwkvKiBGaW5kIHRoZSBuZXh0IHRyYW5zcG9ydCBpbiBhIHJvdW5kLXJvYmluIGZhc2hpb24uICovCisJdCA9IGFzb2MtPnBlZXIucmV0cmFuX3BhdGg7CisJcG9zID0gJnQtPnRyYW5zcG9ydHM7CisJbmV4dCA9IE5VTEw7CisKKwl3aGlsZSAoMSkgeworCQkvKiBTa2lwIHRoZSBoZWFkLiAqLworCQlpZiAocG9zLT5uZXh0ID09IGhlYWQpCisJCQlwb3MgPSBoZWFkLT5uZXh0OworCQllbHNlCisJCQlwb3MgPSBwb3MtPm5leHQ7CisKKwkJdCA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQsIHRyYW5zcG9ydHMpOworCisJCS8qIFRyeSB0byBmaW5kIGFuIGFjdGl2ZSB0cmFuc3BvcnQuICovCisKKwkJaWYgKHQtPmFjdGl2ZSkgeworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQkvKiBLZWVwIHRyYWNrIG9mIHRoZSBuZXh0IHRyYW5zcG9ydCBpbiBjYXNlCisJCQkgKiB3ZSBkb24ndCBmaW5kIGFueSBhY3RpdmUgdHJhbnNwb3J0LgorCQkJICovCisJCQlpZiAoIW5leHQpCisJCQkJbmV4dCA9IHQ7CisJCX0KKworCQkvKiBXZSBoYXZlIGV4aGF1c3RlZCB0aGUgbGlzdCwgYnV0IGRpZG4ndCBmaW5kIGFueQorCQkgKiBvdGhlciBhY3RpdmUgdHJhbnNwb3J0cy4gIElmIHNvLCB1c2UgdGhlIG5leHQKKwkJICogdHJhbnNwb3J0LgorCQkgKi8KKwkJaWYgKHQgPT0gYXNvYy0+cGVlci5yZXRyYW5fcGF0aCkgeworCQkJdCA9IG5leHQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCWFzb2MtPnBlZXIucmV0cmFuX3BhdGggPSB0OworfQorCisvKiBDaG9vc2UgdGhlIHRyYW5zcG9ydCBmb3Igc2VuZGluZyBhIFNIVVRET1dOIHBhY2tldC4gICovCitzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnNjdHBfYXNzb2NfY2hvb3NlX3NodXRkb3duX3RyYW5zcG9ydCgKKwlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYykKK3sKKwkvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIFNIVVRET1dOIGlzIHNlbnQsIHVzZSB0aGUgYWN0aXZlIHBhdGgsCisJICogZWxzZSB1c2UgdGhlIHJldHJhbiBwYXRoLiBJZiB0aGUgbGFzdCBTSFVURE9XTiB3YXMgc2VudCBvdmVyIHRoZQorCSAqIHJldHJhbiBwYXRoLCB1cGRhdGUgdGhlIHJldHJhbiBwYXRoIGFuZCB1c2UgaXQuCisJICovCisJaWYgKCFhc29jLT5zaHV0ZG93bl9sYXN0X3NlbnRfdG8pCisJCXJldHVybiBhc29jLT5wZWVyLmFjdGl2ZV9wYXRoOworCWVsc2UgeworCQlpZiAoYXNvYy0+c2h1dGRvd25fbGFzdF9zZW50X3RvID09IGFzb2MtPnBlZXIucmV0cmFuX3BhdGgpCisJCQlzY3RwX2Fzc29jX3VwZGF0ZV9yZXRyYW5fcGF0aChhc29jKTsKKwkJcmV0dXJuIGFzb2MtPnBlZXIucmV0cmFuX3BhdGg7CisJfQorCit9CisKKy8qIFVwZGF0ZSB0aGUgYXNzb2NpYXRpb24ncyBwbXR1IGFuZCBmcmFnX3BvaW50IGJ5IGdvaW5nIHRocm91Z2ggYWxsIHRoZQorICogdHJhbnNwb3J0cy4gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIGEgdHJhbnNwb3J0J3MgUE1UVSBoYXMgY2hhbmdlZC4KKyAqLwordm9pZCBzY3RwX2Fzc29jX3N5bmNfcG10dShzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYykKK3sKKwlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnQ7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCV9fdTMyIHBtdHUgPSAwOworCisJaWYgKCFhc29jKQorCQlyZXR1cm47CisKKwkvKiBHZXQgdGhlIGxvd2VzdCBwbXR1IG9mIGFsbCB0aGUgdHJhbnNwb3J0cy4gKi8KKwlsaXN0X2Zvcl9lYWNoKHBvcywgJmFzb2MtPnBlZXIudHJhbnNwb3J0X2FkZHJfbGlzdCkgeworCQl0ID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCwgdHJhbnNwb3J0cyk7CisJCWlmICghcG10dSB8fCAodC0+cG10dSA8IHBtdHUpKQorCQkJcG10dSA9IHQtPnBtdHU7CisJfQorCisJaWYgKHBtdHUpIHsKKwkJc3RydWN0IHNjdHBfc29jayAqc3AgPSBzY3RwX3NrKGFzb2MtPmJhc2Uuc2spOworCQlhc29jLT5wbXR1ID0gcG10dTsKKwkJYXNvYy0+ZnJhZ19wb2ludCA9IHNjdHBfZnJhZ19wb2ludChzcCwgcG10dSk7CisJfQorCisJU0NUUF9ERUJVR19QUklOVEsoIiVzOiBhc29jOiVwLCBwbXR1OiVkLCBmcmFnX3BvaW50OiVkXG4iLAorCQkJICBfX0ZVTkNUSU9OX18sIGFzb2MsIGFzb2MtPnBtdHUsIGFzb2MtPmZyYWdfcG9pbnQpOworfQorCisvKiBTaG91bGQgd2Ugc2VuZCBhIFNBQ0sgdG8gdXBkYXRlIG91ciBwZWVyPyAqLworc3RhdGljIGlubGluZSBpbnQgc2N0cF9wZWVyX25lZWRzX3VwZGF0ZShzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYykKK3sKKwlzd2l0Y2ggKGFzb2MtPnN0YXRlKSB7CisJY2FzZSBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEOgorCWNhc2UgU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HOgorCWNhc2UgU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRDoKKwljYXNlIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVDoKKwkJaWYgKChhc29jLT5yd25kID4gYXNvYy0+YV9yd25kKSAmJgorCQkgICAgKChhc29jLT5yd25kIC0gYXNvYy0+YV9yd25kKSA+PQorCQkgICAgIG1pbl90KF9fdTMyLCAoYXNvYy0+YmFzZS5zay0+c2tfcmN2YnVmID4+IDEpLCBhc29jLT5wbXR1KSkpCisJCQlyZXR1cm4gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisvKiBJbmNyZWFzZSBhc29jJ3MgcnduZCBieSBsZW4gYW5kIHNlbmQgYW55IHdpbmRvdyB1cGRhdGUgU0FDSyBpZiBuZWVkZWQuICovCit2b2lkIHNjdHBfYXNzb2NfcnduZF9pbmNyZWFzZShzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywgdW5zaWduZWQgbGVuKQoreworCXN0cnVjdCBzY3RwX2NodW5rICpzYWNrOworCXN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcjsKKworCWlmIChhc29jLT5yd25kX292ZXIpIHsKKwkJaWYgKGFzb2MtPnJ3bmRfb3ZlciA+PSBsZW4pIHsKKwkJCWFzb2MtPnJ3bmRfb3ZlciAtPSBsZW47CisJCX0gZWxzZSB7CisJCQlhc29jLT5yd25kICs9IChsZW4gLSBhc29jLT5yd25kX292ZXIpOworCQkJYXNvYy0+cnduZF9vdmVyID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCWFzb2MtPnJ3bmQgKz0gbGVuOworCX0KKworCVNDVFBfREVCVUdfUFJJTlRLKCIlczogYXNvYyAlcCByd25kIGluY3JlYXNlZCBieSAlZCB0byAoJXUsICV1KSAiCisJCQkgICItICV1XG4iLCBfX0ZVTkNUSU9OX18sIGFzb2MsIGxlbiwgYXNvYy0+cnduZCwKKwkJCSAgYXNvYy0+cnduZF9vdmVyLCBhc29jLT5hX3J3bmQpOworCisJLyogU2VuZCBhIHdpbmRvdyB1cGRhdGUgU0FDSyBpZiB0aGUgcnduZCBoYXMgaW5jcmVhc2VkIGJ5IGF0IGxlYXN0IHRoZQorCSAqIG1pbmltdW0gb2YgdGhlIGFzc29jaWF0aW9uJ3MgUE1UVSBhbmQgaGFsZiBvZiB0aGUgcmVjZWl2ZSBidWZmZXIuCisJICogVGhlIGFsZ29yaXRobSB1c2VkIGlzIHNpbWlsYXIgdG8gdGhlIG9uZSBkZXNjcmliZWQgaW4KKwkgKiBTZWN0aW9uIDQuMi4zLjMgb2YgUkZDIDExMjIuCisJICovCisJaWYgKHNjdHBfcGVlcl9uZWVkc191cGRhdGUoYXNvYykpIHsKKwkJYXNvYy0+YV9yd25kID0gYXNvYy0+cnduZDsKKwkJU0NUUF9ERUJVR19QUklOVEsoIiVzOiBTZW5kaW5nIHdpbmRvdyB1cGRhdGUgU0FDSy0gYXNvYzogJXAgIgorCQkJCSAgInJ3bmQ6ICV1IGFfcnduZDogJXVcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkgIGFzb2MsIGFzb2MtPnJ3bmQsIGFzb2MtPmFfcnduZCk7CisJCXNhY2sgPSBzY3RwX21ha2Vfc2Fjayhhc29jKTsKKwkJaWYgKCFzYWNrKQorCQkJcmV0dXJuOworCisJCWFzb2MtPnBlZXIuc2Fja19uZWVkZWQgPSAwOworCisJCXNjdHBfb3V0cV90YWlsKCZhc29jLT5vdXRxdWV1ZSwgc2Fjayk7CisKKwkJLyogU3RvcCB0aGUgU0FDSyB0aW1lci4gICovCisJCXRpbWVyID0gJmFzb2MtPnRpbWVyc1tTQ1RQX0VWRU5UX1RJTUVPVVRfU0FDS107CisJCWlmICh0aW1lcl9wZW5kaW5nKHRpbWVyKSAmJiBkZWxfdGltZXIodGltZXIpKQorCQkJc2N0cF9hc3NvY2lhdGlvbl9wdXQoYXNvYyk7CisJfQorfQorCisvKiBEZWNyZWFzZSBhc29jJ3MgcnduZCBieSBsZW4uICovCit2b2lkIHNjdHBfYXNzb2NfcnduZF9kZWNyZWFzZShzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywgdW5zaWduZWQgbGVuKQoreworCVNDVFBfQVNTRVJUKGFzb2MtPnJ3bmQsICJyd25kIHplcm8iLCByZXR1cm4pOworCVNDVFBfQVNTRVJUKCFhc29jLT5yd25kX292ZXIsICJyd25kX292ZXIgbm90IHplcm8iLCByZXR1cm4pOworCWlmIChhc29jLT5yd25kID49IGxlbikgeworCQlhc29jLT5yd25kIC09IGxlbjsKKwl9IGVsc2UgeworCQlhc29jLT5yd25kX292ZXIgPSBsZW4gLSBhc29jLT5yd25kOworCQlhc29jLT5yd25kID0gMDsKKwl9CisJU0NUUF9ERUJVR19QUklOVEsoIiVzOiBhc29jICVwIHJ3bmQgZGVjcmVhc2VkIGJ5ICVkIHRvICgldSwgJXUpXG4iLAorCQkJICBfX0ZVTkNUSU9OX18sIGFzb2MsIGxlbiwgYXNvYy0+cnduZCwKKwkJCSAgYXNvYy0+cnduZF9vdmVyKTsKK30KKworLyogQnVpbGQgdGhlIGJpbmQgYWRkcmVzcyBsaXN0IGZvciB0aGUgYXNzb2NpYXRpb24gYmFzZWQgb24gaW5mbyBmcm9tIHRoZQorICogbG9jYWwgZW5kcG9pbnQgYW5kIHRoZSByZW1vdGUgcGVlci4KKyAqLworaW50IHNjdHBfYXNzb2Nfc2V0X2JpbmRfYWRkcl9mcm9tX2VwKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLCBpbnQgZ2ZwKQoreworCXNjdHBfc2NvcGVfdCBzY29wZTsKKwlpbnQgZmxhZ3M7CisKKwkvKiBVc2Ugc2NvcGluZyBydWxlcyB0byBkZXRlcm1pbmUgdGhlIHN1YnNldCBvZiBhZGRyZXNzZXMgZnJvbQorCSAqIHRoZSBlbmRwb2ludC4KKwkgKi8KKwlzY29wZSA9IHNjdHBfc2NvcGUoJmFzb2MtPnBlZXIuYWN0aXZlX3BhdGgtPmlwYWRkcik7CisJZmxhZ3MgPSAoUEZfSU5FVDYgPT0gYXNvYy0+YmFzZS5zay0+c2tfZmFtaWx5KSA/IFNDVFBfQUREUjZfQUxMT1dFRCA6IDA7CisJaWYgKGFzb2MtPnBlZXIuaXB2NF9hZGRyZXNzKQorCQlmbGFncyB8PSBTQ1RQX0FERFI0X1BFRVJTVVBQOworCWlmIChhc29jLT5wZWVyLmlwdjZfYWRkcmVzcykKKwkJZmxhZ3MgfD0gU0NUUF9BRERSNl9QRUVSU1VQUDsKKworCXJldHVybiBzY3RwX2JpbmRfYWRkcl9jb3B5KCZhc29jLT5iYXNlLmJpbmRfYWRkciwKKwkJCQkgICAmYXNvYy0+ZXAtPmJhc2UuYmluZF9hZGRyLAorCQkJCSAgIHNjb3BlLCBnZnAsIGZsYWdzKTsKK30KKworLyogQnVpbGQgdGhlIGFzc29jaWF0aW9uJ3MgYmluZCBhZGRyZXNzIGxpc3QgZnJvbSB0aGUgY29va2llLiAgKi8KK2ludCBzY3RwX2Fzc29jX3NldF9iaW5kX2FkZHJfZnJvbV9jb29raWUoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJCSBzdHJ1Y3Qgc2N0cF9jb29raWUgKmNvb2tpZSwgaW50IGdmcCkKK3sKKwlpbnQgdmFyX3NpemUyID0gbnRvaHMoY29va2llLT5wZWVyX2luaXQtPmNodW5rX2hkci5sZW5ndGgpOworCWludCB2YXJfc2l6ZTMgPSBjb29raWUtPnJhd19hZGRyX2xpc3RfbGVuOworCV9fdTggKnJhdyA9IChfX3U4ICopY29va2llLT5wZWVyX2luaXQgKyB2YXJfc2l6ZTI7CisKKwlyZXR1cm4gc2N0cF9yYXdfdG9fYmluZF9hZGRycygmYXNvYy0+YmFzZS5iaW5kX2FkZHIsIHJhdywgdmFyX3NpemUzLAorCQkJCSAgICAgIGFzb2MtPmVwLT5iYXNlLmJpbmRfYWRkci5wb3J0LCBnZnApOworfQorCisvKiBMb29rdXAgbGFkZHIgaW4gdGhlIGJpbmQgYWRkcmVzcyBsaXN0IG9mIGFuIGFzc29jaWF0aW9uLiAqLyAKK2ludCBzY3RwX2Fzc29jX2xvb2t1cF9sYWRkcihzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywgCisJCQkgICAgY29uc3QgdW5pb24gc2N0cF9hZGRyICpsYWRkcikKK3sKKwlpbnQgZm91bmQ7CisKKwlzY3RwX3JlYWRfbG9jaygmYXNvYy0+YmFzZS5hZGRyX2xvY2spOworCWlmICgoYXNvYy0+YmFzZS5iaW5kX2FkZHIucG9ydCA9PSBudG9ocyhsYWRkci0+djQuc2luX3BvcnQpKSAmJgorCSAgICBzY3RwX2JpbmRfYWRkcl9tYXRjaCgmYXNvYy0+YmFzZS5iaW5kX2FkZHIsIGxhZGRyLAorCQkJICAgICAgICAgc2N0cF9zayhhc29jLT5iYXNlLnNrKSkpIHsKKwkJZm91bmQgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3VuZCA9IDA7CitvdXQ6CisJc2N0cF9yZWFkX3VubG9jaygmYXNvYy0+YmFzZS5hZGRyX2xvY2spOworCXJldHVybiBmb3VuZDsKK30KZGlmZiAtLWdpdCBhL25ldC9zY3RwL2JpbmRfYWRkci5jIGIvbmV0L3NjdHAvYmluZF9hZGRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkwZWFkZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY3RwL2JpbmRfYWRkci5jCkBAIC0wLDAgKzEsNDE3IEBACisvKiBTQ1RQIGtlcm5lbCByZWZlcmVuY2UgSW1wbGVtZW50YXRpb24KKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDEsIDIwMDMKKyAqIENvcHlyaWdodCAoYykgQ2lzY28gMTk5OSwyMDAwCisgKiBDb3B5cmlnaHQgKGMpIE1vdG9yb2xhIDE5OTksMjAwMCwyMDAxCisgKiBDb3B5cmlnaHQgKGMpIExhIE1vbnRlIEguUC4gWWFycm9sbCAyMDAxCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFNDVFAga2VybmVsIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBBIGNvbGxlY3Rpb24gY2xhc3MgdG8gaGFuZGxlIHRoZSBzdG9yYWdlIG9mIHRyYW5zcG9ydCBhZGRyZXNzZXMuCisgKgorICogVGhlIFNDVFAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQKKyAqIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICogICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBQbGVhc2Ugc2VuZCBhbnkgYnVnIHJlcG9ydHMgb3IgZml4ZXMgeW91IG1ha2UgdG8gdGhlCisgKiBlbWFpbCBhZGRyZXNzKGVzKToKKyAqICAgIGxrc2N0cCBkZXZlbG9wZXJzIDxsa3NjdHAtZGV2ZWxvcGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogT3Igc3VibWl0IGEgYnVnIHJlcG9ydCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgd2Vic2l0ZToKKyAqICAgIGh0dHA6Ly93d3cuc2YubmV0L3Byb2plY3RzL2xrc2N0cAorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiAgICBMYSBNb250ZSBILlAuIFlhcnJvbGwgPHBpZ2d5QGFjbS5vcmc+CisgKiAgICBLYXJsIEtudXRzb24gICAgICAgICAgPGthcmxAYXRoZW5hLmNoaWNhZ28uaWwudXM+CisgKiAgICBKb24gR3JpbW0gICAgICAgICAgICAgPGpncmltbUB1cy5pYm0uY29tPgorICogICAgRGFpc3kgQ2hhbmcgICAgICAgICAgIDxkYWlzeWNAdXMuaWJtLmNvbT4KKyAqCisgKiBBbnkgYnVncyByZXBvcnRlZCBnaXZlbiB0byB1cyB3ZSB3aWxsIHRyeSB0byBmaXguLi4gYW55IGZpeGVzIHNoYXJlZCB3aWxsCisgKiBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbmV4dCBTQ1RQIHJlbGVhc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvaWZfaW5ldDYuaD4KKyNpbmNsdWRlIDxuZXQvc2N0cC9zY3RwLmg+CisjaW5jbHVkZSA8bmV0L3NjdHAvc20uaD4KKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIGludGVybmFsIGhlbHBlcnMuICovCitzdGF0aWMgaW50IHNjdHBfY29weV9vbmVfYWRkcihzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKiwgdW5pb24gc2N0cF9hZGRyICosCisJCQkgICAgICBzY3RwX3Njb3BlX3Qgc2NvcGUsIGludCBnZnAsIGludCBmbGFncyk7CitzdGF0aWMgdm9pZCBzY3RwX2JpbmRfYWRkcl9jbGVhbihzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKik7CisKKy8qIEZpcnN0IExldmVsIEFic3RyYWN0aW9ucy4gKi8KKworLyogQ29weSAnc3JjJyB0byAnZGVzdCcgdGFraW5nICdzY29wZScgaW50byBhY2NvdW50LiAgT21pdCBhZGRyZXNzZXMKKyAqIGluICdzcmMnIHdoaWNoIGhhdmUgYSBicm9hZGVyIHNjb3BlIHRoYW4gJ3Njb3BlJy4KKyAqLworaW50IHNjdHBfYmluZF9hZGRyX2NvcHkoc3RydWN0IHNjdHBfYmluZF9hZGRyICpkZXN0LCAKKwkJCWNvbnN0IHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqc3JjLAorCQkJc2N0cF9zY29wZV90IHNjb3BlLCBpbnQgZ2ZwLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnkgKmFkZHI7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCWludCBlcnJvciA9IDA7CisKKwkvKiBBbGwgYWRkcmVzc2VzIHNoYXJlIHRoZSBzYW1lIHBvcnQuICAqLworCWRlc3QtPnBvcnQgPSBzcmMtPnBvcnQ7CisKKwkvKiBFeHRyYWN0IHRoZSBhZGRyZXNzZXMgd2hpY2ggYXJlIHJlbGV2YW50IGZvciB0aGlzIHNjb3BlLiAgKi8KKwlsaXN0X2Zvcl9lYWNoKHBvcywgJnNyYy0+YWRkcmVzc19saXN0KSB7CisJCWFkZHIgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnksIGxpc3QpOworCQllcnJvciA9IHNjdHBfY29weV9vbmVfYWRkcihkZXN0LCAmYWRkci0+YSwgc2NvcGUsCisJCQkJCSAgIGdmcCwgZmxhZ3MpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBvdXQ7CisJfQorCisJLyogSWYgdGhlcmUgYXJlIG5vIGFkZHJlc3NlcyBtYXRjaGluZyB0aGUgc2NvcGUgYW5kCisJICogdGhpcyBpcyBnbG9iYWwgc2NvcGUsIHRyeSB0byBnZXQgYSBsaW5rIHNjb3BlIGFkZHJlc3MsIHdpdGgKKwkgKiB0aGUgYXNzdW1wdGlvbiB0aGF0IHdlIG11c3QgYmUgc2l0dGluZyBiZWhpbmQgYSBOQVQuCisJICovCisJaWYgKGxpc3RfZW1wdHkoJmRlc3QtPmFkZHJlc3NfbGlzdCkgJiYgKFNDVFBfU0NPUEVfR0xPQkFMID09IHNjb3BlKSkgeworCQlsaXN0X2Zvcl9lYWNoKHBvcywgJnNyYy0+YWRkcmVzc19saXN0KSB7CisJCQlhZGRyID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5LAorCQkJCQkgIGxpc3QpOworCQkJZXJyb3IgPSBzY3RwX2NvcHlfb25lX2FkZHIoZGVzdCwgJmFkZHItPmEsCisJCQkJCQkgICBTQ1RQX1NDT1BFX0xJTkssIGdmcCwKKwkJCQkJCSAgIGZsYWdzKTsKKwkJCWlmIChlcnJvciA8IDApCisJCQkJZ290byBvdXQ7CisJCX0KKwl9CisKK291dDoKKwlpZiAoZXJyb3IpCisJCXNjdHBfYmluZF9hZGRyX2NsZWFuKGRlc3QpOworCisJcmV0dXJuIGVycm9yOworfQorCisvKiBJbml0aWFsaXplIHRoZSBTQ1RQX2JpbmRfYWRkciBzdHJ1Y3R1cmUgZm9yIGVpdGhlciBhbiBlbmRwb2ludCBvcgorICogYW4gYXNzb2NpYXRpb24uCisgKi8KK3ZvaWQgc2N0cF9iaW5kX2FkZHJfaW5pdChzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKmJwLCBfX3UxNiBwb3J0KQoreworCWJwLT5tYWxsb2NlZCA9IDA7CisKKwlJTklUX0xJU1RfSEVBRCgmYnAtPmFkZHJlc3NfbGlzdCk7CisJYnAtPnBvcnQgPSBwb3J0OworfQorCisvKiBEaXNwb3NlIG9mIHRoZSBhZGRyZXNzIGxpc3QuICovCitzdGF0aWMgdm9pZCBzY3RwX2JpbmRfYWRkcl9jbGVhbihzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKmJwKQoreworCXN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5ICphZGRyOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKnRlbXA7CisKKwkvKiBFbXB0eSB0aGUgYmluZCBhZGRyZXNzIGxpc3QuICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdGVtcCwgJmJwLT5hZGRyZXNzX2xpc3QpIHsKKwkJYWRkciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSwgbGlzdCk7CisJCWxpc3RfZGVsKHBvcyk7CisJCWtmcmVlKGFkZHIpOworCQlTQ1RQX0RCR19PQkpDTlRfREVDKGFkZHIpOworCX0KK30KKworLyogRGlzcG9zZSBvZiBhbiBTQ1RQX2JpbmRfYWRkciBzdHJ1Y3R1cmUgICovCit2b2lkIHNjdHBfYmluZF9hZGRyX2ZyZWUoc3RydWN0IHNjdHBfYmluZF9hZGRyICpicCkKK3sKKwkvKiBFbXB0eSB0aGUgYmluZCBhZGRyZXNzIGxpc3QuICovCisJc2N0cF9iaW5kX2FkZHJfY2xlYW4oYnApOworCisJaWYgKGJwLT5tYWxsb2NlZCkgeworCQlrZnJlZShicCk7CisJCVNDVFBfREJHX09CSkNOVF9ERUMoYmluZF9hZGRyKTsKKwl9Cit9CisKKy8qIEFkZCBhbiBhZGRyZXNzIHRvIHRoZSBiaW5kIGFkZHJlc3MgbGlzdCBpbiB0aGUgU0NUUF9iaW5kX2FkZHIgc3RydWN0dXJlLiAqLworaW50IHNjdHBfYWRkX2JpbmRfYWRkcihzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKmJwLCB1bmlvbiBzY3RwX2FkZHIgKm5ldywKKwkJICAgICAgIGludCBnZnApCit7CisJc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnkgKmFkZHI7CisKKwkvKiBBZGQgdGhlIGFkZHJlc3MgdG8gdGhlIGJpbmQgYWRkcmVzcyBsaXN0LiAgKi8KKwlhZGRyID0gdF9uZXcoc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnksIGdmcCk7CisJaWYgKCFhZGRyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbWNweSgmYWRkci0+YSwgbmV3LCBzaXplb2YoKm5ldykpOworCisJLyogRml4IHVwIHRoZSBwb3J0IGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gc2V0LgorCSAqIEJvdGggdjQgYW5kIHY2IGhhdmUgdGhlIHBvcnQgYXQgdGhlIHNhbWUgb2Zmc2V0LgorCSAqLworCWlmICghYWRkci0+YS52NC5zaW5fcG9ydCkKKwkJYWRkci0+YS52NC5zaW5fcG9ydCA9IGJwLT5wb3J0OworCisJSU5JVF9MSVNUX0hFQUQoJmFkZHItPmxpc3QpOworCWxpc3RfYWRkX3RhaWwoJmFkZHItPmxpc3QsICZicC0+YWRkcmVzc19saXN0KTsKKwlTQ1RQX0RCR19PQkpDTlRfSU5DKGFkZHIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIERlbGV0ZSBhbiBhZGRyZXNzIGZyb20gdGhlIGJpbmQgYWRkcmVzcyBsaXN0IGluIHRoZSBTQ1RQX2JpbmRfYWRkcgorICogc3RydWN0dXJlLgorICovCitpbnQgc2N0cF9kZWxfYmluZF9hZGRyKHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqYnAsIHVuaW9uIHNjdHBfYWRkciAqZGVsX2FkZHIpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqdGVtcDsKKwlzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSAqYWRkcjsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRlbXAsICZicC0+YWRkcmVzc19saXN0KSB7CisJCWFkZHIgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnksIGxpc3QpOworCQlpZiAoc2N0cF9jbXBfYWRkcl9leGFjdCgmYWRkci0+YSwgZGVsX2FkZHIpKSB7CisJCQkvKiBGb3VuZCB0aGUgZXhhY3QgbWF0Y2guICovCisJCQlsaXN0X2RlbChwb3MpOworCQkJa2ZyZWUoYWRkcik7CisJCQlTQ1RQX0RCR19PQkpDTlRfREVDKGFkZHIpOworCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCisvKiBDcmVhdGUgYSBuZXR3b3JrIGJ5dGUtb3JkZXIgcmVwcmVzZW50YXRpb24gb2YgYWxsIHRoZSBhZGRyZXNzZXMKKyAqIGZvcm1hdGVkIGFzIFNDVFAgcGFyYW1ldGVycy4KKyAqCisgKiBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSByZXR1cm4gdmFsdWUgZm9yIHRoZSBsZW5ndGguCisgKi8KK3VuaW9uIHNjdHBfcGFyYW1zIHNjdHBfYmluZF9hZGRyc190b19yYXcoY29uc3Qgc3RydWN0IHNjdHBfYmluZF9hZGRyICpicCwKKwkJCQkJIGludCAqYWRkcnNfbGVuLCBpbnQgZ2ZwKQoreworCXVuaW9uIHNjdHBfcGFyYW1zIGFkZHJwYXJtczsKKwl1bmlvbiBzY3RwX3BhcmFtcyByZXR2YWw7CisJaW50IGFkZHJwYXJtc19sZW47CisJdW5pb24gc2N0cF9hZGRyX3BhcmFtIHJhd2FkZHI7CisJaW50IGxlbjsKKwlzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSAqYWRkcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJc3RydWN0IHNjdHBfYWYgKmFmOworCisJYWRkcnBhcm1zX2xlbiA9IDA7CisJbGVuID0gMDsKKworCS8qIEFsbG9jYXRlIGVub3VnaCBtZW1vcnkgYXQgb25jZS4gKi8KKwlsaXN0X2Zvcl9lYWNoKHBvcywgJmJwLT5hZGRyZXNzX2xpc3QpIHsKKwkJbGVuICs9IHNpemVvZih1bmlvbiBzY3RwX2FkZHJfcGFyYW0pOworCX0KKworCS8qIERvbid0IGV2ZW4gYm90aGVyIGVtYmVkZGluZyBhbiBhZGRyZXNzIGlmIHRoZXJlCisJICogaXMgb25seSBvbmUuCisJICovCisJaWYgKGxlbiA9PSBzaXplb2YodW5pb24gc2N0cF9hZGRyX3BhcmFtKSkgeworCQlyZXR2YWwudiA9IE5VTEw7CisJCWdvdG8gZW5kX3JhdzsKKwl9CisKKwlyZXR2YWwudiA9IGttYWxsb2MobGVuLCBnZnApOworCWlmICghcmV0dmFsLnYpCisJCWdvdG8gZW5kX3JhdzsKKworCWFkZHJwYXJtcyA9IHJldHZhbDsKKworCWxpc3RfZm9yX2VhY2gocG9zLCAmYnAtPmFkZHJlc3NfbGlzdCkgeworCQlhZGRyID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5LCBsaXN0KTsKKwkJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhhZGRyLT5hLnY0LnNpbl9mYW1pbHkpOworCQlsZW4gPSBhZi0+dG9fYWRkcl9wYXJhbSgmYWRkci0+YSwgJnJhd2FkZHIpOworCQltZW1jcHkoYWRkcnBhcm1zLnYsICZyYXdhZGRyLCBsZW4pOworCQlhZGRycGFybXMudiArPSBsZW47CisJCWFkZHJwYXJtc19sZW4gKz0gbGVuOworCX0KKworZW5kX3JhdzoKKwkqYWRkcnNfbGVuID0gYWRkcnBhcm1zX2xlbjsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogQ3JlYXRlIGFuIGFkZHJlc3MgbGlzdCBvdXQgb2YgdGhlIHJhdyBhZGRyZXNzIGxpc3QgZm9ybWF0IChJUHY0IGFuZCBJUHY2CisgKiBhZGRyZXNzIHBhcmFtZXRlcnMpLgorICovCitpbnQgc2N0cF9yYXdfdG9fYmluZF9hZGRycyhzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKmJwLCBfX3U4ICpyYXdfYWRkcl9saXN0LAorCQkJICAgaW50IGFkZHJzX2xlbiwgX191MTYgcG9ydCwgaW50IGdmcCkKK3sKKwl1bmlvbiBzY3RwX2FkZHJfcGFyYW0gKnJhd2FkZHI7CisJc3RydWN0IHNjdHBfcGFyYW1oZHIgKnBhcmFtOworCXVuaW9uIHNjdHBfYWRkciBhZGRyOworCWludCByZXR2YWwgPSAwOworCWludCBsZW47CisJc3RydWN0IHNjdHBfYWYgKmFmOworCisJLyogQ29udmVydCB0aGUgcmF3IGFkZHJlc3MgdG8gc3RhbmRhcmQgYWRkcmVzcyBmb3JtYXQgKi8KKwl3aGlsZSAoYWRkcnNfbGVuKSB7CisJCXBhcmFtID0gKHN0cnVjdCBzY3RwX3BhcmFtaGRyICopcmF3X2FkZHJfbGlzdDsKKwkJcmF3YWRkciA9ICh1bmlvbiBzY3RwX2FkZHJfcGFyYW0gKilyYXdfYWRkcl9saXN0OworCisJCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMocGFyYW1fdHlwZTJhZihwYXJhbS0+dHlwZSkpOworCQlpZiAodW5saWtlbHkoIWFmKSkgeworCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCXNjdHBfYmluZF9hZGRyX2NsZWFuKGJwKTsKKwkJCWJyZWFrOworCQl9CisKKwkJYWYtPmZyb21fYWRkcl9wYXJhbSgmYWRkciwgcmF3YWRkciwgcG9ydCwgMCk7CisJCXJldHZhbCA9IHNjdHBfYWRkX2JpbmRfYWRkcihicCwgJmFkZHIsIGdmcCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCS8qIENhbid0IGZpbmlzaCBidWlsZGluZyB0aGUgbGlzdCwgY2xlYW4gdXAuICovCisJCQlzY3RwX2JpbmRfYWRkcl9jbGVhbihicCk7CisJCQlicmVhazsKKwkJfQorCisJCWxlbiA9IG50b2hzKHBhcmFtLT5sZW5ndGgpOworCQlhZGRyc19sZW4gLT0gbGVuOworCQlyYXdfYWRkcl9saXN0ICs9IGxlbjsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIDJuZCBMZXZlbCBBYnN0cmFjdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRG9lcyB0aGlzIGNvbnRhaW4gYSBzcGVjaWZpZWQgYWRkcmVzcz8gIEFsbG93IHdpbGRjYXJkaW5nLiAqLworaW50IHNjdHBfYmluZF9hZGRyX21hdGNoKHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqYnAsIAorCQkJIGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqYWRkciwKKwkJCSBzdHJ1Y3Qgc2N0cF9zb2NrICpvcHQpCit7CisJc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnkgKmxhZGRyOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKworCWxpc3RfZm9yX2VhY2gocG9zLCAmYnAtPmFkZHJlc3NfbGlzdCkgeworCQlsYWRkciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSwgbGlzdCk7CisJCWlmIChvcHQtPnBmLT5jbXBfYWRkcigmbGFkZHItPmEsIGFkZHIsIG9wdCkpCisgCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIEZpbmQgdGhlIGZpcnN0IGFkZHJlc3MgaW4gdGhlIGJpbmQgYWRkcmVzcyBsaXN0IHRoYXQgaXMgbm90IHByZXNlbnQgaW4KKyAqIHRoZSBhZGRycyBwYWNrZWQgYXJyYXkuCisgKi8KK3VuaW9uIHNjdHBfYWRkciAqc2N0cF9maW5kX3VubWF0Y2hfYWRkcihzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIJKmJwLAorCQkJCQljb25zdCB1bmlvbiBzY3RwX2FkZHIJKmFkZHJzLAorCQkJCQlpbnQJCQlhZGRyY250LAorCQkJCQlzdHJ1Y3Qgc2N0cF9zb2NrCSpvcHQpCit7CisJc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnkJKmxhZGRyOworCXVuaW9uIHNjdHBfYWRkcgkJCSphZGRyOworCXZvaWQgCQkJCSphZGRyX2J1ZjsKKwlzdHJ1Y3Qgc2N0cF9hZgkJCSphZjsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQkqcG9zOworCWludAkJCQlpOworCisJbGlzdF9mb3JfZWFjaChwb3MsICZicC0+YWRkcmVzc19saXN0KSB7CisJCWxhZGRyID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5LCBsaXN0KTsKKwkJCisJCWFkZHJfYnVmID0gKHVuaW9uIHNjdHBfYWRkciAqKWFkZHJzOworCQlmb3IgKGkgPSAwOyBpIDwgYWRkcmNudDsgaSsrKSB7CisJCQlhZGRyID0gKHVuaW9uIHNjdHBfYWRkciAqKWFkZHJfYnVmOworCQkJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhhZGRyLT52NC5zaW5fZmFtaWx5KTsKKwkJCWlmICghYWYpIAorCQkJCXJldHVybiBOVUxMOworCisJCQlpZiAob3B0LT5wZi0+Y21wX2FkZHIoJmxhZGRyLT5hLCBhZGRyLCBvcHQpKQorCQkJCWJyZWFrOworCisJCQlhZGRyX2J1ZiArPSBhZi0+c29ja2FkZHJfbGVuOworCQl9CisJCWlmIChpID09IGFkZHJjbnQpCisJCQlyZXR1cm4gJmxhZGRyLT5hOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiBDb3B5IG91dCBhZGRyZXNzZXMgZnJvbSB0aGUgZ2xvYmFsIGxvY2FsIGFkZHJlc3MgbGlzdC4gKi8KK3N0YXRpYyBpbnQgc2N0cF9jb3B5X29uZV9hZGRyKHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqZGVzdCwgCisJCQkgICAgICB1bmlvbiBzY3RwX2FkZHIgKmFkZHIsCisJCQkgICAgICBzY3RwX3Njb3BlX3Qgc2NvcGUsIGludCBnZnAsIGludCBmbGFncykKK3sKKwlpbnQgZXJyb3IgPSAwOworCisJaWYgKHNjdHBfaXNfYW55KGFkZHIpKSB7CisJCWVycm9yID0gc2N0cF9jb3B5X2xvY2FsX2FkZHJfbGlzdChkZXN0LCBzY29wZSwgZ2ZwLCBmbGFncyk7CisJfSBlbHNlIGlmIChzY3RwX2luX3Njb3BlKGFkZHIsIHNjb3BlKSkgeworCQkvKiBOb3cgdGhhdCB0aGUgYWRkcmVzcyBpcyBpbiBzY29wZSwgY2hlY2sgdG8gc2VlIGlmCisJCSAqIHRoZSBhZGRyZXNzIHR5cGUgaXMgc3VwcG9ydGVkIGJ5IGxvY2FsIHNvY2sgYXMKKwkJICogd2VsbCBhcyB0aGUgcmVtb3RlIHBlZXIuCisJCSAqLworCQlpZiAoKCgoQUZfSU5FVCA9PSBhZGRyLT5zYS5zYV9mYW1pbHkpICYmCisJCSAgICAgIChmbGFncyAmIFNDVFBfQUREUjRfUEVFUlNVUFApKSkgfHwKKwkJICAgICgoKEFGX0lORVQ2ID09IGFkZHItPnNhLnNhX2ZhbWlseSkgJiYKKwkJICAgICAgKGZsYWdzICYgU0NUUF9BRERSNl9BTExPV0VEKSAmJgorCQkgICAgICAoZmxhZ3MgJiBTQ1RQX0FERFI2X1BFRVJTVVBQKSkpKQorCQkJZXJyb3IgPSBzY3RwX2FkZF9iaW5kX2FkZHIoZGVzdCwgYWRkciwgZ2ZwKTsKKwl9CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qIElzIHRoaXMgYSB3aWxkY2FyZCBhZGRyZXNzPyAgKi8KK2ludCBzY3RwX2lzX2FueShjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIpCit7CisJc3RydWN0IHNjdHBfYWYgKmFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoYWRkci0+c2Euc2FfZmFtaWx5KTsKKwlpZiAoIWFmKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gYWYtPmlzX2FueShhZGRyKTsKK30KKworLyogSXMgJ2FkZHInIHZhbGlkIGZvciAnc2NvcGUnPyAgKi8KK2ludCBzY3RwX2luX3Njb3BlKGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqYWRkciwgc2N0cF9zY29wZV90IHNjb3BlKQoreworCXNjdHBfc2NvcGVfdCBhZGRyX3Njb3BlID0gc2N0cF9zY29wZShhZGRyKTsKKworCS8qIFRoZSB1bnVzYWJsZSBTQ1RQIGFkZHJlc3NlcyB3aWxsIG5vdCBiZSBjb25zaWRlcmVkIHdpdGgKKwkgKiBhbnkgZGVmaW5lZCBzY29wZXMuCisJICovCisJaWYgKFNDVFBfU0NPUEVfVU5VU0FCTEUgPT0gYWRkcl9zY29wZSkKKwkJcmV0dXJuIDA7CisJLyoKKwkgKiBGb3IgSU5JVCBhbmQgSU5JVC1BQ0sgYWRkcmVzcyBsaXN0LCBsZXQgTCBiZSB0aGUgbGV2ZWwgb2YKKwkgKiBvZiByZXF1ZXN0ZWQgZGVzdGluYXRpb24gYWRkcmVzcywgc2VuZGVyIGFuZCByZWNlaXZlcgorCSAqIFNIT1VMRCBpbmNsdWRlIGFsbCBvZiBpdHMgYWRkcmVzc2VzIHdpdGggbGV2ZWwgZ3JlYXRlcgorCSAqIHRoYW4gb3IgZXF1YWwgdG8gTC4KKwkgKi8KKwlpZiAoYWRkcl9zY29wZSA8PSBzY29wZSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAzcmQgTGV2ZWwgQWJzdHJhY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFdoYXQgaXMgdGhlIHNjb3BlIG9mICdhZGRyJz8gICovCitzY3RwX3Njb3BlX3Qgc2N0cF9zY29wZShjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIpCit7CisJc3RydWN0IHNjdHBfYWYgKmFmOworCisJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhhZGRyLT5zYS5zYV9mYW1pbHkpOworCWlmICghYWYpCisJCXJldHVybiBTQ1RQX1NDT1BFX1VOVVNBQkxFOworCisJcmV0dXJuIGFmLT5zY29wZSgodW5pb24gc2N0cF9hZGRyICopYWRkcik7Cit9CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9jaHVuay5jIGIvbmV0L3NjdHAvY2h1bmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzJhYjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjdHAvY2h1bmsuYwpAQCAtMCwwICsxLDMwOSBAQAorLyogU0NUUCBrZXJuZWwgcmVmZXJlbmNlIEltcGxlbWVudGF0aW9uCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAzLCAyMDA0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFNDVFAga2VybmVsIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29kZSByZWxhdGluZyB0aGUgdGhlIGNodW5rIGFic3RyYWN0aW9uLgorICoKKyAqIFRoZSBTQ1RQIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoZSBTQ1RQIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0CisgKiB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAqICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogUGxlYXNlIHNlbmQgYW55IGJ1ZyByZXBvcnRzIG9yIGZpeGVzIHlvdSBtYWtlIHRvIHRoZQorICogZW1haWwgYWRkcmVzcyhlcyk6CisgKiAgICBsa3NjdHAgZGV2ZWxvcGVycyA8bGtzY3RwLWRldmVsb3BlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIE9yIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHdlYnNpdGU6CisgKiAgICBodHRwOi8vd3d3LnNmLm5ldC9wcm9qZWN0cy9sa3NjdHAKKyAqCisgKiBXcml0dGVuIG9yIG1vZGlmaWVkIGJ5OgorICogICAgSm9uIEdyaW1tICAgICAgICAgICAgIDxqZ3JpbW1AdXMuaWJtLmNvbT4KKyAqICAgIFNyaWRoYXIgU2FtdWRyYWxhICAgICA8c3JpQHVzLmlibS5jb20+CisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgZ2l2ZW4gdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9zY3RwL3NjdHAuaD4KKyNpbmNsdWRlIDxuZXQvc2N0cC9zbS5oPgorCisvKiBUaGlzIGZpbGUgaXMgbW9zdGx5IGluIGFudGljaXBhdGlvbiBvZiBmdXR1cmUgd29yaywgYnV0IGluaXRpYWxseQorICogcG9wdWxhdGUgd2l0aCBmcmFnbWVudCB0cmFja2luZyBmb3IgYW4gb3V0Ym91bmQgbWVzc2FnZS4KKyAqLworCisvKiBJbml0aWFsaXplIGRhdGFtc2cgZnJvbSBtZW1vcnkuICovCitzdGF0aWMgdm9pZCBzY3RwX2RhdGFtc2dfaW5pdChzdHJ1Y3Qgc2N0cF9kYXRhbXNnICptc2cpCit7CisJYXRvbWljX3NldCgmbXNnLT5yZWZjbnQsIDEpOworCW1zZy0+c2VuZF9mYWlsZWQgPSAwOworCW1zZy0+c2VuZF9lcnJvciA9IDA7CisJbXNnLT5jYW5fYWJhbmRvbiA9IDA7CisJbXNnLT5leHBpcmVzX2F0ID0gMDsKKwlJTklUX0xJU1RfSEVBRCgmbXNnLT5jaHVua3MpOworfQorCisvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBkYXRhbXNnLiAqLworU0NUUF9TVEFUSUMgc3RydWN0IHNjdHBfZGF0YW1zZyAqc2N0cF9kYXRhbXNnX25ldyhpbnQgZ2ZwKQoreworCXN0cnVjdCBzY3RwX2RhdGFtc2cgKm1zZzsKKwltc2cgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2N0cF9kYXRhbXNnKSwgZ2ZwKTsKKwlpZiAobXNnKQorCQlzY3RwX2RhdGFtc2dfaW5pdChtc2cpOworCVNDVFBfREJHX09CSkNOVF9JTkMoZGF0YW1zZyk7CisJcmV0dXJuIG1zZzsKK30KKworLyogRmluYWwgZGVzdHJ1Y3RydWN0aW9uIG9mIGRhdGFtc2cgbWVtb3J5LiAqLworc3RhdGljIHZvaWQgc2N0cF9kYXRhbXNnX2Rlc3Ryb3koc3RydWN0IHNjdHBfZGF0YW1zZyAqbXNnKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKnRlbXA7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rOworCXN0cnVjdCBzY3RwX3NvY2sgKnNwOworCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldjsKKwlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYyA9IE5VTEw7CisJaW50IGVycm9yID0gMCwgbm90aWZ5OworCisJLyogSWYgd2UgZmFpbGVkLCB3ZSBtYXkgbmVlZCB0byBub3RpZnkuICovCisJbm90aWZ5ID0gbXNnLT5zZW5kX2ZhaWxlZCA/IC0xIDogMDsKKworCS8qIFJlbGVhc2UgYWxsIHJlZmVyZW5jZXMuICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdGVtcCwgJm1zZy0+Y2h1bmtzKSB7CisJCWxpc3RfZGVsX2luaXQocG9zKTsKKwkJY2h1bmsgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHNjdHBfY2h1bmssIGZyYWdfbGlzdCk7CisJCS8qIENoZWNrIHdoZXRoZXIgd2UgX3JlYWxseV8gbmVlZCB0byBub3RpZnkuICovCisJCWlmIChub3RpZnkgPCAwKSB7CisJCQlhc29jID0gY2h1bmstPmFzb2M7CisJCQlpZiAobXNnLT5zZW5kX2Vycm9yKQorCQkJCWVycm9yID0gbXNnLT5zZW5kX2Vycm9yOworCQkJZWxzZQorCQkJCWVycm9yID0gYXNvYy0+b3V0cXVldWUuZXJyb3I7CisKKwkJCXNwID0gc2N0cF9zayhhc29jLT5iYXNlLnNrKTsKKwkJCW5vdGlmeSA9IHNjdHBfdWxwZXZlbnRfdHlwZV9lbmFibGVkKFNDVFBfU0VORF9GQUlMRUQsCisJCQkJCQkJICAgICZzcC0+c3Vic2NyaWJlKTsKKwkJfQorCisJCS8qIEdlbmVyYXRlIGEgU0VORCBGQUlMRUQgZXZlbnQgb25seSBpZiBlbmFibGVkLiAqLworCQlpZiAobm90aWZ5ID4gMCkgeworCQkJaW50IHNlbnQ7CisJCQlpZiAoY2h1bmstPmhhc190c24pCisJCQkJc2VudCA9IFNDVFBfREFUQV9TRU5UOworCQkJZWxzZQorCQkJCXNlbnQgPSBTQ1RQX0RBVEFfVU5TRU5UOworCisJCQlldiA9IHNjdHBfdWxwZXZlbnRfbWFrZV9zZW5kX2ZhaWxlZChhc29jLCBjaHVuaywgc2VudCwKKwkJCQkJCQkgICAgZXJyb3IsIEdGUF9BVE9NSUMpOworCQkJaWYgKGV2KQorCQkJCXNjdHBfdWxwcV90YWlsX2V2ZW50KCZhc29jLT51bHBxLCBldik7CisJCX0KKworCQlzY3RwX2NodW5rX3B1dChjaHVuayk7CisJfQorCisJU0NUUF9EQkdfT0JKQ05UX0RFQyhkYXRhbXNnKTsKKwlrZnJlZShtc2cpOworfQorCisvKiBIb2xkIGEgcmVmZXJlbmNlLiAqLworc3RhdGljIHZvaWQgc2N0cF9kYXRhbXNnX2hvbGQoc3RydWN0IHNjdHBfZGF0YW1zZyAqbXNnKQoreworCWF0b21pY19pbmMoJm1zZy0+cmVmY250KTsKK30KKworLyogUmVsZWFzZSBhIHJlZmVyZW5jZS4gKi8KK3ZvaWQgc2N0cF9kYXRhbXNnX3B1dChzdHJ1Y3Qgc2N0cF9kYXRhbXNnICptc2cpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJm1zZy0+cmVmY250KSkKKwkJc2N0cF9kYXRhbXNnX2Rlc3Ryb3kobXNnKTsKK30KKworLyogRnJlZSBhIG1lc3NhZ2UuICBSZWFsbHkganVzdCBnaXZlIHVwIGEgcmVmZXJlbmNlLCB0aGUKKyAqIHJlYWxseSBmcmVlIGhhcHBlbnMgaW4gc2N0cF9kYXRhbXNnX2Rlc3Ryb3koKS4KKyAqLwordm9pZCBzY3RwX2RhdGFtc2dfZnJlZShzdHJ1Y3Qgc2N0cF9kYXRhbXNnICptc2cpCit7CisJc2N0cF9kYXRhbXNnX3B1dChtc2cpOworfQorCisvKiBIb2xkIG9uIHRvIGFsbCB0aGUgZnJhZ21lbnRzIHVudGlsIGFsbCBjaHVua3MgaGF2ZSBiZWVuIHNlbnQuICovCit2b2lkIHNjdHBfZGF0YW1zZ190cmFjayhzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmspCit7CisJc2N0cF9jaHVua19ob2xkKGNodW5rKTsKK30KKworLyogQXNzaWduIGEgY2h1bmsgdG8gdGhpcyBkYXRhbXNnLiAqLworc3RhdGljIHZvaWQgc2N0cF9kYXRhbXNnX2Fzc2lnbihzdHJ1Y3Qgc2N0cF9kYXRhbXNnICptc2csIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaykKK3sKKwlzY3RwX2RhdGFtc2dfaG9sZChtc2cpOworCWNodW5rLT5tc2cgPSBtc2c7Cit9CisKKworLyogQSBkYXRhIGNodW5rIGNhbiBoYXZlIGEgbWF4aW11bSBwYXlsb2FkIG9mICgyXjE2IC0gMjApLiAgQnJlYWsKKyAqIGRvd24gYW55IHN1Y2ggbWVzc2FnZSBpbnRvIHNtYWxsZXIgY2h1bmtzLiAgT3Bwb3J0dW5pc3RpY2FsbHksIGZyYWdtZW50CisgKiB0aGUgY2h1bmtzIGRvd24gdG8gdGhlIGN1cnJlbnQgTVRVIGNvbnN0cmFpbnRzLiAgV2UgbWF5IGdldCByZWZyYWdtZW50ZWQKKyAqIGxhdGVyIGlmIHRoZSBQTVRVIGNoYW5nZXMsIGJ1dCBpdCBpcyBfbXVjaCBiZXR0ZXJfIHRvIGZyYWdtZW50IGltbWVkaWF0ZWx5CisgKiB3aXRoIGEgcmVhc29uYWJsZSBndWVzcyB0aGFuIGFsd2F5cyBkb2luZyBvdXIgZnJhZ21lbnRhdGlvbiBvbiB0aGUKKyAqIHNvZnQtaW50ZXJydXB0LgorICovCitzdHJ1Y3Qgc2N0cF9kYXRhbXNnICpzY3RwX2RhdGFtc2dfZnJvbV91c2VyKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCQkgICAgc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqc2luZm8sCisJCQkJCSAgICBzdHJ1Y3QgbXNnaGRyICptc2doLCBpbnQgbXNnX2xlbikKK3sKKwlpbnQgbWF4LCB3aG9sZSwgaSwgb2Zmc2V0LCBvdmVyLCBlcnI7CisJaW50IGxlbiwgZmlyc3RfbGVuOworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuazsKKwlzdHJ1Y3Qgc2N0cF9kYXRhbXNnICptc2c7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqdGVtcDsKKwlfX3U4IGZyYWc7CisKKwltc2cgPSBzY3RwX2RhdGFtc2dfbmV3KEdGUF9LRVJORUwpOworCWlmICghbXNnKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIE5vdGU6IENhbGN1bGF0ZSB0aGlzIG91dHNpZGUgb2YgdGhlIGxvb3AsIHNvIHRoYXQgYWxsIGZyYWdtZW50cworCSAqIGhhdmUgdGhlIHNhbWUgZXhwaXJhdGlvbi4KKwkgKi8KKwlpZiAoc2luZm8tPnNpbmZvX3RpbWV0b2xpdmUpIHsKKwkJLyogc2luZm9fdGltZXRvbGl2ZSBpcyBpbiBtaWxsaXNlY29uZHMgKi8KKwkJbXNnLT5leHBpcmVzX2F0ID0gamlmZmllcyArCisJCQkJICAgIG1zZWNzX3RvX2ppZmZpZXMoc2luZm8tPnNpbmZvX3RpbWV0b2xpdmUpOworCQltc2ctPmNhbl9hYmFuZG9uID0gMTsKKwkJU0NUUF9ERUJVR19QUklOVEsoIiVzOiBtc2c6JXAgZXhwaXJlc19hdDogJWxkIGppZmZpZXM6JWxkXG4iLAorCQkJCSAgX19GVU5DVElPTl9fLCBtc2csIG1zZy0+ZXhwaXJlc19hdCwgamlmZmllcyk7CisJfQorCisJbWF4ID0gYXNvYy0+ZnJhZ19wb2ludDsKKworCXdob2xlID0gMDsKKwlmaXJzdF9sZW4gPSBtYXg7CisKKwkvKiBFbmNvdXJhZ2UgQ29va2llLUVDSE8gYnVuZGxpbmcuICovCisJaWYgKGFzb2MtPnN0YXRlIDwgU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEKSB7CisJCXdob2xlID0gbXNnX2xlbiAvIChtYXggLSBTQ1RQX0FSQklUUkFSWV9DT09LSUVfRUNIT19MRU4pOworCisJCS8qIEFjY291bnQgZm9yIHRoZSBEQVRBIHRvIGJlIGJ1bmRsZWQgd2l0aCB0aGUgQ09PS0lFLUVDSE8uICovCisJCWlmICh3aG9sZSkgeworCQkJZmlyc3RfbGVuID0gbWF4IC0gU0NUUF9BUkJJVFJBUllfQ09PS0lFX0VDSE9fTEVOOworCQkJbXNnX2xlbiAtPSBmaXJzdF9sZW47CisJCQl3aG9sZSA9IDE7CisJCX0KKwl9CisKKwkvKiBIb3cgbWFueSBmdWxsIHNpemVkPyAgSG93IG1hbnkgYnl0ZXMgbGVmdG92ZXI/ICovCisJd2hvbGUgKz0gbXNnX2xlbiAvIG1heDsKKwlvdmVyID0gbXNnX2xlbiAlIG1heDsKKwlvZmZzZXQgPSAwOworCisJaWYgKCh3aG9sZSA+IDEpIHx8ICh3aG9sZSAmJiBvdmVyKSkKKwkJU0NUUF9JTkNfU1RBVFNfVVNFUihTQ1RQX01JQl9GUkFHVVNSTVNHUyk7CisKKwkvKiBDcmVhdGUgY2h1bmtzIGZvciBhbGwgdGhlIGZ1bGwgc2l6ZWQgREFUQSBjaHVua3MuICovCisJZm9yIChpPTAsIGxlbj1maXJzdF9sZW47IGkgPCB3aG9sZTsgaSsrKSB7CisJCWZyYWcgPSBTQ1RQX0RBVEFfTUlERExFX0ZSQUc7CisKKwkJaWYgKDAgPT0gaSkKKwkJCWZyYWcgfD0gU0NUUF9EQVRBX0ZJUlNUX0ZSQUc7CisKKwkJaWYgKChpID09ICh3aG9sZSAtIDEpKSAmJiAhb3ZlcikKKwkJCWZyYWcgfD0gU0NUUF9EQVRBX0xBU1RfRlJBRzsKKworCQljaHVuayA9IHNjdHBfbWFrZV9kYXRhZnJhZ19lbXB0eShhc29jLCBzaW5mbywgbGVuLCBmcmFnLCAwKTsKKworCQlpZiAoIWNodW5rKQorCQkJZ290byBlcnJvdXQ7CisJCWVyciA9IHNjdHBfdXNlcl9hZGR0b19jaHVuayhjaHVuaywgb2Zmc2V0LCBsZW4sIG1zZ2gtPm1zZ19pb3YpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyb3V0OworCisJCW9mZnNldCArPSBsZW47CisKKwkJLyogUHV0IHRoZSBjaHVuay0+c2tiIGJhY2sgaW50byB0aGUgZm9ybSBleHBlY3RlZCBieSBzZW5kLiAgKi8KKwkJX19za2JfcHVsbChjaHVuay0+c2tiLCAoX191OCAqKWNodW5rLT5jaHVua19oZHIKKwkJCSAgIC0gKF9fdTggKiljaHVuay0+c2tiLT5kYXRhKTsKKworCQlzY3RwX2RhdGFtc2dfYXNzaWduKG1zZywgY2h1bmspOworCQlsaXN0X2FkZF90YWlsKCZjaHVuay0+ZnJhZ19saXN0LCAmbXNnLT5jaHVua3MpOworCisJCS8qIFRoZSBmaXJzdCBjaHVuaywgdGhlIGZpcnN0IGNodW5rIHdhcyBsaWtlbHkgc2hvcnQKKwkJICogdG8gYWxsb3cgYnVuZGxpbmcsIHNvIHJlc2V0IHRvIGZ1bGwgc2l6ZS4KKwkJICovCisJCWlmICgwID09IGkpCisJCQlsZW4gPSBtYXg7CisJfQorCisJLyogLi4gbm93IHRoZSBsZWZ0b3ZlciBieXRlcy4gKi8KKwlpZiAob3ZlcikgeworCQlpZiAoIXdob2xlKQorCQkJZnJhZyA9IFNDVFBfREFUQV9OT1RfRlJBRzsKKwkJZWxzZQorCQkJZnJhZyA9IFNDVFBfREFUQV9MQVNUX0ZSQUc7CisKKwkJY2h1bmsgPSBzY3RwX21ha2VfZGF0YWZyYWdfZW1wdHkoYXNvYywgc2luZm8sIG92ZXIsIGZyYWcsIDApOworCisJCWlmICghY2h1bmspCisJCQlnb3RvIGVycm91dDsKKworCQllcnIgPSBzY3RwX3VzZXJfYWRkdG9fY2h1bmsoY2h1bmssIG9mZnNldCwgb3Zlcixtc2doLT5tc2dfaW92KTsKKworCQkvKiBQdXQgdGhlIGNodW5rLT5za2IgYmFjayBpbnRvIHRoZSBmb3JtIGV4cGVjdGVkIGJ5IHNlbmQuICAqLworCQlfX3NrYl9wdWxsKGNodW5rLT5za2IsIChfX3U4ICopY2h1bmstPmNodW5rX2hkcgorCQkJICAgLSAoX191OCAqKWNodW5rLT5za2ItPmRhdGEpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyb3V0OworCisJCXNjdHBfZGF0YW1zZ19hc3NpZ24obXNnLCBjaHVuayk7CisJCWxpc3RfYWRkX3RhaWwoJmNodW5rLT5mcmFnX2xpc3QsICZtc2ctPmNodW5rcyk7CisJfQorCisJcmV0dXJuIG1zZzsKKworZXJyb3V0OgorCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRlbXAsICZtc2ctPmNodW5rcykgeworCQlsaXN0X2RlbF9pbml0KHBvcyk7CisJCWNodW5rID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBzY3RwX2NodW5rLCBmcmFnX2xpc3QpOworCQlzY3RwX2NodW5rX2ZyZWUoY2h1bmspOworCX0KKwlzY3RwX2RhdGFtc2dfZnJlZShtc2cpOworCXJldHVybiBOVUxMOworfQorCisvKiBDaGVjayB3aGV0aGVyIHRoaXMgbWVzc2FnZSBoYXMgZXhwaXJlZC4gKi8KK2ludCBzY3RwX2NodW5rX2FiYW5kb25lZChzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmspCit7CisJc3RydWN0IHNjdHBfZGF0YW1zZyAqbXNnID0gY2h1bmstPm1zZzsKKworCWlmICghbXNnLT5jYW5fYWJhbmRvbikKKwkJcmV0dXJuIDA7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBtc2ctPmV4cGlyZXNfYXQpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKiBUaGlzIGNodW5rIChhbmQgY29uc2VxdWVudGx5IGVudGlyZSBtZXNzYWdlKSBoYXMgZmFpbGVkIGluIGl0cyBzZW5kaW5nLiAqLwordm9pZCBzY3RwX2NodW5rX2ZhaWwoc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLCBpbnQgZXJyb3IpCit7CisJY2h1bmstPm1zZy0+c2VuZF9mYWlsZWQgPSAxOworCWNodW5rLT5tc2ctPnNlbmRfZXJyb3IgPSBlcnJvcjsKK30KZGlmZiAtLWdpdCBhL25ldC9zY3RwL2NvbW1hbmQuYyBiL25ldC9zY3RwL2NvbW1hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmY4MDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjdHAvY29tbWFuZC5jCkBAIC0wLDAgKzEsODEgQEAKKy8qIFNDVFAga2VybmVsIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMQorICogQ2lzY28sIE1vdG9yb2xhLCBhbmQgSUJNCisgKiBDb3B5cmlnaHQgMjAwMSBMYSBNb250ZSBILlAuIFlhcnJvbGwKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgU0NUUCBrZXJuZWwgcmVmZXJlbmNlIEltcGxlbWVudGF0aW9uCisgKgorICogVGhlc2UgZnVuY3Rpb25zIG1hbmlwdWxhdGUgc2N0cCBjb21tYW5kIHNlcXVlbmNlcy4KKyAqCisgKiBUaGUgU0NUUCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgU0NUUCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogV3JpdHRlbiBvciBtb2RpZmllZCBieToKKyAqICAgIExhIE1vbnRlIEguUC4gWWFycm9sbCA8cGlnZ3lAYWNtLm9yZz4KKyAqICAgIEthcmwgS251dHNvbiA8a2FybEBhdGhlbmEuY2hpY2Fnby5pbC51cz4KKyAqCisgKiBBbnkgYnVncyByZXBvcnRlZCBnaXZlbiB0byB1cyB3ZSB3aWxsIHRyeSB0byBmaXguLi4gYW55IGZpeGVzIHNoYXJlZCB3aWxsCisgKiBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbmV4dCBTQ1RQIHJlbGVhc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0L3NjdHAvc2N0cC5oPgorI2luY2x1ZGUgPG5ldC9zY3RwL3NtLmg+CisKKy8qIEluaXRpYWxpemUgYSBibG9jayBvZiBtZW1vcnkgYXMgYSBjb21tYW5kIHNlcXVlbmNlLiAqLworaW50IHNjdHBfaW5pdF9jbWRfc2VxKHNjdHBfY21kX3NlcV90ICpzZXEpCit7CisJbWVtc2V0KHNlcSwgMCwgc2l6ZW9mKHNjdHBfY21kX3NlcV90KSk7CisJcmV0dXJuIDE7CQkvKiBXZSBhbHdheXMgc3VjY2VlZC4gICovCit9CisKKy8qIEFkZCBhIGNvbW1hbmQgdG8gYSBzY3RwX2NtZF9zZXFfdC4KKyAqIFJldHVybiAwIGlmIHRoZSBjb21tYW5kIHNlcXVlbmNlIGlzIGZ1bGwuCisgKi8KK2ludCBzY3RwX2FkZF9jbWQoc2N0cF9jbWRfc2VxX3QgKnNlcSwgc2N0cF92ZXJiX3QgdmVyYiwgc2N0cF9hcmdfdCBvYmopCit7CisJaWYgKHNlcS0+bmV4dF9mcmVlX3Nsb3QgPj0gU0NUUF9NQVhfTlVNX0NPTU1BTkRTKQorCQlnb3RvIGZhaWw7CisKKwlzZXEtPmNtZHNbc2VxLT5uZXh0X2ZyZWVfc2xvdF0udmVyYiA9IHZlcmI7CisJc2VxLT5jbWRzW3NlcS0+bmV4dF9mcmVlX3Nsb3QrK10ub2JqID0gb2JqOworCisJcmV0dXJuIDE7CisKK2ZhaWw6CisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiB0aGUgbmV4dCBjb21tYW5kIHN0cnVjdHVyZSBpbiBhIHNjdHBfY21kX3NlcS4KKyAqIFJldHVybnMgTlVMTCBhdCB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS4KKyAqLworc2N0cF9jbWRfdCAqc2N0cF9uZXh0X2NtZChzY3RwX2NtZF9zZXFfdCAqc2VxKQoreworCXNjdHBfY21kX3QgKnJldHZhbCA9IE5VTEw7CisKKwlpZiAoc2VxLT5uZXh0X2NtZCA8IHNlcS0+bmV4dF9mcmVlX3Nsb3QpCisJCXJldHZhbCA9ICZzZXEtPmNtZHNbc2VxLT5uZXh0X2NtZCsrXTsKKworCXJldHVybiByZXR2YWw7Cit9CisKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2NyYzMyYy5jIGIvbmV0L3NjdHAvY3JjMzJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFmMDVlYwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY3RwL2NyYzMyYy5jCkBAIC0wLDAgKzEsMjIwIEBACisvKiBTQ1RQIGtlcm5lbCByZWZlcmVuY2UgSW1wbGVtZW50YXRpb24KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIE1vdG9yb2xhLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMyBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzLCBDb3JwLgorICogCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgU0NUUCBrZXJuZWwgcmVmZXJlbmNlIEltcGxlbWVudGF0aW9uCisgKiAKKyAqIFNDVFAgQ2hlY2tzdW0gZnVuY3Rpb25zCisgKiAKKyAqIFRoZSBTQ1RQIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOyAKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIAorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoZSBTQ1RQIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorICogCisgKiBQbGVhc2Ugc2VuZCBhbnkgYnVnIHJlcG9ydHMgb3IgZml4ZXMgeW91IG1ha2UgdG8gdGhlCisgKiBlbWFpbCBhZGRyZXNzKGVzKToKKyAqICAgIGxrc2N0cCBkZXZlbG9wZXJzIDxsa3NjdHAtZGV2ZWxvcGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKiAKKyAqIE9yIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHdlYnNpdGU6CisgKiAgICBodHRwOi8vd3d3LnNmLm5ldC9wcm9qZWN0cy9sa3NjdHAKKyAqCisgKiBXcml0dGVuIG9yIG1vZGlmaWVkIGJ5OiAKKyAqICAgIERpbmFrYXJhbiBKb3NlcGggCisgKiAgICBKb24gR3JpbW0gPGpncmltbUB1cy5pYm0uY29tPgorICogICAgU3JpZGhhciBTYW11ZHJhbGEgPHNyaUB1cy5pYm0uY29tPgorICogCisgKiBBbnkgYnVncyByZXBvcnRlZCBnaXZlbiB0byB1cyB3ZSB3aWxsIHRyeSB0byBmaXguLi4gYW55IGZpeGVzIHNoYXJlZCB3aWxsCisgKiBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbmV4dCBTQ1RQIHJlbGVhc2UuCisgKi8KKworLyogVGhlIGZvbGxvd2luZyBjb2RlIGhhcyBiZWVuIHRha2VuIGRpcmVjdGx5IGZyb20KKyAqIGRyYWZ0LWlldGYtdHN2d2ctc2N0cGNzdW0tMDMudHh0CisgKgorICogVGhlIGNvZGUgaGFzIG5vdyBiZWVuIG1vZGlmaWVkIHNwZWNpZmljYWxseSBmb3IgU0NUUCBrbm93bGVkZ2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0L3NjdHAvc2N0cC5oPgorCisjZGVmaW5lIENSQzMyQ19QT0xZIDB4MUVEQzZGNDEKKyNkZWZpbmUgQ1JDMzJDKGMsZCkgKGM9KGM+PjgpXmNyY19jWyhjXihkKSkmMHhGRl0pCisvKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICovCisvKiBDb3B5cmlnaHQgMjAwMSwgRC4gT3Rpcy4gIFVzZSB0aGlzIHByb2dyYW0sIGNvZGUgb3IgdGFibGVzICAgICovCisvKiBleHRyYWN0ZWQgZnJvbSBpdCwgYXMgZGVzaXJlZCB3aXRob3V0IHJlc3RyaWN0aW9uLiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAzMiBCaXQgUmVmbGVjdGVkIENSQyB0YWJsZSBnZW5lcmF0aW9uIGZvciBTQ1RQLiAgICAgICAgICAgICAgICovCisvKiBUbyBhY2NvbW1vZGF0ZSBzZXJpYWwgYnl0ZSBkYXRhIGJlaW5nIHNoaWZ0ZWQgb3V0IGxlYXN0ICAgICAgICovCisvKiBzaWduaWZpY2FudCBiaXQgZmlyc3QsIHRoZSB0YWJsZSdzIDMyIGJpdCB3b3JkcyBhcmUgcmVmbGVjdGVkICovCisvKiB3aGljaCBmbGlwcyBib3RoIGJ5dGUgYW5kIGJpdCBNUyBhbmQgTFMgcG9zaXRpb25zLiAgVGhlIENSQyAgICovCisvKiBpcyBjYWxjdWxhdGVkIE1TIGJpdHMgZmlyc3QgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIHNlcmlhbCovCisvKiBzdHJlYW0uICBUaGUgeF4zMiB0ZXJtIGlzIGltcGxpZWQgYW5kIHRoZSB4XjAgdGVybSBtYXkgYWxzbyAgICovCisvKiBiZSBzaG93biBhcyArMS4gIFRoZSBwb2x5bm9taWFsIGNvZGUgdXNlZCBpcyAweDFFREM2RjQxLiAgICAgICovCisvKiBDYXN0YWdub2xpOTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiB4XjMyK3heMjgreF4yNyt4XjI2K3heMjUreF4yMyt4XjIyK3heMjAreF4xOSt4XjE4K3heMTQreF4xMysgICovCisvKiB4XjExK3heMTAreF45K3heOCt4XjYreF4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBHdXkgQ2FzdGFnbm9saSBTdGVmYW4gQnJhZXVlciBhbmQgTWFydGluIEhlcnJtYW4gICAgICAgICAgICAgICovCisvKiAiT3B0aW1pemF0aW9uIG9mIEN5Y2xpYyBSZWR1bmRhbmN5LUNoZWNrIENvZGVzICAgICAgICAgICAgICAgICovCisvKiB3aXRoIDI0IGFuZCAzMiBQYXJpdHkgQml0cyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBJRUVFIFRyYW5zYWN0aW9ucyBvbiBDb21tdW5pY2F0aW9ucywgVm9sLjQxLCBOby42LCBKdW5lIDE5OTMgICovCisvKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICovCitzdGF0aWMgY29uc3QgX191MzIgY3JjX2NbMjU2XSA9IHsKKwkweDAwMDAwMDAwLCAweEYyNkI4MzAzLCAweEUxM0I3MEY3LCAweDEzNTBGM0Y0LAorCTB4Qzc5QTk3MUYsIDB4MzVGMTE0MUMsIDB4MjZBMUU3RTgsIDB4RDRDQTY0RUIsCisJMHg4QUQ5NThDRiwgMHg3OEIyREJDQywgMHg2QkUyMjgzOCwgMHg5OTg5QUIzQiwKKwkweDRENDNDRkQwLCAweEJGMjg0Q0QzLCAweEFDNzhCRjI3LCAweDVFMTMzQzI0LAorCTB4MTA1RUM3NkYsIDB4RTIzNTQ0NkMsIDB4RjE2NUI3OTgsIDB4MDMwRTM0OUIsCisJMHhEN0M0NTA3MCwgMHgyNUFGRDM3MywgMHgzNkZGMjA4NywgMHhDNDk0QTM4NCwKKwkweDlBODc5RkEwLCAweDY4RUMxQ0EzLCAweDdCQkNFRjU3LCAweDg5RDc2QzU0LAorCTB4NUQxRDA4QkYsIDB4QUY3NjhCQkMsIDB4QkMyNjc4NDgsIDB4NEU0REZCNEIsCisJMHgyMEJEOEVERSwgMHhEMkQ2MERERCwgMHhDMTg2RkUyOSwgMHgzM0VEN0QyQSwKKwkweEU3MjcxOUMxLCAweDE1NEM5QUMyLCAweDA2MUM2OTM2LCAweEY0NzdFQTM1LAorCTB4QUE2NEQ2MTEsIDB4NTgwRjU1MTIsIDB4NEI1RkE2RTYsIDB4QjkzNDI1RTUsCisJMHg2REZFNDEwRSwgMHg5Rjk1QzIwRCwgMHg4Q0M1MzFGOSwgMHg3RUFFQjJGQSwKKwkweDMwRTM0OUIxLCAweEMyODhDQUIyLCAweEQxRDgzOTQ2LCAweDIzQjNCQTQ1LAorCTB4Rjc3OURFQUUsIDB4MDUxMjVEQUQsIDB4MTY0MkFFNTksIDB4RTQyOTJENUEsCisJMHhCQTNBMTE3RSwgMHg0ODUxOTI3RCwgMHg1QjAxNjE4OSwgMHhBOTZBRTI4QSwKKwkweDdEQTA4NjYxLCAweDhGQ0IwNTYyLCAweDlDOUJGNjk2LCAweDZFRjA3NTk1LAorCTB4NDE3QjFEQkMsIDB4QjMxMDlFQkYsIDB4QTA0MDZENEIsIDB4NTIyQkVFNDgsCisJMHg4NkUxOEFBMywgMHg3NDhBMDlBMCwgMHg2N0RBRkE1NCwgMHg5NUIxNzk1NywKKwkweENCQTI0NTczLCAweDM5QzlDNjcwLCAweDJBOTkzNTg0LCAweEQ4RjJCNjg3LAorCTB4MEMzOEQyNkMsIDB4RkU1MzUxNkYsIDB4RUQwM0EyOUIsIDB4MUY2ODIxOTgsCisJMHg1MTI1REFEMywgMHhBMzRFNTlEMCwgMHhCMDFFQUEyNCwgMHg0Mjc1MjkyNywKKwkweDk2QkY0RENDLCAweDY0RDRDRUNGLCAweDc3ODQzRDNCLCAweDg1RUZCRTM4LAorCTB4REJGQzgyMUMsIDB4Mjk5NzAxMUYsIDB4M0FDN0YyRUIsIDB4QzhBQzcxRTgsCisJMHgxQzY2MTUwMywgMHhFRTBEOTYwMCwgMHhGRDVENjVGNCwgMHgwRjM2RTZGNywKKwkweDYxQzY5MzYyLCAweDkzQUQxMDYxLCAweDgwRkRFMzk1LCAweDcyOTY2MDk2LAorCTB4QTY1QzA0N0QsIDB4NTQzNzg3N0UsIDB4NDc2Nzc0OEEsIDB4QjUwQ0Y3ODksCisJMHhFQjFGQ0JBRCwgMHgxOTc0NDhBRSwgMHgwQTI0QkI1QSwgMHhGODRGMzg1OSwKKwkweDJDODU1Q0IyLCAweERFRUVERkIxLCAweENEQkUyQzQ1LCAweDNGRDVBRjQ2LAorCTB4NzE5ODU0MEQsIDB4ODNGM0Q3MEUsIDB4OTBBMzI0RkEsIDB4NjJDOEE3RjksCisJMHhCNjAyQzMxMiwgMHg0NDY5NDAxMSwgMHg1NzM5QjNFNSwgMHhBNTUyMzBFNiwKKwkweEZCNDEwQ0MyLCAweDA5MkE4RkMxLCAweDFBN0E3QzM1LCAweEU4MTFGRjM2LAorCTB4M0NEQjlCREQsIDB4Q0VCMDE4REUsIDB4RERFMEVCMkEsIDB4MkY4QjY4MjksCisJMHg4MkY2M0I3OCwgMHg3MDlEQjg3QiwgMHg2M0NENEI4RiwgMHg5MUE2Qzg4QywKKwkweDQ1NkNBQzY3LCAweEI3MDcyRjY0LCAweEE0NTdEQzkwLCAweDU2M0M1RjkzLAorCTB4MDgyRjYzQjcsIDB4RkE0NEUwQjQsIDB4RTkxNDEzNDAsIDB4MUI3RjkwNDMsCisJMHhDRkI1RjRBOCwgMHgzRERFNzdBQiwgMHgyRThFODQ1RiwgMHhEQ0U1MDc1QywKKwkweDkyQThGQzE3LCAweDYwQzM3RjE0LCAweDczOTM4Q0UwLCAweDgxRjgwRkUzLAorCTB4NTUzMjZCMDgsIDB4QTc1OUU4MEIsIDB4QjQwOTFCRkYsIDB4NDY2Mjk4RkMsCisJMHgxODcxQTREOCwgMHhFQTFBMjdEQiwgMHhGOTRBRDQyRiwgMHgwQjIxNTcyQywKKwkweERGRUIzM0M3LCAweDJEODBCMEM0LCAweDNFRDA0MzMwLCAweENDQkJDMDMzLAorCTB4QTI0QkI1QTYsIDB4NTAyMDM2QTUsIDB4NDM3MEM1NTEsIDB4QjExQjQ2NTIsCisJMHg2NUQxMjJCOSwgMHg5N0JBQTFCQSwgMHg4NEVBNTI0RSwgMHg3NjgxRDE0RCwKKwkweDI4OTJFRDY5LCAweERBRjk2RTZBLCAweEM5QTk5RDlFLCAweDNCQzIxRTlELAorCTB4RUYwODdBNzYsIDB4MUQ2M0Y5NzUsIDB4MEUzMzBBODEsIDB4RkM1ODg5ODIsCisJMHhCMjE1NzJDOSwgMHg0MDdFRjFDQSwgMHg1MzJFMDIzRSwgMHhBMTQ1ODEzRCwKKwkweDc1OEZFNUQ2LCAweDg3RTQ2NkQ1LCAweDk0QjQ5NTIxLCAweDY2REYxNjIyLAorCTB4MzhDQzJBMDYsIDB4Q0FBN0E5MDUsIDB4RDlGNzVBRjEsIDB4MkI5Q0Q5RjIsCisJMHhGRjU2QkQxOSwgMHgwRDNEM0UxQSwgMHgxRTZEQ0RFRSwgMHhFQzA2NEVFRCwKKwkweEMzOEQyNkM0LCAweDMxRTZBNUM3LCAweDIyQjY1NjMzLCAweEQwRERENTMwLAorCTB4MDQxN0IxREIsIDB4RjY3QzMyRDgsIDB4RTUyQ0MxMkMsIDB4MTc0NzQyMkYsCisJMHg0OTU0N0UwQiwgMHhCQjNGRkQwOCwgMHhBODZGMEVGQywgMHg1QTA0OERGRiwKKwkweDhFQ0VFOTE0LCAweDdDQTU2QTE3LCAweDZGRjU5OUUzLCAweDlEOUUxQUUwLAorCTB4RDNEM0UxQUIsIDB4MjFCODYyQTgsIDB4MzJFODkxNUMsIDB4QzA4MzEyNUYsCisJMHgxNDQ5NzZCNCwgMHhFNjIyRjVCNywgMHhGNTcyMDY0MywgMHgwNzE5ODU0MCwKKwkweDU5MEFCOTY0LCAweEFCNjEzQTY3LCAweEI4MzFDOTkzLCAweDRBNUE0QTkwLAorCTB4OUU5MDJFN0IsIDB4NkNGQkFENzgsIDB4N0ZBQjVFOEMsIDB4OERDMEREOEYsCisJMHhFMzMwQTgxQSwgMHgxMTVCMkIxOSwgMHgwMjBCRDhFRCwgMHhGMDYwNUJFRSwKKwkweDI0QUEzRjA1LCAweEQ2QzFCQzA2LCAweEM1OTE0RkYyLCAweDM3RkFDQ0YxLAorCTB4NjlFOUYwRDUsIDB4OUI4MjczRDYsIDB4ODhEMjgwMjIsIDB4N0FCOTAzMjEsCisJMHhBRTczNjdDQSwgMHg1QzE4RTRDOSwgMHg0RjQ4MTczRCwgMHhCRDIzOTQzRSwKKwkweEYzNkU2Rjc1LCAweDAxMDVFQzc2LCAweDEyNTUxRjgyLCAweEUwM0U5QzgxLAorCTB4MzRGNEY4NkEsIDB4QzY5RjdCNjksIDB4RDVDRjg4OUQsIDB4MjdBNDBCOUUsCisJMHg3OUI3MzdCQSwgMHg4QkRDQjRCOSwgMHg5ODhDNDc0RCwgMHg2QUU3QzQ0RSwKKwkweEJFMkRBMEE1LCAweDRDNDYyM0E2LCAweDVGMTZEMDUyLCAweEFEN0Q1MzUxLAorfTsKKyAgICAgCitfX3UzMiBzY3RwX3N0YXJ0X2Nrc3VtKF9fdTggKmJ1ZmZlciwgX191MTYgbGVuZ3RoKQoreworICAgIAlfX3UzMiBjcmMzMiA9IH4oX191MzIpIDA7CisJX191MzIgaTsKKworCS8qIE9wdGltaXplIHRoaXMgcm91dGluZSB0byBiZSBTQ1RQIHNwZWNpZmljLCBrbm93aW5nIGhvdworCSAqIHRvIHNraXAgdGhlIGNoZWNrc3VtIGZpZWxkIG9mIHRoZSBTQ1RQIGhlYWRlci4KKwkgKi8KKworCS8qIENhbGN1bGF0ZSBDUkMgdXAgdG8gdGhlIGNoZWNrc3VtLiAqLworCWZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mKHN0cnVjdCBzY3RwaGRyKSAtIHNpemVvZihfX3UzMikpOyBpKyspCisgICAgICAJCUNSQzMyQyhjcmMzMiwgYnVmZmVyW2ldKTsKKworCS8qIFNraXAgY2hlY2tzdW0gZmllbGQgb2YgdGhlIGhlYWRlci4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKF9fdTMyKTsgaSsrKQorCQlDUkMzMkMoY3JjMzIsIDApOworCisJLyogQ2FsY3VsYXRlIHRoZSByZXN0IG9mIHRoZSBDUkMuICovCisJZm9yIChpID0gc2l6ZW9mKHN0cnVjdCBzY3RwaGRyKTsgaSA8IGxlbmd0aCA7IGkrKykKKwkJQ1JDMzJDKGNyYzMyLCBidWZmZXJbaV0pOworCisJcmV0dXJuIGNyYzMyOworfQorCitfX3UzMiBzY3RwX3VwZGF0ZV9ja3N1bShfX3U4ICpidWZmZXIsIF9fdTE2IGxlbmd0aCwgX191MzIgY3JjMzIpCit7CisJX191MzIgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW5ndGggOyBpKyspCisJCUNSQzMyQyhjcmMzMiwgYnVmZmVyW2ldKTsKKworCXJldHVybiBjcmMzMjsKK30KKworX191MzIgc2N0cF91cGRhdGVfY29weV9ja3N1bShfX3U4ICp0bywgX191OCAqZnJvbSwgX191MTYgbGVuZ3RoLCBfX3UzMiBjcmMzMikKK3sKKwlfX3UzMiBpOworCV9fdTMyICpfdG8gPSAoX191MzIgKil0bzsKKwlfX3UzMiAqX2Zyb20gPSAoX191MzIgKilmcm9tOworCQorCWZvciAoaSA9IDA7IGkgPCAobGVuZ3RoLzQpOyBpKyspIHsKKwkJX3RvW2ldID0gX2Zyb21baV07CisJCUNSQzMyQyhjcmMzMiwgZnJvbVtpKjRdKTsKKwkJQ1JDMzJDKGNyYzMyLCBmcm9tW2kqNCsxXSk7CisJCUNSQzMyQyhjcmMzMiwgZnJvbVtpKjQrMl0pOworCQlDUkMzMkMoY3JjMzIsIGZyb21baSo0KzNdKTsJCisJfQorCisJcmV0dXJuIGNyYzMyOworfQorCitfX3UzMiBzY3RwX2VuZF9ja3N1bShfX3UzMiBjcmMzMikKK3sKKwlfX3UzMiByZXN1bHQ7CisJX191OCBieXRlMCwgYnl0ZTEsIGJ5dGUyLCBieXRlMzsKKworCXJlc3VsdCA9IH5jcmMzMjsKKworCS8qICByZXN1bHQgIG5vdyBob2xkcyB0aGUgbmVnYXRlZCBwb2x5bm9taWFsIHJlbWFpbmRlcjsKKwkgKiAgc2luY2UgdGhlIHRhYmxlIGFuZCBhbGdvcml0aG0gaXMgInJlZmxlY3RlZCIgW3dpbGxpYW1zOTVdLgorCSAqICBUaGF0IGlzLCAgcmVzdWx0IGhhcyB0aGUgc2FtZSB2YWx1ZSBhcyBpZiB3ZSBtYXBwZWQgdGhlIG1lc3NhZ2UKKwkgKiAgdG8gYSBwb2x5b21pYWwsIGNvbXB1dGVkIHRoZSBob3N0LWJpdC1vcmRlciBwb2x5bm9taWFsCisJICogIHJlbWFpbmRlciwgcGVyZm9ybWVkIGZpbmFsIG5lZ2F0aW9uLCB0aGVuIGRpZCBhbiBlbmQtZm9yLWVuZAorCSAqICBiaXQtcmV2ZXJzYWwuCisJICogIE5vdGUgdGhhdCBhIDMyLWJpdCBiaXQtcmV2ZXJzYWwgaXMgaWRlbnRpY2FsIHRvIGZvdXIgaW5wbGFjZQorCSAqICA4LWJpdCByZXZlcnNhbHMgZm9sbG93ZWQgYnkgYW4gZW5kLWZvci1lbmQgYnl0ZXN3YXAuCisJICogIEluIG90aGVyIHdvcmRzLCB0aGUgYnl0ZXMgb2YgZWFjaCBiaXQgYXJlIGluIHRoZSByaWdodCBvcmRlciwKKwkgKiAgYnV0IHRoZSBieXRlcyBoYXZlIGJlZW4gYnl0ZXN3YXBwZWQuICBTbyB3ZSBub3cgZG8gYW4gZXhwbGljaXQKKwkgKiAgYnl0ZXN3YXAuICBPbiBhIGxpdHRsZS1lbmRpYW4gbWFjaGluZSwgdGhpcyBieXRlc3dhcCBhbmQKKwkgKiAgdGhlIGZpbmFsIG50b2hsIGNhbmNlbCBvdXQgYW5kIGNvdWxkIGJlIGVsaWRlZC4KKwkgKi8KKwlieXRlMCA9IHJlc3VsdCAmIDB4ZmY7CisJYnl0ZTEgPSAocmVzdWx0Pj44KSAmIDB4ZmY7CisJYnl0ZTIgPSAocmVzdWx0Pj4xNikgJiAweGZmOworCWJ5dGUzID0gKHJlc3VsdD4+MjQpICYgMHhmZjsKKworCWNyYzMyID0gKChieXRlMCA8PCAyNCkgfAorCQkgKGJ5dGUxIDw8IDE2KSB8CisJCSAoYnl0ZTIgPDwgOCkgIHwKKwkJIGJ5dGUzKTsKKwlyZXR1cm4gY3JjMzI7Cit9CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9kZWJ1Zy5jIGIvbmV0L3NjdHAvZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTgzNDAzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjdHAvZGVidWcuYwpAQCAtMCwwICsxLDE5MSBAQAorLyogU0NUUCBrZXJuZWwgcmVmZXJlbmNlIEltcGxlbWVudGF0aW9uCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxLCAyMDA0CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMCBDaXNjbywgSW5jLgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgTW90b3JvbGEsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlbCBDb3JwLgorICogCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgU0NUUCBrZXJuZWwgcmVmZXJlbmNlIEltcGxlbWVudGF0aW9uCisgKiAKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWRkLUlQIGV4dGVuc2lvbiwKKyAqIGJhc2VkIG9uIDxkcmFmdC1pZXRmLXRzdndnLWFkZGlwLXNjdHAtMDIudHh0PiBKdW5lIDI5LCAyMDAxLAorICogZm9yIHRoZSBTQ1RQIGtlcm5lbCByZWZlcmVuY2UgSW1wbGVtZW50YXRpb24uCisgKiAKKyAqIFRoaXMgZmlsZSBjb252ZXJ0cyBudW1lcmljYWwgSUQgdmFsdWUgdG8gYWxwaGFiZXRpY2FsIG5hbWVzIGZvciBTQ1RQCisgKiB0ZXJtcyBzdWNoIGFzIGNodW5rIHR5cGUsIHBhcmFtZXRlciB0aW1lLCBldmVudCB0eXBlLCBldGMuCisgKiAKKyAqIFRoZSBTQ1RQIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOyAKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIAorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoZSBTQ1RQIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorICogCisgKiBQbGVhc2Ugc2VuZCBhbnkgYnVnIHJlcG9ydHMgb3IgZml4ZXMgeW91IG1ha2UgdG8gdGhlCisgKiBlbWFpbCBhZGRyZXNzKGVzKToKKyAqICAgIGxrc2N0cCBkZXZlbG9wZXJzIDxsa3NjdHAtZGV2ZWxvcGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKiAKKyAqIE9yIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHdlYnNpdGU6CisgKiAgICBodHRwOi8vd3d3LnNmLm5ldC9wcm9qZWN0cy9sa3NjdHAKKyAqCisgKiBXcml0dGVuIG9yIG1vZGlmaWVkIGJ5OiAKKyAqICAgIExhIE1vbnRlIEguUC4gWWFycm9sbCA8cGlnZ3lAYWNtLm9yZz4KKyAqICAgIEthcmwgS251dHNvbiAgICAgICAgICA8a2FybEBhdGhlbmEuY2hpY2Fnby5pbC51cz4KKyAqICAgIFhpbmdhbmcgR3VvICAgICAgICAgICA8eGluZ2FuZy5ndW9AaW50ZWwuY29tPgorICogICAgSm9uIEdyaW1tICAgICAgICAgICAgIDxqZ3JpbW1AdXMuaWJtLmNvbT4KKyAqICAgIERhaXN5IENoYW5nCSAgICA8ZGFpc3ljQHVzLmlibS5jb20+CisgKiAgICBTcmlkaGFyIFNhbXVkcmFsYQkgICAgPHNyaUB1cy5pYm0uY29tPgorICogCisgKiBBbnkgYnVncyByZXBvcnRlZCBnaXZlbiB0byB1cyB3ZSB3aWxsIHRyeSB0byBmaXguLi4gYW55IGZpeGVzIHNoYXJlZCB3aWxsCisgKiBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbmV4dCBTQ1RQIHJlbGVhc2UuCisgKi8KKworI2luY2x1ZGUgPG5ldC9zY3RwL3NjdHAuaD4KKworI2lmIFNDVFBfREVCVUcKK2ludCBzY3RwX2RlYnVnX2ZsYWcgPSAxOwkvKiBJbml0aWFsbHkgZW5hYmxlIERFQlVHICovCisjZW5kaWYJLyogU0NUUF9ERUJVRyAqLworCisvKiBUaGVzZSBhcmUgcHJpbnRhYmxlIGZvcm1zIG9mIENodW5rIElEJ3MgZnJvbSBzZWN0aW9uIDMuMS4gICovCitzdGF0aWMgY29uc3QgY2hhciAqc2N0cF9jaWRfdGJsW1NDVFBfTlVNX0JBU0VfQ0hVTktfVFlQRVNdID0geworCSJEQVRBIiwKKwkiSU5JVCIsCisJIklOSVRfQUNLIiwKKwkiU0FDSyIsCisJIkhFQVJUQkVBVCIsCisJIkhFQVJUQkVBVF9BQ0siLAorCSJBQk9SVCIsCisJIlNIVVRET1dOIiwKKwkiU0hVVERPV05fQUNLIiwKKwkiRVJST1IiLAorCSJDT09LSUVfRUNITyIsCisJIkNPT0tJRV9BQ0siLAorCSJFQ05fRUNORSIsCisJIkVDTl9DV1IiLAorCSJTSFVURE9XTl9DT01QTEVURSIsCit9OworCisvKiBMb29rdXAgImNodW5rIHR5cGUiIGRlYnVnIG5hbWUuICovCitjb25zdCBjaGFyICpzY3RwX2NuYW1lKGNvbnN0IHNjdHBfc3VidHlwZV90IGNpZCkKK3sKKwlpZiAoY2lkLmNodW5rIDwgMCkKKwkJcmV0dXJuICJpbGxlZ2FsIGNodW5rIGlkIjsKKwlpZiAoY2lkLmNodW5rIDw9IFNDVFBfQ0lEX0JBU0VfTUFYKQorCQlyZXR1cm4gc2N0cF9jaWRfdGJsW2NpZC5jaHVua107CisJCisJc3dpdGNoIChjaWQuY2h1bmspIHsKKwljYXNlIFNDVFBfQ0lEX0FTQ09ORjoKKwkJcmV0dXJuICJBU0NPTkYiOworCisJY2FzZSBTQ1RQX0NJRF9BU0NPTkZfQUNLOgorCQlyZXR1cm4gIkFTQ09ORl9BQ0siOworCisJY2FzZSBTQ1RQX0NJRF9GV0RfVFNOOgorCQlyZXR1cm4gIkZXRF9UU04iOworCisJZGVmYXVsdDoKKwkJcmV0dXJuICJ1bmtub3duIGNodW5rIjsKKwl9OworCXJldHVybiAidW5rbm93biBjaHVuayI7Cit9CisKKy8qIFRoZXNlIGFyZSBwcmludGFibGUgZm9ybXMgb2YgdGhlIHN0YXRlcy4gICovCitjb25zdCBjaGFyICpzY3RwX3N0YXRlX3RibFtTQ1RQX1NUQVRFX05VTV9TVEFURVNdID0geworCSJTVEFURV9FTVBUWSIsCisJIlNUQVRFX0NMT1NFRCIsCisJIlNUQVRFX0NPT0tJRV9XQUlUIiwKKwkiU1RBVEVfQ09PS0lFX0VDSE9FRCIsCisJIlNUQVRFX0VTVEFCTElTSEVEIiwKKwkiU1RBVEVfU0hVVERPV05fUEVORElORyIsCisJIlNUQVRFX1NIVVRET1dOX1NFTlQiLAorCSJTVEFURV9TSFVURE9XTl9SRUNFSVZFRCIsCisJIlNUQVRFX1NIVVRET1dOX0FDS19TRU5UIiwKK307CisKKy8qIEV2ZW50cyB0aGF0IGNvdWxkIGNoYW5nZSB0aGUgc3RhdGUgb2YgYW4gYXNzb2NpYXRpb24uICAqLworY29uc3QgY2hhciAqc2N0cF9ldnR0eXBlX3RibFtdID0geworCSJFVkVOVF9UX3Vua25vd24iLAorCSJFVkVOVF9UX0NIVU5LIiwKKwkiRVZFTlRfVF9USU1FT1VUIiwKKwkiRVZFTlRfVF9PVEhFUiIsCisJIkVWRU5UX1RfUFJJTUlUSVZFIgorfTsKKworLyogUmV0dXJuIHZhbHVlIG9mIGEgc3RhdGUgZnVuY3Rpb24gKi8KK2NvbnN0IGNoYXIgKnNjdHBfc3RhdHVzX3RibFtdID0geworCSJESVNQT1NJVElPTl9ESVNDQVJEIiwKKwkiRElTUE9TSVRJT05fQ09OU1VNRSIsCisJIkRJU1BPU0lUSU9OX05PTUVNIiwKKwkiRElTUE9TSVRJT05fREVMRVRFX1RDQiIsCisJIkRJU1BPU0lUSU9OX0FCT1JUIiwKKwkiRElTUE9TSVRJT05fVklPTEFUSU9OIiwKKwkiRElTUE9TSVRJT05fTk9UX0lNUEwiLAorCSJESVNQT1NJVElPTl9FUlJPUiIsCisJIkRJU1BPU0lUSU9OX0JVRyIKK307CisKKy8qIFByaW50YWJsZSBmb3JtcyBvZiBwcmltaXRpdmVzICovCitzdGF0aWMgY29uc3QgY2hhciAqc2N0cF9wcmltaXRpdmVfdGJsW1NDVFBfTlVNX1BSSU1JVElWRV9UWVBFU10gPSB7CisJIlBSSU1JVElWRV9BU1NPQ0lBVEUiLAorCSJQUklNSVRJVkVfU0hVVERPV04iLAorCSJQUklNSVRJVkVfQUJPUlQiLAorCSJQUklNSVRJVkVfU0VORCIsCisJIlBSSU1JVElWRV9SRVFVRVNUSEVBUlRCRUFUIiwKK307CisKKy8qIExvb2t1cCBwcmltaXRpdmUgZGVidWcgbmFtZS4gKi8KK2NvbnN0IGNoYXIgKnNjdHBfcG5hbWUoY29uc3Qgc2N0cF9zdWJ0eXBlX3QgaWQpCit7CisJaWYgKGlkLnByaW1pdGl2ZSA8IDApCisJCXJldHVybiAiaWxsZWdhbCBwcmltaXRpdmUiOworCWlmIChpZC5wcmltaXRpdmUgPD0gU0NUUF9FVkVOVF9QUklNSVRJVkVfTUFYKQorCQlyZXR1cm4gc2N0cF9wcmltaXRpdmVfdGJsW2lkLnByaW1pdGl2ZV07CisJcmV0dXJuICJ1bmtub3duX3ByaW1pdGl2ZSI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpzY3RwX290aGVyX3RibFtdID0geworCSJOT19QRU5ESU5HX1RTTiIsCisgICAgICAgICJJQ01QX1BST1RPX1VOUkVBQ0giLAorfTsKKworLyogTG9va3VwICJvdGhlciIgZGVidWcgbmFtZS4gKi8KK2NvbnN0IGNoYXIgKnNjdHBfb25hbWUoY29uc3Qgc2N0cF9zdWJ0eXBlX3QgaWQpCit7CisJaWYgKGlkLm90aGVyIDwgMCkKKwkJcmV0dXJuICJpbGxlZ2FsICdvdGhlcicgZXZlbnQiOworCWlmIChpZC5vdGhlciA8PSBTQ1RQX0VWRU5UX09USEVSX01BWCkKKwkJcmV0dXJuIHNjdHBfb3RoZXJfdGJsW2lkLm90aGVyXTsKKwlyZXR1cm4gInVua25vd24gJ290aGVyJyBldmVudCI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpzY3RwX3RpbWVyX3RibFtdID0geworCSJUSU1FT1VUX05PTkUiLAorCSJUSU1FT1VUX1QxX0NPT0tJRSIsCisJIlRJTUVPVVRfVDFfSU5JVCIsCisJIlRJTUVPVVRfVDJfU0hVVERPV04iLAorCSJUSU1FT1VUX1QzX1JUWCIsCisJIlRJTUVPVVRfVDRfUlRPIiwKKwkiVElNRU9VVF9UNV9TSFVURE9XTl9HVUFSRCIsCisJIlRJTUVPVVRfSEVBUlRCRUFUIiwKKwkiVElNRU9VVF9TQUNLIiwKKwkiVElNRU9VVF9BVVRPQ0xPU0UiLAorfTsKKworLyogTG9va3VwIHRpbWVyIGRlYnVnIG5hbWUuICovCitjb25zdCBjaGFyICpzY3RwX3RuYW1lKGNvbnN0IHNjdHBfc3VidHlwZV90IGlkKQoreworCWlmIChpZC50aW1lb3V0IDwgMCkKKwkJcmV0dXJuICJpbGxlZ2FsICd0aW1lcicgZXZlbnQiOworCWlmIChpZC50aW1lb3V0IDw9IFNDVFBfRVZFTlRfVElNRU9VVF9NQVgpCisJCXJldHVybiBzY3RwX3RpbWVyX3RibFtpZC50aW1lb3V0XTsKKwlyZXR1cm4gInVua25vd25fdGltZXIiOworfQpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvZW5kcG9pbnRvbGEuYyBiL25ldC9zY3RwL2VuZHBvaW50b2xhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ0Yjc1MAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY3RwL2VuZHBvaW50b2xhLmMKQEAgLTAsMCArMSwzODkgQEAKKy8qIFNDVFAga2VybmVsIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgQ2lzY28sIEluYy4KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIE1vdG9yb2xhLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzLCBDb3JwLgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTm9raWEsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBMYSBNb250ZSBILlAuIFlhcnJvbGwKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgU0NUUCBrZXJuZWwgcmVmZXJlbmNlIEltcGxlbWVudGF0aW9uCisgKgorICogVGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFuIFNDVFAgZW5kcG9pbnQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhZGQtSVAgZXh0ZW5zaW9uLAorICogYmFzZWQgb24gPGRyYWZ0LWlldGYtdHN2d2ctYWRkaXAtc2N0cC0wMi50eHQ+IEp1bmUgMjksIDIwMDEsCisgKiBmb3IgdGhlIFNDVFAga2VybmVsIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBUaGUgU0NUUCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgU0NUUCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogV3JpdHRlbiBvciBtb2RpZmllZCBieToKKyAqICAgIExhIE1vbnRlIEguUC4gWWFycm9sbCA8cGlnZ3lAYWNtLm9yZz4KKyAqICAgIEthcmwgS251dHNvbiA8a2FybEBhdGhlbmEuY2hpY2Fnby5pbC51cz4KKyAqICAgIEpvbiBHcmltbSA8amdyaW1tQGF1c3Rpbi5pYm0uY29tPgorICogICAgRGFpc3kgQ2hhbmcgPGRhaXN5Y0B1cy5pYm0uY29tPgorICogICAgRGFqaWFuZyBaaGFuZyA8ZGFqaWFuZy56aGFuZ0Bub2tpYS5jb20+CisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgZ2l2ZW4gdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CS8qIGdldF9yYW5kb21fYnl0ZXMoKSAqLworI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvc2N0cC9zY3RwLmg+CisjaW5jbHVkZSA8bmV0L3NjdHAvc20uaD4KKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIGludGVybmFsIGhlbHBlcnMuICovCitzdGF0aWMgdm9pZCBzY3RwX2VuZHBvaW50X2JoX3JjdihzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXApOworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgYmFzZSBmaWVsZHMgb2YgdGhlIGVuZHBvaW50IHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHN0cnVjdCBzY3RwX2VuZHBvaW50ICpzY3RwX2VuZHBvaW50X2luaXQoc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCQkJc3RydWN0IHNvY2sgKnNrLCBpbnQgZ2ZwKQoreworCXN0cnVjdCBzY3RwX3NvY2sgKnNwID0gc2N0cF9zayhzayk7CisJbWVtc2V0KGVwLCAwLCBzaXplb2Yoc3RydWN0IHNjdHBfZW5kcG9pbnQpKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGJhc2Ugc3RydWN0dXJlLiAqLworCS8qIFdoYXQgdHlwZSBvZiBlbmRwb2ludCBhcmUgd2U/ICAqLworCWVwLT5iYXNlLnR5cGUgPSBTQ1RQX0VQX1RZUEVfU09DS0VUOworCisJLyogSW5pdGlhbGl6ZSB0aGUgYmFzaWMgb2JqZWN0IGZpZWxkcy4gKi8KKwlhdG9taWNfc2V0KCZlcC0+YmFzZS5yZWZjbnQsIDEpOworCWVwLT5iYXNlLmRlYWQgPSAwOworCWVwLT5iYXNlLm1hbGxvY2VkID0gMTsKKworCS8qIENyZWF0ZSBhbiBpbnB1dCBxdWV1ZS4gICovCisJc2N0cF9pbnFfaW5pdCgmZXAtPmJhc2UuaW5xdWV1ZSk7CisKKwkvKiBTZXQgaXRzIHRvcC1oYWxmIGhhbmRsZXIgKi8KKwlzY3RwX2lucV9zZXRfdGhfaGFuZGxlcigmZXAtPmJhc2UuaW5xdWV1ZSwKKwkJCQkodm9pZCAoKikodm9pZCAqKSlzY3RwX2VuZHBvaW50X2JoX3JjdiwgZXApOworCisJLyogSW5pdGlhbGl6ZSB0aGUgYmluZCBhZGRyIGFyZWEgKi8KKwlzY3RwX2JpbmRfYWRkcl9pbml0KCZlcC0+YmFzZS5iaW5kX2FkZHIsIDApOworCXJ3bG9ja19pbml0KCZlcC0+YmFzZS5hZGRyX2xvY2spOworCisJLyogUmVtZW1iZXIgd2hvIHdlIGFyZSBhdHRhY2hlZCB0by4gICovCisJZXAtPmJhc2Uuc2sgPSBzazsKKwlzb2NrX2hvbGQoZXAtPmJhc2Uuc2spOworCisJLyogQ3JlYXRlIHRoZSBsaXN0cyBvZiBhc3NvY2lhdGlvbnMuICAqLworCUlOSVRfTElTVF9IRUFEKCZlcC0+YXNvY3MpOworCisJLyogU2V0IHVwIHRoZSBiYXNlIHRpbWVvdXQgaW5mb3JtYXRpb24uICAqLworCWVwLT50aW1lb3V0c1tTQ1RQX0VWRU5UX1RJTUVPVVRfTk9ORV0gPSAwOworCWVwLT50aW1lb3V0c1tTQ1RQX0VWRU5UX1RJTUVPVVRfVDFfQ09PS0lFXSA9CisJCVNDVFBfREVGQVVMVF9USU1FT1VUX1QxX0NPT0tJRTsKKwllcC0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX1QxX0lOSVRdID0KKwkJU0NUUF9ERUZBVUxUX1RJTUVPVVRfVDFfSU5JVDsKKwllcC0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX1QyX1NIVVRET1dOXSA9CisJCW1zZWNzX3RvX2ppZmZpZXMoc3AtPnJ0b2luZm8uc3J0b19pbml0aWFsKTsKKwllcC0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX1QzX1JUWF0gPSAwOworCWVwLT50aW1lb3V0c1tTQ1RQX0VWRU5UX1RJTUVPVVRfVDRfUlRPXSA9IDA7CisKKwkvKiBzY3RwaW1wZ3VpZGUtMDUgU2VjdGlvbiAyLjEyLjIKKwkgKiBJZiB0aGUgJ1Q1LXNodXRkb3duLWd1YXJkJyB0aW1lciBpcyB1c2VkLCBpdCBTSE9VTEQgYmUgc2V0IHRvIHRoZQorCSAqIHJlY29tbWVuZGVkIHZhbHVlIG9mIDUgdGltZXMgJ1JUTy5NYXgnLgorCSAqLworICAgICAgICBlcC0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX1Q1X1NIVVRET1dOX0dVQVJEXQorCQk9IDUgKiBtc2Vjc190b19qaWZmaWVzKHNwLT5ydG9pbmZvLnNydG9fbWF4KTsKKworCWVwLT50aW1lb3V0c1tTQ1RQX0VWRU5UX1RJTUVPVVRfSEVBUlRCRUFUXSA9CisJCVNDVFBfREVGQVVMVF9USU1FT1VUX0hFQVJUQkVBVDsKKwllcC0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX1NBQ0tdID0KKwkJU0NUUF9ERUZBVUxUX1RJTUVPVVRfU0FDSzsKKwllcC0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX0FVVE9DTE9TRV0gPQorCQlzcC0+YXV0b2Nsb3NlICogSFo7CisKKwkvKiBVc2UgU0NUUCBzcGVjaWZpYyBzZW5kIGJ1ZmZlciBzcGFjZSBxdWV1ZXMuICAqLworCXNrLT5za193cml0ZV9zcGFjZSA9IHNjdHBfd3JpdGVfc3BhY2U7CisJc29ja19zZXRfZmxhZyhzaywgU09DS19VU0VfV1JJVEVfUVVFVUUpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgc2VjcmV0IGtleSB1c2VkIHdpdGggY29va2llLiAqLworCWdldF9yYW5kb21fYnl0ZXMoJmVwLT5zZWNyZXRfa2V5WzBdLCBTQ1RQX1NFQ1JFVF9TSVpFKTsKKwllcC0+bGFzdF9rZXkgPSBlcC0+Y3VycmVudF9rZXkgPSAwOworCWVwLT5rZXlfY2hhbmdlZF9hdCA9IGppZmZpZXM7CisKKwllcC0+ZGVidWdfbmFtZSA9ICJ1bm5hbWVkRW5kcG9pbnQiOworCXJldHVybiBlcDsKK30KKworLyogQ3JlYXRlIGEgc2N0cF9lbmRwb2ludCB3aXRoIGFsbCB0aGF0IGJvcmluZyBzdHVmZiBpbml0aWFsaXplZC4KKyAqIFJldHVybnMgTlVMTCBpZiB0aGVyZSBpc24ndCBlbm91Z2ggbWVtb3J5LgorICovCitzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqc2N0cF9lbmRwb2ludF9uZXcoc3RydWN0IHNvY2sgKnNrLCBpbnQgZ2ZwKQoreworCXN0cnVjdCBzY3RwX2VuZHBvaW50ICplcDsKKworCS8qIEJ1aWxkIGEgbG9jYWwgZW5kcG9pbnQuICovCisJZXAgPSB0X25ldyhzdHJ1Y3Qgc2N0cF9lbmRwb2ludCwgZ2ZwKTsKKwlpZiAoIWVwKQorCQlnb3RvIGZhaWw7CisJaWYgKCFzY3RwX2VuZHBvaW50X2luaXQoZXAsIHNrLCBnZnApKQorCQlnb3RvIGZhaWxfaW5pdDsKKwllcC0+YmFzZS5tYWxsb2NlZCA9IDE7CisJU0NUUF9EQkdfT0JKQ05UX0lOQyhlcCk7CisJcmV0dXJuIGVwOworCitmYWlsX2luaXQ6CisJa2ZyZWUoZXApOworZmFpbDoKKwlyZXR1cm4gTlVMTDsKK30KKworLyogQWRkIGFuIGFzc29jaWF0aW9uIHRvIGFuIGVuZHBvaW50LiAgKi8KK3ZvaWQgc2N0cF9lbmRwb2ludF9hZGRfYXNvYyhzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkgICAgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MpCit7CisJc3RydWN0IHNvY2sgKnNrID0gZXAtPmJhc2Uuc2s7CisKKwkvKiBOb3cganVzdCBhZGQgaXQgdG8gb3VyIGxpc3Qgb2YgYXNvY3MgKi8KKwlsaXN0X2FkZF90YWlsKCZhc29jLT5hc29jcywgJmVwLT5hc29jcyk7CisKKwkvKiBJbmNyZW1lbnQgdGhlIGJhY2tsb2cgdmFsdWUgZm9yIGEgVENQLXN0eWxlIGxpc3RlbmluZyBzb2NrZXQuICovCisJaWYgKHNjdHBfc3R5bGUoc2ssIFRDUCkgJiYgc2N0cF9zc3RhdGUoc2ssIExJU1RFTklORykpCisJCXNrLT5za19hY2tfYmFja2xvZysrOworfQorCisvKiBGcmVlIHRoZSBlbmRwb2ludCBzdHJ1Y3R1cmUuICBEZWxheSBjbGVhbnVwIHVudGlsCisgKiBhbGwgdXNlcnMgaGF2ZSByZWxlYXNlZCB0aGVpciByZWZlcmVuY2UgY291bnQgb24gdGhpcyBzdHJ1Y3R1cmUuCisgKi8KK3ZvaWQgc2N0cF9lbmRwb2ludF9mcmVlKHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCkKK3sKKwllcC0+YmFzZS5kZWFkID0gMTsKKwlzY3RwX2VuZHBvaW50X3B1dChlcCk7Cit9CisKKy8qIEZpbmFsIGRlc3RydWN0b3IgZm9yIGVuZHBvaW50LiAgKi8KK3N0YXRpYyB2b2lkIHNjdHBfZW5kcG9pbnRfZGVzdHJveShzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXApCit7CisJU0NUUF9BU1NFUlQoZXAtPmJhc2UuZGVhZCwgIkVuZHBvaW50IGlzIG5vdCBkZWFkIiwgcmV0dXJuKTsKKworCWVwLT5iYXNlLnNrLT5za19zdGF0ZSA9IFNDVFBfU1NfQ0xPU0VEOworCisJLyogVW5saW5rIHRoaXMgZW5kcG9pbnQsIHNvIHdlIGNhbid0IGZpbmQgaXQgYWdhaW4hICovCisJc2N0cF91bmhhc2hfZW5kcG9pbnQoZXApOworCisJLyogRnJlZSB1cCB0aGUgSE1BQyB0cmFuc2Zvcm0uICovCisJaWYgKHNjdHBfc2soZXAtPmJhc2Uuc2spLT5obWFjKQorCQlzY3RwX2NyeXB0b19mcmVlX3RmbShzY3RwX3NrKGVwLT5iYXNlLnNrKS0+aG1hYyk7CisKKwkvKiBDbGVhbnVwLiAqLworCXNjdHBfaW5xX2ZyZWUoJmVwLT5iYXNlLmlucXVldWUpOworCXNjdHBfYmluZF9hZGRyX2ZyZWUoJmVwLT5iYXNlLmJpbmRfYWRkcik7CisKKwkvKiBSZW1vdmUgYW5kIGZyZWUgdGhlIHBvcnQgKi8KKwlpZiAoc2N0cF9zayhlcC0+YmFzZS5zayktPmJpbmRfaGFzaCkKKwkJc2N0cF9wdXRfcG9ydChlcC0+YmFzZS5zayk7CisKKwkvKiBHaXZlIHVwIG91ciBob2xkIG9uIHRoZSBzb2NrLiAqLworCWlmIChlcC0+YmFzZS5zaykKKwkJc29ja19wdXQoZXAtPmJhc2Uuc2spOworCisJLyogRmluYWxseSwgZnJlZSB1cCBvdXIgbWVtb3J5LiAqLworCWlmIChlcC0+YmFzZS5tYWxsb2NlZCkgeworCQlrZnJlZShlcCk7CisJCVNDVFBfREJHX09CSkNOVF9ERUMoZXApOworCX0KK30KKworLyogSG9sZCBhIHJlZmVyZW5jZSB0byBhbiBlbmRwb2ludC4gKi8KK3ZvaWQgc2N0cF9lbmRwb2ludF9ob2xkKHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCkKK3sKKwlhdG9taWNfaW5jKCZlcC0+YmFzZS5yZWZjbnQpOworfQorCisvKiBSZWxlYXNlIGEgcmVmZXJlbmNlIHRvIGFuIGVuZHBvaW50IGFuZCBjbGVhbiB1cCBpZiB0aGVyZSBhcmUKKyAqIG5vIG1vcmUgcmVmZXJlbmNlcy4KKyAqLwordm9pZCBzY3RwX2VuZHBvaW50X3B1dChzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXApCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmVwLT5iYXNlLnJlZmNudCkpCisJCXNjdHBfZW5kcG9pbnRfZGVzdHJveShlcCk7Cit9CisKKy8qIElzIHRoaXMgdGhlIGVuZHBvaW50IHdlIGFyZSBsb29raW5nIGZvcj8gICovCitzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqc2N0cF9lbmRwb2ludF9pc19tYXRjaChzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkJCSAgICAgICBjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmxhZGRyKQoreworCXN0cnVjdCBzY3RwX2VuZHBvaW50ICpyZXR2YWw7CisKKwlzY3RwX3JlYWRfbG9jaygmZXAtPmJhc2UuYWRkcl9sb2NrKTsKKwlpZiAoZXAtPmJhc2UuYmluZF9hZGRyLnBvcnQgPT0gbGFkZHItPnY0LnNpbl9wb3J0KSB7CisJCWlmIChzY3RwX2JpbmRfYWRkcl9tYXRjaCgmZXAtPmJhc2UuYmluZF9hZGRyLCBsYWRkciwKKwkJCQkJIHNjdHBfc2soZXAtPmJhc2Uuc2spKSkgeworCQkJcmV0dmFsID0gZXA7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCXJldHZhbCA9IE5VTEw7CisKK291dDoKKwlzY3RwX3JlYWRfdW5sb2NrKCZlcC0+YmFzZS5hZGRyX2xvY2spOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIEZpbmQgdGhlIGFzc29jaWF0aW9uIHRoYXQgZ29lcyB3aXRoIHRoaXMgY2h1bmsuCisgKiBXZSBkbyBhIGxpbmVhciBzZWFyY2ggb2YgdGhlIGFzc29jaWF0aW9ucyBmb3IgdGhpcyBlbmRwb2ludC4KKyAqIFdlIHJldHVybiB0aGUgbWF0Y2hpbmcgdHJhbnNwb3J0IGFkZHJlc3MgdG9vLgorICovCitzdGF0aWMgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKl9fc2N0cF9lbmRwb2ludF9sb29rdXBfYXNzb2MoCisJY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCWNvbnN0IHVuaW9uIHNjdHBfYWRkciAqcGFkZHIsCisJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICoqdHJhbnNwb3J0KQoreworCWludCBycG9ydDsKKwlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisKKwlycG9ydCA9IHBhZGRyLT52NC5zaW5fcG9ydDsKKworCWxpc3RfZm9yX2VhY2gocG9zLCAmZXAtPmFzb2NzKSB7CisJCWFzb2MgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24sIGFzb2NzKTsKKwkJaWYgKHJwb3J0ID09IGFzb2MtPnBlZXIucG9ydCkgeworCQkJc2N0cF9yZWFkX2xvY2soJmFzb2MtPmJhc2UuYWRkcl9sb2NrKTsKKwkJCSp0cmFuc3BvcnQgPSBzY3RwX2Fzc29jX2xvb2t1cF9wYWRkcihhc29jLCBwYWRkcik7CisJCQlzY3RwX3JlYWRfdW5sb2NrKCZhc29jLT5iYXNlLmFkZHJfbG9jayk7CisKKwkJCWlmICgqdHJhbnNwb3J0KQorCQkJCXJldHVybiBhc29jOworCQl9CisJfQorCisJKnRyYW5zcG9ydCA9IE5VTEw7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIExvb2t1cCBhc3NvY2lhdGlvbiBvbiBhbiBlbmRwb2ludCBiYXNlZCBvbiBhIHBlZXIgYWRkcmVzcy4gIEJILXNhZmUuICAqLworc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKnNjdHBfZW5kcG9pbnRfbG9va3VwX2Fzc29jKAorCWNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwljb25zdCB1bmlvbiBzY3RwX2FkZHIgKnBhZGRyLAorCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqKnRyYW5zcG9ydCkKK3sKKwlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKKworCXNjdHBfbG9jYWxfYmhfZGlzYWJsZSgpOworCWFzb2MgPSBfX3NjdHBfZW5kcG9pbnRfbG9va3VwX2Fzc29jKGVwLCBwYWRkciwgdHJhbnNwb3J0KTsKKwlzY3RwX2xvY2FsX2JoX2VuYWJsZSgpOworCisJcmV0dXJuIGFzb2M7Cit9CisKKy8qIExvb2sgZm9yIGFueSBwZWVsZWQgb2ZmIGFzc29jaWF0aW9uIGZyb20gdGhlIGVuZHBvaW50IHRoYXQgbWF0Y2hlcyB0aGUKKyAqIGdpdmVuIHBlZXIgYWRkcmVzcy4KKyAqLworaW50IHNjdHBfZW5kcG9pbnRfaXNfcGVlbGVkX29mZihzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkJY29uc3QgdW5pb24gc2N0cF9hZGRyICpwYWRkcikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnkgKmFkZHI7CisJc3RydWN0IHNjdHBfYmluZF9hZGRyICpicDsKKworCXNjdHBfcmVhZF9sb2NrKCZlcC0+YmFzZS5hZGRyX2xvY2spOworCWJwID0gJmVwLT5iYXNlLmJpbmRfYWRkcjsKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJmJwLT5hZGRyZXNzX2xpc3QpIHsKKwkJYWRkciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSwgbGlzdCk7CisJCWlmIChzY3RwX2hhc19hc3NvY2lhdGlvbigmYWRkci0+YSwgcGFkZHIpKSB7CisJCQlzY3RwX3JlYWRfdW5sb2NrKCZlcC0+YmFzZS5hZGRyX2xvY2spOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJc2N0cF9yZWFkX3VubG9jaygmZXAtPmJhc2UuYWRkcl9sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKiBEbyBkZWxheWVkIGlucHV0IHByb2Nlc3NpbmcuICBUaGlzIGlzIHNjaGVkdWxlZCBieSBzY3RwX3JjdigpLgorICogVGhpcyBtYXkgYmUgY2FsbGVkIG9uIEJIIG9yIHRhc2sgdGltZS4KKyAqLworc3RhdGljIHZvaWQgc2N0cF9lbmRwb2ludF9iaF9yY3Yoc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwKQoreworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOworCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydDsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bms7CisJc3RydWN0IHNjdHBfaW5xICppbnF1ZXVlOworCXNjdHBfc3VidHlwZV90IHN1YnR5cGU7CisJc2N0cF9zdGF0ZV90IHN0YXRlOworCWludCBlcnJvciA9IDA7CisKKwlpZiAoZXAtPmJhc2UuZGVhZCkKKwkJcmV0dXJuOworCisJYXNvYyA9IE5VTEw7CisJaW5xdWV1ZSA9ICZlcC0+YmFzZS5pbnF1ZXVlOworCXNrID0gZXAtPmJhc2Uuc2s7CisKKwl3aGlsZSAoTlVMTCAhPSAoY2h1bmsgPSBzY3RwX2lucV9wb3AoaW5xdWV1ZSkpKSB7CisJCXN1YnR5cGUgPSBTQ1RQX1NUX0NIVU5LKGNodW5rLT5jaHVua19oZHItPnR5cGUpOworCisJCS8qIFdlIG1pZ2h0IGhhdmUgZ3Jvd24gYW4gYXNzb2NpYXRpb24gc2luY2UgbGFzdCB3ZQorCQkgKiBsb29rZWQsIHNvIHRyeSBhZ2Fpbi4KKwkJICoKKwkJICogVGhpcyBoYXBwZW5zIHdoZW4gd2UndmUganVzdCBwcm9jZXNzZWQgb3VyCisJCSAqIENPT0tJRS1FQ0hPIGNodW5rLgorCQkgKi8KKwkJaWYgKE5VTEwgPT0gY2h1bmstPmFzb2MpIHsKKwkJCWFzb2MgPSBzY3RwX2VuZHBvaW50X2xvb2t1cF9hc3NvYyhlcCwKKwkJCQkJCQkgIHNjdHBfc291cmNlKGNodW5rKSwKKwkJCQkJCQkgICZ0cmFuc3BvcnQpOworCQkJY2h1bmstPmFzb2MgPSBhc29jOworCQkJY2h1bmstPnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKwkJfQorCisJCXN0YXRlID0gYXNvYyA/IGFzb2MtPnN0YXRlIDogU0NUUF9TVEFURV9DTE9TRUQ7CisKKwkJLyogUmVtZW1iZXIgd2hlcmUgdGhlIGxhc3QgREFUQSBjaHVuayBjYW1lIGZyb20gc28gd2UKKwkJICoga25vdyB3aGVyZSB0byBzZW5kIHRoZSBTQUNLLgorCQkgKi8KKwkJaWYgKGFzb2MgJiYgc2N0cF9jaHVua19pc19kYXRhKGNodW5rKSkKKwkJCWFzb2MtPnBlZXIubGFzdF9kYXRhX2Zyb20gPSBjaHVuay0+dHJhbnNwb3J0OworCQllbHNlCisJCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9JTkNUUkxDSFVOS1MpOworCisJCWlmIChjaHVuay0+dHJhbnNwb3J0KQorCQkJY2h1bmstPnRyYW5zcG9ydC0+bGFzdF90aW1lX2hlYXJkID0gamlmZmllczsKKworCQllcnJvciA9IHNjdHBfZG9fc20oU0NUUF9FVkVOVF9UX0NIVU5LLCBzdWJ0eXBlLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXAsIGFzb2MsIGNodW5rLCBHRlBfQVRPTUlDKTsKKworCQlpZiAoZXJyb3IgJiYgY2h1bmspCisJCQljaHVuay0+cGRpc2NhcmQgPSAxOworCisJCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgZW5kcG9pbnQgaXMgZnJlZWQgaW4gcmVzcG9uc2UgdG8KKwkJICogdGhlIGluY29taW5nIGNodW5rLiBJZiBzbywgZ2V0IG91dCBvZiB0aGUgd2hpbGUgbG9vcC4KKwkJICovCisJCWlmICghc2N0cF9zayhzayktPmVwKQorCQkJYnJlYWs7CisJfQorfQpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvaW5wdXQuYyBiL25ldC9zY3RwL2lucHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcxOWE3NwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY3RwL2lucHV0LmMKQEAgLTAsMCArMSw5MTMgQEAKKy8qIFNDVFAga2VybmVsIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgQ2lzY28sIEluYy4KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIE1vdG9yb2xhLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMyBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzLCBDb3JwLgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTm9raWEsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBMYSBNb250ZSBILlAuIFlhcnJvbGwKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgU0NUUCBrZXJuZWwgcmVmZXJlbmNlIEltcGxlbWVudGF0aW9uCisgKgorICogVGhlc2UgZnVuY3Rpb25zIGhhbmRsZSBhbGwgaW5wdXQgZnJvbSB0aGUgSVAgbGF5ZXIgaW50byBTQ1RQLgorICoKKyAqIFRoZSBTQ1RQIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoZSBTQ1RQIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0CisgKiB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAqICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogUGxlYXNlIHNlbmQgYW55IGJ1ZyByZXBvcnRzIG9yIGZpeGVzIHlvdSBtYWtlIHRvIHRoZQorICogZW1haWwgYWRkcmVzcyhlcyk6CisgKiAgICBsa3NjdHAgZGV2ZWxvcGVycyA8bGtzY3RwLWRldmVsb3BlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIE9yIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHdlYnNpdGU6CisgKiAgICBodHRwOi8vd3d3LnNmLm5ldC9wcm9qZWN0cy9sa3NjdHAKKyAqCisgKiBXcml0dGVuIG9yIG1vZGlmaWVkIGJ5OgorICogICAgTGEgTW9udGUgSC5QLiBZYXJyb2xsIDxwaWdneUBhY20ub3JnPgorICogICAgS2FybCBLbnV0c29uIDxrYXJsQGF0aGVuYS5jaGljYWdvLmlsLnVzPgorICogICAgWGluZ2FuZyBHdW8gPHhpbmdhbmcuZ3VvQGludGVsLmNvbT4KKyAqICAgIEpvbiBHcmltbSA8amdyaW1tQHVzLmlibS5jb20+CisgKiAgICBIdWkgSHVhbmcgPGh1aS5odWFuZ0Bub2tpYS5jb20+CisgKiAgICBEYWlzeSBDaGFuZyA8ZGFpc3ljQHVzLmlibS5jb20+CisgKiAgICBTcmlkaGFyIFNhbXVkcmFsYSA8c3JpQHVzLmlibS5jb20+CisgKiAgICBBcmRlbGxlIEZhbiA8YXJkZWxsZS5mYW5AaW50ZWwuY29tPgorICoKKyAqIEFueSBidWdzIHJlcG9ydGVkIGdpdmVuIHRvIHVzIHdlIHdpbGwgdHJ5IHRvIGZpeC4uLiBhbnkgZml4ZXMgc2hhcmVkIHdpbGwKKyAqIGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBuZXh0IFNDVFAgcmVsZWFzZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+IC8qIEZvciBzdHJ1Y3QgbGlzdF9oZWFkICovCisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+IC8qIEZvciBzdHJ1Y3QgdGltZXZhbCAqLworI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9pY21wLmg+CisjaW5jbHVkZSA8bmV0L3NubXAuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC94ZnJtLmg+CisjaW5jbHVkZSA8bmV0L3NjdHAvc2N0cC5oPgorI2luY2x1ZGUgPG5ldC9zY3RwL3NtLmg+CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBpbnRlcm5hbCBoZWxwZXJzLiAqLworc3RhdGljIGludCBzY3RwX3Jjdl9vb3RiKHN0cnVjdCBza19idWZmICopOworc3RhdGljIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICpfX3NjdHBfcmN2X2xvb2t1cChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgIGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqbGFkZHIsCisJCQkJICAgICAgY29uc3QgdW5pb24gc2N0cF9hZGRyICpwYWRkciwKKwkJCQkgICAgICBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKip0cmFuc3BvcnRwKTsKK3N0YXRpYyBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqX19zY3RwX3Jjdl9sb29rdXBfZW5kcG9pbnQoY29uc3QgdW5pb24gc2N0cF9hZGRyICpsYWRkcik7CitzdGF0aWMgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKl9fc2N0cF9sb29rdXBfYXNzb2NpYXRpb24oCisJCQkJCWNvbnN0IHVuaW9uIHNjdHBfYWRkciAqbG9jYWwsCisJCQkJCWNvbnN0IHVuaW9uIHNjdHBfYWRkciAqcGVlciwKKwkJCQkJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICoqcHQpOworCisKKy8qIENhbGN1bGF0ZSB0aGUgU0NUUCBjaGVja3N1bSBvZiBhbiBTQ1RQIHBhY2tldC4gICovCitzdGF0aWMgaW5saW5lIGludCBzY3RwX3Jjdl9jaGVja3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBzY3RwaGRyICpzaDsKKwlfX3UzMiBjbXAsIHZhbDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbGlzdCA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0OworCisJc2ggPSAoc3RydWN0IHNjdHBoZHIgKikgc2tiLT5oLnJhdzsKKwljbXAgPSBudG9obChzaC0+Y2hlY2tzdW0pOworCisJdmFsID0gc2N0cF9zdGFydF9ja3N1bSgoX191OCAqKXNoLCBza2JfaGVhZGxlbihza2IpKTsKKworCWZvciAoOyBsaXN0OyBsaXN0ID0gbGlzdC0+bmV4dCkKKwkJdmFsID0gc2N0cF91cGRhdGVfY2tzdW0oKF9fdTggKilsaXN0LT5kYXRhLCBza2JfaGVhZGxlbihsaXN0KSwKKwkJCQkJdmFsKTsKKworCXZhbCA9IHNjdHBfZW5kX2Nrc3VtKHZhbCk7CisKKwlpZiAodmFsICE9IGNtcCkgeworCQkvKiBDUkMgZmFpbHVyZSwgZHVtcCBpdC4gKi8KKwkJU0NUUF9JTkNfU1RBVFNfQkgoU0NUUF9NSUJfQ0hFQ0tTVU1FUlJPUlMpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCisvKiBUaGUgZnJlZSByb3V0aW5lIGZvciBza2J1ZmZzIHRoYXQgc2N0cCByZWNlaXZlcyAqLworc3RhdGljIHZvaWQgc2N0cF9yZnJlZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWF0b21pY19zdWIoc2l6ZW9mKHN0cnVjdCBzY3RwX2NodW5rKSwmc2tiLT5zay0+c2tfcm1lbV9hbGxvYyk7CisJc29ja19yZnJlZShza2IpOworfQorCisvKiBUaGUgb3duZXJzaGlwIHdyYXBwZXIgcm91dGluZSB0byBkbyByZWNlaXZlIGJ1ZmZlciBhY2NvdW50aW5nICovCitzdGF0aWMgdm9pZCBzY3RwX3Jjdl9zZXRfb3duZXJfcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc29jayAqc2spCit7CisJc2tiX3NldF9vd25lcl9yKHNrYixzayk7CisJc2tiLT5kZXN0cnVjdG9yID0gc2N0cF9yZnJlZTsKKwlhdG9taWNfYWRkKHNpemVvZihzdHJ1Y3Qgc2N0cF9jaHVuayksJnNrLT5za19ybWVtX2FsbG9jKTsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIHJvdXRpbmUgd2hpY2ggSVAgY2FsbHMgd2hlbiByZWNlaXZpbmcgYW4gU0NUUCBwYWNrZXQuCisgKi8KK2ludCBzY3RwX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKKwlzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAgPSBOVUxMOworCXN0cnVjdCBzY3RwX2VwX2NvbW1vbiAqcmN2cjsKKwlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rOworCXN0cnVjdCBzY3RwaGRyICpzaDsKKwl1bmlvbiBzY3RwX2FkZHIgc3JjOworCXVuaW9uIHNjdHBfYWRkciBkZXN0OworCWludCBmYW1pbHk7CisJc3RydWN0IHNjdHBfYWYgKmFmOworCWludCByZXQgPSAwOworCisJaWYgKHNrYi0+cGt0X3R5cGUhPVBBQ0tFVF9IT1NUKQorCQlnb3RvIGRpc2NhcmRfaXQ7CisKKwlTQ1RQX0lOQ19TVEFUU19CSChTQ1RQX01JQl9JTlNDVFBQQUNLUyk7CisKKwlzaCA9IChzdHJ1Y3Qgc2N0cGhkciAqKSBza2ItPmgucmF3OworCisJLyogUHVsbCB1cCB0aGUgSVAgYW5kIFNDVFAgaGVhZGVycy4gKi8KKwlfX3NrYl9wdWxsKHNrYiwgc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSk7CisJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBzY3RwaGRyKSkKKwkJZ290byBkaXNjYXJkX2l0OworCWlmIChzY3RwX3Jjdl9jaGVja3N1bShza2IpIDwgMCkKKwkJZ290byBkaXNjYXJkX2l0OworCisJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHNjdHBoZHIpKTsKKworCS8qIE1ha2Ugc3VyZSB3ZSBhdCBsZWFzdCBoYXZlIGNodW5rIGhlYWRlcnMgd29ydGggb2YgZGF0YSBsZWZ0LiAqLworCWlmIChza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3Qgc2N0cF9jaHVua2hkcikpCisJCWdvdG8gZGlzY2FyZF9pdDsKKworCWZhbWlseSA9IGlwdmVyMmFmKHNrYi0+bmguaXBoLT52ZXJzaW9uKTsKKwlhZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKGZhbWlseSk7CisJaWYgKHVubGlrZWx5KCFhZikpCisJCWdvdG8gZGlzY2FyZF9pdDsKKworCS8qIEluaXRpYWxpemUgbG9jYWwgYWRkcmVzc2VzIGZvciBsb29rdXBzLiAqLworCWFmLT5mcm9tX3NrYigmc3JjLCBza2IsIDEpOworCWFmLT5mcm9tX3NrYigmZGVzdCwgc2tiLCAwKTsKKworCS8qIElmIHRoZSBwYWNrZXQgaXMgdG8gb3IgZnJvbSBhIG5vbi11bmljYXN0IGFkZHJlc3MsCisJICogc2lsZW50bHkgZGlzY2FyZCB0aGUgcGFja2V0LgorCSAqCisJICogVGhpcyBpcyBub3QgY2xlYXJseSBkZWZpbmVkIGluIHRoZSBSRkMgZXhjZXB0IGluIHNlY3Rpb24KKwkgKiA4LjQgLSBPT1RCIGhhbmRsaW5nLiAgSG93ZXZlciwgYmFzZWQgb24gdGhlIGJvb2sgIlN0cmVhbSBDb250cm9sCisJICogVHJhbnNtaXNzaW9uIFByb3RvY29sIiAyLjEsICJJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoZQorCSAqIElQIGFkZHJlc3Mgb2YgYW4gU0NUUCB0cmFuc3BvcnQgYWRkcmVzcyBtdXN0IGJlIGEgcm91dGFibGUKKwkgKiB1bmljYXN0IGFkZHJlc3MuICBJbiBvdGhlciB3b3JkcywgSVAgbXVsdGljYXN0IGFkZHJlc3NlcyBhbmQKKwkgKiBJUCBicm9hZGNhc3QgYWRkcmVzc2VzIGNhbm5vdCBiZSB1c2VkIGluIGFuIFNDVFAgdHJhbnNwb3J0CisJICogYWRkcmVzcy4iCisJICovCisJaWYgKCFhZi0+YWRkcl92YWxpZCgmc3JjLCBOVUxMKSB8fCAhYWYtPmFkZHJfdmFsaWQoJmRlc3QsIE5VTEwpKQorCQlnb3RvIGRpc2NhcmRfaXQ7CisKKwlhc29jID0gX19zY3RwX3Jjdl9sb29rdXAoc2tiLCAmc3JjLCAmZGVzdCwgJnRyYW5zcG9ydCk7CisKKwkvKgorCSAqIFJGQyAyOTYwLCA4LjQgLSBIYW5kbGUgIk91dCBvZiB0aGUgYmx1ZSIgUGFja2V0cy4KKwkgKiBBbiBTQ1RQIHBhY2tldCBpcyBjYWxsZWQgYW4gIm91dCBvZiB0aGUgYmx1ZSIgKE9PVEIpCisJICogcGFja2V0IGlmIGl0IGlzIGNvcnJlY3RseSBmb3JtZWQsIGkuZS4sIHBhc3NlZCB0aGUKKwkgKiByZWNlaXZlcidzIGNoZWNrc3VtIGNoZWNrLCBidXQgdGhlIHJlY2VpdmVyIGlzIG5vdAorCSAqIGFibGUgdG8gaWRlbnRpZnkgdGhlIGFzc29jaWF0aW9uIHRvIHdoaWNoIHRoaXMKKwkgKiBwYWNrZXQgYmVsb25ncy4KKwkgKi8KKwlpZiAoIWFzb2MpIHsKKwkJZXAgPSBfX3NjdHBfcmN2X2xvb2t1cF9lbmRwb2ludCgmZGVzdCk7CisJCWlmIChzY3RwX3Jjdl9vb3RiKHNrYikpIHsKKwkJCVNDVFBfSU5DX1NUQVRTX0JIKFNDVFBfTUlCX09VVE9GQkxVRVMpOworCQkJZ290byBkaXNjYXJkX3JlbGVhc2U7CisJCX0KKwl9CisKKwkvKiBSZXRyaWV2ZSB0aGUgY29tbW9uIGlucHV0IGhhbmRsaW5nIHN1YnN0cnVjdHVyZS4gKi8KKwlyY3ZyID0gYXNvYyA/ICZhc29jLT5iYXNlIDogJmVwLT5iYXNlOworCXNrID0gcmN2ci0+c2s7CisKKwlpZiAoKHNrKSAmJiAoYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSA+PSBzay0+c2tfcmN2YnVmKSkgeworCQlnb3RvIGRpc2NhcmRfcmVsZWFzZTsKKwl9CisKKworCS8qIFNDVFAgc2VlbXMgdG8gYWx3YXlzIG5lZWQgYSB0aW1lc3RhbXAgcmlnaHQgbm93IChGSVhNRSkgKi8KKwlpZiAoc2tiLT5zdGFtcC50dl9zZWMgPT0gMCkgeworCQlkb19nZXR0aW1lb2ZkYXkoJnNrYi0+c3RhbXApOworCQlzb2NrX2VuYWJsZV90aW1lc3RhbXAoc2spOyAKKwl9CisKKwlpZiAoIXhmcm1fcG9saWN5X2NoZWNrKHNrLCBYRlJNX1BPTElDWV9JTiwgc2tiLCBmYW1pbHkpKQorCQlnb3RvIGRpc2NhcmRfcmVsZWFzZTsKKworCXJldCA9IHNrX2ZpbHRlcihzaywgc2tiLCAxKTsKKwlpZiAocmV0KQorICAgICAgICAgICAgICAgIGdvdG8gZGlzY2FyZF9yZWxlYXNlOworCisJLyogQ3JlYXRlIGFuIFNDVFAgcGFja2V0IHN0cnVjdHVyZS4gKi8KKwljaHVuayA9IHNjdHBfY2h1bmtpZnkoc2tiLCBhc29jLCBzayk7CisJaWYgKCFjaHVuaykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGRpc2NhcmRfcmVsZWFzZTsKKwl9CisKKwlzY3RwX3Jjdl9zZXRfb3duZXJfcihza2Isc2spOworCisJLyogUmVtZW1iZXIgd2hhdCBlbmRwb2ludCBpcyB0byBoYW5kbGUgdGhpcyBwYWNrZXQuICovCisJY2h1bmstPnJjdnIgPSByY3ZyOworCisJLyogUmVtZW1iZXIgdGhlIFNDVFAgaGVhZGVyLiAqLworCWNodW5rLT5zY3RwX2hkciA9IHNoOworCisJLyogU2V0IHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3NlcyBvZiB0aGUgaW5jb21pbmcgY2h1bmsuICAqLworCXNjdHBfaW5pdF9hZGRycyhjaHVuaywgJnNyYywgJmRlc3QpOworCisJLyogUmVtZW1iZXIgd2hlcmUgd2UgY2FtZSBmcm9tLiAgKi8KKwljaHVuay0+dHJhbnNwb3J0ID0gdHJhbnNwb3J0OworCisJLyogQWNxdWlyZSBhY2Nlc3MgdG8gdGhlIHNvY2sgbG9jay4gTm90ZTogV2UgYXJlIHNhZmUgZnJvbSBvdGhlcgorCSAqIGJvdHRvbSBoYWx2ZXMgb24gdGhpcyBsb2NrLCBidXQgYSB1c2VyIG1heSBiZSBpbiB0aGUgbG9jayB0b28sCisJICogc28gY2hlY2sgaWYgaXQgaXMgYnVzeS4KKwkgKi8KKwlzY3RwX2JoX2xvY2tfc29jayhzayk7CisKKwlpZiAoc29ja19vd25lZF9ieV91c2VyKHNrKSkKKwkJc2tfYWRkX2JhY2tsb2coc2ssIChzdHJ1Y3Qgc2tfYnVmZiAqKSBjaHVuayk7CisJZWxzZQorCQlzY3RwX2JhY2tsb2dfcmN2KHNrLCAoc3RydWN0IHNrX2J1ZmYgKikgY2h1bmspOworCisJLyogUmVsZWFzZSB0aGUgc29jayBhbmQgYW55IHJlZmVyZW5jZSBjb3VudHMgd2UgdG9vayBpbiB0aGUKKwkgKiBsb29rdXAgY2FsbHMuCisJICovCisJc2N0cF9iaF91bmxvY2tfc29jayhzayk7CisJaWYgKGFzb2MpCisJCXNjdHBfYXNzb2NpYXRpb25fcHV0KGFzb2MpOworCWVsc2UKKwkJc2N0cF9lbmRwb2ludF9wdXQoZXApOworCXNvY2tfcHV0KHNrKTsKKwlyZXR1cm4gcmV0OworCitkaXNjYXJkX2l0OgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiByZXQ7CisKK2Rpc2NhcmRfcmVsZWFzZToKKwkvKiBSZWxlYXNlIGFueSBzdHJ1Y3R1cmVzIHdlIG1heSBiZSBob2xkaW5nLiAqLworCWlmIChhc29jKSB7CisJCXNvY2tfcHV0KGFzb2MtPmJhc2Uuc2spOworCQlzY3RwX2Fzc29jaWF0aW9uX3B1dChhc29jKTsKKwl9IGVsc2UgeworCQlzb2NrX3B1dChlcC0+YmFzZS5zayk7CisJCXNjdHBfZW5kcG9pbnRfcHV0KGVwKTsKKwl9CisKKwlnb3RvIGRpc2NhcmRfaXQ7Cit9CisKKy8qIEhhbmRsZSBzZWNvbmQgaGFsZiBvZiBpbmJvdW5kIHNrYiBwcm9jZXNzaW5nLiAgSWYgdGhlIHNvY2sgd2FzIGJ1c3ksCisgKiB3ZSBtYXkgaGF2ZSBuZWVkIHRvIGRlbGF5IHByb2Nlc3NpbmcgdW50aWwgbGF0ZXIgd2hlbiB0aGUgc29jayBpcworICogcmVsZWFzZWQgKG9uIHRoZSBiYWNrbG9nKS4gICBJZiBub3QgYnVzeSwgd2UgY2FsbCB0aGlzIHJvdXRpbmUKKyAqIGRpcmVjdGx5IGZyb20gdGhlIGJvdHRvbSBoYWxmLgorICovCitpbnQgc2N0cF9iYWNrbG9nX3JjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rOworCXN0cnVjdCBzY3RwX2lucSAqaW5xdWV1ZTsKKworCS8qIE9uZSBkYXkgY2h1bmsgd2lsbCBsaXZlIGluc2lkZSB0aGUgc2tiLCBidXQgZm9yCisJICogbm93IHRoaXMgd29ya3MuCisJICovCisJY2h1bmsgPSAoc3RydWN0IHNjdHBfY2h1bmsgKikgc2tiOworCWlucXVldWUgPSAmY2h1bmstPnJjdnItPmlucXVldWU7CisKKwlzY3RwX2lucV9wdXNoKGlucXVldWUsIGNodW5rKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qIEhhbmRsZSBpY21wIGZyYWcgbmVlZGVkIGVycm9yLiAqLwordm9pZCBzY3RwX2ljbXBfZnJhZ19uZWVkZWQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCSAgIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdCwgX191MzIgcG10dSkKK3sKKwlpZiAodW5saWtlbHkocG10dSA8IFNDVFBfREVGQVVMVF9NSU5TRUdNRU5UKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVwb3J0ZWQgcG10dSAlZCB0b28gbG93LCAiCisJCSAgICAgICAidXNpbmcgZGVmYXVsdCBtaW5pbXVtIG9mICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBtdHUsCisJCSAgICAgICBTQ1RQX0RFRkFVTFRfTUlOU0VHTUVOVCk7CisJCXBtdHUgPSBTQ1RQX0RFRkFVTFRfTUlOU0VHTUVOVDsKKwl9CisKKwlpZiAoIXNvY2tfb3duZWRfYnlfdXNlcihzaykgJiYgdCAmJiAodC0+cG10dSAhPSBwbXR1KSkgeworCQl0LT5wbXR1ID0gcG10dTsKKwkJc2N0cF9hc3NvY19zeW5jX3BtdHUoYXNvYyk7CisJCXNjdHBfcmV0cmFuc21pdCgmYXNvYy0+b3V0cXVldWUsIHQsIFNDVFBfUlRYUl9QTVRVRCk7CisJfQorfQorCisvKgorICogU0NUUCBJbXBsZW1lbnRlcidzIEd1aWRlLCAyLjM3IElDTVAgaGFuZGxpbmcgcHJvY2VkdXJlcworICoKKyAqIElDTVA4KSBJZiB0aGUgSUNNUCBjb2RlIGlzIGEgIlVucmVjb2duaXplZCBuZXh0IGhlYWRlciB0eXBlIGVuY291bnRlcmVkIgorICogICAgICAgIG9yIGEgIlByb3RvY29sIFVucmVhY2hhYmxlIiB0cmVhdCB0aGlzIG1lc3NhZ2UgYXMgYW4gYWJvcnQKKyAqICAgICAgICB3aXRoIHRoZSBUIGJpdCBzZXQuCisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBhbiBldmVudCB0byB0aGUgc3RhdGUgbWFjaGluZSwgd2hpY2ggd2lsbCBhYm9ydCB0aGUKKyAqIGFzc29jaWF0aW9uLgorICoKKyAqLwordm9pZCBzY3RwX2ljbXBfcHJvdG9fdW5yZWFjaGFibGUoc3RydWN0IHNvY2sgKnNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnQpCit7CisJU0NUUF9ERUJVR19QUklOVEsoIiVzXG4iLCAgX19GVU5DVElPTl9fKTsKKworCXNjdHBfZG9fc20oU0NUUF9FVkVOVF9UX09USEVSLAorCQkgICBTQ1RQX1NUX09USEVSKFNDVFBfRVZFTlRfSUNNUF9QUk9UT19VTlJFQUNIKSwKKwkJICAgYXNvYy0+c3RhdGUsIGFzb2MtPmVwLCBhc29jLCBOVUxMLAorCQkgICBHRlBfQVRPTUlDKTsKKworfQorCisvKiBDb21tb24gbG9va3VwIGNvZGUgZm9yIGljbXAvaWNtcHY2IGVycm9yIGhhbmRsZXIuICovCitzdHJ1Y3Qgc29jayAqc2N0cF9lcnJfbG9va3VwKGludCBmYW1pbHksIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgIHN0cnVjdCBzY3RwaGRyICpzY3RwaGRyLAorCQkJICAgICBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqKmVwcCwKKwkJCSAgICAgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiphcHAsCisJCQkgICAgIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqKnRwcCkKK3sKKwl1bmlvbiBzY3RwX2FkZHIgc2FkZHI7CisJdW5pb24gc2N0cF9hZGRyIGRhZGRyOworCXN0cnVjdCBzY3RwX2FmICphZjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBOVUxMOworCXN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCA9IE5VTEw7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MgPSBOVUxMOworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKworCSphcHAgPSBOVUxMOyAqZXBwID0gTlVMTDsgKnRwcCA9IE5VTEw7CisKKwlhZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKGZhbWlseSk7CisJaWYgKHVubGlrZWx5KCFhZikpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogSW5pdGlhbGl6ZSBsb2NhbCBhZGRyZXNzZXMgZm9yIGxvb2t1cHMuICovCisJYWYtPmZyb21fc2tiKCZzYWRkciwgc2tiLCAxKTsKKwlhZi0+ZnJvbV9za2IoJmRhZGRyLCBza2IsIDApOworCisJLyogTG9vayBmb3IgYW4gYXNzb2NpYXRpb24gdGhhdCBtYXRjaGVzIHRoZSBpbmNvbWluZyBJQ01QIGVycm9yCisJICogcGFja2V0LgorCSAqLworCWFzb2MgPSBfX3NjdHBfbG9va3VwX2Fzc29jaWF0aW9uKCZzYWRkciwgJmRhZGRyLCAmdHJhbnNwb3J0KTsKKwlpZiAoIWFzb2MpIHsKKwkJLyogSWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgYXNzb2NpYXRpb24sIHNlZSBpZiBpdCBtYXRjaGVzIGFueQorCQkgKiBlbmRwb2ludC4gVGhpcyBtYXkgaGFwcGVuIGZvciBhbiBJQ01QIGVycm9yIGdlbmVyYXRlZCBpbgorCQkgKiByZXNwb25zZSB0byBhbiBJTklUX0FDSy4KKwkJICovCisJCWVwID0gX19zY3RwX3Jjdl9sb29rdXBfZW5kcG9pbnQoJmRhZGRyKTsKKwkJaWYgKCFlcCkgeworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwlpZiAoYXNvYykgeworCQlzayA9IGFzb2MtPmJhc2Uuc2s7CisKKwkJaWYgKG50b2hsKHNjdHBoZHItPnZ0YWcpICE9IGFzb2MtPmMucGVlcl92dGFnKSB7CisJCQlJQ01QX0lOQ19TVEFUU19CSChJQ01QX01JQl9JTkVSUk9SUyk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZQorCQlzayA9IGVwLT5iYXNlLnNrOworCisJc2N0cF9iaF9sb2NrX3NvY2soc2spOworCisJLyogSWYgdG9vIG1hbnkgSUNNUHMgZ2V0IGRyb3BwZWQgb24gYnVzeQorCSAqIHNlcnZlcnMgdGhpcyBuZWVkcyB0byBiZSBzb2x2ZWQgZGlmZmVyZW50bHkuCisJICovCisJaWYgKHNvY2tfb3duZWRfYnlfdXNlcihzaykpCisJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX0xPQ0tEUk9QUEVESUNNUFMpOworCisJKmVwcCA9IGVwOworCSphcHAgPSBhc29jOworCSp0cHAgPSB0cmFuc3BvcnQ7CisJcmV0dXJuIHNrOworCitvdXQ6CisJc29ja19wdXQoc2spOworCWlmIChhc29jKQorCQlzY3RwX2Fzc29jaWF0aW9uX3B1dChhc29jKTsKKwlpZiAoZXApCisJCXNjdHBfZW5kcG9pbnRfcHV0KGVwKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogQ29tbW9uIGNsZWFudXAgY29kZSBmb3IgaWNtcC9pY21wdjYgZXJyb3IgaGFuZGxlci4gKi8KK3ZvaWQgc2N0cF9lcnJfZmluaXNoKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkgICAgIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKQoreworCXNjdHBfYmhfdW5sb2NrX3NvY2soc2spOworCXNvY2tfcHV0KHNrKTsKKwlpZiAoYXNvYykKKwkJc2N0cF9hc3NvY2lhdGlvbl9wdXQoYXNvYyk7CisJaWYgKGVwKQorCQlzY3RwX2VuZHBvaW50X3B1dChlcCk7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBJQ01QIG1vZHVsZSB3aGVuIGl0IGdldHMgc29tZQorICogc29ydCBvZiBlcnJvciBjb25kaXRpb24uICBJZiBlcnIgPCAwIHRoZW4gdGhlIHNvY2tldCBzaG91bGQKKyAqIGJlIGNsb3NlZCBhbmQgdGhlIGVycm9yIHJldHVybmVkIHRvIHRoZSB1c2VyLiAgSWYgZXJyID4gMAorICogaXQncyBqdXN0IHRoZSBpY21wIHR5cGUgPDwgOCB8IGljbXAgY29kZS4gIEFmdGVyIGFkanVzdG1lbnQKKyAqIGhlYWRlciBwb2ludHMgdG8gdGhlIGZpcnN0IDggYnl0ZXMgb2YgdGhlIHNjdHAgaGVhZGVyLiAgV2UgbmVlZAorICogdG8gZmluZCB0aGUgYXBwcm9wcmlhdGUgcG9ydC4KKyAqCisgKiBUaGUgbG9ja2luZyBzdHJhdGVneSB1c2VkIGhlcmUgaXMgdmVyeSAib3B0aW1pc3RpYyIuIFdoZW4KKyAqIHNvbWVvbmUgZWxzZSBhY2Nlc3NlcyB0aGUgc29ja2V0IHRoZSBJQ01QIGlzIGp1c3QgZHJvcHBlZAorICogYW5kIGZvciBzb21lIHBhdGhzIHRoZXJlIGlzIG5vIGNoZWNrIGF0IGFsbC4KKyAqIEEgbW9yZSBnZW5lcmFsIGVycm9yIHF1ZXVlIHRvIHF1ZXVlIGVycm9ycyBmb3IgbGF0ZXIgaGFuZGxpbmcKKyAqIGlzIHByb2JhYmx5IGJldHRlci4KKyAqCisgKi8KK3ZvaWQgc2N0cF92NF9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgX191MzIgaW5mbykKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IChzdHJ1Y3QgaXBoZHIgKilza2ItPmRhdGE7CisJc3RydWN0IHNjdHBoZHIgKnNoID0gKHN0cnVjdCBzY3RwaGRyICopKHNrYi0+ZGF0YSArIChpcGgtPmlobCA8PDIpKTsKKwlpbnQgdHlwZSA9IHNrYi0+aC5pY21waC0+dHlwZTsKKwlpbnQgY29kZSA9IHNrYi0+aC5pY21waC0+Y29kZTsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwOworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0OworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQ7CisJY2hhciAqc2F2ZWlwLCAqc2F2ZXNjdHA7CisJaW50IGVycjsKKworCWlmIChza2ItPmxlbiA8ICgoaXBoLT5paGwgPDwgMikgKyA4KSkgeworCQlJQ01QX0lOQ19TVEFUU19CSChJQ01QX01JQl9JTkVSUk9SUyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBGaXggdXAgc2tiIHRvIGxvb2sgYXQgdGhlIGVtYmVkZGVkIG5ldCBoZWFkZXIuICovCisJc2F2ZWlwID0gc2tiLT5uaC5yYXc7CisJc2F2ZXNjdHAgID0gc2tiLT5oLnJhdzsKKwlza2ItPm5oLmlwaCA9IGlwaDsKKwlza2ItPmgucmF3ID0gKGNoYXIgKilzaDsKKwlzayA9IHNjdHBfZXJyX2xvb2t1cChBRl9JTkVULCBza2IsIHNoLCAmZXAsICZhc29jLCAmdHJhbnNwb3J0KTsKKwkvKiBQdXQgYmFjaywgdGhlIG9yaWdpbmFsIHBvaW50ZXJzLiAqLworCXNrYi0+bmgucmF3ID0gc2F2ZWlwOworCXNrYi0+aC5yYXcgPSBzYXZlc2N0cDsKKwlpZiAoIXNrKSB7CisJCUlDTVBfSU5DX1NUQVRTX0JIKElDTVBfTUlCX0lORVJST1JTKTsKKwkJcmV0dXJuOworCX0KKwkvKiBXYXJuaW5nOiAgVGhlIHNvY2sgbG9jayBpcyBoZWxkLiAgUmVtZW1iZXIgdG8gY2FsbAorCSAqIHNjdHBfZXJyX2ZpbmlzaCEKKwkgKi8KKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSUNNUF9QQVJBTUVURVJQUk9COgorCQllcnIgPSBFUFJPVE87CisJCWJyZWFrOworCWNhc2UgSUNNUF9ERVNUX1VOUkVBQ0g6CisJCWlmIChjb2RlID4gTlJfSUNNUF9VTlJFQUNIKQorCQkJZ290byBvdXRfdW5sb2NrOworCisJCS8qIFBNVFUgZGlzY292ZXJ5IChSRkMxMTkxKSAqLworCQlpZiAoSUNNUF9GUkFHX05FRURFRCA9PSBjb2RlKSB7CisJCQlzY3RwX2ljbXBfZnJhZ19uZWVkZWQoc2ssIGFzb2MsIHRyYW5zcG9ydCwgaW5mbyk7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKwkJZWxzZSB7CisJCQlpZiAoSUNNUF9QUk9UX1VOUkVBQ0ggPT0gY29kZSkgeworCQkJCXNjdHBfaWNtcF9wcm90b191bnJlYWNoYWJsZShzaywgZXAsIGFzb2MsCisJCQkJCQkJICAgIHRyYW5zcG9ydCk7CisJCQkJZ290byBvdXRfdW5sb2NrOworCQkJfQorCQl9CisJCWVyciA9IGljbXBfZXJyX2NvbnZlcnRbY29kZV0uZXJybm87CisJCWJyZWFrOworCWNhc2UgSUNNUF9USU1FX0VYQ0VFREVEOgorCQkvKiBJZ25vcmUgYW55IHRpbWUgZXhjZWVkZWQgZXJyb3JzIGR1ZSB0byBmcmFnbWVudCByZWFzc2VtYmx5CisJCSAqIHRpbWVvdXRzLgorCQkgKi8KKwkJaWYgKElDTVBfRVhDX0ZSQUdUSU1FID09IGNvZGUpCisJCQlnb3RvIG91dF91bmxvY2s7CisKKwkJZXJyID0gRUhPU1RVTlJFQUNIOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJaW5ldCA9IGluZXRfc2soc2spOworCWlmICghc29ja19vd25lZF9ieV91c2VyKHNrKSAmJiBpbmV0LT5yZWN2ZXJyKSB7CisJCXNrLT5za19lcnIgPSBlcnI7CisJCXNrLT5za19lcnJvcl9yZXBvcnQoc2spOworCX0gZWxzZSB7ICAvKiBPbmx5IGFuIGVycm9yIG9uIHRpbWVvdXQgKi8KKwkJc2stPnNrX2Vycl9zb2Z0ID0gZXJyOworCX0KKworb3V0X3VubG9jazoKKwlzY3RwX2Vycl9maW5pc2goc2ssIGVwLCBhc29jKTsKK30KKworLyoKKyAqIFJGQyAyOTYwLCA4LjQgLSBIYW5kbGUgIk91dCBvZiB0aGUgYmx1ZSIgUGFja2V0cy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNjYW5zIGFsbCB0aGUgY2h1bmtzIGluIHRoZSBPT1RCIHBhY2tldCB0byBkZXRlcm1pbmUgaWYKKyAqIHRoZSBwYWNrZXQgc2hvdWxkIGJlIGRpc2NhcmRlZCByaWdodCBhd2F5LiAgSWYgYSByZXNwb25zZSBtaWdodCBiZSBuZWVkZWQKKyAqIGZvciB0aGlzIHBhY2tldCwgb3IsIGlmIGZ1cnRoZXIgcHJvY2Vzc2luZyBpcyBwb3NzaWJsZSwgdGhlIHBhY2tldCB3aWxsCisgKiBiZSBxdWV1ZWQgdG8gYSBwcm9wZXIgaW5xdWV1ZSBmb3IgdGhlIG5leHQgcGhhc2Ugb2YgaGFuZGxpbmcuCisgKgorICogT3V0cHV0OgorICogUmV0dXJuIDAgLSBJZiBmdXJ0aGVyIHByb2Nlc3NpbmcgaXMgbmVlZGVkLgorICogUmV0dXJuIDEgLSBJZiB0aGUgcGFja2V0IGNhbiBiZSBkaXNjYXJkZWQgcmlnaHQgYXdheS4KKyAqLworaW50IHNjdHBfcmN2X29vdGIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzY3RwX2NodW5raGRyX3QgKmNoOworCV9fdTggKmNoX2VuZDsKKwlzY3RwX2Vycmhkcl90ICplcnI7CisKKwljaCA9IChzY3RwX2NodW5raGRyX3QgKikgc2tiLT5kYXRhOworCWNoX2VuZCA9ICgoX191OCAqKSBjaCkgKyBXT1JEX1JPVU5EKG50b2hzKGNoLT5sZW5ndGgpKTsKKworCS8qIFNjYW4gdGhyb3VnaCBhbGwgdGhlIGNodW5rcyBpbiB0aGUgcGFja2V0LiAgKi8KKwl3aGlsZSAoY2hfZW5kID4gKF9fdTggKiljaCAmJiBjaF9lbmQgPCBza2ItPnRhaWwpIHsKKworCQkvKiBSRkMgOC40LCAyKSBJZiB0aGUgT09UQiBwYWNrZXQgY29udGFpbnMgYW4gQUJPUlQgY2h1bmssIHRoZQorCQkgKiByZWNlaXZlciBNVVNUIHNpbGVudGx5IGRpc2NhcmQgdGhlIE9PVEIgcGFja2V0IGFuZCB0YWtlIG5vCisJCSAqIGZ1cnRoZXIgYWN0aW9uLgorCQkgKi8KKwkJaWYgKFNDVFBfQ0lEX0FCT1JUID09IGNoLT50eXBlKQorCQkJZ290byBkaXNjYXJkOworCisJCS8qIFJGQyA4LjQsIDYpIElmIHRoZSBwYWNrZXQgY29udGFpbnMgYSBTSFVURE9XTiBDT01QTEVURQorCQkgKiBjaHVuaywgdGhlIHJlY2VpdmVyIHNob3VsZCBzaWxlbnRseSBkaXNjYXJkIHRoZSBwYWNrZXQKKwkJICogYW5kIHRha2Ugbm8gZnVydGhlciBhY3Rpb24uCisJCSAqLworCQlpZiAoU0NUUF9DSURfU0hVVERPV05fQ09NUExFVEUgPT0gY2gtPnR5cGUpCisJCQlnb3RvIGRpc2NhcmQ7CisKKwkJLyogUkZDIDguNCwgNykgSWYgdGhlIHBhY2tldCBjb250YWlucyBhICJTdGFsZSBjb29raWUiIEVSUk9SCisJCSAqIG9yIGEgQ09PS0lFIEFDSyB0aGUgU0NUUCBQYWNrZXQgc2hvdWxkIGJlIHNpbGVudGx5CisJCSAqIGRpc2NhcmRlZC4KKwkJICovCisJCWlmIChTQ1RQX0NJRF9DT09LSUVfQUNLID09IGNoLT50eXBlKQorCQkJZ290byBkaXNjYXJkOworCisJCWlmIChTQ1RQX0NJRF9FUlJPUiA9PSBjaC0+dHlwZSkgeworCQkJc2N0cF93YWxrX2Vycm9ycyhlcnIsIGNoKSB7CisJCQkJaWYgKFNDVFBfRVJST1JfU1RBTEVfQ09PS0lFID09IGVyci0+Y2F1c2UpCisJCQkJCWdvdG8gZGlzY2FyZDsKKwkJCX0KKwkJfQorCisJCWNoID0gKHNjdHBfY2h1bmtoZHJfdCAqKSBjaF9lbmQ7CisJICAgICAgICBjaF9lbmQgPSAoKF9fdTggKikgY2gpICsgV09SRF9ST1VORChudG9ocyhjaC0+bGVuZ3RoKSk7CisJfQorCisJcmV0dXJuIDA7CisKK2Rpc2NhcmQ6CisJcmV0dXJuIDE7Cit9CisKKy8qIEluc2VydCBlbmRwb2ludCBpbnRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KK3N0YXRpYyB2b2lkIF9fc2N0cF9oYXNoX2VuZHBvaW50KHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCkKK3sKKwlzdHJ1Y3Qgc2N0cF9lcF9jb21tb24gKiplcHA7CisJc3RydWN0IHNjdHBfZXBfY29tbW9uICplcGI7CisJc3RydWN0IHNjdHBfaGFzaGJ1Y2tldCAqaGVhZDsKKworCWVwYiA9ICZlcC0+YmFzZTsKKworCWVwYi0+aGFzaGVudCA9IHNjdHBfZXBfaGFzaGZuKGVwYi0+YmluZF9hZGRyLnBvcnQpOworCWhlYWQgPSAmc2N0cF9lcF9oYXNodGFibGVbZXBiLT5oYXNoZW50XTsKKworCXNjdHBfd3JpdGVfbG9jaygmaGVhZC0+bG9jayk7CisJZXBwID0gJmhlYWQtPmNoYWluOworCWVwYi0+bmV4dCA9ICplcHA7CisJaWYgKGVwYi0+bmV4dCkKKwkJKCplcHApLT5wcHJldiA9ICZlcGItPm5leHQ7CisJKmVwcCA9IGVwYjsKKwllcGItPnBwcmV2ID0gZXBwOworCXNjdHBfd3JpdGVfdW5sb2NrKCZoZWFkLT5sb2NrKTsKK30KKworLyogQWRkIGFuIGVuZHBvaW50IHRvIHRoZSBoYXNoLiBMb2NhbCBCSC1zYWZlLiAqLwordm9pZCBzY3RwX2hhc2hfZW5kcG9pbnQoc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwKQoreworCXNjdHBfbG9jYWxfYmhfZGlzYWJsZSgpOworCV9fc2N0cF9oYXNoX2VuZHBvaW50KGVwKTsKKwlzY3RwX2xvY2FsX2JoX2VuYWJsZSgpOworfQorCisvKiBSZW1vdmUgZW5kcG9pbnQgZnJvbSB0aGUgaGFzaCB0YWJsZS4gICovCitzdGF0aWMgdm9pZCBfX3NjdHBfdW5oYXNoX2VuZHBvaW50KHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCkKK3sKKwlzdHJ1Y3Qgc2N0cF9oYXNoYnVja2V0ICpoZWFkOworCXN0cnVjdCBzY3RwX2VwX2NvbW1vbiAqZXBiOworCisJZXBiID0gJmVwLT5iYXNlOworCisJZXBiLT5oYXNoZW50ID0gc2N0cF9lcF9oYXNoZm4oZXBiLT5iaW5kX2FkZHIucG9ydCk7CisKKwloZWFkID0gJnNjdHBfZXBfaGFzaHRhYmxlW2VwYi0+aGFzaGVudF07CisKKwlzY3RwX3dyaXRlX2xvY2soJmhlYWQtPmxvY2spOworCisJaWYgKGVwYi0+cHByZXYpIHsKKwkJaWYgKGVwYi0+bmV4dCkKKwkJCWVwYi0+bmV4dC0+cHByZXYgPSBlcGItPnBwcmV2OworCQkqZXBiLT5wcHJldiA9IGVwYi0+bmV4dDsKKwkJZXBiLT5wcHJldiA9IE5VTEw7CisJfQorCisJc2N0cF93cml0ZV91bmxvY2soJmhlYWQtPmxvY2spOworfQorCisvKiBSZW1vdmUgZW5kcG9pbnQgZnJvbSB0aGUgaGFzaC4gIExvY2FsIEJILXNhZmUuICovCit2b2lkIHNjdHBfdW5oYXNoX2VuZHBvaW50KHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCkKK3sKKwlzY3RwX2xvY2FsX2JoX2Rpc2FibGUoKTsKKwlfX3NjdHBfdW5oYXNoX2VuZHBvaW50KGVwKTsKKwlzY3RwX2xvY2FsX2JoX2VuYWJsZSgpOworfQorCisvKiBMb29rIHVwIGFuIGVuZHBvaW50LiAqLworc3RhdGljIHN0cnVjdCBzY3RwX2VuZHBvaW50ICpfX3NjdHBfcmN2X2xvb2t1cF9lbmRwb2ludChjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmxhZGRyKQoreworCXN0cnVjdCBzY3RwX2hhc2hidWNrZXQgKmhlYWQ7CisJc3RydWN0IHNjdHBfZXBfY29tbW9uICplcGI7CisJc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwOworCWludCBoYXNoOworCisJaGFzaCA9IHNjdHBfZXBfaGFzaGZuKGxhZGRyLT52NC5zaW5fcG9ydCk7CisJaGVhZCA9ICZzY3RwX2VwX2hhc2h0YWJsZVtoYXNoXTsKKwlyZWFkX2xvY2soJmhlYWQtPmxvY2spOworCWZvciAoZXBiID0gaGVhZC0+Y2hhaW47IGVwYjsgZXBiID0gZXBiLT5uZXh0KSB7CisJCWVwID0gc2N0cF9lcChlcGIpOworCQlpZiAoc2N0cF9lbmRwb2ludF9pc19tYXRjaChlcCwgbGFkZHIpKQorCQkJZ290byBoaXQ7CisJfQorCisJZXAgPSBzY3RwX3NrKChzY3RwX2dldF9jdGxfc29jaygpKSktPmVwOworCWVwYiA9ICZlcC0+YmFzZTsKKworaGl0OgorCXNjdHBfZW5kcG9pbnRfaG9sZChlcCk7CisJc29ja19ob2xkKGVwYi0+c2spOworCXJlYWRfdW5sb2NrKCZoZWFkLT5sb2NrKTsKKwlyZXR1cm4gZXA7Cit9CisKKy8qIEluc2VydCBhc3NvY2lhdGlvbiBpbnRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KK3N0YXRpYyB2b2lkIF9fc2N0cF9oYXNoX2VzdGFibGlzaGVkKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKQoreworCXN0cnVjdCBzY3RwX2VwX2NvbW1vbiAqKmVwcDsKKwlzdHJ1Y3Qgc2N0cF9lcF9jb21tb24gKmVwYjsKKwlzdHJ1Y3Qgc2N0cF9oYXNoYnVja2V0ICpoZWFkOworCisJZXBiID0gJmFzb2MtPmJhc2U7CisKKwkvKiBDYWxjdWxhdGUgd2hpY2ggY2hhaW4gdGhpcyBlbnRyeSB3aWxsIGJlbG9uZyB0by4gKi8KKwllcGItPmhhc2hlbnQgPSBzY3RwX2Fzc29jX2hhc2hmbihlcGItPmJpbmRfYWRkci5wb3J0LCBhc29jLT5wZWVyLnBvcnQpOworCisJaGVhZCA9ICZzY3RwX2Fzc29jX2hhc2h0YWJsZVtlcGItPmhhc2hlbnRdOworCisJc2N0cF93cml0ZV9sb2NrKCZoZWFkLT5sb2NrKTsKKwllcHAgPSAmaGVhZC0+Y2hhaW47CisJZXBiLT5uZXh0ID0gKmVwcDsKKwlpZiAoZXBiLT5uZXh0KQorCQkoKmVwcCktPnBwcmV2ID0gJmVwYi0+bmV4dDsKKwkqZXBwID0gZXBiOworCWVwYi0+cHByZXYgPSBlcHA7CisJc2N0cF93cml0ZV91bmxvY2soJmhlYWQtPmxvY2spOworfQorCisvKiBBZGQgYW4gYXNzb2NpYXRpb24gdG8gdGhlIGhhc2guIExvY2FsIEJILXNhZmUuICovCit2b2lkIHNjdHBfaGFzaF9lc3RhYmxpc2hlZChzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYykKK3sKKwlzY3RwX2xvY2FsX2JoX2Rpc2FibGUoKTsKKwlfX3NjdHBfaGFzaF9lc3RhYmxpc2hlZChhc29jKTsKKwlzY3RwX2xvY2FsX2JoX2VuYWJsZSgpOworfQorCisvKiBSZW1vdmUgYXNzb2NpYXRpb24gZnJvbSB0aGUgaGFzaCB0YWJsZS4gICovCitzdGF0aWMgdm9pZCBfX3NjdHBfdW5oYXNoX2VzdGFibGlzaGVkKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKQoreworCXN0cnVjdCBzY3RwX2hhc2hidWNrZXQgKmhlYWQ7CisJc3RydWN0IHNjdHBfZXBfY29tbW9uICplcGI7CisKKwllcGIgPSAmYXNvYy0+YmFzZTsKKworCWVwYi0+aGFzaGVudCA9IHNjdHBfYXNzb2NfaGFzaGZuKGVwYi0+YmluZF9hZGRyLnBvcnQsCisJCQkJCSBhc29jLT5wZWVyLnBvcnQpOworCisJaGVhZCA9ICZzY3RwX2Fzc29jX2hhc2h0YWJsZVtlcGItPmhhc2hlbnRdOworCisJc2N0cF93cml0ZV9sb2NrKCZoZWFkLT5sb2NrKTsKKworCWlmIChlcGItPnBwcmV2KSB7CisJCWlmIChlcGItPm5leHQpCisJCQllcGItPm5leHQtPnBwcmV2ID0gZXBiLT5wcHJldjsKKwkJKmVwYi0+cHByZXYgPSBlcGItPm5leHQ7CisJCWVwYi0+cHByZXYgPSBOVUxMOworCX0KKworCXNjdHBfd3JpdGVfdW5sb2NrKCZoZWFkLT5sb2NrKTsKK30KKworLyogUmVtb3ZlIGFzc29jaWF0aW9uIGZyb20gdGhlIGhhc2ggdGFibGUuICBMb2NhbCBCSC1zYWZlLiAqLwordm9pZCBzY3RwX3VuaGFzaF9lc3RhYmxpc2hlZChzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYykKK3sKKwlzY3RwX2xvY2FsX2JoX2Rpc2FibGUoKTsKKwlfX3NjdHBfdW5oYXNoX2VzdGFibGlzaGVkKGFzb2MpOworCXNjdHBfbG9jYWxfYmhfZW5hYmxlKCk7Cit9CisKKy8qIExvb2sgdXAgYW4gYXNzb2NpYXRpb24uICovCitzdGF0aWMgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKl9fc2N0cF9sb29rdXBfYXNzb2NpYXRpb24oCisJCQkJCWNvbnN0IHVuaW9uIHNjdHBfYWRkciAqbG9jYWwsCisJCQkJCWNvbnN0IHVuaW9uIHNjdHBfYWRkciAqcGVlciwKKwkJCQkJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICoqcHQpCit7CisJc3RydWN0IHNjdHBfaGFzaGJ1Y2tldCAqaGVhZDsKKwlzdHJ1Y3Qgc2N0cF9lcF9jb21tb24gKmVwYjsKKwlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKKwlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydDsKKwlpbnQgaGFzaDsKKworCS8qIE9wdGltaXplIGhlcmUgZm9yIGRpcmVjdCBoaXQsIG9ubHkgbGlzdGVuaW5nIGNvbm5lY3Rpb25zIGNhbgorCSAqIGhhdmUgd2lsZGNhcmRzIGFueXdheXMuCisJICovCisJaGFzaCA9IHNjdHBfYXNzb2NfaGFzaGZuKGxvY2FsLT52NC5zaW5fcG9ydCwgcGVlci0+djQuc2luX3BvcnQpOworCWhlYWQgPSAmc2N0cF9hc3NvY19oYXNodGFibGVbaGFzaF07CisJcmVhZF9sb2NrKCZoZWFkLT5sb2NrKTsKKwlmb3IgKGVwYiA9IGhlYWQtPmNoYWluOyBlcGI7IGVwYiA9IGVwYi0+bmV4dCkgeworCQlhc29jID0gc2N0cF9hc3NvYyhlcGIpOworCQl0cmFuc3BvcnQgPSBzY3RwX2Fzc29jX2lzX21hdGNoKGFzb2MsIGxvY2FsLCBwZWVyKTsKKwkJaWYgKHRyYW5zcG9ydCkKKwkJCWdvdG8gaGl0OworCX0KKworCXJlYWRfdW5sb2NrKCZoZWFkLT5sb2NrKTsKKworCXJldHVybiBOVUxMOworCitoaXQ6CisJKnB0ID0gdHJhbnNwb3J0OworCXNjdHBfYXNzb2NpYXRpb25faG9sZChhc29jKTsKKwlzb2NrX2hvbGQoZXBiLT5zayk7CisJcmVhZF91bmxvY2soJmhlYWQtPmxvY2spOworCXJldHVybiBhc29jOworfQorCisvKiBMb29rIHVwIGFuIGFzc29jaWF0aW9uLiBCSC1zYWZlLiAqLworU0NUUF9TVEFUSUMKK3N0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICpzY3RwX2xvb2t1cF9hc3NvY2lhdGlvbihjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmxhZGRyLAorCQkJCQkJIGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqcGFkZHIsCisJCQkJCSAgICBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKip0cmFuc3BvcnRwKQoreworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOworCisJc2N0cF9sb2NhbF9iaF9kaXNhYmxlKCk7CisJYXNvYyA9IF9fc2N0cF9sb29rdXBfYXNzb2NpYXRpb24obGFkZHIsIHBhZGRyLCB0cmFuc3BvcnRwKTsKKwlzY3RwX2xvY2FsX2JoX2VuYWJsZSgpOworCisJcmV0dXJuIGFzb2M7Cit9CisKKy8qIElzIHRoZXJlIGFuIGFzc29jaWF0aW9uIG1hdGNoaW5nIHRoZSBnaXZlbiBsb2NhbCBhbmQgcGVlciBhZGRyZXNzZXM/ICovCitpbnQgc2N0cF9oYXNfYXNzb2NpYXRpb24oY29uc3QgdW5pb24gc2N0cF9hZGRyICpsYWRkciwKKwkJCSBjb25zdCB1bmlvbiBzY3RwX2FkZHIgKnBhZGRyKQoreworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0OworCisJaWYgKChhc29jID0gc2N0cF9sb29rdXBfYXNzb2NpYXRpb24obGFkZHIsIHBhZGRyLCAmdHJhbnNwb3J0KSkpIHsKKwkJc29ja19wdXQoYXNvYy0+YmFzZS5zayk7CisJCXNjdHBfYXNzb2NpYXRpb25fcHV0KGFzb2MpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNDVFAgSW1wbGVtZW50b3JzIEd1aWRlLCAyLjE4IEhhbmRsaW5nIG9mIGFkZHJlc3MKKyAqIHBhcmFtZXRlcnMgd2l0aGluIHRoZSBJTklUIG9yIElOSVQtQUNLLgorICoKKyAqIEQpIFdoZW4gc2VhcmNoaW5nIGZvciBhIG1hdGNoaW5nIFRDQiB1cG9uIHJlY2VwdGlvbiBvZiBhbiBJTklUCisgKiAgICBvciBJTklULUFDSyBjaHVuayB0aGUgcmVjZWl2ZXIgU0hPVUxEIHVzZSBub3Qgb25seSB0aGUKKyAqICAgIHNvdXJjZSBhZGRyZXNzIG9mIHRoZSBwYWNrZXQgKGNvbnRhaW5pbmcgdGhlIElOSVQgb3IKKyAqICAgIElOSVQtQUNLKSBidXQgdGhlIHJlY2VpdmVyIFNIT1VMRCBhbHNvIHVzZSBhbGwgdmFsaWQKKyAqICAgIGFkZHJlc3MgcGFyYW1ldGVycyBjb250YWluZWQgd2l0aGluIHRoZSBjaHVuay4KKyAqCisgKiAyLjE4LjMgU29sdXRpb24gZGVzY3JpcHRpb24KKyAqCisgKiBUaGlzIG5ldyB0ZXh0IGNsZWFybHkgc3BlY2lmaWVzIHRvIGFuIGltcGxlbWVudG9yIHRoZSBuZWVkCisgKiB0byBsb29rIHdpdGhpbiB0aGUgSU5JVCBvciBJTklULUFDSy4gQW55IGltcGxlbWVudGF0aW9uIHRoYXQKKyAqIGRvZXMgbm90IGRvIHRoaXMsIG1heSBub3QgYmUgYWJsZSB0byBlc3RhYmxpc2ggYXNzb2NpYXRpb25zCisgKiBpbiBjZXJ0YWluIGNpcmN1bXN0YW5jZXMuCisgKgorICovCitzdGF0aWMgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKl9fc2N0cF9yY3ZfaW5pdF9sb29rdXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwljb25zdCB1bmlvbiBzY3RwX2FkZHIgKmxhZGRyLCBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKip0cmFuc3BvcnRwKQoreworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOworCXVuaW9uIHNjdHBfYWRkciBhZGRyOworCXVuaW9uIHNjdHBfYWRkciAqcGFkZHIgPSAmYWRkcjsKKwlzdHJ1Y3Qgc2N0cGhkciAqc2ggPSAoc3RydWN0IHNjdHBoZHIgKikgc2tiLT5oLnJhdzsKKwlzY3RwX2NodW5raGRyX3QgKmNoOworCXVuaW9uIHNjdHBfcGFyYW1zIHBhcmFtczsKKwlzY3RwX2luaXRfY2h1bmtfdCAqaW5pdDsKKwlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydDsKKwlzdHJ1Y3Qgc2N0cF9hZiAqYWY7CisKKwljaCA9IChzY3RwX2NodW5raGRyX3QgKikgc2tiLT5kYXRhOworCisJLyogSWYgdGhpcyBpcyBJTklUL0lOSVQtQUNLIGxvb2sgaW5zaWRlIHRoZSBjaHVuayB0b28uICovCisJc3dpdGNoIChjaC0+dHlwZSkgeworCWNhc2UgU0NUUF9DSURfSU5JVDoKKwljYXNlIFNDVFBfQ0lEX0lOSVRfQUNLOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBUaGUgY29kZSBiZWxvdyB3aWxsIGF0dGVtcHQgdG8gd2FsayB0aGUgY2h1bmsgYW5kIGV4dHJhY3QKKwkgKiBwYXJhbWV0ZXIgaW5mb3JtYXRpb24uICBCZWZvcmUgd2UgZG8gdGhhdCwgd2UgbmVlZCB0byB2ZXJpZnkKKwkgKiB0aGF0IHRoZSBjaHVuayBsZW5ndGggZG9lc24ndCBjYXVzZSBvdmVyZmxvdy4gIE90aGVyd2lzZSwgd2UnbGwKKwkgKiB3YWxrIG9mZiB0aGUgZW5kLgorCSAqLworCWlmIChXT1JEX1JPVU5EKG50b2hzKGNoLT5sZW5ndGgpKSA+IHNrYi0+bGVuKQorCQlyZXR1cm4gTlVMTDsKKworCS8qCisJICogVGhpcyBjb2RlIHdpbGwgTk9UIHRvdWNoIGFueXRoaW5nIGluc2lkZSB0aGUgY2h1bmstLWl0IGlzCisJICogc3RyaWN0bHkgUkVBRC1PTkxZLgorCSAqCisJICogUkZDIDI5NjAgMyAgU0NUUCBwYWNrZXQgRm9ybWF0CisJICoKKwkgKiBNdWx0aXBsZSBjaHVua3MgY2FuIGJlIGJ1bmRsZWQgaW50byBvbmUgU0NUUCBwYWNrZXQgdXAgdG8KKwkgKiB0aGUgTVRVIHNpemUsIGV4Y2VwdCBmb3IgdGhlIElOSVQsIElOSVQgQUNLLCBhbmQgU0hVVERPV04KKwkgKiBDT01QTEVURSBjaHVua3MuICBUaGVzZSBjaHVua3MgTVVTVCBOT1QgYmUgYnVuZGxlZCB3aXRoIGFueQorCSAqIG90aGVyIGNodW5rIGluIGEgcGFja2V0LiAgU2VlIFNlY3Rpb24gNi4xMCBmb3IgbW9yZSBkZXRhaWxzCisJICogb24gY2h1bmsgYnVuZGxpbmcuCisJICovCisKKwkvKiBGaW5kIHRoZSBzdGFydCBvZiB0aGUgVExWcyBhbmQgdGhlIGVuZCBvZiB0aGUgY2h1bmsuICBUaGlzIGlzCisJICogdGhlIHJlZ2lvbiB3ZSBzZWFyY2ggZm9yIGFkZHJlc3MgcGFyYW1ldGVycy4KKwkgKi8KKwlpbml0ID0gKHNjdHBfaW5pdF9jaHVua190ICopc2tiLT5kYXRhOworCisJLyogV2FsayB0aGUgcGFyYW1ldGVycyBsb29raW5nIGZvciBlbWJlZGRlZCBhZGRyZXNzZXMuICovCisJc2N0cF93YWxrX3BhcmFtcyhwYXJhbXMsIGluaXQsIGluaXRfaGRyLnBhcmFtcykgeworCisJCS8qIE5vdGU6IElnbm9yaW5nIGhvc3RuYW1lIGFkZHJlc3Nlcy4gKi8KKwkJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhwYXJhbV90eXBlMmFmKHBhcmFtcy5wLT50eXBlKSk7CisJCWlmICghYWYpCisJCQljb250aW51ZTsKKworCQlhZi0+ZnJvbV9hZGRyX3BhcmFtKHBhZGRyLCBwYXJhbXMuYWRkciwgbnRvaHMoc2gtPnNvdXJjZSksIDApOworCisJCWFzb2MgPSBfX3NjdHBfbG9va3VwX2Fzc29jaWF0aW9uKGxhZGRyLCBwYWRkciwgJnRyYW5zcG9ydCk7CisJCWlmIChhc29jKQorCQkJcmV0dXJuIGFzb2M7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIExvb2t1cCBhbiBhc3NvY2lhdGlvbiBmb3IgYW4gaW5ib3VuZCBza2IuICovCitzdGF0aWMgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKl9fc2N0cF9yY3ZfbG9va3VwKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgY29uc3QgdW5pb24gc2N0cF9hZGRyICpwYWRkciwKKwkJCQkgICAgICBjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmxhZGRyLAorCQkJCSAgICAgIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqKnRyYW5zcG9ydHApCit7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CisKKwlhc29jID0gX19zY3RwX2xvb2t1cF9hc3NvY2lhdGlvbihsYWRkciwgcGFkZHIsIHRyYW5zcG9ydHApOworCisJLyogRnVydGhlciBsb29rdXAgZm9yIElOSVQvSU5JVC1BQ0sgcGFja2V0cy4KKwkgKiBTQ1RQIEltcGxlbWVudG9ycyBHdWlkZSwgMi4xOCBIYW5kbGluZyBvZiBhZGRyZXNzCisJICogcGFyYW1ldGVycyB3aXRoaW4gdGhlIElOSVQgb3IgSU5JVC1BQ0suCisJICovCisJaWYgKCFhc29jKQorCQlhc29jID0gX19zY3RwX3Jjdl9pbml0X2xvb2t1cChza2IsIGxhZGRyLCB0cmFuc3BvcnRwKTsKKworCXJldHVybiBhc29jOworfQpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvaW5xdWV1ZS5jIGIvbmV0L3NjdHAvaW5xdWV1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZGY0MzUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2N0cC9pbnF1ZXVlLmMKQEAgLTAsMCArMSwyMDQgQEAKKy8qIFNDVFAga2VybmVsIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgQ2lzY28sIEluYy4KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIE1vdG9yb2xhLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcywgQ29ycC4KKyAqIAorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFNDVFAga2VybmVsIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbgorICogCisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHRoZSBtZXRob2RzIGZvciBhY2Nlc3NpbmcgdGhlIFNDVFAgaW5xdWV1ZS4KKyAqCisgKiBBbiBTQ1RQIGlucXVldWUgaXMgYSBxdWV1ZSBpbnRvIHdoaWNoIHlvdSBwdXNoIFNDVFAgcGFja2V0cworICogKHdoaWNoIG1pZ2h0IGJlIGJ1bmRsZXMgb3IgZnJhZ21lbnRzIG9mIGNodW5rcykgYW5kIG91dCBvZiB3aGljaCB5b3UKKyAqIHBvcCBTQ1RQIHdob2xlIGNodW5rcy4KKyAqIAorICogVGhlIFNDVFAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7IAorICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhlIFNDVFAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgCisgKiB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAqICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisgKiAKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqIAorICogT3Igc3VibWl0IGEgYnVnIHJlcG9ydCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgd2Vic2l0ZToKKyAqICAgIGh0dHA6Ly93d3cuc2YubmV0L3Byb2plY3RzL2xrc2N0cAorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6IAorICogICAgTGEgTW9udGUgSC5QLiBZYXJyb2xsIDxwaWdneUBhY20ub3JnPgorICogICAgS2FybCBLbnV0c29uIDxrYXJsQGF0aGVuYS5jaGljYWdvLmlsLnVzPgorICogCisgKiBBbnkgYnVncyByZXBvcnRlZCBnaXZlbiB0byB1cyB3ZSB3aWxsIHRyeSB0byBmaXguLi4gYW55IGZpeGVzIHNoYXJlZCB3aWxsCisgKiBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbmV4dCBTQ1RQIHJlbGVhc2UuCisgKi8KKworI2luY2x1ZGUgPG5ldC9zY3RwL3NjdHAuaD4KKyNpbmNsdWRlIDxuZXQvc2N0cC9zbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisvKiBJbml0aWFsaXplIGFuIFNDVFAgaW5xdWV1ZS4gICovCit2b2lkIHNjdHBfaW5xX2luaXQoc3RydWN0IHNjdHBfaW5xICpxdWV1ZSkKK3sKKwlza2JfcXVldWVfaGVhZF9pbml0KCZxdWV1ZS0+aW4pOworCXF1ZXVlLT5pbl9wcm9ncmVzcyA9IE5VTEw7CisKKwkvKiBDcmVhdGUgYSB0YXNrIGZvciBkZWxpdmVyaW5nIGRhdGEuICAqLworCUlOSVRfV09SSygmcXVldWUtPmltbWVkaWF0ZSwgTlVMTCwgTlVMTCk7CisKKwlxdWV1ZS0+bWFsbG9jZWQgPSAwOworfQorCisvKiBSZWxlYXNlIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGFuIFNDVFAgaW5xdWV1ZS4gICovCit2b2lkIHNjdHBfaW5xX2ZyZWUoc3RydWN0IHNjdHBfaW5xICpxdWV1ZSkKK3sKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bms7CisKKwkvKiBFbXB0eSB0aGUgcXVldWUuICAqLworCXdoaWxlICgoY2h1bmsgPSAoc3RydWN0IHNjdHBfY2h1bmsgKikgc2tiX2RlcXVldWUoJnF1ZXVlLT5pbikpICE9IE5VTEwpCisJCXNjdHBfY2h1bmtfZnJlZShjaHVuayk7CisKKwkvKiBJZiB0aGVyZSBpcyBhIHBhY2tldCB3aGljaCBpcyBjdXJyZW50bHkgYmVpbmcgd29ya2VkIG9uLAorCSAqIGZyZWUgaXQgYXMgd2VsbC4KKwkgKi8KKwlpZiAocXVldWUtPmluX3Byb2dyZXNzKQorCQlzY3RwX2NodW5rX2ZyZWUocXVldWUtPmluX3Byb2dyZXNzKTsKKworCWlmIChxdWV1ZS0+bWFsbG9jZWQpIHsKKwkJLyogRHVtcCB0aGUgbWFzdGVyIG1lbW9yeSBzZWdtZW50LiAgKi8KKwkJa2ZyZWUocXVldWUpOworCX0KK30KKworLyogUHV0IGEgbmV3IHBhY2tldCBpbiBhbiBTQ1RQIGlucXVldWUuCisgKiBXZSBhc3N1bWUgdGhhdCBwYWNrZXQtPnNjdHBfaGRyIGlzIHNldCBhbmQgaW4gaG9zdCBieXRlIG9yZGVyLgorICovCit2b2lkIHNjdHBfaW5xX3B1c2goc3RydWN0IHNjdHBfaW5xICpxLCBzdHJ1Y3Qgc2N0cF9jaHVuayAqcGFja2V0KQoreworCS8qIERpcmVjdGx5IGNhbGwgdGhlIHBhY2tldCBoYW5kbGluZyByb3V0aW5lLiAqLworCisJLyogV2UgYXJlIG5vdyBjYWxsaW5nIHRoaXMgZWl0aGVyIGZyb20gdGhlIHNvZnQgaW50ZXJydXB0CisJICogb3IgZnJvbSB0aGUgYmFja2xvZyBwcm9jZXNzaW5nLgorCSAqIEV2ZW50dWFsbHksIHdlIHNob3VsZCBjbGVhbiB1cCBpbnF1ZXVlIHRvIG5vdCByZWx5CisJICogb24gdGhlIEJIIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzLgorCSAqLworCXNrYl9xdWV1ZV90YWlsKCYocS0+aW4pLCAoc3RydWN0IHNrX2J1ZmYgKikgcGFja2V0KTsKKwlxLT5pbW1lZGlhdGUuZnVuYyhxLT5pbW1lZGlhdGUuZGF0YSk7Cit9CisKKy8qIEV4dHJhY3QgYSBjaHVuayBmcm9tIGFuIFNDVFAgaW5xdWV1ZS4KKyAqCisgKiBXQVJOSU5HOiAgSWYgeW91IG5lZWQgdG8gcHV0IHRoZSBjaHVuayBvbiBhbm90aGVyIHF1ZXVlLCB5b3UgbmVlZCB0bworICogbWFrZSBhIHNoYWxsb3cgY29weSAoY2xvbmUpIG9mIGl0LgorICovCitzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9pbnFfcG9wKHN0cnVjdCBzY3RwX2lucSAqcXVldWUpCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rOworCXNjdHBfY2h1bmtoZHJfdCAqY2ggPSBOVUxMOworCisJLyogVGhlIGFzc3VtcHRpb24gaXMgdGhhdCB3ZSBhcmUgc2FmZSB0byBwcm9jZXNzIHRoZSBjaHVua3MKKwkgKiBhdCB0aGlzIHRpbWUuCisJICovCisKKwlpZiAoKGNodW5rID0gcXVldWUtPmluX3Byb2dyZXNzKSkgeworCQkvKiBUaGVyZSBpcyBhIHBhY2tldCB0aGF0IHdlIGhhdmUgYmVlbiB3b3JraW5nIG9uLgorCQkgKiBBbnkgcG9zdCBwcm9jZXNzaW5nIHdvcmsgdG8gZG8gYmVmb3JlIHdlIG1vdmUgb24/CisJCSAqLworCQlpZiAoY2h1bmstPnNpbmdsZXRvbiB8fAorCQkgICAgY2h1bmstPmVuZF9vZl9wYWNrZXQgfHwKKwkJICAgIGNodW5rLT5wZGlzY2FyZCkgeworCQkJc2N0cF9jaHVua19mcmVlKGNodW5rKTsKKwkJCWNodW5rID0gcXVldWUtPmluX3Byb2dyZXNzID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCS8qIE5vdGhpbmcgdG8gZG8uIE5leHQgY2h1bmsgaW4gdGhlIHBhY2tldCwgcGxlYXNlLiAqLworCQkJY2ggPSAoc2N0cF9jaHVua2hkcl90ICopIGNodW5rLT5jaHVua19lbmQ7CisKKwkJCS8qIEZvcmNlIGNodW5rLT5za2ItPmRhdGEgdG8gY2h1bmstPmNodW5rX2VuZC4gICovCisJCQlza2JfcHVsbChjaHVuay0+c2tiLAorCQkJCSBjaHVuay0+Y2h1bmtfZW5kIC0gY2h1bmstPnNrYi0+ZGF0YSk7CisJCX0KKwl9CisKKwkvKiBEbyB3ZSBuZWVkIHRvIHRha2UgdGhlIG5leHQgcGFja2V0IG91dCBvZiB0aGUgcXVldWUgdG8gcHJvY2Vzcz8gKi8KKwlpZiAoIWNodW5rKSB7CisJCS8qIElzIHRoZSBxdWV1ZSBlbXB0eT8gICovCisgICAgICAgIAlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZxdWV1ZS0+aW4pKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJY2h1bmsgPSBxdWV1ZS0+aW5fcHJvZ3Jlc3MgPQorCQkJKHN0cnVjdCBzY3RwX2NodW5rICopIHNrYl9kZXF1ZXVlKCZxdWV1ZS0+aW4pOworCisJCS8qIFRoaXMgaXMgdGhlIGZpcnN0IGNodW5rIGluIHRoZSBwYWNrZXQuICAqLworCQljaHVuay0+c2luZ2xldG9uID0gMTsKKwkJY2ggPSAoc2N0cF9jaHVua2hkcl90ICopIGNodW5rLT5za2ItPmRhdGE7CisJfQorCisgICAgICAgIGNodW5rLT5jaHVua19oZHIgPSBjaDsKKyAgICAgICAgY2h1bmstPmNodW5rX2VuZCA9ICgoX191OCAqKWNoKSArIFdPUkRfUk9VTkQobnRvaHMoY2gtPmxlbmd0aCkpOworCS8qIEluIHRoZSB1bmxpa2VseSBjYXNlIG9mIGFuIElQIHJlYXNzZW1ibHksIHRoZSBza2IgY291bGQgYmUKKwkgKiBub24tbGluZWFyLiBJZiBzbywgdXBkYXRlIGNodW5rX2VuZCBzbyB0aGF0IGl0IGRvZXNuJ3QgZ28gcGFzdAorCSAqIHRoZSBza2ItPnRhaWwuCisJICovCisJaWYgKHVubGlrZWx5KHNrYl9pc19ub25saW5lYXIoY2h1bmstPnNrYikpKSB7CisJCWlmIChjaHVuay0+Y2h1bmtfZW5kID4gY2h1bmstPnNrYi0+dGFpbCkKKwkJCWNodW5rLT5jaHVua19lbmQgPSBjaHVuay0+c2tiLT50YWlsOworCX0KKwlza2JfcHVsbChjaHVuay0+c2tiLCBzaXplb2Yoc2N0cF9jaHVua2hkcl90KSk7CisJY2h1bmstPnN1YmgudiA9IE5VTEw7IC8qIFN1YmhlYWRlciBpcyBubyBsb25nZXIgdmFsaWQuICAqLworCisJaWYgKGNodW5rLT5jaHVua19lbmQgPCBjaHVuay0+c2tiLT50YWlsKSB7CisJCS8qIFRoaXMgaXMgbm90IGEgc2luZ2xldG9uICovCisJCWNodW5rLT5zaW5nbGV0b24gPSAwOworCX0gZWxzZSBpZiAoY2h1bmstPmNodW5rX2VuZCA+IGNodW5rLT5za2ItPnRhaWwpIHsKKyAgICAgICAgICAgICAgICAvKiBSRkMgMjk2MCwgU2VjdGlvbiA2LjEwICBCdW5kbGluZworCQkgKgorCQkgKiBQYXJ0aWFsIGNodW5rcyBNVVNUIE5PVCBiZSBwbGFjZWQgaW4gYW4gU0NUUCBwYWNrZXQuCisJCSAqIElmIHRoZSByZWNlaXZlciBkZXRlY3RzIGEgcGFydGlhbCBjaHVuaywgaXQgTVVTVCBkcm9wCisJCSAqIHRoZSBjaHVuay4gIAorCQkgKgorCQkgKiBTaW5jZSB0aGUgZW5kIG9mIHRoZSBjaHVuayBpcyBwYXN0IHRoZSBlbmQgb2Ygb3VyIGJ1ZmZlcgorCQkgKiAod2hpY2ggY29udGFpbnMgdGhlIHdob2xlIHBhY2tldCwgd2UgY2FuIGZyZWVseSBkaXNjYXJkCisJCSAqIHRoZSB3aG9sZSBwYWNrZXQuCisJCSAqLworCQlzY3RwX2NodW5rX2ZyZWUoY2h1bmspOworCQljaHVuayA9IHF1ZXVlLT5pbl9wcm9ncmVzcyA9IE5VTEw7CisKKwkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIHsKKwkJLyogV2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIHBhY2tldCwgc28gbWFyayB0aGUgY2h1bmsKKwkJICogaW4gY2FzZSB3ZSBuZWVkIHRvIHNlbmQgYSBTQUNLLgorCQkgKi8KKwkJY2h1bmstPmVuZF9vZl9wYWNrZXQgPSAxOworCX0KKworCVNDVFBfREVCVUdfUFJJTlRLKCIrKytzY3RwX2lucV9wb3ArKysgY2h1bmsgJXBbJXNdLCIKKwkJCSAgIiBsZW5ndGggJWQsIHNrYi0+bGVuICVkXG4iLGNodW5rLAorCQkJICBzY3RwX2NuYW1lKFNDVFBfU1RfQ0hVTksoY2h1bmstPmNodW5rX2hkci0+dHlwZSkpLAorCQkJICBudG9ocyhjaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpLCBjaHVuay0+c2tiLT5sZW4pOworCXJldHVybiBjaHVuazsKK30KKworLyogU2V0IGEgdG9wLWhhbGYgaGFuZGxlci4KKyAqCisgKiBPcmlnaW5hbGx5LCB3ZSB0aGUgdG9wLWhhbGYgaGFuZGxlciB3YXMgc2NoZWR1bGVkIGFzIGEgQkguICBXZSBub3cKKyAqIGNhbGwgdGhlIGhhbmRsZXIgZGlyZWN0bHkgaW4gc2N0cF9pbnFfcHVzaCgpIGF0IGEgdGltZSB0aGF0CisgKiB3ZSBrbm93IHdlIGFyZSBsb2NrIHNhZmUuCisgKiBUaGUgaW50ZW50IGlzIHRoYXQgdGhpcyByb3V0aW5lIHdpbGwgcHVsbCBzdHVmZiBvdXQgb2YgdGhlCisgKiBpbnF1ZXVlIGFuZCBwcm9jZXNzIGl0LgorICovCit2b2lkIHNjdHBfaW5xX3NldF90aF9oYW5kbGVyKHN0cnVjdCBzY3RwX2lucSAqcSwKKwkJCQkgdm9pZCAoKmNhbGxiYWNrKSh2b2lkICopLCB2b2lkICphcmcpCit7CisJSU5JVF9XT1JLKCZxLT5pbW1lZGlhdGUsIGNhbGxiYWNrLCBhcmcpOworfQorCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9pcHY2LmMgYi9uZXQvc2N0cC9pcHY2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQyYzc0ZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY3RwL2lwdjYuYwpAQCAtMCwwICsxLDEwMTMgQEAKKy8qIFNDVFAga2VybmVsIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwNAorICogQ29weXJpZ2h0IChjKSAyMDAxIE5va2lhLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTGEgTW9udGUgSC5QLiBZYXJyb2xsCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMyBJbnRlbCBDb3JwLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBTQ1RQIGtlcm5lbCByZWZlcmVuY2UgSW1wbGVtZW50YXRpb24KKyAqCisgKiBTQ1RQIG92ZXIgSVB2Ni4KKyAqCisgKiBUaGUgU0NUUCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgU0NUUCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKgkJICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogV3JpdHRlbiBvciBtb2RpZmllZCBieToKKyAqICAgIExlIFlhbnF1bgkJICAgIDx5YW5xdW4ubGVAbm9raWEuY29tPgorICogICAgSHVpIEh1YW5nCQkgICAgPGh1aS5odWFuZ0Bub2tpYS5jb20+CisgKiAgICBMYSBNb250ZSBILlAuIFlhcnJvbGwgPHBpZ2d5QGFjbS5vcmc+CisgKiAgICBTcmlkaGFyIFNhbXVkcmFsYQkgICAgPHNyaUB1cy5pYm0uY29tPgorICogICAgSm9uIEdyaW1tCQkgICAgPGpncmltbUB1cy5pYm0uY29tPgorICogICAgQXJkZWxsZSBGYW4JICAgIDxhcmRlbGxlLmZhbkBpbnRlbC5jb20+CisgKgorICogQmFzZWQgb246CisgKglsaW51eC9uZXQvaXB2Ni90Y3BfaXB2Ni5jCisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgZ2l2ZW4gdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaXBzZWMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPG5ldC9uZGlzYy5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L3RyYW5zcF92Ni5oPgorI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgorI2luY2x1ZGUgPG5ldC9pcDZfcm91dGUuaD4KKyNpbmNsdWRlIDxuZXQvaW5ldF9jb21tb24uaD4KKyNpbmNsdWRlIDxuZXQvaW5ldF9lY24uaD4KKyNpbmNsdWRlIDxuZXQvc2N0cC9zY3RwLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitleHRlcm4gaW50IHNjdHBfaW5ldGFkZHJfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcsIHZvaWQgKik7CitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHNjdHBfaW5ldDZhZGRyX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gc2N0cF9pbmV0YWRkcl9ldmVudCwKK307CisKKy8qIElDTVAgZXJyb3IgaGFuZGxlci4gKi8KK1NDVFBfU1RBVElDIHZvaWQgc2N0cF92Nl9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQsCisJCQkgICAgIGludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX191MzIgaW5mbykKK3sKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OworCXN0cnVjdCBpcHY2aGRyICppcGggPSAoc3RydWN0IGlwdjZoZHIgKilza2ItPmRhdGE7CisJc3RydWN0IHNjdHBoZHIgKnNoID0gKHN0cnVjdCBzY3RwaGRyICopKHNrYi0+ZGF0YSArIG9mZnNldCk7CisJc3RydWN0IHNvY2sgKnNrOworCXN0cnVjdCBzY3RwX2VuZHBvaW50ICplcDsKKwlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKKwlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydDsKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnA7CisJY2hhciAqc2F2ZWlwLCAqc2F2ZXNjdHA7CisJaW50IGVycjsKKworCWlkZXYgPSBpbjZfZGV2X2dldChza2ItPmRldik7CisKKwkvKiBGaXggdXAgc2tiIHRvIGxvb2sgYXQgdGhlIGVtYmVkZGVkIG5ldCBoZWFkZXIuICovCisJc2F2ZWlwID0gc2tiLT5uaC5yYXc7CisJc2F2ZXNjdHAgID0gc2tiLT5oLnJhdzsKKwlza2ItPm5oLmlwdjZoID0gaXBoOworCXNrYi0+aC5yYXcgPSAoY2hhciAqKXNoOworCXNrID0gc2N0cF9lcnJfbG9va3VwKEFGX0lORVQ2LCBza2IsIHNoLCAmZXAsICZhc29jLCAmdHJhbnNwb3J0KTsKKwkvKiBQdXQgYmFjaywgdGhlIG9yaWdpbmFsIHBvaW50ZXJzLiAqLworCXNrYi0+bmgucmF3ID0gc2F2ZWlwOworCXNrYi0+aC5yYXcgPSBzYXZlc2N0cDsKKwlpZiAoIXNrKSB7CisJCUlDTVA2X0lOQ19TVEFUU19CSChpZGV2LCBJQ01QNl9NSUJfSU5FUlJPUlMpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBXYXJuaW5nOiAgVGhlIHNvY2sgbG9jayBpcyBoZWxkLiAgUmVtZW1iZXIgdG8gY2FsbAorCSAqIHNjdHBfZXJyX2ZpbmlzaCEKKwkgKi8KKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSUNNUFY2X1BLVF9UT09CSUc6CisJCXNjdHBfaWNtcF9mcmFnX25lZWRlZChzaywgYXNvYywgdHJhbnNwb3J0LCBudG9obChpbmZvKSk7CisJCWdvdG8gb3V0X3VubG9jazsKKwljYXNlIElDTVBWNl9QQVJBTVBST0I6CisJCWlmIChJQ01QVjZfVU5LX05FWFRIRFIgPT0gY29kZSkgeworCQkJc2N0cF9pY21wX3Byb3RvX3VucmVhY2hhYmxlKHNrLCBlcCwgYXNvYywgdHJhbnNwb3J0KTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlucCA9IGluZXQ2X3NrKHNrKTsKKwlpY21wdjZfZXJyX2NvbnZlcnQodHlwZSwgY29kZSwgJmVycik7CisJaWYgKCFzb2NrX293bmVkX2J5X3VzZXIoc2spICYmIG5wLT5yZWN2ZXJyKSB7CisJCXNrLT5za19lcnIgPSBlcnI7CisJCXNrLT5za19lcnJvcl9yZXBvcnQoc2spOworCX0gZWxzZSB7ICAvKiBPbmx5IGFuIGVycm9yIG9uIHRpbWVvdXQgKi8KKwkJc2stPnNrX2Vycl9zb2Z0ID0gZXJyOworCX0KKworb3V0X3VubG9jazoKKwlzY3RwX2Vycl9maW5pc2goc2ssIGVwLCBhc29jKTsKK291dDoKKwlpZiAobGlrZWx5KGlkZXYgIT0gTlVMTCkpCisJCWluNl9kZXZfcHV0KGlkZXYpOworfQorCisvKiBCYXNlZCBvbiB0Y3BfdjZfeG1pdCgpIGluIHRjcF9pcHY2LmMuICovCitzdGF0aWMgaW50IHNjdHBfdjZfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydCwKKwkJCWludCBpcGZyYWdvaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBza2ItPnNrOworCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKKwlzdHJ1Y3QgZmxvd2kgZmw7CisKKwltZW1zZXQoJmZsLCAwLCBzaXplb2YoZmwpKTsKKworCWZsLnByb3RvID0gc2stPnNrX3Byb3RvY29sOworCisJLyogRmlsbCBpbiB0aGUgZGVzdCBhZGRyZXNzIGZyb20gdGhlIHJvdXRlIGVudHJ5IHBhc3NlZCB3aXRoIHRoZSBza2IKKwkgKiBhbmQgdGhlIHNvdXJjZSBhZGRyZXNzIGZyb20gdGhlIHRyYW5zcG9ydC4KKwkgKi8KKwlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgJnRyYW5zcG9ydC0+aXBhZGRyLnY2LnNpbjZfYWRkcik7CisJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9zcmMsICZ0cmFuc3BvcnQtPnNhZGRyLnY2LnNpbjZfYWRkcik7CisKKwlmbC5mbDZfZmxvd2xhYmVsID0gbnAtPmZsb3dfbGFiZWw7CisJSVA2X0VDTl9mbG93X3htaXQoc2ssIGZsLmZsNl9mbG93bGFiZWwpOworCWlmIChpcHY2X2FkZHJfdHlwZSgmZmwuZmw2X3NyYykgJiBJUFY2X0FERFJfTElOS0xPQ0FMKQorCQlmbC5vaWYgPSB0cmFuc3BvcnQtPnNhZGRyLnY2LnNpbjZfc2NvcGVfaWQ7CisJZWxzZQorCQlmbC5vaWYgPSBzay0+c2tfYm91bmRfZGV2X2lmOworCWZsLmZsX2lwX3Nwb3J0ID0gaW5ldF9zayhzayktPnNwb3J0OworCWZsLmZsX2lwX2Rwb3J0ID0gdHJhbnNwb3J0LT5pcGFkZHIudjYuc2luNl9wb3J0OworCisJaWYgKG5wLT5vcHQgJiYgbnAtPm9wdC0+c3JjcnQpIHsKKwkJc3RydWN0IHJ0MF9oZHIgKnJ0MCA9IChzdHJ1Y3QgcnQwX2hkciAqKSBucC0+b3B0LT5zcmNydDsKKwkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsIHJ0MC0+YWRkcik7CisJfQorCisJU0NUUF9ERUJVR19QUklOVEsoIiVzOiBza2I6JXAsIGxlbjolZCwgIgorCQkJICAic3JjOiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eCAiCisJCQkgICJkc3Q6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4XG4iLAorCQkJICBfX0ZVTkNUSU9OX18sIHNrYiwgc2tiLT5sZW4sCisJCQkgIE5JUDYoZmwuZmw2X3NyYyksIE5JUDYoZmwuZmw2X2RzdCkpOworCisJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfT1VUU0NUUFBBQ0tTKTsKKworCXJldHVybiBpcDZfeG1pdChzaywgc2tiLCAmZmwsIG5wLT5vcHQsIGlwZnJhZ29rKTsKK30KKworLyogUmV0dXJucyB0aGUgZHN0IGNhY2hlIGVudHJ5IGZvciB0aGUgZ2l2ZW4gc291cmNlIGFuZCBkZXN0aW5hdGlvbiBpcAorICogYWRkcmVzc2VzLgorICovCitzdGF0aWMgc3RydWN0IGRzdF9lbnRyeSAqc2N0cF92Nl9nZXRfZHN0KHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCQkgdW5pb24gc2N0cF9hZGRyICpkYWRkciwKKwkJCQkJIHVuaW9uIHNjdHBfYWRkciAqc2FkZHIpCit7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0OworCXN0cnVjdCBmbG93aSBmbDsKKworCW1lbXNldCgmZmwsIDAsIHNpemVvZihmbCkpOworCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCAmZGFkZHItPnY2LnNpbjZfYWRkcik7CisJaWYgKGlwdjZfYWRkcl90eXBlKCZkYWRkci0+djYuc2luNl9hZGRyKSAmIElQVjZfQUREUl9MSU5LTE9DQUwpCisJCWZsLm9pZiA9IGRhZGRyLT52Ni5zaW42X3Njb3BlX2lkOworCQorCisJU0NUUF9ERUJVR19QUklOVEsoIiVzOiBEU1Q9JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4ICIsCisJCQkgIF9fRlVOQ1RJT05fXywgTklQNihmbC5mbDZfZHN0KSk7CisKKwlpZiAoc2FkZHIpIHsKKwkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9zcmMsICZzYWRkci0+djYuc2luNl9hZGRyKTsKKwkJU0NUUF9ERUJVR19QUklOVEsoCisJCQkiU1JDPSUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eCAtICIsCisJCQlOSVA2KGZsLmZsNl9zcmMpKTsKKwl9CisKKwlkc3QgPSBpcDZfcm91dGVfb3V0cHV0KE5VTEwsICZmbCk7CisJaWYgKGRzdCkgeworCQlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OworCQlydCA9IChzdHJ1Y3QgcnQ2X2luZm8gKilkc3Q7CisJCVNDVFBfREVCVUdfUFJJTlRLKAorCQkJInJ0Nl9kc3Q6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4ICIKKwkJCSJydDZfc3JjOiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eFxuIiwKKwkJCU5JUDYocnQtPnJ0NmlfZHN0LmFkZHIpLCBOSVA2KHJ0LT5ydDZpX3NyYy5hZGRyKSk7CisJfSBlbHNlIHsKKwkJU0NUUF9ERUJVR19QUklOVEsoIk5PIFJPVVRFXG4iKTsKKwl9CisKKwlyZXR1cm4gZHN0OworfQorCisvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgaW5pdGlhbCBiaXRzIHRoYXQgbWF0Y2ggaW4gdGhlIDIgaXB2NgorICogYWRkcmVzc2VzLgorICovCitzdGF0aWMgaW5saW5lIGludCBzY3RwX3Y2X2FkZHJfbWF0Y2hfbGVuKHVuaW9uIHNjdHBfYWRkciAqczEsCisJCQkJCSB1bmlvbiBzY3RwX2FkZHIgKnMyKQoreworCXN0cnVjdCBpbjZfYWRkciAqYTEgPSAmczEtPnY2LnNpbjZfYWRkcjsKKwlzdHJ1Y3QgaW42X2FkZHIgKmEyID0gJnMyLT52Ni5zaW42X2FkZHI7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgNCA7IGkrKykgeworCQlfX3UzMiBhMXhvcmEyOworCisJCWExeG9yYTIgPSBhMS0+czZfYWRkcjMyW2ldIF4gYTItPnM2X2FkZHIzMltpXTsKKworCQlpZiAoKGogPSBmbHMobnRvaGwoYTF4b3JhMikpKSkKKwkJCXJldHVybiAoaSAqIDMyICsgMzIgLSBqKTsKKwl9CisKKwlyZXR1cm4gKGkqMzIpOworfQorCisvKiBGaWxscyBpbiB0aGUgc291cmNlIGFkZHJlc3Moc2FkZHIpIGJhc2VkIG9uIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzKGRhZGRyKQorICogYW5kIGFzb2MncyBiaW5kIGFkZHJlc3MgbGlzdC4KKyAqLworc3RhdGljIHZvaWQgc2N0cF92Nl9nZXRfc2FkZHIoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkgICAgICBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsCisJCQkgICAgICB1bmlvbiBzY3RwX2FkZHIgKmRhZGRyLAorCQkJICAgICAgdW5pb24gc2N0cF9hZGRyICpzYWRkcikKK3sKKwlzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKmJwOworCXJ3bG9ja190ICphZGRyX2xvY2s7CisJc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnkgKmxhZGRyOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwlzY3RwX3Njb3BlX3Qgc2NvcGU7CisJdW5pb24gc2N0cF9hZGRyICpiYWRkciA9IE5VTEw7CisJX191OCBtYXRjaGxlbiA9IDA7CisJX191OCBibWF0Y2hsZW47CisKKwlTQ1RQX0RFQlVHX1BSSU5USygiJXM6IGFzb2M6JXAgZHN0OiVwICIKKwkJCSAgImRhZGRyOiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eCAiLAorCQkJICBfX0ZVTkNUSU9OX18sIGFzb2MsIGRzdCwgTklQNihkYWRkci0+djYuc2luNl9hZGRyKSk7CisKKwlpZiAoIWFzb2MpIHsKKwkJaXB2Nl9nZXRfc2FkZHIoZHN0LCAmZGFkZHItPnY2LnNpbjZfYWRkciwmc2FkZHItPnY2LnNpbjZfYWRkcik7CisJCVNDVFBfREVCVUdfUFJJTlRLKCJzYWRkciBmcm9tIGlwdjZfZ2V0X3NhZGRyOiAiCisJCQkJICAiJTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4XG4iLAorCQkJCSAgTklQNihzYWRkci0+djYuc2luNl9hZGRyKSk7CisJCXJldHVybjsKKwl9CisKKwlzY29wZSA9IHNjdHBfc2NvcGUoZGFkZHIpOworCisJYnAgPSAmYXNvYy0+YmFzZS5iaW5kX2FkZHI7CisJYWRkcl9sb2NrID0gJmFzb2MtPmJhc2UuYWRkcl9sb2NrOworCisJLyogR28gdGhyb3VnaCB0aGUgYmluZCBhZGRyZXNzIGxpc3QgYW5kIGZpbmQgdGhlIGJlc3Qgc291cmNlIGFkZHJlc3MKKwkgKiB0aGF0IG1hdGNoZXMgdGhlIHNjb3BlIG9mIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzLgorCSAqLworCXNjdHBfcmVhZF9sb2NrKGFkZHJfbG9jayk7CisJbGlzdF9mb3JfZWFjaChwb3MsICZicC0+YWRkcmVzc19saXN0KSB7CisJCWxhZGRyID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5LCBsaXN0KTsKKwkJaWYgKChsYWRkci0+YS5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpICYmCisJCSAgICAoc2NvcGUgPD0gc2N0cF9zY29wZSgmbGFkZHItPmEpKSkgeworCQkJYm1hdGNobGVuID0gc2N0cF92Nl9hZGRyX21hdGNoX2xlbihkYWRkciwgJmxhZGRyLT5hKTsKKwkJCWlmICghYmFkZHIgfHwgKG1hdGNobGVuIDwgYm1hdGNobGVuKSkgeworCQkJCWJhZGRyID0gJmxhZGRyLT5hOworCQkJCW1hdGNobGVuID0gYm1hdGNobGVuOworCQkJfQorCQl9CisJfQorCisJaWYgKGJhZGRyKSB7CisJCW1lbWNweShzYWRkciwgYmFkZHIsIHNpemVvZih1bmlvbiBzY3RwX2FkZHIpKTsKKwkJU0NUUF9ERUJVR19QUklOVEsoInNhZGRyOiAiCisJCQkJICAiJTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4XG4iLAorCQkJCSAgTklQNihzYWRkci0+djYuc2luNl9hZGRyKSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogYXNvYzolcCBDb3VsZCBub3QgZmluZCBhIHZhbGlkIHNvdXJjZSAiCisJCSAgICAgICAiYWRkcmVzcyBmb3IgdGhlICIKKwkJICAgICAgICJkZXN0OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eFxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgYXNvYywgTklQNihkYWRkci0+djYuc2luNl9hZGRyKSk7CisJfQorCisJc2N0cF9yZWFkX3VubG9jayhhZGRyX2xvY2spOworfQorCisvKiBNYWtlIGEgY29weSBvZiBhbGwgcG90ZW50aWFsIGxvY2FsIGFkZHJlc3Nlcy4gKi8KK3N0YXRpYyB2b2lkIHNjdHBfdjZfY29weV9hZGRybGlzdChzdHJ1Y3QgbGlzdF9oZWFkICphZGRybGlzdCwKKwkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGluZXQ2X2RldiAqaW42X2RldjsKKwlzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnA7CisJc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnkgKmFkZHI7CisKKwlyZWFkX2xvY2soJmFkZHJjb25mX2xvY2spOworCWlmICgoaW42X2RldiA9IF9faW42X2Rldl9nZXQoZGV2KSkgPT0gTlVMTCkgeworCQlyZWFkX3VubG9jaygmYWRkcmNvbmZfbG9jayk7CisJCXJldHVybjsKKwl9CisKKwlyZWFkX2xvY2soJmluNl9kZXYtPmxvY2spOworCWZvciAoaWZwID0gaW42X2Rldi0+YWRkcl9saXN0OyBpZnA7IGlmcCA9IGlmcC0+aWZfbmV4dCkgeworCQkvKiBBZGQgdGhlIGFkZHJlc3MgdG8gdGhlIGxvY2FsIGxpc3QuICAqLworCQlhZGRyID0gdF9uZXcoc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnksIEdGUF9BVE9NSUMpOworCQlpZiAoYWRkcikgeworCQkJYWRkci0+YS52Ni5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQkJYWRkci0+YS52Ni5zaW42X3BvcnQgPSAwOworCQkJYWRkci0+YS52Ni5zaW42X2FkZHIgPSBpZnAtPmFkZHI7CisJCQlhZGRyLT5hLnY2LnNpbjZfc2NvcGVfaWQgPSBkZXYtPmlmaW5kZXg7CisJCQlJTklUX0xJU1RfSEVBRCgmYWRkci0+bGlzdCk7CisJCQlsaXN0X2FkZF90YWlsKCZhZGRyLT5saXN0LCBhZGRybGlzdCk7CisJCX0KKwl9CisKKwlyZWFkX3VubG9jaygmaW42X2Rldi0+bG9jayk7CisJcmVhZF91bmxvY2soJmFkZHJjb25mX2xvY2spOworfQorCisvKiBJbml0aWFsaXplIGEgc29ja2FkZHJfc3RvcmFnZSBmcm9tIGluIGluY29taW5nIHNrYi4gKi8KK3N0YXRpYyB2b2lkIHNjdHBfdjZfZnJvbV9za2IodW5pb24gc2N0cF9hZGRyICphZGRyLHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgIGludCBpc19zYWRkcikKK3sKKwl2b2lkICpmcm9tOworCV9fdTE2ICpwb3J0OworCXN0cnVjdCBzY3RwaGRyICpzaDsKKworCXBvcnQgPSAmYWRkci0+djYuc2luNl9wb3J0OworCWFkZHItPnY2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJYWRkci0+djYuc2luNl9mbG93aW5mbyA9IDA7IC8qIEZJWE1FICovCisJYWRkci0+djYuc2luNl9zY29wZV9pZCA9ICgoc3RydWN0IGluZXQ2X3NrYl9wYXJtICopc2tiLT5jYiktPmlpZjsKKworCXNoID0gKHN0cnVjdCBzY3RwaGRyICopIHNrYi0+aC5yYXc7CisJaWYgKGlzX3NhZGRyKSB7CisJCSpwb3J0ICA9IG50b2hzKHNoLT5zb3VyY2UpOworCQlmcm9tID0gJnNrYi0+bmguaXB2NmgtPnNhZGRyOworCX0gZWxzZSB7CisJCSpwb3J0ID0gbnRvaHMoc2gtPmRlc3QpOworCQlmcm9tID0gJnNrYi0+bmguaXB2NmgtPmRhZGRyOworCX0KKwlpcHY2X2FkZHJfY29weSgmYWRkci0+djYuc2luNl9hZGRyLCBmcm9tKTsKK30KKworLyogSW5pdGlhbGl6ZSBhbiBzY3RwX2FkZHIgZnJvbSBhIHNvY2tldC4gKi8KK3N0YXRpYyB2b2lkIHNjdHBfdjZfZnJvbV9zayh1bmlvbiBzY3RwX2FkZHIgKmFkZHIsIHN0cnVjdCBzb2NrICpzaykKK3sKKwlhZGRyLT52Ni5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCWFkZHItPnY2LnNpbjZfcG9ydCA9IGluZXRfc2soc2spLT5udW07CisJYWRkci0+djYuc2luNl9hZGRyID0gaW5ldDZfc2soc2spLT5yY3Zfc2FkZHI7Cit9CisKKy8qIEluaXRpYWxpemUgc2stPnNrX3Jjdl9zYWRkciBmcm9tIHNjdHBfYWRkci4gKi8KK3N0YXRpYyB2b2lkIHNjdHBfdjZfdG9fc2tfc2FkZHIodW5pb24gc2N0cF9hZGRyICphZGRyLCBzdHJ1Y3Qgc29jayAqc2spCit7CisJaWYgKGFkZHItPnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUICYmIHNjdHBfc2soc2spLT52NG1hcHBlZCkgeworCQlpbmV0Nl9zayhzayktPnJjdl9zYWRkci5zNl9hZGRyMzJbMF0gPSAwOworCQlpbmV0Nl9zayhzayktPnJjdl9zYWRkci5zNl9hZGRyMzJbMV0gPSAwOworCQlpbmV0Nl9zayhzayktPnJjdl9zYWRkci5zNl9hZGRyMzJbMl0gPSBodG9ubCgweDAwMDBmZmZmKTsKKwkJaW5ldDZfc2soc2spLT5yY3Zfc2FkZHIuczZfYWRkcjMyWzNdID0KKwkJCWFkZHItPnY0LnNpbl9hZGRyLnNfYWRkcjsKKwl9IGVsc2UgeworCQlpbmV0Nl9zayhzayktPnJjdl9zYWRkciA9IGFkZHItPnY2LnNpbjZfYWRkcjsKKwl9Cit9CisKKy8qIEluaXRpYWxpemUgc2stPnNrX2RhZGRyIGZyb20gc2N0cF9hZGRyLiAqLworc3RhdGljIHZvaWQgc2N0cF92Nl90b19za19kYWRkcih1bmlvbiBzY3RwX2FkZHIgKmFkZHIsIHN0cnVjdCBzb2NrICpzaykKK3sKKwlpZiAoYWRkci0+c2Euc2FfZmFtaWx5ID09IEFGX0lORVQgJiYgc2N0cF9zayhzayktPnY0bWFwcGVkKSB7CisJCWluZXQ2X3NrKHNrKS0+ZGFkZHIuczZfYWRkcjMyWzBdID0gMDsKKwkJaW5ldDZfc2soc2spLT5kYWRkci5zNl9hZGRyMzJbMV0gPSAwOworCQlpbmV0Nl9zayhzayktPmRhZGRyLnM2X2FkZHIzMlsyXSA9IGh0b25sKDB4MDAwMGZmZmYpOworCQlpbmV0Nl9zayhzayktPmRhZGRyLnM2X2FkZHIzMlszXSA9IGFkZHItPnY0LnNpbl9hZGRyLnNfYWRkcjsKKwl9IGVsc2UgeworCQlpbmV0Nl9zayhzayktPmRhZGRyID0gYWRkci0+djYuc2luNl9hZGRyOworCX0KK30KKworLyogSW5pdGlhbGl6ZSBhIHNjdHBfYWRkciBmcm9tIGFuIGFkZHJlc3MgcGFyYW1ldGVyLiAqLworc3RhdGljIHZvaWQgc2N0cF92Nl9mcm9tX2FkZHJfcGFyYW0odW5pb24gc2N0cF9hZGRyICphZGRyLAorCQkJCSAgICB1bmlvbiBzY3RwX2FkZHJfcGFyYW0gKnBhcmFtLAorCQkJCSAgICBfX3UxNiBwb3J0LCBpbnQgaWlmKQoreworCWFkZHItPnY2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJYWRkci0+djYuc2luNl9wb3J0ID0gcG9ydDsKKwlhZGRyLT52Ni5zaW42X2Zsb3dpbmZvID0gMDsgLyogQlVHICovCisJaXB2Nl9hZGRyX2NvcHkoJmFkZHItPnY2LnNpbjZfYWRkciwgJnBhcmFtLT52Ni5hZGRyKTsKKwlhZGRyLT52Ni5zaW42X3Njb3BlX2lkID0gaWlmOworfQorCisvKiBJbml0aWFsaXplIGFuIGFkZHJlc3MgcGFyYW1ldGVyIGZyb20gYSBzY3RwX2FkZHIgYW5kIHJldHVybiB0aGUgbGVuZ3RoCisgKiBvZiB0aGUgYWRkcmVzcyBwYXJhbWV0ZXIuCisgKi8KK3N0YXRpYyBpbnQgc2N0cF92Nl90b19hZGRyX3BhcmFtKGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqYWRkciwKKwkJCQkgdW5pb24gc2N0cF9hZGRyX3BhcmFtICpwYXJhbSkKK3sKKwlpbnQgbGVuZ3RoID0gc2l6ZW9mKHNjdHBfaXB2NmFkZHJfcGFyYW1fdCk7CisKKwlwYXJhbS0+djYucGFyYW1faGRyLnR5cGUgPSBTQ1RQX1BBUkFNX0lQVjZfQUREUkVTUzsKKwlwYXJhbS0+djYucGFyYW1faGRyLmxlbmd0aCA9IG50b2hzKGxlbmd0aCk7CisJaXB2Nl9hZGRyX2NvcHkoJnBhcmFtLT52Ni5hZGRyLCAmYWRkci0+djYuc2luNl9hZGRyKTsKKworCXJldHVybiBsZW5ndGg7Cit9CisKKy8qIEluaXRpYWxpemUgYSBzY3RwX2FkZHIgZnJvbSBhIGRzdF9lbnRyeS4gKi8KK3N0YXRpYyB2b2lkIHNjdHBfdjZfZHN0X3NhZGRyKHVuaW9uIHNjdHBfYWRkciAqYWRkciwgc3RydWN0IGRzdF9lbnRyeSAqZHN0LAorCQkJICAgICAgdW5zaWduZWQgc2hvcnQgcG9ydCkKK3sKKwlzdHJ1Y3QgcnQ2X2luZm8gKnJ0ID0gKHN0cnVjdCBydDZfaW5mbyAqKWRzdDsKKwlhZGRyLT5zYS5zYV9mYW1pbHkgPSBBRl9JTkVUNjsKKwlhZGRyLT52Ni5zaW42X3BvcnQgPSBwb3J0OworCWlwdjZfYWRkcl9jb3B5KCZhZGRyLT52Ni5zaW42X2FkZHIsICZydC0+cnQ2aV9zcmMuYWRkcik7Cit9CisKKy8qIENvbXBhcmUgYWRkcmVzc2VzIGV4YWN0bHkuCisgKiB2NC1tYXBwZWQtdjYgaXMgYWxzbyBpbiBjb25zaWRlcmF0aW9uLgorICovCitzdGF0aWMgaW50IHNjdHBfdjZfY21wX2FkZHIoY29uc3QgdW5pb24gc2N0cF9hZGRyICphZGRyMSwKKwkJCSAgICBjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIyKQoreworCWlmIChhZGRyMS0+c2Euc2FfZmFtaWx5ICE9IGFkZHIyLT5zYS5zYV9mYW1pbHkpIHsKKwkJaWYgKGFkZHIxLT5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVCAmJgorCQkgICAgYWRkcjItPnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUNiAmJgorCQkgICAgSVBWNl9BRERSX01BUFBFRCA9PSBpcHY2X2FkZHJfdHlwZSgmYWRkcjItPnY2LnNpbjZfYWRkcikpIHsKKwkJCWlmIChhZGRyMi0+djYuc2luNl9wb3J0ID09IGFkZHIxLT52NC5zaW5fcG9ydCAmJgorCQkJICAgIGFkZHIyLT52Ni5zaW42X2FkZHIuczZfYWRkcjMyWzNdID09CisJCQkgICAgYWRkcjEtPnY0LnNpbl9hZGRyLnNfYWRkcikKKwkJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAoYWRkcjItPnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUICYmCisJCSAgICBhZGRyMS0+c2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2ICYmCisJCSAgICBJUFY2X0FERFJfTUFQUEVEID09IGlwdjZfYWRkcl90eXBlKCZhZGRyMS0+djYuc2luNl9hZGRyKSkgeworCQkJaWYgKGFkZHIxLT52Ni5zaW42X3BvcnQgPT0gYWRkcjItPnY0LnNpbl9wb3J0ICYmCisJCQkgICAgYWRkcjEtPnY2LnNpbjZfYWRkci5zNl9hZGRyMzJbM10gPT0KKwkJCSAgICBhZGRyMi0+djQuc2luX2FkZHIuc19hZGRyKQorCQkJCXJldHVybiAxOworCQl9CisJCXJldHVybiAwOworCX0KKwlpZiAoIWlwdjZfYWRkcl9lcXVhbCgmYWRkcjEtPnY2LnNpbjZfYWRkciwgJmFkZHIyLT52Ni5zaW42X2FkZHIpKQorCQlyZXR1cm4gMDsKKwkvKiBJZiB0aGlzIGlzIGEgbGlua2xvY2FsIGFkZHJlc3MsIGNvbXBhcmUgdGhlIHNjb3BlX2lkLiAqLworCWlmIChpcHY2X2FkZHJfdHlwZSgmYWRkcjEtPnY2LnNpbjZfYWRkcikgJiBJUFY2X0FERFJfTElOS0xPQ0FMKSB7CisJCWlmIChhZGRyMS0+djYuc2luNl9zY29wZV9pZCAmJiBhZGRyMi0+djYuc2luNl9zY29wZV9pZCAmJgorCQkgICAgKGFkZHIxLT52Ni5zaW42X3Njb3BlX2lkICE9IGFkZHIyLT52Ni5zaW42X3Njb3BlX2lkKSkgeworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyogSW5pdGlhbGl6ZSBhZGRyIHN0cnVjdCB0byBJTkFERFJfQU5ZLiAqLworc3RhdGljIHZvaWQgc2N0cF92Nl9pbmFkZHJfYW55KHVuaW9uIHNjdHBfYWRkciAqYWRkciwgdW5zaWduZWQgc2hvcnQgcG9ydCkKK3sKKwltZW1zZXQoYWRkciwgMHgwMCwgc2l6ZW9mKHVuaW9uIHNjdHBfYWRkcikpOworCWFkZHItPnY2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJYWRkci0+djYuc2luNl9wb3J0ID0gcG9ydDsKK30KKworLyogSXMgdGhpcyBhIHdpbGRjYXJkIGFkZHJlc3M/ICovCitzdGF0aWMgaW50IHNjdHBfdjZfaXNfYW55KGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqYWRkcikKK3sKKwlpbnQgdHlwZTsKKwl0eXBlID0gaXB2Nl9hZGRyX3R5cGUoKHN0cnVjdCBpbjZfYWRkciAqKSZhZGRyLT52Ni5zaW42X2FkZHIpOworCXJldHVybiBJUFY2X0FERFJfQU5ZID09IHR5cGU7Cit9CisKKy8qIFNob3VsZCB0aGlzIGJlIGF2YWlsYWJsZSBmb3IgYmluZGluZz8gICAqLworc3RhdGljIGludCBzY3RwX3Y2X2F2YWlsYWJsZSh1bmlvbiBzY3RwX2FkZHIgKmFkZHIsIHN0cnVjdCBzY3RwX3NvY2sgKnNwKQoreworCWludCB0eXBlOworCXN0cnVjdCBpbjZfYWRkciAqaW42ID0gKHN0cnVjdCBpbjZfYWRkciAqKSZhZGRyLT52Ni5zaW42X2FkZHI7CisKKwl0eXBlID0gaXB2Nl9hZGRyX3R5cGUoaW42KTsKKwlpZiAoSVBWNl9BRERSX0FOWSA9PSB0eXBlKQorCQlyZXR1cm4gMTsKKwlpZiAodHlwZSA9PSBJUFY2X0FERFJfTUFQUEVEKSB7CisJCWlmIChzcCAmJiAhc3AtPnY0bWFwcGVkKQorCQkJcmV0dXJuIDA7CisJCWlmIChzcCAmJiBpcHY2X29ubHlfc29jayhzY3RwX29wdDJzayhzcCkpKQorCQkJcmV0dXJuIDA7CisJCXNjdHBfdjZfbWFwX3Y0KGFkZHIpOworCQlyZXR1cm4gc2N0cF9nZXRfYWZfc3BlY2lmaWMoQUZfSU5FVCktPmF2YWlsYWJsZShhZGRyLCBzcCk7CisJfQorCWlmICghKHR5cGUgJiBJUFY2X0FERFJfVU5JQ0FTVCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIGlwdjZfY2hrX2FkZHIoaW42LCBOVUxMLCAwKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGFkZHJlc3MgaXMgYSB2YWxpZCBhZGRyZXNzIHRvIGJlIHVzZWQgZm9yCisgKiBTQ1RQLgorICoKKyAqIE91dHB1dDoKKyAqIFJldHVybiAwIC0gSWYgdGhlIGFkZHJlc3MgaXMgYSBub24tdW5pY2FzdCBvciBhbiBpbGxlZ2FsIGFkZHJlc3MuCisgKiBSZXR1cm4gMSAtIElmIHRoZSBhZGRyZXNzIGlzIGEgdW5pY2FzdC4KKyAqLworc3RhdGljIGludCBzY3RwX3Y2X2FkZHJfdmFsaWQodW5pb24gc2N0cF9hZGRyICphZGRyLCBzdHJ1Y3Qgc2N0cF9zb2NrICpzcCkKK3sKKwlpbnQgcmV0ID0gaXB2Nl9hZGRyX3R5cGUoJmFkZHItPnY2LnNpbjZfYWRkcik7CisKKwkvKiBTdXBwb3J0IHY0LW1hcHBlZC12NiBhZGRyZXNzLiAqLworCWlmIChyZXQgPT0gSVBWNl9BRERSX01BUFBFRCkgeworCQkvKiBOb3RlOiBUaGlzIHJvdXRpbmUgaXMgdXNlZCBpbiBpbnB1dCwgc28gdjQtbWFwcGVkLXY2CisJCSAqIGFyZSBkaXNhbGxvd2VkIGhlcmUgd2hlbiB0aGVyZSBpcyBubyBzY3RwX3NvY2suCisJCSAqLworCQlpZiAoIXNwIHx8ICFzcC0+djRtYXBwZWQpCisJCQlyZXR1cm4gMDsKKwkJaWYgKHNwICYmIGlwdjZfb25seV9zb2NrKHNjdHBfb3B0MnNrKHNwKSkpCisJCQlyZXR1cm4gMDsKKwkJc2N0cF92Nl9tYXBfdjQoYWRkcik7CisJCXJldHVybiBzY3RwX2dldF9hZl9zcGVjaWZpYyhBRl9JTkVUKS0+YWRkcl92YWxpZChhZGRyLCBzcCk7CisJfQorCisJLyogSXMgdGhpcyBhIG5vbi11bmljYXN0IGFkZHJlc3MgKi8KKwlpZiAoIShyZXQgJiBJUFY2X0FERFJfVU5JQ0FTVCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKKy8qIFdoYXQgaXMgdGhlIHNjb3BlIG9mICdhZGRyJz8gICovCitzdGF0aWMgc2N0cF9zY29wZV90IHNjdHBfdjZfc2NvcGUodW5pb24gc2N0cF9hZGRyICphZGRyKQoreworCWludCB2NnNjb3BlOworCXNjdHBfc2NvcGVfdCByZXR2YWw7CisKKwkvKiBUaGUgSVB2NiBzY29wZSBpcyByZWFsbHkgYSBzZXQgb2YgYml0IGZpZWxkcy4KKwkgKiBTZWUgSUZBXyogaW4gPG5ldC9pZl9pbmV0Ni5oPi4gIE1hcCB0byBhIGdlbmVyaWMgU0NUUCBzY29wZS4KKwkgKi8KKworCXY2c2NvcGUgPSBpcHY2X2FkZHJfc2NvcGUoJmFkZHItPnY2LnNpbjZfYWRkcik7CisJc3dpdGNoICh2NnNjb3BlKSB7CisJY2FzZSBJRkFfSE9TVDoKKwkJcmV0dmFsID0gU0NUUF9TQ09QRV9MT09QQkFDSzsKKwkJYnJlYWs7CisJY2FzZSBJRkFfTElOSzoKKwkJcmV0dmFsID0gU0NUUF9TQ09QRV9MSU5LOworCQlicmVhazsKKwljYXNlIElGQV9TSVRFOgorCQlyZXR2YWwgPSBTQ1RQX1NDT1BFX1BSSVZBVEU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHZhbCA9IFNDVFBfU0NPUEVfR0xPQkFMOworCQlicmVhazsKKwl9OworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHNrIGZvciB0aGUgc29ja2V0IHRvIGJlIHJldHVybmVkIGJ5IGFjY2VwdCgpLiAqLworc3RhdGljIHN0cnVjdCBzb2NrICpzY3RwX3Y2X2NyZWF0ZV9hY2NlcHRfc2soc3RydWN0IHNvY2sgKnNrLAorCQkJCQkgICAgIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlzdHJ1Y3Qgc29jayAqbmV3c2s7CisJc3RydWN0IGluZXRfc29jayAqbmV3aW5ldDsKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbmV3bnAsICpucCA9IGluZXQ2X3NrKHNrKTsKKwlzdHJ1Y3Qgc2N0cDZfc29jayAqbmV3c2N0cDZzazsKKworCW5ld3NrID0gc2tfYWxsb2MoUEZfSU5FVDYsIEdGUF9LRVJORUwsIHNrLT5za19wcm90LCAxKTsKKwlpZiAoIW5ld3NrKQorCQlnb3RvIG91dDsKKworCXNvY2tfaW5pdF9kYXRhKE5VTEwsIG5ld3NrKTsKKworCW5ld3NrLT5za190eXBlID0gU09DS19TVFJFQU07CisKKwluZXdzay0+c2tfcHJvdCA9IHNrLT5za19wcm90OworCW5ld3NrLT5za19ub19jaGVjayA9IHNrLT5za19ub19jaGVjazsKKwluZXdzay0+c2tfcmV1c2UgPSBzay0+c2tfcmV1c2U7CisKKwluZXdzay0+c2tfZGVzdHJ1Y3QgPSBpbmV0X3NvY2tfZGVzdHJ1Y3Q7CisJbmV3c2stPnNrX2ZhbWlseSA9IFBGX0lORVQ2OworCW5ld3NrLT5za19wcm90b2NvbCA9IElQUFJPVE9fU0NUUDsKKwluZXdzay0+c2tfYmFja2xvZ19yY3YgPSBzay0+c2tfcHJvdC0+YmFja2xvZ19yY3Y7CisJbmV3c2stPnNrX3NodXRkb3duID0gc2stPnNrX3NodXRkb3duOworCXNvY2tfcmVzZXRfZmxhZyhzaywgU09DS19aQVBQRUQpOworCisJbmV3c2N0cDZzayA9IChzdHJ1Y3Qgc2N0cDZfc29jayAqKW5ld3NrOworCWluZXRfc2sobmV3c2spLT5waW5ldDYgPSAmbmV3c2N0cDZzay0+aW5ldDY7CisKKwluZXdpbmV0ID0gaW5ldF9zayhuZXdzayk7CisJbmV3bnAgPSBpbmV0Nl9zayhuZXdzayk7CisKKwltZW1jcHkobmV3bnAsIG5wLCBzaXplb2Yoc3RydWN0IGlwdjZfcGluZm8pKTsKKworCS8qIEluaXRpYWxpemUgc2sncyBzcG9ydCwgZHBvcnQsIHJjdl9zYWRkciBhbmQgZGFkZHIgZm9yIGdldHNvY2tuYW1lKCkKKwkgKiBhbmQgZ2V0cGVlcm5hbWUoKS4KKwkgKi8KKwluZXdpbmV0LT5zcG9ydCA9IGluZXQtPnNwb3J0OworCW5ld25wLT5zYWRkciA9IG5wLT5zYWRkcjsKKwluZXducC0+cmN2X3NhZGRyID0gbnAtPnJjdl9zYWRkcjsKKwluZXdpbmV0LT5kcG9ydCA9IGh0b25zKGFzb2MtPnBlZXIucG9ydCk7CisJc2N0cF92Nl90b19za19kYWRkcigmYXNvYy0+cGVlci5wcmltYXJ5X2FkZHIsIG5ld3NrKTsKKworCS8qIEluaXQgdGhlIGlwdjQgcGFydCBvZiB0aGUgc29ja2V0IHNpbmNlIHdlIGNhbiBoYXZlIHNvY2tldHMKKwkgKiB1c2luZyB2NiBBUEkgZm9yIGlwdjQuCisJICovCisJbmV3aW5ldC0+dWNfdHRsID0gLTE7CisJbmV3aW5ldC0+bWNfbG9vcCA9IDE7CisJbmV3aW5ldC0+bWNfdHRsID0gMTsKKwluZXdpbmV0LT5tY19pbmRleCA9IDA7CisJbmV3aW5ldC0+bWNfbGlzdCA9IE5VTEw7CisKKwlpZiAoaXB2NF9jb25maWcubm9fcG10dV9kaXNjKQorCQluZXdpbmV0LT5wbXR1ZGlzYyA9IElQX1BNVFVESVNDX0RPTlQ7CisJZWxzZQorCQluZXdpbmV0LT5wbXR1ZGlzYyA9IElQX1BNVFVESVNDX1dBTlQ7CisKKyNpZmRlZiBJTkVUX1JFRkNOVF9ERUJVRworCWF0b21pY19pbmMoJmluZXQ2X3NvY2tfbnIpOworCWF0b21pY19pbmMoJmluZXRfc29ja19ucik7CisjZW5kaWYKKworCWlmIChuZXdzay0+c2tfcHJvdC0+aW5pdChuZXdzaykpIHsKKwkJc2tfY29tbW9uX3JlbGVhc2UobmV3c2spOworCQluZXdzayA9IE5VTEw7CisJfQorCitvdXQ6CisJcmV0dXJuIG5ld3NrOworfQorCisvKiBNYXAgdjQgYWRkcmVzcyB0byBtYXBwZWQgdjYgYWRkcmVzcyAqLworc3RhdGljIHZvaWQgc2N0cF92Nl9hZGRyX3Y0bWFwKHN0cnVjdCBzY3RwX3NvY2sgKnNwLCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIpCit7CisJaWYgKHNwLT52NG1hcHBlZCAmJiBBRl9JTkVUID09IGFkZHItPnNhLnNhX2ZhbWlseSkKKwkJc2N0cF92NF9tYXBfdjYoYWRkcik7Cit9CisKKy8qIFdoZXJlIGRpZCB0aGlzIHNrYiBjb21lIGZyb20/ICAqLworc3RhdGljIGludCBzY3RwX3Y2X3NrYl9paWYoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCA9IChzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKikgc2tiLT5jYjsKKwlyZXR1cm4gb3B0LT5paWY7Cit9CisKKy8qIFdhcyB0aGlzIHBhY2tldCBtYXJrZWQgYnkgRXhwbGljaXQgQ29uZ2VzdGlvbiBOb3RpZmljYXRpb24/ICovCitzdGF0aWMgaW50IHNjdHBfdjZfaXNfY2UoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKigoX191MzIgKikoc2tiLT5uaC5pcHY2aCkpICYgaHRvbmwoMTw8MjApOworfQorCisvKiBEdW1wIHRoZSB2NiBhZGRyIHRvIHRoZSBzZXEgZmlsZS4gKi8KK3N0YXRpYyB2b2lkIHNjdHBfdjZfc2VxX2R1bXBfYWRkcihzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdW5pb24gc2N0cF9hZGRyICphZGRyKQoreworCXNlcV9wcmludGYoc2VxLCAiJTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4ICIsCisJCSAgIE5JUDYoYWRkci0+djYuc2luNl9hZGRyKSk7Cit9CisKKy8qIEluaXRpYWxpemUgYSBQRl9JTkVUNiBzb2NrZXQgbXNnX25hbWUuICovCitzdGF0aWMgdm9pZCBzY3RwX2luZXQ2X21zZ25hbWUoY2hhciAqbXNnbmFtZSwgaW50ICphZGRyX2xlbikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42OworCisJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopbXNnbmFtZTsKKwlzaW42LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCXNpbjYtPnNpbjZfZmxvd2luZm8gPSAwOworCXNpbjYtPnNpbjZfc2NvcGVfaWQgPSAwOyAvKkZJWE1FICovCisJKmFkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworfQorCisvKiBJbml0aWFsaXplIGEgUEZfSU5FVCBtc2duYW1lIGZyb20gYSB1bHBldmVudC4gKi8KK3N0YXRpYyB2b2lkIHNjdHBfaW5ldDZfZXZlbnRfbXNnbmFtZShzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQsCisJCQkJICAgICBjaGFyICptc2duYW1lLCBpbnQgKmFkZHJsZW4pCit7CisJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNiwgKnNpbjZmcm9tOworCisJaWYgKG1zZ25hbWUpIHsKKwkJdW5pb24gc2N0cF9hZGRyICphZGRyOworCQlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKKworCQlhc29jID0gZXZlbnQtPmFzb2M7CisJCXNjdHBfaW5ldDZfbXNnbmFtZShtc2duYW1lLCBhZGRybGVuKTsKKwkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopbXNnbmFtZTsKKwkJc2luNi0+c2luNl9wb3J0ID0gaHRvbnMoYXNvYy0+cGVlci5wb3J0KTsKKwkJYWRkciA9ICZhc29jLT5wZWVyLnByaW1hcnlfYWRkcjsKKworCQkvKiBOb3RlOiBJZiB3ZSBnbyB0byBhIGNvbW1vbiB2NiBmb3JtYXQsIHRoaXMgY29kZQorCQkgKiB3aWxsIGNoYW5nZS4KKwkJICovCisKKwkJLyogTWFwIGlwdjQgYWRkcmVzcyBpbnRvIHY0LW1hcHBlZC1vbi12NiBhZGRyZXNzLiAgKi8KKwkJaWYgKHNjdHBfc2soYXNvYy0+YmFzZS5zayktPnY0bWFwcGVkICYmCisJCSAgICBBRl9JTkVUID09IGFkZHItPnNhLnNhX2ZhbWlseSkgeworCQkJc2N0cF92NF9tYXBfdjYoKHVuaW9uIHNjdHBfYWRkciAqKXNpbjYpOworCQkJc2luNi0+c2luNl9hZGRyLnM2X2FkZHIzMlszXSA9CisJCQkJYWRkci0+djQuc2luX2FkZHIuc19hZGRyOworCQkJcmV0dXJuOworCQl9CisKKwkJc2luNmZyb20gPSAmYXNvYy0+cGVlci5wcmltYXJ5X2FkZHIudjY7CisJCWlwdjZfYWRkcl9jb3B5KCZzaW42LT5zaW42X2FkZHIsICZzaW42ZnJvbS0+c2luNl9hZGRyKTsKKwkJaWYgKGlwdjZfYWRkcl90eXBlKCZzaW42LT5zaW42X2FkZHIpICYgSVBWNl9BRERSX0xJTktMT0NBTCkKKwkJCXNpbjYtPnNpbjZfc2NvcGVfaWQgPSBzaW42ZnJvbS0+c2luNl9zY29wZV9pZDsKKwl9Cit9CisKKy8qIEluaXRpYWxpemUgYSBtc2dfbmFtZSBmcm9tIGFuIGluYm91bmQgc2tiLiAqLworc3RhdGljIHZvaWQgc2N0cF9pbmV0Nl9za2JfbXNnbmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjaGFyICptc2duYW1lLAorCQkJCSAgIGludCAqYWRkcl9sZW4pCit7CisJc3RydWN0IHNjdHBoZHIgKnNoOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjY7CisKKwlpZiAobXNnbmFtZSkgeworCQlzY3RwX2luZXQ2X21zZ25hbWUobXNnbmFtZSwgYWRkcl9sZW4pOworCQlzaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKiltc2duYW1lOworCQlzaCA9IChzdHJ1Y3Qgc2N0cGhkciAqKXNrYi0+aC5yYXc7CisJCXNpbjYtPnNpbjZfcG9ydCA9IHNoLT5zb3VyY2U7CisKKwkJLyogTWFwIGlwdjQgYWRkcmVzcyBpbnRvIHY0LW1hcHBlZC1vbi12NiBhZGRyZXNzLiAqLworCQlpZiAoc2N0cF9zayhza2ItPnNrKS0+djRtYXBwZWQgJiYKKwkJICAgIHNrYi0+bmguaXBoLT52ZXJzaW9uID09IDQpIHsKKwkJCXNjdHBfdjRfbWFwX3Y2KCh1bmlvbiBzY3RwX2FkZHIgKilzaW42KTsKKwkJCXNpbjYtPnNpbjZfYWRkci5zNl9hZGRyMzJbM10gPSBza2ItPm5oLmlwaC0+c2FkZHI7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBPdGhlcndpc2UsIGp1c3QgY29weSB0aGUgdjYgYWRkcmVzcy4gKi8KKwkJaXB2Nl9hZGRyX2NvcHkoJnNpbjYtPnNpbjZfYWRkciwgJnNrYi0+bmguaXB2NmgtPnNhZGRyKTsKKwkJaWYgKGlwdjZfYWRkcl90eXBlKCZzaW42LT5zaW42X2FkZHIpICYgSVBWNl9BRERSX0xJTktMT0NBTCkgeworCQkJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ID0gc2N0cF9za2IyZXZlbnQoc2tiKTsKKwkJCXNpbjYtPnNpbjZfc2NvcGVfaWQgPSBldi0+aWlmOworCQl9CisJfQorfQorCisvKiBEbyB3ZSBzdXBwb3J0IHRoaXMgQUY/ICovCitzdGF0aWMgaW50IHNjdHBfaW5ldDZfYWZfc3VwcG9ydGVkKHNhX2ZhbWlseV90IGZhbWlseSwgc3RydWN0IHNjdHBfc29jayAqc3ApCit7CisJc3dpdGNoIChmYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ2OgorCQlyZXR1cm4gMTsKKwkvKiB2NC1tYXBwZWQtdjYgYWRkcmVzc2VzICovCisJY2FzZSBBRl9JTkVUOgorCQlpZiAoIV9faXB2Nl9vbmx5X3NvY2soc2N0cF9vcHQyc2soc3ApKSAmJiBzcC0+djRtYXBwZWQpCisJCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qIEFkZHJlc3MgbWF0Y2hpbmcgd2l0aCB3aWxkY2FyZHMgYWxsb3dlZC4gIFRoaXMgZXh0cmEgbGV2ZWwKKyAqIG9mIGluZGlyZWN0aW9uIGxldHMgdXMgY2hvb3NlIHdoZXRoZXIgYSBQRl9JTkVUNiBzaG91bGQKKyAqIGRpc2FsbG93IGFueSB2NCBhZGRyZXNzZXMgaWYgd2Ugc28gY2hvb3NlLgorICovCitzdGF0aWMgaW50IHNjdHBfaW5ldDZfY21wX2FkZHIoY29uc3QgdW5pb24gc2N0cF9hZGRyICphZGRyMSwKKwkJCSAgICAgICBjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIyLAorCQkJICAgICAgIHN0cnVjdCBzY3RwX3NvY2sgKm9wdCkKK3sKKwlzdHJ1Y3Qgc2N0cF9hZiAqYWYxLCAqYWYyOworCisJYWYxID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoYWRkcjEtPnNhLnNhX2ZhbWlseSk7CisJYWYyID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoYWRkcjItPnNhLnNhX2ZhbWlseSk7CisKKwlpZiAoIWFmMSB8fCAhYWYyKQorCQlyZXR1cm4gMDsKKwkvKiBUb2RheSwgd2lsZGNhcmQgQUZfSU5FVC9BRl9JTkVUNi4gKi8KKwlpZiAoc2N0cF9pc19hbnkoYWRkcjEpIHx8IHNjdHBfaXNfYW55KGFkZHIyKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoYWRkcjEtPnNhLnNhX2ZhbWlseSAhPSBhZGRyMi0+c2Euc2FfZmFtaWx5KQorCQlyZXR1cm4gMDsKKworCXJldHVybiBhZjEtPmNtcF9hZGRyKGFkZHIxLCBhZGRyMik7Cit9CisKKy8qIFZlcmlmeSB0aGF0IHRoZSBwcm92aWRlZCBzb2NrYWRkciBsb29rcyBiaW5kYWJsZS4gICBDb21tb24gdmVyaWZpY2F0aW9uLAorICogaGFzIGFscmVhZHkgYmVlbiB0YWtlbiBjYXJlIG9mLgorICovCitzdGF0aWMgaW50IHNjdHBfaW5ldDZfYmluZF92ZXJpZnkoc3RydWN0IHNjdHBfc29jayAqb3B0LCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIpCit7CisJc3RydWN0IHNjdHBfYWYgKmFmOworCisJLyogQVNTRVJUOiBhZGRyZXNzIGZhbWlseSBoYXMgYWxyZWFkeSBiZWVuIHZlcmlmaWVkLiAqLworCWlmIChhZGRyLT5zYS5zYV9mYW1pbHkgIT0gQUZfSU5FVDYpCisJCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoYWRkci0+c2Euc2FfZmFtaWx5KTsKKwllbHNlIHsKKwkJc3RydWN0IHNvY2sgKnNrOworCQlpbnQgdHlwZSA9IGlwdjZfYWRkcl90eXBlKCZhZGRyLT52Ni5zaW42X2FkZHIpOworCQlzayA9IHNjdHBfb3B0MnNrKG9wdCk7CisJCWlmICh0eXBlICYgSVBWNl9BRERSX0xJTktMT0NBTCkgeworCQkJLyogTm90ZTogQmVoYXZpb3Igc2ltaWxhciB0byBhZl9pbmV0Ni5jOgorCQkJICogIDEpIE92ZXJyaWRlcyBwcmV2aW91cyBib3VuZF9kZXZfaWYKKwkJCSAqICAyKSBEZXN0cnVjdGl2ZSBldmVuIGlmIGJpbmQgaXNuJ3Qgc3VjY2Vzc2Z1bC4KKwkJCSAqLworCisJCQlpZiAoYWRkci0+djYuc2luNl9zY29wZV9pZCkKKwkJCQlzay0+c2tfYm91bmRfZGV2X2lmID0gYWRkci0+djYuc2luNl9zY29wZV9pZDsKKwkJCWlmICghc2stPnNrX2JvdW5kX2Rldl9pZikKKwkJCQlyZXR1cm4gMDsKKwkJfQorCQlhZiA9IG9wdC0+cGYtPmFmOworCX0KKwlyZXR1cm4gYWYtPmF2YWlsYWJsZShhZGRyLCBvcHQpOworfQorCisvKiBWZXJpZnkgdGhhdCB0aGUgcHJvdmlkZWQgc29ja2FkZHIgbG9va3MgYmluZGFibGUuICAgQ29tbW9uIHZlcmlmaWNhdGlvbiwKKyAqIGhhcyBhbHJlYWR5IGJlZW4gdGFrZW4gY2FyZSBvZi4KKyAqLworc3RhdGljIGludCBzY3RwX2luZXQ2X3NlbmRfdmVyaWZ5KHN0cnVjdCBzY3RwX3NvY2sgKm9wdCwgdW5pb24gc2N0cF9hZGRyICphZGRyKQoreworCXN0cnVjdCBzY3RwX2FmICphZiA9IE5VTEw7CisKKwkvKiBBU1NFUlQ6IGFkZHJlc3MgZmFtaWx5IGhhcyBhbHJlYWR5IGJlZW4gdmVyaWZpZWQuICovCisJaWYgKGFkZHItPnNhLnNhX2ZhbWlseSAhPSBBRl9JTkVUNikKKwkJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhhZGRyLT5zYS5zYV9mYW1pbHkpOworCWVsc2UgeworCQlzdHJ1Y3Qgc29jayAqc2s7CisJCWludCB0eXBlID0gaXB2Nl9hZGRyX3R5cGUoJmFkZHItPnY2LnNpbjZfYWRkcik7CisJCXNrID0gc2N0cF9vcHQyc2sob3B0KTsKKwkJaWYgKHR5cGUgJiBJUFY2X0FERFJfTElOS0xPQ0FMKSB7CisJCQkvKiBOb3RlOiBCZWhhdmlvciBzaW1pbGFyIHRvIGFmX2luZXQ2LmM6CisJCQkgKiAgMSkgT3ZlcnJpZGVzIHByZXZpb3VzIGJvdW5kX2Rldl9pZgorCQkJICogIDIpIERlc3RydWN0aXZlIGV2ZW4gaWYgYmluZCBpc24ndCBzdWNjZXNzZnVsLgorCQkJICovCisKKwkJCWlmIChhZGRyLT52Ni5zaW42X3Njb3BlX2lkKQorCQkJCXNrLT5za19ib3VuZF9kZXZfaWYgPSBhZGRyLT52Ni5zaW42X3Njb3BlX2lkOworCQkJaWYgKCFzay0+c2tfYm91bmRfZGV2X2lmKQorCQkJCXJldHVybiAwOworCQl9CisJCWFmID0gb3B0LT5wZi0+YWY7CisJfQorCisJcmV0dXJuIGFmICE9IE5VTEw7Cit9CisKKy8qIEZpbGwgaW4gU3VwcG9ydGVkIEFkZHJlc3MgVHlwZSBpbmZvcm1hdGlvbiBmb3IgSU5JVCBhbmQgSU5JVC1BQ0sKKyAqIGNodW5rcy4gICBOb3RlOiBJbiB0aGUgZnV0dXJlLCB3ZSBtYXkgd2FudCB0byBsb29rIGF0IHNvY2sgb3B0aW9ucworICogdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBQRl9JTkVUNiBzb2NrZXQgcmVhbGx5IHdhbnRzIHRvIGhhdmUgSVBWNAorICogYWRkcmVzc2VzLgorICogUmV0dXJucyBudW1iZXIgb2YgYWRkcmVzc2VzIHN1cHBvcnRlZC4KKyAqLworc3RhdGljIGludCBzY3RwX2luZXQ2X3N1cHBvcnRlZF9hZGRycyhjb25zdCBzdHJ1Y3Qgc2N0cF9zb2NrICpvcHQsCisJCQkJICAgICAgX191MTYgKnR5cGVzKQoreworCXR5cGVzWzBdID0gU0NUUF9QQVJBTV9JUFY0X0FERFJFU1M7CisJdHlwZXNbMV0gPSBTQ1RQX1BBUkFNX0lQVjZfQUREUkVTUzsKKwlyZXR1cm4gMjsKK30KKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgaW5ldDZfc2VxcGFja2V0X29wcyA9IHsKKwkuZmFtaWx5ICAgICA9IFBGX0lORVQ2LAorCS5vd25lciAgICAgID0gVEhJU19NT0RVTEUsCisJLnJlbGVhc2UgICAgPSBpbmV0Nl9yZWxlYXNlLAorCS5iaW5kICAgICAgID0gaW5ldDZfYmluZCwKKwkuY29ubmVjdCAgICA9IGluZXRfZGdyYW1fY29ubmVjdCwKKwkuc29ja2V0cGFpciA9IHNvY2tfbm9fc29ja2V0cGFpciwKKwkuYWNjZXB0ICAgICA9IGluZXRfYWNjZXB0LAorCS5nZXRuYW1lICAgID0gaW5ldDZfZ2V0bmFtZSwKKwkucG9sbCAgICAgICA9IHNjdHBfcG9sbCwKKwkuaW9jdGwgICAgICA9IGluZXQ2X2lvY3RsLAorCS5saXN0ZW4gICAgID0gc2N0cF9pbmV0X2xpc3RlbiwKKwkuc2h1dGRvd24gICA9IGluZXRfc2h1dGRvd24sCisJLnNldHNvY2tvcHQgPSBzb2NrX2NvbW1vbl9zZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0ID0gc29ja19jb21tb25fZ2V0c29ja29wdCwKKwkuc2VuZG1zZyAgICA9IGluZXRfc2VuZG1zZywKKwkucmVjdm1zZyAgICA9IHNvY2tfY29tbW9uX3JlY3Ztc2csCisJLm1tYXAgICAgICAgPSBzb2NrX25vX21tYXAsCit9OworCitzdGF0aWMgc3RydWN0IGluZXRfcHJvdG9zdyBzY3RwdjZfc2VxcGFja2V0X3Byb3Rvc3cgPSB7CisJLnR5cGUgICAgICAgICAgPSBTT0NLX1NFUVBBQ0tFVCwKKwkucHJvdG9jb2wgICAgICA9IElQUFJPVE9fU0NUUCwKKwkucHJvdCAJICAgICAgID0gJnNjdHB2Nl9wcm90LAorCS5vcHMgICAgICAgICAgID0gJmluZXQ2X3NlcXBhY2tldF9vcHMsCisJLmNhcGFiaWxpdHkgICAgPSAtMSwKKwkubm9fY2hlY2sgICAgICA9IDAsCisJLmZsYWdzICAgICAgICAgPSBTQ1RQX1BST1RPU1dfRkxBRworfTsKK3N0YXRpYyBzdHJ1Y3QgaW5ldF9wcm90b3N3IHNjdHB2Nl9zdHJlYW1fcHJvdG9zdyA9IHsKKwkudHlwZSAgICAgICAgICA9IFNPQ0tfU1RSRUFNLAorCS5wcm90b2NvbCAgICAgID0gSVBQUk9UT19TQ1RQLAorCS5wcm90IAkgICAgICAgPSAmc2N0cHY2X3Byb3QsCisJLm9wcyAgICAgICAgICAgPSAmaW5ldDZfc2VxcGFja2V0X29wcywKKwkuY2FwYWJpbGl0eSAgICA9IC0xLAorCS5ub19jaGVjayAgICAgID0gMCwKKwkuZmxhZ3MgICAgICAgICA9IFNDVFBfUFJPVE9TV19GTEFHLAorfTsKKworc3RhdGljIGludCBzY3RwNl9yY3Yoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCB1bnNpZ25lZCBpbnQgKm5ob2ZmcCkKK3sKKwlyZXR1cm4gc2N0cF9yY3YoKnBza2IpID8gLTEgOiAwOworfQorCitzdGF0aWMgc3RydWN0IGluZXQ2X3Byb3RvY29sIHNjdHB2Nl9wcm90b2NvbCA9IHsKKwkuaGFuZGxlciAgICAgID0gc2N0cDZfcmN2LAorCS5lcnJfaGFuZGxlciAgPSBzY3RwX3Y2X2VyciwKKwkuZmxhZ3MgICAgICAgID0gSU5FVDZfUFJPVE9fTk9QT0xJQ1kgfCBJTkVUNl9QUk9UT19GSU5BTCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2N0cF9hZiBzY3RwX2lwdjZfc3BlY2lmaWMgPSB7CisJLnNjdHBfeG1pdCAgICAgICA9IHNjdHBfdjZfeG1pdCwKKwkuc2V0c29ja29wdCAgICAgID0gaXB2Nl9zZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0ICAgICAgPSBpcHY2X2dldHNvY2tvcHQsCisJLmdldF9kc3QJID0gc2N0cF92Nl9nZXRfZHN0LAorCS5nZXRfc2FkZHIJID0gc2N0cF92Nl9nZXRfc2FkZHIsCisJLmNvcHlfYWRkcmxpc3QgICA9IHNjdHBfdjZfY29weV9hZGRybGlzdCwKKwkuZnJvbV9za2IgICAgICAgID0gc2N0cF92Nl9mcm9tX3NrYiwKKwkuZnJvbV9zayAgICAgICAgID0gc2N0cF92Nl9mcm9tX3NrLAorCS50b19za19zYWRkciAgICAgPSBzY3RwX3Y2X3RvX3NrX3NhZGRyLAorCS50b19za19kYWRkciAgICAgPSBzY3RwX3Y2X3RvX3NrX2RhZGRyLAorCS5mcm9tX2FkZHJfcGFyYW0gPSBzY3RwX3Y2X2Zyb21fYWRkcl9wYXJhbSwKKwkudG9fYWRkcl9wYXJhbSAgID0gc2N0cF92Nl90b19hZGRyX3BhcmFtLAorCS5kc3Rfc2FkZHIgICAgICAgPSBzY3RwX3Y2X2RzdF9zYWRkciwKKwkuY21wX2FkZHIgICAgICAgID0gc2N0cF92Nl9jbXBfYWRkciwKKwkuc2NvcGUgICAgICAgICAgID0gc2N0cF92Nl9zY29wZSwKKwkuYWRkcl92YWxpZCAgICAgID0gc2N0cF92Nl9hZGRyX3ZhbGlkLAorCS5pbmFkZHJfYW55ICAgICAgPSBzY3RwX3Y2X2luYWRkcl9hbnksCisJLmlzX2FueSAgICAgICAgICA9IHNjdHBfdjZfaXNfYW55LAorCS5hdmFpbGFibGUgICAgICAgPSBzY3RwX3Y2X2F2YWlsYWJsZSwKKwkuc2tiX2lpZiAgICAgICAgID0gc2N0cF92Nl9za2JfaWlmLAorCS5pc19jZSAgICAgICAgICAgPSBzY3RwX3Y2X2lzX2NlLAorCS5zZXFfZHVtcF9hZGRyICAgPSBzY3RwX3Y2X3NlcV9kdW1wX2FkZHIsCisJLm5ldF9oZWFkZXJfbGVuICA9IHNpemVvZihzdHJ1Y3QgaXB2NmhkciksCisJLnNvY2thZGRyX2xlbiAgICA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSwKKwkuc2FfZmFtaWx5ICAgICAgID0gQUZfSU5FVDYsCit9OworCitzdGF0aWMgc3RydWN0IHNjdHBfcGYgc2N0cF9wZl9pbmV0Nl9zcGVjaWZpYyA9IHsKKwkuZXZlbnRfbXNnbmFtZSA9IHNjdHBfaW5ldDZfZXZlbnRfbXNnbmFtZSwKKwkuc2tiX21zZ25hbWUgICA9IHNjdHBfaW5ldDZfc2tiX21zZ25hbWUsCisJLmFmX3N1cHBvcnRlZCAgPSBzY3RwX2luZXQ2X2FmX3N1cHBvcnRlZCwKKwkuY21wX2FkZHIgICAgICA9IHNjdHBfaW5ldDZfY21wX2FkZHIsCisJLmJpbmRfdmVyaWZ5ICAgPSBzY3RwX2luZXQ2X2JpbmRfdmVyaWZ5LAorCS5zZW5kX3ZlcmlmeSAgID0gc2N0cF9pbmV0Nl9zZW5kX3ZlcmlmeSwKKwkuc3VwcG9ydGVkX2FkZHJzID0gc2N0cF9pbmV0Nl9zdXBwb3J0ZWRfYWRkcnMsCisJLmNyZWF0ZV9hY2NlcHRfc2sgPSBzY3RwX3Y2X2NyZWF0ZV9hY2NlcHRfc2ssCisJLmFkZHJfdjRtYXAgICAgPSBzY3RwX3Y2X2FkZHJfdjRtYXAsCisJLmFmICAgICAgICAgICAgPSAmc2N0cF9pcHY2X3NwZWNpZmljLAorfTsKKworLyogSW5pdGlhbGl6ZSBJUHY2IHN1cHBvcnQgYW5kIHJlZ2lzdGVyIHdpdGggaW5ldDYgc3RhY2suICAqLworaW50IHNjdHBfdjZfaW5pdCh2b2lkKQoreworCWludCByYyA9IHByb3RvX3JlZ2lzdGVyKCZzY3RwdjZfcHJvdCwgMSk7CisKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCS8qIFJlZ2lzdGVyIGluZXQ2IHByb3RvY29sLiAqLworCXJjID0gLUVBR0FJTjsKKwlpZiAoaW5ldDZfYWRkX3Byb3RvY29sKCZzY3RwdjZfcHJvdG9jb2wsIElQUFJPVE9fU0NUUCkgPCAwKQorCQlnb3RvIG91dF91bnJlZ2lzdGVyX3NjdHBfcHJvdG87CisKKwkvKiBBZGQgU0NUUHY2KFVEUCBhbmQgVENQIHN0eWxlKSB0byBpbmV0c3c2IGxpbmtlZCBsaXN0LiAqLworCWluZXQ2X3JlZ2lzdGVyX3Byb3Rvc3coJnNjdHB2Nl9zZXFwYWNrZXRfcHJvdG9zdyk7CisJaW5ldDZfcmVnaXN0ZXJfcHJvdG9zdygmc2N0cHY2X3N0cmVhbV9wcm90b3N3KTsKKworCS8qIFJlZ2lzdGVyIHRoZSBTQ1RQIHNwZWNpZmljIFBGX0lORVQ2IGZ1bmN0aW9ucy4gKi8KKwlzY3RwX3JlZ2lzdGVyX3BmKCZzY3RwX3BmX2luZXQ2X3NwZWNpZmljLCBQRl9JTkVUNik7CisKKwkvKiBSZWdpc3RlciB0aGUgU0NUUCBzcGVjaWZpYyBBRl9JTkVUNiBmdW5jdGlvbnMuICovCisJc2N0cF9yZWdpc3Rlcl9hZigmc2N0cF9pcHY2X3NwZWNpZmljKTsKKworCS8qIFJlZ2lzdGVyIG5vdGlmaWVyIGZvciBpbmV0NiBhZGRyZXNzIGFkZGl0aW9ucy9kZWxldGlvbnMuICovCisJcmVnaXN0ZXJfaW5ldDZhZGRyX25vdGlmaWVyKCZzY3RwX2luZXQ2YWRkcl9ub3RpZmllcik7CisJcmMgPSAwOworb3V0OgorCXJldHVybiByYzsKK291dF91bnJlZ2lzdGVyX3NjdHBfcHJvdG86CisJcHJvdG9fdW5yZWdpc3Rlcigmc2N0cHY2X3Byb3QpOworCWdvdG8gb3V0OworfQorCisvKiBJUHY2IHNwZWNpZmljIGV4aXQgc3VwcG9ydC4gKi8KK3ZvaWQgc2N0cF92Nl9leGl0KHZvaWQpCit7CisJbGlzdF9kZWwoJnNjdHBfaXB2Nl9zcGVjaWZpYy5saXN0KTsKKwlpbmV0Nl9kZWxfcHJvdG9jb2woJnNjdHB2Nl9wcm90b2NvbCwgSVBQUk9UT19TQ1RQKTsKKwlpbmV0Nl91bnJlZ2lzdGVyX3Byb3Rvc3coJnNjdHB2Nl9zZXFwYWNrZXRfcHJvdG9zdyk7CisJaW5ldDZfdW5yZWdpc3Rlcl9wcm90b3N3KCZzY3RwdjZfc3RyZWFtX3Byb3Rvc3cpOworCXVucmVnaXN0ZXJfaW5ldDZhZGRyX25vdGlmaWVyKCZzY3RwX2luZXQ2YWRkcl9ub3RpZmllcik7CisJcHJvdG9fdW5yZWdpc3Rlcigmc2N0cHY2X3Byb3QpOworfQpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvb2JqY250LmMgYi9uZXQvc2N0cC9vYmpjbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzgxZTVkCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjdHAvb2JqY250LmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qIFNDVFAga2VybmVsIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSwgMjAwNAorICogCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgU0NUUCBrZXJuZWwgcmVmZXJlbmNlIEltcGxlbWVudGF0aW9uCisgKiAKKyAqIFN1cHBvcnQgZm9yIG1lbW9yeSBvYmplY3QgZGVidWdnaW5nLiAgVGhpcyBhbGxvd3Mgb25lIHRvIG1vbml0b3IgdGhlCisgKiBvYmplY3QgYWxsb2NhdGlvbnMvZGVhbGxvY2F0aW9ucyBmb3IgdHlwZXMgaW5zdHJ1bWVudGVkIGZvciB0aGlzIAorICogdmlhIHRoZSBwcm9jIGZzLiAKKyAqIAorICogVGhlIFNDVFAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7IAorICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhlIFNDVFAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgCisgKiB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAqICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisgKiAKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqIAorICogT3Igc3VibWl0IGEgYnVnIHJlcG9ydCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgd2Vic2l0ZToKKyAqICAgIGh0dHA6Ly93d3cuc2YubmV0L3Byb2plY3RzL2xrc2N0cAorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6IAorICogICAgSm9uIEdyaW1tICAgICAgICAgICAgIDxqZ3JpbW1AdXMuaWJtLmNvbT4KKyAqIAorICogQW55IGJ1Z3MgcmVwb3J0ZWQgZ2l2ZW4gdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxuZXQvc2N0cC9zY3RwLmg+CisKKy8qCisgKiBHbG9iYWwgY291bnRlcnMgdG8gY291bnQgcmF3IG9iamVjdCBhbGxvY2F0aW9uIGNvdW50cy4KKyAqIFRvIGFkZCBuZXcgY291bnRlcnMsIGNob29zZSBhIHVuaXF1ZSBzdWZmaXggZm9yIHRoZSB2YXJpYWJsZQorICogbmFtZSBhcyB0aGUgaGVscGVyIG1hY3JvcyBrZXkgb2ZmIHRoaXMgc3VmZml4IHRvIG1ha2UKKyAqIGxpZmUgZWFzaWVyIGZvciB0aGUgcHJvZ3JhbW1lci4KKyAqLworCitTQ1RQX0RCR19PQkpDTlQoc29jayk7CitTQ1RQX0RCR19PQkpDTlQoZXApOworU0NUUF9EQkdfT0JKQ05UKHRyYW5zcG9ydCk7CitTQ1RQX0RCR19PQkpDTlQoYXNzb2MpOworU0NUUF9EQkdfT0JKQ05UKGJpbmRfYWRkcik7CitTQ1RQX0RCR19PQkpDTlQoYmluZF9idWNrZXQpOworU0NUUF9EQkdfT0JKQ05UKGNodW5rKTsKK1NDVFBfREJHX09CSkNOVChhZGRyKTsKK1NDVFBfREJHX09CSkNOVChzc25tYXApOworU0NUUF9EQkdfT0JKQ05UKGRhdGFtc2cpOworCisvKiBBbiBhcnJheSB0byBtYWtlIGl0IGVhc3kgdG8gcHJldHR5IHByaW50IHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbgorICogdG8gdGhlIHByb2MgZnMuCisgKi8KK3N0YXRpYyBzY3RwX2RiZ19vYmpjbnRfZW50cnlfdCBzY3RwX2RiZ19vYmpjbnRbXSA9IHsKKwlTQ1RQX0RCR19PQkpDTlRfRU5UUlkoc29jayksCisJU0NUUF9EQkdfT0JKQ05UX0VOVFJZKGVwKSwKKwlTQ1RQX0RCR19PQkpDTlRfRU5UUlkoYXNzb2MpLAorCVNDVFBfREJHX09CSkNOVF9FTlRSWSh0cmFuc3BvcnQpLAorCVNDVFBfREJHX09CSkNOVF9FTlRSWShjaHVuayksCisJU0NUUF9EQkdfT0JKQ05UX0VOVFJZKGJpbmRfYWRkciksCisJU0NUUF9EQkdfT0JKQ05UX0VOVFJZKGJpbmRfYnVja2V0KSwKKwlTQ1RQX0RCR19PQkpDTlRfRU5UUlkoYWRkciksCisJU0NUUF9EQkdfT0JKQ05UX0VOVFJZKHNzbm1hcCksCisJU0NUUF9EQkdfT0JKQ05UX0VOVFJZKGRhdGFtc2cpLAorfTsKKworLyogQ2FsbGJhY2sgZnJvbSBwcm9jZnMgdG8gcmVhZCBvdXQgb2JqY291bnQgaW5mb3JtYXRpb24uCisgKiBXYWxrIHRocm91Z2ggdGhlIGVudHJpZXMgaW4gdGhlIHNjdHBfZGJnX29iamNudCBhcnJheSwgZHVtcGluZworICogdGhlIHJhdyBvYmplY3QgY291bnRzIGZvciBlYWNoIG1vbml0b3JlZCB0eXBlLgorICoKKyAqIFRoaXMgY29kZSB3YXMgbW9kaWZpZWQgZnJvbSBzaW1pbGFyIGNvZGUgaW4gcm91dGUuYworICovCitzdGF0aWMgaW50IHNjdHBfZGJnX29iamNudF9yZWFkKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkJaW50IGxlbmd0aCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbiA9IDA7CisJb2ZmX3QgcG9zID0gMDsKKwlpbnQgZW50cmllczsKKwlpbnQgaTsKKwljaGFyIHRlbXBbMTI4XTsKKworCS8qIEhvdyBtYW55IGVudHJpZXM/ICovCisJZW50cmllcyA9IEFSUkFZX1NJWkUoc2N0cF9kYmdfb2JqY250KTsKKworCS8qIFdhbGsgdGhlIGVudHJpZXMgYW5kIHByaW50IG91dCB0aGUgZGVidWcgaW5mb3JtYXRpb24KKwkgKiBmb3IgcHJvYyBmcy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CisJCXBvcyArPSAxMjg7CisKKwkJLyogU2tpcCBhaGVhZC4gKi8KKwkJaWYgKHBvcyA8PSBvZmZzZXQpIHsKKwkJCWxlbiA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBQcmludCBvdXQgZWFjaCBlbnRyeS4gKi8KKwkJc3ByaW50Zih0ZW1wLCAiJXM6ICVkIiwKKwkJCXNjdHBfZGJnX29iamNudFtpXS5sYWJlbCwKKwkJCWF0b21pY19yZWFkKHNjdHBfZGJnX29iamNudFtpXS5jb3VudGVyKSk7CisKKwkJc3ByaW50ZihidWZmZXIgKyBsZW4sICIlLTEyN3NcbiIsIHRlbXApOworCQlsZW4gKz0gMTI4OworCQlpZiAocG9zID49IG9mZnNldCtsZW5ndGgpCisJCQlnb3RvIGRvbmU7CisJfQorCitkb25lOgorCSpzdGFydCA9IGJ1ZmZlciArIGxlbiAtIChwb3MgLSBvZmZzZXQpOworCWxlbiA9IHBvcyAtIG9mZnNldDsKKwlpZiAobGVuID4gbGVuZ3RoKQorCQlsZW4gPSBsZW5ndGg7CisKKyAgCXJldHVybiBsZW47Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIG9iamNvdW50IGluIHRoZSBwcm9jIGZpbGVzeXN0ZW0uICAqLwordm9pZCBzY3RwX2RiZ19vYmpjbnRfaW5pdCh2b2lkKQoreworCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInNjdHBfZGJnX29iamNudCIsIDAsIHByb2NfbmV0X3NjdHAsCisJCQkgICAgICAgc2N0cF9kYmdfb2JqY250X3JlYWQsIE5VTEwpOworfQorCisvKiBDbGVhbnVwIHRoZSBvYmpjb3VudCBlbnRyeSBpbiB0aGUgcHJvYyBmaWxlc3lzdGVtLiAgKi8KK3ZvaWQgc2N0cF9kYmdfb2JqY250X2V4aXQodm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeSgic2N0cF9kYmdfb2JqY250IiwgcHJvY19uZXRfc2N0cCk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvb3V0cHV0LmMgYi9uZXQvc2N0cC9vdXRwdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDEzZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjdHAvb3V0cHV0LmMKQEAgLTAsMCArMSw2NDYgQEAKKy8qIFNDVFAga2VybmVsIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSwgMjAwNAorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgQ2lzY28sIEluYy4KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIE1vdG9yb2xhLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFNDVFAga2VybmVsIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbgorICoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBoYW5kbGUgb3V0cHV0IHByb2Nlc3NpbmcuCisgKgorICogVGhlIFNDVFAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQKKyAqIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICogICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBQbGVhc2Ugc2VuZCBhbnkgYnVnIHJlcG9ydHMgb3IgZml4ZXMgeW91IG1ha2UgdG8gdGhlCisgKiBlbWFpbCBhZGRyZXNzKGVzKToKKyAqICAgIGxrc2N0cCBkZXZlbG9wZXJzIDxsa3NjdHAtZGV2ZWxvcGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogT3Igc3VibWl0IGEgYnVnIHJlcG9ydCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgd2Vic2l0ZToKKyAqICAgIGh0dHA6Ly93d3cuc2YubmV0L3Byb2plY3RzL2xrc2N0cAorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiAgICBMYSBNb250ZSBILlAuIFlhcnJvbGwgPHBpZ2d5QGFjbS5vcmc+CisgKiAgICBLYXJsIEtudXRzb24gICAgICAgICAgPGthcmxAYXRoZW5hLmNoaWNhZ28uaWwudXM+CisgKiAgICBKb24gR3JpbW0gICAgICAgICAgICAgPGpncmltbUBhdXN0aW4uaWJtLmNvbT4KKyAqICAgIFNyaWRoYXIgU2FtdWRyYWxhICAgICA8c3JpQHVzLmlibS5jb20+CisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgZ2l2ZW4gdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPG5ldC9pbmV0X2Vjbi5oPgorI2luY2x1ZGUgPG5ldC9pY21wLmg+CisKKyNpZm5kZWYgVEVTVF9GUkFNRQorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNlbmRpZiAvKiBURVNUX0ZSQU1FIChub3QgZGVmaW5lZCkgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPiAvKiBmb3Igc2FfZmFtaWx5X3QgKi8KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisjaW5jbHVkZSA8bmV0L3NjdHAvc2N0cC5oPgorI2luY2x1ZGUgPG5ldC9zY3RwL3NtLmg+CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBwcml2YXRlIGhlbHBlcnMuICovCitzdGF0aWMgc2N0cF94bWl0X3Qgc2N0cF9wYWNrZXRfYXBwZW5kX2RhdGEoc3RydWN0IHNjdHBfcGFja2V0ICpwYWNrZXQsCisJCQkJCSAgIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuayk7CisKKy8qIENvbmZpZyBhIHBhY2tldC4KKyAqIFRoaXMgYXBwZWFycyB0byBiZSBhIGZvbGxvd3VwIHNldCBvZiBpbml0aWFsaXphdGlvbnMuCisgKi8KK3N0cnVjdCBzY3RwX3BhY2tldCAqc2N0cF9wYWNrZXRfY29uZmlnKHN0cnVjdCBzY3RwX3BhY2tldCAqcGFja2V0LAorCQkJCSAgICAgICBfX3UzMiB2dGFnLCBpbnQgZWNuX2NhcGFibGUpCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rID0gTlVMTDsKKworCVNDVFBfREVCVUdfUFJJTlRLKCIlczogcGFja2V0OiVwIHZ0YWc6MHgleFxuIiwgX19GVU5DVElPTl9fLAorCQkJICBwYWNrZXQsIHZ0YWcpOworCisJcGFja2V0LT52dGFnID0gdnRhZzsKKwlwYWNrZXQtPmhhc19jb29raWVfZWNobyA9IDA7CisJcGFja2V0LT5oYXNfc2FjayA9IDA7CisJcGFja2V0LT5pcGZyYWdvayA9IDA7CisKKwlpZiAoZWNuX2NhcGFibGUgJiYgc2N0cF9wYWNrZXRfZW1wdHkocGFja2V0KSkgeworCQljaHVuayA9IHNjdHBfZ2V0X2VjbmVfcHJlcGVuZChwYWNrZXQtPnRyYW5zcG9ydC0+YXNvYyk7CisKKwkJLyogSWYgdGhlcmUgYSBpcyBhIHByZXBlbmQgY2h1bmsgc3RpY2sgaXQgb24gdGhlIGxpc3QgYmVmb3JlCisJIAkgKiBhbnkgb3RoZXIgY2h1bmtzIGdldCBhcHBlbmRlZC4KKwkgCSAqLworCQlpZiAoY2h1bmspCisJCQlzY3RwX3BhY2tldF9hcHBlbmRfY2h1bmsocGFja2V0LCBjaHVuayk7CisJfQorCisJcmV0dXJuIHBhY2tldDsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgcGFja2V0IHN0cnVjdHVyZS4gKi8KK3N0cnVjdCBzY3RwX3BhY2tldCAqc2N0cF9wYWNrZXRfaW5pdChzdHJ1Y3Qgc2N0cF9wYWNrZXQgKnBhY2tldCwKKwkJCQkgICAgIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0LAorCQkJCSAgICAgX191MTYgc3BvcnQsIF9fdTE2IGRwb3J0KQoreworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jID0gdHJhbnNwb3J0LT5hc29jOworCXNpemVfdCBvdmVyaGVhZDsKKworCVNDVFBfREVCVUdfUFJJTlRLKCIlczogcGFja2V0OiVwIHRyYW5zcG9ydDolcFxuIiwgX19GVU5DVElPTl9fLAorCQkJICBwYWNrZXQsIHRyYW5zcG9ydCk7CisKKwlwYWNrZXQtPnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKwlwYWNrZXQtPnNvdXJjZV9wb3J0ID0gc3BvcnQ7CisJcGFja2V0LT5kZXN0aW5hdGlvbl9wb3J0ID0gZHBvcnQ7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcGFja2V0LT5jaHVua3MpOworCWlmIChhc29jKSB7CisJCXN0cnVjdCBzY3RwX3NvY2sgKnNwID0gc2N0cF9zayhhc29jLT5iYXNlLnNrKTsJCisJCW92ZXJoZWFkID0gc3AtPnBmLT5hZi0+bmV0X2hlYWRlcl9sZW47IAorCX0gZWxzZSB7CisJCW92ZXJoZWFkID0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKKwl9CisJb3ZlcmhlYWQgKz0gc2l6ZW9mKHN0cnVjdCBzY3RwaGRyKTsKKwlwYWNrZXQtPm92ZXJoZWFkID0gb3ZlcmhlYWQ7CisJcGFja2V0LT5zaXplID0gb3ZlcmhlYWQ7CisJcGFja2V0LT52dGFnID0gMDsKKwlwYWNrZXQtPmhhc19jb29raWVfZWNobyA9IDA7CisJcGFja2V0LT5oYXNfc2FjayA9IDA7CisJcGFja2V0LT5pcGZyYWdvayA9IDA7CisJcGFja2V0LT5tYWxsb2NlZCA9IDA7CisJcmV0dXJuIHBhY2tldDsKK30KKworLyogRnJlZSBhIHBhY2tldC4gICovCit2b2lkIHNjdHBfcGFja2V0X2ZyZWUoc3RydWN0IHNjdHBfcGFja2V0ICpwYWNrZXQpCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rOworCisJU0NUUF9ERUJVR19QUklOVEsoIiVzOiBwYWNrZXQ6JXBcbiIsIF9fRlVOQ1RJT05fXywgcGFja2V0KTsKKworICAgICAgICB3aGlsZSAoKGNodW5rID0gKHN0cnVjdCBzY3RwX2NodW5rICopX19za2JfZGVxdWV1ZSgmcGFja2V0LT5jaHVua3MpKSAhPSBOVUxMKQorCQlzY3RwX2NodW5rX2ZyZWUoY2h1bmspOworCisJaWYgKHBhY2tldC0+bWFsbG9jZWQpCisJCWtmcmVlKHBhY2tldCk7Cit9CisKKy8qIFRoaXMgcm91dGluZSB0cmllcyB0byBhcHBlbmQgdGhlIGNodW5rIHRvIHRoZSBvZmZlcmVkIHBhY2tldC4gSWYgYWRkaW5nCisgKiB0aGUgY2h1bmsgY2F1c2VzIHRoZSBwYWNrZXQgdG8gZXhjZWVkIHRoZSBwYXRoIE1UVSBhbmQgQ09PS0lFX0VDSE8gY2h1bmsKKyAqIGlzIG5vdCBwcmVzZW50IGluIHRoZSBwYWNrZXQsIGl0IHRyYW5zbWl0cyB0aGUgaW5wdXQgcGFja2V0LgorICogRGF0YSBjYW4gYmUgYnVuZGxlZCB3aXRoIGEgcGFja2V0IGNvbnRhaW5pbmcgYSBDT09LSUVfRUNITyBjaHVuayBhcyBsb25nCisgKiBhcyBpdCBjYW4gZml0IGluIHRoZSBwYWNrZXQsIGJ1dCBhbnkgbW9yZSBkYXRhIHRoYXQgZG9lcyBub3QgZml0IGluIHRoaXMKKyAqIHBhY2tldCBjYW4gYmUgc2VudCBvbmx5IGFmdGVyIHJlY2VpdmluZyB0aGUgQ09PS0lFX0FDSy4KKyAqLworc2N0cF94bWl0X3Qgc2N0cF9wYWNrZXRfdHJhbnNtaXRfY2h1bmsoc3RydWN0IHNjdHBfcGFja2V0ICpwYWNrZXQsCisJCQkJICAgICAgIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaykKK3sKKwlzY3RwX3htaXRfdCByZXR2YWw7CisJaW50IGVycm9yID0gMDsKKworCVNDVFBfREVCVUdfUFJJTlRLKCIlczogcGFja2V0OiVwIGNodW5rOiVwXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgIHBhY2tldCwgY2h1bmspOworCisJc3dpdGNoICgocmV0dmFsID0gKHNjdHBfcGFja2V0X2FwcGVuZF9jaHVuayhwYWNrZXQsIGNodW5rKSkpKSB7CisJY2FzZSBTQ1RQX1hNSVRfUE1UVV9GVUxMOgorCQlpZiAoIXBhY2tldC0+aGFzX2Nvb2tpZV9lY2hvKSB7CisJCQllcnJvciA9IHNjdHBfcGFja2V0X3RyYW5zbWl0KHBhY2tldCk7CisJCQlpZiAoZXJyb3IgPCAwKQorCQkJCWNodW5rLT5za2ItPnNrLT5za19lcnIgPSAtZXJyb3I7CisKKwkJCS8qIElmIHdlIGhhdmUgYW4gZW1wdHkgcGFja2V0LCB0aGVuIHdlIGNhbiBOT1QgZXZlcgorCQkJICogcmV0dXJuIFBNVFVfRlVMTC4KKwkJCSAqLworCQkJcmV0dmFsID0gc2N0cF9wYWNrZXRfYXBwZW5kX2NodW5rKHBhY2tldCwgY2h1bmspOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTQ1RQX1hNSVRfUldORF9GVUxMOgorCWNhc2UgU0NUUF9YTUlUX09LOgorCWNhc2UgU0NUUF9YTUlUX05BR0xFX0RFTEFZOgorCQlicmVhazsKKwl9OworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogVHJ5IHRvIGJ1bmRsZSBhIFNBQ0sgd2l0aCB0aGUgcGFja2V0LiAqLworc3RhdGljIHNjdHBfeG1pdF90IHNjdHBfcGFja2V0X2J1bmRsZV9zYWNrKHN0cnVjdCBzY3RwX3BhY2tldCAqcGt0LAorCQkJCQkgICBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmspCit7CisJc2N0cF94bWl0X3QgcmV0dmFsID0gU0NUUF9YTUlUX09LOworCisJLyogSWYgc2VuZGluZyBEQVRBIGFuZCBoYXZlbid0IGFsZWFkeSBidW5kbGVkIGEgU0FDSywgdHJ5IHRvCisJICogYnVuZGxlIG9uZSBpbiB0byB0aGUgcGFja2V0LgorCSAqLworCWlmIChzY3RwX2NodW5rX2lzX2RhdGEoY2h1bmspICYmICFwa3QtPmhhc19zYWNrICYmCisJICAgICFwa3QtPmhhc19jb29raWVfZWNobykgeworCQlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKKwkJYXNvYyA9IHBrdC0+dHJhbnNwb3J0LT5hc29jOworCisJCWlmIChhc29jLT5hX3J3bmQgPiBhc29jLT5yd25kKSB7CisJCQlzdHJ1Y3Qgc2N0cF9jaHVuayAqc2FjazsKKwkJCWFzb2MtPmFfcnduZCA9IGFzb2MtPnJ3bmQ7CisJCQlzYWNrID0gc2N0cF9tYWtlX3NhY2soYXNvYyk7CisJCQlpZiAoc2FjaykgeworCQkJCXN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcjsKKwkJCQlyZXR2YWwgPSBzY3RwX3BhY2tldF9hcHBlbmRfY2h1bmsocGt0LCBzYWNrKTsKKwkJCQlhc29jLT5wZWVyLnNhY2tfbmVlZGVkID0gMDsKKwkJCQl0aW1lciA9ICZhc29jLT50aW1lcnNbU0NUUF9FVkVOVF9USU1FT1VUX1NBQ0tdOworCQkJCWlmICh0aW1lcl9wZW5kaW5nKHRpbWVyKSAmJiBkZWxfdGltZXIodGltZXIpKQorCQkJCQlzY3RwX2Fzc29jaWF0aW9uX3B1dChhc29jKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBBcHBlbmQgYSBjaHVuayB0byB0aGUgb2ZmZXJlZCBwYWNrZXQgcmVwb3J0aW5nIGJhY2sgYW55IGluYWJpbGl0eSB0byBkbworICogc28uCisgKi8KK3NjdHBfeG1pdF90IHNjdHBfcGFja2V0X2FwcGVuZF9jaHVuayhzdHJ1Y3Qgc2N0cF9wYWNrZXQgKnBhY2tldCwKKwkJCQkgICAgIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaykKK3sKKwlzY3RwX3htaXRfdCByZXR2YWwgPSBTQ1RQX1hNSVRfT0s7CisJX191MTYgY2h1bmtfbGVuID0gV09SRF9ST1VORChudG9ocyhjaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpKTsKKwlzaXplX3QgcHNpemU7CisJc2l6ZV90IHBtdHU7CisJaW50IHRvb19iaWc7CisKKwlTQ1RQX0RFQlVHX1BSSU5USygiJXM6IHBhY2tldDolcCBjaHVuazolcFxuIiwgX19GVU5DVElPTl9fLCBwYWNrZXQsCisJCQkgIGNodW5rKTsKKworCXJldHZhbCA9IHNjdHBfcGFja2V0X2J1bmRsZV9zYWNrKHBhY2tldCwgY2h1bmspOworCXBzaXplID0gcGFja2V0LT5zaXplOworCisJaWYgKHJldHZhbCAhPSBTQ1RQX1hNSVRfT0spCisJCWdvdG8gZmluaXNoOworCisJcG10dSAgPSAoKHBhY2tldC0+dHJhbnNwb3J0LT5hc29jKSA/CisJCSAocGFja2V0LT50cmFuc3BvcnQtPmFzb2MtPnBtdHUpIDoKKwkJIChwYWNrZXQtPnRyYW5zcG9ydC0+cG10dSkpOworCisJdG9vX2JpZyA9IChwc2l6ZSArIGNodW5rX2xlbiA+IHBtdHUpOworCisJLyogRGVjaWRlIGlmIHdlIG5lZWQgdG8gZnJhZ21lbnQgb3IgcmVzdWJtaXQgbGF0ZXIuICovCisJaWYgKHRvb19iaWcpIHsKKwkJLyogQm90aCBjb250cm9sIGNodW5rcyBhbmQgZGF0YSBjaHVua3Mgd2l0aCBUU05zIGFyZQorCQkgKiBub24tZnJhZ21lbnRhYmxlLgorCQkgKi8KKwkJaWYgKHNjdHBfcGFja2V0X2VtcHR5KHBhY2tldCkgfHwgIXNjdHBfY2h1bmtfaXNfZGF0YShjaHVuaykpIHsKKwkJCS8qIFdlIG5vIGxvbmdlciBkbyByZS1mcmFnbWVudGF0aW9uLgorCQkJICogSnVzdCBmcmFnbWVudCBhdCB0aGUgSVAgbGF5ZXIsIGlmIHdlCisJCQkgKiBhY3R1YWxseSBoaXQgdGhpcyBjb25kaXRpb24KKwkJCSAqLworCQkJcGFja2V0LT5pcGZyYWdvayA9IDE7CisJCQlnb3RvIGFwcGVuZDsKKworCQl9IGVsc2UgeworCQkJcmV0dmFsID0gU0NUUF9YTUlUX1BNVFVfRlVMTDsKKwkJCWdvdG8gZmluaXNoOworCQl9CisJfQorCithcHBlbmQ6CisJLyogV2UgYmVsaWV2ZSB0aGF0IHRoaXMgY2h1bmsgaXMgT0sgdG8gYWRkIHRvIHRoZSBwYWNrZXQgKGFzCisJICogbG9uZyBhcyB3ZSBoYXZlIHRoZSBjd25kIGZvciBpdCkuCisJICovCisKKwkvKiBEQVRBIGlzIGEgc3BlY2lhbCBjYXNlIHNpbmNlIHdlIG11c3QgZXhhbWluZSBib3RoIHJ3bmQgYW5kIGN3bmQKKwkgKiBiZWZvcmUgd2Ugc2VuZCBEQVRBLgorCSAqLworCWlmIChzY3RwX2NodW5rX2lzX2RhdGEoY2h1bmspKSB7CisJCXJldHZhbCA9IHNjdHBfcGFja2V0X2FwcGVuZF9kYXRhKHBhY2tldCwgY2h1bmspOworCQkvKiBEaXNhbGxvdyBTQUNLIGJ1bmRsaW5nIGFmdGVyIERBVEEuICovCisJCXBhY2tldC0+aGFzX3NhY2sgPSAxOworCQlpZiAoU0NUUF9YTUlUX09LICE9IHJldHZhbCkKKwkJCWdvdG8gZmluaXNoOworCX0gZWxzZSBpZiAoU0NUUF9DSURfQ09PS0lFX0VDSE8gPT0gY2h1bmstPmNodW5rX2hkci0+dHlwZSkKKwkJcGFja2V0LT5oYXNfY29va2llX2VjaG8gPSAxOworCWVsc2UgaWYgKFNDVFBfQ0lEX1NBQ0sgPT0gY2h1bmstPmNodW5rX2hkci0+dHlwZSkKKwkJcGFja2V0LT5oYXNfc2FjayA9IDE7CisKKwkvKiBJdCBpcyBPSyB0byBzZW5kIHRoaXMgY2h1bmsuICAqLworCV9fc2tiX3F1ZXVlX3RhaWwoJnBhY2tldC0+Y2h1bmtzLCAoc3RydWN0IHNrX2J1ZmYgKiljaHVuayk7CisJcGFja2V0LT5zaXplICs9IGNodW5rX2xlbjsKKwljaHVuay0+dHJhbnNwb3J0ID0gcGFja2V0LT50cmFuc3BvcnQ7CitmaW5pc2g6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogQWxsIHBhY2tldHMgYXJlIHNlbnQgdG8gdGhlIG5ldHdvcmsgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uIGZyb20KKyAqIHNjdHBfb3V0cV90YWlsKCkuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyBhIG5vcm1hbCBrZXJuZWwgZXJyb3IgcmV0dXJuIHZhbHVlLgorICovCitpbnQgc2N0cF9wYWNrZXRfdHJhbnNtaXQoc3RydWN0IHNjdHBfcGFja2V0ICpwYWNrZXQpCit7CisJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cCA9IHBhY2tldC0+dHJhbnNwb3J0OworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jID0gdHAtPmFzb2M7CisJc3RydWN0IHNjdHBoZHIgKnNoOworCV9fdTMyIGNyYzMyOworCXN0cnVjdCBza19idWZmICpuc2tiOworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuazsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJaW50IGVyciA9IDA7CisJaW50IHBhZGRpbmc7CQkvKiBIb3cgbXVjaCBwYWRkaW5nIGRvIHdlIG5lZWQ/ICAqLworCV9fdTggaGFzX2RhdGEgPSAwOworCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKKworCVNDVFBfREVCVUdfUFJJTlRLKCIlczogcGFja2V0OiVwXG4iLCBfX0ZVTkNUSU9OX18sIHBhY2tldCk7CisKKwkvKiBEbyBOT1QgZ2VuZXJhdGUgYSBjaHVua2xlc3MgcGFja2V0LiAqLworCWNodW5rID0gKHN0cnVjdCBzY3RwX2NodW5rICopc2tiX3BlZWsoJnBhY2tldC0+Y2h1bmtzKTsKKwlpZiAodW5saWtlbHkoIWNodW5rKSkKKwkJcmV0dXJuIGVycjsKKworCS8qIFNldCB1cCBjb252ZW5pZW5jZSB2YXJpYWJsZXMuLi4gKi8KKwlzayA9IGNodW5rLT5za2ItPnNrOworCisJLyogQWxsb2NhdGUgdGhlIG5ldyBza2IuICAqLworCW5za2IgPSBkZXZfYWxsb2Nfc2tiKHBhY2tldC0+c2l6ZSk7CisJaWYgKCFuc2tiKQorCQlnb3RvIG5vbWVtOworCisJLyogTWFrZSBzdXJlIHRoZSBvdXRib3VuZCBza2IgaGFzIGVub3VnaCBoZWFkZXIgcm9vbSByZXNlcnZlZC4gKi8KKwlza2JfcmVzZXJ2ZShuc2tiLCBwYWNrZXQtPm92ZXJoZWFkKTsKKworCS8qIFNldCB0aGUgb3duaW5nIHNvY2tldCBzbyB0aGF0IHdlIGtub3cgd2hlcmUgdG8gZ2V0IHRoZQorCSAqIGRlc3RpbmF0aW9uIElQIGFkZHJlc3MuCisJICovCisJc2tiX3NldF9vd25lcl93KG5za2IsIHNrKTsKKworCS8qIEJ1aWxkIHRoZSBTQ1RQIGhlYWRlci4gICovCisJc2ggPSAoc3RydWN0IHNjdHBoZHIgKilza2JfcHVzaChuc2tiLCBzaXplb2Yoc3RydWN0IHNjdHBoZHIpKTsKKwlzaC0+c291cmNlID0gaHRvbnMocGFja2V0LT5zb3VyY2VfcG9ydCk7CisJc2gtPmRlc3QgICA9IGh0b25zKHBhY2tldC0+ZGVzdGluYXRpb25fcG9ydCk7CisKKwkvKiBGcm9tIDYuOCBBZGxlci0zMiBDaGVja3N1bSBDYWxjdWxhdGlvbjoKKwkgKiBBZnRlciB0aGUgcGFja2V0IGlzIGNvbnN0cnVjdGVkIChjb250YWluaW5nIHRoZSBTQ1RQIGNvbW1vbgorCSAqIGhlYWRlciBhbmQgb25lIG9yIG1vcmUgY29udHJvbCBvciBEQVRBIGNodW5rcyksIHRoZQorCSAqIHRyYW5zbWl0dGVyIHNoYWxsOgorCSAqCisJICogMSkgRmlsbCBpbiB0aGUgcHJvcGVyIFZlcmlmaWNhdGlvbiBUYWcgaW4gdGhlIFNDVFAgY29tbW9uCisJICogICAgaGVhZGVyIGFuZCBpbml0aWFsaXplIHRoZSBjaGVja3N1bSBmaWVsZCB0byAwJ3MuCisJICovCisJc2gtPnZ0YWcgICAgID0gaHRvbmwocGFja2V0LT52dGFnKTsKKwlzaC0+Y2hlY2tzdW0gPSAwOworCisJLyogMikgQ2FsY3VsYXRlIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZiB0aGUgd2hvbGUgcGFja2V0LAorCSAqICAgIGluY2x1ZGluZyB0aGUgU0NUUCBjb21tb24gaGVhZGVyIGFuZCBhbGwgdGhlCisJICogICAgY2h1bmtzLgorCSAqCisJICogTm90ZTogQWRsZXItMzIgaXMgbm8gbG9uZ2VyIGFwcGxpY2FibGUsIGFzIGhhcyBiZWVuIHJlcGxhY2VkCisJICogYnkgQ1JDMzItQyBhcyBkZXNjcmliZWQgaW4gPGRyYWZ0LWlldGYtdHN2d2ctc2N0cGNzdW0tMDIudHh0Pi4KKwkgKi8KKwljcmMzMiA9IHNjdHBfc3RhcnRfY2tzdW0oKF9fdTggKilzaCwgc2l6ZW9mKHN0cnVjdCBzY3RwaGRyKSk7CisKKwkvKioKKwkgKiA2LjEwIEJ1bmRsaW5nCisJICoKKwkgKiAgICBBbiBlbmRwb2ludCBidW5kbGVzIGNodW5rcyBieSBzaW1wbHkgaW5jbHVkaW5nIG11bHRpcGxlCisJICogICAgY2h1bmtzIGluIG9uZSBvdXRib3VuZCBTQ1RQIHBhY2tldC4gIC4uLgorCSAqLworCisJLyoqCisJICogMy4yICBDaHVuayBGaWVsZCBEZXNjcmlwdGlvbnMKKwkgKgorCSAqIFRoZSB0b3RhbCBsZW5ndGggb2YgYSBjaHVuayAoaW5jbHVkaW5nIFR5cGUsIExlbmd0aCBhbmQKKwkgKiBWYWx1ZSBmaWVsZHMpIE1VU1QgYmUgYSBtdWx0aXBsZSBvZiA0IGJ5dGVzLiAgSWYgdGhlIGxlbmd0aAorCSAqIG9mIHRoZSBjaHVuayBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IGJ5dGVzLCB0aGUgc2VuZGVyIE1VU1QKKwkgKiBwYWQgdGhlIGNodW5rIHdpdGggYWxsIHplcm8gYnl0ZXMgYW5kIHRoaXMgcGFkZGluZyBpcyBub3QKKwkgKiBpbmNsdWRlZCBpbiB0aGUgY2h1bmsgbGVuZ3RoIGZpZWxkLiAgVGhlIHNlbmRlciBzaG91bGQKKwkgKiBuZXZlciBwYWQgd2l0aCBtb3JlIHRoYW4gMyBieXRlcy4KKwkgKgorCSAqIFtUaGlzIHdob2xlIGNvbW1lbnQgZXhwbGFpbnMgV09SRF9ST1VORCgpIGJlbG93Ll0KKwkgKi8KKwlTQ1RQX0RFQlVHX1BSSU5USygiKioqc2N0cF90cmFuc21pdF9wYWNrZXQqKipcbiIpOworCXdoaWxlICgoY2h1bmsgPSAoc3RydWN0IHNjdHBfY2h1bmsgKilfX3NrYl9kZXF1ZXVlKCZwYWNrZXQtPmNodW5rcykpICE9IE5VTEwpIHsKKwkJaWYgKHNjdHBfY2h1bmtfaXNfZGF0YShjaHVuaykpIHsKKworCQkJaWYgKCFjaHVuay0+aGFzX3RzbikgeworCQkJCXNjdHBfY2h1bmtfYXNzaWduX3NzbihjaHVuayk7CisJCQkJc2N0cF9jaHVua19hc3NpZ25fdHNuKGNodW5rKTsKKworCQkJLyogNi4zLjEgQzQpIFdoZW4gZGF0YSBpcyBpbiBmbGlnaHQgYW5kIHdoZW4gYWxsb3dlZAorCQkJICogYnkgcnVsZSBDNSwgYSBuZXcgUlRUIG1lYXN1cmVtZW50IE1VU1QgYmUgbWFkZSBlYWNoCisJCQkgKiByb3VuZCB0cmlwLiAgRnVydGhlcm1vcmUsIG5ldyBSVFQgbWVhc3VyZW1lbnRzCisJCQkgKiBTSE9VTEQgYmUgbWFkZSBubyBtb3JlIHRoYW4gb25jZSBwZXIgcm91bmQtdHJpcAorCQkJICogZm9yIGEgZ2l2ZW4gZGVzdGluYXRpb24gdHJhbnNwb3J0IGFkZHJlc3MuCisJCQkgKi8KKworCQkJCWlmICghdHAtPnJ0b19wZW5kaW5nKSB7CisJCQkJCWNodW5rLT5ydHRfaW5fcHJvZ3Jlc3MgPSAxOworCQkJCQl0cC0+cnRvX3BlbmRpbmcgPSAxOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWNodW5rLT5yZXNlbnQgPSAxOworCisJCQljaHVuay0+c2VudF9hdCA9IGppZmZpZXM7CisJCQloYXNfZGF0YSA9IDE7CisJCX0KKworCQlwYWRkaW5nID0gV09SRF9ST1VORChjaHVuay0+c2tiLT5sZW4pIC0gY2h1bmstPnNrYi0+bGVuOworCQlpZiAocGFkZGluZykKKwkJCW1lbXNldChza2JfcHV0KGNodW5rLT5za2IsIHBhZGRpbmcpLCAwLCBwYWRkaW5nKTsKKworCQljcmMzMiA9IHNjdHBfdXBkYXRlX2NvcHlfY2tzdW0oc2tiX3B1dChuc2tiLCBjaHVuay0+c2tiLT5sZW4pLAorCQkJCQkgICAgICAgY2h1bmstPnNrYi0+ZGF0YSwKKwkJCQkJICAgICAgIGNodW5rLT5za2ItPmxlbiwgY3JjMzIpOworCisJCVNDVFBfREVCVUdfUFJJTlRLKCIlcyAlcFslc10gJXMgMHgleCwgJXMgJWQsICVzICVkLCAlcyAlZFxuIiwKKwkJCQkgICIqKiogQ2h1bmsiLCBjaHVuaywKKwkJCQkgIHNjdHBfY25hbWUoU0NUUF9TVF9DSFVOSygKKwkJCQkJICBjaHVuay0+Y2h1bmtfaGRyLT50eXBlKSksCisJCQkJICBjaHVuay0+aGFzX3RzbiA/ICJUU04iIDogIk5vIFRTTiIsCisJCQkJICBjaHVuay0+aGFzX3RzbiA/CisJCQkJICBudG9obChjaHVuay0+c3ViaC5kYXRhX2hkci0+dHNuKSA6IDAsCisJCQkJICAibGVuZ3RoIiwgbnRvaHMoY2h1bmstPmNodW5rX2hkci0+bGVuZ3RoKSwKKwkJCQkgICJjaHVuay0+c2tiLT5sZW4iLCBjaHVuay0+c2tiLT5sZW4sCisJCQkJICAicnR0X2luX3Byb2dyZXNzIiwgY2h1bmstPnJ0dF9pbl9wcm9ncmVzcyk7CisKKwkJLyoKKwkJICogSWYgdGhpcyBpcyBhIGNvbnRyb2wgY2h1bmssIHRoaXMgaXMgb3VyIGxhc3QKKwkJICogcmVmZXJlbmNlLiBGcmVlIGRhdGEgY2h1bmtzIGFmdGVyIHRoZXkndmUgYmVlbgorCQkgKiBhY2tub3dsZWRnZWQgb3IgaGF2ZSBmYWlsZWQuCisJCSAqLworCQlpZiAoIXNjdHBfY2h1bmtfaXNfZGF0YShjaHVuaykpCisgICAgCQkJc2N0cF9jaHVua19mcmVlKGNodW5rKTsKKwl9CisKKwkvKiBQZXJmb3JtIGZpbmFsIHRyYW5zZm9ybWF0aW9uIG9uIGNoZWNrc3VtLiAqLworCWNyYzMyID0gc2N0cF9lbmRfY2tzdW0oY3JjMzIpOworCisJLyogMykgUHV0IHRoZSByZXN1bHRhbnQgdmFsdWUgaW50byB0aGUgY2hlY2tzdW0gZmllbGQgaW4gdGhlCisJICogICAgY29tbW9uIGhlYWRlciwgYW5kIGxlYXZlIHRoZSByZXN0IG9mIHRoZSBiaXRzIHVuY2hhbmdlZC4KKwkgKi8KKwlzaC0+Y2hlY2tzdW0gPSBodG9ubChjcmMzMik7CisKKwkvKiBJUCBsYXllciBFQ04gc3VwcG9ydAorCSAqIEZyb20gUkZDIDI0ODEKKwkgKiAgIlRoZSBFQ04tQ2FwYWJsZSBUcmFuc3BvcnQgKEVDVCkgYml0IHdvdWxkIGJlIHNldCBieSB0aGUKKwkgKiAgIGRhdGEgc2VuZGVyIHRvIGluZGljYXRlIHRoYXQgdGhlIGVuZC1wb2ludHMgb2YgdGhlCisJICogICB0cmFuc3BvcnQgcHJvdG9jb2wgYXJlIEVDTi1jYXBhYmxlLiIKKwkgKgorCSAqIE5vdyBzZXR0aW5nIHRoZSBFQ1QgYml0IGFsbCB0aGUgdGltZSwgYXMgaXQgc2hvdWxkIG5vdCBjYXVzZQorCSAqIGFueSBwcm9ibGVtcyBwcm90b2NvbC13aXNlIGV2ZW4gaWYgb3VyIHBlZXIgaWdub3JlcyBpdC4KKwkgKgorCSAqIE5vdGU6IFRoZSB3b3JrcyBmb3IgSVB2NiBsYXllciBjaGVja3MgdGhpcyBiaXQgdG9vIGxhdGVyCisJICogaW4gdHJhbnNtaXNzaW9uLiAgU2VlIElQNl9FQ05fZmxvd194bWl0KCkuCisJICovCisJSU5FVF9FQ05feG1pdChuc2tiLT5zayk7CisKKwkvKiBTZXQgdXAgdGhlIElQIG9wdGlvbnMuICAqLworCS8qIEJVRzogbm90IGltcGxlbWVudGVkCisJICogRm9yIHY0IHRoaXMgYWxsIGxpdmVzIHNvbWV3aGVyZSBpbiBzay0+c2tfb3B0Li4uCisJICovCisKKwkvKiBEdW1wIHRoYXQgb24gSVAhICAqLworCWlmIChhc29jICYmIGFzb2MtPnBlZXIubGFzdF9zZW50X3RvICE9IHRwKSB7CisJCS8qIENvbnNpZGVyaW5nIHRoZSBtdWx0aXBsZSBDUFUgc2NlbmFyaW8sIHRoaXMgaXMgYQorCQkgKiAiY29ycmVjdGVyIiBwbGFjZSBmb3IgbGFzdF9zZW50X3RvLiAgLS14Z3VvCisJCSAqLworCQlhc29jLT5wZWVyLmxhc3Rfc2VudF90byA9IHRwOworCX0KKworCWlmIChoYXNfZGF0YSkgeworCQlzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXI7CisJCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCQl0cC0+bGFzdF90aW1lX3VzZWQgPSBqaWZmaWVzOworCisJCS8qIFJlc3RhcnQgdGhlIEFVVE9DTE9TRSB0aW1lciB3aGVuIHNlbmRpbmcgZGF0YS4gKi8KKwkJaWYgKHNjdHBfc3RhdGUoYXNvYywgRVNUQUJMSVNIRUQpICYmIGFzb2MtPmF1dG9jbG9zZSkgeworCQkJdGltZXIgPSAmYXNvYy0+dGltZXJzW1NDVFBfRVZFTlRfVElNRU9VVF9BVVRPQ0xPU0VdOworCQkJdGltZW91dCA9IGFzb2MtPnRpbWVvdXRzW1NDVFBfRVZFTlRfVElNRU9VVF9BVVRPQ0xPU0VdOworCisJCQlpZiAoIW1vZF90aW1lcih0aW1lciwgamlmZmllcyArIHRpbWVvdXQpKQorCQkJCXNjdHBfYXNzb2NpYXRpb25faG9sZChhc29jKTsKKwkJfQorCX0KKworCWRzdCA9IHRwLT5kc3Q7CisJLyogVGhlICdvYnNvbGV0ZScgZmllbGQgb2YgZHN0IGlzIHNldCB0byAyIHdoZW4gYSBkc3QgaXMgZnJlZWQuICovCisJaWYgKCFkc3QgfHwgKGRzdC0+b2Jzb2xldGUgPiAxKSkgeworCQlkc3RfcmVsZWFzZShkc3QpOworCQlzY3RwX3RyYW5zcG9ydF9yb3V0ZSh0cCwgTlVMTCwgc2N0cF9zayhzaykpOworCQlzY3RwX2Fzc29jX3N5bmNfcG10dShhc29jKTsKKwl9CisKKwluc2tiLT5kc3QgPSBkc3RfY2xvbmUodHAtPmRzdCk7CisJaWYgKCFuc2tiLT5kc3QpCisJCWdvdG8gbm9fcm91dGU7CisKKwlTQ1RQX0RFQlVHX1BSSU5USygiKioqc2N0cF90cmFuc21pdF9wYWNrZXQqKiogc2tiIGxlbiAlZFxuIiwKKwkJCSAgbnNrYi0+bGVuKTsKKworCSgqdHAtPmFmX3NwZWNpZmljLT5zY3RwX3htaXQpKG5za2IsIHRwLCBwYWNrZXQtPmlwZnJhZ29rKTsKKworb3V0OgorCXBhY2tldC0+c2l6ZSA9IHBhY2tldC0+b3ZlcmhlYWQ7CisJcmV0dXJuIGVycjsKK25vX3JvdXRlOgorCWtmcmVlX3NrYihuc2tiKTsKKwlJUF9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfT1VUTk9ST1VURVMpOworCisJLyogRklYTUU6IFJldHVybmluZyB0aGUgJ2Vycicgd2lsbCBlZmZlY3QgYWxsIHRoZSBhc3NvY2lhdGlvbnMKKwkgKiBhc3NvY2lhdGVkIHdpdGggYSBzb2NrZXQsIGFsdGhvdWdoIG9ubHkgb25lIG9mIHRoZSBwYXRocyBvZiB0aGUKKwkgKiBhc3NvY2lhdGlvbiBpcyB1bnJlYWNoYWJsZS4KKwkgKiBUaGUgcmVhbCBmYWlsdXJlIG9mIGEgdHJhbnNwb3J0IG9yIGFzc29jaWF0aW9uIGNhbiBiZSBwYXNzZWQgb24KKwkgKiB0byB0aGUgdXNlciB2aWEgbm90aWZpY2F0aW9ucy4gU28gc2V0dGluZyB0aGlzIGVycm9yIG1heSBub3QgYmUKKwkgKiByZXF1aXJlZC4KKwkgKi8KKwkgLyogZXJyID0gLUVIT1NUVU5SRUFDSDsgKi8KK2VycjoKKwkvKiBDb250cm9sIGNodW5rcyBhcmUgdW5yZWxpYWJsZSBzbyBqdXN0IGRyb3AgdGhlbS4gIERBVEEgY2h1bmtzCisJICogd2lsbCBnZXQgcmVzZW50IG9yIGRyb3BwZWQgbGF0ZXIuCisJICovCisKKwl3aGlsZSAoKGNodW5rID0gKHN0cnVjdCBzY3RwX2NodW5rICopX19za2JfZGVxdWV1ZSgmcGFja2V0LT5jaHVua3MpKSAhPSBOVUxMKSB7CisJCWlmICghc2N0cF9jaHVua19pc19kYXRhKGNodW5rKSkKKyAgICAJCQlzY3RwX2NodW5rX2ZyZWUoY2h1bmspOworCX0KKwlnb3RvIG91dDsKK25vbWVtOgorCWVyciA9IC1FTk9NRU07CisJZ290byBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogMm5kIExldmVsIEFic3RyYWN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGlzIHByaXZhdGUgZnVuY3Rpb24gaGFuZGxlcyB0aGUgc3BlY2lmaWNzIG9mIGFwcGVuZGluZyBEQVRBIGNodW5rcy4gICovCitzdGF0aWMgc2N0cF94bWl0X3Qgc2N0cF9wYWNrZXRfYXBwZW5kX2RhdGEoc3RydWN0IHNjdHBfcGFja2V0ICpwYWNrZXQsCisJCQkJCSAgIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaykKK3sKKwlzY3RwX3htaXRfdCByZXR2YWwgPSBTQ1RQX1hNSVRfT0s7CisJc2l6ZV90IGRhdGFzaXplLCByd25kLCBpbmZsaWdodDsKKwlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydCA9IHBhY2tldC0+dHJhbnNwb3J0OworCV9fdTMyIG1heF9idXJzdF9ieXRlczsKKwlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYyA9IHRyYW5zcG9ydC0+YXNvYzsKKwlzdHJ1Y3Qgc2N0cF9zb2NrICpzcCA9IHNjdHBfc2soYXNvYy0+YmFzZS5zayk7CisJc3RydWN0IHNjdHBfb3V0cSAqcSA9ICZhc29jLT5vdXRxdWV1ZTsKKworCS8qIFJGQyAyOTYwIDYuMSAgVHJhbnNtaXNzaW9uIG9mIERBVEEgQ2h1bmtzCisJICoKKwkgKiBBKSBBdCBhbnkgZ2l2ZW4gdGltZSwgdGhlIGRhdGEgc2VuZGVyIE1VU1QgTk9UIHRyYW5zbWl0IG5ldyBkYXRhIHRvCisJICogYW55IGRlc3RpbmF0aW9uIHRyYW5zcG9ydCBhZGRyZXNzIGlmIGl0cyBwZWVyJ3MgcnduZCBpbmRpY2F0ZXMKKwkgKiB0aGF0IHRoZSBwZWVyIGhhcyBubyBidWZmZXIgc3BhY2UgKGkuZS4gcnduZCBpcyAwLCBzZWUgU2VjdGlvbgorCSAqIDYuMi4xKS4gIEhvd2V2ZXIsIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIHJ3bmQgKGluY2x1ZGluZyBpZiBpdAorCSAqIGlzIDApLCB0aGUgZGF0YSBzZW5kZXIgY2FuIGFsd2F5cyBoYXZlIG9uZSBEQVRBIGNodW5rIGluIGZsaWdodCB0bworCSAqIHRoZSByZWNlaXZlciBpZiBhbGxvd2VkIGJ5IGN3bmQgKHNlZSBydWxlIEIgYmVsb3cpLiAgVGhpcyBydWxlCisJICogYWxsb3dzIHRoZSBzZW5kZXIgdG8gcHJvYmUgZm9yIGEgY2hhbmdlIGluIHJ3bmQgdGhhdCB0aGUgc2VuZGVyCisJICogbWlzc2VkIGR1ZSB0byB0aGUgU0FDSyBoYXZpbmcgYmVlbiBsb3N0IGluIHRyYW5zaXQgZnJvbSB0aGUgZGF0YQorCSAqIHJlY2VpdmVyIHRvIHRoZSBkYXRhIHNlbmRlci4KKwkgKi8KKworCXJ3bmQgPSBhc29jLT5wZWVyLnJ3bmQ7CisJaW5mbGlnaHQgPSBhc29jLT5vdXRxdWV1ZS5vdXRzdGFuZGluZ19ieXRlczsKKworCWRhdGFzaXplID0gc2N0cF9kYXRhX3NpemUoY2h1bmspOworCisJaWYgKGRhdGFzaXplID4gcnduZCkgeworCQlpZiAoaW5mbGlnaHQgPiAwKSB7CisJCQkvKiBXZSBoYXZlIChhdCBsZWFzdCkgb25lIGRhdGEgY2h1bmsgaW4gZmxpZ2h0LAorCQkJICogc28gd2UgY2FuJ3QgZmFsbCBiYWNrIHRvIHJ1bGUgNi4xIEIpLgorCQkJICovCisJCQlyZXR2YWwgPSBTQ1RQX1hNSVRfUldORF9GVUxMOworCQkJZ290byBmaW5pc2g7CisJCX0KKwl9CisKKwkvKiBzY3RwaW1wZ3VpZGUtMDUgMi4xNC4yCisJICogRCkgV2hlbiB0aGUgdGltZSBjb21lcyBmb3IgdGhlIHNlbmRlciB0bworCSAqIHRyYW5zbWl0IG5ldyBEQVRBIGNodW5rcywgdGhlIHByb3RvY29sIHBhcmFtZXRlciBNYXguQnVyc3QgTVVTVAorCSAqIGZpcnN0IGJlIGFwcGxpZWQgdG8gbGltaXQgaG93IG1hbnkgbmV3IERBVEEgY2h1bmtzIG1heSBiZSBzZW50LgorCSAqIFRoZSBsaW1pdCBpcyBhcHBsaWVkIGJ5IGFkanVzdGluZyBjd25kIGFzIGZvbGxvd3M6CisJICogCWlmICgoZmxpZ2h0c2l6ZSArIE1heC5CdXJzdCAqIE1UVSkgPCBjd25kKQorCSAqCQljd25kID0gZmxpZ2h0c2l6ZSArIE1heC5CdXJzdCAqIE1UVQorCSAqLworCW1heF9idXJzdF9ieXRlcyA9IGFzb2MtPm1heF9idXJzdCAqIGFzb2MtPnBtdHU7CisJaWYgKCh0cmFuc3BvcnQtPmZsaWdodF9zaXplICsgbWF4X2J1cnN0X2J5dGVzKSA8IHRyYW5zcG9ydC0+Y3duZCkgeworCQl0cmFuc3BvcnQtPmN3bmQgPSB0cmFuc3BvcnQtPmZsaWdodF9zaXplICsgbWF4X2J1cnN0X2J5dGVzOworCQlTQ1RQX0RFQlVHX1BSSU5USygiJXM6IGN3bmQgbGltaXRlZCBieSBtYXhfYnVyc3Q6ICIKKwkJCQkgICJ0cmFuc3BvcnQ6ICVwLCBjd25kOiAlZCwgIgorCQkJCSAgInNzdGhyZXNoOiAlZCwgZmxpZ2h0X3NpemU6ICVkLCAiCisJCQkJICAicGJhOiAlZFxuIiwKKwkJCQkgIF9fRlVOQ1RJT05fXywgdHJhbnNwb3J0LAorCQkJCSAgdHJhbnNwb3J0LT5jd25kLAorCQkJCSAgdHJhbnNwb3J0LT5zc3RocmVzaCwKKwkJCQkgIHRyYW5zcG9ydC0+ZmxpZ2h0X3NpemUsCisJCQkJICB0cmFuc3BvcnQtPnBhcnRpYWxfYnl0ZXNfYWNrZWQpOworCX0KKworCS8qIFJGQyAyOTYwIDYuMSAgVHJhbnNtaXNzaW9uIG9mIERBVEEgQ2h1bmtzCisJICoKKwkgKiBCKSBBdCBhbnkgZ2l2ZW4gdGltZSwgdGhlIHNlbmRlciBNVVNUIE5PVCB0cmFuc21pdCBuZXcgZGF0YQorCSAqIHRvIGEgZ2l2ZW4gdHJhbnNwb3J0IGFkZHJlc3MgaWYgaXQgaGFzIGN3bmQgb3IgbW9yZSBieXRlcworCSAqIG9mIGRhdGEgb3V0c3RhbmRpbmcgdG8gdGhhdCB0cmFuc3BvcnQgYWRkcmVzcy4KKwkgKi8KKwkvKiBSRkMgNy4yLjQgJiB0aGUgSW1wbGVtZW50ZXJzIEd1aWRlIDIuOC4KKwkgKgorCSAqIDMpIC4uLgorCSAqICAgIFdoZW4gYSBGYXN0IFJldHJhbnNtaXQgaXMgYmVpbmcgcGVyZm9ybWVkIHRoZSBzZW5kZXIgU0hPVUxECisJICogICAgaWdub3JlIHRoZSB2YWx1ZSBvZiBjd25kIGFuZCBTSE9VTEQgTk9UIGRlbGF5IHJldHJhbnNtaXNzaW9uLgorCSAqLworCWlmICghY2h1bmstPmZhc3RfcmV0cmFuc21pdCkKKwkJaWYgKHRyYW5zcG9ydC0+ZmxpZ2h0X3NpemUgPj0gdHJhbnNwb3J0LT5jd25kKSB7CisJCQlyZXR2YWwgPSBTQ1RQX1hNSVRfUldORF9GVUxMOworCQkJZ290byBmaW5pc2g7CisJCX0KKworCS8qIE5hZ2xlJ3MgYWxnb3JpdGhtIHRvIHNvbHZlIHNtYWxsLXBhY2tldCBwcm9ibGVtOgorCSAqIEluaGliaXQgdGhlIHNlbmRpbmcgb2YgbmV3IGNodW5rcyB3aGVuIG5ldyBvdXRnb2luZyBkYXRhIGFycml2ZXMKKwkgKiBpZiBhbnkgcHJldmlvdXNseSB0cmFuc21pdHRlZCBkYXRhIG9uIHRoZSBjb25uZWN0aW9uIHJlbWFpbnMKKwkgKiB1bmFja25vd2xlZGdlZC4KKwkgKi8KKwlpZiAoIXNwLT5ub2RlbGF5ICYmIHNjdHBfcGFja2V0X2VtcHR5KHBhY2tldCkgJiYKKwkgICAgcS0+b3V0c3RhbmRpbmdfYnl0ZXMgJiYgc2N0cF9zdGF0ZShhc29jLCBFU1RBQkxJU0hFRCkpIHsKKwkJdW5zaWduZWQgbGVuID0gZGF0YXNpemUgKyBxLT5vdXRfcWxlbjsKKworCQkvKiBDaGVjayB3aGV0aGVyIHRoaXMgY2h1bmsgYW5kIGFsbCB0aGUgcmVzdCBvZiBwZW5kaW5nCisJCSAqIGRhdGEgd2lsbCBmaXQgb3IgZGVsYXkgaW4gaG9wZXMgb2YgYnVuZGxpbmcgYSBmdWxsCisJCSAqIHNpemVkIHBhY2tldC4KKwkJICovCisJCWlmIChsZW4gPCBhc29jLT5wbXR1IC0gcGFja2V0LT5vdmVyaGVhZCkgeworCQkJcmV0dmFsID0gU0NUUF9YTUlUX05BR0xFX0RFTEFZOworCQkJZ290byBmaW5pc2g7CisJCX0KKwl9CisKKwkvKiBLZWVwIHRyYWNrIG9mIGhvdyBtYW55IGJ5dGVzIGFyZSBpbiBmbGlnaHQgb3ZlciB0aGlzIHRyYW5zcG9ydC4gKi8KKwl0cmFuc3BvcnQtPmZsaWdodF9zaXplICs9IGRhdGFzaXplOworCisJLyogS2VlcCB0cmFjayBvZiBob3cgbWFueSBieXRlcyBhcmUgaW4gZmxpZ2h0IHRvIHRoZSByZWNlaXZlci4gKi8KKwlhc29jLT5vdXRxdWV1ZS5vdXRzdGFuZGluZ19ieXRlcyArPSBkYXRhc2l6ZTsKKworCS8qIFVwZGF0ZSBvdXIgdmlldyBvZiB0aGUgcmVjZWl2ZXIncyByd25kLiAqLworCWlmIChkYXRhc2l6ZSA8IHJ3bmQpCisJCXJ3bmQgLT0gZGF0YXNpemU7CisJZWxzZQorCQlyd25kID0gMDsKKworCWFzb2MtPnBlZXIucnduZCA9IHJ3bmQ7CisJLyogSGFzIGJlZW4gYWNjZXB0ZWQgZm9yIHRyYW5zbWlzc2lvbi4gKi8KKwlpZiAoIWFzb2MtPnBlZXIucHJzY3RwX2NhcGFibGUpCisJCWNodW5rLT5tc2ctPmNhbl9hYmFuZG9uID0gMDsKKworZmluaXNoOgorCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9vdXRxdWV1ZS5jIGIvbmV0L3NjdHAvb3V0cXVldWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjJkNGFkCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjdHAvb3V0cXVldWUuYwpAQCAtMCwwICsxLDE3MzQgQEAKKy8qIFNDVFAga2VybmVsIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSwgMjAwNAorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgQ2lzY28sIEluYy4KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIE1vdG9yb2xhLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMyBJbnRlbCBDb3JwLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBTQ1RQIGtlcm5lbCByZWZlcmVuY2UgSW1wbGVtZW50YXRpb24KKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgaW1wbGVtZW50IHRoZSBzY3RwX291dHEgY2xhc3MuICAgVGhlIG91dHF1ZXVlIGhhbmRsZXMKKyAqIGJ1bmRsaW5nIGFuZCBxdWV1ZWluZyBvZiBvdXRnb2luZyBTQ1RQIGNodW5rcy4KKyAqCisgKiBUaGUgU0NUUCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgU0NUUCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogV3JpdHRlbiBvciBtb2RpZmllZCBieToKKyAqICAgIExhIE1vbnRlIEguUC4gWWFycm9sbCA8cGlnZ3lAYWNtLm9yZz4KKyAqICAgIEthcmwgS251dHNvbiAgICAgICAgICA8a2FybEBhdGhlbmEuY2hpY2Fnby5pbC51cz4KKyAqICAgIFBlcnJ5IE1lbGFuZ2UgICAgICAgICA8cG1lbGFuZ2VAbnVsbC5jYy51aWMuZWR1PgorICogICAgWGluZ2FuZyBHdW8gICAgICAgICAgIDx4aW5nYW5nLmd1b0BpbnRlbC5jb20+CisgKiAgICBIdWkgSHVhbmcgCSAgICA8aHVpLmh1YW5nQG5va2lhLmNvbT4KKyAqICAgIFNyaWRoYXIgU2FtdWRyYWxhICAgICA8c3JpQHVzLmlibS5jb20+CisgKiAgICBKb24gR3JpbW0gICAgICAgICAgICAgPGpncmltbUB1cy5pYm0uY29tPgorICoKKyAqIEFueSBidWdzIHJlcG9ydGVkIGdpdmVuIHRvIHVzIHdlIHdpbGwgdHJ5IHRvIGZpeC4uLiBhbnkgZml4ZXMgc2hhcmVkIHdpbGwKKyAqIGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBuZXh0IFNDVFAgcmVsZWFzZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+ICAgLyogRm9yIHN0cnVjdCBsaXN0X2hlYWQgKi8KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CSAgLyogRm9yIHNrYl9zZXRfb3duZXJfdyAqLworCisjaW5jbHVkZSA8bmV0L3NjdHAvc2N0cC5oPgorI2luY2x1ZGUgPG5ldC9zY3RwL3NtLmg+CisKKy8qIERlY2xhcmUgaW50ZXJuYWwgZnVuY3Rpb25zIGhlcmUuICAqLworc3RhdGljIGludCBzY3RwX2Fja2VkKHN0cnVjdCBzY3RwX3NhY2toZHIgKnNhY2ssIF9fdTMyIHRzbik7CitzdGF0aWMgdm9pZCBzY3RwX2NoZWNrX3RyYW5zbWl0dGVkKHN0cnVjdCBzY3RwX291dHEgKnEsCisJCQkJICAgc3RydWN0IGxpc3RfaGVhZCAqdHJhbnNtaXR0ZWRfcXVldWUsCisJCQkJICAgc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQsCisJCQkJICAgc3RydWN0IHNjdHBfc2Fja2hkciAqc2FjaywKKwkJCQkgICBfX3UzMiBoaWdoZXN0X25ld190c24pOworCitzdGF0aWMgdm9pZCBzY3RwX21hcmtfbWlzc2luZyhzdHJ1Y3Qgc2N0cF9vdXRxICpxLAorCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqdHJhbnNtaXR0ZWRfcXVldWUsCisJCQkgICAgICBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydCwKKwkJCSAgICAgIF9fdTMyIGhpZ2hlc3RfbmV3X3RzbiwKKwkJCSAgICAgIGludCBjb3VudF9vZl9uZXdhY2tzKTsKKworc3RhdGljIHZvaWQgc2N0cF9nZW5lcmF0ZV9md2R0c24oc3RydWN0IHNjdHBfb3V0cSAqcSwgX191MzIgc2Fja19jdHNuKTsKKworLyogQWRkIGRhdGEgdG8gdGhlIGZyb250IG9mIHRoZSBxdWV1ZS4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzY3RwX291dHFfaGVhZF9kYXRhKHN0cnVjdCBzY3RwX291dHEgKnEsCisJCQkJCXN0cnVjdCBzY3RwX2NodW5rICpjaCkKK3sKKwlfX3NrYl9xdWV1ZV9oZWFkKCZxLT5vdXQsIChzdHJ1Y3Qgc2tfYnVmZiAqKWNoKTsKKwlxLT5vdXRfcWxlbiArPSBjaC0+c2tiLT5sZW47CisJcmV0dXJuOworfQorCisvKiBUYWtlIGRhdGEgZnJvbSB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlLiAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9vdXRxX2RlcXVldWVfZGF0YShzdHJ1Y3Qgc2N0cF9vdXRxICpxKQoreworCXN0cnVjdCBzY3RwX2NodW5rICpjaDsKKwljaCA9IChzdHJ1Y3Qgc2N0cF9jaHVuayAqKV9fc2tiX2RlcXVldWUoJnEtPm91dCk7CisJaWYgKGNoKQorCQlxLT5vdXRfcWxlbiAtPSBjaC0+c2tiLT5sZW47CisJcmV0dXJuIGNoOworfQorLyogQWRkIGRhdGEgY2h1bmsgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWUuICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2N0cF9vdXRxX3RhaWxfZGF0YShzdHJ1Y3Qgc2N0cF9vdXRxICpxLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2gpCit7CisJX19za2JfcXVldWVfdGFpbCgmcS0+b3V0LCAoc3RydWN0IHNrX2J1ZmYgKiljaCk7CisJcS0+b3V0X3FsZW4gKz0gY2gtPnNrYi0+bGVuOworCXJldHVybjsKK30KKworLyoKKyAqIFNGUi1DQUNDIGFsZ29yaXRobToKKyAqIEQpIElmIGNvdW50X29mX25ld2Fja3MgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDIKKyAqIGFuZCB0IHdhcyBub3Qgc2VudCB0byB0aGUgY3VycmVudCBwcmltYXJ5IHRoZW4gdGhlCisgKiBzZW5kZXIgTVVTVCBOT1QgaW5jcmVtZW50IG1pc3NpbmcgcmVwb3J0IGNvdW50IGZvciB0LgorICovCitzdGF0aWMgaW5saW5lIGludCBzY3RwX2NhY2Nfc2tpcF8zXzFfZChzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnByaW1hcnksCisJCQkJICAgICAgIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0LAorCQkJCSAgICAgICBpbnQgY291bnRfb2ZfbmV3YWNrcykKK3sKKwlpZiAoY291bnRfb2ZfbmV3YWNrcyA+PTIgJiYgdHJhbnNwb3J0ICE9IHByaW1hcnkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKgorICogU0ZSLUNBQ0MgYWxnb3JpdGhtOgorICogRikgSWYgY291bnRfb2ZfbmV3YWNrcyBpcyBsZXNzIHRoYW4gMiwgbGV0IGQgYmUgdGhlCisgKiBkZXN0aW5hdGlvbiB0byB3aGljaCB0IHdhcyBzZW50LiBJZiBjYWNjX3Nhd19uZXdhY2sKKyAqIGlzIDAgZm9yIGRlc3RpbmF0aW9uIGQsIHRoZW4gdGhlIHNlbmRlciBNVVNUIE5PVAorICogaW5jcmVtZW50IG1pc3NpbmcgcmVwb3J0IGNvdW50IGZvciB0LgorICovCitzdGF0aWMgaW5saW5lIGludCBzY3RwX2NhY2Nfc2tpcF8zXzFfZihzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydCwKKwkJCQkgICAgICAgaW50IGNvdW50X29mX25ld2Fja3MpCit7CisJaWYgKGNvdW50X29mX25ld2Fja3MgPCAyICYmICF0cmFuc3BvcnQtPmNhY2MuY2FjY19zYXdfbmV3YWNrKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNGUi1DQUNDIGFsZ29yaXRobToKKyAqIDMuMSkgSWYgQ1lDTElOR19DSEFOR0VPVkVSIGlzIDAsIHRoZSBzZW5kZXIgU0hPVUxECisgKiBleGVjdXRlIHN0ZXBzIEMsIEQsIEYuCisgKgorICogQyBoYXMgYmVlbiBpbXBsZW1lbnRlZCBpbiBzY3RwX291dHFfc2FjaworICovCitzdGF0aWMgaW5saW5lIGludCBzY3RwX2NhY2Nfc2tpcF8zXzEoc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpwcmltYXJ5LAorCQkJCSAgICAgc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQsCisJCQkJICAgICBpbnQgY291bnRfb2ZfbmV3YWNrcykKK3sKKwlpZiAoIXByaW1hcnktPmNhY2MuY3ljbGluZ19jaGFuZ2VvdmVyKSB7CisJCWlmIChzY3RwX2NhY2Nfc2tpcF8zXzFfZChwcmltYXJ5LCB0cmFuc3BvcnQsIGNvdW50X29mX25ld2Fja3MpKQorCQkJcmV0dXJuIDE7CisJCWlmIChzY3RwX2NhY2Nfc2tpcF8zXzFfZih0cmFuc3BvcnQsIGNvdW50X29mX25ld2Fja3MpKQorCQkJcmV0dXJuIDE7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNGUi1DQUNDIGFsZ29yaXRobToKKyAqIDMuMikgRWxzZSBpZiBDWUNMSU5HX0NIQU5HRU9WRVIgaXMgMSwgYW5kIHQgaXMgbGVzcworICogdGhhbiBuZXh0X3Rzbl9hdF9jaGFuZ2Ugb2YgdGhlIGN1cnJlbnQgcHJpbWFyeSwgdGhlbgorICogdGhlIHNlbmRlciBNVVNUIE5PVCBpbmNyZW1lbnQgbWlzc2luZyByZXBvcnQgY291bnQKKyAqIGZvciB0LgorICovCitzdGF0aWMgaW5saW5lIGludCBzY3RwX2NhY2Nfc2tpcF8zXzIoc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpwcmltYXJ5LCBfX3UzMiB0c24pCit7CisJaWYgKHByaW1hcnktPmNhY2MuY3ljbGluZ19jaGFuZ2VvdmVyICYmCisJICAgIFRTTl9sdCh0c24sIHByaW1hcnktPmNhY2MubmV4dF90c25fYXRfY2hhbmdlKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTRlItQ0FDQyBhbGdvcml0aG06CisgKiAzKSBJZiB0aGUgbWlzc2luZyByZXBvcnQgY291bnQgZm9yIFRTTiB0IGlzIHRvIGJlCisgKiBpbmNyZW1lbnRlZCBhY2NvcmRpbmcgdG8gW1JGQzI5NjBdIGFuZAorICogW1NDVFBfU1RFV0FSVC0yMDAyXSwgYW5kIENIQU5HRU9WRVJfQUNUSVZFIGlzIHNldCwKKyAqIHRoZW4gdGhlIHNlbmRlciBNVVNUIGZ1dGhlciBleGVjdXRlIHN0ZXBzIDMuMSBhbmQKKyAqIDMuMiB0byBkZXRlcm1pbmUgaWYgdGhlIG1pc3NpbmcgcmVwb3J0IGNvdW50IGZvcgorICogVFNOIHQgU0hPVUxEIE5PVCBiZSBpbmNyZW1lbnRlZC4KKyAqCisgKiAzLjMpIElmIDMuMSBhbmQgMy4yIGRvIG5vdCBkaWN0YXRlIHRoYXQgdGhlIG1pc3NpbmcKKyAqIHJlcG9ydCBjb3VudCBmb3IgdCBzaG91bGQgbm90IGJlIGluY3JlbWVudGVkLCB0aGVuCisgKiB0aGUgc2VuZGVyIFNPVUxEIGluY3JlbWVudCBtaXNzaW5nIHJlcG9ydCBjb3VudCBmb3IKKyAqIHQgKGFjY29yZGluZyB0byBbUkZDMjk2MF0gYW5kIFtTQ1RQX1NURVdBUlRfMjAwMl0pLgorICovCitzdGF0aWMgaW5saW5lIGludCBzY3RwX2NhY2Nfc2tpcChzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnByaW1hcnksCisJCQkJIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0LAorCQkJCSBpbnQgY291bnRfb2ZfbmV3YWNrcywKKwkJCQkgX191MzIgdHNuKQoreworCWlmIChwcmltYXJ5LT5jYWNjLmNoYW5nZW92ZXJfYWN0aXZlICYmCisJICAgIChzY3RwX2NhY2Nfc2tpcF8zXzEocHJpbWFyeSwgdHJhbnNwb3J0LCBjb3VudF9vZl9uZXdhY2tzKQorCSAgICAgfHwgc2N0cF9jYWNjX3NraXBfM18yKHByaW1hcnksIHRzbikpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyogSW5pdGlhbGl6ZSBhbiBleGlzdGluZyBzY3RwX291dHEuICBUaGlzIGRvZXMgdGhlIGJvcmluZyBzdHVmZi4KKyAqIFlvdSBzdGlsbCBuZWVkIHRvIGRlZmluZSBoYW5kbGVycyBpZiB5b3UgcmVhbGx5IHdhbnQgdG8gRE8KKyAqIHNvbWV0aGluZyB3aXRoIHRoaXMgc3RydWN0dXJlLi4uCisgKi8KK3ZvaWQgc2N0cF9vdXRxX2luaXQoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsIHN0cnVjdCBzY3RwX291dHEgKnEpCit7CisJcS0+YXNvYyA9IGFzb2M7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcS0+b3V0KTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZxLT5jb250cm9sKTsKKwlJTklUX0xJU1RfSEVBRCgmcS0+cmV0cmFuc21pdCk7CisJSU5JVF9MSVNUX0hFQUQoJnEtPnNhY2tlZCk7CisJSU5JVF9MSVNUX0hFQUQoJnEtPmFiYW5kb25lZCk7CisKKwlxLT5vdXRzdGFuZGluZ19ieXRlcyA9IDA7CisJcS0+ZW1wdHkgPSAxOworCXEtPmNvcmsgID0gMDsKKworCXEtPm1hbGxvY2VkID0gMDsKKwlxLT5vdXRfcWxlbiA9IDA7Cit9CisKKy8qIEZyZWUgdGhlIG91dHF1ZXVlIHN0cnVjdHVyZSBhbmQgYW55IHJlbGF0ZWQgcGVuZGluZyBjaHVua3MuCisgKi8KK3ZvaWQgc2N0cF9vdXRxX3RlYXJkb3duKHN0cnVjdCBzY3RwX291dHEgKnEpCit7CisJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisJc3RydWN0IGxpc3RfaGVhZCAqbGNodW5rLCAqcG9zLCAqdGVtcDsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bms7CisKKwkvKiBUaHJvdyBhd2F5IHVuYWNrbm93bGVkZ2VkIGNodW5rcy4gKi8KKwlsaXN0X2Zvcl9lYWNoKHBvcywgJnEtPmFzb2MtPnBlZXIudHJhbnNwb3J0X2FkZHJfbGlzdCkgeworCQl0cmFuc3BvcnQgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHNjdHBfdHJhbnNwb3J0LCB0cmFuc3BvcnRzKTsKKwkJd2hpbGUgKChsY2h1bmsgPSBzY3RwX2xpc3RfZGVxdWV1ZSgmdHJhbnNwb3J0LT50cmFuc21pdHRlZCkpICE9IE5VTEwpIHsKKwkJCWNodW5rID0gbGlzdF9lbnRyeShsY2h1bmssIHN0cnVjdCBzY3RwX2NodW5rLAorCQkJCQkgICB0cmFuc21pdHRlZF9saXN0KTsKKwkJCS8qIE1hcmsgYXMgcGFydCBvZiBhIGZhaWxlZCBtZXNzYWdlLiAqLworCQkJc2N0cF9jaHVua19mYWlsKGNodW5rLCBxLT5lcnJvcik7CisJCQlzY3RwX2NodW5rX2ZyZWUoY2h1bmspOworCQl9CisJfQorCisJLyogVGhyb3cgYXdheSBjaHVua3MgdGhhdCBoYXZlIGJlZW4gZ2FwIEFDS2VkLiAgKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGNodW5rLCB0ZW1wLCAmcS0+c2Fja2VkKSB7CisJCWxpc3RfZGVsX2luaXQobGNodW5rKTsKKwkJY2h1bmsgPSBsaXN0X2VudHJ5KGxjaHVuaywgc3RydWN0IHNjdHBfY2h1bmssCisJCQkJICAgdHJhbnNtaXR0ZWRfbGlzdCk7CisJCXNjdHBfY2h1bmtfZmFpbChjaHVuaywgcS0+ZXJyb3IpOworCQlzY3RwX2NodW5rX2ZyZWUoY2h1bmspOworCX0KKworCS8qIFRocm93IGF3YXkgYW55IGNodW5rcyBpbiB0aGUgcmV0cmFuc21pdCBxdWV1ZS4gKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGNodW5rLCB0ZW1wLCAmcS0+cmV0cmFuc21pdCkgeworCQlsaXN0X2RlbF9pbml0KGxjaHVuayk7CisJCWNodW5rID0gbGlzdF9lbnRyeShsY2h1bmssIHN0cnVjdCBzY3RwX2NodW5rLAorCQkJCSAgIHRyYW5zbWl0dGVkX2xpc3QpOworCQlzY3RwX2NodW5rX2ZhaWwoY2h1bmssIHEtPmVycm9yKTsKKwkJc2N0cF9jaHVua19mcmVlKGNodW5rKTsKKwl9CisKKwkvKiBUaHJvdyBhd2F5IGFueSBjaHVua3MgdGhhdCBhcmUgaW4gdGhlIGFiYW5kb25lZCBxdWV1ZS4gKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGNodW5rLCB0ZW1wLCAmcS0+YWJhbmRvbmVkKSB7CisJCWxpc3RfZGVsX2luaXQobGNodW5rKTsKKwkJY2h1bmsgPSBsaXN0X2VudHJ5KGxjaHVuaywgc3RydWN0IHNjdHBfY2h1bmssCisJCQkJICAgdHJhbnNtaXR0ZWRfbGlzdCk7CisJCXNjdHBfY2h1bmtfZmFpbChjaHVuaywgcS0+ZXJyb3IpOworCQlzY3RwX2NodW5rX2ZyZWUoY2h1bmspOworCX0KKworCS8qIFRocm93IGF3YXkgYW55IGxlZnRvdmVyIGRhdGEgY2h1bmtzLiAqLworCXdoaWxlICgoY2h1bmsgPSBzY3RwX291dHFfZGVxdWV1ZV9kYXRhKHEpKSAhPSBOVUxMKSB7CisKKwkJLyogTWFyayBhcyBzZW5kIGZhaWx1cmUuICovCisJCXNjdHBfY2h1bmtfZmFpbChjaHVuaywgcS0+ZXJyb3IpOworCQlzY3RwX2NodW5rX2ZyZWUoY2h1bmspOworCX0KKworCXEtPmVycm9yID0gMDsKKworCS8qIFRocm93IGF3YXkgYW55IGxlZnRvdmVyIGNvbnRyb2wgY2h1bmtzLiAqLworCXdoaWxlICgoY2h1bmsgPSAoc3RydWN0IHNjdHBfY2h1bmsgKikgc2tiX2RlcXVldWUoJnEtPmNvbnRyb2wpKSAhPSBOVUxMKQorCQlzY3RwX2NodW5rX2ZyZWUoY2h1bmspOworfQorCisvKiBGcmVlIHRoZSBvdXRxdWV1ZSBzdHJ1Y3R1cmUgYW5kIGFueSByZWxhdGVkIHBlbmRpbmcgY2h1bmtzLiAgKi8KK3ZvaWQgc2N0cF9vdXRxX2ZyZWUoc3RydWN0IHNjdHBfb3V0cSAqcSkKK3sKKwkvKiBUaHJvdyBhd2F5IGxlZnRvdmVyIGNodW5rcy4gKi8KKwlzY3RwX291dHFfdGVhcmRvd24ocSk7CisKKwkvKiBJZiB3ZSB3ZXJlIGttYWxsb2MoKSdkLCBmcmVlIHRoZSBtZW1vcnkuICAqLworCWlmIChxLT5tYWxsb2NlZCkKKwkJa2ZyZWUocSk7Cit9CisKKy8qIFB1dCBhIG5ldyBjaHVuayBpbiBhbiBzY3RwX291dHEuICAqLworaW50IHNjdHBfb3V0cV90YWlsKHN0cnVjdCBzY3RwX291dHEgKnEsIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaykKK3sKKwlpbnQgZXJyb3IgPSAwOworCisJU0NUUF9ERUJVR19QUklOVEsoInNjdHBfb3V0cV90YWlsKCVwLCAlcFslc10pXG4iLAorCQkJICBxLCBjaHVuaywgY2h1bmsgJiYgY2h1bmstPmNodW5rX2hkciA/CisJCQkgIHNjdHBfY25hbWUoU0NUUF9TVF9DSFVOSyhjaHVuay0+Y2h1bmtfaGRyLT50eXBlKSkKKwkJCSAgOiAiSWxsZWdhbCBDaHVuayIpOworCisJLyogSWYgaXQgaXMgZGF0YSwgcXVldWUgaXQgdXAsIG90aGVyd2lzZSwgc2VuZCBpdAorCSAqIGltbWVkaWF0ZWx5LgorCSAqLworCWlmIChTQ1RQX0NJRF9EQVRBID09IGNodW5rLT5jaHVua19oZHItPnR5cGUpIHsKKwkJLyogSXMgaXQgT0sgdG8gcXVldWUgZGF0YSBjaHVua3M/ICAqLworCQkvKiBGcm9tIDkuIFRlcm1pbmF0aW9uIG9mIEFzc29jaWF0aW9uCisJCSAqCisJCSAqIFdoZW4gZWl0aGVyIGVuZHBvaW50IHBlcmZvcm1zIGEgc2h1dGRvd24sIHRoZQorCQkgKiBhc3NvY2lhdGlvbiBvbiBlYWNoIHBlZXIgd2lsbCBzdG9wIGFjY2VwdGluZyBuZXcKKwkJICogZGF0YSBmcm9tIGl0cyB1c2VyIGFuZCBvbmx5IGRlbGl2ZXIgZGF0YSBpbiBxdWV1ZQorCQkgKiBhdCB0aGUgdGltZSBvZiBzZW5kaW5nIG9yIHJlY2VpdmluZyB0aGUgU0hVVERPV04KKwkJICogY2h1bmsuCisJCSAqLworCQlzd2l0Y2ggKHEtPmFzb2MtPnN0YXRlKSB7CisJCWNhc2UgU0NUUF9TVEFURV9FTVBUWToKKwkJY2FzZSBTQ1RQX1NUQVRFX0NMT1NFRDoKKwkJY2FzZSBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkc6CisJCWNhc2UgU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UOgorCQljYXNlIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQ6CisJCWNhc2UgU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVDoKKwkJCS8qIENhbm5vdCBzZW5kIGFmdGVyIHRyYW5zcG9ydCBlbmRwb2ludCBzaHV0ZG93biAqLworCQkJZXJyb3IgPSAtRVNIVVRET1dOOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVNDVFBfREVCVUdfUFJJTlRLKCJvdXRxdWV1ZWluZyAoJXAsICVwWyVzXSlcbiIsCisJCQkgIHEsIGNodW5rLCBjaHVuayAmJiBjaHVuay0+Y2h1bmtfaGRyID8KKwkJCSAgc2N0cF9jbmFtZShTQ1RQX1NUX0NIVU5LKGNodW5rLT5jaHVua19oZHItPnR5cGUpKQorCQkJICA6ICJJbGxlZ2FsIENodW5rIik7CisKKwkJCXNjdHBfb3V0cV90YWlsX2RhdGEocSwgY2h1bmspOworCQkJaWYgKGNodW5rLT5jaHVua19oZHItPmZsYWdzICYgU0NUUF9EQVRBX1VOT1JERVJFRCkKKwkJCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9PVVRVTk9SREVSQ0hVTktTKTsKKwkJCWVsc2UKKwkJCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9PVVRPUkRFUkNIVU5LUyk7CisJCQlxLT5lbXB0eSA9IDA7CisJCQlicmVhazsKKwkJfTsKKwl9IGVsc2UgeworCQlfX3NrYl9xdWV1ZV90YWlsKCZxLT5jb250cm9sLCAoc3RydWN0IHNrX2J1ZmYgKikgY2h1bmspOworCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9PVVRDVFJMQ0hVTktTKTsKKwl9CisKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAoIXEtPmNvcmspCisJCWVycm9yID0gc2N0cF9vdXRxX2ZsdXNoKHEsIDApOworCisJcmV0dXJuIGVycm9yOworfQorCisvKiBJbnNlcnQgYSBjaHVuayBpbnRvIHRoZSBzb3J0ZWQgbGlzdCBiYXNlZCBvbiB0aGUgVFNOcy4gIFRoZSByZXRyYW5zbWl0IGxpc3QKKyAqIGFuZCB0aGUgYWJhbmRvbmVkIGxpc3QgYXJlIGluIGFzY2VuZGluZyBvcmRlci4KKyAqLworc3RhdGljIHZvaWQgc2N0cF9pbnNlcnRfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBzdHJ1Y3QgbGlzdF9oZWFkICpuZXcpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCXN0cnVjdCBzY3RwX2NodW5rICpuY2h1bmssICpsY2h1bms7CisJX191MzIgbnRzbiwgbHRzbjsKKwlpbnQgZG9uZSA9IDA7CisKKwluY2h1bmsgPSBsaXN0X2VudHJ5KG5ldywgc3RydWN0IHNjdHBfY2h1bmssIHRyYW5zbWl0dGVkX2xpc3QpOworCW50c24gPSBudG9obChuY2h1bmstPnN1YmguZGF0YV9oZHItPnRzbik7CisKKwlsaXN0X2Zvcl9lYWNoKHBvcywgaGVhZCkgeworCQlsY2h1bmsgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHNjdHBfY2h1bmssIHRyYW5zbWl0dGVkX2xpc3QpOworCQlsdHNuID0gbnRvaGwobGNodW5rLT5zdWJoLmRhdGFfaGRyLT50c24pOworCQlpZiAoVFNOX2x0KG50c24sIGx0c24pKSB7CisJCQlsaXN0X2FkZChuZXcsIHBvcy0+cHJldik7CisJCQlkb25lID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghZG9uZSkKKwkJbGlzdF9hZGRfdGFpbChuZXcsIGhlYWQpOyAKK30KKworLyogTWFyayBhbGwgdGhlIGVsaWdpYmxlIHBhY2tldHMgb24gYSB0cmFuc3BvcnQgZm9yIHJldHJhbnNtaXNzaW9uLiAgKi8KK3ZvaWQgc2N0cF9yZXRyYW5zbWl0X21hcmsoc3RydWN0IHNjdHBfb3V0cSAqcSwKKwkJCSAgc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQsCisJCQkgIF9fdTggZmFzdF9yZXRyYW5zbWl0KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxjaHVuaywgKmx0ZW1wOworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuazsKKworCS8qIFdhbGsgdGhyb3VnaCB0aGUgc3BlY2lmaWVkIHRyYW5zbWl0dGVkIHF1ZXVlLiAgKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGNodW5rLCBsdGVtcCwgJnRyYW5zcG9ydC0+dHJhbnNtaXR0ZWQpIHsKKwkJY2h1bmsgPSBsaXN0X2VudHJ5KGxjaHVuaywgc3RydWN0IHNjdHBfY2h1bmssCisJCQkJICAgdHJhbnNtaXR0ZWRfbGlzdCk7CisKKwkJLyogSWYgdGhlIGNodW5rIGlzIGFiYW5kb25lZCwgbW92ZSBpdCB0byBhYmFuZG9uZWQgbGlzdC4gKi8KKwkJaWYgKHNjdHBfY2h1bmtfYWJhbmRvbmVkKGNodW5rKSkgeworCQkJbGlzdF9kZWxfaW5pdChsY2h1bmspOworCQkJc2N0cF9pbnNlcnRfbGlzdCgmcS0+YWJhbmRvbmVkLCBsY2h1bmspOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBJZiB3ZSBhcmUgZG9pbmcgcmV0cmFuc21pc3Npb24gZHVlIHRvIGEgZmFzdCByZXRyYW5zbWl0LAorCQkgKiBvbmx5IHRoZSBjaHVuaydzIHRoYXQgYXJlIG1hcmtlZCBmb3IgZmFzdCByZXRyYW5zbWl0CisJCSAqIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgcmV0cmFuc21pdCBxdWV1ZS4gIElmIHdlIGFyZSBkb2luZworCQkgKiByZXRyYW5zbWlzc2lvbiBkdWUgdG8gYSB0aW1lb3V0IG9yIHBtdHUgZGlzY292ZXJ5LCBvbmx5IHRoZQorCQkgKiBjaHVua3MgdGhhdCBhcmUgbm90IHlldCBhY2tlZCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlCisJCSAqIHJldHJhbnNtaXQgcXVldWUuCisJCSAqLworCQlpZiAoKGZhc3RfcmV0cmFuc21pdCAmJiBjaHVuay0+ZmFzdF9yZXRyYW5zbWl0KSB8fAorCQkgICAoIWZhc3RfcmV0cmFuc21pdCAmJiAhY2h1bmstPnRzbl9nYXBfYWNrZWQpKSB7CisJCQkvKiBSRkMgMjk2MCA2LjIuMSBQcm9jZXNzaW5nIGEgUmVjZWl2ZWQgU0FDSworCQkJICoKKwkJCSAqIEMpIEFueSB0aW1lIGEgREFUQSBjaHVuayBpcyBtYXJrZWQgZm9yCisJCQkgKiByZXRyYW5zbWlzc2lvbiAodmlhIGVpdGhlciBUMy1ydHggdGltZXIgZXhwaXJhdGlvbgorCQkJICogKFNlY3Rpb24gNi4zLjMpIG9yIHZpYSBmYXN0IHJldHJhbnNtaXQKKwkJCSAqIChTZWN0aW9uIDcuMi40KSksIGFkZCB0aGUgZGF0YSBzaXplIG9mIHRob3NlCisJCQkgKiBjaHVua3MgdG8gdGhlIHJ3bmQuCisJCQkgKi8KKwkJCXEtPmFzb2MtPnBlZXIucnduZCArPSBzY3RwX2RhdGFfc2l6ZShjaHVuayk7CisJCQlxLT5vdXRzdGFuZGluZ19ieXRlcyAtPSBzY3RwX2RhdGFfc2l6ZShjaHVuayk7CisJCQl0cmFuc3BvcnQtPmZsaWdodF9zaXplIC09IHNjdHBfZGF0YV9zaXplKGNodW5rKTsKKworCQkJLyogc2N0cGltcGd1aWRlLTA1IFNlY3Rpb24gMi44LjIKKwkJCSAqIE01KSBJZiBhIFQzLXJ0eCB0aW1lciBleHBpcmVzLCB0aGUKKwkJCSAqICdUU04uTWlzc2luZy5SZXBvcnQnIG9mIGFsbCBhZmZlY3RlZCBUU05zIGlzIHNldAorCQkJICogdG8gMC4KKwkJCSAqLworCQkJY2h1bmstPnRzbl9taXNzaW5nX3JlcG9ydCA9IDA7CisKKwkJCS8qIElmIGEgY2h1bmsgdGhhdCBpcyBiZWluZyB1c2VkIGZvciBSVFQgbWVhc3VyZW1lbnQKKwkJCSAqIGhhcyB0byBiZSByZXRyYW5zbWl0dGVkLCB3ZSBjYW5ub3QgdXNlIHRoaXMgY2h1bmsKKwkJCSAqIGFueW1vcmUgZm9yIFJUVCBtZWFzdXJlbWVudHMuIFJlc2V0IHJ0b19wZW5kaW5nIHNvCisJCQkgKiB0aGF0IGEgbmV3IFJUVCBtZWFzdXJlbWVudCBpcyBzdGFydGVkIHdoZW4gYSBuZXcKKwkJCSAqIGRhdGEgY2h1bmsgaXMgc2VudC4KKwkJCSAqLworCQkJaWYgKGNodW5rLT5ydHRfaW5fcHJvZ3Jlc3MpIHsKKwkJCQljaHVuay0+cnR0X2luX3Byb2dyZXNzID0gMDsKKwkJCQl0cmFuc3BvcnQtPnJ0b19wZW5kaW5nID0gMDsKKwkJCX0KKworCQkJLyogTW92ZSB0aGUgY2h1bmsgdG8gdGhlIHJldHJhbnNtaXQgcXVldWUuIFRoZSBjaHVua3MKKwkJCSAqIG9uIHRoZSByZXRyYW5zbWl0IHF1ZXVlIGFyZSBhbHdheXMga2VwdCBpbiBvcmRlci4KKwkJCSAqLworCQkJbGlzdF9kZWxfaW5pdChsY2h1bmspOworCQkJc2N0cF9pbnNlcnRfbGlzdCgmcS0+cmV0cmFuc21pdCwgbGNodW5rKTsKKwkJfQorCX0KKworCVNDVFBfREVCVUdfUFJJTlRLKCIlczogdHJhbnNwb3J0OiAlcCwgZmFzdF9yZXRyYW5zbWl0OiAlZCwgIgorCQkJICAiY3duZDogJWQsIHNzdGhyZXNoOiAlZCwgZmxpZ2h0X3NpemU6ICVkLCAiCisJCQkgICJwYmE6ICVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgIHRyYW5zcG9ydCwgZmFzdF9yZXRyYW5zbWl0LAorCQkJICB0cmFuc3BvcnQtPmN3bmQsIHRyYW5zcG9ydC0+c3N0aHJlc2gsCisJCQkgIHRyYW5zcG9ydC0+ZmxpZ2h0X3NpemUsCisJCQkgIHRyYW5zcG9ydC0+cGFydGlhbF9ieXRlc19hY2tlZCk7CisKK30KKworLyogTWFyayBhbGwgdGhlIGVsaWdpYmxlIHBhY2tldHMgb24gYSB0cmFuc3BvcnQgZm9yIHJldHJhbnNtaXNzaW9uIGFuZCBmb3JjZQorICogb25lIHBhY2tldCBvdXQuCisgKi8KK3ZvaWQgc2N0cF9yZXRyYW5zbWl0KHN0cnVjdCBzY3RwX291dHEgKnEsIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0LAorCQkgICAgIHNjdHBfcmV0cmFuc21pdF9yZWFzb25fdCByZWFzb24pCit7CisJaW50IGVycm9yID0gMDsKKwlfX3U4IGZhc3RfcmV0cmFuc21pdCA9IDA7CisKKwlzd2l0Y2gocmVhc29uKSB7CisJY2FzZSBTQ1RQX1JUWFJfVDNfUlRYOgorCQlzY3RwX3RyYW5zcG9ydF9sb3dlcl9jd25kKHRyYW5zcG9ydCwgU0NUUF9MT1dFUl9DV05EX1QzX1JUWCk7CisJCS8qIFVwZGF0ZSB0aGUgcmV0cmFuIHBhdGggaWYgdGhlIFQzLXJ0eCB0aW1lciBoYXMgZXhwaXJlZCBmb3IKKwkJICogdGhlIGN1cnJlbnQgcmV0cmFuIHBhdGguCisJCSAqLworCQlpZiAodHJhbnNwb3J0ID09IHRyYW5zcG9ydC0+YXNvYy0+cGVlci5yZXRyYW5fcGF0aCkKKwkJCXNjdHBfYXNzb2NfdXBkYXRlX3JldHJhbl9wYXRoKHRyYW5zcG9ydC0+YXNvYyk7CisJCWJyZWFrOworCWNhc2UgU0NUUF9SVFhSX0ZBU1RfUlRYOgorCQlzY3RwX3RyYW5zcG9ydF9sb3dlcl9jd25kKHRyYW5zcG9ydCwgU0NUUF9MT1dFUl9DV05EX0ZBU1RfUlRYKTsKKwkJZmFzdF9yZXRyYW5zbWl0ID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTQ1RQX1JUWFJfUE1UVUQ6CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJc2N0cF9yZXRyYW5zbWl0X21hcmsocSwgdHJhbnNwb3J0LCBmYXN0X3JldHJhbnNtaXQpOworCisJLyogUFItU0NUUCBBNSkgQW55IHRpbWUgdGhlIFQzLXJ0eCB0aW1lciBleHBpcmVzLCBvbiBhbnkgZGVzdGluYXRpb24sCisJICogdGhlIHNlbmRlciBTSE9VTEQgdHJ5IHRvIGFkdmFuY2UgdGhlICJBZHZhbmNlZC5QZWVyLkFjay5Qb2ludCIgYnkKKwkgKiBmb2xsb3dpbmcgdGhlIHByb2NlZHVyZXMgb3V0bGluZWQgaW4gQzEgLSBDNS4KKwkgKi8KKwlzY3RwX2dlbmVyYXRlX2Z3ZHRzbihxLCBxLT5hc29jLT5jdHNuX2Fja19wb2ludCk7CisKKwllcnJvciA9IHNjdHBfb3V0cV9mbHVzaChxLCAvKiBydHhfdGltZW91dCAqLyAxKTsKKworCWlmIChlcnJvcikKKwkJcS0+YXNvYy0+YmFzZS5zay0+c2tfZXJyID0gLWVycm9yOworfQorCisvKgorICogVHJhbnNtaXQgREFUQSBjaHVua3Mgb24gdGhlIHJldHJhbnNtaXQgcXVldWUuICBVcG9uIHJldHVybiBmcm9tCisgKiBzY3RwX291dHFfZmx1c2hfcnR4KCkgdGhlIHBhY2tldCAncGt0JyBtYXkgY29udGFpbiBjaHVua3Mgd2hpY2gKKyAqIG5lZWQgdG8gYmUgdHJhbnNtaXR0ZWQgYnkgdGhlIGNhbGxlci4KKyAqIFdlIGFzc3VtZSB0aGF0IHBrdC0+dHJhbnNwb3J0IGhhcyBhbHJlYWR5IGJlZW4gc2V0LgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBub3JtYWwga2VybmVsIGVycm9yIHJldHVybiB2YWx1ZS4KKyAqLworc3RhdGljIGludCBzY3RwX291dHFfZmx1c2hfcnR4KHN0cnVjdCBzY3RwX291dHEgKnEsIHN0cnVjdCBzY3RwX3BhY2tldCAqcGt0LAorCQkJICAgICAgIGludCBydHhfdGltZW91dCwgaW50ICpzdGFydF90aW1lcikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpscXVldWU7CisJc3RydWN0IGxpc3RfaGVhZCAqbGNodW5rLCAqbGNodW5rMTsKKwlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydCA9IHBrdC0+dHJhbnNwb3J0OworCXNjdHBfeG1pdF90IHN0YXR1czsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssICpjaHVuazE7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CisJaW50IGVycm9yID0gMDsKKworCWFzb2MgPSBxLT5hc29jOworCWxxdWV1ZSA9ICZxLT5yZXRyYW5zbWl0OworCisJLyogUkZDIDI5NjAgNi4zLjMgSGFuZGxlIFQzLXJ0eCBFeHBpcmF0aW9uCisJICoKKwkgKiBFMykgRGV0ZXJtaW5lIGhvdyBtYW55IG9mIHRoZSBlYXJsaWVzdCAoaS5lLiwgbG93ZXN0IFRTTikKKwkgKiBvdXRzdGFuZGluZyBEQVRBIGNodW5rcyBmb3IgdGhlIGFkZHJlc3MgZm9yIHdoaWNoIHRoZQorCSAqIFQzLXJ0eCBoYXMgZXhwaXJlZCB3aWxsIGZpdCBpbnRvIGEgc2luZ2xlIHBhY2tldCwgc3ViamVjdAorCSAqIHRvIHRoZSBNVFUgY29uc3RyYWludCBmb3IgdGhlIHBhdGggY29ycmVzcG9uZGluZyB0byB0aGUKKwkgKiBkZXN0aW5hdGlvbiB0cmFuc3BvcnQgYWRkcmVzcyB0byB3aGljaCB0aGUgcmV0cmFuc21pc3Npb24KKwkgKiBpcyBiZWluZyBzZW50ICh0aGlzIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgYWRkcmVzcyBmb3IKKwkgKiB3aGljaCB0aGUgdGltZXIgZXhwaXJlcyBbc2VlIFNlY3Rpb24gNi40XSkuIENhbGwgdGhpcyB2YWx1ZQorCSAqIEsuIEJ1bmRsZSBhbmQgcmV0cmFuc21pdCB0aG9zZSBLIERBVEEgY2h1bmtzIGluIGEgc2luZ2xlCisJICogcGFja2V0IHRvIHRoZSBkZXN0aW5hdGlvbiBlbmRwb2ludC4KKwkgKgorCSAqIFtKdXN0IHRvIGJlIHBhaW5mdWxseSBjbGVhciwgaWYgd2UgYXJlIHJldHJhbnNtaXR0aW5nCisJICogYmVjYXVzZSBhIHRpbWVvdXQganVzdCBoYXBwZW5lZCwgd2Ugc2hvdWxkIHNlbmQgb25seSBPTkUKKwkgKiBwYWNrZXQgb2YgcmV0cmFuc21pdHRlZCBkYXRhLl0KKwkgKi8KKwlsY2h1bmsgPSBzY3RwX2xpc3RfZGVxdWV1ZShscXVldWUpOworCisJd2hpbGUgKGxjaHVuaykgeworCQljaHVuayA9IGxpc3RfZW50cnkobGNodW5rLCBzdHJ1Y3Qgc2N0cF9jaHVuaywKKwkJCQkgICB0cmFuc21pdHRlZF9saXN0KTsKKworCQkvKiBNYWtlIHN1cmUgdGhhdCBHYXAgQWNrZWQgVFNOcyBhcmUgbm90IHJldHJhbnNtaXR0ZWQuICBBCisJCSAqIHNpbXBsZSBhcHByb2FjaCBpcyBqdXN0IHRvIG1vdmUgc3VjaCBUU05zIG91dCBvZiB0aGUKKwkJICogd2F5IGFuZCBpbnRvIGEgJ3RyYW5zbWl0dGVkJyBxdWV1ZSBhbmQgc2tpcCB0byB0aGUKKwkJICogbmV4dCBjaHVuay4KKwkJICovCisJCWlmIChjaHVuay0+dHNuX2dhcF9hY2tlZCkgeworCQkJbGlzdF9hZGRfdGFpbChsY2h1bmssICZ0cmFuc3BvcnQtPnRyYW5zbWl0dGVkKTsKKwkJCWxjaHVuayA9IHNjdHBfbGlzdF9kZXF1ZXVlKGxxdWV1ZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIEF0dGVtcHQgdG8gYXBwZW5kIHRoaXMgY2h1bmsgdG8gdGhlIHBhY2tldC4gKi8KKwkJc3RhdHVzID0gc2N0cF9wYWNrZXRfYXBwZW5kX2NodW5rKHBrdCwgY2h1bmspOworCisJCXN3aXRjaCAoc3RhdHVzKSB7CisJCWNhc2UgU0NUUF9YTUlUX1BNVFVfRlVMTDoKKwkJCS8qIFNlbmQgdGhpcyBwYWNrZXQuICAqLworCQkJaWYgKChlcnJvciA9IHNjdHBfcGFja2V0X3RyYW5zbWl0KHBrdCkpID09IDApCisJCQkJKnN0YXJ0X3RpbWVyID0gMTsKKworCQkJLyogSWYgd2UgYXJlIHJldHJhbnNtaXR0aW5nLCB3ZSBzaG91bGQgb25seQorCQkJICogc2VuZCBhIHNpbmdsZSBwYWNrZXQuCisJCQkgKi8KKwkJCWlmIChydHhfdGltZW91dCkgeworCQkJCWxpc3RfYWRkKGxjaHVuaywgbHF1ZXVlKTsKKwkJCQlsY2h1bmsgPSBOVUxMOworCQkJfQorCisJCQkvKiBCdW5kbGUgbGNodW5rIGluIHRoZSBuZXh0IHJvdW5kLiAgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgU0NUUF9YTUlUX1JXTkRfRlVMTDoKKwkJICAgICAgICAvKiBTZW5kIHRoaXMgcGFja2V0LiAqLworCQkJaWYgKChlcnJvciA9IHNjdHBfcGFja2V0X3RyYW5zbWl0KHBrdCkpID09IDApCisJCQkJKnN0YXJ0X3RpbWVyID0gMTsKKworCQkJLyogU3RvcCBzZW5kaW5nIERBVEEgYXMgdGhlcmUgaXMgbm8gbW9yZSByb29tCisJCQkgKiBhdCB0aGUgcmVjZWl2ZXIuCisJCQkgKi8KKwkJCWxpc3RfYWRkKGxjaHVuaywgbHF1ZXVlKTsKKwkJCWxjaHVuayA9IE5VTEw7CisJCQlicmVhazsKKworCQljYXNlIFNDVFBfWE1JVF9OQUdMRV9ERUxBWToKKwkJICAgICAgICAvKiBTZW5kIHRoaXMgcGFja2V0LiAqLworCQkJaWYgKChlcnJvciA9IHNjdHBfcGFja2V0X3RyYW5zbWl0KHBrdCkpID09IDApCisJCQkJKnN0YXJ0X3RpbWVyID0gMTsKKworCQkJLyogU3RvcCBzZW5kaW5nIERBVEEgYmVjYXVzZSBvZiBuYWdsZSBkZWxheS4gKi8KKwkJCWxpc3RfYWRkKGxjaHVuaywgbHF1ZXVlKTsKKwkJCWxjaHVuayA9IE5VTEw7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJLyogVGhlIGFwcGVuZCB3YXMgc3VjY2Vzc2Z1bCwgc28gYWRkIHRoaXMgY2h1bmsgdG8KKwkJCSAqIHRoZSB0cmFuc21pdHRlZCBsaXN0LgorCQkJICovCisJCQlsaXN0X2FkZF90YWlsKGxjaHVuaywgJnRyYW5zcG9ydC0+dHJhbnNtaXR0ZWQpOworCisJCQkvKiBNYXJrIHRoZSBjaHVuayBhcyBpbmVsaWdpYmxlIGZvciBmYXN0IHJldHJhbnNtaXQgCisJCQkgKiBhZnRlciBpdCBpcyByZXRyYW5zbWl0dGVkLgorCQkJICovCisJCQljaHVuay0+ZmFzdF9yZXRyYW5zbWl0ID0gMDsKKworCQkJKnN0YXJ0X3RpbWVyID0gMTsKKwkJCXEtPmVtcHR5ID0gMDsKKworCQkJLyogUmV0cmlldmUgYSBuZXcgY2h1bmsgdG8gYnVuZGxlLiAqLworCQkJbGNodW5rID0gc2N0cF9saXN0X2RlcXVldWUobHF1ZXVlKTsKKwkJCWJyZWFrOworCQl9OworCisJCS8qIElmIHdlIGFyZSBoZXJlIGR1ZSB0byBhIHJldHJhbnNtaXQgdGltZW91dCBvciBhIGZhc3QKKwkJICogcmV0cmFuc21pdCBhbmQgaWYgdGhlcmUgYXJlIGFueSBjaHVua3MgbGVmdCBpbiB0aGUgcmV0cmFuc21pdAorCQkgKiBxdWV1ZSB0aGF0IGNvdWxkIG5vdCBmaXQgaW4gdGhlIFBNVFUgc2l6ZWQgcGFja2V0LCB0aGV5IG5lZWQJCQkgKiB0byBiZSBtYXJrZWQgYXMgaW5lbGlnaWJsZSBmb3IgYSBzdWJzZXF1ZW50IGZhc3QgcmV0cmFuc21pdC4KKwkJICovCisJCWlmIChydHhfdGltZW91dCAmJiAhbGNodW5rKSB7CisJCQlsaXN0X2Zvcl9lYWNoKGxjaHVuazEsIGxxdWV1ZSkgeworCQkJCWNodW5rMSA9IGxpc3RfZW50cnkobGNodW5rMSwgc3RydWN0IHNjdHBfY2h1bmssCisJCQkJCQkgICAgdHJhbnNtaXR0ZWRfbGlzdCk7CisJCQkJY2h1bmsxLT5mYXN0X3JldHJhbnNtaXQgPSAwOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCisvKiBDb3JrIHRoZSBvdXRxdWV1ZSBzbyBxdWV1ZWQgY2h1bmtzIGFyZSByZWFsbHkgcXVldWVkLiAqLworaW50IHNjdHBfb3V0cV91bmNvcmsoc3RydWN0IHNjdHBfb3V0cSAqcSkKK3sKKwlpbnQgZXJyb3IgPSAwOworCWlmIChxLT5jb3JrKSB7CisJCXEtPmNvcmsgPSAwOworCQllcnJvciA9IHNjdHBfb3V0cV9mbHVzaChxLCAwKTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogVHJ5IHRvIGZsdXNoIGFuIG91dHF1ZXVlLgorICoKKyAqIERlc2NyaXB0aW9uOiBTZW5kIGV2ZXJ5dGhpbmcgaW4gcSB3aGljaCB3ZSBsZWdhbGx5IGNhbiwgc3ViamVjdCB0bworICogY29uZ2VzdGlvbiBsaW1pdGF0aW9ucy4KKyAqICogTm90ZTogVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGZyb20gbXVsdGlwbGUgY29udGV4dHMgc28gYXBwcm9wcmlhdGUKKyAqIGxvY2tpbmcgY29uY2VybnMgbXVzdCBiZSBtYWRlLiAgVG9kYXkgd2UgdXNlIHRoZSBzb2NrIGxvY2sgdG8gcHJvdGVjdAorICogdGhpcyBmdW5jdGlvbi4KKyAqLworaW50IHNjdHBfb3V0cV9mbHVzaChzdHJ1Y3Qgc2N0cF9vdXRxICpxLCBpbnQgcnR4X3RpbWVvdXQpCit7CisJc3RydWN0IHNjdHBfcGFja2V0ICpwYWNrZXQ7CisJc3RydWN0IHNjdHBfcGFja2V0IHNpbmdsZXRvbjsKKwlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYyA9IHEtPmFzb2M7CisJX191MTYgc3BvcnQgPSBhc29jLT5iYXNlLmJpbmRfYWRkci5wb3J0OworCV9fdTE2IGRwb3J0ID0gYXNvYy0+cGVlci5wb3J0OworCV9fdTMyIHZ0YWcgPSBhc29jLT5wZWVyLmkuaW5pdF90YWc7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCAqcXVldWU7CisJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqbmV3X3RyYW5zcG9ydDsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bms7CisJc2N0cF94bWl0X3Qgc3RhdHVzOworCWludCBlcnJvciA9IDA7CisJaW50IHN0YXJ0X3RpbWVyID0gMDsKKworCS8qIFRoZXNlIHRyYW5zcG9ydHMgaGF2ZSBjaHVua3MgdG8gc2VuZC4gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHRyYW5zcG9ydF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgKmx0cmFuc3BvcnQ7CisKKwlJTklUX0xJU1RfSEVBRCgmdHJhbnNwb3J0X2xpc3QpOworCXBhY2tldCA9IE5VTEw7CisKKwkvKgorCSAqIDYuMTAgQnVuZGxpbmcKKwkgKiAgIC4uLgorCSAqICAgV2hlbiBidW5kbGluZyBjb250cm9sIGNodW5rcyB3aXRoIERBVEEgY2h1bmtzLCBhbgorCSAqICAgZW5kcG9pbnQgTVVTVCBwbGFjZSBjb250cm9sIGNodW5rcyBmaXJzdCBpbiB0aGUgb3V0Ym91bmQKKwkgKiAgIFNDVFAgcGFja2V0LiAgVGhlIHRyYW5zbWl0dGVyIE1VU1QgdHJhbnNtaXQgREFUQSBjaHVua3MKKwkgKiAgIHdpdGhpbiBhIFNDVFAgcGFja2V0IGluIGluY3JlYXNpbmcgb3JkZXIgb2YgVFNOLgorCSAqICAgLi4uCisJICovCisKKwlxdWV1ZSA9ICZxLT5jb250cm9sOworCXdoaWxlICgoY2h1bmsgPSAoc3RydWN0IHNjdHBfY2h1bmsgKilza2JfZGVxdWV1ZShxdWV1ZSkpICE9IE5VTEwpIHsKKwkJLyogUGljayB0aGUgcmlnaHQgdHJhbnNwb3J0IHRvIHVzZS4gKi8KKwkJbmV3X3RyYW5zcG9ydCA9IGNodW5rLT50cmFuc3BvcnQ7CisKKwkJaWYgKCFuZXdfdHJhbnNwb3J0KSB7CisJCQluZXdfdHJhbnNwb3J0ID0gYXNvYy0+cGVlci5hY3RpdmVfcGF0aDsKKwkJfSBlbHNlIGlmICghbmV3X3RyYW5zcG9ydC0+YWN0aXZlKSB7CisJCQkvKiBJZiB0aGUgY2h1bmsgaXMgSGVhcnRiZWF0IG9yIEhlYXJ0YmVhdCBBY2ssIAorCQkJICogc2VuZCBpdCB0byBjaHVuay0+dHJhbnNwb3J0LCBldmVuIGlmIGl0J3MgCisJCQkgKiBpbmFjdGl2ZS4KKwkJCSAqCisJCQkgKiAzLjMuNiBIZWFydGJlYXQgQWNrbm93bGVkZ2VtZW50OgorCQkJICogLi4uICAKKwkJCSAqIEEgSEVBUlRCRUFUIEFDSyBpcyBhbHdheXMgc2VudCB0byB0aGUgc291cmNlIElQCisJCQkgKiBhZGRyZXNzIG9mIHRoZSBJUCBkYXRhZ3JhbSBjb250YWluaW5nIHRoZQorCQkJICogSEVBUlRCRUFUIGNodW5rIHRvIHdoaWNoIHRoaXMgYWNrIGlzIHJlc3BvbmRpbmcuCisJCQkgKiAuLi4gIAorCQkJICovCisJCQlpZiAoY2h1bmstPmNodW5rX2hkci0+dHlwZSAhPSBTQ1RQX0NJRF9IRUFSVEJFQVQgJiYKKwkJCSAgICBjaHVuay0+Y2h1bmtfaGRyLT50eXBlICE9IFNDVFBfQ0lEX0hFQVJUQkVBVF9BQ0spCisJCQkJbmV3X3RyYW5zcG9ydCA9IGFzb2MtPnBlZXIuYWN0aXZlX3BhdGg7CisJCX0KKworCQkvKiBBcmUgd2Ugc3dpdGNoaW5nIHRyYW5zcG9ydHM/CisJCSAqIFRha2UgY2FyZSBvZiB0cmFuc3BvcnQgbG9ja3MuCisJCSAqLworCQlpZiAobmV3X3RyYW5zcG9ydCAhPSB0cmFuc3BvcnQpIHsKKwkJCXRyYW5zcG9ydCA9IG5ld190cmFuc3BvcnQ7CisJCQlpZiAobGlzdF9lbXB0eSgmdHJhbnNwb3J0LT5zZW5kX3JlYWR5KSkgeworCQkJCWxpc3RfYWRkX3RhaWwoJnRyYW5zcG9ydC0+c2VuZF9yZWFkeSwKKwkJCQkJICAgICAgJnRyYW5zcG9ydF9saXN0KTsKKwkJCX0KKwkJCXBhY2tldCA9ICZ0cmFuc3BvcnQtPnBhY2tldDsKKwkJCXNjdHBfcGFja2V0X2NvbmZpZyhwYWNrZXQsIHZ0YWcsCisJCQkJCSAgIGFzb2MtPnBlZXIuZWNuX2NhcGFibGUpOworCQl9CisKKwkJc3dpdGNoIChjaHVuay0+Y2h1bmtfaGRyLT50eXBlKSB7CisJCS8qCisJCSAqIDYuMTAgQnVuZGxpbmcKKwkJICogICAuLi4KKwkJICogICBBbiBlbmRwb2ludCBNVVNUIE5PVCBidW5kbGUgSU5JVCwgSU5JVCBBQ0sgb3IgU0hVVERPV04KKwkJICogICBDT01QTEVURSB3aXRoIGFueSBvdGhlciBjaHVua3MuICBbU2VuZCB0aGVtIGltbWVkaWF0ZWx5Ll0KKwkJICovCisJCWNhc2UgU0NUUF9DSURfSU5JVDoKKwkJY2FzZSBTQ1RQX0NJRF9JTklUX0FDSzoKKwkJY2FzZSBTQ1RQX0NJRF9TSFVURE9XTl9DT01QTEVURToKKwkJCXNjdHBfcGFja2V0X2luaXQoJnNpbmdsZXRvbiwgdHJhbnNwb3J0LCBzcG9ydCwgZHBvcnQpOworCQkJc2N0cF9wYWNrZXRfY29uZmlnKCZzaW5nbGV0b24sIHZ0YWcsIDApOworCQkJc2N0cF9wYWNrZXRfYXBwZW5kX2NodW5rKCZzaW5nbGV0b24sIGNodW5rKTsKKwkJCWVycm9yID0gc2N0cF9wYWNrZXRfdHJhbnNtaXQoJnNpbmdsZXRvbik7CisJCQlpZiAoZXJyb3IgPCAwKQorCQkJCXJldHVybiBlcnJvcjsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NUUF9DSURfQUJPUlQ6CisJCWNhc2UgU0NUUF9DSURfU0FDSzoKKwkJY2FzZSBTQ1RQX0NJRF9IRUFSVEJFQVQ6CisJCWNhc2UgU0NUUF9DSURfSEVBUlRCRUFUX0FDSzoKKwkJY2FzZSBTQ1RQX0NJRF9TSFVURE9XTjoKKwkJY2FzZSBTQ1RQX0NJRF9TSFVURE9XTl9BQ0s6CisJCWNhc2UgU0NUUF9DSURfRVJST1I6CisJCWNhc2UgU0NUUF9DSURfQ09PS0lFX0VDSE86CisJCWNhc2UgU0NUUF9DSURfQ09PS0lFX0FDSzoKKwkJY2FzZSBTQ1RQX0NJRF9FQ05fRUNORToKKwkJY2FzZSBTQ1RQX0NJRF9FQ05fQ1dSOgorCQljYXNlIFNDVFBfQ0lEX0FTQ09ORjoKKwkJY2FzZSBTQ1RQX0NJRF9BU0NPTkZfQUNLOgorCQljYXNlIFNDVFBfQ0lEX0ZXRF9UU046CisJCQlzY3RwX3BhY2tldF90cmFuc21pdF9jaHVuayhwYWNrZXQsIGNodW5rKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkvKiBXZSBidWlsdCBhIGNodW5rIHdpdGggYW4gaWxsZWdhbCB0eXBlISAqLworCQkJQlVHKCk7CisJCX07CisJfQorCisJLyogSXMgaXQgT0sgdG8gc2VuZCBkYXRhIGNodW5rcz8gICovCisJc3dpdGNoIChhc29jLT5zdGF0ZSkgeworCWNhc2UgU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEOgorCQkvKiBPbmx5IGFsbG93IGJ1bmRsaW5nIHdoZW4gdGhpcyBwYWNrZXQgaGFzIGEgQ09PS0lFLUVDSE8KKwkJICogY2h1bmsuCisJCSAqLworCQlpZiAoIXBhY2tldCB8fCAhcGFja2V0LT5oYXNfY29va2llX2VjaG8pCisJCQlicmVhazsKKworCQkvKiBmYWxsdGhydSAqLworCWNhc2UgU0NUUF9TVEFURV9FU1RBQkxJU0hFRDoKKwljYXNlIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORzoKKwljYXNlIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQ6CisJCS8qCisJCSAqIFJGQyAyOTYwIDYuMSAgVHJhbnNtaXNzaW9uIG9mIERBVEEgQ2h1bmtzCisJCSAqCisJCSAqIEMpIFdoZW4gdGhlIHRpbWUgY29tZXMgZm9yIHRoZSBzZW5kZXIgdG8gdHJhbnNtaXQsCisJCSAqIGJlZm9yZSBzZW5kaW5nIG5ldyBEQVRBIGNodW5rcywgdGhlIHNlbmRlciBNVVNUCisJCSAqIGZpcnN0IHRyYW5zbWl0IGFueSBvdXRzdGFuZGluZyBEQVRBIGNodW5rcyB3aGljaAorCQkgKiBhcmUgbWFya2VkIGZvciByZXRyYW5zbWlzc2lvbiAobGltaXRlZCBieSB0aGUKKwkJICogY3VycmVudCBjd25kKS4KKwkJICovCisJCWlmICghbGlzdF9lbXB0eSgmcS0+cmV0cmFuc21pdCkpIHsKKwkJCWlmICh0cmFuc3BvcnQgPT0gYXNvYy0+cGVlci5yZXRyYW5fcGF0aCkKKwkJCQlnb3RvIHJldHJhbjsKKworCQkJLyogU3dpdGNoIHRyYW5zcG9ydHMgJiBwcmVwYXJlIHRoZSBwYWNrZXQuICAqLworCisJCQl0cmFuc3BvcnQgPSBhc29jLT5wZWVyLnJldHJhbl9wYXRoOworCisJCQlpZiAobGlzdF9lbXB0eSgmdHJhbnNwb3J0LT5zZW5kX3JlYWR5KSkgeworCQkJCWxpc3RfYWRkX3RhaWwoJnRyYW5zcG9ydC0+c2VuZF9yZWFkeSwKKwkJCQkJICAgICAgJnRyYW5zcG9ydF9saXN0KTsKKwkJCX0KKworCQkJcGFja2V0ID0gJnRyYW5zcG9ydC0+cGFja2V0OworCQkJc2N0cF9wYWNrZXRfY29uZmlnKHBhY2tldCwgdnRhZywKKwkJCQkJICAgYXNvYy0+cGVlci5lY25fY2FwYWJsZSk7CisJCXJldHJhbjoKKwkJCWVycm9yID0gc2N0cF9vdXRxX2ZsdXNoX3J0eChxLCBwYWNrZXQsCisJCQkJCQkgICAgcnR4X3RpbWVvdXQsICZzdGFydF90aW1lcik7CisKKwkJCWlmIChzdGFydF90aW1lcikKKwkJCQlzY3RwX3RyYW5zcG9ydF9yZXNldF90aW1lcnModHJhbnNwb3J0KTsKKworCQkJLyogVGhpcyBjYW4gaGFwcGVuIG9uIENPT0tJRS1FQ0hPIHJlc2VuZC4gIE9ubHkKKwkJCSAqIG9uZSBjaHVuayBjYW4gZ2V0IGJ1bmRsZWQgd2l0aCBhIENPT0tJRS1FQ0hPLgorCQkJICovCisJCQlpZiAocGFja2V0LT5oYXNfY29va2llX2VjaG8pCisJCQkJZ290byBzY3RwX2ZsdXNoX291dDsKKworCQkJLyogRG9uJ3Qgc2VuZCBuZXcgZGF0YSBpZiB0aGVyZSBpcyBzdGlsbCBkYXRhCisJCQkgKiB3YWl0aW5nIHRvIHJldHJhbnNtaXQuCisJCQkgKi8KKwkJCWlmICghbGlzdF9lbXB0eSgmcS0+cmV0cmFuc21pdCkpCisJCQkJZ290byBzY3RwX2ZsdXNoX291dDsKKwkJfQorCisJCS8qIEZpbmFsbHksIHRyYW5zbWl0IG5ldyBwYWNrZXRzLiAgKi8KKwkJc3RhcnRfdGltZXIgPSAwOworCQlxdWV1ZSA9ICZxLT5vdXQ7CisKKwkJd2hpbGUgKChjaHVuayA9IHNjdHBfb3V0cV9kZXF1ZXVlX2RhdGEocSkpICE9IE5VTEwpIHsKKwkJCS8qIFJGQyAyOTYwIDYuNSBFdmVyeSBEQVRBIGNodW5rIE1VU1QgY2FycnkgYSB2YWxpZAorCQkJICogc3RyZWFtIGlkZW50aWZpZXIuCisJCQkgKi8KKwkJCWlmIChjaHVuay0+c2luZm8uc2luZm9fc3RyZWFtID49CisJCQkgICAgYXNvYy0+Yy5zaW5pdF9udW1fb3N0cmVhbXMpIHsKKworCQkJCS8qIE1hcmsgYXMgZmFpbGVkIHNlbmQuICovCisJCQkJc2N0cF9jaHVua19mYWlsKGNodW5rLCBTQ1RQX0VSUk9SX0lOVl9TVFJNKTsKKwkJCQlzY3RwX2NodW5rX2ZyZWUoY2h1bmspOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBIYXMgdGhpcyBjaHVuayBleHBpcmVkPyAqLworCQkJaWYgKHNjdHBfY2h1bmtfYWJhbmRvbmVkKGNodW5rKSkgeworCQkJCXNjdHBfY2h1bmtfZmFpbChjaHVuaywgMCk7CisJCQkJc2N0cF9jaHVua19mcmVlKGNodW5rKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogSWYgdGhlcmUgaXMgYSBzcGVjaWZpZWQgdHJhbnNwb3J0LCB1c2UgaXQuCisJCQkgKiBPdGhlcndpc2UsIHdlIHdhbnQgdG8gdXNlIHRoZSBhY3RpdmUgcGF0aC4KKwkJCSAqLworCQkJbmV3X3RyYW5zcG9ydCA9IGNodW5rLT50cmFuc3BvcnQ7CisJCQlpZiAoIW5ld190cmFuc3BvcnQgfHwgIW5ld190cmFuc3BvcnQtPmFjdGl2ZSkKKwkJCQluZXdfdHJhbnNwb3J0ID0gYXNvYy0+cGVlci5hY3RpdmVfcGF0aDsKKworCQkJLyogQ2hhbmdlIHBhY2tldHMgaWYgbmVjZXNzYXJ5LiAgKi8KKwkJCWlmIChuZXdfdHJhbnNwb3J0ICE9IHRyYW5zcG9ydCkgeworCQkJCXRyYW5zcG9ydCA9IG5ld190cmFuc3BvcnQ7CisKKwkJCQkvKiBTY2hlZHVsZSB0byBoYXZlIHRoaXMgdHJhbnNwb3J0J3MKKwkJCQkgKiBwYWNrZXQgZmx1c2hlZC4KKwkJCQkgKi8KKwkJCQlpZiAobGlzdF9lbXB0eSgmdHJhbnNwb3J0LT5zZW5kX3JlYWR5KSkgeworCQkJCQlsaXN0X2FkZF90YWlsKCZ0cmFuc3BvcnQtPnNlbmRfcmVhZHksCisJCQkJCQkgICAgICAmdHJhbnNwb3J0X2xpc3QpOworCQkJCX0KKworCQkJCXBhY2tldCA9ICZ0cmFuc3BvcnQtPnBhY2tldDsKKwkJCQlzY3RwX3BhY2tldF9jb25maWcocGFja2V0LCB2dGFnLAorCQkJCQkJICAgYXNvYy0+cGVlci5lY25fY2FwYWJsZSk7CisJCQl9CisKKwkJCVNDVFBfREVCVUdfUFJJTlRLKCJzY3RwX291dHFfZmx1c2goJXAsICVwWyVzXSksICIsCisJCQkJCSAgcSwgY2h1bmssCisJCQkJCSAgY2h1bmsgJiYgY2h1bmstPmNodW5rX2hkciA/CisJCQkJCSAgc2N0cF9jbmFtZShTQ1RQX1NUX0NIVU5LKAorCQkJCQkJICBjaHVuay0+Y2h1bmtfaGRyLT50eXBlKSkKKwkJCQkJICA6ICJJbGxlZ2FsIENodW5rIik7CisKKwkJCVNDVFBfREVCVUdfUFJJTlRLKCJUWCBUU04gMHgleCBza2ItPmhlYWQgIgorCQkJCQkiJXAgc2tiLT51c2VycyAlZC5cbiIsCisJCQkJCW50b2hsKGNodW5rLT5zdWJoLmRhdGFfaGRyLT50c24pLAorCQkJCQljaHVuay0+c2tiID9jaHVuay0+c2tiLT5oZWFkIDogTlVMTCwKKwkJCQkJY2h1bmstPnNrYiA/CisJCQkJCWF0b21pY19yZWFkKCZjaHVuay0+c2tiLT51c2VycykgOiAtMSk7CisKKwkJCS8qIEFkZCB0aGUgY2h1bmsgdG8gdGhlIHBhY2tldC4gICovCisJCQlzdGF0dXMgPSBzY3RwX3BhY2tldF90cmFuc21pdF9jaHVuayhwYWNrZXQsIGNodW5rKTsKKworCQkJc3dpdGNoIChzdGF0dXMpIHsKKwkJCWNhc2UgU0NUUF9YTUlUX1BNVFVfRlVMTDoKKwkJCWNhc2UgU0NUUF9YTUlUX1JXTkRfRlVMTDoKKwkJCWNhc2UgU0NUUF9YTUlUX05BR0xFX0RFTEFZOgorCQkJCS8qIFdlIGNvdWxkIG5vdCBhcHBlbmQgdGhpcyBjaHVuaywgc28gcHV0CisJCQkJICogdGhlIGNodW5rIGJhY2sgb24gdGhlIG91dHB1dCBxdWV1ZS4KKwkJCQkgKi8KKwkJCQlTQ1RQX0RFQlVHX1BSSU5USygic2N0cF9vdXRxX2ZsdXNoOiBjb3VsZCAiCisJCQkJCSJub3QgdHJhbnNtaXQgVFNOOiAweCV4LCBzdGF0dXM6ICVkXG4iLAorCQkJCQludG9obChjaHVuay0+c3ViaC5kYXRhX2hkci0+dHNuKSwKKwkJCQkJc3RhdHVzKTsKKwkJCQlzY3RwX291dHFfaGVhZF9kYXRhKHEsIGNodW5rKTsKKwkJCQlnb3RvIHNjdHBfZmx1c2hfb3V0OworCQkJCWJyZWFrOworCisJCQljYXNlIFNDVFBfWE1JVF9PSzoKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlCVUcoKTsKKwkJCX0KKworCQkJLyogQlVHOiBXZSBhc3N1bWUgdGhhdCB0aGUgc2N0cF9wYWNrZXRfdHJhbnNtaXQoKSAKKwkJCSAqIGNhbGwgYmVsb3cgd2lsbCBzdWNjZWVkIGFsbCB0aGUgdGltZSBhbmQgYWRkIHRoZQorCQkJICogY2h1bmsgdG8gdGhlIHRyYW5zbWl0dGVkIGxpc3QgYW5kIHJlc3RhcnQgdGhlCisJCQkgKiB0aW1lcnMuCisJCQkgKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBjYWxsIGNhbiBmYWlsIHVuZGVyIE9PTQorCQkJICogY29uZGl0aW9ucy4KKwkJCSAqCisJCQkgKiBJcyB0aGlzIHJlYWxseSBhIHByb2JsZW0/ICBXb24ndCB0aGlzIGJlaGF2ZQorCQkJICogbGlrZSBhIGxvc3QgVFNOPworCQkJICovCisJCQlsaXN0X2FkZF90YWlsKCZjaHVuay0+dHJhbnNtaXR0ZWRfbGlzdCwKKwkJCQkgICAgICAmdHJhbnNwb3J0LT50cmFuc21pdHRlZCk7CisKKwkJCXNjdHBfdHJhbnNwb3J0X3Jlc2V0X3RpbWVycyh0cmFuc3BvcnQpOworCisJCQlxLT5lbXB0eSA9IDA7CisKKwkJCS8qIE9ubHkgbGV0IG9uZSBEQVRBIGNodW5rIGdldCBidW5kbGVkIHdpdGggYQorCQkJICogQ09PS0lFLUVDSE8gY2h1bmsuCisJCQkgKi8KKwkJCWlmIChwYWNrZXQtPmhhc19jb29raWVfZWNobykKKwkJCQlnb3RvIHNjdHBfZmx1c2hfb3V0OworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogRG8gbm90aGluZy4gICovCisJCWJyZWFrOworCX0KKworc2N0cF9mbHVzaF9vdXQ6CisKKwkvKiBCZWZvcmUgcmV0dXJuaW5nLCBleGFtaW5lIGFsbCB0aGUgdHJhbnNwb3J0cyB0b3VjaGVkIGluCisJICogdGhpcyBjYWxsLiAgUmlnaHQgbm93LCB3ZSBibHVudGx5IGZvcmNlIGNsZWFyIGFsbCB0aGUKKwkgKiB0cmFuc3BvcnRzLiAgVGhpbmdzIG1pZ2h0IGNoYW5nZSBhZnRlciB3ZSBpbXBsZW1lbnQgTmFnbGUuCisJICogQnV0IHN1Y2ggYW4gZXhhbWluYXRpb24gaXMgc3RpbGwgcmVxdWlyZWQuCisJICoKKwkgKiAtLXhndW8KKwkgKi8KKwl3aGlsZSAoKGx0cmFuc3BvcnQgPSBzY3RwX2xpc3RfZGVxdWV1ZSgmdHJhbnNwb3J0X2xpc3QpKSAhPSBOVUxMICkgeworCQlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnQgPSBsaXN0X2VudHJ5KGx0cmFuc3BvcnQsCisJCQkJCQkgICAgICBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQsCisJCQkJCQkgICAgICBzZW5kX3JlYWR5KTsKKwkJcGFja2V0ID0gJnQtPnBhY2tldDsKKwkJaWYgKCFzY3RwX3BhY2tldF9lbXB0eShwYWNrZXQpKQorCQkJZXJyb3IgPSBzY3RwX3BhY2tldF90cmFuc21pdChwYWNrZXQpOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKworLyogVXBkYXRlIHVuYWNrX2RhdGEgYmFzZWQgb24gdGhlIGluY29taW5nIFNBQ0sgY2h1bmsgKi8KK3N0YXRpYyB2b2lkIHNjdHBfc2Fja191cGRhdGVfdW5hY2tfZGF0YShzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNzb2MsCisJCQkJCXN0cnVjdCBzY3RwX3NhY2toZHIgKnNhY2spCit7CisJc2N0cF9zYWNrX3ZhcmlhYmxlX3QgKmZyYWdzOworCV9fdTE2IHVuYWNrX2RhdGE7CisJaW50IGk7CisKKwl1bmFja19kYXRhID0gYXNzb2MtPm5leHRfdHNuIC0gYXNzb2MtPmN0c25fYWNrX3BvaW50IC0gMTsKKworCWZyYWdzID0gc2Fjay0+dmFyaWFibGU7CisJZm9yIChpID0gMDsgaSA8IG50b2hzKHNhY2stPm51bV9nYXBfYWNrX2Jsb2Nrcyk7IGkrKykgeworCQl1bmFja19kYXRhIC09ICgobnRvaHMoZnJhZ3NbaV0uZ2FiLmVuZCkgLQorCQkJCW50b2hzKGZyYWdzW2ldLmdhYi5zdGFydCkgKyAxKSk7CisJfQorCisJYXNzb2MtPnVuYWNrX2RhdGEgPSB1bmFja19kYXRhOworfQorCisvKiBSZXR1cm4gdGhlIGhpZ2hlc3QgbmV3IHRzbiB0aGF0IGlzIGFja25vd2xlZGdlZCBieSB0aGUgZ2l2ZW4gU0FDSyBjaHVuay4gKi8KK3N0YXRpYyBfX3UzMiBzY3RwX2hpZ2hlc3RfbmV3X3RzbihzdHJ1Y3Qgc2N0cF9zYWNraGRyICpzYWNrLAorCQkJCSAgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbHRyYW5zcG9ydCwgKmxjaHVuazsKKwlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydDsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bms7CisJX191MzIgaGlnaGVzdF9uZXdfdHNuLCB0c247CisJc3RydWN0IGxpc3RfaGVhZCAqdHJhbnNwb3J0X2xpc3QgPSAmYXNvYy0+cGVlci50cmFuc3BvcnRfYWRkcl9saXN0OworCisJaGlnaGVzdF9uZXdfdHNuID0gbnRvaGwoc2Fjay0+Y3VtX3Rzbl9hY2spOworCisJbGlzdF9mb3JfZWFjaChsdHJhbnNwb3J0LCB0cmFuc3BvcnRfbGlzdCkgeworCQl0cmFuc3BvcnQgPSBsaXN0X2VudHJ5KGx0cmFuc3BvcnQsIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCwKKwkJCQkgICAgICAgdHJhbnNwb3J0cyk7CisJCWxpc3RfZm9yX2VhY2gobGNodW5rLCAmdHJhbnNwb3J0LT50cmFuc21pdHRlZCkgeworCQkJY2h1bmsgPSBsaXN0X2VudHJ5KGxjaHVuaywgc3RydWN0IHNjdHBfY2h1bmssCisJCQkJCSAgIHRyYW5zbWl0dGVkX2xpc3QpOworCQkJdHNuID0gbnRvaGwoY2h1bmstPnN1YmguZGF0YV9oZHItPnRzbik7CisKKwkJCWlmICghY2h1bmstPnRzbl9nYXBfYWNrZWQgJiYKKwkJCSAgICBUU05fbHQoaGlnaGVzdF9uZXdfdHNuLCB0c24pICYmCisJCQkgICAgc2N0cF9hY2tlZChzYWNrLCB0c24pKQorCQkJCWhpZ2hlc3RfbmV3X3RzbiA9IHRzbjsKKwkJfQorCX0KKworCXJldHVybiBoaWdoZXN0X25ld190c247Cit9CisKKy8qIFRoaXMgaXMgd2hlcmUgd2UgUkVBTExZIHByb2Nlc3MgYSBTQUNLLgorICoKKyAqIFByb2Nlc3MgdGhlIFNBQ0sgYWdhaW5zdCB0aGUgb3V0cXVldWUuICBNb3N0bHksIHRoaXMganVzdCBmcmVlcworICogdGhpbmdzIG9mZiB0aGUgdHJhbnNtaXR0ZWQgcXVldWUuCisgKi8KK2ludCBzY3RwX291dHFfc2FjayhzdHJ1Y3Qgc2N0cF9vdXRxICpxLCBzdHJ1Y3Qgc2N0cF9zYWNraGRyICpzYWNrKQoreworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jID0gcS0+YXNvYzsKKwlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydDsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqdGNodW5rID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsY2h1bmssICp0cmFuc3BvcnRfbGlzdCwgKnBvcywgKnRlbXA7CisJc2N0cF9zYWNrX3ZhcmlhYmxlX3QgKmZyYWdzID0gc2Fjay0+dmFyaWFibGU7CisJX191MzIgc2Fja19jdHNuLCBjdHNuLCB0c247CisJX191MzIgaGlnaGVzdF90c24sIGhpZ2hlc3RfbmV3X3RzbjsKKwlfX3UzMiBzYWNrX2FfcnduZDsKKwl1bnNpZ25lZCBvdXRzdGFuZGluZzsKKwlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnByaW1hcnkgPSBhc29jLT5wZWVyLnByaW1hcnlfcGF0aDsKKwlpbnQgY291bnRfb2ZfbmV3YWNrcyA9IDA7CisKKwkvKiBHcmFiIHRoZSBhc3NvY2lhdGlvbidzIGRlc3RpbmF0aW9uIGFkZHJlc3MgbGlzdC4gKi8KKwl0cmFuc3BvcnRfbGlzdCA9ICZhc29jLT5wZWVyLnRyYW5zcG9ydF9hZGRyX2xpc3Q7CisKKwlzYWNrX2N0c24gPSBudG9obChzYWNrLT5jdW1fdHNuX2Fjayk7CisKKwkvKgorCSAqIFNGUi1DQUNDIGFsZ29yaXRobToKKwkgKiBPbiByZWNlaXB0IG9mIGEgU0FDSyB0aGUgc2VuZGVyIFNIT1VMRCBleGVjdXRlIHRoZQorCSAqIGZvbGxvd2luZyBzdGF0ZW1lbnRzLgorCSAqCisJICogMSkgSWYgdGhlIGN1bXVsYXRpdmUgYWNrIGluIHRoZSBTQUNLIHBhc3NlcyBuZXh0IHRzbl9hdF9jaGFuZ2UKKwkgKiBvbiB0aGUgY3VycmVudCBwcmltYXJ5LCB0aGUgQ0hBTkdFT1ZFUl9BQ1RJVkUgZmxhZyBTSE9VTEQgYmUKKwkgKiBjbGVhcmVkLiBUaGUgQ1lDTElOR19DSEFOR0VPVkVSIGZsYWcgU0hPVUxEIGFsc28gYmUgY2xlYXJlZCBmb3IKKwkgKiBhbGwgZGVzdGluYXRpb25zLgorCSAqLworCWlmIChUU05fbHRlKHByaW1hcnktPmNhY2MubmV4dF90c25fYXRfY2hhbmdlLCBzYWNrX2N0c24pKSB7CisJCXByaW1hcnktPmNhY2MuY2hhbmdlb3Zlcl9hY3RpdmUgPSAwOworCQlsaXN0X2Zvcl9lYWNoKHBvcywgdHJhbnNwb3J0X2xpc3QpIHsKKwkJCXRyYW5zcG9ydCA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQsCisJCQkJCXRyYW5zcG9ydHMpOworCQkJdHJhbnNwb3J0LT5jYWNjLmN5Y2xpbmdfY2hhbmdlb3ZlciA9IDA7CisJCX0KKwl9CisKKwkvKgorCSAqIFNGUi1DQUNDIGFsZ29yaXRobToKKwkgKiAyKSBJZiB0aGUgU0FDSyBjb250YWlucyBnYXAgYWNrcyBhbmQgdGhlIGZsYWcgQ0hBTkdFT1ZFUl9BQ1RJVkUKKwkgKiBpcyBzZXQgdGhlIHJlY2VpdmVyIG9mIHRoZSBTQUNLIE1VU1QgdGFrZSB0aGUgZm9sbG93aW5nIGFjdGlvbnM6CisJICoKKwkgKiBBKSBJbml0aWFsaXplIHRoZSBjYWNjX3Nhd19uZXdhY2sgdG8gMCBmb3IgYWxsIGRlc3RpbmF0aW9uCisJICogYWRkcmVzc2VzLgorCSAqLworCWlmIChzYWNrLT5udW1fZ2FwX2Fja19ibG9ja3MgPiAwICYmCisJICAgIHByaW1hcnktPmNhY2MuY2hhbmdlb3Zlcl9hY3RpdmUpIHsKKwkJbGlzdF9mb3JfZWFjaChwb3MsIHRyYW5zcG9ydF9saXN0KSB7CisJCQl0cmFuc3BvcnQgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHNjdHBfdHJhbnNwb3J0LAorCQkJCQl0cmFuc3BvcnRzKTsKKwkJCXRyYW5zcG9ydC0+Y2FjYy5jYWNjX3Nhd19uZXdhY2sgPSAwOworCQl9CisJfQorCisJLyogR2V0IHRoZSBoaWdoZXN0IFRTTiBpbiB0aGUgc2Fjay4gKi8KKwloaWdoZXN0X3RzbiA9IHNhY2tfY3RzbjsKKwlpZiAoc2Fjay0+bnVtX2dhcF9hY2tfYmxvY2tzKQorCQloaWdoZXN0X3RzbiArPQorCQkgICAgbnRvaHMoZnJhZ3NbbnRvaHMoc2Fjay0+bnVtX2dhcF9hY2tfYmxvY2tzKSAtIDFdLmdhYi5lbmQpOworCisJaWYgKFRTTl9sdChhc29jLT5oaWdoZXN0X3NhY2tlZCwgaGlnaGVzdF90c24pKSB7CisJCWhpZ2hlc3RfbmV3X3RzbiA9IGhpZ2hlc3RfdHNuOworCQlhc29jLT5oaWdoZXN0X3NhY2tlZCA9IGhpZ2hlc3RfdHNuOworCX0gZWxzZSB7CisJCWhpZ2hlc3RfbmV3X3RzbiA9IHNjdHBfaGlnaGVzdF9uZXdfdHNuKHNhY2ssIGFzb2MpOworCX0KKworCS8qIFJ1biB0aHJvdWdoIHRoZSByZXRyYW5zbWl0IHF1ZXVlLiAgQ3JlZGl0IGJ5dGVzIHJlY2VpdmVkCisJICogYW5kIGZyZWUgdGhvc2UgY2h1bmtzIHRoYXQgd2UgY2FuLgorCSAqLworCXNjdHBfY2hlY2tfdHJhbnNtaXR0ZWQocSwgJnEtPnJldHJhbnNtaXQsIE5VTEwsIHNhY2ssIGhpZ2hlc3RfbmV3X3Rzbik7CisJc2N0cF9tYXJrX21pc3NpbmcocSwgJnEtPnJldHJhbnNtaXQsIE5VTEwsIGhpZ2hlc3RfbmV3X3RzbiwgMCk7CisKKwkvKiBSdW4gdGhyb3VnaCB0aGUgdHJhbnNtaXR0ZWQgcXVldWUuCisJICogQ3JlZGl0IGJ5dGVzIHJlY2VpdmVkIGFuZCBmcmVlIHRob3NlIGNodW5rcyB3aGljaCB3ZSBjYW4uCisJICoKKwkgKiBUaGlzIGlzIGEgTUFTU0lWRSBjYW5kaWRhdGUgZm9yIG9wdGltaXphdGlvbi4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoKHBvcywgdHJhbnNwb3J0X2xpc3QpIHsKKwkJdHJhbnNwb3J0ICA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQsCisJCQkJCXRyYW5zcG9ydHMpOworCQlzY3RwX2NoZWNrX3RyYW5zbWl0dGVkKHEsICZ0cmFuc3BvcnQtPnRyYW5zbWl0dGVkLAorCQkJCSAgICAgICB0cmFuc3BvcnQsIHNhY2ssIGhpZ2hlc3RfbmV3X3Rzbik7CisJCS8qCisJCSAqIFNGUi1DQUNDIGFsZ29yaXRobToKKwkJICogQykgTGV0IGNvdW50X29mX25ld2Fja3MgYmUgdGhlIG51bWJlciBvZgorCQkgKiBkZXN0aW5hdGlvbnMgZm9yIHdoaWNoIGNhY2Nfc2F3X25ld2FjayBpcyBzZXQuCisJCSAqLworCQlpZiAodHJhbnNwb3J0LT5jYWNjLmNhY2Nfc2F3X25ld2FjaykKKwkJCWNvdW50X29mX25ld2Fja3MgKys7CisJfQorCisJbGlzdF9mb3JfZWFjaChwb3MsIHRyYW5zcG9ydF9saXN0KSB7CisJCXRyYW5zcG9ydCAgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHNjdHBfdHJhbnNwb3J0LAorCQkJCQl0cmFuc3BvcnRzKTsKKwkJc2N0cF9tYXJrX21pc3NpbmcocSwgJnRyYW5zcG9ydC0+dHJhbnNtaXR0ZWQsIHRyYW5zcG9ydCwKKwkJCQkgIGhpZ2hlc3RfbmV3X3RzbiwgY291bnRfb2ZfbmV3YWNrcyk7CisJfQorCisJLyogTW92ZSB0aGUgQ3VtdWxhdGl2ZSBUU04gQWNrIFBvaW50IGlmIGFwcHJvcHJpYXRlLiAgKi8KKwlpZiAoVFNOX2x0KGFzb2MtPmN0c25fYWNrX3BvaW50LCBzYWNrX2N0c24pKQorCQlhc29jLT5jdHNuX2Fja19wb2ludCA9IHNhY2tfY3RzbjsKKworCS8qIFVwZGF0ZSB1bmFja19kYXRhIGZpZWxkIGluIHRoZSBhc3NvYy4gKi8KKwlzY3RwX3NhY2tfdXBkYXRlX3VuYWNrX2RhdGEoYXNvYywgc2Fjayk7CisKKwljdHNuID0gYXNvYy0+Y3Rzbl9hY2tfcG9pbnQ7CisKKwkvKiBUaHJvdyBhd2F5IHN0dWZmIHJvdHRpbmcgb24gdGhlIHNhY2sgcXVldWUuICAqLworCWxpc3RfZm9yX2VhY2hfc2FmZShsY2h1bmssIHRlbXAsICZxLT5zYWNrZWQpIHsKKwkJdGNodW5rID0gbGlzdF9lbnRyeShsY2h1bmssIHN0cnVjdCBzY3RwX2NodW5rLAorCQkJCSAgICB0cmFuc21pdHRlZF9saXN0KTsKKwkJdHNuID0gbnRvaGwodGNodW5rLT5zdWJoLmRhdGFfaGRyLT50c24pOworCQlpZiAoVFNOX2x0ZSh0c24sIGN0c24pKQorCQkJc2N0cF9jaHVua19mcmVlKHRjaHVuayk7CisJfQorCisJLyogaWkpIFNldCByd25kIGVxdWFsIHRvIHRoZSBuZXdseSByZWNlaXZlZCBhX3J3bmQgbWludXMgdGhlCisJICogICAgIG51bWJlciBvZiBieXRlcyBzdGlsbCBvdXRzdGFuZGluZyBhZnRlciBwcm9jZXNzaW5nIHRoZQorCSAqICAgICBDdW11bGF0aXZlIFRTTiBBY2sgYW5kIHRoZSBHYXAgQWNrIEJsb2Nrcy4KKwkgKi8KKworCXNhY2tfYV9yd25kID0gbnRvaGwoc2Fjay0+YV9yd25kKTsKKwlvdXRzdGFuZGluZyA9IHEtPm91dHN0YW5kaW5nX2J5dGVzOworCisJaWYgKG91dHN0YW5kaW5nIDwgc2Fja19hX3J3bmQpCisJCXNhY2tfYV9yd25kIC09IG91dHN0YW5kaW5nOworCWVsc2UKKwkJc2Fja19hX3J3bmQgPSAwOworCisJYXNvYy0+cGVlci5yd25kID0gc2Fja19hX3J3bmQ7CisKKwlzY3RwX2dlbmVyYXRlX2Z3ZHRzbihxLCBzYWNrX2N0c24pOworCisJU0NUUF9ERUJVR19QUklOVEsoIiVzOiBzYWNrIEN1bXVsYXRpdmUgVFNOIEFjayBpcyAweCV4LlxuIiwKKwkJCSAgX19GVU5DVElPTl9fLCBzYWNrX2N0c24pOworCVNDVFBfREVCVUdfUFJJTlRLKCIlczogQ3VtdWxhdGl2ZSBUU04gQWNrIG9mIGFzc29jaWF0aW9uLCAiCisJCQkgICIlcCBpcyAweCV4LiBBZHYgcGVlciBhY2sgcG9pbnQ6IDB4JXhcbiIsCisJCQkgIF9fRlVOQ1RJT05fXywgYXNvYywgY3RzbiwgYXNvYy0+YWR2X3BlZXJfYWNrX3BvaW50KTsKKworCS8qIFNlZSBpZiBhbGwgY2h1bmtzIGFyZSBhY2tlZC4KKwkgKiBNYWtlIHN1cmUgdGhlIGVtcHR5IHF1ZXVlIGhhbmRsZXIgd2lsbCBnZXQgcnVuIGxhdGVyLgorCSAqLworCXEtPmVtcHR5ID0gc2tiX3F1ZXVlX2VtcHR5KCZxLT5vdXQpICYmIHNrYl9xdWV1ZV9lbXB0eSgmcS0+Y29udHJvbCkgJiYKKwkJCWxpc3RfZW1wdHkoJnEtPnJldHJhbnNtaXQpOworCWlmICghcS0+ZW1wdHkpCisJCWdvdG8gZmluaXNoOworCisJbGlzdF9mb3JfZWFjaChwb3MsIHRyYW5zcG9ydF9saXN0KSB7CisJCXRyYW5zcG9ydCAgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHNjdHBfdHJhbnNwb3J0LAorCQkJCQl0cmFuc3BvcnRzKTsKKwkJcS0+ZW1wdHkgPSBxLT5lbXB0eSAmJiBsaXN0X2VtcHR5KCZ0cmFuc3BvcnQtPnRyYW5zbWl0dGVkKTsKKwkJaWYgKCFxLT5lbXB0eSkKKwkJCWdvdG8gZmluaXNoOworCX0KKworCVNDVFBfREVCVUdfUFJJTlRLKCJzYWNrIHF1ZXVlIGlzIGVtcHR5LlxuIik7CitmaW5pc2g6CisJcmV0dXJuIHEtPmVtcHR5OworfQorCisvKiBJcyB0aGUgb3V0cXVldWUgZW1wdHk/ICAqLworaW50IHNjdHBfb3V0cV9pc19lbXB0eShjb25zdCBzdHJ1Y3Qgc2N0cF9vdXRxICpxKQoreworCXJldHVybiBxLT5lbXB0eTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAybmQgTGV2ZWwgQWJzdHJhY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEdvIHRocm91Z2ggYSB0cmFuc3BvcnQncyB0cmFuc21pdHRlZCBsaXN0IG9yIHRoZSBhc3NvY2lhdGlvbidzIHJldHJhbnNtaXQKKyAqIGxpc3QgYW5kIG1vdmUgY2h1bmtzIHRoYXQgYXJlIGFja2VkIGJ5IHRoZSBDdW11bGF0aXZlIFRTTiBBY2sgdG8gcS0+c2Fja2VkLgorICogVGhlIHJldHJhbnNtaXQgbGlzdCB3aWxsIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgdHJhbnNwb3J0LgorICoKKyAqIEkgYWRkZWQgY29oZXJlbnQgZGVidWcgaW5mb3JtYXRpb24gb3V0cHV0LgktLXhndW8KKyAqCisgKiBJbnN0ZWFkIG9mIHByaW50aW5nICdzYWNrZWQnIG9yICdrZXB0JyBmb3IgZWFjaCBUU04gb24gdGhlCisgKiB0cmFuc21pdHRlZF9xdWV1ZSwgd2UgcHJpbnQgYSByYW5nZTogU0FDS0VEOiBUU04xLVRTTjIsIFRTTjMsIFRTTjQtVFNONS4KKyAqIEtFUFQgVFNONi1UU043LCBldGMuCisgKi8KK3N0YXRpYyB2b2lkIHNjdHBfY2hlY2tfdHJhbnNtaXR0ZWQoc3RydWN0IHNjdHBfb3V0cSAqcSwKKwkJCQkgICBzdHJ1Y3QgbGlzdF9oZWFkICp0cmFuc21pdHRlZF9xdWV1ZSwKKwkJCQkgICBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydCwKKwkJCQkgICBzdHJ1Y3Qgc2N0cF9zYWNraGRyICpzYWNrLAorCQkJCSAgIF9fdTMyIGhpZ2hlc3RfbmV3X3Rzbl9pbl9zYWNrKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxjaHVuazsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqdGNodW5rOworCXN0cnVjdCBsaXN0X2hlYWQgdGxpc3Q7CisJX191MzIgdHNuOworCV9fdTMyIHNhY2tfY3RzbjsKKwlfX3UzMiBydHQ7CisJX191OCByZXN0YXJ0X3RpbWVyID0gMDsKKwlpbnQgYnl0ZXNfYWNrZWQgPSAwOworCisJLyogVGhlc2Ugc3RhdGUgdmFyaWFibGVzIGFyZSBmb3IgY29oZXJlbnQgZGVidWcgb3V0cHV0LiAtLXhndW8gKi8KKworI2lmIFNDVFBfREVCVUcKKwlfX3UzMiBkYmdfYWNrX3RzbiA9IDA7CS8qIEFuIEFDS2VkIFRTTiByYW5nZSBzdGFydHMgaGVyZS4uLiAqLworCV9fdTMyIGRiZ19sYXN0X2Fja190c24gPSAwOyAgLyogLi4uYW5kIGZpbmlzaGVzIGhlcmUuCSAgICAgKi8KKwlfX3UzMiBkYmdfa2VwdF90c24gPSAwOwkvKiBBbiB1bi1BQ0tlZCByYW5nZSBzdGFydHMgaGVyZS4uLiAgKi8KKwlfX3UzMiBkYmdfbGFzdF9rZXB0X3RzbiA9IDA7IC8qIC4uLmFuZCBmaW5pc2hlcyBoZXJlLgkgICAgICovCisKKwkvKiAwIDogVGhlIGxhc3QgVFNOIHdhcyBBQ0tlZC4KKwkgKiAxIDogVGhlIGxhc3QgVFNOIHdhcyBOT1QgQUNLZWQgKGkuZS4gS0VQVCkuCisJICogLTE6IFdlIG5lZWQgdG8gaW5pdGlhbGl6ZS4KKwkgKi8KKwlpbnQgZGJnX3BydF9zdGF0ZSA9IC0xOworI2VuZGlmIC8qIFNDVFBfREVCVUcgKi8KKworCXNhY2tfY3RzbiA9IG50b2hsKHNhY2stPmN1bV90c25fYWNrKTsKKworCUlOSVRfTElTVF9IRUFEKCZ0bGlzdCk7CisKKwkvKiBUaGUgd2hpbGUgbG9vcCB3aWxsIHNraXAgZW1wdHkgdHJhbnNtaXR0ZWQgcXVldWVzLiAqLworCXdoaWxlIChOVUxMICE9IChsY2h1bmsgPSBzY3RwX2xpc3RfZGVxdWV1ZSh0cmFuc21pdHRlZF9xdWV1ZSkpKSB7CisJCXRjaHVuayA9IGxpc3RfZW50cnkobGNodW5rLCBzdHJ1Y3Qgc2N0cF9jaHVuaywKKwkJCQkgICAgdHJhbnNtaXR0ZWRfbGlzdCk7CisKKwkJaWYgKHNjdHBfY2h1bmtfYWJhbmRvbmVkKHRjaHVuaykpIHsKKwkJCS8qIE1vdmUgdGhlIGNodW5rIHRvIGFiYW5kb25lZCBsaXN0LiAqLworCQkJc2N0cF9pbnNlcnRfbGlzdCgmcS0+YWJhbmRvbmVkLCBsY2h1bmspOworCQkJY29udGludWU7CisJCX0KKworCQl0c24gPSBudG9obCh0Y2h1bmstPnN1YmguZGF0YV9oZHItPnRzbik7CisJCWlmIChzY3RwX2Fja2VkKHNhY2ssIHRzbikpIHsKKwkJCS8qIElmIHRoaXMgcXVldWUgaXMgdGhlIHJldHJhbnNtaXQgcXVldWUsIHRoZQorCQkJICogcmV0cmFuc21pdCB0aW1lciBoYXMgYWxyZWFkeSByZWNsYWltZWQKKwkJCSAqIHRoZSBvdXRzdGFuZGluZyBieXRlcyBmb3IgdGhpcyBjaHVuaywgc28gb25seQorCQkJICogY291bnQgYnl0ZXMgYXNzb2NpYXRlZCB3aXRoIGEgdHJhbnNwb3J0LgorCQkJICovCisJCQlpZiAodHJhbnNwb3J0KSB7CisJCQkJLyogSWYgdGhpcyBjaHVuayBpcyBiZWluZyB1c2VkIGZvciBSVFQKKwkJCQkgKiBtZWFzdXJlbWVudCwgY2FsY3VsYXRlIHRoZSBSVFQgYW5kIHVwZGF0ZQorCQkJCSAqIHRoZSBSVE8gdXNpbmcgdGhpcyB2YWx1ZS4KKwkJCQkgKgorCQkJCSAqIDYuMy4xIEM1KSBLYXJuJ3MgYWxnb3JpdGhtOiBSVFQgbWVhc3VyZW1lbnRzCisJCQkJICogTVVTVCBOT1QgYmUgbWFkZSB1c2luZyBwYWNrZXRzIHRoYXQgd2VyZQorCQkJCSAqIHJldHJhbnNtaXR0ZWQgKGFuZCB0aHVzIGZvciB3aGljaCBpdCBpcworCQkJCSAqIGFtYmlndW91cyB3aGV0aGVyIHRoZSByZXBseSB3YXMgZm9yIHRoZQorCQkJCSAqIGZpcnN0IGluc3RhbmNlIG9mIHRoZSBwYWNrZXQgb3IgYSBsYXRlcgorCQkJCSAqIGluc3RhbmNlKS4KKwkJCQkgKi8KKwkJCSAgIAlpZiAoIXRjaHVuay0+dHNuX2dhcF9hY2tlZCAmJgorCQkJCSAgICAhdGNodW5rLT5yZXNlbnQgJiYKKwkJCQkgICAgdGNodW5rLT5ydHRfaW5fcHJvZ3Jlc3MpIHsKKwkJCQkJcnR0ID0gamlmZmllcyAtIHRjaHVuay0+c2VudF9hdDsKKwkJCQkJc2N0cF90cmFuc3BvcnRfdXBkYXRlX3J0byh0cmFuc3BvcnQsCisJCQkJCQkJCSAgcnR0KTsKKwkJCQl9CisJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVFNOX2x0ZSh0c24sIHNhY2tfY3RzbikpIHsKKwkJCQkvKiBSRkMgMjk2MCAgNi4zLjIgUmV0cmFuc21pc3Npb24gVGltZXIgUnVsZXMKKwkJCQkgKgorCQkJCSAqIFIzKSBXaGVuZXZlciBhIFNBQ0sgaXMgcmVjZWl2ZWQKKwkJCQkgKiB0aGF0IGFja25vd2xlZGdlcyB0aGUgREFUQSBjaHVuaworCQkJCSAqIHdpdGggdGhlIGVhcmxpZXN0IG91dHN0YW5kaW5nIFRTTgorCQkJCSAqIGZvciB0aGF0IGFkZHJlc3MsIHJlc3RhcnQgVDMtcnR4CisJCQkJICogdGltZXIgZm9yIHRoYXQgYWRkcmVzcyB3aXRoIGl0cworCQkJCSAqIGN1cnJlbnQgUlRPLgorCQkJCSAqLworCQkJCXJlc3RhcnRfdGltZXIgPSAxOworCisJCQkJaWYgKCF0Y2h1bmstPnRzbl9nYXBfYWNrZWQpIHsKKwkJCQkJdGNodW5rLT50c25fZ2FwX2Fja2VkID0gMTsKKwkJCQkJYnl0ZXNfYWNrZWQgKz0gc2N0cF9kYXRhX3NpemUodGNodW5rKTsKKwkJCQkJLyoKKwkJCQkJICogU0ZSLUNBQ0MgYWxnb3JpdGhtOgorCQkJCQkgKiAyKSBJZiB0aGUgU0FDSyBjb250YWlucyBnYXAgYWNrcworCQkJCQkgKiBhbmQgdGhlIGZsYWcgQ0hBTkdFT1ZFUl9BQ1RJVkUgaXMKKwkJCQkJICogc2V0IHRoZSByZWNlaXZlciBvZiB0aGUgU0FDSyBNVVNUCisJCQkJCSAqIHRha2UgdGhlIGZvbGxvd2luZyBhY3Rpb246CisJCQkJCSAqCisJCQkJCSAqIEIpIEZvciBlYWNoIFRTTiB0IGJlaW5nIGFja2VkIHRoYXQKKwkJCQkJICogaGFzIG5vdCBiZWVuIGFja2VkIGluIGFueSBTQUNLIHNvCisJCQkJCSAqIGZhciwgc2V0IGNhY2Nfc2F3X25ld2FjayB0byAxIGZvcgorCQkJCQkgKiB0aGUgZGVzdGluYXRpb24gdGhhdCB0aGUgVFNOIHdhcworCQkJCQkgKiBzZW50IHRvLgorCQkJCQkgKi8KKwkJCQkJaWYgKHRyYW5zcG9ydCAmJgorCQkJCQkgICAgc2Fjay0+bnVtX2dhcF9hY2tfYmxvY2tzICYmCisJCQkJCSAgICBxLT5hc29jLT5wZWVyLnByaW1hcnlfcGF0aC0+Y2FjYy4KKwkJCQkJICAgIGNoYW5nZW92ZXJfYWN0aXZlKQorCQkJCQkJdHJhbnNwb3J0LT5jYWNjLmNhY2Nfc2F3X25ld2FjaworCQkJCQkJCT0gMTsKKwkJCQl9CisKKwkJCQlsaXN0X2FkZF90YWlsKCZ0Y2h1bmstPnRyYW5zbWl0dGVkX2xpc3QsCisJCQkJCSAgICAgICZxLT5zYWNrZWQpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBSRkMyOTYwIDcuMi40LCBzY3RwaW1wZ3VpZGUtMDUgMi44LjIKKwkJCQkgKiBNMikgRWFjaCB0aW1lIGEgU0FDSyBhcnJpdmVzIHJlcG9ydGluZworCQkJCSAqICdTdHJheSBEQVRBIGNodW5rKHMpJyByZWNvcmQgdGhlIGhpZ2hlc3QgVFNOCisJCQkJICogcmVwb3J0ZWQgYXMgbmV3bHkgYWNrbm93bGVkZ2VkLCBjYWxsIHRoaXMKKwkJCQkgKiB2YWx1ZSAnSGlnaGVzdFRTTmluU2FjaycuIEEgbmV3bHkKKwkJCQkgKiBhY2tub3dsZWRnZWQgREFUQSBjaHVuayBpcyBvbmUgbm90CisJCQkJICogcHJldmlvdXNseSBhY2tub3dsZWRnZWQgaW4gYSBTQUNLLgorCQkJCSAqCisJCQkJICogV2hlbiB0aGUgU0NUUCBzZW5kZXIgb2YgZGF0YSByZWNlaXZlcyBhIFNBQ0sKKwkJCQkgKiBjaHVuayB0aGF0IGFja25vd2xlZGdlcywgZm9yIHRoZSBmaXJzdCB0aW1lLAorCQkJCSAqIHRoZSByZWNlaXB0IG9mIGEgREFUQSBjaHVuaywgYWxsIHRoZSBzdGlsbAorCQkJCSAqIHVuYWNrbm93bGVkZ2VkIERBVEEgY2h1bmtzIHdob3NlIFRTTiBpcworCQkJCSAqIG9sZGVyIHRoYW4gdGhhdCBuZXdseSBhY2tub3dsZWRnZWQgREFUQQorCQkJCSAqIGNodW5rLCBhcmUgcXVhbGlmaWVkIGFzICdTdHJheSBEQVRBIGNodW5rcycuCisJCQkJICovCisJCQkJaWYgKCF0Y2h1bmstPnRzbl9nYXBfYWNrZWQpIHsKKwkJCQkJdGNodW5rLT50c25fZ2FwX2Fja2VkID0gMTsKKwkJCQkJYnl0ZXNfYWNrZWQgKz0gc2N0cF9kYXRhX3NpemUodGNodW5rKTsKKwkJCQl9CisJCQkJbGlzdF9hZGRfdGFpbChsY2h1bmssICZ0bGlzdCk7CisJCQl9CisKKyNpZiBTQ1RQX0RFQlVHCisJCQlzd2l0Y2ggKGRiZ19wcnRfc3RhdGUpIHsKKwkJCWNhc2UgMDoJLyogbGFzdCBUU04gd2FzIEFDS2VkICovCisJCQkJaWYgKGRiZ19sYXN0X2Fja190c24gKyAxID09IHRzbikgeworCQkJCQkvKiBUaGlzIFRTTiBiZWxvbmdzIHRvIHRoZQorCQkJCQkgKiBjdXJyZW50IEFDSyByYW5nZS4KKwkJCQkJICovCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmIChkYmdfbGFzdF9hY2tfdHNuICE9IGRiZ19hY2tfdHNuKSB7CisJCQkJCS8qIERpc3BsYXkgdGhlIGVuZCBvZiB0aGUKKwkJCQkJICogY3VycmVudCByYW5nZS4KKwkJCQkJICovCisJCQkJCVNDVFBfREVCVUdfUFJJTlRLKCItJTA4eCIsCisJCQkJCQkJICBkYmdfbGFzdF9hY2tfdHNuKTsKKwkJCQl9CisKKwkJCQkvKiBTdGFydCBhIG5ldyByYW5nZS4gICovCisJCQkJU0NUUF9ERUJVR19QUklOVEsoIiwlMDh4IiwgdHNuKTsKKwkJCQlkYmdfYWNrX3RzbiA9IHRzbjsKKwkJCQlicmVhazsKKworCQkJY2FzZSAxOgkvKiBUaGUgbGFzdCBUU04gd2FzIE5PVCBBQ0tlZC4gKi8KKwkJCQlpZiAoZGJnX2xhc3Rfa2VwdF90c24gIT0gZGJnX2tlcHRfdHNuKSB7CisJCQkJCS8qIERpc3BsYXkgdGhlIGVuZCBvZiBjdXJyZW50IHJhbmdlLiAqLworCQkJCQlTQ1RQX0RFQlVHX1BSSU5USygiLSUwOHgiLAorCQkJCQkJCSAgZGJnX2xhc3Rfa2VwdF90c24pOworCQkJCX0KKworCQkJCVNDVFBfREVCVUdfUFJJTlRLKCJcbiIpOworCisJCQkJLyogRkFMTCBUSFJPVUdILi4uICovCisJCQlkZWZhdWx0OgorCQkJCS8qIFRoaXMgaXMgdGhlIGZpcnN0LWV2ZXIgVFNOIHdlIGV4YW1pbmVkLiAgKi8KKwkJCQkvKiBTdGFydCBhIG5ldyByYW5nZSBvZiBBQ0stZWQgVFNOcy4gICovCisJCQkJU0NUUF9ERUJVR19QUklOVEsoIkFDS2VkOiAlMDh4IiwgdHNuKTsKKwkJCQlkYmdfcHJ0X3N0YXRlID0gMDsKKwkJCQlkYmdfYWNrX3RzbiA9IHRzbjsKKwkJCX07CisKKwkJCWRiZ19sYXN0X2Fja190c24gPSB0c247CisjZW5kaWYgLyogU0NUUF9ERUJVRyAqLworCisJCX0gZWxzZSB7CisJCQlpZiAodGNodW5rLT50c25fZ2FwX2Fja2VkKSB7CisJCQkJU0NUUF9ERUJVR19QUklOVEsoIiVzOiBSZWNlaXZlciByZW5lZ2VkIG9uICIKKwkJCQkJCSAgImRhdGEgVFNOOiAweCV4XG4iLAorCQkJCQkJICBfX0ZVTkNUSU9OX18sCisJCQkJCQkgIHRzbik7CisJCQkJdGNodW5rLT50c25fZ2FwX2Fja2VkID0gMDsKKworCQkJCWJ5dGVzX2Fja2VkIC09IHNjdHBfZGF0YV9zaXplKHRjaHVuayk7CisKKwkJCQkvKiBSRkMgMjk2MCA2LjMuMiBSZXRyYW5zbWlzc2lvbiBUaW1lciBSdWxlcworCQkJCSAqCisJCQkJICogUjQpIFdoZW5ldmVyIGEgU0FDSyBpcyByZWNlaXZlZCBtaXNzaW5nIGEKKwkJCQkgKiBUU04gdGhhdCB3YXMgcHJldmlvdXNseSBhY2tub3dsZWRnZWQgdmlhIGEKKwkJCQkgKiBHYXAgQWNrIEJsb2NrLCBzdGFydCBUMy1ydHggZm9yIHRoZQorCQkJCSAqIGRlc3RpbmF0aW9uIGFkZHJlc3MgdG8gd2hpY2ggdGhlIERBVEEKKwkJCQkgKiBjaHVuayB3YXMgb3JpZ2luYWxseQorCQkJCSAqIHRyYW5zbWl0dGVkIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHJ1bm5pbmcuCisJCQkJICovCisJCQkJcmVzdGFydF90aW1lciA9IDE7CisJCQl9CisKKwkJCWxpc3RfYWRkX3RhaWwobGNodW5rLCAmdGxpc3QpOworCisjaWYgU0NUUF9ERUJVRworCQkJLyogU2VlIHRoZSBhYm92ZSBjb21tZW50cyBvbiBBQ0stZWQgVFNOcy4gKi8KKwkJCXN3aXRjaCAoZGJnX3BydF9zdGF0ZSkgeworCQkJY2FzZSAxOgorCQkJCWlmIChkYmdfbGFzdF9rZXB0X3RzbiArIDEgPT0gdHNuKQorCQkJCQlicmVhazsKKworCQkJCWlmIChkYmdfbGFzdF9rZXB0X3RzbiAhPSBkYmdfa2VwdF90c24pCisJCQkJCVNDVFBfREVCVUdfUFJJTlRLKCItJTA4eCIsCisJCQkJCQkJICBkYmdfbGFzdF9rZXB0X3Rzbik7CisKKwkJCQlTQ1RQX0RFQlVHX1BSSU5USygiLCUwOHgiLCB0c24pOworCQkJCWRiZ19rZXB0X3RzbiA9IHRzbjsKKwkJCQlicmVhazsKKworCQkJY2FzZSAwOgorCQkJCWlmIChkYmdfbGFzdF9hY2tfdHNuICE9IGRiZ19hY2tfdHNuKQorCQkJCQlTQ1RQX0RFQlVHX1BSSU5USygiLSUwOHgiLAorCQkJCQkJCSAgZGJnX2xhc3RfYWNrX3Rzbik7CisJCQkJU0NUUF9ERUJVR19QUklOVEsoIlxuIik7CisKKwkJCQkvKiBGQUxMIFRIUk9VR0guLi4gKi8KKwkJCWRlZmF1bHQ6CisJCQkJU0NUUF9ERUJVR19QUklOVEsoIktFUFQ6ICUwOHgiLHRzbik7CisJCQkJZGJnX3BydF9zdGF0ZSA9IDE7CisJCQkJZGJnX2tlcHRfdHNuID0gdHNuOworCQkJfTsKKworCQkJZGJnX2xhc3Rfa2VwdF90c24gPSB0c247CisjZW5kaWYgLyogU0NUUF9ERUJVRyAqLworCQl9CisJfQorCisjaWYgU0NUUF9ERUJVRworCS8qIEZpbmlzaCBvZmYgdGhlIGxhc3QgcmFuZ2UsIGRpc3BsYXlpbmcgaXRzIGVuZGluZyBUU04uICAqLworCXN3aXRjaCAoZGJnX3BydF9zdGF0ZSkgeworCWNhc2UgMDoKKwkJaWYgKGRiZ19sYXN0X2Fja190c24gIT0gZGJnX2Fja190c24pIHsKKwkJCVNDVFBfREVCVUdfUFJJTlRLKCItJTA4eFxuIiwgZGJnX2xhc3RfYWNrX3Rzbik7CisJCX0gZWxzZSB7CisJCQlTQ1RQX0RFQlVHX1BSSU5USygiXG4iKTsKKwkJfQorCWJyZWFrOworCisJY2FzZSAxOgorCQlpZiAoZGJnX2xhc3Rfa2VwdF90c24gIT0gZGJnX2tlcHRfdHNuKSB7CisJCQlTQ1RQX0RFQlVHX1BSSU5USygiLSUwOHhcbiIsIGRiZ19sYXN0X2tlcHRfdHNuKTsKKwkJfSBlbHNlIHsKKwkJCVNDVFBfREVCVUdfUFJJTlRLKCJcbiIpOworCQl9CisJfTsKKyNlbmRpZiAvKiBTQ1RQX0RFQlVHICovCisJaWYgKHRyYW5zcG9ydCkgeworCQlpZiAoYnl0ZXNfYWNrZWQpIHsKKwkJCS8qIDguMi4gV2hlbiBhbiBvdXRzdGFuZGluZyBUU04gaXMgYWNrbm93bGVkZ2VkLAorCQkJICogdGhlIGVuZHBvaW50IHNoYWxsIGNsZWFyIHRoZSBlcnJvciBjb3VudGVyIG9mCisJCQkgKiB0aGUgZGVzdGluYXRpb24gdHJhbnNwb3J0IGFkZHJlc3MgdG8gd2hpY2ggdGhlCisJCQkgKiBEQVRBIGNodW5rIHdhcyBsYXN0IHNlbnQuCisJCQkgKiBUaGUgYXNzb2NpYXRpb24ncyBvdmVyYWxsIGVycm9yIGNvdW50ZXIgaXMKKwkJCSAqIGFsc28gY2xlYXJlZC4KKwkJCSAqLworCQkJdHJhbnNwb3J0LT5lcnJvcl9jb3VudCA9IDA7CisJCQl0cmFuc3BvcnQtPmFzb2MtPm92ZXJhbGxfZXJyb3JfY291bnQgPSAwOworCisJCQkvKiBNYXJrIHRoZSBkZXN0aW5hdGlvbiB0cmFuc3BvcnQgYWRkcmVzcyBhcworCQkJICogYWN0aXZlIGlmIGl0IGlzIG5vdCBzbyBtYXJrZWQuCisJCQkgKi8KKwkJCWlmICghdHJhbnNwb3J0LT5hY3RpdmUpIHsKKwkJCQlzY3RwX2Fzc29jX2NvbnRyb2xfdHJhbnNwb3J0KAorCQkJCQl0cmFuc3BvcnQtPmFzb2MsCisJCQkJCXRyYW5zcG9ydCwKKwkJCQkJU0NUUF9UUkFOU1BPUlRfVVAsCisJCQkJCVNDVFBfUkVDRUlWRURfU0FDSyk7CisJCQl9CisKKwkJCXNjdHBfdHJhbnNwb3J0X3JhaXNlX2N3bmQodHJhbnNwb3J0LCBzYWNrX2N0c24sCisJCQkJCQkgIGJ5dGVzX2Fja2VkKTsKKworCQkJdHJhbnNwb3J0LT5mbGlnaHRfc2l6ZSAtPSBieXRlc19hY2tlZDsKKwkJCXEtPm91dHN0YW5kaW5nX2J5dGVzIC09IGJ5dGVzX2Fja2VkOworCQl9IGVsc2UgeworCQkJLyogUkZDIDI5NjAgNi4xLCBzY3RwaW1wZ3VpZGUtMDYgMi4xNS4yCisJCQkgKiBXaGVuIGEgc2VuZGVyIGlzIGRvaW5nIHplcm8gd2luZG93IHByb2JpbmcsIGl0CisJCQkgKiBzaG91bGQgbm90IHRpbWVvdXQgdGhlIGFzc29jaWF0aW9uIGlmIGl0IGNvbnRpbnVlcworCQkJICogdG8gcmVjZWl2ZSBuZXcgcGFja2V0cyBmcm9tIHRoZSByZWNlaXZlci4gVGhlCisJCQkgKiByZWFzb24gaXMgdGhhdCB0aGUgcmVjZWl2ZXIgTUFZIGtlZXAgaXRzIHdpbmRvdworCQkJICogY2xvc2VkIGZvciBhbiBpbmRlZmluaXRlIHRpbWUuCisJCQkgKiBBIHNlbmRlciBpcyBkb2luZyB6ZXJvIHdpbmRvdyBwcm9iaW5nIHdoZW4gdGhlCisJCQkgKiByZWNlaXZlcidzIGFkdmVydGlzZWQgd2luZG93IGlzIHplcm8sIGFuZCB0aGVyZSBpcworCQkJICogb25seSBvbmUgZGF0YSBjaHVuayBpbiBmbGlnaHQgdG8gdGhlIHJlY2VpdmVyLgorCQkJICovCisJCQlpZiAoIXEtPmFzb2MtPnBlZXIucnduZCAmJgorCQkJICAgICFsaXN0X2VtcHR5KCZ0bGlzdCkgJiYKKwkJCSAgICAoc2Fja19jdHNuKzIgPT0gcS0+YXNvYy0+bmV4dF90c24pKSB7CisJCQkJU0NUUF9ERUJVR19QUklOVEsoIiVzOiBTQUNLIHJlY2VpdmVkIGZvciB6ZXJvICIKKwkJCQkJCSAgIndpbmRvdyBwcm9iZTogJXVcbiIsCisJCQkJCQkgIF9fRlVOQ1RJT05fXywgc2Fja19jdHNuKTsKKwkJCQlxLT5hc29jLT5vdmVyYWxsX2Vycm9yX2NvdW50ID0gMDsKKwkJCQl0cmFuc3BvcnQtPmVycm9yX2NvdW50ID0gMDsKKwkJCX0KKwkJfQorCisJCS8qIFJGQyAyOTYwIDYuMy4yIFJldHJhbnNtaXNzaW9uIFRpbWVyIFJ1bGVzCisJCSAqCisJCSAqIFIyKSBXaGVuZXZlciBhbGwgb3V0c3RhbmRpbmcgZGF0YSBzZW50IHRvIGFuIGFkZHJlc3MgaGF2ZQorCQkgKiBiZWVuIGFja25vd2xlZGdlZCwgdHVybiBvZmYgdGhlIFQzLXJ0eCB0aW1lciBvZiB0aGF0CisJCSAqIGFkZHJlc3MuCisJCSAqLworCQlpZiAoIXRyYW5zcG9ydC0+ZmxpZ2h0X3NpemUpIHsKKwkJCWlmICh0aW1lcl9wZW5kaW5nKCZ0cmFuc3BvcnQtPlQzX3J0eF90aW1lcikgJiYKKwkJCSAgICBkZWxfdGltZXIoJnRyYW5zcG9ydC0+VDNfcnR4X3RpbWVyKSkgeworCQkJCXNjdHBfdHJhbnNwb3J0X3B1dCh0cmFuc3BvcnQpOworCQkJfQorCQl9IGVsc2UgaWYgKHJlc3RhcnRfdGltZXIpIHsKKwkJCWlmICghbW9kX3RpbWVyKCZ0cmFuc3BvcnQtPlQzX3J0eF90aW1lciwKKwkJCQkgICAgICAgamlmZmllcyArIHRyYW5zcG9ydC0+cnRvKSkKKwkJCQlzY3RwX3RyYW5zcG9ydF9ob2xkKHRyYW5zcG9ydCk7CisJCX0KKwl9CisKKwlsaXN0X3NwbGljZSgmdGxpc3QsIHRyYW5zbWl0dGVkX3F1ZXVlKTsKK30KKworLyogTWFyayBjaHVua3MgYXMgbWlzc2luZyBhbmQgY29uc2VxdWVudGx5IG1heSBnZXQgcmV0cmFuc21pdHRlZC4gKi8KK3N0YXRpYyB2b2lkIHNjdHBfbWFya19taXNzaW5nKHN0cnVjdCBzY3RwX291dHEgKnEsCisJCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICp0cmFuc21pdHRlZF9xdWV1ZSwKKwkJCSAgICAgIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0LAorCQkJICAgICAgX191MzIgaGlnaGVzdF9uZXdfdHNuX2luX3NhY2ssCisJCQkgICAgICBpbnQgY291bnRfb2ZfbmV3YWNrcykKK3sKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bms7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCV9fdTMyIHRzbjsKKwljaGFyIGRvX2Zhc3RfcmV0cmFuc21pdCA9IDA7CisJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpwcmltYXJ5ID0gcS0+YXNvYy0+cGVlci5wcmltYXJ5X3BhdGg7CisKKwlsaXN0X2Zvcl9lYWNoKHBvcywgdHJhbnNtaXR0ZWRfcXVldWUpIHsKKworCQljaHVuayA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF9jaHVuaywgdHJhbnNtaXR0ZWRfbGlzdCk7CisJCXRzbiA9IG50b2hsKGNodW5rLT5zdWJoLmRhdGFfaGRyLT50c24pOworCisJCS8qIFJGQyAyOTYwIDcuMi40LCBzY3RwaW1wZ3VpZGUtMDUgMi44LjIgTTMpIEV4YW1pbmUgYWxsCisJCSAqICdVbmFja25vd2xlZGdlZCBUU04ncycsIGlmIHRoZSBUU04gbnVtYmVyIG9mIGFuCisJCSAqICdVbmFja25vd2xlZGdlZCBUU04nIGlzIHNtYWxsZXIgdGhhbiB0aGUgJ0hpZ2hlc3RUU05pblNhY2snCisJCSAqIHZhbHVlLCBpbmNyZW1lbnQgdGhlICdUU04uTWlzc2luZy5SZXBvcnQnIGNvdW50IG9uIHRoYXQKKwkJICogY2h1bmsgaWYgaXQgaGFzIE5PVCBiZWVuIGZhc3QgcmV0cmFuc21pdHRlZCBvciBtYXJrZWQgZm9yCisJCSAqIGZhc3QgcmV0cmFuc21pdCBhbHJlYWR5LgorCQkgKi8KKwkJaWYgKCFjaHVuay0+ZmFzdF9yZXRyYW5zbWl0ICYmCisJCSAgICAhY2h1bmstPnRzbl9nYXBfYWNrZWQgJiYKKwkJICAgIFRTTl9sdCh0c24sIGhpZ2hlc3RfbmV3X3Rzbl9pbl9zYWNrKSkgeworCisJCQkvKiBTRlItQ0FDQyBtYXkgcmVxdWlyZSB1cyB0byBza2lwIG1hcmtpbmcKKwkJCSAqIHRoaXMgY2h1bmsgYXMgbWlzc2luZy4KKwkJCSAqLworCQkJaWYgKCF0cmFuc3BvcnQgfHwgIXNjdHBfY2FjY19za2lwKHByaW1hcnksIHRyYW5zcG9ydCwKKwkJCQkJICAgIGNvdW50X29mX25ld2Fja3MsIHRzbikpIHsKKwkJCQljaHVuay0+dHNuX21pc3NpbmdfcmVwb3J0Kys7CisKKwkJCQlTQ1RQX0RFQlVHX1BSSU5USygKKwkJCQkJIiVzOiBUU04gMHgleCBtaXNzaW5nIGNvdW50ZXI6ICVkXG4iLAorCQkJCQlfX0ZVTkNUSU9OX18sIHRzbiwKKwkJCQkJY2h1bmstPnRzbl9taXNzaW5nX3JlcG9ydCk7CisJCQl9CisJCX0KKwkJLyoKKwkJICogTTQpIElmIGFueSBEQVRBIGNodW5rIGlzIGZvdW5kIHRvIGhhdmUgYQorCQkgKiAnVFNOLk1pc3NpbmcuUmVwb3J0JworCQkgKiB2YWx1ZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byA0LCBtYXJrIHRoYXQgY2h1bmsgZm9yCisJCSAqIHJldHJhbnNtaXNzaW9uIGFuZCBzdGFydCB0aGUgZmFzdCByZXRyYW5zbWl0IHByb2NlZHVyZS4KKwkJICovCisKKwkJaWYgKGNodW5rLT50c25fbWlzc2luZ19yZXBvcnQgPj0gNCkgeworCQkJY2h1bmstPmZhc3RfcmV0cmFuc21pdCA9IDE7CisJCQlkb19mYXN0X3JldHJhbnNtaXQgPSAxOworCQl9CisJfQorCisJaWYgKHRyYW5zcG9ydCkgeworCQlpZiAoZG9fZmFzdF9yZXRyYW5zbWl0KQorCQkJc2N0cF9yZXRyYW5zbWl0KHEsIHRyYW5zcG9ydCwgU0NUUF9SVFhSX0ZBU1RfUlRYKTsKKworCQlTQ1RQX0RFQlVHX1BSSU5USygiJXM6IHRyYW5zcG9ydDogJXAsIGN3bmQ6ICVkLCAiCisJCQkJICAic3N0aHJlc2g6ICVkLCBmbGlnaHRfc2l6ZTogJWQsIHBiYTogJWRcbiIsCisJCQkJICBfX0ZVTkNUSU9OX18sIHRyYW5zcG9ydCwgdHJhbnNwb3J0LT5jd25kLAorCQkJICAJICB0cmFuc3BvcnQtPnNzdGhyZXNoLCB0cmFuc3BvcnQtPmZsaWdodF9zaXplLAorCQkJCSAgdHJhbnNwb3J0LT5wYXJ0aWFsX2J5dGVzX2Fja2VkKTsKKwl9Cit9CisKKy8qIElzIHRoZSBnaXZlbiBUU04gYWNrZWQgYnkgdGhpcyBwYWNrZXQ/ICAqLworc3RhdGljIGludCBzY3RwX2Fja2VkKHN0cnVjdCBzY3RwX3NhY2toZHIgKnNhY2ssIF9fdTMyIHRzbikKK3sKKwlpbnQgaTsKKwlzY3RwX3NhY2tfdmFyaWFibGVfdCAqZnJhZ3M7CisJX191MTYgZ2FwOworCV9fdTMyIGN0c24gPSBudG9obChzYWNrLT5jdW1fdHNuX2Fjayk7CisKKyAgICAgICAgaWYgKFRTTl9sdGUodHNuLCBjdHNuKSkKKwkJZ290byBwYXNzOworCisJLyogMy4zLjQgU2VsZWN0aXZlIEFja25vd2xlZGdlbWVudCAoU0FDSykgKDMpOgorCSAqCisJICogR2FwIEFjayBCbG9ja3M6CisJICogIFRoZXNlIGZpZWxkcyBjb250YWluIHRoZSBHYXAgQWNrIEJsb2Nrcy4gVGhleSBhcmUgcmVwZWF0ZWQKKwkgKiAgZm9yIGVhY2ggR2FwIEFjayBCbG9jayB1cCB0byB0aGUgbnVtYmVyIG9mIEdhcCBBY2sgQmxvY2tzCisJICogIGRlZmluZWQgaW4gdGhlIE51bWJlciBvZiBHYXAgQWNrIEJsb2NrcyBmaWVsZC4gQWxsIERBVEEKKwkgKiAgY2h1bmtzIHdpdGggVFNOcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gKEN1bXVsYXRpdmUgVFNOCisJICogIEFjayArIEdhcCBBY2sgQmxvY2sgU3RhcnQpIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8KKwkgKiAgKEN1bXVsYXRpdmUgVFNOIEFjayArIEdhcCBBY2sgQmxvY2sgRW5kKSBvZiBlYWNoIEdhcCBBY2sKKwkgKiAgQmxvY2sgYXJlIGFzc3VtZWQgdG8gaGF2ZSBiZWVuIHJlY2VpdmVkIGNvcnJlY3RseS4KKwkgKi8KKworCWZyYWdzID0gc2Fjay0+dmFyaWFibGU7CisJZ2FwID0gdHNuIC0gY3RzbjsKKwlmb3IgKGkgPSAwOyBpIDwgbnRvaHMoc2Fjay0+bnVtX2dhcF9hY2tfYmxvY2tzKTsgKytpKSB7CisJCWlmIChUU05fbHRlKG50b2hzKGZyYWdzW2ldLmdhYi5zdGFydCksIGdhcCkgJiYKKwkJICAgIFRTTl9sdGUoZ2FwLCBudG9ocyhmcmFnc1tpXS5nYWIuZW5kKSkpCisJCQlnb3RvIHBhc3M7CisJfQorCisJcmV0dXJuIDA7CitwYXNzOgorCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBzY3RwX2dldF9za2lwX3BvcyhzdHJ1Y3Qgc2N0cF9md2R0c25fc2tpcCAqc2tpcGxpc3QsCisJCQkJICAgIGludCBuc2tpcHMsIF9fdTE2IHN0cmVhbSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBuc2tpcHM7IGkrKykgeworCQlpZiAoc2tpcGxpc3RbaV0uc3RyZWFtID09IHN0cmVhbSkKKwkJCXJldHVybiBpOworCX0KKwlyZXR1cm4gaTsKK30KKworLyogQ3JlYXRlIGFuZCBhZGQgYSBmd2R0c24gY2h1bmsgdG8gdGhlIG91dHEncyBjb250cm9sIHF1ZXVlIGlmIG5lZWRlZC4gKi8KK3N0YXRpYyB2b2lkIHNjdHBfZ2VuZXJhdGVfZndkdHNuKHN0cnVjdCBzY3RwX291dHEgKnEsIF9fdTMyIGN0c24pCit7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MgPSBxLT5hc29jOworCXN0cnVjdCBzY3RwX2NodW5rICpmdHNuX2NodW5rID0gTlVMTDsKKwlzdHJ1Y3Qgc2N0cF9md2R0c25fc2tpcCBmdHNuX3NraXBfYXJyWzEwXTsKKwlpbnQgbnNraXBzID0gMDsKKwlpbnQgc2tpcF9wb3MgPSAwOworCV9fdTMyIHRzbjsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bms7CisJc3RydWN0IGxpc3RfaGVhZCAqbGNodW5rLCAqdGVtcDsKKworCS8qIFBSLVNDVFAgQzEpIExldCBTYWNrQ3VtQWNrIGJlIHRoZSBDdW11bGF0aXZlIFRTTiBBQ0sgY2FycmllZCBpbiB0aGUKKwkgKiByZWNlaXZlZCBTQUNLLgorCSAqIAorCSAqIElmIChBZHZhbmNlZC5QZWVyLkFjay5Qb2ludCA8IFNhY2tDdW1BY2spLCB0aGVuIHVwZGF0ZQorCSAqIEFkdmFuY2VkLlBlZXIuQWNrLlBvaW50IHRvIGJlIGVxdWFsIHRvIFNhY2tDdW1BY2suCisJICovCisJaWYgKFRTTl9sdChhc29jLT5hZHZfcGVlcl9hY2tfcG9pbnQsIGN0c24pKQorCQlhc29jLT5hZHZfcGVlcl9hY2tfcG9pbnQgPSBjdHNuOworCisJLyogUFItU0NUUCBDMikgVHJ5IHRvIGZ1cnRoZXIgYWR2YW5jZSB0aGUgIkFkdmFuY2VkLlBlZXIuQWNrLlBvaW50IgorCSAqIGxvY2FsbHksIHRoYXQgaXMsIHRvIG1vdmUgIkFkdmFuY2VkLlBlZXIuQWNrLlBvaW50IiB1cCBhcyBsb25nIGFzCisJICogdGhlIGNodW5rIG5leHQgaW4gdGhlIG91dC1xdWV1ZSBzcGFjZSBpcyBtYXJrZWQgYXMgImFiYW5kb25lZCIgYXMKKwkgKiBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisJICoKKwkgKiBBc3N1bWluZyB0aGF0IGEgU0FDSyBhcnJpdmVkIHdpdGggdGhlIEN1bXVsYXRpdmUgVFNOIEFDSyAxMDIKKwkgKiBhbmQgdGhlIEFkdmFuY2VkLlBlZXIuQWNrLlBvaW50IGlzIHVwZGF0ZWQgdG8gdGhpcyB2YWx1ZToKKwkgKiAKKwkgKiAgIG91dC1xdWV1ZSBhdCB0aGUgZW5kIG9mICA9PT4gICBvdXQtcXVldWUgYWZ0ZXIgQWR2LkFjay5Qb2ludAorCSAqICAgbm9ybWFsIFNBQ0sgcHJvY2Vzc2luZyAgICAgICAgICAgbG9jYWwgYWR2YW5jZW1lbnQKKwkgKiAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KKwkgKiAgIEFkdi5BY2suUHQtPiAxMDIgYWNrZWQgICAgICAgICAgICAgICAgICAgICAxMDIgYWNrZWQKKwkgKiAgICAgICAgICAgICAgICAxMDMgYWJhbmRvbmVkICAgICAgICAgICAgICAgICAxMDMgYWJhbmRvbmVkCisJICogICAgICAgICAgICAgICAgMTA0IGFiYW5kb25lZCAgICAgQWR2LkFjay5QLT4gMTA0IGFiYW5kb25lZAorCSAqICAgICAgICAgICAgICAgIDEwNSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNQorCSAqICAgICAgICAgICAgICAgIDEwNiBhY2tlZCAgICAgICAgICAgICAgICAgICAgIDEwNiBhY2tlZAorCSAqICAgICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgorCSAqCisJICogSW4gdGhpcyBleGFtcGxlLCB0aGUgZGF0YSBzZW5kZXIgc3VjY2Vzc2Z1bGx5IGFkdmFuY2VkIHRoZQorCSAqICJBZHZhbmNlZC5QZWVyLkFjay5Qb2ludCIgZnJvbSAxMDIgdG8gMTA0IGxvY2FsbHkuCisJICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKGxjaHVuaywgdGVtcCwgJnEtPmFiYW5kb25lZCkgeworCQljaHVuayA9IGxpc3RfZW50cnkobGNodW5rLCBzdHJ1Y3Qgc2N0cF9jaHVuaywKKwkJCQkJdHJhbnNtaXR0ZWRfbGlzdCk7CisJCXRzbiA9IG50b2hsKGNodW5rLT5zdWJoLmRhdGFfaGRyLT50c24pOworCisJCS8qIFJlbW92ZSBhbnkgY2h1bmtzIGluIHRoZSBhYmFuZG9uZWQgcXVldWUgdGhhdCBhcmUgYWNrZWQgYnkKKwkJICogdGhlIGN0c24uCisJCSAqLyAKKwkJaWYgKFRTTl9sdGUodHNuLCBjdHNuKSkgeworCQkJbGlzdF9kZWxfaW5pdChsY2h1bmspOworCQkJaWYgKCFjaHVuay0+dHNuX2dhcF9hY2tlZCkgeworCQkJY2h1bmstPnRyYW5zcG9ydC0+ZmxpZ2h0X3NpemUgLT0KKwkJCQkJCSBzY3RwX2RhdGFfc2l6ZShjaHVuayk7CisJCQlxLT5vdXRzdGFuZGluZ19ieXRlcyAtPSBzY3RwX2RhdGFfc2l6ZShjaHVuayk7CisJCQl9CisJCQlzY3RwX2NodW5rX2ZyZWUoY2h1bmspOworCQl9IGVsc2UgeworCQkJaWYgKFRTTl9sdGUodHNuLCBhc29jLT5hZHZfcGVlcl9hY2tfcG9pbnQrMSkpIHsKKwkJCQlhc29jLT5hZHZfcGVlcl9hY2tfcG9pbnQgPSB0c247CisJCQkJaWYgKGNodW5rLT5jaHVua19oZHItPmZsYWdzICYKKwkJCQkJIFNDVFBfREFUQV9VTk9SREVSRUQpCisJCQkJCWNvbnRpbnVlOworCQkJCXNraXBfcG9zID0gc2N0cF9nZXRfc2tpcF9wb3MoJmZ0c25fc2tpcF9hcnJbMF0sCisJCQkJCQluc2tpcHMsCisJCQkJCQljaHVuay0+c3ViaC5kYXRhX2hkci0+c3RyZWFtKTsKKwkJCQlmdHNuX3NraXBfYXJyW3NraXBfcG9zXS5zdHJlYW0gPQorCQkJCQljaHVuay0+c3ViaC5kYXRhX2hkci0+c3RyZWFtOworCQkJCWZ0c25fc2tpcF9hcnJbc2tpcF9wb3NdLnNzbiA9CisJCQkJCSBjaHVuay0+c3ViaC5kYXRhX2hkci0+c3NuOworCQkJCWlmIChza2lwX3BvcyA9PSBuc2tpcHMpCisJCQkJCW5za2lwcysrOworCQkJCWlmIChuc2tpcHMgPT0gMTApCisJCQkJCWJyZWFrOworCQkJfSBlbHNlCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBQUi1TQ1RQIEMzKSBJZiwgYWZ0ZXIgc3RlcCBDMSBhbmQgQzIsIHRoZSAiQWR2YW5jZWQuUGVlci5BY2suUG9pbnQiCisJICogaXMgZ3JlYXRlciB0aGFuIHRoZSBDdW11bGF0aXZlIFRTTiBBQ0sgY2FycmllZCBpbiB0aGUgcmVjZWl2ZWQKKwkgKiBTQUNLLCB0aGUgZGF0YSBzZW5kZXIgTVVTVCBzZW5kIHRoZSBkYXRhIHJlY2VpdmVyIGEgRk9SV0FSRCBUU04KKwkgKiBjaHVuayBjb250YWluaW5nIHRoZSBsYXRlc3QgdmFsdWUgb2YgdGhlCisJICogIkFkdmFuY2VkLlBlZXIuQWNrLlBvaW50Ii4KKwkgKgorCSAqIEM0KSBGb3IgZWFjaCAiYWJhbmRvbmVkIiBUU04gdGhlIHNlbmRlciBvZiB0aGUgRk9SV0FSRCBUU04gU0hPVUxECisJICogbGlzdCBlYWNoIHN0cmVhbSBhbmQgc2VxdWVuY2UgbnVtYmVyIGluIHRoZSBmb3J3YXJkZWQgVFNOLiBUaGlzCisJICogaW5mb3JtYXRpb24gd2lsbCBlbmFibGUgdGhlIHJlY2VpdmVyIHRvIGVhc2lseSBmaW5kIGFueQorCSAqIHN0cmFuZGVkIFRTTidzIHdhaXRpbmcgb24gc3RyZWFtIHJlb3JkZXIgcXVldWVzLiBFYWNoIHN0cmVhbQorCSAqIFNIT1VMRCBvbmx5IGJlIHJlcG9ydGVkIG9uY2U7IHRoaXMgbWVhbnMgdGhhdCBpZiBtdWx0aXBsZQorCSAqIGFiYW5kb25lZCBtZXNzYWdlcyBvY2N1ciBpbiB0aGUgc2FtZSBzdHJlYW0gdGhlbiBvbmx5IHRoZQorCSAqIGhpZ2hlc3QgYWJhbmRvbmVkIHN0cmVhbSBzZXF1ZW5jZSBudW1iZXIgaXMgcmVwb3J0ZWQuIElmIHRoZQorCSAqIHRvdGFsIHNpemUgb2YgdGhlIEZPUldBUkQgVFNOIGRvZXMgTk9UIGZpdCBpbiBhIHNpbmdsZSBNVFUgdGhlbgorCSAqIHRoZSBzZW5kZXIgb2YgdGhlIEZPUldBUkQgVFNOIFNIT1VMRCBsb3dlciB0aGUKKwkgKiBBZHZhbmNlZC5QZWVyLkFjay5Qb2ludCB0byB0aGUgbGFzdCBUU04gdGhhdCB3aWxsIGZpdCBpbiBhCisJICogc2luZ2xlIE1UVS4KKwkgKi8KKwlpZiAoYXNvYy0+YWR2X3BlZXJfYWNrX3BvaW50ID4gY3RzbikKKwkJZnRzbl9jaHVuayA9IHNjdHBfbWFrZV9md2R0c24oYXNvYywgYXNvYy0+YWR2X3BlZXJfYWNrX3BvaW50LAorCQkJCQkgICAgICBuc2tpcHMsICZmdHNuX3NraXBfYXJyWzBdKTsgCisKKwlpZiAoZnRzbl9jaHVuaykgeworCQlfX3NrYl9xdWV1ZV90YWlsKCZxLT5jb250cm9sLCAoc3RydWN0IHNrX2J1ZmYgKilmdHNuX2NodW5rKTsKKwkJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfT1VUQ1RSTENIVU5LUyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvcHJpbWl0aXZlLmMgYi9uZXQvc2N0cC9wcmltaXRpdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTdlYmZjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjdHAvcHJpbWl0aXZlLmMKQEAgLTAsMCArMSwyMTkgQEAKKy8qIFNDVFAga2VybmVsIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgQ2lzY28sIEluYy4KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIE1vdG9yb2xhLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFNDVFAga2VybmVsIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbgorICoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBpbXBsZW1lbnQgdGhlIFNDVFAgcHJpbWl0aXZlIGZ1bmN0aW9ucyBmcm9tIFNlY3Rpb24gMTAuCisgKgorICogTm90ZSB0aGF0IHRoZSBkZXNjcmlwdGlvbnMgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBhcmUgVVNFUiBsZXZlbAorICogZnVuY3Rpb25zLS10aGlzIGZpbGUgaXMgdGhlIGZ1bmN0aW9ucyB3aGljaCBwb3B1bGF0ZSB0aGUgc3RydWN0IHByb3RvCisgKiBmb3IgU0NUUCB3aGljaCBpcyB0aGUgQk9UVE9NIG9mIHRoZSBzb2NrZXRzIGludGVyZmFjZS4KKyAqCisgKiBUaGUgU0NUUCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgU0NUUCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogV3JpdHRlbiBvciBtb2RpZmllZCBieToKKyAqICAgIExhIE1vbnRlIEguUC4gWWFycm9sbCA8cGlnZ3lAYWNtLm9yZz4KKyAqICAgIE5hcmFzaW1oYSBCdWRpaGFsICAgICA8bmFyYXNpbWhhQHJlZmNvZGUub3JnPgorICogICAgS2FybCBLbnV0c29uICAgICAgICAgIDxrYXJsQGF0aGVuYS5jaGljYWdvLmlsLnVzPgorICogICAgQXJkZWxsZSBGYW4JICAgIDxhcmRlbGxlLmZhbkBpbnRlbC5jb20+CisgKiAgICBLZXZpbiBHYW8gICAgICAgICAgICAgPGtldmluLmdhb0BpbnRlbC5jb20+CisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgZ2l2ZW4gdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4gLyogRm9yIHN0cnVjdCBsaXN0X2hlYWQgKi8KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4gLyogRm9yIHN0cnVjdCB0aW1ldmFsICovCisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvc2N0cC9zY3RwLmg+CisjaW5jbHVkZSA8bmV0L3NjdHAvc20uaD4KKworI2RlZmluZSBERUNMQVJFX1BSSU1JVElWRShuYW1lKSBcCisvKiBUaGlzIGlzIGNhbGxlZCBpbiB0aGUgY29kZSBhcyBzY3RwX3ByaW1pdGl2ZV8gIyMgbmFtZS4gICovIFwKK2ludCBzY3RwX3ByaW1pdGl2ZV8gIyMgbmFtZShzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywgXAorCQkJICAgIHZvaWQgKmFyZykgeyBcCisJaW50IGVycm9yID0gMDsgXAorCXNjdHBfZXZlbnRfdCBldmVudF90eXBlOyBzY3RwX3N1YnR5cGVfdCBzdWJ0eXBlOyBcCisJc2N0cF9zdGF0ZV90IHN0YXRlOyBcCisJc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwOyBcCisJXAorCWV2ZW50X3R5cGUgPSBTQ1RQX0VWRU5UX1RfUFJJTUlUSVZFOyBcCisJc3VidHlwZSA9IFNDVFBfU1RfUFJJTUlUSVZFKFNDVFBfUFJJTUlUSVZFXyAjIyBuYW1lKTsgXAorCXN0YXRlID0gYXNvYyA/IGFzb2MtPnN0YXRlIDogU0NUUF9TVEFURV9DTE9TRUQ7IFwKKwllcCA9IGFzb2MgPyBhc29jLT5lcCA6IE5VTEw7IFwKKwlcCisJZXJyb3IgPSBzY3RwX2RvX3NtKGV2ZW50X3R5cGUsIHN1YnR5cGUsIHN0YXRlLCBlcCwgYXNvYywgXAorCQkJICAgYXJnLCBHRlBfS0VSTkVMKTsgXAorIAlyZXR1cm4gZXJyb3I7IFwKK30KKworLyogMTAuMSBVTFAtdG8tU0NUUAorICogQikgQXNzb2NpYXRlCisgKgorICogRm9ybWF0OiBBU1NPQ0lBVEUobG9jYWwgU0NUUCBpbnN0YW5jZSBuYW1lLCBkZXN0aW5hdGlvbiB0cmFuc3BvcnQgYWRkciwKKyAqICAgICAgICAgb3V0Ym91bmQgc3RyZWFtIGNvdW50KQorICogLT4gYXNzb2NpYXRpb24gaWQgWyxkZXN0aW5hdGlvbiB0cmFuc3BvcnQgYWRkciBsaXN0XSBbLG91dGJvdW5kIHN0cmVhbQorICogICAgY291bnRdCisgKgorICogVGhpcyBwcmltaXRpdmUgYWxsb3dzIHRoZSB1cHBlciBsYXllciB0byBpbml0aWF0ZSBhbiBhc3NvY2lhdGlvbiB0byBhCisgKiBzcGVjaWZpYyBwZWVyIGVuZHBvaW50LgorICoKKyAqIFRoaXMgdmVyc2lvbiBhc3N1bWVzIHRoYXQgYXNvYyBpcyBmdWxseSBwb3B1bGF0ZWQgd2l0aCB0aGUgaW5pdGlhbAorICogcGFyYW1ldGVycy4gIFdlIHRoZW4gcmV0dXJuIGEgdHJhZGl0aW9uYWwga2VybmVsIGluZGljYXRvciBvZgorICogc3VjY2VzcyBvciBmYWlsdXJlLgorICovCisKKy8qIFRoaXMgaXMgY2FsbGVkIGluIHRoZSBjb2RlIGFzIHNjdHBfcHJpbWl0aXZlX0FTU09DSUFURS4gICovCisKK0RFQ0xBUkVfUFJJTUlUSVZFKEFTU09DSUFURSkKKworLyogMTAuMSBVTFAtdG8tU0NUUAorICogQykgU2h1dGRvd24KKyAqCisgKiBGb3JtYXQ6IFNIVVRET1dOKGFzc29jaWF0aW9uIGlkKQorICogLT4gcmVzdWx0CisgKgorICogR3JhY2VmdWxseSBjbG9zZXMgYW4gYXNzb2NpYXRpb24uIEFueSBsb2NhbGx5IHF1ZXVlZCB1c2VyIGRhdGEKKyAqIHdpbGwgYmUgZGVsaXZlcmVkIHRvIHRoZSBwZWVyLiBUaGUgYXNzb2NpYXRpb24gd2lsbCBiZSB0ZXJtaW5hdGVkIG9ubHkKKyAqIGFmdGVyIHRoZSBwZWVyIGFja25vd2xlZGdlcyBhbGwgdGhlIFNDVFAgcGFja2V0cyBzZW50LiAgQSBzdWNjZXNzIGNvZGUKKyAqIHdpbGwgYmUgcmV0dXJuZWQgb24gc3VjY2Vzc2Z1bCB0ZXJtaW5hdGlvbiBvZiB0aGUgYXNzb2NpYXRpb24uIElmCisgKiBhdHRlbXB0aW5nIHRvIHRlcm1pbmF0ZSB0aGUgYXNzb2NpYXRpb24gcmVzdWx0cyBpbiBhIGZhaWx1cmUsIGFuIGVycm9yCisgKiBjb2RlIHNoYWxsIGJlIHJldHVybmVkLgorICovCisKK0RFQ0xBUkVfUFJJTUlUSVZFKFNIVVRET1dOKTsKKworLyogMTAuMSBVTFAtdG8tU0NUUAorICogQykgQWJvcnQKKyAqCisgKiBGb3JtYXQ6IEFib3J0KGFzc29jaWF0aW9uIGlkIFssIGNhdXNlIGNvZGVdKQorICogLT4gcmVzdWx0CisgKgorICogVW5ncmFjZWZ1bGx5IGNsb3NlcyBhbiBhc3NvY2lhdGlvbi4gQW55IGxvY2FsbHkgcXVldWVkIHVzZXIgZGF0YQorICogd2lsbCBiZSBkaXNjYXJkZWQgYW5kIGFuIEFCT1JUIGNodW5rIGlzIHNlbnQgdG8gdGhlIHBlZXIuIEEgc3VjY2VzcworICogY29kZSB3aWxsIGJlIHJldHVybmVkIG9uIHN1Y2Nlc3NmdWwgYWJvcnRpb24gb2YgdGhlIGFzc29jaWF0aW9uLiBJZgorICogYXR0ZW1wdGluZyB0byBhYm9ydCB0aGUgYXNzb2NpYXRpb24gcmVzdWx0cyBpbiBhIGZhaWx1cmUsIGFuIGVycm9yCisgKiBjb2RlIHNoYWxsIGJlIHJldHVybmVkLgorICovCisKK0RFQ0xBUkVfUFJJTUlUSVZFKEFCT1JUKTsKKworLyogMTAuMSBVTFAtdG8tU0NUUAorICogRSkgU2VuZAorICoKKyAqIEZvcm1hdDogU0VORChhc3NvY2lhdGlvbiBpZCwgYnVmZmVyIGFkZHJlc3MsIGJ5dGUgY291bnQgWyxjb250ZXh0XQorICogICAgICAgICBbLHN0cmVhbSBpZF0gWyxsaWZlIHRpbWVdIFssZGVzdGluYXRpb24gdHJhbnNwb3J0IGFkZHJlc3NdCisgKiAgICAgICAgIFssdW5vcmRlciBmbGFnXSBbLG5vLWJ1bmRsZSBmbGFnXSBbLHBheWxvYWQgcHJvdG9jb2wtaWRdICkKKyAqIC0+IHJlc3VsdAorICoKKyAqIFRoaXMgaXMgdGhlIG1haW4gbWV0aG9kIHRvIHNlbmQgdXNlciBkYXRhIHZpYSBTQ1RQLgorICoKKyAqIE1hbmRhdG9yeSBhdHRyaWJ1dGVzOgorICoKKyAqICBvIGFzc29jaWF0aW9uIGlkIC0gbG9jYWwgaGFuZGxlIHRvIHRoZSBTQ1RQIGFzc29jaWF0aW9uCisgKgorICogIG8gYnVmZmVyIGFkZHJlc3MgLSB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHVzZXIgbWVzc2FnZSB0byBiZQorICogICAgdHJhbnNtaXR0ZWQgaXMgc3RvcmVkOworICoKKyAqICBvIGJ5dGUgY291bnQgLSBUaGUgc2l6ZSBvZiB0aGUgdXNlciBkYXRhIGluIG51bWJlciBvZiBieXRlczsKKyAqCisgKiBPcHRpb25hbCBhdHRyaWJ1dGVzOgorICoKKyAqICBvIGNvbnRleHQgLSBhbiBvcHRpb25hbCAzMiBiaXQgaW50ZWdlciB0aGF0IHdpbGwgYmUgY2FycmllZCBpbiB0aGUKKyAqICAgIHNlbmRpbmcgZmFpbHVyZSBub3RpZmljYXRpb24gdG8gdGhlIFVMUCBpZiB0aGUgdHJhbnNwb3J0YXRpb24gb2YKKyAqICAgIHRoaXMgVXNlciBNZXNzYWdlIGZhaWxzLgorICoKKyAqICBvIHN0cmVhbSBpZCAtIHRvIGluZGljYXRlIHdoaWNoIHN0cmVhbSB0byBzZW5kIHRoZSBkYXRhIG9uLiBJZiBub3QKKyAqICAgIHNwZWNpZmllZCwgc3RyZWFtIDAgd2lsbCBiZSB1c2VkLgorICoKKyAqICBvIGxpZmUgdGltZSAtIHNwZWNpZmllcyB0aGUgbGlmZSB0aW1lIG9mIHRoZSB1c2VyIGRhdGEuIFRoZSB1c2VyIGRhdGEKKyAqICAgIHdpbGwgbm90IGJlIHNlbnQgYnkgU0NUUCBhZnRlciB0aGUgbGlmZSB0aW1lIGV4cGlyZXMuIFRoaXMKKyAqICAgIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBhdm9pZCBlZmZvcnRzIHRvIHRyYW5zbWl0IHN0YWxlCisgKiAgICB1c2VyIG1lc3NhZ2VzLiBTQ1RQIG5vdGlmaWVzIHRoZSBVTFAgaWYgdGhlIGRhdGEgY2Fubm90IGJlCisgKiAgICBpbml0aWF0ZWQgdG8gdHJhbnNwb3J0IChpLmUuIHNlbnQgdG8gdGhlIGRlc3RpbmF0aW9uIHZpYSBTQ1RQJ3MKKyAqICAgIHNlbmQgcHJpbWl0aXZlKSB3aXRoaW4gdGhlIGxpZmUgdGltZSB2YXJpYWJsZS4gSG93ZXZlciwgdGhlCisgKiAgICB1c2VyIGRhdGEgd2lsbCBiZSB0cmFuc21pdHRlZCBpZiBTQ1RQIGhhcyBhdHRlbXB0ZWQgdG8gdHJhbnNtaXQgYQorICogICAgY2h1bmsgYmVmb3JlIHRoZSBsaWZlIHRpbWUgZXhwaXJlZC4KKyAqCisgKiAgbyBkZXN0aW5hdGlvbiB0cmFuc3BvcnQgYWRkcmVzcyAtIHNwZWNpZmllZCBhcyBvbmUgb2YgdGhlIGRlc3RpbmF0aW9uCisgKiAgICB0cmFuc3BvcnQgYWRkcmVzc2VzIG9mIHRoZSBwZWVyIGVuZHBvaW50IHRvIHdoaWNoIHRoaXMgcGFja2V0CisgKiAgICBzaG91bGQgYmUgc2VudC4gV2hlbmV2ZXIgcG9zc2libGUsIFNDVFAgc2hvdWxkIHVzZSB0aGlzIGRlc3RpbmF0aW9uCisgKiAgICB0cmFuc3BvcnQgYWRkcmVzcyBmb3Igc2VuZGluZyB0aGUgcGFja2V0cywgaW5zdGVhZCBvZiB0aGUgY3VycmVudAorICogICAgcHJpbWFyeSBwYXRoLgorICoKKyAqICBvIHVub3JkZXIgZmxhZyAtIHRoaXMgZmxhZywgaWYgcHJlc2VudCwgaW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIKKyAqICAgIHdvdWxkIGxpa2UgdGhlIGRhdGEgZGVsaXZlcmVkIGluIGFuIHVub3JkZXJlZCBmYXNoaW9uIHRvIHRoZSBwZWVyCisgKiAgICAoaS5lLiwgdGhlIFUgZmxhZyBpcyBzZXQgdG8gMSBvbiBhbGwgREFUQSBjaHVua3MgY2FycnlpbmcgdGhpcworICogICAgbWVzc2FnZSkuCisgKgorICogIG8gbm8tYnVuZGxlIGZsYWcgLSBpbnN0cnVjdHMgU0NUUCBub3QgdG8gYnVuZGxlIHRoaXMgdXNlciBkYXRhIHdpdGgKKyAqICAgIG90aGVyIG91dGJvdW5kIERBVEEgY2h1bmtzLiBTQ1RQIE1BWSBzdGlsbCBidW5kbGUgZXZlbiB3aGVuCisgKiAgICB0aGlzIGZsYWcgaXMgcHJlc2VudCwgd2hlbiBmYWNlZCB3aXRoIG5ldHdvcmsgY29uZ2VzdGlvbi4KKyAqCisgKiAgbyBwYXlsb2FkIHByb3RvY29sLWlkIC0gQSAzMiBiaXQgdW5zaWduZWQgaW50ZWdlciB0aGF0IGlzIHRvIGJlCisgKiAgICBwYXNzZWQgdG8gdGhlIHBlZXIgaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBwYXlsb2FkIHByb3RvY29sIGRhdGEKKyAqICAgIGJlaW5nIHRyYW5zbWl0dGVkLiBUaGlzIHZhbHVlIGlzIHBhc3NlZCBhcyBvcGFxdWUgZGF0YSBieSBTQ1RQLgorICovCisKK0RFQ0xBUkVfUFJJTUlUSVZFKFNFTkQpOworCisvKiAxMC4xIFVMUC10by1TQ1RQCisgKiBKKSBSZXF1ZXN0IEhlYXJ0YmVhdAorICoKKyAqIEZvcm1hdDogUkVRVUVTVEhFQVJUQkVBVChhc3NvY2lhdGlvbiBpZCwgZGVzdGluYXRpb24gdHJhbnNwb3J0IGFkZHJlc3MpCisgKgorICogLT4gcmVzdWx0CisgKgorICogSW5zdHJ1Y3RzIHRoZSBsb2NhbCBlbmRwb2ludCB0byBwZXJmb3JtIGEgSGVhcnRCZWF0IG9uIHRoZSBzcGVjaWZpZWQKKyAqIGRlc3RpbmF0aW9uIHRyYW5zcG9ydCBhZGRyZXNzIG9mIHRoZSBnaXZlbiBhc3NvY2lhdGlvbi4gVGhlIHJldHVybmVkCisgKiByZXN1bHQgc2hvdWxkIGluZGljYXRlIHdoZXRoZXIgdGhlIHRyYW5zbWlzc2lvbiBvZiB0aGUgSEVBUlRCRUFUCisgKiBjaHVuayB0byB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBpcyBzdWNjZXNzZnVsLgorICoKKyAqIE1hbmRhdG9yeSBhdHRyaWJ1dGVzOgorICoKKyAqIG8gYXNzb2NpYXRpb24gaWQgLSBsb2NhbCBoYW5kbGUgdG8gdGhlIFNDVFAgYXNzb2NpYXRpb24KKyAqCisgKiBvIGRlc3RpbmF0aW9uIHRyYW5zcG9ydCBhZGRyZXNzIC0gdGhlIHRyYW5zcG9ydCBhZGRyZXNzIG9mIHRoZQorICogICBhc3NvY2lhdGlvbiBvbiB3aGljaCBhIGhlYXJ0YmVhdCBzaG91bGQgYmUgaXNzdWVkLgorICovCisKK0RFQ0xBUkVfUFJJTUlUSVZFKFJFUVVFU1RIRUFSVEJFQVQpOworCisvKiBBRERJUAorKiAzLjEuMSBBZGRyZXNzIENvbmZpZ3VyYXRpb24gQ2hhbmdlIENodW5rIChBU0NPTkYpCisqIAorKiBUaGlzIGNodW5rIGlzIHVzZWQgdG8gY29tbXVuaWNhdGUgdG8gdGhlIHJlbW90ZSBlbmRwb2ludCBvbmUgb2YgdGhlCisqIGNvbmZpZ3VyYXRpb24gY2hhbmdlIHJlcXVlc3RzIHRoYXQgTVVTVCBiZSBhY2tub3dsZWRnZWQuICBUaGUKKyogaW5mb3JtYXRpb24gY2FycmllZCBpbiB0aGUgQVNDT05GIENodW5rIHVzZXMgdGhlIGZvcm0gb2YgYQorKiBUeXBlLUxlbmd0aC1WYWx1ZSAoVExWKSwgYXMgZGVzY3JpYmVkIGluICIzLjIuMSBPcHRpb25hbC8KKyogVmFyaWFibGUtbGVuZ3RoIFBhcmFtZXRlciBGb3JtYXQiIGluIFJGQzI5NjAgWzVdLCBmb3JhbGwgdmFyaWFibGUKKyogcGFyYW1ldGVycy4KKyovCisKK0RFQ0xBUkVfUFJJTUlUSVZFKEFTQ09ORik7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9wcm9jLmMgYi9uZXQvc2N0cC9wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQyZmQ4YwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY3RwL3Byb2MuYwpAQCAtMCwwICsxLDI4OCBAQAorLyogU0NUUCBrZXJuZWwgcmVmZXJlbmNlIEltcGxlbWVudGF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcywgQ29ycC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgU0NUUCBrZXJuZWwgcmVmZXJlbmNlIEltcGxlbWVudGF0aW9uCisgKgorICogVGhlIFNDVFAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQKKyAqIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICogICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBQbGVhc2Ugc2VuZCBhbnkgYnVnIHJlcG9ydHMgb3IgZml4ZXMgeW91IG1ha2UgdG8gdGhlCisgKiBlbWFpbCBhZGRyZXNzKGVzKToKKyAqICAgIGxrc2N0cCBkZXZlbG9wZXJzIDxsa3NjdHAtZGV2ZWxvcGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogT3Igc3VibWl0IGEgYnVnIHJlcG9ydCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgd2Vic2l0ZToKKyAqICAgIGh0dHA6Ly93d3cuc2YubmV0L3Byb2plY3RzL2xrc2N0cAorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiAgICBTcmlkaGFyIFNhbXVkcmFsYSA8c3JpQHVzLmlibS5jb20+CisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgZ2l2ZW4gdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPG5ldC9zY3RwL3NjdHAuaD4KKworc3RhdGljIHN0cnVjdCBzbm1wX21pYiBzY3RwX3NubXBfbGlzdFtdID0geworCVNOTVBfTUlCX0lURU0oIlNjdHBDdXJyRXN0YWIiLCBTQ1RQX01JQl9DVVJSRVNUQUIpLAorCVNOTVBfTUlCX0lURU0oIlNjdHBBY3RpdmVFc3RhYnMiLCBTQ1RQX01JQl9BQ1RJVkVFU1RBQlMpLAorCVNOTVBfTUlCX0lURU0oIlNjdHBQYXNzaXZlRXN0YWJzIiwgU0NUUF9NSUJfUEFTU0lWRUVTVEFCUyksCisJU05NUF9NSUJfSVRFTSgiU2N0cEFib3J0ZWRzIiwgU0NUUF9NSUJfQUJPUlRFRFMpLAorCVNOTVBfTUlCX0lURU0oIlNjdHBTaHV0ZG93bnMiLCBTQ1RQX01JQl9TSFVURE9XTlMpLAorCVNOTVBfTUlCX0lURU0oIlNjdHBPdXRPZkJsdWVzIiwgU0NUUF9NSUJfT1VUT0ZCTFVFUyksCisJU05NUF9NSUJfSVRFTSgiU2N0cENoZWNrc3VtRXJyb3JzIiwgU0NUUF9NSUJfQ0hFQ0tTVU1FUlJPUlMpLAorCVNOTVBfTUlCX0lURU0oIlNjdHBPdXRDdHJsQ2h1bmtzIiwgU0NUUF9NSUJfT1VUQ1RSTENIVU5LUyksCisJU05NUF9NSUJfSVRFTSgiU2N0cE91dE9yZGVyQ2h1bmtzIiwgU0NUUF9NSUJfT1VUT1JERVJDSFVOS1MpLAorCVNOTVBfTUlCX0lURU0oIlNjdHBPdXRVbm9yZGVyQ2h1bmtzIiwgU0NUUF9NSUJfT1VUVU5PUkRFUkNIVU5LUyksCisJU05NUF9NSUJfSVRFTSgiU2N0cEluQ3RybENodW5rcyIsIFNDVFBfTUlCX0lOQ1RSTENIVU5LUyksCisJU05NUF9NSUJfSVRFTSgiU2N0cEluT3JkZXJDaHVua3MiLCBTQ1RQX01JQl9JTk9SREVSQ0hVTktTKSwKKwlTTk1QX01JQl9JVEVNKCJTY3RwSW5Vbm9yZGVyQ2h1bmtzIiwgU0NUUF9NSUJfSU5VTk9SREVSQ0hVTktTKSwKKwlTTk1QX01JQl9JVEVNKCJTY3RwRnJhZ1Vzck1zZ3MiLCBTQ1RQX01JQl9GUkFHVVNSTVNHUyksCisJU05NUF9NSUJfSVRFTSgiU2N0cFJlYXNtVXNyTXNncyIsIFNDVFBfTUlCX1JFQVNNVVNSTVNHUyksCisJU05NUF9NSUJfSVRFTSgiU2N0cE91dFNDVFBQYWNrcyIsIFNDVFBfTUlCX09VVFNDVFBQQUNLUyksCisJU05NUF9NSUJfSVRFTSgiU2N0cEluU0NUUFBhY2tzIiwgU0NUUF9NSUJfSU5TQ1RQUEFDS1MpLAorfTsKKworLyogUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIGEgcGFydGljdWxhciBlbnRyeSBpbiB0aGUgbWliIGJ5IGFkZGluZyBpdHMKKyAqIHBlciBjcHUgY291bnRlcnMuCisgKi8gCitzdGF0aWMgdW5zaWduZWQgbG9uZworZm9sZF9maWVsZCh2b2lkICptaWJbXSwgaW50IG5yKQoreworCXVuc2lnbmVkIGxvbmcgcmVzID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKKwkJaWYgKCFjcHVfcG9zc2libGUoaSkpCisJCQljb250aW51ZTsKKwkJcmVzICs9CisJCSAgICAqKCh1bnNpZ25lZCBsb25nICopICgoKHZvaWQgKikgcGVyX2NwdV9wdHIobWliWzBdLCBpKSkgKworCQkJCQkgc2l6ZW9mICh1bnNpZ25lZCBsb25nKSAqIG5yKSk7CisJCXJlcyArPQorCQkgICAgKigodW5zaWduZWQgbG9uZyAqKSAoKCh2b2lkICopIHBlcl9jcHVfcHRyKG1pYlsxXSwgaSkpICsKKwkJCQkJIHNpemVvZiAodW5zaWduZWQgbG9uZykgKiBucikpOworCX0KKwlyZXR1cm4gcmVzOworfQorCisvKiBEaXNwbGF5IHNjdHAgc25tcCBtaWIgc3RhdGlzdGljcygvcHJvYy9uZXQvc2N0cC9zbm1wKS4gKi8KK3N0YXRpYyBpbnQgc2N0cF9zbm1wX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgc2N0cF9zbm1wX2xpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisJCXNlcV9wcmludGYoc2VxLCAiJS0zMnNcdCVsZFxuIiwgc2N0cF9zbm1wX2xpc3RbaV0ubmFtZSwKKwkJCSAgIGZvbGRfZmllbGQoKHZvaWQgKiopc2N0cF9zdGF0aXN0aWNzLCAKKwkJCQkgICAgICBzY3RwX3NubXBfbGlzdFtpXS5lbnRyeSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIHNlcSBmaWxlIG9wZXJhdGlvbnMgZm9yICdzbm1wJyBvYmplY3QuICovCitzdGF0aWMgaW50IHNjdHBfc25tcF9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgc2N0cF9zbm1wX3NlcV9zaG93LCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2N0cF9zbm1wX3NlcV9mb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkub3BlbgkgPSBzY3RwX3NubXBfc2VxX29wZW4sCisJLnJlYWQJID0gc2VxX3JlYWQsCisJLmxsc2VlawkgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKKy8qIFNldCB1cCB0aGUgcHJvYyBmcyBlbnRyeSBmb3IgJ3NubXAnIG9iamVjdC4gKi8KK2ludCBfX2luaXQgc2N0cF9zbm1wX3Byb2NfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcDsKKworCXAgPSBjcmVhdGVfcHJvY19lbnRyeSgic25tcCIsIFNfSVJVR08sIHByb2NfbmV0X3NjdHApOworCWlmICghcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwLT5wcm9jX2ZvcHMgPSAmc2N0cF9zbm1wX3NlcV9mb3BzOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENsZWFudXAgdGhlIHByb2MgZnMgZW50cnkgZm9yICdzbm1wJyBvYmplY3QuICovCit2b2lkIHNjdHBfc25tcF9wcm9jX2V4aXQodm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeSgic25tcCIsIHByb2NfbmV0X3NjdHApOworfQorCisvKiBEdW1wIGxvY2FsIGFkZHJlc3NlcyBvZiBhbiBhc3NvY2lhdGlvbi9lbmRwb2ludC4gKi8KK3N0YXRpYyB2b2lkIHNjdHBfc2VxX2R1bXBfbG9jYWxfYWRkcnMoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBzY3RwX2VwX2NvbW1vbiAqZXBiKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwlzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSAqbGFkZHI7CisJdW5pb24gc2N0cF9hZGRyICphZGRyOworCXN0cnVjdCBzY3RwX2FmICphZjsKKworCWxpc3RfZm9yX2VhY2gocG9zLCAmZXBiLT5iaW5kX2FkZHIuYWRkcmVzc19saXN0KSB7CisJCWxhZGRyID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5LCBsaXN0KTsKKwkJYWRkciA9ICh1bmlvbiBzY3RwX2FkZHIgKikmbGFkZHItPmE7CisJCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoYWRkci0+c2Euc2FfZmFtaWx5KTsKKwkJYWYtPnNlcV9kdW1wX2FkZHIoc2VxLCBhZGRyKTsKKwl9Cit9CisKKy8qIER1bXAgcmVtb3RlIGFkZHJlc3NlcyBvZiBhbiBhc3NvY2lhdGlvbi4gKi8KK3N0YXRpYyB2b2lkIHNjdHBfc2VxX2R1bXBfcmVtb3RlX2FkZHJzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNzb2MpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0OworCXVuaW9uIHNjdHBfYWRkciAqYWRkcjsKKwlzdHJ1Y3Qgc2N0cF9hZiAqYWY7CisKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJmFzc29jLT5wZWVyLnRyYW5zcG9ydF9hZGRyX2xpc3QpIHsKKwkJdHJhbnNwb3J0ID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCwgdHJhbnNwb3J0cyk7CisJCWFkZHIgPSAodW5pb24gc2N0cF9hZGRyICopJnRyYW5zcG9ydC0+aXBhZGRyOworCQlhZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKGFkZHItPnNhLnNhX2ZhbWlseSk7CisJCWFmLT5zZXFfZHVtcF9hZGRyKHNlcSwgYWRkcik7CisJfQorfQorCisvKiBEaXNwbGF5IHNjdHAgZW5kcG9pbnRzICgvcHJvYy9uZXQvc2N0cC9lcHMpLiAqLworc3RhdGljIGludCBzY3RwX2Vwc19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3Qgc2N0cF9oYXNoYnVja2V0ICpoZWFkOworCXN0cnVjdCBzY3RwX2VwX2NvbW1vbiAqZXBiOworCXN0cnVjdCBzY3RwX2VuZHBvaW50ICplcDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJaW50IGhhc2g7CisKKwlzZXFfcHJpbnRmKHNlcSwgIiBFTkRQVCAgICAgU09DSyAgIFNUWSBTU1QgSEJLVCBMUE9SVCBMQUREUlNcbiIpOworCWZvciAoaGFzaCA9IDA7IGhhc2ggPCBzY3RwX2VwX2hhc2hzaXplOyBoYXNoKyspIHsKKwkJaGVhZCA9ICZzY3RwX2VwX2hhc2h0YWJsZVtoYXNoXTsKKwkJcmVhZF9sb2NrKCZoZWFkLT5sb2NrKTsKKwkJZm9yIChlcGIgPSBoZWFkLT5jaGFpbjsgZXBiOyBlcGIgPSBlcGItPm5leHQpIHsKKwkJCWVwID0gc2N0cF9lcChlcGIpOworCQkJc2sgPSBlcGItPnNrOworCQkJc2VxX3ByaW50ZihzZXEsICIlOHAgJThwICUtM2QgJS0zZCAlLTRkICUtNWQgIiwgZXAsIHNrLAorCQkJCSAgIHNjdHBfc2soc2spLT50eXBlLCBzay0+c2tfc3RhdGUsIGhhc2gsCisJCQkJICAgZXBiLT5iaW5kX2FkZHIucG9ydCk7CisJCQlzY3RwX3NlcV9kdW1wX2xvY2FsX2FkZHJzKHNlcSwgZXBiKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKKwkJfQorCQlyZWFkX3VubG9jaygmaGVhZC0+bG9jayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIHNlcSBmaWxlIG9wZXJhdGlvbnMgZm9yICdlcHMnIG9iamVjdC4gKi8KK3N0YXRpYyBpbnQgc2N0cF9lcHNfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNjdHBfZXBzX3NlcV9zaG93LCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2N0cF9lcHNfc2VxX2ZvcHMgPSB7CisJLm9wZW4JID0gc2N0cF9lcHNfc2VxX29wZW4sCisJLnJlYWQJID0gc2VxX3JlYWQsCisJLmxsc2VlawkgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKKy8qIFNldCB1cCB0aGUgcHJvYyBmcyBlbnRyeSBmb3IgJ2Vwcycgb2JqZWN0LiAqLworaW50IF9faW5pdCBzY3RwX2Vwc19wcm9jX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnA7CisKKwlwID0gY3JlYXRlX3Byb2NfZW50cnkoImVwcyIsIFNfSVJVR08sIHByb2NfbmV0X3NjdHApOworCWlmICghcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwLT5wcm9jX2ZvcHMgPSAmc2N0cF9lcHNfc2VxX2ZvcHM7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2xlYW51cCB0aGUgcHJvYyBmcyBlbnRyeSBmb3IgJ2Vwcycgb2JqZWN0LiAqLwordm9pZCBzY3RwX2Vwc19wcm9jX2V4aXQodm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeSgiZXBzIiwgcHJvY19uZXRfc2N0cCk7Cit9CisKKy8qIERpc3BsYXkgc2N0cCBhc3NvY2lhdGlvbnMgKC9wcm9jL25ldC9zY3RwL2Fzc29jcykuICovCitzdGF0aWMgaW50IHNjdHBfYXNzb2NzX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBzY3RwX2hhc2hidWNrZXQgKmhlYWQ7CisJc3RydWN0IHNjdHBfZXBfY29tbW9uICplcGI7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzc29jOworCXN0cnVjdCBzb2NrICpzazsKKwlpbnQgaGFzaDsKKworCXNlcV9wcmludGYoc2VxLCAiIEFTU09DICAgICBTT0NLICAgU1RZIFNTVCBTVCBIQktUIExQT1JUIFJQT1JUICIKKwkJCSJMQUREUlMgPC0+IFJBRERSU1xuIik7CisJZm9yIChoYXNoID0gMDsgaGFzaCA8IHNjdHBfYXNzb2NfaGFzaHNpemU7IGhhc2grKykgeworCQloZWFkID0gJnNjdHBfYXNzb2NfaGFzaHRhYmxlW2hhc2hdOworCQlyZWFkX2xvY2soJmhlYWQtPmxvY2spOworCQlmb3IgKGVwYiA9IGhlYWQtPmNoYWluOyBlcGI7IGVwYiA9IGVwYi0+bmV4dCkgeworCQkJYXNzb2MgPSBzY3RwX2Fzc29jKGVwYik7CisJCQlzayA9IGVwYi0+c2s7CisJCQlzZXFfcHJpbnRmKHNlcSwKKwkJCQkgICAiJThwICU4cCAlLTNkICUtM2QgJS0yZCAlLTRkICUtNWQgJS01ZCAiLAorCQkJCSAgIGFzc29jLCBzaywgc2N0cF9zayhzayktPnR5cGUsIHNrLT5za19zdGF0ZSwKKwkJCQkgICBhc3NvYy0+c3RhdGUsIGhhc2gsIGVwYi0+YmluZF9hZGRyLnBvcnQsCisJCQkJICAgYXNzb2MtPnBlZXIucG9ydCk7CisJCQlzY3RwX3NlcV9kdW1wX2xvY2FsX2FkZHJzKHNlcSwgZXBiKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiPC0+ICIpOworCQkJc2N0cF9zZXFfZHVtcF9yZW1vdGVfYWRkcnMoc2VxLCBhc3NvYyk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CisJCX0KKwkJcmVhZF91bmxvY2soJmhlYWQtPmxvY2spOworCX0KKworCXJldHVybiAwOworfQorCisvKiBJbml0aWFsaXplIHRoZSBzZXEgZmlsZSBvcGVyYXRpb25zIGZvciAnYXNzb2NzJyBvYmplY3QuICovCitzdGF0aWMgaW50IHNjdHBfYXNzb2NzX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzY3RwX2Fzc29jc19zZXFfc2hvdywgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNjdHBfYXNzb2NzX3NlcV9mb3BzID0geworCS5vcGVuCSA9IHNjdHBfYXNzb2NzX3NlcV9vcGVuLAorCS5yZWFkCSA9IHNlcV9yZWFkLAorCS5sbHNlZWsJID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCisvKiBTZXQgdXAgdGhlIHByb2MgZnMgZW50cnkgZm9yICdhc3NvY3MnIG9iamVjdC4gKi8KK2ludCBfX2luaXQgc2N0cF9hc3NvY3NfcHJvY19pbml0KHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwOworCisJcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJhc3NvY3MiLCBTX0lSVUdPLCBwcm9jX25ldF9zY3RwKTsKKwlpZiAoIXApCisJCXJldHVybiAtRU5PTUVNOworCisJcC0+cHJvY19mb3BzID0gJnNjdHBfYXNzb2NzX3NlcV9mb3BzOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENsZWFudXAgdGhlIHByb2MgZnMgZW50cnkgZm9yICdhc3NvY3MnIG9iamVjdC4gKi8KK3ZvaWQgc2N0cF9hc3NvY3NfcHJvY19leGl0KHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoImFzc29jcyIsIHByb2NfbmV0X3NjdHApOworfQpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvcHJvdG9jb2wuYyBiL25ldC9zY3RwL3Byb3RvY29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk4MTNjZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY3RwL3Byb3RvY29sLmMKQEAgLTAsMCArMSwxMjQwIEBACisvKiBTQ1RQIGtlcm5lbCByZWZlcmVuY2UgSW1wbGVtZW50YXRpb24KKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDEsIDIwMDQKKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAwIENpc2NvLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSBNb3Rvcm9sYSwgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTm9raWEsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBMYSBNb250ZSBILlAuIFlhcnJvbGwKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgU0NUUCBrZXJuZWwgcmVmZXJlbmNlIEltcGxlbWVudGF0aW9uCisgKgorICogSW5pdGlhbGl6YXRpb24vY2xlYW51cCBmb3IgU0NUUCBwcm90b2NvbCBzdXBwb3J0LgorICoKKyAqIFRoZSBTQ1RQIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoZSBTQ1RQIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0CisgKiB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAqICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogUGxlYXNlIHNlbmQgYW55IGJ1ZyByZXBvcnRzIG9yIGZpeGVzIHlvdSBtYWtlIHRvIHRoZQorICogZW1haWwgYWRkcmVzcyhlcyk6CisgKiAgICBsa3NjdHAgZGV2ZWxvcGVycyA8bGtzY3RwLWRldmVsb3BlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIE9yIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHdlYnNpdGU6CisgKiAgICBodHRwOi8vd3d3LnNmLm5ldC9wcm9qZWN0cy9sa3NjdHAKKyAqCisgKiBXcml0dGVuIG9yIG1vZGlmaWVkIGJ5OgorICogICAgTGEgTW9udGUgSC5QLiBZYXJyb2xsIDxwaWdneUBhY20ub3JnPgorICogICAgS2FybCBLbnV0c29uIDxrYXJsQGF0aGVuYS5jaGljYWdvLmlsLnVzPgorICogICAgSm9uIEdyaW1tIDxqZ3JpbW1AdXMuaWJtLmNvbT4KKyAqICAgIFNyaWRoYXIgU2FtdWRyYWxhIDxzcmlAdXMuaWJtLmNvbT4KKyAqICAgIERhaXN5IENoYW5nIDxkYWlzeWNAdXMuaWJtLmNvbT4KKyAqICAgIEFyZGVsbGUgRmFuIDxhcmRlbGxlLmZhbkBpbnRlbC5jb20+CisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgZ2l2ZW4gdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvc2N0cC9zY3RwLmg+CisjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CisjaW5jbHVkZSA8bmV0L2luZXRfY29tbW9uLmg+CisjaW5jbHVkZSA8bmV0L2luZXRfZWNuLmg+CisKKy8qIEdsb2JhbCBkYXRhIHN0cnVjdHVyZXMuICovCitzdHJ1Y3Qgc2N0cF9nbG9iYWxzIHNjdHBfZ2xvYmFsczsKK3N0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqcHJvY19uZXRfc2N0cDsKK0RFRklORV9TTk1QX1NUQVQoc3RydWN0IHNjdHBfbWliLCBzY3RwX3N0YXRpc3RpY3MpOworCitzdHJ1Y3QgaWRyIHNjdHBfYXNzb2NzX2lkOworREVGSU5FX1NQSU5MT0NLKHNjdHBfYXNzb2NzX2lkX2xvY2spOworCisvKiBUaGlzIGlzIHRoZSBnbG9iYWwgc29ja2V0IGRhdGEgc3RydWN0dXJlIHVzZWQgZm9yIHJlc3BvbmRpbmcgdG8KKyAqIHRoZSBPdXQtb2YtdGhlLWJsdWUgKE9PVEIpIHBhY2tldHMuICBBIGNvbnRyb2wgc29jayB3aWxsIGJlIGNyZWF0ZWQKKyAqIGZvciB0aGlzIHNvY2tldCBhdCB0aGUgaW5pdGlhbGl6YXRpb24gdGltZS4KKyAqLworc3RhdGljIHN0cnVjdCBzb2NrZXQgKnNjdHBfY3RsX3NvY2tldDsKKworc3RhdGljIHN0cnVjdCBzY3RwX3BmICpzY3RwX3BmX2luZXQ2X3NwZWNpZmljOworc3RhdGljIHN0cnVjdCBzY3RwX3BmICpzY3RwX3BmX2luZXRfc3BlY2lmaWM7CitzdGF0aWMgc3RydWN0IHNjdHBfYWYgKnNjdHBfYWZfdjRfc3BlY2lmaWM7CitzdGF0aWMgc3RydWN0IHNjdHBfYWYgKnNjdHBfYWZfdjZfc3BlY2lmaWM7CisKK2ttZW1fY2FjaGVfdCAqc2N0cF9jaHVua19jYWNoZXA7CitrbWVtX2NhY2hlX3QgKnNjdHBfYnVja2V0X2NhY2hlcDsKKworZXh0ZXJuIGludCBzY3RwX3NubXBfcHJvY19pbml0KHZvaWQpOworZXh0ZXJuIGludCBzY3RwX3NubXBfcHJvY19leGl0KHZvaWQpOworZXh0ZXJuIGludCBzY3RwX2Vwc19wcm9jX2luaXQodm9pZCk7CitleHRlcm4gaW50IHNjdHBfZXBzX3Byb2NfZXhpdCh2b2lkKTsKK2V4dGVybiBpbnQgc2N0cF9hc3NvY3NfcHJvY19pbml0KHZvaWQpOworZXh0ZXJuIGludCBzY3RwX2Fzc29jc19wcm9jX2V4aXQodm9pZCk7CisKKy8qIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgY29udHJvbCBzb2NrLiAqLworc3RydWN0IHNvY2sgKnNjdHBfZ2V0X2N0bF9zb2NrKHZvaWQpCit7CisJcmV0dXJuIHNjdHBfY3RsX3NvY2tldC0+c2s7Cit9CisKKy8qIFNldCB1cCB0aGUgcHJvYyBmcyBlbnRyeSBmb3IgdGhlIFNDVFAgcHJvdG9jb2wuICovCitzdGF0aWMgX19pbml0IGludCBzY3RwX3Byb2NfaW5pdCh2b2lkKQoreworCWlmICghcHJvY19uZXRfc2N0cCkgeworCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudDsKKwkJZW50ID0gcHJvY19ta2RpcigibmV0L3NjdHAiLCBOVUxMKTsKKwkJaWYgKGVudCkgeworCQkJZW50LT5vd25lciA9IFRISVNfTU9EVUxFOworCQkJcHJvY19uZXRfc2N0cCA9IGVudDsKKwkJfSBlbHNlCisJCQlnb3RvIG91dF9ub21lbTsKKwl9CisKKwlpZiAoc2N0cF9zbm1wX3Byb2NfaW5pdCgpKQorCQlnb3RvIG91dF9ub21lbTsJCisJaWYgKHNjdHBfZXBzX3Byb2NfaW5pdCgpKQorCQlnb3RvIG91dF9ub21lbTsJCisJaWYgKHNjdHBfYXNzb2NzX3Byb2NfaW5pdCgpKQorCQlnb3RvIG91dF9ub21lbTsJCisKKwlyZXR1cm4gMDsKKworb3V0X25vbWVtOgorCXJldHVybiAtRU5PTUVNOworfQorCisvKiBDbGVhbiB1cCB0aGUgcHJvYyBmcyBlbnRyeSBmb3IgdGhlIFNDVFAgcHJvdG9jb2wuIAorICogTm90ZTogRG8gbm90IG1ha2UgdGhpcyBfX2V4aXQgYXMgaXQgaXMgdXNlZCBpbiB0aGUgaW5pdCBlcnJvcgorICogcGF0aC4KKyAqLworc3RhdGljIHZvaWQgc2N0cF9wcm9jX2V4aXQodm9pZCkKK3sKKwlzY3RwX3NubXBfcHJvY19leGl0KCk7CisJc2N0cF9lcHNfcHJvY19leGl0KCk7CisJc2N0cF9hc3NvY3NfcHJvY19leGl0KCk7CisKKwlpZiAocHJvY19uZXRfc2N0cCkgeworCQlwcm9jX25ldF9zY3RwID0gTlVMTDsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoIm5ldC9zY3RwIiwgTlVMTCk7CisJfQorfQorCisvKiBQcml2YXRlIGhlbHBlciB0byBleHRyYWN0IGlwdjQgYWRkcmVzcyBhbmQgc3Rhc2ggdGhlbSBpbgorICogdGhlIHByb3RvY29sIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQgc2N0cF92NF9jb3B5X2FkZHJsaXN0KHN0cnVjdCBsaXN0X2hlYWQgKmFkZHJsaXN0LAorCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisJc3RydWN0IGluX2lmYWRkciAqaWZhOworCXN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5ICphZGRyOworCisJcmN1X3JlYWRfbG9jaygpOworCWlmICgoaW5fZGV2ID0gX19pbl9kZXZfZ2V0KGRldikpID09IE5VTEwpIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGlmYSA9IGluX2Rldi0+aWZhX2xpc3Q7IGlmYTsgaWZhID0gaWZhLT5pZmFfbmV4dCkgeworCQkvKiBBZGQgdGhlIGFkZHJlc3MgdG8gdGhlIGxvY2FsIGxpc3QuICAqLworCQlhZGRyID0gdF9uZXcoc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnksIEdGUF9BVE9NSUMpOworCQlpZiAoYWRkcikgeworCQkJYWRkci0+YS52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJCWFkZHItPmEudjQuc2luX3BvcnQgPSAwOworCQkJYWRkci0+YS52NC5zaW5fYWRkci5zX2FkZHIgPSBpZmEtPmlmYV9sb2NhbDsKKwkJCWxpc3RfYWRkX3RhaWwoJmFkZHItPmxpc3QsIGFkZHJsaXN0KTsKKwkJfQorCX0KKworCXJjdV9yZWFkX3VubG9jaygpOworfQorCisvKiBFeHRyYWN0IG91ciBJUCBhZGRyZXNzZXMgZnJvbSB0aGUgc3lzdGVtIGFuZCBzdGFzaCB0aGVtIGluIHRoZQorICogcHJvdG9jb2wgc3RydWN0dXJlLgorICovCitzdGF0aWMgdm9pZCBfX3NjdHBfZ2V0X2xvY2FsX2FkZHJfbGlzdCh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCXN0cnVjdCBzY3RwX2FmICphZjsKKworCXJlYWRfbG9jaygmZGV2X2Jhc2VfbG9jayk7CisJZm9yIChkZXYgPSBkZXZfYmFzZTsgZGV2OyBkZXYgPSBkZXYtPm5leHQpIHsKKwkJX19saXN0X2Zvcl9lYWNoKHBvcywgJnNjdHBfYWRkcmVzc19mYW1pbGllcykgeworCQkJYWYgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHNjdHBfYWYsIGxpc3QpOworCQkJYWYtPmNvcHlfYWRkcmxpc3QoJnNjdHBfbG9jYWxfYWRkcl9saXN0LCBkZXYpOworCQl9CisJfQorCXJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgc2N0cF9nZXRfbG9jYWxfYWRkcl9saXN0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNjdHBfc3Bpbl9sb2NrX2lycXNhdmUoJnNjdHBfbG9jYWxfYWRkcl9sb2NrLCBmbGFncyk7CisJX19zY3RwX2dldF9sb2NhbF9hZGRyX2xpc3QoKTsKKwlzY3RwX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjdHBfbG9jYWxfYWRkcl9sb2NrLCBmbGFncyk7Cit9CisKKy8qIEZyZWUgdGhlIGV4aXN0aW5nIGxvY2FsIGFkZHJlc3Nlcy4gICovCitzdGF0aWMgdm9pZCBfX3NjdHBfZnJlZV9sb2NhbF9hZGRyX2xpc3Qodm9pZCkKK3sKKwlzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSAqYWRkcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICp0ZW1wOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdGVtcCwgJnNjdHBfbG9jYWxfYWRkcl9saXN0KSB7CisJCWFkZHIgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnksIGxpc3QpOworCQlsaXN0X2RlbChwb3MpOworCQlrZnJlZShhZGRyKTsKKwl9Cit9CisKKy8qIEZyZWUgdGhlIGV4aXN0aW5nIGxvY2FsIGFkZHJlc3Nlcy4gICovCitzdGF0aWMgdm9pZCBzY3RwX2ZyZWVfbG9jYWxfYWRkcl9saXN0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNjdHBfc3Bpbl9sb2NrX2lycXNhdmUoJnNjdHBfbG9jYWxfYWRkcl9sb2NrLCBmbGFncyk7CisJX19zY3RwX2ZyZWVfbG9jYWxfYWRkcl9saXN0KCk7CisJc2N0cF9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY3RwX2xvY2FsX2FkZHJfbG9jaywgZmxhZ3MpOworfQorCisvKiBDb3B5IHRoZSBsb2NhbCBhZGRyZXNzZXMgd2hpY2ggYXJlIHZhbGlkIGZvciAnc2NvcGUnIGludG8gJ2JwJy4gICovCitpbnQgc2N0cF9jb3B5X2xvY2FsX2FkZHJfbGlzdChzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKmJwLCBzY3RwX3Njb3BlX3Qgc2NvcGUsCisJCQkgICAgICBpbnQgZ2ZwLCBpbnQgY29weV9mbGFncykKK3sKKwlzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSAqYWRkcjsKKwlpbnQgZXJyb3IgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2N0cF9zcGluX2xvY2tfaXJxc2F2ZSgmc2N0cF9sb2NhbF9hZGRyX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJnNjdHBfbG9jYWxfYWRkcl9saXN0KSB7CisJCWFkZHIgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnksIGxpc3QpOworCQlpZiAoc2N0cF9pbl9zY29wZSgmYWRkci0+YSwgc2NvcGUpKSB7CisJCQkvKiBOb3cgdGhhdCB0aGUgYWRkcmVzcyBpcyBpbiBzY29wZSwgY2hlY2sgdG8gc2VlIGlmCisJCQkgKiB0aGUgYWRkcmVzcyB0eXBlIGlzIHJlYWxseSBzdXBwb3J0ZWQgYnkgdGhlIGxvY2FsCisJCQkgKiBzb2NrIGFzIHdlbGwgYXMgdGhlIHJlbW90ZSBwZWVyLgorCQkJICovCisJCQlpZiAoKCgoQUZfSU5FVCA9PSBhZGRyLT5hLnNhLnNhX2ZhbWlseSkgJiYKKwkJCSAgICAgIChjb3B5X2ZsYWdzICYgU0NUUF9BRERSNF9QRUVSU1VQUCkpKSB8fAorCQkJICAgICgoKEFGX0lORVQ2ID09IGFkZHItPmEuc2Euc2FfZmFtaWx5KSAmJgorCQkJICAgICAgKGNvcHlfZmxhZ3MgJiBTQ1RQX0FERFI2X0FMTE9XRUQpICYmCisJCQkgICAgICAoY29weV9mbGFncyAmIFNDVFBfQUREUjZfUEVFUlNVUFApKSkpIHsKKwkJCQllcnJvciA9IHNjdHBfYWRkX2JpbmRfYWRkcihicCwgJmFkZHItPmEsIAorCQkJCQkJCSAgIEdGUF9BVE9NSUMpOworCQkJCWlmIChlcnJvcikKKwkJCQkJZ290byBlbmRfY29weTsKKwkJCX0KKwkJfQorCX0KKworZW5kX2NvcHk6CisJc2N0cF9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY3RwX2xvY2FsX2FkZHJfbG9jaywgZmxhZ3MpOworCXJldHVybiBlcnJvcjsKK30KKworLyogSW5pdGlhbGl6ZSBhIHNjdHBfYWRkciBmcm9tIGluIGluY29taW5nIHNrYi4gICovCitzdGF0aWMgdm9pZCBzY3RwX3Y0X2Zyb21fc2tiKHVuaW9uIHNjdHBfYWRkciAqYWRkciwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgaW50IGlzX3NhZGRyKQoreworCXZvaWQgKmZyb207CisJX191MTYgKnBvcnQ7CisJc3RydWN0IHNjdHBoZHIgKnNoOworCisJcG9ydCA9ICZhZGRyLT52NC5zaW5fcG9ydDsKKwlhZGRyLT52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKworCXNoID0gKHN0cnVjdCBzY3RwaGRyICopIHNrYi0+aC5yYXc7CisJaWYgKGlzX3NhZGRyKSB7CisJCSpwb3J0ICA9IG50b2hzKHNoLT5zb3VyY2UpOworCQlmcm9tID0gJnNrYi0+bmguaXBoLT5zYWRkcjsKKwl9IGVsc2UgeworCQkqcG9ydCA9IG50b2hzKHNoLT5kZXN0KTsKKwkJZnJvbSA9ICZza2ItPm5oLmlwaC0+ZGFkZHI7CisJfQorCW1lbWNweSgmYWRkci0+djQuc2luX2FkZHIuc19hZGRyLCBmcm9tLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKK30KKworLyogSW5pdGlhbGl6ZSBhbiBzY3RwX2FkZHIgZnJvbSBhIHNvY2tldC4gKi8KK3N0YXRpYyB2b2lkIHNjdHBfdjRfZnJvbV9zayh1bmlvbiBzY3RwX2FkZHIgKmFkZHIsIHN0cnVjdCBzb2NrICpzaykKK3sKKwlhZGRyLT52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlhZGRyLT52NC5zaW5fcG9ydCA9IGluZXRfc2soc2spLT5udW07CisJYWRkci0+djQuc2luX2FkZHIuc19hZGRyID0gaW5ldF9zayhzayktPnJjdl9zYWRkcjsKK30KKworLyogSW5pdGlhbGl6ZSBzay0+c2tfcmN2X3NhZGRyIGZyb20gc2N0cF9hZGRyLiAqLworc3RhdGljIHZvaWQgc2N0cF92NF90b19za19zYWRkcih1bmlvbiBzY3RwX2FkZHIgKmFkZHIsIHN0cnVjdCBzb2NrICpzaykKK3sKKwlpbmV0X3NrKHNrKS0+cmN2X3NhZGRyID0gYWRkci0+djQuc2luX2FkZHIuc19hZGRyOworfQorCisvKiBJbml0aWFsaXplIHNrLT5za19kYWRkciBmcm9tIHNjdHBfYWRkci4gKi8KK3N0YXRpYyB2b2lkIHNjdHBfdjRfdG9fc2tfZGFkZHIodW5pb24gc2N0cF9hZGRyICphZGRyLCBzdHJ1Y3Qgc29jayAqc2spCit7CisJaW5ldF9zayhzayktPmRhZGRyID0gYWRkci0+djQuc2luX2FkZHIuc19hZGRyOworfQorCisvKiBJbml0aWFsaXplIGEgc2N0cF9hZGRyIGZyb20gYW4gYWRkcmVzcyBwYXJhbWV0ZXIuICovCitzdGF0aWMgdm9pZCBzY3RwX3Y0X2Zyb21fYWRkcl9wYXJhbSh1bmlvbiBzY3RwX2FkZHIgKmFkZHIsCisJCQkJICAgIHVuaW9uIHNjdHBfYWRkcl9wYXJhbSAqcGFyYW0sCisJCQkJICAgIF9fdTE2IHBvcnQsIGludCBpaWYpCit7CisJYWRkci0+djQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJYWRkci0+djQuc2luX3BvcnQgPSBwb3J0OworCWFkZHItPnY0LnNpbl9hZGRyLnNfYWRkciA9IHBhcmFtLT52NC5hZGRyLnNfYWRkcjsKK30KKworLyogSW5pdGlhbGl6ZSBhbiBhZGRyZXNzIHBhcmFtZXRlciBmcm9tIGEgc2N0cF9hZGRyIGFuZCByZXR1cm4gdGhlIGxlbmd0aAorICogb2YgdGhlIGFkZHJlc3MgcGFyYW1ldGVyLgorICovCitzdGF0aWMgaW50IHNjdHBfdjRfdG9fYWRkcl9wYXJhbShjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIsCisJCQkJIHVuaW9uIHNjdHBfYWRkcl9wYXJhbSAqcGFyYW0pCit7CisJaW50IGxlbmd0aCA9IHNpemVvZihzY3RwX2lwdjRhZGRyX3BhcmFtX3QpOworCisJcGFyYW0tPnY0LnBhcmFtX2hkci50eXBlID0gU0NUUF9QQVJBTV9JUFY0X0FERFJFU1M7CisJcGFyYW0tPnY0LnBhcmFtX2hkci5sZW5ndGggPSBudG9ocyhsZW5ndGgpOworCXBhcmFtLT52NC5hZGRyLnNfYWRkciA9IGFkZHItPnY0LnNpbl9hZGRyLnNfYWRkcjsJCisKKwlyZXR1cm4gbGVuZ3RoOworfQorCisvKiBJbml0aWFsaXplIGEgc2N0cF9hZGRyIGZyb20gYSBkc3RfZW50cnkuICovCitzdGF0aWMgdm9pZCBzY3RwX3Y0X2RzdF9zYWRkcih1bmlvbiBzY3RwX2FkZHIgKnNhZGRyLCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsCisJCQkgICAgICB1bnNpZ25lZCBzaG9ydCBwb3J0KQoreworCXN0cnVjdCBydGFibGUgKnJ0ID0gKHN0cnVjdCBydGFibGUgKilkc3Q7CisJc2FkZHItPnY0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNhZGRyLT52NC5zaW5fcG9ydCA9IHBvcnQ7CisJc2FkZHItPnY0LnNpbl9hZGRyLnNfYWRkciA9IHJ0LT5ydF9zcmM7Cit9CisKKy8qIENvbXBhcmUgdHdvIGFkZHJlc3NlcyBleGFjdGx5LiAqLworc3RhdGljIGludCBzY3RwX3Y0X2NtcF9hZGRyKGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqYWRkcjEsCisJCQkgICAgY29uc3QgdW5pb24gc2N0cF9hZGRyICphZGRyMikKK3sKKwlpZiAoYWRkcjEtPnNhLnNhX2ZhbWlseSAhPSBhZGRyMi0+c2Euc2FfZmFtaWx5KQorCQlyZXR1cm4gMDsKKwlpZiAoYWRkcjEtPnY0LnNpbl9wb3J0ICE9IGFkZHIyLT52NC5zaW5fcG9ydCkKKwkJcmV0dXJuIDA7CisJaWYgKGFkZHIxLT52NC5zaW5fYWRkci5zX2FkZHIgIT0gYWRkcjItPnY0LnNpbl9hZGRyLnNfYWRkcikKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworLyogSW5pdGlhbGl6ZSBhZGRyIHN0cnVjdCB0byBJTkFERFJfQU5ZLiAqLworc3RhdGljIHZvaWQgc2N0cF92NF9pbmFkZHJfYW55KHVuaW9uIHNjdHBfYWRkciAqYWRkciwgdW5zaWduZWQgc2hvcnQgcG9ydCkKK3sKKwlhZGRyLT52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlhZGRyLT52NC5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworCWFkZHItPnY0LnNpbl9wb3J0ID0gcG9ydDsKK30KKworLyogSXMgdGhpcyBhIHdpbGRjYXJkIGFkZHJlc3M/ICovCitzdGF0aWMgaW50IHNjdHBfdjRfaXNfYW55KGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqYWRkcikKK3sKKwlyZXR1cm4gSU5BRERSX0FOWSA9PSBhZGRyLT52NC5zaW5fYWRkci5zX2FkZHI7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBhZGRyZXNzIGlzIGEgdmFsaWQgYWRkcmVzcyB0byBiZSB1c2VkIGZvcgorICogU0NUUCBiaW5kaW5nLgorICoKKyAqIE91dHB1dDoKKyAqIFJldHVybiAwIC0gSWYgdGhlIGFkZHJlc3MgaXMgYSBub24tdW5pY2FzdCBvciBhbiBpbGxlZ2FsIGFkZHJlc3MuCisgKiBSZXR1cm4gMSAtIElmIHRoZSBhZGRyZXNzIGlzIGEgdW5pY2FzdC4KKyAqLworc3RhdGljIGludCBzY3RwX3Y0X2FkZHJfdmFsaWQodW5pb24gc2N0cF9hZGRyICphZGRyLCBzdHJ1Y3Qgc2N0cF9zb2NrICpzcCkKK3sKKwkvKiBJcyB0aGlzIGEgbm9uLXVuaWNhc3QgYWRkcmVzcyBvciBhIHVudXNhYmxlIFNDVFAgYWRkcmVzcz8gKi8KKwlpZiAoSVNfSVBWNF9VTlVTQUJMRV9BRERSRVNTKCZhZGRyLT52NC5zaW5fYWRkci5zX2FkZHIpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisvKiBTaG91bGQgdGhpcyBiZSBhdmFpbGFibGUgZm9yIGJpbmRpbmc/ICAgKi8KK3N0YXRpYyBpbnQgc2N0cF92NF9hdmFpbGFibGUodW5pb24gc2N0cF9hZGRyICphZGRyLCBzdHJ1Y3Qgc2N0cF9zb2NrICpzcCkKK3sKKwlpbnQgcmV0ID0gaW5ldF9hZGRyX3R5cGUoYWRkci0+djQuc2luX2FkZHIuc19hZGRyKTsKKworCS8qIEZJWE1FOiBpcF9ub25sb2NhbF9iaW5kIHN5c2N0bCBzdXBwb3J0LiAqLworCisJaWYgKGFkZHItPnY0LnNpbl9hZGRyLnNfYWRkciAhPSBJTkFERFJfQU5ZICYmIHJldCAhPSBSVE5fTE9DQUwpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKiBDaGVja2luZyB0aGUgbG9vcGJhY2ssIHByaXZhdGUgYW5kIG90aGVyIGFkZHJlc3Mgc2NvcGVzIGFzIGRlZmluZWQgaW4KKyAqIFJGQyAxOTE4LiAgIFRoZSBJUHY0IHNjb3BpbmcgaXMgYmFzZWQgb24gdGhlIGRyYWZ0IGZvciBTQ1RQIElQdjQKKyAqIHNjb3BpbmcgPGRyYWZ0LXN0ZXdhcnQtdHN2d2ctc2N0cC1pcHY0LTAwLnR4dD4uCisgKgorICogTGV2ZWwgMCAtIHVudXNhYmxlIFNDVFAgYWRkcmVzc2VzCisgKiBMZXZlbCAxIC0gbG9vcGJhY2sgYWRkcmVzcworICogTGV2ZWwgMiAtIGxpbmstbG9jYWwgYWRkcmVzc2VzCisgKiBMZXZlbCAzIC0gcHJpdmF0ZSBhZGRyZXNzZXMuCisgKiBMZXZlbCA0IC0gZ2xvYmFsIGFkZHJlc3NlcworICogRm9yIElOSVQgYW5kIElOSVQtQUNLIGFkZHJlc3MgbGlzdCwgbGV0IEwgYmUgdGhlIGxldmVsIG9mCisgKiBvZiByZXF1ZXN0ZWQgZGVzdGluYXRpb24gYWRkcmVzcywgc2VuZGVyIGFuZCByZWNlaXZlcgorICogU0hPVUxEIGluY2x1ZGUgYWxsIG9mIGl0cyBhZGRyZXNzZXMgd2l0aCBsZXZlbCBncmVhdGVyCisgKiB0aGFuIG9yIGVxdWFsIHRvIEwuCisgKi8KK3N0YXRpYyBzY3RwX3Njb3BlX3Qgc2N0cF92NF9zY29wZSh1bmlvbiBzY3RwX2FkZHIgKmFkZHIpCit7CisJc2N0cF9zY29wZV90IHJldHZhbDsKKworCS8qIFNob3VsZCBJUHY0IHNjb3BpbmcgYmUgYSBzeXNjdGwgY29uZmlndXJhYmxlIG9wdGlvbgorCSAqIHNvIHVzZXJzIGNhbiB0dXJuIGl0IG9mZiAoZGVmYXVsdCBvbikgZm9yIGNlcnRhaW4KKwkgKiB1bmNvbnZlbnRpb25hbCBuZXR3b3JraW5nIGVudmlyb25tZW50cz8KKwkgKi8KKworCS8qIENoZWNrIGZvciB1bnVzYWJsZSBTQ1RQIGFkZHJlc3Nlcy4gKi8KKwlpZiAoSVNfSVBWNF9VTlVTQUJMRV9BRERSRVNTKCZhZGRyLT52NC5zaW5fYWRkci5zX2FkZHIpKSB7CisJCXJldHZhbCA9ICBTQ1RQX1NDT1BFX1VOVVNBQkxFOworCX0gZWxzZSBpZiAoTE9PUEJBQ0soYWRkci0+djQuc2luX2FkZHIuc19hZGRyKSkgeworCQlyZXR2YWwgPSBTQ1RQX1NDT1BFX0xPT1BCQUNLOworCX0gZWxzZSBpZiAoSVNfSVBWNF9MSU5LX0FERFJFU1MoJmFkZHItPnY0LnNpbl9hZGRyLnNfYWRkcikpIHsKKwkJcmV0dmFsID0gU0NUUF9TQ09QRV9MSU5LOworCX0gZWxzZSBpZiAoSVNfSVBWNF9QUklWQVRFX0FERFJFU1MoJmFkZHItPnY0LnNpbl9hZGRyLnNfYWRkcikpIHsKKwkJcmV0dmFsID0gU0NUUF9TQ09QRV9QUklWQVRFOworCX0gZWxzZSB7CisJCXJldHZhbCA9IFNDVFBfU0NPUEVfR0xPQkFMOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIFJldHVybnMgYSB2YWxpZCBkc3QgY2FjaGUgZW50cnkgZm9yIHRoZSBnaXZlbiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGlwCisgKiBhZGRyZXNzZXMuIElmIGFuIGFzc29jaWF0aW9uIGlzIHBhc3NlZCwgdHJ5cyB0byBnZXQgYSBkc3QgZW50cnkgd2l0aCBhCisgKiBzb3VyY2UgYWRkcmVzcyB0aGF0IG1hdGNoZXMgYW4gYWRkcmVzcyBpbiB0aGUgYmluZCBhZGRyZXNzIGxpc3QuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZHN0X2VudHJ5ICpzY3RwX3Y0X2dldF9kc3Qoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJCSB1bmlvbiBzY3RwX2FkZHIgKmRhZGRyLAorCQkJCQkgdW5pb24gc2N0cF9hZGRyICpzYWRkcikKK3sKKwlzdHJ1Y3QgcnRhYmxlICpydDsKKwlzdHJ1Y3QgZmxvd2kgZmw7CisJc3RydWN0IHNjdHBfYmluZF9hZGRyICpicDsKKwlyd2xvY2tfdCAqYWRkcl9sb2NrOworCXN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5ICpsYWRkcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gTlVMTDsKKwl1bmlvbiBzY3RwX2FkZHIgZHN0X3NhZGRyOworCisJbWVtc2V0KCZmbCwgMHgwLCBzaXplb2Yoc3RydWN0IGZsb3dpKSk7CisJZmwuZmw0X2RzdCAgPSBkYWRkci0+djQuc2luX2FkZHIuc19hZGRyOworCWZsLnByb3RvID0gSVBQUk9UT19TQ1RQOworCWlmIChhc29jKSB7CisJCWZsLmZsNF90b3MgPSBSVF9DT05OX0ZMQUdTKGFzb2MtPmJhc2Uuc2spOworCQlmbC5vaWYgPSBhc29jLT5iYXNlLnNrLT5za19ib3VuZF9kZXZfaWY7CisJfQorCWlmIChzYWRkcikKKwkJZmwuZmw0X3NyYyA9IHNhZGRyLT52NC5zaW5fYWRkci5zX2FkZHI7CisKKwlTQ1RQX0RFQlVHX1BSSU5USygiJXM6IERTVDoldS4ldS4ldS4ldSwgU1JDOiV1LiV1LiV1LiV1IC0gIiwKKwkJCSAgX19GVU5DVElPTl9fLCBOSVBRVUFEKGZsLmZsNF9kc3QpLAorCQkJICBOSVBRVUFEKGZsLmZsNF9zcmMpKTsKKworCWlmICghaXBfcm91dGVfb3V0cHV0X2tleSgmcnQsICZmbCkpIHsKKwkJZHN0ID0gJnJ0LT51LmRzdDsKKwl9CisKKwkvKiBJZiB0aGVyZSBpcyBubyBhc3NvY2lhdGlvbiBvciBpZiBhIHNvdXJjZSBhZGRyZXNzIGlzIHBhc3NlZCwgbm8KKwkgKiBtb3JlIHZhbGlkYXRpb24gaXMgcmVxdWlyZWQuCisJICovCisJaWYgKCFhc29jIHx8IHNhZGRyKQorCQlnb3RvIG91dDsKKworCWJwID0gJmFzb2MtPmJhc2UuYmluZF9hZGRyOworCWFkZHJfbG9jayA9ICZhc29jLT5iYXNlLmFkZHJfbG9jazsKKworCWlmIChkc3QpIHsKKwkJLyogV2FsayB0aHJvdWdoIHRoZSBiaW5kIGFkZHJlc3MgbGlzdCBhbmQgbG9vayBmb3IgYSBiaW5kCisJCSAqIGFkZHJlc3MgdGhhdCBtYXRjaGVzIHRoZSBzb3VyY2UgYWRkcmVzcyBvZiB0aGUgcmV0dXJuZWQgZHN0LgorCQkgKi8KKwkJc2N0cF9yZWFkX2xvY2soYWRkcl9sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaChwb3MsICZicC0+YWRkcmVzc19saXN0KSB7CisJCQlsYWRkciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSwKKwkJCQkJICAgbGlzdCk7CisJCQlzY3RwX3Y0X2RzdF9zYWRkcigmZHN0X3NhZGRyLCBkc3QsIGJwLT5wb3J0KTsKKwkJCWlmIChzY3RwX3Y0X2NtcF9hZGRyKCZkc3Rfc2FkZHIsICZsYWRkci0+YSkpCisJCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisJCXNjdHBfcmVhZF91bmxvY2soYWRkcl9sb2NrKTsKKworCQkvKiBOb25lIG9mIHRoZSBib3VuZCBhZGRyZXNzZXMgbWF0Y2ggdGhlIHNvdXJjZSBhZGRyZXNzIG9mIHRoZQorCQkgKiBkc3QuIFNvIHJlbGVhc2UgaXQuCisJCSAqLworCQlkc3RfcmVsZWFzZShkc3QpOworCQlkc3QgPSBOVUxMOworCX0KKworCS8qIFdhbGsgdGhyb3VnaCB0aGUgYmluZCBhZGRyZXNzIGxpc3QgYW5kIHRyeSB0byBnZXQgYSBkc3QgdGhhdAorCSAqIG1hdGNoZXMgYSBiaW5kIGFkZHJlc3MgYXMgdGhlIHNvdXJjZSBhZGRyZXNzLgorCSAqLworCXNjdHBfcmVhZF9sb2NrKGFkZHJfbG9jayk7CisJbGlzdF9mb3JfZWFjaChwb3MsICZicC0+YWRkcmVzc19saXN0KSB7CisJCWxhZGRyID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5LCBsaXN0KTsKKworCQlpZiAoQUZfSU5FVCA9PSBsYWRkci0+YS5zYS5zYV9mYW1pbHkpIHsKKwkJCWZsLmZsNF9zcmMgPSBsYWRkci0+YS52NC5zaW5fYWRkci5zX2FkZHI7CisJCQlpZiAoIWlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpKSB7CisJCQkJZHN0ID0gJnJ0LT51LmRzdDsKKwkJCQlnb3RvIG91dF91bmxvY2s7CisJCQl9CisJCX0KKwl9CisKK291dF91bmxvY2s6CisJc2N0cF9yZWFkX3VubG9jayhhZGRyX2xvY2spOworb3V0OgorCWlmIChkc3QpCisJCVNDVFBfREVCVUdfUFJJTlRLKCJydF9kc3Q6JXUuJXUuJXUuJXUsIHJ0X3NyYzoldS4ldS4ldS4ldVxuIiwKKwkJCSAgCSAgTklQUVVBRChydC0+cnRfZHN0KSwgTklQUVVBRChydC0+cnRfc3JjKSk7CisJZWxzZQorCQlTQ1RQX0RFQlVHX1BSSU5USygiTk8gUk9VVEVcbiIpOworCisJcmV0dXJuIGRzdDsKK30KKworLyogRm9yIHY0LCB0aGUgc291cmNlIGFkZHJlc3MgaXMgY2FjaGVkIGluIHRoZSByb3V0ZSBlbnRyeShkc3QpLiBTbyBubyBuZWVkCisgKiB0byBjYWNoZSBpdCBzZXBhcmF0ZWx5IGFuZCBoZW5jZSB0aGlzIGlzIGFuIGVtcHR5IHJvdXRpbmUuCisgKi8KK3N0YXRpYyB2b2lkIHNjdHBfdjRfZ2V0X3NhZGRyKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJICAgICAgc3RydWN0IGRzdF9lbnRyeSAqZHN0LAorCQkJICAgICAgdW5pb24gc2N0cF9hZGRyICpkYWRkciwKKwkJCSAgICAgIHVuaW9uIHNjdHBfYWRkciAqc2FkZHIpCit7CisJc3RydWN0IHJ0YWJsZSAqcnQgPSAoc3RydWN0IHJ0YWJsZSAqKWRzdDsKKworCWlmIChydCkgeworCQlzYWRkci0+djQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCXNhZGRyLT52NC5zaW5fcG9ydCA9IGFzb2MtPmJhc2UuYmluZF9hZGRyLnBvcnQ7ICAKKwkJc2FkZHItPnY0LnNpbl9hZGRyLnNfYWRkciA9IHJ0LT5ydF9zcmM7IAorCX0KK30KKworLyogV2hhdCBpbnRlcmZhY2UgZGlkIHRoaXMgc2tiIGFycml2ZSBvbj8gKi8KK3N0YXRpYyBpbnQgc2N0cF92NF9za2JfaWlmKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisgICAgIAlyZXR1cm4gKChzdHJ1Y3QgcnRhYmxlICopc2tiLT5kc3QpLT5ydF9paWY7Cit9CisKKy8qIFdhcyB0aGlzIHBhY2tldCBtYXJrZWQgYnkgRXhwbGljaXQgQ29uZ2VzdGlvbiBOb3RpZmljYXRpb24/ICovCitzdGF0aWMgaW50IHNjdHBfdjRfaXNfY2UoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gSU5FVF9FQ05faXNfY2Uoc2tiLT5uaC5pcGgtPnRvcyk7Cit9CisKKy8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBzayBmb3IgdGhlIHNvY2tldCByZXR1cm5lZCBieSBhY2NlcHQoKS4gKi8KK3N0YXRpYyBzdHJ1Y3Qgc29jayAqc2N0cF92NF9jcmVhdGVfYWNjZXB0X3NrKHN0cnVjdCBzb2NrICpzaywKKwkJCQkJICAgICBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYykKK3sKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisJc3RydWN0IGluZXRfc29jayAqbmV3aW5ldDsKKwlzdHJ1Y3Qgc29jayAqbmV3c2sgPSBza19hbGxvYyhQRl9JTkVULCBHRlBfS0VSTkVMLCBzay0+c2tfcHJvdCwgMSk7CisKKwlpZiAoIW5ld3NrKQorCQlnb3RvIG91dDsKKworCXNvY2tfaW5pdF9kYXRhKE5VTEwsIG5ld3NrKTsKKworCW5ld3NrLT5za190eXBlID0gU09DS19TVFJFQU07CisKKwluZXdzay0+c2tfbm9fY2hlY2sgPSBzay0+c2tfbm9fY2hlY2s7CisJbmV3c2stPnNrX3JldXNlID0gc2stPnNrX3JldXNlOworCW5ld3NrLT5za19zaHV0ZG93biA9IHNrLT5za19zaHV0ZG93bjsKKworCW5ld3NrLT5za19kZXN0cnVjdCA9IGluZXRfc29ja19kZXN0cnVjdDsKKwluZXdzay0+c2tfZmFtaWx5ID0gUEZfSU5FVDsKKwluZXdzay0+c2tfcHJvdG9jb2wgPSBJUFBST1RPX1NDVFA7CisJbmV3c2stPnNrX2JhY2tsb2dfcmN2ID0gc2stPnNrX3Byb3QtPmJhY2tsb2dfcmN2OworCXNvY2tfcmVzZXRfZmxhZyhuZXdzaywgU09DS19aQVBQRUQpOworCisJbmV3aW5ldCA9IGluZXRfc2sobmV3c2spOworCisJLyogSW5pdGlhbGl6ZSBzaydzIHNwb3J0LCBkcG9ydCwgcmN2X3NhZGRyIGFuZCBkYWRkciBmb3IKKwkgKiBnZXRzb2NrbmFtZSgpIGFuZCBnZXRwZWVybmFtZSgpCisJICovCisJbmV3aW5ldC0+c3BvcnQgPSBpbmV0LT5zcG9ydDsKKwluZXdpbmV0LT5zYWRkciA9IGluZXQtPnNhZGRyOworCW5ld2luZXQtPnJjdl9zYWRkciA9IGluZXQtPnJjdl9zYWRkcjsKKwluZXdpbmV0LT5kcG9ydCA9IGh0b25zKGFzb2MtPnBlZXIucG9ydCk7CisJbmV3aW5ldC0+ZGFkZHIgPSBhc29jLT5wZWVyLnByaW1hcnlfYWRkci52NC5zaW5fYWRkci5zX2FkZHI7CisJbmV3aW5ldC0+cG10dWRpc2MgPSBpbmV0LT5wbXR1ZGlzYzsKKyAgICAgIAluZXdpbmV0LT5pZCA9IDA7CisKKwluZXdpbmV0LT51Y190dGwgPSAtMTsKKwluZXdpbmV0LT5tY19sb29wID0gMTsKKwluZXdpbmV0LT5tY190dGwgPSAxOworCW5ld2luZXQtPm1jX2luZGV4ID0gMDsKKwluZXdpbmV0LT5tY19saXN0ID0gTlVMTDsKKworI2lmZGVmIElORVRfUkVGQ05UX0RFQlVHCisJYXRvbWljX2luYygmaW5ldF9zb2NrX25yKTsKKyNlbmRpZgorCisJaWYgKG5ld3NrLT5za19wcm90LT5pbml0KG5ld3NrKSkgeworCQlza19jb21tb25fcmVsZWFzZShuZXdzayk7CisJCW5ld3NrID0gTlVMTDsKKwl9CisKK291dDoKKwlyZXR1cm4gbmV3c2s7Cit9CisKKy8qIE1hcCBhZGRyZXNzLCBlbXB0eSBmb3IgdjQgZmFtaWx5ICovCitzdGF0aWMgdm9pZCBzY3RwX3Y0X2FkZHJfdjRtYXAoc3RydWN0IHNjdHBfc29jayAqc3AsIHVuaW9uIHNjdHBfYWRkciAqYWRkcikKK3sKKwkvKiBFbXB0eSAqLworfQorCisvKiBEdW1wIHRoZSB2NCBhZGRyIHRvIHRoZSBzZXEgZmlsZS4gKi8KK3N0YXRpYyB2b2lkIHNjdHBfdjRfc2VxX2R1bXBfYWRkcihzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdW5pb24gc2N0cF9hZGRyICphZGRyKQoreworCXNlcV9wcmludGYoc2VxLCAiJWQuJWQuJWQuJWQgIiwgTklQUVVBRChhZGRyLT52NC5zaW5fYWRkcikpOworfQorCisvKiBFdmVudCBoYW5kbGVyIGZvciBpbmV0IGFkZHJlc3MgYWRkaXRpb24vZGVsZXRpb24gZXZlbnRzLgorICogQmFzaWNhbGx5LCB3aGVuZXZlciB0aGVyZSBpcyBhbiBldmVudCwgd2UgcmUtYnVpbGQgb3VyIGxvY2FsIGFkZHJlc3MgbGlzdC4KKyAqLworaW50IHNjdHBfaW5ldGFkZHJfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcHRyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzY3RwX3NwaW5fbG9ja19pcnFzYXZlKCZzY3RwX2xvY2FsX2FkZHJfbG9jaywgZmxhZ3MpOworCV9fc2N0cF9mcmVlX2xvY2FsX2FkZHJfbGlzdCgpOworCV9fc2N0cF9nZXRfbG9jYWxfYWRkcl9saXN0KCk7CisJc2N0cF9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY3RwX2xvY2FsX2FkZHJfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgY29udHJvbCBpbm9kZS9zb2NrZXQgd2l0aCBhIGNvbnRyb2wgZW5kcG9pbnQgZGF0YQorICogc3RydWN0dXJlLiAgVGhpcyBlbmRwb2ludCBpcyByZXNlcnZlZCBleGNsdXNpdmVseSBmb3IgdGhlIE9PVEIgcHJvY2Vzc2luZy4KKyAqLworc3RhdGljIGludCBzY3RwX2N0bF9zb2NrX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCXNhX2ZhbWlseV90IGZhbWlseTsKKworCWlmIChzY3RwX2dldF9wZl9zcGVjaWZpYyhQRl9JTkVUNikpCisJCWZhbWlseSA9IFBGX0lORVQ2OworCWVsc2UKKwkJZmFtaWx5ID0gUEZfSU5FVDsKKworCWVyciA9IHNvY2tfY3JlYXRlX2tlcm4oZmFtaWx5LCBTT0NLX1NFUVBBQ0tFVCwgSVBQUk9UT19TQ1RQLAorCQkJICAgICAgICZzY3RwX2N0bF9zb2NrZXQpOworCWlmIChlcnIgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIlNDVFA6IEZhaWxlZCB0byBjcmVhdGUgdGhlIFNDVFAgY29udHJvbCBzb2NrZXQuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJc2N0cF9jdGxfc29ja2V0LT5zay0+c2tfYWxsb2NhdGlvbiA9IEdGUF9BVE9NSUM7CisJaW5ldF9zayhzY3RwX2N0bF9zb2NrZXQtPnNrKS0+dWNfdHRsID0gLTE7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVnaXN0ZXIgYWRkcmVzcyBmYW1pbHkgc3BlY2lmaWMgZnVuY3Rpb25zLiAqLworaW50IHNjdHBfcmVnaXN0ZXJfYWYoc3RydWN0IHNjdHBfYWYgKmFmKQoreworCXN3aXRjaCAoYWYtPnNhX2ZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJaWYgKHNjdHBfYWZfdjRfc3BlY2lmaWMpCisJCQlyZXR1cm4gMDsKKwkJc2N0cF9hZl92NF9zcGVjaWZpYyA9IGFmOworCQlicmVhazsKKwljYXNlIEFGX0lORVQ2OgorCQlpZiAoc2N0cF9hZl92Nl9zcGVjaWZpYykKKwkJCXJldHVybiAwOworCQlzY3RwX2FmX3Y2X3NwZWNpZmljID0gYWY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCUlOSVRfTElTVF9IRUFEKCZhZi0+bGlzdCk7CisJbGlzdF9hZGRfdGFpbCgmYWYtPmxpc3QsICZzY3RwX2FkZHJlc3NfZmFtaWxpZXMpOworCXJldHVybiAxOworfQorCisvKiBHZXQgdGhlIHRhYmxlIG9mIGZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nIGEgcGFydGljdWxhciBhZGRyZXNzCisgKiBmYW1pbHkuCisgKi8KK3N0cnVjdCBzY3RwX2FmICpzY3RwX2dldF9hZl9zcGVjaWZpYyhzYV9mYW1pbHlfdCBmYW1pbHkpCit7CisJc3dpdGNoIChmYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCXJldHVybiBzY3RwX2FmX3Y0X3NwZWNpZmljOworCWNhc2UgQUZfSU5FVDY6CisJCXJldHVybiBzY3RwX2FmX3Y2X3NwZWNpZmljOworCWRlZmF1bHQ6CisJCXJldHVybiBOVUxMOworCX0KK30KKworLyogQ29tbW9uIGNvZGUgdG8gaW5pdGlhbGl6ZSBhIEFGX0lORVQgbXNnX25hbWUuICovCitzdGF0aWMgdm9pZCBzY3RwX2luZXRfbXNnbmFtZShjaGFyICptc2duYW1lLCBpbnQgKmFkZHJfbGVuKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luOworCisJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKW1zZ25hbWU7CisJKmFkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwltZW1zZXQoc2luLT5zaW5femVybywgMCwgc2l6ZW9mKHNpbi0+c2luX3plcm8pKTsKK30KKworLyogQ29weSB0aGUgcHJpbWFyeSBhZGRyZXNzIG9mIHRoZSBwZWVyIHByaW1hcnkgYWRkcmVzcyBhcyB0aGUgbXNnX25hbWUuICovCitzdGF0aWMgdm9pZCBzY3RwX2luZXRfZXZlbnRfbXNnbmFtZShzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQsIGNoYXIgKm1zZ25hbWUsCisJCQkJICAgIGludCAqYWRkcl9sZW4pCit7CisJc3RydWN0IHNvY2thZGRyX2luICpzaW4sICpzaW5mcm9tOworCisJaWYgKG1zZ25hbWUpIHsKKwkJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CisKKwkJYXNvYyA9IGV2ZW50LT5hc29jOworCQlzY3RwX2luZXRfbXNnbmFtZShtc2duYW1lLCBhZGRyX2xlbik7CisJCXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKiltc2duYW1lOworCQlzaW5mcm9tID0gJmFzb2MtPnBlZXIucHJpbWFyeV9hZGRyLnY0OworCQlzaW4tPnNpbl9wb3J0ID0gaHRvbnMoYXNvYy0+cGVlci5wb3J0KTsKKwkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSBzaW5mcm9tLT5zaW5fYWRkci5zX2FkZHI7CisJfQorfQorCisvKiBJbml0aWFsaXplIGFuZCBjb3B5IG91dCBhIG1zZ25hbWUgZnJvbSBhbiBpbmJvdW5kIHNrYi4gKi8KK3N0YXRpYyB2b2lkIHNjdHBfaW5ldF9za2JfbXNnbmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjaGFyICptc2duYW1lLCBpbnQgKmxlbikKK3sKKwlzdHJ1Y3Qgc2N0cGhkciAqc2g7CisJc3RydWN0IHNvY2thZGRyX2luICpzaW47CisKKwlpZiAobXNnbmFtZSkgeworCQlzY3RwX2luZXRfbXNnbmFtZShtc2duYW1lLCBsZW4pOworCQlzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopbXNnbmFtZTsKKwkJc2ggPSAoc3RydWN0IHNjdHBoZHIgKilza2ItPmgucmF3OworCQlzaW4tPnNpbl9wb3J0ID0gc2gtPnNvdXJjZTsKKwkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSBza2ItPm5oLmlwaC0+c2FkZHI7CisJfQorfQorCisvKiBEbyB3ZSBzdXBwb3J0IHRoaXMgQUY/ICovCitzdGF0aWMgaW50IHNjdHBfaW5ldF9hZl9zdXBwb3J0ZWQoc2FfZmFtaWx5X3QgZmFtaWx5LCBzdHJ1Y3Qgc2N0cF9zb2NrICpzcCkKK3sKKwkvKiBQRl9JTkVUIG9ubHkgc3VwcG9ydHMgQUZfSU5FVCBhZGRyZXNzZXMuICovCisJcmV0dXJuIChBRl9JTkVUID09IGZhbWlseSk7Cit9CisKKy8qIEFkZHJlc3MgbWF0Y2hpbmcgd2l0aCB3aWxkY2FyZHMgYWxsb3dlZC4gKi8KK3N0YXRpYyBpbnQgc2N0cF9pbmV0X2NtcF9hZGRyKGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqYWRkcjEsCisJCQkgICAgICBjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIyLAorCQkJICAgICAgc3RydWN0IHNjdHBfc29jayAqb3B0KQoreworCS8qIFBGX0lORVQgb25seSBzdXBwb3J0cyBBRl9JTkVUIGFkZHJlc3Nlcy4gKi8KKwlpZiAoYWRkcjEtPnNhLnNhX2ZhbWlseSAhPSBhZGRyMi0+c2Euc2FfZmFtaWx5KQorCQlyZXR1cm4gMDsKKwlpZiAoSU5BRERSX0FOWSA9PSBhZGRyMS0+djQuc2luX2FkZHIuc19hZGRyIHx8CisJICAgIElOQUREUl9BTlkgPT0gYWRkcjItPnY0LnNpbl9hZGRyLnNfYWRkcikKKwkJcmV0dXJuIDE7CisJaWYgKGFkZHIxLT52NC5zaW5fYWRkci5zX2FkZHIgPT0gYWRkcjItPnY0LnNpbl9hZGRyLnNfYWRkcikKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyogVmVyaWZ5IHRoYXQgcHJvdmlkZWQgc29ja2FkZHIgbG9va3MgYmluZGFibGUuICBDb21tb24gdmVyaWZpY2F0aW9uIGhhcworICogYWxyZWFkeSBiZWVuIHRha2VuIGNhcmUgb2YuCisgKi8KK3N0YXRpYyBpbnQgc2N0cF9pbmV0X2JpbmRfdmVyaWZ5KHN0cnVjdCBzY3RwX3NvY2sgKm9wdCwgdW5pb24gc2N0cF9hZGRyICphZGRyKQoreworCXJldHVybiBzY3RwX3Y0X2F2YWlsYWJsZShhZGRyLCBvcHQpOworfQorCisvKiBWZXJpZnkgdGhhdCBzb2NrYWRkciBsb29rcyBzZW5kYWJsZS4gIENvbW1vbiB2ZXJpZmljYXRpb24gaGFzIGFscmVhZHkKKyAqIGJlZW4gdGFrZW4gY2FyZSBvZi4KKyAqLworc3RhdGljIGludCBzY3RwX2luZXRfc2VuZF92ZXJpZnkoc3RydWN0IHNjdHBfc29jayAqb3B0LCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIpCit7CisJcmV0dXJuIDE7Cit9CisKKy8qIEZpbGwgaW4gU3VwcG9ydGVkIEFkZHJlc3MgVHlwZSBpbmZvcm1hdGlvbiBmb3IgSU5JVCBhbmQgSU5JVC1BQ0sKKyAqIGNodW5rcy4gIFJldHVybnMgbnVtYmVyIG9mIGFkZHJlc3NlcyBzdXBwb3J0ZWQuCisgKi8KK3N0YXRpYyBpbnQgc2N0cF9pbmV0X3N1cHBvcnRlZF9hZGRycyhjb25zdCBzdHJ1Y3Qgc2N0cF9zb2NrICpvcHQsCisJCQkJICAgICBfX3UxNiAqdHlwZXMpCit7CisJdHlwZXNbMF0gPSBTQ1RQX1BBUkFNX0lQVjRfQUREUkVTUzsKKwlyZXR1cm4gMTsKK30KKworLyogV3JhcHBlciByb3V0aW5lIHRoYXQgY2FsbHMgdGhlIGlwIHRyYW5zbWl0IHJvdXRpbmUuICovCitzdGF0aWMgaW5saW5lIGludCBzY3RwX3Y0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydCwgaW50IGlwZnJhZ29rKQoreworCVNDVFBfREVCVUdfUFJJTlRLKCIlczogc2tiOiVwLCBsZW46JWQsICIKKwkJCSAgInNyYzoldS4ldS4ldS4ldSwgZHN0OiV1LiV1LiV1LiV1XG4iLAorCQkJICBfX0ZVTkNUSU9OX18sIHNrYiwgc2tiLT5sZW4sCisJCQkgIE5JUFFVQUQoKChzdHJ1Y3QgcnRhYmxlICopc2tiLT5kc3QpLT5ydF9zcmMpLAorCQkJICBOSVBRVUFEKCgoc3RydWN0IHJ0YWJsZSAqKXNrYi0+ZHN0KS0+cnRfZHN0KSk7CisKKwlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9PVVRTQ1RQUEFDS1MpOworCXJldHVybiBpcF9xdWV1ZV94bWl0KHNrYiwgaXBmcmFnb2spOworfQorCitzdGF0aWMgc3RydWN0IHNjdHBfYWYgc2N0cF9pcHY0X3NwZWNpZmljOworCitzdGF0aWMgc3RydWN0IHNjdHBfcGYgc2N0cF9wZl9pbmV0ID0geworCS5ldmVudF9tc2duYW1lID0gc2N0cF9pbmV0X2V2ZW50X21zZ25hbWUsCisJLnNrYl9tc2duYW1lICAgPSBzY3RwX2luZXRfc2tiX21zZ25hbWUsCisJLmFmX3N1cHBvcnRlZCAgPSBzY3RwX2luZXRfYWZfc3VwcG9ydGVkLAorCS5jbXBfYWRkciAgICAgID0gc2N0cF9pbmV0X2NtcF9hZGRyLAorCS5iaW5kX3ZlcmlmeSAgID0gc2N0cF9pbmV0X2JpbmRfdmVyaWZ5LAorCS5zZW5kX3ZlcmlmeSAgID0gc2N0cF9pbmV0X3NlbmRfdmVyaWZ5LAorCS5zdXBwb3J0ZWRfYWRkcnMgPSBzY3RwX2luZXRfc3VwcG9ydGVkX2FkZHJzLAorCS5jcmVhdGVfYWNjZXB0X3NrID0gc2N0cF92NF9jcmVhdGVfYWNjZXB0X3NrLAorCS5hZGRyX3Y0bWFwCT0gc2N0cF92NF9hZGRyX3Y0bWFwLAorCS5hZiAgICAgICAgICAgID0gJnNjdHBfaXB2NF9zcGVjaWZpYywKK307CisKKy8qIE5vdGlmaWVyIGZvciBpbmV0YWRkciBhZGRpdGlvbi9kZWxldGlvbiBldmVudHMuICAqLworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBzY3RwX2luZXRhZGRyX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gc2N0cF9pbmV0YWRkcl9ldmVudCwKK307CisKKy8qIFNvY2tldCBvcGVyYXRpb25zLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIGluZXRfc2VxcGFja2V0X29wcyA9IHsKKwkuZmFtaWx5ICAgICAgPSBQRl9JTkVULAorCS5vd25lciAgICAgICA9IFRISVNfTU9EVUxFLAorCS5yZWxlYXNlICAgICA9IGluZXRfcmVsZWFzZSwgICAgICAgLyogTmVlZHMgdG8gYmUgd3JhcHBlZC4uLiAqLworCS5iaW5kICAgICAgICA9IGluZXRfYmluZCwKKwkuY29ubmVjdCAgICAgPSBpbmV0X2RncmFtX2Nvbm5lY3QsCisJLnNvY2tldHBhaXIgID0gc29ja19ub19zb2NrZXRwYWlyLAorCS5hY2NlcHQgICAgICA9IGluZXRfYWNjZXB0LAorCS5nZXRuYW1lICAgICA9IGluZXRfZ2V0bmFtZSwgICAgICAvKiBTZW1hbnRpY3MgYXJlIGRpZmZlcmVudC4gICovCisJLnBvbGwgICAgICAgID0gc2N0cF9wb2xsLAorCS5pb2N0bCAgICAgICA9IGluZXRfaW9jdGwsCisJLmxpc3RlbiAgICAgID0gc2N0cF9pbmV0X2xpc3RlbiwKKwkuc2h1dGRvd24gICAgPSBpbmV0X3NodXRkb3duLCAgICAgLyogTG9va3MgaGFybWxlc3MuICAqLworCS5zZXRzb2Nrb3B0ICA9IHNvY2tfY29tbW9uX3NldHNvY2tvcHQsICAgLyogSVBfU09MIElQX09QVElPTiBpcyBhIHByb2JsZW0uICovCisJLmdldHNvY2tvcHQgID0gc29ja19jb21tb25fZ2V0c29ja29wdCwKKwkuc2VuZG1zZyAgICAgPSBpbmV0X3NlbmRtc2csCisJLnJlY3Ztc2cgICAgID0gc29ja19jb21tb25fcmVjdm1zZywKKwkubW1hcCAgICAgICAgPSBzb2NrX25vX21tYXAsCisJLnNlbmRwYWdlICAgID0gc29ja19ub19zZW5kcGFnZSwKK307CisKKy8qIFJlZ2lzdHJhdGlvbiB3aXRoIEFGX0lORVQgZmFtaWx5LiAgKi8KK3N0YXRpYyBzdHJ1Y3QgaW5ldF9wcm90b3N3IHNjdHBfc2VxcGFja2V0X3Byb3Rvc3cgPSB7CisJLnR5cGUgICAgICAgPSBTT0NLX1NFUVBBQ0tFVCwKKwkucHJvdG9jb2wgICA9IElQUFJPVE9fU0NUUCwKKwkucHJvdCAgICAgICA9ICZzY3RwX3Byb3QsCisJLm9wcyAgICAgICAgPSAmaW5ldF9zZXFwYWNrZXRfb3BzLAorCS5jYXBhYmlsaXR5ID0gLTEsCisJLm5vX2NoZWNrICAgPSAwLAorCS5mbGFncyAgICAgID0gU0NUUF9QUk9UT1NXX0ZMQUcKK307CitzdGF0aWMgc3RydWN0IGluZXRfcHJvdG9zdyBzY3RwX3N0cmVhbV9wcm90b3N3ID0geworCS50eXBlICAgICAgID0gU09DS19TVFJFQU0sCisJLnByb3RvY29sICAgPSBJUFBST1RPX1NDVFAsCisJLnByb3QgICAgICAgPSAmc2N0cF9wcm90LAorCS5vcHMgICAgICAgID0gJmluZXRfc2VxcGFja2V0X29wcywKKwkuY2FwYWJpbGl0eSA9IC0xLAorCS5ub19jaGVjayAgID0gMCwKKwkuZmxhZ3MgICAgICA9IFNDVFBfUFJPVE9TV19GTEFHCit9OworCisvKiBSZWdpc3RlciB3aXRoIElQIGxheWVyLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvY29sIHNjdHBfcHJvdG9jb2wgPSB7CisJLmhhbmRsZXIgICAgID0gc2N0cF9yY3YsCisJLmVycl9oYW5kbGVyID0gc2N0cF92NF9lcnIsCisJLm5vX3BvbGljeSAgID0gMSwKK307CisKKy8qIElQdjQgYWRkcmVzcyByZWxhdGVkIGZ1bmN0aW9ucy4gICovCitzdGF0aWMgc3RydWN0IHNjdHBfYWYgc2N0cF9pcHY0X3NwZWNpZmljID0geworCS5zY3RwX3htaXQgICAgICA9IHNjdHBfdjRfeG1pdCwKKwkuc2V0c29ja29wdCAgICAgPSBpcF9zZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0ICAgICA9IGlwX2dldHNvY2tvcHQsCisJLmdldF9kc3QJPSBzY3RwX3Y0X2dldF9kc3QsCisJLmdldF9zYWRkcgk9IHNjdHBfdjRfZ2V0X3NhZGRyLAorCS5jb3B5X2FkZHJsaXN0ICA9IHNjdHBfdjRfY29weV9hZGRybGlzdCwKKwkuZnJvbV9za2IgICAgICAgPSBzY3RwX3Y0X2Zyb21fc2tiLAorCS5mcm9tX3NrICAgICAgICA9IHNjdHBfdjRfZnJvbV9zaywKKwkudG9fc2tfc2FkZHIgICAgPSBzY3RwX3Y0X3RvX3NrX3NhZGRyLAorCS50b19za19kYWRkciAgICA9IHNjdHBfdjRfdG9fc2tfZGFkZHIsCisJLmZyb21fYWRkcl9wYXJhbT0gc2N0cF92NF9mcm9tX2FkZHJfcGFyYW0sCisJLnRvX2FkZHJfcGFyYW0gID0gc2N0cF92NF90b19hZGRyX3BhcmFtLAkKKwkuZHN0X3NhZGRyICAgICAgPSBzY3RwX3Y0X2RzdF9zYWRkciwKKwkuY21wX2FkZHIgICAgICAgPSBzY3RwX3Y0X2NtcF9hZGRyLAorCS5hZGRyX3ZhbGlkICAgICA9IHNjdHBfdjRfYWRkcl92YWxpZCwKKwkuaW5hZGRyX2FueSAgICAgPSBzY3RwX3Y0X2luYWRkcl9hbnksCisJLmlzX2FueSAgICAgICAgID0gc2N0cF92NF9pc19hbnksCisJLmF2YWlsYWJsZSAgICAgID0gc2N0cF92NF9hdmFpbGFibGUsCisJLnNjb3BlICAgICAgICAgID0gc2N0cF92NF9zY29wZSwKKwkuc2tiX2lpZiAgICAgICAgPSBzY3RwX3Y0X3NrYl9paWYsCisJLmlzX2NlICAgICAgICAgID0gc2N0cF92NF9pc19jZSwKKwkuc2VxX2R1bXBfYWRkciAgPSBzY3RwX3Y0X3NlcV9kdW1wX2FkZHIsCisJLm5ldF9oZWFkZXJfbGVuID0gc2l6ZW9mKHN0cnVjdCBpcGhkciksCisJLnNvY2thZGRyX2xlbiAgID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbiksCisJLnNhX2ZhbWlseSAgICAgID0gQUZfSU5FVCwKK307CisKK3N0cnVjdCBzY3RwX3BmICpzY3RwX2dldF9wZl9zcGVjaWZpYyhzYV9mYW1pbHlfdCBmYW1pbHkpIHsKKworCXN3aXRjaCAoZmFtaWx5KSB7CisJY2FzZSBQRl9JTkVUOgorCQlyZXR1cm4gc2N0cF9wZl9pbmV0X3NwZWNpZmljOworCWNhc2UgUEZfSU5FVDY6CisJCXJldHVybiBzY3RwX3BmX2luZXQ2X3NwZWNpZmljOworCWRlZmF1bHQ6CisJCXJldHVybiBOVUxMOworCX0KK30KKworLyogUmVnaXN0ZXIgdGhlIFBGIHNwZWNpZmljIGZ1bmN0aW9uIHRhYmxlLiAgKi8KK2ludCBzY3RwX3JlZ2lzdGVyX3BmKHN0cnVjdCBzY3RwX3BmICpwZiwgc2FfZmFtaWx5X3QgZmFtaWx5KQoreworCXN3aXRjaCAoZmFtaWx5KSB7CisJY2FzZSBQRl9JTkVUOgorCQlpZiAoc2N0cF9wZl9pbmV0X3NwZWNpZmljKQorCQkJcmV0dXJuIDA7CisJCXNjdHBfcGZfaW5ldF9zcGVjaWZpYyA9IHBmOworCQlicmVhazsKKwljYXNlIFBGX0lORVQ2OgorCQlpZiAoc2N0cF9wZl9pbmV0Nl9zcGVjaWZpYykKKwkJCXJldHVybiAwOworCQlzY3RwX3BmX2luZXQ2X3NwZWNpZmljID0gcGY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9zY3RwX21pYnModm9pZCkKK3sKKwlzY3RwX3N0YXRpc3RpY3NbMF0gPSBhbGxvY19wZXJjcHUoc3RydWN0IHNjdHBfbWliKTsKKwlpZiAoIXNjdHBfc3RhdGlzdGljc1swXSkKKwkJcmV0dXJuIC1FTk9NRU07CisJc2N0cF9zdGF0aXN0aWNzWzFdID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBzY3RwX21pYik7CisJaWYgKCFzY3RwX3N0YXRpc3RpY3NbMV0pIHsKKwkJZnJlZV9wZXJjcHUoc2N0cF9zdGF0aXN0aWNzWzBdKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworCit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfc2N0cF9taWJzKHZvaWQpCit7CisJZnJlZV9wZXJjcHUoc2N0cF9zdGF0aXN0aWNzWzBdKTsKKwlmcmVlX3BlcmNwdShzY3RwX3N0YXRpc3RpY3NbMV0pOworfQorCisvKiBJbml0aWFsaXplIHRoZSB1bml2ZXJzZSBpbnRvIHNvbWV0aGluZyBzZW5zaWJsZS4gICovCitTQ1RQX1NUQVRJQyBfX2luaXQgaW50IHNjdHBfaW5pdCh2b2lkKQoreworCWludCBpOworCWludCBzdGF0dXMgPSAtRUlOVkFMOworCXVuc2lnbmVkIGxvbmcgZ29hbDsKKwlpbnQgb3JkZXI7CisKKwkvKiBTQ1RQX0RFQlVHIHNhbml0eSBjaGVjay4gKi8KKwlpZiAoIXNjdHBfc2FuaXR5X2NoZWNrKCkpCisJCWdvdG8gb3V0OworCisJc3RhdHVzID0gcHJvdG9fcmVnaXN0ZXIoJnNjdHBfcHJvdCwgMSk7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisKKwkvKiBBZGQgU0NUUCB0byBpbmV0X3Byb3RvcyBoYXNoIHRhYmxlLiAgKi8KKwlzdGF0dXMgPSAtRUFHQUlOOworCWlmIChpbmV0X2FkZF9wcm90b2NvbCgmc2N0cF9wcm90b2NvbCwgSVBQUk9UT19TQ1RQKSA8IDApCisJCWdvdG8gZXJyX2FkZF9wcm90b2NvbDsKKworCS8qIEFkZCBTQ1RQKFRDUCBhbmQgVURQIHN0eWxlKSB0byBpbmV0c3cgbGlua2VkIGxpc3QuICAqLworCWluZXRfcmVnaXN0ZXJfcHJvdG9zdygmc2N0cF9zZXFwYWNrZXRfcHJvdG9zdyk7CisJaW5ldF9yZWdpc3Rlcl9wcm90b3N3KCZzY3RwX3N0cmVhbV9wcm90b3N3KTsKKworCS8qIEFsbG9jYXRlIGEgY2FjaGUgcG9vbHMuICovCisJc3RhdHVzID0gLUVOT0JVRlM7CisJc2N0cF9idWNrZXRfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoInNjdHBfYmluZF9idWNrZXQiLAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX2JpbmRfYnVja2V0KSwKKwkJCQkJICAgICAgIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwKKwkJCQkJICAgICAgIE5VTEwsIE5VTEwpOworCisJaWYgKCFzY3RwX2J1Y2tldF9jYWNoZXApCisJCWdvdG8gZXJyX2J1Y2tldF9jYWNoZXA7CisKKwlzY3RwX2NodW5rX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJzY3RwX2NodW5rIiwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc2N0cF9jaHVuayksCisJCQkJCSAgICAgICAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sCisJCQkJCSAgICAgICBOVUxMLCBOVUxMKTsKKwlpZiAoIXNjdHBfY2h1bmtfY2FjaGVwKQorCQlnb3RvIGVycl9jaHVua19jYWNoZXA7CisKKwkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGlzZSBzY3RwIG1pYnMuICAqLworCXN0YXR1cyA9IGluaXRfc2N0cF9taWJzKCk7CisJaWYgKHN0YXR1cykKKwkJZ290byBlcnJfaW5pdF9taWJzOworCisJLyogSW5pdGlhbGl6ZSBwcm9jIGZzIGRpcmVjdG9yeS4gICovCisJc3RhdHVzID0gc2N0cF9wcm9jX2luaXQoKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGVycl9pbml0X3Byb2M7CisKKwkvKiBJbml0aWFsaXplIG9iamVjdCBjb3VudCBkZWJ1Z2dpbmcuICAqLworCXNjdHBfZGJnX29iamNudF9pbml0KCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBTQ1RQIHNwZWNpZmljIFBGIGZ1bmN0aW9ucy4gKi8KKwlzY3RwX3JlZ2lzdGVyX3BmKCZzY3RwX3BmX2luZXQsIFBGX0lORVQpOworCS8qCisJICogMTQuIFN1Z2dlc3RlZCBTQ1RQIFByb3RvY29sIFBhcmFtZXRlciBWYWx1ZXMKKwkgKi8KKwkvKiBUaGUgZm9sbG93aW5nIHByb3RvY29sIHBhcmFtZXRlcnMgYXJlIFJFQ09NTUVOREVEOiAgKi8KKwkvKiBSVE8uSW5pdGlhbCAgICAgICAgICAgICAgLSAzICBzZWNvbmRzICovCisJc2N0cF9ydG9faW5pdGlhbAkJPSBTQ1RQX1JUT19JTklUSUFMOworCS8qIFJUTy5NaW4gICAgICAgICAgICAgICAgICAtIDEgIHNlY29uZCAqLworCXNjdHBfcnRvX21pbgkgCQk9IFNDVFBfUlRPX01JTjsKKwkvKiBSVE8uTWF4ICAgICAgICAgICAgICAgICAtICA2MCBzZWNvbmRzICovCisJc2N0cF9ydG9fbWF4IAkJCT0gU0NUUF9SVE9fTUFYOworCS8qIFJUTy5BbHBoYSAgICAgICAgICAgICAgICAtIDEvOCAqLworCXNjdHBfcnRvX2FscGhhCSAgICAgICAgCT0gU0NUUF9SVE9fQUxQSEE7CisJLyogUlRPLkJldGEgICAgICAgICAgICAgICAgIC0gMS80ICovCisJc2N0cF9ydG9fYmV0YQkJCT0gU0NUUF9SVE9fQkVUQTsKKworCS8qIFZhbGlkLkNvb2tpZS5MaWZlICAgICAgICAtIDYwICBzZWNvbmRzICovCisJc2N0cF92YWxpZF9jb29raWVfbGlmZQkJPSA2MCAqIEhaOworCisJLyogV2hldGhlciBDb29raWUgUHJlc2VydmF0aXZlIGlzIGVuYWJsZWQoMSkgb3Igbm90KDApICovCisJc2N0cF9jb29raWVfcHJlc2VydmVfZW5hYmxlIAk9IDE7CisKKwkvKiBNYXguQnVyc3QJCSAgICAtIDQgKi8KKwlzY3RwX21heF9idXJzdCAJCQk9IFNDVFBfTUFYX0JVUlNUOworCisJLyogQXNzb2NpYXRpb24uTWF4LlJldHJhbnMgIC0gMTAgYXR0ZW1wdHMKKwkgKiBQYXRoLk1heC5SZXRyYW5zICAgICAgICAgLSA1ICBhdHRlbXB0cyAocGVyIGRlc3RpbmF0aW9uIGFkZHJlc3MpCisJICogTWF4LkluaXQuUmV0cmFuc21pdHMgICAgIC0gOCAgYXR0ZW1wdHMKKwkgKi8KKwlzY3RwX21heF9yZXRyYW5zX2Fzc29jaWF0aW9uIAk9IDEwOworCXNjdHBfbWF4X3JldHJhbnNfcGF0aAkJPSA1OworCXNjdHBfbWF4X3JldHJhbnNfaW5pdAkJPSA4OworCisJLyogSEIuaW50ZXJ2YWwgICAgICAgICAgICAgIC0gMzAgc2Vjb25kcyAqLworCXNjdHBfaGJfaW50ZXJ2YWwJCT0gMzAgKiBIWjsKKworCS8qIEltcGxlbWVudGF0aW9uIHNwZWNpZmljIHZhcmlhYmxlcy4gKi8KKworCS8qIEluaXRpYWxpemUgZGVmYXVsdCBzdHJlYW0gY291bnQgc2V0dXAgaW5mb3JtYXRpb24uICovCisJc2N0cF9tYXhfaW5zdHJlYW1zICAgIAkJPSBTQ1RQX0RFRkFVTFRfSU5TVFJFQU1TOworCXNjdHBfbWF4X291dHN0cmVhbXMgICAJCT0gU0NUUF9ERUZBVUxUX09VVFNUUkVBTVM7CisKKwkvKiBJbml0aWFsaXplIGhhbmRsZSB1c2VkIGZvciBhc3NvY2lhdGlvbiBpZHMuICovCisJaWRyX2luaXQoJnNjdHBfYXNzb2NzX2lkKTsKKworCS8qIFNpemUgYW5kIGFsbG9jYXRlIHRoZSBhc3NvY2lhdGlvbiBoYXNoIHRhYmxlLgorCSAqIFRoZSBtZXRob2RvbG9neSBpcyBzaW1pbGFyIHRvIHRoYXQgb2YgdGhlIHRjcCBoYXNoIHRhYmxlcy4KKwkgKi8KKwlpZiAobnVtX3BoeXNwYWdlcyA+PSAoMTI4ICogMTAyNCkpCisJCWdvYWwgPSBudW1fcGh5c3BhZ2VzID4+ICgyMiAtIFBBR0VfU0hJRlQpOworCWVsc2UKKwkJZ29hbCA9IG51bV9waHlzcGFnZXMgPj4gKDI0IC0gUEFHRV9TSElGVCk7CisKKwlmb3IgKG9yZGVyID0gMDsgKDFVTCA8PCBvcmRlcikgPCBnb2FsOyBvcmRlcisrKQorCQk7CisKKwlkbyB7CisJCXNjdHBfYXNzb2NfaGFzaHNpemUgPSAoMVVMIDw8IG9yZGVyKSAqIFBBR0VfU0laRSAvCisJCQkJCXNpemVvZihzdHJ1Y3Qgc2N0cF9oYXNoYnVja2V0KTsKKwkJaWYgKChzY3RwX2Fzc29jX2hhc2hzaXplID4gKDY0ICogMTAyNCkpICYmIG9yZGVyID4gMCkKKwkJCWNvbnRpbnVlOworCQlzY3RwX2Fzc29jX2hhc2h0YWJsZSA9IChzdHJ1Y3Qgc2N0cF9oYXNoYnVja2V0ICopCisJCQkJCV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0FUT01JQywgb3JkZXIpOworCX0gd2hpbGUgKCFzY3RwX2Fzc29jX2hhc2h0YWJsZSAmJiAtLW9yZGVyID4gMCk7CisJaWYgKCFzY3RwX2Fzc29jX2hhc2h0YWJsZSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNDVFA6IEZhaWxlZCBhc3NvY2lhdGlvbiBoYXNoIGFsbG9jLlxuIik7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2FoYXNoX2FsbG9jOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgc2N0cF9hc3NvY19oYXNoc2l6ZTsgaSsrKSB7CisJCXJ3bG9ja19pbml0KCZzY3RwX2Fzc29jX2hhc2h0YWJsZVtpXS5sb2NrKTsKKwkJc2N0cF9hc3NvY19oYXNodGFibGVbaV0uY2hhaW4gPSBOVUxMOworCX0KKworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBlbmRwb2ludCBoYXNoIHRhYmxlLiAgKi8KKwlzY3RwX2VwX2hhc2hzaXplID0gNjQ7CisJc2N0cF9lcF9oYXNodGFibGUgPSAoc3RydWN0IHNjdHBfaGFzaGJ1Y2tldCAqKQorCQlrbWFsbG9jKDY0ICogc2l6ZW9mKHN0cnVjdCBzY3RwX2hhc2hidWNrZXQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNjdHBfZXBfaGFzaHRhYmxlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU0NUUDogRmFpbGVkIGVuZHBvaW50X2hhc2ggYWxsb2MuXG4iKTsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBlcnJfZWhhc2hfYWxsb2M7CisJfQorCWZvciAoaSA9IDA7IGkgPCBzY3RwX2VwX2hhc2hzaXplOyBpKyspIHsKKwkJcndsb2NrX2luaXQoJnNjdHBfZXBfaGFzaHRhYmxlW2ldLmxvY2spOworCQlzY3RwX2VwX2hhc2h0YWJsZVtpXS5jaGFpbiA9IE5VTEw7CisJfQorCisJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIFNDVFAgcG9ydCBoYXNoIHRhYmxlLiAgKi8KKwlkbyB7CisJCXNjdHBfcG9ydF9oYXNoc2l6ZSA9ICgxVUwgPDwgb3JkZXIpICogUEFHRV9TSVpFIC8KKwkJCQkJc2l6ZW9mKHN0cnVjdCBzY3RwX2JpbmRfaGFzaGJ1Y2tldCk7CisJCWlmICgoc2N0cF9wb3J0X2hhc2hzaXplID4gKDY0ICogMTAyNCkpICYmIG9yZGVyID4gMCkKKwkJCWNvbnRpbnVlOworCQlzY3RwX3BvcnRfaGFzaHRhYmxlID0gKHN0cnVjdCBzY3RwX2JpbmRfaGFzaGJ1Y2tldCAqKQorCQkJCQlfX2dldF9mcmVlX3BhZ2VzKEdGUF9BVE9NSUMsIG9yZGVyKTsKKwl9IHdoaWxlICghc2N0cF9wb3J0X2hhc2h0YWJsZSAmJiAtLW9yZGVyID4gMCk7CisJaWYgKCFzY3RwX3BvcnRfaGFzaHRhYmxlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU0NUUDogRmFpbGVkIGJpbmQgaGFzaCBhbGxvYy4iKTsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBlcnJfYmhhc2hfYWxsb2M7CisJfQorCWZvciAoaSA9IDA7IGkgPCBzY3RwX3BvcnRfaGFzaHNpemU7IGkrKykgeworCQlzcGluX2xvY2tfaW5pdCgmc2N0cF9wb3J0X2hhc2h0YWJsZVtpXS5sb2NrKTsKKwkJc2N0cF9wb3J0X2hhc2h0YWJsZVtpXS5jaGFpbiA9IE5VTEw7CisJfQorCisJc3Bpbl9sb2NrX2luaXQoJnNjdHBfcG9ydF9hbGxvY19sb2NrKTsKKwlzY3RwX3BvcnRfcm92ZXIgPSBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVswXSAtIDE7CisKKwlwcmludGsoS0VSTl9JTkZPICJTQ1RQOiBIYXNoIHRhYmxlcyBjb25maWd1cmVkICIKKwkJCSAiKGVzdGFibGlzaGVkICVkIGJpbmQgJWQpXG4iLAorCQlzY3RwX2Fzc29jX2hhc2hzaXplLCBzY3RwX3BvcnRfaGFzaHNpemUpOworCisJLyogRGlzYWJsZSBBRERJUCBieSBkZWZhdWx0LiAqLworCXNjdHBfYWRkaXBfZW5hYmxlID0gMDsKKworCS8qIEVuYWJsZSBQUi1TQ1RQIGJ5IGRlZmF1bHQuICovCisJc2N0cF9wcnNjdHBfZW5hYmxlID0gMTsKKworCXNjdHBfc3lzY3RsX3JlZ2lzdGVyKCk7CisKKwlJTklUX0xJU1RfSEVBRCgmc2N0cF9hZGRyZXNzX2ZhbWlsaWVzKTsKKwlzY3RwX3JlZ2lzdGVyX2FmKCZzY3RwX2lwdjRfc3BlY2lmaWMpOworCisJc3RhdHVzID0gc2N0cF92Nl9pbml0KCk7CisJaWYgKHN0YXR1cykKKwkJZ290byBlcnJfdjZfaW5pdDsKKworCS8qIEluaXRpYWxpemUgdGhlIGNvbnRyb2wgaW5vZGUvc29ja2V0IGZvciBoYW5kbGluZyBPT1RCIHBhY2tldHMuICAqLworCWlmICgoc3RhdHVzID0gc2N0cF9jdGxfc29ja19pbml0KCkpKSB7CisJCXByaW50ayAoS0VSTl9FUlIKKwkJCSJTQ1RQOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgU0NUUCBjb250cm9sIHNvY2suXG4iKTsKKwkJZ290byBlcnJfY3RsX3NvY2tfaW5pdDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBsb2NhbCBhZGRyZXNzIGxpc3QuICovCisJSU5JVF9MSVNUX0hFQUQoJnNjdHBfbG9jYWxfYWRkcl9saXN0KTsKKwlzcGluX2xvY2tfaW5pdCgmc2N0cF9sb2NhbF9hZGRyX2xvY2spOworCisJLyogUmVnaXN0ZXIgbm90aWZpZXIgZm9yIGluZXQgYWRkcmVzcyBhZGRpdGlvbnMvZGVsZXRpb25zLiAqLworCXJlZ2lzdGVyX2luZXRhZGRyX25vdGlmaWVyKCZzY3RwX2luZXRhZGRyX25vdGlmaWVyKTsKKworCXNjdHBfZ2V0X2xvY2FsX2FkZHJfbGlzdCgpOworCisJX191bnNhZmUoVEhJU19NT0RVTEUpOworCXN0YXR1cyA9IDA7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK2Vycl9hZGRfcHJvdG9jb2w6CisJcHJvdG9fdW5yZWdpc3Rlcigmc2N0cF9wcm90KTsKK2Vycl9jdGxfc29ja19pbml0OgorCXNjdHBfdjZfZXhpdCgpOworZXJyX3Y2X2luaXQ6CisJc2N0cF9zeXNjdGxfdW5yZWdpc3RlcigpOworCWxpc3RfZGVsKCZzY3RwX2lwdjRfc3BlY2lmaWMubGlzdCk7CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylzY3RwX3BvcnRfaGFzaHRhYmxlLAorCQkgICBnZXRfb3JkZXIoc2N0cF9wb3J0X2hhc2hzaXplICoKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX2JpbmRfaGFzaGJ1Y2tldCkpKTsKK2Vycl9iaGFzaF9hbGxvYzoKKwlrZnJlZShzY3RwX2VwX2hhc2h0YWJsZSk7CitlcnJfZWhhc2hfYWxsb2M6CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylzY3RwX2Fzc29jX2hhc2h0YWJsZSwKKwkJICAgZ2V0X29yZGVyKHNjdHBfYXNzb2NfaGFzaHNpemUgKgorCQkJICAgICBzaXplb2Yoc3RydWN0IHNjdHBfaGFzaGJ1Y2tldCkpKTsKK2Vycl9haGFzaF9hbGxvYzoKKwlzY3RwX2RiZ19vYmpjbnRfZXhpdCgpOworZXJyX2luaXRfcHJvYzoKKwlzY3RwX3Byb2NfZXhpdCgpOworCWNsZWFudXBfc2N0cF9taWJzKCk7CitlcnJfaW5pdF9taWJzOgorCWttZW1fY2FjaGVfZGVzdHJveShzY3RwX2NodW5rX2NhY2hlcCk7CitlcnJfY2h1bmtfY2FjaGVwOgorCWttZW1fY2FjaGVfZGVzdHJveShzY3RwX2J1Y2tldF9jYWNoZXApOworZXJyX2J1Y2tldF9jYWNoZXA6CisJaW5ldF9kZWxfcHJvdG9jb2woJnNjdHBfcHJvdG9jb2wsIElQUFJPVE9fU0NUUCk7CisJaW5ldF91bnJlZ2lzdGVyX3Byb3Rvc3coJnNjdHBfc2VxcGFja2V0X3Byb3Rvc3cpOworCWluZXRfdW5yZWdpc3Rlcl9wcm90b3N3KCZzY3RwX3N0cmVhbV9wcm90b3N3KTsKKwlnb3RvIG91dDsKK30KKworLyogRXhpdCBoYW5kbGVyIGZvciB0aGUgU0NUUCBwcm90b2NvbC4gICovCitTQ1RQX1NUQVRJQyBfX2V4aXQgdm9pZCBzY3RwX2V4aXQodm9pZCkKK3sKKwkvKiBCVUcuICBUaGlzIHNob3VsZCBwcm9iYWJseSBkbyBzb21ldGhpbmcgdXNlZnVsIGxpa2UgY2xlYW4KKwkgKiB1cCBhbGwgdGhlIHJlbWFpbmluZyBhc3NvY2lhdGlvbnMgYW5kIGFsbCB0aGF0IG1lbW9yeS4KKwkgKi8KKworCS8qIFVucmVnaXN0ZXIgbm90aWZpZXIgZm9yIGluZXQgYWRkcmVzcyBhZGRpdGlvbnMvZGVsZXRpb25zLiAqLworCXVucmVnaXN0ZXJfaW5ldGFkZHJfbm90aWZpZXIoJnNjdHBfaW5ldGFkZHJfbm90aWZpZXIpOworCisJLyogRnJlZSB0aGUgbG9jYWwgYWRkcmVzcyBsaXN0LiAgKi8KKwlzY3RwX2ZyZWVfbG9jYWxfYWRkcl9saXN0KCk7CisKKwkvKiBGcmVlIHRoZSBjb250cm9sIGVuZHBvaW50LiAgKi8KKwlzb2NrX3JlbGVhc2Uoc2N0cF9jdGxfc29ja2V0KTsKKworCXNjdHBfdjZfZXhpdCgpOworCXNjdHBfc3lzY3RsX3VucmVnaXN0ZXIoKTsKKwlsaXN0X2RlbCgmc2N0cF9pcHY0X3NwZWNpZmljLmxpc3QpOworCisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylzY3RwX2Fzc29jX2hhc2h0YWJsZSwKKwkJICAgZ2V0X29yZGVyKHNjdHBfYXNzb2NfaGFzaHNpemUgKgorCQkJICAgICBzaXplb2Yoc3RydWN0IHNjdHBfaGFzaGJ1Y2tldCkpKTsKKwlrZnJlZShzY3RwX2VwX2hhc2h0YWJsZSk7CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylzY3RwX3BvcnRfaGFzaHRhYmxlLAorCQkgICBnZXRfb3JkZXIoc2N0cF9wb3J0X2hhc2hzaXplICoKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX2JpbmRfaGFzaGJ1Y2tldCkpKTsKKworCWttZW1fY2FjaGVfZGVzdHJveShzY3RwX2NodW5rX2NhY2hlcCk7CisJa21lbV9jYWNoZV9kZXN0cm95KHNjdHBfYnVja2V0X2NhY2hlcCk7CisKKwlzY3RwX2RiZ19vYmpjbnRfZXhpdCgpOworCXNjdHBfcHJvY19leGl0KCk7CisJY2xlYW51cF9zY3RwX21pYnMoKTsKKworCWluZXRfZGVsX3Byb3RvY29sKCZzY3RwX3Byb3RvY29sLCBJUFBST1RPX1NDVFApOworCWluZXRfdW5yZWdpc3Rlcl9wcm90b3N3KCZzY3RwX3NlcXBhY2tldF9wcm90b3N3KTsKKwlpbmV0X3VucmVnaXN0ZXJfcHJvdG9zdygmc2N0cF9zdHJlYW1fcHJvdG9zdyk7CisJcHJvdG9fdW5yZWdpc3Rlcigmc2N0cF9wcm90KTsKK30KKworbW9kdWxlX2luaXQoc2N0cF9pbml0KTsKK21vZHVsZV9leGl0KHNjdHBfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkxpbnV4IEtlcm5lbCBTQ1RQIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3VwcG9ydCBmb3IgdGhlIFNDVFAgcHJvdG9jb2wgKFJGQzI5NjApIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zbV9tYWtlX2NodW5rLmMgYi9uZXQvc2N0cC9zbV9tYWtlX2NodW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiMTJjYwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY3RwL3NtX21ha2VfY2h1bmsuYwpAQCAtMCwwICsxLDI3NjYgQEAKKy8qIFNDVFAga2VybmVsIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSwgMjAwNAorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgQ2lzY28sIEluYy4KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIE1vdG9yb2xhLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiBJbnRlbCBDb3JwLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBTQ1RQIGtlcm5lbCByZWZlcmVuY2UgSW1wbGVtZW50YXRpb24KKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgd29yayB3aXRoIHRoZSBzdGF0ZSBmdW5jdGlvbnMgaW4gc2N0cF9zbV9zdGF0ZWZ1bnMuYworICogdG8gaW1wbGVtZW50IHRoZSBzdGF0ZSBvcGVyYXRpb25zLiAgVGhlc2UgZnVuY3Rpb25zIGltcGxlbWVudCB0aGUKKyAqIHN0ZXBzIHdoaWNoIHJlcXVpcmUgbW9kaWZ5aW5nIGV4aXN0aW5nIGRhdGEgc3RydWN0dXJlcy4KKyAqCisgKiBUaGUgU0NUUCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgU0NUUCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogV3JpdHRlbiBvciBtb2RpZmllZCBieToKKyAqICAgIExhIE1vbnRlIEguUC4gWWFycm9sbCA8cGlnZ3lAYWNtLm9yZz4KKyAqICAgIEthcmwgS251dHNvbiAgICAgICAgICA8a2FybEBhdGhlbmEuY2hpY2Fnby5pbC51cz4KKyAqICAgIEMuIFJvYmluICAgICAgICAgICAgICA8Y2hyaXNAaHVuZHJlZGFjcmUuYWMudWs+CisgKiAgICBKb24gR3JpbW0gICAgICAgICAgICAgPGpncmltbUB1cy5pYm0uY29tPgorICogICAgWGluZ2FuZyBHdW8gICAgICAgICAgIDx4aW5nYW5nLmd1b0BpbnRlbC5jb20+CisgKiAgICBEYWppYW5nIFpoYW5nCSAgICA8ZGFqaWFuZy56aGFuZ0Bub2tpYS5jb20+CisgKiAgICBTcmlkaGFyIFNhbXVkcmFsYQkgICAgPHNyaUB1cy5pYm0uY29tPgorICogICAgRGFpc3kgQ2hhbmcJICAgIDxkYWlzeWNAdXMuaWJtLmNvbT4KKyAqICAgIEFyZGVsbGUgRmFuCSAgICA8YXJkZWxsZS5mYW5AaW50ZWwuY29tPgorICogICAgS2V2aW4gR2FvICAgICAgICAgICAgIDxrZXZpbi5nYW9AaW50ZWwuY29tPgorICoKKyAqIEFueSBidWdzIHJlcG9ydGVkIGdpdmVuIHRvIHVzIHdlIHdpbGwgdHJ5IHRvIGZpeC4uLiBhbnkgZml4ZXMgc2hhcmVkIHdpbGwKKyAqIGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBuZXh0IFNDVFAgcmVsZWFzZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgkvKiBmb3IgZ2V0X3JhbmRvbV9ieXRlcyAqLworI2luY2x1ZGUgPG5ldC9zY3RwL3NjdHAuaD4KKyNpbmNsdWRlIDxuZXQvc2N0cC9zbS5oPgorCitleHRlcm4ga21lbV9jYWNoZV90ICpzY3RwX2NodW5rX2NhY2hlcDsKKworU0NUUF9TVEFUSUMKK3N0cnVjdCBzY3RwX2NodW5rICpzY3RwX21ha2VfY2h1bmsoY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJICAgX191OCB0eXBlLCBfX3U4IGZsYWdzLCBpbnQgcGF5bGVuKTsKK3N0YXRpYyBzY3RwX2Nvb2tpZV9wYXJhbV90ICpzY3RwX3BhY2tfY29va2llKGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwkJCQkJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJCWNvbnN0IHN0cnVjdCBzY3RwX2NodW5rICppbml0X2NodW5rLAorCQkJCQlpbnQgKmNvb2tpZV9sZW4sCisJCQkJCWNvbnN0IF9fdTggKnJhd19hZGRycywgaW50IGFkZHJzX2xlbik7CitzdGF0aWMgaW50IHNjdHBfcHJvY2Vzc19wYXJhbShzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCSAgICAgIHVuaW9uIHNjdHBfcGFyYW1zIHBhcmFtLAorCQkJICAgICAgY29uc3QgdW5pb24gc2N0cF9hZGRyICpwZWVyX2FkZHIsCisJCQkgICAgICBpbnQgZ2ZwKTsKKworLyogV2hhdCB3YXMgdGhlIGluYm91bmQgaW50ZXJmYWNlIGZvciB0aGlzIGNodW5rPyAqLworaW50IHNjdHBfY2h1bmtfaWlmKGNvbnN0IHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaykKK3sKKwlzdHJ1Y3Qgc2N0cF9hZiAqYWY7CisJaW50IGlpZiA9IDA7CisKKwlhZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKGlwdmVyMmFmKGNodW5rLT5za2ItPm5oLmlwaC0+dmVyc2lvbikpOworCWlmIChhZikKKwkJaWlmID0gYWYtPnNrYl9paWYoY2h1bmstPnNrYik7CisKKwlyZXR1cm4gaWlmOworfQorCisvKiBSRkMgMjk2MCAzLjMuMiBJbml0aWF0aW9uIChJTklUKSAoMSkKKyAqCisgKiBOb3RlIDI6IFRoZSBFQ04gY2FwYWJsZSBmaWVsZCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBvZgorICogRXhwbGljaXQgQ29uZ2VzdGlvbiBOb3RpZmljYXRpb24uCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2N0cF9wYXJhbWhkciBlY2FwX3BhcmFtID0geworCVNDVFBfUEFSQU1fRUNOX0NBUEFCTEUsCisJX19jb25zdGFudF9odG9ucyhzaXplb2Yoc3RydWN0IHNjdHBfcGFyYW1oZHIpKSwKK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHNjdHBfcGFyYW1oZHIgcHJzY3RwX3BhcmFtID0geworCVNDVFBfUEFSQU1fRldEX1RTTl9TVVBQT1JULAorCV9fY29uc3RhbnRfaHRvbnMoc2l6ZW9mKHN0cnVjdCBzY3RwX3BhcmFtaGRyKSksCit9OworCisvKiBBIGhlbHBlciB0byBpbml0aWFsaXplIHRvIGluaXRpYWxpemUgYW4gb3AgZXJyb3IgaW5zaWRlIGEKKyAqIHByb3ZpZGVkIGNodW5rLCBhcyBtb3N0IGNhdXNlIGNvZGVzIHdpbGwgYmUgZW1iZWRkZWQgaW5zaWRlIGFuCisgKiBhYm9ydCBjaHVuay4KKyAqLwordm9pZCAgc2N0cF9pbml0X2NhdXNlKHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywgX191MTYgY2F1c2VfY29kZSwKKwkJICAgICAgY29uc3Qgdm9pZCAqcGF5bG9hZCwgc2l6ZV90IHBheWxlbikKK3sKKwlzY3RwX2Vycmhkcl90IGVycjsKKwlpbnQgcGFkbGVuOworCV9fdTE2IGxlbjsKKworICAgICAgICAvKiBDYXVzZSBjb2RlIGNvbnN0YW50cyBhcmUgbm93IGRlZmluZWQgaW4gbmV0d29yayBvcmRlci4gICovCisJZXJyLmNhdXNlID0gY2F1c2VfY29kZTsKKwlsZW4gPSBzaXplb2Yoc2N0cF9lcnJoZHJfdCkgKyBwYXlsZW47CisJcGFkbGVuID0gbGVuICUgNDsKKwllcnIubGVuZ3RoICA9IGh0b25zKGxlbik7CisJbGVuICs9IHBhZGxlbjsKKwlzY3RwX2FkZHRvX2NodW5rKGNodW5rLCBzaXplb2Yoc2N0cF9lcnJoZHJfdCksICZlcnIpOworCWNodW5rLT5zdWJoLmVycl9oZHIgPSBzY3RwX2FkZHRvX2NodW5rKGNodW5rLCBwYXlsZW4sIHBheWxvYWQpOworfQorCisvKiAzLjMuMiBJbml0aWF0aW9uIChJTklUKSAoMSkKKyAqCisgKiBUaGlzIGNodW5rIGlzIHVzZWQgdG8gaW5pdGlhdGUgYSBTQ1RQIGFzc29jaWF0aW9uIGJldHdlZW4gdHdvCisgKiBlbmRwb2ludHMuIFRoZSBmb3JtYXQgb2YgdGhlIElOSVQgY2h1bmsgaXMgc2hvd24gYmVsb3c6CisgKgorICogICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAqICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiAgICB8ICAgVHlwZSA9IDEgICAgfCAgQ2h1bmsgRmxhZ3MgIHwgICAgICBDaHVuayBMZW5ndGggICAgICAgICAgICAgfAorICogICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdGlhdGUgVGFnICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogICAgfCAgICAgICAgICAgQWR2ZXJ0aXNlZCBSZWNlaXZlciBXaW5kb3cgQ3JlZGl0IChhX3J3bmQpICAgICAgICAgIHwKKyAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiAgICB8ICBOdW1iZXIgb2YgT3V0Ym91bmQgU3RyZWFtcyAgIHwgIE51bWJlciBvZiBJbmJvdW5kIFN0cmVhbXMgICAgfAorICogICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIEluaXRpYWwgVFNOICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogICAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAqICAgIC8gICAgICAgICAgICAgIE9wdGlvbmFsL1ZhcmlhYmxlLUxlbmd0aCBQYXJhbWV0ZXJzICAgICAgICAgICAgICAvCisgKiAgICBcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICogICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqCisgKgorICogVGhlIElOSVQgY2h1bmsgY29udGFpbnMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzLiBVbmxlc3Mgb3RoZXJ3aXNlCisgKiBub3RlZCwgZWFjaCBwYXJhbWV0ZXIgTVVTVCBvbmx5IGJlIGluY2x1ZGVkIG9uY2UgaW4gdGhlIElOSVQgY2h1bmsuCisgKgorICogRml4ZWQgUGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgIFN0YXR1cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5pdGlhdGUgVGFnICAgICAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5CisgKiBBZHZlcnRpc2VkIFJlY2VpdmVyIFdpbmRvdyBDcmVkaXQgICBNYW5kYXRvcnkKKyAqIE51bWJlciBvZiBPdXRib3VuZCBTdHJlYW1zICAgICAgICAgIE1hbmRhdG9yeQorICogTnVtYmVyIG9mIEluYm91bmQgU3RyZWFtcyAgICAgICAgICAgTWFuZGF0b3J5CisgKiBJbml0aWFsIFRTTiAgICAgICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkKKyAqCisgKiBWYXJpYWJsZSBQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgU3RhdHVzICAgICBUeXBlIFZhbHVlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJUHY0IEFkZHJlc3MgKE5vdGUgMSkgICAgICAgICAgICAgICBPcHRpb25hbCAgICA1CisgKiBJUHY2IEFkZHJlc3MgKE5vdGUgMSkgICAgICAgICAgICAgICBPcHRpb25hbCAgICA2CisgKiBDb29raWUgUHJlc2VydmF0aXZlICAgICAgICAgICAgICAgICBPcHRpb25hbCAgICA5CisgKiBSZXNlcnZlZCBmb3IgRUNOIENhcGFibGUgKE5vdGUgMikgICBPcHRpb25hbCAgICAzMjc2OCAoMHg4MDAwKQorICogSG9zdCBOYW1lIEFkZHJlc3MgKE5vdGUgMykgICAgICAgICAgT3B0aW9uYWwgICAgMTEKKyAqIFN1cHBvcnRlZCBBZGRyZXNzIFR5cGVzIChOb3RlIDQpICAgIE9wdGlvbmFsICAgIDEyCisgKi8KK3N0cnVjdCBzY3RwX2NodW5rICpzY3RwX21ha2VfaW5pdChjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCSAgICAgY29uc3Qgc3RydWN0IHNjdHBfYmluZF9hZGRyICpicCwKKwkJCSAgICAgaW50IGdmcCwgaW50IHZwYXJhbV9sZW4pCit7CisJc2N0cF9pbml0aGRyX3QgaW5pdDsKKwl1bmlvbiBzY3RwX3BhcmFtcyBhZGRyczsKKwlzaXplX3QgY2h1bmtzaXplOworCXN0cnVjdCBzY3RwX2NodW5rICpyZXR2YWwgPSBOVUxMOworCWludCBudW1fdHlwZXMsIGFkZHJzX2xlbiA9IDA7CisJc3RydWN0IHNjdHBfc29jayAqc3A7CisJc2N0cF9zdXBwb3J0ZWRfYWRkcnNfcGFyYW1fdCBzYXQ7CisJX191MTYgdHlwZXNbMl07CisJc2N0cF9hZGFwdGlvbl9pbmRfcGFyYW1fdCBhaXBhcmFtOworCisJLyogUkZDIDI5NjAgMy4zLjIgSW5pdGlhdGlvbiAoSU5JVCkgKDEpCisJICoKKwkgKiBOb3RlIDE6IFRoZSBJTklUIGNodW5rcyBjYW4gY29udGFpbiBtdWx0aXBsZSBhZGRyZXNzZXMgdGhhdAorCSAqIGNhbiBiZSBJUHY0IGFuZC9vciBJUHY2IGluIGFueSBjb21iaW5hdGlvbi4KKwkgKi8KKwlyZXR2YWwgPSBOVUxMOworCisJLyogQ29udmVydCB0aGUgcHJvdmlkZWQgYmluZCBhZGRyZXNzIGxpc3QgdG8gcmF3IGZvcm1hdC4gKi8KKwlhZGRycyA9IHNjdHBfYmluZF9hZGRyc190b19yYXcoYnAsICZhZGRyc19sZW4sIGdmcCk7CisKKwlpbml0LmluaXRfdGFnCQkgICA9IGh0b25sKGFzb2MtPmMubXlfdnRhZyk7CisJaW5pdC5hX3J3bmQJCSAgID0gaHRvbmwoYXNvYy0+cnduZCk7CisJaW5pdC5udW1fb3V0Ym91bmRfc3RyZWFtcyAgPSBodG9ucyhhc29jLT5jLnNpbml0X251bV9vc3RyZWFtcyk7CisJaW5pdC5udW1faW5ib3VuZF9zdHJlYW1zICAgPSBodG9ucyhhc29jLT5jLnNpbml0X21heF9pbnN0cmVhbXMpOworCWluaXQuaW5pdGlhbF90c24JICAgPSBodG9ubChhc29jLT5jLmluaXRpYWxfdHNuKTsKKworCS8qIEhvdyBtYW55IGFkZHJlc3MgdHlwZXMgYXJlIG5lZWRlZD8gKi8KKwlzcCA9IHNjdHBfc2soYXNvYy0+YmFzZS5zayk7CisJbnVtX3R5cGVzID0gc3AtPnBmLT5zdXBwb3J0ZWRfYWRkcnMoc3AsIHR5cGVzKTsKKworCWNodW5rc2l6ZSA9IHNpemVvZihpbml0KSArIGFkZHJzX2xlbiArIFNDVFBfU0FUX0xFTihudW1fdHlwZXMpOworCWNodW5rc2l6ZSArPSBzaXplb2YoZWNhcF9wYXJhbSk7CisJaWYgKHNjdHBfcHJzY3RwX2VuYWJsZSkKKwkJY2h1bmtzaXplICs9IHNpemVvZihwcnNjdHBfcGFyYW0pOworCWNodW5rc2l6ZSArPSBzaXplb2YoYWlwYXJhbSk7CisJY2h1bmtzaXplICs9IHZwYXJhbV9sZW47CisKKwkvKiBSRkMgMjk2MCAzLjMuMiBJbml0aWF0aW9uIChJTklUKSAoMSkKKwkgKgorCSAqIE5vdGUgMzogQW4gSU5JVCBjaHVuayBNVVNUIE5PVCBjb250YWluIG1vcmUgdGhhbiBvbmUgSG9zdAorCSAqIE5hbWUgYWRkcmVzcyBwYXJhbWV0ZXIuIE1vcmVvdmVyLCB0aGUgc2VuZGVyIG9mIHRoZSBJTklUCisJICogTVVTVCBOT1QgY29tYmluZSBhbnkgb3RoZXIgYWRkcmVzcyB0eXBlcyB3aXRoIHRoZSBIb3N0IE5hbWUKKwkgKiBhZGRyZXNzIGluIHRoZSBJTklULiBUaGUgcmVjZWl2ZXIgb2YgSU5JVCBNVVNUIGlnbm9yZSBhbnkKKwkgKiBvdGhlciBhZGRyZXNzIHR5cGVzIGlmIHRoZSBIb3N0IE5hbWUgYWRkcmVzcyBwYXJhbWV0ZXIgaXMKKwkgKiBwcmVzZW50IGluIHRoZSByZWNlaXZlZCBJTklUIGNodW5rLgorCSAqCisJICogUExFQVNFIERPIE5PVCBGSVhNRSBbVGhpcyB2ZXJzaW9uIGRvZXMgbm90IHN1cHBvcnQgSG9zdCBOYW1lLl0KKwkgKi8KKworCXJldHZhbCA9IHNjdHBfbWFrZV9jaHVuayhhc29jLCBTQ1RQX0NJRF9JTklULCAwLCBjaHVua3NpemUpOworCWlmICghcmV0dmFsKQorCQlnb3RvIG5vZGF0YTsKKworCXJldHZhbC0+c3ViaC5pbml0X2hkciA9CisJCXNjdHBfYWRkdG9fY2h1bmsocmV0dmFsLCBzaXplb2YoaW5pdCksICZpbml0KTsKKwlyZXR2YWwtPnBhcmFtX2hkci52ID0KKwkJc2N0cF9hZGR0b19jaHVuayhyZXR2YWwsIGFkZHJzX2xlbiwgYWRkcnMudik7CisKKwkvKiBSRkMgMjk2MCAzLjMuMiBJbml0aWF0aW9uIChJTklUKSAoMSkKKwkgKgorCSAqIE5vdGUgNDogVGhpcyBwYXJhbWV0ZXIsIHdoZW4gcHJlc2VudCwgc3BlY2lmaWVzIGFsbCB0aGUKKwkgKiBhZGRyZXNzIHR5cGVzIHRoZSBzZW5kaW5nIGVuZHBvaW50IGNhbiBzdXBwb3J0LiBUaGUgYWJzZW5jZQorCSAqIG9mIHRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyB0aGF0IHRoZSBzZW5kaW5nIGVuZHBvaW50IGNhbgorCSAqIHN1cHBvcnQgYW55IGFkZHJlc3MgdHlwZS4KKwkgKi8KKwlzYXQucGFyYW1faGRyLnR5cGUgPSBTQ1RQX1BBUkFNX1NVUFBPUlRFRF9BRERSRVNTX1RZUEVTOworCXNhdC5wYXJhbV9oZHIubGVuZ3RoID0gaHRvbnMoU0NUUF9TQVRfTEVOKG51bV90eXBlcykpOworCXNjdHBfYWRkdG9fY2h1bmsocmV0dmFsLCBzaXplb2Yoc2F0KSwgJnNhdCk7CisJc2N0cF9hZGR0b19jaHVuayhyZXR2YWwsIG51bV90eXBlcyAqIHNpemVvZihfX3UxNiksICZ0eXBlcyk7CisKKwlzY3RwX2FkZHRvX2NodW5rKHJldHZhbCwgc2l6ZW9mKGVjYXBfcGFyYW0pLCAmZWNhcF9wYXJhbSk7CisJaWYgKHNjdHBfcHJzY3RwX2VuYWJsZSkKKwkJc2N0cF9hZGR0b19jaHVuayhyZXR2YWwsIHNpemVvZihwcnNjdHBfcGFyYW0pLCAmcHJzY3RwX3BhcmFtKTsKKwlhaXBhcmFtLnBhcmFtX2hkci50eXBlID0gU0NUUF9QQVJBTV9BREFQVElPTl9MQVlFUl9JTkQ7CisJYWlwYXJhbS5wYXJhbV9oZHIubGVuZ3RoID0gaHRvbnMoc2l6ZW9mKGFpcGFyYW0pKTsKKwlhaXBhcmFtLmFkYXB0aW9uX2luZCA9IGh0b25sKHNwLT5hZGFwdGlvbl9pbmQpOworCXNjdHBfYWRkdG9fY2h1bmsocmV0dmFsLCBzaXplb2YoYWlwYXJhbSksICZhaXBhcmFtKTsKK25vZGF0YToKKwlpZiAoYWRkcnMudikKKwkJa2ZyZWUoYWRkcnMudik7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfbWFrZV9pbml0X2Fjayhjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkgY29uc3Qgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLAorCQkJCSBpbnQgZ2ZwLCBpbnQgdW5rcGFyYW1fbGVuKQoreworCXNjdHBfaW5pdGhkcl90IGluaXRhY2s7CisJc3RydWN0IHNjdHBfY2h1bmsgKnJldHZhbDsKKwl1bmlvbiBzY3RwX3BhcmFtcyBhZGRyczsKKwlpbnQgYWRkcnNfbGVuOworCXNjdHBfY29va2llX3BhcmFtX3QgKmNvb2tpZTsKKwlpbnQgY29va2llX2xlbjsKKwlzaXplX3QgY2h1bmtzaXplOworCXNjdHBfYWRhcHRpb25faW5kX3BhcmFtX3QgYWlwYXJhbTsKKworCXJldHZhbCA9IE5VTEw7CisKKwkvKiBOb3RlOiB0aGVyZSBtYXkgYmUgbm8gYWRkcmVzc2VzIHRvIGVtYmVkLiAqLworCWFkZHJzID0gc2N0cF9iaW5kX2FkZHJzX3RvX3JhdygmYXNvYy0+YmFzZS5iaW5kX2FkZHIsICZhZGRyc19sZW4sIGdmcCk7CisKKwlpbml0YWNrLmluaXRfdGFnCSAgICAgICAgPSBodG9ubChhc29jLT5jLm15X3Z0YWcpOworCWluaXRhY2suYV9yd25kCQkJPSBodG9ubChhc29jLT5yd25kKTsKKwlpbml0YWNrLm51bV9vdXRib3VuZF9zdHJlYW1zCT0gaHRvbnMoYXNvYy0+Yy5zaW5pdF9udW1fb3N0cmVhbXMpOworCWluaXRhY2subnVtX2luYm91bmRfc3RyZWFtcwk9IGh0b25zKGFzb2MtPmMuc2luaXRfbWF4X2luc3RyZWFtcyk7CisJaW5pdGFjay5pbml0aWFsX3RzbgkJPSBodG9ubChhc29jLT5jLmluaXRpYWxfdHNuKTsKKworCS8qIEZJWE1FOiAgV2UgcmVhbGx5IG91Z2h0IHRvIGJ1aWxkIHRoZSBjb29raWUgcmlnaHQKKwkgKiBpbnRvIHRoZSBwYWNrZXQgaW5zdGVhZCBvZiBhbGxvY2F0aW5nIG1vcmUgZnJlc2ggbWVtb3J5LgorCSAqLworCWNvb2tpZSA9IHNjdHBfcGFja19jb29raWUoYXNvYy0+ZXAsIGFzb2MsIGNodW5rLCAmY29va2llX2xlbiwKKwkJCQkgIGFkZHJzLnYsIGFkZHJzX2xlbik7CisJaWYgKCFjb29raWUpCisJCWdvdG8gbm9tZW1fY29va2llOworCisJLyogQ2FsY3VsYXRlIHRoZSB0b3RhbCBzaXplIG9mIGFsbG9jYXRpb24sIGluY2x1ZGUgdGhlIHJlc2VydmVkCisJICogc3BhY2UgZm9yIHJlcG9ydGluZyB1bmtub3duIHBhcmFtZXRlcnMgaWYgaXQgaXMgc3BlY2lmaWVkLgorCSAqLworCWNodW5rc2l6ZSA9IHNpemVvZihpbml0YWNrKSArIGFkZHJzX2xlbiArIGNvb2tpZV9sZW4gKyB1bmtwYXJhbV9sZW47CisKKyAgICAgICAgLyogVGVsbCBwZWVyIHRoYXQgd2UnbGwgZG8gRUNOIG9ubHkgaWYgcGVlciBhZHZlcnRpc2VkIHN1Y2ggY2FwLiAgKi8KKwlpZiAoYXNvYy0+cGVlci5lY25fY2FwYWJsZSkKKwkJY2h1bmtzaXplICs9IHNpemVvZihlY2FwX3BhcmFtKTsKKworICAgICAgICAvKiBUZWxsIHBlZXIgdGhhdCB3ZSdsbCBkbyBQUi1TQ1RQIG9ubHkgaWYgcGVlciBhZHZlcnRpc2VkLiAgKi8KKwlpZiAoYXNvYy0+cGVlci5wcnNjdHBfY2FwYWJsZSkKKwkJY2h1bmtzaXplICs9IHNpemVvZihwcnNjdHBfcGFyYW0pOworCisJY2h1bmtzaXplICs9IHNpemVvZihhaXBhcmFtKTsKKworCS8qIE5vdyBhbGxvY2F0ZSBhbmQgZmlsbCBvdXQgdGhlIGNodW5rLiAgKi8KKwlyZXR2YWwgPSBzY3RwX21ha2VfY2h1bmsoYXNvYywgU0NUUF9DSURfSU5JVF9BQ0ssIDAsIGNodW5rc2l6ZSk7CisJaWYgKCFyZXR2YWwpCisJCWdvdG8gbm9tZW1fY2h1bms7CisKKwkvKiBQZXIgdGhlIGFkdmljZSBpbiBSRkMgMjk2MCA2LjQsIHNlbmQgdGhpcyByZXBseSB0bworCSAqIHRoZSBzb3VyY2Ugb2YgdGhlIElOSVQgcGFja2V0LgorCSAqLworCXJldHZhbC0+dHJhbnNwb3J0ID0gY2h1bmstPnRyYW5zcG9ydDsKKwlyZXR2YWwtPnN1YmguaW5pdF9oZHIgPQorCQlzY3RwX2FkZHRvX2NodW5rKHJldHZhbCwgc2l6ZW9mKGluaXRhY2spLCAmaW5pdGFjayk7CisJcmV0dmFsLT5wYXJhbV9oZHIudiA9IHNjdHBfYWRkdG9fY2h1bmsocmV0dmFsLCBhZGRyc19sZW4sIGFkZHJzLnYpOworCXNjdHBfYWRkdG9fY2h1bmsocmV0dmFsLCBjb29raWVfbGVuLCBjb29raWUpOworCWlmIChhc29jLT5wZWVyLmVjbl9jYXBhYmxlKQorCQlzY3RwX2FkZHRvX2NodW5rKHJldHZhbCwgc2l6ZW9mKGVjYXBfcGFyYW0pLCAmZWNhcF9wYXJhbSk7CisJaWYgKGFzb2MtPnBlZXIucHJzY3RwX2NhcGFibGUpCisJCXNjdHBfYWRkdG9fY2h1bmsocmV0dmFsLCBzaXplb2YocHJzY3RwX3BhcmFtKSwgJnByc2N0cF9wYXJhbSk7CisKKwlhaXBhcmFtLnBhcmFtX2hkci50eXBlID0gU0NUUF9QQVJBTV9BREFQVElPTl9MQVlFUl9JTkQ7CisJYWlwYXJhbS5wYXJhbV9oZHIubGVuZ3RoID0gaHRvbnMoc2l6ZW9mKGFpcGFyYW0pKTsKKwlhaXBhcmFtLmFkYXB0aW9uX2luZCA9IGh0b25sKHNjdHBfc2soYXNvYy0+YmFzZS5zayktPmFkYXB0aW9uX2luZCk7CisJc2N0cF9hZGR0b19jaHVuayhyZXR2YWwsIHNpemVvZihhaXBhcmFtKSwgJmFpcGFyYW0pOworCisJLyogV2UgbmVlZCB0byByZW1vdmUgdGhlIGNvbnN0IHF1YWxpZmllciBhdCB0aGlzIHBvaW50LiAgKi8KKwlyZXR2YWwtPmFzb2MgPSAoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKikgYXNvYzsKKworCS8qIFJGQyAyOTYwIDYuNCBNdWx0aS1ob21lZCBTQ1RQIEVuZHBvaW50cworCSAqCisJICogQW4gZW5kcG9pbnQgU0hPVUxEIHRyYW5zbWl0IHJlcGx5IGNodW5rcyAoZS5nLiwgU0FDSywKKwkgKiBIRUFSVEJFQVQgQUNLLCAqIGV0Yy4pIHRvIHRoZSBzYW1lIGRlc3RpbmF0aW9uIHRyYW5zcG9ydAorCSAqIGFkZHJlc3MgZnJvbSB3aGljaCBpdCByZWNlaXZlZCB0aGUgREFUQSBvciBjb250cm9sIGNodW5rCisJICogdG8gd2hpY2ggaXQgaXMgcmVwbHlpbmcuCisJICoKKwkgKiBbSU5JVCBBQ0sgYmFjayB0byB3aGVyZSB0aGUgSU5JVCBjYW1lIGZyb20uXQorCSAqLworCWlmIChjaHVuaykKKwkJcmV0dmFsLT50cmFuc3BvcnQgPSBjaHVuay0+dHJhbnNwb3J0OworCitub21lbV9jaHVuazoKKwlrZnJlZShjb29raWUpOworbm9tZW1fY29va2llOgorCWlmIChhZGRycy52KQorCQlrZnJlZShhZGRycy52KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiAzLjMuMTEgQ29va2llIEVjaG8gKENPT0tJRSBFQ0hPKSAoMTApOgorICoKKyAqIFRoaXMgY2h1bmsgaXMgdXNlZCBvbmx5IGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYW4gYXNzb2NpYXRpb24uCisgKiBJdCBpcyBzZW50IGJ5IHRoZSBpbml0aWF0b3Igb2YgYW4gYXNzb2NpYXRpb24gdG8gaXRzIHBlZXIgdG8gY29tcGxldGUKKyAqIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzLiBUaGlzIGNodW5rIE1VU1QgcHJlY2VkZSBhbnkgREFUQSBjaHVuaworICogc2VudCB3aXRoaW4gdGhlIGFzc29jaWF0aW9uLCBidXQgTUFZIGJlIGJ1bmRsZWQgd2l0aCBvbmUgb3IgbW9yZSBEQVRBCisgKiBjaHVua3MgaW4gdGhlIHNhbWUgcGFja2V0LgorICoKKyAqICAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICogICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAqICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogICAgIHwgICBUeXBlID0gMTAgICB8Q2h1bmsgIEZsYWdzICAgfCAgICAgICAgIExlbmd0aCAgICAgICAgICAgICAgICB8CisgKiAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqICAgICAvICAgICAgICAgICAgICAgICAgICAgQ29va2llICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLworICogICAgIFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgKiAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqCisgKiBDaHVuayBGbGFnczogOCBiaXQKKyAqCisgKiAgIFNldCB0byB6ZXJvIG9uIHRyYW5zbWl0IGFuZCBpZ25vcmVkIG9uIHJlY2VpcHQuCisgKgorICogTGVuZ3RoOiAxNiBiaXRzICh1bnNpZ25lZCBpbnRlZ2VyKQorICoKKyAqICAgU2V0IHRvIHRoZSBzaXplIG9mIHRoZSBjaHVuayBpbiBieXRlcywgaW5jbHVkaW5nIHRoZSA0IGJ5dGVzIG9mCisgKiAgIHRoZSBjaHVuayBoZWFkZXIgYW5kIHRoZSBzaXplIG9mIHRoZSBDb29raWUuCisgKgorICogQ29va2llOiB2YXJpYWJsZSBzaXplCisgKgorICogICBUaGlzIGZpZWxkIG11c3QgY29udGFpbiB0aGUgZXhhY3QgY29va2llIHJlY2VpdmVkIGluIHRoZQorICogICBTdGF0ZSBDb29raWUgcGFyYW1ldGVyIGZyb20gdGhlIHByZXZpb3VzIElOSVQgQUNLLgorICoKKyAqICAgQW4gaW1wbGVtZW50YXRpb24gU0hPVUxEIG1ha2UgdGhlIGNvb2tpZSBhcyBzbWFsbCBhcyBwb3NzaWJsZQorICogICB0byBpbnN1cmUgaW50ZXJvcGVyYWJpbGl0eS4KKyAqLworc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfbWFrZV9jb29raWVfZWNobyhjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkgICAgY29uc3Qgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rKQoreworCXN0cnVjdCBzY3RwX2NodW5rICpyZXR2YWw7CisJdm9pZCAqY29va2llOworCWludCBjb29raWVfbGVuOworCisJY29va2llID0gYXNvYy0+cGVlci5jb29raWU7CisJY29va2llX2xlbiA9IGFzb2MtPnBlZXIuY29va2llX2xlbjsKKworCS8qIEJ1aWxkIGEgY29va2llIGVjaG8gY2h1bmsuICAqLworCXJldHZhbCA9IHNjdHBfbWFrZV9jaHVuayhhc29jLCBTQ1RQX0NJRF9DT09LSUVfRUNITywgMCwgY29va2llX2xlbik7CisJaWYgKCFyZXR2YWwpCisJCWdvdG8gbm9kYXRhOworCXJldHZhbC0+c3ViaC5jb29raWVfaGRyID0KKwkJc2N0cF9hZGR0b19jaHVuayhyZXR2YWwsIGNvb2tpZV9sZW4sIGNvb2tpZSk7CisKKwkvKiBSRkMgMjk2MCA2LjQgTXVsdGktaG9tZWQgU0NUUCBFbmRwb2ludHMKKwkgKgorCSAqIEFuIGVuZHBvaW50IFNIT1VMRCB0cmFuc21pdCByZXBseSBjaHVua3MgKGUuZy4sIFNBQ0ssCisJICogSEVBUlRCRUFUIEFDSywgKiBldGMuKSB0byB0aGUgc2FtZSBkZXN0aW5hdGlvbiB0cmFuc3BvcnQKKwkgKiBhZGRyZXNzIGZyb20gd2hpY2ggaXQgKiByZWNlaXZlZCB0aGUgREFUQSBvciBjb250cm9sIGNodW5rCisJICogdG8gd2hpY2ggaXQgaXMgcmVwbHlpbmcuCisJICoKKwkgKiBbQ09PS0lFIEVDSE8gYmFjayB0byB3aGVyZSB0aGUgSU5JVCBBQ0sgY2FtZSBmcm9tLl0KKwkgKi8KKwlpZiAoY2h1bmspCisJCXJldHZhbC0+dHJhbnNwb3J0ID0gY2h1bmstPnRyYW5zcG9ydDsKKworbm9kYXRhOgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qIDMuMy4xMiBDb29raWUgQWNrbm93bGVkZ2VtZW50IChDT09LSUUgQUNLKSAoMTEpOgorICoKKyAqIFRoaXMgY2h1bmsgaXMgdXNlZCBvbmx5IGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYW4KKyAqIGFzc29jaWF0aW9uLiAgSXQgaXMgdXNlZCB0byBhY2tub3dsZWRnZSB0aGUgcmVjZWlwdCBvZiBhIENPT0tJRQorICogRUNITyBjaHVuay4gIFRoaXMgY2h1bmsgTVVTVCBwcmVjZWRlIGFueSBEQVRBIG9yIFNBQ0sgY2h1bmsgc2VudAorICogd2l0aGluIHRoZSBhc3NvY2lhdGlvbiwgYnV0IE1BWSBiZSBidW5kbGVkIHdpdGggb25lIG9yIG1vcmUgREFUQQorICogY2h1bmtzIG9yIFNBQ0sgY2h1bmsgaW4gdGhlIHNhbWUgU0NUUCBwYWNrZXQuCisgKgorICogICAgICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgKiAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICogICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiAgICAgfCAgIFR5cGUgPSAxMSAgIHxDaHVuayAgRmxhZ3MgICB8ICAgICBMZW5ndGggPSA0ICAgICAgICAgICAgICAgIHwKKyAqICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICoKKyAqIENodW5rIEZsYWdzOiA4IGJpdHMKKyAqCisgKiAgIFNldCB0byB6ZXJvIG9uIHRyYW5zbWl0IGFuZCBpZ25vcmVkIG9uIHJlY2VpcHQuCisgKi8KK3N0cnVjdCBzY3RwX2NodW5rICpzY3RwX21ha2VfY29va2llX2Fjayhjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkgICBjb25zdCBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmspCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKnJldHZhbDsKKworCXJldHZhbCA9IHNjdHBfbWFrZV9jaHVuayhhc29jLCBTQ1RQX0NJRF9DT09LSUVfQUNLLCAwLCAwKTsKKworCS8qIFJGQyAyOTYwIDYuNCBNdWx0aS1ob21lZCBTQ1RQIEVuZHBvaW50cworCSAqCisJICogQW4gZW5kcG9pbnQgU0hPVUxEIHRyYW5zbWl0IHJlcGx5IGNodW5rcyAoZS5nLiwgU0FDSywKKwkgKiBIRUFSVEJFQVQgQUNLLCAqIGV0Yy4pIHRvIHRoZSBzYW1lIGRlc3RpbmF0aW9uIHRyYW5zcG9ydAorCSAqIGFkZHJlc3MgZnJvbSB3aGljaCBpdCAqIHJlY2VpdmVkIHRoZSBEQVRBIG9yIGNvbnRyb2wgY2h1bmsKKwkgKiB0byB3aGljaCBpdCBpcyByZXBseWluZy4KKwkgKgorCSAqIFtDT09LSUUgQUNLIGJhY2sgdG8gd2hlcmUgdGhlIENPT0tJRSBFQ0hPIGNhbWUgZnJvbS5dCisJICovCisJaWYgKHJldHZhbCAmJiBjaHVuaykKKwkJcmV0dmFsLT50cmFuc3BvcnQgPSBjaHVuay0+dHJhbnNwb3J0OworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqICBBcHBlbmRpeCBBOiBFeHBsaWNpdCBDb25nZXN0aW9uIE5vdGlmaWNhdGlvbjoKKyAqICBDV1I6CisgKgorICogIFJGQyAyNDgxIGRldGFpbHMgYSBzcGVjaWZpYyBiaXQgZm9yIGEgc2VuZGVyIHRvIHNlbmQgaW4gdGhlIGhlYWRlciBvZgorICogIGl0cyBuZXh0IG91dGJvdW5kIFRDUCBzZWdtZW50IHRvIGluZGljYXRlIHRvIGl0cyBwZWVyIHRoYXQgaXQgaGFzCisgKiAgcmVkdWNlZCBpdHMgY29uZ2VzdGlvbiB3aW5kb3cuICBUaGlzIGlzIHRlcm1lZCB0aGUgQ1dSIGJpdC4gIEZvcgorICogIFNDVFAgdGhlIHNhbWUgaW5kaWNhdGlvbiBpcyBtYWRlIGJ5IGluY2x1ZGluZyB0aGUgQ1dSIGNodW5rLgorICogIFRoaXMgY2h1bmsgY29udGFpbnMgb25lIGRhdGEgZWxlbWVudCwgaS5lLiB0aGUgVFNOIG51bWJlciB0aGF0CisgKiAgd2FzIHNlbnQgaW4gdGhlIEVDTkUgY2h1bmsuICBUaGlzIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbG93ZXN0CisgKiAgVFNOIG51bWJlciBpbiB0aGUgZGF0YWdyYW0gdGhhdCB3YXMgb3JpZ2luYWxseSBtYXJrZWQgd2l0aCB0aGUKKyAqICBDRSBiaXQuCisgKgorICogICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAqICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiAgICB8IENodW5rIFR5cGU9MTMgfCBGbGFncz0wMDAwMDAwMHwgICAgQ2h1bmsgTGVuZ3RoID0gOCAgICAgICAgICAgfAorICogICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgTG93ZXN0IFRTTiBOdW1iZXIgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICoKKyAqICAgICBOb3RlOiBUaGUgQ1dSIGlzIGNvbnNpZGVyZWQgYSBDb250cm9sIGNodW5rLgorICovCitzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9tYWtlX2N3cihjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCSAgICBjb25zdCBfX3UzMiBsb3dlc3RfdHNuLAorCQkJICAgIGNvbnN0IHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaykKK3sKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqcmV0dmFsOworCXNjdHBfY3dyaGRyX3QgY3dyOworCisJY3dyLmxvd2VzdF90c24gPSBodG9ubChsb3dlc3RfdHNuKTsKKwlyZXR2YWwgPSBzY3RwX21ha2VfY2h1bmsoYXNvYywgU0NUUF9DSURfRUNOX0NXUiwgMCwKKwkJCQkgc2l6ZW9mKHNjdHBfY3dyaGRyX3QpKTsKKworCWlmICghcmV0dmFsKQorCQlnb3RvIG5vZGF0YTsKKworCXJldHZhbC0+c3ViaC5lY25fY3dyX2hkciA9CisJCXNjdHBfYWRkdG9fY2h1bmsocmV0dmFsLCBzaXplb2YoY3dyKSwgJmN3cik7CisKKwkvKiBSRkMgMjk2MCA2LjQgTXVsdGktaG9tZWQgU0NUUCBFbmRwb2ludHMKKwkgKgorCSAqIEFuIGVuZHBvaW50IFNIT1VMRCB0cmFuc21pdCByZXBseSBjaHVua3MgKGUuZy4sIFNBQ0ssCisJICogSEVBUlRCRUFUIEFDSywgKiBldGMuKSB0byB0aGUgc2FtZSBkZXN0aW5hdGlvbiB0cmFuc3BvcnQKKwkgKiBhZGRyZXNzIGZyb20gd2hpY2ggaXQgKiByZWNlaXZlZCB0aGUgREFUQSBvciBjb250cm9sIGNodW5rCisJICogdG8gd2hpY2ggaXQgaXMgcmVwbHlpbmcuCisJICoKKwkgKiBbUmVwb3J0IGEgcmVkdWNlZCBjb25nZXN0aW9uIHdpbmRvdyBiYWNrIHRvIHdoZXJlIHRoZSBFQ05FCisJICogY2FtZSBmcm9tLl0KKwkgKi8KKwlpZiAoY2h1bmspCisJCXJldHZhbC0+dHJhbnNwb3J0ID0gY2h1bmstPnRyYW5zcG9ydDsKKworbm9kYXRhOgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qIE1ha2UgYW4gRUNORSBjaHVuay4gIFRoaXMgaXMgYSBjb25nZXN0aW9uIGV4cGVyaWVuY2VkIHJlcG9ydC4gICovCitzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9tYWtlX2VjbmUoY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkgICAgIGNvbnN0IF9fdTMyIGxvd2VzdF90c24pCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKnJldHZhbDsKKwlzY3RwX2VjbmVoZHJfdCBlY25lOworCisJZWNuZS5sb3dlc3RfdHNuID0gaHRvbmwobG93ZXN0X3Rzbik7CisJcmV0dmFsID0gc2N0cF9tYWtlX2NodW5rKGFzb2MsIFNDVFBfQ0lEX0VDTl9FQ05FLCAwLAorCQkJCSBzaXplb2Yoc2N0cF9lY25laGRyX3QpKTsKKwlpZiAoIXJldHZhbCkKKwkJZ290byBub2RhdGE7CisJcmV0dmFsLT5zdWJoLmVjbmVfaGRyID0KKwkJc2N0cF9hZGR0b19jaHVuayhyZXR2YWwsIHNpemVvZihlY25lKSwgJmVjbmUpOworCitub2RhdGE6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogTWFrZSBhIERBVEEgY2h1bmsgZm9yIHRoZSBnaXZlbiBhc3NvY2lhdGlvbiBmcm9tIHRoZSBwcm92aWRlZAorICogcGFyYW1ldGVycy4gIEhvd2V2ZXIsIGRvIG5vdCBwb3B1bGF0ZSB0aGUgZGF0YSBwYXlsb2FkLgorICovCitzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9tYWtlX2RhdGFmcmFnX2VtcHR5KHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICpzaW5mbywKKwkJCQkgICAgICAgaW50IGRhdGFfbGVuLCBfX3U4IGZsYWdzLCBfX3UxNiBzc24pCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKnJldHZhbDsKKwlzdHJ1Y3Qgc2N0cF9kYXRhaGRyIGRwOworCWludCBjaHVua19sZW47CisKKwkvKiBXZSBhc3NpZ24gdGhlIFRTTiBhcyBMQVRFIGFzIHBvc3NpYmxlLCBub3QgaGVyZSB3aGVuCisJICogY3JlYXRpbmcgdGhlIGNodW5rLgorCSAqLworCWRwLnRzbiA9IDA7CisJZHAuc3RyZWFtID0gaHRvbnMoc2luZm8tPnNpbmZvX3N0cmVhbSk7CisJZHAucHBpZCAgID0gc2luZm8tPnNpbmZvX3BwaWQ7CisKKwkvKiBTZXQgdGhlIGZsYWdzIGZvciBhbiB1bm9yZGVyZWQgc2VuZC4gICovCisJaWYgKHNpbmZvLT5zaW5mb19mbGFncyAmIE1TR19VTk9SREVSRUQpIHsKKwkJZmxhZ3MgfD0gU0NUUF9EQVRBX1VOT1JERVJFRDsKKwkJZHAuc3NuID0gMDsKKwl9IGVsc2UKKwkJZHAuc3NuID0gaHRvbnMoc3NuKTsKKworCWNodW5rX2xlbiA9IHNpemVvZihkcCkgKyBkYXRhX2xlbjsKKwlyZXR2YWwgPSBzY3RwX21ha2VfY2h1bmsoYXNvYywgU0NUUF9DSURfREFUQSwgZmxhZ3MsIGNodW5rX2xlbik7CisJaWYgKCFyZXR2YWwpCisJCWdvdG8gbm9kYXRhOworCisJcmV0dmFsLT5zdWJoLmRhdGFfaGRyID0gc2N0cF9hZGR0b19jaHVuayhyZXR2YWwsIHNpemVvZihkcCksICZkcCk7CisJbWVtY3B5KCZyZXR2YWwtPnNpbmZvLCBzaW5mbywgc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKworbm9kYXRhOgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qIENyZWF0ZSBhIHNlbGVjdGl2ZSBhY2tvd2xlZGdlbWVudCAoU0FDSykgZm9yIHRoZSBnaXZlbgorICogYXNzb2NpYXRpb24uICBUaGlzIHJlcG9ydHMgb24gd2hpY2ggVFNOJ3Mgd2UndmUgc2VlbiB0byBkYXRlLAorICogaW5jbHVkaW5nIGR1cGxpY2F0ZXMgYW5kIGdhcHMuCisgKi8KK3N0cnVjdCBzY3RwX2NodW5rICpzY3RwX21ha2Vfc2Fjayhjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYykKK3sKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqcmV0dmFsOworCXN0cnVjdCBzY3RwX3NhY2toZHIgc2FjazsKKwlpbnQgbGVuOworCV9fdTMyIGN0c247CisJX191MTYgbnVtX2dhYnMsIG51bV9kdXBfdHNuczsKKwlzdHJ1Y3Qgc2N0cF90c25tYXAgKm1hcCA9IChzdHJ1Y3Qgc2N0cF90c25tYXAgKikmYXNvYy0+cGVlci50c25fbWFwOworCisJY3RzbiA9IHNjdHBfdHNubWFwX2dldF9jdHNuKG1hcCk7CisJU0NUUF9ERUJVR19QUklOVEsoInNhY2tDVFNOQWNrIHNlbnQ6ICAweCV4LlxuIiwgY3Rzbik7CisKKwkvKiBIb3cgbXVjaCByb29tIGlzIG5lZWRlZCBpbiB0aGUgY2h1bms/ICovCisJbnVtX2dhYnMgPSBzY3RwX3Rzbm1hcF9udW1fZ2FicyhtYXApOworCW51bV9kdXBfdHNucyA9IHNjdHBfdHNubWFwX251bV9kdXBzKG1hcCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBTQUNLIGhlYWRlci4gICovCisJc2Fjay5jdW1fdHNuX2FjawkgICAgPSBodG9ubChjdHNuKTsKKwlzYWNrLmFfcnduZCAJCSAgICA9IGh0b25sKGFzb2MtPmFfcnduZCk7CisJc2Fjay5udW1fZ2FwX2Fja19ibG9ja3MgICAgID0gaHRvbnMobnVtX2dhYnMpOworCXNhY2subnVtX2R1cF90c25zICAgICAgICAgICA9IGh0b25zKG51bV9kdXBfdHNucyk7CisKKwlsZW4gPSBzaXplb2Yoc2FjaykKKwkJKyBzaXplb2Yoc3RydWN0IHNjdHBfZ2FwX2Fja19ibG9jaykgKiBudW1fZ2FicworCQkrIHNpemVvZihfX3UzMikgKiBudW1fZHVwX3RzbnM7CisKKwkvKiBDcmVhdGUgdGhlIGNodW5rLiAgKi8KKwlyZXR2YWwgPSBzY3RwX21ha2VfY2h1bmsoYXNvYywgU0NUUF9DSURfU0FDSywgMCwgbGVuKTsKKwlpZiAoIXJldHZhbCkKKwkJZ290byBub2RhdGE7CisKKwkvKiBSRkMgMjk2MCA2LjQgTXVsdGktaG9tZWQgU0NUUCBFbmRwb2ludHMKKwkgKgorCSAqIEFuIGVuZHBvaW50IFNIT1VMRCB0cmFuc21pdCByZXBseSBjaHVua3MgKGUuZy4sIFNBQ0ssCisJICogSEVBUlRCRUFUIEFDSywgZXRjLikgdG8gdGhlIHNhbWUgZGVzdGluYXRpb24gdHJhbnNwb3J0CisJICogYWRkcmVzcyBmcm9tIHdoaWNoIGl0IHJlY2VpdmVkIHRoZSBEQVRBIG9yIGNvbnRyb2wgY2h1bmsgdG8KKwkgKiB3aGljaCBpdCBpcyByZXBseWluZy4gIFRoaXMgcnVsZSBzaG91bGQgYWxzbyBiZSBmb2xsb3dlZCBpZgorCSAqIHRoZSBlbmRwb2ludCBpcyBidW5kbGluZyBEQVRBIGNodW5rcyB0b2dldGhlciB3aXRoIHRoZQorCSAqIHJlcGx5IGNodW5rLgorCSAqCisJICogSG93ZXZlciwgd2hlbiBhY2tub3dsZWRnaW5nIG11bHRpcGxlIERBVEEgY2h1bmtzIHJlY2VpdmVkCisJICogaW4gcGFja2V0cyBmcm9tIGRpZmZlcmVudCBzb3VyY2UgYWRkcmVzc2VzIGluIGEgc2luZ2xlCisJICogU0FDSywgdGhlIFNBQ0sgY2h1bmsgbWF5IGJlIHRyYW5zbWl0dGVkIHRvIG9uZSBvZiB0aGUKKwkgKiBkZXN0aW5hdGlvbiB0cmFuc3BvcnQgYWRkcmVzc2VzIGZyb20gd2hpY2ggdGhlIERBVEEgb3IKKwkgKiBjb250cm9sIGNodW5rcyBiZWluZyBhY2tub3dsZWRnZWQgd2VyZSByZWNlaXZlZC4KKwkgKgorCSAqIFtCVUc6ICBXZSBkbyBub3QgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgcGFyYWdyYXBoLgorCSAqIFBlcmhhcHMgd2Ugc2hvdWxkIHJlbWVtYmVyIHRoZSBsYXN0IHRyYW5zcG9ydCB3ZSB1c2VkIGZvciBhCisJICogU0FDSyBhbmQgYXZvaWQgdGhhdCAoaWYgcG9zc2libGUpIGlmIHdlIGhhdmUgc2VlbiBhbnkKKwkgKiBkdXBsaWNhdGVzLiAtLXBpZ2d5XQorCSAqCisJICogV2hlbiBhIHJlY2VpdmVyIG9mIGEgZHVwbGljYXRlIERBVEEgY2h1bmsgc2VuZHMgYSBTQUNLIHRvIGEKKwkgKiBtdWx0aS0gaG9tZWQgZW5kcG9pbnQgaXQgTUFZIGJlIGJlbmVmaWNpYWwgdG8gdmFyeSB0aGUKKwkgKiBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCBub3QgdXNlIHRoZSBzb3VyY2UgYWRkcmVzcyBvZiB0aGUKKwkgKiBEQVRBIGNodW5rLiAgVGhlIHJlYXNvbiBiZWluZyB0aGF0IHJlY2VpdmluZyBhIGR1cGxpY2F0ZQorCSAqIGZyb20gYSBtdWx0aS1ob21lZCBlbmRwb2ludCBtaWdodCBpbmRpY2F0ZSB0aGF0IHRoZSByZXR1cm4KKwkgKiBwYXRoIChhcyBzcGVjaWZpZWQgaW4gdGhlIHNvdXJjZSBhZGRyZXNzIG9mIHRoZSBEQVRBIGNodW5rKQorCSAqIGZvciB0aGUgU0FDSyBpcyBicm9rZW4uCisJICoKKwkgKiBbU2VuZCB0byB0aGUgYWRkcmVzcyBmcm9tIHdoaWNoIHdlIGxhc3QgcmVjZWl2ZWQgYSBEQVRBIGNodW5rLl0KKwkgKi8KKwlyZXR2YWwtPnRyYW5zcG9ydCA9IGFzb2MtPnBlZXIubGFzdF9kYXRhX2Zyb207CisKKwlyZXR2YWwtPnN1Ymguc2Fja19oZHIgPQorCQlzY3RwX2FkZHRvX2NodW5rKHJldHZhbCwgc2l6ZW9mKHNhY2spLCAmc2Fjayk7CisKKwkvKiBBZGQgdGhlIGdhcCBhY2sgYmxvY2sgaW5mb3JtYXRpb24uICAgKi8KKwlpZiAobnVtX2dhYnMpCisJCXNjdHBfYWRkdG9fY2h1bmsocmV0dmFsLCBzaXplb2YoX191MzIpICogbnVtX2dhYnMsCisJCQkJIHNjdHBfdHNubWFwX2dldF9nYWJzKG1hcCkpOworCisJLyogQWRkIHRoZSBkdXBsaWNhdGUgVFNOIGluZm9ybWF0aW9uLiAgKi8KKwlpZiAobnVtX2R1cF90c25zKQorCQlzY3RwX2FkZHRvX2NodW5rKHJldHZhbCwgc2l6ZW9mKF9fdTMyKSAqIG51bV9kdXBfdHNucywKKwkJCQkgc2N0cF90c25tYXBfZ2V0X2R1cHMobWFwKSk7CisKK25vZGF0YToKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBNYWtlIGEgU0hVVERPV04gY2h1bmsuICovCitzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9tYWtlX3NodXRkb3duKGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaykKK3sKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqcmV0dmFsOworCXNjdHBfc2h1dGRvd25oZHJfdCBzaHV0OworCV9fdTMyIGN0c247CisKKwljdHNuID0gc2N0cF90c25tYXBfZ2V0X2N0c24oJmFzb2MtPnBlZXIudHNuX21hcCk7CisJc2h1dC5jdW1fdHNuX2FjayA9IGh0b25sKGN0c24pOworCisJcmV0dmFsID0gc2N0cF9tYWtlX2NodW5rKGFzb2MsIFNDVFBfQ0lEX1NIVVRET1dOLCAwLAorCQkJCSBzaXplb2Yoc2N0cF9zaHV0ZG93bmhkcl90KSk7CisJaWYgKCFyZXR2YWwpCisJCWdvdG8gbm9kYXRhOworCisJcmV0dmFsLT5zdWJoLnNodXRkb3duX2hkciA9CisJCXNjdHBfYWRkdG9fY2h1bmsocmV0dmFsLCBzaXplb2Yoc2h1dCksICZzaHV0KTsKKworCWlmIChjaHVuaykKKwkJcmV0dmFsLT50cmFuc3BvcnQgPSBjaHVuay0+dHJhbnNwb3J0Oworbm9kYXRhOgorCXJldHVybiByZXR2YWw7Cit9CisKK3N0cnVjdCBzY3RwX2NodW5rICpzY3RwX21ha2Vfc2h1dGRvd25fYWNrKGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rKQoreworCXN0cnVjdCBzY3RwX2NodW5rICpyZXR2YWw7CisKKwlyZXR2YWwgPSBzY3RwX21ha2VfY2h1bmsoYXNvYywgU0NUUF9DSURfU0hVVERPV05fQUNLLCAwLCAwKTsKKworCS8qIFJGQyAyOTYwIDYuNCBNdWx0aS1ob21lZCBTQ1RQIEVuZHBvaW50cworCSAqCisJICogQW4gZW5kcG9pbnQgU0hPVUxEIHRyYW5zbWl0IHJlcGx5IGNodW5rcyAoZS5nLiwgU0FDSywKKwkgKiBIRUFSVEJFQVQgQUNLLCAqIGV0Yy4pIHRvIHRoZSBzYW1lIGRlc3RpbmF0aW9uIHRyYW5zcG9ydAorCSAqIGFkZHJlc3MgZnJvbSB3aGljaCBpdCAqIHJlY2VpdmVkIHRoZSBEQVRBIG9yIGNvbnRyb2wgY2h1bmsKKwkgKiB0byB3aGljaCBpdCBpcyByZXBseWluZy4KKwkgKgorCSAqIFtBQ0sgYmFjayB0byB3aGVyZSB0aGUgU0hVVERPV04gY2FtZSBmcm9tLl0KKwkgKi8KKwlpZiAocmV0dmFsICYmIGNodW5rKQorCQlyZXR2YWwtPnRyYW5zcG9ydCA9IGNodW5rLT50cmFuc3BvcnQ7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9tYWtlX3NodXRkb3duX2NvbXBsZXRlKAorCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCWNvbnN0IHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaykKK3sKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqcmV0dmFsOworCV9fdTggZmxhZ3MgPSAwOworCisJLyogTWF5YmUgc2V0IHRoZSBULWJpdCBpZiB3ZSBoYXZlIG5vIGFzc29jaWF0aW9uLiAqLworCWZsYWdzIHw9IGFzb2MgPyAwIDogU0NUUF9DSFVOS19GTEFHX1Q7CisKKwlyZXR2YWwgPSBzY3RwX21ha2VfY2h1bmsoYXNvYywgU0NUUF9DSURfU0hVVERPV05fQ09NUExFVEUsIGZsYWdzLCAwKTsKKworCS8qIFJGQyAyOTYwIDYuNCBNdWx0aS1ob21lZCBTQ1RQIEVuZHBvaW50cworCSAqCisJICogQW4gZW5kcG9pbnQgU0hPVUxEIHRyYW5zbWl0IHJlcGx5IGNodW5rcyAoZS5nLiwgU0FDSywKKwkgKiBIRUFSVEJFQVQgQUNLLCAqIGV0Yy4pIHRvIHRoZSBzYW1lIGRlc3RpbmF0aW9uIHRyYW5zcG9ydAorCSAqIGFkZHJlc3MgZnJvbSB3aGljaCBpdCAqIHJlY2VpdmVkIHRoZSBEQVRBIG9yIGNvbnRyb2wgY2h1bmsKKwkgKiB0byB3aGljaCBpdCBpcyByZXBseWluZy4KKwkgKgorCSAqIFtSZXBvcnQgU0hVVERPV04gQ09NUExFVEUgYmFjayB0byB3aGVyZSB0aGUgU0hVVERPV04gQUNLCisJICogY2FtZSBmcm9tLl0KKwkgKi8KKwlpZiAocmV0dmFsICYmIGNodW5rKQorCQlyZXR2YWwtPnRyYW5zcG9ydCA9IGNodW5rLT50cmFuc3BvcnQ7CisKKyAgICAgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyogQ3JlYXRlIGFuIEFCT1JULiAgTm90ZSB0aGF0IHdlIHNldCB0aGUgVCBiaXQgaWYgd2UgaGF2ZSBubworICogYXNzb2NpYXRpb24uCisgKi8KK3N0cnVjdCBzY3RwX2NodW5rICpzY3RwX21ha2VfYWJvcnQoY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkgICAgICBjb25zdCBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCisJCQkgICAgICBjb25zdCBzaXplX3QgaGludCkKK3sKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqcmV0dmFsOworCV9fdTggZmxhZ3MgPSAwOworCisJLyogTWF5YmUgc2V0IHRoZSBULWJpdCBpZiB3ZSBoYXZlIG5vIGFzc29jaWF0aW9uLiAgKi8KKwlmbGFncyB8PSBhc29jID8gMCA6IFNDVFBfQ0hVTktfRkxBR19UOworCisJcmV0dmFsID0gc2N0cF9tYWtlX2NodW5rKGFzb2MsIFNDVFBfQ0lEX0FCT1JULCBmbGFncywgaGludCk7CisKKwkvKiBSRkMgMjk2MCA2LjQgTXVsdGktaG9tZWQgU0NUUCBFbmRwb2ludHMKKwkgKgorCSAqIEFuIGVuZHBvaW50IFNIT1VMRCB0cmFuc21pdCByZXBseSBjaHVua3MgKGUuZy4sIFNBQ0ssCisJICogSEVBUlRCRUFUIEFDSywgKiBldGMuKSB0byB0aGUgc2FtZSBkZXN0aW5hdGlvbiB0cmFuc3BvcnQKKwkgKiBhZGRyZXNzIGZyb20gd2hpY2ggaXQgKiByZWNlaXZlZCB0aGUgREFUQSBvciBjb250cm9sIGNodW5rCisJICogdG8gd2hpY2ggaXQgaXMgcmVwbHlpbmcuCisJICoKKwkgKiBbQUJPUlQgYmFjayB0byB3aGVyZSB0aGUgb2ZmZW5kZXIgY2FtZSBmcm9tLl0KKwkgKi8KKwlpZiAocmV0dmFsICYmIGNodW5rKQorCQlyZXR2YWwtPnRyYW5zcG9ydCA9IGNodW5rLT50cmFuc3BvcnQ7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBIZWxwZXIgdG8gY3JlYXRlIEFCT1JUIHdpdGggYSBOT19VU0VSX0RBVEEgZXJyb3IuICAqLworc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfbWFrZV9hYm9ydF9ub19kYXRhKAorCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCWNvbnN0IHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywgX191MzIgdHNuKQoreworCXN0cnVjdCBzY3RwX2NodW5rICpyZXR2YWw7CisJX191MzIgcGF5bG9hZDsKKworCXJldHZhbCA9IHNjdHBfbWFrZV9hYm9ydChhc29jLCBjaHVuaywgc2l6ZW9mKHNjdHBfZXJyaGRyX3QpCisJCQkJICsgc2l6ZW9mKHRzbikpOworCisJaWYgKCFyZXR2YWwpCisJCWdvdG8gbm9fbWVtOworCisJLyogUHV0IHRoZSB0c24gYmFjayBpbnRvIG5ldHdvcmsgYnl0ZSBvcmRlci4gICovCisJcGF5bG9hZCA9IGh0b25sKHRzbik7CisJc2N0cF9pbml0X2NhdXNlKHJldHZhbCwgU0NUUF9FUlJPUl9OT19EQVRBLCAoY29uc3Qgdm9pZCAqKSZwYXlsb2FkLAorCQkJc2l6ZW9mKHBheWxvYWQpKTsKKworCS8qIFJGQyAyOTYwIDYuNCBNdWx0aS1ob21lZCBTQ1RQIEVuZHBvaW50cworCSAqCisJICogQW4gZW5kcG9pbnQgU0hPVUxEIHRyYW5zbWl0IHJlcGx5IGNodW5rcyAoZS5nLiwgU0FDSywKKwkgKiBIRUFSVEJFQVQgQUNLLCAqIGV0Yy4pIHRvIHRoZSBzYW1lIGRlc3RpbmF0aW9uIHRyYW5zcG9ydAorCSAqIGFkZHJlc3MgZnJvbSB3aGljaCBpdCAqIHJlY2VpdmVkIHRoZSBEQVRBIG9yIGNvbnRyb2wgY2h1bmsKKwkgKiB0byB3aGljaCBpdCBpcyByZXBseWluZy4KKwkgKgorCSAqIFtBQk9SVCBiYWNrIHRvIHdoZXJlIHRoZSBvZmZlbmRlciBjYW1lIGZyb20uXQorCSAqLworCWlmIChjaHVuaykKKwkJcmV0dmFsLT50cmFuc3BvcnQgPSBjaHVuay0+dHJhbnNwb3J0OworCitub19tZW06CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogSGVscGVyIHRvIGNyZWF0ZSBBQk9SVCB3aXRoIGEgU0NUUF9FUlJPUl9VU0VSX0FCT1JUIGVycm9yLiAgKi8KK3N0cnVjdCBzY3RwX2NodW5rICpzY3RwX21ha2VfYWJvcnRfdXNlcihjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkgICBjb25zdCBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCisJCQkJICAgY29uc3Qgc3RydWN0IG1zZ2hkciAqbXNnKQoreworCXN0cnVjdCBzY3RwX2NodW5rICpyZXR2YWw7CisJdm9pZCAqcGF5bG9hZCA9IE5VTEwsICpwYXlvZmY7CisJc2l6ZV90IHBheWxlbiA9IDA7CisJc3RydWN0IGlvdmVjICppb3YgPSBOVUxMOworCWludCBpb3ZsZW4gPSAwOworCisJaWYgKG1zZykgeworCQlpb3YgPSBtc2ctPm1zZ19pb3Y7CisJCWlvdmxlbiA9IG1zZy0+bXNnX2lvdmxlbjsKKwkJcGF5bGVuID0gZ2V0X3VzZXJfaW92X3NpemUoaW92LCBpb3ZsZW4pOworCX0KKworCXJldHZhbCA9IHNjdHBfbWFrZV9hYm9ydChhc29jLCBjaHVuaywgc2l6ZW9mKHNjdHBfZXJyaGRyX3QpICsgcGF5bGVuKTsKKwlpZiAoIXJldHZhbCkKKwkJZ290byBlcnJfY2h1bms7CisKKwlpZiAocGF5bGVuKSB7CisJCS8qIFB1dCB0aGUgbXNnX2lvdiB0b2dldGhlciBpbnRvIHBheWxvYWQuICAqLworCQlwYXlsb2FkID0ga21hbGxvYyhwYXlsZW4sIEdGUF9BVE9NSUMpOworCQlpZiAoIXBheWxvYWQpCisJCQlnb3RvIGVycl9wYXlsb2FkOworCQlwYXlvZmYgPSBwYXlsb2FkOworCisJCWZvciAoOyBpb3ZsZW4gPiAwOyAtLWlvdmxlbikgeworCQkJaWYgKGNvcHlfZnJvbV91c2VyKHBheW9mZiwgaW92LT5pb3ZfYmFzZSxpb3YtPmlvdl9sZW4pKQorCQkJCWdvdG8gZXJyX2NvcHk7CisJCQlwYXlvZmYgKz0gaW92LT5pb3ZfbGVuOworCQkJaW92Kys7CisJCX0KKwl9CisKKwlzY3RwX2luaXRfY2F1c2UocmV0dmFsLCBTQ1RQX0VSUk9SX1VTRVJfQUJPUlQsIHBheWxvYWQsIHBheWxlbik7CisKKwlpZiAocGF5bGVuKQorCQlrZnJlZShwYXlsb2FkKTsKKworCXJldHVybiByZXR2YWw7CisKK2Vycl9jb3B5OgorCWtmcmVlKHBheWxvYWQpOworZXJyX3BheWxvYWQ6CisJc2N0cF9jaHVua19mcmVlKHJldHZhbCk7CisJcmV0dmFsID0gTlVMTDsKK2Vycl9jaHVuazoKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBNYWtlIGFuIEFCT1JUIGNodW5rIHdpdGggYSBQUk9UT0NPTCBWSU9MQVRJT04gY2F1c2UgY29kZS4gKi8gCitzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9tYWtlX2Fib3J0X3Zpb2xhdGlvbigKKwljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwljb25zdCBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCisJY29uc3QgX191OCAgICpwYXlsb2FkLAorCWNvbnN0IHNpemVfdCBwYXlsZW4pCit7CisJc3RydWN0IHNjdHBfY2h1bmsgICpyZXR2YWw7CisJc3RydWN0IHNjdHBfcGFyYW1oZHIgcGhkcjsKKworCXJldHZhbCA9IHNjdHBfbWFrZV9hYm9ydChhc29jLCBjaHVuaywgc2l6ZW9mKHNjdHBfZXJyaGRyX3QpICsgcGF5bGVuCisJCQkJCSsgc2l6ZW9mKHNjdHBfY2h1bmtoZHJfdCkpOworCWlmICghcmV0dmFsKQorCQlnb3RvIGVuZDsKKworCXNjdHBfaW5pdF9jYXVzZShyZXR2YWwsIFNDVFBfRVJST1JfUFJPVE9fVklPTEFUSU9OLCBwYXlsb2FkLCBwYXlsZW4pOworCisJcGhkci50eXBlID0gaHRvbnMoY2h1bmstPmNodW5rX2hkci0+dHlwZSk7CisJcGhkci5sZW5ndGggPSBjaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGg7CisJc2N0cF9hZGR0b19jaHVuayhyZXR2YWwsIHNpemVvZihzY3RwX3BhcmFtaGRyX3QpLCAmcGhkcik7CisKK2VuZDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBNYWtlIGEgSEVBUlRCRUFUIGNodW5rLiAgKi8KK3N0cnVjdCBzY3RwX2NodW5rICpzY3RwX21ha2VfaGVhcnRiZWF0KGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSAgY29uc3Qgc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQsCisJCQkJICBjb25zdCB2b2lkICpwYXlsb2FkLCBjb25zdCBzaXplX3QgcGF5bGVuKQoreworCXN0cnVjdCBzY3RwX2NodW5rICpyZXR2YWwgPSBzY3RwX21ha2VfY2h1bmsoYXNvYywgU0NUUF9DSURfSEVBUlRCRUFULAorCQkJCQkJICAgIDAsIHBheWxlbik7CisKKwlpZiAoIXJldHZhbCkKKwkJZ290byBub2RhdGE7CisKKwkvKiBDYXN0IGF3YXkgdGhlICdjb25zdCcsIGFzIHRoaXMgaXMganVzdCB0ZWxsaW5nIHRoZSBjaHVuaworCSAqIHdoYXQgdHJhbnNwb3J0IGl0IGJlbG9uZ3MgdG8uCisJICovCisJcmV0dmFsLT50cmFuc3BvcnQgPSAoc3RydWN0IHNjdHBfdHJhbnNwb3J0ICopIHRyYW5zcG9ydDsKKwlyZXR2YWwtPnN1YmguaGJzX2hkciA9IHNjdHBfYWRkdG9fY2h1bmsocmV0dmFsLCBwYXlsZW4sIHBheWxvYWQpOworCitub2RhdGE6CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfbWFrZV9oZWFydGJlYXRfYWNrKGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKKwkJCQkgICAgICBjb25zdCB2b2lkICpwYXlsb2FkLCBjb25zdCBzaXplX3QgcGF5bGVuKQoreworCXN0cnVjdCBzY3RwX2NodW5rICpyZXR2YWw7CisKKwlyZXR2YWwgID0gc2N0cF9tYWtlX2NodW5rKGFzb2MsIFNDVFBfQ0lEX0hFQVJUQkVBVF9BQ0ssIDAsIHBheWxlbik7CisJaWYgKCFyZXR2YWwpCisJCWdvdG8gbm9kYXRhOworCisJcmV0dmFsLT5zdWJoLmhic19oZHIgPSBzY3RwX2FkZHRvX2NodW5rKHJldHZhbCwgcGF5bGVuLCBwYXlsb2FkKTsKKworCS8qIFJGQyAyOTYwIDYuNCBNdWx0aS1ob21lZCBTQ1RQIEVuZHBvaW50cworCSAqCisJICogQW4gZW5kcG9pbnQgU0hPVUxEIHRyYW5zbWl0IHJlcGx5IGNodW5rcyAoZS5nLiwgU0FDSywKKwkgKiBIRUFSVEJFQVQgQUNLLCAqIGV0Yy4pIHRvIHRoZSBzYW1lIGRlc3RpbmF0aW9uIHRyYW5zcG9ydAorCSAqIGFkZHJlc3MgZnJvbSB3aGljaCBpdCAqIHJlY2VpdmVkIHRoZSBEQVRBIG9yIGNvbnRyb2wgY2h1bmsKKwkgKiB0byB3aGljaCBpdCBpcyByZXBseWluZy4KKwkgKgorCSAqIFtIQkFDSyBiYWNrIHRvIHdoZXJlIHRoZSBIRUFSVEJFQVQgY2FtZSBmcm9tLl0KKwkgKi8KKwlpZiAoY2h1bmspCisJCXJldHZhbC0+dHJhbnNwb3J0ID0gY2h1bmstPnRyYW5zcG9ydDsKKworbm9kYXRhOgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qIENyZWF0ZSBhbiBPcGVyYXRpb24gRXJyb3IgY2h1bmsgd2l0aCB0aGUgc3BlY2lmaWVkIHNwYWNlIHJlc2VydmVkLgorICogVGhpcyByb3V0aW5lIGNhbiBiZSB1c2VkIGZvciBjb250YWluaW5nIG11bHRpcGxlIGNhdXNlcyBpbiB0aGUgY2h1bmsuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9tYWtlX29wX2Vycm9yX3NwYWNlKAorCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCWNvbnN0IHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKKwlzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqcmV0dmFsOworCisJcmV0dmFsID0gc2N0cF9tYWtlX2NodW5rKGFzb2MsIFNDVFBfQ0lEX0VSUk9SLCAwLAorCQkJCSBzaXplb2Yoc2N0cF9lcnJoZHJfdCkgKyBzaXplKTsKKwlpZiAoIXJldHZhbCkKKwkJZ290byBub2RhdGE7CisKKwkvKiBSRkMgMjk2MCA2LjQgTXVsdGktaG9tZWQgU0NUUCBFbmRwb2ludHMKKwkgKgorCSAqIEFuIGVuZHBvaW50IFNIT1VMRCB0cmFuc21pdCByZXBseSBjaHVua3MgKGUuZy4sIFNBQ0ssCisJICogSEVBUlRCRUFUIEFDSywgZXRjLikgdG8gdGhlIHNhbWUgZGVzdGluYXRpb24gdHJhbnNwb3J0CisJICogYWRkcmVzcyBmcm9tIHdoaWNoIGl0IHJlY2VpdmVkIHRoZSBEQVRBIG9yIGNvbnRyb2wgY2h1bmsKKwkgKiB0byB3aGljaCBpdCBpcyByZXBseWluZy4KKwkgKgorCSAqLworCWlmIChjaHVuaykKKwkJcmV0dmFsLT50cmFuc3BvcnQgPSBjaHVuay0+dHJhbnNwb3J0OworCitub2RhdGE6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogQ3JlYXRlIGFuIE9wZXJhdGlvbiBFcnJvciBjaHVuay4gICovCitzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9tYWtlX29wX2Vycm9yKGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSBjb25zdCBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCisJCQkJIF9fdTE2IGNhdXNlX2NvZGUsIGNvbnN0IHZvaWQgKnBheWxvYWQsCisJCQkJIHNpemVfdCBwYXlsZW4pCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKnJldHZhbDsKKworCXJldHZhbCA9IHNjdHBfbWFrZV9vcF9lcnJvcl9zcGFjZShhc29jLCBjaHVuaywgcGF5bGVuKTsKKwlpZiAoIXJldHZhbCkKKwkJZ290byBub2RhdGE7CisKKwlzY3RwX2luaXRfY2F1c2UocmV0dmFsLCBjYXVzZV9jb2RlLCBwYXlsb2FkLCBwYXlsZW4pOworCitub2RhdGE6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAybmQgTGV2ZWwgQWJzdHJhY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFR1cm4gYW4gc2tiIGludG8gYSBjaHVuay4KKyAqIEZJWE1FOiBFdmVudHVhbGx5IG1vdmUgdGhlIHN0cnVjdHVyZSBkaXJlY3RseSBpbnNpZGUgdGhlIHNrYi0+Y2JbXS4KKyAqLworc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfY2h1bmtpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICBjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCSAgICBzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKnJldHZhbDsKKworCXJldHZhbCA9IGttZW1fY2FjaGVfYWxsb2Moc2N0cF9jaHVua19jYWNoZXAsIFNMQUJfQVRPTUlDKTsKKworCWlmICghcmV0dmFsKQorCQlnb3RvIG5vZGF0YTsKKwltZW1zZXQocmV0dmFsLCAwLCBzaXplb2Yoc3RydWN0IHNjdHBfY2h1bmspKTsKKworCWlmICghc2spIHsKKwkJU0NUUF9ERUJVR19QUklOVEsoImNodW5raWZ5aW5nIHNrYiAlcCB3L28gYW4gc2tcbiIsIHNrYik7CisJfQorCisJcmV0dmFsLT5za2IJCT0gc2tiOworCXJldHZhbC0+YXNvYwkJPSAoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKilhc29jOworCXJldHZhbC0+cmVzZW50ICAJPSAwOworCXJldHZhbC0+aGFzX3RzbgkJPSAwOworCXJldHZhbC0+aGFzX3NzbiAgICAgICAgID0gMDsKKwlyZXR2YWwtPnJ0dF9pbl9wcm9ncmVzcwk9IDA7CisJcmV0dmFsLT5zZW50X2F0CQk9IDA7CisJcmV0dmFsLT5zaW5nbGV0b24JPSAxOworCXJldHZhbC0+ZW5kX29mX3BhY2tldAk9IDA7CisJcmV0dmFsLT5lY25fY2VfZG9uZQk9IDA7CisJcmV0dmFsLT5wZGlzY2FyZAk9IDA7CisKKwkvKiBzY3RwaW1wZ3VpZGUtMDUudHh0IFNlY3Rpb24gMi44LjIKKwkgKiBNMSkgRWFjaCB0aW1lIGEgbmV3IERBVEEgY2h1bmsgaXMgdHJhbnNtaXR0ZWQKKwkgKiBzZXQgdGhlICdUU04uTWlzc2luZy5SZXBvcnQnIGNvdW50IGZvciB0aGF0IFRTTiB0byAwLiBUaGUKKwkgKiAnVFNOLk1pc3NpbmcuUmVwb3J0JyBjb3VudCB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIG1pc3NpbmcgY2h1bmtzCisJICogYW5kIHdoZW4gdG8gZmFzdCByZXRyYW5zbWl0LgorCSAqLworCXJldHZhbC0+dHNuX21pc3NpbmdfcmVwb3J0ID0gMDsKKwlyZXR2YWwtPnRzbl9nYXBfYWNrZWQgPSAwOworCXJldHZhbC0+ZmFzdF9yZXRyYW5zbWl0ID0gMDsKKworCS8qIElmIHRoaXMgaXMgYSBmcmFnbWVudGVkIG1lc3NhZ2UsIHRyYWNrIGFsbCBmcmFnbWVudHMKKwkgKiBvZiB0aGUgbWVzc2FnZSAoZm9yIFNFTkRfRkFJTEVEKS4KKwkgKi8KKwlyZXR2YWwtPm1zZyA9IE5VTEw7CisKKwkvKiBQb2xpc2ggdGhlIGJlYWQgaG9sZS4gICovCisJSU5JVF9MSVNUX0hFQUQoJnJldHZhbC0+dHJhbnNtaXR0ZWRfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJnJldHZhbC0+ZnJhZ19saXN0KTsKKwlTQ1RQX0RCR19PQkpDTlRfSU5DKGNodW5rKTsKKwlhdG9taWNfc2V0KCZyZXR2YWwtPnJlZmNudCwgMSk7CisKK25vZGF0YToKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBTZXQgY2h1bmstPnNvdXJjZSBhbmQgZGVzdCBiYXNlZCBvbiB0aGUgSVAgaGVhZGVyIGluIGNodW5rLT5za2IuICAqLwordm9pZCBzY3RwX2luaXRfYWRkcnMoc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLCB1bmlvbiBzY3RwX2FkZHIgKnNyYywKKwkJICAgICB1bmlvbiBzY3RwX2FkZHIgKmRlc3QpCit7CisJbWVtY3B5KCZjaHVuay0+c291cmNlLCBzcmMsIHNpemVvZih1bmlvbiBzY3RwX2FkZHIpKTsKKwltZW1jcHkoJmNodW5rLT5kZXN0LCBkZXN0LCBzaXplb2YodW5pb24gc2N0cF9hZGRyKSk7Cit9CisKKy8qIEV4dHJhY3QgdGhlIHNvdXJjZSBhZGRyZXNzIGZyb20gYSBjaHVuay4gICovCitjb25zdCB1bmlvbiBzY3RwX2FkZHIgKnNjdHBfc291cmNlKGNvbnN0IHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaykKK3sKKwkvKiBJZiB3ZSBoYXZlIGEga25vd24gdHJhbnNwb3J0LCB1c2UgdGhhdC4gICovCisJaWYgKGNodW5rLT50cmFuc3BvcnQpIHsKKwkJcmV0dXJuICZjaHVuay0+dHJhbnNwb3J0LT5pcGFkZHI7CisJfSBlbHNlIHsKKwkJLyogT3RoZXJ3aXNlLCBleHRyYWN0IGl0IGZyb20gdGhlIElQIGhlYWRlci4gICovCisJCXJldHVybiAmY2h1bmstPnNvdXJjZTsKKwl9Cit9CisKKy8qIENyZWF0ZSBhIG5ldyBjaHVuaywgc2V0dGluZyB0aGUgdHlwZSBhbmQgZmxhZ3MgaGVhZGVycyBmcm9tIHRoZQorICogYXJndW1lbnRzLCByZXNlcnZpbmcgZW5vdWdoIHNwYWNlIGZvciBhICdwYXlsZW4nIGJ5dGUgcGF5bG9hZC4KKyAqLworU0NUUF9TVEFUSUMKK3N0cnVjdCBzY3RwX2NodW5rICpzY3RwX21ha2VfY2h1bmsoY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJICAgX191OCB0eXBlLCBfX3U4IGZsYWdzLCBpbnQgcGF5bGVuKQoreworCXN0cnVjdCBzY3RwX2NodW5rICpyZXR2YWw7CisJc2N0cF9jaHVua2hkcl90ICpjaHVua19oZHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwkvKiBObyBuZWVkIHRvIGFsbG9jYXRlIExMIGhlcmUsIGFzIHRoaXMgaXMgb25seSBhIGNodW5rLiAqLworCXNrYiA9IGFsbG9jX3NrYihXT1JEX1JPVU5EKHNpemVvZihzY3RwX2NodW5raGRyX3QpICsgcGF5bGVuKSwKKwkJCUdGUF9BVE9NSUMpOworCWlmICghc2tiKQorCQlnb3RvIG5vZGF0YTsKKworCS8qIE1ha2Ugcm9vbSBmb3IgdGhlIGNodW5rIGhlYWRlci4gICovCisJY2h1bmtfaGRyID0gKHNjdHBfY2h1bmtoZHJfdCAqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc2N0cF9jaHVua2hkcl90KSk7CisJY2h1bmtfaGRyLT50eXBlCSAgPSB0eXBlOworCWNodW5rX2hkci0+ZmxhZ3MgID0gZmxhZ3M7CisJY2h1bmtfaGRyLT5sZW5ndGggPSBodG9ucyhzaXplb2Yoc2N0cF9jaHVua2hkcl90KSk7CisKKwlzayA9IGFzb2MgPyBhc29jLT5iYXNlLnNrIDogTlVMTDsKKwlyZXR2YWwgPSBzY3RwX2NodW5raWZ5KHNrYiwgYXNvYywgc2spOworCWlmICghcmV0dmFsKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlnb3RvIG5vZGF0YTsKKwl9CisKKwlyZXR2YWwtPmNodW5rX2hkciA9IGNodW5rX2hkcjsKKwlyZXR2YWwtPmNodW5rX2VuZCA9ICgoX191OCAqKWNodW5rX2hkcikgKyBzaXplb2Yoc3RydWN0IHNjdHBfY2h1bmtoZHIpOworCisJLyogU2V0IHRoZSBza2IgdG8gdGhlIGJlbG9uZ2luZyBzb2NrIGZvciBhY2NvdW50aW5nLiAgKi8KKwlza2ItPnNrID0gc2s7CisKKwlyZXR1cm4gcmV0dmFsOworbm9kYXRhOgorCXJldHVybiBOVUxMOworfQorCisKKy8qIFJlbGVhc2UgdGhlIG1lbW9yeSBvY2N1cGllZCBieSBhIGNodW5rLiAgKi8KK3N0YXRpYyB2b2lkIHNjdHBfY2h1bmtfZGVzdHJveShzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmspCit7CisJLyogRnJlZSB0aGUgY2h1bmsgc2tiIGRhdGEgYW5kIHRoZSBTQ1RQX2NodW5rIHN0dWIgaXRzZWxmLiAqLworCWRldl9rZnJlZV9za2IoY2h1bmstPnNrYik7CisKKwlTQ1RQX0RCR19PQkpDTlRfREVDKGNodW5rKTsKKwlrbWVtX2NhY2hlX2ZyZWUoc2N0cF9jaHVua19jYWNoZXAsIGNodW5rKTsKK30KKworLyogUG9zc2libHksIGZyZWUgdGhlIGNodW5rLiAgKi8KK3ZvaWQgc2N0cF9jaHVua19mcmVlKHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaykKK3sKKwkvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhcmUgbm90IG9uIGFueSBsaXN0LiAgKi8KKwlza2JfdW5saW5rKChzdHJ1Y3Qgc2tfYnVmZiAqKSBjaHVuayk7CisJbGlzdF9kZWxfaW5pdCgmY2h1bmstPnRyYW5zbWl0dGVkX2xpc3QpOworCisJLyogUmVsZWFzZSBvdXIgcmVmZXJlbmNlIG9uIHRoZSBtZXNzYWdlIHRyYWNrZXIuICovCisJaWYgKGNodW5rLT5tc2cpCisJCXNjdHBfZGF0YW1zZ19wdXQoY2h1bmstPm1zZyk7CisKKwlzY3RwX2NodW5rX3B1dChjaHVuayk7Cit9CisKKy8qIEdyYWIgYSByZWZlcmVuY2UgdG8gdGhlIGNodW5rLiAqLwordm9pZCBzY3RwX2NodW5rX2hvbGQoc3RydWN0IHNjdHBfY2h1bmsgKmNoKQoreworCWF0b21pY19pbmMoJmNoLT5yZWZjbnQpOworfQorCisvKiBSZWxlYXNlIGEgcmVmZXJlbmNlIHRvIHRoZSBjaHVuay4gKi8KK3ZvaWQgc2N0cF9jaHVua19wdXQoc3RydWN0IHNjdHBfY2h1bmsgKmNoKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjaC0+cmVmY250KSkKKwkJc2N0cF9jaHVua19kZXN0cm95KGNoKTsKK30KKworLyogQXBwZW5kIGJ5dGVzIHRvIHRoZSBlbmQgb2YgYSBjaHVuay4gIFdpbGwgcGFuaWMgaWYgY2h1bmsgaXMgbm90IGJpZworICogZW5vdWdoLgorICovCit2b2lkICpzY3RwX2FkZHRvX2NodW5rKHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywgaW50IGxlbiwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKwl2b2lkICp0YXJnZXQ7CisJdm9pZCAqcGFkZGluZzsKKwlpbnQgY2h1bmtsZW4gPSBudG9ocyhjaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpOworCWludCBwYWRsZW4gPSBjaHVua2xlbiAlIDQ7CisKKwlwYWRkaW5nID0gc2tiX3B1dChjaHVuay0+c2tiLCBwYWRsZW4pOworCXRhcmdldCA9IHNrYl9wdXQoY2h1bmstPnNrYiwgbGVuKTsKKworCW1lbXNldChwYWRkaW5nLCAwLCBwYWRsZW4pOworCW1lbWNweSh0YXJnZXQsIGRhdGEsIGxlbik7CisKKwkvKiBBZGp1c3QgdGhlIGNodW5rIGxlbmd0aCBmaWVsZC4gICovCisJY2h1bmstPmNodW5rX2hkci0+bGVuZ3RoID0gaHRvbnMoY2h1bmtsZW4gKyBwYWRsZW4gKyBsZW4pOworCWNodW5rLT5jaHVua19lbmQgPSBjaHVuay0+c2tiLT50YWlsOworCisJcmV0dXJuIHRhcmdldDsKK30KKworLyogQXBwZW5kIGJ5dGVzIGZyb20gdXNlciBzcGFjZSB0byB0aGUgZW5kIG9mIGEgY2h1bmsuICBXaWxsIHBhbmljIGlmCisgKiBjaHVuayBpcyBub3QgYmlnIGVub3VnaC4KKyAqIFJldHVybnMgYSBrZXJuZWwgZXJyIHZhbHVlLgorICovCitpbnQgc2N0cF91c2VyX2FkZHRvX2NodW5rKHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywgaW50IG9mZiwgaW50IGxlbiwKKwkJCSAgc3RydWN0IGlvdmVjICpkYXRhKQoreworCV9fdTggKnRhcmdldDsKKwlpbnQgZXJyID0gMDsKKworCS8qIE1ha2Ugcm9vbSBpbiBjaHVuayBmb3IgZGF0YS4gICovCisJdGFyZ2V0ID0gc2tiX3B1dChjaHVuay0+c2tiLCBsZW4pOworCisJLyogQ29weSBkYXRhICh3aG9sZSBpb3ZlYykgaW50byBjaHVuayAqLworCWlmICgoZXJyID0gbWVtY3B5X2Zyb21pb3ZlY2VuZCh0YXJnZXQsIGRhdGEsIG9mZiwgbGVuKSkpCisJCWdvdG8gb3V0OworCisJLyogQWRqdXN0IHRoZSBjaHVuayBsZW5ndGggZmllbGQuICAqLworCWNodW5rLT5jaHVua19oZHItPmxlbmd0aCA9CisJCWh0b25zKG50b2hzKGNodW5rLT5jaHVua19oZHItPmxlbmd0aCkgKyBsZW4pOworCWNodW5rLT5jaHVua19lbmQgPSBjaHVuay0+c2tiLT50YWlsOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyogSGVscGVyIGZ1bmN0aW9uIHRvIGFzc2lnbiBhIFRTTiBpZiBuZWVkZWQuICBUaGlzIGFzc3VtZXMgdGhhdCBib3RoCisgKiB0aGUgZGF0YV9oZHIgYW5kIGFzc29jaWF0aW9uIGhhdmUgYWxyZWFkeSBiZWVuIGFzc2lnbmVkLgorICovCit2b2lkIHNjdHBfY2h1bmtfYXNzaWduX3NzbihzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmspCit7CisJX191MTYgc3NuOworCV9fdTE2IHNpZDsKKworCWlmIChjaHVuay0+aGFzX3NzbikKKwkJcmV0dXJuOworCisJLyogVGhpcyBpcyB0aGUgbGFzdCBwb3NzaWJsZSBpbnN0YW50IHRvIGFzc2lnbiBhIFNTTi4gKi8KKwlpZiAoY2h1bmstPmNodW5rX2hkci0+ZmxhZ3MgJiBTQ1RQX0RBVEFfVU5PUkRFUkVEKSB7CisJCXNzbiA9IDA7CisJfSBlbHNlIHsKKwkJc2lkID0gaHRvbnMoY2h1bmstPnN1YmguZGF0YV9oZHItPnN0cmVhbSk7CisJCWlmIChjaHVuay0+Y2h1bmtfaGRyLT5mbGFncyAmIFNDVFBfREFUQV9MQVNUX0ZSQUcpCisJCQlzc24gPSBzY3RwX3Nzbl9uZXh0KCZjaHVuay0+YXNvYy0+c3NubWFwLT5vdXQsIHNpZCk7CisJCWVsc2UKKwkJCXNzbiA9IHNjdHBfc3NuX3BlZWsoJmNodW5rLT5hc29jLT5zc25tYXAtPm91dCwgc2lkKTsKKwkJc3NuID0gaHRvbnMoc3NuKTsKKwl9CisKKwljaHVuay0+c3ViaC5kYXRhX2hkci0+c3NuID0gc3NuOworCWNodW5rLT5oYXNfc3NuID0gMTsKK30KKworLyogSGVscGVyIGZ1bmN0aW9uIHRvIGFzc2lnbiBhIFRTTiBpZiBuZWVkZWQuICBUaGlzIGFzc3VtZXMgdGhhdCBib3RoCisgKiB0aGUgZGF0YV9oZHIgYW5kIGFzc29jaWF0aW9uIGhhdmUgYWxyZWFkeSBiZWVuIGFzc2lnbmVkLgorICovCit2b2lkIHNjdHBfY2h1bmtfYXNzaWduX3RzbihzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmspCit7CisJaWYgKCFjaHVuay0+aGFzX3RzbikgeworCQkvKiBUaGlzIGlzIHRoZSBsYXN0IHBvc3NpYmxlIGluc3RhbnQgdG8KKwkJICogYXNzaWduIGEgVFNOLgorCQkgKi8KKwkJY2h1bmstPnN1YmguZGF0YV9oZHItPnRzbiA9CisJCQlodG9ubChzY3RwX2Fzc29jaWF0aW9uX2dldF9uZXh0X3RzbihjaHVuay0+YXNvYykpOworCQljaHVuay0+aGFzX3RzbiA9IDE7CisJfQorfQorCisvKiBDcmVhdGUgYSBDTE9TRUQgYXNzb2NpYXRpb24gdG8gdXNlIHdpdGggYW4gaW5jb21pbmcgcGFja2V0LiAgKi8KK3N0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICpzY3RwX21ha2VfdGVtcF9hc29jKGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwkJCQkJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLCBpbnQgZ2ZwKQoreworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOworCXN0cnVjdCBza19idWZmICpza2I7CisJc2N0cF9zY29wZV90IHNjb3BlOworCXN0cnVjdCBzY3RwX2FmICphZjsKKworCS8qIENyZWF0ZSB0aGUgYmFyZSBhc3NvY2lhdGlvbi4gICovCisJc2NvcGUgPSBzY3RwX3Njb3BlKHNjdHBfc291cmNlKGNodW5rKSk7CisJYXNvYyA9IHNjdHBfYXNzb2NpYXRpb25fbmV3KGVwLCBlcC0+YmFzZS5zaywgc2NvcGUsIGdmcCk7CisJaWYgKCFhc29jKQorCQlnb3RvIG5vZGF0YTsKKwlhc29jLT50ZW1wID0gMTsKKwlza2IgPSBjaHVuay0+c2tiOworCS8qIENyZWF0ZSBhbiBlbnRyeSBmb3IgdGhlIHNvdXJjZSBhZGRyZXNzIG9mIHRoZSBwYWNrZXQuICAqLworCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoaXB2ZXIyYWYoc2tiLT5uaC5pcGgtPnZlcnNpb24pKTsKKwlpZiAodW5saWtlbHkoIWFmKSkKKwkJZ290byBmYWlsOworCWFmLT5mcm9tX3NrYigmYXNvYy0+Yy5wZWVyX2FkZHIsIHNrYiwgMSk7Citub2RhdGE6CisJcmV0dXJuIGFzb2M7CisKK2ZhaWw6CisJc2N0cF9hc3NvY2lhdGlvbl9mcmVlKGFzb2MpOworCXJldHVybiBOVUxMOworfQorCisvKiBCdWlsZCBhIGNvb2tpZSByZXByZXNlbnRpbmcgYXNvYy4KKyAqIFRoaXMgSU5DTFVERVMgdGhlIHBhcmFtIGhlYWRlciBuZWVkZWQgdG8gcHV0IHRoZSBjb29raWUgaW4gdGhlIElOSVQgQUNLLgorICovCitzdGF0aWMgc2N0cF9jb29raWVfcGFyYW1fdCAqc2N0cF9wYWNrX2Nvb2tpZShjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IHNjdHBfY2h1bmsgKmluaXRfY2h1bmssCisJCQkJICAgICAgaW50ICpjb29raWVfbGVuLAorCQkJCSAgICAgIGNvbnN0IF9fdTggKnJhd19hZGRycywgaW50IGFkZHJzX2xlbikKK3sKKwlzY3RwX2Nvb2tpZV9wYXJhbV90ICpyZXR2YWw7CisJc3RydWN0IHNjdHBfc2lnbmVkX2Nvb2tpZSAqY29va2llOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKwlpbnQgaGVhZGVyc2l6ZSwgYm9keXNpemU7CisJdW5zaWduZWQgaW50IGtleWxlbjsKKwljaGFyICprZXk7CisKKwloZWFkZXJzaXplID0gc2l6ZW9mKHNjdHBfcGFyYW1oZHJfdCkgKyBTQ1RQX1NFQ1JFVF9TSVpFOworCWJvZHlzaXplID0gc2l6ZW9mKHN0cnVjdCBzY3RwX2Nvb2tpZSkKKwkJKyBudG9ocyhpbml0X2NodW5rLT5jaHVua19oZHItPmxlbmd0aCkgKyBhZGRyc19sZW47CisKKwkvKiBQYWQgb3V0IHRoZSBjb29raWUgdG8gYSBtdWx0aXBsZSB0byBtYWtlIHRoZSBzaWduYXR1cmUKKwkgKiBmdW5jdGlvbnMgc2ltcGxlciB0byB3cml0ZS4KKwkgKi8KKwlpZiAoYm9keXNpemUgJSBTQ1RQX0NPT0tJRV9NVUxUSVBMRSkKKwkJYm9keXNpemUgKz0gU0NUUF9DT09LSUVfTVVMVElQTEUKKwkJCS0gKGJvZHlzaXplICUgU0NUUF9DT09LSUVfTVVMVElQTEUpOworCSpjb29raWVfbGVuID0gaGVhZGVyc2l6ZSArIGJvZHlzaXplOworCisJcmV0dmFsID0gKHNjdHBfY29va2llX3BhcmFtX3QgKilrbWFsbG9jKCpjb29raWVfbGVuLCBHRlBfQVRPTUlDKTsKKworCWlmICghcmV0dmFsKSB7CisJCSpjb29raWVfbGVuID0gMDsKKwkJZ290byBub2RhdGE7CisJfQorCisJLyogQ2xlYXIgdGhpcyBtZW1vcnkgc2luY2Ugd2UgYXJlIHNlbmRpbmcgdGhpcyBkYXRhIHN0cnVjdHVyZQorCSAqIG91dCBvbiB0aGUgbmV0d29yay4KKwkgKi8KKwltZW1zZXQocmV0dmFsLCAweDAwLCAqY29va2llX2xlbik7CisJY29va2llID0gKHN0cnVjdCBzY3RwX3NpZ25lZF9jb29raWUgKikgcmV0dmFsLT5ib2R5OworCisJLyogU2V0IHVwIHRoZSBwYXJhbWV0ZXIgaGVhZGVyLiAgKi8KKwlyZXR2YWwtPnAudHlwZSA9IFNDVFBfUEFSQU1fU1RBVEVfQ09PS0lFOworCXJldHZhbC0+cC5sZW5ndGggPSBodG9ucygqY29va2llX2xlbik7CisKKwkvKiBDb3B5IHRoZSBjb29raWUgcGFydCBvZiB0aGUgYXNzb2NpYXRpb24gaXRzZWxmLiAgKi8KKwljb29raWUtPmMgPSBhc29jLT5jOworCS8qIFNhdmUgdGhlIHJhdyBhZGRyZXNzIGxpc3QgbGVuZ3RoIGluIHRoZSBjb29raWUuICovCisJY29va2llLT5jLnJhd19hZGRyX2xpc3RfbGVuID0gYWRkcnNfbGVuOworCisJLyogUmVtZW1iZXIgUFItU0NUUCBjYXBhYmlsaXR5LiAqLworCWNvb2tpZS0+Yy5wcnNjdHBfY2FwYWJsZSA9IGFzb2MtPnBlZXIucHJzY3RwX2NhcGFibGU7CisKKwkvKiBTYXZlIGFkYXB0aW9uIGluZGljYXRpb24gaW4gdGhlIGNvb2tpZS4gKi8KKwljb29raWUtPmMuYWRhcHRpb25faW5kID0gYXNvYy0+cGVlci5hZGFwdGlvbl9pbmQ7CisKKwkvKiBTZXQgYW4gZXhwaXJhdGlvbiB0aW1lIGZvciB0aGUgY29va2llLiAgKi8KKwlkb19nZXR0aW1lb2ZkYXkoJmNvb2tpZS0+Yy5leHBpcmF0aW9uKTsKKwlUSU1FVkFMX0FERChhc29jLT5jb29raWVfbGlmZSwgY29va2llLT5jLmV4cGlyYXRpb24pOworCisJLyogQ29weSB0aGUgcGVlcidzIGluaXQgcGFja2V0LiAgKi8KKwltZW1jcHkoJmNvb2tpZS0+Yy5wZWVyX2luaXRbMF0sIGluaXRfY2h1bmstPmNodW5rX2hkciwKKwkgICAgICAgbnRvaHMoaW5pdF9jaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpKTsKKworCS8qIENvcHkgdGhlIHJhdyBsb2NhbCBhZGRyZXNzIGxpc3Qgb2YgdGhlIGFzc29jaWF0aW9uLiAqLworCW1lbWNweSgoX191OCAqKSZjb29raWUtPmMucGVlcl9pbml0WzBdICsKKwkgICAgICAgbnRvaHMoaW5pdF9jaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpLCByYXdfYWRkcnMsIGFkZHJzX2xlbik7CisKKyAgCWlmIChzY3RwX3NrKGVwLT5iYXNlLnNrKS0+aG1hYykgeworCQkvKiBTaWduIHRoZSBtZXNzYWdlLiAgKi8KKwkJc2cucGFnZSA9IHZpcnRfdG9fcGFnZSgmY29va2llLT5jKTsKKwkJc2cub2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpKCZjb29raWUtPmMpICUgUEFHRV9TSVpFOworCQlzZy5sZW5ndGggPSBib2R5c2l6ZTsKKwkJa2V5bGVuID0gU0NUUF9TRUNSRVRfU0laRTsKKwkJa2V5ID0gKGNoYXIgKillcC0+c2VjcmV0X2tleVtlcC0+Y3VycmVudF9rZXldOworCisJCXNjdHBfY3J5cHRvX2htYWMoc2N0cF9zayhlcC0+YmFzZS5zayktPmhtYWMsIGtleSwgJmtleWxlbiwKKwkJCQkgJnNnLCAxLCBjb29raWUtPnNpZ25hdHVyZSk7CisJfQorCitub2RhdGE6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogVW5wYWNrIHRoZSBjb29raWUgZnJvbSBDT09LSUUgRUNITyBjaHVuaywgcmVjcmVhdGluZyB0aGUgYXNzb2NpYXRpb24uICAqLworc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKnNjdHBfdW5wYWNrX2Nvb2tpZSgKKwljb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLCBpbnQgZ2ZwLAorCWludCAqZXJyb3IsIHN0cnVjdCBzY3RwX2NodW5rICoqZXJycCkKK3sKKwlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqcmV0dmFsID0gTlVMTDsKKwlzdHJ1Y3Qgc2N0cF9zaWduZWRfY29va2llICpjb29raWU7CisJc3RydWN0IHNjdHBfY29va2llICpiZWFyX2Nvb2tpZTsKKwlpbnQgaGVhZGVyc2l6ZSwgYm9keXNpemUsIGZpeGVkX3NpemU7CisJX191OCBkaWdlc3RbU0NUUF9TSUdOQVRVUkVfU0laRV07CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOworCXVuc2lnbmVkIGludCBrZXlsZW4sIGxlbjsKKwljaGFyICprZXk7CisJc2N0cF9zY29wZV90IHNjb3BlOworCXN0cnVjdCBza19idWZmICpza2IgPSBjaHVuay0+c2tiOworCisJaGVhZGVyc2l6ZSA9IHNpemVvZihzY3RwX2NodW5raGRyX3QpICsgU0NUUF9TRUNSRVRfU0laRTsKKwlib2R5c2l6ZSA9IG50b2hzKGNodW5rLT5jaHVua19oZHItPmxlbmd0aCkgLSBoZWFkZXJzaXplOworCWZpeGVkX3NpemUgPSBoZWFkZXJzaXplICsgc2l6ZW9mKHN0cnVjdCBzY3RwX2Nvb2tpZSk7CisKKwkvKiBWZXJpZnkgdGhhdCB0aGUgY2h1bmsgbG9va3MgbGlrZSBpdCBldmVuIGhhcyBhIGNvb2tpZS4KKwkgKiBUaGVyZSBtdXN0IGJlIGVub3VnaCByb29tIGZvciBvdXIgY29va2llIGFuZCBvdXIgcGVlcidzCisJICogSU5JVCBjaHVuay4KKwkgKi8KKwlsZW4gPSBudG9ocyhjaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpOworCWlmIChsZW4gPCBmaXhlZF9zaXplICsgc2l6ZW9mKHN0cnVjdCBzY3RwX2NodW5raGRyKSkKKwkJZ290byBtYWxmb3JtZWQ7CisKKwkvKiBWZXJpZnkgdGhhdCB0aGUgY29va2llIGhhcyBiZWVuIHBhZGRlZCBvdXQuICovCisJaWYgKGJvZHlzaXplICUgU0NUUF9DT09LSUVfTVVMVElQTEUpCisJCWdvdG8gbWFsZm9ybWVkOworCisJLyogUHJvY2VzcyB0aGUgY29va2llLiAgKi8KKwljb29raWUgPSBjaHVuay0+c3ViaC5jb29raWVfaGRyOworCWJlYXJfY29va2llID0gJmNvb2tpZS0+YzsKKworCWlmICghc2N0cF9zayhlcC0+YmFzZS5zayktPmhtYWMpCisJCWdvdG8gbm9faG1hYzsKKworCS8qIENoZWNrIHRoZSBzaWduYXR1cmUuICAqLworCWtleWxlbiA9IFNDVFBfU0VDUkVUX1NJWkU7CisJc2cucGFnZSA9IHZpcnRfdG9fcGFnZShiZWFyX2Nvb2tpZSk7CisJc2cub2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpKGJlYXJfY29va2llKSAlIFBBR0VfU0laRTsKKwlzZy5sZW5ndGggPSBib2R5c2l6ZTsKKwlrZXkgPSAoY2hhciAqKWVwLT5zZWNyZXRfa2V5W2VwLT5jdXJyZW50X2tleV07CisKKwltZW1zZXQoZGlnZXN0LCAweDAwLCBzaXplb2YoZGlnZXN0KSk7CisJc2N0cF9jcnlwdG9faG1hYyhzY3RwX3NrKGVwLT5iYXNlLnNrKS0+aG1hYywga2V5LCAma2V5bGVuLCAmc2csCisJCQkgMSwgZGlnZXN0KTsKKworCWlmIChtZW1jbXAoZGlnZXN0LCBjb29raWUtPnNpZ25hdHVyZSwgU0NUUF9TSUdOQVRVUkVfU0laRSkpIHsKKwkJLyogVHJ5IHRoZSBwcmV2aW91cyBrZXkuICovCisJCWtleSA9IChjaGFyICopZXAtPnNlY3JldF9rZXlbZXAtPmxhc3Rfa2V5XTsKKwkJbWVtc2V0KGRpZ2VzdCwgMHgwMCwgc2l6ZW9mKGRpZ2VzdCkpOworCQlzY3RwX2NyeXB0b19obWFjKHNjdHBfc2soZXAtPmJhc2Uuc2spLT5obWFjLCBrZXksICZrZXlsZW4sCisJCQkJICZzZywgMSwgZGlnZXN0KTsKKworCQlpZiAobWVtY21wKGRpZ2VzdCwgY29va2llLT5zaWduYXR1cmUsIFNDVFBfU0lHTkFUVVJFX1NJWkUpKSB7CisJCQkvKiBZaWtlcyEgIFN0aWxsIGJhZCBzaWduYXR1cmUhICovCisJCQkqZXJyb3IgPSAtU0NUUF9JRVJST1JfQkFEX1NJRzsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworbm9faG1hYzoKKwkvKiBJRyBTZWN0aW9uIDIuMzUuMjoKKwkgKiAgMykgQ29tcGFyZSB0aGUgcG9ydCBudW1iZXJzIGFuZCB0aGUgdmVyaWZpY2F0aW9uIHRhZyBjb250YWluZWQKKwkgKiAgICAgd2l0aGluIHRoZSBDT09LSUUgRUNITyBjaHVuayB0byB0aGUgYWN0dWFsIHBvcnQgbnVtYmVycyBhbmQgdGhlCisJICogICAgIHZlcmlmaWNhdGlvbiB0YWcgd2l0aGluIHRoZSBTQ1RQIGNvbW1vbiBoZWFkZXIgb2YgdGhlIHJlY2VpdmVkCisJICogICAgIHBhY2tldC4gSWYgdGhlc2UgdmFsdWVzIGRvIG5vdCBtYXRjaCB0aGUgcGFja2V0IE1VU1QgYmUgc2lsZW50bHkKKwkgKiAgICAgZGlzY2FyZGVkLAorCSAqLworCWlmIChudG9obChjaHVuay0+c2N0cF9oZHItPnZ0YWcpICE9IGJlYXJfY29va2llLT5teV92dGFnKSB7CisJCSplcnJvciA9IC1TQ1RQX0lFUlJPUl9CQURfVEFHOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKG50b2hzKGNodW5rLT5zY3RwX2hkci0+c291cmNlKSAhPSBiZWFyX2Nvb2tpZS0+cGVlcl9hZGRyLnY0LnNpbl9wb3J0IHx8CisJICAgIG50b2hzKGNodW5rLT5zY3RwX2hkci0+ZGVzdCkgIT0gYmVhcl9jb29raWUtPm15X3BvcnQpIHsKKwkJKmVycm9yID0gLVNDVFBfSUVSUk9SX0JBRF9QT1JUUzsKKwkJZ290byBmYWlsOworCX0KKworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgY29va2llIGlzIHN0YWxlLiAgSWYgdGhlcmUgaXMgYWxyZWFkeQorCSAqIGFuIGFzc29jaWF0aW9uLCB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGNvb2tpZSdzIGV4cGlyYXRpb24KKwkgKiBmb3IgaW5pdCBjb2xsaXNpb24gY2FzZSBvZiBsb3N0IENPT0tJRSBBQ0suCisJICovCisJaWYgKCFhc29jICYmIHR2X2x0KGJlYXJfY29va2llLT5leHBpcmF0aW9uLCBza2ItPnN0YW1wKSkgeworCQlfX3UxNiBsZW47CisJCS8qCisJCSAqIFNlY3Rpb24gMy4zLjEwLjMgU3RhbGUgQ29va2llIEVycm9yICgzKQorCQkgKgorCQkgKiBDYXVzZSBvZiBlcnJvcgorCQkgKiAtLS0tLS0tLS0tLS0tLS0KKwkJICogU3RhbGUgQ29va2llIEVycm9yOiAgSW5kaWNhdGVzIHRoZSByZWNlaXB0IG9mIGEgdmFsaWQgU3RhdGUKKwkJICogQ29va2llIHRoYXQgaGFzIGV4cGlyZWQuCisJCSAqLworCQlsZW4gPSBudG9ocyhjaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpOworCQkqZXJycCA9IHNjdHBfbWFrZV9vcF9lcnJvcl9zcGFjZShhc29jLCBjaHVuaywgbGVuKTsKKwkJaWYgKCplcnJwKSB7CisJCQlzdXNlY29uZHNfdCB1c2VjcyA9IChza2ItPnN0YW1wLnR2X3NlYyAtCisJCQkJYmVhcl9jb29raWUtPmV4cGlyYXRpb24udHZfc2VjKSAqIDEwMDAwMDBMICsKKwkJCQlza2ItPnN0YW1wLnR2X3VzZWMgLQorCQkJCWJlYXJfY29va2llLT5leHBpcmF0aW9uLnR2X3VzZWM7CisKKwkJCXVzZWNzID0gaHRvbmwodXNlY3MpOworCQkJc2N0cF9pbml0X2NhdXNlKCplcnJwLCBTQ1RQX0VSUk9SX1NUQUxFX0NPT0tJRSwKKwkJCQkJJnVzZWNzLCBzaXplb2YodXNlY3MpKTsKKwkJCSplcnJvciA9IC1TQ1RQX0lFUlJPUl9TVEFMRV9DT09LSUU7CisJCX0gZWxzZQorCQkJKmVycm9yID0gLVNDVFBfSUVSUk9SX05PTUVNOworCisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBNYWtlIGEgbmV3IGJhc2UgYXNzb2NpYXRpb24uICAqLworCXNjb3BlID0gc2N0cF9zY29wZShzY3RwX3NvdXJjZShjaHVuaykpOworCXJldHZhbCA9IHNjdHBfYXNzb2NpYXRpb25fbmV3KGVwLCBlcC0+YmFzZS5zaywgc2NvcGUsIGdmcCk7CisJaWYgKCFyZXR2YWwpIHsKKwkJKmVycm9yID0gLVNDVFBfSUVSUk9SX05PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogU2V0IHVwIG91ciBwZWVyJ3MgcG9ydCBudW1iZXIuICAqLworCXJldHZhbC0+cGVlci5wb3J0ID0gbnRvaHMoY2h1bmstPnNjdHBfaGRyLT5zb3VyY2UpOworCisJLyogUG9wdWxhdGUgdGhlIGFzc29jaWF0aW9uIGZyb20gdGhlIGNvb2tpZS4gICovCisJbWVtY3B5KCZyZXR2YWwtPmMsIGJlYXJfY29va2llLCBzaXplb2YoKmJlYXJfY29va2llKSk7CisKKwlpZiAoc2N0cF9hc3NvY19zZXRfYmluZF9hZGRyX2Zyb21fY29va2llKHJldHZhbCwgYmVhcl9jb29raWUsCisJCQkJCQkgR0ZQX0FUT01JQykgPCAwKSB7CisJCSplcnJvciA9IC1TQ1RQX0lFUlJPUl9OT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIEFsc28sIGFkZCB0aGUgZGVzdGluYXRpb24gYWRkcmVzcy4gKi8KKwlpZiAobGlzdF9lbXB0eSgmcmV0dmFsLT5iYXNlLmJpbmRfYWRkci5hZGRyZXNzX2xpc3QpKSB7CisJCXNjdHBfYWRkX2JpbmRfYWRkcigmcmV0dmFsLT5iYXNlLmJpbmRfYWRkciwgJmNodW5rLT5kZXN0LAorCQkJCSAgIEdGUF9BVE9NSUMpOworCX0KKworCXJldHZhbC0+bmV4dF90c24gPSByZXR2YWwtPmMuaW5pdGlhbF90c247CisJcmV0dmFsLT5jdHNuX2Fja19wb2ludCA9IHJldHZhbC0+bmV4dF90c24gLSAxOworCXJldHZhbC0+YWRkaXBfc2VyaWFsID0gcmV0dmFsLT5jLmluaXRpYWxfdHNuOworCXJldHZhbC0+YWR2X3BlZXJfYWNrX3BvaW50ID0gcmV0dmFsLT5jdHNuX2Fja19wb2ludDsKKwlyZXR2YWwtPnBlZXIucHJzY3RwX2NhcGFibGUgPSByZXR2YWwtPmMucHJzY3RwX2NhcGFibGU7CisJcmV0dmFsLT5wZWVyLmFkYXB0aW9uX2luZCA9IHJldHZhbC0+Yy5hZGFwdGlvbl9pbmQ7CisKKwkvKiBUaGUgSU5JVCBzdHVmZiB3aWxsIGJlIGRvbmUgYnkgdGhlIHNpZGUgZWZmZWN0cy4gICovCisJcmV0dXJuIHJldHZhbDsKKworZmFpbDoKKwlpZiAocmV0dmFsKQorCQlzY3RwX2Fzc29jaWF0aW9uX2ZyZWUocmV0dmFsKTsKKworCXJldHVybiBOVUxMOworCittYWxmb3JtZWQ6CisJLyogWWlrZXMhICBUaGUgcGFja2V0IGlzIGVpdGhlciBjb3JydXB0IG9yIGRlbGliZXJhdGVseQorCSAqIG1hbGZvcm1lZC4KKwkgKi8KKwkqZXJyb3IgPSAtU0NUUF9JRVJST1JfTUFMRk9STUVEOworCWdvdG8gZmFpbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAzcmQgTGV2ZWwgQWJzdHJhY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBfX3NjdHBfbWlzc2luZyB7CisJX191MzIgbnVtX21pc3Npbmc7CisJX191MTYgdHlwZTsKK30gIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKgorICogUmVwb3J0IGEgbWlzc2luZyBtYW5kYXRvcnkgcGFyYW1ldGVyLgorICovCitzdGF0aWMgaW50IHNjdHBfcHJvY2Vzc19taXNzaW5nX3BhcmFtKGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSAgICAgIHNjdHBfcGFyYW1fdCBwYXJhbXR5cGUsCisJCQkJICAgICAgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLAorCQkJCSAgICAgIHN0cnVjdCBzY3RwX2NodW5rICoqZXJycCkKK3sKKwlzdHJ1Y3QgX19zY3RwX21pc3NpbmcgcmVwb3J0OworCV9fdTE2IGxlbjsKKworCWxlbiA9IFdPUkRfUk9VTkQoc2l6ZW9mKHJlcG9ydCkpOworCisJLyogTWFrZSBhbiBFUlJPUiBjaHVuaywgcHJlcGFyaW5nIGVub3VnaCByb29tIGZvcgorCSAqIHJldHVybmluZyBtdWx0aXBsZSB1bmtub3duIHBhcmFtZXRlcnMuCisJICovCisJaWYgKCEqZXJycCkKKwkJKmVycnAgPSBzY3RwX21ha2Vfb3BfZXJyb3Jfc3BhY2UoYXNvYywgY2h1bmssIGxlbik7CisKKwlpZiAoKmVycnApIHsKKwkJcmVwb3J0Lm51bV9taXNzaW5nID0gaHRvbmwoMSk7CisJCXJlcG9ydC50eXBlID0gcGFyYW10eXBlOworCQlzY3RwX2luaXRfY2F1c2UoKmVycnAsIFNDVFBfRVJST1JfSU5WX1BBUkFNLAorCQkJCSZyZXBvcnQsIHNpemVvZihyZXBvcnQpKTsKKwl9CisKKwkvKiBTdG9wIHByb2Nlc3NpbmcgdGhpcyBjaHVuay4gKi8KKwlyZXR1cm4gMDsKK30KKworLyogUmVwb3J0IGFuIEludmFsaWQgTWFuZGF0b3J5IFBhcmFtZXRlci4gICovCitzdGF0aWMgaW50IHNjdHBfcHJvY2Vzc19pbnZfbWFuZGF0b3J5KGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSAgICAgIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKKwkJCQkgICAgICBzdHJ1Y3Qgc2N0cF9jaHVuayAqKmVycnApCit7CisJLyogSW52YWxpZCBNYW5kYXRvcnkgUGFyYW1ldGVyIEVycm9yIGhhcyBubyBwYXlsb2FkLiAqLworCisJaWYgKCEqZXJycCkKKwkJKmVycnAgPSBzY3RwX21ha2Vfb3BfZXJyb3Jfc3BhY2UoYXNvYywgY2h1bmssIDApOworCisJaWYgKCplcnJwKQorCQlzY3RwX2luaXRfY2F1c2UoKmVycnAsIFNDVFBfRVJST1JfSU5WX1BBUkFNLCBOVUxMLCAwKTsKKworCS8qIFN0b3AgcHJvY2Vzc2luZyB0aGlzIGNodW5rLiAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjdHBfcHJvY2Vzc19pbnZfcGFyYW1sZW5ndGgoY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJCXN0cnVjdCBzY3RwX3BhcmFtaGRyICpwYXJhbSwKKwkJCQkJY29uc3Qgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLAorCQkJCQlzdHJ1Y3Qgc2N0cF9jaHVuayAqKmVycnApCit7CisJY2hhcgkJZXJyb3JbXSA9ICJUaGUgZm9sbG93aW5nIHBhcmFtZXRlciBoYWQgaW52YWxpZCBsZW5ndGg6IjsKKwlzaXplX3QJCXBheWxvYWRfbGVuID0gV09SRF9ST1VORChzaXplb2YoZXJyb3IpKSArIAorCQkJCQkJc2l6ZW9mKHNjdHBfcGFyYW1oZHJfdCk7CisKKworCS8qIENyZWF0ZSBhbiBlcnJvciBjaHVuayBhbmQgZmlsbCBpdCBpbiB3aXRoIG91ciBwYXlsb2FkLiAqLworCWlmICghKmVycnApCisJCSplcnJwID0gc2N0cF9tYWtlX29wX2Vycm9yX3NwYWNlKGFzb2MsIGNodW5rLCBwYXlsb2FkX2xlbik7CisKKwlpZiAoKmVycnApIHsKKwkJc2N0cF9pbml0X2NhdXNlKCplcnJwLCBTQ1RQX0VSUk9SX1BST1RPX1ZJT0xBVElPTiwgZXJyb3IsCisJCQkJc2l6ZW9mKGVycm9yKSk7CisJCXNjdHBfYWRkdG9fY2h1bmsoKmVycnAsIHNpemVvZihzY3RwX3BhcmFtaGRyX3QpLCBwYXJhbSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyogRG8gbm90IGF0dGVtcHQgdG8gaGFuZGxlIHRoZSBIT1NUX05BTUUgcGFybS4gIEhvd2V2ZXIsIGRvCisgKiBzZW5kIGJhY2sgYW4gaW5kaWNhdG9yIHRvIHRoZSBwZWVyLgorICovCitzdGF0aWMgaW50IHNjdHBfcHJvY2Vzc19obl9wYXJhbShjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkgdW5pb24gc2N0cF9wYXJhbXMgcGFyYW0sCisJCQkJIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKKwkJCQkgc3RydWN0IHNjdHBfY2h1bmsgKiplcnJwKQoreworCV9fdTE2IGxlbiA9IG50b2hzKHBhcmFtLnAtPmxlbmd0aCk7CisKKwkvKiBNYWtlIGFuIEVSUk9SIGNodW5rLiAqLworCWlmICghKmVycnApCisJCSplcnJwID0gc2N0cF9tYWtlX29wX2Vycm9yX3NwYWNlKGFzb2MsIGNodW5rLCBsZW4pOworCisJaWYgKCplcnJwKQorCQlzY3RwX2luaXRfY2F1c2UoKmVycnAsIFNDVFBfRVJST1JfRE5TX0ZBSUxFRCwKKwkJCQlwYXJhbS52LCBsZW4pOworCisJLyogU3RvcCBwcm9jZXNzaW5nIHRoaXMgY2h1bmsuICovCisJcmV0dXJuIDA7Cit9CisKKy8qIFJGQyAzLjIuMSAmIHRoZSBJbXBsZW1lbnRlcnMgR3VpZGUgMi4yLgorICoKKyAqIFRoZSBQYXJhbWV0ZXIgVHlwZXMgYXJlIGVuY29kZWQgc3VjaCB0aGF0IHRoZQorICogaGlnaGVzdC1vcmRlciB0d28gYml0cyBzcGVjaWZ5IHRoZSBhY3Rpb24gdGhhdCBtdXN0IGJlCisgKiB0YWtlbiBpZiB0aGUgcHJvY2Vzc2luZyBlbmRwb2ludCBkb2VzIG5vdCByZWNvZ25pemUgdGhlCisgKiBQYXJhbWV0ZXIgVHlwZS4KKyAqCisgKiAwMCAtIFN0b3AgcHJvY2Vzc2luZyB0aGlzIFNDVFAgY2h1bmsgYW5kIGRpc2NhcmQgaXQsCisgKglkbyBub3QgcHJvY2VzcyBhbnkgZnVydGhlciBjaHVua3Mgd2l0aGluIGl0LgorICoKKyAqIDAxIC0gU3RvcCBwcm9jZXNzaW5nIHRoaXMgU0NUUCBjaHVuayBhbmQgZGlzY2FyZCBpdCwKKyAqCWRvIG5vdCBwcm9jZXNzIGFueSBmdXJ0aGVyIGNodW5rcyB3aXRoaW4gaXQsIGFuZCByZXBvcnQKKyAqCXRoZSB1bnJlY29nbml6ZWQgcGFyYW1ldGVyIGluIGFuICdVbnJlY29nbml6ZWQKKyAqCVBhcmFtZXRlciBUeXBlJyAoaW4gZWl0aGVyIGFuIEVSUk9SIG9yIGluIHRoZSBJTklUIEFDSykuCisgKgorICogMTAgLSBTa2lwIHRoaXMgcGFyYW1ldGVyIGFuZCBjb250aW51ZSBwcm9jZXNzaW5nLgorICoKKyAqIDExIC0gU2tpcCB0aGlzIHBhcmFtZXRlciBhbmQgY29udGludWUgcHJvY2Vzc2luZyBidXQKKyAqCXJlcG9ydCB0aGUgdW5yZWNvZ25pemVkIHBhcmFtZXRlciBpbiBhbgorICoJJ1VucmVjb2duaXplZCBQYXJhbWV0ZXIgVHlwZScgKGluIGVpdGhlciBhbiBFUlJPUiBvciBpbgorICoJdGhlIElOSVQgQUNLKS4KKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJMCAtIGRpc2NhcmQgdGhlIGNodW5rCisgKiAJMSAtIGNvbnRpbnVlIHdpdGggdGhlIGNodW5rCisgKi8KK3N0YXRpYyBpbnQgc2N0cF9wcm9jZXNzX3Vua19wYXJhbShjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkgIHVuaW9uIHNjdHBfcGFyYW1zIHBhcmFtLAorCQkJCSAgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLAorCQkJCSAgc3RydWN0IHNjdHBfY2h1bmsgKiplcnJwKQoreworCWludCByZXR2YWwgPSAxOworCisJc3dpdGNoIChwYXJhbS5wLT50eXBlICYgU0NUUF9QQVJBTV9BQ1RJT05fTUFTSykgeworCWNhc2UgU0NUUF9QQVJBTV9BQ1RJT05fRElTQ0FSRDoKKwkJcmV0dmFsID0gIDA7CisJCWJyZWFrOworCWNhc2UgU0NUUF9QQVJBTV9BQ1RJT05fRElTQ0FSRF9FUlI6CisJCXJldHZhbCA9ICAwOworCQkvKiBNYWtlIGFuIEVSUk9SIGNodW5rLCBwcmVwYXJpbmcgZW5vdWdoIHJvb20gZm9yCisJCSAqIHJldHVybmluZyBtdWx0aXBsZSB1bmtub3duIHBhcmFtZXRlcnMuCisJCSAqLworCQlpZiAoTlVMTCA9PSAqZXJycCkKKwkJCSplcnJwID0gc2N0cF9tYWtlX29wX2Vycm9yX3NwYWNlKGFzb2MsIGNodW5rLAorCQkJCQludG9ocyhjaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpKTsKKworCQlpZiAoKmVycnApCisJCQlzY3RwX2luaXRfY2F1c2UoKmVycnAsIFNDVFBfRVJST1JfVU5LTk9XTl9QQVJBTSwKKwkJCQkJcGFyYW0udiwKKwkJCQkJV09SRF9ST1VORChudG9ocyhwYXJhbS5wLT5sZW5ndGgpKSk7CisKKwkJYnJlYWs7CisJY2FzZSBTQ1RQX1BBUkFNX0FDVElPTl9TS0lQOgorCQlicmVhazsKKwljYXNlIFNDVFBfUEFSQU1fQUNUSU9OX1NLSVBfRVJSOgorCQkvKiBNYWtlIGFuIEVSUk9SIGNodW5rLCBwcmVwYXJpbmcgZW5vdWdoIHJvb20gZm9yCisJCSAqIHJldHVybmluZyBtdWx0aXBsZSB1bmtub3duIHBhcmFtZXRlcnMuCisJCSAqLworCQlpZiAoTlVMTCA9PSAqZXJycCkKKwkJCSplcnJwID0gc2N0cF9tYWtlX29wX2Vycm9yX3NwYWNlKGFzb2MsIGNodW5rLAorCQkJCQludG9ocyhjaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpKTsKKworCQlpZiAoKmVycnApIHsKKwkJCXNjdHBfaW5pdF9jYXVzZSgqZXJycCwgU0NUUF9FUlJPUl9VTktOT1dOX1BBUkFNLAorCQkJCQlwYXJhbS52LAorCQkJCQlXT1JEX1JPVU5EKG50b2hzKHBhcmFtLnAtPmxlbmd0aCkpKTsKKwkJfSBlbHNlIHsKKwkJCS8qIElmIHRoZXJlIGlzIG5vIG1lbW9yeSBmb3IgZ2VuZXJhdGluZyB0aGUgRVJST1IKKwkJCSAqIHJlcG9ydCBhcyBzcGVjaWZpZWQsIGFuIEFCT1JUIHdpbGwgYmUgdHJpZ2dlcmVkCisJCQkgKiB0byB0aGUgcGVlciBhbmQgdGhlIGFzc29jaWF0aW9uIHdvbid0IGJlCisJCQkgKiBlc3RhYmxpc2hlZC4KKwkJCSAqLworCQkJcmV0dmFsID0gMDsKKwkJfQorCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIEZpbmQgdW5yZWNvZ25pemVkIHBhcmFtZXRlcnMgaW4gdGhlIGNodW5rLgorICogUmV0dXJuIHZhbHVlczoKKyAqIAkwIC0gZGlzY2FyZCB0aGUgY2h1bmsKKyAqIAkxIC0gY29udGludWUgd2l0aCB0aGUgY2h1bmsKKyAqLworc3RhdGljIGludCBzY3RwX3ZlcmlmeV9wYXJhbShjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCSAgICAgdW5pb24gc2N0cF9wYXJhbXMgcGFyYW0sCisJCQkgICAgIHNjdHBfY2lkX3QgY2lkLAorCQkJICAgICBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCisJCQkgICAgIHN0cnVjdCBzY3RwX2NodW5rICoqZXJyX2NodW5rKQoreworCWludCByZXR2YWwgPSAxOworCisJLyogRklYTUUgLSBUaGlzIHJvdXRpbmUgaXMgbm90IGxvb2tpbmcgYXQgZWFjaCBwYXJhbWV0ZXIgcGVyIHRoZQorCSAqIGNodW5rIHR5cGUsIGkuZS4sIHVucmVjb2duaXplZCBwYXJhbWV0ZXJzIHNob3VsZCBiZSBmdXJ0aGVyCisJICogaWRlbnRpZmllZCBiYXNlZCBvbiB0aGUgY2h1bmsgaWQuCisJICovCisKKwlzd2l0Y2ggKHBhcmFtLnAtPnR5cGUpIHsKKwljYXNlIFNDVFBfUEFSQU1fSVBWNF9BRERSRVNTOgorCWNhc2UgU0NUUF9QQVJBTV9JUFY2X0FERFJFU1M6CisJY2FzZSBTQ1RQX1BBUkFNX0NPT0tJRV9QUkVTRVJWQVRJVkU6CisJY2FzZSBTQ1RQX1BBUkFNX1NVUFBPUlRFRF9BRERSRVNTX1RZUEVTOgorCWNhc2UgU0NUUF9QQVJBTV9TVEFURV9DT09LSUU6CisJY2FzZSBTQ1RQX1BBUkFNX0hFQVJUQkVBVF9JTkZPOgorCWNhc2UgU0NUUF9QQVJBTV9VTlJFQ09HTklaRURfUEFSQU1FVEVSUzoKKwljYXNlIFNDVFBfUEFSQU1fRUNOX0NBUEFCTEU6CisJY2FzZSBTQ1RQX1BBUkFNX0FEQVBUSU9OX0xBWUVSX0lORDoKKwkJYnJlYWs7CisKKwljYXNlIFNDVFBfUEFSQU1fSE9TVF9OQU1FX0FERFJFU1M6CisJCS8qIFRlbGwgdGhlIHBlZXIsIHdlIHdvbid0IHN1cHBvcnQgdGhpcyBwYXJhbS4gICovCisJCXJldHVybiBzY3RwX3Byb2Nlc3NfaG5fcGFyYW0oYXNvYywgcGFyYW0sIGNodW5rLCBlcnJfY2h1bmspOworCWNhc2UgU0NUUF9QQVJBTV9GV0RfVFNOX1NVUFBPUlQ6CisJCWlmIChzY3RwX3Byc2N0cF9lbmFibGUpCisJCQlicmVhazsKKwkJLyogRmFsbCBUaHJvdWdoICovIAorCWRlZmF1bHQ6CisJCVNDVFBfREVCVUdfUFJJTlRLKCJVbnJlY29nbml6ZWQgcGFyYW06ICVkIGZvciBjaHVuayAlZC5cbiIsCisJCQkJbnRvaHMocGFyYW0ucC0+dHlwZSksIGNpZCk7CisJCXJldHVybiBzY3RwX3Byb2Nlc3NfdW5rX3BhcmFtKGFzb2MsIHBhcmFtLCBjaHVuaywgZXJyX2NodW5rKTsKKworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogVmVyaWZ5IHRoZSBJTklUIHBhY2tldCBiZWZvcmUgd2UgcHJvY2VzcyBpdC4gICovCitpbnQgc2N0cF92ZXJpZnlfaW5pdChjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJICAgICBzY3RwX2NpZF90IGNpZCwKKwkJICAgICBzY3RwX2luaXRfY2h1bmtfdCAqcGVlcl9pbml0LAorCQkgICAgIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKKwkJICAgICBzdHJ1Y3Qgc2N0cF9jaHVuayAqKmVycnApCit7CisJdW5pb24gc2N0cF9wYXJhbXMgcGFyYW07CisJaW50IGhhc19jb29raWUgPSAwOworCisJLyogVmVyaWZ5IHN0cmVhbSB2YWx1ZXMgYXJlIG5vbi16ZXJvLiAqLworCWlmICgoMCA9PSBwZWVyX2luaXQtPmluaXRfaGRyLm51bV9vdXRib3VuZF9zdHJlYW1zKSB8fAorCSAgICAoMCA9PSBwZWVyX2luaXQtPmluaXRfaGRyLm51bV9pbmJvdW5kX3N0cmVhbXMpKSB7CisKKwkJc2N0cF9wcm9jZXNzX2ludl9tYW5kYXRvcnkoYXNvYywgY2h1bmssIGVycnApOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDaGVjayBmb3IgbWlzc2luZyBtYW5kYXRvcnkgcGFyYW1ldGVycy4gICovCisJc2N0cF93YWxrX3BhcmFtcyhwYXJhbSwgcGVlcl9pbml0LCBpbml0X2hkci5wYXJhbXMpIHsKKworCQlpZiAoU0NUUF9QQVJBTV9TVEFURV9DT09LSUUgPT0gcGFyYW0ucC0+dHlwZSkKKwkJCWhhc19jb29raWUgPSAxOworCisJfSAvKiBmb3IgKGxvb3AgdGhyb3VnaCBhbGwgcGFyYW1ldGVycykgKi8KKworCS8qIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCBhIHBhcmFtZXRlciBsZW5ndGggd2FzIGJhZCBhbmQKKwkgKiBpbiB0aGF0IGNhc2Ugd2Ugd291bGQgaGF2ZSBzdG9wZWQgd2Fsa2luZyB0aGUgcGFyYW1ldGVycy4KKwkgKiBUaGUgY3VycmVudCBwYXJhbS5wIHdvdWxkIHBvaW50IGF0IHRoZSBiYWQgb25lLgorCSAqIEN1cnJlbnQgY29uc2Vuc3VzIG9uIHRoZSBtYWlsaW5nIGxpc3QgaXMgdG8gZ2VuZXJhdGUgYSBQUk9UT0NPTAorCSAqIFZJT0xBVElPTiBlcnJvci4gIFdlIGJ1aWxkIHRoZSBFUlJPUiBjaHVuayBoZXJlIGFuZCBsZXQgdGhlIG5vcm1hbAorCSAqIGVycm9yIGhhbmRsaW5nIGNvZGUgYnVpbGQgYW5kIHNlbmQgdGhlIHBhY2tldC4KKwkgKi8KKwlpZiAocGFyYW0udiA8ICh2b2lkKiljaHVuay0+Y2h1bmtfZW5kIC0gc2l6ZW9mKHNjdHBfcGFyYW1oZHJfdCkpIHsKKwkJc2N0cF9wcm9jZXNzX2ludl9wYXJhbWxlbmd0aChhc29jLCBwYXJhbS5wLCBjaHVuaywgZXJycCk7CisJCXJldHVybiAwOworCX0KKworCS8qIFRoZSBvbmx5IG1pc3NpbmcgbWFuZGF0b3J5IHBhcmFtIHBvc3NpYmxlIHRvZGF5IGlzCisJICogdGhlIHN0YXRlIGNvb2tpZSBmb3IgYW4gSU5JVC1BQ0sgY2h1bmsuCisJICovCisJaWYgKChTQ1RQX0NJRF9JTklUX0FDSyA9PSBjaWQpICYmICFoYXNfY29va2llKSB7CisJCXNjdHBfcHJvY2Vzc19taXNzaW5nX3BhcmFtKGFzb2MsIFNDVFBfUEFSQU1fU1RBVEVfQ09PS0lFLAorCQkJCQkgICBjaHVuaywgZXJycCk7CisJCXJldHVybiAwOworCX0KKworCS8qIEZpbmQgdW5yZWNvZ25pemVkIHBhcmFtZXRlcnMuICovCisKKwlzY3RwX3dhbGtfcGFyYW1zKHBhcmFtLCBwZWVyX2luaXQsIGluaXRfaGRyLnBhcmFtcykgeworCisJCWlmICghc2N0cF92ZXJpZnlfcGFyYW0oYXNvYywgcGFyYW0sIGNpZCwgY2h1bmssIGVycnApKSB7CisJCQlpZiAoU0NUUF9QQVJBTV9IT1NUX05BTUVfQUREUkVTUyA9PSBwYXJhbS5wLT50eXBlKQorCQkJCXJldHVybiAwOworCQkJZWxzZQorCQkJCXJldHVybiAxOworCQl9CisKKwl9IC8qIGZvciAobG9vcCB0aHJvdWdoIGFsbCBwYXJhbWV0ZXJzKSAqLworCisJcmV0dXJuIDE7Cit9CisKKy8qIFVucGFjayB0aGUgcGFyYW1ldGVycyBpbiBhbiBJTklUIHBhY2tldCBpbnRvIGFuIGFzc29jaWF0aW9uLgorICogUmV0dXJucyAwIG9uIGZhaWx1cmUsIGVsc2Ugc3VjY2Vzcy4KKyAqIEZJWE1FOiAgVGhpcyBpcyBhbiBhc3NvY2lhdGlvbiBtZXRob2QuCisgKi8KK2ludCBzY3RwX3Byb2Nlc3NfaW5pdChzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywgc2N0cF9jaWRfdCBjaWQsCisJCSAgICAgIGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqcGVlcl9hZGRyLAorCQkgICAgICBzY3RwX2luaXRfY2h1bmtfdCAqcGVlcl9pbml0LCBpbnQgZ2ZwKQoreworCXVuaW9uIHNjdHBfcGFyYW1zIHBhcmFtOworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0OworCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKnRlbXA7CisJY2hhciAqY29va2llOworCisJLyogV2UgbXVzdCBpbmNsdWRlIHRoZSBhZGRyZXNzIHRoYXQgdGhlIElOSVQgcGFja2V0IGNhbWUgZnJvbS4KKwkgKiBUaGlzIGlzIHRoZSBvbmx5IGFkZHJlc3MgdGhhdCBtYXR0ZXJzIGZvciBhbiBJTklUIHBhY2tldC4KKwkgKiBXaGVuIHByb2Nlc3NpbmcgYSBDT09LSUUgRUNITywgd2UgcmV0cmlldmUgdGhlIGZyb20gYWRkcmVzcworCSAqIG9mIHRoZSBJTklUIGZyb20gdGhlIGNvb2tpZS4KKwkgKi8KKworCS8qIFRoaXMgaW1wbGVtZW50YXRpb24gZGVmYXVsdHMgdG8gbWFraW5nIHRoZSBmaXJzdCB0cmFuc3BvcnQKKwkgKiBhZGRlZCBhcyB0aGUgcHJpbWFyeSB0cmFuc3BvcnQuICBUaGUgc291cmNlIGFkZHJlc3Mgc2VlbXMgdG8KKwkgKiBiZSBhIGEgYmV0dGVyIGNob2ljZSB0aGFuIGFueSBvZiB0aGUgZW1iZWRkZWQgYWRkcmVzc2VzLgorCSAqLworCWlmIChwZWVyX2FkZHIpCisJCWlmKCFzY3RwX2Fzc29jX2FkZF9wZWVyKGFzb2MsIHBlZXJfYWRkciwgZ2ZwKSkKKwkJCWdvdG8gbm9tZW07CisKKwkvKiBQcm9jZXNzIHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLiAgKi8KKworCXNjdHBfd2Fsa19wYXJhbXMocGFyYW0sIHBlZXJfaW5pdCwgaW5pdF9oZHIucGFyYW1zKSB7CisKKwkJaWYgKCFzY3RwX3Byb2Nlc3NfcGFyYW0oYXNvYywgcGFyYW0sIHBlZXJfYWRkciwgZ2ZwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2xlYW5fdXA7CisJfQorCisJLyogVGhlIGZpeGVkIElOSVQgaGVhZGVycyBhcmUgYWx3YXlzIGluIG5ldHdvcmsgYnl0ZQorCSAqIG9yZGVyLgorCSAqLworCWFzb2MtPnBlZXIuaS5pbml0X3RhZyA9CisJCW50b2hsKHBlZXJfaW5pdC0+aW5pdF9oZHIuaW5pdF90YWcpOworCWFzb2MtPnBlZXIuaS5hX3J3bmQgPQorCQludG9obChwZWVyX2luaXQtPmluaXRfaGRyLmFfcnduZCk7CisJYXNvYy0+cGVlci5pLm51bV9vdXRib3VuZF9zdHJlYW1zID0KKwkJbnRvaHMocGVlcl9pbml0LT5pbml0X2hkci5udW1fb3V0Ym91bmRfc3RyZWFtcyk7CisJYXNvYy0+cGVlci5pLm51bV9pbmJvdW5kX3N0cmVhbXMgPQorCQludG9ocyhwZWVyX2luaXQtPmluaXRfaGRyLm51bV9pbmJvdW5kX3N0cmVhbXMpOworCWFzb2MtPnBlZXIuaS5pbml0aWFsX3RzbiA9CisJCW50b2hsKHBlZXJfaW5pdC0+aW5pdF9oZHIuaW5pdGlhbF90c24pOworCisJLyogQXBwbHkgdGhlIHVwcGVyIGJvdW5kcyBmb3Igb3V0cHV0IHN0cmVhbXMgYmFzZWQgb24gcGVlcidzCisJICogbnVtYmVyIG9mIGluYm91bmQgc3RyZWFtcy4KKwkgKi8KKwlpZiAoYXNvYy0+Yy5zaW5pdF9udW1fb3N0cmVhbXMgID4KKwkgICAgbnRvaHMocGVlcl9pbml0LT5pbml0X2hkci5udW1faW5ib3VuZF9zdHJlYW1zKSkgeworCQlhc29jLT5jLnNpbml0X251bV9vc3RyZWFtcyA9CisJCQludG9ocyhwZWVyX2luaXQtPmluaXRfaGRyLm51bV9pbmJvdW5kX3N0cmVhbXMpOworCX0KKworCWlmIChhc29jLT5jLnNpbml0X21heF9pbnN0cmVhbXMgPgorCSAgICBudG9ocyhwZWVyX2luaXQtPmluaXRfaGRyLm51bV9vdXRib3VuZF9zdHJlYW1zKSkgeworCQlhc29jLT5jLnNpbml0X21heF9pbnN0cmVhbXMgPQorCQkJbnRvaHMocGVlcl9pbml0LT5pbml0X2hkci5udW1fb3V0Ym91bmRfc3RyZWFtcyk7CisJfQorCisJLyogQ29weSBJbml0aWF0aW9uIHRhZyBmcm9tIElOSVQgdG8gVlRfcGVlciBpbiBjb29raWUuICAgKi8KKwlhc29jLT5jLnBlZXJfdnRhZyA9IGFzb2MtPnBlZXIuaS5pbml0X3RhZzsKKworCS8qIFBlZXIgUnduZCAgIDogQ3VycmVudCBjYWxjdWxhdGVkIHZhbHVlIG9mIHRoZSBwZWVyJ3MgcnduZC4gICovCisJYXNvYy0+cGVlci5yd25kID0gYXNvYy0+cGVlci5pLmFfcnduZDsKKworCS8qIENvcHkgY29va2llIGluIGNhc2Ugd2UgbmVlZCB0byByZXNlbmQgQ09PS0lFLUVDSE8uICovCisJY29va2llID0gYXNvYy0+cGVlci5jb29raWU7CisJaWYgKGNvb2tpZSkgeworCQlhc29jLT5wZWVyLmNvb2tpZSA9IGttYWxsb2MoYXNvYy0+cGVlci5jb29raWVfbGVuLCBnZnApOworCQlpZiAoIWFzb2MtPnBlZXIuY29va2llKQorCQkJZ290byBjbGVhbl91cDsKKwkJbWVtY3B5KGFzb2MtPnBlZXIuY29va2llLCBjb29raWUsIGFzb2MtPnBlZXIuY29va2llX2xlbik7CisJfQorCisJLyogUkZDIDI5NjAgNy4yLjEgVGhlIGluaXRpYWwgdmFsdWUgb2Ygc3N0aHJlc2ggTUFZIGJlIGFyYml0cmFyaWx5CisJICogaGlnaCAoZm9yIGV4YW1wbGUsIGltcGxlbWVudGF0aW9ucyBNQVkgdXNlIHRoZSBzaXplIG9mIHRoZSByZWNlaXZlcgorCSAqIGFkdmVydGlzZWQgd2luZG93KS4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoKHBvcywgJmFzb2MtPnBlZXIudHJhbnNwb3J0X2FkZHJfbGlzdCkgeworCQl0cmFuc3BvcnQgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHNjdHBfdHJhbnNwb3J0LCB0cmFuc3BvcnRzKTsKKwkJdHJhbnNwb3J0LT5zc3RocmVzaCA9IGFzb2MtPnBlZXIuaS5hX3J3bmQ7CisJfQorCisJLyogU2V0IHVwIHRoZSBUU04gdHJhY2tpbmcgcGllY2VzLiAgKi8KKwlzY3RwX3Rzbm1hcF9pbml0KCZhc29jLT5wZWVyLnRzbl9tYXAsIFNDVFBfVFNOX01BUF9TSVpFLAorCQkJIGFzb2MtPnBlZXIuaS5pbml0aWFsX3Rzbik7CisKKwkvKiBSRkMgMjk2MCA2LjUgU3RyZWFtIElkZW50aWZpZXIgYW5kIFN0cmVhbSBTZXF1ZW5jZSBOdW1iZXIKKwkgKgorCSAqIFRoZSBzdHJlYW0gc2VxdWVuY2UgbnVtYmVyIGluIGFsbCB0aGUgc3RyZWFtcyBzaGFsbCBzdGFydAorCSAqIGZyb20gMCB3aGVuIHRoZSBhc3NvY2lhdGlvbiBpcyBlc3RhYmxpc2hlZC4gIEFsc28sIHdoZW4gdGhlCisJICogc3RyZWFtIHNlcXVlbmNlIG51bWJlciByZWFjaGVzIHRoZSB2YWx1ZSA2NTUzNSB0aGUgbmV4dAorCSAqIHN0cmVhbSBzZXF1ZW5jZSBudW1iZXIgc2hhbGwgYmUgc2V0IHRvIDAuCisJICovCisKKwkvKiBBbGxvY2F0ZSBzdG9yYWdlIGZvciB0aGUgbmVnb3RpYXRlZCBzdHJlYW1zIGlmIGl0IGlzIG5vdCBhIHRlbXBvcmFyeSAJICogYXNzb2NpYXRpb24uCisJICovCisJaWYgKCFhc29jLT50ZW1wKSB7CisJCWludCBhc3NvY19pZDsKKwkJaW50IGVycm9yOworCisJCWFzb2MtPnNzbm1hcCA9IHNjdHBfc3NubWFwX25ldyhhc29jLT5jLnNpbml0X21heF9pbnN0cmVhbXMsCisJCQkJCSAgICAgICBhc29jLT5jLnNpbml0X251bV9vc3RyZWFtcywgZ2ZwKTsKKwkJaWYgKCFhc29jLT5zc25tYXApCisJCQlnb3RvIGNsZWFuX3VwOworCisJcmV0cnk6CisJCWlmICh1bmxpa2VseSghaWRyX3ByZV9nZXQoJnNjdHBfYXNzb2NzX2lkLCBnZnApKSkKKwkJCWdvdG8gY2xlYW5fdXA7CisJCXNwaW5fbG9ja19iaCgmc2N0cF9hc3NvY3NfaWRfbG9jayk7CisJCWVycm9yID0gaWRyX2dldF9uZXdfYWJvdmUoJnNjdHBfYXNzb2NzX2lkLCAodm9pZCAqKWFzb2MsIDEsCisJCQkJCSAgJmFzc29jX2lkKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNjdHBfYXNzb2NzX2lkX2xvY2spOworCQlpZiAoZXJyb3IgPT0gLUVBR0FJTikKKwkJCWdvdG8gcmV0cnk7CisJCWVsc2UgaWYgKGVycm9yKQorCQkJZ290byBjbGVhbl91cDsKKworCQlhc29jLT5hc3NvY19pZCA9IChzY3RwX2Fzc29jX3QpIGFzc29jX2lkOworCX0KKworCS8qIEFERElQIFNlY3Rpb24gNC4xIEFTQ09ORiBDaHVuayBQcm9jZWR1cmVzCisJICoKKwkgKiBXaGVuIGFuIGVuZHBvaW50IGhhcyBhbiBBU0NPTkYgc2lnbmFsZWQgY2hhbmdlIHRvIGJlIHNlbnQgdG8gdGhlCisJICogcmVtb3RlIGVuZHBvaW50IGl0IHNob3VsZCBkbyB0aGUgZm9sbG93aW5nOgorCSAqIC4uLgorCSAqIEEyKSBBIHNlcmlhbCBudW1iZXIgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZSBDaHVuay4gVGhlIHNlcmlhbAorCSAqIG51bWJlciBzaG91bGQgYmUgYSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgbnVtYmVyLiBBbGwgc2VyaWFsCisJICogbnVtYmVycyBhcmUgZGVmaW5lZCB0byBiZSBpbml0aWFsaXplZCBhdCB0aGUgc3RhcnQgb2YgdGhlCisJICogYXNzb2NpYXRpb24gdG8gdGhlIHNhbWUgdmFsdWUgYXMgdGhlIEluaXRpYWwgVFNOLgorCSAqLworCWFzb2MtPnBlZXIuYWRkaXBfc2VyaWFsID0gYXNvYy0+cGVlci5pLmluaXRpYWxfdHNuIC0gMTsKKwlyZXR1cm4gMTsKKworY2xlYW5fdXA6CisJLyogUmVsZWFzZSB0aGUgdHJhbnNwb3J0IHN0cnVjdHVyZXMuICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdGVtcCwgJmFzb2MtPnBlZXIudHJhbnNwb3J0X2FkZHJfbGlzdCkgeworCQl0cmFuc3BvcnQgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHNjdHBfdHJhbnNwb3J0LCB0cmFuc3BvcnRzKTsKKwkJbGlzdF9kZWxfaW5pdChwb3MpOworCQlzY3RwX3RyYW5zcG9ydF9mcmVlKHRyYW5zcG9ydCk7CisJfQorbm9tZW06CisJcmV0dXJuIDA7Cit9CisKKworLyogVXBkYXRlIGFzb2Mgd2l0aCB0aGUgb3B0aW9uIGRlc2NyaWJlZCBpbiBwYXJhbS4KKyAqCisgKiBSRkMyOTYwIDMuMy4yLjEgT3B0aW9uYWwvVmFyaWFibGUgTGVuZ3RoIFBhcmFtZXRlcnMgaW4gSU5JVAorICoKKyAqIGFzb2MgaXMgdGhlIGFzc29jaWF0aW9uIHRvIHVwZGF0ZS4KKyAqIHBhcmFtIGlzIHRoZSB2YXJpYWJsZSBsZW5ndGggcGFyYW1ldGVyIHRvIHVzZSBmb3IgdXBkYXRlLgorICogY2lkIHRlbGxzIHVzIGlmIHRoaXMgaXMgYW4gSU5JVCwgSU5JVCBBQ0sgb3IgQ09PS0lFIEVDSE8uCisgKiBJZiB0aGUgY3VycmVudCBwYWNrZXQgaXMgYW4gSU5JVCB3ZSB3YW50IHRvIG1pbmltaXplIHRoZSBhbW91bnQgb2YKKyAqIHdvcmsgd2UgZG8uICBJbiBwYXJ0aWN1bGFyLCB3ZSBzaG91bGQgbm90IGJ1aWxkIHRyYW5zcG9ydAorICogc3RydWN0dXJlcyBmb3IgdGhlIGFkZHJlc3Nlcy4KKyAqLworc3RhdGljIGludCBzY3RwX3Byb2Nlc3NfcGFyYW0oc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkgICAgICB1bmlvbiBzY3RwX3BhcmFtcyBwYXJhbSwKKwkJCSAgICAgIGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqcGVlcl9hZGRyLAorCQkJICAgICAgaW50IGdmcCkKK3sKKwl1bmlvbiBzY3RwX2FkZHIgYWRkcjsKKwlpbnQgaTsKKwlfX3UxNiBzYXQ7CisJaW50IHJldHZhbCA9IDE7CisJc2N0cF9zY29wZV90IHNjb3BlOworCXRpbWVfdCBzdGFsZTsKKwlzdHJ1Y3Qgc2N0cF9hZiAqYWY7CisKKwkvKiBXZSBtYWludGFpbiBhbGwgSU5JVCBwYXJhbWV0ZXJzIGluIG5ldHdvcmsgYnl0ZSBvcmRlciBhbGwgdGhlCisJICogdGltZS4gIFRoaXMgYWxsb3dzIHVzIHRvIG5vdCB3b3JyeSBhYm91dCB3aGV0aGVyIHRoZSBwYXJhbWV0ZXJzCisJICogY2FtZSBmcm9tIGEgZnJlc2ggSU5JVCwgYW5kIElOSVQgQUNLLCBvciB3ZXJlIHN0b3JlZCBpbiBhIGNvb2tpZS4KKwkgKi8KKwlzd2l0Y2ggKHBhcmFtLnAtPnR5cGUpIHsKKwljYXNlIFNDVFBfUEFSQU1fSVBWNl9BRERSRVNTOgorCQlpZiAoUEZfSU5FVDYgIT0gYXNvYy0+YmFzZS5zay0+c2tfZmFtaWx5KQorCQkJYnJlYWs7CisJCS8qIEZhbGwgdGhyb3VnaC4gKi8KKwljYXNlIFNDVFBfUEFSQU1fSVBWNF9BRERSRVNTOgorCQlhZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKHBhcmFtX3R5cGUyYWYocGFyYW0ucC0+dHlwZSkpOworCQlhZi0+ZnJvbV9hZGRyX3BhcmFtKCZhZGRyLCBwYXJhbS5hZGRyLCBhc29jLT5wZWVyLnBvcnQsIDApOworCQlzY29wZSA9IHNjdHBfc2NvcGUocGVlcl9hZGRyKTsKKwkJaWYgKHNjdHBfaW5fc2NvcGUoJmFkZHIsIHNjb3BlKSkKKwkJCWlmICghc2N0cF9hc3NvY19hZGRfcGVlcihhc29jLCAmYWRkciwgZ2ZwKSkKKwkJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisKKwljYXNlIFNDVFBfUEFSQU1fQ09PS0lFX1BSRVNFUlZBVElWRToKKwkJaWYgKCFzY3RwX2Nvb2tpZV9wcmVzZXJ2ZV9lbmFibGUpCisJCQlicmVhazsKKworCQlzdGFsZSA9IG50b2hsKHBhcmFtLmxpZmUtPmxpZmVzcGFuX2luY3JlbWVudCk7CisKKwkJLyogU3VnZ2VzdGVkIENvb2tpZSBMaWZlIHNwYW4gaW5jcmVtZW50J3MgdW5pdCBpcyBtc2VjLAorCQkgKiAoMS8xMDAwc2VjKS4KKwkJICovCisJCWFzb2MtPmNvb2tpZV9saWZlLnR2X3NlYyArPSBzdGFsZSAvIDEwMDA7CisJCWFzb2MtPmNvb2tpZV9saWZlLnR2X3VzZWMgKz0gKHN0YWxlICUgMTAwMCkgKiAxMDAwOworCQlicmVhazsKKworCWNhc2UgU0NUUF9QQVJBTV9IT1NUX05BTUVfQUREUkVTUzoKKwkJU0NUUF9ERUJVR19QUklOVEsoInVuaW1wbGVtZW50ZWQgU0NUUF9IT1NUX05BTUVfQUREUkVTU1xuIik7CisJCWJyZWFrOworCisJY2FzZSBTQ1RQX1BBUkFNX1NVUFBPUlRFRF9BRERSRVNTX1RZUEVTOgorCQkvKiBUdXJuIG9mZiB0aGUgZGVmYXVsdCB2YWx1ZXMgZmlyc3Qgc28gd2UnbGwga25vdyB3aGljaAorCQkgKiBvbmVzIGFyZSByZWFsbHkgc2V0IGJ5IHRoZSBwZWVyLgorCQkgKi8KKwkJYXNvYy0+cGVlci5pcHY0X2FkZHJlc3MgPSAwOworCQlhc29jLT5wZWVyLmlwdjZfYWRkcmVzcyA9IDA7CisKKwkJLyogQ3ljbGUgdGhyb3VnaCBhZGRyZXNzIHR5cGVzOyBhdm9pZCBkaXZpZGUgYnkgMC4gKi8KKwkJc2F0ID0gbnRvaHMocGFyYW0ucC0+bGVuZ3RoKSAtIHNpemVvZihzY3RwX3BhcmFtaGRyX3QpOworCQlpZiAoc2F0KQorCQkJc2F0IC89IHNpemVvZihfX3UxNik7CisKKwkJZm9yIChpID0gMDsgaSA8IHNhdDsgKytpKSB7CisJCQlzd2l0Y2ggKHBhcmFtLnNhdC0+dHlwZXNbaV0pIHsKKwkJCWNhc2UgU0NUUF9QQVJBTV9JUFY0X0FERFJFU1M6CisJCQkJYXNvYy0+cGVlci5pcHY0X2FkZHJlc3MgPSAxOworCQkJCWJyZWFrOworCisJCQljYXNlIFNDVFBfUEFSQU1fSVBWNl9BRERSRVNTOgorCQkJCWFzb2MtPnBlZXIuaXB2Nl9hZGRyZXNzID0gMTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTQ1RQX1BBUkFNX0hPU1RfTkFNRV9BRERSRVNTOgorCQkJCWFzb2MtPnBlZXIuaG9zdG5hbWVfYWRkcmVzcyA9IDE7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6IC8qIEp1c3QgaWdub3JlIGFueXRoaW5nIGVsc2UuICAqLworCQkJCWJyZWFrOworCQkJfTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0NUUF9QQVJBTV9TVEFURV9DT09LSUU6CisJCWFzb2MtPnBlZXIuY29va2llX2xlbiA9CisJCQludG9ocyhwYXJhbS5wLT5sZW5ndGgpIC0gc2l6ZW9mKHNjdHBfcGFyYW1oZHJfdCk7CisJCWFzb2MtPnBlZXIuY29va2llID0gcGFyYW0uY29va2llLT5ib2R5OworCQlicmVhazsKKworCWNhc2UgU0NUUF9QQVJBTV9IRUFSVEJFQVRfSU5GTzoKKwkJLyogV291bGQgYmUgb2RkIHRvIHJlY2VpdmUsIGJ1dCBpdCBjYXVzZXMgbm8gcHJvYmxlbXMuICovCisJCWJyZWFrOworCisJY2FzZSBTQ1RQX1BBUkFNX1VOUkVDT0dOSVpFRF9QQVJBTUVURVJTOgorCQkvKiBSZWplY3RlZCBkdXJpbmcgdmVyaWZ5IHN0YWdlLiAqLworCQlicmVhazsKKworCWNhc2UgU0NUUF9QQVJBTV9FQ05fQ0FQQUJMRToKKwkJYXNvYy0+cGVlci5lY25fY2FwYWJsZSA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTQ1RQX1BBUkFNX0FEQVBUSU9OX0xBWUVSX0lORDoKKwkJYXNvYy0+cGVlci5hZGFwdGlvbl9pbmQgPSBwYXJhbS5haW5kLT5hZGFwdGlvbl9pbmQ7CisJCWJyZWFrOworCisJY2FzZSBTQ1RQX1BBUkFNX0ZXRF9UU05fU1VQUE9SVDoKKwkJaWYgKHNjdHBfcHJzY3RwX2VuYWJsZSkgeworCQkJYXNvYy0+cGVlci5wcnNjdHBfY2FwYWJsZSA9IDE7CisJCQlicmVhazsKKwkJfQorCQkvKiBGYWxsIFRocm91Z2ggKi8gCisJZGVmYXVsdDoKKwkJLyogQW55IHVucmVjb2duaXplZCBwYXJhbWV0ZXJzIHNob3VsZCBoYXZlIGJlZW4gY2F1Z2h0CisJCSAqIGFuZCBoYW5kbGVkIGJ5IHNjdHBfdmVyaWZ5X3BhcmFtKCkgd2hpY2ggc2hvdWxkIGJlCisJCSAqIGNhbGxlZCBwcmlvciB0byB0aGlzIHJvdXRpbmUuICBTaW1wbHkgbG9nIHRoZSBlcnJvcgorCQkgKiBoZXJlLgorCQkgKi8KKwkJU0NUUF9ERUJVR19QUklOVEsoIklnbm9yaW5nIHBhcmFtOiAlZCBmb3IgYXNzb2NpYXRpb24gJXAuXG4iLAorCQkJCSAgbnRvaHMocGFyYW0ucC0+dHlwZSksIGFzb2MpOworCQlicmVhazsKKwl9OworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogU2VsZWN0IGEgbmV3IHZlcmlmaWNhdGlvbiB0YWcuICAqLworX191MzIgc2N0cF9nZW5lcmF0ZV90YWcoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwKQoreworCS8qIEkgYmVsaWV2ZSB0aGF0IHRoaXMgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgY29tcGxpZXMgd2l0aCBSRkMxNzUwLgorCSAqIEEgdGFnIG9mIDAgaXMgcmVzZXJ2ZWQgZm9yIHNwZWNpYWwgY2FzZXMgKGUuZy4gSU5JVCkuCisJICovCisJX191MzIgeDsKKworCWRvIHsKKwkJZ2V0X3JhbmRvbV9ieXRlcygmeCwgc2l6ZW9mKF9fdTMyKSk7CisJfSB3aGlsZSAoeCA9PSAwKTsKKworCXJldHVybiB4OworfQorCisvKiBTZWxlY3QgYW4gaW5pdGlhbCBUU04gdG8gc2VuZCBkdXJpbmcgc3RhcnR1cC4gICovCitfX3UzMiBzY3RwX2dlbmVyYXRlX3Rzbihjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXApCit7CisJX191MzIgcmV0dmFsOworCisJZ2V0X3JhbmRvbV9ieXRlcygmcmV0dmFsLCBzaXplb2YoX191MzIpKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogQURESVAgMy4xLjEgQWRkcmVzcyBDb25maWd1cmF0aW9uIENoYW5nZSBDaHVuayAoQVNDT05GKQorICogICAgICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgKiAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICogICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiAgICAgfCBUeXBlID0gMHhDMSAgIHwgIENodW5rIEZsYWdzICB8ICAgICAgQ2h1bmsgTGVuZ3RoICAgICAgICAgICAgIHwKKyAqICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogICAgIHwgICAgICAgICAgICAgICAgICAgICAgIFNlcmlhbCBOdW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqICAgICB8ICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIFBhcmFtZXRlciAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiAgICAgfCAgICAgICAgICAgICAgICAgICAgIEFTQ09ORiBQYXJhbWV0ZXIgIzEgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogICAgIFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgKiAgICAgLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8KKyAqICAgICBcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICogICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiAgICAgfCAgICAgICAgICAgICAgICAgICAgIEFTQ09ORiBQYXJhbWV0ZXIgI04gICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqCisgKiBBZGRyZXNzIFBhcmFtZXRlciBhbmQgb3RoZXIgcGFyYW1ldGVyIHdpbGwgbm90IGJlIHdyYXBwZWQgaW4gdGhpcyBmdW5jdGlvbiAKKyAqLworc3RhdGljIHN0cnVjdCBzY3RwX2NodW5rICpzY3RwX21ha2VfYXNjb25mKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCQkgICB1bmlvbiBzY3RwX2FkZHIgKmFkZHIsCisJCQkJCSAgIGludCB2cGFyYW1fbGVuKQoreworCXNjdHBfYWRkaXBoZHJfdCBhc2NvbmY7CisJc3RydWN0IHNjdHBfY2h1bmsgKnJldHZhbDsKKwlpbnQgbGVuZ3RoID0gc2l6ZW9mKGFzY29uZikgKyB2cGFyYW1fbGVuOworCXVuaW9uIHNjdHBfYWRkcl9wYXJhbSBhZGRycGFyYW07CisJaW50IGFkZHJsZW47CisJc3RydWN0IHNjdHBfYWYgKmFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoYWRkci0+djQuc2luX2ZhbWlseSk7CisKKwlhZGRybGVuID0gYWYtPnRvX2FkZHJfcGFyYW0oYWRkciwgJmFkZHJwYXJhbSk7CisJaWYgKCFhZGRybGVuKQorCQlyZXR1cm4gTlVMTDsKKwlsZW5ndGggKz0gYWRkcmxlbjsKKworCS8qIENyZWF0ZSB0aGUgY2h1bmsuICAqLworCXJldHZhbCA9IHNjdHBfbWFrZV9jaHVuayhhc29jLCBTQ1RQX0NJRF9BU0NPTkYsIDAsIGxlbmd0aCk7CisJaWYgKCFyZXR2YWwpCisJCXJldHVybiBOVUxMOworCisJYXNjb25mLnNlcmlhbCA9IGh0b25sKGFzb2MtPmFkZGlwX3NlcmlhbCsrKTsKKworCXJldHZhbC0+c3ViaC5hZGRpcF9oZHIgPQorCQlzY3RwX2FkZHRvX2NodW5rKHJldHZhbCwgc2l6ZW9mKGFzY29uZiksICZhc2NvbmYpOworCXJldHZhbC0+cGFyYW1faGRyLnYgPQorCQlzY3RwX2FkZHRvX2NodW5rKHJldHZhbCwgYWRkcmxlbiwgJmFkZHJwYXJhbSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBBRERJUAorICogMy4yLjEgQWRkIElQIEFkZHJlc3MKKyAqIAkwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgKiAJMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgKiAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqICAgICB8ICAgICAgICBUeXBlID0gMHhDMDAxICAgICAgICAgIHwgICAgTGVuZ3RoID0gVmFyaWFibGUgICAgICAgICAgfAorICogICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiAgICAgfCAgICAgICAgICAgICAgIEFTQ09ORi1SZXF1ZXN0IENvcnJlbGF0aW9uIElEICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogICAgIHwgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgUGFyYW1ldGVyICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqCisgKiAzLjIuMiBEZWxldGUgSVAgQWRkcmVzcworICogCTAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAqIAkwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAqICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogICAgIHwgICAgICAgIFR5cGUgPSAweEMwMDIgICAgICAgICAgfCAgICBMZW5ndGggPSBWYXJpYWJsZSAgICAgICAgICB8CisgKiAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqICAgICB8ICAgICAgICAgICAgICAgQVNDT05GLVJlcXVlc3QgQ29ycmVsYXRpb24gSUQgICAgICAgICAgICAgICAgICAgfAorICogICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBQYXJhbWV0ZXIgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICoKKyAqLworc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfbWFrZV9hc2NvbmZfdXBkYXRlX2lwKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCQkgICAgICB1bmlvbiBzY3RwX2FkZHIJICAgICAgKmxhZGRyLAorCQkJCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHIJICAgICAgKmFkZHJzLAorCQkJCQkgICAgICBpbnQJCSAgICAgIGFkZHJjbnQsCisJCQkJCSAgICAgIF9fdTE2CQkgICAgICBmbGFncykKK3sKKwlzY3RwX2FkZGlwX3BhcmFtX3QJcGFyYW07CisJc3RydWN0IHNjdHBfY2h1bmsJKnJldHZhbDsKKwl1bmlvbiBzY3RwX2FkZHJfcGFyYW0JYWRkcl9wYXJhbTsKKwl1bmlvbiBzY3RwX2FkZHIJCSphZGRyOworCXZvaWQJCQkqYWRkcl9idWY7CisJc3RydWN0IHNjdHBfYWYJCSphZjsKKwlpbnQJCQlwYXJhbWxlbiA9IHNpemVvZihwYXJhbSk7CisJaW50CQkJYWRkcl9wYXJhbV9sZW4gPSAwOworCWludCAJCQl0b3RhbGxlbiA9IDA7CisJaW50IAkJCWk7CisKKwkvKiBHZXQgdG90YWwgbGVuZ3RoIG9mIGFsbCB0aGUgYWRkcmVzcyBwYXJhbWV0ZXJzLiAqLworCWFkZHJfYnVmID0gYWRkcnM7CisJZm9yIChpID0gMDsgaSA8IGFkZHJjbnQ7IGkrKykgeworCQlhZGRyID0gKHVuaW9uIHNjdHBfYWRkciAqKWFkZHJfYnVmOworCQlhZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKGFkZHItPnY0LnNpbl9mYW1pbHkpOworCQlhZGRyX3BhcmFtX2xlbiA9IGFmLT50b19hZGRyX3BhcmFtKGFkZHIsICZhZGRyX3BhcmFtKTsKKworCQl0b3RhbGxlbiArPSBwYXJhbWxlbjsKKwkJdG90YWxsZW4gKz0gYWRkcl9wYXJhbV9sZW47CisKKwkJYWRkcl9idWYgKz0gYWYtPnNvY2thZGRyX2xlbjsKKwl9CisKKwkvKiBDcmVhdGUgYW4gYXNjb25mIGNodW5rIHdpdGggdGhlIHJlcXVpcmVkIGxlbmd0aC4gKi8KKwlyZXR2YWwgPSBzY3RwX21ha2VfYXNjb25mKGFzb2MsIGxhZGRyLCB0b3RhbGxlbik7CisJaWYgKCFyZXR2YWwpCisJCXJldHVybiBOVUxMOworCisJLyogQWRkIHRoZSBhZGRyZXNzIHBhcmFtZXRlcnMgdG8gdGhlIGFzY29uZiBjaHVuay4gKi8KKwlhZGRyX2J1ZiA9IGFkZHJzOworCWZvciAoaSA9IDA7IGkgPCBhZGRyY250OyBpKyspIHsKKwkJYWRkciA9ICh1bmlvbiBzY3RwX2FkZHIgKilhZGRyX2J1ZjsKKwkJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhhZGRyLT52NC5zaW5fZmFtaWx5KTsKKwkJYWRkcl9wYXJhbV9sZW4gPSBhZi0+dG9fYWRkcl9wYXJhbShhZGRyLCAmYWRkcl9wYXJhbSk7CisJCXBhcmFtLnBhcmFtX2hkci50eXBlID0gZmxhZ3M7CisJCXBhcmFtLnBhcmFtX2hkci5sZW5ndGggPSBodG9ucyhwYXJhbWxlbiArIGFkZHJfcGFyYW1fbGVuKTsKKwkJcGFyYW0uY3JyX2lkID0gaTsKKworCQlzY3RwX2FkZHRvX2NodW5rKHJldHZhbCwgcGFyYW1sZW4sICZwYXJhbSk7CisJCXNjdHBfYWRkdG9fY2h1bmsocmV0dmFsLCBhZGRyX3BhcmFtX2xlbiwgJmFkZHJfcGFyYW0pOworCisJCWFkZHJfYnVmICs9IGFmLT5zb2NrYWRkcl9sZW47CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKy8qIEFERElQCisgKiAzLjIuNCBTZXQgUHJpbWFyeSBJUCBBZGRyZXNzCisgKgkwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgKgkwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAqICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogICAgIHwgICAgICAgIFR5cGUgPTB4QzAwNCAgICAgICAgICAgfCAgICBMZW5ndGggPSBWYXJpYWJsZSAgICAgICAgICB8CisgKiAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqICAgICB8ICAgICAgICAgICAgICAgQVNDT05GLVJlcXVlc3QgQ29ycmVsYXRpb24gSUQgICAgICAgICAgICAgICAgICAgfAorICogICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBQYXJhbWV0ZXIgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICoKKyAqIENyZWF0ZSBhbiBBU0NPTkYgY2h1bmsgd2l0aCBTZXQgUHJpbWFyeSBJUCBhZGRyZXNzIHBhcmFtZXRlci4gCisgKi8KK3N0cnVjdCBzY3RwX2NodW5rICpzY3RwX21ha2VfYXNjb25mX3NldF9wcmltKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCQkgICAgIHVuaW9uIHNjdHBfYWRkciAqYWRkcikKK3sKKwlzY3RwX2FkZGlwX3BhcmFtX3QJcGFyYW07CisJc3RydWN0IHNjdHBfY2h1bmsgCSpyZXR2YWw7CisJaW50IAkJCWxlbiA9IHNpemVvZihwYXJhbSk7CisJdW5pb24gc2N0cF9hZGRyX3BhcmFtCWFkZHJwYXJhbTsKKwlpbnQJCQlhZGRybGVuOworCXN0cnVjdCBzY3RwX2FmCQkqYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhhZGRyLT52NC5zaW5fZmFtaWx5KTsKKworCWFkZHJsZW4gPSBhZi0+dG9fYWRkcl9wYXJhbShhZGRyLCAmYWRkcnBhcmFtKTsKKwlpZiAoIWFkZHJsZW4pCisJCXJldHVybiBOVUxMOworCWxlbiArPSBhZGRybGVuOworCisJLyogQ3JlYXRlIHRoZSBjaHVuayBhbmQgbWFrZSBhc2NvbmYgaGVhZGVyLiAqLworCXJldHZhbCA9IHNjdHBfbWFrZV9hc2NvbmYoYXNvYywgYWRkciwgbGVuKTsKKwlpZiAoIXJldHZhbCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwYXJhbS5wYXJhbV9oZHIudHlwZSA9IFNDVFBfUEFSQU1fU0VUX1BSSU1BUlk7CisJcGFyYW0ucGFyYW1faGRyLmxlbmd0aCA9IGh0b25zKGxlbik7CisJcGFyYW0uY3JyX2lkID0gMDsKKworCXNjdHBfYWRkdG9fY2h1bmsocmV0dmFsLCBzaXplb2YocGFyYW0pLCAmcGFyYW0pOworCXNjdHBfYWRkdG9fY2h1bmsocmV0dmFsLCBhZGRybGVuLCAmYWRkcnBhcmFtKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIEFERElQIDMuMS4yIEFkZHJlc3MgQ29uZmlndXJhdGlvbiBBY2tub3dsZWRnZW1lbnQgQ2h1bmsgKEFTQ09ORi1BQ0spCisgKiAgICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAqICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgKiAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqICAgICB8IFR5cGUgPSAweDgwICAgfCAgQ2h1bmsgRmxhZ3MgIHwgICAgICBDaHVuayBMZW5ndGggICAgICAgICAgICAgfAorICogICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsIE51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogICAgIHwgICAgICAgICAgICAgICAgIEFTQ09ORiBQYXJhbWV0ZXIgUmVzcG9uc2UjMSAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqICAgICBcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICogICAgIC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvCisgKiAgICAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAqICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogICAgIHwgICAgICAgICAgICAgICAgIEFTQ09ORiBQYXJhbWV0ZXIgUmVzcG9uc2UjTiAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqCisgKiBDcmVhdGUgYW4gQVNDT05GX0FDSyBjaHVuayB3aXRoIGVub3VnaCBzcGFjZSBmb3IgdGhlIHBhcmFtZXRlciByZXNwb25zZXMuIAorICovCitzdGF0aWMgc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfbWFrZV9hc2NvbmZfYWNrKGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCQkgICAgICAgX191MzIgc2VyaWFsLCBpbnQgdnBhcmFtX2xlbikKK3sKKwlzY3RwX2FkZGlwaGRyX3QJCWFzY29uZjsKKwlzdHJ1Y3Qgc2N0cF9jaHVuawkqcmV0dmFsOworCWludAkJCWxlbmd0aCA9IHNpemVvZihhc2NvbmYpICsgdnBhcmFtX2xlbjsKKworCS8qIENyZWF0ZSB0aGUgY2h1bmsuICAqLworCXJldHZhbCA9IHNjdHBfbWFrZV9jaHVuayhhc29jLCBTQ1RQX0NJRF9BU0NPTkZfQUNLLCAwLCBsZW5ndGgpOworCWlmICghcmV0dmFsKQorCQlyZXR1cm4gTlVMTDsKKworCWFzY29uZi5zZXJpYWwgPSBodG9ubChzZXJpYWwpOworCisJcmV0dmFsLT5zdWJoLmFkZGlwX2hkciA9CisJCXNjdHBfYWRkdG9fY2h1bmsocmV0dmFsLCBzaXplb2YoYXNjb25mKSwgJmFzY29uZik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBBZGQgcmVzcG9uc2UgcGFyYW1ldGVycyB0byBhbiBBU0NPTkZfQUNLIGNodW5rLiAqLworc3RhdGljIHZvaWQgc2N0cF9hZGRfYXNjb25mX3Jlc3BvbnNlKHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywgX191MzIgY3JyX2lkLAorCQkJICAgICAgX191MTYgZXJyX2NvZGUsIHNjdHBfYWRkaXBfcGFyYW1fdCAqYXNjb25mX3BhcmFtKQoreworCXNjdHBfYWRkaXBfcGFyYW1fdCAJYWNrX3BhcmFtOworCXNjdHBfZXJyaGRyX3QJCWVycl9wYXJhbTsKKwlpbnQJCQlhc2NvbmZfcGFyYW1fbGVuID0gMDsKKwlpbnQJCQllcnJfcGFyYW1fbGVuID0gMDsKKwlfX3UxNgkJCXJlc3BvbnNlX3R5cGU7CisKKwlpZiAoU0NUUF9FUlJPUl9OT19FUlJPUiA9PSBlcnJfY29kZSkgeworCQlyZXNwb25zZV90eXBlID0gU0NUUF9QQVJBTV9TVUNDRVNTX1JFUE9SVDsKKwl9IGVsc2UgeworCQlyZXNwb25zZV90eXBlID0gU0NUUF9QQVJBTV9FUlJfQ0FVU0U7CisJCWVycl9wYXJhbV9sZW4gPSBzaXplb2YoZXJyX3BhcmFtKTsKKwkJaWYgKGFzY29uZl9wYXJhbSkKKwkJCWFzY29uZl9wYXJhbV9sZW4gPQorCQkJCSBudG9ocyhhc2NvbmZfcGFyYW0tPnBhcmFtX2hkci5sZW5ndGgpOworCX0KKworCS8qIEFkZCBTdWNjZXNzIEluZGljYXRpb24gb3IgRXJyb3IgQ2F1c2UgSW5kaWNhdGlvbiBwYXJhbWV0ZXIuICovIAorCWFja19wYXJhbS5wYXJhbV9oZHIudHlwZSA9IHJlc3BvbnNlX3R5cGU7CisJYWNrX3BhcmFtLnBhcmFtX2hkci5sZW5ndGggPSBodG9ucyhzaXplb2YoYWNrX3BhcmFtKSArCisJCQkJCSAgIGVycl9wYXJhbV9sZW4gKworCQkJCQkgICBhc2NvbmZfcGFyYW1fbGVuKTsKKwlhY2tfcGFyYW0uY3JyX2lkID0gY3JyX2lkOworCXNjdHBfYWRkdG9fY2h1bmsoY2h1bmssIHNpemVvZihhY2tfcGFyYW0pLCAmYWNrX3BhcmFtKTsKKworCWlmIChTQ1RQX0VSUk9SX05PX0VSUk9SID09IGVycl9jb2RlKQorCQlyZXR1cm47CisKKwkvKiBBZGQgRXJyb3IgQ2F1c2UgcGFyYW1ldGVyLiAqLworCWVycl9wYXJhbS5jYXVzZSA9IGVycl9jb2RlOworCWVycl9wYXJhbS5sZW5ndGggPSBodG9ucyhlcnJfcGFyYW1fbGVuICsgYXNjb25mX3BhcmFtX2xlbik7CisJc2N0cF9hZGR0b19jaHVuayhjaHVuaywgZXJyX3BhcmFtX2xlbiwgJmVycl9wYXJhbSk7CisKKwkvKiBBZGQgdGhlIGZhaWxlZCBUTFYgY29waWVkIGZyb20gQVNDT05GIGNodW5rLiAqLworCWlmIChhc2NvbmZfcGFyYW0pCisJCXNjdHBfYWRkdG9fY2h1bmsoY2h1bmssIGFzY29uZl9wYXJhbV9sZW4sIGFzY29uZl9wYXJhbSk7Cit9CisKKy8qIFByb2Nlc3MgYSBhc2NvbmYgcGFyYW1ldGVyLiAqLworc3RhdGljIF9fdTE2IHNjdHBfcHJvY2Vzc19hc2NvbmZfcGFyYW0oc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJICAgICAgIHN0cnVjdCBzY3RwX2NodW5rICphc2NvbmYsCisJCQkJICAgICAgIHNjdHBfYWRkaXBfcGFyYW1fdCAqYXNjb25mX3BhcmFtKQoreworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqcGVlcjsKKwlzdHJ1Y3Qgc2N0cF9hZiAqYWY7CisJdW5pb24gc2N0cF9hZGRyCWFkZHI7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCXVuaW9uIHNjdHBfYWRkcl9wYXJhbSAqYWRkcl9wYXJhbTsKKwkJCQkgCisJYWRkcl9wYXJhbSA9ICh1bmlvbiBzY3RwX2FkZHJfcGFyYW0gKikKKwkJCSgodm9pZCAqKWFzY29uZl9wYXJhbSArIHNpemVvZihzY3RwX2FkZGlwX3BhcmFtX3QpKTsKKworCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMocGFyYW1fdHlwZTJhZihhZGRyX3BhcmFtLT52NC5wYXJhbV9oZHIudHlwZSkpOworCWlmICh1bmxpa2VseSghYWYpKQorCQlyZXR1cm4gU0NUUF9FUlJPUl9JTlZfUEFSQU07CisKKwlhZi0+ZnJvbV9hZGRyX3BhcmFtKCZhZGRyLCBhZGRyX3BhcmFtLCBhc29jLT5wZWVyLnBvcnQsIDApOworCXN3aXRjaCAoYXNjb25mX3BhcmFtLT5wYXJhbV9oZHIudHlwZSkgeworCWNhc2UgU0NUUF9QQVJBTV9BRERfSVA6CisJCS8qIEFERElQIDQuMyBEOSkgSWYgYW4gZW5kcG9pbnQgcmVjZWl2ZXMgYW4gQUREIElQIGFkZHJlc3MKKwkgCSAqIHJlcXVlc3QgYW5kIGRvZXMgbm90IGhhdmUgdGhlIGxvY2FsIHJlc291cmNlcyB0byBhZGQgdGhpcworCSAJICogbmV3IGFkZHJlc3MgdG8gdGhlIGFzc29jaWF0aW9uLCBpdCBNVVNUIHJldHVybiBhbiBFcnJvcgorCSAJICogQ2F1c2UgVExWIHNldCB0byB0aGUgbmV3IGVycm9yIGNvZGUgJ09wZXJhdGlvbiBSZWZ1c2VkCisJIAkgKiBEdWUgdG8gUmVzb3VyY2UgU2hvcnRhZ2UnLgorCSAJICovCisKKwkJcGVlciA9IHNjdHBfYXNzb2NfYWRkX3BlZXIoYXNvYywgJmFkZHIsIEdGUF9BVE9NSUMpOworCQlpZiAoIXBlZXIpCisJCQlyZXR1cm4gU0NUUF9FUlJPUl9SU1JDX0xPVzsKKworCQkvKiBTdGFydCB0aGUgaGVhcnRiZWF0IHRpbWVyLiAqLworCQlpZiAoIW1vZF90aW1lcigmcGVlci0+aGJfdGltZXIsIHNjdHBfdHJhbnNwb3J0X3RpbWVvdXQocGVlcikpKQorCQkJc2N0cF90cmFuc3BvcnRfaG9sZChwZWVyKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1RQX1BBUkFNX0RFTF9JUDoKKwkJLyogQURESVAgNC4zIEQ3KSBJZiBhIHJlcXVlc3QgaXMgcmVjZWl2ZWQgdG8gZGVsZXRlIHRoZQorCSAJICogbGFzdCByZW1haW5pbmcgSVAgYWRkcmVzcyBvZiBhIHBlZXIgZW5kcG9pbnQsIHRoZSByZWNlaXZlcgorCSAJICogTVVTVCBzZW5kIGFuIEVycm9yIENhdXNlIFRMViB3aXRoIHRoZSBlcnJvciBjYXVzZSBzZXQgdG8gdGhlCisJIAkgKiBuZXcgZXJyb3IgY29kZSAnUmVxdWVzdCB0byBEZWxldGUgTGFzdCBSZW1haW5pbmcgSVAgQWRkcmVzcycuCisJIAkgKi8KKwkJcG9zID0gYXNvYy0+cGVlci50cmFuc3BvcnRfYWRkcl9saXN0Lm5leHQ7CisJCWlmIChwb3MtPm5leHQgPT0gJmFzb2MtPnBlZXIudHJhbnNwb3J0X2FkZHJfbGlzdCkKKwkJCXJldHVybiBTQ1RQX0VSUk9SX0RFTF9MQVNUX0lQOworCisJCS8qIEFERElQIDQuMyBEOCkgSWYgYSByZXF1ZXN0IGlzIHJlY2VpdmVkIHRvIGRlbGV0ZSBhbiBJUAorCQkgKiBhZGRyZXNzIHdoaWNoIGlzIGFsc28gdGhlIHNvdXJjZSBhZGRyZXNzIG9mIHRoZSBJUCBwYWNrZXQKKwkJICogd2hpY2ggY29udGFpbmVkIHRoZSBBU0NPTkYgY2h1bmssIHRoZSByZWNlaXZlciBNVVNUIHJlamVjdAorCQkgKiB0aGlzIHJlcXVlc3QuIFRvIHJlamVjdCB0aGUgcmVxdWVzdCB0aGUgcmVjZWl2ZXIgTVVTVCBzZW5kCisJCSAqIGFuIEVycm9yIENhdXNlIFRMViBzZXQgdG8gdGhlIG5ldyBlcnJvciBjb2RlICdSZXF1ZXN0IHRvCisJCSAqIERlbGV0ZSBTb3VyY2UgSVAgQWRkcmVzcycKKwkJICovCisJCWlmIChzY3RwX2NtcF9hZGRyX2V4YWN0KHNjdHBfc291cmNlKGFzY29uZiksICZhZGRyKSkKKwkJCXJldHVybiBTQ1RQX0VSUk9SX0RFTF9TUkNfSVA7CisKKwkJc2N0cF9hc3NvY19kZWxfcGVlcihhc29jLCAmYWRkcik7CisJCWJyZWFrOworCWNhc2UgU0NUUF9QQVJBTV9TRVRfUFJJTUFSWToKKwkJcGVlciA9IHNjdHBfYXNzb2NfbG9va3VwX3BhZGRyKGFzb2MsICZhZGRyKTsKKwkJaWYgKCFwZWVyKQorCQkJcmV0dXJuIFNDVFBfRVJST1JfSU5WX1BBUkFNOworCisJCXNjdHBfYXNzb2Nfc2V0X3ByaW1hcnkoYXNvYywgcGVlcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBTQ1RQX0VSUk9SX0lOVl9QQVJBTTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIFNDVFBfRVJST1JfTk9fRVJST1I7Cit9CisKKy8qIFByb2Nlc3MgYW4gaW5jb21pbmcgQVNDT05GIGNodW5rIHdpdGggdGhlIG5leHQgZXhwZWN0ZWQgc2VyaWFsIG5vLiBhbmQgCisgKiByZXR1cm4gYW4gQVNDT05GX0FDSyBjaHVuayB0byBiZSBzZW50IGluIHJlc3BvbnNlLgorICovCitzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9wcm9jZXNzX2FzY29uZihzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkgICAgICAgc3RydWN0IHNjdHBfY2h1bmsgKmFzY29uZikKK3sKKwlzY3RwX2FkZGlwaGRyX3QJCSpoZHI7CisJdW5pb24gc2N0cF9hZGRyX3BhcmFtCSphZGRyX3BhcmFtOworCXNjdHBfYWRkaXBfcGFyYW1fdAkqYXNjb25mX3BhcmFtOworCXN0cnVjdCBzY3RwX2NodW5rCSphc2NvbmZfYWNrOworCisJX191MTYJZXJyX2NvZGU7CisJaW50CWxlbmd0aCA9IDA7CisJaW50CWNodW5rX2xlbiA9IGFzY29uZi0+c2tiLT5sZW47CisJX191MzIJc2VyaWFsOworCWludAlhbGxfcGFyYW1fcGFzcyA9IDE7CisKKwloZHIgPSAoc2N0cF9hZGRpcGhkcl90ICopYXNjb25mLT5za2ItPmRhdGE7CisJc2VyaWFsID0gbnRvaGwoaGRyLT5zZXJpYWwpOworCisJLyogU2tpcCB0aGUgYWRkaXBoZHIgYW5kIHN0b3JlIGEgcG9pbnRlciB0byBhZGRyZXNzIHBhcmFtZXRlci4gICovIAorCWxlbmd0aCA9IHNpemVvZihzY3RwX2FkZGlwaGRyX3QpOworCWFkZHJfcGFyYW0gPSAodW5pb24gc2N0cF9hZGRyX3BhcmFtICopKGFzY29uZi0+c2tiLT5kYXRhICsgbGVuZ3RoKTsKKwljaHVua19sZW4gLT0gbGVuZ3RoOworCisJLyogU2tpcCB0aGUgYWRkcmVzcyBwYXJhbWV0ZXIgYW5kIHN0b3JlIGEgcG9pbnRlciB0byB0aGUgZmlyc3QKKwkgKiBhc2NvbmYgcGFyYW10ZXIuCisJICovIAorCWxlbmd0aCA9IG50b2hzKGFkZHJfcGFyYW0tPnY0LnBhcmFtX2hkci5sZW5ndGgpOworCWFzY29uZl9wYXJhbSA9IChzY3RwX2FkZGlwX3BhcmFtX3QgKikoKHZvaWQgKilhZGRyX3BhcmFtICsgbGVuZ3RoKTsKKwljaHVua19sZW4gLT0gbGVuZ3RoOworCisJLyogY3JlYXRlIGFuIEFTQ09ORl9BQ0sgY2h1bmsuIAorCSAqIEJhc2VkIG9uIHRoZSBkZWZpbml0aW9ucyBvZiBwYXJhbWV0ZXJzLCB3ZSBrbm93IHRoYXQgdGhlIHNpemUgb2YKKwkgKiBBU0NPTkZfQUNLIHBhcmFtZXRlcnMgYXJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgdHdpY2Ugb2YgQVNDT05GCisJICogcGFyYW10ZXJzLgorCSAqLworCWFzY29uZl9hY2sgPSBzY3RwX21ha2VfYXNjb25mX2Fjayhhc29jLCBzZXJpYWwsIGNodW5rX2xlbiAqIDIpOworCWlmICghYXNjb25mX2FjaykKKwkJZ290byBkb25lOworCisJLyogUHJvY2VzcyB0aGUgVExWcyBjb250YWluZWQgd2l0aGluIHRoZSBBU0NPTkYgY2h1bmsuICovCisJd2hpbGUgKGNodW5rX2xlbiA+IDApIHsKKwkJZXJyX2NvZGUgPSBzY3RwX3Byb2Nlc3NfYXNjb25mX3BhcmFtKGFzb2MsIGFzY29uZiwKKwkJCQkJCSAgICAgYXNjb25mX3BhcmFtKTsKKwkJLyogQURESVAgNC4xIEE3KQorCQkgKiBJZiBhbiBlcnJvciByZXNwb25zZSBpcyByZWNlaXZlZCBmb3IgYSBUTFYgcGFyYW1ldGVyLAorCQkgKiBhbGwgVExWcyB3aXRoIG5vIHJlc3BvbnNlIGJlZm9yZSB0aGUgZmFpbGVkIFRMViBhcmUKKwkJICogY29uc2lkZXJlZCBzdWNjZXNzZnVsIGlmIG5vdCByZXBvcnRlZC4gIEFsbCBUTFZzIGFmdGVyCisJCSAqIHRoZSBmYWlsZWQgcmVzcG9uc2UgYXJlIGNvbnNpZGVyZWQgdW5zdWNjZXNzZnVsIHVubGVzcworCQkgKiBhIHNwZWNpZmljIHN1Y2Nlc3MgaW5kaWNhdGlvbiBpcyBwcmVzZW50IGZvciB0aGUgcGFyYW1ldGVyLgorCQkgKi8KKwkJaWYgKFNDVFBfRVJST1JfTk9fRVJST1IgIT0gZXJyX2NvZGUpCisJCQlhbGxfcGFyYW1fcGFzcyA9IDA7CisKKwkJaWYgKCFhbGxfcGFyYW1fcGFzcykKKwkJCXNjdHBfYWRkX2FzY29uZl9yZXNwb25zZShhc2NvbmZfYWNrLAorCQkJCQkJIGFzY29uZl9wYXJhbS0+Y3JyX2lkLCBlcnJfY29kZSwKKwkJCQkJCSBhc2NvbmZfcGFyYW0pOworCisJCS8qIEFERElQIDQuMyBEMTEpIFdoZW4gYW4gZW5kcG9pbnQgcmVjZWl2aW5nIGFuIEFTQ09ORiB0byBhZGQKKwkJICogYW4gSVAgYWRkcmVzcyBzZW5kcyBhbiAnT3V0IG9mIFJlc291cmNlJyBpbiBpdHMgcmVzcG9uc2UsIGl0CisJCSAqIE1VU1QgYWxzbyBmYWlsIGFueSBzdWJzZXF1ZW50IGFkZCBvciBkZWxldGUgcmVxdWVzdHMgYnVuZGxlZAorCQkgKiBpbiB0aGUgQVNDT05GLiAKKwkJICovCisJCWlmIChTQ1RQX0VSUk9SX1JTUkNfTE9XID09IGVycl9jb2RlKQorCQkJZ290byBkb25lOworCisJCS8qIE1vdmUgdG8gdGhlIG5leHQgQVNDT05GIHBhcmFtLiAqLworCQlsZW5ndGggPSBudG9ocyhhc2NvbmZfcGFyYW0tPnBhcmFtX2hkci5sZW5ndGgpOworCQlhc2NvbmZfcGFyYW0gPSAoc2N0cF9hZGRpcF9wYXJhbV90ICopKCh2b2lkICopYXNjb25mX3BhcmFtICsKKwkJCQkJCSAgICAgIGxlbmd0aCk7CisJCWNodW5rX2xlbiAtPSBsZW5ndGg7CisJfQorCQorZG9uZToKKwlhc29jLT5wZWVyLmFkZGlwX3NlcmlhbCsrOworCisJLyogSWYgd2UgYXJlIHNlbmRpbmcgYSBuZXcgQVNDT05GX0FDSyBob2xkIGEgcmVmZXJlbmNlIHRvIGl0IGluIGFzc29jCisJICogYWZ0ZXIgZnJlZWluZyB0aGUgcmVmZXJlbmNlIHRvIG9sZCBhc2NvbmYgYWNrIGlmIGFueS4gCisJICovCisJaWYgKGFzY29uZl9hY2spIHsKKwkJaWYgKGFzb2MtPmFkZGlwX2xhc3RfYXNjb25mX2FjaykKKwkJCXNjdHBfY2h1bmtfZnJlZShhc29jLT5hZGRpcF9sYXN0X2FzY29uZl9hY2spOworCisJCXNjdHBfY2h1bmtfaG9sZChhc2NvbmZfYWNrKTsKKwkJYXNvYy0+YWRkaXBfbGFzdF9hc2NvbmZfYWNrID0gYXNjb25mX2FjazsKKwl9CisKKwlyZXR1cm4gYXNjb25mX2FjazsKK30KKworLyogUHJvY2VzcyBhIGFzY29uZiBwYXJhbWV0ZXIgdGhhdCBpcyBzdWNjZXNzZnVsbHkgYWNrZWQuICovCitzdGF0aWMgaW50IHNjdHBfYXNjb25mX3BhcmFtX3N1Y2Nlc3Moc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJICAgICBzY3RwX2FkZGlwX3BhcmFtX3QgKmFzY29uZl9wYXJhbSkKK3sKKwlzdHJ1Y3Qgc2N0cF9hZiAqYWY7CisJdW5pb24gc2N0cF9hZGRyCWFkZHI7CisJc3RydWN0IHNjdHBfYmluZF9hZGRyICpicCA9ICZhc29jLT5iYXNlLmJpbmRfYWRkcjsKKwl1bmlvbiBzY3RwX2FkZHJfcGFyYW0gKmFkZHJfcGFyYW07CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0OworCWludCByZXR2YWwgPSAwOworCisJYWRkcl9wYXJhbSA9ICh1bmlvbiBzY3RwX2FkZHJfcGFyYW0gKikKKwkJCSgodm9pZCAqKWFzY29uZl9wYXJhbSArIHNpemVvZihzY3RwX2FkZGlwX3BhcmFtX3QpKTsKKworCS8qIFdlIGhhdmUgY2hlY2tlZCB0aGUgcGFja2V0IGJlZm9yZSwgc28gd2UgZG8gbm90IGNoZWNrIGFnYWluLgkqLworCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMocGFyYW1fdHlwZTJhZihhZGRyX3BhcmFtLT52NC5wYXJhbV9oZHIudHlwZSkpOworCWFmLT5mcm9tX2FkZHJfcGFyYW0oJmFkZHIsIGFkZHJfcGFyYW0sIGJwLT5wb3J0LCAwKTsKKworCXN3aXRjaCAoYXNjb25mX3BhcmFtLT5wYXJhbV9oZHIudHlwZSkgeworCWNhc2UgU0NUUF9QQVJBTV9BRERfSVA6CisJCXNjdHBfbG9jYWxfYmhfZGlzYWJsZSgpOworCQlzY3RwX3dyaXRlX2xvY2soJmFzb2MtPmJhc2UuYWRkcl9sb2NrKTsKKwkJcmV0dmFsID0gc2N0cF9hZGRfYmluZF9hZGRyKGJwLCAmYWRkciwgR0ZQX0FUT01JQyk7CisJCXNjdHBfd3JpdGVfdW5sb2NrKCZhc29jLT5iYXNlLmFkZHJfbG9jayk7CisJCXNjdHBfbG9jYWxfYmhfZW5hYmxlKCk7CisJCWJyZWFrOworCWNhc2UgU0NUUF9QQVJBTV9ERUxfSVA6CisJCXNjdHBfbG9jYWxfYmhfZGlzYWJsZSgpOworCQlzY3RwX3dyaXRlX2xvY2soJmFzb2MtPmJhc2UuYWRkcl9sb2NrKTsKKwkJcmV0dmFsID0gc2N0cF9kZWxfYmluZF9hZGRyKGJwLCAmYWRkcik7CisJCXNjdHBfd3JpdGVfdW5sb2NrKCZhc29jLT5iYXNlLmFkZHJfbG9jayk7CisJCXNjdHBfbG9jYWxfYmhfZW5hYmxlKCk7CisJCWxpc3RfZm9yX2VhY2gocG9zLCAmYXNvYy0+cGVlci50cmFuc3BvcnRfYWRkcl9saXN0KSB7CisJCQl0cmFuc3BvcnQgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHNjdHBfdHJhbnNwb3J0LAorCQkJCQkJIHRyYW5zcG9ydHMpOworCQkJc2N0cF90cmFuc3BvcnRfcm91dGUodHJhbnNwb3J0LCBOVUxMLAorCQkJCQkgICAgIHNjdHBfc2soYXNvYy0+YmFzZS5zaykpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIEdldCB0aGUgY29ycmVzcG9uZGluZyBBU0NPTkYgcmVzcG9uc2UgZXJyb3IgY29kZSBmcm9tIHRoZSBBU0NPTkZfQUNLIGNodW5rCisgKiBmb3IgdGhlIGdpdmVuIGFzY29uZiBwYXJhbWV0ZXIuICBJZiB0aGVyZSBpcyBubyByZXNwb25zZSBmb3IgdGhpcyBwYXJhbWV0ZXIsCisgKiByZXR1cm4gdGhlIGVycm9yIGNvZGUgYmFzZWQgb24gdGhlIHRoaXJkIGFyZ3VtZW50ICdub19lcnInLiAKKyAqIEFERElQIDQuMQorICogQTcpIElmIGFuIGVycm9yIHJlc3BvbnNlIGlzIHJlY2VpdmVkIGZvciBhIFRMViBwYXJhbWV0ZXIsIGFsbCBUTFZzIHdpdGggbm8KKyAqIHJlc3BvbnNlIGJlZm9yZSB0aGUgZmFpbGVkIFRMViBhcmUgY29uc2lkZXJlZCBzdWNjZXNzZnVsIGlmIG5vdCByZXBvcnRlZC4KKyAqIEFsbCBUTFZzIGFmdGVyIHRoZSBmYWlsZWQgcmVzcG9uc2UgYXJlIGNvbnNpZGVyZWQgdW5zdWNjZXNzZnVsIHVubGVzcyBhCisgKiBzcGVjaWZpYyBzdWNjZXNzIGluZGljYXRpb24gaXMgcHJlc2VudCBmb3IgdGhlIHBhcmFtZXRlci4KKyAqLworc3RhdGljIF9fdTE2IHNjdHBfZ2V0X2FzY29uZl9yZXNwb25zZShzdHJ1Y3Qgc2N0cF9jaHVuayAqYXNjb25mX2FjaywKKwkJCQkgICAgICBzY3RwX2FkZGlwX3BhcmFtX3QgKmFzY29uZl9wYXJhbSwKKwkJCQkgICAgICBpbnQgbm9fZXJyKQoreworCXNjdHBfYWRkaXBfcGFyYW1fdAkqYXNjb25mX2Fja19wYXJhbTsKKwlzY3RwX2Vycmhkcl90CQkqZXJyX3BhcmFtOworCWludAkJCWxlbmd0aDsKKwlpbnQJCQlhc2NvbmZfYWNrX2xlbiA9IGFzY29uZl9hY2stPnNrYi0+bGVuOworCV9fdTE2CQkJZXJyX2NvZGU7CisKKwlpZiAobm9fZXJyKQorCQllcnJfY29kZSA9IFNDVFBfRVJST1JfTk9fRVJST1I7CisJZWxzZQorCQllcnJfY29kZSA9IFNDVFBfRVJST1JfUkVRX1JFRlVTRUQ7CisKKwkvKiBTa2lwIHRoZSBhZGRpcGhkciBmcm9tIHRoZSBhc2NvbmZfYWNrIGNodW5rIGFuZCBzdG9yZSBhIHBvaW50ZXIgdG8KKwkgKiB0aGUgZmlyc3QgYXNjb25mX2FjayBwYXJhbWV0ZXIuCisJICovIAorCWxlbmd0aCA9IHNpemVvZihzY3RwX2FkZGlwaGRyX3QpOworCWFzY29uZl9hY2tfcGFyYW0gPSAoc2N0cF9hZGRpcF9wYXJhbV90ICopKGFzY29uZl9hY2stPnNrYi0+ZGF0YSArCisJCQkJCQkgIGxlbmd0aCk7CisJYXNjb25mX2Fja19sZW4gLT0gbGVuZ3RoOworCisJd2hpbGUgKGFzY29uZl9hY2tfbGVuID4gMCkgeworCQlpZiAoYXNjb25mX2Fja19wYXJhbS0+Y3JyX2lkID09IGFzY29uZl9wYXJhbS0+Y3JyX2lkKSB7CisJCQlzd2l0Y2goYXNjb25mX2Fja19wYXJhbS0+cGFyYW1faGRyLnR5cGUpIHsKKwkJCWNhc2UgU0NUUF9QQVJBTV9TVUNDRVNTX1JFUE9SVDoKKwkJCQlyZXR1cm4gU0NUUF9FUlJPUl9OT19FUlJPUjsKKwkJCWNhc2UgU0NUUF9QQVJBTV9FUlJfQ0FVU0U6CisJCQkJbGVuZ3RoID0gc2l6ZW9mKHNjdHBfYWRkaXBfcGFyYW1fdCk7CisJCQkJZXJyX3BhcmFtID0gKHNjdHBfZXJyaGRyX3QgKikKKwkJCQkJICAgKCh2b2lkICopYXNjb25mX2Fja19wYXJhbSArIGxlbmd0aCk7CisJCQkJYXNjb25mX2Fja19sZW4gLT0gbGVuZ3RoOworCQkJCWlmIChhc2NvbmZfYWNrX2xlbiA+IDApCisJCQkJCXJldHVybiBlcnJfcGFyYW0tPmNhdXNlOworCQkJCWVsc2UKKwkJCQkJcmV0dXJuIFNDVFBfRVJST1JfSU5WX1BBUkFNOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gU0NUUF9FUlJPUl9JTlZfUEFSQU07CisJCQl9CisJCX0KKworCQlsZW5ndGggPSBudG9ocyhhc2NvbmZfYWNrX3BhcmFtLT5wYXJhbV9oZHIubGVuZ3RoKTsKKwkJYXNjb25mX2Fja19wYXJhbSA9IChzY3RwX2FkZGlwX3BhcmFtX3QgKikKKwkJCQkJKCh2b2lkICopYXNjb25mX2Fja19wYXJhbSArIGxlbmd0aCk7CisJCWFzY29uZl9hY2tfbGVuIC09IGxlbmd0aDsKKwl9CisKKwlyZXR1cm4gZXJyX2NvZGU7Cit9CisKKy8qIFByb2Nlc3MgYW4gaW5jb21pbmcgQVNDT05GX0FDSyBjaHVuayBhZ2FpbnN0IHRoZSBjYWNoZWQgbGFzdCBBU0NPTkYgY2h1bmsuICovCitpbnQgc2N0cF9wcm9jZXNzX2FzY29uZl9hY2soc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkgICAgc3RydWN0IHNjdHBfY2h1bmsgKmFzY29uZl9hY2spCit7CisJc3RydWN0IHNjdHBfY2h1bmsJKmFzY29uZiA9IGFzb2MtPmFkZGlwX2xhc3RfYXNjb25mOworCXVuaW9uIHNjdHBfYWRkcl9wYXJhbQkqYWRkcl9wYXJhbTsKKwlzY3RwX2FkZGlwX3BhcmFtX3QJKmFzY29uZl9wYXJhbTsKKwlpbnQJbGVuZ3RoID0gMDsKKwlpbnQJYXNjb25mX2xlbiA9IGFzY29uZi0+c2tiLT5sZW47CisJaW50CWFsbF9wYXJhbV9wYXNzID0gMDsKKwlpbnQJbm9fZXJyID0gMTsKKwlpbnQJcmV0dmFsID0gMDsKKwlfX3UxNgllcnJfY29kZSA9IFNDVFBfRVJST1JfTk9fRVJST1I7CisKKwkvKiBTa2lwIHRoZSBjaHVua2hkciBhbmQgYWRkaXBoZHIgZnJvbSB0aGUgbGFzdCBhc2NvbmYgc2VudCBhbmQgc3RvcmUKKwkgKiBhIHBvaW50ZXIgdG8gYWRkcmVzcyBwYXJhbWV0ZXIuCisJICovIAorCWxlbmd0aCA9IHNpemVvZihzY3RwX2FkZGlwX2NodW5rX3QpOworCWFkZHJfcGFyYW0gPSAodW5pb24gc2N0cF9hZGRyX3BhcmFtICopKGFzY29uZi0+c2tiLT5kYXRhICsgbGVuZ3RoKTsKKwlhc2NvbmZfbGVuIC09IGxlbmd0aDsKKworCS8qIFNraXAgdGhlIGFkZHJlc3MgcGFyYW1ldGVyIGluIHRoZSBsYXN0IGFzY29uZiBzZW50IGFuZCBzdG9yZSBhCisJICogcG9pbnRlciB0byB0aGUgZmlyc3QgYXNjb25mIHBhcmFtdGVyLgorCSAqLyAKKwlsZW5ndGggPSBudG9ocyhhZGRyX3BhcmFtLT52NC5wYXJhbV9oZHIubGVuZ3RoKTsKKwlhc2NvbmZfcGFyYW0gPSAoc2N0cF9hZGRpcF9wYXJhbV90ICopKCh2b2lkICopYWRkcl9wYXJhbSArIGxlbmd0aCk7CisJYXNjb25mX2xlbiAtPSBsZW5ndGg7CisKKwkvKiBBRERJUCA0LjEKKwkgKiBBOCkgSWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UocykgdG8gc3BlY2lmaWMgVExWIHBhcmFtZXRlcihzKSwgYW5kIG5vCisJICogZmFpbHVyZXMgYXJlIGluZGljYXRlZCwgdGhlbiBhbGwgcmVxdWVzdChzKSBhcmUgY29uc2lkZXJlZAorCSAqIHN1Y2Nlc3NmdWwuCisJICovCisJaWYgKGFzY29uZl9hY2stPnNrYi0+bGVuID09IHNpemVvZihzY3RwX2FkZGlwaGRyX3QpKQorCQlhbGxfcGFyYW1fcGFzcyA9IDE7CisKKwkvKiBQcm9jZXNzIHRoZSBUTFZzIGNvbnRhaW5lZCBpbiB0aGUgbGFzdCBzZW50IEFTQ09ORiBjaHVuay4gKi8KKwl3aGlsZSAoYXNjb25mX2xlbiA+IDApIHsKKwkJaWYgKGFsbF9wYXJhbV9wYXNzKQorCQkJZXJyX2NvZGUgPSBTQ1RQX0VSUk9SX05PX0VSUk9SOworCQllbHNlIHsKKwkJCWVycl9jb2RlID0gc2N0cF9nZXRfYXNjb25mX3Jlc3BvbnNlKGFzY29uZl9hY2ssCisJCQkJCQkJICAgIGFzY29uZl9wYXJhbSwKKwkJCQkJCQkgICAgbm9fZXJyKTsKKwkJCWlmIChub19lcnIgJiYgKFNDVFBfRVJST1JfTk9fRVJST1IgIT0gZXJyX2NvZGUpKQorCQkJCW5vX2VyciA9IDA7CisJCX0KKworCQlzd2l0Y2ggKGVycl9jb2RlKSB7CisJCWNhc2UgU0NUUF9FUlJPUl9OT19FUlJPUjoKKwkJCXJldHZhbCA9IHNjdHBfYXNjb25mX3BhcmFtX3N1Y2Nlc3MoYXNvYywgYXNjb25mX3BhcmFtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NUUF9FUlJPUl9SU1JDX0xPVzoKKwkJCXJldHZhbCA9IDE7CisJCQlicmVhazsKKworCQljYXNlIFNDVFBfRVJST1JfSU5WX1BBUkFNOgorCQkJLyogRGlzYWJsZSBzZW5kaW5nIHRoaXMgdHlwZSBvZiBhc2NvbmYgcGFyYW1ldGVyIGluCisJCQkgKiBmdXR1cmUuCisJCQkgKi8JCisJCQlhc29jLT5wZWVyLmFkZGlwX2Rpc2FibGVkX21hc2sgfD0KKwkJCQlhc2NvbmZfcGFyYW0tPnBhcmFtX2hkci50eXBlOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1RQX0VSUk9SX1JFUV9SRUZVU0VEOgorCQljYXNlIFNDVFBfRVJST1JfREVMX0xBU1RfSVA6CisJCWNhc2UgU0NUUF9FUlJPUl9ERUxfU1JDX0lQOgorCQlkZWZhdWx0OgorCQkJIGJyZWFrOworCQl9CisKKwkJLyogU2tpcCB0aGUgcHJvY2Vzc2VkIGFzY29uZiBwYXJhbWV0ZXIgYW5kIG1vdmUgdG8gdGhlIG5leHQKKwkJICogb25lLgorCSAJICovIAorCQlsZW5ndGggPSBudG9ocyhhc2NvbmZfcGFyYW0tPnBhcmFtX2hkci5sZW5ndGgpOworCQlhc2NvbmZfcGFyYW0gPSAoc2N0cF9hZGRpcF9wYXJhbV90ICopKCh2b2lkICopYXNjb25mX3BhcmFtICsKKwkJCQkJCSAgICAgIGxlbmd0aCk7CisJCWFzY29uZl9sZW4gLT0gbGVuZ3RoOworCX0KKworCS8qIEZyZWUgdGhlIGNhY2hlZCBsYXN0IHNlbnQgYXNjb25mIGNodW5rLiAqLworCXNjdHBfY2h1bmtfZnJlZShhc2NvbmYpOworCWFzb2MtPmFkZGlwX2xhc3RfYXNjb25mID0gTlVMTDsKKworCS8qIFNlbmQgdGhlIG5leHQgYXNjb25mIGNodW5rIGZyb20gdGhlIGFkZGlwIGNodW5rIHF1ZXVlLiAqLworCWFzY29uZiA9IChzdHJ1Y3Qgc2N0cF9jaHVuayAqKV9fc2tiX2RlcXVldWUoJmFzb2MtPmFkZGlwX2NodW5rcyk7CisJaWYgKGFzY29uZikgeworCQkvKiBIb2xkIHRoZSBjaHVuayB1bnRpbCBhbiBBU0NPTkZfQUNLIGlzIHJlY2VpdmVkLiAqLworCQlzY3RwX2NodW5rX2hvbGQoYXNjb25mKTsKKwkJaWYgKHNjdHBfcHJpbWl0aXZlX0FTQ09ORihhc29jLCBhc2NvbmYpKQorCQkJc2N0cF9jaHVua19mcmVlKGFzY29uZik7CisJCWVsc2UKKwkJCWFzb2MtPmFkZGlwX2xhc3RfYXNjb25mID0gYXNjb25mOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIE1ha2UgYSBGV0QgVFNOIGNodW5rLiAqLyAKK3N0cnVjdCBzY3RwX2NodW5rICpzY3RwX21ha2VfZndkdHNuKGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSAgICBfX3UzMiBuZXdfY3VtX3Rzbiwgc2l6ZV90IG5zdHJlYW1zLAorCQkJCSAgICBzdHJ1Y3Qgc2N0cF9md2R0c25fc2tpcCAqc2tpcGxpc3QpCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKnJldHZhbCA9IE5VTEw7CisJc3RydWN0IHNjdHBfZndkdHNuX2NodW5rICpmdHNuX2NodW5rOworCXN0cnVjdCBzY3RwX2Z3ZHRzbl9oZHIgZnRzbl9oZHI7IAorCXN0cnVjdCBzY3RwX2Z3ZHRzbl9za2lwIHNraXA7CisJc2l6ZV90IGhpbnQ7CisJaW50IGk7CisKKwloaW50ID0gKG5zdHJlYW1zICsgMSkgKiBzaXplb2YoX191MzIpOworCisJLyogTWF5YmUgc2V0IHRoZSBULWJpdCBpZiB3ZSBoYXZlIG5vIGFzc29jaWF0aW9uLiAgKi8KKwlyZXR2YWwgPSBzY3RwX21ha2VfY2h1bmsoYXNvYywgU0NUUF9DSURfRldEX1RTTiwgMCwgaGludCk7CisKKwlpZiAoIXJldHZhbCkKKwkJcmV0dXJuIE5VTEw7CisKKwlmdHNuX2NodW5rID0gKHN0cnVjdCBzY3RwX2Z3ZHRzbl9jaHVuayAqKXJldHZhbC0+c3ViaC5md2R0c25faGRyOworCisJZnRzbl9oZHIubmV3X2N1bV90c24gPSBodG9ubChuZXdfY3VtX3Rzbik7CisJcmV0dmFsLT5zdWJoLmZ3ZHRzbl9oZHIgPQorCQlzY3RwX2FkZHRvX2NodW5rKHJldHZhbCwgc2l6ZW9mKGZ0c25faGRyKSwgJmZ0c25faGRyKTsKKworCWZvciAoaSA9IDA7IGkgPCBuc3RyZWFtczsgaSsrKSB7CisJCXNraXAuc3RyZWFtID0gc2tpcGxpc3RbaV0uc3RyZWFtOworCQlza2lwLnNzbiA9IHNraXBsaXN0W2ldLnNzbjsKKwkJc2N0cF9hZGR0b19jaHVuayhyZXR2YWwsIHNpemVvZihza2lwKSwgJnNraXApOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zbV9zaWRlZWZmZWN0LmMgYi9uZXQvc2N0cC9zbV9zaWRlZWZmZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZmE0NAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY3RwL3NtX3NpZGVlZmZlY3QuYwpAQCAtMCwwICsxLDEzOTUgQEAKKy8qIFNDVFAga2VybmVsIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSwgMjAwNAorICogQ29weXJpZ2h0IChjKSAxOTk5IENpc2NvLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSBNb3Rvcm9sYSwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBTQ1RQIGtlcm5lbCByZWZlcmVuY2UgSW1wbGVtZW50YXRpb24KKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgd29yayB3aXRoIHRoZSBzdGF0ZSBmdW5jdGlvbnMgaW4gc2N0cF9zbV9zdGF0ZWZ1bnMuYworICogdG8gaW1wbGVtZW50IHRoYXQgc3RhdGUgb3BlcmF0aW9ucy4gIFRoZXNlIGZ1bmN0aW9ucyBpbXBsZW1lbnQgdGhlCisgKiBzdGVwcyB3aGljaCByZXF1aXJlIG1vZGlmeWluZyBleGlzdGluZyBkYXRhIHN0cnVjdHVyZXMuCisgKgorICogVGhlIFNDVFAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQKKyAqIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICogICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBQbGVhc2Ugc2VuZCBhbnkgYnVnIHJlcG9ydHMgb3IgZml4ZXMgeW91IG1ha2UgdG8gdGhlCisgKiBlbWFpbCBhZGRyZXNzKGVzKToKKyAqICAgIGxrc2N0cCBkZXZlbG9wZXJzIDxsa3NjdHAtZGV2ZWxvcGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogT3Igc3VibWl0IGEgYnVnIHJlcG9ydCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgd2Vic2l0ZToKKyAqICAgIGh0dHA6Ly93d3cuc2YubmV0L3Byb2plY3RzL2xrc2N0cAorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiAgICBMYSBNb250ZSBILlAuIFlhcnJvbGwgPHBpZ2d5QGFjbS5vcmc+CisgKiAgICBLYXJsIEtudXRzb24gICAgICAgICAgPGthcmxAYXRoZW5hLmNoaWNhZ28uaWwudXM+CisgKiAgICBKb24gR3JpbW0gICAgICAgICAgICAgPGpncmltbUBhdXN0aW4uaWJtLmNvbT4KKyAqICAgIEh1aSBIdWFuZwkJICAgIDxodWkuaHVhbmdAbm9raWEuY29tPgorICogICAgRGFqaWFuZyBaaGFuZwkgICAgPGRhamlhbmcuemhhbmdAbm9raWEuY29tPgorICogICAgRGFpc3kgQ2hhbmcJICAgIDxkYWlzeWNAdXMuaWJtLmNvbT4KKyAqICAgIFNyaWRoYXIgU2FtdWRyYWxhCSAgICA8c3JpQHVzLmlibS5jb20+CisgKiAgICBBcmRlbGxlIEZhbgkgICAgPGFyZGVsbGUuZmFuQGludGVsLmNvbT4KKyAqCisgKiBBbnkgYnVncyByZXBvcnRlZCBnaXZlbiB0byB1cyB3ZSB3aWxsIHRyeSB0byBmaXguLi4gYW55IGZpeGVzIHNoYXJlZCB3aWxsCisgKiBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbmV4dCBTQ1RQIHJlbGVhc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9zY3RwL3NjdHAuaD4KKyNpbmNsdWRlIDxuZXQvc2N0cC9zbS5oPgorCitzdGF0aWMgaW50IHNjdHBfY21kX2ludGVycHJldGVyKHNjdHBfZXZlbnRfdCBldmVudF90eXBlLAorCQkJCXNjdHBfc3VidHlwZV90IHN1YnR5cGUsCisJCQkJc2N0cF9zdGF0ZV90IHN0YXRlLAorCQkJCXN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwkJCQlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQl2b2lkICpldmVudF9hcmcsCisJCQkgCXNjdHBfZGlzcG9zaXRpb25fdCBzdGF0dXMsCisJCQkJc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzLAorCQkJCWludCBnZnApOworc3RhdGljIGludCBzY3RwX3NpZGVfZWZmZWN0cyhzY3RwX2V2ZW50X3QgZXZlbnRfdHlwZSwgc2N0cF9zdWJ0eXBlX3Qgc3VidHlwZSwKKwkJCSAgICAgc2N0cF9zdGF0ZV90IHN0YXRlLAorCQkJICAgICBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkgICAgIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJICAgICB2b2lkICpldmVudF9hcmcsCisJCQkgICAgIHNjdHBfZGlzcG9zaXRpb25fdCBzdGF0dXMsCisJCQkgICAgIHNjdHBfY21kX3NlcV90ICpjb21tYW5kcywKKwkJCSAgICAgaW50IGdmcCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSGVscGVyIGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBIGhlbHBlciBmdW5jdGlvbiBmb3IgZGVsYXllZCBwcm9jZXNzaW5nIG9mIElORVQgRUNOIENFIGJpdC4gKi8KK3N0YXRpYyB2b2lkIHNjdHBfZG9fZWNuX2NlX3dvcmsoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsIAorCQkJCV9fdTMyIGxvd2VzdF90c24pCit7CisJLyogU2F2ZSB0aGUgVFNOIGF3YXkgZm9yIGNvbXBhcmlzb24gd2hlbiB3ZSByZWNlaXZlIENXUiAqLworCisJYXNvYy0+bGFzdF9lY25lX3RzbiA9IGxvd2VzdF90c247CisJYXNvYy0+bmVlZF9lY25lID0gMTsKK30KKworLyogSGVscGVyIGZ1bmN0aW9uIGZvciBkZWxheWVkIHByb2Nlc3Npbmcgb2YgU0NUUCBFQ05FIGNodW5rLiAgKi8KKy8qIFJGQyAyOTYwIEFwcGVuZGl4IEEKKyAqCisgKiBSRkMgMjQ4MSBkZXRhaWxzIGEgc3BlY2lmaWMgYml0IGZvciBhIHNlbmRlciB0byBzZW5kIGluCisgKiB0aGUgaGVhZGVyIG9mIGl0cyBuZXh0IG91dGJvdW5kIFRDUCBzZWdtZW50IHRvIGluZGljYXRlIHRvCisgKiBpdHMgcGVlciB0aGF0IGl0IGhhcyByZWR1Y2VkIGl0cyBjb25nZXN0aW9uIHdpbmRvdy4gIFRoaXMKKyAqIGlzIHRlcm1lZCB0aGUgQ1dSIGJpdC4gIEZvciBTQ1RQIHRoZSBzYW1lIGluZGljYXRpb24gaXMgbWFkZQorICogYnkgaW5jbHVkaW5nIHRoZSBDV1IgY2h1bmsuICBUaGlzIGNodW5rIGNvbnRhaW5zIG9uZSBkYXRhCisgKiBlbGVtZW50LCBpLmUuIHRoZSBUU04gbnVtYmVyIHRoYXQgd2FzIHNlbnQgaW4gdGhlIEVDTkUgY2h1bmsuCisgKiBUaGlzIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbG93ZXN0IFRTTiBudW1iZXIgaW4gdGhlIGRhdGFncmFtCisgKiB0aGF0IHdhcyBvcmlnaW5hbGx5IG1hcmtlZCB3aXRoIHRoZSBDRSBiaXQuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9kb19lY25fZWNuZV93b3JrKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCQkgICBfX3UzMiBsb3dlc3RfdHNuLAorCQkJCQkgICBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmspCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKnJlcGw7CisKKwkvKiBPdXIgcHJldmlvdXNseSB0cmFuc21pdHRlZCBwYWNrZXQgcmFuIGludG8gc29tZSBjb25nZXN0aW9uCisJICogc28gd2Ugc2hvdWxkIHRha2UgYWN0aW9uIGJ5IHJlZHVjaW5nIGN3bmQgYW5kIHNzdGhyZXNoCisJICogYW5kIHRoZW4gQUNLIG91ciBwZWVyIHRoYXQgd2Ugd2UndmUgZG9uZSBzbyBieQorCSAqIHNlbmRpbmcgYSBDV1IuCisJICovCisKKwkvKiBGaXJzdCwgdHJ5IHRvIGRldGVybWluZSBpZiB3ZSB3YW50IHRvIGFjdHVhbGx5IGxvd2VyCisJICogb3VyIGN3bmQgdmFyaWFibGVzLiAgT25seSBsb3dlciB0aGVtIGlmIHRoZSBFQ05FIGxvb2tzIG1vcmUKKwkgKiByZWNlbnQgdGhhbiB0aGUgbGFzdCByZXNwb25zZS4KKwkgKi8KKwlpZiAoVFNOX2x0KGFzb2MtPmxhc3RfY3dyX3RzbiwgbG93ZXN0X3RzbikpIHsKKwkJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisKKwkJLyogRmluZCB3aGljaCB0cmFuc3BvcnQncyBjb25nZXN0aW9uIHZhcmlhYmxlcworCQkgKiBuZWVkIHRvIGJlIGFkanVzdGVkLgorCQkgKi8KKwkJdHJhbnNwb3J0ID0gc2N0cF9hc3NvY19sb29rdXBfdHNuKGFzb2MsIGxvd2VzdF90c24pOworCisJCS8qIFVwZGF0ZSB0aGUgY29uZ2VzdGlvbiB2YXJpYWJsZXMuICovCisJCWlmICh0cmFuc3BvcnQpCisJCQlzY3RwX3RyYW5zcG9ydF9sb3dlcl9jd25kKHRyYW5zcG9ydCwKKwkJCQkJCSAgU0NUUF9MT1dFUl9DV05EX0VDTkUpOworCQlhc29jLT5sYXN0X2N3cl90c24gPSBsb3dlc3RfdHNuOworCX0KKworCS8qIEFsd2F5cyB0cnkgdG8gcXVpZXQgdGhlIG90aGVyIGVuZC4gIEluIGNhc2Ugb2YgbG9zdCBDV1IsCisJICogcmVzZW5kIGxhc3RfY3dyX3Rzbi4KKwkgKi8KKwlyZXBsID0gc2N0cF9tYWtlX2N3cihhc29jLCBhc29jLT5sYXN0X2N3cl90c24sIGNodW5rKTsKKworCS8qIElmIHdlIHJ1biBvdXQgb2YgbWVtb3J5LCBpdCB3aWxsIGxvb2sgbGlrZSBhIGxvc3QgQ1dSLiAgV2UnbGwKKwkgKiBnZXQgYmFjayBpbiBzeW5jIGV2ZW50dWFsbHkuCisJICovCisJcmV0dXJuIHJlcGw7Cit9CisKKy8qIEhlbHBlciBmdW5jdGlvbiB0byBkbyBkZWxheWVkIHByb2Nlc3Npbmcgb2YgRUNOIENXUiBjaHVuay4gICovCitzdGF0aWMgdm9pZCBzY3RwX2RvX2Vjbl9jd3Jfd29yayhzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkgX191MzIgbG93ZXN0X3RzbikKK3sKKwkvKiBUdXJuIG9mZiBFQ05FIGdldHRpbmcgYXV0by1wcmVwZW5kZWQgdG8gZXZlcnkgb3V0Z29pbmcKKwkgKiBwYWNrZXQKKwkgKi8KKwlhc29jLT5uZWVkX2VjbmUgPSAwOworfQorCisvKiBHZW5lcmF0ZSBTQUNLIGlmIG5lY2Vzc2FyeS4gIFdlIGNhbGwgdGhpcyBhdCB0aGUgZW5kIG9mIGEgcGFja2V0LiAgKi8KK3N0YXRpYyBpbnQgc2N0cF9nZW5fc2FjayhzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywgaW50IGZvcmNlLAorCQkJIHNjdHBfY21kX3NlcV90ICpjb21tYW5kcykKK3sKKwlfX3UzMiBjdHNuLCBtYXhfdHNuX3NlZW47CisJc3RydWN0IHNjdHBfY2h1bmsgKnNhY2s7CisJaW50IGVycm9yID0gMDsKKworCWlmIChmb3JjZSkKKwkJYXNvYy0+cGVlci5zYWNrX25lZWRlZCA9IDE7CisKKwljdHNuID0gc2N0cF90c25tYXBfZ2V0X2N0c24oJmFzb2MtPnBlZXIudHNuX21hcCk7CisJbWF4X3Rzbl9zZWVuID0gc2N0cF90c25tYXBfZ2V0X21heF90c25fc2VlbigmYXNvYy0+cGVlci50c25fbWFwKTsKKworCS8qIEZyb20gMTIuMiBQYXJhbWV0ZXJzIG5lY2Vzc2FyeSBwZXIgYXNzb2NpYXRpb24gKGkuZS4gdGhlIFRDQik6CisJICoKKwkgKiBBY2sgU3RhdGUgOiBUaGlzIGZsYWcgaW5kaWNhdGVzIGlmIHRoZSBuZXh0IHJlY2VpdmVkIHBhY2tldAorCSAqIAkgICAgIDogaXMgdG8gYmUgcmVzcG9uZGVkIHRvIHdpdGggYSBTQUNLLiAuLi4KKwkgKgkgICAgIDogV2hlbiBEQVRBIGNodW5rcyBhcmUgb3V0IG9mIG9yZGVyLCBTQUNLJ3MKKwkgKiAgICAgICAgICAgOiBhcmUgbm90IGRlbGF5ZWQgKHNlZSBTZWN0aW9uIDYpLgorCSAqCisJICogW1RoaXMgaXMgYWN0dWFsbHkgbm90IG1lbnRpb25lZCBpbiBTZWN0aW9uIDYsIGJ1dCB3ZQorCSAqIGltcGxlbWVudCBpdCBoZXJlIGFueXdheS4gLS1waWdneV0KKwkgKi8KKyAgICAgICAgaWYgKG1heF90c25fc2VlbiAhPSBjdHNuKQorCQlhc29jLT5wZWVyLnNhY2tfbmVlZGVkID0gMTsKKworCS8qIEZyb20gNi4yICBBY2tub3dsZWRnZW1lbnQgb24gUmVjZXB0aW9uIG9mIERBVEEgQ2h1bmtzOgorCSAqCisJICogU2VjdGlvbiA0LjIgb2YgW1JGQzI1ODFdIFNIT1VMRCBiZSBmb2xsb3dlZC4gU3BlY2lmaWNhbGx5LAorCSAqIGFuIGFja25vd2xlZGdlbWVudCBTSE9VTEQgYmUgZ2VuZXJhdGVkIGZvciBhdCBsZWFzdCBldmVyeQorCSAqIHNlY29uZCBwYWNrZXQgKG5vdCBldmVyeSBzZWNvbmQgREFUQSBjaHVuaykgcmVjZWl2ZWQsIGFuZAorCSAqIFNIT1VMRCBiZSBnZW5lcmF0ZWQgd2l0aGluIDIwMCBtcyBvZiB0aGUgYXJyaXZhbCBvZiBhbnkKKwkgKiB1bmFja25vd2xlZGdlZCBEQVRBIGNodW5rLiAuLi4KKwkgKi8KKwlpZiAoIWFzb2MtPnBlZXIuc2Fja19uZWVkZWQpIHsKKwkJLyogV2Ugd2lsbCBuZWVkIGEgU0FDSyBmb3IgdGhlIG5leHQgcGFja2V0LiAgKi8KKwkJYXNvYy0+cGVlci5zYWNrX25lZWRlZCA9IDE7CisJCWdvdG8gb3V0OworCX0gZWxzZSB7CisJCWlmIChhc29jLT5hX3J3bmQgPiBhc29jLT5yd25kKQorCQkJYXNvYy0+YV9yd25kID0gYXNvYy0+cnduZDsKKwkJc2FjayA9IHNjdHBfbWFrZV9zYWNrKGFzb2MpOworCQlpZiAoIXNhY2spCisJCQlnb3RvIG5vbWVtOworCisJCWFzb2MtPnBlZXIuc2Fja19uZWVkZWQgPSAwOworCisJCWVycm9yID0gc2N0cF9vdXRxX3RhaWwoJmFzb2MtPm91dHF1ZXVlLCBzYWNrKTsKKworCQkvKiBTdG9wIHRoZSBTQUNLIHRpbWVyLiAgKi8KKwkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9USU1FUl9TVE9QLAorCQkJCVNDVFBfVE8oU0NUUF9FVkVOVF9USU1FT1VUX1NBQ0spKTsKKwl9CitvdXQ6CisJcmV0dXJuIGVycm9yOworbm9tZW06CisJZXJyb3IgPSAtRU5PTUVNOworCXJldHVybiBlcnJvcjsKK30KKworLyogV2hlbiB0aGUgVDMtUlRYIHRpbWVyIGV4cGlyZXMsIGl0IGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZQorICogcmVsZXZhbnQgc3RhdGUgbWFjaGluZSBldmVudC4KKyAqLwordm9pZCBzY3RwX2dlbmVyYXRlX3QzX3J0eF9ldmVudCh1bnNpZ25lZCBsb25nIHBlZXIpCit7CisJaW50IGVycm9yOworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0ID0gKHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqKSBwZWVyOworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jID0gdHJhbnNwb3J0LT5hc29jOworCisJLyogQ2hlY2sgd2hldGhlciBhIHRhc2sgaXMgaW4gdGhlIHNvY2suICAqLworCisJc2N0cF9iaF9sb2NrX3NvY2soYXNvYy0+YmFzZS5zayk7CisJaWYgKHNvY2tfb3duZWRfYnlfdXNlcihhc29jLT5iYXNlLnNrKSkgeworCQlTQ1RQX0RFQlVHX1BSSU5USygiJXM6U29jayBpcyBidXN5LlxuIiwgX19GVU5DVElPTl9fKTsKKworCQkvKiBUcnkgYWdhaW4gbGF0ZXIuICAqLworCQlpZiAoIW1vZF90aW1lcigmdHJhbnNwb3J0LT5UM19ydHhfdGltZXIsIGppZmZpZXMgKyAoSFovMjApKSkKKwkJCXNjdHBfdHJhbnNwb3J0X2hvbGQodHJhbnNwb3J0KTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCS8qIElzIHRoaXMgdHJhbnNwb3J0IHJlYWxseSBkZWFkIGFuZCBqdXN0IHdhaXRpbmcgYXJvdW5kIGZvcgorCSAqIHRoZSB0aW1lciB0byBsZXQgZ28gb2YgdGhlIHJlZmVyZW5jZT8KKwkgKi8KKwlpZiAodHJhbnNwb3J0LT5kZWFkKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwkvKiBSdW4gdGhyb3VnaCB0aGUgc3RhdGUgbWFjaGluZS4gICovCisJZXJyb3IgPSBzY3RwX2RvX3NtKFNDVFBfRVZFTlRfVF9USU1FT1VULAorCQkJICAgU0NUUF9TVF9USU1FT1VUKFNDVFBfRVZFTlRfVElNRU9VVF9UM19SVFgpLAorCQkJICAgYXNvYy0+c3RhdGUsCisJCQkgICBhc29jLT5lcCwgYXNvYywKKwkJCSAgIHRyYW5zcG9ydCwgR0ZQX0FUT01JQyk7CisKKwlpZiAoZXJyb3IpCisJCWFzb2MtPmJhc2Uuc2stPnNrX2VyciA9IC1lcnJvcjsKKworb3V0X3VubG9jazoKKwlzY3RwX2JoX3VubG9ja19zb2NrKGFzb2MtPmJhc2Uuc2spOworCXNjdHBfdHJhbnNwb3J0X3B1dCh0cmFuc3BvcnQpOworfQorCisvKiBUaGlzIGlzIGEgc2EgaW50ZXJmYWNlIGZvciBwcm9kdWNpbmcgdGltZW91dCBldmVudHMuICBJdCB3b3JrcworICogZm9yIHRpbWVvdXRzIHdoaWNoIHVzZSB0aGUgYXNzb2NpYXRpb24gYXMgdGhlaXIgcGFyYW1ldGVyLgorICovCitzdGF0aWMgdm9pZCBzY3RwX2dlbmVyYXRlX3RpbWVvdXRfZXZlbnQoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJCXNjdHBfZXZlbnRfdGltZW91dF90IHRpbWVvdXRfdHlwZSkKK3sKKwlpbnQgZXJyb3IgPSAwOworCisJc2N0cF9iaF9sb2NrX3NvY2soYXNvYy0+YmFzZS5zayk7CisJaWYgKHNvY2tfb3duZWRfYnlfdXNlcihhc29jLT5iYXNlLnNrKSkgeworCQlTQ1RQX0RFQlVHX1BSSU5USygiJXM6U29jayBpcyBidXN5OiB0aW1lciAlZFxuIiwKKwkJCQkgIF9fRlVOQ1RJT05fXywKKwkJCQkgIHRpbWVvdXRfdHlwZSk7CisKKwkJLyogVHJ5IGFnYWluIGxhdGVyLiAgKi8KKwkJaWYgKCFtb2RfdGltZXIoJmFzb2MtPnRpbWVyc1t0aW1lb3V0X3R5cGVdLCBqaWZmaWVzICsgKEhaLzIwKSkpCisJCQlzY3RwX2Fzc29jaWF0aW9uX2hvbGQoYXNvYyk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwkvKiBJcyB0aGlzIGFzc29jaWF0aW9uIHJlYWxseSBkZWFkIGFuZCBqdXN0IHdhaXRpbmcgYXJvdW5kIGZvcgorCSAqIHRoZSB0aW1lciB0byBsZXQgZ28gb2YgdGhlIHJlZmVyZW5jZT8KKwkgKi8KKwlpZiAoYXNvYy0+YmFzZS5kZWFkKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwkvKiBSdW4gdGhyb3VnaCB0aGUgc3RhdGUgbWFjaGluZS4gICovCisJZXJyb3IgPSBzY3RwX2RvX3NtKFNDVFBfRVZFTlRfVF9USU1FT1VULAorCQkJICAgU0NUUF9TVF9USU1FT1VUKHRpbWVvdXRfdHlwZSksCisJCQkgICBhc29jLT5zdGF0ZSwgYXNvYy0+ZXAsIGFzb2MsCisJCQkgICAodm9pZCAqKXRpbWVvdXRfdHlwZSwgR0ZQX0FUT01JQyk7CisKKwlpZiAoZXJyb3IpCisJCWFzb2MtPmJhc2Uuc2stPnNrX2VyciA9IC1lcnJvcjsKKworb3V0X3VubG9jazoKKwlzY3RwX2JoX3VubG9ja19zb2NrKGFzb2MtPmJhc2Uuc2spOworCXNjdHBfYXNzb2NpYXRpb25fcHV0KGFzb2MpOworfQorCitzdGF0aWMgdm9pZCBzY3RwX2dlbmVyYXRlX3QxX2Nvb2tpZV9ldmVudCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MgPSAoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKikgZGF0YTsKKwlzY3RwX2dlbmVyYXRlX3RpbWVvdXRfZXZlbnQoYXNvYywgU0NUUF9FVkVOVF9USU1FT1VUX1QxX0NPT0tJRSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjdHBfZ2VuZXJhdGVfdDFfaW5pdF9ldmVudCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MgPSAoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKikgZGF0YTsKKwlzY3RwX2dlbmVyYXRlX3RpbWVvdXRfZXZlbnQoYXNvYywgU0NUUF9FVkVOVF9USU1FT1VUX1QxX0lOSVQpOworfQorCitzdGF0aWMgdm9pZCBzY3RwX2dlbmVyYXRlX3QyX3NodXRkb3duX2V2ZW50KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYyA9IChzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqKSBkYXRhOworCXNjdHBfZ2VuZXJhdGVfdGltZW91dF9ldmVudChhc29jLCBTQ1RQX0VWRU5UX1RJTUVPVVRfVDJfU0hVVERPV04pOworfQorCitzdGF0aWMgdm9pZCBzY3RwX2dlbmVyYXRlX3Q0X3J0b19ldmVudCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MgPSAoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKikgZGF0YTsKKwlzY3RwX2dlbmVyYXRlX3RpbWVvdXRfZXZlbnQoYXNvYywgU0NUUF9FVkVOVF9USU1FT1VUX1Q0X1JUTyk7Cit9CisKK3N0YXRpYyB2b2lkIHNjdHBfZ2VuZXJhdGVfdDVfc2h1dGRvd25fZ3VhcmRfZXZlbnQodW5zaWduZWQgbG9uZyBkYXRhKQoreworICAgICAgICBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYyA9IChzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqKWRhdGE7CisgICAgICAgIHNjdHBfZ2VuZXJhdGVfdGltZW91dF9ldmVudChhc29jLAorCQkJCSAgICBTQ1RQX0VWRU5UX1RJTUVPVVRfVDVfU0hVVERPV05fR1VBUkQpOworCit9IC8qIHNjdHBfZ2VuZXJhdGVfdDVfc2h1dGRvd25fZ3VhcmRfZXZlbnQoKSAqLworCitzdGF0aWMgdm9pZCBzY3RwX2dlbmVyYXRlX2F1dG9jbG9zZV9ldmVudCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MgPSAoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKikgZGF0YTsKKwlzY3RwX2dlbmVyYXRlX3RpbWVvdXRfZXZlbnQoYXNvYywgU0NUUF9FVkVOVF9USU1FT1VUX0FVVE9DTE9TRSk7Cit9CisKKy8qIEdlbmVyYXRlIGEgaGVhcnQgYmVhdCBldmVudC4gIElmIHRoZSBzb2NrIGlzIGJ1c3ksIHJlc2NoZWR1bGUuICAgTWFrZQorICogc3VyZSB0aGF0IHRoZSB0cmFuc3BvcnQgaXMgc3RpbGwgdmFsaWQuCisgKi8KK3ZvaWQgc2N0cF9nZW5lcmF0ZV9oZWFydGJlYXRfZXZlbnQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCWludCBlcnJvciA9IDA7CisJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQgPSAoc3RydWN0IHNjdHBfdHJhbnNwb3J0ICopIGRhdGE7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MgPSB0cmFuc3BvcnQtPmFzb2M7CisKKwlzY3RwX2JoX2xvY2tfc29jayhhc29jLT5iYXNlLnNrKTsKKwlpZiAoc29ja19vd25lZF9ieV91c2VyKGFzb2MtPmJhc2Uuc2spKSB7CisJCVNDVFBfREVCVUdfUFJJTlRLKCIlczpTb2NrIGlzIGJ1c3kuXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCS8qIFRyeSBhZ2FpbiBsYXRlci4gICovCisJCWlmICghbW9kX3RpbWVyKCZ0cmFuc3BvcnQtPmhiX3RpbWVyLCBqaWZmaWVzICsgKEhaLzIwKSkpCisJCQlzY3RwX3RyYW5zcG9ydF9ob2xkKHRyYW5zcG9ydCk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwkvKiBJcyB0aGlzIHN0cnVjdHVyZSBqdXN0IHdhaXRpbmcgYXJvdW5kIGZvciB1cyB0byBhY3R1YWxseQorCSAqIGdldCBkZXN0cm95ZWQ/CisJICovCisJaWYgKHRyYW5zcG9ydC0+ZGVhZCkKKwkJZ290byBvdXRfdW5sb2NrOworCisJZXJyb3IgPSBzY3RwX2RvX3NtKFNDVFBfRVZFTlRfVF9USU1FT1VULAorCQkJICAgU0NUUF9TVF9USU1FT1VUKFNDVFBfRVZFTlRfVElNRU9VVF9IRUFSVEJFQVQpLAorCQkJICAgYXNvYy0+c3RhdGUsIGFzb2MtPmVwLCBhc29jLAorCQkJICAgdHJhbnNwb3J0LCBHRlBfQVRPTUlDKTsKKworICAgICAgICAgaWYgKGVycm9yKQorCQkgYXNvYy0+YmFzZS5zay0+c2tfZXJyID0gLWVycm9yOworCitvdXRfdW5sb2NrOgorCXNjdHBfYmhfdW5sb2NrX3NvY2soYXNvYy0+YmFzZS5zayk7CisJc2N0cF90cmFuc3BvcnRfcHV0KHRyYW5zcG9ydCk7Cit9CisKKy8qIEluamVjdCBhIFNBQ0sgVGltZW91dCBldmVudCBpbnRvIHRoZSBzdGF0ZSBtYWNoaW5lLiAgKi8KK3N0YXRpYyB2b2lkIHNjdHBfZ2VuZXJhdGVfc2Fja19ldmVudCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MgPSAoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKikgZGF0YTsKKwlzY3RwX2dlbmVyYXRlX3RpbWVvdXRfZXZlbnQoYXNvYywgU0NUUF9FVkVOVF9USU1FT1VUX1NBQ0spOworfQorCitzY3RwX3RpbWVyX2V2ZW50X3QgKnNjdHBfdGltZXJfZXZlbnRzW1NDVFBfTlVNX1RJTUVPVVRfVFlQRVNdID0geworCU5VTEwsCisJc2N0cF9nZW5lcmF0ZV90MV9jb29raWVfZXZlbnQsCisJc2N0cF9nZW5lcmF0ZV90MV9pbml0X2V2ZW50LAorCXNjdHBfZ2VuZXJhdGVfdDJfc2h1dGRvd25fZXZlbnQsCisJTlVMTCwKKwlzY3RwX2dlbmVyYXRlX3Q0X3J0b19ldmVudCwKKwlzY3RwX2dlbmVyYXRlX3Q1X3NodXRkb3duX2d1YXJkX2V2ZW50LAorCXNjdHBfZ2VuZXJhdGVfaGVhcnRiZWF0X2V2ZW50LAorCXNjdHBfZ2VuZXJhdGVfc2Fja19ldmVudCwKKwlzY3RwX2dlbmVyYXRlX2F1dG9jbG9zZV9ldmVudCwKK307CisKKworLyogUkZDIDI5NjAgOC4yIFBhdGggRmFpbHVyZSBEZXRlY3Rpb24KKyAqCisgKiBXaGVuIGl0cyBwZWVyIGVuZHBvaW50IGlzIG11bHRpLWhvbWVkLCBhbiBlbmRwb2ludCBzaG91bGQga2VlcCBhCisgKiBlcnJvciBjb3VudGVyIGZvciBlYWNoIG9mIHRoZSBkZXN0aW5hdGlvbiB0cmFuc3BvcnQgYWRkcmVzc2VzIG9mIHRoZQorICogcGVlciBlbmRwb2ludC4KKyAqCisgKiBFYWNoIHRpbWUgdGhlIFQzLXJ0eCB0aW1lciBleHBpcmVzIG9uIGFueSBhZGRyZXNzLCBvciB3aGVuIGEKKyAqIEhFQVJUQkVBVCBzZW50IHRvIGFuIGlkbGUgYWRkcmVzcyBpcyBub3QgYWNrbm93bGVkZ2VkIHdpdGhpbiBhIFJUTywKKyAqIHRoZSBlcnJvciBjb3VudGVyIG9mIHRoYXQgZGVzdGluYXRpb24gYWRkcmVzcyB3aWxsIGJlIGluY3JlbWVudGVkLgorICogV2hlbiB0aGUgdmFsdWUgaW4gdGhlIGVycm9yIGNvdW50ZXIgZXhjZWVkcyB0aGUgcHJvdG9jb2wgcGFyYW1ldGVyCisgKiAnUGF0aC5NYXguUmV0cmFucycgb2YgdGhhdCBkZXN0aW5hdGlvbiBhZGRyZXNzLCB0aGUgZW5kcG9pbnQgc2hvdWxkCisgKiBtYXJrIHRoZSBkZXN0aW5hdGlvbiB0cmFuc3BvcnQgYWRkcmVzcyBhcyBpbmFjdGl2ZSwgYW5kIGEKKyAqIG5vdGlmaWNhdGlvbiBTSE9VTEQgYmUgc2VudCB0byB0aGUgdXBwZXIgbGF5ZXIuCisgKgorICovCitzdGF0aWMgdm9pZCBzY3RwX2RvXzhfMl90cmFuc3BvcnRfc3RyaWtlKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCQkgc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisJLyogVGhlIGNoZWNrIGZvciBhc3NvY2lhdGlvbidzIG92ZXJhbGwgZXJyb3IgY291bnRlciBleGNlZWRpbmcgdGhlCisJICogdGhyZXNob2xkIGlzIGRvbmUgaW4gdGhlIHN0YXRlIGZ1bmN0aW9uLgorCSAqLworCWFzb2MtPm92ZXJhbGxfZXJyb3JfY291bnQrKzsKKworCWlmICh0cmFuc3BvcnQtPmFjdGl2ZSAmJgorCSAgICAodHJhbnNwb3J0LT5lcnJvcl9jb3VudCsrID49IHRyYW5zcG9ydC0+bWF4X3JldHJhbnMpKSB7CisJCVNDVFBfREVCVUdfUFJJTlRLKCJ0cmFuc3BvcnRfc3RyaWtlOiB0cmFuc3BvcnQgIgorCQkJCSAgIklQOiVkLiVkLiVkLiVkIGZhaWxlZC5cbiIsCisJCQkJICBOSVBRVUFEKHRyYW5zcG9ydC0+aXBhZGRyLnY0LnNpbl9hZGRyKSk7CisJCXNjdHBfYXNzb2NfY29udHJvbF90cmFuc3BvcnQoYXNvYywgdHJhbnNwb3J0LAorCQkJCQkgICAgIFNDVFBfVFJBTlNQT1JUX0RPV04sCisJCQkJCSAgICAgU0NUUF9GQUlMRURfVEhSRVNIT0xEKTsKKwl9CisKKwkvKiBFMikgRm9yIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGZvciB3aGljaCB0aGUgdGltZXIKKwkgKiBleHBpcmVzLCBzZXQgUlRPIDwtIFJUTyAqIDIgKCJiYWNrIG9mZiB0aGUgdGltZXIiKS4gIFRoZQorCSAqIG1heGltdW0gdmFsdWUgZGlzY3Vzc2VkIGluIHJ1bGUgQzcgYWJvdmUgKFJUTy5tYXgpIG1heSBiZQorCSAqIHVzZWQgdG8gcHJvdmlkZSBhbiB1cHBlciBib3VuZCB0byB0aGlzIGRvdWJsaW5nIG9wZXJhdGlvbi4KKwkgKi8KKwl0cmFuc3BvcnQtPnJ0byA9IG1pbigodHJhbnNwb3J0LT5ydG8gKiAyKSwgdHJhbnNwb3J0LT5hc29jLT5ydG9fbWF4KTsKK30KKworLyogV29ya2VyIHJvdXRpbmUgdG8gaGFuZGxlIElOSVQgY29tbWFuZCBmYWlsdXJlLiAgKi8KK3N0YXRpYyB2b2lkIHNjdHBfY21kX2luaXRfZmFpbGVkKHNjdHBfY21kX3NlcV90ICpjb21tYW5kcywKKwkJCQkgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJIHVuc2lnbmVkIGVycm9yKQoreworCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudDsKKworCWV2ZW50ID0gc2N0cF91bHBldmVudF9tYWtlX2Fzc29jX2NoYW5nZShhc29jLDAsIFNDVFBfQ0FOVF9TVFJfQVNTT0MsCisJCQkJCQkoX191MTYpZXJyb3IsIDAsIDAsCisJCQkJCQlHRlBfQVRPTUlDKTsKKworCWlmIChldmVudCkKKwkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9FVkVOVF9VTFAsCisJCQkJU0NUUF9VTFBFVkVOVChldmVudCkpOworCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9ORVdfU1RBVEUsCisJCQlTQ1RQX1NUQVRFKFNDVFBfU1RBVEVfQ0xPU0VEKSk7CisKKwkvKiBTRU5EX0ZBSUxFRCBzZW50IGxhdGVyIHdoZW4gY2xlYW5pbmcgdXAgdGhlIGFzc29jaWF0aW9uLiAqLworCWFzb2MtPm91dHF1ZXVlLmVycm9yID0gZXJyb3I7CisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9ERUxFVEVfVENCLCBTQ1RQX05VTEwoKSk7Cit9CisKKy8qIFdvcmtlciByb3V0aW5lIHRvIGhhbmRsZSBTQ1RQX0NNRF9BU1NPQ19GQUlMRUQuICAqLworc3RhdGljIHZvaWQgc2N0cF9jbWRfYXNzb2NfZmFpbGVkKHNjdHBfY21kX3NlcV90ICpjb21tYW5kcywKKwkJCQkgIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSAgc2N0cF9ldmVudF90IGV2ZW50X3R5cGUsCisJCQkJICBzY3RwX3N1YnR5cGVfdCBzdWJ0eXBlLAorCQkJCSAgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLAorCQkJCSAgdW5zaWduZWQgZXJyb3IpCit7CisJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50OworCisJLyogQ2FuY2VsIGFueSBwYXJ0aWFsIGRlbGl2ZXJ5IGluIHByb2dyZXNzLiAqLworCXNjdHBfdWxwcV9hYm9ydF9wZCgmYXNvYy0+dWxwcSwgR0ZQX0FUT01JQyk7CisKKwlldmVudCA9IHNjdHBfdWxwZXZlbnRfbWFrZV9hc3NvY19jaGFuZ2UoYXNvYywgMCwgU0NUUF9DT01NX0xPU1QsCisJCQkJCQkoX191MTYpZXJyb3IsIDAsIDAsCisJCQkJCQlHRlBfQVRPTUlDKTsKKwlpZiAoZXZlbnQpCisJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfRVZFTlRfVUxQLAorCQkJCVNDVFBfVUxQRVZFTlQoZXZlbnQpKTsKKworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfTkVXX1NUQVRFLAorCQkJU0NUUF9TVEFURShTQ1RQX1NUQVRFX0NMT1NFRCkpOworCisJLyogU2V0IHNrX2VyciB0byBFQ09OTlJFU0VUIG9uIGEgMS0xIHN0eWxlIHNvY2tldC4gKi8KKwlpZiAoIXNjdHBfc3R5bGUoYXNvYy0+YmFzZS5zaywgVURQKSkKKwkJYXNvYy0+YmFzZS5zay0+c2tfZXJyID0gRUNPTk5SRVNFVDsgCisKKwkvKiBTRU5EX0ZBSUxFRCBzZW50IGxhdGVyIHdoZW4gY2xlYW5pbmcgdXAgdGhlIGFzc29jaWF0aW9uLiAqLworCWFzb2MtPm91dHF1ZXVlLmVycm9yID0gZXJyb3I7CisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9ERUxFVEVfVENCLCBTQ1RQX05VTEwoKSk7Cit9CisKKy8qIFByb2Nlc3MgYW4gaW5pdCBjaHVuayAobWF5IGJlIHJlYWwgSU5JVC9JTklULUFDSyBvciBhbiBlbWJlZGRlZCBJTklUCisgKiBpbnNpZGUgdGhlIGNvb2tpZS4gIEluIHJlYWxpdHksIHRoaXMgaXMgb25seSB1c2VkIGZvciBJTklULUFDSyBwcm9jZXNzaW5nCisgKiBzaW5jZSBhbGwgb3RoZXIgY2FzZXMgdXNlICJ0ZW1wb3JhcnkiIGFzc29jaWF0aW9ucyBhbmQgY2FuIGRvIGFsbAorICogdGhlaXIgd29yayBpbiBzdGF0ZWZ1bnMgZGlyZWN0bHkuCisgKi8KK3N0YXRpYyBpbnQgc2N0cF9jbWRfcHJvY2Vzc19pbml0KHNjdHBfY21kX3NlcV90ICpjb21tYW5kcywKKwkJCQkgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKKwkJCQkgc2N0cF9pbml0X2NodW5rX3QgKnBlZXJfaW5pdCwgaW50IGdmcCkKK3sKKwlpbnQgZXJyb3I7CisKKwkvKiBXZSBvbmx5IHByb2Nlc3MgdGhlIGluaXQgYXMgYSBzaWRlZWZmZWN0IGluIGEgc2luZ2xlCisJICogY2FzZS4gICBUaGlzIGlzIHdoZW4gd2UgcHJvY2VzcyB0aGUgSU5JVC1BQ0suICAgSWYgd2UKKwkgKiBmYWlsIGR1cmluZyBJTklUIHByb2Nlc3NpbmcgKGR1ZSB0byBtYWxsb2MgcHJvYmxlbXMpLAorCSAqIGp1c3QgcmV0dXJuIHRoZSBlcnJvciBhbmQgc3RvcCBwcm9jZXNzaW5nIHRoZSBzdGFjay4KKwkgKi8KKwlpZiAoIXNjdHBfcHJvY2Vzc19pbml0KGFzb2MsIGNodW5rLT5jaHVua19oZHItPnR5cGUsCisJCQkgICAgICAgc2N0cF9zb3VyY2UoY2h1bmspLCBwZWVyX2luaXQsIGdmcCkpCisJCWVycm9yID0gLUVOT01FTTsKKwllbHNlCisJCWVycm9yID0gMDsKKworCXJldHVybiBlcnJvcjsKK30KKworLyogSGVscGVyIGZ1bmN0aW9uIHRvIGJyZWFrIG91dCBzdGFydGluZyB1cCBvZiBoZWFydGJlYXQgdGltZXJzLiAgKi8KK3N0YXRpYyB2b2lkIHNjdHBfY21kX2hiX3RpbWVyc19zdGFydChzY3RwX2NtZF9zZXFfdCAqY21kcywKKwkJCQkgICAgIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKQoreworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisKKwkvKiBTdGFydCBhIGhlYXJ0YmVhdCB0aW1lciBmb3IgZWFjaCB0cmFuc3BvcnQgb24gdGhlIGFzc29jaWF0aW9uLgorCSAqIGhvbGQgYSByZWZlcmVuY2Ugb24gdGhlIHRyYW5zcG9ydCB0byBtYWtlIHN1cmUgbm9uZSBvZgorCSAqIHRoZSBuZWVkZWQgZGF0YSBzdHJ1Y3R1cmVzIGdvIGF3YXkuCisJICovCisJbGlzdF9mb3JfZWFjaChwb3MsICZhc29jLT5wZWVyLnRyYW5zcG9ydF9hZGRyX2xpc3QpIHsKKwkJdCA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQsIHRyYW5zcG9ydHMpOworCisJCWlmICghbW9kX3RpbWVyKCZ0LT5oYl90aW1lciwgc2N0cF90cmFuc3BvcnRfdGltZW91dCh0KSkpCisJCQlzY3RwX3RyYW5zcG9ydF9ob2xkKHQpOworCX0KK30KKworc3RhdGljIHZvaWQgc2N0cF9jbWRfaGJfdGltZXJzX3N0b3Aoc2N0cF9jbWRfc2VxX3QgKmNtZHMsCisJCQkJICAgIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKQoreworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisKKwkvKiBTdG9wIGFsbCBoZWFydGJlYXQgdGltZXJzLiAqLworCisJbGlzdF9mb3JfZWFjaChwb3MsICZhc29jLT5wZWVyLnRyYW5zcG9ydF9hZGRyX2xpc3QpIHsKKwkJdCA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQsIHRyYW5zcG9ydHMpOworCQlpZiAoZGVsX3RpbWVyKCZ0LT5oYl90aW1lcikpCisJCQlzY3RwX3RyYW5zcG9ydF9wdXQodCk7CisJfQorfQorCisvKiBIZWxwZXIgZnVuY3Rpb24gdG8gc3RvcCBhbnkgcGVuZGluZyBUMy1SVFggdGltZXJzICovCitzdGF0aWMgdm9pZCBzY3RwX2NtZF90M19ydHhfdGltZXJzX3N0b3Aoc2N0cF9jbWRfc2VxX3QgKmNtZHMsCisJCQkJICAgICAgICBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYykKK3sKKwlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnQ7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCisJbGlzdF9mb3JfZWFjaChwb3MsICZhc29jLT5wZWVyLnRyYW5zcG9ydF9hZGRyX2xpc3QpIHsKKwkJdCA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQsIHRyYW5zcG9ydHMpOworCQlpZiAodGltZXJfcGVuZGluZygmdC0+VDNfcnR4X3RpbWVyKSAmJgorCQkgICAgZGVsX3RpbWVyKCZ0LT5UM19ydHhfdGltZXIpKSB7CisJCQlzY3RwX3RyYW5zcG9ydF9wdXQodCk7CisJCX0KKwl9Cit9CisKKworLyogSGVscGVyIGZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgaGVhcnRiZWF0IHRpbWVyLiAqLworc3RhdGljIHZvaWQgc2N0cF9jbWRfaGJfdGltZXJfdXBkYXRlKHNjdHBfY21kX3NlcV90ICpjbWRzLAorCQkJCSAgICAgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJICAgICBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnQpCit7CisJLyogVXBkYXRlIHRoZSBoZWFydGJlYXQgdGltZXIuICAqLworCWlmICghbW9kX3RpbWVyKCZ0LT5oYl90aW1lciwgc2N0cF90cmFuc3BvcnRfdGltZW91dCh0KSkpCisJCXNjdHBfdHJhbnNwb3J0X2hvbGQodCk7Cit9CisKKy8qIEhlbHBlciBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHJlY2VwdGlvbiBvZiBhbiBIRUFSVEJFQVQgQUNLLiAgKi8KK3N0YXRpYyB2b2lkIHNjdHBfY21kX3RyYW5zcG9ydF9vbihzY3RwX2NtZF9zZXFfdCAqY21kcywKKwkJCQkgIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSAgc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0LAorCQkJCSAgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rKQoreworCXNjdHBfc2VuZGVyX2hiX2luZm9fdCAqaGJpbmZvOworCisJLyogOC4zIFVwb24gdGhlIHJlY2VpcHQgb2YgdGhlIEhFQVJUQkVBVCBBQ0ssIHRoZSBzZW5kZXIgb2YgdGhlCisJICogSEVBUlRCRUFUIHNob3VsZCBjbGVhciB0aGUgZXJyb3IgY291bnRlciBvZiB0aGUgZGVzdGluYXRpb24KKwkgKiB0cmFuc3BvcnQgYWRkcmVzcyB0byB3aGljaCB0aGUgSEVBUlRCRUFUIHdhcyBzZW50LgorCSAqIFRoZSBhc3NvY2lhdGlvbidzIG92ZXJhbGwgZXJyb3IgY291bnQgaXMgYWxzbyBjbGVhcmVkLgorCSAqLworCXQtPmVycm9yX2NvdW50ID0gMDsKKwl0LT5hc29jLT5vdmVyYWxsX2Vycm9yX2NvdW50ID0gMDsKKworCS8qIE1hcmsgdGhlIGRlc3RpbmF0aW9uIHRyYW5zcG9ydCBhZGRyZXNzIGFzIGFjdGl2ZSBpZiBpdCBpcyBub3Qgc28KKwkgKiBtYXJrZWQuCisJICovCisJaWYgKCF0LT5hY3RpdmUpCisJCXNjdHBfYXNzb2NfY29udHJvbF90cmFuc3BvcnQoYXNvYywgdCwgU0NUUF9UUkFOU1BPUlRfVVAsCisJCQkJCSAgICAgU0NUUF9IRUFSVEJFQVRfU1VDQ0VTUyk7CisKKwkvKiBUaGUgcmVjZWl2ZXIgb2YgdGhlIEhFQVJUQkVBVCBBQ0sgc2hvdWxkIGFsc28gcGVyZm9ybSBhbgorCSAqIFJUVCBtZWFzdXJlbWVudCBmb3IgdGhhdCBkZXN0aW5hdGlvbiB0cmFuc3BvcnQgYWRkcmVzcworCSAqIHVzaW5nIHRoZSB0aW1lIHZhbHVlIGNhcnJpZWQgaW4gdGhlIEhFQVJUQkVBVCBBQ0sgY2h1bmsuCisJICovCisJaGJpbmZvID0gKHNjdHBfc2VuZGVyX2hiX2luZm9fdCAqKSBjaHVuay0+c2tiLT5kYXRhOworCXNjdHBfdHJhbnNwb3J0X3VwZGF0ZV9ydG8odCwgKGppZmZpZXMgLSBoYmluZm8tPnNlbnRfYXQpKTsKK30KKworLyogSGVscGVyIGZ1bmN0aW9uIHRvIGRvIGEgdHJhbnNwb3J0IHJlc2V0IGF0IHRoZSBleHBpcnkgb2YgdGhlIGhlYXJiZWF0CisgKiB0aW1lci4KKyAqLworc3RhdGljIHZvaWQgc2N0cF9jbWRfdHJhbnNwb3J0X3Jlc2V0KHNjdHBfY21kX3NlcV90ICpjbWRzLAorCQkJCSAgICAgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJICAgICBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnQpCit7CisJc2N0cF90cmFuc3BvcnRfbG93ZXJfY3duZCh0LCBTQ1RQX0xPV0VSX0NXTkRfSU5BQ1RJVkUpOworCisJLyogTWFyayBvbmUgc3RyaWtlIGFnYWluc3QgYSB0cmFuc3BvcnQuICAqLworCXNjdHBfZG9fOF8yX3RyYW5zcG9ydF9zdHJpa2UoYXNvYywgdCk7Cit9CisKKy8qIEhlbHBlciBmdW5jdGlvbiB0byBwcm9jZXNzIHRoZSBwcm9jZXNzIFNBQ0sgY29tbWFuZC4gICovCitzdGF0aWMgaW50IHNjdHBfY21kX3Byb2Nlc3Nfc2FjayhzY3RwX2NtZF9zZXFfdCAqY21kcywKKwkJCQkgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJIHN0cnVjdCBzY3RwX3NhY2toZHIgKnNhY2toKQoreworCWludCBlcnI7CisKKwlpZiAoc2N0cF9vdXRxX3NhY2soJmFzb2MtPm91dHF1ZXVlLCBzYWNraCkpIHsKKwkJLyogVGhlcmUgYXJlIG5vIG1vcmUgVFNOcyBhd2FpdGluZyBTQUNLLiAgKi8KKwkJZXJyID0gc2N0cF9kb19zbShTQ1RQX0VWRU5UX1RfT1RIRVIsCisJCQkJIFNDVFBfU1RfT1RIRVIoU0NUUF9FVkVOVF9OT19QRU5ESU5HX1RTTiksCisJCQkJIGFzb2MtPnN0YXRlLCBhc29jLT5lcCwgYXNvYywgTlVMTCwKKwkJCQkgR0ZQX0FUT01JQyk7CisJfSBlbHNlIHsKKwkJLyogV2luZG93cyBtYXkgaGF2ZSBvcGVuZWQsIHNvIHdlIG5lZWQKKwkJICogdG8gY2hlY2sgaWYgd2UgaGF2ZSBEQVRBIHRvIHRyYW5zbWl0CisJCSAqLworCQllcnIgPSBzY3RwX291dHFfZmx1c2goJmFzb2MtPm91dHF1ZXVlLCAwKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBIZWxwZXIgZnVuY3Rpb24gdG8gc2V0IHRoZSB0aW1lb3V0IHZhbHVlIGZvciBUMi1TSFVURE9XTiB0aW1lciBhbmQgdG8gc2V0CisgKiB0aGUgdHJhbnNwb3J0IGZvciBhIHNodXRkb3duIGNodW5rLgorICovCitzdGF0aWMgdm9pZCBzY3RwX2NtZF9zZXR1cF90MihzY3RwX2NtZF9zZXFfdCAqY21kcywgCisJCQkgICAgICBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCSAgICAgIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaykKK3sKKwlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnQ7CisKKwl0ID0gc2N0cF9hc3NvY19jaG9vc2Vfc2h1dGRvd25fdHJhbnNwb3J0KGFzb2MpOworCWFzb2MtPnNodXRkb3duX2xhc3Rfc2VudF90byA9IHQ7CisJYXNvYy0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX1QyX1NIVVRET1dOXSA9IHQtPnJ0bzsKKwljaHVuay0+dHJhbnNwb3J0ID0gdDsKK30KKworLyogSGVscGVyIGZ1bmN0aW9uIHRvIGNoYW5nZSB0aGUgc3RhdGUgb2YgYW4gYXNzb2NpYXRpb24uICovCitzdGF0aWMgdm9pZCBzY3RwX2NtZF9uZXdfc3RhdGUoc2N0cF9jbWRfc2VxX3QgKmNtZHMsIAorCQkJICAgICAgIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJICAgICAgIHNjdHBfc3RhdGVfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBhc29jLT5iYXNlLnNrOworCisJYXNvYy0+c3RhdGUgPSBzdGF0ZTsKKworCWlmIChzY3RwX3N0eWxlKHNrLCBUQ1ApKSB7CisJCS8qIENoYW5nZSB0aGUgc2stPnNrX3N0YXRlIG9mIGEgVENQLXN0eWxlIHNvY2tldCB0aGF0IGhhcyAKKwkJICogc3VjZXNzZnVsbHkgY29tcGxldGVkIGEgY29ubmVjdCgpIGNhbGwuCisJCSAqLworCQlpZiAoc2N0cF9zdGF0ZShhc29jLCBFU1RBQkxJU0hFRCkgJiYgc2N0cF9zc3RhdGUoc2ssIENMT1NFRCkpCisJCQlzay0+c2tfc3RhdGUgPSBTQ1RQX1NTX0VTVEFCTElTSEVEOworCisJCS8qIFNldCB0aGUgUkNWX1NIVVRET1dOIGZsYWcgd2hlbiBhIFNIVVRET1dOIGlzIHJlY2VpdmVkLiAqLworCQlpZiAoc2N0cF9zdGF0ZShhc29jLCBTSFVURE9XTl9SRUNFSVZFRCkgJiYKKwkJICAgIHNjdHBfc3N0YXRlKHNrLCBFU1RBQkxJU0hFRCkpCisJCQlzay0+c2tfc2h1dGRvd24gfD0gUkNWX1NIVVRET1dOOworCX0KKworCWlmIChzY3RwX3N0YXRlKGFzb2MsIEVTVEFCTElTSEVEKSB8fAorCSAgICBzY3RwX3N0YXRlKGFzb2MsIENMT1NFRCkgfHwKKwkgICAgc2N0cF9zdGF0ZShhc29jLCBTSFVURE9XTl9SRUNFSVZFRCkpIHsKKwkJLyogV2FrZSB1cCBhbnkgcHJvY2Vzc2VzIHdhaXRpbmcgaW4gdGhlIGFzb2MncyB3YWl0IHF1ZXVlIGluCisJCSAqIHNjdHBfd2FpdF9mb3JfY29ubmVjdCgpIG9yIHNjdHBfd2FpdF9mb3Jfc25kYnVmKCkuCisJIAkgKi8KKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmFzb2MtPndhaXQpKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZhc29jLT53YWl0KTsKKworCQkvKiBXYWtlIHVwIGFueSBwcm9jZXNzZXMgd2FpdGluZyBpbiB0aGUgc2sncyBzbGVlcCBxdWV1ZSBvZgorCQkgKiBhIFRDUC1zdHlsZSBvciBVRFAtc3R5bGUgcGVlbGVkLW9mZiBzb2NrZXQgaW4KKwkJICogc2N0cF93YWl0X2Zvcl9hY2NlcHQoKSBvciBzY3RwX3dhaXRfZm9yX3BhY2tldCgpLgorCQkgKiBGb3IgYSBVRFAtc3R5bGUgc29ja2V0LCB0aGUgd2FpdGVycyBhcmUgd29rZW4gdXAgYnkgdGhlCisJCSAqIG5vdGlmaWNhdGlvbnMuCisJCSAqLworCQlpZiAoIXNjdHBfc3R5bGUoc2ssIFVEUCkpCisJCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKKwl9Cit9CisKKy8qIEhlbHBlciBmdW5jdGlvbiB0byBkZWxldGUgYW4gYXNzb2NpYXRpb24uICovCitzdGF0aWMgdm9pZCBzY3RwX2NtZF9kZWxldGVfdGNiKHNjdHBfY21kX3NlcV90ICpjbWRzLAorCQkJCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKQoreworCXN0cnVjdCBzb2NrICpzayA9IGFzb2MtPmJhc2Uuc2s7CisKKwkvKiBJZiBpdCBpcyBhIG5vbi10ZW1wb3JhcnkgYXNzb2NpYXRpb24gYmVsb25naW5nIHRvIGEgVENQLXN0eWxlCisJICogbGlzdGVuaW5nIHNvY2tldCB0aGF0IGlzIG5vdCBjbG9zZWQsIGRvIG5vdCBmcmVlIGl0IHNvIHRoYXQgYWNjZXB0KCkgCisJICogY2FuIHBpY2sgaXQgdXAgbGF0ZXIuCisJICovIAorCWlmIChzY3RwX3N0eWxlKHNrLCBUQ1ApICYmIHNjdHBfc3N0YXRlKHNrLCBMSVNURU5JTkcpICYmCisJICAgICghYXNvYy0+dGVtcCkgJiYgKHNrLT5za19zaHV0ZG93biAhPSBTSFVURE9XTl9NQVNLKSkKKwkJcmV0dXJuOworCisJc2N0cF91bmhhc2hfZXN0YWJsaXNoZWQoYXNvYyk7CisJc2N0cF9hc3NvY2lhdGlvbl9mcmVlKGFzb2MpOworfQorCisvKgorICogQURESVAgU2VjdGlvbiA0LjEgQVNDT05GIENodW5rIFByb2NlZHVyZXMKKyAqIEE0KSBTdGFydCBhIFQtNCBSVE8gdGltZXIsIHVzaW5nIHRoZSBSVE8gdmFsdWUgb2YgdGhlIHNlbGVjdGVkCisgKiBkZXN0aW5hdGlvbiBhZGRyZXNzICh3ZSB1c2UgYWN0aXZlIHBhdGggaW5zdGVhZCBvZiBwcmltYXJ5IHBhdGgganVzdAorICogYmVjYXVzZSBwcmltYXJ5IHBhdGggbWF5IGJlIGluYWN0aXZlLiAKKyAqLworc3RhdGljIHZvaWQgc2N0cF9jbWRfc2V0dXBfdDQoc2N0cF9jbWRfc2VxX3QgKmNtZHMsCisJCQkJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rKQoreworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdDsKKworCXQgPSBhc29jLT5wZWVyLmFjdGl2ZV9wYXRoOworCWFzb2MtPnRpbWVvdXRzW1NDVFBfRVZFTlRfVElNRU9VVF9UNF9SVE9dID0gdC0+cnRvOworCWNodW5rLT50cmFuc3BvcnQgPSB0OworfQorCisvKiBQcm9jZXNzIGFuIGluY29taW5nIE9wZXJhdGlvbiBFcnJvciBDaHVuay4gKi8gCitzdGF0aWMgdm9pZCBzY3RwX2NtZF9wcm9jZXNzX29wZXJyKHNjdHBfY21kX3NlcV90ICpjbWRzLAorCQkJCSAgIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSAgIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaykKK3sKKwlzdHJ1Y3Qgc2N0cF9vcGVycl9jaHVuayAqb3BlcnJfY2h1bms7CisJc3RydWN0IHNjdHBfZXJyaGRyICplcnJfaGRyOworCisJb3BlcnJfY2h1bmsgPSAoc3RydWN0IHNjdHBfb3BlcnJfY2h1bmsgKiljaHVuay0+Y2h1bmtfaGRyOworCWVycl9oZHIgPSAmb3BlcnJfY2h1bmstPmVycl9oZHI7CisKKwlzd2l0Y2ggKGVycl9oZHItPmNhdXNlKSB7CisJY2FzZSBTQ1RQX0VSUk9SX1VOS05PV05fQ0hVTks6CisJeworCQlzdHJ1Y3Qgc2N0cF9jaHVua2hkciAqdW5rX2NodW5rX2hkcjsKKworCQl1bmtfY2h1bmtfaGRyID0gKHN0cnVjdCBzY3RwX2NodW5raGRyICopZXJyX2hkci0+dmFyaWFibGU7CisJCXN3aXRjaCAodW5rX2NodW5rX2hkci0+dHlwZSkgeworCQkvKiBBRERJUCA0LjEgQTkpIElmIHRoZSBwZWVyIHJlc3BvbmRzIHRvIGFuIEFTQ09ORiB3aXRoIGFuCisJCSAqIEVSUk9SIGNodW5rIHJlcG9ydGluZyB0aGF0IGl0IGRpZCBub3QgcmVjb2duaXplZCB0aGUgQVNDT05GCisJCSAqIGNodW5rIHR5cGUsIHRoZSBzZW5kZXIgb2YgdGhlIEFTQ09ORiBNVVNUIE5PVCBzZW5kIGFueQorCQkgKiBmdXJ0aGVyIEFTQ09ORiBjaHVua3MgYW5kIE1VU1Qgc3RvcCBpdHMgVC00IHRpbWVyLgorCQkgKi8KKwkJY2FzZSBTQ1RQX0NJRF9BU0NPTkY6CisJCQlhc29jLT5wZWVyLmFzY29uZl9jYXBhYmxlID0gMDsKKwkJCXNjdHBfYWRkX2NtZF9zZihjbWRzLCBTQ1RQX0NNRF9USU1FUl9TVE9QLAorCQkJCQlTQ1RQX1RPKFNDVFBfRVZFTlRfVElNRU9VVF9UNF9SVE8pKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworLyogUHJvY2VzcyB2YXJpYWJsZSBGV0RUU04gY2h1bmsgaW5mb3JtYXRpb24uICovCitzdGF0aWMgdm9pZCBzY3RwX2NtZF9wcm9jZXNzX2Z3ZHRzbihzdHJ1Y3Qgc2N0cF91bHBxICp1bHBxLCAKKwkJCQkgICAgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rKQoreworCXN0cnVjdCBzY3RwX2Z3ZHRzbl9za2lwICpza2lwOworCS8qIFdhbGsgdGhyb3VnaCBhbGwgdGhlIHNraXBwZWQgU1NOcyAqLworCXNjdHBfd2Fsa19md2R0c24oc2tpcCwgY2h1bmspIHsKKwkJc2N0cF91bHBxX3NraXAodWxwcSwgbnRvaHMoc2tpcC0+c3RyZWFtKSwgbnRvaHMoc2tpcC0+c3NuKSk7CisJfQorCisJcmV0dXJuOworfQorCisvKiBIZWxwZXIgZnVuY3Rpb24gdG8gcmVtb3ZlIHRoZSBhc3NvY2lhdGlvbiBub24tcHJpbWFyeSBwZWVyIAorICogdHJhbnNwb3J0cy4KKyAqLyAKK3N0YXRpYyB2b2lkIHNjdHBfY21kX2RlbF9ub25fcHJpbWFyeShzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYykKK3sKKwlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnQ7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCXN0cnVjdCBsaXN0X2hlYWQgKnRlbXA7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCB0ZW1wLCAmYXNvYy0+cGVlci50cmFuc3BvcnRfYWRkcl9saXN0KSB7CisJCXQgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHNjdHBfdHJhbnNwb3J0LCB0cmFuc3BvcnRzKTsKKwkJaWYgKCFzY3RwX2NtcF9hZGRyX2V4YWN0KCZ0LT5pcGFkZHIsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAmYXNvYy0+cGVlci5wcmltYXJ5X2FkZHIpKSB7CisJCQlzY3RwX2Fzc29jX2RlbF9wZWVyKGFzb2MsICZ0LT5pcGFkZHIpOworCQl9CisJfQorCisJcmV0dXJuOworfQorCisvKiBUaGVzZSB0aHJlZSBtYWNyb3MgYWxsb3cgdXMgdG8gcHVsbCB0aGUgZGVidWdnaW5nIGNvZGUgb3V0IG9mIHRoZQorICogbWFpbiBmbG93IG9mIHNjdHBfZG9fc20oKSB0byBrZWVwIGF0dGVudGlvbiBmb2N1c2VkIG9uIHRoZSByZWFsCisgKiBmdW5jdGlvbmFsaXR5IHRoZXJlLgorICovCisjZGVmaW5lIERFQlVHX1BSRSBcCisJU0NUUF9ERUJVR19QUklOVEsoInNjdHBfZG9fc20gcHJlZm46ICIgXAorCQkJICAiZXAgJXAsICVzLCAlcywgYXNvYyAlcFslc10sICVzXG4iLCBcCisJCQkgIGVwLCBzY3RwX2V2dHR5cGVfdGJsW2V2ZW50X3R5cGVdLCBcCisJCQkgICgqZGVidWdfZm4pKHN1YnR5cGUpLCBhc29jLCBcCisJCQkgIHNjdHBfc3RhdGVfdGJsW3N0YXRlXSwgc3RhdGVfZm4tPm5hbWUpCisKKyNkZWZpbmUgREVCVUdfUE9TVCBcCisJU0NUUF9ERUJVR19QUklOVEsoInNjdHBfZG9fc20gcG9zdGZuOiAiIFwKKwkJCSAgImFzb2MgJXAsIHN0YXR1czogJXNcbiIsIFwKKwkJCSAgYXNvYywgc2N0cF9zdGF0dXNfdGJsW3N0YXR1c10pCisKKyNkZWZpbmUgREVCVUdfUE9TVF9TRlggXAorCVNDVFBfREVCVUdfUFJJTlRLKCJzY3RwX2RvX3NtIHBvc3Qgc2Z4OiBlcnJvciAlZCwgYXNvYyAlcFslc11cbiIsIFwKKwkJCSAgZXJyb3IsIGFzb2MsIFwKKwkJCSAgc2N0cF9zdGF0ZV90YmxbKGFzb2MgJiYgc2N0cF9pZDJhc3NvYyhlcC0+YmFzZS5zaywgXAorCQkJICBzY3RwX2Fzc29jMmlkKGFzb2MpKSk/YXNvYy0+c3RhdGU6U0NUUF9TVEFURV9DTE9TRURdKQorCisvKgorICogVGhpcyBpcyB0aGUgbWFzdGVyIHN0YXRlIG1hY2hpbmUgcHJvY2Vzc2luZyBmdW5jdGlvbi4KKyAqCisgKiBJZiB5b3Ugd2FudCB0byB1bmRlcnN0YW5kIGFsbCBvZiBsa3NjdHAsIHRoaXMgaXMgYQorICogZ29vZCBwbGFjZSB0byBzdGFydC4KKyAqLworaW50IHNjdHBfZG9fc20oc2N0cF9ldmVudF90IGV2ZW50X3R5cGUsIHNjdHBfc3VidHlwZV90IHN1YnR5cGUsCisJICAgICAgIHNjdHBfc3RhdGVfdCBzdGF0ZSwKKwkgICAgICAgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCSAgICAgICBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkgICAgICAgdm9pZCAqZXZlbnRfYXJnLAorCSAgICAgICBpbnQgZ2ZwKQoreworCXNjdHBfY21kX3NlcV90IGNvbW1hbmRzOworCWNvbnN0IHNjdHBfc21fdGFibGVfZW50cnlfdCAqc3RhdGVfZm47CisJc2N0cF9kaXNwb3NpdGlvbl90IHN0YXR1czsKKwlpbnQgZXJyb3IgPSAwOworCXR5cGVkZWYgY29uc3QgY2hhciAqKHByaW50Zm5fdCkoc2N0cF9zdWJ0eXBlX3QpOworCisJc3RhdGljIHByaW50Zm5fdCAqdGFibGVbXSA9IHsKKwkJTlVMTCwgc2N0cF9jbmFtZSwgc2N0cF90bmFtZSwgc2N0cF9vbmFtZSwgc2N0cF9wbmFtZSwKKwl9OworCXByaW50Zm5fdCAqZGVidWdfZm4gIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSA9IHRhYmxlW2V2ZW50X3R5cGVdOworCisJLyogTG9vayB1cCB0aGUgc3RhdGUgZnVuY3Rpb24sIHJ1biBpdCwgYW5kIHRoZW4gcHJvY2VzcyB0aGUKKwkgKiBzaWRlIGVmZmVjdHMuICBUaGVzZSB0aHJlZSBzdGVwcyBhcmUgdGhlIGhlYXJ0IG9mIGxrc2N0cC4KKwkgKi8KKwlzdGF0ZV9mbiA9IHNjdHBfc21fbG9va3VwX2V2ZW50KGV2ZW50X3R5cGUsIHN0YXRlLCBzdWJ0eXBlKTsKKworCXNjdHBfaW5pdF9jbWRfc2VxKCZjb21tYW5kcyk7CisKKwlERUJVR19QUkU7CisJc3RhdHVzID0gKCpzdGF0ZV9mbi0+Zm4pKGVwLCBhc29jLCBzdWJ0eXBlLCBldmVudF9hcmcsICZjb21tYW5kcyk7CisJREVCVUdfUE9TVDsKKworCWVycm9yID0gc2N0cF9zaWRlX2VmZmVjdHMoZXZlbnRfdHlwZSwgc3VidHlwZSwgc3RhdGUsCisJCQkJICBlcCwgYXNvYywgZXZlbnRfYXJnLCBzdGF0dXMsIAorCQkJCSAgJmNvbW1hbmRzLCBnZnApOworCURFQlVHX1BPU1RfU0ZYOworCisJcmV0dXJuIGVycm9yOworfQorCisjdW5kZWYgREVCVUdfUFJFCisjdW5kZWYgREVCVUdfUE9TVAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoaXMgdGhlIG1hc3RlciBzdGF0ZSBmdW5jdGlvbiBzaWRlIGVmZmVjdCBwcm9jZXNzaW5nIGZ1bmN0aW9uLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBzY3RwX3NpZGVfZWZmZWN0cyhzY3RwX2V2ZW50X3QgZXZlbnRfdHlwZSwgc2N0cF9zdWJ0eXBlX3Qgc3VidHlwZSwKKwkJCSAgICAgc2N0cF9zdGF0ZV90IHN0YXRlLAorCQkJICAgICBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkgICAgIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJICAgICB2b2lkICpldmVudF9hcmcsCisJCQkgICAgIHNjdHBfZGlzcG9zaXRpb25fdCBzdGF0dXMsCisJCQkgICAgIHNjdHBfY21kX3NlcV90ICpjb21tYW5kcywKKwkJCSAgICAgaW50IGdmcCkKK3sKKwlpbnQgZXJyb3I7CisKKwkvKiBGSVhNRSAtIE1vc3Qgb2YgdGhlIGRpc3Bvc2l0aW9ucyBsZWZ0IHRvZGF5IHdvdWxkIGJlIGNhdGVnb3JpemVkCisJICogYXMgImV4Y2VwdGlvbmFsIiBkaXNwb3NpdGlvbnMuICBGb3IgdGhvc2UgZGlzcG9zaXRpb25zLCBpdAorCSAqIG1heSBub3QgYmUgcHJvcGVyIHRvIHJ1biB0aHJvdWdoIGFueSBvZiB0aGUgY29tbWFuZHMgYXQgYWxsLgorCSAqIEZvciBleGFtcGxlLCB0aGUgY29tbWFuZCBpbnRlcnByZXRlciBtaWdodCBiZSBydW4gb25seSB3aXRoCisJICogZGlzcG9zaXRpb24gU0NUUF9ESVNQT1NJVElPTl9DT05TVU1FLgorCSAqLworCWlmICgwICE9IChlcnJvciA9IHNjdHBfY21kX2ludGVycHJldGVyKGV2ZW50X3R5cGUsIHN1YnR5cGUsIHN0YXRlLAorCQkJCQkgICAgICAgZXAsIGFzb2MsCisJCQkJCSAgICAgICBldmVudF9hcmcsIHN0YXR1cywKKwkJCQkJICAgICAgIGNvbW1hbmRzLCBnZnApKSkKKwkJZ290byBiYWlsOworCisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIFNDVFBfRElTUE9TSVRJT05fRElTQ0FSRDoKKwkJU0NUUF9ERUJVR19QUklOVEsoIklnbm9yZWQgc2N0cCBwcm90b2NvbCBldmVudCAtIHN0YXRlICVkLCAiCisJCQkJICAiZXZlbnRfdHlwZSAlZCwgZXZlbnRfaWQgJWRcbiIsCisJCQkJICBzdGF0ZSwgZXZlbnRfdHlwZSwgc3VidHlwZS5jaHVuayk7CisJCWJyZWFrOworCisJY2FzZSBTQ1RQX0RJU1BPU0lUSU9OX05PTUVNOgorCQkvKiBXZSByYW4gb3V0IG9mIG1lbW9yeSwgc28gd2UgbmVlZCB0byBkaXNjYXJkIHRoaXMKKwkJICogcGFja2V0LgorCQkgKi8KKwkJLyogQlVHLS13ZSBzaG91bGQgbm93IHJlY292ZXIgc29tZSBtZW1vcnksIHByb2JhYmx5IGJ5CisJCSAqIHJlbmVnaW5nLi4uCisJCSAqLworCQllcnJvciA9IC1FTk9NRU07CisJCWJyZWFrOworCisgICAgICAgIGNhc2UgU0NUUF9ESVNQT1NJVElPTl9ERUxFVEVfVENCOgorCQkvKiBUaGlzIHNob3VsZCBub3cgYmUgYSBjb21tYW5kLiAqLworCQlicmVhazsKKworCWNhc2UgU0NUUF9ESVNQT1NJVElPTl9DT05TVU1FOgorCWNhc2UgU0NUUF9ESVNQT1NJVElPTl9BQk9SVDoKKwkJLyoKKwkJICogV2Ugc2hvdWxkIG5vIGxvbmdlciBoYXZlIG11Y2ggd29yayB0byBkbyBoZXJlIGFzIHRoZQorCQkgKiByZWFsIHdvcmsgaGFzIGJlZW4gZG9uZSBhcyBleHBsaWNpdCBjb21tYW5kcyBhYm92ZS4KKwkJICovCisJCWJyZWFrOworCisJY2FzZSBTQ1RQX0RJU1BPU0lUSU9OX1ZJT0xBVElPTjoKKwkJcHJpbnRrKEtFUk5fRVJSICJzY3RwIHByb3RvY29sIHZpb2xhdGlvbiBzdGF0ZSAlZCAiCisJCSAgICAgICAiY2h1bmtpZCAlZFxuIiwgc3RhdGUsIHN1YnR5cGUuY2h1bmspOworCQlicmVhazsKKworCWNhc2UgU0NUUF9ESVNQT1NJVElPTl9OT1RfSU1QTDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2N0cCB1bmltcGxlbWVudGVkIGZlYXR1cmUgaW4gc3RhdGUgJWQsICIKKwkJICAgICAgICJldmVudF90eXBlICVkLCBldmVudF9pZCAlZFxuIiwKKwkJICAgICAgIHN0YXRlLCBldmVudF90eXBlLCBzdWJ0eXBlLmNodW5rKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDVFBfRElTUE9TSVRJT05fQlVHOgorCQlwcmludGsoS0VSTl9FUlIgInNjdHAgYnVnIGluIHN0YXRlICVkLCAiCisJCSAgICAgICAiZXZlbnRfdHlwZSAlZCwgZXZlbnRfaWQgJWRcbiIsCisJCSAgICAgICBzdGF0ZSwgZXZlbnRfdHlwZSwgc3VidHlwZS5jaHVuayk7CisJCUJVRygpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAic2N0cCBpbXBvc3NpYmxlIGRpc3Bvc2l0aW9uICVkICIKKwkJICAgICAgICJpbiBzdGF0ZSAlZCwgZXZlbnRfdHlwZSAlZCwgZXZlbnRfaWQgJWRcbiIsCisJCSAgICAgICBzdGF0dXMsIHN0YXRlLCBldmVudF90eXBlLCBzdWJ0eXBlLmNodW5rKTsKKwkJQlVHKCk7CisJCWJyZWFrOworCX07CisKK2JhaWw6CisJcmV0dXJuIGVycm9yOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIDJuZCBMZXZlbCBBYnN0cmFjdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhpcyBpcyB0aGUgc2lkZS1lZmZlY3QgaW50ZXJwcmV0ZXIuICAqLworc3RhdGljIGludCBzY3RwX2NtZF9pbnRlcnByZXRlcihzY3RwX2V2ZW50X3QgZXZlbnRfdHlwZSwKKwkJCQlzY3RwX3N1YnR5cGVfdCBzdWJ0eXBlLAorCQkJCXNjdHBfc3RhdGVfdCBzdGF0ZSwKKwkJCQlzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJdm9pZCAqZXZlbnRfYXJnLAorCQkJIAlzY3RwX2Rpc3Bvc2l0aW9uX3Qgc3RhdHVzLAorCQkJCXNjdHBfY21kX3NlcV90ICpjb21tYW5kcywKKwkJCQlpbnQgZ2ZwKQoreworCWludCBlcnJvciA9IDA7CisJaW50IGZvcmNlOworCXNjdHBfY21kX3QgKmNtZDsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqbmV3X29iajsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmsgPSBOVUxMOworCXN0cnVjdCBzY3RwX3BhY2tldCAqcGFja2V0OworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwlzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXI7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdDsKKwlzdHJ1Y3Qgc2N0cF9zYWNraGRyIHNhY2toOworCWludCBsb2NhbF9jb3JrID0gMDsKKworCWlmIChTQ1RQX0VWRU5UX1RfVElNRU9VVCAhPSBldmVudF90eXBlKQorCQljaHVuayA9IChzdHJ1Y3Qgc2N0cF9jaHVuayAqKSBldmVudF9hcmc7CisKKwkvKiBOb3RlOiAgVGhpcyB3aG9sZSBmaWxlIGlzIGEgaHVnZSBjYW5kaWRhdGUgZm9yIHJld29yay4KKwkgKiBGb3IgZXhhbXBsZSwgZWFjaCBjb21tYW5kIGNvdWxkIGVpdGhlciBoYXZlIGl0cyBvd24gaGFuZGxlciwgc28KKwkgKiB0aGUgbG9vcCB3b3VsZCBsb29rIGxpa2U6CisJICogICAgIHdoaWxlIChjbWRzKQorCSAqICAgICAgICAgY21kLT5oYW5kbGUoeCwgeSwgeikKKwkgKiAtLWpncmltbQorCSAqLworCXdoaWxlIChOVUxMICE9IChjbWQgPSBzY3RwX25leHRfY21kKGNvbW1hbmRzKSkpIHsKKwkJc3dpdGNoIChjbWQtPnZlcmIpIHsKKwkJY2FzZSBTQ1RQX0NNRF9OT1A6CisJCQkvKiBEbyBub3RoaW5nLiAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1RQX0NNRF9ORVdfQVNPQzoKKwkJCS8qIFJlZ2lzdGVyIGEgbmV3IGFzc29jaWF0aW9uLiAgKi8KKwkJCWlmIChsb2NhbF9jb3JrKSB7CisJCQkJc2N0cF9vdXRxX3VuY29yaygmYXNvYy0+b3V0cXVldWUpOyAKKwkJCQlsb2NhbF9jb3JrID0gMDsKKwkJCX0KKwkJCWFzb2MgPSBjbWQtPm9iai5wdHI7CisJCQkvKiBSZWdpc3RlciB3aXRoIHRoZSBlbmRwb2ludC4gICovCisJCQlzY3RwX2VuZHBvaW50X2FkZF9hc29jKGVwLCBhc29jKTsKKwkJCXNjdHBfaGFzaF9lc3RhYmxpc2hlZChhc29jKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NUUF9DTURfVVBEQVRFX0FTU09DOgorCQkgICAgICAgc2N0cF9hc3NvY191cGRhdGUoYXNvYywgY21kLT5vYmoucHRyKTsKKwkJICAgICAgIGJyZWFrOworCisJCWNhc2UgU0NUUF9DTURfUFVSR0VfT1VUUVVFVUU6CisJCSAgICAgICBzY3RwX291dHFfdGVhcmRvd24oJmFzb2MtPm91dHF1ZXVlKTsKKwkJICAgICAgIGJyZWFrOworCisJCWNhc2UgU0NUUF9DTURfREVMRVRFX1RDQjoJCQkKKwkJCWlmIChsb2NhbF9jb3JrKSB7CisJCQkJc2N0cF9vdXRxX3VuY29yaygmYXNvYy0+b3V0cXVldWUpOworCQkJCWxvY2FsX2NvcmsgPSAwOworCQkJfQorCQkJLyogRGVsZXRlIHRoZSBjdXJyZW50IGFzc29jaWF0aW9uLiAgKi8KKwkJCXNjdHBfY21kX2RlbGV0ZV90Y2IoY29tbWFuZHMsIGFzb2MpOworCQkJYXNvYyA9IE5VTEw7CisJCQlicmVhazsKKworCQljYXNlIFNDVFBfQ01EX05FV19TVEFURToKKwkJCS8qIEVudGVyIGEgbmV3IHN0YXRlLiAgKi8KKwkJCXNjdHBfY21kX25ld19zdGF0ZShjb21tYW5kcywgYXNvYywgY21kLT5vYmouc3RhdGUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1RQX0NNRF9SRVBPUlRfVFNOOgorCQkJLyogUmVjb3JkIHRoZSBhcnJpdmFsIG9mIGEgVFNOLiAgKi8KKwkJCXNjdHBfdHNubWFwX21hcmsoJmFzb2MtPnBlZXIudHNuX21hcCwgY21kLT5vYmoudTMyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NUUF9DTURfUkVQT1JUX0ZXRFRTTjoKKwkJCS8qIE1vdmUgdGhlIEN1bXVsYXR0aXZlIFRTTiBBY2sgYWhlYWQuICovCisJCQlzY3RwX3Rzbm1hcF9za2lwKCZhc29jLT5wZWVyLnRzbl9tYXAsIGNtZC0+b2JqLnUzMik7CisKKwkJCS8qIEFib3J0IGFueSBpbiBwcm9ncmVzcyBwYXJ0aWFsIGRlbGl2ZXJ5LiAqLworCQkJc2N0cF91bHBxX2Fib3J0X3BkKCZhc29jLT51bHBxLCBHRlBfQVRPTUlDKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NUUF9DTURfUFJPQ0VTU19GV0RUU046CisJCQlzY3RwX2NtZF9wcm9jZXNzX2Z3ZHRzbigmYXNvYy0+dWxwcSwgY21kLT5vYmoucHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisJCWNhc2UgU0NUUF9DTURfR0VOX1NBQ0s6CisJCQkvKiBHZW5lcmF0ZSBhIFNlbGVjdGl2ZSBBQ0suCisJCQkgKiBUaGUgYXJndW1lbnQgdGVsbHMgdXMgd2hldGhlciB0byBqdXN0IGNvdW50CisJCQkgKiB0aGUgcGFja2V0IGFuZCBNQVlCRSBnZW5lcmF0ZSBhIFNBQ0ssIG9yCisJCQkgKiBmb3JjZSBhIFNBQ0sgb3V0LgorCQkJICovCisJCQlmb3JjZSA9IGNtZC0+b2JqLmkzMjsKKwkJCWVycm9yID0gc2N0cF9nZW5fc2Fjayhhc29jLCBmb3JjZSwgY29tbWFuZHMpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1RQX0NNRF9QUk9DRVNTX1NBQ0s6CisJCQkvKiBQcm9jZXNzIGFuIGluYm91bmQgU0FDSy4gICovCisJCQllcnJvciA9IHNjdHBfY21kX3Byb2Nlc3Nfc2Fjayhjb21tYW5kcywgYXNvYywKKwkJCQkJCSAgICAgIGNtZC0+b2JqLnB0cik7CisJCQlicmVhazsKKworCQljYXNlIFNDVFBfQ01EX0dFTl9JTklUX0FDSzoKKwkJCS8qIEdlbmVyYXRlIGFuIElOSVQgQUNLIGNodW5rLiAgKi8KKwkJCW5ld19vYmogPSBzY3RwX21ha2VfaW5pdF9hY2soYXNvYywgY2h1bmssIEdGUF9BVE9NSUMsCisJCQkJCQkgICAgIDApOworCQkJaWYgKCFuZXdfb2JqKQorCQkJCWdvdG8gbm9tZW07CisKKwkJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUkVQTFksCisJCQkJCVNDVFBfQ0hVTksobmV3X29iaikpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1RQX0NNRF9QRUVSX0lOSVQ6CisJCQkvKiBQcm9jZXNzIGEgdW5pZmllZCBJTklUIGZyb20gdGhlIHBlZXIuCisJCQkgKiBOb3RlOiBPbmx5IHVzZWQgZHVyaW5nIElOSVQtQUNLIHByb2Nlc3NpbmcuICBJZgorCQkJICogdGhlcmUgaXMgYW4gZXJyb3IganVzdCByZXR1cm4gdG8gdGhlIG91dHRlcgorCQkJICogbGF5ZXIgd2hpY2ggd2lsbCBiYWlsLgorCQkJICovCisJCQllcnJvciA9IHNjdHBfY21kX3Byb2Nlc3NfaW5pdChjb21tYW5kcywgYXNvYywgY2h1bmssCisJCQkJCQkgICAgICBjbWQtPm9iai5wdHIsIGdmcCk7CisJCQlicmVhazsKKworCQljYXNlIFNDVFBfQ01EX0dFTl9DT09LSUVfRUNITzoKKwkJCS8qIEdlbmVyYXRlIGEgQ09PS0lFIEVDSE8gY2h1bmsuICAqLworCQkJbmV3X29iaiA9IHNjdHBfbWFrZV9jb29raWVfZWNobyhhc29jLCBjaHVuayk7CisJCQlpZiAoIW5ld19vYmopIHsKKwkJCQlpZiAoY21kLT5vYmoucHRyKQorCQkJCQlzY3RwX2NodW5rX2ZyZWUoY21kLT5vYmoucHRyKTsKKwkJCQlnb3RvIG5vbWVtOworCQkJfQorCQkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9SRVBMWSwKKwkJCQkJU0NUUF9DSFVOSyhuZXdfb2JqKSk7CisKKwkJCS8qIElmIHRoZXJlIGlzIGFuIEVSUk9SIGNodW5rIHRvIGJlIHNlbnQgYWxvbmcgd2l0aAorCQkJICogdGhlIENPT0tJRV9FQ0hPLCBzZW5kIGl0LCB0b28uCisJCQkgKi8KKwkJCWlmIChjbWQtPm9iai5wdHIpCisJCQkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9SRVBMWSwKKwkJCQkJCVNDVFBfQ0hVTksoY21kLT5vYmoucHRyKSk7CisKKwkJCS8qIEZJWE1FIC0gRXZlbnR1YWxseSBjb21lIHVwIHdpdGggYSBjbGVhbmVyIHdheSB0bworCQkJICogZW5hYmxpbmcgQ09PS0lFLUVDSE8gKyBEQVRBIGJ1bmRsaW5nIGR1cmluZyAKKwkJCSAqIG11bHRpaG9taW5nIHN0YWxlIGNvb2tpZSBzY2VuYXJpb3MsIHRoZSBmb2xsb3dpbmcgCisJCQkgKiBjb21tYW5kIHBsYXlzIHdpdGggYXNvYy0+cGVlci5yZXRyYW5fcGF0aCB0byAKKwkJCSAqIGF2b2lkIHRoZSBwcm9ibGVtIG9mIHNlbmRpbmcgdGhlIENPT0tJRS1FQ0hPIGFuZCAKKwkJCSAqIERBVEEgaW4gZGlmZmVyZW50IHBhdGhzLCB3aGljaCBjb3VsZCByZXN1bHQgCisJCQkgKiBpbiB0aGUgYXNzb2NpYXRpb24gYmVpbmcgQUJPUlRlZCBpZiB0aGUgREFUQSBjaHVuayAKKwkJCSAqIGlzIHByb2Nlc3NlZCBmaXJzdCBieSB0aGUgc2VydmVyLiAgQ2hlY2tpbmcgdGhlCisJCQkgKiBpbml0IGVycm9yIGNvdW50ZXIgc2ltcGx5IGNhdXNlcyB0aGlzIGNvbW1hbmQKKwkJCSAqIHRvIGJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIGZhaWxlZCBhdHRlbXB0cyBvZgorCQkJICogYXNzb2NpYXRpb24gZXN0YWJsaXNobWVudC4KKwkJCSAqLworCQkJaWYgKChhc29jLT5wZWVyLnJldHJhbl9wYXRoICE9IAorCQkJICAgICBhc29jLT5wZWVyLnByaW1hcnlfcGF0aCkgJiYgCisJCQkgICAgKGFzb2MtPmNvdW50ZXJzW1NDVFBfQ09VTlRFUl9JTklUX0VSUk9SXSA+IDApKSB7CisJCQkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCAKKwkJCQkgICAgICAgICAgICAgICAgU0NUUF9DTURfRk9SQ0VfUFJJTV9SRVRSQU4sCisJCQkJCQlTQ1RQX05VTEwoKSk7CisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgU0NUUF9DTURfR0VOX1NIVVRET1dOOgorCQkJLyogR2VuZXJhdGUgU0hVVERPV04gd2hlbiBpbiBTSFVURE9XTl9TRU5UIHN0YXRlLgorCQkJICogUmVzZXQgZXJyb3IgY291bnRzLgorCQkJICovCisJCQlhc29jLT5vdmVyYWxsX2Vycm9yX2NvdW50ID0gMDsKKworCQkJLyogR2VuZXJhdGUgYSBTSFVURE9XTiBjaHVuay4gICovCisJCQluZXdfb2JqID0gc2N0cF9tYWtlX3NodXRkb3duKGFzb2MsIGNodW5rKTsKKwkJCWlmICghbmV3X29iaikKKwkJCQlnb3RvIG5vbWVtOworCQkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9SRVBMWSwKKwkJCQkJU0NUUF9DSFVOSyhuZXdfb2JqKSk7CisJCQlicmVhazsKKworCQljYXNlIFNDVFBfQ01EX0NIVU5LX1VMUDoKKwkJCS8qIFNlbmQgYSBjaHVuayB0byB0aGUgc29ja2V0cyBsYXllci4gICovCisJCQlTQ1RQX0RFQlVHX1BSSU5USygic21fc2lkZWZmOiAlcyAlcCwgJXMgJXAuXG4iLAorCQkJCQkgICJjaHVua191cDoiLCBjbWQtPm9iai5wdHIsCisJCQkJCSAgInVscHE6IiwgJmFzb2MtPnVscHEpOworCQkJc2N0cF91bHBxX3RhaWxfZGF0YSgmYXNvYy0+dWxwcSwgY21kLT5vYmoucHRyLAorCQkJCQkgICAgR0ZQX0FUT01JQyk7CisJCQlicmVhazsKKworCQljYXNlIFNDVFBfQ01EX0VWRU5UX1VMUDoKKwkJCS8qIFNlbmQgYSBub3RpZmljYXRpb24gdG8gdGhlIHNvY2tldHMgbGF5ZXIuICAqLworCQkJU0NUUF9ERUJVR19QUklOVEsoInNtX3NpZGVmZjogJXMgJXAsICVzICVwLlxuIiwKKwkJCQkJICAiZXZlbnRfdXA6IixjbWQtPm9iai5wdHIsCisJCQkJCSAgInVscHE6IiwmYXNvYy0+dWxwcSk7CisJCQlzY3RwX3VscHFfdGFpbF9ldmVudCgmYXNvYy0+dWxwcSwgY21kLT5vYmoucHRyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NUUF9DTURfUkVQTFk6CisJCQkvKiBJZiBhbiBjYWxsZXIgaGFzIG5vdCBhbHJlYWR5IGNvcmtlZCwgZG8gY29yay4gKi8KKwkJCWlmICghYXNvYy0+b3V0cXVldWUuY29yaykgeworCQkJCXNjdHBfb3V0cV9jb3JrKCZhc29jLT5vdXRxdWV1ZSk7CisJCQkJbG9jYWxfY29yayA9IDE7CisJCQl9CisJCQkvKiBTZW5kIGEgY2h1bmsgdG8gb3VyIHBlZXIuICAqLworCQkJZXJyb3IgPSBzY3RwX291dHFfdGFpbCgmYXNvYy0+b3V0cXVldWUsIGNtZC0+b2JqLnB0cik7CisJCQlicmVhazsKKworCQljYXNlIFNDVFBfQ01EX1NFTkRfUEtUOgorCQkJLyogU2VuZCBhIGZ1bGwgcGFja2V0IHRvIG91ciBwZWVyLiAgKi8KKwkJCXBhY2tldCA9IGNtZC0+b2JqLnB0cjsKKwkJCXNjdHBfcGFja2V0X3RyYW5zbWl0KHBhY2tldCk7CisJCQlzY3RwX29vdGJfcGt0X2ZyZWUocGFja2V0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NUUF9DTURfUkVUUkFOOgorCQkJLyogTWFyayBhIHRyYW5zcG9ydCBmb3IgcmV0cmFuc21pc3Npb24uICAqLworCQkJc2N0cF9yZXRyYW5zbWl0KCZhc29jLT5vdXRxdWV1ZSwgY21kLT5vYmoudHJhbnNwb3J0LAorCQkJCQlTQ1RQX1JUWFJfVDNfUlRYKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NUUF9DTURfVFJBTlNNSVQ6CisJCQkvKiBLaWNrIHN0YXJ0IHRyYW5zbWlzc2lvbi4gKi8KKwkJCWVycm9yID0gc2N0cF9vdXRxX3VuY29yaygmYXNvYy0+b3V0cXVldWUpOworCQkJbG9jYWxfY29yayA9IDA7CisJCQlicmVhazsKKworCQljYXNlIFNDVFBfQ01EX0VDTl9DRToKKwkJCS8qIERvIGRlbGF5ZWQgQ0UgcHJvY2Vzc2luZy4gICAqLworCQkJc2N0cF9kb19lY25fY2Vfd29yayhhc29jLCBjbWQtPm9iai51MzIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1RQX0NNRF9FQ05fRUNORToKKwkJCS8qIERvIGRlbGF5ZWQgRUNORSBwcm9jZXNzaW5nLiAqLworCQkJbmV3X29iaiA9IHNjdHBfZG9fZWNuX2VjbmVfd29yayhhc29jLCBjbWQtPm9iai51MzIsCisJCQkJCQkJY2h1bmspOworCQkJaWYgKG5ld19vYmopCisJCQkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9SRVBMWSwKKwkJCQkJCVNDVFBfQ0hVTksobmV3X29iaikpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1RQX0NNRF9FQ05fQ1dSOgorCQkJLyogRG8gZGVsYXllZCBDV1IgcHJvY2Vzc2luZy4gICovCisJCQlzY3RwX2RvX2Vjbl9jd3Jfd29yayhhc29jLCBjbWQtPm9iai51MzIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1RQX0NNRF9TRVRVUF9UMjoKKwkJCXNjdHBfY21kX3NldHVwX3QyKGNvbW1hbmRzLCBhc29jLCBjbWQtPm9iai5wdHIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1RQX0NNRF9USU1FUl9TVEFSVDoKKwkJCXRpbWVyID0gJmFzb2MtPnRpbWVyc1tjbWQtPm9iai50b107CisJCQl0aW1lb3V0ID0gYXNvYy0+dGltZW91dHNbY21kLT5vYmoudG9dOworCQkJaWYgKCF0aW1lb3V0KQorCQkJCUJVRygpOworCisJCQl0aW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyB0aW1lb3V0OworCQkJc2N0cF9hc3NvY2lhdGlvbl9ob2xkKGFzb2MpOworCQkJYWRkX3RpbWVyKHRpbWVyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NUUF9DTURfVElNRVJfUkVTVEFSVDoKKwkJCXRpbWVyID0gJmFzb2MtPnRpbWVyc1tjbWQtPm9iai50b107CisJCQl0aW1lb3V0ID0gYXNvYy0+dGltZW91dHNbY21kLT5vYmoudG9dOworCQkJaWYgKCFtb2RfdGltZXIodGltZXIsIGppZmZpZXMgKyB0aW1lb3V0KSkKKwkJCQlzY3RwX2Fzc29jaWF0aW9uX2hvbGQoYXNvYyk7CisJCQlicmVhazsKKworCQljYXNlIFNDVFBfQ01EX1RJTUVSX1NUT1A6CisJCQl0aW1lciA9ICZhc29jLT50aW1lcnNbY21kLT5vYmoudG9dOworCQkJaWYgKHRpbWVyX3BlbmRpbmcodGltZXIpICYmIGRlbF90aW1lcih0aW1lcikpCisJCQkJc2N0cF9hc3NvY2lhdGlvbl9wdXQoYXNvYyk7CisJCQlicmVhazsKKworCQljYXNlIFNDVFBfQ01EX0lOSVRfUkVTVEFSVDoKKwkJCS8qIERvIHRoZSBuZWVkZWQgYWNjb3VudGluZyBhbmQgdXBkYXRlcworCQkJICogYXNzb2NpYXRlZCB3aXRoIHJlc3RhcnRpbmcgYW4gaW5pdGlhbGl6YXRpb24KKwkJCSAqIHRpbWVyLgorCQkJICovCisJCQlhc29jLT5jb3VudGVyc1tTQ1RQX0NPVU5URVJfSU5JVF9FUlJPUl0rKzsKKwkJCWFzb2MtPnRpbWVvdXRzW2NtZC0+b2JqLnRvXSAqPSAyOworCQkJaWYgKGFzb2MtPnRpbWVvdXRzW2NtZC0+b2JqLnRvXSA+CisJCQkgICAgYXNvYy0+bWF4X2luaXRfdGltZW8pIHsKKwkJCQlhc29jLT50aW1lb3V0c1tjbWQtPm9iai50b10gPQorCQkJCQlhc29jLT5tYXhfaW5pdF90aW1lbzsKKwkJCX0KKworCQkJLyogSWYgd2UndmUgc2VudCBhbnkgZGF0YSBidW5kbGVkIHdpdGgKKwkJCSAqIENPT0tJRS1FQ0hPIHdlIG5lZWQgdG8gcmVzZW5kLgorCQkJICovCisJCQlsaXN0X2Zvcl9lYWNoKHBvcywgJmFzb2MtPnBlZXIudHJhbnNwb3J0X2FkZHJfbGlzdCkgeworCQkJCXQgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHNjdHBfdHJhbnNwb3J0LAorCQkJCQkgICAgICAgdHJhbnNwb3J0cyk7CisJCQkJc2N0cF9yZXRyYW5zbWl0X21hcmsoJmFzb2MtPm91dHF1ZXVlLCB0LCAwKTsKKwkJCX0KKworCQkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLAorCQkJCQlTQ1RQX0NNRF9USU1FUl9SRVNUQVJULAorCQkJCQlTQ1RQX1RPKGNtZC0+b2JqLnRvKSk7CisJCQlicmVhazsKKworCQljYXNlIFNDVFBfQ01EX0lOSVRfRkFJTEVEOgorCQkJc2N0cF9jbWRfaW5pdF9mYWlsZWQoY29tbWFuZHMsIGFzb2MsIGNtZC0+b2JqLnUzMik7CisJCQlicmVhazsKKworCQljYXNlIFNDVFBfQ01EX0FTU09DX0ZBSUxFRDoKKwkJCXNjdHBfY21kX2Fzc29jX2ZhaWxlZChjb21tYW5kcywgYXNvYywgZXZlbnRfdHlwZSwKKwkJCQkJICAgICAgc3VidHlwZSwgY2h1bmssIGNtZC0+b2JqLnUzMik7CisJCQlicmVhazsKKworCQljYXNlIFNDVFBfQ01EX0NPVU5URVJfSU5DOgorCQkJYXNvYy0+Y291bnRlcnNbY21kLT5vYmouY291bnRlcl0rKzsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NUUF9DTURfQ09VTlRFUl9SRVNFVDoKKwkJCWFzb2MtPmNvdW50ZXJzW2NtZC0+b2JqLmNvdW50ZXJdID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NUUF9DTURfUkVQT1JUX0RVUDoKKwkJCXNjdHBfdHNubWFwX21hcmtfZHVwKCZhc29jLT5wZWVyLnRzbl9tYXAsCisJCQkJCSAgICAgY21kLT5vYmoudTMyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NUUF9DTURfUkVQT1JUX0JBRF9UQUc6CisJCQlTQ1RQX0RFQlVHX1BSSU5USygidnRhZyBtaXNtYXRjaCFcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1RQX0NNRF9TVFJJS0U6CisJCQkvKiBNYXJrIG9uZSBzdHJpa2UgYWdhaW5zdCBhIHRyYW5zcG9ydC4gICovCisJCQlzY3RwX2RvXzhfMl90cmFuc3BvcnRfc3RyaWtlKGFzb2MsIGNtZC0+b2JqLnRyYW5zcG9ydCk7CisJCQlicmVhazsKKworCQljYXNlIFNDVFBfQ01EX1RSQU5TUE9SVF9SRVNFVDoKKwkJCXQgPSBjbWQtPm9iai50cmFuc3BvcnQ7CisJCQlzY3RwX2NtZF90cmFuc3BvcnRfcmVzZXQoY29tbWFuZHMsIGFzb2MsIHQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1RQX0NNRF9UUkFOU1BPUlRfT046CisJCQl0ID0gY21kLT5vYmoudHJhbnNwb3J0OworCQkJc2N0cF9jbWRfdHJhbnNwb3J0X29uKGNvbW1hbmRzLCBhc29jLCB0LCBjaHVuayk7CisJCQlicmVhazsKKworCQljYXNlIFNDVFBfQ01EX0hCX1RJTUVSU19TVEFSVDoKKwkJCXNjdHBfY21kX2hiX3RpbWVyc19zdGFydChjb21tYW5kcywgYXNvYyk7CisJCQlicmVhazsKKworCQljYXNlIFNDVFBfQ01EX0hCX1RJTUVSX1VQREFURToKKwkJCXQgPSBjbWQtPm9iai50cmFuc3BvcnQ7CisJCQlzY3RwX2NtZF9oYl90aW1lcl91cGRhdGUoY29tbWFuZHMsIGFzb2MsIHQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1RQX0NNRF9IQl9USU1FUlNfU1RPUDoKKwkJCXNjdHBfY21kX2hiX3RpbWVyc19zdG9wKGNvbW1hbmRzLCBhc29jKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NUUF9DTURfUkVQT1JUX0VSUk9SOgorCQkJZXJyb3IgPSBjbWQtPm9iai5lcnJvcjsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NUUF9DTURfUFJPQ0VTU19DVFNOOgorCQkJLyogRHVtbXkgdXAgYSBTQUNLIGZvciBwcm9jZXNzaW5nLiAqLworCQkJc2Fja2guY3VtX3Rzbl9hY2sgPSBjbWQtPm9iai51MzI7CisJCQlzYWNraC5hX3J3bmQgPSAwOworCQkJc2Fja2gubnVtX2dhcF9hY2tfYmxvY2tzID0gMDsKKwkJCXNhY2toLm51bV9kdXBfdHNucyA9IDA7CisJCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1BST0NFU1NfU0FDSywKKwkJCQkJU0NUUF9TQUNLSCgmc2Fja2gpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NUUF9DTURfRElTQ0FSRF9QQUNLRVQ6CisJCQkvKiBXZSBuZWVkIHRvIGRpc2NhcmQgdGhlIHdob2xlIHBhY2tldC4gICovCisJCQljaHVuay0+cGRpc2NhcmQgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1RQX0NNRF9SVE9fUEVORElORzoKKwkJCXQgPSBjbWQtPm9iai50cmFuc3BvcnQ7CisJCQl0LT5ydG9fcGVuZGluZyA9IDE7CisJCQlicmVhazsKKworCQljYXNlIFNDVFBfQ01EX1BBUlRfREVMSVZFUjoKKwkJCXNjdHBfdWxwcV9wYXJ0aWFsX2RlbGl2ZXJ5KCZhc29jLT51bHBxLCBjbWQtPm9iai5wdHIsCisJCQkJCQkgICBHRlBfQVRPTUlDKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NUUF9DTURfUkVORUdFOgorCQkJc2N0cF91bHBxX3JlbmVnZSgmYXNvYy0+dWxwcSwgY21kLT5vYmoucHRyLAorCQkJCQkgR0ZQX0FUT01JQyk7CisJCQlicmVhazsKKworCQljYXNlIFNDVFBfQ01EX1NFVFVQX1Q0OgorCQkJc2N0cF9jbWRfc2V0dXBfdDQoY29tbWFuZHMsIGFzb2MsIGNtZC0+b2JqLnB0cik7CisJCQlicmVhazsKKworCQljYXNlIFNDVFBfQ01EX1BST0NFU1NfT1BFUlI6CisJCQlzY3RwX2NtZF9wcm9jZXNzX29wZXJyKGNvbW1hbmRzLCBhc29jLCBjaHVuayk7CisJCQlicmVhazsKKwkJY2FzZSBTQ1RQX0NNRF9DTEVBUl9JTklUX1RBRzoKKwkJCWFzb2MtPnBlZXIuaS5pbml0X3RhZyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBTQ1RQX0NNRF9ERUxfTk9OX1BSSU1BUlk6CisJCQlzY3RwX2NtZF9kZWxfbm9uX3ByaW1hcnkoYXNvYyk7CisJCQlicmVhazsKKwkJY2FzZSBTQ1RQX0NNRF9UM19SVFhfVElNRVJTX1NUT1A6CisJCQlzY3RwX2NtZF90M19ydHhfdGltZXJzX3N0b3AoY29tbWFuZHMsIGFzb2MpOworCQkJYnJlYWs7CisJCWNhc2UgU0NUUF9DTURfRk9SQ0VfUFJJTV9SRVRSQU46CisJCQl0ID0gYXNvYy0+cGVlci5yZXRyYW5fcGF0aDsKKwkJCWFzb2MtPnBlZXIucmV0cmFuX3BhdGggPSBhc29jLT5wZWVyLnByaW1hcnlfcGF0aDsKKwkJCWVycm9yID0gc2N0cF9vdXRxX3VuY29yaygmYXNvYy0+b3V0cXVldWUpOworCQkJbG9jYWxfY29yayA9IDA7CisJCQlhc29jLT5wZWVyLnJldHJhbl9wYXRoID0gdDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSW1wb3NzaWJsZSBjb21tYW5kOiAldSwgJXBcbiIsCisJCQkgICAgICAgY21kLT52ZXJiLCBjbWQtPm9iai5wdHIpOworCQkJYnJlYWs7CisJCX07CisJCWlmIChlcnJvcikKKwkJCWJyZWFrOworCX0KKworb3V0OgorCWlmIChsb2NhbF9jb3JrKQorCQlzY3RwX291dHFfdW5jb3JrKCZhc29jLT5vdXRxdWV1ZSk7CisJcmV0dXJuIGVycm9yOworbm9tZW06CisJZXJyb3IgPSAtRU5PTUVNOworCWdvdG8gb3V0OworfQorCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYyBiL25ldC9zY3RwL3NtX3N0YXRlZnVucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3OGM1NmEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYwpAQCAtMCwwICsxLDUyMzggQEAKKy8qIFNDVFAga2VybmVsIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSwgMjAwNAorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgQ2lzY28sIEluYy4KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIE1vdG9yb2xhLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChjKSAyMDAyICAgICAgTm9raWEgQ29ycC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgU0NUUCBrZXJuZWwgcmVmZXJlbmNlIEltcGxlbWVudGF0aW9uCisgKgorICogVGhpcyBpcyBwYXJ0IG9mIHRoZSBTQ1RQIExpbnV4IEtlcm5lbCBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24uCisgKgorICogVGhlc2UgYXJlIHRoZSBzdGF0ZSBmdW5jdGlvbnMgZm9yIHRoZSBzdGF0ZSBtYWNoaW5lLgorICoKKyAqIFRoZSBTQ1RQIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoZSBTQ1RQIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0CisgKiB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAqICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogUGxlYXNlIHNlbmQgYW55IGJ1ZyByZXBvcnRzIG9yIGZpeGVzIHlvdSBtYWtlIHRvIHRoZQorICogZW1haWwgYWRkcmVzcyhlcyk6CisgKiAgICBsa3NjdHAgZGV2ZWxvcGVycyA8bGtzY3RwLWRldmVsb3BlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIE9yIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHdlYnNpdGU6CisgKiAgICBodHRwOi8vd3d3LnNmLm5ldC9wcm9qZWN0cy9sa3NjdHAKKyAqCisgKiBXcml0dGVuIG9yIG1vZGlmaWVkIGJ5OgorICogICAgTGEgTW9udGUgSC5QLiBZYXJyb2xsIDxwaWdneUBhY20ub3JnPgorICogICAgS2FybCBLbnV0c29uICAgICAgICAgIDxrYXJsQGF0aGVuYS5jaGljYWdvLmlsLnVzPgorICogICAgTWF0aGV3IEtvdG93c2t5ICAgICAgIDxrb3Rvd3NreUBzY3RwLm9yZz4KKyAqICAgIFNyaWRoYXIgU2FtdWRyYWxhICAgICA8c2FtdWRyYWxhQHVzLmlibS5jb20+CisgKiAgICBKb24gR3JpbW0gICAgICAgICAgICAgPGpncmltbUB1cy5pYm0uY29tPgorICogICAgSHVpIEh1YW5nIAkgICAgPGh1aS5odWFuZ0Bub2tpYS5jb20+CisgKiAgICBEYWppYW5nIFpoYW5nIAkgICAgPGRhamlhbmcuemhhbmdAbm9raWEuY29tPgorICogICAgRGFpc3kgQ2hhbmcJICAgIDxkYWlzeWNAdXMuaWJtLmNvbT4KKyAqICAgIEFyZGVsbGUgRmFuCSAgICA8YXJkZWxsZS5mYW5AaW50ZWwuY29tPgorICogICAgUnlhbiBMYXllcgkgICAgPHJtbGF5ZXJAdXMuaWJtLmNvbT4KKyAqICAgIEtldmluIEdhbwkJICAgIDxrZXZpbi5nYW9AaW50ZWwuY29tPgorICoKKyAqIEFueSBidWdzIHJlcG9ydGVkIGdpdmVuIHRvIHVzIHdlIHdpbGwgdHJ5IHRvIGZpeC4uLiBhbnkgZml4ZXMgc2hhcmVkIHdpbGwKKyAqIGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBuZXh0IFNDVFAgcmVsZWFzZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvaW5ldF9lY24uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc2N0cC9zY3RwLmg+CisjaW5jbHVkZSA8bmV0L3NjdHAvc20uaD4KKyNpbmNsdWRlIDxuZXQvc2N0cC9zdHJ1Y3RzLmg+CisKK3N0YXRpYyBzdHJ1Y3Qgc2N0cF9wYWNrZXQgKnNjdHBfYWJvcnRfcGt0X25ldyhjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkJICBjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkgIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKKwkJCQkgIGNvbnN0IHZvaWQgKnBheWxvYWQsCisJCQkJICBzaXplX3QgcGF5bGVuKTsKK3N0YXRpYyBpbnQgc2N0cF9lYXRfZGF0YShjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCSBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCisJCQkgc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKTsKK3N0YXRpYyBzdHJ1Y3Qgc2N0cF9wYWNrZXQgKnNjdHBfb290Yl9wa3RfbmV3KGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBzY3RwX2NodW5rICpjaHVuayk7CitzdGF0aWMgdm9pZCBzY3RwX3NlbmRfc3RhbGVfY29va2llX2Vycihjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCisJCQkJICAgICAgIHNjdHBfY21kX3NlcV90ICpjb21tYW5kcywKKwkJCQkgICAgICAgc3RydWN0IHNjdHBfY2h1bmsgKmVycl9jaHVuayk7CitzdGF0aWMgc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc2ZfZG9fNV8yXzZfc3RhbGUoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCQkJIGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCQkJIGNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJCQkJCQkgdm9pZCAqYXJnLAorCQkJCQkJIHNjdHBfY21kX3NlcV90ICpjb21tYW5kcyk7CitzdGF0aWMgc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc2Zfc2h1dF84XzRfNShjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkJCSAgICAgY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJCSAgICAgY29uc3Qgc2N0cF9zdWJ0eXBlX3QgdHlwZSwKKwkJCQkJICAgICB2b2lkICphcmcsCisJCQkJCSAgICAgc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKTsKK3N0YXRpYyBzdHJ1Y3Qgc2N0cF9zYWNraGRyICpzY3RwX3NtX3B1bGxfc2FjayhzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmspOworCisKKy8qIFNtYWxsIGhlbHBlciBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGUgY2h1bmsgbGVuZ3RoCisgKiBpcyBvZiB0aGUgYXBwcm9wcmlhdGUgbGVuZ3RoLiAgVGhlICdyZXF1aXJlZF9sZW5ndGgnIGFyZ3VtZW50CisgKiBpcyBzZXQgdG8gYmUgdGhlIHNpemUgb2YgYSBzcGVjaWZpYyBjaHVuayB3ZSBhcmUgdGVzdGluZy4KKyAqIFJldHVybiBWYWx1ZXM6ICAxID0gVmFsaWQgbGVuZ3RoCisgKiAJCSAgIDAgPSBJbnZhbGlkIGxlbmd0aAorICoKKyAqLworc3RhdGljIGlubGluZSBpbnQKK3NjdHBfY2h1bmtfbGVuZ3RoX3ZhbGlkKHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKKwkJCSAgIF9fdTE2IHJlcXVpcmVkX2xlbmd0aCkKK3sKKwlfX3UxNiBjaHVua19sZW5ndGggPSBudG9ocyhjaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpOworCisJaWYgKHVubGlrZWx5KGNodW5rX2xlbmd0aCA8IHJlcXVpcmVkX2xlbmd0aCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGVzZSBhcmUgdGhlIHN0YXRlIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgY2h1bmsgZXZlbnRzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBQcm9jZXNzIHRoZSBmaW5hbCBTSFVURE9XTiBDT01QTEVURS4KKyAqCisgKiBTZWN0aW9uOiA0IChDKSAoZGlhZ3JhbSksIDkuMgorICogVXBvbiByZWNlcHRpb24gb2YgdGhlIFNIVVRET1dOIENPTVBMRVRFIGNodW5rIHRoZSBlbmRwb2ludCB3aWxsIHZlcmlmeQorICogdGhhdCBpdCBpcyBpbiBTSFVURE9XTi1BQ0stU0VOVCBzdGF0ZSwgaWYgaXQgaXMgbm90IHRoZSBjaHVuayBzaG91bGQgYmUKKyAqIGRpc2NhcmRlZC4gSWYgdGhlIGVuZHBvaW50IGlzIGluIHRoZSBTSFVURE9XTi1BQ0stU0VOVCBzdGF0ZSB0aGUgZW5kcG9pbnQKKyAqIHNob3VsZCBzdG9wIHRoZSBUMi1zaHV0ZG93biB0aW1lciBhbmQgcmVtb3ZlIGFsbCBrbm93bGVkZ2Ugb2YgdGhlCisgKiBhc3NvY2lhdGlvbiAoYW5kIHRodXMgdGhlIGFzc29jaWF0aW9uIGVudGVycyB0aGUgQ0xPU0VEIHN0YXRlKS4KKyAqCisgKiBWZXJpZmljYXRpb24gVGFnOiA4LjUuMShDKQorICogQykgUnVsZXMgZm9yIHBhY2tldCBjYXJyeWluZyBTSFVURE9XTiBDT01QTEVURToKKyAqIC4uLgorICogLSBUaGUgcmVjZWl2ZXIgb2YgYSBTSFVURE9XTiBDT01QTEVURSBzaGFsbCBhY2NlcHQgdGhlIHBhY2tldCBpZiB0aGUKKyAqICAgVmVyaWZpY2F0aW9uIFRhZyBmaWVsZCBvZiB0aGUgcGFja2V0IG1hdGNoZXMgaXRzIG93biB0YWcgT1IgaXQgaXMKKyAqICAgc2V0IHRvIGl0cyBwZWVyJ3MgdGFnIGFuZCB0aGUgVCBiaXQgaXMgc2V0IGluIHRoZSBDaHVuayBGbGFncy4KKyAqICAgT3RoZXJ3aXNlLCB0aGUgcmVjZWl2ZXIgTVVTVCBzaWxlbnRseSBkaXNjYXJkIHRoZSBwYWNrZXQgYW5kIHRha2UKKyAqICAgbm8gZnVydGhlciBhY3Rpb24uIEFuIGVuZHBvaW50IE1VU1QgaWdub3JlIHRoZSBTSFVURE9XTiBDT01QTEVURSBpZgorICogICBpdCBpcyBub3QgaW4gdGhlIFNIVVRET1dOLUFDSy1TRU5UIHN0YXRlLgorICoKKyAqIElucHV0cworICogKGVuZHBvaW50LCBhc29jLCBjaHVuaykKKyAqCisgKiBPdXRwdXRzCisgKiAoYXNvYywgcmVwbHlfbXNnLCBtc2dfdXAsIHRpbWVycywgY291bnRlcnMpCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgZGlzcG9zaXRpb24gb2YgdGhlIGNodW5rLgorICovCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl9kb180X0MoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCSAgY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJICBjb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAorCQkJCSAgdm9pZCAqYXJnLAorCQkJCSAgc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuayA9IGFyZzsKKwlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXY7CisKKwkvKiBSRkMgMjk2MCA2LjEwIEJ1bmRsaW5nCisJICoKKwkgKiBBbiBlbmRwb2ludCBNVVNUIE5PVCBidW5kbGUgSU5JVCwgSU5JVCBBQ0sgb3IKKwkgKiBTSFVURE9XTiBDT01QTEVURSB3aXRoIGFueSBvdGhlciBjaHVua3MuCisJICovCisJaWYgKCFjaHVuay0+c2luZ2xldG9uKQorCQlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9WSU9MQVRJT047CisKKwlpZiAoIXNjdHBfdnRhZ192ZXJpZnlfZWl0aGVyKGNodW5rLCBhc29jKSkKKwkJcmV0dXJuIHNjdHBfc2ZfcGRpc2NhcmQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworCisJLyogUkZDIDI5NjAgMTAuMiBTQ1RQLXRvLVVMUAorCSAqCisJICogSCkgU0hVVERPV04gQ09NUExFVEUgbm90aWZpY2F0aW9uCisJICoKKwkgKiBXaGVuIFNDVFAgY29tcGxldGVzIHRoZSBzaHV0ZG93biBwcm9jZWR1cmVzIChzZWN0aW9uIDkuMikgdGhpcworCSAqIG5vdGlmaWNhdGlvbiBpcyBwYXNzZWQgdG8gdGhlIHVwcGVyIGxheWVyLgorCSAqLworCWV2ID0gc2N0cF91bHBldmVudF9tYWtlX2Fzc29jX2NoYW5nZShhc29jLCAwLCBTQ1RQX1NIVVRET1dOX0NPTVAsCisJCQkJCSAgICAgMCwgMCwgMCwgR0ZQX0FUT01JQyk7CisJaWYgKCFldikKKwkJZ290byBub21lbTsKKworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfRVZFTlRfVUxQLCBTQ1RQX1VMUEVWRU5UKGV2KSk7CisKKwkvKiBVcG9uIHJlY2VwdGlvbiBvZiB0aGUgU0hVVERPV04gQ09NUExFVEUgY2h1bmsgdGhlIGVuZHBvaW50CisJICogd2lsbCB2ZXJpZnkgdGhhdCBpdCBpcyBpbiBTSFVURE9XTi1BQ0stU0VOVCBzdGF0ZSwgaWYgaXQgaXMKKwkgKiBub3QgdGhlIGNodW5rIHNob3VsZCBiZSBkaXNjYXJkZWQuIElmIHRoZSBlbmRwb2ludCBpcyBpbgorCSAqIHRoZSBTSFVURE9XTi1BQ0stU0VOVCBzdGF0ZSB0aGUgZW5kcG9pbnQgc2hvdWxkIHN0b3AgdGhlCisJICogVDItc2h1dGRvd24gdGltZXIgYW5kIHJlbW92ZSBhbGwga25vd2xlZGdlIG9mIHRoZQorCSAqIGFzc29jaWF0aW9uIChhbmQgdGh1cyB0aGUgYXNzb2NpYXRpb24gZW50ZXJzIHRoZSBDTE9TRUQKKwkgKiBzdGF0ZSkuCisJICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9USU1FUl9TVE9QLAorCQkJU0NUUF9UTyhTQ1RQX0VWRU5UX1RJTUVPVVRfVDJfU0hVVERPV04pKTsKKworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVElNRVJfU1RPUCwKKwkJCVNDVFBfVE8oU0NUUF9FVkVOVF9USU1FT1VUX1Q1X1NIVVRET1dOX0dVQVJEKSk7CisKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX05FV19TVEFURSwKKwkJCVNDVFBfU1RBVEUoU0NUUF9TVEFURV9DTE9TRUQpKTsKKworCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX1NIVVRET1dOUyk7CisJU0NUUF9ERUNfU1RBVFMoU0NUUF9NSUJfQ1VSUkVTVEFCKTsKKworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfREVMRVRFX1RDQiwgU0NUUF9OVUxMKCkpOworCisJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fREVMRVRFX1RDQjsKKworbm9tZW06CisJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fTk9NRU07Cit9CisKKy8qCisgKiBSZXNwb25kIHRvIGEgbm9ybWFsIElOSVQgY2h1bmsuCisgKiBXZSBhcmUgdGhlIHNpZGUgdGhhdCBpcyBiZWluZyBhc2tlZCBmb3IgYW4gYXNzb2NpYXRpb24uCisgKgorICogU2VjdGlvbjogNS4xIE5vcm1hbCBFc3RhYmxpc2htZW50IG9mIGFuIEFzc29jaWF0aW9uLCBCCisgKiBCKSAiWiIgc2hhbGwgcmVzcG9uZCBpbW1lZGlhdGVseSB3aXRoIGFuIElOSVQgQUNLIGNodW5rLiAgVGhlCisgKiAgICBkZXN0aW5hdGlvbiBJUCBhZGRyZXNzIG9mIHRoZSBJTklUIEFDSyBNVVNUIGJlIHNldCB0byB0aGUgc291cmNlCisgKiAgICBJUCBhZGRyZXNzIG9mIHRoZSBJTklUIHRvIHdoaWNoIHRoaXMgSU5JVCBBQ0sgaXMgcmVzcG9uZGluZy4gIEluCisgKiAgICB0aGUgcmVzcG9uc2UsIGJlc2lkZXMgZmlsbGluZyBpbiBvdGhlciBwYXJhbWV0ZXJzLCAiWiIgbXVzdCBzZXQgdGhlCisgKiAgICBWZXJpZmljYXRpb24gVGFnIGZpZWxkIHRvIFRhZ19BLCBhbmQgYWxzbyBwcm92aWRlIGl0cyBvd24KKyAqICAgIFZlcmlmaWNhdGlvbiBUYWcgKFRhZ19aKSBpbiB0aGUgSW5pdGlhdGUgVGFnIGZpZWxkLgorICoKKyAqIFZlcmlmaWNhdGlvbiBUYWc6IE11c3QgYmUgMC4gCisgKgorICogSW5wdXRzCisgKiAoZW5kcG9pbnQsIGFzb2MsIGNodW5rKQorICoKKyAqIE91dHB1dHMKKyAqIChhc29jLCByZXBseV9tc2csIG1zZ191cCwgdGltZXJzLCBjb3VudGVycykKKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBkaXNwb3NpdGlvbiBvZiB0aGUgY2h1bmsuCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2RvXzVfMUJfaW5pdChjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkJCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCQljb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAorCQkJCQl2b2lkICphcmcsCisJCQkJCXNjdHBfY21kX3NlcV90ICpjb21tYW5kcykKK3sKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmsgPSBhcmc7CisJc3RydWN0IHNjdHBfY2h1bmsgKnJlcGw7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKm5ld19hc29jOworCXN0cnVjdCBzY3RwX2NodW5rICplcnJfY2h1bms7CisJc3RydWN0IHNjdHBfcGFja2V0ICpwYWNrZXQ7CisJc2N0cF91bnJlY29nbml6ZWRfcGFyYW1fdCAqdW5rX3BhcmFtOworCXN0cnVjdCBzb2NrICpzazsKKwlpbnQgbGVuOworCisJLyogNi4xMCBCdW5kbGluZworCSAqIEFuIGVuZHBvaW50IE1VU1QgTk9UIGJ1bmRsZSBJTklULCBJTklUIEFDSyBvcgorCSAqIFNIVVRET1dOIENPTVBMRVRFIHdpdGggYW55IG90aGVyIGNodW5rcy4KKwkgKiAKKwkgKiBJRyBTZWN0aW9uIDIuMTEuMgorCSAqIEZ1cnRoZXJtb3JlLCB3ZSByZXF1aXJlIHRoYXQgdGhlIHJlY2VpdmVyIG9mIGFuIElOSVQgY2h1bmsgTVVTVAorCSAqIGVuZm9yY2UgdGhlc2UgcnVsZXMgYnkgc2lsZW50bHkgZGlzY2FyZGluZyBhbiBhcnJpdmluZyBwYWNrZXQKKwkgKiB3aXRoIGFuIElOSVQgY2h1bmsgdGhhdCBpcyBidW5kbGVkIHdpdGggb3RoZXIgY2h1bmtzLgorCSAqLworCWlmICghY2h1bmstPnNpbmdsZXRvbikKKwkJcmV0dXJuIHNjdHBfc2ZfcGRpc2NhcmQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworCisJLyogSWYgdGhlIHBhY2tldCBpcyBhbiBPT1RCIHBhY2tldCB3aGljaCBpcyB0ZW1wb3JhcmlseSBvbiB0aGUKKwkgKiBjb250cm9sIGVuZHBvaW50LCByZXNwb25kIHdpdGggYW4gQUJPUlQuCisJICovCisJaWYgKGVwID09IHNjdHBfc2soKHNjdHBfZ2V0X2N0bF9zb2NrKCkpKS0+ZXApCisJCXJldHVybiBzY3RwX3NmX3RhYm9ydF84XzRfOChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7CisKKwlzayA9IGVwLT5iYXNlLnNrOworCS8qIElmIHRoZSBlbmRwb2ludCBpcyBub3QgbGlzdGVuaW5nIG9yIGlmIHRoZSBudW1iZXIgb2YgYXNzb2NpYXRpb25zCisJICogb24gdGhlIFRDUC1zdHlsZSBzb2NrZXQgZXhjZWVkIHRoZSBtYXggYmFja2xvZywgcmVzcG9uZCB3aXRoIGFuCisJICogQUJPUlQuCisJICovCisJaWYgKCFzY3RwX3NzdGF0ZShzaywgTElTVEVOSU5HKSB8fAorCSAgICAoc2N0cF9zdHlsZShzaywgVENQKSAmJgorCSAgICAgc2tfYWNjZXB0cV9pc19mdWxsKHNrKSkpCisJCXJldHVybiBzY3RwX3NmX3RhYm9ydF84XzRfOChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7CisKKwkvKiAzLjEgQSBwYWNrZXQgY29udGFpbmluZyBhbiBJTklUIGNodW5rIE1VU1QgaGF2ZSBhIHplcm8gVmVyaWZpY2F0aW9uCisJICogVGFnLiAKKwkgKi8KKwlpZiAoY2h1bmstPnNjdHBfaGRyLT52dGFnICE9IDApCisJCXJldHVybiBzY3RwX3NmX3RhYm9ydF84XzRfOChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgSU5JVCBjaHVuayBoYXMgYSB2YWxpZCBsZW5ndGguCisJICogTm9ybWFsbHksIHRoaXMgd291bGQgY2F1c2UgYW4gQUJPUlQgd2l0aCBhIFByb3RvY29sIFZpb2xhdGlvbgorCSAqIGVycm9yLCBidXQgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhbiBhc3NvY2lhdGlvbiwgd2UnbGwKKwkgKiBqdXN0IGRpc2NhcmQgdGhlIHBhY2tldC4KKwkgKi8KKwlpZiAoIXNjdHBfY2h1bmtfbGVuZ3RoX3ZhbGlkKGNodW5rLCBzaXplb2Yoc2N0cF9pbml0X2NodW5rX3QpKSkKKwkJcmV0dXJuIHNjdHBfc2ZfcGRpc2NhcmQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworCisJLyogVmVyaWZ5IHRoZSBJTklUIGNodW5rIGJlZm9yZSBwcm9jZXNzaW5nIGl0LiAqLworCWVycl9jaHVuayA9IE5VTEw7CisJaWYgKCFzY3RwX3ZlcmlmeV9pbml0KGFzb2MsIGNodW5rLT5jaHVua19oZHItPnR5cGUsCisJCQkgICAgICAoc2N0cF9pbml0X2NodW5rX3QgKiljaHVuay0+Y2h1bmtfaGRyLCBjaHVuaywKKwkJCSAgICAgICZlcnJfY2h1bmspKSB7CisJCS8qIFRoaXMgY2h1bmsgY29udGFpbnMgZmF0YWwgZXJyb3IuIEl0IGlzIHRvIGJlIGRpc2NhcmRlZC4KKwkJICogU2VuZCBhbiBBQk9SVCwgd2l0aCBjYXVzZXMgaWYgdGhlcmUgaXMgYW55LgorCQkgKi8KKwkJaWYgKGVycl9jaHVuaykgeworCQkJcGFja2V0ID0gc2N0cF9hYm9ydF9wa3RfbmV3KGVwLCBhc29jLCBhcmcsCisJCQkJCShfX3U4ICopKGVycl9jaHVuay0+Y2h1bmtfaGRyKSArCisJCQkJCXNpemVvZihzY3RwX2NodW5raGRyX3QpLAorCQkJCQludG9ocyhlcnJfY2h1bmstPmNodW5rX2hkci0+bGVuZ3RoKSAtCisJCQkJCXNpemVvZihzY3RwX2NodW5raGRyX3QpKTsKKworCQkJc2N0cF9jaHVua19mcmVlKGVycl9jaHVuayk7CisKKwkJCWlmIChwYWNrZXQpIHsKKwkJCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1NFTkRfUEtULAorCQkJCQkJU0NUUF9QQUNLRVQocGFja2V0KSk7CisJCQkJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfT1VUQ1RSTENIVU5LUyk7CisJCQkJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fQ09OU1VNRTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fTk9NRU07CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gc2N0cF9zZl90YWJvcnRfOF80XzgoZXAsIGFzb2MsIHR5cGUsIGFyZywKKwkJCQkJCSAgICBjb21tYW5kcyk7CisJCX0KKwl9CisKKyAgICAgICAgLyogR3JhYiB0aGUgSU5JVCBoZWFkZXIuICAqLworCWNodW5rLT5zdWJoLmluaXRfaGRyID0gKHNjdHBfaW5pdGhkcl90ICopY2h1bmstPnNrYi0+ZGF0YTsKKworCS8qIFRhZyB0aGUgdmFyaWFibGUgbGVuZ3RoIHBhcmFtZXRlcnMuICAqLworCWNodW5rLT5wYXJhbV9oZHIudiA9IHNrYl9wdWxsKGNodW5rLT5za2IsIHNpemVvZihzY3RwX2luaXRoZHJfdCkpOworCisJbmV3X2Fzb2MgPSBzY3RwX21ha2VfdGVtcF9hc29jKGVwLCBjaHVuaywgR0ZQX0FUT01JQyk7CisJaWYgKCFuZXdfYXNvYykKKwkJZ290byBub21lbTsKKworCS8qIFRoZSBjYWxsLCBzY3RwX3Byb2Nlc3NfaW5pdCgpLCBjYW4gZmFpbCBvbiBtZW1vcnkgYWxsb2NhdGlvbi4gICovCisJaWYgKCFzY3RwX3Byb2Nlc3NfaW5pdChuZXdfYXNvYywgY2h1bmstPmNodW5rX2hkci0+dHlwZSwKKwkJCSAgICAgICBzY3RwX3NvdXJjZShjaHVuayksCisJCQkgICAgICAgKHNjdHBfaW5pdF9jaHVua190ICopY2h1bmstPmNodW5rX2hkciwKKwkJCSAgICAgICBHRlBfQVRPTUlDKSkKKwkJZ290byBub21lbV9pbml0OworCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9ORVdfQVNPQywgU0NUUF9BU09DKG5ld19hc29jKSk7CisKKwkvKiBCKSAiWiIgc2hhbGwgcmVzcG9uZCBpbW1lZGlhdGVseSB3aXRoIGFuIElOSVQgQUNLIGNodW5rLiAgKi8KKworCS8qIElmIHRoZXJlIGFyZSBlcnJvcnMgbmVlZCB0byBiZSByZXBvcnRlZCBmb3IgdW5rbm93biBwYXJhbWV0ZXJzLAorCSAqIG1ha2Ugc3VyZSB0byByZXNlcnZlIGVub3VnaCByb29tIGluIHRoZSBJTklUIEFDSyBmb3IgdGhlbS4KKwkgKi8KKwlsZW4gPSAwOworCWlmIChlcnJfY2h1bmspCisJCWxlbiA9IG50b2hzKGVycl9jaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpIC0KKwkJCXNpemVvZihzY3RwX2NodW5raGRyX3QpOworCisJaWYgKHNjdHBfYXNzb2Nfc2V0X2JpbmRfYWRkcl9mcm9tX2VwKG5ld19hc29jLCBHRlBfQVRPTUlDKSA8IDApCisJCWdvdG8gbm9tZW1fYWNrOworCisJcmVwbCA9IHNjdHBfbWFrZV9pbml0X2FjayhuZXdfYXNvYywgY2h1bmssIEdGUF9BVE9NSUMsIGxlbik7CisJaWYgKCFyZXBsKQorCQlnb3RvIG5vbWVtX2FjazsKKworCS8qIElmIHRoZXJlIGFyZSBlcnJvcnMgbmVlZCB0byBiZSByZXBvcnRlZCBmb3IgdW5rbm93biBwYXJhbWV0ZXJzLAorCSAqIGluY2x1ZGUgdGhlbSBpbiB0aGUgb3V0Z29pbmcgSU5JVCBBQ0sgYXMgIlVucmVjb2duaXplZCBwYXJhbWV0ZXIiCisJICogcGFyYW1ldGVyLgorCSAqLworCWlmIChlcnJfY2h1bmspIHsKKwkJLyogR2V0IHRoZSAiVW5yZWNvZ25pemVkIHBhcmFtZXRlciIgcGFyYW1ldGVyKHMpIG91dCBvZiB0aGUKKwkJICogRVJST1IgY2h1bmsgZ2VuZXJhdGVkIGJ5IHNjdHBfdmVyaWZ5X2luaXQoKS4gU2luY2UgdGhlCisJCSAqIGVycm9yIGNhdXNlIGNvZGUgZm9yICJ1bmtub3duIHBhcmFtZXRlciIgYW5kIHRoZQorCQkgKiAiVW5yZWNvZ25pemVkIHBhcmFtZXRlciIgdHlwZSBpcyB0aGUgc2FtZSwgd2UgY2FuCisJCSAqIGNvbnN0cnVjdCB0aGUgcGFyYW1ldGVycyBpbiBJTklUIEFDSyBieSBjb3B5aW5nIHRoZQorCQkgKiBFUlJPUiBjYXVzZXMgb3Zlci4KKwkJICovCisJCXVua19wYXJhbSA9IChzY3RwX3VucmVjb2duaXplZF9wYXJhbV90ICopCisJCQkgICAgKChfX3U4ICopKGVycl9jaHVuay0+Y2h1bmtfaGRyKSArCisJCQkgICAgc2l6ZW9mKHNjdHBfY2h1bmtoZHJfdCkpOworCQkvKiBSZXBsYWNlIHRoZSBjYXVzZSBjb2RlIHdpdGggdGhlICJVbnJlY29nbml6ZWQgcGFyYW1ldGVyIgorCQkgKiBwYXJhbWV0ZXIgdHlwZS4KKwkJICovCisJCXNjdHBfYWRkdG9fY2h1bmsocmVwbCwgbGVuLCB1bmtfcGFyYW0pOworCQlzY3RwX2NodW5rX2ZyZWUoZXJyX2NodW5rKTsKKwl9CisKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1JFUExZLCBTQ1RQX0NIVU5LKHJlcGwpKTsKKworCS8qCisJICogTm90ZTogIEFmdGVyIHNlbmRpbmcgb3V0IElOSVQgQUNLIHdpdGggdGhlIFN0YXRlIENvb2tpZSBwYXJhbWV0ZXIsCisJICogIloiIE1VU1QgTk9UIGFsbG9jYXRlIGFueSByZXNvdXJjZXMsIG5vciBrZWVwIGFueSBzdGF0ZXMgZm9yIHRoZQorCSAqIG5ldyBhc3NvY2lhdGlvbi4gIE90aGVyd2lzZSwgIloiIHdpbGwgYmUgdnVsbmVyYWJsZSB0byByZXNvdXJjZQorCSAqIGF0dGFja3MuCisJICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9ERUxFVEVfVENCLCBTQ1RQX05VTEwoKSk7CisKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9ERUxFVEVfVENCOworCitub21lbV9hY2s6CisJaWYgKGVycl9jaHVuaykKKwkJc2N0cF9jaHVua19mcmVlKGVycl9jaHVuayk7Citub21lbV9pbml0OgorCXNjdHBfYXNzb2NpYXRpb25fZnJlZShuZXdfYXNvYyk7Citub21lbToKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9OT01FTTsKK30KKworLyoKKyAqIFJlc3BvbmQgdG8gYSBub3JtYWwgSU5JVCBBQ0sgY2h1bmsuCisgKiBXZSBhcmUgdGhlIHNpZGUgdGhhdCBpcyBpbml0aWF0aW5nIHRoZSBhc3NvY2lhdGlvbi4KKyAqCisgKiBTZWN0aW9uOiA1LjEgTm9ybWFsIEVzdGFibGlzaG1lbnQgb2YgYW4gQXNzb2NpYXRpb24sIEMKKyAqIEMpIFVwb24gcmVjZXB0aW9uIG9mIHRoZSBJTklUIEFDSyBmcm9tICJaIiwgIkEiIHNoYWxsIHN0b3AgdGhlIFQxLWluaXQKKyAqICAgIHRpbWVyIGFuZCBsZWF2ZSBDT09LSUUtV0FJVCBzdGF0ZS4gIkEiIHNoYWxsIHRoZW4gc2VuZCB0aGUgU3RhdGUKKyAqICAgIENvb2tpZSByZWNlaXZlZCBpbiB0aGUgSU5JVCBBQ0sgY2h1bmsgaW4gYSBDT09LSUUgRUNITyBjaHVuaywgc3RhcnQKKyAqICAgIHRoZSBUMS1jb29raWUgdGltZXIsIGFuZCBlbnRlciB0aGUgQ09PS0lFLUVDSE9FRCBzdGF0ZS4KKyAqCisgKiAgICBOb3RlOiBUaGUgQ09PS0lFIEVDSE8gY2h1bmsgY2FuIGJlIGJ1bmRsZWQgd2l0aCBhbnkgcGVuZGluZyBvdXRib3VuZAorICogICAgREFUQSBjaHVua3MsIGJ1dCBpdCBNVVNUIGJlIHRoZSBmaXJzdCBjaHVuayBpbiB0aGUgcGFja2V0IGFuZAorICogICAgdW50aWwgdGhlIENPT0tJRSBBQ0sgaXMgcmV0dXJuZWQgdGhlIHNlbmRlciBNVVNUIE5PVCBzZW5kIGFueQorICogICAgb3RoZXIgcGFja2V0cyB0byB0aGUgcGVlci4KKyAqCisgKiBWZXJpZmljYXRpb24gVGFnOiAzLjMuMworICogICBJZiB0aGUgdmFsdWUgb2YgdGhlIEluaXRpYXRlIFRhZyBpbiBhIHJlY2VpdmVkIElOSVQgQUNLIGNodW5rIGlzCisgKiAgIGZvdW5kIHRvIGJlIDAsIHRoZSByZWNlaXZlciBNVVNUIHRyZWF0IGl0IGFzIGFuIGVycm9yIGFuZCBjbG9zZSB0aGUKKyAqICAgYXNzb2NpYXRpb24gYnkgdHJhbnNtaXR0aW5nIGFuIEFCT1JULgorICoKKyAqIElucHV0cworICogKGVuZHBvaW50LCBhc29jLCBjaHVuaykKKyAqCisgKiBPdXRwdXRzCisgKiAoYXNvYywgcmVwbHlfbXNnLCBtc2dfdXAsIHRpbWVycywgY291bnRlcnMpCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgZGlzcG9zaXRpb24gb2YgdGhlIGNodW5rLgorICovCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl9kb181XzFDX2Fjayhjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSAgICAgICBjb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAorCQkJCSAgICAgICB2b2lkICphcmcsCisJCQkJICAgICAgIHNjdHBfY21kX3NlcV90ICpjb21tYW5kcykKK3sKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmsgPSBhcmc7CisJc2N0cF9pbml0X2NodW5rX3QgKmluaXRjaHVuazsKKwlfX3UzMiBpbml0X3RhZzsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqZXJyX2NodW5rOworCXN0cnVjdCBzY3RwX3BhY2tldCAqcGFja2V0OworCXNjdHBfZGlzcG9zaXRpb25fdCByZXQ7CisKKwlpZiAoIXNjdHBfdnRhZ192ZXJpZnkoY2h1bmssIGFzb2MpKQorCQlyZXR1cm4gc2N0cF9zZl9wZGlzY2FyZChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgSU5JVC1BQ0sgY2h1bmsgaGFzIGEgdmFsaWQgbGVuZ3RoICovCisJaWYgKCFzY3RwX2NodW5rX2xlbmd0aF92YWxpZChjaHVuaywgc2l6ZW9mKHNjdHBfaW5pdGFja19jaHVua190KSkpCisJCXJldHVybiBzY3RwX3NmX3Zpb2xhdGlvbl9jaHVua2xlbihlcCwgYXNvYywgdHlwZSwgYXJnLAorCQkJCQkJICBjb21tYW5kcyk7CisJLyogNi4xMCBCdW5kbGluZworCSAqIEFuIGVuZHBvaW50IE1VU1QgTk9UIGJ1bmRsZSBJTklULCBJTklUIEFDSyBvcgorCSAqIFNIVVRET1dOIENPTVBMRVRFIHdpdGggYW55IG90aGVyIGNodW5rcy4KKwkgKi8KKwlpZiAoIWNodW5rLT5zaW5nbGV0b24pCisJCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX1ZJT0xBVElPTjsKKworCS8qIEdyYWIgdGhlIElOSVQgaGVhZGVyLiAgKi8KKwljaHVuay0+c3ViaC5pbml0X2hkciA9IChzY3RwX2luaXRoZHJfdCAqKSBjaHVuay0+c2tiLT5kYXRhOworCisJaW5pdF90YWcgPSBudG9obChjaHVuay0+c3ViaC5pbml0X2hkci0+aW5pdF90YWcpOworCisJLyogVmVyaWZpY2F0aW9uIFRhZzogMy4zLjMKKwkgKiAgIElmIHRoZSB2YWx1ZSBvZiB0aGUgSW5pdGlhdGUgVGFnIGluIGEgcmVjZWl2ZWQgSU5JVCBBQ0sKKwkgKiAgIGNodW5rIGlzIGZvdW5kIHRvIGJlIDAsIHRoZSByZWNlaXZlciBNVVNUIHRyZWF0IGl0IGFzIGFuCisJICogICBlcnJvciBhbmQgY2xvc2UgdGhlIGFzc29jaWF0aW9uIGJ5IHRyYW5zbWl0dGluZyBhbiBBQk9SVC4KKwkgKi8KKwlpZiAoIWluaXRfdGFnKSB7CisJCXN0cnVjdCBzY3RwX2NodW5rICpyZXBseSA9IHNjdHBfbWFrZV9hYm9ydChhc29jLCBjaHVuaywgMCk7CisJCWlmICghcmVwbHkpCisJCQlnb3RvIG5vbWVtOworCisJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUkVQTFksIFNDVFBfQ0hVTksocmVwbHkpKTsKKwkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9ORVdfU1RBVEUsCisJCQkJU0NUUF9TVEFURShTQ1RQX1NUQVRFX0NMT1NFRCkpOworCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9BQk9SVEVEUyk7CisJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfREVMRVRFX1RDQiwgU0NUUF9OVUxMKCkpOworCQlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9ERUxFVEVfVENCOworCX0KKworCS8qIFZlcmlmeSB0aGUgSU5JVCBjaHVuayBiZWZvcmUgcHJvY2Vzc2luZyBpdC4gKi8KKwllcnJfY2h1bmsgPSBOVUxMOworCWlmICghc2N0cF92ZXJpZnlfaW5pdChhc29jLCBjaHVuay0+Y2h1bmtfaGRyLT50eXBlLAorCQkJICAgICAgKHNjdHBfaW5pdF9jaHVua190ICopY2h1bmstPmNodW5rX2hkciwgY2h1bmssCisJCQkgICAgICAmZXJyX2NodW5rKSkgeworCisJCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX0FCT1JURURTKTsKKworCQkvKiBUaGlzIGNodW5rIGNvbnRhaW5zIGZhdGFsIGVycm9yLiBJdCBpcyB0byBiZSBkaXNjYXJkZWQuCisJCSAqIFNlbmQgYW4gQUJPUlQsIHdpdGggY2F1c2VzIGlmIHRoZXJlIGlzIGFueS4KKwkJICovCisJCWlmIChlcnJfY2h1bmspIHsKKwkJCXBhY2tldCA9IHNjdHBfYWJvcnRfcGt0X25ldyhlcCwgYXNvYywgYXJnLAorCQkJCQkoX191OCAqKShlcnJfY2h1bmstPmNodW5rX2hkcikgKworCQkJCQlzaXplb2Yoc2N0cF9jaHVua2hkcl90KSwKKwkJCQkJbnRvaHMoZXJyX2NodW5rLT5jaHVua19oZHItPmxlbmd0aCkgLQorCQkJCQlzaXplb2Yoc2N0cF9jaHVua2hkcl90KSk7CisKKwkJCXNjdHBfY2h1bmtfZnJlZShlcnJfY2h1bmspOworCisJCQlpZiAocGFja2V0KSB7CisJCQkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9TRU5EX1BLVCwKKwkJCQkJCVNDVFBfUEFDS0VUKHBhY2tldCkpOworCQkJCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX09VVENUUkxDSFVOS1MpOworCQkJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfTkVXX1NUQVRFLAorCQkJCQkJU0NUUF9TVEFURShTQ1RQX1NUQVRFX0NMT1NFRCkpOworCQkJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfREVMRVRFX1RDQiwKKwkJCQkJCVNDVFBfTlVMTCgpKTsKKwkJCQlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9DT05TVU1FOworCQkJfSBlbHNlIHsKKwkJCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX05FV19TVEFURSwKKwkJCQkJCVNDVFBfU1RBVEUoU0NUUF9TVEFURV9DTE9TRUQpKTsKKwkJCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0RFTEVURV9UQ0IsCisJCQkJCQlTQ1RQX05VTEwoKSk7CisJCQkJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fTk9NRU07CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXQgPSBzY3RwX3NmX3RhYm9ydF84XzRfOChlcCwgYXNvYywgdHlwZSwgYXJnLAorCQkJCQkJICAgY29tbWFuZHMpOworCQkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9ORVdfU1RBVEUsCisJCQkJCVNDVFBfU1RBVEUoU0NUUF9TVEFURV9DTE9TRUQpKTsKKwkJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfREVMRVRFX1RDQiwKKwkJCQkJU0NUUF9OVUxMKCkpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCS8qIFRhZyB0aGUgdmFyaWFibGUgbGVuZ3RoIHBhcmFtZXRlcnMuICBOb3RlIHRoYXQgd2UgbmV2ZXIKKwkgKiBjb252ZXJ0IHRoZSBwYXJhbWV0ZXJzIGluIGFuIElOSVQgY2h1bmsuCisJICovCisJY2h1bmstPnBhcmFtX2hkci52ID0gc2tiX3B1bGwoY2h1bmstPnNrYiwgc2l6ZW9mKHNjdHBfaW5pdGhkcl90KSk7CisKKwlpbml0Y2h1bmsgPSAoc2N0cF9pbml0X2NodW5rX3QgKikgY2h1bmstPmNodW5rX2hkcjsKKworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUEVFUl9JTklULAorCQkJU0NUUF9QRUVSX0lOSVQoaW5pdGNodW5rKSk7CisKKwkvKiA1LjEgQykgIkEiIHNoYWxsIHN0b3AgdGhlIFQxLWluaXQgdGltZXIgYW5kIGxlYXZlCisJICogQ09PS0lFLVdBSVQgc3RhdGUuICAiQSIgc2hhbGwgdGhlbiAuLi4gc3RhcnQgdGhlIFQxLWNvb2tpZQorCSAqIHRpbWVyLCBhbmQgZW50ZXIgdGhlIENPT0tJRS1FQ0hPRUQgc3RhdGUuCisJICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9USU1FUl9TVE9QLAorCQkJU0NUUF9UTyhTQ1RQX0VWRU5UX1RJTUVPVVRfVDFfSU5JVCkpOworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVElNRVJfU1RBUlQsCisJCQlTQ1RQX1RPKFNDVFBfRVZFTlRfVElNRU9VVF9UMV9DT09LSUUpKTsKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX05FV19TVEFURSwKKwkJCVNDVFBfU1RBVEUoU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEKSk7CisKKwkvKiA1LjEgQykgIkEiIHNoYWxsIHRoZW4gc2VuZCB0aGUgU3RhdGUgQ29va2llIHJlY2VpdmVkIGluIHRoZQorCSAqIElOSVQgQUNLIGNodW5rIGluIGEgQ09PS0lFIEVDSE8gY2h1bmssIC4uLgorCSAqLworCS8qIElmIHRoZXJlIGlzIGFueSBlcnJvcnMgdG8gcmVwb3J0LCBzZW5kIHRoZSBFUlJPUiBjaHVuayBnZW5lcmF0ZWQKKwkgKiBmb3IgdW5rbm93biBwYXJhbWV0ZXJzIGFzIHdlbGwuCisJICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9HRU5fQ09PS0lFX0VDSE8sCisJCQlTQ1RQX0NIVU5LKGVycl9jaHVuaykpOworCisJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fQ09OU1VNRTsKKworbm9tZW06CisJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fTk9NRU07Cit9CisKKy8qCisgKiBSZXNwb25kIHRvIGEgbm9ybWFsIENPT0tJRSBFQ0hPIGNodW5rLgorICogV2UgYXJlIHRoZSBzaWRlIHRoYXQgaXMgYmVpbmcgYXNrZWQgZm9yIGFuIGFzc29jaWF0aW9uLgorICoKKyAqIFNlY3Rpb246IDUuMSBOb3JtYWwgRXN0YWJsaXNobWVudCBvZiBhbiBBc3NvY2lhdGlvbiwgRAorICogRCkgVXBvbiByZWNlcHRpb24gb2YgdGhlIENPT0tJRSBFQ0hPIGNodW5rLCBFbmRwb2ludCAiWiIgd2lsbCByZXBseQorICogICAgd2l0aCBhIENPT0tJRSBBQ0sgY2h1bmsgYWZ0ZXIgYnVpbGRpbmcgYSBUQ0IgYW5kIG1vdmluZyB0bworICogICAgdGhlIEVTVEFCTElTSEVEIHN0YXRlLiBBIENPT0tJRSBBQ0sgY2h1bmsgbWF5IGJlIGJ1bmRsZWQgd2l0aAorICogICAgYW55IHBlbmRpbmcgREFUQSBjaHVua3MgKGFuZC9vciBTQUNLIGNodW5rcyksIGJ1dCB0aGUgQ09PS0lFIEFDSworICogICAgY2h1bmsgTVVTVCBiZSB0aGUgZmlyc3QgY2h1bmsgaW4gdGhlIHBhY2tldC4KKyAqCisgKiAgIElNUExFTUVOVEFUSU9OIE5PVEU6IEFuIGltcGxlbWVudGF0aW9uIG1heSBjaG9vc2UgdG8gc2VuZCB0aGUKKyAqICAgQ29tbXVuaWNhdGlvbiBVcCBub3RpZmljYXRpb24gdG8gdGhlIFNDVFAgdXNlciB1cG9uIHJlY2VwdGlvbgorICogICBvZiBhIHZhbGlkIENPT0tJRSBFQ0hPIGNodW5rLgorICoKKyAqIFZlcmlmaWNhdGlvbiBUYWc6IDguNS4xIEV4Y2VwdGlvbnMgaW4gVmVyaWZpY2F0aW9uIFRhZyBSdWxlcworICogRCkgUnVsZXMgZm9yIHBhY2tldCBjYXJyeWluZyBhIENPT0tJRSBFQ0hPCisgKgorICogLSBXaGVuIHNlbmRpbmcgYSBDT09LSUUgRUNITywgdGhlIGVuZHBvaW50IE1VU1QgdXNlIHRoZSB2YWx1ZSBvZiB0aGUKKyAqICAgSW5pdGlhbCBUYWcgcmVjZWl2ZWQgaW4gdGhlIElOSVQgQUNLLgorICoKKyAqIC0gVGhlIHJlY2VpdmVyIG9mIGEgQ09PS0lFIEVDSE8gZm9sbG93cyB0aGUgcHJvY2VkdXJlcyBpbiBTZWN0aW9uIDUuCisgKgorICogSW5wdXRzCisgKiAoZW5kcG9pbnQsIGFzb2MsIGNodW5rKQorICoKKyAqIE91dHB1dHMKKyAqIChhc29jLCByZXBseV9tc2csIG1zZ191cCwgdGltZXJzLCBjb3VudGVycykKKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBkaXNwb3NpdGlvbiBvZiB0aGUgY2h1bmsuCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2RvXzVfMURfY2UoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSAgICAgIGNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsIHZvaWQgKmFyZywKKwkJCQkgICAgICBzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rID0gYXJnOworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICpuZXdfYXNvYzsKKwlzY3RwX2luaXRfY2h1bmtfdCAqcGVlcl9pbml0OworCXN0cnVjdCBzY3RwX2NodW5rICpyZXBsOworCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldjsKKwlpbnQgZXJyb3IgPSAwOworCXN0cnVjdCBzY3RwX2NodW5rICplcnJfY2hrX3A7CisKKwkvKiBJZiB0aGUgcGFja2V0IGlzIGFuIE9PVEIgcGFja2V0IHdoaWNoIGlzIHRlbXBvcmFyaWx5IG9uIHRoZQorCSAqIGNvbnRyb2wgZW5kcG9pbnQsIHJlc3BvbmQgd2l0aCBhbiBBQk9SVC4KKwkgKi8KKwlpZiAoZXAgPT0gc2N0cF9zaygoc2N0cF9nZXRfY3RsX3NvY2soKSkpLT5lcCkKKwkJcmV0dXJuIHNjdHBfc2Zfb290YihlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgQ09PS0lFX0VDSE8gY2h1bmsgaGFzIGEgdmFsaWQgbGVuZ3RoLgorCSAqIEluIHRoaXMgY2FzZSwgd2UgY2hlY2sgdGhhdCB3ZSBoYXZlIGVub3VnaCBmb3IgYXQgbGVhc3QgYQorCSAqIGNodW5rIGhlYWRlci4gIE1vcmUgZGV0YWlsZWQgdmVyaWZpY2F0aW9uIGlzIGRvbmUKKwkgKiBpbiBzY3RwX3VucGFja19jb29raWUoKS4KKwkgKi8KKwlpZiAoIXNjdHBfY2h1bmtfbGVuZ3RoX3ZhbGlkKGNodW5rLCBzaXplb2Yoc2N0cF9jaHVua2hkcl90KSkpCisJCXJldHVybiBzY3RwX3NmX3BkaXNjYXJkKGVwLCBhc29jLCB0eXBlLCBhcmcsIGNvbW1hbmRzKTsKKworCS8qICJEZWNvZGUiIHRoZSBjaHVuay4gIFdlIGhhdmUgbm8gb3B0aW9uYWwgcGFyYW1ldGVycyBzbyB3ZQorCSAqIGFyZSBpbiBnb29kIHNoYXBlLgorCSAqLworICAgICAgICBjaHVuay0+c3ViaC5jb29raWVfaGRyID0KKwkJKHN0cnVjdCBzY3RwX3NpZ25lZF9jb29raWUgKiljaHVuay0+c2tiLT5kYXRhOworCXNrYl9wdWxsKGNodW5rLT5za2IsCisJCSBudG9ocyhjaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpIC0gc2l6ZW9mKHNjdHBfY2h1bmtoZHJfdCkpOworCisJLyogNS4xIEQpIFVwb24gcmVjZXB0aW9uIG9mIHRoZSBDT09LSUUgRUNITyBjaHVuaywgRW5kcG9pbnQKKwkgKiAiWiIgd2lsbCByZXBseSB3aXRoIGEgQ09PS0lFIEFDSyBjaHVuayBhZnRlciBidWlsZGluZyBhIFRDQgorCSAqIGFuZCBtb3ZpbmcgdG8gdGhlIEVTVEFCTElTSEVEIHN0YXRlLgorCSAqLworCW5ld19hc29jID0gc2N0cF91bnBhY2tfY29va2llKGVwLCBhc29jLCBjaHVuaywgR0ZQX0FUT01JQywgJmVycm9yLAorCQkJCSAgICAgICZlcnJfY2hrX3ApOworCisJLyogRklYTUU6CisJICogSWYgdGhlIHJlLWJ1aWxkIGZhaWxlZCwgd2hhdCBpcyB0aGUgcHJvcGVyIGVycm9yIHBhdGgKKwkgKiBmcm9tIGhlcmU/CisJICoKKwkgKiBbV2Ugc2hvdWxkIGFib3J0IHRoZSBhc3NvY2lhdGlvbi4gLS1waWdneV0KKwkgKi8KKwlpZiAoIW5ld19hc29jKSB7CisJCS8qIEZJWE1FOiBTZXZlcmFsIGVycm9ycyBhcmUgcG9zc2libGUuICBBIGJhZCBjb29raWUgc2hvdWxkCisJCSAqIGJlIHNpbGVudGx5IGRpc2NhcmRlZCwgYnV0IHRoaW5rIGFib3V0IGxvZ2dpbmcgaXQgdG9vLgorCQkgKi8KKwkJc3dpdGNoIChlcnJvcikgeworCQljYXNlIC1TQ1RQX0lFUlJPUl9OT01FTToKKwkJCWdvdG8gbm9tZW07CisKKwkJY2FzZSAtU0NUUF9JRVJST1JfU1RBTEVfQ09PS0lFOgorCQkJc2N0cF9zZW5kX3N0YWxlX2Nvb2tpZV9lcnIoZXAsIGFzb2MsIGNodW5rLCBjb21tYW5kcywKKwkJCQkJCSAgIGVycl9jaGtfcCk7CisJCQlyZXR1cm4gc2N0cF9zZl9wZGlzY2FyZChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7CisKKwkJY2FzZSAtU0NUUF9JRVJST1JfQkFEX1NJRzoKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBzY3RwX3NmX3BkaXNjYXJkKGVwLCBhc29jLCB0eXBlLCBhcmcsIGNvbW1hbmRzKTsKKwkJfTsKKwl9CisKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX05FV19BU09DLCBTQ1RQX0FTT0MobmV3X2Fzb2MpKTsKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX05FV19TVEFURSwKKwkJCVNDVFBfU1RBVEUoU0NUUF9TVEFURV9FU1RBQkxJU0hFRCkpOworCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX0NVUlJFU1RBQik7CisJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfUEFTU0lWRUVTVEFCUyk7CisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9IQl9USU1FUlNfU1RBUlQsIFNDVFBfTlVMTCgpKTsKKworCWlmIChuZXdfYXNvYy0+YXV0b2Nsb3NlKQorCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RJTUVSX1NUQVJULAorCQkJCVNDVFBfVE8oU0NUUF9FVkVOVF9USU1FT1VUX0FVVE9DTE9TRSkpOworCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9UUkFOU01JVCwgU0NUUF9OVUxMKCkpOworCisJLyogUmUtYnVpbGQgdGhlIGJpbmQgYWRkcmVzcyBmb3IgdGhlIGFzc29jaWF0aW9uIGlzIGRvbmUgaW4KKwkgKiB0aGUgc2N0cF91bnBhY2tfY29va2llKCkgYWxyZWFkeS4KKwkgKi8KKwkvKiBUaGlzIGlzIGEgYnJhbmQtbmV3IGFzc29jaWF0aW9uLCBzbyB0aGVzZSBhcmUgbm90IHlldCBzaWRlCisJICogZWZmZWN0cy0taXQgaXMgc2FmZSB0byBydW4gdGhlbSBoZXJlLgorCSAqLworCXBlZXJfaW5pdCA9ICZjaHVuay0+c3ViaC5jb29raWVfaGRyLT5jLnBlZXJfaW5pdFswXTsKKworCWlmICghc2N0cF9wcm9jZXNzX2luaXQobmV3X2Fzb2MsIGNodW5rLT5jaHVua19oZHItPnR5cGUsCisJCQkgICAgICAgJmNodW5rLT5zdWJoLmNvb2tpZV9oZHItPmMucGVlcl9hZGRyLAorCQkJICAgICAgIHBlZXJfaW5pdCwgR0ZQX0FUT01JQykpCisJCWdvdG8gbm9tZW1faW5pdDsKKworCXJlcGwgPSBzY3RwX21ha2VfY29va2llX2FjayhuZXdfYXNvYywgY2h1bmspOworCWlmICghcmVwbCkKKwkJZ290byBub21lbV9yZXBsOworCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9SRVBMWSwgU0NUUF9DSFVOSyhyZXBsKSk7CisKKwkvKiBSRkMgMjk2MCA1LjEgTm9ybWFsIEVzdGFibGlzaG1lbnQgb2YgYW4gQXNzb2NpYXRpb24KKwkgKgorCSAqIEQpIElNUExFTUVOVEFUSU9OIE5PVEU6IEFuIGltcGxlbWVudGF0aW9uIG1heSBjaG9vc2UgdG8KKwkgKiBzZW5kIHRoZSBDb21tdW5pY2F0aW9uIFVwIG5vdGlmaWNhdGlvbiB0byB0aGUgU0NUUCB1c2VyCisJICogdXBvbiByZWNlcHRpb24gb2YgYSB2YWxpZCBDT09LSUUgRUNITyBjaHVuay4KKwkgKi8KKwlldiA9IHNjdHBfdWxwZXZlbnRfbWFrZV9hc3NvY19jaGFuZ2UobmV3X2Fzb2MsIDAsIFNDVFBfQ09NTV9VUCwgMCwKKwkJCQkJICAgICBuZXdfYXNvYy0+Yy5zaW5pdF9udW1fb3N0cmVhbXMsCisJCQkJCSAgICAgbmV3X2Fzb2MtPmMuc2luaXRfbWF4X2luc3RyZWFtcywKKwkJCQkJICAgICBHRlBfQVRPTUlDKTsKKwlpZiAoIWV2KQorCQlnb3RvIG5vbWVtX2V2OworCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9FVkVOVF9VTFAsIFNDVFBfVUxQRVZFTlQoZXYpKTsKKworCS8qIFNvY2tldHMgQVBJIERyYWZ0IFNlY3Rpb24gNS4zLjEuNiAJCisJICogV2hlbiBhIHBlZXIgc2VuZHMgYSBBZGFwdGlvbiBMYXllciBJbmRpY2F0aW9uIHBhcmFtZXRlciAsIFNDVFAKKwkgKiBkZWxpdmVycyB0aGlzIG5vdGlmaWNhdGlvbiB0byBpbmZvcm0gdGhlIGFwcGxpY2F0aW9uIHRoYXQgb2YgdGhlCisJICogcGVlcnMgcmVxdWVzdGVkIGFkYXB0aW9uIGxheWVyLgorCSAqLworCWlmIChuZXdfYXNvYy0+cGVlci5hZGFwdGlvbl9pbmQpIHsKKwkJZXYgPSBzY3RwX3VscGV2ZW50X21ha2VfYWRhcHRpb25faW5kaWNhdGlvbihuZXdfYXNvYywKKwkJCQkJCQkgICAgR0ZQX0FUT01JQyk7CisJCWlmICghZXYpCisJCQlnb3RvIG5vbWVtX2V2OworCisJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfRVZFTlRfVUxQLAorCQkJCVNDVFBfVUxQRVZFTlQoZXYpKTsKKwl9CisKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9DT05TVU1FOworCitub21lbV9ldjoKKwlzY3RwX2NodW5rX2ZyZWUocmVwbCk7Citub21lbV9yZXBsOgorbm9tZW1faW5pdDoKKwlzY3RwX2Fzc29jaWF0aW9uX2ZyZWUobmV3X2Fzb2MpOworbm9tZW06CisJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fTk9NRU07Cit9CisKKy8qCisgKiBSZXNwb25kIHRvIGEgbm9ybWFsIENPT0tJRSBBQ0sgY2h1bmsuCisgKiBXZSBhcmUgdGhlIHNpZGUgdGhhdCBpcyBiZWluZyBhc2tlZCBmb3IgYW4gYXNzb2NpYXRpb24uCisgKgorICogUkZDIDI5NjAgNS4xIE5vcm1hbCBFc3RhYmxpc2htZW50IG9mIGFuIEFzc29jaWF0aW9uCisgKgorICogRSkgVXBvbiByZWNlcHRpb24gb2YgdGhlIENPT0tJRSBBQ0ssIGVuZHBvaW50ICJBIiB3aWxsIG1vdmUgZnJvbSB0aGUKKyAqICAgIENPT0tJRS1FQ0hPRUQgc3RhdGUgdG8gdGhlIEVTVEFCTElTSEVEIHN0YXRlLCBzdG9wcGluZyB0aGUgVDEtY29va2llCisgKiAgICB0aW1lci4gSXQgbWF5IGFsc28gbm90aWZ5IGl0cyBVTFAgYWJvdXQgdGhlIHN1Y2Nlc3NmdWwKKyAqICAgIGVzdGFibGlzaG1lbnQgb2YgdGhlIGFzc29jaWF0aW9uIHdpdGggYSBDb21tdW5pY2F0aW9uIFVwCisgKiAgICBub3RpZmljYXRpb24gKHNlZSBTZWN0aW9uIDEwKS4KKyAqCisgKiBWZXJpZmljYXRpb24gVGFnOgorICogSW5wdXRzCisgKiAoZW5kcG9pbnQsIGFzb2MsIGNodW5rKQorICoKKyAqIE91dHB1dHMKKyAqIChhc29jLCByZXBseV9tc2csIG1zZ191cCwgdGltZXJzLCBjb3VudGVycykKKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBkaXNwb3NpdGlvbiBvZiB0aGUgY2h1bmsuCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2RvXzVfMUVfY2EoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSAgICAgIGNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsIHZvaWQgKmFyZywKKwkJCQkgICAgICBzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rID0gYXJnOworCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldjsKKworCWlmICghc2N0cF92dGFnX3ZlcmlmeShjaHVuaywgYXNvYykpCisJCXJldHVybiBzY3RwX3NmX3BkaXNjYXJkKGVwLCBhc29jLCB0eXBlLCBhcmcsIGNvbW1hbmRzKTsKKworCS8qIFZlcmlmeSB0aGF0IHRoZSBjaHVuayBsZW5ndGggZm9yIHRoZSBDT09LSUUtQUNLIGlzIE9LLgorCSAqIElmIHdlIGRvbid0IGRvIHRoaXMsIGFueSBidW5kbGVkIGNodW5rcyBtYXkgYmUganVua2VkLgorCSAqLworCWlmICghc2N0cF9jaHVua19sZW5ndGhfdmFsaWQoY2h1bmssIHNpemVvZihzY3RwX2NodW5raGRyX3QpKSkKKwkJcmV0dXJuIHNjdHBfc2ZfdmlvbGF0aW9uX2NodW5rbGVuKGVwLCBhc29jLCB0eXBlLCBhcmcsCisJCQkJCQkgIGNvbW1hbmRzKTsKKworCS8qIFJlc2V0IGluaXQgZXJyb3IgY291bnQgdXBvbiByZWNlaXB0IG9mIENPT0tJRS1BQ0ssCisJICogdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCB0aGUgbWFuYWdlbWVtZW50IG9mIHRoaXMKKwkgKiBjb3VudGVyIGluIHN0YWxlIGNvb2tpZSBzaXR1YXRpb25zIHdoZW4gYSB0cmFuc2l0aW9uIGJhY2sKKwkgKiBmcm9tIHRoZSBDT09LSUUtRUNIT0VEIHN0YXRlIHRvIHRoZSBDT09LSUUtV0FJVAorCSAqIHN0YXRlIGlzIHBlcmZvcm1lZC4KKwkgKi8KKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0NPVU5URVJfUkVTRVQsCisJICAgICAgICAgICAgICAgIFNDVFBfQ09VTlRFUihTQ1RQX0NPVU5URVJfSU5JVF9FUlJPUikpOworCisJLyogUkZDIDI5NjAgNS4xIE5vcm1hbCBFc3RhYmxpc2htZW50IG9mIGFuIEFzc29jaWF0aW9uCisJICoKKwkgKiBFKSBVcG9uIHJlY2VwdGlvbiBvZiB0aGUgQ09PS0lFIEFDSywgZW5kcG9pbnQgIkEiIHdpbGwgbW92ZQorCSAqIGZyb20gdGhlIENPT0tJRS1FQ0hPRUQgc3RhdGUgdG8gdGhlIEVTVEFCTElTSEVEIHN0YXRlLAorCSAqIHN0b3BwaW5nIHRoZSBUMS1jb29raWUgdGltZXIuCisJICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9USU1FUl9TVE9QLAorCQkJU0NUUF9UTyhTQ1RQX0VWRU5UX1RJTUVPVVRfVDFfQ09PS0lFKSk7CisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9ORVdfU1RBVEUsCisJCQlTQ1RQX1NUQVRFKFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQpKTsKKwlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9DVVJSRVNUQUIpOworCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX0FDVElWRUVTVEFCUyk7CisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9IQl9USU1FUlNfU1RBUlQsIFNDVFBfTlVMTCgpKTsKKwlpZiAoYXNvYy0+YXV0b2Nsb3NlKQorCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RJTUVSX1NUQVJULAorCQkJCVNDVFBfVE8oU0NUUF9FVkVOVF9USU1FT1VUX0FVVE9DTE9TRSkpOworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVFJBTlNNSVQsIFNDVFBfTlVMTCgpKTsKKworCS8qIEl0IG1heSBhbHNvIG5vdGlmeSBpdHMgVUxQIGFib3V0IHRoZSBzdWNjZXNzZnVsCisJICogZXN0YWJsaXNobWVudCBvZiB0aGUgYXNzb2NpYXRpb24gd2l0aCBhIENvbW11bmljYXRpb24gVXAKKwkgKiBub3RpZmljYXRpb24gKHNlZSBTZWN0aW9uIDEwKS4KKwkgKi8KKwlldiA9IHNjdHBfdWxwZXZlbnRfbWFrZV9hc3NvY19jaGFuZ2UoYXNvYywgMCwgU0NUUF9DT01NX1VQLAorCQkJCQkgICAgIDAsIGFzb2MtPmMuc2luaXRfbnVtX29zdHJlYW1zLAorCQkJCQkgICAgIGFzb2MtPmMuc2luaXRfbWF4X2luc3RyZWFtcywKKwkJCQkJICAgICBHRlBfQVRPTUlDKTsKKworCWlmICghZXYpCisJCWdvdG8gbm9tZW07CisKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0VWRU5UX1VMUCwgU0NUUF9VTFBFVkVOVChldikpOworCisJLyogU29ja2V0cyBBUEkgRHJhZnQgU2VjdGlvbiA1LjMuMS42CisJICogV2hlbiBhIHBlZXIgc2VuZHMgYSBBZGFwdGlvbiBMYXllciBJbmRpY2F0aW9uIHBhcmFtZXRlciAsIFNDVFAKKwkgKiBkZWxpdmVycyB0aGlzIG5vdGlmaWNhdGlvbiB0byBpbmZvcm0gdGhlIGFwcGxpY2F0aW9uIHRoYXQgb2YgdGhlCisJICogcGVlcnMgcmVxdWVzdGVkIGFkYXB0aW9uIGxheWVyLgorCSAqLworCWlmIChhc29jLT5wZWVyLmFkYXB0aW9uX2luZCkgeworCQlldiA9IHNjdHBfdWxwZXZlbnRfbWFrZV9hZGFwdGlvbl9pbmRpY2F0aW9uKGFzb2MsIEdGUF9BVE9NSUMpOworCQlpZiAoIWV2KQorCQkJZ290byBub21lbTsKKworCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0VWRU5UX1VMUCwKKwkJCQlTQ1RQX1VMUEVWRU5UKGV2KSk7CisJfQorCisJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fQ09OU1VNRTsKK25vbWVtOgorCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX05PTUVNOworfQorCisvKiBHZW5lcmF0ZSBhbmQgc2VuZG91dCBhIGhlYXJ0YmVhdCBwYWNrZXQuICAqLworc3RhdGljIHNjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2hlYXJ0YmVhdChjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkJCSAgICBjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkJICAgIGNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJCQkJCSAgICB2b2lkICphcmcsCisJCQkJCSAgICBzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQgPSAoc3RydWN0IHNjdHBfdHJhbnNwb3J0ICopIGFyZzsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqcmVwbHk7CisJc2N0cF9zZW5kZXJfaGJfaW5mb190IGhiaW5mbzsKKwlzaXplX3QgcGF5bGVuID0gMDsKKworCWhiaW5mby5wYXJhbV9oZHIudHlwZSA9IFNDVFBfUEFSQU1fSEVBUlRCRUFUX0lORk87CisJaGJpbmZvLnBhcmFtX2hkci5sZW5ndGggPSBodG9ucyhzaXplb2Yoc2N0cF9zZW5kZXJfaGJfaW5mb190KSk7CisJaGJpbmZvLmRhZGRyID0gdHJhbnNwb3J0LT5pcGFkZHI7CisJaGJpbmZvLnNlbnRfYXQgPSBqaWZmaWVzOworCisJLyogU2VuZCBhIGhlYXJ0YmVhdCB0byBvdXIgcGVlci4gICovCisJcGF5bGVuID0gc2l6ZW9mKHNjdHBfc2VuZGVyX2hiX2luZm9fdCk7CisJcmVwbHkgPSBzY3RwX21ha2VfaGVhcnRiZWF0KGFzb2MsIHRyYW5zcG9ydCwgJmhiaW5mbywgcGF5bGVuKTsKKwlpZiAoIXJlcGx5KQorCQlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9OT01FTTsKKworCS8qIFNldCBydG9fcGVuZGluZyBpbmRpY2F0aW5nIHRoYXQgYW4gUlRUIG1lYXN1cmVtZW50CisJICogaXMgc3RhcnRlZCB3aXRoIHRoaXMgaGVhcnRiZWF0IGNodW5rLgorCSAqLworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUlRPX1BFTkRJTkcsCisJCQlTQ1RQX1RSQU5TUE9SVCh0cmFuc3BvcnQpKTsKKworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUkVQTFksIFNDVFBfQ0hVTksocmVwbHkpKTsKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9DT05TVU1FOworfQorCisvKiBHZW5lcmF0ZSBhIEhFQVJUQkVBVCBwYWNrZXQgb24gdGhlIGdpdmVuIHRyYW5zcG9ydC4gICovCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl9zZW5kYmVhdF84XzMoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCQljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkJY29uc3Qgc2N0cF9zdWJ0eXBlX3QgdHlwZSwKKwkJCQkJdm9pZCAqYXJnLAorCQkJCQlzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQgPSAoc3RydWN0IHNjdHBfdHJhbnNwb3J0ICopIGFyZzsKKworCWlmIChhc29jLT5vdmVyYWxsX2Vycm9yX2NvdW50ID4gYXNvYy0+bWF4X3JldHJhbnMpIHsKKwkJLyogQ01EX0FTU09DX0ZBSUxFRCBjYWxscyBDTURfREVMRVRFX1RDQi4gKi8KKwkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9BU1NPQ19GQUlMRUQsCisJCQkJU0NUUF9VMzIoU0NUUF9FUlJPUl9OT19FUlJPUikpOworCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9BQk9SVEVEUyk7CisJCVNDVFBfREVDX1NUQVRTKFNDVFBfTUlCX0NVUlJFU1RBQik7CisJCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0RFTEVURV9UQ0I7CisJfQorCisJLyogU2VjdGlvbiAzLjMuNS4KKwkgKiBUaGUgU2VuZGVyLXNwZWNpZmljIEhlYXJ0YmVhdCBJbmZvIGZpZWxkIHNob3VsZCBub3JtYWxseSBpbmNsdWRlCisJICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbmRlcidzIGN1cnJlbnQgdGltZSB3aGVuIHRoaXMgSEVBUlRCRUFUCisJICogY2h1bmsgaXMgc2VudCBhbmQgdGhlIGRlc3RpbmF0aW9uIHRyYW5zcG9ydCBhZGRyZXNzIHRvIHdoaWNoIHRoaXMKKwkgKiBIRUFSVEJFQVQgaXMgc2VudCAoc2VlIFNlY3Rpb24gOC4zKS4KKwkgKi8KKworCWlmICh0cmFuc3BvcnQtPmhiX2FsbG93ZWQpIHsKKwkJaWYgKFNDVFBfRElTUE9TSVRJT05fTk9NRU0gPT0KKwkJCQlzY3RwX3NmX2hlYXJ0YmVhdChlcCwgYXNvYywgdHlwZSwgYXJnLAorCQkJCQkJICBjb21tYW5kcykpCisJCQlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9OT01FTTsKKwkJLyogU2V0IHRyYW5zcG9ydCBlcnJvciBjb3VudGVyIGFuZCBhc3NvY2lhdGlvbiBlcnJvciBjb3VudGVyCisJCSAqIHdoZW4gc2VuZGluZyBoZWFydGJlYXQuCisJCSAqLworCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RSQU5TUE9SVF9SRVNFVCwKKwkJCQlTQ1RQX1RSQU5TUE9SVCh0cmFuc3BvcnQpKTsKKwl9CisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9IQl9USU1FUl9VUERBVEUsCisJCQlTQ1RQX1RSQU5TUE9SVCh0cmFuc3BvcnQpKTsKKworICAgICAgICByZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9DT05TVU1FOworfQorCisvKgorICogUHJvY2VzcyBhbiBoZWFydGJlYXQgcmVxdWVzdC4KKyAqCisgKiBTZWN0aW9uOiA4LjMgUGF0aCBIZWFydGJlYXQKKyAqIFRoZSByZWNlaXZlciBvZiB0aGUgSEVBUlRCRUFUIHNob3VsZCBpbW1lZGlhdGVseSByZXNwb25kIHdpdGggYQorICogSEVBUlRCRUFUIEFDSyB0aGF0IGNvbnRhaW5zIHRoZSBIZWFydGJlYXQgSW5mb3JtYXRpb24gZmllbGQgY29waWVkCisgKiBmcm9tIHRoZSByZWNlaXZlZCBIRUFSVEJFQVQgY2h1bmsuCisgKgorICogVmVyaWZpY2F0aW9uIFRhZzogIDguNSBWZXJpZmljYXRpb24gVGFnIFtOb3JtYWwgdmVyaWZpY2F0aW9uXQorICogV2hlbiByZWNlaXZpbmcgYW4gU0NUUCBwYWNrZXQsIHRoZSBlbmRwb2ludCBNVVNUIGVuc3VyZSB0aGF0IHRoZQorICogdmFsdWUgaW4gdGhlIFZlcmlmaWNhdGlvbiBUYWcgZmllbGQgb2YgdGhlIHJlY2VpdmVkIFNDVFAgcGFja2V0CisgKiBtYXRjaGVzIGl0cyBvd24gVGFnLiBJZiB0aGUgcmVjZWl2ZWQgVmVyaWZpY2F0aW9uIFRhZyB2YWx1ZSBkb2VzIG5vdAorICogbWF0Y2ggdGhlIHJlY2VpdmVyJ3Mgb3duIHRhZyB2YWx1ZSwgdGhlIHJlY2VpdmVyIHNoYWxsIHNpbGVudGx5CisgKiBkaXNjYXJkIHRoZSBwYWNrZXQgYW5kIHNoYWxsIG5vdCBwcm9jZXNzIGl0IGFueSBmdXJ0aGVyIGV4Y2VwdCBmb3IKKyAqIHRob3NlIGNhc2VzIGxpc3RlZCBpbiBTZWN0aW9uIDguNS4xIGJlbG93LgorICoKKyAqIElucHV0cworICogKGVuZHBvaW50LCBhc29jLCBjaHVuaykKKyAqCisgKiBPdXRwdXRzCisgKiAoYXNvYywgcmVwbHlfbXNnLCBtc2dfdXAsIHRpbWVycywgY291bnRlcnMpCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgZGlzcG9zaXRpb24gb2YgdGhlIGNodW5rLgorICovCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl9iZWF0XzhfMyhjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSAgICBjb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAorCQkJCSAgICB2b2lkICphcmcsCisJCQkJICAgIHNjdHBfY21kX3NlcV90ICpjb21tYW5kcykKK3sKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmsgPSBhcmc7CisJc3RydWN0IHNjdHBfY2h1bmsgKnJlcGx5OworCXNpemVfdCBwYXlsZW4gPSAwOworCisJaWYgKCFzY3RwX3Z0YWdfdmVyaWZ5KGNodW5rLCBhc29jKSkKKwkJcmV0dXJuIHNjdHBfc2ZfcGRpc2NhcmQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworCisJLyogTWFrZSBzdXJlIHRoYXQgdGhlIEhFQVJUQkVBVCBjaHVuayBoYXMgYSB2YWxpZCBsZW5ndGguICovCisJaWYgKCFzY3RwX2NodW5rX2xlbmd0aF92YWxpZChjaHVuaywgc2l6ZW9mKHNjdHBfaGVhcnRiZWF0X2NodW5rX3QpKSkKKwkJcmV0dXJuIHNjdHBfc2ZfdmlvbGF0aW9uX2NodW5rbGVuKGVwLCBhc29jLCB0eXBlLCBhcmcsCisJCQkJCQkgIGNvbW1hbmRzKTsKKworCS8qIDguMyBUaGUgcmVjZWl2ZXIgb2YgdGhlIEhFQVJUQkVBVCBzaG91bGQgaW1tZWRpYXRlbHkKKwkgKiByZXNwb25kIHdpdGggYSBIRUFSVEJFQVQgQUNLIHRoYXQgY29udGFpbnMgdGhlIEhlYXJ0YmVhdAorCSAqIEluZm9ybWF0aW9uIGZpZWxkIGNvcGllZCBmcm9tIHRoZSByZWNlaXZlZCBIRUFSVEJFQVQgY2h1bmsuCisJICovCisJY2h1bmstPnN1YmguaGJfaGRyID0gKHNjdHBfaGVhcnRiZWF0aGRyX3QgKikgY2h1bmstPnNrYi0+ZGF0YTsKKwlwYXlsZW4gPSBudG9ocyhjaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpIC0gc2l6ZW9mKHNjdHBfY2h1bmtoZHJfdCk7CisJc2tiX3B1bGwoY2h1bmstPnNrYiwgcGF5bGVuKTsKKworCXJlcGx5ID0gc2N0cF9tYWtlX2hlYXJ0YmVhdF9hY2soYXNvYywgY2h1bmssCisJCQkJCWNodW5rLT5zdWJoLmhiX2hkciwgcGF5bGVuKTsKKwlpZiAoIXJlcGx5KQorCQlnb3RvIG5vbWVtOworCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9SRVBMWSwgU0NUUF9DSFVOSyhyZXBseSkpOworCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0NPTlNVTUU7CisKK25vbWVtOgorCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX05PTUVNOworfQorCisvKgorICogUHJvY2VzcyB0aGUgcmV0dXJuaW5nIEhFQVJUQkVBVCBBQ0suCisgKgorICogU2VjdGlvbjogOC4zIFBhdGggSGVhcnRiZWF0CisgKiBVcG9uIHRoZSByZWNlaXB0IG9mIHRoZSBIRUFSVEJFQVQgQUNLLCB0aGUgc2VuZGVyIG9mIHRoZSBIRUFSVEJFQVQKKyAqIHNob3VsZCBjbGVhciB0aGUgZXJyb3IgY291bnRlciBvZiB0aGUgZGVzdGluYXRpb24gdHJhbnNwb3J0CisgKiBhZGRyZXNzIHRvIHdoaWNoIHRoZSBIRUFSVEJFQVQgd2FzIHNlbnQsIGFuZCBtYXJrIHRoZSBkZXN0aW5hdGlvbgorICogdHJhbnNwb3J0IGFkZHJlc3MgYXMgYWN0aXZlIGlmIGl0IGlzIG5vdCBzbyBtYXJrZWQuIFRoZSBlbmRwb2ludCBtYXkKKyAqIG9wdGlvbmFsbHkgcmVwb3J0IHRvIHRoZSB1cHBlciBsYXllciB3aGVuIGFuIGluYWN0aXZlIGRlc3RpbmF0aW9uCisgKiBhZGRyZXNzIGlzIG1hcmtlZCBhcyBhY3RpdmUgZHVlIHRvIHRoZSByZWNlcHRpb24gb2YgdGhlIGxhdGVzdAorICogSEVBUlRCRUFUIEFDSy4gVGhlIHJlY2VpdmVyIG9mIHRoZSBIRUFSVEJFQVQgQUNLIG11c3QgYWxzbworICogY2xlYXIgdGhlIGFzc29jaWF0aW9uIG92ZXJhbGwgZXJyb3IgY291bnQgYXMgd2VsbCAoYXMgZGVmaW5lZAorICogaW4gc2VjdGlvbiA4LjEpLgorICoKKyAqIFRoZSByZWNlaXZlciBvZiB0aGUgSEVBUlRCRUFUIEFDSyBzaG91bGQgYWxzbyBwZXJmb3JtIGFuIFJUVAorICogbWVhc3VyZW1lbnQgZm9yIHRoYXQgZGVzdGluYXRpb24gdHJhbnNwb3J0IGFkZHJlc3MgdXNpbmcgdGhlIHRpbWUKKyAqIHZhbHVlIGNhcnJpZWQgaW4gdGhlIEhFQVJUQkVBVCBBQ0sgY2h1bmsuCisgKgorICogVmVyaWZpY2F0aW9uIFRhZzogIDguNSBWZXJpZmljYXRpb24gVGFnIFtOb3JtYWwgdmVyaWZpY2F0aW9uXQorICoKKyAqIElucHV0cworICogKGVuZHBvaW50LCBhc29jLCBjaHVuaykKKyAqCisgKiBPdXRwdXRzCisgKiAoYXNvYywgcmVwbHlfbXNnLCBtc2dfdXAsIHRpbWVycywgY291bnRlcnMpCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgZGlzcG9zaXRpb24gb2YgdGhlIGNodW5rLgorICovCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl9iYWNrYmVhdF84XzMoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCQljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkJY29uc3Qgc2N0cF9zdWJ0eXBlX3QgdHlwZSwKKwkJCQkJdm9pZCAqYXJnLAorCQkJCQlzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rID0gYXJnOworCXVuaW9uIHNjdHBfYWRkciBmcm9tX2FkZHI7CisJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpsaW5rOworCXNjdHBfc2VuZGVyX2hiX2luZm9fdCAqaGJpbmZvOworCXVuc2lnbmVkIGxvbmcgbWF4X2ludGVydmFsOworCisJaWYgKCFzY3RwX3Z0YWdfdmVyaWZ5KGNodW5rLCBhc29jKSkKKwkJcmV0dXJuIHNjdHBfc2ZfcGRpc2NhcmQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworCisJLyogTWFrZSBzdXJlIHRoYXQgdGhlIEhFQVJUQkVBVC1BQ0sgY2h1bmsgaGFzIGEgdmFsaWQgbGVuZ3RoLiAgKi8KKwlpZiAoIXNjdHBfY2h1bmtfbGVuZ3RoX3ZhbGlkKGNodW5rLCBzaXplb2Yoc2N0cF9oZWFydGJlYXRfY2h1bmtfdCkpKQorCQlyZXR1cm4gc2N0cF9zZl92aW9sYXRpb25fY2h1bmtsZW4oZXAsIGFzb2MsIHR5cGUsIGFyZywKKwkJCQkJCSAgY29tbWFuZHMpOworCisJaGJpbmZvID0gKHNjdHBfc2VuZGVyX2hiX2luZm9fdCAqKSBjaHVuay0+c2tiLT5kYXRhOworCWZyb21fYWRkciA9IGhiaW5mby0+ZGFkZHI7CisJbGluayA9IHNjdHBfYXNzb2NfbG9va3VwX3BhZGRyKGFzb2MsICZmcm9tX2FkZHIpOworCisJLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgbGV0cyBsb2cgaXQgaWYgc28uICAqLworCWlmICghbGluaykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6IENvdWxkIG5vdCBmaW5kIGFkZHJlc3MgJWQuJWQuJWQuJWRcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIE5JUFFVQUQoZnJvbV9hZGRyLnY0LnNpbl9hZGRyKSk7CisJCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0RJU0NBUkQ7CisJfQorCisJbWF4X2ludGVydmFsID0gbGluay0+aGJfaW50ZXJ2YWwgKyBsaW5rLT5ydG87CisKKwkvKiBDaGVjayBpZiB0aGUgdGltZXN0YW1wIGxvb2tzIHZhbGlkLiAgKi8KKwlpZiAodGltZV9hZnRlcihoYmluZm8tPnNlbnRfYXQsIGppZmZpZXMpIHx8CisJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgaGJpbmZvLT5zZW50X2F0ICsgbWF4X2ludGVydmFsKSkgeworCQlTQ1RQX0RFQlVHX1BSSU5USygiJXM6IEhFQVJUQkVBVCBBQ0sgd2l0aCBpbnZhbGlkIHRpbWVzdGFtcCIKKwkJCQkgICJyZWNlaXZlZCBmb3IgdHJhbnNwb3J0OiAlcFxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18sIGxpbmspOworCQlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9ESVNDQVJEOworCX0KKworCS8qIDguMyBVcG9uIHRoZSByZWNlaXB0IG9mIHRoZSBIRUFSVEJFQVQgQUNLLCB0aGUgc2VuZGVyIG9mCisJICogdGhlIEhFQVJUQkVBVCBzaG91bGQgY2xlYXIgdGhlIGVycm9yIGNvdW50ZXIgb2YgdGhlCisJICogZGVzdGluYXRpb24gdHJhbnNwb3J0IGFkZHJlc3MgdG8gd2hpY2ggdGhlIEhFQVJUQkVBVCB3YXMKKwkgKiBzZW50IGFuZCBtYXJrIHRoZSBkZXN0aW5hdGlvbiB0cmFuc3BvcnQgYWRkcmVzcyBhcyBhY3RpdmUgaWYKKwkgKiBpdCBpcyBub3Qgc28gbWFya2VkLgorCSAqLworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVFJBTlNQT1JUX09OLCBTQ1RQX1RSQU5TUE9SVChsaW5rKSk7CisKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9DT05TVU1FOworfQorCisvKiBIZWxwZXIgZnVuY3Rpb24gdG8gc2VuZCBvdXQgYW4gYWJvcnQgZm9yIHRoZSByZXN0YXJ0CisgKiBjb25kaXRpb24uCisgKi8KK3N0YXRpYyBpbnQgc2N0cF9zZl9zZW5kX3Jlc3RhcnRfYWJvcnQodW5pb24gc2N0cF9hZGRyICpzc2EsCisJCQkJICAgICAgc3RydWN0IHNjdHBfY2h1bmsgKmluaXQsCisJCQkJICAgICAgc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCWludCBsZW47CisJc3RydWN0IHNjdHBfcGFja2V0ICpwa3Q7CisJdW5pb24gc2N0cF9hZGRyX3BhcmFtICphZGRycGFybTsKKwlzdHJ1Y3Qgc2N0cF9lcnJoZHIgKmVycmhkcjsKKwlzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXA7CisJY2hhciBidWZmZXJbc2l6ZW9mKHN0cnVjdCBzY3RwX2Vycmhkcikrc2l6ZW9mKHVuaW9uIHNjdHBfYWRkcl9wYXJhbSldOworCXN0cnVjdCBzY3RwX2FmICphZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKHNzYS0+djQuc2luX2ZhbWlseSk7CisKKwkvKiBCdWlsZCB0aGUgZXJyb3Igb24gdGhlIHN0YWNrLiAgIFdlIGFyZSB3YXkgdG8gbWFsbG9jIGNyYXp5CisJICogdGhyb3VnaG91dCB0aGUgY29kZSB0b2RheS4KKwkgKi8KKwllcnJoZHIgPSAoc3RydWN0IHNjdHBfZXJyaGRyICopYnVmZmVyOworCWFkZHJwYXJtID0gKHVuaW9uIHNjdHBfYWRkcl9wYXJhbSAqKWVycmhkci0+dmFyaWFibGU7CisKKwkvKiBDb3B5IGludG8gYSBwYXJtIGZvcm1hdC4gKi8KKwlsZW4gPSBhZi0+dG9fYWRkcl9wYXJhbShzc2EsIGFkZHJwYXJtKTsKKwlsZW4gKz0gc2l6ZW9mKHNjdHBfZXJyaGRyX3QpOworCisJZXJyaGRyLT5jYXVzZSA9IFNDVFBfRVJST1JfUkVTVEFSVDsKKwllcnJoZHItPmxlbmd0aCA9IGh0b25zKGxlbik7CisKKwkvKiBBc3NpZ24gdG8gdGhlIGNvbnRyb2wgc29ja2V0LiAqLworCWVwID0gc2N0cF9zaygoc2N0cF9nZXRfY3RsX3NvY2soKSkpLT5lcDsKKworCS8qIEFzc29jaWF0aW9uIGlzIE5VTEwgc2luY2UgdGhpcyBtYXkgYmUgYSByZXN0YXJ0IGF0dGFjayBhbmQgd2UKKwkgKiB3YW50IHRvIHNlbmQgYmFjayB0aGUgYXR0YWNrZXIncyB2dGFnLgorCSAqLworCXBrdCA9IHNjdHBfYWJvcnRfcGt0X25ldyhlcCwgTlVMTCwgaW5pdCwgZXJyaGRyLCBsZW4pOworCisJaWYgKCFwa3QpCisJCWdvdG8gb3V0OworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfU0VORF9QS1QsIFNDVFBfUEFDS0VUKHBrdCkpOworCisJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfT1VUQ1RSTENIVU5LUyk7CisKKwkvKiBEaXNjYXJkIHRoZSByZXN0IG9mIHRoZSBpbmJvdW5kIHBhY2tldC4gKi8KKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0RJU0NBUkRfUEFDS0VULCBTQ1RQX05VTEwoKSk7CisKK291dDoKKwkvKiBFdmVuIGlmIHRoZXJlIGlzIG5vIG1lbW9yeSwgdHJlYXQgYXMgYSBmYWlsdXJlIHNvCisJICogdGhlIHBhY2tldCB3aWxsIGdldCBkcm9wcGVkLgorCSAqLworCXJldHVybiAwOworfQorCisvKiBBIHJlc3RhcnQgaXMgb2NjdXJyaW5nLCBjaGVjayB0byBtYWtlIHN1cmUgbm8gbmV3IGFkZHJlc3NlcworICogYXJlIGJlaW5nIGFkZGVkIGFzIHdlIG1heSBiZSB1bmRlciBhIHRha2VvdmVyIGF0dGFjay4KKyAqLworc3RhdGljIGludCBzY3RwX3NmX2NoZWNrX3Jlc3RhcnRfYWRkcnMoY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKm5ld19hc29jLAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkgICAgICAgc3RydWN0IHNjdHBfY2h1bmsgKmluaXQsCisJCQkJICAgICAgIHNjdHBfY21kX3NlcV90ICpjb21tYW5kcykKK3sKKwlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKm5ld19hZGRyLCAqYWRkcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpwb3MyOworCWludCBmb3VuZDsKKworCS8qIEltcGxlbWVudG9yJ3MgR3VpZGUgLSBTZWN0aW4gNS4yLjIKKwkgKiAuLi4KKwkgKiBCZWZvcmUgcmVzcG9uZGluZyB0aGUgZW5kcG9pbnQgTVVTVCBjaGVjayB0byBzZWUgaWYgdGhlCisJICogdW5leHBlY3RlZCBJTklUIGFkZHMgbmV3IGFkZHJlc3NlcyB0byB0aGUgYXNzb2NpYXRpb24uIElmIG5ldworCSAqIGFkZHJlc3NlcyBhcmUgYWRkZWQgdG8gdGhlIGFzc29jaWF0aW9uLCB0aGUgZW5kcG9pbnQgTVVTVCByZXNwb25kCisJICogd2l0aCBhbiBBQk9SVC4uCisJICovCisKKwkvKiBTZWFyY2ggdGhyb3VnaCBhbGwgY3VycmVudCBhZGRyZXNzZXMgYW5kIG1ha2Ugc3VyZQorCSAqIHdlIGFyZW4ndCBhZGRpbmcgYW55IG5ldyBvbmVzLgorCSAqLworCW5ld19hZGRyID0gTlVMTDsKKwlmb3VuZCA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJm5ld19hc29jLT5wZWVyLnRyYW5zcG9ydF9hZGRyX2xpc3QpIHsKKwkJbmV3X2FkZHIgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHNjdHBfdHJhbnNwb3J0LCB0cmFuc3BvcnRzKTsKKwkJZm91bmQgPSAwOworCQlsaXN0X2Zvcl9lYWNoKHBvczIsICZhc29jLT5wZWVyLnRyYW5zcG9ydF9hZGRyX2xpc3QpIHsKKwkJCWFkZHIgPSBsaXN0X2VudHJ5KHBvczIsIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCwKKwkJCQkJICB0cmFuc3BvcnRzKTsKKwkJCWlmIChzY3RwX2NtcF9hZGRyX2V4YWN0KCZuZXdfYWRkci0+aXBhZGRyLAorCQkJCQkJJmFkZHItPmlwYWRkcikpIHsKKwkJCQlmb3VuZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCFmb3VuZCkKKwkJCWJyZWFrOworCX0KKworCS8qIElmIGEgbmV3IGFkZHJlc3Mgd2FzIGFkZGVkLCBBQk9SVCB0aGUgc2VuZGVyLiAqLworCWlmICghZm91bmQgJiYgbmV3X2FkZHIpIHsKKwkJc2N0cF9zZl9zZW5kX3Jlc3RhcnRfYWJvcnQoJm5ld19hZGRyLT5pcGFkZHIsIGluaXQsIGNvbW1hbmRzKTsKKwl9CisKKwkvKiBSZXR1cm4gc3VjY2VzcyBpZiBhbGwgYWRkcmVzc2VzIHdlcmUgZm91bmQuICovCisJcmV0dXJuIGZvdW5kOworfQorCisvKiBQb3B1bGF0ZSB0aGUgdmVyaWZpY2F0aW9uL3RpZSB0YWdzIGJhc2VkIG9uIG92ZXJsYXBwaW5nIElOSVQKKyAqIHNjZW5hcmlvLgorICoKKyAqIE5vdGU6IERvIG5vdCB1c2UgaW4gQ0xPU0VEIG9yIFNIVVRET1dOLUFDSy1TRU5UIHN0YXRlLgorICovCitzdGF0aWMgdm9pZCBzY3RwX3RpZXRhZ3NfcG9wdWxhdGUoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKm5ld19hc29jLAorCQkJCSAgY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MpCit7CisJc3dpdGNoIChhc29jLT5zdGF0ZSkgeworCisJLyogNS4yLjEgSU5JVCByZWNlaXZlZCBpbiBDT09LSUUtV0FJVCBvciBDT09LSUUtRUNIT0VEIFN0YXRlICovCisKKwljYXNlIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQ6CisJCW5ld19hc29jLT5jLm15X3Z0YWcgICAgID0gYXNvYy0+Yy5teV92dGFnOworCQluZXdfYXNvYy0+Yy5teV90dGFnICAgICA9IGFzb2MtPmMubXlfdnRhZzsKKwkJbmV3X2Fzb2MtPmMucGVlcl90dGFnICAgPSAwOworCQlicmVhazsKKworCWNhc2UgU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEOgorCQluZXdfYXNvYy0+Yy5teV92dGFnICAgICA9IGFzb2MtPmMubXlfdnRhZzsKKwkJbmV3X2Fzb2MtPmMubXlfdHRhZyAgICAgPSBhc29jLT5jLm15X3Z0YWc7CisJCW5ld19hc29jLT5jLnBlZXJfdHRhZyAgID0gYXNvYy0+Yy5wZWVyX3Z0YWc7CisJCWJyZWFrOworCisJLyogNS4yLjIgVW5leHBlY3RlZCBJTklUIGluIFN0YXRlcyBPdGhlciB0aGFuIENMT1NFRCwgQ09PS0lFLUVDSE9FRCwKKwkgKiBDT09LSUUtV0FJVCBhbmQgU0hVVERPV04tQUNLLVNFTlQKKwkgKi8KKwlkZWZhdWx0OgorCQluZXdfYXNvYy0+Yy5teV90dGFnICAgPSBhc29jLT5jLm15X3Z0YWc7CisJCW5ld19hc29jLT5jLnBlZXJfdHRhZyA9IGFzb2MtPmMucGVlcl92dGFnOworCQlicmVhazsKKwl9OworCisJLyogT3RoZXIgcGFyYW1ldGVycyBmb3IgdGhlIGVuZHBvaW50IFNIT1VMRCBiZSBjb3BpZWQgZnJvbSB0aGUKKwkgKiBleGlzdGluZyBwYXJhbWV0ZXJzIG9mIHRoZSBhc3NvY2lhdGlvbiAoZS5nLiBudW1iZXIgb2YKKwkgKiBvdXRib3VuZCBzdHJlYW1zKSBpbnRvIHRoZSBJTklUIEFDSyBhbmQgY29va2llLgorCSAqLworCW5ld19hc29jLT5yd25kICAgICAgICAgICAgICAgICAgPSBhc29jLT5yd25kOworCW5ld19hc29jLT5jLnNpbml0X251bV9vc3RyZWFtcyAgPSBhc29jLT5jLnNpbml0X251bV9vc3RyZWFtczsKKwluZXdfYXNvYy0+Yy5zaW5pdF9tYXhfaW5zdHJlYW1zID0gYXNvYy0+Yy5zaW5pdF9tYXhfaW5zdHJlYW1zOworCW5ld19hc29jLT5jLmluaXRpYWxfdHNuICAgICAgICAgPSBhc29jLT5jLmluaXRpYWxfdHNuOworfQorCisvKgorICogQ29tcGFyZSB2dGFnL3RpZXRhZyB2YWx1ZXMgdG8gZGV0ZXJtaW5lIHVuZXhwZWN0ZWQgQ09PS0lFLUVDSE8KKyAqIGhhbmRsaW5nIGFjdGlvbi4KKyAqCisgKiBSRkMgMjk2MCA1LjIuNCBIYW5kbGUgYSBDT09LSUUgRUNITyB3aGVuIGEgVENCIGV4aXN0cy4KKyAqCisgKiBSZXR1cm5zIHZhbHVlIHJlcHJlc2VudGluZyBhY3Rpb24gdG8gYmUgdGFrZW4uICAgVGhlc2UgYWN0aW9uIHZhbHVlcworICogY29ycmVzcG9uZCB0byBBY3Rpb24vRGVzY3JpcHRpb24gdmFsdWVzIGluIFJGQyAyOTYwLCBUYWJsZSAyLgorICovCitzdGF0aWMgY2hhciBzY3RwX3RpZXRhZ3NfY29tcGFyZShzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqbmV3X2Fzb2MsCisJCQkJIGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKQoreworCS8qIEluIHRoaXMgY2FzZSwgdGhlIHBlZXIgbWF5IGhhdmUgcmVzdGFydGVkLiAgKi8KKwlpZiAoKGFzb2MtPmMubXlfdnRhZyAhPSBuZXdfYXNvYy0+Yy5teV92dGFnKSAmJgorCSAgICAoYXNvYy0+Yy5wZWVyX3Z0YWcgIT0gbmV3X2Fzb2MtPmMucGVlcl92dGFnKSAmJgorCSAgICAoYXNvYy0+Yy5teV92dGFnID09IG5ld19hc29jLT5jLm15X3R0YWcpICYmCisJICAgIChhc29jLT5jLnBlZXJfdnRhZyA9PSBuZXdfYXNvYy0+Yy5wZWVyX3R0YWcpKQorCQlyZXR1cm4gJ0EnOworCisJLyogQ29sbGlzaW9uIGNhc2UgQi4gKi8KKwlpZiAoKGFzb2MtPmMubXlfdnRhZyA9PSBuZXdfYXNvYy0+Yy5teV92dGFnKSAmJgorCSAgICAoKGFzb2MtPmMucGVlcl92dGFnICE9IG5ld19hc29jLT5jLnBlZXJfdnRhZykgfHwKKwkgICAgICgwID09IGFzb2MtPmMucGVlcl92dGFnKSkpIHsKKwkJcmV0dXJuICdCJzsKKwl9CisKKwkvKiBDb2xsaXNpb24gY2FzZSBELiAqLworCWlmICgoYXNvYy0+Yy5teV92dGFnID09IG5ld19hc29jLT5jLm15X3Z0YWcpICYmCisJICAgIChhc29jLT5jLnBlZXJfdnRhZyA9PSBuZXdfYXNvYy0+Yy5wZWVyX3Z0YWcpKQorCQlyZXR1cm4gJ0QnOworCisJLyogQ29sbGlzaW9uIGNhc2UgQy4gKi8KKwlpZiAoKGFzb2MtPmMubXlfdnRhZyAhPSBuZXdfYXNvYy0+Yy5teV92dGFnKSAmJgorCSAgICAoYXNvYy0+Yy5wZWVyX3Z0YWcgPT0gbmV3X2Fzb2MtPmMucGVlcl92dGFnKSAmJgorCSAgICAoMCA9PSBuZXdfYXNvYy0+Yy5teV90dGFnKSAmJgorCSAgICAoMCA9PSBuZXdfYXNvYy0+Yy5wZWVyX3R0YWcpKQorCQlyZXR1cm4gJ0MnOworCisJLyogTm8gbWF0Y2ggdG8gYW55IG9mIHRoZSBzcGVjaWFsIGNhc2VzOyBkaXNjYXJkIHRoaXMgcGFja2V0LiAqLworCXJldHVybiAnRSc7Cit9CisKKy8qIENvbW1vbiBoZWxwZXIgcm91dGluZSBmb3IgYm90aCBkdXBsaWNhdGUgYW5kIHNpbXVsYXRhbmVvdXMgSU5JVAorICogY2h1bmsgaGFuZGxpbmcuCisgKi8KK3N0YXRpYyBzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl9kb191bmV4cGVjdGVkX2luaXQoCisJY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCWNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJdm9pZCAqYXJnLCBzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJc2N0cF9kaXNwb3NpdGlvbl90IHJldHZhbDsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmsgPSBhcmc7CisJc3RydWN0IHNjdHBfY2h1bmsgKnJlcGw7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKm5ld19hc29jOworCXN0cnVjdCBzY3RwX2NodW5rICplcnJfY2h1bms7CisJc3RydWN0IHNjdHBfcGFja2V0ICpwYWNrZXQ7CisJc2N0cF91bnJlY29nbml6ZWRfcGFyYW1fdCAqdW5rX3BhcmFtOworCWludCBsZW47CisKKwkvKiA2LjEwIEJ1bmRsaW5nCisJICogQW4gZW5kcG9pbnQgTVVTVCBOT1QgYnVuZGxlIElOSVQsIElOSVQgQUNLIG9yCisJICogU0hVVERPV04gQ09NUExFVEUgd2l0aCBhbnkgb3RoZXIgY2h1bmtzLgorCSAqCisJICogSUcgU2VjdGlvbiAyLjExLjIKKwkgKiBGdXJ0aGVybW9yZSwgd2UgcmVxdWlyZSB0aGF0IHRoZSByZWNlaXZlciBvZiBhbiBJTklUIGNodW5rIE1VU1QKKwkgKiBlbmZvcmNlIHRoZXNlIHJ1bGVzIGJ5IHNpbGVudGx5IGRpc2NhcmRpbmcgYW4gYXJyaXZpbmcgcGFja2V0CisJICogd2l0aCBhbiBJTklUIGNodW5rIHRoYXQgaXMgYnVuZGxlZCB3aXRoIG90aGVyIGNodW5rcy4KKwkgKi8KKwlpZiAoIWNodW5rLT5zaW5nbGV0b24pCisJCXJldHVybiBzY3RwX3NmX3BkaXNjYXJkKGVwLCBhc29jLCB0eXBlLCBhcmcsIGNvbW1hbmRzKTsKKworCS8qIDMuMSBBIHBhY2tldCBjb250YWluaW5nIGFuIElOSVQgY2h1bmsgTVVTVCBoYXZlIGEgemVybyBWZXJpZmljYXRpb24KKwkgKiBUYWcuIAorCSAqLworCWlmIChjaHVuay0+c2N0cF9oZHItPnZ0YWcgIT0gMCkKKwkJcmV0dXJuIHNjdHBfc2ZfdGFib3J0XzhfNF84KGVwLCBhc29jLCB0eXBlLCBhcmcsIGNvbW1hbmRzKTsKKworCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBJTklUIGNodW5rIGhhcyBhIHZhbGlkIGxlbmd0aC4KKwkgKiBJbiB0aGlzIGNhc2UsIHdlIGdlbmVyYXRlIGEgcHJvdG9jb2wgdmlvbGF0aW9uIHNpbmNlIHdlIGhhdmUKKwkgKiBhbiBhc3NvY2lhdGlvbiBlc3RhYmxpc2hlZC4KKwkgKi8KKwlpZiAoIXNjdHBfY2h1bmtfbGVuZ3RoX3ZhbGlkKGNodW5rLCBzaXplb2Yoc2N0cF9pbml0X2NodW5rX3QpKSkKKwkJcmV0dXJuIHNjdHBfc2ZfdmlvbGF0aW9uX2NodW5rbGVuKGVwLCBhc29jLCB0eXBlLCBhcmcsCisJCQkJCQkgIGNvbW1hbmRzKTsKKwkvKiBHcmFiIHRoZSBJTklUIGhlYWRlci4gICovCisJY2h1bmstPnN1YmguaW5pdF9oZHIgPSAoc2N0cF9pbml0aGRyX3QgKikgY2h1bmstPnNrYi0+ZGF0YTsKKworCS8qIFRhZyB0aGUgdmFyaWFibGUgbGVuZ3RoIHBhcmFtZXRlcnMuICAqLworCWNodW5rLT5wYXJhbV9oZHIudiA9IHNrYl9wdWxsKGNodW5rLT5za2IsIHNpemVvZihzY3RwX2luaXRoZHJfdCkpOworCisJLyogVmVyaWZ5IHRoZSBJTklUIGNodW5rIGJlZm9yZSBwcm9jZXNzaW5nIGl0LiAqLworCWVycl9jaHVuayA9IE5VTEw7CisJaWYgKCFzY3RwX3ZlcmlmeV9pbml0KGFzb2MsIGNodW5rLT5jaHVua19oZHItPnR5cGUsCisJCQkgICAgICAoc2N0cF9pbml0X2NodW5rX3QgKiljaHVuay0+Y2h1bmtfaGRyLCBjaHVuaywKKwkJCSAgICAgICZlcnJfY2h1bmspKSB7CisJCS8qIFRoaXMgY2h1bmsgY29udGFpbnMgZmF0YWwgZXJyb3IuIEl0IGlzIHRvIGJlIGRpc2NhcmRlZC4KKwkJICogU2VuZCBhbiBBQk9SVCwgd2l0aCBjYXVzZXMgaWYgdGhlcmUgaXMgYW55LgorCQkgKi8KKwkJaWYgKGVycl9jaHVuaykgeworCQkJcGFja2V0ID0gc2N0cF9hYm9ydF9wa3RfbmV3KGVwLCBhc29jLCBhcmcsCisJCQkJCShfX3U4ICopKGVycl9jaHVuay0+Y2h1bmtfaGRyKSArCisJCQkJCXNpemVvZihzY3RwX2NodW5raGRyX3QpLAorCQkJCQludG9ocyhlcnJfY2h1bmstPmNodW5rX2hkci0+bGVuZ3RoKSAtCisJCQkJCXNpemVvZihzY3RwX2NodW5raGRyX3QpKTsKKworCQkJaWYgKHBhY2tldCkgeworCQkJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfU0VORF9QS1QsCisJCQkJCQlTQ1RQX1BBQ0tFVChwYWNrZXQpKTsKKwkJCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9PVVRDVFJMQ0hVTktTKTsKKwkJCQlyZXR2YWwgPSBTQ1RQX0RJU1BPU0lUSU9OX0NPTlNVTUU7CisJCQl9IGVsc2UgeworCQkJCXJldHZhbCA9IFNDVFBfRElTUE9TSVRJT05fTk9NRU07CisJCQl9CisJCQlnb3RvIGNsZWFudXA7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gc2N0cF9zZl90YWJvcnRfOF80XzgoZXAsIGFzb2MsIHR5cGUsIGFyZywKKwkJCQkJCSAgICBjb21tYW5kcyk7CisJCX0KKwl9CisKKwkvKgorCSAqIE90aGVyIHBhcmFtZXRlcnMgZm9yIHRoZSBlbmRwb2ludCBTSE9VTEQgYmUgY29waWVkIGZyb20gdGhlCisJICogZXhpc3RpbmcgcGFyYW1ldGVycyBvZiB0aGUgYXNzb2NpYXRpb24gKGUuZy4gbnVtYmVyIG9mCisJICogb3V0Ym91bmQgc3RyZWFtcykgaW50byB0aGUgSU5JVCBBQ0sgYW5kIGNvb2tpZS4KKwkgKiBGSVhNRTogIFdlIGFyZSBjb3B5aW5nIHBhcmFtZXRlcnMgZnJvbSB0aGUgZW5kcG9pbnQgbm90IHRoZQorCSAqIGFzc29jaWF0aW9uLgorCSAqLworCW5ld19hc29jID0gc2N0cF9tYWtlX3RlbXBfYXNvYyhlcCwgY2h1bmssIEdGUF9BVE9NSUMpOworCWlmICghbmV3X2Fzb2MpCisJCWdvdG8gbm9tZW07CisKKwkvKiBJbiB0aGUgb3V0Ym91bmQgSU5JVCBBQ0sgdGhlIGVuZHBvaW50IE1VU1QgY29weSBpdHMgY3VycmVudAorCSAqIFZlcmlmaWNhdGlvbiBUYWcgYW5kIFBlZXJzIFZlcmlmaWNhdGlvbiB0YWcgaW50byBhIHJlc2VydmVkCisJICogcGxhY2UgKGxvY2FsIHRpZS10YWcgYW5kIHBlciB0aWUtdGFnKSB3aXRoaW4gdGhlIHN0YXRlIGNvb2tpZS4KKwkgKi8KKwlpZiAoIXNjdHBfcHJvY2Vzc19pbml0KG5ld19hc29jLCBjaHVuay0+Y2h1bmtfaGRyLT50eXBlLAorCQkJICAgICAgIHNjdHBfc291cmNlKGNodW5rKSwKKwkJCSAgICAgICAoc2N0cF9pbml0X2NodW5rX3QgKiljaHVuay0+Y2h1bmtfaGRyLAorCQkJICAgICAgIEdGUF9BVE9NSUMpKSB7CisJCXJldHZhbCA9IFNDVFBfRElTUE9TSVRJT05fTk9NRU07CisJCWdvdG8gbm9tZW1faW5pdDsKKwl9CisKKwkvKiBNYWtlIHN1cmUgbm8gbmV3IGFkZHJlc3NlcyBhcmUgYmVpbmcgYWRkZWQgZHVyaW5nIHRoZQorCSAqIHJlc3RhcnQuICAgRG8gbm90IGRvIHRoaXMgY2hlY2sgZm9yIENPT0tJRS1XQUlUIHN0YXRlLAorCSAqIHNpbmNlIHRoZXJlIGFyZSBubyBwZWVyIGFkZHJlc3NlcyB0byBjaGVjayBhZ2FpbnN0LgorCSAqIFVwb24gcmV0dXJuIGFuIEFCT1JUIHdpbGwgaGF2ZSBiZWVuIHNlbnQgaWYgbmVlZGVkLgorCSAqLworCWlmICghc2N0cF9zdGF0ZShhc29jLCBDT09LSUVfV0FJVCkpIHsKKwkJaWYgKCFzY3RwX3NmX2NoZWNrX3Jlc3RhcnRfYWRkcnMobmV3X2Fzb2MsIGFzb2MsIGNodW5rLAorCQkJCQkJIGNvbW1hbmRzKSkgeworCQkJcmV0dmFsID0gU0NUUF9ESVNQT1NJVElPTl9DT05TVU1FOworCQkJZ290byBjbGVhbnVwX2Fzb2M7CisJCX0KKwl9CisKKwlzY3RwX3RpZXRhZ3NfcG9wdWxhdGUobmV3X2Fzb2MsIGFzb2MpOworCisJLyogQikgIloiIHNoYWxsIHJlc3BvbmQgaW1tZWRpYXRlbHkgd2l0aCBhbiBJTklUIEFDSyBjaHVuay4gICovCisKKwkvKiBJZiB0aGVyZSBhcmUgZXJyb3JzIG5lZWQgdG8gYmUgcmVwb3J0ZWQgZm9yIHVua25vd24gcGFyYW1ldGVycywKKwkgKiBtYWtlIHN1cmUgdG8gcmVzZXJ2ZSBlbm91Z2ggcm9vbSBpbiB0aGUgSU5JVCBBQ0sgZm9yIHRoZW0uCisJICovCisJbGVuID0gMDsKKwlpZiAoZXJyX2NodW5rKSB7CisJCWxlbiA9IG50b2hzKGVycl9jaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpIC0KKwkJCXNpemVvZihzY3RwX2NodW5raGRyX3QpOworCX0KKworCWlmIChzY3RwX2Fzc29jX3NldF9iaW5kX2FkZHJfZnJvbV9lcChuZXdfYXNvYywgR0ZQX0FUT01JQykgPCAwKQorCQlnb3RvIG5vbWVtOworCisJcmVwbCA9IHNjdHBfbWFrZV9pbml0X2FjayhuZXdfYXNvYywgY2h1bmssIEdGUF9BVE9NSUMsIGxlbik7CisJaWYgKCFyZXBsKQorCQlnb3RvIG5vbWVtOworCisJLyogSWYgdGhlcmUgYXJlIGVycm9ycyBuZWVkIHRvIGJlIHJlcG9ydGVkIGZvciB1bmtub3duIHBhcmFtZXRlcnMsCisJICogaW5jbHVkZSB0aGVtIGluIHRoZSBvdXRnb2luZyBJTklUIEFDSyBhcyAiVW5yZWNvZ25pemVkIHBhcmFtZXRlciIKKwkgKiBwYXJhbWV0ZXIuCisJICovCisJaWYgKGVycl9jaHVuaykgeworCQkvKiBHZXQgdGhlICJVbnJlY29nbml6ZWQgcGFyYW1ldGVyIiBwYXJhbWV0ZXIocykgb3V0IG9mIHRoZQorCQkgKiBFUlJPUiBjaHVuayBnZW5lcmF0ZWQgYnkgc2N0cF92ZXJpZnlfaW5pdCgpLiBTaW5jZSB0aGUKKwkJICogZXJyb3IgY2F1c2UgY29kZSBmb3IgInVua25vd24gcGFyYW1ldGVyIiBhbmQgdGhlCisJCSAqICJVbnJlY29nbml6ZWQgcGFyYW1ldGVyIiB0eXBlIGlzIHRoZSBzYW1lLCB3ZSBjYW4KKwkJICogY29uc3RydWN0IHRoZSBwYXJhbWV0ZXJzIGluIElOSVQgQUNLIGJ5IGNvcHlpbmcgdGhlCisJCSAqIEVSUk9SIGNhdXNlcyBvdmVyLgorCQkgKi8KKwkJdW5rX3BhcmFtID0gKHNjdHBfdW5yZWNvZ25pemVkX3BhcmFtX3QgKikKKwkJCSAgICAoKF9fdTggKikoZXJyX2NodW5rLT5jaHVua19oZHIpICsKKwkJCSAgICBzaXplb2Yoc2N0cF9jaHVua2hkcl90KSk7CisJCS8qIFJlcGxhY2UgdGhlIGNhdXNlIGNvZGUgd2l0aCB0aGUgIlVucmVjb2duaXplZCBwYXJhbWV0ZXIiCisJCSAqIHBhcmFtZXRlciB0eXBlLgorCQkgKi8KKwkJc2N0cF9hZGR0b19jaHVuayhyZXBsLCBsZW4sIHVua19wYXJhbSk7CisJfQorCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9ORVdfQVNPQywgU0NUUF9BU09DKG5ld19hc29jKSk7CisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9SRVBMWSwgU0NUUF9DSFVOSyhyZXBsKSk7CisKKwkvKgorCSAqIE5vdGU6IEFmdGVyIHNlbmRpbmcgb3V0IElOSVQgQUNLIHdpdGggdGhlIFN0YXRlIENvb2tpZSBwYXJhbWV0ZXIsCisJICogIloiIE1VU1QgTk9UIGFsbG9jYXRlIGFueSByZXNvdXJjZXMgZm9yIHRoaXMgbmV3IGFzc29jaWF0aW9uLgorCSAqIE90aGVyd2lzZSwgIloiIHdpbGwgYmUgdnVsbmVyYWJsZSB0byByZXNvdXJjZSBhdHRhY2tzLgorCSAqLworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfREVMRVRFX1RDQiwgU0NUUF9OVUxMKCkpOworCXJldHZhbCA9IFNDVFBfRElTUE9TSVRJT05fQ09OU1VNRTsKKworY2xlYW51cDoKKwlpZiAoZXJyX2NodW5rKQorCQlzY3RwX2NodW5rX2ZyZWUoZXJyX2NodW5rKTsKKwlyZXR1cm4gcmV0dmFsOworbm9tZW06CisJcmV0dmFsID0gU0NUUF9ESVNQT1NJVElPTl9OT01FTTsKKwlnb3RvIGNsZWFudXA7Citub21lbV9pbml0OgorY2xlYW51cF9hc29jOgorCXNjdHBfYXNzb2NpYXRpb25fZnJlZShuZXdfYXNvYyk7CisJZ290byBjbGVhbnVwOworfQorCisvKgorICogSGFuZGxlIHNpbXVsdGFub3VzIElOSVQuCisgKiBUaGlzIG1lYW5zIHdlIHN0YXJ0ZWQgYW4gSU5JVCBhbmQgdGhlbiB3ZSBnb3QgYW4gSU5JVCByZXF1ZXN0IGZyb20KKyAqIG91ciBwZWVyLgorICoKKyAqIFNlY3Rpb246IDUuMi4xIElOSVQgcmVjZWl2ZWQgaW4gQ09PS0lFLVdBSVQgb3IgQ09PS0lFLUVDSE9FRCBTdGF0ZSAoSXRlbSBCKQorICogVGhpcyB1c3VhbGx5IGluZGljYXRlcyBhbiBpbml0aWFsaXphdGlvbiBjb2xsaXNpb24sIGkuZS4sIGVhY2gKKyAqIGVuZHBvaW50IGlzIGF0dGVtcHRpbmcsIGF0IGFib3V0IHRoZSBzYW1lIHRpbWUsIHRvIGVzdGFibGlzaCBhbgorICogYXNzb2NpYXRpb24gd2l0aCB0aGUgb3RoZXIgZW5kcG9pbnQuCisgKgorICogVXBvbiByZWNlaXB0IG9mIGFuIElOSVQgaW4gdGhlIENPT0tJRS1XQUlUIG9yIENPT0tJRS1FQ0hPRUQgc3RhdGUsIGFuCisgKiBlbmRwb2ludCBNVVNUIHJlc3BvbmQgd2l0aCBhbiBJTklUIEFDSyB1c2luZyB0aGUgc2FtZSBwYXJhbWV0ZXJzIGl0CisgKiBzZW50IGluIGl0cyBvcmlnaW5hbCBJTklUIGNodW5rIChpbmNsdWRpbmcgaXRzIFZlcmlmaWNhdGlvbiBUYWcsCisgKiB1bmNoYW5nZWQpLiBUaGVzZSBvcmlnaW5hbCBwYXJhbWV0ZXJzIGFyZSBjb21iaW5lZCB3aXRoIHRob3NlIGZyb20gdGhlCisgKiBuZXdseSByZWNlaXZlZCBJTklUIGNodW5rLiBUaGUgZW5kcG9pbnQgc2hhbGwgYWxzbyBnZW5lcmF0ZSBhIFN0YXRlCisgKiBDb29raWUgd2l0aCB0aGUgSU5JVCBBQ0suIFRoZSBlbmRwb2ludCB1c2VzIHRoZSBwYXJhbWV0ZXJzIHNlbnQgaW4gaXRzCisgKiBJTklUIHRvIGNhbGN1bGF0ZSB0aGUgU3RhdGUgQ29va2llLgorICoKKyAqIEFmdGVyIHRoYXQsIHRoZSBlbmRwb2ludCBNVVNUIE5PVCBjaGFuZ2UgaXRzIHN0YXRlLCB0aGUgVDEtaW5pdAorICogdGltZXIgc2hhbGwgYmUgbGVmdCBydW5uaW5nIGFuZCB0aGUgY29ycmVzcG9uZGluZyBUQ0IgTVVTVCBOT1QgYmUKKyAqIGRlc3Ryb3llZC4gVGhlIG5vcm1hbCBwcm9jZWR1cmVzIGZvciBoYW5kbGluZyBTdGF0ZSBDb29raWVzIHdoZW4KKyAqIGEgVENCIGV4aXN0cyB3aWxsIHJlc29sdmUgdGhlIGR1cGxpY2F0ZSBJTklUcyB0byBhIHNpbmdsZSBhc3NvY2lhdGlvbi4KKyAqCisgKiBGb3IgYW4gZW5kcG9pbnQgdGhhdCBpcyBpbiB0aGUgQ09PS0lFLUVDSE9FRCBzdGF0ZSBpdCBNVVNUIHBvcHVsYXRlCisgKiBpdHMgVGllLVRhZ3Mgd2l0aCB0aGUgVGFnIGluZm9ybWF0aW9uIG9mIGl0c2VsZiBhbmQgaXRzIHBlZXIgKHNlZQorICogc2VjdGlvbiA1LjIuMiBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgVGllLVRhZ3MpLgorICoKKyAqIFZlcmlmaWNhdGlvbiBUYWc6IE5vdCBleHBsaWNpdCwgYnV0IGFuIElOSVQgY2FuIG5vdCBoYXZlIGEgdmFsaWQKKyAqIHZlcmlmaWNhdGlvbiB0YWcsIHNvIHdlIHNraXAgdGhlIGNoZWNrLgorICoKKyAqIElucHV0cworICogKGVuZHBvaW50LCBhc29jLCBjaHVuaykKKyAqCisgKiBPdXRwdXRzCisgKiAoYXNvYywgcmVwbHlfbXNnLCBtc2dfdXAsIHRpbWVycywgY291bnRlcnMpCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgZGlzcG9zaXRpb24gb2YgdGhlIGNodW5rLgorICovCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl9kb181XzJfMV9zaW1pbml0KGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJICAgIGNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJCQkJICAgIHZvaWQgKmFyZywKKwkJCQkgICAgc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCS8qIENhbGwgaGVscGVyIHRvIGRvIHRoZSByZWFsIHdvcmsgZm9yIGJvdGggc2ltdWxhdGFuZW91cyBhbmQKKwkgKiBkdXBsaWNhdGUgSU5JVCBjaHVuayBoYW5kbGluZy4KKwkgKi8KKwlyZXR1cm4gc2N0cF9zZl9kb191bmV4cGVjdGVkX2luaXQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworfQorCisvKgorICogSGFuZGxlIGR1cGxpY2F0ZWQgSU5JVCBtZXNzYWdlcy4gIFRoZXNlIGFyZSB1c3VhbGx5IGRlbGF5ZWQKKyAqIHJlc3RyYW5zbWlzc2lvbnMuCisgKgorICogU2VjdGlvbjogNS4yLjIgVW5leHBlY3RlZCBJTklUIGluIFN0YXRlcyBPdGhlciB0aGFuIENMT1NFRCwKKyAqIENPT0tJRS1FQ0hPRUQgYW5kIENPT0tJRS1XQUlUCisgKgorICogVW5sZXNzIG90aGVyd2lzZSBzdGF0ZWQsIHVwb24gcmVjZXB0aW9uIG9mIGFuIHVuZXhwZWN0ZWQgSU5JVCBmb3IKKyAqIHRoaXMgYXNzb2NpYXRpb24sIHRoZSBlbmRwb2ludCBzaGFsbCBnZW5lcmF0ZSBhbiBJTklUIEFDSyB3aXRoIGEKKyAqIFN0YXRlIENvb2tpZS4gIEluIHRoZSBvdXRib3VuZCBJTklUIEFDSyB0aGUgZW5kcG9pbnQgTVVTVCBjb3B5IGl0cworICogY3VycmVudCBWZXJpZmljYXRpb24gVGFnIGFuZCBwZWVyJ3MgVmVyaWZpY2F0aW9uIFRhZyBpbnRvIGEgcmVzZXJ2ZWQKKyAqIHBsYWNlIHdpdGhpbiB0aGUgc3RhdGUgY29va2llLiAgV2Ugc2hhbGwgcmVmZXIgdG8gdGhlc2UgbG9jYXRpb25zIGFzCisgKiB0aGUgUGVlcidzLVRpZS1UYWcgYW5kIHRoZSBMb2NhbC1UaWUtVGFnLiAgVGhlIG91dGJvdW5kIFNDVFAgcGFja2V0CisgKiBjb250YWluaW5nIHRoaXMgSU5JVCBBQ0sgTVVTVCBjYXJyeSBhIFZlcmlmaWNhdGlvbiBUYWcgdmFsdWUgZXF1YWwgdG8KKyAqIHRoZSBJbml0aWF0aW9uIFRhZyBmb3VuZCBpbiB0aGUgdW5leHBlY3RlZCBJTklULiAgQW5kIHRoZSBJTklUIEFDSworICogTVVTVCBjb250YWluIGEgbmV3IEluaXRpYXRpb24gVGFnIChyYW5kb21seSBnZW5lcmF0ZWQgc2VlIFNlY3Rpb24KKyAqIDUuMy4xKS4gIE90aGVyIHBhcmFtZXRlcnMgZm9yIHRoZSBlbmRwb2ludCBTSE9VTEQgYmUgY29waWVkIGZyb20gdGhlCisgKiBleGlzdGluZyBwYXJhbWV0ZXJzIG9mIHRoZSBhc3NvY2lhdGlvbiAoZS5nLiBudW1iZXIgb2Ygb3V0Ym91bmQKKyAqIHN0cmVhbXMpIGludG8gdGhlIElOSVQgQUNLIGFuZCBjb29raWUuCisgKgorICogQWZ0ZXIgc2VuZGluZyBvdXQgdGhlIElOSVQgQUNLLCB0aGUgZW5kcG9pbnQgc2hhbGwgdGFrZSBubyBmdXJ0aGVyCisgKiBhY3Rpb25zLCBpLmUuLCB0aGUgZXhpc3RpbmcgYXNzb2NpYXRpb24sIGluY2x1ZGluZyBpdHMgY3VycmVudCBzdGF0ZSwKKyAqIGFuZCB0aGUgY29ycmVzcG9uZGluZyBUQ0IgTVVTVCBOT1QgYmUgY2hhbmdlZC4KKyAqCisgKiBOb3RlOiBPbmx5IHdoZW4gYSBUQ0IgZXhpc3RzIGFuZCB0aGUgYXNzb2NpYXRpb24gaXMgbm90IGluIGEgQ09PS0lFLQorICogV0FJVCBzdGF0ZSBhcmUgdGhlIFRpZS1UYWdzIHBvcHVsYXRlZC4gIEZvciBhIG5vcm1hbCBhc3NvY2lhdGlvbiBJTklUCisgKiAoaS5lLiB0aGUgZW5kcG9pbnQgaXMgaW4gYSBDT09LSUUtV0FJVCBzdGF0ZSksIHRoZSBUaWUtVGFncyBNVVNUIGJlCisgKiBzZXQgdG8gMCAoaW5kaWNhdGluZyB0aGF0IG5vIHByZXZpb3VzIFRDQiBleGlzdGVkKS4gIFRoZSBJTklUIEFDSyBhbmQKKyAqIFN0YXRlIENvb2tpZSBhcmUgcG9wdWxhdGVkIGFzIHNwZWNpZmllZCBpbiBzZWN0aW9uIDUuMi4xLgorICoKKyAqIFZlcmlmaWNhdGlvbiBUYWc6IE5vdCBzcGVjaWZpZWQsIGJ1dCBhbiBJTklUIGhhcyBubyB3YXkgb2Yga25vd2luZworICogd2hhdCB0aGUgdmVyaWZpY2F0aW9uIHRhZyBjb3VsZCBiZSwgc28gd2UgaWdub3JlIGl0LgorICoKKyAqIElucHV0cworICogKGVuZHBvaW50LCBhc29jLCBjaHVuaykKKyAqCisgKiBPdXRwdXRzCisgKiAoYXNvYywgcmVwbHlfbXNnLCBtc2dfdXAsIHRpbWVycywgY291bnRlcnMpCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgZGlzcG9zaXRpb24gb2YgdGhlIGNodW5rLgorICovCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl9kb181XzJfMl9kdXBpbml0KGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwkJCQkJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJCWNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJCQkJCXZvaWQgKmFyZywKKwkJCQkJc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCS8qIENhbGwgaGVscGVyIHRvIGRvIHRoZSByZWFsIHdvcmsgZm9yIGJvdGggc2ltdWxhdGFuZW91cyBhbmQKKwkgKiBkdXBsaWNhdGUgSU5JVCBjaHVuayBoYW5kbGluZy4KKwkgKi8KKwlyZXR1cm4gc2N0cF9zZl9kb191bmV4cGVjdGVkX2luaXQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworfQorCisKKworLyogVW5leHBlY3RlZCBDT09LSUUtRUNITyBoYW5kbGVyIGZvciBwZWVyIHJlc3RhcnQgKFRhYmxlIDIsIGFjdGlvbiAnQScpCisgKgorICogU2VjdGlvbiA1LjIuNAorICogIEEpICBJbiB0aGlzIGNhc2UsIHRoZSBwZWVyIG1heSBoYXZlIHJlc3RhcnRlZC4KKyAqLworc3RhdGljIHNjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2RvX2R1cGNvb2tfYShjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkJCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCQlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCisJCQkJCXNjdHBfY21kX3NlcV90ICpjb21tYW5kcywKKwkJCQkJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKm5ld19hc29jKQoreworCXNjdHBfaW5pdF9jaHVua190ICpwZWVyX2luaXQ7CisJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2OworCXN0cnVjdCBzY3RwX2NodW5rICpyZXBsOworCXN0cnVjdCBzY3RwX2NodW5rICplcnI7CisJc2N0cF9kaXNwb3NpdGlvbl90IGRpc3Bvc2l0aW9uOworCisJLyogbmV3X2Fzb2MgaXMgYSBicmFuZC1uZXcgYXNzb2NpYXRpb24sIHNvIHRoZXNlIGFyZSBub3QgeWV0CisJICogc2lkZSBlZmZlY3RzLS1pdCBpcyBzYWZlIHRvIHJ1biB0aGVtIGhlcmUuCisJICovCisJcGVlcl9pbml0ID0gJmNodW5rLT5zdWJoLmNvb2tpZV9oZHItPmMucGVlcl9pbml0WzBdOworCisJaWYgKCFzY3RwX3Byb2Nlc3NfaW5pdChuZXdfYXNvYywgY2h1bmstPmNodW5rX2hkci0+dHlwZSwKKwkJCSAgICAgICBzY3RwX3NvdXJjZShjaHVuayksIHBlZXJfaW5pdCwKKwkJCSAgICAgICBHRlBfQVRPTUlDKSkKKwkJZ290byBub21lbTsKKworCS8qIE1ha2Ugc3VyZSBubyBuZXcgYWRkcmVzc2VzIGFyZSBiZWluZyBhZGRlZCBkdXJpbmcgdGhlCisJICogcmVzdGFydC4gIFRob3VnaCB0aGlzIGlzIGEgcHJldHR5IGNvbXBsaWNhdGVkIGF0dGFjaworCSAqIHNpbmNlIHlvdSdkIGhhdmUgdG8gZ2V0IGluc2lkZSB0aGUgY29va2llLgorCSAqLworCWlmICghc2N0cF9zZl9jaGVja19yZXN0YXJ0X2FkZHJzKG5ld19hc29jLCBhc29jLCBjaHVuaywgY29tbWFuZHMpKSB7CisJCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0NPTlNVTUU7CisJfQorCisJLyogSWYgdGhlIGVuZHBvaW50IGlzIGluIHRoZSBTSFVURE9XTi1BQ0stU0VOVCBzdGF0ZSBhbmQgcmVjb2duaXplcworCSAqIHRoZSBwZWVyIGhhcyByZXN0YXJ0ZWQgKEFjdGlvbiBBKSwgaXQgTVVTVCBOT1Qgc2V0dXAgYSBuZXcKKwkgKiBhc3NvY2lhdGlvbiBidXQgaW5zdGVhZCByZXNlbmQgdGhlIFNIVVRET1dOIEFDSyBhbmQgc2VuZCBhbiBFUlJPUgorCSAqIGNodW5rIHdpdGggYSAiQ29va2llIFJlY2VpdmVkIHdoaWxlIFNodXR0aW5nIERvd24iIGVycm9yIGNhdXNlIHRvCisJICogaXRzIHBlZXIuCisJKi8KKwlpZiAoc2N0cF9zdGF0ZShhc29jLCBTSFVURE9XTl9BQ0tfU0VOVCkpIHsKKwkJZGlzcG9zaXRpb24gPSBzY3RwX3NmX2RvXzlfMl9yZXNodXRhY2soZXAsIGFzb2MsCisJCQkJU0NUUF9TVF9DSFVOSyhjaHVuay0+Y2h1bmtfaGRyLT50eXBlKSwKKwkJCQljaHVuaywgY29tbWFuZHMpOworCQlpZiAoU0NUUF9ESVNQT1NJVElPTl9OT01FTSA9PSBkaXNwb3NpdGlvbikKKwkJCWdvdG8gbm9tZW07CisKKwkJZXJyID0gc2N0cF9tYWtlX29wX2Vycm9yKGFzb2MsIGNodW5rLAorCQkJCQkgU0NUUF9FUlJPUl9DT09LSUVfSU5fU0hVVERPV04sCisJCQkJCSBOVUxMLCAwKTsKKwkJaWYgKGVycikKKwkJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUkVQTFksCisJCQkJCVNDVFBfQ0hVTksoZXJyKSk7CisKKwkJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fQ09OU1VNRTsKKwl9CisKKwkvKiBGb3Igbm93LCBmYWlsIGFueSB1bnNlbnQvdW5hY2tlZCBkYXRhLiAgQ29uc2lkZXIgdGhlIG9wdGlvbmFsCisJICogY2hvaWNlIG9mIHJlc2VuZGluZyBvZiB0aGlzIGRhdGEuCisJICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9QVVJHRV9PVVRRVUVVRSwgU0NUUF9OVUxMKCkpOworCisJLyogVXBkYXRlIHRoZSBjb250ZW50IG9mIGN1cnJlbnQgYXNzb2NpYXRpb24uICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9VUERBVEVfQVNTT0MsIFNDVFBfQVNPQyhuZXdfYXNvYykpOworCisJcmVwbCA9IHNjdHBfbWFrZV9jb29raWVfYWNrKG5ld19hc29jLCBjaHVuayk7CisJaWYgKCFyZXBsKQorCQlnb3RvIG5vbWVtOworCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9SRVBMWSwgU0NUUF9DSFVOSyhyZXBsKSk7CisKKwkvKiBSZXBvcnQgYXNzb2NpYXRpb24gcmVzdGFydCB0byB1cHBlciBsYXllci4gKi8KKwlldiA9IHNjdHBfdWxwZXZlbnRfbWFrZV9hc3NvY19jaGFuZ2UoYXNvYywgMCwgU0NUUF9SRVNUQVJULCAwLAorCQkJCQkgICAgIG5ld19hc29jLT5jLnNpbml0X251bV9vc3RyZWFtcywKKwkJCQkJICAgICBuZXdfYXNvYy0+Yy5zaW5pdF9tYXhfaW5zdHJlYW1zLAorCQkJCQkgICAgIEdGUF9BVE9NSUMpOworCWlmICghZXYpCisJCWdvdG8gbm9tZW1fZXY7CisKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0VWRU5UX1VMUCwgU0NUUF9VTFBFVkVOVChldikpOworCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0NPTlNVTUU7CisKK25vbWVtX2V2OgorCXNjdHBfY2h1bmtfZnJlZShyZXBsKTsKK25vbWVtOgorCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX05PTUVNOworfQorCisvKiBVbmV4cGVjdGVkIENPT0tJRS1FQ0hPIGhhbmRsZXIgZm9yIHNldHVwIGNvbGxpc2lvbiAoVGFibGUgMiwgYWN0aW9uICdCJykKKyAqCisgKiBTZWN0aW9uIDUuMi40CisgKiAgIEIpIEluIHRoaXMgY2FzZSwgYm90aCBzaWRlcyBtYXkgYmUgYXR0ZW1wdGluZyB0byBzdGFydCBhbiBhc3NvY2lhdGlvbgorICogICAgICBhdCBhYm91dCB0aGUgc2FtZSB0aW1lIGJ1dCB0aGUgcGVlciBlbmRwb2ludCBzdGFydGVkIGl0cyBJTklUCisgKiAgICAgIGFmdGVyIHJlc3BvbmRpbmcgdG8gdGhlIGxvY2FsIGVuZHBvaW50J3MgSU5JVAorICovCisvKiBUaGlzIGNhc2UgcmVwcmVzZW50cyBhbiBpbml0aWFsaXphdGlvbiBjb2xsaXNpb24uICAqLworc3RhdGljIHNjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2RvX2R1cGNvb2tfYihjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkJCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCQlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCisJCQkJCXNjdHBfY21kX3NlcV90ICpjb21tYW5kcywKKwkJCQkJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKm5ld19hc29jKQoreworCXNjdHBfaW5pdF9jaHVua190ICpwZWVyX2luaXQ7CisJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2OworCXN0cnVjdCBzY3RwX2NodW5rICpyZXBsOworCisJLyogbmV3X2Fzb2MgaXMgYSBicmFuZC1uZXcgYXNzb2NpYXRpb24sIHNvIHRoZXNlIGFyZSBub3QgeWV0CisJICogc2lkZSBlZmZlY3RzLS1pdCBpcyBzYWZlIHRvIHJ1biB0aGVtIGhlcmUuCisJICovCisJcGVlcl9pbml0ID0gJmNodW5rLT5zdWJoLmNvb2tpZV9oZHItPmMucGVlcl9pbml0WzBdOworCWlmICghc2N0cF9wcm9jZXNzX2luaXQobmV3X2Fzb2MsIGNodW5rLT5jaHVua19oZHItPnR5cGUsCisJCQkgICAgICAgc2N0cF9zb3VyY2UoY2h1bmspLCBwZWVyX2luaXQsCisJCQkgICAgICAgR0ZQX0FUT01JQykpCisJCWdvdG8gbm9tZW07CisKKwkvKiBVcGRhdGUgdGhlIGNvbnRlbnQgb2YgY3VycmVudCBhc3NvY2lhdGlvbi4gICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9VUERBVEVfQVNTT0MsIFNDVFBfQVNPQyhuZXdfYXNvYykpOworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfTkVXX1NUQVRFLAorCQkJU0NUUF9TVEFURShTQ1RQX1NUQVRFX0VTVEFCTElTSEVEKSk7CisJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfQ1VSUkVTVEFCKTsKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0hCX1RJTUVSU19TVEFSVCwgU0NUUF9OVUxMKCkpOworCisJcmVwbCA9IHNjdHBfbWFrZV9jb29raWVfYWNrKG5ld19hc29jLCBjaHVuayk7CisJaWYgKCFyZXBsKQorCQlnb3RvIG5vbWVtOworCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9SRVBMWSwgU0NUUF9DSFVOSyhyZXBsKSk7CisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9UUkFOU01JVCwgU0NUUF9OVUxMKCkpOworCisJLyogUkZDIDI5NjAgNS4xIE5vcm1hbCBFc3RhYmxpc2htZW50IG9mIGFuIEFzc29jaWF0aW9uCisJICoKKwkgKiBEKSBJTVBMRU1FTlRBVElPTiBOT1RFOiBBbiBpbXBsZW1lbnRhdGlvbiBtYXkgY2hvb3NlIHRvCisJICogc2VuZCB0aGUgQ29tbXVuaWNhdGlvbiBVcCBub3RpZmljYXRpb24gdG8gdGhlIFNDVFAgdXNlcgorCSAqIHVwb24gcmVjZXB0aW9uIG9mIGEgdmFsaWQgQ09PS0lFIEVDSE8gY2h1bmsuCisJICovCisJZXYgPSBzY3RwX3VscGV2ZW50X21ha2VfYXNzb2NfY2hhbmdlKGFzb2MsIDAsIFNDVFBfQ09NTV9VUCwgMCwKKwkJCQkJICAgICBuZXdfYXNvYy0+Yy5zaW5pdF9udW1fb3N0cmVhbXMsCisJCQkJCSAgICAgbmV3X2Fzb2MtPmMuc2luaXRfbWF4X2luc3RyZWFtcywKKwkJCQkJICAgICBHRlBfQVRPTUlDKTsKKwlpZiAoIWV2KQorCQlnb3RvIG5vbWVtX2V2OworCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9FVkVOVF9VTFAsIFNDVFBfVUxQRVZFTlQoZXYpKTsKKworCS8qIFNvY2tldHMgQVBJIERyYWZ0IFNlY3Rpb24gNS4zLjEuNgorCSAqIFdoZW4gYSBwZWVyIHNlbmRzIGEgQWRhcHRpb24gTGF5ZXIgSW5kaWNhdGlvbiBwYXJhbWV0ZXIgLCBTQ1RQCisJICogZGVsaXZlcnMgdGhpcyBub3RpZmljYXRpb24gdG8gaW5mb3JtIHRoZSBhcHBsaWNhdGlvbiB0aGF0IG9mIHRoZQorCSAqIHBlZXJzIHJlcXVlc3RlZCBhZGFwdGlvbiBsYXllci4KKwkgKi8KKwlpZiAoYXNvYy0+cGVlci5hZGFwdGlvbl9pbmQpIHsKKwkJZXYgPSBzY3RwX3VscGV2ZW50X21ha2VfYWRhcHRpb25faW5kaWNhdGlvbihhc29jLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFldikKKwkJCWdvdG8gbm9tZW1fZXY7CisKKwkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9FVkVOVF9VTFAsCisJCQkJU0NUUF9VTFBFVkVOVChldikpOworCX0KKworCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0NPTlNVTUU7CisKK25vbWVtX2V2OgorCXNjdHBfY2h1bmtfZnJlZShyZXBsKTsKK25vbWVtOgorCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX05PTUVNOworfQorCisvKiBVbmV4cGVjdGVkIENPT0tJRS1FQ0hPIGhhbmRsZXIgZm9yIHNldHVwIGNvbGxpc2lvbiAoVGFibGUgMiwgYWN0aW9uICdDJykKKyAqCisgKiBTZWN0aW9uIDUuMi40CisgKiAgQykgSW4gdGhpcyBjYXNlLCB0aGUgbG9jYWwgZW5kcG9pbnQncyBjb29raWUgaGFzIGFycml2ZWQgbGF0ZS4KKyAqICAgICBCZWZvcmUgaXQgYXJyaXZlZCwgdGhlIGxvY2FsIGVuZHBvaW50IHNlbnQgYW4gSU5JVCBhbmQgcmVjZWl2ZWQgYW4KKyAqICAgICBJTklULUFDSyBhbmQgZmluYWxseSBzZW50IGEgQ09PS0lFIEVDSE8gd2l0aCB0aGUgcGVlcidzIHNhbWUgdGFnCisgKiAgICAgYnV0IGEgbmV3IHRhZyBvZiBpdHMgb3duLgorICovCisvKiBUaGlzIGNhc2UgcmVwcmVzZW50cyBhbiBpbml0aWFsaXphdGlvbiBjb2xsaXNpb24uICAqLworc3RhdGljIHNjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2RvX2R1cGNvb2tfYyhjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkJCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCQlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCisJCQkJCXNjdHBfY21kX3NlcV90ICpjb21tYW5kcywKKwkJCQkJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKm5ld19hc29jKQoreworCS8qIFRoZSBjb29raWUgc2hvdWxkIGJlIHNpbGVudGx5IGRpc2NhcmRlZC4KKwkgKiBUaGUgZW5kcG9pbnQgU0hPVUxEIE5PVCBjaGFuZ2Ugc3RhdGVzIGFuZCBzaG91bGQgbGVhdmUKKwkgKiBhbnkgdGltZXJzIHJ1bm5pbmcuCisJICovCisJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fRElTQ0FSRDsKK30KKworLyogVW5leHBlY3RlZCBDT09LSUUtRUNITyBoYW5kbGVyIGxvc3QgY2h1bmsgKFRhYmxlIDIsIGFjdGlvbiAnRCcpCisgKgorICogU2VjdGlvbiA1LjIuNAorICoKKyAqIEQpIFdoZW4gYm90aCBsb2NhbCBhbmQgcmVtb3RlIHRhZ3MgbWF0Y2ggdGhlIGVuZHBvaW50IHNob3VsZCBhbHdheXMKKyAqICAgIGVudGVyIHRoZSBFU1RBQkxJU0hFRCBzdGF0ZSwgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGRvbmUgc28uCisgKi8KKy8qIFRoaXMgY2FzZSByZXByZXNlbnRzIGFuIGluaXRpYWxpemF0aW9uIGNvbGxpc2lvbi4gICovCitzdGF0aWMgc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc2ZfZG9fZHVwY29va19kKGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwkJCQkJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKKwkJCQkJc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzLAorCQkJCQlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqbmV3X2Fzb2MpCit7CisJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ID0gTlVMTDsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqcmVwbDsKKworCS8qIENsYXJpZmljYXRpb24gZnJvbSBJbXBsZW1lbnRvcidzIEd1aWRlOgorCSAqIEQpIFdoZW4gYm90aCBsb2NhbCBhbmQgcmVtb3RlIHRhZ3MgbWF0Y2ggdGhlIGVuZHBvaW50IHNob3VsZAorICAgICAgICAgKiBlbnRlciB0aGUgRVNUQUJMSVNIRUQgc3RhdGUsIGlmIGl0IGlzIGluIHRoZSBDT09LSUUtRUNIT0VEIHN0YXRlLgorICAgICAgICAgKiBJdCBzaG91bGQgc3RvcCBhbnkgY29va2llIHRpbWVyIHRoYXQgbWF5IGJlIHJ1bm5pbmcgYW5kIHNlbmQKKyAgICAgICAgICogYSBDT09LSUUgQUNLLgorCSAqLworCisJLyogRG9uJ3QgYWNjaWRlbnRhbGx5IG1vdmUgYmFjayBpbnRvIGVzdGFibGlzaGVkIHN0YXRlLiAqLworCWlmIChhc29jLT5zdGF0ZSA8IFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQpIHsKKwkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9USU1FUl9TVE9QLAorCQkJCVNDVFBfVE8oU0NUUF9FVkVOVF9USU1FT1VUX1QxX0NPT0tJRSkpOworCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX05FV19TVEFURSwKKwkJCQlTQ1RQX1NUQVRFKFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQpKTsKKwkJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfQ1VSUkVTVEFCKTsKKwkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9IQl9USU1FUlNfU1RBUlQsCisJCQkJU0NUUF9OVUxMKCkpOworCisJCS8qIFJGQyAyOTYwIDUuMSBOb3JtYWwgRXN0YWJsaXNobWVudCBvZiBhbiBBc3NvY2lhdGlvbgorCQkgKgorCQkgKiBEKSBJTVBMRU1FTlRBVElPTiBOT1RFOiBBbiBpbXBsZW1lbnRhdGlvbiBtYXkgY2hvb3NlCisJCSAqIHRvIHNlbmQgdGhlIENvbW11bmljYXRpb24gVXAgbm90aWZpY2F0aW9uIHRvIHRoZQorCQkgKiBTQ1RQIHVzZXIgdXBvbiByZWNlcHRpb24gb2YgYSB2YWxpZCBDT09LSUUKKwkJICogRUNITyBjaHVuay4KKwkJICovCisJCWV2ID0gc2N0cF91bHBldmVudF9tYWtlX2Fzc29jX2NoYW5nZShuZXdfYXNvYywgMCwKKwkJCQkJICAgICBTQ1RQX0NPTU1fVVAsIDAsCisJCQkJCSAgICAgbmV3X2Fzb2MtPmMuc2luaXRfbnVtX29zdHJlYW1zLAorCQkJCQkgICAgIG5ld19hc29jLT5jLnNpbml0X21heF9pbnN0cmVhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRlBfQVRPTUlDKTsKKwkJaWYgKCFldikKKwkJCWdvdG8gbm9tZW07CisJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfRVZFTlRfVUxQLAorCQkJCVNDVFBfVUxQRVZFTlQoZXYpKTsKKworCQkvKiBTb2NrZXRzIEFQSSBEcmFmdCBTZWN0aW9uIDUuMy4xLjYKKwkJICogV2hlbiBhIHBlZXIgc2VuZHMgYSBBZGFwdGlvbiBMYXllciBJbmRpY2F0aW9uIHBhcmFtZXRlciwKKwkJICogU0NUUCBkZWxpdmVycyB0aGlzIG5vdGlmaWNhdGlvbiB0byBpbmZvcm0gdGhlIGFwcGxpY2F0aW9uCisJCSAqIHRoYXQgb2YgdGhlIHBlZXJzIHJlcXVlc3RlZCBhZGFwdGlvbiBsYXllci4KKwkJICovCisJCWlmIChuZXdfYXNvYy0+cGVlci5hZGFwdGlvbl9pbmQpIHsKKwkJCWV2ID0gc2N0cF91bHBldmVudF9tYWtlX2FkYXB0aW9uX2luZGljYXRpb24obmV3X2Fzb2MsCisJCQkJCQkJCSBHRlBfQVRPTUlDKTsKKwkJCWlmICghZXYpCisJCQkJZ290byBub21lbTsKKworCQkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9FVkVOVF9VTFAsCisJCQkJCVNDVFBfVUxQRVZFTlQoZXYpKTsKKwkJfQorCX0KKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RSQU5TTUlULCBTQ1RQX05VTEwoKSk7CisKKwlyZXBsID0gc2N0cF9tYWtlX2Nvb2tpZV9hY2sobmV3X2Fzb2MsIGNodW5rKTsKKwlpZiAoIXJlcGwpCisJCWdvdG8gbm9tZW07CisKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1JFUExZLCBTQ1RQX0NIVU5LKHJlcGwpKTsKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RSQU5TTUlULCBTQ1RQX05VTEwoKSk7CisKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9DT05TVU1FOworCitub21lbToKKwlpZiAoZXYpCisJCXNjdHBfdWxwZXZlbnRfZnJlZShldik7CisJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fTk9NRU07Cit9CisKKy8qCisgKiBIYW5kbGUgYSBkdXBsaWNhdGUgQ09PS0lFLUVDSE8uICBUaGlzIHVzdWFsbHkgbWVhbnMgYSBjb29raWUtY2FycnlpbmcKKyAqIGNodW5rIHdhcyByZXRyYW5zbWl0dGVkIGFuZCB0aGVuIGRlbGF5ZWQgaW4gdGhlIG5ldHdvcmsuCisgKgorICogU2VjdGlvbjogNS4yLjQgSGFuZGxlIGEgQ09PS0lFIEVDSE8gd2hlbiBhIFRDQiBleGlzdHMKKyAqCisgKiBWZXJpZmljYXRpb24gVGFnOiBOb25lLiAgRG8gY29va2llIHZhbGlkYXRpb24uCisgKgorICogSW5wdXRzCisgKiAoZW5kcG9pbnQsIGFzb2MsIGNodW5rKQorICoKKyAqIE91dHB1dHMKKyAqIChhc29jLCByZXBseV9tc2csIG1zZ191cCwgdGltZXJzLCBjb3VudGVycykKKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBkaXNwb3NpdGlvbiBvZiB0aGUgY2h1bmsuCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2RvXzVfMl80X2R1cGNvb2soY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCQljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkJY29uc3Qgc2N0cF9zdWJ0eXBlX3QgdHlwZSwKKwkJCQkJdm9pZCAqYXJnLAorCQkJCQlzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJc2N0cF9kaXNwb3NpdGlvbl90IHJldHZhbDsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmsgPSBhcmc7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKm5ld19hc29jOworCWludCBlcnJvciA9IDA7CisJY2hhciBhY3Rpb247CisJc3RydWN0IHNjdHBfY2h1bmsgKmVycl9jaGtfcDsKKworCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBjaHVuayBoYXMgYSB2YWxpZCBsZW5ndGggZnJvbSB0aGUgcHJvdG9jb2wKKwkgKiBwZXJzcGVjdGl2ZS4gIEluIHRoaXMgY2FzZSBjaGVjayB0byBtYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdAorCSAqIGVub3VnaCBmb3IgdGhlIGNodW5rIGhlYWRlci4gIENvb2tpZSBsZW5ndGggdmVyaWZpY2F0aW9uIGlzCisJICogZG9uZSBsYXRlci4KKwkgKi8KKwlpZiAoIXNjdHBfY2h1bmtfbGVuZ3RoX3ZhbGlkKGNodW5rLCBzaXplb2Yoc2N0cF9jaHVua2hkcl90KSkpCisJCXJldHVybiBzY3RwX3NmX3Zpb2xhdGlvbl9jaHVua2xlbihlcCwgYXNvYywgdHlwZSwgYXJnLAorCQkJCQkJICBjb21tYW5kcyk7CisKKwkvKiAiRGVjb2RlIiB0aGUgY2h1bmsuICBXZSBoYXZlIG5vIG9wdGlvbmFsIHBhcmFtZXRlcnMgc28gd2UKKwkgKiBhcmUgaW4gZ29vZCBzaGFwZS4KKwkgKi8KKyAgICAgICAgY2h1bmstPnN1YmguY29va2llX2hkciA9IChzdHJ1Y3Qgc2N0cF9zaWduZWRfY29va2llICopY2h1bmstPnNrYi0+ZGF0YTsKKwlza2JfcHVsbChjaHVuay0+c2tiLCBudG9ocyhjaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpIC0KKwkJIHNpemVvZihzY3RwX2NodW5raGRyX3QpKTsKKworCS8qIEluIFJGQyAyOTYwIDUuMi40IDMsIGlmIGJvdGggVmVyaWZpY2F0aW9uIFRhZ3MgaW4gdGhlIFN0YXRlIENvb2tpZQorCSAqIG9mIGEgZHVwbGljYXRlIENPT0tJRSBFQ0hPIG1hdGNoIHRoZSBWZXJpZmljYXRpb24gVGFncyBvZiB0aGUKKwkgKiBjdXJyZW50IGFzc29jaWF0aW9uLCBjb25zaWRlciB0aGUgU3RhdGUgQ29va2llIHZhbGlkIGV2ZW4gaWYKKwkgKiB0aGUgbGlmZXNwYW4gaXMgZXhjZWVkZWQuCisJICovCisJbmV3X2Fzb2MgPSBzY3RwX3VucGFja19jb29raWUoZXAsIGFzb2MsIGNodW5rLCBHRlBfQVRPTUlDLCAmZXJyb3IsCisJCQkJICAgICAgJmVycl9jaGtfcCk7CisKKwkvKiBGSVhNRToKKwkgKiBJZiB0aGUgcmUtYnVpbGQgZmFpbGVkLCB3aGF0IGlzIHRoZSBwcm9wZXIgZXJyb3IgcGF0aAorCSAqIGZyb20gaGVyZT8KKwkgKgorCSAqIFtXZSBzaG91bGQgYWJvcnQgdGhlIGFzc29jaWF0aW9uLiAtLXBpZ2d5XQorCSAqLworCWlmICghbmV3X2Fzb2MpIHsKKwkJLyogRklYTUU6IFNldmVyYWwgZXJyb3JzIGFyZSBwb3NzaWJsZS4gIEEgYmFkIGNvb2tpZSBzaG91bGQKKwkJICogYmUgc2lsZW50bHkgZGlzY2FyZGVkLCBidXQgdGhpbmsgYWJvdXQgbG9nZ2luZyBpdCB0b28uCisJCSAqLworCQlzd2l0Y2ggKGVycm9yKSB7CisJCWNhc2UgLVNDVFBfSUVSUk9SX05PTUVNOgorCQkJZ290byBub21lbTsKKworCQljYXNlIC1TQ1RQX0lFUlJPUl9TVEFMRV9DT09LSUU6CisJCQlzY3RwX3NlbmRfc3RhbGVfY29va2llX2VycihlcCwgYXNvYywgY2h1bmssIGNvbW1hbmRzLAorCQkJCQkJICAgZXJyX2Noa19wKTsKKwkJCXJldHVybiBzY3RwX3NmX3BkaXNjYXJkKGVwLCBhc29jLCB0eXBlLCBhcmcsIGNvbW1hbmRzKTsKKwkJY2FzZSAtU0NUUF9JRVJST1JfQkFEX1NJRzoKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBzY3RwX3NmX3BkaXNjYXJkKGVwLCBhc29jLCB0eXBlLCBhcmcsIGNvbW1hbmRzKTsKKwkJfTsKKwl9CisKKwkvKiBDb21wYXJlIHRoZSB0aWVfdGFnIGluIGNvb2tpZSB3aXRoIHRoZSB2ZXJpZmljYXRpb24gdGFnIG9mCisJICogY3VycmVudCBhc3NvY2lhdGlvbi4KKwkgKi8KKwlhY3Rpb24gPSBzY3RwX3RpZXRhZ3NfY29tcGFyZShuZXdfYXNvYywgYXNvYyk7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgJ0EnOiAvKiBBc3NvY2lhdGlvbiByZXN0YXJ0LiAqLworCQlyZXR2YWwgPSBzY3RwX3NmX2RvX2R1cGNvb2tfYShlcCwgYXNvYywgY2h1bmssIGNvbW1hbmRzLAorCQkJCQkgICAgICBuZXdfYXNvYyk7CisJCWJyZWFrOworCisJY2FzZSAnQic6IC8qIENvbGxpc2lvbiBjYXNlIEIuICovCisJCXJldHZhbCA9IHNjdHBfc2ZfZG9fZHVwY29va19iKGVwLCBhc29jLCBjaHVuaywgY29tbWFuZHMsCisJCQkJCSAgICAgIG5ld19hc29jKTsKKwkJYnJlYWs7CisKKwljYXNlICdDJzogLyogQ29sbGlzaW9uIGNhc2UgQy4gKi8KKwkJcmV0dmFsID0gc2N0cF9zZl9kb19kdXBjb29rX2MoZXAsIGFzb2MsIGNodW5rLCBjb21tYW5kcywKKwkJCQkJICAgICAgbmV3X2Fzb2MpOworCQlicmVhazsKKworCWNhc2UgJ0QnOiAvKiBDb2xsaXNpb24gY2FzZSBELiAqLworCQlyZXR2YWwgPSBzY3RwX3NmX2RvX2R1cGNvb2tfZChlcCwgYXNvYywgY2h1bmssIGNvbW1hbmRzLAorCQkJCQkgICAgICBuZXdfYXNvYyk7CisJCWJyZWFrOworCisJZGVmYXVsdDogLyogRGlzY2FyZCBwYWNrZXQgZm9yIGFsbCBvdGhlcnMuICovCisJCXJldHZhbCA9IHNjdHBfc2ZfcGRpc2NhcmQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworCQlicmVhazsKKyAgICAgICAgfTsKKworCS8qIERlbGV0ZSB0aGUgdGVtcG9yeSBuZXcgYXNzb2NpYXRpb24uICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9ORVdfQVNPQywgU0NUUF9BU09DKG5ld19hc29jKSk7CisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9ERUxFVEVfVENCLCBTQ1RQX05VTEwoKSk7CisKKwlyZXR1cm4gcmV0dmFsOworCitub21lbToKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9OT01FTTsKK30KKworLyoKKyAqIFByb2Nlc3MgYW4gQUJPUlQuICAoU0hVVERPV04tUEVORElORyBzdGF0ZSkKKyAqCisgKiBTZWUgc2N0cF9zZl9kb185XzFfYWJvcnQoKS4KKyAqLworc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc2Zfc2h1dGRvd25fcGVuZGluZ19hYm9ydCgKKwljb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJY29uc3Qgc2N0cF9zdWJ0eXBlX3QgdHlwZSwKKwl2b2lkICphcmcsCisJc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuayA9IGFyZzsKKworCWlmICghc2N0cF92dGFnX3ZlcmlmeV9laXRoZXIoY2h1bmssIGFzb2MpKQorCQlyZXR1cm4gc2N0cF9zZl9wZGlzY2FyZChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgQUJPUlQgY2h1bmsgaGFzIGEgdmFsaWQgbGVuZ3RoLgorCSAqIFNpbmNlIHRoaXMgaXMgYW4gQUJPUlQgY2h1bmssIHdlIGhhdmUgdG8gZGlzY2FyZCBpdAorCSAqIGJlY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyB0ZXh0OgorCSAqIFJGQyAyOTYwLCBTZWN0aW9uIDMuMy43CisJICogICAgSWYgYW4gZW5kcG9pbnQgcmVjZWl2ZXMgYW4gQUJPUlQgd2l0aCBhIGZvcm1hdCBlcnJvciBvciBmb3IgYW4KKwkgKiAgICBhc3NvY2lhdGlvbiB0aGF0IGRvZXNuJ3QgZXhpc3QsIGl0IE1VU1Qgc2lsZW50bHkgZGlzY2FyZCBpdC4KKwkgKiBCZWNhc3VlIHRoZSBsZW5ndGggaXMgImludmFsaWQiLCB3ZSBjYW4ndCByZWFsbHkgZGlzY2FyZCBqdXN0CisJICogYXMgd2UgZG8gbm90IGtub3cgaXRzIHRydWUgbGVuZ3RoLiAgU28sIHRvIGJlIHNhZmUsIGRpc2NhcmQgdGhlCisJICogcGFja2V0LgorCSAqLworCWlmICghc2N0cF9jaHVua19sZW5ndGhfdmFsaWQoY2h1bmssIHNpemVvZihzY3RwX2Fib3J0X2NodW5rX3QpKSkKKwkJcmV0dXJuIHNjdHBfc2ZfcGRpc2NhcmQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworCisJLyogU3RvcCB0aGUgVDUtc2h1dGRvd24gZ3VhcmQgdGltZXIuICAqLworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVElNRVJfU1RPUCwKKwkJCVNDVFBfVE8oU0NUUF9FVkVOVF9USU1FT1VUX1Q1X1NIVVRET1dOX0dVQVJEKSk7CisKKwlyZXR1cm4gc2N0cF9zZl9kb185XzFfYWJvcnQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworfQorCisvKgorICogUHJvY2VzcyBhbiBBQk9SVC4gIChTSFVURE9XTi1TRU5UIHN0YXRlKQorICoKKyAqIFNlZSBzY3RwX3NmX2RvXzlfMV9hYm9ydCgpLgorICovCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl9zaHV0ZG93bl9zZW50X2Fib3J0KGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwkJCQkJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJCWNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJCQkJCXZvaWQgKmFyZywKKwkJCQkJc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuayA9IGFyZzsKKworCWlmICghc2N0cF92dGFnX3ZlcmlmeV9laXRoZXIoY2h1bmssIGFzb2MpKQorCQlyZXR1cm4gc2N0cF9zZl9wZGlzY2FyZChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgQUJPUlQgY2h1bmsgaGFzIGEgdmFsaWQgbGVuZ3RoLgorCSAqIFNpbmNlIHRoaXMgaXMgYW4gQUJPUlQgY2h1bmssIHdlIGhhdmUgdG8gZGlzY2FyZCBpdAorCSAqIGJlY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyB0ZXh0OgorCSAqIFJGQyAyOTYwLCBTZWN0aW9uIDMuMy43CisJICogICAgSWYgYW4gZW5kcG9pbnQgcmVjZWl2ZXMgYW4gQUJPUlQgd2l0aCBhIGZvcm1hdCBlcnJvciBvciBmb3IgYW4KKwkgKiAgICBhc3NvY2lhdGlvbiB0aGF0IGRvZXNuJ3QgZXhpc3QsIGl0IE1VU1Qgc2lsZW50bHkgZGlzY2FyZCBpdC4KKwkgKiBCZWNhc3VlIHRoZSBsZW5ndGggaXMgImludmFsaWQiLCB3ZSBjYW4ndCByZWFsbHkgZGlzY2FyZCBqdXN0CisJICogYXMgd2UgZG8gbm90IGtub3cgaXRzIHRydWUgbGVuZ3RoLiAgU28sIHRvIGJlIHNhZmUsIGRpc2NhcmQgdGhlCisJICogcGFja2V0LgorCSAqLworCWlmICghc2N0cF9jaHVua19sZW5ndGhfdmFsaWQoY2h1bmssIHNpemVvZihzY3RwX2Fib3J0X2NodW5rX3QpKSkKKwkJcmV0dXJuIHNjdHBfc2ZfcGRpc2NhcmQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworCisJLyogU3RvcCB0aGUgVDItc2h1dGRvd24gdGltZXIuICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9USU1FUl9TVE9QLAorCQkJU0NUUF9UTyhTQ1RQX0VWRU5UX1RJTUVPVVRfVDJfU0hVVERPV04pKTsKKworCS8qIFN0b3AgdGhlIFQ1LXNodXRkb3duIGd1YXJkIHRpbWVyLiAgKi8KKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RJTUVSX1NUT1AsCisJCQlTQ1RQX1RPKFNDVFBfRVZFTlRfVElNRU9VVF9UNV9TSFVURE9XTl9HVUFSRCkpOworCisJcmV0dXJuIHNjdHBfc2ZfZG9fOV8xX2Fib3J0KGVwLCBhc29jLCB0eXBlLCBhcmcsIGNvbW1hbmRzKTsKK30KKworLyoKKyAqIFByb2Nlc3MgYW4gQUJPUlQuICAoU0hVVERPV04tQUNLLVNFTlQgc3RhdGUpCisgKgorICogU2VlIHNjdHBfc2ZfZG9fOV8xX2Fib3J0KCkuCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX3NodXRkb3duX2Fja19zZW50X2Fib3J0KAorCWNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwljb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAorCXZvaWQgKmFyZywKKwlzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJLyogVGhlIHNhbWUgVDIgdGltZXIsIHNvIHdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZQorCSAqIGNvbW1vbiBmdW5jdGlvbiB3aXRoIHRoZSBTSFVURE9XTi1TRU5UIHN0YXRlLgorCSAqLworCXJldHVybiBzY3RwX3NmX3NodXRkb3duX3NlbnRfYWJvcnQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworfQorCisvKgorICogSGFuZGxlIGFuIEVycm9yIHJlY2VpdmVkIGluIENPT0tJRV9FQ0hPRUQgc3RhdGUuCisgKgorICogT25seSBoYW5kbGUgdGhlIGVycm9yIHR5cGUgb2Ygc3RhbGUgQ09PS0lFIEVycm9yLCB0aGUgb3RoZXIgZXJyb3JzIHdpbGwKKyAqIGJlIGlnbm9yZWQuCisgKgorICogSW5wdXRzCisgKiAoZW5kcG9pbnQsIGFzb2MsIGNodW5rKQorICoKKyAqIE91dHB1dHMKKyAqIChhc29jLCByZXBseV9tc2csIG1zZ191cCwgdGltZXJzLCBjb3VudGVycykKKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBkaXNwb3NpdGlvbiBvZiB0aGUgY2h1bmsuCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2Nvb2tpZV9lY2hvZWRfZXJyKGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwkJCQkJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJCWNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJCQkJCXZvaWQgKmFyZywKKwkJCQkJc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuayA9IGFyZzsKKwlzY3RwX2Vycmhkcl90ICplcnI7CisKKwlpZiAoIXNjdHBfdnRhZ192ZXJpZnkoY2h1bmssIGFzb2MpKQorCQlyZXR1cm4gc2N0cF9zZl9wZGlzY2FyZChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgRVJST1IgY2h1bmsgaGFzIGEgdmFsaWQgbGVuZ3RoLgorCSAqIFRoZSBwYXJhbWV0ZXIgd2Fsa2luZyBkZXBlbmRzIG9uIHRoaXMgYXMgd2VsbC4KKwkgKi8KKwlpZiAoIXNjdHBfY2h1bmtfbGVuZ3RoX3ZhbGlkKGNodW5rLCBzaXplb2Yoc2N0cF9vcGVycl9jaHVua190KSkpCisJCXJldHVybiBzY3RwX3NmX3Zpb2xhdGlvbl9jaHVua2xlbihlcCwgYXNvYywgdHlwZSwgYXJnLAorCQkJCQkJICBjb21tYW5kcyk7CisKKwkvKiBQcm9jZXNzIHRoZSBlcnJvciBoZXJlICovCisJLyogRlVUVVJFIEZJWE1FOiAgV2hlbiBQUi1TQ1RQIHJlbGF0ZWQgYW5kIG90aGVyIG9wdGlvbmFsCisJICogcGFybXMgYXJlIGVtaXR0ZWQsIHRoaXMgd2lsbCBoYXZlIHRvIGNoYW5nZSB0byBoYW5kbGUgbXVsdGlwbGUKKwkgKiBlcnJvcnMuCisJICovCisJc2N0cF93YWxrX2Vycm9ycyhlcnIsIGNodW5rLT5jaHVua19oZHIpIHsKKwkJaWYgKFNDVFBfRVJST1JfU1RBTEVfQ09PS0lFID09IGVyci0+Y2F1c2UpCisJCQlyZXR1cm4gc2N0cF9zZl9kb181XzJfNl9zdGFsZShlcCwgYXNvYywgdHlwZSwgCisJCQkJCQkJYXJnLCBjb21tYW5kcyk7CisJfQorCisJLyogSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBtYWxmb3JtZWQgZXJyb3IgY2F1c2VzLCBhbmQgdGhhdAorCSAqIHdpbGwgY2F1c2UgdXMgdG8gZW5kIHRoZSB3YWxrIGVhcmx5LiAgSG93ZXZlciwgc2luY2UKKwkgKiB3ZSBhcmUgZGlzY2FyZGluZyB0aGUgcGFja2V0LCB0aGVyZSBzaG91bGQgYmUgbm8gYWR2ZXJzZQorCSAqIGFmZmVjdHMuCisJICovCisJcmV0dXJuIHNjdHBfc2ZfcGRpc2NhcmQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworfQorCisvKgorICogSGFuZGxlIGEgU3RhbGUgQ09PS0lFIEVycm9yCisgKgorICogU2VjdGlvbjogNS4yLjYgSGFuZGxlIFN0YWxlIENPT0tJRSBFcnJvcgorICogSWYgdGhlIGFzc29jaWF0aW9uIGlzIGluIHRoZSBDT09LSUUtRUNIT0VEIHN0YXRlLCB0aGUgZW5kcG9pbnQgbWF5IGVsZWN0CisgKiBvbmUgb2YgdGhlIGZvbGxvd2luZyB0aHJlZSBhbHRlcm5hdGl2ZXMuCisgKiAuLi4KKyAqIDMpIFNlbmQgYSBuZXcgSU5JVCBjaHVuayB0byB0aGUgZW5kcG9pbnQsIGFkZGluZyBhIENvb2tpZQorICogICAgUHJlc2VydmF0aXZlIHBhcmFtZXRlciByZXF1ZXN0aW5nIGFuIGV4dGVuc2lvbiB0byB0aGUgbGlmZXRpbWUgb2YKKyAqICAgIHRoZSBTdGF0ZSBDb29raWUuIFdoZW4gY2FsY3VsYXRpbmcgdGhlIHRpbWUgZXh0ZW5zaW9uLCBhbgorICogICAgaW1wbGVtZW50YXRpb24gU0hPVUxEIHVzZSB0aGUgUlRUIGluZm9ybWF0aW9uIG1lYXN1cmVkIGJhc2VkIG9uIHRoZQorICogICAgcHJldmlvdXMgQ09PS0lFIEVDSE8gLyBFUlJPUiBleGNoYW5nZSwgYW5kIHNob3VsZCBhZGQgbm8gbW9yZQorICogICAgdGhhbiAxIHNlY29uZCBiZXlvbmQgdGhlIG1lYXN1cmVkIFJUVCwgZHVlIHRvIGxvbmcgU3RhdGUgQ29va2llCisgKiAgICBsaWZldGltZXMgbWFraW5nIHRoZSBlbmRwb2ludCBtb3JlIHN1YmplY3QgdG8gYSByZXBsYXkgYXR0YWNrLgorICoKKyAqIFZlcmlmaWNhdGlvbiBUYWc6ICBOb3QgZXhwbGljaXQsIGJ1dCBzYWZlIHRvIGlnbm9yZS4KKyAqCisgKiBJbnB1dHMKKyAqIChlbmRwb2ludCwgYXNvYywgY2h1bmspCisgKgorICogT3V0cHV0cworICogKGFzb2MsIHJlcGx5X21zZywgbXNnX3VwLCB0aW1lcnMsIGNvdW50ZXJzKQorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGRpc3Bvc2l0aW9uIG9mIHRoZSBjaHVuay4KKyAqLworc3RhdGljIHNjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2RvXzVfMl82X3N0YWxlKGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwkJCQkJCSBjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkJCSBjb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAorCQkJCQkJIHZvaWQgKmFyZywKKwkJCQkJCSBzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rID0gYXJnOworCXRpbWVfdCBzdGFsZTsKKwlzY3RwX2Nvb2tpZV9wcmVzZXJ2ZV9wYXJhbV90IGJodDsKKwlzY3RwX2Vycmhkcl90ICplcnI7CisJc3RydWN0IHNjdHBfY2h1bmsgKnJlcGx5OworCXN0cnVjdCBzY3RwX2JpbmRfYWRkciAqYnA7CisJaW50IGF0dGVtcHRzOworCisJYXR0ZW1wdHMgPSBhc29jLT5jb3VudGVyc1tTQ1RQX0NPVU5URVJfSU5JVF9FUlJPUl0gKyAxOworCisJaWYgKGF0dGVtcHRzID49IGFzb2MtPm1heF9pbml0X2F0dGVtcHRzKSB7CisJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfSU5JVF9GQUlMRUQsCisJCQkJU0NUUF9VMzIoU0NUUF9FUlJPUl9TVEFMRV9DT09LSUUpKTsKKwkJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fREVMRVRFX1RDQjsKKwl9CisKKwllcnIgPSAoc2N0cF9lcnJoZHJfdCAqKShjaHVuay0+c2tiLT5kYXRhKTsKKworCS8qIFdoZW4gY2FsY3VsYXRpbmcgdGhlIHRpbWUgZXh0ZW5zaW9uLCBhbiBpbXBsZW1lbnRhdGlvbgorCSAqIFNIT1VMRCB1c2UgdGhlIFJUVCBpbmZvcm1hdGlvbiBtZWFzdXJlZCBiYXNlZCBvbiB0aGUKKwkgKiBwcmV2aW91cyBDT09LSUUgRUNITyAvIEVSUk9SIGV4Y2hhbmdlLCBhbmQgc2hvdWxkIGFkZCBubworCSAqIG1vcmUgdGhhbiAxIHNlY29uZCBiZXlvbmQgdGhlIG1lYXN1cmVkIFJUVCwgZHVlIHRvIGxvbmcKKwkgKiBTdGF0ZSBDb29raWUgbGlmZXRpbWVzIG1ha2luZyB0aGUgZW5kcG9pbnQgbW9yZSBzdWJqZWN0IHRvCisJICogYSByZXBsYXkgYXR0YWNrLgorCSAqIE1lYXN1cmUgb2YgU3RhbGVuZXNzJ3MgdW5pdCBpcyB1c2VjLiAoMS8xMDAwMDAwIHNlYykKKwkgKiBTdWdnZXN0ZWQgQ29va2llIExpZmUtc3BhbiBJbmNyZW1lbnQncyB1bml0IGlzIG1zZWMuCisJICogKDEvMTAwMCBzZWMpCisJICogSW4gZ2VuZXJhbCwgaWYgeW91IHVzZSB0aGUgc3VnZ2VzdGVkIGNvb2tpZSBsaWZlLCB0aGUgdmFsdWUKKwkgKiBmb3VuZCBpbiB0aGUgZmllbGQgb2YgbWVhc3VyZSBvZiBzdGFsZW5lc3Mgc2hvdWxkIGJlIGRvdWJsZWQKKwkgKiB0byBnaXZlIGFtcGxlIHRpbWUgdG8gcmV0cmFuc21pdCB0aGUgbmV3IGNvb2tpZSBhbmQgdGh1cworCSAqIHlpZWxkIGEgaGlnaGVyIHByb2JhYmlsaXR5IG9mIHN1Y2Nlc3Mgb24gdGhlIHJlYXR0ZW1wdC4KKwkgKi8KKwlzdGFsZSA9IG50b2hsKCooc3VzZWNvbmRzX3QgKikoKHU4ICopZXJyICsgc2l6ZW9mKHNjdHBfZXJyaGRyX3QpKSk7CisJc3RhbGUgPSAoc3RhbGUgKiAyKSAvIDEwMDA7CisKKwliaHQucGFyYW1faGRyLnR5cGUgPSBTQ1RQX1BBUkFNX0NPT0tJRV9QUkVTRVJWQVRJVkU7CisJYmh0LnBhcmFtX2hkci5sZW5ndGggPSBodG9ucyhzaXplb2YoYmh0KSk7CisJYmh0LmxpZmVzcGFuX2luY3JlbWVudCA9IGh0b25sKHN0YWxlKTsKKworCS8qIEJ1aWxkIHRoYXQgbmV3IElOSVQgY2h1bmsuICAqLworCWJwID0gKHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqKSAmYXNvYy0+YmFzZS5iaW5kX2FkZHI7CisJcmVwbHkgPSBzY3RwX21ha2VfaW5pdChhc29jLCBicCwgR0ZQX0FUT01JQywgc2l6ZW9mKGJodCkpOworCWlmICghcmVwbHkpCisJCWdvdG8gbm9tZW07CisKKwlzY3RwX2FkZHRvX2NodW5rKHJlcGx5LCBzaXplb2YoYmh0KSwgJmJodCk7CisKKwkvKiBDbGVhciBwZWVyJ3MgaW5pdF90YWcgY2FjaGVkIGluIGFzc29jIGFzIHdlIGFyZSBzZW5kaW5nIGEgbmV3IElOSVQgKi8KKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0NMRUFSX0lOSVRfVEFHLCBTQ1RQX05VTEwoKSk7CisKKwkvKiBTdG9wIHBlbmRpbmcgVDMtcnR4IGFuZCBoZWFydGJlYXQgdGltZXJzICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9UM19SVFhfVElNRVJTX1NUT1AsIFNDVFBfTlVMTCgpKTsKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0hCX1RJTUVSU19TVE9QLCBTQ1RQX05VTEwoKSk7CisKKwkvKiBEZWxldGUgbm9uLXByaW1hcnkgcGVlciBpcCBhZGRyZXNzZXMgc2luY2Ugd2UgYXJlIHRyYW5zaXRpb25pbmcKKwkgKiBiYWNrIHRvIHRoZSBDT09LSUUtV0FJVCBzdGF0ZQorCSAqLworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfREVMX05PTl9QUklNQVJZLCBTQ1RQX05VTEwoKSk7CisKKwkvKiBJZiB3ZSd2ZSBzZW50IGFueSBkYXRhIGJ1bmRsZWQgd2l0aCBDT09LSUUtRUNITyB3ZSB3aWxsIG5lZWQgdG8gCisJICogcmVzZW5kIAorCSAqLworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUkVUUkFOLCAKKwkJCVNDVFBfVFJBTlNQT1JUKGFzb2MtPnBlZXIucHJpbWFyeV9wYXRoKSk7CisKKwkvKiBDYXN0IGF3YXkgdGhlIGNvbnN0IG1vZGlmaWVyLCBhcyB3ZSB3YW50IHRvIGp1c3QKKwkgKiByZXJ1biBpdCB0aHJvdWdoIGFzIGEgc2lkZWZmZWN0LgorCSAqLworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfQ09VTlRFUl9JTkMsCisJCQlTQ1RQX0NPVU5URVIoU0NUUF9DT1VOVEVSX0lOSVRfRVJST1IpKTsKKworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVElNRVJfU1RPUCwKKwkJCVNDVFBfVE8oU0NUUF9FVkVOVF9USU1FT1VUX1QxX0NPT0tJRSkpOworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfTkVXX1NUQVRFLAorCQkJU0NUUF9TVEFURShTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUKSk7CisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9USU1FUl9TVEFSVCwKKwkJCVNDVFBfVE8oU0NUUF9FVkVOVF9USU1FT1VUX1QxX0lOSVQpKTsKKworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUkVQTFksIFNDVFBfQ0hVTksocmVwbHkpKTsKKworCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0NPTlNVTUU7CisKK25vbWVtOgorCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX05PTUVNOworfQorCisvKgorICogUHJvY2VzcyBhbiBBQk9SVC4KKyAqCisgKiBTZWN0aW9uOiA5LjEKKyAqIEFmdGVyIGNoZWNraW5nIHRoZSBWZXJpZmljYXRpb24gVGFnLCB0aGUgcmVjZWl2aW5nIGVuZHBvaW50IHNoYWxsCisgKiByZW1vdmUgdGhlIGFzc29jaWF0aW9uIGZyb20gaXRzIHJlY29yZCwgYW5kIHNoYWxsIHJlcG9ydCB0aGUKKyAqIHRlcm1pbmF0aW9uIHRvIGl0cyB1cHBlciBsYXllci4KKyAqCisgKiBWZXJpZmljYXRpb24gVGFnOiA4LjUuMSBFeGNlcHRpb25zIGluIFZlcmlmaWNhdGlvbiBUYWcgUnVsZXMKKyAqIEIpIFJ1bGVzIGZvciBwYWNrZXQgY2FycnlpbmcgQUJPUlQ6CisgKgorICogIC0gVGhlIGVuZHBvaW50IHNoYWxsIGFsd2F5cyBmaWxsIGluIHRoZSBWZXJpZmljYXRpb24gVGFnIGZpZWxkIG9mIHRoZQorICogICAgb3V0Ym91bmQgcGFja2V0IHdpdGggdGhlIGRlc3RpbmF0aW9uIGVuZHBvaW50J3MgdGFnIHZhbHVlIGlmIGl0CisgKiAgICBpcyBrbm93bi4KKyAqCisgKiAgLSBJZiB0aGUgQUJPUlQgaXMgc2VudCBpbiByZXNwb25zZSB0byBhbiBPT1RCIHBhY2tldCwgdGhlIGVuZHBvaW50CisgKiAgICBNVVNUIGZvbGxvdyB0aGUgcHJvY2VkdXJlIGRlc2NyaWJlZCBpbiBTZWN0aW9uIDguNC4KKyAqCisgKiAgLSBUaGUgcmVjZWl2ZXIgTVVTVCBhY2NlcHQgdGhlIHBhY2tldCBpZiB0aGUgVmVyaWZpY2F0aW9uIFRhZworICogICAgbWF0Y2hlcyBlaXRoZXIgaXRzIG93biB0YWcsIE9SIHRoZSB0YWcgb2YgaXRzIHBlZXIuIE90aGVyd2lzZSwgdGhlCisgKiAgICByZWNlaXZlciBNVVNUIHNpbGVudGx5IGRpc2NhcmQgdGhlIHBhY2tldCBhbmQgdGFrZSBubyBmdXJ0aGVyCisgKiAgICBhY3Rpb24uCisgKgorICogSW5wdXRzCisgKiAoZW5kcG9pbnQsIGFzb2MsIGNodW5rKQorICoKKyAqIE91dHB1dHMKKyAqIChhc29jLCByZXBseV9tc2csIG1zZ191cCwgdGltZXJzLCBjb3VudGVycykKKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBkaXNwb3NpdGlvbiBvZiB0aGUgY2h1bmsuCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2RvXzlfMV9hYm9ydChjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkJCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCQljb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAorCQkJCQl2b2lkICphcmcsCisJCQkJCXNjdHBfY21kX3NlcV90ICpjb21tYW5kcykKK3sKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmsgPSBhcmc7CisJdW5zaWduZWQgbGVuOworCV9fdTE2IGVycm9yID0gU0NUUF9FUlJPUl9OT19FUlJPUjsKKworCWlmICghc2N0cF92dGFnX3ZlcmlmeV9laXRoZXIoY2h1bmssIGFzb2MpKQorCQlyZXR1cm4gc2N0cF9zZl9wZGlzY2FyZChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgQUJPUlQgY2h1bmsgaGFzIGEgdmFsaWQgbGVuZ3RoLgorCSAqIFNpbmNlIHRoaXMgaXMgYW4gQUJPUlQgY2h1bmssIHdlIGhhdmUgdG8gZGlzY2FyZCBpdAorCSAqIGJlY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyB0ZXh0OgorCSAqIFJGQyAyOTYwLCBTZWN0aW9uIDMuMy43CisJICogICAgSWYgYW4gZW5kcG9pbnQgcmVjZWl2ZXMgYW4gQUJPUlQgd2l0aCBhIGZvcm1hdCBlcnJvciBvciBmb3IgYW4KKwkgKiAgICBhc3NvY2lhdGlvbiB0aGF0IGRvZXNuJ3QgZXhpc3QsIGl0IE1VU1Qgc2lsZW50bHkgZGlzY2FyZCBpdC4KKwkgKiBCZWNhc3VlIHRoZSBsZW5ndGggaXMgImludmFsaWQiLCB3ZSBjYW4ndCByZWFsbHkgZGlzY2FyZCBqdXN0CisJICogYXMgd2UgZG8gbm90IGtub3cgaXRzIHRydWUgbGVuZ3RoLiAgU28sIHRvIGJlIHNhZmUsIGRpc2NhcmQgdGhlCisJICogcGFja2V0LgorCSAqLworCWlmICghc2N0cF9jaHVua19sZW5ndGhfdmFsaWQoY2h1bmssIHNpemVvZihzY3RwX2Fib3J0X2NodW5rX3QpKSkKKwkJcmV0dXJuIHNjdHBfc2ZfcGRpc2NhcmQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworCisJLyogU2VlIGlmIHdlIGhhdmUgYW4gZXJyb3IgY2F1c2UgY29kZSBpbiB0aGUgY2h1bmsuICAqLworCWxlbiA9IG50b2hzKGNodW5rLT5jaHVua19oZHItPmxlbmd0aCk7CisJaWYgKGxlbiA+PSBzaXplb2Yoc3RydWN0IHNjdHBfY2h1bmtoZHIpICsgc2l6ZW9mKHN0cnVjdCBzY3RwX2VycmhkcikpCisJCWVycm9yID0gKChzY3RwX2Vycmhkcl90ICopY2h1bmstPnNrYi0+ZGF0YSktPmNhdXNlOworCisgCS8qIEFTU09DX0ZBSUxFRCB3aWxsIERFTEVURV9UQ0IuICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9BU1NPQ19GQUlMRUQsIFNDVFBfVTMyKGVycm9yKSk7CisJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfQUJPUlRFRFMpOworCVNDVFBfREVDX1NUQVRTKFNDVFBfTUlCX0NVUlJFU1RBQik7CisKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9BQk9SVDsKK30KKworLyoKKyAqIFByb2Nlc3MgYW4gQUJPUlQuICAoQ09PS0lFLVdBSVQgc3RhdGUpCisgKgorICogU2VlIHNjdHBfc2ZfZG9fOV8xX2Fib3J0KCkgYWJvdmUuCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2Nvb2tpZV93YWl0X2Fib3J0KGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSAgICAgY29uc3Qgc2N0cF9zdWJ0eXBlX3QgdHlwZSwKKwkJCQkgICAgIHZvaWQgKmFyZywKKwkJCQkgICAgIHNjdHBfY21kX3NlcV90ICpjb21tYW5kcykKK3sKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmsgPSBhcmc7CisJdW5zaWduZWQgbGVuOworCV9fdTE2IGVycm9yID0gU0NUUF9FUlJPUl9OT19FUlJPUjsKKworCWlmICghc2N0cF92dGFnX3ZlcmlmeV9laXRoZXIoY2h1bmssIGFzb2MpKQorCQlyZXR1cm4gc2N0cF9zZl9wZGlzY2FyZChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgQUJPUlQgY2h1bmsgaGFzIGEgdmFsaWQgbGVuZ3RoLgorCSAqIFNpbmNlIHRoaXMgaXMgYW4gQUJPUlQgY2h1bmssIHdlIGhhdmUgdG8gZGlzY2FyZCBpdAorCSAqIGJlY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyB0ZXh0OgorCSAqIFJGQyAyOTYwLCBTZWN0aW9uIDMuMy43CisJICogICAgSWYgYW4gZW5kcG9pbnQgcmVjZWl2ZXMgYW4gQUJPUlQgd2l0aCBhIGZvcm1hdCBlcnJvciBvciBmb3IgYW4KKwkgKiAgICBhc3NvY2lhdGlvbiB0aGF0IGRvZXNuJ3QgZXhpc3QsIGl0IE1VU1Qgc2lsZW50bHkgZGlzY2FyZCBpdC4KKwkgKiBCZWNhc3VlIHRoZSBsZW5ndGggaXMgImludmFsaWQiLCB3ZSBjYW4ndCByZWFsbHkgZGlzY2FyZCBqdXN0CisJICogYXMgd2UgZG8gbm90IGtub3cgaXRzIHRydWUgbGVuZ3RoLiAgU28sIHRvIGJlIHNhZmUsIGRpc2NhcmQgdGhlCisJICogcGFja2V0LgorCSAqLworCWlmICghc2N0cF9jaHVua19sZW5ndGhfdmFsaWQoY2h1bmssIHNpemVvZihzY3RwX2Fib3J0X2NodW5rX3QpKSkKKwkJcmV0dXJuIHNjdHBfc2ZfcGRpc2NhcmQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworCisJLyogU2VlIGlmIHdlIGhhdmUgYW4gZXJyb3IgY2F1c2UgY29kZSBpbiB0aGUgY2h1bmsuICAqLworCWxlbiA9IG50b2hzKGNodW5rLT5jaHVua19oZHItPmxlbmd0aCk7CisJaWYgKGxlbiA+PSBzaXplb2Yoc3RydWN0IHNjdHBfY2h1bmtoZHIpICsgc2l6ZW9mKHN0cnVjdCBzY3RwX2VycmhkcikpCisJCWVycm9yID0gKChzY3RwX2Vycmhkcl90ICopY2h1bmstPnNrYi0+ZGF0YSktPmNhdXNlOworCisgCXNjdHBfc3RvcF90MV9hbmRfYWJvcnQoY29tbWFuZHMsIGVycm9yKTsKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9BQk9SVDsKK30KKworLyoKKyAqIFByb2Nlc3MgYW4gaW5jb21pbmcgSUNNUCBhcyBhbiBBQk9SVC4gIChDT09LSUUtV0FJVCBzdGF0ZSkKKyAqLworc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc2ZfY29va2llX3dhaXRfaWNtcF9hYm9ydChjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkJCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCQljb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAorCQkJCQl2b2lkICphcmcsCisJCQkJCXNjdHBfY21kX3NlcV90ICpjb21tYW5kcykKK3sKKwlzY3RwX3N0b3BfdDFfYW5kX2Fib3J0KGNvbW1hbmRzLCBTQ1RQX0VSUk9SX05PX0VSUk9SKTsKKyAJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fQUJPUlQ7Cit9CisKKy8qCisgKiBQcm9jZXNzIGFuIEFCT1JULiAgKENPT0tJRS1FQ0hPRUQgc3RhdGUpCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2Nvb2tpZV9lY2hvZWRfYWJvcnQoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJCSAgICAgICBjb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAorCQkJCQkgICAgICAgdm9pZCAqYXJnLAorCQkJCQkgICAgICAgc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCS8qIFRoZXJlIGlzIGEgc2luZ2xlIFQxIHRpbWVyLCBzbyB3ZSBzaG91bGQgYmUgYWJsZSB0byB1c2UKKwkgKiBjb21tb24gZnVuY3Rpb24gd2l0aCB0aGUgQ09PS0lFLVdBSVQgc3RhdGUuCisJICovCisJcmV0dXJuIHNjdHBfc2ZfY29va2llX3dhaXRfYWJvcnQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworfQorCisvKgorICogU3RvcCBUMSB0aW1lciBhbmQgYWJvcnQgYXNzb2NpYXRpb24gd2l0aCAiSU5JVCBmYWlsZWQiLgorICoKKyAqIFRoaXMgaXMgY29tbW9uIGNvZGUgY2FsbGVkIGJ5IHNldmVyYWwgc2N0cF9zZl8qX2Fib3J0KCkgZnVuY3Rpb25zIGFib3ZlLgorICovCit2b2lkIHNjdHBfc3RvcF90MV9hbmRfYWJvcnQoc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzLCBfX3UxNiBlcnJvcikKK3sKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX05FV19TVEFURSwKKwkJCVNDVFBfU1RBVEUoU0NUUF9TVEFURV9DTE9TRUQpKTsKKwlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9BQk9SVEVEUyk7CisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9USU1FUl9TVE9QLAorCQkJU0NUUF9UTyhTQ1RQX0VWRU5UX1RJTUVPVVRfVDFfSU5JVCkpOworCS8qIENNRF9JTklUX0ZBSUxFRCB3aWxsIERFTEVURV9UQ0IuICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9JTklUX0ZBSUxFRCwKKwkJCVNDVFBfVTMyKGVycm9yKSk7Cit9CisKKy8qCisgKiBzY3RwX3NmX2RvXzlfMl9zaHV0CisgKgorICogU2VjdGlvbjogOS4yCisgKiBVcG9uIHRoZSByZWNlcHRpb24gb2YgdGhlIFNIVVRET1dOLCB0aGUgcGVlciBlbmRwb2ludCBzaGFsbAorICogIC0gZW50ZXIgdGhlIFNIVVRET1dOLVJFQ0VJVkVEIHN0YXRlLAorICoKKyAqICAtIHN0b3AgYWNjZXB0aW5nIG5ldyBkYXRhIGZyb20gaXRzIFNDVFAgdXNlcgorICoKKyAqICAtIHZlcmlmeSwgYnkgY2hlY2tpbmcgdGhlIEN1bXVsYXRpdmUgVFNOIEFjayBmaWVsZCBvZiB0aGUgY2h1bmssCisgKiAgICB0aGF0IGFsbCBpdHMgb3V0c3RhbmRpbmcgREFUQSBjaHVua3MgaGF2ZSBiZWVuIHJlY2VpdmVkIGJ5IHRoZQorICogICAgU0hVVERPV04gc2VuZGVyLgorICoKKyAqIE9uY2UgYW4gZW5kcG9pbnQgYXMgcmVhY2hlZCB0aGUgU0hVVERPV04tUkVDRUlWRUQgc3RhdGUgaXQgTVVTVCBOT1QKKyAqIHNlbmQgYSBTSFVURE9XTiBpbiByZXNwb25zZSB0byBhIFVMUCByZXF1ZXN0LiBBbmQgc2hvdWxkIGRpc2NhcmQKKyAqIHN1YnNlcXVlbnQgU0hVVERPV04gY2h1bmtzLgorICoKKyAqIElmIHRoZXJlIGFyZSBzdGlsbCBvdXRzdGFuZGluZyBEQVRBIGNodW5rcyBsZWZ0LCB0aGUgU0hVVERPV04KKyAqIHJlY2VpdmVyIHNoYWxsIGNvbnRpbnVlIHRvIGZvbGxvdyBub3JtYWwgZGF0YSB0cmFuc21pc3Npb24KKyAqIHByb2NlZHVyZXMgZGVmaW5lZCBpbiBTZWN0aW9uIDYgdW50aWwgYWxsIG91dHN0YW5kaW5nIERBVEEgY2h1bmtzCisgKiBhcmUgYWNrbm93bGVkZ2VkOyBob3dldmVyLCB0aGUgU0hVVERPV04gcmVjZWl2ZXIgTVVTVCBOT1QgYWNjZXB0CisgKiBuZXcgZGF0YSBmcm9tIGl0cyBTQ1RQIHVzZXIuCisgKgorICogVmVyaWZpY2F0aW9uIFRhZzogIDguNSBWZXJpZmljYXRpb24gVGFnIFtOb3JtYWwgdmVyaWZpY2F0aW9uXQorICoKKyAqIElucHV0cworICogKGVuZHBvaW50LCBhc29jLCBjaHVuaykKKyAqCisgKiBPdXRwdXRzCisgKiAoYXNvYywgcmVwbHlfbXNnLCBtc2dfdXAsIHRpbWVycywgY291bnRlcnMpCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgZGlzcG9zaXRpb24gb2YgdGhlIGNodW5rLgorICovCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl9kb185XzJfc2h1dGRvd24oY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCQkgICBjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkJICAgY29uc3Qgc2N0cF9zdWJ0eXBlX3QgdHlwZSwKKwkJCQkJICAgdm9pZCAqYXJnLAorCQkJCQkgICBzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rID0gYXJnOworCXNjdHBfc2h1dGRvd25oZHJfdCAqc2RoOworCXNjdHBfZGlzcG9zaXRpb25fdCBkaXNwb3NpdGlvbjsKKwlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXY7CisKKwlpZiAoIXNjdHBfdnRhZ192ZXJpZnkoY2h1bmssIGFzb2MpKQorCQlyZXR1cm4gc2N0cF9zZl9wZGlzY2FyZChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgU0hVVERPV04gY2h1bmsgaGFzIGEgdmFsaWQgbGVuZ3RoLiAqLworCWlmICghc2N0cF9jaHVua19sZW5ndGhfdmFsaWQoY2h1bmssCisJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX3NodXRkb3duX2NodW5rX3QpKSkKKwkJcmV0dXJuIHNjdHBfc2ZfdmlvbGF0aW9uX2NodW5rbGVuKGVwLCBhc29jLCB0eXBlLCBhcmcsCisJCQkJCQkgIGNvbW1hbmRzKTsKKworCS8qIENvbnZlcnQgdGhlIGVsYWJvcmF0ZSBoZWFkZXIuICAqLworCXNkaCA9IChzY3RwX3NodXRkb3duaGRyX3QgKiljaHVuay0+c2tiLT5kYXRhOworCXNrYl9wdWxsKGNodW5rLT5za2IsIHNpemVvZihzY3RwX3NodXRkb3duaGRyX3QpKTsKKwljaHVuay0+c3ViaC5zaHV0ZG93bl9oZHIgPSBzZGg7CisKKwkvKiBVcG9uIHRoZSByZWNlcHRpb24gb2YgdGhlIFNIVVRET1dOLCB0aGUgcGVlciBlbmRwb2ludCBzaGFsbAorCSAqICAtIGVudGVyIHRoZSBTSFVURE9XTi1SRUNFSVZFRCBzdGF0ZSwKKwkgKiAgLSBzdG9wIGFjY2VwdGluZyBuZXcgZGF0YSBmcm9tIGl0cyBTQ1RQIHVzZXIKKwkgKgorCSAqIFtUaGlzIGlzIGltcGxpY2l0IGluIHRoZSBuZXcgc3RhdGUuXQorCSAqLworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfTkVXX1NUQVRFLAorCQkJU0NUUF9TVEFURShTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEKSk7CisJZGlzcG9zaXRpb24gPSBTQ1RQX0RJU1BPU0lUSU9OX0NPTlNVTUU7CisKKwlpZiAoc2N0cF9vdXRxX2lzX2VtcHR5KCZhc29jLT5vdXRxdWV1ZSkpIHsKKwkJZGlzcG9zaXRpb24gPSBzY3RwX3NmX2RvXzlfMl9zaHV0ZG93bl9hY2soZXAsIGFzb2MsIHR5cGUsCisJCQkJCQkJICBhcmcsIGNvbW1hbmRzKTsKKwl9CisKKwlpZiAoU0NUUF9ESVNQT1NJVElPTl9OT01FTSA9PSBkaXNwb3NpdGlvbikKKwkJZ290byBvdXQ7CisKKwkvKiAgLSB2ZXJpZnksIGJ5IGNoZWNraW5nIHRoZSBDdW11bGF0aXZlIFRTTiBBY2sgZmllbGQgb2YgdGhlCisJICogICAgY2h1bmssIHRoYXQgYWxsIGl0cyBvdXRzdGFuZGluZyBEQVRBIGNodW5rcyBoYXZlIGJlZW4KKwkgKiAgICByZWNlaXZlZCBieSB0aGUgU0hVVERPV04gc2VuZGVyLgorCSAqLworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUFJPQ0VTU19DVFNOLAorCQkJU0NUUF9VMzIoY2h1bmstPnN1Ymguc2h1dGRvd25faGRyLT5jdW1fdHNuX2FjaykpOworCisJLyogQVBJIDUuMy4xLjUgU0NUUF9TSFVURE9XTl9FVkVOVAorCSAqIFdoZW4gYSBwZWVyIHNlbmRzIGEgU0hVVERPV04sIFNDVFAgZGVsaXZlcnMgdGhpcyBub3RpZmljYXRpb24gdG8KKwkgKiBpbmZvcm0gdGhlIGFwcGxpY2F0aW9uIHRoYXQgaXQgc2hvdWxkIGNlYXNlIHNlbmRpbmcgZGF0YS4KKwkgKi8KKwlldiA9IHNjdHBfdWxwZXZlbnRfbWFrZV9zaHV0ZG93bl9ldmVudChhc29jLCAwLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWV2KSB7CisJCWRpc3Bvc2l0aW9uID0gU0NUUF9ESVNQT1NJVElPTl9OT01FTTsKKwkJZ290byBvdXQ7CQorCX0KKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0VWRU5UX1VMUCwgU0NUUF9VTFBFVkVOVChldikpOworCitvdXQ6CisJcmV0dXJuIGRpc3Bvc2l0aW9uOworfQorCisvKiBSRkMgMjk2MCA5LjIKKyAqIElmIGFuIGVuZHBvaW50IGlzIGluIFNIVVRET1dOLUFDSy1TRU5UIHN0YXRlIGFuZCByZWNlaXZlcyBhbiBJTklUIGNodW5rCisgKiAoZS5nLiwgaWYgdGhlIFNIVVRET1dOIENPTVBMRVRFIHdhcyBsb3N0KSB3aXRoIHNvdXJjZSBhbmQgZGVzdGluYXRpb24KKyAqIHRyYW5zcG9ydCBhZGRyZXNzZXMgKGVpdGhlciBpbiB0aGUgSVAgYWRkcmVzc2VzIG9yIGluIHRoZSBJTklUIGNodW5rKQorICogdGhhdCBiZWxvbmcgdG8gdGhpcyBhc3NvY2lhdGlvbiwgaXQgc2hvdWxkIGRpc2NhcmQgdGhlIElOSVQgY2h1bmsgYW5kCisgKiByZXRyYW5zbWl0IHRoZSBTSFVURE9XTiBBQ0sgY2h1bmsuCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2RvXzlfMl9yZXNodXRhY2soY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCSAgICBjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkgICAgY29uc3Qgc2N0cF9zdWJ0eXBlX3QgdHlwZSwKKwkJCQkgICAgdm9pZCAqYXJnLAorCQkJCSAgICBzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rID0gKHN0cnVjdCBzY3RwX2NodW5rICopIGFyZzsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqcmVwbHk7CisKKwkvKiBTaW5jZSB3ZSBhcmUgbm90IGdvaW5nIHRvIHJlYWxseSBwcm9jZXNzIHRoaXMgSU5JVCwgdGhlcmUKKwkgKiBpcyBubyBwb2ludCBpbiB2ZXJpZnlpbmcgY2h1bmsgYm91bmRyaWVzLiAgSnVzdCBnZW5lcmF0ZQorCSAqIHRoZSBTSFVURE9XTiBBQ0suCisJICovCisJcmVwbHkgPSBzY3RwX21ha2Vfc2h1dGRvd25fYWNrKGFzb2MsIGNodW5rKTsKKwlpZiAoTlVMTCA9PSByZXBseSkKKwkJZ290byBub21lbTsKKworCS8qIFNldCB0aGUgdHJhbnNwb3J0IGZvciB0aGUgU0hVVERPV04gQUNLIGNodW5rIGFuZCB0aGUgdGltZW91dCBmb3IKKwkgKiB0aGUgVDItU0hVVERPV04gdGltZXIuCisJICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9TRVRVUF9UMiwgU0NUUF9DSFVOSyhyZXBseSkpOworCisJLyogYW5kIHJlc3RhcnQgdGhlIFQyLXNodXRkb3duIHRpbWVyLiAqLworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVElNRVJfUkVTVEFSVCwKKwkJCVNDVFBfVE8oU0NUUF9FVkVOVF9USU1FT1VUX1QyX1NIVVRET1dOKSk7CisKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1JFUExZLCBTQ1RQX0NIVU5LKHJlcGx5KSk7CisKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9DT05TVU1FOworbm9tZW06CisJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fTk9NRU07Cit9CisKKy8qCisgKiBzY3RwX3NmX2RvX2Vjbl9jd3IKKyAqCisgKiBTZWN0aW9uOiAgQXBwZW5kaXggQTogRXhwbGljaXQgQ29uZ2VzdGlvbiBOb3RpZmljYXRpb24KKyAqCisgKiBDV1I6CisgKgorICogUkZDIDI0ODEgZGV0YWlscyBhIHNwZWNpZmljIGJpdCBmb3IgYSBzZW5kZXIgdG8gc2VuZCBpbiB0aGUgaGVhZGVyIG9mCisgKiBpdHMgbmV4dCBvdXRib3VuZCBUQ1Agc2VnbWVudCB0byBpbmRpY2F0ZSB0byBpdHMgcGVlciB0aGF0IGl0IGhhcworICogcmVkdWNlZCBpdHMgY29uZ2VzdGlvbiB3aW5kb3cuICBUaGlzIGlzIHRlcm1lZCB0aGUgQ1dSIGJpdC4gIEZvcgorICogU0NUUCB0aGUgc2FtZSBpbmRpY2F0aW9uIGlzIG1hZGUgYnkgaW5jbHVkaW5nIHRoZSBDV1IgY2h1bmsuCisgKiBUaGlzIGNodW5rIGNvbnRhaW5zIG9uZSBkYXRhIGVsZW1lbnQsIGkuZS4gdGhlIFRTTiBudW1iZXIgdGhhdAorICogd2FzIHNlbnQgaW4gdGhlIEVDTkUgY2h1bmsuICBUaGlzIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbG93ZXN0CisgKiBUU04gbnVtYmVyIGluIHRoZSBkYXRhZ3JhbSB0aGF0IHdhcyBvcmlnaW5hbGx5IG1hcmtlZCB3aXRoIHRoZQorICogQ0UgYml0LgorICoKKyAqIFZlcmlmaWNhdGlvbiBUYWc6IDguNSBWZXJpZmljYXRpb24gVGFnIFtOb3JtYWwgdmVyaWZpY2F0aW9uXQorICogSW5wdXRzCisgKiAoZW5kcG9pbnQsIGFzb2MsIGNodW5rKQorICoKKyAqIE91dHB1dHMKKyAqIChhc29jLCByZXBseV9tc2csIG1zZ191cCwgdGltZXJzLCBjb3VudGVycykKKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBkaXNwb3NpdGlvbiBvZiB0aGUgY2h1bmsuCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2RvX2Vjbl9jd3IoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSAgICAgIGNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJCQkJICAgICAgdm9pZCAqYXJnLAorCQkJCSAgICAgIHNjdHBfY21kX3NlcV90ICpjb21tYW5kcykKK3sKKwlzY3RwX2N3cmhkcl90ICpjd3I7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rID0gYXJnOworCisJaWYgKCFzY3RwX3Z0YWdfdmVyaWZ5KGNodW5rLCBhc29jKSkKKwkJcmV0dXJuIHNjdHBfc2ZfcGRpc2NhcmQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworCisJaWYgKCFzY3RwX2NodW5rX2xlbmd0aF92YWxpZChjaHVuaywgc2l6ZW9mKHNjdHBfZWNuZV9jaHVua190KSkpCisJCXJldHVybiBzY3RwX3NmX3Zpb2xhdGlvbl9jaHVua2xlbihlcCwgYXNvYywgdHlwZSwgYXJnLAorCQkJCQkJICBjb21tYW5kcyk7CisJCQorCWN3ciA9IChzY3RwX2N3cmhkcl90ICopIGNodW5rLT5za2ItPmRhdGE7CisJc2tiX3B1bGwoY2h1bmstPnNrYiwgc2l6ZW9mKHNjdHBfY3dyaGRyX3QpKTsKKworCWN3ci0+bG93ZXN0X3RzbiA9IG50b2hsKGN3ci0+bG93ZXN0X3Rzbik7CisKKwkvKiBEb2VzIHRoaXMgQ1dSIGFjayB0aGUgbGFzdCBzZW50IGNvbmdlc3Rpb24gbm90aWZpY2F0aW9uPyAqLworCWlmIChUU05fbHRlKGFzb2MtPmxhc3RfZWNuZV90c24sIGN3ci0+bG93ZXN0X3RzbikpIHsKKwkJLyogU3RvcCBzZW5kaW5nIEVDTkUuICovCisJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywKKwkJCQlTQ1RQX0NNRF9FQ05fQ1dSLAorCQkJCVNDVFBfVTMyKGN3ci0+bG93ZXN0X3RzbikpOworCX0KKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9DT05TVU1FOworfQorCisvKgorICogc2N0cF9zZl9kb19lY25lCisgKgorICogU2VjdGlvbjogIEFwcGVuZGl4IEE6IEV4cGxpY2l0IENvbmdlc3Rpb24gTm90aWZpY2F0aW9uCisgKgorICogRUNOLUVjaG8KKyAqCisgKiBSRkMgMjQ4MSBkZXRhaWxzIGEgc3BlY2lmaWMgYml0IGZvciBhIHJlY2VpdmVyIHRvIHNlbmQgYmFjayBpbiBpdHMKKyAqIFRDUCBhY2tub3dsZWRnZW1lbnRzIHRvIG5vdGlmeSB0aGUgc2VuZGVyIG9mIHRoZSBDb25nZXN0aW9uCisgKiBFeHBlcmllbmNlZCAoQ0UpIGJpdCBoYXZpbmcgYXJyaXZlZCBmcm9tIHRoZSBuZXR3b3JrLiAgRm9yIFNDVFAgdGhpcworICogc2FtZSBpbmRpY2F0aW9uIGlzIG1hZGUgYnkgaW5jbHVkaW5nIHRoZSBFQ05FIGNodW5rLiAgVGhpcyBjaHVuaworICogY29udGFpbnMgb25lIGRhdGEgZWxlbWVudCwgaS5lLiB0aGUgbG93ZXN0IFRTTiBhc3NvY2lhdGVkIHdpdGggdGhlIElQCisgKiBkYXRhZ3JhbSBtYXJrZWQgd2l0aCB0aGUgQ0UgYml0Li4uLi4KKyAqCisgKiBWZXJpZmljYXRpb24gVGFnOiA4LjUgVmVyaWZpY2F0aW9uIFRhZyBbTm9ybWFsIHZlcmlmaWNhdGlvbl0KKyAqIElucHV0cworICogKGVuZHBvaW50LCBhc29jLCBjaHVuaykKKyAqCisgKiBPdXRwdXRzCisgKiAoYXNvYywgcmVwbHlfbXNnLCBtc2dfdXAsIHRpbWVycywgY291bnRlcnMpCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgZGlzcG9zaXRpb24gb2YgdGhlIGNodW5rLgorICovCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl9kb19lY25lKGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwkJCQkgICBjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkgICBjb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAorCQkJCSAgIHZvaWQgKmFyZywKKwkJCQkgICBzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJc2N0cF9lY25laGRyX3QgKmVjbmU7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rID0gYXJnOworCisJaWYgKCFzY3RwX3Z0YWdfdmVyaWZ5KGNodW5rLCBhc29jKSkKKwkJcmV0dXJuIHNjdHBfc2ZfcGRpc2NhcmQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworCisJaWYgKCFzY3RwX2NodW5rX2xlbmd0aF92YWxpZChjaHVuaywgc2l6ZW9mKHNjdHBfZWNuZV9jaHVua190KSkpCisJCXJldHVybiBzY3RwX3NmX3Zpb2xhdGlvbl9jaHVua2xlbihlcCwgYXNvYywgdHlwZSwgYXJnLAorCQkJCQkJICBjb21tYW5kcyk7CisKKwllY25lID0gKHNjdHBfZWNuZWhkcl90ICopIGNodW5rLT5za2ItPmRhdGE7CisJc2tiX3B1bGwoY2h1bmstPnNrYiwgc2l6ZW9mKHNjdHBfZWNuZWhkcl90KSk7CisKKwkvKiBJZiB0aGlzIGlzIGEgbmV3ZXIgRUNORSB0aGFuIHRoZSBsYXN0IENXUiBwYWNrZXQgd2Ugc2VudCBvdXQgKi8KKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0VDTl9FQ05FLAorCQkJU0NUUF9VMzIobnRvaGwoZWNuZS0+bG93ZXN0X3RzbikpKTsKKworCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0NPTlNVTUU7Cit9CisKKy8qCisgKiBTZWN0aW9uOiA2LjIgIEFja25vd2xlZGdlbWVudCBvbiBSZWNlcHRpb24gb2YgREFUQSBDaHVua3MKKyAqCisgKiBUaGUgU0NUUCBlbmRwb2ludCBNVVNUIGFsd2F5cyBhY2tub3dsZWRnZSB0aGUgcmVjZXB0aW9uIG9mIGVhY2ggdmFsaWQKKyAqIERBVEEgY2h1bmsuCisgKgorICogVGhlIGd1aWRlbGluZXMgb24gZGVsYXllZCBhY2tub3dsZWRnZW1lbnQgYWxnb3JpdGhtIHNwZWNpZmllZCBpbgorICogU2VjdGlvbiA0LjIgb2YgW1JGQzI1ODFdIFNIT1VMRCBiZSBmb2xsb3dlZC4gU3BlY2lmaWNhbGx5LCBhbgorICogYWNrbm93bGVkZ2VtZW50IFNIT1VMRCBiZSBnZW5lcmF0ZWQgZm9yIGF0IGxlYXN0IGV2ZXJ5IHNlY29uZCBwYWNrZXQKKyAqIChub3QgZXZlcnkgc2Vjb25kIERBVEEgY2h1bmspIHJlY2VpdmVkLCBhbmQgU0hPVUxEIGJlIGdlbmVyYXRlZCB3aXRoaW4KKyAqIDIwMCBtcyBvZiB0aGUgYXJyaXZhbCBvZiBhbnkgdW5hY2tub3dsZWRnZWQgREFUQSBjaHVuay4gSW4gc29tZQorICogc2l0dWF0aW9ucyBpdCBtYXkgYmUgYmVuZWZpY2lhbCBmb3IgYW4gU0NUUCB0cmFuc21pdHRlciB0byBiZSBtb3JlCisgKiBjb25zZXJ2YXRpdmUgdGhhbiB0aGUgYWxnb3JpdGhtcyBkZXRhaWxlZCBpbiB0aGlzIGRvY3VtZW50IGFsbG93LgorICogSG93ZXZlciwgYW4gU0NUUCB0cmFuc21pdHRlciBNVVNUIE5PVCBiZSBtb3JlIGFnZ3Jlc3NpdmUgdGhhbiB0aGUKKyAqIGZvbGxvd2luZyBhbGdvcml0aG1zIGFsbG93LgorICoKKyAqIEEgU0NUUCByZWNlaXZlciBNVVNUIE5PVCBnZW5lcmF0ZSBtb3JlIHRoYW4gb25lIFNBQ0sgZm9yIGV2ZXJ5CisgKiBpbmNvbWluZyBwYWNrZXQsIG90aGVyIHRoYW4gdG8gdXBkYXRlIHRoZSBvZmZlcmVkIHdpbmRvdyBhcyB0aGUKKyAqIHJlY2VpdmluZyBhcHBsaWNhdGlvbiBjb25zdW1lcyBuZXcgZGF0YS4KKyAqCisgKiBWZXJpZmljYXRpb24gVGFnOiAgOC41IFZlcmlmaWNhdGlvbiBUYWcgW05vcm1hbCB2ZXJpZmljYXRpb25dCisgKgorICogSW5wdXRzCisgKiAoZW5kcG9pbnQsIGFzb2MsIGNodW5rKQorICoKKyAqIE91dHB1dHMKKyAqIChhc29jLCByZXBseV9tc2csIG1zZ191cCwgdGltZXJzLCBjb3VudGVycykKKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBkaXNwb3NpdGlvbiBvZiB0aGUgY2h1bmsuCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2VhdF9kYXRhXzZfMihjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkJCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCQljb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAorCQkJCQl2b2lkICphcmcsCisJCQkJCXNjdHBfY21kX3NlcV90ICpjb21tYW5kcykKK3sKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmsgPSBhcmc7CisJaW50IGVycm9yOworCisJaWYgKCFzY3RwX3Z0YWdfdmVyaWZ5KGNodW5rLCBhc29jKSkgeworCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1JFUE9SVF9CQURfVEFHLAorCQkJCVNDVFBfTlVMTCgpKTsKKwkJcmV0dXJuIHNjdHBfc2ZfcGRpc2NhcmQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworICAgICAgICB9CisKKwlpZiAoIXNjdHBfY2h1bmtfbGVuZ3RoX3ZhbGlkKGNodW5rLCBzaXplb2Yoc2N0cF9kYXRhX2NodW5rX3QpKSkKKwkJcmV0dXJuIHNjdHBfc2ZfdmlvbGF0aW9uX2NodW5rbGVuKGVwLCBhc29jLCB0eXBlLCBhcmcsCisJCQkJCQkgIGNvbW1hbmRzKTsKKworCWVycm9yID0gc2N0cF9lYXRfZGF0YShhc29jLCBjaHVuaywgY29tbWFuZHMgKTsKKwlzd2l0Y2ggKGVycm9yKSB7CisJY2FzZSBTQ1RQX0lFUlJPUl9OT19FUlJPUjoKKwkJYnJlYWs7CisJY2FzZSBTQ1RQX0lFUlJPUl9ISUdIX1RTTjoKKwljYXNlIFNDVFBfSUVSUk9SX0JBRF9TVFJFQU06CisJCWdvdG8gZGlzY2FyZF9ub2ZvcmNlOworCWNhc2UgU0NUUF9JRVJST1JfRFVQX1RTTjoKKwljYXNlIFNDVFBfSUVSUk9SX0lHTk9SRV9UU046CisJCWdvdG8gZGlzY2FyZF9mb3JjZTsKKwljYXNlIFNDVFBfSUVSUk9SX05PX0RBVEE6CisJCWdvdG8gY29uc3VtZTsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlpZiAoYXNvYy0+YXV0b2Nsb3NlKSB7CisJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVElNRVJfUkVTVEFSVCwKKwkJCQlTQ1RQX1RPKFNDVFBfRVZFTlRfVElNRU9VVF9BVVRPQ0xPU0UpKTsKKwl9CisKKwkvKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGNodW5rIGluIGEgcGFja2V0LCB3ZSBuZWVkIHRvIGNvdW50IGl0CisJICogdG93YXJkIHNhY2sgZ2VuZXJhdGlvbi4gIE5vdGUgdGhhdCB3ZSBuZWVkIHRvIFNBQ0sgZXZlcnkKKwkgKiBPVEhFUiBwYWNrZXQgY29udGFpbmluZyBkYXRhIGNodW5rcywgRVZFTiBJRiBXRSBESVNDQVJECisJICogVEhFTS4gIFdlIGVsZWN0IHRvIE5PVCBnZW5lcmF0ZSBTQUNLJ3MgaWYgdGhlIGNodW5rIGZhaWxzCisJICogdGhlIHZlcmlmaWNhdGlvbiB0YWcgdGVzdC4KKwkgKgorCSAqIFJGQyAyOTYwIDYuMiBBY2tub3dsZWRnZW1lbnQgb24gUmVjZXB0aW9uIG9mIERBVEEgQ2h1bmtzCisJICoKKwkgKiBUaGUgU0NUUCBlbmRwb2ludCBNVVNUIGFsd2F5cyBhY2tub3dsZWRnZSB0aGUgcmVjZXB0aW9uIG9mCisJICogZWFjaCB2YWxpZCBEQVRBIGNodW5rLgorCSAqCisJICogVGhlIGd1aWRlbGluZXMgb24gZGVsYXllZCBhY2tub3dsZWRnZW1lbnQgYWxnb3JpdGhtCisJICogc3BlY2lmaWVkIGluICBTZWN0aW9uIDQuMiBvZiBbUkZDMjU4MV0gU0hPVUxEIGJlIGZvbGxvd2VkLgorCSAqIFNwZWNpZmljYWxseSwgYW4gYWNrbm93bGVkZ2VtZW50IFNIT1VMRCBiZSBnZW5lcmF0ZWQgZm9yIGF0CisJICogbGVhc3QgZXZlcnkgc2Vjb25kIHBhY2tldCAobm90IGV2ZXJ5IHNlY29uZCBEQVRBIGNodW5rKQorCSAqIHJlY2VpdmVkLCBhbmQgU0hPVUxEIGJlIGdlbmVyYXRlZCB3aXRoaW4gMjAwIG1zIG9mIHRoZQorCSAqIGFycml2YWwgb2YgYW55IHVuYWNrbm93bGVkZ2VkIERBVEEgY2h1bmsuICBJbiBzb21lCisJICogc2l0dWF0aW9ucyBpdCBtYXkgYmUgYmVuZWZpY2lhbCBmb3IgYW4gU0NUUCB0cmFuc21pdHRlciB0bworCSAqIGJlIG1vcmUgY29uc2VydmF0aXZlIHRoYW4gdGhlIGFsZ29yaXRobXMgZGV0YWlsZWQgaW4gdGhpcworCSAqIGRvY3VtZW50IGFsbG93LiBIb3dldmVyLCBhbiBTQ1RQIHRyYW5zbWl0dGVyIE1VU1QgTk9UIGJlCisJICogbW9yZSBhZ2dyZXNzaXZlIHRoYW4gdGhlIGZvbGxvd2luZyBhbGdvcml0aG1zIGFsbG93LgorCSAqLworCWlmIChjaHVuay0+ZW5kX29mX3BhY2tldCkgeworCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0dFTl9TQUNLLCBTQ1RQX05PRk9SQ0UoKSk7CisKKwkJLyogU3RhcnQgdGhlIFNBQ0sgdGltZXIuICAqLworCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RJTUVSX1JFU1RBUlQsCisJCQkJU0NUUF9UTyhTQ1RQX0VWRU5UX1RJTUVPVVRfU0FDSykpOworCX0KKworCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0NPTlNVTUU7CisKK2Rpc2NhcmRfZm9yY2U6CisJLyogUkZDIDI5NjAgNi4yIEFja25vd2xlZGdlbWVudCBvbiBSZWNlcHRpb24gb2YgREFUQSBDaHVua3MKKwkgKgorCSAqIFdoZW4gYSBwYWNrZXQgYXJyaXZlcyB3aXRoIGR1cGxpY2F0ZSBEQVRBIGNodW5rKHMpIGFuZCB3aXRoCisJICogbm8gbmV3IERBVEEgY2h1bmsocyksIHRoZSBlbmRwb2ludCBNVVNUIGltbWVkaWF0ZWx5IHNlbmQgYQorCSAqIFNBQ0sgd2l0aCBubyBkZWxheS4gIElmIGEgcGFja2V0IGFycml2ZXMgd2l0aCBkdXBsaWNhdGUKKwkgKiBEQVRBIGNodW5rKHMpIGJ1bmRsZWQgd2l0aCBuZXcgREFUQSBjaHVua3MsIHRoZSBlbmRwb2ludAorCSAqIE1BWSBpbW1lZGlhdGVseSBzZW5kIGEgU0FDSy4gIE5vcm1hbGx5IHJlY2VpcHQgb2YgZHVwbGljYXRlCisJICogREFUQSBjaHVua3Mgd2lsbCBvY2N1ciB3aGVuIHRoZSBvcmlnaW5hbCBTQUNLIGNodW5rIHdhcyBsb3N0CisJICogYW5kIHRoZSBwZWVyJ3MgUlRPIGhhcyBleHBpcmVkLiAgVGhlIGR1cGxpY2F0ZSBUU04gbnVtYmVyKHMpCisJICogU0hPVUxEIGJlIHJlcG9ydGVkIGluIHRoZSBTQUNLIGFzIGR1cGxpY2F0ZS4KKwkgKi8KKwkvKiBJbiBvdXIgY2FzZSwgd2Ugc3BsaXQgdGhlIE1BWSBTQUNLIGFkdmljZSB1cCB3aGV0aGVyIG9yIG5vdAorCSAqIHRoZSBsYXN0IGNodW5rIGlzIGEgZHVwbGljYXRlLicKKwkgKi8KKwlpZiAoY2h1bmstPmVuZF9vZl9wYWNrZXQpCisJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfR0VOX1NBQ0ssIFNDVFBfRk9SQ0UoKSk7CisJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fRElTQ0FSRDsKKworZGlzY2FyZF9ub2ZvcmNlOgorCWlmIChjaHVuay0+ZW5kX29mX3BhY2tldCkgeworCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0dFTl9TQUNLLCBTQ1RQX05PRk9SQ0UoKSk7CisKKwkJLyogU3RhcnQgdGhlIFNBQ0sgdGltZXIuICAqLworCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RJTUVSX1JFU1RBUlQsCisJCQkJU0NUUF9UTyhTQ1RQX0VWRU5UX1RJTUVPVVRfU0FDSykpOworCX0KKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9ESVNDQVJEOworY29uc3VtZToKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9DT05TVU1FOworCQorfQorCisvKgorICogc2N0cF9zZl9lYXRfZGF0YV9mYXN0XzRfNAorICoKKyAqIFNlY3Rpb246IDQgKDQpCisgKiAoNCkgSW4gU0hVVERPV04tU0VOVCBzdGF0ZSB0aGUgZW5kcG9pbnQgTVVTVCBhY2tub3dsZWRnZSBhbnkgcmVjZWl2ZWQKKyAqICAgIERBVEEgY2h1bmtzIHdpdGhvdXQgZGVsYXkuCisgKgorICogVmVyaWZpY2F0aW9uIFRhZzogIDguNSBWZXJpZmljYXRpb24gVGFnIFtOb3JtYWwgdmVyaWZpY2F0aW9uXQorICogSW5wdXRzCisgKiAoZW5kcG9pbnQsIGFzb2MsIGNodW5rKQorICoKKyAqIE91dHB1dHMKKyAqIChhc29jLCByZXBseV9tc2csIG1zZ191cCwgdGltZXJzLCBjb3VudGVycykKKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBkaXNwb3NpdGlvbiBvZiB0aGUgY2h1bmsuCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2VhdF9kYXRhX2Zhc3RfNF80KGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSAgICAgY29uc3Qgc2N0cF9zdWJ0eXBlX3QgdHlwZSwKKwkJCQkgICAgIHZvaWQgKmFyZywKKwkJCQkgICAgIHNjdHBfY21kX3NlcV90ICpjb21tYW5kcykKK3sKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmsgPSBhcmc7CisJaW50IGVycm9yOworCisJaWYgKCFzY3RwX3Z0YWdfdmVyaWZ5KGNodW5rLCBhc29jKSkgeworCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1JFUE9SVF9CQURfVEFHLAorCQkJCVNDVFBfTlVMTCgpKTsKKwkJcmV0dXJuIHNjdHBfc2ZfcGRpc2NhcmQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworCX0KKworCWlmICghc2N0cF9jaHVua19sZW5ndGhfdmFsaWQoY2h1bmssIHNpemVvZihzY3RwX2RhdGFfY2h1bmtfdCkpKQorCQlyZXR1cm4gc2N0cF9zZl92aW9sYXRpb25fY2h1bmtsZW4oZXAsIGFzb2MsIHR5cGUsIGFyZywKKwkJCQkJCSAgY29tbWFuZHMpOworCisJZXJyb3IgPSBzY3RwX2VhdF9kYXRhKGFzb2MsIGNodW5rLCBjb21tYW5kcyApOworCXN3aXRjaCAoZXJyb3IpIHsKKwljYXNlIFNDVFBfSUVSUk9SX05PX0VSUk9SOgorCWNhc2UgU0NUUF9JRVJST1JfSElHSF9UU046CisJY2FzZSBTQ1RQX0lFUlJPUl9EVVBfVFNOOgorCWNhc2UgU0NUUF9JRVJST1JfSUdOT1JFX1RTTjoKKwljYXNlIFNDVFBfSUVSUk9SX0JBRF9TVFJFQU06CisJCWJyZWFrOworCWNhc2UgU0NUUF9JRVJST1JfTk9fREFUQToKKwkJZ290byBjb25zdW1lOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCS8qIEdvIGEgaGVhZCBhbmQgZm9yY2UgYSBTQUNLLCBzaW5jZSB3ZSBhcmUgc2h1dHRpbmcgZG93bi4gKi8KKworCS8qIEltcGxlbWVudG9yJ3MgR3VpZGUuCisJICoKKwkgKiBXaGlsZSBpbiBTSFVURE9XTi1TRU5UIHN0YXRlLCB0aGUgU0hVVERPV04gc2VuZGVyIE1VU1QgaW1tZWRpYXRlbHkKKwkgKiByZXNwb25kIHRvIGVhY2ggcmVjZWl2ZWQgcGFja2V0IGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgREFUQSBjaHVuayhzKQorCSAqIHdpdGggYSBTQUNLLCBhIFNIVVRET1dOIGNodW5rLCBhbmQgcmVzdGFydCB0aGUgVDItc2h1dGRvd24gdGltZXIKKwkgKi8KKwlpZiAoY2h1bmstPmVuZF9vZl9wYWNrZXQpIHsKKwkJLyogV2UgbXVzdCBkZWxheSB0aGUgY2h1bmsgY3JlYXRpb24gc2luY2UgdGhlIGN1bXVsYXRpdmUKKwkJICogVFNOIGhhcyBub3QgYmVlbiB1cGRhdGVkIHlldC4KKwkJICovCisJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfR0VOX1NIVVRET1dOLCBTQ1RQX05VTEwoKSk7CisJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfR0VOX1NBQ0ssIFNDVFBfRk9SQ0UoKSk7CisJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVElNRVJfUkVTVEFSVCwKKwkJCQlTQ1RQX1RPKFNDVFBfRVZFTlRfVElNRU9VVF9UMl9TSFVURE9XTikpOworCX0KKworY29uc3VtZToKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9DT05TVU1FOworfQorCisvKgorICogU2VjdGlvbjogNi4yICBQcm9jZXNzaW5nIGEgUmVjZWl2ZWQgU0FDSworICogRCkgQW55IHRpbWUgYSBTQUNLIGFycml2ZXMsIHRoZSBlbmRwb2ludCBwZXJmb3JtcyB0aGUgZm9sbG93aW5nOgorICoKKyAqICAgICBpKSBJZiBDdW11bGF0aXZlIFRTTiBBY2sgaXMgbGVzcyB0aGFuIHRoZSBDdW11bGF0aXZlIFRTTiBBY2sgUG9pbnQsCisgKiAgICAgdGhlbiBkcm9wIHRoZSBTQUNLLiAgIFNpbmNlIEN1bXVsYXRpdmUgVFNOIEFjayBpcyBtb25vdG9uaWNhbGx5CisgKiAgICAgaW5jcmVhc2luZywgYSBTQUNLIHdob3NlIEN1bXVsYXRpdmUgVFNOIEFjayBpcyBsZXNzIHRoYW4gdGhlCisgKiAgICAgQ3VtdWxhdGl2ZSBUU04gQWNrIFBvaW50IGluZGljYXRlcyBhbiBvdXQtb2Ytb3JkZXIgU0FDSy4KKyAqCisgKiAgICAgaWkpIFNldCByd25kIGVxdWFsIHRvIHRoZSBuZXdseSByZWNlaXZlZCBhX3J3bmQgbWludXMgdGhlIG51bWJlcgorICogICAgIG9mIGJ5dGVzIHN0aWxsIG91dHN0YW5kaW5nIGFmdGVyIHByb2Nlc3NpbmcgdGhlIEN1bXVsYXRpdmUgVFNOIEFjaworICogICAgIGFuZCB0aGUgR2FwIEFjayBCbG9ja3MuCisgKgorICogICAgIGlpaSkgSWYgdGhlIFNBQ0sgaXMgbWlzc2luZyBhIFRTTiB0aGF0IHdhcyBwcmV2aW91c2x5CisgKiAgICAgYWNrbm93bGVkZ2VkIHZpYSBhIEdhcCBBY2sgQmxvY2sgKGUuZy4sIHRoZSBkYXRhIHJlY2VpdmVyCisgKiAgICAgcmVuZWdlZCBvbiB0aGUgZGF0YSksIHRoZW4gbWFyayB0aGUgY29ycmVzcG9uZGluZyBEQVRBIGNodW5rCisgKiAgICAgYXMgYXZhaWxhYmxlIGZvciByZXRyYW5zbWl0OiAgTWFyayBpdCBhcyBtaXNzaW5nIGZvciBmYXN0CisgKiAgICAgcmV0cmFuc21pdCBhcyBkZXNjcmliZWQgaW4gU2VjdGlvbiA3LjIuNCBhbmQgaWYgbm8gcmV0cmFuc21pdAorICogICAgIHRpbWVyIGlzIHJ1bm5pbmcgZm9yIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIHRvIHdoaWNoIHRoZSBEQVRBCisgKiAgICAgY2h1bmsgd2FzIG9yaWdpbmFsbHkgdHJhbnNtaXR0ZWQsIHRoZW4gVDMtcnR4IGlzIHN0YXJ0ZWQgZm9yCisgKiAgICAgdGhhdCBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICoKKyAqIFZlcmlmaWNhdGlvbiBUYWc6ICA4LjUgVmVyaWZpY2F0aW9uIFRhZyBbTm9ybWFsIHZlcmlmaWNhdGlvbl0KKyAqCisgKiBJbnB1dHMKKyAqIChlbmRwb2ludCwgYXNvYywgY2h1bmspCisgKgorICogT3V0cHV0cworICogKGFzb2MsIHJlcGx5X21zZywgbXNnX3VwLCB0aW1lcnMsIGNvdW50ZXJzKQorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGRpc3Bvc2l0aW9uIG9mIHRoZSBjaHVuay4KKyAqLworc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc2ZfZWF0X3NhY2tfNl8yKGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwkJCQkJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJCWNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJCQkJCXZvaWQgKmFyZywKKwkJCQkJc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuayA9IGFyZzsKKwlzY3RwX3NhY2toZHJfdCAqc2Fja2g7CisJX191MzIgY3RzbjsKKworCWlmICghc2N0cF92dGFnX3ZlcmlmeShjaHVuaywgYXNvYykpCisJCXJldHVybiBzY3RwX3NmX3BkaXNjYXJkKGVwLCBhc29jLCB0eXBlLCBhcmcsIGNvbW1hbmRzKTsKKworCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBTQUNLIGNodW5rIGhhcyBhIHZhbGlkIGxlbmd0aC4gKi8KKwlpZiAoIXNjdHBfY2h1bmtfbGVuZ3RoX3ZhbGlkKGNodW5rLCBzaXplb2Yoc2N0cF9zYWNrX2NodW5rX3QpKSkKKwkJcmV0dXJuIHNjdHBfc2ZfdmlvbGF0aW9uX2NodW5rbGVuKGVwLCBhc29jLCB0eXBlLCBhcmcsCisJCQkJCQkgIGNvbW1hbmRzKTsKKworCS8qIFB1bGwgdGhlIFNBQ0sgY2h1bmsgZnJvbSB0aGUgZGF0YSBidWZmZXIgKi8KKwlzYWNraCA9IHNjdHBfc21fcHVsbF9zYWNrKGNodW5rKTsKKwkvKiBXYXMgdGhpcyBhIGJvZ3VzIFNBQ0s/ICovCisJaWYgKCFzYWNraCkKKwkJcmV0dXJuIHNjdHBfc2ZfcGRpc2NhcmQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworCWNodW5rLT5zdWJoLnNhY2tfaGRyID0gc2Fja2g7CisJY3RzbiA9IG50b2hsKHNhY2toLT5jdW1fdHNuX2Fjayk7CisKKwkvKiBpKSBJZiBDdW11bGF0aXZlIFRTTiBBY2sgaXMgbGVzcyB0aGFuIHRoZSBDdW11bGF0aXZlIFRTTgorCSAqICAgICBBY2sgUG9pbnQsIHRoZW4gZHJvcCB0aGUgU0FDSy4gIFNpbmNlIEN1bXVsYXRpdmUgVFNOCisJICogICAgIEFjayBpcyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcsIGEgU0FDSyB3aG9zZQorCSAqICAgICBDdW11bGF0aXZlIFRTTiBBY2sgaXMgbGVzcyB0aGFuIHRoZSBDdW11bGF0aXZlIFRTTiBBY2sKKwkgKiAgICAgUG9pbnQgaW5kaWNhdGVzIGFuIG91dC1vZi1vcmRlciBTQUNLLgorCSAqLworCWlmIChUU05fbHQoY3RzbiwgYXNvYy0+Y3Rzbl9hY2tfcG9pbnQpKSB7CisJCVNDVFBfREVCVUdfUFJJTlRLKCJjdHNuICV4XG4iLCBjdHNuKTsKKwkJU0NUUF9ERUJVR19QUklOVEsoImN0c25fYWNrX3BvaW50ICV4XG4iLCBhc29jLT5jdHNuX2Fja19wb2ludCk7CisJCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0RJU0NBUkQ7CisJfQorCisJLyogUmV0dXJuIHRoaXMgU0FDSyBmb3IgZnVydGhlciBwcm9jZXNzaW5nLiAgKi8KKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1BST0NFU1NfU0FDSywgU0NUUF9TQUNLSChzYWNraCkpOworCisJLyogTm90ZTogV2UgZG8gdGhlIHJlc3Qgb2YgdGhlIHdvcmsgb24gdGhlIFBST0NFU1NfU0FDSworCSAqIHNpZGVlZmZlY3QuCisJICovCisJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fQ09OU1VNRTsKK30KKworLyoKKyAqIEdlbmVyYXRlIGFuIEFCT1JUIGluIHJlc3BvbnNlIHRvIGEgcGFja2V0LgorICoKKyAqIFNlY3Rpb246IDguNCBIYW5kbGUgIk91dCBvZiB0aGUgYmx1ZSIgUGFja2V0cworICoKKyAqIDgpIFRoZSByZWNlaXZlciBzaG91bGQgcmVzcG9uZCB0byB0aGUgc2VuZGVyIG9mIHRoZSBPT1RCIHBhY2tldAorICogICAgd2l0aCBhbiBBQk9SVC4gIFdoZW4gc2VuZGluZyB0aGUgQUJPUlQsIHRoZSByZWNlaXZlciBvZiB0aGUKKyAqICAgIE9PVEIgcGFja2V0IE1VU1QgZmlsbCBpbiB0aGUgVmVyaWZpY2F0aW9uIFRhZyBmaWVsZCBvZiB0aGUKKyAqICAgIG91dGJvdW5kIHBhY2tldCB3aXRoIHRoZSB2YWx1ZSBmb3VuZCBpbiB0aGUgVmVyaWZpY2F0aW9uIFRhZworICogICAgZmllbGQgb2YgdGhlIE9PVEIgcGFja2V0IGFuZCBzZXQgdGhlIFQtYml0IGluIHRoZSBDaHVuayBGbGFncworICogICAgdG8gaW5kaWNhdGUgdGhhdCBubyBUQ0Igd2FzIGZvdW5kLiAgQWZ0ZXIgc2VuZGluZyB0aGlzIEFCT1JULAorICogICAgdGhlIHJlY2VpdmVyIG9mIHRoZSBPT1RCIHBhY2tldCBzaGFsbCBkaXNjYXJkIHRoZSBPT1RCIHBhY2tldAorICogICAgYW5kIHRha2Ugbm8gZnVydGhlciBhY3Rpb24uCisgKgorICogVmVyaWZpY2F0aW9uIFRhZzoKKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBkaXNwb3NpdGlvbiBvZiB0aGUgY2h1bmsuCisqLworc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc2ZfdGFib3J0XzhfNF84KGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwkJCQkJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJCWNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJCQkJCXZvaWQgKmFyZywKKwkJCQkJc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCXN0cnVjdCBzY3RwX3BhY2tldCAqcGFja2V0ID0gTlVMTDsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmsgPSBhcmc7CisJc3RydWN0IHNjdHBfY2h1bmsgKmFib3J0OworCisJcGFja2V0ID0gc2N0cF9vb3RiX3BrdF9uZXcoYXNvYywgY2h1bmspOworCisJaWYgKHBhY2tldCkgeworCQkvKiBNYWtlIGFuIEFCT1JULiBUaGUgVCBiaXQgd2lsbCBiZSBzZXQgaWYgdGhlIGFzb2MKKwkJICogaXMgTlVMTC4KKwkJICovCisgICAgICAgIAlhYm9ydCA9IHNjdHBfbWFrZV9hYm9ydChhc29jLCBjaHVuaywgMCk7CisJCWlmICghYWJvcnQpIHsKKwkJCXNjdHBfb290Yl9wa3RfZnJlZShwYWNrZXQpOworCQkJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fTk9NRU07CisJCX0KKworCQkvKiBTZXQgdGhlIHNrYiB0byB0aGUgYmVsb25naW5nIHNvY2sgZm9yIGFjY291bnRpbmcuICAqLworCQlhYm9ydC0+c2tiLT5zayA9IGVwLT5iYXNlLnNrOworCisJCXNjdHBfcGFja2V0X2FwcGVuZF9jaHVuayhwYWNrZXQsIGFib3J0KTsKKworCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1NFTkRfUEtULAorCQkJCVNDVFBfUEFDS0VUKHBhY2tldCkpOworCisJCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX09VVENUUkxDSFVOS1MpOworCisJCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0NPTlNVTUU7CisJfQorCisJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fTk9NRU07Cit9CisKKy8qCisgKiBSZWNlaXZlZCBhbiBFUlJPUiBjaHVuayBmcm9tIHBlZXIuICBHZW5lcmF0ZSBTQ1RQX1JFTU9URV9FUlJPUgorICogZXZlbnQgYXMgVUxQIG5vdGlmaWNhdGlvbiBmb3IgZWFjaCBjYXVzZSBpbmNsdWRlZCBpbiB0aGUgY2h1bmsuCisgKgorICogQVBJIDUuMy4xLjMgLSBTQ1RQX1JFTU9URV9FUlJPUgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGRpc3Bvc2l0aW9uIG9mIHRoZSBjaHVuay4KKyovCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl9vcGVycl9ub3RpZnkoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCQljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkJY29uc3Qgc2N0cF9zdWJ0eXBlX3QgdHlwZSwKKwkJCQkJdm9pZCAqYXJnLAorCQkJCQlzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rID0gYXJnOworCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldjsKKworCWlmICghc2N0cF92dGFnX3ZlcmlmeShjaHVuaywgYXNvYykpCisJCXJldHVybiBzY3RwX3NmX3BkaXNjYXJkKGVwLCBhc29jLCB0eXBlLCBhcmcsIGNvbW1hbmRzKTsKKworCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBFUlJPUiBjaHVuayBoYXMgYSB2YWxpZCBsZW5ndGguICovCisJaWYgKCFzY3RwX2NodW5rX2xlbmd0aF92YWxpZChjaHVuaywgc2l6ZW9mKHNjdHBfb3BlcnJfY2h1bmtfdCkpKQorCQlyZXR1cm4gc2N0cF9zZl92aW9sYXRpb25fY2h1bmtsZW4oZXAsIGFzb2MsIHR5cGUsIGFyZywKKwkJCQkJCSAgY29tbWFuZHMpOworCisJd2hpbGUgKGNodW5rLT5jaHVua19lbmQgPiBjaHVuay0+c2tiLT5kYXRhKSB7CisJCWV2ID0gc2N0cF91bHBldmVudF9tYWtlX3JlbW90ZV9lcnJvcihhc29jLCBjaHVuaywgMCwKKwkJCQkJCSAgICAgR0ZQX0FUT01JQyk7CisJCWlmICghZXYpCisJCQlnb3RvIG5vbWVtOworCisJCWlmICghc2N0cF9hZGRfY21kKGNvbW1hbmRzLCBTQ1RQX0NNRF9FVkVOVF9VTFAsCisJCQkJICBTQ1RQX1VMUEVWRU5UKGV2KSkpIHsKKwkJCXNjdHBfdWxwZXZlbnRfZnJlZShldik7CisJCQlnb3RvIG5vbWVtOworCQl9CisKKwkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9QUk9DRVNTX09QRVJSLAorCQkJCVNDVFBfQ0hVTksoY2h1bmspKTsJCisJfQorCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0NPTlNVTUU7CisKK25vbWVtOgorCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX05PTUVNOworfQorCisvKgorICogUHJvY2VzcyBhbiBpbmJvdW5kIFNIVVRET1dOIEFDSy4KKyAqCisgKiBGcm9tIFNlY3Rpb24gOS4yOgorICogVXBvbiB0aGUgcmVjZWlwdCBvZiB0aGUgU0hVVERPV04gQUNLLCB0aGUgU0hVVERPV04gc2VuZGVyIHNoYWxsCisgKiBzdG9wIHRoZSBUMi1zaHV0ZG93biB0aW1lciwgc2VuZCBhIFNIVVRET1dOIENPTVBMRVRFIGNodW5rIHRvIGl0cworICogcGVlciwgYW5kIHJlbW92ZSBhbGwgcmVjb3JkIG9mIHRoZSBhc3NvY2lhdGlvbi4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBkaXNwb3NpdGlvbi4KKyAqLworc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc2ZfZG9fOV8yX2ZpbmFsKGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwkJCQkJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJCWNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJCQkJCXZvaWQgKmFyZywKKwkJCQkJc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuayA9IGFyZzsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqcmVwbHk7CisJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2OworCisJaWYgKCFzY3RwX3Z0YWdfdmVyaWZ5KGNodW5rLCBhc29jKSkKKwkJcmV0dXJuIHNjdHBfc2ZfcGRpc2NhcmQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworCisJLyogTWFrZSBzdXJlIHRoYXQgdGhlIFNIVVRET1dOX0FDSyBjaHVuayBoYXMgYSB2YWxpZCBsZW5ndGguICovCisJaWYgKCFzY3RwX2NodW5rX2xlbmd0aF92YWxpZChjaHVuaywgc2l6ZW9mKHNjdHBfY2h1bmtoZHJfdCkpKQorCQlyZXR1cm4gc2N0cF9zZl92aW9sYXRpb25fY2h1bmtsZW4oZXAsIGFzb2MsIHR5cGUsIGFyZywKKwkJCQkJCSAgY29tbWFuZHMpOworCisJLyogMTAuMiBIKSBTSFVURE9XTiBDT01QTEVURSBub3RpZmljYXRpb24KKwkgKgorCSAqIFdoZW4gU0NUUCBjb21wbGV0ZXMgdGhlIHNodXRkb3duIHByb2NlZHVyZXMgKHNlY3Rpb24gOS4yKSB0aGlzCisJICogbm90aWZpY2F0aW9uIGlzIHBhc3NlZCB0byB0aGUgdXBwZXIgbGF5ZXIuCisJICovCisJZXYgPSBzY3RwX3VscGV2ZW50X21ha2VfYXNzb2NfY2hhbmdlKGFzb2MsIDAsIFNDVFBfU0hVVERPV05fQ09NUCwKKwkJCQkJICAgICAwLCAwLCAwLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWV2KQorCQlnb3RvIG5vbWVtOworCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9FVkVOVF9VTFAsIFNDVFBfVUxQRVZFTlQoZXYpKTsKKworCS8qIFVwb24gdGhlIHJlY2VpcHQgb2YgdGhlIFNIVVRET1dOIEFDSywgdGhlIFNIVVRET1dOIHNlbmRlciBzaGFsbAorCSAqIHN0b3AgdGhlIFQyLXNodXRkb3duIHRpbWVyLAorCSAqLworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVElNRVJfU1RPUCwKKwkJCVNDVFBfVE8oU0NUUF9FVkVOVF9USU1FT1VUX1QyX1NIVVRET1dOKSk7CisKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RJTUVSX1NUT1AsCisJCQlTQ1RQX1RPKFNDVFBfRVZFTlRfVElNRU9VVF9UNV9TSFVURE9XTl9HVUFSRCkpOworCisJLyogLi4uc2VuZCBhIFNIVVRET1dOIENPTVBMRVRFIGNodW5rIHRvIGl0cyBwZWVyLCAqLworCXJlcGx5ID0gc2N0cF9tYWtlX3NodXRkb3duX2NvbXBsZXRlKGFzb2MsIGNodW5rKTsKKwlpZiAoIXJlcGx5KQorCQlnb3RvIG5vbWVtOworCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9ORVdfU1RBVEUsCisJCQlTQ1RQX1NUQVRFKFNDVFBfU1RBVEVfQ0xPU0VEKSk7CisJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfU0hVVERPV05TKTsKKwlTQ1RQX0RFQ19TVEFUUyhTQ1RQX01JQl9DVVJSRVNUQUIpOworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUkVQTFksIFNDVFBfQ0hVTksocmVwbHkpKTsKKworCS8qIC4uLmFuZCByZW1vdmUgYWxsIHJlY29yZCBvZiB0aGUgYXNzb2NpYXRpb24uICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9ERUxFVEVfVENCLCBTQ1RQX05VTEwoKSk7CisJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fREVMRVRFX1RDQjsKKworbm9tZW06CisJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fTk9NRU07Cit9CisKKy8qCisgKiBSRkMgMjk2MCwgOC40IC0gSGFuZGxlICJPdXQgb2YgdGhlIGJsdWUiIFBhY2tldHMKKyAqIDUpIElmIHRoZSBwYWNrZXQgY29udGFpbnMgYSBTSFVURE9XTiBBQ0sgY2h1bmssIHRoZSByZWNlaXZlciBzaG91bGQKKyAqICAgIHJlc3BvbmQgdG8gdGhlIHNlbmRlciBvZiB0aGUgT09UQiBwYWNrZXQgd2l0aCBhIFNIVVRET1dOIENPTVBMRVRFLgorICogICAgV2hlbiBzZW5kaW5nIHRoZSBTSFVURE9XTiBDT01QTEVURSwgdGhlIHJlY2VpdmVyIG9mIHRoZSBPT1RCCisgKiAgICBwYWNrZXQgbXVzdCBmaWxsIGluIHRoZSBWZXJpZmljYXRpb24gVGFnIGZpZWxkIG9mIHRoZSBvdXRib3VuZAorICogICAgcGFja2V0IHdpdGggdGhlIFZlcmlmaWNhdGlvbiBUYWcgcmVjZWl2ZWQgaW4gdGhlIFNIVVRET1dOIEFDSyBhbmQKKyAqICAgIHNldCB0aGUgVC1iaXQgaW4gdGhlIENodW5rIEZsYWdzIHRvIGluZGljYXRlIHRoYXQgbm8gVENCIHdhcworICogICAgZm91bmQuIE90aGVyd2lzZSwKKyAqCisgKiA4KSBUaGUgcmVjZWl2ZXIgc2hvdWxkIHJlc3BvbmQgdG8gdGhlIHNlbmRlciBvZiB0aGUgT09UQiBwYWNrZXQgd2l0aAorICogICAgYW4gQUJPUlQuICBXaGVuIHNlbmRpbmcgdGhlIEFCT1JULCB0aGUgcmVjZWl2ZXIgb2YgdGhlIE9PVEIgcGFja2V0CisgKiAgICBNVVNUIGZpbGwgaW4gdGhlIFZlcmlmaWNhdGlvbiBUYWcgZmllbGQgb2YgdGhlIG91dGJvdW5kIHBhY2tldAorICogICAgd2l0aCB0aGUgdmFsdWUgZm91bmQgaW4gdGhlIFZlcmlmaWNhdGlvbiBUYWcgZmllbGQgb2YgdGhlIE9PVEIKKyAqICAgIHBhY2tldCBhbmQgc2V0IHRoZSBULWJpdCBpbiB0aGUgQ2h1bmsgRmxhZ3MgdG8gaW5kaWNhdGUgdGhhdCBubworICogICAgVENCIHdhcyBmb3VuZC4gIEFmdGVyIHNlbmRpbmcgdGhpcyBBQk9SVCwgdGhlIHJlY2VpdmVyIG9mIHRoZSBPT1RCCisgKiAgICBwYWNrZXQgc2hhbGwgZGlzY2FyZCB0aGUgT09UQiBwYWNrZXQgYW5kIHRha2Ugbm8gZnVydGhlciBhY3Rpb24uCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX29vdGIoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCWNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJCQkJdm9pZCAqYXJnLAorCQkJCXNjdHBfY21kX3NlcV90ICpjb21tYW5kcykKK3sKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmsgPSBhcmc7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGNodW5rLT5za2I7CisJc2N0cF9jaHVua2hkcl90ICpjaDsKKwlfX3U4ICpjaF9lbmQ7CisJaW50IG9vdGJfc2h1dF9hY2sgPSAwOworCisJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfT1VUT0ZCTFVFUyk7CisKKwljaCA9IChzY3RwX2NodW5raGRyX3QgKikgY2h1bmstPmNodW5rX2hkcjsKKwlkbyB7CisJCS8qIEJyZWFrIG91dCBpZiBjaHVuayBsZW5ndGggaXMgbGVzcyB0aGVuIG1pbmltYWwuICovCisJCWlmIChudG9ocyhjaC0+bGVuZ3RoKSA8IHNpemVvZihzY3RwX2NodW5raGRyX3QpKQorCQkJYnJlYWs7CisKKwkJY2hfZW5kID0gKChfX3U4ICopY2gpICsgV09SRF9ST1VORChudG9ocyhjaC0+bGVuZ3RoKSk7CisKKwkJaWYgKFNDVFBfQ0lEX1NIVVRET1dOX0FDSyA9PSBjaC0+dHlwZSkKKwkJCW9vdGJfc2h1dF9hY2sgPSAxOworCisJCS8qIFJGQyAyOTYwLCBTZWN0aW9uIDMuMy43CisJCSAqICAgTW9yZW92ZXIsIHVuZGVyIGFueSBjaXJjdW1zdGFuY2VzLCBhbiBlbmRwb2ludCB0aGF0CisJCSAqICAgcmVjZWl2ZXMgYW4gQUJPUlQgIE1VU1QgTk9UIHJlc3BvbmQgdG8gdGhhdCBBQk9SVCBieQorCQkgKiAgIHNlbmRpbmcgYW4gQUJPUlQgb2YgaXRzIG93bi4KKwkJICovCisJCWlmIChTQ1RQX0NJRF9BQk9SVCA9PSBjaC0+dHlwZSkKKwkJCXJldHVybiBzY3RwX3NmX3BkaXNjYXJkKGVwLCBhc29jLCB0eXBlLCBhcmcsIGNvbW1hbmRzKTsKKwkJCQorCQljaCA9IChzY3RwX2NodW5raGRyX3QgKikgY2hfZW5kOworCX0gd2hpbGUgKGNoX2VuZCA8IHNrYi0+dGFpbCk7CisKKwlpZiAob290Yl9zaHV0X2FjaykKKwkJc2N0cF9zZl9zaHV0XzhfNF81KGVwLCBhc29jLCB0eXBlLCBhcmcsIGNvbW1hbmRzKTsKKwllbHNlCisJCXNjdHBfc2ZfdGFib3J0XzhfNF84KGVwLCBhc29jLCB0eXBlLCBhcmcsIGNvbW1hbmRzKTsKKworCXJldHVybiBzY3RwX3NmX3BkaXNjYXJkKGVwLCBhc29jLCB0eXBlLCBhcmcsIGNvbW1hbmRzKTsKK30KKworLyoKKyAqIEhhbmRsZSBhbiAiT3V0IG9mIHRoZSBibHVlIiBTSFVURE9XTiBBQ0suCisgKgorICogU2VjdGlvbjogOC40IDUpCisgKiA1KSBJZiB0aGUgcGFja2V0IGNvbnRhaW5zIGEgU0hVVERPV04gQUNLIGNodW5rLCB0aGUgcmVjZWl2ZXIgc2hvdWxkCisgKiAgIHJlc3BvbmQgdG8gdGhlIHNlbmRlciBvZiB0aGUgT09UQiBwYWNrZXQgd2l0aCBhIFNIVVRET1dOIENPTVBMRVRFLgorICogICBXaGVuIHNlbmRpbmcgdGhlIFNIVVRET1dOIENPTVBMRVRFLCB0aGUgcmVjZWl2ZXIgb2YgdGhlIE9PVEIgcGFja2V0CisgKiAgIG11c3QgZmlsbCBpbiB0aGUgVmVyaWZpY2F0aW9uIFRhZyBmaWVsZCBvZiB0aGUgb3V0Ym91bmQgcGFja2V0IHdpdGgKKyAqICAgdGhlIFZlcmlmaWNhdGlvbiBUYWcgcmVjZWl2ZWQgaW4gdGhlIFNIVVRET1dOIEFDSyBhbmQgc2V0IHRoZQorICogICBULWJpdCBpbiB0aGUgQ2h1bmsgRmxhZ3MgdG8gaW5kaWNhdGUgdGhhdCBubyBUQ0Igd2FzIGZvdW5kLgorICoKKyAqIElucHV0cworICogKGVuZHBvaW50LCBhc29jLCB0eXBlLCBhcmcsIGNvbW1hbmRzKQorICoKKyAqIE91dHB1dHMKKyAqIChzY3RwX2Rpc3Bvc2l0aW9uX3QpCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgZGlzcG9zaXRpb24gb2YgdGhlIGNodW5rLgorICovCitzdGF0aWMgc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc2Zfc2h1dF84XzRfNShjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkJCSAgICAgY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJCSAgICAgY29uc3Qgc2N0cF9zdWJ0eXBlX3QgdHlwZSwKKwkJCQkJICAgICB2b2lkICphcmcsCisJCQkJCSAgICAgc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCXN0cnVjdCBzY3RwX3BhY2tldCAqcGFja2V0ID0gTlVMTDsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmsgPSBhcmc7CisJc3RydWN0IHNjdHBfY2h1bmsgKnNodXQ7CisKKwlwYWNrZXQgPSBzY3RwX29vdGJfcGt0X25ldyhhc29jLCBjaHVuayk7CisKKwlpZiAocGFja2V0KSB7CisJCS8qIE1ha2UgYW4gU0hVVERPV05fQ09NUExFVEUuCisgICAgICAgICAJICogVGhlIFQgYml0IHdpbGwgYmUgc2V0IGlmIHRoZSBhc29jIGlzIE5VTEwuCisgICAgICAgICAJICovCisJCXNodXQgPSBzY3RwX21ha2Vfc2h1dGRvd25fY29tcGxldGUoYXNvYywgY2h1bmspOworCQlpZiAoIXNodXQpIHsKKwkJCXNjdHBfb290Yl9wa3RfZnJlZShwYWNrZXQpOworCQkJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fTk9NRU07CisJCX0KKworCQkvKiBTZXQgdGhlIHNrYiB0byB0aGUgYmVsb25naW5nIHNvY2sgZm9yIGFjY291bnRpbmcuICAqLworCQlzaHV0LT5za2ItPnNrID0gZXAtPmJhc2Uuc2s7CisKKwkJc2N0cF9wYWNrZXRfYXBwZW5kX2NodW5rKHBhY2tldCwgc2h1dCk7CisKKwkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9TRU5EX1BLVCwKKwkJCQlTQ1RQX1BBQ0tFVChwYWNrZXQpKTsKKworCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9PVVRDVFJMQ0hVTktTKTsKKworCQkvKiBJZiB0aGUgY2h1bmsgbGVuZ3RoIGlzIGludmFsaWQsIHdlIGRvbid0IHdhbnQgdG8gcHJvY2VzcworCQkgKiB0aGUgcmVzZXQgb2YgdGhlIHBhY2tldC4KKwkJICovCisJCWlmICghc2N0cF9jaHVua19sZW5ndGhfdmFsaWQoY2h1bmssIHNpemVvZihzY3RwX2NodW5raGRyX3QpKSkKKwkJCXJldHVybiBzY3RwX3NmX3BkaXNjYXJkKGVwLCBhc29jLCB0eXBlLCBhcmcsIGNvbW1hbmRzKTsKKworCQlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9DT05TVU1FOworCX0KKworCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX05PTUVNOworfQorCisvKgorICogSGFuZGxlIFNIVVRET1dOIEFDSyBpbiBDT09LSUVfRUNIT0VEIG9yIENPT0tJRV9XQUlUIHN0YXRlLgorICoKKyAqIFZlcmlmaWNhdGlvbiBUYWc6ICA4LjUuMSBFKSBSdWxlcyBmb3IgcGFja2V0IGNhcnJ5aW5nIGEgU0hVVERPV04gQUNLCisgKiAgIElmIHRoZSByZWNlaXZlciBpcyBpbiBDT09LSUUtRUNIT0VEIG9yIENPT0tJRS1XQUlUIHN0YXRlIHRoZQorICogICBwcm9jZWR1cmVzIGluIHNlY3Rpb24gOC40IFNIT1VMRCBiZSBmb2xsb3dlZCwgaW4gb3RoZXIgd29yZHMgaXQKKyAqICAgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYW4gT3V0IE9mIFRoZSBCbHVlIHBhY2tldC4KKyAqICAgW1RoaXMgbWVhbnMgdGhhdCB3ZSBkbyBOT1QgY2hlY2sgdGhlIFZlcmlmaWNhdGlvbiBUYWcgb24gdGhlc2UKKyAqICAgY2h1bmtzLiAtLXBpZ2d5IF0KKyAqCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2RvXzhfNV8xX0Vfc2EoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSAgICAgIGNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJCQkJICAgICAgdm9pZCAqYXJnLAorCQkJCSAgICAgIHNjdHBfY21kX3NlcV90ICpjb21tYW5kcykKK3sKKwkvKiBBbHRob3VnaCB3ZSBkbyBoYXZlIGFuIGFzc29jaWF0aW9uIGluIHRoaXMgY2FzZSwgaXQgY29ycmVzcG9uZHMKKwkgKiB0byBhIHJlc3RhcnRlZCBhc3NvY2lhdGlvbi4gU28gdGhlIHBhY2tldCBpcyB0cmVhdGVkIGFzIGFuIE9PVEIKKwkgKiBwYWNrZXQgYW5kIHRoZSBzdGF0ZSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgT09UQiBTSFVURE9XTl9BQ0sgaXMKKwkgKiBjYWxsZWQgd2l0aCBhIE5VTEwgYXNzb2NpYXRpb24uCisJICovCisJcmV0dXJuIHNjdHBfc2Zfc2h1dF84XzRfNShlcCwgTlVMTCwgdHlwZSwgYXJnLCBjb21tYW5kcyk7Cit9CisKKy8qIEFERElQIFNlY3Rpb24gNC4yIFVwb24gcmVjZXB0aW9uIG9mIGFuIEFTQ09ORiBDaHVuay4gICovCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl9kb19hc2NvbmYoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJICAgICBjb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLCB2b2lkICphcmcsCisJCQkJICAgICBzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJc3RydWN0IHNjdHBfY2h1bmsJKmNodW5rID0gYXJnOworCXN0cnVjdCBzY3RwX2NodW5rCSphc2NvbmZfYWNrID0gTlVMTDsKKwlzY3RwX2FkZGlwaGRyX3QJCSpoZHI7CisJX191MzIJCQlzZXJpYWw7CisKKwlpZiAoIXNjdHBfdnRhZ192ZXJpZnkoY2h1bmssIGFzb2MpKSB7CisJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUkVQT1JUX0JBRF9UQUcsCisJCQkJU0NUUF9OVUxMKCkpOworCQlyZXR1cm4gc2N0cF9zZl9wZGlzY2FyZChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7CisJfQorCisJLyogTWFrZSBzdXJlIHRoYXQgdGhlIEFTQ09ORiBBRERJUCBjaHVuayBoYXMgYSB2YWxpZCBsZW5ndGguICAqLworCWlmICghc2N0cF9jaHVua19sZW5ndGhfdmFsaWQoY2h1bmssIHNpemVvZihzY3RwX2FkZGlwX2NodW5rX3QpKSkKKwkJcmV0dXJuIHNjdHBfc2ZfdmlvbGF0aW9uX2NodW5rbGVuKGVwLCBhc29jLCB0eXBlLCBhcmcsCisJCQkJCQkgIGNvbW1hbmRzKTsKKworCWhkciA9IChzY3RwX2FkZGlwaGRyX3QgKiljaHVuay0+c2tiLT5kYXRhOworCXNlcmlhbCA9IG50b2hsKGhkci0+c2VyaWFsKTsKKworCS8qIEFERElQIDQuMiBDMSkgQ29tcGFyZSB0aGUgdmFsdWUgb2YgdGhlIHNlcmlhbCBudW1iZXIgdG8gdGhlIHZhbHVlCisJICogdGhlIGVuZHBvaW50IHN0b3JlZCBpbiBhIG5ldyBhc3NvY2lhdGlvbiB2YXJpYWJsZQorCSAqICdQZWVyLVNlcmlhbC1OdW1iZXInLiAKKwkgKi8KKwlpZiAoc2VyaWFsID09IGFzb2MtPnBlZXIuYWRkaXBfc2VyaWFsICsgMSkgeworICAgCQkvKiBBRERJUCA0LjIgQzIpIElmIHRoZSB2YWx1ZSBmb3VuZCBpbiB0aGUgc2VyaWFsIG51bWJlciBpcworCQkgKiBlcXVhbCB0byB0aGUgKCdQZWVyLVNlcmlhbC1OdW1iZXInICsgMSksIHRoZSBlbmRwb2ludCBNVVNUCisJCSAqIGRvIFYxLVY1LgorCQkgKi8KKwkJYXNjb25mX2FjayA9IHNjdHBfcHJvY2Vzc19hc2NvbmYoKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICopCisJCQkJCQkgYXNvYywgY2h1bmspOworCQlpZiAoIWFzY29uZl9hY2spCisJCQlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9OT01FTTsKKwl9IGVsc2UgaWYgKHNlcmlhbCA9PSBhc29jLT5wZWVyLmFkZGlwX3NlcmlhbCkgeworCQkvKiBBRERJUCA0LjIgQzMpIElmIHRoZSB2YWx1ZSBmb3VuZCBpbiB0aGUgc2VyaWFsIG51bWJlciBpcworCQkgKiBlcXVhbCB0byB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSAnUGVlci1TZXJpYWwtTnVtYmVyJworCQkgKiBJTVBMRU1FTlRBVElPTiBOT1RFOiBBcyBhbiBvcHRpbWl6YXRpb24gYSByZWNlaXZlciBtYXkgd2lzaAorCQkgKiB0byBzYXZlIHRoZSBsYXN0IEFTQ09ORi1BQ0sgZm9yIHNvbWUgcHJlZGV0ZXJtaW5lZCBwZXJpb2Qgb2YKKwkJICogdGltZSBhbmQgaW5zdGVhZCBvZiByZS1wcm9jZXNzaW5nIHRoZSBBU0NPTkYgKHdpdGggdGhlIHNhbWUKKwkJICogc2VyaWFsIG51bWJlcikgaXQgbWF5IGp1c3QgcmUtdHJhbnNtaXQgdGhlIEFTQ09ORi1BQ0suCisJCSAqLworCQlpZiAoYXNvYy0+YWRkaXBfbGFzdF9hc2NvbmZfYWNrKQorCQkJYXNjb25mX2FjayA9IGFzb2MtPmFkZGlwX2xhc3RfYXNjb25mX2FjazsKKwkJZWxzZQorCQkJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fRElTQ0FSRDsKKwl9IGVsc2UgeworCQkvKiBBRERJUCA0LjIgQzQpIE90aGVyd2lzZSwgdGhlIEFTQ09ORiBDaHVuayBpcyBkaXNjYXJkZWQgc2luY2UgCisJCSAqIGl0IG11c3QgYmUgZWl0aGVyIGEgc3RhbGUgcGFja2V0IG9yIGZyb20gYW4gYXR0YWNrZXIuCisJCSAqLwkKKwkJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fRElTQ0FSRDsKKwl9CisKKwkvKiBBRERJUCA0LjIgQzUpIEluIGJvdGggY2FzZXMgQzIgYW5kIEMzIHRoZSBBU0NPTkYtQUNLIE1VU1QgYmUgc2VudAorCSAqIGJhY2sgdG8gdGhlIHNvdXJjZSBhZGRyZXNzIGNvbnRhaW5lZCBpbiB0aGUgSVAgaGVhZGVyIG9mIHRoZSBBU0NPTkYKKwkgKiBiZWluZyByZXNwb25kZWQgdG8uCisJICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9SRVBMWSwgU0NUUF9DSFVOSyhhc2NvbmZfYWNrKSk7CisJCisJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fQ09OU1VNRTsKK30KKworLyoKKyAqIEFERElQIFNlY3Rpb24gNC4zIEdlbmVyYWwgcnVsZXMgZm9yIGFkZHJlc3MgbWFuaXB1bGF0aW9uCisgKiBXaGVuIGJ1aWxkaW5nIFRMViBwYXJhbWV0ZXJzIGZvciB0aGUgQVNDT05GIENodW5rIHRoYXQgd2lsbCBhZGQgb3IKKyAqIGRlbGV0ZSBJUCBhZGRyZXNzZXMgdGhlIEQwIHRvIEQxMyBydWxlcyBzaG91bGQgYmUgYXBwbGllZDoKKyAqLworc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc2ZfZG9fYXNjb25mX2Fjayhjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkJCSBjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkgCQkJCSBjb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLCB2b2lkICphcmcsCisJCQkJCSBzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJc3RydWN0IHNjdHBfY2h1bmsJKmFzY29uZl9hY2sgPSBhcmc7CisJc3RydWN0IHNjdHBfY2h1bmsJKmxhc3RfYXNjb25mID0gYXNvYy0+YWRkaXBfbGFzdF9hc2NvbmY7CisJc3RydWN0IHNjdHBfY2h1bmsJKmFib3J0OworCXNjdHBfYWRkaXBoZHJfdAkJKmFkZGlwX2hkcjsKKwlfX3UzMgkJCXNlbnRfc2VyaWFsLCByY3ZkX3NlcmlhbDsKKworCWlmICghc2N0cF92dGFnX3ZlcmlmeShhc2NvbmZfYWNrLCBhc29jKSkgeworCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1JFUE9SVF9CQURfVEFHLAorCQkJCVNDVFBfTlVMTCgpKTsKKwkJcmV0dXJuIHNjdHBfc2ZfcGRpc2NhcmQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBBRERJUCBjaHVuayBoYXMgYSB2YWxpZCBsZW5ndGguICAqLworCWlmICghc2N0cF9jaHVua19sZW5ndGhfdmFsaWQoYXNjb25mX2Fjaywgc2l6ZW9mKHNjdHBfYWRkaXBfY2h1bmtfdCkpKQorCQlyZXR1cm4gc2N0cF9zZl92aW9sYXRpb25fY2h1bmtsZW4oZXAsIGFzb2MsIHR5cGUsIGFyZywKKwkJCQkJCSAgY29tbWFuZHMpOworCisJYWRkaXBfaGRyID0gKHNjdHBfYWRkaXBoZHJfdCAqKWFzY29uZl9hY2stPnNrYi0+ZGF0YTsKKwlyY3ZkX3NlcmlhbCA9IG50b2hsKGFkZGlwX2hkci0+c2VyaWFsKTsKKworCWlmIChsYXN0X2FzY29uZikgeworCQlhZGRpcF9oZHIgPSAoc2N0cF9hZGRpcGhkcl90ICopbGFzdF9hc2NvbmYtPnN1YmguYWRkaXBfaGRyOworCQlzZW50X3NlcmlhbCA9IG50b2hsKGFkZGlwX2hkci0+c2VyaWFsKTsKKwl9IGVsc2UgeworCQlzZW50X3NlcmlhbCA9IGFzb2MtPmFkZGlwX3NlcmlhbCAtIDE7CisJfQorCisJLyogRDApIElmIGFuIGVuZHBvaW50IHJlY2VpdmVzIGFuIEFTQ09ORi1BQ0sgdGhhdCBpcyBncmVhdGVyIHRoYW4gb3IKKwkgKiBlcXVhbCB0byB0aGUgbmV4dCBzZXJpYWwgbnVtYmVyIHRvIGJlIHVzZWQgYnV0IG5vIEFTQ09ORiBjaHVuayBpcworCSAqIG91dHN0YW5kaW5nIHRoZSBlbmRwb2ludCBNVVNUIEFCT1JUIHRoZSBhc3NvY2lhdGlvbi4gTm90ZSB0aGF0IGEKKwkgKiBzZXF1ZW5jZSBudW1iZXIgaXMgZ3JlYXRlciB0aGFuIGlmIGl0IGlzIG5vIG1vcmUgdGhhbiAyXl4zMS0xCisJICogbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgc2VxdWVuY2UgbnVtYmVyICh1c2luZyBzZXJpYWwgYXJpdGhtZXRpYykuCisJICovCisJaWYgKEFERElQX1NFUklBTF9ndGUocmN2ZF9zZXJpYWwsIHNlbnRfc2VyaWFsICsgMSkgJiYKKwkgICAgIShhc29jLT5hZGRpcF9sYXN0X2FzY29uZikpIHsKKwkJYWJvcnQgPSBzY3RwX21ha2VfYWJvcnQoYXNvYywgYXNjb25mX2FjaywKKwkJCQkJc2l6ZW9mKHNjdHBfZXJyaGRyX3QpKTsKKwkJaWYgKGFib3J0KSB7CisJCQlzY3RwX2luaXRfY2F1c2UoYWJvcnQsIFNDVFBfRVJST1JfQVNDT05GX0FDSywgTlVMTCwgMCk7CisJCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1JFUExZLAorCQkJCQlTQ1RQX0NIVU5LKGFib3J0KSk7CisJCX0KKwkJLyogV2UgYXJlIGdvaW5nIHRvIEFCT1JULCBzbyB3ZSBtaWdodCBhcyB3ZWxsIHN0b3AKKwkJICogcHJvY2Vzc2luZyB0aGUgcmVzdCBvZiB0aGUgY2h1bmtzIGluIHRoZSBwYWNrZXQuCisJCSAqLworCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RJTUVSX1NUT1AsCisJCQkJU0NUUF9UTyhTQ1RQX0VWRU5UX1RJTUVPVVRfVDRfUlRPKSk7CisJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfRElTQ0FSRF9QQUNLRVQsU0NUUF9OVUxMKCkpOworCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0FTU09DX0ZBSUxFRCwKKwkJCQlTQ1RQX1UzMihTQ1RQX0VSUk9SX0FTQ09ORl9BQ0spKTsKKwkJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfQUJPUlRFRFMpOworCQlTQ1RQX0RFQ19TVEFUUyhTQ1RQX01JQl9DVVJSRVNUQUIpOworCQlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9BQk9SVDsKKwl9CisKKwlpZiAoKHJjdmRfc2VyaWFsID09IHNlbnRfc2VyaWFsKSAmJiBhc29jLT5hZGRpcF9sYXN0X2FzY29uZikgeworCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RJTUVSX1NUT1AsCisJCQkJU0NUUF9UTyhTQ1RQX0VWRU5UX1RJTUVPVVRfVDRfUlRPKSk7CisKKwkJaWYgKCFzY3RwX3Byb2Nlc3NfYXNjb25mX2Fjaygoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKilhc29jLAorCQkJCQkgICAgIGFzY29uZl9hY2spKQorCQkJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fQ09OU1VNRTsKKworCQlhYm9ydCA9IHNjdHBfbWFrZV9hYm9ydChhc29jLCBhc2NvbmZfYWNrLAorCQkJCQlzaXplb2Yoc2N0cF9lcnJoZHJfdCkpOworCQlpZiAoYWJvcnQpIHsKKwkJCXNjdHBfaW5pdF9jYXVzZShhYm9ydCwgU0NUUF9FUlJPUl9SU1JDX0xPVywgTlVMTCwgMCk7CisJCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1JFUExZLAorCQkJCQlTQ1RQX0NIVU5LKGFib3J0KSk7CisJCX0KKwkJLyogV2UgYXJlIGdvaW5nIHRvIEFCT1JULCBzbyB3ZSBtaWdodCBhcyB3ZWxsIHN0b3AKKwkJICogcHJvY2Vzc2luZyB0aGUgcmVzdCBvZiB0aGUgY2h1bmtzIGluIHRoZSBwYWNrZXQuCisJCSAqLworCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0RJU0NBUkRfUEFDS0VULFNDVFBfTlVMTCgpKTsKKwkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9BU1NPQ19GQUlMRUQsCisJCQkJU0NUUF9VMzIoU0NUUF9FUlJPUl9BU0NPTkZfQUNLKSk7CisJCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX0FCT1JURURTKTsKKwkJU0NUUF9ERUNfU1RBVFMoU0NUUF9NSUJfQ1VSUkVTVEFCKTsKKwkJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fQUJPUlQ7CisJfQorCisJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fRElTQ0FSRDsKK30KKworLyoKKyAqIFBSLVNDVFAgU2VjdGlvbiAzLjYgUmVjZWl2ZXIgU2lkZSBJbXBsZW1lbnRhdGlvbiBvZiBQUi1TQ1RQCisgKgorICogV2hlbiBhIEZPUldBUkQgVFNOIGNodW5rIGFycml2ZXMsIHRoZSBkYXRhIHJlY2VpdmVyIE1VU1QgZmlyc3QgdXBkYXRlCisgKiBpdHMgY3VtdWxhdGl2ZSBUU04gcG9pbnQgdG8gdGhlIHZhbHVlIGNhcnJpZWQgaW4gdGhlIEZPUldBUkQgVFNOCisgKiBjaHVuaywgYW5kIHRoZW4gTVVTVCBmdXJ0aGVyIGFkdmFuY2UgaXRzIGN1bXVsYXRpdmUgVFNOIHBvaW50IGxvY2FsbHkKKyAqIGlmIHBvc3NpYmxlLgorICogQWZ0ZXIgdGhlIGFib3ZlIHByb2Nlc3NpbmcsIHRoZSBkYXRhIHJlY2VpdmVyIE1VU1Qgc3RvcCByZXBvcnRpbmcgYW55CisgKiBtaXNzaW5nIFRTTnMgZWFybGllciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBuZXcgY3VtdWxhdGl2ZSBUU04gcG9pbnQuCisgKgorICogVmVyaWZpY2F0aW9uIFRhZzogIDguNSBWZXJpZmljYXRpb24gVGFnIFtOb3JtYWwgdmVyaWZpY2F0aW9uXQorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGRpc3Bvc2l0aW9uIG9mIHRoZSBjaHVuay4KKyAqLworc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc2ZfZWF0X2Z3ZF90c24oY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkgICAgICAgY29uc3Qgc2N0cF9zdWJ0eXBlX3QgdHlwZSwKKwkJCQkgICAgICAgdm9pZCAqYXJnLAorCQkJCSAgICAgICBzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rID0gYXJnOworCXN0cnVjdCBzY3RwX2Z3ZHRzbl9oZHIgKmZ3ZHRzbl9oZHI7CisJX191MTYgbGVuOworCV9fdTMyIHRzbjsKKworCWlmICghc2N0cF92dGFnX3ZlcmlmeShjaHVuaywgYXNvYykpIHsKKwkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9SRVBPUlRfQkFEX1RBRywKKwkJCQlTQ1RQX05VTEwoKSk7CisJCXJldHVybiBzY3RwX3NmX3BkaXNjYXJkKGVwLCBhc29jLCB0eXBlLCBhcmcsIGNvbW1hbmRzKTsKKwl9CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgRk9SV0FSRF9UU04gY2h1bmsgaGFzIHZhbGlkIGxlbmd0aC4gICovCisJaWYgKCFzY3RwX2NodW5rX2xlbmd0aF92YWxpZChjaHVuaywgc2l6ZW9mKHN0cnVjdCBzY3RwX2Z3ZHRzbl9jaHVuaykpKQorCQlyZXR1cm4gc2N0cF9zZl92aW9sYXRpb25fY2h1bmtsZW4oZXAsIGFzb2MsIHR5cGUsIGFyZywKKwkJCQkJCSAgY29tbWFuZHMpOworCisJZndkdHNuX2hkciA9IChzdHJ1Y3Qgc2N0cF9md2R0c25faGRyICopY2h1bmstPnNrYi0+ZGF0YTsKKwljaHVuay0+c3ViaC5md2R0c25faGRyID0gZndkdHNuX2hkcjsKKwlsZW4gPSBudG9ocyhjaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpOworCWxlbiAtPSBzaXplb2Yoc3RydWN0IHNjdHBfY2h1bmtoZHIpOworCXNrYl9wdWxsKGNodW5rLT5za2IsIGxlbik7CisKKwl0c24gPSBudG9obChmd2R0c25faGRyLT5uZXdfY3VtX3Rzbik7CisJU0NUUF9ERUJVR19QUklOVEsoIiVzOiBUU04gMHgleC5cbiIsIF9fRlVOQ1RJT05fXywgdHNuKTsKKworCS8qIFRoZSBUU04gaXMgdG9vIGhpZ2gtLXNpbGVudGx5IGRpc2NhcmQgdGhlIGNodW5rIGFuZCBjb3VudCBvbiBpdAorCSAqIGdldHRpbmcgcmV0cmFuc21pdHRlZCBsYXRlci4KKwkgKi8KKwlpZiAoc2N0cF90c25tYXBfY2hlY2soJmFzb2MtPnBlZXIudHNuX21hcCwgdHNuKSA8IDApCisJCWdvdG8gZGlzY2FyZF9ub2ZvcmNlOworCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9SRVBPUlRfRldEVFNOLCBTQ1RQX1UzMih0c24pKTsKKwlpZiAobGVuID4gc2l6ZW9mKHN0cnVjdCBzY3RwX2Z3ZHRzbl9oZHIpKQorCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1BST0NFU1NfRldEVFNOLCAKKwkJCQlTQ1RQX0NIVU5LKGNodW5rKSk7CisJCisJLyogQ291bnQgdGhpcyBhcyByZWNlaXZpbmcgREFUQS4gKi8KKwlpZiAoYXNvYy0+YXV0b2Nsb3NlKSB7CisJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVElNRVJfUkVTVEFSVCwKKwkJCQlTQ1RQX1RPKFNDVFBfRVZFTlRfVElNRU9VVF9BVVRPQ0xPU0UpKTsKKwl9CisJCisJLyogRklYTUU6IEZvciBub3cgc2VuZCBhIFNBQ0ssIGJ1dCBEQVRBIHByb2Nlc3NpbmcgbWF5CisJICogc2VuZCBhbm90aGVyLiAKKwkgKi8KKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0dFTl9TQUNLLCBTQ1RQX05PRk9SQ0UoKSk7CisJLyogU3RhcnQgdGhlIFNBQ0sgdGltZXIuICAqLworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVElNRVJfUkVTVEFSVCwKKwkJCVNDVFBfVE8oU0NUUF9FVkVOVF9USU1FT1VUX1NBQ0spKTsKKworCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0NPTlNVTUU7CisKK2Rpc2NhcmRfbm9mb3JjZToKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9ESVNDQVJEOworfQorCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl9lYXRfZndkX3Rzbl9mYXN0KAorCWNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwljb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAorCXZvaWQgKmFyZywKKwlzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rID0gYXJnOworCXN0cnVjdCBzY3RwX2Z3ZHRzbl9oZHIgKmZ3ZHRzbl9oZHI7CisJX191MTYgbGVuOworCV9fdTMyIHRzbjsKKworCWlmICghc2N0cF92dGFnX3ZlcmlmeShjaHVuaywgYXNvYykpIHsKKwkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9SRVBPUlRfQkFEX1RBRywKKwkJCQlTQ1RQX05VTEwoKSk7CisJCXJldHVybiBzY3RwX3NmX3BkaXNjYXJkKGVwLCBhc29jLCB0eXBlLCBhcmcsIGNvbW1hbmRzKTsKKwl9CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgRk9SV0FSRF9UU04gY2h1bmsgaGFzIGEgdmFsaWQgbGVuZ3RoLiAgKi8KKwlpZiAoIXNjdHBfY2h1bmtfbGVuZ3RoX3ZhbGlkKGNodW5rLCBzaXplb2Yoc3RydWN0IHNjdHBfZndkdHNuX2NodW5rKSkpCisJCXJldHVybiBzY3RwX3NmX3Zpb2xhdGlvbl9jaHVua2xlbihlcCwgYXNvYywgdHlwZSwgYXJnLAorCQkJCQkJICBjb21tYW5kcyk7CisKKwlmd2R0c25faGRyID0gKHN0cnVjdCBzY3RwX2Z3ZHRzbl9oZHIgKiljaHVuay0+c2tiLT5kYXRhOworCWNodW5rLT5zdWJoLmZ3ZHRzbl9oZHIgPSBmd2R0c25faGRyOworCWxlbiA9IG50b2hzKGNodW5rLT5jaHVua19oZHItPmxlbmd0aCk7CisJbGVuIC09IHNpemVvZihzdHJ1Y3Qgc2N0cF9jaHVua2hkcik7CisJc2tiX3B1bGwoY2h1bmstPnNrYiwgbGVuKTsKKworCXRzbiA9IG50b2hsKGZ3ZHRzbl9oZHItPm5ld19jdW1fdHNuKTsKKwlTQ1RQX0RFQlVHX1BSSU5USygiJXM6IFRTTiAweCV4LlxuIiwgX19GVU5DVElPTl9fLCB0c24pOworCisJLyogVGhlIFRTTiBpcyB0b28gaGlnaC0tc2lsZW50bHkgZGlzY2FyZCB0aGUgY2h1bmsgYW5kIGNvdW50IG9uIGl0CisJICogZ2V0dGluZyByZXRyYW5zbWl0dGVkIGxhdGVyLgorCSAqLworCWlmIChzY3RwX3Rzbm1hcF9jaGVjaygmYXNvYy0+cGVlci50c25fbWFwLCB0c24pIDwgMCkKKwkJZ290byBnZW5fc2h1dGRvd247CisKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1JFUE9SVF9GV0RUU04sIFNDVFBfVTMyKHRzbikpOworCWlmIChsZW4gPiBzaXplb2Yoc3RydWN0IHNjdHBfZndkdHNuX2hkcikpCisJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUFJPQ0VTU19GV0RUU04sIAorCQkJCVNDVFBfQ0hVTksoY2h1bmspKTsKKwkKKwkvKiBHbyBhIGhlYWQgYW5kIGZvcmNlIGEgU0FDSywgc2luY2Ugd2UgYXJlIHNodXR0aW5nIGRvd24uICovCitnZW5fc2h1dGRvd246CisJLyogSW1wbGVtZW50b3IncyBHdWlkZS4KKwkgKgorCSAqIFdoaWxlIGluIFNIVVRET1dOLVNFTlQgc3RhdGUsIHRoZSBTSFVURE9XTiBzZW5kZXIgTVVTVCBpbW1lZGlhdGVseQorCSAqIHJlc3BvbmQgdG8gZWFjaCByZWNlaXZlZCBwYWNrZXQgY29udGFpbmluZyBvbmUgb3IgbW9yZSBEQVRBIGNodW5rKHMpCisJICogd2l0aCBhIFNBQ0ssIGEgU0hVVERPV04gY2h1bmssIGFuZCByZXN0YXJ0IHRoZSBUMi1zaHV0ZG93biB0aW1lcgorCSAqLworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfR0VOX1NIVVRET1dOLCBTQ1RQX05VTEwoKSk7CisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9HRU5fU0FDSywgU0NUUF9GT1JDRSgpKTsKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RJTUVSX1JFU1RBUlQsCisJCQlTQ1RQX1RPKFNDVFBfRVZFTlRfVElNRU9VVF9UMl9TSFVURE9XTikpOworCisgICAgICAgIHJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0NPTlNVTUU7Cit9CisKKy8qCisgKiBQcm9jZXNzIGFuIHVua25vd24gY2h1bmsuCisgKgorICogU2VjdGlvbjogMy4yLiBBbHNvLCAyLjEgaW4gdGhlIGltcGxlbWVudG9yJ3MgZ3VpZGUuCisgKgorICogQ2h1bmsgVHlwZXMgYXJlIGVuY29kZWQgc3VjaCB0aGF0IHRoZSBoaWdoZXN0LW9yZGVyIHR3byBiaXRzIHNwZWNpZnkKKyAqIHRoZSBhY3Rpb24gdGhhdCBtdXN0IGJlIHRha2VuIGlmIHRoZSBwcm9jZXNzaW5nIGVuZHBvaW50IGRvZXMgbm90CisgKiByZWNvZ25pemUgdGhlIENodW5rIFR5cGUuCisgKgorICogMDAgLSBTdG9wIHByb2Nlc3NpbmcgdGhpcyBTQ1RQIHBhY2tldCBhbmQgZGlzY2FyZCBpdCwgZG8gbm90IHByb2Nlc3MKKyAqICAgICAgYW55IGZ1cnRoZXIgY2h1bmtzIHdpdGhpbiBpdC4KKyAqCisgKiAwMSAtIFN0b3AgcHJvY2Vzc2luZyB0aGlzIFNDVFAgcGFja2V0IGFuZCBkaXNjYXJkIGl0LCBkbyBub3QgcHJvY2VzcworICogICAgICBhbnkgZnVydGhlciBjaHVua3Mgd2l0aGluIGl0LCBhbmQgcmVwb3J0IHRoZSB1bnJlY29nbml6ZWQKKyAqICAgICAgY2h1bmsgaW4gYW4gJ1VucmVjb2duaXplZCBDaHVuayBUeXBlJy4KKyAqCisgKiAxMCAtIFNraXAgdGhpcyBjaHVuayBhbmQgY29udGludWUgcHJvY2Vzc2luZy4KKyAqCisgKiAxMSAtIFNraXAgdGhpcyBjaHVuayBhbmQgY29udGludWUgcHJvY2Vzc2luZywgYnV0IHJlcG9ydCBpbiBhbiBFUlJPUgorICogICAgICBDaHVuayB1c2luZyB0aGUgJ1VucmVjb2duaXplZCBDaHVuayBUeXBlJyBjYXVzZSBvZiBlcnJvci4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBkaXNwb3NpdGlvbiBvZiB0aGUgY2h1bmsuCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX3Vua19jaHVuayhjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkJICAgICBjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkgICAgIGNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJCQkJICAgICB2b2lkICphcmcsCisJCQkJICAgICBzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKnVua19jaHVuayA9IGFyZzsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqZXJyX2NodW5rOworCXNjdHBfY2h1bmtoZHJfdCAqaGRyOworCisJU0NUUF9ERUJVR19QUklOVEsoIlByb2Nlc3NpbmcgdGhlIHVua25vd24gY2h1bmsgaWQgJWQuXG4iLCB0eXBlLmNodW5rKTsKKworCWlmICghc2N0cF92dGFnX3ZlcmlmeSh1bmtfY2h1bmssIGFzb2MpKQorCQlyZXR1cm4gc2N0cF9zZl9wZGlzY2FyZChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgY2h1bmsgaGFzIGEgdmFsaWQgbGVuZ3RoLgorCSAqIFNpbmNlIHdlIGRvbid0IGtub3cgdGhlIGNodW5rIHR5cGUsIHdlIHVzZSBhIGdlbmVyYWwKKwkgKiBjaHVua2hkciBzdHJ1Y3R1cmUgdG8gbWFrZSBhIGNvbXBhcmlzb24uCisJICovCisJaWYgKCFzY3RwX2NodW5rX2xlbmd0aF92YWxpZCh1bmtfY2h1bmssIHNpemVvZihzY3RwX2NodW5raGRyX3QpKSkKKwkJcmV0dXJuIHNjdHBfc2ZfdmlvbGF0aW9uX2NodW5rbGVuKGVwLCBhc29jLCB0eXBlLCBhcmcsCisJCQkJCQkgIGNvbW1hbmRzKTsKKworCXN3aXRjaCAodHlwZS5jaHVuayAmIFNDVFBfQ0lEX0FDVElPTl9NQVNLKSB7CisJY2FzZSBTQ1RQX0NJRF9BQ1RJT05fRElTQ0FSRDoKKwkJLyogRGlzY2FyZCB0aGUgcGFja2V0LiAgKi8KKwkJcmV0dXJuIHNjdHBfc2ZfcGRpc2NhcmQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworCQlicmVhazsKKwljYXNlIFNDVFBfQ0lEX0FDVElPTl9ESVNDQVJEX0VSUjoKKwkJLyogRGlzY2FyZCB0aGUgcGFja2V0LiAgKi8KKwkJc2N0cF9zZl9wZGlzY2FyZChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7CisKKwkJLyogR2VuZXJhdGUgYW4gRVJST1IgY2h1bmsgYXMgcmVzcG9uc2UuICovCisJCWhkciA9IHVua19jaHVuay0+Y2h1bmtfaGRyOworCQllcnJfY2h1bmsgPSBzY3RwX21ha2Vfb3BfZXJyb3IoYXNvYywgdW5rX2NodW5rLAorCQkJCQkgICAgICAgU0NUUF9FUlJPUl9VTktOT1dOX0NIVU5LLCBoZHIsCisJCQkJCSAgICAgICBXT1JEX1JPVU5EKG50b2hzKGhkci0+bGVuZ3RoKSkpOworCQlpZiAoZXJyX2NodW5rKSB7CisJCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1JFUExZLAorCQkJCQlTQ1RQX0NIVU5LKGVycl9jaHVuaykpOworCQl9CisJCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0NPTlNVTUU7CisJCWJyZWFrOworCWNhc2UgU0NUUF9DSURfQUNUSU9OX1NLSVA6CisJCS8qIFNraXAgdGhlIGNodW5rLiAgKi8KKwkJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fRElTQ0FSRDsKKwkJYnJlYWs7CisJY2FzZSBTQ1RQX0NJRF9BQ1RJT05fU0tJUF9FUlI6CisJCS8qIEdlbmVyYXRlIGFuIEVSUk9SIGNodW5rIGFzIHJlc3BvbnNlLiAqLworCQloZHIgPSB1bmtfY2h1bmstPmNodW5rX2hkcjsKKwkJZXJyX2NodW5rID0gc2N0cF9tYWtlX29wX2Vycm9yKGFzb2MsIHVua19jaHVuaywKKwkJCQkJICAgICAgIFNDVFBfRVJST1JfVU5LTk9XTl9DSFVOSywgaGRyLAorCQkJCQkgICAgICAgV09SRF9ST1VORChudG9ocyhoZHItPmxlbmd0aCkpKTsKKwkJaWYgKGVycl9jaHVuaykgeworCQkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9SRVBMWSwKKwkJCQkJU0NUUF9DSFVOSyhlcnJfY2h1bmspKTsKKwkJfQorCQkvKiBTa2lwIHRoZSBjaHVuay4gICovCisJCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0NPTlNVTUU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0RJU0NBUkQ7Cit9CisKKy8qCisgKiBEaXNjYXJkIHRoZSBjaHVuay4KKyAqCisgKiBTZWN0aW9uOiAwLjIsIDUuMi4zLCA1LjIuNSwgNS4yLjYsIDYuMCwgOC40LjYsIDguNS4xYywgOS4yCisgKiBbVG9vIG51bWVyb3VzIHRvIG1lbnRpb24uLi5dCisgKiBWZXJpZmljYXRpb24gVGFnOiBObyB2ZXJpZmljYXRpb24gbmVlZGVkLgorICogSW5wdXRzCisgKiAoZW5kcG9pbnQsIGFzb2MsIGNodW5rKQorICoKKyAqIE91dHB1dHMKKyAqIChhc29jLCByZXBseV9tc2csIG1zZ191cCwgdGltZXJzLCBjb3VudGVycykKKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBkaXNwb3NpdGlvbiBvZiB0aGUgY2h1bmsuCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2Rpc2NhcmRfY2h1bmsoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCQkgY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJCSBjb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAorCQkJCQkgdm9pZCAqYXJnLAorCQkJCQkgc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCVNDVFBfREVCVUdfUFJJTlRLKCJDaHVuayAlZCBpcyBkaXNjYXJkZWRcbiIsIHR5cGUuY2h1bmspOworCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0RJU0NBUkQ7Cit9CisKKy8qCisgKiBEaXNjYXJkIHRoZSB3aG9sZSBwYWNrZXQuCisgKgorICogU2VjdGlvbjogOC40IDIpCisgKgorICogMikgSWYgdGhlIE9PVEIgcGFja2V0IGNvbnRhaW5zIGFuIEFCT1JUIGNodW5rLCB0aGUgcmVjZWl2ZXIgTVVTVAorICogICAgc2lsZW50bHkgZGlzY2FyZCB0aGUgT09UQiBwYWNrZXQgYW5kIHRha2Ugbm8gZnVydGhlciBhY3Rpb24uCisgKiAgICBPdGhlcndpc2UsCisgKgorICogVmVyaWZpY2F0aW9uIFRhZzogTm8gdmVyaWZpY2F0aW9uIG5lY2Vzc2FyeQorICoKKyAqIElucHV0cworICogKGVuZHBvaW50LCBhc29jLCBjaHVuaykKKyAqCisgKiBPdXRwdXRzCisgKiAoYXNvYywgcmVwbHlfbXNnLCBtc2dfdXAsIHRpbWVycywgY291bnRlcnMpCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgZGlzcG9zaXRpb24gb2YgdGhlIGNodW5rLgorICovCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl9wZGlzY2FyZChjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSAgICBjb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAorCQkJCSAgICB2b2lkICphcmcsCisJCQkJICAgIHNjdHBfY21kX3NlcV90ICpjb21tYW5kcykKK3sKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0RJU0NBUkRfUEFDS0VULCBTQ1RQX05VTEwoKSk7CisKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9DT05TVU1FOworfQorCisKKy8qCisgKiBUaGUgb3RoZXIgZW5kIGlzIHZpb2xhdGluZyBwcm90b2NvbC4KKyAqCisgKiBTZWN0aW9uOiBOb3Qgc3BlY2lmaWVkCisgKiBWZXJpZmljYXRpb24gVGFnOiBOb3Qgc3BlY2lmaWVkCisgKiBJbnB1dHMKKyAqIChlbmRwb2ludCwgYXNvYywgY2h1bmspCisgKgorICogT3V0cHV0cworICogKGFzb2MsIHJlcGx5X21zZywgbXNnX3VwLCB0aW1lcnMsIGNvdW50ZXJzKQorICoKKyAqIFdlIHNpbXBseSB0YWcgdGhlIGNodW5rIGFzIGEgdmlvbGF0aW9uLiAgVGhlIHN0YXRlIG1hY2hpbmUgd2lsbCBsb2cKKyAqIHRoZSB2aW9sYXRpb24gYW5kIGNvbnRpbnVlLgorICovCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl92aW9sYXRpb24oY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJICAgICBjb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAorCQkJCSAgICAgdm9pZCAqYXJnLAorCQkJCSAgICAgc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX1ZJT0xBVElPTjsKK30KKworCisvKgorICogSGFuZGxlIGEgcHJvdG9jb2wgdmlvbGF0aW9uIHdoZW4gdGhlIGNodW5rIGxlbmd0aCBpcyBpbnZhbGlkLgorICogIkludmFsaWQiIGxlbmd0aCBpcyBpZGVudGlmaWVkIGFzIHNtYWxsZXIgdGhlbiB0aGUgbWluaW1hbCBsZW5ndGggYQorICogZ2l2ZW4gY2h1bmsgY2FuIGJlLiAgRm9yIGV4YW1wbGUsIGEgU0FDSyBjaHVuayBoYXMgaW52YWxpZCBsZW5ndGgKKyAqIGlmIGl0J3MgbGVuZ3RoIGlzIHNldCB0byBiZSBzbWFsbGVyIHRoZW4gdGhlIHNpemUgb2Ygc2N0cF9zYWNrX2NodW5rX3QuCisgKgorICogV2UgaW5mb3JtIHRoZSBvdGhlciBlbmQgYnkgc2VuZGluZyBhbiBBQk9SVCB3aXRoIGEgUHJvdG9jb2wgVmlvbGF0aW9uCisgKiBlcnJvciBjb2RlLiAKKyAqCisgKiBTZWN0aW9uOiBOb3Qgc3BlY2lmaWVkCisgKiBWZXJpZmljYXRpb24gVGFnOiAgTm90aGluZyB0byBkbworICogSW5wdXRzCisgKiAoZW5kcG9pbnQsIGFzb2MsIGNodW5rKQorICoKKyAqIE91dHB1dHMKKyAqIChyZXBseV9tc2csIG1zZ191cCwgY291bnRlcnMpCisgKgorICogR2VuZXJhdGUgYW4gIEFCT1JUIGNodW5rIGFuZCB0ZXJtaW5hdGUgdGhlIGFzc29jaWF0aW9uLgorICovCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl92aW9sYXRpb25fY2h1bmtsZW4oY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJICAgICBjb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAorCQkJCSAgICAgdm9pZCAqYXJnLAorCQkJCSAgICAgc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuayA9ICBhcmc7CisJc3RydWN0IHNjdHBfY2h1bmsgKmFib3J0ID0gTlVMTDsKKwljaGFyIAkJICAgZXJyX3N0cltdPSJUaGUgZm9sbG93aW5nIGNodW5rIGhhZCBpbnZhbGlkIGxlbmd0aDoiOworCisJLyogTWFrZSB0aGUgYWJvcnQgY2h1bmsuICovCisJYWJvcnQgPSBzY3RwX21ha2VfYWJvcnRfdmlvbGF0aW9uKGFzb2MsIGNodW5rLCBlcnJfc3RyLAorCQkJCQkgIHNpemVvZihlcnJfc3RyKSk7CisJaWYgKCFhYm9ydCkKKwkJZ290byBub21lbTsKKworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUkVQTFksIFNDVFBfQ0hVTksoYWJvcnQpKTsKKwlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9PVVRDVFJMQ0hVTktTKTsKKworCWlmIChhc29jLT5zdGF0ZSA8PSBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQpIHsKKwkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9USU1FUl9TVE9QLAorCQkJCVNDVFBfVE8oU0NUUF9FVkVOVF9USU1FT1VUX1QxX0lOSVQpKTsKKwkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9JTklUX0ZBSUxFRCwKKwkJCQlTQ1RQX1UzMihTQ1RQX0VSUk9SX1BST1RPX1ZJT0xBVElPTikpOworCX0gZWxzZSB7CisJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfQVNTT0NfRkFJTEVELAorCQkJCVNDVFBfVTMyKFNDVFBfRVJST1JfUFJPVE9fVklPTEFUSU9OKSk7CisJCVNDVFBfREVDX1NUQVRTKFNDVFBfTUlCX0NVUlJFU1RBQik7CisJfQorCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9ESVNDQVJEX1BBQ0tFVCwgU0NUUF9OVUxMKCkpOworCisJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfQUJPUlRFRFMpOworCQorCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0FCT1JUOworCitub21lbToKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9OT01FTTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhlc2UgYXJlIHRoZSBzdGF0ZSBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHByaW1pdGl2ZSAoU2VjdGlvbiAxMCkgZXZlbnRzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBzY3RwX3NmX2RvX3BybV9hc29jCisgKgorICogU2VjdGlvbjogMTAuMSBVTFAtdG8tU0NUUAorICogQikgQXNzb2NpYXRlCisgKgorICogRm9ybWF0OiBBU1NPQ0lBVEUobG9jYWwgU0NUUCBpbnN0YW5jZSBuYW1lLCBkZXN0aW5hdGlvbiB0cmFuc3BvcnQgYWRkciwKKyAqIG91dGJvdW5kIHN0cmVhbSBjb3VudCkKKyAqIC0+IGFzc29jaWF0aW9uIGlkIFssZGVzdGluYXRpb24gdHJhbnNwb3J0IGFkZHIgbGlzdF0gWyxvdXRib3VuZCBzdHJlYW0KKyAqIGNvdW50XQorICoKKyAqIFRoaXMgcHJpbWl0aXZlIGFsbG93cyB0aGUgdXBwZXIgbGF5ZXIgdG8gaW5pdGlhdGUgYW4gYXNzb2NpYXRpb24gdG8gYQorICogc3BlY2lmaWMgcGVlciBlbmRwb2ludC4KKyAqCisgKiBUaGUgcGVlciBlbmRwb2ludCBzaGFsbCBiZSBzcGVjaWZpZWQgYnkgb25lIG9mIHRoZSB0cmFuc3BvcnQgYWRkcmVzc2VzCisgKiB3aGljaCBkZWZpbmVzIHRoZSBlbmRwb2ludCAoc2VlIFNlY3Rpb24gMS40KS4gIElmIHRoZSBsb2NhbCBTQ1RQCisgKiBpbnN0YW5jZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQsIHRoZSBBU1NPQ0lBVEUgaXMgY29uc2lkZXJlZCBhbgorICogZXJyb3IuCisgKiBbVGhpcyBpcyBub3QgcmVsZXZhbnQgZm9yIHRoZSBrZXJuZWwgaW1wbGVtZW50YXRpb24gc2luY2Ugd2UgZG8gYWxsCisgKiBpbml0aWFsaXphdGlvbiBhdCBib290IHRpbWUuICBJdCB3ZSBoYWRuJ3QgaW5pdGlhbGl6ZWQgd2Ugd291bGRuJ3QKKyAqIGdldCBhbnl3aGVyZSBuZWFyIHRoaXMgY29kZS5dCisgKgorICogQW4gYXNzb2NpYXRpb24gaWQsIHdoaWNoIGlzIGEgbG9jYWwgaGFuZGxlIHRvIHRoZSBTQ1RQIGFzc29jaWF0aW9uLAorICogd2lsbCBiZSByZXR1cm5lZCBvbiBzdWNjZXNzZnVsIGVzdGFibGlzaG1lbnQgb2YgdGhlIGFzc29jaWF0aW9uLiBJZgorICogU0NUUCBpcyBub3QgYWJsZSB0byBvcGVuIGFuIFNDVFAgYXNzb2NpYXRpb24gd2l0aCB0aGUgcGVlciBlbmRwb2ludCwKKyAqIGFuIGVycm9yIGlzIHJldHVybmVkLgorICogW0luIHRoZSBrZXJuZWwgaW1wbGVtZW50YXRpb24sIHRoZSBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiBuZWVkcyB0bworICogYmUgY3JlYXRlZCBCRUZPUkUgY2F1c2luZyB0aGlzIHByaW1pdGl2ZSB0byBydW4uXQorICoKKyAqIE90aGVyIGFzc29jaWF0aW9uIHBhcmFtZXRlcnMgbWF5IGJlIHJldHVybmVkLCBpbmNsdWRpbmcgdGhlCisgKiBjb21wbGV0ZSBkZXN0aW5hdGlvbiB0cmFuc3BvcnQgYWRkcmVzc2VzIG9mIHRoZSBwZWVyIGFzIHdlbGwgYXMgdGhlCisgKiBvdXRib3VuZCBzdHJlYW0gY291bnQgb2YgdGhlIGxvY2FsIGVuZHBvaW50LiBPbmUgb2YgdGhlIHRyYW5zcG9ydAorICogYWRkcmVzcyBmcm9tIHRoZSByZXR1cm5lZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgd2lsbCBiZSBzZWxlY3RlZCBieQorICogdGhlIGxvY2FsIGVuZHBvaW50IGFzIGRlZmF1bHQgcHJpbWFyeSBwYXRoIGZvciBzZW5kaW5nIFNDVFAgcGFja2V0cworICogdG8gdGhpcyBwZWVyLiAgVGhlIHJldHVybmVkICJkZXN0aW5hdGlvbiB0cmFuc3BvcnQgYWRkciBsaXN0IiBjYW4KKyAqIGJlIHVzZWQgYnkgdGhlIFVMUCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgcHJpbWFyeSBwYXRoIG9yIHRvIGZvcmNlCisgKiBzZW5kaW5nIGEgcGFja2V0IHRvIGEgc3BlY2lmaWMgdHJhbnNwb3J0IGFkZHJlc3MuICBbQWxsIG9mIHRoaXMKKyAqIHN0dWZmIGhhcHBlbnMgd2hlbiB0aGUgSU5JVCBBQ0sgYXJyaXZlcy4gIFRoaXMgaXMgYSBOT04tQkxPQ0tJTkcKKyAqIGZ1bmN0aW9uLl0KKyAqCisgKiBNYW5kYXRvcnkgYXR0cmlidXRlczoKKyAqCisgKiBvIGxvY2FsIFNDVFAgaW5zdGFuY2UgbmFtZSAtIG9idGFpbmVkIGZyb20gdGhlIElOSVRJQUxJWkUgb3BlcmF0aW9uLgorICogICBbVGhpcyBpcyB0aGUgYXJndW1lbnQgYXNvYy5dCisgKiBvIGRlc3RpbmF0aW9uIHRyYW5zcG9ydCBhZGRyIC0gc3BlY2lmaWVkIGFzIG9uZSBvZiB0aGUgdHJhbnNwb3J0CisgKiBhZGRyZXNzZXMgb2YgdGhlIHBlZXIgZW5kcG9pbnQgd2l0aCB3aGljaCB0aGUgYXNzb2NpYXRpb24gaXMgdG8gYmUKKyAqIGVzdGFibGlzaGVkLgorICogIFtUaGlzIGlzIGFzb2MtPnBlZXIuYWN0aXZlX3BhdGguXQorICogbyBvdXRib3VuZCBzdHJlYW0gY291bnQgLSB0aGUgbnVtYmVyIG9mIG91dGJvdW5kIHN0cmVhbXMgdGhlIFVMUAorICogd291bGQgbGlrZSB0byBvcGVuIHRvd2FyZHMgdGhpcyBwZWVyIGVuZHBvaW50LgorICogW0JVRzogVGhpcyBpcyBub3QgY3VycmVudGx5IGltcGxlbWVudGVkLl0KKyAqIE9wdGlvbmFsIGF0dHJpYnV0ZXM6CisgKgorICogTm9uZS4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgZGlzcG9zaXRpb24uCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2RvX3BybV9hc29jKGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJICAgICAgIGNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJCQkJICAgICAgIHZvaWQgKmFyZywKKwkJCQkgICAgICAgc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCXN0cnVjdCBzY3RwX2NodW5rICpyZXBsOworCisJLyogVGhlIGNvbW1lbnQgYmVsb3cgc2F5cyB0aGF0IHdlIGVudGVyIENPT0tJRS1XQUlUIEFGVEVSCisJICogc2VuZGluZyB0aGUgSU5JVCwgYnV0IHRoYXQgZG9lc24ndCBhY3R1YWxseSB3b3JrIGluIG91cgorCSAqIGltcGxlbWVudGF0aW9uLi4uCisJICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9ORVdfU1RBVEUsCisJCQlTQ1RQX1NUQVRFKFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQpKTsKKworCS8qIFJGQyAyOTYwIDUuMSBOb3JtYWwgRXN0YWJsaXNobWVudCBvZiBhbiBBc3NvY2lhdGlvbgorCSAqCisJICogQSkgIkEiIGZpcnN0IHNlbmRzIGFuIElOSVQgY2h1bmsgdG8gIloiLiAgSW4gdGhlIElOSVQsICJBIgorCSAqIG11c3QgcHJvdmlkZSBpdHMgVmVyaWZpY2F0aW9uIFRhZyAoVGFnX0EpIGluIHRoZSBJbml0aWF0ZQorCSAqIFRhZyBmaWVsZC4gIFRhZ19BIFNIT1VMRCBiZSBhIHJhbmRvbSBudW1iZXIgaW4gdGhlIHJhbmdlIG9mCisJICogMSB0byA0Mjk0OTY3Mjk1IChzZWUgNS4zLjEgZm9yIFRhZyB2YWx1ZSBzZWxlY3Rpb24pLiAuLi4KKwkgKi8KKworCXJlcGwgPSBzY3RwX21ha2VfaW5pdChhc29jLCAmYXNvYy0+YmFzZS5iaW5kX2FkZHIsIEdGUF9BVE9NSUMsIDApOworCWlmICghcmVwbCkKKwkJZ290byBub21lbTsKKworCS8qIENhc3QgYXdheSB0aGUgY29uc3QgbW9kaWZpZXIsIGFzIHdlIHdhbnQgdG8ganVzdAorCSAqIHJlcnVuIGl0IHRocm91Z2ggYXMgYSBzaWRlZmZlY3QuCisJICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9ORVdfQVNPQywKKwkJCVNDVFBfQVNPQygoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKikgYXNvYykpOworCisJLyogQWZ0ZXIgc2VuZGluZyB0aGUgSU5JVCwgIkEiIHN0YXJ0cyB0aGUgVDEtaW5pdCB0aW1lciBhbmQKKwkgKiBlbnRlcnMgdGhlIENPT0tJRS1XQUlUIHN0YXRlLgorCSAqLworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVElNRVJfU1RBUlQsCisJCQlTQ1RQX1RPKFNDVFBfRVZFTlRfVElNRU9VVF9UMV9JTklUKSk7CisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9SRVBMWSwgU0NUUF9DSFVOSyhyZXBsKSk7CisJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fQ09OU1VNRTsKKworbm9tZW06CisJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fTk9NRU07Cit9CisKKy8qCisgKiBQcm9jZXNzIHRoZSBTRU5EIHByaW1pdGl2ZS4KKyAqCisgKiBTZWN0aW9uOiAxMC4xIFVMUC10by1TQ1RQCisgKiBFKSBTZW5kCisgKgorICogRm9ybWF0OiBTRU5EKGFzc29jaWF0aW9uIGlkLCBidWZmZXIgYWRkcmVzcywgYnl0ZSBjb3VudCBbLGNvbnRleHRdCisgKiAgICAgICAgIFssc3RyZWFtIGlkXSBbLGxpZmUgdGltZV0gWyxkZXN0aW5hdGlvbiB0cmFuc3BvcnQgYWRkcmVzc10KKyAqICAgICAgICAgWyx1bm9yZGVyIGZsYWddIFssbm8tYnVuZGxlIGZsYWddIFsscGF5bG9hZCBwcm90b2NvbC1pZF0gKQorICogLT4gcmVzdWx0CisgKgorICogVGhpcyBpcyB0aGUgbWFpbiBtZXRob2QgdG8gc2VuZCB1c2VyIGRhdGEgdmlhIFNDVFAuCisgKgorICogTWFuZGF0b3J5IGF0dHJpYnV0ZXM6CisgKgorICogIG8gYXNzb2NpYXRpb24gaWQgLSBsb2NhbCBoYW5kbGUgdG8gdGhlIFNDVFAgYXNzb2NpYXRpb24KKyAqCisgKiAgbyBidWZmZXIgYWRkcmVzcyAtIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgdXNlciBtZXNzYWdlIHRvIGJlCisgKiAgICB0cmFuc21pdHRlZCBpcyBzdG9yZWQ7CisgKgorICogIG8gYnl0ZSBjb3VudCAtIFRoZSBzaXplIG9mIHRoZSB1c2VyIGRhdGEgaW4gbnVtYmVyIG9mIGJ5dGVzOworICoKKyAqIE9wdGlvbmFsIGF0dHJpYnV0ZXM6CisgKgorICogIG8gY29udGV4dCAtIGFuIG9wdGlvbmFsIDMyIGJpdCBpbnRlZ2VyIHRoYXQgd2lsbCBiZSBjYXJyaWVkIGluIHRoZQorICogICAgc2VuZGluZyBmYWlsdXJlIG5vdGlmaWNhdGlvbiB0byB0aGUgVUxQIGlmIHRoZSB0cmFuc3BvcnRhdGlvbiBvZgorICogICAgdGhpcyBVc2VyIE1lc3NhZ2UgZmFpbHMuCisgKgorICogIG8gc3RyZWFtIGlkIC0gdG8gaW5kaWNhdGUgd2hpY2ggc3RyZWFtIHRvIHNlbmQgdGhlIGRhdGEgb24uIElmIG5vdAorICogICAgc3BlY2lmaWVkLCBzdHJlYW0gMCB3aWxsIGJlIHVzZWQuCisgKgorICogIG8gbGlmZSB0aW1lIC0gc3BlY2lmaWVzIHRoZSBsaWZlIHRpbWUgb2YgdGhlIHVzZXIgZGF0YS4gVGhlIHVzZXIgZGF0YQorICogICAgd2lsbCBub3QgYmUgc2VudCBieSBTQ1RQIGFmdGVyIHRoZSBsaWZlIHRpbWUgZXhwaXJlcy4gVGhpcworICogICAgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIGF2b2lkIGVmZm9ydHMgdG8gdHJhbnNtaXQgc3RhbGUKKyAqICAgIHVzZXIgbWVzc2FnZXMuIFNDVFAgbm90aWZpZXMgdGhlIFVMUCBpZiB0aGUgZGF0YSBjYW5ub3QgYmUKKyAqICAgIGluaXRpYXRlZCB0byB0cmFuc3BvcnQgKGkuZS4gc2VudCB0byB0aGUgZGVzdGluYXRpb24gdmlhIFNDVFAncworICogICAgc2VuZCBwcmltaXRpdmUpIHdpdGhpbiB0aGUgbGlmZSB0aW1lIHZhcmlhYmxlLiBIb3dldmVyLCB0aGUKKyAqICAgIHVzZXIgZGF0YSB3aWxsIGJlIHRyYW5zbWl0dGVkIGlmIFNDVFAgaGFzIGF0dGVtcHRlZCB0byB0cmFuc21pdCBhCisgKiAgICBjaHVuayBiZWZvcmUgdGhlIGxpZmUgdGltZSBleHBpcmVkLgorICoKKyAqICBvIGRlc3RpbmF0aW9uIHRyYW5zcG9ydCBhZGRyZXNzIC0gc3BlY2lmaWVkIGFzIG9uZSBvZiB0aGUgZGVzdGluYXRpb24KKyAqICAgIHRyYW5zcG9ydCBhZGRyZXNzZXMgb2YgdGhlIHBlZXIgZW5kcG9pbnQgdG8gd2hpY2ggdGhpcyBwYWNrZXQKKyAqICAgIHNob3VsZCBiZSBzZW50LiBXaGVuZXZlciBwb3NzaWJsZSwgU0NUUCBzaG91bGQgdXNlIHRoaXMgZGVzdGluYXRpb24KKyAqICAgIHRyYW5zcG9ydCBhZGRyZXNzIGZvciBzZW5kaW5nIHRoZSBwYWNrZXRzLCBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50CisgKiAgICBwcmltYXJ5IHBhdGguCisgKgorICogIG8gdW5vcmRlciBmbGFnIC0gdGhpcyBmbGFnLCBpZiBwcmVzZW50LCBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlcgorICogICAgd291bGQgbGlrZSB0aGUgZGF0YSBkZWxpdmVyZWQgaW4gYW4gdW5vcmRlcmVkIGZhc2hpb24gdG8gdGhlIHBlZXIKKyAqICAgIChpLmUuLCB0aGUgVSBmbGFnIGlzIHNldCB0byAxIG9uIGFsbCBEQVRBIGNodW5rcyBjYXJyeWluZyB0aGlzCisgKiAgICBtZXNzYWdlKS4KKyAqCisgKiAgbyBuby1idW5kbGUgZmxhZyAtIGluc3RydWN0cyBTQ1RQIG5vdCB0byBidW5kbGUgdGhpcyB1c2VyIGRhdGEgd2l0aAorICogICAgb3RoZXIgb3V0Ym91bmQgREFUQSBjaHVua3MuIFNDVFAgTUFZIHN0aWxsIGJ1bmRsZSBldmVuIHdoZW4KKyAqICAgIHRoaXMgZmxhZyBpcyBwcmVzZW50LCB3aGVuIGZhY2VkIHdpdGggbmV0d29yayBjb25nZXN0aW9uLgorICoKKyAqICBvIHBheWxvYWQgcHJvdG9jb2wtaWQgLSBBIDMyIGJpdCB1bnNpZ25lZCBpbnRlZ2VyIHRoYXQgaXMgdG8gYmUKKyAqICAgIHBhc3NlZCB0byB0aGUgcGVlciBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIHBheWxvYWQgcHJvdG9jb2wgZGF0YQorICogICAgYmVpbmcgdHJhbnNtaXR0ZWQuIFRoaXMgdmFsdWUgaXMgcGFzc2VkIGFzIG9wYXF1ZSBkYXRhIGJ5IFNDVFAuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgZGlzcG9zaXRpb24uCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2RvX3BybV9zZW5kKGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJICAgICAgIGNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJCQkJICAgICAgIHZvaWQgKmFyZywKKwkJCQkgICAgICAgc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuayA9IGFyZzsKKworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUkVQTFksIFNDVFBfQ0hVTksoY2h1bmspKTsKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9DT05TVU1FOworfQorCisvKgorICogUHJvY2VzcyB0aGUgU0hVVERPV04gcHJpbWl0aXZlLgorICoKKyAqIFNlY3Rpb246IDEwLjE6CisgKiBDKSBTaHV0ZG93bgorICoKKyAqIEZvcm1hdDogU0hVVERPV04oYXNzb2NpYXRpb24gaWQpCisgKiAtPiByZXN1bHQKKyAqCisgKiBHcmFjZWZ1bGx5IGNsb3NlcyBhbiBhc3NvY2lhdGlvbi4gQW55IGxvY2FsbHkgcXVldWVkIHVzZXIgZGF0YQorICogd2lsbCBiZSBkZWxpdmVyZWQgdG8gdGhlIHBlZXIuIFRoZSBhc3NvY2lhdGlvbiB3aWxsIGJlIHRlcm1pbmF0ZWQgb25seQorICogYWZ0ZXIgdGhlIHBlZXIgYWNrbm93bGVkZ2VzIGFsbCB0aGUgU0NUUCBwYWNrZXRzIHNlbnQuICBBIHN1Y2Nlc3MgY29kZQorICogd2lsbCBiZSByZXR1cm5lZCBvbiBzdWNjZXNzZnVsIHRlcm1pbmF0aW9uIG9mIHRoZSBhc3NvY2lhdGlvbi4gSWYKKyAqIGF0dGVtcHRpbmcgdG8gdGVybWluYXRlIHRoZSBhc3NvY2lhdGlvbiByZXN1bHRzIGluIGEgZmFpbHVyZSwgYW4gZXJyb3IKKyAqIGNvZGUgc2hhbGwgYmUgcmV0dXJuZWQuCisgKgorICogTWFuZGF0b3J5IGF0dHJpYnV0ZXM6CisgKgorICogIG8gYXNzb2NpYXRpb24gaWQgLSBsb2NhbCBoYW5kbGUgdG8gdGhlIFNDVFAgYXNzb2NpYXRpb24KKyAqCisgKiBPcHRpb25hbCBhdHRyaWJ1dGVzOgorICoKKyAqIE5vbmUuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgZGlzcG9zaXRpb24uCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2RvXzlfMl9wcm1fc2h1dGRvd24oCisJY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCWNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJdm9pZCAqYXJnLAorCXNjdHBfY21kX3NlcV90ICpjb21tYW5kcykKK3sKKwlpbnQgZGlzcG9zaXRpb247CisKKwkvKiBGcm9tIDkuMiBTaHV0ZG93biBvZiBhbiBBc3NvY2lhdGlvbgorCSAqIFVwb24gcmVjZWlwdCBvZiB0aGUgU0hVVERPV04gcHJpbWl0aXZlIGZyb20gaXRzIHVwcGVyCisJICogbGF5ZXIsIHRoZSBlbmRwb2ludCBlbnRlcnMgU0hVVERPV04tUEVORElORyBzdGF0ZSBhbmQKKwkgKiByZW1haW5zIHRoZXJlIHVudGlsIGFsbCBvdXRzdGFuZGluZyBkYXRhIGhhcyBiZWVuCisJICogYWNrbm93bGVkZ2VkIGJ5IGl0cyBwZWVyLiBUaGUgZW5kcG9pbnQgYWNjZXB0cyBubyBuZXcgZGF0YQorCSAqIGZyb20gaXRzIHVwcGVyIGxheWVyLCBidXQgcmV0cmFuc21pdHMgZGF0YSB0byB0aGUgZmFyIGVuZAorCSAqIGlmIG5lY2Vzc2FyeSB0byBmaWxsIGdhcHMuCisJICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9ORVdfU1RBVEUsCisJCQlTQ1RQX1NUQVRFKFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORykpOworCisJLyogc2N0cGltcGd1aWRlLTA1IFNlY3Rpb24gMi4xMi4yCisJICogVGhlIHNlbmRlciBvZiB0aGUgU0hVVERPV04gTUFZIGFsc28gc3RhcnQgYW4gb3ZlcmFsbCBndWFyZCB0aW1lcgorCSAqICdUNS1zaHV0ZG93bi1ndWFyZCcgdG8gYm91bmQgdGhlIG92ZXJhbGwgdGltZSBmb3Igc2h1dGRvd24gc2VxdWVuY2UuCisJICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9USU1FUl9TVEFSVCwKKwkJCVNDVFBfVE8oU0NUUF9FVkVOVF9USU1FT1VUX1Q1X1NIVVRET1dOX0dVQVJEKSk7CisKKwlkaXNwb3NpdGlvbiA9IFNDVFBfRElTUE9TSVRJT05fQ09OU1VNRTsKKwlpZiAoc2N0cF9vdXRxX2lzX2VtcHR5KCZhc29jLT5vdXRxdWV1ZSkpIHsKKwkJZGlzcG9zaXRpb24gPSBzY3RwX3NmX2RvXzlfMl9zdGFydF9zaHV0ZG93bihlcCwgYXNvYywgdHlwZSwKKwkJCQkJCQkgICAgYXJnLCBjb21tYW5kcyk7CisJfQorCXJldHVybiBkaXNwb3NpdGlvbjsKK30KKworLyoKKyAqIFByb2Nlc3MgdGhlIEFCT1JUIHByaW1pdGl2ZS4KKyAqCisgKiBTZWN0aW9uOiAxMC4xOgorICogQykgQWJvcnQKKyAqCisgKiBGb3JtYXQ6IEFib3J0KGFzc29jaWF0aW9uIGlkIFssIGNhdXNlIGNvZGVdKQorICogLT4gcmVzdWx0CisgKgorICogVW5ncmFjZWZ1bGx5IGNsb3NlcyBhbiBhc3NvY2lhdGlvbi4gQW55IGxvY2FsbHkgcXVldWVkIHVzZXIgZGF0YQorICogd2lsbCBiZSBkaXNjYXJkZWQgYW5kIGFuIEFCT1JUIGNodW5rIGlzIHNlbnQgdG8gdGhlIHBlZXIuICBBIHN1Y2Nlc3MgY29kZQorICogd2lsbCBiZSByZXR1cm5lZCBvbiBzdWNjZXNzZnVsIGFib3J0aW9uIG9mIHRoZSBhc3NvY2lhdGlvbi4gSWYKKyAqIGF0dGVtcHRpbmcgdG8gYWJvcnQgdGhlIGFzc29jaWF0aW9uIHJlc3VsdHMgaW4gYSBmYWlsdXJlLCBhbiBlcnJvcgorICogY29kZSBzaGFsbCBiZSByZXR1cm5lZC4KKyAqCisgKiBNYW5kYXRvcnkgYXR0cmlidXRlczoKKyAqCisgKiAgbyBhc3NvY2lhdGlvbiBpZCAtIGxvY2FsIGhhbmRsZSB0byB0aGUgU0NUUCBhc3NvY2lhdGlvbgorICoKKyAqIE9wdGlvbmFsIGF0dHJpYnV0ZXM6CisgKgorICogIG8gY2F1c2UgY29kZSAtIHJlYXNvbiBvZiB0aGUgYWJvcnQgdG8gYmUgcGFzc2VkIHRvIHRoZSBwZWVyCisgKgorICogTm9uZS4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBkaXNwb3NpdGlvbi4KKyAqLworc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc2ZfZG9fOV8xX3BybV9hYm9ydCgKKwljb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJY29uc3Qgc2N0cF9zdWJ0eXBlX3QgdHlwZSwKKwl2b2lkICphcmcsCisJc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCS8qIEZyb20gOS4xIEFib3J0IG9mIGFuIEFzc29jaWF0aW9uCisJICogVXBvbiByZWNlaXB0IG9mIHRoZSBBQk9SVCBwcmltaXRpdmUgZnJvbSBpdHMgdXBwZXIKKwkgKiBsYXllciwgdGhlIGVuZHBvaW50IGVudGVycyBDTE9TRUQgc3RhdGUgYW5kCisJICogZGlzY2FyZCBhbGwgb3V0c3RhbmRpbmcgZGF0YSBoYXMgYmVlbgorCSAqIGFja25vd2xlZGdlZCBieSBpdHMgcGVlci4gVGhlIGVuZHBvaW50IGFjY2VwdHMgbm8gbmV3IGRhdGEKKwkgKiBmcm9tIGl0cyB1cHBlciBsYXllciwgYnV0IHJldHJhbnNtaXRzIGRhdGEgdG8gdGhlIGZhciBlbmQKKwkgKiBpZiBuZWNlc3NhcnkgdG8gZmlsbCBnYXBzLgorCSAqLworCXN0cnVjdCBtc2doZHIgKm1zZyA9IGFyZzsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqYWJvcnQ7CisJc2N0cF9kaXNwb3NpdGlvbl90IHJldHZhbDsKKworCXJldHZhbCA9IFNDVFBfRElTUE9TSVRJT05fQ09OU1VNRTsKKworCS8qIEdlbmVyYXRlIEFCT1JUIGNodW5rIHRvIHNlbmQgdGhlIHBlZXIuICAqLworCWFib3J0ID0gc2N0cF9tYWtlX2Fib3J0X3VzZXIoYXNvYywgTlVMTCwgbXNnKTsKKwlpZiAoIWFib3J0KQorCQlyZXR2YWwgPSBTQ1RQX0RJU1BPU0lUSU9OX05PTUVNOworCWVsc2UKKwkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9SRVBMWSwgU0NUUF9DSFVOSyhhYm9ydCkpOworCisJLyogRXZlbiBpZiB3ZSBjYW4ndCBzZW5kIHRoZSBBQk9SVCBkdWUgdG8gbG93IG1lbW9yeSBkZWxldGUgdGhlCisJICogVENCLiAgVGhpcyBpcyBhIGRlcGFydHVyZSBmcm9tIG91ciB0eXBpY2FsIE5PTUVNIGhhbmRsaW5nLgorCSAqLworCisJLyogRGVsZXRlIHRoZSBlc3RhYmxpc2hlZCBhc3NvY2lhdGlvbi4gKi8KKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0FTU09DX0ZBSUxFRCwKKwkJCVNDVFBfVTMyKFNDVFBfRVJST1JfVVNFUl9BQk9SVCkpOworCisJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfQUJPUlRFRFMpOworCVNDVFBfREVDX1NUQVRTKFNDVFBfTUlCX0NVUlJFU1RBQik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBXZSB0cmllZCBhbiBpbGxlZ2FsIG9wZXJhdGlvbiBvbiBhbiBhc3NvY2lhdGlvbiB3aGljaCBpcyBjbG9zZWQuICAqLworc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc2ZfZXJyb3JfY2xvc2VkKGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwkJCQkJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJCWNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJCQkJCXZvaWQgKmFyZywKKwkJCQkJc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUkVQT1JUX0VSUk9SLCBTQ1RQX0VSUk9SKC1FSU5WQUwpKTsKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9DT05TVU1FOworfQorCisvKiBXZSB0cmllZCBhbiBpbGxlZ2FsIG9wZXJhdGlvbiBvbiBhbiBhc3NvY2lhdGlvbiB3aGljaCBpcyBzaHV0dGluZworICogZG93bi4KKyAqLworc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc2ZfZXJyb3Jfc2h1dGRvd24oY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCQkgIGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCQkgIGNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJCQkJCSAgdm9pZCAqYXJnLAorCQkJCQkgIHNjdHBfY21kX3NlcV90ICpjb21tYW5kcykKK3sKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1JFUE9SVF9FUlJPUiwKKwkJCVNDVFBfRVJST1IoLUVTSFVURE9XTikpOworCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0NPTlNVTUU7Cit9CisKKy8qCisgKiBzY3RwX2Nvb2tpZV93YWl0X3BybV9zaHV0ZG93bgorICoKKyAqIFNlY3Rpb246IDQgTm90ZTogMgorICogVmVyaWZpY2F0aW9uIFRhZzoKKyAqIElucHV0cworICogKGVuZHBvaW50LCBhc29jKQorICoKKyAqIFRoZSBSRkMgZG9lcyBub3QgZXhwbGljaXRseSBhZGRyZXNzIHRoaXMgaXNzdWUsIGJ1dCBpcyB0aGUgcm91dGUgdGhyb3VnaCB0aGUKKyAqIHN0YXRlIHRhYmxlIHdoZW4gc29tZW9uZSBpc3N1ZXMgYSBzaHV0ZG93biB3aGlsZSBpbiBDT09LSUVfV0FJVCBzdGF0ZS4KKyAqCisgKiBPdXRwdXRzCisgKiAodGltZXJzKQorICovCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl9jb29raWVfd2FpdF9wcm1fc2h1dGRvd24oCisJY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCWNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJdm9pZCAqYXJnLAorCXNjdHBfY21kX3NlcV90ICpjb21tYW5kcykKK3sKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RJTUVSX1NUT1AsCisJCQlTQ1RQX1RPKFNDVFBfRVZFTlRfVElNRU9VVF9UMV9JTklUKSk7CisKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX05FV19TVEFURSwKKwkJCVNDVFBfU1RBVEUoU0NUUF9TVEFURV9DTE9TRUQpKTsKKworCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX1NIVVRET1dOUyk7CisKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0RFTEVURV9UQ0IsIFNDVFBfTlVMTCgpKTsKKworCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0RFTEVURV9UQ0I7Cit9CisKKy8qCisgKiBzY3RwX2Nvb2tpZV9lY2hvZWRfcHJtX3NodXRkb3duCisgKgorICogU2VjdGlvbjogNCBOb3RlOiAyCisgKiBWZXJpZmljYXRpb24gVGFnOgorICogSW5wdXRzCisgKiAoZW5kcG9pbnQsIGFzb2MpCisgKgorICogVGhlIFJGQyBkb2VzIG5vdCBleHBsY2l0bHkgYWRkcmVzcyB0aGlzIGlzc3VlLCBidXQgaXMgdGhlIHJvdXRlIHRocm91Z2ggdGhlCisgKiBzdGF0ZSB0YWJsZSB3aGVuIHNvbWVvbmUgaXNzdWVzIGEgc2h1dGRvd24gd2hpbGUgaW4gQ09PS0lFX0VDSE9FRCBzdGF0ZS4KKyAqCisgKiBPdXRwdXRzCisgKiAodGltZXJzKQorICovCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl9jb29raWVfZWNob2VkX3BybV9zaHV0ZG93bigKKwljb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJY29uc3Qgc2N0cF9zdWJ0eXBlX3QgdHlwZSwKKwl2b2lkICphcmcsIHNjdHBfY21kX3NlcV90ICpjb21tYW5kcykKK3sKKwkvKiBUaGVyZSBpcyBhIHNpbmdsZSBUMSB0aW1lciwgc28gd2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlCisJICogY29tbW9uIGZ1bmN0aW9uIHdpdGggdGhlIENPT0tJRS1XQUlUIHN0YXRlLgorCSAqLworCXJldHVybiBzY3RwX3NmX2Nvb2tpZV93YWl0X3BybV9zaHV0ZG93bihlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7Cit9CisKKy8qCisgKiBzY3RwX3NmX2Nvb2tpZV93YWl0X3BybV9hYm9ydAorICoKKyAqIFNlY3Rpb246IDQgTm90ZTogMgorICogVmVyaWZpY2F0aW9uIFRhZzoKKyAqIElucHV0cworICogKGVuZHBvaW50LCBhc29jKQorICoKKyAqIFRoZSBSRkMgZG9lcyBub3QgZXhwbGljaXRseSBhZGRyZXNzIHRoaXMgaXNzdWUsIGJ1dCBpcyB0aGUgcm91dGUgdGhyb3VnaCB0aGUKKyAqIHN0YXRlIHRhYmxlIHdoZW4gc29tZW9uZSBpc3N1ZXMgYW4gYWJvcnQgd2hpbGUgaW4gQ09PS0lFX1dBSVQgc3RhdGUuCisgKgorICogT3V0cHV0cworICogKHRpbWVycykKKyAqLworc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc2ZfY29va2llX3dhaXRfcHJtX2Fib3J0KAorCWNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwljb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAorCXZvaWQgKmFyZywKKwlzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJc3RydWN0IG1zZ2hkciAqbXNnID0gYXJnOworCXN0cnVjdCBzY3RwX2NodW5rICphYm9ydDsKKwlzY3RwX2Rpc3Bvc2l0aW9uX3QgcmV0dmFsOworCisJLyogU3RvcCBUMS1pbml0IHRpbWVyICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9USU1FUl9TVE9QLAorCQkJU0NUUF9UTyhTQ1RQX0VWRU5UX1RJTUVPVVRfVDFfSU5JVCkpOworCXJldHZhbCA9IFNDVFBfRElTUE9TSVRJT05fQ09OU1VNRTsKKworCS8qIEdlbmVyYXRlIEFCT1JUIGNodW5rIHRvIHNlbmQgdGhlIHBlZXIgKi8KKwlhYm9ydCA9IHNjdHBfbWFrZV9hYm9ydF91c2VyKGFzb2MsIE5VTEwsIG1zZyk7CisJaWYgKCFhYm9ydCkKKwkJcmV0dmFsID0gU0NUUF9ESVNQT1NJVElPTl9OT01FTTsKKwllbHNlCisJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUkVQTFksIFNDVFBfQ0hVTksoYWJvcnQpKTsKKworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfTkVXX1NUQVRFLAorCQkJU0NUUF9TVEFURShTQ1RQX1NUQVRFX0NMT1NFRCkpOworCisJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfQUJPUlRFRFMpOworCisJLyogRXZlbiBpZiB3ZSBjYW4ndCBzZW5kIHRoZSBBQk9SVCBkdWUgdG8gbG93IG1lbW9yeSBkZWxldGUgdGhlCisJICogVENCLiAgVGhpcyBpcyBhIGRlcGFydHVyZSBmcm9tIG91ciB0eXBpY2FsIE5PTUVNIGhhbmRsaW5nLgorCSAqLworCisJLyogRGVsZXRlIHRoZSBlc3RhYmxpc2hlZCBhc3NvY2lhdGlvbi4gKi8KKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0lOSVRfRkFJTEVELAorCQkJU0NUUF9VMzIoU0NUUF9FUlJPUl9VU0VSX0FCT1JUKSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogc2N0cF9zZl9jb29raWVfZWNob2VkX3BybV9hYm9ydAorICoKKyAqIFNlY3Rpb246IDQgTm90ZTogMworICogVmVyaWZpY2F0aW9uIFRhZzoKKyAqIElucHV0cworICogKGVuZHBvaW50LCBhc29jKQorICoKKyAqIFRoZSBSRkMgZG9lcyBub3QgZXhwbGNpdGx5IGFkZHJlc3MgdGhpcyBpc3N1ZSwgYnV0IGlzIHRoZSByb3V0ZSB0aHJvdWdoIHRoZQorICogc3RhdGUgdGFibGUgd2hlbiBzb21lb25lIGlzc3VlcyBhbiBhYm9ydCB3aGlsZSBpbiBDT09LSUVfRUNIT0VEIHN0YXRlLgorICoKKyAqIE91dHB1dHMKKyAqICh0aW1lcnMpCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2Nvb2tpZV9lY2hvZWRfcHJtX2Fib3J0KAorCWNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwljb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAorCXZvaWQgKmFyZywKKwlzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJLyogVGhlcmUgaXMgYSBzaW5nbGUgVDEgdGltZXIsIHNvIHdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZQorCSAqIGNvbW1vbiBmdW5jdGlvbiB3aXRoIHRoZSBDT09LSUUtV0FJVCBzdGF0ZS4KKwkgKi8KKwlyZXR1cm4gc2N0cF9zZl9jb29raWVfd2FpdF9wcm1fYWJvcnQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworfQorCisvKgorICogc2N0cF9zZl9zaHV0ZG93bl9wZW5kaW5nX3BybV9hYm9ydAorICoKKyAqIElucHV0cworICogKGVuZHBvaW50LCBhc29jKQorICoKKyAqIFRoZSBSRkMgZG9lcyBub3QgZXhwbGljaXRseSBhZGRyZXNzIHRoaXMgaXNzdWUsIGJ1dCBpcyB0aGUgcm91dGUgdGhyb3VnaCB0aGUKKyAqIHN0YXRlIHRhYmxlIHdoZW4gc29tZW9uZSBpc3N1ZXMgYW4gYWJvcnQgd2hpbGUgaW4gU0hVVERPV04tUEVORElORyBzdGF0ZS4KKyAqCisgKiBPdXRwdXRzCisgKiAodGltZXJzKQorICovCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl9zaHV0ZG93bl9wZW5kaW5nX3BybV9hYm9ydCgKKwljb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJY29uc3Qgc2N0cF9zdWJ0eXBlX3QgdHlwZSwKKwl2b2lkICphcmcsCisJc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCS8qIFN0b3AgdGhlIFQ1LXNodXRkb3duIGd1YXJkIHRpbWVyLiAgKi8KKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RJTUVSX1NUT1AsCisJCQlTQ1RQX1RPKFNDVFBfRVZFTlRfVElNRU9VVF9UNV9TSFVURE9XTl9HVUFSRCkpOworCisJcmV0dXJuIHNjdHBfc2ZfZG9fOV8xX3BybV9hYm9ydChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7Cit9CisKKy8qCisgKiBzY3RwX3NmX3NodXRkb3duX3NlbnRfcHJtX2Fib3J0CisgKgorICogSW5wdXRzCisgKiAoZW5kcG9pbnQsIGFzb2MpCisgKgorICogVGhlIFJGQyBkb2VzIG5vdCBleHBsaWNpdGx5IGFkZHJlc3MgdGhpcyBpc3N1ZSwgYnV0IGlzIHRoZSByb3V0ZSB0aHJvdWdoIHRoZQorICogc3RhdGUgdGFibGUgd2hlbiBzb21lb25lIGlzc3VlcyBhbiBhYm9ydCB3aGlsZSBpbiBTSFVURE9XTi1TRU5UIHN0YXRlLgorICoKKyAqIE91dHB1dHMKKyAqICh0aW1lcnMpCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX3NodXRkb3duX3NlbnRfcHJtX2Fib3J0KAorCWNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwljb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAorCXZvaWQgKmFyZywKKwlzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJLyogU3RvcCB0aGUgVDItc2h1dGRvd24gdGltZXIuICAqLworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVElNRVJfU1RPUCwKKwkJCVNDVFBfVE8oU0NUUF9FVkVOVF9USU1FT1VUX1QyX1NIVVRET1dOKSk7CisKKwkvKiBTdG9wIHRoZSBUNS1zaHV0ZG93biBndWFyZCB0aW1lci4gICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9USU1FUl9TVE9QLAorCQkJU0NUUF9UTyhTQ1RQX0VWRU5UX1RJTUVPVVRfVDVfU0hVVERPV05fR1VBUkQpKTsKKworCXJldHVybiBzY3RwX3NmX2RvXzlfMV9wcm1fYWJvcnQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOworfQorCisvKgorICogc2N0cF9zZl9jb29raWVfZWNob2VkX3BybV9hYm9ydAorICoKKyAqIElucHV0cworICogKGVuZHBvaW50LCBhc29jKQorICoKKyAqIFRoZSBSRkMgZG9lcyBub3QgZXhwbGNpdGx5IGFkZHJlc3MgdGhpcyBpc3N1ZSwgYnV0IGlzIHRoZSByb3V0ZSB0aHJvdWdoIHRoZQorICogc3RhdGUgdGFibGUgd2hlbiBzb21lb25lIGlzc3VlcyBhbiBhYm9ydCB3aGlsZSBpbiBDT09LSUVfRUNIT0VEIHN0YXRlLgorICoKKyAqIE91dHB1dHMKKyAqICh0aW1lcnMpCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX3NodXRkb3duX2Fja19zZW50X3BybV9hYm9ydCgKKwljb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJY29uc3Qgc2N0cF9zdWJ0eXBlX3QgdHlwZSwKKwl2b2lkICphcmcsCisJc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCS8qIFRoZSBzYW1lIFQyIHRpbWVyLCBzbyB3ZSBzaG91bGQgYmUgYWJsZSB0byB1c2UKKwkgKiBjb21tb24gZnVuY3Rpb24gd2l0aCB0aGUgU0hVVERPV04tU0VOVCBzdGF0ZS4KKwkgKi8KKwlyZXR1cm4gc2N0cF9zZl9zaHV0ZG93bl9zZW50X3BybV9hYm9ydChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7Cit9CisKKy8qCisgKiBQcm9jZXNzIHRoZSBSRVFVRVNUSEVBUlRCRUFUIHByaW1pdGl2ZQorICoKKyAqIDEwLjEgVUxQLXRvLVNDVFAKKyAqIEopIFJlcXVlc3QgSGVhcnRiZWF0CisgKgorICogRm9ybWF0OiBSRVFVRVNUSEVBUlRCRUFUKGFzc29jaWF0aW9uIGlkLCBkZXN0aW5hdGlvbiB0cmFuc3BvcnQgYWRkcmVzcykKKyAqCisgKiAtPiByZXN1bHQKKyAqCisgKiBJbnN0cnVjdHMgdGhlIGxvY2FsIGVuZHBvaW50IHRvIHBlcmZvcm0gYSBIZWFydEJlYXQgb24gdGhlIHNwZWNpZmllZAorICogZGVzdGluYXRpb24gdHJhbnNwb3J0IGFkZHJlc3Mgb2YgdGhlIGdpdmVuIGFzc29jaWF0aW9uLiBUaGUgcmV0dXJuZWQKKyAqIHJlc3VsdCBzaG91bGQgaW5kaWNhdGUgd2hldGhlciB0aGUgdHJhbnNtaXNzaW9uIG9mIHRoZSBIRUFSVEJFQVQKKyAqIGNodW5rIHRvIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIHN1Y2Nlc3NmdWwuCisgKgorICogTWFuZGF0b3J5IGF0dHJpYnV0ZXM6CisgKgorICogbyBhc3NvY2lhdGlvbiBpZCAtIGxvY2FsIGhhbmRsZSB0byB0aGUgU0NUUCBhc3NvY2lhdGlvbgorICoKKyAqIG8gZGVzdGluYXRpb24gdHJhbnNwb3J0IGFkZHJlc3MgLSB0aGUgdHJhbnNwb3J0IGFkZHJlc3Mgb2YgdGhlCisgKiAgIGFzc29jaWF0aW9uIG9uIHdoaWNoIGEgaGVhcnRiZWF0IHNob3VsZCBiZSBpc3N1ZWQuCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2RvX3BybV9yZXF1ZXN0aGVhcnRiZWF0KAorCQkJCQljb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkJCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCQljb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAorCQkJCQl2b2lkICphcmcsCisJCQkJCXNjdHBfY21kX3NlcV90ICpjb21tYW5kcykKK3sKKwlyZXR1cm4gc2N0cF9zZl9oZWFydGJlYXQoZXAsIGFzb2MsIHR5cGUsIChzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKilhcmcsCisJCQkJIGNvbW1hbmRzKTsKK30KKworLyoKKyAqIEFERElQIFNlY3Rpb24gNC4xIEFTQ09ORiBDaHVuayBQcm9jZWR1cmVzCisgKiBXaGVuIGFuIGVuZHBvaW50IGhhcyBhbiBBU0NPTkYgc2lnbmFsZWQgY2hhbmdlIHRvIGJlIHNlbnQgdG8gdGhlCisgKiByZW1vdGUgZW5kcG9pbnQgaXQgc2hvdWxkIGRvIEExIHRvIEE5CisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2RvX3BybV9hc2NvbmYoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCQljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkJY29uc3Qgc2N0cF9zdWJ0eXBlX3QgdHlwZSwKKwkJCQkJdm9pZCAqYXJnLAorCQkJCQlzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rID0gYXJnOworCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9TRVRVUF9UNCwgU0NUUF9DSFVOSyhjaHVuaykpOworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVElNRVJfU1RBUlQsCisJCQlTQ1RQX1RPKFNDVFBfRVZFTlRfVElNRU9VVF9UNF9SVE8pKTsKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1JFUExZLCBTQ1RQX0NIVU5LKGNodW5rKSk7CisJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fQ09OU1VNRTsKK30KKworLyoKKyAqIElnbm9yZSB0aGUgcHJpbWl0aXZlIGV2ZW50CisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgZGlzcG9zaXRpb24gb2YgdGhlIHByaW1pdGl2ZS4KKyAqLworc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc2ZfaWdub3JlX3ByaW1pdGl2ZSgKKwljb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJY29uc3Qgc2N0cF9zdWJ0eXBlX3QgdHlwZSwKKwl2b2lkICphcmcsCisJc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCVNDVFBfREVCVUdfUFJJTlRLKCJQcmltaXRpdmUgdHlwZSAlZCBpcyBpZ25vcmVkLlxuIiwgdHlwZS5wcmltaXRpdmUpOworCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0RJU0NBUkQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoZXNlIGFyZSB0aGUgc3RhdGUgZnVuY3Rpb25zIGZvciB0aGUgT1RIRVIgZXZlbnRzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFN0YXJ0IHRoZSBzaHV0ZG93biBuZWdvdGlhdGlvbi4KKyAqCisgKiBGcm9tIFNlY3Rpb24gOS4yOgorICogT25jZSBhbGwgaXRzIG91dHN0YW5kaW5nIGRhdGEgaGFzIGJlZW4gYWNrbm93bGVkZ2VkLCB0aGUgZW5kcG9pbnQKKyAqIHNoYWxsIHNlbmQgYSBTSFVURE9XTiBjaHVuayB0byBpdHMgcGVlciBpbmNsdWRpbmcgaW4gdGhlIEN1bXVsYXRpdmUKKyAqIFRTTiBBY2sgZmllbGQgdGhlIGxhc3Qgc2VxdWVudGlhbCBUU04gaXQgaGFzIHJlY2VpdmVkIGZyb20gdGhlIHBlZXIuCisgKiBJdCBzaGFsbCB0aGVuIHN0YXJ0IHRoZSBUMi1zaHV0ZG93biB0aW1lciBhbmQgZW50ZXIgdGhlIFNIVVRET1dOLVNFTlQKKyAqIHN0YXRlLiBJZiB0aGUgdGltZXIgZXhwaXJlcywgdGhlIGVuZHBvaW50IG11c3QgcmUtc2VuZCB0aGUgU0hVVERPV04KKyAqIHdpdGggdGhlIHVwZGF0ZWQgbGFzdCBzZXF1ZW50aWFsIFRTTiByZWNlaXZlZCBmcm9tIGl0cyBwZWVyLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGRpc3Bvc2l0aW9uLgorICovCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl9kb185XzJfc3RhcnRfc2h1dGRvd24oCisJY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCWNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJdm9pZCAqYXJnLAorCXNjdHBfY21kX3NlcV90ICpjb21tYW5kcykKK3sKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqcmVwbHk7CisKKwkvKiBPbmNlIGFsbCBpdHMgb3V0c3RhbmRpbmcgZGF0YSBoYXMgYmVlbiBhY2tub3dsZWRnZWQsIHRoZQorCSAqIGVuZHBvaW50IHNoYWxsIHNlbmQgYSBTSFVURE9XTiBjaHVuayB0byBpdHMgcGVlciBpbmNsdWRpbmcKKwkgKiBpbiB0aGUgQ3VtdWxhdGl2ZSBUU04gQWNrIGZpZWxkIHRoZSBsYXN0IHNlcXVlbnRpYWwgVFNOIGl0CisJICogaGFzIHJlY2VpdmVkIGZyb20gdGhlIHBlZXIuCisJICovCisJcmVwbHkgPSBzY3RwX21ha2Vfc2h1dGRvd24oYXNvYywgTlVMTCk7CisJaWYgKCFyZXBseSkKKwkJZ290byBub21lbTsKKworCS8qIFNldCB0aGUgdHJhbnNwb3J0IGZvciB0aGUgU0hVVERPV04gY2h1bmsgYW5kIHRoZSB0aW1lb3V0IGZvciB0aGUKKwkgKiBUMi1zaHV0ZG93biB0aW1lci4KKwkgKi8KKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1NFVFVQX1QyLCBTQ1RQX0NIVU5LKHJlcGx5KSk7CisKKwkvKiBJdCBzaGFsbCB0aGVuIHN0YXJ0IHRoZSBUMi1zaHV0ZG93biB0aW1lciAqLworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVElNRVJfU1RBUlQsCisJCQlTQ1RQX1RPKFNDVFBfRVZFTlRfVElNRU9VVF9UMl9TSFVURE9XTikpOworCisJaWYgKGFzb2MtPmF1dG9jbG9zZSkKKwkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9USU1FUl9TVE9QLAorCQkJCVNDVFBfVE8oU0NUUF9FVkVOVF9USU1FT1VUX0FVVE9DTE9TRSkpOworCisJLyogYW5kIGVudGVyIHRoZSBTSFVURE9XTi1TRU5UIHN0YXRlLiAgKi8KKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX05FV19TVEFURSwKKwkJCVNDVFBfU1RBVEUoU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UKSk7CisKKwkvKiBzY3RwLWltcGxndWlkZSAyLjEwIElzc3VlcyB3aXRoIEhlYXJ0YmVhdGluZyBhbmQgZmFpbG92ZXIKKwkgKgorCSAqIEhFQVJUQkVBVCAuLi4gaXMgZGlzY29udGludWVkIGFmdGVyIHNlbmRpbmcgZWl0aGVyIFNIVVRET1dOCisgICAgICAgICAqIG9yIFNIVVRET1dOLUFDSy4KKwkgKi8KKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0hCX1RJTUVSU19TVE9QLCBTQ1RQX05VTEwoKSk7CisKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1JFUExZLCBTQ1RQX0NIVU5LKHJlcGx5KSk7CisKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9DT05TVU1FOworCitub21lbToKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9OT01FTTsKK30KKworLyoKKyAqIEdlbmVyYXRlIGEgU0hVVERPV04gQUNLIG5vdyB0aGF0IGV2ZXJ5dGhpbmcgaXMgU0FDSydkLgorICoKKyAqIEZyb20gU2VjdGlvbiA5LjI6CisgKgorICogSWYgaXQgaGFzIG5vIG1vcmUgb3V0c3RhbmRpbmcgREFUQSBjaHVua3MsIHRoZSBTSFVURE9XTiByZWNlaXZlcgorICogc2hhbGwgc2VuZCBhIFNIVVRET1dOIEFDSyBhbmQgc3RhcnQgYSBUMi1zaHV0ZG93biB0aW1lciBvZiBpdHMgb3duLAorICogZW50ZXJpbmcgdGhlIFNIVVRET1dOLUFDSy1TRU5UIHN0YXRlLiBJZiB0aGUgdGltZXIgZXhwaXJlcywgdGhlCisgKiBlbmRwb2ludCBtdXN0IHJlLXNlbmQgdGhlIFNIVVRET1dOIEFDSy4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBkaXNwb3NpdGlvbi4KKyAqLworc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc2ZfZG9fOV8yX3NodXRkb3duX2FjaygKKwljb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJY29uc3Qgc2N0cF9zdWJ0eXBlX3QgdHlwZSwKKwl2b2lkICphcmcsCisJc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuayA9IChzdHJ1Y3Qgc2N0cF9jaHVuayAqKSBhcmc7CisJc3RydWN0IHNjdHBfY2h1bmsgKnJlcGx5OworCisJLyogVGhlcmUgYXJlIDIgd2F5cyBvZiBnZXR0aW5nIGhlcmU6CisJICogICAgMSkgY2FsbGVkIGluIHJlc3BvbnNlIHRvIGEgU0hVVERPV04gY2h1bmsKKwkgKiAgICAyKSBjYWxsZWQgd2hlbiBTQ1RQX0VWRU5UX05PX1BFTkRJTkdfVFNOIGV2ZW50IGlzIGlzc3VlZC4KKwkgKgorCSAqIEZvciB0aGUgY2FzZSAoMiksIHRoZSBhcmcgcGFyYW1ldGVyIGlzIHNldCB0byBOVUxMLiAgV2UgbmVlZAorCSAqIHRvIGNoZWNrIHRoYXQgd2UgaGF2ZSBhIGNodW5rIGJlZm9yZSBhY2Nlc3NpbmcgaXQncyBmaWVsZHMuCisJICovCisJaWYgKGNodW5rKSB7CisJCWlmICghc2N0cF92dGFnX3ZlcmlmeShjaHVuaywgYXNvYykpCisJCQlyZXR1cm4gc2N0cF9zZl9wZGlzY2FyZChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7CisKKwkJLyogTWFrZSBzdXJlIHRoYXQgdGhlIFNIVVRET1dOIGNodW5rIGhhcyBhIHZhbGlkIGxlbmd0aC4gKi8KKwkJaWYgKCFzY3RwX2NodW5rX2xlbmd0aF92YWxpZChjaHVuaywgc2l6ZW9mKHN0cnVjdCBzY3RwX3NodXRkb3duX2NodW5rX3QpKSkKKwkJCXJldHVybiBzY3RwX3NmX3Zpb2xhdGlvbl9jaHVua2xlbihlcCwgYXNvYywgdHlwZSwgYXJnLAorCQkJCQkJCSAgY29tbWFuZHMpOworCX0KKworCS8qIElmIGl0IGhhcyBubyBtb3JlIG91dHN0YW5kaW5nIERBVEEgY2h1bmtzLCB0aGUgU0hVVERPV04gcmVjZWl2ZXIKKwkgKiBzaGFsbCBzZW5kIGEgU0hVVERPV04gQUNLIC4uLgorCSAqLworCXJlcGx5ID0gc2N0cF9tYWtlX3NodXRkb3duX2Fjayhhc29jLCBjaHVuayk7CisJaWYgKCFyZXBseSkKKwkJZ290byBub21lbTsKKworCS8qIFNldCB0aGUgdHJhbnNwb3J0IGZvciB0aGUgU0hVVERPV04gQUNLIGNodW5rIGFuZCB0aGUgdGltZW91dCBmb3IKKwkgKiB0aGUgVDItc2h1dGRvd24gdGltZXIuCisJICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9TRVRVUF9UMiwgU0NUUF9DSFVOSyhyZXBseSkpOworCisJLyogYW5kIHN0YXJ0L3Jlc3RhcnQgYSBUMi1zaHV0ZG93biB0aW1lciBvZiBpdHMgb3duLCAqLworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVElNRVJfUkVTVEFSVCwKKwkJCVNDVFBfVE8oU0NUUF9FVkVOVF9USU1FT1VUX1QyX1NIVVRET1dOKSk7CisKKwlpZiAoYXNvYy0+YXV0b2Nsb3NlKQorCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RJTUVSX1NUT1AsCisJCQkJU0NUUF9UTyhTQ1RQX0VWRU5UX1RJTUVPVVRfQVVUT0NMT1NFKSk7CisKKwkvKiBFbnRlciB0aGUgU0hVVERPV04tQUNLLVNFTlQgc3RhdGUuICAqLworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfTkVXX1NUQVRFLAorCQkJU0NUUF9TVEFURShTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UKSk7CisKKwkvKiBzY3RwLWltcGxndWlkZSAyLjEwIElzc3VlcyB3aXRoIEhlYXJ0YmVhdGluZyBhbmQgZmFpbG92ZXIKKwkgKgorCSAqIEhFQVJUQkVBVCAuLi4gaXMgZGlzY29udGludWVkIGFmdGVyIHNlbmRpbmcgZWl0aGVyIFNIVVRET1dOCisgICAgICAgICAqIG9yIFNIVVRET1dOLUFDSy4KKwkgKi8KKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0hCX1RJTUVSU19TVE9QLCBTQ1RQX05VTEwoKSk7CisKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1JFUExZLCBTQ1RQX0NIVU5LKHJlcGx5KSk7CisKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9DT05TVU1FOworCitub21lbToKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9OT01FTTsKK30KKworLyoKKyAqIElnbm9yZSB0aGUgZXZlbnQgZGVmaW5lZCBhcyBvdGhlcgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGRpc3Bvc2l0aW9uIG9mIHRoZSBldmVudC4KKyAqLworc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc2ZfaWdub3JlX290aGVyKGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwkJCQkJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJCWNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJCQkJCXZvaWQgKmFyZywKKwkJCQkJc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCVNDVFBfREVCVUdfUFJJTlRLKCJUaGUgZXZlbnQgb3RoZXIgdHlwZSAlZCBpcyBpZ25vcmVkXG4iLCB0eXBlLm90aGVyKTsKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9ESVNDQVJEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGVzZSBhcmUgdGhlIHN0YXRlIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgdGltZW91dCBldmVudHMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogUlRYIFRpbWVvdXQKKyAqCisgKiBTZWN0aW9uOiA2LjMuMyBIYW5kbGUgVDMtcnR4IEV4cGlyYXRpb24KKyAqCisgKiBXaGVuZXZlciB0aGUgcmV0cmFuc21pc3Npb24gdGltZXIgVDMtcnR4IGV4cGlyZXMgZm9yIGEgZGVzdGluYXRpb24KKyAqIGFkZHJlc3MsIGRvIHRoZSBmb2xsb3dpbmc6CisgKiBbU2VlIGJlbG93XQorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGRpc3Bvc2l0aW9uIG9mIHRoZSBjaHVuay4KKyAqLworc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc2ZfZG9fNl8zXzNfcnR4KGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwkJCQkJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJCWNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJCQkJCXZvaWQgKmFyZywKKwkJCQkJc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0ID0gYXJnOworCisJaWYgKGFzb2MtPm92ZXJhbGxfZXJyb3JfY291bnQgPj0gYXNvYy0+bWF4X3JldHJhbnMpIHsKKwkJLyogQ01EX0FTU09DX0ZBSUxFRCBjYWxscyBDTURfREVMRVRFX1RDQi4gKi8KKwkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9BU1NPQ19GQUlMRUQsCisJCQkJU0NUUF9VMzIoU0NUUF9FUlJPUl9OT19FUlJPUikpOworCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9BQk9SVEVEUyk7CisJCVNDVFBfREVDX1NUQVRTKFNDVFBfTUlCX0NVUlJFU1RBQik7CisJCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0RFTEVURV9UQ0I7CisJfQorCisJLyogRTEpIEZvciB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBmb3Igd2hpY2ggdGhlIHRpbWVyCisJICogZXhwaXJlcywgYWRqdXN0IGl0cyBzc3RocmVzaCB3aXRoIHJ1bGVzIGRlZmluZWQgaW4gU2VjdGlvbgorCSAqIDcuMi4zIGFuZCBzZXQgdGhlIGN3bmQgPC0gTVRVLgorCSAqLworCisJLyogRTIpIEZvciB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBmb3Igd2hpY2ggdGhlIHRpbWVyCisJICogZXhwaXJlcywgc2V0IFJUTyA8LSBSVE8gKiAyICgiYmFjayBvZmYgdGhlIHRpbWVyIikuICBUaGUKKwkgKiBtYXhpbXVtIHZhbHVlIGRpc2N1c3NlZCBpbiBydWxlIEM3IGFib3ZlIChSVE8ubWF4KSBtYXkgYmUKKwkgKiB1c2VkIHRvIHByb3ZpZGUgYW4gdXBwZXIgYm91bmQgdG8gdGhpcyBkb3VibGluZyBvcGVyYXRpb24uCisJICovCisKKwkvKiBFMykgRGV0ZXJtaW5lIGhvdyBtYW55IG9mIHRoZSBlYXJsaWVzdCAoaS5lLiwgbG93ZXN0IFRTTikKKwkgKiBvdXRzdGFuZGluZyBEQVRBIGNodW5rcyBmb3IgdGhlIGFkZHJlc3MgZm9yIHdoaWNoIHRoZQorCSAqIFQzLXJ0eCBoYXMgZXhwaXJlZCB3aWxsIGZpdCBpbnRvIGEgc2luZ2xlIHBhY2tldCwgc3ViamVjdAorCSAqIHRvIHRoZSBNVFUgY29uc3RyYWludCBmb3IgdGhlIHBhdGggY29ycmVzcG9uZGluZyB0byB0aGUKKwkgKiBkZXN0aW5hdGlvbiB0cmFuc3BvcnQgYWRkcmVzcyB0byB3aGljaCB0aGUgcmV0cmFuc21pc3Npb24KKwkgKiBpcyBiZWluZyBzZW50ICh0aGlzIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgYWRkcmVzcyBmb3IKKwkgKiB3aGljaCB0aGUgdGltZXIgZXhwaXJlcyBbc2VlIFNlY3Rpb24gNi40XSkuICBDYWxsIHRoaXMKKwkgKiB2YWx1ZSBLLiBCdW5kbGUgYW5kIHJldHJhbnNtaXQgdGhvc2UgSyBEQVRBIGNodW5rcyBpbiBhCisJICogc2luZ2xlIHBhY2tldCB0byB0aGUgZGVzdGluYXRpb24gZW5kcG9pbnQuCisJICoKKwkgKiBOb3RlOiBBbnkgREFUQSBjaHVua3MgdGhhdCB3ZXJlIHNlbnQgdG8gdGhlIGFkZHJlc3MgZm9yCisJICogd2hpY2ggdGhlIFQzLXJ0eCB0aW1lciBleHBpcmVkIGJ1dCBkaWQgbm90IGZpdCBpbiBvbmUgTVRVCisJICogKHJ1bGUgRTMgYWJvdmUpLCBzaG91bGQgYmUgbWFya2VkIGZvciByZXRyYW5zbWlzc2lvbiBhbmQKKwkgKiBzZW50IGFzIHNvb24gYXMgY3duZCBhbGxvd3MgKG5vcm1hbGx5IHdoZW4gYSBTQUNLIGFycml2ZXMpLgorCSAqLworCisJLyogTkI6IFJ1bGVzIEU0IGFuZCBGMSBhcmUgaW1wbGljaXQgaW4gUjEuICAqLworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUkVUUkFOLCBTQ1RQX1RSQU5TUE9SVCh0cmFuc3BvcnQpKTsKKworCS8qIERvIHNvbWUgZmFpbHVyZSBtYW5hZ2VtZW50IChTZWN0aW9uIDguMikuICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9TVFJJS0UsIFNDVFBfVFJBTlNQT1JUKHRyYW5zcG9ydCkpOworCisJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fQ09OU1VNRTsKK30KKworLyoKKyAqIEdlbmVyYXRlIGRlbGF5ZWQgU0FDSyBvbiB0aW1lb3V0CisgKgorICogU2VjdGlvbjogNi4yICBBY2tub3dsZWRnZW1lbnQgb24gUmVjZXB0aW9uIG9mIERBVEEgQ2h1bmtzCisgKgorICogVGhlIGd1aWRlbGluZXMgb24gZGVsYXllZCBhY2tub3dsZWRnZW1lbnQgYWxnb3JpdGhtIHNwZWNpZmllZCBpbgorICogU2VjdGlvbiA0LjIgb2YgW1JGQzI1ODFdIFNIT1VMRCBiZSBmb2xsb3dlZC4gIFNwZWNpZmljYWxseSwgYW4KKyAqIGFja25vd2xlZGdlbWVudCBTSE9VTEQgYmUgZ2VuZXJhdGVkIGZvciBhdCBsZWFzdCBldmVyeSBzZWNvbmQgcGFja2V0CisgKiAobm90IGV2ZXJ5IHNlY29uZCBEQVRBIGNodW5rKSByZWNlaXZlZCwgYW5kIFNIT1VMRCBiZSBnZW5lcmF0ZWQKKyAqIHdpdGhpbiAyMDAgbXMgb2YgdGhlIGFycml2YWwgb2YgYW55IHVuYWNrbm93bGVkZ2VkIERBVEEgY2h1bmsuICBJbgorICogc29tZSBzaXR1YXRpb25zIGl0IG1heSBiZSBiZW5lZmljaWFsIGZvciBhbiBTQ1RQIHRyYW5zbWl0dGVyIHRvIGJlCisgKiBtb3JlIGNvbnNlcnZhdGl2ZSB0aGFuIHRoZSBhbGdvcml0aG1zIGRldGFpbGVkIGluIHRoaXMgZG9jdW1lbnQKKyAqIGFsbG93LiBIb3dldmVyLCBhbiBTQ1RQIHRyYW5zbWl0dGVyIE1VU1QgTk9UIGJlIG1vcmUgYWdncmVzc2l2ZSB0aGFuCisgKiB0aGUgZm9sbG93aW5nIGFsZ29yaXRobXMgYWxsb3cuCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2RvXzZfMl9zYWNrKGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJICAgICAgIGNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJCQkJICAgICAgIHZvaWQgKmFyZywKKwkJCQkgICAgICAgc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfR0VOX1NBQ0ssIFNDVFBfRk9SQ0UoKSk7CisJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fQ09OU1VNRTsKK30KKworLyoKKyAqIHNjdHBfc2ZfdDFfdGltZXJfZXhwaXJlCisgKgorICogU2VjdGlvbjogNCBOb3RlOiAyCisgKiBWZXJpZmljYXRpb24gVGFnOgorICogSW5wdXRzCisgKiAoZW5kcG9pbnQsIGFzb2MpCisgKgorICogIFJGQyAyOTYwIFNlY3Rpb24gNCBOb3RlcworICogIDIpIElmIHRoZSBUMS1pbml0IHRpbWVyIGV4cGlyZXMsIHRoZSBlbmRwb2ludCBNVVNUIHJldHJhbnNtaXQgSU5JVAorICogICAgIGFuZCByZS1zdGFydCB0aGUgVDEtaW5pdCB0aW1lciB3aXRob3V0IGNoYW5naW5nIHN0YXRlLiAgVGhpcyBNVVNUCisgKiAgICAgYmUgcmVwZWF0ZWQgdXAgdG8gJ01heC5Jbml0LlJldHJhbnNtaXRzJyB0aW1lcy4gIEFmdGVyIHRoYXQsIHRoZQorICogICAgIGVuZHBvaW50IE1VU1QgYWJvcnQgdGhlIGluaXRpYWxpemF0aW9uIHByb2Nlc3MgYW5kIHJlcG9ydCB0aGUKKyAqICAgICBlcnJvciB0byBTQ1RQIHVzZXIuCisgKgorICogICAzKSBJZiB0aGUgVDEtY29va2llIHRpbWVyIGV4cGlyZXMsIHRoZSBlbmRwb2ludCBNVVNUIHJldHJhbnNtaXQKKyAqICAgICBDT09LSUUgRUNITyBhbmQgcmUtc3RhcnQgdGhlIFQxLWNvb2tpZSB0aW1lciB3aXRob3V0IGNoYW5naW5nCisgKiAgICAgc3RhdGUuICBUaGlzIE1VU1QgYmUgcmVwZWF0ZWQgdXAgdG8gJ01heC5Jbml0LlJldHJhbnNtaXRzJyB0aW1lcy4KKyAqICAgICBBZnRlciB0aGF0LCB0aGUgZW5kcG9pbnQgTVVTVCBhYm9ydCB0aGUgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyBhbmQKKyAqICAgICByZXBvcnQgdGhlIGVycm9yIHRvIFNDVFAgdXNlci4KKyAqCisgKiBPdXRwdXRzCisgKiAodGltZXJzLCBldmVudHMpCisgKgorICovCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl90MV90aW1lcl9leHBpcmUoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCQkgICBjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkJICAgY29uc3Qgc2N0cF9zdWJ0eXBlX3QgdHlwZSwKKwkJCQkJICAgdm9pZCAqYXJnLAorCQkJCQkgICBzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKnJlcGw7CisJc3RydWN0IHNjdHBfYmluZF9hZGRyICpicDsKKwlzY3RwX2V2ZW50X3RpbWVvdXRfdCB0aW1lciA9IChzY3RwX2V2ZW50X3RpbWVvdXRfdCkgYXJnOworCWludCB0aW1lb3V0OworCWludCBhdHRlbXB0czsKKworCXRpbWVvdXQgPSBhc29jLT50aW1lb3V0c1t0aW1lcl07CisJYXR0ZW1wdHMgPSBhc29jLT5jb3VudGVyc1tTQ1RQX0NPVU5URVJfSU5JVF9FUlJPUl0gKyAxOworCXJlcGwgPSBOVUxMOworCisJU0NUUF9ERUJVR19QUklOVEsoIlRpbWVyIFQxIGV4cGlyZWQuXG4iKTsKKworCWlmIChhdHRlbXB0cyA8IGFzb2MtPm1heF9pbml0X2F0dGVtcHRzKSB7CisJCXN3aXRjaCAodGltZXIpIHsKKwkJY2FzZSBTQ1RQX0VWRU5UX1RJTUVPVVRfVDFfSU5JVDoKKwkJCWJwID0gKHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqKSAmYXNvYy0+YmFzZS5iaW5kX2FkZHI7CisJCQlyZXBsID0gc2N0cF9tYWtlX2luaXQoYXNvYywgYnAsIEdGUF9BVE9NSUMsIDApOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1RQX0VWRU5UX1RJTUVPVVRfVDFfQ09PS0lFOgorCQkJcmVwbCA9IHNjdHBfbWFrZV9jb29raWVfZWNobyhhc29jLCBOVUxMKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwkJCWJyZWFrOworCQl9OworCisJCWlmICghcmVwbCkKKwkJCWdvdG8gbm9tZW07CisKKwkJLyogSXNzdWUgYSBzaWRlZWZmZWN0IHRvIGRvIHRoZSBuZWVkZWQgYWNjb3VudGluZy4gKi8KKwkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9JTklUX1JFU1RBUlQsCisJCQkJU0NUUF9UTyh0aW1lcikpOworCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1JFUExZLCBTQ1RQX0NIVU5LKHJlcGwpKTsKKwl9IGVsc2UgeworCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0lOSVRfRkFJTEVELAorCQkJCVNDVFBfVTMyKFNDVFBfRVJST1JfTk9fRVJST1IpKTsKKwkJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fREVMRVRFX1RDQjsKKwl9CisKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9DT05TVU1FOworCitub21lbToKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9OT01FTTsKK30KKworLyogUkZDMjk2MCA5LjIgSWYgdGhlIHRpbWVyIGV4cGlyZXMsIHRoZSBlbmRwb2ludCBtdXN0IHJlLXNlbmQgdGhlIFNIVVRET1dOCisgKiB3aXRoIHRoZSB1cGRhdGVkIGxhc3Qgc2VxdWVudGlhbCBUU04gcmVjZWl2ZWQgZnJvbSBpdHMgcGVlci4KKyAqCisgKiBBbiBlbmRwb2ludCBzaG91bGQgbGltaXQgdGhlIG51bWJlciBvZiByZXRyYW5zbWlzc2lvbnMgb2YgdGhlCisgKiBTSFVURE9XTiBjaHVuayB0byB0aGUgcHJvdG9jb2wgcGFyYW1ldGVyICdBc3NvY2lhdGlvbi5NYXguUmV0cmFucycuCisgKiBJZiB0aGlzIHRocmVzaG9sZCBpcyBleGNlZWRlZCB0aGUgZW5kcG9pbnQgc2hvdWxkIGRlc3Ryb3kgdGhlIFRDQiBhbmQKKyAqIE1VU1QgcmVwb3J0IHRoZSBwZWVyIGVuZHBvaW50IHVucmVhY2hhYmxlIHRvIHRoZSB1cHBlciBsYXllciAoYW5kCisgKiB0aHVzIHRoZSBhc3NvY2lhdGlvbiBlbnRlcnMgdGhlIENMT1NFRCBzdGF0ZSkuICBUaGUgcmVjZXB0aW9uIG9mIGFueQorICogcGFja2V0IGZyb20gaXRzIHBlZXIgKGkuZS4gYXMgdGhlIHBlZXIgc2VuZHMgYWxsIG9mIGl0cyBxdWV1ZWQgREFUQQorICogY2h1bmtzKSBzaG91bGQgY2xlYXIgdGhlIGVuZHBvaW50J3MgcmV0cmFuc21pc3Npb24gY291bnQgYW5kIHJlc3RhcnQKKyAqIHRoZSBUMi1TaHV0ZG93biB0aW1lciwgIGdpdmluZyBpdHMgcGVlciBhbXBsZSBvcHBvcnR1bml0eSB0byB0cmFuc21pdAorICogYWxsIG9mIGl0cyBxdWV1ZWQgREFUQSBjaHVua3MgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBzZW50LgorICovCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl90Ml90aW1lcl9leHBpcmUoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCQkgICBjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkJICAgY29uc3Qgc2N0cF9zdWJ0eXBlX3QgdHlwZSwKKwkJCQkJICAgdm9pZCAqYXJnLAorCQkJCQkgICBzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKnJlcGx5ID0gTlVMTDsKKworCVNDVFBfREVCVUdfUFJJTlRLKCJUaW1lciBUMiBleHBpcmVkLlxuIik7CisJaWYgKGFzb2MtPm92ZXJhbGxfZXJyb3JfY291bnQgPj0gYXNvYy0+bWF4X3JldHJhbnMpIHsKKwkJLyogTm90ZTogIENNRF9BU1NPQ19GQUlMRUQgY2FsbHMgQ01EX0RFTEVURV9UQ0IuICovCisJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfQVNTT0NfRkFJTEVELAorCQkJCVNDVFBfVTMyKFNDVFBfRVJST1JfTk9fRVJST1IpKTsKKwkJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfQUJPUlRFRFMpOworCQlTQ1RQX0RFQ19TVEFUUyhTQ1RQX01JQl9DVVJSRVNUQUIpOworCQlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9ERUxFVEVfVENCOworCX0KKworCXN3aXRjaCAoYXNvYy0+c3RhdGUpIHsKKwljYXNlIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVDoKKwkJcmVwbHkgPSBzY3RwX21ha2Vfc2h1dGRvd24oYXNvYywgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UOgorCQlyZXBseSA9IHNjdHBfbWFrZV9zaHV0ZG93bl9hY2soYXNvYywgTlVMTCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCWJyZWFrOworCX07CisKKwlpZiAoIXJlcGx5KQorCQlnb3RvIG5vbWVtOworCisJLyogRG8gc29tZSBmYWlsdXJlIG1hbmFnZW1lbnQgKFNlY3Rpb24gOC4yKS4gKi8KKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1NUUklLRSwKKwkJCVNDVFBfVFJBTlNQT1JUKGFzb2MtPnNodXRkb3duX2xhc3Rfc2VudF90bykpOworCisJLyogU2V0IHRoZSB0cmFuc3BvcnQgZm9yIHRoZSBTSFVURE9XTi9BQ0sgY2h1bmsgYW5kIHRoZSB0aW1lb3V0IGZvcgorCSAqIHRoZSBUMi1zaHV0ZG93biB0aW1lci4KKwkgKi8KKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1NFVFVQX1QyLCBTQ1RQX0NIVU5LKHJlcGx5KSk7CisKKwkvKiBSZXN0YXJ0IHRoZSBUMi1zaHV0ZG93biB0aW1lci4gICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9USU1FUl9SRVNUQVJULAorCQkJU0NUUF9UTyhTQ1RQX0VWRU5UX1RJTUVPVVRfVDJfU0hVVERPV04pKTsKKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1JFUExZLCBTQ1RQX0NIVU5LKHJlcGx5KSk7CisJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fQ09OU1VNRTsKKworbm9tZW06CisJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fTk9NRU07Cit9CisKKy8qCisgKiBBRERJUCBTZWN0aW9uIDQuMSBBU0NPTkYgQ0h1bmsgUHJvY2VkdXJlcworICogSWYgdGhlIFQ0IFJUTyB0aW1lciBleHBpcmVzIHRoZSBlbmRwb2ludCBzaG91bGQgZG8gQjEgdG8gQjUKKyAqLworc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc2ZfdDRfdGltZXJfZXhwaXJlKAorCWNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwljb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAorCXZvaWQgKmFyZywKKwlzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rID0gYXNvYy0+YWRkaXBfbGFzdF9hc2NvbmY7CisJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBjaHVuay0+dHJhbnNwb3J0OworCisJLyogQURESVAgNC4xIEIxKSBJbmNyZW1lbnQgdGhlIGVycm9yIGNvdW50ZXJzIGFuZCBwZXJmb3JtIHBhdGggZmFpbHVyZQorCSAqIGRldGVjdGlvbiBvbiB0aGUgYXBwcm9wcmlhdGUgZGVzdGluYXRpb24gYWRkcmVzcyBhcyBkZWZpbmVkIGluCisJICogUkZDMjk2MCBbNV0gc2VjdGlvbiA4LjEgYW5kIDguMi4KKwkgKi8KKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1NUUklLRSwgU0NUUF9UUkFOU1BPUlQodHJhbnNwb3J0KSk7CisKKwkvKiBSZWNvbmZpZyBUNCB0aW1lciBhbmQgdHJhbnNwb3J0LiAqLworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfU0VUVVBfVDQsIFNDVFBfQ0hVTksoY2h1bmspKTsKKworCS8qIEFERElQIDQuMSBCMikgSW5jcmVtZW50IHRoZSBhc3NvY2lhdGlvbiBlcnJvciBjb3VudGVycyBhbmQgcGVyZm9ybQorCSAqIGVuZHBvaW50IGZhaWx1cmUgZGV0ZWN0aW9uIG9uIHRoZSBhc3NvY2lhdGlvbiBhcyBkZWZpbmVkIGluCisJICogUkZDMjk2MCBbNV0gc2VjdGlvbiA4LjEgYW5kIDguMi4KKwkgKiBhc3NvY2lhdGlvbiBlcnJvciBjb3VudGVyIGlzIGluY3JlbWVudGVkIGluIFNDVFBfQ01EX1NUUklLRS4KKwkgKi8KKwlpZiAoYXNvYy0+b3ZlcmFsbF9lcnJvcl9jb3VudCA+PSBhc29jLT5tYXhfcmV0cmFucykgeworCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RJTUVSX1NUT1AsCisJCQkJU0NUUF9UTyhTQ1RQX0VWRU5UX1RJTUVPVVRfVDRfUlRPKSk7CisJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfQVNTT0NfRkFJTEVELAorCQkJCVNDVFBfVTMyKFNDVFBfRVJST1JfTk9fRVJST1IpKTsKKwkJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfQUJPUlRFRFMpOworCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9DVVJSRVNUQUIpOworCQlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9BQk9SVDsKKwl9CisKKwkvKiBBRERJUCA0LjEgQjMpIEJhY2stb2ZmIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIFJUTyB2YWx1ZSB0byB3aGljaAorCSAqIHRoZSBBU0NPTkYgY2h1bmsgd2FzIHNlbnQgYnkgZG91YmxpbmcgdGhlIFJUTyB0aW1lciB2YWx1ZS4KKwkgKiBUaGlzIGlzIGRvbmUgaW4gU0NUUF9DTURfU1RSSUtFLgorCSAqLworCisJLyogQURESVAgNC4xIEI0KSBSZS10cmFuc21pdCB0aGUgQVNDT05GIENodW5rIGxhc3Qgc2VudCBhbmQgaWYgcG9zc2libGUKKwkgKiBjaG9vc2UgYW4gYWx0ZXJuYXRlIGRlc3RpbmF0aW9uIGFkZHJlc3MgKHBsZWFzZSByZWZlciB0byBSRkMyOTYwCisJICogWzVdIHNlY3Rpb24gNi40LjEpLiBBbiBlbmRwb2ludCBNVVNUIE5PVCBhZGQgbmV3IHBhcmFtZXRlcnMgdG8gdGhpcworCSAqIGNodW5rLCBpdCBNVVNUIGJlIHRoZSBzYW1lIChpbmNsdWRpbmcgaXRzIHNlcmlhbCBudW1iZXIpIGFzIHRoZSBsYXN0IAorCSAqIEFTQ09ORiBzZW50LgorCSAqLworCXNjdHBfY2h1bmtfaG9sZChhc29jLT5hZGRpcF9sYXN0X2FzY29uZik7CisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9SRVBMWSwKKwkJCVNDVFBfQ0hVTksoYXNvYy0+YWRkaXBfbGFzdF9hc2NvbmYpKTsKKworCS8qIEFERElQIDQuMSBCNSkgUmVzdGFydCB0aGUgVC00IFJUTyB0aW1lci4gTm90ZSB0aGF0IGlmIGEgZGlmZmVyZW50CisJICogZGVzdGluYXRpb24gaXMgc2VsZWN0ZWQsIHRoZW4gdGhlIFJUTyB1c2VkIHdpbGwgYmUgdGhhdCBvZiB0aGUgbmV3CisJICogZGVzdGluYXRpb24gYWRkcmVzcy4KKwkgKi8KKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RJTUVSX1JFU1RBUlQsCisJCQlTQ1RQX1RPKFNDVFBfRVZFTlRfVElNRU9VVF9UNF9SVE8pKTsKKworCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0NPTlNVTUU7Cit9CisKKy8qIHNjdHBpbXBndWlkZS0wNSBTZWN0aW9uIDIuMTIuMgorICogVGhlIHNlbmRlciBvZiB0aGUgU0hVVERPV04gTUFZIGFsc28gc3RhcnQgYW4gb3ZlcmFsbCBndWFyZCB0aW1lcgorICogJ1Q1LXNodXRkb3duLWd1YXJkJyB0byBib3VuZCB0aGUgb3ZlcmFsbCB0aW1lIGZvciBzaHV0ZG93biBzZXF1ZW5jZS4KKyAqIEF0IHRoZSBleHBpcmF0aW9uIG9mIHRoaXMgdGltZXIgdGhlIHNlbmRlciBTSE9VTEQgYWJvcnQgdGhlIGFzc29jaWF0aW9uCisgKiBieSBzZW5kaW5nIGFuIEFCT1JUIGNodW5rLgorICovCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl90NV90aW1lcl9leHBpcmUoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCQkgICBjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkJICAgY29uc3Qgc2N0cF9zdWJ0eXBlX3QgdHlwZSwKKwkJCQkJICAgdm9pZCAqYXJnLAorCQkJCQkgICBzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKnJlcGx5ID0gTlVMTDsKKworCVNDVFBfREVCVUdfUFJJTlRLKCJUaW1lciBUNSBleHBpcmVkLlxuIik7CisKKwlyZXBseSA9IHNjdHBfbWFrZV9hYm9ydChhc29jLCBOVUxMLCAwKTsKKwlpZiAoIXJlcGx5KQorCQlnb3RvIG5vbWVtOworCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9SRVBMWSwgU0NUUF9DSFVOSyhyZXBseSkpOworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfQVNTT0NfRkFJTEVELAorCQkJU0NUUF9VMzIoU0NUUF9FUlJPUl9OT19FUlJPUikpOworCisJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fREVMRVRFX1RDQjsKK25vbWVtOgorCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX05PTUVNOworfQorCisvKiBIYW5kbGUgZXhwaXJhdGlvbiBvZiBBVVRPQ0xPU0UgdGltZXIuICBXaGVuIHRoZSBhdXRvY2xvc2UgdGltZXIgZXhwaXJlcywKKyAqIHRoZSBhc3NvY2lhdGlvbiBpcyBhdXRvbWF0aWNhbGx5IGNsb3NlZCBieSBzdGFydGluZyB0aGUgc2h1dGRvd24gcHJvY2Vzcy4KKyAqIFRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBpcyBzYW1lIGFzIHdoZW4gU0hVVERPV04gaXMgaW5pdGlhdGVkIGJ5CisgKiB0aGUgdXNlci4gIFNvIHRoaXMgcm91dGluZSBsb29rcyBzYW1lIGFzIHNjdHBfc2ZfZG9fOV8yX3BybV9zaHV0ZG93bigpLgorICovCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl9hdXRvY2xvc2VfdGltZXJfZXhwaXJlKAorCWNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwljb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAorCXZvaWQgKmFyZywKKwlzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJaW50IGRpc3Bvc2l0aW9uOworCisJLyogRnJvbSA5LjIgU2h1dGRvd24gb2YgYW4gQXNzb2NpYXRpb24KKwkgKiBVcG9uIHJlY2VpcHQgb2YgdGhlIFNIVVRET1dOIHByaW1pdGl2ZSBmcm9tIGl0cyB1cHBlcgorCSAqIGxheWVyLCB0aGUgZW5kcG9pbnQgZW50ZXJzIFNIVVRET1dOLVBFTkRJTkcgc3RhdGUgYW5kCisJICogcmVtYWlucyB0aGVyZSB1bnRpbCBhbGwgb3V0c3RhbmRpbmcgZGF0YSBoYXMgYmVlbgorCSAqIGFja25vd2xlZGdlZCBieSBpdHMgcGVlci4gVGhlIGVuZHBvaW50IGFjY2VwdHMgbm8gbmV3IGRhdGEKKwkgKiBmcm9tIGl0cyB1cHBlciBsYXllciwgYnV0IHJldHJhbnNtaXRzIGRhdGEgdG8gdGhlIGZhciBlbmQKKwkgKiBpZiBuZWNlc3NhcnkgdG8gZmlsbCBnYXBzLgorCSAqLworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfTkVXX1NUQVRFLAorCQkJU0NUUF9TVEFURShTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcpKTsKKworCS8qIHNjdHBpbXBndWlkZS0wNSBTZWN0aW9uIDIuMTIuMgorCSAqIFRoZSBzZW5kZXIgb2YgdGhlIFNIVVRET1dOIE1BWSBhbHNvIHN0YXJ0IGFuIG92ZXJhbGwgZ3VhcmQgdGltZXIKKwkgKiAnVDUtc2h1dGRvd24tZ3VhcmQnIHRvIGJvdW5kIHRoZSBvdmVyYWxsIHRpbWUgZm9yIHNodXRkb3duIHNlcXVlbmNlLgorIAkgKi8KKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RJTUVSX1NUQVJULAorCQkJU0NUUF9UTyhTQ1RQX0VWRU5UX1RJTUVPVVRfVDVfU0hVVERPV05fR1VBUkQpKTsKKwlkaXNwb3NpdGlvbiA9IFNDVFBfRElTUE9TSVRJT05fQ09OU1VNRTsKKwlpZiAoc2N0cF9vdXRxX2lzX2VtcHR5KCZhc29jLT5vdXRxdWV1ZSkpIHsKKwkJZGlzcG9zaXRpb24gPSBzY3RwX3NmX2RvXzlfMl9zdGFydF9zaHV0ZG93bihlcCwgYXNvYywgdHlwZSwKKwkJCQkJCQkgICAgYXJnLCBjb21tYW5kcyk7CisJfQorCXJldHVybiBkaXNwb3NpdGlvbjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGVzZSBhcmUgc2Egc3RhdGUgZnVuY3Rpb25zIHdoaWNoIGNvdWxkIGFwcGx5IHRvIGFsbCB0eXBlcyBvZiBldmVudHMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoaXMgdGFibGUgZW50cnkgaXMgbm90IGltcGxlbWVudGVkLgorICoKKyAqIElucHV0cworICogKGVuZHBvaW50LCBhc29jLCBjaHVuaykKKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBkaXNwb3NpdGlvbiBvZiB0aGUgY2h1bmsuCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX25vdF9pbXBsKGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJICAgIGNvbnN0IHNjdHBfc3VidHlwZV90IHR5cGUsCisJCQkJICAgIHZvaWQgKmFyZywKKwkJCQkgICAgc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX05PVF9JTVBMOworfQorCisvKgorICogVGhpcyB0YWJsZSBlbnRyeSByZXByZXNlbnRzIGEgYnVnLgorICoKKyAqIElucHV0cworICogKGVuZHBvaW50LCBhc29jLCBjaHVuaykKKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBkaXNwb3NpdGlvbiBvZiB0aGUgY2h1bmsuCisgKi8KK3NjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX2J1Zyhjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkgICAgICAgY29uc3Qgc2N0cF9zdWJ0eXBlX3QgdHlwZSwKKwkJCSAgICAgICB2b2lkICphcmcsCisJCQkgICAgICAgc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKQoreworCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0JVRzsKK30KKworLyoKKyAqIFRoaXMgdGFibGUgZW50cnkgcmVwcmVzZW50cyB0aGUgZmlyaW5nIG9mIGEgdGltZXIgaW4gdGhlIHdyb25nIHN0YXRlLgorICogU2luY2UgdGltZXIgZGVsZXRpb24gY2Fubm90IGJlIGd1YXJhbnRlZWQgYSB0aW1lciAnbWF5JyBlbmQgdXAgZmlyaW5nCisgKiB3aGVuIHRoZSBhc3NvY2lhdGlvbiBpcyBpbiB0aGUgd3Jvbmcgc3RhdGUuICAgVGhpcyBldmVudCBzaG91bGQKKyAqIGJlIGlnbm9yZWQsIHNvIGFzIHRvIHByZXZlbnQgYW55IHJlYXJtaW5nIG9mIHRoZSB0aW1lci4KKyAqCisgKiBJbnB1dHMKKyAqIChlbmRwb2ludCwgYXNvYywgY2h1bmspCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgZGlzcG9zaXRpb24gb2YgdGhlIGNodW5rLgorICovCitzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zZl90aW1lcl9pZ25vcmUoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCQljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkJY29uc3Qgc2N0cF9zdWJ0eXBlX3QgdHlwZSwKKwkJCQkJdm9pZCAqYXJnLAorCQkJCQlzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJU0NUUF9ERUJVR19QUklOVEsoIlRpbWVyICVkIGlnbm9yZWQuXG4iLCB0eXBlLmNodW5rKTsKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9DT05TVU1FOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIDJuZCBMZXZlbCBBYnN0cmFjdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUHVsbCB0aGUgU0FDSyBjaHVuayBiYXNlZCBvbiB0aGUgU0FDSyBoZWFkZXIuICovCitzdGF0aWMgc3RydWN0IHNjdHBfc2Fja2hkciAqc2N0cF9zbV9wdWxsX3NhY2soc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rKQoreworCXN0cnVjdCBzY3RwX3NhY2toZHIgKnNhY2s7CisJdW5zaWduZWQgaW50IGxlbjsKKwlfX3UxNiBudW1fYmxvY2tzOworCV9fdTE2IG51bV9kdXBfdHNuczsKKworCS8qIFByb3RlY3Qgb3Vyc2VsdmVzIGZyb20gcmVhZGluZyB0b28gZmFyIGludG8KKwkgKiB0aGUgc2tiIGZyb20gYSBib2d1cyBzZW5kZXIuCisJICovCisJc2FjayA9IChzdHJ1Y3Qgc2N0cF9zYWNraGRyICopIGNodW5rLT5za2ItPmRhdGE7CisKKwludW1fYmxvY2tzID0gbnRvaHMoc2Fjay0+bnVtX2dhcF9hY2tfYmxvY2tzKTsKKwludW1fZHVwX3RzbnMgPSBudG9ocyhzYWNrLT5udW1fZHVwX3RzbnMpOworCWxlbiA9IHNpemVvZihzdHJ1Y3Qgc2N0cF9zYWNraGRyKTsKKwlsZW4gKz0gKG51bV9ibG9ja3MgKyBudW1fZHVwX3RzbnMpICogc2l6ZW9mKF9fdTMyKTsKKwlpZiAobGVuID4gY2h1bmstPnNrYi0+bGVuKQorCQlyZXR1cm4gTlVMTDsKKworCXNrYl9wdWxsKGNodW5rLT5za2IsIGxlbik7CisKKwlyZXR1cm4gc2FjazsKK30KKworLyogQ3JlYXRlIGFuIEFCT1JUIHBhY2tldCB0byBiZSBzZW50IGFzIGEgcmVzcG9uc2UsIHdpdGggdGhlIHNwZWNpZmllZAorICogZXJyb3IgY2F1c2VzLgorICovCitzdGF0aWMgc3RydWN0IHNjdHBfcGFja2V0ICpzY3RwX2Fib3J0X3BrdF9uZXcoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCSAgY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJICBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCisJCQkJICBjb25zdCB2b2lkICpwYXlsb2FkLAorCQkJCSAgc2l6ZV90IHBheWxlbikKK3sKKwlzdHJ1Y3Qgc2N0cF9wYWNrZXQgKnBhY2tldDsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqYWJvcnQ7CisKKwlwYWNrZXQgPSBzY3RwX29vdGJfcGt0X25ldyhhc29jLCBjaHVuayk7CisKKwlpZiAocGFja2V0KSB7CisJCS8qIE1ha2UgYW4gQUJPUlQuCisJCSAqIFRoZSBUIGJpdCB3aWxsIGJlIHNldCBpZiB0aGUgYXNvYyBpcyBOVUxMLgorCQkgKi8KKwkJYWJvcnQgPSBzY3RwX21ha2VfYWJvcnQoYXNvYywgY2h1bmssIHBheWxlbik7CisJCWlmICghYWJvcnQpIHsKKwkJCXNjdHBfb290Yl9wa3RfZnJlZShwYWNrZXQpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJLyogQWRkIHNwZWNpZmllZCBlcnJvciBjYXVzZXMsIGkuZS4sIHBheWxvYWQsIHRvIHRoZQorCQkgKiBlbmQgb2YgdGhlIGNodW5rLgorCQkgKi8KKwkJc2N0cF9hZGR0b19jaHVuayhhYm9ydCwgcGF5bGVuLCBwYXlsb2FkKTsKKworCQkvKiBTZXQgdGhlIHNrYiB0byB0aGUgYmVsb25naW5nIHNvY2sgZm9yIGFjY291bnRpbmcuICAqLworCQlhYm9ydC0+c2tiLT5zayA9IGVwLT5iYXNlLnNrOworCisJCXNjdHBfcGFja2V0X2FwcGVuZF9jaHVuayhwYWNrZXQsIGFib3J0KTsKKworCX0KKworCXJldHVybiBwYWNrZXQ7Cit9CisKKy8qIEFsbG9jYXRlIGEgcGFja2V0IGZvciByZXNwb25kaW5nIGluIHRoZSBPT1RCIGNvbmRpdGlvbnMuICAqLworc3RhdGljIHN0cnVjdCBzY3RwX3BhY2tldCAqc2N0cF9vb3RiX3BrdF9uZXcoY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJCSAgICAgY29uc3Qgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rKQoreworCXN0cnVjdCBzY3RwX3BhY2tldCAqcGFja2V0OworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0OworCV9fdTE2IHNwb3J0OworCV9fdTE2IGRwb3J0OworCV9fdTMyIHZ0YWc7CisKKwkvKiBHZXQgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9ydCBmcm9tIHRoZSBpbmJvdW5kIHBhY2tldC4gICovCisJc3BvcnQgPSBudG9ocyhjaHVuay0+c2N0cF9oZHItPmRlc3QpOworCWRwb3J0ID0gbnRvaHMoY2h1bmstPnNjdHBfaGRyLT5zb3VyY2UpOworCisJLyogVGhlIFYtdGFnIGlzIGdvaW5nIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBpbmJvdW5kIHBhY2tldCBpZiBubworCSAqIGFzc29jaWF0aW9uIGV4aXN0cywgb3RoZXJ3aXNlLCB1c2UgdGhlIHBlZXIncyB2dGFnLgorCSAqLworCWlmIChhc29jKSB7CisJCXZ0YWcgPSBhc29jLT5wZWVyLmkuaW5pdF90YWc7CisJfSBlbHNlIHsKKwkJLyogU3BlY2lhbCBjYXNlIHRoZSBJTklUIGFuZCBzdGFsZSBDT09LSUVfRUNITyBhcyB0aGVyZSBpcyBubworCQkgKiB2dGFnIHlldC4KKwkJICovCisJCXN3aXRjaChjaHVuay0+Y2h1bmtfaGRyLT50eXBlKSB7CisJCWNhc2UgU0NUUF9DSURfSU5JVDoKKwkJeworCQkJc2N0cF9pbml0X2NodW5rX3QgKmluaXQ7CisKKwkJCWluaXQgPSAoc2N0cF9pbml0X2NodW5rX3QgKiljaHVuay0+Y2h1bmtfaGRyOworCQkJdnRhZyA9IG50b2hsKGluaXQtPmluaXRfaGRyLmluaXRfdGFnKTsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CQorCQkJdnRhZyA9IG50b2hsKGNodW5rLT5zY3RwX2hkci0+dnRhZyk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIE1ha2UgYSB0cmFuc3BvcnQgZm9yIHRoZSBidWNrZXQsIEVsaXphLi4uICovCisJdHJhbnNwb3J0ID0gc2N0cF90cmFuc3BvcnRfbmV3KHNjdHBfc291cmNlKGNodW5rKSwgR0ZQX0FUT01JQyk7CisJaWYgKCF0cmFuc3BvcnQpCisJCWdvdG8gbm9tZW07CisKKwkvKiBDYWNoZSBhIHJvdXRlIGZvciB0aGUgdHJhbnNwb3J0IHdpdGggdGhlIGNodW5rJ3MgZGVzdGluYXRpb24gYXMKKwkgKiB0aGUgc291cmNlIGFkZHJlc3MuCisJICovCisJc2N0cF90cmFuc3BvcnRfcm91dGUodHJhbnNwb3J0LCAodW5pb24gc2N0cF9hZGRyICopJmNodW5rLT5kZXN0LAorCQkJICAgICBzY3RwX3NrKHNjdHBfZ2V0X2N0bF9zb2NrKCkpKTsKKworCXBhY2tldCA9IHNjdHBfcGFja2V0X2luaXQoJnRyYW5zcG9ydC0+cGFja2V0LCB0cmFuc3BvcnQsIHNwb3J0LCBkcG9ydCk7CisJcGFja2V0ID0gc2N0cF9wYWNrZXRfY29uZmlnKHBhY2tldCwgdnRhZywgMCk7CisKKwlyZXR1cm4gcGFja2V0OworCitub21lbToKKwlyZXR1cm4gTlVMTDsKK30KKworLyogRnJlZSB0aGUgcGFja2V0IGFsbG9jYXRlZCBlYXJsaWVyIGZvciByZXNwb25kaW5nIGluIHRoZSBPT1RCIGNvbmRpdGlvbi4gICovCit2b2lkIHNjdHBfb290Yl9wa3RfZnJlZShzdHJ1Y3Qgc2N0cF9wYWNrZXQgKnBhY2tldCkKK3sKKwlzY3RwX3RyYW5zcG9ydF9mcmVlKHBhY2tldC0+dHJhbnNwb3J0KTsKK30KKworLyogU2VuZCBhIHN0YWxlIGNvb2tpZSBlcnJvciB3aGVuIGEgaW52YWxpZCBDT09LSUUgRUNITyBjaHVuayBpcyBmb3VuZCAgKi8KK3N0YXRpYyB2b2lkIHNjdHBfc2VuZF9zdGFsZV9jb29raWVfZXJyKGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKKwkJCQkgICAgICAgc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2N0cF9jaHVuayAqZXJyX2NodW5rKQoreworCXN0cnVjdCBzY3RwX3BhY2tldCAqcGFja2V0OworCisJaWYgKGVycl9jaHVuaykgeworCQlwYWNrZXQgPSBzY3RwX29vdGJfcGt0X25ldyhhc29jLCBjaHVuayk7CisJCWlmIChwYWNrZXQpIHsKKwkJCXN0cnVjdCBzY3RwX3NpZ25lZF9jb29raWUgKmNvb2tpZTsKKworCQkJLyogT3ZlcnJpZGUgdGhlIE9PVEIgdnRhZyBmcm9tIHRoZSBjb29raWUuICovCisJCQljb29raWUgPSBjaHVuay0+c3ViaC5jb29raWVfaGRyOworCQkJcGFja2V0LT52dGFnID0gY29va2llLT5jLnBlZXJfdnRhZzsKKwkJCQorCQkJLyogU2V0IHRoZSBza2IgdG8gdGhlIGJlbG9uZ2luZyBzb2NrIGZvciBhY2NvdW50aW5nLiAqLworCQkJZXJyX2NodW5rLT5za2ItPnNrID0gZXAtPmJhc2Uuc2s7CisJCQlzY3RwX3BhY2tldF9hcHBlbmRfY2h1bmsocGFja2V0LCBlcnJfY2h1bmspOworCQkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9TRU5EX1BLVCwKKwkJCQkJU0NUUF9QQUNLRVQocGFja2V0KSk7CisJCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9PVVRDVFJMQ0hVTktTKTsKKwkJfSBlbHNlCisJCQlzY3RwX2NodW5rX2ZyZWUgKGVycl9jaHVuayk7CisJfQorfQorCisKKy8qIFByb2Nlc3MgYSBkYXRhIGNodW5rICovCitzdGF0aWMgaW50IHNjdHBfZWF0X2RhdGEoY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLAorCQkJIHNjdHBfY21kX3NlcV90ICpjb21tYW5kcykKK3sKKwlzY3RwX2RhdGFoZHJfdCAqZGF0YV9oZHI7CisJc3RydWN0IHNjdHBfY2h1bmsgKmVycjsKKwlzaXplX3QgZGF0YWxlbjsKKwlzY3RwX3ZlcmJfdCBkZWxpdmVyOworCWludCB0bXA7CisJX191MzIgdHNuOworCisJZGF0YV9oZHIgPSBjaHVuay0+c3ViaC5kYXRhX2hkciA9IChzY3RwX2RhdGFoZHJfdCAqKWNodW5rLT5za2ItPmRhdGE7CisJc2tiX3B1bGwoY2h1bmstPnNrYiwgc2l6ZW9mKHNjdHBfZGF0YWhkcl90KSk7CisKKwl0c24gPSBudG9obChkYXRhX2hkci0+dHNuKTsKKwlTQ1RQX0RFQlVHX1BSSU5USygiZWF0X2RhdGE6IFRTTiAweCV4LlxuIiwgdHNuKTsKKworCS8qIEFTU0VSVDogIE5vdyBza2ItPmRhdGEgaXMgcmVhbGx5IHRoZSB1c2VyIGRhdGEuICAqLworCisJLyogUHJvY2VzcyBFQ04gYmFzZWQgY29uZ2VzdGlvbi4KKwkgKgorCSAqIFNpbmNlIHRoZSBjaHVuayBzdHJ1Y3R1cmUgaXMgcmV1c2VkIGZvciBhbGwgY2h1bmtzIHdpdGhpbgorCSAqIGEgcGFja2V0LCB3ZSB1c2UgZWNuX2NlX2RvbmUgdG8gdHJhY2sgaWYgd2UndmUgYWxyZWFkeQorCSAqIGRvbmUgQ0UgcHJvY2Vzc2luZyBmb3IgdGhpcyBwYWNrZXQuCisJICoKKwkgKiBXZSBuZWVkIHRvIGRvIEVDTiBwcm9jZXNzaW5nIGV2ZW4gaWYgd2UgcGxhbiB0byBkaXNjYXJkIHRoZQorCSAqIGNodW5rIGxhdGVyLgorCSAqLworCisJaWYgKCFjaHVuay0+ZWNuX2NlX2RvbmUpIHsKKwkJc3RydWN0IHNjdHBfYWYgKmFmOworCQljaHVuay0+ZWNuX2NlX2RvbmUgPSAxOworCisJCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoCisJCQlpcHZlcjJhZihjaHVuay0+c2tiLT5uaC5pcGgtPnZlcnNpb24pKTsKKworCQlpZiAoYWYgJiYgYWYtPmlzX2NlKGNodW5rLT5za2IpICYmIGFzb2MtPnBlZXIuZWNuX2NhcGFibGUpIHsKKwkJCS8qIERvIHJlYWwgd29yayBhcyBzaWRlZmZlY3QuICovCisJCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0VDTl9DRSwKKwkJCQkJU0NUUF9VMzIodHNuKSk7CisJCX0KKwl9CisKKwl0bXAgPSBzY3RwX3Rzbm1hcF9jaGVjaygmYXNvYy0+cGVlci50c25fbWFwLCB0c24pOworCWlmICh0bXAgPCAwKSB7CisJCS8qIFRoZSBUU04gaXMgdG9vIGhpZ2gtLXNpbGVudGx5IGRpc2NhcmQgdGhlIGNodW5rIGFuZAorCQkgKiBjb3VudCBvbiBpdCBnZXR0aW5nIHJldHJhbnNtaXR0ZWQgbGF0ZXIuCisJCSAqLworCQlyZXR1cm4gU0NUUF9JRVJST1JfSElHSF9UU047CisJfSBlbHNlIGlmICh0bXAgPiAwKSB7CisJCS8qIFRoaXMgaXMgYSBkdXBsaWNhdGUuICBSZWNvcmQgaXQuICAqLworCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1JFUE9SVF9EVVAsIFNDVFBfVTMyKHRzbikpOworCQlyZXR1cm4gU0NUUF9JRVJST1JfRFVQX1RTTjsKKwl9CisKKwkvKiBUaGlzIGlzIGEgbmV3IFRTTi4gICovCisKKwkvKiBEaXNjYXJkIGlmIHRoZXJlIGlzIG5vIHJvb20gaW4gdGhlIHJlY2VpdmUgd2luZG93LgorCSAqIEFjdHVhbGx5LCBhbGxvdyBhIGxpdHRsZSBiaXQgb2Ygb3ZlcmZsb3cgKHVwIHRvIGEgTVRVKS4KKwkgKi8KKwlkYXRhbGVuID0gbnRvaHMoY2h1bmstPmNodW5rX2hkci0+bGVuZ3RoKTsKKwlkYXRhbGVuIC09IHNpemVvZihzY3RwX2RhdGFfY2h1bmtfdCk7CisKKwlkZWxpdmVyID0gU0NUUF9DTURfQ0hVTktfVUxQOworCisJLyogVGhpbmsgYWJvdXQgcGFydGlhbCBkZWxpdmVyeS4gKi8KKwlpZiAoKGRhdGFsZW4gPj0gYXNvYy0+cnduZCkgJiYgKCFhc29jLT51bHBxLnBkX21vZGUpKSB7CisKKwkJLyogRXZlbiBpZiB3ZSBkb24ndCBhY2NlcHQgdGhpcyBjaHVuayB0aGVyZSBpcworCQkgKiBtZW1vcnkgcHJlc3N1cmUuCisJCSAqLworCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1BBUlRfREVMSVZFUiwgU0NUUF9OVUxMKCkpOworCX0KKworICAgICAgICAvKiBTcGlsbCBvdmVyIHJ3bmQgYSBsaXR0bGUgYml0LiAgTm90ZTogV2hpbGUgYWxsb3dlZCwgdGhpcyBzcGlsbCBvdmVyCisJICogc2VlbXMgYSBiaXQgdHJvdWJsZXNvbWUgaW4gdGhhdCBmcmFnX3BvaW50IHZhcmllcyBiYXNlZCBvbgorCSAqIFBNVFUuICBJbiBjYXNlcywgc3VjaCBhcyBsb29wYmFjaywgdGhpcyBtaWdodCBiZSBhIHJhdGhlcgorCSAqIGxhcmdlIHNwaWxsIG92ZXIuCisJICovCisJaWYgKCFhc29jLT5yd25kIHx8IGFzb2MtPnJ3bmRfb3ZlciB8fAorCSAgICAoZGF0YWxlbiA+IGFzb2MtPnJ3bmQgKyBhc29jLT5mcmFnX3BvaW50KSkgeworCisJCS8qIElmIHRoaXMgaXMgdGhlIG5leHQgVFNOLCBjb25zaWRlciByZW5lZ2luZyB0byBtYWtlCisJCSAqIHJvb20uICAgTm90ZTogUGxheWluZyBuaWNlIHdpdGggYSBjb25mdXNlZCBzZW5kZXIuICBBCisJCSAqIG1hbGljaW91cyBzZW5kZXIgY2FuIHN0aWxsIGVhdCB1cCBhbGwgb3VyIGJ1ZmZlcgorCQkgKiBzcGFjZSBhbmQgaW4gdGhlIGZ1dHVyZSB3ZSBtYXkgd2FudCB0byBkZXRlY3QgYW5kCisJCSAqIGRvIG1vcmUgZHJhc3RpYyByZW5lZ2luZy4KKwkJICovCisJCWlmIChzY3RwX3Rzbm1hcF9oYXNfZ2FwKCZhc29jLT5wZWVyLnRzbl9tYXApICYmCisJCSAgICAoc2N0cF90c25tYXBfZ2V0X2N0c24oJmFzb2MtPnBlZXIudHNuX21hcCkgKyAxKSA9PSB0c24pIHsKKwkJCVNDVFBfREVCVUdfUFJJTlRLKCJSZW5lZ2luZyBmb3IgdHNuOiV1XG4iLCB0c24pOworCQkJZGVsaXZlciA9IFNDVFBfQ01EX1JFTkVHRTsKKwkJfSBlbHNlIHsKKwkJCVNDVFBfREVCVUdfUFJJTlRLKCJEaXNjYXJkIHRzbjogJXUgbGVuOiAlWmQsICIKKwkJCQkJICAicnduZDogJWRcbiIsIHRzbiwgZGF0YWxlbiwKKwkJCQkJICBhc29jLT5yd25kKTsKKwkJCXJldHVybiBTQ1RQX0lFUlJPUl9JR05PUkVfVFNOOworCQl9CisJfQorCisJLyoKKwkgKiBTZWN0aW9uIDMuMy4xMC45IE5vIFVzZXIgRGF0YSAoOSkKKwkgKgorCSAqIENhdXNlIG9mIGVycm9yCisJICogLS0tLS0tLS0tLS0tLS0tCisJICogTm8gVXNlciBEYXRhOiAgVGhpcyBlcnJvciBjYXVzZSBpcyByZXR1cm5lZCB0byB0aGUgb3JpZ2luYXRvciBvZiBhCisJICogREFUQSBjaHVuayBpZiBhIHJlY2VpdmVkIERBVEEgY2h1bmsgaGFzIG5vIHVzZXIgZGF0YS4KKwkgKi8KKwlpZiAodW5saWtlbHkoMCA9PSBkYXRhbGVuKSkgeworCQllcnIgPSBzY3RwX21ha2VfYWJvcnRfbm9fZGF0YShhc29jLCBjaHVuaywgdHNuKTsKKwkJaWYgKGVycikgeworCQkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9SRVBMWSwKKwkJCQkJU0NUUF9DSFVOSyhlcnIpKTsKKwkJfQorCQkvKiBXZSBhcmUgZ29pbmcgdG8gQUJPUlQsIHNvIHdlIG1pZ2h0IGFzIHdlbGwgc3RvcAorCQkgKiBwcm9jZXNzaW5nIHRoZSByZXN0IG9mIHRoZSBjaHVua3MgaW4gdGhlIHBhY2tldC4KKwkJICovCisJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfRElTQ0FSRF9QQUNLRVQsU0NUUF9OVUxMKCkpOworCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0FTU09DX0ZBSUxFRCwKKwkJCQlTQ1RQX1UzMihTQ1RQX0VSUk9SX05PX0RBVEEpKTsKKwkJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfQUJPUlRFRFMpOworCQlTQ1RQX0RFQ19TVEFUUyhTQ1RQX01JQl9DVVJSRVNUQUIpOworCQlyZXR1cm4gU0NUUF9JRVJST1JfTk9fREFUQTsKKwl9CisKKwkvKiBJZiBkZWZpbmF0ZWx5IGFjY2VwdGluZyB0aGUgREFUQSBjaHVuaywgcmVjb3JkIGl0cyBUU04sIG90aGVyd2lzZQorCSAqIHdhaXQgZm9yIHJlbmVnZSBwcm9jZXNzaW5nLgorCSAqLworCWlmIChTQ1RQX0NNRF9DSFVOS19VTFAgPT0gZGVsaXZlcikKKwkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9SRVBPUlRfVFNOLCBTQ1RQX1UzMih0c24pKTsKKworCS8qIE5vdGU6IFNvbWUgY2h1bmtzIG1heSBnZXQgb3ZlcmNvdW50ZWQgKGlmIHdlIGRyb3ApIG9yIG92ZXJjb3VudGVkCisJICogaWYgd2UgcmVuZWdlIGFuZCB0aGUgY2h1bmsgYXJyaXZlcyBhZ2Fpbi4KKwkgKi8KKwlpZiAoY2h1bmstPmNodW5rX2hkci0+ZmxhZ3MgJiBTQ1RQX0RBVEFfVU5PUkRFUkVEKQorCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9JTlVOT1JERVJDSFVOS1MpOworCWVsc2UKKwkJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfSU5PUkRFUkNIVU5LUyk7CisKKwkvKiBSRkMgMjk2MCA2LjUgU3RyZWFtIElkZW50aWZpZXIgYW5kIFN0cmVhbSBTZXF1ZW5jZSBOdW1iZXIKKwkgKgorCSAqIElmIGFuIGVuZHBvaW50IHJlY2VpdmUgYSBEQVRBIGNodW5rIHdpdGggYW4gaW52YWxpZCBzdHJlYW0KKwkgKiBpZGVudGlmaWVyLCBpdCBzaGFsbCBhY2tub3dsZWRnZSB0aGUgcmVjZXB0aW9uIG9mIHRoZSBEQVRBIGNodW5rCisJICogZm9sbG93aW5nIHRoZSBub3JtYWwgcHJvY2VkdXJlLCBpbW1lZGlhdGVseSBzZW5kIGFuIEVSUk9SIGNodW5rCisJICogd2l0aCBjYXVzZSBzZXQgdG8gIkludmFsaWQgU3RyZWFtIElkZW50aWZpZXIiIChTZWUgU2VjdGlvbiAzLjMuMTApCisJICogYW5kIGRpc2NhcmQgdGhlIERBVEEgY2h1bmsuCisJICovCisJaWYgKG50b2hzKGRhdGFfaGRyLT5zdHJlYW0pID49IGFzb2MtPmMuc2luaXRfbWF4X2luc3RyZWFtcykgeworCQllcnIgPSBzY3RwX21ha2Vfb3BfZXJyb3IoYXNvYywgY2h1bmssIFNDVFBfRVJST1JfSU5WX1NUUk0sCisJCQkJCSAmZGF0YV9oZHItPnN0cmVhbSwKKwkJCQkJIHNpemVvZihkYXRhX2hkci0+c3RyZWFtKSk7CisJCWlmIChlcnIpCisJCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1JFUExZLAorCQkJCQlTQ1RQX0NIVU5LKGVycikpOworCQlyZXR1cm4gU0NUUF9JRVJST1JfQkFEX1NUUkVBTTsKKwl9CisKKwkvKiBTZW5kIHRoZSBkYXRhIHVwIHRvIHRoZSB1c2VyLiAgTm90ZTogIFNjaGVkdWxlICB0aGUKKwkgKiBTQ1RQX0NNRF9DSFVOS19VTFAgY21kIGJlZm9yZSB0aGUgU0NUUF9DTURfR0VOX1NBQ0ssIGFzIHRoZSBTQUNLCisJICogY2h1bmsgbmVlZHMgdGhlIHVwZGF0ZWQgcnduZC4KKwkgKi8KKwlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIGRlbGl2ZXIsIFNDVFBfQ0hVTksoY2h1bmspKTsKKworCXJldHVybiBTQ1RQX0lFUlJPUl9OT19FUlJPUjsKK30KZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NtX3N0YXRldGFibGUuYyBiL25ldC9zY3RwL3NtX3N0YXRldGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTY3ODQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjdHAvc21fc3RhdGV0YWJsZS5jCkBAIC0wLDAgKzEsMTAwNCBAQAorLyogU0NUUCBrZXJuZWwgcmVmZXJlbmNlIEltcGxlbWVudGF0aW9uCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxLCAyMDA0CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMCBDaXNjbywgSW5jLgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgTW90b3JvbGEsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChjKSAyMDAxIE5va2lhLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFNDVFAga2VybmVsIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbgorICoKKyAqIFRoZXNlIGFyZSB0aGUgc3RhdGUgdGFibGVzIGZvciB0aGUgU0NUUCBzdGF0ZSBtYWNoaW5lLgorICoKKyAqIFRoZSBTQ1RQIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoZSBTQ1RQIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0CisgKiB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAqICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogUGxlYXNlIHNlbmQgYW55IGJ1ZyByZXBvcnRzIG9yIGZpeGVzIHlvdSBtYWtlIHRvIHRoZQorICogZW1haWwgYWRkcmVzcyhlcyk6CisgKiAgICBsa3NjdHAgZGV2ZWxvcGVycyA8bGtzY3RwLWRldmVsb3BlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIE9yIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHdlYnNpdGU6CisgKiAgICBodHRwOi8vd3d3LnNmLm5ldC9wcm9qZWN0cy9sa3NjdHAKKyAqCisgKiBXcml0dGVuIG9yIG1vZGlmaWVkIGJ5OgorICogICAgTGEgTW9udGUgSC5QLiBZYXJyb2xsIDxwaWdneUBhY20ub3JnPgorICogICAgS2FybCBLbnV0c29uICAgICAgICAgIDxrYXJsQGF0aGVuYS5jaGljYWdvLmlsLnVzPgorICogICAgSm9uIEdyaW1tICAgICAgICAgICAgIDxqZ3JpbW1AdXMuaWJtLmNvbT4KKyAqICAgIEh1aSBIdWFuZwkJICAgIDxodWkuaHVhbmdAbm9raWEuY29tPgorICogICAgRGFpc3kgQ2hhbmcJICAgIDxkYWlzeWNAdXMuaWJtLmNvbT4KKyAqICAgIEFyZGVsbGUgRmFuCSAgICA8YXJkZWxsZS5mYW5AaW50ZWwuY29tPgorICogICAgU3JpZGhhciBTYW11ZHJhbGEJICAgIDxzcmlAdXMuaWJtLmNvbT4KKyAqCisgKiBBbnkgYnVncyByZXBvcnRlZCBnaXZlbiB0byB1cyB3ZSB3aWxsIHRyeSB0byBmaXguLi4gYW55IGZpeGVzIHNoYXJlZCB3aWxsCisgKiBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbmV4dCBTQ1RQIHJlbGVhc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zY3RwL3NjdHAuaD4KKyNpbmNsdWRlIDxuZXQvc2N0cC9zbS5oPgorCitzdGF0aWMgY29uc3Qgc2N0cF9zbV90YWJsZV9lbnRyeV90CitwcmltaXRpdmVfZXZlbnRfdGFibGVbU0NUUF9OVU1fUFJJTUlUSVZFX1RZUEVTXVtTQ1RQX1NUQVRFX05VTV9TVEFURVNdOworc3RhdGljIGNvbnN0IHNjdHBfc21fdGFibGVfZW50cnlfdAorb3RoZXJfZXZlbnRfdGFibGVbU0NUUF9OVU1fT1RIRVJfVFlQRVNdW1NDVFBfU1RBVEVfTlVNX1NUQVRFU107CitzdGF0aWMgY29uc3Qgc2N0cF9zbV90YWJsZV9lbnRyeV90Cit0aW1lb3V0X2V2ZW50X3RhYmxlW1NDVFBfTlVNX1RJTUVPVVRfVFlQRVNdW1NDVFBfU1RBVEVfTlVNX1NUQVRFU107CisKK3N0YXRpYyBjb25zdCBzY3RwX3NtX3RhYmxlX2VudHJ5X3QgKnNjdHBfY2h1bmtfZXZlbnRfbG9va3VwKHNjdHBfY2lkX3QgY2lkLAorCQkJCQkJCSAgICBzY3RwX3N0YXRlX3Qgc3RhdGUpOworCisKK3N0YXRpYyBjb25zdCBzY3RwX3NtX3RhYmxlX2VudHJ5X3QgYnVnID0geworCS5mbiA9IHNjdHBfc2ZfYnVnLAorCS5uYW1lID0gInNjdHBfc2ZfYnVnIgorfTsKKworI2RlZmluZSBET19MT09LVVAoX21heCwgX3R5cGUsIF90YWJsZSkgXAorCWlmICgoZXZlbnRfc3VidHlwZS5fdHlwZSA+IChfbWF4KSkpIHsgXAorCQlwcmludGsoS0VSTl9XQVJOSU5HIFwKKwkJICAgICAgICJzY3RwIHRhYmxlICVwIHBvc3NpYmxlIGF0dGFjazoiIFwKKwkJICAgICAgICIgZXZlbnQgJWQgZXhjZWVkcyBtYXggJWRcbiIsIFwKKwkJICAgICAgIF90YWJsZSwgZXZlbnRfc3VidHlwZS5fdHlwZSwgX21heCk7IFwKKwkJcmV0dXJuICZidWc7IFwKKwl9IFwKKwlyZXR1cm4gJl90YWJsZVtldmVudF9zdWJ0eXBlLl90eXBlXVsoaW50KXN0YXRlXTsKKworY29uc3Qgc2N0cF9zbV90YWJsZV9lbnRyeV90ICpzY3RwX3NtX2xvb2t1cF9ldmVudChzY3RwX2V2ZW50X3QgZXZlbnRfdHlwZSwKKwkJCQkJCSAgc2N0cF9zdGF0ZV90IHN0YXRlLAorCQkJCQkJICBzY3RwX3N1YnR5cGVfdCBldmVudF9zdWJ0eXBlKQoreworCXN3aXRjaCAoZXZlbnRfdHlwZSkgeworCWNhc2UgU0NUUF9FVkVOVF9UX0NIVU5LOgorCQlyZXR1cm4gc2N0cF9jaHVua19ldmVudF9sb29rdXAoZXZlbnRfc3VidHlwZS5jaHVuaywgc3RhdGUpOworCQlicmVhazsKKwljYXNlIFNDVFBfRVZFTlRfVF9USU1FT1VUOgorCQlET19MT09LVVAoU0NUUF9FVkVOVF9USU1FT1VUX01BWCwgdGltZW91dCwKKwkJCSAgdGltZW91dF9ldmVudF90YWJsZSk7CisJCWJyZWFrOworCisJY2FzZSBTQ1RQX0VWRU5UX1RfT1RIRVI6CisJCURPX0xPT0tVUChTQ1RQX0VWRU5UX09USEVSX01BWCwgb3RoZXIsIG90aGVyX2V2ZW50X3RhYmxlKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDVFBfRVZFTlRfVF9QUklNSVRJVkU6CisJCURPX0xPT0tVUChTQ1RQX0VWRU5UX1BSSU1JVElWRV9NQVgsIHByaW1pdGl2ZSwKKwkJCSAgcHJpbWl0aXZlX2V2ZW50X3RhYmxlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBZaWtlcyEgIFdlIGdvdCBhbiBpbGxlZ2FsIGV2ZW50IHR5cGUuICAqLworCQlyZXR1cm4gJmJ1ZzsKKwl9OworfQorCisjZGVmaW5lIFRZUEVfU0NUUF9EQVRBIHsgXAorCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAorCXsuZm4gPSBzY3RwX3NmX29vdGIsIC5uYW1lID0gInNjdHBfc2Zfb290YiJ9LCBcCisJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RhYm9ydF84XzRfOCwgLm5hbWUgPSAic2N0cF9zZl90YWJvcnRfOF80XzgifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKKwl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2VhdF9kYXRhXzZfMiwgLm5hbWUgPSAic2N0cF9zZl9lYXRfZGF0YV82XzIifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZWF0X2RhdGFfNl8yLCAubmFtZSA9ICJzY3RwX3NmX2VhdF9kYXRhXzZfMiJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKKwl7LmZuID0gc2N0cF9zZl9lYXRfZGF0YV9mYXN0XzRfNCwgLm5hbWUgPSAic2N0cF9zZl9lYXRfZGF0YV9mYXN0XzRfNCJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKKwl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorfSAvKiBUWVBFX1NDVFBfREFUQSAqLworCisjZGVmaW5lIFRZUEVfU0NUUF9JTklUIHsgXAorCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKKwl7LmZuID0gc2N0cF9zZl9kb181XzFCX2luaXQsIC5uYW1lID0gInNjdHBfc2ZfZG9fNV8xQl9pbml0In0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKKwl7LmZuID0gc2N0cF9zZl9kb181XzJfMV9zaW1pbml0LCAubmFtZSA9ICJzY3RwX3NmX2RvXzVfMl8xX3NpbWluaXQifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZG9fNV8yXzFfc2ltaW5pdCwgLm5hbWUgPSAic2N0cF9zZl9kb181XzJfMV9zaW1pbml0In0sIFwKKwkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKKwl7LmZuID0gc2N0cF9zZl9kb181XzJfMl9kdXBpbml0LCAubmFtZSA9ICJzY3RwX3NmX2RvXzVfMl8yX2R1cGluaXQifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZG9fNV8yXzJfZHVwaW5pdCwgLm5hbWUgPSAic2N0cF9zZl9kb181XzJfMl9kdXBpbml0In0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2RvXzVfMl8yX2R1cGluaXQsIC5uYW1lID0gInNjdHBfc2ZfZG9fNV8yXzJfZHVwaW5pdCJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZG9fNV8yXzJfZHVwaW5pdCwgLm5hbWUgPSAic2N0cF9zZl9kb181XzJfMl9kdXBpbml0In0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKKwl7LmZuID0gc2N0cF9zZl9kb185XzJfcmVzaHV0YWNrLCAubmFtZSA9ICJzY3RwX3NmX2RvXzlfMl9yZXNodXRhY2sifSwgXAorfSAvKiBUWVBFX1NDVFBfSU5JVCAqLworCisjZGVmaW5lIFRZUEVfU0NUUF9JTklUX0FDSyB7IFwKKwkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKKwl7LmZuID0gc2N0cF9zZl9vb3RiLCAubmFtZSA9ICJzY3RwX3NmX29vdGIifSwgXAorCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKKwl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2RvXzVfMUNfYWNrLCAubmFtZSA9ICJzY3RwX3NmX2RvXzVfMUNfYWNrIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKKwl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKK30gLyogVFlQRV9TQ1RQX0lOSVRfQUNLICovCisKKyNkZWZpbmUgVFlQRV9TQ1RQX1NBQ0sgeyBcCisJLyogIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAorCXsuZm4gPSBzY3RwX3NmX29vdGIsIC5uYW1lID0gInNjdHBfc2Zfb290YiJ9LCBcCisJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RhYm9ydF84XzRfOCwgLm5hbWUgPSAic2N0cF9zZl90YWJvcnRfOF80XzgifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKKwl7LmZuID0gc2N0cF9zZl9lYXRfc2Fja182XzIsIC5uYW1lID0gInNjdHBfc2ZfZWF0X3NhY2tfNl8yIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKKwl7LmZuID0gc2N0cF9zZl9lYXRfc2Fja182XzIsIC5uYW1lID0gInNjdHBfc2ZfZWF0X3NhY2tfNl8yIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2VhdF9zYWNrXzZfMiwgLm5hbWUgPSAic2N0cF9zZl9lYXRfc2Fja182XzIifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKKwl7LmZuID0gc2N0cF9zZl9lYXRfc2Fja182XzIsIC5uYW1lID0gInNjdHBfc2ZfZWF0X3NhY2tfNl8yIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKKwl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorfSAvKiBUWVBFX1NDVFBfU0FDSyAqLworCisjZGVmaW5lIFRZUEVfU0NUUF9IRUFSVEJFQVQgeyBcCisJLyogIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAorCXsuZm4gPSBzY3RwX3NmX29vdGIsIC5uYW1lID0gInNjdHBfc2Zfb290YiJ9LCBcCisJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RhYm9ydF84XzRfOCwgLm5hbWUgPSAic2N0cF9zZl90YWJvcnRfOF80XzgifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKKwl7LmZuID0gc2N0cF9zZl9iZWF0XzhfMywgLm5hbWUgPSAic2N0cF9zZl9iZWF0XzhfMyJ9LCBcCisJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfYmVhdF84XzMsIC5uYW1lID0gInNjdHBfc2ZfYmVhdF84XzMifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCisJey5mbiA9IHNjdHBfc2ZfYmVhdF84XzMsIC5uYW1lID0gInNjdHBfc2ZfYmVhdF84XzMifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfYmVhdF84XzMsIC5uYW1lID0gInNjdHBfc2ZfYmVhdF84XzMifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2JlYXRfOF8zLCAubmFtZSA9ICJzY3RwX3NmX2JlYXRfOF8zIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKKwkvKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCBidXQgd2UgYXJlIG5pY2UuICAqLyBcCisJey5mbiA9IHNjdHBfc2ZfYmVhdF84XzMsIC5uYW1lID0gInNjdHBfc2ZfYmVhdF84XzMifSwgXAorfSAvKiBUWVBFX1NDVFBfSEVBUlRCRUFUICovCisKKyNkZWZpbmUgVFlQRV9TQ1RQX0hFQVJUQkVBVF9BQ0sgeyBcCisJLyogIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAorCXsuZm4gPSBzY3RwX3NmX29vdGIsIC5uYW1lID0gInNjdHBfc2Zfb290YiJ9LCBcCisJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RhYm9ydF84XzRfOCwgLm5hbWUgPSAic2N0cF9zZl90YWJvcnRfOF80XzgifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3Zpb2xhdGlvbiwgLm5hbWUgPSAic2N0cF9zZl92aW9sYXRpb24ifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKKwl7LmZuID0gc2N0cF9zZl9iYWNrYmVhdF84XzMsIC5uYW1lID0gInNjdHBfc2ZfYmFja2JlYXRfOF8zIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2JhY2tiZWF0XzhfMywgLm5hbWUgPSAic2N0cF9zZl9iYWNrYmVhdF84XzMifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfYmFja2JlYXRfOF8zLCAubmFtZSA9ICJzY3RwX3NmX2JhY2tiZWF0XzhfMyJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfYmFja2JlYXRfOF8zLCAubmFtZSA9ICJzY3RwX3NmX2JhY2tiZWF0XzhfMyJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKK30gLyogVFlQRV9TQ1RQX0hFQVJUQkVBVF9BQ0sgKi8KKworI2RlZmluZSBUWVBFX1NDVFBfQUJPUlQgeyBcCisJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCisJey5mbiA9IHNjdHBfc2Zfb290YiwgLm5hbWUgPSAic2N0cF9zZl9vb3RiIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfcGRpc2NhcmQsIC5uYW1lID0gInNjdHBfc2ZfcGRpc2NhcmQifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Nvb2tpZV93YWl0X2Fib3J0LCAubmFtZSA9ICJzY3RwX3NmX2Nvb2tpZV93YWl0X2Fib3J0In0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Nvb2tpZV9lY2hvZWRfYWJvcnQsIFwKKwkgLm5hbWUgPSAic2N0cF9zZl9jb29raWVfZWNob2VkX2Fib3J0In0sIFwKKwkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKKwl7LmZuID0gc2N0cF9zZl9kb185XzFfYWJvcnQsIC5uYW1lID0gInNjdHBfc2ZfZG9fOV8xX2Fib3J0In0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3NodXRkb3duX3BlbmRpbmdfYWJvcnQsIFwKKwkubmFtZSA9ICJzY3RwX3NmX3NodXRkb3duX3BlbmRpbmdfYWJvcnQifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2Zfc2h1dGRvd25fc2VudF9hYm9ydCwgXAorCS5uYW1lID0gInNjdHBfc2Zfc2h1dGRvd25fc2VudF9hYm9ydCJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZG9fOV8xX2Fib3J0LCAubmFtZSA9ICJzY3RwX3NmX2RvXzlfMV9hYm9ydCJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2Zfc2h1dGRvd25fYWNrX3NlbnRfYWJvcnQsIFwKKwkubmFtZSA9ICJzY3RwX3NmX3NodXRkb3duX2Fja19zZW50X2Fib3J0In0sIFwKK30gLyogVFlQRV9TQ1RQX0FCT1JUICovCisKKyNkZWZpbmUgVFlQRV9TQ1RQX1NIVVRET1dOIHsgXAorCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAorCXsuZm4gPSBzY3RwX3NmX29vdGIsIC5uYW1lID0gInNjdHBfc2Zfb290YiJ9LCBcCisJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RhYm9ydF84XzRfOCwgLm5hbWUgPSAic2N0cF9zZl90YWJvcnRfOF80XzgifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKKwl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2RvXzlfMl9zaHV0ZG93biwgLm5hbWUgPSAic2N0cF9zZl9kb185XzJfc2h1dGRvd24ifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2RvXzlfMl9zaHV0ZG93bl9hY2ssIFwKKwkgLm5hbWUgPSAic2N0cF9zZl9kb185XzJfc2h1dGRvd25fYWNrIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKKwl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCit9IC8qIFRZUEVfU0NUUF9TSFVURE9XTiAqLworCisjZGVmaW5lIFRZUEVfU0NUUF9TSFVURE9XTl9BQ0sgeyBcCisJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCisJey5mbiA9IHNjdHBfc2Zfb290YiwgLm5hbWUgPSAic2N0cF9zZl9vb3RiIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCisJey5mbiA9IHNjdHBfc2Zfb290YiwgLm5hbWUgPSAic2N0cF9zZl9vb3RiIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKKwl7LmZuID0gc2N0cF9zZl9kb184XzVfMV9FX3NhLCAubmFtZSA9ICJzY3RwX3NmX2RvXzhfNV8xX0Vfc2EifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZG9fOF81XzFfRV9zYSwgLm5hbWUgPSAic2N0cF9zZl9kb184XzVfMV9FX3NhIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKKwl7LmZuID0gc2N0cF9zZl92aW9sYXRpb24sIC5uYW1lID0gInNjdHBfc2ZfdmlvbGF0aW9uIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3Zpb2xhdGlvbiwgLm5hbWUgPSAic2N0cF9zZl92aW9sYXRpb24ifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZG9fOV8yX2ZpbmFsLCAubmFtZSA9ICJzY3RwX3NmX2RvXzlfMl9maW5hbCJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdmlvbGF0aW9uLCAubmFtZSA9ICJzY3RwX3NmX3Zpb2xhdGlvbiJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZG9fOV8yX2ZpbmFsLCAubmFtZSA9ICJzY3RwX3NmX2RvXzlfMl9maW5hbCJ9LCBcCit9IC8qIFRZUEVfU0NUUF9TSFVURE9XTl9BQ0sgKi8KKworI2RlZmluZSBUWVBFX1NDVFBfRVJST1IgeyBcCisJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCisJey5mbiA9IHNjdHBfc2Zfb290YiwgLm5hbWUgPSAic2N0cF9zZl9vb3RiIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdGFib3J0XzhfNF84LCAubmFtZSA9ICJzY3RwX3NmX3RhYm9ydF84XzRfOCJ9LCBcCisJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Nvb2tpZV9lY2hvZWRfZXJyLCAubmFtZSA9ICJzY3RwX3NmX2Nvb2tpZV9lY2hvZWRfZXJyIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKKwl7LmZuID0gc2N0cF9zZl9vcGVycl9ub3RpZnksIC5uYW1lID0gInNjdHBfc2Zfb3BlcnJfbm90aWZ5In0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAorCXsuZm4gPSBzY3RwX3NmX29wZXJyX25vdGlmeSwgLm5hbWUgPSAic2N0cF9zZl9vcGVycl9ub3RpZnkifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKKwl7LmZuID0gc2N0cF9zZl9vcGVycl9ub3RpZnksIC5uYW1lID0gInNjdHBfc2Zfb3BlcnJfbm90aWZ5In0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKKwl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorfSAvKiBUWVBFX1NDVFBfRVJST1IgKi8KKworI2RlZmluZSBUWVBFX1NDVFBfQ09PS0lFX0VDSE8geyBcCisJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCisJey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCisJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2RvXzVfMURfY2UsIC5uYW1lID0gInNjdHBfc2ZfZG9fNV8xRF9jZSJ9LCBcCisJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZG9fNV8yXzRfZHVwY29vaywgLm5hbWUgPSAic2N0cF9zZl9kb181XzJfNF9kdXBjb29rIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2RvXzVfMl80X2R1cGNvb2ssIC5uYW1lID0gInNjdHBfc2ZfZG9fNV8yXzRfZHVwY29vayJ9LCBcCisJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZG9fNV8yXzRfZHVwY29vaywgLm5hbWUgPSAic2N0cF9zZl9kb181XzJfNF9kdXBjb29rIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2RvXzVfMl80X2R1cGNvb2ssIC5uYW1lID0gInNjdHBfc2ZfZG9fNV8yXzRfZHVwY29vayJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKKwl7LmZuID0gc2N0cF9zZl9kb181XzJfNF9kdXBjb29rLCAubmFtZSA9ICJzY3RwX3NmX2RvXzVfMl80X2R1cGNvb2sifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2RvXzVfMl80X2R1cGNvb2ssIC5uYW1lID0gInNjdHBfc2ZfZG9fNV8yXzRfZHVwY29vayJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZG9fNV8yXzRfZHVwY29vaywgLm5hbWUgPSAic2N0cF9zZl9kb181XzJfNF9kdXBjb29rIn0sIFwKK30gLyogVFlQRV9TQ1RQX0NPT0tJRV9FQ0hPICovCisKKyNkZWZpbmUgVFlQRV9TQ1RQX0NPT0tJRV9BQ0sgeyBcCisJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCisJey5mbiA9IHNjdHBfc2Zfb290YiwgLm5hbWUgPSAic2N0cF9zZl9vb3RiIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKKwl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZG9fNV8xRV9jYSwgLm5hbWUgPSAic2N0cF9zZl9kb181XzFFX2NhIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKKwl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKKwl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorfSAvKiBUWVBFX1NDVFBfQ09PS0lFX0FDSyAqLworCisjZGVmaW5lIFRZUEVfU0NUUF9FQ05fRUNORSB7IFwKKwkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKKwl7LmZuID0gc2N0cF9zZl9vb3RiLCAubmFtZSA9ICJzY3RwX3NmX29vdGIifSwgXAorCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKKwl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKKwl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2RvX2VjbmUsIC5uYW1lID0gInNjdHBfc2ZfZG9fZWNuZSJ9LCBcCisJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZG9fZWNuZSwgLm5hbWUgPSAic2N0cF9zZl9kb19lY25lIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2RvX2VjbmUsIC5uYW1lID0gInNjdHBfc2ZfZG9fZWNuZSJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKKwl7LmZuID0gc2N0cF9zZl9kb19lY25lLCAubmFtZSA9ICJzY3RwX3NmX2RvX2VjbmUifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2RvX2VjbmUsIC5uYW1lID0gInNjdHBfc2ZfZG9fZWNuZSJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCit9IC8qIFRZUEVfU0NUUF9FQ05fRUNORSAqLworCisjZGVmaW5lIFRZUEVfU0NUUF9FQ05fQ1dSIHsgXAorCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAorCXsuZm4gPSBzY3RwX3NmX29vdGIsIC5uYW1lID0gInNjdHBfc2Zfb290YiJ9LCBcCisJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZG9fZWNuX2N3ciwgLm5hbWUgPSAic2N0cF9zZl9kb19lY25fY3dyIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2RvX2Vjbl9jd3IsIC5uYW1lID0gInNjdHBfc2ZfZG9fZWNuX2N3ciJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKKwl7LmZuID0gc2N0cF9zZl9kb19lY25fY3dyLCAubmFtZSA9ICJzY3RwX3NmX2RvX2Vjbl9jd3IifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCit9IC8qIFRZUEVfU0NUUF9FQ05fQ1dSICovCisKKyNkZWZpbmUgVFlQRV9TQ1RQX1NIVVRET1dOX0NPTVBMRVRFIHsgXAorCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAorCXsuZm4gPSBzY3RwX3NmX29vdGIsIC5uYW1lID0gInNjdHBfc2Zfb290YiJ9LCBcCisJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKKwl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZG9fNF9DLCAubmFtZSA9ICJzY3RwX3NmX2RvXzRfQyJ9LCBcCit9IC8qIFRZUEVfU0NUUF9TSFVURE9XTl9DT01QTEVURSAqLworCisvKiBUaGUgcHJpbWFyeSBpbmRleCBmb3IgdGhpcyB0YWJsZSBpcyB0aGUgY2h1bmsgdHlwZS4KKyAqIFRoZSBzZWNvbmRhcnkgaW5kZXggZm9yIHRoaXMgdGFibGUgaXMgdGhlIHN0YXRlLgorICoKKyAqIEZvciBiYXNlIHByb3RvY29sIChSRkMgMjk2MCkuCisgKi8KK3N0YXRpYyBjb25zdCBzY3RwX3NtX3RhYmxlX2VudHJ5X3QgY2h1bmtfZXZlbnRfdGFibGVbU0NUUF9OVU1fQkFTRV9DSFVOS19UWVBFU11bU0NUUF9TVEFURV9OVU1fU1RBVEVTXSA9IHsKKwlUWVBFX1NDVFBfREFUQSwKKwlUWVBFX1NDVFBfSU5JVCwKKwlUWVBFX1NDVFBfSU5JVF9BQ0ssCisJVFlQRV9TQ1RQX1NBQ0ssCisJVFlQRV9TQ1RQX0hFQVJUQkVBVCwKKwlUWVBFX1NDVFBfSEVBUlRCRUFUX0FDSywKKwlUWVBFX1NDVFBfQUJPUlQsCisJVFlQRV9TQ1RQX1NIVVRET1dOLAorCVRZUEVfU0NUUF9TSFVURE9XTl9BQ0ssCisJVFlQRV9TQ1RQX0VSUk9SLAorCVRZUEVfU0NUUF9DT09LSUVfRUNITywKKwlUWVBFX1NDVFBfQ09PS0lFX0FDSywKKwlUWVBFX1NDVFBfRUNOX0VDTkUsCisJVFlQRV9TQ1RQX0VDTl9DV1IsCisJVFlQRV9TQ1RQX1NIVVRET1dOX0NPTVBMRVRFLAorfTsgLyogc3RhdGVfZm5fdCBjaHVua19ldmVudF90YWJsZVtdW10gKi8KKworI2RlZmluZSBUWVBFX1NDVFBfQVNDT05GIHsgXAorCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAorCXsuZm4gPSBzY3RwX3NmX29vdGIsIC5uYW1lID0gInNjdHBfc2Zfb290YiJ9LCBcCisJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZG9fYXNjb25mLCAubmFtZSA9ICJzY3RwX3NmX2RvX2FzY29uZiJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKKwl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKKwl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCit9IC8qIFRZUEVfU0NUUF9BU0NPTkYgKi8KKworI2RlZmluZSBUWVBFX1NDVFBfQVNDT05GX0FDSyB7IFwKKwkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKKwl7LmZuID0gc2N0cF9zZl9vb3RiLCAubmFtZSA9ICJzY3RwX3NmX29vdGIifSwgXAorCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKKwl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKKwl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2RvX2FzY29uZl9hY2ssIC5uYW1lID0gInNjdHBfc2ZfZG9fYXNjb25mX2FjayJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKKwl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKKwl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCit9IC8qIFRZUEVfU0NUUF9BU0NPTkZfQUNLICovCisKKy8qIFRoZSBwcmltYXJ5IGluZGV4IGZvciB0aGlzIHRhYmxlIGlzIHRoZSBjaHVuayB0eXBlLgorICogVGhlIHNlY29uZGFyeSBpbmRleCBmb3IgdGhpcyB0YWJsZSBpcyB0aGUgc3RhdGUuCisgKi8KK3N0YXRpYyBjb25zdCBzY3RwX3NtX3RhYmxlX2VudHJ5X3QgYWRkaXBfY2h1bmtfZXZlbnRfdGFibGVbU0NUUF9OVU1fQURESVBfQ0hVTktfVFlQRVNdW1NDVFBfU1RBVEVfTlVNX1NUQVRFU10gPSB7CisJVFlQRV9TQ1RQX0FTQ09ORiwKKwlUWVBFX1NDVFBfQVNDT05GX0FDSywKK307IC8qc3RhdGVfZm5fdCBhZGRpcF9jaHVua19ldmVudF90YWJsZVtdW10gKi8KKworI2RlZmluZSBUWVBFX1NDVFBfRldEX1RTTiB7IFwKKwkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKKwl7LmZuID0gc2N0cF9zZl9vb3RiLCAubmFtZSA9ICJzY3RwX3NmX29vdGIifSwgXAorCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKKwl7LmZuID0gc2N0cF9zZl90YWJvcnRfOF80XzgsIC5uYW1lID0gInNjdHBfc2ZfdGFib3J0XzhfNF84In0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKKwl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKKwl7LmZuID0gc2N0cF9zZl9lYXRfZndkX3RzbiwgLm5hbWUgPSAic2N0cF9zZl9lYXRfZndkX3RzbiJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKKwl7LmZuID0gc2N0cF9zZl9lYXRfZndkX3RzbiwgLm5hbWUgPSAic2N0cF9zZl9lYXRfZndkX3RzbiJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKKwl7LmZuID0gc2N0cF9zZl9lYXRfZndkX3Rzbl9mYXN0LCAubmFtZSA9ICJzY3RwX3NmX2VhdF9md2RfdHNuX2Zhc3QifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKK30gLyogVFlQRV9TQ1RQX0ZXRF9UU04gKi8KKworLyogVGhlIHByaW1hcnkgaW5kZXggZm9yIHRoaXMgdGFibGUgaXMgdGhlIGNodW5rIHR5cGUuCisgKiBUaGUgc2Vjb25kYXJ5IGluZGV4IGZvciB0aGlzIHRhYmxlIGlzIHRoZSBzdGF0ZS4KKyAqLworc3RhdGljIGNvbnN0IHNjdHBfc21fdGFibGVfZW50cnlfdCBwcnNjdHBfY2h1bmtfZXZlbnRfdGFibGVbU0NUUF9OVU1fUFJTQ1RQX0NIVU5LX1RZUEVTXVtTQ1RQX1NUQVRFX05VTV9TVEFURVNdID0geworCVRZUEVfU0NUUF9GV0RfVFNOLAorfTsgLypzdGF0ZV9mbl90IHByc2N0cF9jaHVua19ldmVudF90YWJsZVtdW10gKi8KKworc3RhdGljIGNvbnN0IHNjdHBfc21fdGFibGVfZW50cnlfdAorY2h1bmtfZXZlbnRfdGFibGVfdW5rbm93bltTQ1RQX1NUQVRFX05VTV9TVEFURVNdID0geworCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8KKwl7LmZuID0gc2N0cF9zZl9vb3RiLCAubmFtZSA9ICJzY3RwX3NmX29vdGIifSwKKwkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLworCXsuZm4gPSBzY3RwX3NmX3RhYm9ydF84XzRfOCwgLm5hbWUgPSAic2N0cF9zZl90YWJvcnRfOF80XzgifSwKKwkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovCisJey5mbiA9IHNjdHBfc2ZfdW5rX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX3Vua19jaHVuayJ9LAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLworCXsuZm4gPSBzY3RwX3NmX3Vua19jaHVuaywgLm5hbWUgPSAic2N0cF9zZl91bmtfY2h1bmsifSwKKwkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovCisJey5mbiA9IHNjdHBfc2ZfdW5rX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX3Vua19jaHVuayJ9LAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLworCXsuZm4gPSBzY3RwX3NmX3Vua19jaHVuaywgLm5hbWUgPSAic2N0cF9zZl91bmtfY2h1bmsifSwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8KKwl7LmZuID0gc2N0cF9zZl91bmtfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfdW5rX2NodW5rIn0sCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLworCXsuZm4gPSBzY3RwX3NmX3Vua19jaHVuaywgLm5hbWUgPSAic2N0cF9zZl91bmtfY2h1bmsifSwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovCisJey5mbiA9IHNjdHBfc2ZfdW5rX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX3Vua19jaHVuayJ9LAorfTsJLyogY2h1bmsgdW5rbm93biAqLworCisKKyNkZWZpbmUgVFlQRV9TQ1RQX1BSSU1JVElWRV9BU1NPQ0lBVEUgIHsgXAorCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKKwl7LmZuID0gc2N0cF9zZl9kb19wcm1fYXNvYywgLm5hbWUgPSAic2N0cF9zZl9kb19wcm1fYXNvYyJ9LCBcCisJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCisJey5mbiA9IHNjdHBfc2Zfbm90X2ltcGwsIC5uYW1lID0gInNjdHBfc2Zfbm90X2ltcGwifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCisJey5mbiA9IHNjdHBfc2Zfbm90X2ltcGwsIC5uYW1lID0gInNjdHBfc2Zfbm90X2ltcGwifSwgXAorCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX25vdF9pbXBsLCAubmFtZSA9ICJzY3RwX3NmX25vdF9pbXBsIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAorCXsuZm4gPSBzY3RwX3NmX25vdF9pbXBsLCAubmFtZSA9ICJzY3RwX3NmX25vdF9pbXBsIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX25vdF9pbXBsLCAubmFtZSA9ICJzY3RwX3NmX25vdF9pbXBsIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKKwl7LmZuID0gc2N0cF9zZl9ub3RfaW1wbCwgLm5hbWUgPSAic2N0cF9zZl9ub3RfaW1wbCJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2Zfbm90X2ltcGwsIC5uYW1lID0gInNjdHBfc2Zfbm90X2ltcGwifSwgXAorfSAvKiBUWVBFX1NDVFBfUFJJTUlUSVZFX0FTU09DSUFURSAqLworCisjZGVmaW5lIFRZUEVfU0NUUF9QUklNSVRJVkVfU0hVVERPV04gIHsgXAorCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKKwl7LmZuID0gc2N0cF9zZl9lcnJvcl9jbG9zZWQsIC5uYW1lID0gInNjdHBfc2ZfZXJyb3JfY2xvc2VkIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKKwl7LmZuID0gc2N0cF9zZl9jb29raWVfd2FpdF9wcm1fc2h1dGRvd24sIFwKKwkgLm5hbWUgPSAic2N0cF9zZl9jb29raWVfd2FpdF9wcm1fc2h1dGRvd24ifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfY29va2llX2VjaG9lZF9wcm1fc2h1dGRvd24sIFwKKwkgLm5hbWUgPSAic2N0cF9zZl9jb29raWVfZWNob2VkX3BybV9zaHV0ZG93biJ9LFwKKwkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKKwl7LmZuID0gc2N0cF9zZl9kb185XzJfcHJtX3NodXRkb3duLCBcCisJIC5uYW1lID0gInNjdHBfc2ZfZG9fOV8yX3BybV9zaHV0ZG93biJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKKwl7LmZuID0gc2N0cF9zZl9pZ25vcmVfcHJpbWl0aXZlLCAubmFtZSA9ICJzY3RwX3NmX2lnbm9yZV9wcmltaXRpdmUifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfaWdub3JlX3ByaW1pdGl2ZSwgLm5hbWUgPSAic2N0cF9zZl9pZ25vcmVfcHJpbWl0aXZlIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKKwl7LmZuID0gc2N0cF9zZl9pZ25vcmVfcHJpbWl0aXZlLCAubmFtZSA9ICJzY3RwX3NmX2lnbm9yZV9wcmltaXRpdmUifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2lnbm9yZV9wcmltaXRpdmUsIC5uYW1lID0gInNjdHBfc2ZfaWdub3JlX3ByaW1pdGl2ZSJ9LCBcCit9IC8qIFRZUEVfU0NUUF9QUklNSVRJVkVfU0hVVERPV04gKi8KKworI2RlZmluZSBUWVBFX1NDVFBfUFJJTUlUSVZFX0FCT1JUICB7IFwKKwkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKKwl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZXJyb3JfY2xvc2VkLCAubmFtZSA9ICJzY3RwX3NmX2Vycm9yX2Nsb3NlZCJ9LCBcCisJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfY29va2llX3dhaXRfcHJtX2Fib3J0LCBcCisJLm5hbWUgPSAic2N0cF9zZl9jb29raWVfd2FpdF9wcm1fYWJvcnQifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfY29va2llX2VjaG9lZF9wcm1fYWJvcnQsIFwKKwkubmFtZSA9ICJzY3RwX3NmX2Nvb2tpZV9lY2hvZWRfcHJtX2Fib3J0In0sIFwKKwkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKKwl7LmZuID0gc2N0cF9zZl9kb185XzFfcHJtX2Fib3J0LCBcCisJLm5hbWUgPSAic2N0cF9zZl9kb185XzFfcHJtX2Fib3J0In0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3NodXRkb3duX3BlbmRpbmdfcHJtX2Fib3J0LCBcCisJLm5hbWUgPSAic2N0cF9zZl9zaHV0ZG93bl9wZW5kaW5nX3BybV9hYm9ydCJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKKwl7LmZuID0gc2N0cF9zZl9zaHV0ZG93bl9zZW50X3BybV9hYm9ydCwgXAorCS5uYW1lID0gInNjdHBfc2Zfc2h1dGRvd25fc2VudF9wcm1fYWJvcnQifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2RvXzlfMV9wcm1fYWJvcnQsIFwKKwkubmFtZSA9ICJzY3RwX3NmX2RvXzlfMV9wcm1fYWJvcnQifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3NodXRkb3duX2Fja19zZW50X3BybV9hYm9ydCwgXAorCS5uYW1lID0gInNjdHBfc2Zfc2h1dGRvd25fYWNrX3NlbnRfcHJtX2Fib3J0In0sIFwKK30gLyogVFlQRV9TQ1RQX1BSSU1JVElWRV9BQk9SVCAqLworCisjZGVmaW5lIFRZUEVfU0NUUF9QUklNSVRJVkVfU0VORCAgeyBcCisJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCisJey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCisJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Vycm9yX2Nsb3NlZCwgLm5hbWUgPSAic2N0cF9zZl9lcnJvcl9jbG9zZWQifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2RvX3BybV9zZW5kLCAubmFtZSA9ICJzY3RwX3NmX2RvX3BybV9zZW5kIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2RvX3BybV9zZW5kLCAubmFtZSA9ICJzY3RwX3NmX2RvX3BybV9zZW5kIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKKwl7LmZuID0gc2N0cF9zZl9kb19wcm1fc2VuZCwgLm5hbWUgPSAic2N0cF9zZl9kb19wcm1fc2VuZCJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKKwl7LmZuID0gc2N0cF9zZl9lcnJvcl9zaHV0ZG93biwgLm5hbWUgPSAic2N0cF9zZl9lcnJvcl9zaHV0ZG93biJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKKwl7LmZuID0gc2N0cF9zZl9lcnJvcl9zaHV0ZG93biwgLm5hbWUgPSAic2N0cF9zZl9lcnJvcl9zaHV0ZG93biJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZXJyb3Jfc2h1dGRvd24sIC5uYW1lID0gInNjdHBfc2ZfZXJyb3Jfc2h1dGRvd24ifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Vycm9yX3NodXRkb3duLCAubmFtZSA9ICJzY3RwX3NmX2Vycm9yX3NodXRkb3duIn0sIFwKK30gLyogVFlQRV9TQ1RQX1BSSU1JVElWRV9TRU5EICovCisKKyNkZWZpbmUgVFlQRV9TQ1RQX1BSSU1JVElWRV9SRVFVRVNUSEVBUlRCRUFUICB7IFwKKwkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKKwl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCisJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQsCQkgICAgICBcCisJIC5uYW1lID0gInNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQifSwgICAgICAgICAgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQsCQkgICAgICBcCisJIC5uYW1lID0gInNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQifSwgICAgICAgICAgXAorCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2RvX3BybV9yZXF1ZXN0aGVhcnRiZWF0LAkJICAgICAgXAorCSAubmFtZSA9ICJzY3RwX3NmX2RvX3BybV9yZXF1ZXN0aGVhcnRiZWF0In0sICAgICAgICAgIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2RvX3BybV9yZXF1ZXN0aGVhcnRiZWF0LAkJICAgICAgXAorCSAubmFtZSA9ICJzY3RwX3NmX2RvX3BybV9yZXF1ZXN0aGVhcnRiZWF0In0sICAgICAgICAgIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2RvX3BybV9yZXF1ZXN0aGVhcnRiZWF0LAkJICAgICAgXAorCSAubmFtZSA9ICJzY3RwX3NmX2RvX3BybV9yZXF1ZXN0aGVhcnRiZWF0In0sICAgICAgICAgIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKKwl7LmZuID0gc2N0cF9zZl9kb19wcm1fcmVxdWVzdGhlYXJ0YmVhdCwJCSAgICAgIFwKKwkgLm5hbWUgPSAic2N0cF9zZl9kb19wcm1fcmVxdWVzdGhlYXJ0YmVhdCJ9LCAgICAgICAgICBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQsCQkgICAgICBcCisJIC5uYW1lID0gInNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQifSwgICAgICAgICAgXAorfSAvKiBUWVBFX1NDVFBfUFJJTUlUSVZFX1JFUVVFU1RIRUFSVEJFQVQgKi8KKworI2RlZmluZSBUWVBFX1NDVFBfUFJJTUlUSVZFX0FTQ09ORiB7IFwKKwkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKKwl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZXJyb3JfY2xvc2VkLCAubmFtZSA9ICJzY3RwX3NmX2Vycm9yX2Nsb3NlZCJ9LCBcCisJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZXJyb3JfY2xvc2VkLCAubmFtZSA9ICJzY3RwX3NmX2Vycm9yX2Nsb3NlZCJ9LCBcCisJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKKwl7LmZuID0gc2N0cF9zZl9lcnJvcl9jbG9zZWQsIC5uYW1lID0gInNjdHBfc2ZfZXJyb3JfY2xvc2VkIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKKwl7LmZuID0gc2N0cF9zZl9kb19wcm1fYXNjb25mLCAubmFtZSA9ICJzY3RwX3NmX2RvX3BybV9hc2NvbmYifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZXJyb3Jfc2h1dGRvd24sIC5uYW1lID0gInNjdHBfc2ZfZXJyb3Jfc2h1dGRvd24ifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZXJyb3Jfc2h1dGRvd24sIC5uYW1lID0gInNjdHBfc2ZfZXJyb3Jfc2h1dGRvd24ifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2Vycm9yX3NodXRkb3duLCAubmFtZSA9ICJzY3RwX3NmX2Vycm9yX3NodXRkb3duIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKKwl7LmZuID0gc2N0cF9zZl9lcnJvcl9zaHV0ZG93biwgLm5hbWUgPSAic2N0cF9zZl9lcnJvcl9zaHV0ZG93biJ9LCBcCit9IC8qIFRZUEVfU0NUUF9QUklNSVRJVkVfUkVRVUVTVEhFQVJUQkVBVCAqLworCisvKiBUaGUgcHJpbWFyeSBpbmRleCBmb3IgdGhpcyB0YWJsZSBpcyB0aGUgcHJpbWl0aXZlIHR5cGUuCisgKiBUaGUgc2Vjb25kYXJ5IGluZGV4IGZvciB0aGlzIHRhYmxlIGlzIHRoZSBzdGF0ZS4KKyAqLworc3RhdGljIGNvbnN0IHNjdHBfc21fdGFibGVfZW50cnlfdCBwcmltaXRpdmVfZXZlbnRfdGFibGVbU0NUUF9OVU1fUFJJTUlUSVZFX1RZUEVTXVtTQ1RQX1NUQVRFX05VTV9TVEFURVNdID0geworCVRZUEVfU0NUUF9QUklNSVRJVkVfQVNTT0NJQVRFLAorCVRZUEVfU0NUUF9QUklNSVRJVkVfU0hVVERPV04sCisJVFlQRV9TQ1RQX1BSSU1JVElWRV9BQk9SVCwKKwlUWVBFX1NDVFBfUFJJTUlUSVZFX1NFTkQsCisJVFlQRV9TQ1RQX1BSSU1JVElWRV9SRVFVRVNUSEVBUlRCRUFULAorCVRZUEVfU0NUUF9QUklNSVRJVkVfQVNDT05GLAorfTsKKworI2RlZmluZSBUWVBFX1NDVFBfT1RIRVJfTk9fUEVORElOR19UU04gIHsgXAorCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKKwl7LmZuID0gc2N0cF9zZl9pZ25vcmVfb3RoZXIsIC5uYW1lID0gInNjdHBfc2ZfaWdub3JlX290aGVyIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKKwl7LmZuID0gc2N0cF9zZl9pZ25vcmVfb3RoZXIsIC5uYW1lID0gInNjdHBfc2ZfaWdub3JlX290aGVyIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2lnbm9yZV9vdGhlciwgLm5hbWUgPSAic2N0cF9zZl9pZ25vcmVfb3RoZXIifSwgXAorCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2lnbm9yZV9vdGhlciwgLm5hbWUgPSAic2N0cF9zZl9pZ25vcmVfb3RoZXIifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZG9fOV8yX3N0YXJ0X3NodXRkb3duLCBcCisJIC5uYW1lID0gInNjdHBfZG9fOV8yX3N0YXJ0X3NodXRkb3duIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2lnbm9yZV9vdGhlciwgLm5hbWUgPSAic2N0cF9zZl9pZ25vcmVfb3RoZXIifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2RvXzlfMl9zaHV0ZG93bl9hY2ssIFwKKwkgLm5hbWUgPSAic2N0cF9zZl9kb185XzJfc2h1dGRvd25fYWNrIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKKwl7LmZuID0gc2N0cF9zZl9pZ25vcmVfb3RoZXIsIC5uYW1lID0gInNjdHBfc2ZfaWdub3JlX290aGVyIn0sIFwKK30KKworI2RlZmluZSBUWVBFX1NDVFBfT1RIRVJfSUNNUF9QUk9UT19VTlJFQUNIICB7IFwKKwkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKKwl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfaWdub3JlX290aGVyLCAubmFtZSA9ICJzY3RwX3NmX2lnbm9yZV9vdGhlciJ9LCBcCisJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfY29va2llX3dhaXRfaWNtcF9hYm9ydCwgXAorCSAubmFtZSA9ICJzY3RwX3NmX2Nvb2tpZV93YWl0X2ljbXBfYWJvcnQifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfaWdub3JlX290aGVyLCAubmFtZSA9ICJzY3RwX3NmX2lnbm9yZV9vdGhlciJ9LCBcCisJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfaWdub3JlX290aGVyLCAubmFtZSA9ICJzY3RwX3NmX2lnbm9yZV9vdGhlciJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKKwl7LmZuID0gc2N0cF9zZl9pZ25vcmVfb3RoZXIsIC5uYW1lID0gInNjdHBfc2ZfaWdub3JlX290aGVyIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2lnbm9yZV9vdGhlciwgLm5hbWUgPSAic2N0cF9zZl9pZ25vcmVfb3RoZXIifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2lnbm9yZV9vdGhlciwgLm5hbWUgPSAic2N0cF9zZl9pZ25vcmVfb3RoZXIifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2lnbm9yZV9vdGhlciwgLm5hbWUgPSAic2N0cF9zZl9pZ25vcmVfb3RoZXIifSwgXAorfQorCitzdGF0aWMgY29uc3Qgc2N0cF9zbV90YWJsZV9lbnRyeV90IG90aGVyX2V2ZW50X3RhYmxlW1NDVFBfTlVNX09USEVSX1RZUEVTXVtTQ1RQX1NUQVRFX05VTV9TVEFURVNdID0geworCVRZUEVfU0NUUF9PVEhFUl9OT19QRU5ESU5HX1RTTiwKKwlUWVBFX1NDVFBfT1RIRVJfSUNNUF9QUk9UT19VTlJFQUNILAorfTsKKworI2RlZmluZSBUWVBFX1NDVFBfRVZFTlRfVElNRU9VVF9OT05FIHsgXAorCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKKwl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKKwl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCisJey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKKwl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKKwl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKKwl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKK30KKworI2RlZmluZSBUWVBFX1NDVFBfRVZFTlRfVElNRU9VVF9UMV9DT09LSUUgeyBcCisJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCisJey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCisJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdDFfdGltZXJfZXhwaXJlLCAubmFtZSA9ICJzY3RwX3NmX3QxX3RpbWVyX2V4cGlyZSJ9LCBcCisJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKKwl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorfQorCisjZGVmaW5lIFRZUEVfU0NUUF9FVkVOVF9USU1FT1VUX1QxX0lOSVQgeyBcCisJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCisJey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCisJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3QxX3RpbWVyX2V4cGlyZSwgLm5hbWUgPSAic2N0cF9zZl90MV90aW1lcl9leHBpcmUifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKKwl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorfQorCisjZGVmaW5lIFRZUEVfU0NUUF9FVkVOVF9USU1FT1VUX1QyX1NIVVRET1dOIHsgXAorCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKKwl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKKwl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKKwl7LmZuID0gc2N0cF9zZl90Ml90aW1lcl9leHBpcmUsIC5uYW1lID0gInNjdHBfc2ZfdDJfdGltZXJfZXhwaXJlIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKKwl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKKwl7LmZuID0gc2N0cF9zZl90Ml90aW1lcl9leHBpcmUsIC5uYW1lID0gInNjdHBfc2ZfdDJfdGltZXJfZXhwaXJlIn0sIFwKK30KKworI2RlZmluZSBUWVBFX1NDVFBfRVZFTlRfVElNRU9VVF9UM19SVFggeyBcCisJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCisJey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCisJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZG9fNl8zXzNfcnR4LCAubmFtZSA9ICJzY3RwX3NmX2RvXzZfM18zX3J0eCJ9LCBcCisJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfZG9fNl8zXzNfcnR4LCAubmFtZSA9ICJzY3RwX3NmX2RvXzZfM18zX3J0eCJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKKwl7LmZuID0gc2N0cF9zZl9kb182XzNfM19ydHgsIC5uYW1lID0gInNjdHBfc2ZfZG9fNl8zXzNfcnR4In0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2RvXzZfM18zX3J0eCwgLm5hbWUgPSAic2N0cF9zZl9kb182XzNfM19ydHgifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorfQorCisjZGVmaW5lIFRZUEVfU0NUUF9FVkVOVF9USU1FT1VUX1Q0X1JUTyB7IFwKKwkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKKwl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKKwl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKKwl7LmZuID0gc2N0cF9zZl90NF90aW1lcl9leHBpcmUsIC5uYW1lID0gInNjdHBfc2ZfdDRfdGltZXJfZXhwaXJlIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCit9CisKKyNkZWZpbmUgVFlQRV9TQ1RQX0VWRU5UX1RJTUVPVVRfVDVfU0hVVERPV05fR1VBUkQgeyBcCisJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCisJey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCisJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKKwl7LmZuID0gc2N0cF9zZl90NV90aW1lcl9leHBpcmUsIC5uYW1lID0gInNjdHBfc2ZfdDVfdGltZXJfZXhwaXJlIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3Q1X3RpbWVyX2V4cGlyZSwgLm5hbWUgPSAic2N0cF9zZl90NV90aW1lcl9leHBpcmUifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorfQorCisjZGVmaW5lIFRZUEVfU0NUUF9FVkVOVF9USU1FT1VUX0hFQVJUQkVBVCB7IFwKKwkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKKwl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKKwl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKKwl7LmZuID0gc2N0cF9zZl9zZW5kYmVhdF84XzMsIC5uYW1lID0gInNjdHBfc2Zfc2VuZGJlYXRfOF8zIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3NlbmRiZWF0XzhfMywgLm5hbWUgPSAic2N0cF9zZl9zZW5kYmVhdF84XzMifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCisJey5mbiA9IHNjdHBfc2Zfc2VuZGJlYXRfOF8zLCAubmFtZSA9ICJzY3RwX3NmX3NlbmRiZWF0XzhfMyJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCit9CisKKyNkZWZpbmUgVFlQRV9TQ1RQX0VWRU5UX1RJTUVPVVRfU0FDSyB7IFwKKwkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKKwl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKKwl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKKwl7LmZuID0gc2N0cF9zZl9kb182XzJfc2FjaywgLm5hbWUgPSAic2N0cF9zZl9kb182XzJfc2FjayJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKKwl7LmZuID0gc2N0cF9zZl9kb182XzJfc2FjaywgLm5hbWUgPSAic2N0cF9zZl9kb182XzJfc2FjayJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKKwl7LmZuID0gc2N0cF9zZl9kb182XzJfc2FjaywgLm5hbWUgPSAic2N0cF9zZl9kb182XzJfc2FjayJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCit9CisKKyNkZWZpbmUgVFlQRV9TQ1RQX0VWRU5UX1RJTUVPVVRfQVVUT0NMT1NFIHsgXAorCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKKwl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKKwl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAorCXsuZm4gPSBzY3RwX3NmX2F1dG9jbG9zZV90aW1lcl9leHBpcmUsIFwKKwkgLm5hbWUgPSAic2N0cF9zZl9hdXRvY2xvc2VfdGltZXJfZXhwaXJlIn0sIFwKKwkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAorCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCisJey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCit9CisKK3N0YXRpYyBjb25zdCBzY3RwX3NtX3RhYmxlX2VudHJ5X3QgdGltZW91dF9ldmVudF90YWJsZVtTQ1RQX05VTV9USU1FT1VUX1RZUEVTXVtTQ1RQX1NUQVRFX05VTV9TVEFURVNdID0geworCVRZUEVfU0NUUF9FVkVOVF9USU1FT1VUX05PTkUsCisJVFlQRV9TQ1RQX0VWRU5UX1RJTUVPVVRfVDFfQ09PS0lFLAorCVRZUEVfU0NUUF9FVkVOVF9USU1FT1VUX1QxX0lOSVQsCisJVFlQRV9TQ1RQX0VWRU5UX1RJTUVPVVRfVDJfU0hVVERPV04sCisJVFlQRV9TQ1RQX0VWRU5UX1RJTUVPVVRfVDNfUlRYLAorCVRZUEVfU0NUUF9FVkVOVF9USU1FT1VUX1Q0X1JUTywKKwlUWVBFX1NDVFBfRVZFTlRfVElNRU9VVF9UNV9TSFVURE9XTl9HVUFSRCwKKwlUWVBFX1NDVFBfRVZFTlRfVElNRU9VVF9IRUFSVEJFQVQsCisJVFlQRV9TQ1RQX0VWRU5UX1RJTUVPVVRfU0FDSywKKwlUWVBFX1NDVFBfRVZFTlRfVElNRU9VVF9BVVRPQ0xPU0UsCit9OworCitzdGF0aWMgY29uc3Qgc2N0cF9zbV90YWJsZV9lbnRyeV90ICpzY3RwX2NodW5rX2V2ZW50X2xvb2t1cChzY3RwX2NpZF90IGNpZCwgCisJCQkJCQkJICAgIHNjdHBfc3RhdGVfdCBzdGF0ZSkKK3sKKwlpZiAoc3RhdGUgPiBTQ1RQX1NUQVRFX01BWCkKKwkJcmV0dXJuICZidWc7CisKKwlpZiAoY2lkID49IDAgJiYgY2lkIDw9IFNDVFBfQ0lEX0JBU0VfTUFYKQorCQlyZXR1cm4gJmNodW5rX2V2ZW50X3RhYmxlW2NpZF1bc3RhdGVdOworCisJaWYgKHNjdHBfcHJzY3RwX2VuYWJsZSkgeworCQlpZiAoY2lkID09IFNDVFBfQ0lEX0ZXRF9UU04pCisJCQlyZXR1cm4gJnByc2N0cF9jaHVua19ldmVudF90YWJsZVswXVtzdGF0ZV07CisJfQorCisJaWYgKHNjdHBfYWRkaXBfZW5hYmxlKSB7CisJCWlmIChjaWQgPT0gU0NUUF9DSURfQVNDT05GKQorCQkJcmV0dXJuICZhZGRpcF9jaHVua19ldmVudF90YWJsZVswXVtzdGF0ZV07CisKKwkJaWYgKGNpZCA9PSBTQ1RQX0NJRF9BU0NPTkZfQUNLKQorCQkJcmV0dXJuICZhZGRpcF9jaHVua19ldmVudF90YWJsZVsxXVtzdGF0ZV07CisJfQorCisJcmV0dXJuICZjaHVua19ldmVudF90YWJsZV91bmtub3duW3N0YXRlXTsKK30KZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NvY2tldC5jIGIvbmV0L3NjdHAvc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThjMjEwMQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY3RwL3NvY2tldC5jCkBAIC0wLDAgKzEsNDc5NyBAQAorLyogU0NUUCBrZXJuZWwgcmVmZXJlbmNlIEltcGxlbWVudGF0aW9uCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxLCAyMDA0CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMCBDaXNjbywgSW5jLgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgTW90b3JvbGEsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiBOb2tpYSwgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDAxIExhIE1vbnRlIEguUC4gWWFycm9sbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBTQ1RQIGtlcm5lbCByZWZlcmVuY2UgSW1wbGVtZW50YXRpb24KKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgaW50ZXJmYWNlIHdpdGggdGhlIHNvY2tldHMgbGF5ZXIgdG8gaW1wbGVtZW50IHRoZQorICogU0NUUCBFeHRlbnNpb25zIGZvciB0aGUgU29ja2V0cyBBUEkuCisgKgorICogTm90ZSB0aGF0IHRoZSBkZXNjcmlwdGlvbnMgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBhcmUgVVNFUiBsZXZlbAorICogZnVuY3Rpb25zLS10aGlzIGZpbGUgaXMgdGhlIGZ1bmN0aW9ucyB3aGljaCBwb3B1bGF0ZSB0aGUgc3RydWN0IHByb3RvCisgKiBmb3IgU0NUUCB3aGljaCBpcyB0aGUgQk9UVE9NIG9mIHRoZSBzb2NrZXRzIGludGVyZmFjZS4KKyAqCisgKiBUaGUgU0NUUCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgU0NUUCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogV3JpdHRlbiBvciBtb2RpZmllZCBieToKKyAqICAgIExhIE1vbnRlIEguUC4gWWFycm9sbCA8cGlnZ3lAYWNtLm9yZz4KKyAqICAgIE5hcmFzaW1oYSBCdWRpaGFsICAgICA8bmFyc2lAcmVmY29kZS5vcmc+CisgKiAgICBLYXJsIEtudXRzb24gICAgICAgICAgPGthcmxAYXRoZW5hLmNoaWNhZ28uaWwudXM+CisgKiAgICBKb24gR3JpbW0gICAgICAgICAgICAgPGpncmltbUB1cy5pYm0uY29tPgorICogICAgWGluZ2FuZyBHdW8gICAgICAgICAgIDx4aW5nYW5nLmd1b0BpbnRlbC5jb20+CisgKiAgICBEYWlzeSBDaGFuZyAgICAgICAgICAgPGRhaXN5Y0B1cy5pYm0uY29tPgorICogICAgU3JpZGhhciBTYW11ZHJhbGEgICAgIDxzYW11ZHJhbGFAdXMuaWJtLmNvbT4KKyAqICAgIEluYWt5IFBlcmV6LUdvbnphbGV6ICA8aW5ha3kuZ29uemFsZXpAaW50ZWwuY29tPgorICogICAgQXJkZWxsZSBGYW4JICAgIDxhcmRlbGxlLmZhbkBpbnRlbC5jb20+CisgKiAgICBSeWFuIExheWVyCSAgICA8cm1sYXllckB1cy5pYm0uY29tPgorICogICAgQW51cCBQZW1tYWlhaCAgICAgICAgIDxwZW1tYWlhaEBjYy51c3UuZWR1PgorICogICAgS2V2aW4gR2FvICAgICAgICAgICAgIDxrZXZpbi5nYW9AaW50ZWwuY29tPgorICoKKyAqIEFueSBidWdzIHJlcG9ydGVkIGdpdmVuIHRvIHVzIHdlIHdpbGwgdHJ5IHRvIGZpeC4uLiBhbnkgZml4ZXMgc2hhcmVkIHdpbGwKKyAqIGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBuZXh0IFNDVFAgcmVsZWFzZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorCisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L2ljbXAuaD4KKyNpbmNsdWRlIDxuZXQvcm91dGUuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC9pbmV0X2NvbW1vbi5oPgorCisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+IC8qIGZvciBzYV9mYW1pbHlfdCAqLworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3NjdHAvc2N0cC5oPgorI2luY2x1ZGUgPG5ldC9zY3RwL3NtLmg+CisKKy8qIFdBUk5JTkc6ICBQbGVhc2UgZG8gbm90IHJlbW92ZSB0aGUgU0NUUF9TVEFUSUMgYXR0cmlidXRlIHRvCisgKiBhbnkgb2YgdGhlIGZ1bmN0aW9ucyBiZWxvdyBhcyB0aGV5IGFyZSB1c2VkIHRvIGV4cG9ydCBmdW5jdGlvbnMKKyAqIHVzZWQgYnkgYSBwcm9qZWN0IHJlZ3Jlc3Npb24gdGVzdHN1aXRlLgorICovCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBpbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb25zLiAqLworc3RhdGljIGludCBzY3RwX3dyaXRlYWJsZShzdHJ1Y3Qgc29jayAqc2spOworc3RhdGljIHZvaWQgc2N0cF93ZnJlZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgc2N0cF93YWl0X2Zvcl9zbmRidWYoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwgbG9uZyAqdGltZW9fcCwKKwkJCQlzaXplX3QgbXNnX2xlbik7CitzdGF0aWMgaW50IHNjdHBfd2FpdF9mb3JfcGFja2V0KHN0cnVjdCBzb2NrICogc2ssIGludCAqZXJyLCBsb25nICp0aW1lb19wKTsKK3N0YXRpYyBpbnQgc2N0cF93YWl0X2Zvcl9jb25uZWN0KHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICosIGxvbmcgKnRpbWVvX3ApOworc3RhdGljIGludCBzY3RwX3dhaXRfZm9yX2FjY2VwdChzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgdGltZW8pOworc3RhdGljIHZvaWQgc2N0cF93YWl0X2Zvcl9jbG9zZShzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgdGltZW8pOworc3RhdGljIHN0cnVjdCBzY3RwX2FmICpzY3RwX3NvY2thZGRyX2FmKHN0cnVjdCBzY3RwX3NvY2sgKm9wdCwKKwkJCQkJdW5pb24gc2N0cF9hZGRyICphZGRyLCBpbnQgbGVuKTsKK3N0YXRpYyBpbnQgc2N0cF9iaW5keF9hZGQoc3RydWN0IHNvY2sgKiwgc3RydWN0IHNvY2thZGRyICosIGludCk7CitzdGF0aWMgaW50IHNjdHBfYmluZHhfcmVtKHN0cnVjdCBzb2NrICosIHN0cnVjdCBzb2NrYWRkciAqLCBpbnQpOworc3RhdGljIGludCBzY3RwX3NlbmRfYXNjb25mX2FkZF9pcChzdHJ1Y3Qgc29jayAqLCBzdHJ1Y3Qgc29ja2FkZHIgKiwgaW50KTsKK3N0YXRpYyBpbnQgc2N0cF9zZW5kX2FzY29uZl9kZWxfaXAoc3RydWN0IHNvY2sgKiwgc3RydWN0IHNvY2thZGRyICosIGludCk7CitzdGF0aWMgaW50IHNjdHBfc2VuZF9hc2NvbmYoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkgICAgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rKTsKK3N0YXRpYyBpbnQgc2N0cF9kb19iaW5kKHN0cnVjdCBzb2NrICosIHVuaW9uIHNjdHBfYWRkciAqLCBpbnQpOworc3RhdGljIGludCBzY3RwX2F1dG9iaW5kKHN0cnVjdCBzb2NrICpzayk7CitzdGF0aWMgdm9pZCBzY3RwX3NvY2tfbWlncmF0ZShzdHJ1Y3Qgc29jayAqLCBzdHJ1Y3Qgc29jayAqLAorCQkJICAgICAgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwgc2N0cF9zb2NrZXRfdHlwZV90KTsKK3N0YXRpYyBjaGFyICpzY3RwX2htYWNfYWxnID0gU0NUUF9DT09LSUVfSE1BQ19BTEc7CisKK2V4dGVybiBrbWVtX2NhY2hlX3QgKnNjdHBfYnVja2V0X2NhY2hlcDsKKworLyogR2V0IHRoZSBzbmRidWYgc3BhY2UgYXZhaWxhYmxlIGF0IHRoZSB0aW1lIG9uIHRoZSBhc3NvY2lhdGlvbi4gICovCitzdGF0aWMgaW5saW5lIGludCBzY3RwX3dzcGFjZShzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBhc29jLT5iYXNlLnNrOworCWludCBhbXQgPSAwOworCisJYW10ID0gc2stPnNrX3NuZGJ1ZiAtIGFzb2MtPnNuZGJ1Zl91c2VkOworCWlmIChhbXQgPCAwKQorCQlhbXQgPSAwOworCXJldHVybiBhbXQ7Cit9CisKKy8qIEluY3JlbWVudCB0aGUgdXNlZCBzbmRidWYgc3BhY2UgY291bnQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYXNzb2NpYXRpb24gYnkKKyAqIHRoZSBzaXplIG9mIHRoZSBvdXRnb2luZyBkYXRhIGNodW5rLgorICogQWxzbywgc2V0IHRoZSBza2IgZGVzdHJ1Y3RvciBmb3Igc25kYnVmIGFjY291bnRpbmcgbGF0ZXIuCisgKgorICogU2luY2UgaXQgaXMgYWx3YXlzIDEtMSBiZXR3ZWVuIGNodW5rIGFuZCBza2IsIGFuZCBhbHNvIGEgbmV3IHNrYiBpcyBhbHdheXMKKyAqIGFsbG9jYXRlZCBmb3IgY2h1bmsgYnVuZGxpbmcgaW4gc2N0cF9wYWNrZXRfdHJhbnNtaXQoKSwgd2UgY2FuIHVzZSB0aGUKKyAqIGRlc3RydWN0b3IgaW4gdGhlIGRhdGEgY2h1bmsgc2tiIGZvciB0aGUgcHVycG9zZSBvZiB0aGUgc25kYnVmIHNwYWNlCisgKiB0cmFja2luZy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNjdHBfc2V0X293bmVyX3coc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rKQoreworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jID0gY2h1bmstPmFzb2M7CisJc3RydWN0IHNvY2sgKnNrID0gYXNvYy0+YmFzZS5zazsKKworCS8qIFRoZSBzbmRidWYgc3BhY2UgaXMgdHJhY2tlZCBwZXIgYXNzb2NpYXRpb24uICAqLworCXNjdHBfYXNzb2NpYXRpb25faG9sZChhc29jKTsKKworCWNodW5rLT5za2ItPmRlc3RydWN0b3IgPSBzY3RwX3dmcmVlOworCS8qIFNhdmUgdGhlIGNodW5rIHBvaW50ZXIgaW4gc2tiIGZvciBzY3RwX3dmcmVlIHRvIHVzZSBsYXRlci4gICovCisJKigoc3RydWN0IHNjdHBfY2h1bmsgKiopKGNodW5rLT5za2ItPmNiKSkgPSBjaHVuazsKKworCWFzb2MtPnNuZGJ1Zl91c2VkICs9IFNDVFBfREFUQV9TTkRTSVpFKGNodW5rKTsKKwlzay0+c2tfd21lbV9xdWV1ZWQgKz0gU0NUUF9EQVRBX1NORFNJWkUoY2h1bmspOworfQorCisvKiBWZXJpZnkgdGhhdCB0aGlzIGlzIGEgdmFsaWQgYWRkcmVzcy4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNjdHBfdmVyaWZ5X2FkZHIoc3RydWN0IHNvY2sgKnNrLCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIsCisJCQkJICAgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc2N0cF9hZiAqYWY7CisKKwkvKiBWZXJpZnkgYmFzaWMgc29ja2FkZHIuICovCisJYWYgPSBzY3RwX3NvY2thZGRyX2FmKHNjdHBfc2soc2spLCBhZGRyLCBsZW4pOworCWlmICghYWYpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogSXMgdGhpcyBhIHZhbGlkIFNDVFAgYWRkcmVzcz8gICovCisJaWYgKCFhZi0+YWRkcl92YWxpZChhZGRyLCBzY3RwX3NrKHNrKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFzY3RwX3NrKHNrKS0+cGYtPnNlbmRfdmVyaWZ5KHNjdHBfc2soc2spLCAoYWRkcikpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCisvKiBMb29rIHVwIHRoZSBhc3NvY2lhdGlvbiBieSBpdHMgaWQuICBJZiB0aGlzIGlzIG5vdCBhIFVEUC1zdHlsZQorICogc29ja2V0LCB0aGUgSUQgZmllbGQgaXMgYWx3YXlzIGlnbm9yZWQuCisgKi8KK3N0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICpzY3RwX2lkMmFzc29jKHN0cnVjdCBzb2NrICpzaywgc2N0cF9hc3NvY190IGlkKQoreworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jID0gTlVMTDsKKworCS8qIElmIHRoaXMgaXMgbm90IGEgVURQLXN0eWxlIHNvY2tldCwgYXNzb2MgaWQgc2hvdWxkIGJlIGlnbm9yZWQuICovCisJaWYgKCFzY3RwX3N0eWxlKHNrLCBVRFApKSB7CisJCS8qIFJldHVybiBOVUxMIGlmIHRoZSBzb2NrZXQgc3RhdGUgaXMgbm90IEVTVEFCTElTSEVELiBJdAorCQkgKiBjb3VsZCBiZSBhIFRDUC1zdHlsZSBsaXN0ZW5pbmcgc29ja2V0IG9yIGEgc29ja2V0IHdoaWNoCisJCSAqIGhhc24ndCB5ZXQgY2FsbGVkIGNvbm5lY3QoKSB0byBlc3RhYmxpc2ggYW4gYXNzb2NpYXRpb24uCisJCSAqLworCQlpZiAoIXNjdHBfc3N0YXRlKHNrLCBFU1RBQkxJU0hFRCkpCisJCQlyZXR1cm4gTlVMTDsKKworCQkvKiBHZXQgdGhlIGZpcnN0IGFuZCB0aGUgb25seSBhc3NvY2lhdGlvbiBmcm9tIHRoZSBsaXN0LiAqLworCQlpZiAoIWxpc3RfZW1wdHkoJnNjdHBfc2soc2spLT5lcC0+YXNvY3MpKQorCQkJYXNvYyA9IGxpc3RfZW50cnkoc2N0cF9zayhzayktPmVwLT5hc29jcy5uZXh0LAorCQkJCQkgIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uLCBhc29jcyk7CisJCXJldHVybiBhc29jOworCX0KKworCS8qIE90aGVyd2lzZSB0aGlzIGlzIGEgVURQLXN0eWxlIHNvY2tldC4gKi8KKwlpZiAoIWlkIHx8IChpZCA9PSAoc2N0cF9hc3NvY190KS0xKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzcGluX2xvY2tfYmgoJnNjdHBfYXNzb2NzX2lkX2xvY2spOworCWFzb2MgPSAoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKilpZHJfZmluZCgmc2N0cF9hc3NvY3NfaWQsIChpbnQpaWQpOworCXNwaW5fdW5sb2NrX2JoKCZzY3RwX2Fzc29jc19pZF9sb2NrKTsKKworCWlmICghYXNvYyB8fCAoYXNvYy0+YmFzZS5zayAhPSBzaykgfHwgYXNvYy0+YmFzZS5kZWFkKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBhc29jOworfQorCisvKiBMb29rIHVwIHRoZSB0cmFuc3BvcnQgZnJvbSBhbiBhZGRyZXNzIGFuZCBhbiBhc3NvYyBpZC4gSWYgYm90aCBhZGRyZXNzIGFuZAorICogaWQgYXJlIHNwZWNpZmllZCwgdGhlIGFzc29jaWF0aW9ucyBtYXRjaGluZyB0aGUgYWRkcmVzcyBhbmQgdGhlIGlkIHNob3VsZCBiZQorICogdGhlIHNhbWUuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnNjdHBfYWRkcl9pZDJ0cmFuc3BvcnQoc3RydWN0IHNvY2sgKnNrLAorCQkJCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkciwKKwkJCQkJICAgICAgc2N0cF9hc3NvY190IGlkKQoreworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphZGRyX2Fzb2MgPSBOVUxMLCAqaWRfYXNvYyA9IE5VTEw7CisJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisJdW5pb24gc2N0cF9hZGRyICpsYWRkciA9ICh1bmlvbiBzY3RwX2FkZHIgKilhZGRyOworCisJbGFkZHItPnY0LnNpbl9wb3J0ID0gbnRvaHMobGFkZHItPnY0LnNpbl9wb3J0KTsKKwlhZGRyX2Fzb2MgPSBzY3RwX2VuZHBvaW50X2xvb2t1cF9hc3NvYyhzY3RwX3NrKHNrKS0+ZXAsCisJCQkJCSAgICAgICAodW5pb24gc2N0cF9hZGRyICopYWRkciwKKwkJCQkJICAgICAgICZ0cmFuc3BvcnQpOworCWxhZGRyLT52NC5zaW5fcG9ydCA9IGh0b25zKGxhZGRyLT52NC5zaW5fcG9ydCk7CisKKwlpZiAoIWFkZHJfYXNvYykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZF9hc29jID0gc2N0cF9pZDJhc3NvYyhzaywgaWQpOworCWlmIChpZF9hc29jICYmIChpZF9hc29jICE9IGFkZHJfYXNvYykpCisJCXJldHVybiBOVUxMOworCisJc2N0cF9nZXRfcGZfc3BlY2lmaWMoc2stPnNrX2ZhbWlseSktPmFkZHJfdjRtYXAoc2N0cF9zayhzayksCisJCQkJCQkodW5pb24gc2N0cF9hZGRyICopYWRkcik7CisKKwlyZXR1cm4gdHJhbnNwb3J0OworfQorCisvKiBBUEkgMy4xLjIgYmluZCgpIC0gVURQIFN0eWxlIFN5bnRheAorICogVGhlIHN5bnRheCBvZiBiaW5kKCkgaXMsCisgKgorICogICByZXQgPSBiaW5kKGludCBzZCwgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcmxlbik7CisgKgorICogICBzZCAgICAgIC0gdGhlIHNvY2tldCBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IHNvY2tldCgpLgorICogICBhZGRyICAgIC0gdGhlIGFkZHJlc3Mgc3RydWN0dXJlIChzdHJ1Y3Qgc29ja2FkZHJfaW4gb3Igc3RydWN0CisgKiAgICAgICAgICAgICBzb2NrYWRkcl9pbjYgW1JGQyAyNTUzXSksCisgKiAgIGFkZHJfbGVuIC0gdGhlIHNpemUgb2YgdGhlIGFkZHJlc3Mgc3RydWN0dXJlLgorICovCitTQ1RQX1NUQVRJQyBpbnQgc2N0cF9iaW5kKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwgaW50IGFkZHJfbGVuKQoreworCWludCByZXR2YWwgPSAwOworCisJc2N0cF9sb2NrX3NvY2soc2spOworCisJU0NUUF9ERUJVR19QUklOVEsoInNjdHBfYmluZChzazogJXAsIHVhZGRyOiAlcCwgYWRkcl9sZW46ICVkKVxuIiwKKwkJCSAgc2ssIHVhZGRyLCBhZGRyX2xlbik7CisKKwkvKiBEaXNhbGxvdyBiaW5kaW5nIHR3aWNlLiAqLworCWlmICghc2N0cF9zayhzayktPmVwLT5iYXNlLmJpbmRfYWRkci5wb3J0KQorCQlyZXR2YWwgPSBzY3RwX2RvX2JpbmQoc2ssICh1bmlvbiBzY3RwX2FkZHIgKil1YWRkciwKKwkJCQkgICAgICBhZGRyX2xlbik7CisJZWxzZQorCQlyZXR2YWwgPSAtRUlOVkFMOworCisJc2N0cF9yZWxlYXNlX3NvY2soc2spOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGxvbmcgc2N0cF9nZXRfcG9ydF9sb2NhbChzdHJ1Y3Qgc29jayAqLCB1bmlvbiBzY3RwX2FkZHIgKik7CisKKy8qIFZlcmlmeSB0aGlzIGlzIGEgdmFsaWQgc29ja2FkZHIuICovCitzdGF0aWMgc3RydWN0IHNjdHBfYWYgKnNjdHBfc29ja2FkZHJfYWYoc3RydWN0IHNjdHBfc29jayAqb3B0LAorCQkJCQl1bmlvbiBzY3RwX2FkZHIgKmFkZHIsIGludCBsZW4pCit7CisJc3RydWN0IHNjdHBfYWYgKmFmOworCisJLyogQ2hlY2sgbWluaW11bSBzaXplLiAgKi8KKwlpZiAobGVuIDwgc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHIpKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIERvZXMgdGhpcyBQRiBzdXBwb3J0IHRoaXMgQUY/ICovCisJaWYgKCFvcHQtPnBmLT5hZl9zdXBwb3J0ZWQoYWRkci0+c2Euc2FfZmFtaWx5LCBvcHQpKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIElmIHdlIGdldCB0aGlzIGZhciwgYWYgaXMgdmFsaWQuICovCisJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhhZGRyLT5zYS5zYV9mYW1pbHkpOworCisJaWYgKGxlbiA8IGFmLT5zb2NrYWRkcl9sZW4pCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGFmOworfQorCisvKiBCaW5kIGEgbG9jYWwgYWRkcmVzcyBlaXRoZXIgdG8gYW4gZW5kcG9pbnQgb3IgdG8gYW4gYXNzb2NpYXRpb24uICAqLworU0NUUF9TVEFUSUMgaW50IHNjdHBfZG9fYmluZChzdHJ1Y3Qgc29jayAqc2ssIHVuaW9uIHNjdHBfYWRkciAqYWRkciwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc2N0cF9zb2NrICpzcCA9IHNjdHBfc2soc2spOworCXN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCA9IHNwLT5lcDsKKwlzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKmJwID0gJmVwLT5iYXNlLmJpbmRfYWRkcjsKKwlzdHJ1Y3Qgc2N0cF9hZiAqYWY7CisJdW5zaWduZWQgc2hvcnQgc251bTsKKwlpbnQgcmV0ID0gMDsKKworCVNDVFBfREVCVUdfUFJJTlRLKCJzY3RwX2RvX2JpbmQoc2s6ICVwLCBuZXdhZGRyOiAlcCwgbGVuOiAlZClcbiIsCisJCQkgIHNrLCBhZGRyLCBsZW4pOworCisJLyogQ29tbW9uIHNvY2thZGRyIHZlcmlmaWNhdGlvbi4gKi8KKwlhZiA9IHNjdHBfc29ja2FkZHJfYWYoc3AsIGFkZHIsIGxlbik7CisJaWYgKCFhZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBQRiBzcGVjaWZpYyBiaW5kKCkgYWRkcmVzcyB2ZXJpZmljYXRpb24uICovCisJaWYgKCFzcC0+cGYtPmJpbmRfdmVyaWZ5KHNwLCBhZGRyKSkKKwkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCisJc251bT0gbnRvaHMoYWRkci0+djQuc2luX3BvcnQpOworCisJU0NUUF9ERUJVR19QUklOVEsoInNjdHBfZG9fYmluZDogcG9ydDogJWQsIG5ldyBwb3J0OiAlZFxuIiwKKwkJCSAgYnAtPnBvcnQsIHNudW0pOworCisJLyogV2UgbXVzdCBlaXRoZXIgYmUgdW5ib3VuZCwgb3IgYmluZCB0byB0aGUgc2FtZSBwb3J0LiAgKi8KKwlpZiAoYnAtPnBvcnQgJiYgKHNudW0gIT0gYnAtPnBvcnQpKSB7CisJCVNDVFBfREVCVUdfUFJJTlRLKCJzY3RwX2RvX2JpbmQ6IgorCQkJCSAgIiBOZXcgcG9ydCAlZCBkb2VzIG5vdCBtYXRjaCBleGlzdGluZyBwb3J0ICIKKwkJCQkgICIlZC5cbiIsIHNudW0sIGJwLT5wb3J0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHNudW0gJiYgc251bSA8IFBST1RfU09DSyAmJiAhY2FwYWJsZShDQVBfTkVUX0JJTkRfU0VSVklDRSkpCisJCXJldHVybiAtRUFDQ0VTOworCisJLyogTWFrZSBzdXJlIHdlIGFyZSBhbGxvd2VkIHRvIGJpbmQgaGVyZS4KKwkgKiBUaGUgZnVuY3Rpb24gc2N0cF9nZXRfcG9ydF9sb2NhbCgpIGRvZXMgZHVwbGljYXRlIGFkZHJlc3MKKwkgKiBkZXRlY3Rpb24uCisJICovCisJaWYgKChyZXQgPSBzY3RwX2dldF9wb3J0X2xvY2FsKHNrLCBhZGRyKSkpIHsKKwkJaWYgKHJldCA9PSAobG9uZykgc2spIHsKKwkJCS8qIFRoaXMgZW5kcG9pbnQgaGFzIGEgY29uZmxpY3RpbmcgYWRkcmVzcy4gKi8KKwkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgeworCQkJcmV0dXJuIC1FQUREUklOVVNFOworCQl9CisJfQorCisJLyogUmVmcmVzaCBlcGhlbWVyYWwgcG9ydC4gICovCisJaWYgKCFicC0+cG9ydCkKKwkJYnAtPnBvcnQgPSBpbmV0X3NrKHNrKS0+bnVtOworCisJLyogQWRkIHRoZSBhZGRyZXNzIHRvIHRoZSBiaW5kIGFkZHJlc3MgbGlzdC4gICovCisJc2N0cF9sb2NhbF9iaF9kaXNhYmxlKCk7CisJc2N0cF93cml0ZV9sb2NrKCZlcC0+YmFzZS5hZGRyX2xvY2spOworCisJLyogVXNlIEdGUF9BVE9NSUMgc2luY2UgQkhzIGFyZSBkaXNhYmxlZC4gICovCisJYWRkci0+djQuc2luX3BvcnQgPSBudG9ocyhhZGRyLT52NC5zaW5fcG9ydCk7CisJcmV0ID0gc2N0cF9hZGRfYmluZF9hZGRyKGJwLCBhZGRyLCBHRlBfQVRPTUlDKTsKKwlhZGRyLT52NC5zaW5fcG9ydCA9IGh0b25zKGFkZHItPnY0LnNpbl9wb3J0KTsKKwlzY3RwX3dyaXRlX3VubG9jaygmZXAtPmJhc2UuYWRkcl9sb2NrKTsKKwlzY3RwX2xvY2FsX2JoX2VuYWJsZSgpOworCisJLyogQ29weSBiYWNrIGludG8gc29ja2V0IGZvciBnZXRzb2NrbmFtZSgpIHVzZS4gKi8KKwlpZiAoIXJldCkgeworCQlpbmV0X3NrKHNrKS0+c3BvcnQgPSBodG9ucyhpbmV0X3NrKHNrKS0+bnVtKTsKKwkJYWYtPnRvX3NrX3NhZGRyKGFkZHIsIHNrKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisgLyogQURESVAgU2VjdGlvbiA0LjEuMSBDb25nZXN0aW9uIENvbnRyb2wgb2YgQVNDT05GIENodW5rcworICoKKyAqIFIxKSBPbmUgYW5kIG9ubHkgb25lIEFTQ09ORiBDaHVuayBNQVkgYmUgaW4gdHJhbnNpdCBhbmQgdW5hY2tub3dsZWRnZWQgCisgKiBhdCBhbnkgb25lIHRpbWUuICBJZiBhIHNlbmRlciwgYWZ0ZXIgc2VuZGluZyBhbiBBU0NPTkYgY2h1bmssIGRlY2lkZXMKKyAqIGl0IG5lZWRzIHRvIHRyYW5zZmVyIGFub3RoZXIgQVNDT05GIENodW5rLCBpdCBNVVNUIHdhaXQgdW50aWwgdGhlIAorICogQVNDT05GLUFDSyBDaHVuayByZXR1cm5zIGZyb20gdGhlIHByZXZpb3VzIEFTQ09ORiBDaHVuayBiZWZvcmUgc2VuZGluZyBhCisgKiBzdWJzZXF1ZW50IEFTQ09ORi4gTm90ZSB0aGlzIHJlc3RyaWN0aW9uIGJpbmRzIGVhY2ggc2lkZSwgc28gYXQgYW55IAorICogdGltZSB0d28gQVNDT05GIG1heSBiZSBpbi10cmFuc2l0IG9uIGFueSBnaXZlbiBhc3NvY2lhdGlvbiAob25lIHNlbnQgCisgKiBmcm9tIGVhY2ggZW5kcG9pbnQpLgorICovCitzdGF0aWMgaW50IHNjdHBfc2VuZF9hc2NvbmYoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkgICAgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rKQoreworCWludAkJcmV0dmFsID0gMDsKKworCS8qIElmIHRoZXJlIGlzIGFuIG91dHN0YW5kaW5nIEFTQ09ORiBjaHVuaywgcXVldWUgaXQgZm9yIGxhdGVyCisJICogdHJhbnNtaXNzaW9uLgorCSAqLwkKKwlpZiAoYXNvYy0+YWRkaXBfbGFzdF9hc2NvbmYpIHsKKwkJX19za2JfcXVldWVfdGFpbCgmYXNvYy0+YWRkaXBfY2h1bmtzLCAoc3RydWN0IHNrX2J1ZmYgKiljaHVuayk7CisJCWdvdG8gb3V0OwkKKwl9CisKKwkvKiBIb2xkIHRoZSBjaHVuayB1bnRpbCBhbiBBU0NPTkZfQUNLIGlzIHJlY2VpdmVkLiAqLworCXNjdHBfY2h1bmtfaG9sZChjaHVuayk7CisJcmV0dmFsID0gc2N0cF9wcmltaXRpdmVfQVNDT05GKGFzb2MsIGNodW5rKTsKKwlpZiAocmV0dmFsKQorCQlzY3RwX2NodW5rX2ZyZWUoY2h1bmspOworCWVsc2UKKwkJYXNvYy0+YWRkaXBfbGFzdF9hc2NvbmYgPSBjaHVuazsKKworb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qIEFkZCBhIGxpc3Qgb2YgYWRkcmVzc2VzIGFzIGJpbmQgYWRkcmVzc2VzIHRvIGxvY2FsIGVuZHBvaW50IG9yCisgKiBhc3NvY2lhdGlvbi4KKyAqCisgKiBCYXNpY2FsbHkgcnVuIHRocm91Z2ggZWFjaCBhZGRyZXNzIHNwZWNpZmllZCBpbiB0aGUgYWRkcnMvYWRkcmNudAorICogYXJyYXkvbGVuZ3RoIHBhaXIsIGRldGVybWluZSBpZiBpdCBpcyBJUHY2IG9yIElQdjQgYW5kIGNhbGwKKyAqIHNjdHBfZG9fYmluZCgpIG9uIGl0LgorICoKKyAqIElmIGFueSBvZiB0aGVtIGZhaWxzLCB0aGVuIHRoZSBvcGVyYXRpb24gd2lsbCBiZSByZXZlcnNlZCBhbmQgdGhlCisgKiBvbmVzIHRoYXQgd2VyZSBhZGRlZCB3aWxsIGJlIHJlbW92ZWQuCisgKgorICogT25seSBzY3RwX3NldHNvY2tvcHRfYmluZHgoKSBpcyBzdXBwb3NlZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24uCisgKi8KK2ludCBzY3RwX2JpbmR4X2FkZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkcnMsIGludCBhZGRyY250KQoreworCWludCBjbnQ7CisJaW50IHJldHZhbCA9IDA7CisJdm9pZCAqYWRkcl9idWY7CisJc3RydWN0IHNvY2thZGRyICpzYV9hZGRyOworCXN0cnVjdCBzY3RwX2FmICphZjsKKworCVNDVFBfREVCVUdfUFJJTlRLKCJzY3RwX2JpbmR4X2FkZCAoc2s6ICVwLCBhZGRyczogJXAsIGFkZHJjbnQ6ICVkKVxuIiwKKwkJCSAgc2ssIGFkZHJzLCBhZGRyY250KTsKKworCWFkZHJfYnVmID0gYWRkcnM7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBhZGRyY250OyBjbnQrKykgeworCQkvKiBUaGUgbGlzdCBtYXkgY29udGFpbiBlaXRoZXIgSVB2NCBvciBJUHY2IGFkZHJlc3M7CisJCSAqIGRldGVybWluZSB0aGUgYWRkcmVzcyBsZW5ndGggZm9yIHdhbGtpbmcgdGhydSB0aGUgbGlzdC4KKwkJICovCisJCXNhX2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopYWRkcl9idWY7CisJCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoc2FfYWRkci0+c2FfZmFtaWx5KTsKKwkJaWYgKCFhZikgeworCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX2JpbmR4X2FkZDsKKwkJfQorCisJCXJldHZhbCA9IHNjdHBfZG9fYmluZChzaywgKHVuaW9uIHNjdHBfYWRkciAqKXNhX2FkZHIsIAorCQkJCSAgICAgIGFmLT5zb2NrYWRkcl9sZW4pOworCisJCWFkZHJfYnVmICs9IGFmLT5zb2NrYWRkcl9sZW47CisKK2Vycl9iaW5keF9hZGQ6CisJCWlmIChyZXR2YWwgPCAwKSB7CisJCQkvKiBGYWlsZWQuIENsZWFudXAgdGhlIG9uZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgKi8KKwkJCWlmIChjbnQgPiAwKQorCQkJCXNjdHBfYmluZHhfcmVtKHNrLCBhZGRycywgY250KTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBTZW5kIGFuIEFTQ09ORiBjaHVuayB3aXRoIEFkZCBJUCBhZGRyZXNzIHBhcmFtZXRlcnMgdG8gYWxsIHRoZSBwZWVycyBvZiB0aGUKKyAqIGFzc29jaWF0aW9ucyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBlbmRwb2ludCBpbmRpY2F0aW5nIHRoYXQgYSBsaXN0IG9mIGxvY2FsCisgKiBhZGRyZXNzZXMgYXJlIGFkZGVkIHRvIHRoZSBlbmRwb2ludC4KKyAqCisgKiBJZiBhbnkgb2YgdGhlIGFkZHJlc3NlcyBpcyBhbHJlYWR5IGluIHRoZSBiaW5kIGFkZHJlc3MgbGlzdCBvZiB0aGUgCisgKiBhc3NvY2lhdGlvbiwgd2UgZG8gbm90IHNlbmQgdGhlIGNodW5rIGZvciB0aGF0IGFzc29jaWF0aW9uLiAgQnV0IGl0IHdpbGwgbm90CisgKiBhZmZlY3Qgb3RoZXIgYXNzb2NpYXRpb25zLgorICoKKyAqIE9ubHkgc2N0cF9zZXRzb2Nrb3B0X2JpbmR4KCkgaXMgc3VwcG9zZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgaW50IHNjdHBfc2VuZF9hc2NvbmZfYWRkX2lwKHN0cnVjdCBzb2NrCQkqc2ssIAorCQkJCSAgIHN0cnVjdCBzb2NrYWRkcgkqYWRkcnMsCisJCQkJICAgaW50IAkJCWFkZHJjbnQpCit7CisJc3RydWN0IHNjdHBfc29jawkJKnNwOworCXN0cnVjdCBzY3RwX2VuZHBvaW50CQkqZXA7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24JCSphc29jOworCXN0cnVjdCBzY3RwX2JpbmRfYWRkcgkJKmJwOworCXN0cnVjdCBzY3RwX2NodW5rCQkqY2h1bms7CisJc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnkJKmxhZGRyOworCXVuaW9uIHNjdHBfYWRkcgkJCSphZGRyOworCXZvaWQJCQkJKmFkZHJfYnVmOworCXN0cnVjdCBzY3RwX2FmCQkJKmFmOworCXN0cnVjdCBsaXN0X2hlYWQJCSpwb3M7CisJc3RydWN0IGxpc3RfaGVhZAkJKnA7CisJaW50IAkJCQlpOworCWludCAJCQkJcmV0dmFsID0gMDsKKworCWlmICghc2N0cF9hZGRpcF9lbmFibGUpCisJCXJldHVybiByZXR2YWw7CisKKwlzcCA9IHNjdHBfc2soc2spOworCWVwID0gc3AtPmVwOworCisJU0NUUF9ERUJVR19QUklOVEsoIiVzOiAoc2s6ICVwLCBhZGRyczogJXAsIGFkZHJjbnQ6ICVkKVxuIiwKKwkJCSAgX19GVU5DVElPTl9fLCBzaywgYWRkcnMsIGFkZHJjbnQpOworCisJbGlzdF9mb3JfZWFjaChwb3MsICZlcC0+YXNvY3MpIHsKKwkJYXNvYyA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiwgYXNvY3MpOworCisJCWlmICghYXNvYy0+cGVlci5hc2NvbmZfY2FwYWJsZSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChhc29jLT5wZWVyLmFkZGlwX2Rpc2FibGVkX21hc2sgJiBTQ1RQX1BBUkFNX0FERF9JUCkKKwkJCWNvbnRpbnVlOworCisJCWlmICghc2N0cF9zdGF0ZShhc29jLCBFU1RBQkxJU0hFRCkpCisJCQljb250aW51ZTsKKworCQkvKiBDaGVjayBpZiBhbnkgYWRkcmVzcyBpbiB0aGUgcGFja2VkIGFycmF5IG9mIGFkZHJlc3NlcyBpcworCSAgICAgICAgICogaW4gdGhlIGJpbmQgYWRkcmVzcyBsaXN0IG9mIHRoZSBhc3NvY2lhdGlvbi4gSWYgc28sIAorCQkgKiBkbyBub3Qgc2VuZCB0aGUgYXNjb25mIGNodW5rIHRvIGl0cyBwZWVyLCBidXQgY29udGludWUgd2l0aCAKKwkJICogb3RoZXIgYXNzb2NpYXRpb25zLgorCQkgKi8KKwkJYWRkcl9idWYgPSBhZGRyczsKKwkJZm9yIChpID0gMDsgaSA8IGFkZHJjbnQ7IGkrKykgeworCQkJYWRkciA9ICh1bmlvbiBzY3RwX2FkZHIgKilhZGRyX2J1ZjsKKwkJCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoYWRkci0+djQuc2luX2ZhbWlseSk7CisJCQlpZiAoIWFmKSB7CisJCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJaWYgKHNjdHBfYXNzb2NfbG9va3VwX2xhZGRyKGFzb2MsIGFkZHIpKQorCQkJCWJyZWFrOworCisJCQlhZGRyX2J1ZiArPSBhZi0+c29ja2FkZHJfbGVuOworCQl9CisJCWlmIChpIDwgYWRkcmNudCkKKwkJCWNvbnRpbnVlOworCisJCS8qIFVzZSB0aGUgZmlyc3QgYWRkcmVzcyBpbiBiaW5kIGFkZHIgbGlzdCBvZiBhc3NvY2lhdGlvbiBhcworCQkgKiBBZGRyZXNzIFBhcmFtZXRlciBvZiBBU0NPTkYgQ0hVTksuCisJCSAqLworCQlzY3RwX3JlYWRfbG9jaygmYXNvYy0+YmFzZS5hZGRyX2xvY2spOworCQlicCA9ICZhc29jLT5iYXNlLmJpbmRfYWRkcjsKKwkJcCA9IGJwLT5hZGRyZXNzX2xpc3QubmV4dDsKKwkJbGFkZHIgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5LCBsaXN0KTsKKwkJc2N0cF9yZWFkX3VubG9jaygmYXNvYy0+YmFzZS5hZGRyX2xvY2spOworCisJCWNodW5rID0gc2N0cF9tYWtlX2FzY29uZl91cGRhdGVfaXAoYXNvYywgJmxhZGRyLT5hLCBhZGRycywKKwkJCQkJCSAgIGFkZHJjbnQsIFNDVFBfUEFSQU1fQUREX0lQKTsKKwkJaWYgKCFjaHVuaykgeworCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJcmV0dmFsID0gc2N0cF9zZW5kX2FzY29uZihhc29jLCBjaHVuayk7CisKKwkJLyogRklYTUU6IEFmdGVyIHNlbmRpbmcgdGhlIGFkZCBhZGRyZXNzIEFTQ09ORiBjaHVuaywgd2UKKwkJICogY2Fubm90IGFwcGVuZCB0aGUgYWRkcmVzcyB0byB0aGUgYXNzb2NpYXRpb24ncyBiaW5kaW5nCisJCSAqIGFkZHJlc3MgbGlzdCwgYmVjYXVzZSB0aGUgbmV3IGFkZHJlc3MgbWF5IGJlIHVzZWQgYXMgdGhlCisJCSAqIHNvdXJjZSBvZiBhIG1lc3NhZ2Ugc2VudCB0byB0aGUgcGVlciBiZWZvcmUgdGhlIEFTQ09ORgorCQkgKiBjaHVuayBpcyByZWNlaXZlZCBieSB0aGUgcGVlci4gIFNvIHdlIHNob3VsZCB3YWl0IHVudGlsCisJCSAqIEFTQ09ORl9BQ0sgaXMgcmVjZWl2ZWQuCisJCSAqLworCX0KKworb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qIFJlbW92ZSBhIGxpc3Qgb2YgYWRkcmVzc2VzIGZyb20gYmluZCBhZGRyZXNzZXMgbGlzdC4gIERvIG5vdCByZW1vdmUgdGhlCisgKiBsYXN0IGFkZHJlc3MuCisgKgorICogQmFzaWNhbGx5IHJ1biB0aHJvdWdoIGVhY2ggYWRkcmVzcyBzcGVjaWZpZWQgaW4gdGhlIGFkZHJzL2FkZHJjbnQKKyAqIGFycmF5L2xlbmd0aCBwYWlyLCBkZXRlcm1pbmUgaWYgaXQgaXMgSVB2NiBvciBJUHY0IGFuZCBjYWxsCisgKiBzY3RwX2RlbF9iaW5kKCkgb24gaXQuCisgKgorICogSWYgYW55IG9mIHRoZW0gZmFpbHMsIHRoZW4gdGhlIG9wZXJhdGlvbiB3aWxsIGJlIHJldmVyc2VkIGFuZCB0aGUKKyAqIG9uZXMgdGhhdCB3ZXJlIHJlbW92ZWQgd2lsbCBiZSBhZGRlZCBiYWNrLgorICoKKyAqIEF0IGxlYXN0IG9uZSBhZGRyZXNzIGhhcyB0byBiZSBsZWZ0OyBpZiBvbmx5IG9uZSBhZGRyZXNzIGlzCisgKiBhdmFpbGFibGUsIHRoZSBvcGVyYXRpb24gd2lsbCByZXR1cm4gLUVCVVNZLgorICoKKyAqIE9ubHkgc2N0cF9zZXRzb2Nrb3B0X2JpbmR4KCkgaXMgc3VwcG9zZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLgorICovCitpbnQgc2N0cF9iaW5keF9yZW0oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJzLCBpbnQgYWRkcmNudCkKK3sKKwlzdHJ1Y3Qgc2N0cF9zb2NrICpzcCA9IHNjdHBfc2soc2spOworCXN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCA9IHNwLT5lcDsKKwlpbnQgY250OworCXN0cnVjdCBzY3RwX2JpbmRfYWRkciAqYnAgPSAmZXAtPmJhc2UuYmluZF9hZGRyOworCWludCByZXR2YWwgPSAwOworCXVuaW9uIHNjdHBfYWRkciBzYXZlYWRkcjsKKwl2b2lkICphZGRyX2J1ZjsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhX2FkZHI7CisJc3RydWN0IHNjdHBfYWYgKmFmOworCisJU0NUUF9ERUJVR19QUklOVEsoInNjdHBfYmluZHhfcmVtIChzazogJXAsIGFkZHJzOiAlcCwgYWRkcmNudDogJWQpXG4iLAorCQkJICBzaywgYWRkcnMsIGFkZHJjbnQpOworCisJYWRkcl9idWYgPSBhZGRyczsKKwlmb3IgKGNudCA9IDA7IGNudCA8IGFkZHJjbnQ7IGNudCsrKSB7CisJCS8qIElmIHRoZSBiaW5kIGFkZHJlc3MgbGlzdCBpcyBlbXB0eSBvciBpZiB0aGVyZSBpcyBvbmx5IG9uZQorCQkgKiBiaW5kIGFkZHJlc3MsIHRoZXJlIGlzIG5vdGhpbmcgbW9yZSB0byBiZSByZW1vdmVkICh3ZSBuZWVkCisJCSAqIGF0IGxlYXN0IG9uZSBhZGRyZXNzIGhlcmUpLgorCQkgKi8KKwkJaWYgKGxpc3RfZW1wdHkoJmJwLT5hZGRyZXNzX2xpc3QpIHx8CisJCSAgICAoc2N0cF9saXN0X3NpbmdsZV9lbnRyeSgmYnAtPmFkZHJlc3NfbGlzdCkpKSB7CisJCQlyZXR2YWwgPSAtRUJVU1k7CisJCQlnb3RvIGVycl9iaW5keF9yZW07CisJCX0KKworCQkvKiBUaGUgbGlzdCBtYXkgY29udGFpbiBlaXRoZXIgSVB2NCBvciBJUHY2IGFkZHJlc3M7CisJCSAqIGRldGVybWluZSB0aGUgYWRkcmVzcyBsZW5ndGggdG8gY29weSB0aGUgYWRkcmVzcyB0bworCQkgKiBzYXZlYWRkci4gCisJCSAqLworCQlzYV9hZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKWFkZHJfYnVmOworCQlhZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKHNhX2FkZHItPnNhX2ZhbWlseSk7CisJCWlmICghYWYpIHsKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl9iaW5keF9yZW07CisJCX0KKwkJbWVtY3B5KCZzYXZlYWRkciwgc2FfYWRkciwgYWYtPnNvY2thZGRyX2xlbik7IAorCQlzYXZlYWRkci52NC5zaW5fcG9ydCA9IG50b2hzKHNhdmVhZGRyLnY0LnNpbl9wb3J0KTsKKwkJaWYgKHNhdmVhZGRyLnY0LnNpbl9wb3J0ICE9IGJwLT5wb3J0KSB7CisJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJZ290byBlcnJfYmluZHhfcmVtOworCQl9CisKKwkJLyogRklYTUUgLSBUaGVyZSBpcyBwcm9iYWJseSBhIG5lZWQgdG8gY2hlY2sgaWYgc2stPnNrX3NhZGRyIGFuZAorCQkgKiBzay0+c2tfcmN2X2FkZHIgYXJlIGN1cnJlbnRseSBzZXQgdG8gb25lIG9mIHRoZSBhZGRyZXNzZXMgdG8KKwkJICogYmUgcmVtb3ZlZC4gVGhpcyBpcyBzb21ldGhpbmcgd2hpY2ggbmVlZHMgdG8gYmUgbG9va2VkIGludG8KKwkJICogd2hlbiB3ZSBhcmUgZml4aW5nIHRoZSBvdXRzdGFuZGluZyBpc3N1ZXMgd2l0aCBtdWx0aS1ob21pbmcKKwkJICogc29ja2V0IHJvdXRpbmcgYW5kIGZhaWxvdmVyIHNjaGVtZXMuIFJlZmVyIHRvIGNvbW1lbnRzIGluCisJCSAqIHNjdHBfZG9fYmluZCgpLiAtZGFpc3kKKwkJICovCisJCXNjdHBfbG9jYWxfYmhfZGlzYWJsZSgpOworCQlzY3RwX3dyaXRlX2xvY2soJmVwLT5iYXNlLmFkZHJfbG9jayk7CisKKwkJcmV0dmFsID0gc2N0cF9kZWxfYmluZF9hZGRyKGJwLCAmc2F2ZWFkZHIpOworCisJCXNjdHBfd3JpdGVfdW5sb2NrKCZlcC0+YmFzZS5hZGRyX2xvY2spOworCQlzY3RwX2xvY2FsX2JoX2VuYWJsZSgpOworCisJCWFkZHJfYnVmICs9IGFmLT5zb2NrYWRkcl9sZW47CitlcnJfYmluZHhfcmVtOgorCQlpZiAocmV0dmFsIDwgMCkgeworCQkJLyogRmFpbGVkLiBBZGQgdGhlIG9uZXMgdGhhdCBoYXMgYmVlbiByZW1vdmVkIGJhY2sgKi8KKwkJCWlmIChjbnQgPiAwKQorCQkJCXNjdHBfYmluZHhfYWRkKHNrLCBhZGRycywgY250KTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBTZW5kIGFuIEFTQ09ORiBjaHVuayB3aXRoIERlbGV0ZSBJUCBhZGRyZXNzIHBhcmFtZXRlcnMgdG8gYWxsIHRoZSBwZWVycyBvZgorICogdGhlIGFzc29jaWF0aW9ucyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBlbmRwb2ludCBpbmRpY2F0aW5nIHRoYXQgYSBsaXN0IG9mCisgKiBsb2NhbCBhZGRyZXNzZXMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgZW5kcG9pbnQuCisgKgorICogSWYgYW55IG9mIHRoZSBhZGRyZXNzZXMgaXMgYWxyZWFkeSBpbiB0aGUgYmluZCBhZGRyZXNzIGxpc3Qgb2YgdGhlIAorICogYXNzb2NpYXRpb24sIHdlIGRvIG5vdCBzZW5kIHRoZSBjaHVuayBmb3IgdGhhdCBhc3NvY2lhdGlvbi4gIEJ1dCBpdCB3aWxsIG5vdAorICogYWZmZWN0IG90aGVyIGFzc29jaWF0aW9ucy4KKyAqCisgKiBPbmx5IHNjdHBfc2V0c29ja29wdF9iaW5keCgpIGlzIHN1cHBvc2VkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIGludCBzY3RwX3NlbmRfYXNjb25mX2RlbF9pcChzdHJ1Y3Qgc29jawkJKnNrLAorCQkJCSAgIHN0cnVjdCBzb2NrYWRkcgkqYWRkcnMsCisJCQkJICAgaW50CQkJYWRkcmNudCkKK3sKKwlzdHJ1Y3Qgc2N0cF9zb2NrCSpzcDsKKwlzdHJ1Y3Qgc2N0cF9lbmRwb2ludAkqZXA7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24JKmFzb2M7CisJc3RydWN0IHNjdHBfYmluZF9hZGRyCSpicDsKKwlzdHJ1Y3Qgc2N0cF9jaHVuawkqY2h1bms7CisJdW5pb24gc2N0cF9hZGRyCQkqbGFkZHI7CisJdm9pZAkJCSphZGRyX2J1ZjsKKwlzdHJ1Y3Qgc2N0cF9hZgkJKmFmOworCXN0cnVjdCBsaXN0X2hlYWQJKnBvczsKKwlpbnQgCQkJaTsKKwlpbnQgCQkJcmV0dmFsID0gMDsKKworCWlmICghc2N0cF9hZGRpcF9lbmFibGUpCisJCXJldHVybiByZXR2YWw7CisKKwlzcCA9IHNjdHBfc2soc2spOworCWVwID0gc3AtPmVwOworCisJU0NUUF9ERUJVR19QUklOVEsoIiVzOiAoc2s6ICVwLCBhZGRyczogJXAsIGFkZHJjbnQ6ICVkKVxuIiwKKwkJCSAgX19GVU5DVElPTl9fLCBzaywgYWRkcnMsIGFkZHJjbnQpOworCisJbGlzdF9mb3JfZWFjaChwb3MsICZlcC0+YXNvY3MpIHsKKwkJYXNvYyA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiwgYXNvY3MpOworCisJCWlmICghYXNvYy0+cGVlci5hc2NvbmZfY2FwYWJsZSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChhc29jLT5wZWVyLmFkZGlwX2Rpc2FibGVkX21hc2sgJiBTQ1RQX1BBUkFNX0RFTF9JUCkKKwkJCWNvbnRpbnVlOworCisJCWlmICghc2N0cF9zdGF0ZShhc29jLCBFU1RBQkxJU0hFRCkpCisJCQljb250aW51ZTsKKworCQkvKiBDaGVjayBpZiBhbnkgYWRkcmVzcyBpbiB0aGUgcGFja2VkIGFycmF5IG9mIGFkZHJlc3NlcyBpcworCSAgICAgICAgICogbm90IHByZXNlbnQgaW4gdGhlIGJpbmQgYWRkcmVzcyBsaXN0IG9mIHRoZSBhc3NvY2lhdGlvbi4KKwkJICogSWYgc28sIGRvIG5vdCBzZW5kIHRoZSBhc2NvbmYgY2h1bmsgdG8gaXRzIHBlZXIsIGJ1dAorCQkgKiBjb250aW51ZSB3aXRoIG90aGVyIGFzc29jaWF0aW9ucy4KKwkJICovCisJCWFkZHJfYnVmID0gYWRkcnM7CisJCWZvciAoaSA9IDA7IGkgPCBhZGRyY250OyBpKyspIHsKKwkJCWxhZGRyID0gKHVuaW9uIHNjdHBfYWRkciAqKWFkZHJfYnVmOworCQkJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhsYWRkci0+djQuc2luX2ZhbWlseSk7CisJCQlpZiAoIWFmKSB7CisJCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJaWYgKCFzY3RwX2Fzc29jX2xvb2t1cF9sYWRkcihhc29jLCBsYWRkcikpCisJCQkJYnJlYWs7CisKKwkJCWFkZHJfYnVmICs9IGFmLT5zb2NrYWRkcl9sZW47CisJCX0KKwkJaWYgKGkgPCBhZGRyY250KQorCQkJY29udGludWU7CisKKwkJLyogRmluZCBvbmUgYWRkcmVzcyBpbiB0aGUgYXNzb2NpYXRpb24ncyBiaW5kIGFkZHJlc3MgbGlzdAorCQkgKiB0aGF0IGlzIG5vdCBpbiB0aGUgcGFja2VkIGFycmF5IG9mIGFkZHJlc3Nlcy4gVGhpcyBpcyB0bworCQkgKiBtYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3QgZGVsZXRlIGFsbCB0aGUgYWRkcmVzc2VzIGluIHRoZQorCQkgKiBhc3NvY2lhdGlvbi4KKwkJICovCisJCXNjdHBfcmVhZF9sb2NrKCZhc29jLT5iYXNlLmFkZHJfbG9jayk7CisJCWJwID0gJmFzb2MtPmJhc2UuYmluZF9hZGRyOworCQlsYWRkciA9IHNjdHBfZmluZF91bm1hdGNoX2FkZHIoYnAsICh1bmlvbiBzY3RwX2FkZHIgKilhZGRycywKKwkJCQkJICAgICAgIGFkZHJjbnQsIHNwKTsKKwkJc2N0cF9yZWFkX3VubG9jaygmYXNvYy0+YmFzZS5hZGRyX2xvY2spOworCQlpZiAoIWxhZGRyKQorCQkJY29udGludWU7CisKKwkJY2h1bmsgPSBzY3RwX21ha2VfYXNjb25mX3VwZGF0ZV9pcChhc29jLCBsYWRkciwgYWRkcnMsIGFkZHJjbnQsCisJCQkJCQkgICBTQ1RQX1BBUkFNX0RFTF9JUCk7CisJCWlmICghY2h1bmspIHsKKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXJldHZhbCA9IHNjdHBfc2VuZF9hc2NvbmYoYXNvYywgY2h1bmspOworCisJCS8qIEZJWE1FOiBBZnRlciBzZW5kaW5nIHRoZSBkZWxldGUgYWRkcmVzcyBBU0NPTkYgY2h1bmssIHdlCisJCSAqIGNhbm5vdCByZW1vdmUgdGhlIGFkZHJlc3NlcyBmcm9tIHRoZSBhc3NvY2lhdGlvbidzIGJpbmQKKwkJICogYWRkcmVzcyBsaXN0LCBiZWNhdXNlIHRoZXJlIG1heWJlIHNvbWUgcGFja2V0IHNlbmQgdG8KKwkJICogdGhlIGRlbGV0ZSBhZGRyZXNzZXMsIHNvIHdlIHNob3VsZCB3YWl0IHVudGlsIEFTQ09ORl9BQ0sKKwkJICogcGFja2V0IGlzIHJlY2VpdmVkLgorCQkgKi8KKwl9CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogSGVscGVyIGZvciB0dW5uZWxpbmcgc2N0cF9iaW5keCgpIHJlcXVlc3RzIHRocm91Z2ggc2N0cF9zZXRzb2Nrb3B0KCkKKyAqCisgKiBBUEkgOC4xCisgKiBpbnQgc2N0cF9iaW5keChpbnQgc2QsIHN0cnVjdCBzb2NrYWRkciAqYWRkcnMsIGludCBhZGRyY250LAorICogICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKKyAqCisgKiBJZiBzZCBpcyBhbiBJUHY0IHNvY2tldCwgdGhlIGFkZHJlc3NlcyBwYXNzZWQgbXVzdCBiZSBJUHY0IGFkZHJlc3Nlcy4KKyAqIElmIHRoZSBzZCBpcyBhbiBJUHY2IHNvY2tldCwgdGhlIGFkZHJlc3NlcyBwYXNzZWQgY2FuIGVpdGhlciBiZSBJUHY0CisgKiBvciBJUHY2IGFkZHJlc3Nlcy4KKyAqCisgKiBBIHNpbmdsZSBhZGRyZXNzIG1heSBiZSBzcGVjaWZpZWQgYXMgSU5BRERSX0FOWSBvciBJTjZBRERSX0FOWSwgc2VlCisgKiBTZWN0aW9uIDMuMS4yIGZvciB0aGlzIHVzYWdlLgorICoKKyAqIGFkZHJzIGlzIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBvbmUgb3IgbW9yZSBzb2NrZXQgYWRkcmVzc2VzLiBFYWNoCisgKiBhZGRyZXNzIGlzIGNvbnRhaW5lZCBpbiBpdHMgYXBwcm9wcmlhdGUgc3RydWN0dXJlIChpLmUuIHN0cnVjdAorICogc29ja2FkZHJfaW4gb3Igc3RydWN0IHNvY2thZGRyX2luNikgdGhlIGZhbWlseSBvZiB0aGUgYWRkcmVzcyB0eXBlCisgKiBtdXN0IGJlIHVzZWQgdG8gZGlzdGVuZ2lzaCB0aGUgYWRkcmVzcyBsZW5ndGggKG5vdGUgdGhhdCB0aGlzCisgKiByZXByZXNlbnRhdGlvbiBpcyB0ZXJtZWQgYSAicGFja2VkIGFycmF5IiBvZiBhZGRyZXNzZXMpLiBUaGUgY2FsbGVyCisgKiBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBhZGRyZXNzZXMgaW4gdGhlIGFycmF5IHdpdGggYWRkcmNudC4KKyAqCisgKiBPbiBzdWNjZXNzLCBzY3RwX2JpbmR4KCkgcmV0dXJucyAwLiBPbiBmYWlsdXJlLCBzY3RwX2JpbmR4KCkgcmV0dXJucworICogLTEsIGFuZCBzZXRzIGVycm5vIHRvIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICoKKyAqIEZvciBTQ1RQLCB0aGUgcG9ydCBnaXZlbiBpbiBlYWNoIHNvY2tldCBhZGRyZXNzIG11c3QgYmUgdGhlIHNhbWUsIG9yCisgKiBzY3RwX2JpbmR4KCkgd2lsbCBmYWlsLCBzZXR0aW5nIGVycm5vIHRvIEVJTlZBTC4KKyAqCisgKiBUaGUgZmxhZ3MgcGFyYW1ldGVyIGlzIGZvcm1lZCBmcm9tIHRoZSBiaXR3aXNlIE9SIG9mIHplcm8gb3IgbW9yZSBvZgorICogdGhlIGZvbGxvd2luZyBjdXJyZW50bHkgZGVmaW5lZCBmbGFnczoKKyAqCisgKiBTQ1RQX0JJTkRYX0FERF9BRERSCisgKgorICogU0NUUF9CSU5EWF9SRU1fQUREUgorICoKKyAqIFNDVFBfQklORFhfQUREX0FERFIgZGlyZWN0cyBTQ1RQIHRvIGFkZCB0aGUgZ2l2ZW4gYWRkcmVzc2VzIHRvIHRoZQorICogYXNzb2NpYXRpb24sIGFuZCBTQ1RQX0JJTkRYX1JFTV9BRERSIGRpcmVjdHMgU0NUUCB0byByZW1vdmUgdGhlIGdpdmVuCisgKiBhZGRyZXNzZXMgZnJvbSB0aGUgYXNzb2NpYXRpb24uIFRoZSB0d28gZmxhZ3MgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZTsKKyAqIGlmIGJvdGggYXJlIGdpdmVuLCBzY3RwX2JpbmR4KCkgd2lsbCBmYWlsIHdpdGggRUlOVkFMLiBBIGNhbGxlciBtYXkKKyAqIG5vdCByZW1vdmUgYWxsIGFkZHJlc3NlcyBmcm9tIGFuIGFzc29jaWF0aW9uOyBzY3RwX2JpbmR4KCkgd2lsbAorICogcmVqZWN0IHN1Y2ggYW4gYXR0ZW1wdCB3aXRoIEVJTlZBTC4KKyAqCisgKiBBbiBhcHBsaWNhdGlvbiBjYW4gdXNlIHNjdHBfYmluZHgoU0NUUF9CSU5EWF9BRERfQUREUikgdG8gYXNzb2NpYXRlCisgKiBhZGRpdGlvbmFsIGFkZHJlc3NlcyB3aXRoIGFuIGVuZHBvaW50IGFmdGVyIGNhbGxpbmcgYmluZCgpLiAgT3IgdXNlCisgKiBzY3RwX2JpbmR4KFNDVFBfQklORFhfUkVNX0FERFIpIHRvIHJlbW92ZSBzb21lIGFkZHJlc3NlcyBhIGxpc3RlbmluZworICogc29ja2V0IGlzIGFzc29jaWF0ZWQgd2l0aCBzbyB0aGF0IG5vIG5ldyBhc3NvY2lhdGlvbiBhY2NlcHRlZCB3aWxsIGJlCisgKiBhc3NvY2lhdGVkIHdpdGggdGhvc2UgYWRkcmVzc2VzLiBJZiB0aGUgZW5kcG9pbnQgc3VwcG9ydHMgZHluYW1pYworICogYWRkcmVzcyBhIFNDVFBfQklORFhfUkVNX0FERFIgb3IgU0NUUF9CSU5EWF9BRERfQUREUiBtYXkgY2F1c2UgYQorICogZW5kcG9pbnQgdG8gc2VuZCB0aGUgYXBwcm9wcmlhdGUgbWVzc2FnZSB0byB0aGUgcGVlciB0byBjaGFuZ2UgdGhlCisgKiBwZWVycyBhZGRyZXNzIGxpc3RzLgorICoKKyAqIEFkZGluZyBhbmQgcmVtb3ZpbmcgYWRkcmVzc2VzIGZyb20gYSBjb25uZWN0ZWQgYXNzb2NpYXRpb24gaXMKKyAqIG9wdGlvbmFsIGZ1bmN0aW9uYWxpdHkuIEltcGxlbWVudGF0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoaXMKKyAqIGZ1bmN0aW9uYWxpdHkgc2hvdWxkIHJldHVybiBFT1BOT1RTVVBQLgorICoKKyAqIEJhc2ljYWxseSBkbyBub3RoaW5nIGJ1dCBjb3B5aW5nIHRoZSBhZGRyZXNzZXMgZnJvbSB1c2VyIHRvIGtlcm5lbAorICogbGFuZCBhbmQgaW52b2tpbmcgZWl0aGVyIHNjdHBfYmluZHhfYWRkKCkgb3Igc2N0cF9iaW5keF9yZW0oKSBvbiB0aGUgc2suCisgKiBUaGlzIGlzIHVzZWQgZm9yIHR1bm5lbGluZyB0aGUgc2N0cF9iaW5keCgpIHJlcXVlc3QgdGhyb3VnaCBzY3RwX3NldHNvY2tvcHQoKSAqIGZyb20gdXNlcnNwYWNlLgorICoKKyAqIFdlIGRvbid0IHVzZSBjb3B5X2Zyb21fdXNlcigpIGZvciBvcHRpbWl6YXRpb246IHdlIGZpcnN0IGRvIHRoZQorICogc2FuaXR5IGNoZWNrcyAoYnVmZmVyIHNpemUgLWZhc3QtIGFuZCBhY2Nlc3MgY2hlY2staGVhbHRoeQorICogcG9pbnRlcik7IGlmIGFsbCBvZiB0aG9zZSBzdWNjZWVkLCB0aGVuIHdlIGNhbiBhbGxvYyB0aGUgbWVtb3J5CisgKiAoZXhwZW5zaXZlIG9wZXJhdGlvbikgbmVlZGVkIHRvIGNvcHkgdGhlIGRhdGEgdG8ga2VybmVsLiBUaGVuIHdlIGRvCisgKiB0aGUgY29weWluZyB3aXRob3V0IGNoZWNraW5nIHRoZSB1c2VyIHNwYWNlIGFyZWEKKyAqIChfX2NvcHlfZnJvbV91c2VyKCkpLgorICoKKyAqIE9uIGV4aXQgdGhlcmUgaXMgbm8gbmVlZCB0byBkbyBzb2NrZmRfcHV0KCksIHN5c19zZXRzb2Nrb3B0KCkgZG9lcworICogaXQuCisgKgorICogc2sgICAgICAgIFRoZSBzayBvZiB0aGUgc29ja2V0CisgKiBhZGRycyAgICAgVGhlIHBvaW50ZXIgdG8gdGhlIGFkZHJlc3NlcyBpbiB1c2VyIGxhbmQKKyAqIGFkZHJzc2l6ZSBTaXplIG9mIHRoZSBhZGRycyBidWZmZXIKKyAqIG9wICAgICAgICBPcGVyYXRpb24gdG8gcGVyZm9ybSAoYWRkIG9yIHJlbW92ZSwgc2VlIHRoZSBmbGFncyBvZgorICogICAgICAgICAgIHNjdHBfYmluZHgpCisgKgorICogUmV0dXJucyAwIGlmIG9rLCA8MCBlcnJubyBjb2RlIG9uIGVycm9yLgorICovCitTQ1RQX1NUQVRJQyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2JpbmR4KHN0cnVjdCBzb2NrKiBzaywKKwkJCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICphZGRycywKKwkJCQkgICAgICBpbnQgYWRkcnNfc2l6ZSwgaW50IG9wKQoreworCXN0cnVjdCBzb2NrYWRkciAqa2FkZHJzOworCWludCBlcnI7CisJaW50IGFkZHJjbnQgPSAwOworCWludCB3YWxrX3NpemUgPSAwOworCXN0cnVjdCBzb2NrYWRkciAqc2FfYWRkcjsKKwl2b2lkICphZGRyX2J1ZjsKKwlzdHJ1Y3Qgc2N0cF9hZiAqYWY7CisKKwlTQ1RQX0RFQlVHX1BSSU5USygic2N0cF9zZXRzb2NrdG9wdF9iaW5keDogc2sgJXAgYWRkcnMgJXAiCisJCQkgICIgYWRkcnNfc2l6ZSAlZCBvcHQgJWRcbiIsIHNrLCBhZGRycywgYWRkcnNfc2l6ZSwgb3ApOworCisJaWYgKHVubGlrZWx5KGFkZHJzX3NpemUgPD0gMCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ2hlY2sgdGhlIHVzZXIgcGFzc2VkIGEgaGVhbHRoeSBwb2ludGVyLiAgKi8KKwlpZiAodW5saWtlbHkoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYWRkcnMsIGFkZHJzX3NpemUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBBbGxvYyBzcGFjZSBmb3IgdGhlIGFkZHJlc3MgYXJyYXkgaW4ga2VybmVsIG1lbW9yeS4gICovCisJa2FkZHJzID0gKHN0cnVjdCBzb2NrYWRkciAqKWttYWxsb2MoYWRkcnNfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFrYWRkcnMpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChfX2NvcHlfZnJvbV91c2VyKGthZGRycywgYWRkcnMsIGFkZHJzX3NpemUpKSB7CisJCWtmcmVlKGthZGRycyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIFdhbGsgdGhyb3VnaCB0aGUgYWRkcnMgYnVmZmVyIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIGFkZHJlc3Nlcy4gKi8gCisJYWRkcl9idWYgPSBrYWRkcnM7CisJd2hpbGUgKHdhbGtfc2l6ZSA8IGFkZHJzX3NpemUpIHsKKwkJc2FfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyX2J1ZjsKKwkJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhzYV9hZGRyLT5zYV9mYW1pbHkpOworCisJCS8qIElmIHRoZSBhZGRyZXNzIGZhbWlseSBpcyBub3Qgc3VwcG9ydGVkIG9yIGlmIHRoaXMgYWRkcmVzcworCQkgKiBjYXVzZXMgdGhlIGFkZHJlc3MgYnVmZmVyIHRvIG92ZXJmbG93IHJldHVybiBFSU5WQUwuCisJCSAqLyAKKwkJaWYgKCFhZiB8fCAod2Fsa19zaXplICsgYWYtPnNvY2thZGRyX2xlbikgPiBhZGRyc19zaXplKSB7CisJCQlrZnJlZShrYWRkcnMpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYWRkcmNudCsrOworCQlhZGRyX2J1ZiArPSBhZi0+c29ja2FkZHJfbGVuOworCQl3YWxrX3NpemUgKz0gYWYtPnNvY2thZGRyX2xlbjsKKwl9CisKKwkvKiBEbyB0aGUgd29yay4gKi8KKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBTQ1RQX0JJTkRYX0FERF9BRERSOgorCQllcnIgPSBzY3RwX2JpbmR4X2FkZChzaywga2FkZHJzLCBhZGRyY250KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCQllcnIgPSBzY3RwX3NlbmRfYXNjb25mX2FkZF9pcChzaywga2FkZHJzLCBhZGRyY250KTsKKwkJYnJlYWs7CisKKwljYXNlIFNDVFBfQklORFhfUkVNX0FERFI6CisJCWVyciA9IHNjdHBfYmluZHhfcmVtKHNrLCBrYWRkcnMsIGFkZHJjbnQpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJCWVyciA9IHNjdHBfc2VuZF9hc2NvbmZfZGVsX2lwKHNrLCBrYWRkcnMsIGFkZHJjbnQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FSU5WQUw7CisJCWJyZWFrOworICAgICAgICB9OworCitvdXQ6CisJa2ZyZWUoa2FkZHJzKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qIEFQSSAzLjEuNCBjbG9zZSgpIC0gVURQIFN0eWxlIFN5bnRheAorICogQXBwbGljYXRpb25zIHVzZSBjbG9zZSgpIHRvIHBlcmZvcm0gZ3JhY2VmdWwgc2h1dGRvd24gKGFzIGRlc2NyaWJlZCBpbgorICogU2VjdGlvbiAxMC4xIG9mIFtTQ1RQXSkgb24gQUxMIHRoZSBhc3NvY2lhdGlvbnMgY3VycmVudGx5IHJlcHJlc2VudGVkCisgKiBieSBhIFVEUC1zdHlsZSBzb2NrZXQuCisgKgorICogVGhlIHN5bnRheCBpcworICoKKyAqICAgcmV0ID0gY2xvc2UoaW50IHNkKTsKKyAqCisgKiAgIHNkICAgICAgLSB0aGUgc29ja2V0IGRlc2NyaXB0b3Igb2YgdGhlIGFzc29jaWF0aW9ucyB0byBiZSBjbG9zZWQuCisgKgorICogVG8gZ3JhY2VmdWxseSBzaHV0ZG93biBhIHNwZWNpZmljIGFzc29jaWF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZQorICogVURQLXN0eWxlIHNvY2tldCwgYW4gYXBwbGljYXRpb24gc2hvdWxkIHVzZSB0aGUgc2VuZG1zZygpIGNhbGwsCisgKiBwYXNzaW5nIG5vIHVzZXIgZGF0YSwgYnV0IGluY2x1ZGluZyB0aGUgYXBwcm9wcmlhdGUgZmxhZyBpbiB0aGUKKyAqIGFuY2lsbGFyeSBkYXRhIChzZWUgU2VjdGlvbiB4eHh4KS4KKyAqCisgKiBJZiBzZCBpbiB0aGUgY2xvc2UoKSBjYWxsIGlzIGEgYnJhbmNoZWQtb2ZmIHNvY2tldCByZXByZXNlbnRpbmcgb25seQorICogb25lIGFzc29jaWF0aW9uLCB0aGUgc2h1dGRvd24gaXMgcGVyZm9ybWVkIG9uIHRoYXQgYXNzb2NpYXRpb24gb25seS4KKyAqCisgKiA0LjEuNiBjbG9zZSgpIC0gVENQIFN0eWxlIFN5bnRheAorICoKKyAqIEFwcGxpY2F0aW9ucyB1c2UgY2xvc2UoKSB0byBncmFjZWZ1bGx5IGNsb3NlIGRvd24gYW4gYXNzb2NpYXRpb24uCisgKgorICogVGhlIHN5bnRheCBpczoKKyAqCisgKiAgICBpbnQgY2xvc2UoaW50IHNkKTsKKyAqCisgKiAgICAgIHNkICAgICAgLSB0aGUgc29ja2V0IGRlc2NyaXB0b3Igb2YgdGhlIGFzc29jaWF0aW9uIHRvIGJlIGNsb3NlZC4KKyAqCisgKiBBZnRlciBhbiBhcHBsaWNhdGlvbiBjYWxscyBjbG9zZSgpIG9uIGEgc29ja2V0IGRlc2NyaXB0b3IsIG5vIGZ1cnRoZXIKKyAqIHNvY2tldCBvcGVyYXRpb25zIHdpbGwgc3VjY2VlZCBvbiB0aGF0IGRlc2NyaXB0b3IuCisgKgorICogQVBJIDcuMS40IFNPX0xJTkdFUgorICoKKyAqIEFuIGFwcGxpY2F0aW9uIHVzaW5nIHRoZSBUQ1Atc3R5bGUgc29ja2V0IGNhbiB1c2UgdGhpcyBvcHRpb24gdG8KKyAqIHBlcmZvcm0gdGhlIFNDVFAgQUJPUlQgcHJpbWl0aXZlLiAgVGhlIGxpbmdlciBvcHRpb24gc3RydWN0dXJlIGlzOgorICoKKyAqICBzdHJ1Y3QgIGxpbmdlciB7CisgKiAgICAgaW50ICAgICBsX29ub2ZmOyAgICAgICAgICAgICAgICAvLyBvcHRpb24gb24vb2ZmCisgKiAgICAgaW50ICAgICBsX2xpbmdlcjsgICAgICAgICAgICAgICAvLyBsaW5nZXIgdGltZQorICogfTsKKyAqCisgKiBUbyBlbmFibGUgdGhlIG9wdGlvbiwgc2V0IGxfb25vZmYgdG8gMS4gIElmIHRoZSBsX2xpbmdlciB2YWx1ZSBpcyBzZXQKKyAqIHRvIDAsIGNhbGxpbmcgY2xvc2UoKSBpcyB0aGUgc2FtZSBhcyB0aGUgQUJPUlQgcHJpbWl0aXZlLiAgSWYgdGhlCisgKiB2YWx1ZSBpcyBzZXQgdG8gYSBuZWdhdGl2ZSB2YWx1ZSwgdGhlIHNldHNvY2tvcHQoKSBjYWxsIHdpbGwgcmV0dXJuCisgKiBhbiBlcnJvci4gIElmIHRoZSB2YWx1ZSBpcyBzZXQgdG8gYSBwb3NpdGl2ZSB2YWx1ZSBsaW5nZXJfdGltZSwgdGhlCisgKiBjbG9zZSgpIGNhbiBiZSBibG9ja2VkIGZvciBhdCBtb3N0IGxpbmdlcl90aW1lIG1zLiAgSWYgdGhlIGdyYWNlZnVsCisgKiBzaHV0ZG93biBwaGFzZSBkb2VzIG5vdCBmaW5pc2ggZHVyaW5nIHRoaXMgcGVyaW9kLCBjbG9zZSgpIHdpbGwKKyAqIHJldHVybiBidXQgdGhlIGdyYWNlZnVsIHNodXRkb3duIHBoYXNlIGNvbnRpbnVlcyBpbiB0aGUgc3lzdGVtLgorICovCitTQ1RQX1NUQVRJQyB2b2lkIHNjdHBfY2xvc2Uoc3RydWN0IHNvY2sgKnNrLCBsb25nIHRpbWVvdXQpCit7CisJc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwOworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKnRlbXA7CisKKwlTQ1RQX0RFQlVHX1BSSU5USygic2N0cF9jbG9zZShzazogMHglcCwgdGltZW91dDolbGQpXG4iLCBzaywgdGltZW91dCk7CisKKwlzY3RwX2xvY2tfc29jayhzayk7CisJc2stPnNrX3NodXRkb3duID0gU0hVVERPV05fTUFTSzsKKworCWVwID0gc2N0cF9zayhzayktPmVwOworCisJLyogV2FsayBhbGwgYXNzb2NpYXRpb25zIG9uIGEgc29ja2V0LCBub3Qgb24gYW4gZW5kcG9pbnQuICAqLworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRlbXAsICZlcC0+YXNvY3MpIHsKKwkJYXNvYyA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiwgYXNvY3MpOworCisJCWlmIChzY3RwX3N0eWxlKHNrLCBUQ1ApKSB7CisJCQkvKiBBIGNsb3NlZCBhc3NvY2lhdGlvbiBjYW4gc3RpbGwgYmUgaW4gdGhlIGxpc3QgaWYKKwkJCSAqIGl0IGJlbG9uZ3MgdG8gYSBUQ1Atc3R5bGUgbGlzdGVuaW5nIHNvY2tldCB0aGF0IGlzCisJCQkgKiBub3QgeWV0IGFjY2VwdGVkLiBJZiBzbywgZnJlZSBpdC4gSWYgbm90LCBzZW5kIGFuCisJCQkgKiBBQk9SVCBvciBTSFVURE9XTiBiYXNlZCBvbiB0aGUgbGluZ2VyIG9wdGlvbnMuCisJCQkgKi8KKwkJCWlmIChzY3RwX3N0YXRlKGFzb2MsIENMT1NFRCkpIHsKKwkJCQlzY3RwX3VuaGFzaF9lc3RhYmxpc2hlZChhc29jKTsKKwkJCQlzY3RwX2Fzc29jaWF0aW9uX2ZyZWUoYXNvYyk7CisKKwkJCX0gZWxzZSBpZiAoc29ja19mbGFnKHNrLCBTT0NLX0xJTkdFUikgJiYKKwkJCQkgICAhc2stPnNrX2xpbmdlcnRpbWUpCisJCQkJc2N0cF9wcmltaXRpdmVfQUJPUlQoYXNvYywgTlVMTCk7CisJCQllbHNlCisJCQkJc2N0cF9wcmltaXRpdmVfU0hVVERPV04oYXNvYywgTlVMTCk7CisJCX0gZWxzZQorCQkJc2N0cF9wcmltaXRpdmVfU0hVVERPV04oYXNvYywgTlVMTCk7CisJfQorCisJLyogQ2xlYW4gdXAgYW55IHNrYnMgc2l0dGluZyBvbiB0aGUgcmVjZWl2ZSBxdWV1ZS4gICovCisJc2N0cF9xdWV1ZV9wdXJnZV91bHBldmVudHMoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwlzY3RwX3F1ZXVlX3B1cmdlX3VscGV2ZW50cygmc2N0cF9zayhzayktPnBkX2xvYmJ5KTsKKworCS8qIE9uIGEgVENQLXN0eWxlIHNvY2tldCwgYmxvY2sgZm9yIGF0IG1vc3QgbGluZ2VyX3RpbWUgaWYgc2V0LiAqLworCWlmIChzY3RwX3N0eWxlKHNrLCBUQ1ApICYmIHRpbWVvdXQpCisJCXNjdHBfd2FpdF9mb3JfY2xvc2Uoc2ssIHRpbWVvdXQpOworCisJLyogVGhpcyB3aWxsIHJ1biB0aGUgYmFja2xvZyBxdWV1ZS4gICovCisJc2N0cF9yZWxlYXNlX3NvY2soc2spOworCisJLyogU3VwcG9zZWRseSwgbm8gcHJvY2VzcyBoYXMgYWNjZXNzIHRvIHRoZSBzb2NrZXQsIGJ1dAorCSAqIHRoZSBuZXQgbGF5ZXJzIHN0aWxsIG1heS4KKwkgKi8KKwlzY3RwX2xvY2FsX2JoX2Rpc2FibGUoKTsKKwlzY3RwX2JoX2xvY2tfc29jayhzayk7CisKKwkvKiBIb2xkIHRoZSBzb2NrLCBzaW5jZSBza19jb21tb25fcmVsZWFzZSgpIHdpbGwgcHV0IHNvY2tfcHV0KCkKKwkgKiBhbmQgd2UgaGF2ZSBqdXN0IGEgbGl0dGxlIG1vcmUgY2xlYW51cC4KKwkgKi8KKwlzb2NrX2hvbGQoc2spOworCXNrX2NvbW1vbl9yZWxlYXNlKHNrKTsKKworCXNjdHBfYmhfdW5sb2NrX3NvY2soc2spOworCXNjdHBfbG9jYWxfYmhfZW5hYmxlKCk7CisKKwlzb2NrX3B1dChzayk7CisKKwlTQ1RQX0RCR19PQkpDTlRfREVDKHNvY2spOworfQorCisvKiBIYW5kbGUgRVBJUEUgZXJyb3IuICovCitzdGF0aWMgaW50IHNjdHBfZXJyb3Ioc3RydWN0IHNvY2sgKnNrLCBpbnQgZmxhZ3MsIGludCBlcnIpCit7CisJaWYgKGVyciA9PSAtRVBJUEUpCisJCWVyciA9IHNvY2tfZXJyb3Ioc2spID8gOiAtRVBJUEU7CisJaWYgKGVyciA9PSAtRVBJUEUgJiYgIShmbGFncyAmIE1TR19OT1NJR05BTCkpCisJCXNlbmRfc2lnKFNJR1BJUEUsIGN1cnJlbnQsIDApOworCXJldHVybiBlcnI7Cit9CisKKy8qIEFQSSAzLjEuMyBzZW5kbXNnKCkgLSBVRFAgU3R5bGUgU3ludGF4CisgKgorICogQW4gYXBwbGljYXRpb24gdXNlcyBzZW5kbXNnKCkgYW5kIHJlY3Ztc2coKSBjYWxscyB0byB0cmFuc21pdCBkYXRhIHRvCisgKiBhbmQgcmVjZWl2ZSBkYXRhIGZyb20gaXRzIHBlZXIuCisgKgorICogIHNzaXplX3Qgc2VuZG1zZyhpbnQgc29ja2V0LCBjb25zdCBzdHJ1Y3QgbXNnaGRyICptZXNzYWdlLAorICogICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpOworICoKKyAqICBzb2NrZXQgIC0gdGhlIHNvY2tldCBkZXNjcmlwdG9yIG9mIHRoZSBlbmRwb2ludC4KKyAqICBtZXNzYWdlIC0gcG9pbnRlciB0byB0aGUgbXNnaGRyIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyBhIHNpbmdsZQorICogICAgICAgICAgICB1c2VyIG1lc3NhZ2UgYW5kIHBvc3NpYmx5IHNvbWUgYW5jaWxsYXJ5IGRhdGEuCisgKgorICogICAgICAgICAgICBTZWUgU2VjdGlvbiA1IGZvciBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGF0YQorICogICAgICAgICAgICBzdHJ1Y3R1cmVzLgorICoKKyAqICBmbGFncyAgIC0gZmxhZ3Mgc2VudCBvciByZWNlaXZlZCB3aXRoIHRoZSB1c2VyIG1lc3NhZ2UsIHNlZSBTZWN0aW9uCisgKiAgICAgICAgICAgIDUgZm9yIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZSBmbGFncy4KKyAqCisgKiBOb3RlOiAgVGhpcyBmdW5jdGlvbiBjb3VsZCB1c2UgYSByZXdyaXRlIGVzcGVjaWFsbHkgd2hlbiBleHBsaWNpdAorICogY29ubmVjdCBzdXBwb3J0IGNvbWVzIGluLgorICovCisvKiBCVUc6ICBXZSBkbyBub3QgaW1wbGVtZW50IHRoZSBlcXVpdmFsZW50IG9mIHNrX3N0cmVhbV93YWl0X21lbW9yeSgpLiAqLworCitTQ1RQX1NUQVRJQyBpbnQgc2N0cF9tc2doZHJfcGFyc2UoY29uc3Qgc3RydWN0IG1zZ2hkciAqLCBzY3RwX2Ntc2dzX3QgKik7CisKK1NDVFBfU1RBVElDIGludCBzY3RwX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IG1zZ19sZW4pCit7CisJc3RydWN0IHNjdHBfc29jayAqc3A7CisJc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwOworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICpuZXdfYXNvYz1OVUxMLCAqYXNvYz1OVUxMOworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0LCAqY2h1bmtfdHA7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rOworCXVuaW9uIHNjdHBfYWRkciB0bzsKKwlzdHJ1Y3Qgc29ja2FkZHIgKm1zZ19uYW1lID0gTlVMTDsKKwlzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvIGRlZmF1bHRfc2luZm8gPSB7IDAgfTsKKwlzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICpzaW5mbzsKKwlzdHJ1Y3Qgc2N0cF9pbml0bXNnICpzaW5pdDsKKwlzY3RwX2Fzc29jX3QgYXNzb2NpZCA9IDA7CisJc2N0cF9jbXNnc190IGNtc2dzID0geyBOVUxMIH07CisJaW50IGVycjsKKwlzY3RwX3Njb3BlX3Qgc2NvcGU7CisJbG9uZyB0aW1lbzsKKwlfX3UxNiBzaW5mb19mbGFncyA9IDA7CisJc3RydWN0IHNjdHBfZGF0YW1zZyAqZGF0YW1zZzsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJaW50IG1zZ19mbGFncyA9IG1zZy0+bXNnX2ZsYWdzOworCisJU0NUUF9ERUJVR19QUklOVEsoInNjdHBfc2VuZG1zZyhzazogJXAsIG1zZzogJXAsIG1zZ19sZW46ICV6dSlcbiIsCisJCQkgIHNrLCBtc2csIG1zZ19sZW4pOworCisJZXJyID0gMDsKKwlzcCA9IHNjdHBfc2soc2spOworCWVwID0gc3AtPmVwOworCisJU0NUUF9ERUJVR19QUklOVEsoIlVzaW5nIGVuZHBvaW50OiAlcy5cbiIsIGVwLT5kZWJ1Z19uYW1lKTsKKworCS8qIFdlIGNhbm5vdCBzZW5kIGEgbWVzc2FnZSBvdmVyIGEgVENQLXN0eWxlIGxpc3RlbmluZyBzb2NrZXQuICovCisJaWYgKHNjdHBfc3R5bGUoc2ssIFRDUCkgJiYgc2N0cF9zc3RhdGUoc2ssIExJU1RFTklORykpIHsKKwkJZXJyID0gLUVQSVBFOworCQlnb3RvIG91dF9ub3VubG9jazsKKwl9CisKKwkvKiBQYXJzZSBvdXQgdGhlIFNDVFAgQ01TR3MuICAqLworCWVyciA9IHNjdHBfbXNnaGRyX3BhcnNlKG1zZywgJmNtc2dzKTsKKworCWlmIChlcnIpIHsKKwkJU0NUUF9ERUJVR19QUklOVEsoIm1zZ2hkciBwYXJzZSBlcnIgPSAleFxuIiwgZXJyKTsKKwkJZ290byBvdXRfbm91bmxvY2s7CisJfQorCisJLyogRmV0Y2ggdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgZm9yIHRoaXMgcGFja2V0LiAgVGhpcworCSAqIGFkZHJlc3Mgb25seSBzZWxlY3RzIHRoZSBhc3NvY2lhdGlvbi0taXQgaXMgbm90IG5lY2Vzc2FyaWx5CisJICogdGhlIGFkZHJlc3Mgd2Ugd2lsbCBzZW5kIHRvLgorCSAqIEZvciBhIHBlZWxlZC1vZmYgc29ja2V0LCBtc2dfbmFtZSBpcyBpZ25vcmVkLgorCSAqLworCWlmICghc2N0cF9zdHlsZShzaywgVURQX0hJR0hfQkFORFdJRFRIKSAmJiBtc2ctPm1zZ19uYW1lKSB7CisJCWludCBtc2dfbmFtZWxlbiA9IG1zZy0+bXNnX25hbWVsZW47CisKKwkJZXJyID0gc2N0cF92ZXJpZnlfYWRkcihzaywgKHVuaW9uIHNjdHBfYWRkciAqKW1zZy0+bXNnX25hbWUsCisJCQkJICAgICAgIG1zZ19uYW1lbGVuKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJaWYgKG1zZ19uYW1lbGVuID4gc2l6ZW9mKHRvKSkKKwkJCW1zZ19uYW1lbGVuID0gc2l6ZW9mKHRvKTsKKwkJbWVtY3B5KCZ0bywgbXNnLT5tc2dfbmFtZSwgbXNnX25hbWVsZW4pOworCQlTQ1RQX0RFQlVHX1BSSU5USygiSnVzdCBtZW1jcHknZC4gbXNnX25hbWUgaXMgIgorCQkJCSAgIjB4JXg6JXUuXG4iLAorCQkJCSAgdG8udjQuc2luX2FkZHIuc19hZGRyLCB0by52NC5zaW5fcG9ydCk7CisKKwkJdG8udjQuc2luX3BvcnQgPSBudG9ocyh0by52NC5zaW5fcG9ydCk7CisJCW1zZ19uYW1lID0gbXNnLT5tc2dfbmFtZTsKKwl9CisKKwlzaW5mbyA9IGNtc2dzLmluZm87CisJc2luaXQgPSBjbXNncy5pbml0OworCisJLyogRGlkIHRoZSB1c2VyIHNwZWNpZnkgU05EUkNWSU5GTz8gICovCisJaWYgKHNpbmZvKSB7CisJCXNpbmZvX2ZsYWdzID0gc2luZm8tPnNpbmZvX2ZsYWdzOworCQlhc3NvY2lkID0gc2luZm8tPnNpbmZvX2Fzc29jX2lkOworCX0KKworCVNDVFBfREVCVUdfUFJJTlRLKCJtc2dfbGVuOiAlenUsIHNpbmZvX2ZsYWdzOiAweCV4XG4iLAorCQkJICBtc2dfbGVuLCBzaW5mb19mbGFncyk7CisKKwkvKiBNU0dfRU9GIG9yIE1TR19BQk9SVCBjYW5ub3QgYmUgc2V0IG9uIGEgVENQLXN0eWxlIHNvY2tldC4gKi8KKwlpZiAoc2N0cF9zdHlsZShzaywgVENQKSAmJiAoc2luZm9fZmxhZ3MgJiAoTVNHX0VPRiB8IE1TR19BQk9SVCkpKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X25vdW5sb2NrOworCX0KKworCS8qIElmIE1TR19FT0YgaXMgc2V0LCBubyBkYXRhIGNhbiBiZSBzZW50LiBEaXNhbGxvdyBzZW5kaW5nIHplcm8KKwkgKiBsZW5ndGggbWVzc2FnZXMgd2hlbiBNU0dfRU9GfE1TR19BQk9SVCBpcyBub3Qgc2V0LgorCSAqIElmIE1TR19BQk9SVCBpcyBzZXQsIHRoZSBtZXNzYWdlIGxlbmd0aCBjb3VsZCBiZSBub24gemVybyB3aXRoCisJICogdGhlIG1zZ19pb3Ygc2V0IHRvIHRoZSB1c2VyIGFib3J0IHJlYXNvbi4KKyAJICovCisJaWYgKCgoc2luZm9fZmxhZ3MgJiBNU0dfRU9GKSAmJiAobXNnX2xlbiA+IDApKSB8fAorCSAgICAoIShzaW5mb19mbGFncyAmIChNU0dfRU9GfE1TR19BQk9SVCkpICYmIChtc2dfbGVuID09IDApKSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dF9ub3VubG9jazsKKwl9CisKKwkvKiBJZiBNU0dfQUREUl9PVkVSIGlzIHNldCwgdGhlcmUgbXVzdCBiZSBhbiBhZGRyZXNzCisJICogc3BlY2lmaWVkIGluIG1zZ19uYW1lLgorCSAqLworCWlmICgoc2luZm9fZmxhZ3MgJiBNU0dfQUREUl9PVkVSKSAmJiAoIW1zZy0+bXNnX25hbWUpKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X25vdW5sb2NrOworCX0KKworCXRyYW5zcG9ydCA9IE5VTEw7CisKKwlTQ1RQX0RFQlVHX1BSSU5USygiQWJvdXQgdG8gbG9vayB1cCBhc3NvY2lhdGlvbi5cbiIpOworCisJc2N0cF9sb2NrX3NvY2soc2spOworCisJLyogSWYgYSBtc2dfbmFtZSBoYXMgYmVlbiBzcGVjaWZpZWQsIGFzc3VtZSB0aGlzIGlzIHRvIGJlIHVzZWQuICAqLworCWlmIChtc2dfbmFtZSkgeworCQkvKiBMb29rIGZvciBhIG1hdGNoaW5nIGFzc29jaWF0aW9uIG9uIHRoZSBlbmRwb2ludC4gKi8KKwkJYXNvYyA9IHNjdHBfZW5kcG9pbnRfbG9va3VwX2Fzc29jKGVwLCAmdG8sICZ0cmFuc3BvcnQpOworCQlpZiAoIWFzb2MpIHsKKwkJCS8qIElmIHdlIGNvdWxkIG5vdCBmaW5kIGEgbWF0Y2hpbmcgYXNzb2NpYXRpb24gb24gdGhlCisJCQkgKiBlbmRwb2ludCwgbWFrZSBzdXJlIHRoYXQgaXQgaXMgbm90IGEgVENQLXN0eWxlCisJCQkgKiBzb2NrZXQgdGhhdCBhbHJlYWR5IGhhcyBhbiBhc3NvY2lhdGlvbiBvciB0aGVyZSBpcworCQkJICogbm8gcGVlbGVkLW9mZiBhc3NvY2lhdGlvbiBvbiBhbm90aGVyIHNvY2tldC4KKwkJCSAqLworCQkJaWYgKChzY3RwX3N0eWxlKHNrLCBUQ1ApICYmCisJCQkgICAgIHNjdHBfc3N0YXRlKHNrLCBFU1RBQkxJU0hFRCkpIHx8CisJCQkgICAgc2N0cF9lbmRwb2ludF9pc19wZWVsZWRfb2ZmKGVwLCAmdG8pKSB7CisJCQkJZXJyID0gLUVBRERSTk9UQVZBSUw7CisJCQkJZ290byBvdXRfdW5sb2NrOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIGFzc29jaWQpOworCQlpZiAoIWFzb2MpIHsKKwkJCWVyciA9IC1FUElQRTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCX0KKworCWlmIChhc29jKSB7CisJCVNDVFBfREVCVUdfUFJJTlRLKCJKdXN0IGxvb2tlZCB1cCBhc3NvY2lhdGlvbjogJXAuXG4iLCBhc29jKTsKKworCQkvKiBXZSBjYW5ub3Qgc2VuZCBhIG1lc3NhZ2Ugb24gYSBUQ1Atc3R5bGUgU0NUUF9TU19FU1RBQkxJU0hFRAorCQkgKiBzb2NrZXQgdGhhdCBoYXMgYW4gYXNzb2NpYXRpb24gaW4gQ0xPU0VEIHN0YXRlLiBUaGlzIGNhbgorCQkgKiBoYXBwZW4gd2hlbiBhbiBhY2NlcHRlZCBzb2NrZXQgaGFzIGFuIGFzc29jaWF0aW9uIHRoYXQgaXMKKwkJICogYWxyZWFkeSBDTE9TRUQuCisJCSAqLworCQlpZiAoc2N0cF9zdGF0ZShhc29jLCBDTE9TRUQpICYmIHNjdHBfc3R5bGUoc2ssIFRDUCkpIHsKKwkJCWVyciA9IC1FUElQRTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCisJCWlmIChzaW5mb19mbGFncyAmIE1TR19FT0YpIHsKKwkJCVNDVFBfREVCVUdfUFJJTlRLKCJTaHV0dGluZyBkb3duIGFzc29jaWF0aW9uOiAlcFxuIiwKKwkJCQkJICBhc29jKTsKKwkJCXNjdHBfcHJpbWl0aXZlX1NIVVRET1dOKGFzb2MsIE5VTEwpOworCQkJZXJyID0gMDsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCQlpZiAoc2luZm9fZmxhZ3MgJiBNU0dfQUJPUlQpIHsKKwkJCVNDVFBfREVCVUdfUFJJTlRLKCJBYm9ydGluZyBhc3NvY2lhdGlvbjogJXBcbiIsIGFzb2MpOworCQkJc2N0cF9wcmltaXRpdmVfQUJPUlQoYXNvYywgbXNnKTsKKwkJCWVyciA9IDA7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKwl9CisKKwkvKiBEbyB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgYXNzb2NpYXRpb24/ICAqLworCWlmICghYXNvYykgeworCQlTQ1RQX0RFQlVHX1BSSU5USygiVGhlcmUgaXMgbm8gYXNzb2NpYXRpb24geWV0LlxuIik7CisKKwkJaWYgKHNpbmZvX2ZsYWdzICYgKE1TR19FT0YgfCBNU0dfQUJPUlQpKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisKKwkJLyogQ2hlY2sgZm9yIGludmFsaWQgc3RyZWFtIGFnYWluc3QgdGhlIHN0cmVhbSBjb3VudHMsCisJCSAqIGVpdGhlciB0aGUgZGVmYXVsdCBvciB0aGUgdXNlciBzcGVjaWZpZWQgc3RyZWFtIGNvdW50cy4KKwkJICovCisJCWlmIChzaW5mbykgeworCQkJaWYgKCFzaW5pdCB8fCAoc2luaXQgJiYgIXNpbml0LT5zaW5pdF9udW1fb3N0cmVhbXMpKSB7CisJCQkJLyogQ2hlY2sgYWdhaW5zdCB0aGUgZGVmYXVsdHMuICovCisJCQkJaWYgKHNpbmZvLT5zaW5mb19zdHJlYW0gPj0KKwkJCQkgICAgc3AtPmluaXRtc2cuc2luaXRfbnVtX29zdHJlYW1zKSB7CisJCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJCWdvdG8gb3V0X3VubG9jazsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIENoZWNrIGFnYWluc3QgdGhlIHJlcXVlc3RlZC4gICovCisJCQkJaWYgKHNpbmZvLT5zaW5mb19zdHJlYW0gPj0KKwkJCQkgICAgc2luaXQtPnNpbml0X251bV9vc3RyZWFtcykgeworCQkJCQllcnIgPSAtRUlOVkFMOworCQkJCQlnb3RvIG91dF91bmxvY2s7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyoKKwkJICogQVBJIDMuMS4yIGJpbmQoKSAtIFVEUCBTdHlsZSBTeW50YXgKKwkJICogSWYgYSBiaW5kKCkgb3Igc2N0cF9iaW5keCgpIGlzIG5vdCBjYWxsZWQgcHJpb3IgdG8gYQorCQkgKiBzZW5kbXNnKCkgY2FsbCB0aGF0IGluaXRpYXRlcyBhIG5ldyBhc3NvY2lhdGlvbiwgdGhlCisJCSAqIHN5c3RlbSBwaWNrcyBhbiBlcGhlbWVyYWwgcG9ydCBhbmQgd2lsbCBjaG9vc2UgYW4gYWRkcmVzcworCQkgKiBzZXQgZXF1aXZhbGVudCB0byBiaW5kaW5nIHdpdGggYSB3aWxkY2FyZCBhZGRyZXNzLgorCQkgKi8KKwkJaWYgKCFlcC0+YmFzZS5iaW5kX2FkZHIucG9ydCkgeworCQkJaWYgKHNjdHBfYXV0b2JpbmQoc2spKSB7CisJCQkJZXJyID0gLUVBR0FJTjsKKwkJCQlnb3RvIG91dF91bmxvY2s7CisJCQl9CisJCX0KKworCQlzY29wZSA9IHNjdHBfc2NvcGUoJnRvKTsKKwkJbmV3X2Fzb2MgPSBzY3RwX2Fzc29jaWF0aW9uX25ldyhlcCwgc2ssIHNjb3BlLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFuZXdfYXNvYykgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCQlhc29jID0gbmV3X2Fzb2M7CisKKwkJLyogSWYgdGhlIFNDVFBfSU5JVCBhbmNpbGxhcnkgZGF0YSBpcyBzcGVjaWZpZWQsIHNldCBhbGwKKwkJICogdGhlIGFzc29jaWF0aW9uIGluaXQgdmFsdWVzIGFjY29yZGluZ2x5LgorCQkgKi8KKwkJaWYgKHNpbml0KSB7CisJCQlpZiAoc2luaXQtPnNpbml0X251bV9vc3RyZWFtcykgeworCQkJCWFzb2MtPmMuc2luaXRfbnVtX29zdHJlYW1zID0KKwkJCQkJc2luaXQtPnNpbml0X251bV9vc3RyZWFtczsKKwkJCX0KKwkJCWlmIChzaW5pdC0+c2luaXRfbWF4X2luc3RyZWFtcykgeworCQkJCWFzb2MtPmMuc2luaXRfbWF4X2luc3RyZWFtcyA9CisJCQkJCXNpbml0LT5zaW5pdF9tYXhfaW5zdHJlYW1zOworCQkJfQorCQkJaWYgKHNpbml0LT5zaW5pdF9tYXhfYXR0ZW1wdHMpIHsKKwkJCQlhc29jLT5tYXhfaW5pdF9hdHRlbXB0cworCQkJCQk9IHNpbml0LT5zaW5pdF9tYXhfYXR0ZW1wdHM7CisJCQl9CisJCQlpZiAoc2luaXQtPnNpbml0X21heF9pbml0X3RpbWVvKSB7CisJCQkJYXNvYy0+bWF4X2luaXRfdGltZW8gPSAKKwkJCQkgbXNlY3NfdG9famlmZmllcyhzaW5pdC0+c2luaXRfbWF4X2luaXRfdGltZW8pOworCQkJfQorCQl9CisKKwkJLyogUHJpbWUgdGhlIHBlZXIncyB0cmFuc3BvcnQgc3RydWN0dXJlcy4gICovCisJCXRyYW5zcG9ydCA9IHNjdHBfYXNzb2NfYWRkX3BlZXIoYXNvYywgJnRvLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF0cmFuc3BvcnQpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCWVyciA9IHNjdHBfYXNzb2Nfc2V0X2JpbmRfYWRkcl9mcm9tX2VwKGFzb2MsIEdGUF9LRVJORUwpOworCQlpZiAoZXJyIDwgMCkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwl9CisKKwkvKiBBU1NFUlQ6IHdlIGhhdmUgYSB2YWxpZCBhc3NvY2lhdGlvbiBhdCB0aGlzIHBvaW50LiAgKi8KKwlTQ1RQX0RFQlVHX1BSSU5USygiV2UgaGF2ZSBhIHZhbGlkIGFzc29jaWF0aW9uLlxuIik7CisKKwlpZiAoIXNpbmZvKSB7CisJCS8qIElmIHRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IFNORFJDVklORk8sIG1ha2UgdXAgb25lIHdpdGgKKwkJICogc29tZSBkZWZhdWx0cy4KKwkJICovCisJCWRlZmF1bHRfc2luZm8uc2luZm9fc3RyZWFtID0gYXNvYy0+ZGVmYXVsdF9zdHJlYW07CisJCWRlZmF1bHRfc2luZm8uc2luZm9fZmxhZ3MgPSBhc29jLT5kZWZhdWx0X2ZsYWdzOworCQlkZWZhdWx0X3NpbmZvLnNpbmZvX3BwaWQgPSBhc29jLT5kZWZhdWx0X3BwaWQ7CisJCWRlZmF1bHRfc2luZm8uc2luZm9fY29udGV4dCA9IGFzb2MtPmRlZmF1bHRfY29udGV4dDsKKwkJZGVmYXVsdF9zaW5mby5zaW5mb190aW1ldG9saXZlID0gYXNvYy0+ZGVmYXVsdF90aW1ldG9saXZlOworCQlkZWZhdWx0X3NpbmZvLnNpbmZvX2Fzc29jX2lkID0gc2N0cF9hc3NvYzJpZChhc29jKTsKKwkJc2luZm8gPSAmZGVmYXVsdF9zaW5mbzsKKwl9CisKKwkvKiBBUEkgNy4xLjcsIHRoZSBzbmRidWYgc2l6ZSBwZXIgYXNzb2NpYXRpb24gYm91bmRzIHRoZQorCSAqIG1heGltdW0gc2l6ZSBvZiBkYXRhIHRoYXQgY2FuIGJlIHNlbnQgaW4gYSBzaW5nbGUgc2VuZCBjYWxsLgorCSAqLworCWlmIChtc2dfbGVuID4gc2stPnNrX3NuZGJ1ZikgeworCQllcnIgPSAtRU1TR1NJWkU7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJLyogSWYgZnJhZ21lbnRhdGlvbiBpcyBkaXNhYmxlZCBhbmQgdGhlIG1lc3NhZ2UgbGVuZ3RoIGV4Y2VlZHMgdGhlCisJICogYXNzb2NpYXRpb24gZnJhZ21lbnRhdGlvbiBwb2ludCwgcmV0dXJuIEVNU0dTSVpFLiAgVGhlIEktRAorCSAqIGRvZXMgbm90IHNwZWNpZnkgd2hhdCB0aGlzIGVycm9yIGlzLCBidXQgdGhpcyBsb29rcyBsaWtlCisJICogYSBncmVhdCBmaXQuCisJICovCisJaWYgKHNjdHBfc2soc2spLT5kaXNhYmxlX2ZyYWdtZW50cyAmJiAobXNnX2xlbiA+IGFzb2MtPmZyYWdfcG9pbnQpKSB7CisJCWVyciA9IC1FTVNHU0laRTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlpZiAoc2luZm8pIHsKKwkJLyogQ2hlY2sgZm9yIGludmFsaWQgc3RyZWFtLiAqLworCQlpZiAoc2luZm8tPnNpbmZvX3N0cmVhbSA+PSBhc29jLT5jLnNpbml0X251bV9vc3RyZWFtcykgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwl9CisKKwl0aW1lbyA9IHNvY2tfc25kdGltZW8oc2ssIG1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlUKTsKKwlpZiAoIXNjdHBfd3NwYWNlKGFzb2MpKSB7CisJCWVyciA9IHNjdHBfd2FpdF9mb3Jfc25kYnVmKGFzb2MsICZ0aW1lbywgbXNnX2xlbik7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9mcmVlOworCX0KKworCS8qIElmIGFuIGFkZHJlc3MgaXMgcGFzc2VkIHdpdGggdGhlIHNlbmR0by9zZW5kbXNnIGNhbGwsIGl0IGlzIHVzZWQKKwkgKiB0byBvdmVycmlkZSB0aGUgcHJpbWFyeSBkZXN0aW5hdGlvbiBhZGRyZXNzIGluIHRoZSBUQ1AgbW9kZWwsIG9yCisJICogd2hlbiBNU0dfQUREUl9PVkVSIGZsYWcgaXMgc2V0IGluIHRoZSBVRFAgbW9kZWwuCisJICovCisJaWYgKChzY3RwX3N0eWxlKHNrLCBUQ1ApICYmIG1zZ19uYW1lKSB8fAorCSAgICAoc2luZm9fZmxhZ3MgJiBNU0dfQUREUl9PVkVSKSkgeworCQljaHVua190cCA9IHNjdHBfYXNzb2NfbG9va3VwX3BhZGRyKGFzb2MsICZ0byk7CisJCWlmICghY2h1bmtfdHApIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJfSBlbHNlCisJCWNodW5rX3RwID0gTlVMTDsKKworCS8qIEF1dG8tY29ubmVjdCwgaWYgd2UgYXJlbid0IGNvbm5lY3RlZCBhbHJlYWR5LiAqLworCWlmIChzY3RwX3N0YXRlKGFzb2MsIENMT1NFRCkpIHsKKwkJZXJyID0gc2N0cF9wcmltaXRpdmVfQVNTT0NJQVRFKGFzb2MsIE5VTEwpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCVNDVFBfREVCVUdfUFJJTlRLKCJXZSBhc3NvY2lhdGVkIHByaW1pdGl2ZWx5LlxuIik7CisJfQorCisJLyogQnJlYWsgdGhlIG1lc3NhZ2UgaW50byBtdWx0aXBsZSBjaHVua3Mgb2YgbWF4aW11bSBzaXplLiAqLworCWRhdGFtc2cgPSBzY3RwX2RhdGFtc2dfZnJvbV91c2VyKGFzb2MsIHNpbmZvLCBtc2csIG1zZ19sZW4pOworCWlmICghZGF0YW1zZykgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCS8qIE5vdyBzZW5kIHRoZSAocG9zc2libHkpIGZyYWdtZW50ZWQgbWVzc2FnZS4gKi8KKwlsaXN0X2Zvcl9lYWNoKHBvcywgJmRhdGFtc2ctPmNodW5rcykgeworCQljaHVuayA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF9jaHVuaywgZnJhZ19saXN0KTsKKwkJc2N0cF9kYXRhbXNnX3RyYWNrKGNodW5rKTsKKworCQkvKiBEbyBhY2NvdW50aW5nIGZvciB0aGUgd3JpdGUgc3BhY2UuICAqLworCQlzY3RwX3NldF9vd25lcl93KGNodW5rKTsKKworCQljaHVuay0+dHJhbnNwb3J0ID0gY2h1bmtfdHA7CisKKwkJLyogU2VuZCBpdCB0byB0aGUgbG93ZXIgbGF5ZXJzLiAgTm90ZTogIGFsbCBjaHVua3MKKwkJICogbXVzdCBlaXRoZXIgZmFpbCBvciBzdWNjZWVkLiAgIFRoZSBsb3dlciBsYXllcgorCQkgKiB3b3JrcyB0aGF0IHdheSB0b2RheS4gIEtlZXAgaXQgdGhhdCB3YXkgb3IgdGhpcworCQkgKiBicmVha3MuCisJCSAqLworCQllcnIgPSBzY3RwX3ByaW1pdGl2ZV9TRU5EKGFzb2MsIGNodW5rKTsKKwkJLyogRGlkIHRoZSBsb3dlciBsYXllciBhY2NlcHQgdGhlIGNodW5rPyAqLworCQlpZiAoZXJyKQorCQkJc2N0cF9jaHVua19mcmVlKGNodW5rKTsKKwkJU0NUUF9ERUJVR19QUklOVEsoIldlIHNlbnQgcHJpbWl0aXZlbHkuXG4iKTsKKwl9CisKKwlzY3RwX2RhdGFtc2dfZnJlZShkYXRhbXNnKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlOworCWVsc2UKKwkJZXJyID0gbXNnX2xlbjsKKworCS8qIElmIHdlIGFyZSBhbHJlYWR5IHBhc3QgQVNTT0NJQVRFLCB0aGUgbG93ZXIKKwkgKiBsYXllcnMgYXJlIHJlc3BvbnNpYmxlIGZvciBhc3NvY2lhdGlvbiBjbGVhbnVwLgorCSAqLworCWdvdG8gb3V0X3VubG9jazsKKworb3V0X2ZyZWU6CisJaWYgKG5ld19hc29jKQorCQlzY3RwX2Fzc29jaWF0aW9uX2ZyZWUoYXNvYyk7CitvdXRfdW5sb2NrOgorCXNjdHBfcmVsZWFzZV9zb2NrKHNrKTsKKworb3V0X25vdW5sb2NrOgorCXJldHVybiBzY3RwX2Vycm9yKHNrLCBtc2dfZmxhZ3MsIGVycik7CisKKyNpZiAwCitkb19zb2NrX2VycjoKKwlpZiAobXNnX2xlbikKKwkJZXJyID0gbXNnX2xlbjsKKwllbHNlCisJCWVyciA9IHNvY2tfZXJyb3Ioc2spOworCWdvdG8gb3V0OworCitkb19pbnRlcnJ1cHRlZDoKKwlpZiAobXNnX2xlbikKKwkJZXJyID0gbXNnX2xlbjsKKwlnb3RvIG91dDsKKyNlbmRpZiAvKiAwICovCit9CisKKy8qIFRoaXMgaXMgYW4gZXh0ZW5kZWQgdmVyc2lvbiBvZiBza2JfcHVsbCgpIHRoYXQgcmVtb3ZlcyB0aGUgZGF0YSBmcm9tIHRoZQorICogc3RhcnQgb2YgYSBza2IgZXZlbiB3aGVuIGRhdGEgaXMgc3ByZWFkIGFjcm9zcyB0aGUgbGlzdCBvZiBza2IncyBpbiB0aGUKKyAqIGZyYWdfbGlzdC4gbGVuIHNwZWNpZmllcyB0aGUgdG90YWwgYW1vdW50IG9mIGRhdGEgdGhhdCBuZWVkcyB0byBiZSByZW1vdmVkLgorICogd2hlbiAnbGVuJyBieXRlcyBjb3VsZCBiZSByZW1vdmVkIGZyb20gdGhlIHNrYiwgaXQgcmV0dXJucyAwLgorICogSWYgJ2xlbicgZXhjZWVkcyB0aGUgdG90YWwgc2tiIGxlbmd0aCwgIGl0IHJldHVybnMgdGhlIG5vLiBvZiBieXRlcyB0aGF0CisgKiBjb3VsZCBub3QgYmUgcmVtb3ZlZC4KKyAqLworc3RhdGljIGludCBzY3RwX3NrYl9wdWxsKHN0cnVjdCBza19idWZmICpza2IsIGludCBsZW4pCit7CisJc3RydWN0IHNrX2J1ZmYgKmxpc3Q7CisJaW50IHNrYl9sZW4gPSBza2JfaGVhZGxlbihza2IpOworCWludCBybGVuOworCisJaWYgKGxlbiA8PSBza2JfbGVuKSB7CisJCV9fc2tiX3B1bGwoc2tiLCBsZW4pOworCQlyZXR1cm4gMDsKKwl9CisJbGVuIC09IHNrYl9sZW47CisJX19za2JfcHVsbChza2IsIHNrYl9sZW4pOworCisJZm9yIChsaXN0ID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3Q7IGxpc3Q7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCXJsZW4gPSBzY3RwX3NrYl9wdWxsKGxpc3QsIGxlbik7CisJCXNrYi0+bGVuIC09IChsZW4tcmxlbik7CisJCXNrYi0+ZGF0YV9sZW4gLT0gKGxlbi1ybGVuKTsKKworCQlpZiAoIXJsZW4pCisJCQlyZXR1cm4gMDsKKworCQlsZW4gPSBybGVuOworCX0KKworCXJldHVybiBsZW47Cit9CisKKy8qIEFQSSAzLjEuMyAgcmVjdm1zZygpIC0gVURQIFN0eWxlIFN5bnRheAorICoKKyAqICBzc2l6ZV90IHJlY3Ztc2coaW50IHNvY2tldCwgc3RydWN0IG1zZ2hkciAqbWVzc2FnZSwKKyAqICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpOworICoKKyAqICBzb2NrZXQgIC0gdGhlIHNvY2tldCBkZXNjcmlwdG9yIG9mIHRoZSBlbmRwb2ludC4KKyAqICBtZXNzYWdlIC0gcG9pbnRlciB0byB0aGUgbXNnaGRyIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyBhIHNpbmdsZQorICogICAgICAgICAgICB1c2VyIG1lc3NhZ2UgYW5kIHBvc3NpYmx5IHNvbWUgYW5jaWxsYXJ5IGRhdGEuCisgKgorICogICAgICAgICAgICBTZWUgU2VjdGlvbiA1IGZvciBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGF0YQorICogICAgICAgICAgICBzdHJ1Y3R1cmVzLgorICoKKyAqICBmbGFncyAgIC0gZmxhZ3Mgc2VudCBvciByZWNlaXZlZCB3aXRoIHRoZSB1c2VyIG1lc3NhZ2UsIHNlZSBTZWN0aW9uCisgKiAgICAgICAgICAgIDUgZm9yIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZSBmbGFncy4KKyAqLworc3RhdGljIHN0cnVjdCBza19idWZmICpzY3RwX3NrYl9yZWN2X2RhdGFncmFtKHN0cnVjdCBzb2NrICosIGludCwgaW50LCBpbnQgKik7CisKK1NDVFBfU1RBVElDIGludCBzY3RwX3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwgaW50IG5vYmxvY2ssCisJCQkgICAgIGludCBmbGFncywgaW50ICphZGRyX2xlbikKK3sKKwlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQgPSBOVUxMOworCXN0cnVjdCBzY3RwX3NvY2sgKnNwID0gc2N0cF9zayhzayk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgY29waWVkOworCWludCBlcnIgPSAwOworCWludCBza2JfbGVuOworCisJU0NUUF9ERUJVR19QUklOVEsoInNjdHBfcmVjdm1zZyglczogJXAsICVzOiAlcCwgJXM6ICV6ZCwgJXM6ICVkLCAlczogIgorCQkJICAiMHgleCwgJXM6ICVwKVxuIiwgInNrIiwgc2ssICJtc2doZHIiLCBtc2csCisJCQkgICJsZW4iLCBsZW4sICJrbm9ibGF1Y2giLCBub2Jsb2NrLAorCQkJICAiZmxhZ3MiLCBmbGFncywgImFkZHJfbGVuIiwgYWRkcl9sZW4pOworCisJc2N0cF9sb2NrX3NvY2soc2spOworCisJaWYgKHNjdHBfc3R5bGUoc2ssIFRDUCkgJiYgIXNjdHBfc3N0YXRlKHNrLCBFU1RBQkxJU0hFRCkpIHsKKwkJZXJyID0gLUVOT1RDT05OOworCQlnb3RvIG91dDsKKwl9CisKKwlza2IgPSBzY3RwX3NrYl9yZWN2X2RhdGFncmFtKHNrLCBmbGFncywgbm9ibG9jaywgJmVycik7CisJaWYgKCFza2IpCisJCWdvdG8gb3V0OworCisJLyogR2V0IHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIHNrYiBpbmNsdWRpbmcgYW55IHNrYidzIGluIHRoZQorCSAqIGZyYWdfbGlzdC4KKwkgKi8KKwlza2JfbGVuID0gc2tiLT5sZW47CisKKwljb3BpZWQgPSBza2JfbGVuOworCWlmIChjb3BpZWQgPiBsZW4pCisJCWNvcGllZCA9IGxlbjsKKworCWVyciA9IHNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgMCwgbXNnLT5tc2dfaW92LCBjb3BpZWQpOworCisJZXZlbnQgPSBzY3RwX3NrYjJldmVudChza2IpOworCisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZTsKKworCXNvY2tfcmVjdl90aW1lc3RhbXAobXNnLCBzaywgc2tiKTsKKwlpZiAoc2N0cF91bHBldmVudF9pc19ub3RpZmljYXRpb24oZXZlbnQpKSB7CisJCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19OT1RJRklDQVRJT047CisJCXNwLT5wZi0+ZXZlbnRfbXNnbmFtZShldmVudCwgbXNnLT5tc2dfbmFtZSwgYWRkcl9sZW4pOworCX0gZWxzZSB7CisJCXNwLT5wZi0+c2tiX21zZ25hbWUoc2tiLCBtc2ctPm1zZ19uYW1lLCBhZGRyX2xlbik7CisJfQorCisJLyogQ2hlY2sgaWYgd2UgYWxsb3cgU0NUUF9TTkRSQ1ZJTkZPLiAqLworCWlmIChzcC0+c3Vic2NyaWJlLnNjdHBfZGF0YV9pb19ldmVudCkKKwkJc2N0cF91bHBldmVudF9yZWFkX3NuZHJjdmluZm8oZXZlbnQsIG1zZyk7CisjaWYgMAorCS8qIEZJWE1FOiB3ZSBzaG91bGQgYmUgY2FsbGluZyBJUC9JUHY2IGxheWVycy4gICovCisJaWYgKHNrLT5za19wcm90aW5mby5hZl9pbmV0LmNtc2dfZmxhZ3MpCisJCWlwX2Ntc2dfcmVjdihtc2csIHNrYik7CisjZW5kaWYKKworCWVyciA9IGNvcGllZDsKKworCS8qIElmIHNrYidzIGxlbmd0aCBleGNlZWRzIHRoZSB1c2VyJ3MgYnVmZmVyLCB1cGRhdGUgdGhlIHNrYiBhbmQKKwkgKiBwdXNoIGl0IGJhY2sgdG8gdGhlIHJlY2VpdmVfcXVldWUgc28gdGhhdCB0aGUgbmV4dCBjYWxsIHRvCisJICogcmVjdm1zZygpIHdpbGwgcmV0dXJuIHRoZSByZW1haW5pbmcgZGF0YS4gRG9uJ3Qgc2V0IE1TR19FT1IuCisJICovCisJaWYgKHNrYl9sZW4gPiBjb3BpZWQpIHsKKwkJbXNnLT5tc2dfZmxhZ3MgJj0gfk1TR19FT1I7CisJCWlmIChmbGFncyAmIE1TR19QRUVLKQorCQkJZ290byBvdXRfZnJlZTsKKwkJc2N0cF9za2JfcHVsbChza2IsIGNvcGllZCk7CisJCXNrYl9xdWV1ZV9oZWFkKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKKworCQkvKiBXaGVuIG9ubHkgcGFydGlhbCBtZXNzYWdlIGlzIGNvcGllZCB0byB0aGUgdXNlciwgaW5jcmVhc2UKKwkJICogcnduZCBieSB0aGF0IGFtb3VudC4gSWYgYWxsIHRoZSBkYXRhIGluIHRoZSBza2IgaXMgcmVhZCwKKwkJICogcnduZCBpcyB1cGRhdGVkIHdoZW4gdGhlIGV2ZW50IGlzIGZyZWVkLgorCQkgKi8KKwkJc2N0cF9hc3NvY19yd25kX2luY3JlYXNlKGV2ZW50LT5hc29jLCBjb3BpZWQpOworCQlnb3RvIG91dDsKKwl9IGVsc2UgaWYgKChldmVudC0+bXNnX2ZsYWdzICYgTVNHX05PVElGSUNBVElPTikgfHwKKwkJICAgKGV2ZW50LT5tc2dfZmxhZ3MgJiBNU0dfRU9SKSkKKwkJbXNnLT5tc2dfZmxhZ3MgfD0gTVNHX0VPUjsKKwllbHNlCisJCW1zZy0+bXNnX2ZsYWdzICY9IH5NU0dfRU9SOworCitvdXRfZnJlZToKKwlpZiAoZmxhZ3MgJiBNU0dfUEVFSykgeworCQkvKiBSZWxlYXNlIHRoZSBza2IgcmVmZXJlbmNlIGFjcXVpcmVkIGFmdGVyIHBlZWtpbmcgdGhlIHNrYiBpbgorCQkgKiBzY3RwX3NrYl9yZWN2X2RhdGFncmFtKCkuCisJCSAqLworCQlrZnJlZV9za2Ioc2tiKTsKKwl9IGVsc2UgeworCQkvKiBGcmVlIHRoZSBldmVudCB3aGljaCBpbmNsdWRlcyByZWxlYXNpbmcgdGhlIHJlZmVyZW5jZSB0bworCQkgKiB0aGUgb3duZXIgb2YgdGhlIHNrYiwgZnJlZWluZyB0aGUgc2tiIGFuZCB1cGRhdGluZyB0aGUKKwkJICogcnduZC4KKwkJICovCisJCXNjdHBfdWxwZXZlbnRfZnJlZShldmVudCk7CisJfQorb3V0OgorCXNjdHBfcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiA3LjEuMTIgRW5hYmxlL0Rpc2FibGUgbWVzc2FnZSBmcmFnbWVudGF0aW9uIChTQ1RQX0RJU0FCTEVfRlJBR01FTlRTKQorICoKKyAqIFRoaXMgb3B0aW9uIGlzIGEgb24vb2ZmIGZsYWcuICBJZiBlbmFibGVkIG5vIFNDVFAgbWVzc2FnZQorICogZnJhZ21lbnRhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZC4gIEluc3RlYWQgaWYgYSBtZXNzYWdlIGJlaW5nIHNlbnQKKyAqIGV4Y2VlZHMgdGhlIGN1cnJlbnQgUE1UVSBzaXplLCB0aGUgbWVzc2FnZSB3aWxsIE5PVCBiZSBzZW50IGFuZAorICogaW5zdGVhZCBhIGVycm9yIHdpbGwgYmUgaW5kaWNhdGVkIHRvIHRoZSB1c2VyLgorICovCitzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9kaXNhYmxlX2ZyYWdtZW50cyhzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCSAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQoreworCWludCB2YWw7CisKKwlpZiAob3B0bGVuIDwgc2l6ZW9mKGludCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilvcHR2YWwpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXNjdHBfc2soc2spLT5kaXNhYmxlX2ZyYWdtZW50cyA9ICh2YWwgPT0gMCkgPyAwIDogMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9ldmVudHMoc3RydWN0IHNvY2sgKnNrLCBjaGFyIF9fdXNlciAqb3B0dmFsLAorCQkJCQlpbnQgb3B0bGVuKQoreworCWlmIChvcHRsZW4gIT0gc2l6ZW9mKHN0cnVjdCBzY3RwX2V2ZW50X3N1YnNjcmliZSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjb3B5X2Zyb21fdXNlcigmc2N0cF9zayhzayktPnN1YnNjcmliZSwgb3B0dmFsLCBvcHRsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworLyogNy4xLjggQXV0b21hdGljIENsb3NlIG9mIGFzc29jaWF0aW9ucyAoU0NUUF9BVVRPQ0xPU0UpCisgKgorICogVGhpcyBzb2NrZXQgb3B0aW9uIGlzIGFwcGxpY2FibGUgdG8gdGhlIFVEUC1zdHlsZSBzb2NrZXQgb25seS4gIFdoZW4KKyAqIHNldCBpdCB3aWxsIGNhdXNlIGFzc29jaWF0aW9ucyB0aGF0IGFyZSBpZGxlIGZvciBtb3JlIHRoYW4gdGhlCisgKiBzcGVjaWZpZWQgbnVtYmVyIG9mIHNlY29uZHMgdG8gYXV0b21hdGljYWxseSBjbG9zZS4gIEFuIGFzc29jaWF0aW9uCisgKiBiZWluZyBpZGxlIGlzIGRlZmluZWQgYW4gYXNzb2NpYXRpb24gdGhhdCBoYXMgTk9UIHNlbnQgb3IgcmVjZWl2ZWQKKyAqIHVzZXIgZGF0YS4gIFRoZSBzcGVjaWFsIHZhbHVlIG9mICcwJyBpbmRpY2F0ZXMgdGhhdCBubyBhdXRvbWF0aWMKKyAqIGNsb3NlIG9mIGFueSBhc3NvY2lhdGlvbnMgc2hvdWxkIGJlIHBlcmZvcm1lZC4gIFRoZSBvcHRpb24gZXhwZWN0cyBhbgorICogaW50ZWdlciBkZWZpbmluZyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgb2YgaWRsZSB0aW1lIGJlZm9yZSBhbgorICogYXNzb2NpYXRpb24gaXMgY2xvc2VkLgorICovCitzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9hdXRvY2xvc2Uoc3RydWN0IHNvY2sgKnNrLCBjaGFyIF9fdXNlciAqb3B0dmFsLAorCQkJCQkgICAgaW50IG9wdGxlbikKK3sKKwlzdHJ1Y3Qgc2N0cF9zb2NrICpzcCA9IHNjdHBfc2soc2spOworCisJLyogQXBwbGljYWJsZSB0byBVRFAtc3R5bGUgc29ja2V0IG9ubHkgKi8KKwlpZiAoc2N0cF9zdHlsZShzaywgVENQKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmIChvcHRsZW4gIT0gc2l6ZW9mKGludCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjb3B5X2Zyb21fdXNlcigmc3AtPmF1dG9jbG9zZSwgb3B0dmFsLCBvcHRsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXNwLT5lcC0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX0FVVE9DTE9TRV0gPSBzcC0+YXV0b2Nsb3NlICogSFo7CisJcmV0dXJuIDA7Cit9CisKKy8qIDcuMS4xMyBQZWVyIEFkZHJlc3MgUGFyYW1ldGVycyAoU0NUUF9QRUVSX0FERFJfUEFSQU1TKQorICoKKyAqIEFwcGxpY2F0aW9ucyBjYW4gZW5hYmxlIG9yIGRpc2FibGUgaGVhcnRiZWF0cyBmb3IgYW55IHBlZXIgYWRkcmVzcyBvZgorICogYW4gYXNzb2NpYXRpb24sIG1vZGlmeSBhbiBhZGRyZXNzJ3MgaGVhcnRiZWF0IGludGVydmFsLCBmb3JjZSBhCisgKiBoZWFydGJlYXQgdG8gYmUgc2VudCBpbW1lZGlhdGVseSwgYW5kIGFkanVzdCB0aGUgYWRkcmVzcydzIG1heGltdW0KKyAqIG51bWJlciBvZiByZXRyYW5zbWlzc2lvbnMgc2VudCBiZWZvcmUgYW4gYWRkcmVzcyBpcyBjb25zaWRlcmVkCisgKiB1bnJlYWNoYWJsZS4gIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHVzZWQgdG8gYWNjZXNzIGFuZCBtb2RpZnkgYW4KKyAqIGFkZHJlc3MncyBwYXJhbWV0ZXJzOgorICoKKyAqICBzdHJ1Y3Qgc2N0cF9wYWRkcnBhcmFtcyB7CisgKiAgICAgIHNjdHBfYXNzb2NfdCAgICAgICAgICAgIHNwcF9hc3NvY19pZDsKKyAqICAgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc3BwX2FkZHJlc3M7CisgKiAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIHNwcF9oYmludGVydmFsOworICogICAgICB1aW50MTZfdCAgICAgICAgICAgICAgICBzcHBfcGF0aG1heHJ4dDsKKyAqICB9OworICoKKyAqICAgc3BwX2Fzc29jX2lkICAgIC0gKFVEUCBzdHlsZSBzb2NrZXQpIFRoaXMgaXMgZmlsbGVkIGluIHRoZSBhcHBsaWNhdGlvbiwKKyAqICAgICAgICAgICAgICAgICAgICAgYW5kIGlkZW50aWZpZXMgdGhlIGFzc29jaWF0aW9uIGZvciB0aGlzIHF1ZXJ5LgorICogICBzcHBfYWRkcmVzcyAgICAgLSBUaGlzIHNwZWNpZmllcyB3aGljaCBhZGRyZXNzIGlzIG9mIGludGVyZXN0LgorICogICBzcHBfaGJpbnRlcnZhbCAgLSBUaGlzIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgaGVhcnRiZWF0IGludGVydmFsLAorICogICAgICAgICAgICAgICAgICAgICBpbiBtaWxsaXNlY29uZHMuICBBIHZhbHVlIG9mIDAsIHdoZW4gbW9kaWZ5aW5nIHRoZQorICogICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIsIHNwZWNpZmllcyB0aGF0IHRoZSBoZWFydGJlYXQgb24gdGhpcworICogICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIHNob3VsZCBiZSBkaXNhYmxlZC4gQSB2YWx1ZSBvZiBVSU5UMzJfTUFYCisgKiAgICAgICAgICAgICAgICAgICAgICg0Mjk0OTY3Mjk1KSwgd2hlbiBtb2RpZnlpbmcgdGhlIHBhcmFtZXRlciwKKyAqICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoYXQgYSBoZWFydGJlYXQgc2hvdWxkIGJlIHNlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgaW1tZWRpYXRlbHkgdG8gdGhlIHBlZXIgYWRkcmVzcywgYW5kIHRoZSBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgIGludGVydmFsIHNob3VsZCByZW1haW4gdW5jaGFuZ2VkLgorICogICBzcHBfcGF0aG1heHJ4dCAgLSBUaGlzIGNvbnRhaW5zIHRoZSBtYXhpbXVtIG51bWJlciBvZgorICogICAgICAgICAgICAgICAgICAgICByZXRyYW5zbWlzc2lvbnMgYmVmb3JlIHRoaXMgYWRkcmVzcyBzaGFsbCBiZQorICogICAgICAgICAgICAgICAgICAgICBjb25zaWRlcmVkIHVucmVhY2hhYmxlLgorICovCitzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9wZWVyX2FkZHJfcGFyYW1zKHN0cnVjdCBzb2NrICpzaywKKwkJCQkJICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCit7CisJc3RydWN0IHNjdHBfcGFkZHJwYXJhbXMgcGFyYW1zOworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnM7CisJaW50IGVycm9yOworCisJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IHNjdHBfcGFkZHJwYXJhbXMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnBhcmFtcywgb3B0dmFsLCBvcHRsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qCisJICogQVBJIDcuIFNvY2tldCBPcHRpb25zIChzZXR0aW5nIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgZW5kcG9pbnQpCisJICogQWxsIG9wdGlvbnMgdGhhdCBzdXBwb3J0IHNwZWNpZmljIHNldHRpbmdzIG9uIGFuIGFzc29jaWF0aW9uIGJ5CisJICogZmlsbGluZyBpbiBlaXRoZXIgYW4gYXNzb2NpYXRpb24gaWQgdmFyaWFibGUgb3IgYSBzb2NrYWRkcl9zdG9yYWdlCisJICogU0hPVUxEIGFsc28gc3VwcG9ydCBzZXR0aW5nIG9mIHRoZSBzYW1lIHZhbHVlIGZvciB0aGUgZW50aXJlIGVuZHBvaW50CisJICogKGkuZS4gZnV0dXJlIGFzc29jaWF0aW9ucykuIFRvIGFjY29tcGxpc2ggdGhpcyB0aGUgZm9sbG93aW5nIGxvZ2ljIGlzCisJICogdXNlZCB3aGVuIHNldHRpbmcgb25lIG9mIHRoZXNlIG9wdGlvbnM6CisKKwkgKiBjKSBJZiBuZWl0aGVyIHRoZSBzb2NrYWRkcl9zdG9yYWdlIG9yIGFzc29jaWF0aW9uIGlkZW50aWZpY2F0aW9uIGlzCisJICogICAgc2V0IGkuZS4gdGhlIHNvY2thZGRyX3N0b3JhZ2UgaXMgc2V0IHRvIGFsbCAwJ3MgKElOQUREUl9BTlkpIGFuZAorCSAqICAgIHRoZSBhc3NvY2lhdGlvbiBpZGVudGlmaWNhdGlvbiBpcyAwLCB0aGUgc2V0dGluZ3MgYXJlIGEgZGVmYXVsdAorCSAqICAgIGFuZCB0byBiZSBhcHBsaWVkIHRvIHRoZSBlbmRwb2ludCAoYWxsIGZ1dHVyZSBhc3NvY2lhdGlvbnMpLgorCSAqLworCisJLyogdXBkYXRlIGRlZmF1bHQgdmFsdWUgZm9yIGVuZHBvaW50IChhbGwgZnV0dXJlIGFzc29jaWF0aW9ucykgKi8KKwlpZiAoIXBhcmFtcy5zcHBfYXNzb2NfaWQgJiYgCisJICAgIHNjdHBfaXNfYW55KCggdW5pb24gc2N0cF9hZGRyICopJnBhcmFtcy5zcHBfYWRkcmVzcykpIHsKKwkJLyogTWFudWFsIGhlYXJ0YmVhdCBvbiBhbiBlbmRwb2ludCBpcyBpbnZhbGlkLiAqLworCQlpZiAoMHhmZmZmZmZmZiA9PSBwYXJhbXMuc3BwX2hiaW50ZXJ2YWwpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZWxzZSBpZiAocGFyYW1zLnNwcF9oYmludGVydmFsKQorCQkJc2N0cF9zayhzayktPnBhZGRycGFyYW0uc3BwX2hiaW50ZXJ2YWwgPQorCQkJCQkJcGFyYW1zLnNwcF9oYmludGVydmFsOworCQlpZiAocGFyYW1zLnNwcF9wYXRobWF4cnh0KQorCQkJc2N0cF9zayhzayktPnBhZGRycGFyYW0uc3BwX3BhdGhtYXhyeHQgPQorCQkJCQkJcGFyYW1zLnNwcF9wYXRobWF4cnh0OworCQlyZXR1cm4gMDsKKwl9CisKKwl0cmFucyA9IHNjdHBfYWRkcl9pZDJ0cmFuc3BvcnQoc2ssICZwYXJhbXMuc3BwX2FkZHJlc3MsCisJCQkJICAgICAgIHBhcmFtcy5zcHBfYXNzb2NfaWQpOworCWlmICghdHJhbnMpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQXBwbGljYXRpb25zIGNhbiBlbmFibGUgb3IgZGlzYWJsZSBoZWFydGJlYXRzIGZvciBhbnkgcGVlciBhZGRyZXNzCisJICogb2YgYW4gYXNzb2NpYXRpb24sIG1vZGlmeSBhbiBhZGRyZXNzJ3MgaGVhcnRiZWF0IGludGVydmFsLCBmb3JjZSBhCisJICogaGVhcnRiZWF0IHRvIGJlIHNlbnQgaW1tZWRpYXRlbHksIGFuZCBhZGp1c3QgdGhlIGFkZHJlc3MncyBtYXhpbXVtCisJICogbnVtYmVyIG9mIHJldHJhbnNtaXNzaW9ucyBzZW50IGJlZm9yZSBhbiBhZGRyZXNzIGlzIGNvbnNpZGVyZWQKKwkgKiB1bnJlYWNoYWJsZS4KKwkgKgorCSAqIFRoZSB2YWx1ZSBvZiB0aGUgaGVhcnRiZWF0IGludGVydmFsLCBpbiBtaWxsaXNlY29uZHMuIEEgdmFsdWUgb2YKKwkgKiBVSU5UMzJfTUFYICg0Mjk0OTY3Mjk1KSwgd2hlbiBtb2RpZnlpbmcgdGhlIHBhcmFtZXRlciwgc3BlY2lmaWVzCisJICogdGhhdCBhIGhlYXJ0YmVhdCBzaG91bGQgYmUgc2VudCBpbW1lZGlhdGVseSB0byB0aGUgcGVlciBhZGRyZXNzLAorCSAqIGFuZCB0aGUgY3VycmVudCBpbnRlcnZhbCBzaG91bGQgcmVtYWluIHVuY2hhbmdlZC4KKwkgKi8KKwlpZiAoMHhmZmZmZmZmZiA9PSBwYXJhbXMuc3BwX2hiaW50ZXJ2YWwpIHsKKwkJZXJyb3IgPSBzY3RwX3ByaW1pdGl2ZV9SRVFVRVNUSEVBUlRCRUFUICh0cmFucy0+YXNvYywgdHJhbnMpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJfSBlbHNlIHsKKwkvKiBUaGUgdmFsdWUgb2YgdGhlIGhlYXJ0YmVhdCBpbnRlcnZhbCwgaW4gbWlsbGlzZWNvbmRzLiBBIHZhbHVlIG9mIDAsCisJICogd2hlbiBtb2RpZnlpbmcgdGhlIHBhcmFtZXRlciwgc3BlY2lmaWVzIHRoYXQgdGhlIGhlYXJ0YmVhdCBvbiB0aGlzCisJICogYWRkcmVzcyBzaG91bGQgYmUgZGlzYWJsZWQuCisJICovCisJCWlmIChwYXJhbXMuc3BwX2hiaW50ZXJ2YWwpIHsKKwkJCXRyYW5zLT5oYl9hbGxvd2VkID0gMTsKKwkJCXRyYW5zLT5oYl9pbnRlcnZhbCA9IAorCQkJCW1zZWNzX3RvX2ppZmZpZXMocGFyYW1zLnNwcF9oYmludGVydmFsKTsKKwkJfSBlbHNlCisJCQl0cmFucy0+aGJfYWxsb3dlZCA9IDA7CisJfQorCisJLyogc3BwX3BhdGhtYXhyeHQgY29udGFpbnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJhbnNtaXNzaW9ucworCSAqIGJlZm9yZSB0aGlzIGFkZHJlc3Mgc2hhbGwgYmUgY29uc2lkZXJlZCB1bnJlYWNoYWJsZS4KKwkgKi8KKwlpZiAocGFyYW1zLnNwcF9wYXRobWF4cnh0KQorCQl0cmFucy0+bWF4X3JldHJhbnMgPSBwYXJhbXMuc3BwX3BhdGhtYXhyeHQ7CisKKwlyZXR1cm4gMDsKK30KKworLyogNy4xLjMgSW5pdGlhbGl6YXRpb24gUGFyYW1ldGVycyAoU0NUUF9JTklUTVNHKQorICoKKyAqIEFwcGxpY2F0aW9ucyBjYW4gc3BlY2lmeSBwcm90b2NvbCBwYXJhbWV0ZXJzIGZvciB0aGUgZGVmYXVsdCBhc3NvY2lhdGlvbgorICogaW5pdGlhbGl6YXRpb24uICBUaGUgb3B0aW9uIG5hbWUgYXJndW1lbnQgdG8gc2V0c29ja29wdCgpIGFuZCBnZXRzb2Nrb3B0KCkKKyAqIGlzIFNDVFBfSU5JVE1TRy4KKyAqCisgKiBTZXR0aW5nIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgaXMgZWZmZWN0aXZlIG9ubHkgb24gYW4gdW5jb25uZWN0ZWQKKyAqIHNvY2tldCAoZm9yIFVEUC1zdHlsZSBzb2NrZXRzIG9ubHkgZnV0dXJlIGFzc29jaWF0aW9ucyBhcmUgZWZmZWN0ZWQKKyAqIGJ5IHRoZSBjaGFuZ2UpLiAgV2l0aCBUQ1Atc3R5bGUgc29ja2V0cywgdGhpcyBvcHRpb24gaXMgaW5oZXJpdGVkIGJ5CisgKiBzb2NrZXRzIGRlcml2ZWQgZnJvbSBhIGxpc3RlbmVyIHNvY2tldC4KKyAqLworc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfaW5pdG1zZyhzdHJ1Y3Qgc29jayAqc2ssIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCit7CisJc3RydWN0IHNjdHBfaW5pdG1zZyBzaW5pdDsKKwlzdHJ1Y3Qgc2N0cF9zb2NrICpzcCA9IHNjdHBfc2soc2spOworCisJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IHNjdHBfaW5pdG1zZykpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjb3B5X2Zyb21fdXNlcigmc2luaXQsIG9wdHZhbCwgb3B0bGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoc2luaXQuc2luaXRfbnVtX29zdHJlYW1zKQorCQlzcC0+aW5pdG1zZy5zaW5pdF9udW1fb3N0cmVhbXMgPSBzaW5pdC5zaW5pdF9udW1fb3N0cmVhbXM7CQorCWlmIChzaW5pdC5zaW5pdF9tYXhfaW5zdHJlYW1zKQorCQlzcC0+aW5pdG1zZy5zaW5pdF9tYXhfaW5zdHJlYW1zID0gc2luaXQuc2luaXRfbWF4X2luc3RyZWFtczsJCisJaWYgKHNpbml0LnNpbml0X21heF9hdHRlbXB0cykKKwkJc3AtPmluaXRtc2cuc2luaXRfbWF4X2F0dGVtcHRzID0gc2luaXQuc2luaXRfbWF4X2F0dGVtcHRzOwkKKwlpZiAoc2luaXQuc2luaXRfbWF4X2luaXRfdGltZW8pCisJCXNwLT5pbml0bXNnLnNpbml0X21heF9pbml0X3RpbWVvID0gc2luaXQuc2luaXRfbWF4X2luaXRfdGltZW87CQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiA3LjEuMTQgU2V0IGRlZmF1bHQgc2VuZCBwYXJhbWV0ZXJzIChTQ1RQX0RFRkFVTFRfU0VORF9QQVJBTSkKKyAqCisgKiAgIEFwcGxpY2F0aW9ucyB0aGF0IHdpc2ggdG8gdXNlIHRoZSBzZW5kdG8oKSBzeXN0ZW0gY2FsbCBtYXkgd2lzaCB0bworICogICBzcGVjaWZ5IGEgZGVmYXVsdCBzZXQgb2YgcGFyYW1ldGVycyB0aGF0IHdvdWxkIG5vcm1hbGx5IGJlIHN1cHBsaWVkCisgKiAgIHRocm91Z2ggdGhlIGluY2x1c2lvbiBvZiBhbmNpbGxhcnkgZGF0YS4gIFRoaXMgc29ja2V0IG9wdGlvbiBhbGxvd3MKKyAqICAgc3VjaCBhbiBhcHBsaWNhdGlvbiB0byBzZXQgdGhlIGRlZmF1bHQgc2N0cF9zbmRyY3ZpbmZvIHN0cnVjdHVyZS4KKyAqICAgVGhlIGFwcGxpY2F0aW9uIHRoYXQgd2lzaGVzIHRvIHVzZSB0aGlzIHNvY2tldCBvcHRpb24gc2ltcGx5IHBhc3NlcworICogICBpbiB0byB0aGlzIGNhbGwgdGhlIHNjdHBfc25kcmN2aW5mbyBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiBTZWN0aW9uCisgKiAgIDUuMi4yKSBUaGUgaW5wdXQgcGFyYW1ldGVycyBhY2NlcHRlZCBieSB0aGlzIGNhbGwgaW5jbHVkZQorICogICBzaW5mb19zdHJlYW0sIHNpbmZvX2ZsYWdzLCBzaW5mb19wcGlkLCBzaW5mb19jb250ZXh0LAorICogICBzaW5mb190aW1ldG9saXZlLiAgVGhlIHVzZXIgbXVzdCBwcm92aWRlIHRoZSBzaW5mb19hc3NvY19pZCBmaWVsZCBpbgorICogICB0byB0aGlzIGNhbGwgaWYgdGhlIGNhbGxlciBpcyB1c2luZyB0aGUgVURQIG1vZGVsLgorICovCitzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9kZWZhdWx0X3NlbmRfcGFyYW0oc3RydWN0IHNvY2sgKnNrLAorCQkJCQkJY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK3sKKwlzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvIGluZm87CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CisJc3RydWN0IHNjdHBfc29jayAqc3AgPSBzY3RwX3NrKHNrKTsKKworCWlmIChvcHRsZW4gIT0gc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIG9wdHZhbCwgb3B0bGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgaW5mby5zaW5mb19hc3NvY19pZCk7CisJaWYgKCFhc29jICYmIGluZm8uc2luZm9fYXNzb2NfaWQgJiYgc2N0cF9zdHlsZShzaywgVURQKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYXNvYykgeworCQlhc29jLT5kZWZhdWx0X3N0cmVhbSA9IGluZm8uc2luZm9fc3RyZWFtOworCQlhc29jLT5kZWZhdWx0X2ZsYWdzID0gaW5mby5zaW5mb19mbGFnczsKKwkJYXNvYy0+ZGVmYXVsdF9wcGlkID0gaW5mby5zaW5mb19wcGlkOworCQlhc29jLT5kZWZhdWx0X2NvbnRleHQgPSBpbmZvLnNpbmZvX2NvbnRleHQ7CisJCWFzb2MtPmRlZmF1bHRfdGltZXRvbGl2ZSA9IGluZm8uc2luZm9fdGltZXRvbGl2ZTsKKwl9IGVsc2UgeworCQlzcC0+ZGVmYXVsdF9zdHJlYW0gPSBpbmZvLnNpbmZvX3N0cmVhbTsKKwkJc3AtPmRlZmF1bHRfZmxhZ3MgPSBpbmZvLnNpbmZvX2ZsYWdzOworCQlzcC0+ZGVmYXVsdF9wcGlkID0gaW5mby5zaW5mb19wcGlkOworCQlzcC0+ZGVmYXVsdF9jb250ZXh0ID0gaW5mby5zaW5mb19jb250ZXh0OworCQlzcC0+ZGVmYXVsdF90aW1ldG9saXZlID0gaW5mby5zaW5mb190aW1ldG9saXZlOworCX0KKworCXJldHVybiAwOworfQorCisvKiA3LjEuMTAgU2V0IFByaW1hcnkgQWRkcmVzcyAoU0NUUF9QUklNQVJZX0FERFIpCisgKgorICogUmVxdWVzdHMgdGhhdCB0aGUgbG9jYWwgU0NUUCBzdGFjayB1c2UgdGhlIGVuY2xvc2VkIHBlZXIgYWRkcmVzcyBhcworICogdGhlIGFzc29jaWF0aW9uIHByaW1hcnkuICBUaGUgZW5jbG9zZWQgYWRkcmVzcyBtdXN0IGJlIG9uZSBvZiB0aGUKKyAqIGFzc29jaWF0aW9uIHBlZXIncyBhZGRyZXNzZXMuCisgKi8KK3N0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3ByaW1hcnlfYWRkcihzdHJ1Y3Qgc29jayAqc2ssIGNoYXIgX191c2VyICpvcHR2YWwsCisJCQkJCWludCBvcHRsZW4pCit7CisJc3RydWN0IHNjdHBfcHJpbSBwcmltOworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnM7CisKKwlpZiAob3B0bGVuICE9IHNpemVvZihzdHJ1Y3Qgc2N0cF9wcmltKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnByaW0sIG9wdHZhbCwgc2l6ZW9mKHN0cnVjdCBzY3RwX3ByaW0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl0cmFucyA9IHNjdHBfYWRkcl9pZDJ0cmFuc3BvcnQoc2ssICZwcmltLnNzcF9hZGRyLCBwcmltLnNzcF9hc3NvY19pZCk7CisJaWYgKCF0cmFucykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzY3RwX2Fzc29jX3NldF9wcmltYXJ5KHRyYW5zLT5hc29jLCB0cmFucyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIDcuMS41IFNDVFBfTk9ERUxBWQorICoKKyAqIFR1cm4gb24vb2ZmIGFueSBOYWdsZS1saWtlIGFsZ29yaXRobS4gIFRoaXMgbWVhbnMgdGhhdCBwYWNrZXRzIGFyZQorICogZ2VuZXJhbGx5IHNlbnQgYXMgc29vbiBhcyBwb3NzaWJsZSBhbmQgbm8gdW5uZWNlc3NhcnkgZGVsYXlzIGFyZQorICogaW50cm9kdWNlZCwgYXQgdGhlIGNvc3Qgb2YgbW9yZSBwYWNrZXRzIGluIHRoZSBuZXR3b3JrLiAgRXhwZWN0cyBhbgorICogIGludGVnZXIgYm9vbGVhbiBmbGFnLgorICovCitzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9ub2RlbGF5KHN0cnVjdCBzb2NrICpzaywgY2hhciBfX3VzZXIgKm9wdHZhbCwKKwkJCQkJaW50IG9wdGxlbikKK3sKKwlpbnQgdmFsOworCisJaWYgKG9wdGxlbiA8IHNpemVvZihpbnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKW9wdHZhbCkpCisJCXJldHVybiAtRUZBVUxUOworCisJc2N0cF9zayhzayktPm5vZGVsYXkgPSAodmFsID09IDApID8gMCA6IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKgorICogNy4xLjEgU0NUUF9SVE9JTkZPCisgKgorICogVGhlIHByb3RvY29sIHBhcmFtZXRlcnMgdXNlZCB0byBpbml0aWFsaXplIGFuZCBib3VuZCByZXRyYW5zbWlzc2lvbgorICogdGltZW91dCAoUlRPKSBhcmUgdHVuYWJsZS4gc2N0cF9ydG9pbmZvIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGFjY2VzcworICogYW5kIG1vZGlmeSB0aGVzZSBwYXJhbWV0ZXJzLgorICogQWxsIHBhcmFtZXRlcnMgYXJlIHRpbWUgdmFsdWVzLCBpbiBtaWxsaXNlY29uZHMuICBBIHZhbHVlIG9mIDAsIHdoZW4KKyAqIG1vZGlmeWluZyB0aGUgcGFyYW1ldGVycywgaW5kaWNhdGVzIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWUgc2hvdWxkIG5vdAorICogYmUgY2hhbmdlZC4KKyAqCisgKi8KK3N0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3J0b2luZm8oc3RydWN0IHNvY2sgKnNrLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKSB7CisJc3RydWN0IHNjdHBfcnRvaW5mbyBydG9pbmZvOworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOworCisJaWYgKG9wdGxlbiAhPSBzaXplb2YgKHN0cnVjdCBzY3RwX3J0b2luZm8pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcnRvaW5mbywgb3B0dmFsLCBvcHRsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCBydG9pbmZvLnNydG9fYXNzb2NfaWQpOworCisJLyogU2V0IHRoZSB2YWx1ZXMgdG8gdGhlIHNwZWNpZmljIGFzc29jaWF0aW9uICovCisJaWYgKCFhc29jICYmIHJ0b2luZm8uc3J0b19hc3NvY19pZCAmJiBzY3RwX3N0eWxlKHNrLCBVRFApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChhc29jKSB7CisJCWlmIChydG9pbmZvLnNydG9faW5pdGlhbCAhPSAwKQorCQkJYXNvYy0+cnRvX2luaXRpYWwgPSAKKwkJCQltc2Vjc190b19qaWZmaWVzKHJ0b2luZm8uc3J0b19pbml0aWFsKTsKKwkJaWYgKHJ0b2luZm8uc3J0b19tYXggIT0gMCkKKwkJCWFzb2MtPnJ0b19tYXggPSBtc2Vjc190b19qaWZmaWVzKHJ0b2luZm8uc3J0b19tYXgpOworCQlpZiAocnRvaW5mby5zcnRvX21pbiAhPSAwKQorCQkJYXNvYy0+cnRvX21pbiA9IG1zZWNzX3RvX2ppZmZpZXMocnRvaW5mby5zcnRvX21pbik7CisJfSBlbHNlIHsKKwkJLyogSWYgdGhlcmUgaXMgbm8gYXNzb2NpYXRpb24gb3IgdGhlIGFzc29jaWF0aW9uLWlkID0gMAorCQkgKiBzZXQgdGhlIHZhbHVlcyB0byB0aGUgZW5kcG9pbnQuCisJCSAqLworCQlzdHJ1Y3Qgc2N0cF9zb2NrICpzcCA9IHNjdHBfc2soc2spOworCisJCWlmIChydG9pbmZvLnNydG9faW5pdGlhbCAhPSAwKQorCQkJc3AtPnJ0b2luZm8uc3J0b19pbml0aWFsID0gcnRvaW5mby5zcnRvX2luaXRpYWw7CisJCWlmIChydG9pbmZvLnNydG9fbWF4ICE9IDApCisJCQlzcC0+cnRvaW5mby5zcnRvX21heCA9IHJ0b2luZm8uc3J0b19tYXg7CisJCWlmIChydG9pbmZvLnNydG9fbWluICE9IDApCisJCQlzcC0+cnRvaW5mby5zcnRvX21pbiA9IHJ0b2luZm8uc3J0b19taW47CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKgorICogNy4xLjIgU0NUUF9BU1NPQ0lORk8KKyAqCisgKiBUaGlzIG9wdGlvbiBpcyB1c2VkIHRvIHR1bmUgdGhlIHRoZSBtYXhpbXVtIHJldHJhbnNtaXNzaW9uIGF0dGVtcHRzCisgKiBvZiB0aGUgYXNzb2NpYXRpb24uCisgKiBSZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBuZXcgYXNzb2NpYXRpb24gcmV0cmFuc21pc3Npb24gdmFsdWUgaXMKKyAqIGdyZWF0ZXIgdGhhbiB0aGUgc3VtIG9mIHRoZSByZXRyYW5zbWlzc2lvbiB2YWx1ZSAgb2YgdGhlIHBlZXIuCisgKiBTZWUgW1NDVFBdIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqLworc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfYXNzb2NpbmZvKHN0cnVjdCBzb2NrICpzaywgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK3sKKworCXN0cnVjdCBzY3RwX2Fzc29jcGFyYW1zIGFzc29jcGFyYW1zOworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOworCisJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NwYXJhbXMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY29weV9mcm9tX3VzZXIoJmFzc29jcGFyYW1zLCBvcHR2YWwsIG9wdGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIGFzc29jcGFyYW1zLnNhc29jX2Fzc29jX2lkKTsKKworCWlmICghYXNvYyAmJiBhc3NvY3BhcmFtcy5zYXNvY19hc3NvY19pZCAmJiBzY3RwX3N0eWxlKHNrLCBVRFApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFNldCB0aGUgdmFsdWVzIHRvIHRoZSBzcGVjaWZpYyBhc3NvY2lhdGlvbiAqLworCWlmIChhc29jKSB7CisJCWlmIChhc3NvY3BhcmFtcy5zYXNvY19hc29jbWF4cnh0ICE9IDApCisJCQlhc29jLT5tYXhfcmV0cmFucyA9IGFzc29jcGFyYW1zLnNhc29jX2Fzb2NtYXhyeHQ7CisJCWlmIChhc3NvY3BhcmFtcy5zYXNvY19jb29raWVfbGlmZSAhPSAwKSB7CisJCQlhc29jLT5jb29raWVfbGlmZS50dl9zZWMgPQorCQkJCQlhc3NvY3BhcmFtcy5zYXNvY19jb29raWVfbGlmZSAvIDEwMDA7CisJCQlhc29jLT5jb29raWVfbGlmZS50dl91c2VjID0KKwkJCQkJKGFzc29jcGFyYW1zLnNhc29jX2Nvb2tpZV9saWZlICUgMTAwMCkKKwkJCQkJKiAxMDAwOworCQl9CisJfSBlbHNlIHsKKwkJLyogU2V0IHRoZSB2YWx1ZXMgdG8gdGhlIGVuZHBvaW50ICovCisJCXN0cnVjdCBzY3RwX3NvY2sgKnNwID0gc2N0cF9zayhzayk7CisKKwkJaWYgKGFzc29jcGFyYW1zLnNhc29jX2Fzb2NtYXhyeHQgIT0gMCkKKwkJCXNwLT5hc3NvY3BhcmFtcy5zYXNvY19hc29jbWF4cnh0ID0KKwkJCQkJCWFzc29jcGFyYW1zLnNhc29jX2Fzb2NtYXhyeHQ7CisJCWlmIChhc3NvY3BhcmFtcy5zYXNvY19jb29raWVfbGlmZSAhPSAwKQorCQkJc3AtPmFzc29jcGFyYW1zLnNhc29jX2Nvb2tpZV9saWZlID0KKwkJCQkJCWFzc29jcGFyYW1zLnNhc29jX2Nvb2tpZV9saWZlOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIDcuMS4xNiBTZXQvY2xlYXIgSVB2NCBtYXBwZWQgYWRkcmVzc2VzIChTQ1RQX0lfV0FOVF9NQVBQRURfVjRfQUREUikKKyAqCisgKiBUaGlzIHNvY2tldCBvcHRpb24gaXMgYSBib29sZWFuIGZsYWcgd2hpY2ggdHVybnMgb24gb3Igb2ZmIG1hcHBlZCBWNAorICogYWRkcmVzc2VzLiAgSWYgdGhpcyBvcHRpb24gaXMgdHVybmVkIG9uIGFuZCB0aGUgc29ja2V0IGlzIHR5cGUKKyAqIFBGX0lORVQ2LCB0aGVuIElQdjQgYWRkcmVzc2VzIHdpbGwgYmUgbWFwcGVkIHRvIFY2IHJlcHJlc2VudGF0aW9uLgorICogSWYgdGhpcyBvcHRpb24gaXMgdHVybmVkIG9mZiwgdGhlbiBubyBtYXBwaW5nIHdpbGwgYmUgZG9uZSBvZiBWNAorICogYWRkcmVzc2VzIGFuZCBhIHVzZXIgd2lsbCByZWNlaXZlIGJvdGggUEZfSU5FVDYgYW5kIFBGX0lORVQgdHlwZQorICogYWRkcmVzc2VzIG9uIHRoZSBzb2NrZXQuCisgKi8KK3N0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X21hcHBlZHY0KHN0cnVjdCBzb2NrICpzaywgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK3sKKwlpbnQgdmFsOworCXN0cnVjdCBzY3RwX3NvY2sgKnNwID0gc2N0cF9zayhzayk7CisKKwlpZiAob3B0bGVuIDwgc2l6ZW9mKGludCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopb3B0dmFsKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHZhbCkKKwkJc3AtPnY0bWFwcGVkID0gMTsKKwllbHNlCisJCXNwLT52NG1hcHBlZCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIDcuMS4xNyBTZXQgdGhlIG1heGltdW0gZnJhZ3JtZW50YXRpb24gc2l6ZSAoU0NUUF9NQVhTRUcpCisgKgorICogVGhpcyBzb2NrZXQgb3B0aW9uIHNwZWNpZmllcyB0aGUgbWF4aW11bSBzaXplIHRvIHB1dCBpbiBhbnkgb3V0Z29pbmcKKyAqIFNDVFAgY2h1bmsuICBJZiBhIG1lc3NhZ2UgaXMgbGFyZ2VyIHRoYW4gdGhpcyBzaXplIGl0IHdpbGwgYmUKKyAqIGZyYWdtZW50ZWQgYnkgU0NUUCBpbnRvIHRoZSBzcGVjaWZpZWQgc2l6ZS4gIE5vdGUgdGhhdCB0aGUgdW5kZXJseWluZworICogU0NUUCBpbXBsZW1lbnRhdGlvbiBtYXkgZnJhZ21lbnQgaW50byBzbWFsbGVyIHNpemVkIGNodW5rcyB3aGVuIHRoZQorICogUE1UVSBvZiB0aGUgdW5kZXJseWluZyBhc3NvY2lhdGlvbiBpcyBzbWFsbGVyIHRoYW4gdGhlIHZhbHVlIHNldCBieQorICogdGhlIHVzZXIuCisgKi8KK3N0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X21heHNlZyhzdHJ1Y3Qgc29jayAqc2ssIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCit7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCXN0cnVjdCBzY3RwX3NvY2sgKnNwID0gc2N0cF9zayhzayk7CisJaW50IHZhbDsKKworCWlmIChvcHRsZW4gPCBzaXplb2YoaW50KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilvcHR2YWwpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoKHZhbCA8IDgpIHx8ICh2YWwgPiBTQ1RQX01BWF9DSFVOS19MRU4pKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzcC0+dXNlcl9mcmFnID0gdmFsOworCisJaWYgKHZhbCkgeworCQkvKiBVcGRhdGUgdGhlIGZyYWdfcG9pbnQgb2YgdGhlIGV4aXN0aW5nIGFzc29jaWF0aW9ucy4gKi8KKwkJbGlzdF9mb3JfZWFjaChwb3MsICYoc3AtPmVwLT5hc29jcykpIHsKKwkJCWFzb2MgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24sIGFzb2NzKTsKKwkJCWFzb2MtPmZyYWdfcG9pbnQgPSBzY3RwX2ZyYWdfcG9pbnQoc3AsIGFzb2MtPnBtdHUpOyAKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisKKy8qCisgKiAgNy4xLjkgU2V0IFBlZXIgUHJpbWFyeSBBZGRyZXNzIChTQ1RQX1NFVF9QRUVSX1BSSU1BUllfQUREUikKKyAqCisgKiAgIFJlcXVlc3RzIHRoYXQgdGhlIHBlZXIgbWFyayB0aGUgZW5jbG9zZWQgYWRkcmVzcyBhcyB0aGUgYXNzb2NpYXRpb24KKyAqICAgcHJpbWFyeS4gVGhlIGVuY2xvc2VkIGFkZHJlc3MgbXVzdCBiZSBvbmUgb2YgdGhlIGFzc29jaWF0aW9uJ3MKKyAqICAgbG9jYWxseSBib3VuZCBhZGRyZXNzZXMuIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHVzZWQgdG8gbWFrZSBhCisgKiAgIHNldCBwcmltYXJ5IHJlcXVlc3Q6CisgKi8KK3N0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3BlZXJfcHJpbWFyeV9hZGRyKHN0cnVjdCBzb2NrICpzaywgY2hhciBfX3VzZXIgKm9wdHZhbCwKKwkJCQkJICAgICBpbnQgb3B0bGVuKQoreworCXN0cnVjdCBzY3RwX3NvY2sJKnNwOworCXN0cnVjdCBzY3RwX2VuZHBvaW50CSplcDsKKwlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbgkqYXNvYyA9IE5VTEw7CisJc3RydWN0IHNjdHBfc2V0cGVlcnByaW0JcHJpbTsKKwlzdHJ1Y3Qgc2N0cF9jaHVuawkqY2h1bms7CisJaW50IAkJCWVycjsKKworCXNwID0gc2N0cF9zayhzayk7CisJZXAgPSBzcC0+ZXA7CisKKwlpZiAoIXNjdHBfYWRkaXBfZW5hYmxlKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IHNjdHBfc2V0cGVlcnByaW0pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcHJpbSwgb3B0dmFsLCBvcHRsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCBwcmltLnNzcHBfYXNzb2NfaWQpOworCWlmICghYXNvYykgCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFhc29jLT5wZWVyLmFzY29uZl9jYXBhYmxlKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKGFzb2MtPnBlZXIuYWRkaXBfZGlzYWJsZWRfbWFzayAmIFNDVFBfUEFSQU1fU0VUX1BSSU1BUlkpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoIXNjdHBfc3RhdGUoYXNvYywgRVNUQUJMSVNIRUQpKQorCQlyZXR1cm4gLUVOT1RDT05OOworCisJaWYgKCFzY3RwX2Fzc29jX2xvb2t1cF9sYWRkcihhc29jLCAodW5pb24gc2N0cF9hZGRyICopJnByaW0uc3NwcF9hZGRyKSkKKwkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCisJLyogQ3JlYXRlIGFuIEFTQ09ORiBjaHVuayB3aXRoIFNFVF9QUklNQVJZIHBhcmFtZXRlcgkqLworCWNodW5rID0gc2N0cF9tYWtlX2FzY29uZl9zZXRfcHJpbShhc29jLAorCQkJCQkgICh1bmlvbiBzY3RwX2FkZHIgKikmcHJpbS5zc3BwX2FkZHIpOworCWlmICghY2h1bmspCisJCXJldHVybiAtRU5PTUVNOworCisJZXJyID0gc2N0cF9zZW5kX2FzY29uZihhc29jLCBjaHVuayk7CisKKwlTQ1RQX0RFQlVHX1BSSU5USygiV2Ugc2V0IHBlZXIgcHJpbWFyeSBhZGRyIHByaW1pdGl2ZWx5LlxuIik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9hZGFwdGlvbl9sYXllcihzdHJ1Y3Qgc29jayAqc2ssIGNoYXIgX191c2VyICpvcHR2YWwsCisJCQkJCSAgaW50IG9wdGxlbikKK3sKKwlfX3UzMiB2YWw7CisKKwlpZiAob3B0bGVuIDwgc2l6ZW9mKF9fdTMyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWwsIG9wdHZhbCwgc2l6ZW9mKF9fdTMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJc2N0cF9zayhzayktPmFkYXB0aW9uX2luZCA9IHZhbDsKKworCXJldHVybiAwOworfQorCisvKiBBUEkgNi4yIHNldHNvY2tvcHQoKSwgZ2V0c29ja29wdCgpCisgKgorICogQXBwbGljYXRpb25zIHVzZSBzZXRzb2Nrb3B0KCkgYW5kIGdldHNvY2tvcHQoKSB0byBzZXQgb3IgcmV0cmlldmUKKyAqIHNvY2tldCBvcHRpb25zLiAgU29ja2V0IG9wdGlvbnMgYXJlIHVzZWQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0CisgKiBiZWhhdmlvciBvZiBzb2NrZXRzIGNhbGxzLiAgVGhleSBhcmUgZGVzY3JpYmVkIGluIFNlY3Rpb24gNy4KKyAqCisgKiBUaGUgc3ludGF4IGlzOgorICoKKyAqICAgcmV0ID0gZ2V0c29ja29wdChpbnQgc2QsIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIHZvaWQgX191c2VyICpvcHR2YWwsCisgKiAgICAgICAgICAgICAgICAgICAgaW50IF9fdXNlciAqb3B0bGVuKTsKKyAqICAgcmV0ID0gc2V0c29ja29wdChpbnQgc2QsIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIGNvbnN0IHZvaWQgX191c2VyICpvcHR2YWwsCisgKiAgICAgICAgICAgICAgICAgICAgaW50IG9wdGxlbik7CisgKgorICogICBzZCAgICAgIC0gdGhlIHNvY2tldCBkZXNjcmlwdC4KKyAqICAgbGV2ZWwgICAtIHNldCB0byBJUFBST1RPX1NDVFAgZm9yIGFsbCBTQ1RQIG9wdGlvbnMuCisgKiAgIG9wdG5hbWUgLSB0aGUgb3B0aW9uIG5hbWUuCisgKiAgIG9wdHZhbCAgLSB0aGUgYnVmZmVyIHRvIHN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uLgorICogICBvcHRsZW4gIC0gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KKyAqLworU0NUUF9TVEFUSUMgaW50IHNjdHBfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCQkJY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCVNDVFBfREVCVUdfUFJJTlRLKCJzY3RwX3NldHNvY2tvcHQoc2s6ICVwLi4uIG9wdG5hbWU6ICVkKVxuIiwKKwkJCSAgc2ssIG9wdG5hbWUpOworCisJLyogSSBjYW4gaGFyZGx5IGJlZ2luIHRvIGRlc2NyaWJlIGhvdyB3cm9uZyB0aGlzIGlzLiAgVGhpcyBpcworCSAqIHNvIGJyb2tlbiBhcyB0byBiZSB3b3JzZSB0aGFuIHVzZWxlc3MuICBUaGUgQVBJIGRyYWZ0CisJICogUkVBTExZIGlzIE5PVCBoZWxwZnVsIGhlcmUuLi4gIEkgYW0gbm90IGNvbnZpbmNlZCB0aGF0IHRoZQorCSAqIHNlbWFudGljcyBvZiBzZXRzb2Nrb3B0KCkgd2l0aCBhIGxldmVsIE9USEVSIFRIQU4gU09MX1NDVFAKKwkgKiBhcmUgYXQgYWxsIHdlbGwtZm91bmRlZC4KKwkgKi8KKwlpZiAobGV2ZWwgIT0gU09MX1NDVFApIHsKKwkJc3RydWN0IHNjdHBfYWYgKmFmID0gc2N0cF9zayhzayktPnBmLT5hZjsKKwkJcmV0dmFsID0gYWYtPnNldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CisJCWdvdG8gb3V0X25vdW5sb2NrOworCX0KKworCXNjdHBfbG9ja19zb2NrKHNrKTsKKworCXN3aXRjaCAob3B0bmFtZSkgeworCWNhc2UgU0NUUF9TT0NLT1BUX0JJTkRYX0FERDoKKwkJLyogJ29wdGxlbicgaXMgdGhlIHNpemUgb2YgdGhlIGFkZHJlc3NlcyBidWZmZXIuICovCisJCXJldHZhbCA9IHNjdHBfc2V0c29ja29wdF9iaW5keChzaywgKHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKilvcHR2YWwsCisJCQkJCSAgICAgICBvcHRsZW4sIFNDVFBfQklORFhfQUREX0FERFIpOworCQlicmVhazsKKworCWNhc2UgU0NUUF9TT0NLT1BUX0JJTkRYX1JFTToKKwkJLyogJ29wdGxlbicgaXMgdGhlIHNpemUgb2YgdGhlIGFkZHJlc3NlcyBidWZmZXIuICovCisJCXJldHZhbCA9IHNjdHBfc2V0c29ja29wdF9iaW5keChzaywgKHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKilvcHR2YWwsCisJCQkJCSAgICAgICBvcHRsZW4sIFNDVFBfQklORFhfUkVNX0FERFIpOworCQlicmVhazsKKworCWNhc2UgU0NUUF9ESVNBQkxFX0ZSQUdNRU5UUzoKKwkJcmV0dmFsID0gc2N0cF9zZXRzb2Nrb3B0X2Rpc2FibGVfZnJhZ21lbnRzKHNrLCBvcHR2YWwsIG9wdGxlbik7CisJCWJyZWFrOworCisJY2FzZSBTQ1RQX0VWRU5UUzoKKwkJcmV0dmFsID0gc2N0cF9zZXRzb2Nrb3B0X2V2ZW50cyhzaywgb3B0dmFsLCBvcHRsZW4pOworCQlicmVhazsKKworCWNhc2UgU0NUUF9BVVRPQ0xPU0U6CisJCXJldHZhbCA9IHNjdHBfc2V0c29ja29wdF9hdXRvY2xvc2Uoc2ssIG9wdHZhbCwgb3B0bGVuKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDVFBfUEVFUl9BRERSX1BBUkFNUzoKKwkJcmV0dmFsID0gc2N0cF9zZXRzb2Nrb3B0X3BlZXJfYWRkcl9wYXJhbXMoc2ssIG9wdHZhbCwgb3B0bGVuKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDVFBfSU5JVE1TRzoKKwkJcmV0dmFsID0gc2N0cF9zZXRzb2Nrb3B0X2luaXRtc2coc2ssIG9wdHZhbCwgb3B0bGVuKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1RQX0RFRkFVTFRfU0VORF9QQVJBTToKKwkJcmV0dmFsID0gc2N0cF9zZXRzb2Nrb3B0X2RlZmF1bHRfc2VuZF9wYXJhbShzaywgb3B0dmFsLAorCQkJCQkJCSAgICBvcHRsZW4pOworCQlicmVhazsKKwljYXNlIFNDVFBfUFJJTUFSWV9BRERSOgorCQlyZXR2YWwgPSBzY3RwX3NldHNvY2tvcHRfcHJpbWFyeV9hZGRyKHNrLCBvcHR2YWwsIG9wdGxlbik7CisJCWJyZWFrOworCWNhc2UgU0NUUF9TRVRfUEVFUl9QUklNQVJZX0FERFI6CisJCXJldHZhbCA9IHNjdHBfc2V0c29ja29wdF9wZWVyX3ByaW1hcnlfYWRkcihzaywgb3B0dmFsLCBvcHRsZW4pOworCQlicmVhazsKKwljYXNlIFNDVFBfTk9ERUxBWToKKwkJcmV0dmFsID0gc2N0cF9zZXRzb2Nrb3B0X25vZGVsYXkoc2ssIG9wdHZhbCwgb3B0bGVuKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1RQX1JUT0lORk86CisJCXJldHZhbCA9IHNjdHBfc2V0c29ja29wdF9ydG9pbmZvKHNrLCBvcHR2YWwsIG9wdGxlbik7CisJCWJyZWFrOworCWNhc2UgU0NUUF9BU1NPQ0lORk86CisJCXJldHZhbCA9IHNjdHBfc2V0c29ja29wdF9hc3NvY2luZm8oc2ssIG9wdHZhbCwgb3B0bGVuKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1RQX0lfV0FOVF9NQVBQRURfVjRfQUREUjoKKwkJcmV0dmFsID0gc2N0cF9zZXRzb2Nrb3B0X21hcHBlZHY0KHNrLCBvcHR2YWwsIG9wdGxlbik7CisJCWJyZWFrOworCWNhc2UgU0NUUF9NQVhTRUc6CisJCXJldHZhbCA9IHNjdHBfc2V0c29ja29wdF9tYXhzZWcoc2ssIG9wdHZhbCwgb3B0bGVuKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1RQX0FEQVBUSU9OX0xBWUVSOgorCQlyZXR2YWwgPSBzY3RwX3NldHNvY2tvcHRfYWRhcHRpb25fbGF5ZXIoc2ssIG9wdHZhbCwgb3B0bGVuKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR2YWwgPSAtRU5PUFJPVE9PUFQ7CisJCWJyZWFrOworCX07CisKKwlzY3RwX3JlbGVhc2Vfc29jayhzayk7CisKK291dF9ub3VubG9jazoKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBBUEkgMy4xLjYgY29ubmVjdCgpIC0gVURQIFN0eWxlIFN5bnRheAorICoKKyAqIEFuIGFwcGxpY2F0aW9uIG1heSB1c2UgdGhlIGNvbm5lY3QoKSBjYWxsIGluIHRoZSBVRFAgbW9kZWwgdG8gaW5pdGlhdGUgYW4KKyAqIGFzc29jaWF0aW9uIHdpdGhvdXQgc2VuZGluZyBkYXRhLgorICoKKyAqIFRoZSBzeW50YXggaXM6CisgKgorICogcmV0ID0gY29ubmVjdChpbnQgc2QsIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqbmFtLCBzb2NrbGVuX3QgbGVuKTsKKyAqCisgKiBzZDogdGhlIHNvY2tldCBkZXNjcmlwdG9yIHRvIGhhdmUgYSBuZXcgYXNzb2NpYXRpb24gYWRkZWQgdG8uCisgKgorICogbmFtOiB0aGUgYWRkcmVzcyBzdHJ1Y3R1cmUgKGVpdGhlciBzdHJ1Y3Qgc29ja2FkZHJfaW4gb3Igc3RydWN0CisgKiAgICBzb2NrYWRkcl9pbjYgZGVmaW5lZCBpbiBSRkMyNTUzIFs3XSkuCisgKgorICogbGVuOiB0aGUgc2l6ZSBvZiB0aGUgYWRkcmVzcy4KKyAqLworU0NUUF9TVEFUSUMgaW50IHNjdHBfY29ubmVjdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsCisJCQkgICAgIGludCBhZGRyX2xlbikKK3sKKwlzdHJ1Y3Qgc2N0cF9zb2NrICpzcDsKKwlzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXA7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CisJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisJdW5pb24gc2N0cF9hZGRyIHRvOworCXN0cnVjdCBzY3RwX2FmICphZjsKKwlzY3RwX3Njb3BlX3Qgc2NvcGU7CisJbG9uZyB0aW1lbzsKKwlpbnQgZXJyID0gMDsKKworCXNjdHBfbG9ja19zb2NrKHNrKTsKKworCVNDVFBfREVCVUdfUFJJTlRLKCIlcyAtIHNrOiAlcCwgc29ja2FkZHI6ICVwLCBhZGRyX2xlbjogJWQpXG4iLAorCQkJICBfX0ZVTkNUSU9OX18sIHNrLCB1YWRkciwgYWRkcl9sZW4pOworCisJc3AgPSBzY3RwX3NrKHNrKTsKKwllcCA9IHNwLT5lcDsKKworCS8qIGNvbm5lY3QoKSBjYW5ub3QgYmUgZG9uZSBvbiBhIHNvY2tldCB0aGF0IGlzIGFscmVhZHkgaW4gRVNUQUJMSVNIRUQKKwkgKiBzdGF0ZSAtIFVEUC1zdHlsZSBwZWVsZWQgb2ZmIHNvY2tldCBvciBhIFRDUC1zdHlsZSBzb2NrZXQgdGhhdAorCSAqIGlzIGFscmVhZHkgY29ubmVjdGVkLgorCSAqIEl0IGNhbm5vdCBiZSBkb25lIGV2ZW4gb24gYSBUQ1Atc3R5bGUgbGlzdGVuaW5nIHNvY2tldC4KKwkgKi8KKwlpZiAoc2N0cF9zc3RhdGUoc2ssIEVTVEFCTElTSEVEKSB8fAorCSAgICAoc2N0cF9zdHlsZShzaywgVENQKSAmJiBzY3RwX3NzdGF0ZShzaywgTElTVEVOSU5HKSkpIHsKKwkJZXJyID0gLUVJU0NPTk47CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwllcnIgPSBzY3RwX3ZlcmlmeV9hZGRyKHNrLCAodW5pb24gc2N0cF9hZGRyICopdWFkZHIsIGFkZHJfbGVuKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlpZiAoYWRkcl9sZW4gPiBzaXplb2YodG8pKQorCQlhZGRyX2xlbiA9IHNpemVvZih0byk7CisJbWVtY3B5KCZ0bywgdWFkZHIsIGFkZHJfbGVuKTsKKwl0by52NC5zaW5fcG9ydCA9IG50b2hzKHRvLnY0LnNpbl9wb3J0KTsKKworCWFzb2MgPSBzY3RwX2VuZHBvaW50X2xvb2t1cF9hc3NvYyhlcCwgJnRvLCAmdHJhbnNwb3J0KTsKKwlpZiAoYXNvYykgeworCQlpZiAoYXNvYy0+c3RhdGUgPj0gU0NUUF9TVEFURV9FU1RBQkxJU0hFRCkKKwkJCWVyciA9IC1FSVNDT05OOworCQllbHNlCisJCQllcnIgPSAtRUFMUkVBRFk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwkvKiBJZiB3ZSBjb3VsZCBub3QgZmluZCBhIG1hdGNoaW5nIGFzc29jaWF0aW9uIG9uIHRoZSBlbmRwb2ludCwKKwkgKiBtYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBubyBwZWVsZWQtb2ZmIGFzc29jaWF0aW9uIG1hdGNoaW5nIHRoZQorCSAqIHBlZXIgYWRkcmVzcyBldmVuIG9uIGFub3RoZXIgc29ja2V0LgorCSAqLworCWlmIChzY3RwX2VuZHBvaW50X2lzX3BlZWxlZF9vZmYoZXAsICZ0bykpIHsKKwkJZXJyID0gLUVBRERSTk9UQVZBSUw7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwkvKiBJZiBhIGJpbmQoKSBvciBzY3RwX2JpbmR4KCkgaXMgbm90IGNhbGxlZCBwcmlvciB0byBhIGNvbm5lY3QoKQorCSAqIGNhbGwsIHRoZSBzeXN0ZW0gcGlja3MgYW4gZXBoZW1lcmFsIHBvcnQgYW5kIHdpbGwgY2hvb3NlIGFuIGFkZHJlc3MKKwkgKiBzZXQgZXF1aXZhbGVudCB0byBiaW5kaW5nIHdpdGggYSB3aWxkY2FyZCBhZGRyZXNzLgorCSAqLworCWlmICghZXAtPmJhc2UuYmluZF9hZGRyLnBvcnQpIHsKKwkJaWYgKHNjdHBfYXV0b2JpbmQoc2spKSB7CisJCQllcnIgPSAtRUFHQUlOOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisJfQorCisJc2NvcGUgPSBzY3RwX3Njb3BlKCZ0byk7CisJYXNvYyA9IHNjdHBfYXNzb2NpYXRpb25fbmV3KGVwLCBzaywgc2NvcGUsIEdGUF9LRVJORUwpOworCWlmICghYXNvYykgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dF91bmxvY2s7CisgIAl9CisKKwkvKiBQcmltZSB0aGUgcGVlcidzIHRyYW5zcG9ydCBzdHJ1Y3R1cmVzLiAgKi8KKwl0cmFuc3BvcnQgPSBzY3RwX2Fzc29jX2FkZF9wZWVyKGFzb2MsICZ0bywgR0ZQX0tFUk5FTCk7CisJaWYgKCF0cmFuc3BvcnQpIHsKKwkJc2N0cF9hc3NvY2lhdGlvbl9mcmVlKGFzb2MpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCWVyciA9IHNjdHBfYXNzb2Nfc2V0X2JpbmRfYWRkcl9mcm9tX2VwKGFzb2MsIEdGUF9LRVJORUwpOworCWlmIChlcnIgPCAwKSB7CisJCXNjdHBfYXNzb2NpYXRpb25fZnJlZShhc29jKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWVyciA9IHNjdHBfcHJpbWl0aXZlX0FTU09DSUFURShhc29jLCBOVUxMKTsKKwlpZiAoZXJyIDwgMCkgeworCQlzY3RwX2Fzc29jaWF0aW9uX2ZyZWUoYXNvYyk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwkvKiBJbml0aWFsaXplIHNrJ3MgZHBvcnQgYW5kIGRhZGRyIGZvciBnZXRwZWVybmFtZSgpICovCisJaW5ldF9zayhzayktPmRwb3J0ID0gaHRvbnMoYXNvYy0+cGVlci5wb3J0KTsKKwlhZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKHRvLnNhLnNhX2ZhbWlseSk7CisJYWYtPnRvX3NrX2RhZGRyKCZ0bywgc2spOworCisJdGltZW8gPSBzb2NrX3NuZHRpbWVvKHNrLCBzay0+c2tfc29ja2V0LT5maWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJZXJyID0gc2N0cF93YWl0X2Zvcl9jb25uZWN0KGFzb2MsICZ0aW1lbyk7CisKK291dF91bmxvY2s6CisJc2N0cF9yZWxlYXNlX3NvY2soc2spOworCisJcmV0dXJuIGVycjsKK30KKworLyogRklYTUU6IFdyaXRlIGNvbW1lbnRzLiAqLworU0NUUF9TVEFUSUMgaW50IHNjdHBfZGlzY29ubmVjdChzdHJ1Y3Qgc29jayAqc2ssIGludCBmbGFncykKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7IC8qIFNUVUIgKi8KK30KKworLyogNC4xLjQgYWNjZXB0KCkgLSBUQ1AgU3R5bGUgU3ludGF4CisgKgorICogQXBwbGljYXRpb25zIHVzZSBhY2NlcHQoKSBjYWxsIHRvIHJlbW92ZSBhbiBlc3RhYmxpc2hlZCBTQ1RQCisgKiBhc3NvY2lhdGlvbiBmcm9tIHRoZSBhY2NlcHQgcXVldWUgb2YgdGhlIGVuZHBvaW50LiAgQSBuZXcgc29ja2V0CisgKiBkZXNjcmlwdG9yIHdpbGwgYmUgcmV0dXJuZWQgZnJvbSBhY2NlcHQoKSB0byByZXByZXNlbnQgdGhlIG5ld2x5CisgKiBmb3JtZWQgYXNzb2NpYXRpb24uCisgKi8KK1NDVFBfU1RBVElDIHN0cnVjdCBzb2NrICpzY3RwX2FjY2VwdChzdHJ1Y3Qgc29jayAqc2ssIGludCBmbGFncywgaW50ICplcnIpCit7CisJc3RydWN0IHNjdHBfc29jayAqc3A7CisJc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwOworCXN0cnVjdCBzb2NrICpuZXdzayA9IE5VTEw7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CisJbG9uZyB0aW1lbzsKKwlpbnQgZXJyb3IgPSAwOworCisJc2N0cF9sb2NrX3NvY2soc2spOworCisJc3AgPSBzY3RwX3NrKHNrKTsKKwllcCA9IHNwLT5lcDsKKworCWlmICghc2N0cF9zdHlsZShzaywgVENQKSkgeworCQllcnJvciA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIXNjdHBfc3N0YXRlKHNrLCBMSVNURU5JTkcpKSB7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJdGltZW8gPSBzb2NrX3JjdnRpbWVvKHNrLCBzay0+c2tfc29ja2V0LT5maWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisKKwllcnJvciA9IHNjdHBfd2FpdF9mb3JfYWNjZXB0KHNrLCB0aW1lbyk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCS8qIFdlIHRyZWF0IHRoZSBsaXN0IG9mIGFzc29jaWF0aW9ucyBvbiB0aGUgZW5kcG9pbnQgYXMgdGhlIGFjY2VwdAorCSAqIHF1ZXVlIGFuZCBwaWNrIHRoZSBmaXJzdCBhc3NvY2lhdGlvbiBvbiB0aGUgbGlzdC4KKwkgKi8KKwlhc29jID0gbGlzdF9lbnRyeShlcC0+YXNvY3MubmV4dCwgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24sIGFzb2NzKTsKKworCW5ld3NrID0gc3AtPnBmLT5jcmVhdGVfYWNjZXB0X3NrKHNrLCBhc29jKTsKKwlpZiAoIW5ld3NrKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogUG9wdWxhdGUgdGhlIGZpZWxkcyBvZiB0aGUgbmV3c2sgZnJvbSB0aGUgb2xkc2sgYW5kIG1pZ3JhdGUgdGhlCisJICogYXNvYyB0byB0aGUgbmV3c2suCisJICovCisJc2N0cF9zb2NrX21pZ3JhdGUoc2ssIG5ld3NrLCBhc29jLCBTQ1RQX1NPQ0tFVF9UQ1ApOworCitvdXQ6CisJc2N0cF9yZWxlYXNlX3NvY2soc2spOworIAkqZXJyID0gZXJyb3I7CisJcmV0dXJuIG5ld3NrOworfQorCisvKiBUaGUgU0NUUCBpb2N0bCBoYW5kbGVyLiAqLworU0NUUF9TVEFUSUMgaW50IHNjdHBfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gLUVOT0lPQ1RMQ01EOworfQorCisvKiBUaGlzIGlzIHRoZSBmdW5jdGlvbiB3aGljaCBnZXRzIGNhbGxlZCBkdXJpbmcgc29ja2V0IGNyZWF0aW9uIHRvCisgKiBpbml0aWFsaXplZCB0aGUgU0NUUC1zcGVjaWZpYyBwb3J0aW9uIG9mIHRoZSBzb2NrLgorICogVGhlIHNvY2sgc3RydWN0dXJlIHNob3VsZCBhbHJlYWR5IGJlIHplcm8tZmlsbGVkIG1lbW9yeS4KKyAqLworU0NUUF9TVEFUSUMgaW50IHNjdHBfaW5pdF9zb2NrKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXA7CisJc3RydWN0IHNjdHBfc29jayAqc3A7CisKKwlTQ1RQX0RFQlVHX1BSSU5USygic2N0cF9pbml0X3NvY2soc2s6ICVwKVxuIiwgc2spOworCisJc3AgPSBzY3RwX3NrKHNrKTsKKworCS8qIEluaXRpYWxpemUgdGhlIFNDVFAgcGVyIHNvY2tldCBhcmVhLiAgKi8KKwlzd2l0Y2ggKHNrLT5za190eXBlKSB7CisJY2FzZSBTT0NLX1NFUVBBQ0tFVDoKKwkJc3AtPnR5cGUgPSBTQ1RQX1NPQ0tFVF9VRFA7CisJCWJyZWFrOworCWNhc2UgU09DS19TVFJFQU06CisJCXNwLT50eXBlID0gU0NUUF9TT0NLRVRfVENQOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVTT0NLVE5PU1VQUE9SVDsKKwl9CisKKwkvKiBJbml0aWFsaXplIGRlZmF1bHQgc2VuZCBwYXJhbWV0ZXJzLiBUaGVzZSBwYXJhbWV0ZXJzIGNhbiBiZQorCSAqIG1vZGlmaWVkIHdpdGggdGhlIFNDVFBfREVGQVVMVF9TRU5EX1BBUkFNIHNvY2tldCBvcHRpb24uCisJICovCisJc3AtPmRlZmF1bHRfc3RyZWFtID0gMDsKKwlzcC0+ZGVmYXVsdF9wcGlkID0gMDsKKwlzcC0+ZGVmYXVsdF9mbGFncyA9IDA7CisJc3AtPmRlZmF1bHRfY29udGV4dCA9IDA7CisJc3AtPmRlZmF1bHRfdGltZXRvbGl2ZSA9IDA7CisKKwkvKiBJbml0aWFsaXplIGRlZmF1bHQgc2V0dXAgcGFyYW1ldGVycy4gVGhlc2UgcGFyYW1ldGVycworCSAqIGNhbiBiZSBtb2RpZmllZCB3aXRoIHRoZSBTQ1RQX0lOSVRNU0cgc29ja2V0IG9wdGlvbiBvcgorCSAqIG92ZXJyaWRkZW4gYnkgdGhlIFNDVFBfSU5JVCBDTVNHLgorCSAqLworCXNwLT5pbml0bXNnLnNpbml0X251bV9vc3RyZWFtcyAgID0gc2N0cF9tYXhfb3V0c3RyZWFtczsKKwlzcC0+aW5pdG1zZy5zaW5pdF9tYXhfaW5zdHJlYW1zICA9IHNjdHBfbWF4X2luc3RyZWFtczsKKwlzcC0+aW5pdG1zZy5zaW5pdF9tYXhfYXR0ZW1wdHMgICA9IHNjdHBfbWF4X3JldHJhbnNfaW5pdDsKKwlzcC0+aW5pdG1zZy5zaW5pdF9tYXhfaW5pdF90aW1lbyA9IGppZmZpZXNfdG9fbXNlY3Moc2N0cF9ydG9fbWF4KTsKKworCS8qIEluaXRpYWxpemUgZGVmYXVsdCBSVE8gcmVsYXRlZCBwYXJhbWV0ZXJzLiAgVGhlc2UgcGFyYW1ldGVycyBjYW4KKwkgKiBiZSBtb2RpZmllZCBmb3Igd2l0aCB0aGUgU0NUUF9SVE9JTkZPIHNvY2tldCBvcHRpb24uCisJICovCisJc3AtPnJ0b2luZm8uc3J0b19pbml0aWFsID0gamlmZmllc190b19tc2VjcyhzY3RwX3J0b19pbml0aWFsKTsKKwlzcC0+cnRvaW5mby5zcnRvX21heCAgICAgPSBqaWZmaWVzX3RvX21zZWNzKHNjdHBfcnRvX21heCk7CisJc3AtPnJ0b2luZm8uc3J0b19taW4gICAgID0gamlmZmllc190b19tc2VjcyhzY3RwX3J0b19taW4pOworCisJLyogSW5pdGlhbGl6ZSBkZWZhdWx0IGFzc29jaWF0aW9uIHJlbGF0ZWQgcGFyYW1ldGVycy4gVGhlc2UgcGFyYW1ldGVycworCSAqIGNhbiBiZSBtb2RpZmllZCB3aXRoIHRoZSBTQ1RQX0FTU09DSU5GTyBzb2NrZXQgb3B0aW9uLgorCSAqLworCXNwLT5hc3NvY3BhcmFtcy5zYXNvY19hc29jbWF4cnh0ID0gc2N0cF9tYXhfcmV0cmFuc19hc3NvY2lhdGlvbjsKKwlzcC0+YXNzb2NwYXJhbXMuc2Fzb2NfbnVtYmVyX3BlZXJfZGVzdGluYXRpb25zID0gMDsKKwlzcC0+YXNzb2NwYXJhbXMuc2Fzb2NfcGVlcl9yd25kID0gMDsKKwlzcC0+YXNzb2NwYXJhbXMuc2Fzb2NfbG9jYWxfcnduZCA9IDA7CisJc3AtPmFzc29jcGFyYW1zLnNhc29jX2Nvb2tpZV9saWZlID0gCisJCWppZmZpZXNfdG9fbXNlY3Moc2N0cF92YWxpZF9jb29raWVfbGlmZSk7CisKKwkvKiBJbml0aWFsaXplIGRlZmF1bHQgZXZlbnQgc3Vic2NyaXB0aW9ucy4gQnkgZGVmYXVsdCwgYWxsIHRoZQorCSAqIG9wdGlvbnMgYXJlIG9mZi4gCisJICovCisJbWVtc2V0KCZzcC0+c3Vic2NyaWJlLCAwLCBzaXplb2Yoc3RydWN0IHNjdHBfZXZlbnRfc3Vic2NyaWJlKSk7CisKKwkvKiBEZWZhdWx0IFBlZXIgQWRkcmVzcyBQYXJhbWV0ZXJzLiAgVGhlc2UgZGVmYXVsdHMgY2FuCisJICogYmUgbW9kaWZpZWQgdmlhIFNDVFBfUEVFUl9BRERSX1BBUkFNUworCSAqLworCXNwLT5wYWRkcnBhcmFtLnNwcF9oYmludGVydmFsID0gamlmZmllc190b19tc2VjcyhzY3RwX2hiX2ludGVydmFsKTsKKwlzcC0+cGFkZHJwYXJhbS5zcHBfcGF0aG1heHJ4dCA9IHNjdHBfbWF4X3JldHJhbnNfcGF0aDsKKworCS8qIElmIGVuYWJsZWQgbm8gU0NUUCBtZXNzYWdlIGZyYWdtZW50YXRpb24gd2lsbCBiZSBwZXJmb3JtZWQuCisJICogQ29uZmlndXJlIHRocm91Z2ggU0NUUF9ESVNBQkxFX0ZSQUdNRU5UUyBzb2NrZXQgb3B0aW9uLgorCSAqLworCXNwLT5kaXNhYmxlX2ZyYWdtZW50cyA9IDA7CisKKwkvKiBUdXJuIG9uL29mZiBhbnkgTmFnbGUtbGlrZSBhbGdvcml0aG0uICAqLworCXNwLT5ub2RlbGF5ICAgICAgICAgICA9IDE7CisKKwkvKiBFbmFibGUgYnkgZGVmYXVsdC4gKi8KKwlzcC0+djRtYXBwZWQgICAgICAgICAgPSAxOworCisJLyogQXV0by1jbG9zZSBpZGxlIGFzc29jaWF0aW9ucyBhZnRlciB0aGUgY29uZmlndXJlZAorCSAqIG51bWJlciBvZiBzZWNvbmRzLiAgQSB2YWx1ZSBvZiAwIGRpc2FibGVzIHRoaXMKKwkgKiBmZWF0dXJlLiAgQ29uZmlndXJlIHRocm91Z2ggdGhlIFNDVFBfQVVUT0NMT1NFIHNvY2tldCBvcHRpb24sCisJICogZm9yIFVEUC1zdHlsZSBzb2NrZXRzIG9ubHkuCisJICovCisJc3AtPmF1dG9jbG9zZSAgICAgICAgID0gMDsKKworCS8qIFVzZXIgc3BlY2lmaWVkIGZyYWdtZW50YXRpb24gbGltaXQuICovCisJc3AtPnVzZXJfZnJhZyAgICAgICAgID0gMDsKKworCXNwLT5hZGFwdGlvbl9pbmQgPSAwOworCisJc3AtPnBmID0gc2N0cF9nZXRfcGZfc3BlY2lmaWMoc2stPnNrX2ZhbWlseSk7CisKKwkvKiBDb250cm9sIHZhcmlhYmxlcyBmb3IgcGFydGlhbCBkYXRhIGRlbGl2ZXJ5LiAqLworCXNwLT5wZF9tb2RlICAgICAgICAgICA9IDA7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc3AtPnBkX2xvYmJ5KTsKKworCS8qIENyZWF0ZSBhIHBlciBzb2NrZXQgZW5kcG9pbnQgc3RydWN0dXJlLiAgRXZlbiBpZiB3ZQorCSAqIGNoYW5nZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgcmVsYXRpb25zaGlwcywgdGhpcyBtYXkgc3RpbGwKKwkgKiBiZSB1c2VmdWwgZm9yIHN0b3JpbmcgcHJlLWNvbm5lY3QgYWRkcmVzcyBpbmZvcm1hdGlvbi4KKwkgKi8KKwllcCA9IHNjdHBfZW5kcG9pbnRfbmV3KHNrLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwLT5lcCA9IGVwOworCXNwLT5obWFjID0gTlVMTDsKKworCVNDVFBfREJHX09CSkNOVF9JTkMoc29jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qIENsZWFudXAgYW55IFNDVFAgcGVyIHNvY2tldCByZXNvdXJjZXMuICAqLworU0NUUF9TVEFUSUMgaW50IHNjdHBfZGVzdHJveV9zb2NrKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXA7CisKKwlTQ1RQX0RFQlVHX1BSSU5USygic2N0cF9kZXN0cm95X3NvY2soc2s6ICVwKVxuIiwgc2spOworCisJLyogUmVsZWFzZSBvdXIgaG9sZCBvbiB0aGUgZW5kcG9pbnQuICovCisJZXAgPSBzY3RwX3NrKHNrKS0+ZXA7CisJc2N0cF9lbmRwb2ludF9mcmVlKGVwKTsKKworCXJldHVybiAwOworfQorCisvKiBBUEkgNC4xLjcgc2h1dGRvd24oKSAtIFRDUCBTdHlsZSBTeW50YXgKKyAqICAgICBpbnQgc2h1dGRvd24oaW50IHNvY2tldCwgaW50IGhvdyk7CisgKgorICogICAgIHNkICAgICAgLSB0aGUgc29ja2V0IGRlc2NyaXB0b3Igb2YgdGhlIGFzc29jaWF0aW9uIHRvIGJlIGNsb3NlZC4KKyAqICAgICBob3cgICAgIC0gU3BlY2lmaWVzIHRoZSB0eXBlIG9mIHNodXRkb3duLiAgVGhlICB2YWx1ZXMgIGFyZQorICogICAgICAgICAgICAgICBhcyBmb2xsb3dzOgorICogICAgICAgICAgICAgICBTSFVUX1JECisgKiAgICAgICAgICAgICAgICAgICAgIERpc2FibGVzIGZ1cnRoZXIgcmVjZWl2ZSBvcGVyYXRpb25zLiBObyBTQ1RQCisgKiAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sIGFjdGlvbiBpcyB0YWtlbi4KKyAqICAgICAgICAgICAgICAgU0hVVF9XUgorICogICAgICAgICAgICAgICAgICAgICBEaXNhYmxlcyBmdXJ0aGVyIHNlbmQgb3BlcmF0aW9ucywgYW5kIGluaXRpYXRlcworICogICAgICAgICAgICAgICAgICAgICB0aGUgU0NUUCBzaHV0ZG93biBzZXF1ZW5jZS4KKyAqICAgICAgICAgICAgICAgU0hVVF9SRFdSCisgKiAgICAgICAgICAgICAgICAgICAgIERpc2FibGVzIGZ1cnRoZXIgc2VuZCAgYW5kICByZWNlaXZlICBvcGVyYXRpb25zCisgKiAgICAgICAgICAgICAgICAgICAgIGFuZCBpbml0aWF0ZXMgdGhlIFNDVFAgc2h1dGRvd24gc2VxdWVuY2UuCisgKi8KK1NDVFBfU1RBVElDIHZvaWQgc2N0cF9zaHV0ZG93bihzdHJ1Y3Qgc29jayAqc2ssIGludCBob3cpCit7CisJc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwOworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOworCisJaWYgKCFzY3RwX3N0eWxlKHNrLCBUQ1ApKQorCQlyZXR1cm47CisKKwlpZiAoaG93ICYgU0VORF9TSFVURE9XTikgeworCQllcCA9IHNjdHBfc2soc2spLT5lcDsKKwkJaWYgKCFsaXN0X2VtcHR5KCZlcC0+YXNvY3MpKSB7CisJCQlhc29jID0gbGlzdF9lbnRyeShlcC0+YXNvY3MubmV4dCwKKwkJCQkJICBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiwgYXNvY3MpOworCQkJc2N0cF9wcmltaXRpdmVfU0hVVERPV04oYXNvYywgTlVMTCk7CisJCX0KKwl9Cit9CisKKy8qIDcuMi4xIEFzc29jaWF0aW9uIFN0YXR1cyAoU0NUUF9TVEFUVVMpCisKKyAqIEFwcGxpY2F0aW9ucyBjYW4gcmV0cmlldmUgY3VycmVudCBzdGF0dXMgaW5mb3JtYXRpb24gYWJvdXQgYW4KKyAqIGFzc29jaWF0aW9uLCBpbmNsdWRpbmcgYXNzb2NpYXRpb24gc3RhdGUsIHBlZXIgcmVjZWl2ZXIgd2luZG93IHNpemUsCisgKiBudW1iZXIgb2YgdW5hY2tlZCBkYXRhIGNodW5rcywgYW5kIG51bWJlciBvZiBkYXRhIGNodW5rcyBwZW5kaW5nCisgKiByZWNlaXB0LiAgVGhpcyBpbmZvcm1hdGlvbiBpcyByZWFkLW9ubHkuCisgKi8KK3N0YXRpYyBpbnQgc2N0cF9nZXRzb2Nrb3B0X3NjdHBfc3RhdHVzKHN0cnVjdCBzb2NrICpzaywgaW50IGxlbiwKKwkJCQkgICAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwKKwkJCQkgICAgICAgaW50IF9fdXNlciAqb3B0bGVuKQoreworCXN0cnVjdCBzY3RwX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MgPSBOVUxMOworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0OworCXNjdHBfYXNzb2NfdCBhc3NvY2lkOworCWludCByZXR2YWwgPSAwOworCisJaWYgKGxlbiAhPSBzaXplb2Yoc3RhdHVzKSkgeworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnN0YXR1cywgb3B0dmFsLCBzaXplb2Yoc3RhdHVzKSkpIHsKKwkJcmV0dmFsID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCisJYXNzb2NpZCA9IHN0YXR1cy5zc3RhdF9hc3NvY19pZDsKKwlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgYXNzb2NpZCk7CisJaWYgKCFhc29jKSB7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXRyYW5zcG9ydCA9IGFzb2MtPnBlZXIucHJpbWFyeV9wYXRoOworCisJc3RhdHVzLnNzdGF0X2Fzc29jX2lkID0gc2N0cF9hc3NvYzJpZChhc29jKTsKKwlzdGF0dXMuc3N0YXRfc3RhdGUgPSBhc29jLT5zdGF0ZTsKKwlzdGF0dXMuc3N0YXRfcnduZCA9ICBhc29jLT5wZWVyLnJ3bmQ7CisJc3RhdHVzLnNzdGF0X3VuYWNrZGF0YSA9IGFzb2MtPnVuYWNrX2RhdGE7CisKKwlzdGF0dXMuc3N0YXRfcGVuZGRhdGEgPSBzY3RwX3Rzbm1hcF9wZW5kaW5nKCZhc29jLT5wZWVyLnRzbl9tYXApOworCXN0YXR1cy5zc3RhdF9pbnN0cm1zID0gYXNvYy0+Yy5zaW5pdF9tYXhfaW5zdHJlYW1zOworCXN0YXR1cy5zc3RhdF9vdXRzdHJtcyA9IGFzb2MtPmMuc2luaXRfbnVtX29zdHJlYW1zOworCXN0YXR1cy5zc3RhdF9mcmFnbWVudGF0aW9uX3BvaW50ID0gYXNvYy0+ZnJhZ19wb2ludDsKKwlzdGF0dXMuc3N0YXRfcHJpbWFyeS5zcGluZm9fYXNzb2NfaWQgPSBzY3RwX2Fzc29jMmlkKHRyYW5zcG9ydC0+YXNvYyk7CisJbWVtY3B5KCZzdGF0dXMuc3N0YXRfcHJpbWFyeS5zcGluZm9fYWRkcmVzcywKKwkgICAgICAgJih0cmFuc3BvcnQtPmlwYWRkciksIHNpemVvZih1bmlvbiBzY3RwX2FkZHIpKTsKKwkvKiBNYXAgaXB2NCBhZGRyZXNzIGludG8gdjQtbWFwcGVkLW9uLXY2IGFkZHJlc3MuICAqLworCXNjdHBfZ2V0X3BmX3NwZWNpZmljKHNrLT5za19mYW1pbHkpLT5hZGRyX3Y0bWFwKHNjdHBfc2soc2spLAorCQkodW5pb24gc2N0cF9hZGRyICopJnN0YXR1cy5zc3RhdF9wcmltYXJ5LnNwaW5mb19hZGRyZXNzKTsKKwlzdGF0dXMuc3N0YXRfcHJpbWFyeS5zcGluZm9fc3RhdGUgPSB0cmFuc3BvcnQtPmFjdGl2ZTsKKwlzdGF0dXMuc3N0YXRfcHJpbWFyeS5zcGluZm9fY3duZCA9IHRyYW5zcG9ydC0+Y3duZDsKKwlzdGF0dXMuc3N0YXRfcHJpbWFyeS5zcGluZm9fc3J0dCA9IHRyYW5zcG9ydC0+c3J0dDsKKwlzdGF0dXMuc3N0YXRfcHJpbWFyeS5zcGluZm9fcnRvID0gamlmZmllc190b19tc2Vjcyh0cmFuc3BvcnQtPnJ0byk7CisJc3RhdHVzLnNzdGF0X3ByaW1hcnkuc3BpbmZvX210dSA9IHRyYW5zcG9ydC0+cG10dTsKKworCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpIHsKKwkJcmV0dmFsID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCisJU0NUUF9ERUJVR19QUklOVEsoInNjdHBfZ2V0c29ja29wdF9zY3RwX3N0YXR1cyglZCk6ICVkICVkICVkXG4iLAorCQkJICBsZW4sIHN0YXR1cy5zc3RhdF9zdGF0ZSwgc3RhdHVzLnNzdGF0X3J3bmQsCisJCQkgIHN0YXR1cy5zc3RhdF9hc3NvY19pZCk7CisKKwlpZiAoY29weV90b191c2VyKG9wdHZhbCwgJnN0YXR1cywgbGVuKSkgeworCQlyZXR2YWwgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKK291dDoKKwlyZXR1cm4gKHJldHZhbCk7Cit9CisKKworLyogNy4yLjIgUGVlciBBZGRyZXNzIEluZm9ybWF0aW9uIChTQ1RQX0dFVF9QRUVSX0FERFJfSU5GTykKKyAqCisgKiBBcHBsaWNhdGlvbnMgY2FuIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgcGVlciBhZGRyZXNzCisgKiBvZiBhbiBhc3NvY2lhdGlvbiwgaW5jbHVkaW5nIGl0cyByZWFjaGFiaWxpdHkgc3RhdGUsIGNvbmdlc3Rpb24KKyAqIHdpbmRvdywgYW5kIHJldHJhbnNtaXNzaW9uIHRpbWVyIHZhbHVlcy4gIFRoaXMgaW5mb3JtYXRpb24gaXMKKyAqIHJlYWQtb25seS4KKyAqLworc3RhdGljIGludCBzY3RwX2dldHNvY2tvcHRfcGVlcl9hZGRyX2luZm8oc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuLAorCQkJCQkgIGNoYXIgX191c2VyICpvcHR2YWwsCisJCQkJCSAgaW50IF9fdXNlciAqb3B0bGVuKQoreworCXN0cnVjdCBzY3RwX3BhZGRyaW5mbyBwaW5mbzsKKwlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydDsKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChsZW4gIT0gc2l6ZW9mKHBpbmZvKSkgeworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnBpbmZvLCBvcHR2YWwsIHNpemVvZihwaW5mbykpKSB7CisJCXJldHZhbCA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCXRyYW5zcG9ydCA9IHNjdHBfYWRkcl9pZDJ0cmFuc3BvcnQoc2ssICZwaW5mby5zcGluZm9fYWRkcmVzcywKKwkJCQkJICAgcGluZm8uc3BpbmZvX2Fzc29jX2lkKTsKKwlpZiAoIXRyYW5zcG9ydCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwaW5mby5zcGluZm9fYXNzb2NfaWQgPSBzY3RwX2Fzc29jMmlkKHRyYW5zcG9ydC0+YXNvYyk7CisJcGluZm8uc3BpbmZvX3N0YXRlID0gdHJhbnNwb3J0LT5hY3RpdmU7CisJcGluZm8uc3BpbmZvX2N3bmQgPSB0cmFuc3BvcnQtPmN3bmQ7CisJcGluZm8uc3BpbmZvX3NydHQgPSB0cmFuc3BvcnQtPnNydHQ7CisJcGluZm8uc3BpbmZvX3J0byA9IGppZmZpZXNfdG9fbXNlY3ModHJhbnNwb3J0LT5ydG8pOworCXBpbmZvLnNwaW5mb19tdHUgPSB0cmFuc3BvcnQtPnBtdHU7CisKKwlpZiAocHV0X3VzZXIobGVuLCBvcHRsZW4pKSB7CisJCXJldHZhbCA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAmcGluZm8sIGxlbikpIHsKKwkJcmV0dmFsID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCitvdXQ6CisJcmV0dXJuIChyZXR2YWwpOworfQorCisvKiA3LjEuMTIgRW5hYmxlL0Rpc2FibGUgbWVzc2FnZSBmcmFnbWVudGF0aW9uIChTQ1RQX0RJU0FCTEVfRlJBR01FTlRTKQorICoKKyAqIFRoaXMgb3B0aW9uIGlzIGEgb24vb2ZmIGZsYWcuICBJZiBlbmFibGVkIG5vIFNDVFAgbWVzc2FnZQorICogZnJhZ21lbnRhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZC4gIEluc3RlYWQgaWYgYSBtZXNzYWdlIGJlaW5nIHNlbnQKKyAqIGV4Y2VlZHMgdGhlIGN1cnJlbnQgUE1UVSBzaXplLCB0aGUgbWVzc2FnZSB3aWxsIE5PVCBiZSBzZW50IGFuZAorICogaW5zdGVhZCBhIGVycm9yIHdpbGwgYmUgaW5kaWNhdGVkIHRvIHRoZSB1c2VyLgorICovCitzdGF0aWMgaW50IHNjdHBfZ2V0c29ja29wdF9kaXNhYmxlX2ZyYWdtZW50cyhzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4sCisJCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKK3sKKwlpbnQgdmFsOworCisJaWYgKGxlbiA8IHNpemVvZihpbnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxlbiA9IHNpemVvZihpbnQpOworCXZhbCA9IChzY3RwX3NrKHNrKS0+ZGlzYWJsZV9mcmFnbWVudHMgPT0gMSk7CisJaWYgKHB1dF91c2VyKGxlbiwgb3B0bGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsICZ2YWwsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisvKiA3LjEuMTUgU2V0IG5vdGlmaWNhdGlvbiBhbmQgYW5jaWxsYXJ5IGV2ZW50cyAoU0NUUF9FVkVOVFMpCisgKgorICogVGhpcyBzb2NrZXQgb3B0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB2YXJpb3VzIG5vdGlmaWNhdGlvbnMgYW5kCisgKiBhbmNpbGxhcnkgZGF0YSB0aGUgdXNlciB3aXNoZXMgdG8gcmVjZWl2ZS4KKyAqLworc3RhdGljIGludCBzY3RwX2dldHNvY2tvcHRfZXZlbnRzKHN0cnVjdCBzb2NrICpzaywgaW50IGxlbiwgY2hhciBfX3VzZXIgKm9wdHZhbCwKKwkJCQkgIGludCBfX3VzZXIgKm9wdGxlbikKK3sKKwlpZiAobGVuICE9IHNpemVvZihzdHJ1Y3Qgc2N0cF9ldmVudF9zdWJzY3JpYmUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY29weV90b191c2VyKG9wdHZhbCwgJnNjdHBfc2soc2spLT5zdWJzY3JpYmUsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisvKiA3LjEuOCBBdXRvbWF0aWMgQ2xvc2Ugb2YgYXNzb2NpYXRpb25zIChTQ1RQX0FVVE9DTE9TRSkKKyAqCisgKiBUaGlzIHNvY2tldCBvcHRpb24gaXMgYXBwbGljYWJsZSB0byB0aGUgVURQLXN0eWxlIHNvY2tldCBvbmx5LiAgV2hlbgorICogc2V0IGl0IHdpbGwgY2F1c2UgYXNzb2NpYXRpb25zIHRoYXQgYXJlIGlkbGUgZm9yIG1vcmUgdGhhbiB0aGUKKyAqIHNwZWNpZmllZCBudW1iZXIgb2Ygc2Vjb25kcyB0byBhdXRvbWF0aWNhbGx5IGNsb3NlLiAgQW4gYXNzb2NpYXRpb24KKyAqIGJlaW5nIGlkbGUgaXMgZGVmaW5lZCBhbiBhc3NvY2lhdGlvbiB0aGF0IGhhcyBOT1Qgc2VudCBvciByZWNlaXZlZAorICogdXNlciBkYXRhLiAgVGhlIHNwZWNpYWwgdmFsdWUgb2YgJzAnIGluZGljYXRlcyB0aGF0IG5vIGF1dG9tYXRpYworICogY2xvc2Ugb2YgYW55IGFzc29jaWF0aW9ucyBzaG91bGQgYmUgcGVyZm9ybWVkLiAgVGhlIG9wdGlvbiBleHBlY3RzIGFuCisgKiBpbnRlZ2VyIGRlZmluaW5nIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBvZiBpZGxlIHRpbWUgYmVmb3JlIGFuCisgKiBhc3NvY2lhdGlvbiBpcyBjbG9zZWQuCisgKi8KK3N0YXRpYyBpbnQgc2N0cF9nZXRzb2Nrb3B0X2F1dG9jbG9zZShzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4sIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKK3sKKwkvKiBBcHBsaWNhYmxlIHRvIFVEUC1zdHlsZSBzb2NrZXQgb25seSAqLworCWlmIChzY3RwX3N0eWxlKHNrLCBUQ1ApKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKGxlbiAhPSBzaXplb2YoaW50KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsICZzY3RwX3NrKHNrKS0+YXV0b2Nsb3NlLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworLyogSGVscGVyIHJvdXRpbmUgdG8gYnJhbmNoIG9mZiBhbiBhc3NvY2lhdGlvbiB0byBhIG5ldyBzb2NrZXQuICAqLworU0NUUF9TVEFUSUMgaW50IHNjdHBfZG9fcGVlbG9mZihzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQlzdHJ1Y3Qgc29ja2V0ICoqc29ja3ApCit7CisJc3RydWN0IHNvY2sgKnNrID0gYXNvYy0+YmFzZS5zazsKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCWludCBlcnIgPSAwOworCisJLyogQW4gYXNzb2NpYXRpb24gY2Fubm90IGJlIGJyYW5jaGVkIG9mZiBmcm9tIGFuIGFscmVhZHkgcGVlbGVkLW9mZgorCSAqIHNvY2tldCwgbm9yIGlzIHRoaXMgc3VwcG9ydGVkIGZvciB0Y3Agc3R5bGUgc29ja2V0cy4KKwkgKi8KKwlpZiAoIXNjdHBfc3R5bGUoc2ssIFVEUCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ3JlYXRlIGEgbmV3IHNvY2tldC4gICovCisJZXJyID0gc29ja19jcmVhdGUoc2stPnNrX2ZhbWlseSwgU09DS19TRVFQQUNLRVQsIElQUFJPVE9fU0NUUCwgJnNvY2spOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogUG9wdWxhdGUgdGhlIGZpZWxkcyBvZiB0aGUgbmV3c2sgZnJvbSB0aGUgb2xkc2sgYW5kIG1pZ3JhdGUgdGhlCisJICogYXNvYyB0byB0aGUgbmV3c2suCisJICovCisJc2N0cF9zb2NrX21pZ3JhdGUoc2ssIHNvY2stPnNrLCBhc29jLCBTQ1RQX1NPQ0tFVF9VRFBfSElHSF9CQU5EV0lEVEgpOworCSpzb2NrcCA9IHNvY2s7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNjdHBfZ2V0c29ja29wdF9wZWVsb2ZmKHN0cnVjdCBzb2NrICpzaywgaW50IGxlbiwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoreworCXNjdHBfcGVlbG9mZl9hcmdfdCBwZWVsb2ZmOworCXN0cnVjdCBzb2NrZXQgKm5ld3NvY2s7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CisKKwlpZiAobGVuICE9IHNpemVvZihzY3RwX3BlZWxvZmZfYXJnX3QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnBlZWxvZmYsIG9wdHZhbCwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgcGVlbG9mZi5hc3NvY2lkKTsKKwlpZiAoIWFzb2MpIHsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJU0NUUF9ERUJVR19QUklOVEsoIiVzOiBzazogJXAgYXNvYzogJXBcbiIsIF9fRlVOQ1RJT05fXywgc2ssIGFzb2MpOworCisJcmV0dmFsID0gc2N0cF9kb19wZWVsb2ZmKGFzb2MsICZuZXdzb2NrKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBNYXAgdGhlIHNvY2tldCB0byBhbiB1bnVzZWQgZmQgdGhhdCBjYW4gYmUgcmV0dXJuZWQgdG8gdGhlIHVzZXIuICAqLworCXJldHZhbCA9IHNvY2tfbWFwX2ZkKG5ld3NvY2spOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXNvY2tfcmVsZWFzZShuZXdzb2NrKTsKKwkJZ290byBvdXQ7CisJfQorCisJU0NUUF9ERUJVR19QUklOVEsoIiVzOiBzazogJXAgYXNvYzogJXAgbmV3c2s6ICVwIHNkOiAlZFxuIiwKKwkJCSAgX19GVU5DVElPTl9fLCBzaywgYXNvYywgbmV3c29jay0+c2ssIHJldHZhbCk7CisKKwkvKiBSZXR1cm4gdGhlIGZkIG1hcHBlZCB0byB0aGUgbmV3IHNvY2tldC4gICovCisJcGVlbG9mZi5zZCA9IHJldHZhbDsKKwlpZiAoY29weV90b191c2VyKG9wdHZhbCwgJnBlZWxvZmYsIGxlbikpCisJCXJldHZhbCA9IC1FRkFVTFQ7CisKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiA3LjEuMTMgUGVlciBBZGRyZXNzIFBhcmFtZXRlcnMgKFNDVFBfUEVFUl9BRERSX1BBUkFNUykKKyAqCisgKiBBcHBsaWNhdGlvbnMgY2FuIGVuYWJsZSBvciBkaXNhYmxlIGhlYXJ0YmVhdHMgZm9yIGFueSBwZWVyIGFkZHJlc3Mgb2YKKyAqIGFuIGFzc29jaWF0aW9uLCBtb2RpZnkgYW4gYWRkcmVzcydzIGhlYXJ0YmVhdCBpbnRlcnZhbCwgZm9yY2UgYQorICogaGVhcnRiZWF0IHRvIGJlIHNlbnQgaW1tZWRpYXRlbHksIGFuZCBhZGp1c3QgdGhlIGFkZHJlc3MncyBtYXhpbXVtCisgKiBudW1iZXIgb2YgcmV0cmFuc21pc3Npb25zIHNlbnQgYmVmb3JlIGFuIGFkZHJlc3MgaXMgY29uc2lkZXJlZAorICogdW5yZWFjaGFibGUuICBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGFjY2VzcyBhbmQgbW9kaWZ5IGFuCisgKiBhZGRyZXNzJ3MgcGFyYW1ldGVyczoKKyAqCisgKiAgc3RydWN0IHNjdHBfcGFkZHJwYXJhbXMgeworICogICAgICBzY3RwX2Fzc29jX3QgICAgICAgICAgICBzcHBfYXNzb2NfaWQ7CisgKiAgICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNwcF9hZGRyZXNzOworICogICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBzcHBfaGJpbnRlcnZhbDsKKyAqICAgICAgdWludDE2X3QgICAgICAgICAgICAgICAgc3BwX3BhdGhtYXhyeHQ7CisgKiAgfTsKKyAqCisgKiAgIHNwcF9hc3NvY19pZCAgICAtIChVRFAgc3R5bGUgc29ja2V0KSBUaGlzIGlzIGZpbGxlZCBpbiB0aGUgYXBwbGljYXRpb24sCisgKiAgICAgICAgICAgICAgICAgICAgIGFuZCBpZGVudGlmaWVzIHRoZSBhc3NvY2lhdGlvbiBmb3IgdGhpcyBxdWVyeS4KKyAqICAgc3BwX2FkZHJlc3MgICAgIC0gVGhpcyBzcGVjaWZpZXMgd2hpY2ggYWRkcmVzcyBpcyBvZiBpbnRlcmVzdC4KKyAqICAgc3BwX2hiaW50ZXJ2YWwgIC0gVGhpcyBjb250YWlucyB0aGUgdmFsdWUgb2YgdGhlIGhlYXJ0YmVhdCBpbnRlcnZhbCwKKyAqICAgICAgICAgICAgICAgICAgICAgaW4gbWlsbGlzZWNvbmRzLiAgQSB2YWx1ZSBvZiAwLCB3aGVuIG1vZGlmeWluZyB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLCBzcGVjaWZpZXMgdGhhdCB0aGUgaGVhcnRiZWF0IG9uIHRoaXMKKyAqICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBzaG91bGQgYmUgZGlzYWJsZWQuIEEgdmFsdWUgb2YgVUlOVDMyX01BWAorICogICAgICAgICAgICAgICAgICAgICAoNDI5NDk2NzI5NSksIHdoZW4gbW9kaWZ5aW5nIHRoZSBwYXJhbWV0ZXIsCisgKiAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGF0IGEgaGVhcnRiZWF0IHNob3VsZCBiZSBzZW50CisgKiAgICAgICAgICAgICAgICAgICAgIGltbWVkaWF0ZWx5IHRvIHRoZSBwZWVyIGFkZHJlc3MsIGFuZCB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbCBzaG91bGQgcmVtYWluIHVuY2hhbmdlZC4KKyAqICAgc3BwX3BhdGhtYXhyeHQgIC0gVGhpcyBjb250YWlucyB0aGUgbWF4aW11bSBudW1iZXIgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgcmV0cmFuc21pc3Npb25zIGJlZm9yZSB0aGlzIGFkZHJlc3Mgc2hhbGwgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgY29uc2lkZXJlZCB1bnJlYWNoYWJsZS4KKyAqLworc3RhdGljIGludCBzY3RwX2dldHNvY2tvcHRfcGVlcl9hZGRyX3BhcmFtcyhzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4sCisJCQkJCQljaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCit7CisJc3RydWN0IHNjdHBfcGFkZHJwYXJhbXMgcGFyYW1zOworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnM7CisKKwlpZiAobGVuICE9IHNpemVvZihzdHJ1Y3Qgc2N0cF9wYWRkcnBhcmFtcykpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjb3B5X2Zyb21fdXNlcigmcGFyYW1zLCBvcHR2YWwsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogSWYgbm8gYXNzb2NpYXRpb24gaWQgaXMgc3BlY2lmaWVkIHJldHJpZXZlIHRoZSBkZWZhdWx0IHZhbHVlCisJICogZm9yIHRoZSBlbmRwb2ludCB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgYWxsIGZ1dHVyZSBhc3NvY2lhdGlvbnMKKwkgKi8KKwlpZiAoIXBhcmFtcy5zcHBfYXNzb2NfaWQgJiYKKwkgICAgc2N0cF9pc19hbnkoKCB1bmlvbiBzY3RwX2FkZHIgKikmcGFyYW1zLnNwcF9hZGRyZXNzKSkgeworCQlwYXJhbXMuc3BwX2hiaW50ZXJ2YWwgPSBzY3RwX3NrKHNrKS0+cGFkZHJwYXJhbS5zcHBfaGJpbnRlcnZhbDsKKwkJcGFyYW1zLnNwcF9wYXRobWF4cnh0ID0gc2N0cF9zayhzayktPnBhZGRycGFyYW0uc3BwX3BhdGhtYXhyeHQ7CisKKwkJZ290byBkb25lOworCX0KKworCXRyYW5zID0gc2N0cF9hZGRyX2lkMnRyYW5zcG9ydChzaywgJnBhcmFtcy5zcHBfYWRkcmVzcywKKwkJCQkgICAgICAgcGFyYW1zLnNwcF9hc3NvY19pZCk7CisJaWYgKCF0cmFucykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBUaGUgdmFsdWUgb2YgdGhlIGhlYXJ0YmVhdCBpbnRlcnZhbCwgaW4gbWlsbGlzZWNvbmRzLiBBIHZhbHVlIG9mIDAsCisJICogd2hlbiBtb2RpZnlpbmcgdGhlIHBhcmFtZXRlciwgc3BlY2lmaWVzIHRoYXQgdGhlIGhlYXJ0YmVhdCBvbiB0aGlzCisJICogYWRkcmVzcyBzaG91bGQgYmUgZGlzYWJsZWQuCisJICovCisJaWYgKCF0cmFucy0+aGJfYWxsb3dlZCkKKwkJcGFyYW1zLnNwcF9oYmludGVydmFsID0gMDsKKwllbHNlCisJCXBhcmFtcy5zcHBfaGJpbnRlcnZhbCA9IGppZmZpZXNfdG9fbXNlY3ModHJhbnMtPmhiX2ludGVydmFsKTsKKworCS8qIHNwcF9wYXRobWF4cnh0IGNvbnRhaW5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyYW5zbWlzc2lvbnMKKwkgKiBiZWZvcmUgdGhpcyBhZGRyZXNzIHNoYWxsIGJlIGNvbnNpZGVyZWQgdW5yZWFjaGFibGUuCisJICovCisJcGFyYW1zLnNwcF9wYXRobWF4cnh0ID0gdHJhbnMtPm1heF9yZXRyYW5zOworCitkb25lOgorCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAmcGFyYW1zLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKy8qIDcuMS4zIEluaXRpYWxpemF0aW9uIFBhcmFtZXRlcnMgKFNDVFBfSU5JVE1TRykKKyAqCisgKiBBcHBsaWNhdGlvbnMgY2FuIHNwZWNpZnkgcHJvdG9jb2wgcGFyYW1ldGVycyBmb3IgdGhlIGRlZmF1bHQgYXNzb2NpYXRpb24KKyAqIGluaXRpYWxpemF0aW9uLiAgVGhlIG9wdGlvbiBuYW1lIGFyZ3VtZW50IHRvIHNldHNvY2tvcHQoKSBhbmQgZ2V0c29ja29wdCgpCisgKiBpcyBTQ1RQX0lOSVRNU0cuCisgKgorICogU2V0dGluZyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGlzIGVmZmVjdGl2ZSBvbmx5IG9uIGFuIHVuY29ubmVjdGVkCisgKiBzb2NrZXQgKGZvciBVRFAtc3R5bGUgc29ja2V0cyBvbmx5IGZ1dHVyZSBhc3NvY2lhdGlvbnMgYXJlIGVmZmVjdGVkCisgKiBieSB0aGUgY2hhbmdlKS4gIFdpdGggVENQLXN0eWxlIHNvY2tldHMsIHRoaXMgb3B0aW9uIGlzIGluaGVyaXRlZCBieQorICogc29ja2V0cyBkZXJpdmVkIGZyb20gYSBsaXN0ZW5lciBzb2NrZXQuCisgKi8KK3N0YXRpYyBpbnQgc2N0cF9nZXRzb2Nrb3B0X2luaXRtc2coc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCit7CisJaWYgKGxlbiAhPSBzaXplb2Yoc3RydWN0IHNjdHBfaW5pdG1zZykpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAmc2N0cF9zayhzayktPmluaXRtc2csIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjdHBfZ2V0c29ja29wdF9wZWVyX2FkZHJzX251bShzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4sCisJCQkJCSAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoreworCXNjdHBfYXNzb2NfdCBpZDsKKwlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJaW50IGNudCA9IDA7CisKKwlpZiAobGVuICE9IHNpemVvZihzY3RwX2Fzc29jX3QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmaWQsIG9wdHZhbCwgc2l6ZW9mKHNjdHBfYXNzb2NfdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIEZvciBVRFAtc3R5bGUgc29ja2V0cywgaWQgc3BlY2lmaWVzIHRoZSBhc3NvY2lhdGlvbiB0byBxdWVyeS4gICovCisJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIGlkKTsKKwlpZiAoIWFzb2MpCisJCXJldHVybiAtRUlOVkFMOworCisJbGlzdF9mb3JfZWFjaChwb3MsICZhc29jLT5wZWVyLnRyYW5zcG9ydF9hZGRyX2xpc3QpIHsKKwkJY250ICsrOworCX0KKworCXJldHVybiBjbnQ7Cit9CisKK3N0YXRpYyBpbnQgc2N0cF9nZXRzb2Nrb3B0X3BlZXJfYWRkcnMoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuLAorCQkJCSAgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKK3sKKwlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJaW50IGNudCA9IDA7CisJc3RydWN0IHNjdHBfZ2V0YWRkcnMgZ2V0YWRkcnM7CisJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpmcm9tOworCXZvaWQgX191c2VyICp0bzsKKwl1bmlvbiBzY3RwX2FkZHIgdGVtcDsKKwlzdHJ1Y3Qgc2N0cF9zb2NrICpzcCA9IHNjdHBfc2soc2spOworCWludCBhZGRybGVuOworCisJaWYgKGxlbiAhPSBzaXplb2Yoc3RydWN0IHNjdHBfZ2V0YWRkcnMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZ2V0YWRkcnMsIG9wdHZhbCwgc2l6ZW9mKHN0cnVjdCBzY3RwX2dldGFkZHJzKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGdldGFkZHJzLmFkZHJfbnVtIDw9IDApIHJldHVybiAtRUlOVkFMOworCisJLyogRm9yIFVEUC1zdHlsZSBzb2NrZXRzLCBpZCBzcGVjaWZpZXMgdGhlIGFzc29jaWF0aW9uIHRvIHF1ZXJ5LiAgKi8KKwlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgZ2V0YWRkcnMuYXNzb2NfaWQpOworCWlmICghYXNvYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0byA9ICh2b2lkIF9fdXNlciAqKWdldGFkZHJzLmFkZHJzOworCWxpc3RfZm9yX2VhY2gocG9zLCAmYXNvYy0+cGVlci50cmFuc3BvcnRfYWRkcl9saXN0KSB7CisJCWZyb20gPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHNjdHBfdHJhbnNwb3J0LCB0cmFuc3BvcnRzKTsKKwkJbWVtY3B5KCZ0ZW1wLCAmZnJvbS0+aXBhZGRyLCBzaXplb2YodGVtcCkpOworCQlzY3RwX2dldF9wZl9zcGVjaWZpYyhzay0+c2tfZmFtaWx5KS0+YWRkcl92NG1hcChzcCwgJnRlbXApOworCQlhZGRybGVuID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoc2stPnNrX2ZhbWlseSktPnNvY2thZGRyX2xlbjsKKwkJdGVtcC52NC5zaW5fcG9ydCA9IGh0b25zKHRlbXAudjQuc2luX3BvcnQpOworCQlpZiAoY29weV90b191c2VyKHRvLCAmdGVtcCwgYWRkcmxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJdG8gKz0gYWRkcmxlbiA7CisJCWNudCArKzsKKwkJaWYgKGNudCA+PSBnZXRhZGRycy5hZGRyX251bSkgYnJlYWs7CisJfQorCWdldGFkZHJzLmFkZHJfbnVtID0gY250OworCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAmZ2V0YWRkcnMsIHNpemVvZihzdHJ1Y3Qgc2N0cF9nZXRhZGRycykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjdHBfZ2V0c29ja29wdF9sb2NhbF9hZGRyc19udW0oc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuLAorCQkJCQkJY2hhciBfX3VzZXIgKm9wdHZhbCwKKwkJCQkJCWludCBfX3VzZXIgKm9wdGxlbikKK3sKKwlzY3RwX2Fzc29jX3QgaWQ7CisJc3RydWN0IHNjdHBfYmluZF9hZGRyICpicDsKKwlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnkgKmFkZHI7CisJcndsb2NrX3QgKmFkZHJfbG9jazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjbnQgPSAwOworCisJaWYgKGxlbiAhPSBzaXplb2Yoc2N0cF9hc3NvY190KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmlkLCBvcHR2YWwsIHNpemVvZihzY3RwX2Fzc29jX3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKgorCSAqICBGb3IgVURQLXN0eWxlIHNvY2tldHMsIGlkIHNwZWNpZmllcyB0aGUgYXNzb2NpYXRpb24gdG8gcXVlcnkuCisJICogIElmIHRoZSBpZCBmaWVsZCBpcyBzZXQgdG8gdGhlIHZhbHVlICcwJyB0aGVuIHRoZSBsb2NhbGx5IGJvdW5kCisJICogIGFkZHJlc3NlcyBhcmUgcmV0dXJuZWQgd2l0aG91dCByZWdhcmQgdG8gYW55IHBhcnRpY3VsYXIKKwkgKiAgYXNzb2NpYXRpb24uCisJICovCisJaWYgKDAgPT0gaWQpIHsKKwkJYnAgPSAmc2N0cF9zayhzayktPmVwLT5iYXNlLmJpbmRfYWRkcjsKKwkJYWRkcl9sb2NrID0gJnNjdHBfc2soc2spLT5lcC0+YmFzZS5hZGRyX2xvY2s7CisJfSBlbHNlIHsKKwkJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIGlkKTsKKwkJaWYgKCFhc29jKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJwID0gJmFzb2MtPmJhc2UuYmluZF9hZGRyOworCQlhZGRyX2xvY2sgPSAmYXNvYy0+YmFzZS5hZGRyX2xvY2s7CisJfQorCisJc2N0cF9yZWFkX2xvY2soYWRkcl9sb2NrKTsKKworCS8qIElmIHRoZSBlbmRwb2ludCBpcyBib3VuZCB0byAwLjAuMC4wIG9yIDo6MCwgY291bnQgdGhlIHZhbGlkCisJICogYWRkcmVzc2VzIGZyb20gdGhlIGdsb2JhbCBsb2NhbCBhZGRyZXNzIGxpc3QuCisJICovCisJaWYgKHNjdHBfbGlzdF9zaW5nbGVfZW50cnkoJmJwLT5hZGRyZXNzX2xpc3QpKSB7CisJCWFkZHIgPSBsaXN0X2VudHJ5KGJwLT5hZGRyZXNzX2xpc3QubmV4dCwKKwkJCQkgIHN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5LCBsaXN0KTsKKwkJaWYgKHNjdHBfaXNfYW55KCZhZGRyLT5hKSkgeworCQkJc2N0cF9zcGluX2xvY2tfaXJxc2F2ZSgmc2N0cF9sb2NhbF9hZGRyX2xvY2ssIGZsYWdzKTsKKwkJCWxpc3RfZm9yX2VhY2gocG9zLCAmc2N0cF9sb2NhbF9hZGRyX2xpc3QpIHsKKwkJCQlhZGRyID0gbGlzdF9lbnRyeShwb3MsCisJCQkJCQkgIHN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5LAorCQkJCQkJICBsaXN0KTsKKwkJCQlpZiAoKFBGX0lORVQgPT0gc2stPnNrX2ZhbWlseSkgJiYgCisJCQkJICAgIChBRl9JTkVUNiA9PSBhZGRyLT5hLnNhLnNhX2ZhbWlseSkpCQorCQkJCQljb250aW51ZTsKKwkJCQljbnQrKzsKKwkJCX0KKwkJCXNjdHBfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2N0cF9sb2NhbF9hZGRyX2xvY2ssCisJCQkJCQkgICAgZmxhZ3MpOworCQl9IGVsc2UgeworCQkJY250ID0gMTsKKwkJfQorCQlnb3RvIGRvbmU7CisJfQorCisJbGlzdF9mb3JfZWFjaChwb3MsICZicC0+YWRkcmVzc19saXN0KSB7CisJCWNudCArKzsKKwl9CisKK2RvbmU6CisJc2N0cF9yZWFkX3VubG9jayhhZGRyX2xvY2spOworCXJldHVybiBjbnQ7Cit9CisKKy8qIEhlbHBlciBmdW5jdGlvbiB0aGF0IGNvcGllcyBsb2NhbCBhZGRyZXNzZXMgdG8gdXNlciBhbmQgcmV0dXJucyB0aGUgbnVtYmVyCisgKiBvZiBhZGRyZXNzZXMgY29waWVkLgorICovCitzdGF0aWMgaW50IHNjdHBfY29weV9sYWRkcnNfdG9fdXNlcihzdHJ1Y3Qgc29jayAqc2ssIF9fdTE2IHBvcnQsIGludCBtYXhfYWRkcnMsCisJCQkJICAgIHZvaWQgX191c2VyICp0bykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnkgKmFkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bmlvbiBzY3RwX2FkZHIgdGVtcDsKKwlpbnQgY250ID0gMDsKKwlpbnQgYWRkcmxlbjsKKworCXNjdHBfc3Bpbl9sb2NrX2lycXNhdmUoJnNjdHBfbG9jYWxfYWRkcl9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaChwb3MsICZzY3RwX2xvY2FsX2FkZHJfbGlzdCkgeworCQlhZGRyID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5LCBsaXN0KTsKKwkJaWYgKChQRl9JTkVUID09IHNrLT5za19mYW1pbHkpICYmIAorCQkgICAgKEFGX0lORVQ2ID09IGFkZHItPmEuc2Euc2FfZmFtaWx5KSkKKwkJCWNvbnRpbnVlOworCQltZW1jcHkoJnRlbXAsICZhZGRyLT5hLCBzaXplb2YodGVtcCkpOworCQlzY3RwX2dldF9wZl9zcGVjaWZpYyhzay0+c2tfZmFtaWx5KS0+YWRkcl92NG1hcChzY3RwX3NrKHNrKSwKKwkJCQkJCQkJJnRlbXApOworCQlhZGRybGVuID0gc2N0cF9nZXRfYWZfc3BlY2lmaWModGVtcC5zYS5zYV9mYW1pbHkpLT5zb2NrYWRkcl9sZW47CisJCXRlbXAudjQuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKwkJaWYgKGNvcHlfdG9fdXNlcih0bywgJnRlbXAsIGFkZHJsZW4pKSB7CisJCQlzY3RwX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjdHBfbG9jYWxfYWRkcl9sb2NrLAorCQkJCQkJICAgIGZsYWdzKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXRvICs9IGFkZHJsZW47CisJCWNudCArKzsKKwkJaWYgKGNudCA+PSBtYXhfYWRkcnMpIGJyZWFrOworCX0KKwlzY3RwX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjdHBfbG9jYWxfYWRkcl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gY250OworfQorCitzdGF0aWMgaW50IHNjdHBfZ2V0c29ja29wdF9sb2NhbF9hZGRycyhzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4sCisJCQkJICAgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKK3sKKwlzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKmJwOworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwlpbnQgY250ID0gMDsKKwlzdHJ1Y3Qgc2N0cF9nZXRhZGRycyBnZXRhZGRyczsKKwlzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSAqYWRkcjsKKwl2b2lkIF9fdXNlciAqdG87CisJdW5pb24gc2N0cF9hZGRyIHRlbXA7CisJc3RydWN0IHNjdHBfc29jayAqc3AgPSBzY3RwX3NrKHNrKTsKKwlpbnQgYWRkcmxlbjsKKwlyd2xvY2tfdCAqYWRkcl9sb2NrOworCWludCBlcnIgPSAwOworCisJaWYgKGxlbiAhPSBzaXplb2Yoc3RydWN0IHNjdHBfZ2V0YWRkcnMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZ2V0YWRkcnMsIG9wdHZhbCwgc2l6ZW9mKHN0cnVjdCBzY3RwX2dldGFkZHJzKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGdldGFkZHJzLmFkZHJfbnVtIDw9IDApIHJldHVybiAtRUlOVkFMOworCS8qCisJICogIEZvciBVRFAtc3R5bGUgc29ja2V0cywgaWQgc3BlY2lmaWVzIHRoZSBhc3NvY2lhdGlvbiB0byBxdWVyeS4KKwkgKiAgSWYgdGhlIGlkIGZpZWxkIGlzIHNldCB0byB0aGUgdmFsdWUgJzAnIHRoZW4gdGhlIGxvY2FsbHkgYm91bmQKKwkgKiAgYWRkcmVzc2VzIGFyZSByZXR1cm5lZCB3aXRob3V0IHJlZ2FyZCB0byBhbnkgcGFydGljdWxhcgorCSAqICBhc3NvY2lhdGlvbi4KKwkgKi8KKwlpZiAoMCA9PSBnZXRhZGRycy5hc3NvY19pZCkgeworCQlicCA9ICZzY3RwX3NrKHNrKS0+ZXAtPmJhc2UuYmluZF9hZGRyOworCQlhZGRyX2xvY2sgPSAmc2N0cF9zayhzayktPmVwLT5iYXNlLmFkZHJfbG9jazsKKwl9IGVsc2UgeworCQlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgZ2V0YWRkcnMuYXNzb2NfaWQpOworCQlpZiAoIWFzb2MpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnAgPSAmYXNvYy0+YmFzZS5iaW5kX2FkZHI7CisJCWFkZHJfbG9jayA9ICZhc29jLT5iYXNlLmFkZHJfbG9jazsKKwl9CisKKwl0byA9IGdldGFkZHJzLmFkZHJzOworCisJc2N0cF9yZWFkX2xvY2soYWRkcl9sb2NrKTsKKworCS8qIElmIHRoZSBlbmRwb2ludCBpcyBib3VuZCB0byAwLjAuMC4wIG9yIDo6MCwgZ2V0IHRoZSB2YWxpZAorCSAqIGFkZHJlc3NlcyBmcm9tIHRoZSBnbG9iYWwgbG9jYWwgYWRkcmVzcyBsaXN0LgorCSAqLworCWlmIChzY3RwX2xpc3Rfc2luZ2xlX2VudHJ5KCZicC0+YWRkcmVzc19saXN0KSkgeworCQlhZGRyID0gbGlzdF9lbnRyeShicC0+YWRkcmVzc19saXN0Lm5leHQsCisJCQkJICBzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSwgbGlzdCk7CisJCWlmIChzY3RwX2lzX2FueSgmYWRkci0+YSkpIHsKKwkJCWNudCA9IHNjdHBfY29weV9sYWRkcnNfdG9fdXNlcihzaywgYnAtPnBvcnQsCisJCQkJCQkgICAgICAgZ2V0YWRkcnMuYWRkcl9udW0sIHRvKTsKKwkJCWlmIChjbnQgPCAwKSB7CisJCQkJZXJyID0gY250OworCQkJCWdvdG8gdW5sb2NrOworCQkJfQorCQkJZ290byBjb3B5X2dldGFkZHJzOwkJCisJCX0KKwl9CisKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJmJwLT5hZGRyZXNzX2xpc3QpIHsKKwkJYWRkciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSwgbGlzdCk7CisJCW1lbWNweSgmdGVtcCwgJmFkZHItPmEsIHNpemVvZih0ZW1wKSk7CisJCXNjdHBfZ2V0X3BmX3NwZWNpZmljKHNrLT5za19mYW1pbHkpLT5hZGRyX3Y0bWFwKHNwLCAmdGVtcCk7CisJCWFkZHJsZW4gPSBzY3RwX2dldF9hZl9zcGVjaWZpYyh0ZW1wLnNhLnNhX2ZhbWlseSktPnNvY2thZGRyX2xlbjsKKwkJdGVtcC52NC5zaW5fcG9ydCA9IGh0b25zKHRlbXAudjQuc2luX3BvcnQpOworCQlpZiAoY29weV90b191c2VyKHRvLCAmdGVtcCwgYWRkcmxlbikpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIHVubG9jazsKKwkJfQorCQl0byArPSBhZGRybGVuOworCQljbnQgKys7CisJCWlmIChjbnQgPj0gZ2V0YWRkcnMuYWRkcl9udW0pIGJyZWFrOworCX0KKworY29weV9nZXRhZGRyczoKKwlnZXRhZGRycy5hZGRyX251bSA9IGNudDsKKwlpZiAoY29weV90b191c2VyKG9wdHZhbCwgJmdldGFkZHJzLCBzaXplb2Yoc3RydWN0IHNjdHBfZ2V0YWRkcnMpKSkKKwkJZXJyID0gLUVGQVVMVDsKKwordW5sb2NrOgorCXNjdHBfcmVhZF91bmxvY2soYWRkcl9sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiA3LjEuMTAgU2V0IFByaW1hcnkgQWRkcmVzcyAoU0NUUF9QUklNQVJZX0FERFIpCisgKgorICogUmVxdWVzdHMgdGhhdCB0aGUgbG9jYWwgU0NUUCBzdGFjayB1c2UgdGhlIGVuY2xvc2VkIHBlZXIgYWRkcmVzcyBhcworICogdGhlIGFzc29jaWF0aW9uIHByaW1hcnkuICBUaGUgZW5jbG9zZWQgYWRkcmVzcyBtdXN0IGJlIG9uZSBvZiB0aGUKKyAqIGFzc29jaWF0aW9uIHBlZXIncyBhZGRyZXNzZXMuCisgKi8KK3N0YXRpYyBpbnQgc2N0cF9nZXRzb2Nrb3B0X3ByaW1hcnlfYWRkcihzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4sCisJCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKK3sKKwlzdHJ1Y3Qgc2N0cF9wcmltIHByaW07CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CisJc3RydWN0IHNjdHBfc29jayAqc3AgPSBzY3RwX3NrKHNrKTsKKworCWlmIChsZW4gIT0gc2l6ZW9mKHN0cnVjdCBzY3RwX3ByaW0pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcHJpbSwgb3B0dmFsLCBzaXplb2Yoc3RydWN0IHNjdHBfcHJpbSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCBwcmltLnNzcF9hc3NvY19pZCk7CisJaWYgKCFhc29jKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghYXNvYy0+cGVlci5wcmltYXJ5X3BhdGgpCisJCXJldHVybiAtRU5PVENPTk47CisJCisJYXNvYy0+cGVlci5wcmltYXJ5X3BhdGgtPmlwYWRkci52NC5zaW5fcG9ydCA9CisJCWh0b25zKGFzb2MtPnBlZXIucHJpbWFyeV9wYXRoLT5pcGFkZHIudjQuc2luX3BvcnQpOworCW1lbWNweSgmcHJpbS5zc3BfYWRkciwgJmFzb2MtPnBlZXIucHJpbWFyeV9wYXRoLT5pcGFkZHIsCisJICAgICAgIHNpemVvZih1bmlvbiBzY3RwX2FkZHIpKTsKKwlhc29jLT5wZWVyLnByaW1hcnlfcGF0aC0+aXBhZGRyLnY0LnNpbl9wb3J0ID0KKwkJbnRvaHMoYXNvYy0+cGVlci5wcmltYXJ5X3BhdGgtPmlwYWRkci52NC5zaW5fcG9ydCk7CisKKwlzY3RwX2dldF9wZl9zcGVjaWZpYyhzay0+c2tfZmFtaWx5KS0+YWRkcl92NG1hcChzcCwKKwkJCSh1bmlvbiBzY3RwX2FkZHIgKikmcHJpbS5zc3BfYWRkcik7CisKKwlpZiAoY29weV90b191c2VyKG9wdHZhbCwgJnByaW0sIHNpemVvZihzdHJ1Y3Qgc2N0cF9wcmltKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiA3LjEuMTEgIFNldCBBZGFwdGlvbiBMYXllciBJbmRpY2F0b3IgKFNDVFBfQURBUFRJT05fTEFZRVIpCisgKgorICogUmVxdWVzdHMgdGhhdCB0aGUgbG9jYWwgZW5kcG9pbnQgc2V0IHRoZSBzcGVjaWZpZWQgQWRhcHRpb24gTGF5ZXIKKyAqIEluZGljYXRpb24gcGFyYW1ldGVyIGZvciBhbGwgZnV0dXJlIElOSVQgYW5kIElOSVQtQUNLIGV4Y2hhbmdlcy4KKyAqLworc3RhdGljIGludCBzY3RwX2dldHNvY2tvcHRfYWRhcHRpb25fbGF5ZXIoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuLAorCQkJCSAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoreworCV9fdTMyIHZhbDsKKworCWlmIChsZW4gPCBzaXplb2YoX191MzIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxlbiA9IHNpemVvZihfX3UzMik7CisJdmFsID0gc2N0cF9zayhzayktPmFkYXB0aW9uX2luZDsKKwlpZiAocHV0X3VzZXIobGVuLCBvcHRsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoY29weV90b191c2VyKG9wdHZhbCwgJnZhbCwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKgorICogNy4xLjE0IFNldCBkZWZhdWx0IHNlbmQgcGFyYW1ldGVycyAoU0NUUF9ERUZBVUxUX1NFTkRfUEFSQU0pCisgKgorICogICBBcHBsaWNhdGlvbnMgdGhhdCB3aXNoIHRvIHVzZSB0aGUgc2VuZHRvKCkgc3lzdGVtIGNhbGwgbWF5IHdpc2ggdG8KKyAqICAgc3BlY2lmeSBhIGRlZmF1bHQgc2V0IG9mIHBhcmFtZXRlcnMgdGhhdCB3b3VsZCBub3JtYWxseSBiZSBzdXBwbGllZAorICogICB0aHJvdWdoIHRoZSBpbmNsdXNpb24gb2YgYW5jaWxsYXJ5IGRhdGEuICBUaGlzIHNvY2tldCBvcHRpb24gYWxsb3dzCisgKiAgIHN1Y2ggYW4gYXBwbGljYXRpb24gdG8gc2V0IHRoZSBkZWZhdWx0IHNjdHBfc25kcmN2aW5mbyBzdHJ1Y3R1cmUuCisKKworICogICBUaGUgYXBwbGljYXRpb24gdGhhdCB3aXNoZXMgdG8gdXNlIHRoaXMgc29ja2V0IG9wdGlvbiBzaW1wbHkgcGFzc2VzCisgKiAgIGluIHRvIHRoaXMgY2FsbCB0aGUgc2N0cF9zbmRyY3ZpbmZvIHN0cnVjdHVyZSBkZWZpbmVkIGluIFNlY3Rpb24KKyAqICAgNS4yLjIpIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIGFjY2VwdGVkIGJ5IHRoaXMgY2FsbCBpbmNsdWRlCisgKiAgIHNpbmZvX3N0cmVhbSwgc2luZm9fZmxhZ3MsIHNpbmZvX3BwaWQsIHNpbmZvX2NvbnRleHQsCisgKiAgIHNpbmZvX3RpbWV0b2xpdmUuICBUaGUgdXNlciBtdXN0IHByb3ZpZGUgdGhlIHNpbmZvX2Fzc29jX2lkIGZpZWxkIGluCisgKiAgIHRvIHRoaXMgY2FsbCBpZiB0aGUgY2FsbGVyIGlzIHVzaW5nIHRoZSBVRFAgbW9kZWwuCisgKgorICogICBGb3IgZ2V0c29ja29wdCwgaXQgZ2V0IHRoZSBkZWZhdWx0IHNjdHBfc25kcmN2aW5mbyBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyBpbnQgc2N0cF9nZXRzb2Nrb3B0X2RlZmF1bHRfc2VuZF9wYXJhbShzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCWludCBsZW4sIGNoYXIgX191c2VyICpvcHR2YWwsCisJCQkJCWludCBfX3VzZXIgKm9wdGxlbikKK3sKKwlzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvIGluZm87CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CisJc3RydWN0IHNjdHBfc29jayAqc3AgPSBzY3RwX3NrKHNrKTsKKworCWlmIChsZW4gIT0gc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIG9wdHZhbCwgc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgaW5mby5zaW5mb19hc3NvY19pZCk7CisJaWYgKCFhc29jICYmIGluZm8uc2luZm9fYXNzb2NfaWQgJiYgc2N0cF9zdHlsZShzaywgVURQKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYXNvYykgeworCQlpbmZvLnNpbmZvX3N0cmVhbSA9IGFzb2MtPmRlZmF1bHRfc3RyZWFtOworCQlpbmZvLnNpbmZvX2ZsYWdzID0gYXNvYy0+ZGVmYXVsdF9mbGFnczsKKwkJaW5mby5zaW5mb19wcGlkID0gYXNvYy0+ZGVmYXVsdF9wcGlkOworCQlpbmZvLnNpbmZvX2NvbnRleHQgPSBhc29jLT5kZWZhdWx0X2NvbnRleHQ7CisJCWluZm8uc2luZm9fdGltZXRvbGl2ZSA9IGFzb2MtPmRlZmF1bHRfdGltZXRvbGl2ZTsKKwl9IGVsc2UgeworCQlpbmZvLnNpbmZvX3N0cmVhbSA9IHNwLT5kZWZhdWx0X3N0cmVhbTsKKwkJaW5mby5zaW5mb19mbGFncyA9IHNwLT5kZWZhdWx0X2ZsYWdzOworCQlpbmZvLnNpbmZvX3BwaWQgPSBzcC0+ZGVmYXVsdF9wcGlkOworCQlpbmZvLnNpbmZvX2NvbnRleHQgPSBzcC0+ZGVmYXVsdF9jb250ZXh0OworCQlpbmZvLnNpbmZvX3RpbWV0b2xpdmUgPSBzcC0+ZGVmYXVsdF90aW1ldG9saXZlOworCX0KKworCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAmaW5mbywgc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCisgKiA3LjEuNSBTQ1RQX05PREVMQVkKKyAqCisgKiBUdXJuIG9uL29mZiBhbnkgTmFnbGUtbGlrZSBhbGdvcml0aG0uICBUaGlzIG1lYW5zIHRoYXQgcGFja2V0cyBhcmUKKyAqIGdlbmVyYWxseSBzZW50IGFzIHNvb24gYXMgcG9zc2libGUgYW5kIG5vIHVubmVjZXNzYXJ5IGRlbGF5cyBhcmUKKyAqIGludHJvZHVjZWQsIGF0IHRoZSBjb3N0IG9mIG1vcmUgcGFja2V0cyBpbiB0aGUgbmV0d29yay4gIEV4cGVjdHMgYW4KKyAqIGludGVnZXIgYm9vbGVhbiBmbGFnLgorICovCisKK3N0YXRpYyBpbnQgc2N0cF9nZXRzb2Nrb3B0X25vZGVsYXkoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuLAorCQkJCSAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKK3sKKwlpbnQgdmFsOworCisJaWYgKGxlbiA8IHNpemVvZihpbnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxlbiA9IHNpemVvZihpbnQpOworCXZhbCA9IChzY3RwX3NrKHNrKS0+bm9kZWxheSA9PSAxKTsKKwlpZiAocHV0X3VzZXIobGVuLCBvcHRsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoY29weV90b191c2VyKG9wdHZhbCwgJnZhbCwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKgorICogNy4xLjEgU0NUUF9SVE9JTkZPCisgKgorICogVGhlIHByb3RvY29sIHBhcmFtZXRlcnMgdXNlZCB0byBpbml0aWFsaXplIGFuZCBib3VuZCByZXRyYW5zbWlzc2lvbgorICogdGltZW91dCAoUlRPKSBhcmUgdHVuYWJsZS4gc2N0cF9ydG9pbmZvIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGFjY2VzcworICogYW5kIG1vZGlmeSB0aGVzZSBwYXJhbWV0ZXJzLgorICogQWxsIHBhcmFtZXRlcnMgYXJlIHRpbWUgdmFsdWVzLCBpbiBtaWxsaXNlY29uZHMuICBBIHZhbHVlIG9mIDAsIHdoZW4KKyAqIG1vZGlmeWluZyB0aGUgcGFyYW1ldGVycywgaW5kaWNhdGVzIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWUgc2hvdWxkIG5vdAorICogYmUgY2hhbmdlZC4KKyAqCisgKi8KK3N0YXRpYyBpbnQgc2N0cF9nZXRzb2Nrb3B0X3J0b2luZm8oc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuLAorCQkJCWNoYXIgX191c2VyICpvcHR2YWwsCisJCQkJaW50IF9fdXNlciAqb3B0bGVuKSB7CisJc3RydWN0IHNjdHBfcnRvaW5mbyBydG9pbmZvOworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOworCisJaWYgKGxlbiAhPSBzaXplb2YgKHN0cnVjdCBzY3RwX3J0b2luZm8pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcnRvaW5mbywgb3B0dmFsLCBzaXplb2YgKHN0cnVjdCBzY3RwX3J0b2luZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgcnRvaW5mby5zcnRvX2Fzc29jX2lkKTsKKworCWlmICghYXNvYyAmJiBydG9pbmZvLnNydG9fYXNzb2NfaWQgJiYgc2N0cF9zdHlsZShzaywgVURQKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBWYWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWMgYXNzb2NpYXRpb24uICovCisJaWYgKGFzb2MpIHsKKwkJcnRvaW5mby5zcnRvX2luaXRpYWwgPSBqaWZmaWVzX3RvX21zZWNzKGFzb2MtPnJ0b19pbml0aWFsKTsKKwkJcnRvaW5mby5zcnRvX21heCA9IGppZmZpZXNfdG9fbXNlY3MoYXNvYy0+cnRvX21heCk7CisJCXJ0b2luZm8uc3J0b19taW4gPSBqaWZmaWVzX3RvX21zZWNzKGFzb2MtPnJ0b19taW4pOworCX0gZWxzZSB7CisJCS8qIFZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmRwb2ludC4gKi8KKwkJc3RydWN0IHNjdHBfc29jayAqc3AgPSBzY3RwX3NrKHNrKTsKKworCQlydG9pbmZvLnNydG9faW5pdGlhbCA9IHNwLT5ydG9pbmZvLnNydG9faW5pdGlhbDsKKwkJcnRvaW5mby5zcnRvX21heCA9IHNwLT5ydG9pbmZvLnNydG9fbWF4OworCQlydG9pbmZvLnNydG9fbWluID0gc3AtPnJ0b2luZm8uc3J0b19taW47CisJfQorCisJaWYgKHB1dF91c2VyKGxlbiwgb3B0bGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY29weV90b191c2VyKG9wdHZhbCwgJnJ0b2luZm8sIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKgorICogNy4xLjIgU0NUUF9BU1NPQ0lORk8KKyAqCisgKiBUaGlzIG9wdGlvbiBpcyB1c2VkIHRvIHR1bmUgdGhlIHRoZSBtYXhpbXVtIHJldHJhbnNtaXNzaW9uIGF0dGVtcHRzCisgKiBvZiB0aGUgYXNzb2NpYXRpb24uCisgKiBSZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBuZXcgYXNzb2NpYXRpb24gcmV0cmFuc21pc3Npb24gdmFsdWUgaXMKKyAqIGdyZWF0ZXIgdGhhbiB0aGUgc3VtIG9mIHRoZSByZXRyYW5zbWlzc2lvbiB2YWx1ZSAgb2YgdGhlIHBlZXIuCisgKiBTZWUgW1NDVFBdIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqLworc3RhdGljIGludCBzY3RwX2dldHNvY2tvcHRfYXNzb2NpbmZvKHN0cnVjdCBzb2NrICpzaywgaW50IGxlbiwKKwkJCQkgICAgIGNoYXIgX191c2VyICpvcHR2YWwsCisJCQkJICAgICBpbnQgX191c2VyICpvcHRsZW4pCit7CisKKwlzdHJ1Y3Qgc2N0cF9hc3NvY3BhcmFtcyBhc3NvY3BhcmFtczsKKwlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJaW50IGNudCA9IDA7CisKKwlpZiAobGVuICE9IHNpemVvZiAoc3RydWN0IHNjdHBfYXNzb2NwYXJhbXMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmYXNzb2NwYXJhbXMsIG9wdHZhbCwKKwkJCXNpemVvZiAoc3RydWN0IHNjdHBfYXNzb2NwYXJhbXMpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgYXNzb2NwYXJhbXMuc2Fzb2NfYXNzb2NfaWQpOworCisJaWYgKCFhc29jICYmIGFzc29jcGFyYW1zLnNhc29jX2Fzc29jX2lkICYmIHNjdHBfc3R5bGUoc2ssIFVEUCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVmFsdWVzIGNvcnJlc3BvaW5kaW5nIHRvIHRoZSBzcGVjaWZpYyBhc3NvY2lhdGlvbiAqLworCWlmIChhc3NvY3BhcmFtcy5zYXNvY19hc3NvY19pZCAhPSAwKSB7CisJCWFzc29jcGFyYW1zLnNhc29jX2Fzb2NtYXhyeHQgPSBhc29jLT5tYXhfcmV0cmFuczsKKwkJYXNzb2NwYXJhbXMuc2Fzb2NfcGVlcl9yd25kID0gYXNvYy0+cGVlci5yd25kOworCQlhc3NvY3BhcmFtcy5zYXNvY19sb2NhbF9yd25kID0gYXNvYy0+YV9yd25kOworCQlhc3NvY3BhcmFtcy5zYXNvY19jb29raWVfbGlmZSA9IChhc29jLT5jb29raWVfbGlmZS50dl9zZWMKKwkJCQkJCSogMTAwMCkgKworCQkJCQkJKGFzb2MtPmNvb2tpZV9saWZlLnR2X3VzZWMKKwkJCQkJCS8gMTAwMCk7CisKKwkJbGlzdF9mb3JfZWFjaChwb3MsICZhc29jLT5wZWVyLnRyYW5zcG9ydF9hZGRyX2xpc3QpIHsKKwkJCWNudCArKzsKKwkJfQorCisJCWFzc29jcGFyYW1zLnNhc29jX251bWJlcl9wZWVyX2Rlc3RpbmF0aW9ucyA9IGNudDsKKwl9IGVsc2UgeworCQkvKiBWYWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kcG9pbnQgKi8KKwkJc3RydWN0IHNjdHBfc29jayAqc3AgPSBzY3RwX3NrKHNrKTsKKworCQlhc3NvY3BhcmFtcy5zYXNvY19hc29jbWF4cnh0ID0gc3AtPmFzc29jcGFyYW1zLnNhc29jX2Fzb2NtYXhyeHQ7CisJCWFzc29jcGFyYW1zLnNhc29jX3BlZXJfcnduZCA9IHNwLT5hc3NvY3BhcmFtcy5zYXNvY19wZWVyX3J3bmQ7CisJCWFzc29jcGFyYW1zLnNhc29jX2xvY2FsX3J3bmQgPSBzcC0+YXNzb2NwYXJhbXMuc2Fzb2NfbG9jYWxfcnduZDsKKwkJYXNzb2NwYXJhbXMuc2Fzb2NfY29va2llX2xpZmUgPQorCQkJCQlzcC0+YXNzb2NwYXJhbXMuc2Fzb2NfY29va2llX2xpZmU7CisJCWFzc29jcGFyYW1zLnNhc29jX251bWJlcl9wZWVyX2Rlc3RpbmF0aW9ucyA9CisJCQkJCXNwLT5hc3NvY3BhcmFtcy4KKwkJCQkJc2Fzb2NfbnVtYmVyX3BlZXJfZGVzdGluYXRpb25zOworCX0KKworCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsICZhc3NvY3BhcmFtcywgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIDcuMS4xNiBTZXQvY2xlYXIgSVB2NCBtYXBwZWQgYWRkcmVzc2VzIChTQ1RQX0lfV0FOVF9NQVBQRURfVjRfQUREUikKKyAqCisgKiBUaGlzIHNvY2tldCBvcHRpb24gaXMgYSBib29sZWFuIGZsYWcgd2hpY2ggdHVybnMgb24gb3Igb2ZmIG1hcHBlZCBWNAorICogYWRkcmVzc2VzLiAgSWYgdGhpcyBvcHRpb24gaXMgdHVybmVkIG9uIGFuZCB0aGUgc29ja2V0IGlzIHR5cGUKKyAqIFBGX0lORVQ2LCB0aGVuIElQdjQgYWRkcmVzc2VzIHdpbGwgYmUgbWFwcGVkIHRvIFY2IHJlcHJlc2VudGF0aW9uLgorICogSWYgdGhpcyBvcHRpb24gaXMgdHVybmVkIG9mZiwgdGhlbiBubyBtYXBwaW5nIHdpbGwgYmUgZG9uZSBvZiBWNAorICogYWRkcmVzc2VzIGFuZCBhIHVzZXIgd2lsbCByZWNlaXZlIGJvdGggUEZfSU5FVDYgYW5kIFBGX0lORVQgdHlwZQorICogYWRkcmVzc2VzIG9uIHRoZSBzb2NrZXQuCisgKi8KK3N0YXRpYyBpbnQgc2N0cF9nZXRzb2Nrb3B0X21hcHBlZHY0KHN0cnVjdCBzb2NrICpzaywgaW50IGxlbiwKKwkJCQkgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoreworCWludCB2YWw7CisJc3RydWN0IHNjdHBfc29jayAqc3AgPSBzY3RwX3NrKHNrKTsKKworCWlmIChsZW4gPCBzaXplb2YoaW50KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsZW4gPSBzaXplb2YoaW50KTsKKwl2YWwgPSBzcC0+djRtYXBwZWQ7CisJaWYgKHB1dF91c2VyKGxlbiwgb3B0bGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsICZ2YWwsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiA3LjEuMTcgU2V0IHRoZSBtYXhpbXVtIGZyYWdybWVudGF0aW9uIHNpemUgKFNDVFBfTUFYU0VHKQorICoKKyAqIFRoaXMgc29ja2V0IG9wdGlvbiBzcGVjaWZpZXMgdGhlIG1heGltdW0gc2l6ZSB0byBwdXQgaW4gYW55IG91dGdvaW5nCisgKiBTQ1RQIGNodW5rLiAgSWYgYSBtZXNzYWdlIGlzIGxhcmdlciB0aGFuIHRoaXMgc2l6ZSBpdCB3aWxsIGJlCisgKiBmcmFnbWVudGVkIGJ5IFNDVFAgaW50byB0aGUgc3BlY2lmaWVkIHNpemUuICBOb3RlIHRoYXQgdGhlIHVuZGVybHlpbmcKKyAqIFNDVFAgaW1wbGVtZW50YXRpb24gbWF5IGZyYWdtZW50IGludG8gc21hbGxlciBzaXplZCBjaHVua3Mgd2hlbiB0aGUKKyAqIFBNVFUgb2YgdGhlIHVuZGVybHlpbmcgYXNzb2NpYXRpb24gaXMgc21hbGxlciB0aGFuIHRoZSB2YWx1ZSBzZXQgYnkKKyAqIHRoZSB1c2VyLgorICovCitzdGF0aWMgaW50IHNjdHBfZ2V0c29ja29wdF9tYXhzZWcoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuLAorCQkJCSAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoreworCWludCB2YWw7CisKKwlpZiAobGVuIDwgc2l6ZW9mKGludCkpCisJCXJldHVybiAtRUlOVkFMOworCisJbGVuID0gc2l6ZW9mKGludCk7CisKKwl2YWwgPSBzY3RwX3NrKHNrKS0+dXNlcl9mcmFnOworCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAmdmFsLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitTQ1RQX1NUQVRJQyBpbnQgc2N0cF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJCQljaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCit7CisJaW50IHJldHZhbCA9IDA7CisJaW50IGxlbjsKKworCVNDVFBfREVCVUdfUFJJTlRLKCJzY3RwX2dldHNvY2tvcHQoc2s6ICVwLCAuLi4pXG4iLCBzayk7CisKKwkvKiBJIGNhbiBoYXJkbHkgYmVnaW4gdG8gZGVzY3JpYmUgaG93IHdyb25nIHRoaXMgaXMuICBUaGlzIGlzCisJICogc28gYnJva2VuIGFzIHRvIGJlIHdvcnNlIHRoYW4gdXNlbGVzcy4gIFRoZSBBUEkgZHJhZnQKKwkgKiBSRUFMTFkgaXMgTk9UIGhlbHBmdWwgaGVyZS4uLiAgSSBhbSBub3QgY29udmluY2VkIHRoYXQgdGhlCisJICogc2VtYW50aWNzIG9mIGdldHNvY2tvcHQoKSB3aXRoIGEgbGV2ZWwgT1RIRVIgVEhBTiBTT0xfU0NUUAorCSAqIGFyZSBhdCBhbGwgd2VsbC1mb3VuZGVkLgorCSAqLworCWlmIChsZXZlbCAhPSBTT0xfU0NUUCkgeworCQlzdHJ1Y3Qgc2N0cF9hZiAqYWYgPSBzY3RwX3NrKHNrKS0+cGYtPmFmOworCisJCXJldHZhbCA9IGFmLT5nZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWlmIChnZXRfdXNlcihsZW4sIG9wdGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJc2N0cF9sb2NrX3NvY2soc2spOworCisJc3dpdGNoIChvcHRuYW1lKSB7CisJY2FzZSBTQ1RQX1NUQVRVUzoKKwkJcmV0dmFsID0gc2N0cF9nZXRzb2Nrb3B0X3NjdHBfc3RhdHVzKHNrLCBsZW4sIG9wdHZhbCwgb3B0bGVuKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1RQX0RJU0FCTEVfRlJBR01FTlRTOgorCQlyZXR2YWwgPSBzY3RwX2dldHNvY2tvcHRfZGlzYWJsZV9mcmFnbWVudHMoc2ssIGxlbiwgb3B0dmFsLAorCQkJCQkJCSAgIG9wdGxlbik7CisJCWJyZWFrOworCWNhc2UgU0NUUF9FVkVOVFM6CisJCXJldHZhbCA9IHNjdHBfZ2V0c29ja29wdF9ldmVudHMoc2ssIGxlbiwgb3B0dmFsLCBvcHRsZW4pOworCQlicmVhazsKKwljYXNlIFNDVFBfQVVUT0NMT1NFOgorCQlyZXR2YWwgPSBzY3RwX2dldHNvY2tvcHRfYXV0b2Nsb3NlKHNrLCBsZW4sIG9wdHZhbCwgb3B0bGVuKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1RQX1NPQ0tPUFRfUEVFTE9GRjoKKwkJcmV0dmFsID0gc2N0cF9nZXRzb2Nrb3B0X3BlZWxvZmYoc2ssIGxlbiwgb3B0dmFsLCBvcHRsZW4pOworCQlicmVhazsKKwljYXNlIFNDVFBfUEVFUl9BRERSX1BBUkFNUzoKKwkJcmV0dmFsID0gc2N0cF9nZXRzb2Nrb3B0X3BlZXJfYWRkcl9wYXJhbXMoc2ssIGxlbiwgb3B0dmFsLAorCQkJCQkJCSAgb3B0bGVuKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1RQX0lOSVRNU0c6CisJCXJldHZhbCA9IHNjdHBfZ2V0c29ja29wdF9pbml0bXNnKHNrLCBsZW4sIG9wdHZhbCwgb3B0bGVuKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1RQX0dFVF9QRUVSX0FERFJTX05VTToKKwkJcmV0dmFsID0gc2N0cF9nZXRzb2Nrb3B0X3BlZXJfYWRkcnNfbnVtKHNrLCBsZW4sIG9wdHZhbCwKKwkJCQkJCQlvcHRsZW4pOworCQlicmVhazsKKwljYXNlIFNDVFBfR0VUX0xPQ0FMX0FERFJTX05VTToKKwkJcmV0dmFsID0gc2N0cF9nZXRzb2Nrb3B0X2xvY2FsX2FkZHJzX251bShzaywgbGVuLCBvcHR2YWwsCisJCQkJCQkJIG9wdGxlbik7CisJCWJyZWFrOworCWNhc2UgU0NUUF9HRVRfUEVFUl9BRERSUzoKKwkJcmV0dmFsID0gc2N0cF9nZXRzb2Nrb3B0X3BlZXJfYWRkcnMoc2ssIGxlbiwgb3B0dmFsLAorCQkJCQkJICAgIG9wdGxlbik7CisJCWJyZWFrOworCWNhc2UgU0NUUF9HRVRfTE9DQUxfQUREUlM6CisJCXJldHZhbCA9IHNjdHBfZ2V0c29ja29wdF9sb2NhbF9hZGRycyhzaywgbGVuLCBvcHR2YWwsCisJCQkJCQkgICAgIG9wdGxlbik7CisJCWJyZWFrOworCWNhc2UgU0NUUF9ERUZBVUxUX1NFTkRfUEFSQU06CisJCXJldHZhbCA9IHNjdHBfZ2V0c29ja29wdF9kZWZhdWx0X3NlbmRfcGFyYW0oc2ssIGxlbiwKKwkJCQkJCQkgICAgb3B0dmFsLCBvcHRsZW4pOworCQlicmVhazsKKwljYXNlIFNDVFBfUFJJTUFSWV9BRERSOgorCQlyZXR2YWwgPSBzY3RwX2dldHNvY2tvcHRfcHJpbWFyeV9hZGRyKHNrLCBsZW4sIG9wdHZhbCwgb3B0bGVuKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1RQX05PREVMQVk6CisJCXJldHZhbCA9IHNjdHBfZ2V0c29ja29wdF9ub2RlbGF5KHNrLCBsZW4sIG9wdHZhbCwgb3B0bGVuKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1RQX1JUT0lORk86CisJCXJldHZhbCA9IHNjdHBfZ2V0c29ja29wdF9ydG9pbmZvKHNrLCBsZW4sIG9wdHZhbCwgb3B0bGVuKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1RQX0FTU09DSU5GTzoKKwkJcmV0dmFsID0gc2N0cF9nZXRzb2Nrb3B0X2Fzc29jaW5mbyhzaywgbGVuLCBvcHR2YWwsIG9wdGxlbik7CisJCWJyZWFrOworCWNhc2UgU0NUUF9JX1dBTlRfTUFQUEVEX1Y0X0FERFI6CisJCXJldHZhbCA9IHNjdHBfZ2V0c29ja29wdF9tYXBwZWR2NChzaywgbGVuLCBvcHR2YWwsIG9wdGxlbik7CisJCWJyZWFrOworCWNhc2UgU0NUUF9NQVhTRUc6CisJCXJldHZhbCA9IHNjdHBfZ2V0c29ja29wdF9tYXhzZWcoc2ssIGxlbiwgb3B0dmFsLCBvcHRsZW4pOworCQlicmVhazsKKwljYXNlIFNDVFBfR0VUX1BFRVJfQUREUl9JTkZPOgorCQlyZXR2YWwgPSBzY3RwX2dldHNvY2tvcHRfcGVlcl9hZGRyX2luZm8oc2ssIGxlbiwgb3B0dmFsLAorCQkJCQkJCW9wdGxlbik7CisJCWJyZWFrOworCWNhc2UgU0NUUF9BREFQVElPTl9MQVlFUjoKKwkJcmV0dmFsID0gc2N0cF9nZXRzb2Nrb3B0X2FkYXB0aW9uX2xheWVyKHNrLCBsZW4sIG9wdHZhbCwKKwkJCQkJCQlvcHRsZW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR2YWwgPSAtRU5PUFJPVE9PUFQ7CisJCWJyZWFrOworCX07CisKKwlzY3RwX3JlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgc2N0cF9oYXNoKHN0cnVjdCBzb2NrICpzaykKK3sKKwkvKiBTVFVCICovCit9CisKK3N0YXRpYyB2b2lkIHNjdHBfdW5oYXNoKHN0cnVjdCBzb2NrICpzaykKK3sKKwkvKiBTVFVCICovCit9CisKKy8qIENoZWNrIGlmIHBvcnQgaXMgYWNjZXB0YWJsZS4gIFBvc3NpYmx5IGZpbmQgZmlyc3QgYXZhaWxhYmxlIHBvcnQuCisgKgorICogVGhlIHBvcnQgaGFzaCB0YWJsZSAoY29udGFpbmVkIGluIHRoZSAnZ2xvYmFsJyBTQ1RQIHByb3RvY29sIHN0b3JhZ2UKKyAqIHJldHVybmVkIGJ5IHN0cnVjdCBzY3RwX3Byb3RvY29sICpzY3RwX2dldF9wcm90b2NvbCgpKS4gVGhlIGhhc2gKKyAqIHRhYmxlIGlzIGFuIGFycmF5IG9mIDQwOTYgbGlzdHMgKHNjdHBfYmluZF9oYXNoYnVja2V0KS4gRWFjaAorICogbGlzdCAodGhlIGxpc3QgbnVtYmVyIGlzIHRoZSBwb3J0IG51bWJlciBoYXNoZWQgb3V0LCBzbyBhcyB5b3UKKyAqIHdvdWxkIGV4cGVjdCBmcm9tIGEgaGFzaCBmdW5jdGlvbiwgYWxsIHRoZSBwb3J0cyBpbiBhIGdpdmVuIGxpc3QgaGF2ZQorICogc3VjaCBhIG51bWJlciB0aGF0IGhhc2hlcyBvdXQgdG8gdGhlIHNhbWUgbGlzdCBudW1iZXI7IHlvdSB3ZXJlCisgKiBleHBlY3RpbmcgdGhhdCwgcmlnaHQ/KTsgc28gZWFjaCBsaXN0IGhhcyBhIHNldCBvZiBwb3J0cywgd2l0aCBhCisgKiBsaW5rIHRvIHRoZSBzb2NrZXQgKHN0cnVjdCBzb2NrKSB0aGF0IHVzZXMgaXQsIHRoZSBwb3J0IG51bWJlciBhbmQKKyAqIGEgZmFzdHJldXNlIGZsYWcgKEZJWE1FOiBOUEkgaXBnKS4KKyAqLworc3RhdGljIHN0cnVjdCBzY3RwX2JpbmRfYnVja2V0ICpzY3RwX2J1Y2tldF9jcmVhdGUoCisJc3RydWN0IHNjdHBfYmluZF9oYXNoYnVja2V0ICpoZWFkLCB1bnNpZ25lZCBzaG9ydCBzbnVtKTsKKworc3RhdGljIGxvbmcgc2N0cF9nZXRfcG9ydF9sb2NhbChzdHJ1Y3Qgc29jayAqc2ssIHVuaW9uIHNjdHBfYWRkciAqYWRkcikKK3sKKwlzdHJ1Y3Qgc2N0cF9iaW5kX2hhc2hidWNrZXQgKmhlYWQ7IC8qIGhhc2ggbGlzdCAqLworCXN0cnVjdCBzY3RwX2JpbmRfYnVja2V0ICpwcDsgLyogaGFzaCBsaXN0IHBvcnQgaXRlcmF0b3IgKi8KKwl1bnNpZ25lZCBzaG9ydCBzbnVtOworCWludCByZXQ7CisKKwkvKiBOT1RFOiAgUmVtZW1iZXIgdG8gcHV0IHRoaXMgYmFjayB0byBuZXQgb3JkZXIuICovCisJYWRkci0+djQuc2luX3BvcnQgPSBudG9ocyhhZGRyLT52NC5zaW5fcG9ydCk7CisJc251bSA9IGFkZHItPnY0LnNpbl9wb3J0OworCisJU0NUUF9ERUJVR19QUklOVEsoInNjdHBfZ2V0X3BvcnQoKSBiZWdpbnMsIHNudW09JWRcbiIsIHNudW0pOworCXNjdHBfbG9jYWxfYmhfZGlzYWJsZSgpOworCisJaWYgKHNudW0gPT0gMCkgeworCQkvKiBTZWFyY2ggZm9yIGFuIGF2YWlsYWJsZSBwb3J0LgorCQkgKgorCQkgKiAnc2N0cF9wb3J0X3JvdmVyJyB3YXMgdGhlIGxhc3QgcG9ydCBhc3NpZ25lZCwgc28KKwkJICogd2Ugc3RhcnQgdG8gc2VhcmNoIGZyb20gJ3NjdHBfcG9ydF9yb3ZlciArCisJCSAqIDEnLiBXaGF0IHdlIGRvIGlzIGZpcnN0IGNoZWNrIGlmIHBvcnQgJ3JvdmVyJyBpcworCQkgKiBhbHJlYWR5IGluIHRoZSBoYXNoIHRhYmxlOyBpZiBub3QsIHdlIHVzZSB0aGF0OyBpZgorCQkgKiBpdCBpcywgd2UgdHJ5IG5leHQuCisJCSAqLworCQlpbnQgbG93ID0gc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMF07CisJCWludCBoaWdoID0gc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMV07CisJCWludCByZW1haW5pbmcgPSAoaGlnaCAtIGxvdykgKyAxOworCQlpbnQgcm92ZXI7CisJCWludCBpbmRleDsKKworCQlzY3RwX3NwaW5fbG9jaygmc2N0cF9wb3J0X2FsbG9jX2xvY2spOworCQlyb3ZlciA9IHNjdHBfcG9ydF9yb3ZlcjsKKwkJZG8geworCQkJcm92ZXIrKzsKKwkJCWlmICgocm92ZXIgPCBsb3cpIHx8IChyb3ZlciA+IGhpZ2gpKQorCQkJCXJvdmVyID0gbG93OworCQkJaW5kZXggPSBzY3RwX3BoYXNoZm4ocm92ZXIpOworCQkJaGVhZCA9ICZzY3RwX3BvcnRfaGFzaHRhYmxlW2luZGV4XTsKKwkJCXNjdHBfc3Bpbl9sb2NrKCZoZWFkLT5sb2NrKTsKKwkJCWZvciAocHAgPSBoZWFkLT5jaGFpbjsgcHA7IHBwID0gcHAtPm5leHQpCisJCQkJaWYgKHBwLT5wb3J0ID09IHJvdmVyKQorCQkJCQlnb3RvIG5leHQ7CisJCQlicmVhazsKKwkJbmV4dDoKKwkJCXNjdHBfc3Bpbl91bmxvY2soJmhlYWQtPmxvY2spOworCQl9IHdoaWxlICgtLXJlbWFpbmluZyA+IDApOworCQlzY3RwX3BvcnRfcm92ZXIgPSByb3ZlcjsKKwkJc2N0cF9zcGluX3VubG9jaygmc2N0cF9wb3J0X2FsbG9jX2xvY2spOworCisJCS8qIEV4aGF1c3RlZCBsb2NhbCBwb3J0IHJhbmdlIGR1cmluZyBzZWFyY2g/ICovCisJCXJldCA9IDE7CisJCWlmIChyZW1haW5pbmcgPD0gMCkKKwkJCWdvdG8gZmFpbDsKKworCQkvKiBPSywgaGVyZSBpcyB0aGUgb25lIHdlIHdpbGwgdXNlLiAgSEVBRCAodGhlIHBvcnQKKwkJICogaGFzaCB0YWJsZSBsaXN0IGVudHJ5KSBpcyBub24tTlVMTCBhbmQgd2UgaG9sZCBpdCdzCisJCSAqIG11dGV4LgorCQkgKi8KKwkJc251bSA9IHJvdmVyOworCX0gZWxzZSB7CisJCS8qIFdlIGFyZSBnaXZlbiBhbiBzcGVjaWZpYyBwb3J0IG51bWJlcjsgd2UgdmVyaWZ5CisJCSAqIHRoYXQgaXQgaXMgbm90IGJlaW5nIHVzZWQuIElmIGl0IGlzIHVzZWQsIHdlIHdpbGwKKwkJICogZXhhaHVzdCB0aGUgc2VhcmNoIGluIHRoZSBoYXNoIGxpc3QgY29ycmVzcG9uZGluZworCQkgKiB0byB0aGUgcG9ydCBudW1iZXIgKHNudW0pIC0gd2UgZGV0ZWN0IHRoYXQgd2l0aCB0aGUKKwkJICogcG9ydCBpdGVyYXRvciwgcHAgYmVpbmcgTlVMTC4KKwkJICovCisJCWhlYWQgPSAmc2N0cF9wb3J0X2hhc2h0YWJsZVtzY3RwX3BoYXNoZm4oc251bSldOworCQlzY3RwX3NwaW5fbG9jaygmaGVhZC0+bG9jayk7CisJCWZvciAocHAgPSBoZWFkLT5jaGFpbjsgcHA7IHBwID0gcHAtPm5leHQpIHsKKwkJCWlmIChwcC0+cG9ydCA9PSBzbnVtKQorCQkJCWdvdG8gcHBfZm91bmQ7CisJCX0KKwl9CisJcHAgPSBOVUxMOworCWdvdG8gcHBfbm90X2ZvdW5kOworcHBfZm91bmQ6CisJaWYgKCFobGlzdF9lbXB0eSgmcHAtPm93bmVyKSkgeworCQkvKiBXZSBoYWQgYSBwb3J0IGhhc2ggdGFibGUgaGl0IC0gdGhlcmUgaXMgYW4KKwkJICogYXZhaWxhYmxlIHBvcnQgKHBwICE9IE5VTEwpIGFuZCBpdCBpcyBiZWluZworCQkgKiB1c2VkIGJ5IG90aGVyIHNvY2tldCAocHAtPm93bmVyIG5vdCBlbXB0eSk7IHRoYXQgb3RoZXIKKwkJICogc29ja2V0IGlzIGdvaW5nIHRvIGJlIHNrMi4KKwkJICovCisJCWludCByZXVzZSA9IHNrLT5za19yZXVzZTsKKwkJc3RydWN0IHNvY2sgKnNrMjsKKwkJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisKKwkJU0NUUF9ERUJVR19QUklOVEsoInNjdHBfZ2V0X3BvcnQoKSBmb3VuZCBhIHBvc3NpYmxlIG1hdGNoXG4iKTsKKwkJaWYgKHBwLT5mYXN0cmV1c2UgJiYgc2stPnNrX3JldXNlKQorCQkJZ290byBzdWNjZXNzOworCisJCS8qIFJ1biB0aHJvdWdoIHRoZSBsaXN0IG9mIHNvY2tldHMgYm91bmQgdG8gdGhlIHBvcnQKKwkJICogKHBwLT5wb3J0KSBbdmlhIHRoZSBwb2ludGVycyBiaW5kX25leHQgYW5kCisJCSAqIGJpbmRfcHByZXYgaW4gdGhlIHN0cnVjdCBzb2NrICpzazIgKHBwLT5zayldLiBPbiBlYWNoIG9uZSwKKwkJICogd2UgZ2V0IHRoZSBlbmRwb2ludCB0aGV5IGRlc2NyaWJlIGFuZCBydW4gdGhyb3VnaAorCQkgKiB0aGUgZW5kcG9pbnQncyBsaXN0IG9mIElQICh2NCBvciB2NikgYWRkcmVzc2VzLAorCQkgKiBjb21wYXJpbmcgZWFjaCBvZiB0aGUgYWRkcmVzc2VzIHdpdGggdGhlIGFkZHJlc3Mgb2YKKwkJICogdGhlIHNvY2tldCBzay4gSWYgd2UgZmluZCBhIG1hdGNoLCB0aGVuIHRoYXQgbWVhbnMKKwkJICogdGhhdCB0aGlzIHBvcnQvc29ja2V0IChzaykgY29tYmluYXRpb24gYXJlIGFscmVhZHkKKwkJICogaW4gYW4gZW5kcG9pbnQuCisJCSAqLworCQlza19mb3JfZWFjaF9ib3VuZChzazIsIG5vZGUsICZwcC0+b3duZXIpIHsKKwkJCXN0cnVjdCBzY3RwX2VuZHBvaW50ICplcDI7CisJCQllcDIgPSBzY3RwX3NrKHNrMiktPmVwOworCisJCQlpZiAocmV1c2UgJiYgc2syLT5za19yZXVzZSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHNjdHBfYmluZF9hZGRyX21hdGNoKCZlcDItPmJhc2UuYmluZF9hZGRyLCBhZGRyLAorCQkJCQkJIHNjdHBfc2soc2spKSkgeworCQkJCXJldCA9IChsb25nKXNrMjsKKwkJCQlnb3RvIGZhaWxfdW5sb2NrOworCQkJfQorCQl9CisJCVNDVFBfREVCVUdfUFJJTlRLKCJzY3RwX2dldF9wb3J0KCk6IEZvdW5kIGEgbWF0Y2hcbiIpOworCX0KK3BwX25vdF9mb3VuZDoKKwkvKiBJZiB0aGVyZSB3YXMgYSBoYXNoIHRhYmxlIG1pc3MsIGNyZWF0ZSBhIG5ldyBwb3J0LiAgKi8KKwlyZXQgPSAxOworCWlmICghcHAgJiYgIShwcCA9IHNjdHBfYnVja2V0X2NyZWF0ZShoZWFkLCBzbnVtKSkpCisJCWdvdG8gZmFpbF91bmxvY2s7CisKKwkvKiBJbiBlaXRoZXIgY2FzZSAoaGl0IG9yIG1pc3MpLCBtYWtlIHN1cmUgZmFzdHJldXNlIGlzIDEgb25seQorCSAqIGlmIHNrLT5za19yZXVzZSBpcyB0b28gKHRoYXQgaXMsIGlmIHRoZSBjYWxsZXIgcmVxdWVzdGVkCisJICogU09fUkVVU0VBRERSIG9uIHRoaXMgc29ja2V0IC1zay0pLgorCSAqLworCWlmIChobGlzdF9lbXB0eSgmcHAtPm93bmVyKSkKKwkJcHAtPmZhc3RyZXVzZSA9IHNrLT5za19yZXVzZSA/IDEgOiAwOworCWVsc2UgaWYgKHBwLT5mYXN0cmV1c2UgJiYgIXNrLT5za19yZXVzZSkKKwkJcHAtPmZhc3RyZXVzZSA9IDA7CisKKwkvKiBXZSBhcmUgc2V0LCBzbyBmaWxsIHVwIGFsbCB0aGUgZGF0YSBpbiB0aGUgaGFzaCB0YWJsZQorCSAqIGVudHJ5LCB0aWUgdGhlIHNvY2tldCBsaXN0IGluZm9ybWF0aW9uIHdpdGggdGhlIHJlc3Qgb2YgdGhlCisJICogc29ja2V0cyBGSVhNRTogQmx1cnJ5LCBOUEkgKGlwZykuCisJICovCitzdWNjZXNzOgorCWluZXRfc2soc2spLT5udW0gPSBzbnVtOworCWlmICghc2N0cF9zayhzayktPmJpbmRfaGFzaCkgeworCQlza19hZGRfYmluZF9ub2RlKHNrLCAmcHAtPm93bmVyKTsKKwkJc2N0cF9zayhzayktPmJpbmRfaGFzaCA9IHBwOworCX0KKwlyZXQgPSAwOworCitmYWlsX3VubG9jazoKKwlzY3RwX3NwaW5fdW5sb2NrKCZoZWFkLT5sb2NrKTsKKworZmFpbDoKKwlzY3RwX2xvY2FsX2JoX2VuYWJsZSgpOworCWFkZHItPnY0LnNpbl9wb3J0ID0gaHRvbnMoYWRkci0+djQuc2luX3BvcnQpOworCXJldHVybiByZXQ7Cit9CisKKy8qIEFzc2lnbiBhICdzbnVtJyBwb3J0IHRvIHRoZSBzb2NrZXQuICBJZiBzbnVtID09IDAsIGFuIGVwaGVtZXJhbAorICogcG9ydCBpcyByZXF1ZXN0ZWQuCisgKi8KK3N0YXRpYyBpbnQgc2N0cF9nZXRfcG9ydChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIHNob3J0IHNudW0pCit7CisJbG9uZyByZXQ7CisJdW5pb24gc2N0cF9hZGRyIGFkZHI7CisJc3RydWN0IHNjdHBfYWYgKmFmID0gc2N0cF9zayhzayktPnBmLT5hZjsKKworCS8qIFNldCB1cCBhIGR1bW15IGFkZHJlc3Mgc3RydWN0IGZyb20gdGhlIHNrLiAqLworCWFmLT5mcm9tX3NrKCZhZGRyLCBzayk7CisJYWRkci52NC5zaW5fcG9ydCA9IGh0b25zKHNudW0pOworCisJLyogTm90ZTogc2stPnNrX251bSBnZXRzIGZpbGxlZCBpbiBpZiBlcGhlbWVyYWwgcG9ydCByZXF1ZXN0LiAqLworCXJldCA9IHNjdHBfZ2V0X3BvcnRfbG9jYWwoc2ssICZhZGRyKTsKKworCXJldHVybiAocmV0ID8gMSA6IDApOworfQorCisvKgorICogMy4xLjMgbGlzdGVuKCkgLSBVRFAgU3R5bGUgU3ludGF4CisgKgorICogICBCeSBkZWZhdWx0LCBuZXcgYXNzb2NpYXRpb25zIGFyZSBub3QgYWNjZXB0ZWQgZm9yIFVEUCBzdHlsZSBzb2NrZXRzLgorICogICBBbiBhcHBsaWNhdGlvbiB1c2VzIGxpc3RlbigpIHRvIG1hcmsgYSBzb2NrZXQgYXMgYmVpbmcgYWJsZSB0bworICogICBhY2NlcHQgbmV3IGFzc29jaWF0aW9ucy4KKyAqLworU0NUUF9TVEFUSUMgaW50IHNjdHBfc2VxcGFja2V0X2xpc3RlbihzdHJ1Y3Qgc29jayAqc2ssIGludCBiYWNrbG9nKQoreworCXN0cnVjdCBzY3RwX3NvY2sgKnNwID0gc2N0cF9zayhzayk7CisJc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwID0gc3AtPmVwOworCisJLyogT25seSBVRFAgc3R5bGUgc29ja2V0cyB0aGF0IGFyZSBub3QgcGVlbGVkIG9mZiBhcmUgYWxsb3dlZCB0bworCSAqIGxpc3RlbigpLgorCSAqLworCWlmICghc2N0cF9zdHlsZShzaywgVURQKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBJZiBiYWNrbG9nIGlzIHplcm8sIGRpc2FibGUgbGlzdGVuaW5nLiAqLworCWlmICghYmFja2xvZykgeworCQlpZiAoc2N0cF9zc3RhdGUoc2ssIENMT1NFRCkpCisJCQlyZXR1cm4gMDsKKwkJCisJCXNjdHBfdW5oYXNoX2VuZHBvaW50KGVwKTsKKwkJc2stPnNrX3N0YXRlID0gU0NUUF9TU19DTE9TRUQ7CisJfQorCisJLyogUmV0dXJuIGlmIHdlIGFyZSBhbHJlYWR5IGxpc3RlbmluZy4gKi8KKwlpZiAoc2N0cF9zc3RhdGUoc2ssIExJU1RFTklORykpCisJCXJldHVybiAwOworCQkKKwkvKgorCSAqIElmIGEgYmluZCgpIG9yIHNjdHBfYmluZHgoKSBpcyBub3QgY2FsbGVkIHByaW9yIHRvIGEgbGlzdGVuKCkKKwkgKiBjYWxsIHRoYXQgYWxsb3dzIG5ldyBhc3NvY2lhdGlvbnMgdG8gYmUgYWNjZXB0ZWQsIHRoZSBzeXN0ZW0KKwkgKiBwaWNrcyBhbiBlcGhlbWVyYWwgcG9ydCBhbmQgd2lsbCBjaG9vc2UgYW4gYWRkcmVzcyBzZXQgZXF1aXZhbGVudAorCSAqIHRvIGJpbmRpbmcgd2l0aCBhIHdpbGRjYXJkIGFkZHJlc3MuCisJICoKKwkgKiBUaGlzIGlzIG5vdCBjdXJyZW50bHkgc3BlbGxlZCBvdXQgaW4gdGhlIFNDVFAgc29ja2V0cworCSAqIGV4dGVuc2lvbnMgZHJhZnQsIGJ1dCBmb2xsb3dzIHRoZSBwcmFjdGljZSBhcyBzZWVuIGluIFRDUAorCSAqIHNvY2tldHMuCisJICovCisJaWYgKCFlcC0+YmFzZS5iaW5kX2FkZHIucG9ydCkgeworCQlpZiAoc2N0cF9hdXRvYmluZChzaykpCisJCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJc2stPnNrX3N0YXRlID0gU0NUUF9TU19MSVNURU5JTkc7CisJc2N0cF9oYXNoX2VuZHBvaW50KGVwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIDQuMS4zIGxpc3RlbigpIC0gVENQIFN0eWxlIFN5bnRheAorICoKKyAqICAgQXBwbGljYXRpb25zIHVzZXMgbGlzdGVuKCkgdG8gcmVhZHkgdGhlIFNDVFAgZW5kcG9pbnQgZm9yIGFjY2VwdGluZworICogICBpbmJvdW5kIGFzc29jaWF0aW9ucy4KKyAqLworU0NUUF9TVEFUSUMgaW50IHNjdHBfc3RyZWFtX2xpc3RlbihzdHJ1Y3Qgc29jayAqc2ssIGludCBiYWNrbG9nKQoreworCXN0cnVjdCBzY3RwX3NvY2sgKnNwID0gc2N0cF9zayhzayk7CisJc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwID0gc3AtPmVwOworCisJLyogSWYgYmFja2xvZyBpcyB6ZXJvLCBkaXNhYmxlIGxpc3RlbmluZy4gKi8KKwlpZiAoIWJhY2tsb2cpIHsKKwkJaWYgKHNjdHBfc3N0YXRlKHNrLCBDTE9TRUQpKQorCQkJcmV0dXJuIDA7CisJCQorCQlzY3RwX3VuaGFzaF9lbmRwb2ludChlcCk7CisJCXNrLT5za19zdGF0ZSA9IFNDVFBfU1NfQ0xPU0VEOworCX0KKworCWlmIChzY3RwX3NzdGF0ZShzaywgTElTVEVOSU5HKSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIElmIGEgYmluZCgpIG9yIHNjdHBfYmluZHgoKSBpcyBub3QgY2FsbGVkIHByaW9yIHRvIGEgbGlzdGVuKCkKKwkgKiBjYWxsIHRoYXQgYWxsb3dzIG5ldyBhc3NvY2lhdGlvbnMgdG8gYmUgYWNjZXB0ZWQsIHRoZSBzeXN0ZW0KKwkgKiBwaWNrcyBhbiBlcGhlbWVyYWwgcG9ydCBhbmQgd2lsbCBjaG9vc2UgYW4gYWRkcmVzcyBzZXQgZXF1aXZhbGVudAorCSAqIHRvIGJpbmRpbmcgd2l0aCBhIHdpbGRjYXJkIGFkZHJlc3MuCisJICoKKwkgKiBUaGlzIGlzIG5vdCBjdXJyZW50bHkgc3BlbGxlZCBvdXQgaW4gdGhlIFNDVFAgc29ja2V0cworCSAqIGV4dGVuc2lvbnMgZHJhZnQsIGJ1dCBmb2xsb3dzIHRoZSBwcmFjdGljZSBhcyBzZWVuIGluIFRDUAorCSAqIHNvY2tldHMuCisJICovCisJaWYgKCFlcC0+YmFzZS5iaW5kX2FkZHIucG9ydCkgeworCQlpZiAoc2N0cF9hdXRvYmluZChzaykpCisJCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJc2stPnNrX3N0YXRlID0gU0NUUF9TU19MSVNURU5JTkc7CisJc2stPnNrX21heF9hY2tfYmFja2xvZyA9IGJhY2tsb2c7CisJc2N0cF9oYXNoX2VuZHBvaW50KGVwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICBNb3ZlIGEgc29ja2V0IHRvIExJU1RFTklORyBzdGF0ZS4KKyAqLworaW50IHNjdHBfaW5ldF9saXN0ZW4oc3RydWN0IHNvY2tldCAqc29jaywgaW50IGJhY2tsb2cpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGNyeXB0b190Zm0gKnRmbT1OVUxMOworCWludCBlcnIgPSAtRUlOVkFMOworCisJaWYgKHVubGlrZWx5KGJhY2tsb2cgPCAwKSkKKwkJZ290byBvdXQ7CisKKwlzY3RwX2xvY2tfc29jayhzayk7CisKKwlpZiAoc29jay0+c3RhdGUgIT0gU1NfVU5DT05ORUNURUQpCisJCWdvdG8gb3V0OworCisJLyogQWxsb2NhdGUgSE1BQyBmb3IgZ2VuZXJhdGluZyBjb29raWUuICovCisJaWYgKHNjdHBfaG1hY19hbGcpIHsKKwkJdGZtID0gc2N0cF9jcnlwdG9fYWxsb2NfdGZtKHNjdHBfaG1hY19hbGcsIDApOworCQlpZiAoIXRmbSkgeworCQkJZXJyID0gLUVOT1NZUzsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJc3dpdGNoIChzb2NrLT50eXBlKSB7CisJY2FzZSBTT0NLX1NFUVBBQ0tFVDoKKwkJZXJyID0gc2N0cF9zZXFwYWNrZXRfbGlzdGVuKHNrLCBiYWNrbG9nKTsKKwkJYnJlYWs7CisJY2FzZSBTT0NLX1NUUkVBTToKKwkJZXJyID0gc2N0cF9zdHJlYW1fbGlzdGVuKHNrLCBiYWNrbG9nKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfTsKKwlpZiAoZXJyKQorCQlnb3RvIGNsZWFudXA7CisKKwkvKiBTdG9yZSBhd2F5IHRoZSB0cmFuc2Zvcm0gcmVmZXJlbmNlLiAqLworCXNjdHBfc2soc2spLT5obWFjID0gdGZtOworb3V0OgorCXNjdHBfcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworY2xlYW51cDoKKwlpZiAodGZtKQorCQlzY3RwX2NyeXB0b19mcmVlX3RmbSh0Zm0pOworCWdvdG8gb3V0OworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBkb25lIGJ5IG1vZGVsaW5nIHRoZSBjdXJyZW50IGRhdGFncmFtX3BvbGwoKSBhbmQgdGhlCisgKiB0Y3BfcG9sbCgpLiAgTm90ZSB0aGF0LCBiYXNlZCBvbiB0aGVzZSBpbXBsZW1lbnRhdGlvbnMsIHdlIGRvbid0CisgKiBsb2NrIHRoZSBzb2NrZXQgaW4gdGhpcyBmdW5jdGlvbiwgZXZlbiB0aG91Z2ggaXQgc2VlbXMgdGhhdCwKKyAqIGlkZWFsbHksIGxvY2tpbmcgb3Igc29tZSBvdGhlciBtZWNoYW5pc21zIGNhbiBiZSB1c2VkIHRvIGVuc3VyZQorICogdGhlIGludGVncml0eSBvZiB0aGUgY291bnRlcnMgKHNuZGJ1ZiBhbmQgd21lbV9xdWV1ZWQpIHVzZWQKKyAqIGluIHRoaXMgcGxhY2UuICBXZSBhc3N1bWUgdGhhdCB3ZSBkb24ndCBuZWVkIGxvY2tzIGVpdGhlciB1bnRpbCBwcm92ZW4KKyAqIG90aGVyd2lzZS4KKyAqCisgKiBBbm90aGVyIHRoaW5nIHRvIG5vdGUgaXMgdGhhdCB3ZSBpbmNsdWRlIHRoZSBBc3luYyBJL08gc3VwcG9ydAorICogaGVyZSwgYWdhaW4sIGJ5IG1vZGVsaW5nIHRoZSBjdXJyZW50IFRDUC9VRFAgY29kZS4gIFdlIGRvbid0IGhhdmUKKyAqIGEgZ29vZCB3YXkgdG8gdGVzdCB3aXRoIGl0IHlldC4KKyAqLwordW5zaWduZWQgaW50IHNjdHBfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHNvY2tldCAqc29jaywgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgc2N0cF9zb2NrICpzcCA9IHNjdHBfc2soc2spOworCXVuc2lnbmVkIGludCBtYXNrOworCisJcG9sbF93YWl0KGZpbGUsIHNrLT5za19zbGVlcCwgd2FpdCk7CisKKwkvKiBBIFRDUC1zdHlsZSBsaXN0ZW5pbmcgc29ja2V0IGJlY29tZXMgcmVhZGFibGUgd2hlbiB0aGUgYWNjZXB0IHF1ZXVlCisJICogaXMgbm90IGVtcHR5LgorCSAqLworCWlmIChzY3RwX3N0eWxlKHNrLCBUQ1ApICYmIHNjdHBfc3N0YXRlKHNrLCBMSVNURU5JTkcpKQorCQlyZXR1cm4gKCFsaXN0X2VtcHR5KCZzcC0+ZXAtPmFzb2NzKSkgPworCQkgICAgICAgCShQT0xMSU4gfCBQT0xMUkROT1JNKSA6IDA7CisKKwltYXNrID0gMDsKKworCS8qIElzIHRoZXJlIGFueSBleGNlcHRpb25hbCBldmVudHM/ICAqLworCWlmIChzay0+c2tfZXJyIHx8ICFza2JfcXVldWVfZW1wdHkoJnNrLT5za19lcnJvcl9xdWV1ZSkpCisJCW1hc2sgfD0gUE9MTEVSUjsKKwlpZiAoc2stPnNrX3NodXRkb3duID09IFNIVVRET1dOX01BU0spCisJCW1hc2sgfD0gUE9MTEhVUDsKKworCS8qIElzIGl0IHJlYWRhYmxlPyAgUmVjb25zaWRlciB0aGlzIGNvZGUgd2l0aCBUQ1Atc3R5bGUgc3VwcG9ydC4gICovCisJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSB8fAorCSAgICAoc2stPnNrX3NodXRkb3duICYgUkNWX1NIVVRET1dOKSkKKwkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCisJLyogVGhlIGFzc29jaWF0aW9uIGlzIGVpdGhlciBnb25lIG9yIG5vdCByZWFkeS4gICovCisJaWYgKCFzY3RwX3N0eWxlKHNrLCBVRFApICYmIHNjdHBfc3N0YXRlKHNrLCBDTE9TRUQpKQorCQlyZXR1cm4gbWFzazsKKworCS8qIElzIGl0IHdyaXRhYmxlPyAgKi8KKwlpZiAoc2N0cF93cml0ZWFibGUoc2spKSB7CisJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJfSBlbHNlIHsKKwkJc2V0X2JpdChTT0NLX0FTWU5DX05PU1BBQ0UsICZzay0+c2tfc29ja2V0LT5mbGFncyk7CisJCS8qCisJCSAqIFNpbmNlIHRoZSBzb2NrZXQgaXMgbm90IGxvY2tlZCwgdGhlIGJ1ZmZlcgorCQkgKiBtaWdodCBiZSBtYWRlIGF2YWlsYWJsZSBhZnRlciB0aGUgd3JpdGVhYmxlIGNoZWNrIGFuZAorCQkgKiBiZWZvcmUgdGhlIGJpdCBpcyBzZXQuICBUaGlzIGNvdWxkIGNhdXNlIGEgbG9zdCBJL08KKwkJICogc2lnbmFsLiAgdGNwX3BvbGwoKSBoYXMgYSByYWNlIGJyZWFrZXIgZm9yIHRoaXMgcmFjZQorCQkgKiBjb25kaXRpb24uICBCYXNlZCBvbiB0aGVpciBpbXBsZW1lbnRhdGlvbiwgd2UgcHV0CisJCSAqIGluIHRoZSBmb2xsb3dpbmcgY29kZSB0byBjb3ZlciBpdCBhcyB3ZWxsLgorCQkgKi8KKwkJaWYgKHNjdHBfd3JpdGVhYmxlKHNrKSkKKwkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJfQorCXJldHVybiBtYXNrOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIDJuZCBMZXZlbCBBYnN0cmFjdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBzY3RwX2JpbmRfYnVja2V0ICpzY3RwX2J1Y2tldF9jcmVhdGUoCisJc3RydWN0IHNjdHBfYmluZF9oYXNoYnVja2V0ICpoZWFkLCB1bnNpZ25lZCBzaG9ydCBzbnVtKQoreworCXN0cnVjdCBzY3RwX2JpbmRfYnVja2V0ICpwcDsKKworCXBwID0ga21lbV9jYWNoZV9hbGxvYyhzY3RwX2J1Y2tldF9jYWNoZXAsIFNMQUJfQVRPTUlDKTsKKwlTQ1RQX0RCR19PQkpDTlRfSU5DKGJpbmRfYnVja2V0KTsKKwlpZiAocHApIHsKKwkJcHAtPnBvcnQgPSBzbnVtOworCQlwcC0+ZmFzdHJldXNlID0gMDsKKwkJSU5JVF9ITElTVF9IRUFEKCZwcC0+b3duZXIpOworCQlpZiAoKHBwLT5uZXh0ID0gaGVhZC0+Y2hhaW4pICE9IE5VTEwpCisJCQlwcC0+bmV4dC0+cHByZXYgPSAmcHAtPm5leHQ7CisJCWhlYWQtPmNoYWluID0gcHA7CisJCXBwLT5wcHJldiA9ICZoZWFkLT5jaGFpbjsKKwl9CisJcmV0dXJuIHBwOworfQorCisvKiBDYWxsZXIgbXVzdCBob2xkIGhhc2hidWNrZXQgbG9jayBmb3IgdGhpcyB0YiB3aXRoIGxvY2FsIEJIIGRpc2FibGVkICovCitzdGF0aWMgdm9pZCBzY3RwX2J1Y2tldF9kZXN0cm95KHN0cnVjdCBzY3RwX2JpbmRfYnVja2V0ICpwcCkKK3sKKwlpZiAoaGxpc3RfZW1wdHkoJnBwLT5vd25lcikpIHsKKwkJaWYgKHBwLT5uZXh0KQorCQkJcHAtPm5leHQtPnBwcmV2ID0gcHAtPnBwcmV2OworCQkqKHBwLT5wcHJldikgPSBwcC0+bmV4dDsKKwkJa21lbV9jYWNoZV9mcmVlKHNjdHBfYnVja2V0X2NhY2hlcCwgcHApOworCQlTQ1RQX0RCR19PQkpDTlRfREVDKGJpbmRfYnVja2V0KTsKKwl9Cit9CisKKy8qIFJlbGVhc2UgdGhpcyBzb2NrZXQncyByZWZlcmVuY2UgdG8gYSBsb2NhbCBwb3J0LiAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3NjdHBfcHV0X3BvcnQoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBzY3RwX2JpbmRfaGFzaGJ1Y2tldCAqaGVhZCA9CisJCSZzY3RwX3BvcnRfaGFzaHRhYmxlW3NjdHBfcGhhc2hmbihpbmV0X3NrKHNrKS0+bnVtKV07CisJc3RydWN0IHNjdHBfYmluZF9idWNrZXQgKnBwOworCisJc2N0cF9zcGluX2xvY2soJmhlYWQtPmxvY2spOworCXBwID0gc2N0cF9zayhzayktPmJpbmRfaGFzaDsKKwlfX3NrX2RlbF9iaW5kX25vZGUoc2spOworCXNjdHBfc2soc2spLT5iaW5kX2hhc2ggPSBOVUxMOworCWluZXRfc2soc2spLT5udW0gPSAwOworCXNjdHBfYnVja2V0X2Rlc3Ryb3kocHApOworCXNjdHBfc3Bpbl91bmxvY2soJmhlYWQtPmxvY2spOworfQorCit2b2lkIHNjdHBfcHV0X3BvcnQoc3RydWN0IHNvY2sgKnNrKQoreworCXNjdHBfbG9jYWxfYmhfZGlzYWJsZSgpOworCV9fc2N0cF9wdXRfcG9ydChzayk7CisJc2N0cF9sb2NhbF9iaF9lbmFibGUoKTsKK30KKworLyoKKyAqIFRoZSBzeXN0ZW0gcGlja3MgYW4gZXBoZW1lcmFsIHBvcnQgYW5kIGNob29zZSBhbiBhZGRyZXNzIHNldCBlcXVpdmFsZW50CisgKiB0byBiaW5kaW5nIHdpdGggYSB3aWxkY2FyZCBhZGRyZXNzLgorICogT25lIG9mIHRob3NlIGFkZHJlc3NlcyB3aWxsIGJlIHRoZSBwcmltYXJ5IGFkZHJlc3MgZm9yIHRoZSBhc3NvY2lhdGlvbi4KKyAqIFRoaXMgYXV0b21hdGljYWxseSBlbmFibGVzIHRoZSBtdWx0aWhvbWluZyBjYXBhYmlsaXR5IG9mIFNDVFAuCisgKi8KK3N0YXRpYyBpbnQgc2N0cF9hdXRvYmluZChzdHJ1Y3Qgc29jayAqc2spCit7CisJdW5pb24gc2N0cF9hZGRyIGF1dG9hZGRyOworCXN0cnVjdCBzY3RwX2FmICphZjsKKwl1bnNpZ25lZCBzaG9ydCBwb3J0OworCisJLyogSW5pdGlhbGl6ZSBhIGxvY2FsIHNvY2thZGRyIHN0cnVjdHVyZSB0byBJTkFERFJfQU5ZLiAqLworCWFmID0gc2N0cF9zayhzayktPnBmLT5hZjsKKworCXBvcnQgPSBodG9ucyhpbmV0X3NrKHNrKS0+bnVtKTsKKwlhZi0+aW5hZGRyX2FueSgmYXV0b2FkZHIsIHBvcnQpOworCisJcmV0dXJuIHNjdHBfZG9fYmluZChzaywgJmF1dG9hZGRyLCBhZi0+c29ja2FkZHJfbGVuKTsKK30KKworLyogUGFyc2Ugb3V0IElQUFJPVE9fU0NUUCBDTVNHIGhlYWRlcnMuICBQZXJmb3JtIG9ubHkgbWluaW1hbCB2YWxpZGF0aW9uLgorICoKKyAqIEZyb20gUkZDIDIyOTIKKyAqIDQuMiBUaGUgY21zZ2hkciBTdHJ1Y3R1cmUgKgorICoKKyAqIFdoZW4gYW5jaWxsYXJ5IGRhdGEgaXMgc2VudCBvciByZWNlaXZlZCwgYW55IG51bWJlciBvZiBhbmNpbGxhcnkgZGF0YQorICogb2JqZWN0cyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHRoZSBtc2dfY29udHJvbCBhbmQgbXNnX2NvbnRyb2xsZW4gbWVtYmVycyBvZgorICogdGhlIG1zZ2hkciBzdHJ1Y3R1cmUsIGJlY2F1c2UgZWFjaCBvYmplY3QgaXMgcHJlY2VkZWQgYnkKKyAqIGEgY21zZ2hkciBzdHJ1Y3R1cmUgZGVmaW5pbmcgdGhlIG9iamVjdCdzIGxlbmd0aCAodGhlIGNtc2dfbGVuIG1lbWJlcikuCisgKiBIaXN0b3JpY2FsbHkgQmVya2VsZXktZGVyaXZlZCBpbXBsZW1lbnRhdGlvbnMgaGF2ZSBwYXNzZWQgb25seSBvbmUgb2JqZWN0CisgKiBhdCBhIHRpbWUsIGJ1dCB0aGlzIEFQSSBhbGxvd3MgbXVsdGlwbGUgb2JqZWN0cyB0byBiZQorICogcGFzc2VkIGluIGEgc2luZ2xlIGNhbGwgdG8gc2VuZG1zZygpIG9yIHJlY3Ztc2coKS4gVGhlIGZvbGxvd2luZyBleGFtcGxlCisgKiBzaG93cyB0d28gYW5jaWxsYXJ5IGRhdGEgb2JqZWN0cyBpbiBhIGNvbnRyb2wgYnVmZmVyLgorICoKKyAqICAgfDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbXNnX2NvbnRyb2xsZW4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+fAorICogICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKgorICogICB8PC0tLS0tIGFuY2lsbGFyeSBkYXRhIG9iamVjdCAtLS0tLT58PC0tLS0tIGFuY2lsbGFyeSBkYXRhIG9iamVjdCAtLS0tLT58CisgKgorICogICB8PC0tLS0tLS0tLS0gQ01TR19TUEFDRSgpIC0tLS0tLS0tLT58PC0tLS0tLS0tLS0gQ01TR19TUEFDRSgpIC0tLS0tLS0tLT58CisgKiAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqCisgKiAgIHw8LS0tLS0tLS0tLSBjbXNnX2xlbiAtLS0tLS0tLS0tPnwgIHw8LS0tLS0tLS0tIGNtc2dfbGVuIC0tLS0tLS0tLS0tPnwgIHwKKyAqCisgKiAgIHw8LS0tLS0tLS0tIENNU0dfTEVOKCkgLS0tLS0tLS0tPnwgIHw8LS0tLS0tLS0gQ01TR19MRU4oKSAtLS0tLS0tLS0tPnwgIHwKKyAqICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgfAorICoKKyAqICAgKy0tLS0tKy0tLS0tKy0tLS0tKy0tKy0tLS0tLS0tLS0tKy0tKy0tLS0tKy0tLS0tKy0tLS0tKy0tKy0tLS0tLS0tLS0tKy0tKworICogICB8Y21zZ198Y21zZ198Y21zZ198WFh8ICAgICAgICAgICB8WFh8Y21zZ198Y21zZ198Y21zZ198WFh8ICAgICAgICAgICB8WFh8CisgKgorICogICB8bGVuICB8bGV2ZWx8dHlwZSB8WFh8Y21zZ19kYXRhW118WFh8bGVuICB8bGV2ZWx8dHlwZSB8WFh8Y21zZ19kYXRhW118WFh8CisgKgorICogICArLS0tLS0rLS0tLS0rLS0tLS0rLS0rLS0tLS0tLS0tLS0rLS0rLS0tLS0rLS0tLS0rLS0tLS0rLS0rLS0tLS0tLS0tLS0rLS0rCisgKiAgICBeCisgKiAgICB8CisgKgorICogbXNnX2NvbnRyb2wKKyAqIHBvaW50cyBoZXJlCisgKi8KK1NDVFBfU1RBVElDIGludCBzY3RwX21zZ2hkcl9wYXJzZShjb25zdCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkJICBzY3RwX2Ntc2dzX3QgKmNtc2dzKQoreworCXN0cnVjdCBjbXNnaGRyICpjbXNnOworCisJZm9yIChjbXNnID0gQ01TR19GSVJTVEhEUihtc2cpOworCSAgICAgY21zZyAhPSBOVUxMOworCSAgICAgY21zZyA9IENNU0dfTlhUSERSKChzdHJ1Y3QgbXNnaGRyKiltc2csIGNtc2cpKSB7CisJCWlmICghQ01TR19PSyhtc2csIGNtc2cpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogU2hvdWxkIHdlIHBhcnNlIHRoaXMgaGVhZGVyIG9yIGlnbm9yZT8gICovCisJCWlmIChjbXNnLT5jbXNnX2xldmVsICE9IElQUFJPVE9fU0NUUCkKKwkJCWNvbnRpbnVlOworCisJCS8qIFN0cmljdGx5IGNoZWNrIGxlbmd0aHMgZm9sbG93aW5nIGV4YW1wbGUgaW4gU0NNIGNvZGUuICAqLworCQlzd2l0Y2ggKGNtc2ctPmNtc2dfdHlwZSkgeworCQljYXNlIFNDVFBfSU5JVDoKKwkJCS8qIFNDVFAgU29ja2V0IEFQSSBFeHRlbnNpb24KKwkJCSAqIDUuMi4xIFNDVFAgSW5pdGlhdGlvbiBTdHJ1Y3R1cmUgKFNDVFBfSU5JVCkKKwkJCSAqCisJCQkgKiBUaGlzIGNtc2doZHIgc3RydWN0dXJlIHByb3ZpZGVzIGluZm9ybWF0aW9uIGZvcgorCQkJICogaW5pdGlhbGl6aW5nIG5ldyBTQ1RQIGFzc29jaWF0aW9ucyB3aXRoIHNlbmRtc2coKS4KKwkJCSAqIFRoZSBTQ1RQX0lOSVRNU0cgc29ja2V0IG9wdGlvbiB1c2VzIHRoaXMgc2FtZSBkYXRhCisJCQkgKiBzdHJ1Y3R1cmUuICBUaGlzIHN0cnVjdHVyZSBpcyBub3QgdXNlZCBmb3IKKwkJCSAqIHJlY3Ztc2coKS4KKwkJCSAqCisJCQkgKiBjbXNnX2xldmVsICAgIGNtc2dfdHlwZSAgICAgIGNtc2dfZGF0YVtdCisJCQkgKiAtLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCSAqIElQUFJPVE9fU0NUUCAgU0NUUF9JTklUICAgICAgc3RydWN0IHNjdHBfaW5pdG1zZworCQkJICovCisJCQlpZiAoY21zZy0+Y21zZ19sZW4gIT0KKwkJCSAgICBDTVNHX0xFTihzaXplb2Yoc3RydWN0IHNjdHBfaW5pdG1zZykpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJY21zZ3MtPmluaXQgPSAoc3RydWN0IHNjdHBfaW5pdG1zZyAqKUNNU0dfREFUQShjbXNnKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NUUF9TTkRSQ1Y6CisJCQkvKiBTQ1RQIFNvY2tldCBBUEkgRXh0ZW5zaW9uCisJCQkgKiA1LjIuMiBTQ1RQIEhlYWRlciBJbmZvcm1hdGlvbiBTdHJ1Y3R1cmUoU0NUUF9TTkRSQ1YpCisJCQkgKgorCQkJICogVGhpcyBjbXNnaGRyIHN0cnVjdHVyZSBzcGVjaWZpZXMgU0NUUCBvcHRpb25zIGZvcgorCQkJICogc2VuZG1zZygpIGFuZCBkZXNjcmliZXMgU0NUUCBoZWFkZXIgaW5mb3JtYXRpb24KKwkJCSAqIGFib3V0IGEgcmVjZWl2ZWQgbWVzc2FnZSB0aHJvdWdoIHJlY3Ztc2coKS4KKwkJCSAqCisJCQkgKiBjbXNnX2xldmVsICAgIGNtc2dfdHlwZSAgICAgIGNtc2dfZGF0YVtdCisJCQkgKiAtLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCSAqIElQUFJPVE9fU0NUUCAgU0NUUF9TTkRSQ1YgICAgc3RydWN0IHNjdHBfc25kcmN2aW5mbworCQkJICovCisJCQlpZiAoY21zZy0+Y21zZ19sZW4gIT0KKwkJCSAgICBDTVNHX0xFTihzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQljbXNncy0+aW5mbyA9CisJCQkJKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKilDTVNHX0RBVEEoY21zZyk7CisKKwkJCS8qIE1pbmltYWxseSwgdmFsaWRhdGUgdGhlIHNpbmZvX2ZsYWdzLiAqLworCQkJaWYgKGNtc2dzLT5pbmZvLT5zaW5mb19mbGFncyAmCisJCQkgICAgfihNU0dfVU5PUkRFUkVEIHwgTVNHX0FERFJfT1ZFUiB8CisJCQkgICAgICBNU0dfQUJPUlQgfCBNU0dfRU9GKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXYWl0IGZvciBhIHBhY2tldC4uCisgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBzYW1lIGZ1bmN0aW9uIGFzIGluIGNvcmUvZGF0YWdyYW0uYworICogd2l0aCBhIGZldyBtb2RpZmljYXRpb25zIHRvIG1ha2UgbGtzY3RwIHdvcmsuCisgKi8KK3N0YXRpYyBpbnQgc2N0cF93YWl0X2Zvcl9wYWNrZXQoc3RydWN0IHNvY2sgKiBzaywgaW50ICplcnIsIGxvbmcgKnRpbWVvX3ApCit7CisJaW50IGVycm9yOworCURFRklORV9XQUlUKHdhaXQpOworCisJcHJlcGFyZV90b193YWl0X2V4Y2x1c2l2ZShzay0+c2tfc2xlZXAsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCisJLyogU29ja2V0IGVycm9ycz8gKi8KKwllcnJvciA9IHNvY2tfZXJyb3Ioc2spOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKQorCQlnb3RvIHJlYWR5OworCisJLyogU29ja2V0IHNodXQgZG93bj8gICovCisJaWYgKHNrLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikKKwkJZ290byBvdXQ7CisKKwkvKiBTZXF1ZW5jZWQgcGFja2V0cyBjYW4gY29tZSBkaXNjb25uZWN0ZWQuICBJZiBzbyB3ZSByZXBvcnQgdGhlCisJICogcHJvYmxlbS4KKwkgKi8KKwllcnJvciA9IC1FTk9UQ09OTjsKKworCS8qIElzIHRoZXJlIGEgZ29vZCByZWFzb24gdG8gdGhpbmsgdGhhdCB3ZSBtYXkgcmVjZWl2ZSBzb21lIGRhdGE/ICAqLworCWlmIChsaXN0X2VtcHR5KCZzY3RwX3NrKHNrKS0+ZXAtPmFzb2NzKSAmJiAhc2N0cF9zc3RhdGUoc2ssIExJU1RFTklORykpCisJCWdvdG8gb3V0OworCisJLyogSGFuZGxlIHNpZ25hbHMuICAqLworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJZ290byBpbnRlcnJ1cHRlZDsKKworCS8qIExldCBhbm90aGVyIHByb2Nlc3MgaGF2ZSBhIGdvLiAgU2luY2Ugd2UgYXJlIGdvaW5nIHRvIHNsZWVwCisJICogYW55d2F5LiAgTm90ZTogVGhpcyBtYXkgY2F1c2Ugb2RkIGJlaGF2aW9ycyBpZiB0aGUgbWVzc2FnZQorCSAqIGRvZXMgbm90IGZpdCBpbiB0aGUgdXNlcidzIGJ1ZmZlciwgYnV0IHRoaXMgc2VlbXMgdG8gYmUgdGhlCisJICogb25seSB3YXkgdG8gaG9ub3IgTVNHX0RPTlRXQUlUIHJlYWxpc3RpY2FsbHkuCisJICovCisJc2N0cF9yZWxlYXNlX3NvY2soc2spOworCSp0aW1lb19wID0gc2NoZWR1bGVfdGltZW91dCgqdGltZW9fcCk7CisJc2N0cF9sb2NrX3NvY2soc2spOworCityZWFkeToKKwlmaW5pc2hfd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwlyZXR1cm4gMDsKKworaW50ZXJydXB0ZWQ6CisJZXJyb3IgPSBzb2NrX2ludHJfZXJybm8oKnRpbWVvX3ApOworCitvdXQ6CisJZmluaXNoX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJKmVyciA9IGVycm9yOworCXJldHVybiBlcnJvcjsKK30KKworLyogUmVjZWl2ZSBhIGRhdGFncmFtLgorICogTm90ZTogVGhpcyBpcyBwcmV0dHkgbXVjaCB0aGUgc2FtZSByb3V0aW5lIGFzIGluIGNvcmUvZGF0YWdyYW0uYworICogd2l0aCBhIGZldyBjaGFuZ2VzIHRvIG1ha2UgbGtzY3RwIHdvcmsuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqc2N0cF9za2JfcmVjdl9kYXRhZ3JhbShzdHJ1Y3Qgc29jayAqc2ssIGludCBmbGFncywKKwkJCQkJICAgICAgaW50IG5vYmxvY2ssIGludCAqZXJyKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWxvbmcgdGltZW87CisKKwkvKiBDYWxsZXIgaXMgYWxsb3dlZCBub3QgdG8gY2hlY2sgc2stPnNrX2VyciBiZWZvcmUgY2FsbGluZy4gICovCisJZXJyb3IgPSBzb2NrX2Vycm9yKHNrKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gbm9fcGFja2V0OworCisJdGltZW8gPSBzb2NrX3JjdnRpbWVvKHNrLCBub2Jsb2NrKTsKKworCVNDVFBfREVCVUdfUFJJTlRLKCJUaW1lb3V0OiB0aW1lbzogJWxkLCBNQVg6ICVsZC5cbiIsCisJCQkgIHRpbWVvLCBNQVhfU0NIRURVTEVfVElNRU9VVCk7CisKKwlkbyB7CisJCS8qIEFnYWluIG9ubHkgdXNlciBsZXZlbCBjb2RlIGNhbGxzIHRoaXMgZnVuY3Rpb24sCisJCSAqIHNvIG5vdGhpbmcgaW50ZXJydXB0IGxldmVsCisJCSAqIHdpbGwgc3VkZGVubHkgZWF0IHRoZSByZWNlaXZlX3F1ZXVlLgorCQkgKgorCQkgKiAgTG9vayBhdCBjdXJyZW50IG5mcyBjbGllbnQgYnkgdGhlIHdheS4uLgorCQkgKiAgSG93ZXZlciwgdGhpcyBmdW5jdGlvbiB3YXMgY29ycmVudCBpbiBhbnkgY2FzZS4gOCkKKwkJICovCisJCWlmIChmbGFncyAmIE1TR19QRUVLKSB7CisJCQl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKworCQkJc2N0cF9zcGluX2xvY2tfaXJxc2F2ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQlza2IgPSBza2JfcGVlaygmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCQkJaWYgKHNrYikKKwkJCQlhdG9taWNfaW5jKCZza2ItPnVzZXJzKTsKKwkJCXNjdHBfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jaywKKwkJCQkJCSAgICBjcHVfZmxhZ3MpOworCQl9IGVsc2UgeworCQkJc2tiID0gc2tiX2RlcXVldWUoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwkJfQorCisJCWlmIChza2IpCisJCQlyZXR1cm4gc2tiOworCisJCWlmIChzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pCisJCQlicmVhazsKKworCQkvKiBVc2VyIGRvZXNuJ3Qgd2FudCB0byB3YWl0LiAgKi8KKwkJZXJyb3IgPSAtRUFHQUlOOworCQlpZiAoIXRpbWVvKQorCQkJZ290byBub19wYWNrZXQ7CisJfSB3aGlsZSAoc2N0cF93YWl0X2Zvcl9wYWNrZXQoc2ssIGVyciwgJnRpbWVvKSA9PSAwKTsKKworCXJldHVybiBOVUxMOworCitub19wYWNrZXQ6CisJKmVyciA9IGVycm9yOworCXJldHVybiBOVUxMOworfQorCisvKiBJZiBzbmRidWYgaGFzIGNoYW5nZWQsIHdha2UgdXAgcGVyIGFzc29jaWF0aW9uIHNuZGJ1ZiB3YWl0ZXJzLiAgKi8KK3N0YXRpYyB2b2lkIF9fc2N0cF93cml0ZV9zcGFjZShzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBhc29jLT5iYXNlLnNrOworCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBzay0+c2tfc29ja2V0OworCisJaWYgKChzY3RwX3dzcGFjZShhc29jKSA+IDApICYmIHNvY2spIHsKKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmFzb2MtPndhaXQpKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZhc29jLT53YWl0KTsKKworCQlpZiAoc2N0cF93cml0ZWFibGUoc2spKSB7CisJCQlpZiAoc2stPnNrX3NsZWVwICYmIHdhaXRxdWV1ZV9hY3RpdmUoc2stPnNrX3NsZWVwKSkKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoc2stPnNrX3NsZWVwKTsKKworCQkJLyogTm90ZSB0aGF0IHdlIHRyeSB0byBpbmNsdWRlIHRoZSBBc3luYyBJL08gc3VwcG9ydAorCQkJICogaGVyZSBieSBtb2RlbGluZyBmcm9tIHRoZSBjdXJyZW50IFRDUC9VRFAgY29kZS4KKwkJCSAqIFdlIGhhdmUgbm90IHRlc3RlZCB3aXRoIGl0IHlldC4KKwkJCSAqLworCQkJaWYgKHNvY2stPmZhc3luY19saXN0ICYmCisJCQkgICAgIShzay0+c2tfc2h1dGRvd24gJiBTRU5EX1NIVVRET1dOKSkKKwkJCQlzb2NrX3dha2VfYXN5bmMoc29jaywgMiwgUE9MTF9PVVQpOworCQl9CisJfQorfQorCisvKiBEbyBhY2NvdW50aW5nIGZvciB0aGUgc25kYnVmIHNwYWNlLgorICogRGVjcmVtZW50IHRoZSB1c2VkIHNuZGJ1ZiBzcGFjZSBvZiB0aGUgY29ycmVzcG9uZGluZyBhc3NvY2lhdGlvbiBieSB0aGUKKyAqIGRhdGEgc2l6ZSB3aGljaCB3YXMganVzdCB0cmFuc21pdHRlZChmcmVlZCkuCisgKi8KK3N0YXRpYyB2b2lkIHNjdHBfd2ZyZWUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bms7CisJc3RydWN0IHNvY2sgKnNrOworCisJLyogR2V0IHRoZSBzYXZlZCBjaHVuayBwb2ludGVyLiAgKi8KKwljaHVuayA9ICooKHN0cnVjdCBzY3RwX2NodW5rICoqKShza2ItPmNiKSk7CisJYXNvYyA9IGNodW5rLT5hc29jOworCXNrID0gYXNvYy0+YmFzZS5zazsKKwlhc29jLT5zbmRidWZfdXNlZCAtPSBTQ1RQX0RBVEFfU05EU0laRShjaHVuayk7CisJc2stPnNrX3dtZW1fcXVldWVkIC09IFNDVFBfREFUQV9TTkRTSVpFKGNodW5rKTsKKwlfX3NjdHBfd3JpdGVfc3BhY2UoYXNvYyk7CisKKwlzY3RwX2Fzc29jaWF0aW9uX3B1dChhc29jKTsKK30KKworLyogSGVscGVyIGZ1bmN0aW9uIHRvIHdhaXQgZm9yIHNwYWNlIGluIHRoZSBzbmRidWYuICAqLworc3RhdGljIGludCBzY3RwX3dhaXRfZm9yX3NuZGJ1ZihzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywgbG9uZyAqdGltZW9fcCwKKwkJCQlzaXplX3QgbXNnX2xlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBhc29jLT5iYXNlLnNrOworCWludCBlcnIgPSAwOworCWxvbmcgY3VycmVudF90aW1lbyA9ICp0aW1lb19wOworCURFRklORV9XQUlUKHdhaXQpOworCisJU0NUUF9ERUJVR19QUklOVEsoIndhaXRfZm9yX3NuZGJ1ZjogYXNvYz0lcCwgdGltZW89JWxkLCBtc2dfbGVuPSV6dVxuIiwKKwkgICAgICAgICAgICAgICAgICBhc29jLCAobG9uZykoKnRpbWVvX3ApLCBtc2dfbGVuKTsKKworCS8qIEluY3JlbWVudCB0aGUgYXNzb2NpYXRpb24ncyByZWZjbnQuICAqLworCXNjdHBfYXNzb2NpYXRpb25faG9sZChhc29jKTsKKworCS8qIFdhaXQgb24gdGhlIGFzc29jaWF0aW9uIHNwZWNpZmljIHNuZGJ1ZiBzcGFjZS4gKi8KKwlmb3IgKDs7KSB7CisJCXByZXBhcmVfdG9fd2FpdF9leGNsdXNpdmUoJmFzb2MtPndhaXQsICZ3YWl0LAorCQkJCQkgIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmICghKnRpbWVvX3ApCisJCQlnb3RvIGRvX25vbmJsb2NrOworCQlpZiAoc2stPnNrX2VyciB8fCBhc29jLT5zdGF0ZSA+PSBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgfHwKKwkJICAgIGFzb2MtPmJhc2UuZGVhZCkKKwkJCWdvdG8gZG9fZXJyb3I7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWdvdG8gZG9faW50ZXJydXB0ZWQ7CisJCWlmIChtc2dfbGVuIDw9IHNjdHBfd3NwYWNlKGFzb2MpKQorCQkJYnJlYWs7CisKKwkJLyogTGV0IGFub3RoZXIgcHJvY2VzcyBoYXZlIGEgZ28uICBTaW5jZSB3ZSBhcmUgZ29pbmcKKwkJICogdG8gc2xlZXAgYW55d2F5LgorCQkgKi8KKwkJc2N0cF9yZWxlYXNlX3NvY2soc2spOworCQljdXJyZW50X3RpbWVvID0gc2NoZWR1bGVfdGltZW91dChjdXJyZW50X3RpbWVvKTsKKwkJc2N0cF9sb2NrX3NvY2soc2spOworCisJCSp0aW1lb19wID0gY3VycmVudF90aW1lbzsKKwl9CisKK291dDoKKwlmaW5pc2hfd2FpdCgmYXNvYy0+d2FpdCwgJndhaXQpOworCisJLyogUmVsZWFzZSB0aGUgYXNzb2NpYXRpb24ncyByZWZjbnQuICAqLworCXNjdHBfYXNzb2NpYXRpb25fcHV0KGFzb2MpOworCisJcmV0dXJuIGVycjsKKworZG9fZXJyb3I6CisJZXJyID0gLUVQSVBFOworCWdvdG8gb3V0OworCitkb19pbnRlcnJ1cHRlZDoKKwllcnIgPSBzb2NrX2ludHJfZXJybm8oKnRpbWVvX3ApOworCWdvdG8gb3V0OworCitkb19ub25ibG9jazoKKwllcnIgPSAtRUFHQUlOOworCWdvdG8gb3V0OworfQorCisvKiBJZiBzb2NrZXQgc25kYnVmIGhhcyBjaGFuZ2VkLCB3YWtlIHVwIGFsbCBwZXIgYXNzb2NpYXRpb24gd2FpdGVycy4gICovCit2b2lkIHNjdHBfd3JpdGVfc3BhY2Uoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKworCS8qIFdha2UgdXAgdGhlIHRhc2tzIGluIGVhY2ggd2FpdCBxdWV1ZS4gICovCisJbGlzdF9mb3JfZWFjaChwb3MsICYoKHNjdHBfc2soc2spKS0+ZXAtPmFzb2NzKSkgeworCQlhc29jID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uLCBhc29jcyk7CisJCV9fc2N0cF93cml0ZV9zcGFjZShhc29jKTsKKwl9Cit9CisKKy8qIElzIHRoZXJlIGFueSBzbmRidWYgc3BhY2UgYXZhaWxhYmxlIG9uIHRoZSBzb2NrZXQ/CisgKgorICogTm90ZSB0aGF0IHdtZW1fcXVldWVkIGlzIHRoZSBzdW0gb2YgdGhlIHNlbmQgYnVmZmVycyBvbiBhbGwgb2YgdGhlCisgKiBhc3NvY2lhdGlvbnMgb24gdGhlIHNhbWUgc29ja2V0LiAgRm9yIGEgVURQLXN0eWxlIHNvY2tldCB3aXRoCisgKiBtdWx0aXBsZSBhc3NvY2lhdGlvbnMsIGl0IGlzIHBvc3NpYmxlIGZvciBpdCB0byBiZSAidW53cml0ZWFibGUiCisgKiBwcmVtYXR1cmVseS4gIEkgYXNzdW1lIHRoYXQgdGhpcyBpcyBhY2NlcHRhYmxlIGJlY2F1c2UKKyAqIGEgcHJlbWF0dXJlICJ1bndyaXRlYWJsZSIgaXMgYmV0dGVyIHRoYW4gYW4gYWNjaWRlbnRhbCAid3JpdGVhYmxlIiB3aGljaAorICogd291bGQgY2F1c2UgYW4gdW53YW50ZWQgYmxvY2sgdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzLiAgRm9yIHRoZSAxLTEKKyAqIFVEUC1zdHlsZSBzb2NrZXRzIG9yIFRDUC1zdHlsZSBzb2NrZXRzLCB0aGlzIGNvZGUgc2hvdWxkIHdvcmsuCisgKiAgLSBEYWlzeQorICovCitzdGF0aWMgaW50IHNjdHBfd3JpdGVhYmxlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlpbnQgYW10ID0gMDsKKworCWFtdCA9IHNrLT5za19zbmRidWYgLSBzay0+c2tfd21lbV9xdWV1ZWQ7CisJaWYgKGFtdCA8IDApCisJCWFtdCA9IDA7CisJcmV0dXJuIGFtdDsKK30KKworLyogV2FpdCBmb3IgYW4gYXNzb2NpYXRpb24gdG8gZ28gaW50byBFU1RBQkxJU0hFRCBzdGF0ZS4gSWYgdGltZW91dCBpcyAwLAorICogcmV0dXJucyBpbW1lZGlhdGVseSB3aXRoIEVJTlBST0dSRVNTLgorICovCitzdGF0aWMgaW50IHNjdHBfd2FpdF9mb3JfY29ubmVjdChzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywgbG9uZyAqdGltZW9fcCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBhc29jLT5iYXNlLnNrOworCWludCBlcnIgPSAwOworCWxvbmcgY3VycmVudF90aW1lbyA9ICp0aW1lb19wOworCURFRklORV9XQUlUKHdhaXQpOworCisJU0NUUF9ERUJVR19QUklOVEsoIiVzOiBhc29jPSVwLCB0aW1lbz0lbGRcbiIsIF9fRlVOQ1RJT05fXywgYXNvYywKKwkJCSAgKGxvbmcpKCp0aW1lb19wKSk7CisKKwkvKiBJbmNyZW1lbnQgdGhlIGFzc29jaWF0aW9uJ3MgcmVmY250LiAgKi8KKwlzY3RwX2Fzc29jaWF0aW9uX2hvbGQoYXNvYyk7CisKKwlmb3IgKDs7KSB7CisJCXByZXBhcmVfdG9fd2FpdF9leGNsdXNpdmUoJmFzb2MtPndhaXQsICZ3YWl0LAorCQkJCQkgIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmICghKnRpbWVvX3ApCisJCQlnb3RvIGRvX25vbmJsb2NrOworCQlpZiAoc2stPnNrX3NodXRkb3duICYgUkNWX1NIVVRET1dOKQorCQkJYnJlYWs7CisJCWlmIChzay0+c2tfZXJyIHx8IGFzb2MtPnN0YXRlID49IFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyB8fAorCQkgICAgYXNvYy0+YmFzZS5kZWFkKQorCQkJZ290byBkb19lcnJvcjsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJZ290byBkb19pbnRlcnJ1cHRlZDsKKworCQlpZiAoc2N0cF9zdGF0ZShhc29jLCBFU1RBQkxJU0hFRCkpCisJCQlicmVhazsKKworCQkvKiBMZXQgYW5vdGhlciBwcm9jZXNzIGhhdmUgYSBnby4gIFNpbmNlIHdlIGFyZSBnb2luZworCQkgKiB0byBzbGVlcCBhbnl3YXkuCisJCSAqLworCQlzY3RwX3JlbGVhc2Vfc29jayhzayk7CisJCWN1cnJlbnRfdGltZW8gPSBzY2hlZHVsZV90aW1lb3V0KGN1cnJlbnRfdGltZW8pOworCQlzY3RwX2xvY2tfc29jayhzayk7CisKKwkJKnRpbWVvX3AgPSBjdXJyZW50X3RpbWVvOworCX0KKworb3V0OgorCWZpbmlzaF93YWl0KCZhc29jLT53YWl0LCAmd2FpdCk7CisKKwkvKiBSZWxlYXNlIHRoZSBhc3NvY2lhdGlvbidzIHJlZmNudC4gICovCisJc2N0cF9hc3NvY2lhdGlvbl9wdXQoYXNvYyk7CisKKwlyZXR1cm4gZXJyOworCitkb19lcnJvcjoKKwlpZiAoYXNvYy0+Y291bnRlcnNbU0NUUF9DT1VOVEVSX0lOSVRfRVJST1JdICsgMSA+PQorCQkJCQkgCWFzb2MtPm1heF9pbml0X2F0dGVtcHRzKQorCQllcnIgPSAtRVRJTUVET1VUOworCWVsc2UKKwkJZXJyID0gLUVDT05OUkVGVVNFRDsKKwlnb3RvIG91dDsKKworZG9faW50ZXJydXB0ZWQ6CisJZXJyID0gc29ja19pbnRyX2Vycm5vKCp0aW1lb19wKTsKKwlnb3RvIG91dDsKKworZG9fbm9uYmxvY2s6CisJZXJyID0gLUVJTlBST0dSRVNTOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50IHNjdHBfd2FpdF9mb3JfYWNjZXB0KHN0cnVjdCBzb2NrICpzaywgbG9uZyB0aW1lbykKK3sKKwlzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXA7CisJaW50IGVyciA9IDA7CisJREVGSU5FX1dBSVQod2FpdCk7CisKKwllcCA9IHNjdHBfc2soc2spLT5lcDsKKworCisJZm9yICg7OykgeworCQlwcmVwYXJlX3RvX3dhaXRfZXhjbHVzaXZlKHNrLT5za19zbGVlcCwgJndhaXQsCisJCQkJCSAgVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQlpZiAobGlzdF9lbXB0eSgmZXAtPmFzb2NzKSkgeworCQkJc2N0cF9yZWxlYXNlX3NvY2soc2spOworCQkJdGltZW8gPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvKTsKKwkJCXNjdHBfbG9ja19zb2NrKHNrKTsKKwkJfQorCisJCWVyciA9IC1FSU5WQUw7CisJCWlmICghc2N0cF9zc3RhdGUoc2ssIExJU1RFTklORykpCisJCQlicmVhazsKKworCQllcnIgPSAwOworCQlpZiAoIWxpc3RfZW1wdHkoJmVwLT5hc29jcykpCisJCQlicmVhazsKKworCQllcnIgPSBzb2NrX2ludHJfZXJybm8odGltZW8pOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKworCQllcnIgPSAtRUFHQUlOOworCQlpZiAoIXRpbWVvKQorCQkJYnJlYWs7CisJfQorCisJZmluaXNoX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIHNjdHBfd2FpdF9mb3JfY2xvc2Uoc3RydWN0IHNvY2sgKnNrLCBsb25nIHRpbWVvdXQpCit7CisJREVGSU5FX1dBSVQod2FpdCk7CisKKwlkbyB7CisJCXByZXBhcmVfdG9fd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCQlpZiAobGlzdF9lbXB0eSgmc2N0cF9zayhzayktPmVwLT5hc29jcykpCisJCQlicmVhazsKKwkJc2N0cF9yZWxlYXNlX3NvY2soc2spOworCQl0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKwkJc2N0cF9sb2NrX3NvY2soc2spOworCX0gd2hpbGUgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSAmJiB0aW1lb3V0KTsKKworCWZpbmlzaF93YWl0KHNrLT5za19zbGVlcCwgJndhaXQpOworfQorCisvKiBQb3B1bGF0ZSB0aGUgZmllbGRzIG9mIHRoZSBuZXdzayBmcm9tIHRoZSBvbGRzayBhbmQgbWlncmF0ZSB0aGUgYXNzb2MKKyAqIGFuZCBpdHMgbWVzc2FnZXMgdG8gdGhlIG5ld3NrLgorICovCitzdGF0aWMgdm9pZCBzY3RwX3NvY2tfbWlncmF0ZShzdHJ1Y3Qgc29jayAqb2xkc2ssIHN0cnVjdCBzb2NrICpuZXdzaywKKwkJCSAgICAgIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc3NvYywKKwkJCSAgICAgIHNjdHBfc29ja2V0X3R5cGVfdCB0eXBlKQoreworCXN0cnVjdCBzY3RwX3NvY2sgKm9sZHNwID0gc2N0cF9zayhvbGRzayk7CisJc3RydWN0IHNjdHBfc29jayAqbmV3c3AgPSBzY3RwX3NrKG5ld3NrKTsKKwlzdHJ1Y3Qgc2N0cF9iaW5kX2J1Y2tldCAqcHA7IC8qIGhhc2ggbGlzdCBwb3J0IGl0ZXJhdG9yICovCisJc3RydWN0IHNjdHBfZW5kcG9pbnQgKm5ld2VwID0gbmV3c3AtPmVwOworCXN0cnVjdCBza19idWZmICpza2IsICp0bXA7CisJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50OworCisJLyogTWlncmF0ZSBzb2NrZXQgYnVmZmVyIHNpemVzIGFuZCBhbGwgdGhlIHNvY2tldCBsZXZlbCBvcHRpb25zIHRvIHRoZQorCSAqIG5ldyBzb2NrZXQuCisJICovCisJbmV3c2stPnNrX3NuZGJ1ZiA9IG9sZHNrLT5za19zbmRidWY7CisJbmV3c2stPnNrX3JjdmJ1ZiA9IG9sZHNrLT5za19yY3ZidWY7CisJLyogQnJ1dGUgZm9yY2UgY29weSBvbGQgc2N0cCBvcHQuICovCisJaW5ldF9za19jb3B5X2Rlc2NlbmRhbnQobmV3c2ssIG9sZHNrKTsKKworCS8qIFJlc3RvcmUgdGhlIGVwIHZhbHVlIHRoYXQgd2FzIG92ZXJ3cml0dGVuIHdpdGggdGhlIGFib3ZlIHN0cnVjdHVyZQorCSAqIGNvcHkuCisJICovCisJbmV3c3AtPmVwID0gbmV3ZXA7CisJbmV3c3AtPmhtYWMgPSBOVUxMOworCisJLyogSG9vayB0aGlzIG5ldyBzb2NrZXQgaW4gdG8gdGhlIGJpbmRfaGFzaCBsaXN0LiAqLworCXBwID0gc2N0cF9zayhvbGRzayktPmJpbmRfaGFzaDsKKwlza19hZGRfYmluZF9ub2RlKG5ld3NrLCAmcHAtPm93bmVyKTsKKwlzY3RwX3NrKG5ld3NrKS0+YmluZF9oYXNoID0gcHA7CisJaW5ldF9zayhuZXdzayktPm51bSA9IGluZXRfc2sob2xkc2spLT5udW07CisKKwkvKiBNb3ZlIGFueSBtZXNzYWdlcyBpbiB0aGUgb2xkIHNvY2tldCdzIHJlY2VpdmUgcXVldWUgdGhhdCBhcmUgZm9yIHRoZQorCSAqIHBlZWxlZCBvZmYgYXNzb2NpYXRpb24gdG8gdGhlIG5ldyBzb2NrZXQncyByZWNlaXZlIHF1ZXVlLgorCSAqLworCXNjdHBfc2tiX2Zvcl9lYWNoKHNrYiwgJm9sZHNrLT5za19yZWNlaXZlX3F1ZXVlLCB0bXApIHsKKwkJZXZlbnQgPSBzY3RwX3NrYjJldmVudChza2IpOworCQlpZiAoZXZlbnQtPmFzb2MgPT0gYXNzb2MpIHsKKwkJCV9fc2tiX3VubGluayhza2IsIHNrYi0+bGlzdCk7CisJCQlfX3NrYl9xdWV1ZV90YWlsKCZuZXdzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKKwkJfQorCX0KKworCS8qIENsZWFuIHVwIGFueSBtZXNzYWdlcyBwZW5kaW5nIGRlbGl2ZXJ5IGR1ZSB0byBwYXJ0aWFsCisJICogZGVsaXZlcnkuICAgVGhyZWUgY2FzZXM6CisJICogMSkgTm8gcGFydGlhbCBkZWxpdmVyOyAgbm8gd29yay4KKwkgKiAyKSBQZWVsaW5nIG9mZiBwYXJ0aWFsIGRlbGl2ZXJ5OyBrZWVwIHBkX2xvYmJ5IGluIG5ldyBwZF9sb2JieS4KKwkgKiAzKSBQZWVsaW5nIG9mZiBub24tcGFydGlhbCBkZWxpdmVyeTsgbW92ZSBwZF9sb2JieSB0byByZWNlaXZlX3F1ZXVlLgorCSAqLworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJm5ld3NwLT5wZF9sb2JieSk7CisJc2N0cF9zayhuZXdzayktPnBkX21vZGUgPSBhc3NvYy0+dWxwcS5wZF9tb2RlOworCisJaWYgKHNjdHBfc2sob2xkc2spLT5wZF9tb2RlKSB7CisJCXN0cnVjdCBza19idWZmX2hlYWQgKnF1ZXVlOworCisJCS8qIERlY2lkZSB3aGljaCBxdWV1ZSB0byBtb3ZlIHBkX2xvYmJ5IHNrYnMgdG8uICovCisJCWlmIChhc3NvYy0+dWxwcS5wZF9tb2RlKSB7CisJCQlxdWV1ZSA9ICZuZXdzcC0+cGRfbG9iYnk7CisJCX0gZWxzZQorCQkJcXVldWUgPSAmbmV3c2stPnNrX3JlY2VpdmVfcXVldWU7CisKKwkJLyogV2FsayB0aHJvdWdoIHRoZSBwZF9sb2JieSwgbG9va2luZyBmb3Igc2ticyB0aGF0CisJCSAqIG5lZWQgbW92ZWQgdG8gdGhlIG5ldyBzb2NrZXQuCisJCSAqLworCQlzY3RwX3NrYl9mb3JfZWFjaChza2IsICZvbGRzcC0+cGRfbG9iYnksIHRtcCkgeworCQkJZXZlbnQgPSBzY3RwX3NrYjJldmVudChza2IpOworCQkJaWYgKGV2ZW50LT5hc29jID09IGFzc29jKSB7CisJCQkJX19za2JfdW5saW5rKHNrYiwgc2tiLT5saXN0KTsKKwkJCQlfX3NrYl9xdWV1ZV90YWlsKHF1ZXVlLCBza2IpOworCQkJfQorCQl9CisKKwkJLyogQ2xlYXIgdXAgYW55IHNrYnMgd2FpdGluZyBmb3IgdGhlIHBhcnRpYWwKKwkJICogZGVsaXZlcnkgdG8gZmluaXNoLgorCQkgKi8KKwkJaWYgKGFzc29jLT51bHBxLnBkX21vZGUpCisJCQlzY3RwX2NsZWFyX3BkKG9sZHNrKTsKKworCX0KKworCS8qIFNldCB0aGUgdHlwZSBvZiBzb2NrZXQgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBwZWVsZWQgb2ZmIGZyb20gdGhlCisJICogb3JpZ2luYWwgVURQLXN0eWxlIHNvY2tldCBvciBjcmVhdGVkIHdpdGggdGhlIGFjY2VwdCgpIGNhbGwgb24gYQorCSAqIFRDUC1zdHlsZSBzb2NrZXQuLgorCSAqLworCW5ld3NwLT50eXBlID0gdHlwZTsKKworCS8qIE1pZ3JhdGUgdGhlIGFzc29jaWF0aW9uIHRvIHRoZSBuZXcgc29ja2V0LiAqLworCXNjdHBfYXNzb2NfbWlncmF0ZShhc3NvYywgbmV3c2spOworCisJLyogSWYgdGhlIGFzc29jaWF0aW9uIG9uIHRoZSBuZXdzayBpcyBhbHJlYWR5IGNsb3NlZCBiZWZvcmUgYWNjZXB0KCkKKwkgKiBpcyBjYWxsZWQsIHNldCBSQ1ZfU0hVVERPV04gZmxhZy4KKwkgKi8KKwlpZiAoc2N0cF9zdGF0ZShhc3NvYywgQ0xPU0VEKSAmJiBzY3RwX3N0eWxlKG5ld3NrLCBUQ1ApKQorCQluZXdzay0+c2tfc2h1dGRvd24gfD0gUkNWX1NIVVRET1dOOworCisJbmV3c2stPnNrX3N0YXRlID0gU0NUUF9TU19FU1RBQkxJU0hFRDsKK30KKworLyogVGhpcyBwcm90byBzdHJ1Y3QgZGVzY3JpYmVzIHRoZSBVTFAgaW50ZXJmYWNlIGZvciBTQ1RQLiAgKi8KK3N0cnVjdCBwcm90byBzY3RwX3Byb3QgPSB7CisJLm5hbWUgICAgICAgID0JIlNDVFAiLAorCS5vd25lciAgICAgICA9CVRISVNfTU9EVUxFLAorCS5jbG9zZSAgICAgICA9CXNjdHBfY2xvc2UsCisJLmNvbm5lY3QgICAgID0Jc2N0cF9jb25uZWN0LAorCS5kaXNjb25uZWN0ICA9CXNjdHBfZGlzY29ubmVjdCwKKwkuYWNjZXB0ICAgICAgPQlzY3RwX2FjY2VwdCwKKwkuaW9jdGwgICAgICAgPQlzY3RwX2lvY3RsLAorCS5pbml0ICAgICAgICA9CXNjdHBfaW5pdF9zb2NrLAorCS5kZXN0cm95ICAgICA9CXNjdHBfZGVzdHJveV9zb2NrLAorCS5zaHV0ZG93biAgICA9CXNjdHBfc2h1dGRvd24sCisJLnNldHNvY2tvcHQgID0Jc2N0cF9zZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0ICA9CXNjdHBfZ2V0c29ja29wdCwKKwkuc2VuZG1zZyAgICAgPQlzY3RwX3NlbmRtc2csCisJLnJlY3Ztc2cgICAgID0Jc2N0cF9yZWN2bXNnLAorCS5iaW5kICAgICAgICA9CXNjdHBfYmluZCwKKwkuYmFja2xvZ19yY3YgPQlzY3RwX2JhY2tsb2dfcmN2LAorCS5oYXNoICAgICAgICA9CXNjdHBfaGFzaCwKKwkudW5oYXNoICAgICAgPQlzY3RwX3VuaGFzaCwKKwkuZ2V0X3BvcnQgICAgPQlzY3RwX2dldF9wb3J0LAorCS5vYmpfc2l6ZSAgICA9ICBzaXplb2Yoc3RydWN0IHNjdHBfc29jayksCit9OworCisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCitzdHJ1Y3QgcHJvdG8gc2N0cHY2X3Byb3QgPSB7CisJLm5hbWUJCT0gIlNDVFB2NiIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5jbG9zZQkJPSBzY3RwX2Nsb3NlLAorCS5jb25uZWN0CT0gc2N0cF9jb25uZWN0LAorCS5kaXNjb25uZWN0CT0gc2N0cF9kaXNjb25uZWN0LAorCS5hY2NlcHQJCT0gc2N0cF9hY2NlcHQsCisJLmlvY3RsCQk9IHNjdHBfaW9jdGwsCisJLmluaXQJCT0gc2N0cF9pbml0X3NvY2ssCisJLmRlc3Ryb3kJPSBzY3RwX2Rlc3Ryb3lfc29jaywKKwkuc2h1dGRvd24JPSBzY3RwX3NodXRkb3duLAorCS5zZXRzb2Nrb3B0CT0gc2N0cF9zZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0CT0gc2N0cF9nZXRzb2Nrb3B0LAorCS5zZW5kbXNnCT0gc2N0cF9zZW5kbXNnLAorCS5yZWN2bXNnCT0gc2N0cF9yZWN2bXNnLAorCS5iaW5kCQk9IHNjdHBfYmluZCwKKwkuYmFja2xvZ19yY3YJPSBzY3RwX2JhY2tsb2dfcmN2LAorCS5oYXNoCQk9IHNjdHBfaGFzaCwKKwkudW5oYXNoCQk9IHNjdHBfdW5oYXNoLAorCS5nZXRfcG9ydAk9IHNjdHBfZ2V0X3BvcnQsCisJLm9ial9zaXplCT0gc2l6ZW9mKHN0cnVjdCBzY3RwNl9zb2NrKSwKK307CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpICovCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zc25tYXAuYyBiL25ldC9zY3RwL3Nzbm1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MjdkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2N0cC9zc25tYXAuYwpAQCAtMCwwICsxLDEzMSBAQAorLyogU0NUUCBrZXJuZWwgcmVmZXJlbmNlIEltcGxlbWVudGF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcywgQ29ycC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgU0NUUCBrZXJuZWwgcmVmZXJlbmNlIEltcGxlbWVudGF0aW9uCisgKgorICogVGhlc2UgZnVuY3Rpb25zIG1hbmlwdWxhdGUgc2N0cCBTU04gdHJhY2tlci4KKyAqCisgKiBUaGUgU0NUUCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgU0NUUCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogV3JpdHRlbiBvciBtb2RpZmllZCBieToKKyAqICAgIEpvbiBHcmltbSAgICAgICAgICAgICA8amdyaW1tQHVzLmlibS5jb20+CisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgZ2l2ZW4gdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPG5ldC9zY3RwL3NjdHAuaD4KKyNpbmNsdWRlIDxuZXQvc2N0cC9zbS5oPgorCisjZGVmaW5lIE1BWF9LTUFMTE9DX1NJWkUJMTMxMDcyCisKK3N0YXRpYyBzdHJ1Y3Qgc2N0cF9zc25tYXAgKnNjdHBfc3NubWFwX2luaXQoc3RydWN0IHNjdHBfc3NubWFwICptYXAsIF9fdTE2IGluLAorCQkJCQkgICAgX191MTYgb3V0KTsKKworLyogU3RvcmFnZSBzaXplIG5lZWRlZCBmb3IgbWFwIGluY2x1ZGVzIDIgaGVhZGVycyBhbmQgdGhlbiB0aGUKKyAqIHNwZWNpZmljIG5lZWRzIG9mIGluIG9yIG91dCBzdHJlYW1zLgorICovCitzdGF0aWMgaW5saW5lIHNpemVfdCBzY3RwX3Nzbm1hcF9zaXplKF9fdTE2IGluLCBfX3UxNiBvdXQpCit7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3Qgc2N0cF9zc25tYXApICsgKGluICsgb3V0KSAqIHNpemVvZihfX3UxNik7Cit9CisKKworLyogQ3JlYXRlIGEgbmV3IHNjdHBfc3NubWFwLgorICogQWxsb2NhdGUgcm9vbSB0byBzdG9yZSBhdCBsZWFzdCAnbGVuJyBjb250aWd1b3VzIFRTTnMuCisgKi8KK3N0cnVjdCBzY3RwX3Nzbm1hcCAqc2N0cF9zc25tYXBfbmV3KF9fdTE2IGluLCBfX3UxNiBvdXQsIGludCBnZnApCit7CisJc3RydWN0IHNjdHBfc3NubWFwICpyZXR2YWw7CisJaW50IHNpemU7CisKKwlzaXplID0gc2N0cF9zc25tYXBfc2l6ZShpbiwgb3V0KTsKKwlpZiAoc2l6ZSA8PSBNQVhfS01BTExPQ19TSVpFKQorCQlyZXR2YWwgPSBrbWFsbG9jKHNpemUsIGdmcCk7CisJZWxzZQorCQlyZXR2YWwgPSAoc3RydWN0IHNjdHBfc3NubWFwICopCisJCQkgIF9fZ2V0X2ZyZWVfcGFnZXMoZ2ZwLCBnZXRfb3JkZXIoc2l6ZSkpOworCWlmICghcmV0dmFsKQorCQlnb3RvIGZhaWw7CisKKwlpZiAoIXNjdHBfc3NubWFwX2luaXQocmV0dmFsLCBpbiwgb3V0KSkKKwkJZ290byBmYWlsX21hcDsKKworCXJldHZhbC0+bWFsbG9jZWQgPSAxOworCVNDVFBfREJHX09CSkNOVF9JTkMoc3NubWFwKTsKKworCXJldHVybiByZXR2YWw7CisKK2ZhaWxfbWFwOgorCWlmIChzaXplIDw9IE1BWF9LTUFMTE9DX1NJWkUpCisJCWtmcmVlKHJldHZhbCk7CisJZWxzZQorCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXJldHZhbCwgZ2V0X29yZGVyKHNpemUpKTsKK2ZhaWw6CisJcmV0dXJuIE5VTEw7Cit9CisKKworLyogSW5pdGlhbGl6ZSBhIGJsb2NrIG9mIG1lbW9yeSBhcyBhIHNzbm1hcC4gICovCitzdGF0aWMgc3RydWN0IHNjdHBfc3NubWFwICpzY3RwX3Nzbm1hcF9pbml0KHN0cnVjdCBzY3RwX3Nzbm1hcCAqbWFwLCBfX3UxNiBpbiwKKwkJCQkJICAgIF9fdTE2IG91dCkKK3sKKwltZW1zZXQobWFwLCAweDAwLCBzY3RwX3Nzbm1hcF9zaXplKGluLCBvdXQpKTsKKworCS8qIFN0YXJ0ICdpbicgc3RyZWFtIGp1c3QgYWZ0ZXIgdGhlIG1hcCBoZWFkZXIuICovCisJbWFwLT5pbi5zc24gPSAoX191MTYgKikmbWFwWzFdOworCW1hcC0+aW4ubGVuID0gaW47CisKKwkvKiBTdGFydCAnb3V0JyBzdHJlYW0ganVzdCBhZnRlciAnaW4nLiAqLworCW1hcC0+b3V0LnNzbiA9ICZtYXAtPmluLnNzbltpbl07CisJbWFwLT5vdXQubGVuID0gb3V0OworCisJcmV0dXJuIG1hcDsKK30KKworLyogQ2xlYXIgb3V0IHRoZSBzc25tYXAgc3RyZWFtcy4gICovCit2b2lkIHNjdHBfc3NubWFwX2NsZWFyKHN0cnVjdCBzY3RwX3Nzbm1hcCAqbWFwKQoreworCXNpemVfdCBzaXplOworCisJc2l6ZSA9IChtYXAtPmluLmxlbiArIG1hcC0+b3V0LmxlbikgKiBzaXplb2YoX191MTYpOworCW1lbXNldChtYXAtPmluLnNzbiwgMHgwMCwgc2l6ZSk7Cit9CisKKy8qIERpc3Bvc2Ugb2YgYSBzc25tYXAuICAqLwordm9pZCBzY3RwX3Nzbm1hcF9mcmVlKHN0cnVjdCBzY3RwX3Nzbm1hcCAqbWFwKQoreworCWlmIChtYXAgJiYgbWFwLT5tYWxsb2NlZCkgeworCQlpbnQgc2l6ZTsKKworCQlzaXplID0gc2N0cF9zc25tYXBfc2l6ZShtYXAtPmluLmxlbiwgbWFwLT5vdXQubGVuKTsKKwkJaWYgKHNpemUgPD0gTUFYX0tNQUxMT0NfU0laRSkKKwkJCWtmcmVlKG1hcCk7CisJCWVsc2UKKwkJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpbWFwLCBnZXRfb3JkZXIoc2l6ZSkpOworCQlTQ1RQX0RCR19PQkpDTlRfREVDKHNzbm1hcCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc3lzY3RsLmMgYi9uZXQvc2N0cC9zeXNjdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWZhMjBjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjdHAvc3lzY3RsLmMKQEAgLTAsMCArMSwyNTEgQEAKKy8qIFNDVFAga2VybmVsIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwNAorICogQ29weXJpZ2h0IChjKSAyMDAyIEludGVsIENvcnAuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFNDVFAga2VybmVsIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbgorICoKKyAqIFN5c2N0bCByZWxhdGVkIGludGVyZmFjZXMgZm9yIFNDVFAuCisgKgorICogVGhlIFNDVFAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQKKyAqIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICogICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBQbGVhc2Ugc2VuZCBhbnkgYnVnIHJlcG9ydHMgb3IgZml4ZXMgeW91IG1ha2UgdG8gdGhlCisgKiBlbWFpbCBhZGRyZXNzKGVzKToKKyAqICAgIGxrc2N0cCBkZXZlbG9wZXJzIDxsa3NjdHAtZGV2ZWxvcGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogT3Igc3VibWl0IGEgYnVnIHJlcG9ydCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgd2Vic2l0ZToKKyAqICAgIGh0dHA6Ly93d3cuc2YubmV0L3Byb2plY3RzL2xrc2N0cAorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiAgICBNaW5ncWluIExpdSAgICAgICAgICAgPGxpdW1pbmdAdXMuaWJtLmNvbT4KKyAqICAgIEpvbiBHcmltbSAgICAgICAgICAgICA8amdyaW1tQHVzLmlibS5jb20+CisgKiAgICBBcmRlbGxlIEZhbiAgICAgICAgICAgPGFyZGVsbGUuZmFuQGludGVsLmNvbT4KKyAqICAgIFJ5YW4gTGF5ZXIgICAgICAgICAgICA8cm1sYXllckB1cy5pYm0uY29tPgorICogICAgU3JpZGhhciBTYW11ZHJhbGEgICAgIDxzcmlAdXMuaWJtLmNvbT4KKyAqCisgKiBBbnkgYnVncyByZXBvcnRlZCBnaXZlbiB0byB1cyB3ZSB3aWxsIHRyeSB0byBmaXguLi4gYW55IGZpeGVzIHNoYXJlZCB3aWxsCisgKiBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbmV4dCBTQ1RQIHJlbGVhc2UuCisgKi8KKworI2luY2x1ZGUgPG5ldC9zY3RwL3N0cnVjdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKworc3RhdGljIGN0bF9oYW5kbGVyIHNjdHBfc3lzY3RsX2ppZmZpZXNfbXM7CitzdGF0aWMgbG9uZyBydG9fdGltZXJfbWluID0gMTsKK3N0YXRpYyBsb25nIHJ0b190aW1lcl9tYXggPSA4NjQwMDAwMDsgLyogT25lIGRheSAqLworCitzdGF0aWMgY3RsX3RhYmxlIHNjdHBfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9TQ1RQX1JUT19JTklUSUFMLAorCQkucHJvY25hbWUJPSAicnRvX2luaXRpYWwiLAorCQkuZGF0YQkJPSAmc2N0cF9ydG9faW5pdGlhbCwKKwkJLm1heGxlbgkJPSBzaXplb2YobG9uZyksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb3Vsb25ndmVjX21zX2ppZmZpZXNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc2N0cF9zeXNjdGxfamlmZmllc19tcywKKwkJLmV4dHJhMSAgICAgICAgID0gJnJ0b190aW1lcl9taW4sCisJCS5leHRyYTIgICAgICAgICA9ICZydG9fdGltZXJfbWF4CisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9TQ1RQX1JUT19NSU4sCisJCS5wcm9jbmFtZQk9ICJydG9fbWluIiwKKwkJLmRhdGEJCT0gJnNjdHBfcnRvX21pbiwKKwkJLm1heGxlbgkJPSBzaXplb2YobG9uZyksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb3Vsb25ndmVjX21zX2ppZmZpZXNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc2N0cF9zeXNjdGxfamlmZmllc19tcywKKwkJLmV4dHJhMSAgICAgICAgID0gJnJ0b190aW1lcl9taW4sCisJCS5leHRyYTIgICAgICAgICA9ICZydG9fdGltZXJfbWF4CisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9TQ1RQX1JUT19NQVgsCisJCS5wcm9jbmFtZQk9ICJydG9fbWF4IiwKKwkJLmRhdGEJCT0gJnNjdHBfcnRvX21heCwKKwkJLm1heGxlbgkJPSBzaXplb2YobG9uZyksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb3Vsb25ndmVjX21zX2ppZmZpZXNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc2N0cF9zeXNjdGxfamlmZmllc19tcywKKwkJLmV4dHJhMSAgICAgICAgID0gJnJ0b190aW1lcl9taW4sCisJCS5leHRyYTIgICAgICAgICA9ICZydG9fdGltZXJfbWF4CisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9TQ1RQX1ZBTElEX0NPT0tJRV9MSUZFLAorCQkucHJvY25hbWUJPSAidmFsaWRfY29va2llX2xpZmUiLAorCQkuZGF0YQkJPSAmc2N0cF92YWxpZF9jb29raWVfbGlmZSwKKwkJLm1heGxlbgkJPSBzaXplb2YobG9uZyksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb3Vsb25ndmVjX21zX2ppZmZpZXNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc2N0cF9zeXNjdGxfamlmZmllc19tcywKKwkJLmV4dHJhMSAgICAgICAgID0gJnJ0b190aW1lcl9taW4sCisJCS5leHRyYTIgICAgICAgICA9ICZydG9fdGltZXJfbWF4CisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9TQ1RQX01BWF9CVVJTVCwKKwkJLnByb2NuYW1lCT0gIm1heF9idXJzdCIsCisJCS5kYXRhCQk9ICZzY3RwX21heF9idXJzdCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9TQ1RQX0FTU09DSUFUSU9OX01BWF9SRVRSQU5TLAorCQkucHJvY25hbWUJPSAiYXNzb2NpYXRpb25fbWF4X3JldHJhbnMiLAorCQkuZGF0YQkJPSAmc2N0cF9tYXhfcmV0cmFuc19hc3NvY2lhdGlvbiwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9TQ1RQX1BBVEhfTUFYX1JFVFJBTlMsCisJCS5wcm9jbmFtZQk9ICJwYXRoX21heF9yZXRyYW5zIiwKKwkJLmRhdGEJCT0gJnNjdHBfbWF4X3JldHJhbnNfcGF0aCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9TQ1RQX01BWF9JTklUX1JFVFJBTlNNSVRTLAorCQkucHJvY25hbWUJPSAibWF4X2luaXRfcmV0cmFuc21pdHMiLAorCQkuZGF0YQkJPSAmc2N0cF9tYXhfcmV0cmFuc19pbml0LAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX1NDVFBfSEJfSU5URVJWQUwsCisJCS5wcm9jbmFtZQk9ICJoYl9pbnRlcnZhbCIsCisJCS5kYXRhCQk9ICZzY3RwX2hiX2ludGVydmFsLAorCQkubWF4bGVuCQk9IHNpemVvZihsb25nKSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvdWxvbmd2ZWNfbXNfamlmZmllc19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzY3RwX3N5c2N0bF9qaWZmaWVzX21zLAorCQkuZXh0cmExICAgICAgICAgPSAmcnRvX3RpbWVyX21pbiwKKwkJLmV4dHJhMiAgICAgICAgID0gJnJ0b190aW1lcl9tYXgKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX1NDVFBfUFJFU0VSVkVfRU5BQkxFLAorCQkucHJvY25hbWUJPSAiY29va2llX3ByZXNlcnZlX2VuYWJsZSIsCisJCS5kYXRhCQk9ICZzY3RwX2Nvb2tpZV9wcmVzZXJ2ZV9lbmFibGUsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGxvbmcpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG91bG9uZ3ZlY19tc19qaWZmaWVzX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnNjdHBfc3lzY3RsX2ppZmZpZXNfbXMsCisJCS5leHRyYTEgICAgICAgICA9ICZydG9fdGltZXJfbWluLAorCQkuZXh0cmEyICAgICAgICAgPSAmcnRvX3RpbWVyX21heAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfU0NUUF9SVE9fQUxQSEEsCisJCS5wcm9jbmFtZQk9ICJydG9fYWxwaGFfZXhwX2Rpdmlzb3IiLAorCQkuZGF0YQkJPSAmc2N0cF9ydG9fYWxwaGEsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfU0NUUF9SVE9fQkVUQSwKKwkJLnByb2NuYW1lCT0gInJ0b19iZXRhX2V4cF9kaXZpc29yIiwKKwkJLmRhdGEJCT0gJnNjdHBfcnRvX2JldGEsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfU0NUUF9BRERJUF9FTkFCTEUsCisJCS5wcm9jbmFtZQk9ICJhZGRpcF9lbmFibGUiLAorCQkuZGF0YQkJPSAmc2N0cF9hZGRpcF9lbmFibGUsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfU0NUUF9QUlNDVFBfRU5BQkxFLAorCQkucHJvY25hbWUJPSAicHJzY3RwX2VuYWJsZSIsCisJCS5kYXRhCQk9ICZzY3RwX3Byc2N0cF9lbmFibGUsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3N0YXRpYyBjdGxfdGFibGUgc2N0cF9uZXRfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9TQ1RQLAorCQkucHJvY25hbWUJPSAic2N0cCIsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSBzY3RwX3RhYmxlCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIGN0bF90YWJsZSBzY3RwX3Jvb3RfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9ORVQsCisJCS5wcm9jbmFtZQk9ICJuZXQiLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gc2N0cF9uZXRfdGFibGUKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKiBzY3RwX3N5c2N0bF9oZWFkZXI7CisKKy8qIFN5c2N0bCByZWdpc3RyYXRpb24uICAqLwordm9pZCBzY3RwX3N5c2N0bF9yZWdpc3Rlcih2b2lkKQoreworCXNjdHBfc3lzY3RsX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZShzY3RwX3Jvb3RfdGFibGUsIDApOworfQorCisvKiBTeXNjdGwgZGVyZWdpc3RyYXRpb24uICAqLwordm9pZCBzY3RwX3N5c2N0bF91bnJlZ2lzdGVyKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoc2N0cF9zeXNjdGxfaGVhZGVyKTsKK30KKworLyogU3RyYXRlZ3kgZnVuY3Rpb24gdG8gY29udmVydCBqaWZmaWVzIHRvIG1pbGxpc2Vjb25kcy4gICovCitzdGF0aWMgaW50IHNjdHBfc3lzY3RsX2ppZmZpZXNfbXMoY3RsX3RhYmxlICp0YWJsZSwgaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sCisJCXZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCisJCXZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4sIHZvaWQgKipjb250ZXh0KSB7CisKKwlpZiAob2xkdmFsKSB7CisJCXNpemVfdCBvbGVuOworCisJCWlmIChvbGRsZW5wKSB7CisJCQlpZiAoZ2V0X3VzZXIob2xlbiwgb2xkbGVucCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChvbGVuICE9IHNpemVvZiAoaW50KSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAocHV0X3VzZXIoKCooaW50ICopKHRhYmxlLT5kYXRhKSAqIDEwMDApIC8gSFosCisJCQkoaW50IF9fdXNlciAqKW9sZHZhbCkgfHwKKwkJICAgIChvbGRsZW5wICYmIHB1dF91c2VyKHNpemVvZiAoaW50KSwgb2xkbGVucCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWlmIChuZXd2YWwgJiYgbmV3bGVuKSB7CisJCWludCBuZXc7CisKKwkJaWYgKG5ld2xlbiAhPSBzaXplb2YgKGludCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoZ2V0X3VzZXIobmV3LCAoaW50IF9fdXNlciAqKW5ld3ZhbCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkqKGludCAqKSh0YWJsZS0+ZGF0YSkgPSAobmV3ICogSFopIC8gMTAwMDsKKwl9CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9uZXQvc2N0cC90cmFuc3BvcnQuYyBiL25ldC9zY3RwL3RyYW5zcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMDg4MmUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2N0cC90cmFuc3BvcnQuYwpAQCAtMCwwICsxLDUxNCBAQAorLyogU0NUUCBrZXJuZWwgcmVmZXJlbmNlIEltcGxlbWVudGF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMCBDaXNjbywgSW5jLgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgTW90b3JvbGEsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChjKSAyMDAxIExhIE1vbnRlIEguUC4gWWFycm9sbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBTQ1RQIGtlcm5lbCByZWZlcmVuY2UgSW1wbGVtZW50YXRpb24KKyAqCisgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB0aGUgYWJzdHJhY3Rpb24gZm9yIGFuIFNDVFAgdHJhbnBvcnQgcmVwcmVzZW50aW5nCisgKiBhIHJlbW90ZSB0cmFuc3BvcnQgYWRkcmVzcy4gIEZvciBsb2NhbCB0cmFuc3BvcnQgYWRkcmVzc2VzLCB3ZSBqdXN0IHVzZQorICogdW5pb24gc2N0cF9hZGRyLgorICoKKyAqIFRoZSBTQ1RQIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoZSBTQ1RQIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0CisgKiB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAqICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogUGxlYXNlIHNlbmQgYW55IGJ1ZyByZXBvcnRzIG9yIGZpeGVzIHlvdSBtYWtlIHRvIHRoZQorICogZW1haWwgYWRkcmVzcyhlcyk6CisgKiAgICBsa3NjdHAgZGV2ZWxvcGVycyA8bGtzY3RwLWRldmVsb3BlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIE9yIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHdlYnNpdGU6CisgKiAgICBodHRwOi8vd3d3LnNmLm5ldC9wcm9qZWN0cy9sa3NjdHAKKyAqCisgKiBXcml0dGVuIG9yIG1vZGlmaWVkIGJ5OgorICogICAgTGEgTW9udGUgSC5QLiBZYXJyb2xsIDxwaWdneUBhY20ub3JnPgorICogICAgS2FybCBLbnV0c29uICAgICAgICAgIDxrYXJsQGF0aGVuYS5jaGljYWdvLmlsLnVzPgorICogICAgSm9uIEdyaW1tICAgICAgICAgICAgIDxqZ3JpbW1AdXMuaWJtLmNvbT4KKyAqICAgIFhpbmdhbmcgR3VvICAgICAgICAgICA8eGluZ2FuZy5ndW9AaW50ZWwuY29tPgorICogICAgSHVpIEh1YW5nICAgICAgICAgICAgIDxodWkuaHVhbmdAbm9raWEuY29tPgorICogICAgU3JpZGhhciBTYW11ZHJhbGEJICAgIDxzcmlAdXMuaWJtLmNvbT4KKyAqICAgIEFyZGVsbGUgRmFuCSAgICA8YXJkZWxsZS5mYW5AaW50ZWwuY29tPgorICoKKyAqIEFueSBidWdzIHJlcG9ydGVkIGdpdmVuIHRvIHVzIHdlIHdpbGwgdHJ5IHRvIGZpeC4uLiBhbnkgZml4ZXMgc2hhcmVkIHdpbGwKKyAqIGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBuZXh0IFNDVFAgcmVsZWFzZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXQvc2N0cC9zY3RwLmg+CisjaW5jbHVkZSA8bmV0L3NjdHAvc20uaD4KKworLyogMXN0IExldmVsIEFic3RyYWN0aW9ucy4gICovCisKKy8qIEluaXRpYWxpemUgYSBuZXcgdHJhbnNwb3J0IGZyb20gcHJvdmlkZWQgbWVtb3J5LiAgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnNjdHBfdHJhbnNwb3J0X2luaXQoc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpwZWVyLAorCQkJCQkJICBjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIsCisJCQkJCQkgIGludCBnZnApCit7CisJLyogQ29weSBpbiB0aGUgYWRkcmVzcy4gICovCisJcGVlci0+aXBhZGRyID0gKmFkZHI7CisJcGVlci0+YWZfc3BlY2lmaWMgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhhZGRyLT5zYS5zYV9mYW1pbHkpOworCXBlZXItPmFzb2MgPSBOVUxMOworCisJcGVlci0+ZHN0ID0gTlVMTDsKKwltZW1zZXQoJnBlZXItPnNhZGRyLCAwLCBzaXplb2YodW5pb24gc2N0cF9hZGRyKSk7CisKKwkvKiBGcm9tIDYuMy4xIFJUTyBDYWxjdWxhdGlvbjoKKwkgKgorCSAqIEMxKSBVbnRpbCBhbiBSVFQgbWVhc3VyZW1lbnQgaGFzIGJlZW4gbWFkZSBmb3IgYSBwYWNrZXQgc2VudCB0byB0aGUKKwkgKiBnaXZlbiBkZXN0aW5hdGlvbiB0cmFuc3BvcnQgYWRkcmVzcywgc2V0IFJUTyB0byB0aGUgcHJvdG9jb2wKKwkgKiBwYXJhbWV0ZXIgJ1JUTy5Jbml0aWFsJy4KKwkgKi8KKwlwZWVyLT5ydHQgPSAwOworCXBlZXItPnJ0byA9IHNjdHBfcnRvX2luaXRpYWw7CisJcGVlci0+cnR0dmFyID0gMDsKKwlwZWVyLT5zcnR0ID0gMDsKKwlwZWVyLT5ydG9fcGVuZGluZyA9IDA7CisKKwlwZWVyLT5sYXN0X3RpbWVfaGVhcmQgPSBqaWZmaWVzOworCXBlZXItPmxhc3RfdGltZV91c2VkID0gamlmZmllczsKKwlwZWVyLT5sYXN0X3RpbWVfZWNuZV9yZWR1Y2VkID0gamlmZmllczsKKworCXBlZXItPmFjdGl2ZSA9IFNDVFBfQUNUSVZFOworCXBlZXItPmhiX2FsbG93ZWQgPSAwOworCisJLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBwYXRoIG1heF9yZXRyYW5zLiAgKi8KKwlwZWVyLT5tYXhfcmV0cmFucyA9IHNjdHBfbWF4X3JldHJhbnNfcGF0aDsKKwlwZWVyLT5lcnJvcl9jb3VudCA9IDA7CisKKwlJTklUX0xJU1RfSEVBRCgmcGVlci0+dHJhbnNtaXR0ZWQpOworCUlOSVRfTElTVF9IRUFEKCZwZWVyLT5zZW5kX3JlYWR5KTsKKwlJTklUX0xJU1RfSEVBRCgmcGVlci0+dHJhbnNwb3J0cyk7CisKKwkvKiBTZXQgdXAgdGhlIHJldHJhbnNtaXNzaW9uIHRpbWVyLiAgKi8KKwlpbml0X3RpbWVyKCZwZWVyLT5UM19ydHhfdGltZXIpOworCXBlZXItPlQzX3J0eF90aW1lci5mdW5jdGlvbiA9IHNjdHBfZ2VuZXJhdGVfdDNfcnR4X2V2ZW50OworCXBlZXItPlQzX3J0eF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcGVlcjsKKworCS8qIFNldCB1cCB0aGUgaGVhcnRiZWF0IHRpbWVyLiAqLworCWluaXRfdGltZXIoJnBlZXItPmhiX3RpbWVyKTsKKwlwZWVyLT5oYl9pbnRlcnZhbCA9IFNDVFBfREVGQVVMVF9USU1FT1VUX0hFQVJUQkVBVDsKKwlwZWVyLT5oYl90aW1lci5mdW5jdGlvbiA9IHNjdHBfZ2VuZXJhdGVfaGVhcnRiZWF0X2V2ZW50OworCXBlZXItPmhiX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwZWVyOworCisJYXRvbWljX3NldCgmcGVlci0+cmVmY250LCAxKTsKKwlwZWVyLT5kZWFkID0gMDsKKworCXBlZXItPm1hbGxvY2VkID0gMDsKKworCS8qIEluaXRpYWxpemUgdGhlIHN0YXRlIGluZm9ybWF0aW9uIGZvciBTRlItQ0FDQyAqLworCXBlZXItPmNhY2MuY2hhbmdlb3Zlcl9hY3RpdmUgPSAwOworCXBlZXItPmNhY2MuY3ljbGluZ19jaGFuZ2VvdmVyID0gMDsKKwlwZWVyLT5jYWNjLm5leHRfdHNuX2F0X2NoYW5nZSA9IDA7CisJcGVlci0+Y2FjYy5jYWNjX3Nhd19uZXdhY2sgPSAwOworCisJcmV0dXJuIHBlZXI7Cit9CisKKy8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHRyYW5zcG9ydC4gICovCitzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnNjdHBfdHJhbnNwb3J0X25ldyhjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIsIGludCBnZnApCit7CisgICAgICAgIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0OworCisgICAgICAgIHRyYW5zcG9ydCA9IHRfbmV3KHN0cnVjdCBzY3RwX3RyYW5zcG9ydCwgZ2ZwKTsKKwlpZiAoIXRyYW5zcG9ydCkKKwkJZ290byBmYWlsOworCisJaWYgKCFzY3RwX3RyYW5zcG9ydF9pbml0KHRyYW5zcG9ydCwgYWRkciwgZ2ZwKSkKKwkJZ290byBmYWlsX2luaXQ7CisKKwl0cmFuc3BvcnQtPm1hbGxvY2VkID0gMTsKKwlTQ1RQX0RCR19PQkpDTlRfSU5DKHRyYW5zcG9ydCk7CisKKwlyZXR1cm4gdHJhbnNwb3J0OworCitmYWlsX2luaXQ6CisJa2ZyZWUodHJhbnNwb3J0KTsKKworZmFpbDoKKwlyZXR1cm4gTlVMTDsKK30KKworLyogVGhpcyB0cmFuc3BvcnQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gIEZyZWUgdXAgaWYgcG9zc2libGUsIG9yCisgKiBkZWxheSB1bnRpbCBpdCBsYXN0IHJlZmVyZW5jZSBjb3VudC4KKyAqLwordm9pZCBzY3RwX3RyYW5zcG9ydF9mcmVlKHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworCXRyYW5zcG9ydC0+ZGVhZCA9IDE7CisKKwkvKiBUcnkgdG8gZGVsZXRlIHRoZSBoZWFydGJlYXQgdGltZXIuICAqLworCWlmIChkZWxfdGltZXIoJnRyYW5zcG9ydC0+aGJfdGltZXIpKQorCQlzY3RwX3RyYW5zcG9ydF9wdXQodHJhbnNwb3J0KTsKKworCS8qIERlbGV0ZSB0aGUgVDNfcnR4IHRpbWVyIGlmIGl0J3MgYWN0aXZlLgorCSAqIFRoZXJlIGlzIG5vIHBvaW50IGluIG5vdCBkb2luZyB0aGlzIG5vdyBhbmQgbGV0dGluZworCSAqIHN0cnVjdHVyZSBoYW5nIGFyb3VuZCBpbiBtZW1vcnkgc2luY2Ugd2Uga25vdworCSAqIHRoZSB0cmFucG9ydCBpcyBnb2luZyBhd2F5LgorCSAqLworCWlmICh0aW1lcl9wZW5kaW5nKCZ0cmFuc3BvcnQtPlQzX3J0eF90aW1lcikgJiYKKwkgICAgZGVsX3RpbWVyKCZ0cmFuc3BvcnQtPlQzX3J0eF90aW1lcikpCisJCXNjdHBfdHJhbnNwb3J0X3B1dCh0cmFuc3BvcnQpOworCisKKwlzY3RwX3RyYW5zcG9ydF9wdXQodHJhbnNwb3J0KTsKK30KKworLyogRGVzdHJveSB0aGUgdHJhbnNwb3J0IGRhdGEgc3RydWN0dXJlLgorICogQXNzdW1lcyB0aGVyZSBhcmUgbm8gbW9yZSB1c2VycyBvZiB0aGlzIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQgc2N0cF90cmFuc3BvcnRfZGVzdHJveShzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKwlTQ1RQX0FTU0VSVCh0cmFuc3BvcnQtPmRlYWQsICJUcmFuc3BvcnQgaXMgbm90IGRlYWQiLCByZXR1cm4pOworCisJaWYgKHRyYW5zcG9ydC0+YXNvYykKKwkJc2N0cF9hc3NvY2lhdGlvbl9wdXQodHJhbnNwb3J0LT5hc29jKTsKKworICAgICAgICBzY3RwX3BhY2tldF9mcmVlKCZ0cmFuc3BvcnQtPnBhY2tldCk7CisKKwlkc3RfcmVsZWFzZSh0cmFuc3BvcnQtPmRzdCk7CisJa2ZyZWUodHJhbnNwb3J0KTsKKwlTQ1RQX0RCR19PQkpDTlRfREVDKHRyYW5zcG9ydCk7Cit9CisKKy8qIFN0YXJ0IFQzX3J0eCB0aW1lciBpZiBpdCBpcyBub3QgYWxyZWFkeSBydW5uaW5nIGFuZCB1cGRhdGUgdGhlIGhlYXJ0YmVhdAorICogdGltZXIuICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBEQVRBIGNodW5rIGlzIHNlbnQuCisgKi8KK3ZvaWQgc2N0cF90cmFuc3BvcnRfcmVzZXRfdGltZXJzKHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworCS8qIFJGQyAyOTYwIDYuMy4yIFJldHJhbnNtaXNzaW9uIFRpbWVyIFJ1bGVzCisJICoKKwkgKiBSMSkgRXZlcnkgdGltZSBhIERBVEEgY2h1bmsgaXMgc2VudCB0byBhbnkgYWRkcmVzcyhpbmNsdWRpbmcgYQorCSAqIHJldHJhbnNtaXNzaW9uKSwgaWYgdGhlIFQzLXJ0eCB0aW1lciBvZiB0aGF0IGFkZHJlc3MgaXMgbm90IHJ1bm5pbmcKKwkgKiBzdGFydCBpdCBydW5uaW5nIHNvIHRoYXQgaXQgd2lsbCBleHBpcmUgYWZ0ZXIgdGhlIFJUTyBvZiB0aGF0CisJICogYWRkcmVzcy4KKwkgKi8KKworCWlmICghdGltZXJfcGVuZGluZygmdHJhbnNwb3J0LT5UM19ydHhfdGltZXIpKQorCQlpZiAoIW1vZF90aW1lcigmdHJhbnNwb3J0LT5UM19ydHhfdGltZXIsCisJCQkgICAgICAgamlmZmllcyArIHRyYW5zcG9ydC0+cnRvKSkKKwkJCXNjdHBfdHJhbnNwb3J0X2hvbGQodHJhbnNwb3J0KTsKKworCS8qIFdoZW4gYSBkYXRhIGNodW5rIGlzIHNlbnQsIHJlc2V0IHRoZSBoZWFydGJlYXQgaW50ZXJ2YWwuICAqLworCWlmICghbW9kX3RpbWVyKCZ0cmFuc3BvcnQtPmhiX3RpbWVyLAorCQkgICAgICAgc2N0cF90cmFuc3BvcnRfdGltZW91dCh0cmFuc3BvcnQpKSkKKwkgICAgc2N0cF90cmFuc3BvcnRfaG9sZCh0cmFuc3BvcnQpOworfQorCisvKiBUaGlzIHRyYW5zcG9ydCBoYXMgYmVlbiBhc3NpZ25lZCB0byBhbiBhc3NvY2lhdGlvbi4KKyAqIEluaXRpYWxpemUgZmllbGRzIGZyb20gdGhlIGFzc29jaWF0aW9uIG9yIGZyb20gdGhlIHNvY2sgaXRzZWxmLgorICogUmVnaXN0ZXIgdGhlIHJlZmVyZW5jZSBjb3VudCBpbiB0aGUgYXNzb2NpYXRpb24uCisgKi8KK3ZvaWQgc2N0cF90cmFuc3BvcnRfc2V0X293bmVyKHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0LAorCQkJICAgICAgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MpCit7CisJdHJhbnNwb3J0LT5hc29jID0gYXNvYzsKKwlzY3RwX2Fzc29jaWF0aW9uX2hvbGQoYXNvYyk7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIHBtdHUgb2YgYSB0cmFuc3BvcnQuICovCit2b2lkIHNjdHBfdHJhbnNwb3J0X3BtdHUoc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0OworCisJZHN0ID0gdHJhbnNwb3J0LT5hZl9zcGVjaWZpYy0+Z2V0X2RzdChOVUxMLCAmdHJhbnNwb3J0LT5pcGFkZHIsIE5VTEwpOworCisJaWYgKGRzdCkgeworCQl0cmFuc3BvcnQtPnBtdHUgPSBkc3RfbXR1KGRzdCk7CisJCWRzdF9yZWxlYXNlKGRzdCk7CisJfSBlbHNlCisJCXRyYW5zcG9ydC0+cG10dSA9IFNDVFBfREVGQVVMVF9NQVhTRUdNRU5UOworfQorCisvKiBDYWNoZXMgdGhlIGRzdCBlbnRyeSBhbmQgc291cmNlIGFkZHJlc3MgZm9yIGEgdHJhbnNwb3J0J3MgZGVzdGluYXRpb24KKyAqIGFkZHJlc3MuCisgKi8KK3ZvaWQgc2N0cF90cmFuc3BvcnRfcm91dGUoc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQsCisJCQkgIHVuaW9uIHNjdHBfYWRkciAqc2FkZHIsIHN0cnVjdCBzY3RwX3NvY2sgKm9wdCkKK3sKKwlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYyA9IHRyYW5zcG9ydC0+YXNvYzsKKwlzdHJ1Y3Qgc2N0cF9hZiAqYWYgPSB0cmFuc3BvcnQtPmFmX3NwZWNpZmljOworCXVuaW9uIHNjdHBfYWRkciAqZGFkZHIgPSAmdHJhbnNwb3J0LT5pcGFkZHI7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0OworCisJZHN0ID0gYWYtPmdldF9kc3QoYXNvYywgZGFkZHIsIHNhZGRyKTsKKworCWlmIChzYWRkcikKKwkJbWVtY3B5KCZ0cmFuc3BvcnQtPnNhZGRyLCBzYWRkciwgc2l6ZW9mKHVuaW9uIHNjdHBfYWRkcikpOworCWVsc2UKKwkJYWYtPmdldF9zYWRkcihhc29jLCBkc3QsIGRhZGRyLCAmdHJhbnNwb3J0LT5zYWRkcik7CisKKwl0cmFuc3BvcnQtPmRzdCA9IGRzdDsKKwlpZiAoZHN0KSB7CisJCXRyYW5zcG9ydC0+cG10dSA9IGRzdF9tdHUoZHN0KTsKKworCQkvKiBJbml0aWFsaXplIHNrLT5za19yY3Zfc2FkZHIsIGlmIHRoZSB0cmFuc3BvcnQgaXMgdGhlCisJCSAqIGFzc29jaWF0aW9uJ3MgYWN0aXZlIHBhdGggZm9yIGdldHNvY2tuYW1lKCkuCisJCSAqLyAKKwkJaWYgKGFzb2MgJiYgKHRyYW5zcG9ydCA9PSBhc29jLT5wZWVyLmFjdGl2ZV9wYXRoKSkKKwkJCWFmLT50b19za19zYWRkcigmdHJhbnNwb3J0LT5zYWRkciwgYXNvYy0+YmFzZS5zayk7CisJfSBlbHNlCisJCXRyYW5zcG9ydC0+cG10dSA9IFNDVFBfREVGQVVMVF9NQVhTRUdNRU5UOworfQorCisvKiBIb2xkIGEgcmVmZXJlbmNlIHRvIGEgdHJhbnNwb3J0LiAgKi8KK3ZvaWQgc2N0cF90cmFuc3BvcnRfaG9sZChzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKwlhdG9taWNfaW5jKCZ0cmFuc3BvcnQtPnJlZmNudCk7Cit9CisKKy8qIFJlbGVhc2UgYSByZWZlcmVuY2UgdG8gYSB0cmFuc3BvcnQgYW5kIGNsZWFuIHVwCisgKiBpZiB0aGVyZSBhcmUgbm8gbW9yZSByZWZlcmVuY2VzLgorICovCit2b2lkIHNjdHBfdHJhbnNwb3J0X3B1dChzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmdHJhbnNwb3J0LT5yZWZjbnQpKQorCQlzY3RwX3RyYW5zcG9ydF9kZXN0cm95KHRyYW5zcG9ydCk7Cit9CisKKy8qIFVwZGF0ZSB0cmFuc3BvcnQncyBSVE8gYmFzZWQgb24gdGhlIG5ld2x5IGNhbGN1bGF0ZWQgUlRULiAqLwordm9pZCBzY3RwX3RyYW5zcG9ydF91cGRhdGVfcnRvKHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHAsIF9fdTMyIHJ0dCkKK3sKKwkvKiBDaGVjayBmb3IgdmFsaWQgdHJhbnNwb3J0LiAgKi8KKwlTQ1RQX0FTU0VSVCh0cCwgIk5VTEwgdHJhbnNwb3J0IiwgcmV0dXJuKTsKKworCS8qIFdlIHNob3VsZCBub3QgYmUgZG9pbmcgYW55IFJUTyB1cGRhdGVzIHVubGVzcyBydG9fcGVuZGluZyBpcyBzZXQuICAqLworCVNDVFBfQVNTRVJUKHRwLT5ydG9fcGVuZGluZywgInJ0b19wZW5kaW5nIG5vdCBzZXQiLCByZXR1cm4pOworCisJaWYgKHRwLT5ydHR2YXIgfHwgdHAtPnNydHQpIHsKKwkJLyogNi4zLjEgQzMpIFdoZW4gYSBuZXcgUlRUIG1lYXN1cmVtZW50IFInIGlzIG1hZGUsIHNldAorCQkgKiBSVFRWQVIgPC0gKDEgLSBSVE8uQmV0YSkgKiBSVFRWQVIgKyBSVE8uQmV0YSAqIHxTUlRUIC0gUid8CisJCSAqIFNSVFQgPC0gKDEgLSBSVE8uQWxwaGEpICogU1JUVCArIFJUTy5BbHBoYSAqIFInCisJCSAqLworCisJCS8qIE5vdGU6ICBUaGUgYWJvdmUgYWxnb3JpdGhtIGhhcyBiZWVuIHJld3JpdHRlbiB0bworCQkgKiBleHByZXNzIHJ0b19iZXRhIGFuZCBydG9fYWxwaGEgYXMgaW52ZXJzZSBwb3dlcnMKKwkJICogb2YgdHdvLgorCQkgKiBGb3IgZXhhbXBsZSwgYXNzdW1pbmcgdGhlIGRlZmF1bHQgdmFsdWUgb2YgUlRPLkFscGhhIG9mCisJCSAqIDEvOCwgcnRvX2FscGhhIHdvdWxkIGJlIGV4cHJlc3NlZCBhcyAzLgorCQkgKi8KKwkJdHAtPnJ0dHZhciA9IHRwLT5ydHR2YXIgLSAodHAtPnJ0dHZhciA+PiBzY3RwX3J0b19iZXRhKQorCQkJKyAoKGFicyh0cC0+c3J0dCAtIHJ0dCkpID4+IHNjdHBfcnRvX2JldGEpOworCQl0cC0+c3J0dCA9IHRwLT5zcnR0IC0gKHRwLT5zcnR0ID4+IHNjdHBfcnRvX2FscGhhKQorCQkJKyAocnR0ID4+IHNjdHBfcnRvX2FscGhhKTsKKwl9IGVsc2UgeworCQkvKiA2LjMuMSBDMikgV2hlbiB0aGUgZmlyc3QgUlRUIG1lYXN1cmVtZW50IFIgaXMgbWFkZSwgc2V0CisJCSAqIFNSVFQgPC0gUiwgUlRUVkFSIDwtIFIvMi4KKwkJICovCisJCXRwLT5zcnR0ID0gcnR0OworCQl0cC0+cnR0dmFyID0gcnR0ID4+IDE7CisJfQorCisJLyogNi4zLjEgRzEpIFdoZW5ldmVyIFJUVFZBUiBpcyBjb21wdXRlZCwgaWYgUlRUVkFSID0gMCwgdGhlbgorCSAqIGFkanVzdCBSVFRWQVIgPC0gRywgd2hlcmUgRyBpcyB0aGUgQ0xPQ0sgR1JBTlVMQVJJVFkuCisJICovCisJaWYgKHRwLT5ydHR2YXIgPT0gMCkKKwkJdHAtPnJ0dHZhciA9IFNDVFBfQ0xPQ0tfR1JBTlVMQVJJVFk7CisKKwkvKiA2LjMuMSBDMykgQWZ0ZXIgdGhlIGNvbXB1dGF0aW9uLCB1cGRhdGUgUlRPIDwtIFNSVFQgKyA0ICogUlRUVkFSLiAqLworCXRwLT5ydG8gPSB0cC0+c3J0dCArICh0cC0+cnR0dmFyIDw8IDIpOworCisJLyogNi4zLjEgQzYpIFdoZW5ldmVyIFJUTyBpcyBjb21wdXRlZCwgaWYgaXQgaXMgbGVzcyB0aGFuIFJUTy5NaW4KKwkgKiBzZWNvbmRzIHRoZW4gaXQgaXMgcm91bmRlZCB1cCB0byBSVE8uTWluIHNlY29uZHMuCisJICovCisJaWYgKHRwLT5ydG8gPCB0cC0+YXNvYy0+cnRvX21pbikKKwkJdHAtPnJ0byA9IHRwLT5hc29jLT5ydG9fbWluOworCisJLyogNi4zLjEgQzcpIEEgbWF4aW11bSB2YWx1ZSBtYXkgYmUgcGxhY2VkIG9uIFJUTyBwcm92aWRlZCBpdCBpcworCSAqIGF0IGxlYXN0IFJUTy5tYXggc2Vjb25kcy4KKwkgKi8KKwlpZiAodHAtPnJ0byA+IHRwLT5hc29jLT5ydG9fbWF4KQorCQl0cC0+cnRvID0gdHAtPmFzb2MtPnJ0b19tYXg7CisKKwl0cC0+cnR0ID0gcnR0OworCisJLyogUmVzZXQgcnRvX3BlbmRpbmcgc28gdGhhdCBhIG5ldyBSVFQgbWVhc3VyZW1lbnQgaXMgc3RhcnRlZCB3aGVuIGEKKwkgKiBuZXcgZGF0YSBjaHVuayBpcyBzZW50LgorCSAqLworCXRwLT5ydG9fcGVuZGluZyA9IDA7CisKKwlTQ1RQX0RFQlVHX1BSSU5USygiJXM6IHRyYW5zcG9ydDogJXAsIHJ0dDogJWQsIHNydHQ6ICVkICIKKwkJCSAgInJ0dHZhcjogJWQsIHJ0bzogJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgdHAsIHJ0dCwgdHAtPnNydHQsIHRwLT5ydHR2YXIsIHRwLT5ydG8pOworfQorCisvKiBUaGlzIHJvdXRpbmUgdXBkYXRlcyB0aGUgdHJhbnNwb3J0J3MgY3duZCBhbmQgcGFydGlhbF9ieXRlc19hY2tlZAorICogcGFyYW1ldGVycyBiYXNlZCBvbiB0aGUgYnl0ZXMgYWNrZWQgaW4gdGhlIHJlY2VpdmVkIFNBQ0suCisgKi8KK3ZvaWQgc2N0cF90cmFuc3BvcnRfcmFpc2VfY3duZChzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydCwKKwkJCSAgICAgICBfX3UzMiBzYWNrX2N0c24sIF9fdTMyIGJ5dGVzX2Fja2VkKQoreworCV9fdTMyIGN3bmQsIHNzdGhyZXNoLCBmbGlnaHRfc2l6ZSwgcGJhLCBwbXR1OworCisJY3duZCA9IHRyYW5zcG9ydC0+Y3duZDsKKwlmbGlnaHRfc2l6ZSA9IHRyYW5zcG9ydC0+ZmxpZ2h0X3NpemU7CisKKwkvKiBUaGUgYXBwcm9wcmlhdGUgY3duZCBpbmNyZWFzZSBhbGdvcml0aG0gaXMgcGVyZm9ybWVkIGlmLCBhbmQgb25seQorCSAqIGlmIHRoZSBjdW11bGF0aXZlIFRTTiBoYXMgYWR2YW5jZWQgYW5kIHRoZSBjb25nZXN0aW9uIHdpbmRvdyBpcworCSAqIGJlaW5nIGZ1bGx5IHV0aWxpemVkLgorCSAqLworCWlmICgodHJhbnNwb3J0LT5hc29jLT5jdHNuX2Fja19wb2ludCA+PSBzYWNrX2N0c24pIHx8CisJICAgIChmbGlnaHRfc2l6ZSA8IGN3bmQpKQorCQlyZXR1cm47CisKKwlzc3RocmVzaCA9IHRyYW5zcG9ydC0+c3N0aHJlc2g7CisJcGJhID0gdHJhbnNwb3J0LT5wYXJ0aWFsX2J5dGVzX2Fja2VkOworCXBtdHUgPSB0cmFuc3BvcnQtPmFzb2MtPnBtdHU7CisKKwlpZiAoY3duZCA8PSBzc3RocmVzaCkgeworCQkvKiBSRkMgMjk2MCA3LjIuMSwgc2N0cGltcGd1aWRlLTA1IDIuMTQuMiBXaGVuIGN3bmQgaXMgbGVzcworCQkgKiB0aGFuIG9yIGVxdWFsIHRvIHNzdGhyZXNoIGFuIFNDVFAgZW5kcG9pbnQgTVVTVCB1c2UgdGhlCisJCSAqIHNsb3cgc3RhcnQgYWxnb3JpdGhtIHRvIGluY3JlYXNlIGN3bmQgb25seSBpZiB0aGUgY3VycmVudAorCQkgKiBjb25nZXN0aW9uIHdpbmRvdyBpcyBiZWluZyBmdWxseSB1dGlsaXplZCBhbmQgYW4gaW5jb21pbmcKKwkJICogU0FDSyBhZHZhbmNlcyB0aGUgQ3VtdWxhdGl2ZSBUU04gQWNrIFBvaW50LiBPbmx5IHdoZW4gdGhlc2UKKwkJICogdHdvIGNvbmRpdGlvbnMgYXJlIG1ldCBjYW4gdGhlIGN3bmQgYmUgaW5jcmVhc2VkIG90aGVyd2lzZQorCQkgKiB0aGUgY3duZCBNVVNUIG5vdCBiZSBpbmNyZWFzZWQuIElmIHRoZXNlIGNvbmRpdGlvbnMgYXJlIG1ldAorCQkgKiB0aGVuIGN3bmQgTVVTVCBiZSBpbmNyZWFzZWQgYnkgYXQgbW9zdCB0aGUgbGVzc2VyIG9mCisJCSAqIDEpIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBwcmV2aW91c2x5IG91dHN0YW5kaW5nIERBVEEKKwkJICogY2h1bmsocykgYWNrbm93bGVkZ2VkLCBhbmQgMikgdGhlIGRlc3RpbmF0aW9uJ3MgcGF0aCBNVFUuCisJCSAqLworCQlpZiAoYnl0ZXNfYWNrZWQgPiBwbXR1KQorCQkJY3duZCArPSBwbXR1OworCQllbHNlCisJCQljd25kICs9IGJ5dGVzX2Fja2VkOworCQlTQ1RQX0RFQlVHX1BSSU5USygiJXM6IFNMT1cgU1RBUlQ6IHRyYW5zcG9ydDogJXAsICIKKwkJCQkgICJieXRlc19hY2tlZDogJWQsIGN3bmQ6ICVkLCBzc3RocmVzaDogJWQsICIKKwkJCQkgICJmbGlnaHRfc2l6ZTogJWQsIHBiYTogJWRcbiIsCisJCQkJICBfX0ZVTkNUSU9OX18sCisJCQkJICB0cmFuc3BvcnQsIGJ5dGVzX2Fja2VkLCBjd25kLAorCQkJCSAgc3N0aHJlc2gsIGZsaWdodF9zaXplLCBwYmEpOworCX0gZWxzZSB7CisJCS8qIFJGQyAyOTYwIDcuMi4yIFdoZW5ldmVyIGN3bmQgaXMgZ3JlYXRlciB0aGFuIHNzdGhyZXNoLAorCQkgKiB1cG9uIGVhY2ggU0FDSyBhcnJpdmFsIHRoYXQgYWR2YW5jZXMgdGhlIEN1bXVsYXRpdmUgVFNOIEFjaworCQkgKiBQb2ludCwgaW5jcmVhc2UgcGFydGlhbF9ieXRlc19hY2tlZCBieSB0aGUgdG90YWwgbnVtYmVyIG9mCisJCSAqIGJ5dGVzIG9mIGFsbCBuZXcgY2h1bmtzIGFja25vd2xlZGdlZCBpbiB0aGF0IFNBQ0sgaW5jbHVkaW5nCisJCSAqIGNodW5rcyBhY2tub3dsZWRnZWQgYnkgdGhlIG5ldyBDdW11bGF0aXZlIFRTTiBBY2sgYW5kIGJ5CisJCSAqIEdhcCBBY2sgQmxvY2tzLgorCQkgKgorCQkgKiBXaGVuIHBhcnRpYWxfYnl0ZXNfYWNrZWQgaXMgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIGN3bmQKKwkJICogYW5kIGJlZm9yZSB0aGUgYXJyaXZhbCBvZiB0aGUgU0FDSyB0aGUgc2VuZGVyIGhhZCBjd25kIG9yCisJCSAqIG1vcmUgYnl0ZXMgb2YgZGF0YSBvdXRzdGFuZGluZyAoaS5lLiwgYmVmb3JlIGFycml2YWwgb2YgdGhlCisJCSAqIFNBQ0ssIGZsaWdodHNpemUgd2FzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBjd25kKSwKKwkJICogaW5jcmVhc2UgY3duZCBieSBNVFUsIGFuZCByZXNldCBwYXJ0aWFsX2J5dGVzX2Fja2VkIHRvCisJCSAqIChwYXJ0aWFsX2J5dGVzX2Fja2VkIC0gY3duZCkuCisJCSAqLworCQlwYmEgKz0gYnl0ZXNfYWNrZWQ7CisJCWlmIChwYmEgPj0gY3duZCkgeworCQkJY3duZCArPSBwbXR1OworCQkJcGJhID0gKChjd25kIDwgcGJhKSA/IChwYmEgLSBjd25kKSA6IDApOworCQl9CisJCVNDVFBfREVCVUdfUFJJTlRLKCIlczogQ09OR0VTVElPTiBBVk9JREFOQ0U6ICIKKwkJCQkgICJ0cmFuc3BvcnQ6ICVwLCBieXRlc19hY2tlZDogJWQsIGN3bmQ6ICVkLCAiCisJCQkJICAic3N0aHJlc2g6ICVkLCBmbGlnaHRfc2l6ZTogJWQsIHBiYTogJWRcbiIsCisJCQkJICBfX0ZVTkNUSU9OX18sCisJCQkJICB0cmFuc3BvcnQsIGJ5dGVzX2Fja2VkLCBjd25kLAorCQkJCSAgc3N0aHJlc2gsIGZsaWdodF9zaXplLCBwYmEpOworCX0KKworCXRyYW5zcG9ydC0+Y3duZCA9IGN3bmQ7CisJdHJhbnNwb3J0LT5wYXJ0aWFsX2J5dGVzX2Fja2VkID0gcGJhOworfQorCisvKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBsb3dlciB0aGUgdHJhbnNwb3J0J3MgY3duZCB3aGVuIGNvbmdlc3Rpb24gaXMKKyAqIGRldGVjdGVkLgorICovCit2b2lkIHNjdHBfdHJhbnNwb3J0X2xvd2VyX2N3bmQoc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQsCisJCQkgICAgICAgc2N0cF9sb3dlcl9jd25kX3QgcmVhc29uKQoreworCXN3aXRjaCAocmVhc29uKSB7CisJY2FzZSBTQ1RQX0xPV0VSX0NXTkRfVDNfUlRYOgorCQkvKiBSRkMgMjk2MCBTZWN0aW9uIDcuMi4zLCBzY3RwaW1wZ3VpZGUKKwkJICogV2hlbiB0aGUgVDMtcnR4IHRpbWVyIGV4cGlyZXMgb24gYW4gYWRkcmVzcywgU0NUUCBzaG91bGQKKwkJICogcGVyZm9ybSBzbG93IHN0YXJ0IGJ5OgorCQkgKiAgICAgIHNzdGhyZXNoID0gbWF4KGN3bmQvMiwgNCpNVFUpCisJCSAqICAgICAgY3duZCA9IDEqTVRVCisJCSAqICAgICAgcGFydGlhbF9ieXRlc19hY2tlZCA9IDAKKwkJICovCisJCXRyYW5zcG9ydC0+c3N0aHJlc2ggPSBtYXgodHJhbnNwb3J0LT5jd25kLzIsCisJCQkJCSAgNCp0cmFuc3BvcnQtPmFzb2MtPnBtdHUpOworCQl0cmFuc3BvcnQtPmN3bmQgPSB0cmFuc3BvcnQtPmFzb2MtPnBtdHU7CisJCWJyZWFrOworCisJY2FzZSBTQ1RQX0xPV0VSX0NXTkRfRkFTVF9SVFg6CisJCS8qIFJGQyAyOTYwIDcuMi40IEFkanVzdCB0aGUgc3N0aHJlc2ggYW5kIGN3bmQgb2YgdGhlCisJCSAqIGRlc3RpbmF0aW9uIGFkZHJlc3MoZXMpIHRvIHdoaWNoIHRoZSBtaXNzaW5nIERBVEEgY2h1bmtzCisJCSAqIHdlcmUgbGFzdCBzZW50LCBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGEgZGVzY3JpYmVkIGluCisJCSAqIFNlY3Rpb24gNy4yLjMuCisJIAkgKgorCSAJICogUkZDIDI5NjAgNy4yLjMsIHNjdHBpbXBndWlkZSBVcG9uIGRldGVjdGlvbiBvZiBwYWNrZXQKKwkJICogbG9zc2VzIGZyb20gU0FDSyAoc2VlIFNlY3Rpb24gNy4yLjQpLCBBbiBlbmRwb2ludAorCQkgKiBzaG91bGQgZG8gdGhlIGZvbGxvd2luZzoKKwkJICogICAgICBzc3RocmVzaCA9IG1heChjd25kLzIsIDQqTVRVKQorCQkgKiAgICAgIGN3bmQgPSBzc3RocmVzaAorCQkgKiAgICAgIHBhcnRpYWxfYnl0ZXNfYWNrZWQgPSAwCisJCSAqLworCQl0cmFuc3BvcnQtPnNzdGhyZXNoID0gbWF4KHRyYW5zcG9ydC0+Y3duZC8yLAorCQkJCQkgIDQqdHJhbnNwb3J0LT5hc29jLT5wbXR1KTsKKwkJdHJhbnNwb3J0LT5jd25kID0gdHJhbnNwb3J0LT5zc3RocmVzaDsKKwkJYnJlYWs7CisKKwljYXNlIFNDVFBfTE9XRVJfQ1dORF9FQ05FOgorCQkvKiBSRkMgMjQ4MSBTZWN0aW9uIDYuMS4yLgorCQkgKiBJZiB0aGUgc2VuZGVyIHJlY2VpdmVzIGFuIEVDTi1FY2hvIEFDSyBwYWNrZXQKKwkJICogdGhlbiB0aGUgc2VuZGVyIGtub3dzIHRoYXQgY29uZ2VzdGlvbiB3YXMgZW5jb3VudGVyZWQgaW4gdGhlCisJCSAqIG5ldHdvcmsgb24gdGhlIHBhdGggZnJvbSB0aGUgc2VuZGVyIHRvIHRoZSByZWNlaXZlci4gVGhlCisJCSAqIGluZGljYXRpb24gb2YgY29uZ2VzdGlvbiBzaG91bGQgYmUgdHJlYXRlZCBqdXN0IGFzIGEKKwkJICogY29uZ2VzdGlvbiBsb3NzIGluIG5vbi1FQ04gQ2FwYWJsZSBUQ1AuIFRoYXQgaXMsIHRoZSBUQ1AKKwkJICogc291cmNlIGhhbHZlcyB0aGUgY29uZ2VzdGlvbiB3aW5kb3cgImN3bmQiIGFuZCByZWR1Y2VzIHRoZQorCQkgKiBzbG93IHN0YXJ0IHRocmVzaG9sZCAic3N0aHJlc2giLgorCQkgKiBBIGNyaXRpY2FsIGNvbmRpdGlvbiBpcyB0aGF0IFRDUCBkb2VzIG5vdCByZWFjdCB0bworCQkgKiBjb25nZXN0aW9uIGluZGljYXRpb25zIG1vcmUgdGhhbiBvbmNlIGV2ZXJ5IHdpbmRvdyBvZgorCQkgKiBkYXRhIChvciBtb3JlIGxvb3NlbHkgbW9yZSB0aGFuIG9uY2UgZXZlcnkgcm91bmQtdHJpcCB0aW1lKS4KKwkJICovCisJCWlmICgoamlmZmllcyAtIHRyYW5zcG9ydC0+bGFzdF90aW1lX2VjbmVfcmVkdWNlZCkgPgorCQkgICAgdHJhbnNwb3J0LT5ydHQpIHsKKwkJCXRyYW5zcG9ydC0+c3N0aHJlc2ggPSBtYXgodHJhbnNwb3J0LT5jd25kLzIsCisJCQkJCSAgCSAgNCp0cmFuc3BvcnQtPmFzb2MtPnBtdHUpOworCQkJdHJhbnNwb3J0LT5jd25kID0gdHJhbnNwb3J0LT5zc3RocmVzaDsKKwkJCXRyYW5zcG9ydC0+bGFzdF90aW1lX2VjbmVfcmVkdWNlZCA9IGppZmZpZXM7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNDVFBfTE9XRVJfQ1dORF9JTkFDVElWRToKKwkJLyogUkZDIDI5NjAgU2VjdGlvbiA3LjIuMSwgc2N0cGltcGd1aWRlCisJCSAqIFdoZW4gdGhlIGVuZHBvaW50IGRvZXMgbm90IHRyYW5zbWl0IGRhdGEgb24gYSBnaXZlbgorCQkgKiB0cmFuc3BvcnQgYWRkcmVzcywgdGhlIGN3bmQgb2YgdGhlIHRyYW5zcG9ydCBhZGRyZXNzCisJCSAqIHNob3VsZCBiZSBhZGp1c3RlZCB0byBtYXgoY3duZC8yLCA0Kk1UVSkgcGVyIFJUTy4KKwkJICogTk9URTogQWx0aG91Z2ggdGhlIGRyYWZ0IHJlY29tbWVuZHMgdGhhdCB0aGlzIGNoZWNrIG5lZWRzCisJCSAqIHRvIGJlIGRvbmUgZXZlcnkgUlRPIGludGVydmFsLCB3ZSBkbyBpdCBldmVyeSBoZWFyYmVhdAorCQkgKiBpbnRlcnZhbC4KKwkJICovCisJCWlmICgoamlmZmllcyAtIHRyYW5zcG9ydC0+bGFzdF90aW1lX3VzZWQpID4gdHJhbnNwb3J0LT5ydG8pCisJCQl0cmFuc3BvcnQtPmN3bmQgPSBtYXgodHJhbnNwb3J0LT5jd25kLzIsCisJCQkJCQkgNCp0cmFuc3BvcnQtPmFzb2MtPnBtdHUpOworCQlicmVhazsKKwl9OworCisJdHJhbnNwb3J0LT5wYXJ0aWFsX2J5dGVzX2Fja2VkID0gMDsKKwlTQ1RQX0RFQlVHX1BSSU5USygiJXM6IHRyYW5zcG9ydDogJXAgcmVhc29uOiAlZCBjd25kOiAiCisJCQkgICIlZCBzc3RocmVzaDogJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgdHJhbnNwb3J0LCByZWFzb24sCisJCQkgIHRyYW5zcG9ydC0+Y3duZCwgdHJhbnNwb3J0LT5zc3RocmVzaCk7Cit9CisKKy8qIFdoYXQgaXMgdGhlIG5leHQgdGltZW91dCB2YWx1ZSBmb3IgdGhpcyB0cmFuc3BvcnQ/ICovCit1bnNpZ25lZCBsb25nIHNjdHBfdHJhbnNwb3J0X3RpbWVvdXQoc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0KQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwl0aW1lb3V0ID0gdC0+aGJfaW50ZXJ2YWwgKyB0LT5ydG8gKyBzY3RwX2ppdHRlcih0LT5ydG8pOworCXRpbWVvdXQgKz0gamlmZmllczsKKwlyZXR1cm4gdGltZW91dDsKK30KZGlmZiAtLWdpdCBhL25ldC9zY3RwL3Rzbm1hcC5jIGIvbmV0L3NjdHAvdHNubWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM0ZmFlMQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY3RwL3Rzbm1hcC5jCkBAIC0wLDAgKzEsNDE3IEBACisvKiBTQ1RQIGtlcm5lbCByZWZlcmVuY2UgSW1wbGVtZW50YXRpb24KKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDEsIDIwMDQKKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAwIENpc2NvLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSBNb3Rvcm9sYSwgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVsIENvcnAuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFNDVFAga2VybmVsIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbgorICoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBtYW5pcHVsYXRlIHNjdHAgdHNuIG1hcHBpbmcgYXJyYXkuCisgKgorICogVGhlIFNDVFAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQKKyAqIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICogICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBQbGVhc2Ugc2VuZCBhbnkgYnVnIHJlcG9ydHMgb3IgZml4ZXMgeW91IG1ha2UgdG8gdGhlCisgKiBlbWFpbCBhZGRyZXNzKGVzKToKKyAqICAgIGxrc2N0cCBkZXZlbG9wZXJzIDxsa3NjdHAtZGV2ZWxvcGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogT3Igc3VibWl0IGEgYnVnIHJlcG9ydCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgd2Vic2l0ZToKKyAqICAgIGh0dHA6Ly93d3cuc2YubmV0L3Byb2plY3RzL2xrc2N0cAorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiAgICBMYSBNb250ZSBILlAuIFlhcnJvbGwgPHBpZ2d5QGFjbS5vcmc+CisgKiAgICBKb24gR3JpbW0gICAgICAgICAgICAgPGpncmltbUB1cy5pYm0uY29tPgorICogICAgS2FybCBLbnV0c29uICAgICAgICAgIDxrYXJsQGF0aGVuYS5jaGljYWdvLmlsLnVzPgorICogICAgU3JpZGhhciBTYW11ZHJhbGEgICAgIDxzcmlAdXMuaWJtLmNvbT4KKyAqCisgKiBBbnkgYnVncyByZXBvcnRlZCBnaXZlbiB0byB1cyB3ZSB3aWxsIHRyeSB0byBmaXguLi4gYW55IGZpeGVzIHNoYXJlZCB3aWxsCisgKiBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbmV4dCBTQ1RQIHJlbGVhc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0L3NjdHAvc2N0cC5oPgorI2luY2x1ZGUgPG5ldC9zY3RwL3NtLmg+CisKK3N0YXRpYyB2b2lkIHNjdHBfdHNubWFwX3VwZGF0ZShzdHJ1Y3Qgc2N0cF90c25tYXAgKm1hcCk7CitzdGF0aWMgdm9pZCBzY3RwX3Rzbm1hcF9maW5kX2dhcF9hY2soX191OCAqbWFwLCBfX3UxNiBvZmYsCisJCQkJICAgICBfX3UxNiBsZW4sIF9fdTE2IGJhc2UsCisJCQkJICAgICBpbnQgKnN0YXJ0ZWQsIF9fdTE2ICpzdGFydCwKKwkJCQkgICAgIGludCAqZW5kZWQsIF9fdTE2ICplbmQpOworCisvKiBJbml0aWFsaXplIGEgYmxvY2sgb2YgbWVtb3J5IGFzIGEgdHNubWFwLiAgKi8KK3N0cnVjdCBzY3RwX3Rzbm1hcCAqc2N0cF90c25tYXBfaW5pdChzdHJ1Y3Qgc2N0cF90c25tYXAgKm1hcCwgX191MTYgbGVuLAorCQkJCSAgICAgX191MzIgaW5pdGlhbF90c24pCit7CisJbWFwLT50c25fbWFwID0gbWFwLT5yYXdfbWFwOworCW1hcC0+b3ZlcmZsb3dfbWFwID0gbWFwLT50c25fbWFwICsgbGVuOworCW1hcC0+bGVuID0gbGVuOworCisJLyogQ2xlYXIgb3V0IGEgVFNOIGFjayBzdGF0dXMuICAqLworCW1lbXNldChtYXAtPnRzbl9tYXAsIDB4MDAsIG1hcC0+bGVuICsgbWFwLT5sZW4pOworCisJLyogS2VlcCB0cmFjayBvZiBUU05zIHJlcHJlc2VudGVkIGJ5IHRzbl9tYXAuICAqLworCW1hcC0+YmFzZV90c24gPSBpbml0aWFsX3RzbjsKKwltYXAtPm92ZXJmbG93X3RzbiA9IGluaXRpYWxfdHNuICsgbWFwLT5sZW47CisJbWFwLT5jdW11bGF0aXZlX3Rzbl9hY2tfcG9pbnQgPSBpbml0aWFsX3RzbiAtIDE7CisJbWFwLT5tYXhfdHNuX3NlZW4gPSBtYXAtPmN1bXVsYXRpdmVfdHNuX2Fja19wb2ludDsKKwltYXAtPm1hbGxvY2VkID0gMDsKKwltYXAtPm51bV9kdXBfdHNucyA9IDA7CisKKwlyZXR1cm4gbWFwOworfQorCisvKiBUZXN0IHRoZSB0cmFja2luZyBzdGF0ZSBvZiB0aGlzIFRTTi4KKyAqIFJldHVybnM6CisgKiAgIDAgaWYgdGhlIFRTTiBoYXMgbm90IHlldCBiZWVuIHNlZW4KKyAqICA+MCBpZiB0aGUgVFNOIGhhcyBiZWVuIHNlZW4gKGR1cGxpY2F0ZSkKKyAqICA8MCBpZiB0aGUgVFNOIGlzIGludmFsaWQgKHRvbyBsYXJnZSB0byB0cmFjaykKKyAqLworaW50IHNjdHBfdHNubWFwX2NoZWNrKGNvbnN0IHN0cnVjdCBzY3RwX3Rzbm1hcCAqbWFwLCBfX3UzMiB0c24pCit7CisJX19zMzIgZ2FwOworCWludCBkdXA7CisKKwkvKiBDYWxjdWxhdGUgdGhlIGluZGV4IGludG8gdGhlIG1hcHBpbmcgYXJyYXlzLiAgKi8KKwlnYXAgPSB0c24gLSBtYXAtPmJhc2VfdHNuOworCisJLyogVmVyaWZ5IHRoYXQgd2UgY2FuIGhvbGQgdGhpcyBUU04uICAqLworCWlmIChnYXAgPj0gKC8qIGJhc2UgKi8gbWFwLT5sZW4gKyAvKiBvdmVyZmxvdyAqLyBtYXAtPmxlbikpIHsKKwkJZHVwID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEhvbmsgaWYgd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgVFNOLgorCSAqIFdlIGhhdmUgdGhyZWUgY2FzZXM6CisJICoJMS4gVGhlIFRTTiBpcyBhbmNpZW50IG9yIGJlbG9uZ3MgdG8gYSBwcmV2aW91cyB0c25fbWFwLgorCSAqCTIuIFRoZSBUU04gaXMgYWxyZWFkeSBtYXJrZWQgaW4gdGhlIHRzbl9tYXAuCisJICoJMy4gVGhlIFRTTiBpcyBhbHJlYWR5IG1hcmtlZCBpbiB0aGUgdHNuX21hcF9vdmVyZmxvdy4KKwkgKi8KKwlpZiAoZ2FwIDwgMCB8fAorCSAgICAoZ2FwIDwgbWFwLT5sZW4gJiYgbWFwLT50c25fbWFwW2dhcF0pIHx8CisJICAgIChnYXAgPj0gbWFwLT5sZW4gJiYgbWFwLT5vdmVyZmxvd19tYXBbZ2FwIC0gbWFwLT5sZW5dKSkKKwkJZHVwID0gMTsKKwllbHNlCisJCWR1cCA9IDA7CisKK291dDoKKwlyZXR1cm4gZHVwOworfQorCisKKy8qIE1hcmsgdGhpcyBUU04gYXMgc2Vlbi4gICovCit2b2lkIHNjdHBfdHNubWFwX21hcmsoc3RydWN0IHNjdHBfdHNubWFwICptYXAsIF9fdTMyIHRzbikKK3sKKwlfX3MzMiBnYXA7CisKKwkvKiBWYWN1b3VzbHkgbWFyayBhbnkgVFNOIHdoaWNoIHByZWNlZGVzIHRoZSBtYXAgYmFzZSBvcgorCSAqIGV4Y2VlZHMgdGhlIGVuZCBvZiB0aGUgbWFwLgorCSAqLworCWlmIChUU05fbHQodHNuLCBtYXAtPmJhc2VfdHNuKSkKKwkJcmV0dXJuOworCWlmICghVFNOX2x0KHRzbiwgbWFwLT5iYXNlX3RzbiArIG1hcC0+bGVuICsgbWFwLT5sZW4pKQorCQlyZXR1cm47CisKKwkvKiBCdW1wIHRoZSBtYXguICAqLworCWlmIChUU05fbHQobWFwLT5tYXhfdHNuX3NlZW4sIHRzbikpCisJCW1hcC0+bWF4X3Rzbl9zZWVuID0gdHNuOworCisJLyogQXNzZXJ0OiBUU04gaXMgaW4gcmFuZ2UuICAqLworCWdhcCA9IHRzbiAtIG1hcC0+YmFzZV90c247CisKKwkvKiBNYXJrIHRoZSBUU04gYXMgcmVjZWl2ZWQuICAqLworCWlmIChnYXAgPCBtYXAtPmxlbikKKwkJbWFwLT50c25fbWFwW2dhcF0rKzsKKwllbHNlCisJCW1hcC0+b3ZlcmZsb3dfbWFwW2dhcCAtIG1hcC0+bGVuXSsrOworCisJLyogR28gZml4dXAgYW55IGludGVybmFsIFRTTiBtYXBwaW5nIHZhcmlhYmxlcyBpbmNsdWRpbmcKKwkgKiBjdW11bGF0aXZlX3Rzbl9hY2tfcG9pbnQuCisJICovCisJc2N0cF90c25tYXBfdXBkYXRlKG1hcCk7Cit9CisKKworLyogSW5pdGlhbGl6ZSBhIEdhcCBBY2sgQmxvY2sgaXRlcmF0b3IgZnJvbSBtZW1vcnkgYmVpbmcgcHJvdmlkZWQuICAqLworU0NUUF9TVEFUSUMgdm9pZCBzY3RwX3Rzbm1hcF9pdGVyX2luaXQoY29uc3Qgc3RydWN0IHNjdHBfdHNubWFwICptYXAsCisJCQkJICAgICAgIHN0cnVjdCBzY3RwX3Rzbm1hcF9pdGVyICppdGVyKQoreworCS8qIE9ubHkgc3RhcnQgbG9va2luZyBvbmUgcGFzdCB0aGUgQ3VtdWxhdGl2ZSBUU04gQWNrIFBvaW50LiAgKi8KKwlpdGVyLT5zdGFydCA9IG1hcC0+Y3VtdWxhdGl2ZV90c25fYWNrX3BvaW50ICsgMTsKK30KKworLyogR2V0IHRoZSBuZXh0IEdhcCBBY2sgQmxvY2tzLiBSZXR1cm5zIDAgaWYgdGhlcmUgd2FzIG5vdCBhbm90aGVyIGJsb2NrCisgKiB0byBnZXQuCisgKi8KK1NDVFBfU1RBVElDIGludCBzY3RwX3Rzbm1hcF9uZXh0X2dhcF9hY2soY29uc3Qgc3RydWN0IHNjdHBfdHNubWFwICptYXAsCisJCQkJCSBzdHJ1Y3Qgc2N0cF90c25tYXBfaXRlciAqaXRlciwKKwkJCQkJIF9fdTE2ICpzdGFydCwgX191MTYgKmVuZCkKK3sKKwlpbnQgc3RhcnRlZCwgZW5kZWQ7CisJX191MTYgX3N0YXJ0LCBfZW5kLCBvZmZzZXQ7CisKKwkvKiBXZSBoYXZlbid0IGZvdW5kIGEgZ2FwIHlldC4gICovCisJc3RhcnRlZCA9IGVuZGVkID0gMDsKKworCS8qIElmIHRoZXJlIGFyZSBubyBtb3JlIGdhcCBhY2tzIHBvc3NpYmxlLCBnZXQgb3V0IGZhc3QuICAqLworCWlmIChUU05fbHRlKG1hcC0+bWF4X3Rzbl9zZWVuLCBpdGVyLT5zdGFydCkpCisJCXJldHVybiAwOworCisJLyogU2VhcmNoIHRoZSBmaXJzdCBtYXBwaW5nIGFycmF5LiAgKi8KKwlpZiAoaXRlci0+c3RhcnQgLSBtYXAtPmJhc2VfdHNuIDwgbWFwLT5sZW4pIHsKKworCQlvZmZzZXQgPSBpdGVyLT5zdGFydCAtIG1hcC0+YmFzZV90c247CisJCXNjdHBfdHNubWFwX2ZpbmRfZ2FwX2FjayhtYXAtPnRzbl9tYXAsIG9mZnNldCwgbWFwLT5sZW4sIDAsCisJCQkJCSAmc3RhcnRlZCwgJl9zdGFydCwgJmVuZGVkLCAmX2VuZCk7CisJfQorCisJLyogRG8gd2UgbmVlZCB0byBjaGVjayB0aGUgb3ZlcmZsb3cgbWFwPyAqLworCWlmICghZW5kZWQpIHsKKwkJLyogRml4IHVwIHdoZXJlIHdlJ2QgbGlrZSB0byBzdGFydCBzZWFyY2hpbmcgaW4gdGhlCisJCSAqIG92ZXJmbG93IG1hcC4KKwkJICovCisJCWlmIChpdGVyLT5zdGFydCAtIG1hcC0+YmFzZV90c24gPCBtYXAtPmxlbikKKwkJCW9mZnNldCA9IDA7CisJCWVsc2UKKwkJCW9mZnNldCA9IGl0ZXItPnN0YXJ0IC0gbWFwLT5iYXNlX3RzbiAtIG1hcC0+bGVuOworCisJCS8qIFNlYXJjaCB0aGUgb3ZlcmZsb3cgbWFwLiAgKi8KKwkJc2N0cF90c25tYXBfZmluZF9nYXBfYWNrKG1hcC0+b3ZlcmZsb3dfbWFwLAorCQkJCQkgb2Zmc2V0LAorCQkJCQkgbWFwLT5sZW4sCisJCQkJCSBtYXAtPmxlbiwKKwkJCQkJICZzdGFydGVkLCAmX3N0YXJ0LAorCQkJCQkgJmVuZGVkLCAmX2VuZCk7CisJfQorCisJLyogVGhlIEdhcCBBY2sgQmxvY2sgaGFwcGVucyB0byBlbmQgYXQgdGhlIGVuZCBvZiB0aGUKKwkgKiBvdmVyZmxvdyBtYXAuCisJICovCisJaWYgKHN0YXJ0ZWQgJiYgIWVuZGVkKSB7CisJCWVuZGVkKys7CisJCV9lbmQgPSBtYXAtPmxlbiArIG1hcC0+bGVuIC0gMTsKKwl9CisKKwkvKiBJZiB3ZSBmb3VuZCBhIEdhcCBBY2sgQmxvY2ssIHJldHVybiB0aGUgc3RhcnQgYW5kIGVuZCBhbmQKKwkgKiBidW1wIHRoZSBpdGVyYXRvciBmb3J3YXJkLgorCSAqLworCWlmIChlbmRlZCkgeworCQkvKiBGaXggdXAgdGhlIHN0YXJ0IGFuZCBlbmQgYmFzZWQgb24gdGhlCisJCSAqIEN1bXVsYXRpdmUgVFNOIEFjayBvZmZzZXQgaW50byB0aGUgbWFwLgorCQkgKi8KKwkJaW50IGdhcCA9IG1hcC0+Y3VtdWxhdGl2ZV90c25fYWNrX3BvaW50IC0KKwkJCW1hcC0+YmFzZV90c247CisKKwkJKnN0YXJ0ID0gX3N0YXJ0IC0gZ2FwOworCQkqZW5kID0gX2VuZCAtIGdhcDsKKworCQkvKiBNb3ZlIHRoZSBpdGVyYXRvciBmb3J3YXJkLiAgKi8KKwkJaXRlci0+c3RhcnQgPSBtYXAtPmN1bXVsYXRpdmVfdHNuX2Fja19wb2ludCArICplbmQgKyAxOworCX0KKworCXJldHVybiBlbmRlZDsKK30KKworLyogTWFyayB0aGlzIGFuZCBhbnkgbG93ZXIgVFNOIGFzIHNlZW4uICAqLwordm9pZCBzY3RwX3Rzbm1hcF9za2lwKHN0cnVjdCBzY3RwX3Rzbm1hcCAqbWFwLCBfX3UzMiB0c24pCit7CisJX19zMzIgZ2FwOworCisJLyogVmFjdW91c2x5IG1hcmsgYW55IFRTTiB3aGljaCBwcmVjZWRlcyB0aGUgbWFwIGJhc2Ugb3IKKwkgKiBleGNlZWRzIHRoZSBlbmQgb2YgdGhlIG1hcC4KKwkgKi8KKwlpZiAoVFNOX2x0KHRzbiwgbWFwLT5iYXNlX3RzbikpCisJCXJldHVybjsKKwlpZiAoIVRTTl9sdCh0c24sIG1hcC0+YmFzZV90c24gKyBtYXAtPmxlbiArIG1hcC0+bGVuKSkKKwkJcmV0dXJuOworCisJLyogQnVtcCB0aGUgbWF4LiAgKi8KKwlpZiAoVFNOX2x0KG1hcC0+bWF4X3Rzbl9zZWVuLCB0c24pKQorCQltYXAtPm1heF90c25fc2VlbiA9IHRzbjsKKworCS8qIEFzc2VydDogVFNOIGlzIGluIHJhbmdlLiAgKi8KKwlnYXAgPSB0c24gLSBtYXAtPmJhc2VfdHNuICsgMTsKKworCS8qIE1hcmsgdGhlIFRTTnMgYXMgcmVjZWl2ZWQuICAqLworCWlmIChnYXAgPD0gbWFwLT5sZW4pCisJCW1lbXNldChtYXAtPnRzbl9tYXAsIDB4MDEsIGdhcCk7CisJZWxzZSB7CisJCW1lbXNldChtYXAtPnRzbl9tYXAsIDB4MDEsIG1hcC0+bGVuKTsKKwkJbWVtc2V0KG1hcC0+b3ZlcmZsb3dfbWFwLCAweDAxLCAoZ2FwIC0gbWFwLT5sZW4pKTsKKwl9CisKKwkvKiBHbyBmaXh1cCBhbnkgaW50ZXJuYWwgVFNOIG1hcHBpbmcgdmFyaWFibGVzIGluY2x1ZGluZworCSAqIGN1bXVsYXRpdmVfdHNuX2Fja19wb2ludC4KKwkgKi8KKwlzY3RwX3Rzbm1hcF91cGRhdGUobWFwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAybmQgTGV2ZWwgQWJzdHJhY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgcHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gdXBkYXRlcyB0aGUgdHNubWFwIGJ1ZmZlcnMgYW5kCisgKiB0aGUgQ3VtdWxhdGl2ZSBUU04gQWNrIFBvaW50LgorICovCitzdGF0aWMgdm9pZCBzY3RwX3Rzbm1hcF91cGRhdGUoc3RydWN0IHNjdHBfdHNubWFwICptYXApCit7CisJX191MzIgY3RzbjsKKworCWN0c24gPSBtYXAtPmN1bXVsYXRpdmVfdHNuX2Fja19wb2ludDsKKwlkbyB7CisJCWN0c24rKzsKKwkJaWYgKGN0c24gPT0gbWFwLT5vdmVyZmxvd190c24pIHsKKwkJCS8qIE5vdyB0c25fbWFwIG11c3QgaGF2ZSBiZWVuIGFsbCAnMSdzLAorCQkJICogc28gd2Ugc3dhcCB0aGUgbWFwIGFuZCBjaGVjayB0aGUgb3ZlcmZsb3cgdGFibGUKKwkJCSAqLworICAgICAgICAJCV9fdTggKnRtcCA9IG1hcC0+dHNuX21hcDsKKwkJCW1lbXNldCh0bXAsIDAsIG1hcC0+bGVuKTsKKwkJCW1hcC0+dHNuX21hcCA9IG1hcC0+b3ZlcmZsb3dfbWFwOworCQkJbWFwLT5vdmVyZmxvd19tYXAgPSB0bXA7CisKKwkJCS8qIFVwZGF0ZSB0aGUgdHNuX21hcCBib3VuZGFyaWVzLiAgKi8KKwkJCW1hcC0+YmFzZV90c24gKz0gbWFwLT5sZW47CisJCQltYXAtPm92ZXJmbG93X3RzbiArPSBtYXAtPmxlbjsKKwkJfQorCX0gd2hpbGUgKG1hcC0+dHNuX21hcFtjdHNuIC0gbWFwLT5iYXNlX3Rzbl0pOworCisJbWFwLT5jdW11bGF0aXZlX3Rzbl9hY2tfcG9pbnQgPSBjdHNuIC0gMTsgLyogQmFjayB1cCBvbmUuICovCit9CisKKy8qIEhvdyBtYW55IGRhdGEgY2h1bmtzICBhcmUgd2UgbWlzc2luZyBmcm9tIG91ciBwZWVyPworICovCitfX3UxNiBzY3RwX3Rzbm1hcF9wZW5kaW5nKHN0cnVjdCBzY3RwX3Rzbm1hcCAqbWFwKQoreworCV9fdTMyIGN1bV90c24gPSBtYXAtPmN1bXVsYXRpdmVfdHNuX2Fja19wb2ludDsKKwlfX3UzMiBtYXhfdHNuID0gbWFwLT5tYXhfdHNuX3NlZW47CisJX191MzIgYmFzZV90c24gPSBtYXAtPmJhc2VfdHNuOworCV9fdTE2IHBlbmRpbmdfZGF0YTsKKwlfX3MzMiBnYXAsIHN0YXJ0LCBlbmQsIGk7CisKKwlwZW5kaW5nX2RhdGEgPSBtYXhfdHNuIC0gY3VtX3RzbjsKKwlnYXAgPSBtYXhfdHNuIC0gYmFzZV90c247CisKKwlpZiAoZ2FwIDw9IDAgfHwgZ2FwID49IChtYXAtPmxlbiArIG1hcC0+bGVuKSkKKwkJZ290byBvdXQ7CisKKwlzdGFydCA9ICgoY3VtX3RzbiA+PSBiYXNlX3RzbikgPyAoY3VtX3RzbiAtIGJhc2VfdHNuICsgMSkgOiAwKTsKKwllbmQgPSAoKGdhcCA+IG1hcC0+bGVuICkgPyBtYXAtPmxlbiA6IGdhcCArIDEpOworCisJZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgeworCQlpZiAobWFwLT50c25fbWFwW2ldKQorCQkJcGVuZGluZ19kYXRhLS07CisJfQorCisJaWYgKGdhcCA+PSBtYXAtPmxlbikgeworCQlzdGFydCA9IDA7CisJCWVuZCA9IGdhcCAtIG1hcC0+bGVuICsgMTsKKwkJZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgeworCQkJaWYgKG1hcC0+b3ZlcmZsb3dfbWFwW2ldKQorCQkJCXBlbmRpbmdfZGF0YS0tOworCQl9CisJfQorCitvdXQ6CisJcmV0dXJuIHBlbmRpbmdfZGF0YTsKK30KKworLyogVGhpcyBpcyBhIHByaXZhdGUgaGVscGVyIGZvciBmaW5kaW5nIEdhcCBBY2sgQmxvY2tzLiAgSXQgc2VhcmNoZXMgYQorICogc2luZ2xlIGFycmF5IGZvciB0aGUgc3RhcnQgYW5kIGVuZCBvZiBhIEdhcCBBY2sgQmxvY2suCisgKgorICogVGhlIGZsYWdzICJzdGFydGVkIiBhbmQgImVuZGVkIiB0ZWxsIGlzIGlmIHdlIGZvdW5kIHRoZSBiZWdpbm5pbmcKKyAqIG9yIChyZXNwZWN0aXZlbHkpIHRoZSBlbmQgb2YgYSBHYXAgQWNrIEJsb2NrLgorICovCitzdGF0aWMgdm9pZCBzY3RwX3Rzbm1hcF9maW5kX2dhcF9hY2soX191OCAqbWFwLCBfX3UxNiBvZmYsCisJCQkJICAgICBfX3UxNiBsZW4sIF9fdTE2IGJhc2UsCisJCQkJICAgICBpbnQgKnN0YXJ0ZWQsIF9fdTE2ICpzdGFydCwKKwkJCQkgICAgIGludCAqZW5kZWQsIF9fdTE2ICplbmQpCit7CisJaW50IGkgPSBvZmY7CisKKwkvKiBMb29rIHRocm91Z2ggdGhlIGVudGlyZSBhcnJheSwgYnV0IGJyZWFrIG91dAorCSAqIGVhcmx5IGlmIHdlIGhhdmUgZm91bmQgdGhlIGVuZCBvZiB0aGUgR2FwIEFjayBCbG9jay4KKwkgKi8KKworCS8qIEFsc28sIHN0b3AgbG9va2luZyBwYXN0IHRoZSBtYXhpbXVtIFRTTiBzZWVuLiAqLworCisJLyogTG9vayBmb3IgdGhlIHN0YXJ0LiAqLworCWlmICghKCpzdGFydGVkKSkgeworCQlmb3IgKDsgaSA8IGxlbjsgaSsrKSB7CisJCQlpZiAobWFwW2ldKSB7CisJCQkJKCpzdGFydGVkKSsrOworCQkJCSpzdGFydCA9IGJhc2UgKyBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLyogTG9vayBmb3IgdGhlIGVuZC4gICovCisJaWYgKCpzdGFydGVkKSB7CisJCS8qIFdlIGhhdmUgZm91bmQgdGhlIHN0YXJ0LCBsZXQncyBmaW5kIHRoZQorCQkgKiBlbmQuICBJZiB3ZSBmaW5kIHRoZSBlbmQsIGJyZWFrIG91dC4KKwkJICovCisJCWZvciAoOyBpIDwgbGVuOyBpKyspIHsKKwkJCWlmICghbWFwW2ldKSB7CisJCQkJKCplbmRlZCkrKzsKKwkJCQkqZW5kID0gYmFzZSArIGkgLSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCisvKiBSZW5lZ2UgdGhhdCB3ZSBoYXZlIHNlZW4gYSBUU04uICAqLwordm9pZCBzY3RwX3Rzbm1hcF9yZW5lZ2Uoc3RydWN0IHNjdHBfdHNubWFwICptYXAsIF9fdTMyIHRzbikKK3sKKwlfX3MzMiBnYXA7CisKKwlpZiAoVFNOX2x0KHRzbiwgbWFwLT5iYXNlX3RzbikpCisJCXJldHVybjsKKwlpZiAoIVRTTl9sdCh0c24sIG1hcC0+YmFzZV90c24gKyBtYXAtPmxlbiArIG1hcC0+bGVuKSkKKwkJcmV0dXJuOworCisJLyogQXNzZXJ0OiBUU04gaXMgaW4gcmFuZ2UuICAqLworCWdhcCA9IHRzbiAtIG1hcC0+YmFzZV90c247CisKKwkvKiBQcmV0ZW5kIHdlIG5ldmVyIHNhdyB0aGUgVFNOLiAgKi8KKwlpZiAoZ2FwIDwgbWFwLT5sZW4pCisJCW1hcC0+dHNuX21hcFtnYXBdID0gMDsKKwllbHNlCisJCW1hcC0+b3ZlcmZsb3dfbWFwW2dhcCAtIG1hcC0+bGVuXSA9IDA7Cit9CisKKy8qIEhvdyBtYW55IGdhcCBhY2sgYmxvY2tzIGRvIHdlIGhhdmUgcmVjb3JkZWQ/ICovCitfX3UxNiBzY3RwX3Rzbm1hcF9udW1fZ2FicyhzdHJ1Y3Qgc2N0cF90c25tYXAgKm1hcCkKK3sKKwlzdHJ1Y3Qgc2N0cF90c25tYXBfaXRlciBpdGVyOworCWludCBnYWJzID0gMDsKKworCS8qIFJlZnJlc2ggdGhlIGdhcCBhY2sgaW5mb3JtYXRpb24uICovCisJaWYgKHNjdHBfdHNubWFwX2hhc19nYXAobWFwKSkgeworCQlzY3RwX3Rzbm1hcF9pdGVyX2luaXQobWFwLCAmaXRlcik7CisJCXdoaWxlIChzY3RwX3Rzbm1hcF9uZXh0X2dhcF9hY2sobWFwLCAmaXRlciwKKwkJCQkJCSZtYXAtPmdhYnNbZ2Fic10uc3RhcnQsCisJCQkJCQkmbWFwLT5nYWJzW2dhYnNdLmVuZCkpIHsKKworCQkJbWFwLT5nYWJzW2dhYnNdLnN0YXJ0ID0gaHRvbnMobWFwLT5nYWJzW2dhYnNdLnN0YXJ0KTsKKwkJCW1hcC0+Z2Fic1tnYWJzXS5lbmQgPSBodG9ucyhtYXAtPmdhYnNbZ2Fic10uZW5kKTsKKwkJCWdhYnMrKzsKKwkJCWlmIChnYWJzID49IFNDVFBfTUFYX0dBQlMpCisJCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGdhYnM7Cit9CmRpZmYgLS1naXQgYS9uZXQvc2N0cC91bHBldmVudC5jIGIvbmV0L3NjdHAvdWxwZXZlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2QwZmY1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjdHAvdWxwZXZlbnQuYwpAQCAtMCwwICsxLDk0MiBAQAorLyogU0NUUCBrZXJuZWwgcmVmZXJlbmNlIEltcGxlbWVudGF0aW9uCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxLCAyMDA0CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMCBDaXNjbywgSW5jLgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgTW90b3JvbGEsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChjKSAyMDAxIE5va2lhLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTGEgTW9udGUgSC5QLiBZYXJyb2xsCisgKgorICogVGhlc2UgZnVuY3Rpb25zIG1hbmlwdWxhdGUgYW4gc2N0cCBldmVudC4gICBUaGUgc3RydWN0IHVscGV2ZW50IGlzIHVzZWQKKyAqIHRvIGNhcnJ5IG5vdGlmaWNhdGlvbnMgYW5kIGRhdGEgdG8gdGhlIFVMUCAoc29ja2V0cykuCisgKiBUaGUgU0NUUCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgU0NUUCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogV3JpdHRlbiBvciBtb2RpZmllZCBieToKKyAqICAgIEpvbiBHcmltbSAgICAgICAgICAgICA8amdyaW1tQHVzLmlibS5jb20+CisgKiAgICBMYSBNb250ZSBILlAuIFlhcnJvbGwgPHBpZ2d5QGFjbS5vcmc+CisgKiAgICBBcmRlbGxlIEZhbgkgICAgPGFyZGVsbGUuZmFuQGludGVsLmNvbT4KKyAqICAgIFNyaWRoYXIgU2FtdWRyYWxhICAgICA8c3JpQHVzLmlibS5jb20+CisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgZ2l2ZW4gdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zY3RwL3N0cnVjdHMuaD4KKyNpbmNsdWRlIDxuZXQvc2N0cC9zY3RwLmg+CisjaW5jbHVkZSA8bmV0L3NjdHAvc20uaD4KKworc3RhdGljIHZvaWQgc2N0cF91bHBldmVudF9yZWNlaXZlX2RhdGEoc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50LAorCQkJCSAgICAgICBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYyk7CitzdGF0aWMgdm9pZCBzY3RwX3VscGV2ZW50X3JlbGVhc2VfZGF0YShzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQpOworCisvKiBTdHViIHNrYiBkZXN0cnVjdG9yLiAgKi8KK3N0YXRpYyB2b2lkIHNjdHBfc3R1Yl9yZnJlZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworLyogV0FSTklORzogIFRoaXMgZnVuY3Rpb24gaXMganVzdCBhIHdhcm5pbmcgbm90IHRvIHVzZSB0aGUKKyAqIHNrYiBkZXN0cnVjdG9yLiAgSWYgdGhlIHNrYiBpcyBzaGFyZWQsIHdlIG1heSBnZXQgdGhlIGRlc3RydWN0b3IKKyAqIGNhbGxiYWNrIG9uIHNvbWUgcHJvY2Vzc29yIHRoYXQgZG9lcyBub3Qgb3duIHRoZSBzb2NrX2xvY2suICBUaGlzCisgKiB3YXMgb2NjdXJpbmcgd2l0aCBQQUNLRVQgc29ja2V0IGFwcGxpY2F0aW9ucyB0aGF0IHdlcmUgbW9uaXRvcmluZworICogb3VyIHNrYnMuICAgV2UgY2FuJ3QgdGFrZSB0aGUgc29ja19sb2NrLCBiZWNhdXNlIHdlIGNhbid0IHJpc2sKKyAqIHJlY3Vyc2luZyBpZiB3ZSBkbyByZWFsbHkgb3duIHRoZSBzb2NrIGxvY2suICBJbnN0ZWFkLCBkbyBhbGwKKyAqIG9mIG91ciByd25kIG1hbmlwdWxhdGlvbiB3aGlsZSB3ZSBvd24gdGhlIHNvY2tfbG9jayBvdXRyaWdodC4KKyAqLworfQorCisvKiBJbml0aWFsaXplIGFuIFVMUCBldmVudCBmcm9tIGFuIGdpdmVuIHNrYi4gICovCitTQ1RQX1NUQVRJQyB2b2lkIHNjdHBfdWxwZXZlbnRfaW5pdChzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQsIGludCBtc2dfZmxhZ3MpCit7CisJbWVtc2V0KGV2ZW50LCAwLCBzaXplb2Yoc3RydWN0IHNjdHBfdWxwZXZlbnQpKTsKKwlldmVudC0+bXNnX2ZsYWdzID0gbXNnX2ZsYWdzOworfQorCisvKiBDcmVhdGUgYSBuZXcgc2N0cF91bHBldmVudC4gICovCitTQ1RQX1NUQVRJQyBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqc2N0cF91bHBldmVudF9uZXcoaW50IHNpemUsIGludCBtc2dfZmxhZ3MsCisJCQkJCQkgICAgaW50IGdmcCkKK3sKKwlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXNrYiA9IGFsbG9jX3NrYihzaXplLCBnZnApOworCWlmICghc2tiKQorCQlnb3RvIGZhaWw7CisKKwlldmVudCA9IHNjdHBfc2tiMmV2ZW50KHNrYik7CisJc2N0cF91bHBldmVudF9pbml0KGV2ZW50LCBtc2dfZmxhZ3MpOworCisJcmV0dXJuIGV2ZW50OworCitmYWlsOgorCXJldHVybiBOVUxMOworfQorCisvKiBJcyB0aGlzIGEgTVNHX05PVElGSUNBVElPTj8gICovCitpbnQgc2N0cF91bHBldmVudF9pc19ub3RpZmljYXRpb24oY29uc3Qgc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50KQoreworCXJldHVybiBNU0dfTk9USUZJQ0FUSU9OID09IChldmVudC0+bXNnX2ZsYWdzICYgTVNHX05PVElGSUNBVElPTik7Cit9CisKKy8qIEhvbGQgdGhlIGFzc29jaWF0aW9uIGluIGNhc2UgdGhlIG1zZ19uYW1lIG5lZWRzIHJlYWQgb3V0IG9mCisgKiB0aGUgYXNzb2NpYXRpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzY3RwX3VscGV2ZW50X3NldF9vd25lcihzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQsCisJCQkJCSAgIGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwkvKiBDYXN0IGF3YXkgdGhlIGNvbnN0LCBhcyB3ZSBhcmUganVzdCB3YW50aW5nIHRvCisJICogYnVtcCB0aGUgcmVmZXJlbmNlIGNvdW50LgorCSAqLworCXNjdHBfYXNzb2NpYXRpb25faG9sZCgoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKilhc29jKTsKKwlza2IgPSBzY3RwX2V2ZW50MnNrYihldmVudCk7CisJc2tiLT5zayA9IGFzb2MtPmJhc2Uuc2s7CisJZXZlbnQtPmFzb2MgPSAoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKilhc29jOworCXNrYi0+ZGVzdHJ1Y3RvciA9IHNjdHBfc3R1Yl9yZnJlZTsKK30KKworLyogQSBzaW1wbGUgZGVzdHJ1Y3RvciB0byBnaXZlIHVwIHRoZSByZWZlcmVuY2UgdG8gdGhlIGFzc29jaWF0aW9uLiAqLworc3RhdGljIGlubGluZSB2b2lkIHNjdHBfdWxwZXZlbnRfcmVsZWFzZV9vd25lcihzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQpCit7CisJc2N0cF9hc3NvY2lhdGlvbl9wdXQoZXZlbnQtPmFzb2MpOworfQorCisvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYW4gU0NUUF9BU1NPQ19DSEFOR0UgZXZlbnQuCisgKgorICogNS4zLjEuMSBTQ1RQX0FTU09DX0NIQU5HRQorICoKKyAqIENvbW11bmljYXRpb24gbm90aWZpY2F0aW9ucyBpbmZvcm0gdGhlIFVMUCB0aGF0IGFuIFNDVFAgYXNzb2NpYXRpb24KKyAqIGhhcyBlaXRoZXIgYmVndW4gb3IgZW5kZWQuIFRoZSBpZGVudGlmaWVyIGZvciBhIG5ldyBhc3NvY2lhdGlvbiBpcworICogcHJvdmlkZWQgYnkgdGhpcyBub3RpZmljYXRpb24uCisgKgorICogTm90ZTogVGhlcmUgaXMgbm8gZmllbGQgY2hlY2tpbmcgaGVyZS4gIElmIGEgZmllbGQgaXMgdW51c2VkIGl0IHdpbGwgYmUKKyAqIHplcm8nZCBvdXQuCisgKi8KK3N0cnVjdCBzY3RwX3VscGV2ZW50ICAqc2N0cF91bHBldmVudF9tYWtlX2Fzc29jX2NoYW5nZSgKKwljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwlfX3UxNiBmbGFncywgX191MTYgc3RhdGUsIF9fdTE2IGVycm9yLCBfX3UxNiBvdXRib3VuZCwKKwlfX3UxNiBpbmJvdW5kLCBpbnQgZ2ZwKQoreworCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudDsKKwlzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UgKnNhYzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJZXZlbnQgPSBzY3RwX3VscGV2ZW50X25ldyhzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlKSwKKwkJCQkgIE1TR19OT1RJRklDQVRJT04sIGdmcCk7CisJaWYgKCFldmVudCkKKwkJZ290byBmYWlsOworCXNrYiA9IHNjdHBfZXZlbnQyc2tiKGV2ZW50KTsKKwlzYWMgPSAoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlICopCisJCXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlKSk7CisKKwkvKiBTb2NrZXQgRXh0ZW5zaW9ucyBmb3IgU0NUUAorCSAqIDUuMy4xLjEgU0NUUF9BU1NPQ19DSEFOR0UKKwkgKgorCSAqIHNhY190eXBlOgorCSAqIEl0IHNob3VsZCBiZSBTQ1RQX0FTU09DX0NIQU5HRS4KKwkgKi8KKwlzYWMtPnNhY190eXBlID0gU0NUUF9BU1NPQ19DSEFOR0U7CisKKwkvKiBTb2NrZXQgRXh0ZW5zaW9ucyBmb3IgU0NUUAorCSAqIDUuMy4xLjEgU0NUUF9BU1NPQ19DSEFOR0UKKwkgKgorCSAqIHNhY19zdGF0ZTogMzIgYml0cyAoc2lnbmVkIGludGVnZXIpCisJICogVGhpcyBmaWVsZCBob2xkcyBvbmUgb2YgYSBudW1iZXIgb2YgdmFsdWVzIHRoYXQgY29tbXVuaWNhdGUgdGhlCisJICogZXZlbnQgdGhhdCBoYXBwZW5lZCB0byB0aGUgYXNzb2NpYXRpb24uCisJICovCisJc2FjLT5zYWNfc3RhdGUgPSBzdGF0ZTsKKworCS8qIFNvY2tldCBFeHRlbnNpb25zIGZvciBTQ1RQCisJICogNS4zLjEuMSBTQ1RQX0FTU09DX0NIQU5HRQorCSAqCisJICogc2FjX2ZsYWdzOiAxNiBiaXRzICh1bnNpZ25lZCBpbnRlZ2VyKQorCSAqIEN1cnJlbnRseSB1bnVzZWQuCisJICovCisJc2FjLT5zYWNfZmxhZ3MgPSAwOworCisJLyogU29ja2V0IEV4dGVuc2lvbnMgZm9yIFNDVFAKKwkgKiA1LjMuMS4xIFNDVFBfQVNTT0NfQ0hBTkdFCisJICoKKwkgKiBzYWNfbGVuZ3RoOiBzaXplb2YgKF9fdTMyKQorCSAqIFRoaXMgZmllbGQgaXMgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgbm90aWZpY2F0aW9uIGRhdGEsIGluY2x1ZGluZworCSAqIHRoZSBub3RpZmljYXRpb24gaGVhZGVyLgorCSAqLworCXNhYy0+c2FjX2xlbmd0aCA9IHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpOworCisJLyogU29ja2V0IEV4dGVuc2lvbnMgZm9yIFNDVFAKKwkgKiA1LjMuMS4xIFNDVFBfQVNTT0NfQ0hBTkdFCisJICoKKwkgKiBzYWNfZXJyb3I6ICAzMiBiaXRzIChzaWduZWQgaW50ZWdlcikKKwkgKgorCSAqIElmIHRoZSBzdGF0ZSB3YXMgcmVhY2hlZCBkdWUgdG8gYSBlcnJvciBjb25kaXRpb24gKGUuZy4KKwkgKiBDT01NVU5JQ0FUSU9OX0xPU1QpIGFueSByZWxldmFudCBlcnJvciBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgaW4KKwkgKiB0aGlzIGZpZWxkLiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBwcm90b2NvbCBlcnJvciBjb2RlcyBkZWZpbmVkIGluCisJICogW1NDVFBdLgorCSAqLworCXNhYy0+c2FjX2Vycm9yID0gZXJyb3I7CisKKwkvKiBTb2NrZXQgRXh0ZW5zaW9ucyBmb3IgU0NUUAorCSAqIDUuMy4xLjEgU0NUUF9BU1NPQ19DSEFOR0UKKwkgKgorCSAqIHNhY19vdXRib3VuZF9zdHJlYW1zOiAgMTYgYml0cyAodW5zaWduZWQgaW50ZWdlcikKKwkgKiBzYWNfaW5ib3VuZF9zdHJlYW1zOiAgMTYgYml0cyAodW5zaWduZWQgaW50ZWdlcikKKwkgKgorCSAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdHJlYW1zIGFsbG93ZWQgaW4gZWFjaCBkaXJlY3Rpb24gYXJlCisJICogYXZhaWxhYmxlIGluIHNhY19vdXRib3VuZF9zdHJlYW1zIGFuZCBzYWNfaW5ib3VuZCBzdHJlYW1zLgorCSAqLworCXNhYy0+c2FjX291dGJvdW5kX3N0cmVhbXMgPSBvdXRib3VuZDsKKwlzYWMtPnNhY19pbmJvdW5kX3N0cmVhbXMgPSBpbmJvdW5kOworCisJLyogU29ja2V0IEV4dGVuc2lvbnMgZm9yIFNDVFAKKwkgKiA1LjMuMS4xIFNDVFBfQVNTT0NfQ0hBTkdFCisJICoKKwkgKiBzYWNfYXNzb2NfaWQ6IHNpemVvZiAoc2N0cF9hc3NvY190KQorCSAqCisJICogVGhlIGFzc29jaWF0aW9uIGlkIGZpZWxkLCBob2xkcyB0aGUgaWRlbnRpZmllciBmb3IgdGhlIGFzc29jaWF0aW9uLgorCSAqIEFsbCBub3RpZmljYXRpb25zIGZvciBhIGdpdmVuIGFzc29jaWF0aW9uIGhhdmUgdGhlIHNhbWUgYXNzb2NpYXRpb24KKwkgKiBpZGVudGlmaWVyLiAgRm9yIFRDUCBzdHlsZSBzb2NrZXQsIHRoaXMgZmllbGQgaXMgaWdub3JlZC4KKwkgKi8KKwlzY3RwX3VscGV2ZW50X3NldF9vd25lcihldmVudCwgYXNvYyk7CisJc2FjLT5zYWNfYXNzb2NfaWQgPSBzY3RwX2Fzc29jMmlkKGFzb2MpOworCisJcmV0dXJuIGV2ZW50OworCitmYWlsOgorCXJldHVybiBOVUxMOworfQorCisvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYW4gU0NUUF9QRUVSX0FERFJfQ0hBTkdFIGV2ZW50LgorICoKKyAqIFNvY2tldCBFeHRlbnNpb25zIGZvciBTQ1RQIC0gZHJhZnQtMDEKKyAqIDUuMy4xLjIgU0NUUF9QRUVSX0FERFJfQ0hBTkdFCisgKgorICogV2hlbiBhIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb24gYSBtdWx0aS1ob21lZCBwZWVyIGVuY291bnRlcnMgYSBjaGFuZ2UKKyAqIGFuIGludGVyZmFjZSBkZXRhaWxzIGV2ZW50IGlzIHNlbnQuCisgKi8KK3N0cnVjdCBzY3RwX3VscGV2ZW50ICpzY3RwX3VscGV2ZW50X21ha2VfcGVlcl9hZGRyX2NoYW5nZSgKKwljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWFkZHIsCisJaW50IGZsYWdzLCBpbnQgc3RhdGUsIGludCBlcnJvciwgaW50IGdmcCkKK3sKKwlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQ7CisJc3RydWN0IHNjdHBfcGFkZHJfY2hhbmdlICAqc3BjOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlldmVudCA9IHNjdHBfdWxwZXZlbnRfbmV3KHNpemVvZihzdHJ1Y3Qgc2N0cF9wYWRkcl9jaGFuZ2UpLAorCQkJCSAgTVNHX05PVElGSUNBVElPTiwgZ2ZwKTsKKwlpZiAoIWV2ZW50KQorCQlnb3RvIGZhaWw7CisKKwlza2IgPSBzY3RwX2V2ZW50MnNrYihldmVudCk7CisJc3BjID0gKHN0cnVjdCBzY3RwX3BhZGRyX2NoYW5nZSAqKQorCQlza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBzY3RwX3BhZGRyX2NoYW5nZSkpOworCisJLyogU29ja2V0cyBBUEkgRXh0ZW5zaW9ucyBmb3IgU0NUUAorCSAqIFNlY3Rpb24gNS4zLjEuMiBTQ1RQX1BFRVJfQUREUl9DSEFOR0UKKwkgKgorCSAqIHNwY190eXBlOgorCSAqCisJICogICAgSXQgc2hvdWxkIGJlIFNDVFBfUEVFUl9BRERSX0NIQU5HRS4KKwkgKi8KKwlzcGMtPnNwY190eXBlID0gU0NUUF9QRUVSX0FERFJfQ0hBTkdFOworCisJLyogU29ja2V0cyBBUEkgRXh0ZW5zaW9ucyBmb3IgU0NUUAorCSAqIFNlY3Rpb24gNS4zLjEuMiBTQ1RQX1BFRVJfQUREUl9DSEFOR0UKKwkgKgorCSAqIHNwY19sZW5ndGg6IHNpemVvZiAoX191MzIpCisJICoKKwkgKiBUaGlzIGZpZWxkIGlzIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIG5vdGlmaWNhdGlvbiBkYXRhLCBpbmNsdWRpbmcKKwkgKiB0aGUgbm90aWZpY2F0aW9uIGhlYWRlci4KKwkgKi8KKwlzcGMtPnNwY19sZW5ndGggPSBzaXplb2Yoc3RydWN0IHNjdHBfcGFkZHJfY2hhbmdlKTsKKworCS8qIFNvY2tldHMgQVBJIEV4dGVuc2lvbnMgZm9yIFNDVFAKKwkgKiBTZWN0aW9uIDUuMy4xLjIgU0NUUF9QRUVSX0FERFJfQ0hBTkdFCisJICoKKwkgKiBzcGNfZmxhZ3M6IDE2IGJpdHMgKHVuc2lnbmVkIGludGVnZXIpCisJICogQ3VycmVudGx5IHVudXNlZC4KKwkgKi8KKwlzcGMtPnNwY19mbGFncyA9IDA7CisKKwkvKiBTb2NrZXRzIEFQSSBFeHRlbnNpb25zIGZvciBTQ1RQCisJICogU2VjdGlvbiA1LjMuMS4yIFNDVFBfUEVFUl9BRERSX0NIQU5HRQorCSAqCisJICogc3BjX3N0YXRlOiAgMzIgYml0cyAoc2lnbmVkIGludGVnZXIpCisJICoKKwkgKiBUaGlzIGZpZWxkIGhvbGRzIG9uZSBvZiBhIG51bWJlciBvZiB2YWx1ZXMgdGhhdCBjb21tdW5pY2F0ZSB0aGUKKwkgKiBldmVudCB0aGF0IGhhcHBlbmVkIHRvIHRoZSBhZGRyZXNzLgorCSAqLworCXNwYy0+c3BjX3N0YXRlID0gc3RhdGU7CisKKwkvKiBTb2NrZXRzIEFQSSBFeHRlbnNpb25zIGZvciBTQ1RQCisJICogU2VjdGlvbiA1LjMuMS4yIFNDVFBfUEVFUl9BRERSX0NIQU5HRQorCSAqCisJICogc3BjX2Vycm9yOiAgMzIgYml0cyAoc2lnbmVkIGludGVnZXIpCisJICoKKwkgKiBJZiB0aGUgc3RhdGUgd2FzIHJlYWNoZWQgZHVlIHRvIGFueSBlcnJvciBjb25kaXRpb24gKGUuZy4KKwkgKiBBRERSRVNTX1VOUkVBQ0hBQkxFKSBhbnkgcmVsZXZhbnQgZXJyb3IgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGluCisJICogdGhpcyBmaWVsZC4KKwkgKi8KKwlzcGMtPnNwY19lcnJvciA9IGVycm9yOworCisJLyogU29ja2V0IEV4dGVuc2lvbnMgZm9yIFNDVFAKKwkgKiA1LjMuMS4xIFNDVFBfQVNTT0NfQ0hBTkdFCisJICoKKwkgKiBzcGNfYXNzb2NfaWQ6IHNpemVvZiAoc2N0cF9hc3NvY190KQorCSAqCisJICogVGhlIGFzc29jaWF0aW9uIGlkIGZpZWxkLCBob2xkcyB0aGUgaWRlbnRpZmllciBmb3IgdGhlIGFzc29jaWF0aW9uLgorCSAqIEFsbCBub3RpZmljYXRpb25zIGZvciBhIGdpdmVuIGFzc29jaWF0aW9uIGhhdmUgdGhlIHNhbWUgYXNzb2NpYXRpb24KKwkgKiBpZGVudGlmaWVyLiAgRm9yIFRDUCBzdHlsZSBzb2NrZXQsIHRoaXMgZmllbGQgaXMgaWdub3JlZC4KKwkgKi8KKwlzY3RwX3VscGV2ZW50X3NldF9vd25lcihldmVudCwgYXNvYyk7CisJc3BjLT5zcGNfYXNzb2NfaWQgPSBzY3RwX2Fzc29jMmlkKGFzb2MpOworCisJLyogU29ja2V0cyBBUEkgRXh0ZW5zaW9ucyBmb3IgU0NUUAorCSAqIFNlY3Rpb24gNS4zLjEuMiBTQ1RQX1BFRVJfQUREUl9DSEFOR0UKKwkgKgorCSAqIHNwY19hYWRkcjogc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSkKKwkgKgorCSAqIFRoZSBhZmZlY3RlZCBhZGRyZXNzIGZpZWxkLCBob2xkcyB0aGUgcmVtb3RlIHBlZXIncyBhZGRyZXNzIHRoYXQgaXMKKwkgKiBlbmNvdW50ZXJpbmcgdGhlIGNoYW5nZSBvZiBzdGF0ZS4KKwkgKi8KKwltZW1jcHkoJnNwYy0+c3BjX2FhZGRyLCBhYWRkciwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKSk7CisKKwkvKiBNYXAgaXB2NCBhZGRyZXNzIGludG8gdjQtbWFwcGVkLW9uLXY2IGFkZHJlc3MuICAqLworCXNjdHBfZ2V0X3BmX3NwZWNpZmljKGFzb2MtPmJhc2Uuc2stPnNrX2ZhbWlseSktPmFkZHJfdjRtYXAoCisJCQkJCXNjdHBfc2soYXNvYy0+YmFzZS5zayksCisJCQkJCSh1bmlvbiBzY3RwX2FkZHIgKikmc3BjLT5zcGNfYWFkZHIpOworCisJcmV0dXJuIGV2ZW50OworCitmYWlsOgorCXJldHVybiBOVUxMOworfQorCisvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYW4gU0NUUF9SRU1PVEVfRVJST1Igbm90aWZpY2F0aW9uLgorICoKKyAqIE5vdGU6IFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBjaHVuay0+c2tiLT5kYXRhIGFscmVhZHkgcG9pbnRzIHRvIHRoZQorICogb3BlcmF0aW9uIGVycm9yIHBheWxvYWQuCisgKgorICogU29ja2V0IEV4dGVuc2lvbnMgZm9yIFNDVFAgLSBkcmFmdC0wMQorICogNS4zLjEuMyBTQ1RQX1JFTU9URV9FUlJPUgorICoKKyAqIEEgcmVtb3RlIHBlZXIgbWF5IHNlbmQgYW4gT3BlcmF0aW9uYWwgRXJyb3IgbWVzc2FnZSB0byBpdHMgcGVlci4KKyAqIFRoaXMgbWVzc2FnZSBpbmRpY2F0ZXMgYSB2YXJpZXR5IG9mIGVycm9yIGNvbmRpdGlvbnMgb24gYW4KKyAqIGFzc29jaWF0aW9uLiBUaGUgZW50aXJlIGVycm9yIFRMViBhcyBpdCBhcHBlYXJzIG9uIHRoZSB3aXJlIGlzCisgKiBpbmNsdWRlZCBpbiBhIFNDVFBfUkVNT1RFX0VSUk9SIGV2ZW50LiAgUGxlYXNlIHJlZmVyIHRvIHRoZSBTQ1RQCisgKiBzcGVjaWZpY2F0aW9uIFtTQ1RQXSBhbmQgYW55IGV4dGVuc2lvbnMgZm9yIGEgbGlzdCBvZiBwb3NzaWJsZQorICogZXJyb3IgZm9ybWF0cy4KKyAqLworc3RydWN0IHNjdHBfdWxwZXZlbnQgKnNjdHBfdWxwZXZlbnRfbWFrZV9yZW1vdGVfZXJyb3IoCisJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKKwlfX3UxNiBmbGFncywgaW50IGdmcCkKK3sKKwlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQ7CisJc3RydWN0IHNjdHBfcmVtb3RlX2Vycm9yICpzcmU7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzY3RwX2Vycmhkcl90ICpjaDsKKwlfX3UxNiBjYXVzZTsKKwlpbnQgZWxlbjsKKworCWNoID0gKHNjdHBfZXJyaGRyX3QgKikoY2h1bmstPnNrYi0+ZGF0YSk7CisJY2F1c2UgPSBjaC0+Y2F1c2U7CisJZWxlbiA9IFdPUkRfUk9VTkQobnRvaHMoY2gtPmxlbmd0aCkpIC0gc2l6ZW9mKHNjdHBfZXJyaGRyX3QpOworCisJLyogUHVsbCBvZmYgdGhlIEVSUk9SIGhlYWRlci4gICovCisJc2tiX3B1bGwoY2h1bmstPnNrYiwgc2l6ZW9mKHNjdHBfZXJyaGRyX3QpKTsKKworCS8qIENvcHkgdGhlIHNrYiB0byBhIG5ldyBza2Igd2l0aCByb29tIGZvciB1cyB0byBwcmVwZW5kCisJICogbm90aWZpY2F0aW9uIHdpdGguCisJICovCisJc2tiID0gc2tiX2NvcHlfZXhwYW5kKGNodW5rLT5za2IsIHNpemVvZihzdHJ1Y3Qgc2N0cF9yZW1vdGVfZXJyb3IpLAorCQkJICAgICAgMCwgZ2ZwKTsKKworCS8qIFB1bGwgb2ZmIHRoZSByZXN0IG9mIHRoZSBjYXVzZSBUTFYgZnJvbSB0aGUgY2h1bmsuICAqLworCXNrYl9wdWxsKGNodW5rLT5za2IsIGVsZW4pOworCWlmICghc2tiKQorCQlnb3RvIGZhaWw7CisKKwkvKiBFbWJlZCB0aGUgZXZlbnQgZmllbGRzIGluc2lkZSB0aGUgY2xvbmVkIHNrYi4gICovCisJZXZlbnQgPSBzY3RwX3NrYjJldmVudChza2IpOworCXNjdHBfdWxwZXZlbnRfaW5pdChldmVudCwgTVNHX05PVElGSUNBVElPTik7CisKKwlzcmUgPSAoc3RydWN0IHNjdHBfcmVtb3RlX2Vycm9yICopCisJCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBzY3RwX3JlbW90ZV9lcnJvcikpOworCisJLyogVHJpbSB0aGUgYnVmZmVyIHRvIHRoZSByaWdodCBsZW5ndGguICAqLworCXNrYl90cmltKHNrYiwgc2l6ZW9mKHN0cnVjdCBzY3RwX3JlbW90ZV9lcnJvcikgKyBlbGVuKTsKKworCS8qIFNvY2tldCBFeHRlbnNpb25zIGZvciBTQ1RQCisJICogNS4zLjEuMyBTQ1RQX1JFTU9URV9FUlJPUgorCSAqCisJICogc3JlX3R5cGU6CisJICogICBJdCBzaG91bGQgYmUgU0NUUF9SRU1PVEVfRVJST1IuCisJICovCisJc3JlLT5zcmVfdHlwZSA9IFNDVFBfUkVNT1RFX0VSUk9SOworCisJLyoKKwkgKiBTb2NrZXQgRXh0ZW5zaW9ucyBmb3IgU0NUUAorCSAqIDUuMy4xLjMgU0NUUF9SRU1PVEVfRVJST1IKKwkgKgorCSAqIHNyZV9mbGFnczogMTYgYml0cyAodW5zaWduZWQgaW50ZWdlcikKKwkgKiAgIEN1cnJlbnRseSB1bnVzZWQuCisJICovCisJc3JlLT5zcmVfZmxhZ3MgPSAwOworCisJLyogU29ja2V0IEV4dGVuc2lvbnMgZm9yIFNDVFAKKwkgKiA1LjMuMS4zIFNDVFBfUkVNT1RFX0VSUk9SCisJICoKKwkgKiBzcmVfbGVuZ3RoOiBzaXplb2YgKF9fdTMyKQorCSAqCisJICogVGhpcyBmaWVsZCBpcyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBub3RpZmljYXRpb24gZGF0YSwKKwkgKiBpbmNsdWRpbmcgdGhlIG5vdGlmaWNhdGlvbiBoZWFkZXIuCisJICovCisJc3JlLT5zcmVfbGVuZ3RoID0gc2tiLT5sZW47CisKKwkvKiBTb2NrZXQgRXh0ZW5zaW9ucyBmb3IgU0NUUAorCSAqIDUuMy4xLjMgU0NUUF9SRU1PVEVfRVJST1IKKwkgKgorCSAqIHNyZV9lcnJvcjogMTYgYml0cyAodW5zaWduZWQgaW50ZWdlcikKKwkgKiBUaGlzIHZhbHVlIHJlcHJlc2VudHMgb25lIG9mIHRoZSBPcGVyYXRpb25hbCBFcnJvciBjYXVzZXMgZGVmaW5lZCBpbgorCSAqIHRoZSBTQ1RQIHNwZWNpZmljYXRpb24sIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KKwkgKi8KKwlzcmUtPnNyZV9lcnJvciA9IGNhdXNlOworCisJLyogU29ja2V0IEV4dGVuc2lvbnMgZm9yIFNDVFAKKwkgKiA1LjMuMS4zIFNDVFBfUkVNT1RFX0VSUk9SCisJICoKKwkgKiBzcmVfYXNzb2NfaWQ6IHNpemVvZiAoc2N0cF9hc3NvY190KQorCSAqCisJICogVGhlIGFzc29jaWF0aW9uIGlkIGZpZWxkLCBob2xkcyB0aGUgaWRlbnRpZmllciBmb3IgdGhlIGFzc29jaWF0aW9uLgorCSAqIEFsbCBub3RpZmljYXRpb25zIGZvciBhIGdpdmVuIGFzc29jaWF0aW9uIGhhdmUgdGhlIHNhbWUgYXNzb2NpYXRpb24KKwkgKiBpZGVudGlmaWVyLiAgRm9yIFRDUCBzdHlsZSBzb2NrZXQsIHRoaXMgZmllbGQgaXMgaWdub3JlZC4KKwkgKi8KKwlzY3RwX3VscGV2ZW50X3NldF9vd25lcihldmVudCwgYXNvYyk7CisJc3JlLT5zcmVfYXNzb2NfaWQgPSBzY3RwX2Fzc29jMmlkKGFzb2MpOworCisJcmV0dXJuIGV2ZW50OworCitmYWlsOgorCXJldHVybiBOVUxMOworfQorCisvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBTQ1RQX1NFTkRfRkFJTEVEIG5vdGlmaWNhdGlvbi4KKyAqCisgKiBTb2NrZXQgRXh0ZW5zaW9ucyBmb3IgU0NUUCAtIGRyYWZ0LTAxCisgKiA1LjMuMS40IFNDVFBfU0VORF9GQUlMRUQKKyAqLworc3RydWN0IHNjdHBfdWxwZXZlbnQgKnNjdHBfdWxwZXZlbnRfbWFrZV9zZW5kX2ZhaWxlZCgKKwljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLAorCV9fdTE2IGZsYWdzLCBfX3UzMiBlcnJvciwgaW50IGdmcCkKK3sKKwlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQ7CisJc3RydWN0IHNjdHBfc2VuZF9mYWlsZWQgKnNzZjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJLyogUHVsbCBvZmYgYW55IHBhZGRpbmcuICovCisJaW50IGxlbiA9IG50b2hzKGNodW5rLT5jaHVua19oZHItPmxlbmd0aCk7CisKKwkvKiBNYWtlIHNrYiB3aXRoIG1vcmUgcm9vbSBzbyB3ZSBjYW4gcHJlcGVuZCBub3RpZmljYXRpb24uICAqLworCXNrYiA9IHNrYl9jb3B5X2V4cGFuZChjaHVuay0+c2tiLAorCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX3NlbmRfZmFpbGVkKSwgLyogaGVhZHJvb20gKi8KKwkJCSAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRhaWxyb29tICovCisJCQkgICAgICBnZnApOworCWlmICghc2tiKQorCQlnb3RvIGZhaWw7CisKKwkvKiBQdWxsIG9mZiB0aGUgY29tbW9uIGNodW5rIGhlYWRlciBhbmQgREFUQSBoZWFkZXIuICAqLworCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBzY3RwX2RhdGFfY2h1bmspKTsKKwlsZW4gLT0gc2l6ZW9mKHN0cnVjdCBzY3RwX2RhdGFfY2h1bmspOworCisJLyogRW1iZWQgdGhlIGV2ZW50IGZpZWxkcyBpbnNpZGUgdGhlIGNsb25lZCBza2IuICAqLworCWV2ZW50ID0gc2N0cF9za2IyZXZlbnQoc2tiKTsKKwlzY3RwX3VscGV2ZW50X2luaXQoZXZlbnQsIE1TR19OT1RJRklDQVRJT04pOworCisJc3NmID0gKHN0cnVjdCBzY3RwX3NlbmRfZmFpbGVkICopCisJCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBzY3RwX3NlbmRfZmFpbGVkKSk7CisKKwkvKiBTb2NrZXQgRXh0ZW5zaW9ucyBmb3IgU0NUUAorCSAqIDUuMy4xLjQgU0NUUF9TRU5EX0ZBSUxFRAorCSAqCisJICogc3NmX3R5cGU6CisJICogSXQgc2hvdWxkIGJlIFNDVFBfU0VORF9GQUlMRUQuCisJICovCisJc3NmLT5zc2ZfdHlwZSA9IFNDVFBfU0VORF9GQUlMRUQ7CisKKwkvKiBTb2NrZXQgRXh0ZW5zaW9ucyBmb3IgU0NUUAorCSAqIDUuMy4xLjQgU0NUUF9TRU5EX0ZBSUxFRAorCSAqCisJICogc3NmX2ZsYWdzOiAxNiBiaXRzICh1bnNpZ25lZCBpbnRlZ2VyKQorCSAqIFRoZSBmbGFnIHZhbHVlIHdpbGwgdGFrZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMKKwkgKgorCSAqIFNDVFBfREFUQV9VTlNFTlQgLSBJbmRpY2F0ZXMgdGhhdCB0aGUgZGF0YSB3YXMgbmV2ZXIgcHV0IG9uCisJICogICAgICAgICAgICAgICAgICAgIHRoZSB3aXJlLgorCSAqCisJICogU0NUUF9EQVRBX1NFTlQgICAtIEluZGljYXRlcyB0aGF0IHRoZSBkYXRhIHdhcyBwdXQgb24gdGhlIHdpcmUuCisJICogICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhhdCB0aGUKKwkgKiAgICAgICAgICAgICAgICAgICAgZGF0YSB3YXMgKG9yIHdhcyBub3QpIHN1Y2Nlc3NmdWxseSBkZWxpdmVyZWQuCisJICovCisJc3NmLT5zc2ZfZmxhZ3MgPSBmbGFnczsKKworCS8qIFNvY2tldCBFeHRlbnNpb25zIGZvciBTQ1RQCisJICogNS4zLjEuNCBTQ1RQX1NFTkRfRkFJTEVECisJICoKKwkgKiBzc2ZfbGVuZ3RoOiBzaXplb2YgKF9fdTMyKQorCSAqIFRoaXMgZmllbGQgaXMgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgbm90aWZpY2F0aW9uIGRhdGEsIGluY2x1ZGluZworCSAqIHRoZSBub3RpZmljYXRpb24gaGVhZGVyLgorCSAqLworCXNzZi0+c3NmX2xlbmd0aCA9IHNpemVvZihzdHJ1Y3Qgc2N0cF9zZW5kX2ZhaWxlZCkgKyBsZW47CisJc2tiX3RyaW0oc2tiLCBzc2YtPnNzZl9sZW5ndGgpOworCisJLyogU29ja2V0IEV4dGVuc2lvbnMgZm9yIFNDVFAKKwkgKiA1LjMuMS40IFNDVFBfU0VORF9GQUlMRUQKKwkgKgorCSAqIHNzZl9lcnJvcjogMTYgYml0cyAodW5zaWduZWQgaW50ZWdlcikKKwkgKiBUaGlzIHZhbHVlIHJlcHJlc2VudHMgdGhlIHJlYXNvbiB3aHkgdGhlIHNlbmQgZmFpbGVkLCBhbmQgaWYgc2V0LAorCSAqIHdpbGwgYmUgYSBTQ1RQIHByb3RvY29sIGVycm9yIGNvZGUgYXMgZGVmaW5lZCBpbiBbU0NUUF0gc2VjdGlvbgorCSAqIDMuMy4xMC4KKwkgKi8KKwlzc2YtPnNzZl9lcnJvciA9IGVycm9yOworCisJLyogU29ja2V0IEV4dGVuc2lvbnMgZm9yIFNDVFAKKwkgKiA1LjMuMS40IFNDVFBfU0VORF9GQUlMRUQKKwkgKgorCSAqIHNzZl9pbmZvOiBzaXplb2YgKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pCisJICogVGhlIG9yaWdpbmFsIHNlbmQgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSB1bmRlbGl2ZXJlZAorCSAqIG1lc3NhZ2UuCisJICovCisJbWVtY3B5KCZzc2YtPnNzZl9pbmZvLCAmY2h1bmstPnNpbmZvLCBzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCisJLyogUGVyIFRTVldHIGRpc2N1c3Npb24gd2l0aCBSYW5keS4gQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvCisJICogcmVzc2VtYmxlIGEgZnJhZ21lbnRlZCBtZXNzYWdlLgorCSAqLworCXNzZi0+c3NmX2luZm8uc2luZm9fZmxhZ3MgPSBjaHVuay0+Y2h1bmtfaGRyLT5mbGFnczsKKworCS8qIFNvY2tldCBFeHRlbnNpb25zIGZvciBTQ1RQCisJICogNS4zLjEuNCBTQ1RQX1NFTkRfRkFJTEVECisJICoKKwkgKiBzc2ZfYXNzb2NfaWQ6IHNpemVvZiAoc2N0cF9hc3NvY190KQorCSAqIFRoZSBhc3NvY2lhdGlvbiBpZCBmaWVsZCwgc2ZfYXNzb2NfaWQsIGhvbGRzIHRoZSBpZGVudGlmaWVyIGZvciB0aGUKKwkgKiBhc3NvY2lhdGlvbi4gIEFsbCBub3RpZmljYXRpb25zIGZvciBhIGdpdmVuIGFzc29jaWF0aW9uIGhhdmUgdGhlCisJICogc2FtZSBhc3NvY2lhdGlvbiBpZGVudGlmaWVyLiAgRm9yIFRDUCBzdHlsZSBzb2NrZXQsIHRoaXMgZmllbGQgaXMKKwkgKiBpZ25vcmVkLgorCSAqLworCXNjdHBfdWxwZXZlbnRfc2V0X293bmVyKGV2ZW50LCBhc29jKTsKKwlzc2YtPnNzZl9hc3NvY19pZCA9IHNjdHBfYXNzb2MyaWQoYXNvYyk7CisJcmV0dXJuIGV2ZW50OworCitmYWlsOgorCXJldHVybiBOVUxMOworfQorCisvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBTQ1RQX1NIVVRET1dOX0VWRU5UIG5vdGlmaWNhdGlvbi4KKyAqCisgKiBTb2NrZXQgRXh0ZW5zaW9ucyBmb3IgU0NUUCAtIGRyYWZ0LTAxCisgKiA1LjMuMS41IFNDVFBfU0hVVERPV05fRVZFTlQKKyAqLworc3RydWN0IHNjdHBfdWxwZXZlbnQgKnNjdHBfdWxwZXZlbnRfbWFrZV9zaHV0ZG93bl9ldmVudCgKKwljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwlfX3UxNiBmbGFncywgaW50IGdmcCkKK3sKKwlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQ7CisJc3RydWN0IHNjdHBfc2h1dGRvd25fZXZlbnQgKnNzZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJZXZlbnQgPSBzY3RwX3VscGV2ZW50X25ldyhzaXplb2Yoc3RydWN0IHNjdHBfc2h1dGRvd25fZXZlbnQpLAorCQkJCSAgTVNHX05PVElGSUNBVElPTiwgZ2ZwKTsKKwlpZiAoIWV2ZW50KQorCQlnb3RvIGZhaWw7CisKKwlza2IgPSBzY3RwX2V2ZW50MnNrYihldmVudCk7CisJc3NlID0gKHN0cnVjdCBzY3RwX3NodXRkb3duX2V2ZW50ICopCisJCXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IHNjdHBfc2h1dGRvd25fZXZlbnQpKTsKKworCS8qIFNvY2tldCBFeHRlbnNpb25zIGZvciBTQ1RQCisJICogNS4zLjEuNSBTQ1RQX1NIVVRET1dOX0VWRU5UCisJICoKKwkgKiBzc2VfdHlwZQorCSAqIEl0IHNob3VsZCBiZSBTQ1RQX1NIVVRET1dOX0VWRU5UCisJICovCisJc3NlLT5zc2VfdHlwZSA9IFNDVFBfU0hVVERPV05fRVZFTlQ7CisKKwkvKiBTb2NrZXQgRXh0ZW5zaW9ucyBmb3IgU0NUUAorCSAqIDUuMy4xLjUgU0NUUF9TSFVURE9XTl9FVkVOVAorCSAqCisJICogc3NlX2ZsYWdzOiAxNiBiaXRzICh1bnNpZ25lZCBpbnRlZ2VyKQorCSAqIEN1cnJlbnRseSB1bnVzZWQuCisJICovCisJc3NlLT5zc2VfZmxhZ3MgPSAwOworCisJLyogU29ja2V0IEV4dGVuc2lvbnMgZm9yIFNDVFAKKwkgKiA1LjMuMS41IFNDVFBfU0hVVERPV05fRVZFTlQKKwkgKgorCSAqIHNzZV9sZW5ndGg6IHNpemVvZiAoX191MzIpCisJICogVGhpcyBmaWVsZCBpcyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBub3RpZmljYXRpb24gZGF0YSwgaW5jbHVkaW5nCisJICogdGhlIG5vdGlmaWNhdGlvbiBoZWFkZXIuCisJICovCisJc3NlLT5zc2VfbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBzY3RwX3NodXRkb3duX2V2ZW50KTsKKworCS8qIFNvY2tldCBFeHRlbnNpb25zIGZvciBTQ1RQCisJICogNS4zLjEuNSBTQ1RQX1NIVVRET1dOX0VWRU5UCisJICoKKwkgKiBzc2VfYXNzb2NfaWQ6IHNpemVvZiAoc2N0cF9hc3NvY190KQorCSAqIFRoZSBhc3NvY2lhdGlvbiBpZCBmaWVsZCwgaG9sZHMgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBhc3NvY2lhdGlvbi4KKwkgKiBBbGwgbm90aWZpY2F0aW9ucyBmb3IgYSBnaXZlbiBhc3NvY2lhdGlvbiBoYXZlIHRoZSBzYW1lIGFzc29jaWF0aW9uCisJICogaWRlbnRpZmllci4gIEZvciBUQ1Agc3R5bGUgc29ja2V0LCB0aGlzIGZpZWxkIGlzIGlnbm9yZWQuCisJICovCisJc2N0cF91bHBldmVudF9zZXRfb3duZXIoZXZlbnQsIGFzb2MpOworCXNzZS0+c3NlX2Fzc29jX2lkID0gc2N0cF9hc3NvYzJpZChhc29jKTsKKworCXJldHVybiBldmVudDsKKworZmFpbDoKKwlyZXR1cm4gTlVMTDsKK30KKworLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgU0NUUF9BREFQVElPTl9JTkRJQ0FUSU9OIG5vdGlmaWNhdGlvbi4KKyAqCisgKiBTb2NrZXQgRXh0ZW5zaW9ucyBmb3IgU0NUUAorICogNS4zLjEuNiBTQ1RQX0FEQVBUSU9OX0lORElDQVRJT04KKyAqLworc3RydWN0IHNjdHBfdWxwZXZlbnQgKnNjdHBfdWxwZXZlbnRfbWFrZV9hZGFwdGlvbl9pbmRpY2F0aW9uKAorCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLCBpbnQgZ2ZwKQoreworCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudDsKKwlzdHJ1Y3Qgc2N0cF9hZGFwdGlvbl9ldmVudCAqc2FpOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlldmVudCA9IHNjdHBfdWxwZXZlbnRfbmV3KHNpemVvZihzdHJ1Y3Qgc2N0cF9hZGFwdGlvbl9ldmVudCksCisJCQkJICBNU0dfTk9USUZJQ0FUSU9OLCBnZnApOworCWlmICghZXZlbnQpCisJCWdvdG8gZmFpbDsKKworCXNrYiA9IHNjdHBfZXZlbnQyc2tiKGV2ZW50KTsKKwlzYWkgPSAoc3RydWN0IHNjdHBfYWRhcHRpb25fZXZlbnQgKikKKwkJc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3Qgc2N0cF9hZGFwdGlvbl9ldmVudCkpOworCisJc2FpLT5zYWlfdHlwZSA9IFNDVFBfQURBUFRJT05fSU5ESUNBVElPTjsKKwlzYWktPnNhaV9mbGFncyA9IDA7CisJc2FpLT5zYWlfbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBzY3RwX2FkYXB0aW9uX2V2ZW50KTsKKwlzYWktPnNhaV9hZGFwdGlvbl9pbmQgPSBhc29jLT5wZWVyLmFkYXB0aW9uX2luZDsKKwlzY3RwX3VscGV2ZW50X3NldF9vd25lcihldmVudCwgYXNvYyk7CisJc2FpLT5zYWlfYXNzb2NfaWQgPSBzY3RwX2Fzc29jMmlkKGFzb2MpOworCisJcmV0dXJuIGV2ZW50OworCitmYWlsOgorCXJldHVybiBOVUxMOworfQorCisvKiBBIG1lc3NhZ2UgaGFzIGJlZW4gcmVjZWl2ZWQuICBQYWNrYWdlIHRoaXMgbWVzc2FnZSBhcyBhIG5vdGlmaWNhdGlvbgorICogdG8gcGFzcyBpdCB0byB0aGUgdXBwZXIgbGF5ZXJzLiAgR28gYWhlYWQgYW5kIGNhbGN1bGF0ZSB0aGUgc25kcmN2aW5mbworICogZXZlbiBpZiBmaWx0ZXJlZCBvdXQgbGF0ZXIuCisgKgorICogU29ja2V0IEV4dGVuc2lvbnMgZm9yIFNDVFAKKyAqIDUuMi4yIFNDVFAgSGVhZGVyIEluZm9ybWF0aW9uIFN0cnVjdHVyZSAoU0NUUF9TTkRSQ1YpCisgKi8KK3N0cnVjdCBzY3RwX3VscGV2ZW50ICpzY3RwX3VscGV2ZW50X21ha2VfcmN2bXNnKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCQkJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLAorCQkJCQkJaW50IGdmcCkKK3sKKwlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2I7CisJc2l6ZV90IHBhZGRpbmcsIGxlbjsKKworCS8qIENsb25lIHRoZSBvcmlnaW5hbCBza2IsIHNoYXJpbmcgdGhlIGRhdGEuICAqLworCXNrYiA9IHNrYl9jbG9uZShjaHVuay0+c2tiLCBnZnApOworCWlmICghc2tiKQorCQlnb3RvIGZhaWw7CisKKwkvKiBGaXJzdCBjYWxjdWxhdGUgdGhlIHBhZGRpbmcsIHNvIHdlIGRvbid0IGluYWR2ZXJ0ZW50bHkKKwkgKiBwYXNzIHVwIHRoZSB3cm9uZyBsZW5ndGggdG8gdGhlIHVzZXIuCisJICoKKwkgKiBSRkMgMjk2MCAtIFNlY3Rpb24gMy4yICBDaHVuayBGaWVsZCBEZXNjcmlwdGlvbnMKKwkgKgorCSAqIFRoZSB0b3RhbCBsZW5ndGggb2YgYSBjaHVuayhpbmNsdWRpbmcgVHlwZSwgTGVuZ3RoIGFuZCBWYWx1ZSBmaWVsZHMpCisJICogTVVTVCBiZSBhIG11bHRpcGxlIG9mIDQgYnl0ZXMuICBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBjaHVuayBpcyBub3QgYQorCSAqIG11bHRpcGxlIG9mIDQgYnl0ZXMsIHRoZSBzZW5kZXIgTVVTVCBwYWQgdGhlIGNodW5rIHdpdGggYWxsIHplcm8KKwkgKiBieXRlcyBhbmQgdGhpcyBwYWRkaW5nIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY2h1bmsgbGVuZ3RoIGZpZWxkLgorCSAqIFRoZSBzZW5kZXIgc2hvdWxkIG5ldmVyIHBhZCB3aXRoIG1vcmUgdGhhbiAzIGJ5dGVzLiAgVGhlIHJlY2VpdmVyCisJICogTVVTVCBpZ25vcmUgdGhlIHBhZGRpbmcgYnl0ZXMuCisJICovCisJbGVuID0gbnRvaHMoY2h1bmstPmNodW5rX2hkci0+bGVuZ3RoKTsKKwlwYWRkaW5nID0gV09SRF9ST1VORChsZW4pIC0gbGVuOworCisJLyogRml4dXAgY2xvbmVkIHNrYiB3aXRoIGp1c3QgdGhpcyBjaHVua3MgZGF0YS4gICovCisJc2tiX3RyaW0oc2tiLCBjaHVuay0+Y2h1bmtfZW5kIC0gcGFkZGluZyAtIHNrYi0+ZGF0YSk7CisKKwkvKiBFbWJlZCB0aGUgZXZlbnQgZmllbGRzIGluc2lkZSB0aGUgY2xvbmVkIHNrYi4gICovCisJZXZlbnQgPSBzY3RwX3NrYjJldmVudChza2IpOworCisJLyogSW5pdGlhbGl6ZSBldmVudCB3aXRoIGZsYWdzIDAuICAqLworCXNjdHBfdWxwZXZlbnRfaW5pdChldmVudCwgMCk7CisKKwlzY3RwX3VscGV2ZW50X3JlY2VpdmVfZGF0YShldmVudCwgYXNvYyk7CisKKwlldmVudC0+c3RyZWFtID0gbnRvaHMoY2h1bmstPnN1YmguZGF0YV9oZHItPnN0cmVhbSk7CisJZXZlbnQtPnNzbiA9IG50b2hzKGNodW5rLT5zdWJoLmRhdGFfaGRyLT5zc24pOworCWV2ZW50LT5wcGlkID0gY2h1bmstPnN1YmguZGF0YV9oZHItPnBwaWQ7CisJaWYgKGNodW5rLT5jaHVua19oZHItPmZsYWdzICYgU0NUUF9EQVRBX1VOT1JERVJFRCkgeworCQlldmVudC0+ZmxhZ3MgfD0gTVNHX1VOT1JERVJFRDsKKwkJZXZlbnQtPmN1bXRzbiA9IHNjdHBfdHNubWFwX2dldF9jdHNuKCZhc29jLT5wZWVyLnRzbl9tYXApOworCX0KKwlldmVudC0+dHNuID0gbnRvaGwoY2h1bmstPnN1YmguZGF0YV9oZHItPnRzbik7CisJZXZlbnQtPm1zZ19mbGFncyB8PSBjaHVuay0+Y2h1bmtfaGRyLT5mbGFnczsKKwlldmVudC0+aWlmID0gc2N0cF9jaHVua19paWYoY2h1bmspOworCitmYWlsOgorCXJldHVybiBldmVudDsKK30KKworLyogQ3JlYXRlIGEgcGFydGlhbCBkZWxpdmVyeSByZWxhdGVkIGV2ZW50LgorICoKKyAqIDUuMy4xLjcgU0NUUF9QQVJUSUFMX0RFTElWRVJZX0VWRU5UCisgKgorICogICBXaGVuIGEgcmVjZWl2ZXIgaXMgZW5nYWdlZCBpbiBhIHBhcnRpYWwgZGVsaXZlcnkgb2YgYQorICogICBtZXNzYWdlIHRoaXMgbm90aWZpY2F0aW9uIHdpbGwgYmUgdXNlZCB0byBpbmRpY2F0ZQorICogICB2YXJpb3VzIGV2ZW50cy4KKyAqLworc3RydWN0IHNjdHBfdWxwZXZlbnQgKnNjdHBfdWxwZXZlbnRfbWFrZV9wZGFwaSgKKwljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywgX191MzIgaW5kaWNhdGlvbiwgaW50IGdmcCkKK3sKKwlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQ7CisJc3RydWN0IHNjdHBfcGRhcGlfZXZlbnQgKnBkOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlldmVudCA9IHNjdHBfdWxwZXZlbnRfbmV3KHNpemVvZihzdHJ1Y3Qgc2N0cF9wZGFwaV9ldmVudCksCisJCQkJICBNU0dfTk9USUZJQ0FUSU9OLCBnZnApOworCWlmICghZXZlbnQpCisJCWdvdG8gZmFpbDsKKworCXNrYiA9IHNjdHBfZXZlbnQyc2tiKGV2ZW50KTsKKwlwZCA9IChzdHJ1Y3Qgc2N0cF9wZGFwaV9ldmVudCAqKQorCQlza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBzY3RwX3BkYXBpX2V2ZW50KSk7CisKKwkvKiBwZGFwaV90eXBlCisJICogICBJdCBzaG91bGQgYmUgU0NUUF9QQVJUSUFMX0RFTElWRVJZX0VWRU5UCisJICoKKwkgKiBwZGFwaV9mbGFnczogMTYgYml0cyAodW5zaWduZWQgaW50ZWdlcikKKwkgKiAgIEN1cnJlbnRseSB1bnVzZWQuCisJICovCisJcGQtPnBkYXBpX3R5cGUgPSBTQ1RQX1BBUlRJQUxfREVMSVZFUllfRVZFTlQ7CisJcGQtPnBkYXBpX2ZsYWdzID0gMDsKKworCS8qIHBkYXBpX2xlbmd0aDogMzIgYml0cyAodW5zaWduZWQgaW50ZWdlcikKKwkgKgorCSAqIFRoaXMgZmllbGQgaXMgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgbm90aWZpY2F0aW9uIGRhdGEsIGluY2x1ZGluZworCSAqIHRoZSBub3RpZmljYXRpb24gaGVhZGVyLiAgSXQgd2lsbCBnZW5lcmFsbHkgYmUgc2l6ZW9mIChzdHJ1Y3QKKwkgKiBzY3RwX3BkYXBpX2V2ZW50KS4KKwkgKi8KKwlwZC0+cGRhcGlfbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBzY3RwX3BkYXBpX2V2ZW50KTsKKworICAgICAgICAvKiAgcGRhcGlfaW5kaWNhdGlvbjogMzIgYml0cyAodW5zaWduZWQgaW50ZWdlcikKKwkgKgorCSAqIFRoaXMgZmllbGQgaG9sZHMgdGhlIGluZGljYXRpb24gYmVpbmcgc2VudCB0byB0aGUgYXBwbGljYXRpb24uCisJICovCisJcGQtPnBkYXBpX2luZGljYXRpb24gPSBpbmRpY2F0aW9uOworCisJLyogIHBkYXBpX2Fzc29jX2lkOiBzaXplb2YgKHNjdHBfYXNzb2NfdCkKKwkgKgorCSAqIFRoZSBhc3NvY2lhdGlvbiBpZCBmaWVsZCwgaG9sZHMgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBhc3NvY2lhdGlvbi4KKwkgKi8KKwlzY3RwX3VscGV2ZW50X3NldF9vd25lcihldmVudCwgYXNvYyk7CisJcGQtPnBkYXBpX2Fzc29jX2lkID0gc2N0cF9hc3NvYzJpZChhc29jKTsKKworCXJldHVybiBldmVudDsKK2ZhaWw6CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFJldHVybiB0aGUgbm90aWZpY2F0aW9uIHR5cGUsIGFzc3VtaW5nIHRoaXMgaXMgYSBub3RpZmljYXRpb24KKyAqIGV2ZW50LgorICovCitfX3UxNiBzY3RwX3VscGV2ZW50X2dldF9ub3RpZmljYXRpb25fdHlwZShjb25zdCBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQpCit7CisJdW5pb24gc2N0cF9ub3RpZmljYXRpb24gKm5vdGlmaWNhdGlvbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc2tiID0gc2N0cF9ldmVudDJza2IoKHN0cnVjdCBzY3RwX3VscGV2ZW50ICopZXZlbnQpOworCW5vdGlmaWNhdGlvbiA9ICh1bmlvbiBzY3RwX25vdGlmaWNhdGlvbiAqKSBza2ItPmRhdGE7CisJcmV0dXJuIG5vdGlmaWNhdGlvbi0+c25faGVhZGVyLnNuX3R5cGU7Cit9CisKKy8qIENvcHkgb3V0IHRoZSBzbmRyY3ZpbmZvIGludG8gYSBtc2doZHIuICAqLwordm9pZCBzY3RwX3VscGV2ZW50X3JlYWRfc25kcmN2aW5mbyhjb25zdCBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQsCisJCQkJICAgc3RydWN0IG1zZ2hkciAqbXNnaGRyKQoreworCXN0cnVjdCBzY3RwX3NuZHJjdmluZm8gc2luZm87CisKKwlpZiAoc2N0cF91bHBldmVudF9pc19ub3RpZmljYXRpb24oZXZlbnQpKQorCQlyZXR1cm47CisKKwkvKiBTb2NrZXRzIEFQSSBFeHRlbnNpb25zIGZvciBTQ1RQCisgCSAqIFNlY3Rpb24gNS4yLjIgU0NUUCBIZWFkZXIgSW5mb3JtYXRpb24gU3RydWN0dXJlIChTQ1RQX1NORFJDVikKKyAJICoKKyAJICogc2luZm9fc3RyZWFtOiAxNiBiaXRzICh1bnNpZ25lZCBpbnRlZ2VyKQorIAkgKgorIAkgKiBGb3IgcmVjdm1zZygpIHRoZSBTQ1RQIHN0YWNrIHBsYWNlcyB0aGUgbWVzc2FnZSdzIHN0cmVhbSBudW1iZXIgaW4KKyAJICogdGhpcyB2YWx1ZS4KKyAJKi8KKwlzaW5mby5zaW5mb19zdHJlYW0gPSBldmVudC0+c3RyZWFtOworCS8qIHNpbmZvX3NzbjogMTYgYml0cyAodW5zaWduZWQgaW50ZWdlcikKKwkgKgorCSAqIEZvciByZWN2bXNnKCkgdGhpcyB2YWx1ZSBjb250YWlucyB0aGUgc3RyZWFtIHNlcXVlbmNlIG51bWJlciB0aGF0CisJICogdGhlIHJlbW90ZSBlbmRwb2ludCBwbGFjZWQgaW4gdGhlIERBVEEgY2h1bmsuICBGb3IgZnJhZ21lbnRlZAorCSAqIG1lc3NhZ2VzIHRoaXMgaXMgdGhlIHNhbWUgbnVtYmVyIGZvciBhbGwgZGVsaXZlcmllcyBvZiB0aGUgbWVzc2FnZQorCSAqIChpZiBtb3JlIHRoYW4gb25lIHJlY3Ztc2coKSBpcyBuZWVkZWQgdG8gcmVhZCB0aGUgbWVzc2FnZSkuCisJICovCisJc2luZm8uc2luZm9fc3NuID0gZXZlbnQtPnNzbjsKKwkvKiBzaW5mb19wcGlkOiAzMiBiaXRzICh1bnNpZ25lZCBpbnRlZ2VyKQorCSAqCisJICogSW4gcmVjdm1zZygpIHRoaXMgdmFsdWUgaXMKKwkgKiB0aGUgc2FtZSBpbmZvcm1hdGlvbiB0aGF0IHdhcyBwYXNzZWQgYnkgdGhlIHVwcGVyIGxheWVyIGluIHRoZSBwZWVyCisJICogYXBwbGljYXRpb24uICBQbGVhc2Ugbm90ZSB0aGF0IGJ5dGUgb3JkZXIgaXNzdWVzIGFyZSBOT1QgYWNjb3VudGVkCisJICogZm9yIGFuZCB0aGlzIGluZm9ybWF0aW9uIGlzIHBhc3NlZCBvcGFxdWVseSBieSB0aGUgU0NUUCBzdGFjayBmcm9tCisJICogb25lIGVuZCB0byB0aGUgb3RoZXIuCisJICovCisJc2luZm8uc2luZm9fcHBpZCA9IGV2ZW50LT5wcGlkOworCS8qIHNpbmZvX2ZsYWdzOiAxNiBiaXRzICh1bnNpZ25lZCBpbnRlZ2VyKQorCSAqCisJICogVGhpcyBmaWVsZCBtYXkgY29udGFpbiBhbnkgb2YgdGhlIGZvbGxvd2luZyBmbGFncyBhbmQgaXMgY29tcG9zZWQgb2YKKwkgKiBhIGJpdHdpc2UgT1Igb2YgdGhlc2UgdmFsdWVzLgorCSAqCisJICogcmVjdm1zZygpIGZsYWdzOgorCSAqCisJICogTVNHX1VOT1JERVJFRCAtIFRoaXMgZmxhZyBpcyBwcmVzZW50IHdoZW4gdGhlIG1lc3NhZ2Ugd2FzIHNlbnQKKwkgKiAgICAgICAgICAgICAgICAgbm9uLW9yZGVyZWQuCisJICovCisJc2luZm8uc2luZm9fZmxhZ3MgPSBldmVudC0+ZmxhZ3M7CisJLyogc2luZm9fdHNuOiAzMiBiaXQgKHVuc2lnbmVkIGludGVnZXIpCisJICoKKwkgKiBGb3IgdGhlIHJlY2VpdmluZyBzaWRlLCB0aGlzIGZpZWxkIGhvbGRzIGEgVFNOIHRoYXQgd2FzIAorCSAqIGFzc2lnbmVkIHRvIG9uZSBvZiB0aGUgU0NUUCBEYXRhIENodW5rcy4KKwkgKi8KKwlzaW5mby5zaW5mb190c24gPSBldmVudC0+dHNuOworCS8qIHNpbmZvX2N1bXRzbjogMzIgYml0ICh1bnNpZ25lZCBpbnRlZ2VyKQorCSAqCisJICogVGhpcyBmaWVsZCB3aWxsIGhvbGQgdGhlIGN1cnJlbnQgY3VtdWxhdGl2ZSBUU04gYXMKKwkgKiBrbm93biBieSB0aGUgdW5kZXJseWluZyBTQ1RQIGxheWVyLiAgTm90ZSB0aGlzIGZpZWxkIGlzCisJICogaWdub3JlZCB3aGVuIHNlbmRpbmcgYW5kIG9ubHkgdmFsaWQgZm9yIGEgcmVjZWl2ZQorCSAqIG9wZXJhdGlvbiB3aGVuIHNpbmZvX2ZsYWdzIGFyZSBzZXQgdG8gTVNHX1VOT1JERVJFRC4KKwkgKi8KKwlzaW5mby5zaW5mb19jdW10c24gPSBldmVudC0+Y3VtdHNuOworCS8qIHNpbmZvX2Fzc29jX2lkOiBzaXplb2YgKHNjdHBfYXNzb2NfdCkKKwkgKgorCSAqIFRoZSBhc3NvY2lhdGlvbiBoYW5kbGUgZmllbGQsIHNpbmZvX2Fzc29jX2lkLCBob2xkcyB0aGUgaWRlbnRpZmllcgorCSAqIGZvciB0aGUgYXNzb2NpYXRpb24gYW5ub3VuY2VkIGluIHRoZSBDT01NVU5JQ0FUSU9OX1VQIG5vdGlmaWNhdGlvbi4KKwkgKiBBbGwgbm90aWZpY2F0aW9ucyBmb3IgYSBnaXZlbiBhc3NvY2lhdGlvbiBoYXZlIHRoZSBzYW1lIGlkZW50aWZpZXIuCisJICogSWdub3JlZCBmb3Igb25lLXRvLW9uZSBzdHlsZSBzb2NrZXRzLgorCSAqLworCXNpbmZvLnNpbmZvX2Fzc29jX2lkID0gc2N0cF9hc3NvYzJpZChldmVudC0+YXNvYyk7CisKKwkvKiBUaGVzZSBmaWVsZHMgYXJlIG5vdCB1c2VkIHdoaWxlIHJlY2VpdmluZy4gKi8KKwlzaW5mby5zaW5mb19jb250ZXh0ID0gMDsKKwlzaW5mby5zaW5mb190aW1ldG9saXZlID0gMDsKKworCXB1dF9jbXNnKG1zZ2hkciwgSVBQUk9UT19TQ1RQLCBTQ1RQX1NORFJDViwKKwkJIHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSwgKHZvaWQgKikmc2luZm8pOworfQorCisvKiBEbyBhY2NvdW50aW5nIGZvciBieXRlcyByZWNlaXZlZCBhbmQgaG9sZCBhIHJlZmVyZW5jZSB0byB0aGUgYXNzb2NpYXRpb24KKyAqIGZvciBlYWNoIHNrYi4KKyAqLworc3RhdGljIHZvaWQgc2N0cF91bHBldmVudF9yZWNlaXZlX2RhdGEoc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50LAorCQkJCSAgICAgICBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqZnJhZzsKKworCXNrYiA9IHNjdHBfZXZlbnQyc2tiKGV2ZW50KTsKKwkvKiBTZXQgdGhlIG93bmVyIGFuZCBjaGFyZ2UgcnduZCBmb3IgYnl0ZXMgcmVjZWl2ZWQuICAqLworCXNjdHBfdWxwZXZlbnRfc2V0X293bmVyKGV2ZW50LCBhc29jKTsKKwlzY3RwX2Fzc29jX3J3bmRfZGVjcmVhc2UoYXNvYywgc2tiX2hlYWRsZW4oc2tiKSk7CisKKwlpZiAoIXNrYi0+ZGF0YV9sZW4pCisJCXJldHVybjsKKworCS8qIE5vdGU6ICBOb3QgY2xlYXJpbmcgdGhlIGVudGlyZSBldmVudCBzdHJ1Y3QgYXMgdGhpcyBpcyBqdXN0IGEKKwkgKiBmcmFnbWVudCBvZiB0aGUgcmVhbCBldmVudC4gIEhvd2V2ZXIsIHdlIHN0aWxsIG5lZWQgdG8gZG8gcnduZAorCSAqIGFjY291bnRpbmcuCisJICogSW4gZ2VuZXJhbCwgdGhlIHNrYiBwYXNzZWQgZnJvbSBJUCBjYW4gaGF2ZSBvbmx5IDEgbGV2ZWwgb2YKKwkgKiBmcmFnbWVudHMuIEJ1dCB3ZSBhbGxvdyBtdWx0aXBsZSBsZXZlbHMgb2YgZnJhZ21lbnRzLiAKKwkgKi8KKwlmb3IgKGZyYWcgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsgZnJhZzsgZnJhZyA9IGZyYWctPm5leHQpIHsKKwkJc2N0cF91bHBldmVudF9yZWNlaXZlX2RhdGEoc2N0cF9za2IyZXZlbnQoZnJhZyksIGFzb2MpOworCX0KK30KKworLyogRG8gYWNjb3VudGluZyBmb3IgYnl0ZXMganVzdCByZWFkIGJ5IHVzZXIgYW5kIHJlbGVhc2UgdGhlIHJlZmVyZW5jZXMgdG8KKyAqIHRoZSBhc3NvY2lhdGlvbi4KKyAqLyAKK3N0YXRpYyB2b2lkIHNjdHBfdWxwZXZlbnRfcmVsZWFzZV9kYXRhKHN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqZnJhZzsKKworCS8qIEN1cnJlbnQgc3RhY2sgc3RydWN0dXJlcyBhc3N1bWUgdGhhdCB0aGUgcmN2IGJ1ZmZlciBpcworCSAqIHBlciBzb2NrZXQuICAgRm9yIFVEUCBzdHlsZSBzb2NrZXRzIHRoaXMgaXMgbm90IHRydWUgYXMKKwkgKiBtdWx0aXBsZSBhc3NvY2lhdGlvbnMgbWF5IGJlIG9uIGEgc2luZ2xlIFVEUC1zdHlsZSBzb2NrZXQuCisJICogVXNlIHRoZSBsb2NhbCBwcml2YXRlIGFyZWEgb2YgdGhlIHNrYiB0byB0cmFjayB0aGUgb3duaW5nCisJICogYXNzb2NpYXRpb24uCisJICovCisKKwlza2IgPSBzY3RwX2V2ZW50MnNrYihldmVudCk7CisJc2N0cF9hc3NvY19yd25kX2luY3JlYXNlKGV2ZW50LT5hc29jLCBza2JfaGVhZGxlbihza2IpKTsKKworCWlmICghc2tiLT5kYXRhX2xlbikKKwkJZ290byBkb25lOworCisJLyogRG9uJ3QgZm9yZ2V0IHRoZSBmcmFnbWVudHMuICovCisJZm9yIChmcmFnID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3Q7IGZyYWc7IGZyYWcgPSBmcmFnLT5uZXh0KSB7CisJCS8qIE5PVEU6ICBza2Jfc2hpbmZvcyBhcmUgcmVjdXJzaXZlLiBBbHRob3VnaCBJUCByZXR1cm5zCisJCSAqIHNrYidzIHdpdGggb25seSAxIGxldmVsIG9mIGZyYWdtZW50cywgU0NUUCByZWFzc2VtYmx5IGNhbgorCQkgKiBpbmNyZWFzZSB0aGUgbGV2ZWxzLgorCQkgKi8KKwkJc2N0cF91bHBldmVudF9yZWxlYXNlX2RhdGEoc2N0cF9za2IyZXZlbnQoZnJhZykpOworCX0KKworZG9uZToKKwlzY3RwX3VscGV2ZW50X3JlbGVhc2Vfb3duZXIoZXZlbnQpOworfQorCisvKiBGcmVlIGEgdWxwZXZlbnQgdGhhdCBoYXMgYW4gb3duZXIuICBJdCBpbmNsdWRlcyByZWxlYXNpbmcgdGhlIHJlZmVyZW5jZQorICogdG8gdGhlIG93bmVyLCB1cGRhdGluZyB0aGUgcnduZCBpbiBjYXNlIG9mIGEgREFUQSBldmVudCBhbmQgZnJlZWluZyB0aGUKKyAqIHNrYi4KKyAqIFNlZSBjb21tZW50cyBpbiBzY3RwX3N0dWJfcmZyZWUoKS4KKyAqLwordm9pZCBzY3RwX3VscGV2ZW50X2ZyZWUoc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50KQoreworCWlmIChzY3RwX3VscGV2ZW50X2lzX25vdGlmaWNhdGlvbihldmVudCkpCisJCXNjdHBfdWxwZXZlbnRfcmVsZWFzZV9vd25lcihldmVudCk7CisJZWxzZQorCQlzY3RwX3VscGV2ZW50X3JlbGVhc2VfZGF0YShldmVudCk7CisKKwlrZnJlZV9za2Ioc2N0cF9ldmVudDJza2IoZXZlbnQpKTsKK30KKworLyogUHVyZ2UgdGhlIHNrYiBsaXN0cyBob2xkaW5nIHVscGV2ZW50cy4gKi8KK3ZvaWQgc2N0cF9xdWV1ZV9wdXJnZV91bHBldmVudHMoc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUobGlzdCkpICE9IE5VTEwpCisJCXNjdHBfdWxwZXZlbnRfZnJlZShzY3RwX3NrYjJldmVudChza2IpKTsKK30KZGlmZiAtLWdpdCBhL25ldC9zY3RwL3VscHF1ZXVlLmMgYi9uZXQvc2N0cC91bHBxdWV1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZGQyY2YKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2N0cC91bHBxdWV1ZS5jCkBAIC0wLDAgKzEsODY0IEBACisvKiBTQ1RQIGtlcm5lbCByZWZlcmVuY2UgSW1wbGVtZW50YXRpb24KKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDEsIDIwMDQKKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAwIENpc2NvLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSBNb3Rvcm9sYSwgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTm9raWEsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBMYSBNb250ZSBILlAuIFlhcnJvbGwKKyAqCisgKiBUaGlzIGFic3RyYWN0aW9uIGNhcnJpZXMgc2N0cCBldmVudHMgdG8gdGhlIFVMUCAoc29ja2V0cykuCisgKgorICogVGhlIFNDVFAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQKKyAqIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICogICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBQbGVhc2Ugc2VuZCBhbnkgYnVnIHJlcG9ydHMgb3IgZml4ZXMgeW91IG1ha2UgdG8gdGhlCisgKiBlbWFpbCBhZGRyZXNzKGVzKToKKyAqICAgIGxrc2N0cCBkZXZlbG9wZXJzIDxsa3NjdHAtZGV2ZWxvcGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogT3Igc3VibWl0IGEgYnVnIHJlcG9ydCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgd2Vic2l0ZToKKyAqICAgIGh0dHA6Ly93d3cuc2YubmV0L3Byb2plY3RzL2xrc2N0cAorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiAgICBKb24gR3JpbW0gICAgICAgICAgICAgPGpncmltbUB1cy5pYm0uY29tPgorICogICAgTGEgTW9udGUgSC5QLiBZYXJyb2xsIDxwaWdneUBhY20ub3JnPgorICogICAgU3JpZGhhciBTYW11ZHJhbGEgICAgIDxzcmlAdXMuaWJtLmNvbT4KKyAqCisgKiBBbnkgYnVncyByZXBvcnRlZCBnaXZlbiB0byB1cyB3ZSB3aWxsIHRyeSB0byBmaXguLi4gYW55IGZpeGVzIHNoYXJlZCB3aWxsCisgKiBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbmV4dCBTQ1RQIHJlbGVhc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvc2N0cC9zdHJ1Y3RzLmg+CisjaW5jbHVkZSA8bmV0L3NjdHAvc2N0cC5oPgorI2luY2x1ZGUgPG5ldC9zY3RwL3NtLmg+CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBpbnRlcm5hbCBoZWxwZXJzLiAgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqIHNjdHBfdWxwcV9yZWFzbShzdHJ1Y3Qgc2N0cF91bHBxICp1bHBxLAorCQkJCQkJc3RydWN0IHNjdHBfdWxwZXZlbnQgKik7CitzdGF0aWMgc3RydWN0IHNjdHBfdWxwZXZlbnQgKiBzY3RwX3VscHFfb3JkZXIoc3RydWN0IHNjdHBfdWxwcSAqLAorCQkJCQkJc3RydWN0IHNjdHBfdWxwZXZlbnQgKik7CisKKy8qIDFzdCBMZXZlbCBBYnN0cmFjdGlvbnMgKi8KKworLyogSW5pdGlhbGl6ZSBhIFVMUCBxdWV1ZSBmcm9tIGEgYmxvY2sgb2YgbWVtb3J5LiAgKi8KK3N0cnVjdCBzY3RwX3VscHEgKnNjdHBfdWxwcV9pbml0KHN0cnVjdCBzY3RwX3VscHEgKnVscHEsCisJCQkJIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKQoreworCW1lbXNldCh1bHBxLCAwLCBzaXplb2Yoc3RydWN0IHNjdHBfdWxwcSkpOworCisJdWxwcS0+YXNvYyA9IGFzb2M7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmdWxwcS0+cmVhc20pOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnVscHEtPmxvYmJ5KTsKKwl1bHBxLT5wZF9tb2RlICA9IDA7CisJdWxwcS0+bWFsbG9jZWQgPSAwOworCisJcmV0dXJuIHVscHE7Cit9CisKKworLyogRmx1c2ggdGhlIHJlYXNzZW1ibHkgYW5kIG9yZGVyaW5nIHF1ZXVlcy4gICovCitzdGF0aWMgdm9pZCBzY3RwX3VscHFfZmx1c2goc3RydWN0IHNjdHBfdWxwcSAqdWxwcSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudDsKKworCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZSgmdWxwcS0+bG9iYnkpKSAhPSBOVUxMKSB7CisJCWV2ZW50ID0gc2N0cF9za2IyZXZlbnQoc2tiKTsKKwkJc2N0cF91bHBldmVudF9mcmVlKGV2ZW50KTsKKwl9CisKKwl3aGlsZSAoKHNrYiA9IF9fc2tiX2RlcXVldWUoJnVscHEtPnJlYXNtKSkgIT0gTlVMTCkgeworCQlldmVudCA9IHNjdHBfc2tiMmV2ZW50KHNrYik7CisJCXNjdHBfdWxwZXZlbnRfZnJlZShldmVudCk7CisJfQorCit9CisKKy8qIERpc3Bvc2Ugb2YgYSB1bHBxdWV1ZS4gICovCit2b2lkIHNjdHBfdWxwcV9mcmVlKHN0cnVjdCBzY3RwX3VscHEgKnVscHEpCit7CisJc2N0cF91bHBxX2ZsdXNoKHVscHEpOworCWlmICh1bHBxLT5tYWxsb2NlZCkKKwkJa2ZyZWUodWxwcSk7Cit9CisKKy8qIFByb2Nlc3MgYW4gaW5jb21pbmcgREFUQSBjaHVuay4gICovCitpbnQgc2N0cF91bHBxX3RhaWxfZGF0YShzdHJ1Y3Qgc2N0cF91bHBxICp1bHBxLCBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCisJCQlpbnQgZ2ZwKQoreworCXN0cnVjdCBza19idWZmX2hlYWQgdGVtcDsKKwlzY3RwX2RhdGFfY2h1bmtfdCAqaGRyOworCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudDsKKworCWhkciA9IChzY3RwX2RhdGFfY2h1bmtfdCAqKSBjaHVuay0+Y2h1bmtfaGRyOworCisJLyogQ3JlYXRlIGFuIGV2ZW50IGZyb20gdGhlIGluY29taW5nIGNodW5rLiAqLworCWV2ZW50ID0gc2N0cF91bHBldmVudF9tYWtlX3Jjdm1zZyhjaHVuay0+YXNvYywgY2h1bmssIGdmcCk7CisJaWYgKCFldmVudCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBEbyByZWFzc2VtYmx5IGlmIG5lZWRlZC4gICovCisJZXZlbnQgPSBzY3RwX3VscHFfcmVhc20odWxwcSwgZXZlbnQpOworCisJLyogRG8gb3JkZXJpbmcgaWYgbmVlZGVkLiAgKi8KKwlpZiAoKGV2ZW50KSAmJiAoZXZlbnQtPm1zZ19mbGFncyAmIE1TR19FT1IpKXsKKwkJLyogQ3JlYXRlIGEgdGVtcG9yYXJ5IGxpc3QgdG8gY29sbGVjdCBjaHVua3Mgb24uICAqLworCQlza2JfcXVldWVfaGVhZF9pbml0KCZ0ZW1wKTsKKwkJX19za2JfcXVldWVfdGFpbCgmdGVtcCwgc2N0cF9ldmVudDJza2IoZXZlbnQpKTsKKworCQlldmVudCA9IHNjdHBfdWxwcV9vcmRlcih1bHBxLCBldmVudCk7CisJfQorCisJLyogU2VuZCBldmVudCB0byB0aGUgVUxQLiAgKi8KKwlpZiAoZXZlbnQpCisJCXNjdHBfdWxwcV90YWlsX2V2ZW50KHVscHEsIGV2ZW50KTsKKworCXJldHVybiAwOworfQorCisvKiBBZGQgYSBuZXcgZXZlbnQgZm9yIHByb3BhZ2F0aW9uIHRvIHRoZSBVTFAuICAqLworLyogQ2xlYXIgdGhlIHBhcnRpYWwgZGVsaXZlcnkgbW9kZSBmb3IgdGhpcyBzb2NrZXQuICAgTm90ZTogVGhpcworICogYXNzdW1lcyB0aGF0IG5vIGFzc29jaWF0aW9uIGlzIGN1cnJlbnRseSBpbiBwYXJ0aWFsIGRlbGl2ZXJ5IG1vZGUuCisgKi8KK2ludCBzY3RwX2NsZWFyX3BkKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3Qgc2N0cF9zb2NrICpzcCA9IHNjdHBfc2soc2spOworCisJc3AtPnBkX21vZGUgPSAwOworCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzcC0+cGRfbG9iYnkpKSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJCXNjdHBfc2tiX2xpc3RfdGFpbCgmc3AtPnBkX2xvYmJ5LCAmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCQlsaXN0ID0gKHN0cnVjdCBsaXN0X2hlYWQgKikmc2N0cF9zayhzayktPnBkX2xvYmJ5OworCQlJTklUX0xJU1RfSEVBRChsaXN0KTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKiBDbGVhciB0aGUgcGRfbW9kZSBhbmQgcmVzdGFydCBhbnkgcGVuZGluZyBtZXNzYWdlcyB3YWl0aW5nIGZvciBkZWxpdmVyeS4gKi8KK3N0YXRpYyBpbnQgc2N0cF91bHBxX2NsZWFyX3BkKHN0cnVjdCBzY3RwX3VscHEgKnVscHEpCit7CisJdWxwcS0+cGRfbW9kZSA9IDA7CisJcmV0dXJuIHNjdHBfY2xlYXJfcGQodWxwcS0+YXNvYy0+YmFzZS5zayk7Cit9CisKKworCitpbnQgc2N0cF91bHBxX3RhaWxfZXZlbnQoc3RydWN0IHNjdHBfdWxwcSAqdWxwcSwgc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBzb2NrICpzayA9IHVscHEtPmFzb2MtPmJhc2Uuc2s7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCAqcXVldWU7CisJaW50IGNsZWFyX3BkID0gMDsKKworCS8qIElmIHRoZSBzb2NrZXQgaXMganVzdCBnb2luZyB0byB0aHJvdyB0aGlzIGF3YXksIGRvIG5vdAorCSAqIGV2ZW4gdHJ5IHRvIGRlbGl2ZXIgaXQuCisJICovCisJaWYgKHNvY2tfZmxhZyhzaywgU09DS19ERUFEKSB8fCAoc2stPnNrX3NodXRkb3duICYgUkNWX1NIVVRET1dOKSkKKwkJZ290byBvdXRfZnJlZTsKKworCS8qIENoZWNrIGlmIHRoZSB1c2VyIHdpc2hlcyB0byByZWNlaXZlIHRoaXMgZXZlbnQuICAqLworCWlmICghc2N0cF91bHBldmVudF9pc19lbmFibGVkKGV2ZW50LCAmc2N0cF9zayhzayktPnN1YnNjcmliZSkpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwkvKiBJZiB3ZSBhcmUgaW4gcGFydGlhbCBkZWxpdmVyeSBtb2RlLCBwb3N0IHRvIHRoZSBsb2JieSB1bnRpbAorCSAqIHBhcnRpYWwgZGVsaXZlcnkgaXMgY2xlYXJlZCwgdW5sZXNzLCBvZiBjb3Vyc2UgX3RoaXNfIGlzCisJICogdGhlIGFzc29jaWF0aW9uIHRoZSBjYXVzZSBvZiB0aGUgcGFydGlhbCBkZWxpdmVyeS4KKwkgKi8KKworCWlmICghc2N0cF9zayhzayktPnBkX21vZGUpIHsKKwkJcXVldWUgPSAmc2stPnNrX3JlY2VpdmVfcXVldWU7CisJfSBlbHNlIGlmICh1bHBxLT5wZF9tb2RlKSB7CisJCWlmIChldmVudC0+bXNnX2ZsYWdzICYgTVNHX05PVElGSUNBVElPTikKKwkJICAgICAgIAlxdWV1ZSA9ICZzY3RwX3NrKHNrKS0+cGRfbG9iYnk7CisJCWVsc2UgeworCQkJY2xlYXJfcGQgPSBldmVudC0+bXNnX2ZsYWdzICYgTVNHX0VPUjsKKwkJCXF1ZXVlID0gJnNrLT5za19yZWNlaXZlX3F1ZXVlOworCQl9CisJfSBlbHNlCisJCXF1ZXVlID0gJnNjdHBfc2soc2spLT5wZF9sb2JieTsKKworCisJLyogSWYgd2UgYXJlIGhhcnZlc3RpbmcgbXVsdGlwbGUgc2ticyB0aGV5IHdpbGwgYmUKKwkgKiBjb2xsZWN0ZWQgb24gYSBsaXN0LgorCSAqLworCWlmIChzY3RwX2V2ZW50MnNrYihldmVudCktPmxpc3QpCisJCXNjdHBfc2tiX2xpc3RfdGFpbChzY3RwX2V2ZW50MnNrYihldmVudCktPmxpc3QsIHF1ZXVlKTsKKwllbHNlCisJCV9fc2tiX3F1ZXVlX3RhaWwocXVldWUsIHNjdHBfZXZlbnQyc2tiKGV2ZW50KSk7CisKKwkvKiBEaWQgd2UganVzdCBjb21wbGV0ZSBwYXJ0aWFsIGRlbGl2ZXJ5IGFuZCBuZWVkIHRvIGdldAorCSAqIHJvbGxpbmcgYWdhaW4/ICBNb3ZlIHBlbmRpbmcgZGF0YSB0byB0aGUgcmVjZWl2ZQorCSAqIHF1ZXVlLgorCSAqLworCWlmIChjbGVhcl9wZCkKKwkJc2N0cF91bHBxX2NsZWFyX3BkKHVscHEpOworCisJaWYgKHF1ZXVlID09ICZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkKKwkJc2stPnNrX2RhdGFfcmVhZHkoc2ssIDApOworCXJldHVybiAxOworCitvdXRfZnJlZToKKwlpZiAoc2N0cF9ldmVudDJza2IoZXZlbnQpLT5saXN0KQorCQlzY3RwX3F1ZXVlX3B1cmdlX3VscGV2ZW50cyhzY3RwX2V2ZW50MnNrYihldmVudCktPmxpc3QpOworCWVsc2UKKwkJc2N0cF91bHBldmVudF9mcmVlKGV2ZW50KTsKKwlyZXR1cm4gMDsKK30KKworLyogMm5kIExldmVsIEFic3RyYWN0aW9ucyAqLworCisvKiBIZWxwZXIgZnVuY3Rpb24gdG8gc3RvcmUgY2h1bmtzIHRoYXQgbmVlZCB0byBiZSByZWFzc2VtYmxlZC4gICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2N0cF91bHBxX3N0b3JlX3JlYXNtKHN0cnVjdCBzY3RwX3VscHEgKnVscHEsCisJCQkJCSBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnBvczsKKwlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqY2V2ZW50OworCV9fdTMyIHRzbiwgY3RzbjsKKworCXRzbiA9IGV2ZW50LT50c247CisKKwkvKiBTZWUgaWYgaXQgYmVsb25ncyBhdCB0aGUgZW5kLiAqLworCXBvcyA9IHNrYl9wZWVrX3RhaWwoJnVscHEtPnJlYXNtKTsKKwlpZiAoIXBvcykgeworCQlfX3NrYl9xdWV1ZV90YWlsKCZ1bHBxLT5yZWFzbSwgc2N0cF9ldmVudDJza2IoZXZlbnQpKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFNob3J0IGNpcmN1aXQganVzdCBkcm9wcGluZyBpdCBhdCB0aGUgZW5kLiAqLworCWNldmVudCA9IHNjdHBfc2tiMmV2ZW50KHBvcyk7CisJY3RzbiA9IGNldmVudC0+dHNuOworCWlmIChUU05fbHQoY3RzbiwgdHNuKSkgeworCQlfX3NrYl9xdWV1ZV90YWlsKCZ1bHBxLT5yZWFzbSwgc2N0cF9ldmVudDJza2IoZXZlbnQpKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEZpbmQgdGhlIHJpZ2h0IHBsYWNlIGluIHRoaXMgbGlzdC4gV2Ugc3RvcmUgdGhlbSBieSBUU04uICAqLworCXNrYl9xdWV1ZV93YWxrKCZ1bHBxLT5yZWFzbSwgcG9zKSB7CisJCWNldmVudCA9IHNjdHBfc2tiMmV2ZW50KHBvcyk7CisJCWN0c24gPSBjZXZlbnQtPnRzbjsKKworCQlpZiAoVFNOX2x0KHRzbiwgY3RzbikpCisJCQlicmVhazsKKwl9CisKKwkvKiBJbnNlcnQgYmVmb3JlIHBvcy4gKi8KKwlfX3NrYl9pbnNlcnQoc2N0cF9ldmVudDJza2IoZXZlbnQpLCBwb3MtPnByZXYsIHBvcywgJnVscHEtPnJlYXNtKTsKKworfQorCisvKiBIZWxwZXIgZnVuY3Rpb24gdG8gcmV0dXJuIGFuIGV2ZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlYXNzZW1ibGVkCisgKiBkYXRhZ3JhbS4KKyAqIFRoaXMgcm91dGluZSBjcmVhdGVzIGEgcmUtYXNzZW1ibGVkIHNrYiBnaXZlbiB0aGUgZmlyc3QgYW5kIGxhc3Qgc2tiJ3MKKyAqIGFzIHN0b3JlZCBpbiB0aGUgcmVhc3NlbWJseSBxdWV1ZS4gVGhlIHNrYidzIG1heSBiZSBub24tbGluZWFyIGlmIHRoZSBzY3RwCisgKiBwYXlsb2FkIHdhcyBmcmFnbWVudGVkIG9uIHRoZSB3YXkgYW5kIGlwIGhhZCB0byByZWFzc2VtYmxlIHRoZW0uCisgKiBXZSBhZGQgdGhlIHJlc3Qgb2Ygc2tiJ3MgdG8gdGhlIGZpcnN0IHNrYidzIGZyYWdsaXN0LgorICovCitzdGF0aWMgc3RydWN0IHNjdHBfdWxwZXZlbnQgKnNjdHBfbWFrZV9yZWFzc2VtYmxlZF9ldmVudChzdHJ1Y3Qgc2tfYnVmZiAqZl9mcmFnLCBzdHJ1Y3Qgc2tfYnVmZiAqbF9mcmFnKQoreworCXN0cnVjdCBza19idWZmICpwb3M7CisJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50OworCXN0cnVjdCBza19idWZmICpwbmV4dCwgKmxhc3Q7CisJc3RydWN0IHNrX2J1ZmYgKmxpc3QgPSBza2Jfc2hpbmZvKGZfZnJhZyktPmZyYWdfbGlzdDsKKworCS8qIFN0b3JlIHRoZSBwb2ludGVyIHRvIHRoZSAybmQgc2tiICovCisJaWYgKGZfZnJhZyA9PSBsX2ZyYWcpCisJCXBvcyA9IE5VTEw7CisJZWxzZQorCQlwb3MgPSBmX2ZyYWctPm5leHQ7CisKKwkvKiBHZXQgdGhlIGxhc3Qgc2tiIGluIHRoZSBmX2ZyYWcncyBmcmFnX2xpc3QgaWYgcHJlc2VudC4gKi8KKwlmb3IgKGxhc3QgPSBsaXN0OyBsaXN0OyBsYXN0ID0gbGlzdCwgbGlzdCA9IGxpc3QtPm5leHQpOworCisJLyogQWRkIHRoZSBsaXN0IG9mIHJlbWFpbmluZyBmcmFnbWVudHMgdG8gdGhlIGZpcnN0IGZyYWdtZW50cworCSAqIGZyYWdfbGlzdC4KKwkgKi8KKwlpZiAobGFzdCkKKwkJbGFzdC0+bmV4dCA9IHBvczsKKwllbHNlCisJCXNrYl9zaGluZm8oZl9mcmFnKS0+ZnJhZ19saXN0ID0gcG9zOworCisJLyogUmVtb3ZlIHRoZSBmaXJzdCBmcmFnbWVudCBmcm9tIHRoZSByZWFzc2VtYmx5IHF1ZXVlLiAgKi8KKwlfX3NrYl91bmxpbmsoZl9mcmFnLCBmX2ZyYWctPmxpc3QpOworCXdoaWxlIChwb3MpIHsKKworCQlwbmV4dCA9IHBvcy0+bmV4dDsKKworCQkvKiBVcGRhdGUgdGhlIGxlbiBhbmQgZGF0YV9sZW4gZmllbGRzIG9mIHRoZSBmaXJzdCBmcmFnbWVudC4gKi8KKwkJZl9mcmFnLT5sZW4gKz0gcG9zLT5sZW47CisJCWZfZnJhZy0+ZGF0YV9sZW4gKz0gcG9zLT5sZW47CisKKwkJLyogUmVtb3ZlIHRoZSBmcmFnbWVudCBmcm9tIHRoZSByZWFzc2VtYmx5IHF1ZXVlLiAgKi8KKwkJX19za2JfdW5saW5rKHBvcywgcG9zLT5saXN0KTsKKwkKKwkJLyogQnJlYWsgaWYgd2UgaGF2ZSByZWFjaGVkIHRoZSBsYXN0IGZyYWdtZW50LiAgKi8KKwkJaWYgKHBvcyA9PSBsX2ZyYWcpCisJCQlicmVhazsKKwkJcG9zLT5uZXh0ID0gcG5leHQ7CisJCXBvcyA9IHBuZXh0OworCX07CisKKwlldmVudCA9IHNjdHBfc2tiMmV2ZW50KGZfZnJhZyk7CisJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfUkVBU01VU1JNU0dTKTsKKworCXJldHVybiBldmVudDsKK30KKworCisvKiBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgYW4gaW5jb21pbmcgY2h1bmsgaGFzIGZpbGxlZCB1cCB0aGUgbGFzdAorICogbWlzc2luZyBmcmFnbWVudCBpbiBhIFNDVFAgZGF0YWdyYW0gYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBldmVudC4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqc2N0cF91bHBxX3JldHJpZXZlX3JlYXNzZW1ibGVkKHN0cnVjdCBzY3RwX3VscHEgKnVscHEpCit7CisJc3RydWN0IHNrX2J1ZmYgKnBvczsKKwlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqY2V2ZW50OworCXN0cnVjdCBza19idWZmICpmaXJzdF9mcmFnID0gTlVMTDsKKwlfX3UzMiBjdHNuLCBuZXh0X3RzbjsKKwlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqcmV0dmFsID0gTlVMTDsKKworCS8qIEluaXRpYWxpemVkIHRvIDAganVzdCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5nIG1lc3NhZ2UuICBXaWxsCisJICogbmV2ZXIgYmUgdXNlZCB3aXRoIHRoaXMgdmFsdWUuIEl0IGlzIHJlZmVyZW5jZWQgb25seSBhZnRlciBpdAorCSAqIGlzIHNldCB3aGVuIHdlIGZpbmQgdGhlIGZpcnN0IGZyYWdtZW50IG9mIGEgbWVzc2FnZS4KKwkgKi8KKwluZXh0X3RzbiA9IDA7CisKKwkvKiBUaGUgY2h1bmtzIGFyZSBoZWxkIGluIHRoZSByZWFzbSBxdWV1ZSBzb3J0ZWQgYnkgVFNOLgorCSAqIFdhbGsgdGhyb3VnaCB0aGUgcXVldWUgc2VxdWVudGlhbGx5IGFuZCBsb29rIGZvciBhIHNlcXVlbmNlIG9mCisJICogZnJhZ21lbnRlZCBjaHVua3MgdGhhdCBjb21wbGV0ZSBhIGRhdGFncmFtLgorCSAqICdmaXJzdF9mcmFnJyBhbmQgbmV4dF90c24gYXJlIHJlc2V0IHdoZW4gd2UgZmluZCBhIGNodW5rIHdoaWNoCisJICogaXMgdGhlIGZpcnN0IGZyYWdtZW50IG9mIGEgZGF0YWdyYW0uIE9uY2UgdGhlc2UgMiBmaWVsZHMgYXJlIHNldAorCSAqIHdlIGV4cGVjdCB0byBmaW5kIHRoZSByZW1haW5pbmcgbWlkZGxlIGZyYWdtZW50cyBhbmQgdGhlIGxhc3QKKwkgKiBmcmFnbWVudCBpbiBvcmRlci4gSWYgbm90LCBmaXJzdF9mcmFnIGlzIHJlc2V0IHRvIE5VTEwgYW5kIHdlCisJICogc3RhcnQgdGhlIG5leHQgcGFzcyB3aGVuIHdlIGZpbmQgYW5vdGhlciBmaXJzdCBmcmFnbWVudC4KKwkgKi8KKwlza2JfcXVldWVfd2FsaygmdWxwcS0+cmVhc20sIHBvcykgeworCQljZXZlbnQgPSBzY3RwX3NrYjJldmVudChwb3MpOworCQljdHNuID0gY2V2ZW50LT50c247CisKKwkJc3dpdGNoIChjZXZlbnQtPm1zZ19mbGFncyAmIFNDVFBfREFUQV9GUkFHX01BU0spIHsKKwkJY2FzZSBTQ1RQX0RBVEFfRklSU1RfRlJBRzoKKwkJCWZpcnN0X2ZyYWcgPSBwb3M7CisJCQluZXh0X3RzbiA9IGN0c24gKyAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1RQX0RBVEFfTUlERExFX0ZSQUc6CisJCQlpZiAoKGZpcnN0X2ZyYWcpICYmIChjdHNuID09IG5leHRfdHNuKSkKKwkJCQluZXh0X3RzbisrOworCQkJZWxzZQorCQkJCWZpcnN0X2ZyYWcgPSBOVUxMOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1RQX0RBVEFfTEFTVF9GUkFHOgorCQkJaWYgKGZpcnN0X2ZyYWcgJiYgKGN0c24gPT0gbmV4dF90c24pKQorCQkJCWdvdG8gZm91bmQ7CisJCQllbHNlCisJCQkJZmlyc3RfZnJhZyA9IE5VTEw7CisJCQlicmVhazsKKwkJfTsKKworCX0KK2RvbmU6CisJcmV0dXJuIHJldHZhbDsKK2ZvdW5kOgorCXJldHZhbCA9IHNjdHBfbWFrZV9yZWFzc2VtYmxlZF9ldmVudChmaXJzdF9mcmFnLCBwb3MpOworCWlmIChyZXR2YWwpCisJCXJldHZhbC0+bXNnX2ZsYWdzIHw9IE1TR19FT1I7CisJZ290byBkb25lOworfQorCisvKiBSZXRyaWV2ZSB0aGUgbmV4dCBzZXQgb2YgZnJhZ21lbnRzIG9mIGEgcGFydGlhbCBtZXNzYWdlLiAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqc2N0cF91bHBxX3JldHJpZXZlX3BhcnRpYWwoc3RydWN0IHNjdHBfdWxwcSAqdWxwcSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcG9zLCAqbGFzdF9mcmFnLCAqZmlyc3RfZnJhZzsKKwlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqY2V2ZW50OworCV9fdTMyIGN0c24sIG5leHRfdHNuOworCWludCBpc19sYXN0OworCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpyZXR2YWw7CisKKwkvKiBUaGUgY2h1bmtzIGFyZSBoZWxkIGluIHRoZSByZWFzbSBxdWV1ZSBzb3J0ZWQgYnkgVFNOLgorCSAqIFdhbGsgdGhyb3VnaCB0aGUgcXVldWUgc2VxdWVudGlhbGx5IGFuZCBsb29rIGZvciB0aGUgZmlyc3QKKwkgKiBzZXF1ZW5jZSBvZiBmcmFnbWVudGVkIGNodW5rcy4KKwkgKi8KKworCWlmIChza2JfcXVldWVfZW1wdHkoJnVscHEtPnJlYXNtKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsYXN0X2ZyYWcgPSBmaXJzdF9mcmFnID0gTlVMTDsKKwlyZXR2YWwgPSBOVUxMOworCW5leHRfdHNuID0gMDsKKwlpc19sYXN0ID0gMDsKKworCXNrYl9xdWV1ZV93YWxrKCZ1bHBxLT5yZWFzbSwgcG9zKSB7CisJCWNldmVudCA9IHNjdHBfc2tiMmV2ZW50KHBvcyk7CisJCWN0c24gPSBjZXZlbnQtPnRzbjsKKworCQlzd2l0Y2ggKGNldmVudC0+bXNnX2ZsYWdzICYgU0NUUF9EQVRBX0ZSQUdfTUFTSykgeworCQljYXNlIFNDVFBfREFUQV9NSURETEVfRlJBRzoKKwkJCWlmICghZmlyc3RfZnJhZykgeworCQkJCWZpcnN0X2ZyYWcgPSBwb3M7CisJCQkJbmV4dF90c24gPSBjdHNuICsgMTsKKwkJCQlsYXN0X2ZyYWcgPSBwb3M7CisJCQl9IGVsc2UgaWYgKG5leHRfdHNuID09IGN0c24pCisJCQkJbmV4dF90c24rKzsKKwkJCWVsc2UKKwkJCQlnb3RvIGRvbmU7CisJCQlicmVhazsKKwkJY2FzZSBTQ1RQX0RBVEFfTEFTVF9GUkFHOgorCQkJaWYgKCFmaXJzdF9mcmFnKQorCQkJCWZpcnN0X2ZyYWcgPSBwb3M7CisJCQllbHNlIGlmIChjdHNuICE9IG5leHRfdHNuKQorCQkJCWdvdG8gZG9uZTsKKwkJCWxhc3RfZnJhZyA9IHBvczsKKwkJCWlzX2xhc3QgPSAxOworCQkJZ290byBkb25lOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIE5VTEw7CisJCX07CisJfQorCisJLyogV2UgaGF2ZSB0aGUgcmVhc3NlbWJsZWQgZXZlbnQuIFRoZXJlIGlzIG5vIG5lZWQgdG8gbG9vaworCSAqIGZ1cnRoZXIuCisJICovCitkb25lOgorCXJldHZhbCA9IHNjdHBfbWFrZV9yZWFzc2VtYmxlZF9ldmVudChmaXJzdF9mcmFnLCBsYXN0X2ZyYWcpOworCWlmIChyZXR2YWwgJiYgaXNfbGFzdCkKKwkJcmV0dmFsLT5tc2dfZmxhZ3MgfD0gTVNHX0VPUjsKKworCXJldHVybiByZXR2YWw7Cit9CisKKworLyogSGVscGVyIGZ1bmN0aW9uIHRvIHJlYXNzZW1ibGUgY2h1bmtzLiAgSG9sZCBjaHVua3Mgb24gdGhlIHJlYXNtIHF1ZXVlIHRoYXQKKyAqIG5lZWQgcmVhc3NlbWJsaW5nLgorICovCitzdGF0aWMgc3RydWN0IHNjdHBfdWxwZXZlbnQgKnNjdHBfdWxwcV9yZWFzbShzdHJ1Y3Qgc2N0cF91bHBxICp1bHBxLAorCQkJCQkJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpyZXR2YWwgPSBOVUxMOworCisJLyogQ2hlY2sgaWYgdGhpcyBpcyBwYXJ0IG9mIGEgZnJhZ21lbnRlZCBtZXNzYWdlLiAgKi8KKwlpZiAoU0NUUF9EQVRBX05PVF9GUkFHID09IChldmVudC0+bXNnX2ZsYWdzICYgU0NUUF9EQVRBX0ZSQUdfTUFTSykpIHsKKwkJZXZlbnQtPm1zZ19mbGFncyB8PSBNU0dfRU9SOworCQlyZXR1cm4gZXZlbnQ7CisJfQorCisJc2N0cF91bHBxX3N0b3JlX3JlYXNtKHVscHEsIGV2ZW50KTsKKwlpZiAoIXVscHEtPnBkX21vZGUpCisJCXJldHZhbCA9IHNjdHBfdWxwcV9yZXRyaWV2ZV9yZWFzc2VtYmxlZCh1bHBxKTsKKwllbHNlIHsKKwkJX191MzIgY3RzbiwgY3RzbmFwOworCisJCS8qIERvIG5vdCBldmVuIGJvdGhlciB1bmxlc3MgdGhpcyBpcyB0aGUgbmV4dCB0c24gdG8KKwkJICogYmUgZGVsaXZlcmVkLgorCQkgKi8KKwkJY3RzbiA9IGV2ZW50LT50c247CisJCWN0c25hcCA9IHNjdHBfdHNubWFwX2dldF9jdHNuKCZ1bHBxLT5hc29jLT5wZWVyLnRzbl9tYXApOworCQlpZiAoVFNOX2x0ZShjdHNuLCBjdHNuYXApKQorCQkJcmV0dmFsID0gc2N0cF91bHBxX3JldHJpZXZlX3BhcnRpYWwodWxwcSk7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogUmV0cmlldmUgdGhlIGZpcnN0IHBhcnQgKHNlcXVlbnRpYWwgZnJhZ21lbnRzKSBmb3IgcGFydGlhbCBkZWxpdmVyeS4gICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzY3RwX3VscGV2ZW50ICpzY3RwX3VscHFfcmV0cmlldmVfZmlyc3Qoc3RydWN0IHNjdHBfdWxwcSAqdWxwcSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcG9zLCAqbGFzdF9mcmFnLCAqZmlyc3RfZnJhZzsKKwlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqY2V2ZW50OworCV9fdTMyIGN0c24sIG5leHRfdHNuOworCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpyZXR2YWw7CisKKwkvKiBUaGUgY2h1bmtzIGFyZSBoZWxkIGluIHRoZSByZWFzbSBxdWV1ZSBzb3J0ZWQgYnkgVFNOLgorCSAqIFdhbGsgdGhyb3VnaCB0aGUgcXVldWUgc2VxdWVudGlhbGx5IGFuZCBsb29rIGZvciBhIHNlcXVlbmNlIG9mCisJICogZnJhZ21lbnRlZCBjaHVua3MgdGhhdCBzdGFydCBhIGRhdGFncmFtLgorCSAqLworCisJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmdWxwcS0+cmVhc20pKQorCQlyZXR1cm4gTlVMTDsKKworCWxhc3RfZnJhZyA9IGZpcnN0X2ZyYWcgPSBOVUxMOworCXJldHZhbCA9IE5VTEw7CisJbmV4dF90c24gPSAwOworCisJc2tiX3F1ZXVlX3dhbGsoJnVscHEtPnJlYXNtLCBwb3MpIHsKKwkJY2V2ZW50ID0gc2N0cF9za2IyZXZlbnQocG9zKTsKKwkJY3RzbiA9IGNldmVudC0+dHNuOworCisJCXN3aXRjaCAoY2V2ZW50LT5tc2dfZmxhZ3MgJiBTQ1RQX0RBVEFfRlJBR19NQVNLKSB7CisJCWNhc2UgU0NUUF9EQVRBX0ZJUlNUX0ZSQUc6CisJCQlpZiAoIWZpcnN0X2ZyYWcpIHsKKwkJCQlmaXJzdF9mcmFnID0gcG9zOworCQkJCW5leHRfdHNuID0gY3RzbiArIDE7CisJCQkJbGFzdF9mcmFnID0gcG9zOworCQkJfSBlbHNlCisJCQkJZ290byBkb25lOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQ1RQX0RBVEFfTUlERExFX0ZSQUc6CisJCQlpZiAoIWZpcnN0X2ZyYWcpCisJCQkJcmV0dXJuIE5VTEw7CisJCQlpZiAoY3RzbiA9PSBuZXh0X3RzbikgeworCQkJCW5leHRfdHNuKys7CisJCQkJbGFzdF9mcmFnID0gcG9zOworCQkJfSBlbHNlCisJCQkJZ290byBkb25lOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gTlVMTDsKKwkJfTsKKwl9CisKKwkvKiBXZSBoYXZlIHRoZSByZWFzc2VtYmxlZCBldmVudC4gVGhlcmUgaXMgbm8gbmVlZCB0byBsb29rCisJICogZnVydGhlci4KKwkgKi8KK2RvbmU6CisJcmV0dmFsID0gc2N0cF9tYWtlX3JlYXNzZW1ibGVkX2V2ZW50KGZpcnN0X2ZyYWcsIGxhc3RfZnJhZyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogSGVscGVyIGZ1bmN0aW9uIHRvIGdhdGhlciBza2JzIHRoYXQgaGF2ZSBwb3NzaWJseSBiZWNvbWUKKyAqIG9yZGVyZWQgYnkgYW4gYW4gaW5jb21pbmcgY2h1bmsuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzY3RwX3VscHFfcmV0cmlldmVfb3JkZXJlZChzdHJ1Y3Qgc2N0cF91bHBxICp1bHBxLAorCQkJCQkgICAgICBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnBvcywgKnRtcDsKKwlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqY2V2ZW50OworCXN0cnVjdCBzY3RwX3N0cmVhbSAqaW47CisJX191MTYgc2lkLCBjc2lkOworCV9fdTE2IHNzbiwgY3NzbjsKKworCXNpZCA9IGV2ZW50LT5zdHJlYW07CisJc3NuID0gZXZlbnQtPnNzbjsKKwlpbiAgPSAmdWxwcS0+YXNvYy0+c3NubWFwLT5pbjsKKworCS8qIFdlIGFyZSBob2xkaW5nIHRoZSBjaHVua3MgYnkgc3RyZWFtLCBieSBTU04uICAqLworCXNjdHBfc2tiX2Zvcl9lYWNoKHBvcywgJnVscHEtPmxvYmJ5LCB0bXApIHsKKwkJY2V2ZW50ID0gKHN0cnVjdCBzY3RwX3VscGV2ZW50ICopIHBvcy0+Y2I7CisJCWNzaWQgPSBjZXZlbnQtPnN0cmVhbTsKKwkJY3NzbiA9IGNldmVudC0+c3NuOworCisJCS8qIEhhdmUgd2UgZ29uZSB0b28gZmFyPyAgKi8KKwkJaWYgKGNzaWQgPiBzaWQpCisJCQlicmVhazsKKworCQkvKiBIYXZlIHdlIG5vdCBnb25lIGZhciBlbm91Z2g/ICAqLworCQlpZiAoY3NpZCA8IHNpZCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjc3NuICE9IHNjdHBfc3NuX3BlZWsoaW4sIHNpZCkpCisJCQlicmVhazsKKworCQkvKiBGb3VuZCBpdCwgc28gbWFyayBpbiB0aGUgc3NubWFwLiAqLworCQlzY3RwX3Nzbl9uZXh0KGluLCBzaWQpOworCisJCV9fc2tiX3VubGluayhwb3MsIHBvcy0+bGlzdCk7CisKKwkJLyogQXR0YWNoIGFsbCBnYXRoZXJlZCBza2JzIHRvIHRoZSBldmVudC4gICovCisJCV9fc2tiX3F1ZXVlX3RhaWwoc2N0cF9ldmVudDJza2IoZXZlbnQpLT5saXN0LCBwb3MpOworCX0KK30KKworLyogSGVscGVyIGZ1bmN0aW9uIHRvIHN0b3JlIGNodW5rcyBuZWVkaW5nIG9yZGVyaW5nLiAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzY3RwX3VscHFfc3RvcmVfb3JkZXJlZChzdHJ1Y3Qgc2N0cF91bHBxICp1bHBxLAorCQkJCQkgICBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnBvczsKKwlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqY2V2ZW50OworCV9fdTE2IHNpZCwgY3NpZDsKKwlfX3UxNiBzc24sIGNzc247CisKKwlwb3MgPSBza2JfcGVla190YWlsKCZ1bHBxLT5sb2JieSk7CisJaWYgKCFwb3MpIHsKKwkJX19za2JfcXVldWVfdGFpbCgmdWxwcS0+bG9iYnksIHNjdHBfZXZlbnQyc2tiKGV2ZW50KSk7CisJCXJldHVybjsKKwl9CisKKwlzaWQgPSBldmVudC0+c3RyZWFtOworCXNzbiA9IGV2ZW50LT5zc247CisJCisJY2V2ZW50ID0gKHN0cnVjdCBzY3RwX3VscGV2ZW50ICopIHBvcy0+Y2I7CisJY3NpZCA9IGNldmVudC0+c3RyZWFtOworCWNzc24gPSBjZXZlbnQtPnNzbjsKKwlpZiAoc2lkID4gY3NpZCkgeworCQlfX3NrYl9xdWV1ZV90YWlsKCZ1bHBxLT5sb2JieSwgc2N0cF9ldmVudDJza2IoZXZlbnQpKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgoc2lkID09IGNzaWQpICYmIFNTTl9sdChjc3NuLCBzc24pKSB7CisJCV9fc2tiX3F1ZXVlX3RhaWwoJnVscHEtPmxvYmJ5LCBzY3RwX2V2ZW50MnNrYihldmVudCkpOworCQlyZXR1cm47CisJfQorCisJLyogRmluZCB0aGUgcmlnaHQgcGxhY2UgaW4gdGhpcyBsaXN0LiAgV2Ugc3RvcmUgdGhlbSBieQorCSAqIHN0cmVhbSBJRCBhbmQgdGhlbiBieSBTU04uCisJICovCisJc2tiX3F1ZXVlX3dhbGsoJnVscHEtPmxvYmJ5LCBwb3MpIHsKKwkJY2V2ZW50ID0gKHN0cnVjdCBzY3RwX3VscGV2ZW50ICopIHBvcy0+Y2I7CisJCWNzaWQgPSBjZXZlbnQtPnN0cmVhbTsKKwkJY3NzbiA9IGNldmVudC0+c3NuOworCisJCWlmIChjc2lkID4gc2lkKQorCQkJYnJlYWs7CisJCWlmIChjc2lkID09IHNpZCAmJiBTU05fbHQoc3NuLCBjc3NuKSkKKwkJCWJyZWFrOworCX0KKworCisJLyogSW5zZXJ0IGJlZm9yZSBwb3MuICovCisJX19za2JfaW5zZXJ0KHNjdHBfZXZlbnQyc2tiKGV2ZW50KSwgcG9zLT5wcmV2LCBwb3MsICZ1bHBxLT5sb2JieSk7CisKK30KKworc3RhdGljIHN0cnVjdCBzY3RwX3VscGV2ZW50ICpzY3RwX3VscHFfb3JkZXIoc3RydWN0IHNjdHBfdWxwcSAqdWxwcSwKKwkJCQkJCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudCkKK3sKKwlfX3UxNiBzaWQsIHNzbjsKKwlzdHJ1Y3Qgc2N0cF9zdHJlYW0gKmluOworCisJLyogQ2hlY2sgaWYgdGhpcyBtZXNzYWdlIG5lZWRzIG9yZGVyaW5nLiAgKi8KKwlpZiAoU0NUUF9EQVRBX1VOT1JERVJFRCAmIGV2ZW50LT5tc2dfZmxhZ3MpCisJCXJldHVybiBldmVudDsKKworCS8qIE5vdGU6IFRoZSBzdHJlYW0gSUQgbXVzdCBiZSB2ZXJpZmllZCBiZWZvcmUgdGhpcyByb3V0aW5lLiAgKi8KKwlzaWQgPSBldmVudC0+c3RyZWFtOworCXNzbiA9IGV2ZW50LT5zc247CisJaW4gID0gJnVscHEtPmFzb2MtPnNzbm1hcC0+aW47CisKKwkvKiBJcyB0aGlzIHRoZSBleHBlY3RlZCBTU04gZm9yIHRoaXMgc3RyZWFtIElEPyAgKi8KKwlpZiAoc3NuICE9IHNjdHBfc3NuX3BlZWsoaW4sIHNpZCkpIHsKKwkJLyogV2UndmUgcmVjZWl2ZWQgc29tZXRoaW5nIG91dCBvZiBvcmRlciwgc28gZmluZCB3aGVyZSBpdAorCQkgKiBuZWVkcyB0byBiZSBwbGFjZWQuICBXZSBvcmRlciBieSBzdHJlYW0gYW5kIHRoZW4gYnkgU1NOLgorCQkgKi8KKwkJc2N0cF91bHBxX3N0b3JlX29yZGVyZWQodWxwcSwgZXZlbnQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBNYXJrIHRoYXQgdGhlIG5leHQgY2h1bmsgaGFzIGJlZW4gZm91bmQuICAqLworCXNjdHBfc3NuX25leHQoaW4sIHNpZCk7CisKKwkvKiBHbyBmaW5kIGFueSBvdGhlciBjaHVua3MgdGhhdCB3ZXJlIHdhaXRpbmcgZm9yCisJICogb3JkZXJpbmcuCisJICovCisJc2N0cF91bHBxX3JldHJpZXZlX29yZGVyZWQodWxwcSwgZXZlbnQpOworCisJcmV0dXJuIGV2ZW50OworfQorCisvKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2F0aGVyIHNrYnMgdGhhdCBoYXZlIHBvc3NpYmx5IGJlY29tZQorICogb3JkZXJlZCBieSBmb3J3YXJkIHRzbiBza2lwcGluZyB0aGVpciBkZXBlbmRlbmNpZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzY3RwX3VscHFfcmVhcF9vcmRlcmVkKHN0cnVjdCBzY3RwX3VscHEgKnVscHEpCit7CisJc3RydWN0IHNrX2J1ZmYgKnBvcywgKnRtcDsKKwlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqY2V2ZW50OworCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudCA9IE5VTEw7CisJc3RydWN0IHNjdHBfc3RyZWFtICppbjsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHRlbXA7CisJX191MTYgY3NpZCwgY3NzbjsKKworCWluICA9ICZ1bHBxLT5hc29jLT5zc25tYXAtPmluOworCisJLyogV2UgYXJlIGhvbGRpbmcgdGhlIGNodW5rcyBieSBzdHJlYW0sIGJ5IFNTTi4gICovCisJc2N0cF9za2JfZm9yX2VhY2gocG9zLCAmdWxwcS0+bG9iYnksIHRtcCkgeworCQljZXZlbnQgPSAoc3RydWN0IHNjdHBfdWxwZXZlbnQgKikgcG9zLT5jYjsKKwkJY3NpZCA9IGNldmVudC0+c3RyZWFtOworCQljc3NuID0gY2V2ZW50LT5zc247CisKKwkJaWYgKGNzc24gIT0gc2N0cF9zc25fcGVlayhpbiwgY3NpZCkpCisJCQlicmVhazsKKworCQkvKiBGb3VuZCBpdCwgc28gbWFyayBpbiB0aGUgc3NubWFwLiAqLwkgICAgICAgCisJCXNjdHBfc3NuX25leHQoaW4sIGNzaWQpOworCisJCV9fc2tiX3VubGluayhwb3MsIHBvcy0+bGlzdCk7CisJCWlmICghZXZlbnQpIHsJCQkJCQkKKwkJCS8qIENyZWF0ZSBhIHRlbXBvcmFyeSBsaXN0IHRvIGNvbGxlY3QgY2h1bmtzIG9uLiAgKi8KKwkJCWV2ZW50ID0gc2N0cF9za2IyZXZlbnQocG9zKTsKKwkJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnRlbXApOworCQkJX19za2JfcXVldWVfdGFpbCgmdGVtcCwgc2N0cF9ldmVudDJza2IoZXZlbnQpKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEF0dGFjaCBhbGwgZ2F0aGVyZWQgc2ticyB0byB0aGUgZXZlbnQuICAqLworCQkJX19za2JfcXVldWVfdGFpbChzY3RwX2V2ZW50MnNrYihldmVudCktPmxpc3QsIHBvcyk7CisJCX0KKwl9CisKKwkvKiBTZW5kIGV2ZW50IHRvIHRoZSBVTFAuICAqLworCWlmIChldmVudCkKKwkJc2N0cF91bHBxX3RhaWxfZXZlbnQodWxwcSwgZXZlbnQpOworfQorCisvKiBTa2lwIG92ZXIgYW4gU1NOLiAqLwordm9pZCBzY3RwX3VscHFfc2tpcChzdHJ1Y3Qgc2N0cF91bHBxICp1bHBxLCBfX3UxNiBzaWQsIF9fdTE2IHNzbikKK3sKKwlzdHJ1Y3Qgc2N0cF9zdHJlYW0gKmluOworCisJLyogTm90ZTogVGhlIHN0cmVhbSBJRCBtdXN0IGJlIHZlcmlmaWVkIGJlZm9yZSB0aGlzIHJvdXRpbmUuICAqLworCWluICA9ICZ1bHBxLT5hc29jLT5zc25tYXAtPmluOworCisJLyogSXMgdGhpcyBhbiBvbGQgU1NOPyAgSWYgc28gaWdub3JlLiAqLworCWlmIChTU05fbHQoc3NuLCBzY3RwX3Nzbl9wZWVrKGluLCBzaWQpKSkKKwkJcmV0dXJuOworCisJLyogTWFyayB0aGF0IHdlIGFyZSBubyBsb25nZXIgZXhwZWN0aW5nIHRoaXMgU1NOIG9yIGxvd2VyLiAqLworCXNjdHBfc3NuX3NraXAoaW4sIHNpZCwgc3NuKTsKKworCS8qIEdvIGZpbmQgYW55IG90aGVyIGNodW5rcyB0aGF0IHdlcmUgd2FpdGluZyBmb3IKKwkgKiBvcmRlcmluZyBhbmQgZGVsaXZlciB0aGVtIGlmIG5lZWRlZC4gCisJICovCisJc2N0cF91bHBxX3JlYXBfb3JkZXJlZCh1bHBxKTsKKwlyZXR1cm47Cit9CisKKy8qIFJlbmVnZSAnbmVlZGVkJyBieXRlcyBmcm9tIHRoZSBvcmRlcmluZyBxdWV1ZS4gKi8KK3N0YXRpYyBfX3UxNiBzY3RwX3VscHFfcmVuZWdlX29yZGVyKHN0cnVjdCBzY3RwX3VscHEgKnVscHEsIF9fdTE2IG5lZWRlZCkKK3sKKwlfX3UxNiBmcmVlZCA9IDA7CisJX191MzIgdHNuOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50OworCXN0cnVjdCBzY3RwX3Rzbm1hcCAqdHNubWFwOworCisJdHNubWFwID0gJnVscHEtPmFzb2MtPnBlZXIudHNuX21hcDsKKworCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZV90YWlsKCZ1bHBxLT5sb2JieSkpICE9IE5VTEwpIHsKKwkJZnJlZWQgKz0gc2tiX2hlYWRsZW4oc2tiKTsKKwkJZXZlbnQgPSBzY3RwX3NrYjJldmVudChza2IpOworCQl0c24gPSBldmVudC0+dHNuOworCisJCXNjdHBfdWxwZXZlbnRfZnJlZShldmVudCk7CisJCXNjdHBfdHNubWFwX3JlbmVnZSh0c25tYXAsIHRzbik7CisJCWlmIChmcmVlZCA+PSBuZWVkZWQpCisJCQlyZXR1cm4gZnJlZWQ7CisJfQorCisJcmV0dXJuIGZyZWVkOworfQorCisvKiBSZW5lZ2UgJ25lZWRlZCcgYnl0ZXMgZnJvbSB0aGUgcmVhc3NlbWJseSBxdWV1ZS4gKi8KK3N0YXRpYyBfX3UxNiBzY3RwX3VscHFfcmVuZWdlX2ZyYWdzKHN0cnVjdCBzY3RwX3VscHEgKnVscHEsIF9fdTE2IG5lZWRlZCkKK3sKKwlfX3UxNiBmcmVlZCA9IDA7CisJX191MzIgdHNuOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50OworCXN0cnVjdCBzY3RwX3Rzbm1hcCAqdHNubWFwOworCisJdHNubWFwID0gJnVscHEtPmFzb2MtPnBlZXIudHNuX21hcDsKKworCS8qIFdhbGsgYmFja3dhcmRzIHRocm91Z2ggdGhlIGxpc3QsIHJlbmVnZXMgdGhlIG5ld2VzdCB0c25zLiAqLworCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZV90YWlsKCZ1bHBxLT5yZWFzbSkpICE9IE5VTEwpIHsKKwkJZnJlZWQgKz0gc2tiX2hlYWRsZW4oc2tiKTsKKwkJZXZlbnQgPSBzY3RwX3NrYjJldmVudChza2IpOworCQl0c24gPSBldmVudC0+dHNuOworCisJCXNjdHBfdWxwZXZlbnRfZnJlZShldmVudCk7CisJCXNjdHBfdHNubWFwX3JlbmVnZSh0c25tYXAsIHRzbik7CisJCWlmIChmcmVlZCA+PSBuZWVkZWQpCisJCQlyZXR1cm4gZnJlZWQ7CisJfQorCisJcmV0dXJuIGZyZWVkOworfQorCisvKiBQYXJ0aWFsIGRlbGl2ZXIgdGhlIGZpcnN0IG1lc3NhZ2UgYXMgdGhlcmUgaXMgcHJlc3N1cmUgb24gcnduZC4gKi8KK3ZvaWQgc2N0cF91bHBxX3BhcnRpYWxfZGVsaXZlcnkoc3RydWN0IHNjdHBfdWxwcSAqdWxwcSwKKwkJCQlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssIGludCBnZnApCit7CisJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50OworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOworCisJYXNvYyA9IHVscHEtPmFzb2M7CisKKwkvKiBBcmUgd2UgYWxyZWFkeSBpbiBwYXJ0aWFsIGRlbGl2ZXJ5IG1vZGU/ICAqLworCWlmICghc2N0cF9zayhhc29jLT5iYXNlLnNrKS0+cGRfbW9kZSkgeworCisJCS8qIElzIHBhcnRpYWwgZGVsaXZlcnkgcG9zc2libGU/ICAqLworCQlldmVudCA9IHNjdHBfdWxwcV9yZXRyaWV2ZV9maXJzdCh1bHBxKTsKKwkJLyogU2VuZCBldmVudCB0byB0aGUgVUxQLiAgICovCisJCWlmIChldmVudCkgeworCQkJc2N0cF91bHBxX3RhaWxfZXZlbnQodWxwcSwgZXZlbnQpOworCQkJc2N0cF9zayhhc29jLT5iYXNlLnNrKS0+cGRfbW9kZSA9IDE7CisJCQl1bHBxLT5wZF9tb2RlID0gMTsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworLyogUmVuZWdlIHNvbWUgcGFja2V0cyB0byBtYWtlIHJvb20gZm9yIGFuIGluY29taW5nIGNodW5rLiAgKi8KK3ZvaWQgc2N0cF91bHBxX3JlbmVnZShzdHJ1Y3Qgc2N0cF91bHBxICp1bHBxLCBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCisJCSAgICAgIGludCBnZnApCit7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CisJX191MTYgbmVlZGVkLCBmcmVlZDsKKworCWFzb2MgPSB1bHBxLT5hc29jOworCisJaWYgKGNodW5rKSB7CisJCW5lZWRlZCA9IG50b2hzKGNodW5rLT5jaHVua19oZHItPmxlbmd0aCk7CisJCW5lZWRlZCAtPSBzaXplb2Yoc2N0cF9kYXRhX2NodW5rX3QpOworCX0gZWxzZSAKKwkJbmVlZGVkID0gU0NUUF9ERUZBVUxUX01BWFdJTkRPVzsKKworCWZyZWVkID0gMDsKKworCWlmIChza2JfcXVldWVfZW1wdHkoJmFzb2MtPmJhc2Uuc2stPnNrX3JlY2VpdmVfcXVldWUpKSB7CisJCWZyZWVkID0gc2N0cF91bHBxX3JlbmVnZV9vcmRlcih1bHBxLCBuZWVkZWQpOworCQlpZiAoZnJlZWQgPCBuZWVkZWQpIHsKKwkJCWZyZWVkICs9IHNjdHBfdWxwcV9yZW5lZ2VfZnJhZ3ModWxwcSwgbmVlZGVkIC0gZnJlZWQpOworCQl9CisJfQorCS8qIElmIGFibGUgdG8gZnJlZSBlbm91Z2ggcm9vbSwgYWNjZXB0IHRoaXMgY2h1bmsuICovCisJaWYgKGNodW5rICYmIChmcmVlZCA+PSBuZWVkZWQpKSB7CisJCV9fdTMyIHRzbjsKKwkJdHNuID0gbnRvaGwoY2h1bmstPnN1YmguZGF0YV9oZHItPnRzbik7CisJCXNjdHBfdHNubWFwX21hcmsoJmFzb2MtPnBlZXIudHNuX21hcCwgdHNuKTsKKwkJc2N0cF91bHBxX3RhaWxfZGF0YSh1bHBxLCBjaHVuaywgZ2ZwKTsKKwkJCisJCXNjdHBfdWxwcV9wYXJ0aWFsX2RlbGl2ZXJ5KHVscHEsIGNodW5rLCBnZnApOworCX0KKworCXJldHVybjsKK30KKworCisKKy8qIE5vdGlmeSB0aGUgYXBwbGljYXRpb24gaWYgYW4gYXNzb2NpYXRpb24gaXMgYWJvcnRlZCBhbmQgaW4KKyAqIHBhcnRpYWwgZGVsaXZlcnkgbW9kZS4gIFNlbmQgdXAgYW55IHBlbmRpbmcgcmVjZWl2ZWQgbWVzc2FnZXMuCisgKi8KK3ZvaWQgc2N0cF91bHBxX2Fib3J0X3BkKHN0cnVjdCBzY3RwX3VscHEgKnVscHEsIGludCBnZnApCit7CisJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ID0gTlVMTDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlpZiAoIXVscHEtPnBkX21vZGUpCisJCXJldHVybjsKKworCXNrID0gdWxwcS0+YXNvYy0+YmFzZS5zazsKKwlpZiAoc2N0cF91bHBldmVudF90eXBlX2VuYWJsZWQoU0NUUF9QQVJUSUFMX0RFTElWRVJZX0VWRU5ULAorCQkJCSAgICAgICAmc2N0cF9zayhzayktPnN1YnNjcmliZSkpCisJCWV2ID0gc2N0cF91bHBldmVudF9tYWtlX3BkYXBpKHVscHEtPmFzb2MsCisJCQkJCSAgICAgIFNDVFBfUEFSVElBTF9ERUxJVkVSWV9BQk9SVEVELAorCQkJCQkgICAgICBnZnApOworCWlmIChldikKKwkJX19za2JfcXVldWVfdGFpbCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNjdHBfZXZlbnQyc2tiKGV2KSk7CisKKwkvKiBJZiB0aGVyZSBpcyBkYXRhIHdhaXRpbmcsIHNlbmQgaXQgdXAgdGhlIHNvY2tldCBub3cuICovCisJaWYgKHNjdHBfdWxwcV9jbGVhcl9wZCh1bHBxKSB8fCBldikKKwkJc2stPnNrX2RhdGFfcmVhZHkoc2ssIDApOworfQpkaWZmIC0tZ2l0IGEvbmV0L3NvY2tldC5jIGIvbmV0L3NvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZDQ0OTkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc29ja2V0LmMKQEAgLTAsMCArMSwyMDg4IEBACisvKgorICogTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU09DS0VUIG5ldHdvcmsgYWNjZXNzIHByb3RvY29sLgorICoKKyAqIFZlcnNpb246CUAoIylzb2NrZXQuYwkxLjEuOTMJMTgvMDIvOTUKKyAqCisgKiBBdXRob3JzOglPcmVzdCBaYm9yb3dza2ksIDxvYnpAS29kYWsuQ09NPgorICoJCVJvc3MgQmlybywgPGJpcjdAbGVsYW5kLlN0YW5mb3JkLkVkdT4KKyAqCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCisgKiBGaXhlczoKKyAqCQlBbm9ueW1vdXMJOglOT1RTT0NLL0JBREYgY2xlYW51cC4gRXJyb3IgZml4IGluCisgKgkJCQkJc2h1dGRvd24oKQorICoJCUFsYW4gQ294CToJdmVyaWZ5X2FyZWEoKSBmaXhlcworICoJCUFsYW4gQ294CToJUmVtb3ZlZCBEREkKKyAqCQlKb25hdGhhbiBLYW1lbnMJOglTT0NLX0RHUkFNIHJlY29ubmVjdCBidWcKKyAqCQlBbGFuIENveAk6CU1vdmVkIGEgbG9hZCBvZiBjaGVja3MgdG8gdGhlIHZlcnkKKyAqCQkJCQl0b3AgbGV2ZWwuCisgKgkJQWxhbiBDb3gJOglNb3ZlIGFkZHJlc3Mgc3RydWN0dXJlcyB0by9mcm9tIHVzZXIKKyAqCQkJCQltb2RlIGFib3ZlIHRoZSBwcm90b2NvbCBsYXllcnMuCisgKgkJUm9iIEphbnNzZW4JOglBbGxvdyAwIGxlbmd0aCBzZW5kcy4KKyAqCQlBbGFuIENveAk6CUFzeW5jaHJvbm91cyBJL08gc3VwcG9ydCAoY3JpYmJlZCBmcm9tIHRoZQorICoJCQkJCXR0eSBkcml2ZXJzKS4KKyAqCQlOaWliZSBZdXRha2EJOglBc3luY2hyb25vdXMgSS9PIGZvciB3cml0ZXMgKDQuNEJTRCBzdHlsZSkKKyAqCQlKZWZmIFVwaG9mZgk6CU1hZGUgbWF4IG51bWJlciBvZiBzb2NrZXRzIGNvbW1hbmQtbGluZQorICoJCQkJCWNvbmZpZ3VyYWJsZS4KKyAqCQlNYXR0aSBBYXJuaW8JOglNYWRlIHRoZSBudW1iZXIgb2Ygc29ja2V0cyBkeW5hbWljLAorICoJCQkJCXRvIGJlIGFsbG9jYXRlZCB3aGVuIG5lZWRlZCwgYW5kIG1yLgorICoJCQkJCVVwaG9mZidzIG1heCBpcyB1c2VkIGFzIG1heCB0byBiZQorICoJCQkJCWFsbG93ZWQgdG8gYWxsb2NhdGUuCisgKgkJTGludXMJCToJQXJnaC4gcmVtb3ZlZCBhbGwgdGhlIHNvY2tldCBhbGxvY2F0aW9uCisgKgkJCQkJYWx0b2dldGhlcjogaXQncyBpbiB0aGUgaW5vZGUgbm93LgorICoJCUFsYW4gQ294CToJTWFkZSBzb2NrX2FsbG9jKCkvc29ja19yZWxlYXNlKCkgcHVibGljCisgKgkJCQkJZm9yIE5ldFJPTSBhbmQgZnV0dXJlIGtlcm5lbCBuZnNkIHR5cGUKKyAqCQkJCQlzdHVmZi4KKyAqCQlBbGFuIENveAk6CXNlbmRtc2cvcmVjdm1zZyBiYXNpY3MuCisgKgkJVG9tIER5YXMJOglFeHBvcnQgbmV0IHN5bWJvbHMuCisgKgkJTWFyY2luIERhbGVja2kJOglGaXhlZCBwcm9ibGVtcyB3aXRoIENPTkZJR19ORVQ9Im4iLgorICoJCUFsYW4gQ294CToJQWRkZWQgdGhyZWFkIGxvY2tpbmcgdG8gc3lzXyogY2FsbHMKKyAqCQkJCQlmb3Igc29ja2V0cy4gTWF5IGhhdmUgZXJyb3JzIGF0IHRoZQorICoJCQkJCW1vbWVudC4KKyAqCQlLZXZpbiBCdWhyCToJRml4ZWQgdGhlIGR1bWIgZXJyb3JzIGluIHRoZSBhYm92ZS4KKyAqCQlBbmRpIEtsZWVuCToJU29tZSBzbWFsbCBjbGVhbnVwcywgb3B0aW1pemF0aW9ucywKKyAqCQkJCQlhbmQgZml4ZWQgYSBjb3B5X2Zyb21fdXNlcigpIGJ1Zy4KKyAqCQlUaWdyYW4gQWl2YXppYW4JOglzeXNfc2VuZChhcmdzKSBjYWxscyBzeXNfc2VuZHRvKGFyZ3MsIE5VTEwsIDApCisgKgkJVGlncmFuIEFpdmF6aWFuCToJTWFkZSBsaXN0ZW4oMikgYmFja2xvZyBzYW5pdHkgY2hlY2tzIAorICoJCQkJCXByb3RvY29sLWluZGVwZW5kZW50CisgKgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCisgKglUaGlzIG1vZHVsZSBpcyBlZmZlY3RpdmVseSB0aGUgdG9wIGxldmVsIGludGVyZmFjZSB0byB0aGUgQlNEIHNvY2tldAorICoJcGFyYWRpZ20uIAorICoKKyAqCUJhc2VkIHVwb24gU3dhbnNlYSBVbml2ZXJzaXR5IENvbXB1dGVyIFNvY2lldHkgTkVUMy4wMzkKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC93YW5yb3V0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9icmlkZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RpdmVydC5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKworI2lmZGVmIENPTkZJR19ORVRfUkFESU8KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgkJLyogTm90ZSA6IHdpbGwgZGVmaW5lIFdJUkVMRVNTX0VYVCAqLworI2VuZGlmCS8qIENPTkZJR19ORVRfUkFESU8gKi8KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisjaW5jbHVkZSA8bmV0L2NvbXBhdC5oPgorCisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKworc3RhdGljIGludCBzb2NrX25vX29wZW4oc3RydWN0IGlub2RlICppcnJlbGV2YW50LCBzdHJ1Y3QgZmlsZSAqZG9udGNhcmUpOworc3RhdGljIHNzaXplX3Qgc29ja19haW9fcmVhZChzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNoYXIgX191c2VyICpidWYsCisJCQkgc2l6ZV90IHNpemUsIGxvZmZfdCBwb3MpOworc3RhdGljIHNzaXplX3Qgc29ja19haW9fd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICBzaXplX3Qgc2l6ZSwgbG9mZl90IHBvcyk7CitzdGF0aWMgaW50IHNvY2tfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hKTsKKworc3RhdGljIGludCBzb2NrX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc29ja19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KTsKK3N0YXRpYyBsb25nIHNvY2tfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQgc29ja19mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IG9uKTsKK3N0YXRpYyBzc2l6ZV90IHNvY2tfcmVhZHYoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqdmVjdG9yLAorCQkJICB1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIHNzaXplX3Qgc29ja193cml0ZXYoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqdmVjdG9yLAorCQkJICB1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIHNzaXplX3Qgc29ja19zZW5kcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgICAgIGludCBvZmZzZXQsIHNpemVfdCBzaXplLCBsb2ZmX3QgKnBwb3MsIGludCBtb3JlKTsKKworCisvKgorICoJU29ja2V0IGZpbGVzIGhhdmUgYSBzZXQgb2YgJ3NwZWNpYWwnIG9wZXJhdGlvbnMgYXMgd2VsbCBhcyB0aGUgZ2VuZXJpYyBmaWxlIG9uZXMuIFRoZXNlIGRvbid0IGFwcGVhcgorICoJaW4gdGhlIG9wZXJhdGlvbiBzdHJ1Y3R1cmVzIGJ1dCBhcmUgZG9uZSBkaXJlY3RseSB2aWEgdGhlIHNvY2tldGNhbGwoKSBtdWx0aXBsZXhvci4KKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzb2NrZXRfZmlsZV9vcHMgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLmxsc2VlayA9CW5vX2xsc2VlaywKKwkuYWlvX3JlYWQgPQlzb2NrX2Fpb19yZWFkLAorCS5haW9fd3JpdGUgPQlzb2NrX2Fpb193cml0ZSwKKwkucG9sbCA9CQlzb2NrX3BvbGwsCisJLnVubG9ja2VkX2lvY3RsID0gc29ja19pb2N0bCwKKwkubW1hcCA9CQlzb2NrX21tYXAsCisJLm9wZW4gPQkJc29ja19ub19vcGVuLAkvKiBzcGVjaWFsIG9wZW4gY29kZSB0byBkaXNhbGxvdyBvcGVuIHZpYSAvcHJvYyAqLworCS5yZWxlYXNlID0Jc29ja19jbG9zZSwKKwkuZmFzeW5jID0Jc29ja19mYXN5bmMsCisJLnJlYWR2ID0Jc29ja19yZWFkdiwKKwkud3JpdGV2ID0Jc29ja193cml0ZXYsCisJLnNlbmRwYWdlID0Jc29ja19zZW5kcGFnZQorfTsKKworLyoKKyAqCVRoZSBwcm90b2NvbCBsaXN0LiBFYWNoIHByb3RvY29sIGlzIHJlZ2lzdGVyZWQgaW4gaGVyZS4KKyAqLworCitzdGF0aWMgc3RydWN0IG5ldF9wcm90b19mYW1pbHkgKm5ldF9mYW1pbGllc1tOUFJPVE9dOworCisjaWYgZGVmaW5lZChDT05GSUdfU01QKSB8fCBkZWZpbmVkKENPTkZJR19QUkVFTVBUKQorc3RhdGljIGF0b21pY190IG5ldF9mYW1pbHlfbG9ja2N0ID0gQVRPTUlDX0lOSVQoMCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG5ldF9mYW1pbHlfbG9jayk7CisKKy8qIFRoZSBzdHJhdGVneSBpczogbW9kaWZpY2F0aW9ucyBuZXRfZmFtaWx5IHZlY3RvciBhcmUgc2hvcnQsIGRvIG5vdAorICAgc2xlZXAgYW5kIHZlZWVyeSByYXJlLCBidXQgcmVhZCBhY2Nlc3Mgc2hvdWxkIGJlIGZyZWUgb2YgYW55IGV4Y2x1c2l2ZQorICAgbG9ja3MuCisgKi8KKworc3RhdGljIHZvaWQgbmV0X2ZhbWlseV93cml0ZV9sb2NrKHZvaWQpCit7CisJc3Bpbl9sb2NrKCZuZXRfZmFtaWx5X2xvY2spOworCXdoaWxlIChhdG9taWNfcmVhZCgmbmV0X2ZhbWlseV9sb2NrY3QpICE9IDApIHsKKwkJc3Bpbl91bmxvY2soJm5ldF9mYW1pbHlfbG9jayk7CisKKwkJeWllbGQoKTsKKworCQlzcGluX2xvY2soJm5ldF9mYW1pbHlfbG9jayk7CisJfQorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIG5ldF9mYW1pbHlfd3JpdGVfdW5sb2NrKHZvaWQpCit7CisJc3Bpbl91bmxvY2soJm5ldF9mYW1pbHlfbG9jayk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbmV0X2ZhbWlseV9yZWFkX2xvY2sodm9pZCkKK3sKKwlhdG9taWNfaW5jKCZuZXRfZmFtaWx5X2xvY2tjdCk7CisJc3Bpbl91bmxvY2tfd2FpdCgmbmV0X2ZhbWlseV9sb2NrKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBuZXRfZmFtaWx5X3JlYWRfdW5sb2NrKHZvaWQpCit7CisJYXRvbWljX2RlYygmbmV0X2ZhbWlseV9sb2NrY3QpOworfQorCisjZWxzZQorI2RlZmluZSBuZXRfZmFtaWx5X3dyaXRlX2xvY2soKSBkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgbmV0X2ZhbWlseV93cml0ZV91bmxvY2soKSBkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgbmV0X2ZhbWlseV9yZWFkX2xvY2soKSBkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgbmV0X2ZhbWlseV9yZWFkX3VubG9jaygpIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKworLyoKKyAqCVN0YXRpc3RpY3MgY291bnRlcnMgb2YgdGhlIHNvY2tldCBsaXN0cworICovCisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIHNvY2tldHNfaW5fdXNlKSA9IDA7CisKKy8qCisgKglTdXBwb3J0IHJvdXRpbmVzLiBNb3ZlIHNvY2tldCBhZGRyZXNzZXMgYmFjayBhbmQgZm9ydGggYWNyb3NzIHRoZSBrZXJuZWwvdXNlcgorICoJZGl2aWRlIGFuZCBsb29rIGFmdGVyIHRoZSBtZXNzeSBiaXRzLgorICovCisKKyNkZWZpbmUgTUFYX1NPQ0tfQUREUgkxMjgJCS8qIDEwOCBmb3IgVW5peCBkb21haW4gLSAKKwkJCQkJICAgMTYgZm9yIElQLCAxNiBmb3IgSVBYLAorCQkJCQkgICAyNCBmb3IgSVB2NiwKKwkJCQkJICAgYWJvdXQgODAgZm9yIEFYLjI1IAorCQkJCQkgICBtdXN0IGJlIGF0IGxlYXN0IG9uZSBiaWdnZXIgdGhhbgorCQkJCQkgICB0aGUgQUZfVU5JWCBzaXplIChzZWUgbmV0L3VuaXgvYWZfdW5peC5jCisJCQkJCSAgIDp1bml4X21rbmFtZSgpKS4gIAorCQkJCQkgKi8KKwkJCQkJIAorLyoqCisgKgltb3ZlX2FkZHJfdG9fa2VybmVsCS0JY29weSBhIHNvY2tldCBhZGRyZXNzIGludG8ga2VybmVsIHNwYWNlCisgKglAdWFkZHI6IEFkZHJlc3MgaW4gdXNlciBzcGFjZQorICoJQGthZGRyOiBBZGRyZXNzIGluIGtlcm5lbCBzcGFjZQorICoJQHVsZW46IExlbmd0aCBpbiB1c2VyIHNwYWNlCisgKgorICoJVGhlIGFkZHJlc3MgaXMgY29waWVkIGludG8ga2VybmVsIHNwYWNlLiBJZiB0aGUgcHJvdmlkZWQgYWRkcmVzcyBpcworICoJdG9vIGxvbmcgYW4gZXJyb3IgY29kZSBvZiAtRUlOVkFMIGlzIHJldHVybmVkLiBJZiB0aGUgY29weSBnaXZlcworICoJaW52YWxpZCBhZGRyZXNzZXMgLUVGQVVMVCBpcyByZXR1cm5lZC4gT24gYSBzdWNjZXNzIDAgaXMgcmV0dXJuZWQuCisgKi8KKworaW50IG1vdmVfYWRkcl90b19rZXJuZWwodm9pZCBfX3VzZXIgKnVhZGRyLCBpbnQgdWxlbiwgdm9pZCAqa2FkZHIpCit7CisJaWYodWxlbjwwfHx1bGVuPk1BWF9TT0NLX0FERFIpCisJCXJldHVybiAtRUlOVkFMOworCWlmKHVsZW49PTApCisJCXJldHVybiAwOworCWlmKGNvcHlfZnJvbV91c2VyKGthZGRyLHVhZGRyLHVsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgltb3ZlX2FkZHJfdG9fdXNlcgktCWNvcHkgYW4gYWRkcmVzcyB0byB1c2VyIHNwYWNlCisgKglAa2FkZHI6IGtlcm5lbCBzcGFjZSBhZGRyZXNzCisgKglAa2xlbjogbGVuZ3RoIG9mIGFkZHJlc3MgaW4ga2VybmVsCisgKglAdWFkZHI6IHVzZXIgc3BhY2UgYWRkcmVzcworICoJQHVsZW46IHBvaW50ZXIgdG8gdXNlciBsZW5ndGggZmllbGQKKyAqCisgKglUaGUgdmFsdWUgcG9pbnRlZCB0byBieSB1bGVuIG9uIGVudHJ5IGlzIHRoZSBidWZmZXIgbGVuZ3RoIGF2YWlsYWJsZS4KKyAqCVRoaXMgaXMgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgYnVmZmVyIHNwYWNlIHVzZWQuIC1FSU5WQUwgaXMgcmV0dXJuZWQKKyAqCWlmIGFuIG92ZXJsb25nIGJ1ZmZlciBpcyBzcGVjaWZpZWQgb3IgYSBuZWdhdGl2ZSBidWZmZXIgc2l6ZS4gLUVGQVVMVAorICoJaXMgcmV0dXJuZWQgaWYgZWl0aGVyIHRoZSBidWZmZXIgb3IgdGhlIGxlbmd0aCBmaWVsZCBhcmUgbm90CisgKglhY2Nlc3NpYmxlLgorICoJQWZ0ZXIgY29weWluZyB0aGUgZGF0YSB1cCB0byB0aGUgbGltaXQgdGhlIHVzZXIgc3BlY2lmaWVzLCB0aGUgdHJ1ZQorICoJbGVuZ3RoIG9mIHRoZSBkYXRhIGlzIHdyaXR0ZW4gb3ZlciB0aGUgbGVuZ3RoIGxpbWl0IHRoZSB1c2VyCisgKglzcGVjaWZpZWQuIFplcm8gaXMgcmV0dXJuZWQgZm9yIGEgc3VjY2Vzcy4KKyAqLworIAoraW50IG1vdmVfYWRkcl90b191c2VyKHZvaWQgKmthZGRyLCBpbnQga2xlbiwgdm9pZCBfX3VzZXIgKnVhZGRyLCBpbnQgX191c2VyICp1bGVuKQoreworCWludCBlcnI7CisJaW50IGxlbjsKKworCWlmKChlcnI9Z2V0X3VzZXIobGVuLCB1bGVuKSkpCisJCXJldHVybiBlcnI7CisJaWYobGVuPmtsZW4pCisJCWxlbj1rbGVuOworCWlmKGxlbjwwIHx8IGxlbj4gTUFYX1NPQ0tfQUREUikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYobGVuKQorCXsKKwkJaWYoY29weV90b191c2VyKHVhZGRyLGthZGRyLGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJLyoKKwkgKgkiZnJvbWxlbiBzaGFsbCByZWZlciB0byB0aGUgdmFsdWUgYmVmb3JlIHRydW5jYXRpb24uLiIKKwkgKgkJCTEwMDMuMWcKKwkgKi8KKwlyZXR1cm4gX19wdXRfdXNlcihrbGVuLCB1bGVuKTsKK30KKworI2RlZmluZSBTT0NLRlNfTUFHSUMgMHg1MzRGNDM0QgorCitzdGF0aWMga21lbV9jYWNoZV90ICogc29ja19pbm9kZV9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKnNvY2tfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3Qgc29ja2V0X2FsbG9jICplaTsKKwllaSA9IChzdHJ1Y3Qgc29ja2V0X2FsbG9jICopa21lbV9jYWNoZV9hbGxvYyhzb2NrX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWlmICghZWkpCisJCXJldHVybiBOVUxMOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVpLT5zb2NrZXQud2FpdCk7CisJCisJZWktPnNvY2tldC5mYXN5bmNfbGlzdCA9IE5VTEw7CisJZWktPnNvY2tldC5zdGF0ZSA9IFNTX1VOQ09OTkVDVEVEOworCWVpLT5zb2NrZXQuZmxhZ3MgPSAwOworCWVpLT5zb2NrZXQub3BzID0gTlVMTDsKKwllaS0+c29ja2V0LnNrID0gTlVMTDsKKwllaS0+c29ja2V0LmZpbGUgPSBOVUxMOworCWVpLT5zb2NrZXQuZmxhZ3MgPSAwOworCisJcmV0dXJuICZlaS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCBzb2NrX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUoc29ja19pbm9kZV9jYWNoZXAsCisJCQljb250YWluZXJfb2YoaW5vZGUsIHN0cnVjdCBzb2NrZXRfYWxsb2MsIHZmc19pbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBzb2NrZXRfYWxsb2MgKmVpID0gKHN0cnVjdCBzb2NrZXRfYWxsb2MgKikgZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikKKwkJaW5vZGVfaW5pdF9vbmNlKCZlaS0+dmZzX2lub2RlKTsKK30KKyAKK3N0YXRpYyBpbnQgaW5pdF9pbm9kZWNhY2hlKHZvaWQpCit7CisJc29ja19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgic29ja19pbm9kZV9jYWNoZSIsCisJCQkJc2l6ZW9mKHN0cnVjdCBzb2NrZXRfYWxsb2MpLAorCQkJCTAsIFNMQUJfSFdDQUNIRV9BTElHTnxTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKKwkJCQlpbml0X29uY2UsIE5VTEwpOworCWlmIChzb2NrX2lub2RlX2NhY2hlcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHNvY2tmc19vcHMgPSB7CisJLmFsbG9jX2lub2RlID0Jc29ja19hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZSA9c29ja19kZXN0cm95X2lub2RlLAorCS5zdGF0ZnMgPQlzaW1wbGVfc3RhdGZzLAorfTsKKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqc29ja2ZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2JfcHNldWRvKGZzX3R5cGUsICJzb2NrZXQ6IiwgJnNvY2tmc19vcHMsIFNPQ0tGU19NQUdJQyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKnNvY2tfbW50OworCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgc29ja19mc190eXBlID0geworCS5uYW1lID0JCSJzb2NrZnMiLAorCS5nZXRfc2IgPQlzb2NrZnNfZ2V0X3NiLAorCS5raWxsX3NiID0Ja2lsbF9hbm9uX3N1cGVyLAorfTsKK3N0YXRpYyBpbnQgc29ja2ZzX2RlbGV0ZV9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXJldHVybiAxOworfQorc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBzb2NrZnNfZGVudHJ5X29wZXJhdGlvbnMgPSB7CisJLmRfZGVsZXRlID0Jc29ja2ZzX2RlbGV0ZV9kZW50cnksCit9OworCisvKgorICoJT2J0YWlucyB0aGUgZmlyc3QgYXZhaWxhYmxlIGZpbGUgZGVzY3JpcHRvciBhbmQgc2V0cyBpdCB1cCBmb3IgdXNlLgorICoKKyAqCVRoaXMgZnVuY3Rpb24gY3JlYXRlcyBmaWxlIHN0cnVjdHVyZSBhbmQgbWFwcyBpdCB0byBmZCBzcGFjZQorICoJb2YgY3VycmVudCBwcm9jZXNzLiBPbiBzdWNjZXNzIGl0IHJldHVybnMgZmlsZSBkZXNjcmlwdG9yCisgKglhbmQgZmlsZSBzdHJ1Y3QgaW1wbGljaXRseSBzdG9yZWQgaW4gc29jay0+ZmlsZS4KKyAqCU5vdGUgdGhhdCBhbm90aGVyIHRocmVhZCBtYXkgY2xvc2UgZmlsZSBkZXNjcmlwdG9yIGJlZm9yZSB3ZSByZXR1cm4KKyAqCWZyb20gdGhpcyBmdW5jdGlvbi4gV2UgdXNlIHRoZSBmYWN0IHRoYXQgbm93IHdlIGRvIG5vdCByZWZlcgorICoJdG8gc29ja2V0IGFmdGVyIG1hcHBpbmcuIElmIG9uZSBkYXkgd2Ugd2lsbCBuZWVkIGl0LCB0aGlzCisgKglmdW5jdGlvbiB3aWxsIGluY3JlbWVudCByZWYuIGNvdW50IG9uIGZpbGUgYnkgMS4KKyAqCisgKglJbiBhbnkgY2FzZSByZXR1cm5lZCBmZCBNQVkgQkUgbm90IHZhbGlkIQorICoJVGhpcyByYWNlIGNvbmRpdGlvbiBpcyB1bmF2b2lkYWJsZQorICoJd2l0aCBzaGFyZWQgZmQgc3BhY2VzLCB3ZSBjYW5ub3Qgc29sdmUgaXQgaW5zaWRlIGtlcm5lbCwKKyAqCWJ1dCB3ZSB0YWtlIGNhcmUgb2YgaW50ZXJuYWwgY29oZXJlbmNlIHlldC4KKyAqLworCitpbnQgc29ja19tYXBfZmQoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlpbnQgZmQ7CisJc3RydWN0IHFzdHIgdGhpczsKKwljaGFyIG5hbWVbMzJdOworCisJLyoKKwkgKglGaW5kIGEgZmlsZSBkZXNjcmlwdG9yIHN1aXRhYmxlIGZvciByZXR1cm4gdG8gdGhlIHVzZXIuIAorCSAqLworCisJZmQgPSBnZXRfdW51c2VkX2ZkKCk7CisJaWYgKGZkID49IDApIHsKKwkJc3RydWN0IGZpbGUgKmZpbGUgPSBnZXRfZW1wdHlfZmlscCgpOworCisJCWlmICghZmlsZSkgeworCQkJcHV0X3VudXNlZF9mZChmZCk7CisJCQlmZCA9IC1FTkZJTEU7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXNwcmludGYobmFtZSwgIlslbHVdIiwgU09DS19JTk9ERShzb2NrKS0+aV9pbm8pOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxlbiA9IHN0cmxlbihuYW1lKTsKKwkJdGhpcy5oYXNoID0gU09DS19JTk9ERShzb2NrKS0+aV9pbm87CisKKwkJZmlsZS0+Zl9kZW50cnkgPSBkX2FsbG9jKHNvY2tfbW50LT5tbnRfc2ItPnNfcm9vdCwgJnRoaXMpOworCQlpZiAoIWZpbGUtPmZfZGVudHJ5KSB7CisJCQlwdXRfZmlscChmaWxlKTsKKwkJCXB1dF91bnVzZWRfZmQoZmQpOworCQkJZmQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJZmlsZS0+Zl9kZW50cnktPmRfb3AgPSAmc29ja2ZzX2RlbnRyeV9vcGVyYXRpb25zOworCQlkX2FkZChmaWxlLT5mX2RlbnRyeSwgU09DS19JTk9ERShzb2NrKSk7CisJCWZpbGUtPmZfdmZzbW50ID0gbW50Z2V0KHNvY2tfbW50KTsKKwkJZmlsZS0+Zl9tYXBwaW5nID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZzsKKworCQlzb2NrLT5maWxlID0gZmlsZTsKKwkJZmlsZS0+Zl9vcCA9IFNPQ0tfSU5PREUoc29jayktPmlfZm9wID0gJnNvY2tldF9maWxlX29wczsKKwkJZmlsZS0+Zl9tb2RlID0gRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFOworCQlmaWxlLT5mX2ZsYWdzID0gT19SRFdSOworCQlmaWxlLT5mX3BvcyA9IDA7CisJCWZkX2luc3RhbGwoZmQsIGZpbGUpOworCX0KKworb3V0OgorCXJldHVybiBmZDsKK30KKworLyoqCisgKglzb2NrZmRfbG9va3VwCS0gCUdvIGZyb20gYSBmaWxlIG51bWJlciB0byBpdHMgc29ja2V0IHNsb3QKKyAqCUBmZDogZmlsZSBoYW5kbGUKKyAqCUBlcnI6IHBvaW50ZXIgdG8gYW4gZXJyb3IgY29kZSByZXR1cm4KKyAqCisgKglUaGUgZmlsZSBoYW5kbGUgcGFzc2VkIGluIGlzIGxvY2tlZCBhbmQgdGhlIHNvY2tldCBpdCBpcyBib3VuZAorICoJdG9vIGlzIHJldHVybmVkLiBJZiBhbiBlcnJvciBvY2N1cnMgdGhlIGVyciBwb2ludGVyIGlzIG92ZXJ3cml0dGVuCisgKgl3aXRoIGEgbmVnYXRpdmUgZXJybm8gY29kZSBhbmQgTlVMTCBpcyByZXR1cm5lZC4gVGhlIGZ1bmN0aW9uIGNoZWNrcworICoJZm9yIGJvdGggaW52YWxpZCBoYW5kbGVzIGFuZCBwYXNzaW5nIGEgaGFuZGxlIHdoaWNoIGlzIG5vdCBhIHNvY2tldC4KKyAqCisgKglPbiBhIHN1Y2Nlc3MgdGhlIHNvY2tldCBvYmplY3QgcG9pbnRlciBpcyByZXR1cm5lZC4KKyAqLworCitzdHJ1Y3Qgc29ja2V0ICpzb2NrZmRfbG9va3VwKGludCBmZCwgaW50ICplcnIpCit7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCisJaWYgKCEoZmlsZSA9IGZnZXQoZmQpKSkKKwl7CisJCSplcnIgPSAtRUJBREY7CisJCXJldHVybiBOVUxMOworCX0KKworCWlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJaWYgKCFTX0lTU09DSyhpbm9kZS0+aV9tb2RlKSkgeworCQkqZXJyID0gLUVOT1RTT0NLOworCQlmcHV0KGZpbGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzb2NrID0gU09DS0VUX0koaW5vZGUpOworCWlmIChzb2NrLT5maWxlICE9IGZpbGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzb2NraV9sb29rdXA6IHNvY2tldCBmaWxlIGNoYW5nZWQhXG4iKTsKKwkJc29jay0+ZmlsZSA9IGZpbGU7CisJfQorCXJldHVybiBzb2NrOworfQorCisvKioKKyAqCXNvY2tfYWxsb2MJLQlhbGxvY2F0ZSBhIHNvY2tldAorICoJCisgKglBbGxvY2F0ZSBhIG5ldyBpbm9kZSBhbmQgc29ja2V0IG9iamVjdC4gVGhlIHR3byBhcmUgYm91bmQgdG9nZXRoZXIKKyAqCWFuZCBpbml0aWFsaXNlZC4gVGhlIHNvY2tldCBpcyB0aGVuIHJldHVybmVkLiBJZiB3ZSBhcmUgb3V0IG9mIGlub2RlcworICoJTlVMTCBpcyByZXR1cm5lZC4KKyAqLworCitzdGF0aWMgc3RydWN0IHNvY2tldCAqc29ja19hbGxvYyh2b2lkKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCXN0cnVjdCBzb2NrZXQgKiBzb2NrOworCisJaW5vZGUgPSBuZXdfaW5vZGUoc29ja19tbnQtPm1udF9zYik7CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzb2NrID0gU09DS0VUX0koaW5vZGUpOworCisJaW5vZGUtPmlfbW9kZSA9IFNfSUZTT0NLfFNfSVJXWFVHTzsKKwlpbm9kZS0+aV91aWQgPSBjdXJyZW50LT5mc3VpZDsKKwlpbm9kZS0+aV9naWQgPSBjdXJyZW50LT5mc2dpZDsKKworCWdldF9jcHVfdmFyKHNvY2tldHNfaW5fdXNlKSsrOworCXB1dF9jcHVfdmFyKHNvY2tldHNfaW5fdXNlKTsKKwlyZXR1cm4gc29jazsKK30KKworLyoKKyAqCUluIHRoZW9yeSB5b3UgY2FuJ3QgZ2V0IGFuIG9wZW4gb24gdGhpcyBpbm9kZSwgYnV0IC9wcm9jIHByb3ZpZGVzCisgKglhIGJhY2sgZG9vci4gUmVtZW1iZXIgdG8ga2VlcCBpdCBzaHV0IG90aGVyd2lzZSB5b3UnbGwgbGV0IHRoZQorICoJY3JlZXB5IGNyYXdsaWVzIGluLgorICovCisgIAorc3RhdGljIGludCBzb2NrX25vX29wZW4oc3RydWN0IGlub2RlICppcnJlbGV2YW50LCBzdHJ1Y3QgZmlsZSAqZG9udGNhcmUpCit7CisJcmV0dXJuIC1FTlhJTzsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBiYWRfc29ja19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gc29ja19ub19vcGVuLAorfTsKKworLyoqCisgKglzb2NrX3JlbGVhc2UJLQljbG9zZSBhIHNvY2tldAorICoJQHNvY2s6IHNvY2tldCB0byBjbG9zZQorICoKKyAqCVRoZSBzb2NrZXQgaXMgcmVsZWFzZWQgZnJvbSB0aGUgcHJvdG9jb2wgc3RhY2sgaWYgaXQgaGFzIGEgcmVsZWFzZQorICoJY2FsbGJhY2ssIGFuZCB0aGUgaW5vZGUgaXMgdGhlbiByZWxlYXNlZCBpZiB0aGUgc29ja2V0IGlzIGJvdW5kIHRvCisgKglhbiBpbm9kZSBub3QgYSBmaWxlLiAKKyAqLworIAordm9pZCBzb2NrX3JlbGVhc2Uoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlpZiAoc29jay0+b3BzKSB7CisJCXN0cnVjdCBtb2R1bGUgKm93bmVyID0gc29jay0+b3BzLT5vd25lcjsKKworCQlzb2NrLT5vcHMtPnJlbGVhc2Uoc29jayk7CisJCXNvY2stPm9wcyA9IE5VTEw7CisJCW1vZHVsZV9wdXQob3duZXIpOworCX0KKworCWlmIChzb2NrLT5mYXN5bmNfbGlzdCkKKwkJcHJpbnRrKEtFUk5fRVJSICJzb2NrX3JlbGVhc2U6IGZhc3luYyBsaXN0IG5vdCBlbXB0eSFcbiIpOworCisJZ2V0X2NwdV92YXIoc29ja2V0c19pbl91c2UpLS07CisJcHV0X2NwdV92YXIoc29ja2V0c19pbl91c2UpOworCWlmICghc29jay0+ZmlsZSkgeworCQlpcHV0KFNPQ0tfSU5PREUoc29jaykpOworCQlyZXR1cm47CisJfQorCXNvY2stPmZpbGU9TlVMTDsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19zb2NrX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCAKKwkJCQkgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc29ja19pb2NiICpzaSA9IGtpb2NiX3RvX3Npb2NiKGlvY2IpOworCWludCBlcnI7CisKKwlzaS0+c29jayA9IHNvY2s7CisJc2ktPnNjbSA9IE5VTEw7CisJc2ktPm1zZyA9IG1zZzsKKwlzaS0+c2l6ZSA9IHNpemU7CisKKwllcnIgPSBzZWN1cml0eV9zb2NrZXRfc2VuZG1zZyhzb2NrLCBtc2csIHNpemUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gc29jay0+b3BzLT5zZW5kbXNnKGlvY2IsIHNvY2ssIG1zZywgc2l6ZSk7Cit9CisKK2ludCBzb2NrX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qga2lvY2IgaW9jYjsKKwlzdHJ1Y3Qgc29ja19pb2NiIHNpb2NiOworCWludCByZXQ7CisKKwlpbml0X3N5bmNfa2lvY2IoJmlvY2IsIE5VTEwpOworCWlvY2IucHJpdmF0ZSA9ICZzaW9jYjsKKwlyZXQgPSBfX3NvY2tfc2VuZG1zZygmaW9jYiwgc29jaywgbXNnLCBzaXplKTsKKwlpZiAoLUVJT0NCUVVFVUVEID09IHJldCkKKwkJcmV0ID0gd2FpdF9vbl9zeW5jX2tpb2NiKCZpb2NiKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQga2VybmVsX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAorCQkgICBzdHJ1Y3Qga3ZlYyAqdmVjLCBzaXplX3QgbnVtLCBzaXplX3Qgc2l6ZSkKK3sKKwltbV9zZWdtZW50X3Qgb2xkZnMgPSBnZXRfZnMoKTsKKwlpbnQgcmVzdWx0OworCisJc2V0X2ZzKEtFUk5FTF9EUyk7CisJLyoKKwkgKiB0aGUgZm9sbG93aW5nIGlzIHNhZmUsIHNpbmNlIGZvciBjb21waWxlciBkZWZpbml0aW9ucyBvZiBrdmVjIGFuZAorCSAqIGlvdmVjIGFyZSBpZGVudGljYWwsIHlpZWxkaW5nIHRoZSBzYW1lIGluLWNvcmUgbGF5b3V0IGFuZCBhbGlnbm1lbnQKKwkgKi8KKwltc2ctPm1zZ19pb3YgPSAoc3RydWN0IGlvdmVjICopdmVjLAorCW1zZy0+bXNnX2lvdmxlbiA9IG51bTsKKwlyZXN1bHQgPSBzb2NrX3NlbmRtc2coc29jaywgbXNnLCBzaXplKTsKKwlzZXRfZnMob2xkZnMpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fc29ja19yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywgCisJCQkJIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBzb2NrX2lvY2IgKnNpID0ga2lvY2JfdG9fc2lvY2IoaW9jYik7CisKKwlzaS0+c29jayA9IHNvY2s7CisJc2ktPnNjbSA9IE5VTEw7CisJc2ktPm1zZyA9IG1zZzsKKwlzaS0+c2l6ZSA9IHNpemU7CisJc2ktPmZsYWdzID0gZmxhZ3M7CisKKwllcnIgPSBzZWN1cml0eV9zb2NrZXRfcmVjdm1zZyhzb2NrLCBtc2csIHNpemUsIGZsYWdzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIHNvY2stPm9wcy0+cmVjdm1zZyhpb2NiLCBzb2NrLCBtc2csIHNpemUsIGZsYWdzKTsKK30KKworaW50IHNvY2tfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIAorCQkgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qga2lvY2IgaW9jYjsKKwlzdHJ1Y3Qgc29ja19pb2NiIHNpb2NiOworCWludCByZXQ7CisKKyAgICAgICAgaW5pdF9zeW5jX2tpb2NiKCZpb2NiLCBOVUxMKTsKKwlpb2NiLnByaXZhdGUgPSAmc2lvY2I7CisJcmV0ID0gX19zb2NrX3JlY3Ztc2coJmlvY2IsIHNvY2ssIG1zZywgc2l6ZSwgZmxhZ3MpOworCWlmICgtRUlPQ0JRVUVVRUQgPT0gcmV0KQorCQlyZXQgPSB3YWl0X29uX3N5bmNfa2lvY2IoJmlvY2IpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBrZXJuZWxfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIAorCQkgICBzdHJ1Y3Qga3ZlYyAqdmVjLCBzaXplX3QgbnVtLAorCQkgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCW1tX3NlZ21lbnRfdCBvbGRmcyA9IGdldF9mcygpOworCWludCByZXN1bHQ7CisKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwkvKgorCSAqIHRoZSBmb2xsb3dpbmcgaXMgc2FmZSwgc2luY2UgZm9yIGNvbXBpbGVyIGRlZmluaXRpb25zIG9mIGt2ZWMgYW5kCisJICogaW92ZWMgYXJlIGlkZW50aWNhbCwgeWllbGRpbmcgdGhlIHNhbWUgaW4tY29yZSBsYXlvdXQgYW5kIGFsaWdubWVudAorCSAqLworCW1zZy0+bXNnX2lvdiA9IChzdHJ1Y3QgaW92ZWMgKil2ZWMsCisJbXNnLT5tc2dfaW92bGVuID0gbnVtOworCXJlc3VsdCA9IHNvY2tfcmVjdm1zZyhzb2NrLCBtc2csIHNpemUsIGZsYWdzKTsKKwlzZXRfZnMob2xkZnMpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHNvY2tfYWlvX2R0b3Ioc3RydWN0IGtpb2NiICppb2NiKQoreworCWtmcmVlKGlvY2ItPnByaXZhdGUpOworfQorCisvKgorICoJUmVhZCBkYXRhIGZyb20gYSBzb2NrZXQuIHVidWYgaXMgYSB1c2VyIG1vZGUgcG9pbnRlci4gV2UgbWFrZSBzdXJlIHRoZSB1c2VyCisgKglhcmVhIHVidWYuLi51YnVmK3NpemUtMSBpcyB3cml0YWJsZSBiZWZvcmUgYXNraW5nIHRoZSBwcm90b2NvbC4KKyAqLworCitzdGF0aWMgc3NpemVfdCBzb2NrX2Fpb19yZWFkKHN0cnVjdCBraW9jYiAqaW9jYiwgY2hhciBfX3VzZXIgKnVidWYsCisJCQkgc2l6ZV90IHNpemUsIGxvZmZfdCBwb3MpCit7CisJc3RydWN0IHNvY2tfaW9jYiAqeCwgc2lvY2I7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwlpbnQgZmxhZ3M7CisKKwlpZiAocG9zICE9IDApCisJCXJldHVybiAtRVNQSVBFOworCWlmIChzaXplPT0wKQkJLyogTWF0Y2ggU1lTNSBiZWhhdmlvdXIgKi8KKwkJcmV0dXJuIDA7CisKKwlpZiAoaXNfc3luY19raW9jYihpb2NiKSkKKwkJeCA9ICZzaW9jYjsKKwllbHNlIHsKKwkJeCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrX2lvY2IpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF4KQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWlvY2ItPmtpX2R0b3IgPSBzb2NrX2Fpb19kdG9yOworCX0KKwlpb2NiLT5wcml2YXRlID0geDsKKwl4LT5raW9jYiA9IGlvY2I7CisJc29jayA9IFNPQ0tFVF9JKGlvY2ItPmtpX2ZpbHAtPmZfZGVudHJ5LT5kX2lub2RlKTsgCisKKwl4LT5hc3luY19tc2cubXNnX25hbWUgPSBOVUxMOworCXgtPmFzeW5jX21zZy5tc2dfbmFtZWxlbiA9IDA7CisJeC0+YXN5bmNfbXNnLm1zZ19pb3YgPSAmeC0+YXN5bmNfaW92OworCXgtPmFzeW5jX21zZy5tc2dfaW92bGVuID0gMTsKKwl4LT5hc3luY19tc2cubXNnX2NvbnRyb2wgPSBOVUxMOworCXgtPmFzeW5jX21zZy5tc2dfY29udHJvbGxlbiA9IDA7CisJeC0+YXN5bmNfaW92Lmlvdl9iYXNlID0gdWJ1ZjsKKwl4LT5hc3luY19pb3YuaW92X2xlbiA9IHNpemU7CisJZmxhZ3MgPSAhKGlvY2ItPmtpX2ZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSA/IDAgOiBNU0dfRE9OVFdBSVQ7CisKKwlyZXR1cm4gX19zb2NrX3JlY3Ztc2coaW9jYiwgc29jaywgJngtPmFzeW5jX21zZywgc2l6ZSwgZmxhZ3MpOworfQorCisKKy8qCisgKglXcml0ZSBkYXRhIHRvIGEgc29ja2V0LiBXZSB2ZXJpZnkgdGhhdCB0aGUgdXNlciBhcmVhIHVidWYuLnVidWYrc2l6ZS0xCisgKglpcyByZWFkYWJsZSBieSB0aGUgdXNlciBwcm9jZXNzLgorICovCisKK3N0YXRpYyBzc2l6ZV90IHNvY2tfYWlvX3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3QgY2hhciBfX3VzZXIgKnVidWYsCisJCQkgIHNpemVfdCBzaXplLCBsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBzb2NrX2lvY2IgKngsIHNpb2NiOworCXN0cnVjdCBzb2NrZXQgKnNvY2s7CisJCisJaWYgKHBvcyAhPSAwKQorCQlyZXR1cm4gLUVTUElQRTsKKwlpZihzaXplPT0wKQkJLyogTWF0Y2ggU1lTNSBiZWhhdmlvdXIgKi8KKwkJcmV0dXJuIDA7CisKKwlpZiAoaXNfc3luY19raW9jYihpb2NiKSkKKwkJeCA9ICZzaW9jYjsKKwllbHNlIHsKKwkJeCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrX2lvY2IpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF4KQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWlvY2ItPmtpX2R0b3IgPSBzb2NrX2Fpb19kdG9yOworCX0KKwlpb2NiLT5wcml2YXRlID0geDsKKwl4LT5raW9jYiA9IGlvY2I7CisJc29jayA9IFNPQ0tFVF9JKGlvY2ItPmtpX2ZpbHAtPmZfZGVudHJ5LT5kX2lub2RlKTsgCisKKwl4LT5hc3luY19tc2cubXNnX25hbWUgPSBOVUxMOworCXgtPmFzeW5jX21zZy5tc2dfbmFtZWxlbiA9IDA7CisJeC0+YXN5bmNfbXNnLm1zZ19pb3YgPSAmeC0+YXN5bmNfaW92OworCXgtPmFzeW5jX21zZy5tc2dfaW92bGVuID0gMTsKKwl4LT5hc3luY19tc2cubXNnX2NvbnRyb2wgPSBOVUxMOworCXgtPmFzeW5jX21zZy5tc2dfY29udHJvbGxlbiA9IDA7CisJeC0+YXN5bmNfbXNnLm1zZ19mbGFncyA9ICEoaW9jYi0+a2lfZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spID8gMCA6IE1TR19ET05UV0FJVDsKKwlpZiAoc29jay0+dHlwZSA9PSBTT0NLX1NFUVBBQ0tFVCkKKwkJeC0+YXN5bmNfbXNnLm1zZ19mbGFncyB8PSBNU0dfRU9SOworCXgtPmFzeW5jX2lvdi5pb3ZfYmFzZSA9ICh2b2lkIF9fdXNlciAqKXVidWY7CisJeC0+YXN5bmNfaW92Lmlvdl9sZW4gPSBzaXplOworCQorCXJldHVybiBfX3NvY2tfc2VuZG1zZyhpb2NiLCBzb2NrLCAmeC0+YXN5bmNfbXNnLCBzaXplKTsKK30KKworc3NpemVfdCBzb2NrX3NlbmRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJICAgICAgaW50IG9mZnNldCwgc2l6ZV90IHNpemUsIGxvZmZfdCAqcHBvcywgaW50IG1vcmUpCit7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwlpbnQgZmxhZ3M7CisKKwlzb2NrID0gU09DS0VUX0koZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCisJZmxhZ3MgPSAhKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSA/IDAgOiBNU0dfRE9OVFdBSVQ7CisJaWYgKG1vcmUpCisJCWZsYWdzIHw9IE1TR19NT1JFOworCisJcmV0dXJuIHNvY2stPm9wcy0+c2VuZHBhZ2Uoc29jaywgcGFnZSwgb2Zmc2V0LCBzaXplLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgc29ja19yZWFkdl93cml0ZXYoaW50IHR5cGUsIHN0cnVjdCBpbm9kZSAqIGlub2RlLAorCQkJICAgICBzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqIGlvdiwKKwkJCSAgICAgbG9uZyBjb3VudCwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IHNvY2tldCAqc29jazsKKworCXNvY2sgPSBTT0NLRVRfSShpbm9kZSk7CisKKwltc2cubXNnX25hbWUgPSBOVUxMOworCW1zZy5tc2dfbmFtZWxlbiA9IDA7CisJbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy5tc2dfaW92ID0gKHN0cnVjdCBpb3ZlYyAqKSBpb3Y7CisJbXNnLm1zZ19pb3ZsZW4gPSBjb3VudDsKKwltc2cubXNnX2ZsYWdzID0gKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSA/IE1TR19ET05UV0FJVCA6IDA7CisKKwkvKiByZWFkKCkgZG9lcyBhIFZFUklGWV9XUklURSAqLworCWlmICh0eXBlID09IFZFUklGWV9XUklURSkKKwkJcmV0dXJuIHNvY2tfcmVjdm1zZyhzb2NrLCAmbXNnLCBzaXplLCBtc2cubXNnX2ZsYWdzKTsKKworCWlmIChzb2NrLT50eXBlID09IFNPQ0tfU0VRUEFDS0VUKQorCQltc2cubXNnX2ZsYWdzIHw9IE1TR19FT1I7CisKKwlyZXR1cm4gc29ja19zZW5kbXNnKHNvY2ssICZtc2csIHNpemUpOworfQorCitzdGF0aWMgc3NpemVfdCBzb2NrX3JlYWR2KHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKnZlY3RvciwKKwkJCSAgdW5zaWduZWQgbG9uZyBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXNpemVfdCB0b3RfbGVuID0gMDsKKwlpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMCA7IGkgPCBjb3VudCA7IGkrKykKKyAgICAgICAgICAgICAgICB0b3RfbGVuICs9IHZlY3RvcltpXS5pb3ZfbGVuOworCXJldHVybiBzb2NrX3JlYWR2X3dyaXRldihWRVJJRllfV1JJVEUsIGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLAorCQkJCSBmaWxlLCB2ZWN0b3IsIGNvdW50LCB0b3RfbGVuKTsKK30KKwkKK3N0YXRpYyBzc2l6ZV90IHNvY2tfd3JpdGV2KHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKnZlY3RvciwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzaXplX3QgdG90X2xlbiA9IDA7CisJaW50IGk7CisgICAgICAgIGZvciAoaSA9IDAgOyBpIDwgY291bnQgOyBpKyspCisgICAgICAgICAgICAgICAgdG90X2xlbiArPSB2ZWN0b3JbaV0uaW92X2xlbjsKKwlyZXR1cm4gc29ja19yZWFkdl93cml0ZXYoVkVSSUZZX1JFQUQsIGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLAorCQkJCSBmaWxlLCB2ZWN0b3IsIGNvdW50LCB0b3RfbGVuKTsKK30KKworCisvKgorICogQXRvbWljIHNldHRpbmcgb2YgaW9jdGwgaG9va3MgdG8gYXZvaWQgcmFjZQorICogd2l0aCBtb2R1bGUgdW5sb2FkLgorICovCisKK3N0YXRpYyBERUNMQVJFX01VVEVYKGJyX2lvY3RsX211dGV4KTsKK3N0YXRpYyBpbnQgKCpicl9pb2N0bF9ob29rKSh1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKSA9IE5VTEw7CisKK3ZvaWQgYnJpb2N0bF9zZXQoaW50ICgqaG9vaykodW5zaWduZWQgaW50LCB2b2lkIF9fdXNlciAqKSkKK3sKKwlkb3duKCZicl9pb2N0bF9tdXRleCk7CisJYnJfaW9jdGxfaG9vayA9IGhvb2s7CisJdXAoJmJyX2lvY3RsX211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0woYnJpb2N0bF9zZXQpOworCitzdGF0aWMgREVDTEFSRV9NVVRFWCh2bGFuX2lvY3RsX211dGV4KTsKK3N0YXRpYyBpbnQgKCp2bGFuX2lvY3RsX2hvb2spKHZvaWQgX191c2VyICphcmcpOworCit2b2lkIHZsYW5faW9jdGxfc2V0KGludCAoKmhvb2spKHZvaWQgX191c2VyICopKQoreworCWRvd24oJnZsYW5faW9jdGxfbXV0ZXgpOworCXZsYW5faW9jdGxfaG9vayA9IGhvb2s7CisJdXAoJnZsYW5faW9jdGxfbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTCh2bGFuX2lvY3RsX3NldCk7CisKK3N0YXRpYyBERUNMQVJFX01VVEVYKGRsY2lfaW9jdGxfbXV0ZXgpOworc3RhdGljIGludCAoKmRsY2lfaW9jdGxfaG9vaykodW5zaWduZWQgaW50LCB2b2lkIF9fdXNlciAqKTsKKwordm9pZCBkbGNpX2lvY3RsX3NldChpbnQgKCpob29rKSh1bnNpZ25lZCBpbnQsIHZvaWQgX191c2VyICopKQoreworCWRvd24oJmRsY2lfaW9jdGxfbXV0ZXgpOworCWRsY2lfaW9jdGxfaG9vayA9IGhvb2s7CisJdXAoJmRsY2lfaW9jdGxfbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTChkbGNpX2lvY3RsX3NldCk7CisKKy8qCisgKglXaXRoIGFuIGlvY3RsLCBhcmcgbWF5IHdlbGwgYmUgYSB1c2VyIG1vZGUgcG9pbnRlciwgYnV0IHdlIGRvbid0IGtub3cKKyAqCXdoYXQgdG8gZG8gd2l0aCBpdCAtIHRoYXQncyB1cCB0byB0aGUgcHJvdG9jb2wgc3RpbGwuCisgKi8KKworc3RhdGljIGxvbmcgc29ja19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBwaWQsIGVycjsKKworCXNvY2sgPSBTT0NLRVRfSShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJaWYgKGNtZCA+PSBTSU9DREVWUFJJVkFURSAmJiBjbWQgPD0gKFNJT0NERVZQUklWQVRFICsgMTUpKSB7CisJCWVyciA9IGRldl9pb2N0bChjbWQsIGFyZ3ApOworCX0gZWxzZQorI2lmZGVmIFdJUkVMRVNTX0VYVAorCWlmIChjbWQgPj0gU0lPQ0lXRklSU1QgJiYgY21kIDw9IFNJT0NJV0xBU1QpIHsKKwkJZXJyID0gZGV2X2lvY3RsKGNtZCwgYXJncCk7CisJfSBlbHNlCisjZW5kaWYJLyogV0lSRUxFU1NfRVhUICovCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBGSU9TRVRPV046CisJCWNhc2UgU0lPQ1NQR1JQOgorCQkJZXJyID0gLUVGQVVMVDsKKwkJCWlmIChnZXRfdXNlcihwaWQsIChpbnQgX191c2VyICopYXJncCkpCisJCQkJYnJlYWs7CisJCQllcnIgPSBmX3NldG93bihzb2NrLT5maWxlLCBwaWQsIDEpOworCQkJYnJlYWs7CisJCWNhc2UgRklPR0VUT1dOOgorCQljYXNlIFNJT0NHUEdSUDoKKwkJCWVyciA9IHB1dF91c2VyKHNvY2stPmZpbGUtPmZfb3duZXIucGlkLCAoaW50IF9fdXNlciAqKWFyZ3ApOworCQkJYnJlYWs7CisJCWNhc2UgU0lPQ0dJRkJSOgorCQljYXNlIFNJT0NTSUZCUjoKKwkJY2FzZSBTSU9DQlJBRERCUjoKKwkJY2FzZSBTSU9DQlJERUxCUjoKKwkJCWVyciA9IC1FTk9QS0c7CisJCQlpZiAoIWJyX2lvY3RsX2hvb2spCisJCQkJcmVxdWVzdF9tb2R1bGUoImJyaWRnZSIpOworCisJCQlkb3duKCZicl9pb2N0bF9tdXRleCk7CisJCQlpZiAoYnJfaW9jdGxfaG9vaykgCisJCQkJZXJyID0gYnJfaW9jdGxfaG9vayhjbWQsIGFyZ3ApOworCQkJdXAoJmJyX2lvY3RsX211dGV4KTsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NHSUZWTEFOOgorCQljYXNlIFNJT0NTSUZWTEFOOgorCQkJZXJyID0gLUVOT1BLRzsKKwkJCWlmICghdmxhbl9pb2N0bF9ob29rKQorCQkJCXJlcXVlc3RfbW9kdWxlKCI4MDIxcSIpOworCisJCQlkb3duKCZ2bGFuX2lvY3RsX211dGV4KTsKKwkJCWlmICh2bGFuX2lvY3RsX2hvb2spCisJCQkJZXJyID0gdmxhbl9pb2N0bF9ob29rKGFyZ3ApOworCQkJdXAoJnZsYW5faW9jdGxfbXV0ZXgpOworCQkJYnJlYWs7CisJCWNhc2UgU0lPQ0dJRkRJVkVSVDoKKwkJY2FzZSBTSU9DU0lGRElWRVJUOgorCQkvKiBDb252ZXJ0IHRoaXMgdG8gY2FsbCB0aHJvdWdoIGEgaG9vayAqLworCQkJZXJyID0gZGl2ZXJ0X2lvY3RsKGNtZCwgYXJncCk7CisJCQlicmVhazsKKwkJY2FzZSBTSU9DQURERExDSToKKwkJY2FzZSBTSU9DREVMRExDSToKKwkJCWVyciA9IC1FTk9QS0c7CisJCQlpZiAoIWRsY2lfaW9jdGxfaG9vaykKKwkJCQlyZXF1ZXN0X21vZHVsZSgiZGxjaSIpOworCisJCQlpZiAoZGxjaV9pb2N0bF9ob29rKSB7CisJCQkJZG93bigmZGxjaV9pb2N0bF9tdXRleCk7CisJCQkJZXJyID0gZGxjaV9pb2N0bF9ob29rKGNtZCwgYXJncCk7CisJCQkJdXAoJmRsY2lfaW9jdGxfbXV0ZXgpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnIgPSBzb2NrLT5vcHMtPmlvY3RsKHNvY2ssIGNtZCwgYXJnKTsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gZXJyOworfQorCitpbnQgc29ja19jcmVhdGVfbGl0ZShpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IHByb3RvY29sLCBzdHJ1Y3Qgc29ja2V0ICoqcmVzKQoreworCWludCBlcnI7CisJc3RydWN0IHNvY2tldCAqc29jayA9IE5VTEw7CisJCisJZXJyID0gc2VjdXJpdHlfc29ja2V0X2NyZWF0ZShmYW1pbHksIHR5cGUsIHByb3RvY29sLCAxKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXNvY2sgPSBzb2NrX2FsbG9jKCk7CisJaWYgKCFzb2NrKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXNlY3VyaXR5X3NvY2tldF9wb3N0X2NyZWF0ZShzb2NrLCBmYW1pbHksIHR5cGUsIHByb3RvY29sLCAxKTsKKwlzb2NrLT50eXBlID0gdHlwZTsKK291dDoKKwkqcmVzID0gc29jazsKKwlyZXR1cm4gZXJyOworfQorCisvKiBObyBrZXJuZWwgbG9jayBoZWxkIC0gcGVyZmVjdCAqLworc3RhdGljIHVuc2lnbmVkIGludCBzb2NrX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKiB3YWl0KQoreworCXN0cnVjdCBzb2NrZXQgKnNvY2s7CisKKwkvKgorCSAqCVdlIGNhbid0IHJldHVybiBlcnJvcnMgdG8gcG9sbCwgc28gaXQncyBlaXRoZXIgeWVzIG9yIG5vLiAKKwkgKi8KKwlzb2NrID0gU09DS0VUX0koZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXJldHVybiBzb2NrLT5vcHMtPnBvbGwoZmlsZSwgc29jaywgd2FpdCk7Cit9CisKK3N0YXRpYyBpbnQgc29ja19tbWFwKHN0cnVjdCBmaWxlICogZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hKQoreworCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBTT0NLRVRfSShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisKKwlyZXR1cm4gc29jay0+b3BzLT5tbWFwKGZpbGUsIHNvY2ssIHZtYSk7Cit9CisKK2ludCBzb2NrX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCS8qCisJICoJSXQgd2FzIHBvc3NpYmxlIHRoZSBpbm9kZSBpcyBOVUxMIHdlIHdlcmUgCisJICoJY2xvc2luZyBhbiB1bmZpbmlzaGVkIHNvY2tldC4gCisJICovCisKKwlpZiAoIWlub2RlKQorCXsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInNvY2tfY2xvc2U6IE5VTEwgaW5vZGVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJc29ja19mYXN5bmMoLTEsIGZpbHAsIDApOworCXNvY2tfcmVsZWFzZShTT0NLRVRfSShpbm9kZSkpOworCXJldHVybiAwOworfQorCisvKgorICoJVXBkYXRlIHRoZSBzb2NrZXQgYXN5bmMgbGlzdAorICoKKyAqCUZhc3luY19saXN0IGxvY2tpbmcgc3RyYXRlZ3kuCisgKgorICoJMS4gZmFzeW5jX2xpc3QgaXMgbW9kaWZpZWQgb25seSB1bmRlciBwcm9jZXNzIGNvbnRleHQgc29ja2V0IGxvY2sKKyAqCSAgIGkuZS4gdW5kZXIgc2VtYXBob3JlLgorICoJMi4gZmFzeW5jX2xpc3QgaXMgdXNlZCB1bmRlciByZWFkX2xvY2soJnNrLT5za19jYWxsYmFja19sb2NrKQorICoJICAgb3IgdW5kZXIgc29ja2V0IGxvY2suCisgKgkzLiBmYXN5bmNfbGlzdCBjYW4gYmUgdXNlZCBmcm9tIHNvZnRpcnEgY29udGV4dCwgc28gdGhhdAorICoJICAgbW9kaWZpY2F0aW9uIHVuZGVyIHNvY2tldCBsb2NrIGhhdmUgdG8gYmUgZW5oYW5jZWQgd2l0aAorICoJICAgd3JpdGVfbG9ja19iaCgmc2stPnNrX2NhbGxiYWNrX2xvY2spLgorICoJCQkJCQkJLS1BTksgKDk5MDcxMCkKKyAqLworCitzdGF0aWMgaW50IHNvY2tfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIGludCBvbikKK3sKKwlzdHJ1Y3QgZmFzeW5jX3N0cnVjdCAqZmEsICpmbmE9TlVMTCwgKipwcmV2OworCXN0cnVjdCBzb2NrZXQgKnNvY2s7CisJc3RydWN0IHNvY2sgKnNrOworCisJaWYgKG9uKQorCXsKKwkJZm5hPShzdHJ1Y3QgZmFzeW5jX3N0cnVjdCAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmYXN5bmNfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CisJCWlmKGZuYT09TlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNvY2sgPSBTT0NLRVRfSShmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisKKwlpZiAoKHNrPXNvY2stPnNrKSA9PSBOVUxMKSB7CisJCWtmcmVlKGZuYSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxvY2tfc29jayhzayk7CisKKwlwcmV2PSYoc29jay0+ZmFzeW5jX2xpc3QpOworCisJZm9yIChmYT0qcHJldjsgZmEhPU5VTEw7IHByZXY9JmZhLT5mYV9uZXh0LGZhPSpwcmV2KQorCQlpZiAoZmEtPmZhX2ZpbGU9PWZpbHApCisJCQlicmVhazsKKworCWlmKG9uKQorCXsKKwkJaWYoZmEhPU5VTEwpCisJCXsKKwkJCXdyaXRlX2xvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKKwkJCWZhLT5mYV9mZD1mZDsKKwkJCXdyaXRlX3VubG9ja19iaCgmc2stPnNrX2NhbGxiYWNrX2xvY2spOworCisJCQlrZnJlZShmbmEpOworCQkJZ290byBvdXQ7CisJCX0KKwkJZm5hLT5mYV9maWxlPWZpbHA7CisJCWZuYS0+ZmFfZmQ9ZmQ7CisJCWZuYS0+bWFnaWM9RkFTWU5DX01BR0lDOworCQlmbmEtPmZhX25leHQ9c29jay0+ZmFzeW5jX2xpc3Q7CisJCXdyaXRlX2xvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKKwkJc29jay0+ZmFzeW5jX2xpc3Q9Zm5hOworCQl3cml0ZV91bmxvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKKwl9CisJZWxzZQorCXsKKwkJaWYgKGZhIT1OVUxMKQorCQl7CisJCQl3cml0ZV9sb2NrX2JoKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CisJCQkqcHJldj1mYS0+ZmFfbmV4dDsKKwkJCXdyaXRlX3VubG9ja19iaCgmc2stPnNrX2NhbGxiYWNrX2xvY2spOworCQkJa2ZyZWUoZmEpOworCQl9CisJfQorCitvdXQ6CisJcmVsZWFzZV9zb2NrKHNvY2stPnNrKTsKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIG9ubHkgdW5kZXIgc29ja2V0IGxvY2sgb3IgY2FsbGJhY2tfbG9jayAqLworCitpbnQgc29ja193YWtlX2FzeW5jKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBob3csIGludCBiYW5kKQoreworCWlmICghc29jayB8fCAhc29jay0+ZmFzeW5jX2xpc3QpCisJCXJldHVybiAtMTsKKwlzd2l0Y2ggKGhvdykKKwl7CisJY2FzZSAxOgorCQkKKwkJaWYgKHRlc3RfYml0KFNPQ0tfQVNZTkNfV0FJVERBVEEsICZzb2NrLT5mbGFncykpCisJCQlicmVhazsKKwkJZ290byBjYWxsX2tpbGw7CisJY2FzZSAyOgorCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChTT0NLX0FTWU5DX05PU1BBQ0UsICZzb2NrLT5mbGFncykpCisJCQlicmVhazsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSAwOgorCWNhbGxfa2lsbDoKKwkJX19raWxsX2Zhc3luYyhzb2NrLT5mYXN5bmNfbGlzdCwgU0lHSU8sIGJhbmQpOworCQlicmVhazsKKwljYXNlIDM6CisJCV9fa2lsbF9mYXN5bmMoc29jay0+ZmFzeW5jX2xpc3QsIFNJR1VSRywgYmFuZCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fc29ja19jcmVhdGUoaW50IGZhbWlseSwgaW50IHR5cGUsIGludCBwcm90b2NvbCwgc3RydWN0IHNvY2tldCAqKnJlcywgaW50IGtlcm4pCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCisJLyoKKwkgKglDaGVjayBwcm90b2NvbCBpcyBpbiByYW5nZQorCSAqLworCWlmIChmYW1pbHkgPCAwIHx8IGZhbWlseSA+PSBOUFJPVE8pCisJCXJldHVybiAtRUFGTk9TVVBQT1JUOworCWlmICh0eXBlIDwgMCB8fCB0eXBlID49IFNPQ0tfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIENvbXBhdGliaWxpdHkuCisKKwkgICBUaGlzIHVnbHltb3JvbiBpcyBtb3ZlZCBmcm9tIElORVQgbGF5ZXIgdG8gaGVyZSB0byBhdm9pZAorCSAgIGRlYWRsb2NrIGluIG1vZHVsZSBsb2FkLgorCSAqLworCWlmIChmYW1pbHkgPT0gUEZfSU5FVCAmJiB0eXBlID09IFNPQ0tfUEFDS0VUKSB7CisJCXN0YXRpYyBpbnQgd2FybmVkOyAKKwkJaWYgKCF3YXJuZWQpIHsKKwkJCXdhcm5lZCA9IDE7CisJCQlwcmludGsoS0VSTl9JTkZPICIlcyB1c2VzIG9ic29sZXRlIChQRl9JTkVULFNPQ0tfUEFDS0VUKVxuIiwgY3VycmVudC0+Y29tbSk7CisJCX0KKwkJZmFtaWx5ID0gUEZfUEFDS0VUOworCX0KKworCWVyciA9IHNlY3VyaXR5X3NvY2tldF9jcmVhdGUoZmFtaWx5LCB0eXBlLCBwcm90b2NvbCwga2Vybik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwkJCisjaWYgZGVmaW5lZChDT05GSUdfS01PRCkKKwkvKiBBdHRlbXB0IHRvIGxvYWQgYSBwcm90b2NvbCBtb2R1bGUgaWYgdGhlIGZpbmQgZmFpbGVkLiAKKwkgKiAKKwkgKiAxMi8wOS8xOTk2IE1hcmNpbjogQnV0ISB0aGlzIG1ha2VzIFJFQUxMWSBvbmx5IHNlbnNlLCBpZiB0aGUgdXNlciAKKwkgKiByZXF1ZXN0ZWQgcmVhbCwgZnVsbC1mZWF0dXJlZCBuZXR3b3JraW5nIHN1cHBvcnQgdXBvbiBjb25maWd1cmF0aW9uLgorCSAqIE90aGVyd2lzZSBtb2R1bGUgc3VwcG9ydCB3aWxsIGJyZWFrIQorCSAqLworCWlmIChuZXRfZmFtaWxpZXNbZmFtaWx5XT09TlVMTCkKKwl7CisJCXJlcXVlc3RfbW9kdWxlKCJuZXQtcGYtJWQiLGZhbWlseSk7CisJfQorI2VuZGlmCisKKwluZXRfZmFtaWx5X3JlYWRfbG9jaygpOworCWlmIChuZXRfZmFtaWxpZXNbZmFtaWx5XSA9PSBOVUxMKSB7CisJCWVyciA9IC1FQUZOT1NVUFBPUlQ7CisJCWdvdG8gb3V0OworCX0KKworLyoKKyAqCUFsbG9jYXRlIHRoZSBzb2NrZXQgYW5kIGFsbG93IHRoZSBmYW1pbHkgdG8gc2V0IHRoaW5ncyB1cC4gaWYKKyAqCXRoZSBwcm90b2NvbCBpcyAwLCB0aGUgZmFtaWx5IGlzIGluc3RydWN0ZWQgdG8gc2VsZWN0IGFuIGFwcHJvcHJpYXRlCisgKglkZWZhdWx0LgorICovCisKKwlpZiAoIShzb2NrID0gc29ja19hbGxvYygpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzb2NrZXQ6IG5vIG1vcmUgc29ja2V0c1xuIik7CisJCWVyciA9IC1FTkZJTEU7CQkvKiBOb3QgZXhhY3RseSBhIG1hdGNoLCBidXQgaXRzIHRoZQorCQkJCQkgICBjbG9zZXN0IHBvc2l4IHRoaW5nICovCisJCWdvdG8gb3V0OworCX0KKworCXNvY2stPnR5cGUgID0gdHlwZTsKKworCS8qCisJICogV2Ugd2lsbCBjYWxsIHRoZSAtPmNyZWF0ZSBmdW5jdGlvbiwgdGhhdCBwb3NzaWJseSBpcyBpbiBhIGxvYWRhYmxlCisJICogbW9kdWxlLCBzbyB3ZSBoYXZlIHRvIGJ1bXAgdGhhdCBsb2FkYWJsZSBtb2R1bGUgcmVmY250IGZpcnN0LgorCSAqLworCWVyciA9IC1FQUZOT1NVUFBPUlQ7CisJaWYgKCF0cnlfbW9kdWxlX2dldChuZXRfZmFtaWxpZXNbZmFtaWx5XS0+b3duZXIpKQorCQlnb3RvIG91dF9yZWxlYXNlOworCisJaWYgKChlcnIgPSBuZXRfZmFtaWxpZXNbZmFtaWx5XS0+Y3JlYXRlKHNvY2ssIHByb3RvY29sKSkgPCAwKQorCQlnb3RvIG91dF9tb2R1bGVfcHV0OworCS8qCisJICogTm93IHRvIGJ1bXAgdGhlIHJlZmNudCBvZiB0aGUgW2xvYWRhYmxlXSBtb2R1bGUgdGhhdCBvd25zIHRoaXMKKwkgKiBzb2NrZXQgYXQgc29ja19yZWxlYXNlIHRpbWUgd2UgZGVjcmVtZW50IGl0cyByZWZjbnQuCisJICovCisJaWYgKCF0cnlfbW9kdWxlX2dldChzb2NrLT5vcHMtPm93bmVyKSkgeworCQlzb2NrLT5vcHMgPSBOVUxMOworCQlnb3RvIG91dF9tb2R1bGVfcHV0OworCX0KKwkvKgorCSAqIE5vdyB0aGF0IHdlJ3JlIGRvbmUgd2l0aCB0aGUgLT5jcmVhdGUgZnVuY3Rpb24sIHRoZSBbbG9hZGFibGVdCisJICogbW9kdWxlIGNhbiBoYXZlIGl0cyByZWZjbnQgZGVjcmVtZW50ZWQKKwkgKi8KKwltb2R1bGVfcHV0KG5ldF9mYW1pbGllc1tmYW1pbHldLT5vd25lcik7CisJKnJlcyA9IHNvY2s7CisJc2VjdXJpdHlfc29ja2V0X3Bvc3RfY3JlYXRlKHNvY2ssIGZhbWlseSwgdHlwZSwgcHJvdG9jb2wsIGtlcm4pOworCitvdXQ6CisJbmV0X2ZhbWlseV9yZWFkX3VubG9jaygpOworCXJldHVybiBlcnI7CitvdXRfbW9kdWxlX3B1dDoKKwltb2R1bGVfcHV0KG5ldF9mYW1pbGllc1tmYW1pbHldLT5vd25lcik7CitvdXRfcmVsZWFzZToKKwlzb2NrX3JlbGVhc2Uoc29jayk7CisJZ290byBvdXQ7Cit9CisKK2ludCBzb2NrX2NyZWF0ZShpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IHByb3RvY29sLCBzdHJ1Y3Qgc29ja2V0ICoqcmVzKQoreworCXJldHVybiBfX3NvY2tfY3JlYXRlKGZhbWlseSwgdHlwZSwgcHJvdG9jb2wsIHJlcywgMCk7Cit9CisKK2ludCBzb2NrX2NyZWF0ZV9rZXJuKGludCBmYW1pbHksIGludCB0eXBlLCBpbnQgcHJvdG9jb2wsIHN0cnVjdCBzb2NrZXQgKipyZXMpCit7CisJcmV0dXJuIF9fc29ja19jcmVhdGUoZmFtaWx5LCB0eXBlLCBwcm90b2NvbCwgcmVzLCAxKTsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19zb2NrZXQoaW50IGZhbWlseSwgaW50IHR5cGUsIGludCBwcm90b2NvbCkKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBzb2NrZXQgKnNvY2s7CisKKwlyZXR2YWwgPSBzb2NrX2NyZWF0ZShmYW1pbHksIHR5cGUsIHByb3RvY29sLCAmc29jayk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0dmFsID0gc29ja19tYXBfZmQoc29jayk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gb3V0X3JlbGVhc2U7CisKK291dDoKKwkvKiBJdCBtYXkgYmUgYWxyZWFkeSBhbm90aGVyIGRlc2NyaXB0b3IgOCkgTm90IGtlcm5lbCBwcm9ibGVtLiAqLworCXJldHVybiByZXR2YWw7CisKK291dF9yZWxlYXNlOgorCXNvY2tfcmVsZWFzZShzb2NrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICoJQ3JlYXRlIGEgcGFpciBvZiBjb25uZWN0ZWQgc29ja2V0cy4KKyAqLworCithc21saW5rYWdlIGxvbmcgc3lzX3NvY2tldHBhaXIoaW50IGZhbWlseSwgaW50IHR5cGUsIGludCBwcm90b2NvbCwgaW50IF9fdXNlciAqdXNvY2t2ZWMpCit7CisJc3RydWN0IHNvY2tldCAqc29jazEsICpzb2NrMjsKKwlpbnQgZmQxLCBmZDIsIGVycjsKKworCS8qCisJICogT2J0YWluIHRoZSBmaXJzdCBzb2NrZXQgYW5kIGNoZWNrIGlmIHRoZSB1bmRlcmx5aW5nIHByb3RvY29sCisJICogc3VwcG9ydHMgdGhlIHNvY2tldHBhaXIgY2FsbC4KKwkgKi8KKworCWVyciA9IHNvY2tfY3JlYXRlKGZhbWlseSwgdHlwZSwgcHJvdG9jb2wsICZzb2NrMSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJZXJyID0gc29ja19jcmVhdGUoZmFtaWx5LCB0eXBlLCBwcm90b2NvbCwgJnNvY2syKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXRfcmVsZWFzZV8xOworCisJZXJyID0gc29jazEtPm9wcy0+c29ja2V0cGFpcihzb2NrMSwgc29jazIpOworCWlmIChlcnIgPCAwKSAKKwkJZ290byBvdXRfcmVsZWFzZV9ib3RoOworCisJZmQxID0gZmQyID0gLTE7CisKKwllcnIgPSBzb2NrX21hcF9mZChzb2NrMSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X3JlbGVhc2VfYm90aDsKKwlmZDEgPSBlcnI7CisKKwllcnIgPSBzb2NrX21hcF9mZChzb2NrMik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X2Nsb3NlXzE7CisJZmQyID0gZXJyOworCisJLyogZmQxIGFuZCBmZDIgbWF5IGJlIGFscmVhZHkgYW5vdGhlciBkZXNjcmlwdG9ycy4KKwkgKiBOb3Qga2VybmVsIHByb2JsZW0uCisJICovCisKKwllcnIgPSBwdXRfdXNlcihmZDEsICZ1c29ja3ZlY1swXSk7IAorCWlmICghZXJyKQorCQllcnIgPSBwdXRfdXNlcihmZDIsICZ1c29ja3ZlY1sxXSk7CisJaWYgKCFlcnIpCisJCXJldHVybiAwOworCisJc3lzX2Nsb3NlKGZkMik7CisJc3lzX2Nsb3NlKGZkMSk7CisJcmV0dXJuIGVycjsKKworb3V0X2Nsb3NlXzE6CisgICAgICAgIHNvY2tfcmVsZWFzZShzb2NrMik7CisJc3lzX2Nsb3NlKGZkMSk7CisJcmV0dXJuIGVycjsKKworb3V0X3JlbGVhc2VfYm90aDoKKyAgICAgICAgc29ja19yZWxlYXNlKHNvY2syKTsKK291dF9yZWxlYXNlXzE6CisgICAgICAgIHNvY2tfcmVsZWFzZShzb2NrMSk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworCisvKgorICoJQmluZCBhIG5hbWUgdG8gYSBzb2NrZXQuIE5vdGhpbmcgbXVjaCB0byBkbyBoZXJlIHNpbmNlIGl0J3MKKyAqCXRoZSBwcm90b2NvbCdzIHJlc3BvbnNpYmlsaXR5IHRvIGhhbmRsZSB0aGUgbG9jYWwgYWRkcmVzcy4KKyAqCisgKglXZSBtb3ZlIHRoZSBzb2NrZXQgYWRkcmVzcyB0byBrZXJuZWwgc3BhY2UgYmVmb3JlIHdlIGNhbGwKKyAqCXRoZSBwcm90b2NvbCBsYXllciAoaGF2aW5nIGFsc28gY2hlY2tlZCB0aGUgYWRkcmVzcyBpcyBvaykuCisgKi8KKworYXNtbGlua2FnZSBsb25nIHN5c19iaW5kKGludCBmZCwgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqdW15YWRkciwgaW50IGFkZHJsZW4pCit7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwljaGFyIGFkZHJlc3NbTUFYX1NPQ0tfQUREUl07CisJaW50IGVycjsKKworCWlmKChzb2NrID0gc29ja2ZkX2xvb2t1cChmZCwmZXJyKSkhPU5VTEwpCisJeworCQlpZigoZXJyPW1vdmVfYWRkcl90b19rZXJuZWwodW15YWRkcixhZGRybGVuLGFkZHJlc3MpKT49MCkgeworCQkJZXJyID0gc2VjdXJpdHlfc29ja2V0X2JpbmQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKWFkZHJlc3MsIGFkZHJsZW4pOworCQkJaWYgKGVycikgeworCQkJCXNvY2tmZF9wdXQoc29jayk7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJCWVyciA9IHNvY2stPm9wcy0+YmluZChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopYWRkcmVzcywgYWRkcmxlbik7CisJCX0KKwkJc29ja2ZkX3B1dChzb2NrKTsKKwl9CQkJCisJcmV0dXJuIGVycjsKK30KKworCisvKgorICoJUGVyZm9ybSBhIGxpc3Rlbi4gQmFzaWNhbGx5LCB3ZSBhbGxvdyB0aGUgcHJvdG9jb2wgdG8gZG8gYW55dGhpbmcKKyAqCW5lY2Vzc2FyeSBmb3IgYSBsaXN0ZW4sIGFuZCBpZiB0aGF0IHdvcmtzLCB3ZSBtYXJrIHRoZSBzb2NrZXQgYXMKKyAqCXJlYWR5IGZvciBsaXN0ZW5pbmcuCisgKi8KKworaW50IHN5c2N0bF9zb21heGNvbm4gPSBTT01BWENPTk47CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfbGlzdGVuKGludCBmZCwgaW50IGJhY2tsb2cpCit7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwlpbnQgZXJyOworCQorCWlmICgoc29jayA9IHNvY2tmZF9sb29rdXAoZmQsICZlcnIpKSAhPSBOVUxMKSB7CisJCWlmICgodW5zaWduZWQpIGJhY2tsb2cgPiBzeXNjdGxfc29tYXhjb25uKQorCQkJYmFja2xvZyA9IHN5c2N0bF9zb21heGNvbm47CisKKwkJZXJyID0gc2VjdXJpdHlfc29ja2V0X2xpc3Rlbihzb2NrLCBiYWNrbG9nKTsKKwkJaWYgKGVycikgeworCQkJc29ja2ZkX3B1dChzb2NrKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQllcnI9c29jay0+b3BzLT5saXN0ZW4oc29jaywgYmFja2xvZyk7CisJCXNvY2tmZF9wdXQoc29jayk7CisJfQorCXJldHVybiBlcnI7Cit9CisKKworLyoKKyAqCUZvciBhY2NlcHQsIHdlIGF0dGVtcHQgdG8gY3JlYXRlIGEgbmV3IHNvY2tldCwgc2V0IHVwIHRoZSBsaW5rCisgKgl3aXRoIHRoZSBjbGllbnQsIHdha2UgdXAgdGhlIGNsaWVudCwgdGhlbiByZXR1cm4gdGhlIG5ldworICoJY29ubmVjdGVkIGZkLiBXZSBjb2xsZWN0IHRoZSBhZGRyZXNzIG9mIHRoZSBjb25uZWN0b3IgaW4ga2VybmVsCisgKglzcGFjZSBhbmQgbW92ZSBpdCB0byB1c2VyIGF0IHRoZSB2ZXJ5IGVuZC4gVGhpcyBpcyB1bmNsZWFuIGJlY2F1c2UKKyAqCXdlIG9wZW4gdGhlIHNvY2tldCB0aGVuIHJldHVybiBhbiBlcnJvci4KKyAqCisgKgkxMDAzLjFnIGFkZHMgdGhlIGFiaWxpdHkgdG8gcmVjdm1zZygpIHRvIHF1ZXJ5IGNvbm5lY3Rpb24gcGVuZGluZworICoJc3RhdHVzIHRvIHJlY3Ztc2cuIFdlIG5lZWQgdG8gYWRkIHRoYXQgc3VwcG9ydCBpbiBhIHdheSB0aGF0cworICoJY2xlYW4gd2hlbiB3ZSByZXN0dWN0dXJlIGFjY2VwdCBhbHNvLgorICovCisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfYWNjZXB0KGludCBmZCwgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqdXBlZXJfc29ja2FkZHIsIGludCBfX3VzZXIgKnVwZWVyX2FkZHJsZW4pCit7CisJc3RydWN0IHNvY2tldCAqc29jaywgKm5ld3NvY2s7CisJaW50IGVyciwgbGVuOworCWNoYXIgYWRkcmVzc1tNQVhfU09DS19BRERSXTsKKworCXNvY2sgPSBzb2NrZmRfbG9va3VwKGZkLCAmZXJyKTsKKwlpZiAoIXNvY2spCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVORklMRTsKKwlpZiAoIShuZXdzb2NrID0gc29ja19hbGxvYygpKSkgCisJCWdvdG8gb3V0X3B1dDsKKworCW5ld3NvY2stPnR5cGUgPSBzb2NrLT50eXBlOworCW5ld3NvY2stPm9wcyA9IHNvY2stPm9wczsKKworCWVyciA9IHNlY3VyaXR5X3NvY2tldF9hY2NlcHQoc29jaywgbmV3c29jayk7CisJaWYgKGVycikKKwkJZ290byBvdXRfcmVsZWFzZTsKKworCS8qCisJICogV2UgZG9uJ3QgbmVlZCB0cnlfbW9kdWxlX2dldCBoZXJlLCBhcyB0aGUgbGlzdGVuaW5nIHNvY2tldCAoc29jaykKKwkgKiBoYXMgdGhlIHByb3RvY29sIG1vZHVsZSAoc29jay0+b3BzLT5vd25lcikgaGVsZC4KKwkgKi8KKwlfX21vZHVsZV9nZXQobmV3c29jay0+b3BzLT5vd25lcik7CisKKwllcnIgPSBzb2NrLT5vcHMtPmFjY2VwdChzb2NrLCBuZXdzb2NrLCBzb2NrLT5maWxlLT5mX2ZsYWdzKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXRfcmVsZWFzZTsKKworCWlmICh1cGVlcl9zb2NrYWRkcikgeworCQlpZihuZXdzb2NrLT5vcHMtPmdldG5hbWUobmV3c29jaywgKHN0cnVjdCBzb2NrYWRkciAqKWFkZHJlc3MsICZsZW4sIDIpPDApIHsKKwkJCWVyciA9IC1FQ09OTkFCT1JURUQ7CisJCQlnb3RvIG91dF9yZWxlYXNlOworCQl9CisJCWVyciA9IG1vdmVfYWRkcl90b191c2VyKGFkZHJlc3MsIGxlbiwgdXBlZXJfc29ja2FkZHIsIHVwZWVyX2FkZHJsZW4pOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gb3V0X3JlbGVhc2U7CisJfQorCisJLyogRmlsZSBmbGFncyBhcmUgbm90IGluaGVyaXRlZCB2aWEgYWNjZXB0KCkgdW5saWtlIGFub3RoZXIgT1Nlcy4gKi8KKworCWlmICgoZXJyID0gc29ja19tYXBfZmQobmV3c29jaykpIDwgMCkKKwkJZ290byBvdXRfcmVsZWFzZTsKKworCXNlY3VyaXR5X3NvY2tldF9wb3N0X2FjY2VwdChzb2NrLCBuZXdzb2NrKTsKKworb3V0X3B1dDoKKwlzb2NrZmRfcHV0KHNvY2spOworb3V0OgorCXJldHVybiBlcnI7CitvdXRfcmVsZWFzZToKKwlzb2NrX3JlbGVhc2UobmV3c29jayk7CisJZ290byBvdXRfcHV0OworfQorCisKKy8qCisgKglBdHRlbXB0IHRvIGNvbm5lY3QgdG8gYSBzb2NrZXQgd2l0aCB0aGUgc2VydmVyIGFkZHJlc3MuICBUaGUgYWRkcmVzcworICoJaXMgaW4gdXNlciBzcGFjZSBzbyB3ZSB2ZXJpZnkgaXQgaXMgT0sgYW5kIG1vdmUgaXQgdG8ga2VybmVsIHNwYWNlLgorICoKKyAqCUZvciAxMDAzLjFnIHdlIG5lZWQgdG8gYWRkIGNsZWFuIHN1cHBvcnQgZm9yIGEgYmluZCB0byBBRl9VTlNQRUMgdG8KKyAqCWJyZWFrIGJpbmRpbmdzCisgKgorICoJTk9URTogMTAwMy4xZyBkcmFmdCA2LjMgaXMgYnJva2VuIHdpdGggcmVzcGVjdCB0byBBWC4yNS9OZXRST00gYW5kCisgKglvdGhlciBTRVFQQUNLRVQgcHJvdG9jb2xzIHRoYXQgdGFrZSB0aW1lIHRvIGNvbm5lY3QoKSBhcyBpdCBkb2Vzbid0CisgKglpbmNsdWRlIHRoZSAtRUlOUFJPR1JFU1Mgc3RhdHVzIGZvciBzdWNoIHNvY2tldHMuCisgKi8KKworYXNtbGlua2FnZSBsb25nIHN5c19jb25uZWN0KGludCBmZCwgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqdXNlcnZhZGRyLCBpbnQgYWRkcmxlbikKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCWNoYXIgYWRkcmVzc1tNQVhfU09DS19BRERSXTsKKwlpbnQgZXJyOworCisJc29jayA9IHNvY2tmZF9sb29rdXAoZmQsICZlcnIpOworCWlmICghc29jaykKKwkJZ290byBvdXQ7CisJZXJyID0gbW92ZV9hZGRyX3RvX2tlcm5lbCh1c2VydmFkZHIsIGFkZHJsZW4sIGFkZHJlc3MpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9wdXQ7CisKKwllcnIgPSBzZWN1cml0eV9zb2NrZXRfY29ubmVjdChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopYWRkcmVzcywgYWRkcmxlbik7CisJaWYgKGVycikKKwkJZ290byBvdXRfcHV0OworCisJZXJyID0gc29jay0+b3BzLT5jb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgYWRkcmVzcywgYWRkcmxlbiwKKwkJCQkgc29jay0+ZmlsZS0+Zl9mbGFncyk7CitvdXRfcHV0OgorCXNvY2tmZF9wdXQoc29jayk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqCUdldCB0aGUgbG9jYWwgYWRkcmVzcyAoJ25hbWUnKSBvZiBhIHNvY2tldCBvYmplY3QuIE1vdmUgdGhlIG9idGFpbmVkCisgKgluYW1lIHRvIHVzZXIgc3BhY2UuCisgKi8KKworYXNtbGlua2FnZSBsb25nIHN5c19nZXRzb2NrbmFtZShpbnQgZmQsIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKnVzb2NrYWRkciwgaW50IF9fdXNlciAqdXNvY2thZGRyX2xlbikKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCWNoYXIgYWRkcmVzc1tNQVhfU09DS19BRERSXTsKKwlpbnQgbGVuLCBlcnI7CisJCisJc29jayA9IHNvY2tmZF9sb29rdXAoZmQsICZlcnIpOworCWlmICghc29jaykKKwkJZ290byBvdXQ7CisKKwllcnIgPSBzZWN1cml0eV9zb2NrZXRfZ2V0c29ja25hbWUoc29jayk7CisJaWYgKGVycikKKwkJZ290byBvdXRfcHV0OworCisJZXJyID0gc29jay0+b3BzLT5nZXRuYW1lKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyZXNzLCAmbGVuLCAwKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9wdXQ7CisJZXJyID0gbW92ZV9hZGRyX3RvX3VzZXIoYWRkcmVzcywgbGVuLCB1c29ja2FkZHIsIHVzb2NrYWRkcl9sZW4pOworCitvdXRfcHV0OgorCXNvY2tmZF9wdXQoc29jayk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqCUdldCB0aGUgcmVtb3RlIGFkZHJlc3MgKCduYW1lJykgb2YgYSBzb2NrZXQgb2JqZWN0LiBNb3ZlIHRoZSBvYnRhaW5lZAorICoJbmFtZSB0byB1c2VyIHNwYWNlLgorICovCisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfZ2V0cGVlcm5hbWUoaW50IGZkLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICp1c29ja2FkZHIsIGludCBfX3VzZXIgKnVzb2NrYWRkcl9sZW4pCit7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwljaGFyIGFkZHJlc3NbTUFYX1NPQ0tfQUREUl07CisJaW50IGxlbiwgZXJyOworCisJaWYgKChzb2NrID0gc29ja2ZkX2xvb2t1cChmZCwgJmVycikpIT1OVUxMKQorCXsKKwkJZXJyID0gc2VjdXJpdHlfc29ja2V0X2dldHBlZXJuYW1lKHNvY2spOworCQlpZiAoZXJyKSB7CisJCQlzb2NrZmRfcHV0KHNvY2spOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCWVyciA9IHNvY2stPm9wcy0+Z2V0bmFtZShzb2NrLCAoc3RydWN0IHNvY2thZGRyICopYWRkcmVzcywgJmxlbiwgMSk7CisJCWlmICghZXJyKQorCQkJZXJyPW1vdmVfYWRkcl90b191c2VyKGFkZHJlc3MsbGVuLCB1c29ja2FkZHIsIHVzb2NrYWRkcl9sZW4pOworCQlzb2NrZmRfcHV0KHNvY2spOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJU2VuZCBhIGRhdGFncmFtIHRvIGEgZ2l2ZW4gYWRkcmVzcy4gV2UgbW92ZSB0aGUgYWRkcmVzcyBpbnRvIGtlcm5lbAorICoJc3BhY2UgYW5kIGNoZWNrIHRoZSB1c2VyIHNwYWNlIGRhdGEgYXJlYSBpcyByZWFkYWJsZSBiZWZvcmUgaW52b2tpbmcKKyAqCXRoZSBwcm90b2NvbC4KKyAqLworCithc21saW5rYWdlIGxvbmcgc3lzX3NlbmR0byhpbnQgZmQsIHZvaWQgX191c2VyICogYnVmZiwgc2l6ZV90IGxlbiwgdW5zaWduZWQgZmxhZ3MsCisJCQkgICBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICphZGRyLCBpbnQgYWRkcl9sZW4pCit7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwljaGFyIGFkZHJlc3NbTUFYX1NPQ0tfQUREUl07CisJaW50IGVycjsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3QgaW92ZWMgaW92OworCQorCXNvY2sgPSBzb2NrZmRfbG9va3VwKGZkLCAmZXJyKTsKKwlpZiAoIXNvY2spCisJCWdvdG8gb3V0OworCWlvdi5pb3ZfYmFzZT1idWZmOworCWlvdi5pb3ZfbGVuPWxlbjsKKwltc2cubXNnX25hbWU9TlVMTDsKKwltc2cubXNnX2lvdj0maW92OworCW1zZy5tc2dfaW92bGVuPTE7CisJbXNnLm1zZ19jb250cm9sPU5VTEw7CisJbXNnLm1zZ19jb250cm9sbGVuPTA7CisJbXNnLm1zZ19uYW1lbGVuPTA7CisJaWYoYWRkcikKKwl7CisJCWVyciA9IG1vdmVfYWRkcl90b19rZXJuZWwoYWRkciwgYWRkcl9sZW4sIGFkZHJlc3MpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gb3V0X3B1dDsKKwkJbXNnLm1zZ19uYW1lPWFkZHJlc3M7CisJCW1zZy5tc2dfbmFtZWxlbj1hZGRyX2xlbjsKKwl9CisJaWYgKHNvY2stPmZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQlmbGFncyB8PSBNU0dfRE9OVFdBSVQ7CisJbXNnLm1zZ19mbGFncyA9IGZsYWdzOworCWVyciA9IHNvY2tfc2VuZG1zZyhzb2NrLCAmbXNnLCBsZW4pOworCitvdXRfcHV0OgkJCisJc29ja2ZkX3B1dChzb2NrKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJU2VuZCBhIGRhdGFncmFtIGRvd24gYSBzb2NrZXQuIAorICovCisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfc2VuZChpbnQgZmQsIHZvaWQgX191c2VyICogYnVmZiwgc2l6ZV90IGxlbiwgdW5zaWduZWQgZmxhZ3MpCit7CisJcmV0dXJuIHN5c19zZW5kdG8oZmQsIGJ1ZmYsIGxlbiwgZmxhZ3MsIE5VTEwsIDApOworfQorCisvKgorICoJUmVjZWl2ZSBhIGZyYW1lIGZyb20gdGhlIHNvY2tldCBhbmQgb3B0aW9uYWxseSByZWNvcmQgdGhlIGFkZHJlc3Mgb2YgdGhlIAorICoJc2VuZGVyLiBXZSB2ZXJpZnkgdGhlIGJ1ZmZlcnMgYXJlIHdyaXRhYmxlIGFuZCBpZiBuZWVkZWQgbW92ZSB0aGUKKyAqCXNlbmRlciBhZGRyZXNzIGZyb20ga2VybmVsIHRvIHVzZXIgc3BhY2UuCisgKi8KKworYXNtbGlua2FnZSBsb25nIHN5c19yZWN2ZnJvbShpbnQgZmQsIHZvaWQgX191c2VyICogdWJ1Ziwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGZsYWdzLAorCQkJICAgICBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICphZGRyLCBpbnQgX191c2VyICphZGRyX2xlbikKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCXN0cnVjdCBpb3ZlYyBpb3Y7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJY2hhciBhZGRyZXNzW01BWF9TT0NLX0FERFJdOworCWludCBlcnIsZXJyMjsKKworCXNvY2sgPSBzb2NrZmRfbG9va3VwKGZkLCAmZXJyKTsKKwlpZiAoIXNvY2spCisJCWdvdG8gb3V0OworCisJbXNnLm1zZ19jb250cm9sPU5VTEw7CisJbXNnLm1zZ19jb250cm9sbGVuPTA7CisJbXNnLm1zZ19pb3ZsZW49MTsKKwltc2cubXNnX2lvdj0maW92OworCWlvdi5pb3ZfbGVuPXNpemU7CisJaW92Lmlvdl9iYXNlPXVidWY7CisJbXNnLm1zZ19uYW1lPWFkZHJlc3M7CisJbXNnLm1zZ19uYW1lbGVuPU1BWF9TT0NLX0FERFI7CisJaWYgKHNvY2stPmZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQlmbGFncyB8PSBNU0dfRE9OVFdBSVQ7CisJZXJyPXNvY2tfcmVjdm1zZyhzb2NrLCAmbXNnLCBzaXplLCBmbGFncyk7CisKKwlpZihlcnIgPj0gMCAmJiBhZGRyICE9IE5VTEwpCisJeworCQllcnIyPW1vdmVfYWRkcl90b191c2VyKGFkZHJlc3MsIG1zZy5tc2dfbmFtZWxlbiwgYWRkciwgYWRkcl9sZW4pOworCQlpZihlcnIyPDApCisJCQllcnI9ZXJyMjsKKwl9CisJc29ja2ZkX3B1dChzb2NrKTsJCQkKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJUmVjZWl2ZSBhIGRhdGFncmFtIGZyb20gYSBzb2NrZXQuIAorICovCisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfcmVjdihpbnQgZmQsIHZvaWQgX191c2VyICogdWJ1Ziwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGZsYWdzKQoreworCXJldHVybiBzeXNfcmVjdmZyb20oZmQsIHVidWYsIHNpemUsIGZsYWdzLCBOVUxMLCBOVUxMKTsKK30KKworLyoKKyAqCVNldCBhIHNvY2tldCBvcHRpb24uIEJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgb3B0aW9uIGxlbmd0aHMgd2UgaGF2ZQorICoJdG8gcGFzcyB0aGUgdXNlciBtb2RlIHBhcmFtZXRlciBmb3IgdGhlIHByb3RvY29scyB0byBzb3J0IG91dC4KKyAqLworCithc21saW5rYWdlIGxvbmcgc3lzX3NldHNvY2tvcHQoaW50IGZkLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQoreworCWludCBlcnI7CisJc3RydWN0IHNvY2tldCAqc29jazsKKworCWlmIChvcHRsZW4gPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQorCWlmICgoc29jayA9IHNvY2tmZF9sb29rdXAoZmQsICZlcnIpKSE9TlVMTCkKKwl7CisJCWVyciA9IHNlY3VyaXR5X3NvY2tldF9zZXRzb2Nrb3B0KHNvY2ssbGV2ZWwsb3B0bmFtZSk7CisJCWlmIChlcnIpIHsKKwkJCXNvY2tmZF9wdXQoc29jayk7CisJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJaWYgKGxldmVsID09IFNPTF9TT0NLRVQpCisJCQllcnI9c29ja19zZXRzb2Nrb3B0KHNvY2ssbGV2ZWwsb3B0bmFtZSxvcHR2YWwsb3B0bGVuKTsKKwkJZWxzZQorCQkJZXJyPXNvY2stPm9wcy0+c2V0c29ja29wdChzb2NrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOworCQlzb2NrZmRfcHV0KHNvY2spOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJR2V0IGEgc29ja2V0IG9wdGlvbi4gQmVjYXVzZSB3ZSBkb24ndCBrbm93IHRoZSBvcHRpb24gbGVuZ3RocyB3ZSBoYXZlCisgKgl0byBwYXNzIGEgdXNlciBtb2RlIHBhcmFtZXRlciBmb3IgdGhlIHByb3RvY29scyB0byBzb3J0IG91dC4KKyAqLworCithc21saW5rYWdlIGxvbmcgc3lzX2dldHNvY2tvcHQoaW50IGZkLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCisJaWYgKChzb2NrID0gc29ja2ZkX2xvb2t1cChmZCwgJmVycikpIT1OVUxMKQorCXsKKwkJZXJyID0gc2VjdXJpdHlfc29ja2V0X2dldHNvY2tvcHQoc29jaywgbGV2ZWwsIAorCQkJCQkJCSAgIG9wdG5hbWUpOworCQlpZiAoZXJyKSB7CisJCQlzb2NrZmRfcHV0KHNvY2spOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCWlmIChsZXZlbCA9PSBTT0xfU09DS0VUKQorCQkJZXJyPXNvY2tfZ2V0c29ja29wdChzb2NrLGxldmVsLG9wdG5hbWUsb3B0dmFsLG9wdGxlbik7CisJCWVsc2UKKwkJCWVycj1zb2NrLT5vcHMtPmdldHNvY2tvcHQoc29jaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKKwkJc29ja2ZkX3B1dChzb2NrKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworCisvKgorICoJU2h1dGRvd24gYSBzb2NrZXQuCisgKi8KKworYXNtbGlua2FnZSBsb25nIHN5c19zaHV0ZG93bihpbnQgZmQsIGludCBob3cpCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCisJaWYgKChzb2NrID0gc29ja2ZkX2xvb2t1cChmZCwgJmVycikpIT1OVUxMKQorCXsKKwkJZXJyID0gc2VjdXJpdHlfc29ja2V0X3NodXRkb3duKHNvY2ssIGhvdyk7CisJCWlmIChlcnIpIHsKKwkJCXNvY2tmZF9wdXQoc29jayk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCQkJCisJCWVycj1zb2NrLT5vcHMtPnNodXRkb3duKHNvY2ssIGhvdyk7CisJCXNvY2tmZF9wdXQoc29jayk7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qIEEgY291cGxlIG9mIGhlbHBmdWwgbWFjcm9zIGZvciBnZXR0aW5nIHRoZSBhZGRyZXNzIG9mIHRoZSAzMi82NCBiaXQgCisgKiBmaWVsZHMgd2hpY2ggYXJlIHRoZSBzYW1lIHR5cGUgKGludCAvIHVuc2lnbmVkKSBvbiBvdXIgcGxhdGZvcm1zLgorICovCisjZGVmaW5lIENPTVBBVF9NU0cobXNnLCBtZW1iZXIpCSgoTVNHX0NNU0dfQ09NUEFUICYgZmxhZ3MpID8gJm1zZyMjX2NvbXBhdC0+bWVtYmVyIDogJm1zZy0+bWVtYmVyKQorI2RlZmluZSBDT01QQVRfTkFNRUxFTihtc2cpCUNPTVBBVF9NU0cobXNnLCBtc2dfbmFtZWxlbikKKyNkZWZpbmUgQ09NUEFUX0ZMQUdTKG1zZykJQ09NUEFUX01TRyhtc2csIG1zZ19mbGFncykKKworCisvKgorICoJQlNEIHNlbmRtc2cgaW50ZXJmYWNlCisgKi8KKworYXNtbGlua2FnZSBsb25nIHN5c19zZW5kbXNnKGludCBmZCwgc3RydWN0IG1zZ2hkciBfX3VzZXIgKm1zZywgdW5zaWduZWQgZmxhZ3MpCit7CisJc3RydWN0IGNvbXBhdF9tc2doZHIgX191c2VyICptc2dfY29tcGF0ID0gKHN0cnVjdCBjb21wYXRfbXNnaGRyIF9fdXNlciAqKW1zZzsKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCWNoYXIgYWRkcmVzc1tNQVhfU09DS19BRERSXTsKKwlzdHJ1Y3QgaW92ZWMgaW92c3RhY2tbVUlPX0ZBU1RJT1ZdLCAqaW92ID0gaW92c3RhY2s7CisJdW5zaWduZWQgY2hhciBjdGxbc2l6ZW9mKHN0cnVjdCBjbXNnaGRyKSArIDIwXTsJLyogMjAgaXMgc2l6ZSBvZiBpcHY2X3BrdGluZm8gKi8KKwl1bnNpZ25lZCBjaGFyICpjdGxfYnVmID0gY3RsOworCXN0cnVjdCBtc2doZHIgbXNnX3N5czsKKwlpbnQgZXJyLCBjdGxfbGVuLCBpb3Zfc2l6ZSwgdG90YWxfbGVuOworCQorCWVyciA9IC1FRkFVTFQ7CisJaWYgKE1TR19DTVNHX0NPTVBBVCAmIGZsYWdzKSB7CisJCWlmIChnZXRfY29tcGF0X21zZ2hkcigmbXNnX3N5cywgbXNnX2NvbXBhdCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9IGVsc2UgaWYgKGNvcHlfZnJvbV91c2VyKCZtc2dfc3lzLCBtc2csIHNpemVvZihzdHJ1Y3QgbXNnaGRyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJc29jayA9IHNvY2tmZF9sb29rdXAoZmQsICZlcnIpOworCWlmICghc29jaykgCisJCWdvdG8gb3V0OworCisJLyogZG8gbm90IG1vdmUgYmVmb3JlIG1zZ19zeXMgaXMgdmFsaWQgKi8KKwllcnIgPSAtRU1TR1NJWkU7CisJaWYgKG1zZ19zeXMubXNnX2lvdmxlbiA+IFVJT19NQVhJT1YpCisJCWdvdG8gb3V0X3B1dDsKKworCS8qIENoZWNrIHdoZXRoZXIgdG8gYWxsb2NhdGUgdGhlIGlvdmVjIGFyZWEqLworCWVyciA9IC1FTk9NRU07CisJaW92X3NpemUgPSBtc2dfc3lzLm1zZ19pb3ZsZW4gKiBzaXplb2Yoc3RydWN0IGlvdmVjKTsKKwlpZiAobXNnX3N5cy5tc2dfaW92bGVuID4gVUlPX0ZBU1RJT1YpIHsKKwkJaW92ID0gc29ja19rbWFsbG9jKHNvY2stPnNrLCBpb3Zfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaW92KQorCQkJZ290byBvdXRfcHV0OworCX0KKworCS8qIFRoaXMgd2lsbCBhbHNvIG1vdmUgdGhlIGFkZHJlc3MgZGF0YSBpbnRvIGtlcm5lbCBzcGFjZSAqLworCWlmIChNU0dfQ01TR19DT01QQVQgJiBmbGFncykgeworCQllcnIgPSB2ZXJpZnlfY29tcGF0X2lvdmVjKCZtc2dfc3lzLCBpb3YsIGFkZHJlc3MsIFZFUklGWV9SRUFEKTsKKwl9IGVsc2UKKwkJZXJyID0gdmVyaWZ5X2lvdmVjKCZtc2dfc3lzLCBpb3YsIGFkZHJlc3MsIFZFUklGWV9SRUFEKTsKKwlpZiAoZXJyIDwgMCkgCisJCWdvdG8gb3V0X2ZyZWVpb3Y7CisJdG90YWxfbGVuID0gZXJyOworCisJZXJyID0gLUVOT0JVRlM7CisKKwlpZiAobXNnX3N5cy5tc2dfY29udHJvbGxlbiA+IElOVF9NQVgpCisJCWdvdG8gb3V0X2ZyZWVpb3Y7CisJY3RsX2xlbiA9IG1zZ19zeXMubXNnX2NvbnRyb2xsZW47IAorCWlmICgoTVNHX0NNU0dfQ09NUEFUICYgZmxhZ3MpICYmIGN0bF9sZW4pIHsKKwkJZXJyID0gY21zZ2hkcl9mcm9tX3VzZXJfY29tcGF0X3RvX2tlcm4oJm1zZ19zeXMsIGN0bCwgc2l6ZW9mKGN0bCkpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfZnJlZWlvdjsKKwkJY3RsX2J1ZiA9IG1zZ19zeXMubXNnX2NvbnRyb2w7CisJfSBlbHNlIGlmIChjdGxfbGVuKSB7CisJCWlmIChjdGxfbGVuID4gc2l6ZW9mKGN0bCkpCisJCXsKKwkJCWN0bF9idWYgPSBzb2NrX2ttYWxsb2Moc29jay0+c2ssIGN0bF9sZW4sIEdGUF9LRVJORUwpOworCQkJaWYgKGN0bF9idWYgPT0gTlVMTCkgCisJCQkJZ290byBvdXRfZnJlZWlvdjsKKwkJfQorCQllcnIgPSAtRUZBVUxUOworCQkvKgorCQkgKiBDYXJlZnVsISBCZWZvcmUgdGhpcywgbXNnX3N5cy5tc2dfY29udHJvbCBjb250YWlucyBhIHVzZXIgcG9pbnRlci4KKwkJICogQWZ0ZXJ3YXJkcywgaXQgd2lsbCBiZSBhIGtlcm5lbCBwb2ludGVyLiBUaHVzIHRoZSBjb21waWxlci1hc3Npc3RlZAorCQkgKiBjaGVja2luZyBmYWxscyBkb3duIG9uIHRoaXMuCisJCSAqLworCQlpZiAoY29weV9mcm9tX3VzZXIoY3RsX2J1ZiwgKHZvaWQgX191c2VyICopIG1zZ19zeXMubXNnX2NvbnRyb2wsIGN0bF9sZW4pKQorCQkJZ290byBvdXRfZnJlZWN0bDsKKwkJbXNnX3N5cy5tc2dfY29udHJvbCA9IGN0bF9idWY7CisJfQorCW1zZ19zeXMubXNnX2ZsYWdzID0gZmxhZ3M7CisKKwlpZiAoc29jay0+ZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCW1zZ19zeXMubXNnX2ZsYWdzIHw9IE1TR19ET05UV0FJVDsKKwllcnIgPSBzb2NrX3NlbmRtc2coc29jaywgJm1zZ19zeXMsIHRvdGFsX2xlbik7CisKK291dF9mcmVlY3RsOgorCWlmIChjdGxfYnVmICE9IGN0bCkgICAgCisJCXNvY2tfa2ZyZWVfcyhzb2NrLT5zaywgY3RsX2J1ZiwgY3RsX2xlbik7CitvdXRfZnJlZWlvdjoKKwlpZiAoaW92ICE9IGlvdnN0YWNrKQorCQlzb2NrX2tmcmVlX3Moc29jay0+c2ssIGlvdiwgaW92X3NpemUpOworb3V0X3B1dDoKKwlzb2NrZmRfcHV0KHNvY2spOworb3V0OiAgICAgICAKKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJQlNEIHJlY3Ztc2cgaW50ZXJmYWNlCisgKi8KKworYXNtbGlua2FnZSBsb25nIHN5c19yZWN2bXNnKGludCBmZCwgc3RydWN0IG1zZ2hkciBfX3VzZXIgKm1zZywgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBjb21wYXRfbXNnaGRyIF9fdXNlciAqbXNnX2NvbXBhdCA9IChzdHJ1Y3QgY29tcGF0X21zZ2hkciBfX3VzZXIgKiltc2c7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwlzdHJ1Y3QgaW92ZWMgaW92c3RhY2tbVUlPX0ZBU1RJT1ZdOworCXN0cnVjdCBpb3ZlYyAqaW92PWlvdnN0YWNrOworCXN0cnVjdCBtc2doZHIgbXNnX3N5czsKKwl1bnNpZ25lZCBsb25nIGNtc2dfcHRyOworCWludCBlcnIsIGlvdl9zaXplLCB0b3RhbF9sZW4sIGxlbjsKKworCS8qIGtlcm5lbCBtb2RlIGFkZHJlc3MgKi8KKwljaGFyIGFkZHJbTUFYX1NPQ0tfQUREUl07CisKKwkvKiB1c2VyIG1vZGUgYWRkcmVzcyBwb2ludGVycyAqLworCXN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKnVhZGRyOworCWludCBfX3VzZXIgKnVhZGRyX2xlbjsKKwkKKwlpZiAoTVNHX0NNU0dfQ09NUEFUICYgZmxhZ3MpIHsKKwkJaWYgKGdldF9jb21wYXRfbXNnaGRyKCZtc2dfc3lzLCBtc2dfY29tcGF0KSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0gZWxzZQorCQlpZiAoY29weV9mcm9tX3VzZXIoJm1zZ19zeXMsbXNnLHNpemVvZihzdHJ1Y3QgbXNnaGRyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCXNvY2sgPSBzb2NrZmRfbG9va3VwKGZkLCAmZXJyKTsKKwlpZiAoIXNvY2spCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVNU0dTSVpFOworCWlmIChtc2dfc3lzLm1zZ19pb3ZsZW4gPiBVSU9fTUFYSU9WKQorCQlnb3RvIG91dF9wdXQ7CisJCisJLyogQ2hlY2sgd2hldGhlciB0byBhbGxvY2F0ZSB0aGUgaW92ZWMgYXJlYSovCisJZXJyID0gLUVOT01FTTsKKwlpb3Zfc2l6ZSA9IG1zZ19zeXMubXNnX2lvdmxlbiAqIHNpemVvZihzdHJ1Y3QgaW92ZWMpOworCWlmIChtc2dfc3lzLm1zZ19pb3ZsZW4gPiBVSU9fRkFTVElPVikgeworCQlpb3YgPSBzb2NrX2ttYWxsb2Moc29jay0+c2ssIGlvdl9zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFpb3YpCisJCQlnb3RvIG91dF9wdXQ7CisJfQorCisJLyoKKwkgKglTYXZlIHRoZSB1c2VyLW1vZGUgYWRkcmVzcyAodmVyaWZ5X2lvdmVjIHdpbGwgY2hhbmdlIHRoZQorCSAqCWtlcm5lbCBtc2doZHIgdG8gdXNlIHRoZSBrZXJuZWwgYWRkcmVzcyBzcGFjZSkKKwkgKi8KKwkgCisJdWFkZHIgPSAodm9pZCBfX3VzZXIgKikgbXNnX3N5cy5tc2dfbmFtZTsKKwl1YWRkcl9sZW4gPSBDT01QQVRfTkFNRUxFTihtc2cpOworCWlmIChNU0dfQ01TR19DT01QQVQgJiBmbGFncykgeworCQllcnIgPSB2ZXJpZnlfY29tcGF0X2lvdmVjKCZtc2dfc3lzLCBpb3YsIGFkZHIsIFZFUklGWV9XUklURSk7CisJfSBlbHNlCisJCWVyciA9IHZlcmlmeV9pb3ZlYygmbXNnX3N5cywgaW92LCBhZGRyLCBWRVJJRllfV1JJVEUpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9mcmVlaW92OworCXRvdGFsX2xlbj1lcnI7CisKKwljbXNnX3B0ciA9ICh1bnNpZ25lZCBsb25nKW1zZ19zeXMubXNnX2NvbnRyb2w7CisJbXNnX3N5cy5tc2dfZmxhZ3MgPSAwOworCWlmIChNU0dfQ01TR19DT01QQVQgJiBmbGFncykKKwkJbXNnX3N5cy5tc2dfZmxhZ3MgPSBNU0dfQ01TR19DT01QQVQ7CisJCisJaWYgKHNvY2stPmZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQlmbGFncyB8PSBNU0dfRE9OVFdBSVQ7CisJZXJyID0gc29ja19yZWN2bXNnKHNvY2ssICZtc2dfc3lzLCB0b3RhbF9sZW4sIGZsYWdzKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXRfZnJlZWlvdjsKKwlsZW4gPSBlcnI7CisKKwlpZiAodWFkZHIgIT0gTlVMTCkgeworCQllcnIgPSBtb3ZlX2FkZHJfdG9fdXNlcihhZGRyLCBtc2dfc3lzLm1zZ19uYW1lbGVuLCB1YWRkciwgdWFkZHJfbGVuKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIG91dF9mcmVlaW92OworCX0KKwllcnIgPSBfX3B1dF91c2VyKG1zZ19zeXMubXNnX2ZsYWdzLCBDT01QQVRfRkxBR1MobXNnKSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZWlvdjsKKwlpZiAoTVNHX0NNU0dfQ09NUEFUICYgZmxhZ3MpCisJCWVyciA9IF9fcHV0X3VzZXIoKHVuc2lnbmVkIGxvbmcpbXNnX3N5cy5tc2dfY29udHJvbC1jbXNnX3B0ciwgCisJCQkJICZtc2dfY29tcGF0LT5tc2dfY29udHJvbGxlbik7CisJZWxzZQorCQllcnIgPSBfX3B1dF91c2VyKCh1bnNpZ25lZCBsb25nKW1zZ19zeXMubXNnX2NvbnRyb2wtY21zZ19wdHIsIAorCQkJCSAmbXNnLT5tc2dfY29udHJvbGxlbik7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZWlvdjsKKwllcnIgPSBsZW47CisKK291dF9mcmVlaW92OgorCWlmIChpb3YgIT0gaW92c3RhY2spCisJCXNvY2tfa2ZyZWVfcyhzb2NrLT5zaywgaW92LCBpb3Zfc2l6ZSk7CitvdXRfcHV0OgorCXNvY2tmZF9wdXQoc29jayk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworI2lmZGVmIF9fQVJDSF9XQU5UX1NZU19TT0NLRVRDQUxMCisKKy8qIEFyZ3VtZW50IGxpc3Qgc2l6ZXMgZm9yIHN5c19zb2NrZXRjYWxsICovCisjZGVmaW5lIEFMKHgpICgoeCkgKiBzaXplb2YodW5zaWduZWQgbG9uZykpCitzdGF0aWMgdW5zaWduZWQgY2hhciBuYXJnc1sxOF09e0FMKDApLEFMKDMpLEFMKDMpLEFMKDMpLEFMKDIpLEFMKDMpLAorCQkJCUFMKDMpLEFMKDMpLEFMKDQpLEFMKDQpLEFMKDQpLEFMKDYpLAorCQkJCUFMKDYpLEFMKDIpLEFMKDUpLEFMKDUpLEFMKDMpLEFMKDMpfTsKKyN1bmRlZiBBTAorCisvKgorICoJU3lzdGVtIGNhbGwgdmVjdG9ycy4gCisgKgorICoJQXJndW1lbnQgY2hlY2tpbmcgY2xlYW5lZCB1cC4gU2F2ZWQgMjAlIGluIHNpemUuCisgKiAgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IG5lZWQgdG8gc2V0IHRoZSBrZXJuZWwgbG9jayBiZWNhdXNlCisgKiAgaXQgaXMgc2V0IGJ5IHRoZSBjYWxsZWVzLiAKKyAqLworCithc21saW5rYWdlIGxvbmcgc3lzX3NvY2tldGNhbGwoaW50IGNhbGwsIHVuc2lnbmVkIGxvbmcgX191c2VyICphcmdzKQoreworCXVuc2lnbmVkIGxvbmcgYVs2XTsKKwl1bnNpZ25lZCBsb25nIGEwLGExOworCWludCBlcnI7CisKKwlpZihjYWxsPDF8fGNhbGw+U1lTX1JFQ1ZNU0cpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogY29weV9mcm9tX3VzZXIgc2hvdWxkIGJlIFNNUCBzYWZlLiAqLworCWlmIChjb3B5X2Zyb21fdXNlcihhLCBhcmdzLCBuYXJnc1tjYWxsXSkpCisJCXJldHVybiAtRUZBVUxUOworCQkKKwlhMD1hWzBdOworCWExPWFbMV07CisJCisJc3dpdGNoKGNhbGwpIAorCXsKKwkJY2FzZSBTWVNfU09DS0VUOgorCQkJZXJyID0gc3lzX3NvY2tldChhMCxhMSxhWzJdKTsKKwkJCWJyZWFrOworCQljYXNlIFNZU19CSU5EOgorCQkJZXJyID0gc3lzX2JpbmQoYTAsKHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKilhMSwgYVsyXSk7CisJCQlicmVhazsKKwkJY2FzZSBTWVNfQ09OTkVDVDoKKwkJCWVyciA9IHN5c19jb25uZWN0KGEwLCAoc3RydWN0IHNvY2thZGRyIF9fdXNlciAqKWExLCBhWzJdKTsKKwkJCWJyZWFrOworCQljYXNlIFNZU19MSVNURU46CisJCQllcnIgPSBzeXNfbGlzdGVuKGEwLGExKTsKKwkJCWJyZWFrOworCQljYXNlIFNZU19BQ0NFUFQ6CisJCQllcnIgPSBzeXNfYWNjZXB0KGEwLChzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICopYTEsIChpbnQgX191c2VyICopYVsyXSk7CisJCQlicmVhazsKKwkJY2FzZSBTWVNfR0VUU09DS05BTUU6CisJCQllcnIgPSBzeXNfZ2V0c29ja25hbWUoYTAsKHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKilhMSwgKGludCBfX3VzZXIgKilhWzJdKTsKKwkJCWJyZWFrOworCQljYXNlIFNZU19HRVRQRUVSTkFNRToKKwkJCWVyciA9IHN5c19nZXRwZWVybmFtZShhMCwgKHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKilhMSwgKGludCBfX3VzZXIgKilhWzJdKTsKKwkJCWJyZWFrOworCQljYXNlIFNZU19TT0NLRVRQQUlSOgorCQkJZXJyID0gc3lzX3NvY2tldHBhaXIoYTAsYTEsIGFbMl0sIChpbnQgX191c2VyICopYVszXSk7CisJCQlicmVhazsKKwkJY2FzZSBTWVNfU0VORDoKKwkJCWVyciA9IHN5c19zZW5kKGEwLCAodm9pZCBfX3VzZXIgKilhMSwgYVsyXSwgYVszXSk7CisJCQlicmVhazsKKwkJY2FzZSBTWVNfU0VORFRPOgorCQkJZXJyID0gc3lzX3NlbmR0byhhMCwodm9pZCBfX3VzZXIgKilhMSwgYVsyXSwgYVszXSwKKwkJCQkJIChzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICopYVs0XSwgYVs1XSk7CisJCQlicmVhazsKKwkJY2FzZSBTWVNfUkVDVjoKKwkJCWVyciA9IHN5c19yZWN2KGEwLCAodm9pZCBfX3VzZXIgKilhMSwgYVsyXSwgYVszXSk7CisJCQlicmVhazsKKwkJY2FzZSBTWVNfUkVDVkZST006CisJCQllcnIgPSBzeXNfcmVjdmZyb20oYTAsICh2b2lkIF9fdXNlciAqKWExLCBhWzJdLCBhWzNdLAorCQkJCQkgICAoc3RydWN0IHNvY2thZGRyIF9fdXNlciAqKWFbNF0sIChpbnQgX191c2VyICopYVs1XSk7CisJCQlicmVhazsKKwkJY2FzZSBTWVNfU0hVVERPV046CisJCQllcnIgPSBzeXNfc2h1dGRvd24oYTAsYTEpOworCQkJYnJlYWs7CisJCWNhc2UgU1lTX1NFVFNPQ0tPUFQ6CisJCQllcnIgPSBzeXNfc2V0c29ja29wdChhMCwgYTEsIGFbMl0sIChjaGFyIF9fdXNlciAqKWFbM10sIGFbNF0pOworCQkJYnJlYWs7CisJCWNhc2UgU1lTX0dFVFNPQ0tPUFQ6CisJCQllcnIgPSBzeXNfZ2V0c29ja29wdChhMCwgYTEsIGFbMl0sIChjaGFyIF9fdXNlciAqKWFbM10sIChpbnQgX191c2VyICopYVs0XSk7CisJCQlicmVhazsKKwkJY2FzZSBTWVNfU0VORE1TRzoKKwkJCWVyciA9IHN5c19zZW5kbXNnKGEwLCAoc3RydWN0IG1zZ2hkciBfX3VzZXIgKikgYTEsIGFbMl0pOworCQkJYnJlYWs7CisJCWNhc2UgU1lTX1JFQ1ZNU0c6CisJCQllcnIgPSBzeXNfcmVjdm1zZyhhMCwgKHN0cnVjdCBtc2doZHIgX191c2VyICopIGExLCBhWzJdKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gZXJyOworfQorCisjZW5kaWYgLyogX19BUkNIX1dBTlRfU1lTX1NPQ0tFVENBTEwgKi8KKworLyoKKyAqCVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGEgcHJvdG9jb2wgaGFuZGxlciB0aGF0IHdhbnRzIHRvCisgKglhZHZlcnRpc2UgaXRzIGFkZHJlc3MgZmFtaWx5LCBhbmQgaGF2ZSBpdCBsaW5rZWQgaW50byB0aGUKKyAqCVNPQ0tFVCBtb2R1bGUuCisgKi8KKworaW50IHNvY2tfcmVnaXN0ZXIoc3RydWN0IG5ldF9wcm90b19mYW1pbHkgKm9wcykKK3sKKwlpbnQgZXJyOworCisJaWYgKG9wcy0+ZmFtaWx5ID49IE5QUk9UTykgeworCQlwcmludGsoS0VSTl9DUklUICJwcm90b2NvbCAlZCA+PSBOUFJPVE8oJWQpXG4iLCBvcHMtPmZhbWlseSwgTlBST1RPKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKwluZXRfZmFtaWx5X3dyaXRlX2xvY2soKTsKKwllcnIgPSAtRUVYSVNUOworCWlmIChuZXRfZmFtaWxpZXNbb3BzLT5mYW1pbHldID09IE5VTEwpIHsKKwkJbmV0X2ZhbWlsaWVzW29wcy0+ZmFtaWx5XT1vcHM7CisJCWVyciA9IDA7CisJfQorCW5ldF9mYW1pbHlfd3JpdGVfdW5sb2NrKCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiTkVUOiBSZWdpc3RlcmVkIHByb3RvY29sIGZhbWlseSAlZFxuIiwKKwkgICAgICAgb3BzLT5mYW1pbHkpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKglUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBhIHByb3RvY29sIGhhbmRsZXIgdGhhdCB3YW50cyB0bworICoJcmVtb3ZlIGl0cyBhZGRyZXNzIGZhbWlseSwgYW5kIGhhdmUgaXQgdW5saW5rZWQgZnJvbSB0aGUKKyAqCVNPQ0tFVCBtb2R1bGUuCisgKi8KKworaW50IHNvY2tfdW5yZWdpc3RlcihpbnQgZmFtaWx5KQoreworCWlmIChmYW1pbHkgPCAwIHx8IGZhbWlseSA+PSBOUFJPVE8pCisJCXJldHVybiAtMTsKKworCW5ldF9mYW1pbHlfd3JpdGVfbG9jaygpOworCW5ldF9mYW1pbGllc1tmYW1pbHldPU5VTEw7CisJbmV0X2ZhbWlseV93cml0ZV91bmxvY2soKTsKKwlwcmludGsoS0VSTl9JTkZPICJORVQ6IFVucmVnaXN0ZXJlZCBwcm90b2NvbCBmYW1pbHkgJWRcbiIsCisJICAgICAgIGZhbWlseSk7CisJcmV0dXJuIDA7Cit9CisKKworZXh0ZXJuIHZvaWQgc2tfaW5pdCh2b2lkKTsKKwordm9pZCBfX2luaXQgc29ja19pbml0KHZvaWQpCit7CisJLyoKKwkgKglJbml0aWFsaXplIHNvY2sgU0xBQiBjYWNoZS4KKwkgKi8KKwkgCisJc2tfaW5pdCgpOworCisjaWZkZWYgU0xBQl9TS0IKKwkvKgorCSAqCUluaXRpYWxpemUgc2tidWZmIFNMQUIgY2FjaGUgCisJICovCisJc2tiX2luaXQoKTsKKyNlbmRpZgorCisJLyoKKwkgKglJbml0aWFsaXplIHRoZSBwcm90b2NvbHMgbW9kdWxlLiAKKwkgKi8KKworCWluaXRfaW5vZGVjYWNoZSgpOworCXJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnNvY2tfZnNfdHlwZSk7CisJc29ja19tbnQgPSBrZXJuX21vdW50KCZzb2NrX2ZzX3R5cGUpOworCS8qIFRoZSByZWFsIHByb3RvY29sIGluaXRpYWxpemF0aW9uIGlzIHBlcmZvcm1lZCB3aGVuCisJICogIGRvX2luaXRjYWxscyBpcyBydW4uICAKKwkgKi8KKworI2lmZGVmIENPTkZJR19ORVRGSUxURVIKKwluZXRmaWx0ZXJfaW5pdCgpOworI2VuZGlmCit9CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUwordm9pZCBzb2NrZXRfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJaW50IGNwdTsKKwlpbnQgY291bnRlciA9IDA7CisKKwlmb3IgKGNwdSA9IDA7IGNwdSA8IE5SX0NQVVM7IGNwdSsrKQorCQljb3VudGVyICs9IHBlcl9jcHUoc29ja2V0c19pbl91c2UsIGNwdSk7CisKKwkvKiBJdCBjYW4gYmUgbmVnYXRpdmUsIGJ5IHRoZSB3YXkuIDgpICovCisJaWYgKGNvdW50ZXIgPCAwKQorCQljb3VudGVyID0gMDsKKworCXNlcV9wcmludGYoc2VxLCAic29ja2V0czogdXNlZCAlZFxuIiwgY291bnRlcik7Cit9CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworLyogQUJJIGVtdWxhdGlvbiBsYXllcnMgbmVlZCB0aGVzZSB0d28gKi8KK0VYUE9SVF9TWU1CT0wobW92ZV9hZGRyX3RvX2tlcm5lbCk7CitFWFBPUlRfU1lNQk9MKG1vdmVfYWRkcl90b191c2VyKTsKK0VYUE9SVF9TWU1CT0woc29ja19jcmVhdGUpOworRVhQT1JUX1NZTUJPTChzb2NrX2NyZWF0ZV9rZXJuKTsKK0VYUE9SVF9TWU1CT0woc29ja19jcmVhdGVfbGl0ZSk7CitFWFBPUlRfU1lNQk9MKHNvY2tfbWFwX2ZkKTsKK0VYUE9SVF9TWU1CT0woc29ja19yZWN2bXNnKTsKK0VYUE9SVF9TWU1CT0woc29ja19yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKHNvY2tfcmVsZWFzZSk7CitFWFBPUlRfU1lNQk9MKHNvY2tfc2VuZG1zZyk7CitFWFBPUlRfU1lNQk9MKHNvY2tfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKHNvY2tfd2FrZV9hc3luYyk7CitFWFBPUlRfU1lNQk9MKHNvY2tmZF9sb29rdXApOworRVhQT1JUX1NZTUJPTChrZXJuZWxfc2VuZG1zZyk7CitFWFBPUlRfU1lNQk9MKGtlcm5lbF9yZWN2bXNnKTsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvTWFrZWZpbGUgYi9uZXQvc3VucnBjL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YTJjZTAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc3VucnBjL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIExpbnV4IGtlcm5lbCBTVU4gUlBDCisjCisKKworb2JqLSQoQ09ORklHX1NVTlJQQykgKz0gc3VucnBjLm8KK29iai0kKENPTkZJR19TVU5SUENfR1NTKSArPSBhdXRoX2dzcy8KKworc3VucnBjLXkgOj0gY2xudC5vIHhwcnQubyBzY2hlZC5vIFwKKwkgICAgYXV0aC5vIGF1dGhfbnVsbC5vIGF1dGhfdW5peC5vIFwKKwkgICAgc3ZjLm8gc3Zjc29jay5vIHN2Y2F1dGgubyBzdmNhdXRoX3VuaXgubyBcCisJICAgIHBtYXBfY2xudC5vIHRpbWVyLm8geGRyLm8gXAorCSAgICBzdW5ycGNfc3ltcy5vIGNhY2hlLm8gcnBjX3BpcGUubworc3VucnBjLSQoQ09ORklHX1BST0NfRlMpICs9IHN0YXRzLm8KK3N1bnJwYy0kKENPTkZJR19TWVNDVEwpICs9IHN5c2N0bC5vCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGguYyBiL25ldC9zdW5ycGMvYXV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliY2VjOWIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc3VucnBjL2F1dGguYwpAQCAtMCwwICsxLDM5NSBAQAorLyoKKyAqIGxpbnV4L25ldC9zdW5ycGMvYXV0aC5jCisgKgorICogR2VuZXJpYyBSUEMgY2xpZW50IGF1dGhlbnRpY2F0aW9uIEFQSS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaWZkZWYgUlBDX0RFQlVHCisjIGRlZmluZSBSUENEQkdfRkFDSUxJVFkJUlBDREJHX0FVVEgKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHJwY19hdXRob3BzICoJYXV0aF9mbGF2b3JzW1JQQ19BVVRIX01BWEZMQVZPUl0gPSB7CisJJmF1dGhudWxsX29wcywJCS8qIEFVVEhfTlVMTCAqLworCSZhdXRodW5peF9vcHMsCQkvKiBBVVRIX1VOSVggKi8KKwlOVUxMLAkJCS8qIG90aGVycyBjYW4gYmUgbG9hZGFibGUgbW9kdWxlcyAqLworfTsKKworc3RhdGljIHUzMgorcHNldWRvZmxhdm9yX3RvX2ZsYXZvcih1MzIgZmxhdm9yKSB7CisJaWYgKGZsYXZvciA+PSBSUENfQVVUSF9NQVhGTEFWT1IpCisJCXJldHVybiBSUENfQVVUSF9HU1M7CisJcmV0dXJuIGZsYXZvcjsKK30KKworaW50CitycGNhdXRoX3JlZ2lzdGVyKHN0cnVjdCBycGNfYXV0aG9wcyAqb3BzKQoreworCXJwY19hdXRoZmxhdm9yX3QgZmxhdm9yOworCisJaWYgKChmbGF2b3IgPSBvcHMtPmF1X2ZsYXZvcikgPj0gUlBDX0FVVEhfTUFYRkxBVk9SKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoYXV0aF9mbGF2b3JzW2ZsYXZvcl0gIT0gTlVMTCkKKwkJcmV0dXJuIC1FUEVSTTsJCS8qIHdoYXQgZWxzZT8gKi8KKwlhdXRoX2ZsYXZvcnNbZmxhdm9yXSA9IG9wczsKKwlyZXR1cm4gMDsKK30KKworaW50CitycGNhdXRoX3VucmVnaXN0ZXIoc3RydWN0IHJwY19hdXRob3BzICpvcHMpCit7CisJcnBjX2F1dGhmbGF2b3JfdCBmbGF2b3I7CisKKwlpZiAoKGZsYXZvciA9IG9wcy0+YXVfZmxhdm9yKSA+PSBSUENfQVVUSF9NQVhGTEFWT1IpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChhdXRoX2ZsYXZvcnNbZmxhdm9yXSAhPSBvcHMpCisJCXJldHVybiAtRVBFUk07CQkvKiB3aGF0IGVsc2U/ICovCisJYXV0aF9mbGF2b3JzW2ZsYXZvcl0gPSBOVUxMOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcnBjX2F1dGggKgorcnBjYXV0aF9jcmVhdGUocnBjX2F1dGhmbGF2b3JfdCBwc2V1ZG9mbGF2b3IsIHN0cnVjdCBycGNfY2xudCAqY2xudCkKK3sKKwlzdHJ1Y3QgcnBjX2F1dGgJCSphdXRoOworCXN0cnVjdCBycGNfYXV0aG9wcwkqb3BzOworCXUzMgkJCWZsYXZvciA9IHBzZXVkb2ZsYXZvcl90b19mbGF2b3IocHNldWRvZmxhdm9yKTsKKworCWlmIChmbGF2b3IgPj0gUlBDX0FVVEhfTUFYRkxBVk9SIHx8ICEob3BzID0gYXV0aF9mbGF2b3JzW2ZsYXZvcl0pKQorCQlyZXR1cm4gTlVMTDsKKwlhdXRoID0gb3BzLT5jcmVhdGUoY2xudCwgcHNldWRvZmxhdm9yKTsKKwlpZiAoIWF1dGgpCisJCXJldHVybiBOVUxMOworCWlmIChjbG50LT5jbF9hdXRoKQorCQlycGNhdXRoX2Rlc3Ryb3koY2xudC0+Y2xfYXV0aCk7CisJY2xudC0+Y2xfYXV0aCA9IGF1dGg7CisJcmV0dXJuIGF1dGg7Cit9CisKK3ZvaWQKK3JwY2F1dGhfZGVzdHJveShzdHJ1Y3QgcnBjX2F1dGggKmF1dGgpCit7CisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZhdXRoLT5hdV9jb3VudCkpCisJCXJldHVybjsKKwlhdXRoLT5hdV9vcHMtPmRlc3Ryb3koYXV0aCk7Cit9CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socnBjX2NyZWRjYWNoZV9sb2NrKTsKKworLyoKKyAqIEluaXRpYWxpemUgUlBDIGNyZWRlbnRpYWwgY2FjaGUKKyAqLworaW50CitycGNhdXRoX2luaXRfY3JlZGNhY2hlKHN0cnVjdCBycGNfYXV0aCAqYXV0aCwgdW5zaWduZWQgbG9uZyBleHBpcmUpCit7CisJc3RydWN0IHJwY19jcmVkX2NhY2hlICpuZXc7CisJaW50IGk7CisKKwluZXcgPSAoc3RydWN0IHJwY19jcmVkX2NhY2hlICopa21hbGxvYyhzaXplb2YoKm5ldyksIEdGUF9LRVJORUwpOworCWlmICghbmV3KQorCQlyZXR1cm4gLUVOT01FTTsKKwlmb3IgKGkgPSAwOyBpIDwgUlBDX0NSRURDQUNIRV9OUjsgaSsrKQorCQlJTklUX0hMSVNUX0hFQUQoJm5ldy0+aGFzaHRhYmxlW2ldKTsKKwluZXctPmV4cGlyZSA9IGV4cGlyZTsKKwluZXctPm5leHRnYyA9IGppZmZpZXMgKyAoZXhwaXJlID4+IDEpOworCWF1dGgtPmF1X2NyZWRjYWNoZSA9IG5ldzsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERlc3Ryb3kgYSBsaXN0IG9mIGNyZWRlbnRpYWxzCisgKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgcnBjYXV0aF9kZXN0cm95X2NyZWRsaXN0KHN0cnVjdCBobGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBycGNfY3JlZCAqY3JlZDsKKworCXdoaWxlICghaGxpc3RfZW1wdHkoaGVhZCkpIHsKKwkJY3JlZCA9IGhsaXN0X2VudHJ5KGhlYWQtPmZpcnN0LCBzdHJ1Y3QgcnBjX2NyZWQsIGNyX2hhc2gpOworCQlobGlzdF9kZWxfaW5pdCgmY3JlZC0+Y3JfaGFzaCk7CisJCXB1dF9ycGNjcmVkKGNyZWQpOworCX0KK30KKworLyoKKyAqIENsZWFyIHRoZSBSUEMgY3JlZGVudGlhbCBjYWNoZSwgYW5kIGRlbGV0ZSB0aG9zZSBjcmVkZW50aWFscworICogdGhhdCBhcmUgbm90IHJlZmVyZW5jZWQuCisgKi8KK3ZvaWQKK3JwY2F1dGhfZnJlZV9jcmVkY2FjaGUoc3RydWN0IHJwY19hdXRoICphdXRoKQoreworCXN0cnVjdCBycGNfY3JlZF9jYWNoZSAqY2FjaGUgPSBhdXRoLT5hdV9jcmVkY2FjaGU7CisJSExJU1RfSEVBRChmcmVlKTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zLCAqbmV4dDsKKwlzdHJ1Y3QgcnBjX2NyZWQJKmNyZWQ7CisJaW50CQlpOworCisJc3Bpbl9sb2NrKCZycGNfY3JlZGNhY2hlX2xvY2spOworCWZvciAoaSA9IDA7IGkgPCBSUENfQ1JFRENBQ0hFX05SOyBpKyspIHsKKwkJaGxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG5leHQsICZjYWNoZS0+aGFzaHRhYmxlW2ldKSB7CisJCQljcmVkID0gaGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgcnBjX2NyZWQsIGNyX2hhc2gpOworCQkJX19obGlzdF9kZWwoJmNyZWQtPmNyX2hhc2gpOworCQkJaGxpc3RfYWRkX2hlYWQoJmNyZWQtPmNyX2hhc2gsICZmcmVlKTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmcnBjX2NyZWRjYWNoZV9sb2NrKTsKKwlycGNhdXRoX2Rlc3Ryb3lfY3JlZGxpc3QoJmZyZWUpOworfQorCitzdGF0aWMgdm9pZAorcnBjYXV0aF9wcnVuZV9leHBpcmVkKHN0cnVjdCBycGNfYXV0aCAqYXV0aCwgc3RydWN0IHJwY19jcmVkICpjcmVkLCBzdHJ1Y3QgaGxpc3RfaGVhZCAqZnJlZSkKK3sKKwlpZiAoYXRvbWljX3JlYWQoJmNyZWQtPmNyX2NvdW50KSAhPSAxKQorCSAgICAgICByZXR1cm47CisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgY3JlZC0+Y3JfZXhwaXJlICsgYXV0aC0+YXVfY3JlZGNhY2hlLT5leHBpcmUpKQorCQljcmVkLT5jcl9mbGFncyAmPSB+UlBDQVVUSF9DUkVEX1VQVE9EQVRFOworCWlmICghKGNyZWQtPmNyX2ZsYWdzICYgUlBDQVVUSF9DUkVEX1VQVE9EQVRFKSkgeworCQlfX2hsaXN0X2RlbCgmY3JlZC0+Y3JfaGFzaCk7CisJCWhsaXN0X2FkZF9oZWFkKCZjcmVkLT5jcl9oYXNoLCBmcmVlKTsKKwl9Cit9CisKKy8qCisgKiBSZW1vdmUgc3RhbGUgY3JlZGVudGlhbHMuIEF2b2lkIHNsZWVwaW5nIGluc2lkZSB0aGUgbG9vcC4KKyAqLworc3RhdGljIHZvaWQKK3JwY2F1dGhfZ2NfY3JlZGNhY2hlKHN0cnVjdCBycGNfYXV0aCAqYXV0aCwgc3RydWN0IGhsaXN0X2hlYWQgKmZyZWUpCit7CisJc3RydWN0IHJwY19jcmVkX2NhY2hlICpjYWNoZSA9IGF1dGgtPmF1X2NyZWRjYWNoZTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zLCAqbmV4dDsKKwlzdHJ1Y3QgcnBjX2NyZWQJKmNyZWQ7CisJaW50CQlpOworCisJZHByaW50aygiUlBDOiBnYydpbmcgUlBDIGNyZWRlbnRpYWxzIGZvciBhdXRoICVwXG4iLCBhdXRoKTsKKwlmb3IgKGkgPSAwOyBpIDwgUlBDX0NSRURDQUNIRV9OUjsgaSsrKSB7CisJCWhsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuZXh0LCAmY2FjaGUtPmhhc2h0YWJsZVtpXSkgeworCQkJY3JlZCA9IGhsaXN0X2VudHJ5KHBvcywgc3RydWN0IHJwY19jcmVkLCBjcl9oYXNoKTsKKwkJCXJwY2F1dGhfcHJ1bmVfZXhwaXJlZChhdXRoLCBjcmVkLCBmcmVlKTsKKwkJfQorCX0KKwljYWNoZS0+bmV4dGdjID0gamlmZmllcyArIGNhY2hlLT5leHBpcmU7Cit9CisKKy8qCisgKiBMb29rIHVwIGEgcHJvY2VzcycgY3JlZGVudGlhbHMgaW4gdGhlIGF1dGhlbnRpY2F0aW9uIGNhY2hlCisgKi8KK3N0cnVjdCBycGNfY3JlZCAqCitycGNhdXRoX2xvb2t1cF9jcmVkY2FjaGUoc3RydWN0IHJwY19hdXRoICphdXRoLCBzdHJ1Y3QgYXV0aF9jcmVkICogYWNyZWQsCisJCWludCB0YXNrZmxhZ3MpCit7CisJc3RydWN0IHJwY19jcmVkX2NhY2hlICpjYWNoZSA9IGF1dGgtPmF1X2NyZWRjYWNoZTsKKwlITElTVF9IRUFEKGZyZWUpOworCXN0cnVjdCBobGlzdF9ub2RlICpwb3MsICpuZXh0OworCXN0cnVjdCBycGNfY3JlZAkqbmV3ID0gTlVMTCwKKwkJCSpjcmVkID0gTlVMTDsKKwlpbnQJCW5yID0gMDsKKworCWlmICghKHRhc2tmbGFncyAmIFJQQ19UQVNLX1JPT1RDUkVEUykpCisJCW5yID0gYWNyZWQtPnVpZCAmIFJQQ19DUkVEQ0FDSEVfTUFTSzsKK3JldHJ5OgorCXNwaW5fbG9jaygmcnBjX2NyZWRjYWNoZV9sb2NrKTsKKwlpZiAodGltZV9iZWZvcmUoY2FjaGUtPm5leHRnYywgamlmZmllcykpCisJCXJwY2F1dGhfZ2NfY3JlZGNhY2hlKGF1dGgsICZmcmVlKTsKKwlobGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbmV4dCwgJmNhY2hlLT5oYXNodGFibGVbbnJdKSB7CisJCXN0cnVjdCBycGNfY3JlZCAqZW50cnk7CisJICAgICAgIAllbnRyeSA9IGhsaXN0X2VudHJ5KHBvcywgc3RydWN0IHJwY19jcmVkLCBjcl9oYXNoKTsKKwkJaWYgKGVudHJ5LT5jcl9vcHMtPmNybWF0Y2goYWNyZWQsIGVudHJ5LCB0YXNrZmxhZ3MpKSB7CisJCQlobGlzdF9kZWwoJmVudHJ5LT5jcl9oYXNoKTsKKwkJCWNyZWQgPSBlbnRyeTsKKwkJCWJyZWFrOworCQl9CisJCXJwY2F1dGhfcHJ1bmVfZXhwaXJlZChhdXRoLCBlbnRyeSwgJmZyZWUpOworCX0KKwlpZiAobmV3KSB7CisJCWlmIChjcmVkKQorCQkJaGxpc3RfYWRkX2hlYWQoJm5ldy0+Y3JfaGFzaCwgJmZyZWUpOworCQllbHNlCisJCQljcmVkID0gbmV3OworCX0KKwlpZiAoY3JlZCkgeworCQlobGlzdF9hZGRfaGVhZCgmY3JlZC0+Y3JfaGFzaCwgJmNhY2hlLT5oYXNodGFibGVbbnJdKTsKKwkJZ2V0X3JwY2NyZWQoY3JlZCk7CisJfQorCXNwaW5fdW5sb2NrKCZycGNfY3JlZGNhY2hlX2xvY2spOworCisJcnBjYXV0aF9kZXN0cm95X2NyZWRsaXN0KCZmcmVlKTsKKworCWlmICghY3JlZCkgeworCQluZXcgPSBhdXRoLT5hdV9vcHMtPmNyY3JlYXRlKGF1dGgsIGFjcmVkLCB0YXNrZmxhZ3MpOworCQlpZiAoIUlTX0VSUihuZXcpKSB7CisjaWZkZWYgUlBDX0RFQlVHCisJCQluZXctPmNyX21hZ2ljID0gUlBDQVVUSF9DUkVEX01BR0lDOworI2VuZGlmCisJCQlnb3RvIHJldHJ5OworCQl9IGVsc2UKKwkJCWNyZWQgPSBuZXc7CisJfQorCisJcmV0dXJuIChzdHJ1Y3QgcnBjX2NyZWQgKikgY3JlZDsKK30KKworc3RydWN0IHJwY19jcmVkICoKK3JwY2F1dGhfbG9va3VwY3JlZChzdHJ1Y3QgcnBjX2F1dGggKmF1dGgsIGludCB0YXNrZmxhZ3MpCit7CisJc3RydWN0IGF1dGhfY3JlZCBhY3JlZCA9IHsKKwkJLnVpZCA9IGN1cnJlbnQtPmZzdWlkLAorCQkuZ2lkID0gY3VycmVudC0+ZnNnaWQsCisJCS5ncm91cF9pbmZvID0gY3VycmVudC0+Z3JvdXBfaW5mbywKKwl9OworCXN0cnVjdCBycGNfY3JlZCAqcmV0OworCisJZHByaW50aygiUlBDOiAgICAgbG9va2luZyB1cCAlcyBjcmVkXG4iLAorCQlhdXRoLT5hdV9vcHMtPmF1X25hbWUpOworCWdldF9ncm91cF9pbmZvKGFjcmVkLmdyb3VwX2luZm8pOworCXJldCA9IGF1dGgtPmF1X29wcy0+bG9va3VwX2NyZWQoYXV0aCwgJmFjcmVkLCB0YXNrZmxhZ3MpOworCXB1dF9ncm91cF9pbmZvKGFjcmVkLmdyb3VwX2luZm8pOworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBycGNfY3JlZCAqCitycGNhdXRoX2JpbmRjcmVkKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgcnBjX2F1dGggKmF1dGggPSB0YXNrLT50a19hdXRoOworCXN0cnVjdCBhdXRoX2NyZWQgYWNyZWQgPSB7CisJCS51aWQgPSBjdXJyZW50LT5mc3VpZCwKKwkJLmdpZCA9IGN1cnJlbnQtPmZzZ2lkLAorCQkuZ3JvdXBfaW5mbyA9IGN1cnJlbnQtPmdyb3VwX2luZm8sCisJfTsKKwlzdHJ1Y3QgcnBjX2NyZWQgKnJldDsKKworCWRwcmludGsoIlJQQzogJTRkIGxvb2tpbmcgdXAgJXMgY3JlZFxuIiwKKwkJdGFzay0+dGtfcGlkLCB0YXNrLT50a19hdXRoLT5hdV9vcHMtPmF1X25hbWUpOworCWdldF9ncm91cF9pbmZvKGFjcmVkLmdyb3VwX2luZm8pOworCXJldCA9IGF1dGgtPmF1X29wcy0+bG9va3VwX2NyZWQoYXV0aCwgJmFjcmVkLCB0YXNrLT50a19mbGFncyk7CisJaWYgKCFJU19FUlIocmV0KSkKKwkJdGFzay0+dGtfbXNnLnJwY19jcmVkID0gcmV0OworCWVsc2UKKwkJdGFzay0+dGtfc3RhdHVzID0gUFRSX0VSUihyZXQpOworCXB1dF9ncm91cF9pbmZvKGFjcmVkLmdyb3VwX2luZm8pOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQKK3JwY2F1dGhfaG9sZGNyZWQoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCWRwcmludGsoIlJQQzogJTRkIGhvbGRpbmcgJXMgY3JlZCAlcFxuIiwKKwkJdGFzay0+dGtfcGlkLCB0YXNrLT50a19hdXRoLT5hdV9vcHMtPmF1X25hbWUsIHRhc2stPnRrX21zZy5ycGNfY3JlZCk7CisJaWYgKHRhc2stPnRrX21zZy5ycGNfY3JlZCkKKwkJZ2V0X3JwY2NyZWQodGFzay0+dGtfbXNnLnJwY19jcmVkKTsKK30KKwordm9pZAorcHV0X3JwY2NyZWQoc3RydWN0IHJwY19jcmVkICpjcmVkKQoreworCWNyZWQtPmNyX2V4cGlyZSA9IGppZmZpZXM7CisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZjcmVkLT5jcl9jb3VudCkpCisJCXJldHVybjsKKwljcmVkLT5jcl9vcHMtPmNyZGVzdHJveShjcmVkKTsKK30KKwordm9pZAorcnBjYXV0aF91bmJpbmRjcmVkKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgcnBjX2F1dGgJKmF1dGggPSB0YXNrLT50a19hdXRoOworCXN0cnVjdCBycGNfY3JlZAkqY3JlZCA9IHRhc2stPnRrX21zZy5ycGNfY3JlZDsKKworCWRwcmludGsoIlJQQzogJTRkIHJlbGVhc2luZyAlcyBjcmVkICVwXG4iLAorCQl0YXNrLT50a19waWQsIGF1dGgtPmF1X29wcy0+YXVfbmFtZSwgY3JlZCk7CisKKwlwdXRfcnBjY3JlZChjcmVkKTsKKwl0YXNrLT50a19tc2cucnBjX2NyZWQgPSBOVUxMOworfQorCit1MzIgKgorcnBjYXV0aF9tYXJzaGNyZWQoc3RydWN0IHJwY190YXNrICp0YXNrLCB1MzIgKnApCit7CisJc3RydWN0IHJwY19hdXRoCSphdXRoID0gdGFzay0+dGtfYXV0aDsKKwlzdHJ1Y3QgcnBjX2NyZWQJKmNyZWQgPSB0YXNrLT50a19tc2cucnBjX2NyZWQ7CisKKwlkcHJpbnRrKCJSUEM6ICU0ZCBtYXJzaGFsaW5nICVzIGNyZWQgJXBcbiIsCisJCXRhc2stPnRrX3BpZCwgYXV0aC0+YXVfb3BzLT5hdV9uYW1lLCBjcmVkKTsKKwlyZXR1cm4gY3JlZC0+Y3Jfb3BzLT5jcm1hcnNoYWwodGFzaywgcCk7Cit9CisKK3UzMiAqCitycGNhdXRoX2NoZWNrdmVyZihzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIHUzMiAqcCkKK3sKKwlzdHJ1Y3QgcnBjX2F1dGgJKmF1dGggPSB0YXNrLT50a19hdXRoOworCXN0cnVjdCBycGNfY3JlZAkqY3JlZCA9IHRhc2stPnRrX21zZy5ycGNfY3JlZDsKKworCWRwcmludGsoIlJQQzogJTRkIHZhbGlkYXRpbmcgJXMgY3JlZCAlcFxuIiwKKwkJdGFzay0+dGtfcGlkLCBhdXRoLT5hdV9vcHMtPmF1X25hbWUsIGNyZWQpOworCXJldHVybiBjcmVkLT5jcl9vcHMtPmNydmFsaWRhdGUodGFzaywgcCk7Cit9CisKK2ludAorcnBjYXV0aF93cmFwX3JlcShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIGt4ZHJwcm9jX3QgZW5jb2RlLCB2b2lkICpycXN0cCwKKwkJdTMyICpkYXRhLCB2b2lkICpvYmopCit7CisJc3RydWN0IHJwY19jcmVkICpjcmVkID0gdGFzay0+dGtfbXNnLnJwY19jcmVkOworCisJZHByaW50aygiUlBDOiAlNGQgdXNpbmcgJXMgY3JlZCAlcCB0byB3cmFwIHJwYyBkYXRhXG4iLAorCQkJdGFzay0+dGtfcGlkLCBjcmVkLT5jcl9vcHMtPmNyX25hbWUsIGNyZWQpOworCWlmIChjcmVkLT5jcl9vcHMtPmNyd3JhcF9yZXEpCisJCXJldHVybiBjcmVkLT5jcl9vcHMtPmNyd3JhcF9yZXEodGFzaywgZW5jb2RlLCBycXN0cCwgZGF0YSwgb2JqKTsKKwkvKiBCeSBkZWZhdWx0LCB3ZSBlbmNvZGUgdGhlIGFyZ3VtZW50cyBub3JtYWxseS4gKi8KKwlyZXR1cm4gZW5jb2RlKHJxc3RwLCBkYXRhLCBvYmopOworfQorCitpbnQKK3JwY2F1dGhfdW53cmFwX3Jlc3Aoc3RydWN0IHJwY190YXNrICp0YXNrLCBreGRycHJvY190IGRlY29kZSwgdm9pZCAqcnFzdHAsCisJCXUzMiAqZGF0YSwgdm9pZCAqb2JqKQoreworCXN0cnVjdCBycGNfY3JlZCAqY3JlZCA9IHRhc2stPnRrX21zZy5ycGNfY3JlZDsKKworCWRwcmludGsoIlJQQzogJTRkIHVzaW5nICVzIGNyZWQgJXAgdG8gdW53cmFwIHJwYyBkYXRhXG4iLAorCQkJdGFzay0+dGtfcGlkLCBjcmVkLT5jcl9vcHMtPmNyX25hbWUsIGNyZWQpOworCWlmIChjcmVkLT5jcl9vcHMtPmNydW53cmFwX3Jlc3ApCisJCXJldHVybiBjcmVkLT5jcl9vcHMtPmNydW53cmFwX3Jlc3AodGFzaywgZGVjb2RlLCBycXN0cCwKKwkJCQkJCSAgIGRhdGEsIG9iaik7CisJLyogQnkgZGVmYXVsdCwgd2UgZGVjb2RlIHRoZSBhcmd1bWVudHMgbm9ybWFsbHkuICovCisJcmV0dXJuIGRlY29kZShycXN0cCwgZGF0YSwgb2JqKTsKK30KKworaW50CitycGNhdXRoX3JlZnJlc2hjcmVkKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgcnBjX2F1dGgJKmF1dGggPSB0YXNrLT50a19hdXRoOworCXN0cnVjdCBycGNfY3JlZAkqY3JlZCA9IHRhc2stPnRrX21zZy5ycGNfY3JlZDsKKwlpbnQgZXJyOworCisJZHByaW50aygiUlBDOiAlNGQgcmVmcmVzaGluZyAlcyBjcmVkICVwXG4iLAorCQl0YXNrLT50a19waWQsIGF1dGgtPmF1X29wcy0+YXVfbmFtZSwgY3JlZCk7CisJZXJyID0gY3JlZC0+Y3Jfb3BzLT5jcnJlZnJlc2godGFzayk7CisJaWYgKGVyciA8IDApCisJCXRhc2stPnRrX3N0YXR1cyA9IGVycjsKKwlyZXR1cm4gZXJyOworfQorCit2b2lkCitycGNhdXRoX2ludmFsY3JlZChzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJZHByaW50aygiUlBDOiAlNGQgaW52YWxpZGF0aW5nICVzIGNyZWQgJXBcbiIsCisJCXRhc2stPnRrX3BpZCwgdGFzay0+dGtfYXV0aC0+YXVfb3BzLT5hdV9uYW1lLCB0YXNrLT50a19tc2cucnBjX2NyZWQpOworCXNwaW5fbG9jaygmcnBjX2NyZWRjYWNoZV9sb2NrKTsKKwlpZiAodGFzay0+dGtfbXNnLnJwY19jcmVkKQorCQl0YXNrLT50a19tc2cucnBjX2NyZWQtPmNyX2ZsYWdzICY9IH5SUENBVVRIX0NSRURfVVBUT0RBVEU7CisJc3Bpbl91bmxvY2soJnJwY19jcmVkY2FjaGVfbG9jayk7Cit9CisKK2ludAorcnBjYXV0aF91cHRvZGF0ZWNyZWQoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXJldHVybiAhKHRhc2stPnRrX21zZy5ycGNfY3JlZCkgfHwKKwkJKHRhc2stPnRrX21zZy5ycGNfY3JlZC0+Y3JfZmxhZ3MgJiBSUENBVVRIX0NSRURfVVBUT0RBVEUpOworfQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9NYWtlZmlsZSBiL25ldC9zdW5ycGMvYXV0aF9nc3MvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUxYjg3NAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvTWFrZWZpbGUKQEAgLTAsMCArMSwxOCBAQAorIworIyBNYWtlZmlsZSBmb3IgTGludXgga2VybmVsIHJwY3NlY19nc3MgaW1wbGVtZW50YXRpb24KKyMKKworb2JqLSQoQ09ORklHX1NVTlJQQ19HU1MpICs9IGF1dGhfcnBjZ3NzLm8KKworYXV0aF9ycGNnc3Mtb2JqcyA6PSBhdXRoX2dzcy5vIGdzc19nZW5lcmljX3Rva2VuLm8gXAorCWdzc19tZWNoX3N3aXRjaC5vIHN2Y2F1dGhfZ3NzLm8gZ3NzX2tyYjVfY3J5cHRvLm8KKworb2JqLSQoQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSkgKz0gcnBjc2VjX2dzc19rcmI1Lm8KKworcnBjc2VjX2dzc19rcmI1LW9ianMgOj0gZ3NzX2tyYjVfbWVjaC5vIGdzc19rcmI1X3NlYWwubyBnc3Nfa3JiNV91bnNlYWwubyBcCisJZ3NzX2tyYjVfc2VxbnVtLm8KKworb2JqLSQoQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMpICs9IHJwY3NlY19nc3Nfc3BrbTMubworCitycGNzZWNfZ3NzX3Nwa20zLW9ianMgOj0gZ3NzX3Nwa20zX21lY2gubyBnc3Nfc3BrbTNfc2VhbC5vIGdzc19zcGttM191bnNlYWwubyBcCisJZ3NzX3Nwa20zX3Rva2VuLm8KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3MvYXV0aF9nc3MuYyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvYXV0aF9nc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzNiNjI3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9hdXRoX2dzcy5jCkBAIC0wLDAgKzEsMTE1MiBAQAorLyoKKyAqIGxpbnV4L25ldC9zdW5ycGMvYXV0aF9nc3MuYworICoKKyAqIFJQQ1NFQ19HU1MgY2xpZW50IGF1dGhlbnRpY2F0aW9uLgorICogCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIER1ZyBTb25nICAgICAgIDxkdWdzb25nQG1vbmtleS5vcmc+CisgKiAgQW5keSBBZGFtc29uICAgPGFuZHJvc0B1bWljaC5lZHU+CisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogJElkJAorICovCisKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvYXV0aC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9hdXRoX2dzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNhdXRoX2dzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9nc3NfZXJyLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3JwY19waXBlX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2dzc19hcGkuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgc3RydWN0IHJwY19hdXRob3BzIGF1dGhnc3Nfb3BzOworCitzdGF0aWMgc3RydWN0IHJwY19jcmVkb3BzIGdzc19jcmVkb3BzOworCisjaWZkZWYgUlBDX0RFQlVHCisjIGRlZmluZSBSUENEQkdfRkFDSUxJVFkJUlBDREJHX0FVVEgKKyNlbmRpZgorCisjZGVmaW5lIE5GU19OR1JPVVBTCTE2CisKKyNkZWZpbmUgR1NTX0NSRURfRVhQSVJFCQkoNjAgKiBIWikJLyogWFhYOiByZWFzb25hYmxlPyAqLworI2RlZmluZSBHU1NfQ1JFRF9TTEFDSwkJMTAyNAkJLyogWFhYOiB1bnVzZWQgKi8KKy8qIGxlbmd0aCBvZiBhIGtyYjUgdmVyaWZpZXIgKDQ4KSwgcGx1cyBkYXRhIGFkZGVkIGJlZm9yZSBhcmd1bWVudHMgd2hlbgorICogdXNpbmcgaW50ZWdyaXR5ICh0d28gNC1ieXRlIGludGVnZXJzKTogKi8KKyNkZWZpbmUgR1NTX1ZFUkZfU0xBQ0sJCTU2CisKKy8qIFhYWCB0aGlzIGRlZmluZSBtdXN0IG1hdGNoIHRoZSBnc3NkIGRlZmluZQorKiBhcyBpdCBpcyBwYXNzZWQgdG8gZ3NzZCB0byBzaWduYWwgdGhlIHVzZSBvZgorKiBtYWNoaW5lIGNyZWRzIHNob3VsZCBiZSBwYXJ0IG9mIHRoZSBzaGFyZWQgcnBjIGludGVyZmFjZSAqLworCisjZGVmaW5lIENBX1JVTl9BU19NQUNISU5FICAweDAwMDAwMjAwIAorCisvKiBkdW1wIHRoZSBidWZmZXIgaW4gYGVtYWNzLWhleGwnIHN0eWxlICovCisjZGVmaW5lIGlzcHJpbnQoYykgICAgICAoKGMgPiAweDFmKSAmJiAoYyA8IDB4N2YpKQorCitzdGF0aWMgREVGSU5FX1JXTE9DSyhnc3NfY3R4X2xvY2spOworCitzdHJ1Y3QgZ3NzX2F1dGggeworCXN0cnVjdCBycGNfYXV0aCBycGNfYXV0aDsKKwlzdHJ1Y3QgZ3NzX2FwaV9tZWNoICptZWNoOworCWVudW0gcnBjX2dzc19zdmMgc2VydmljZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHVwY2FsbHM7CisJc3RydWN0IHJwY19jbG50ICpjbGllbnQ7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCWNoYXIgcGF0aFs0OF07CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworc3RhdGljIHZvaWQgZ3NzX2Rlc3Ryb3lfY3R4KHN0cnVjdCBnc3NfY2xfY3R4ICopOworc3RhdGljIHN0cnVjdCBycGNfcGlwZV9vcHMgZ3NzX3VwY2FsbF9vcHM7CisKK3ZvaWQKK3ByaW50X2hleGwodTMyICpwLCB1X2ludCBsZW5ndGgsIHVfaW50IG9mZnNldCkKK3sKKwl1X2ludCBpLCBqLCBqbTsKKwl1OCBjLCAqY3A7CisJCisJZHByaW50aygiUlBDOiBwcmludF9oZXhsOiBsZW5ndGggJWRcbiIsbGVuZ3RoKTsKKwlkcHJpbnRrKCJcbiIpOworCWNwID0gKHU4ICopIHA7CisJCisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAweDEwKSB7CisJCWRwcmludGsoIiAgJTA0eDogIiwgKHVfaW50KShpICsgb2Zmc2V0KSk7CisJCWptID0gbGVuZ3RoIC0gaTsKKwkJam0gPSBqbSA+IDE2ID8gMTYgOiBqbTsKKwkJCisJCWZvciAoaiA9IDA7IGogPCBqbTsgaisrKSB7CisJCQlpZiAoKGogJSAyKSA9PSAxKQorCQkJCWRwcmludGsoIiUwMnggIiwgKHVfaW50KWNwW2kral0pOworCQkJZWxzZQorCQkJCWRwcmludGsoIiUwMngiLCAodV9pbnQpY3BbaStqXSk7CisJCX0KKwkJZm9yICg7IGogPCAxNjsgaisrKSB7CisJCQlpZiAoKGogJSAyKSA9PSAxKQorCQkJCWRwcmludGsoIiAgICIpOworCQkJZWxzZQorCQkJCWRwcmludGsoIiAgIik7CisJCX0KKwkJZHByaW50aygiICIpOworCQkKKwkJZm9yIChqID0gMDsgaiA8IGptOyBqKyspIHsKKwkJCWMgPSBjcFtpK2pdOworCQkJYyA9IGlzcHJpbnQoYykgPyBjIDogJy4nOworCQkJZHByaW50aygiJWMiLCBjKTsKKwkJfQorCQlkcHJpbnRrKCJcbiIpOworCX0KK30KKworRVhQT1JUX1NZTUJPTChwcmludF9oZXhsKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZ3NzX2NsX2N0eCAqCitnc3NfZ2V0X2N0eChzdHJ1Y3QgZ3NzX2NsX2N0eCAqY3R4KQoreworCWF0b21pY19pbmMoJmN0eC0+Y291bnQpOworCXJldHVybiBjdHg7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZ3NzX3B1dF9jdHgoc3RydWN0IGdzc19jbF9jdHggKmN0eCkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmY3R4LT5jb3VudCkpCisJCWdzc19kZXN0cm95X2N0eChjdHgpOworfQorCitzdGF0aWMgdm9pZAorZ3NzX2NyZWRfc2V0X2N0eChzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQsIHN0cnVjdCBnc3NfY2xfY3R4ICpjdHgpCit7CisJc3RydWN0IGdzc19jcmVkICpnc3NfY3JlZCA9IGNvbnRhaW5lcl9vZihjcmVkLCBzdHJ1Y3QgZ3NzX2NyZWQsIGdjX2Jhc2UpOworCXN0cnVjdCBnc3NfY2xfY3R4ICpvbGQ7CisJd3JpdGVfbG9jaygmZ3NzX2N0eF9sb2NrKTsKKwlvbGQgPSBnc3NfY3JlZC0+Z2NfY3R4OworCWdzc19jcmVkLT5nY19jdHggPSBjdHg7CisJY3JlZC0+Y3JfZmxhZ3MgfD0gUlBDQVVUSF9DUkVEX1VQVE9EQVRFOworCXdyaXRlX3VubG9jaygmZ3NzX2N0eF9sb2NrKTsKKwlpZiAob2xkKQorCQlnc3NfcHV0X2N0eChvbGQpOworfQorCitzdGF0aWMgaW50Citnc3NfY3JlZF9pc191cHRvZGF0ZV9jdHgoc3RydWN0IHJwY19jcmVkICpjcmVkKQoreworCXN0cnVjdCBnc3NfY3JlZCAqZ3NzX2NyZWQgPSBjb250YWluZXJfb2YoY3JlZCwgc3RydWN0IGdzc19jcmVkLCBnY19iYXNlKTsKKwlpbnQgcmVzID0gMDsKKworCXJlYWRfbG9jaygmZ3NzX2N0eF9sb2NrKTsKKwlpZiAoKGNyZWQtPmNyX2ZsYWdzICYgUlBDQVVUSF9DUkVEX1VQVE9EQVRFKSAmJiBnc3NfY3JlZC0+Z2NfY3R4KQorCQlyZXMgPSAxOworCXJlYWRfdW5sb2NrKCZnc3NfY3R4X2xvY2spOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBjb25zdCB2b2lkICoKK3NpbXBsZV9nZXRfYnl0ZXMoY29uc3Qgdm9pZCAqcCwgY29uc3Qgdm9pZCAqZW5kLCB2b2lkICpyZXMsIHNpemVfdCBsZW4pCit7CisJY29uc3Qgdm9pZCAqcSA9IChjb25zdCB2b2lkICopKChjb25zdCBjaGFyICopcCArIGxlbik7CisJaWYgKHVubGlrZWx5KHEgPiBlbmQgfHwgcSA8IHApKQorCQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKKwltZW1jcHkocmVzLCBwLCBsZW4pOworCXJldHVybiBxOworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IHZvaWQgKgorc2ltcGxlX2dldF9uZXRvYmooY29uc3Qgdm9pZCAqcCwgY29uc3Qgdm9pZCAqZW5kLCBzdHJ1Y3QgeGRyX25ldG9iaiAqZGVzdCkKK3sKKwljb25zdCB2b2lkICpxOworCXVuc2lnbmVkIGludCBsZW47CisKKwlwID0gc2ltcGxlX2dldF9ieXRlcyhwLCBlbmQsICZsZW4sIHNpemVvZihsZW4pKTsKKwlpZiAoSVNfRVJSKHApKQorCQlyZXR1cm4gcDsKKwlxID0gKGNvbnN0IHZvaWQgKikoKGNvbnN0IGNoYXIgKilwICsgbGVuKTsKKwlpZiAodW5saWtlbHkocSA+IGVuZCB8fCBxIDwgcCkpCisJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOworCWRlc3QtPmRhdGEgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KGRlc3QtPmRhdGEgPT0gTlVMTCkpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWRlc3QtPmxlbiA9IGxlbjsKKwltZW1jcHkoZGVzdC0+ZGF0YSwgcCwgbGVuKTsKKwlyZXR1cm4gcTsKK30KKworc3RhdGljIHN0cnVjdCBnc3NfY2xfY3R4ICoKK2dzc19jcmVkX2dldF9jdHgoc3RydWN0IHJwY19jcmVkICpjcmVkKQoreworCXN0cnVjdCBnc3NfY3JlZCAqZ3NzX2NyZWQgPSBjb250YWluZXJfb2YoY3JlZCwgc3RydWN0IGdzc19jcmVkLCBnY19iYXNlKTsKKwlzdHJ1Y3QgZ3NzX2NsX2N0eCAqY3R4ID0gTlVMTDsKKworCXJlYWRfbG9jaygmZ3NzX2N0eF9sb2NrKTsKKwlpZiAoZ3NzX2NyZWQtPmdjX2N0eCkKKwkJY3R4ID0gZ3NzX2dldF9jdHgoZ3NzX2NyZWQtPmdjX2N0eCk7CisJcmVhZF91bmxvY2soJmdzc19jdHhfbG9jayk7CisJcmV0dXJuIGN0eDsKK30KKworc3RhdGljIHN0cnVjdCBnc3NfY2xfY3R4ICoKK2dzc19hbGxvY19jb250ZXh0KHZvaWQpCit7CisJc3RydWN0IGdzc19jbF9jdHggKmN0eDsKKworCWN0eCA9IGttYWxsb2Moc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY3R4ICE9IE5VTEwpIHsKKwkJbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKCpjdHgpKTsKKwkJY3R4LT5nY19wcm9jID0gUlBDX0dTU19QUk9DX0RBVEE7CisJCWN0eC0+Z2Nfc2VxID0gMTsJLyogTmV0QXBwIDYuNFIxIGRvZXNuJ3QgYWNjZXB0IHNlcS4gbm8uIDAgKi8KKwkJc3Bpbl9sb2NrX2luaXQoJmN0eC0+Z2Nfc2VxX2xvY2spOworCQlhdG9taWNfc2V0KCZjdHgtPmNvdW50LDEpOworCX0KKwlyZXR1cm4gY3R4OworfQorCisjZGVmaW5lIEdTU0RfTUlOX1RJTUVPVVQgKDYwICogNjApCitzdGF0aWMgY29uc3Qgdm9pZCAqCitnc3NfZmlsbF9jb250ZXh0KGNvbnN0IHZvaWQgKnAsIGNvbnN0IHZvaWQgKmVuZCwgc3RydWN0IGdzc19jbF9jdHggKmN0eCwgc3RydWN0IGdzc19hcGlfbWVjaCAqZ20pCit7CisJY29uc3Qgdm9pZCAqcTsKKwl1bnNpZ25lZCBpbnQgc2VjbGVuOworCXVuc2lnbmVkIGludCB0aW1lb3V0OworCXUzMiB3aW5kb3dfc2l6ZTsKKwlpbnQgcmV0OworCisJLyogRmlyc3QgdW5zaWduZWQgaW50IGdpdmVzIHRoZSBsaWZldGltZSAoaW4gc2Vjb25kcykgb2YgdGhlIGNyZWQgKi8KKwlwID0gc2ltcGxlX2dldF9ieXRlcyhwLCBlbmQsICZ0aW1lb3V0LCBzaXplb2YodGltZW91dCkpOworCWlmIChJU19FUlIocCkpCisJCWdvdG8gZXJyOworCWlmICh0aW1lb3V0ID09IDApCisJCXRpbWVvdXQgPSBHU1NEX01JTl9USU1FT1VUOworCWN0eC0+Z2NfZXhwaXJ5ID0gamlmZmllcyArICh1bnNpZ25lZCBsb25nKXRpbWVvdXQgKiBIWiAqIDMgLyA0OworCS8qIFNlcXVlbmNlIG51bWJlciB3aW5kb3cuIERldGVybWluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyByZXF1ZXN0cyAqLworCXAgPSBzaW1wbGVfZ2V0X2J5dGVzKHAsIGVuZCwgJndpbmRvd19zaXplLCBzaXplb2Yod2luZG93X3NpemUpKTsKKwlpZiAoSVNfRVJSKHApKQorCQlnb3RvIGVycjsKKwljdHgtPmdjX3dpbiA9IHdpbmRvd19zaXplOworCS8qIGdzc2Qgc2lnbmFscyBhbiBlcnJvciBieSBwYXNzaW5nIGN0eC0+Z2Nfd2luID0gMDogKi8KKwlpZiAoY3R4LT5nY193aW4gPT0gMCkgeworCQkvKiBpbiB3aGljaCBjYXNlLCBwIHBvaW50cyB0byAgYW4gZXJyb3IgY29kZSB3aGljaCB3ZSBpZ25vcmUgKi8KKwkJcCA9IEVSUl9QVFIoLUVBQ0NFUyk7CisJCWdvdG8gZXJyOworCX0KKwkvKiBjb3B5IHRoZSBvcGFxdWUgd2lyZSBjb250ZXh0ICovCisJcCA9IHNpbXBsZV9nZXRfbmV0b2JqKHAsIGVuZCwgJmN0eC0+Z2Nfd2lyZV9jdHgpOworCWlmIChJU19FUlIocCkpCisJCWdvdG8gZXJyOworCS8qIGltcG9ydCB0aGUgb3BhcXVlIHNlY3VyaXR5IGNvbnRleHQgKi8KKwlwICA9IHNpbXBsZV9nZXRfYnl0ZXMocCwgZW5kLCAmc2VjbGVuLCBzaXplb2Yoc2VjbGVuKSk7CisJaWYgKElTX0VSUihwKSkKKwkJZ290byBlcnI7CisJcSA9IChjb25zdCB2b2lkICopKChjb25zdCBjaGFyICopcCArIHNlY2xlbik7CisJaWYgKHVubGlrZWx5KHEgPiBlbmQgfHwgcSA8IHApKSB7CisJCXAgPSBFUlJfUFRSKC1FRkFVTFQpOworCQlnb3RvIGVycjsKKwl9CisJcmV0ID0gZ3NzX2ltcG9ydF9zZWNfY29udGV4dChwLCBzZWNsZW4sIGdtLCAmY3R4LT5nY19nc3NfY3R4KTsKKwlpZiAocmV0IDwgMCkgeworCQlwID0gRVJSX1BUUihyZXQpOworCQlnb3RvIGVycjsKKwl9CisJcmV0dXJuIHE7CitlcnI6CisJZHByaW50aygiUlBDOiAgICAgIGdzc19maWxsX2NvbnRleHQgcmV0dXJuaW5nICVsZFxuIiwgLVBUUl9FUlIocCkpOworCXJldHVybiBwOworfQorCisKK3N0cnVjdCBnc3NfdXBjYWxsX21zZyB7CisJYXRvbWljX3QgY291bnQ7CisJdWlkX3QJdWlkOworCXN0cnVjdCBycGNfcGlwZV9tc2cgbXNnOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZ3NzX2F1dGggKmF1dGg7CisJc3RydWN0IHJwY193YWl0X3F1ZXVlIHJwY193YWl0cXVldWU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdHF1ZXVlOworCXN0cnVjdCBnc3NfY2xfY3R4ICpjdHg7Cit9OworCitzdGF0aWMgdm9pZAorZ3NzX3JlbGVhc2VfbXNnKHN0cnVjdCBnc3NfdXBjYWxsX21zZyAqZ3NzX21zZykKK3sKKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmdzc19tc2ctPmNvdW50KSkKKwkJcmV0dXJuOworCUJVR19PTighbGlzdF9lbXB0eSgmZ3NzX21zZy0+bGlzdCkpOworCWlmIChnc3NfbXNnLT5jdHggIT0gTlVMTCkKKwkJZ3NzX3B1dF9jdHgoZ3NzX21zZy0+Y3R4KTsKKwlrZnJlZShnc3NfbXNnKTsKK30KKworc3RhdGljIHN0cnVjdCBnc3NfdXBjYWxsX21zZyAqCitfX2dzc19maW5kX3VwY2FsbChzdHJ1Y3QgZ3NzX2F1dGggKmdzc19hdXRoLCB1aWRfdCB1aWQpCit7CisJc3RydWN0IGdzc191cGNhbGxfbXNnICpwb3M7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZnc3NfYXV0aC0+dXBjYWxscywgbGlzdCkgeworCQlpZiAocG9zLT51aWQgIT0gdWlkKQorCQkJY29udGludWU7CisJCWF0b21pY19pbmMoJnBvcy0+Y291bnQpOworCQlkcHJpbnRrKCJSUEM6ICAgICAgZ3NzX2ZpbmRfdXBjYWxsIGZvdW5kIG1zZyAlcFxuIiwgcG9zKTsKKwkJcmV0dXJuIHBvczsKKwl9CisJZHByaW50aygiUlBDOiAgICAgIGdzc19maW5kX3VwY2FsbCBmb3VuZCBub3RoaW5nXG4iKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogVHJ5IHRvIGFkZCBhIHVwY2FsbCB0byB0aGUgcGlwZWZzIHF1ZXVlLgorICogSWYgYW4gdXBjYWxsIG93bmVkIGJ5IG91ciB1aWQgYWxyZWFkeSBleGlzdHMsIHRoZW4gd2UgcmV0dXJuIGEgcmVmZXJlbmNlCisgKiB0byB0aGF0IHVwY2FsbCBpbnN0ZWFkIG9mIGFkZGluZyB0aGUgbmV3IHVwY2FsbC4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgZ3NzX3VwY2FsbF9tc2cgKgorZ3NzX2FkZF9tc2coc3RydWN0IGdzc19hdXRoICpnc3NfYXV0aCwgc3RydWN0IGdzc191cGNhbGxfbXNnICpnc3NfbXNnKQoreworCXN0cnVjdCBnc3NfdXBjYWxsX21zZyAqb2xkOworCisJc3Bpbl9sb2NrKCZnc3NfYXV0aC0+bG9jayk7CisJb2xkID0gX19nc3NfZmluZF91cGNhbGwoZ3NzX2F1dGgsIGdzc19tc2ctPnVpZCk7CisJaWYgKG9sZCA9PSBOVUxMKSB7CisJCWF0b21pY19pbmMoJmdzc19tc2ctPmNvdW50KTsKKwkJbGlzdF9hZGQoJmdzc19tc2ctPmxpc3QsICZnc3NfYXV0aC0+dXBjYWxscyk7CisJfSBlbHNlCisJCWdzc19tc2cgPSBvbGQ7CisJc3Bpbl91bmxvY2soJmdzc19hdXRoLT5sb2NrKTsKKwlyZXR1cm4gZ3NzX21zZzsKK30KKworc3RhdGljIHZvaWQKK19fZ3NzX3VuaGFzaF9tc2coc3RydWN0IGdzc191cGNhbGxfbXNnICpnc3NfbXNnKQoreworCWlmIChsaXN0X2VtcHR5KCZnc3NfbXNnLT5saXN0KSkKKwkJcmV0dXJuOworCWxpc3RfZGVsX2luaXQoJmdzc19tc2ctPmxpc3QpOworCXJwY193YWtlX3VwX3N0YXR1cygmZ3NzX21zZy0+cnBjX3dhaXRxdWV1ZSwgZ3NzX21zZy0+bXNnLmVycm5vKTsKKwl3YWtlX3VwX2FsbCgmZ3NzX21zZy0+d2FpdHF1ZXVlKTsKKwlhdG9taWNfZGVjKCZnc3NfbXNnLT5jb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3NfdW5oYXNoX21zZyhzdHJ1Y3QgZ3NzX3VwY2FsbF9tc2cgKmdzc19tc2cpCit7CisJc3RydWN0IGdzc19hdXRoICpnc3NfYXV0aCA9IGdzc19tc2ctPmF1dGg7CisKKwlzcGluX2xvY2soJmdzc19hdXRoLT5sb2NrKTsKKwlfX2dzc191bmhhc2hfbXNnKGdzc19tc2cpOworCXNwaW5fdW5sb2NrKCZnc3NfYXV0aC0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3NfdXBjYWxsX2NhbGxiYWNrKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgZ3NzX2NyZWQgKmdzc19jcmVkID0gY29udGFpbmVyX29mKHRhc2stPnRrX21zZy5ycGNfY3JlZCwKKwkJCXN0cnVjdCBnc3NfY3JlZCwgZ2NfYmFzZSk7CisJc3RydWN0IGdzc191cGNhbGxfbXNnICpnc3NfbXNnID0gZ3NzX2NyZWQtPmdjX3VwY2FsbDsKKworCUJVR19PTihnc3NfbXNnID09IE5VTEwpOworCWlmIChnc3NfbXNnLT5jdHgpCisJCWdzc19jcmVkX3NldF9jdHgodGFzay0+dGtfbXNnLnJwY19jcmVkLCBnc3NfZ2V0X2N0eChnc3NfbXNnLT5jdHgpKTsKKwllbHNlCisJCXRhc2stPnRrX3N0YXR1cyA9IGdzc19tc2ctPm1zZy5lcnJubzsKKwlzcGluX2xvY2soJmdzc19tc2ctPmF1dGgtPmxvY2spOworCWdzc19jcmVkLT5nY191cGNhbGwgPSBOVUxMOworCXJwY193YWtlX3VwX3N0YXR1cygmZ3NzX21zZy0+cnBjX3dhaXRxdWV1ZSwgZ3NzX21zZy0+bXNnLmVycm5vKTsKKwlzcGluX3VubG9jaygmZ3NzX21zZy0+YXV0aC0+bG9jayk7CisJZ3NzX3JlbGVhc2VfbXNnKGdzc19tc2cpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBnc3NfdXBjYWxsX21zZyAqCitnc3NfYWxsb2NfbXNnKHN0cnVjdCBnc3NfYXV0aCAqZ3NzX2F1dGgsIHVpZF90IHVpZCkKK3sKKwlzdHJ1Y3QgZ3NzX3VwY2FsbF9tc2cgKmdzc19tc2c7CisKKwlnc3NfbXNnID0ga21hbGxvYyhzaXplb2YoKmdzc19tc2cpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZ3NzX21zZyAhPSBOVUxMKSB7CisJCW1lbXNldChnc3NfbXNnLCAwLCBzaXplb2YoKmdzc19tc2cpKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmdzc19tc2ctPmxpc3QpOworCQlycGNfaW5pdF93YWl0X3F1ZXVlKCZnc3NfbXNnLT5ycGNfd2FpdHF1ZXVlLCAiUlBDU0VDX0dTUyB1cGNhbGwgd2FpdHEiKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmZ3NzX21zZy0+d2FpdHF1ZXVlKTsKKwkJYXRvbWljX3NldCgmZ3NzX21zZy0+Y291bnQsIDEpOworCQlnc3NfbXNnLT5tc2cuZGF0YSA9ICZnc3NfbXNnLT51aWQ7CisJCWdzc19tc2ctPm1zZy5sZW4gPSBzaXplb2YoZ3NzX21zZy0+dWlkKTsKKwkJZ3NzX21zZy0+dWlkID0gdWlkOworCQlnc3NfbXNnLT5hdXRoID0gZ3NzX2F1dGg7CisJfQorCXJldHVybiBnc3NfbXNnOworfQorCitzdGF0aWMgc3RydWN0IGdzc191cGNhbGxfbXNnICoKK2dzc19zZXR1cF91cGNhbGwoc3RydWN0IHJwY19jbG50ICpjbG50LCBzdHJ1Y3QgZ3NzX2F1dGggKmdzc19hdXRoLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQpCit7CisJc3RydWN0IGdzc191cGNhbGxfbXNnICpnc3NfbmV3LCAqZ3NzX21zZzsKKworCWdzc19uZXcgPSBnc3NfYWxsb2NfbXNnKGdzc19hdXRoLCBjcmVkLT5jcl91aWQpOworCWlmIChnc3NfbmV3ID09IE5VTEwpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWdzc19tc2cgPSBnc3NfYWRkX21zZyhnc3NfYXV0aCwgZ3NzX25ldyk7CisJaWYgKGdzc19tc2cgPT0gZ3NzX25ldykgeworCQlpbnQgcmVzID0gcnBjX3F1ZXVlX3VwY2FsbChnc3NfYXV0aC0+ZGVudHJ5LT5kX2lub2RlLCAmZ3NzX25ldy0+bXNnKTsKKwkJaWYgKHJlcykgeworCQkJZ3NzX3VuaGFzaF9tc2coZ3NzX25ldyk7CisJCQlnc3NfbXNnID0gRVJSX1BUUihyZXMpOworCQl9CisJfSBlbHNlCisJCWdzc19yZWxlYXNlX21zZyhnc3NfbmV3KTsKKwlyZXR1cm4gZ3NzX21zZzsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2dzc19yZWZyZXNoX3VwY2FsbChzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IHJwY19jcmVkICpjcmVkID0gdGFzay0+dGtfbXNnLnJwY19jcmVkOworCXN0cnVjdCBnc3NfYXV0aCAqZ3NzX2F1dGggPSBjb250YWluZXJfb2YodGFzay0+dGtfY2xpZW50LT5jbF9hdXRoLAorCQkJc3RydWN0IGdzc19hdXRoLCBycGNfYXV0aCk7CisJc3RydWN0IGdzc19jcmVkICpnc3NfY3JlZCA9IGNvbnRhaW5lcl9vZihjcmVkLAorCQkJc3RydWN0IGdzc19jcmVkLCBnY19iYXNlKTsKKwlzdHJ1Y3QgZ3NzX3VwY2FsbF9tc2cgKmdzc19tc2c7CisJaW50IGVyciA9IDA7CisKKwlkcHJpbnRrKCJSUEM6ICU0dSBnc3NfcmVmcmVzaF91cGNhbGwgZm9yIHVpZCAldVxuIiwgdGFzay0+dGtfcGlkLCBjcmVkLT5jcl91aWQpOworCWdzc19tc2cgPSBnc3Nfc2V0dXBfdXBjYWxsKHRhc2stPnRrX2NsaWVudCwgZ3NzX2F1dGgsIGNyZWQpOworCWlmIChJU19FUlIoZ3NzX21zZykpIHsKKwkJZXJyID0gUFRSX0VSUihnc3NfbXNnKTsKKwkJZ290byBvdXQ7CisJfQorCXNwaW5fbG9jaygmZ3NzX2F1dGgtPmxvY2spOworCWlmIChnc3NfY3JlZC0+Z2NfdXBjYWxsICE9IE5VTEwpCisJCXJwY19zbGVlcF9vbigmZ3NzX2NyZWQtPmdjX3VwY2FsbC0+cnBjX3dhaXRxdWV1ZSwgdGFzaywgTlVMTCwgTlVMTCk7CisJZWxzZSBpZiAoZ3NzX21zZy0+Y3R4ID09IE5VTEwgJiYgZ3NzX21zZy0+bXNnLmVycm5vID49IDApIHsKKwkJdGFzay0+dGtfdGltZW91dCA9IDA7CisJCWdzc19jcmVkLT5nY191cGNhbGwgPSBnc3NfbXNnOworCQkvKiBnc3NfdXBjYWxsX2NhbGxiYWNrIHdpbGwgcmVsZWFzZSB0aGUgcmVmZXJlbmNlIHRvIGdzc191cGNhbGxfbXNnICovCisJCWF0b21pY19pbmMoJmdzc19tc2ctPmNvdW50KTsKKwkJcnBjX3NsZWVwX29uKCZnc3NfbXNnLT5ycGNfd2FpdHF1ZXVlLCB0YXNrLCBnc3NfdXBjYWxsX2NhbGxiYWNrLCBOVUxMKTsKKwl9IGVsc2UKKwkJZXJyID0gZ3NzX21zZy0+bXNnLmVycm5vOworCXNwaW5fdW5sb2NrKCZnc3NfYXV0aC0+bG9jayk7CisJZ3NzX3JlbGVhc2VfbXNnKGdzc19tc2cpOworb3V0OgorCWRwcmludGsoIlJQQzogJTR1IGdzc19yZWZyZXNoX3VwY2FsbCBmb3IgdWlkICV1IHJlc3VsdCAlZFxuIiwgdGFzay0+dGtfcGlkLAorCQkJY3JlZC0+Y3JfdWlkLCBlcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citnc3NfY3JlYXRlX3VwY2FsbChzdHJ1Y3QgZ3NzX2F1dGggKmdzc19hdXRoLCBzdHJ1Y3QgZ3NzX2NyZWQgKmdzc19jcmVkKQoreworCXN0cnVjdCBycGNfY3JlZCAqY3JlZCA9ICZnc3NfY3JlZC0+Z2NfYmFzZTsKKwlzdHJ1Y3QgZ3NzX3VwY2FsbF9tc2cgKmdzc19tc2c7CisJREVGSU5FX1dBSVQod2FpdCk7CisJaW50IGVyciA9IDA7CisKKwlkcHJpbnRrKCJSUEM6IGdzc191cGNhbGwgZm9yIHVpZCAldVxuIiwgY3JlZC0+Y3JfdWlkKTsKKwlnc3NfbXNnID0gZ3NzX3NldHVwX3VwY2FsbChnc3NfYXV0aC0+Y2xpZW50LCBnc3NfYXV0aCwgY3JlZCk7CisJaWYgKElTX0VSUihnc3NfbXNnKSkgeworCQllcnIgPSBQVFJfRVJSKGdzc19tc2cpOworCQlnb3RvIG91dDsKKwl9CisJZm9yICg7OykgeworCQlwcmVwYXJlX3RvX3dhaXQoJmdzc19tc2ctPndhaXRxdWV1ZSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fbG9jaygmZ3NzX2F1dGgtPmxvY2spOworCQlpZiAoZ3NzX21zZy0+Y3R4ICE9IE5VTEwgfHwgZ3NzX21zZy0+bXNnLmVycm5vIDwgMCkgeworCQkJc3Bpbl91bmxvY2soJmdzc19hdXRoLT5sb2NrKTsKKwkJCWJyZWFrOworCQl9CisJCXNwaW5fdW5sb2NrKCZnc3NfYXV0aC0+bG9jayk7CisJCWlmIChzaWduYWxsZWQoKSkgeworCQkJZXJyID0gLUVSRVNUQVJUU1lTOworCQkJZ290byBvdXRfaW50cjsKKwkJfQorCQlzY2hlZHVsZSgpOworCX0KKwlpZiAoZ3NzX21zZy0+Y3R4KQorCQlnc3NfY3JlZF9zZXRfY3R4KGNyZWQsIGdzc19nZXRfY3R4KGdzc19tc2ctPmN0eCkpOworCWVsc2UKKwkJZXJyID0gZ3NzX21zZy0+bXNnLmVycm5vOworb3V0X2ludHI6CisJZmluaXNoX3dhaXQoJmdzc19tc2ctPndhaXRxdWV1ZSwgJndhaXQpOworCWdzc19yZWxlYXNlX21zZyhnc3NfbXNnKTsKK291dDoKKwlkcHJpbnRrKCJSUEM6IGdzc19jcmVhdGVfdXBjYWxsIGZvciB1aWQgJXUgcmVzdWx0ICVkXG4iLCBjcmVkLT5jcl91aWQsIGVycik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHNzaXplX3QKK2dzc19waXBlX3VwY2FsbChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHJwY19waXBlX21zZyAqbXNnLAorCQljaGFyIF9fdXNlciAqZHN0LCBzaXplX3QgYnVmbGVuKQoreworCWNoYXIgKmRhdGEgPSAoY2hhciAqKW1zZy0+ZGF0YSArIG1zZy0+Y29waWVkOworCXNzaXplX3QgbWxlbiA9IG1zZy0+bGVuOworCXNzaXplX3QgbGVmdDsKKworCWlmIChtbGVuID4gYnVmbGVuKQorCQltbGVuID0gYnVmbGVuOworCWxlZnQgPSBjb3B5X3RvX3VzZXIoZHN0LCBkYXRhLCBtbGVuKTsKKwlpZiAobGVmdCA8IDApIHsKKwkJbXNnLT5lcnJubyA9IGxlZnQ7CisJCXJldHVybiBsZWZ0OworCX0KKwltbGVuIC09IGxlZnQ7CisJbXNnLT5jb3BpZWQgKz0gbWxlbjsKKwltc2ctPmVycm5vID0gMDsKKwlyZXR1cm4gbWxlbjsKK30KKworI2RlZmluZSBNU0dfQlVGX01BWFNJWkUgMTAyNAorCitzdGF0aWMgc3NpemVfdAorZ3NzX3BpcGVfZG93bmNhbGwoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpzcmMsIHNpemVfdCBtbGVuKQoreworCWNvbnN0IHZvaWQgKnAsICplbmQ7CisJdm9pZCAqYnVmOworCXN0cnVjdCBycGNfY2xudCAqY2xudDsKKwlzdHJ1Y3QgZ3NzX2F1dGggKmdzc19hdXRoOworCXN0cnVjdCBycGNfY3JlZCAqY3JlZDsKKwlzdHJ1Y3QgZ3NzX3VwY2FsbF9tc2cgKmdzc19tc2c7CisJc3RydWN0IGdzc19jbF9jdHggKmN0eDsKKwl1aWRfdCB1aWQ7CisJaW50IGVyciA9IC1FRkJJRzsKKworCWlmIChtbGVuID4gTVNHX0JVRl9NQVhTSVpFKQorCQlnb3RvIG91dDsKKwllcnIgPSAtRU5PTUVNOworCWJ1ZiA9IGttYWxsb2MobWxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCWdvdG8gb3V0OworCisJY2xudCA9IFJQQ19JKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlKS0+cHJpdmF0ZTsKKwllcnIgPSAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHNyYywgbWxlbikpCisJCWdvdG8gZXJyOworCisJZW5kID0gKGNvbnN0IHZvaWQgKikoKGNoYXIgKilidWYgKyBtbGVuKTsKKwlwID0gc2ltcGxlX2dldF9ieXRlcyhidWYsIGVuZCwgJnVpZCwgc2l6ZW9mKHVpZCkpOworCWlmIChJU19FUlIocCkpIHsKKwkJZXJyID0gUFRSX0VSUihwKTsKKwkJZ290byBlcnI7CisJfQorCisJZXJyID0gLUVOT01FTTsKKwljdHggPSBnc3NfYWxsb2NfY29udGV4dCgpOworCWlmIChjdHggPT0gTlVMTCkKKwkJZ290byBlcnI7CisJZXJyID0gMDsKKwlnc3NfYXV0aCA9IGNvbnRhaW5lcl9vZihjbG50LT5jbF9hdXRoLCBzdHJ1Y3QgZ3NzX2F1dGgsIHJwY19hdXRoKTsKKwlwID0gZ3NzX2ZpbGxfY29udGV4dChwLCBlbmQsIGN0eCwgZ3NzX2F1dGgtPm1lY2gpOworCWlmIChJU19FUlIocCkpIHsKKwkJZXJyID0gUFRSX0VSUihwKTsKKwkJaWYgKGVyciAhPSAtRUFDQ0VTKQorCQkJZ290byBlcnJfcHV0X2N0eDsKKwl9CisJc3Bpbl9sb2NrKCZnc3NfYXV0aC0+bG9jayk7CisJZ3NzX21zZyA9IF9fZ3NzX2ZpbmRfdXBjYWxsKGdzc19hdXRoLCB1aWQpOworCWlmIChnc3NfbXNnKSB7CisJCWlmIChlcnIgPT0gMCAmJiBnc3NfbXNnLT5jdHggPT0gTlVMTCkKKwkJCWdzc19tc2ctPmN0eCA9IGdzc19nZXRfY3R4KGN0eCk7CisJCWdzc19tc2ctPm1zZy5lcnJubyA9IGVycjsKKwkJX19nc3NfdW5oYXNoX21zZyhnc3NfbXNnKTsKKwkJc3Bpbl91bmxvY2soJmdzc19hdXRoLT5sb2NrKTsKKwkJZ3NzX3JlbGVhc2VfbXNnKGdzc19tc2cpOworCX0gZWxzZSB7CisJCXN0cnVjdCBhdXRoX2NyZWQgYWNyZWQgPSB7IC51aWQgPSB1aWQgfTsKKwkJc3Bpbl91bmxvY2soJmdzc19hdXRoLT5sb2NrKTsKKwkJY3JlZCA9IHJwY2F1dGhfbG9va3VwX2NyZWRjYWNoZShjbG50LT5jbF9hdXRoLCAmYWNyZWQsIDApOworCQlpZiAoSVNfRVJSKGNyZWQpKSB7CisJCQllcnIgPSBQVFJfRVJSKGNyZWQpOworCQkJZ290byBlcnJfcHV0X2N0eDsKKwkJfQorCQlnc3NfY3JlZF9zZXRfY3R4KGNyZWQsIGdzc19nZXRfY3R4KGN0eCkpOworCX0KKwlnc3NfcHV0X2N0eChjdHgpOworCWtmcmVlKGJ1Zik7CisJZHByaW50aygiUlBDOiAgICAgIGdzc19waXBlX2Rvd25jYWxsIHJldHVybmluZyBsZW5ndGggJVp1XG4iLCBtbGVuKTsKKwlyZXR1cm4gbWxlbjsKK2Vycl9wdXRfY3R4OgorCWdzc19wdXRfY3R4KGN0eCk7CitlcnI6CisJa2ZyZWUoYnVmKTsKK291dDoKKwlkcHJpbnRrKCJSUEM6ICAgICAgZ3NzX3BpcGVfZG93bmNhbGwgcmV0dXJuaW5nICVkXG4iLCBlcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkCitnc3NfcGlwZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHJwY19pbm9kZSAqcnBjaSA9IFJQQ19JKGlub2RlKTsKKwlzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQ7CisJc3RydWN0IHJwY19hdXRoICphdXRoOworCXN0cnVjdCBnc3NfYXV0aCAqZ3NzX2F1dGg7CisKKwljbG50ID0gcnBjaS0+cHJpdmF0ZTsKKwlhdXRoID0gY2xudC0+Y2xfYXV0aDsKKwlnc3NfYXV0aCA9IGNvbnRhaW5lcl9vZihhdXRoLCBzdHJ1Y3QgZ3NzX2F1dGgsIHJwY19hdXRoKTsKKwlzcGluX2xvY2soJmdzc19hdXRoLT5sb2NrKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmdzc19hdXRoLT51cGNhbGxzKSkgeworCQlzdHJ1Y3QgZ3NzX3VwY2FsbF9tc2cgKmdzc19tc2c7CisKKwkJZ3NzX21zZyA9IGxpc3RfZW50cnkoZ3NzX2F1dGgtPnVwY2FsbHMubmV4dCwKKwkJCQlzdHJ1Y3QgZ3NzX3VwY2FsbF9tc2csIGxpc3QpOworCQlnc3NfbXNnLT5tc2cuZXJybm8gPSAtRVBJUEU7CisJCWF0b21pY19pbmMoJmdzc19tc2ctPmNvdW50KTsKKwkJX19nc3NfdW5oYXNoX21zZyhnc3NfbXNnKTsKKwkJc3Bpbl91bmxvY2soJmdzc19hdXRoLT5sb2NrKTsKKwkJZ3NzX3JlbGVhc2VfbXNnKGdzc19tc2cpOworCQlzcGluX2xvY2soJmdzc19hdXRoLT5sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJmdzc19hdXRoLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQKK2dzc19waXBlX2Rlc3Ryb3lfbXNnKHN0cnVjdCBycGNfcGlwZV9tc2cgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NzX3VwY2FsbF9tc2cgKmdzc19tc2cgPSBjb250YWluZXJfb2YobXNnLCBzdHJ1Y3QgZ3NzX3VwY2FsbF9tc2csIG1zZyk7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgcmF0ZWxpbWl0OworCisJaWYgKG1zZy0+ZXJybm8gPCAwKSB7CisJCWRwcmludGsoIlJQQzogICAgICBnc3NfcGlwZV9kZXN0cm95X21zZyByZWxlYXNpbmcgbXNnICVwXG4iLAorCQkJCWdzc19tc2cpOworCQlhdG9taWNfaW5jKCZnc3NfbXNnLT5jb3VudCk7CisJCWdzc191bmhhc2hfbXNnKGdzc19tc2cpOworCQlpZiAobXNnLT5lcnJubyA9PSAtRVRJTUVET1VUIHx8IG1zZy0+ZXJybm8gPT0gLUVQSVBFKSB7CisJCQl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisJCQlpZiAodGltZV9hZnRlcihub3csIHJhdGVsaW1pdCkpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJSUEM6IEFVVEhfR1NTIHVwY2FsbCB0aW1lZCBvdXQuXG4iCisJCQkJCQkgICAgIlBsZWFzZSBjaGVjayB1c2VyIGRhZW1vbiBpcyBydW5uaW5nIVxuIik7CisJCQkJcmF0ZWxpbWl0ID0gbm93ICsgMTUqSFo7CisJCQl9CisJCX0KKwkJZ3NzX3JlbGVhc2VfbXNnKGdzc19tc2cpOworCX0KK30KKworLyogCisgKiBOT1RFOiB3ZSBoYXZlIHRoZSBvcHBvcnR1bml0eSB0byB1c2UgZGlmZmVyZW50IAorICogcGFyYW1ldGVycyBiYXNlZCBvbiB0aGUgaW5wdXQgZmxhdm9yICh3aGljaCBtdXN0IGJlIGEgcHNldWRvZmxhdm9yKQorICovCitzdGF0aWMgc3RydWN0IHJwY19hdXRoICoKK2dzc19jcmVhdGUoc3RydWN0IHJwY19jbG50ICpjbG50LCBycGNfYXV0aGZsYXZvcl90IGZsYXZvcikKK3sKKwlzdHJ1Y3QgZ3NzX2F1dGggKmdzc19hdXRoOworCXN0cnVjdCBycGNfYXV0aCAqIGF1dGg7CisKKwlkcHJpbnRrKCJSUEM6ICAgICAgY3JlYXRpbmcgR1NTIGF1dGhlbnRpY2F0b3IgZm9yIGNsaWVudCAlcFxuIixjbG50KTsKKworCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoIShnc3NfYXV0aCA9IGttYWxsb2Moc2l6ZW9mKCpnc3NfYXV0aCksIEdGUF9LRVJORUwpKSkKKwkJZ290byBvdXRfZGVjOworCWdzc19hdXRoLT5jbGllbnQgPSBjbG50OworCWdzc19hdXRoLT5tZWNoID0gZ3NzX21lY2hfZ2V0X2J5X3BzZXVkb2ZsYXZvcihmbGF2b3IpOworCWlmICghZ3NzX2F1dGgtPm1lY2gpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFBzZXVkb2ZsYXZvciAlZCBub3QgZm91bmQhIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGZsYXZvcik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCWdzc19hdXRoLT5zZXJ2aWNlID0gZ3NzX3BzZXVkb2ZsYXZvcl90b19zZXJ2aWNlKGdzc19hdXRoLT5tZWNoLCBmbGF2b3IpOworCS8qIEZJWE1FOiBXaWxsIGdvIGF3YXkgb25jZSBwcml2YWN5IHN1cHBvcnQgaXMgbWVyZ2VkIGluICovCisJaWYgKGdzc19hdXRoLT5zZXJ2aWNlID09IFJQQ19HU1NfU1ZDX1BSSVZBQ1kpCisJCWdzc19hdXRoLT5zZXJ2aWNlID0gUlBDX0dTU19TVkNfSU5URUdSSVRZOworCUlOSVRfTElTVF9IRUFEKCZnc3NfYXV0aC0+dXBjYWxscyk7CisJc3Bpbl9sb2NrX2luaXQoJmdzc19hdXRoLT5sb2NrKTsKKwlhdXRoID0gJmdzc19hdXRoLT5ycGNfYXV0aDsKKwlhdXRoLT5hdV9jc2xhY2sgPSBHU1NfQ1JFRF9TTEFDSyA+PiAyOworCWF1dGgtPmF1X3JzbGFjayA9IEdTU19WRVJGX1NMQUNLID4+IDI7CisJYXV0aC0+YXVfb3BzID0gJmF1dGhnc3Nfb3BzOworCWF1dGgtPmF1X2ZsYXZvciA9IGZsYXZvcjsKKwlhdG9taWNfc2V0KCZhdXRoLT5hdV9jb3VudCwgMSk7CisKKwlpZiAocnBjYXV0aF9pbml0X2NyZWRjYWNoZShhdXRoLCBHU1NfQ1JFRF9FWFBJUkUpIDwgMCkKKwkJZ290byBlcnJfcHV0X21lY2g7CisKKwlzbnByaW50Zihnc3NfYXV0aC0+cGF0aCwgc2l6ZW9mKGdzc19hdXRoLT5wYXRoKSwgIiVzLyVzIiwKKwkJCWNsbnQtPmNsX3BhdGhuYW1lLAorCQkJZ3NzX2F1dGgtPm1lY2gtPmdtX25hbWUpOworCWdzc19hdXRoLT5kZW50cnkgPSBycGNfbWtwaXBlKGdzc19hdXRoLT5wYXRoLCBjbG50LCAmZ3NzX3VwY2FsbF9vcHMsIFJQQ19QSVBFX1dBSVRfRk9SX09QRU4pOworCWlmIChJU19FUlIoZ3NzX2F1dGgtPmRlbnRyeSkpCisJCWdvdG8gZXJyX3B1dF9tZWNoOworCisJcmV0dXJuIGF1dGg7CitlcnJfcHV0X21lY2g6CisJZ3NzX21lY2hfcHV0KGdzc19hdXRoLT5tZWNoKTsKK2Vycl9mcmVlOgorCWtmcmVlKGdzc19hdXRoKTsKK291dF9kZWM6CisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitnc3NfZGVzdHJveShzdHJ1Y3QgcnBjX2F1dGggKmF1dGgpCit7CisJc3RydWN0IGdzc19hdXRoICpnc3NfYXV0aDsKKworCWRwcmludGsoIlJQQzogICAgICBkZXN0cm95aW5nIEdTUyBhdXRoZW50aWNhdG9yICVwIGZsYXZvciAlZFxuIiwKKwkJYXV0aCwgYXV0aC0+YXVfZmxhdm9yKTsKKworCWdzc19hdXRoID0gY29udGFpbmVyX29mKGF1dGgsIHN0cnVjdCBnc3NfYXV0aCwgcnBjX2F1dGgpOworCXJwY191bmxpbmsoZ3NzX2F1dGgtPnBhdGgpOworCWdzc19tZWNoX3B1dChnc3NfYXV0aC0+bWVjaCk7CisKKwlycGNhdXRoX2ZyZWVfY3JlZGNhY2hlKGF1dGgpOworCWtmcmVlKGdzc19hdXRoKTsKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKK30KKworLyogZ3NzX2Rlc3Ryb3lfY3JlZCAoYW5kIGdzc19kZXN0cm95X2N0eCkgYXJlIHVzZWQgdG8gY2xlYW4gdXAgYWZ0ZXIgZmFpbHVyZQorICogdG8gY3JlYXRlIGEgbmV3IGNyZWQgb3IgY29udGV4dCwgc28gdGhleSBjaGVjayB0aGF0IHRoaW5ncyBoYXZlIGJlZW4KKyAqIGFsbG9jYXRlZCBiZWZvcmUgZnJlZWluZyB0aGVtLiAqLworc3RhdGljIHZvaWQKK2dzc19kZXN0cm95X2N0eChzdHJ1Y3QgZ3NzX2NsX2N0eCAqY3R4KQoreworCWRwcmludGsoIlJQQzogICAgICBnc3NfZGVzdHJveV9jdHhcbiIpOworCisJaWYgKGN0eC0+Z2NfZ3NzX2N0eCkKKwkJZ3NzX2RlbGV0ZV9zZWNfY29udGV4dCgmY3R4LT5nY19nc3NfY3R4KTsKKworCWtmcmVlKGN0eC0+Z2Nfd2lyZV9jdHguZGF0YSk7CisJa2ZyZWUoY3R4KTsKK30KKworc3RhdGljIHZvaWQKK2dzc19kZXN0cm95X2NyZWQoc3RydWN0IHJwY19jcmVkICpyYykKK3sKKwlzdHJ1Y3QgZ3NzX2NyZWQgKmNyZWQgPSBjb250YWluZXJfb2YocmMsIHN0cnVjdCBnc3NfY3JlZCwgZ2NfYmFzZSk7CisKKwlkcHJpbnRrKCJSUEM6ICAgICAgZ3NzX2Rlc3Ryb3lfY3JlZCBcbiIpOworCisJaWYgKGNyZWQtPmdjX2N0eCkKKwkJZ3NzX3B1dF9jdHgoY3JlZC0+Z2NfY3R4KTsKKwlrZnJlZShjcmVkKTsKK30KKworLyoKKyAqIExvb2t1cCBSUENTRUNfR1NTIGNyZWQgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3MKKyAqLworc3RhdGljIHN0cnVjdCBycGNfY3JlZCAqCitnc3NfbG9va3VwX2NyZWQoc3RydWN0IHJwY19hdXRoICphdXRoLCBzdHJ1Y3QgYXV0aF9jcmVkICphY3JlZCwgaW50IHRhc2tmbGFncykKK3sKKwlyZXR1cm4gcnBjYXV0aF9sb29rdXBfY3JlZGNhY2hlKGF1dGgsIGFjcmVkLCB0YXNrZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IHJwY19jcmVkICoKK2dzc19jcmVhdGVfY3JlZChzdHJ1Y3QgcnBjX2F1dGggKmF1dGgsIHN0cnVjdCBhdXRoX2NyZWQgKmFjcmVkLCBpbnQgdGFza2ZsYWdzKQoreworCXN0cnVjdCBnc3NfYXV0aCAqZ3NzX2F1dGggPSBjb250YWluZXJfb2YoYXV0aCwgc3RydWN0IGdzc19hdXRoLCBycGNfYXV0aCk7CisJc3RydWN0IGdzc19jcmVkCSpjcmVkID0gTlVMTDsKKwlpbnQgZXJyID0gLUVOT01FTTsKKworCWRwcmludGsoIlJQQzogICAgICBnc3NfY3JlYXRlX2NyZWQgZm9yIHVpZCAlZCwgZmxhdm9yICVkXG4iLAorCQlhY3JlZC0+dWlkLCBhdXRoLT5hdV9mbGF2b3IpOworCisJaWYgKCEoY3JlZCA9IGttYWxsb2Moc2l6ZW9mKCpjcmVkKSwgR0ZQX0tFUk5FTCkpKQorCQlnb3RvIG91dF9lcnI7CisKKwltZW1zZXQoY3JlZCwgMCwgc2l6ZW9mKCpjcmVkKSk7CisJYXRvbWljX3NldCgmY3JlZC0+Z2NfY291bnQsIDEpOworCWNyZWQtPmdjX3VpZCA9IGFjcmVkLT51aWQ7CisJLyoKKwkgKiBOb3RlOiBpbiBvcmRlciB0byBmb3JjZSBhIGNhbGwgdG8gY2FsbF9yZWZyZXNoKCksIHdlIGRlbGliZXJhdGVseQorCSAqIGZhaWwgdG8gZmxhZyB0aGUgY3JlZGVudGlhbCBhcyBSUENBVVRIX0NSRURfVVBUT0RBVEUuCisJICovCisJY3JlZC0+Z2NfZmxhZ3MgPSAwOworCWNyZWQtPmdjX2Jhc2UuY3Jfb3BzID0gJmdzc19jcmVkb3BzOworCWNyZWQtPmdjX3NlcnZpY2UgPSBnc3NfYXV0aC0+c2VydmljZTsKKwllcnIgPSBnc3NfY3JlYXRlX3VwY2FsbChnc3NfYXV0aCwgY3JlZCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X2VycjsKKworCXJldHVybiAmY3JlZC0+Z2NfYmFzZTsKKworb3V0X2VycjoKKwlkcHJpbnRrKCJSUEM6ICAgICAgZ3NzX2NyZWF0ZV9jcmVkIGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLCBlcnIpOworCWlmIChjcmVkKSBnc3NfZGVzdHJveV9jcmVkKCZjcmVkLT5nY19iYXNlKTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCitzdGF0aWMgaW50Citnc3NfbWF0Y2goc3RydWN0IGF1dGhfY3JlZCAqYWNyZWQsIHN0cnVjdCBycGNfY3JlZCAqcmMsIGludCB0YXNrZmxhZ3MpCit7CisJc3RydWN0IGdzc19jcmVkICpnc3NfY3JlZCA9IGNvbnRhaW5lcl9vZihyYywgc3RydWN0IGdzc19jcmVkLCBnY19iYXNlKTsKKworCS8qIERvbid0IG1hdGNoIHdpdGggY3JlZHMgdGhhdCBoYXZlIGV4cGlyZWQuICovCisJaWYgKGdzc19jcmVkLT5nY19jdHggJiYgdGltZV9hZnRlcihqaWZmaWVzLCBnc3NfY3JlZC0+Z2NfY3R4LT5nY19leHBpcnkpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKHJjLT5jcl91aWQgPT0gYWNyZWQtPnVpZCk7Cit9CisKKy8qCisqIE1hcnNoYWwgY3JlZGVudGlhbHMuCisqIE1heWJlIHdlIHNob3VsZCBrZWVwIGEgY2FjaGVkIGNyZWRlbnRpYWwgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCisqLworc3RhdGljIHUzMiAqCitnc3NfbWFyc2hhbChzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIHUzMiAqcCkKK3sKKwlzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQgPSB0YXNrLT50a19tc2cucnBjX2NyZWQ7CisJc3RydWN0IGdzc19jcmVkCSpnc3NfY3JlZCA9IGNvbnRhaW5lcl9vZihjcmVkLCBzdHJ1Y3QgZ3NzX2NyZWQsCisJCQkJCQkgZ2NfYmFzZSk7CisJc3RydWN0IGdzc19jbF9jdHgJKmN0eCA9IGdzc19jcmVkX2dldF9jdHgoY3JlZCk7CisJdTMyCQkqY3JlZF9sZW47CisJc3RydWN0IHJwY19ycXN0ICpyZXEgPSB0YXNrLT50a19ycXN0cDsKKwl1MzIgICAgICAgICAgICAgbWFqX3N0YXQgPSAwOworCXN0cnVjdCB4ZHJfbmV0b2JqIG1pYzsKKwlzdHJ1Y3Qga3ZlYwlpb3Y7CisJc3RydWN0IHhkcl9idWYJdmVyZl9idWY7CisKKwlkcHJpbnRrKCJSUEM6ICU0dSBnc3NfbWFyc2hhbFxuIiwgdGFzay0+dGtfcGlkKTsKKworCSpwKysgPSBodG9ubChSUENfQVVUSF9HU1MpOworCWNyZWRfbGVuID0gcCsrOworCisJc3Bpbl9sb2NrKCZjdHgtPmdjX3NlcV9sb2NrKTsKKwlyZXEtPnJxX3NlcW5vID0gY3R4LT5nY19zZXErKzsKKwlzcGluX3VubG9jaygmY3R4LT5nY19zZXFfbG9jayk7CisKKwkqcCsrID0gaHRvbmwoKHUzMikgUlBDX0dTU19WRVJTSU9OKTsKKwkqcCsrID0gaHRvbmwoKHUzMikgY3R4LT5nY19wcm9jKTsKKwkqcCsrID0gaHRvbmwoKHUzMikgcmVxLT5ycV9zZXFubyk7CisJKnArKyA9IGh0b25sKCh1MzIpIGdzc19jcmVkLT5nY19zZXJ2aWNlKTsKKwlwID0geGRyX2VuY29kZV9uZXRvYmoocCwgJmN0eC0+Z2Nfd2lyZV9jdHgpOworCSpjcmVkX2xlbiA9IGh0b25sKChwIC0gKGNyZWRfbGVuICsgMSkpIDw8IDIpOworCisJLyogV2UgY29tcHV0ZSB0aGUgY2hlY2tzdW0gZm9yIHRoZSB2ZXJpZmllciBvdmVyIHRoZSB4ZHItZW5jb2RlZCBieXRlcworCSAqIHN0YXJ0aW5nIHdpdGggdGhlIHhpZCBhbmQgZW5kaW5nIGF0IHRoZSBlbmQgb2YgdGhlIGNyZWRlbnRpYWw6ICovCisJaW92Lmlvdl9iYXNlID0gcmVxLT5ycV9zbmRfYnVmLmhlYWRbMF0uaW92X2Jhc2U7CisJaWYgKHRhc2stPnRrX2NsaWVudC0+Y2xfeHBydC0+c3RyZWFtKQorCQkvKiBTZWUgY2xudC5jOmNhbGxfaGVhZGVyKCkgKi8KKwkJaW92Lmlvdl9iYXNlICs9IDQ7CisJaW92Lmlvdl9sZW4gPSAodTggKilwIC0gKHU4ICopaW92Lmlvdl9iYXNlOworCXhkcl9idWZfZnJvbV9pb3YoJmlvdiwgJnZlcmZfYnVmKTsKKworCS8qIHNldCB2ZXJpZmllciBmbGF2b3IqLworCSpwKysgPSBodG9ubChSUENfQVVUSF9HU1MpOworCisJbWljLmRhdGEgPSAodTggKikocCArIDEpOworCW1hal9zdGF0ID0gZ3NzX2dldF9taWMoY3R4LT5nY19nc3NfY3R4LAorCQkJICAgICAgIEdTU19DX1FPUF9ERUZBVUxULCAKKwkJCSAgICAgICAmdmVyZl9idWYsICZtaWMpOworCWlmIChtYWpfc3RhdCA9PSBHU1NfU19DT05URVhUX0VYUElSRUQpIHsKKwkJY3JlZC0+Y3JfZmxhZ3MgJj0gflJQQ0FVVEhfQ1JFRF9VUFRPREFURTsKKwl9IGVsc2UgaWYgKG1hal9zdGF0ICE9IDApIHsKKwkJcHJpbnRrKCJnc3NfbWFyc2hhbDogZ3NzX2dldF9taWMgRkFJTEVEICglZClcbiIsIG1hal9zdGF0KTsKKwkJZ290byBvdXRfcHV0X2N0eDsKKwl9CisJcCA9IHhkcl9lbmNvZGVfb3BhcXVlKHAsIE5VTEwsIG1pYy5sZW4pOworCWdzc19wdXRfY3R4KGN0eCk7CisJcmV0dXJuIHA7CitvdXRfcHV0X2N0eDoKKwlnc3NfcHV0X2N0eChjdHgpOworCXJldHVybiBOVUxMOworfQorCisvKgorKiBSZWZyZXNoIGNyZWRlbnRpYWxzLiBYWFggLSBmaW5pc2gKKyovCitzdGF0aWMgaW50Citnc3NfcmVmcmVzaChzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisKKwlpZiAoIWdzc19jcmVkX2lzX3VwdG9kYXRlX2N0eCh0YXNrLT50a19tc2cucnBjX2NyZWQpKQorCQlyZXR1cm4gZ3NzX3JlZnJlc2hfdXBjYWxsKHRhc2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyICoKK2dzc192YWxpZGF0ZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIHUzMiAqcCkKK3sKKwlzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQgPSB0YXNrLT50a19tc2cucnBjX2NyZWQ7CisJc3RydWN0IGdzc19jcmVkCSpnc3NfY3JlZCA9IGNvbnRhaW5lcl9vZihjcmVkLCBzdHJ1Y3QgZ3NzX2NyZWQsCisJCQkJCQlnY19iYXNlKTsKKwlzdHJ1Y3QgZ3NzX2NsX2N0eCAqY3R4ID0gZ3NzX2NyZWRfZ2V0X2N0eChjcmVkKTsKKwl1MzIJCXNlcSwgcW9wX3N0YXRlOworCXN0cnVjdCBrdmVjCWlvdjsKKwlzdHJ1Y3QgeGRyX2J1Zgl2ZXJmX2J1ZjsKKwlzdHJ1Y3QgeGRyX25ldG9iaiBtaWM7CisJdTMyCQlmbGF2LGxlbjsKKwl1MzIJCW1hal9zdGF0OworCisJZHByaW50aygiUlBDOiAlNHUgZ3NzX3ZhbGlkYXRlXG4iLCB0YXNrLT50a19waWQpOworCisJZmxhdiA9IG50b2hsKCpwKyspOworCWlmICgobGVuID0gbnRvaGwoKnArKykpID4gUlBDX01BWF9BVVRIX1NJWkUpCisgICAgICAgICAgICAgICAgZ290byBvdXRfYmFkOworCWlmIChmbGF2ICE9IFJQQ19BVVRIX0dTUykKKwkJZ290byBvdXRfYmFkOworCXNlcSA9IGh0b25sKHRhc2stPnRrX3Jxc3RwLT5ycV9zZXFubyk7CisJaW92Lmlvdl9iYXNlID0gJnNlcTsKKwlpb3YuaW92X2xlbiA9IHNpemVvZihzZXEpOworCXhkcl9idWZfZnJvbV9pb3YoJmlvdiwgJnZlcmZfYnVmKTsKKwltaWMuZGF0YSA9ICh1OCAqKXA7CisJbWljLmxlbiA9IGxlbjsKKworCW1hal9zdGF0ID0gZ3NzX3ZlcmlmeV9taWMoY3R4LT5nY19nc3NfY3R4LCAmdmVyZl9idWYsICZtaWMsICZxb3Bfc3RhdGUpOworCWlmIChtYWpfc3RhdCA9PSBHU1NfU19DT05URVhUX0VYUElSRUQpCisJCWNyZWQtPmNyX2ZsYWdzICY9IH5SUENBVVRIX0NSRURfVVBUT0RBVEU7CisJaWYgKG1hal9zdGF0KQorCQlnb3RvIG91dF9iYWQ7CisgICAgICAgc3dpdGNoIChnc3NfY3JlZC0+Z2Nfc2VydmljZSkgeworICAgICAgIGNhc2UgUlBDX0dTU19TVkNfTk9ORToKKwkgICAgICAgLyogdmVyaWZpZXIgZGF0YSwgZmxhdm9yLCBsZW5ndGg6ICovCisJICAgICAgIHRhc2stPnRrX2F1dGgtPmF1X3JzbGFjayA9IFhEUl9RVUFETEVOKGxlbikgKyAyOworCSAgICAgICBicmVhazsKKyAgICAgICBjYXNlIFJQQ19HU1NfU1ZDX0lOVEVHUklUWToKKwkgICAgICAgLyogdmVyaWZpZXIgZGF0YSwgZmxhdm9yLCBsZW5ndGgsIGxlbmd0aCwgc2VxdWVuY2UgbnVtYmVyOiAqLworCSAgICAgICB0YXNrLT50a19hdXRoLT5hdV9yc2xhY2sgPSBYRFJfUVVBRExFTihsZW4pICsgNDsKKwkgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSBSUENfR1NTX1NWQ19QUklWQUNZOgorCSAgICAgICBnb3RvIG91dF9iYWQ7CisgICAgICAgfQorCWdzc19wdXRfY3R4KGN0eCk7CisJZHByaW50aygiUlBDOiAlNHUgR1NTIGdzc192YWxpZGF0ZTogZ3NzX3ZlcmlmeV9taWMgc3VjY2VlZGVkLlxuIiwKKwkJCXRhc2stPnRrX3BpZCk7CisJcmV0dXJuIHAgKyBYRFJfUVVBRExFTihsZW4pOworb3V0X2JhZDoKKwlnc3NfcHV0X2N0eChjdHgpOworCWRwcmludGsoIlJQQzogJTR1IGdzc192YWxpZGF0ZSBmYWlsZWQuXG4iLCB0YXNrLT50a19waWQpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGludAorZ3NzX3dyYXBfcmVxX2ludGVnKHN0cnVjdCBycGNfY3JlZCAqY3JlZCwgc3RydWN0IGdzc19jbF9jdHggKmN0eCwKKwkJa3hkcnByb2NfdCBlbmNvZGUsIHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgdm9pZCAqb2JqKQoreworCXN0cnVjdCB4ZHJfYnVmCSpzbmRfYnVmID0gJnJxc3RwLT5ycV9zbmRfYnVmOworCXN0cnVjdCB4ZHJfYnVmCWludGVnX2J1ZjsKKwl1MzIgICAgICAgICAgICAgKmludGVnX2xlbiA9IE5VTEw7CisJc3RydWN0IHhkcl9uZXRvYmogbWljOworCXUzMgkJb2Zmc2V0LCAqcTsKKwlzdHJ1Y3Qga3ZlYwkqaW92OworCXUzMiAgICAgICAgICAgICBtYWpfc3RhdCA9IDA7CisJaW50CQlzdGF0dXMgPSAtRUlPOworCisJaW50ZWdfbGVuID0gcCsrOworCW9mZnNldCA9ICh1OCAqKXAgLSAodTggKilzbmRfYnVmLT5oZWFkWzBdLmlvdl9iYXNlOworCSpwKysgPSBodG9ubChycXN0cC0+cnFfc2Vxbm8pOworCisJc3RhdHVzID0gZW5jb2RlKHJxc3RwLCBwLCBvYmopOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisKKwlpZiAoeGRyX2J1Zl9zdWJzZWdtZW50KHNuZF9idWYsICZpbnRlZ19idWYsCisJCQkJb2Zmc2V0LCBzbmRfYnVmLT5sZW4gLSBvZmZzZXQpKQorCQlyZXR1cm4gc3RhdHVzOworCSppbnRlZ19sZW4gPSBodG9ubChpbnRlZ19idWYubGVuKTsKKworCS8qIGd1ZXNzIHdoZXRoZXIgd2UncmUgaW4gdGhlIGhlYWQgb3IgdGhlIHRhaWw6ICovCisJaWYgKHNuZF9idWYtPnBhZ2VfbGVuIHx8IHNuZF9idWYtPnRhaWxbMF0uaW92X2xlbikgCisJCWlvdiA9IHNuZF9idWYtPnRhaWw7CisJZWxzZQorCQlpb3YgPSBzbmRfYnVmLT5oZWFkOworCXAgPSBpb3YtPmlvdl9iYXNlICsgaW92LT5pb3ZfbGVuOworCW1pYy5kYXRhID0gKHU4ICopKHAgKyAxKTsKKworCW1hal9zdGF0ID0gZ3NzX2dldF9taWMoY3R4LT5nY19nc3NfY3R4LAorCQkJR1NTX0NfUU9QX0RFRkFVTFQsICZpbnRlZ19idWYsICZtaWMpOworCXN0YXR1cyA9IC1FSU87IC8qIFhYWD8gKi8KKwlpZiAobWFqX3N0YXQgPT0gR1NTX1NfQ09OVEVYVF9FWFBJUkVEKQorCQljcmVkLT5jcl9mbGFncyAmPSB+UlBDQVVUSF9DUkVEX1VQVE9EQVRFOworCWVsc2UgaWYgKG1hal9zdGF0KQorCQlyZXR1cm4gc3RhdHVzOworCXEgPSB4ZHJfZW5jb2RlX29wYXF1ZShwLCBOVUxMLCBtaWMubGVuKTsKKworCW9mZnNldCA9ICh1OCAqKXEgLSAodTggKilwOworCWlvdi0+aW92X2xlbiArPSBvZmZzZXQ7CisJc25kX2J1Zi0+bGVuICs9IG9mZnNldDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZ3NzX3dyYXBfcmVxKHN0cnVjdCBycGNfdGFzayAqdGFzaywKKwkgICAgIGt4ZHJwcm9jX3QgZW5jb2RlLCB2b2lkICpycXN0cCwgdTMyICpwLCB2b2lkICpvYmopCit7CisJc3RydWN0IHJwY19jcmVkICpjcmVkID0gdGFzay0+dGtfbXNnLnJwY19jcmVkOworCXN0cnVjdCBnc3NfY3JlZAkqZ3NzX2NyZWQgPSBjb250YWluZXJfb2YoY3JlZCwgc3RydWN0IGdzc19jcmVkLAorCQkJZ2NfYmFzZSk7CisJc3RydWN0IGdzc19jbF9jdHggKmN0eCA9IGdzc19jcmVkX2dldF9jdHgoY3JlZCk7CisJaW50ICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU87CisKKwlkcHJpbnRrKCJSUEM6ICU0dSBnc3Nfd3JhcF9yZXFcbiIsIHRhc2stPnRrX3BpZCk7CisJaWYgKGN0eC0+Z2NfcHJvYyAhPSBSUENfR1NTX1BST0NfREFUQSkgeworCQkvKiBUaGUgc3BlYyBzZWVtcyBhIGxpdHRsZSBhbWJpZ3VvdXMgaGVyZSwgYnV0IEkgdGhpbmsgdGhhdCBub3QKKwkJICogd3JhcHBpbmcgY29udGV4dCBkZXN0cnVjdGlvbiByZXF1ZXN0cyBtYWtlcyB0aGUgbW9zdCBzZW5zZS4KKwkJICovCisJCXN0YXR1cyA9IGVuY29kZShycXN0cCwgcCwgb2JqKTsKKwkJZ290byBvdXQ7CisJfQorCXN3aXRjaCAoZ3NzX2NyZWQtPmdjX3NlcnZpY2UpIHsKKwkJY2FzZSBSUENfR1NTX1NWQ19OT05FOgorCQkJc3RhdHVzID0gZW5jb2RlKHJxc3RwLCBwLCBvYmopOworCQkJYnJlYWs7CisJCWNhc2UgUlBDX0dTU19TVkNfSU5URUdSSVRZOgorCQkJc3RhdHVzID0gZ3NzX3dyYXBfcmVxX2ludGVnKGNyZWQsIGN0eCwgZW5jb2RlLAorCQkJCQkJCQlycXN0cCwgcCwgb2JqKTsKKwkJCWJyZWFrOworICAgICAgIAkJY2FzZSBSUENfR1NTX1NWQ19QUklWQUNZOgorCQkJYnJlYWs7CisJfQorb3V0OgorCWdzc19wdXRfY3R4KGN0eCk7CisJZHByaW50aygiUlBDOiAlNHUgZ3NzX3dyYXBfcmVxIHJldHVybmluZyAlZFxuIiwgdGFzay0+dGtfcGlkLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citnc3NfdW53cmFwX3Jlc3BfaW50ZWcoc3RydWN0IHJwY19jcmVkICpjcmVkLCBzdHJ1Y3QgZ3NzX2NsX2N0eCAqY3R4LAorCQlzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1MzIgKipwKQoreworCXN0cnVjdCB4ZHJfYnVmCSpyY3ZfYnVmID0gJnJxc3RwLT5ycV9yY3ZfYnVmOworCXN0cnVjdCB4ZHJfYnVmIGludGVnX2J1ZjsKKwlzdHJ1Y3QgeGRyX25ldG9iaiBtaWM7CisJdTMyIGRhdGFfb2Zmc2V0LCBtaWNfb2Zmc2V0OworCXUzMiBpbnRlZ19sZW47CisJdTMyIG1hal9zdGF0OworCWludCBzdGF0dXMgPSAtRUlPOworCisJaW50ZWdfbGVuID0gbnRvaGwoKigqcCkrKyk7CisJaWYgKGludGVnX2xlbiAmIDMpCisJCXJldHVybiBzdGF0dXM7CisJZGF0YV9vZmZzZXQgPSAodTggKikoKnApIC0gKHU4ICopcmN2X2J1Zi0+aGVhZFswXS5pb3ZfYmFzZTsKKwltaWNfb2Zmc2V0ID0gaW50ZWdfbGVuICsgZGF0YV9vZmZzZXQ7CisJaWYgKG1pY19vZmZzZXQgPiByY3ZfYnVmLT5sZW4pCisJCXJldHVybiBzdGF0dXM7CisJaWYgKG50b2hsKCooKnApKyspICE9IHJxc3RwLT5ycV9zZXFubykKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmICh4ZHJfYnVmX3N1YnNlZ21lbnQocmN2X2J1ZiwgJmludGVnX2J1ZiwgZGF0YV9vZmZzZXQsCisJCQkJbWljX29mZnNldCAtIGRhdGFfb2Zmc2V0KSkKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmICh4ZHJfYnVmX3JlYWRfbmV0b2JqKHJjdl9idWYsICZtaWMsIG1pY19vZmZzZXQpKQorCQlyZXR1cm4gc3RhdHVzOworCisJbWFqX3N0YXQgPSBnc3NfdmVyaWZ5X21pYyhjdHgtPmdjX2dzc19jdHgsICZpbnRlZ19idWYsCisJCQkmbWljLCBOVUxMKTsKKwlpZiAobWFqX3N0YXQgPT0gR1NTX1NfQ09OVEVYVF9FWFBJUkVEKQorCQljcmVkLT5jcl9mbGFncyAmPSB+UlBDQVVUSF9DUkVEX1VQVE9EQVRFOworCWlmIChtYWpfc3RhdCAhPSBHU1NfU19DT01QTEVURSkKKwkJcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZ3NzX3Vud3JhcF9yZXNwKHN0cnVjdCBycGNfdGFzayAqdGFzaywKKwkJa3hkcnByb2NfdCBkZWNvZGUsIHZvaWQgKnJxc3RwLCB1MzIgKnAsIHZvaWQgKm9iaikKK3sKKwlzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQgPSB0YXNrLT50a19tc2cucnBjX2NyZWQ7CisJc3RydWN0IGdzc19jcmVkICpnc3NfY3JlZCA9IGNvbnRhaW5lcl9vZihjcmVkLCBzdHJ1Y3QgZ3NzX2NyZWQsCisJCQlnY19iYXNlKTsKKwlzdHJ1Y3QgZ3NzX2NsX2N0eCAqY3R4ID0gZ3NzX2NyZWRfZ2V0X2N0eChjcmVkKTsKKwlpbnQgICAgICAgICAgICAgc3RhdHVzID0gLUVJTzsKKworCWlmIChjdHgtPmdjX3Byb2MgIT0gUlBDX0dTU19QUk9DX0RBVEEpCisJCWdvdG8gb3V0X2RlY29kZTsKKwlzd2l0Y2ggKGdzc19jcmVkLT5nY19zZXJ2aWNlKSB7CisJCWNhc2UgUlBDX0dTU19TVkNfTk9ORToKKwkJCWJyZWFrOworCQljYXNlIFJQQ19HU1NfU1ZDX0lOVEVHUklUWToKKwkJCXN0YXR1cyA9IGdzc191bndyYXBfcmVzcF9pbnRlZyhjcmVkLCBjdHgsIHJxc3RwLCAmcCk7CisJCQlpZiAoc3RhdHVzKQorCQkJCWdvdG8gb3V0OworCQkJYnJlYWs7CisgICAgICAgCQljYXNlIFJQQ19HU1NfU1ZDX1BSSVZBQ1k6CisJCQlicmVhazsKKwl9CitvdXRfZGVjb2RlOgorCXN0YXR1cyA9IGRlY29kZShycXN0cCwgcCwgb2JqKTsKK291dDoKKwlnc3NfcHV0X2N0eChjdHgpOworCWRwcmludGsoIlJQQzogJTR1IGdzc191bndyYXBfcmVzcCByZXR1cm5pbmcgJWRcbiIsIHRhc2stPnRrX3BpZCwKKwkJCXN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKyAgCitzdGF0aWMgc3RydWN0IHJwY19hdXRob3BzIGF1dGhnc3Nfb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuYXVfZmxhdm9yCT0gUlBDX0FVVEhfR1NTLAorI2lmZGVmIFJQQ19ERUJVRworCS5hdV9uYW1lCT0gIlJQQ1NFQ19HU1MiLAorI2VuZGlmCisJLmNyZWF0ZQkJPSBnc3NfY3JlYXRlLAorCS5kZXN0cm95CT0gZ3NzX2Rlc3Ryb3ksCisJLmxvb2t1cF9jcmVkCT0gZ3NzX2xvb2t1cF9jcmVkLAorCS5jcmNyZWF0ZQk9IGdzc19jcmVhdGVfY3JlZAorfTsKKworc3RhdGljIHN0cnVjdCBycGNfY3JlZG9wcyBnc3NfY3JlZG9wcyA9IHsKKwkuY3JfbmFtZQk9ICJBVVRIX0dTUyIsCisJLmNyZGVzdHJveQk9IGdzc19kZXN0cm95X2NyZWQsCisJLmNybWF0Y2gJPSBnc3NfbWF0Y2gsCisJLmNybWFyc2hhbAk9IGdzc19tYXJzaGFsLAorCS5jcnJlZnJlc2gJPSBnc3NfcmVmcmVzaCwKKwkuY3J2YWxpZGF0ZQk9IGdzc192YWxpZGF0ZSwKKwkuY3J3cmFwX3JlcQk9IGdzc193cmFwX3JlcSwKKwkuY3J1bndyYXBfcmVzcAk9IGdzc191bndyYXBfcmVzcCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcnBjX3BpcGVfb3BzIGdzc191cGNhbGxfb3BzID0geworCS51cGNhbGwJCT0gZ3NzX3BpcGVfdXBjYWxsLAorCS5kb3duY2FsbAk9IGdzc19waXBlX2Rvd25jYWxsLAorCS5kZXN0cm95X21zZwk9IGdzc19waXBlX2Rlc3Ryb3lfbXNnLAorCS5yZWxlYXNlX3BpcGUJPSBnc3NfcGlwZV9yZWxlYXNlLAorfTsKKworLyoKKyAqIEluaXRpYWxpemUgUlBDU0VDX0dTUyBtb2R1bGUKKyAqLworc3RhdGljIGludCBfX2luaXQgaW5pdF9ycGNzZWNfZ3NzKHZvaWQpCit7CisJaW50IGVyciA9IDA7CisKKwllcnIgPSBycGNhdXRoX3JlZ2lzdGVyKCZhdXRoZ3NzX29wcyk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gZ3NzX3N2Y19pbml0KCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5yZWdpc3RlcjsKKwlyZXR1cm4gMDsKK291dF91bnJlZ2lzdGVyOgorCXJwY2F1dGhfdW5yZWdpc3RlcigmYXV0aGdzc19vcHMpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3JwY3NlY19nc3Modm9pZCkKK3sKKwlnc3Nfc3ZjX3NodXRkb3duKCk7CisJcnBjYXV0aF91bnJlZ2lzdGVyKCZhdXRoZ3NzX29wcyk7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9pbml0KGluaXRfcnBjc2VjX2dzcykKK21vZHVsZV9leGl0KGV4aXRfcnBjc2VjX2dzcykKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2dlbmVyaWNfdG9rZW4uYyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2dlbmVyaWNfdG9rZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjZkZjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3NfZ2VuZXJpY190b2tlbi5jCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogIGxpbnV4L25ldC9zdW5ycGMvZ3NzX2dlbmVyaWNfdG9rZW4uYworICoKKyAqICBBZGFwdGVkIGZyb20gTUlUIEtlcmJlcm9zIDUtMS4yLjEgbGliL2dzc2FwaS9nZW5lcmljL3V0aWxfdG9rZW4uYworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgQW5keSBBZGFtc29uICAgPGFuZHJvc0B1bWljaC5lZHU+CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAxOTkzIGJ5IE9wZW5WaXNpb24gVGVjaG5vbG9naWVzLCBJbmMuCisgKiAKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIE9wZW5WaXNpb24gbm90IGJlIHVzZWQKKyAqIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyAqIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gT3BlblZpc2lvbiBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICogCisgKiBPUEVOVklTSU9OIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworICogRVZFTlQgU0hBTEwgT1BFTlZJU0lPTiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorICogVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisgKiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZ3NzX2FzbjEuaD4KKworCisjaWZkZWYgUlBDX0RFQlVHCisjIGRlZmluZSBSUENEQkdfRkFDSUxJVFkgICAgICAgIFJQQ0RCR19BVVRICisjZW5kaWYKKworCisvKiBUV1JJVEVfU1RSIGZyb20gZ3NzYXBpUF9nZW5lcmljLmggKi8KKyNkZWZpbmUgVFdSSVRFX1NUUihwdHIsIHN0ciwgbGVuKSBcCisJbWVtY3B5KChwdHIpLCAoY2hhciAqKSAoc3RyKSwgKGxlbikpOyBcCisJKHB0cikgKz0gKGxlbik7CisKKy8qIFhYWFggdGhpcyBjb2RlIGN1cnJlbnRseSBtYWtlcyB0aGUgYXNzdW1wdGlvbiB0aGF0IGEgbWVjaCBvaWQgd2lsbAorICAgbmV2ZXIgYmUgbG9uZ2VyIHRoYW4gMTI3IGJ5dGVzLiAgVGhpcyBhc3N1bXB0aW9uIGlzIG5vdCBpbmhlcmVudCBpbgorICAgdGhlIGludGVyZmFjZXMsIHNvIHRoZSBjb2RlIGNhbiBiZSBmaXhlZCBpZiB0aGUgT1NJIG5hbWVzcGFjZQorICAgYmFsbG9vbnMgdW5leHBlY3RlZGx5LiAqLworCisvKiBFYWNoIHRva2VuIGxvb2tzIGxpa2UgdGhpczoKKworMHg2MAkJCQl0YWcgZm9yIEFQUExJQ0FUSU9OIDAsIFNFUVVFTkNFCisJCQkJCShjb25zdHJ1Y3RlZCwgZGVmaW5pdGUtbGVuZ3RoKQorCTxsZW5ndGg+CQlwb3NzaWJsZSBtdWx0aXBsZSBieXRlcywgbmVlZCB0byBwYXJzZS9nZW5lcmF0ZQorCTB4MDYJCQl0YWcgZm9yIE9CSkVDVCBJREVOVElGSUVSCisJCTxtb2lkX2xlbmd0aD4JY29tcGlsZS10aW1lIGNvbnN0YW50IHN0cmluZyAoYXNzdW1lIDEgYnl0ZSkKKwkJPG1vaWRfYnl0ZXM+CWNvbXBpbGUtdGltZSBjb25zdGFudCBzdHJpbmcKKwk8aW5uZXJfYnl0ZXM+CQl0aGUgQU5ZIGNvbnRhaW5pbmcgdGhlIGFwcGxpY2F0aW9uIHRva2VuCisJCQkJCWJ5dGVzIDAsMSBhcmUgdGhlIHRva2VuIHR5cGUKKwkJCQkJYnl0ZXMgMixuIGFyZSB0aGUgdG9rZW4gZGF0YQorCitGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgYWJzdHJhY3Rpb24sIHRoZSB0b2tlbiAiaGVhZGVyIiBjb25zaXN0cyBvZgordGhlIHNlcXVlbmNlIHRhZyBhbmQgbGVuZ3RoIG9jdGV0cywgdGhlIG1lY2ggT0lEIERFUiBlbmNvZGluZywgYW5kIHRoZQorZmlyc3QgdHdvIGlubmVyIGJ5dGVzLCB3aGljaCBpbmRpY2F0ZSB0aGUgdG9rZW4gdHlwZS4gIFRoZSB0b2tlbgorImJvZHkiIGNvbnNpc3RzIG9mIGV2ZXJ5dGhpbmcgZWxzZS4KKworKi8KKworc3RhdGljIGludAorZGVyX2xlbmd0aF9zaXplKCBpbnQgbGVuZ3RoKQoreworCWlmIChsZW5ndGggPCAoMTw8NykpCisJCXJldHVybigxKTsKKwllbHNlIGlmIChsZW5ndGggPCAoMTw8OCkpCisJCXJldHVybigyKTsKKyNpZiAoU0laRU9GX0lOVCA9PSAyKQorCWVsc2UKKwkJcmV0dXJuKDMpOworI2Vsc2UKKwllbHNlIGlmIChsZW5ndGggPCAoMTw8MTYpKQorCQlyZXR1cm4oMyk7CisJZWxzZSBpZiAobGVuZ3RoIDwgKDE8PDI0KSkKKwkJcmV0dXJuKDQpOworCWVsc2UKKwkJcmV0dXJuKDUpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCitkZXJfd3JpdGVfbGVuZ3RoKHVuc2lnbmVkIGNoYXIgKipidWYsIGludCBsZW5ndGgpCit7CisJaWYgKGxlbmd0aCA8ICgxPDw3KSkgeworCQkqKCpidWYpKysgPSAodW5zaWduZWQgY2hhcikgbGVuZ3RoOworCX0gZWxzZSB7CisJCSooKmJ1ZikrKyA9ICh1bnNpZ25lZCBjaGFyKSAoZGVyX2xlbmd0aF9zaXplKGxlbmd0aCkrMTI3KTsKKyNpZiAoU0laRU9GX0lOVCA+IDIpCisJCWlmIChsZW5ndGggPj0gKDE8PDI0KSkKKwkJCSooKmJ1ZikrKyA9ICh1bnNpZ25lZCBjaGFyKSAobGVuZ3RoPj4yNCk7CisJCWlmIChsZW5ndGggPj0gKDE8PDE2KSkKKwkJCSooKmJ1ZikrKyA9ICh1bnNpZ25lZCBjaGFyKSAoKGxlbmd0aD4+MTYpJjB4ZmYpOworI2VuZGlmCisJCWlmIChsZW5ndGggPj0gKDE8PDgpKQorCQkJKigqYnVmKSsrID0gKHVuc2lnbmVkIGNoYXIpICgobGVuZ3RoPj44KSYweGZmKTsKKwkJKigqYnVmKSsrID0gKHVuc2lnbmVkIGNoYXIpIChsZW5ndGgmMHhmZik7CisJfQorfQorCisvKiByZXR1cm5zIGRlY29kZWQgbGVuZ3RoLCBvciA8IDAgb24gZmFpbHVyZS4gIEFkdmFuY2VzIGJ1ZiBhbmQKKyAgIGRlY3JlbWVudHMgYnVmc2l6ZSAqLworCitzdGF0aWMgaW50CitkZXJfcmVhZF9sZW5ndGgodW5zaWduZWQgY2hhciAqKmJ1ZiwgaW50ICpidWZzaXplKQoreworCXVuc2lnbmVkIGNoYXIgc2Y7CisJaW50IHJldDsKKworCWlmICgqYnVmc2l6ZSA8IDEpCisJCXJldHVybigtMSk7CisJc2YgPSAqKCpidWYpKys7CisJKCpidWZzaXplKS0tOworCWlmIChzZiAmIDB4ODApIHsKKwkJaWYgKChzZiAmPSAweDdmKSA+ICgoKmJ1ZnNpemUpLTEpKQorCQkJcmV0dXJuKC0xKTsKKwkJaWYgKHNmID4gU0laRU9GX0lOVCkKKwkJCXJldHVybiAoLTEpOworCQlyZXQgPSAwOworCQlmb3IgKDsgc2Y7IHNmLS0pIHsKKwkJCXJldCA9IChyZXQ8PDgpICsgKCooKmJ1ZikrKyk7CisJCQkoKmJ1ZnNpemUpLS07CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSBzZjsKKwl9CisKKwlyZXR1cm4ocmV0KTsKK30KKworLyogcmV0dXJucyB0aGUgbGVuZ3RoIG9mIGEgdG9rZW4sIGdpdmVuIHRoZSBtZWNoIG9pZCBhbmQgdGhlIGJvZHkgc2l6ZSAqLworCitpbnQKK2dfdG9rZW5fc2l6ZShzdHJ1Y3QgeGRyX25ldG9iaiAqbWVjaCwgdW5zaWduZWQgaW50IGJvZHlfc2l6ZSkKK3sKKwkvKiBzZXQgYm9keV9zaXplIHRvIHNlcXVlbmNlIGNvbnRlbnRzIHNpemUgKi8KKwlib2R5X3NpemUgKz0gNCArIChpbnQpIG1lY2gtPmxlbjsgICAgICAgICAvKiBORUVEIG92ZXJmbG93IGNoZWNrICovCisJcmV0dXJuKDEgKyBkZXJfbGVuZ3RoX3NpemUoYm9keV9zaXplKSArIGJvZHlfc2l6ZSk7Cit9CisKK0VYUE9SVF9TWU1CT0woZ190b2tlbl9zaXplKTsKKworLyogZmlsbHMgaW4gYSBidWZmZXIgd2l0aCB0aGUgdG9rZW4gaGVhZGVyLiAgVGhlIGJ1ZmZlciBpcyBhc3N1bWVkIHRvCisgICBiZSB0aGUgcmlnaHQgc2l6ZS4gIGJ1ZiBpcyBhZHZhbmNlZCBwYXN0IHRoZSB0b2tlbiBoZWFkZXIgKi8KKwordm9pZAorZ19tYWtlX3Rva2VuX2hlYWRlcihzdHJ1Y3QgeGRyX25ldG9iaiAqbWVjaCwgaW50IGJvZHlfc2l6ZSwgdW5zaWduZWQgY2hhciAqKmJ1ZikKK3sKKwkqKCpidWYpKysgPSAweDYwOworCWRlcl93cml0ZV9sZW5ndGgoYnVmLCA0ICsgbWVjaC0+bGVuICsgYm9keV9zaXplKTsKKwkqKCpidWYpKysgPSAweDA2OworCSooKmJ1ZikrKyA9ICh1bnNpZ25lZCBjaGFyKSBtZWNoLT5sZW47CisJVFdSSVRFX1NUUigqYnVmLCBtZWNoLT5kYXRhLCAoKGludCkgbWVjaC0+bGVuKSk7Cit9CisKK0VYUE9SVF9TWU1CT0woZ19tYWtlX3Rva2VuX2hlYWRlcik7CisKKy8qCisgKiBHaXZlbiBhIGJ1ZmZlciBjb250YWluaW5nIGEgdG9rZW4sIHJlYWRzIGFuZCB2ZXJpZmllcyB0aGUgdG9rZW4sCisgKiBsZWF2aW5nIGJ1ZiBhZHZhbmNlZCBwYXN0IHRoZSB0b2tlbiBoZWFkZXIsIGFuZCBzZXR0aW5nIGJvZHlfc2l6ZQorICogdG8gdGhlIG51bWJlciBvZiByZW1haW5pbmcgYnl0ZXMuICBSZXR1cm5zIDAgb24gc3VjY2VzcywKKyAqIEdfQkFEX1RPS19IRUFERVIgZm9yIGEgdmFyaWV0eSBvZiBlcnJvcnMsIGFuZCBHX1dST05HX01FQ0ggaWYgdGhlCisgKiBtZWNoYW5pc20gaW4gdGhlIHRva2VuIGRvZXMgbm90IG1hdGNoIHRoZSBtZWNoIGFyZ3VtZW50LiAgYnVmIGFuZAorICogKmJvZHlfc2l6ZSBhcmUgbGVmdCB1bm1vZGlmaWVkIG9uIGVycm9yLgorICovCit1MzIKK2dfdmVyaWZ5X3Rva2VuX2hlYWRlcihzdHJ1Y3QgeGRyX25ldG9iaiAqbWVjaCwgaW50ICpib2R5X3NpemUsCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgKipidWZfaW4sIGludCB0b2tzaXplKQoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9ICpidWZfaW47CisJaW50IHNlcXNpemU7CisJc3RydWN0IHhkcl9uZXRvYmogdG9pZDsKKwlpbnQgcmV0ID0gMDsKKworCWlmICgodG9rc2l6ZS09MSkgPCAwKQorCQlyZXR1cm4oR19CQURfVE9LX0hFQURFUik7CisJaWYgKCpidWYrKyAhPSAweDYwKQorCQlyZXR1cm4oR19CQURfVE9LX0hFQURFUik7CisKKwlpZiAoKHNlcXNpemUgPSBkZXJfcmVhZF9sZW5ndGgoJmJ1ZiwgJnRva3NpemUpKSA8IDApCisJCXJldHVybihHX0JBRF9UT0tfSEVBREVSKTsKKworCWlmIChzZXFzaXplICE9IHRva3NpemUpCisJCXJldHVybihHX0JBRF9UT0tfSEVBREVSKTsKKworCWlmICgodG9rc2l6ZS09MSkgPCAwKQorCQlyZXR1cm4oR19CQURfVE9LX0hFQURFUik7CisJaWYgKCpidWYrKyAhPSAweDA2KQorCQlyZXR1cm4oR19CQURfVE9LX0hFQURFUik7CisgCisJaWYgKCh0b2tzaXplLT0xKSA8IDApCisJCXJldHVybihHX0JBRF9UT0tfSEVBREVSKTsKKwl0b2lkLmxlbiA9ICpidWYrKzsKKworCWlmICgodG9rc2l6ZS09dG9pZC5sZW4pIDwgMCkKKwkJcmV0dXJuKEdfQkFEX1RPS19IRUFERVIpOworCXRvaWQuZGF0YSA9IGJ1ZjsKKwlidWYrPXRvaWQubGVuOworCisJaWYgKCEgZ19PSURfZXF1YWwoJnRvaWQsIG1lY2gpKSAKKwkJcmV0ID0gR19XUk9OR19NRUNIOworIAorICAgLyogR19XUk9OR19NRUNIIGlzIG5vdCByZXR1cm5lZCBpbW1lZGlhdGVseSBiZWNhdXNlIGl0J3MgbW9yZSBpbXBvcnRhbnQKKyAgICAgIHRvIHJldHVybiBHX0JBRF9UT0tfSEVBREVSIGlmIHRoZSB0b2tlbiBoZWFkZXIgaXMgaW4gZmFjdCBiYWQgKi8KKworCWlmICgodG9rc2l6ZS09MikgPCAwKQorCQlyZXR1cm4oR19CQURfVE9LX0hFQURFUik7CisKKwlpZiAocmV0KQorCQlyZXR1cm4ocmV0KTsKKworCWlmICghcmV0KSB7CisJCSpidWZfaW4gPSBidWY7CisJCSpib2R5X3NpemUgPSB0b2tzaXplOworCX0KKworCXJldHVybihyZXQpOworfQorCitFWFBPUlRfU1lNQk9MKGdfdmVyaWZ5X3Rva2VuX2hlYWRlcik7CisKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfY3J5cHRvLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X2NyeXB0by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YzIxZjIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X2NyeXB0by5jCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogIGxpbnV4L25ldC9zdW5ycGMvZ3NzX2tyYjVfY3J5cHRvLmMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIEFuZHkgQWRhbXNvbiAgIDxhbmRyb3NAdW1pY2guZWR1PgorICogIEJydWNlIEZpZWxkcyAgIDxiZmllbGRzQHVtaWNoLmVkdT4KKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk4IGJ5IHRoZSBGdW5kc1hwcmVzcywgSU5DLgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRXhwb3J0IG9mIHRoaXMgc29mdHdhcmUgZnJvbSB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIG1heSByZXF1aXJlCisgKiBhIHNwZWNpZmljIGxpY2Vuc2UgZnJvbSB0aGUgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50LiAgSXQgaXMgdGhlCisgKiByZXNwb25zaWJpbGl0eSBvZiBhbnkgcGVyc29uIG9yIG9yZ2FuaXphdGlvbiBjb250ZW1wbGF0aW5nIGV4cG9ydCB0bworICogb2J0YWluIHN1Y2ggYSBsaWNlbnNlIGJlZm9yZSBleHBvcnRpbmcuCisgKgorICogV0lUSElOIFRIQVQgQ09OU1RSQUlOVCwgcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kCisgKiBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQKKyAqIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQKKyAqIHRoZSBuYW1lIG9mIEZ1bmRzWHByZXNzLiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZworICogdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yCisgKiBwZXJtaXNzaW9uLiAgRnVuZHNYcHJlc3MgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZgorICogdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcworICogb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9nc3Nfa3JiNS5oPgorCisjaWZkZWYgUlBDX0RFQlVHCisjIGRlZmluZSBSUENEQkdfRkFDSUxJVFkgICAgICAgIFJQQ0RCR19BVVRICisjZW5kaWYKKwordTMyCitrcmI1X2VuY3J5cHQoCisJc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwl2b2lkICogaXYsCisJdm9pZCAqIGluLAorCXZvaWQgKiBvdXQsCisJaW50IGxlbmd0aCkKK3sKKwl1MzIgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzFdOworCXU4IGxvY2FsX2l2WzE2XSA9IHswfTsKKworCWRwcmludGsoIlJQQzogICAgICBrcmI1X2VuY3J5cHQ6IGlucHV0IGRhdGE6XG4iKTsKKwlwcmludF9oZXhsKCh1MzIgKilpbiwgbGVuZ3RoLCAwKTsKKworCWlmIChsZW5ndGggJSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSAhPSAwKQorCQlnb3RvIG91dDsKKworCWlmIChjcnlwdG9fdGZtX2FsZ19pdnNpemUodGZtKSA+IDE2KSB7CisJCWRwcmludGsoIlJQQzogICAgICBnc3NfazVlbmNyeXB0OiB0Zm0gaXYgc2l6ZSB0byBsYXJnZSAlZFxuIiwKKwkJICAgICAgICAgY3J5cHRvX3RmbV9hbGdfaXZzaXplKHRmbSkpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoaXYpCisJCW1lbWNweShsb2NhbF9pdiwgaXYsIGNyeXB0b190Zm1fYWxnX2l2c2l6ZSh0Zm0pKTsKKworCW1lbWNweShvdXQsIGluLCBsZW5ndGgpOworCXNnWzBdLnBhZ2UgPSB2aXJ0X3RvX3BhZ2Uob3V0KTsKKwlzZ1swXS5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShvdXQpOworCXNnWzBdLmxlbmd0aCA9IGxlbmd0aDsKKworCXJldCA9IGNyeXB0b19jaXBoZXJfZW5jcnlwdF9pdih0Zm0sIHNnLCBzZywgbGVuZ3RoLCBsb2NhbF9pdik7CisKKwlkcHJpbnRrKCJSUEM6ICAgICAga3JiNV9lbmNyeXB0OiBvdXRwdXQgZGF0YTpcbiIpOworCXByaW50X2hleGwoKHUzMiAqKW91dCwgbGVuZ3RoLCAwKTsKK291dDoKKwlkcHJpbnRrKCJSUEM6ICAgICAga3JiNV9lbmNyeXB0IHJldHVybnMgJWRcbiIscmV0KTsKKwlyZXR1cm4ocmV0KTsKK30KKworRVhQT1JUX1NZTUJPTChrcmI1X2VuY3J5cHQpOworCit1MzIKK2tyYjVfZGVjcnlwdCgKKyAgICAgc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgdm9pZCAqIGl2LAorICAgICB2b2lkICogaW4sCisgICAgIHZvaWQgKiBvdXQsCisgICAgIGludCBsZW5ndGgpCit7CisJdTMyIHJldCA9IC1FSU5WQUw7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzFdOworCXU4IGxvY2FsX2l2WzE2XSA9IHswfTsKKworCWRwcmludGsoIlJQQzogICAgICBrcmI1X2RlY3J5cHQ6IGlucHV0IGRhdGE6XG4iKTsKKwlwcmludF9oZXhsKCh1MzIgKilpbiwgbGVuZ3RoLCAwKTsKKworCWlmIChsZW5ndGggJSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSAhPSAwKQorCQlnb3RvIG91dDsKKworCWlmIChjcnlwdG9fdGZtX2FsZ19pdnNpemUodGZtKSA+IDE2KSB7CisJCWRwcmludGsoIlJQQzogICAgICBnc3NfazVkZWNyeXB0OiB0Zm0gaXYgc2l6ZSB0byBsYXJnZSAlZFxuIiwKKwkJCWNyeXB0b190Zm1fYWxnX2l2c2l6ZSh0Zm0pKTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChpdikKKwkJbWVtY3B5KGxvY2FsX2l2LGl2LCBjcnlwdG9fdGZtX2FsZ19pdnNpemUodGZtKSk7CisKKwltZW1jcHkob3V0LCBpbiwgbGVuZ3RoKTsKKwlzZ1swXS5wYWdlID0gdmlydF90b19wYWdlKG91dCk7CisJc2dbMF0ub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2Uob3V0KTsKKwlzZ1swXS5sZW5ndGggPSBsZW5ndGg7CisKKwlyZXQgPSBjcnlwdG9fY2lwaGVyX2RlY3J5cHRfaXYodGZtLCBzZywgc2csIGxlbmd0aCwgbG9jYWxfaXYpOworCisJZHByaW50aygiUlBDOiAgICAgIGtyYjVfZGVjcnlwdDogb3V0cHV0X2RhdGE6XG4iKTsKKwlwcmludF9oZXhsKCh1MzIgKilvdXQsIGxlbmd0aCwgMCk7CitvdXQ6CisJZHByaW50aygiUlBDOiAgICAgIGdzc19rNWRlY3J5cHQgcmV0dXJucyAlZFxuIixyZXQpOworCXJldHVybihyZXQpOworfQorCitFWFBPUlRfU1lNQk9MKGtyYjVfZGVjcnlwdCk7CisKK3N0YXRpYyB2b2lkCitidWZfdG9fc2coc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgY2hhciAqcHRyLCBpbnQgbGVuKSB7CisJc2ctPnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocHRyKTsKKwlzZy0+b2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UocHRyKTsKKwlzZy0+bGVuZ3RoID0gbGVuOworfQorCisvKiBjaGVja3N1bSB0aGUgcGxhaW50ZXh0IGRhdGEgYW5kIGhkcmxlbiBieXRlcyBvZiB0aGUgdG9rZW4gaGVhZGVyICovCitzMzIKK21ha2VfY2hlY2tzdW0oczMyIGNrc3VtdHlwZSwgY2hhciAqaGVhZGVyLCBpbnQgaGRybGVuLCBzdHJ1Y3QgeGRyX2J1ZiAqYm9keSwKKwkJICAgc3RydWN0IHhkcl9uZXRvYmogKmNrc3VtKQoreworCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNrc3VtbmFtZTsKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAgICAgICAgICAgICAgICp0Zm0gPSBOVUxMOyAvKiBYWFggYWRkIHRvIGN0eD8gKi8KKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgICAgICAgICAgICAgIHNnWzFdOworCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IEdTU19TX0ZBSUxVUkU7CisJaW50CQkJCWxlbiwgdGhpc2xlbiwgb2Zmc2V0OworCWludAkJCQlpOworCisJc3dpdGNoIChja3N1bXR5cGUpIHsKKwkJY2FzZSBDS1NVTVRZUEVfUlNBX01ENToKKwkJCWNrc3VtbmFtZSA9ICJtZDUiOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkcHJpbnRrKCJSUEM6ICAgICAga3JiNV9tYWtlX2NoZWNrc3VtOiIKKwkJCQkiIHVuc3VwcG9ydGVkIGNoZWNrc3VtICVkIiwgY2tzdW10eXBlKTsKKwkJCWdvdG8gb3V0OworCX0KKwlpZiAoISh0Zm0gPSBjcnlwdG9fYWxsb2NfdGZtKGNrc3VtbmFtZSwgMCkpKQorCQlnb3RvIG91dDsKKwlja3N1bS0+bGVuID0gY3J5cHRvX3RmbV9hbGdfZGlnZXN0c2l6ZSh0Zm0pOworCWlmICgoY2tzdW0tPmRhdGEgPSBrbWFsbG9jKGNrc3VtLT5sZW4sIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWNyeXB0b19kaWdlc3RfaW5pdCh0Zm0pOworCWJ1Zl90b19zZyhzZywgaGVhZGVyLCBoZHJsZW4pOworCWNyeXB0b19kaWdlc3RfdXBkYXRlKHRmbSwgc2csIDEpOworCWlmIChib2R5LT5oZWFkWzBdLmlvdl9sZW4pIHsKKwkJYnVmX3RvX3NnKHNnLCBib2R5LT5oZWFkWzBdLmlvdl9iYXNlLCBib2R5LT5oZWFkWzBdLmlvdl9sZW4pOworCQljcnlwdG9fZGlnZXN0X3VwZGF0ZSh0Zm0sIHNnLCAxKTsKKwl9CisKKwlsZW4gPSBib2R5LT5wYWdlX2xlbjsKKwlpZiAobGVuICE9IDApIHsKKwkJb2Zmc2V0ID0gYm9keS0+cGFnZV9iYXNlICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCQlpID0gYm9keS0+cGFnZV9iYXNlID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJCXRoaXNsZW4gPSBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQ7CisJCWRvIHsKKwkJCWlmICh0aGlzbGVuID4gbGVuKQorCQkJCXRoaXNsZW4gPSBsZW47CisJCQlzZy0+cGFnZSA9IGJvZHktPnBhZ2VzW2ldOworCQkJc2ctPm9mZnNldCA9IG9mZnNldDsKKwkJCXNnLT5sZW5ndGggPSB0aGlzbGVuOworCQkJa21hcChzZy0+cGFnZSk7IC8qIFhYWCBrbWFwX2F0b21pYz8gKi8KKwkJCWNyeXB0b19kaWdlc3RfdXBkYXRlKHRmbSwgc2csIDEpOworCQkJa3VubWFwKHNnLT5wYWdlKTsKKwkJCWxlbiAtPSB0aGlzbGVuOworCQkJaSsrOworCQkJb2Zmc2V0ID0gMDsKKwkJCXRoaXNsZW4gPSBQQUdFX0NBQ0hFX1NJWkU7CisJCX0gd2hpbGUobGVuICE9IDApOworCX0KKwlpZiAoYm9keS0+dGFpbFswXS5pb3ZfbGVuKSB7CisJCWJ1Zl90b19zZyhzZywgYm9keS0+dGFpbFswXS5pb3ZfYmFzZSwgYm9keS0+dGFpbFswXS5pb3ZfbGVuKTsKKwkJY3J5cHRvX2RpZ2VzdF91cGRhdGUodGZtLCBzZywgMSk7CisJfQorCWNyeXB0b19kaWdlc3RfZmluYWwodGZtLCBja3N1bS0+ZGF0YSk7CisJY29kZSA9IDA7CitvdXQ6CisJaWYgKHRmbSkKKwkJY3J5cHRvX2ZyZWVfdGZtKHRmbSk7CisJcmV0dXJuIGNvZGU7Cit9CisKK0VYUE9SVF9TWU1CT0wobWFrZV9jaGVja3N1bSk7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X21lY2guYyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfbWVjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNzI2NTEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X21lY2guYwpAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqICBsaW51eC9uZXQvc3VucnBjL2dzc19rcmI1X21lY2guYworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgQW5keSBBZGFtc29uIDxhbmRyb3NAdW1pY2guZWR1PgorICogIEouIEJydWNlIEZpZWxkcyA8YmZpZWxkc0B1bWljaC5lZHU+CisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2F1dGguaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9nc3Nfa3JiNS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy94ZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKworI2lmZGVmIFJQQ19ERUJVRworIyBkZWZpbmUgUlBDREJHX0ZBQ0lMSVRZCVJQQ0RCR19BVVRICisjZW5kaWYKKworc3RhdGljIGNvbnN0IHZvaWQgKgorc2ltcGxlX2dldF9ieXRlcyhjb25zdCB2b2lkICpwLCBjb25zdCB2b2lkICplbmQsIHZvaWQgKnJlcywgaW50IGxlbikKK3sKKwljb25zdCB2b2lkICpxID0gKGNvbnN0IHZvaWQgKikoKGNvbnN0IGNoYXIgKilwICsgbGVuKTsKKwlpZiAodW5saWtlbHkocSA+IGVuZCB8fCBxIDwgcCkpCisJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOworCW1lbWNweShyZXMsIHAsIGxlbik7CisJcmV0dXJuIHE7Cit9CisKK3N0YXRpYyBjb25zdCB2b2lkICoKK3NpbXBsZV9nZXRfbmV0b2JqKGNvbnN0IHZvaWQgKnAsIGNvbnN0IHZvaWQgKmVuZCwgc3RydWN0IHhkcl9uZXRvYmogKnJlcykKK3sKKwljb25zdCB2b2lkICpxOworCXVuc2lnbmVkIGludCBsZW47CisKKwlwID0gc2ltcGxlX2dldF9ieXRlcyhwLCBlbmQsICZsZW4sIHNpemVvZihsZW4pKTsKKwlpZiAoSVNfRVJSKHApKQorCQlyZXR1cm4gcDsKKwlxID0gKGNvbnN0IHZvaWQgKikoKGNvbnN0IGNoYXIgKilwICsgbGVuKTsKKwlpZiAodW5saWtlbHkocSA+IGVuZCB8fCBxIDwgcCkpCisJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOworCXJlcy0+ZGF0YSA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkocmVzLT5kYXRhID09IE5VTEwpKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwltZW1jcHkocmVzLT5kYXRhLCBwLCBsZW4pOworCXJlcy0+bGVuID0gbGVuOworCXJldHVybiBxOworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IHZvaWQgKgorZ2V0X2tleShjb25zdCB2b2lkICpwLCBjb25zdCB2b2lkICplbmQsIHN0cnVjdCBjcnlwdG9fdGZtICoqcmVzKQoreworCXN0cnVjdCB4ZHJfbmV0b2JqCWtleTsKKwlpbnQJCQlhbGcsIGFsZ19tb2RlOworCWNoYXIJCQkqYWxnX25hbWU7CisKKwlwID0gc2ltcGxlX2dldF9ieXRlcyhwLCBlbmQsICZhbGcsIHNpemVvZihhbGcpKTsKKwlpZiAoSVNfRVJSKHApKQorCQlnb3RvIG91dF9lcnI7CisJcCA9IHNpbXBsZV9nZXRfbmV0b2JqKHAsIGVuZCwgJmtleSk7CisJaWYgKElTX0VSUihwKSkKKwkJZ290byBvdXRfZXJyOworCisJc3dpdGNoIChhbGcpIHsKKwkJY2FzZSBFTkNUWVBFX0RFU19DQkNfUkFXOgorCQkJYWxnX25hbWUgPSAiZGVzIjsKKwkJCWFsZ19tb2RlID0gQ1JZUFRPX1RGTV9NT0RFX0NCQzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZHByaW50aygiUlBDOiAgICAgIGdldF9rZXk6IHVuc3VwcG9ydGVkIGFsZ29yaXRobSAlZFxuIiwgYWxnKTsKKwkJCWdvdG8gb3V0X2Vycl9mcmVlX2tleTsKKwl9CisJaWYgKCEoKnJlcyA9IGNyeXB0b19hbGxvY190Zm0oYWxnX25hbWUsIGFsZ19tb2RlKSkpCisJCWdvdG8gb3V0X2Vycl9mcmVlX2tleTsKKwlpZiAoY3J5cHRvX2NpcGhlcl9zZXRrZXkoKnJlcywga2V5LmRhdGEsIGtleS5sZW4pKQorCQlnb3RvIG91dF9lcnJfZnJlZV90Zm07CisKKwlrZnJlZShrZXkuZGF0YSk7CisJcmV0dXJuIHA7CisKK291dF9lcnJfZnJlZV90Zm06CisJY3J5cHRvX2ZyZWVfdGZtKCpyZXMpOworb3V0X2Vycl9mcmVlX2tleToKKwlrZnJlZShrZXkuZGF0YSk7CisJcCA9IEVSUl9QVFIoLUVJTlZBTCk7CitvdXRfZXJyOgorCXJldHVybiBwOworfQorCitzdGF0aWMgaW50Citnc3NfaW1wb3J0X3NlY19jb250ZXh0X2tlcmJlcm9zKGNvbnN0IHZvaWQgKnAsCisJCQkJc2l6ZV90IGxlbiwKKwkJCQlzdHJ1Y3QgZ3NzX2N0eCAqY3R4X2lkKQoreworCWNvbnN0IHZvaWQgKmVuZCA9IChjb25zdCB2b2lkICopKChjb25zdCBjaGFyICopcCArIGxlbik7CisJc3RydWN0CWtyYjVfY3R4ICpjdHg7CisKKwlpZiAoIShjdHggPSBrbWFsbG9jKHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCkpKQorCQlnb3RvIG91dF9lcnI7CisJbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKCpjdHgpKTsKKworCXAgPSBzaW1wbGVfZ2V0X2J5dGVzKHAsIGVuZCwgJmN0eC0+aW5pdGlhdGUsIHNpemVvZihjdHgtPmluaXRpYXRlKSk7CisJaWYgKElTX0VSUihwKSkKKwkJZ290byBvdXRfZXJyX2ZyZWVfY3R4OworCXAgPSBzaW1wbGVfZ2V0X2J5dGVzKHAsIGVuZCwgJmN0eC0+c2VlZF9pbml0LCBzaXplb2YoY3R4LT5zZWVkX2luaXQpKTsKKwlpZiAoSVNfRVJSKHApKQorCQlnb3RvIG91dF9lcnJfZnJlZV9jdHg7CisJcCA9IHNpbXBsZV9nZXRfYnl0ZXMocCwgZW5kLCBjdHgtPnNlZWQsIHNpemVvZihjdHgtPnNlZWQpKTsKKwlpZiAoSVNfRVJSKHApKQorCQlnb3RvIG91dF9lcnJfZnJlZV9jdHg7CisJcCA9IHNpbXBsZV9nZXRfYnl0ZXMocCwgZW5kLCAmY3R4LT5zaWduYWxnLCBzaXplb2YoY3R4LT5zaWduYWxnKSk7CisJaWYgKElTX0VSUihwKSkKKwkJZ290byBvdXRfZXJyX2ZyZWVfY3R4OworCXAgPSBzaW1wbGVfZ2V0X2J5dGVzKHAsIGVuZCwgJmN0eC0+c2VhbGFsZywgc2l6ZW9mKGN0eC0+c2VhbGFsZykpOworCWlmIChJU19FUlIocCkpCisJCWdvdG8gb3V0X2Vycl9mcmVlX2N0eDsKKwlwID0gc2ltcGxlX2dldF9ieXRlcyhwLCBlbmQsICZjdHgtPmVuZHRpbWUsIHNpemVvZihjdHgtPmVuZHRpbWUpKTsKKwlpZiAoSVNfRVJSKHApKQorCQlnb3RvIG91dF9lcnJfZnJlZV9jdHg7CisJcCA9IHNpbXBsZV9nZXRfYnl0ZXMocCwgZW5kLCAmY3R4LT5zZXFfc2VuZCwgc2l6ZW9mKGN0eC0+c2VxX3NlbmQpKTsKKwlpZiAoSVNfRVJSKHApKQorCQlnb3RvIG91dF9lcnJfZnJlZV9jdHg7CisJcCA9IHNpbXBsZV9nZXRfbmV0b2JqKHAsIGVuZCwgJmN0eC0+bWVjaF91c2VkKTsKKwlpZiAoSVNfRVJSKHApKQorCQlnb3RvIG91dF9lcnJfZnJlZV9jdHg7CisJcCA9IGdldF9rZXkocCwgZW5kLCAmY3R4LT5lbmMpOworCWlmIChJU19FUlIocCkpCisJCWdvdG8gb3V0X2Vycl9mcmVlX21lY2g7CisJcCA9IGdldF9rZXkocCwgZW5kLCAmY3R4LT5zZXEpOworCWlmIChJU19FUlIocCkpCisJCWdvdG8gb3V0X2Vycl9mcmVlX2tleTE7CisJaWYgKHAgIT0gZW5kKSB7CisJCXAgPSBFUlJfUFRSKC1FRkFVTFQpOworCQlnb3RvIG91dF9lcnJfZnJlZV9rZXkyOworCX0KKworCWN0eF9pZC0+aW50ZXJuYWxfY3R4X2lkID0gY3R4OworCWRwcmludGsoIlJQQzogICAgICBTdWNjZXNmdWxseSBpbXBvcnRlZCBuZXcgY29udGV4dC5cbiIpOworCXJldHVybiAwOworCitvdXRfZXJyX2ZyZWVfa2V5MjoKKwljcnlwdG9fZnJlZV90Zm0oY3R4LT5zZXEpOworb3V0X2Vycl9mcmVlX2tleTE6CisJY3J5cHRvX2ZyZWVfdGZtKGN0eC0+ZW5jKTsKK291dF9lcnJfZnJlZV9tZWNoOgorCWtmcmVlKGN0eC0+bWVjaF91c2VkLmRhdGEpOworb3V0X2Vycl9mcmVlX2N0eDoKKwlrZnJlZShjdHgpOworb3V0X2VycjoKKwlyZXR1cm4gUFRSX0VSUihwKTsKK30KKworc3RhdGljIHZvaWQKK2dzc19kZWxldGVfc2VjX2NvbnRleHRfa2VyYmVyb3Modm9pZCAqaW50ZXJuYWxfY3R4KSB7CisJc3RydWN0IGtyYjVfY3R4ICprY3R4ID0gaW50ZXJuYWxfY3R4OworCisJaWYgKGtjdHgtPnNlcSkKKwkJY3J5cHRvX2ZyZWVfdGZtKGtjdHgtPnNlcSk7CisJaWYgKGtjdHgtPmVuYykKKwkJY3J5cHRvX2ZyZWVfdGZtKGtjdHgtPmVuYyk7CisJaWYgKGtjdHgtPm1lY2hfdXNlZC5kYXRhKQorCQlrZnJlZShrY3R4LT5tZWNoX3VzZWQuZGF0YSk7CisJa2ZyZWUoa2N0eCk7Cit9CisKK3N0YXRpYyB1MzIKK2dzc192ZXJpZnlfbWljX2tlcmJlcm9zKHN0cnVjdCBnc3NfY3R4CQkqY3R4LAorCQkJc3RydWN0IHhkcl9idWYJCSptZXNzYWdlLAorCQkJc3RydWN0IHhkcl9uZXRvYmoJKm1pY190b2tlbiwKKwkJCXUzMgkJCSpxc3RhdGUpIHsKKwl1MzIgbWFqX3N0YXQgPSAwOworCWludCBxb3Bfc3RhdGU7CisJc3RydWN0IGtyYjVfY3R4ICprY3R4ID0gY3R4LT5pbnRlcm5hbF9jdHhfaWQ7CisKKwltYWpfc3RhdCA9IGtyYjVfcmVhZF90b2tlbihrY3R4LCBtaWNfdG9rZW4sIG1lc3NhZ2UsICZxb3Bfc3RhdGUsCisJCQkJICAgS0dfVE9LX01JQ19NU0cpOworCWlmICghbWFqX3N0YXQgJiYgcW9wX3N0YXRlKQorCSAgICAqcXN0YXRlID0gcW9wX3N0YXRlOworCisJZHByaW50aygiUlBDOiAgICAgIGdzc192ZXJpZnlfbWljX2tlcmJlcm9zIHJldHVybmluZyAlZFxuIiwgbWFqX3N0YXQpOworCXJldHVybiBtYWpfc3RhdDsKK30KKworc3RhdGljIHUzMgorZ3NzX2dldF9taWNfa2VyYmVyb3Moc3RydWN0IGdzc19jdHgJKmN0eCwKKwkJICAgICB1MzIJCXFvcCwKKwkJICAgICBzdHJ1Y3QgeGRyX2J1ZiAJKm1lc3NhZ2UsCisJCSAgICAgc3RydWN0IHhkcl9uZXRvYmoJKm1pY190b2tlbikgeworCXUzMiBlcnIgPSAwOworCXN0cnVjdCBrcmI1X2N0eCAqa2N0eCA9IGN0eC0+aW50ZXJuYWxfY3R4X2lkOworCisJZXJyID0ga3JiNV9tYWtlX3Rva2VuKGtjdHgsIHFvcCwgbWVzc2FnZSwgbWljX3Rva2VuLCBLR19UT0tfTUlDX01TRyk7CisKKwlkcHJpbnRrKCJSUEM6ICAgICAgZ3NzX2dldF9taWNfa2VyYmVyb3MgcmV0dXJuaW5nICVkXG4iLGVycik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IGdzc19hcGlfb3BzIGdzc19rZXJiZXJvc19vcHMgPSB7CisJLmdzc19pbXBvcnRfc2VjX2NvbnRleHQJPSBnc3NfaW1wb3J0X3NlY19jb250ZXh0X2tlcmJlcm9zLAorCS5nc3NfZ2V0X21pYwkJPSBnc3NfZ2V0X21pY19rZXJiZXJvcywKKwkuZ3NzX3ZlcmlmeV9taWMJCT0gZ3NzX3ZlcmlmeV9taWNfa2VyYmVyb3MsCisJLmdzc19kZWxldGVfc2VjX2NvbnRleHQJPSBnc3NfZGVsZXRlX3NlY19jb250ZXh0X2tlcmJlcm9zLAorfTsKKworc3RhdGljIHN0cnVjdCBwZl9kZXNjIGdzc19rZXJiZXJvc19wZnNbXSA9IHsKKwlbMF0gPSB7CisJCS5wc2V1ZG9mbGF2b3IgPSBSUENfQVVUSF9HU1NfS1JCNSwKKwkJLnNlcnZpY2UgPSBSUENfR1NTX1NWQ19OT05FLAorCQkubmFtZSA9ICJrcmI1IiwKKwl9LAorCVsxXSA9IHsKKwkJLnBzZXVkb2ZsYXZvciA9IFJQQ19BVVRIX0dTU19LUkI1SSwKKwkJLnNlcnZpY2UgPSBSUENfR1NTX1NWQ19JTlRFR1JJVFksCisJCS5uYW1lID0gImtyYjVpIiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBnc3NfYXBpX21lY2ggZ3NzX2tlcmJlcm9zX21lY2ggPSB7CisJLmdtX25hbWUJPSAia3JiNSIsCisJLmdtX293bmVyCT0gVEhJU19NT0RVTEUsCisJLmdtX29wcwkJPSAmZ3NzX2tlcmJlcm9zX29wcywKKwkuZ21fcGZfbnVtCT0gQVJSQVlfU0laRShnc3Nfa2VyYmVyb3NfcGZzKSwKKwkuZ21fcGZzCQk9IGdzc19rZXJiZXJvc19wZnMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2tlcmJlcm9zX21vZHVsZSh2b2lkKQoreworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBnc3NfbWVjaF9yZWdpc3RlcigmZ3NzX2tlcmJlcm9zX21lY2gpOworCWlmIChzdGF0dXMpCisJCXByaW50aygiRmFpbGVkIHRvIHJlZ2lzdGVyIGtlcmJlcm9zIGdzcyBtZWNoYW5pc20hXG4iKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9rZXJiZXJvc19tb2R1bGUodm9pZCkKK3sKKwlnc3NfbWVjaF91bnJlZ2lzdGVyKCZnc3Nfa2VyYmVyb3NfbWVjaCk7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9pbml0KGluaXRfa2VyYmVyb3NfbW9kdWxlKTsKK21vZHVsZV9leGl0KGNsZWFudXBfa2VyYmVyb3NfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfc2VhbC5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV9zZWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlZWI4NwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfc2VhbC5jCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogIGxpbnV4L25ldC9zdW5ycGMvZ3NzX2tyYjVfc2VhbC5jCisgKgorICogIEFkYXB0ZWQgZnJvbSBNSVQgS2VyYmVyb3MgNS0xLjIuMSBsaWIvZ3NzYXBpL2tyYjUvazVzZWFsLmMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIEFuZHkgQWRhbXNvbgk8YW5kcm9zQHVtaWNoLmVkdT4KKyAqICBKLiBCcnVjZSBGaWVsZHMJPGJmaWVsZHNAdW1pY2guZWR1PgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgMTk5MyBieSBPcGVuVmlzaW9uIFRlY2hub2xvZ2llcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIE9wZW5WaXNpb24gbm90IGJlIHVzZWQKKyAqIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyAqIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gT3BlblZpc2lvbiBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIE9QRU5WSVNJT04gRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisgKiBFVkVOVCBTSEFMTCBPUEVOVklTSU9OIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisgKiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyAqIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBieSB0aGUgRnVuZHNYcHJlc3MsIElOQy4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEV4cG9ydCBvZiB0aGlzIHNvZnR3YXJlIGZyb20gdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSBtYXkgcmVxdWlyZQorICogYSBzcGVjaWZpYyBsaWNlbnNlIGZyb20gdGhlIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudC4gIEl0IGlzIHRoZQorICogcmVzcG9uc2liaWxpdHkgb2YgYW55IHBlcnNvbiBvciBvcmdhbml6YXRpb24gY29udGVtcGxhdGluZyBleHBvcnQgdG8KKyAqIG9idGFpbiBzdWNoIGEgbGljZW5zZSBiZWZvcmUgZXhwb3J0aW5nLgorICoKKyAqIFdJVEhJTiBUSEFUIENPTlNUUkFJTlQsIHBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZAorICogZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kCisgKiB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0CisgKiB0aGUgbmFtZSBvZiBGdW5kc1hwcmVzcy4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcKKyAqIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvcgorICogcGVybWlzc2lvbi4gIEZ1bmRzWHByZXNzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3MKKyAqIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZ3NzX2tyYjUuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKworI2lmZGVmIFJQQ19ERUJVRworIyBkZWZpbmUgUlBDREJHX0ZBQ0lMSVRZICAgICAgICBSUENEQkdfQVVUSAorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50Citnc3Nfa3JiNV9wYWRkaW5nKGludCBibG9ja3NpemUsIGludCBsZW5ndGgpIHsKKwkvKiBNb3N0IG9mIHRoZSBjb2RlIGlzIGJsb2NrLXNpemUgaW5kZXBlbmRlbnQgYnV0IGluIHByYWN0aWNlIHdlCisJICogdXNlIG9ubHkgODogKi8KKwlCVUdfT04oYmxvY2tzaXplICE9IDgpOworCXJldHVybiA4IC0gKGxlbmd0aCAmIDcpOworfQorCit1MzIKK2tyYjVfbWFrZV90b2tlbihzdHJ1Y3Qga3JiNV9jdHggKmN0eCwgaW50IHFvcF9yZXEsCisJCSAgIHN0cnVjdCB4ZHJfYnVmICp0ZXh0LCBzdHJ1Y3QgeGRyX25ldG9iaiAqdG9rZW4sCisJCSAgIGludCB0b2t0eXBlKQoreworCXMzMgkJCWNoZWNrc3VtX3R5cGU7CisJc3RydWN0IHhkcl9uZXRvYmoJbWQ1Y2tzdW0gPSB7LmxlbiA9IDAsIC5kYXRhID0gTlVMTH07CisJaW50CQkJYmxvY2tzaXplID0gMCwgdG1zZ2xlbjsKKwl1bnNpZ25lZCBjaGFyCQkqcHRyLCAqa3JiNV9oZHIsICptc2dfc3RhcnQ7CisJczMyCQkJbm93OworCisJZHByaW50aygiUlBDOiAgICAgZ3NzX2tyYjVfc2VhbFxuIik7CisKKwlub3cgPSBnZXRfc2Vjb25kcygpOworCisJaWYgKHFvcF9yZXEgIT0gMCkKKwkJZ290byBvdXRfZXJyOworCisJc3dpdGNoIChjdHgtPnNpZ25hbGcpIHsKKwkJY2FzZSBTR05fQUxHX0RFU19NQUNfTUQ1OgorCQkJY2hlY2tzdW1fdHlwZSA9IENLU1VNVFlQRV9SU0FfTUQ1OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkcHJpbnRrKCJSUEM6ICAgICAgZ3NzX2tyYjVfc2VhbDogY3R4LT5zaWduYWxnICVkIG5vdCIKKwkJCQkiIHN1cHBvcnRlZFxuIiwgY3R4LT5zaWduYWxnKTsKKwkJCWdvdG8gb3V0X2VycjsKKwl9CisJaWYgKGN0eC0+c2VhbGFsZyAhPSBTRUFMX0FMR19OT05FICYmIGN0eC0+c2VhbGFsZyAhPSBTRUFMX0FMR19ERVMpIHsKKwkJZHByaW50aygiUlBDOiAgICAgIGdzc19rcmI1X3NlYWw6IGN0eC0+c2VhbGFsZyAlZCBub3Qgc3VwcG9ydGVkXG4iLAorCQkJY3R4LT5zZWFsYWxnKTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCWlmICh0b2t0eXBlID09IEtHX1RPS19XUkFQX01TRykgeworCQlibG9ja3NpemUgPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUoY3R4LT5lbmMpOworCQl0bXNnbGVuID0gYmxvY2tzaXplICsgdGV4dC0+bGVuCisJCQkrIGdzc19rcmI1X3BhZGRpbmcoYmxvY2tzaXplLCBibG9ja3NpemUgKyB0ZXh0LT5sZW4pOworCX0gZWxzZSB7CisJCXRtc2dsZW4gPSAwOworCX0KKworCXRva2VuLT5sZW4gPSBnX3Rva2VuX3NpemUoJmN0eC0+bWVjaF91c2VkLCAyMiArIHRtc2dsZW4pOworCisJcHRyID0gdG9rZW4tPmRhdGE7CisJZ19tYWtlX3Rva2VuX2hlYWRlcigmY3R4LT5tZWNoX3VzZWQsIDIyICsgdG1zZ2xlbiwgJnB0cik7CisKKwkqcHRyKysgPSAodW5zaWduZWQgY2hhcikgKCh0b2t0eXBlPj44KSYweGZmKTsKKwkqcHRyKysgPSAodW5zaWduZWQgY2hhcikgKHRva3R5cGUmMHhmZik7CisKKwkvKiBwdHIgbm93IGF0IGJ5dGUgMiBvZiBoZWFkZXIgZGVzY3JpYmVkIGluIHJmYyAxOTY0LCBzZWN0aW9uIDEuMi4xOiAqLworCWtyYjVfaGRyID0gcHRyIC0gMjsKKwltc2dfc3RhcnQgPSBrcmI1X2hkciArIDI0OworCisJKih1MTYgKikoa3JiNV9oZHIgKyAyKSA9IGh0b25zKGN0eC0+c2lnbmFsZyk7CisJbWVtc2V0KGtyYjVfaGRyICsgNCwgMHhmZiwgNCk7CisJaWYgKHRva3R5cGUgPT0gS0dfVE9LX1dSQVBfTVNHKQorCQkqKHUxNiAqKShrcmI1X2hkciArIDQpID0gaHRvbnMoY3R4LT5zZWFsYWxnKTsKKworCWlmICh0b2t0eXBlID09IEtHX1RPS19XUkFQX01TRykgeworCQkvKiBYWFggcmVtb3Zpbmcgc3VwcG9ydCBmb3Igbm93ICovCisJCWdvdG8gb3V0X2VycjsKKwl9IGVsc2UgeyAvKiBTaWduIG9ubHkuICAqLworCQlpZiAobWFrZV9jaGVja3N1bShjaGVja3N1bV90eXBlLCBrcmI1X2hkciwgOCwgdGV4dCwKKwkJCQkgICAgICAgJm1kNWNrc3VtKSkKKwkJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlzd2l0Y2ggKGN0eC0+c2lnbmFsZykgeworCWNhc2UgU0dOX0FMR19ERVNfTUFDX01ENToKKwkJaWYgKGtyYjVfZW5jcnlwdChjdHgtPnNlcSwgTlVMTCwgbWQ1Y2tzdW0uZGF0YSwKKwkJCQkgIG1kNWNrc3VtLmRhdGEsIG1kNWNrc3VtLmxlbikpCisJCQlnb3RvIG91dF9lcnI7CisJCW1lbWNweShrcmI1X2hkciArIDE2LAorCQkgICAgICAgbWQ1Y2tzdW0uZGF0YSArIG1kNWNrc3VtLmxlbiAtIEtSQjVfQ0tTVU1fTEVOR1RILAorCQkgICAgICAgS1JCNV9DS1NVTV9MRU5HVEgpOworCisJCWRwcmludGsoIlJQQzogICAgICBtYWtlX3NlYWxfdG9rZW46IGNrc3VtIGRhdGE6IFxuIik7CisJCXByaW50X2hleGwoKHUzMiAqKSAoa3JiNV9oZHIgKyAxNiksIEtSQjVfQ0tTVU1fTEVOR1RILCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCisJa2ZyZWUobWQ1Y2tzdW0uZGF0YSk7CisKKwlpZiAoKGtyYjVfbWFrZV9zZXFfbnVtKGN0eC0+c2VxLCBjdHgtPmluaXRpYXRlID8gMCA6IDB4ZmYsCisJCQkgICAgICAgY3R4LT5zZXFfc2VuZCwga3JiNV9oZHIgKyAxNiwga3JiNV9oZHIgKyA4KSkpCisJCWdvdG8gb3V0X2VycjsKKworCWN0eC0+c2VxX3NlbmQrKzsKKworCXJldHVybiAoKGN0eC0+ZW5kdGltZSA8IG5vdykgPyBHU1NfU19DT05URVhUX0VYUElSRUQgOiBHU1NfU19DT01QTEVURSk7CitvdXRfZXJyOgorCWlmIChtZDVja3N1bS5kYXRhKSBrZnJlZShtZDVja3N1bS5kYXRhKTsKKwlyZXR1cm4gR1NTX1NfRkFJTFVSRTsKK30KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfc2VxbnVtLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X3NlcW51bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1M2VhZDMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X3NlcW51bS5jCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiAgbGludXgvbmV0L3N1bnJwYy9nc3Nfa3JiNV9zZXFudW0uYworICoKKyAqICBBZGFwdGVkIGZyb20gTUlUIEtlcmJlcm9zIDUtMS4yLjEgbGliL2dzc2FwaS9rcmI1L3V0aWxfc2VxbnVtLmMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIEFuZHkgQWRhbXNvbiAgIDxhbmRyb3NAdW1pY2guZWR1PgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgMTk5MyBieSBPcGVuVmlzaW9uIFRlY2hub2xvZ2llcywgSW5jLgorICogCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBPcGVuVmlzaW9uIG5vdCBiZSB1c2VkCisgKiBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisgKiB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uIE9wZW5WaXNpb24gbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqIAorICogT1BFTlZJU0lPTiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyAqIEVWRU5UIFNIQUxMIE9QRU5WSVNJT04gQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyAqIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorICogT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2dzc19rcmI1Lmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisKKyNpZmRlZiBSUENfREVCVUcKKyMgZGVmaW5lIFJQQ0RCR19GQUNJTElUWSAgICAgICAgUlBDREJHX0FVVEgKKyNlbmRpZgorCitzMzIKK2tyYjVfbWFrZV9zZXFfbnVtKHN0cnVjdCBjcnlwdG9fdGZtICprZXksCisJCWludCBkaXJlY3Rpb24sCisJCXMzMiBzZXFudW0sCisJCXVuc2lnbmVkIGNoYXIgKmNrc3VtLCB1bnNpZ25lZCBjaGFyICpidWYpCit7CisJdW5zaWduZWQgY2hhciBwbGFpbls4XTsKKworCXBsYWluWzBdID0gKHVuc2lnbmVkIGNoYXIpIChzZXFudW0gJiAweGZmKTsKKwlwbGFpblsxXSA9ICh1bnNpZ25lZCBjaGFyKSAoKHNlcW51bSA+PiA4KSAmIDB4ZmYpOworCXBsYWluWzJdID0gKHVuc2lnbmVkIGNoYXIpICgoc2VxbnVtID4+IDE2KSAmIDB4ZmYpOworCXBsYWluWzNdID0gKHVuc2lnbmVkIGNoYXIpICgoc2VxbnVtID4+IDI0KSAmIDB4ZmYpOworCisJcGxhaW5bNF0gPSBkaXJlY3Rpb247CisJcGxhaW5bNV0gPSBkaXJlY3Rpb247CisJcGxhaW5bNl0gPSBkaXJlY3Rpb247CisJcGxhaW5bN10gPSBkaXJlY3Rpb247CisKKwlyZXR1cm4ga3JiNV9lbmNyeXB0KGtleSwgY2tzdW0sIHBsYWluLCBidWYsIDgpOworfQorCitzMzIKK2tyYjVfZ2V0X3NlcV9udW0oc3RydWN0IGNyeXB0b190Zm0gKmtleSwKKwkgICAgICAgdW5zaWduZWQgY2hhciAqY2tzdW0sCisJICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkgICAgICAgaW50ICpkaXJlY3Rpb24sIHMzMiAqIHNlcW51bSkKK3sKKwlzMzIgY29kZTsKKwl1bnNpZ25lZCBjaGFyIHBsYWluWzhdOworCisJZHByaW50aygiUlBDOiAgICAgIGtyYjVfZ2V0X3NlcV9udW06XG4iKTsKKworCWlmICgoY29kZSA9IGtyYjVfZGVjcnlwdChrZXksIGNrc3VtLCBidWYsIHBsYWluLCA4KSkpCisJCXJldHVybiBjb2RlOworCisJaWYgKChwbGFpbls0XSAhPSBwbGFpbls1XSkgfHwgKHBsYWluWzRdICE9IHBsYWluWzZdKQorCQkJCSAgIHx8IChwbGFpbls0XSAhPSBwbGFpbls3XSkpCisJCXJldHVybiAoczMyKUtHX0JBRF9TRVE7CisKKwkqZGlyZWN0aW9uID0gcGxhaW5bNF07CisKKwkqc2VxbnVtID0gKChwbGFpblswXSkgfAorCQkgICAocGxhaW5bMV0gPDwgOCkgfCAocGxhaW5bMl0gPDwgMTYpIHwgKHBsYWluWzNdIDw8IDI0KSk7CisKKwlyZXR1cm4gKDApOworfQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV91bnNlYWwuYyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfdW5zZWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc2N2ZjNQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfdW5zZWFsLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiAgbGludXgvbmV0L3N1bnJwYy9nc3Nfa3JiNV91bnNlYWwuYworICoKKyAqICBBZGFwdGVkIGZyb20gTUlUIEtlcmJlcm9zIDUtMS4yLjEgbGliL2dzc2FwaS9rcmI1L2s1dW5zZWFsLmMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIEFuZHkgQWRhbXNvbiAgIDxhbmRyb3NAdW1pY2guZWR1PgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgMTk5MyBieSBPcGVuVmlzaW9uIFRlY2hub2xvZ2llcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIE9wZW5WaXNpb24gbm90IGJlIHVzZWQKKyAqIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyAqIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gT3BlblZpc2lvbiBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIE9QRU5WSVNJT04gRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisgKiBFVkVOVCBTSEFMTCBPUEVOVklTSU9OIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisgKiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyAqIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBieSB0aGUgRnVuZHNYcHJlc3MsIElOQy4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEV4cG9ydCBvZiB0aGlzIHNvZnR3YXJlIGZyb20gdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSBtYXkgcmVxdWlyZQorICogYSBzcGVjaWZpYyBsaWNlbnNlIGZyb20gdGhlIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudC4gIEl0IGlzIHRoZQorICogcmVzcG9uc2liaWxpdHkgb2YgYW55IHBlcnNvbiBvciBvcmdhbml6YXRpb24gY29udGVtcGxhdGluZyBleHBvcnQgdG8KKyAqIG9idGFpbiBzdWNoIGEgbGljZW5zZSBiZWZvcmUgZXhwb3J0aW5nLgorICoKKyAqIFdJVEhJTiBUSEFUIENPTlNUUkFJTlQsIHBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZAorICogZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kCisgKiB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0CisgKiB0aGUgbmFtZSBvZiBGdW5kc1hwcmVzcy4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcKKyAqIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvcgorICogcGVybWlzc2lvbi4gIEZ1bmRzWHByZXNzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3MKKyAqIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZ3NzX2tyYjUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKworI2lmZGVmIFJQQ19ERUJVRworIyBkZWZpbmUgUlBDREJHX0ZBQ0lMSVRZICAgICAgICBSUENEQkdfQVVUSAorI2VuZGlmCisKKworLyogbWVzc2FnZV9idWZmZXIgaXMgYW4gaW5wdXQgaWYgdG9rdHlwZSBpcyBNSUMgYW5kIGFuIG91dHB1dCBpZiBpdCBpcyBXUkFQOgorICogSWYgdG9rdHlwZSBpcyBNSUM6IHJlYWRfdG9rZW4gaXMgYSBtaWMgdG9rZW4sIGFuZCBtZXNzYWdlX2J1ZmZlciBpcyB0aGUKKyAqICAgZGF0YSB0aGF0IHRoZSBtaWMgd2FzIHN1cHBvc2VkbHkgdGFrZW4gb3Zlci4KKyAqIElmIHRva3R5cGUgaXMgV1JBUDogcmVhZF90b2tlbiBpcyBhIHdyYXAgdG9rZW4sIGFuZCBtZXNzYWdlX2J1ZmZlciBpcyB1c2VkCisgKiAgIHRvIHJldHVybiB0aGUgZGVjcnlwdGVkIGRhdGEuCisgKi8KKworLyogWFhYIHdpbGwgbmVlZCB0byBjaGFuZ2UgcHJvdG90eXBlIGFuZC9vciBqdXN0IHNwbGl0IGludG8gYSBzZXBhcmF0ZSBmdW5jdGlvbgorICogd2hlbiB3ZSBhZGQgcHJpdmFjeSAoYmVjYXVzZSByZWFkX3Rva2VuIHdpbGwgYmUgaW4gcGFnZXMgdG9vKS4gKi8KK3UzMgora3JiNV9yZWFkX3Rva2VuKHN0cnVjdCBrcmI1X2N0eCAqY3R4LAorCQlzdHJ1Y3QgeGRyX25ldG9iaiAqcmVhZF90b2tlbiwKKwkJc3RydWN0IHhkcl9idWYgKm1lc3NhZ2VfYnVmZmVyLAorCQlpbnQgKnFvcF9zdGF0ZSwgaW50IHRva3R5cGUpCit7CisJaW50CQkJc2lnbmFsZzsKKwlpbnQJCQlzZWFsYWxnOworCXMzMgkJCWNoZWNrc3VtX3R5cGU7CisJc3RydWN0IHhkcl9uZXRvYmoJbWQ1Y2tzdW0gPSB7LmxlbiA9IDAsIC5kYXRhID0gTlVMTH07CisJczMyCQkJbm93OworCWludAkJCWRpcmVjdGlvbjsKKwlzMzIJCQlzZXFudW07CisJdW5zaWduZWQgY2hhcgkJKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopcmVhZF90b2tlbi0+ZGF0YTsKKwlpbnQJCQlib2R5c2l6ZTsKKwl1MzIJCQlyZXQgPSBHU1NfU19ERUZFQ1RJVkVfVE9LRU47CisKKwlkcHJpbnRrKCJSUEM6ICAgICAga3JiNV9yZWFkX3Rva2VuXG4iKTsKKworCWlmIChnX3ZlcmlmeV90b2tlbl9oZWFkZXIoJmN0eC0+bWVjaF91c2VkLCAmYm9keXNpemUsICZwdHIsCisJCQkJCXJlYWRfdG9rZW4tPmxlbikpCisJCWdvdG8gb3V0OworCisJaWYgKCgqcHRyKysgIT0gKCh0b2t0eXBlPj44KSYweGZmKSkgfHwgKCpwdHIrKyAhPSAodG9rdHlwZSYweGZmKSkpCisJCWdvdG8gb3V0OworCisJLyogWFhYIHNhbml0eS1jaGVjayBib2R5c2l6ZT8/ICovCisKKwlpZiAodG9rdHlwZSA9PSBLR19UT0tfV1JBUF9NU0cpIHsKKwkJLyogWFhYIGdvbmUgKi8KKwkJZ290byBvdXQ7CisJfQorCisJLyogZ2V0IHRoZSBzaWduIGFuZCBzZWFsIGFsZ29yaXRobXMgKi8KKworCXNpZ25hbGcgPSBwdHJbMF0gKyAocHRyWzFdIDw8IDgpOworCXNlYWxhbGcgPSBwdHJbMl0gKyAocHRyWzNdIDw8IDgpOworCisJLyogU2FuaXR5IGNoZWNrcyAqLworCisJaWYgKChwdHJbNF0gIT0gMHhmZikgfHwgKHB0cls1XSAhPSAweGZmKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoKCh0b2t0eXBlICE9IEtHX1RPS19XUkFQX01TRykgJiYgKHNlYWxhbGcgIT0gMHhmZmZmKSkgfHwKKwkgICAgKCh0b2t0eXBlID09IEtHX1RPS19XUkFQX01TRykgJiYgKHNlYWxhbGcgPT0gMHhmZmZmKSkpCisJCWdvdG8gb3V0OworCisJLyogaW4gdGhlIGN1cnJlbnQgc3BlYywgdGhlcmUgaXMgb25seSBvbmUgdmFsaWQgc2VhbCBhbGdvcml0aG0gcGVyCisJICAga2V5IHR5cGUsIHNvIGEgc2ltcGxlIGNvbXBhcmlzb24gaXMgb2sgKi8KKworCWlmICgodG9rdHlwZSA9PSBLR19UT0tfV1JBUF9NU0cpICYmICEoc2VhbGFsZyA9PSBjdHgtPnNlYWxhbGcpKQorCQlnb3RvIG91dDsKKworCS8qIHRoZXJlIGFyZSBzZXZlcmFsIG1hcHBpbmdzIG9mIHNlYWwgYWxnb3JpdGhtcyB0byBzaWduIGFsZ29yaXRobXMsCisJICAgYnV0IGZldyBlbm91Z2ggdGhhdCB3ZSBjYW4gdHJ5IHRoZW0gYWxsLiAqLworCisJaWYgKChjdHgtPnNlYWxhbGcgPT0gU0VBTF9BTEdfTk9ORSAmJiBzaWduYWxnID4gMSkgfHwKKwkgICAgKGN0eC0+c2VhbGFsZyA9PSBTRUFMX0FMR18xICYmIHNpZ25hbGcgIT0gU0dOX0FMR18zKSB8fAorCSAgICAoY3R4LT5zZWFsYWxnID09IFNFQUxfQUxHX0RFUzNLRCAmJgorCSAgICAgc2lnbmFsZyAhPSBTR05fQUxHX0hNQUNfU0hBMV9ERVMzX0tEKSkKKwkJZ290byBvdXQ7CisKKwkvKiBjb21wdXRlIHRoZSBjaGVja3N1bSBvZiB0aGUgbWVzc2FnZSAqLworCisJLyogaW5pdGlhbGl6ZSB0aGUgdGhlIGNrc3VtICovCisJc3dpdGNoIChzaWduYWxnKSB7CisJY2FzZSBTR05fQUxHX0RFU19NQUNfTUQ1OgorCQljaGVja3N1bV90eXBlID0gQ0tTVU1UWVBFX1JTQV9NRDU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IEdTU19TX0RFRkVDVElWRV9UT0tFTjsKKwkJZ290byBvdXQ7CisJfQorCisJc3dpdGNoIChzaWduYWxnKSB7CisJY2FzZSBTR05fQUxHX0RFU19NQUNfTUQ1OgorCQlyZXQgPSBtYWtlX2NoZWNrc3VtKGNoZWNrc3VtX3R5cGUsIHB0ciAtIDIsIDgsCisJCQkJCSBtZXNzYWdlX2J1ZmZlciwgJm1kNWNrc3VtKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCisJCXJldCA9IGtyYjVfZW5jcnlwdChjdHgtPnNlcSwgTlVMTCwgbWQ1Y2tzdW0uZGF0YSwKKwkJCQkgICBtZDVja3N1bS5kYXRhLCAxNik7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKworCQlpZiAobWVtY21wKG1kNWNrc3VtLmRhdGEgKyA4LCBwdHIgKyAxNCwgOCkpIHsKKwkJCXJldCA9IEdTU19TX0JBRF9TSUc7CisJCQlnb3RvIG91dDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSBHU1NfU19ERUZFQ1RJVkVfVE9LRU47CisJCWdvdG8gb3V0OworCX0KKworCS8qIGl0IGdvdCB0aHJvdWdoIHVuc2NhdGhlZC4gIE1ha2Ugc3VyZSB0aGUgY29udGV4dCBpcyB1bmV4cGlyZWQgKi8KKworCWlmIChxb3Bfc3RhdGUpCisJCSpxb3Bfc3RhdGUgPSBHU1NfQ19RT1BfREVGQVVMVDsKKworCW5vdyA9IGdldF9zZWNvbmRzKCk7CisKKwlyZXQgPSBHU1NfU19DT05URVhUX0VYUElSRUQ7CisJaWYgKG5vdyA+IGN0eC0+ZW5kdGltZSkKKwkJZ290byBvdXQ7CisKKwkvKiBkbyBzZXF1ZW5jaW5nIGNoZWNrcyAqLworCisJcmV0ID0gR1NTX1NfQkFEX1NJRzsKKwlpZiAoKHJldCA9IGtyYjVfZ2V0X3NlcV9udW0oY3R4LT5zZXEsIHB0ciArIDE0LCBwdHIgKyA2LCAmZGlyZWN0aW9uLAorCQkJCSAgICAmc2VxbnVtKSkpCisJCWdvdG8gb3V0OworCisJaWYgKChjdHgtPmluaXRpYXRlICYmIGRpcmVjdGlvbiAhPSAweGZmKSB8fAorCSAgICAoIWN0eC0+aW5pdGlhdGUgJiYgZGlyZWN0aW9uICE9IDApKQorCQlnb3RvIG91dDsKKworCXJldCA9IEdTU19TX0NPTVBMRVRFOworb3V0OgorCWlmIChtZDVja3N1bS5kYXRhKSBrZnJlZShtZDVja3N1bS5kYXRhKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3NfbWVjaF9zd2l0Y2guYyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX21lY2hfc3dpdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRmYjY4MwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX21lY2hfc3dpdGNoLmMKQEAgLTAsMCArMSwzMDEgQEAKKy8qCisgKiAgbGludXgvbmV0L3N1bnJwYy9nc3NfbWVjaF9zd2l0Y2guYworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgSi4gQnJ1Y2UgRmllbGRzICAgPGJmaWVsZHNAdW1pY2guZWR1PgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqCisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIAorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvbXNnX3Byb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZ3NzX2FzbjEuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvYXV0aF9nc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjYXV0aF9nc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZ3NzX2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9nc3NfYXBpLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKworI2lmZGVmIFJQQ19ERUJVRworIyBkZWZpbmUgUlBDREJHX0ZBQ0lMSVRZICAgICAgICBSUENEQkdfQVVUSAorI2VuZGlmCisKK3N0YXRpYyBMSVNUX0hFQUQocmVnaXN0ZXJlZF9tZWNocyk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJlZ2lzdGVyZWRfbWVjaHNfbG9jayk7CisKK3N0YXRpYyB2b2lkCitnc3NfbWVjaF9mcmVlKHN0cnVjdCBnc3NfYXBpX21lY2ggKmdtKQoreworCXN0cnVjdCBwZl9kZXNjICpwZjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBnbS0+Z21fcGZfbnVtOyBpKyspIHsKKwkJcGYgPSAmZ20tPmdtX3Bmc1tpXTsKKwkJaWYgKHBmLT5hdXRoX2RvbWFpbl9uYW1lKQorCQkJa2ZyZWUocGYtPmF1dGhfZG9tYWluX25hbWUpOworCQlwZi0+YXV0aF9kb21haW5fbmFtZSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKgorbWFrZV9hdXRoX2RvbWFpbl9uYW1lKGNoYXIgKm5hbWUpCit7CisJc3RhdGljIGNoYXIJKnByZWZpeCA9ICJnc3MvIjsKKwljaGFyCQkqbmV3OworCisJbmV3ID0ga21hbGxvYyhzdHJsZW4obmFtZSkgKyBzdHJsZW4ocHJlZml4KSArIDEsIEdGUF9LRVJORUwpOworCWlmIChuZXcpIHsKKwkJc3RyY3B5KG5ldywgcHJlZml4KTsKKwkJc3RyY2F0KG5ldywgbmFtZSk7CisJfQorCXJldHVybiBuZXc7Cit9CisKK3N0YXRpYyBpbnQKK2dzc19tZWNoX3N2Y19zZXR1cChzdHJ1Y3QgZ3NzX2FwaV9tZWNoICpnbSkKK3sKKwlzdHJ1Y3QgcGZfZGVzYyAqcGY7CisJaW50IGksIHN0YXR1czsKKworCWZvciAoaSA9IDA7IGkgPCBnbS0+Z21fcGZfbnVtOyBpKyspIHsKKwkJcGYgPSAmZ20tPmdtX3Bmc1tpXTsKKwkJcGYtPmF1dGhfZG9tYWluX25hbWUgPSBtYWtlX2F1dGhfZG9tYWluX25hbWUocGYtPm5hbWUpOworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlpZiAocGYtPmF1dGhfZG9tYWluX25hbWUgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCQlzdGF0dXMgPSBzdmNhdXRoX2dzc19yZWdpc3Rlcl9wc2V1ZG9mbGF2b3IocGYtPnBzZXVkb2ZsYXZvciwKKwkJCQkJCQlwZi0+YXV0aF9kb21haW5fbmFtZSk7CisJCWlmIChzdGF0dXMpCisJCQlnb3RvIG91dDsKKwl9CisJcmV0dXJuIDA7CitvdXQ6CisJZ3NzX21lY2hfZnJlZShnbSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50Citnc3NfbWVjaF9yZWdpc3RlcihzdHJ1Y3QgZ3NzX2FwaV9tZWNoICpnbSkKK3sKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gZ3NzX21lY2hfc3ZjX3NldHVwKGdtKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCXNwaW5fbG9jaygmcmVnaXN0ZXJlZF9tZWNoc19sb2NrKTsKKwlsaXN0X2FkZCgmZ20tPmdtX2xpc3QsICZyZWdpc3RlcmVkX21lY2hzKTsKKwlzcGluX3VubG9jaygmcmVnaXN0ZXJlZF9tZWNoc19sb2NrKTsKKwlkcHJpbnRrKCJSUEM6ICAgICAgcmVnaXN0ZXJlZCBnc3MgbWVjaGFuaXNtICVzXG4iLCBnbS0+Z21fbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woZ3NzX21lY2hfcmVnaXN0ZXIpOworCit2b2lkCitnc3NfbWVjaF91bnJlZ2lzdGVyKHN0cnVjdCBnc3NfYXBpX21lY2ggKmdtKQoreworCXNwaW5fbG9jaygmcmVnaXN0ZXJlZF9tZWNoc19sb2NrKTsKKwlsaXN0X2RlbCgmZ20tPmdtX2xpc3QpOworCXNwaW5fdW5sb2NrKCZyZWdpc3RlcmVkX21lY2hzX2xvY2spOworCWRwcmludGsoIlJQQzogICAgICB1bnJlZ2lzdGVyZWQgZ3NzIG1lY2hhbmlzbSAlc1xuIiwgZ20tPmdtX25hbWUpOworCWdzc19tZWNoX2ZyZWUoZ20pOworfQorCitFWFBPUlRfU1lNQk9MKGdzc19tZWNoX3VucmVnaXN0ZXIpOworCitzdHJ1Y3QgZ3NzX2FwaV9tZWNoICoKK2dzc19tZWNoX2dldChzdHJ1Y3QgZ3NzX2FwaV9tZWNoICpnbSkKK3sKKwlfX21vZHVsZV9nZXQoZ20tPmdtX293bmVyKTsKKwlyZXR1cm4gZ207Cit9CisKK0VYUE9SVF9TWU1CT0woZ3NzX21lY2hfZ2V0KTsKKworc3RydWN0IGdzc19hcGlfbWVjaCAqCitnc3NfbWVjaF9nZXRfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBnc3NfYXBpX21lY2gJKnBvcywgKmdtID0gTlVMTDsKKworCXNwaW5fbG9jaygmcmVnaXN0ZXJlZF9tZWNoc19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJnJlZ2lzdGVyZWRfbWVjaHMsIGdtX2xpc3QpIHsKKwkJaWYgKDAgPT0gc3RyY21wKG5hbWUsIHBvcy0+Z21fbmFtZSkpIHsKKwkJCWlmICh0cnlfbW9kdWxlX2dldChwb3MtPmdtX293bmVyKSkKKwkJCQlnbSA9IHBvczsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZyZWdpc3RlcmVkX21lY2hzX2xvY2spOworCXJldHVybiBnbTsKKworfQorCitFWFBPUlRfU1lNQk9MKGdzc19tZWNoX2dldF9ieV9uYW1lKTsKKworc3RhdGljIGlubGluZSBpbnQKK21lY2hfc3VwcG9ydHNfcHNldWRvZmxhdm9yKHN0cnVjdCBnc3NfYXBpX21lY2ggKmdtLCB1MzIgcHNldWRvZmxhdm9yKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGdtLT5nbV9wZl9udW07IGkrKykgeworCQlpZiAoZ20tPmdtX3Bmc1tpXS5wc2V1ZG9mbGF2b3IgPT0gcHNldWRvZmxhdm9yKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgZ3NzX2FwaV9tZWNoICoKK2dzc19tZWNoX2dldF9ieV9wc2V1ZG9mbGF2b3IodTMyIHBzZXVkb2ZsYXZvcikKK3sKKwlzdHJ1Y3QgZ3NzX2FwaV9tZWNoICpwb3MsICpnbSA9IE5VTEw7CisKKwlzcGluX2xvY2soJnJlZ2lzdGVyZWRfbWVjaHNfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZyZWdpc3RlcmVkX21lY2hzLCBnbV9saXN0KSB7CisJCWlmICghbWVjaF9zdXBwb3J0c19wc2V1ZG9mbGF2b3IocG9zLCBwc2V1ZG9mbGF2b3IpKSB7CisJCQltb2R1bGVfcHV0KHBvcy0+Z21fb3duZXIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHRyeV9tb2R1bGVfZ2V0KHBvcy0+Z21fb3duZXIpKQorCQkJZ20gPSBwb3M7CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9jaygmcmVnaXN0ZXJlZF9tZWNoc19sb2NrKTsKKwlyZXR1cm4gZ207Cit9CisKK0VYUE9SVF9TWU1CT0woZ3NzX21lY2hfZ2V0X2J5X3BzZXVkb2ZsYXZvcik7CisKK3UzMgorZ3NzX3BzZXVkb2ZsYXZvcl90b19zZXJ2aWNlKHN0cnVjdCBnc3NfYXBpX21lY2ggKmdtLCB1MzIgcHNldWRvZmxhdm9yKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGdtLT5nbV9wZl9udW07IGkrKykgeworCQlpZiAoZ20tPmdtX3Bmc1tpXS5wc2V1ZG9mbGF2b3IgPT0gcHNldWRvZmxhdm9yKQorCQkJcmV0dXJuIGdtLT5nbV9wZnNbaV0uc2VydmljZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woZ3NzX3BzZXVkb2ZsYXZvcl90b19zZXJ2aWNlKTsKKworY2hhciAqCitnc3Nfc2VydmljZV90b19hdXRoX2RvbWFpbl9uYW1lKHN0cnVjdCBnc3NfYXBpX21lY2ggKmdtLCB1MzIgc2VydmljZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBnbS0+Z21fcGZfbnVtOyBpKyspIHsKKwkJaWYgKGdtLT5nbV9wZnNbaV0uc2VydmljZSA9PSBzZXJ2aWNlKQorCQkJcmV0dXJuIGdtLT5nbV9wZnNbaV0uYXV0aF9kb21haW5fbmFtZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK0VYUE9SVF9TWU1CT0woZ3NzX3NlcnZpY2VfdG9fYXV0aF9kb21haW5fbmFtZSk7CisKK3ZvaWQKK2dzc19tZWNoX3B1dChzdHJ1Y3QgZ3NzX2FwaV9tZWNoICogZ20pCit7CisJbW9kdWxlX3B1dChnbS0+Z21fb3duZXIpOworfQorCitFWFBPUlRfU1lNQk9MKGdzc19tZWNoX3B1dCk7CisKKy8qIFRoZSBtZWNoIGNvdWxkIHByb2JhYmx5IGJlIGRldGVybWluZWQgZnJvbSB0aGUgdG9rZW4gaW5zdGVhZCwgYnV0IGl0J3MganVzdAorICogYXMgZWFzeSBmb3Igbm93IHRvIHBhc3MgaXQgaW4uICovCitpbnQKK2dzc19pbXBvcnRfc2VjX2NvbnRleHQoY29uc3Qgdm9pZCAqaW5wdXRfdG9rZW4sIHNpemVfdCBidWZzaXplLAorCQkgICAgICAgc3RydWN0IGdzc19hcGlfbWVjaAkqbWVjaCwKKwkJICAgICAgIHN0cnVjdCBnc3NfY3R4CQkqKmN0eF9pZCkKK3sKKwlpZiAoISgqY3R4X2lkID0ga21hbGxvYyhzaXplb2YoKipjdHhfaWQpLCBHRlBfS0VSTkVMKSkpCisJCXJldHVybiBHU1NfU19GQUlMVVJFOworCW1lbXNldCgqY3R4X2lkLCAwLCBzaXplb2YoKipjdHhfaWQpKTsKKwkoKmN0eF9pZCktPm1lY2hfdHlwZSA9IGdzc19tZWNoX2dldChtZWNoKTsKKworCXJldHVybiBtZWNoLT5nbV9vcHMKKwkJLT5nc3NfaW1wb3J0X3NlY19jb250ZXh0KGlucHV0X3Rva2VuLCBidWZzaXplLCAqY3R4X2lkKTsKK30KKworLyogZ3NzX2dldF9taWM6IGNvbXB1dGUgYSBtaWMgb3ZlciBtZXNzYWdlIGFuZCByZXR1cm4gbWljX3Rva2VuLiAqLworCit1MzIKK2dzc19nZXRfbWljKHN0cnVjdCBnc3NfY3R4CSpjb250ZXh0X2hhbmRsZSwKKwkgICAgdTMyCQkJcW9wLAorCSAgICBzdHJ1Y3QgeGRyX2J1ZgkqbWVzc2FnZSwKKwkgICAgc3RydWN0IHhkcl9uZXRvYmoJKm1pY190b2tlbikKK3sKKwkgcmV0dXJuIGNvbnRleHRfaGFuZGxlLT5tZWNoX3R5cGUtPmdtX29wcworCQktPmdzc19nZXRfbWljKGNvbnRleHRfaGFuZGxlLAorCQkJICAgICAgcW9wLAorCQkJICAgICAgbWVzc2FnZSwKKwkJCSAgICAgIG1pY190b2tlbik7Cit9CisKKy8qIGdzc192ZXJpZnlfbWljOiBjaGVjayB3aGV0aGVyIHRoZSBwcm92aWRlZCBtaWNfdG9rZW4gdmVyaWZpZXMgbWVzc2FnZS4gKi8KKwordTMyCitnc3NfdmVyaWZ5X21pYyhzdHJ1Y3QgZ3NzX2N0eAkJKmNvbnRleHRfaGFuZGxlLAorCSAgICAgICBzdHJ1Y3QgeGRyX2J1ZgkJKm1lc3NhZ2UsCisJICAgICAgIHN0cnVjdCB4ZHJfbmV0b2JqCSptaWNfdG9rZW4sCisJICAgICAgIHUzMgkJCSpxc3RhdGUpCit7CisJcmV0dXJuIGNvbnRleHRfaGFuZGxlLT5tZWNoX3R5cGUtPmdtX29wcworCQktPmdzc192ZXJpZnlfbWljKGNvbnRleHRfaGFuZGxlLAorCQkJCSBtZXNzYWdlLAorCQkJCSBtaWNfdG9rZW4sCisJCQkJIHFzdGF0ZSk7Cit9CisKKy8qIGdzc19kZWxldGVfc2VjX2NvbnRleHQ6IGZyZWUgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggY29udGV4dF9oYW5kbGUuCisgKiBOb3RlIHRoaXMgZGlmZmVycyBmcm9tIHRoZSBSRkMgMjc0NC1zcGVjaWZpZWQgcHJvdG90eXBlIGluIHRoYXQgd2UgZG9uJ3QKKyAqIGJvdGhlciByZXR1cm5pbmcgYW4gb3V0cHV0IHRva2VuLCBzaW5jZSBpdCB3b3VsZCBuZXZlciBiZSB1c2VkIGFueXdheS4gKi8KKwordTMyCitnc3NfZGVsZXRlX3NlY19jb250ZXh0KHN0cnVjdCBnc3NfY3R4CSoqY29udGV4dF9oYW5kbGUpCit7CisJZHByaW50aygiUlBDOiAgICAgIGdzc19kZWxldGVfc2VjX2NvbnRleHQgZGVsZXRpbmcgJXBcbiIsCisJCQkqY29udGV4dF9oYW5kbGUpOworCisJaWYgKCEqY29udGV4dF9oYW5kbGUpCisJCXJldHVybihHU1NfU19OT19DT05URVhUKTsKKwlpZiAoKCpjb250ZXh0X2hhbmRsZSktPmludGVybmFsX2N0eF9pZCAhPSAwKQorCQkoKmNvbnRleHRfaGFuZGxlKS0+bWVjaF90eXBlLT5nbV9vcHMKKwkJCS0+Z3NzX2RlbGV0ZV9zZWNfY29udGV4dCgoKmNvbnRleHRfaGFuZGxlKQorCQkJCQkJCS0+aW50ZXJuYWxfY3R4X2lkKTsKKwlpZiAoKCpjb250ZXh0X2hhbmRsZSktPm1lY2hfdHlwZSkKKwkJZ3NzX21lY2hfcHV0KCgqY29udGV4dF9oYW5kbGUpLT5tZWNoX3R5cGUpOworCWtmcmVlKCpjb250ZXh0X2hhbmRsZSk7CisJKmNvbnRleHRfaGFuZGxlPU5VTEw7CisJcmV0dXJuIEdTU19TX0NPTVBMRVRFOworfQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfbWVjaC5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfbWVjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZDA1OTkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19zcGttM19tZWNoLmMKQEAgLTAsMCArMSwzMDAgQEAKKy8qCisgKiAgbGludXgvbmV0L3N1bnJwYy9nc3Nfc3BrbTNfbWVjaC5jCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMyBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbi4KKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBBbmR5IEFkYW1zb24gPGFuZHJvc0B1bWljaC5lZHU+CisgKiAgSi4gQnJ1Y2UgRmllbGRzIDxiZmllbGRzQHVtaWNoLmVkdT4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqCisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqICBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiAgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvYXV0aC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Y2F1dGhfZ3NzLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2dzc19zcGttMy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy94ZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKworI2lmZGVmIFJQQ19ERUJVRworIyBkZWZpbmUgUlBDREJHX0ZBQ0lMSVRZCVJQQ0RCR19BVVRICisjZW5kaWYKKworc3RhdGljIGNvbnN0IHZvaWQgKgorc2ltcGxlX2dldF9ieXRlcyhjb25zdCB2b2lkICpwLCBjb25zdCB2b2lkICplbmQsIHZvaWQgKnJlcywgaW50IGxlbikKK3sKKwljb25zdCB2b2lkICpxID0gKGNvbnN0IHZvaWQgKikoKGNvbnN0IGNoYXIgKilwICsgbGVuKTsKKwlpZiAodW5saWtlbHkocSA+IGVuZCB8fCBxIDwgcCkpCisJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOworCW1lbWNweShyZXMsIHAsIGxlbik7CisJcmV0dXJuIHE7Cit9CisKK3N0YXRpYyBjb25zdCB2b2lkICoKK3NpbXBsZV9nZXRfbmV0b2JqKGNvbnN0IHZvaWQgKnAsIGNvbnN0IHZvaWQgKmVuZCwgc3RydWN0IHhkcl9uZXRvYmogKnJlcykKK3sKKwljb25zdCB2b2lkICpxOworCXVuc2lnbmVkIGludCBsZW47CisJcCA9IHNpbXBsZV9nZXRfYnl0ZXMocCwgZW5kLCAmbGVuLCBzaXplb2YobGVuKSk7CisJaWYgKElTX0VSUihwKSkKKwkJcmV0dXJuIHA7CisJcmVzLT5sZW4gPSBsZW47CisJaWYgKGxlbiA9PSAwKSB7CisJCXJlcy0+ZGF0YSA9IE5VTEw7CisJCXJldHVybiBwOworCX0KKwlxID0gKGNvbnN0IHZvaWQgKikoKGNvbnN0IGNoYXIgKilwICsgbGVuKTsKKwlpZiAodW5saWtlbHkocSA+IGVuZCB8fCBxIDwgcCkpCisJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOworCXJlcy0+ZGF0YSA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkocmVzLT5kYXRhID09IE5VTEwpKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwltZW1jcHkocmVzLT5kYXRhLCBwLCBsZW4pOworCXJldHVybiBxOworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IHZvaWQgKgorZ2V0X2tleShjb25zdCB2b2lkICpwLCBjb25zdCB2b2lkICplbmQsIHN0cnVjdCBjcnlwdG9fdGZtICoqcmVzLCBpbnQgKnJlc2FsZykKK3sKKwlzdHJ1Y3QgeGRyX25ldG9iaglrZXkgPSB7IDAgfTsKKwlpbnQJCQlhbGdfbW9kZSxzZXRrZXkgPSAwOworCWNoYXIJCQkqYWxnX25hbWU7CisKKwlwID0gc2ltcGxlX2dldF9ieXRlcyhwLCBlbmQsIHJlc2FsZywgc2l6ZW9mKCpyZXNhbGcpKTsKKwlpZiAoSVNfRVJSKHApKQorCQlnb3RvIG91dF9lcnI7CisJcCA9IHNpbXBsZV9nZXRfbmV0b2JqKHAsIGVuZCwgJmtleSk7CisJaWYgKElTX0VSUihwKSkKKwkJZ290byBvdXRfZXJyOworCisJc3dpdGNoICgqcmVzYWxnKSB7CisJCWNhc2UgTklEX2Rlc19jYmM6CisJCQlhbGdfbmFtZSA9ICJkZXMiOworCQkJYWxnX21vZGUgPSBDUllQVE9fVEZNX01PREVfQ0JDOworCQkJc2V0a2V5ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIE5JRF9tZDU6CisJCQlpZiAoa2V5LmxlbiA9PSAwKSB7CisJCQkJZHByaW50aygiUlBDOiBTUEtNMyBnZXRfa2V5OiBOSURfbWQ1IHplcm8gS2V5IGxlbmd0aFxuIik7CisJCQl9CisJCQlhbGdfbmFtZSA9ICJtZDUiOworCQkJYWxnX21vZGUgPSAwOworCQkJc2V0a2V5ID0gMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZHByaW50aygiUlBDOiBTUEtNMyBnZXRfa2V5OiB1bnN1cHBvcnRlZCBhbGdvcml0aG0gJWQiLCAqcmVzYWxnKTsKKwkJCWdvdG8gb3V0X2Vycl9mcmVlX2tleTsKKwl9CisJaWYgKCEoKnJlcyA9IGNyeXB0b19hbGxvY190Zm0oYWxnX25hbWUsIGFsZ19tb2RlKSkpCisJCWdvdG8gb3V0X2Vycl9mcmVlX2tleTsKKwlpZiAoc2V0a2V5KSB7CisJCWlmIChjcnlwdG9fY2lwaGVyX3NldGtleSgqcmVzLCBrZXkuZGF0YSwga2V5LmxlbikpCisJCQlnb3RvIG91dF9lcnJfZnJlZV90Zm07CisJfQorCisJaWYoa2V5LmxlbiA+IDApCisJCWtmcmVlKGtleS5kYXRhKTsKKwlyZXR1cm4gcDsKKworb3V0X2Vycl9mcmVlX3RmbToKKwljcnlwdG9fZnJlZV90Zm0oKnJlcyk7CitvdXRfZXJyX2ZyZWVfa2V5OgorCWlmKGtleS5sZW4gPiAwKQorCQlrZnJlZShrZXkuZGF0YSk7CisJcCA9IEVSUl9QVFIoLUVJTlZBTCk7CitvdXRfZXJyOgorCXJldHVybiBwOworfQorCitzdGF0aWMgaW50Citnc3NfaW1wb3J0X3NlY19jb250ZXh0X3Nwa20zKGNvbnN0IHZvaWQgKnAsIHNpemVfdCBsZW4sCisJCQkJc3RydWN0IGdzc19jdHggKmN0eF9pZCkKK3sKKwljb25zdCB2b2lkICplbmQgPSAoY29uc3Qgdm9pZCAqKSgoY29uc3QgY2hhciAqKXAgKyBsZW4pOworCXN0cnVjdAlzcGttM19jdHggKmN0eDsKKworCWlmICghKGN0eCA9IGttYWxsb2Moc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKSkpCisJCWdvdG8gb3V0X2VycjsKKwltZW1zZXQoY3R4LCAwLCBzaXplb2YoKmN0eCkpOworCisJcCA9IHNpbXBsZV9nZXRfbmV0b2JqKHAsIGVuZCwgJmN0eC0+Y3R4X2lkKTsKKwlpZiAoSVNfRVJSKHApKQorCQlnb3RvIG91dF9lcnJfZnJlZV9jdHg7CisKKwlwID0gc2ltcGxlX2dldF9ieXRlcyhwLCBlbmQsICZjdHgtPnFvcCwgc2l6ZW9mKGN0eC0+cW9wKSk7CisJaWYgKElTX0VSUihwKSkKKwkJZ290byBvdXRfZXJyX2ZyZWVfY3R4X2lkOworCisJcCA9IHNpbXBsZV9nZXRfbmV0b2JqKHAsIGVuZCwgJmN0eC0+bWVjaF91c2VkKTsKKwlpZiAoSVNfRVJSKHApKQorCQlnb3RvIG91dF9lcnJfZnJlZV9tZWNoOworCisJcCA9IHNpbXBsZV9nZXRfYnl0ZXMocCwgZW5kLCAmY3R4LT5yZXRfZmxhZ3MsIHNpemVvZihjdHgtPnJldF9mbGFncykpOworCWlmIChJU19FUlIocCkpCisJCWdvdG8gb3V0X2Vycl9mcmVlX21lY2g7CisKKwlwID0gc2ltcGxlX2dldF9ieXRlcyhwLCBlbmQsICZjdHgtPnJlcV9mbGFncywgc2l6ZW9mKGN0eC0+cmVxX2ZsYWdzKSk7CisJaWYgKElTX0VSUihwKSkKKwkJZ290byBvdXRfZXJyX2ZyZWVfbWVjaDsKKworCXAgPSBzaW1wbGVfZ2V0X25ldG9iaihwLCBlbmQsICZjdHgtPnNoYXJlX2tleSk7CisJaWYgKElTX0VSUihwKSkKKwkJZ290byBvdXRfZXJyX2ZyZWVfc19rZXk7CisKKwlwID0gZ2V0X2tleShwLCBlbmQsICZjdHgtPmRlcml2ZWRfY29uZl9rZXksICZjdHgtPmNvbmZfYWxnKTsKKwlpZiAoSVNfRVJSKHApKQorCQlnb3RvIG91dF9lcnJfZnJlZV9zX2tleTsKKworCXAgPSBnZXRfa2V5KHAsIGVuZCwgJmN0eC0+ZGVyaXZlZF9pbnRlZ19rZXksICZjdHgtPmludGdfYWxnKTsKKwlpZiAoSVNfRVJSKHApKQorCQlnb3RvIG91dF9lcnJfZnJlZV9rZXkxOworCisJcCA9IHNpbXBsZV9nZXRfYnl0ZXMocCwgZW5kLCAmY3R4LT5rZXllc3RiX2FsZywgc2l6ZW9mKGN0eC0+a2V5ZXN0Yl9hbGcpKTsKKwlpZiAoSVNfRVJSKHApKQorCQlnb3RvIG91dF9lcnJfZnJlZV9rZXkyOworCisJcCA9IHNpbXBsZV9nZXRfYnl0ZXMocCwgZW5kLCAmY3R4LT5vd2ZfYWxnLCBzaXplb2YoY3R4LT5vd2ZfYWxnKSk7CisJaWYgKElTX0VSUihwKSkKKwkJZ290byBvdXRfZXJyX2ZyZWVfa2V5MjsKKworCWlmIChwICE9IGVuZCkKKwkJZ290byBvdXRfZXJyX2ZyZWVfa2V5MjsKKworCWN0eF9pZC0+aW50ZXJuYWxfY3R4X2lkID0gY3R4OworCisJZHByaW50aygiU3VjY2VzZnVsbHkgaW1wb3J0ZWQgbmV3IHNwa20gY29udGV4dC5cbiIpOworCXJldHVybiAwOworCitvdXRfZXJyX2ZyZWVfa2V5MjoKKwljcnlwdG9fZnJlZV90Zm0oY3R4LT5kZXJpdmVkX2ludGVnX2tleSk7CitvdXRfZXJyX2ZyZWVfa2V5MToKKwljcnlwdG9fZnJlZV90Zm0oY3R4LT5kZXJpdmVkX2NvbmZfa2V5KTsKK291dF9lcnJfZnJlZV9zX2tleToKKwlrZnJlZShjdHgtPnNoYXJlX2tleS5kYXRhKTsKK291dF9lcnJfZnJlZV9tZWNoOgorCWtmcmVlKGN0eC0+bWVjaF91c2VkLmRhdGEpOworb3V0X2Vycl9mcmVlX2N0eF9pZDoKKwlrZnJlZShjdHgtPmN0eF9pZC5kYXRhKTsKK291dF9lcnJfZnJlZV9jdHg6CisJa2ZyZWUoY3R4KTsKK291dF9lcnI6CisJcmV0dXJuIFBUUl9FUlIocCk7Cit9CisKK3N0YXRpYyB2b2lkCitnc3NfZGVsZXRlX3NlY19jb250ZXh0X3Nwa20zKHZvaWQgKmludGVybmFsX2N0eCkgeworCXN0cnVjdCBzcGttM19jdHggKnNjdHggPSBpbnRlcm5hbF9jdHg7CisKKwlpZihzY3R4LT5kZXJpdmVkX2ludGVnX2tleSkKKwkJY3J5cHRvX2ZyZWVfdGZtKHNjdHgtPmRlcml2ZWRfaW50ZWdfa2V5KTsKKwlpZihzY3R4LT5kZXJpdmVkX2NvbmZfa2V5KQorCQljcnlwdG9fZnJlZV90Zm0oc2N0eC0+ZGVyaXZlZF9jb25mX2tleSk7CisJaWYoc2N0eC0+c2hhcmVfa2V5LmRhdGEpCisJCWtmcmVlKHNjdHgtPnNoYXJlX2tleS5kYXRhKTsKKwlpZihzY3R4LT5tZWNoX3VzZWQuZGF0YSkKKwkJa2ZyZWUoc2N0eC0+bWVjaF91c2VkLmRhdGEpOworCWtmcmVlKHNjdHgpOworfQorCitzdGF0aWMgdTMyCitnc3NfdmVyaWZ5X21pY19zcGttMyhzdHJ1Y3QgZ3NzX2N0eAkJKmN0eCwKKwkJCXN0cnVjdCB4ZHJfYnVmCQkqc2lnbmJ1ZiwKKwkJCXN0cnVjdCB4ZHJfbmV0b2JqCSpjaGVja3N1bSwKKwkJCXUzMgkJKnFzdGF0ZSkgeworCXUzMiBtYWpfc3RhdCA9IDA7CisJaW50IHFvcF9zdGF0ZSA9IDA7CisJc3RydWN0IHNwa20zX2N0eCAqc2N0eCA9IGN0eC0+aW50ZXJuYWxfY3R4X2lkOworCisJZHByaW50aygiUlBDOiBnc3NfdmVyaWZ5X21pY19zcGttMyBjYWxsaW5nIHNwa20zX3JlYWRfdG9rZW5cbiIpOworCW1hal9zdGF0ID0gc3BrbTNfcmVhZF90b2tlbihzY3R4LCBjaGVja3N1bSwgc2lnbmJ1ZiwgJnFvcF9zdGF0ZSwKKwkJCQkgICBTUEtNX01JQ19UT0spOworCisJaWYgKCFtYWpfc3RhdCAmJiBxb3Bfc3RhdGUpCisJICAgICpxc3RhdGUgPSBxb3Bfc3RhdGU7CisKKwlkcHJpbnRrKCJSUEM6IGdzc192ZXJpZnlfbWljX3Nwa20zIHJldHVybmluZyAlZFxuIiwgbWFqX3N0YXQpOworCXJldHVybiBtYWpfc3RhdDsKK30KKworc3RhdGljIHUzMgorZ3NzX2dldF9taWNfc3BrbTMoc3RydWN0IGdzc19jdHgJKmN0eCwKKwkJICAgICB1MzIJCXFvcCwKKwkJICAgICBzdHJ1Y3QgeGRyX2J1ZgkqbWVzc2FnZV9idWZmZXIsCisJCSAgICAgc3RydWN0IHhkcl9uZXRvYmoJKm1lc3NhZ2VfdG9rZW4pIHsKKwl1MzIgZXJyID0gMDsKKwlzdHJ1Y3Qgc3BrbTNfY3R4ICpzY3R4ID0gY3R4LT5pbnRlcm5hbF9jdHhfaWQ7CisKKwlkcHJpbnRrKCJSUEM6IGdzc19nZXRfbWljX3Nwa20zXG4iKTsKKworCWVyciA9IHNwa20zX21ha2VfdG9rZW4oc2N0eCwgcW9wLCBtZXNzYWdlX2J1ZmZlciwKKwkJCSAgICAgIG1lc3NhZ2VfdG9rZW4sIFNQS01fTUlDX1RPSyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBnc3NfYXBpX29wcyBnc3Nfc3BrbTNfb3BzID0geworCS5nc3NfaW1wb3J0X3NlY19jb250ZXh0CT0gZ3NzX2ltcG9ydF9zZWNfY29udGV4dF9zcGttMywKKwkuZ3NzX2dldF9taWMJCT0gZ3NzX2dldF9taWNfc3BrbTMsCisJLmdzc192ZXJpZnlfbWljCQk9IGdzc192ZXJpZnlfbWljX3Nwa20zLAorCS5nc3NfZGVsZXRlX3NlY19jb250ZXh0CT0gZ3NzX2RlbGV0ZV9zZWNfY29udGV4dF9zcGttMywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGZfZGVzYyBnc3Nfc3BrbTNfcGZzW10gPSB7CisJe1JQQ19BVVRIX0dTU19TUEtNLCAwLCBSUENfR1NTX1NWQ19OT05FLCAic3BrbTMifSwKKwl7UlBDX0FVVEhfR1NTX1NQS01JLCAwLCBSUENfR1NTX1NWQ19JTlRFR1JJVFksICJzcGttM2kifSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3NzX2FwaV9tZWNoIGdzc19zcGttM19tZWNoID0geworCS5nbV9uYW1lCT0gInNwa20zIiwKKwkuZ21fb3duZXIJPSBUSElTX01PRFVMRSwKKwkuZ21fb3BzCQk9ICZnc3Nfc3BrbTNfb3BzLAorCS5nbV9wZl9udW0JPSBBUlJBWV9TSVpFKGdzc19zcGttM19wZnMpLAorCS5nbV9wZnMJCT0gZ3NzX3Nwa20zX3BmcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfc3BrbTNfbW9kdWxlKHZvaWQpCit7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGdzc19tZWNoX3JlZ2lzdGVyKCZnc3Nfc3BrbTNfbWVjaCk7CisJaWYgKHN0YXR1cykKKwkJcHJpbnRrKCJGYWlsZWQgdG8gcmVnaXN0ZXIgc3BrbTMgZ3NzIG1lY2hhbmlzbSFcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9zcGttM19tb2R1bGUodm9pZCkKK3sKKwlnc3NfbWVjaF91bnJlZ2lzdGVyKCZnc3Nfc3BrbTNfbWVjaCk7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9pbml0KGluaXRfc3BrbTNfbW9kdWxlKTsKK21vZHVsZV9leGl0KGNsZWFudXBfc3BrbTNfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX3Nwa20zX3NlYWwuYyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX3Nwa20zX3NlYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTMzOTg2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfc2VhbC5jCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogIGxpbnV4L25ldC9zdW5ycGMvZ3NzX3Nwa20zX3NlYWwuYworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgQW5keSBBZGFtc29uIDxhbmRyb3NAdW1pY2guZWR1PgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqICBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9nc3Nfc3BrbTMuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKworI2lmZGVmIFJQQ19ERUJVRworIyBkZWZpbmUgUlBDREJHX0ZBQ0lMSVRZICAgICAgICBSUENEQkdfQVVUSAorI2VuZGlmCisKKy8qCisgKiBzcGttM19tYWtlX3Rva2VuKCkKKyAqCisgKiBPbmx5IFNQS01fTUlDX1RPSyB3aXRoIG1kNSBpbnRnLWFsZyBpcyBzdXBwb3J0ZWQKKyAqLworCit1MzIKK3Nwa20zX21ha2VfdG9rZW4oc3RydWN0IHNwa20zX2N0eCAqY3R4LCBpbnQgcW9wX3JlcSwKKwkJICAgc3RydWN0IHhkcl9idWYgKiB0ZXh0LCBzdHJ1Y3QgeGRyX25ldG9iaiAqIHRva2VuLAorCQkgICBpbnQgdG9rdHlwZSkKK3sKKwlzMzIJCQljaGVja3N1bV90eXBlOworCWNoYXIJCQl0b2toZHJidWZbMjVdOworCXN0cnVjdCB4ZHJfbmV0b2JqCW1kNWNrc3VtID0gey5sZW4gPSAwLCAuZGF0YSA9IE5VTEx9OworCXN0cnVjdCB4ZHJfbmV0b2JqCW1pY19oZHIgPSB7LmxlbiA9IDAsIC5kYXRhID0gdG9raGRyYnVmfTsKKwlpbnQJCQl0bXNnbGVuLCB0b2tlbmxlbiA9IDA7CisJdW5zaWduZWQgY2hhcgkJKnB0cjsKKwlzMzIJCQlub3c7CisJaW50CQkJY3R4ZWxlbiA9IDAsIGN0eHpiaXQgPSAwOworCWludAkJCW1kNWVsZW4gPSAwLCBtZDV6Yml0ID0gMDsKKworCWRwcmludGsoIlJQQzogc3BrbTNfbWFrZV90b2tlblxuIik7CisKKwlub3cgPSBqaWZmaWVzOworCWlmIChxb3BfcmVxICE9IDApCisJCWdvdG8gb3V0X2VycjsKKworCWlmIChjdHgtPmN0eF9pZC5sZW4gIT0gMTYpIHsKKwkJZHByaW50aygiUlBDOiBzcGttM19tYWtlX3Rva2VuIEJBRCBjdHhfaWQubGVuICVkXG4iLAorCQkJY3R4LT5jdHhfaWQubGVuKTsKKwkJZ290byBvdXRfZXJyOworCX0KKwkJCisJc3dpdGNoIChjdHgtPmludGdfYWxnKSB7CisJCWNhc2UgTklEX21kNToKKwkJCWNoZWNrc3VtX3R5cGUgPSBDS1NVTVRZUEVfUlNBX01ENTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZHByaW50aygiUlBDOiBnc3Nfc3BrbTNfc2VhbDogY3R4LT5zaWduYWxnICVkIG5vdCIKKwkJCQkiIHN1cHBvcnRlZFxuIiwgY3R4LT5pbnRnX2FsZyk7CisJCQlnb3RvIG91dF9lcnI7CisJfQorCS8qIFhYWCBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0IFdSQVAsIHBlcmhhcHMgd2UgZG9uJ3QgY2FyZS4uLiAqLworCWlmIChjdHgtPmNvbmZfYWxnICE9IE5JRF9jYXN0NV9jYmMpIHsKKwkJZHByaW50aygiUlBDOiBnc3Nfc3BrbTNfc2VhbDogY3R4LT5zZWFsYWxnICVkIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQljdHgtPmNvbmZfYWxnKTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCWlmICh0b2t0eXBlID09IFNQS01fTUlDX1RPSykgeworCQl0bXNnbGVuID0gMDsKKwkJLyogQ2FsY3VsYXRlIGNoZWNrc3VtIG92ZXIgdGhlIG1pYy1oZWFkZXIgKi8KKwkJYXNuMV9iaXRzdHJpbmdfbGVuKCZjdHgtPmN0eF9pZCwgJmN0eGVsZW4sICZjdHh6Yml0KTsKKwkJc3BrbTNfbWljX2hlYWRlcigmbWljX2hkci5kYXRhLCAmbWljX2hkci5sZW4sIGN0eC0+Y3R4X2lkLmRhdGEsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICBjdHhlbGVuLCBjdHh6Yml0KTsKKworCQlpZiAobWFrZV9jaGVja3N1bShjaGVja3N1bV90eXBlLCBtaWNfaGRyLmRhdGEsIG1pY19oZHIubGVuLCAKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LCAmbWQ1Y2tzdW0pKQorCQkJZ290byBvdXRfZXJyOworCisJCWFzbjFfYml0c3RyaW5nX2xlbigmbWQ1Y2tzdW0sICZtZDVlbGVuLCAmbWQ1emJpdCk7CisJCXRva2VubGVuID0gMTAgKyBjdHhlbGVuICsgMSArIDIgKyBtZDVlbGVuICsgMTsKKworCQkvKiBDcmVhdGUgdG9rZW4gaGVhZGVyIHVzaW5nIGdlbmVyaWMgcm91dGluZXMgKi8KKwkJdG9rZW4tPmxlbiA9IGdfdG9rZW5fc2l6ZSgmY3R4LT5tZWNoX3VzZWQsIHRva2VubGVuICsgdG1zZ2xlbik7CisKKwkJcHRyID0gdG9rZW4tPmRhdGE7CisJCWdfbWFrZV90b2tlbl9oZWFkZXIoJmN0eC0+bWVjaF91c2VkLCB0b2tlbmxlbiArIHRtc2dsZW4sICZwdHIpOworCisJCXNwa20zX21ha2VfbWljX3Rva2VuKCZwdHIsIHRva2VubGVuLCAmbWljX2hkciwgJm1kNWNrc3VtLCBtZDVlbGVuLCBtZDV6Yml0KTsKKwl9IGVsc2UgaWYgKHRva3R5cGUgPT0gU1BLTV9XUkFQX1RPSykgeyAvKiBOb3QgU3VwcG9ydGVkICovCisJCWRwcmludGsoIlJQQzogZ3NzX3Nwa20zX3NlYWw6IFNQS01fV1JBUF9UT0sgbm90IHN1cHBvcnRlZFxuIik7CisJCWdvdG8gb3V0X2VycjsKKwl9CisJa2ZyZWUobWQ1Y2tzdW0uZGF0YSk7CisKKwkvKiBYWFggbmVlZCB0byBpbXBsZW1lbnQgc2VxdWVuY2UgbnVtYmVycywgYW5kIGN0eC0+ZXhwaXJlZCAqLworCisJcmV0dXJuICBHU1NfU19DT01QTEVURTsKK291dF9lcnI6CisJaWYgKG1kNWNrc3VtLmRhdGEpIAorCQlrZnJlZShtZDVja3N1bS5kYXRhKTsKKwl0b2tlbi0+ZGF0YSA9IE5VTEw7CisJdG9rZW4tPmxlbiA9IDA7CisJcmV0dXJuIEdTU19TX0ZBSUxVUkU7Cit9CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19zcGttM190b2tlbi5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfdG9rZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmMwOGEwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfdG9rZW4uYwpAQCAtMCwwICsxLDI2NiBAQAorLyoKKyAqICBsaW51eC9uZXQvc3VucnBjL2dzc19zcGttM190b2tlbi5jCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMyBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbi4KKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBBbmR5IEFkYW1zb24gPGFuZHJvc0B1bWljaC5lZHU+CisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2dzc19zcGttMy5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorCisjaWZkZWYgUlBDX0RFQlVHCisjIGRlZmluZSBSUENEQkdfRkFDSUxJVFkgICAgICAgIFJQQ0RCR19BVVRICisjZW5kaWYKKworLyoKKyAqIGFzbjFfYml0c3RyaW5nX2xlbigpCisgKgorICogY2FsY3VsYXRlIHRoZSBhc24xIGJpdHN0cmluZyBsZW5ndGggb2YgdGhlIHhkcl9uZXRvYmplY3QKKyAqLwordm9pZAorYXNuMV9iaXRzdHJpbmdfbGVuKHN0cnVjdCB4ZHJfbmV0b2JqICppbiwgaW50ICplbmNsZW4sIGludCAqemVyb2JpdHMpCit7CisJaW50IGksIHpiaXQgPSAwLGVsZW4gPSBpbi0+bGVuOworCWNoYXIgKnB0cjsKKworCXB0ciA9ICZpbi0+ZGF0YVtpbi0+bGVuIC0xXTsKKworCS8qIGNvdW50IHRyYWlsaW5nIDAncyAqLworCWZvcihpID0gaW4tPmxlbjsgaSA+IDA7IGktLSkgeworCQlpZiAoKnB0ciA9PSAwKSB7IAorCQkJcHRyLS07CisJCQllbGVuLS07CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCisJLyogY291bnQgbnVtYmVyIG9mIDAgYml0cyBpbiBmaW5hbCBvY3RldCAqLworCXB0ciA9ICZpbi0+ZGF0YVtlbGVuIC0gMV07CisJZm9yKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCXNob3J0IG1hc2sgPSAweDAxOworCisJCWlmICghKChtYXNrIDw8IGkpICYgKnB0cikpCisJCQl6Yml0Kys7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKwkqZW5jbGVuID0gZWxlbjsKKwkqemVyb2JpdHMgPSB6Yml0OworfQorCisvKgorICogZGVjb2RlX2FzbjFfYml0c3RyaW5nKCkKKyAqIAorICogZGVjb2RlIGEgYml0c3RyaW5nIGludG8gYSBidWZmZXIgb2YgdGhlIGV4cGVjdGVkIGxlbmd0aC4KKyAqIGVuY2xlbiA9IGJpdCBzdHJpbmcgbGVuZ3RoCisgKiBleHBsZW4gPSBleHBlY3RlZCBsZW5ndGggKGRlZmluZSBpbiByZmMpCisgKi8KK2ludAorZGVjb2RlX2FzbjFfYml0c3RyaW5nKHN0cnVjdCB4ZHJfbmV0b2JqICpvdXQsIGNoYXIgKmluLCBpbnQgZW5jbGVuLCBpbnQgZXhwbGVuKQoreworCWlmICghKG91dC0+ZGF0YSA9IGttYWxsb2MoZXhwbGVuLEdGUF9LRVJORUwpKSkKKwkJcmV0dXJuIDA7CisJb3V0LT5sZW4gPSBleHBsZW47CisJbWVtc2V0KG91dC0+ZGF0YSwgMCwgZXhwbGVuKTsKKwltZW1jcHkob3V0LT5kYXRhLCBpbiwgZW5jbGVuKTsKKwlyZXR1cm4gMTsKK30KKworLyogCisgKiBTUEtNSW5uZXJDb250ZXh0VG9rZW4gY2hvaWNlIFNQS01fTUlDIGFzbjEgdG9rZW4gbGF5b3V0CisgKiAKKyAqIGNvbnRleHRpZCBpcyBhbHdheXMgMTYgYnl0ZXMgcGxhaW4gZGF0YS4gbWF4IGFzbjEgYml0c3RyaW5nIGxlbiA9IDE3LgorICoKKyAqIHRva2VubGVuID0gcG9zWzBdIHRvIGVuZCBvZiB0b2tlbiAobWF4IHBvc1s0NV0gd2l0aCBNRDUgY2tzdW0pCisgKgorICogcG9zICB2YWx1ZQorICogLS0tLS0tLS0tLQorICogWzBdCWE0ICBTUEtNLU1JQyB0YWcKKyAqIFsxXQk/PyAgaW5uZXJ0b2tlbiBsZW5ndGggIChtYXggNDQpIAorICogCisgKiAKKyAqIHRva19oZHIgcGllY2Ugb2YgY2hlY2tzdW0gZGF0YSBzdGFydHMgaGVyZSAKKyAqCisgKiB0aGUgbWF4aW11bSBtaWMtaGVhZGVyIGxlbiA9IDkgKyAxNyA9IDI2IAorICoJbWljLWhlYWRlcgorICoJLS0tLS0tLS0tLQorICogWzJdCTMwICAgICAgU0VRVUVOQ0UgdGFnICAKKyAqIFszXQk/PwltaWMtaGVhZGVyIGxlbmd0aDogKG1heCAyMykgPSBUb2tlbklEICsgQ29udGV4dElEIAorICoKKyAqCQlUb2tlbklEICAtIGFsbCBmaWVsZHMgY29uc3RhbnQgYW5kIGNhbiBiZSBoYXJkY29kZWQKKyAqCQktLS0tLS0tCisgKiBbNF0JICAwMglUeXBlIDIKKyAqIFs1XQkgIDAyCUxlbmd0aCAyIAorICogWzZdWzddIDAxIDAxCVRva2VuSUQgKFNQS01fTUlDX1RPSykKKyAqCisgKgkJQ29udGV4dElEICAtIGVuY29kZWQgbGVuZ3RoIG5vdCBjb25zdGFudCwgY2FsY3VsYXRlZAorICoJCS0tLS0tLS0tLQorICogWzhdCTAzCVR5cGUgMworICogWzldCT8/CWVuY29kZWQgbGVuZ3RoCisgKiBbMTBdCT8/CWN0eHpiaXQKKyAqIFsxMV0JIAljb250ZXh0aWQKKyAqCisgKiBtaWNfaGVhZGVyIHBpZWNlIG9mIGNoZWNrc3VtIGRhdGEgZW5kcyBoZXJlLiAKKyAqCisgKglpbnQtY2tzdW0gLSBlbmNvZGVkIGxlbmd0aCBub3QgY29uc3RhbnQsIGNhbGN1bGF0ZWQKKyAqCS0tLS0tLS0tLQorICogWz8/XQkwMwlUeXBlIDMKKyAqIFs/P10JPz8JZW5jb2RlZCBsZW5ndGggCisgKiBbPz9dCT8/CW1kNXpiaXQJCQorICogWz8/XQkgCWludC1ja3N1bSAoTklEX21kNSA9IDE2KQorICoKKyAqIG1heGltdW0gU1BLTS1NSUMgaW5uZXJjb250ZXh0IHRva2VuIGxlbmd0aCA9IAorICoJIDEwICsgZW5jb2RlZCBjb250ZXh0aWRfc2l6ZSgxNyBtYXgpICsgMiArIGVuY29kZWQgIAorICogICAgICAgY2tzdW1fc2l6ZSAoMTcgbWF4Zm9yIE5JRF9tZDUpID0gNDYKKyAqLworCisvKgorICogc3BrbTNfbWljX2hlYWRlcigpCisgKgorICogUHJlcGFyZSB0aGUgU1BLTV9NSUNfVE9LIG1pYy1oZWFkZXIgZm9yIGNoZWNrLXN1bSBjYWxjdWxhdGlvbgorICogZWxlbjogMTYgYnl0ZSBjb250ZXh0IGlkIGFzbjEgYml0c3RyaW5nIGVuY29kZWQgbGVuZ3RoCisgKi8KK3ZvaWQKK3Nwa20zX21pY19oZWFkZXIodW5zaWduZWQgY2hhciAqKmhkcmJ1ZiwgdW5zaWduZWQgaW50ICpoZHJsZW4sIHVuc2lnbmVkIGNoYXIgKmN0eGRhdGEsIGludCBlbGVuLCBpbnQgemJpdCkKK3sKKwljaGFyICpocHRyID0gKmhkcmJ1ZjsKKwljaGFyICp0b3AgPSAqaGRyYnVmOworCisJKih1OCAqKWhwdHIrKyA9IDB4MzA7CisJKih1OCAqKWhwdHIrKyA9IGVsZW4gKyA3OyAgLyogb24gdGhlIHdpcmUgaGVhZGVyIGxlbmd0aCAqLworCisJLyogdG9rZW5pZCAqLworCSoodTggKilocHRyKysgPSAweDAyOworCSoodTggKilocHRyKysgPSAweDAyOworCSoodTggKilocHRyKysgPSAweDAxOworCSoodTggKilocHRyKysgPSAweDAxOworCisJLyogY29uaWV4dGlkICovCisJKih1OCAqKWhwdHIrKyA9IDB4MDM7CisJKih1OCAqKWhwdHIrKyA9IGVsZW4gKyAxOyAvKiBhZGQgMSB0byBpbmNsdWRlIHpiaXQgKi8KKwkqKHU4ICopaHB0cisrID0gemJpdDsKKwltZW1jcHkoaHB0ciwgY3R4ZGF0YSwgZWxlbik7CisJaHB0ciArPSBlbGVuOworCSpoZHJsZW4gPSBocHRyIC0gdG9wOyAKK30KKwkJCisvKiAKKyAqIHNwa20zX21pY19pbm5lcmNvbnRleHRfdG9rZW4oKQorICoKKyAqICp0b2twIHBvaW50cyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBTUEtNX01JQyB0b2tlbiAgZGVzY3JpYmVkIAorICogaW4gcmZjIDIwMjUsIHNlY3Rpb24gMy4yLjE6IAorICoKKyAqLwordm9pZAorc3BrbTNfbWFrZV9taWNfdG9rZW4odW5zaWduZWQgY2hhciAqKnRva3AsIGludCB0b2tsZW4sIHN0cnVjdCB4ZHJfbmV0b2JqICptaWNfaGRyLCBzdHJ1Y3QgeGRyX25ldG9iaiAqbWQ1Y2tzdW0sIGludCBtZDVlbGVuLCBpbnQgbWQ1emJpdCkKK3sKKwl1bnNpZ25lZCBjaGFyICppY3QgPSAqdG9rcDsKKworCSoodTggKilpY3QrKyA9IDB4YTQ7CisJKih1OCAqKWljdCsrID0gdG9rbGVuIC0gMjsgCisJbWVtY3B5KGljdCwgbWljX2hkci0+ZGF0YSwgbWljX2hkci0+bGVuKTsKKwlpY3QgKz0gbWljX2hkci0+bGVuOworCisJKih1OCAqKWljdCsrID0gMHgwMzsKKwkqKHU4ICopaWN0KysgPSBtZDVlbGVuICsgMTsgLyogYWRkIDEgdG8gaW5jbHVkZSB6Yml0ICovCisJKih1OCAqKWljdCsrID0gbWQ1emJpdDsKKwltZW1jcHkoaWN0LCBtZDVja3N1bS0+ZGF0YSwgbWQ1ZWxlbik7Cit9CisKK3UzMgorc3BrbTNfdmVyaWZ5X21pY190b2tlbih1bnNpZ25lZCBjaGFyICoqdG9rcCwgaW50ICptaWNfaGRybGVuLCB1bnNpZ25lZCBjaGFyICoqY2tzdW0pCit7CisJc3RydWN0IHhkcl9uZXRvYmogICAgICAgc3BrbTNfY3R4X2lkID0gey5sZW4gPTAsIC5kYXRhID0gTlVMTH07CisJdW5zaWduZWQgY2hhciAJCSpwdHIgPSAqdG9rcDsKKwlpbnQgCQkJY3R4ZWxlbjsKKwl1MzIgICAgIAkJcmV0ID0gR1NTX1NfREVGRUNUSVZFX1RPS0VOOworCisJLyogc3BrbTMgaW5uZXJjb250ZXh0IHRva2VuIHByZWFtYmxlICovCisJaWYgKChwdHJbMF0gIT0gMHhhNCkgfHwgKHB0clsyXSAhPSAweDMwKSkgeworCQlkcHJpbnRrKCJSUEM6IEJBRCBTUEtNIGljdG9rZW4gcHJlYW1ibGVcbiIpOyAKKwkJZ290byBvdXQ7CisJfQorCisJKm1pY19oZHJsZW4gPSBwdHJbM107CisKKwkvKiB0b2tlbiB0eXBlICovCisJaWYgKChwdHJbNF0gIT0gMHgwMikgfHwgKHB0cls1XSAhPSAweDAyKSkgeworCQlkcHJpbnRrKCJSUEM6IEJBRCBhc24xIFNQS00zIHRva2VuIHR5cGVcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBvbmx5IHN1cHBvcnQgU1BLTV9NSUNfVE9LICovCisJaWYoKHB0cls2XSAhPSAweDAxKSB8fCAocHRyWzddICE9IDB4MDEpKSB7CisJCWRwcmludGsoIlJQQzogRVJST1IgdW5zdXBwb3J0ZWQgU1BLTTMgdG9rZW4gXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogY29udGV4dGlkICovCisJaWYgKHB0cls4XSAhPSAweDAzKSB7CisJCWRwcmludGsoIlJQQzogQkFEIFNQS00zIGFzbjEgY29udGV4dC1pZCB0eXBlXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJY3R4ZWxlbiA9IHB0cls5XTsKKwlpZiAoY3R4ZWxlbiA+IDE3KSB7ICAvKiBsZW5ndGggaW5jbHVkZXMgYXNuMSB6Yml0IG9jdGV0ICovCisJCWRwcmludGsoIlJQQzogQkFEIFNQS00zIGNvbnRleHRpZCBsZW4gJWRcbiIsIGN0eGVsZW4pOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBpZ25vcmUgcHRyWzEwXSAqLworCisJaWYoIWRlY29kZV9hc24xX2JpdHN0cmluZygmc3BrbTNfY3R4X2lkLCAmcHRyWzExXSwgY3R4ZWxlbiAtIDEsIDE2KSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSogaW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb246IHRoZSBvcHRpb25hbCBpbnQtYWxnIGlzIG5vdCBwcmVzZW50IAorCSogc28gdGhlIGRlZmF1bHQgaW50LWFsZyAobWQ1KSBpcyB1c2VkIHRoZSBvcHRpb25hbCBzbmQtc2VxIGZpZWxkIGlzIAorCSogYWxzbyBub3QgcHJlc2VudCAKKwkqLworCisJaWYgKCptaWNfaGRybGVuICE9IDYgKyBjdHhlbGVuKSB7CisJCWRwcmludGsoIlJQQzogQkFEIFNQS01fIE1JQ19UT0sgaGVhZGVyIGxlbiAlZDogd2Ugb25seSBzdXBwb3J0IGRlZmF1bHQgaW50LWFsZyAoc2hvdWxkIGJlIGFic2VudCkgYW5kIGRvIG5vdCBzdXBwb3J0IHNuZC1zZXFcbiIsICptaWNfaGRybGVuKTsKKwkJZ290byBvdXQ7CisJfQorCS8qIGNoZWNrc3VtICovCisgICAgICAgICpja3N1bSA9ICgmcHRyWzEwXSArIGN0eGVsZW4pOyAvKiBjdHhlbGVuIGluY2x1ZGVzIHB0clsxMF0gKi8KKworCXJldCA9IEdTU19TX0NPTVBMRVRFOworb3V0OgorCWlmIChzcGttM19jdHhfaWQuZGF0YSkKKwkJa2ZyZWUoc3BrbTNfY3R4X2lkLmRhdGEpOworCXJldHVybiByZXQ7Cit9CisKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX3Nwa20zX3Vuc2VhbC5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfdW5zZWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVjZTgxYgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX3Nwa20zX3Vuc2VhbC5jCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogIGxpbnV4L25ldC9zdW5ycGMvZ3NzX3Nwa20zX3Vuc2VhbC5jCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMyBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbi4KKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBBbmR5IEFkYW1zb24gPGFuZHJvc0B1bWljaC5lZHU+CisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2dzc19zcGttMy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorCisjaWZkZWYgUlBDX0RFQlVHCisjIGRlZmluZSBSUENEQkdfRkFDSUxJVFkgICAgICAgIFJQQ0RCR19BVVRICisjZW5kaWYKKworLyoKKyAqIHNwa20zX3JlYWRfdG9rZW4oKQorICogCisgKiBvbmx5IFNQS01fTUlDX1RPSyB3aXRoIG1kNSBpbnRnLWFsZyBpcyBzdXBwb3J0ZWQKKyAqLwordTMyCitzcGttM19yZWFkX3Rva2VuKHN0cnVjdCBzcGttM19jdHggKmN0eCwKKwkJc3RydWN0IHhkcl9uZXRvYmogKnJlYWRfdG9rZW4sICAgIC8qIGNoZWNrc3VtICovCisJCXN0cnVjdCB4ZHJfYnVmICptZXNzYWdlX2J1ZmZlciwgLyogc2lnbmJ1ZiAqLworCQlpbnQgKnFvcF9zdGF0ZSwgaW50IHRva3R5cGUpCit7CisJczMyCQkJY29kZTsKKwlzdHJ1Y3QgeGRyX25ldG9iagl3aXJlX2Nrc3VtID0gey5sZW4gPTAsIC5kYXRhID0gTlVMTH07CisJc3RydWN0IHhkcl9uZXRvYmoJbWQ1Y2tzdW0gPSB7LmxlbiA9IDAsIC5kYXRhID0gTlVMTH07CisJdW5zaWduZWQgY2hhcgkJKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopcmVhZF90b2tlbi0+ZGF0YTsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAqY2tzdW07CisJaW50CQkJYm9keXNpemUsIG1kNWVsZW47CisJaW50CQkJbWljX2hkcmxlbjsKKwl1MzIJCQlyZXQgPSBHU1NfU19ERUZFQ1RJVkVfVE9LRU47CisKKwlkcHJpbnRrKCJSUEM6IHNwa20zX3JlYWRfdG9rZW4gcmVhZF90b2tlbi0+bGVuICVkXG4iLCByZWFkX3Rva2VuLT5sZW4pOworCisJaWYgKGdfdmVyaWZ5X3Rva2VuX2hlYWRlcigoc3RydWN0IHhkcl9uZXRvYmogKikgJmN0eC0+bWVjaF91c2VkLAorCQkJCQkmYm9keXNpemUsICZwdHIsIHJlYWRfdG9rZW4tPmxlbikpCisJCWdvdG8gb3V0OworCisJLyogZGVjb2RlIHRoZSB0b2tlbiAqLworCisJaWYgKHRva3R5cGUgPT0gU1BLTV9NSUNfVE9LKSB7CisKKwkJaWYgKChyZXQgPSBzcGttM192ZXJpZnlfbWljX3Rva2VuKCZwdHIsICZtaWNfaGRybGVuLCAmY2tzdW0pKSkgCisJCQlnb3RvIG91dDsKKworCQlpZiAoKmNrc3VtKysgIT0gMHgwMykgeworCQkJZHByaW50aygiUlBDOiBzcGttM19yZWFkX3Rva2VuIEJBRCBjaGVja3N1bSB0eXBlXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCW1kNWVsZW4gPSAqY2tzdW0rKzsgCisJCWNrc3VtKys7IAkvKiBtb3ZlIHBhc3QgdGhlIHpiaXQgKi8KKwkKKwkJaWYoIWRlY29kZV9hc24xX2JpdHN0cmluZygmd2lyZV9ja3N1bSwgY2tzdW0sIG1kNWVsZW4gLSAxLCAxNikpCisJCQlnb3RvIG91dDsKKworCQkvKiBIQVJEIENPREVEIEZPUiBNRDUgKi8KKworCQkvKiBjb21wdXRlIHRoZSBjaGVja3N1bSBvZiB0aGUgbWVzc2FnZS4KKwkJKiAgcHRyICsgMiA9IHN0YXJ0IG9mIGhlYWRlciBwaWVjZSBvZiBjaGVja3N1bQorCQkqICBtaWNfaGRybGVuICsgMiA9IGxlbmd0aCBvZiBoZWFkZXIgcGllY2Ugb2YgY2hlY2tzdW0KKwkJKi8KKwkJcmV0ID0gR1NTX1NfREVGRUNUSVZFX1RPS0VOOworCQljb2RlID0gbWFrZV9jaGVja3N1bShDS1NVTVRZUEVfUlNBX01ENSwgcHRyICsgMiwgCisJCQkJCW1pY19oZHJsZW4gKyAyLCAKKwkJICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9idWZmZXIsICZtZDVja3N1bSk7CisKKwkJaWYgKGNvZGUpCisJCQlnb3RvIG91dDsKKworCQlkcHJpbnRrKCJSUEM6IHNwa20zX3JlYWRfdG9rZW46IGRpZ2VzdCB3aXJlX2Nrc3VtLmxlbiAlZDpcbiIsIAorCQkJd2lyZV9ja3N1bS5sZW4pOworCQlkcHJpbnRrKCIgICAgICAgICAgbWQ1Y2tzdW0uZGF0YVxuIik7CisJCXByaW50X2hleGwoKHUzMiAqKSBtZDVja3N1bS5kYXRhLCAxNiwgMCk7CisJCWRwcmludGsoIiAgICAgICAgICBja3N1bS5kYXRhOlxuIik7CisJCXByaW50X2hleGwoKHUzMiAqKSB3aXJlX2Nrc3VtLmRhdGEsIHdpcmVfY2tzdW0ubGVuLCAwKTsKKworCQlyZXQgPSBHU1NfU19CQURfU0lHOworCQljb2RlID0gbWVtY21wKG1kNWNrc3VtLmRhdGEsIHdpcmVfY2tzdW0uZGF0YSwgd2lyZV9ja3N1bS5sZW4pOworCQlpZiAoY29kZSkKKwkJCWdvdG8gb3V0OworCisJfSBlbHNlIHsgCisJCWRwcmludGsoIlJQQzogQkFEIG9yIFVOU1VQUE9SVEVEIFNQS00zIHRva2VuIHR5cGU6ICVkXG4iLHRva3R5cGUpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBYWFg6IG5lZWQgdG8gYWRkIGV4cGlyYXRpb24gYW5kIHNlcXVlbmNpbmcgKi8KKwlyZXQgPSBHU1NfU19DT01QTEVURTsKK291dDoKKwlpZiAobWQ1Y2tzdW0uZGF0YSkgCisJCWtmcmVlKG1kNWNrc3VtLmRhdGEpOworCWlmICh3aXJlX2Nrc3VtLmRhdGEpIAorCQlrZnJlZSh3aXJlX2Nrc3VtLmRhdGEpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL3N2Y2F1dGhfZ3NzLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL3N2Y2F1dGhfZ3NzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4ZmUzYgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYwpAQCAtMCwwICsxLDEwODAgQEAKKy8qCisgKiBOZWlsIEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisgKiBKLiBCcnVjZSBGaWVsZHMgPGJmaWVsZHNAdW1pY2guZWR1PgorICogQW5keSBBZGFtc29uIDxhbmRyb3NAdW1pY2guZWR1PgorICogRHVnIFNvbmcgPGR1Z3NvbmdAbW9ua2V5Lm9yZz4KKyAqCisgKiBSUENTRUNfR1NTIHNlcnZlciBhdXRoZW50aWNhdGlvbi4KKyAqIFRoaXMgaW1wbGVtZW50cyBSUENTRUNfR1NTIGFzIGRlZmluZWQgaW4gcmZjMjIwMyAocnBjc2VjX2dzcykgYW5kIHJmYzIwNzgKKyAqIChnc3NhcGkpCisgKgorICogVGhlIFJQQ1NFQ19HU1MgaW52b2x2ZXMgdGhyZWUgc3RhZ2VzOgorICogIDEvIGNvbnRleHQgY3JlYXRpb24KKyAqICAyLyBkYXRhIGV4Y2hhbmdlCisgKiAgMy8gY29udGV4dCBkZXN0cnVjdGlvbgorICoKKyAqIENvbnRleHQgY3JlYXRpb24gaXMgaGFuZGxlZCBsYXJnZWx5IGJ5IHVwY2FsbHMgdG8gdXNlci1zcGFjZS4KKyAqICBJbiBwYXJ0aWN1bGFyLCBHU1NfQWNjZXB0X3NlY19jb250ZXh0IGlzIGhhbmRsZWQgYnkgYW4gdXBjYWxsCisgKiBEYXRhIGV4Y2hhbmdlIGlzIGhhbmRsZWQgZW50aXJlbHkgd2l0aGluIHRoZSBrZXJuZWwKKyAqICBJbiBwYXJ0aWN1bGFyLCBHU1NfR2V0TUlDLCBHU1NfVmVyaWZ5TUlDLCBHU1NfU2VhbCwgR1NTX1Vuc2VhbCBhcmUgaW4ta2VybmVsLgorICogQ29udGV4dCBkZXN0cnVjdGlvbiBpcyBoYW5kbGVkIGluLWtlcm5lbAorICogIEdTU19EZWxldGVfc2VjX2NvbnRleHQgaXMgaW4ta2VybmVsCisgKgorICogQ29udGV4dCBjcmVhdGlvbiBpcyBpbml0aWF0ZWQgYnkgYSBSUENTRUNfR1NTX0lOSVQgcmVxdWVzdCBhcnJpdmluZy4KKyAqIFRoZSBjb250ZXh0IGhhbmRsZSBhbmQgZ3NzX3Rva2VuIGFyZSB1c2VkIGFzIGEga2V5IGludG8gdGhlIHJwY3NlY19pbml0IGNhY2hlLgorICogVGhlIGNvbnRlbnQgb2YgdGhpcyBjYWNoZSBpbmNsdWRlcyBzb21lIG9mIHRoZSBvdXRwdXRzIG9mIEdTU19BY2NlcHRfc2VjX2NvbnRleHQsCisgKiBiZWluZyBtYWpvcl9zdGF0dXMsIG1pbm9yX3N0YXR1cywgY29udGV4dF9oYW5kbGUsIHJlcGx5X3Rva2VuLgorICogVGhlc2UgYXJlIHNlbnQgYmFjayB0byB0aGUgY2xpZW50LgorICogU2VxdWVuY2Ugd2luZG93IG1hbmFnZW1lbnQgaXMgaGFuZGxlZCBieSB0aGUga2VybmVsLiAgVGhlIHdpbmRvdyBzaXplIGlmIGN1cnJlbnRseQorICogYSBjb21waWxlIHRpbWUgY29uc3RhbnQuCisgKgorICogV2hlbiB1c2VyLXNwYWNlIGlzIGhhcHB5IHRoYXQgYSBjb250ZXh0IGlzIGVzdGFibGlzaGVkLCBpdCBwbGFjZXMgYW4gZW50cnkKKyAqIGluIHRoZSBycGNzZWNfY29udGV4dCBjYWNoZS4gVGhlIGtleSBmb3IgdGhpcyBjYWNoZSBpcyB0aGUgY29udGV4dF9oYW5kbGUuCisgKiBUaGUgY29udGVudCBpbmNsdWRlczoKKyAqICAgdWlkL2dpZGxpc3QgLSBmb3IgZGV0ZXJtaW5pbmcgYWNjZXNzIHJpZ2h0cworICogICBtZWNoYW5pc20gdHlwZQorICogICBtZWNoYW5pc20gc3BlY2lmaWMgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYSBrZXkKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorCisjaW5jbHVkZSA8bGludXgvc3VucnBjL2F1dGhfZ3NzLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Y2F1dGguaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZ3NzX2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNhdXRoLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Y2F1dGhfZ3NzLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NhY2hlLmg+CisKKyNpZmRlZiBSUENfREVCVUcKKyMgZGVmaW5lIFJQQ0RCR19GQUNJTElUWQlSUENEQkdfQVVUSAorI2VuZGlmCisKKy8qIFRoZSBycGNzZWNfaW5pdCBjYWNoZSBpcyB1c2VkIGZvciBtYXBwaW5nIFJQQ1NFQ19HU1NfeyxDT05UX31JTklUIHJlcXVlc3RzCisgKiBpbnRvIHJlcGxpZXMuCisgKgorICogS2V5IGlzIGNvbnRleHQgaGFuZGxlIChceCBpZiBlbXB0eSkgYW5kIGdzc190b2tlbi4KKyAqIENvbnRlbnQgaXMgbWFqb3Jfc3RhdHVzIG1pbm9yX3N0YXR1cyAoaW50ZWdlcnMpIGNvbnRleHRfaGFuZGxlLCByZXBseV90b2tlbi4KKyAqCisgKi8KKworc3RhdGljIGludCBuZXRvYmpfZXF1YWwoc3RydWN0IHhkcl9uZXRvYmogKmEsIHN0cnVjdCB4ZHJfbmV0b2JqICpiKQoreworCXJldHVybiBhLT5sZW4gPT0gYi0+bGVuICYmIDAgPT0gbWVtY21wKGEtPmRhdGEsIGItPmRhdGEsIGEtPmxlbik7Cit9CisKKyNkZWZpbmUJUlNJX0hBU0hCSVRTCTYKKyNkZWZpbmUJUlNJX0hBU0hNQVgJKDE8PFJTSV9IQVNIQklUUykKKyNkZWZpbmUJUlNJX0hBU0hNQVNLCShSU0lfSEFTSE1BWC0xKQorCitzdHJ1Y3QgcnNpIHsKKwlzdHJ1Y3QgY2FjaGVfaGVhZAloOworCXN0cnVjdCB4ZHJfbmV0b2JqCWluX2hhbmRsZSwgaW5fdG9rZW47CisJc3RydWN0IHhkcl9uZXRvYmoJb3V0X2hhbmRsZSwgb3V0X3Rva2VuOworCWludAkJCW1ham9yX3N0YXR1cywgbWlub3Jfc3RhdHVzOworfTsKKworc3RhdGljIHN0cnVjdCBjYWNoZV9oZWFkICpyc2lfdGFibGVbUlNJX0hBU0hNQVhdOworc3RhdGljIHN0cnVjdCBjYWNoZV9kZXRhaWwgcnNpX2NhY2hlOworc3RhdGljIHN0cnVjdCByc2kgKnJzaV9sb29rdXAoc3RydWN0IHJzaSAqaXRlbSwgaW50IHNldCk7CisKK3N0YXRpYyB2b2lkIHJzaV9mcmVlKHN0cnVjdCByc2kgKnJzaWkpCit7CisJa2ZyZWUocnNpaS0+aW5faGFuZGxlLmRhdGEpOworCWtmcmVlKHJzaWktPmluX3Rva2VuLmRhdGEpOworCWtmcmVlKHJzaWktPm91dF9oYW5kbGUuZGF0YSk7CisJa2ZyZWUocnNpaS0+b3V0X3Rva2VuLmRhdGEpOworfQorCitzdGF0aWMgdm9pZCByc2lfcHV0KHN0cnVjdCBjYWNoZV9oZWFkICppdGVtLCBzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCkKK3sKKwlzdHJ1Y3QgcnNpICpyc2lpID0gY29udGFpbmVyX29mKGl0ZW0sIHN0cnVjdCByc2ksIGgpOworCWlmIChjYWNoZV9wdXQoaXRlbSwgY2QpKSB7CisJCXJzaV9mcmVlKHJzaWkpOworCQlrZnJlZShyc2lpKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJzaV9oYXNoKHN0cnVjdCByc2kgKml0ZW0pCit7CisJcmV0dXJuIGhhc2hfbWVtKGl0ZW0tPmluX2hhbmRsZS5kYXRhLCBpdGVtLT5pbl9oYW5kbGUubGVuLCBSU0lfSEFTSEJJVFMpCisJICAgICBeIGhhc2hfbWVtKGl0ZW0tPmluX3Rva2VuLmRhdGEsIGl0ZW0tPmluX3Rva2VuLmxlbiwgUlNJX0hBU0hCSVRTKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcnNpX21hdGNoKHN0cnVjdCByc2kgKml0ZW0sIHN0cnVjdCByc2kgKnRtcCkKK3sKKwlyZXR1cm4gbmV0b2JqX2VxdWFsKCZpdGVtLT5pbl9oYW5kbGUsICZ0bXAtPmluX2hhbmRsZSkKKwkJJiYgbmV0b2JqX2VxdWFsKCZpdGVtLT5pbl90b2tlbiwgJnRtcC0+aW5fdG9rZW4pOworfQorCitzdGF0aWMgaW50IGR1cF90b19uZXRvYmooc3RydWN0IHhkcl9uZXRvYmogKmRzdCwgY2hhciAqc3JjLCBpbnQgbGVuKQoreworCWRzdC0+bGVuID0gbGVuOworCWRzdC0+ZGF0YSA9IChsZW4gPyBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCkgOiBOVUxMKTsKKwlpZiAoZHN0LT5kYXRhKQorCQltZW1jcHkoZHN0LT5kYXRhLCBzcmMsIGxlbik7CisJaWYgKGxlbiAmJiAhZHN0LT5kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZHVwX25ldG9iaihzdHJ1Y3QgeGRyX25ldG9iaiAqZHN0LCBzdHJ1Y3QgeGRyX25ldG9iaiAqc3JjKQoreworCXJldHVybiBkdXBfdG9fbmV0b2JqKGRzdCwgc3JjLT5kYXRhLCBzcmMtPmxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByc2lfaW5pdChzdHJ1Y3QgcnNpICpuZXcsIHN0cnVjdCByc2kgKml0ZW0pCit7CisJbmV3LT5vdXRfaGFuZGxlLmRhdGEgPSBOVUxMOworCW5ldy0+b3V0X2hhbmRsZS5sZW4gPSAwOworCW5ldy0+b3V0X3Rva2VuLmRhdGEgPSBOVUxMOworCW5ldy0+b3V0X3Rva2VuLmxlbiA9IDA7CisJbmV3LT5pbl9oYW5kbGUubGVuID0gaXRlbS0+aW5faGFuZGxlLmxlbjsKKwlpdGVtLT5pbl9oYW5kbGUubGVuID0gMDsKKwluZXctPmluX3Rva2VuLmxlbiA9IGl0ZW0tPmluX3Rva2VuLmxlbjsKKwlpdGVtLT5pbl90b2tlbi5sZW4gPSAwOworCW5ldy0+aW5faGFuZGxlLmRhdGEgPSBpdGVtLT5pbl9oYW5kbGUuZGF0YTsKKwlpdGVtLT5pbl9oYW5kbGUuZGF0YSA9IE5VTEw7CisJbmV3LT5pbl90b2tlbi5kYXRhID0gaXRlbS0+aW5fdG9rZW4uZGF0YTsKKwlpdGVtLT5pbl90b2tlbi5kYXRhID0gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJzaV91cGRhdGUoc3RydWN0IHJzaSAqbmV3LCBzdHJ1Y3QgcnNpICppdGVtKQoreworCUJVR19PTihuZXctPm91dF9oYW5kbGUuZGF0YSB8fCBuZXctPm91dF90b2tlbi5kYXRhKTsKKwluZXctPm91dF9oYW5kbGUubGVuID0gaXRlbS0+b3V0X2hhbmRsZS5sZW47CisJaXRlbS0+b3V0X2hhbmRsZS5sZW4gPSAwOworCW5ldy0+b3V0X3Rva2VuLmxlbiA9IGl0ZW0tPm91dF90b2tlbi5sZW47CisJaXRlbS0+b3V0X3Rva2VuLmxlbiA9IDA7CisJbmV3LT5vdXRfaGFuZGxlLmRhdGEgPSBpdGVtLT5vdXRfaGFuZGxlLmRhdGE7CisJaXRlbS0+b3V0X2hhbmRsZS5kYXRhID0gTlVMTDsKKwluZXctPm91dF90b2tlbi5kYXRhID0gaXRlbS0+b3V0X3Rva2VuLmRhdGE7CisJaXRlbS0+b3V0X3Rva2VuLmRhdGEgPSBOVUxMOworCisJbmV3LT5tYWpvcl9zdGF0dXMgPSBpdGVtLT5tYWpvcl9zdGF0dXM7CisJbmV3LT5taW5vcl9zdGF0dXMgPSBpdGVtLT5taW5vcl9zdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIHJzaV9yZXF1ZXN0KHN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY2FjaGVfaGVhZCAqaCwKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKmJwcCwgaW50ICpibGVuKQoreworCXN0cnVjdCByc2kgKnJzaWkgPSBjb250YWluZXJfb2YoaCwgc3RydWN0IHJzaSwgaCk7CisKKwlxd29yZF9hZGRoZXgoYnBwLCBibGVuLCByc2lpLT5pbl9oYW5kbGUuZGF0YSwgcnNpaS0+aW5faGFuZGxlLmxlbik7CisJcXdvcmRfYWRkaGV4KGJwcCwgYmxlbiwgcnNpaS0+aW5fdG9rZW4uZGF0YSwgcnNpaS0+aW5fdG9rZW4ubGVuKTsKKwkoKmJwcClbLTFdID0gJ1xuJzsKK30KKworCitzdGF0aWMgaW50IHJzaV9wYXJzZShzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCwKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqbWVzZywgaW50IG1sZW4pCit7CisJLyogY29udGV4dCB0b2tlbiBleHBpcnkgbWFqb3IgbWlub3IgY29udGV4dCB0b2tlbiAqLworCWNoYXIgKmJ1ZiA9IG1lc2c7CisJY2hhciAqZXA7CisJaW50IGxlbjsKKwlzdHJ1Y3QgcnNpIHJzaWksICpyc2lwID0gTlVMTDsKKwl0aW1lX3QgZXhwaXJ5OworCWludCBzdGF0dXMgPSAtRUlOVkFMOworCisJbWVtc2V0KCZyc2lpLCAwLCBzaXplb2YocnNpaSkpOworCS8qIGhhbmRsZSAqLworCWxlbiA9IHF3b3JkX2dldCgmbWVzZywgYnVmLCBtbGVuKTsKKwlpZiAobGVuIDwgMCkKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gLUVOT01FTTsKKwlpZiAoZHVwX3RvX25ldG9iaigmcnNpaS5pbl9oYW5kbGUsIGJ1ZiwgbGVuKSkKKwkJZ290byBvdXQ7CisKKwkvKiB0b2tlbiAqLworCWxlbiA9IHF3b3JkX2dldCgmbWVzZywgYnVmLCBtbGVuKTsKKwlzdGF0dXMgPSAtRUlOVkFMOworCWlmIChsZW4gPCAwKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSAtRU5PTUVNOworCWlmIChkdXBfdG9fbmV0b2JqKCZyc2lpLmluX3Rva2VuLCBidWYsIGxlbikpCisJCWdvdG8gb3V0OworCisJcnNpaS5oLmZsYWdzID0gMDsKKwkvKiBleHBpcnkgKi8KKwlleHBpcnkgPSBnZXRfZXhwaXJ5KCZtZXNnKTsKKwlzdGF0dXMgPSAtRUlOVkFMOworCWlmIChleHBpcnkgPT0gMCkKKwkJZ290byBvdXQ7CisKKwkvKiBtYWpvci9taW5vciAqLworCWxlbiA9IHF3b3JkX2dldCgmbWVzZywgYnVmLCBtbGVuKTsKKwlpZiAobGVuIDwgMCkKKwkJZ290byBvdXQ7CisJaWYgKGxlbiA9PSAwKSB7CisJCWdvdG8gb3V0OworCX0gZWxzZSB7CisJCXJzaWkubWFqb3Jfc3RhdHVzID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmZXAsIDEwKTsKKwkJaWYgKCplcCkKKwkJCWdvdG8gb3V0OworCQlsZW4gPSBxd29yZF9nZXQoJm1lc2csIGJ1ZiwgbWxlbik7CisJCWlmIChsZW4gPD0gMCkKKwkJCWdvdG8gb3V0OworCQlyc2lpLm1pbm9yX3N0YXR1cyA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmVwLCAxMCk7CisJCWlmICgqZXApCisJCQlnb3RvIG91dDsKKworCQkvKiBvdXRfaGFuZGxlICovCisJCWxlbiA9IHF3b3JkX2dldCgmbWVzZywgYnVmLCBtbGVuKTsKKwkJaWYgKGxlbiA8IDApCisJCQlnb3RvIG91dDsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJaWYgKGR1cF90b19uZXRvYmooJnJzaWkub3V0X2hhbmRsZSwgYnVmLCBsZW4pKQorCQkJZ290byBvdXQ7CisKKwkJLyogb3V0X3Rva2VuICovCisJCWxlbiA9IHF3b3JkX2dldCgmbWVzZywgYnVmLCBtbGVuKTsKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJaWYgKGxlbiA8IDApCisJCQlnb3RvIG91dDsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJaWYgKGR1cF90b19uZXRvYmooJnJzaWkub3V0X3Rva2VuLCBidWYsIGxlbikpCisJCQlnb3RvIG91dDsKKwl9CisJcnNpaS5oLmV4cGlyeV90aW1lID0gZXhwaXJ5OworCXJzaXAgPSByc2lfbG9va3VwKCZyc2lpLCAxKTsKKwlzdGF0dXMgPSAwOworb3V0OgorCXJzaV9mcmVlKCZyc2lpKTsKKwlpZiAocnNpcCkKKwkJcnNpX3B1dCgmcnNpcC0+aCwgJnJzaV9jYWNoZSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHN0cnVjdCBjYWNoZV9kZXRhaWwgcnNpX2NhY2hlID0geworCS5oYXNoX3NpemUJPSBSU0lfSEFTSE1BWCwKKwkuaGFzaF90YWJsZSAgICAgPSByc2lfdGFibGUsCisJLm5hbWUgICAgICAgICAgID0gImF1dGgucnBjc2VjLmluaXQiLAorCS5jYWNoZV9wdXQgICAgICA9IHJzaV9wdXQsCisJLmNhY2hlX3JlcXVlc3QgID0gcnNpX3JlcXVlc3QsCisJLmNhY2hlX3BhcnNlICAgID0gcnNpX3BhcnNlLAorfTsKKworc3RhdGljIERlZmluZVNpbXBsZUNhY2hlTG9va3VwKHJzaSwgMCkKKworLyoKKyAqIFRoZSBycGNzZWNfY29udGV4dCBjYWNoZSBpcyB1c2VkIHRvIHN0b3JlIGEgY29udGV4dCB0aGF0IGlzCisgKiB1c2VkIGluIGRhdGEgZXhjaGFuZ2UuCisgKiBUaGUga2V5IGlzIGEgY29udGV4dCBoYW5kbGUuIFRoZSBjb250ZW50IGlzOgorICogIHVpZCwgZ2lkbGlzdCwgbWVjaGFuaXNtLCBzZXJ2aWNlLXNldCwgbWVjaC1zcGVjaWZpYy1kYXRhCisgKi8KKworI2RlZmluZQlSU0NfSEFTSEJJVFMJMTAKKyNkZWZpbmUJUlNDX0hBU0hNQVgJKDE8PFJTQ19IQVNIQklUUykKKyNkZWZpbmUJUlNDX0hBU0hNQVNLCShSU0NfSEFTSE1BWC0xKQorCisjZGVmaW5lIEdTU19TRVFfV0lOCTEyOAorCitzdHJ1Y3QgZ3NzX3N2Y19zZXFfZGF0YSB7CisJLyogaGlnaGVzdCBzZXEgbnVtYmVyIHNlZW4gc28gZmFyOiAqLworCWludAkJCXNkX21heDsKKwkvKiBmb3IgaSBzdWNoIHRoYXQgc2RfbWF4LUdTU19TRVFfV0lOIDwgaSA8PSBzZF9tYXgsIHRoZSBpLXRoIGJpdCBvZgorCSAqIHNkX3dpbiBpcyBub256ZXJvIGlmZiBzZXF1ZW5jZSBudW1iZXIgaSBoYXMgYmVlbiBzZWVuIGFscmVhZHk6ICovCisJdW5zaWduZWQgbG9uZwkJc2Rfd2luW0dTU19TRVFfV0lOL0JJVFNfUEVSX0xPTkddOworCXNwaW5sb2NrX3QJCXNkX2xvY2s7Cit9OworCitzdHJ1Y3QgcnNjIHsKKwlzdHJ1Y3QgY2FjaGVfaGVhZAloOworCXN0cnVjdCB4ZHJfbmV0b2JqCWhhbmRsZTsKKwlzdHJ1Y3Qgc3ZjX2NyZWQJCWNyZWQ7CisJc3RydWN0IGdzc19zdmNfc2VxX2RhdGEJc2VxZGF0YTsKKwlzdHJ1Y3QgZ3NzX2N0eAkJKm1lY2hjdHg7Cit9OworCitzdGF0aWMgc3RydWN0IGNhY2hlX2hlYWQgKnJzY190YWJsZVtSU0NfSEFTSE1BWF07CitzdGF0aWMgc3RydWN0IGNhY2hlX2RldGFpbCByc2NfY2FjaGU7CitzdGF0aWMgc3RydWN0IHJzYyAqcnNjX2xvb2t1cChzdHJ1Y3QgcnNjICppdGVtLCBpbnQgc2V0KTsKKworc3RhdGljIHZvaWQgcnNjX2ZyZWUoc3RydWN0IHJzYyAqcnNjaSkKK3sKKwlrZnJlZShyc2NpLT5oYW5kbGUuZGF0YSk7CisJaWYgKHJzY2ktPm1lY2hjdHgpCisJCWdzc19kZWxldGVfc2VjX2NvbnRleHQoJnJzY2ktPm1lY2hjdHgpOworCWlmIChyc2NpLT5jcmVkLmNyX2dyb3VwX2luZm8pCisJCXB1dF9ncm91cF9pbmZvKHJzY2ktPmNyZWQuY3JfZ3JvdXBfaW5mbyk7Cit9CisKK3N0YXRpYyB2b2lkIHJzY19wdXQoc3RydWN0IGNhY2hlX2hlYWQgKml0ZW0sIHN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkKQoreworCXN0cnVjdCByc2MgKnJzY2kgPSBjb250YWluZXJfb2YoaXRlbSwgc3RydWN0IHJzYywgaCk7CisKKwlpZiAoY2FjaGVfcHV0KGl0ZW0sIGNkKSkgeworCQlyc2NfZnJlZShyc2NpKTsKKwkJa2ZyZWUocnNjaSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludAorcnNjX2hhc2goc3RydWN0IHJzYyAqcnNjaSkKK3sKKwlyZXR1cm4gaGFzaF9tZW0ocnNjaS0+aGFuZGxlLmRhdGEsIHJzY2ktPmhhbmRsZS5sZW4sIFJTQ19IQVNIQklUUyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cityc2NfbWF0Y2goc3RydWN0IHJzYyAqbmV3LCBzdHJ1Y3QgcnNjICp0bXApCit7CisJcmV0dXJuIG5ldG9ial9lcXVhbCgmbmV3LT5oYW5kbGUsICZ0bXAtPmhhbmRsZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcnNjX2luaXQoc3RydWN0IHJzYyAqbmV3LCBzdHJ1Y3QgcnNjICp0bXApCit7CisJbmV3LT5oYW5kbGUubGVuID0gdG1wLT5oYW5kbGUubGVuOworCXRtcC0+aGFuZGxlLmxlbiA9IDA7CisJbmV3LT5oYW5kbGUuZGF0YSA9IHRtcC0+aGFuZGxlLmRhdGE7CisJdG1wLT5oYW5kbGUuZGF0YSA9IE5VTEw7CisJbmV3LT5tZWNoY3R4ID0gTlVMTDsKKwluZXctPmNyZWQuY3JfZ3JvdXBfaW5mbyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcnNjX3VwZGF0ZShzdHJ1Y3QgcnNjICpuZXcsIHN0cnVjdCByc2MgKnRtcCkKK3sKKwluZXctPm1lY2hjdHggPSB0bXAtPm1lY2hjdHg7CisJdG1wLT5tZWNoY3R4ID0gTlVMTDsKKwltZW1zZXQoJm5ldy0+c2VxZGF0YSwgMCwgc2l6ZW9mKG5ldy0+c2VxZGF0YSkpOworCXNwaW5fbG9ja19pbml0KCZuZXctPnNlcWRhdGEuc2RfbG9jayk7CisJbmV3LT5jcmVkID0gdG1wLT5jcmVkOworCXRtcC0+Y3JlZC5jcl9ncm91cF9pbmZvID0gTlVMTDsKK30KKworc3RhdGljIGludCByc2NfcGFyc2Uoc3RydWN0IGNhY2hlX2RldGFpbCAqY2QsCisJCSAgICAgY2hhciAqbWVzZywgaW50IG1sZW4pCit7CisJLyogY29udGV4dGhhbmRsZSBleHBpcnkgWyB1aWQgZ2lkIE4gPG4gZ2lkcz4gbWVjaG5hbWUgLi4ubWVjaGRhdGEuLi4gXSAqLworCWNoYXIgKmJ1ZiA9IG1lc2c7CisJaW50IGxlbiwgcnY7CisJc3RydWN0IHJzYyByc2NpLCAqcnNjcCA9IE5VTEw7CisJdGltZV90IGV4cGlyeTsKKwlpbnQgc3RhdHVzID0gLUVJTlZBTDsKKworCW1lbXNldCgmcnNjaSwgMCwgc2l6ZW9mKHJzY2kpKTsKKwkvKiBjb250ZXh0IGhhbmRsZSAqLworCWxlbiA9IHF3b3JkX2dldCgmbWVzZywgYnVmLCBtbGVuKTsKKwlpZiAobGVuIDwgMCkgZ290byBvdXQ7CisJc3RhdHVzID0gLUVOT01FTTsKKwlpZiAoZHVwX3RvX25ldG9iaigmcnNjaS5oYW5kbGUsIGJ1ZiwgbGVuKSkKKwkJZ290byBvdXQ7CisKKwlyc2NpLmguZmxhZ3MgPSAwOworCS8qIGV4cGlyeSAqLworCWV4cGlyeSA9IGdldF9leHBpcnkoJm1lc2cpOworCXN0YXR1cyA9IC1FSU5WQUw7CisJaWYgKGV4cGlyeSA9PSAwKQorCQlnb3RvIG91dDsKKworCS8qIHVpZCwgb3IgTkVHQVRJVkUgKi8KKwlydiA9IGdldF9pbnQoJm1lc2csICZyc2NpLmNyZWQuY3JfdWlkKTsKKwlpZiAocnYgPT0gLUVJTlZBTCkKKwkJZ290byBvdXQ7CisJaWYgKHJ2ID09IC1FTk9FTlQpCisJCXNldF9iaXQoQ0FDSEVfTkVHQVRJVkUsICZyc2NpLmguZmxhZ3MpOworCWVsc2UgeworCQlpbnQgTiwgaTsKKwkJc3RydWN0IGdzc19hcGlfbWVjaCAqZ207CisKKwkJLyogZ2lkICovCisJCWlmIChnZXRfaW50KCZtZXNnLCAmcnNjaS5jcmVkLmNyX2dpZCkpCisJCQlnb3RvIG91dDsKKworCQkvKiBudW1iZXIgb2YgYWRkaXRpb25hbCBnaWQncyAqLworCQlpZiAoZ2V0X2ludCgmbWVzZywgJk4pKQorCQkJZ290byBvdXQ7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCXJzY2kuY3JlZC5jcl9ncm91cF9pbmZvID0gZ3JvdXBzX2FsbG9jKE4pOworCQlpZiAocnNjaS5jcmVkLmNyX2dyb3VwX2luZm8gPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCisJCS8qIGdpZCdzICovCisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWZvciAoaT0wOyBpPE47IGkrKykgeworCQkJZ2lkX3QgZ2lkOworCQkJaWYgKGdldF9pbnQoJm1lc2csICZnaWQpKQorCQkJCWdvdG8gb3V0OworCQkJR1JPVVBfQVQocnNjaS5jcmVkLmNyX2dyb3VwX2luZm8sIGkpID0gZ2lkOworCQl9CisKKwkJLyogbWVjaCBuYW1lICovCisJCWxlbiA9IHF3b3JkX2dldCgmbWVzZywgYnVmLCBtbGVuKTsKKwkJaWYgKGxlbiA8IDApCisJCQlnb3RvIG91dDsKKwkJZ20gPSBnc3NfbWVjaF9nZXRfYnlfbmFtZShidWYpOworCQlzdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwkJaWYgKCFnbSkKKwkJCWdvdG8gb3V0OworCisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCS8qIG1lY2gtc3BlY2lmaWMgZGF0YTogKi8KKwkJbGVuID0gcXdvcmRfZ2V0KCZtZXNnLCBidWYsIG1sZW4pOworCQlpZiAobGVuIDwgMCkgeworCQkJZ3NzX21lY2hfcHV0KGdtKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChnc3NfaW1wb3J0X3NlY19jb250ZXh0KGJ1ZiwgbGVuLCBnbSwgJnJzY2kubWVjaGN0eCkpIHsKKwkJCWdzc19tZWNoX3B1dChnbSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlnc3NfbWVjaF9wdXQoZ20pOworCX0KKwlyc2NpLmguZXhwaXJ5X3RpbWUgPSBleHBpcnk7CisJcnNjcCA9IHJzY19sb29rdXAoJnJzY2ksIDEpOworCXN0YXR1cyA9IDA7CitvdXQ6CisJcnNjX2ZyZWUoJnJzY2kpOworCWlmIChyc2NwKQorCQlyc2NfcHV0KCZyc2NwLT5oLCAmcnNjX2NhY2hlKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgc3RydWN0IGNhY2hlX2RldGFpbCByc2NfY2FjaGUgPSB7CisJLmhhc2hfc2l6ZQk9IFJTQ19IQVNITUFYLAorCS5oYXNoX3RhYmxlCT0gcnNjX3RhYmxlLAorCS5uYW1lCQk9ICJhdXRoLnJwY3NlYy5jb250ZXh0IiwKKwkuY2FjaGVfcHV0CT0gcnNjX3B1dCwKKwkuY2FjaGVfcGFyc2UJPSByc2NfcGFyc2UsCit9OworCitzdGF0aWMgRGVmaW5lU2ltcGxlQ2FjaGVMb29rdXAocnNjLCAwKTsKKworc3RhdGljIHN0cnVjdCByc2MgKgorZ3NzX3N2Y19zZWFyY2hieWN0eChzdHJ1Y3QgeGRyX25ldG9iaiAqaGFuZGxlKQoreworCXN0cnVjdCByc2MgcnNjaTsKKwlzdHJ1Y3QgcnNjICpmb3VuZDsKKworCW1lbXNldCgmcnNjaSwgMCwgc2l6ZW9mKHJzY2kpKTsKKwlpZiAoZHVwX3RvX25ldG9iaigmcnNjaS5oYW5kbGUsIGhhbmRsZS0+ZGF0YSwgaGFuZGxlLT5sZW4pKQorCQlyZXR1cm4gTlVMTDsKKwlmb3VuZCA9IHJzY19sb29rdXAoJnJzY2ksIDApOworCXJzY19mcmVlKCZyc2NpKTsKKwlpZiAoIWZvdW5kKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoY2FjaGVfY2hlY2soJnJzY19jYWNoZSwgJmZvdW5kLT5oLCBOVUxMKSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGZvdW5kOworfQorCisvKiBJbXBsZW1lbnRzIHNlcXVlbmNlIG51bWJlciBhbGdvcml0aG0gYXMgc3BlY2lmaWVkIGluIFJGQyAyMjAzLiAqLworc3RhdGljIGludAorZ3NzX2NoZWNrX3NlcV9udW0oc3RydWN0IHJzYyAqcnNjaSwgaW50IHNlcV9udW0pCit7CisJc3RydWN0IGdzc19zdmNfc2VxX2RhdGEgKnNkID0gJnJzY2ktPnNlcWRhdGE7CisKKwlzcGluX2xvY2soJnNkLT5zZF9sb2NrKTsKKwlpZiAoc2VxX251bSA+IHNkLT5zZF9tYXgpIHsKKwkJaWYgKHNlcV9udW0gPj0gc2QtPnNkX21heCArIEdTU19TRVFfV0lOKSB7CisJCQltZW1zZXQoc2QtPnNkX3dpbiwwLHNpemVvZihzZC0+c2Rfd2luKSk7CisJCQlzZC0+c2RfbWF4ID0gc2VxX251bTsKKwkJfSBlbHNlIHdoaWxlIChzZC0+c2RfbWF4IDwgc2VxX251bSkgeworCQkJc2QtPnNkX21heCsrOworCQkJX19jbGVhcl9iaXQoc2QtPnNkX21heCAlIEdTU19TRVFfV0lOLCBzZC0+c2Rfd2luKTsKKwkJfQorCQlfX3NldF9iaXQoc2VxX251bSAlIEdTU19TRVFfV0lOLCBzZC0+c2Rfd2luKTsKKwkJZ290byBvazsKKwl9IGVsc2UgaWYgKHNlcV9udW0gPD0gc2QtPnNkX21heCAtIEdTU19TRVFfV0lOKSB7CisJCWdvdG8gZHJvcDsKKwl9CisJLyogc2RfbWF4IC0gR1NTX1NFUV9XSU4gPCBzZXFfbnVtIDw9IHNkX21heCAqLworCWlmIChfX3Rlc3RfYW5kX3NldF9iaXQoc2VxX251bSAlIEdTU19TRVFfV0lOLCBzZC0+c2Rfd2luKSkKKwkJZ290byBkcm9wOworb2s6CisJc3Bpbl91bmxvY2soJnNkLT5zZF9sb2NrKTsKKwlyZXR1cm4gMTsKK2Ryb3A6CisJc3Bpbl91bmxvY2soJnNkLT5zZF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1MzIgcm91bmRfdXBfdG9fcXVhZCh1MzIgaSkKK3sKKwlyZXR1cm4gKGkgKyAzICkgJiB+MzsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3N2Y19zYWZlX2dldG5ldG9iaihzdHJ1Y3Qga3ZlYyAqYXJndiwgc3RydWN0IHhkcl9uZXRvYmogKm8pCit7CisJaW50IGw7CisKKwlpZiAoYXJndi0+aW92X2xlbiA8IDQpCisJCXJldHVybiAtMTsKKwlvLT5sZW4gPSBudG9obChzdmNfZ2V0dTMyKGFyZ3YpKTsKKwlsID0gcm91bmRfdXBfdG9fcXVhZChvLT5sZW4pOworCWlmIChhcmd2LT5pb3ZfbGVuIDwgbCkKKwkJcmV0dXJuIC0xOworCW8tPmRhdGEgPSBhcmd2LT5pb3ZfYmFzZTsKKwlhcmd2LT5pb3ZfYmFzZSArPSBsOworCWFyZ3YtPmlvdl9sZW4gLT0gbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3N2Y19zYWZlX3B1dG5ldG9iaihzdHJ1Y3Qga3ZlYyAqcmVzdiwgc3RydWN0IHhkcl9uZXRvYmogKm8pCit7CisJdTMyICpwOworCisJaWYgKHJlc3YtPmlvdl9sZW4gKyA0ID4gUEFHRV9TSVpFKQorCQlyZXR1cm4gLTE7CisJc3ZjX3B1dHUzMihyZXN2LCBodG9ubChvLT5sZW4pKTsKKwlwID0gcmVzdi0+aW92X2Jhc2UgKyByZXN2LT5pb3ZfbGVuOworCXJlc3YtPmlvdl9sZW4gKz0gcm91bmRfdXBfdG9fcXVhZChvLT5sZW4pOworCWlmIChyZXN2LT5pb3ZfbGVuID4gUEFHRV9TSVpFKQorCQlyZXR1cm4gLTE7CisJbWVtY3B5KHAsIG8tPmRhdGEsIG8tPmxlbik7CisJbWVtc2V0KCh1OCAqKXAgKyBvLT5sZW4sIDAsIHJvdW5kX3VwX3RvX3F1YWQoby0+bGVuKSAtIG8tPmxlbik7CisJcmV0dXJuIDA7Cit9CisKKy8qIFZlcmlmeSB0aGUgY2hlY2tzdW0gb24gdGhlIGhlYWRlciBhbmQgcmV0dXJuIFNWQ19PSyBvbiBzdWNjZXNzLgorICogT3RoZXJ3aXNlLCByZXR1cm4gU1ZDX0RST1AgKGluIHRoZSBjYXNlIG9mIGEgYmFkIHNlcXVlbmNlIG51bWJlcikKKyAqIG9yIHJldHVybiBTVkNfREVOSUVEIGFuZCBpbmRpY2F0ZSBlcnJvciBpbiBhdXRocC4KKyAqLworc3RhdGljIGludAorZ3NzX3ZlcmlmeV9oZWFkZXIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHJzYyAqcnNjaSwKKwkJICB1MzIgKnJwY3N0YXJ0LCBzdHJ1Y3QgcnBjX2dzc193aXJlX2NyZWQgKmdjLCB1MzIgKmF1dGhwKQoreworCXN0cnVjdCBnc3NfY3R4CQkqY3R4X2lkID0gcnNjaS0+bWVjaGN0eDsKKwlzdHJ1Y3QgeGRyX2J1ZgkJcnBjaGRyOworCXN0cnVjdCB4ZHJfbmV0b2JqCWNoZWNrc3VtOworCXUzMgkJCWZsYXZvciA9IDA7CisJc3RydWN0IGt2ZWMJCSphcmd2ID0gJnJxc3RwLT5ycV9hcmcuaGVhZFswXTsKKwlzdHJ1Y3Qga3ZlYwkJaW92OworCisJLyogZGF0YSB0byBjb21wdXRlIHRoZSBjaGVja3N1bSBvdmVyOiAqLworCWlvdi5pb3ZfYmFzZSA9IHJwY3N0YXJ0OworCWlvdi5pb3ZfbGVuID0gKHU4ICopYXJndi0+aW92X2Jhc2UgLSAodTggKilycGNzdGFydDsKKwl4ZHJfYnVmX2Zyb21faW92KCZpb3YsICZycGNoZHIpOworCisJKmF1dGhwID0gcnBjX2F1dGhlcnJfYmFkdmVyZjsKKwlpZiAoYXJndi0+aW92X2xlbiA8IDQpCisJCXJldHVybiBTVkNfREVOSUVEOworCWZsYXZvciA9IG50b2hsKHN2Y19nZXR1MzIoYXJndikpOworCWlmIChmbGF2b3IgIT0gUlBDX0FVVEhfR1NTKQorCQlyZXR1cm4gU1ZDX0RFTklFRDsKKwlpZiAoc3ZjX3NhZmVfZ2V0bmV0b2JqKGFyZ3YsICZjaGVja3N1bSkpCisJCXJldHVybiBTVkNfREVOSUVEOworCisJaWYgKHJxc3RwLT5ycV9kZWZlcnJlZCkgLyogc2tpcCB2ZXJpZmljYXRpb24gb2YgcmV2aXNpdGVkIHJlcXVlc3QgKi8KKwkJcmV0dXJuIFNWQ19PSzsKKwlpZiAoZ3NzX3ZlcmlmeV9taWMoY3R4X2lkLCAmcnBjaGRyLCAmY2hlY2tzdW0sIE5VTEwpCisJCQkJCQkJIT0gR1NTX1NfQ09NUExFVEUpIHsKKwkJKmF1dGhwID0gcnBjc2VjX2dzc2Vycl9jcmVkcHJvYmxlbTsKKwkJcmV0dXJuIFNWQ19ERU5JRUQ7CisJfQorCisJaWYgKGdjLT5nY19zZXEgPiBNQVhTRVEpIHsKKwkJZHByaW50aygiUlBDOiAgICAgIHN2Y2F1dGhfZ3NzOiBkaXNjYXJkaW5nIHJlcXVlc3Qgd2l0aCBsYXJnZSBzZXF1ZW5jZSBudW1iZXIgJWRcbiIsCisJCQkJZ2MtPmdjX3NlcSk7CisJCSphdXRocCA9IHJwY3NlY19nc3NlcnJfY3R4cHJvYmxlbTsKKwkJcmV0dXJuIFNWQ19ERU5JRUQ7CisJfQorCWlmICghZ3NzX2NoZWNrX3NlcV9udW0ocnNjaSwgZ2MtPmdjX3NlcSkpIHsKKwkJZHByaW50aygiUlBDOiAgICAgIHN2Y2F1dGhfZ3NzOiBkaXNjYXJkaW5nIHJlcXVlc3Qgd2l0aCBvbGQgc2VxdWVuY2UgbnVtYmVyICVkXG4iLAorCQkJCWdjLT5nY19zZXEpOworCQlyZXR1cm4gU1ZDX0RST1A7CisJfQorCXJldHVybiBTVkNfT0s7Cit9CisKK3N0YXRpYyBpbnQKK2dzc193cml0ZV92ZXJmKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBnc3NfY3R4ICpjdHhfaWQsIHUzMiBzZXEpCit7CisJdTMyCQkJeGRyX3NlcTsKKwl1MzIJCQltYWpfc3RhdDsKKwlzdHJ1Y3QgeGRyX2J1ZgkJdmVyZl9kYXRhOworCXN0cnVjdCB4ZHJfbmV0b2JqCW1pYzsKKwl1MzIJCQkqcDsKKwlzdHJ1Y3Qga3ZlYwkJaW92OworCisJc3ZjX3B1dHUzMihycXN0cC0+cnFfcmVzLmhlYWQsIGh0b25sKFJQQ19BVVRIX0dTUykpOworCXhkcl9zZXEgPSBodG9ubChzZXEpOworCisJaW92Lmlvdl9iYXNlID0gJnhkcl9zZXE7CisJaW92Lmlvdl9sZW4gPSBzaXplb2YoeGRyX3NlcSk7CisJeGRyX2J1Zl9mcm9tX2lvdigmaW92LCAmdmVyZl9kYXRhKTsKKwlwID0gcnFzdHAtPnJxX3Jlcy5oZWFkLT5pb3ZfYmFzZSArIHJxc3RwLT5ycV9yZXMuaGVhZC0+aW92X2xlbjsKKwltaWMuZGF0YSA9ICh1OCAqKShwICsgMSk7CisJbWFqX3N0YXQgPSBnc3NfZ2V0X21pYyhjdHhfaWQsIDAsICZ2ZXJmX2RhdGEsICZtaWMpOworCWlmIChtYWpfc3RhdCAhPSBHU1NfU19DT01QTEVURSkKKwkJcmV0dXJuIC0xOworCSpwKysgPSBodG9ubChtaWMubGVuKTsKKwltZW1zZXQoKHU4ICopcCArIG1pYy5sZW4sIDAsIHJvdW5kX3VwX3RvX3F1YWQobWljLmxlbikgLSBtaWMubGVuKTsKKwlwICs9IFhEUl9RVUFETEVOKG1pYy5sZW4pOworCWlmICgheGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBnc3NfZG9tYWluIHsKKwlzdHJ1Y3QgYXV0aF9kb21haW4JaDsKKwl1MzIJCQlwc2V1ZG9mbGF2b3I7Cit9OworCitzdGF0aWMgc3RydWN0IGF1dGhfZG9tYWluICoKK2ZpbmRfZ3NzX2F1dGhfZG9tYWluKHN0cnVjdCBnc3NfY3R4ICpjdHgsIHUzMiBzdmMpCit7CisJY2hhciAqbmFtZTsKKworCW5hbWUgPSBnc3Nfc2VydmljZV90b19hdXRoX2RvbWFpbl9uYW1lKGN0eC0+bWVjaF90eXBlLCBzdmMpOworCWlmICghbmFtZSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGF1dGhfZG9tYWluX2ZpbmQobmFtZSk7Cit9CisKK2ludAorc3ZjYXV0aF9nc3NfcmVnaXN0ZXJfcHNldWRvZmxhdm9yKHUzMiBwc2V1ZG9mbGF2b3IsIGNoYXIgKiBuYW1lKQoreworCXN0cnVjdCBnc3NfZG9tYWluCSpuZXc7CisJc3RydWN0IGF1dGhfZG9tYWluCSp0ZXN0OworCWludAkJCXN0YXQgPSAtRU5PTUVNOworCisJbmV3ID0ga21hbGxvYyhzaXplb2YoKm5ldyksIEdGUF9LRVJORUwpOworCWlmICghbmV3KQorCQlnb3RvIG91dDsKKwljYWNoZV9pbml0KCZuZXctPmguaCk7CisJbmV3LT5oLm5hbWUgPSBrbWFsbG9jKHN0cmxlbihuYW1lKSArIDEsIEdGUF9LRVJORUwpOworCWlmICghbmV3LT5oLm5hbWUpCisJCWdvdG8gb3V0X2ZyZWVfZG9tOworCXN0cmNweShuZXctPmgubmFtZSwgbmFtZSk7CisJbmV3LT5oLmZsYXZvdXIgPSBSUENfQVVUSF9HU1M7CisJbmV3LT5wc2V1ZG9mbGF2b3IgPSBwc2V1ZG9mbGF2b3I7CisJbmV3LT5oLmguZXhwaXJ5X3RpbWUgPSBORVZFUjsKKworCXRlc3QgPSBhdXRoX2RvbWFpbl9sb29rdXAoJm5ldy0+aCwgMSk7CisJaWYgKHRlc3QgPT0gJm5ldy0+aCkgeworCQlCVUdfT04oYXRvbWljX2RlY19hbmRfdGVzdCgmbmV3LT5oLmgucmVmY250KSk7CisJfSBlbHNlIHsgLyogWFhYIER1cGxpY2F0ZSByZWdpc3RyYXRpb24/ICovCisJCWF1dGhfZG9tYWluX3B1dCgmbmV3LT5oKTsKKwkJZ290byBvdXQ7CisJfQorCXJldHVybiAwOworCitvdXRfZnJlZV9kb206CisJa2ZyZWUobmV3KTsKK291dDoKKwlyZXR1cm4gc3RhdDsKK30KKworRVhQT1JUX1NZTUJPTChzdmNhdXRoX2dzc19yZWdpc3Rlcl9wc2V1ZG9mbGF2b3IpOworCitzdGF0aWMgaW5saW5lIGludAorcmVhZF91MzJfZnJvbV94ZHJfYnVmKHN0cnVjdCB4ZHJfYnVmICpidWYsIGludCBiYXNlLCB1MzIgKm9iaikKK3sKKwl1MzIgICAgIHJhdzsKKwlpbnQgICAgIHN0YXR1czsKKworCXN0YXR1cyA9IHJlYWRfYnl0ZXNfZnJvbV94ZHJfYnVmKGJ1ZiwgYmFzZSwgJnJhdywgc2l6ZW9mKCpvYmopKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCSpvYmogPSBudG9obChyYXcpOworCXJldHVybiAwOworfQorCisvKiBJdCB3b3VsZCBiZSBuaWNlIGlmIHRoaXMgYml0IG9mIGNvZGUgY291bGQgYmUgc2hhcmVkIHdpdGggdGhlIGNsaWVudC4KKyAqIE9ic3RhY2xlczoKKyAqCVRoZSBjbGllbnQgc2hvdWxkbid0IG1hbGxvYygpLCB3b3VsZCBoYXZlIHRvIHBhc3MgaW4gb3duIG1lbW9yeS4KKyAqCVRoZSBzZXJ2ZXIgdXNlcyBiYXNlIG9mIGhlYWQgaW92ZWMgYXMgcmVhZCBwb2ludGVyLCB3aGlsZSB0aGUKKyAqCWNsaWVudCB1c2VzIHNlcGFyYXRlIHBvaW50ZXIuICovCitzdGF0aWMgaW50Cit1bndyYXBfaW50ZWdfZGF0YShzdHJ1Y3QgeGRyX2J1ZiAqYnVmLCB1MzIgc2VxLCBzdHJ1Y3QgZ3NzX2N0eCAqY3R4KQoreworCWludCBzdGF0ID0gLUVJTlZBTDsKKwl1MzIgaW50ZWdfbGVuLCBtYWpfc3RhdDsKKwlzdHJ1Y3QgeGRyX25ldG9iaiBtaWM7CisJc3RydWN0IHhkcl9idWYgaW50ZWdfYnVmOworCisJaW50ZWdfbGVuID0gbnRvaGwoc3ZjX2dldHUzMigmYnVmLT5oZWFkWzBdKSk7CisJaWYgKGludGVnX2xlbiAmIDMpCisJCWdvdG8gb3V0OworCWlmIChpbnRlZ19sZW4gPiBidWYtPmxlbikKKwkJZ290byBvdXQ7CisJaWYgKHhkcl9idWZfc3Vic2VnbWVudChidWYsICZpbnRlZ19idWYsIDAsIGludGVnX2xlbikpCisJCUJVRygpOworCS8qIGNvcHkgb3V0IG1pYy4uLiAqLworCWlmIChyZWFkX3UzMl9mcm9tX3hkcl9idWYoYnVmLCBpbnRlZ19sZW4sICZtaWMubGVuKSkKKwkJQlVHKCk7CisJaWYgKG1pYy5sZW4gPiBSUENfTUFYX0FVVEhfU0laRSkKKwkJZ290byBvdXQ7CisJbWljLmRhdGEgPSBrbWFsbG9jKG1pYy5sZW4sIEdGUF9LRVJORUwpOworCWlmICghbWljLmRhdGEpCisJCWdvdG8gb3V0OworCWlmIChyZWFkX2J5dGVzX2Zyb21feGRyX2J1ZihidWYsIGludGVnX2xlbiArIDQsIG1pYy5kYXRhLCBtaWMubGVuKSkKKwkJZ290byBvdXQ7CisJbWFqX3N0YXQgPSBnc3NfdmVyaWZ5X21pYyhjdHgsICZpbnRlZ19idWYsICZtaWMsIE5VTEwpOworCWlmIChtYWpfc3RhdCAhPSBHU1NfU19DT01QTEVURSkKKwkJZ290byBvdXQ7CisJaWYgKG50b2hsKHN2Y19nZXR1MzIoJmJ1Zi0+aGVhZFswXSkpICE9IHNlcSkKKwkJZ290byBvdXQ7CisJc3RhdCA9IDA7CitvdXQ6CisJcmV0dXJuIHN0YXQ7Cit9CisKK3N0cnVjdCBnc3Nfc3ZjX2RhdGEgeworCS8qIGRlY29kZWQgZ3NzIGNsaWVudCBjcmVkOiAqLworCXN0cnVjdCBycGNfZ3NzX3dpcmVfY3JlZAljbGNyZWQ7CisJLyogcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm9jZWR1cmUtc3BlY2lmaWMgcmVzdWx0cywKKwkgKiB3aGljaCBtYXkgYmUgZW5jcnlwdGVkL2NoZWNrc3VtbWVkIGluIHN2Y2F1dGhfZ3NzX3JlbGVhc2U6ICovCisJdTMyCQkJCSpib2R5X3N0YXJ0OworCXN0cnVjdCByc2MJCQkqcnNjaTsKK307CisKK3N0YXRpYyBpbnQKK3N2Y2F1dGhfZ3NzX3NldF9jbGllbnQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKK3sKKwlzdHJ1Y3QgZ3NzX3N2Y19kYXRhICpzdmNkYXRhID0gcnFzdHAtPnJxX2F1dGhfZGF0YTsKKwlzdHJ1Y3QgcnNjICpyc2NpID0gc3ZjZGF0YS0+cnNjaTsKKwlzdHJ1Y3QgcnBjX2dzc193aXJlX2NyZWQgKmdjID0gJnN2Y2RhdGEtPmNsY3JlZDsKKworCXJxc3RwLT5ycV9jbGllbnQgPSBmaW5kX2dzc19hdXRoX2RvbWFpbihyc2NpLT5tZWNoY3R4LCBnYy0+Z2Nfc3ZjKTsKKwlpZiAocnFzdHAtPnJxX2NsaWVudCA9PSBOVUxMKQorCQlyZXR1cm4gU1ZDX0RFTklFRDsKKwlyZXR1cm4gU1ZDX09LOworfQorCisvKgorICogQWNjZXB0IGFuIHJwY3NlYyBwYWNrZXQuCisgKiBJZiBjb250ZXh0IGVzdGFibGlzaG1lbnQsIHB1bnQgdG8gdXNlciBzcGFjZQorICogSWYgZGF0YSBleGNoYW5nZSwgdmVyaWZ5L2RlY3J5cHQKKyAqIElmIGNvbnRleHQgZGVzdHJ1Y3Rpb24sIGhhbmRsZSBoZXJlCisgKiBJbiB0aGUgY29udGV4dCBlc3RhYmxpc2htZW50IGFuZCBkZXN0cnVjdGlvbiBjYXNlIHdlIGVuY29kZQorICogcmVzcG9uc2UgaGVyZSBhbmQgcmV0dXJuIFNWQ19DT01QTEVURS4KKyAqLworc3RhdGljIGludAorc3ZjYXV0aF9nc3NfYWNjZXB0KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqYXV0aHApCit7CisJc3RydWN0IGt2ZWMJKmFyZ3YgPSAmcnFzdHAtPnJxX2FyZy5oZWFkWzBdOworCXN0cnVjdCBrdmVjCSpyZXN2ID0gJnJxc3RwLT5ycV9yZXMuaGVhZFswXTsKKwl1MzIJCWNybGVuOworCXN0cnVjdCB4ZHJfbmV0b2JqIHRtcG9iajsKKwlzdHJ1Y3QgZ3NzX3N2Y19kYXRhICpzdmNkYXRhID0gcnFzdHAtPnJxX2F1dGhfZGF0YTsKKwlzdHJ1Y3QgcnBjX2dzc193aXJlX2NyZWQgKmdjOworCXN0cnVjdCByc2MJKnJzY2kgPSBOVUxMOworCXN0cnVjdCByc2kJKnJzaXAsIHJzaWtleTsKKwl1MzIJCSpycGNzdGFydDsKKwl1MzIJCSpyZWplY3Rfc3RhdCA9IHJlc3YtPmlvdl9iYXNlICsgcmVzdi0+aW92X2xlbjsKKwlpbnQJCXJldDsKKworCWRwcmludGsoIlJQQzogICAgICBzdmNhdXRoX2dzczogYXJndi0+aW92X2xlbiA9ICV6ZFxuIixhcmd2LT5pb3ZfbGVuKTsKKworCSphdXRocCA9IHJwY19hdXRoZXJyX2JhZGNyZWQ7CisJaWYgKCFzdmNkYXRhKQorCQlzdmNkYXRhID0ga21hbGxvYyhzaXplb2YoKnN2Y2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN2Y2RhdGEpCisJCWdvdG8gYXV0aF9lcnI7CisJcnFzdHAtPnJxX2F1dGhfZGF0YSA9IHN2Y2RhdGE7CisJc3ZjZGF0YS0+Ym9keV9zdGFydCA9IE5VTEw7CisJc3ZjZGF0YS0+cnNjaSA9IE5VTEw7CisJZ2MgPSAmc3ZjZGF0YS0+Y2xjcmVkOworCisJLyogc3RhcnQgb2YgcnBjIHBhY2tldCBpcyA3IHUzMidzIGJhY2sgZnJvbSBoZXJlOgorCSAqIHhpZCBkaXJlY3Rpb24gcnBjdmVyc2lvbiBwcm9nIHZlcnMgcHJvYyBmbGF2b3VyCisJICovCisJcnBjc3RhcnQgPSBhcmd2LT5pb3ZfYmFzZTsKKwlycGNzdGFydCAtPSA3OworCisJLyogY3JlZGVudGlhbCBpczoKKwkgKiAgIHZlcnNpb24oPT0xKSwgcHJvYygwLDEsMiwzKSwgc2VxLCBzZXJ2aWNlICgxLDIsMyksIGhhbmRsZQorCSAqIGF0IGxlYXN0IDUgdTMycywgYW5kIGlzIHByZWNlZWRlZCBieSBsZW5ndGgsIHNvIHRoYXQgbWFrZXMgNi4KKwkgKi8KKworCWlmIChhcmd2LT5pb3ZfbGVuIDwgNSAqIDQpCisJCWdvdG8gYXV0aF9lcnI7CisJY3JsZW4gPSBudG9obChzdmNfZ2V0dTMyKGFyZ3YpKTsKKwlpZiAobnRvaGwoc3ZjX2dldHUzMihhcmd2KSkgIT0gUlBDX0dTU19WRVJTSU9OKQorCQlnb3RvIGF1dGhfZXJyOworCWdjLT5nY19wcm9jID0gbnRvaGwoc3ZjX2dldHUzMihhcmd2KSk7CisJZ2MtPmdjX3NlcSA9IG50b2hsKHN2Y19nZXR1MzIoYXJndikpOworCWdjLT5nY19zdmMgPSBudG9obChzdmNfZ2V0dTMyKGFyZ3YpKTsKKwlpZiAoc3ZjX3NhZmVfZ2V0bmV0b2JqKGFyZ3YsICZnYy0+Z2NfY3R4KSkKKwkJZ290byBhdXRoX2VycjsKKwlpZiAoY3JsZW4gIT0gcm91bmRfdXBfdG9fcXVhZChnYy0+Z2NfY3R4LmxlbikgKyA1ICogNCkKKwkJZ290byBhdXRoX2VycjsKKworCWlmICgoZ2MtPmdjX3Byb2MgIT0gUlBDX0dTU19QUk9DX0RBVEEpICYmIChycXN0cC0+cnFfcHJvYyAhPSAwKSkKKwkJZ290byBhdXRoX2VycjsKKworCS8qCisJICogV2UndmUgc3VjY2Vzc2Z1bGx5IHBhcnNlZCB0aGUgY3JlZGVudGlhbC4gTGV0J3MgY2hlY2sgb3V0IHRoZQorCSAqIHZlcmlmaWVyLiAgQW4gQVVUSF9OVUxMIHZlcmlmaWVyIGlzIGFsbG93ZWQgKGFuZCByZXF1aXJlZCkgZm9yCisJICogSU5JVCBhbmQgQ09OVElOVUVfSU5JVCByZXF1ZXN0cy4gQVVUSF9SUENTRUNfR1NTIGlzIHJlcXVpcmVkIGZvcgorCSAqIFBST0NfREFUQSBhbmQgUFJPQ19ERVNUUk9ZLgorCSAqCisJICogQVVUSF9OVUxMIHZlcmlmaWVyIGlzIDAgKEFVVEhfTlVMTCksIDAgKGxlbmd0aCkuCisJICogQVVUSF9SUENTRUNfR1NTIHZlcmlmaWVyIGlzOgorCSAqICAgNiAoQVVUSF9SUENTRUNfR1NTKSwgbGVuZ3RoLCBjaGVja3N1bS4KKwkgKiBjaGVja3N1bSBpcyBjYWxjdWxhdGVkIG92ZXIgcnBjaGVhZGVyIGZyb20geGlkIHVwIHRvIGhlcmUuCisJICovCisJKmF1dGhwID0gcnBjX2F1dGhlcnJfYmFkdmVyZjsKKwlzd2l0Y2ggKGdjLT5nY19wcm9jKSB7CisJY2FzZSBSUENfR1NTX1BST0NfSU5JVDoKKwljYXNlIFJQQ19HU1NfUFJPQ19DT05USU5VRV9JTklUOgorCQlpZiAoYXJndi0+aW92X2xlbiA8IDIgKiA0KQorCQkJZ290byBhdXRoX2VycjsKKwkJaWYgKG50b2hsKHN2Y19nZXR1MzIoYXJndikpICE9IFJQQ19BVVRIX05VTEwpCisJCQlnb3RvIGF1dGhfZXJyOworCQlpZiAobnRvaGwoc3ZjX2dldHUzMihhcmd2KSkgIT0gMCkKKwkJCWdvdG8gYXV0aF9lcnI7CisJCWJyZWFrOworCWNhc2UgUlBDX0dTU19QUk9DX0RBVEE6CisJY2FzZSBSUENfR1NTX1BST0NfREVTVFJPWToKKwkJKmF1dGhwID0gcnBjc2VjX2dzc2Vycl9jcmVkcHJvYmxlbTsKKwkJcnNjaSA9IGdzc19zdmNfc2VhcmNoYnljdHgoJmdjLT5nY19jdHgpOworCQlpZiAoIXJzY2kpCisJCQlnb3RvIGF1dGhfZXJyOworCQlzd2l0Y2ggKGdzc192ZXJpZnlfaGVhZGVyKHJxc3RwLCByc2NpLCBycGNzdGFydCwgZ2MsIGF1dGhwKSkgeworCQljYXNlIFNWQ19PSzoKKwkJCWJyZWFrOworCQljYXNlIFNWQ19ERU5JRUQ6CisJCQlnb3RvIGF1dGhfZXJyOworCQljYXNlIFNWQ19EUk9QOgorCQkJZ290byBkcm9wOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCSphdXRocCA9IHJwY19hdXRoZXJyX3JlamVjdGVkY3JlZDsKKwkJZ290byBhdXRoX2VycjsKKwl9CisKKwkvKiBub3cgYWN0IHVwb24gdGhlIGNvbW1hbmQ6ICovCisJc3dpdGNoIChnYy0+Z2NfcHJvYykgeworCWNhc2UgUlBDX0dTU19QUk9DX0lOSVQ6CisJY2FzZSBSUENfR1NTX1BST0NfQ09OVElOVUVfSU5JVDoKKwkJKmF1dGhwID0gcnBjX2F1dGhlcnJfYmFkY3JlZDsKKwkJaWYgKGdjLT5nY19wcm9jID09IFJQQ19HU1NfUFJPQ19JTklUICYmIGdjLT5nY19jdHgubGVuICE9IDApCisJCQlnb3RvIGF1dGhfZXJyOworCQltZW1zZXQoJnJzaWtleSwgMCwgc2l6ZW9mKHJzaWtleSkpOworCQlpZiAoZHVwX25ldG9iaigmcnNpa2V5LmluX2hhbmRsZSwgJmdjLT5nY19jdHgpKQorCQkJZ290byBkcm9wOworCQkqYXV0aHAgPSBycGNfYXV0aGVycl9iYWR2ZXJmOworCQlpZiAoc3ZjX3NhZmVfZ2V0bmV0b2JqKGFyZ3YsICZ0bXBvYmopKSB7CisJCQlrZnJlZShyc2lrZXkuaW5faGFuZGxlLmRhdGEpOworCQkJZ290byBhdXRoX2VycjsKKwkJfQorCQlpZiAoZHVwX25ldG9iaigmcnNpa2V5LmluX3Rva2VuLCAmdG1wb2JqKSkgeworCQkJa2ZyZWUocnNpa2V5LmluX2hhbmRsZS5kYXRhKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCisJCXJzaXAgPSByc2lfbG9va3VwKCZyc2lrZXksIDApOworCQlyc2lfZnJlZSgmcnNpa2V5KTsKKwkJaWYgKCFyc2lwKSB7CisJCQlnb3RvIGRyb3A7CisJCX0KKwkJc3dpdGNoKGNhY2hlX2NoZWNrKCZyc2lfY2FjaGUsICZyc2lwLT5oLCAmcnFzdHAtPnJxX2NoYW5kbGUpKSB7CisJCWNhc2UgLUVBR0FJTjoKKwkJCWdvdG8gZHJvcDsKKwkJY2FzZSAtRU5PRU5UOgorCQkJZ290byBkcm9wOworCQljYXNlIDA6CisJCQlyc2NpID0gZ3NzX3N2Y19zZWFyY2hieWN0eCgmcnNpcC0+b3V0X2hhbmRsZSk7CisJCQlpZiAoIXJzY2kpIHsKKwkJCQlnb3RvIGRyb3A7CisJCQl9CisJCQlpZiAoZ3NzX3dyaXRlX3ZlcmYocnFzdHAsIHJzY2ktPm1lY2hjdHgsIEdTU19TRVFfV0lOKSkKKwkJCQlnb3RvIGRyb3A7CisJCQlpZiAocmVzdi0+aW92X2xlbiArIDQgPiBQQUdFX1NJWkUpCisJCQkJZ290byBkcm9wOworCQkJc3ZjX3B1dHUzMihyZXN2LCBycGNfc3VjY2Vzcyk7CisJCQlpZiAoc3ZjX3NhZmVfcHV0bmV0b2JqKHJlc3YsICZyc2lwLT5vdXRfaGFuZGxlKSkKKwkJCQlnb3RvIGRyb3A7CisJCQlpZiAocmVzdi0+aW92X2xlbiArIDMgKiA0ID4gUEFHRV9TSVpFKQorCQkJCWdvdG8gZHJvcDsKKwkJCXN2Y19wdXR1MzIocmVzdiwgaHRvbmwocnNpcC0+bWFqb3Jfc3RhdHVzKSk7CisJCQlzdmNfcHV0dTMyKHJlc3YsIGh0b25sKHJzaXAtPm1pbm9yX3N0YXR1cykpOworCQkJc3ZjX3B1dHUzMihyZXN2LCBodG9ubChHU1NfU0VRX1dJTikpOworCQkJaWYgKHN2Y19zYWZlX3B1dG5ldG9iaihyZXN2LCAmcnNpcC0+b3V0X3Rva2VuKSkKKwkJCQlnb3RvIGRyb3A7CisJCQlycXN0cC0+cnFfY2xpZW50ID0gTlVMTDsKKwkJfQorCQlnb3RvIGNvbXBsZXRlOworCWNhc2UgUlBDX0dTU19QUk9DX0RFU1RST1k6CisJCXNldF9iaXQoQ0FDSEVfTkVHQVRJVkUsICZyc2NpLT5oLmZsYWdzKTsKKwkJaWYgKHJlc3YtPmlvdl9sZW4gKyA0ID4gUEFHRV9TSVpFKQorCQkJZ290byBkcm9wOworCQlzdmNfcHV0dTMyKHJlc3YsIHJwY19zdWNjZXNzKTsKKwkJZ290byBjb21wbGV0ZTsKKwljYXNlIFJQQ19HU1NfUFJPQ19EQVRBOgorCQkqYXV0aHAgPSBycGNzZWNfZ3NzZXJyX2N0eHByb2JsZW07CisJCWlmIChnc3Nfd3JpdGVfdmVyZihycXN0cCwgcnNjaS0+bWVjaGN0eCwgZ2MtPmdjX3NlcSkpCisJCQlnb3RvIGF1dGhfZXJyOworCQlycXN0cC0+cnFfY3JlZCA9IHJzY2ktPmNyZWQ7CisJCWdldF9ncm91cF9pbmZvKHJzY2ktPmNyZWQuY3JfZ3JvdXBfaW5mbyk7CisJCSphdXRocCA9IHJwY19hdXRoZXJyX2JhZGNyZWQ7CisJCXN3aXRjaCAoZ2MtPmdjX3N2YykgeworCQljYXNlIFJQQ19HU1NfU1ZDX05PTkU6CisJCQlicmVhazsKKwkJY2FzZSBSUENfR1NTX1NWQ19JTlRFR1JJVFk6CisJCQlpZiAodW53cmFwX2ludGVnX2RhdGEoJnJxc3RwLT5ycV9hcmcsCisJCQkJCWdjLT5nY19zZXEsIHJzY2ktPm1lY2hjdHgpKQorCQkJCWdvdG8gYXV0aF9lcnI7CisJCQkvKiBwbGFjZWhvbGRlcnMgZm9yIGxlbmd0aCBhbmQgc2VxLiBudW1iZXI6ICovCisJCQlzdmNkYXRhLT5ib2R5X3N0YXJ0ID0gcmVzdi0+aW92X2Jhc2UgKyByZXN2LT5pb3ZfbGVuOworCQkJc3ZjX3B1dHUzMihyZXN2LCAwKTsKKwkJCXN2Y19wdXR1MzIocmVzdiwgMCk7CisJCQlicmVhazsKKwkJY2FzZSBSUENfR1NTX1NWQ19QUklWQUNZOgorCQkJLyogY3VycmVudGx5IHVuc3VwcG9ydGVkICovCisJCWRlZmF1bHQ6CisJCQlnb3RvIGF1dGhfZXJyOworCQl9CisJCXN2Y2RhdGEtPnJzY2kgPSByc2NpOworCQljYWNoZV9nZXQoJnJzY2ktPmgpOworCQlyZXQgPSBTVkNfT0s7CisJCWdvdG8gb3V0OworCX0KK2F1dGhfZXJyOgorCS8qIFJlc3RvcmUgd3JpdGUgcG9pbnRlciB0byBvcmlnaW5hbCB2YWx1ZTogKi8KKwl4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcmVqZWN0X3N0YXQpOworCXJldCA9IFNWQ19ERU5JRUQ7CisJZ290byBvdXQ7Citjb21wbGV0ZToKKwlyZXQgPSBTVkNfQ09NUExFVEU7CisJZ290byBvdXQ7Citkcm9wOgorCXJldCA9IFNWQ19EUk9QOworb3V0OgorCWlmIChyc2NpKQorCQlyc2NfcHV0KCZyc2NpLT5oLCAmcnNjX2NhY2hlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitzdmNhdXRoX2dzc19yZWxlYXNlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCit7CisJc3RydWN0IGdzc19zdmNfZGF0YSAqZ3NkID0gKHN0cnVjdCBnc3Nfc3ZjX2RhdGEgKilycXN0cC0+cnFfYXV0aF9kYXRhOworCXN0cnVjdCBycGNfZ3NzX3dpcmVfY3JlZCAqZ2MgPSAmZ3NkLT5jbGNyZWQ7CisJc3RydWN0IHhkcl9idWYgKnJlc2J1ZiA9ICZycXN0cC0+cnFfcmVzOworCXN0cnVjdCB4ZHJfYnVmIGludGVnX2J1ZjsKKwlzdHJ1Y3QgeGRyX25ldG9iaiBtaWM7CisJc3RydWN0IGt2ZWMgKnJlc3Y7CisJdTMyICpwOworCWludCBpbnRlZ19vZmZzZXQsIGludGVnX2xlbjsKKwlpbnQgc3RhdCA9IC1FSU5WQUw7CisKKwlpZiAoZ2MtPmdjX3Byb2MgIT0gUlBDX0dTU19QUk9DX0RBVEEpCisJCWdvdG8gb3V0OworCS8qIFJlbGVhc2UgY2FuIGJlIGNhbGxlZCB0d2ljZSwgYnV0IHdlIG9ubHkgd3JhcCBvbmNlLiAqLworCWlmIChnc2QtPmJvZHlfc3RhcnQgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJLyogbm9ybWFsbHkgbm90IHNldCB0aWxsIHN2Y19zZW5kLCBidXQgd2UgbmVlZCBpdCBoZXJlOiAqLworCXJlc2J1Zi0+bGVuID0gcmVzYnVmLT5oZWFkWzBdLmlvdl9sZW4KKwkJKyByZXNidWYtPnBhZ2VfbGVuICsgcmVzYnVmLT50YWlsWzBdLmlvdl9sZW47CisJc3dpdGNoIChnYy0+Z2Nfc3ZjKSB7CisJY2FzZSBSUENfR1NTX1NWQ19OT05FOgorCQlicmVhazsKKwljYXNlIFJQQ19HU1NfU1ZDX0lOVEVHUklUWToKKwkJcCA9IGdzZC0+Ym9keV9zdGFydDsKKwkJZ3NkLT5ib2R5X3N0YXJ0ID0gTlVMTDsKKwkJLyogbW92ZSBhY2NlcHRfc3RhdCB0byByaWdodCBwbGFjZTogKi8KKwkJbWVtY3B5KHAsIHAgKyAyLCA0KTsKKwkJLyogZG9uJ3Qgd3JhcCBpbiBmYWlsdXJlIGNhc2U6ICovCisJCS8qIE5vdGU6IGNvdW50aW5nIG9uIG5vdCBnZXR0aW5nIGhlcmUgaWYgY2FsbCB3YXMgbm90IGV2ZW4KKwkJICogYWNjZXB0ZWQhICovCisJCWlmICgqcCAhPSBycGNfc3VjY2VzcykgeworCQkJcmVzYnVmLT5oZWFkWzBdLmlvdl9sZW4gLT0gMiAqIDQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQlwKys7CisJCWludGVnX29mZnNldCA9ICh1OCAqKShwICsgMSkgLSAodTggKilyZXNidWYtPmhlYWRbMF0uaW92X2Jhc2U7CisJCWludGVnX2xlbiA9IHJlc2J1Zi0+bGVuIC0gaW50ZWdfb2Zmc2V0OworCQlCVUdfT04oaW50ZWdfbGVuICUgNCk7CisJCSpwKysgPSBodG9ubChpbnRlZ19sZW4pOworCQkqcCsrID0gaHRvbmwoZ2MtPmdjX3NlcSk7CisJCWlmICh4ZHJfYnVmX3N1YnNlZ21lbnQocmVzYnVmLCAmaW50ZWdfYnVmLCBpbnRlZ19vZmZzZXQsCisJCQkJCWludGVnX2xlbikpCisJCQlCVUcoKTsKKwkJaWYgKHJlc2J1Zi0+cGFnZV9sZW4gPT0gMAorCQkJJiYgcmVzYnVmLT50YWlsWzBdLmlvdl9sZW4gKyBSUENfTUFYX0FVVEhfU0laRQorCQkJCTwgUEFHRV9TSVpFKSB7CisJCQlCVUdfT04ocmVzYnVmLT50YWlsWzBdLmlvdl9sZW4pOworCQkJLyogVXNlIGhlYWQgZm9yIGV2ZXJ5dGhpbmcgKi8KKwkJCXJlc3YgPSAmcmVzYnVmLT5oZWFkWzBdOworCQl9IGVsc2UgaWYgKHJlc2J1Zi0+dGFpbFswXS5pb3ZfYmFzZSA9PSBOVUxMKSB7CisJCQkvKiBjb3BpZWQgZnJvbSBuZnNkNF9lbmNvZGVfcmVhZCAqLworCQkJc3ZjX3Rha2VfcGFnZShycXN0cCk7CisJCQlyZXNidWYtPnRhaWxbMF0uaW92X2Jhc2UgPSBwYWdlX2FkZHJlc3MocnFzdHAKKwkJCQkJLT5ycV9yZXNwYWdlc1tycXN0cC0+cnFfcmVzdXNlZC0xXSk7CisJCQlycXN0cC0+cnFfcmVzdGFpbHBhZ2UgPSBycXN0cC0+cnFfcmVzdXNlZC0xOworCQkJcmVzYnVmLT50YWlsWzBdLmlvdl9sZW4gPSAwOworCQkJcmVzdiA9ICZyZXNidWYtPnRhaWxbMF07CisJCX0gZWxzZSB7CisJCQlyZXN2ID0gJnJlc2J1Zi0+dGFpbFswXTsKKwkJfQorCQltaWMuZGF0YSA9ICh1OCAqKXJlc3YtPmlvdl9iYXNlICsgcmVzdi0+aW92X2xlbiArIDQ7CisJCWlmIChnc3NfZ2V0X21pYyhnc2QtPnJzY2ktPm1lY2hjdHgsIDAsICZpbnRlZ19idWYsICZtaWMpKQorCQkJZ290byBvdXRfZXJyOworCQlzdmNfcHV0dTMyKHJlc3YsIGh0b25sKG1pYy5sZW4pKTsKKwkJbWVtc2V0KG1pYy5kYXRhICsgbWljLmxlbiwgMCwKKwkJCQlyb3VuZF91cF90b19xdWFkKG1pYy5sZW4pIC0gbWljLmxlbik7CisJCXJlc3YtPmlvdl9sZW4gKz0gWERSX1FVQURMRU4obWljLmxlbikgPDwgMjsKKwkJLyogbm90IHN0cmljdGx5IHJlcXVpcmVkOiAqLworCQlyZXNidWYtPmxlbiArPSBYRFJfUVVBRExFTihtaWMubGVuKSA8PCAyOworCQlCVUdfT04ocmVzdi0+aW92X2xlbiA+IFBBR0VfU0laRSk7CisJCWJyZWFrOworCWNhc2UgUlBDX0dTU19TVkNfUFJJVkFDWToKKwlkZWZhdWx0OgorCQlnb3RvIG91dF9lcnI7CisJfQorCitvdXQ6CisJc3RhdCA9IDA7CitvdXRfZXJyOgorCWlmIChycXN0cC0+cnFfY2xpZW50KQorCQlhdXRoX2RvbWFpbl9wdXQocnFzdHAtPnJxX2NsaWVudCk7CisJcnFzdHAtPnJxX2NsaWVudCA9IE5VTEw7CisJaWYgKHJxc3RwLT5ycV9jcmVkLmNyX2dyb3VwX2luZm8pCisJCXB1dF9ncm91cF9pbmZvKHJxc3RwLT5ycV9jcmVkLmNyX2dyb3VwX2luZm8pOworCXJxc3RwLT5ycV9jcmVkLmNyX2dyb3VwX2luZm8gPSBOVUxMOworCWlmIChnc2QtPnJzY2kpCisJCXJzY19wdXQoJmdzZC0+cnNjaS0+aCwgJnJzY19jYWNoZSk7CisJZ3NkLT5yc2NpID0gTlVMTDsKKworCXJldHVybiBzdGF0OworfQorCitzdGF0aWMgdm9pZAorc3ZjYXV0aF9nc3NfZG9tYWluX3JlbGVhc2Uoc3RydWN0IGF1dGhfZG9tYWluICpkb20pCit7CisJc3RydWN0IGdzc19kb21haW4gKmdkID0gY29udGFpbmVyX29mKGRvbSwgc3RydWN0IGdzc19kb21haW4sIGgpOworCisJa2ZyZWUoZG9tLT5uYW1lKTsKKwlrZnJlZShnZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXV0aF9vcHMgc3ZjYXV0aG9wc19nc3MgPSB7CisJLm5hbWUJCT0gInJwY3NlY19nc3MiLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZmxhdm91cgk9IFJQQ19BVVRIX0dTUywKKwkuYWNjZXB0CQk9IHN2Y2F1dGhfZ3NzX2FjY2VwdCwKKwkucmVsZWFzZQk9IHN2Y2F1dGhfZ3NzX3JlbGVhc2UsCisJLmRvbWFpbl9yZWxlYXNlID0gc3ZjYXV0aF9nc3NfZG9tYWluX3JlbGVhc2UsCisJLnNldF9jbGllbnQJPSBzdmNhdXRoX2dzc19zZXRfY2xpZW50LAorfTsKKworaW50Citnc3Nfc3ZjX2luaXQodm9pZCkKK3sKKwlpbnQgcnYgPSBzdmNfYXV0aF9yZWdpc3RlcihSUENfQVVUSF9HU1MsICZzdmNhdXRob3BzX2dzcyk7CisJaWYgKHJ2ID09IDApIHsKKwkJY2FjaGVfcmVnaXN0ZXIoJnJzY19jYWNoZSk7CisJCWNhY2hlX3JlZ2lzdGVyKCZyc2lfY2FjaGUpOworCX0KKwlyZXR1cm4gcnY7Cit9CisKK3ZvaWQKK2dzc19zdmNfc2h1dGRvd24odm9pZCkKK3sKKwljYWNoZV91bnJlZ2lzdGVyKCZyc2NfY2FjaGUpOworCWNhY2hlX3VucmVnaXN0ZXIoJnJzaV9jYWNoZSk7CisJc3ZjX2F1dGhfdW5yZWdpc3RlcihSUENfQVVUSF9HU1MpOworfQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX251bGwuYyBiL25ldC9zdW5ycGMvYXV0aF9udWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI3MmQzYQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zdW5ycGMvYXV0aF9udWxsLmMKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBsaW51eC9uZXQvc3VucnBjL2F1dGhfbnVsbC5jCisgKgorICogQVVUSF9OVUxMIGF1dGhlbnRpY2F0aW9uLiBSZWFsbHkgOi0pCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKyNpZmRlZiBSUENfREVCVUcKKyMgZGVmaW5lIFJQQ0RCR19GQUNJTElUWQlSUENEQkdfQVVUSAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcnBjX2F1dGggbnVsbF9hdXRoOworc3RhdGljIHN0cnVjdCBycGNfY3JlZCBudWxsX2NyZWQ7CisKK3N0YXRpYyBzdHJ1Y3QgcnBjX2F1dGggKgorbnVsX2NyZWF0ZShzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQsIHJwY19hdXRoZmxhdm9yX3QgZmxhdm9yKQoreworCWF0b21pY19pbmMoJm51bGxfYXV0aC5hdV9jb3VudCk7CisJcmV0dXJuICZudWxsX2F1dGg7Cit9CisKK3N0YXRpYyB2b2lkCitudWxfZGVzdHJveShzdHJ1Y3QgcnBjX2F1dGggKmF1dGgpCit7Cit9CisKKy8qCisgKiBMb29rdXAgTlVMTCBjcmVkcyBmb3IgY3VycmVudCBwcm9jZXNzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcnBjX2NyZWQgKgorbnVsX2xvb2t1cF9jcmVkKHN0cnVjdCBycGNfYXV0aCAqYXV0aCwgc3RydWN0IGF1dGhfY3JlZCAqYWNyZWQsIGludCBmbGFncykKK3sKKwlyZXR1cm4gZ2V0X3JwY2NyZWQoJm51bGxfY3JlZCk7Cit9CisKKy8qCisgKiBEZXN0cm95IGNyZWQgaGFuZGxlLgorICovCitzdGF0aWMgdm9pZAorbnVsX2Rlc3Ryb3lfY3JlZChzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQpCit7Cit9CisKKy8qCisgKiBNYXRjaCBjcmVkIGhhbmRsZSBhZ2FpbnN0IGN1cnJlbnQgcHJvY2VzcworICovCitzdGF0aWMgaW50CitudWxfbWF0Y2goc3RydWN0IGF1dGhfY3JlZCAqYWNyZWQsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCwgaW50IHRhc2tmbGFncykKK3sKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIE1hcnNoYWwgY3JlZGVudGlhbC4KKyAqLworc3RhdGljIHUzMiAqCitudWxfbWFyc2hhbChzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIHUzMiAqcCkKK3sKKwkqcCsrID0gaHRvbmwoUlBDX0FVVEhfTlVMTCk7CisJKnArKyA9IDA7CisJKnArKyA9IGh0b25sKFJQQ19BVVRIX05VTEwpOworCSpwKysgPSAwOworCisJcmV0dXJuIHA7Cit9CisKKy8qCisgKiBSZWZyZXNoIGNyZWRlbnRpYWwuIFRoaXMgaXMgYSBuby1vcCBmb3IgQVVUSF9OVUxMCisgKi8KK3N0YXRpYyBpbnQKK251bF9yZWZyZXNoKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwl0YXNrLT50a19tc2cucnBjX2NyZWQtPmNyX2ZsYWdzIHw9IFJQQ0FVVEhfQ1JFRF9VUFRPREFURTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiAqCitudWxfdmFsaWRhdGUoc3RydWN0IHJwY190YXNrICp0YXNrLCB1MzIgKnApCit7CisJcnBjX2F1dGhmbGF2b3JfdAlmbGF2b3I7CisJdTMyCQkJc2l6ZTsKKworCWZsYXZvciA9IG50b2hsKCpwKyspOworCWlmIChmbGF2b3IgIT0gUlBDX0FVVEhfTlVMTCkgeworCQlwcmludGsoIlJQQzogYmFkIHZlcmYgZmxhdm9yOiAldVxuIiwgZmxhdm9yKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2l6ZSA9IG50b2hsKCpwKyspOworCWlmIChzaXplICE9IDApIHsKKwkJcHJpbnRrKCJSUEM6IGJhZCB2ZXJmIHNpemU6ICV1XG4iLCBzaXplKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHA7Cit9CisKK3N0cnVjdCBycGNfYXV0aG9wcyBhdXRobnVsbF9vcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5hdV9mbGF2b3IJPSBSUENfQVVUSF9OVUxMLAorI2lmZGVmIFJQQ19ERUJVRworCS5hdV9uYW1lCT0gIk5VTEwiLAorI2VuZGlmCisJLmNyZWF0ZQkJPSBudWxfY3JlYXRlLAorCS5kZXN0cm95CT0gbnVsX2Rlc3Ryb3ksCisJLmxvb2t1cF9jcmVkCT0gbnVsX2xvb2t1cF9jcmVkLAorfTsKKworc3RhdGljCitzdHJ1Y3QgcnBjX2F1dGggbnVsbF9hdXRoID0geworCS5hdV9jc2xhY2sJPSA0LAorCS5hdV9yc2xhY2sJPSAyLAorCS5hdV9vcHMJCT0gJmF1dGhudWxsX29wcywKK307CisKK3N0YXRpYworc3RydWN0IHJwY19jcmVkb3BzCW51bGxfY3JlZG9wcyA9IHsKKwkuY3JfbmFtZQk9ICJBVVRIX05VTEwiLAorCS5jcmRlc3Ryb3kJPSBudWxfZGVzdHJveV9jcmVkLAorCS5jcm1hdGNoCT0gbnVsX21hdGNoLAorCS5jcm1hcnNoYWwJPSBudWxfbWFyc2hhbCwKKwkuY3JyZWZyZXNoCT0gbnVsX3JlZnJlc2gsCisJLmNydmFsaWRhdGUJPSBudWxfdmFsaWRhdGUsCit9OworCitzdGF0aWMKK3N0cnVjdCBycGNfY3JlZCBudWxsX2NyZWQgPSB7CisJLmNyX29wcwkJPSAmbnVsbF9jcmVkb3BzLAorCS5jcl9jb3VudAk9IEFUT01JQ19JTklUKDEpLAorCS5jcl9mbGFncwk9IFJQQ0FVVEhfQ1JFRF9VUFRPREFURSwKKyNpZmRlZiBSUENfREVCVUcKKwkuY3JfbWFnaWMJPSBSUENBVVRIX0NSRURfTUFHSUMsCisjZW5kaWYKK307CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfdW5peC5jIGIvbmV0L3N1bnJwYy9hdXRoX3VuaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmYyOTdhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3N1bnJwYy9hdXRoX3VuaXguYwpAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqIGxpbnV4L25ldC9zdW5ycGMvYXV0aF91bml4LmMKKyAqCisgKiBVTklYLXN0eWxlIGF1dGhlbnRpY2F0aW9uOyBubyBBVVRIX1NIT1JUIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9hdXRoLmg+CisKKyNkZWZpbmUgTkZTX05HUk9VUFMJMTYKKworc3RydWN0IHVueF9jcmVkIHsKKwlzdHJ1Y3QgcnBjX2NyZWQJCXVjX2Jhc2U7CisJZ2lkX3QJCQl1Y19naWQ7CisJZ2lkX3QJCQl1Y19naWRzW05GU19OR1JPVVBTXTsKK307CisjZGVmaW5lIHVjX3VpZAkJCXVjX2Jhc2UuY3JfdWlkCisjZGVmaW5lIHVjX2NvdW50CQl1Y19iYXNlLmNyX2NvdW50CisjZGVmaW5lIHVjX2ZsYWdzCQl1Y19iYXNlLmNyX2ZsYWdzCisjZGVmaW5lIHVjX2V4cGlyZQkJdWNfYmFzZS5jcl9leHBpcmUKKworI2RlZmluZSBVTlhfQ1JFRF9FWFBJUkUJCSg2MCAqIEhaKQorCisjZGVmaW5lIFVOWF9XUklURVNMQUNLCQkoMjEgKyAoVU5YX01BWE5PREVOQU1FID4+IDIpKQorCisjaWZkZWYgUlBDX0RFQlVHCisjIGRlZmluZSBSUENEQkdfRkFDSUxJVFkJUlBDREJHX0FVVEgKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHJwY19hdXRoCQl1bml4X2F1dGg7CitzdGF0aWMgc3RydWN0IHJwY19jcmVkX2NhY2hlCXVuaXhfY3JlZF9jYWNoZTsKK3N0YXRpYyBzdHJ1Y3QgcnBjX2NyZWRvcHMJdW5peF9jcmVkb3BzOworCitzdGF0aWMgc3RydWN0IHJwY19hdXRoICoKK3VueF9jcmVhdGUoc3RydWN0IHJwY19jbG50ICpjbG50LCBycGNfYXV0aGZsYXZvcl90IGZsYXZvcikKK3sKKwlkcHJpbnRrKCJSUEM6IGNyZWF0aW5nIFVOSVggYXV0aGVudGljYXRvciBmb3IgY2xpZW50ICVwXG4iLCBjbG50KTsKKwlpZiAoYXRvbWljX2luY19yZXR1cm4oJnVuaXhfYXV0aC5hdV9jb3VudCkgPT0gMCkKKwkJdW5peF9jcmVkX2NhY2hlLm5leHRnYyA9IGppZmZpZXMgKyAodW5peF9jcmVkX2NhY2hlLmV4cGlyZSA+PiAxKTsKKwlyZXR1cm4gJnVuaXhfYXV0aDsKK30KKworc3RhdGljIHZvaWQKK3VueF9kZXN0cm95KHN0cnVjdCBycGNfYXV0aCAqYXV0aCkKK3sKKwlkcHJpbnRrKCJSUEM6IGRlc3Ryb3lpbmcgVU5JWCBhdXRoZW50aWNhdG9yICVwXG4iLCBhdXRoKTsKKwlycGNhdXRoX2ZyZWVfY3JlZGNhY2hlKGF1dGgpOworfQorCisvKgorICogTG9va3VwIEFVVEhfVU5JWCBjcmVkcyBmb3IgY3VycmVudCBwcm9jZXNzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcnBjX2NyZWQgKgordW54X2xvb2t1cF9jcmVkKHN0cnVjdCBycGNfYXV0aCAqYXV0aCwgc3RydWN0IGF1dGhfY3JlZCAqYWNyZWQsIGludCBmbGFncykKK3sKKwlyZXR1cm4gcnBjYXV0aF9sb29rdXBfY3JlZGNhY2hlKGF1dGgsIGFjcmVkLCBmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnBjX2NyZWQgKgordW54X2NyZWF0ZV9jcmVkKHN0cnVjdCBycGNfYXV0aCAqYXV0aCwgc3RydWN0IGF1dGhfY3JlZCAqYWNyZWQsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgdW54X2NyZWQJKmNyZWQ7CisJaW50CQlpOworCisJZHByaW50aygiUlBDOiAgICAgIGFsbG9jYXRpbmcgVU5JWCBjcmVkIGZvciB1aWQgJWQgZ2lkICVkXG4iLAorCQkJCWFjcmVkLT51aWQsIGFjcmVkLT5naWQpOworCisJaWYgKCEoY3JlZCA9IChzdHJ1Y3QgdW54X2NyZWQgKikga21hbGxvYyhzaXplb2YoKmNyZWQpLCBHRlBfS0VSTkVMKSkpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJYXRvbWljX3NldCgmY3JlZC0+dWNfY291bnQsIDEpOworCWNyZWQtPnVjX2ZsYWdzID0gUlBDQVVUSF9DUkVEX1VQVE9EQVRFOworCWlmIChmbGFncyAmIFJQQ19UQVNLX1JPT1RDUkVEUykgeworCQljcmVkLT51Y191aWQgPSAwOworCQljcmVkLT51Y19naWQgPSAwOworCQljcmVkLT51Y19naWRzWzBdID0gTk9HUk9VUDsKKwl9IGVsc2UgeworCQlpbnQgZ3JvdXBzID0gYWNyZWQtPmdyb3VwX2luZm8tPm5ncm91cHM7CisJCWlmIChncm91cHMgPiBORlNfTkdST1VQUykKKwkJCWdyb3VwcyA9IE5GU19OR1JPVVBTOworCisJCWNyZWQtPnVjX3VpZCA9IGFjcmVkLT51aWQ7CisJCWNyZWQtPnVjX2dpZCA9IGFjcmVkLT5naWQ7CisJCWZvciAoaSA9IDA7IGkgPCBncm91cHM7IGkrKykKKwkJCWNyZWQtPnVjX2dpZHNbaV0gPSBHUk9VUF9BVChhY3JlZC0+Z3JvdXBfaW5mbywgaSk7CisJCWlmIChpIDwgTkZTX05HUk9VUFMpCisJCSAgY3JlZC0+dWNfZ2lkc1tpXSA9IE5PR1JPVVA7CisJfQorCWNyZWQtPnVjX2Jhc2UuY3Jfb3BzID0gJnVuaXhfY3JlZG9wczsKKworCXJldHVybiAoc3RydWN0IHJwY19jcmVkICopIGNyZWQ7Cit9CisKK3N0YXRpYyB2b2lkCit1bnhfZGVzdHJveV9jcmVkKHN0cnVjdCBycGNfY3JlZCAqY3JlZCkKK3sKKwlrZnJlZShjcmVkKTsKK30KKworLyoKKyAqIE1hdGNoIGNyZWRlbnRpYWxzIGFnYWluc3QgY3VycmVudCBwcm9jZXNzIGNyZWRzLgorICogVGhlIHJvb3Rfb3ZlcnJpZGUgYXJndW1lbnQgdGFrZXMgY2FyZSBvZiBjYXNlcyB3aGVyZSB0aGUgY2FsbGVyIG1heQorICogcmVxdWVzdCByb290IGNyZWRzIChlLmcuIGZvciBORlMgc3dhcHBpbmcpLgorICovCitzdGF0aWMgaW50Cit1bnhfbWF0Y2goc3RydWN0IGF1dGhfY3JlZCAqYWNyZWQsIHN0cnVjdCBycGNfY3JlZCAqcmNyZWQsIGludCB0YXNrZmxhZ3MpCit7CisJc3RydWN0IHVueF9jcmVkCSpjcmVkID0gKHN0cnVjdCB1bnhfY3JlZCAqKSByY3JlZDsKKwlpbnQJCWk7CisKKwlpZiAoISh0YXNrZmxhZ3MgJiBSUENfVEFTS19ST09UQ1JFRFMpKSB7CisJCWludCBncm91cHM7CisKKwkJaWYgKGNyZWQtPnVjX3VpZCAhPSBhY3JlZC0+dWlkCisJCSB8fCBjcmVkLT51Y19naWQgIT0gYWNyZWQtPmdpZCkKKwkJCXJldHVybiAwOworCisJCWdyb3VwcyA9IGFjcmVkLT5ncm91cF9pbmZvLT5uZ3JvdXBzOworCQlpZiAoZ3JvdXBzID4gTkZTX05HUk9VUFMpCisJCQlncm91cHMgPSBORlNfTkdST1VQUzsKKwkJZm9yIChpID0gMDsgaSA8IGdyb3VwcyA7IGkrKykKKwkJCWlmIChjcmVkLT51Y19naWRzW2ldICE9IEdST1VQX0FUKGFjcmVkLT5ncm91cF9pbmZvLCBpKSkKKwkJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAoY3JlZC0+dWNfdWlkID09IDAKKwkgICAgICYmIGNyZWQtPnVjX2dpZCA9PSAwCisJICAgICAmJiBjcmVkLT51Y19naWRzWzBdID09IChnaWRfdCkgTk9HUk9VUCk7Cit9CisKKy8qCisgKiBNYXJzaGFsIGNyZWRlbnRpYWxzLgorICogTWF5YmUgd2Ugc2hvdWxkIGtlZXAgYSBjYWNoZWQgY3JlZGVudGlhbCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KKyAqLworc3RhdGljIHUzMiAqCit1bnhfbWFyc2hhbChzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIHUzMiAqcCkKK3sKKwlzdHJ1Y3QgcnBjX2NsbnQJKmNsbnQgPSB0YXNrLT50a19jbGllbnQ7CisJc3RydWN0IHVueF9jcmVkCSpjcmVkID0gKHN0cnVjdCB1bnhfY3JlZCAqKSB0YXNrLT50a19tc2cucnBjX2NyZWQ7CisJdTMyCQkqYmFzZSwgKmhvbGQ7CisJaW50CQlpOworCisJKnArKyA9IGh0b25sKFJQQ19BVVRIX1VOSVgpOworCWJhc2UgPSBwKys7CisJKnArKyA9IGh0b25sKGppZmZpZXMvSFopOworCisJLyoKKwkgKiBDb3B5IHRoZSBVVFMgbm9kZW5hbWUgY2FwdHVyZWQgd2hlbiB0aGUgY2xpZW50IHdhcyBjcmVhdGVkLgorCSAqLworCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGNsbnQtPmNsX25vZGVuYW1lLCBjbG50LT5jbF9ub2RlbGVuKTsKKworCSpwKysgPSBodG9ubCgodTMyKSBjcmVkLT51Y191aWQpOworCSpwKysgPSBodG9ubCgodTMyKSBjcmVkLT51Y19naWQpOworCWhvbGQgPSBwKys7CisJZm9yIChpID0gMDsgaSA8IDE2ICYmIGNyZWQtPnVjX2dpZHNbaV0gIT0gKGdpZF90KSBOT0dST1VQOyBpKyspCisJCSpwKysgPSBodG9ubCgodTMyKSBjcmVkLT51Y19naWRzW2ldKTsKKwkqaG9sZCA9IGh0b25sKHAgLSBob2xkIC0gMSk7CQkvKiBnaWQgYXJyYXkgbGVuZ3RoICovCisJKmJhc2UgPSBodG9ubCgocCAtIGJhc2UgLSAxKSA8PCAyKTsJLyogY3JlZCBsZW5ndGggKi8KKworCSpwKysgPSBodG9ubChSUENfQVVUSF9OVUxMKTsKKwkqcCsrID0gaHRvbmwoMCk7CisKKwlyZXR1cm4gcDsKK30KKworLyoKKyAqIFJlZnJlc2ggY3JlZGVudGlhbHMuIFRoaXMgaXMgYSBuby1vcCBmb3IgQVVUSF9VTklYCisgKi8KK3N0YXRpYyBpbnQKK3VueF9yZWZyZXNoKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwl0YXNrLT50a19tc2cucnBjX2NyZWQtPmNyX2ZsYWdzIHw9IFJQQ0FVVEhfQ1JFRF9VUFRPREFURTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiAqCit1bnhfdmFsaWRhdGUoc3RydWN0IHJwY190YXNrICp0YXNrLCB1MzIgKnApCit7CisJcnBjX2F1dGhmbGF2b3JfdAlmbGF2b3I7CisJdTMyCQkJc2l6ZTsKKworCWZsYXZvciA9IG50b2hsKCpwKyspOworCWlmIChmbGF2b3IgIT0gUlBDX0FVVEhfTlVMTCAmJgorCSAgICBmbGF2b3IgIT0gUlBDX0FVVEhfVU5JWCAmJgorCSAgICBmbGF2b3IgIT0gUlBDX0FVVEhfU0hPUlQpIHsKKwkJcHJpbnRrKCJSUEM6IGJhZCB2ZXJmIGZsYXZvcjogJXVcbiIsIGZsYXZvcik7CisJCXJldHVybiBOVUxMOworCX0KKworCXNpemUgPSBudG9obCgqcCsrKTsKKwlpZiAoc2l6ZSA+IFJQQ19NQVhfQVVUSF9TSVpFKSB7CisJCXByaW50aygiUlBDOiBnaWFudCB2ZXJmIHNpemU6ICV1XG4iLCBzaXplKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXRhc2stPnRrX2F1dGgtPmF1X3JzbGFjayA9IChzaXplID4+IDIpICsgMjsKKwlwICs9IChzaXplID4+IDIpOworCisJcmV0dXJuIHA7Cit9CisKK3N0cnVjdCBycGNfYXV0aG9wcwlhdXRodW5peF9vcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5hdV9mbGF2b3IJPSBSUENfQVVUSF9VTklYLAorI2lmZGVmIFJQQ19ERUJVRworCS5hdV9uYW1lCT0gIlVOSVgiLAorI2VuZGlmCisJLmNyZWF0ZQkJPSB1bnhfY3JlYXRlLAorCS5kZXN0cm95CT0gdW54X2Rlc3Ryb3ksCisJLmxvb2t1cF9jcmVkCT0gdW54X2xvb2t1cF9jcmVkLAorCS5jcmNyZWF0ZQk9IHVueF9jcmVhdGVfY3JlZCwKK307CisKK3N0YXRpYworc3RydWN0IHJwY19jcmVkX2NhY2hlCXVuaXhfY3JlZF9jYWNoZSA9IHsKKwkuZXhwaXJlCQk9IFVOWF9DUkVEX0VYUElSRSwKK307CisKK3N0YXRpYworc3RydWN0IHJwY19hdXRoCQl1bml4X2F1dGggPSB7CisJLmF1X2NzbGFjawk9IFVOWF9XUklURVNMQUNLLAorCS5hdV9yc2xhY2sJPSAyLAkJCS8qIGFzc3VtZSBBVVRIX05VTEwgdmVyZiAqLworCS5hdV9vcHMJCT0gJmF1dGh1bml4X29wcywKKwkuYXVfY291bnQJPSBBVE9NSUNfSU5JVCgwKSwKKwkuYXVfY3JlZGNhY2hlCT0gJnVuaXhfY3JlZF9jYWNoZSwKK307CisKK3N0YXRpYworc3RydWN0IHJwY19jcmVkb3BzCXVuaXhfY3JlZG9wcyA9IHsKKwkuY3JfbmFtZQk9ICJBVVRIX1VOSVgiLAorCS5jcmRlc3Ryb3kJPSB1bnhfZGVzdHJveV9jcmVkLAorCS5jcm1hdGNoCT0gdW54X21hdGNoLAorCS5jcm1hcnNoYWwJPSB1bnhfbWFyc2hhbCwKKwkuY3JyZWZyZXNoCT0gdW54X3JlZnJlc2gsCisJLmNydmFsaWRhdGUJPSB1bnhfdmFsaWRhdGUsCit9OwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9jYWNoZS5jIGIvbmV0L3N1bnJwYy9jYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMGY1YmMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc3VucnBjL2NhY2hlLmMKQEAgLTAsMCArMSwxMTg5IEBACisvKgorICogbmV0L3N1bnJwYy9jYWNoZS5jCisgKgorICogR2VuZXJpYyBjb2RlIGZvciB2YXJpb3VzIGF1dGhlbnRpY2F0aW9uLXJlbGF0ZWQgY2FjaGVzCisgKiB1c2VkIGJ5IHN1bnJwYyBjbGllbnRzIGFuZCBzZXJ2ZXJzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBOZWlsIEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisgKgorICogUmVsZWFzZWQgdW5kZXIgdGVybXMgaW4gR1BMIHZlcnNpb24gMi4gIFNlZSBDT1BZSU5HLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdGF0cy5oPgorCisjZGVmaW5lCSBSUENEQkdfRkFDSUxJVFkgUlBDREJHX0NBQ0hFCisKK3N0YXRpYyB2b2lkIGNhY2hlX2RlZmVyX3JlcShzdHJ1Y3QgY2FjaGVfcmVxICpyZXEsIHN0cnVjdCBjYWNoZV9oZWFkICppdGVtKTsKK3N0YXRpYyB2b2lkIGNhY2hlX3JldmlzaXRfcmVxdWVzdChzdHJ1Y3QgY2FjaGVfaGVhZCAqaXRlbSk7CisKK3ZvaWQgY2FjaGVfaW5pdChzdHJ1Y3QgY2FjaGVfaGVhZCAqaCkKK3sKKwl0aW1lX3Qgbm93ID0gZ2V0X3NlY29uZHMoKTsKKwloLT5uZXh0ID0gTlVMTDsKKwloLT5mbGFncyA9IDA7CisJYXRvbWljX3NldCgmaC0+cmVmY250LCAxKTsKKwloLT5leHBpcnlfdGltZSA9IG5vdyArIENBQ0hFX05FV19FWFBJUlk7CisJaC0+bGFzdF9yZWZyZXNoID0gbm93OworfQorCisKK3N0YXRpYyBpbnQgY2FjaGVfbWFrZV91cGNhbGwoc3RydWN0IGNhY2hlX2RldGFpbCAqZGV0YWlsLCBzdHJ1Y3QgY2FjaGVfaGVhZCAqaCk7CisvKgorICogVGhpcyBpcyB0aGUgZ2VuZXJpYyBjYWNoZSBtYW5hZ2VtZW50IHJvdXRpbmUgZm9yIGFsbAorICogdGhlIGF1dGhlbnRpY2F0aW9uIGNhY2hlcy4KKyAqIEl0IGNoZWNrcyB0aGUgY3VycmVuY3kgb2YgYSBjYWNoZSBpdGVtIGFuZCB3aWxsIChsYXRlcikKKyAqIGluaXRpYXRlIGFuIHVwY2FsbCB0byBmaWxsIGl0IGlmIG5lZWRlZC4KKyAqCisgKgorICogUmV0dXJucyAwIGlmIHRoZSBjYWNoZV9oZWFkIGNhbiBiZSB1c2VkLCBvciBjYWNoZV9wdXRzIGl0IGFuZCByZXR1cm5zCisgKiAtRUFHQUlOIGlmIHVwY2FsbCBpcyBwZW5kaW5nLAorICogLUVOT0VOVCBpZiBjYWNoZSBlbnRyeSB3YXMgbmVnYXRpdmUKKyAqLworaW50IGNhY2hlX2NoZWNrKHN0cnVjdCBjYWNoZV9kZXRhaWwgKmRldGFpbCwKKwkJICAgIHN0cnVjdCBjYWNoZV9oZWFkICpoLCBzdHJ1Y3QgY2FjaGVfcmVxICpycXN0cCkKK3sKKwlpbnQgcnY7CisJbG9uZyByZWZyZXNoX2FnZSwgYWdlOworCisJLyogRmlyc3QgZGVjaWRlIHJldHVybiBzdGF0dXMgYXMgYmVzdCB3ZSBjYW4gKi8KKwlpZiAoIXRlc3RfYml0KENBQ0hFX1ZBTElELCAmaC0+ZmxhZ3MpIHx8CisJICAgIGgtPmV4cGlyeV90aW1lIDwgZ2V0X3NlY29uZHMoKSkKKwkJcnYgPSAtRUFHQUlOOworCWVsc2UgaWYgKGRldGFpbC0+Zmx1c2hfdGltZSA+IGgtPmxhc3RfcmVmcmVzaCkKKwkJcnYgPSAtRUFHQUlOOworCWVsc2UgeworCQkvKiBlbnRyeSBpcyB2YWxpZCAqLworCQlpZiAodGVzdF9iaXQoQ0FDSEVfTkVHQVRJVkUsICZoLT5mbGFncykpCisJCQlydiA9IC1FTk9FTlQ7CisJCWVsc2UgcnYgPSAwOworCX0KKworCS8qIG5vdyBzZWUgaWYgd2Ugd2FudCB0byBzdGFydCBhbiB1cGNhbGwgKi8KKwlyZWZyZXNoX2FnZSA9IChoLT5leHBpcnlfdGltZSAtIGgtPmxhc3RfcmVmcmVzaCk7CisJYWdlID0gZ2V0X3NlY29uZHMoKSAtIGgtPmxhc3RfcmVmcmVzaDsKKworCWlmIChycXN0cCA9PSBOVUxMKSB7CisJCWlmIChydiA9PSAtRUFHQUlOKQorCQkJcnYgPSAtRU5PRU5UOworCX0gZWxzZSBpZiAocnYgPT0gLUVBR0FJTiB8fCBhZ2UgPiByZWZyZXNoX2FnZS8yKSB7CisJCWRwcmludGsoIldhbnQgdXBkYXRlLCByZWZhZ2U9JWxkLCBhZ2U9JWxkXG4iLCByZWZyZXNoX2FnZSwgYWdlKTsKKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KENBQ0hFX1BFTkRJTkcsICZoLT5mbGFncykpIHsKKwkJCXN3aXRjaCAoY2FjaGVfbWFrZV91cGNhbGwoZGV0YWlsLCBoKSkgeworCQkJY2FzZSAtRUlOVkFMOgorCQkJCWNsZWFyX2JpdChDQUNIRV9QRU5ESU5HLCAmaC0+ZmxhZ3MpOworCQkJCWlmIChydiA9PSAtRUFHQUlOKSB7CisJCQkJCXNldF9iaXQoQ0FDSEVfTkVHQVRJVkUsICZoLT5mbGFncyk7CisJCQkJCWNhY2hlX2ZyZXNoKGRldGFpbCwgaCwgZ2V0X3NlY29uZHMoKStDQUNIRV9ORVdfRVhQSVJZKTsKKwkJCQkJcnYgPSAtRU5PRU5UOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSAtRUFHQUlOOgorCQkJCWNsZWFyX2JpdChDQUNIRV9QRU5ESU5HLCAmaC0+ZmxhZ3MpOworCQkJCWNhY2hlX3JldmlzaXRfcmVxdWVzdChoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmIChydiA9PSAtRUFHQUlOKQorCQljYWNoZV9kZWZlcl9yZXEocnFzdHAsIGgpOworCisJaWYgKHJ2ICYmIGgpCisJCWRldGFpbC0+Y2FjaGVfcHV0KGgsIGRldGFpbCk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgdm9pZCBxdWV1ZV9sb29zZShzdHJ1Y3QgY2FjaGVfZGV0YWlsICpkZXRhaWwsIHN0cnVjdCBjYWNoZV9oZWFkICpjaCk7CisKK3ZvaWQgY2FjaGVfZnJlc2goc3RydWN0IGNhY2hlX2RldGFpbCAqZGV0YWlsLAorCQkgc3RydWN0IGNhY2hlX2hlYWQgKmhlYWQsIHRpbWVfdCBleHBpcnkpCit7CisKKwloZWFkLT5leHBpcnlfdGltZSA9IGV4cGlyeTsKKwloZWFkLT5sYXN0X3JlZnJlc2ggPSBnZXRfc2Vjb25kcygpOworCWlmICghdGVzdF9hbmRfc2V0X2JpdChDQUNIRV9WQUxJRCwgJmhlYWQtPmZsYWdzKSkKKwkJY2FjaGVfcmV2aXNpdF9yZXF1ZXN0KGhlYWQpOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ0FDSEVfUEVORElORywgJmhlYWQtPmZsYWdzKSkKKwkJcXVldWVfbG9vc2UoZGV0YWlsLCBoZWFkKTsKK30KKworLyoKKyAqIGNhY2hlcyBuZWVkIHRvIGJlIHBlcmlvZGljYWxseSBjbGVhbmVkLgorICogRm9yIHRoaXMgd2UgbWFpbnRhaW4gYSBsaXN0IG9mIGNhY2hlX2RldGFpbCBhbmQKKyAqIGEgY3VycmVudCBwb2ludGVyIGludG8gdGhhdCBsaXN0IGFuZCBpbnRvIHRoZSB0YWJsZQorICogZm9yIHRoYXQgZW50cnkuCisgKgorICogRWFjaCB0aW1lIGNsZWFuX2NhY2hlIGlzIGNhbGxlZCBpdCBmaW5kcyB0aGUgbmV4dCBub24tZW1wdHkgZW50cnkKKyAqIGluIHRoZSBjdXJyZW50IHRhYmxlIGFuZCB3YWxrcyB0aGUgbGlzdCBpbiB0aGF0IGVudHJ5CisgKiBsb29raW5nIGZvciBlbnRyaWVzIHRoYXQgY2FuIGJlIHJlbW92ZWQuCisgKgorICogQW4gZW50cnkgZ2V0cyByZW1vdmVkIGlmOgorICogLSBUaGUgZXhwaXJ5IGlzIGJlZm9yZSBjdXJyZW50IHRpbWUKKyAqIC0gVGhlIGxhc3RfcmVmcmVzaCB0aW1lIGlzIGJlZm9yZSB0aGUgZmx1c2hfdGltZSBmb3IgdGhhdCBjYWNoZQorICoKKyAqIGxhdGVyIHdlIG1pZ2h0IGRyb3Agb2xkIGVudHJpZXMgd2l0aCBub24tTkVWRVIgZXhwaXJ5IGlmIHRoYXQgdGFibGUKKyAqIGlzIGdldHRpbmcgJ2Z1bGwnIGZvciBzb21lIGRlZmluaXRpb24gb2YgJ2Z1bGwnCisgKgorICogVGhlIHF1ZXN0aW9uIG9mICJob3cgb2Z0ZW4gdG8gc2NhbiBhIHRhYmxlIiBpcyBhbiBpbnRlcmVzdGluZyBvbmUKKyAqIGFuZCBpcyBhbnN3ZXJlZCBpbiBwYXJ0IGJ5IHRoZSB1c2Ugb2YgdGhlICJuZXh0Y2hlY2siIGZpZWxkIGluIHRoZQorICogY2FjaGVfZGV0YWlsLgorICogV2hlbiBhIHNjYW4gb2YgYSB0YWJsZSBiZWdpbnMsIHRoZSBuZXh0Y2hlY2sgZmllbGQgaXMgc2V0IHRvIGEgdGltZQorICogdGhhdCBpcyB3ZWxsIGludG8gdGhlIGZ1dHVyZS4KKyAqIFdoaWxlIHNjYW5uaW5nLCBpZiBhbiBleHBpcnkgdGltZSBpcyBmb3VuZCB0aGF0IGlzIGVhcmxpZXIgdGhhbiB0aGUKKyAqIGN1cnJlbnQgbmV4dGNoZWNrIHRpbWUsIG5leHRjaGVjayBpcyBzZXQgdG8gdGhhdCBleHBpcnkgdGltZS4KKyAqIElmIHRoZSBmbHVzaF90aW1lIGlzIGV2ZXIgc2V0IHRvIGEgdGltZSBlYXJsaWVyIHRoYW4gdGhlIG5leHRjaGVjaworICogdGltZSwgdGhlIG5leHRjaGVjayB0aW1lIGlzIHRoZW4gc2V0IHRvIHRoYXQgZmx1c2hfdGltZS4KKyAqCisgKiBBIHRhYmxlIGlzIHRoZW4gb25seSBzY2FubmVkIGlmIHRoZSBjdXJyZW50IHRpbWUgaXMgYXQgbGVhc3QKKyAqIHRoZSBuZXh0Y2hlY2sgdGltZS4KKyAqIAorICovCisKK3N0YXRpYyBMSVNUX0hFQUQoY2FjaGVfbGlzdCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNhY2hlX2xpc3RfbG9jayk7CitzdGF0aWMgc3RydWN0IGNhY2hlX2RldGFpbCAqY3VycmVudF9kZXRhaWw7CitzdGF0aWMgaW50IGN1cnJlbnRfaW5kZXg7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNhY2hlX2ZpbGVfb3BlcmF0aW9uczsKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNvbnRlbnRfZmlsZV9vcGVyYXRpb25zOworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2FjaGVfZmx1c2hfb3BlcmF0aW9uczsKKworc3RhdGljIHZvaWQgZG9fY2FjaGVfY2xlYW4odm9pZCAqZGF0YSk7CitzdGF0aWMgREVDTEFSRV9XT1JLKGNhY2hlX2NsZWFuZXIsIGRvX2NhY2hlX2NsZWFuLCBOVUxMKTsKKwordm9pZCBjYWNoZV9yZWdpc3RlcihzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCkKK3sKKwljZC0+cHJvY19lbnQgPSBwcm9jX21rZGlyKGNkLT5uYW1lLCBwcm9jX25ldF9ycGMpOworCWlmIChjZC0+cHJvY19lbnQpIHsKKwkJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwOworCQljZC0+cHJvY19lbnQtPm93bmVyID0gVEhJU19NT0RVTEU7CisJCWNkLT5jaGFubmVsX2VudCA9IGNkLT5jb250ZW50X2VudCA9IE5VTEw7CisJCQorIAkJcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJmbHVzaCIsIFNfSUZSRUd8U19JUlVTUnxTX0lXVVNSLAorIAkJCQkgICAgICBjZC0+cHJvY19lbnQpOworCQljZC0+Zmx1c2hfZW50ID0gIHA7CisgCQlpZiAocCkgeworIAkJCXAtPnByb2NfZm9wcyA9ICZjYWNoZV9mbHVzaF9vcGVyYXRpb25zOworIAkJCXAtPm93bmVyID0gVEhJU19NT0RVTEU7CisgCQkJcC0+ZGF0YSA9IGNkOworIAkJfQorIAorCQlpZiAoY2QtPmNhY2hlX3JlcXVlc3QgfHwgY2QtPmNhY2hlX3BhcnNlKSB7CisJCQlwID0gY3JlYXRlX3Byb2NfZW50cnkoImNoYW5uZWwiLCBTX0lGUkVHfFNfSVJVU1J8U19JV1VTUiwKKwkJCQkJICAgICAgY2QtPnByb2NfZW50KTsKKwkJCWNkLT5jaGFubmVsX2VudCA9IHA7CisJCQlpZiAocCkgeworCQkJCXAtPnByb2NfZm9wcyA9ICZjYWNoZV9maWxlX29wZXJhdGlvbnM7CisJCQkJcC0+b3duZXIgPSBUSElTX01PRFVMRTsKKwkJCQlwLT5kYXRhID0gY2Q7CisJCQl9CisJCX0KKyAJCWlmIChjZC0+Y2FjaGVfc2hvdykgeworIAkJCXAgPSBjcmVhdGVfcHJvY19lbnRyeSgiY29udGVudCIsIFNfSUZSRUd8U19JUlVTUnxTX0lXVVNSLAorIAkJCQkJICAgICAgY2QtPnByb2NfZW50KTsKKwkJCWNkLT5jb250ZW50X2VudCA9IHA7CisgCQkJaWYgKHApIHsKKyAJCQkJcC0+cHJvY19mb3BzID0gJmNvbnRlbnRfZmlsZV9vcGVyYXRpb25zOworIAkJCQlwLT5vd25lciA9IFRISVNfTU9EVUxFOworIAkJCQlwLT5kYXRhID0gY2Q7CisgCQkJfQorIAkJfQorCX0KKwlyd2xvY2tfaW5pdCgmY2QtPmhhc2hfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmNkLT5xdWV1ZSk7CisJc3Bpbl9sb2NrKCZjYWNoZV9saXN0X2xvY2spOworCWNkLT5uZXh0Y2hlY2sgPSAwOworCWNkLT5lbnRyaWVzID0gMDsKKwlhdG9taWNfc2V0KCZjZC0+cmVhZGVycywgMCk7CisJY2QtPmxhc3RfY2xvc2UgPSAwOworCWNkLT5sYXN0X3dhcm4gPSAtMTsKKwlsaXN0X2FkZCgmY2QtPm90aGVycywgJmNhY2hlX2xpc3QpOworCXNwaW5fdW5sb2NrKCZjYWNoZV9saXN0X2xvY2spOworCisJLyogc3RhcnQgdGhlIGNsZWFuaW5nIHByb2Nlc3MgKi8KKwlzY2hlZHVsZV93b3JrKCZjYWNoZV9jbGVhbmVyKTsKK30KKworaW50IGNhY2hlX3VucmVnaXN0ZXIoc3RydWN0IGNhY2hlX2RldGFpbCAqY2QpCit7CisJY2FjaGVfcHVyZ2UoY2QpOworCXNwaW5fbG9jaygmY2FjaGVfbGlzdF9sb2NrKTsKKwl3cml0ZV9sb2NrKCZjZC0+aGFzaF9sb2NrKTsKKwlpZiAoY2QtPmVudHJpZXMgfHwgYXRvbWljX3JlYWQoJmNkLT5pbnVzZSkpIHsKKwkJd3JpdGVfdW5sb2NrKCZjZC0+aGFzaF9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmNhY2hlX2xpc3RfbG9jayk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmIChjdXJyZW50X2RldGFpbCA9PSBjZCkKKwkJY3VycmVudF9kZXRhaWwgPSBOVUxMOworCWxpc3RfZGVsX2luaXQoJmNkLT5vdGhlcnMpOworCXdyaXRlX3VubG9jaygmY2QtPmhhc2hfbG9jayk7CisJc3Bpbl91bmxvY2soJmNhY2hlX2xpc3RfbG9jayk7CisJaWYgKGNkLT5wcm9jX2VudCkgeworCQlpZiAoY2QtPmZsdXNoX2VudCkKKwkJCXJlbW92ZV9wcm9jX2VudHJ5KCJmbHVzaCIsIGNkLT5wcm9jX2VudCk7CisJCWlmIChjZC0+Y2hhbm5lbF9lbnQpCisJCQlyZW1vdmVfcHJvY19lbnRyeSgiY2hhbm5lbCIsIGNkLT5wcm9jX2VudCk7CisJCWlmIChjZC0+Y29udGVudF9lbnQpCisJCQlyZW1vdmVfcHJvY19lbnRyeSgiY29udGVudCIsIGNkLT5wcm9jX2VudCk7CisKKwkJY2QtPnByb2NfZW50ID0gTlVMTDsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoY2QtPm5hbWUsIHByb2NfbmV0X3JwYyk7CisJfQorCWlmIChsaXN0X2VtcHR5KCZjYWNoZV9saXN0KSkgeworCQkvKiBtb2R1bGUgbXVzdCBiZSBiZWluZyB1bmxvYWRlZCBzbyBpdHMgc2FmZSB0byBraWxsIHRoZSB3b3JrZXIgKi8KKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmY2FjaGVfY2xlYW5lcik7CisJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJfQorCXJldHVybiAwOworfQorCisvKiBjbGVhbiBjYWNoZSB0cmllcyB0byBmaW5kIHNvbWV0aGluZyB0byBjbGVhbgorICogYW5kIGNsZWFucyBpdC4KKyAqIEl0IHJldHVybnMgMSBpZiBpdCBjbGVhbmVkIHNvbWV0aGluZywKKyAqICAgICAgICAgICAgMCBpZiBpdCBkaWRuJ3QgZmluZCBhbnl0aGluZyB0aGlzIHRpbWUKKyAqICAgICAgICAgICAtMSBpZiBpdCBmZWxsIG9mZiB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICovCitzdGF0aWMgaW50IGNhY2hlX2NsZWFuKHZvaWQpCit7CisJaW50IHJ2ID0gMDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0OworCisJc3Bpbl9sb2NrKCZjYWNoZV9saXN0X2xvY2spOworCisJLyogZmluZCBhIHN1aXRhYmxlIHRhYmxlIGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUgKi8KKwl3aGlsZSAoY3VycmVudF9kZXRhaWwgPT0gTlVMTCB8fAorCSAgICBjdXJyZW50X2luZGV4ID49IGN1cnJlbnRfZGV0YWlsLT5oYXNoX3NpemUpIHsKKwkJaWYgKGN1cnJlbnRfZGV0YWlsKQorCQkJbmV4dCA9IGN1cnJlbnRfZGV0YWlsLT5vdGhlcnMubmV4dDsKKwkJZWxzZQorCQkJbmV4dCA9IGNhY2hlX2xpc3QubmV4dDsKKwkJaWYgKG5leHQgPT0gJmNhY2hlX2xpc3QpIHsKKwkJCWN1cnJlbnRfZGV0YWlsID0gTlVMTDsKKwkJCXNwaW5fdW5sb2NrKCZjYWNoZV9saXN0X2xvY2spOworCQkJcmV0dXJuIC0xOworCQl9CisJCWN1cnJlbnRfZGV0YWlsID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgY2FjaGVfZGV0YWlsLCBvdGhlcnMpOworCQlpZiAoY3VycmVudF9kZXRhaWwtPm5leHRjaGVjayA+IGdldF9zZWNvbmRzKCkpCisJCQljdXJyZW50X2luZGV4ID0gY3VycmVudF9kZXRhaWwtPmhhc2hfc2l6ZTsKKwkJZWxzZSB7CisJCQljdXJyZW50X2luZGV4ID0gMDsKKwkJCWN1cnJlbnRfZGV0YWlsLT5uZXh0Y2hlY2sgPSBnZXRfc2Vjb25kcygpKzMwKjYwOworCQl9CisJfQorCisJLyogZmluZCBhIG5vbi1lbXB0eSBidWNrZXQgaW4gdGhlIHRhYmxlICovCisJd2hpbGUgKGN1cnJlbnRfZGV0YWlsICYmCisJICAgICAgIGN1cnJlbnRfaW5kZXggPCBjdXJyZW50X2RldGFpbC0+aGFzaF9zaXplICYmCisJICAgICAgIGN1cnJlbnRfZGV0YWlsLT5oYXNoX3RhYmxlW2N1cnJlbnRfaW5kZXhdID09IE5VTEwpCisJCWN1cnJlbnRfaW5kZXgrKzsKKworCS8qIGZpbmQgYSBjbGVhbmFibGUgZW50cnkgaW4gdGhlIGJ1Y2tldCBhbmQgY2xlYW4gaXQsIG9yIHNldCB0byBuZXh0IGJ1Y2tldCAqLworCQorCWlmIChjdXJyZW50X2RldGFpbCAmJiBjdXJyZW50X2luZGV4IDwgY3VycmVudF9kZXRhaWwtPmhhc2hfc2l6ZSkgeworCQlzdHJ1Y3QgY2FjaGVfaGVhZCAqY2gsICoqY3A7CisJCXN0cnVjdCBjYWNoZV9kZXRhaWwgKmQ7CisJCQorCQl3cml0ZV9sb2NrKCZjdXJyZW50X2RldGFpbC0+aGFzaF9sb2NrKTsKKworCQkvKiBPaywgbm93IHRvIGNsZWFuIHRoaXMgc3RyYW5kICovCisJCQkKKwkJY3AgPSAmIGN1cnJlbnRfZGV0YWlsLT5oYXNoX3RhYmxlW2N1cnJlbnRfaW5kZXhdOworCQljaCA9ICpjcDsKKwkJZm9yICg7IGNoOyBjcD0gJiBjaC0+bmV4dCwgY2g9ICpjcCkgeworCQkJaWYgKGN1cnJlbnRfZGV0YWlsLT5uZXh0Y2hlY2sgPiBjaC0+ZXhwaXJ5X3RpbWUpCisJCQkJY3VycmVudF9kZXRhaWwtPm5leHRjaGVjayA9IGNoLT5leHBpcnlfdGltZSsxOworCQkJaWYgKGNoLT5leHBpcnlfdGltZSA+PSBnZXRfc2Vjb25kcygpCisJCQkgICAgJiYgY2gtPmxhc3RfcmVmcmVzaCA+PSBjdXJyZW50X2RldGFpbC0+Zmx1c2hfdGltZQorCQkJCSkKKwkJCQljb250aW51ZTsKKwkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ0FDSEVfUEVORElORywgJmNoLT5mbGFncykpCisJCQkJcXVldWVfbG9vc2UoY3VycmVudF9kZXRhaWwsIGNoKTsKKworCQkJaWYgKGF0b21pY19yZWFkKCZjaC0+cmVmY250KSA9PSAxKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChjaCkgeworCQkJKmNwID0gY2gtPm5leHQ7CisJCQljaC0+bmV4dCA9IE5VTEw7CisJCQljdXJyZW50X2RldGFpbC0+ZW50cmllcy0tOworCQkJcnYgPSAxOworCQl9CisJCXdyaXRlX3VubG9jaygmY3VycmVudF9kZXRhaWwtPmhhc2hfbG9jayk7CisJCWQgPSBjdXJyZW50X2RldGFpbDsKKwkJaWYgKCFjaCkKKwkJCWN1cnJlbnRfaW5kZXggKys7CisJCXNwaW5fdW5sb2NrKCZjYWNoZV9saXN0X2xvY2spOworCQlpZiAoY2gpCisJCQlkLT5jYWNoZV9wdXQoY2gsIGQpOworCX0gZWxzZQorCQlzcGluX3VubG9jaygmY2FjaGVfbGlzdF9sb2NrKTsKKworCXJldHVybiBydjsKK30KKworLyoKKyAqIFdlIHdhbnQgdG8gcmVndWxhcmx5IGNsZWFuIHRoZSBjYWNoZSwgc28gd2UgbmVlZCB0byBzY2hlZHVsZSBzb21lIHdvcmsgLi4uCisgKi8KK3N0YXRpYyB2b2lkIGRvX2NhY2hlX2NsZWFuKHZvaWQgKmRhdGEpCit7CisJaW50IGRlbGF5ID0gNTsKKwlpZiAoY2FjaGVfY2xlYW4oKSA9PSAtMSkKKwkJZGVsYXkgPSAzMCpIWjsKKworCWlmIChsaXN0X2VtcHR5KCZjYWNoZV9saXN0KSkKKwkJZGVsYXkgPSAwOworCisJaWYgKGRlbGF5KQorCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNhY2hlX2NsZWFuZXIsIGRlbGF5KTsKK30KKworCisvKiAKKyAqIENsZWFuIGFsbCBjYWNoZXMgcHJvbXB0bHkuICBUaGlzIGp1c3QgY2FsbHMgY2FjaGVfY2xlYW4KKyAqIHJlcGVhdGVkbHkgdW50aWwgd2UgYXJlIHN1cmUgdGhhdCBldmVyeSBjYWNoZSBoYXMgaGFkIGEgY2hhbmNlIHRvIAorICogYmUgZnVsbHkgY2xlYW5lZAorICovCit2b2lkIGNhY2hlX2ZsdXNoKHZvaWQpCit7CisJd2hpbGUgKGNhY2hlX2NsZWFuKCkgIT0gLTEpCisJCWNvbmRfcmVzY2hlZCgpOworCXdoaWxlIChjYWNoZV9jbGVhbigpICE9IC0xKQorCQljb25kX3Jlc2NoZWQoKTsKK30KKwordm9pZCBjYWNoZV9wdXJnZShzdHJ1Y3QgY2FjaGVfZGV0YWlsICpkZXRhaWwpCit7CisJZGV0YWlsLT5mbHVzaF90aW1lID0gTE9OR19NQVg7CisJZGV0YWlsLT5uZXh0Y2hlY2sgPSBnZXRfc2Vjb25kcygpOworCWNhY2hlX2ZsdXNoKCk7CisJZGV0YWlsLT5mbHVzaF90aW1lID0gMTsKK30KKworCisKKy8qCisgKiBEZWZlcnJhbCBhbmQgUmV2aXNpdGluZyBvZiBSZXF1ZXN0cy4KKyAqCisgKiBJZiBhIGNhY2hlIGxvb2t1cCBmaW5kcyBhIHBlbmRpbmcgZW50cnksIHdlCisgKiBuZWVkIHRvIGRlZmVyIHRoZSByZXF1ZXN0IGFuZCByZXZpc2l0IGl0IGxhdGVyLgorICogQWxsIGRlZmVycmVkIHJlcXVlc3RzIGFyZSBzdG9yZWQgaW4gYSBoYXNoIHRhYmxlLAorICogaW5kZXhlZCBieSAic3RydWN0IGNhY2hlX2hlYWQgKiIuCisgKiBBcyBpdCBtYXkgYmUgd2FzdGVmdWwgdG8gc3RvcmUgYSB3aG9sZSByZXF1ZXN0CisgKiBzdHJ1Y3R1cmUsIHdlIGFsbG93IHRoZSByZXF1ZXN0IHRvIHByb3ZpZGUgYSAKKyAqIGRlZmVycmVkIGZvcm0sIHdoaWNoIG11c3QgY29udGFpbiBhCisgKiAnc3RydWN0IGNhY2hlX2RlZmVycmVkX3JlcScKKyAqIFRoaXMgY2FjaGVfZGVmZXJyZWRfcmVxIGNvbnRhaW5zIGEgbWV0aG9kIHRvIGFsbG93CisgKiBpdCB0byBiZSByZXZpc2l0ZWQgd2hlbiBjYWNoZSBpbmZvIGlzIGF2YWlsYWJsZQorICovCisKKyNkZWZpbmUJREZSX0hBU0hTSVpFCShQQUdFX1NJWkUvc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpKQorI2RlZmluZQlERlJfSEFTSChpdGVtKQkoKCgobG9uZylpdGVtKT4+NCBeICgoKGxvbmcpaXRlbSk+PjEzKSkgJSBERlJfSEFTSFNJWkUpCisKKyNkZWZpbmUJREZSX01BWAkzMDAJLyogPz8/ICovCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2FjaGVfZGVmZXJfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKGNhY2hlX2RlZmVyX2xpc3QpOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgY2FjaGVfZGVmZXJfaGFzaFtERlJfSEFTSFNJWkVdOworc3RhdGljIGludCBjYWNoZV9kZWZlcl9jbnQ7CisKK3N0YXRpYyB2b2lkIGNhY2hlX2RlZmVyX3JlcShzdHJ1Y3QgY2FjaGVfcmVxICpyZXEsIHN0cnVjdCBjYWNoZV9oZWFkICppdGVtKQoreworCXN0cnVjdCBjYWNoZV9kZWZlcnJlZF9yZXEgKmRyZXE7CisJaW50IGhhc2ggPSBERlJfSEFTSChpdGVtKTsKKworCWRyZXEgPSByZXEtPmRlZmVyKHJlcSk7CisJaWYgKGRyZXEgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZHJlcS0+aXRlbSA9IGl0ZW07CisJZHJlcS0+cmVjdl90aW1lID0gZ2V0X3NlY29uZHMoKTsKKworCXNwaW5fbG9jaygmY2FjaGVfZGVmZXJfbG9jayk7CisKKwlsaXN0X2FkZCgmZHJlcS0+cmVjZW50LCAmY2FjaGVfZGVmZXJfbGlzdCk7CisKKwlpZiAoY2FjaGVfZGVmZXJfaGFzaFtoYXNoXS5uZXh0ID09IE5VTEwpCisJCUlOSVRfTElTVF9IRUFEKCZjYWNoZV9kZWZlcl9oYXNoW2hhc2hdKTsKKwlsaXN0X2FkZCgmZHJlcS0+aGFzaCwgJmNhY2hlX2RlZmVyX2hhc2hbaGFzaF0pOworCisJLyogaXQgaXMgaW4sIG5vdyBtYXliZSBjbGVhbiB1cCAqLworCWRyZXEgPSBOVUxMOworCWlmICgrK2NhY2hlX2RlZmVyX2NudCA+IERGUl9NQVgpIHsKKwkJLyogdG9vIG11Y2ggaW4gdGhlIGNhY2hlLCByYW5kb21seSBkcm9wCisJCSAqIGZpcnN0IG9yIGxhc3QKKwkJICovCisJCWlmIChuZXRfcmFuZG9tKCkmMSkgCisJCQlkcmVxID0gbGlzdF9lbnRyeShjYWNoZV9kZWZlcl9saXN0Lm5leHQsCisJCQkJCSAgc3RydWN0IGNhY2hlX2RlZmVycmVkX3JlcSwKKwkJCQkJICByZWNlbnQpOworCQllbHNlCisJCQlkcmVxID0gbGlzdF9lbnRyeShjYWNoZV9kZWZlcl9saXN0LnByZXYsCisJCQkJCSAgc3RydWN0IGNhY2hlX2RlZmVycmVkX3JlcSwKKwkJCQkJICByZWNlbnQpOworCQlsaXN0X2RlbCgmZHJlcS0+cmVjZW50KTsKKwkJbGlzdF9kZWwoJmRyZXEtPmhhc2gpOworCQljYWNoZV9kZWZlcl9jbnQtLTsKKwl9CisJc3Bpbl91bmxvY2soJmNhY2hlX2RlZmVyX2xvY2spOworCisJaWYgKGRyZXEpIHsKKwkJLyogdGhlcmUgd2FzIG9uZSB0b28gbWFueSAqLworCQlkcmVxLT5yZXZpc2l0KGRyZXEsIDEpOworCX0KKwlpZiAodGVzdF9iaXQoQ0FDSEVfVkFMSUQsICZpdGVtLT5mbGFncykpIHsKKwkJLyogbXVzdCBoYXZlIGp1c3QgYmVlbiB2YWxpZGF0ZWQuLi4gKi8KKwkJY2FjaGVfcmV2aXNpdF9yZXF1ZXN0KGl0ZW0pOworCX0KK30KKworc3RhdGljIHZvaWQgY2FjaGVfcmV2aXNpdF9yZXF1ZXN0KHN0cnVjdCBjYWNoZV9oZWFkICppdGVtKQoreworCXN0cnVjdCBjYWNoZV9kZWZlcnJlZF9yZXEgKmRyZXE7CisJc3RydWN0IGxpc3RfaGVhZCBwZW5kaW5nOworCisJc3RydWN0IGxpc3RfaGVhZCAqbHA7CisJaW50IGhhc2ggPSBERlJfSEFTSChpdGVtKTsKKworCUlOSVRfTElTVF9IRUFEKCZwZW5kaW5nKTsKKwlzcGluX2xvY2soJmNhY2hlX2RlZmVyX2xvY2spOworCQorCWxwID0gY2FjaGVfZGVmZXJfaGFzaFtoYXNoXS5uZXh0OworCWlmIChscCkgeworCQl3aGlsZSAobHAgIT0gJmNhY2hlX2RlZmVyX2hhc2hbaGFzaF0pIHsKKwkJCWRyZXEgPSBsaXN0X2VudHJ5KGxwLCBzdHJ1Y3QgY2FjaGVfZGVmZXJyZWRfcmVxLCBoYXNoKTsKKwkJCWxwID0gbHAtPm5leHQ7CisJCQlpZiAoZHJlcS0+aXRlbSA9PSBpdGVtKSB7CisJCQkJbGlzdF9kZWwoJmRyZXEtPmhhc2gpOworCQkJCWxpc3RfbW92ZSgmZHJlcS0+cmVjZW50LCAmcGVuZGluZyk7CisJCQkJY2FjaGVfZGVmZXJfY250LS07CisJCQl9CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmNhY2hlX2RlZmVyX2xvY2spOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZwZW5kaW5nKSkgeworCQlkcmVxID0gbGlzdF9lbnRyeShwZW5kaW5nLm5leHQsIHN0cnVjdCBjYWNoZV9kZWZlcnJlZF9yZXEsIHJlY2VudCk7CisJCWxpc3RfZGVsX2luaXQoJmRyZXEtPnJlY2VudCk7CisJCWRyZXEtPnJldmlzaXQoZHJlcSwgMCk7CisJfQorfQorCit2b2lkIGNhY2hlX2NsZWFuX2RlZmVycmVkKHZvaWQgKm93bmVyKQoreworCXN0cnVjdCBjYWNoZV9kZWZlcnJlZF9yZXEgKmRyZXEsICp0bXA7CisJc3RydWN0IGxpc3RfaGVhZCBwZW5kaW5nOworCisKKwlJTklUX0xJU1RfSEVBRCgmcGVuZGluZyk7CisJc3Bpbl9sb2NrKCZjYWNoZV9kZWZlcl9sb2NrKTsKKwkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZHJlcSwgdG1wLCAmY2FjaGVfZGVmZXJfbGlzdCwgcmVjZW50KSB7CisJCWlmIChkcmVxLT5vd25lciA9PSBvd25lcikgeworCQkJbGlzdF9kZWwoJmRyZXEtPmhhc2gpOworCQkJbGlzdF9tb3ZlKCZkcmVxLT5yZWNlbnQsICZwZW5kaW5nKTsKKwkJCWNhY2hlX2RlZmVyX2NudC0tOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZjYWNoZV9kZWZlcl9sb2NrKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmcGVuZGluZykpIHsKKwkJZHJlcSA9IGxpc3RfZW50cnkocGVuZGluZy5uZXh0LCBzdHJ1Y3QgY2FjaGVfZGVmZXJyZWRfcmVxLCByZWNlbnQpOworCQlsaXN0X2RlbF9pbml0KCZkcmVxLT5yZWNlbnQpOworCQlkcmVxLT5yZXZpc2l0KGRyZXEsIDEpOworCX0KK30KKworLyoKKyAqIGNvbW11bmljYXRlIHdpdGggdXNlci1zcGFjZQorICoKKyAqIFdlIGhhdmUgYSBtYWdpYyAvcHJvYyBmaWxlIC0gL3Byb2Mvc3VucnBjL2NhY2hlCisgKiBPbiByZWFkLCB5b3UgZ2V0IGEgZnVsbCByZXF1ZXN0LCBvciBibG9jaworICogT24gd3JpdGUsIGFuIHVwZGF0ZSByZXF1ZXN0IGlzIHByb2Nlc3NlZAorICogUG9sbCB3b3JrcyBpZiBhbnl0aGluZyB0byByZWFkLCBhbmQgYWx3YXlzIGFsbG93cyB3cml0ZQorICoKKyAqIEltcGxlbWVudGVkIGJ5IGxpbmtlZCBsaXN0IG9mIHJlcXVlc3RzLiAgRWFjaCBvcGVuIGZpbGUgaGFzIAorICogYSAtPnByaXZhdGUgdGhhdCBhbHNvIGV4aXN0cyBpbiB0aGlzIGxpc3QuICBOZXcgcmVxdWVzdCBhcmUgYWRkZWQKKyAqIHRvIHRoZSBlbmQgYW5kIG1heSB3YWtldXAgYW5kIHByZWNlZGluZyByZWFkZXJzLgorICogTmV3IHJlYWRlcnMgYXJlIGFkZGVkIHRvIHRoZSBoZWFkLiAgSWYsIG9uIHJlYWQsIGFuIGl0ZW0gaXMgZm91bmQgd2l0aAorICogQ0FDSEVfVVBDQUxMSU5HIGNsZWFyLCB3ZSBmcmVlIGl0IGZyb20gdGhlIGxpc3QuCisgKgorICovCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socXVldWVfbG9jayk7CitzdGF0aWMgREVDTEFSRV9NVVRFWChxdWV1ZV9pb19zZW0pOworCitzdHJ1Y3QgY2FjaGVfcXVldWUgeworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwlpbnQJCQlyZWFkZXI7CS8qIGlmIDAsIHRoZW4gcmVxdWVzdCAqLworfTsKK3N0cnVjdCBjYWNoZV9yZXF1ZXN0IHsKKwlzdHJ1Y3QgY2FjaGVfcXVldWUJcTsKKwlzdHJ1Y3QgY2FjaGVfaGVhZAkqaXRlbTsKKwljaGFyCQkJKiBidWY7CisJaW50CQkJbGVuOworCWludAkJCXJlYWRlcnM7Cit9Oworc3RydWN0IGNhY2hlX3JlYWRlciB7CisJc3RydWN0IGNhY2hlX3F1ZXVlCXE7CisJaW50CQkJb2Zmc2V0OwkvKiBpZiBub24tMCwgd2UgaGF2ZSBhIHJlZmNudCBvbiBuZXh0IHJlcXVlc3QgKi8KK307CisKK3N0YXRpYyBzc2l6ZV90CitjYWNoZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgY2FjaGVfcmVhZGVyICpycCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY2FjaGVfcmVxdWVzdCAqcnE7CisJc3RydWN0IGNhY2hlX2RldGFpbCAqY2QgPSBQREUoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpLT5kYXRhOworCWludCBlcnI7CisKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZxdWV1ZV9pb19zZW0pOyAvKiBwcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgY29uY3VycmVudAorCQkJICAgICAgKiByZWFkZXJzIG9uIHRoaXMgZmlsZSAqLworIGFnYWluOgorCXNwaW5fbG9jaygmcXVldWVfbG9jayk7CisJLyogbmVlZCB0byBmaW5kIG5leHQgcmVxdWVzdCAqLworCXdoaWxlIChycC0+cS5saXN0Lm5leHQgIT0gJmNkLT5xdWV1ZSAmJgorCSAgICAgICBsaXN0X2VudHJ5KHJwLT5xLmxpc3QubmV4dCwgc3RydWN0IGNhY2hlX3F1ZXVlLCBsaXN0KQorCSAgICAgICAtPnJlYWRlcikgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0ID0gcnAtPnEubGlzdC5uZXh0OworCQlsaXN0X21vdmUoJnJwLT5xLmxpc3QsIG5leHQpOworCX0KKwlpZiAocnAtPnEubGlzdC5uZXh0ID09ICZjZC0+cXVldWUpIHsKKwkJc3Bpbl91bmxvY2soJnF1ZXVlX2xvY2spOworCQl1cCgmcXVldWVfaW9fc2VtKTsKKwkJaWYgKHJwLT5vZmZzZXQpCisJCQlCVUcoKTsKKwkJcmV0dXJuIDA7CisJfQorCXJxID0gY29udGFpbmVyX29mKHJwLT5xLmxpc3QubmV4dCwgc3RydWN0IGNhY2hlX3JlcXVlc3QsIHEubGlzdCk7CisJaWYgKHJxLT5xLnJlYWRlcikgQlVHKCk7CisJaWYgKHJwLT5vZmZzZXQgPT0gMCkKKwkJcnEtPnJlYWRlcnMrKzsKKwlzcGluX3VubG9jaygmcXVldWVfbG9jayk7CisKKwlpZiAocnAtPm9mZnNldCA9PSAwICYmICF0ZXN0X2JpdChDQUNIRV9QRU5ESU5HLCAmcnEtPml0ZW0tPmZsYWdzKSkgeworCQllcnIgPSAtRUFHQUlOOworCQlzcGluX2xvY2soJnF1ZXVlX2xvY2spOworCQlsaXN0X21vdmUoJnJwLT5xLmxpc3QsICZycS0+cS5saXN0KTsKKwkJc3Bpbl91bmxvY2soJnF1ZXVlX2xvY2spOworCX0gZWxzZSB7CisJCWlmIChycC0+b2Zmc2V0ICsgY291bnQgPiBycS0+bGVuKQorCQkJY291bnQgPSBycS0+bGVuIC0gcnAtPm9mZnNldDsKKwkJZXJyID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsIHJxLT5idWYgKyBycC0+b2Zmc2V0LCBjb3VudCkpCisJCQlnb3RvIG91dDsKKwkJcnAtPm9mZnNldCArPSBjb3VudDsKKwkJaWYgKHJwLT5vZmZzZXQgPj0gcnEtPmxlbikgeworCQkJcnAtPm9mZnNldCA9IDA7CisJCQlzcGluX2xvY2soJnF1ZXVlX2xvY2spOworCQkJbGlzdF9tb3ZlKCZycC0+cS5saXN0LCAmcnEtPnEubGlzdCk7CisJCQlzcGluX3VubG9jaygmcXVldWVfbG9jayk7CisJCX0KKwkJZXJyID0gMDsKKwl9Cisgb3V0OgorCWlmIChycC0+b2Zmc2V0ID09IDApIHsKKwkJLyogbmVlZCB0byByZWxlYXNlIHJxICovCisJCXNwaW5fbG9jaygmcXVldWVfbG9jayk7CisJCXJxLT5yZWFkZXJzLS07CisJCWlmIChycS0+cmVhZGVycyA9PSAwICYmCisJCSAgICAhdGVzdF9iaXQoQ0FDSEVfUEVORElORywgJnJxLT5pdGVtLT5mbGFncykpIHsKKwkJCWxpc3RfZGVsKCZycS0+cS5saXN0KTsKKwkJCXNwaW5fdW5sb2NrKCZxdWV1ZV9sb2NrKTsKKwkJCWNkLT5jYWNoZV9wdXQocnEtPml0ZW0sIGNkKTsKKwkJCWtmcmVlKHJxLT5idWYpOworCQkJa2ZyZWUocnEpOworCQl9IGVsc2UKKwkJCXNwaW5fdW5sb2NrKCZxdWV1ZV9sb2NrKTsKKwl9CisJaWYgKGVyciA9PSAtRUFHQUlOKQorCQlnb3RvIGFnYWluOworCXVwKCZxdWV1ZV9pb19zZW0pOworCXJldHVybiBlcnIgPyBlcnIgOiAgY291bnQ7Cit9CisKK3N0YXRpYyBjaGFyIHdyaXRlX2J1Zls4MTkyXTsgLyogcHJvdGVjdGVkIGJ5IHF1ZXVlX2lvX3NlbSAqLworCitzdGF0aWMgc3NpemVfdAorY2FjaGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkgICAgbG9mZl90ICpwcG9zKQoreworCWludCBlcnI7CisJc3RydWN0IGNhY2hlX2RldGFpbCAqY2QgPSBQREUoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpLT5kYXRhOworCisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAwOworCWlmIChjb3VudCA+PSBzaXplb2Yod3JpdGVfYnVmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkb3duKCZxdWV1ZV9pb19zZW0pOworCisJaWYgKGNvcHlfZnJvbV91c2VyKHdyaXRlX2J1ZiwgYnVmLCBjb3VudCkpIHsKKwkJdXAoJnF1ZXVlX2lvX3NlbSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwl3cml0ZV9idWZbY291bnRdID0gJ1wwJzsKKwlpZiAoY2QtPmNhY2hlX3BhcnNlKQorCQllcnIgPSBjZC0+Y2FjaGVfcGFyc2UoY2QsIHdyaXRlX2J1ZiwgY291bnQpOworCWVsc2UKKwkJZXJyID0gLUVJTlZBTDsKKworCXVwKCZxdWV1ZV9pb19zZW0pOworCXJldHVybiBlcnIgPyBlcnIgOiBjb3VudDsKK30KKworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHF1ZXVlX3dhaXQpOworCitzdGF0aWMgdW5zaWduZWQgaW50CitjYWNoZV9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXVuc2lnbmVkIGludCBtYXNrOworCXN0cnVjdCBjYWNoZV9yZWFkZXIgKnJwID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjYWNoZV9xdWV1ZSAqY3E7CisJc3RydWN0IGNhY2hlX2RldGFpbCAqY2QgPSBQREUoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpLT5kYXRhOworCisJcG9sbF93YWl0KGZpbHAsICZxdWV1ZV93YWl0LCB3YWl0KTsKKworCS8qIGFsd2F5IGFsbG93IHdyaXRlICovCisJbWFzayA9IFBPTExfT1VUIHwgUE9MTFdSTk9STTsKKworCWlmICghcnApCisJCXJldHVybiBtYXNrOworCisJc3Bpbl9sb2NrKCZxdWV1ZV9sb2NrKTsKKworCWZvciAoY3E9ICZycC0+cTsgJmNxLT5saXN0ICE9ICZjZC0+cXVldWU7CisJICAgICBjcSA9IGxpc3RfZW50cnkoY3EtPmxpc3QubmV4dCwgc3RydWN0IGNhY2hlX3F1ZXVlLCBsaXN0KSkKKwkJaWYgKCFjcS0+cmVhZGVyKSB7CisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJCQlicmVhazsKKwkJfQorCXNwaW5fdW5sb2NrKCZxdWV1ZV9sb2NrKTsKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludAorY2FjaGVfaW9jdGwoc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBmaWxlICpmaWxwLAorCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgbGVuID0gMDsKKwlzdHJ1Y3QgY2FjaGVfcmVhZGVyICpycCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY2FjaGVfcXVldWUgKmNxOworCXN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkID0gUERFKGlubyktPmRhdGE7CisKKwlpZiAoY21kICE9IEZJT05SRUFEIHx8ICFycCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2soJnF1ZXVlX2xvY2spOworCisJLyogb25seSBmaW5kIHRoZSBsZW5ndGggcmVtYWluaW5nIGluIGN1cnJlbnQgcmVxdWVzdCwKKwkgKiBvciB0aGUgbGVuZ3RoIG9mIHRoZSBuZXh0IHJlcXVlc3QKKwkgKi8KKwlmb3IgKGNxPSAmcnAtPnE7ICZjcS0+bGlzdCAhPSAmY2QtPnF1ZXVlOworCSAgICAgY3EgPSBsaXN0X2VudHJ5KGNxLT5saXN0Lm5leHQsIHN0cnVjdCBjYWNoZV9xdWV1ZSwgbGlzdCkpCisJCWlmICghY3EtPnJlYWRlcikgeworCQkJc3RydWN0IGNhY2hlX3JlcXVlc3QgKmNyID0KKwkJCQljb250YWluZXJfb2YoY3EsIHN0cnVjdCBjYWNoZV9yZXF1ZXN0LCBxKTsKKwkJCWxlbiA9IGNyLT5sZW4gLSBycC0+b2Zmc2V0OworCQkJYnJlYWs7CisJCX0KKwlzcGluX3VubG9jaygmcXVldWVfbG9jayk7CisKKwlyZXR1cm4gcHV0X3VzZXIobGVuLCAoaW50IF9fdXNlciAqKWFyZyk7Cit9CisKK3N0YXRpYyBpbnQKK2NhY2hlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGNhY2hlX3JlYWRlciAqcnAgPSBOVUxMOworCisJbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlscCk7CisJaWYgKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJc3RydWN0IGNhY2hlX2RldGFpbCAqY2QgPSBQREUoaW5vZGUpLT5kYXRhOworCisJCXJwID0ga21hbGxvYyhzaXplb2YoKnJwKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcnApCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJcnAtPm9mZnNldCA9IDA7CisJCXJwLT5xLnJlYWRlciA9IDE7CisJCWF0b21pY19pbmMoJmNkLT5yZWFkZXJzKTsKKwkJc3Bpbl9sb2NrKCZxdWV1ZV9sb2NrKTsKKwkJbGlzdF9hZGQoJnJwLT5xLmxpc3QsICZjZC0+cXVldWUpOworCQlzcGluX3VubG9jaygmcXVldWVfbG9jayk7CisJfQorCWZpbHAtPnByaXZhdGVfZGF0YSA9IHJwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitjYWNoZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBjYWNoZV9yZWFkZXIgKnJwID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkID0gUERFKGlub2RlKS0+ZGF0YTsKKworCWlmIChycCkgeworCQlzcGluX2xvY2soJnF1ZXVlX2xvY2spOworCQlpZiAocnAtPm9mZnNldCkgeworCQkJc3RydWN0IGNhY2hlX3F1ZXVlICpjcTsKKwkJCWZvciAoY3E9ICZycC0+cTsgJmNxLT5saXN0ICE9ICZjZC0+cXVldWU7CisJCQkgICAgIGNxID0gbGlzdF9lbnRyeShjcS0+bGlzdC5uZXh0LCBzdHJ1Y3QgY2FjaGVfcXVldWUsIGxpc3QpKQorCQkJCWlmICghY3EtPnJlYWRlcikgeworCQkJCQljb250YWluZXJfb2YoY3EsIHN0cnVjdCBjYWNoZV9yZXF1ZXN0LCBxKQorCQkJCQkJLT5yZWFkZXJzLS07CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCXJwLT5vZmZzZXQgPSAwOworCQl9CisJCWxpc3RfZGVsKCZycC0+cS5saXN0KTsKKwkJc3Bpbl91bmxvY2soJnF1ZXVlX2xvY2spOworCisJCWZpbHAtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJCWtmcmVlKHJwKTsKKworCQljZC0+bGFzdF9jbG9zZSA9IGdldF9zZWNvbmRzKCk7CisJCWF0b21pY19kZWMoJmNkLT5yZWFkZXJzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjYWNoZV9maWxlX29wZXJhdGlvbnMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IGNhY2hlX3JlYWQsCisJLndyaXRlCQk9IGNhY2hlX3dyaXRlLAorCS5wb2xsCQk9IGNhY2hlX3BvbGwsCisJLmlvY3RsCQk9IGNhY2hlX2lvY3RsLCAvKiBmb3IgRklPTlJFQUQgKi8KKwkub3BlbgkJPSBjYWNoZV9vcGVuLAorCS5yZWxlYXNlCT0gY2FjaGVfcmVsZWFzZSwKK307CisKKworc3RhdGljIHZvaWQgcXVldWVfbG9vc2Uoc3RydWN0IGNhY2hlX2RldGFpbCAqZGV0YWlsLCBzdHJ1Y3QgY2FjaGVfaGVhZCAqY2gpCit7CisJc3RydWN0IGNhY2hlX3F1ZXVlICpjcTsKKwlzcGluX2xvY2soJnF1ZXVlX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3EsICZkZXRhaWwtPnF1ZXVlLCBsaXN0KQorCQlpZiAoIWNxLT5yZWFkZXIpIHsKKwkJCXN0cnVjdCBjYWNoZV9yZXF1ZXN0ICpjciA9IGNvbnRhaW5lcl9vZihjcSwgc3RydWN0IGNhY2hlX3JlcXVlc3QsIHEpOworCQkJaWYgKGNyLT5pdGVtICE9IGNoKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGNyLT5yZWFkZXJzICE9IDApCisJCQkJYnJlYWs7CisJCQlsaXN0X2RlbCgmY3ItPnEubGlzdCk7CisJCQlzcGluX3VubG9jaygmcXVldWVfbG9jayk7CisJCQlkZXRhaWwtPmNhY2hlX3B1dChjci0+aXRlbSwgZGV0YWlsKTsKKwkJCWtmcmVlKGNyLT5idWYpOworCQkJa2ZyZWUoY3IpOworCQkJcmV0dXJuOworCQl9CisJc3Bpbl91bmxvY2soJnF1ZXVlX2xvY2spOworfQorCisvKgorICogU3VwcG9ydCByb3V0aW5lcyBmb3IgdGV4dC1iYXNlZCB1cGNhbGxzLgorICogRmllbGRzIGFyZSBzZXBhcmF0ZWQgYnkgc3BhY2VzLgorICogRmllbGRzIGFyZSBlaXRoZXIgbWFuZ2xlZCB0byBxdW90ZSBzcGFjZSB0YWIgbmV3bGluZSBzbG9zaCB3aXRoIHNsb3NoCisgKiBvciBhIGhleGlmaWVkIHdpdGggYSBsZWFkaW5nIFx4CisgKiBSZWNvcmQgaXMgdGVybWluYXRlZCB3aXRoIG5ld2xpbmUuCisgKgorICovCisKK3ZvaWQgcXdvcmRfYWRkKGNoYXIgKipicHAsIGludCAqbHAsIGNoYXIgKnN0cikKK3sKKwljaGFyICpicCA9ICpicHA7CisJaW50IGxlbiA9ICpscDsKKwljaGFyIGM7CisKKwlpZiAobGVuIDwgMCkgcmV0dXJuOworCisJd2hpbGUgKChjPSpzdHIrKykgJiYgbGVuKQorCQlzd2l0Y2goYykgeworCQljYXNlICcgJzoKKwkJY2FzZSAnXHQnOgorCQljYXNlICdcbic6CisJCWNhc2UgJ1xcJzoKKwkJCWlmIChsZW4gPj0gNCkgeworCQkJCSpicCsrID0gJ1xcJzsKKwkJCQkqYnArKyA9ICcwJyArICgoYyAmIDAzMDApPj42KTsKKwkJCQkqYnArKyA9ICcwJyArICgoYyAmIDAwNzApPj4zKTsKKwkJCQkqYnArKyA9ICcwJyArICgoYyAmIDAwMDcpPj4wKTsKKwkJCX0KKwkJCWxlbiAtPSA0OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkqYnArKyA9IGM7CisJCQlsZW4tLTsKKwkJfQorCWlmIChjIHx8IGxlbiA8MSkgbGVuID0gLTE7CisJZWxzZSB7CisJCSpicCsrID0gJyAnOworCQlsZW4tLTsKKwl9CisJKmJwcCA9IGJwOworCSpscCA9IGxlbjsKK30KKwordm9pZCBxd29yZF9hZGRoZXgoY2hhciAqKmJwcCwgaW50ICpscCwgY2hhciAqYnVmLCBpbnQgYmxlbikKK3sKKwljaGFyICpicCA9ICpicHA7CisJaW50IGxlbiA9ICpscDsKKworCWlmIChsZW4gPCAwKSByZXR1cm47CisKKwlpZiAobGVuID4gMikgeworCQkqYnArKyA9ICdcXCc7CisJCSpicCsrID0gJ3gnOworCQlsZW4gLT0gMjsKKwkJd2hpbGUgKGJsZW4gJiYgbGVuID49IDIpIHsKKwkJCXVuc2lnbmVkIGNoYXIgYyA9ICpidWYrKzsKKwkJCSpicCsrID0gJzAnICsgKChjJjB4ZjApPj40KSArIChjPj0weGEwKSooJ2EnLSc5Jy0xKTsKKwkJCSpicCsrID0gJzAnICsgKGMmMHgwZikgKyAoKGMmMHgwZik+PTB4MGEpKignYSctJzknLTEpOworCQkJbGVuIC09IDI7CisJCQlibGVuLS07CisJCX0KKwl9CisJaWYgKGJsZW4gfHwgbGVuPDEpIGxlbiA9IC0xOworCWVsc2UgeworCQkqYnArKyA9ICcgJzsKKwkJbGVuLS07CisJfQorCSpicHAgPSBicDsKKwkqbHAgPSBsZW47Cit9CisKK3N0YXRpYyB2b2lkIHdhcm5fbm9fbGlzdGVuZXIoc3RydWN0IGNhY2hlX2RldGFpbCAqZGV0YWlsKQoreworCWlmIChkZXRhaWwtPmxhc3Rfd2FybiAhPSBkZXRhaWwtPmxhc3RfY2xvc2UpIHsKKwkJZGV0YWlsLT5sYXN0X3dhcm4gPSBkZXRhaWwtPmxhc3RfY2xvc2U7CisJCWlmIChkZXRhaWwtPndhcm5fbm9fbGlzdGVuZXIpCisJCQlkZXRhaWwtPndhcm5fbm9fbGlzdGVuZXIoZGV0YWlsKTsKKwl9Cit9CisKKy8qCisgKiByZWdpc3RlciBhbiB1cGNhbGwgcmVxdWVzdCB0byB1c2VyLXNwYWNlLgorICogRWFjaCByZXF1ZXN0IGlzIGF0IG1vc3Qgb25lIHBhZ2UgbG9uZy4KKyAqLworc3RhdGljIGludCBjYWNoZV9tYWtlX3VwY2FsbChzdHJ1Y3QgY2FjaGVfZGV0YWlsICpkZXRhaWwsIHN0cnVjdCBjYWNoZV9oZWFkICpoKQoreworCisJY2hhciAqYnVmOworCXN0cnVjdCBjYWNoZV9yZXF1ZXN0ICpjcnE7CisJY2hhciAqYnA7CisJaW50IGxlbjsKKworCWlmIChkZXRhaWwtPmNhY2hlX3JlcXVlc3QgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYXRvbWljX3JlYWQoJmRldGFpbC0+cmVhZGVycykgPT0gMCAmJgorCSAgICBkZXRhaWwtPmxhc3RfY2xvc2UgPCBnZXRfc2Vjb25kcygpIC0gMzApIHsKKwkJCXdhcm5fbm9fbGlzdGVuZXIoZGV0YWlsKTsKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJ1ZiA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FQUdBSU47CisKKwljcnEgPSBrbWFsbG9jKHNpemVvZiAoKmNycSksIEdGUF9LRVJORUwpOworCWlmICghY3JxKSB7CisJCWtmcmVlKGJ1Zik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWJwID0gYnVmOyBsZW4gPSBQQUdFX1NJWkU7CisKKwlkZXRhaWwtPmNhY2hlX3JlcXVlc3QoZGV0YWlsLCBoLCAmYnAsICZsZW4pOworCisJaWYgKGxlbiA8IDApIHsKKwkJa2ZyZWUoYnVmKTsKKwkJa2ZyZWUoY3JxKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCWNycS0+cS5yZWFkZXIgPSAwOworCWNycS0+aXRlbSA9IGNhY2hlX2dldChoKTsKKwljcnEtPmJ1ZiA9IGJ1ZjsKKwljcnEtPmxlbiA9IFBBR0VfU0laRSAtIGxlbjsKKwljcnEtPnJlYWRlcnMgPSAwOworCXNwaW5fbG9jaygmcXVldWVfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmY3JxLT5xLmxpc3QsICZkZXRhaWwtPnF1ZXVlKTsKKwlzcGluX3VubG9jaygmcXVldWVfbG9jayk7CisJd2FrZV91cCgmcXVldWVfd2FpdCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwYXJzZSBhIG1lc3NhZ2UgZnJvbSB1c2VyLXNwYWNlIGFuZCBwYXNzIGl0CisgKiB0byBhbiBhcHByb3ByaWF0ZSBjYWNoZQorICogTWVzc2FnZXMgYXJlLCBsaWtlIHJlcXVlc3RzLCBzZXBhcmF0ZWQgaW50byBmaWVsZHMgYnkKKyAqIHNwYWNlcyBhbmQgZGVxdW90ZXMgYXMgXHhIRVhTVFJJTkcgb3IgZW1iZWRkZWQgXG5ubiBvY3RhbAorICoKKyAqIE1lc3NhZ2UgaXMgCisgKiAgIHJlcGx5IGNhY2hlbmFtZSBleHBpcnkga2V5IC4uLiBjb250ZW50Li4uLgorICoKKyAqIGtleSBhbmQgY29udGVudCBhcmUgYm90aCBwYXJzZWQgYnkgY2FjaGUgCisgKi8KKworI2RlZmluZSBpc29kaWdpdChjKSAoaXNkaWdpdChjKSAmJiBjIDw9ICc3JykKK2ludCBxd29yZF9nZXQoY2hhciAqKmJwcCwgY2hhciAqZGVzdCwgaW50IGJ1ZnNpemUpCit7CisJLyogcmV0dXJuIGJ5dGVzIGNvcGllZCwgb3IgLTEgb24gZXJyb3IgKi8KKwljaGFyICpicCA9ICpicHA7CisJaW50IGxlbiA9IDA7CisKKwl3aGlsZSAoKmJwID09ICcgJykgYnArKzsKKworCWlmIChicFswXSA9PSAnXFwnICYmIGJwWzFdID09ICd4JykgeworCQkvKiBIRVggU1RSSU5HICovCisJCWJwICs9IDI7CisJCXdoaWxlIChpc3hkaWdpdChicFswXSkgJiYgaXN4ZGlnaXQoYnBbMV0pICYmIGxlbiA8IGJ1ZnNpemUpIHsKKwkJCWludCBieXRlID0gaXNkaWdpdCgqYnApID8gKmJwLScwJyA6IHRvdXBwZXIoKmJwKS0nQScrMTA7CisJCQlicCsrOworCQkJYnl0ZSA8PD0gNDsKKwkJCWJ5dGUgfD0gaXNkaWdpdCgqYnApID8gKmJwLScwJyA6IHRvdXBwZXIoKmJwKS0nQScrMTA7CisJCQkqZGVzdCsrID0gYnl0ZTsKKwkJCWJwKys7CisJCQlsZW4rKzsKKwkJfQorCX0gZWxzZSB7CisJCS8qIHRleHQgd2l0aCBcbm5uIG9jdGFsIHF1b3RpbmcgKi8KKwkJd2hpbGUgKCpicCAhPSAnICcgJiYgKmJwICE9ICdcbicgJiYgKmJwICYmIGxlbiA8IGJ1ZnNpemUtMSkgeworCQkJaWYgKCpicCA9PSAnXFwnICYmCisJCQkgICAgaXNvZGlnaXQoYnBbMV0pICYmIChicFsxXSA8PSAnMycpICYmCisJCQkgICAgaXNvZGlnaXQoYnBbMl0pICYmCisJCQkgICAgaXNvZGlnaXQoYnBbM10pKSB7CisJCQkJaW50IGJ5dGUgPSAoKisrYnAgLScwJyk7CisJCQkJYnArKzsKKwkJCQlieXRlID0gKGJ5dGUgPDwgMykgfCAoKmJwKysgLSAnMCcpOworCQkJCWJ5dGUgPSAoYnl0ZSA8PCAzKSB8ICgqYnArKyAtICcwJyk7CisJCQkJKmRlc3QrKyA9IGJ5dGU7CisJCQkJbGVuKys7CisJCQl9IGVsc2UgeworCQkJCSpkZXN0KysgPSAqYnArKzsKKwkJCQlsZW4rKzsKKwkJCX0KKwkJfQorCX0KKworCWlmICgqYnAgIT0gJyAnICYmICpicCAhPSAnXG4nICYmICpicCAhPSAnXDAnKQorCQlyZXR1cm4gLTE7CisJd2hpbGUgKCpicCA9PSAnICcpIGJwKys7CisJKmJwcCA9IGJwOworCSpkZXN0ID0gJ1wwJzsKKwlyZXR1cm4gbGVuOworfQorCisKKy8qCisgKiBzdXBwb3J0IC9wcm9jL3N1bnJwYy9jYWNoZS8kQ0FDSEVOQU1FL2NvbnRlbnQKKyAqIGFzIGEgc2VxZmlsZS4KKyAqIFdlIGNhbGwgLT5jYWNoZV9zaG93IHBhc3NpbmcgTlVMTCBmb3IgdGhlIGl0ZW0gdG8KKyAqIGdldCBhIGhlYWRlciwgdGhlbiBwYXNzIGVhY2ggcmVhbCBpdGVtIGluIHRoZSBjYWNoZQorICovCisKK3N0cnVjdCBoYW5kbGUgeworCXN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkOworfTsKKworc3RhdGljIHZvaWQgKmNfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKK3sKKwlsb2ZmX3QgbiA9ICpwb3M7CisJdW5zaWduZWQgaGFzaCwgZW50cnk7CisJc3RydWN0IGNhY2hlX2hlYWQgKmNoOworCXN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkID0gKChzdHJ1Y3QgaGFuZGxlKiltLT5wcml2YXRlKS0+Y2Q7CisJCisKKwlyZWFkX2xvY2soJmNkLT5oYXNoX2xvY2spOworCWlmICghbi0tKQorCQlyZXR1cm4gU0VRX1NUQVJUX1RPS0VOOworCWhhc2ggPSBuID4+IDMyOworCWVudHJ5ID0gbiAmICgoMUxMPDwzMikgLSAxKTsKKworCWZvciAoY2g9Y2QtPmhhc2hfdGFibGVbaGFzaF07IGNoOyBjaD1jaC0+bmV4dCkKKwkJaWYgKCFlbnRyeS0tKQorCQkJcmV0dXJuIGNoOworCW4gJj0gfigoMUxMPDwzMikgLSAxKTsKKwlkbyB7CisJCWhhc2grKzsKKwkJbiArPSAxTEw8PDMyOworCX0gd2hpbGUoaGFzaCA8IGNkLT5oYXNoX3NpemUgJiYgCisJCWNkLT5oYXNoX3RhYmxlW2hhc2hdPT1OVUxMKTsKKwlpZiAoaGFzaCA+PSBjZC0+aGFzaF9zaXplKQorCQlyZXR1cm4gTlVMTDsKKwkqcG9zID0gbisxOworCXJldHVybiBjZC0+aGFzaF90YWJsZVtoYXNoXTsKK30KKworc3RhdGljIHZvaWQgKmNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnAsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBjYWNoZV9oZWFkICpjaCA9IHA7CisJaW50IGhhc2ggPSAoKnBvcyA+PiAzMik7CisJc3RydWN0IGNhY2hlX2RldGFpbCAqY2QgPSAoKHN0cnVjdCBoYW5kbGUqKW0tPnByaXZhdGUpLT5jZDsKKworCWlmIChwID09IFNFUV9TVEFSVF9UT0tFTikKKwkJaGFzaCA9IDA7CisJZWxzZSBpZiAoY2gtPm5leHQgPT0gTlVMTCkgeworCQloYXNoKys7CisJCSpwb3MgKz0gMUxMPDwzMjsKKwl9IGVsc2UgeworCQkrKypwb3M7CisJCXJldHVybiBjaC0+bmV4dDsKKwl9CisJKnBvcyAmPSB+KCgxTEw8PDMyKSAtIDEpOworCXdoaWxlIChoYXNoIDwgY2QtPmhhc2hfc2l6ZSAmJgorCSAgICAgICBjZC0+aGFzaF90YWJsZVtoYXNoXSA9PSBOVUxMKSB7CisJCWhhc2grKzsKKwkJKnBvcyArPSAxTEw8PDMyOworCX0KKwlpZiAoaGFzaCA+PSBjZC0+aGFzaF9zaXplKQorCQlyZXR1cm4gTlVMTDsKKwkrKypwb3M7CisJcmV0dXJuIGNkLT5oYXNoX3RhYmxlW2hhc2hdOworfQorCitzdGF0aWMgdm9pZCBjX3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQoreworCXN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkID0gKChzdHJ1Y3QgaGFuZGxlKiltLT5wcml2YXRlKS0+Y2Q7CisJcmVhZF91bmxvY2soJmNkLT5oYXNoX2xvY2spOworfQorCitzdGF0aWMgaW50IGNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnApCit7CisJc3RydWN0IGNhY2hlX2hlYWQgKmNwID0gcDsKKwlzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCA9ICgoc3RydWN0IGhhbmRsZSopbS0+cHJpdmF0ZSktPmNkOworCisJaWYgKHAgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlyZXR1cm4gY2QtPmNhY2hlX3Nob3cobSwgY2QsIE5VTEwpOworCisJaWZkZWJ1ZyhDQUNIRSkKKwkJc2VxX3ByaW50ZihtLCAiIyBleHBpcnk9JWxkIHJlZmNudD0lZFxuIiwKKwkJCSAgIGNwLT5leHBpcnlfdGltZSwgYXRvbWljX3JlYWQoJmNwLT5yZWZjbnQpKTsKKwljYWNoZV9nZXQoY3ApOworCWlmIChjYWNoZV9jaGVjayhjZCwgY3AsIE5VTEwpKQorCQkvKiBjYWNoZV9jaGVjayBkb2VzIGEgY2FjaGVfcHV0IG9uIGZhaWx1cmUgKi8KKwkJc2VxX3ByaW50ZihtLCAiIyAiKTsKKwllbHNlCisJCWNhY2hlX3B1dChjcCwgY2QpOworCisJcmV0dXJuIGNkLT5jYWNoZV9zaG93KG0sIGNkLCBjcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgY2FjaGVfY29udGVudF9vcCA9IHsKKwkuc3RhcnQJPSBjX3N0YXJ0LAorCS5uZXh0CT0gY19uZXh0LAorCS5zdG9wCT0gY19zdG9wLAorCS5zaG93CT0gY19zaG93LAorfTsKKworc3RhdGljIGludCBjb250ZW50X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJlczsKKwlzdHJ1Y3QgaGFuZGxlICpoYW47CisJc3RydWN0IGNhY2hlX2RldGFpbCAqY2QgPSBQREUoaW5vZGUpLT5kYXRhOworCisJaGFuID0ga21hbGxvYyhzaXplb2YoKmhhbiksIEdGUF9LRVJORUwpOworCWlmIChoYW4gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwloYW4tPmNkID0gY2Q7CisKKwlyZXMgPSBzZXFfb3BlbihmaWxlLCAmY2FjaGVfY29udGVudF9vcCk7CisJaWYgKHJlcykKKwkJa2ZyZWUoaGFuKTsKKwllbHNlCisJCSgoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhKS0+cHJpdmF0ZSA9IGhhbjsKKworCXJldHVybiByZXM7Cit9CitzdGF0aWMgaW50IGNvbnRlbnRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBoYW5kbGUgKmhhbiA9IG0tPnByaXZhdGU7CisJa2ZyZWUoaGFuKTsKKwltLT5wcml2YXRlID0gTlVMTDsKKwlyZXR1cm4gc2VxX3JlbGVhc2UoaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjb250ZW50X2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBjb250ZW50X29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBjb250ZW50X3JlbGVhc2UsCit9OworCitzdGF0aWMgc3NpemVfdCByZWFkX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkID0gUERFKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKS0+ZGF0YTsKKwljaGFyIHRidWZbMjBdOworCXVuc2lnbmVkIGxvbmcgcCA9ICpwcG9zOworCWludCBsZW47CisKKwlzcHJpbnRmKHRidWYsICIlbHVcbiIsIGNkLT5mbHVzaF90aW1lKTsKKwlsZW4gPSBzdHJsZW4odGJ1Zik7CisJaWYgKHAgPj0gbGVuKQorCQlyZXR1cm4gMDsKKwlsZW4gLT0gcDsKKwlpZiAobGVuID4gY291bnQpIGxlbiA9IGNvdW50OworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAodm9pZCopKHRidWYrcCksIGxlbikpCisJCWxlbiA9IC1FRkFVTFQ7CisJZWxzZQorCQkqcHBvcyArPSBsZW47CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3Qgd3JpdGVfZmx1c2goc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGNhY2hlX2RldGFpbCAqY2QgPSBQREUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpLT5kYXRhOworCWNoYXIgdGJ1ZlsyMF07CisJY2hhciAqZXA7CisJbG9uZyBmbHVzaHRpbWU7CisJaWYgKCpwcG9zIHx8IGNvdW50ID4gc2l6ZW9mKHRidWYpLTEpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjb3B5X2Zyb21fdXNlcih0YnVmLCBidWYsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJdGJ1Zltjb3VudF0gPSAwOworCWZsdXNodGltZSA9IHNpbXBsZV9zdHJ0b3VsKHRidWYsICZlcCwgMCk7CisJaWYgKCplcCAmJiAqZXAgIT0gJ1xuJykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljZC0+Zmx1c2hfdGltZSA9IGZsdXNodGltZTsKKwljZC0+bmV4dGNoZWNrID0gZ2V0X3NlY29uZHMoKTsKKwljYWNoZV9mbHVzaCgpOworCisJKnBwb3MgKz0gY291bnQ7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjYWNoZV9mbHVzaF9vcGVyYXRpb25zID0geworCS5vcGVuCQk9IG5vbnNlZWthYmxlX29wZW4sCisJLnJlYWQJCT0gcmVhZF9mbHVzaCwKKwkud3JpdGUJCT0gd3JpdGVfZmx1c2gsCit9OwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9jbG50LmMgYi9uZXQvc3VucnBjL2NsbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmJjMDI5Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3N1bnJwYy9jbG50LmMKQEAgLTAsMCArMSwxMDg1IEBACisvKgorICogIGxpbnV4L25ldC9zdW5ycGMvcnBjY2xudC5jCisgKgorICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaGlnaC1sZXZlbCBSUEMgaW50ZXJmYWNlLgorICogIEl0IGlzIG1vZGVsZWQgYXMgYSBmaW5pdGUgc3RhdGUgbWFjaGluZSB0byBzdXBwb3J0IGJvdGggc3luY2hyb25vdXMKKyAqICBhbmQgYXN5bmNocm9ub3VzIHJlcXVlc3RzLgorICoKKyAqICAtCVJQQyBoZWFkZXIgZ2VuZXJhdGlvbiBhbmQgYXJndW1lbnQgc2VyaWFsaXphdGlvbi4KKyAqICAtCUNyZWRlbnRpYWwgcmVmcmVzaC4KKyAqICAtCVRDUCBjb25uZWN0IGhhbmRsaW5nLgorICogIC0JUmV0cnkgb2Ygb3BlcmF0aW9uIHdoZW4gaXQgaXMgc3VzcGVjdGVkIHRoZSBvcGVyYXRpb24gZmFpbGVkIGJlY2F1c2UKKyAqCW9mIHVpZCBzcXVhc2hpbmcgb24gdGhlIHNlcnZlciwgb3Igd2hlbiB0aGUgY3JlZGVudGlhbHMgd2VyZSBzdGFsZQorICoJYW5kIG5lZWQgdG8gYmUgcmVmcmVzaGVkLCBvciB3aGVuIGEgcGFja2V0IHdhcyBkYW1hZ2VkIGluIHRyYW5zaXQuCisgKglUaGlzIG1heSBiZSBoYXZlIHRvIGJlIG1vdmVkIHRvIHRoZSBWRlMgbGF5ZXIuCisgKgorICogIE5COiBCU0QgdXNlcyBhIG1vcmUgaW50ZWxsaWdlbnQgYXBwcm9hY2ggdG8gZ3Vlc3Npbmcgd2hlbiBhIHJlcXVlc3QKKyAqICBvciByZXBseSBoYXMgYmVlbiBsb3N0IGJ5IGtlZXBpbmcgdGhlIFJUTyBlc3RpbWF0ZSBmb3IgZWFjaCBwcm9jZWR1cmUuCisgKiAgV2UgY3VycmVudGx5IG1ha2UgZG8gd2l0aCBhIGNvbnN0YW50IHRpbWVvdXQgdmFsdWUuCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MiwxOTkzIFJpY2sgU2xhZGtleSA8anJzQHdvcmxkLnN0ZC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9ycGNfcGlwZV9mcy5oPgorCisjaW5jbHVkZSA8bGludXgvbmZzLmg+CisKKworI2RlZmluZSBSUENfU0xBQ0tfU1BBQ0UJCSgxMDI0KQkvKiB0b3RhbCBvdmVya2lsbCAqLworCisjaWZkZWYgUlBDX0RFQlVHCisjIGRlZmluZSBSUENEQkdfRkFDSUxJVFkJUlBDREJHX0NBTEwKKyNlbmRpZgorCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoZGVzdHJveV93YWl0KTsKKworCitzdGF0aWMgdm9pZAljYWxsX3N0YXJ0KHN0cnVjdCBycGNfdGFzayAqdGFzayk7CitzdGF0aWMgdm9pZAljYWxsX3Jlc2VydmUoc3RydWN0IHJwY190YXNrICp0YXNrKTsKK3N0YXRpYyB2b2lkCWNhbGxfcmVzZXJ2ZXJlc3VsdChzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spOworc3RhdGljIHZvaWQJY2FsbF9hbGxvY2F0ZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spOworc3RhdGljIHZvaWQJY2FsbF9lbmNvZGUoc3RydWN0IHJwY190YXNrICp0YXNrKTsKK3N0YXRpYyB2b2lkCWNhbGxfZGVjb2RlKHN0cnVjdCBycGNfdGFzayAqdGFzayk7CitzdGF0aWMgdm9pZAljYWxsX2JpbmQoc3RydWN0IHJwY190YXNrICp0YXNrKTsKK3N0YXRpYyB2b2lkCWNhbGxfdHJhbnNtaXQoc3RydWN0IHJwY190YXNrICp0YXNrKTsKK3N0YXRpYyB2b2lkCWNhbGxfc3RhdHVzKHN0cnVjdCBycGNfdGFzayAqdGFzayk7CitzdGF0aWMgdm9pZAljYWxsX3JlZnJlc2goc3RydWN0IHJwY190YXNrICp0YXNrKTsKK3N0YXRpYyB2b2lkCWNhbGxfcmVmcmVzaHJlc3VsdChzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spOworc3RhdGljIHZvaWQJY2FsbF90aW1lb3V0KHN0cnVjdCBycGNfdGFzayAqdGFzayk7CitzdGF0aWMgdm9pZAljYWxsX2Nvbm5lY3Qoc3RydWN0IHJwY190YXNrICp0YXNrKTsKK3N0YXRpYyB2b2lkCWNhbGxfY29ubmVjdF9zdGF0dXMoc3RydWN0IHJwY190YXNrICp0YXNrKTsKK3N0YXRpYyB1MzIgKgljYWxsX2hlYWRlcihzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spOworc3RhdGljIHUzMiAqCWNhbGxfdmVyaWZ5KHN0cnVjdCBycGNfdGFzayAqdGFzayk7CisKKworc3RhdGljIGludAorcnBjX3NldHVwX3BpcGVkaXIoc3RydWN0IHJwY19jbG50ICpjbG50LCBjaGFyICpkaXJfbmFtZSkKK3sKKwlzdGF0aWMgdWludDMyX3QgY2xudGlkOworCWludCBlcnJvcjsKKworCWlmIChkaXJfbmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlmb3IgKDs7KSB7CisJCXNucHJpbnRmKGNsbnQtPmNsX3BhdGhuYW1lLCBzaXplb2YoY2xudC0+Y2xfcGF0aG5hbWUpLAorCQkJCSIlcy9jbG50JXgiLCBkaXJfbmFtZSwKKwkJCQkodW5zaWduZWQgaW50KWNsbnRpZCsrKTsKKwkJY2xudC0+Y2xfcGF0aG5hbWVbc2l6ZW9mKGNsbnQtPmNsX3BhdGhuYW1lKSAtIDFdID0gJ1wwJzsKKwkJY2xudC0+Y2xfZGVudHJ5ID0gcnBjX21rZGlyKGNsbnQtPmNsX3BhdGhuYW1lLCBjbG50KTsKKwkJaWYgKCFJU19FUlIoY2xudC0+Y2xfZGVudHJ5KSkKKwkJCXJldHVybiAwOworCQllcnJvciA9IFBUUl9FUlIoY2xudC0+Y2xfZGVudHJ5KTsKKwkJaWYgKGVycm9yICE9IC1FRVhJU1QpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIlJQQzogQ291bGRuJ3QgY3JlYXRlIHBpcGVmcyBlbnRyeSAlcywgZXJyb3IgJWRcbiIsCisJCQkJCWNsbnQtPmNsX3BhdGhuYW1lLCBlcnJvcik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwl9Cit9CisKKy8qCisgKiBDcmVhdGUgYW4gUlBDIGNsaWVudAorICogRklYTUU6IFRoaXMgc2hvdWxkIGFsc28gdGFrZSBhIGZsYWdzIGFyZ3VtZW50IChhcyBpbiB0YXNrLT50a19mbGFncykuCisgKiBJdCdzIGNhbGxlZCAoYW1vbmcgb3RoZXJzKSBmcm9tIHBtYXBfY3JlYXRlX2NsaWVudCwgd2hpY2ggbWF5IGluCisgKiB0dXJuIGJlIGNhbGxlZCBieSBhbiBhc3luYyB0YXNrLiBJbiB0aGlzIGNhc2UsIHJwY2lvZCBzaG91bGQgbm90IGJlCisgKiBtYWRlIHRvIHNsZWVwIHRvbyBsb25nLgorICovCitzdHJ1Y3QgcnBjX2NsbnQgKgorcnBjX2NyZWF0ZV9jbGllbnQoc3RydWN0IHJwY194cHJ0ICp4cHJ0LCBjaGFyICpzZXJ2bmFtZSwKKwkJICBzdHJ1Y3QgcnBjX3Byb2dyYW0gKnByb2dyYW0sIHUzMiB2ZXJzLAorCQkgIHJwY19hdXRoZmxhdm9yX3QgZmxhdm9yKQoreworCXN0cnVjdCBycGNfdmVyc2lvbgkqdmVyc2lvbjsKKwlzdHJ1Y3QgcnBjX2NsbnQJCSpjbG50ID0gTlVMTDsKKwlpbnQgZXJyOworCWludCBsZW47CisKKwlkcHJpbnRrKCJSUEM6IGNyZWF0aW5nICVzIGNsaWVudCBmb3IgJXMgKHhwcnQgJXApXG4iLAorCQlwcm9ncmFtLT5uYW1lLCBzZXJ2bmFtZSwgeHBydCk7CisKKwllcnIgPSAtRUlOVkFMOworCWlmICgheHBydCkKKwkJZ290byBvdXRfZXJyOworCWlmICh2ZXJzID49IHByb2dyYW0tPm5ydmVycyB8fCAhKHZlcnNpb24gPSBwcm9ncmFtLT52ZXJzaW9uW3ZlcnNdKSkKKwkJZ290byBvdXRfZXJyOworCisJZXJyID0gLUVOT01FTTsKKwljbG50ID0gKHN0cnVjdCBycGNfY2xudCAqKSBrbWFsbG9jKHNpemVvZigqY2xudCksIEdGUF9LRVJORUwpOworCWlmICghY2xudCkKKwkJZ290byBvdXRfZXJyOworCW1lbXNldChjbG50LCAwLCBzaXplb2YoKmNsbnQpKTsKKwlhdG9taWNfc2V0KCZjbG50LT5jbF91c2VycywgMCk7CisJYXRvbWljX3NldCgmY2xudC0+Y2xfY291bnQsIDEpOworCWNsbnQtPmNsX3BhcmVudCA9IGNsbnQ7CisKKwljbG50LT5jbF9zZXJ2ZXIgPSBjbG50LT5jbF9pbmxpbmVfbmFtZTsKKwlsZW4gPSBzdHJsZW4oc2Vydm5hbWUpICsgMTsKKwlpZiAobGVuID4gc2l6ZW9mKGNsbnQtPmNsX2lubGluZV9uYW1lKSkgeworCQljaGFyICpidWYgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmIChidWYgIT0gMCkKKwkJCWNsbnQtPmNsX3NlcnZlciA9IGJ1ZjsKKwkJZWxzZQorCQkJbGVuID0gc2l6ZW9mKGNsbnQtPmNsX2lubGluZV9uYW1lKTsKKwl9CisJc3RybGNweShjbG50LT5jbF9zZXJ2ZXIsIHNlcnZuYW1lLCBsZW4pOworCisJY2xudC0+Y2xfeHBydCAgICAgPSB4cHJ0OworCWNsbnQtPmNsX3Byb2NpbmZvID0gdmVyc2lvbi0+cHJvY3M7CisJY2xudC0+Y2xfbWF4cHJvYyAgPSB2ZXJzaW9uLT5ucnByb2NzOworCWNsbnQtPmNsX3Byb3RuYW1lID0gcHJvZ3JhbS0+bmFtZTsKKwljbG50LT5jbF9wbWFwCSAgPSAmY2xudC0+Y2xfcG1hcF9kZWZhdWx0OworCWNsbnQtPmNsX3BvcnQgICAgID0geHBydC0+YWRkci5zaW5fcG9ydDsKKwljbG50LT5jbF9wcm9nICAgICA9IHByb2dyYW0tPm51bWJlcjsKKwljbG50LT5jbF92ZXJzICAgICA9IHZlcnNpb24tPm51bWJlcjsKKwljbG50LT5jbF9wcm90ICAgICA9IHhwcnQtPnByb3Q7CisJY2xudC0+Y2xfc3RhdHMgICAgPSBwcm9ncmFtLT5zdGF0czsKKwlycGNfaW5pdF93YWl0X3F1ZXVlKCZjbG50LT5jbF9wbWFwX2RlZmF1bHQucG1fYmluZHdhaXQsICJiaW5kd2FpdCIpOworCisJaWYgKCFjbG50LT5jbF9wb3J0KQorCQljbG50LT5jbF9hdXRvYmluZCA9IDE7CisKKwljbG50LT5jbF9ydHQgPSAmY2xudC0+Y2xfcnR0X2RlZmF1bHQ7CisJcnBjX2luaXRfcnR0KCZjbG50LT5jbF9ydHRfZGVmYXVsdCwgeHBydC0+dGltZW91dC50b19pbml0dmFsKTsKKworCWVyciA9IHJwY19zZXR1cF9waXBlZGlyKGNsbnQsIHByb2dyYW0tPnBpcGVfZGlyX25hbWUpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9ub19wYXRoOworCisJZXJyID0gLUVOT01FTTsKKwlpZiAoIXJwY2F1dGhfY3JlYXRlKGZsYXZvciwgY2xudCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUlBDOiBDb3VsZG4ndCBjcmVhdGUgYXV0aCBoYW5kbGUgKGZsYXZvciAldSlcbiIsCisJCQkJZmxhdm9yKTsKKwkJZ290byBvdXRfbm9fYXV0aDsKKwl9CisKKwkvKiBzYXZlIHRoZSBub2RlbmFtZSAqLworCWNsbnQtPmNsX25vZGVsZW4gPSBzdHJsZW4oc3lzdGVtX3V0c25hbWUubm9kZW5hbWUpOworCWlmIChjbG50LT5jbF9ub2RlbGVuID4gVU5YX01BWE5PREVOQU1FKQorCQljbG50LT5jbF9ub2RlbGVuID0gVU5YX01BWE5PREVOQU1FOworCW1lbWNweShjbG50LT5jbF9ub2RlbmFtZSwgc3lzdGVtX3V0c25hbWUubm9kZW5hbWUsIGNsbnQtPmNsX25vZGVsZW4pOworCXJldHVybiBjbG50OworCitvdXRfbm9fYXV0aDoKKwlycGNfcm1kaXIoY2xudC0+Y2xfcGF0aG5hbWUpOworb3V0X25vX3BhdGg6CisJaWYgKGNsbnQtPmNsX3NlcnZlciAhPSBjbG50LT5jbF9pbmxpbmVfbmFtZSkKKwkJa2ZyZWUoY2xudC0+Y2xfc2VydmVyKTsKKwlrZnJlZShjbG50KTsKK291dF9lcnI6CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gY2xvbmVzIHRoZSBSUEMgY2xpZW50IHN0cnVjdHVyZS4gSXQgYWxsb3dzIHVzIHRvIHNoYXJlIHRoZQorICogc2FtZSB0cmFuc3BvcnQgd2hpbGUgdmFyeWluZyBwYXJhbWV0ZXJzIHN1Y2ggYXMgdGhlIGF1dGhlbnRpY2F0aW9uCisgKiBmbGF2b3VyLgorICovCitzdHJ1Y3QgcnBjX2NsbnQgKgorcnBjX2Nsb25lX2NsaWVudChzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQpCit7CisJc3RydWN0IHJwY19jbG50ICpuZXc7CisKKwluZXcgPSAoc3RydWN0IHJwY19jbG50ICopa21hbGxvYyhzaXplb2YoKm5ldyksIEdGUF9LRVJORUwpOworCWlmICghbmV3KQorCQlnb3RvIG91dF9ub19jbG50OworCW1lbWNweShuZXcsIGNsbnQsIHNpemVvZigqbmV3KSk7CisJYXRvbWljX3NldCgmbmV3LT5jbF9jb3VudCwgMSk7CisJYXRvbWljX3NldCgmbmV3LT5jbF91c2VycywgMCk7CisJbmV3LT5jbF9wYXJlbnQgPSBjbG50OworCWF0b21pY19pbmMoJmNsbnQtPmNsX2NvdW50KTsKKwkvKiBEdXBsaWNhdGUgcG9ydG1hcHBlciAqLworCXJwY19pbml0X3dhaXRfcXVldWUoJm5ldy0+Y2xfcG1hcF9kZWZhdWx0LnBtX2JpbmR3YWl0LCAiYmluZHdhaXQiKTsKKwkvKiBUdXJuIG9mZiBhdXRvYmluZCBvbiBjbG9uZXMgKi8KKwluZXctPmNsX2F1dG9iaW5kID0gMDsKKwluZXctPmNsX29uZXNob3QgPSAwOworCW5ldy0+Y2xfZGVhZCA9IDA7CisJcnBjX2luaXRfcnR0KCZuZXctPmNsX3J0dF9kZWZhdWx0LCBjbG50LT5jbF94cHJ0LT50aW1lb3V0LnRvX2luaXR2YWwpOworCWlmIChuZXctPmNsX2F1dGgpCisJCWF0b21pY19pbmMoJm5ldy0+Y2xfYXV0aC0+YXVfY291bnQpOworCXJldHVybiBuZXc7CitvdXRfbm9fY2xudDoKKwlwcmludGsoS0VSTl9JTkZPICJSUEM6IG91dCBvZiBtZW1vcnkgaW4gJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Cit9CisKKy8qCisgKiBQcm9wZXJseSBzaHV0IGRvd24gYW4gUlBDIGNsaWVudCwgdGVybWluYXRpbmcgYWxsIG91dHN0YW5kaW5nCisgKiByZXF1ZXN0cy4gTm90ZSB0aGF0IHdlIG11c3QgYmUgY2VydGFpbiB0aGF0IGNsX29uZXNob3QgYW5kCisgKiBjbF9kZWFkIGFyZSBjbGVhcmVkLCBvciBlbHNlIHRoZSBjbGllbnQgd291bGQgYmUgZGVzdHJveWVkCisgKiB3aGVuIHRoZSBsYXN0IHRhc2sgcmVsZWFzZXMgaXQuCisgKi8KK2ludAorcnBjX3NodXRkb3duX2NsaWVudChzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQpCit7CisJZHByaW50aygiUlBDOiBzaHV0dGluZyBkb3duICVzIGNsaWVudCBmb3IgJXMsIHRhc2tzPSVkXG4iLAorCQkJY2xudC0+Y2xfcHJvdG5hbWUsIGNsbnQtPmNsX3NlcnZlciwKKwkJCWF0b21pY19yZWFkKCZjbG50LT5jbF91c2VycykpOworCisJd2hpbGUgKGF0b21pY19yZWFkKCZjbG50LT5jbF91c2VycykgPiAwKSB7CisJCS8qIERvbid0IGxldCBycGNfcmVsZWFzZV9jbGllbnQgZGVzdHJveSB1cyAqLworCQljbG50LT5jbF9vbmVzaG90ID0gMDsKKwkJY2xudC0+Y2xfZGVhZCA9IDA7CisJCXJwY19raWxsYWxsX3Rhc2tzKGNsbnQpOworCQlzbGVlcF9vbl90aW1lb3V0KCZkZXN0cm95X3dhaXQsIDEqSFopOworCX0KKworCWlmIChhdG9taWNfcmVhZCgmY2xudC0+Y2xfdXNlcnMpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIlJQQzogcnBjX3NodXRkb3duX2NsaWVudCBjbG50ICVwIHRhc2tzPSVkXG4iLAorCQkJCWNsbnQsIGF0b21pY19yZWFkKCZjbG50LT5jbF91c2VycykpOworI2lmZGVmIFJQQ19ERUJVRworCQlycGNfc2hvd190YXNrcygpOworI2VuZGlmCisJCUJVRygpOworCX0KKworCXJldHVybiBycGNfZGVzdHJveV9jbGllbnQoY2xudCk7Cit9CisKKy8qCisgKiBEZWxldGUgYW4gUlBDIGNsaWVudAorICovCitpbnQKK3JwY19kZXN0cm95X2NsaWVudChzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQpCit7CisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZjbG50LT5jbF9jb3VudCkpCisJCXJldHVybiAxOworCUJVR19PTihhdG9taWNfcmVhZCgmY2xudC0+Y2xfdXNlcnMpICE9IDApOworCisJZHByaW50aygiUlBDOiBkZXN0cm95aW5nICVzIGNsaWVudCBmb3IgJXNcbiIsCisJCQljbG50LT5jbF9wcm90bmFtZSwgY2xudC0+Y2xfc2VydmVyKTsKKwlpZiAoY2xudC0+Y2xfYXV0aCkgeworCQlycGNhdXRoX2Rlc3Ryb3koY2xudC0+Y2xfYXV0aCk7CisJCWNsbnQtPmNsX2F1dGggPSBOVUxMOworCX0KKwlpZiAoY2xudC0+Y2xfcGFyZW50ICE9IGNsbnQpIHsKKwkJcnBjX2Rlc3Ryb3lfY2xpZW50KGNsbnQtPmNsX3BhcmVudCk7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCWlmIChjbG50LT5jbF9wYXRobmFtZVswXSkKKwkJcnBjX3JtZGlyKGNsbnQtPmNsX3BhdGhuYW1lKTsKKwlpZiAoY2xudC0+Y2xfeHBydCkgeworCQl4cHJ0X2Rlc3Ryb3koY2xudC0+Y2xfeHBydCk7CisJCWNsbnQtPmNsX3hwcnQgPSBOVUxMOworCX0KKwlpZiAoY2xudC0+Y2xfc2VydmVyICE9IGNsbnQtPmNsX2lubGluZV9uYW1lKQorCQlrZnJlZShjbG50LT5jbF9zZXJ2ZXIpOworb3V0X2ZyZWU6CisJa2ZyZWUoY2xudCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWxlYXNlIGFuIFJQQyBjbGllbnQKKyAqLwordm9pZAorcnBjX3JlbGVhc2VfY2xpZW50KHN0cnVjdCBycGNfY2xudCAqY2xudCkKK3sKKwlkcHJpbnRrKCJSUEM6ICAgICAgcnBjX3JlbGVhc2VfY2xpZW50KCVwLCAlZClcbiIsCisJCQkJY2xudCwgYXRvbWljX3JlYWQoJmNsbnQtPmNsX3VzZXJzKSk7CisKKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmNsbnQtPmNsX3VzZXJzKSkKKwkJcmV0dXJuOworCXdha2VfdXAoJmRlc3Ryb3lfd2FpdCk7CisJaWYgKGNsbnQtPmNsX29uZXNob3QgfHwgY2xudC0+Y2xfZGVhZCkKKwkJcnBjX2Rlc3Ryb3lfY2xpZW50KGNsbnQpOworfQorCisvKgorICogRGVmYXVsdCBjYWxsYmFjayBmb3IgYXN5bmMgUlBDIGNhbGxzCisgKi8KK3N0YXRpYyB2b2lkCitycGNfZGVmYXVsdF9jYWxsYmFjayhzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7Cit9CisKKy8qCisgKglFeHBvcnQgdGhlIHNpZ25hbCBtYXNrIGhhbmRsaW5nIGZvciBheXNuY2hyb25vdXMgY29kZSB0aGF0CisgKglzbGVlcHMgb24gUlBDIGNhbGxzCisgKi8KKyAKK3ZvaWQgcnBjX2NsbnRfc2lnbWFzayhzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQsIHNpZ3NldF90ICpvbGRzZXQpCit7CisJdW5zaWduZWQgbG9uZwlzaWdhbGxvdyA9IHNpZ21hc2soU0lHS0lMTCk7CisJdW5zaWduZWQgbG9uZwlpcnFmbGFnczsKKwkKKwkvKiBUdXJuIG9mZiB2YXJpb3VzIHNpZ25hbHMgKi8KKwlpZiAoY2xudC0+Y2xfaW50cikgeworCQlzdHJ1Y3Qga19zaWdhY3Rpb24gKmFjdGlvbiA9IGN1cnJlbnQtPnNpZ2hhbmQtPmFjdGlvbjsKKwkJaWYgKGFjdGlvbltTSUdJTlQtMV0uc2Euc2FfaGFuZGxlciA9PSBTSUdfREZMKQorCQkJc2lnYWxsb3cgfD0gc2lnbWFzayhTSUdJTlQpOworCQlpZiAoYWN0aW9uW1NJR1FVSVQtMV0uc2Euc2FfaGFuZGxlciA9PSBTSUdfREZMKQorCQkJc2lnYWxsb3cgfD0gc2lnbWFzayhTSUdRVUlUKTsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGlycWZsYWdzKTsKKwkqb2xkc2V0ID0gY3VycmVudC0+YmxvY2tlZDsKKwlzaWdpbml0c2V0aW52KCZjdXJyZW50LT5ibG9ja2VkLCBzaWdhbGxvdyAmIH5vbGRzZXQtPnNpZ1swXSk7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBpcnFmbGFncyk7Cit9CisKK3ZvaWQgcnBjX2NsbnRfc2lndW5tYXNrKHN0cnVjdCBycGNfY2xudCAqY2xudCwgc2lnc2V0X3QgKm9sZHNldCkKK3sKKwl1bnNpZ25lZCBsb25nCWlycWZsYWdzOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBpcnFmbGFncyk7CisJY3VycmVudC0+YmxvY2tlZCA9ICpvbGRzZXQ7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBpcnFmbGFncyk7Cit9CisKKy8qCisgKiBOZXcgcnBjX2NhbGwgaW1wbGVtZW50YXRpb24KKyAqLworaW50IHJwY19jYWxsX3N5bmMoc3RydWN0IHJwY19jbG50ICpjbG50LCBzdHJ1Y3QgcnBjX21lc3NhZ2UgKm1zZywgaW50IGZsYWdzKQoreworCXN0cnVjdCBycGNfdGFzawkqdGFzazsKKwlzaWdzZXRfdAlvbGRzZXQ7CisJaW50CQlzdGF0dXM7CisKKwkvKiBJZiB0aGlzIGNsaWVudCBpcyBzbGFpbiBhbGwgZnVydGhlciBJL08gZmFpbHMgKi8KKwlpZiAoY2xudC0+Y2xfZGVhZCkgCisJCXJldHVybiAtRUlPOworCisJQlVHX09OKGZsYWdzICYgUlBDX1RBU0tfQVNZTkMpOworCisJcnBjX2NsbnRfc2lnbWFzayhjbG50LCAmb2xkc2V0KTsJCQorCisJc3RhdHVzID0gLUVOT01FTTsKKwl0YXNrID0gcnBjX25ld190YXNrKGNsbnQsIE5VTEwsIGZsYWdzKTsKKwlpZiAodGFzayA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCXJwY19jYWxsX3NldHVwKHRhc2ssIG1zZywgMCk7CisKKwkvKiBTZXQgdXAgdGhlIGNhbGwgaW5mbyBzdHJ1Y3QgYW5kIGV4ZWN1dGUgdGhlIHRhc2sgKi8KKwlpZiAodGFzay0+dGtfc3RhdHVzID09IDApCisJCXN0YXR1cyA9IHJwY19leGVjdXRlKHRhc2spOworCWVsc2UgeworCQlzdGF0dXMgPSB0YXNrLT50a19zdGF0dXM7CisJCXJwY19yZWxlYXNlX3Rhc2sodGFzayk7CisJfQorCitvdXQ6CisJcnBjX2NsbnRfc2lndW5tYXNrKGNsbnQsICZvbGRzZXQpOwkJCisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogTmV3IHJwY19jYWxsIGltcGxlbWVudGF0aW9uCisgKi8KK2ludAorcnBjX2NhbGxfYXN5bmMoc3RydWN0IHJwY19jbG50ICpjbG50LCBzdHJ1Y3QgcnBjX21lc3NhZ2UgKm1zZywgaW50IGZsYWdzLAorCSAgICAgICBycGNfYWN0aW9uIGNhbGxiYWNrLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBycGNfdGFzawkqdGFzazsKKwlzaWdzZXRfdAlvbGRzZXQ7CisJaW50CQlzdGF0dXM7CisKKwkvKiBJZiB0aGlzIGNsaWVudCBpcyBzbGFpbiBhbGwgZnVydGhlciBJL08gZmFpbHMgKi8KKwlpZiAoY2xudC0+Y2xfZGVhZCkgCisJCXJldHVybiAtRUlPOworCisJZmxhZ3MgfD0gUlBDX1RBU0tfQVNZTkM7CisKKwlycGNfY2xudF9zaWdtYXNrKGNsbnQsICZvbGRzZXQpOwkJCisKKwkvKiBDcmVhdGUvaW5pdGlhbGl6ZSBhIG5ldyBSUEMgdGFzayAqLworCWlmICghY2FsbGJhY2spCisJCWNhbGxiYWNrID0gcnBjX2RlZmF1bHRfY2FsbGJhY2s7CisJc3RhdHVzID0gLUVOT01FTTsKKwlpZiAoISh0YXNrID0gcnBjX25ld190YXNrKGNsbnQsIGNhbGxiYWNrLCBmbGFncykpKQorCQlnb3RvIG91dDsKKwl0YXNrLT50a19jYWxsZGF0YSA9IGRhdGE7CisKKwlycGNfY2FsbF9zZXR1cCh0YXNrLCBtc2csIDApOworCisJLyogU2V0IHVwIHRoZSBjYWxsIGluZm8gc3RydWN0IGFuZCBleGVjdXRlIHRoZSB0YXNrICovCisJc3RhdHVzID0gdGFzay0+dGtfc3RhdHVzOworCWlmIChzdGF0dXMgPT0gMCkKKwkJcnBjX2V4ZWN1dGUodGFzayk7CisJZWxzZQorCQlycGNfcmVsZWFzZV90YXNrKHRhc2spOworCitvdXQ6CisJcnBjX2NsbnRfc2lndW5tYXNrKGNsbnQsICZvbGRzZXQpOwkJCisKKwlyZXR1cm4gc3RhdHVzOworfQorCisKK3ZvaWQKK3JwY19jYWxsX3NldHVwKHN0cnVjdCBycGNfdGFzayAqdGFzaywgc3RydWN0IHJwY19tZXNzYWdlICptc2csIGludCBmbGFncykKK3sKKwl0YXNrLT50a19tc2cgICA9ICptc2c7CisJdGFzay0+dGtfZmxhZ3MgfD0gZmxhZ3M7CisJLyogQmluZCB0aGUgdXNlciBjcmVkICovCisJaWYgKHRhc2stPnRrX21zZy5ycGNfY3JlZCAhPSBOVUxMKQorCQlycGNhdXRoX2hvbGRjcmVkKHRhc2spOworCWVsc2UKKwkJcnBjYXV0aF9iaW5kY3JlZCh0YXNrKTsKKworCWlmICh0YXNrLT50a19zdGF0dXMgPT0gMCkKKwkJdGFzay0+dGtfYWN0aW9uID0gY2FsbF9zdGFydDsKKwllbHNlCisJCXRhc2stPnRrX2FjdGlvbiA9IE5VTEw7Cit9CisKK3ZvaWQKK3JwY19zZXRidWZzaXplKHN0cnVjdCBycGNfY2xudCAqY2xudCwgdW5zaWduZWQgaW50IHNuZHNpemUsIHVuc2lnbmVkIGludCByY3ZzaXplKQoreworCXN0cnVjdCBycGNfeHBydCAqeHBydCA9IGNsbnQtPmNsX3hwcnQ7CisKKwl4cHJ0LT5zbmRzaXplID0gMDsKKwlpZiAoc25kc2l6ZSkKKwkJeHBydC0+c25kc2l6ZSA9IHNuZHNpemUgKyBSUENfU0xBQ0tfU1BBQ0U7CisJeHBydC0+cmN2c2l6ZSA9IDA7CisJaWYgKHJjdnNpemUpCisJCXhwcnQtPnJjdnNpemUgPSByY3ZzaXplICsgUlBDX1NMQUNLX1NQQUNFOworCWlmICh4cHJ0X2Nvbm5lY3RlZCh4cHJ0KSkKKwkJeHBydF9zb2NrX3NldGJ1ZnNpemUoeHBydCk7Cit9CisKKy8qCisgKiBSZXR1cm4gc2l6ZSBvZiBsYXJnZXN0IHBheWxvYWQgUlBDIGNsaWVudCBjYW4gc3VwcG9ydCwgaW4gYnl0ZXMKKyAqCisgKiBGb3Igc3RyZWFtIHRyYW5zcG9ydHMsIHRoaXMgaXMgb25lIFJQQyByZWNvcmQgZnJhZ21lbnQgKHNlZSBSRkMKKyAqIDE4MzEpLCBhcyB3ZSBkb24ndCBzdXBwb3J0IG11bHRpLXJlY29yZCByZXF1ZXN0cyB5ZXQuICBGb3IgZGF0YWdyYW0KKyAqIHRyYW5zcG9ydHMsIHRoaXMgaXMgdGhlIHNpemUgb2YgYW4gSVAgcGFja2V0IG1pbnVzIHRoZSBJUCwgVURQLCBhbmQKKyAqIFJQQyBoZWFkZXIgc2l6ZXMuCisgKi8KK3NpemVfdCBycGNfbWF4X3BheWxvYWQoc3RydWN0IHJwY19jbG50ICpjbG50KQoreworCXJldHVybiBjbG50LT5jbF94cHJ0LT5tYXhfcGF5bG9hZDsKK30KK0VYUE9SVF9TWU1CT0wocnBjX21heF9wYXlsb2FkKTsKKworLyoKKyAqIFJlc3RhcnQgYW4gKGFzeW5jKSBSUEMgY2FsbC4gVXN1YWxseSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlCisgKiBleGl0IGhhbmRsZXIuCisgKi8KK3ZvaWQKK3JwY19yZXN0YXJ0X2NhbGwoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCWlmIChSUENfQVNTQVNTSU5BVEVEKHRhc2spKQorCQlyZXR1cm47CisKKwl0YXNrLT50a19hY3Rpb24gPSBjYWxsX3N0YXJ0OworfQorCisvKgorICogMC4gIEluaXRpYWwgc3RhdGUKKyAqCisgKiAgICAgT3RoZXIgRlNNIHN0YXRlcyBjYW4gYmUgdmlzaXRlZCB6ZXJvIG9yIG1vcmUgdGltZXMsIGJ1dAorICogICAgIHRoaXMgc3RhdGUgaXMgdmlzaXRlZCBleGFjdGx5IG9uY2UgZm9yIGVhY2ggUlBDLgorICovCitzdGF0aWMgdm9pZAorY2FsbF9zdGFydChzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IHJwY19jbG50CSpjbG50ID0gdGFzay0+dGtfY2xpZW50OworCisJZHByaW50aygiUlBDOiAlNGQgY2FsbF9zdGFydCAlcyVkIHByb2MgJWQgKCVzKVxuIiwgdGFzay0+dGtfcGlkLAorCQljbG50LT5jbF9wcm90bmFtZSwgY2xudC0+Y2xfdmVycywgdGFzay0+dGtfbXNnLnJwY19wcm9jLT5wX3Byb2MsCisJCShSUENfSVNfQVNZTkModGFzaykgPyAiYXN5bmMiIDogInN5bmMiKSk7CisKKwkvKiBJbmNyZW1lbnQgY2FsbCBjb3VudCAqLworCXRhc2stPnRrX21zZy5ycGNfcHJvYy0+cF9jb3VudCsrOworCWNsbnQtPmNsX3N0YXRzLT5ycGNjbnQrKzsKKwl0YXNrLT50a19hY3Rpb24gPSBjYWxsX3Jlc2VydmU7Cit9CisKKy8qCisgKiAxLglSZXNlcnZlIGFuIFJQQyBjYWxsIHNsb3QKKyAqLworc3RhdGljIHZvaWQKK2NhbGxfcmVzZXJ2ZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJZHByaW50aygiUlBDOiAlNGQgY2FsbF9yZXNlcnZlXG4iLCB0YXNrLT50a19waWQpOworCisJaWYgKCFycGNhdXRoX3VwdG9kYXRlY3JlZCh0YXNrKSkgeworCQl0YXNrLT50a19hY3Rpb24gPSBjYWxsX3JlZnJlc2g7CisJCXJldHVybjsKKwl9CisKKwl0YXNrLT50a19zdGF0dXMgID0gMDsKKwl0YXNrLT50a19hY3Rpb24gID0gY2FsbF9yZXNlcnZlcmVzdWx0OworCXhwcnRfcmVzZXJ2ZSh0YXNrKTsKK30KKworLyoKKyAqIDFiLglHcm9rIHRoZSByZXN1bHQgb2YgeHBydF9yZXNlcnZlKCkKKyAqLworc3RhdGljIHZvaWQKK2NhbGxfcmVzZXJ2ZXJlc3VsdChzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJaW50IHN0YXR1cyA9IHRhc2stPnRrX3N0YXR1czsKKworCWRwcmludGsoIlJQQzogJTRkIGNhbGxfcmVzZXJ2ZXJlc3VsdCAoc3RhdHVzICVkKVxuIiwKKwkJCQl0YXNrLT50a19waWQsIHRhc2stPnRrX3N0YXR1cyk7CisKKwkvKgorCSAqIEFmdGVyIGEgY2FsbCB0byB4cHJ0X3Jlc2VydmUoKSwgd2UgbXVzdCBoYXZlIGVpdGhlcgorCSAqIGEgcmVxdWVzdCBzbG90IG9yIGVsc2UgYW4gZXJyb3Igc3RhdHVzLgorCSAqLworCXRhc2stPnRrX3N0YXR1cyA9IDA7CisJaWYgKHN0YXR1cyA+PSAwKSB7CisJCWlmICh0YXNrLT50a19ycXN0cCkgeworCQkJdGFzay0+dGtfYWN0aW9uID0gY2FsbF9hbGxvY2F0ZTsKKwkJCXJldHVybjsKKwkJfQorCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHN0YXR1cz0lZCwgYnV0IG5vIHJlcXVlc3Qgc2xvdCwgZXhpdGluZ1xuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCXJwY19leGl0KHRhc2ssIC1FSU8pOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBFdmVuIHRob3VnaCB0aGVyZSB3YXMgYW4gZXJyb3IsIHdlIG1heSBoYXZlIGFjcXVpcmVkCisJICogYSByZXF1ZXN0IHNsb3Qgc29tZWhvdy4gIE1ha2Ugc3VyZSBub3QgdG8gbGVhayBpdC4KKwkgKi8KKwlpZiAodGFzay0+dGtfcnFzdHApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogc3RhdHVzPSVkLCByZXF1ZXN0IGFsbG9jYXRlZCBhbnl3YXlcbiIsCisJCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQl4cHJ0X3JlbGVhc2UodGFzayk7CisJfQorCisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIC1FQUdBSU46CS8qIHdva2VuIHVwOyByZXRyeSAqLworCQl0YXNrLT50a19hY3Rpb24gPSBjYWxsX3Jlc2VydmU7CisJCXJldHVybjsKKwljYXNlIC1FSU86CS8qIHByb2JhYmx5IGEgc2h1dGRvd24gKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5yZWNvZ25pemVkIGVycm9yICVkLCBleGl0aW5nXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJYnJlYWs7CisJfQorCXJwY19leGl0KHRhc2ssIHN0YXR1cyk7Cit9CisKKy8qCisgKiAyLglBbGxvY2F0ZSB0aGUgYnVmZmVyLiBGb3IgZGV0YWlscywgc2VlIHNjaGVkLmM6cnBjX21hbGxvYy4KKyAqCShOb3RlOiBidWZmZXIgbWVtb3J5IGlzIGZyZWVkIGluIHJwY190YXNrX3JlbGVhc2UpLgorICovCitzdGF0aWMgdm9pZAorY2FsbF9hbGxvY2F0ZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJdW5zaWduZWQgaW50CWJ1ZnNpejsKKworCWRwcmludGsoIlJQQzogJTRkIGNhbGxfYWxsb2NhdGUgKHN0YXR1cyAlZClcbiIsIAorCQkJCXRhc2stPnRrX3BpZCwgdGFzay0+dGtfc3RhdHVzKTsKKwl0YXNrLT50a19hY3Rpb24gPSBjYWxsX2JpbmQ7CisJaWYgKHRhc2stPnRrX2J1ZmZlcikKKwkJcmV0dXJuOworCisJLyogRklYTUU6IGNvbXB1dGUgYnVmZmVyIHJlcXVpcmVtZW50cyBtb3JlIGV4YWN0bHkgdXNpbmcKKwkgKiBhdXRoLT5hdV93c2xhY2sgKi8KKwlidWZzaXogPSB0YXNrLT50a19tc2cucnBjX3Byb2MtPnBfYnVmc2l6ICsgUlBDX1NMQUNLX1NQQUNFOworCisJaWYgKHJwY19tYWxsb2ModGFzaywgYnVmc2l6IDw8IDEpICE9IE5VTEwpCisJCXJldHVybjsKKwlwcmludGsoS0VSTl9JTkZPICJSUEM6IGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCBmb3IgdGFzayAlcFxuIiwgdGFzayk7IAorCisJaWYgKFJQQ19JU19BU1lOQyh0YXNrKSB8fCAhKHRhc2stPnRrX2NsaWVudC0+Y2xfaW50ciAmJiBzaWduYWxsZWQoKSkpIHsKKwkJeHBydF9yZWxlYXNlKHRhc2spOworCQl0YXNrLT50a19hY3Rpb24gPSBjYWxsX3Jlc2VydmU7CisJCXJwY19kZWxheSh0YXNrLCBIWj4+NCk7CisJCXJldHVybjsKKwl9CisKKwlycGNfZXhpdCh0YXNrLCAtRVJFU1RBUlRTWVMpOworfQorCisvKgorICogMy4JRW5jb2RlIGFyZ3VtZW50cyBvZiBhbiBSUEMgY2FsbAorICovCitzdGF0aWMgdm9pZAorY2FsbF9lbmNvZGUoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBycGNfY2xudAkqY2xudCA9IHRhc2stPnRrX2NsaWVudDsKKwlzdHJ1Y3QgcnBjX3Jxc3QJKnJlcSA9IHRhc2stPnRrX3Jxc3RwOworCXN0cnVjdCB4ZHJfYnVmICpzbmRidWYgPSAmcmVxLT5ycV9zbmRfYnVmOworCXN0cnVjdCB4ZHJfYnVmICpyY3ZidWYgPSAmcmVxLT5ycV9yY3ZfYnVmOworCXVuc2lnbmVkIGludAlidWZzaXo7CisJa3hkcnByb2NfdAllbmNvZGU7CisJaW50CQlzdGF0dXM7CisJdTMyCQkqcDsKKworCWRwcmludGsoIlJQQzogJTRkIGNhbGxfZW5jb2RlIChzdGF0dXMgJWQpXG4iLCAKKwkJCQl0YXNrLT50a19waWQsIHRhc2stPnRrX3N0YXR1cyk7CisKKwkvKiBEZWZhdWx0IGJ1ZmZlciBzZXR1cCAqLworCWJ1ZnNpeiA9IHRhc2stPnRrX2J1ZnNpemUgPj4gMTsKKwlzbmRidWYtPmhlYWRbMF0uaW92X2Jhc2UgPSAodm9pZCAqKXRhc2stPnRrX2J1ZmZlcjsKKwlzbmRidWYtPmhlYWRbMF0uaW92X2xlbiAgPSBidWZzaXo7CisJc25kYnVmLT50YWlsWzBdLmlvdl9sZW4gID0gMDsKKwlzbmRidWYtPnBhZ2VfbGVuCSA9IDA7CisJc25kYnVmLT5sZW4JCSA9IDA7CisJc25kYnVmLT5idWZsZW4JCSA9IGJ1ZnNpejsKKwlyY3ZidWYtPmhlYWRbMF0uaW92X2Jhc2UgPSAodm9pZCAqKSgoY2hhciAqKXRhc2stPnRrX2J1ZmZlciArIGJ1ZnNpeik7CisJcmN2YnVmLT5oZWFkWzBdLmlvdl9sZW4gID0gYnVmc2l6OworCXJjdmJ1Zi0+dGFpbFswXS5pb3ZfbGVuICA9IDA7CisJcmN2YnVmLT5wYWdlX2xlbgkgPSAwOworCXJjdmJ1Zi0+bGVuCQkgPSAwOworCXJjdmJ1Zi0+YnVmbGVuCQkgPSBidWZzaXo7CisKKwkvKiBFbmNvZGUgaGVhZGVyIGFuZCBwcm92aWRlZCBhcmd1bWVudHMgKi8KKwllbmNvZGUgPSB0YXNrLT50a19tc2cucnBjX3Byb2MtPnBfZW5jb2RlOworCWlmICghKHAgPSBjYWxsX2hlYWRlcih0YXNrKSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUlBDOiBjYWxsX2hlYWRlciBmYWlsZWQsIGV4aXQgRUlPXG4iKTsKKwkJcnBjX2V4aXQodGFzaywgLUVJTyk7CisJCXJldHVybjsKKwl9CisJaWYgKGVuY29kZSAmJiAoc3RhdHVzID0gcnBjYXV0aF93cmFwX3JlcSh0YXNrLCBlbmNvZGUsIHJlcSwgcCwKKwkJCQkJCSB0YXNrLT50a19tc2cucnBjX2FyZ3ApKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNhbid0IGVuY29kZSBhcmd1bWVudHM6ICVkXG4iLAorCQkJCWNsbnQtPmNsX3Byb3RuYW1lLCAtc3RhdHVzKTsKKwkJcnBjX2V4aXQodGFzaywgc3RhdHVzKTsKKwl9Cit9CisKKy8qCisgKiA0LglHZXQgdGhlIHNlcnZlciBwb3J0IG51bWJlciBpZiBub3QgeWV0IHNldAorICovCitzdGF0aWMgdm9pZAorY2FsbF9iaW5kKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgcnBjX2NsbnQJKmNsbnQgPSB0YXNrLT50a19jbGllbnQ7CisJc3RydWN0IHJwY194cHJ0ICp4cHJ0ID0gY2xudC0+Y2xfeHBydDsKKworCWRwcmludGsoIlJQQzogJTRkIGNhbGxfYmluZCB4cHJ0ICVwICVzIGNvbm5lY3RlZFxuIiwgdGFzay0+dGtfcGlkLAorCQkJeHBydCwgKHhwcnRfY29ubmVjdGVkKHhwcnQpID8gImlzIiA6ICJpcyBub3QiKSk7CisKKwl0YXNrLT50a19hY3Rpb24gPSAoeHBydF9jb25uZWN0ZWQoeHBydCkpID8gY2FsbF90cmFuc21pdCA6IGNhbGxfY29ubmVjdDsKKworCWlmICghY2xudC0+Y2xfcG9ydCkgeworCQl0YXNrLT50a19hY3Rpb24gPSBjYWxsX2Nvbm5lY3Q7CisJCXRhc2stPnRrX3RpbWVvdXQgPSBSUENfQ09OTkVDVF9USU1FT1VUOworCQlycGNfZ2V0cG9ydCh0YXNrLCBjbG50KTsKKwl9Cit9CisKKy8qCisgKiA0YS4JQ29ubmVjdCB0byB0aGUgUlBDIHNlcnZlciAoVENQIGNhc2UpCisgKi8KK3N0YXRpYyB2b2lkCitjYWxsX2Nvbm5lY3Qoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBycGNfY2xudCAqY2xudCA9IHRhc2stPnRrX2NsaWVudDsKKworCWRwcmludGsoIlJQQzogJTRkIGNhbGxfY29ubmVjdCBzdGF0dXMgJWRcbiIsCisJCQkJdGFzay0+dGtfcGlkLCB0YXNrLT50a19zdGF0dXMpOworCisJaWYgKHhwcnRfY29ubmVjdGVkKGNsbnQtPmNsX3hwcnQpKSB7CisJCXRhc2stPnRrX2FjdGlvbiA9IGNhbGxfdHJhbnNtaXQ7CisJCXJldHVybjsKKwl9CisJdGFzay0+dGtfYWN0aW9uID0gY2FsbF9jb25uZWN0X3N0YXR1czsKKwlpZiAodGFzay0+dGtfc3RhdHVzIDwgMCkKKwkJcmV0dXJuOworCXhwcnRfY29ubmVjdCh0YXNrKTsKK30KKworLyoKKyAqIDRiLiBTb3J0IG91dCBjb25uZWN0IHJlc3VsdAorICovCitzdGF0aWMgdm9pZAorY2FsbF9jb25uZWN0X3N0YXR1cyhzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IHJwY19jbG50ICpjbG50ID0gdGFzay0+dGtfY2xpZW50OworCWludCBzdGF0dXMgPSB0YXNrLT50a19zdGF0dXM7CisKKwl0YXNrLT50a19zdGF0dXMgPSAwOworCWlmIChzdGF0dXMgPj0gMCkgeworCQljbG50LT5jbF9zdGF0cy0+bmV0cmVjb25uKys7CisJCXRhc2stPnRrX2FjdGlvbiA9IGNhbGxfdHJhbnNtaXQ7CisJCXJldHVybjsKKwl9CisKKwkvKiBTb21ldGhpbmcgZmFpbGVkOiB3ZSBtYXkgaGF2ZSB0byByZWJpbmQgKi8KKwlpZiAoY2xudC0+Y2xfYXV0b2JpbmQpCisJCWNsbnQtPmNsX3BvcnQgPSAwOworCXN3aXRjaCAoc3RhdHVzKSB7CisJY2FzZSAtRU5PVENPTk46CisJY2FzZSAtRVRJTUVET1VUOgorCWNhc2UgLUVBR0FJTjoKKwkJdGFzay0+dGtfYWN0aW9uID0gKGNsbnQtPmNsX3BvcnQgPT0gMCkgPyBjYWxsX2JpbmQgOiBjYWxsX2Nvbm5lY3Q7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJwY19leGl0KHRhc2ssIC1FSU8pOworCX0KK30KKworLyoKKyAqIDUuCVRyYW5zbWl0IHRoZSBSUEMgcmVxdWVzdCwgYW5kIHdhaXQgZm9yIHJlcGx5CisgKi8KK3N0YXRpYyB2b2lkCitjYWxsX3RyYW5zbWl0KHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlkcHJpbnRrKCJSUEM6ICU0ZCBjYWxsX3RyYW5zbWl0IChzdGF0dXMgJWQpXG4iLCAKKwkJCQl0YXNrLT50a19waWQsIHRhc2stPnRrX3N0YXR1cyk7CisKKwl0YXNrLT50a19hY3Rpb24gPSBjYWxsX3N0YXR1czsKKwlpZiAodGFzay0+dGtfc3RhdHVzIDwgMCkKKwkJcmV0dXJuOworCXRhc2stPnRrX3N0YXR1cyA9IHhwcnRfcHJlcGFyZV90cmFuc21pdCh0YXNrKTsKKwlpZiAodGFzay0+dGtfc3RhdHVzICE9IDApCisJCXJldHVybjsKKwkvKiBFbmNvZGUgaGVyZSBzbyB0aGF0IHJwY3NlY19nc3MgY2FuIHVzZSBjb3JyZWN0IHNlcXVlbmNlIG51bWJlci4gKi8KKwlpZiAoIXRhc2stPnRrX3Jxc3RwLT5ycV9ieXRlc19zZW50KQorCQljYWxsX2VuY29kZSh0YXNrKTsKKwlpZiAodGFzay0+dGtfc3RhdHVzIDwgMCkKKwkJcmV0dXJuOworCXhwcnRfdHJhbnNtaXQodGFzayk7CisJaWYgKHRhc2stPnRrX3N0YXR1cyA8IDApCisJCXJldHVybjsKKwlpZiAoIXRhc2stPnRrX21zZy5ycGNfcHJvYy0+cF9kZWNvZGUpIHsKKwkJdGFzay0+dGtfYWN0aW9uID0gTlVMTDsKKwkJcnBjX3dha2VfdXBfdGFzayh0YXNrKTsKKwl9Cit9CisKKy8qCisgKiA2LglTb3J0IG91dCB0aGUgUlBDIGNhbGwgc3RhdHVzCisgKi8KK3N0YXRpYyB2b2lkCitjYWxsX3N0YXR1cyhzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IHJwY19jbG50CSpjbG50ID0gdGFzay0+dGtfY2xpZW50OworCXN0cnVjdCBycGNfcnFzdAkqcmVxID0gdGFzay0+dGtfcnFzdHA7CisJaW50CQlzdGF0dXM7CisKKwlpZiAocmVxLT5ycV9yZWNlaXZlZCA+IDAgJiYgIXJlcS0+cnFfYnl0ZXNfc2VudCkKKwkJdGFzay0+dGtfc3RhdHVzID0gcmVxLT5ycV9yZWNlaXZlZDsKKworCWRwcmludGsoIlJQQzogJTRkIGNhbGxfc3RhdHVzIChzdGF0dXMgJWQpXG4iLCAKKwkJCQl0YXNrLT50a19waWQsIHRhc2stPnRrX3N0YXR1cyk7CisKKwlzdGF0dXMgPSB0YXNrLT50a19zdGF0dXM7CisJaWYgKHN0YXR1cyA+PSAwKSB7CisJCXRhc2stPnRrX2FjdGlvbiA9IGNhbGxfZGVjb2RlOworCQlyZXR1cm47CisJfQorCisJdGFzay0+dGtfc3RhdHVzID0gMDsKKwlzd2l0Y2goc3RhdHVzKSB7CisJY2FzZSAtRVRJTUVET1VUOgorCQl0YXNrLT50a19hY3Rpb24gPSBjYWxsX3RpbWVvdXQ7CisJCWJyZWFrOworCWNhc2UgLUVDT05OUkVGVVNFRDoKKwljYXNlIC1FTk9UQ09OTjoKKwkJcmVxLT5ycV9ieXRlc19zZW50ID0gMDsKKwkJaWYgKGNsbnQtPmNsX2F1dG9iaW5kKQorCQkJY2xudC0+Y2xfcG9ydCA9IDA7CisJCXRhc2stPnRrX2FjdGlvbiA9IGNhbGxfYmluZDsKKwkJYnJlYWs7CisJY2FzZSAtRUFHQUlOOgorCQl0YXNrLT50a19hY3Rpb24gPSBjYWxsX3RyYW5zbWl0OworCQlicmVhazsKKwljYXNlIC1FSU86CisJCS8qIHNodXRkb3duIG9yIHNvZnQgdGltZW91dCAqLworCQlycGNfZXhpdCh0YXNrLCBzdGF0dXMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoY2xudC0+Y2xfY2hhdHR5KQorCQkJcHJpbnRrKCIlczogUlBDIGNhbGwgcmV0dXJuZWQgZXJyb3IgJWRcbiIsCisJCQkgICAgICAgY2xudC0+Y2xfcHJvdG5hbWUsIC1zdGF0dXMpOworCQlycGNfZXhpdCh0YXNrLCBzdGF0dXMpOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiA2YS4JSGFuZGxlIFJQQyB0aW1lb3V0CisgKiAJV2UgZG8gbm90IHJlbGVhc2UgdGhlIHJlcXVlc3Qgc2xvdCwgc28gd2Uga2VlcCB1c2luZyB0aGUKKyAqCXNhbWUgWElEIGZvciBhbGwgcmV0cmFuc21pdHMuCisgKi8KK3N0YXRpYyB2b2lkCitjYWxsX3RpbWVvdXQoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBycGNfY2xudAkqY2xudCA9IHRhc2stPnRrX2NsaWVudDsKKworCWlmICh4cHJ0X2FkanVzdF90aW1lb3V0KHRhc2stPnRrX3Jxc3RwKSA9PSAwKSB7CisJCWRwcmludGsoIlJQQzogJTRkIGNhbGxfdGltZW91dCAobWlub3IpXG4iLCB0YXNrLT50a19waWQpOworCQlnb3RvIHJldHJ5OworCX0KKworCWRwcmludGsoIlJQQzogJTRkIGNhbGxfdGltZW91dCAobWFqb3IpXG4iLCB0YXNrLT50a19waWQpOworCWlmIChSUENfSVNfU09GVCh0YXNrKSkgeworCQlpZiAoY2xudC0+Y2xfY2hhdHR5KQorCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogc2VydmVyICVzIG5vdCByZXNwb25kaW5nLCB0aW1lZCBvdXRcbiIsCisJCQkJY2xudC0+Y2xfcHJvdG5hbWUsIGNsbnQtPmNsX3NlcnZlcik7CisJCXJwY19leGl0KHRhc2ssIC1FSU8pOworCQlyZXR1cm47CisJfQorCisJaWYgKGNsbnQtPmNsX2NoYXR0eSAmJiAhKHRhc2stPnRrX2ZsYWdzICYgUlBDX0NBTExfTUFKT1JTRUVOKSkgeworCQl0YXNrLT50a19mbGFncyB8PSBSUENfQ0FMTF9NQUpPUlNFRU47CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHNlcnZlciAlcyBub3QgcmVzcG9uZGluZywgc3RpbGwgdHJ5aW5nXG4iLAorCQkJY2xudC0+Y2xfcHJvdG5hbWUsIGNsbnQtPmNsX3NlcnZlcik7CisJfQorCWlmIChjbG50LT5jbF9hdXRvYmluZCkKKwkJY2xudC0+Y2xfcG9ydCA9IDA7CisKK3JldHJ5OgorCWNsbnQtPmNsX3N0YXRzLT5ycGNyZXRyYW5zKys7CisJdGFzay0+dGtfYWN0aW9uID0gY2FsbF9iaW5kOworCXRhc2stPnRrX3N0YXR1cyA9IDA7Cit9CisKKy8qCisgKiA3LglEZWNvZGUgdGhlIFJQQyByZXBseQorICovCitzdGF0aWMgdm9pZAorY2FsbF9kZWNvZGUoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBycGNfY2xudAkqY2xudCA9IHRhc2stPnRrX2NsaWVudDsKKwlzdHJ1Y3QgcnBjX3Jxc3QJKnJlcSA9IHRhc2stPnRrX3Jxc3RwOworCWt4ZHJwcm9jX3QJZGVjb2RlID0gdGFzay0+dGtfbXNnLnJwY19wcm9jLT5wX2RlY29kZTsKKwl1MzIJCSpwOworCisJZHByaW50aygiUlBDOiAlNGQgY2FsbF9kZWNvZGUgKHN0YXR1cyAlZClcbiIsIAorCQkJCXRhc2stPnRrX3BpZCwgdGFzay0+dGtfc3RhdHVzKTsKKworCWlmIChjbG50LT5jbF9jaGF0dHkgJiYgKHRhc2stPnRrX2ZsYWdzICYgUlBDX0NBTExfTUFKT1JTRUVOKSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBzZXJ2ZXIgJXMgT0tcbiIsCisJCQljbG50LT5jbF9wcm90bmFtZSwgY2xudC0+Y2xfc2VydmVyKTsKKwkJdGFzay0+dGtfZmxhZ3MgJj0gflJQQ19DQUxMX01BSk9SU0VFTjsKKwl9CisKKwlpZiAodGFzay0+dGtfc3RhdHVzIDwgMTIpIHsKKwkJaWYgKCFSUENfSVNfU09GVCh0YXNrKSkgeworCQkJdGFzay0+dGtfYWN0aW9uID0gY2FsbF9iaW5kOworCQkJY2xudC0+Y2xfc3RhdHMtPnJwY3JldHJhbnMrKzsKKwkJCWdvdG8gb3V0X3JldHJ5OworCQl9CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0b28gc21hbGwgUlBDIHJlcGx5IHNpemUgKCVkIGJ5dGVzKVxuIiwKKwkJCWNsbnQtPmNsX3Byb3RuYW1lLCB0YXNrLT50a19zdGF0dXMpOworCQlycGNfZXhpdCh0YXNrLCAtRUlPKTsKKwkJcmV0dXJuOworCX0KKworCXJlcS0+cnFfcmN2X2J1Zi5sZW4gPSByZXEtPnJxX3ByaXZhdGVfYnVmLmxlbjsKKworCS8qIENoZWNrIHRoYXQgdGhlIHNvZnRpcnEgcmVjZWl2ZSBidWZmZXIgaXMgdmFsaWQgKi8KKwlXQVJOX09OKG1lbWNtcCgmcmVxLT5ycV9yY3ZfYnVmLCAmcmVxLT5ycV9wcml2YXRlX2J1ZiwKKwkJCQlzaXplb2YocmVxLT5ycV9yY3ZfYnVmKSkgIT0gMCk7CisKKwkvKiBWZXJpZnkgdGhlIFJQQyBoZWFkZXIgKi8KKwlpZiAoIShwID0gY2FsbF92ZXJpZnkodGFzaykpKSB7CisJCWlmICh0YXNrLT50a19hY3Rpb24gPT0gTlVMTCkKKwkJCXJldHVybjsKKwkJZ290byBvdXRfcmV0cnk7CisJfQorCisJdGFzay0+dGtfYWN0aW9uID0gTlVMTDsKKworCWlmIChkZWNvZGUpCisJCXRhc2stPnRrX3N0YXR1cyA9IHJwY2F1dGhfdW53cmFwX3Jlc3AodGFzaywgZGVjb2RlLCByZXEsIHAsCisJCQkJCQkgICAgICB0YXNrLT50a19tc2cucnBjX3Jlc3ApOworCWRwcmludGsoIlJQQzogJTRkIGNhbGxfZGVjb2RlIHJlc3VsdCAlZFxuIiwgdGFzay0+dGtfcGlkLAorCQkJCQl0YXNrLT50a19zdGF0dXMpOworCXJldHVybjsKK291dF9yZXRyeToKKwlyZXEtPnJxX3JlY2VpdmVkID0gcmVxLT5ycV9wcml2YXRlX2J1Zi5sZW4gPSAwOworCXRhc2stPnRrX3N0YXR1cyA9IDA7Cit9CisKKy8qCisgKiA4LglSZWZyZXNoIHRoZSBjcmVkZW50aWFscyBpZiByZWplY3RlZCBieSB0aGUgc2VydmVyCisgKi8KK3N0YXRpYyB2b2lkCitjYWxsX3JlZnJlc2goc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCWRwcmludGsoIlJQQzogJTRkIGNhbGxfcmVmcmVzaFxuIiwgdGFzay0+dGtfcGlkKTsKKworCXhwcnRfcmVsZWFzZSh0YXNrKTsJLyogTXVzdCBkbyB0byBvYnRhaW4gbmV3IFhJRCAqLworCXRhc2stPnRrX2FjdGlvbiA9IGNhbGxfcmVmcmVzaHJlc3VsdDsKKwl0YXNrLT50a19zdGF0dXMgPSAwOworCXRhc2stPnRrX2NsaWVudC0+Y2xfc3RhdHMtPnJwY2F1dGhyZWZyZXNoKys7CisJcnBjYXV0aF9yZWZyZXNoY3JlZCh0YXNrKTsKK30KKworLyoKKyAqIDhhLglQcm9jZXNzIHRoZSByZXN1bHRzIG9mIGEgY3JlZGVudGlhbCByZWZyZXNoCisgKi8KK3N0YXRpYyB2b2lkCitjYWxsX3JlZnJlc2hyZXN1bHQoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCWludCBzdGF0dXMgPSB0YXNrLT50a19zdGF0dXM7CisJZHByaW50aygiUlBDOiAlNGQgY2FsbF9yZWZyZXNocmVzdWx0IChzdGF0dXMgJWQpXG4iLCAKKwkJCQl0YXNrLT50a19waWQsIHRhc2stPnRrX3N0YXR1cyk7CisKKwl0YXNrLT50a19zdGF0dXMgPSAwOworCXRhc2stPnRrX2FjdGlvbiA9IGNhbGxfcmVzZXJ2ZTsKKwlpZiAoc3RhdHVzID49IDAgJiYgcnBjYXV0aF91cHRvZGF0ZWNyZWQodGFzaykpCisJCXJldHVybjsKKwlpZiAoc3RhdHVzID09IC1FQUNDRVMpIHsKKwkJcnBjX2V4aXQodGFzaywgLUVBQ0NFUyk7CisJCXJldHVybjsKKwl9CisJdGFzay0+dGtfYWN0aW9uID0gY2FsbF9yZWZyZXNoOworCWlmIChzdGF0dXMgIT0gLUVUSU1FRE9VVCkKKwkJcnBjX2RlbGF5KHRhc2ssIDMqSFopOworCXJldHVybjsKK30KKworLyoKKyAqIENhbGwgaGVhZGVyIHNlcmlhbGl6YXRpb24KKyAqLworc3RhdGljIHUzMiAqCitjYWxsX2hlYWRlcihzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IHJwY19jbG50ICpjbG50ID0gdGFzay0+dGtfY2xpZW50OworCXN0cnVjdCBycGNfeHBydCAqeHBydCA9IGNsbnQtPmNsX3hwcnQ7CisJc3RydWN0IHJwY19ycXN0CSpyZXEgPSB0YXNrLT50a19ycXN0cDsKKwl1MzIJCSpwID0gcmVxLT5ycV9zdmVjWzBdLmlvdl9iYXNlOworCisJLyogRklYTUU6IGNoZWNrIGJ1ZmZlciBzaXplPyAqLworCWlmICh4cHJ0LT5zdHJlYW0pCisJCSpwKysgPSAwOwkJLyogZmlsbCBpbiBsYXRlciAqLworCSpwKysgPSByZXEtPnJxX3hpZDsJCS8qIFhJRCAqLworCSpwKysgPSBodG9ubChSUENfQ0FMTCk7CQkvKiBDQUxMICovCisJKnArKyA9IGh0b25sKFJQQ19WRVJTSU9OKTsJLyogUlBDIHZlcnNpb24gKi8KKwkqcCsrID0gaHRvbmwoY2xudC0+Y2xfcHJvZyk7CS8qIHByb2dyYW0gbnVtYmVyICovCisJKnArKyA9IGh0b25sKGNsbnQtPmNsX3ZlcnMpOwkvKiBwcm9ncmFtIHZlcnNpb24gKi8KKwkqcCsrID0gaHRvbmwodGFzay0+dGtfbXNnLnJwY19wcm9jLT5wX3Byb2MpOwkvKiBwcm9jZWR1cmUgKi8KKwlyZXR1cm4gcnBjYXV0aF9tYXJzaGNyZWQodGFzaywgcCk7Cit9CisKKy8qCisgKiBSZXBseSBoZWFkZXIgdmVyaWZpY2F0aW9uCisgKi8KK3N0YXRpYyB1MzIgKgorY2FsbF92ZXJpZnkoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBrdmVjICppb3YgPSAmdGFzay0+dGtfcnFzdHAtPnJxX3Jjdl9idWYuaGVhZFswXTsKKwlpbnQgbGVuID0gdGFzay0+dGtfcnFzdHAtPnJxX3Jjdl9idWYubGVuID4+IDI7CisJdTMyCSpwID0gaW92LT5pb3ZfYmFzZSwgbjsKKwlpbnQgZXJyb3IgPSAtRUFDQ0VTOworCisJaWYgKChsZW4gLT0gMykgPCAwKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwlwICs9IDE7CS8qIHNraXAgWElEICovCisKKwlpZiAoKG4gPSBudG9obCgqcCsrKSkgIT0gUlBDX1JFUExZKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNhbGxfdmVyaWZ5OiBub3QgYW4gUlBDIHJlcGx5OiAleFxuIiwgbik7CisJCWdvdG8gb3V0X3JldHJ5OworCX0KKwlpZiAoKG4gPSBudG9obCgqcCsrKSkgIT0gUlBDX01TR19BQ0NFUFRFRCkgeworCQlpZiAoLS1sZW4gPCAwKQorCQkJZ290byBvdXRfb3ZlcmZsb3c7CisJCXN3aXRjaCAoKG4gPSBudG9obCgqcCsrKSkpIHsKKwkJCWNhc2UgUlBDX0FVVEhfRVJST1I6CisJCQkJYnJlYWs7CisJCQljYXNlIFJQQ19NSVNNQVRDSDoKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUlBDIGNhbGwgdmVyc2lvbiBtaXNtYXRjaCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJZ290byBvdXRfZWlvOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUlBDIGNhbGwgcmVqZWN0ZWQsIHVua25vd24gZXJyb3I6ICV4XG4iLCBfX0ZVTkNUSU9OX18sIG4pOworCQkJCWdvdG8gb3V0X2VpbzsKKwkJfQorCQlpZiAoLS1sZW4gPCAwKQorCQkJZ290byBvdXRfb3ZlcmZsb3c7CisJCXN3aXRjaCAoKG4gPSBudG9obCgqcCsrKSkpIHsKKwkJY2FzZSBSUENfQVVUSF9SRUpFQ1RFRENSRUQ6CisJCWNhc2UgUlBDX0FVVEhfUkVKRUNURURWRVJGOgorCQljYXNlIFJQQ1NFQ19HU1NfQ1JFRFBST0JMRU06CisJCWNhc2UgUlBDU0VDX0dTU19DVFhQUk9CTEVNOgorCQkJaWYgKCF0YXNrLT50a19jcmVkX3JldHJ5KQorCQkJCWJyZWFrOworCQkJdGFzay0+dGtfY3JlZF9yZXRyeS0tOworCQkJZHByaW50aygiUlBDOiAlNGQgY2FsbF92ZXJpZnk6IHJldHJ5IHN0YWxlIGNyZWRzXG4iLAorCQkJCQkJCXRhc2stPnRrX3BpZCk7CisJCQlycGNhdXRoX2ludmFsY3JlZCh0YXNrKTsKKwkJCXRhc2stPnRrX2FjdGlvbiA9IGNhbGxfcmVmcmVzaDsKKwkJCXJldHVybiBOVUxMOworCQljYXNlIFJQQ19BVVRIX0JBRENSRUQ6CisJCWNhc2UgUlBDX0FVVEhfQkFEVkVSRjoKKwkJCS8qIHBvc3NpYmx5IGdhcmJsZWQgY3JlZC92ZXJmPyAqLworCQkJaWYgKCF0YXNrLT50a19nYXJiX3JldHJ5KQorCQkJCWJyZWFrOworCQkJdGFzay0+dGtfZ2FyYl9yZXRyeS0tOworCQkJZHByaW50aygiUlBDOiAlNGQgY2FsbF92ZXJpZnk6IHJldHJ5IGdhcmJsZWQgY3JlZHNcbiIsCisJCQkJCQkJdGFzay0+dGtfcGlkKTsKKwkJCXRhc2stPnRrX2FjdGlvbiA9IGNhbGxfYmluZDsKKwkJCXJldHVybiBOVUxMOworCQljYXNlIFJQQ19BVVRIX1RPT1dFQUs6CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgImNhbGxfdmVyaWZ5OiBzZXJ2ZXIgcmVxdWlyZXMgc3Ryb25nZXIgIgorCQkJICAgICAgICJhdXRoZW50aWNhdGlvbi5cbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjYWxsX3ZlcmlmeTogdW5rbm93biBhdXRoIGVycm9yOiAleFxuIiwgbik7CisJCQllcnJvciA9IC1FSU87CisJCX0KKwkJZHByaW50aygiUlBDOiAlNGQgY2FsbF92ZXJpZnk6IGNhbGwgcmVqZWN0ZWQgJWRcbiIsCisJCQkJCQl0YXNrLT50a19waWQsIG4pOworCQlnb3RvIG91dF9lcnI7CisJfQorCWlmICghKHAgPSBycGNhdXRoX2NoZWNrdmVyZih0YXNrLCBwKSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2FsbF92ZXJpZnk6IGF1dGggY2hlY2sgZmFpbGVkXG4iKTsKKwkJZ290byBvdXRfcmV0cnk7CQkvKiBiYWQgdmVyaWZpZXIsIHJldHJ5ICovCisJfQorCWxlbiA9IHAgLSAodTMyICopaW92LT5pb3ZfYmFzZSAtIDE7CisJaWYgKGxlbiA8IDApCisJCWdvdG8gb3V0X292ZXJmbG93OworCXN3aXRjaCAoKG4gPSBudG9obCgqcCsrKSkpIHsKKwljYXNlIFJQQ19TVUNDRVNTOgorCQlyZXR1cm4gcDsKKwljYXNlIFJQQ19QUk9HX1VOQVZBSUw6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJQQzogY2FsbF92ZXJpZnk6IHByb2dyYW0gJXUgaXMgdW5zdXBwb3J0ZWQgYnkgc2VydmVyICVzXG4iLAorCQkJCSh1bnNpZ25lZCBpbnQpdGFzay0+dGtfY2xpZW50LT5jbF9wcm9nLAorCQkJCXRhc2stPnRrX2NsaWVudC0+Y2xfc2VydmVyKTsKKwkJZ290byBvdXRfZWlvOworCWNhc2UgUlBDX1BST0dfTUlTTUFUQ0g6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJQQzogY2FsbF92ZXJpZnk6IHByb2dyYW0gJXUsIHZlcnNpb24gJXUgdW5zdXBwb3J0ZWQgYnkgc2VydmVyICVzXG4iLAorCQkJCSh1bnNpZ25lZCBpbnQpdGFzay0+dGtfY2xpZW50LT5jbF9wcm9nLAorCQkJCSh1bnNpZ25lZCBpbnQpdGFzay0+dGtfY2xpZW50LT5jbF92ZXJzLAorCQkJCXRhc2stPnRrX2NsaWVudC0+Y2xfc2VydmVyKTsKKwkJZ290byBvdXRfZWlvOworCWNhc2UgUlBDX1BST0NfVU5BVkFJTDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUlBDOiBjYWxsX3ZlcmlmeTogcHJvYyAlcCB1bnN1cHBvcnRlZCBieSBwcm9ncmFtICV1LCB2ZXJzaW9uICV1IG9uIHNlcnZlciAlc1xuIiwKKwkJCQl0YXNrLT50a19tc2cucnBjX3Byb2MsCisJCQkJdGFzay0+dGtfY2xpZW50LT5jbF9wcm9nLAorCQkJCXRhc2stPnRrX2NsaWVudC0+Y2xfdmVycywKKwkJCQl0YXNrLT50a19jbGllbnQtPmNsX3NlcnZlcik7CisJCWdvdG8gb3V0X2VpbzsKKwljYXNlIFJQQ19HQVJCQUdFX0FSR1M6CisJCWRwcmludGsoIlJQQzogJTRkICVzOiBzZXJ2ZXIgc2F3IGdhcmJhZ2VcbiIsIHRhc2stPnRrX3BpZCwgX19GVU5DVElPTl9fKTsKKwkJYnJlYWs7CQkJLyogcmV0cnkgKi8KKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJjYWxsX3ZlcmlmeTogc2VydmVyIGFjY2VwdCBzdGF0dXM6ICV4XG4iLCBuKTsKKwkJLyogQWxzbyByZXRyeSAqLworCX0KKworb3V0X3JldHJ5OgorCXRhc2stPnRrX2NsaWVudC0+Y2xfc3RhdHMtPnJwY2dhcmJhZ2UrKzsKKwlpZiAodGFzay0+dGtfZ2FyYl9yZXRyeSkgeworCQl0YXNrLT50a19nYXJiX3JldHJ5LS07CisJCWRwcmludGsoS0VSTl9XQVJOSU5HICJSUEMgJXM6IHJldHJ5aW5nICU0ZFxuIiwgX19GVU5DVElPTl9fLCB0YXNrLT50a19waWQpOworCQl0YXNrLT50a19hY3Rpb24gPSBjYWxsX2JpbmQ7CisJCXJldHVybiBOVUxMOworCX0KKwlwcmludGsoS0VSTl9XQVJOSU5HICJSUEMgJXM6IHJldHJ5IGZhaWxlZCwgZXhpdCBFSU9cbiIsIF9fRlVOQ1RJT05fXyk7CitvdXRfZWlvOgorCWVycm9yID0gLUVJTzsKK291dF9lcnI6CisJcnBjX2V4aXQodGFzaywgZXJyb3IpOworCXJldHVybiBOVUxMOworb3V0X292ZXJmbG93OgorCXByaW50ayhLRVJOX1dBUk5JTkcgIlJQQyAlczogc2VydmVyIHJlcGx5IHdhcyB0cnVuY2F0ZWQuXG4iLCBfX0ZVTkNUSU9OX18pOworCWdvdG8gb3V0X3JldHJ5OworfQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9wbWFwX2NsbnQuYyBiL25ldC9zdW5ycGMvcG1hcF9jbG50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBiMWQyYwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zdW5ycGMvcG1hcF9jbG50LmMKQEAgLTAsMCArMSwyOTggQEAKKy8qCisgKiBsaW51eC9uZXQvc3VucnBjL3BtYXAuYworICoKKyAqIFBvcnRtYXBwZXIgY2xpZW50LgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3hwcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc2NoZWQuaD4KKworI2lmZGVmIFJQQ19ERUJVRworIyBkZWZpbmUgUlBDREJHX0ZBQ0lMSVRZCVJQQ0RCR19QTUFQCisjZW5kaWYKKworI2RlZmluZSBQTUFQX1NFVAkJMQorI2RlZmluZSBQTUFQX1VOU0VUCQkyCisjZGVmaW5lIFBNQVBfR0VUUE9SVAkJMworCitzdGF0aWMgc3RydWN0IHJwY19wcm9jaW5mbwlwbWFwX3Byb2NlZHVyZXNbXTsKK3N0YXRpYyBzdHJ1Y3QgcnBjX2NsbnQgKglwbWFwX2NyZWF0ZShjaGFyICosIHN0cnVjdCBzb2NrYWRkcl9pbiAqLCBpbnQpOworc3RhdGljIHZvaWQJCQlwbWFwX2dldHBvcnRfZG9uZShzdHJ1Y3QgcnBjX3Rhc2sgKik7CitzdGF0aWMgc3RydWN0IHJwY19wcm9ncmFtCXBtYXBfcHJvZ3JhbTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socG1hcF9sb2NrKTsKKworLyoKKyAqIE9idGFpbiB0aGUgcG9ydCBmb3IgYSBnaXZlbiBSUEMgc2VydmljZSBvbiBhIGdpdmVuIGhvc3QuIFRoaXMgb25lIGNhbgorICogYmUgY2FsbGVkIGZvciBhbiBvbmdvaW5nIFJQQyByZXF1ZXN0LgorICovCit2b2lkCitycGNfZ2V0cG9ydChzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIHN0cnVjdCBycGNfY2xudCAqY2xudCkKK3sKKwlzdHJ1Y3QgcnBjX3BvcnRtYXAgKm1hcCA9IGNsbnQtPmNsX3BtYXA7CisJc3RydWN0IHNvY2thZGRyX2luICpzYXAgPSAmY2xudC0+Y2xfeHBydC0+YWRkcjsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MJPSAmcG1hcF9wcm9jZWR1cmVzW1BNQVBfR0VUUE9SVF0sCisJCS5ycGNfYXJncAk9IG1hcCwKKwkJLnJwY19yZXNwCT0gJmNsbnQtPmNsX3BvcnQsCisJCS5ycGNfY3JlZAk9IE5VTEwKKwl9OworCXN0cnVjdCBycGNfY2xudAkqcG1hcF9jbG50OworCXN0cnVjdCBycGNfdGFzawkqY2hpbGQ7CisKKwlkcHJpbnRrKCJSUEM6ICU0ZCBycGNfZ2V0cG9ydCglcywgJWQsICVkLCAlZClcbiIsCisJCQl0YXNrLT50a19waWQsIGNsbnQtPmNsX3NlcnZlciwKKwkJCW1hcC0+cG1fcHJvZywgbWFwLT5wbV92ZXJzLCBtYXAtPnBtX3Byb3QpOworCisJc3Bpbl9sb2NrKCZwbWFwX2xvY2spOworCWlmIChtYXAtPnBtX2JpbmRpbmcpIHsKKwkJcnBjX3NsZWVwX29uKCZtYXAtPnBtX2JpbmR3YWl0LCB0YXNrLCBOVUxMLCBOVUxMKTsKKwkJc3Bpbl91bmxvY2soJnBtYXBfbG9jayk7CisJCXJldHVybjsKKwl9CisJbWFwLT5wbV9iaW5kaW5nID0gMTsKKwlzcGluX3VubG9jaygmcG1hcF9sb2NrKTsKKworCXBtYXBfY2xudCA9IHBtYXBfY3JlYXRlKGNsbnQtPmNsX3NlcnZlciwgc2FwLCBtYXAtPnBtX3Byb3QpOworCWlmIChJU19FUlIocG1hcF9jbG50KSkgeworCQl0YXNrLT50a19zdGF0dXMgPSBQVFJfRVJSKHBtYXBfY2xudCk7CisJCWdvdG8gYmFpbG91dDsKKwl9CisJdGFzay0+dGtfc3RhdHVzID0gMDsKKworCS8qCisJICogTm90ZTogcnBjX25ld19jaGlsZCB3aWxsIHJlbGVhc2UgY2xpZW50IGFmdGVyIGEgZmFpbHVyZS4KKwkgKi8KKwlpZiAoIShjaGlsZCA9IHJwY19uZXdfY2hpbGQocG1hcF9jbG50LCB0YXNrKSkpCisJCWdvdG8gYmFpbG91dDsKKworCS8qIFNldHVwIHRoZSBjYWxsIGluZm8gc3RydWN0ICovCisJcnBjX2NhbGxfc2V0dXAoY2hpbGQsICZtc2csIDApOworCisJLyogLi4uIGFuZCBydW4gdGhlIGNoaWxkIHRhc2sgKi8KKwlycGNfcnVuX2NoaWxkKHRhc2ssIGNoaWxkLCBwbWFwX2dldHBvcnRfZG9uZSk7CisJcmV0dXJuOworCitiYWlsb3V0OgorCXNwaW5fbG9jaygmcG1hcF9sb2NrKTsKKwltYXAtPnBtX2JpbmRpbmcgPSAwOworCXJwY193YWtlX3VwKCZtYXAtPnBtX2JpbmR3YWl0KTsKKwlzcGluX3VubG9jaygmcG1hcF9sb2NrKTsKKwl0YXNrLT50a19zdGF0dXMgPSAtRUlPOworCXRhc2stPnRrX2FjdGlvbiA9IE5VTEw7Cit9CisKKyNpZmRlZiBDT05GSUdfUk9PVF9ORlMKK2ludAorcnBjX2dldHBvcnRfZXh0ZXJuYWwoc3RydWN0IHNvY2thZGRyX2luICpzaW4sIF9fdTMyIHByb2csIF9fdTMyIHZlcnMsIGludCBwcm90KQoreworCXN0cnVjdCBycGNfcG9ydG1hcCBtYXAgPSB7CisJCS5wbV9wcm9nCT0gcHJvZywKKwkJLnBtX3ZlcnMJPSB2ZXJzLAorCQkucG1fcHJvdAk9IHByb3QsCisJCS5wbV9wb3J0CT0gMAorCX07CisJc3RydWN0IHJwY19jbG50CSpwbWFwX2NsbnQ7CisJY2hhcgkJaG9zdG5hbWVbMzJdOworCWludAkJc3RhdHVzOworCisJZHByaW50aygiUlBDOiAgICAgIHJwY19nZXRwb3J0X2V4dGVybmFsKCV1LiV1LiV1LiV1LCAlZCwgJWQsICVkKVxuIiwKKwkJCU5JUFFVQUQoc2luLT5zaW5fYWRkci5zX2FkZHIpLCBwcm9nLCB2ZXJzLCBwcm90KTsKKworCXNwcmludGYoaG9zdG5hbWUsICIldS4ldS4ldS4ldSIsIE5JUFFVQUQoc2luLT5zaW5fYWRkci5zX2FkZHIpKTsKKwlwbWFwX2NsbnQgPSBwbWFwX2NyZWF0ZShob3N0bmFtZSwgc2luLCBwcm90KTsKKwlpZiAoSVNfRVJSKHBtYXBfY2xudCkpCisJCXJldHVybiBQVFJfRVJSKHBtYXBfY2xudCk7CisKKwkvKiBTZXR1cCB0aGUgY2FsbCBpbmZvIHN0cnVjdCAqLworCXN0YXR1cyA9IHJwY19jYWxsKHBtYXBfY2xudCwgUE1BUF9HRVRQT1JULCAmbWFwLCAmbWFwLnBtX3BvcnQsIDApOworCisJaWYgKHN0YXR1cyA+PSAwKSB7CisJCWlmIChtYXAucG1fcG9ydCAhPSAwKQorCQkJcmV0dXJuIG1hcC5wbV9wb3J0OworCQlzdGF0dXMgPSAtRUFDQ0VTOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitwbWFwX2dldHBvcnRfZG9uZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IHJwY19jbG50CSpjbG50ID0gdGFzay0+dGtfY2xpZW50OworCXN0cnVjdCBycGNfcG9ydG1hcCAqbWFwID0gY2xudC0+Y2xfcG1hcDsKKworCWRwcmludGsoIlJQQzogJTRkIHBtYXBfZ2V0cG9ydF9kb25lKHN0YXR1cyAlZCwgcG9ydCAlZClcbiIsCisJCQl0YXNrLT50a19waWQsIHRhc2stPnRrX3N0YXR1cywgY2xudC0+Y2xfcG9ydCk7CisJaWYgKHRhc2stPnRrX3N0YXR1cyA8IDApIHsKKwkJLyogTWFrZSB0aGUgY2FsbGluZyB0YXNrIGV4aXQgd2l0aCBhbiBlcnJvciAqLworCQl0YXNrLT50a19hY3Rpb24gPSBOVUxMOworCX0gZWxzZSBpZiAoY2xudC0+Y2xfcG9ydCA9PSAwKSB7CisJCS8qIFByb2dyYW0gbm90IHJlZ2lzdGVyZWQgKi8KKwkJdGFzay0+dGtfc3RhdHVzID0gLUVBQ0NFUzsKKwkJdGFzay0+dGtfYWN0aW9uID0gTlVMTDsKKwl9IGVsc2UgeworCQkvKiBieXRlLXN3YXAgcG9ydCBudW1iZXIgZmlyc3QgKi8KKwkJY2xudC0+Y2xfcG9ydCA9IGh0b25zKGNsbnQtPmNsX3BvcnQpOworCQljbG50LT5jbF94cHJ0LT5hZGRyLnNpbl9wb3J0ID0gY2xudC0+Y2xfcG9ydDsKKwl9CisJc3Bpbl9sb2NrKCZwbWFwX2xvY2spOworCW1hcC0+cG1fYmluZGluZyA9IDA7CisJcnBjX3dha2VfdXAoJm1hcC0+cG1fYmluZHdhaXQpOworCXNwaW5fdW5sb2NrKCZwbWFwX2xvY2spOworfQorCisvKgorICogU2V0IG9yIHVuc2V0IGEgcG9ydCByZWdpc3RyYXRpb24gd2l0aCB0aGUgbG9jYWwgcG9ydG1hcHBlci4KKyAqIHBvcnQgPT0gMCBtZWFucyB1bnJlZ2lzdGVyLCBwb3J0ICE9IDAgbWVhbnMgcmVnaXN0ZXIuCisgKi8KK2ludAorcnBjX3JlZ2lzdGVyKHUzMiBwcm9nLCB1MzIgdmVycywgaW50IHByb3QsIHVuc2lnbmVkIHNob3J0IHBvcnQsIGludCAqb2theSkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4Jc2luOworCXN0cnVjdCBycGNfcG9ydG1hcAltYXA7CisJc3RydWN0IHJwY19jbG50CQkqcG1hcF9jbG50OworCWludCBlcnJvciA9IDA7CisKKwlkcHJpbnRrKCJSUEM6IHJlZ2lzdGVyaW5nICglZCwgJWQsICVkLCAlZCkgd2l0aCBwb3J0bWFwcGVyLlxuIiwKKwkJCXByb2csIHZlcnMsIHByb3QsIHBvcnQpOworCisJc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNpbi5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spOworCXBtYXBfY2xudCA9IHBtYXBfY3JlYXRlKCJsb2NhbGhvc3QiLCAmc2luLCBJUFBST1RPX1VEUCk7CisJaWYgKElTX0VSUihwbWFwX2NsbnQpKSB7CisJCWVycm9yID0gUFRSX0VSUihwbWFwX2NsbnQpOworCQlkcHJpbnRrKCJSUEM6IGNvdWxkbid0IGNyZWF0ZSBwbWFwIGNsaWVudC4gRXJyb3IgPSAlZFxuIiwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJbWFwLnBtX3Byb2cgPSBwcm9nOworCW1hcC5wbV92ZXJzID0gdmVyczsKKwltYXAucG1fcHJvdCA9IHByb3Q7CisJbWFwLnBtX3BvcnQgPSBwb3J0OworCisJZXJyb3IgPSBycGNfY2FsbChwbWFwX2NsbnQsIHBvcnQ/IFBNQVBfU0VUIDogUE1BUF9VTlNFVCwKKwkJCQkJJm1hcCwgb2theSwgMCk7CisKKwlpZiAoZXJyb3IgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJSUEM6IGZhaWxlZCB0byBjb250YWN0IHBvcnRtYXAgKGVycm5vICVkKS5cbiIsCisJCQllcnJvcik7CisJfQorCWRwcmludGsoIlJQQzogcmVnaXN0cmF0aW9uIHN0YXR1cyAlZC8lZFxuIiwgZXJyb3IsICpva2F5KTsKKworCS8qIENsaWVudCBkZWxldGVkIGF1dG9tYXRpY2FsbHkgYmVjYXVzZSBjbF9vbmVzaG90ID09IDEgKi8KKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnBjX2NsbnQgKgorcG1hcF9jcmVhdGUoY2hhciAqaG9zdG5hbWUsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc3J2YWRkciwgaW50IHByb3RvKQoreworCXN0cnVjdCBycGNfeHBydAkqeHBydDsKKwlzdHJ1Y3QgcnBjX2NsbnQJKmNsbnQ7CisKKwkvKiBwcmludGsoInBtYXA6IGNyZWF0ZSB4cHJ0XG4iKTsgKi8KKwl4cHJ0ID0geHBydF9jcmVhdGVfcHJvdG8ocHJvdG8sIHNydmFkZHIsIE5VTEwpOworCWlmIChJU19FUlIoeHBydCkpCisJCXJldHVybiAoc3RydWN0IHJwY19jbG50ICopeHBydDsKKwl4cHJ0LT5hZGRyLnNpbl9wb3J0ID0gaHRvbnMoUlBDX1BNQVBfUE9SVCk7CisKKwkvKiBwcmludGsoInBtYXA6IGNyZWF0ZSBjbG50XG4iKTsgKi8KKwljbG50ID0gcnBjX2NyZWF0ZV9jbGllbnQoeHBydCwgaG9zdG5hbWUsCisJCQkJJnBtYXBfcHJvZ3JhbSwgUlBDX1BNQVBfVkVSU0lPTiwKKwkJCQlSUENfQVVUSF9VTklYKTsKKwlpZiAoSVNfRVJSKGNsbnQpKSB7CisJCXhwcnRfZGVzdHJveSh4cHJ0KTsKKwl9IGVsc2UgeworCQljbG50LT5jbF9zb2Z0cnRyeSA9IDE7CisJCWNsbnQtPmNsX2NoYXR0eSAgID0gMTsKKwkJY2xudC0+Y2xfb25lc2hvdCAgPSAxOworCX0KKwlyZXR1cm4gY2xudDsKK30KKworLyoKKyAqIFhEUiBlbmNvZGUvZGVjb2RlIGZ1bmN0aW9ucyBmb3IgUE1BUAorICovCitzdGF0aWMgaW50Cit4ZHJfZW5jb2RlX21hcHBpbmcoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IHJwY19wb3J0bWFwICptYXApCit7CisJZHByaW50aygiUlBDOiB4ZHJfZW5jb2RlX21hcHBpbmcoJWQsICVkLCAlZCwgJWQpXG4iLAorCQltYXAtPnBtX3Byb2csIG1hcC0+cG1fdmVycywgbWFwLT5wbV9wcm90LCBtYXAtPnBtX3BvcnQpOworCSpwKysgPSBodG9ubChtYXAtPnBtX3Byb2cpOworCSpwKysgPSBodG9ubChtYXAtPnBtX3ZlcnMpOworCSpwKysgPSBodG9ubChtYXAtPnBtX3Byb3QpOworCSpwKysgPSBodG9ubChtYXAtPnBtX3BvcnQpOworCisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit4ZHJfZGVjb2RlX3BvcnQoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgdW5zaWduZWQgc2hvcnQgKnBvcnRwKQoreworCSpwb3J0cCA9ICh1bnNpZ25lZCBzaG9ydCkgbnRvaGwoKnArKyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3hkcl9kZWNvZGVfYm9vbChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCB1bnNpZ25lZCBpbnQgKmJvb2xwKQoreworCSpib29scCA9ICh1bnNpZ25lZCBpbnQpIG50b2hsKCpwKyspOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHJwY19wcm9jaW5mbwlwbWFwX3Byb2NlZHVyZXNbXSA9IHsKK1tQTUFQX1NFVF0gPSB7CisJICAucF9wcm9jCQk9IFBNQVBfU0VULAorCSAgLnBfZW5jb2RlCQk9IChreGRycHJvY190KSB4ZHJfZW5jb2RlX21hcHBpbmcsCQorCSAgLnBfZGVjb2RlCQk9IChreGRycHJvY190KSB4ZHJfZGVjb2RlX2Jvb2wsCisJICAucF9idWZzaXoJCT0gNCwKKwkgIC5wX2NvdW50CQk9IDEsCisJfSwKK1tQTUFQX1VOU0VUXSA9IHsKKwkgIC5wX3Byb2MJCT0gUE1BUF9VTlNFVCwKKwkgIC5wX2VuY29kZQkJPSAoa3hkcnByb2NfdCkgeGRyX2VuY29kZV9tYXBwaW5nLAkKKwkgIC5wX2RlY29kZQkJPSAoa3hkcnByb2NfdCkgeGRyX2RlY29kZV9ib29sLAorCSAgLnBfYnVmc2l6CQk9IDQsCisJICAucF9jb3VudAkJPSAxLAorCX0sCitbUE1BUF9HRVRQT1JUXSA9IHsKKwkgIC5wX3Byb2MJCT0gUE1BUF9HRVRQT1JULAorCSAgLnBfZW5jb2RlCQk9IChreGRycHJvY190KSB4ZHJfZW5jb2RlX21hcHBpbmcsCisJICAucF9kZWNvZGUJCT0gKGt4ZHJwcm9jX3QpIHhkcl9kZWNvZGVfcG9ydCwKKwkgIC5wX2J1ZnNpegkJPSA0LAorCSAgLnBfY291bnQJCT0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbglwbWFwX3ZlcnNpb24yID0geworCS5udW1iZXIJCT0gMiwKKwkubnJwcm9jcwk9IDQsCisJLnByb2NzCQk9IHBtYXBfcHJvY2VkdXJlcworfTsKKworc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbiAqCXBtYXBfdmVyc2lvbltdID0geworCU5VTEwsCisJTlVMTCwKKwkmcG1hcF92ZXJzaW9uMgorfTsKKworc3RhdGljIHN0cnVjdCBycGNfc3RhdAkJcG1hcF9zdGF0czsKKworc3RhdGljIHN0cnVjdCBycGNfcHJvZ3JhbQlwbWFwX3Byb2dyYW0gPSB7CisJLm5hbWUJCT0gInBvcnRtYXAiLAorCS5udW1iZXIJCT0gUlBDX1BNQVBfUFJPR1JBTSwKKwkubnJ2ZXJzCQk9IEFSUkFZX1NJWkUocG1hcF92ZXJzaW9uKSwKKwkudmVyc2lvbgk9IHBtYXBfdmVyc2lvbiwKKwkuc3RhdHMJCT0gJnBtYXBfc3RhdHMsCit9OwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9ycGNfcGlwZS5jIGIvbmV0L3N1bnJwYy9ycGNfcGlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NGYyMjQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc3VucnBjL3JwY19waXBlLmMKQEAgLTAsMCArMSw4MzggQEAKKy8qCisgKiBuZXQvc3VucnBjL3JwY19waXBlLmMKKyAqCisgKiBVc2VybGFuZC9rZXJuZWwgaW50ZXJmYWNlIGZvciBycGNhdXRoX2dzcy4KKyAqIENvZGUgc2hhbWVsZXNzbHkgcGxhZ2lhcml6ZWQgZnJvbSBmcy9uZnNkL25mc2N0bC5jCisgKiBhbmQgZnMvZHJpdmVyZnMvaW5vZGUuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiwgVHJvbmQgTXlrbGVidXN0IDx0cm9uZC5teWtsZWJ1c3RAZnlzLnVpby5ubz4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9ycGNfcGlwZV9mcy5oPgorCitzdGF0aWMgc3RydWN0IHZmc21vdW50ICpycGNfbW91bnQ7CitzdGF0aWMgaW50IHJwY19tb3VudF9jb3VudDsKKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHJwY19waXBlX2ZzX3R5cGU7CisKKworc3RhdGljIGttZW1fY2FjaGVfdCAqcnBjX2lub2RlX2NhY2hlcDsKKworI2RlZmluZSBSUENfVVBDQUxMX1RJTUVPVVQgKDMwKkhaKQorCitzdGF0aWMgdm9pZAorX19ycGNfcHVyZ2VfdXBjYWxsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBlcnIpCit7CisJc3RydWN0IHJwY19pbm9kZSAqcnBjaSA9IFJQQ19JKGlub2RlKTsKKwlzdHJ1Y3QgcnBjX3BpcGVfbXNnICptc2c7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnJwY2ktPnBpcGUpKSB7CisJCW1zZyA9IGxpc3RfZW50cnkocnBjaS0+cGlwZS5uZXh0LCBzdHJ1Y3QgcnBjX3BpcGVfbXNnLCBsaXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmbXNnLT5saXN0KTsKKwkJbXNnLT5lcnJubyA9IGVycjsKKwkJcnBjaS0+b3BzLT5kZXN0cm95X21zZyhtc2cpOworCX0KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnJwY2ktPmluX3VwY2FsbCkpIHsKKwkJbXNnID0gbGlzdF9lbnRyeShycGNpLT5waXBlLm5leHQsIHN0cnVjdCBycGNfcGlwZV9tc2csIGxpc3QpOworCQlsaXN0X2RlbF9pbml0KCZtc2ctPmxpc3QpOworCQltc2ctPmVycm5vID0gZXJyOworCQlycGNpLT5vcHMtPmRlc3Ryb3lfbXNnKG1zZyk7CisJfQorCXJwY2ktPnBpcGVsZW4gPSAwOworCXdha2VfdXAoJnJwY2ktPndhaXRxKTsKK30KKworc3RhdGljIHZvaWQKK3JwY190aW1lb3V0X3VwY2FsbF9xdWV1ZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBycGNfaW5vZGUgKnJwY2kgPSAoc3RydWN0IHJwY19pbm9kZSAqKWRhdGE7CisJc3RydWN0IGlub2RlICppbm9kZSA9ICZycGNpLT52ZnNfaW5vZGU7CisKKwlkb3duKCZpbm9kZS0+aV9zZW0pOworCWlmIChycGNpLT5ucmVhZGVycyA9PSAwICYmICFsaXN0X2VtcHR5KCZycGNpLT5waXBlKSkKKwkJX19ycGNfcHVyZ2VfdXBjYWxsKGlub2RlLCAtRVRJTUVET1VUKTsKKwl1cCgmaW5vZGUtPmlfc2VtKTsKK30KKworaW50CitycGNfcXVldWVfdXBjYWxsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBycGNfcGlwZV9tc2cgKm1zZykKK3sKKwlzdHJ1Y3QgcnBjX2lub2RlICpycGNpID0gUlBDX0koaW5vZGUpOworCWludCByZXMgPSAwOworCisJZG93bigmaW5vZGUtPmlfc2VtKTsKKwlpZiAocnBjaS0+bnJlYWRlcnMpIHsKKwkJbGlzdF9hZGRfdGFpbCgmbXNnLT5saXN0LCAmcnBjaS0+cGlwZSk7CisJCXJwY2ktPnBpcGVsZW4gKz0gbXNnLT5sZW47CisJfSBlbHNlIGlmIChycGNpLT5mbGFncyAmIFJQQ19QSVBFX1dBSVRfRk9SX09QRU4pIHsKKwkJaWYgKGxpc3RfZW1wdHkoJnJwY2ktPnBpcGUpKQorCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZycGNpLT5xdWV1ZV90aW1lb3V0LAorCQkJCQlSUENfVVBDQUxMX1RJTUVPVVQpOworCQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpc3QsICZycGNpLT5waXBlKTsKKwkJcnBjaS0+cGlwZWxlbiArPSBtc2ctPmxlbjsKKwl9IGVsc2UKKwkJcmVzID0gLUVQSVBFOworCXVwKCZpbm9kZS0+aV9zZW0pOworCXdha2VfdXAoJnJwY2ktPndhaXRxKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZAorcnBjX2Nsb3NlX3BpcGVzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHJwY19pbm9kZSAqcnBjaSA9IFJQQ19JKGlub2RlKTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnJwY2ktPnF1ZXVlX3RpbWVvdXQpOworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJZG93bigmaW5vZGUtPmlfc2VtKTsKKwlpZiAocnBjaS0+b3BzICE9IE5VTEwpIHsKKwkJcnBjaS0+bnJlYWRlcnMgPSAwOworCQlfX3JwY19wdXJnZV91cGNhbGwoaW5vZGUsIC1FUElQRSk7CisJCXJwY2ktPm53cml0ZXJzID0gMDsKKwkJaWYgKHJwY2ktPm9wcy0+cmVsZWFzZV9waXBlKQorCQkJcnBjaS0+b3BzLT5yZWxlYXNlX3BpcGUoaW5vZGUpOworCQlycGNpLT5vcHMgPSBOVUxMOworCX0KKwl1cCgmaW5vZGUtPmlfc2VtKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitycGNfaW5vZGVfc2V0b3duZXIoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwlSUENfSShpbm9kZSktPnByaXZhdGUgPSBwcml2YXRlOworfQorCitzdGF0aWMgc3RydWN0IGlub2RlICoKK3JwY19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBycGNfaW5vZGUgKnJwY2k7CisJcnBjaSA9IChzdHJ1Y3QgcnBjX2lub2RlICopa21lbV9jYWNoZV9hbGxvYyhycGNfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFycGNpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gJnJwY2ktPnZmc19pbm9kZTsKK30KKworc3RhdGljIHZvaWQKK3JwY19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJa21lbV9jYWNoZV9mcmVlKHJwY19pbm9kZV9jYWNoZXAsIFJQQ19JKGlub2RlKSk7Cit9CisKK3N0YXRpYyBpbnQKK3JwY19waXBlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHJwY19pbm9kZSAqcnBjaSA9IFJQQ19JKGlub2RlKTsKKwlpbnQgcmVzID0gLUVOWElPOworCisJZG93bigmaW5vZGUtPmlfc2VtKTsKKwlpZiAocnBjaS0+b3BzICE9IE5VTEwpIHsKKwkJaWYgKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQlycGNpLT5ucmVhZGVycyArKzsKKwkJaWYgKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJcnBjaS0+bndyaXRlcnMgKys7CisJCXJlcyA9IDA7CisJfQorCXVwKCZpbm9kZS0+aV9zZW0pOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQKK3JwY19waXBlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHJwY19pbm9kZSAqcnBjaSA9IFJQQ19JKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgcnBjX3BpcGVfbXNnICptc2c7CisKKwlkb3duKCZpbm9kZS0+aV9zZW0pOworCWlmIChycGNpLT5vcHMgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJbXNnID0gKHN0cnVjdCBycGNfcGlwZV9tc2cgKilmaWxwLT5wcml2YXRlX2RhdGE7CisJaWYgKG1zZyAhPSBOVUxMKSB7CisJCW1zZy0+ZXJybm8gPSAtRVBJUEU7CisJCWxpc3RfZGVsX2luaXQoJm1zZy0+bGlzdCk7CisJCXJwY2ktPm9wcy0+ZGVzdHJveV9tc2cobXNnKTsKKwl9CisJaWYgKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQlycGNpLT5ud3JpdGVycyAtLTsKKwlpZiAoZmlscC0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJcnBjaS0+bnJlYWRlcnMgLS07CisJaWYgKCFycGNpLT5ucmVhZGVycykKKwkJX19ycGNfcHVyZ2VfdXBjYWxsKGlub2RlLCAtRVBJUEUpOworCWlmIChycGNpLT5vcHMtPnJlbGVhc2VfcGlwZSkKKwkJcnBjaS0+b3BzLT5yZWxlYXNlX3BpcGUoaW5vZGUpOworb3V0OgorCXVwKCZpbm9kZS0+aV9zZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAorcnBjX3BpcGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBycGNfaW5vZGUgKnJwY2kgPSBSUENfSShpbm9kZSk7CisJc3RydWN0IHJwY19waXBlX21zZyAqbXNnOworCWludCByZXMgPSAwOworCisJZG93bigmaW5vZGUtPmlfc2VtKTsKKwlpZiAocnBjaS0+b3BzID09IE5VTEwpIHsKKwkJcmVzID0gLUVQSVBFOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCW1zZyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpZiAobXNnID09IE5VTEwpIHsKKwkJaWYgKCFsaXN0X2VtcHR5KCZycGNpLT5waXBlKSkgeworCQkJbXNnID0gbGlzdF9lbnRyeShycGNpLT5waXBlLm5leHQsCisJCQkJCXN0cnVjdCBycGNfcGlwZV9tc2csCisJCQkJCWxpc3QpOworCQkJbGlzdF9tb3ZlKCZtc2ctPmxpc3QsICZycGNpLT5pbl91cGNhbGwpOworCQkJcnBjaS0+cGlwZWxlbiAtPSBtc2ctPmxlbjsKKwkJCWZpbHAtPnByaXZhdGVfZGF0YSA9IG1zZzsKKwkJCW1zZy0+Y29waWVkID0gMDsKKwkJfQorCQlpZiAobXNnID09IE5VTEwpCisJCQlnb3RvIG91dF91bmxvY2s7CisJfQorCS8qIE5PVEU6IGl0IGlzIHVwIHRvIHRoZSBjYWxsYmFjayB0byB1cGRhdGUgbXNnLT5jb3BpZWQgKi8KKwlyZXMgPSBycGNpLT5vcHMtPnVwY2FsbChmaWxwLCBtc2csIGJ1ZiwgbGVuKTsKKwlpZiAocmVzIDwgMCB8fCBtc2ctPmxlbiA9PSBtc2ctPmNvcGllZCkgeworCQlmaWxwLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCQlsaXN0X2RlbF9pbml0KCZtc2ctPmxpc3QpOworCQlycGNpLT5vcHMtPmRlc3Ryb3lfbXNnKG1zZyk7CisJfQorb3V0X3VubG9jazoKKwl1cCgmaW5vZGUtPmlfc2VtKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3NpemVfdAorcnBjX3BpcGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgcnBjX2lub2RlICpycGNpID0gUlBDX0koaW5vZGUpOworCWludCByZXM7CisKKwlkb3duKCZpbm9kZS0+aV9zZW0pOworCXJlcyA9IC1FUElQRTsKKwlpZiAocnBjaS0+b3BzICE9IE5VTEwpCisJCXJlcyA9IHJwY2ktPm9wcy0+ZG93bmNhbGwoZmlscCwgYnVmLCBsZW4pOworCXVwKCZpbm9kZS0+aV9zZW0pOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3JwY19waXBlX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3QgcnBjX2lub2RlICpycGNpOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCXJwY2kgPSBSUENfSShmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJcG9sbF93YWl0KGZpbHAsICZycGNpLT53YWl0cSwgd2FpdCk7CisKKwltYXNrID0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJaWYgKHJwY2ktPm9wcyA9PSBOVUxMKQorCQltYXNrIHw9IFBPTExFUlIgfCBQT0xMSFVQOworCWlmICghbGlzdF9lbXB0eSgmcnBjaS0+cGlwZSkpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludAorcnBjX3BpcGVfaW9jdGwoc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBmaWxlICpmaWxwLAorCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcnBjX2lub2RlICpycGNpID0gUlBDX0koZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpOworCWludCBsZW47CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRklPTlJFQUQ6CisJCWlmIChycGNpLT5vcHMgPT0gTlVMTCkKKwkJCXJldHVybiAtRVBJUEU7CisJCWxlbiA9IHJwY2ktPnBpcGVsZW47CisJCWlmIChmaWxwLT5wcml2YXRlX2RhdGEpIHsKKwkJCXN0cnVjdCBycGNfcGlwZV9tc2cgKm1zZzsKKwkJCW1zZyA9IChzdHJ1Y3QgcnBjX3BpcGVfbXNnICopZmlscC0+cHJpdmF0ZV9kYXRhOworCQkJbGVuICs9IG1zZy0+bGVuIC0gbXNnLT5jb3BpZWQ7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKGxlbiwgKGludCBfX3VzZXIgKilhcmcpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnBjX3BpcGVfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gcnBjX3BpcGVfcmVhZCwKKwkud3JpdGUJCT0gcnBjX3BpcGVfd3JpdGUsCisJLnBvbGwJCT0gcnBjX3BpcGVfcG9sbCwKKwkuaW9jdGwJCT0gcnBjX3BpcGVfaW9jdGwsCisJLm9wZW4JCT0gcnBjX3BpcGVfb3BlbiwKKwkucmVsZWFzZQk9IHJwY19waXBlX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50CitycGNfc2hvd19pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQgPSBtLT5wcml2YXRlOworCisJc2VxX3ByaW50ZihtLCAiUlBDIHNlcnZlcjogJXNcbiIsIGNsbnQtPmNsX3NlcnZlcik7CisJc2VxX3ByaW50ZihtLCAic2VydmljZTogJXMgKCVkKSB2ZXJzaW9uICVkXG4iLCBjbG50LT5jbF9wcm90bmFtZSwKKwkJCWNsbnQtPmNsX3Byb2csIGNsbnQtPmNsX3ZlcnMpOworCXNlcV9wcmludGYobSwgImFkZHJlc3M6ICV1LiV1LiV1LiV1XG4iLAorCQkJTklQUVVBRChjbG50LT5jbF94cHJ0LT5hZGRyLnNpbl9hZGRyLnNfYWRkcikpOworCXNlcV9wcmludGYobSwgInByb3RvY29sOiAlc1xuIiwKKwkJCWNsbnQtPmNsX3hwcnQtPnByb3QgPT0gSVBQUk9UT19VRFAgPyAidWRwIiA6ICJ0Y3AiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcnBjX2luZm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQ7CisJaW50IHJldCA9IHNpbmdsZV9vcGVuKGZpbGUsIHJwY19zaG93X2luZm8sIE5VTEwpOworCisJaWYgKCFyZXQpIHsKKwkJc3RydWN0IHNlcV9maWxlICptID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCQlkb3duKCZpbm9kZS0+aV9zZW0pOworCQljbG50ID0gUlBDX0koaW5vZGUpLT5wcml2YXRlOworCQlpZiAoY2xudCkgeworCQkJYXRvbWljX2luYygmY2xudC0+Y2xfdXNlcnMpOworCQkJbS0+cHJpdmF0ZSA9IGNsbnQ7CisJCX0gZWxzZSB7CisJCQlzaW5nbGVfcmVsZWFzZShpbm9kZSwgZmlsZSk7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CisJCXVwKCZpbm9kZS0+aV9zZW0pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitycGNfaW5mb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzZXFfZmlsZSAqbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQgPSAoc3RydWN0IHJwY19jbG50ICopbS0+cHJpdmF0ZTsKKworCWlmIChjbG50KQorCQlycGNfcmVsZWFzZV9jbGllbnQoY2xudCk7CisJcmV0dXJuIHNpbmdsZV9yZWxlYXNlKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnBjX2luZm9fb3BlcmF0aW9ucyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gcnBjX2luZm9fb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHJwY19pbmZvX3JlbGVhc2UsCit9OworCisKKy8qCisgKiBXZSBoYXZlIGEgc2luZ2xlIGRpcmVjdG9yeSB3aXRoIDEgbm9kZSBpbiBpdC4KKyAqLworZW51bSB7CisJUlBDQVVUSF9Sb290ID0gMSwKKwlSUENBVVRIX2xvY2tkLAorCVJQQ0FVVEhfbW91bnQsCisJUlBDQVVUSF9uZnMsCisJUlBDQVVUSF9wb3J0bWFwLAorCVJQQ0FVVEhfc3RhdGQsCisJUlBDQVVUSF9Sb290RU9GCit9OworCisvKgorICogRGVzY3JpcHRpb24gb2YgZnMgY29udGVudHMuCisgKi8KK3N0cnVjdCBycGNfZmlsZWxpc3QgeworCWNoYXIgKm5hbWU7CisJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqaV9mb3A7CisJaW50IG1vZGU7Cit9OworCitzdGF0aWMgc3RydWN0IHJwY19maWxlbGlzdCBmaWxlc1tdID0geworCVtSUENBVVRIX2xvY2tkXSA9IHsKKwkJLm5hbWUgPSAibG9ja2QiLAorCQkubW9kZSA9IFNfSUZESVIgfCBTX0lSVUdPIHwgU19JWFVHTywKKwl9LAorCVtSUENBVVRIX21vdW50XSA9IHsKKwkJLm5hbWUgPSAibW91bnQiLAorCQkubW9kZSA9IFNfSUZESVIgfCBTX0lSVUdPIHwgU19JWFVHTywKKwl9LAorCVtSUENBVVRIX25mc10gPSB7CisJCS5uYW1lID0gIm5mcyIsCisJCS5tb2RlID0gU19JRkRJUiB8IFNfSVJVR08gfCBTX0lYVUdPLAorCX0sCisJW1JQQ0FVVEhfcG9ydG1hcF0gPSB7CisJCS5uYW1lID0gInBvcnRtYXAiLAorCQkubW9kZSA9IFNfSUZESVIgfCBTX0lSVUdPIHwgU19JWFVHTywKKwl9LAorCVtSUENBVVRIX3N0YXRkXSA9IHsKKwkJLm5hbWUgPSAic3RhdGQiLAorCQkubW9kZSA9IFNfSUZESVIgfCBTX0lSVUdPIHwgU19JWFVHTywKKwl9LAorfTsKKworZW51bSB7CisJUlBDQVVUSF9pbmZvID0gMiwKKwlSUENBVVRIX0VPRgorfTsKKworc3RhdGljIHN0cnVjdCBycGNfZmlsZWxpc3QgYXV0aGZpbGVzW10gPSB7CisJW1JQQ0FVVEhfaW5mb10gPSB7CisJCS5uYW1lID0gImluZm8iLAorCQkuaV9mb3AgPSAmcnBjX2luZm9fb3BlcmF0aW9ucywKKwkJLm1vZGUgPSBTX0lGUkVHIHwgU19JUlVTUiwKKwl9LAorfTsKKworc3RhdGljIGludAorcnBjX2dldF9tb3VudCh2b2lkKQoreworCXJldHVybiBzaW1wbGVfcGluX2ZzKCJycGNfcGlwZWZzIiwgJnJwY19tb3VudCwgJnJwY19tb3VudF9jb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkCitycGNfcHV0X21vdW50KHZvaWQpCit7CisJc2ltcGxlX3JlbGVhc2VfZnMoJnJwY19tb3VudCwgJnJwY19tb3VudF9jb3VudCk7Cit9CisKK3N0YXRpYyBpbnQKK3JwY19sb29rdXBfcGFyZW50KGNoYXIgKnBhdGgsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWlmIChwYXRoWzBdID09ICdcMCcpCisJCXJldHVybiAtRU5PRU5UOworCWlmIChycGNfZ2V0X21vdW50KCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICVzIGZhaWxlZCB0byBtb3VudCAiCisJCQkgICAgICAgInBzZXVkb2ZpbGVzeXN0ZW0gXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCW5kLT5tbnQgPSBtbnRnZXQocnBjX21vdW50KTsKKwluZC0+ZGVudHJ5ID0gZGdldChycGNfbW91bnQtPm1udF9yb290KTsKKwluZC0+bGFzdF90eXBlID0gTEFTVF9ST09UOworCW5kLT5mbGFncyA9IExPT0tVUF9QQVJFTlQ7CisJbmQtPmRlcHRoID0gMDsKKworCWlmIChwYXRoX3dhbGsocGF0aCwgbmQpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAlcyBmYWlsZWQgdG8gZmluZCBwYXRoICVzXG4iLAorCQkJCV9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIHBhdGgpOworCQlycGNfcHV0X21vdW50KCk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3JwY19yZWxlYXNlX3BhdGgoc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJcGF0aF9yZWxlYXNlKG5kKTsKKwlycGNfcHV0X21vdW50KCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKgorcnBjX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbmV3X2lub2RlKHNiKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gTlVMTDsKKwlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwlpbm9kZS0+aV91aWQgPSBpbm9kZS0+aV9naWQgPSAwOworCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CisJaW5vZGUtPmlfYmxvY2tzID0gMDsKKwlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJc3dpdGNoKG1vZGUgJiBTX0lGTVQpIHsKKwkJY2FzZSBTX0lGRElSOgorCQkJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX29wID0gJnNpbXBsZV9kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX25saW5rKys7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisJcmV0dXJuIGlub2RlOworfQorCisvKgorICogRklYTUU6IFRoaXMgcHJvYmFibHkgaGFzIHJhY2VzLgorICovCitzdGF0aWMgdm9pZAorcnBjX2RlcG9wdWxhdGUoc3RydWN0IGRlbnRyeSAqcGFyZW50KQoreworCXN0cnVjdCBpbm9kZSAqZGlyID0gcGFyZW50LT5kX2lub2RlOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKm5leHQ7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCAqZHZlY1sxMF07CisJaW50IG4gPSAwOworCisJZG93bigmZGlyLT5pX3NlbSk7CityZXBlYXQ6CisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbmV4dCwgJnBhcmVudC0+ZF9zdWJkaXJzKSB7CisJCWRlbnRyeSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgZGVudHJ5LCBkX2NoaWxkKTsKKwkJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCWlmICghZF91bmhhc2hlZChkZW50cnkpKSB7CisJCQlkZ2V0X2xvY2tlZChkZW50cnkpOworCQkJX19kX2Ryb3AoZGVudHJ5KTsKKwkJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCQlkdmVjW24rK10gPSBkZW50cnk7CisJCQlpZiAobiA9PSBBUlJBWV9TSVpFKGR2ZWMpKQorCQkJCWJyZWFrOworCQl9IGVsc2UKKwkJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJaWYgKG4pIHsKKwkJZG8geworCQkJZGVudHJ5ID0gZHZlY1stLW5dOworCQkJaWYgKGRlbnRyeS0+ZF9pbm9kZSkgeworCQkJCXJwY19jbG9zZV9waXBlcyhkZW50cnktPmRfaW5vZGUpOworCQkJCXJwY19pbm9kZV9zZXRvd25lcihkZW50cnktPmRfaW5vZGUsIE5VTEwpOworCQkJCXNpbXBsZV91bmxpbmsoZGlyLCBkZW50cnkpOworCQkJfQorCQkJZHB1dChkZW50cnkpOworCQl9IHdoaWxlIChuKTsKKwkJZ290byByZXBlYXQ7CisJfQorCXVwKCZkaXItPmlfc2VtKTsKK30KKworc3RhdGljIGludAorcnBjX3BvcHVsYXRlKHN0cnVjdCBkZW50cnkgKnBhcmVudCwKKwkJc3RydWN0IHJwY19maWxlbGlzdCAqZmlsZXMsCisJCWludCBzdGFydCwgaW50IGVvZikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqZGlyID0gcGFyZW50LT5kX2lub2RlOworCXZvaWQgKnByaXZhdGUgPSBSUENfSShkaXIpLT5wcml2YXRlOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlpbnQgbW9kZSwgaTsKKworCWRvd24oJmRpci0+aV9zZW0pOworCWZvciAoaSA9IHN0YXJ0OyBpIDwgZW9mOyBpKyspIHsKKwkJZGVudHJ5ID0gZF9hbGxvY19uYW1lKHBhcmVudCwgZmlsZXNbaV0ubmFtZSk7CisJCWlmICghZGVudHJ5KQorCQkJZ290byBvdXRfYmFkOworCQltb2RlID0gZmlsZXNbaV0ubW9kZTsKKwkJaW5vZGUgPSBycGNfZ2V0X2lub2RlKGRpci0+aV9zYiwgbW9kZSk7CisJCWlmICghaW5vZGUpIHsKKwkJCWRwdXQoZGVudHJ5KTsKKwkJCWdvdG8gb3V0X2JhZDsKKwkJfQorCQlpbm9kZS0+aV9pbm8gPSBpOworCQlpZiAoZmlsZXNbaV0uaV9mb3ApCisJCQlpbm9kZS0+aV9mb3AgPSBmaWxlc1tpXS5pX2ZvcDsKKwkJaWYgKHByaXZhdGUpCisJCQlycGNfaW5vZGVfc2V0b3duZXIoaW5vZGUsIHByaXZhdGUpOworCQlpZiAoU19JU0RJUihtb2RlKSkKKwkJCWRpci0+aV9ubGluaysrOworCQlkX2FkZChkZW50cnksIGlub2RlKTsKKwl9CisJdXAoJmRpci0+aV9zZW0pOworCXJldHVybiAwOworb3V0X2JhZDoKKwl1cCgmZGlyLT5pX3NlbSk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICVzIGZhaWxlZCB0byBwb3B1bGF0ZSBkaXJlY3RvcnkgJXNcbiIsCisJCQlfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBwYXJlbnQtPmRfbmFtZS5uYW1lKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIGludAorX19ycGNfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJaW5vZGUgPSBycGNfZ2V0X2lub2RlKGRpci0+aV9zYiwgU19JRkRJUiB8IFNfSVJVU1IgfCBTX0lYVVNSKTsKKwlpZiAoIWlub2RlKQorCQlnb3RvIG91dF9lcnI7CisJaW5vZGUtPmlfaW5vID0gaXVuaXF1ZShkaXItPmlfc2IsIDEwMCk7CisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwlkaXItPmlfbmxpbmsrKzsKKwlpbm9kZV9kaXJfbm90aWZ5KGRpciwgRE5fQ1JFQVRFKTsKKwlycGNfZ2V0X21vdW50KCk7CisJcmV0dXJuIDA7CitvdXRfZXJyOgorCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAlcyBmYWlsZWQgdG8gYWxsb2NhdGUgaW5vZGUgZm9yIGRlbnRyeSAlc1xuIiwKKwkJCV9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgaW50CitfX3JwY19ybWRpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWludCBlcnJvcjsKKworCXNocmlua19kY2FjaGVfcGFyZW50KGRlbnRyeSk7CisJaWYgKGRlbnRyeS0+ZF9pbm9kZSkgeworCQlycGNfY2xvc2VfcGlwZXMoZGVudHJ5LT5kX2lub2RlKTsKKwkJcnBjX2lub2RlX3NldG93bmVyKGRlbnRyeS0+ZF9pbm9kZSwgTlVMTCk7CisJfQorCWlmICgoZXJyb3IgPSBzaW1wbGVfcm1kaXIoZGlyLCBkZW50cnkpKSAhPSAwKQorCQlyZXR1cm4gZXJyb3I7CisJaWYgKCFlcnJvcikgeworCQlpbm9kZV9kaXJfbm90aWZ5KGRpciwgRE5fREVMRVRFKTsKKwkJZF9kcm9wKGRlbnRyeSk7CisJCXJwY19wdXRfbW91bnQoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKK3JwY19sb29rdXBfbmVnYXRpdmUoY2hhciAqcGF0aCwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqZGlyOworCWludCBlcnJvcjsKKworCWlmICgoZXJyb3IgPSBycGNfbG9va3VwX3BhcmVudChwYXRoLCBuZCkpICE9IDApCisJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKKwlkaXIgPSBuZC0+ZGVudHJ5LT5kX2lub2RlOworCWRvd24oJmRpci0+aV9zZW0pOworCWRlbnRyeSA9IGxvb2t1cF9oYXNoKCZuZC0+bGFzdCwgbmQtPmRlbnRyeSk7CisJaWYgKElTX0VSUihkZW50cnkpKQorCQlnb3RvIG91dF9lcnI7CisJaWYgKGRlbnRyeS0+ZF9pbm9kZSkgeworCQlkcHV0KGRlbnRyeSk7CisJCWRlbnRyeSA9IEVSUl9QVFIoLUVFWElTVCk7CisJCWdvdG8gb3V0X2VycjsKKwl9CisJcmV0dXJuIGRlbnRyeTsKK291dF9lcnI6CisJdXAoJmRpci0+aV9zZW0pOworCXJwY19yZWxlYXNlX3BhdGgobmQpOworCXJldHVybiBkZW50cnk7Cit9CisKKworc3RydWN0IGRlbnRyeSAqCitycGNfbWtkaXIoY2hhciAqcGF0aCwgc3RydWN0IHJwY19jbG50ICpycGNfY2xpZW50KQoreworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqZGlyOworCWludCBlcnJvcjsKKworCWRlbnRyeSA9IHJwY19sb29rdXBfbmVnYXRpdmUocGF0aCwgJm5kKTsKKwlpZiAoSVNfRVJSKGRlbnRyeSkpCisJCXJldHVybiBkZW50cnk7CisJZGlyID0gbmQuZGVudHJ5LT5kX2lub2RlOworCWlmICgoZXJyb3IgPSBfX3JwY19ta2RpcihkaXIsIGRlbnRyeSkpICE9IDApCisJCWdvdG8gZXJyX2RwdXQ7CisJUlBDX0koZGVudHJ5LT5kX2lub2RlKS0+cHJpdmF0ZSA9IHJwY19jbGllbnQ7CisJZXJyb3IgPSBycGNfcG9wdWxhdGUoZGVudHJ5LCBhdXRoZmlsZXMsCisJCQlSUENBVVRIX2luZm8sIFJQQ0FVVEhfRU9GKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyX2RlcG9wdWxhdGU7CitvdXQ6CisJdXAoJmRpci0+aV9zZW0pOworCXJwY19yZWxlYXNlX3BhdGgoJm5kKTsKKwlyZXR1cm4gZGVudHJ5OworZXJyX2RlcG9wdWxhdGU6CisJcnBjX2RlcG9wdWxhdGUoZGVudHJ5KTsKKwlfX3JwY19ybWRpcihkaXIsIGRlbnRyeSk7CitlcnJfZHB1dDoKKwlkcHV0KGRlbnRyeSk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICVzKCkgZmFpbGVkIHRvIGNyZWF0ZSBkaXJlY3RvcnkgJXMgKGVycm5vID0gJWQpXG4iLAorCQkJX19GSUxFX18sIF9fRlVOQ1RJT05fXywgcGF0aCwgZXJyb3IpOworCWRlbnRyeSA9IEVSUl9QVFIoZXJyb3IpOworCWdvdG8gb3V0OworfQorCitpbnQKK3JwY19ybWRpcihjaGFyICpwYXRoKQoreworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqZGlyOworCWludCBlcnJvcjsKKworCWlmICgoZXJyb3IgPSBycGNfbG9va3VwX3BhcmVudChwYXRoLCAmbmQpKSAhPSAwKQorCQlyZXR1cm4gZXJyb3I7CisJZGlyID0gbmQuZGVudHJ5LT5kX2lub2RlOworCWRvd24oJmRpci0+aV9zZW0pOworCWRlbnRyeSA9IGxvb2t1cF9oYXNoKCZuZC5sYXN0LCBuZC5kZW50cnkpOworCWlmIChJU19FUlIoZGVudHJ5KSkgeworCQllcnJvciA9IFBUUl9FUlIoZGVudHJ5KTsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwl9CisJcnBjX2RlcG9wdWxhdGUoZGVudHJ5KTsKKwllcnJvciA9IF9fcnBjX3JtZGlyKGRpciwgZGVudHJ5KTsKKwlkcHV0KGRlbnRyeSk7CitvdXRfcmVsZWFzZToKKwl1cCgmZGlyLT5pX3NlbSk7CisJcnBjX3JlbGVhc2VfcGF0aCgmbmQpOworCXJldHVybiBlcnJvcjsKK30KKworc3RydWN0IGRlbnRyeSAqCitycGNfbWtwaXBlKGNoYXIgKnBhdGgsIHZvaWQgKnByaXZhdGUsIHN0cnVjdCBycGNfcGlwZV9vcHMgKm9wcywgaW50IGZsYWdzKQoreworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqZGlyLCAqaW5vZGU7CisJc3RydWN0IHJwY19pbm9kZSAqcnBjaTsKKworCWRlbnRyeSA9IHJwY19sb29rdXBfbmVnYXRpdmUocGF0aCwgJm5kKTsKKwlpZiAoSVNfRVJSKGRlbnRyeSkpCisJCXJldHVybiBkZW50cnk7CisJZGlyID0gbmQuZGVudHJ5LT5kX2lub2RlOworCWlub2RlID0gcnBjX2dldF9pbm9kZShkaXItPmlfc2IsIFNfSUZTT0NLIHwgU19JUlVTUiB8IFNfSVdVU1IpOworCWlmICghaW5vZGUpCisJCWdvdG8gZXJyX2RwdXQ7CisJaW5vZGUtPmlfaW5vID0gaXVuaXF1ZShkaXItPmlfc2IsIDEwMCk7CisJaW5vZGUtPmlfZm9wID0gJnJwY19waXBlX2ZvcHM7CisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwlycGNpID0gUlBDX0koaW5vZGUpOworCXJwY2ktPnByaXZhdGUgPSBwcml2YXRlOworCXJwY2ktPmZsYWdzID0gZmxhZ3M7CisJcnBjaS0+b3BzID0gb3BzOworCWlub2RlX2Rpcl9ub3RpZnkoZGlyLCBETl9DUkVBVEUpOworb3V0OgorCXVwKCZkaXItPmlfc2VtKTsKKwlycGNfcmVsZWFzZV9wYXRoKCZuZCk7CisJcmV0dXJuIGRlbnRyeTsKK2Vycl9kcHV0OgorCWRwdXQoZGVudHJ5KTsKKwlkZW50cnkgPSBFUlJfUFRSKC1FTk9NRU0pOworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAlcygpIGZhaWxlZCB0byBjcmVhdGUgcGlwZSAlcyAoZXJybm8gPSAlZClcbiIsCisJCQlfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBwYXRoLCAtRU5PTUVNKTsKKwlnb3RvIG91dDsKK30KKworaW50CitycGNfdW5saW5rKGNoYXIgKnBhdGgpCit7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IGlub2RlICpkaXI7CisJaW50IGVycm9yOworCisJaWYgKChlcnJvciA9IHJwY19sb29rdXBfcGFyZW50KHBhdGgsICZuZCkpICE9IDApCisJCXJldHVybiBlcnJvcjsKKwlkaXIgPSBuZC5kZW50cnktPmRfaW5vZGU7CisJZG93bigmZGlyLT5pX3NlbSk7CisJZGVudHJ5ID0gbG9va3VwX2hhc2goJm5kLmxhc3QsIG5kLmRlbnRyeSk7CisJaWYgKElTX0VSUihkZW50cnkpKSB7CisJCWVycm9yID0gUFRSX0VSUihkZW50cnkpOworCQlnb3RvIG91dF9yZWxlYXNlOworCX0KKwlkX2Ryb3AoZGVudHJ5KTsKKwlpZiAoZGVudHJ5LT5kX2lub2RlKSB7CisJCXJwY19jbG9zZV9waXBlcyhkZW50cnktPmRfaW5vZGUpOworCQlycGNfaW5vZGVfc2V0b3duZXIoZGVudHJ5LT5kX2lub2RlLCBOVUxMKTsKKwkJZXJyb3IgPSBzaW1wbGVfdW5saW5rKGRpciwgZGVudHJ5KTsKKwl9CisJZHB1dChkZW50cnkpOworCWlub2RlX2Rpcl9ub3RpZnkoZGlyLCBETl9ERUxFVEUpOworb3V0X3JlbGVhc2U6CisJdXAoJmRpci0+aV9zZW0pOworCXJwY19yZWxlYXNlX3BhdGgoJm5kKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBwb3B1bGF0ZSB0aGUgZmlsZXN5c3RlbQorICovCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgc19vcHMgPSB7CisJLmFsbG9jX2lub2RlCT0gcnBjX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCT0gcnBjX2Rlc3Ryb3lfaW5vZGUsCisJLnN0YXRmcwkJPSBzaW1wbGVfc3RhdGZzLAorfTsKKworI2RlZmluZSBSUENBVVRIX0dTU01BR0lDIDB4Njc1OTY5NjkKKworc3RhdGljIGludAorcnBjX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBkZW50cnkgKnJvb3Q7CisKKwlzYi0+c19ibG9ja3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CisJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSBQQUdFX0NBQ0hFX1NISUZUOworCXNiLT5zX21hZ2ljID0gUlBDQVVUSF9HU1NNQUdJQzsKKwlzYi0+c19vcCA9ICZzX29wczsKKwlzYi0+c190aW1lX2dyYW4gPSAxOworCisJaW5vZGUgPSBycGNfZ2V0X2lub2RlKHNiLCBTX0lGRElSIHwgMDc1NSk7CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcm9vdCA9IGRfYWxsb2Nfcm9vdChpbm9kZSk7CisJaWYgKCFyb290KSB7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWYgKHJwY19wb3B1bGF0ZShyb290LCBmaWxlcywgUlBDQVVUSF9Sb290ICsgMSwgUlBDQVVUSF9Sb290RU9GKSkKKwkJZ290byBvdXQ7CisJc2ItPnNfcm9vdCA9IHJvb3Q7CisJcmV0dXJuIDA7CitvdXQ6CisJZF9nZW5vY2lkZShyb290KTsKKwlkcHV0KHJvb3QpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICoKK3JwY19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9zaW5nbGUoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIHJwY19maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHJwY19waXBlX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJycGNfcGlwZWZzIiwKKwkuZ2V0X3NiCQk9IHJwY19nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2xpdHRlcl9zdXBlciwKK307CisKK3N0YXRpYyB2b2lkCitpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBycGNfaW5vZGUgKnJwY2kgPSAoc3RydWN0IHJwY19pbm9kZSAqKSBmb287CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkgICAgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKSB7CisJCWlub2RlX2luaXRfb25jZSgmcnBjaS0+dmZzX2lub2RlKTsKKwkJcnBjaS0+cHJpdmF0ZSA9IE5VTEw7CisJCXJwY2ktPm5yZWFkZXJzID0gMDsKKwkJcnBjaS0+bndyaXRlcnMgPSAwOworCQlJTklUX0xJU1RfSEVBRCgmcnBjaS0+aW5fdXBjYWxsKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnJwY2ktPnBpcGUpOworCQlycGNpLT5waXBlbGVuID0gMDsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcnBjaS0+d2FpdHEpOworCQlJTklUX1dPUksoJnJwY2ktPnF1ZXVlX3RpbWVvdXQsIHJwY190aW1lb3V0X3VwY2FsbF9xdWV1ZSwgcnBjaSk7CisJCXJwY2ktPm9wcyA9IE5VTEw7CisJfQorfQorCitpbnQgcmVnaXN0ZXJfcnBjX3BpcGVmcyh2b2lkKQoreworCXJwY19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgicnBjX2lub2RlX2NhY2hlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgcnBjX2lub2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFNMQUJfSFdDQUNIRV9BTElHTnxTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfb25jZSwgTlVMTCk7CisJaWYgKCFycGNfaW5vZGVfY2FjaGVwKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZWdpc3Rlcl9maWxlc3lzdGVtKCZycGNfcGlwZV9mc190eXBlKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCB1bnJlZ2lzdGVyX3JwY19waXBlZnModm9pZCkKK3sKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KHJwY19pbm9kZV9jYWNoZXApKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJSUEM6IHVuYWJsZSB0byBmcmVlIGlub2RlIGNhY2hlXG4iKTsKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnJwY19waXBlX2ZzX3R5cGUpOworfQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zY2hlZC5jIGIvbmV0L3N1bnJwYy9zY2hlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNjYxNGQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc3VucnBjL3NjaGVkLmMKQEAgLTAsMCArMSwxMTE5IEBACisvKgorICogbGludXgvbmV0L3N1bnJwYy9zY2hlZC5jCisgKgorICogU2NoZWR1bGluZyBmb3Igc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyBSUEMgcmVxdWVzdHMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2IE9sYWYgS2lyY2gsIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqIAorICogVENQIE5GUyByZWxhdGVkIHJlYWQgKyB3cml0ZSBmaXhlcworICogKEMpIDE5OTkgRGF2ZSBBaXJsaWUsIFVuaXZlcnNpdHkgb2YgTGltZXJpY2ssIElyZWxhbmQgPGFpcmxpZWRAbGludXguaWU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3hwcnQuaD4KKworI2lmZGVmIFJQQ19ERUJVRworI2RlZmluZSBSUENEQkdfRkFDSUxJVFkJCVJQQ0RCR19TQ0hFRAorI2RlZmluZSBSUENfVEFTS19NQUdJQ19JRAkweGYwMGJhYQorc3RhdGljIGludAkJCXJwY190YXNrX2lkOworI2VuZGlmCisKKy8qCisgKiBSUEMgc2xhYnMgYW5kIG1lbW9yeSBwb29scworICovCisjZGVmaW5lIFJQQ19CVUZGRVJfTUFYU0laRQkoMjA0OCkKKyNkZWZpbmUgUlBDX0JVRkZFUl9QT09MU0laRQkoOCkKKyNkZWZpbmUgUlBDX1RBU0tfUE9PTFNJWkUJKDgpCitzdGF0aWMga21lbV9jYWNoZV90CSpycGNfdGFza19zbGFicDsKK3N0YXRpYyBrbWVtX2NhY2hlX3QJKnJwY19idWZmZXJfc2xhYnA7CitzdGF0aWMgbWVtcG9vbF90CSpycGNfdGFza19tZW1wb29sOworc3RhdGljIG1lbXBvb2xfdAkqcnBjX2J1ZmZlcl9tZW1wb29sOworCitzdGF0aWMgdm9pZAkJCV9fcnBjX2RlZmF1bHRfdGltZXIoc3RydWN0IHJwY190YXNrICp0YXNrKTsKK3N0YXRpYyB2b2lkCQkJcnBjaW9kX2tpbGxhbGwodm9pZCk7CitzdGF0aWMgdm9pZAkJCXJwY19mcmVlKHN0cnVjdCBycGNfdGFzayAqdGFzayk7CisKK3N0YXRpYyB2b2lkCQkJcnBjX2FzeW5jX3NjaGVkdWxlKHZvaWQgKik7CisKKy8qCisgKiBSUEMgdGFza3MgdGhhdCBjcmVhdGUgYW5vdGhlciB0YXNrIChlLmcuIGZvciBjb250YWN0aW5nIHRoZSBwb3J0bWFwcGVyKQorICogd2lsbCB3YWl0IG9uIHRoaXMgcXVldWUgZm9yIHRoZWlyIGNoaWxkJ3MgY29tcGxldGlvbgorICovCitzdGF0aWMgUlBDX1dBSVRRKGNoaWxkcSwgImNoaWxkcSIpOworCisvKgorICogUlBDIHRhc2tzIHNpdCBoZXJlIHdoaWxlIHdhaXRpbmcgZm9yIGNvbmRpdGlvbnMgdG8gaW1wcm92ZS4KKyAqLworc3RhdGljIFJQQ19XQUlUUShkZWxheV9xdWV1ZSwgImRlbGF5cSIpOworCisvKgorICogQWxsIFJQQyB0YXNrcyBhcmUgbGlua2VkIGludG8gdGhpcyBsaXN0CisgKi8KK3N0YXRpYyBMSVNUX0hFQUQoYWxsX3Rhc2tzKTsKKworLyoKKyAqIHJwY2lvZC1yZWxhdGVkIHN0dWZmCisgKi8KK3N0YXRpYyBERUNMQVJFX01VVEVYKHJwY2lvZF9zZW1hKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQJCXJwY2lvZF91c2VyczsKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcnBjaW9kX3dvcmtxdWV1ZTsKKworLyoKKyAqIFNwaW5sb2NrIGZvciBvdGhlciBjcml0aWNhbCBzZWN0aW9ucyBvZiBjb2RlLgorICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJwY19zY2hlZF9sb2NrKTsKKworLyoKKyAqIERpc2FibGUgdGhlIHRpbWVyIGZvciBhIGdpdmVuIFJQQyB0YXNrLiBTaG91bGQgYmUgY2FsbGVkIHdpdGgKKyAqIHF1ZXVlLT5sb2NrIGFuZCBiaF9kaXNhYmxlZCBpbiBvcmRlciB0byBhdm9pZCByYWNlcyB3aXRoaW4KKyAqIHJwY19ydW5fdGltZXIoKS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitfX3JwY19kaXNhYmxlX3RpbWVyKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlkcHJpbnRrKCJSUEM6ICU0ZCBkaXNhYmxpbmcgdGltZXJcbiIsIHRhc2stPnRrX3BpZCk7CisJdGFzay0+dGtfdGltZW91dF9mbiA9IE5VTEw7CisJdGFzay0+dGtfdGltZW91dCA9IDA7Cit9CisKKy8qCisgKiBSdW4gYSB0aW1lb3V0IGZ1bmN0aW9uLgorICogV2UgdXNlIHRoZSBjYWxsYmFjayBpbiBvcmRlciB0byBhbGxvdyBfX3JwY193YWtlX3VwX3Rhc2soKQorICogYW5kIGZyaWVuZHMgdG8gZGlzYWJsZSB0aGUgdGltZXIgc3luY2hyb25vdXNseSBvbiBTTVAgc3lzdGVtcworICogd2l0aG91dCBjYWxsaW5nIGRlbF90aW1lcl9zeW5jKCkuIFRoZSBsYXR0ZXIgY291bGQgY2F1c2UgYQorICogZGVhZGxvY2sgaWYgY2FsbGVkIHdoaWxlIHdlJ3JlIGhvbGRpbmcgc3BpbmxvY2tzLi4uCisgKi8KK3N0YXRpYyB2b2lkIHJwY19ydW5fdGltZXIoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXZvaWQgKCpjYWxsYmFjaykoc3RydWN0IHJwY190YXNrICopOworCisJY2FsbGJhY2sgPSB0YXNrLT50a190aW1lb3V0X2ZuOworCXRhc2stPnRrX3RpbWVvdXRfZm4gPSBOVUxMOworCWlmIChjYWxsYmFjayAmJiBSUENfSVNfUVVFVUVEKHRhc2spKSB7CisJCWRwcmludGsoIlJQQzogJTRkIHJ1bm5pbmcgdGltZXJcbiIsIHRhc2stPnRrX3BpZCk7CisJCWNhbGxiYWNrKHRhc2spOworCX0KKwlzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKTsKKwljbGVhcl9iaXQoUlBDX1RBU0tfSEFTX1RJTUVSLCAmdGFzay0+dGtfcnVuc3RhdGUpOworCXNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCk7Cit9CisKKy8qCisgKiBTZXQgdXAgYSB0aW1lciBmb3IgdGhlIGN1cnJlbnQgdGFzay4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitfX3JwY19hZGRfdGltZXIoc3RydWN0IHJwY190YXNrICp0YXNrLCBycGNfYWN0aW9uIHRpbWVyKQoreworCWlmICghdGFzay0+dGtfdGltZW91dCkKKwkJcmV0dXJuOworCisJZHByaW50aygiUlBDOiAlNGQgc2V0dGluZyBhbGFybSBmb3IgJWx1IG1zXG4iLAorCQkJdGFzay0+dGtfcGlkLCB0YXNrLT50a190aW1lb3V0ICogMTAwMCAvIEhaKTsKKworCWlmICh0aW1lcikKKwkJdGFzay0+dGtfdGltZW91dF9mbiA9IHRpbWVyOworCWVsc2UKKwkJdGFzay0+dGtfdGltZW91dF9mbiA9IF9fcnBjX2RlZmF1bHRfdGltZXI7CisJc2V0X2JpdChSUENfVEFTS19IQVNfVElNRVIsICZ0YXNrLT50a19ydW5zdGF0ZSk7CisJbW9kX3RpbWVyKCZ0YXNrLT50a190aW1lciwgamlmZmllcyArIHRhc2stPnRrX3RpbWVvdXQpOworfQorCisvKgorICogRGVsZXRlIGFueSB0aW1lciBmb3IgdGhlIGN1cnJlbnQgdGFzay4gQmVjYXVzZSB3ZSB1c2UgZGVsX3RpbWVyX3N5bmMoKSwKKyAqIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCB3aGlsZSBob2xkaW5nIHF1ZXVlLT5sb2NrLgorICovCitzdGF0aWMgdm9pZAorcnBjX2RlbGV0ZV90aW1lcihzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJaWYgKFJQQ19JU19RVUVVRUQodGFzaykpCisJCXJldHVybjsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJQQ19UQVNLX0hBU19USU1FUiwgJnRhc2stPnRrX3J1bnN0YXRlKSkgeworCQlkZWxfc2luZ2xlc2hvdF90aW1lcl9zeW5jKCZ0YXNrLT50a190aW1lcik7CisJCWRwcmludGsoIlJQQzogJTRkIGRlbGV0aW5nIHRpbWVyXG4iLCB0YXNrLT50a19waWQpOworCX0KK30KKworLyoKKyAqIEFkZCBuZXcgcmVxdWVzdCB0byBhIHByaW9yaXR5IHF1ZXVlLgorICovCitzdGF0aWMgdm9pZCBfX3JwY19hZGRfd2FpdF9xdWV1ZV9wcmlvcml0eShzdHJ1Y3QgcnBjX3dhaXRfcXVldWUgKnF1ZXVlLCBzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcTsKKwlzdHJ1Y3QgcnBjX3Rhc2sgKnQ7CisKKwlJTklUX0xJU1RfSEVBRCgmdGFzay0+dS50a193YWl0LmxpbmtzKTsKKwlxID0gJnF1ZXVlLT50YXNrc1t0YXNrLT50a19wcmlvcml0eV07CisJaWYgKHVubGlrZWx5KHRhc2stPnRrX3ByaW9yaXR5ID4gcXVldWUtPm1heHByaW9yaXR5KSkKKwkJcSA9ICZxdWV1ZS0+dGFza3NbcXVldWUtPm1heHByaW9yaXR5XTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsIHEsIHUudGtfd2FpdC5saXN0KSB7CisJCWlmICh0LT50a19jb29raWUgPT0gdGFzay0+dGtfY29va2llKSB7CisJCQlsaXN0X2FkZF90YWlsKCZ0YXNrLT51LnRrX3dhaXQubGlzdCwgJnQtPnUudGtfd2FpdC5saW5rcyk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJbGlzdF9hZGRfdGFpbCgmdGFzay0+dS50a193YWl0Lmxpc3QsIHEpOworfQorCisvKgorICogQWRkIG5ldyByZXF1ZXN0IHRvIHdhaXQgcXVldWUuCisgKgorICogU3dhcHBlciB0YXNrcyBhbHdheXMgZ2V0IGluc2VydGVkIGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4KKyAqIFRoaXMgc2hvdWxkIGF2b2lkIG1hbnkgbmFzdHkgbWVtb3J5IGRlYWRsb2NrcyBhbmQgaG9wZWZ1bGx5CisgKiBpbXByb3ZlIG92ZXJhbGwgcGVyZm9ybWFuY2UuCisgKiBFdmVyeW9uZSBlbHNlIGdldHMgYXBwZW5kZWQgdG8gdGhlIHF1ZXVlIHRvIGVuc3VyZSBwcm9wZXIgRklGTyBiZWhhdmlvci4KKyAqLworc3RhdGljIHZvaWQgX19ycGNfYWRkX3dhaXRfcXVldWUoc3RydWN0IHJwY193YWl0X3F1ZXVlICpxdWV1ZSwgc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCUJVR19PTiAoUlBDX0lTX1FVRVVFRCh0YXNrKSk7CisKKwlpZiAoUlBDX0lTX1BSSU9SSVRZKHF1ZXVlKSkKKwkJX19ycGNfYWRkX3dhaXRfcXVldWVfcHJpb3JpdHkocXVldWUsIHRhc2spOworCWVsc2UgaWYgKFJQQ19JU19TV0FQUEVSKHRhc2spKQorCQlsaXN0X2FkZCgmdGFzay0+dS50a193YWl0Lmxpc3QsICZxdWV1ZS0+dGFza3NbMF0pOworCWVsc2UKKwkJbGlzdF9hZGRfdGFpbCgmdGFzay0+dS50a193YWl0Lmxpc3QsICZxdWV1ZS0+dGFza3NbMF0pOworCXRhc2stPnUudGtfd2FpdC5ycGNfd2FpdHEgPSBxdWV1ZTsKKwlycGNfc2V0X3F1ZXVlZCh0YXNrKTsKKworCWRwcmludGsoIlJQQzogJTRkIGFkZGVkIHRvIHF1ZXVlICVwIFwiJXNcIlxuIiwKKwkJCQl0YXNrLT50a19waWQsIHF1ZXVlLCBycGNfcW5hbWUocXVldWUpKTsKK30KKworLyoKKyAqIFJlbW92ZSByZXF1ZXN0IGZyb20gYSBwcmlvcml0eSBxdWV1ZS4KKyAqLworc3RhdGljIHZvaWQgX19ycGNfcmVtb3ZlX3dhaXRfcXVldWVfcHJpb3JpdHkoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBycGNfdGFzayAqdDsKKworCWlmICghbGlzdF9lbXB0eSgmdGFzay0+dS50a193YWl0LmxpbmtzKSkgeworCQl0ID0gbGlzdF9lbnRyeSh0YXNrLT51LnRrX3dhaXQubGlua3MubmV4dCwgc3RydWN0IHJwY190YXNrLCB1LnRrX3dhaXQubGlzdCk7CisJCWxpc3RfbW92ZSgmdC0+dS50a193YWl0Lmxpc3QsICZ0YXNrLT51LnRrX3dhaXQubGlzdCk7CisJCWxpc3Rfc3BsaWNlX2luaXQoJnRhc2stPnUudGtfd2FpdC5saW5rcywgJnQtPnUudGtfd2FpdC5saW5rcyk7CisJfQorCWxpc3RfZGVsKCZ0YXNrLT51LnRrX3dhaXQubGlzdCk7Cit9CisKKy8qCisgKiBSZW1vdmUgcmVxdWVzdCBmcm9tIHF1ZXVlLgorICogTm90ZTogbXVzdCBiZSBjYWxsZWQgd2l0aCBzcGluIGxvY2sgaGVsZC4KKyAqLworc3RhdGljIHZvaWQgX19ycGNfcmVtb3ZlX3dhaXRfcXVldWUoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBycGNfd2FpdF9xdWV1ZSAqcXVldWU7CisJcXVldWUgPSB0YXNrLT51LnRrX3dhaXQucnBjX3dhaXRxOworCisJaWYgKFJQQ19JU19QUklPUklUWShxdWV1ZSkpCisJCV9fcnBjX3JlbW92ZV93YWl0X3F1ZXVlX3ByaW9yaXR5KHRhc2spOworCWVsc2UKKwkJbGlzdF9kZWwoJnRhc2stPnUudGtfd2FpdC5saXN0KTsKKwlkcHJpbnRrKCJSUEM6ICU0ZCByZW1vdmVkIGZyb20gcXVldWUgJXAgXCIlc1wiXG4iLAorCQkJCXRhc2stPnRrX3BpZCwgcXVldWUsIHJwY19xbmFtZShxdWV1ZSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnBjX3NldF93YWl0cXVldWVfcHJpb3JpdHkoc3RydWN0IHJwY193YWl0X3F1ZXVlICpxdWV1ZSwgaW50IHByaW9yaXR5KQoreworCXF1ZXVlLT5wcmlvcml0eSA9IHByaW9yaXR5OworCXF1ZXVlLT5jb3VudCA9IDEgPDwgKHByaW9yaXR5ICogMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBycGNfc2V0X3dhaXRxdWV1ZV9jb29raWUoc3RydWN0IHJwY193YWl0X3F1ZXVlICpxdWV1ZSwgdW5zaWduZWQgbG9uZyBjb29raWUpCit7CisJcXVldWUtPmNvb2tpZSA9IGNvb2tpZTsKKwlxdWV1ZS0+bnIgPSBSUENfQkFUQ0hfQ09VTlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBycGNfcmVzZXRfd2FpdHF1ZXVlX3ByaW9yaXR5KHN0cnVjdCBycGNfd2FpdF9xdWV1ZSAqcXVldWUpCit7CisJcnBjX3NldF93YWl0cXVldWVfcHJpb3JpdHkocXVldWUsIHF1ZXVlLT5tYXhwcmlvcml0eSk7CisJcnBjX3NldF93YWl0cXVldWVfY29va2llKHF1ZXVlLCAwKTsKK30KKworc3RhdGljIHZvaWQgX19ycGNfaW5pdF9wcmlvcml0eV93YWl0X3F1ZXVlKHN0cnVjdCBycGNfd2FpdF9xdWV1ZSAqcXVldWUsIGNvbnN0IGNoYXIgKnFuYW1lLCBpbnQgbWF4cHJpbykKK3sKKwlpbnQgaTsKKworCXNwaW5fbG9ja19pbml0KCZxdWV1ZS0+bG9jayk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocXVldWUtPnRhc2tzKTsgaSsrKQorCQlJTklUX0xJU1RfSEVBRCgmcXVldWUtPnRhc2tzW2ldKTsKKwlxdWV1ZS0+bWF4cHJpb3JpdHkgPSBtYXhwcmlvOworCXJwY19yZXNldF93YWl0cXVldWVfcHJpb3JpdHkocXVldWUpOworI2lmZGVmIFJQQ19ERUJVRworCXF1ZXVlLT5uYW1lID0gcW5hbWU7CisjZW5kaWYKK30KKwordm9pZCBycGNfaW5pdF9wcmlvcml0eV93YWl0X3F1ZXVlKHN0cnVjdCBycGNfd2FpdF9xdWV1ZSAqcXVldWUsIGNvbnN0IGNoYXIgKnFuYW1lKQoreworCV9fcnBjX2luaXRfcHJpb3JpdHlfd2FpdF9xdWV1ZShxdWV1ZSwgcW5hbWUsIFJQQ19QUklPUklUWV9ISUdIKTsKK30KKwordm9pZCBycGNfaW5pdF93YWl0X3F1ZXVlKHN0cnVjdCBycGNfd2FpdF9xdWV1ZSAqcXVldWUsIGNvbnN0IGNoYXIgKnFuYW1lKQoreworCV9fcnBjX2luaXRfcHJpb3JpdHlfd2FpdF9xdWV1ZShxdWV1ZSwgcW5hbWUsIDApOworfQorRVhQT1JUX1NZTUJPTChycGNfaW5pdF93YWl0X3F1ZXVlKTsKKworLyoKKyAqIE1ha2UgYW4gUlBDIHRhc2sgcnVubmFibGUuCisgKgorICogTm90ZTogSWYgdGhlIHRhc2sgaXMgQVNZTkMsIHRoaXMgbXVzdCBiZSBjYWxsZWQgd2l0aCAKKyAqIHRoZSBzcGlubG9jayBoZWxkIHRvIHByb3RlY3QgdGhlIHdhaXQgcXVldWUgb3BlcmF0aW9uLgorICovCitzdGF0aWMgdm9pZCBycGNfbWFrZV9ydW5uYWJsZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJaW50IGRvX3JldDsKKworCUJVR19PTih0YXNrLT50a190aW1lb3V0X2ZuKTsKKwlkb19yZXQgPSBycGNfdGVzdF9hbmRfc2V0X3J1bm5pbmcodGFzayk7CisJcnBjX2NsZWFyX3F1ZXVlZCh0YXNrKTsKKwlpZiAoZG9fcmV0KQorCQlyZXR1cm47CisJaWYgKFJQQ19JU19BU1lOQyh0YXNrKSkgeworCQlpbnQgc3RhdHVzOworCisJCUlOSVRfV09SSygmdGFzay0+dS50a193b3JrLCBycGNfYXN5bmNfc2NoZWR1bGUsICh2b2lkICopdGFzayk7CisJCXN0YXR1cyA9IHF1ZXVlX3dvcmsodGFzay0+dGtfd29ya3F1ZXVlLCAmdGFzay0+dS50a193b3JrKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJQQzogZmFpbGVkIHRvIGFkZCB0YXNrIHRvIHF1ZXVlOiBlcnJvcjogJWQhXG4iLCBzdGF0dXMpOworCQkJdGFzay0+dGtfc3RhdHVzID0gc3RhdHVzOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlCisJCXdha2VfdXAoJnRhc2stPnUudGtfd2FpdC53YWl0cSk7Cit9CisKKy8qCisgKiBQbGFjZSBhIG5ld2x5IGluaXRpYWxpemVkIHRhc2sgb24gdGhlIHdvcmtxdWV1ZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitycGNfc2NoZWR1bGVfcnVuKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwkvKiBEb24ndCBydW4gYSBjaGlsZCB0d2ljZSEgKi8KKwlpZiAoUlBDX0lTX0FDVElWQVRFRCh0YXNrKSkKKwkJcmV0dXJuOworCXRhc2stPnRrX2FjdGl2ZSA9IDE7CisJcnBjX21ha2VfcnVubmFibGUodGFzayk7Cit9CisKKy8qCisgKiBQcmVwYXJlIGZvciBzbGVlcGluZyBvbiBhIHdhaXQgcXVldWUuCisgKiBCeSBhbHdheXMgYXBwZW5kaW5nIHRhc2tzIHRvIHRoZSBsaXN0IHdlIGVuc3VyZSBGSUZPIGJlaGF2aW9yLgorICogTkI6IEFuIFJQQyB0YXNrIHdpbGwgb25seSByZWNlaXZlIGludGVycnVwdC1kcml2ZW4gZXZlbnRzIGFzIGxvbmcKKyAqIGFzIGl0J3Mgb24gYSB3YWl0IHF1ZXVlLgorICovCitzdGF0aWMgdm9pZCBfX3JwY19zbGVlcF9vbihzdHJ1Y3QgcnBjX3dhaXRfcXVldWUgKnEsIHN0cnVjdCBycGNfdGFzayAqdGFzaywKKwkJCXJwY19hY3Rpb24gYWN0aW9uLCBycGNfYWN0aW9uIHRpbWVyKQoreworCWRwcmludGsoIlJQQzogJTRkIHNsZWVwX29uKHF1ZXVlIFwiJXNcIiB0aW1lICVsZClcbiIsIHRhc2stPnRrX3BpZCwKKwkJCQlycGNfcW5hbWUocSksIGppZmZpZXMpOworCisJaWYgKCFSUENfSVNfQVNZTkModGFzaykgJiYgIVJQQ19JU19BQ1RJVkFURUQodGFzaykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJSUEM6IEluYWN0aXZlIHN5bmNocm9ub3VzIHRhc2sgcHV0IHRvIHNsZWVwIVxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBNYXJrIHRoZSB0YXNrIGFzIGJlaW5nIGFjdGl2YXRlZCBpZiBzbyBuZWVkZWQgKi8KKwlpZiAoIVJQQ19JU19BQ1RJVkFURUQodGFzaykpCisJCXRhc2stPnRrX2FjdGl2ZSA9IDE7CisKKwlfX3JwY19hZGRfd2FpdF9xdWV1ZShxLCB0YXNrKTsKKworCUJVR19PTih0YXNrLT50a19jYWxsYmFjayAhPSBOVUxMKTsKKwl0YXNrLT50a19jYWxsYmFjayA9IGFjdGlvbjsKKwlfX3JwY19hZGRfdGltZXIodGFzaywgdGltZXIpOworfQorCit2b2lkIHJwY19zbGVlcF9vbihzdHJ1Y3QgcnBjX3dhaXRfcXVldWUgKnEsIHN0cnVjdCBycGNfdGFzayAqdGFzaywKKwkJCQlycGNfYWN0aW9uIGFjdGlvbiwgcnBjX2FjdGlvbiB0aW1lcikKK3sKKwkvKgorCSAqIFByb3RlY3QgdGhlIHF1ZXVlIG9wZXJhdGlvbnMuCisJICovCisJc3Bpbl9sb2NrX2JoKCZxLT5sb2NrKTsKKwlfX3JwY19zbGVlcF9vbihxLCB0YXNrLCBhY3Rpb24sIHRpbWVyKTsKKwlzcGluX3VubG9ja19iaCgmcS0+bG9jayk7Cit9CisKKy8qKgorICogX19ycGNfZG9fd2FrZV91cF90YXNrIC0gd2FrZSB1cCBhIHNpbmdsZSBycGNfdGFzaworICogQHRhc2s6IHRhc2sgdG8gYmUgd29rZW4gdXAKKyAqCisgKiBDYWxsZXIgbXVzdCBob2xkIHF1ZXVlLT5sb2NrLCBhbmQgaGF2ZSBjbGVhcmVkIHRoZSB0YXNrIHF1ZXVlZCBmbGFnLgorICovCitzdGF0aWMgdm9pZCBfX3JwY19kb193YWtlX3VwX3Rhc2soc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCWRwcmludGsoIlJQQzogJTRkIF9fcnBjX3dha2VfdXBfdGFzayAobm93ICVsZClcbiIsIHRhc2stPnRrX3BpZCwgamlmZmllcyk7CisKKyNpZmRlZiBSUENfREVCVUcKKwlCVUdfT04odGFzay0+dGtfbWFnaWMgIT0gUlBDX1RBU0tfTUFHSUNfSUQpOworI2VuZGlmCisJLyogSGFzIHRoZSB0YXNrIGJlZW4gZXhlY3V0ZWQgeWV0PyBJZiBub3QsIHdlIGNhbm5vdCB3YWtlIGl0IHVwISAqLworCWlmICghUlBDX0lTX0FDVElWQVRFRCh0YXNrKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlJQQzogSW5hY3RpdmUgdGFzayAoJXApIGJlaW5nIHdva2VuIHVwIVxuIiwgdGFzayk7CisJCXJldHVybjsKKwl9CisKKwlfX3JwY19kaXNhYmxlX3RpbWVyKHRhc2spOworCV9fcnBjX3JlbW92ZV93YWl0X3F1ZXVlKHRhc2spOworCisJcnBjX21ha2VfcnVubmFibGUodGFzayk7CisKKwlkcHJpbnRrKCJSUEM6ICAgICAgX19ycGNfd2FrZV91cF90YXNrIGRvbmVcbiIpOworfQorCisvKgorICogV2FrZSB1cCB0aGUgc3BlY2lmaWVkIHRhc2sKKyAqLworc3RhdGljIHZvaWQgX19ycGNfd2FrZV91cF90YXNrKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlpZiAocnBjX3N0YXJ0X3dha2V1cCh0YXNrKSkgeworCQlpZiAoUlBDX0lTX1FVRVVFRCh0YXNrKSkKKwkJCV9fcnBjX2RvX3dha2VfdXBfdGFzayh0YXNrKTsKKwkJcnBjX2ZpbmlzaF93YWtldXAodGFzayk7CisJfQorfQorCisvKgorICogRGVmYXVsdCB0aW1lb3V0IGhhbmRsZXIgaWYgbm9uZSBzcGVjaWZpZWQgYnkgdXNlcgorICovCitzdGF0aWMgdm9pZAorX19ycGNfZGVmYXVsdF90aW1lcihzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJZHByaW50aygiUlBDOiAlZCB0aW1lb3V0IChkZWZhdWx0IHRpbWVyKVxuIiwgdGFzay0+dGtfcGlkKTsKKwl0YXNrLT50a19zdGF0dXMgPSAtRVRJTUVET1VUOworCXJwY193YWtlX3VwX3Rhc2sodGFzayk7Cit9CisKKy8qCisgKiBXYWtlIHVwIHRoZSBzcGVjaWZpZWQgdGFzaworICovCit2b2lkIHJwY193YWtlX3VwX3Rhc2soc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCWlmIChycGNfc3RhcnRfd2FrZXVwKHRhc2spKSB7CisJCWlmIChSUENfSVNfUVVFVUVEKHRhc2spKSB7CisJCQlzdHJ1Y3QgcnBjX3dhaXRfcXVldWUgKnF1ZXVlID0gdGFzay0+dS50a193YWl0LnJwY193YWl0cTsKKworCQkJc3Bpbl9sb2NrX2JoKCZxdWV1ZS0+bG9jayk7CisJCQlfX3JwY19kb193YWtlX3VwX3Rhc2sodGFzayk7CisJCQlzcGluX3VubG9ja19iaCgmcXVldWUtPmxvY2spOworCQl9CisJCXJwY19maW5pc2hfd2FrZXVwKHRhc2spOworCX0KK30KKworLyoKKyAqIFdha2UgdXAgdGhlIG5leHQgdGFzayBvbiBhIHByaW9yaXR5IHF1ZXVlLgorICovCitzdGF0aWMgc3RydWN0IHJwY190YXNrICogX19ycGNfd2FrZV91cF9uZXh0X3ByaW9yaXR5KHN0cnVjdCBycGNfd2FpdF9xdWV1ZSAqcXVldWUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcTsKKwlzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2s7CisKKwkvKgorCSAqIFNlcnZpY2UgYSBiYXRjaCBvZiB0YXNrcyBmcm9tIGEgc2luZ2xlIGNvb2tpZS4KKwkgKi8KKwlxID0gJnF1ZXVlLT50YXNrc1txdWV1ZS0+cHJpb3JpdHldOworCWlmICghbGlzdF9lbXB0eShxKSkgeworCQl0YXNrID0gbGlzdF9lbnRyeShxLT5uZXh0LCBzdHJ1Y3QgcnBjX3Rhc2ssIHUudGtfd2FpdC5saXN0KTsKKwkJaWYgKHF1ZXVlLT5jb29raWUgPT0gdGFzay0+dGtfY29va2llKSB7CisJCQlpZiAoLS1xdWV1ZS0+bnIpCisJCQkJZ290byBvdXQ7CisJCQlsaXN0X21vdmVfdGFpbCgmdGFzay0+dS50a193YWl0Lmxpc3QsIHEpOworCQl9CisJCS8qCisJCSAqIENoZWNrIGlmIHdlIG5lZWQgdG8gc3dpdGNoIHF1ZXVlcy4KKwkJICovCisJCWlmICgtLXF1ZXVlLT5jb3VudCkKKwkJCWdvdG8gbmV3X2Nvb2tpZTsKKwl9CisKKwkvKgorCSAqIFNlcnZpY2UgdGhlIG5leHQgcXVldWUuCisJICovCisJZG8geworCQlpZiAocSA9PSAmcXVldWUtPnRhc2tzWzBdKQorCQkJcSA9ICZxdWV1ZS0+dGFza3NbcXVldWUtPm1heHByaW9yaXR5XTsKKwkJZWxzZQorCQkJcSA9IHEgLSAxOworCQlpZiAoIWxpc3RfZW1wdHkocSkpIHsKKwkJCXRhc2sgPSBsaXN0X2VudHJ5KHEtPm5leHQsIHN0cnVjdCBycGNfdGFzaywgdS50a193YWl0Lmxpc3QpOworCQkJZ290byBuZXdfcXVldWU7CisJCX0KKwl9IHdoaWxlIChxICE9ICZxdWV1ZS0+dGFza3NbcXVldWUtPnByaW9yaXR5XSk7CisKKwlycGNfcmVzZXRfd2FpdHF1ZXVlX3ByaW9yaXR5KHF1ZXVlKTsKKwlyZXR1cm4gTlVMTDsKKworbmV3X3F1ZXVlOgorCXJwY19zZXRfd2FpdHF1ZXVlX3ByaW9yaXR5KHF1ZXVlLCAodW5zaWduZWQgaW50KShxIC0gJnF1ZXVlLT50YXNrc1swXSkpOworbmV3X2Nvb2tpZToKKwlycGNfc2V0X3dhaXRxdWV1ZV9jb29raWUocXVldWUsIHRhc2stPnRrX2Nvb2tpZSk7CitvdXQ6CisJX19ycGNfd2FrZV91cF90YXNrKHRhc2spOworCXJldHVybiB0YXNrOworfQorCisvKgorICogV2FrZSB1cCB0aGUgbmV4dCB0YXNrIG9uIHRoZSB3YWl0IHF1ZXVlLgorICovCitzdHJ1Y3QgcnBjX3Rhc2sgKiBycGNfd2FrZV91cF9uZXh0KHN0cnVjdCBycGNfd2FpdF9xdWV1ZSAqcXVldWUpCit7CisJc3RydWN0IHJwY190YXNrCSp0YXNrID0gTlVMTDsKKworCWRwcmludGsoIlJQQzogICAgICB3YWtlX3VwX25leHQoJXAgXCIlc1wiKVxuIiwgcXVldWUsIHJwY19xbmFtZShxdWV1ZSkpOworCXNwaW5fbG9ja19iaCgmcXVldWUtPmxvY2spOworCWlmIChSUENfSVNfUFJJT1JJVFkocXVldWUpKQorCQl0YXNrID0gX19ycGNfd2FrZV91cF9uZXh0X3ByaW9yaXR5KHF1ZXVlKTsKKwllbHNlIHsKKwkJdGFza19mb3JfZmlyc3QodGFzaywgJnF1ZXVlLT50YXNrc1swXSkKKwkJCV9fcnBjX3dha2VfdXBfdGFzayh0YXNrKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKKworCXJldHVybiB0YXNrOworfQorCisvKioKKyAqIHJwY193YWtlX3VwIC0gd2FrZSB1cCBhbGwgcnBjX3Rhc2tzCisgKiBAcXVldWU6IHJwY193YWl0X3F1ZXVlIG9uIHdoaWNoIHRoZSB0YXNrcyBhcmUgc2xlZXBpbmcKKyAqCisgKiBHcmFicyBxdWV1ZS0+bG9jaworICovCit2b2lkIHJwY193YWtlX3VwKHN0cnVjdCBycGNfd2FpdF9xdWV1ZSAqcXVldWUpCit7CisJc3RydWN0IHJwY190YXNrICp0YXNrOworCisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKKwlzcGluX2xvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKKwloZWFkID0gJnF1ZXVlLT50YXNrc1txdWV1ZS0+bWF4cHJpb3JpdHldOworCWZvciAoOzspIHsKKwkJd2hpbGUgKCFsaXN0X2VtcHR5KGhlYWQpKSB7CisJCQl0YXNrID0gbGlzdF9lbnRyeShoZWFkLT5uZXh0LCBzdHJ1Y3QgcnBjX3Rhc2ssIHUudGtfd2FpdC5saXN0KTsKKwkJCV9fcnBjX3dha2VfdXBfdGFzayh0YXNrKTsKKwkJfQorCQlpZiAoaGVhZCA9PSAmcXVldWUtPnRhc2tzWzBdKQorCQkJYnJlYWs7CisJCWhlYWQtLTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKK30KKworLyoqCisgKiBycGNfd2FrZV91cF9zdGF0dXMgLSB3YWtlIHVwIGFsbCBycGNfdGFza3MgYW5kIHNldCB0aGVpciBzdGF0dXMgdmFsdWUuCisgKiBAcXVldWU6IHJwY193YWl0X3F1ZXVlIG9uIHdoaWNoIHRoZSB0YXNrcyBhcmUgc2xlZXBpbmcKKyAqIEBzdGF0dXM6IHN0YXR1cyB2YWx1ZSB0byBzZXQKKyAqCisgKiBHcmFicyBxdWV1ZS0+bG9jaworICovCit2b2lkIHJwY193YWtlX3VwX3N0YXR1cyhzdHJ1Y3QgcnBjX3dhaXRfcXVldWUgKnF1ZXVlLCBpbnQgc3RhdHVzKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CisJc3RydWN0IHJwY190YXNrICp0YXNrOworCisJc3Bpbl9sb2NrX2JoKCZxdWV1ZS0+bG9jayk7CisJaGVhZCA9ICZxdWV1ZS0+dGFza3NbcXVldWUtPm1heHByaW9yaXR5XTsKKwlmb3IgKDs7KSB7CisJCXdoaWxlICghbGlzdF9lbXB0eShoZWFkKSkgeworCQkJdGFzayA9IGxpc3RfZW50cnkoaGVhZC0+bmV4dCwgc3RydWN0IHJwY190YXNrLCB1LnRrX3dhaXQubGlzdCk7CisJCQl0YXNrLT50a19zdGF0dXMgPSBzdGF0dXM7CisJCQlfX3JwY193YWtlX3VwX3Rhc2sodGFzayk7CisJCX0KKwkJaWYgKGhlYWQgPT0gJnF1ZXVlLT50YXNrc1swXSkKKwkJCWJyZWFrOworCQloZWFkLS07CisJfQorCXNwaW5fdW5sb2NrX2JoKCZxdWV1ZS0+bG9jayk7Cit9CisKKy8qCisgKiBSdW4gYSB0YXNrIGF0IGEgbGF0ZXIgdGltZQorICovCitzdGF0aWMgdm9pZAlfX3JwY19hdHJ1bihzdHJ1Y3QgcnBjX3Rhc2sgKik7Cit2b2lkCitycGNfZGVsYXkoc3RydWN0IHJwY190YXNrICp0YXNrLCB1bnNpZ25lZCBsb25nIGRlbGF5KQoreworCXRhc2stPnRrX3RpbWVvdXQgPSBkZWxheTsKKwlycGNfc2xlZXBfb24oJmRlbGF5X3F1ZXVlLCB0YXNrLCBOVUxMLCBfX3JwY19hdHJ1bik7Cit9CisKK3N0YXRpYyB2b2lkCitfX3JwY19hdHJ1bihzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJdGFzay0+dGtfc3RhdHVzID0gMDsKKwlycGNfd2FrZV91cF90YXNrKHRhc2spOworfQorCisvKgorICogVGhpcyBpcyB0aGUgUlBDIGBzY2hlZHVsZXInIChvciByYXRoZXIsIHRoZSBmaW5pdGUgc3RhdGUgbWFjaGluZSkuCisgKi8KK3N0YXRpYyBpbnQgX19ycGNfZXhlY3V0ZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJaW50CQlzdGF0dXMgPSAwOworCisJZHByaW50aygiUlBDOiAlNGQgcnBjX2V4ZWN1dGUgZmxncyAleFxuIiwKKwkJCQl0YXNrLT50a19waWQsIHRhc2stPnRrX2ZsYWdzKTsKKworCUJVR19PTihSUENfSVNfUVVFVUVEKHRhc2spKTsKKworIHJlc3RhcnRlZDoKKwl3aGlsZSAoMSkgeworCQkvKgorCQkgKiBHYXJiYWdlIGNvbGxlY3Rpb24gb2YgcGVuZGluZyB0aW1lcnMuLi4KKwkJICovCisJCXJwY19kZWxldGVfdGltZXIodGFzayk7CisKKwkJLyoKKwkJICogRXhlY3V0ZSBhbnkgcGVuZGluZyBjYWxsYmFjay4KKwkJICovCisJCWlmIChSUENfRE9fQ0FMTEJBQ0sodGFzaykpIHsKKwkJCS8qIERlZmluZSBhIGNhbGxiYWNrIHNhdmUgcG9pbnRlciAqLworCQkJdm9pZCAoKnNhdmVfY2FsbGJhY2spKHN0cnVjdCBycGNfdGFzayAqKTsKKwkKKwkJCS8qIAorCQkJICogSWYgYSBjYWxsYmFjayBleGlzdHMsIHNhdmUgaXQsIHJlc2V0IGl0LAorCQkJICogY2FsbCBpdC4KKwkJCSAqIFRoZSBzYXZlIGlzIG5lZWRlZCB0byBzdG9wIGZyb20gcmVzZXR0aW5nCisJCQkgKiBhbm90aGVyIGNhbGxiYWNrIHNldCB3aXRoaW4gdGhlIGNhbGxiYWNrIGhhbmRsZXIKKwkJCSAqIC0gRGF2ZQorCQkJICovCisJCQlzYXZlX2NhbGxiYWNrPXRhc2stPnRrX2NhbGxiYWNrOworCQkJdGFzay0+dGtfY2FsbGJhY2s9TlVMTDsKKwkJCWxvY2tfa2VybmVsKCk7CisJCQlzYXZlX2NhbGxiYWNrKHRhc2spOworCQkJdW5sb2NrX2tlcm5lbCgpOworCQl9CisKKwkJLyoKKwkJICogUGVyZm9ybSB0aGUgbmV4dCBGU00gc3RlcC4KKwkJICogdGtfYWN0aW9uIG1heSBiZSBOVUxMIHdoZW4gdGhlIHRhc2sgaGFzIGJlZW4ga2lsbGVkCisJCSAqIGJ5IHNvbWVvbmUgZWxzZS4KKwkJICovCisJCWlmICghUlBDX0lTX1FVRVVFRCh0YXNrKSkgeworCQkJaWYgKCF0YXNrLT50a19hY3Rpb24pCisJCQkJYnJlYWs7CisJCQlsb2NrX2tlcm5lbCgpOworCQkJdGFzay0+dGtfYWN0aW9uKHRhc2spOworCQkJdW5sb2NrX2tlcm5lbCgpOworCQl9CisKKwkJLyoKKwkJICogTG9ja2xlc3MgY2hlY2sgZm9yIHdoZXRoZXIgdGFzayBpcyBzbGVlcGluZyBvciBub3QuCisJCSAqLworCQlpZiAoIVJQQ19JU19RVUVVRUQodGFzaykpCisJCQljb250aW51ZTsKKwkJcnBjX2NsZWFyX3J1bm5pbmcodGFzayk7CisJCWlmIChSUENfSVNfQVNZTkModGFzaykpIHsKKwkJCS8qIENhcmVmdWwhIHdlIG1heSBoYXZlIHJhY2VkLi4uICovCisJCQlpZiAoUlBDX0lTX1FVRVVFRCh0YXNrKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChycGNfdGVzdF9hbmRfc2V0X3J1bm5pbmcodGFzaykpCisJCQkJcmV0dXJuIDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIHN5bmMgdGFzazogc2xlZXAgaGVyZSAqLworCQlkcHJpbnRrKCJSUEM6ICU0ZCBzeW5jIHRhc2sgZ29pbmcgdG8gc2xlZXBcbiIsIHRhc2stPnRrX3BpZCk7CisJCWlmIChSUENfVEFTS19VTklOVEVSUlVQVElCTEUodGFzaykpIHsKKwkJCV9fd2FpdF9ldmVudCh0YXNrLT51LnRrX3dhaXQud2FpdHEsICFSUENfSVNfUVVFVUVEKHRhc2spKTsKKwkJfSBlbHNlIHsKKwkJCV9fd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHRhc2stPnUudGtfd2FpdC53YWl0cSwgIVJQQ19JU19RVUVVRUQodGFzayksIHN0YXR1cyk7CisJCQkvKgorCQkJICogV2hlbiBhIHN5bmMgdGFzayByZWNlaXZlcyBhIHNpZ25hbCwgaXQgZXhpdHMgd2l0aAorCQkJICogLUVSRVNUQVJUU1lTLiBJbiBvcmRlciB0byBjYXRjaCBhbnkgY2FsbGJhY2tzIHRoYXQKKwkJCSAqIGNsZWFuIHVwIGFmdGVyIHNsZWVwaW5nIG9uIHNvbWUgcXVldWUsIHdlIGRvbid0CisJCQkgKiBicmVhayB0aGUgbG9vcCBoZXJlLCBidXQgZ28gYXJvdW5kIG9uY2UgbW9yZS4KKwkJCSAqLworCQkJaWYgKHN0YXR1cyA9PSAtRVJFU1RBUlRTWVMpIHsKKwkJCQlkcHJpbnRrKCJSUEM6ICU0ZCBnb3Qgc2lnbmFsXG4iLCB0YXNrLT50a19waWQpOworCQkJCXRhc2stPnRrX2ZsYWdzIHw9IFJQQ19UQVNLX0tJTExFRDsKKwkJCQlycGNfZXhpdCh0YXNrLCAtRVJFU1RBUlRTWVMpOworCQkJCXJwY193YWtlX3VwX3Rhc2sodGFzayk7CisJCQl9CisJCX0KKwkJcnBjX3NldF9ydW5uaW5nKHRhc2spOworCQlkcHJpbnRrKCJSUEM6ICU0ZCBzeW5jIHRhc2sgcmVzdW1pbmdcbiIsIHRhc2stPnRrX3BpZCk7CisJfQorCisJaWYgKHRhc2stPnRrX2V4aXQpIHsKKwkJbG9ja19rZXJuZWwoKTsKKwkJdGFzay0+dGtfZXhpdCh0YXNrKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQkvKiBJZiB0a19hY3Rpb24gaXMgbm9uLW51bGwsIHRoZSB1c2VyIHdhbnRzIHVzIHRvIHJlc3RhcnQgKi8KKwkJaWYgKHRhc2stPnRrX2FjdGlvbikgeworCQkJaWYgKCFSUENfQVNTQVNTSU5BVEVEKHRhc2spKSB7CisJCQkJLyogUmVsZWFzZSBSUEMgc2xvdCBhbmQgYnVmZmVyIG1lbW9yeSAqLworCQkJCWlmICh0YXNrLT50a19ycXN0cCkKKwkJCQkJeHBydF9yZWxlYXNlKHRhc2spOworCQkJCXJwY19mcmVlKHRhc2spOworCQkJCWdvdG8gcmVzdGFydGVkOworCQkJfQorCQkJcHJpbnRrKEtFUk5fRVJSICJSUEM6IGRlYWQgdGFzayB0cmllcyB0byB3YWxrIGF3YXkuXG4iKTsKKwkJfQorCX0KKworCWRwcmludGsoIlJQQzogJTRkIGV4aXQoKSA9ICVkXG4iLCB0YXNrLT50a19waWQsIHRhc2stPnRrX3N0YXR1cyk7CisJc3RhdHVzID0gdGFzay0+dGtfc3RhdHVzOworCisJLyogUmVsZWFzZSBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzayAqLworCXJwY19yZWxlYXNlX3Rhc2sodGFzayk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIFVzZXItdmlzaWJsZSBlbnRyeSBwb2ludCB0byB0aGUgc2NoZWR1bGVyLgorICoKKyAqIFRoaXMgbWF5IGJlIGNhbGxlZCByZWN1cnNpdmVseSBpZiBlLmcuIGFuIGFzeW5jIE5GUyB0YXNrIHVwZGF0ZXMKKyAqIHRoZSBhdHRyaWJ1dGVzIGFuZCBmaW5kcyB0aGF0IGRpcnR5IHBhZ2VzIG11c3QgYmUgZmx1c2hlZC4KKyAqIE5PVEU6IFVwb24gZXhpdCBvZiB0aGlzIGZ1bmN0aW9uIHRoZSB0YXNrIGlzIGd1YXJhbnRlZWQgdG8gYmUKKyAqCSByZWxlYXNlZC4gSW4gcGFydGljdWxhciBub3RlIHRoYXQgdGtfcmVsZWFzZSgpIHdpbGwgaGF2ZQorICoJIGJlZW4gY2FsbGVkLCBzbyB5b3VyIHRhc2sgbWVtb3J5IG1heSBoYXZlIGJlZW4gZnJlZWQuCisgKi8KK2ludAorcnBjX2V4ZWN1dGUoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCUJVR19PTih0YXNrLT50a19hY3RpdmUpOworCisJdGFzay0+dGtfYWN0aXZlID0gMTsKKwlycGNfc2V0X3J1bm5pbmcodGFzayk7CisJcmV0dXJuIF9fcnBjX2V4ZWN1dGUodGFzayk7Cit9CisKK3N0YXRpYyB2b2lkIHJwY19hc3luY19zY2hlZHVsZSh2b2lkICphcmcpCit7CisJX19ycGNfZXhlY3V0ZSgoc3RydWN0IHJwY190YXNrICopYXJnKTsKK30KKworLyoKKyAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgUlBDIHB1cnBvc2VzLgorICoKKyAqIFdlIHRyeSB0byBlbnN1cmUgdGhhdCBzb21lIE5GUyByZWFkcyBhbmQgd3JpdGVzIGNhbiBhbHdheXMgcHJvY2VlZAorICogYnkgdXNpbmcgYSBtZW1wb29sIHdoZW4gYWxsb2NhdGluZyAnc21hbGwnIGJ1ZmZlcnMuCisgKiBJbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgc3RhcnZhdGlvbiB0cmlnZ2VyaW5nIG1vcmUgd3JpdGViYWNrcyBvZgorICogTkZTIHJlcXVlc3RzLCB3ZSB1c2UgR0ZQX05PRlMgcmF0aGVyIHRoYW4gR0ZQX0tFUk5FTC4KKyAqLwordm9pZCAqCitycGNfbWFsbG9jKHN0cnVjdCBycGNfdGFzayAqdGFzaywgc2l6ZV90IHNpemUpCit7CisJaW50CWdmcDsKKworCWlmICh0YXNrLT50a19mbGFncyAmIFJQQ19UQVNLX1NXQVBQRVIpCisJCWdmcCA9IEdGUF9BVE9NSUM7CisJZWxzZQorCQlnZnAgPSBHRlBfTk9GUzsKKworCWlmIChzaXplID4gUlBDX0JVRkZFUl9NQVhTSVpFKSB7CisJCXRhc2stPnRrX2J1ZmZlciA9ICBrbWFsbG9jKHNpemUsIGdmcCk7CisJCWlmICh0YXNrLT50a19idWZmZXIpCisJCQl0YXNrLT50a19idWZzaXplID0gc2l6ZTsKKwl9IGVsc2UgeworCQl0YXNrLT50a19idWZmZXIgPSAgbWVtcG9vbF9hbGxvYyhycGNfYnVmZmVyX21lbXBvb2wsIGdmcCk7CisJCWlmICh0YXNrLT50a19idWZmZXIpCisJCQl0YXNrLT50a19idWZzaXplID0gUlBDX0JVRkZFUl9NQVhTSVpFOworCX0KKwlyZXR1cm4gdGFzay0+dGtfYnVmZmVyOworfQorCitzdGF0aWMgdm9pZAorcnBjX2ZyZWUoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCWlmICh0YXNrLT50a19idWZmZXIpIHsKKwkJaWYgKHRhc2stPnRrX2J1ZnNpemUgPT0gUlBDX0JVRkZFUl9NQVhTSVpFKQorCQkJbWVtcG9vbF9mcmVlKHRhc2stPnRrX2J1ZmZlciwgcnBjX2J1ZmZlcl9tZW1wb29sKTsKKwkJZWxzZQorCQkJa2ZyZWUodGFzay0+dGtfYnVmZmVyKTsKKwkJdGFzay0+dGtfYnVmZmVyID0gTlVMTDsKKwkJdGFzay0+dGtfYnVmc2l6ZSA9IDA7CisJfQorfQorCisvKgorICogQ3JlYXRpb24gYW5kIGRlbGV0aW9uIG9mIFJQQyB0YXNrIHN0cnVjdHVyZXMKKyAqLwordm9pZCBycGNfaW5pdF90YXNrKHN0cnVjdCBycGNfdGFzayAqdGFzaywgc3RydWN0IHJwY19jbG50ICpjbG50LCBycGNfYWN0aW9uIGNhbGxiYWNrLCBpbnQgZmxhZ3MpCit7CisJbWVtc2V0KHRhc2ssIDAsIHNpemVvZigqdGFzaykpOworCWluaXRfdGltZXIoJnRhc2stPnRrX3RpbWVyKTsKKwl0YXNrLT50a190aW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKSB0YXNrOworCXRhc2stPnRrX3RpbWVyLmZ1bmN0aW9uID0gKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKSBycGNfcnVuX3RpbWVyOworCXRhc2stPnRrX2NsaWVudCA9IGNsbnQ7CisJdGFzay0+dGtfZmxhZ3MgID0gZmxhZ3M7CisJdGFzay0+dGtfZXhpdCAgID0gY2FsbGJhY2s7CisKKwkvKiBJbml0aWFsaXplIHJldHJ5IGNvdW50ZXJzICovCisJdGFzay0+dGtfZ2FyYl9yZXRyeSA9IDI7CisJdGFzay0+dGtfY3JlZF9yZXRyeSA9IDI7CisKKwl0YXNrLT50a19wcmlvcml0eSA9IFJQQ19QUklPUklUWV9OT1JNQUw7CisJdGFzay0+dGtfY29va2llID0gKHVuc2lnbmVkIGxvbmcpY3VycmVudDsKKworCS8qIEluaXRpYWxpemUgd29ya3F1ZXVlIGZvciBhc3luYyB0YXNrcyAqLworCXRhc2stPnRrX3dvcmtxdWV1ZSA9IHJwY2lvZF93b3JrcXVldWU7CisJaWYgKCFSUENfSVNfQVNZTkModGFzaykpCisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRhc2stPnUudGtfd2FpdC53YWl0cSk7CisKKwlpZiAoY2xudCkgeworCQlhdG9taWNfaW5jKCZjbG50LT5jbF91c2Vycyk7CisJCWlmIChjbG50LT5jbF9zb2Z0cnRyeSkKKwkJCXRhc2stPnRrX2ZsYWdzIHw9IFJQQ19UQVNLX1NPRlQ7CisJCWlmICghY2xudC0+Y2xfaW50cikKKwkJCXRhc2stPnRrX2ZsYWdzIHw9IFJQQ19UQVNLX05PSU5UUjsKKwl9CisKKyNpZmRlZiBSUENfREVCVUcKKwl0YXNrLT50a19tYWdpYyA9IFJQQ19UQVNLX01BR0lDX0lEOworCXRhc2stPnRrX3BpZCA9IHJwY190YXNrX2lkKys7CisjZW5kaWYKKwkvKiBBZGQgdG8gZ2xvYmFsIGxpc3Qgb2YgYWxsIHRhc2tzICovCisJc3Bpbl9sb2NrKCZycGNfc2NoZWRfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmdGFzay0+dGtfdGFzaywgJmFsbF90YXNrcyk7CisJc3Bpbl91bmxvY2soJnJwY19zY2hlZF9sb2NrKTsKKworCWRwcmludGsoIlJQQzogJTRkIG5ldyB0YXNrIHByb2NwaWQgJWRcbiIsIHRhc2stPnRrX3BpZCwKKwkJCQljdXJyZW50LT5waWQpOworfQorCitzdGF0aWMgc3RydWN0IHJwY190YXNrICoKK3JwY19hbGxvY190YXNrKHZvaWQpCit7CisJcmV0dXJuIChzdHJ1Y3QgcnBjX3Rhc2sgKiltZW1wb29sX2FsbG9jKHJwY190YXNrX21lbXBvb2wsIEdGUF9OT0ZTKTsKK30KKworc3RhdGljIHZvaWQKK3JwY19kZWZhdWx0X2ZyZWVfdGFzayhzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJZHByaW50aygiUlBDOiAlNGQgZnJlZWluZyB0YXNrXG4iLCB0YXNrLT50a19waWQpOworCW1lbXBvb2xfZnJlZSh0YXNrLCBycGNfdGFza19tZW1wb29sKTsKK30KKworLyoKKyAqIENyZWF0ZSBhIG5ldyB0YXNrIGZvciB0aGUgc3BlY2lmaWVkIGNsaWVudC4gIFdlIGhhdmUgdG8KKyAqIGNsZWFuIHVwIGFmdGVyIGFuIGFsbG9jYXRpb24gZmFpbHVyZSwgYXMgdGhlIGNsaWVudCBtYXkKKyAqIGhhdmUgc3BlY2lmaWVkICJvbmVzaG90Ii4KKyAqLworc3RydWN0IHJwY190YXNrICoKK3JwY19uZXdfdGFzayhzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQsIHJwY19hY3Rpb24gY2FsbGJhY2ssIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgcnBjX3Rhc2sJKnRhc2s7CisKKwl0YXNrID0gcnBjX2FsbG9jX3Rhc2soKTsKKwlpZiAoIXRhc2spCisJCWdvdG8gY2xlYW51cDsKKworCXJwY19pbml0X3Rhc2sodGFzaywgY2xudCwgY2FsbGJhY2ssIGZsYWdzKTsKKworCS8qIFJlcGxhY2UgdGtfcmVsZWFzZSAqLworCXRhc2stPnRrX3JlbGVhc2UgPSBycGNfZGVmYXVsdF9mcmVlX3Rhc2s7CisKKwlkcHJpbnRrKCJSUEM6ICU0ZCBhbGxvY2F0ZWQgdGFza1xuIiwgdGFzay0+dGtfcGlkKTsKKwl0YXNrLT50a19mbGFncyB8PSBSUENfVEFTS19EWU5BTUlDOworb3V0OgorCXJldHVybiB0YXNrOworCitjbGVhbnVwOgorCS8qIENoZWNrIHdoZXRoZXIgdG8gcmVsZWFzZSB0aGUgY2xpZW50ICovCisJaWYgKGNsbnQpIHsKKwkJcHJpbnRrKCJycGNfbmV3X3Rhc2s6IGZhaWxlZCwgdXNlcnM9JWQsIG9uZXNob3Q9JWRcbiIsCisJCQlhdG9taWNfcmVhZCgmY2xudC0+Y2xfdXNlcnMpLCBjbG50LT5jbF9vbmVzaG90KTsKKwkJYXRvbWljX2luYygmY2xudC0+Y2xfdXNlcnMpOyAvKiBwcmV0ZW5kIHdlIHdlcmUgdXNlZCAuLi4gKi8KKwkJcnBjX3JlbGVhc2VfY2xpZW50KGNsbnQpOworCX0KKwlnb3RvIG91dDsKK30KKwordm9pZCBycGNfcmVsZWFzZV90YXNrKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlkcHJpbnRrKCJSUEM6ICU0ZCByZWxlYXNlIHRhc2tcbiIsIHRhc2stPnRrX3BpZCk7CisKKyNpZmRlZiBSUENfREVCVUcKKwlCVUdfT04odGFzay0+dGtfbWFnaWMgIT0gUlBDX1RBU0tfTUFHSUNfSUQpOworI2VuZGlmCisKKwkvKiBSZW1vdmUgZnJvbSBnbG9iYWwgdGFzayBsaXN0ICovCisJc3Bpbl9sb2NrKCZycGNfc2NoZWRfbG9jayk7CisJbGlzdF9kZWwoJnRhc2stPnRrX3Rhc2spOworCXNwaW5fdW5sb2NrKCZycGNfc2NoZWRfbG9jayk7CisKKwlCVUdfT04gKFJQQ19JU19RVUVVRUQodGFzaykpOworCXRhc2stPnRrX2FjdGl2ZSA9IDA7CisKKwkvKiBTeW5jaHJvbm91c2x5IGRlbGV0ZSBhbnkgcnVubmluZyB0aW1lciAqLworCXJwY19kZWxldGVfdGltZXIodGFzayk7CisKKwkvKiBSZWxlYXNlIHJlc291cmNlcyAqLworCWlmICh0YXNrLT50a19ycXN0cCkKKwkJeHBydF9yZWxlYXNlKHRhc2spOworCWlmICh0YXNrLT50a19tc2cucnBjX2NyZWQpCisJCXJwY2F1dGhfdW5iaW5kY3JlZCh0YXNrKTsKKwlycGNfZnJlZSh0YXNrKTsKKwlpZiAodGFzay0+dGtfY2xpZW50KSB7CisJCXJwY19yZWxlYXNlX2NsaWVudCh0YXNrLT50a19jbGllbnQpOworCQl0YXNrLT50a19jbGllbnQgPSBOVUxMOworCX0KKworI2lmZGVmIFJQQ19ERUJVRworCXRhc2stPnRrX21hZ2ljID0gMDsKKyNlbmRpZgorCWlmICh0YXNrLT50a19yZWxlYXNlKQorCQl0YXNrLT50a19yZWxlYXNlKHRhc2spOworfQorCisvKioKKyAqIHJwY19maW5kX3BhcmVudCAtIGZpbmQgdGhlIHBhcmVudCBvZiBhIGNoaWxkIHRhc2suCisgKiBAY2hpbGQ6IGNoaWxkIHRhc2sKKyAqCisgKiBDaGVja3MgdGhhdCB0aGUgcGFyZW50IHRhc2sgaXMgc3RpbGwgc2xlZXBpbmcgb24gdGhlCisgKiBxdWV1ZSAnY2hpbGRxJy4gSWYgc28gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHBhcmVudC4KKyAqIFVwb24gZmFpbHVyZSByZXR1cm5zIE5VTEwuCisgKgorICogQ2FsbGVyIG11c3QgaG9sZCBjaGlsZHEubG9jaworICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBycGNfdGFzayAqcnBjX2ZpbmRfcGFyZW50KHN0cnVjdCBycGNfdGFzayAqY2hpbGQpCit7CisJc3RydWN0IHJwY190YXNrCSp0YXNrLCAqcGFyZW50OworCXN0cnVjdCBsaXN0X2hlYWQgKmxlOworCisJcGFyZW50ID0gKHN0cnVjdCBycGNfdGFzayAqKSBjaGlsZC0+dGtfY2FsbGRhdGE7CisJdGFza19mb3JfZWFjaCh0YXNrLCBsZSwgJmNoaWxkcS50YXNrc1swXSkKKwkJaWYgKHRhc2sgPT0gcGFyZW50KQorCQkJcmV0dXJuIHBhcmVudDsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBycGNfY2hpbGRfZXhpdChzdHJ1Y3QgcnBjX3Rhc2sgKmNoaWxkKQoreworCXN0cnVjdCBycGNfdGFzawkqcGFyZW50OworCisJc3Bpbl9sb2NrX2JoKCZjaGlsZHEubG9jayk7CisJaWYgKChwYXJlbnQgPSBycGNfZmluZF9wYXJlbnQoY2hpbGQpKSAhPSBOVUxMKSB7CisJCXBhcmVudC0+dGtfc3RhdHVzID0gY2hpbGQtPnRrX3N0YXR1czsKKwkJX19ycGNfd2FrZV91cF90YXNrKHBhcmVudCk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZjaGlsZHEubG9jayk7Cit9CisKKy8qCisgKiBOb3RlOiBycGNfbmV3X3Rhc2sgcmVsZWFzZXMgdGhlIGNsaWVudCBhZnRlciBhIGZhaWx1cmUuCisgKi8KK3N0cnVjdCBycGNfdGFzayAqCitycGNfbmV3X2NoaWxkKHN0cnVjdCBycGNfY2xudCAqY2xudCwgc3RydWN0IHJwY190YXNrICpwYXJlbnQpCit7CisJc3RydWN0IHJwY190YXNrCSp0YXNrOworCisJdGFzayA9IHJwY19uZXdfdGFzayhjbG50LCBOVUxMLCBSUENfVEFTS19BU1lOQyB8IFJQQ19UQVNLX0NISUxEKTsKKwlpZiAoIXRhc2spCisJCWdvdG8gZmFpbDsKKwl0YXNrLT50a19leGl0ID0gcnBjX2NoaWxkX2V4aXQ7CisJdGFzay0+dGtfY2FsbGRhdGEgPSBwYXJlbnQ7CisJcmV0dXJuIHRhc2s7CisKK2ZhaWw6CisJcGFyZW50LT50a19zdGF0dXMgPSAtRU5PTUVNOworCXJldHVybiBOVUxMOworfQorCit2b2lkIHJwY19ydW5fY2hpbGQoc3RydWN0IHJwY190YXNrICp0YXNrLCBzdHJ1Y3QgcnBjX3Rhc2sgKmNoaWxkLCBycGNfYWN0aW9uIGZ1bmMpCit7CisJc3Bpbl9sb2NrX2JoKCZjaGlsZHEubG9jayk7CisJLyogTi5CLiBJcyBpdCBwb3NzaWJsZSBmb3IgdGhlIGNoaWxkIHRvIGhhdmUgYWxyZWFkeSBmaW5pc2hlZD8gKi8KKwlfX3JwY19zbGVlcF9vbigmY2hpbGRxLCB0YXNrLCBmdW5jLCBOVUxMKTsKKwlycGNfc2NoZWR1bGVfcnVuKGNoaWxkKTsKKwlzcGluX3VubG9ja19iaCgmY2hpbGRxLmxvY2spOworfQorCisvKgorICogS2lsbCBhbGwgdGFza3MgZm9yIHRoZSBnaXZlbiBjbGllbnQuCisgKiBYWFg6IGtpbGwgdGhlaXIgZGVzY2VuZGFudHMgYXMgd2VsbD8KKyAqLwordm9pZCBycGNfa2lsbGFsbF90YXNrcyhzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQpCit7CisJc3RydWN0IHJwY190YXNrCSpyb3ZyOworCXN0cnVjdCBsaXN0X2hlYWQgKmxlOworCisJZHByaW50aygiUlBDOiAgICAgIGtpbGxpbmcgYWxsIHRhc2tzIGZvciBjbGllbnQgJXBcbiIsIGNsbnQpOworCisJLyoKKwkgKiBTcGluIGxvY2sgYWxsX3Rhc2tzIHRvIHByZXZlbnQgY2hhbmdlcy4uLgorCSAqLworCXNwaW5fbG9jaygmcnBjX3NjaGVkX2xvY2spOworCWFsbHRhc2tfZm9yX2VhY2gocm92ciwgbGUsICZhbGxfdGFza3MpIHsKKwkJaWYgKCEgUlBDX0lTX0FDVElWQVRFRChyb3ZyKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIWNsbnQgfHwgcm92ci0+dGtfY2xpZW50ID09IGNsbnQpIHsKKwkJCXJvdnItPnRrX2ZsYWdzIHw9IFJQQ19UQVNLX0tJTExFRDsKKwkJCXJwY19leGl0KHJvdnIsIC1FSU8pOworCQkJcnBjX3dha2VfdXBfdGFzayhyb3ZyKTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmcnBjX3NjaGVkX2xvY2spOworfQorCitzdGF0aWMgREVDTEFSRV9NVVRFWF9MT0NLRUQocnBjaW9kX3J1bm5pbmcpOworCitzdGF0aWMgdm9pZCBycGNpb2Rfa2lsbGFsbCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmFsbF90YXNrcykpIHsKKwkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1NJR1BFTkRJTkcpOworCQlycGNfa2lsbGFsbF90YXNrcyhOVUxMKTsKKwkJZmx1c2hfd29ya3F1ZXVlKHJwY2lvZF93b3JrcXVldWUpOworCQlpZiAoIWxpc3RfZW1wdHkoJmFsbF90YXNrcykpIHsKKwkJCWRwcmludGsoInJwY2lvZF9raWxsYWxsOiB3YWl0aW5nIGZvciB0YXNrcyB0byBleGl0XG4iKTsKKwkJCXlpZWxkKCk7CisJCX0KKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworfQorCisvKgorICogU3RhcnQgdXAgdGhlIHJwY2lvZCBwcm9jZXNzIGlmIGl0J3Mgbm90IGFscmVhZHkgcnVubmluZy4KKyAqLworaW50CitycGNpb2RfdXAodm9pZCkKK3sKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7CisJaW50IGVycm9yID0gMDsKKworCWRvd24oJnJwY2lvZF9zZW1hKTsKKwlkcHJpbnRrKCJycGNpb2RfdXA6IHVzZXJzICVkXG4iLCBycGNpb2RfdXNlcnMpOworCXJwY2lvZF91c2VycysrOworCWlmIChycGNpb2Rfd29ya3F1ZXVlKQorCQlnb3RvIG91dDsKKwkvKgorCSAqIElmIHRoZXJlJ3Mgbm8gcGlkLCB3ZSBzaG91bGQgYmUgdGhlIGZpcnN0IHVzZXIuCisJICovCisJaWYgKHJwY2lvZF91c2VycyA+IDEpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInJwY2lvZF91cDogbm8gd29ya3F1ZXVlLCAlZCB1c2Vycz8/XG4iLCBycGNpb2RfdXNlcnMpOworCS8qCisJICogQ3JlYXRlIHRoZSBycGNpb2QgdGhyZWFkIGFuZCB3YWl0IGZvciBpdCB0byBzdGFydC4KKwkgKi8KKwllcnJvciA9IC1FTk9NRU07CisJd3EgPSBjcmVhdGVfd29ya3F1ZXVlKCJycGNpb2QiKTsKKwlpZiAod3EgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJycGNpb2RfdXA6IGNyZWF0ZSB3b3JrcXVldWUgZmFpbGVkLCBlcnJvcj0lZFxuIiwgZXJyb3IpOworCQlycGNpb2RfdXNlcnMtLTsKKwkJZ290byBvdXQ7CisJfQorCXJwY2lvZF93b3JrcXVldWUgPSB3cTsKKwllcnJvciA9IDA7CitvdXQ6CisJdXAoJnJwY2lvZF9zZW1hKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3ZvaWQKK3JwY2lvZF9kb3duKHZvaWQpCit7CisJZG93bigmcnBjaW9kX3NlbWEpOworCWRwcmludGsoInJwY2lvZF9kb3duIHNlbWEgJWRcbiIsIHJwY2lvZF91c2Vycyk7CisJaWYgKHJwY2lvZF91c2VycykgeworCQlpZiAoLS1ycGNpb2RfdXNlcnMpCisJCQlnb3RvIG91dDsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicnBjaW9kX2Rvd246IG5vIHVzZXJzPz9cbiIpOworCisJaWYgKCFycGNpb2Rfd29ya3F1ZXVlKSB7CisJCWRwcmludGsoInJwY2lvZF9kb3duOiBOb3RoaW5nIHRvIGRvIVxuIik7CisJCWdvdG8gb3V0OworCX0KKwlycGNpb2Rfa2lsbGFsbCgpOworCisJZGVzdHJveV93b3JrcXVldWUocnBjaW9kX3dvcmtxdWV1ZSk7CisJcnBjaW9kX3dvcmtxdWV1ZSA9IE5VTEw7Cisgb3V0OgorCXVwKCZycGNpb2Rfc2VtYSk7Cit9CisKKyNpZmRlZiBSUENfREVCVUcKK3ZvaWQgcnBjX3Nob3dfdGFza3Modm9pZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsZTsKKwlzdHJ1Y3QgcnBjX3Rhc2sgKnQ7CisKKwlzcGluX2xvY2soJnJwY19zY2hlZF9sb2NrKTsKKwlpZiAobGlzdF9lbXB0eSgmYWxsX3Rhc2tzKSkgeworCQlzcGluX3VubG9jaygmcnBjX3NjaGVkX2xvY2spOworCQlyZXR1cm47CisJfQorCXByaW50aygiLXBpZC0gcHJvYyBmbGdzIHN0YXR1cyAtY2xpZW50LSAtcHJvZy0gLS1ycXN0cC0gLXRpbWVvdXQgIgorCQkiLXJwY3dhaXQgLWFjdGlvbi0gLS1leGl0LS1cbiIpOworCWFsbHRhc2tfZm9yX2VhY2godCwgbGUsICZhbGxfdGFza3MpIHsKKwkJY29uc3QgY2hhciAqcnBjX3dhaXRxID0gIm5vbmUiOworCisJCWlmIChSUENfSVNfUVVFVUVEKHQpKQorCQkJcnBjX3dhaXRxID0gcnBjX3FuYW1lKHQtPnUudGtfd2FpdC5ycGNfd2FpdHEpOworCisJCXByaW50aygiJTA1ZCAlMDRkICUwNHggJTA2ZCAlOHAgJTZkICU4cCAlMDhsZCAlOHMgJThwICU4cFxuIiwKKwkJCXQtPnRrX3BpZCwKKwkJCSh0LT50a19tc2cucnBjX3Byb2MgPyB0LT50a19tc2cucnBjX3Byb2MtPnBfcHJvYyA6IC0xKSwKKwkJCXQtPnRrX2ZsYWdzLCB0LT50a19zdGF0dXMsCisJCQl0LT50a19jbGllbnQsCisJCQkodC0+dGtfY2xpZW50ID8gdC0+dGtfY2xpZW50LT5jbF9wcm9nIDogMCksCisJCQl0LT50a19ycXN0cCwgdC0+dGtfdGltZW91dCwKKwkJCXJwY193YWl0cSwKKwkJCXQtPnRrX2FjdGlvbiwgdC0+dGtfZXhpdCk7CisJfQorCXNwaW5fdW5sb2NrKCZycGNfc2NoZWRfbG9jayk7Cit9CisjZW5kaWYKKwordm9pZAorcnBjX2Rlc3Ryb3lfbWVtcG9vbCh2b2lkKQoreworCWlmIChycGNfYnVmZmVyX21lbXBvb2wpCisJCW1lbXBvb2xfZGVzdHJveShycGNfYnVmZmVyX21lbXBvb2wpOworCWlmIChycGNfdGFza19tZW1wb29sKQorCQltZW1wb29sX2Rlc3Ryb3kocnBjX3Rhc2tfbWVtcG9vbCk7CisJaWYgKHJwY190YXNrX3NsYWJwICYmIGttZW1fY2FjaGVfZGVzdHJveShycGNfdGFza19zbGFicCkpCisJCXByaW50ayhLRVJOX0lORk8gInJwY190YXNrOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7CisJaWYgKHJwY19idWZmZXJfc2xhYnAgJiYga21lbV9jYWNoZV9kZXN0cm95KHJwY19idWZmZXJfc2xhYnApKQorCQlwcmludGsoS0VSTl9JTkZPICJycGNfYnVmZmVyczogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworfQorCitpbnQKK3JwY19pbml0X21lbXBvb2wodm9pZCkKK3sKKwlycGNfdGFza19zbGFicCA9IGttZW1fY2FjaGVfY3JlYXRlKCJycGNfdGFza3MiLAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgcnBjX3Rhc2spLAorCQkJCQkgICAgIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwKKwkJCQkJICAgICBOVUxMLCBOVUxMKTsKKwlpZiAoIXJwY190YXNrX3NsYWJwKQorCQlnb3RvIGVycl9ub21lbTsKKwlycGNfYnVmZmVyX3NsYWJwID0ga21lbV9jYWNoZV9jcmVhdGUoInJwY19idWZmZXJzIiwKKwkJCQkJICAgICBSUENfQlVGRkVSX01BWFNJWkUsCisJCQkJCSAgICAgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOLAorCQkJCQkgICAgIE5VTEwsIE5VTEwpOworCWlmICghcnBjX2J1ZmZlcl9zbGFicCkKKwkJZ290byBlcnJfbm9tZW07CisJcnBjX3Rhc2tfbWVtcG9vbCA9IG1lbXBvb2xfY3JlYXRlKFJQQ19UQVNLX1BPT0xTSVpFLAorCQkJCQkgICAgbWVtcG9vbF9hbGxvY19zbGFiLAorCQkJCQkgICAgbWVtcG9vbF9mcmVlX3NsYWIsCisJCQkJCSAgICBycGNfdGFza19zbGFicCk7CisJaWYgKCFycGNfdGFza19tZW1wb29sKQorCQlnb3RvIGVycl9ub21lbTsKKwlycGNfYnVmZmVyX21lbXBvb2wgPSBtZW1wb29sX2NyZWF0ZShSUENfQlVGRkVSX1BPT0xTSVpFLAorCQkJCQkgICAgbWVtcG9vbF9hbGxvY19zbGFiLAorCQkJCQkgICAgbWVtcG9vbF9mcmVlX3NsYWIsCisJCQkJCSAgICBycGNfYnVmZmVyX3NsYWJwKTsKKwlpZiAoIXJwY19idWZmZXJfbWVtcG9vbCkKKwkJZ290byBlcnJfbm9tZW07CisJcmV0dXJuIDA7CitlcnJfbm9tZW06CisJcnBjX2Rlc3Ryb3lfbWVtcG9vbCgpOworCXJldHVybiAtRU5PTUVNOworfQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdGF0cy5jIGIvbmV0L3N1bnJwYy9zdGF0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNjdkYzEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc3VucnBjL3N0YXRzLmMKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiBsaW51eC9uZXQvc3VucnBjL3N0YXRzLmMKKyAqCisgKiBwcm9jZnMtYmFzZWQgdXNlciBhY2Nlc3MgdG8gZ2VuZXJpYyBSUEMgc3RhdGlzdGljcy4gVGhlIHN0YXRzIGZpbGVzCisgKiByZXNpZGUgaW4gL3Byb2MvbmV0L3JwYy4KKyAqCisgKiBUaGUgcmVhZCByb3V0aW5lcyBhc3N1bWUgdGhhdCB0aGUgYnVmZmVyIHBhc3NlZCBpbiBpcyBqdXN0IGJpZyBlbm91Z2guCisgKiBJZiB5b3UgaW1wbGVtZW50IGFuIFJQQyBzZXJ2aWNlIHRoYXQgaGFzIGl0cyBvd24gc3RhdHMgcm91dGluZSB3aGljaAorICogYXBwZW5kcyB0aGUgZ2VuZXJpYyBSUEMgc3RhdHMsIG1ha2Ugc3VyZSB5b3UgZG9uJ3QgZXhjZWVkIHRoZSBQQUdFX1NJWkUKKyAqIGxpbWl0LgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNzb2NrLmg+CisKKyNkZWZpbmUgUlBDREJHX0ZBQ0lMSVRZCVJQQ0RCR19NSVNDCisKK3N0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqcHJvY19uZXRfcnBjID0gTlVMTDsKKworLyoKKyAqIEdldCBSUEMgY2xpZW50IHN0YXRzCisgKi8KK3N0YXRpYyBpbnQgcnBjX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikgeworCWNvbnN0IHN0cnVjdCBycGNfc3RhdAkqc3RhdHAgPSBzZXEtPnByaXZhdGU7CisJY29uc3Qgc3RydWN0IHJwY19wcm9ncmFtICpwcm9nID0gc3RhdHAtPnByb2dyYW07CisJaW50CQlpLCBqOworCisJc2VxX3ByaW50ZihzZXEsCisJCSJuZXQgJWQgJWQgJWQgJWRcbiIsCisJCQlzdGF0cC0+bmV0Y250LAorCQkJc3RhdHAtPm5ldHVkcGNudCwKKwkJCXN0YXRwLT5uZXR0Y3BjbnQsCisJCQlzdGF0cC0+bmV0dGNwY29ubik7CisJc2VxX3ByaW50ZihzZXEsCisJCSJycGMgJWQgJWQgJWRcbiIsCisJCQlzdGF0cC0+cnBjY250LAorCQkJc3RhdHAtPnJwY3JldHJhbnMsCisJCQlzdGF0cC0+cnBjYXV0aHJlZnJlc2gpOworCisJZm9yIChpID0gMDsgaSA8IHByb2ctPm5ydmVyczsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBycGNfdmVyc2lvbiAqdmVycyA9IHByb2ctPnZlcnNpb25baV07CisJCWlmICghdmVycykKKwkJCWNvbnRpbnVlOworCQlzZXFfcHJpbnRmKHNlcSwgInByb2MlZCAlZCIsCisJCQkJCXZlcnMtPm51bWJlciwgdmVycy0+bnJwcm9jcyk7CisJCWZvciAoaiA9IDA7IGogPCB2ZXJzLT5ucnByb2NzOyBqKyspCisJCQlzZXFfcHJpbnRmKHNlcSwgIiAlZCIsCisJCQkJCXZlcnMtPnByb2NzW2pdLnBfY291bnQpOworCQlzZXFfcHV0YyhzZXEsICdcbicpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBycGNfcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBycGNfcHJvY19zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnBjX3Byb2NfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IHJwY19wcm9jX29wZW4sCisJLnJlYWQgID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworLyoKKyAqIEdldCBSUEMgc2VydmVyIHN0YXRzCisgKi8KK3ZvaWQgc3ZjX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBjb25zdCBzdHJ1Y3Qgc3ZjX3N0YXQgKnN0YXRwKSB7CisJY29uc3Qgc3RydWN0IHN2Y19wcm9ncmFtICpwcm9nID0gc3RhdHAtPnByb2dyYW07CisJY29uc3Qgc3RydWN0IHN2Y19wcm9jZWR1cmUgKnByb2M7CisJY29uc3Qgc3RydWN0IHN2Y192ZXJzaW9uICp2ZXJzOworCWludAkJaSwgajsKKworCXNlcV9wcmludGYoc2VxLAorCQkibmV0ICVkICVkICVkICVkXG4iLAorCQkJc3RhdHAtPm5ldGNudCwKKwkJCXN0YXRwLT5uZXR1ZHBjbnQsCisJCQlzdGF0cC0+bmV0dGNwY250LAorCQkJc3RhdHAtPm5ldHRjcGNvbm4pOworCXNlcV9wcmludGYoc2VxLAorCQkicnBjICVkICVkICVkICVkICVkXG4iLAorCQkJc3RhdHAtPnJwY2NudCwKKwkJCXN0YXRwLT5ycGNiYWRmbXQrc3RhdHAtPnJwY2JhZGF1dGgrc3RhdHAtPnJwY2JhZGNsbnQsCisJCQlzdGF0cC0+cnBjYmFkZm10LAorCQkJc3RhdHAtPnJwY2JhZGF1dGgsCisJCQlzdGF0cC0+cnBjYmFkY2xudCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJvZy0+cGdfbnZlcnM7IGkrKykgeworCQlpZiAoISh2ZXJzID0gcHJvZy0+cGdfdmVyc1tpXSkgfHwgIShwcm9jID0gdmVycy0+dnNfcHJvYykpCisJCQljb250aW51ZTsKKwkJc2VxX3ByaW50ZihzZXEsICJwcm9jJWQgJWQiLCBpLCB2ZXJzLT52c19ucHJvYyk7CisJCWZvciAoaiA9IDA7IGogPCB2ZXJzLT52c19ucHJvYzsgaisrLCBwcm9jKyspCisJCQlzZXFfcHJpbnRmKHNlcSwgIiAlZCIsIHByb2MtPnBjX2NvdW50KTsKKwkJc2VxX3B1dGMoc2VxLCAnXG4nKTsKKwl9Cit9CisKKy8qCisgKiBSZWdpc3Rlci91bnJlZ2lzdGVyIFJQQyBwcm9jIGZpbGVzCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHByb2NfZGlyX2VudHJ5ICoKK2RvX3JlZ2lzdGVyKGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEsIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnQ7CisKKwlycGNfcHJvY19pbml0KCk7CisJZHByaW50aygiUlBDOiByZWdpc3RlcmluZyAvcHJvYy9uZXQvcnBjLyVzXG4iLCBuYW1lKTsKKworCWVudCA9IGNyZWF0ZV9wcm9jX2VudHJ5KG5hbWUsIDAsIHByb2NfbmV0X3JwYyk7CisJaWYgKGVudCkgeworCQllbnQtPnByb2NfZm9wcyA9IGZvcHM7CisJCWVudC0+ZGF0YSA9IGRhdGE7CisJfQorCXJldHVybiBlbnQ7Cit9CisKK3N0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqCitycGNfcHJvY19yZWdpc3RlcihzdHJ1Y3QgcnBjX3N0YXQgKnN0YXRwKQoreworCXJldHVybiBkb19yZWdpc3RlcihzdGF0cC0+cHJvZ3JhbS0+bmFtZSwgc3RhdHAsICZycGNfcHJvY19mb3BzKTsKK30KKwordm9pZAorcnBjX3Byb2NfdW5yZWdpc3Rlcihjb25zdCBjaGFyICpuYW1lKQoreworCXJlbW92ZV9wcm9jX2VudHJ5KG5hbWUsIHByb2NfbmV0X3JwYyk7Cit9CisKK3N0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqCitzdmNfcHJvY19yZWdpc3RlcihzdHJ1Y3Qgc3ZjX3N0YXQgKnN0YXRwLCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzKQoreworCXJldHVybiBkb19yZWdpc3RlcihzdGF0cC0+cHJvZ3JhbS0+cGdfbmFtZSwgc3RhdHAsIGZvcHMpOworfQorCit2b2lkCitzdmNfcHJvY191bnJlZ2lzdGVyKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkobmFtZSwgcHJvY19uZXRfcnBjKTsKK30KKwordm9pZAorcnBjX3Byb2NfaW5pdCh2b2lkKQoreworCWRwcmludGsoIlJQQzogcmVnaXN0ZXJpbmcgL3Byb2MvbmV0L3JwY1xuIik7CisJaWYgKCFwcm9jX25ldF9ycGMpIHsKKwkJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnQ7CisJCWVudCA9IHByb2NfbWtkaXIoInJwYyIsIHByb2NfbmV0KTsKKwkJaWYgKGVudCkgeworCQkJZW50LT5vd25lciA9IFRISVNfTU9EVUxFOworCQkJcHJvY19uZXRfcnBjID0gZW50OworCQl9CisJfQorfQorCit2b2lkCitycGNfcHJvY19leGl0KHZvaWQpCit7CisJZHByaW50aygiUlBDOiB1bnJlZ2lzdGVyaW5nIC9wcm9jL25ldC9ycGNcbiIpOworCWlmIChwcm9jX25ldF9ycGMpIHsKKwkJcHJvY19uZXRfcnBjID0gTlVMTDsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoIm5ldC9ycGMiLCBOVUxMKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3VucnBjX3N5bXMuYyBiL25ldC9zdW5ycGMvc3VucnBjX3N5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGYyNmJmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3N1bnJwYy9zdW5ycGNfc3ltcy5jCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogbGludXgvbmV0L3N1bnJwYy9zdW5ycGNfc3ltcy5jCisgKgorICogU3ltYm9scyBleHBvcnRlZCBieSB0aGUgc3VucnBjIG1vZHVsZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNzb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2F1dGguaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvcnBjX3BpcGVfZnMuaD4KKworCisvKiBSUEMgc2NoZWR1bGVyICovCitFWFBPUlRfU1lNQk9MKHJwY19leGVjdXRlKTsKK0VYUE9SVF9TWU1CT0wocnBjX2luaXRfdGFzayk7CitFWFBPUlRfU1lNQk9MKHJwY19zbGVlcF9vbik7CitFWFBPUlRfU1lNQk9MKHJwY193YWtlX3VwX25leHQpOworRVhQT1JUX1NZTUJPTChycGNfd2FrZV91cF90YXNrKTsKK0VYUE9SVF9TWU1CT0wocnBjX25ld19jaGlsZCk7CitFWFBPUlRfU1lNQk9MKHJwY19ydW5fY2hpbGQpOworRVhQT1JUX1NZTUJPTChycGNpb2RfZG93bik7CitFWFBPUlRfU1lNQk9MKHJwY2lvZF91cCk7CitFWFBPUlRfU1lNQk9MKHJwY19uZXdfdGFzayk7CitFWFBPUlRfU1lNQk9MKHJwY193YWtlX3VwX3N0YXR1cyk7CitFWFBPUlRfU1lNQk9MKHJwY19yZWxlYXNlX3Rhc2spOworCisvKiBSUEMgY2xpZW50IGZ1bmN0aW9ucyAqLworRVhQT1JUX1NZTUJPTChycGNfY3JlYXRlX2NsaWVudCk7CitFWFBPUlRfU1lNQk9MKHJwY19jbG9uZV9jbGllbnQpOworRVhQT1JUX1NZTUJPTChycGNfZGVzdHJveV9jbGllbnQpOworRVhQT1JUX1NZTUJPTChycGNfc2h1dGRvd25fY2xpZW50KTsKK0VYUE9SVF9TWU1CT0wocnBjX3JlbGVhc2VfY2xpZW50KTsKK0VYUE9SVF9TWU1CT0wocnBjX2tpbGxhbGxfdGFza3MpOworRVhQT1JUX1NZTUJPTChycGNfY2FsbF9zeW5jKTsKK0VYUE9SVF9TWU1CT0wocnBjX2NhbGxfYXN5bmMpOworRVhQT1JUX1NZTUJPTChycGNfY2FsbF9zZXR1cCk7CitFWFBPUlRfU1lNQk9MKHJwY19jbG50X3NpZ21hc2spOworRVhQT1JUX1NZTUJPTChycGNfY2xudF9zaWd1bm1hc2spOworRVhQT1JUX1NZTUJPTChycGNfZGVsYXkpOworRVhQT1JUX1NZTUJPTChycGNfcmVzdGFydF9jYWxsKTsKK0VYUE9SVF9TWU1CT0wocnBjX3NldGJ1ZnNpemUpOworRVhQT1JUX1NZTUJPTChycGNfdW5saW5rKTsKK0VYUE9SVF9TWU1CT0wocnBjX3dha2VfdXApOworRVhQT1JUX1NZTUJPTChycGNfcXVldWVfdXBjYWxsKTsKK0VYUE9SVF9TWU1CT0wocnBjX21rcGlwZSk7CisKKy8qIENsaWVudCB0cmFuc3BvcnQgKi8KK0VYUE9SVF9TWU1CT0woeHBydF9jcmVhdGVfcHJvdG8pOworRVhQT1JUX1NZTUJPTCh4cHJ0X2Rlc3Ryb3kpOworRVhQT1JUX1NZTUJPTCh4cHJ0X3NldF90aW1lb3V0KTsKK0VYUE9SVF9TWU1CT0woeHBydF91ZHBfc2xvdF90YWJsZV9lbnRyaWVzKTsKK0VYUE9SVF9TWU1CT0woeHBydF90Y3Bfc2xvdF90YWJsZV9lbnRyaWVzKTsKKworLyogQ2xpZW50IGNyZWRlbnRpYWwgY2FjaGUgKi8KK0VYUE9SVF9TWU1CT0wocnBjYXV0aF9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKHJwY2F1dGhfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKHJwY2F1dGhfY3JlYXRlKTsKK0VYUE9SVF9TWU1CT0wocnBjYXV0aF9sb29rdXBjcmVkKTsKK0VYUE9SVF9TWU1CT0wocnBjYXV0aF9sb29rdXBfY3JlZGNhY2hlKTsKK0VYUE9SVF9TWU1CT0wocnBjYXV0aF9mcmVlX2NyZWRjYWNoZSk7CitFWFBPUlRfU1lNQk9MKHJwY2F1dGhfaW5pdF9jcmVkY2FjaGUpOworRVhQT1JUX1NZTUJPTChwdXRfcnBjY3JlZCk7CisKKy8qIFJQQyBzZXJ2ZXIgc3R1ZmYgKi8KK0VYUE9SVF9TWU1CT0woc3ZjX2NyZWF0ZSk7CitFWFBPUlRfU1lNQk9MKHN2Y19jcmVhdGVfdGhyZWFkKTsKK0VYUE9SVF9TWU1CT0woc3ZjX2V4aXRfdGhyZWFkKTsKK0VYUE9SVF9TWU1CT0woc3ZjX2Rlc3Ryb3kpOworRVhQT1JUX1NZTUJPTChzdmNfZHJvcCk7CitFWFBPUlRfU1lNQk9MKHN2Y19wcm9jZXNzKTsKK0VYUE9SVF9TWU1CT0woc3ZjX3JlY3YpOworRVhQT1JUX1NZTUJPTChzdmNfd2FrZV91cCk7CitFWFBPUlRfU1lNQk9MKHN2Y19tYWtlc29jayk7CitFWFBPUlRfU1lNQk9MKHN2Y19yZXNlcnZlKTsKK0VYUE9SVF9TWU1CT0woc3ZjX2F1dGhfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChhdXRoX2RvbWFpbl9sb29rdXApOworRVhQT1JUX1NZTUJPTChzdmNfYXV0aGVudGljYXRlKTsKK0VYUE9SVF9TWU1CT0woc3ZjX3NldF9jbGllbnQpOworCisvKiBSUEMgc3RhdGlzdGljcyAqLworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitFWFBPUlRfU1lNQk9MKHJwY19wcm9jX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0wocnBjX3Byb2NfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKHN2Y19wcm9jX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woc3ZjX3Byb2NfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKHN2Y19zZXFfc2hvdyk7CisjZW5kaWYKKworLyogY2FjaGluZy4uLiAqLworRVhQT1JUX1NZTUJPTChhdXRoX2RvbWFpbl9maW5kKTsKK0VYUE9SVF9TWU1CT0woYXV0aF9kb21haW5fcHV0KTsKK0VYUE9SVF9TWU1CT0woYXV0aF91bml4X2FkZF9hZGRyKTsKK0VYUE9SVF9TWU1CT0woYXV0aF91bml4X2ZvcmdldF9vbGQpOworRVhQT1JUX1NZTUJPTChhdXRoX3VuaXhfbG9va3VwKTsKK0VYUE9SVF9TWU1CT0woY2FjaGVfY2hlY2spOworRVhQT1JUX1NZTUJPTChjYWNoZV9mbHVzaCk7CitFWFBPUlRfU1lNQk9MKGNhY2hlX3B1cmdlKTsKK0VYUE9SVF9TWU1CT0woY2FjaGVfZnJlc2gpOworRVhQT1JUX1NZTUJPTChjYWNoZV9pbml0KTsKK0VYUE9SVF9TWU1CT0woY2FjaGVfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChjYWNoZV91bnJlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0wocXdvcmRfYWRkKTsKK0VYUE9SVF9TWU1CT0wocXdvcmRfYWRkaGV4KTsKK0VYUE9SVF9TWU1CT0wocXdvcmRfZ2V0KTsKK0VYUE9SVF9TWU1CT0woc3ZjYXV0aF91bml4X3B1cmdlKTsKK0VYUE9SVF9TWU1CT0wodW5peF9kb21haW5fZmluZCk7CisKKy8qIEdlbmVyaWMgWERSICovCitFWFBPUlRfU1lNQk9MKHhkcl9lbmNvZGVfc3RyaW5nKTsKK0VYUE9SVF9TWU1CT0woeGRyX2RlY29kZV9zdHJpbmcpOworRVhQT1JUX1NZTUJPTCh4ZHJfZGVjb2RlX3N0cmluZ19pbnBsYWNlKTsKK0VYUE9SVF9TWU1CT0woeGRyX2RlY29kZV9uZXRvYmopOworRVhQT1JUX1NZTUJPTCh4ZHJfZW5jb2RlX25ldG9iaik7CitFWFBPUlRfU1lNQk9MKHhkcl9lbmNvZGVfcGFnZXMpOworRVhQT1JUX1NZTUJPTCh4ZHJfaW5saW5lX3BhZ2VzKTsKK0VYUE9SVF9TWU1CT0woeGRyX3NoaWZ0X2J1Zik7CitFWFBPUlRfU1lNQk9MKHhkcl9idWZfZnJvbV9pb3YpOworRVhQT1JUX1NZTUJPTCh4ZHJfYnVmX3N1YnNlZ21lbnQpOworRVhQT1JUX1NZTUJPTCh4ZHJfYnVmX3JlYWRfbmV0b2JqKTsKK0VYUE9SVF9TWU1CT0wocmVhZF9ieXRlc19mcm9tX3hkcl9idWYpOworCisvKiBEZWJ1Z2dpbmcgc3ltYm9scyAqLworI2lmZGVmIFJQQ19ERUJVRworRVhQT1JUX1NZTUJPTChycGNfZGVidWcpOworRVhQT1JUX1NZTUJPTChuZnNfZGVidWcpOworRVhQT1JUX1NZTUJPTChuZnNkX2RlYnVnKTsKK0VYUE9SVF9TWU1CT0wobmxtX2RlYnVnKTsKKyNlbmRpZgorCitleHRlcm4gaW50IHJlZ2lzdGVyX3JwY19waXBlZnModm9pZCk7CitleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX3JwY19waXBlZnModm9pZCk7CisKK3N0YXRpYyBpbnQgX19pbml0Citpbml0X3N1bnJwYyh2b2lkKQoreworCWludCBlcnIgPSByZWdpc3Rlcl9ycGNfcGlwZWZzKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gcnBjX2luaXRfbWVtcG9vbCgpICE9IDA7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisjaWZkZWYgUlBDX0RFQlVHCisJcnBjX3JlZ2lzdGVyX3N5c2N0bCgpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlycGNfcHJvY19pbml0KCk7CisjZW5kaWYKKwljYWNoZV9yZWdpc3RlcigmYXV0aF9kb21haW5fY2FjaGUpOworCWNhY2hlX3JlZ2lzdGVyKCZpcF9tYXBfY2FjaGUpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorY2xlYW51cF9zdW5ycGModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX3JwY19waXBlZnMoKTsKKwlycGNfZGVzdHJveV9tZW1wb29sKCk7CisJY2FjaGVfdW5yZWdpc3RlcigmYXV0aF9kb21haW5fY2FjaGUpOworCWNhY2hlX3VucmVnaXN0ZXIoJmlwX21hcF9jYWNoZSk7CisjaWZkZWYgUlBDX0RFQlVHCisJcnBjX3VucmVnaXN0ZXJfc3lzY3RsKCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXJwY19wcm9jX2V4aXQoKTsKKyNlbmRpZgorfQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX2luaXQoaW5pdF9zdW5ycGMpOworbW9kdWxlX2V4aXQoY2xlYW51cF9zdW5ycGMpOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmMuYyBiL25ldC9zdW5ycGMvc3ZjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIyZDk5ZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zdW5ycGMvc3ZjLmMKQEAgLTAsMCArMSw0OTAgQEAKKy8qCisgKiBsaW51eC9uZXQvc3VucnBjL3N2Yy5jCisgKgorICogSGlnaC1sZXZlbCBSUEMgc2VydmljZSByb3V0aW5lcworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMveGRyLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N0YXRzLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Y3NvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorCisjZGVmaW5lIFJQQ0RCR19GQUNJTElUWQlSUENEQkdfU1ZDRFNQCisjZGVmaW5lIFJQQ19QQVJBTk9JQSAxCisKKy8qCisgKiBDcmVhdGUgYW4gUlBDIHNlcnZpY2UKKyAqLworc3RydWN0IHN2Y19zZXJ2ICoKK3N2Y19jcmVhdGUoc3RydWN0IHN2Y19wcm9ncmFtICpwcm9nLCB1bnNpZ25lZCBpbnQgYnVmc2l6ZSkKK3sKKwlzdHJ1Y3Qgc3ZjX3NlcnYJKnNlcnY7CisJaW50IHZlcnM7CisJdW5zaWduZWQgaW50IHhkcnNpemU7CisKKwlpZiAoIShzZXJ2ID0gKHN0cnVjdCBzdmNfc2VydiAqKSBrbWFsbG9jKHNpemVvZigqc2VydiksIEdGUF9LRVJORUwpKSkKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KHNlcnYsIDAsIHNpemVvZigqc2VydikpOworCXNlcnYtPnN2X3Byb2dyYW0gICA9IHByb2c7CisJc2Vydi0+c3ZfbnJ0aHJlYWRzID0gMTsKKwlzZXJ2LT5zdl9zdGF0cyAgICAgPSBwcm9nLT5wZ19zdGF0czsKKwlzZXJ2LT5zdl9idWZzegkgICA9IGJ1ZnNpemU/IGJ1ZnNpemUgOiA0MDk2OworCXByb2ctPnBnX2xvdmVycyA9IHByb2ctPnBnX252ZXJzLTE7CisJeGRyc2l6ZSA9IDA7CisJZm9yICh2ZXJzPTA7IHZlcnM8cHJvZy0+cGdfbnZlcnMgOyB2ZXJzKyspCisJCWlmIChwcm9nLT5wZ192ZXJzW3ZlcnNdKSB7CisJCQlwcm9nLT5wZ19oaXZlcnMgPSB2ZXJzOworCQkJaWYgKHByb2ctPnBnX2xvdmVycyA+IHZlcnMpCisJCQkJcHJvZy0+cGdfbG92ZXJzID0gdmVyczsKKwkJCWlmIChwcm9nLT5wZ192ZXJzW3ZlcnNdLT52c194ZHJzaXplID4geGRyc2l6ZSkKKwkJCQl4ZHJzaXplID0gcHJvZy0+cGdfdmVyc1t2ZXJzXS0+dnNfeGRyc2l6ZTsKKwkJfQorCXNlcnYtPnN2X3hkcnNpemUgICA9IHhkcnNpemU7CisJSU5JVF9MSVNUX0hFQUQoJnNlcnYtPnN2X3RocmVhZHMpOworCUlOSVRfTElTVF9IRUFEKCZzZXJ2LT5zdl9zb2NrZXRzKTsKKwlJTklUX0xJU1RfSEVBRCgmc2Vydi0+c3ZfdGVtcHNvY2tzKTsKKwlJTklUX0xJU1RfSEVBRCgmc2Vydi0+c3ZfcGVybXNvY2tzKTsKKwlzcGluX2xvY2tfaW5pdCgmc2Vydi0+c3ZfbG9jayk7CisKKwlzZXJ2LT5zdl9uYW1lICAgICAgPSBwcm9nLT5wZ19uYW1lOworCisJLyogUmVtb3ZlIGFueSBzdGFsZSBwb3J0bWFwIHJlZ2lzdHJhdGlvbnMgKi8KKwlzdmNfcmVnaXN0ZXIoc2VydiwgMCwgMCk7CisKKwlyZXR1cm4gc2VydjsKK30KKworLyoKKyAqIERlc3Ryb3kgYW4gUlBDIHNlcnZpY2UKKyAqLwordm9pZAorc3ZjX2Rlc3Ryb3koc3RydWN0IHN2Y19zZXJ2ICpzZXJ2KQoreworCXN0cnVjdCBzdmNfc29jawkqc3ZzazsKKworCWRwcmludGsoIlJQQzogc3ZjX2Rlc3Ryb3koJXMsICVkKVxuIiwKKwkJCQlzZXJ2LT5zdl9wcm9ncmFtLT5wZ19uYW1lLAorCQkJCXNlcnYtPnN2X25ydGhyZWFkcyk7CisKKwlpZiAoc2Vydi0+c3ZfbnJ0aHJlYWRzKSB7CisJCWlmICgtLShzZXJ2LT5zdl9ucnRocmVhZHMpICE9IDApIHsKKwkJCXN2Y19zb2NrX3VwZGF0ZV9idWZzKHNlcnYpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlCisJCXByaW50aygic3ZjX2Rlc3Ryb3k6IG5vIHRocmVhZHMgZm9yIHNlcnY9JXAhXG4iLCBzZXJ2KTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmc2Vydi0+c3ZfdGVtcHNvY2tzKSkgeworCQlzdnNrID0gbGlzdF9lbnRyeShzZXJ2LT5zdl90ZW1wc29ja3MubmV4dCwKKwkJCQkgIHN0cnVjdCBzdmNfc29jaywKKwkJCQkgIHNrX2xpc3QpOworCQlzdmNfZGVsZXRlX3NvY2tldChzdnNrKTsKKwl9CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZzZXJ2LT5zdl9wZXJtc29ja3MpKSB7CisJCXN2c2sgPSBsaXN0X2VudHJ5KHNlcnYtPnN2X3Blcm1zb2Nrcy5uZXh0LAorCQkJCSAgc3RydWN0IHN2Y19zb2NrLAorCQkJCSAgc2tfbGlzdCk7CisJCXN2Y19kZWxldGVfc29ja2V0KHN2c2spOworCX0KKwkKKwljYWNoZV9jbGVhbl9kZWZlcnJlZChzZXJ2KTsKKworCS8qIFVucmVnaXN0ZXIgc2VydmljZSB3aXRoIHRoZSBwb3J0bWFwcGVyICovCisJc3ZjX3JlZ2lzdGVyKHNlcnYsIDAsIDApOworCWtmcmVlKHNlcnYpOworfQorCisvKgorICogQWxsb2NhdGUgYW4gUlBDIHNlcnZlcidzIGJ1ZmZlciBzcGFjZS4KKyAqIFdlIGFsbG9jYXRlIHBhZ2VzIGFuZCBwbGFjZSB0aGVtIGluIHJxX2FyZ3BhZ2VzLgorICovCitzdGF0aWMgaW50CitzdmNfaW5pdF9idWZmZXIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdW5zaWduZWQgaW50IHNpemUpCit7CisJaW50IHBhZ2VzOworCWludCBhcmdoaTsKKwkKKwlpZiAoc2l6ZSA+IFJQQ1NWQ19NQVhQQVlMT0FEKQorCQlzaXplID0gUlBDU1ZDX01BWFBBWUxPQUQ7CisJcGFnZXMgPSAyICsgKHNpemUrIFBBR0VfU0laRSAtMSkgLyBQQUdFX1NJWkU7CisJcnFzdHAtPnJxX2FyZ3VzZWQgPSAwOworCXJxc3RwLT5ycV9yZXN1c2VkID0gMDsKKwlhcmdoaSA9IDA7CisJaWYgKHBhZ2VzID4gUlBDU1ZDX01BWFBBR0VTKQorCQlCVUcoKTsKKwl3aGlsZSAocGFnZXMpIHsKKwkJc3RydWN0IHBhZ2UgKnAgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOworCQlpZiAoIXApCisJCQlicmVhazsKKwkJcnFzdHAtPnJxX2FyZ3BhZ2VzW2FyZ2hpKytdID0gcDsKKwkJcGFnZXMtLTsKKwl9CisJcnFzdHAtPnJxX2FyZ2hpID0gYXJnaGk7CisJcmV0dXJuICEgcGFnZXM7Cit9CisKKy8qCisgKiBSZWxlYXNlIGFuIFJQQyBzZXJ2ZXIgYnVmZmVyCisgKi8KK3N0YXRpYyB2b2lkCitzdmNfcmVsZWFzZV9idWZmZXIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKK3sKKwl3aGlsZSAocnFzdHAtPnJxX2FyZ2hpKQorCQlwdXRfcGFnZShycXN0cC0+cnFfYXJncGFnZXNbLS1ycXN0cC0+cnFfYXJnaGldKTsKKwl3aGlsZSAocnFzdHAtPnJxX3Jlc3VzZWQpIHsKKwkJaWYgKHJxc3RwLT5ycV9yZXNwYWdlc1stLXJxc3RwLT5ycV9yZXN1c2VkXSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCXB1dF9wYWdlKHJxc3RwLT5ycV9yZXNwYWdlc1tycXN0cC0+cnFfcmVzdXNlZF0pOworCX0KKwlycXN0cC0+cnFfYXJndXNlZCA9IDA7Cit9CisKKy8qCisgKiBDcmVhdGUgYSBzZXJ2ZXIgdGhyZWFkCisgKi8KK2ludAorc3ZjX2NyZWF0ZV90aHJlYWQoc3ZjX3RocmVhZF9mbiBmdW5jLCBzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYpCit7CisJc3RydWN0IHN2Y19ycXN0CSpycXN0cDsKKwlpbnQJCWVycm9yID0gLUVOT01FTTsKKworCXJxc3RwID0ga21hbGxvYyhzaXplb2YoKnJxc3RwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFycXN0cCkKKwkJZ290byBvdXQ7CisKKwltZW1zZXQocnFzdHAsIDAsIHNpemVvZigqcnFzdHApKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZycXN0cC0+cnFfd2FpdCk7CisKKwlpZiAoIShycXN0cC0+cnFfYXJncCA9ICh1MzIgKikga21hbGxvYyhzZXJ2LT5zdl94ZHJzaXplLCBHRlBfS0VSTkVMKSkKKwkgfHwgIShycXN0cC0+cnFfcmVzcCA9ICh1MzIgKikga21hbGxvYyhzZXJ2LT5zdl94ZHJzaXplLCBHRlBfS0VSTkVMKSkKKwkgfHwgIXN2Y19pbml0X2J1ZmZlcihycXN0cCwgc2Vydi0+c3ZfYnVmc3opKQorCQlnb3RvIG91dF90aHJlYWQ7CisKKwlzZXJ2LT5zdl9ucnRocmVhZHMrKzsKKwlycXN0cC0+cnFfc2VydmVyID0gc2VydjsKKwllcnJvciA9IGtlcm5lbF90aHJlYWQoKGludCAoKikodm9pZCAqKSkgZnVuYywgcnFzdHAsIDApOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0X3RocmVhZDsKKwlzdmNfc29ja191cGRhdGVfYnVmcyhzZXJ2KTsKKwllcnJvciA9IDA7CitvdXQ6CisJcmV0dXJuIGVycm9yOworCitvdXRfdGhyZWFkOgorCXN2Y19leGl0X3RocmVhZChycXN0cCk7CisJZ290byBvdXQ7Cit9CisKKy8qCisgKiBEZXN0cm95IGFuIFJQQyBzZXJ2ZXIgdGhyZWFkCisgKi8KK3ZvaWQKK3N2Y19leGl0X3RocmVhZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQoreworCXN0cnVjdCBzdmNfc2Vydgkqc2VydiA9IHJxc3RwLT5ycV9zZXJ2ZXI7CisKKwlzdmNfcmVsZWFzZV9idWZmZXIocnFzdHApOworCWlmIChycXN0cC0+cnFfcmVzcCkKKwkJa2ZyZWUocnFzdHAtPnJxX3Jlc3ApOworCWlmIChycXN0cC0+cnFfYXJncCkKKwkJa2ZyZWUocnFzdHAtPnJxX2FyZ3ApOworCWlmIChycXN0cC0+cnFfYXV0aF9kYXRhKQorCQlrZnJlZShycXN0cC0+cnFfYXV0aF9kYXRhKTsKKwlrZnJlZShycXN0cCk7CisKKwkvKiBSZWxlYXNlIHRoZSBzZXJ2ZXIgKi8KKwlpZiAoc2VydikKKwkJc3ZjX2Rlc3Ryb3koc2Vydik7Cit9CisKKy8qCisgKiBSZWdpc3RlciBhbiBSUEMgc2VydmljZSB3aXRoIHRoZSBsb2NhbCBwb3J0bWFwcGVyLgorICogVG8gdW5yZWdpc3RlciBhIHNlcnZpY2UsIGNhbGwgdGhpcyByb3V0aW5lIHdpdGggCisgKiBwcm90byBhbmQgcG9ydCA9PSAwLgorICovCitpbnQKK3N2Y19yZWdpc3RlcihzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYsIGludCBwcm90bywgdW5zaWduZWQgc2hvcnQgcG9ydCkKK3sKKwlzdHJ1Y3Qgc3ZjX3Byb2dyYW0JKnByb2dwOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCWludAkJCWksIGVycm9yID0gMCwgZHVtbXk7CisKKwlwcm9ncCA9IHNlcnYtPnN2X3Byb2dyYW07CisKKwlkcHJpbnRrKCJSUEM6IHN2Y19yZWdpc3RlciglcywgJXMsICVkKVxuIiwKKwkJcHJvZ3AtPnBnX25hbWUsIHByb3RvID09IElQUFJPVE9fVURQPyAidWRwIiA6ICJ0Y3AiLCBwb3J0KTsKKworCWlmICghcG9ydCkKKwkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1NJR1BFTkRJTkcpOworCisJZm9yIChpID0gMDsgaSA8IHByb2dwLT5wZ19udmVyczsgaSsrKSB7CisJCWlmIChwcm9ncC0+cGdfdmVyc1tpXSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWVycm9yID0gcnBjX3JlZ2lzdGVyKHByb2dwLT5wZ19wcm9nLCBpLCBwcm90bywgcG9ydCwgJmR1bW15KTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWJyZWFrOworCQlpZiAocG9ydCAmJiAhZHVtbXkpIHsKKwkJCWVycm9yID0gLUVBQ0NFUzsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFwb3J0KSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisJCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBQcm9jZXNzIHRoZSBSUEMgcmVxdWVzdC4KKyAqLworaW50CitzdmNfcHJvY2VzcyhzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYsIHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCit7CisJc3RydWN0IHN2Y19wcm9ncmFtCSpwcm9ncDsKKwlzdHJ1Y3Qgc3ZjX3ZlcnNpb24JKnZlcnNwID0gTlVMTDsJLyogY29tcGlsZXIgZm9vZCAqLworCXN0cnVjdCBzdmNfcHJvY2VkdXJlCSpwcm9jcCA9IE5VTEw7CisJc3RydWN0IGt2ZWMgKgkJYXJndiA9ICZycXN0cC0+cnFfYXJnLmhlYWRbMF07CisJc3RydWN0IGt2ZWMgKgkJcmVzdiA9ICZycXN0cC0+cnFfcmVzLmhlYWRbMF07CisJa3hkcnByb2NfdAkJeGRyOworCXUzMgkJCSpzdGF0cDsKKwl1MzIJCQlkaXIsIHByb2csIHZlcnMsIHByb2MsCisJCQkJYXV0aF9zdGF0LCBycGNfc3RhdDsKKwlpbnQJCQlhdXRoX3JlczsKKwl1MzIJCQkqYWNjZXB0X3N0YXRwOworCisJcnBjX3N0YXQgPSBycGNfc3VjY2VzczsKKworCWlmIChhcmd2LT5pb3ZfbGVuIDwgNio0KQorCQlnb3RvIGVycl9zaG9ydF9sZW47CisKKwkvKiBzZXR1cCByZXNwb25zZSB4ZHJfYnVmLgorCSAqIEluaXRpYWxseSBpdCBoYXMganVzdCBvbmUgcGFnZSAKKwkgKi8KKwlzdmNfdGFrZV9wYWdlKHJxc3RwKTsgLyogbXVzdCBzdWNjZWVkICovCisJcmVzdi0+aW92X2Jhc2UgPSBwYWdlX2FkZHJlc3MocnFzdHAtPnJxX3Jlc3BhZ2VzWzBdKTsKKwlyZXN2LT5pb3ZfbGVuID0gMDsKKwlycXN0cC0+cnFfcmVzLnBhZ2VzID0gcnFzdHAtPnJxX3Jlc3BhZ2VzKzE7CisJcnFzdHAtPnJxX3Jlcy5sZW4gPSAwOworCXJxc3RwLT5ycV9yZXMucGFnZV9iYXNlID0gMDsKKwlycXN0cC0+cnFfcmVzLnBhZ2VfbGVuID0gMDsKKwlycXN0cC0+cnFfcmVzLnRhaWxbMF0uaW92X2xlbiA9IDA7CisJLyogdGNwIG5lZWRzIGEgc3BhY2UgZm9yIHRoZSByZWNvcmQgbGVuZ3RoLi4uICovCisJaWYgKHJxc3RwLT5ycV9wcm90ID09IElQUFJPVE9fVENQKQorCQlzdmNfcHV0dTMyKHJlc3YsIDApOworCisJcnFzdHAtPnJxX3hpZCA9IHN2Y19nZXR1MzIoYXJndik7CisJc3ZjX3B1dHUzMihyZXN2LCBycXN0cC0+cnFfeGlkKTsKKworCWRpciAgPSBudG9obChzdmNfZ2V0dTMyKGFyZ3YpKTsKKwl2ZXJzID0gbnRvaGwoc3ZjX2dldHUzMihhcmd2KSk7CisKKwkvKiBGaXJzdCB3b3JkcyBvZiByZXBseTogKi8KKwlzdmNfcHV0dTMyKHJlc3YsIHhkcl9vbmUpOwkJLyogUkVQTFkgKi8KKworCWlmIChkaXIgIT0gMCkJCS8qIGRpcmVjdGlvbiAhPSBDQUxMICovCisJCWdvdG8gZXJyX2JhZF9kaXI7CisJaWYgKHZlcnMgIT0gMikJCS8qIFJQQyB2ZXJzaW9uIG51bWJlciAqLworCQlnb3RvIGVycl9iYWRfcnBjOworCisJLyogU2F2ZSBwb3NpdGlvbiBpbiBjYXNlIHdlIGxhdGVyIGRlY2lkZSB0byByZWplY3Q6ICovCisJYWNjZXB0X3N0YXRwID0gcmVzdi0+aW92X2Jhc2UgKyByZXN2LT5pb3ZfbGVuOworCisJc3ZjX3B1dHUzMihyZXN2LCB4ZHJfemVybyk7CQkvKiBBQ0NFUFQgKi8KKworCXJxc3RwLT5ycV9wcm9nID0gcHJvZyA9IG50b2hsKHN2Y19nZXR1MzIoYXJndikpOwkvKiBwcm9ncmFtIG51bWJlciAqLworCXJxc3RwLT5ycV92ZXJzID0gdmVycyA9IG50b2hsKHN2Y19nZXR1MzIoYXJndikpOwkvKiB2ZXJzaW9uIG51bWJlciAqLworCXJxc3RwLT5ycV9wcm9jID0gcHJvYyA9IG50b2hsKHN2Y19nZXR1MzIoYXJndikpOwkvKiBwcm9jZWR1cmUgbnVtYmVyICovCisKKwlwcm9ncCA9IHNlcnYtPnN2X3Byb2dyYW07CisJLyoKKwkgKiBEZWNvZGUgYXV0aCBkYXRhLCBhbmQgYWRkIHZlcmlmaWVyIHRvIHJlcGx5IGJ1ZmZlci4KKwkgKiBXZSBkbyB0aGlzIGJlZm9yZSBhbnl0aGluZyBlbHNlIGluIG9yZGVyIHRvIGdldCBhIGRlY2VudAorCSAqIGF1dGggdmVyaWZpZXIuCisJICovCisJYXV0aF9yZXMgPSBzdmNfYXV0aGVudGljYXRlKHJxc3RwLCAmYXV0aF9zdGF0KTsKKwkvKiBBbHNvIGdpdmUgdGhlIHByb2dyYW0gYSBjaGFuY2UgdG8gcmVqZWN0IHRoaXMgY2FsbDogKi8KKwlpZiAoYXV0aF9yZXMgPT0gU1ZDX09LKSB7CisJCWF1dGhfc3RhdCA9IHJwY19hdXRoZXJyX2JhZGNyZWQ7CisJCWF1dGhfcmVzID0gcHJvZ3AtPnBnX2F1dGhlbnRpY2F0ZShycXN0cCk7CisJfQorCXN3aXRjaCAoYXV0aF9yZXMpIHsKKwljYXNlIFNWQ19PSzoKKwkJYnJlYWs7CisJY2FzZSBTVkNfR0FSQkFHRToKKwkJcnBjX3N0YXQgPSBycGNfZ2FyYmFnZV9hcmdzOworCQlnb3RvIGVycl9iYWQ7CisJY2FzZSBTVkNfU1lTRVJSOgorCQlycGNfc3RhdCA9IHJwY19zeXN0ZW1fZXJyOworCQlnb3RvIGVycl9iYWQ7CisJY2FzZSBTVkNfREVOSUVEOgorCQlnb3RvIGVycl9iYWRfYXV0aDsKKwljYXNlIFNWQ19EUk9QOgorCQlnb3RvIGRyb3BpdDsKKwljYXNlIFNWQ19DT01QTEVURToKKwkJZ290byBzZW5kaXQ7CisJfQorCQkKKwlpZiAocHJvZyAhPSBwcm9ncC0+cGdfcHJvZykKKwkJZ290byBlcnJfYmFkX3Byb2c7CisKKwlpZiAodmVycyA+PSBwcm9ncC0+cGdfbnZlcnMgfHwKKwkgICEodmVyc3AgPSBwcm9ncC0+cGdfdmVyc1t2ZXJzXSkpCisJCWdvdG8gZXJyX2JhZF92ZXJzOworCisJcHJvY3AgPSB2ZXJzcC0+dnNfcHJvYyArIHByb2M7CisJaWYgKHByb2MgPj0gdmVyc3AtPnZzX25wcm9jIHx8ICFwcm9jcC0+cGNfZnVuYykKKwkJZ290byBlcnJfYmFkX3Byb2M7CisJcnFzdHAtPnJxX3NlcnZlciAgID0gc2VydjsKKwlycXN0cC0+cnFfcHJvY2luZm8gPSBwcm9jcDsKKworCS8qIFN5bnRhY3RpYyBjaGVjayBjb21wbGV0ZSAqLworCXNlcnYtPnN2X3N0YXRzLT5ycGNjbnQrKzsKKworCS8qIEJ1aWxkIHRoZSByZXBseSBoZWFkZXIuICovCisJc3RhdHAgPSByZXN2LT5pb3ZfYmFzZSArcmVzdi0+aW92X2xlbjsKKwlzdmNfcHV0dTMyKHJlc3YsIHJwY19zdWNjZXNzKTsJCS8qIFJQQ19TVUNDRVNTICovCisKKwkvKiBCdW1wIHBlci1wcm9jZWR1cmUgc3RhdHMgY291bnRlciAqLworCXByb2NwLT5wY19jb3VudCsrOworCisJLyogSW5pdGlhbGl6ZSBzdG9yYWdlIGZvciBhcmdwIGFuZCByZXNwICovCisJbWVtc2V0KHJxc3RwLT5ycV9hcmdwLCAwLCBwcm9jcC0+cGNfYXJnc2l6ZSk7CisJbWVtc2V0KHJxc3RwLT5ycV9yZXNwLCAwLCBwcm9jcC0+cGNfcmVzc2l6ZSk7CisKKwkvKiB1bi1yZXNlcnZlIHNvbWUgb2YgdGhlIG91dC1xdWV1ZSBub3cgdGhhdCB3ZSBoYXZlIGEgCisJICogYmV0dGVyIGlkZWEgb2YgcmVwbHkgc2l6ZQorCSAqLworCWlmIChwcm9jcC0+cGNfeGRycmVzc2l6ZSkKKwkJc3ZjX3Jlc2VydmUocnFzdHAsIHByb2NwLT5wY194ZHJyZXNzaXplPDwyKTsKKworCS8qIENhbGwgdGhlIGZ1bmN0aW9uIHRoYXQgcHJvY2Vzc2VzIHRoZSByZXF1ZXN0LiAqLworCWlmICghdmVyc3AtPnZzX2Rpc3BhdGNoKSB7CisJCS8qIERlY29kZSBhcmd1bWVudHMgKi8KKwkJeGRyID0gcHJvY3AtPnBjX2RlY29kZTsKKwkJaWYgKHhkciAmJiAheGRyKHJxc3RwLCBhcmd2LT5pb3ZfYmFzZSwgcnFzdHAtPnJxX2FyZ3ApKQorCQkJZ290byBlcnJfZ2FyYmFnZTsKKworCQkqc3RhdHAgPSBwcm9jcC0+cGNfZnVuYyhycXN0cCwgcnFzdHAtPnJxX2FyZ3AsIHJxc3RwLT5ycV9yZXNwKTsKKworCQkvKiBFbmNvZGUgcmVwbHkgKi8KKwkJaWYgKCpzdGF0cCA9PSBycGNfc3VjY2VzcyAmJiAoeGRyID0gcHJvY3AtPnBjX2VuY29kZSkKKwkJICYmICF4ZHIocnFzdHAsIHJlc3YtPmlvdl9iYXNlK3Jlc3YtPmlvdl9sZW4sIHJxc3RwLT5ycV9yZXNwKSkgeworCQkJZHByaW50aygic3ZjOiBmYWlsZWQgdG8gZW5jb2RlIHJlcGx5XG4iKTsKKwkJCS8qIHNlcnYtPnN2X3N0YXRzLT5ycGNzeXN0ZW1lcnIrKzsgKi8KKwkJCSpzdGF0cCA9IHJwY19zeXN0ZW1fZXJyOworCQl9CisJfSBlbHNlIHsKKwkJZHByaW50aygic3ZjOiBjYWxsaW5nIGRpc3BhdGNoZXJcbiIpOworCQlpZiAoIXZlcnNwLT52c19kaXNwYXRjaChycXN0cCwgc3RhdHApKSB7CisJCQkvKiBSZWxlYXNlIHJlcGx5IGluZm8gKi8KKwkJCWlmIChwcm9jcC0+cGNfcmVsZWFzZSkKKwkJCQlwcm9jcC0+cGNfcmVsZWFzZShycXN0cCwgTlVMTCwgcnFzdHAtPnJxX3Jlc3ApOworCQkJZ290byBkcm9waXQ7CisJCX0KKwl9CisKKwkvKiBDaGVjayBSUEMgc3RhdHVzIHJlc3VsdCAqLworCWlmICgqc3RhdHAgIT0gcnBjX3N1Y2Nlc3MpCisJCXJlc3YtPmlvdl9sZW4gPSAoKHZvaWQqKXN0YXRwKSAgLSByZXN2LT5pb3ZfYmFzZSArIDQ7CisKKwkvKiBSZWxlYXNlIHJlcGx5IGluZm8gKi8KKwlpZiAocHJvY3AtPnBjX3JlbGVhc2UpCisJCXByb2NwLT5wY19yZWxlYXNlKHJxc3RwLCBOVUxMLCBycXN0cC0+cnFfcmVzcCk7CisKKwlpZiAocHJvY3AtPnBjX2VuY29kZSA9PSBOVUxMKQorCQlnb3RvIGRyb3BpdDsKKworIHNlbmRpdDoKKwlpZiAoc3ZjX2F1dGhvcmlzZShycXN0cCkpCisJCWdvdG8gZHJvcGl0OworCXJldHVybiBzdmNfc2VuZChycXN0cCk7CisKKyBkcm9waXQ6CisJc3ZjX2F1dGhvcmlzZShycXN0cCk7CS8qIGRvZXNuJ3QgaHVydCB0byBjYWxsIHRoaXMgdHdpY2UgKi8KKwlkcHJpbnRrKCJzdmM6IHN2Y19wcm9jZXNzIGRyb3BpdFxuIik7CisJc3ZjX2Ryb3AocnFzdHApOworCXJldHVybiAwOworCitlcnJfc2hvcnRfbGVuOgorI2lmZGVmIFJQQ19QQVJBTk9JQQorCXByaW50aygic3ZjOiBzaG9ydCBsZW4gJVpkLCBkcm9wcGluZyByZXF1ZXN0XG4iLCBhcmd2LT5pb3ZfbGVuKTsKKyNlbmRpZgorCWdvdG8gZHJvcGl0OwkJCS8qIGRyb3AgcmVxdWVzdCAqLworCitlcnJfYmFkX2RpcjoKKyNpZmRlZiBSUENfUEFSQU5PSUEKKwlwcmludGsoInN2YzogYmFkIGRpcmVjdGlvbiAlZCwgZHJvcHBpbmcgcmVxdWVzdFxuIiwgZGlyKTsKKyNlbmRpZgorCXNlcnYtPnN2X3N0YXRzLT5ycGNiYWRmbXQrKzsKKwlnb3RvIGRyb3BpdDsJCQkvKiBkcm9wIHJlcXVlc3QgKi8KKworZXJyX2JhZF9ycGM6CisJc2Vydi0+c3Zfc3RhdHMtPnJwY2JhZGZtdCsrOworCXN2Y19wdXR1MzIocmVzdiwgeGRyX29uZSk7CS8qIFJFSkVDVCAqLworCXN2Y19wdXR1MzIocmVzdiwgeGRyX3plcm8pOwkvKiBSUENfTUlTTUFUQ0ggKi8KKwlzdmNfcHV0dTMyKHJlc3YsIHhkcl90d28pOwkvKiBPbmx5IFJQQ3YyIHN1cHBvcnRlZCAqLworCXN2Y19wdXR1MzIocmVzdiwgeGRyX3R3byk7CisJZ290byBzZW5kaXQ7CisKK2Vycl9iYWRfYXV0aDoKKwlkcHJpbnRrKCJzdmM6IGF1dGhlbnRpY2F0aW9uIGZhaWxlZCAoJWQpXG4iLCBudG9obChhdXRoX3N0YXQpKTsKKwlzZXJ2LT5zdl9zdGF0cy0+cnBjYmFkYXV0aCsrOworCS8qIFJlc3RvcmUgd3JpdGUgcG9pbnRlciB0byBsb2NhdGlvbiBvZiBhY2NlcHQgc3RhdHVzOiAqLworCXhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBhY2NlcHRfc3RhdHApOworCXN2Y19wdXR1MzIocmVzdiwgeGRyX29uZSk7CS8qIFJFSkVDVCAqLworCXN2Y19wdXR1MzIocmVzdiwgeGRyX29uZSk7CS8qIEFVVEhfRVJST1IgKi8KKwlzdmNfcHV0dTMyKHJlc3YsIGF1dGhfc3RhdCk7CS8qIHN0YXR1cyAqLworCWdvdG8gc2VuZGl0OworCitlcnJfYmFkX3Byb2c6CisjaWZkZWYgUlBDX1BBUkFOT0lBCisJaWYgKHByb2cgIT0gMTAwMjI3IHx8IHByb2dwLT5wZ19wcm9nICE9IDEwMDAwMykKKwkJcHJpbnRrKCJzdmM6IHVua25vd24gcHJvZ3JhbSAlZCAobWUgJWQpXG4iLCBwcm9nLCBwcm9ncC0+cGdfcHJvZyk7CisJLyogZWxzZSBpdCBpcyBqdXN0IGEgU29sYXJpcyBjbGllbnQgc2VlaW5nIGlmIEFDTHMgYXJlIHN1cHBvcnRlZCAqLworI2VuZGlmCisJc2Vydi0+c3Zfc3RhdHMtPnJwY2JhZGZtdCsrOworCXN2Y19wdXR1MzIocmVzdiwgcnBjX3Byb2dfdW5hdmFpbCk7CisJZ290byBzZW5kaXQ7CisKK2Vycl9iYWRfdmVyczoKKyNpZmRlZiBSUENfUEFSQU5PSUEKKwlwcmludGsoInN2YzogdW5rbm93biB2ZXJzaW9uICglZClcbiIsIHZlcnMpOworI2VuZGlmCisJc2Vydi0+c3Zfc3RhdHMtPnJwY2JhZGZtdCsrOworCXN2Y19wdXR1MzIocmVzdiwgcnBjX3Byb2dfbWlzbWF0Y2gpOworCXN2Y19wdXR1MzIocmVzdiwgaHRvbmwocHJvZ3AtPnBnX2xvdmVycykpOworCXN2Y19wdXR1MzIocmVzdiwgaHRvbmwocHJvZ3AtPnBnX2hpdmVycykpOworCWdvdG8gc2VuZGl0OworCitlcnJfYmFkX3Byb2M6CisjaWZkZWYgUlBDX1BBUkFOT0lBCisJcHJpbnRrKCJzdmM6IHVua25vd24gcHJvY2VkdXJlICglZClcbiIsIHByb2MpOworI2VuZGlmCisJc2Vydi0+c3Zfc3RhdHMtPnJwY2JhZGZtdCsrOworCXN2Y19wdXR1MzIocmVzdiwgcnBjX3Byb2NfdW5hdmFpbCk7CisJZ290byBzZW5kaXQ7CisKK2Vycl9nYXJiYWdlOgorI2lmZGVmIFJQQ19QQVJBTk9JQQorCXByaW50aygic3ZjOiBmYWlsZWQgdG8gZGVjb2RlIGFyZ3NcbiIpOworI2VuZGlmCisJcnBjX3N0YXQgPSBycGNfZ2FyYmFnZV9hcmdzOworZXJyX2JhZDoKKwlzZXJ2LT5zdl9zdGF0cy0+cnBjYmFkZm10Kys7CisJc3ZjX3B1dHUzMihyZXN2LCBycGNfc3RhdCk7CisJZ290byBzZW5kaXQ7Cit9CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Y2F1dGguYyBiL25ldC9zdW5ycGMvc3ZjYXV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZTgxNDcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc3VucnBjL3N2Y2F1dGguYwpAQCAtMCwwICsxLDIxNiBAQAorLyoKKyAqIGxpbnV4L25ldC9zdW5ycGMvc3ZjYXV0aC5jCisgKgorICogVGhlIGdlbmVyaWMgaW50ZXJmYWNlIGZvciBSUEMgYXV0aGVudGljYXRpb24gb24gdGhlIHNlcnZlciBzaWRlLgorICogCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKgorICogQ0hBTkdFUworICogMTktQXByLTIwMDAgQ2hyaXMgRXZhbnMgICAgICAtIFNlY3VyaXR5IGZpeAorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3hkci5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNzb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Y2F1dGguaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CisKKyNkZWZpbmUgUlBDREJHX0ZBQ0lMSVRZCVJQQ0RCR19BVVRICisKKworLyoKKyAqIFRhYmxlIG9mIGF1dGhlbnRpY2F0b3JzCisgKi8KK2V4dGVybiBzdHJ1Y3QgYXV0aF9vcHMgc3ZjYXV0aF9udWxsOworZXh0ZXJuIHN0cnVjdCBhdXRoX29wcyBzdmNhdXRoX3VuaXg7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYXV0aHRhYl9sb2NrKTsKK3N0YXRpYyBzdHJ1Y3QgYXV0aF9vcHMJKmF1dGh0YWJbUlBDX0FVVEhfTUFYRkxBVk9SXSA9IHsKKwlbMF0gPSAmc3ZjYXV0aF9udWxsLAorCVsxXSA9ICZzdmNhdXRoX3VuaXgsCit9OworCitpbnQKK3N2Y19hdXRoZW50aWNhdGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICphdXRocCkKK3sKKwlycGNfYXV0aGZsYXZvcl90CWZsYXZvcjsKKwlzdHJ1Y3QgYXV0aF9vcHMJCSphb3BzOworCisJKmF1dGhwID0gcnBjX2F1dGhfb2s7CisKKwlmbGF2b3IgPSBudG9obChzdmNfZ2V0dTMyKCZycXN0cC0+cnFfYXJnLmhlYWRbMF0pKTsKKworCWRwcmludGsoInN2Yzogc3ZjX2F1dGhlbnRpY2F0ZSAoJWQpXG4iLCBmbGF2b3IpOworCisJc3Bpbl9sb2NrKCZhdXRodGFiX2xvY2spOworCWlmIChmbGF2b3IgPj0gUlBDX0FVVEhfTUFYRkxBVk9SIHx8ICEoYW9wcyA9IGF1dGh0YWJbZmxhdm9yXSkKKwkJCXx8ICF0cnlfbW9kdWxlX2dldChhb3BzLT5vd25lcikpIHsKKwkJc3Bpbl91bmxvY2soJmF1dGh0YWJfbG9jayk7CisJCSphdXRocCA9IHJwY19hdXRoZXJyX2JhZGNyZWQ7CisJCXJldHVybiBTVkNfREVOSUVEOworCX0KKwlzcGluX3VubG9jaygmYXV0aHRhYl9sb2NrKTsKKworCXJxc3RwLT5ycV9hdXRob3AgPSBhb3BzOworCXJldHVybiBhb3BzLT5hY2NlcHQocnFzdHAsIGF1dGhwKTsKK30KKworaW50IHN2Y19zZXRfY2xpZW50KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCit7CisJcmV0dXJuIHJxc3RwLT5ycV9hdXRob3AtPnNldF9jbGllbnQocnFzdHApOworfQorCisvKiBBIHJlcXVlc3QsIHdoaWNoIHdhcyBhdXRoZW50aWNhdGVkLCBoYXMgbm93IGV4ZWN1dGVkLgorICogVGltZSB0byBmaW5hbGlzZSB0aGUgdGhlIGNyZWRlbnRpYWxzIGFuZCB2ZXJpZmllcgorICogYW5kIHJlbGVhc2UgYW5kIHJlc291cmNlcworICovCitpbnQgc3ZjX2F1dGhvcmlzZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQoreworCXN0cnVjdCBhdXRoX29wcyAqYW9wcyA9IHJxc3RwLT5ycV9hdXRob3A7CisJaW50IHJ2ID0gMDsKKworCXJxc3RwLT5ycV9hdXRob3AgPSBOVUxMOworCQorCWlmIChhb3BzKSB7CisJCXJ2ID0gYW9wcy0+cmVsZWFzZShycXN0cCk7CisJCW1vZHVsZV9wdXQoYW9wcy0+b3duZXIpOworCX0KKwlyZXR1cm4gcnY7Cit9CisKK2ludAorc3ZjX2F1dGhfcmVnaXN0ZXIocnBjX2F1dGhmbGF2b3JfdCBmbGF2b3IsIHN0cnVjdCBhdXRoX29wcyAqYW9wcykKK3sKKwlpbnQgcnYgPSAtRUlOVkFMOworCXNwaW5fbG9jaygmYXV0aHRhYl9sb2NrKTsKKwlpZiAoZmxhdm9yIDwgUlBDX0FVVEhfTUFYRkxBVk9SICYmIGF1dGh0YWJbZmxhdm9yXSA9PSBOVUxMKSB7CisJCWF1dGh0YWJbZmxhdm9yXSA9IGFvcHM7CisJCXJ2ID0gMDsKKwl9CisJc3Bpbl91bmxvY2soJmF1dGh0YWJfbG9jayk7CisJcmV0dXJuIHJ2OworfQorCit2b2lkCitzdmNfYXV0aF91bnJlZ2lzdGVyKHJwY19hdXRoZmxhdm9yX3QgZmxhdm9yKQoreworCXNwaW5fbG9jaygmYXV0aHRhYl9sb2NrKTsKKwlpZiAoZmxhdm9yIDwgUlBDX0FVVEhfTUFYRkxBVk9SKQorCQlhdXRodGFiW2ZsYXZvcl0gPSBOVUxMOworCXNwaW5fdW5sb2NrKCZhdXRodGFiX2xvY2spOworfQorRVhQT1JUX1NZTUJPTChzdmNfYXV0aF91bnJlZ2lzdGVyKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjYWNoZSBmb3IgZG9tYWluIG5hbWUgdG8gYXV0aF9kb21haW4KKyAqIEVudHJpZXMgYXJlIG9ubHkgYWRkZWQgYnkgZmxhdm91cnMgd2hpY2ggd2lsbCBub3JtYWxseQorICogaGF2ZSBhIHN0cnVjdHVyZSB0aGF0ICdpbmhlcml0cycgZnJvbSBhdXRoX2RvbWFpbi4KKyAqIGUuZy4gd2hlbiBhbiBJUCAtPiBkb21haW5uYW1lIGlzIGdpdmVuIHRvICBhdXRoX3VuaXgsCisgKiBhbmQgdGhlIGRvbWFpbiBuYW1lIGRvZXNuJ3QgZXhpc3QsIGl0IHdpbGwgY3JlYXRlIGEKKyAqIGF1dGhfdW5peF9kb21haW4gYW5kIGFkZCBpdCB0byB0aGlzIGhhc2ggdGFibGUuCisgKiBJZiBpdCBmaW5kcyB0aGUgbmFtZSBkb2VzIGV4aXN0LCBidXQgaXNuJ3QgQVVUSF9VTklYLAorICogaXQgd2lsbCBjb21wbGFpbi4KKyAqLworCisvKgorICogQXV0aCBhdXRoX2RvbWFpbiBjYWNoZSBpcyBzb21ld2hhdCBkaWZmZXJlbnQgdG8gb3RoZXIgY2FjaGVzLAorICogbGFyZ2VseSBiZWNhdXNlIHRoZSBlbnRyaWVzIGFyZSBwb3NzaWJseSBvZiBkaWZmZXJlbnQgdHlwZXM6CisgKiBlYWNoIGF1dGggZmxhdm91ciBoYXMgaXQncyBvd24gdHlwZS4KKyAqIE9uZSBjb25zZXF1ZW5jZSBvZiB0aGlzIHRoYXQgRGVmaW5lQ2FjaGVMb29rdXAgY2Fubm90CisgKiBhbGxvY2F0ZSBhIG5ldyBzdHJ1Y3R1cmUgYXMgaXQgY2Fubm90IGtub3cgdGhlIHNpemUuCisgKiBOb3RpY2UgdGhhdCB0aGUgIklOSVQiIGNvZGUgZnJhZ21lbnQgaXMgcXVpdGUgZGlmZmVyZW50CisgKiBmcm9tIG90aGVyIGNhY2hlcy4gIFdoZW4gYXV0aF9kb21haW5fbG9va3VwIG1pZ2h0IGJlCisgKiBjcmVhdGluZyBhIG5ldyBkb21haW4sIHRoZSBuZXcgZG9tYWluIGlzIHBhc3NlZCBpbgorICogY29tcGxldGUgYW5kIGl0IGlzIHVzZWQgYXMtaXMgcmF0aGVyIHRoYW4gYmVpbmcgY29waWVkIGludG8KKyAqIGFub3RoZXIgc3RydWN0dXJlLgorICovCisjZGVmaW5lCUROX0hBU0hCSVRTCTYKKyNkZWZpbmUJRE5fSEFTSE1BWAkoMTw8RE5fSEFTSEJJVFMpCisjZGVmaW5lCUROX0hBU0hNQVNLCShETl9IQVNITUFYLTEpCisKK3N0YXRpYyBzdHJ1Y3QgY2FjaGVfaGVhZAkqYXV0aF9kb21haW5fdGFibGVbRE5fSEFTSE1BWF07CisKK3N0YXRpYyB2b2lkIGF1dGhfZG9tYWluX2Ryb3Aoc3RydWN0IGNhY2hlX2hlYWQgKml0ZW0sIHN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkKQoreworCXN0cnVjdCBhdXRoX2RvbWFpbiAqZG9tID0gY29udGFpbmVyX29mKGl0ZW0sIHN0cnVjdCBhdXRoX2RvbWFpbiwgaCk7CisJaWYgKGNhY2hlX3B1dChpdGVtLGNkKSkKKwkJYXV0aHRhYltkb20tPmZsYXZvdXJdLT5kb21haW5fcmVsZWFzZShkb20pOworfQorCisKK3N0cnVjdCBjYWNoZV9kZXRhaWwgYXV0aF9kb21haW5fY2FjaGUgPSB7CisJLmhhc2hfc2l6ZQk9IEROX0hBU0hNQVgsCisJLmhhc2hfdGFibGUJPSBhdXRoX2RvbWFpbl90YWJsZSwKKwkubmFtZQkJPSAiYXV0aC5kb21haW4iLAorCS5jYWNoZV9wdXQJPSBhdXRoX2RvbWFpbl9kcm9wLAorfTsKKwordm9pZCBhdXRoX2RvbWFpbl9wdXQoc3RydWN0IGF1dGhfZG9tYWluICpkb20pCit7CisJYXV0aF9kb21haW5fZHJvcCgmZG9tLT5oLCAmYXV0aF9kb21haW5fY2FjaGUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBhdXRoX2RvbWFpbl9oYXNoKHN0cnVjdCBhdXRoX2RvbWFpbiAqaXRlbSkKK3sKKwlyZXR1cm4gaGFzaF9zdHIoaXRlbS0+bmFtZSwgRE5fSEFTSEJJVFMpOworfQorc3RhdGljIGlubGluZSBpbnQgYXV0aF9kb21haW5fbWF0Y2goc3RydWN0IGF1dGhfZG9tYWluICp0bXAsIHN0cnVjdCBhdXRoX2RvbWFpbiAqaXRlbSkKK3sKKwlyZXR1cm4gc3RyY21wKHRtcC0+bmFtZSwgaXRlbS0+bmFtZSkgPT0gMDsKK30KKworc3RydWN0IGF1dGhfZG9tYWluICoKK2F1dGhfZG9tYWluX2xvb2t1cChzdHJ1Y3QgYXV0aF9kb21haW4gKml0ZW0sIGludCBzZXQpCit7CisJc3RydWN0IGF1dGhfZG9tYWluICp0bXAgPSBOVUxMOworCXN0cnVjdCBjYWNoZV9oZWFkICoqaHAsICoqaGVhZDsKKwloZWFkID0gJmF1dGhfZG9tYWluX2NhY2hlLmhhc2hfdGFibGVbYXV0aF9kb21haW5faGFzaChpdGVtKV07CisKKwlpZiAoc2V0KQorCQl3cml0ZV9sb2NrKCZhdXRoX2RvbWFpbl9jYWNoZS5oYXNoX2xvY2spOworCWVsc2UKKwkJcmVhZF9sb2NrKCZhdXRoX2RvbWFpbl9jYWNoZS5oYXNoX2xvY2spOworCWZvciAoaHA9aGVhZDsgKmhwICE9IE5VTEw7IGhwID0gJnRtcC0+aC5uZXh0KSB7CisJCXRtcCA9IGNvbnRhaW5lcl9vZigqaHAsIHN0cnVjdCBhdXRoX2RvbWFpbiwgaCk7CisJCWlmICghYXV0aF9kb21haW5fbWF0Y2godG1wLCBpdGVtKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXNldCkgeworCQkJY2FjaGVfZ2V0KCZ0bXAtPmgpOworCQkJZ290byBvdXRfbm9zZXQ7CisJCX0KKwkJKmhwID0gdG1wLT5oLm5leHQ7CisJCXRtcC0+aC5uZXh0ID0gTlVMTDsKKwkJYXV0aF9kb21haW5fZHJvcCgmdG1wLT5oLCAmYXV0aF9kb21haW5fY2FjaGUpOworCQlnb3RvIG91dF9zZXQ7CisJfQorCS8qIERpZG4ndCBmaW5kIGFueXRoaW5nICovCisJaWYgKCFzZXQpCisJCWdvdG8gb3V0X25hZGE7CisJYXV0aF9kb21haW5fY2FjaGUuZW50cmllcysrOworb3V0X3NldDoKKwlpdGVtLT5oLm5leHQgPSAqaGVhZDsKKwkqaGVhZCA9ICZpdGVtLT5oOworCWNhY2hlX2dldCgmaXRlbS0+aCk7CisJd3JpdGVfdW5sb2NrKCZhdXRoX2RvbWFpbl9jYWNoZS5oYXNoX2xvY2spOworCWNhY2hlX2ZyZXNoKCZhdXRoX2RvbWFpbl9jYWNoZSwgJml0ZW0tPmgsIGl0ZW0tPmguZXhwaXJ5X3RpbWUpOworCWNhY2hlX2dldCgmaXRlbS0+aCk7CisJcmV0dXJuIGl0ZW07CitvdXRfbmFkYToKKwl0bXAgPSBOVUxMOworb3V0X25vc2V0OgorCXJlYWRfdW5sb2NrKCZhdXRoX2RvbWFpbl9jYWNoZS5oYXNoX2xvY2spOworCXJldHVybiB0bXA7Cit9CisKK3N0cnVjdCBhdXRoX2RvbWFpbiAqYXV0aF9kb21haW5fZmluZChjaGFyICpuYW1lKQoreworCXN0cnVjdCBhdXRoX2RvbWFpbiAqcnYsIGFkOworCisJYWQubmFtZSA9IG5hbWU7CisJcnYgPSBhdXRoX2RvbWFpbl9sb29rdXAoJmFkLCAwKTsKKwlyZXR1cm4gcnY7Cit9CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Y2F1dGhfdW5peC5jIGIvbmV0L3N1bnJwYy9zdmNhdXRoX3VuaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjk5YjQwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3N1bnJwYy9zdmNhdXRoX3VuaXguYwpAQCAtMCwwICsxLDUwMiBAQAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMveGRyLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Y3NvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjYXV0aC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaGFzaC5oPgorCisjZGVmaW5lIFJQQ0RCR19GQUNJTElUWQlSUENEQkdfQVVUSAorCisKKy8qCisgKiBBVVRIVU5JWCBhbmQgQVVUSE5VTEwgY3JlZGVudGlhbHMgYXJlIGJvdGggaGFuZGxlZCBoZXJlLgorICogQVVUSE5VTEwgaXMgdHJlYXRlZCBqdXN0IGxpa2UgQVVUSFVOSVggZXhjZXB0IHRoYXQgdGhlIHVpZC9naWQKKyAqIGFyZSBhbHdheXMgbm9ib2R5ICgtMikuICBpLmUuIHdlIGRvIHRoZSBzYW1lIElQIGFkZHJlc3MgY2hlY2tzIGZvcgorICogQVVUSE5VTEwgYXMgZm9yIEFVVEhVTklYLCBhbmQgdGhhdCBpcyBkb25lIGhlcmUuCisgKi8KKworCitzdGF0aWMgY2hhciAqc3RyZHVwKGNoYXIgKnMpCit7CisJY2hhciAqcnYgPSBrbWFsbG9jKHN0cmxlbihzKSsxLCBHRlBfS0VSTkVMKTsKKwlpZiAocnYpCisJCXN0cmNweShydiwgcyk7CisJcmV0dXJuIHJ2OworfQorCitzdHJ1Y3QgdW5peF9kb21haW4geworCXN0cnVjdCBhdXRoX2RvbWFpbgloOworCWludAlhZGRyX2NoYW5nZXM7CisJLyogb3RoZXIgc3R1ZmYgbGF0ZXIgKi8KK307CisKK3N0cnVjdCBhdXRoX2RvbWFpbiAqdW5peF9kb21haW5fZmluZChjaGFyICpuYW1lKQoreworCXN0cnVjdCBhdXRoX2RvbWFpbiAqcnYsIHVkOworCXN0cnVjdCB1bml4X2RvbWFpbiAqbmV3OworCisJdWQubmFtZSA9IG5hbWU7CisJCisJcnYgPSBhdXRoX2RvbWFpbl9sb29rdXAoJnVkLCAwKTsKKworIGZvdW5kaXQ6CisJaWYgKHJ2ICYmIHJ2LT5mbGF2b3VyICE9IFJQQ19BVVRIX1VOSVgpIHsKKwkJYXV0aF9kb21haW5fcHV0KHJ2KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChydikKKwkJcmV0dXJuIHJ2OworCisJbmV3ID0ga21hbGxvYyhzaXplb2YoKm5ldyksIEdGUF9LRVJORUwpOworCWlmIChuZXcgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJY2FjaGVfaW5pdCgmbmV3LT5oLmgpOworCW5ldy0+aC5uYW1lID0gc3RyZHVwKG5hbWUpOworCW5ldy0+aC5mbGF2b3VyID0gUlBDX0FVVEhfVU5JWDsKKwluZXctPmFkZHJfY2hhbmdlcyA9IDA7CisJbmV3LT5oLmguZXhwaXJ5X3RpbWUgPSBORVZFUjsKKworCXJ2ID0gYXV0aF9kb21haW5fbG9va3VwKCZuZXctPmgsIDIpOworCWlmIChydiA9PSAmbmV3LT5oKSB7CisJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZuZXctPmguaC5yZWZjbnQpKSBCVUcoKTsKKwl9IGVsc2UgeworCQlhdXRoX2RvbWFpbl9wdXQoJm5ldy0+aCk7CisJCWdvdG8gZm91bmRpdDsKKwl9CisKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyB2b2lkIHN2Y2F1dGhfdW5peF9kb21haW5fcmVsZWFzZShzdHJ1Y3QgYXV0aF9kb21haW4gKmRvbSkKK3sKKwlzdHJ1Y3QgdW5peF9kb21haW4gKnVkID0gY29udGFpbmVyX29mKGRvbSwgc3RydWN0IHVuaXhfZG9tYWluLCBoKTsKKworCWtmcmVlKGRvbS0+bmFtZSk7CisJa2ZyZWUodWQpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2FjaGUgZm9yIElQIGFkZHJlc3MgdG8gdW5peF9kb21haW4KKyAqIGFzIG5lZWRlZCBieSBBVVRIX1VOSVgKKyAqLworI2RlZmluZQlJUF9IQVNIQklUUwk4CisjZGVmaW5lCUlQX0hBU0hNQVgJKDE8PElQX0hBU0hCSVRTKQorI2RlZmluZQlJUF9IQVNITUFTSwkoSVBfSEFTSE1BWC0xKQorCitzdHJ1Y3QgaXBfbWFwIHsKKwlzdHJ1Y3QgY2FjaGVfaGVhZAloOworCWNoYXIJCQltX2NsYXNzWzhdOyAvKiBlLmcuICJuZnNkIiAqLworCXN0cnVjdCBpbl9hZGRyCQltX2FkZHI7CisJc3RydWN0IHVuaXhfZG9tYWluCSptX2NsaWVudDsKKwlpbnQJCQltX2FkZF9jaGFuZ2U7Cit9Oworc3RhdGljIHN0cnVjdCBjYWNoZV9oZWFkCSppcF90YWJsZVtJUF9IQVNITUFYXTsKKworc3RhdGljIHZvaWQgaXBfbWFwX3B1dChzdHJ1Y3QgY2FjaGVfaGVhZCAqaXRlbSwgc3RydWN0IGNhY2hlX2RldGFpbCAqY2QpCit7CisJc3RydWN0IGlwX21hcCAqaW0gPSBjb250YWluZXJfb2YoaXRlbSwgc3RydWN0IGlwX21hcCxoKTsKKwlpZiAoY2FjaGVfcHV0KGl0ZW0sIGNkKSkgeworCQlpZiAodGVzdF9iaXQoQ0FDSEVfVkFMSUQsICZpdGVtLT5mbGFncykgJiYKKwkJICAgICF0ZXN0X2JpdChDQUNIRV9ORUdBVElWRSwgJml0ZW0tPmZsYWdzKSkKKwkJCWF1dGhfZG9tYWluX3B1dCgmaW0tPm1fY2xpZW50LT5oKTsKKwkJa2ZyZWUoaW0pOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgaXBfbWFwX2hhc2goc3RydWN0IGlwX21hcCAqaXRlbSkKK3sKKwlyZXR1cm4gaGFzaF9zdHIoaXRlbS0+bV9jbGFzcywgSVBfSEFTSEJJVFMpIF4gCisJCWhhc2hfbG9uZygodW5zaWduZWQgbG9uZylpdGVtLT5tX2FkZHIuc19hZGRyLCBJUF9IQVNIQklUUyk7Cit9CitzdGF0aWMgaW5saW5lIGludCBpcF9tYXBfbWF0Y2goc3RydWN0IGlwX21hcCAqaXRlbSwgc3RydWN0IGlwX21hcCAqdG1wKQoreworCXJldHVybiBzdHJjbXAodG1wLT5tX2NsYXNzLCBpdGVtLT5tX2NsYXNzKSA9PSAwCisJCSYmIHRtcC0+bV9hZGRyLnNfYWRkciA9PSBpdGVtLT5tX2FkZHIuc19hZGRyOworfQorc3RhdGljIGlubGluZSB2b2lkIGlwX21hcF9pbml0KHN0cnVjdCBpcF9tYXAgKm5ldywgc3RydWN0IGlwX21hcCAqaXRlbSkKK3sKKwlzdHJjcHkobmV3LT5tX2NsYXNzLCBpdGVtLT5tX2NsYXNzKTsKKwluZXctPm1fYWRkci5zX2FkZHIgPSBpdGVtLT5tX2FkZHIuc19hZGRyOworfQorc3RhdGljIGlubGluZSB2b2lkIGlwX21hcF91cGRhdGUoc3RydWN0IGlwX21hcCAqbmV3LCBzdHJ1Y3QgaXBfbWFwICppdGVtKQoreworCWNhY2hlX2dldCgmaXRlbS0+bV9jbGllbnQtPmguaCk7CisJbmV3LT5tX2NsaWVudCA9IGl0ZW0tPm1fY2xpZW50OworCW5ldy0+bV9hZGRfY2hhbmdlID0gaXRlbS0+bV9hZGRfY2hhbmdlOworfQorCitzdGF0aWMgdm9pZCBpcF9tYXBfcmVxdWVzdChzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCwKKwkJCQkgIHN0cnVjdCBjYWNoZV9oZWFkICpoLAorCQkJCSAgY2hhciAqKmJwcCwgaW50ICpibGVuKQoreworCWNoYXIgdGV4dF9hZGRyWzIwXTsKKwlzdHJ1Y3QgaXBfbWFwICppbSA9IGNvbnRhaW5lcl9vZihoLCBzdHJ1Y3QgaXBfbWFwLCBoKTsKKwlfX3UzMiBhZGRyID0gaW0tPm1fYWRkci5zX2FkZHI7CisJCisJc25wcmludGYodGV4dF9hZGRyLCAyMCwgIiV1LiV1LiV1LiV1IiwKKwkJIG50b2hsKGFkZHIpID4+IDI0ICYgMHhmZiwKKwkJIG50b2hsKGFkZHIpID4+IDE2ICYgMHhmZiwKKwkJIG50b2hsKGFkZHIpID4+ICA4ICYgMHhmZiwKKwkJIG50b2hsKGFkZHIpID4+ICAwICYgMHhmZik7CisKKwlxd29yZF9hZGQoYnBwLCBibGVuLCBpbS0+bV9jbGFzcyk7CisJcXdvcmRfYWRkKGJwcCwgYmxlbiwgdGV4dF9hZGRyKTsKKwkoKmJwcClbLTFdID0gJ1xuJzsKK30KKworc3RhdGljIHN0cnVjdCBpcF9tYXAgKmlwX21hcF9sb29rdXAoc3RydWN0IGlwX21hcCAqLCBpbnQpOworCitzdGF0aWMgaW50IGlwX21hcF9wYXJzZShzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCwKKwkJCSAgY2hhciAqbWVzZywgaW50IG1sZW4pCit7CisJLyogY2xhc3MgaXBhZGRyZXNzIFtkb21haW5uYW1lXSAqLworCS8qIHNob3VsZCBiZSBzYWZlIGp1c3QgdG8gdXNlIHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgYnVmZmVyCisJICogZm9yIHNjcmF0Y2g6ICovCisJY2hhciAqYnVmID0gbWVzZzsKKwlpbnQgbGVuOworCWludCBiMSxiMixiMyxiNDsKKwljaGFyIGM7CisJc3RydWN0IGlwX21hcCBpcG0sICppcG1wOworCXN0cnVjdCBhdXRoX2RvbWFpbiAqZG9tOworCXRpbWVfdCBleHBpcnk7CisKKwlpZiAobWVzZ1ttbGVuLTFdICE9ICdcbicpCisJCXJldHVybiAtRUlOVkFMOworCW1lc2dbbWxlbi0xXSA9IDA7CisKKwkvKiBjbGFzcyAqLworCWxlbiA9IHF3b3JkX2dldCgmbWVzZywgaXBtLm1fY2xhc3MsIHNpemVvZihpcG0ubV9jbGFzcykpOworCWlmIChsZW4gPD0gMCkgcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBpcCBhZGRyZXNzICovCisJbGVuID0gcXdvcmRfZ2V0KCZtZXNnLCBidWYsIG1sZW4pOworCWlmIChsZW4gPD0gMCkgcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiV1LiV1LiV1LiV1JWMiLCAmYjEsICZiMiwgJmIzLCAmYjQsICZjKSAhPSA0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwkKKwlleHBpcnkgPSBnZXRfZXhwaXJ5KCZtZXNnKTsKKwlpZiAoZXhwaXJ5ID09MCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBkb21haW5uYW1lLCBvciBlbXB0eSBmb3IgTkVHQVRJVkUgKi8KKwlsZW4gPSBxd29yZF9nZXQoJm1lc2csIGJ1ZiwgbWxlbik7CisJaWYgKGxlbiA8IDApIHJldHVybiAtRUlOVkFMOworCisJaWYgKGxlbikgeworCQlkb20gPSB1bml4X2RvbWFpbl9maW5kKGJ1Zik7CisJCWlmIChkb20gPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PRU5UOworCX0gZWxzZQorCQlkb20gPSBOVUxMOworCisJaXBtLm1fYWRkci5zX2FkZHIgPQorCQlodG9ubCgoKCgoKGIxPDw4KXxiMik8PDgpfGIzKTw8OCl8YjQpOworCWlwbS5oLmZsYWdzID0gMDsKKwlpZiAoZG9tKSB7CisJCWlwbS5tX2NsaWVudCA9IGNvbnRhaW5lcl9vZihkb20sIHN0cnVjdCB1bml4X2RvbWFpbiwgaCk7CisJCWlwbS5tX2FkZF9jaGFuZ2UgPSBpcG0ubV9jbGllbnQtPmFkZHJfY2hhbmdlczsKKwl9IGVsc2UKKwkJc2V0X2JpdChDQUNIRV9ORUdBVElWRSwgJmlwbS5oLmZsYWdzKTsKKwlpcG0uaC5leHBpcnlfdGltZSA9IGV4cGlyeTsKKworCWlwbXAgPSBpcF9tYXBfbG9va3VwKCZpcG0sIDEpOworCWlmIChpcG1wKQorCQlpcF9tYXBfcHV0KCZpcG1wLT5oLCAmaXBfbWFwX2NhY2hlKTsKKwlpZiAoZG9tKQorCQlhdXRoX2RvbWFpbl9wdXQoZG9tKTsKKwlpZiAoIWlwbXApCisJCXJldHVybiAtRU5PTUVNOworCWNhY2hlX2ZsdXNoKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXBfbWFwX3Nob3coc3RydWN0IHNlcV9maWxlICptLAorCQkgICAgICAgc3RydWN0IGNhY2hlX2RldGFpbCAqY2QsCisJCSAgICAgICBzdHJ1Y3QgY2FjaGVfaGVhZCAqaCkKK3sKKwlzdHJ1Y3QgaXBfbWFwICppbTsKKwlzdHJ1Y3QgaW5fYWRkciBhZGRyOworCWNoYXIgKmRvbSA9ICItbm8tZG9tYWluLSI7CisKKwlpZiAoaCA9PSBOVUxMKSB7CisJCXNlcV9wdXRzKG0sICIjY2xhc3MgSVAgZG9tYWluXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWltID0gY29udGFpbmVyX29mKGgsIHN0cnVjdCBpcF9tYXAsIGgpOworCS8qIGNsYXNzIGFkZHIgZG9tYWluICovCisJYWRkciA9IGltLT5tX2FkZHI7CisKKwlpZiAodGVzdF9iaXQoQ0FDSEVfVkFMSUQsICZoLT5mbGFncykgJiYgCisJICAgICF0ZXN0X2JpdChDQUNIRV9ORUdBVElWRSwgJmgtPmZsYWdzKSkKKwkJZG9tID0gaW0tPm1fY2xpZW50LT5oLm5hbWU7CisKKwlzZXFfcHJpbnRmKG0sICIlcyAlZC4lZC4lZC4lZCAlc1xuIiwKKwkJICAgaW0tPm1fY2xhc3MsCisJCSAgIGh0b25sKGFkZHIuc19hZGRyKSA+PiAyNCAmIDB4ZmYsCisJCSAgIGh0b25sKGFkZHIuc19hZGRyKSA+PiAxNiAmIDB4ZmYsCisJCSAgIGh0b25sKGFkZHIuc19hZGRyKSA+PiAgOCAmIDB4ZmYsCisJCSAgIGh0b25sKGFkZHIuc19hZGRyKSA+PiAgMCAmIDB4ZmYsCisJCSAgIGRvbQorCQkgICApOworCXJldHVybiAwOworfQorCQorCitzdHJ1Y3QgY2FjaGVfZGV0YWlsIGlwX21hcF9jYWNoZSA9IHsKKwkuaGFzaF9zaXplCT0gSVBfSEFTSE1BWCwKKwkuaGFzaF90YWJsZQk9IGlwX3RhYmxlLAorCS5uYW1lCQk9ICJhdXRoLnVuaXguaXAiLAorCS5jYWNoZV9wdXQJPSBpcF9tYXBfcHV0LAorCS5jYWNoZV9yZXF1ZXN0CT0gaXBfbWFwX3JlcXVlc3QsCisJLmNhY2hlX3BhcnNlCT0gaXBfbWFwX3BhcnNlLAorCS5jYWNoZV9zaG93CT0gaXBfbWFwX3Nob3csCit9OworCitzdGF0aWMgRGVmaW5lU2ltcGxlQ2FjaGVMb29rdXAoaXBfbWFwLCAwKQorCisKK2ludCBhdXRoX3VuaXhfYWRkX2FkZHIoc3RydWN0IGluX2FkZHIgYWRkciwgc3RydWN0IGF1dGhfZG9tYWluICpkb20pCit7CisJc3RydWN0IHVuaXhfZG9tYWluICp1ZG9tOworCXN0cnVjdCBpcF9tYXAgaXAsICppcG1wOworCisJaWYgKGRvbS0+Zmxhdm91ciAhPSBSUENfQVVUSF9VTklYKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl1ZG9tID0gY29udGFpbmVyX29mKGRvbSwgc3RydWN0IHVuaXhfZG9tYWluLCBoKTsKKwlzdHJjcHkoaXAubV9jbGFzcywgIm5mc2QiKTsKKwlpcC5tX2FkZHIgPSBhZGRyOworCWlwLm1fY2xpZW50ID0gdWRvbTsKKwlpcC5tX2FkZF9jaGFuZ2UgPSB1ZG9tLT5hZGRyX2NoYW5nZXMrMTsKKwlpcC5oLmZsYWdzID0gMDsKKwlpcC5oLmV4cGlyeV90aW1lID0gTkVWRVI7CisJCisJaXBtcCA9IGlwX21hcF9sb29rdXAoJmlwLCAxKTsKKworCWlmIChpcG1wKSB7CisJCWlwX21hcF9wdXQoJmlwbXAtPmgsICZpcF9tYXBfY2FjaGUpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwkJcmV0dXJuIC1FTk9NRU07Cit9CisKK2ludCBhdXRoX3VuaXhfZm9yZ2V0X29sZChzdHJ1Y3QgYXV0aF9kb21haW4gKmRvbSkKK3sKKwlzdHJ1Y3QgdW5peF9kb21haW4gKnVkb207CisJCisJaWYgKGRvbS0+Zmxhdm91ciAhPSBSUENfQVVUSF9VTklYKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl1ZG9tID0gY29udGFpbmVyX29mKGRvbSwgc3RydWN0IHVuaXhfZG9tYWluLCBoKTsKKwl1ZG9tLT5hZGRyX2NoYW5nZXMrKzsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGF1dGhfZG9tYWluICphdXRoX3VuaXhfbG9va3VwKHN0cnVjdCBpbl9hZGRyIGFkZHIpCit7CisJc3RydWN0IGlwX21hcCBrZXksICppcG07CisJc3RydWN0IGF1dGhfZG9tYWluICpydjsKKworCXN0cmNweShrZXkubV9jbGFzcywgIm5mc2QiKTsKKwlrZXkubV9hZGRyID0gYWRkcjsKKworCWlwbSA9IGlwX21hcF9sb29rdXAoJmtleSwgMCk7CisKKwlpZiAoIWlwbSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGNhY2hlX2NoZWNrKCZpcF9tYXBfY2FjaGUsICZpcG0tPmgsIE5VTEwpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICgoaXBtLT5tX2NsaWVudC0+YWRkcl9jaGFuZ2VzIC0gaXBtLT5tX2FkZF9jaGFuZ2UpID4wKSB7CisJCWlmICh0ZXN0X2FuZF9zZXRfYml0KENBQ0hFX05FR0FUSVZFLCAmaXBtLT5oLmZsYWdzKSA9PSAwKQorCQkJYXV0aF9kb21haW5fcHV0KCZpcG0tPm1fY2xpZW50LT5oKTsKKwkJcnYgPSBOVUxMOworCX0gZWxzZSB7CisJCXJ2ID0gJmlwbS0+bV9jbGllbnQtPmg7CisJCWNhY2hlX2dldCgmcnYtPmgpOworCX0KKwlpcF9tYXBfcHV0KCZpcG0tPmgsICZpcF9tYXBfY2FjaGUpOworCXJldHVybiBydjsKK30KKwordm9pZCBzdmNhdXRoX3VuaXhfcHVyZ2Uodm9pZCkKK3sKKwljYWNoZV9wdXJnZSgmaXBfbWFwX2NhY2hlKTsKKwljYWNoZV9wdXJnZSgmYXV0aF9kb21haW5fY2FjaGUpOworfQorCitzdGF0aWMgaW50CitzdmNhdXRoX3VuaXhfc2V0X2NsaWVudChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQoreworCXN0cnVjdCBpcF9tYXAga2V5LCAqaXBtOworCisJcnFzdHAtPnJxX2NsaWVudCA9IE5VTEw7CisJaWYgKHJxc3RwLT5ycV9wcm9jID09IDApCisJCXJldHVybiBTVkNfT0s7CisKKwlzdHJjcHkoa2V5Lm1fY2xhc3MsIHJxc3RwLT5ycV9zZXJ2ZXItPnN2X3Byb2dyYW0tPnBnX2NsYXNzKTsKKwlrZXkubV9hZGRyID0gcnFzdHAtPnJxX2FkZHIuc2luX2FkZHI7CisKKwlpcG0gPSBpcF9tYXBfbG9va3VwKCZrZXksIDApOworCisJaWYgKGlwbSA9PSBOVUxMKQorCQlyZXR1cm4gU1ZDX0RFTklFRDsKKworCXN3aXRjaCAoY2FjaGVfY2hlY2soJmlwX21hcF9jYWNoZSwgJmlwbS0+aCwgJnJxc3RwLT5ycV9jaGFuZGxlKSkgeworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJCWNhc2UgLUVBR0FJTjoKKwkJCXJldHVybiBTVkNfRFJPUDsKKwkJY2FzZSAtRU5PRU5UOgorCQkJcmV0dXJuIFNWQ19ERU5JRUQ7CisJCWNhc2UgMDoKKwkJCXJxc3RwLT5ycV9jbGllbnQgPSAmaXBtLT5tX2NsaWVudC0+aDsKKwkJCWNhY2hlX2dldCgmcnFzdHAtPnJxX2NsaWVudC0+aCk7CisJCQlpcF9tYXBfcHV0KCZpcG0tPmgsICZpcF9tYXBfY2FjaGUpOworCQkJYnJlYWs7CisJfQorCXJldHVybiBTVkNfT0s7Cit9CisKK3N0YXRpYyBpbnQKK3N2Y2F1dGhfbnVsbF9hY2NlcHQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICphdXRocCkKK3sKKwlzdHJ1Y3Qga3ZlYwkqYXJndiA9ICZycXN0cC0+cnFfYXJnLmhlYWRbMF07CisJc3RydWN0IGt2ZWMJKnJlc3YgPSAmcnFzdHAtPnJxX3Jlcy5oZWFkWzBdOworCXN0cnVjdCBzdmNfY3JlZAkqY3JlZCA9ICZycXN0cC0+cnFfY3JlZDsKKworCWNyZWQtPmNyX2dyb3VwX2luZm8gPSBOVUxMOworCXJxc3RwLT5ycV9jbGllbnQgPSBOVUxMOworCisJaWYgKGFyZ3YtPmlvdl9sZW4gPCAzKjQpCisJCXJldHVybiBTVkNfR0FSQkFHRTsKKworCWlmIChzdmNfZ2V0dTMyKGFyZ3YpICE9IDApIHsgCisJCWRwcmludGsoInN2YzogYmFkIG51bGwgY3JlZFxuIik7CisJCSphdXRocCA9IHJwY19hdXRoZXJyX2JhZGNyZWQ7CisJCXJldHVybiBTVkNfREVOSUVEOworCX0KKwlpZiAoc3ZjX2dldHUzMihhcmd2KSAhPSBSUENfQVVUSF9OVUxMIHx8IHN2Y19nZXR1MzIoYXJndikgIT0gMCkgeworCQlkcHJpbnRrKCJzdmM6IGJhZCBudWxsIHZlcmZcbiIpOworCQkqYXV0aHAgPSBycGNfYXV0aGVycl9iYWR2ZXJmOworCQlyZXR1cm4gU1ZDX0RFTklFRDsKKwl9CisKKwkvKiBTaWduYWwgdGhhdCBtYXBwaW5nIHRvIG5vYm9keSB1aWQvZ2lkIGlzIHJlcXVpcmVkICovCisJY3JlZC0+Y3JfdWlkID0gKHVpZF90KSAtMTsKKwljcmVkLT5jcl9naWQgPSAoZ2lkX3QpIC0xOworCWNyZWQtPmNyX2dyb3VwX2luZm8gPSBncm91cHNfYWxsb2MoMCk7CisJaWYgKGNyZWQtPmNyX2dyb3VwX2luZm8gPT0gTlVMTCkKKwkJcmV0dXJuIFNWQ19EUk9QOyAvKiBrbWFsbG9jIGZhaWx1cmUgLSBjbGllbnQgbXVzdCByZXRyeSAqLworCisJLyogUHV0IE5VTEwgdmVyaWZpZXIgKi8KKwlzdmNfcHV0dTMyKHJlc3YsIFJQQ19BVVRIX05VTEwpOworCXN2Y19wdXR1MzIocmVzdiwgMCk7CisKKwlyZXR1cm4gU1ZDX09LOworfQorCitzdGF0aWMgaW50CitzdmNhdXRoX251bGxfcmVsZWFzZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQoreworCWlmIChycXN0cC0+cnFfY2xpZW50KQorCQlhdXRoX2RvbWFpbl9wdXQocnFzdHAtPnJxX2NsaWVudCk7CisJcnFzdHAtPnJxX2NsaWVudCA9IE5VTEw7CisJaWYgKHJxc3RwLT5ycV9jcmVkLmNyX2dyb3VwX2luZm8pCisJCXB1dF9ncm91cF9pbmZvKHJxc3RwLT5ycV9jcmVkLmNyX2dyb3VwX2luZm8pOworCXJxc3RwLT5ycV9jcmVkLmNyX2dyb3VwX2luZm8gPSBOVUxMOworCisJcmV0dXJuIDA7IC8qIGRvbid0IGRyb3AgKi8KK30KKworCitzdHJ1Y3QgYXV0aF9vcHMgc3ZjYXV0aF9udWxsID0geworCS5uYW1lCQk9ICJudWxsIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmZsYXZvdXIJPSBSUENfQVVUSF9OVUxMLAorCS5hY2NlcHQgCT0gc3ZjYXV0aF9udWxsX2FjY2VwdCwKKwkucmVsZWFzZQk9IHN2Y2F1dGhfbnVsbF9yZWxlYXNlLAorCS5zZXRfY2xpZW50CT0gc3ZjYXV0aF91bml4X3NldF9jbGllbnQsCit9OworCisKK3N0YXRpYyBpbnQKK3N2Y2F1dGhfdW5peF9hY2NlcHQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICphdXRocCkKK3sKKwlzdHJ1Y3Qga3ZlYwkqYXJndiA9ICZycXN0cC0+cnFfYXJnLmhlYWRbMF07CisJc3RydWN0IGt2ZWMJKnJlc3YgPSAmcnFzdHAtPnJxX3Jlcy5oZWFkWzBdOworCXN0cnVjdCBzdmNfY3JlZAkqY3JlZCA9ICZycXN0cC0+cnFfY3JlZDsKKwl1MzIJCXNsZW4sIGk7CisJaW50CQlsZW4gICA9IGFyZ3YtPmlvdl9sZW47CisKKwljcmVkLT5jcl9ncm91cF9pbmZvID0gTlVMTDsKKwlycXN0cC0+cnFfY2xpZW50ID0gTlVMTDsKKworCWlmICgobGVuIC09IDMqNCkgPCAwKQorCQlyZXR1cm4gU1ZDX0dBUkJBR0U7CisKKwlzdmNfZ2V0dTMyKGFyZ3YpOwkJCS8qIGxlbmd0aCAqLworCXN2Y19nZXR1MzIoYXJndik7CQkJLyogdGltZSBzdGFtcCAqLworCXNsZW4gPSBYRFJfUVVBRExFTihudG9obChzdmNfZ2V0dTMyKGFyZ3YpKSk7CS8qIG1hY2huYW1lIGxlbmd0aCAqLworCWlmIChzbGVuID4gNjQgfHwgKGxlbiAtPSAoc2xlbiArIDMpKjQpIDwgMCkKKwkJZ290byBiYWRjcmVkOworCWFyZ3YtPmlvdl9iYXNlID0gKHZvaWQqKSgodTMyKilhcmd2LT5pb3ZfYmFzZSArIHNsZW4pOwkvKiBza2lwIG1hY2huYW1lICovCisJYXJndi0+aW92X2xlbiAtPSBzbGVuKjQ7CisKKwljcmVkLT5jcl91aWQgPSBudG9obChzdmNfZ2V0dTMyKGFyZ3YpKTsJCS8qIHVpZCAqLworCWNyZWQtPmNyX2dpZCA9IG50b2hsKHN2Y19nZXR1MzIoYXJndikpOwkJLyogZ2lkICovCisJc2xlbiA9IG50b2hsKHN2Y19nZXR1MzIoYXJndikpOwkJCS8qIGdpZHMgbGVuZ3RoICovCisJaWYgKHNsZW4gPiAxNiB8fCAobGVuIC09IChzbGVuICsgMikqNCkgPCAwKQorCQlnb3RvIGJhZGNyZWQ7CisJY3JlZC0+Y3JfZ3JvdXBfaW5mbyA9IGdyb3Vwc19hbGxvYyhzbGVuKTsKKwlpZiAoY3JlZC0+Y3JfZ3JvdXBfaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gU1ZDX0RST1A7CisJZm9yIChpID0gMDsgaSA8IHNsZW47IGkrKykKKwkJR1JPVVBfQVQoY3JlZC0+Y3JfZ3JvdXBfaW5mbywgaSkgPSBudG9obChzdmNfZ2V0dTMyKGFyZ3YpKTsKKworCWlmIChzdmNfZ2V0dTMyKGFyZ3YpICE9IFJQQ19BVVRIX05VTEwgfHwgc3ZjX2dldHUzMihhcmd2KSAhPSAwKSB7CisJCSphdXRocCA9IHJwY19hdXRoZXJyX2JhZHZlcmY7CisJCXJldHVybiBTVkNfREVOSUVEOworCX0KKworCS8qIFB1dCBOVUxMIHZlcmlmaWVyICovCisJc3ZjX3B1dHUzMihyZXN2LCBSUENfQVVUSF9OVUxMKTsKKwlzdmNfcHV0dTMyKHJlc3YsIDApOworCisJcmV0dXJuIFNWQ19PSzsKKworYmFkY3JlZDoKKwkqYXV0aHAgPSBycGNfYXV0aGVycl9iYWRjcmVkOworCXJldHVybiBTVkNfREVOSUVEOworfQorCitzdGF0aWMgaW50CitzdmNhdXRoX3VuaXhfcmVsZWFzZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQoreworCS8qIFZlcmlmaWVyIChzdWNoIGFzIGl0IGlzKSBpcyBhbHJlYWR5IGluIHBsYWNlLgorCSAqLworCWlmIChycXN0cC0+cnFfY2xpZW50KQorCQlhdXRoX2RvbWFpbl9wdXQocnFzdHAtPnJxX2NsaWVudCk7CisJcnFzdHAtPnJxX2NsaWVudCA9IE5VTEw7CisJaWYgKHJxc3RwLT5ycV9jcmVkLmNyX2dyb3VwX2luZm8pCisJCXB1dF9ncm91cF9pbmZvKHJxc3RwLT5ycV9jcmVkLmNyX2dyb3VwX2luZm8pOworCXJxc3RwLT5ycV9jcmVkLmNyX2dyb3VwX2luZm8gPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKKworc3RydWN0IGF1dGhfb3BzIHN2Y2F1dGhfdW5peCA9IHsKKwkubmFtZQkJPSAidW5peCIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5mbGF2b3VyCT0gUlBDX0FVVEhfVU5JWCwKKwkuYWNjZXB0IAk9IHN2Y2F1dGhfdW5peF9hY2NlcHQsCisJLnJlbGVhc2UJPSBzdmNhdXRoX3VuaXhfcmVsZWFzZSwKKwkuZG9tYWluX3JlbGVhc2UJPSBzdmNhdXRoX3VuaXhfZG9tYWluX3JlbGVhc2UsCisJLnNldF9jbGllbnQJPSBzdmNhdXRoX3VuaXhfc2V0X2NsaWVudCwKK307CisKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3Zjc29jay5jIGIvbmV0L3N1bnJwYy9zdmNzb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU5MDcwMwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zdW5ycGMvc3Zjc29jay5jCkBAIC0wLDAgKzEsMTU4NSBAQAorLyoKKyAqIGxpbnV4L25ldC9zdW5ycGMvc3Zjc29jay5jCisgKgorICogVGhlc2UgYXJlIHRoZSBSUEMgc2VydmVyIHNvY2tldCBpbnRlcm5hbHMuCisgKgorICogVGhlIHNlcnZlciBzY2hlZHVsaW5nIGFsZ29yaXRobSBkb2VzIG5vdCBhbHdheXMgZGlzdHJpYnV0ZSB0aGUgbG9hZAorICogZXZlbmx5IHdoZW4gc2VydmljaW5nIGEgc2luZ2xlIGNsaWVudC4gTWF5IG5lZWQgdG8gbW9kaWZ5IHRoZQorICogc3ZjX3NvY2tfZW5xdWV1ZSBwcm9jZWR1cmUuLi4KKyAqCisgKiBUQ1Agc3VwcG9ydCBpcyBsYXJnZWx5IHVudGVzdGVkIGFuZCBtYXkgYmUgYSBsaXR0bGUgc2xvdy4gVGhlIHByb2JsZW0KKyAqIGlzIHRoYXQgd2UgY3VycmVudGx5IGRvIHR3byBzZXBhcmF0ZSByZWN2ZnJvbSdzLCBvbmUgZm9yIHRoZSA0LWJ5dGUKKyAqIHJlY29yZCBsZW5ndGgsIGFuZCB0aGUgc2Vjb25kIGZvciB0aGUgYWN0dWFsIHJlY29yZC4gVGhpcyBjb3VsZCBwb3NzaWJseQorICogYmUgaW1wcm92ZWQgYnkgYWx3YXlzIHJlYWRpbmcgYSBtaW5pbXVtIHNpemUgb2YgYXJvdW5kIDEwMCBieXRlcyBhbmQKKyAqIHR1Y2tpbmcgYW55IHN1cGVyZmx1b3VzIGJ5dGVzIGF3YXkgaW4gYSB0ZW1wb3Jhcnkgc3RvcmUuIFN0aWxsLCB0aGF0CisgKiBsZWF2ZXMgd3JpdGUgcmVxdWVzdHMgb3V0IGluIHRoZSByYWluLiBBbiBhbHRlcm5hdGl2ZSBtYXkgYmUgdG8gcGVlayBhdAorICogdGhlIGZpcnN0IHNrYiBpbiB0aGUgcXVldWUsIGFuZCBpZiBpdCBtYXRjaGVzIHRoZSBuZXh0IFRDUCBzZXF1ZW5jZQorICogbnVtYmVyLCB0byBleHRyYWN0IHRoZSByZWNvcmQgbWFya2VyLiBZdWNrLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgorCisjaW5jbHVkZSA8bGludXgvc3VucnBjL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3hkci5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNzb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N0YXRzLmg+CisKKy8qIFNNUCBsb2NraW5nIHN0cmF0ZWd5OgorICoKKyAqIAlzdmNfc2Vydi0+c3ZfbG9jayBwcm90ZWN0cyBtb3N0IHN0dWZmIGZvciB0aGF0IHNlcnZpY2UuCisgKgorICoJU29tZSBmbGFncyBjYW4gYmUgc2V0IHRvIGNlcnRhaW4gdmFsdWVzIGF0IGFueSB0aW1lCisgKglwcm92aWRpbmcgdGhhdCBjZXJ0YWluIHJ1bGVzIGFyZSBmb2xsb3dlZDoKKyAqCisgKglTS19CVVNZICBjYW4gYmUgc2V0IHRvIDAgYXQgYW55IHRpbWUuICAKKyAqCQlzdmNfc29ja19lbnF1ZXVlIG11c3QgYmUgY2FsbGVkIGFmdGVyd2FyZHMKKyAqCVNLX0NPTk4sIFNLX0RBVEEsIGNhbiBiZSBzZXQgb3IgY2xlYXJlZCBhdCBhbnkgdGltZS4KKyAqCQlhZnRlciBhIHNldCwgc3ZjX3NvY2tfZW5xdWV1ZSBtdXN0IGJlIGNhbGxlZC4JCisgKgkJYWZ0ZXIgYSBjbGVhciwgdGhlIHNvY2tldCBtdXN0IGJlIHJlYWQvYWNjZXB0ZWQKKyAqCQkgaWYgdGhpcyBzdWNjZWVkcywgaXQgbXVzdCBiZSBzZXQgYWdhaW4uCisgKglTS19DTE9TRSBjYW4gc2V0IGF0IGFueSB0aW1lLiBJdCBpcyBuZXZlciBjbGVhcmVkLgorICoKKyAqLworCisjZGVmaW5lIFJQQ0RCR19GQUNJTElUWQlSUENEQkdfU1ZDU09DSworCisKK3N0YXRpYyBzdHJ1Y3Qgc3ZjX3NvY2sgKnN2Y19zZXR1cF9zb2NrZXQoc3RydWN0IHN2Y19zZXJ2ICosIHN0cnVjdCBzb2NrZXQgKiwKKwkJCQkJIGludCAqZXJycCwgaW50IHBtYXBfcmVnKTsKK3N0YXRpYyB2b2lkCQlzdmNfdWRwX2RhdGFfcmVhZHkoc3RydWN0IHNvY2sgKiwgaW50KTsKK3N0YXRpYyBpbnQJCXN2Y191ZHBfcmVjdmZyb20oc3RydWN0IHN2Y19ycXN0ICopOworc3RhdGljIGludAkJc3ZjX3VkcF9zZW5kdG8oc3RydWN0IHN2Y19ycXN0ICopOworCitzdGF0aWMgc3RydWN0IHN2Y19kZWZlcnJlZF9yZXEgKnN2Y19kZWZlcnJlZF9kZXF1ZXVlKHN0cnVjdCBzdmNfc29jayAqc3Zzayk7CitzdGF0aWMgaW50IHN2Y19kZWZlcnJlZF9yZWN2KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApOworc3RhdGljIHN0cnVjdCBjYWNoZV9kZWZlcnJlZF9yZXEgKnN2Y19kZWZlcihzdHJ1Y3QgY2FjaGVfcmVxICpyZXEpOworCisvKgorICogUXVldWUgdXAgYW4gaWRsZSBzZXJ2ZXIgdGhyZWFkLiAgTXVzdCBoYXZlIHNlcnYtPnN2X2xvY2sgaGVsZC4KKyAqIE5vdGU6IHRoaXMgaXMgcmVhbGx5IGEgc3RhY2sgcmF0aGVyIHRoYW4gYSBxdWV1ZSwgc28gdGhhdCB3ZSBvbmx5CisgKiB1c2UgYXMgbWFueSBkaWZmZXJlbnQgdGhyZWFkcyBhcyB3ZSBuZWVkLCBhbmQgdGhlIHJlc3QgZG9uJ3QgcG9sdXRlCisgKiB0aGUgY2FjaGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorc3ZjX3NlcnZfZW5xdWV1ZShzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYsIHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCit7CisJbGlzdF9hZGQoJnJxc3RwLT5ycV9saXN0LCAmc2Vydi0+c3ZfdGhyZWFkcyk7Cit9CisKKy8qCisgKiBEZXF1ZXVlIGFuIG5mc2QgdGhyZWFkLiAgTXVzdCBoYXZlIHNlcnYtPnN2X2xvY2sgaGVsZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitzdmNfc2Vydl9kZXF1ZXVlKHN0cnVjdCBzdmNfc2VydiAqc2Vydiwgc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKK3sKKwlsaXN0X2RlbCgmcnFzdHAtPnJxX2xpc3QpOworfQorCisvKgorICogUmVsZWFzZSBhbiBza2J1ZmYgYWZ0ZXIgdXNlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorc3ZjX3JlbGVhc2Vfc2tiKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHJxc3RwLT5ycV9za2J1ZmY7CisJc3RydWN0IHN2Y19kZWZlcnJlZF9yZXEgKmRyID0gcnFzdHAtPnJxX2RlZmVycmVkOworCisJaWYgKHNrYikgeworCQlycXN0cC0+cnFfc2tidWZmID0gTlVMTDsKKworCQlkcHJpbnRrKCJzdmM6IHNlcnZpY2UgJXAsIHJlbGVhc2luZyBza2IgJXBcbiIsIHJxc3RwLCBza2IpOworCQlza2JfZnJlZV9kYXRhZ3JhbShycXN0cC0+cnFfc29jay0+c2tfc2ssIHNrYik7CisJfQorCWlmIChkcikgeworCQlycXN0cC0+cnFfZGVmZXJyZWQgPSBOVUxMOworCQlrZnJlZShkcik7CisJfQorfQorCisvKgorICogQW55IHNwYWNlIHRvIHdyaXRlPworICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK3N2Y19zb2NrX3dzcGFjZShzdHJ1Y3Qgc3ZjX3NvY2sgKnN2c2spCit7CisJaW50IHdzcGFjZTsKKworCWlmIChzdnNrLT5za19zb2NrLT50eXBlID09IFNPQ0tfU1RSRUFNKQorCQl3c3BhY2UgPSBza19zdHJlYW1fd3NwYWNlKHN2c2stPnNrX3NrKTsKKwllbHNlCisJCXdzcGFjZSA9IHNvY2tfd3NwYWNlKHN2c2stPnNrX3NrKTsKKworCXJldHVybiB3c3BhY2U7Cit9CisKKy8qCisgKiBRdWV1ZSB1cCBhIHNvY2tldCB3aXRoIGRhdGEgcGVuZGluZy4gSWYgdGhlcmUgYXJlIGlkbGUgbmZzZAorICogcHJvY2Vzc2VzLCB3YWtlICdlbSB1cC4KKyAqCisgKi8KK3N0YXRpYyB2b2lkCitzdmNfc29ja19lbnF1ZXVlKHN0cnVjdCBzdmNfc29jayAqc3ZzaykKK3sKKwlzdHJ1Y3Qgc3ZjX3NlcnYJKnNlcnYgPSBzdnNrLT5za19zZXJ2ZXI7CisJc3RydWN0IHN2Y19ycXN0CSpycXN0cDsKKworCWlmICghKHN2c2stPnNrX2ZsYWdzICYKKwkgICAgICAoICgxPDxTS19DT05OKXwoMTw8U0tfREFUQSl8KDE8PFNLX0NMT1NFKXwoMTw8U0tfREVGRVJSRUQpKSApKQorCQlyZXR1cm47CisJaWYgKHRlc3RfYml0KFNLX0RFQUQsICZzdnNrLT5za19mbGFncykpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19iaCgmc2Vydi0+c3ZfbG9jayk7CisKKwlpZiAoIWxpc3RfZW1wdHkoJnNlcnYtPnN2X3RocmVhZHMpICYmIAorCSAgICAhbGlzdF9lbXB0eSgmc2Vydi0+c3Zfc29ja2V0cykpCisJCXByaW50ayhLRVJOX0VSUgorCQkJInN2Y19zb2NrX2VucXVldWU6IHRocmVhZHMgYW5kIHNvY2tldHMgYm90aCB3YWl0aW5nPz9cbiIpOworCisJaWYgKHRlc3RfYml0KFNLX0RFQUQsICZzdnNrLT5za19mbGFncykpIHsKKwkJLyogRG9uJ3QgZW5xdWV1ZSBkZWFkIHNvY2tldHMgKi8KKwkJZHByaW50aygic3ZjOiBzb2NrZXQgJXAgaXMgZGVhZCwgbm90IGVucXVldWVkXG4iLCBzdnNrLT5za19zayk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlpZiAodGVzdF9iaXQoU0tfQlVTWSwgJnN2c2stPnNrX2ZsYWdzKSkgeworCQkvKiBEb24ndCBlbnF1ZXVlIHNvY2tldCB3aGlsZSBkYWVtb24gaXMgcmVjZWl2aW5nICovCisJCWRwcmludGsoInN2Yzogc29ja2V0ICVwIGJ1c3ksIG5vdCBlbnF1ZXVlZFxuIiwgc3Zzay0+c2tfc2spOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJc2V0X2JpdChTT0NLX05PU1BBQ0UsICZzdnNrLT5za19zb2NrLT5mbGFncyk7CisJaWYgKCgoc3Zzay0+c2tfcmVzZXJ2ZWQgKyBzZXJ2LT5zdl9idWZzeikqMgorCSAgICAgPiBzdmNfc29ja193c3BhY2Uoc3ZzaykpCisJICAgICYmICF0ZXN0X2JpdChTS19DTE9TRSwgJnN2c2stPnNrX2ZsYWdzKQorCSAgICAmJiAhdGVzdF9iaXQoU0tfQ09OTiwgJnN2c2stPnNrX2ZsYWdzKSkgeworCQkvKiBEb24ndCBlbnF1ZXVlIHdoaWxlIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHJlcGx5ICovCisJCWRwcmludGsoInN2Yzogc29ja2V0ICVwICBubyBzcGFjZSwgJWQqMiA+ICVsZCwgbm90IGVucXVldWVkXG4iLAorCQkJc3Zzay0+c2tfc2ssIHN2c2stPnNrX3Jlc2VydmVkK3NlcnYtPnN2X2J1ZnN6LAorCQkJc3ZjX3NvY2tfd3NwYWNlKHN2c2spKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwljbGVhcl9iaXQoU09DS19OT1NQQUNFLCAmc3Zzay0+c2tfc29jay0+ZmxhZ3MpOworCisJLyogTWFyayBzb2NrZXQgYXMgYnVzeS4gSXQgd2lsbCByZW1haW4gaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGUKKwkgKiBzZXJ2ZXIgaGFzIHByb2Nlc3NlZCBhbGwgcGVuZGluZyBkYXRhIGFuZCBwdXQgdGhlIHNvY2tldCBiYWNrCisJICogb24gdGhlIGlkbGUgbGlzdC4KKwkgKi8KKwlzZXRfYml0KFNLX0JVU1ksICZzdnNrLT5za19mbGFncyk7CisKKwlpZiAoIWxpc3RfZW1wdHkoJnNlcnYtPnN2X3RocmVhZHMpKSB7CisJCXJxc3RwID0gbGlzdF9lbnRyeShzZXJ2LT5zdl90aHJlYWRzLm5leHQsCisJCQkJICAgc3RydWN0IHN2Y19ycXN0LAorCQkJCSAgIHJxX2xpc3QpOworCQlkcHJpbnRrKCJzdmM6IHNvY2tldCAlcCBzZXJ2ZWQgYnkgZGFlbW9uICVwXG4iLAorCQkJc3Zzay0+c2tfc2ssIHJxc3RwKTsKKwkJc3ZjX3NlcnZfZGVxdWV1ZShzZXJ2LCBycXN0cCk7CisJCWlmIChycXN0cC0+cnFfc29jaykKKwkJCXByaW50ayhLRVJOX0VSUiAKKwkJCQkic3ZjX3NvY2tfZW5xdWV1ZTogc2VydmVyICVwLCBycV9zb2NrPSVwIVxuIiwKKwkJCQlycXN0cCwgcnFzdHAtPnJxX3NvY2spOworCQlycXN0cC0+cnFfc29jayA9IHN2c2s7CisJCXN2c2stPnNrX2ludXNlKys7CisJCXJxc3RwLT5ycV9yZXNlcnZlZCA9IHNlcnYtPnN2X2J1ZnN6OworCQlzdnNrLT5za19yZXNlcnZlZCArPSBycXN0cC0+cnFfcmVzZXJ2ZWQ7CisJCXdha2VfdXAoJnJxc3RwLT5ycV93YWl0KTsKKwl9IGVsc2UgeworCQlkcHJpbnRrKCJzdmM6IHNvY2tldCAlcCBwdXQgaW50byBxdWV1ZVxuIiwgc3Zzay0+c2tfc2spOworCQlsaXN0X2FkZF90YWlsKCZzdnNrLT5za19yZWFkeSwgJnNlcnYtPnN2X3NvY2tldHMpOworCX0KKworb3V0X3VubG9jazoKKwlzcGluX3VubG9ja19iaCgmc2Vydi0+c3ZfbG9jayk7Cit9CisKKy8qCisgKiBEZXF1ZXVlIHRoZSBmaXJzdCBzb2NrZXQuICBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBzZXJ2LT5zdl9sb2NrIGhlbGQuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN2Y19zb2NrICoKK3N2Y19zb2NrX2RlcXVldWUoc3RydWN0IHN2Y19zZXJ2ICpzZXJ2KQoreworCXN0cnVjdCBzdmNfc29jawkqc3ZzazsKKworCWlmIChsaXN0X2VtcHR5KCZzZXJ2LT5zdl9zb2NrZXRzKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzdnNrID0gbGlzdF9lbnRyeShzZXJ2LT5zdl9zb2NrZXRzLm5leHQsCisJCQkgIHN0cnVjdCBzdmNfc29jaywgc2tfcmVhZHkpOworCWxpc3RfZGVsX2luaXQoJnN2c2stPnNrX3JlYWR5KTsKKworCWRwcmludGsoInN2Yzogc29ja2V0ICVwIGRlcXVldWVkLCBpbnVzZT0lZFxuIiwKKwkJc3Zzay0+c2tfc2ssIHN2c2stPnNrX2ludXNlKTsKKworCXJldHVybiBzdnNrOworfQorCisvKgorICogSGF2aW5nIHJlYWQgc29tZXRoaW5nIGZyb20gYSBzb2NrZXQsIGNoZWNrIHdoZXRoZXIgaXQKKyAqIG5lZWRzIHRvIGJlIHJlLWVucXVldWVkLgorICogTm90ZTogU0tfREFUQSBvbmx5IGdldHMgY2xlYXJlZCB3aGVuIGEgcmVhZC1hdHRlbXB0IGZpbmRzCisgKiBubyAob3IgaW5zdWZmaWNpZW50KSBkYXRhLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3N2Y19zb2NrX3JlY2VpdmVkKHN0cnVjdCBzdmNfc29jayAqc3ZzaykKK3sKKwljbGVhcl9iaXQoU0tfQlVTWSwgJnN2c2stPnNrX2ZsYWdzKTsKKwlzdmNfc29ja19lbnF1ZXVlKHN2c2spOworfQorCisKKy8qKgorICogc3ZjX3Jlc2VydmUgLSBjaGFuZ2UgdGhlIHNwYWNlIHJlc2VydmVkIGZvciB0aGUgcmVwbHkgdG8gYSByZXF1ZXN0LgorICogQHJxc3RwOiAgVGhlIHJlcXVlc3QgaW4gcXVlc3Rpb24KKyAqIEBzcGFjZTogbmV3IG1heCBzcGFjZSB0byByZXNlcnZlCisgKgorICogRWFjaCByZXF1ZXN0IHJlc2VydmVzIHNvbWUgc3BhY2Ugb24gdGhlIG91dHB1dCBxdWV1ZSBvZiB0aGUgc29ja2V0CisgKiB0byBtYWtlIHN1cmUgdGhlIHJlcGx5IGZpdHMuICBUaGlzIGZ1bmN0aW9uIHJlZHVjZXMgdGhhdCByZXNlcnZlZAorICogc3BhY2UgdG8gYmUgdGhlIGFtb3VudCBvZiBzcGFjZSB1c2VkIGFscmVhZHksIHBsdXMgQHNwYWNlLgorICoKKyAqLwordm9pZCBzdmNfcmVzZXJ2ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBpbnQgc3BhY2UpCit7CisJc3BhY2UgKz0gcnFzdHAtPnJxX3Jlcy5oZWFkWzBdLmlvdl9sZW47CisKKwlpZiAoc3BhY2UgPCBycXN0cC0+cnFfcmVzZXJ2ZWQpIHsKKwkJc3RydWN0IHN2Y19zb2NrICpzdnNrID0gcnFzdHAtPnJxX3NvY2s7CisJCXNwaW5fbG9ja19iaCgmc3Zzay0+c2tfc2VydmVyLT5zdl9sb2NrKTsKKwkJc3Zzay0+c2tfcmVzZXJ2ZWQgLT0gKHJxc3RwLT5ycV9yZXNlcnZlZCAtIHNwYWNlKTsKKwkJcnFzdHAtPnJxX3Jlc2VydmVkID0gc3BhY2U7CisJCXNwaW5fdW5sb2NrX2JoKCZzdnNrLT5za19zZXJ2ZXItPnN2X2xvY2spOworCisJCXN2Y19zb2NrX2VucXVldWUoc3Zzayk7CisJfQorfQorCisvKgorICogUmVsZWFzZSBhIHNvY2tldCBhZnRlciB1c2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorc3ZjX3NvY2tfcHV0KHN0cnVjdCBzdmNfc29jayAqc3ZzaykKK3sKKwlzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYgPSBzdnNrLT5za19zZXJ2ZXI7CisKKwlzcGluX2xvY2tfYmgoJnNlcnYtPnN2X2xvY2spOworCWlmICghLS0oc3Zzay0+c2tfaW51c2UpICYmIHRlc3RfYml0KFNLX0RFQUQsICZzdnNrLT5za19mbGFncykpIHsKKwkJc3Bpbl91bmxvY2tfYmgoJnNlcnYtPnN2X2xvY2spOworCQlkcHJpbnRrKCJzdmM6IHJlbGVhc2luZyBkZWFkIHNvY2tldFxuIik7CisJCXNvY2tfcmVsZWFzZShzdnNrLT5za19zb2NrKTsKKwkJa2ZyZWUoc3Zzayk7CisJfQorCWVsc2UKKwkJc3Bpbl91bmxvY2tfYmgoJnNlcnYtPnN2X2xvY2spOworfQorCitzdGF0aWMgdm9pZAorc3ZjX3NvY2tfcmVsZWFzZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQoreworCXN0cnVjdCBzdmNfc29jawkqc3ZzayA9IHJxc3RwLT5ycV9zb2NrOworCisJc3ZjX3JlbGVhc2Vfc2tiKHJxc3RwKTsKKworCXN2Y19mcmVlX2FsbHBhZ2VzKHJxc3RwKTsKKwlycXN0cC0+cnFfcmVzLnBhZ2VfbGVuID0gMDsKKwlycXN0cC0+cnFfcmVzLnBhZ2VfYmFzZSA9IDA7CisKKworCS8qIFJlc2V0IHJlc3BvbnNlIGJ1ZmZlciBhbmQgcmVsZWFzZQorCSAqIHRoZSByZXNlcnZhdGlvbi4KKwkgKiBCdXQgZmlyc3QsIGNoZWNrIHRoYXQgZW5vdWdoIHNwYWNlIHdhcyByZXNlcnZlZAorCSAqIGZvciB0aGUgcmVwbHksIG90aGVyd2lzZSB3ZSBoYXZlIGEgYnVnIQorCSAqLworCWlmICgocnFzdHAtPnJxX3Jlcy5sZW4pID4gIHJxc3RwLT5ycV9yZXNlcnZlZCkKKwkJcHJpbnRrKEtFUk5fRVJSICJSUEMgcmVxdWVzdCByZXNlcnZlZCAlZCBidXQgdXNlZCAlZFxuIiwKKwkJICAgICAgIHJxc3RwLT5ycV9yZXNlcnZlZCwKKwkJICAgICAgIHJxc3RwLT5ycV9yZXMubGVuKTsKKworCXJxc3RwLT5ycV9yZXMuaGVhZFswXS5pb3ZfbGVuID0gMDsKKwlzdmNfcmVzZXJ2ZShycXN0cCwgMCk7CisJcnFzdHAtPnJxX3NvY2sgPSBOVUxMOworCisJc3ZjX3NvY2tfcHV0KHN2c2spOworfQorCisvKgorICogRXh0ZXJuYWwgZnVuY3Rpb24gdG8gd2FrZSB1cCBhIHNlcnZlciB3YWl0aW5nIGZvciBkYXRhCisgKi8KK3ZvaWQKK3N2Y193YWtlX3VwKHN0cnVjdCBzdmNfc2VydiAqc2VydikKK3sKKwlzdHJ1Y3Qgc3ZjX3Jxc3QJKnJxc3RwOworCisJc3Bpbl9sb2NrX2JoKCZzZXJ2LT5zdl9sb2NrKTsKKwlpZiAoIWxpc3RfZW1wdHkoJnNlcnYtPnN2X3RocmVhZHMpKSB7CisJCXJxc3RwID0gbGlzdF9lbnRyeShzZXJ2LT5zdl90aHJlYWRzLm5leHQsCisJCQkJICAgc3RydWN0IHN2Y19ycXN0LAorCQkJCSAgIHJxX2xpc3QpOworCQlkcHJpbnRrKCJzdmM6IGRhZW1vbiAlcCB3b2tlbiB1cC5cbiIsIHJxc3RwKTsKKwkJLyoKKwkJc3ZjX3NlcnZfZGVxdWV1ZShzZXJ2LCBycXN0cCk7CisJCXJxc3RwLT5ycV9zb2NrID0gTlVMTDsKKwkJICovCisJCXdha2VfdXAoJnJxc3RwLT5ycV93YWl0KTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnNlcnYtPnN2X2xvY2spOworfQorCisvKgorICogR2VuZXJpYyBzZW5kdG8gcm91dGluZQorICovCitzdGF0aWMgaW50CitzdmNfc2VuZHRvKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCB4ZHJfYnVmICp4ZHIpCit7CisJc3RydWN0IHN2Y19zb2NrCSpzdnNrID0gcnFzdHAtPnJxX3NvY2s7CisJc3RydWN0IHNvY2tldAkqc29jayA9IHN2c2stPnNrX3NvY2s7CisJaW50CQlzbGVuOworCWNoYXIgCQlidWZmZXJbQ01TR19TUEFDRShzaXplb2Yoc3RydWN0IGluX3BrdGluZm8pKV07CisJc3RydWN0IGNtc2doZHIgKmNtaCA9IChzdHJ1Y3QgY21zZ2hkciAqKWJ1ZmZlcjsKKwlzdHJ1Y3QgaW5fcGt0aW5mbyAqcGtpID0gKHN0cnVjdCBpbl9wa3RpbmZvICopQ01TR19EQVRBKGNtaCk7CisJaW50CQlsZW4gPSAwOworCWludAkJcmVzdWx0OworCWludAkJc2l6ZTsKKwlzdHJ1Y3QgcGFnZQkqKnBwYWdlID0geGRyLT5wYWdlczsKKwlzaXplX3QJCWJhc2UgPSB4ZHItPnBhZ2VfYmFzZTsKKwl1bnNpZ25lZCBpbnQJcGdsZW4gPSB4ZHItPnBhZ2VfbGVuOworCXVuc2lnbmVkIGludAlmbGFncyA9IE1TR19NT1JFOworCisJc2xlbiA9IHhkci0+bGVuOworCisJaWYgKHJxc3RwLT5ycV9wcm90ID09IElQUFJPVE9fVURQKSB7CisJCS8qIHNldCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiAqLworCQlzdHJ1Y3QgbXNnaGRyCW1zZzsKKwkJbXNnLm1zZ19uYW1lICAgID0gJnJxc3RwLT5ycV9hZGRyOworCQltc2cubXNnX25hbWVsZW4gPSBzaXplb2YocnFzdHAtPnJxX2FkZHIpOworCQltc2cubXNnX2lvdiAgICAgPSBOVUxMOworCQltc2cubXNnX2lvdmxlbiAgPSAwOworCQltc2cubXNnX2ZsYWdzCT0gTVNHX01PUkU7CisKKwkJbXNnLm1zZ19jb250cm9sID0gY21oOworCQltc2cubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoYnVmZmVyKTsKKwkJY21oLT5jbXNnX2xlbiA9IENNU0dfTEVOKHNpemVvZigqcGtpKSk7CisJCWNtaC0+Y21zZ19sZXZlbCA9IFNPTF9JUDsKKwkJY21oLT5jbXNnX3R5cGUgPSBJUF9QS1RJTkZPOworCQlwa2ktPmlwaV9pZmluZGV4ID0gMDsKKwkJcGtpLT5pcGlfc3BlY19kc3Quc19hZGRyID0gcnFzdHAtPnJxX2RhZGRyOworCisJCWlmIChzb2NrX3NlbmRtc2coc29jaywgJm1zZywgMCkgPCAwKQorCQkJZ290byBvdXQ7CisJfQorCisJLyogc2VuZCBoZWFkICovCisJaWYgKHNsZW4gPT0geGRyLT5oZWFkWzBdLmlvdl9sZW4pCisJCWZsYWdzID0gMDsKKwlsZW4gPSBzb2NrLT5vcHMtPnNlbmRwYWdlKHNvY2ssIHJxc3RwLT5ycV9yZXNwYWdlc1swXSwgMCwgeGRyLT5oZWFkWzBdLmlvdl9sZW4sIGZsYWdzKTsKKwlpZiAobGVuICE9IHhkci0+aGVhZFswXS5pb3ZfbGVuKQorCQlnb3RvIG91dDsKKwlzbGVuIC09IHhkci0+aGVhZFswXS5pb3ZfbGVuOworCWlmIChzbGVuID09IDApCisJCWdvdG8gb3V0OworCisJLyogc2VuZCBwYWdlIGRhdGEgKi8KKwlzaXplID0gUEFHRV9TSVpFIC0gYmFzZSA8IHBnbGVuID8gUEFHRV9TSVpFIC0gYmFzZSA6IHBnbGVuOworCXdoaWxlIChwZ2xlbiA+IDApIHsKKwkJaWYgKHNsZW4gPT0gc2l6ZSkKKwkJCWZsYWdzID0gMDsKKwkJcmVzdWx0ID0gc29jay0+b3BzLT5zZW5kcGFnZShzb2NrLCAqcHBhZ2UsIGJhc2UsIHNpemUsIGZsYWdzKTsKKwkJaWYgKHJlc3VsdCA+IDApCisJCQlsZW4gKz0gcmVzdWx0OworCQlpZiAocmVzdWx0ICE9IHNpemUpCisJCQlnb3RvIG91dDsKKwkJc2xlbiAtPSBzaXplOworCQlwZ2xlbiAtPSBzaXplOworCQlzaXplID0gUEFHRV9TSVpFIDwgcGdsZW4gPyBQQUdFX1NJWkUgOiBwZ2xlbjsKKwkJYmFzZSA9IDA7CisJCXBwYWdlKys7CisJfQorCS8qIHNlbmQgdGFpbCAqLworCWlmICh4ZHItPnRhaWxbMF0uaW92X2xlbikgeworCQlyZXN1bHQgPSBzb2NrLT5vcHMtPnNlbmRwYWdlKHNvY2ssIHJxc3RwLT5ycV9yZXNwYWdlc1tycXN0cC0+cnFfcmVzdGFpbHBhZ2VdLCAKKwkJCQkJICAgICAoKHVuc2lnbmVkIGxvbmcpeGRyLT50YWlsWzBdLmlvdl9iYXNlKSYgKFBBR0VfU0laRS0xKSwKKwkJCQkJICAgICB4ZHItPnRhaWxbMF0uaW92X2xlbiwgMCk7CisKKwkJaWYgKHJlc3VsdCA+IDApCisJCQlsZW4gKz0gcmVzdWx0OworCX0KK291dDoKKwlkcHJpbnRrKCJzdmM6IHNvY2tldCAlcCBzZW5kdG8oWyVwICVadS4uLiBdLCAlZCkgPSAlZCAoYWRkciAleClcbiIsCisJCQlycXN0cC0+cnFfc29jaywgeGRyLT5oZWFkWzBdLmlvdl9iYXNlLCB4ZHItPmhlYWRbMF0uaW92X2xlbiwgeGRyLT5sZW4sIGxlbiwKKwkJcnFzdHAtPnJxX2FkZHIuc2luX2FkZHIuc19hZGRyKTsKKworCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBDaGVjayBpbnB1dCBxdWV1ZSBsZW5ndGgKKyAqLworc3RhdGljIGludAorc3ZjX3JlY3ZfYXZhaWxhYmxlKHN0cnVjdCBzdmNfc29jayAqc3ZzaykKK3sKKwltbV9zZWdtZW50X3QJb2xkZnM7CisJc3RydWN0IHNvY2tldAkqc29jayA9IHN2c2stPnNrX3NvY2s7CisJaW50CQlhdmFpbCwgZXJyOworCisJb2xkZnMgPSBnZXRfZnMoKTsgc2V0X2ZzKEtFUk5FTF9EUyk7CisJZXJyID0gc29jay0+b3BzLT5pb2N0bChzb2NrLCBUSU9DSU5RLCAodW5zaWduZWQgbG9uZykgJmF2YWlsKTsKKwlzZXRfZnMob2xkZnMpOworCisJcmV0dXJuIChlcnIgPj0gMCk/IGF2YWlsIDogZXJyOworfQorCisvKgorICogR2VuZXJpYyByZWN2ZnJvbSByb3V0aW5lLgorICovCitzdGF0aWMgaW50CitzdmNfcmVjdmZyb20oc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IGt2ZWMgKmlvdiwgaW50IG5yLCBpbnQgYnVmbGVuKQoreworCXN0cnVjdCBtc2doZHIJbXNnOworCXN0cnVjdCBzb2NrZXQJKnNvY2s7CisJaW50CQlsZW4sIGFsZW47CisKKwlycXN0cC0+cnFfYWRkcmxlbiA9IHNpemVvZihycXN0cC0+cnFfYWRkcik7CisJc29jayA9IHJxc3RwLT5ycV9zb2NrLT5za19zb2NrOworCisJbXNnLm1zZ19uYW1lICAgID0gJnJxc3RwLT5ycV9hZGRyOworCW1zZy5tc2dfbmFtZWxlbiA9IHNpemVvZihycXN0cC0+cnFfYWRkcik7CisJbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCisJbXNnLm1zZ19mbGFncwk9IE1TR19ET05UV0FJVDsKKworCWxlbiA9IGtlcm5lbF9yZWN2bXNnKHNvY2ssICZtc2csIGlvdiwgbnIsIGJ1ZmxlbiwgTVNHX0RPTlRXQUlUKTsKKworCS8qIHNvY2tfcmVjdm1zZyBkb2Vzbid0IGZpbGwgaW4gdGhlIG5hbWUvbmFtZWxlbiwgc28gd2UgbXVzdC4uCisJICogcG9zc2libHkgd2Ugc2hvdWxkIGNhY2hlIHRoaXMgaW4gdGhlIHN2Y19zb2NrIHN0cnVjdHVyZQorCSAqIGF0IGFjY2VwdCB0aW1lLiBGSVhNRQorCSAqLworCWFsZW4gPSBzaXplb2YocnFzdHAtPnJxX2FkZHIpOworCXNvY2stPm9wcy0+Z2V0bmFtZShzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJnJxc3RwLT5ycV9hZGRyLCAmYWxlbiwgMSk7CisKKwlkcHJpbnRrKCJzdmM6IHNvY2tldCAlcCByZWN2ZnJvbSglcCwgJVp1KSA9ICVkXG4iLAorCQlycXN0cC0+cnFfc29jaywgaW92WzBdLmlvdl9iYXNlLCBpb3ZbMF0uaW92X2xlbiwgbGVuKTsKKworCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBTZXQgc29ja2V0IHNuZCBhbmQgcmN2IGJ1ZmZlciBsZW5ndGhzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorc3ZjX3NvY2tfc2V0YnVmc2l6ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgc25kLCB1bnNpZ25lZCBpbnQgcmN2KQoreworI2lmIDAKKwltbV9zZWdtZW50X3QJb2xkZnM7CisJb2xkZnMgPSBnZXRfZnMoKTsgc2V0X2ZzKEtFUk5FTF9EUyk7CisJc29ja19zZXRzb2Nrb3B0KHNvY2ssIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwKKwkJCShjaGFyKikmc25kLCBzaXplb2Yoc25kKSk7CisJc29ja19zZXRzb2Nrb3B0KHNvY2ssIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwKKwkJCShjaGFyKikmcmN2LCBzaXplb2YocmN2KSk7CisjZWxzZQorCS8qIHNvY2tfc2V0c29ja29wdCBsaW1pdHMgdXNlIHRvIHN5c2N0bF8/bWVtX21heCwKKwkgKiB3aGljaCBpc24ndCBhY2NlcHRhYmxlLiAgVW50aWwgdGhhdCBpcyBtYWRlIGNvbmRpdGlvbmFsCisJICogb24gbm90IGhhdmluZyBDQVBfU1lTX1JFU09VUkNFIG9yIHNpbWlsYXIsIHdlIGdvIGRpcmVjdC4uLgorCSAqIERhdmVNIHNhaWQgSSBjb3VsZCEKKwkgKi8KKwlsb2NrX3NvY2soc29jay0+c2spOworCXNvY2stPnNrLT5za19zbmRidWYgPSBzbmQgKiAyOworCXNvY2stPnNrLT5za19yY3ZidWYgPSByY3YgKiAyOworCXNvY2stPnNrLT5za191c2VybG9ja3MgfD0gU09DS19TTkRCVUZfTE9DS3xTT0NLX1JDVkJVRl9MT0NLOworCXJlbGVhc2Vfc29jayhzb2NrLT5zayk7CisjZW5kaWYKK30KKy8qCisgKiBJTkVUIGNhbGxiYWNrIHdoZW4gZGF0YSBoYXMgYmVlbiByZWNlaXZlZCBvbiB0aGUgc29ja2V0LgorICovCitzdGF0aWMgdm9pZAorc3ZjX3VkcF9kYXRhX3JlYWR5KHN0cnVjdCBzb2NrICpzaywgaW50IGNvdW50KQoreworCXN0cnVjdCBzdmNfc29jawkqc3ZzayA9IChzdHJ1Y3Qgc3ZjX3NvY2sgKikoc2stPnNrX3VzZXJfZGF0YSk7CisKKwlpZiAoIXN2c2spCisJCWdvdG8gb3V0OworCWRwcmludGsoInN2Yzogc29ja2V0ICVwKGluZXQgJXApLCBjb3VudD0lZCwgYnVzeT0lZFxuIiwKKwkJc3Zzaywgc2ssIGNvdW50LCB0ZXN0X2JpdChTS19CVVNZLCAmc3Zzay0+c2tfZmxhZ3MpKTsKKwlzZXRfYml0KFNLX0RBVEEsICZzdnNrLT5za19mbGFncyk7CisJc3ZjX3NvY2tfZW5xdWV1ZShzdnNrKTsKKyBvdXQ6CisJaWYgKHNrLT5za19zbGVlcCAmJiB3YWl0cXVldWVfYWN0aXZlKHNrLT5za19zbGVlcCkpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZShzay0+c2tfc2xlZXApOworfQorCisvKgorICogSU5FVCBjYWxsYmFjayB3aGVuIHNwYWNlIGlzIG5ld2x5IGF2YWlsYWJsZSBvbiB0aGUgc29ja2V0LgorICovCitzdGF0aWMgdm9pZAorc3ZjX3dyaXRlX3NwYWNlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3Qgc3ZjX3NvY2sJKnN2c2sgPSAoc3RydWN0IHN2Y19zb2NrICopKHNrLT5za191c2VyX2RhdGEpOworCisJaWYgKHN2c2spIHsKKwkJZHByaW50aygic3ZjOiBzb2NrZXQgJXAoaW5ldCAlcCksIHdyaXRlX3NwYWNlIGJ1c3k9JWRcbiIsCisJCQlzdnNrLCBzaywgdGVzdF9iaXQoU0tfQlVTWSwgJnN2c2stPnNrX2ZsYWdzKSk7CisJCXN2Y19zb2NrX2VucXVldWUoc3Zzayk7CisJfQorCisJaWYgKHNrLT5za19zbGVlcCAmJiB3YWl0cXVldWVfYWN0aXZlKHNrLT5za19zbGVlcCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUlBDIHN2Y193cml0ZV9zcGFjZTogc29tZSBzbGVlcGluZyBvbiAlcFxuIiwKKwkJICAgICAgIHN2c2spOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoc2stPnNrX3NsZWVwKTsKKwl9Cit9CisKKy8qCisgKiBSZWNlaXZlIGEgZGF0YWdyYW0gZnJvbSBhIFVEUCBzb2NrZXQuCisgKi8KK2V4dGVybiBpbnQKK2NzdW1fcGFydGlhbF9jb3B5X3RvX3hkcihzdHJ1Y3QgeGRyX2J1ZiAqeGRyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworc3RhdGljIGludAorc3ZjX3VkcF9yZWN2ZnJvbShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQoreworCXN0cnVjdCBzdmNfc29jawkqc3ZzayA9IHJxc3RwLT5ycV9zb2NrOworCXN0cnVjdCBzdmNfc2Vydgkqc2VydiA9IHN2c2stPnNrX3NlcnZlcjsKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOworCWludAkJZXJyLCBsZW47CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFNLX0NITkdCVUYsICZzdnNrLT5za19mbGFncykpCisJICAgIC8qIHVkcCBzb2NrZXRzIG5lZWQgbGFyZ2UgcmN2YnVmIGFzIGFsbCBwZW5kaW5nCisJICAgICAqIHJlcXVlc3RzIGFyZSBzdGlsbCBpbiB0aGF0IGJ1ZmZlci4gIHNuZGJ1ZiBtdXN0CisJICAgICAqIGFsc28gYmUgbGFyZ2UgZW5vdWdoIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlCisJICAgICAqIGZvciBvbmUgcmVwbHkgcGVyIHRocmVhZC4KKwkgICAgICovCisJICAgIHN2Y19zb2NrX3NldGJ1ZnNpemUoc3Zzay0+c2tfc29jaywKKwkJCQkoc2Vydi0+c3ZfbnJ0aHJlYWRzKzMpICogc2Vydi0+c3ZfYnVmc3osCisJCQkJKHNlcnYtPnN2X25ydGhyZWFkcyszKSAqIHNlcnYtPnN2X2J1ZnN6KTsKKworCWlmICgocnFzdHAtPnJxX2RlZmVycmVkID0gc3ZjX2RlZmVycmVkX2RlcXVldWUoc3ZzaykpKSB7CisJCXN2Y19zb2NrX3JlY2VpdmVkKHN2c2spOworCQlyZXR1cm4gc3ZjX2RlZmVycmVkX3JlY3YocnFzdHApOworCX0KKworCWNsZWFyX2JpdChTS19EQVRBLCAmc3Zzay0+c2tfZmxhZ3MpOworCXdoaWxlICgoc2tiID0gc2tiX3JlY3ZfZGF0YWdyYW0oc3Zzay0+c2tfc2ssIDAsIDEsICZlcnIpKSA9PSBOVUxMKSB7CisJCWlmIChlcnIgPT0gLUVBR0FJTikgeworCQkJc3ZjX3NvY2tfcmVjZWl2ZWQoc3Zzayk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCS8qIHBvc3NpYmx5IGFuIGljbXAgZXJyb3IgKi8KKwkJZHByaW50aygic3ZjOiByZWN2ZnJvbSByZXR1cm5lZCBlcnJvciAlZFxuIiwgLWVycik7CisJfQorCWlmIChza2ItPnN0YW1wLnR2X3NlYyA9PSAwKSB7CisJCXNrYi0+c3RhbXAudHZfc2VjID0geHRpbWUudHZfc2VjOyAKKwkJc2tiLT5zdGFtcC50dl91c2VjID0geHRpbWUudHZfbnNlYyAqIDEwMDA7IAorCQkvKiBEb24ndCBlbmFibGUgbmV0c3RhbXAsIHN1bnJwYyBkb2Vzbid0IAorCQkgICBuZWVkIHRoYXQgbXVjaCBhY2N1cmFjeSAqLworCX0KKwlzdnNrLT5za19zay0+c2tfc3RhbXAgPSBza2ItPnN0YW1wOworCXNldF9iaXQoU0tfREFUQSwgJnN2c2stPnNrX2ZsYWdzKTsgLyogdGhlcmUgbWF5IGJlIG1vcmUgZGF0YS4uLiAqLworCisJLyoKKwkgKiBNYXliZSBtb3JlIHBhY2tldHMgLSBraWNrIGFub3RoZXIgdGhyZWFkIEFTQVAuCisJICovCisJc3ZjX3NvY2tfcmVjZWl2ZWQoc3Zzayk7CisKKwlsZW4gID0gc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisJcnFzdHAtPnJxX2FyZy5sZW4gPSBsZW47CisKKwlycXN0cC0+cnFfcHJvdCAgICAgICAgPSBJUFBST1RPX1VEUDsKKworCS8qIEdldCBzZW5kZXIgYWRkcmVzcyAqLworCXJxc3RwLT5ycV9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXJxc3RwLT5ycV9hZGRyLnNpbl9wb3J0ID0gc2tiLT5oLnVoLT5zb3VyY2U7CisJcnFzdHAtPnJxX2FkZHIuc2luX2FkZHIuc19hZGRyID0gc2tiLT5uaC5pcGgtPnNhZGRyOworCXJxc3RwLT5ycV9kYWRkciA9IHNrYi0+bmguaXBoLT5kYWRkcjsKKworCWlmIChza2JfaXNfbm9ubGluZWFyKHNrYikpIHsKKwkJLyogd2UgaGF2ZSB0byBjb3B5ICovCisJCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwkJaWYgKGNzdW1fcGFydGlhbF9jb3B5X3RvX3hkcigmcnFzdHAtPnJxX2FyZywgc2tiKSkgeworCQkJbG9jYWxfYmhfZW5hYmxlKCk7CisJCQkvKiBjaGVja3N1bSBlcnJvciAqLworCQkJc2tiX2ZyZWVfZGF0YWdyYW0oc3Zzay0+c2tfc2ssIHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlsb2NhbF9iaF9lbmFibGUoKTsKKwkJc2tiX2ZyZWVfZGF0YWdyYW0oc3Zzay0+c2tfc2ssIHNrYik7IAorCX0gZWxzZSB7CisJCS8qIHdlIGNhbiB1c2UgaXQgaW4tcGxhY2UgKi8KKwkJcnFzdHAtPnJxX2FyZy5oZWFkWzBdLmlvdl9iYXNlID0gc2tiLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCQlycXN0cC0+cnFfYXJnLmhlYWRbMF0uaW92X2xlbiA9IGxlbjsKKwkJaWYgKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1VOTkVDRVNTQVJZKSB7CisJCQlpZiAoKHVuc2lnbmVkIHNob3J0KWNzdW1fZm9sZChza2JfY2hlY2tzdW0oc2tiLCAwLCBza2ItPmxlbiwgc2tiLT5jc3VtKSkpIHsKKwkJCQlza2JfZnJlZV9kYXRhZ3JhbShzdnNrLT5za19zaywgc2tiKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCX0KKwkJcnFzdHAtPnJxX3NrYnVmZiA9IHNrYjsKKwl9CisKKwlycXN0cC0+cnFfYXJnLnBhZ2VfYmFzZSA9IDA7CisJaWYgKGxlbiA8PSBycXN0cC0+cnFfYXJnLmhlYWRbMF0uaW92X2xlbikgeworCQlycXN0cC0+cnFfYXJnLmhlYWRbMF0uaW92X2xlbiA9IGxlbjsKKwkJcnFzdHAtPnJxX2FyZy5wYWdlX2xlbiA9IDA7CisJfSBlbHNlIHsKKwkJcnFzdHAtPnJxX2FyZy5wYWdlX2xlbiA9IGxlbiAtIHJxc3RwLT5ycV9hcmcuaGVhZFswXS5pb3ZfbGVuOworCQlycXN0cC0+cnFfYXJndXNlZCArPSAocnFzdHAtPnJxX2FyZy5wYWdlX2xlbiArIFBBR0VfU0laRSAtIDEpLyBQQUdFX1NJWkU7CisJfQorCisJaWYgKHNlcnYtPnN2X3N0YXRzKQorCQlzZXJ2LT5zdl9zdGF0cy0+bmV0dWRwY250Kys7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50CitzdmNfdWRwX3NlbmR0byhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQoreworCWludAkJZXJyb3I7CisKKwllcnJvciA9IHN2Y19zZW5kdG8ocnFzdHAsICZycXN0cC0+cnFfcmVzKTsKKwlpZiAoZXJyb3IgPT0gLUVDT05OUkVGVVNFRCkKKwkJLyogSUNNUCBlcnJvciBvbiBlYXJsaWVyIHJlcXVlc3QuICovCisJCWVycm9yID0gc3ZjX3NlbmR0byhycXN0cCwgJnJxc3RwLT5ycV9yZXMpOworCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZAorc3ZjX3VkcF9pbml0KHN0cnVjdCBzdmNfc29jayAqc3ZzaykKK3sKKwlzdnNrLT5za19zay0+c2tfZGF0YV9yZWFkeSA9IHN2Y191ZHBfZGF0YV9yZWFkeTsKKwlzdnNrLT5za19zay0+c2tfd3JpdGVfc3BhY2UgPSBzdmNfd3JpdGVfc3BhY2U7CisJc3Zzay0+c2tfcmVjdmZyb20gPSBzdmNfdWRwX3JlY3Zmcm9tOworCXN2c2stPnNrX3NlbmR0byA9IHN2Y191ZHBfc2VuZHRvOworCisJLyogaW5pdGlhbGlzZSBzZXR0aW5nIG11c3QgaGF2ZSBlbm91Z2ggc3BhY2UgdG8KKwkgKiByZWNlaXZlIGFuZCByZXNwb25kIHRvIG9uZSByZXF1ZXN0LiAgCisJICogc3ZjX3VkcF9yZWN2ZnJvbSB3aWxsIHJlLWFkanVzdCBpZiBuZWNlc3NhcnkKKwkgKi8KKwlzdmNfc29ja19zZXRidWZzaXplKHN2c2stPnNrX3NvY2ssCisJCQkgICAgMyAqIHN2c2stPnNrX3NlcnZlci0+c3ZfYnVmc3osCisJCQkgICAgMyAqIHN2c2stPnNrX3NlcnZlci0+c3ZfYnVmc3opOworCisJc2V0X2JpdChTS19EQVRBLCAmc3Zzay0+c2tfZmxhZ3MpOyAvKiBtaWdodCBoYXZlIGNvbWUgaW4gYmVmb3JlIGRhdGFfcmVhZHkgc2V0IHVwICovCisJc2V0X2JpdChTS19DSE5HQlVGLCAmc3Zzay0+c2tfZmxhZ3MpOworfQorCisvKgorICogQSBkYXRhX3JlYWR5IGV2ZW50IG9uIGEgbGlzdGVuaW5nIHNvY2tldCBtZWFucyB0aGVyZSdzIGEgY29ubmVjdGlvbgorICogcGVuZGluZy4gRG8gbm90IHVzZSBzdGF0ZV9jaGFuZ2UgYXMgYSBzdWJzdGl0dXRlIGZvciBpdC4KKyAqLworc3RhdGljIHZvaWQKK3N2Y190Y3BfbGlzdGVuX2RhdGFfcmVhZHkoc3RydWN0IHNvY2sgKnNrLCBpbnQgY291bnRfdW51c2VkKQoreworCXN0cnVjdCBzdmNfc29jawkqc3ZzazsKKworCWRwcmludGsoInN2Yzogc29ja2V0ICVwIFRDUCAobGlzdGVuKSBzdGF0ZSBjaGFuZ2UgJWRcbiIsCisJCQlzaywgc2stPnNrX3N0YXRlKTsKKworCWlmICAoc2stPnNrX3N0YXRlICE9IFRDUF9MSVNURU4pIHsKKwkJLyoKKwkJICogVGhpcyBjYWxsYmFjayBtYXkgY2FsbGVkIHR3aWNlIHdoZW4gYSBuZXcgY29ubmVjdGlvbgorCQkgKiBpcyBlc3RhYmxpc2hlZCBhcyBhIGNoaWxkIHNvY2tldCBpbmhlcml0cyBldmVyeXRoaW5nCisJCSAqIGZyb20gYSBwYXJlbnQgTElTVEVOIHNvY2tldC4KKwkJICogMSkgZGF0YV9yZWFkeSBtZXRob2Qgb2YgdGhlIHBhcmVudCBzb2NrZXQgd2lsbCBiZSBjYWxsZWQKKwkJICogICAgd2hlbiBvbmUgb2YgY2hpbGQgc29ja2V0cyBiZWNvbWUgRVNUQUJMSVNIRUQuCisJCSAqIDIpIGRhdGFfcmVhZHkgbWV0aG9kIG9mIHRoZSBjaGlsZCBzb2NrZXQgbWF5IGJlIGNhbGxlZAorCQkgKiAgICB3aGVuIGl0IHJlY2VpdmVzIGRhdGEgYmVmb3JlIHRoZSBzb2NrZXQgaXMgYWNjZXB0ZWQuCisJCSAqIEluIGNhc2Ugb2YgMiwgd2Ugc2hvdWxkIGlnbm9yZSBpdCBzaWxlbnRseS4KKwkJICovCisJCWdvdG8gb3V0OworCX0KKwlpZiAoIShzdnNrID0gKHN0cnVjdCBzdmNfc29jayAqKSBzay0+c2tfdXNlcl9kYXRhKSkgeworCQlwcmludGsoInN2Yzogc29ja2V0ICVwOiBubyB1c2VyIGRhdGFcbiIsIHNrKTsKKwkJZ290byBvdXQ7CisJfQorCXNldF9iaXQoU0tfQ09OTiwgJnN2c2stPnNrX2ZsYWdzKTsKKwlzdmNfc29ja19lbnF1ZXVlKHN2c2spOworIG91dDoKKwlpZiAoc2stPnNrX3NsZWVwICYmIHdhaXRxdWV1ZV9hY3RpdmUoc2stPnNrX3NsZWVwKSkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbChzay0+c2tfc2xlZXApOworfQorCisvKgorICogQSBzdGF0ZSBjaGFuZ2Ugb24gYSBjb25uZWN0ZWQgc29ja2V0IG1lYW5zIGl0J3MgZHlpbmcgb3IgZGVhZC4KKyAqLworc3RhdGljIHZvaWQKK3N2Y190Y3Bfc3RhdGVfY2hhbmdlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3Qgc3ZjX3NvY2sJKnN2c2s7CisKKwlkcHJpbnRrKCJzdmM6IHNvY2tldCAlcCBUQ1AgKGNvbm5lY3RlZCkgc3RhdGUgY2hhbmdlICVkIChzdnNrICVwKVxuIiwKKwkJCXNrLCBzay0+c2tfc3RhdGUsIHNrLT5za191c2VyX2RhdGEpOworCisJaWYgKCEoc3ZzayA9IChzdHJ1Y3Qgc3ZjX3NvY2sgKikgc2stPnNrX3VzZXJfZGF0YSkpIHsKKwkJcHJpbnRrKCJzdmM6IHNvY2tldCAlcDogbm8gdXNlciBkYXRhXG4iLCBzayk7CisJCWdvdG8gb3V0OworCX0KKwlzZXRfYml0KFNLX0NMT1NFLCAmc3Zzay0+c2tfZmxhZ3MpOworCXN2Y19zb2NrX2VucXVldWUoc3Zzayk7Cisgb3V0OgorCWlmIChzay0+c2tfc2xlZXAgJiYgd2FpdHF1ZXVlX2FjdGl2ZShzay0+c2tfc2xlZXApKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKHNrLT5za19zbGVlcCk7Cit9CisKK3N0YXRpYyB2b2lkCitzdmNfdGNwX2RhdGFfcmVhZHkoc3RydWN0IHNvY2sgKnNrLCBpbnQgY291bnQpCit7CisJc3RydWN0IHN2Y19zb2NrICoJc3ZzazsKKworCWRwcmludGsoInN2Yzogc29ja2V0ICVwIFRDUCBkYXRhIHJlYWR5IChzdnNrICVwKVxuIiwKKwkJCXNrLCBzay0+c2tfdXNlcl9kYXRhKTsKKwlpZiAoIShzdnNrID0gKHN0cnVjdCBzdmNfc29jayAqKShzay0+c2tfdXNlcl9kYXRhKSkpCisJCWdvdG8gb3V0OworCXNldF9iaXQoU0tfREFUQSwgJnN2c2stPnNrX2ZsYWdzKTsKKwlzdmNfc29ja19lbnF1ZXVlKHN2c2spOworIG91dDoKKwlpZiAoc2stPnNrX3NsZWVwICYmIHdhaXRxdWV1ZV9hY3RpdmUoc2stPnNrX3NsZWVwKSkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHNrLT5za19zbGVlcCk7Cit9CisKKy8qCisgKiBBY2NlcHQgYSBUQ1AgY29ubmVjdGlvbgorICovCitzdGF0aWMgdm9pZAorc3ZjX3RjcF9hY2NlcHQoc3RydWN0IHN2Y19zb2NrICpzdnNrKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisJc3RydWN0IHN2Y19zZXJ2CSpzZXJ2ID0gc3Zzay0+c2tfc2VydmVyOworCXN0cnVjdCBzb2NrZXQJKnNvY2sgPSBzdnNrLT5za19zb2NrOworCXN0cnVjdCBzb2NrZXQJKm5ld3NvY2s7CisJc3RydWN0IHByb3RvX29wcyAqb3BzOworCXN0cnVjdCBzdmNfc29jawkqbmV3c3ZzazsKKwlpbnQJCWVyciwgc2xlbjsKKworCWRwcmludGsoInN2YzogdGNwX2FjY2VwdCAlcCBzb2NrICVwXG4iLCBzdnNrLCBzb2NrKTsKKwlpZiAoIXNvY2spCisJCXJldHVybjsKKworCWVyciA9IHNvY2tfY3JlYXRlX2xpdGUoUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQLCAmbmV3c29jayk7CisJaWYgKGVycikgeworCQlpZiAoZXJyID09IC1FTk9NRU0pCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbm8gbW9yZSBzb2NrZXRzIVxuIiwKKwkJCSAgICAgICBzZXJ2LT5zdl9uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWRwcmludGsoInN2YzogdGNwX2FjY2VwdCAlcCBhbGxvY2F0ZWRcbiIsIG5ld3NvY2spOworCW5ld3NvY2stPm9wcyA9IG9wcyA9IHNvY2stPm9wczsKKworCWNsZWFyX2JpdChTS19DT05OLCAmc3Zzay0+c2tfZmxhZ3MpOworCWlmICgoZXJyID0gb3BzLT5hY2NlcHQoc29jaywgbmV3c29jaywgT19OT05CTE9DSykpIDwgMCkgeworCQlpZiAoZXJyICE9IC1FQUdBSU4gJiYgbmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGFjY2VwdCBmYWlsZWQgKGVyciAlZCkhXG4iLAorCQkJCSAgIHNlcnYtPnN2X25hbWUsIC1lcnIpOworCQlnb3RvIGZhaWxlZDsJCS8qIGFib3J0ZWQgY29ubmVjdGlvbiBvciB3aGF0ZXZlciAqLworCX0KKwlzZXRfYml0KFNLX0NPTk4sICZzdnNrLT5za19mbGFncyk7CisJc3ZjX3NvY2tfZW5xdWV1ZShzdnNrKTsKKworCXNsZW4gPSBzaXplb2Yoc2luKTsKKwllcnIgPSBvcHMtPmdldG5hbWUobmV3c29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2luLCAmc2xlbiwgMSk7CisJaWYgKGVyciA8IDApIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBwZWVybmFtZSBmYWlsZWQgKGVyciAlZCkhXG4iLAorCQkJCSAgIHNlcnYtPnN2X25hbWUsIC1lcnIpOworCQlnb3RvIGZhaWxlZDsJCS8qIGFib3J0ZWQgY29ubmVjdGlvbiBvciB3aGF0ZXZlciAqLworCX0KKworCS8qIElkZWFsbHksIHdlIHdvdWxkIHdhbnQgdG8gcmVqZWN0IGNvbm5lY3Rpb25zIGZyb20gdW5hdXRob3JpemVkCisJICogaG9zdHMgaGVyZSwgYnV0IHdoZW4gd2UgZ2V0IGVuY3JpcHRpb24sIHRoZSBJUCBvZiB0aGUgaG9zdCB3b24ndAorCSAqIHRlbGwgdXMgYW55dGhpbmcuIEZvciBub3cganVzdCB3YXJuIGFib3V0IHVucHJpdiBjb25uZWN0aW9ucy4KKwkgKi8KKwlpZiAobnRvaHMoc2luLnNpbl9wb3J0KSA+PSAxMDI0KSB7CisJCWRwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiJXM6IGNvbm5lY3QgZnJvbSB1bnByaXZpbGVnZWQgcG9ydDogJXUuJXUuJXUuJXU6JWRcbiIsCisJCQlzZXJ2LT5zdl9uYW1lLCAKKwkJCU5JUFFVQUQoc2luLnNpbl9hZGRyLnNfYWRkciksIG50b2hzKHNpbi5zaW5fcG9ydCkpOworCX0KKworCWRwcmludGsoIiVzOiBjb25uZWN0IGZyb20gJXUuJXUuJXUuJXU6JTA0eFxuIiwgc2Vydi0+c3ZfbmFtZSwKKwkJCU5JUFFVQUQoc2luLnNpbl9hZGRyLnNfYWRkciksIG50b2hzKHNpbi5zaW5fcG9ydCkpOworCisJLyogbWFrZSBzdXJlIHRoYXQgYSB3cml0ZSBkb2Vzbid0IGJsb2NrIGZvcmV2ZXIgd2hlbgorCSAqIGxvdyBvbiBtZW1vcnkKKwkgKi8KKwluZXdzb2NrLT5zay0+c2tfc25kdGltZW8gPSBIWiozMDsKKworCWlmICghKG5ld3N2c2sgPSBzdmNfc2V0dXBfc29ja2V0KHNlcnYsIG5ld3NvY2ssICZlcnIsIDApKSkKKwkJZ290byBmYWlsZWQ7CisKKworCS8qIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgdG9vIG1hbnkgYWN0aXZlIGNvbm5lY3Rpb25zLgorCSAqIElmIHdlIGhhdmUsIHNvbWV0aGluZyBtdXN0IGJlIGRyb3BwZWQuCisJICoKKwkgKiBUaGVyZSdzIG5vIHBvaW50IGluIHRyeWluZyB0byBkbyByYW5kb20gZHJvcCBoZXJlIGZvcgorCSAqIERvUyBwcmV2ZW50aW9uLiBUaGUgTkZTIGNsaWVudHMgZG9lcyAxIHJlY29ubmVjdCBpbiAxNQorCSAqIHNlY29uZHMuIEFuIGF0dGFja2VyIGNhbiBlYXNpbHkgYmVhdCB0aGF0LgorCSAqCisJICogVGhlIG9ubHkgc29tZXdoYXQgZWZmaWNpZW50IG1lY2hhbmlzbSB3b3VsZCBiZSBpZiBkcm9wCisJICogb2xkIGNvbm5lY3Rpb25zIGZyb20gdGhlIHNhbWUgSVAgZmlyc3QuIEJ1dCByaWdodCBub3cKKwkgKiB3ZSBkb24ndCBldmVuIHJlY29yZCB0aGUgY2xpZW50IElQIGluIHN2Y19zb2NrLgorCSAqLworCWlmIChzZXJ2LT5zdl90bXBjbnQgPiAoc2Vydi0+c3ZfbnJ0aHJlYWRzKzMpKjIwKSB7CisJCXN0cnVjdCBzdmNfc29jayAqc3ZzayA9IE5VTEw7CisJCXNwaW5fbG9ja19iaCgmc2Vydi0+c3ZfbG9jayk7CisJCWlmICghbGlzdF9lbXB0eSgmc2Vydi0+c3ZfdGVtcHNvY2tzKSkgeworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJCS8qIFRyeSB0byBoZWxwIHRoZSBhZG1pbiAqLworCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHRvbyBtYW55IG9wZW4gVENQICIKKwkJCQkJInNvY2tldHMsIGNvbnNpZGVyIGluY3JlYXNpbmcgdGhlICIKKwkJCQkJIm51bWJlciBvZiBuZnNkIHRocmVhZHNcbiIsCisJCQkJCQkgICBzZXJ2LT5zdl9uYW1lKTsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBsYXN0IFRDUCBjb25uZWN0IGZyb20gIgorCQkJCQkiJXUuJXUuJXUuJXU6JWRcbiIsCisJCQkJCXNlcnYtPnN2X25hbWUsCisJCQkJCU5JUFFVQUQoc2luLnNpbl9hZGRyLnNfYWRkciksCisJCQkJCW50b2hzKHNpbi5zaW5fcG9ydCkpOworCQkJfQorCQkJLyoKKwkJCSAqIEFsd2F5cyBzZWxlY3QgdGhlIG9sZGVzdCBzb2NrZXQuIEl0J3Mgbm90IGZhaXIsCisJCQkgKiBidXQgc28gaXMgbGlmZQorCQkJICovCisJCQlzdnNrID0gbGlzdF9lbnRyeShzZXJ2LT5zdl90ZW1wc29ja3MucHJldiwKKwkJCQkJICBzdHJ1Y3Qgc3ZjX3NvY2ssCisJCQkJCSAgc2tfbGlzdCk7CisJCQlzZXRfYml0KFNLX0NMT1NFLCAmc3Zzay0+c2tfZmxhZ3MpOworCQkJc3Zzay0+c2tfaW51c2UgKys7CisJCX0KKwkJc3Bpbl91bmxvY2tfYmgoJnNlcnYtPnN2X2xvY2spOworCisJCWlmIChzdnNrKSB7CisJCQlzdmNfc29ja19lbnF1ZXVlKHN2c2spOworCQkJc3ZjX3NvY2tfcHV0KHN2c2spOworCQl9CisKKwl9CisKKwlpZiAoc2Vydi0+c3Zfc3RhdHMpCisJCXNlcnYtPnN2X3N0YXRzLT5uZXR0Y3Bjb25uKys7CisKKwlyZXR1cm47CisKK2ZhaWxlZDoKKwlzb2NrX3JlbGVhc2UobmV3c29jayk7CisJcmV0dXJuOworfQorCisvKgorICogUmVjZWl2ZSBkYXRhIGZyb20gYSBUQ1Agc29ja2V0LgorICovCitzdGF0aWMgaW50CitzdmNfdGNwX3JlY3Zmcm9tKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCit7CisJc3RydWN0IHN2Y19zb2NrCSpzdnNrID0gcnFzdHAtPnJxX3NvY2s7CisJc3RydWN0IHN2Y19zZXJ2CSpzZXJ2ID0gc3Zzay0+c2tfc2VydmVyOworCWludAkJbGVuOworCXN0cnVjdCBrdmVjIHZlY1tSUENTVkNfTUFYUEFHRVNdOworCWludCBwbnVtLCB2bGVuOworCisJZHByaW50aygic3ZjOiB0Y3BfcmVjdiAlcCBkYXRhICVkIGNvbm4gJWQgY2xvc2UgJWRcbiIsCisJCXN2c2ssIHRlc3RfYml0KFNLX0RBVEEsICZzdnNrLT5za19mbGFncyksCisJCXRlc3RfYml0KFNLX0NPTk4sICZzdnNrLT5za19mbGFncyksCisJCXRlc3RfYml0KFNLX0NMT1NFLCAmc3Zzay0+c2tfZmxhZ3MpKTsKKworCWlmICgocnFzdHAtPnJxX2RlZmVycmVkID0gc3ZjX2RlZmVycmVkX2RlcXVldWUoc3ZzaykpKSB7CisJCXN2Y19zb2NrX3JlY2VpdmVkKHN2c2spOworCQlyZXR1cm4gc3ZjX2RlZmVycmVkX3JlY3YocnFzdHApOworCX0KKworCWlmICh0ZXN0X2JpdChTS19DTE9TRSwgJnN2c2stPnNrX2ZsYWdzKSkgeworCQlzdmNfZGVsZXRlX3NvY2tldChzdnNrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHRlc3RfYml0KFNLX0NPTk4sICZzdnNrLT5za19mbGFncykpIHsKKwkJc3ZjX3RjcF9hY2NlcHQoc3Zzayk7CisJCXN2Y19zb2NrX3JlY2VpdmVkKHN2c2spOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFNLX0NITkdCVUYsICZzdnNrLT5za19mbGFncykpCisJCS8qIHNuZGJ1ZiBuZWVkcyB0byBoYXZlIHJvb20gZm9yIG9uZSByZXF1ZXN0CisJCSAqIHBlciB0aHJlYWQsIG90aGVyd2lzZSB3ZSBjYW4gc3RhbGwgZXZlbiB3aGVuIHRoZQorCQkgKiBuZXR3b3JrIGlzbid0IGEgYm90dGxlbmVjay4KKwkJICogcmN2YnVmIGp1c3QgbmVlZHMgdG8gYmUgYWJsZSB0byBob2xkIGEgZmV3IHJlcXVlc3RzLgorCQkgKiBOb3JtYWxseSB0aGV5IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSAKKwkJICogYXMgc29vbiBhIGEgY29tcGxldGUgcmVxdWVzdCBhcnJpdmVzLgorCQkgKi8KKwkJc3ZjX3NvY2tfc2V0YnVmc2l6ZShzdnNrLT5za19zb2NrLAorCQkJCSAgICAoc2Vydi0+c3ZfbnJ0aHJlYWRzKzMpICogc2Vydi0+c3ZfYnVmc3osCisJCQkJICAgIDMgKiBzZXJ2LT5zdl9idWZzeik7CisKKwljbGVhcl9iaXQoU0tfREFUQSwgJnN2c2stPnNrX2ZsYWdzKTsKKworCS8qIFJlY2VpdmUgZGF0YS4gSWYgd2UgaGF2ZW4ndCBnb3QgdGhlIHJlY29yZCBsZW5ndGggeWV0LCBnZXQKKwkgKiB0aGUgbmV4dCBmb3VyIGJ5dGVzLiBPdGhlcndpc2UgdHJ5IHRvIGdvYmJsZSB1cCBhcyBtdWNoIGFzCisJICogcG9zc2libGUgdXAgdG8gdGhlIGNvbXBsZXRlIHJlY29yZCBsZW5ndGguCisJICovCisJaWYgKHN2c2stPnNrX3RjcGxlbiA8IDQpIHsKKwkJdW5zaWduZWQgbG9uZwl3YW50ID0gNCAtIHN2c2stPnNrX3RjcGxlbjsKKwkJc3RydWN0IGt2ZWMJaW92OworCisJCWlvdi5pb3ZfYmFzZSA9ICgoY2hhciAqKSAmc3Zzay0+c2tfcmVjbGVuKSArIHN2c2stPnNrX3RjcGxlbjsKKwkJaW92Lmlvdl9sZW4gID0gd2FudDsKKwkJaWYgKChsZW4gPSBzdmNfcmVjdmZyb20ocnFzdHAsICZpb3YsIDEsIHdhbnQpKSA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdnNrLT5za190Y3BsZW4gKz0gbGVuOworCisJCWlmIChsZW4gPCB3YW50KSB7CisJCQlkcHJpbnRrKCJzdmM6IHNob3J0IHJlY3Zmcm9tIHdoaWxlIHJlYWRpbmcgcmVjb3JkIGxlbmd0aCAoJWQgb2YgJWx1KVxuIiwKKwkJCSAgICAgICAgbGVuLCB3YW50KTsKKwkJCXN2Y19zb2NrX3JlY2VpdmVkKHN2c2spOworCQkJcmV0dXJuIC1FQUdBSU47IC8qIHJlY29yZCBoZWFkZXIgbm90IGNvbXBsZXRlICovCisJCX0KKworCQlzdnNrLT5za19yZWNsZW4gPSBudG9obChzdnNrLT5za19yZWNsZW4pOworCQlpZiAoIShzdnNrLT5za19yZWNsZW4gJiAweDgwMDAwMDAwKSkgeworCQkJLyogRklYTUU6IHRlY2huaWNhbGx5LCBhIHJlY29yZCBjYW4gYmUgZnJhZ21lbnRlZCwKKwkJCSAqICBhbmQgbm9uLXRlcm1pbmFsIGZyYWdtZW50cyB3aWxsIG5vdCBoYXZlIHRoZSB0b3AKKwkJCSAqICBiaXQgc2V0IGluIHRoZSBmcmFnbWVudCBsZW5ndGggaGVhZGVyLgorCQkJICogIEJ1dCBhcHBhcmVudGx5IG5vIGtub3duIG5mcyBjbGllbnRzIHNlbmQgZnJhZ21lbnRlZAorCQkJICogIHJlY29yZHMuICovCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIlJQQzogYmFkIFRDUCByZWNsZW4gMHglMDhseCAobm9uLXRlcm1pbmFsKVxuIiwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZykgc3Zzay0+c2tfcmVjbGVuKTsKKwkJCWdvdG8gZXJyX2RlbGV0ZTsKKwkJfQorCQlzdnNrLT5za19yZWNsZW4gJj0gMHg3ZmZmZmZmZjsKKwkJZHByaW50aygic3ZjOiBUQ1AgcmVjb3JkLCAlZCBieXRlc1xuIiwgc3Zzay0+c2tfcmVjbGVuKTsKKwkJaWYgKHN2c2stPnNrX3JlY2xlbiA+IHNlcnYtPnN2X2J1ZnN6KSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIlJQQzogYmFkIFRDUCByZWNsZW4gMHglMDhseCAobGFyZ2UpXG4iLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBzdnNrLT5za19yZWNsZW4pOworCQkJZ290byBlcnJfZGVsZXRlOworCQl9CisJfQorCisJLyogQ2hlY2sgd2hldGhlciBlbm91Z2ggZGF0YSBpcyBhdmFpbGFibGUgKi8KKwlsZW4gPSBzdmNfcmVjdl9hdmFpbGFibGUoc3Zzayk7CisJaWYgKGxlbiA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlpZiAobGVuIDwgc3Zzay0+c2tfcmVjbGVuKSB7CisJCWRwcmludGsoInN2YzogaW5jb21wbGV0ZSBUQ1AgcmVjb3JkICglZCBvZiAlZClcbiIsCisJCQlsZW4sIHN2c2stPnNrX3JlY2xlbik7CisJCXN2Y19zb2NrX3JlY2VpdmVkKHN2c2spOworCQlyZXR1cm4gLUVBR0FJTjsJLyogcmVjb3JkIG5vdCBjb21wbGV0ZSAqLworCX0KKwlsZW4gPSBzdnNrLT5za19yZWNsZW47CisJc2V0X2JpdChTS19EQVRBLCAmc3Zzay0+c2tfZmxhZ3MpOworCisJdmVjWzBdID0gcnFzdHAtPnJxX2FyZy5oZWFkWzBdOworCXZsZW4gPSBQQUdFX1NJWkU7CisJcG51bSA9IDE7CisJd2hpbGUgKHZsZW4gPCBsZW4pIHsKKwkJdmVjW3BudW1dLmlvdl9iYXNlID0gcGFnZV9hZGRyZXNzKHJxc3RwLT5ycV9hcmdwYWdlc1tycXN0cC0+cnFfYXJndXNlZCsrXSk7CisJCXZlY1twbnVtXS5pb3ZfbGVuID0gUEFHRV9TSVpFOworCQlwbnVtKys7CisJCXZsZW4gKz0gUEFHRV9TSVpFOworCX0KKworCS8qIE5vdyByZWNlaXZlIGRhdGEgKi8KKwlsZW4gPSBzdmNfcmVjdmZyb20ocnFzdHAsIHZlYywgcG51bSwgbGVuKTsKKwlpZiAobGVuIDwgMCkKKwkJZ290byBlcnJvcjsKKworCWRwcmludGsoInN2YzogVENQIGNvbXBsZXRlIHJlY29yZCAoJWQgYnl0ZXMpXG4iLCBsZW4pOworCXJxc3RwLT5ycV9hcmcubGVuID0gbGVuOworCXJxc3RwLT5ycV9hcmcucGFnZV9iYXNlID0gMDsKKwlpZiAobGVuIDw9IHJxc3RwLT5ycV9hcmcuaGVhZFswXS5pb3ZfbGVuKSB7CisJCXJxc3RwLT5ycV9hcmcuaGVhZFswXS5pb3ZfbGVuID0gbGVuOworCQlycXN0cC0+cnFfYXJnLnBhZ2VfbGVuID0gMDsKKwl9IGVsc2UgeworCQlycXN0cC0+cnFfYXJnLnBhZ2VfbGVuID0gbGVuIC0gcnFzdHAtPnJxX2FyZy5oZWFkWzBdLmlvdl9sZW47CisJfQorCisJcnFzdHAtPnJxX3NrYnVmZiAgICAgID0gTlVMTDsKKwlycXN0cC0+cnFfcHJvdAkgICAgICA9IElQUFJPVE9fVENQOworCisJLyogUmVzZXQgVENQIHJlYWQgaW5mbyAqLworCXN2c2stPnNrX3JlY2xlbiA9IDA7CisJc3Zzay0+c2tfdGNwbGVuID0gMDsKKworCXN2Y19zb2NrX3JlY2VpdmVkKHN2c2spOworCWlmIChzZXJ2LT5zdl9zdGF0cykKKwkJc2Vydi0+c3Zfc3RhdHMtPm5ldHRjcGNudCsrOworCisJcmV0dXJuIGxlbjsKKworIGVycl9kZWxldGU6CisJc3ZjX2RlbGV0ZV9zb2NrZXQoc3Zzayk7CisJcmV0dXJuIC1FQUdBSU47CisKKyBlcnJvcjoKKwlpZiAobGVuID09IC1FQUdBSU4pIHsKKwkJZHByaW50aygiUlBDOiBUQ1AgcmVjdmZyb20gZ290IEVBR0FJTlxuIik7CisJCXN2Y19zb2NrX3JlY2VpdmVkKHN2c2spOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHJlY3Zmcm9tIHJldHVybmVkIGVycm5vICVkXG4iLAorCQkJCQlzdnNrLT5za19zZXJ2ZXItPnN2X25hbWUsIC1sZW4pOworCQlzdmNfc29ja19yZWNlaXZlZChzdnNrKTsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCisvKgorICogU2VuZCBvdXQgZGF0YSBvbiBUQ1Agc29ja2V0LgorICovCitzdGF0aWMgaW50CitzdmNfdGNwX3NlbmR0byhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQoreworCXN0cnVjdCB4ZHJfYnVmCSp4YnVmcCA9ICZycXN0cC0+cnFfcmVzOworCWludCBzZW50OworCXUzMiByZWNsZW47CisKKwkvKiBTZXQgdXAgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHJlcGx5IGt2ZWMuCisJICogQW55IG90aGVyIGt2ZWNzIHRoYXQgbWF5IGJlIGluIHVzZSBoYXZlIGJlZW4gdGFrZW4KKwkgKiBjYXJlIG9mIGJ5IHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gaXRzZWxmLgorCSAqLworCXJlY2xlbiA9IGh0b25sKDB4ODAwMDAwMDB8KCh4YnVmcC0+bGVuICkgLSA0KSk7CisJbWVtY3B5KHhidWZwLT5oZWFkWzBdLmlvdl9iYXNlLCAmcmVjbGVuLCA0KTsKKworCWlmICh0ZXN0X2JpdChTS19ERUFELCAmcnFzdHAtPnJxX3NvY2stPnNrX2ZsYWdzKSkKKwkJcmV0dXJuIC1FTk9UQ09OTjsKKworCXNlbnQgPSBzdmNfc2VuZHRvKHJxc3RwLCAmcnFzdHAtPnJxX3Jlcyk7CisJaWYgKHNlbnQgIT0geGJ1ZnAtPmxlbikgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgInJwYy1zcnYvdGNwOiAlczogJXMgJWQgd2hlbiBzZW5kaW5nICVkIGJ5dGVzIC0gc2h1dHRpbmcgZG93biBzb2NrZXRcbiIsCisJCSAgICAgICBycXN0cC0+cnFfc29jay0+c2tfc2VydmVyLT5zdl9uYW1lLAorCQkgICAgICAgKHNlbnQ8MCk/ImdvdCBlcnJvciI6InNlbnQgb25seSIsCisJCSAgICAgICBzZW50LCB4YnVmcC0+bGVuKTsKKwkJc3ZjX2RlbGV0ZV9zb2NrZXQocnFzdHAtPnJxX3NvY2spOworCQlzZW50ID0gLUVBR0FJTjsKKwl9CisJcmV0dXJuIHNlbnQ7Cit9CisKK3N0YXRpYyB2b2lkCitzdmNfdGNwX2luaXQoc3RydWN0IHN2Y19zb2NrICpzdnNrKQoreworCXN0cnVjdCBzb2NrCSpzayA9IHN2c2stPnNrX3NrOworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJc3Zzay0+c2tfcmVjdmZyb20gPSBzdmNfdGNwX3JlY3Zmcm9tOworCXN2c2stPnNrX3NlbmR0byA9IHN2Y190Y3Bfc2VuZHRvOworCisJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOKSB7CisJCWRwcmludGsoInNldHRpbmcgdXAgVENQIHNvY2tldCBmb3IgbGlzdGVuaW5nXG4iKTsKKwkJc2stPnNrX2RhdGFfcmVhZHkgPSBzdmNfdGNwX2xpc3Rlbl9kYXRhX3JlYWR5OworCQlzZXRfYml0KFNLX0NPTk4sICZzdnNrLT5za19mbGFncyk7CisJfSBlbHNlIHsKKwkJZHByaW50aygic2V0dGluZyB1cCBUQ1Agc29ja2V0IGZvciByZWFkaW5nXG4iKTsKKwkJc2stPnNrX3N0YXRlX2NoYW5nZSA9IHN2Y190Y3Bfc3RhdGVfY2hhbmdlOworCQlzay0+c2tfZGF0YV9yZWFkeSA9IHN2Y190Y3BfZGF0YV9yZWFkeTsKKwkJc2stPnNrX3dyaXRlX3NwYWNlID0gc3ZjX3dyaXRlX3NwYWNlOworCisJCXN2c2stPnNrX3JlY2xlbiA9IDA7CisJCXN2c2stPnNrX3RjcGxlbiA9IDA7CisKKwkJdHAtPm5vbmFnbGUgPSAxOyAgICAgICAgLyogZGlzYWJsZSBOYWdsZSdzIGFsZ29yaXRobSAqLworCisJCS8qIGluaXRpYWxpc2Ugc2V0dGluZyBtdXN0IGhhdmUgZW5vdWdoIHNwYWNlIHRvCisJCSAqIHJlY2VpdmUgYW5kIHJlc3BvbmQgdG8gb25lIHJlcXVlc3QuICAKKwkJICogc3ZjX3RjcF9yZWN2ZnJvbSB3aWxsIHJlLWFkanVzdCBpZiBuZWNlc3NhcnkKKwkJICovCisJCXN2Y19zb2NrX3NldGJ1ZnNpemUoc3Zzay0+c2tfc29jaywKKwkJCQkgICAgMyAqIHN2c2stPnNrX3NlcnZlci0+c3ZfYnVmc3osCisJCQkJICAgIDMgKiBzdnNrLT5za19zZXJ2ZXItPnN2X2J1ZnN6KTsKKworCQlzZXRfYml0KFNLX0NITkdCVUYsICZzdnNrLT5za19mbGFncyk7CisJCXNldF9iaXQoU0tfREFUQSwgJnN2c2stPnNrX2ZsYWdzKTsKKwkJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfRVNUQUJMSVNIRUQpIAorCQkJc2V0X2JpdChTS19DTE9TRSwgJnN2c2stPnNrX2ZsYWdzKTsKKwl9Cit9CisKK3ZvaWQKK3N2Y19zb2NrX3VwZGF0ZV9idWZzKHN0cnVjdCBzdmNfc2VydiAqc2VydikKK3sKKwkvKgorCSAqIFRoZSBudW1iZXIgb2Ygc2VydmVyIHRocmVhZHMgaGFzIGNoYW5nZWQuIFVwZGF0ZQorCSAqIHJjdmJ1ZiBhbmQgc25kYnVmIGFjY29yZGluZ2x5IG9uIGFsbCBzb2NrZXRzCisJICovCisJc3RydWN0IGxpc3RfaGVhZCAqbGU7CisKKwlzcGluX2xvY2tfYmgoJnNlcnYtPnN2X2xvY2spOworCWxpc3RfZm9yX2VhY2gobGUsICZzZXJ2LT5zdl9wZXJtc29ja3MpIHsKKwkJc3RydWN0IHN2Y19zb2NrICpzdnNrID0gCisJCQlsaXN0X2VudHJ5KGxlLCBzdHJ1Y3Qgc3ZjX3NvY2ssIHNrX2xpc3QpOworCQlzZXRfYml0KFNLX0NITkdCVUYsICZzdnNrLT5za19mbGFncyk7CisJfQorCWxpc3RfZm9yX2VhY2gobGUsICZzZXJ2LT5zdl90ZW1wc29ja3MpIHsKKwkJc3RydWN0IHN2Y19zb2NrICpzdnNrID0KKwkJCWxpc3RfZW50cnkobGUsIHN0cnVjdCBzdmNfc29jaywgc2tfbGlzdCk7CisJCXNldF9iaXQoU0tfQ0hOR0JVRiwgJnN2c2stPnNrX2ZsYWdzKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnNlcnYtPnN2X2xvY2spOworfQorCisvKgorICogUmVjZWl2ZSB0aGUgbmV4dCByZXF1ZXN0IG9uIGFueSBzb2NrZXQuCisgKi8KK2ludAorc3ZjX3JlY3Yoc3RydWN0IHN2Y19zZXJ2ICpzZXJ2LCBzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBsb25nIHRpbWVvdXQpCit7CisJc3RydWN0IHN2Y19zb2NrCQkqc3ZzayA9TlVMTDsKKwlpbnQJCQlsZW47CisJaW50IAkJCXBhZ2VzOworCXN0cnVjdCB4ZHJfYnVmCQkqYXJnOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJZHByaW50aygic3ZjOiBzZXJ2ZXIgJXAgd2FpdGluZyBmb3IgZGF0YSAodG8gPSAlbGQpXG4iLAorCQlycXN0cCwgdGltZW91dCk7CisKKwlpZiAocnFzdHAtPnJxX3NvY2spCisJCXByaW50ayhLRVJOX0VSUiAKKwkJCSJzdmNfcmVjdjogc2VydmljZSAlcCwgc29ja2V0IG5vdCBOVUxMIVxuIiwKKwkJCSBycXN0cCk7CisJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnJxc3RwLT5ycV93YWl0KSkKKwkJcHJpbnRrKEtFUk5fRVJSIAorCQkJInN2Y19yZWN2OiBzZXJ2aWNlICVwLCB3YWl0IHF1ZXVlIGFjdGl2ZSFcbiIsCisJCQkgcnFzdHApOworCisJLyogSW5pdGlhbGl6ZSB0aGUgYnVmZmVycyAqLworCS8qIGZpcnN0IHJlY2xhaW0gcGFnZXMgdGhhdCB3ZXJlIG1vdmVkIHRvIHJlc3BvbnNlIGxpc3QgKi8KKwlzdmNfcHVzaGJhY2tfYWxscGFnZXMocnFzdHApOworCisJLyogbm93IGFsbG9jYXRlIG5lZWRlZCBwYWdlcy4gIElmIHdlIGdldCBhIGZhaWx1cmUsIHNsZWVwIGJyaWVmbHkgKi8KKwlwYWdlcyA9IDIgKyAoc2Vydi0+c3ZfYnVmc3ogKyBQQUdFX1NJWkUgLTEpIC8gUEFHRV9TSVpFOworCXdoaWxlIChycXN0cC0+cnFfYXJnaGkgPCBwYWdlcykgeworCQlzdHJ1Y3QgcGFnZSAqcCA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCWlmICghcCkgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dChIWi8yKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXJxc3RwLT5ycV9hcmdwYWdlc1tycXN0cC0+cnFfYXJnaGkrK10gPSBwOworCX0KKworCS8qIE1ha2UgYXJnLT5oZWFkIHBvaW50IHRvIGZpcnN0IHBhZ2UgYW5kIGFyZy0+cGFnZXMgcG9pbnQgdG8gcmVzdCAqLworCWFyZyA9ICZycXN0cC0+cnFfYXJnOworCWFyZy0+aGVhZFswXS5pb3ZfYmFzZSA9IHBhZ2VfYWRkcmVzcyhycXN0cC0+cnFfYXJncGFnZXNbMF0pOworCWFyZy0+aGVhZFswXS5pb3ZfbGVuID0gUEFHRV9TSVpFOworCXJxc3RwLT5ycV9hcmd1c2VkID0gMTsKKwlhcmctPnBhZ2VzID0gcnFzdHAtPnJxX2FyZ3BhZ2VzICsgMTsKKwlhcmctPnBhZ2VfYmFzZSA9IDA7CisJLyogc2F2ZSBhdCBsZWFzdCBvbmUgcGFnZSBmb3IgcmVzcG9uc2UgKi8KKwlhcmctPnBhZ2VfbGVuID0gKHBhZ2VzLTIpKlBBR0VfU0laRTsKKwlhcmctPmxlbiA9IChwYWdlcy0xKSpQQUdFX1NJWkU7CisJYXJnLT50YWlsWzBdLmlvdl9sZW4gPSAwOworCQorCXRyeV90b19mcmVlemUoUEZfRlJFRVpFKTsKKwlpZiAoc2lnbmFsbGVkKCkpCisJCXJldHVybiAtRUlOVFI7CisKKwlzcGluX2xvY2tfYmgoJnNlcnYtPnN2X2xvY2spOworCWlmICghbGlzdF9lbXB0eSgmc2Vydi0+c3ZfdGVtcHNvY2tzKSkgeworCQlzdnNrID0gbGlzdF9lbnRyeShzZXJ2LT5zdl90ZW1wc29ja3MubmV4dCwKKwkJCQkgIHN0cnVjdCBzdmNfc29jaywgc2tfbGlzdCk7CisJCS8qIGFwcGFyZW50bHkgdGhlICJzdGFuZGFyZCIgaXMgdGhhdCBjbGllbnRzIGNsb3NlCisJCSAqIGlkbGUgY29ubmVjdGlvbnMgYWZ0ZXIgNSBtaW51dGVzLCBzZXJ2ZXJzIGFmdGVyCisJCSAqIDYgbWludXRlcworCQkgKiAgIGh0dHA6Ly93d3cuY29ubmVjdGF0aG9uLm9yZy90YWxrczk2L25mc3RjcC5wZGYgCisJCSAqLworCQlpZiAoZ2V0X3NlY29uZHMoKSAtIHN2c2stPnNrX2xhc3RyZWN2IDwgNio2MAorCQkgICAgfHwgdGVzdF9iaXQoU0tfQlVTWSwgJnN2c2stPnNrX2ZsYWdzKSkKKwkJCXN2c2sgPSBOVUxMOworCX0KKwlpZiAoc3ZzaykgeworCQlzZXRfYml0KFNLX0JVU1ksICZzdnNrLT5za19mbGFncyk7CisJCXNldF9iaXQoU0tfQ0xPU0UsICZzdnNrLT5za19mbGFncyk7CisJCXJxc3RwLT5ycV9zb2NrID0gc3ZzazsKKwkJc3Zzay0+c2tfaW51c2UrKzsKKwl9IGVsc2UgaWYgKChzdnNrID0gc3ZjX3NvY2tfZGVxdWV1ZShzZXJ2KSkgIT0gTlVMTCkgeworCQlycXN0cC0+cnFfc29jayA9IHN2c2s7CisJCXN2c2stPnNrX2ludXNlKys7CisJCXJxc3RwLT5ycV9yZXNlcnZlZCA9IHNlcnYtPnN2X2J1ZnN6OwkKKwkJc3Zzay0+c2tfcmVzZXJ2ZWQgKz0gcnFzdHAtPnJxX3Jlc2VydmVkOworCX0gZWxzZSB7CisJCS8qIE5vIGRhdGEgcGVuZGluZy4gR28gdG8gc2xlZXAgKi8KKwkJc3ZjX3NlcnZfZW5xdWV1ZShzZXJ2LCBycXN0cCk7CisKKwkJLyoKKwkJICogV2UgaGF2ZSB0byBiZSBhYmxlIHRvIGludGVycnVwdCB0aGlzIHdhaXQKKwkJICogdG8gYnJpbmcgZG93biB0aGUgZGFlbW9ucyAuLi4KKwkJICovCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWFkZF93YWl0X3F1ZXVlKCZycXN0cC0+cnFfd2FpdCwgJndhaXQpOworCQlzcGluX3VubG9ja19iaCgmc2Vydi0+c3ZfbG9jayk7CisKKwkJc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKworCQl0cnlfdG9fZnJlZXplKFBGX0ZSRUVaRSk7CisKKwkJc3Bpbl9sb2NrX2JoKCZzZXJ2LT5zdl9sb2NrKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnJxc3RwLT5ycV93YWl0LCAmd2FpdCk7CisKKwkJaWYgKCEoc3ZzayA9IHJxc3RwLT5ycV9zb2NrKSkgeworCQkJc3ZjX3NlcnZfZGVxdWV1ZShzZXJ2LCBycXN0cCk7CisJCQlzcGluX3VubG9ja19iaCgmc2Vydi0+c3ZfbG9jayk7CisJCQlkcHJpbnRrKCJzdmM6IHNlcnZlciAlcCwgbm8gZGF0YSB5ZXRcbiIsIHJxc3RwKTsKKwkJCXJldHVybiBzaWduYWxsZWQoKT8gLUVJTlRSIDogLUVBR0FJTjsKKwkJfQorCX0KKwlzcGluX3VubG9ja19iaCgmc2Vydi0+c3ZfbG9jayk7CisKKwlkcHJpbnRrKCJzdmM6IHNlcnZlciAlcCwgc29ja2V0ICVwLCBpbnVzZT0lZFxuIiwKKwkJIHJxc3RwLCBzdnNrLCBzdnNrLT5za19pbnVzZSk7CisJbGVuID0gc3Zzay0+c2tfcmVjdmZyb20ocnFzdHApOworCWRwcmludGsoInN2YzogZ290IGxlbj0lZFxuIiwgbGVuKTsKKworCS8qIE5vIGRhdGEsIGluY29tcGxldGUgKFRDUCkgcmVhZCwgb3IgYWNjZXB0KCkgKi8KKwlpZiAobGVuID09IDAgfHwgbGVuID09IC1FQUdBSU4pIHsKKwkJcnFzdHAtPnJxX3Jlcy5sZW4gPSAwOworCQlzdmNfc29ja19yZWxlYXNlKHJxc3RwKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCXN2c2stPnNrX2xhc3RyZWN2ID0gZ2V0X3NlY29uZHMoKTsKKwlpZiAodGVzdF9iaXQoU0tfVEVNUCwgJnN2c2stPnNrX2ZsYWdzKSkgeworCQkvKiBwdXNoIGFjdGl2ZSBzb2NrZXRzIHRvIGVuZCBvZiBsaXN0ICovCisJCXNwaW5fbG9ja19iaCgmc2Vydi0+c3ZfbG9jayk7CisJCWlmICghbGlzdF9lbXB0eSgmc3Zzay0+c2tfbGlzdCkpCisJCQlsaXN0X21vdmVfdGFpbCgmc3Zzay0+c2tfbGlzdCwgJnNlcnYtPnN2X3RlbXBzb2Nrcyk7CisJCXNwaW5fdW5sb2NrX2JoKCZzZXJ2LT5zdl9sb2NrKTsKKwl9CisKKwlycXN0cC0+cnFfc2VjdXJlICA9IG50b2hzKHJxc3RwLT5ycV9hZGRyLnNpbl9wb3J0KSA8IDEwMjQ7CisJcnFzdHAtPnJxX2NoYW5kbGUuZGVmZXIgPSBzdmNfZGVmZXI7CisKKwlpZiAoc2Vydi0+c3Zfc3RhdHMpCisJCXNlcnYtPnN2X3N0YXRzLT5uZXRjbnQrKzsKKwlyZXR1cm4gbGVuOworfQorCisvKiAKKyAqIERyb3AgcmVxdWVzdAorICovCit2b2lkCitzdmNfZHJvcChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQoreworCWRwcmludGsoInN2Yzogc29ja2V0ICVwIGRyb3BwZWQgcmVxdWVzdFxuIiwgcnFzdHAtPnJxX3NvY2spOworCXN2Y19zb2NrX3JlbGVhc2UocnFzdHApOworfQorCisvKgorICogUmV0dXJuIHJlcGx5IHRvIGNsaWVudC4KKyAqLworaW50CitzdmNfc2VuZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQoreworCXN0cnVjdCBzdmNfc29jawkqc3ZzazsKKwlpbnQJCWxlbjsKKwlzdHJ1Y3QgeGRyX2J1ZgkqeGI7CisKKwlpZiAoKHN2c2sgPSBycXN0cC0+cnFfc29jaykgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJOVUxMIHNvY2tldCBwb2ludGVyIGluICVzOiVkXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIHJlbGVhc2UgdGhlIHJlY2VpdmUgc2tiIGJlZm9yZSBzZW5kaW5nIHRoZSByZXBseSAqLworCXN2Y19yZWxlYXNlX3NrYihycXN0cCk7CisKKwkvKiBjYWxjdWxhdGUgb3Zlci1hbGwgbGVuZ3RoICovCisJeGIgPSAmIHJxc3RwLT5ycV9yZXM7CisJeGItPmxlbiA9IHhiLT5oZWFkWzBdLmlvdl9sZW4gKworCQl4Yi0+cGFnZV9sZW4gKworCQl4Yi0+dGFpbFswXS5pb3ZfbGVuOworCisJLyogR3JhYiBzdnNrLT5za19zZW0gdG8gc2VyaWFsaXplIG91dGdvaW5nIGRhdGEuICovCisJZG93bigmc3Zzay0+c2tfc2VtKTsKKwlpZiAodGVzdF9iaXQoU0tfREVBRCwgJnN2c2stPnNrX2ZsYWdzKSkKKwkJbGVuID0gLUVOT1RDT05OOworCWVsc2UKKwkJbGVuID0gc3Zzay0+c2tfc2VuZHRvKHJxc3RwKTsKKwl1cCgmc3Zzay0+c2tfc2VtKTsKKwlzdmNfc29ja19yZWxlYXNlKHJxc3RwKTsKKworCWlmIChsZW4gPT0gLUVDT05OUkVGVVNFRCB8fCBsZW4gPT0gLUVOT1RDT05OIHx8IGxlbiA9PSAtRUFHQUlOKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gbGVuOworfQorCisvKgorICogSW5pdGlhbGl6ZSBzb2NrZXQgZm9yIFJQQyB1c2UgYW5kIGNyZWF0ZSBzdmNfc29jayBzdHJ1Y3QKKyAqIFhYWDogTWF5IHdhbnQgdG8gc2V0c29ja29wdCBTT19TTkRCVUYgYW5kIFNPX1JDVkJVRi4KKyAqLworc3RhdGljIHN0cnVjdCBzdmNfc29jayAqCitzdmNfc2V0dXBfc29ja2V0KHN0cnVjdCBzdmNfc2VydiAqc2Vydiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCQkJaW50ICplcnJwLCBpbnQgcG1hcF9yZWdpc3RlcikKK3sKKwlzdHJ1Y3Qgc3ZjX3NvY2sJKnN2c2s7CisJc3RydWN0IHNvY2sJKmluZXQ7CisKKwlkcHJpbnRrKCJzdmM6IHN2Y19zZXR1cF9zb2NrZXQgJXBcbiIsIHNvY2spOworCWlmICghKHN2c2sgPSBrbWFsbG9jKHNpemVvZigqc3ZzayksIEdGUF9LRVJORUwpKSkgeworCQkqZXJycCA9IC1FTk9NRU07CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQoc3ZzaywgMCwgc2l6ZW9mKCpzdnNrKSk7CisKKwlpbmV0ID0gc29jay0+c2s7CisKKwkvKiBSZWdpc3RlciBzb2NrZXQgd2l0aCBwb3J0bWFwcGVyICovCisJaWYgKCplcnJwID49IDAgJiYgcG1hcF9yZWdpc3RlcikKKwkJKmVycnAgPSBzdmNfcmVnaXN0ZXIoc2VydiwgaW5ldC0+c2tfcHJvdG9jb2wsCisJCQkJICAgICBudG9ocyhpbmV0X3NrKGluZXQpLT5zcG9ydCkpOworCisJaWYgKCplcnJwIDwgMCkgeworCQlrZnJlZShzdnNrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2V0X2JpdChTS19CVVNZLCAmc3Zzay0+c2tfZmxhZ3MpOworCWluZXQtPnNrX3VzZXJfZGF0YSA9IHN2c2s7CisJc3Zzay0+c2tfc29jayA9IHNvY2s7CisJc3Zzay0+c2tfc2sgPSBpbmV0OworCXN2c2stPnNrX29zdGF0ZSA9IGluZXQtPnNrX3N0YXRlX2NoYW5nZTsKKwlzdnNrLT5za19vZGF0YSA9IGluZXQtPnNrX2RhdGFfcmVhZHk7CisJc3Zzay0+c2tfb3dzcGFjZSA9IGluZXQtPnNrX3dyaXRlX3NwYWNlOworCXN2c2stPnNrX3NlcnZlciA9IHNlcnY7CisJc3Zzay0+c2tfbGFzdHJlY3YgPSBnZXRfc2Vjb25kcygpOworCUlOSVRfTElTVF9IRUFEKCZzdnNrLT5za19kZWZlcnJlZCk7CisJSU5JVF9MSVNUX0hFQUQoJnN2c2stPnNrX3JlYWR5KTsKKwlzZW1hX2luaXQoJnN2c2stPnNrX3NlbSwgMSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBzb2NrZXQgKi8KKwlpZiAoc29jay0+dHlwZSA9PSBTT0NLX0RHUkFNKQorCQlzdmNfdWRwX2luaXQoc3Zzayk7CisJZWxzZQorCQlzdmNfdGNwX2luaXQoc3Zzayk7CisKKwlzcGluX2xvY2tfYmgoJnNlcnYtPnN2X2xvY2spOworCWlmICghcG1hcF9yZWdpc3RlcikgeworCQlzZXRfYml0KFNLX1RFTVAsICZzdnNrLT5za19mbGFncyk7CisJCWxpc3RfYWRkKCZzdnNrLT5za19saXN0LCAmc2Vydi0+c3ZfdGVtcHNvY2tzKTsKKwkJc2Vydi0+c3ZfdG1wY250Kys7CisJfSBlbHNlIHsKKwkJY2xlYXJfYml0KFNLX1RFTVAsICZzdnNrLT5za19mbGFncyk7CisJCWxpc3RfYWRkKCZzdnNrLT5za19saXN0LCAmc2Vydi0+c3ZfcGVybXNvY2tzKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnNlcnYtPnN2X2xvY2spOworCisJZHByaW50aygic3ZjOiBzdmNfc2V0dXBfc29ja2V0IGNyZWF0ZWQgJXAgKGluZXQgJXApXG4iLAorCQkJCXN2c2ssIHN2c2stPnNrX3NrKTsKKworCWNsZWFyX2JpdChTS19CVVNZLCAmc3Zzay0+c2tfZmxhZ3MpOworCXN2Y19zb2NrX2VucXVldWUoc3Zzayk7CisJcmV0dXJuIHN2c2s7Cit9CisKKy8qCisgKiBDcmVhdGUgc29ja2V0IGZvciBSUEMgc2VydmljZS4KKyAqLworc3RhdGljIGludAorc3ZjX2NyZWF0ZV9zb2NrZXQoc3RydWN0IHN2Y19zZXJ2ICpzZXJ2LCBpbnQgcHJvdG9jb2wsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luKQoreworCXN0cnVjdCBzdmNfc29jawkqc3ZzazsKKwlzdHJ1Y3Qgc29ja2V0CSpzb2NrOworCWludAkJZXJyb3I7CisJaW50CQl0eXBlOworCisJZHByaW50aygic3ZjOiBzdmNfY3JlYXRlX3NvY2tldCglcywgJWQsICV1LiV1LiV1LiV1OiVkKVxuIiwKKwkJCQlzZXJ2LT5zdl9wcm9ncmFtLT5wZ19uYW1lLCBwcm90b2NvbCwKKwkJCQlOSVBRVUFEKHNpbi0+c2luX2FkZHIuc19hZGRyKSwKKwkJCQludG9ocyhzaW4tPnNpbl9wb3J0KSk7CisKKwlpZiAocHJvdG9jb2wgIT0gSVBQUk9UT19VRFAgJiYgcHJvdG9jb2wgIT0gSVBQUk9UT19UQ1ApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic3ZjOiBvbmx5IFVEUCBhbmQgVENQICIKKwkJCQkic29ja2V0cyBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdHlwZSA9IChwcm90b2NvbCA9PSBJUFBST1RPX1VEUCk/IFNPQ0tfREdSQU0gOiBTT0NLX1NUUkVBTTsKKworCWlmICgoZXJyb3IgPSBzb2NrX2NyZWF0ZV9rZXJuKFBGX0lORVQsIHR5cGUsIHByb3RvY29sLCAmc29jaykpIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCisJaWYgKHNpbiAhPSBOVUxMKSB7CisJCWlmICh0eXBlID09IFNPQ0tfU1RSRUFNKQorCQkJc29jay0+c2stPnNrX3JldXNlID0gMTsgLyogYWxsb3cgYWRkcmVzcyByZXVzZSAqLworCQllcnJvciA9IHNvY2stPm9wcy0+YmluZChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopIHNpbiwKKwkJCQkJCXNpemVvZigqc2luKSk7CisJCWlmIChlcnJvciA8IDApCisJCQlnb3RvIGJ1bW1lcjsKKwl9CisKKwlpZiAocHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApIHsKKwkJaWYgKChlcnJvciA9IHNvY2stPm9wcy0+bGlzdGVuKHNvY2ssIDY0KSkgPCAwKQorCQkJZ290byBidW1tZXI7CisJfQorCisJaWYgKChzdnNrID0gc3ZjX3NldHVwX3NvY2tldChzZXJ2LCBzb2NrLCAmZXJyb3IsIDEpKSAhPSBOVUxMKQorCQlyZXR1cm4gMDsKKworYnVtbWVyOgorCWRwcmludGsoInN2Yzogc3ZjX2NyZWF0ZV9zb2NrZXQgZXJyb3IgPSAlZFxuIiwgLWVycm9yKTsKKwlzb2NrX3JlbGVhc2Uoc29jayk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogUmVtb3ZlIGEgZGVhZCBzb2NrZXQKKyAqLwordm9pZAorc3ZjX2RlbGV0ZV9zb2NrZXQoc3RydWN0IHN2Y19zb2NrICpzdnNrKQoreworCXN0cnVjdCBzdmNfc2Vydgkqc2VydjsKKwlzdHJ1Y3Qgc29jawkqc2s7CisKKwlkcHJpbnRrKCJzdmM6IHN2Y19kZWxldGVfc29ja2V0KCVwKVxuIiwgc3Zzayk7CisKKwlzZXJ2ID0gc3Zzay0+c2tfc2VydmVyOworCXNrID0gc3Zzay0+c2tfc2s7CisKKwlzay0+c2tfc3RhdGVfY2hhbmdlID0gc3Zzay0+c2tfb3N0YXRlOworCXNrLT5za19kYXRhX3JlYWR5ID0gc3Zzay0+c2tfb2RhdGE7CisJc2stPnNrX3dyaXRlX3NwYWNlID0gc3Zzay0+c2tfb3dzcGFjZTsKKworCXNwaW5fbG9ja19iaCgmc2Vydi0+c3ZfbG9jayk7CisKKwlsaXN0X2RlbF9pbml0KCZzdnNrLT5za19saXN0KTsKKwlsaXN0X2RlbF9pbml0KCZzdnNrLT5za19yZWFkeSk7CisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFNLX0RFQUQsICZzdnNrLT5za19mbGFncykpCisJCWlmICh0ZXN0X2JpdChTS19URU1QLCAmc3Zzay0+c2tfZmxhZ3MpKQorCQkJc2Vydi0+c3ZfdG1wY250LS07CisKKwlpZiAoIXN2c2stPnNrX2ludXNlKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZzZXJ2LT5zdl9sb2NrKTsKKwkJc29ja19yZWxlYXNlKHN2c2stPnNrX3NvY2spOworCQlrZnJlZShzdnNrKTsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19iaCgmc2Vydi0+c3ZfbG9jayk7CisJCWRwcmludGsoS0VSTl9OT1RJQ0UgInN2Yzogc2VydmVyIHNvY2tldCBkZXN0cm95IGRlbGF5ZWRcbiIpOworCQkvKiBzdnNrLT5za19zZXJ2ZXIgPSBOVUxMOyAqLworCX0KK30KKworLyoKKyAqIE1ha2UgYSBzb2NrZXQgZm9yIG5mc2QgYW5kIGxvY2tkCisgKi8KK2ludAorc3ZjX21ha2Vzb2NrKHN0cnVjdCBzdmNfc2VydiAqc2VydiwgaW50IHByb3RvY29sLCB1bnNpZ25lZCBzaG9ydCBwb3J0KQoreworCXN0cnVjdCBzb2NrYWRkcl9pbglzaW47CisKKwlkcHJpbnRrKCJzdmM6IGNyZWF0aW5nIHNvY2tldCBwcm90byA9ICVkXG4iLCBwcm90b2NvbCk7CisJc2luLnNpbl9mYW1pbHkgICAgICA9IEFGX0lORVQ7CisJc2luLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisJc2luLnNpbl9wb3J0ICAgICAgICA9IGh0b25zKHBvcnQpOworCXJldHVybiBzdmNfY3JlYXRlX3NvY2tldChzZXJ2LCBwcm90b2NvbCwgJnNpbik7Cit9CisKKy8qCisgKiBIYW5kbGUgZGVmZXIgYW5kIHJldmlzaXQgb2YgcmVxdWVzdHMgCisgKi8KKworc3RhdGljIHZvaWQgc3ZjX3JldmlzaXQoc3RydWN0IGNhY2hlX2RlZmVycmVkX3JlcSAqZHJlcSwgaW50IHRvb19tYW55KQoreworCXN0cnVjdCBzdmNfZGVmZXJyZWRfcmVxICpkciA9IGNvbnRhaW5lcl9vZihkcmVxLCBzdHJ1Y3Qgc3ZjX2RlZmVycmVkX3JlcSwgaGFuZGxlKTsKKwlzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYgPSBkcmVxLT5vd25lcjsKKwlzdHJ1Y3Qgc3ZjX3NvY2sgKnN2c2s7CisKKwlpZiAodG9vX21hbnkpIHsKKwkJc3ZjX3NvY2tfcHV0KGRyLT5zdnNrKTsKKwkJa2ZyZWUoZHIpOworCQlyZXR1cm47CisJfQorCWRwcmludGsoInJldmlzaXQgcXVldWVkXG4iKTsKKwlzdnNrID0gZHItPnN2c2s7CisJZHItPnN2c2sgPSBOVUxMOworCXNwaW5fbG9ja19iaCgmc2Vydi0+c3ZfbG9jayk7CisJbGlzdF9hZGQoJmRyLT5oYW5kbGUucmVjZW50LCAmc3Zzay0+c2tfZGVmZXJyZWQpOworCXNwaW5fdW5sb2NrX2JoKCZzZXJ2LT5zdl9sb2NrKTsKKwlzZXRfYml0KFNLX0RFRkVSUkVELCAmc3Zzay0+c2tfZmxhZ3MpOworCXN2Y19zb2NrX2VucXVldWUoc3Zzayk7CisJc3ZjX3NvY2tfcHV0KHN2c2spOworfQorCitzdGF0aWMgc3RydWN0IGNhY2hlX2RlZmVycmVkX3JlcSAqCitzdmNfZGVmZXIoc3RydWN0IGNhY2hlX3JlcSAqcmVxKQoreworCXN0cnVjdCBzdmNfcnFzdCAqcnFzdHAgPSBjb250YWluZXJfb2YocmVxLCBzdHJ1Y3Qgc3ZjX3Jxc3QsIHJxX2NoYW5kbGUpOworCWludCBzaXplID0gc2l6ZW9mKHN0cnVjdCBzdmNfZGVmZXJyZWRfcmVxKSArIChycXN0cC0+cnFfYXJnLmxlbik7CisJc3RydWN0IHN2Y19kZWZlcnJlZF9yZXEgKmRyOworCisJaWYgKHJxc3RwLT5ycV9hcmcucGFnZV9sZW4pCisJCXJldHVybiBOVUxMOyAvKiBpZiBtb3JlIHRoYW4gYSBwYWdlLCBnaXZlIHVwIEZJWE1FICovCisJaWYgKHJxc3RwLT5ycV9kZWZlcnJlZCkgeworCQlkciA9IHJxc3RwLT5ycV9kZWZlcnJlZDsKKwkJcnFzdHAtPnJxX2RlZmVycmVkID0gTlVMTDsKKwl9IGVsc2UgeworCQlpbnQgc2tpcCAgPSBycXN0cC0+cnFfYXJnLmxlbiAtIHJxc3RwLT5ycV9hcmcuaGVhZFswXS5pb3ZfbGVuOworCQkvKiBGSVhNRSBtYXliZSBkaXNjYXJkIGlmIHNpemUgdG9vIGxhcmdlICovCisJCWRyID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGRyID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKworCQlkci0+aGFuZGxlLm93bmVyID0gcnFzdHAtPnJxX3NlcnZlcjsKKwkJZHItPnByb3QgPSBycXN0cC0+cnFfcHJvdDsKKwkJZHItPmFkZHIgPSBycXN0cC0+cnFfYWRkcjsKKwkJZHItPmFyZ3NsZW4gPSBycXN0cC0+cnFfYXJnLmxlbiA+PiAyOworCQltZW1jcHkoZHItPmFyZ3MsIHJxc3RwLT5ycV9hcmcuaGVhZFswXS5pb3ZfYmFzZS1za2lwLCBkci0+YXJnc2xlbjw8Mik7CisJfQorCXNwaW5fbG9ja19iaCgmcnFzdHAtPnJxX3NlcnZlci0+c3ZfbG9jayk7CisJcnFzdHAtPnJxX3NvY2stPnNrX2ludXNlKys7CisJZHItPnN2c2sgPSBycXN0cC0+cnFfc29jazsKKwlzcGluX3VubG9ja19iaCgmcnFzdHAtPnJxX3NlcnZlci0+c3ZfbG9jayk7CisKKwlkci0+aGFuZGxlLnJldmlzaXQgPSBzdmNfcmV2aXNpdDsKKwlyZXR1cm4gJmRyLT5oYW5kbGU7Cit9CisKKy8qCisgKiByZWN2IGRhdGEgZnJvbSBhIGRlZmVycmVkIHJlcXVlc3QgaW50byBhbiBhY3RpdmUgb25lCisgKi8KK3N0YXRpYyBpbnQgc3ZjX2RlZmVycmVkX3JlY3Yoc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKK3sKKwlzdHJ1Y3Qgc3ZjX2RlZmVycmVkX3JlcSAqZHIgPSBycXN0cC0+cnFfZGVmZXJyZWQ7CisKKwlycXN0cC0+cnFfYXJnLmhlYWRbMF0uaW92X2Jhc2UgPSBkci0+YXJnczsKKwlycXN0cC0+cnFfYXJnLmhlYWRbMF0uaW92X2xlbiA9IGRyLT5hcmdzbGVuPDwyOworCXJxc3RwLT5ycV9hcmcucGFnZV9sZW4gPSAwOworCXJxc3RwLT5ycV9hcmcubGVuID0gZHItPmFyZ3NsZW48PDI7CisJcnFzdHAtPnJxX3Byb3QgICAgICAgID0gZHItPnByb3Q7CisJcnFzdHAtPnJxX2FkZHIgICAgICAgID0gZHItPmFkZHI7CisJcmV0dXJuIGRyLT5hcmdzbGVuPDwyOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc3ZjX2RlZmVycmVkX3JlcSAqc3ZjX2RlZmVycmVkX2RlcXVldWUoc3RydWN0IHN2Y19zb2NrICpzdnNrKQoreworCXN0cnVjdCBzdmNfZGVmZXJyZWRfcmVxICpkciA9IE5VTEw7CisJc3RydWN0IHN2Y19zZXJ2CSpzZXJ2ID0gc3Zzay0+c2tfc2VydmVyOworCQorCWlmICghdGVzdF9iaXQoU0tfREVGRVJSRUQsICZzdnNrLT5za19mbGFncykpCisJCXJldHVybiBOVUxMOworCXNwaW5fbG9ja19iaCgmc2Vydi0+c3ZfbG9jayk7CisJY2xlYXJfYml0KFNLX0RFRkVSUkVELCAmc3Zzay0+c2tfZmxhZ3MpOworCWlmICghbGlzdF9lbXB0eSgmc3Zzay0+c2tfZGVmZXJyZWQpKSB7CisJCWRyID0gbGlzdF9lbnRyeShzdnNrLT5za19kZWZlcnJlZC5uZXh0LAorCQkJCXN0cnVjdCBzdmNfZGVmZXJyZWRfcmVxLAorCQkJCWhhbmRsZS5yZWNlbnQpOworCQlsaXN0X2RlbF9pbml0KCZkci0+aGFuZGxlLnJlY2VudCk7CisJCXNldF9iaXQoU0tfREVGRVJSRUQsICZzdnNrLT5za19mbGFncyk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZzZXJ2LT5zdl9sb2NrKTsKKwlyZXR1cm4gZHI7Cit9CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N5c2N0bC5jIGIvbmV0L3N1bnJwYy9zeXNjdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjk2MTZhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3N1bnJwYy9zeXNjdGwuYwpAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIGxpbnV4L25ldC9zdW5ycGMvc3lzY3RsLmMKKyAqCisgKiBTeXNjdGwgaW50ZXJmYWNlIHRvIHN1bnJwYyBtb2R1bGUuCisgKgorICogSSB3b3VsZCBwcmVmZXIgdG8gcmVnaXN0ZXIgdGhlIHN1bnJwYyB0YWJsZSBiZWxvdyBzeXMvbmV0LCBidXQgdGhhdCdzCisgKiBpbXBvc3NpYmxlIGF0IHRoZSBtb21lbnQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N0YXRzLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3hwcnQuaD4KKworLyoKKyAqIERlY2xhcmUgdGhlIGRlYnVnIGZsYWdzIGhlcmUKKyAqLwordW5zaWduZWQgaW50CXJwY19kZWJ1ZzsKK3Vuc2lnbmVkIGludAluZnNfZGVidWc7Cit1bnNpZ25lZCBpbnQJbmZzZF9kZWJ1ZzsKK3Vuc2lnbmVkIGludAlubG1fZGVidWc7CisKKyNpZmRlZiBSUENfREVCVUcKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpzdW5ycGNfdGFibGVfaGVhZGVyOworc3RhdGljIGN0bF90YWJsZQkJc3VucnBjX3RhYmxlW107CisKK3ZvaWQKK3JwY19yZWdpc3Rlcl9zeXNjdGwodm9pZCkKK3sKKwlpZiAoIXN1bnJwY190YWJsZV9oZWFkZXIpIHsKKwkJc3VucnBjX3RhYmxlX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZShzdW5ycGNfdGFibGUsIDEpOworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJCWlmIChzdW5ycGNfdGFibGVbMF0uZGUpCisJCQlzdW5ycGNfdGFibGVbMF0uZGUtPm93bmVyID0gVEhJU19NT0RVTEU7CisjZW5kaWYKKwl9CisJCQkKK30KKwordm9pZAorcnBjX3VucmVnaXN0ZXJfc3lzY3RsKHZvaWQpCit7CisJaWYgKHN1bnJwY190YWJsZV9oZWFkZXIpIHsKKwkJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoc3VucnBjX3RhYmxlX2hlYWRlcik7CisJCXN1bnJwY190YWJsZV9oZWFkZXIgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludAorcHJvY19kb2RlYnVnKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhcgkJdG1wYnVmWzIwXSwgYywgKnM7CisJY2hhciBfX3VzZXIgKnA7CisJdW5zaWduZWQgaW50CXZhbHVlOworCXNpemVfdAkJbGVmdCwgbGVuOworCisJaWYgKCgqcHBvcyAmJiAhd3JpdGUpIHx8ICEqbGVucCkgeworCQkqbGVucCA9IDA7CisJCXJldHVybiAwOworCX0KKworCWxlZnQgPSAqbGVucDsKKworCWlmICh3cml0ZSkgeworCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBsZWZ0KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlwID0gYnVmZmVyOworCQl3aGlsZSAobGVmdCAmJiBfX2dldF91c2VyKGMsIHApID49IDAgJiYgaXNzcGFjZShjKSkKKwkJCWxlZnQtLSwgcCsrOworCQlpZiAoIWxlZnQpCisJCQlnb3RvIGRvbmU7CisKKwkJaWYgKGxlZnQgPiBzaXplb2YodG1wYnVmKSAtIDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHRtcGJ1ZiwgcCwgbGVmdCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJdG1wYnVmW2xlZnRdID0gJ1wwJzsKKworCQlmb3IgKHMgPSB0bXBidWYsIHZhbHVlID0gMDsgJzAnIDw9ICpzICYmICpzIDw9ICc5JzsgcysrLCBsZWZ0LS0pCisJCQl2YWx1ZSA9IDEwICogdmFsdWUgKyAoKnMgLSAnMCcpOworCQlpZiAoKnMgJiYgIWlzc3BhY2UoKnMpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXdoaWxlIChsZWZ0ICYmIGlzc3BhY2UoKnMpKQorCQkJbGVmdC0tLCBzKys7CisJCSoodW5zaWduZWQgaW50ICopIHRhYmxlLT5kYXRhID0gdmFsdWU7CisJCS8qIERpc3BsYXkgdGhlIFJQQyB0YXNrcyBvbiB3cml0aW5nIHRvIHJwY19kZWJ1ZyAqLworCQlpZiAodGFibGUtPmN0bF9uYW1lID09IENUTF9SUENERUJVRykgeworCQkJcnBjX3Nob3dfdGFza3MoKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBsZWZ0KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlsZW4gPSBzcHJpbnRmKHRtcGJ1ZiwgIiVkIiwgKih1bnNpZ25lZCBpbnQgKikgdGFibGUtPmRhdGEpOworCQlpZiAobGVuID4gbGVmdCkKKwkJCWxlbiA9IGxlZnQ7CisJCWlmIChfX2NvcHlfdG9fdXNlcihidWZmZXIsIHRtcGJ1ZiwgbGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoKGxlZnQgLT0gbGVuKSA+IDApIHsKKwkJCWlmIChwdXRfdXNlcignXG4nLCAoY2hhciBfX3VzZXIgKilidWZmZXIgKyBsZW4pKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJbGVmdC0tOworCQl9CisJfQorCitkb25lOgorCSpsZW5wIC09IGxlZnQ7CisJKnBwb3MgKz0gKmxlbnA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWluX3Nsb3RfdGFibGVfc2l6ZSA9IFJQQ19NSU5fU0xPVF9UQUJMRTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X3Nsb3RfdGFibGVfc2l6ZSA9IFJQQ19NQVhfU0xPVF9UQUJMRTsKKworc3RhdGljIGN0bF90YWJsZSBkZWJ1Z190YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX1JQQ0RFQlVHLAorCQkucHJvY25hbWUJPSAicnBjX2RlYnVnIiwKKwkJLmRhdGEJCT0gJnJwY19kZWJ1ZywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvZGVidWcKKwl9LCAKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9ORlNERUJVRywKKwkJLnByb2NuYW1lCT0gIm5mc19kZWJ1ZyIsCisJCS5kYXRhCQk9ICZuZnNfZGVidWcsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2RlYnVnCisJfSwgCisJeworCQkuY3RsX25hbWUJPSBDVExfTkZTRERFQlVHLAorCQkucHJvY25hbWUJPSAibmZzZF9kZWJ1ZyIsCisJCS5kYXRhCQk9ICZuZnNkX2RlYnVnLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9kZWJ1ZworCX0sIAorCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX05MTURFQlVHLAorCQkucHJvY25hbWUJPSAibmxtX2RlYnVnIiwKKwkJLmRhdGEJCT0gJm5sbV9kZWJ1ZywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvZGVidWcKKwl9LCAKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9TTE9UVEFCTEVfVURQLAorCQkucHJvY25hbWUJPSAidWRwX3Nsb3RfdGFibGVfZW50cmllcyIsCisJCS5kYXRhCQk9ICZ4cHJ0X3VkcF9zbG90X3RhYmxlX2VudHJpZXMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZtaW5fc2xvdF90YWJsZV9zaXplLAorCQkuZXh0cmEyCQk9ICZtYXhfc2xvdF90YWJsZV9zaXplCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9TTE9UVEFCTEVfVENQLAorCQkucHJvY25hbWUJPSAidGNwX3Nsb3RfdGFibGVfZW50cmllcyIsCisJCS5kYXRhCQk9ICZ4cHJ0X3RjcF9zbG90X3RhYmxlX2VudHJpZXMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZtaW5fc2xvdF90YWJsZV9zaXplLAorCQkuZXh0cmEyCQk9ICZtYXhfc2xvdF90YWJsZV9zaXplCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIGN0bF90YWJsZSBzdW5ycGNfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9TVU5SUEMsCisJCS5wcm9jbmFtZQk9ICJzdW5ycGMiLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gZGVidWdfdGFibGUKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvdGltZXIuYyBiL25ldC9zdW5ycGMvdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2JkZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3N1bnJwYy90aW1lci5jCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogbGludXgvbmV0L3N1bnJwYy90aW1lci5jCisgKgorICogRXN0aW1hdGUgUlBDIHJlcXVlc3Qgcm91bmQgdHJpcCB0aW1lLgorICoKKyAqIEJhc2VkIG9uIHBhY2tldCByb3VuZC10cmlwIGFuZCB2YXJpYW5jZSBlc3RpbWF0b3IgYWxnb3JpdGhtcyBkZXNjcmliZWQKKyAqIGluIGFwcGVuZGl4IEEgb2YgIkNvbmdlc3Rpb24gQXZvaWRhbmNlIGFuZCBDb250cm9sIiBieSBWYW4gSmFjb2Jzb24KKyAqIGFuZCBNaWNoYWVsIEouIEthcmVscyAoQUNNIENvbXB1dGVyIENvbW11bmljYXRpb24gUmV2aWV3OyBQcm9jZWVkaW5ncworICogb2YgdGhlIFNpZ2NvbW0gJzg4IFN5bXBvc2l1bSBpbiBTdGFuZm9yZCwgQ0EsIEF1Z3VzdCwgMTk4OCkuCisgKgorICogVGhpcyBSVFQgZXN0aW1hdG9yIGlzIHVzZWQgb25seSBmb3IgUlBDIG92ZXIgZGF0YWdyYW0gcHJvdG9jb2xzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBUcm9uZCBNeWtsZWJ1c3QgPHRyb25kLm15a2xlYnVzdEBmeXMudWlvLm5vPgorICovCisKKyNpbmNsdWRlIDxhc20vcGFyYW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy94cHJ0Lmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3RpbWVyLmg+CisKKyNkZWZpbmUgUlBDX1JUT19NQVggKDYwKkhaKQorI2RlZmluZSBSUENfUlRPX0lOSVQgKEhaLzUpCisjZGVmaW5lIFJQQ19SVE9fTUlOIChIWi8xMCkKKwordm9pZAorcnBjX2luaXRfcnR0KHN0cnVjdCBycGNfcnR0ICpydCwgdW5zaWduZWQgbG9uZyB0aW1lbykKK3sKKwl1bnNpZ25lZCBsb25nIGluaXQgPSAwOworCXVuc2lnbmVkIGk7CisKKwlydC0+dGltZW8gPSB0aW1lbzsKKworCWlmICh0aW1lbyA+IFJQQ19SVE9fSU5JVCkKKwkJaW5pdCA9ICh0aW1lbyAtIFJQQ19SVE9fSU5JVCkgPDwgMzsKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCXJ0LT5zcnR0W2ldID0gaW5pdDsKKwkJcnQtPnNkcnR0W2ldID0gUlBDX1JUT19JTklUOworCQlydC0+bnRpbWVvdXRzW2ldID0gMDsKKwl9Cit9CisKKy8qCisgKiBOQjogV2hlbiBjb21wdXRpbmcgdGhlIHNtb290aGVkIFJUVCBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uLAorICogICAgIGJlIGNhcmVmdWwgbm90IHRvIHByb2R1Y2UgbmVnYXRpdmUgaW50ZXJtZWRpYXRlIHJlc3VsdHMuCisgKi8KK3ZvaWQKK3JwY191cGRhdGVfcnR0KHN0cnVjdCBycGNfcnR0ICpydCwgdW5zaWduZWQgdGltZXIsIGxvbmcgbSkKK3sKKwlsb25nICpzcnR0LCAqc2RydHQ7CisKKwlpZiAodGltZXItLSA9PSAwKQorCQlyZXR1cm47CisKKwkvKiBqaWZmaWVzIHdyYXBwZWQ7IGlnbm9yZSB0aGlzIG9uZSAqLworCWlmIChtIDwgMCkKKwkJcmV0dXJuOworCisJaWYgKG0gPT0gMCkKKwkJbSA9IDFMOworCisJc3J0dCA9IChsb25nICopJnJ0LT5zcnR0W3RpbWVyXTsKKwltIC09ICpzcnR0ID4+IDM7CisJKnNydHQgKz0gbTsKKworCWlmIChtIDwgMCkKKwkJbSA9IC1tOworCisJc2RydHQgPSAobG9uZyAqKSZydC0+c2RydHRbdGltZXJdOworCW0gLT0gKnNkcnR0ID4+IDI7CisJKnNkcnR0ICs9IG07CisKKwkvKiBTZXQgbG93ZXIgYm91bmQgb24gdGhlIHZhcmlhbmNlICovCisJaWYgKCpzZHJ0dCA8IFJQQ19SVE9fTUlOKQorCQkqc2RydHQgPSBSUENfUlRPX01JTjsKK30KKworLyoKKyAqIEVzdGltYXRlIHJ0byBmb3IgYW4gbmZzIHJwYyBzZW50IHZpYS4gYW4gdW5yZWxpYWJsZSBkYXRhZ3JhbS4KKyAqIFVzZSB0aGUgbWVhbiBhbmQgbWVhbiBkZXZpYXRpb24gb2YgcnR0IGZvciB0aGUgYXBwcm9wcmlhdGUgdHlwZSBvZiBycGMKKyAqIGZvciB0aGUgZnJlcXVlbnQgcnBjcyBhbmQgYSBkZWZhdWx0IGZvciB0aGUgb3RoZXJzLgorICogVGhlIGp1c3RpZmljYXRpb24gZm9yIGRvaW5nICJvdGhlciIgdGhpcyB3YXkgaXMgdGhhdCB0aGVzZSBycGNzCisgKiBoYXBwZW4gc28gaW5mcmVxdWVudGx5IHRoYXQgdGltZXIgZXN0LiB3b3VsZCBwcm9iYWJseSBiZSBzdGFsZS4KKyAqIEFsc28sIHNpbmNlIG1hbnkgb2YgdGhlc2UgcnBjcyBhcmUKKyAqIG5vbi1pZGVtcG90ZW50LCBhIGNvbnNlcnZhdGl2ZSB0aW1lb3V0IGlzIGRlc2lyZWQuCisgKiBnZXRhdHRyLCBsb29rdXAsCisgKiByZWFkLCB3cml0ZSwgY29tbWl0ICAgICAtIEErNEQKKyAqIG90aGVyICAgICAgICAgICAgICAgICAgIC0gdGltZW8KKyAqLworCit1bnNpZ25lZCBsb25nCitycGNfY2FsY19ydG8oc3RydWN0IHJwY19ydHQgKnJ0LCB1bnNpZ25lZCB0aW1lcikKK3sKKwl1bnNpZ25lZCBsb25nIHJlczsKKworCWlmICh0aW1lci0tID09IDApCisJCXJldHVybiBydC0+dGltZW87CisKKwlyZXMgPSAoKHJ0LT5zcnR0W3RpbWVyXSArIDcpID4+IDMpICsgcnQtPnNkcnR0W3RpbWVyXTsKKwlpZiAocmVzID4gUlBDX1JUT19NQVgpCisJCXJlcyA9IFJQQ19SVE9fTUFYOworCisJcmV0dXJuIHJlczsKK30KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMveGRyLmMgYi9uZXQvc3VucnBjL3hkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ODQ5MzEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc3VucnBjL3hkci5jCkBAIC0wLDAgKzEsOTE3IEBACisvKgorICogbGludXgvbmV0L3N1bnJwYy94ZHIuYworICoKKyAqIEdlbmVyaWMgWERSIHN1cHBvcnQuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMveGRyLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL21zZ19wcm90Lmg+CisKKy8qCisgKiBYRFIgZnVuY3Rpb25zIGZvciBiYXNpYyBORlMgdHlwZXMKKyAqLwordTMyICoKK3hkcl9lbmNvZGVfbmV0b2JqKHUzMiAqcCwgY29uc3Qgc3RydWN0IHhkcl9uZXRvYmogKm9iaikKK3sKKwl1bnNpZ25lZCBpbnQJcXVhZGxlbiA9IFhEUl9RVUFETEVOKG9iai0+bGVuKTsKKworCXBbcXVhZGxlbl0gPSAwOwkJLyogemVybyB0cmFpbGluZyBieXRlcyAqLworCSpwKysgPSBodG9ubChvYmotPmxlbik7CisJbWVtY3B5KHAsIG9iai0+ZGF0YSwgb2JqLT5sZW4pOworCXJldHVybiBwICsgWERSX1FVQURMRU4ob2JqLT5sZW4pOworfQorCit1MzIgKgoreGRyX2RlY29kZV9uZXRvYmoodTMyICpwLCBzdHJ1Y3QgeGRyX25ldG9iaiAqb2JqKQoreworCXVuc2lnbmVkIGludAlsZW47CisKKwlpZiAoKGxlbiA9IG50b2hsKCpwKyspKSA+IFhEUl9NQVhfTkVUT0JKKQorCQlyZXR1cm4gTlVMTDsKKwlvYmotPmxlbiAgPSBsZW47CisJb2JqLT5kYXRhID0gKHU4ICopIHA7CisJcmV0dXJuIHAgKyBYRFJfUVVBRExFTihsZW4pOworfQorCisvKioKKyAqIHhkcl9lbmNvZGVfb3BhcXVlX2ZpeGVkIC0gRW5jb2RlIGZpeGVkIGxlbmd0aCBvcGFxdWUgZGF0YQorICogQHAgLSBwb2ludGVyIHRvIGN1cnJlbnQgcG9zaXRpb24gaW4gWERSIGJ1ZmZlci4KKyAqIEBwdHIgLSBwb2ludGVyIHRvIGRhdGEgdG8gZW5jb2RlIChvciBOVUxMKQorICogQG5ieXRlcyAtIHNpemUgb2YgZGF0YS4KKyAqCisgKiBDb3B5IHRoZSBhcnJheSBvZiBkYXRhIG9mIGxlbmd0aCBuYnl0ZXMgYXQgcHRyIHRvIHRoZSBYRFIgYnVmZmVyCisgKiBhdCBwb3NpdGlvbiBwLCB0aGVuIGFsaWduIHRvIHRoZSBuZXh0IDMyLWJpdCBib3VuZGFyeSBieSBwYWRkaW5nCisgKiB3aXRoIHplcm8gYnl0ZXMgKHNlZSBSRkMxODMyKS4KKyAqIE5vdGU6IGlmIHB0ciBpcyBOVUxMLCBvbmx5IHRoZSBwYWRkaW5nIGlzIHBlcmZvcm1lZC4KKyAqCisgKiBSZXR1cm5zIHRoZSB1cGRhdGVkIGN1cnJlbnQgWERSIGJ1ZmZlciBwb3NpdGlvbgorICoKKyAqLwordTMyICp4ZHJfZW5jb2RlX29wYXF1ZV9maXhlZCh1MzIgKnAsIGNvbnN0IHZvaWQgKnB0ciwgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlpZiAobGlrZWx5KG5ieXRlcyAhPSAwKSkgeworCQl1bnNpZ25lZCBpbnQgcXVhZGxlbiA9IFhEUl9RVUFETEVOKG5ieXRlcyk7CisJCXVuc2lnbmVkIGludCBwYWRkaW5nID0gKHF1YWRsZW4gPDwgMikgLSBuYnl0ZXM7CisKKwkJaWYgKHB0ciAhPSBOVUxMKQorCQkJbWVtY3B5KHAsIHB0ciwgbmJ5dGVzKTsKKwkJaWYgKHBhZGRpbmcgIT0gMCkKKwkJCW1lbXNldCgoY2hhciAqKXAgKyBuYnl0ZXMsIDAsIHBhZGRpbmcpOworCQlwICs9IHF1YWRsZW47CisJfQorCXJldHVybiBwOworfQorRVhQT1JUX1NZTUJPTCh4ZHJfZW5jb2RlX29wYXF1ZV9maXhlZCk7CisKKy8qKgorICogeGRyX2VuY29kZV9vcGFxdWUgLSBFbmNvZGUgdmFyaWFibGUgbGVuZ3RoIG9wYXF1ZSBkYXRhCisgKiBAcCAtIHBvaW50ZXIgdG8gY3VycmVudCBwb3NpdGlvbiBpbiBYRFIgYnVmZmVyLgorICogQHB0ciAtIHBvaW50ZXIgdG8gZGF0YSB0byBlbmNvZGUgKG9yIE5VTEwpCisgKiBAbmJ5dGVzIC0gc2l6ZSBvZiBkYXRhLgorICoKKyAqIFJldHVybnMgdGhlIHVwZGF0ZWQgY3VycmVudCBYRFIgYnVmZmVyIHBvc2l0aW9uCisgKi8KK3UzMiAqeGRyX2VuY29kZV9vcGFxdWUodTMyICpwLCBjb25zdCB2b2lkICpwdHIsIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJKnArKyA9IGh0b25sKG5ieXRlcyk7CisJcmV0dXJuIHhkcl9lbmNvZGVfb3BhcXVlX2ZpeGVkKHAsIHB0ciwgbmJ5dGVzKTsKK30KK0VYUE9SVF9TWU1CT0woeGRyX2VuY29kZV9vcGFxdWUpOworCit1MzIgKgoreGRyX2VuY29kZV9zdHJpbmcodTMyICpwLCBjb25zdCBjaGFyICpzdHJpbmcpCit7CisJcmV0dXJuIHhkcl9lbmNvZGVfYXJyYXkocCwgc3RyaW5nLCBzdHJsZW4oc3RyaW5nKSk7Cit9CisKK3UzMiAqCit4ZHJfZGVjb2RlX3N0cmluZyh1MzIgKnAsIGNoYXIgKipzcCwgaW50ICpsZW5wLCBpbnQgbWF4bGVuKQoreworCXVuc2lnbmVkIGludAlsZW47CisJY2hhcgkJKnN0cmluZzsKKworCWlmICgobGVuID0gbnRvaGwoKnArKykpID4gbWF4bGVuKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobGVucCkKKwkJKmxlbnAgPSBsZW47CisJaWYgKChsZW4gJSA0KSAhPSAwKSB7CisJCXN0cmluZyA9IChjaGFyICopIHA7CisJfSBlbHNlIHsKKwkJc3RyaW5nID0gKGNoYXIgKikgKHAgLSAxKTsKKwkJbWVtbW92ZShzdHJpbmcsIHAsIGxlbik7CisJfQorCXN0cmluZ1tsZW5dID0gJ1wwJzsKKwkqc3AgPSBzdHJpbmc7CisJcmV0dXJuIHAgKyBYRFJfUVVBRExFTihsZW4pOworfQorCit1MzIgKgoreGRyX2RlY29kZV9zdHJpbmdfaW5wbGFjZSh1MzIgKnAsIGNoYXIgKipzcCwgaW50ICpsZW5wLCBpbnQgbWF4bGVuKQoreworCXVuc2lnbmVkIGludAlsZW47CisKKwlpZiAoKGxlbiA9IG50b2hsKCpwKyspKSA+IG1heGxlbikKKwkJcmV0dXJuIE5VTEw7CisJKmxlbnAgPSBsZW47CisJKnNwID0gKGNoYXIgKikgcDsKKwlyZXR1cm4gcCArIFhEUl9RVUFETEVOKGxlbik7Cit9CisKK3ZvaWQKK3hkcl9lbmNvZGVfcGFnZXMoc3RydWN0IHhkcl9idWYgKnhkciwgc3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgaW50IGJhc2UsCisJCSB1bnNpZ25lZCBpbnQgbGVuKQoreworCXN0cnVjdCBrdmVjICp0YWlsID0geGRyLT50YWlsOworCXUzMiAqcDsKKworCXhkci0+cGFnZXMgPSBwYWdlczsKKwl4ZHItPnBhZ2VfYmFzZSA9IGJhc2U7CisJeGRyLT5wYWdlX2xlbiA9IGxlbjsKKworCXAgPSAodTMyICopeGRyLT5oZWFkWzBdLmlvdl9iYXNlICsgWERSX1FVQURMRU4oeGRyLT5oZWFkWzBdLmlvdl9sZW4pOworCXRhaWwtPmlvdl9iYXNlID0gcDsKKwl0YWlsLT5pb3ZfbGVuID0gMDsKKworCWlmIChsZW4gJiAzKSB7CisJCXVuc2lnbmVkIGludCBwYWQgPSA0IC0gKGxlbiAmIDMpOworCisJCSpwID0gMDsKKwkJdGFpbC0+aW92X2Jhc2UgPSAoY2hhciAqKXAgKyAobGVuICYgMyk7CisJCXRhaWwtPmlvdl9sZW4gID0gcGFkOworCQlsZW4gKz0gcGFkOworCX0KKwl4ZHItPmJ1ZmxlbiArPSBsZW47CisJeGRyLT5sZW4gKz0gbGVuOworfQorCit2b2lkCit4ZHJfaW5saW5lX3BhZ2VzKHN0cnVjdCB4ZHJfYnVmICp4ZHIsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCSBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBpbnQgYmFzZSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlzdHJ1Y3Qga3ZlYyAqaGVhZCA9IHhkci0+aGVhZDsKKwlzdHJ1Y3Qga3ZlYyAqdGFpbCA9IHhkci0+dGFpbDsKKwljaGFyICpidWYgPSAoY2hhciAqKWhlYWQtPmlvdl9iYXNlOworCXVuc2lnbmVkIGludCBidWZsZW4gPSBoZWFkLT5pb3ZfbGVuOworCisJaGVhZC0+aW92X2xlbiAgPSBvZmZzZXQ7CisKKwl4ZHItPnBhZ2VzID0gcGFnZXM7CisJeGRyLT5wYWdlX2Jhc2UgPSBiYXNlOworCXhkci0+cGFnZV9sZW4gPSBsZW47CisKKwl0YWlsLT5pb3ZfYmFzZSA9IGJ1ZiArIG9mZnNldDsKKwl0YWlsLT5pb3ZfbGVuID0gYnVmbGVuIC0gb2Zmc2V0OworCisJeGRyLT5idWZsZW4gKz0gbGVuOworfQorCit2b2lkCit4ZHJfcGFydGlhbF9jb3B5X2Zyb21fc2tiKHN0cnVjdCB4ZHJfYnVmICp4ZHIsIHVuc2lnbmVkIGludCBiYXNlLAorCQkJICBza2JfcmVhZGVyX3QgKmRlc2MsCisJCQkgIHNrYl9yZWFkX2FjdG9yX3QgY29weV9hY3RvcikKK3sKKwlzdHJ1Y3QgcGFnZQkqKnBwYWdlID0geGRyLT5wYWdlczsKKwl1bnNpZ25lZCBpbnQJbGVuLCBwZ2xlbiA9IHhkci0+cGFnZV9sZW47CisJaW50CQlyZXQ7CisKKwlsZW4gPSB4ZHItPmhlYWRbMF0uaW92X2xlbjsKKwlpZiAoYmFzZSA8IGxlbikgeworCQlsZW4gLT0gYmFzZTsKKwkJcmV0ID0gY29weV9hY3RvcihkZXNjLCAoY2hhciAqKXhkci0+aGVhZFswXS5pb3ZfYmFzZSArIGJhc2UsIGxlbik7CisJCWlmIChyZXQgIT0gbGVuIHx8ICFkZXNjLT5jb3VudCkKKwkJCXJldHVybjsKKwkJYmFzZSA9IDA7CisJfSBlbHNlCisJCWJhc2UgLT0gbGVuOworCisJaWYgKHBnbGVuID09IDApCisJCWdvdG8gY29weV90YWlsOworCWlmIChiYXNlID49IHBnbGVuKSB7CisJCWJhc2UgLT0gcGdsZW47CisJCWdvdG8gY29weV90YWlsOworCX0KKwlpZiAoYmFzZSB8fCB4ZHItPnBhZ2VfYmFzZSkgeworCQlwZ2xlbiAtPSBiYXNlOworCQliYXNlICArPSB4ZHItPnBhZ2VfYmFzZTsKKwkJcHBhZ2UgKz0gYmFzZSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCQliYXNlICY9IH5QQUdFX0NBQ0hFX01BU0s7CisJfQorCWRvIHsKKwkJY2hhciAqa2FkZHI7CisKKwkJbGVuID0gUEFHRV9DQUNIRV9TSVpFOworCQlrYWRkciA9IGttYXBfYXRvbWljKCpwcGFnZSwgS01fU0tCX1NVTlJQQ19EQVRBKTsKKwkJaWYgKGJhc2UpIHsKKwkJCWxlbiAtPSBiYXNlOworCQkJaWYgKHBnbGVuIDwgbGVuKQorCQkJCWxlbiA9IHBnbGVuOworCQkJcmV0ID0gY29weV9hY3RvcihkZXNjLCBrYWRkciArIGJhc2UsIGxlbik7CisJCQliYXNlID0gMDsKKwkJfSBlbHNlIHsKKwkJCWlmIChwZ2xlbiA8IGxlbikKKwkJCQlsZW4gPSBwZ2xlbjsKKwkJCXJldCA9IGNvcHlfYWN0b3IoZGVzYywga2FkZHIsIGxlbik7CisJCX0KKwkJZmx1c2hfZGNhY2hlX3BhZ2UoKnBwYWdlKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fU0tCX1NVTlJQQ19EQVRBKTsKKwkJaWYgKHJldCAhPSBsZW4gfHwgIWRlc2MtPmNvdW50KQorCQkJcmV0dXJuOworCQlwcGFnZSsrOworCX0gd2hpbGUgKChwZ2xlbiAtPSBsZW4pICE9IDApOworY29weV90YWlsOgorCWxlbiA9IHhkci0+dGFpbFswXS5pb3ZfbGVuOworCWlmIChiYXNlIDwgbGVuKQorCQljb3B5X2FjdG9yKGRlc2MsIChjaGFyICopeGRyLT50YWlsWzBdLmlvdl9iYXNlICsgYmFzZSwgbGVuIC0gYmFzZSk7Cit9CisKKworaW50Cit4ZHJfc2VuZHBhZ2VzKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IGFkZHJsZW4sCisJCXN0cnVjdCB4ZHJfYnVmICp4ZHIsIHVuc2lnbmVkIGludCBiYXNlLCBpbnQgbXNnZmxhZ3MpCit7CisJc3RydWN0IHBhZ2UgKipwcGFnZSA9IHhkci0+cGFnZXM7CisJdW5zaWduZWQgaW50IGxlbiwgcGdsZW4gPSB4ZHItPnBhZ2VfbGVuOworCWludCBlcnIsIHJldCA9IDA7CisJc3NpemVfdCAoKnNlbmRwYWdlKShzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCBwYWdlICosIGludCwgc2l6ZV90LCBpbnQpOworCisJbGVuID0geGRyLT5oZWFkWzBdLmlvdl9sZW47CisJaWYgKGJhc2UgPCBsZW4gfHwgKGFkZHIgIT0gTlVMTCAmJiBiYXNlID09IDApKSB7CisJCXN0cnVjdCBrdmVjIGlvdiA9IHsKKwkJCS5pb3ZfYmFzZSA9IHhkci0+aGVhZFswXS5pb3ZfYmFzZSArIGJhc2UsCisJCQkuaW92X2xlbiAgPSBsZW4gLSBiYXNlLAorCQl9OworCQlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsKKwkJCS5tc2dfbmFtZSAgICA9IGFkZHIsCisJCQkubXNnX25hbWVsZW4gPSBhZGRybGVuLAorCQkJLm1zZ19mbGFncyAgID0gbXNnZmxhZ3MsCisJCX07CisJCWlmICh4ZHItPmxlbiA+IGxlbikKKwkJCW1zZy5tc2dfZmxhZ3MgfD0gTVNHX01PUkU7CisKKwkJaWYgKGlvdi5pb3ZfbGVuICE9IDApCisJCQllcnIgPSBrZXJuZWxfc2VuZG1zZyhzb2NrLCAmbXNnLCAmaW92LCAxLCBpb3YuaW92X2xlbik7CisJCWVsc2UKKwkJCWVyciA9IGtlcm5lbF9zZW5kbXNnKHNvY2ssICZtc2csIE5VTEwsIDAsIDApOworCQlpZiAocmV0ID09IDApCisJCQlyZXQgPSBlcnI7CisJCWVsc2UgaWYgKGVyciA+IDApCisJCQlyZXQgKz0gZXJyOworCQlpZiAoZXJyICE9IGlvdi5pb3ZfbGVuKQorCQkJZ290byBvdXQ7CisJCWJhc2UgPSAwOworCX0gZWxzZQorCQliYXNlIC09IGxlbjsKKworCWlmIChwZ2xlbiA9PSAwKQorCQlnb3RvIGNvcHlfdGFpbDsKKwlpZiAoYmFzZSA+PSBwZ2xlbikgeworCQliYXNlIC09IHBnbGVuOworCQlnb3RvIGNvcHlfdGFpbDsKKwl9CisJaWYgKGJhc2UgfHwgeGRyLT5wYWdlX2Jhc2UpIHsKKwkJcGdsZW4gLT0gYmFzZTsKKwkJYmFzZSAgKz0geGRyLT5wYWdlX2Jhc2U7CisJCXBwYWdlICs9IGJhc2UgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkJYmFzZSAmPSB+UEFHRV9DQUNIRV9NQVNLOworCX0KKworCXNlbmRwYWdlID0gc29jay0+b3BzLT5zZW5kcGFnZSA/IDogc29ja19ub19zZW5kcGFnZTsKKwlkbyB7CisJCWludCBmbGFncyA9IG1zZ2ZsYWdzOworCisJCWxlbiA9IFBBR0VfQ0FDSEVfU0laRTsKKwkJaWYgKGJhc2UpCisJCQlsZW4gLT0gYmFzZTsKKwkJaWYgKHBnbGVuIDwgbGVuKQorCQkJbGVuID0gcGdsZW47CisKKwkJaWYgKHBnbGVuICE9IGxlbiB8fCB4ZHItPnRhaWxbMF0uaW92X2xlbiAhPSAwKQorCQkJZmxhZ3MgfD0gTVNHX01PUkU7CisKKwkJLyogSG1tLi4uIFdlIG1pZ2h0IGJlIGRlYWxpbmcgd2l0aCBoaWdobWVtIHBhZ2VzICovCisJCWlmIChQYWdlSGlnaE1lbSgqcHBhZ2UpKQorCQkJc2VuZHBhZ2UgPSBzb2NrX25vX3NlbmRwYWdlOworCQllcnIgPSBzZW5kcGFnZShzb2NrLCAqcHBhZ2UsIGJhc2UsIGxlbiwgZmxhZ3MpOworCQlpZiAocmV0ID09IDApCisJCQlyZXQgPSBlcnI7CisJCWVsc2UgaWYgKGVyciA+IDApCisJCQlyZXQgKz0gZXJyOworCQlpZiAoZXJyICE9IGxlbikKKwkJCWdvdG8gb3V0OworCQliYXNlID0gMDsKKwkJcHBhZ2UrKzsKKwl9IHdoaWxlICgocGdsZW4gLT0gbGVuKSAhPSAwKTsKK2NvcHlfdGFpbDoKKwlsZW4gPSB4ZHItPnRhaWxbMF0uaW92X2xlbjsKKwlpZiAoYmFzZSA8IGxlbikgeworCQlzdHJ1Y3Qga3ZlYyBpb3YgPSB7CisJCQkuaW92X2Jhc2UgPSB4ZHItPnRhaWxbMF0uaW92X2Jhc2UgKyBiYXNlLAorCQkJLmlvdl9sZW4gID0gbGVuIC0gYmFzZSwKKwkJfTsKKwkJc3RydWN0IG1zZ2hkciBtc2cgPSB7CisJCQkubXNnX2ZsYWdzICAgPSBtc2dmbGFncywKKwkJfTsKKwkJZXJyID0ga2VybmVsX3NlbmRtc2coc29jaywgJm1zZywgJmlvdiwgMSwgaW92Lmlvdl9sZW4pOworCQlpZiAocmV0ID09IDApCisJCQlyZXQgPSBlcnI7CisJCWVsc2UgaWYgKGVyciA+IDApCisJCQlyZXQgKz0gZXJyOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBIZWxwZXIgcm91dGluZXMgZm9yIGRvaW5nICdtZW1tb3ZlJyBsaWtlIG9wZXJhdGlvbnMgb24gYSBzdHJ1Y3QgeGRyX2J1ZgorICoKKyAqIF9zaGlmdF9kYXRhX3JpZ2h0X3BhZ2VzCisgKiBAcGFnZXM6IHZlY3RvciBvZiBwYWdlcyBjb250YWluaW5nIGJvdGggdGhlIHNvdXJjZSBhbmQgZGVzdCBtZW1vcnkgYXJlYS4KKyAqIEBwZ3RvX2Jhc2U6IHBhZ2UgdmVjdG9yIGFkZHJlc3Mgb2YgZGVzdGluYXRpb24KKyAqIEBwZ2Zyb21fYmFzZTogcGFnZSB2ZWN0b3IgYWRkcmVzcyBvZiBzb3VyY2UKKyAqIEBsZW46IG51bWJlciBvZiBieXRlcyB0byBjb3B5CisgKgorICogTm90ZTogdGhlIGFkZHJlc3NlcyBwZ3RvX2Jhc2UgYW5kIHBnZnJvbV9iYXNlIGFyZSBib3RoIGNhbGN1bGF0ZWQgaW4KKyAqICAgICAgIHRoZSBzYW1lIHdheToKKyAqICAgICAgICAgICAgaWYgYSBtZW1vcnkgYXJlYSBzdGFydHMgYXQgYnl0ZSAnYmFzZScgaW4gcGFnZSAncGFnZXNbaV0nLAorICogICAgICAgICAgICB0aGVuIGl0cyBhZGRyZXNzIGlzIGdpdmVuIGFzIChpIDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgYmFzZQorICogQWxzbyBub3RlOiBwZ2Zyb21fYmFzZSBtdXN0IGJlIDwgcGd0b19iYXNlLCBidXQgdGhlIG1lbW9yeSBhcmVhcworICogCXRoZXkgcG9pbnQgdG8gbWF5IG92ZXJsYXAuCisgKi8KK3N0YXRpYyB2b2lkCitfc2hpZnRfZGF0YV9yaWdodF9wYWdlcyhzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBzaXplX3QgcGd0b19iYXNlLAorCQlzaXplX3QgcGdmcm9tX2Jhc2UsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHBhZ2UgKipwZ2Zyb20sICoqcGd0bzsKKwljaGFyICp2ZnJvbSwgKnZ0bzsKKwlzaXplX3QgY29weTsKKworCUJVR19PTihwZ3RvX2Jhc2UgPD0gcGdmcm9tX2Jhc2UpOworCisJcGd0b19iYXNlICs9IGxlbjsKKwlwZ2Zyb21fYmFzZSArPSBsZW47CisKKwlwZ3RvID0gcGFnZXMgKyAocGd0b19iYXNlID4+IFBBR0VfQ0FDSEVfU0hJRlQpOworCXBnZnJvbSA9IHBhZ2VzICsgKHBnZnJvbV9iYXNlID4+IFBBR0VfQ0FDSEVfU0hJRlQpOworCisJcGd0b19iYXNlICY9IH5QQUdFX0NBQ0hFX01BU0s7CisJcGdmcm9tX2Jhc2UgJj0gflBBR0VfQ0FDSEVfTUFTSzsKKworCWRvIHsKKwkJLyogQXJlIGFueSBwb2ludGVycyBjcm9zc2luZyBhIHBhZ2UgYm91bmRhcnk/ICovCisJCWlmIChwZ3RvX2Jhc2UgPT0gMCkgeworCQkJZmx1c2hfZGNhY2hlX3BhZ2UoKnBndG8pOworCQkJcGd0b19iYXNlID0gUEFHRV9DQUNIRV9TSVpFOworCQkJcGd0by0tOworCQl9CisJCWlmIChwZ2Zyb21fYmFzZSA9PSAwKSB7CisJCQlwZ2Zyb21fYmFzZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwkJCXBnZnJvbS0tOworCQl9CisKKwkJY29weSA9IGxlbjsKKwkJaWYgKGNvcHkgPiBwZ3RvX2Jhc2UpCisJCQljb3B5ID0gcGd0b19iYXNlOworCQlpZiAoY29weSA+IHBnZnJvbV9iYXNlKQorCQkJY29weSA9IHBnZnJvbV9iYXNlOworCQlwZ3RvX2Jhc2UgLT0gY29weTsKKwkJcGdmcm9tX2Jhc2UgLT0gY29weTsKKworCQl2dG8gPSBrbWFwX2F0b21pYygqcGd0bywgS01fVVNFUjApOworCQl2ZnJvbSA9IGttYXBfYXRvbWljKCpwZ2Zyb20sIEtNX1VTRVIxKTsKKwkJbWVtbW92ZSh2dG8gKyBwZ3RvX2Jhc2UsIHZmcm9tICsgcGdmcm9tX2Jhc2UsIGNvcHkpOworCQlrdW5tYXBfYXRvbWljKHZmcm9tLCBLTV9VU0VSMSk7CisJCWt1bm1hcF9hdG9taWModnRvLCBLTV9VU0VSMCk7CisKKwl9IHdoaWxlICgobGVuIC09IGNvcHkpICE9IDApOworCWZsdXNoX2RjYWNoZV9wYWdlKCpwZ3RvKTsKK30KKworLyoKKyAqIF9jb3B5X3RvX3BhZ2VzCisgKiBAcGFnZXM6IGFycmF5IG9mIHBhZ2VzCisgKiBAcGdiYXNlOiBwYWdlIHZlY3RvciBhZGRyZXNzIG9mIGRlc3RpbmF0aW9uCisgKiBAcDogcG9pbnRlciB0byBzb3VyY2UgZGF0YQorICogQGxlbjogbGVuZ3RoCisgKgorICogQ29waWVzIGRhdGEgZnJvbSBhbiBhcmJpdHJhcnkgbWVtb3J5IGxvY2F0aW9uIGludG8gYW4gYXJyYXkgb2YgcGFnZXMKKyAqIFRoZSBjb3B5IGlzIGFzc3VtZWQgdG8gYmUgbm9uLW92ZXJsYXBwaW5nLgorICovCitzdGF0aWMgdm9pZAorX2NvcHlfdG9fcGFnZXMoc3RydWN0IHBhZ2UgKipwYWdlcywgc2l6ZV90IHBnYmFzZSwgY29uc3QgY2hhciAqcCwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgcGFnZSAqKnBndG87CisJY2hhciAqdnRvOworCXNpemVfdCBjb3B5OworCisJcGd0byA9IHBhZ2VzICsgKHBnYmFzZSA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwlwZ2Jhc2UgJj0gflBBR0VfQ0FDSEVfTUFTSzsKKworCWRvIHsKKwkJY29weSA9IFBBR0VfQ0FDSEVfU0laRSAtIHBnYmFzZTsKKwkJaWYgKGNvcHkgPiBsZW4pCisJCQljb3B5ID0gbGVuOworCisJCXZ0byA9IGttYXBfYXRvbWljKCpwZ3RvLCBLTV9VU0VSMCk7CisJCW1lbWNweSh2dG8gKyBwZ2Jhc2UsIHAsIGNvcHkpOworCQlrdW5tYXBfYXRvbWljKHZ0bywgS01fVVNFUjApOworCisJCXBnYmFzZSArPSBjb3B5OworCQlpZiAocGdiYXNlID09IFBBR0VfQ0FDSEVfU0laRSkgeworCQkJZmx1c2hfZGNhY2hlX3BhZ2UoKnBndG8pOworCQkJcGdiYXNlID0gMDsKKwkJCXBndG8rKzsKKwkJfQorCQlwICs9IGNvcHk7CisKKwl9IHdoaWxlICgobGVuIC09IGNvcHkpICE9IDApOworCWZsdXNoX2RjYWNoZV9wYWdlKCpwZ3RvKTsKK30KKworLyoKKyAqIF9jb3B5X2Zyb21fcGFnZXMKKyAqIEBwOiBwb2ludGVyIHRvIGRlc3RpbmF0aW9uCisgKiBAcGFnZXM6IGFycmF5IG9mIHBhZ2VzCisgKiBAcGdiYXNlOiBvZmZzZXQgb2Ygc291cmNlIGRhdGEKKyAqIEBsZW46IGxlbmd0aAorICoKKyAqIENvcGllcyBkYXRhIGludG8gYW4gYXJiaXRyYXJ5IG1lbW9yeSBsb2NhdGlvbiBmcm9tIGFuIGFycmF5IG9mIHBhZ2VzCisgKiBUaGUgY29weSBpcyBhc3N1bWVkIHRvIGJlIG5vbi1vdmVybGFwcGluZy4KKyAqLworc3RhdGljIHZvaWQKK19jb3B5X2Zyb21fcGFnZXMoY2hhciAqcCwgc3RydWN0IHBhZ2UgKipwYWdlcywgc2l6ZV90IHBnYmFzZSwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgcGFnZSAqKnBnZnJvbTsKKwljaGFyICp2ZnJvbTsKKwlzaXplX3QgY29weTsKKworCXBnZnJvbSA9IHBhZ2VzICsgKHBnYmFzZSA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwlwZ2Jhc2UgJj0gflBBR0VfQ0FDSEVfTUFTSzsKKworCWRvIHsKKwkJY29weSA9IFBBR0VfQ0FDSEVfU0laRSAtIHBnYmFzZTsKKwkJaWYgKGNvcHkgPiBsZW4pCisJCQljb3B5ID0gbGVuOworCisJCXZmcm9tID0ga21hcF9hdG9taWMoKnBnZnJvbSwgS01fVVNFUjApOworCQltZW1jcHkocCwgdmZyb20gKyBwZ2Jhc2UsIGNvcHkpOworCQlrdW5tYXBfYXRvbWljKHZmcm9tLCBLTV9VU0VSMCk7CisKKwkJcGdiYXNlICs9IGNvcHk7CisJCWlmIChwZ2Jhc2UgPT0gUEFHRV9DQUNIRV9TSVpFKSB7CisJCQlwZ2Jhc2UgPSAwOworCQkJcGdmcm9tKys7CisJCX0KKwkJcCArPSBjb3B5OworCisJfSB3aGlsZSAoKGxlbiAtPSBjb3B5KSAhPSAwKTsKK30KKworLyoKKyAqIHhkcl9zaHJpbmtfYnVmaGVhZAorICogQGJ1ZjogeGRyX2J1ZgorICogQGxlbjogYnl0ZXMgdG8gcmVtb3ZlIGZyb20gYnVmLT5oZWFkWzBdCisgKgorICogU2hyaW5rcyBYRFIgYnVmZmVyJ3MgaGVhZGVyIGt2ZWMgYnVmLT5oZWFkWzBdIGJ5IAorICogJ2xlbicgYnl0ZXMuIFRoZSBleHRyYSBkYXRhIGlzIG5vdCBsb3N0LCBidXQgaXMgaW5zdGVhZAorICogbW92ZWQgaW50byB0aGUgaW5saW5lZCBwYWdlcyBhbmQvb3IgdGhlIHRhaWwuCisgKi8KK3N0YXRpYyB2b2lkCit4ZHJfc2hyaW5rX2J1ZmhlYWQoc3RydWN0IHhkcl9idWYgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qga3ZlYyAqaGVhZCwgKnRhaWw7CisJc2l6ZV90IGNvcHksIG9mZnM7CisJdW5zaWduZWQgaW50IHBnbGVuID0gYnVmLT5wYWdlX2xlbjsKKworCXRhaWwgPSBidWYtPnRhaWw7CisJaGVhZCA9IGJ1Zi0+aGVhZDsKKwlCVUdfT04gKGxlbiA+IGhlYWQtPmlvdl9sZW4pOworCisJLyogU2hpZnQgdGhlIHRhaWwgZmlyc3QgKi8KKwlpZiAodGFpbC0+aW92X2xlbiAhPSAwKSB7CisJCWlmICh0YWlsLT5pb3ZfbGVuID4gbGVuKSB7CisJCQljb3B5ID0gdGFpbC0+aW92X2xlbiAtIGxlbjsKKwkJCW1lbW1vdmUoKGNoYXIgKil0YWlsLT5pb3ZfYmFzZSArIGxlbiwKKwkJCQkJdGFpbC0+aW92X2Jhc2UsIGNvcHkpOworCQl9CisJCS8qIENvcHkgZnJvbSB0aGUgaW5saW5lZCBwYWdlcyBpbnRvIHRoZSB0YWlsICovCisJCWNvcHkgPSBsZW47CisJCWlmIChjb3B5ID4gcGdsZW4pCisJCQljb3B5ID0gcGdsZW47CisJCW9mZnMgPSBsZW4gLSBjb3B5OworCQlpZiAob2ZmcyA+PSB0YWlsLT5pb3ZfbGVuKQorCQkJY29weSA9IDA7CisJCWVsc2UgaWYgKGNvcHkgPiB0YWlsLT5pb3ZfbGVuIC0gb2ZmcykKKwkJCWNvcHkgPSB0YWlsLT5pb3ZfbGVuIC0gb2ZmczsKKwkJaWYgKGNvcHkgIT0gMCkKKwkJCV9jb3B5X2Zyb21fcGFnZXMoKGNoYXIgKil0YWlsLT5pb3ZfYmFzZSArIG9mZnMsCisJCQkJCWJ1Zi0+cGFnZXMsCisJCQkJCWJ1Zi0+cGFnZV9iYXNlICsgcGdsZW4gKyBvZmZzIC0gbGVuLAorCQkJCQljb3B5KTsKKwkJLyogRG8gd2UgYWxzbyBuZWVkIHRvIGNvcHkgZGF0YSBmcm9tIHRoZSBoZWFkIGludG8gdGhlIHRhaWwgPyAqLworCQlpZiAobGVuID4gcGdsZW4pIHsKKwkJCW9mZnMgPSBjb3B5ID0gbGVuIC0gcGdsZW47CisJCQlpZiAoY29weSA+IHRhaWwtPmlvdl9sZW4pCisJCQkJY29weSA9IHRhaWwtPmlvdl9sZW47CisJCQltZW1jcHkodGFpbC0+aW92X2Jhc2UsCisJCQkJCShjaGFyICopaGVhZC0+aW92X2Jhc2UgKworCQkJCQloZWFkLT5pb3ZfbGVuIC0gb2ZmcywKKwkJCQkJY29weSk7CisJCX0KKwl9CisJLyogTm93IGhhbmRsZSBwYWdlcyAqLworCWlmIChwZ2xlbiAhPSAwKSB7CisJCWlmIChwZ2xlbiA+IGxlbikKKwkJCV9zaGlmdF9kYXRhX3JpZ2h0X3BhZ2VzKGJ1Zi0+cGFnZXMsCisJCQkJCWJ1Zi0+cGFnZV9iYXNlICsgbGVuLAorCQkJCQlidWYtPnBhZ2VfYmFzZSwKKwkJCQkJcGdsZW4gLSBsZW4pOworCQljb3B5ID0gbGVuOworCQlpZiAobGVuID4gcGdsZW4pCisJCQljb3B5ID0gcGdsZW47CisJCV9jb3B5X3RvX3BhZ2VzKGJ1Zi0+cGFnZXMsIGJ1Zi0+cGFnZV9iYXNlLAorCQkJCShjaGFyICopaGVhZC0+aW92X2Jhc2UgKyBoZWFkLT5pb3ZfbGVuIC0gbGVuLAorCQkJCWNvcHkpOworCX0KKwloZWFkLT5pb3ZfbGVuIC09IGxlbjsKKwlidWYtPmJ1ZmxlbiAtPSBsZW47CisJLyogSGF2ZSB3ZSB0cnVuY2F0ZWQgdGhlIG1lc3NhZ2U/ICovCisJaWYgKGJ1Zi0+bGVuID4gYnVmLT5idWZsZW4pCisJCWJ1Zi0+bGVuID0gYnVmLT5idWZsZW47Cit9CisKKy8qCisgKiB4ZHJfc2hyaW5rX3BhZ2VsZW4KKyAqIEBidWY6IHhkcl9idWYKKyAqIEBsZW46IGJ5dGVzIHRvIHJlbW92ZSBmcm9tIGJ1Zi0+cGFnZXMKKyAqCisgKiBTaHJpbmtzIFhEUiBidWZmZXIncyBwYWdlIGFycmF5IGJ1Zi0+cGFnZXMgYnkgCisgKiAnbGVuJyBieXRlcy4gVGhlIGV4dHJhIGRhdGEgaXMgbm90IGxvc3QsIGJ1dCBpcyBpbnN0ZWFkCisgKiBtb3ZlZCBpbnRvIHRoZSB0YWlsLgorICovCitzdGF0aWMgdm9pZAoreGRyX3Nocmlua19wYWdlbGVuKHN0cnVjdCB4ZHJfYnVmICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGt2ZWMgKnRhaWw7CisJc2l6ZV90IGNvcHk7CisJY2hhciAqcDsKKwl1bnNpZ25lZCBpbnQgcGdsZW4gPSBidWYtPnBhZ2VfbGVuOworCisJdGFpbCA9IGJ1Zi0+dGFpbDsKKwlCVUdfT04gKGxlbiA+IHBnbGVuKTsKKworCS8qIFNoaWZ0IHRoZSB0YWlsIGZpcnN0ICovCisJaWYgKHRhaWwtPmlvdl9sZW4gIT0gMCkgeworCQlwID0gKGNoYXIgKil0YWlsLT5pb3ZfYmFzZSArIGxlbjsKKwkJaWYgKHRhaWwtPmlvdl9sZW4gPiBsZW4pIHsKKwkJCWNvcHkgPSB0YWlsLT5pb3ZfbGVuIC0gbGVuOworCQkJbWVtbW92ZShwLCB0YWlsLT5pb3ZfYmFzZSwgY29weSk7CisJCX0gZWxzZQorCQkJYnVmLT5idWZsZW4gLT0gbGVuOworCQkvKiBDb3B5IGZyb20gdGhlIGlubGluZWQgcGFnZXMgaW50byB0aGUgdGFpbCAqLworCQljb3B5ID0gbGVuOworCQlpZiAoY29weSA+IHRhaWwtPmlvdl9sZW4pCisJCQljb3B5ID0gdGFpbC0+aW92X2xlbjsKKwkJX2NvcHlfZnJvbV9wYWdlcygoY2hhciAqKXRhaWwtPmlvdl9iYXNlLAorCQkJCWJ1Zi0+cGFnZXMsIGJ1Zi0+cGFnZV9iYXNlICsgcGdsZW4gLSBsZW4sCisJCQkJY29weSk7CisJfQorCWJ1Zi0+cGFnZV9sZW4gLT0gbGVuOworCWJ1Zi0+YnVmbGVuIC09IGxlbjsKKwkvKiBIYXZlIHdlIHRydW5jYXRlZCB0aGUgbWVzc2FnZT8gKi8KKwlpZiAoYnVmLT5sZW4gPiBidWYtPmJ1ZmxlbikKKwkJYnVmLT5sZW4gPSBidWYtPmJ1ZmxlbjsKK30KKwordm9pZAoreGRyX3NoaWZ0X2J1ZihzdHJ1Y3QgeGRyX2J1ZiAqYnVmLCBzaXplX3QgbGVuKQoreworCXhkcl9zaHJpbmtfYnVmaGVhZChidWYsIGxlbik7Cit9CisKKy8qKgorICogeGRyX2luaXRfZW5jb2RlIC0gSW5pdGlhbGl6ZSBhIHN0cnVjdCB4ZHJfc3RyZWFtIGZvciBzZW5kaW5nIGRhdGEuCisgKiBAeGRyOiBwb2ludGVyIHRvIHhkcl9zdHJlYW0gc3RydWN0CisgKiBAYnVmOiBwb2ludGVyIHRvIFhEUiBidWZmZXIgaW4gd2hpY2ggdG8gZW5jb2RlIGRhdGEKKyAqIEBwOiBjdXJyZW50IHBvaW50ZXIgaW5zaWRlIFhEUiBidWZmZXIKKyAqCisgKiBOb3RlOiBhdCB0aGUgbW9tZW50IHRoZSBSUEMgY2xpZW50IG9ubHkgcGFzc2VzIHRoZSBsZW5ndGggb2Ygb3VyCisgKgkgc2NyYXRjaCBidWZmZXIgaW4gdGhlIHhkcl9idWYncyBoZWFkZXIga3ZlYy4gUHJldmlvdXNseSB0aGlzCisgKgkgbWVhbnQgd2UgbmVlZGVkIHRvIGNhbGwgeGRyX2FkanVzdF9pb3ZlYygpIGFmdGVyIGVuY29kaW5nIHRoZQorICoJIGRhdGEuIFdpdGggdGhlIG5ldyBzY2hlbWUsIHRoZSB4ZHJfc3RyZWFtIG1hbmFnZXMgdGhlIGRldGFpbHMKKyAqCSBvZiB0aGUgYnVmZmVyIGxlbmd0aCwgYW5kIHRha2VzIGNhcmUgb2YgYWRqdXN0aW5nIHRoZSBrdmVjCisgKgkgbGVuZ3RoIGZvciB1cy4KKyAqLwordm9pZCB4ZHJfaW5pdF9lbmNvZGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IHhkcl9idWYgKmJ1ZiwgdWludDMyX3QgKnApCit7CisJc3RydWN0IGt2ZWMgKmlvdiA9IGJ1Zi0+aGVhZDsKKworCXhkci0+YnVmID0gYnVmOworCXhkci0+aW92ID0gaW92OworCXhkci0+ZW5kID0gKHVpbnQzMl90ICopKChjaGFyICopaW92LT5pb3ZfYmFzZSArIGlvdi0+aW92X2xlbik7CisJYnVmLT5sZW4gPSBpb3YtPmlvdl9sZW4gPSAoY2hhciAqKXAgLSAoY2hhciAqKWlvdi0+aW92X2Jhc2U7CisJeGRyLT5wID0gcDsKK30KK0VYUE9SVF9TWU1CT0woeGRyX2luaXRfZW5jb2RlKTsKKworLyoqCisgKiB4ZHJfcmVzZXJ2ZV9zcGFjZSAtIFJlc2VydmUgYnVmZmVyIHNwYWNlIGZvciBzZW5kaW5nCisgKiBAeGRyOiBwb2ludGVyIHRvIHhkcl9zdHJlYW0KKyAqIEBuYnl0ZXM6IG51bWJlciBvZiBieXRlcyB0byByZXNlcnZlCisgKgorICogQ2hlY2tzIHRoYXQgd2UgaGF2ZSBlbm91Z2ggYnVmZmVyIHNwYWNlIHRvIGVuY29kZSAnbmJ5dGVzJyBtb3JlCisgKiBieXRlcyBvZiBkYXRhLiBJZiBzbywgdXBkYXRlIHRoZSB0b3RhbCB4ZHJfYnVmIGxlbmd0aCwgYW5kCisgKiBhZGp1c3QgdGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCBrdmVjLgorICovCit1aW50MzJfdCAqIHhkcl9yZXNlcnZlX3NwYWNlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHNpemVfdCBuYnl0ZXMpCit7CisJdWludDMyX3QgKnAgPSB4ZHItPnA7CisJdWludDMyX3QgKnE7CisKKwkvKiBhbGlnbiBuYnl0ZXMgb24gdGhlIG5leHQgMzItYml0IGJvdW5kYXJ5ICovCisJbmJ5dGVzICs9IDM7CisJbmJ5dGVzICY9IH4zOworCXEgPSBwICsgKG5ieXRlcyA+PiAyKTsKKwlpZiAodW5saWtlbHkocSA+IHhkci0+ZW5kIHx8IHEgPCBwKSkKKwkJcmV0dXJuIE5VTEw7CisJeGRyLT5wID0gcTsKKwl4ZHItPmlvdi0+aW92X2xlbiArPSBuYnl0ZXM7CisJeGRyLT5idWYtPmxlbiArPSBuYnl0ZXM7CisJcmV0dXJuIHA7Cit9CitFWFBPUlRfU1lNQk9MKHhkcl9yZXNlcnZlX3NwYWNlKTsKKworLyoqCisgKiB4ZHJfd3JpdGVfcGFnZXMgLSBJbnNlcnQgYSBsaXN0IG9mIHBhZ2VzIGludG8gYW4gWERSIGJ1ZmZlciBmb3Igc2VuZGluZworICogQHhkcjogcG9pbnRlciB0byB4ZHJfc3RyZWFtCisgKiBAcGFnZXM6IGxpc3Qgb2YgcGFnZXMKKyAqIEBiYXNlOiBvZmZzZXQgb2YgZmlyc3QgYnl0ZQorICogQGxlbjogbGVuZ3RoIG9mIGRhdGEgaW4gYnl0ZXMKKyAqCisgKi8KK3ZvaWQgeGRyX3dyaXRlX3BhZ2VzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGludCBiYXNlLAorCQkgdW5zaWduZWQgaW50IGxlbikKK3sKKwlzdHJ1Y3QgeGRyX2J1ZiAqYnVmID0geGRyLT5idWY7CisJc3RydWN0IGt2ZWMgKmlvdiA9IGJ1Zi0+dGFpbDsKKwlidWYtPnBhZ2VzID0gcGFnZXM7CisJYnVmLT5wYWdlX2Jhc2UgPSBiYXNlOworCWJ1Zi0+cGFnZV9sZW4gPSBsZW47CisKKwlpb3YtPmlvdl9iYXNlID0gKGNoYXIgKil4ZHItPnA7CisJaW92LT5pb3ZfbGVuICA9IDA7CisJeGRyLT5pb3YgPSBpb3Y7CisKKwlpZiAobGVuICYgMykgeworCQl1bnNpZ25lZCBpbnQgcGFkID0gNCAtIChsZW4gJiAzKTsKKworCQlCVUdfT04oeGRyLT5wID49IHhkci0+ZW5kKTsKKwkJaW92LT5pb3ZfYmFzZSA9IChjaGFyICopeGRyLT5wICsgKGxlbiAmIDMpOworCQlpb3YtPmlvdl9sZW4gICs9IHBhZDsKKwkJbGVuICs9IHBhZDsKKwkJKnhkci0+cCsrID0gMDsKKwl9CisJYnVmLT5idWZsZW4gKz0gbGVuOworCWJ1Zi0+bGVuICs9IGxlbjsKK30KK0VYUE9SVF9TWU1CT0woeGRyX3dyaXRlX3BhZ2VzKTsKKworLyoqCisgKiB4ZHJfaW5pdF9kZWNvZGUgLSBJbml0aWFsaXplIGFuIHhkcl9zdHJlYW0gZm9yIGRlY29kaW5nIGRhdGEuCisgKiBAeGRyOiBwb2ludGVyIHRvIHhkcl9zdHJlYW0gc3RydWN0CisgKiBAYnVmOiBwb2ludGVyIHRvIFhEUiBidWZmZXIgZnJvbSB3aGljaCB0byBkZWNvZGUgZGF0YQorICogQHA6IGN1cnJlbnQgcG9pbnRlciBpbnNpZGUgWERSIGJ1ZmZlcgorICovCit2b2lkIHhkcl9pbml0X2RlY29kZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgeGRyX2J1ZiAqYnVmLCB1aW50MzJfdCAqcCkKK3sKKwlzdHJ1Y3Qga3ZlYyAqaW92ID0gYnVmLT5oZWFkOworCXVuc2lnbmVkIGludCBsZW4gPSBpb3YtPmlvdl9sZW47CisKKwlpZiAobGVuID4gYnVmLT5sZW4pCisJCWxlbiA9IGJ1Zi0+bGVuOworCXhkci0+YnVmID0gYnVmOworCXhkci0+aW92ID0gaW92OworCXhkci0+cCA9IHA7CisJeGRyLT5lbmQgPSAodWludDMyX3QgKikoKGNoYXIgKilpb3YtPmlvdl9iYXNlICsgbGVuKTsKK30KK0VYUE9SVF9TWU1CT0woeGRyX2luaXRfZGVjb2RlKTsKKworLyoqCisgKiB4ZHJfaW5saW5lX2RlY29kZSAtIFJldHJpZXZlIG5vbi1wYWdlIFhEUiBkYXRhIHRvIGRlY29kZQorICogQHhkcjogcG9pbnRlciB0byB4ZHJfc3RyZWFtIHN0cnVjdAorICogQG5ieXRlczogbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgdG8gZGVjb2RlCisgKgorICogQ2hlY2sgaWYgdGhlIGlucHV0IGJ1ZmZlciBpcyBsb25nIGVub3VnaCB0byBlbmFibGUgdXMgdG8gZGVjb2RlCisgKiAnbmJ5dGVzJyBtb3JlIGJ5dGVzIG9mIGRhdGEgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgKiBJZiBzbyByZXR1cm4gdGhlIGN1cnJlbnQgcG9pbnRlciwgdGhlbiB1cGRhdGUgdGhlIGN1cnJlbnQKKyAqIHBvaW50ZXIgcG9zaXRpb24uCisgKi8KK3VpbnQzMl90ICogeGRyX2lubGluZV9kZWNvZGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc2l6ZV90IG5ieXRlcykKK3sKKwl1aW50MzJfdCAqcCA9IHhkci0+cDsKKwl1aW50MzJfdCAqcSA9IHAgKyBYRFJfUVVBRExFTihuYnl0ZXMpOworCisJaWYgKHVubGlrZWx5KHEgPiB4ZHItPmVuZCB8fCBxIDwgcCkpCisJCXJldHVybiBOVUxMOworCXhkci0+cCA9IHE7CisJcmV0dXJuIHA7Cit9CitFWFBPUlRfU1lNQk9MKHhkcl9pbmxpbmVfZGVjb2RlKTsKKworLyoqCisgKiB4ZHJfcmVhZF9wYWdlcyAtIEVuc3VyZSBwYWdlLWJhc2VkIFhEUiBkYXRhIHRvIGRlY29kZSBpcyBhbGlnbmVkIGF0IGN1cnJlbnQgcG9pbnRlciBwb3NpdGlvbgorICogQHhkcjogcG9pbnRlciB0byB4ZHJfc3RyZWFtIHN0cnVjdAorICogQGxlbjogbnVtYmVyIG9mIGJ5dGVzIG9mIHBhZ2UgZGF0YQorICoKKyAqIE1vdmVzIGRhdGEgYmV5b25kIHRoZSBjdXJyZW50IHBvaW50ZXIgcG9zaXRpb24gZnJvbSB0aGUgWERSIGhlYWRbXSBidWZmZXIKKyAqIGludG8gdGhlIHBhZ2UgbGlzdC4gQW55IGRhdGEgdGhhdCBsaWVzIGJleW9uZCBjdXJyZW50IHBvc2l0aW9uICsgImxlbiIKKyAqIGJ5dGVzIGlzIG1vdmVkIGludG8gdGhlIFhEUiB0YWlsW10uIFRoZSBjdXJyZW50IHBvaW50ZXIgaXMgdGhlbgorICogcmVwb3NpdGlvbmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIFhEUiB0YWlsLgorICovCit2b2lkIHhkcl9yZWFkX3BhZ2VzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IHhkcl9idWYgKmJ1ZiA9IHhkci0+YnVmOworCXN0cnVjdCBrdmVjICppb3Y7CisJc3NpemVfdCBzaGlmdDsKKwl1bnNpZ25lZCBpbnQgZW5kOworCWludCBwYWRkaW5nOworCisJLyogUmVhbGlnbiBwYWdlcyB0byBjdXJyZW50IHBvaW50ZXIgcG9zaXRpb24gKi8KKwlpb3YgID0gYnVmLT5oZWFkOworCXNoaWZ0ID0gaW92LT5pb3ZfbGVuICsgKGNoYXIgKilpb3YtPmlvdl9iYXNlIC0gKGNoYXIgKil4ZHItPnA7CisJaWYgKHNoaWZ0ID4gMCkKKwkJeGRyX3Nocmlua19idWZoZWFkKGJ1Ziwgc2hpZnQpOworCisJLyogVHJ1bmNhdGUgcGFnZSBkYXRhIGFuZCBtb3ZlIGl0IGludG8gdGhlIHRhaWwgKi8KKwlpZiAoYnVmLT5wYWdlX2xlbiA+IGxlbikKKwkJeGRyX3Nocmlua19wYWdlbGVuKGJ1ZiwgYnVmLT5wYWdlX2xlbiAtIGxlbik7CisJcGFkZGluZyA9IChYRFJfUVVBRExFTihsZW4pIDw8IDIpIC0gbGVuOworCXhkci0+aW92ID0gaW92ID0gYnVmLT50YWlsOworCS8qIENvbXB1dGUgcmVtYWluaW5nIG1lc3NhZ2UgbGVuZ3RoLiAgKi8KKwllbmQgPSBpb3YtPmlvdl9sZW47CisJc2hpZnQgPSBidWYtPmJ1ZmxlbiAtIGJ1Zi0+bGVuOworCWlmIChzaGlmdCA8IGVuZCkKKwkJZW5kIC09IHNoaWZ0OworCWVsc2UgaWYgKHNoaWZ0ID4gMCkKKwkJZW5kID0gMDsKKwkvKgorCSAqIFBvc2l0aW9uIGN1cnJlbnQgcG9pbnRlciBhdCBiZWdpbm5pbmcgb2YgdGFpbCwgYW5kCisJICogc2V0IHJlbWFpbmluZyBtZXNzYWdlIGxlbmd0aC4KKwkgKi8KKwl4ZHItPnAgPSAodWludDMyX3QgKikoKGNoYXIgKilpb3YtPmlvdl9iYXNlICsgcGFkZGluZyk7CisJeGRyLT5lbmQgPSAodWludDMyX3QgKikoKGNoYXIgKilpb3YtPmlvdl9iYXNlICsgZW5kKTsKK30KK0VYUE9SVF9TWU1CT0woeGRyX3JlYWRfcGFnZXMpOworCitzdGF0aWMgc3RydWN0IGt2ZWMgZW1wdHlfaW92ID0gey5pb3ZfYmFzZSA9IE5VTEwsIC5pb3ZfbGVuID0gMH07CisKK3ZvaWQKK3hkcl9idWZfZnJvbV9pb3Yoc3RydWN0IGt2ZWMgKmlvdiwgc3RydWN0IHhkcl9idWYgKmJ1ZikKK3sKKwlidWYtPmhlYWRbMF0gPSAqaW92OworCWJ1Zi0+dGFpbFswXSA9IGVtcHR5X2lvdjsKKwlidWYtPnBhZ2VfbGVuID0gMDsKKwlidWYtPmJ1ZmxlbiA9IGJ1Zi0+bGVuID0gaW92LT5pb3ZfbGVuOworfQorCisvKiBTZXRzIHN1YmlvdiB0byB0aGUgaW50ZXJzZWN0aW9uIG9mIGlvdiB3aXRoIHRoZSBidWZmZXIgb2YgbGVuZ3RoIGxlbgorICogc3RhcnRpbmcgYmFzZSBieXRlcyBhZnRlciBpb3YuICBJbmRpY2F0ZXMgZW1wdHkgaW50ZXJzZWN0aW9uIGJ5IHNldHRpbmcKKyAqIGxlbmd0aCBvZiBzdWJpb3YgdG8gemVyby4gIERlY3JlbWVudHMgbGVuIGJ5IGxlbmd0aCBvZiBzdWJpb3YsIHNldHMgYmFzZQorICogdG8gemVybyAob3IgZGVjcmVtZW50cyBpdCBieSBsZW5ndGggb2YgaW92IGlmIHN1YmlvdiBpcyBlbXB0eSkuICovCitzdGF0aWMgdm9pZAoraW92X3N1YnNlZ21lbnQoc3RydWN0IGt2ZWMgKmlvdiwgc3RydWN0IGt2ZWMgKnN1YmlvdiwgaW50ICpiYXNlLCBpbnQgKmxlbikKK3sKKwlpZiAoKmJhc2UgPiBpb3YtPmlvdl9sZW4pIHsKKwkJc3ViaW92LT5pb3ZfYmFzZSA9IE5VTEw7CisJCXN1Ymlvdi0+aW92X2xlbiA9IDA7CisJCSpiYXNlIC09IGlvdi0+aW92X2xlbjsKKwl9IGVsc2UgeworCQlzdWJpb3YtPmlvdl9iYXNlID0gaW92LT5pb3ZfYmFzZSArICpiYXNlOworCQlzdWJpb3YtPmlvdl9sZW4gPSBtaW4oKmxlbiwgKGludClpb3YtPmlvdl9sZW4gLSAqYmFzZSk7CisJCSpiYXNlID0gMDsKKwl9CisJKmxlbiAtPSBzdWJpb3YtPmlvdl9sZW47IAorfQorCisvKiBTZXRzIHN1YmJ1ZiB0byB0aGUgcG9ydGlvbiBvZiBidWYgb2YgbGVuZ3RoIGxlbiBiZWdpbm5pbmcgYmFzZSBieXRlcworICogZnJvbSB0aGUgc3RhcnQgb2YgYnVmLiBSZXR1cm5zIC0xIGlmIGJhc2Ugb2YgbGVuZ3RoIGFyZSBvdXQgb2YgYm91bmRzLiAqLworaW50Cit4ZHJfYnVmX3N1YnNlZ21lbnQoc3RydWN0IHhkcl9idWYgKmJ1Ziwgc3RydWN0IHhkcl9idWYgKnN1YmJ1ZiwKKwkJCWludCBiYXNlLCBpbnQgbGVuKQoreworCWludCBpOworCisJc3ViYnVmLT5idWZsZW4gPSBzdWJidWYtPmxlbiA9IGxlbjsKKwlpb3Zfc3Vic2VnbWVudChidWYtPmhlYWQsIHN1YmJ1Zi0+aGVhZCwgJmJhc2UsICZsZW4pOworCisJaWYgKGJhc2UgPCBidWYtPnBhZ2VfbGVuKSB7CisJCWkgPSAoYmFzZSArIGJ1Zi0+cGFnZV9iYXNlKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCQlzdWJidWYtPnBhZ2VzID0gJmJ1Zi0+cGFnZXNbaV07CisJCXN1YmJ1Zi0+cGFnZV9iYXNlID0gKGJhc2UgKyBidWYtPnBhZ2VfYmFzZSkgJiB+UEFHRV9DQUNIRV9NQVNLOworCQlzdWJidWYtPnBhZ2VfbGVuID0gbWluKChpbnQpYnVmLT5wYWdlX2xlbiAtIGJhc2UsIGxlbik7CisJCWxlbiAtPSBzdWJidWYtPnBhZ2VfbGVuOworCQliYXNlID0gMDsKKwl9IGVsc2UgeworCQliYXNlIC09IGJ1Zi0+cGFnZV9sZW47CisJCXN1YmJ1Zi0+cGFnZV9sZW4gPSAwOworCX0KKworCWlvdl9zdWJzZWdtZW50KGJ1Zi0+dGFpbCwgc3ViYnVmLT50YWlsLCAmYmFzZSwgJmxlbik7CisJaWYgKGJhc2UgfHwgbGVuKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKKy8qIG9iaiBpcyBhc3N1bWVkIHRvIHBvaW50IHRvIGFsbG9jYXRlZCBtZW1vcnkgb2Ygc2l6ZSBhdCBsZWFzdCBsZW46ICovCitpbnQKK3JlYWRfYnl0ZXNfZnJvbV94ZHJfYnVmKHN0cnVjdCB4ZHJfYnVmICpidWYsIGludCBiYXNlLCB2b2lkICpvYmosIGludCBsZW4pCit7CisJc3RydWN0IHhkcl9idWYgc3ViYnVmOworCWludCB0aGlzX2xlbjsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0geGRyX2J1Zl9zdWJzZWdtZW50KGJ1ZiwgJnN1YmJ1ZiwgYmFzZSwgbGVuKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwl0aGlzX2xlbiA9IG1pbihsZW4sIChpbnQpc3ViYnVmLmhlYWRbMF0uaW92X2xlbik7CisJbWVtY3B5KG9iaiwgc3ViYnVmLmhlYWRbMF0uaW92X2Jhc2UsIHRoaXNfbGVuKTsKKwlsZW4gLT0gdGhpc19sZW47CisJb2JqICs9IHRoaXNfbGVuOworCXRoaXNfbGVuID0gbWluKGxlbiwgKGludClzdWJidWYucGFnZV9sZW4pOworCWlmICh0aGlzX2xlbikKKwkJX2NvcHlfZnJvbV9wYWdlcyhvYmosIHN1YmJ1Zi5wYWdlcywgc3ViYnVmLnBhZ2VfYmFzZSwgdGhpc19sZW4pOworCWxlbiAtPSB0aGlzX2xlbjsKKwlvYmogKz0gdGhpc19sZW47CisJdGhpc19sZW4gPSBtaW4obGVuLCAoaW50KXN1YmJ1Zi50YWlsWzBdLmlvdl9sZW4pOworCW1lbWNweShvYmosIHN1YmJ1Zi50YWlsWzBdLmlvdl9iYXNlLCB0aGlzX2xlbik7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorcmVhZF91MzJfZnJvbV94ZHJfYnVmKHN0cnVjdCB4ZHJfYnVmICpidWYsIGludCBiYXNlLCB1MzIgKm9iaikKK3sKKwl1MzIJcmF3OworCWludAlzdGF0dXM7CisKKwlzdGF0dXMgPSByZWFkX2J5dGVzX2Zyb21feGRyX2J1ZihidWYsIGJhc2UsICZyYXcsIHNpemVvZigqb2JqKSk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKwkqb2JqID0gbnRvaGwocmF3KTsKKwlyZXR1cm4gMDsKK30KKworLyogSWYgdGhlIG5ldG9iaiBzdGFydGluZyBvZmZzZXQgYnl0ZXMgZnJvbSB0aGUgc3RhcnQgb2YgeGRyX2J1ZiBpcyBjb250YWluZWQKKyAqIGVudGlyZWx5IGluIHRoZSBoZWFkIG9yIHRoZSB0YWlsLCBzZXQgb2JqZWN0IHRvIHBvaW50IHRvIGl0OyBvdGhlcndpc2UKKyAqIHRyeSB0byBmaW5kIHNwYWNlIGZvciBpdCBhdCB0aGUgZW5kIG9mIHRoZSB0YWlsLCBjb3B5IGl0IHRoZXJlLCBhbmQKKyAqIHNldCBvYmogdG8gcG9pbnQgdG8gaXQuICovCitpbnQKK3hkcl9idWZfcmVhZF9uZXRvYmooc3RydWN0IHhkcl9idWYgKmJ1Ziwgc3RydWN0IHhkcl9uZXRvYmogKm9iaiwgaW50IG9mZnNldCkKK3sKKwl1MzIJdGFpbF9vZmZzZXQgPSBidWYtPmhlYWRbMF0uaW92X2xlbiArIGJ1Zi0+cGFnZV9sZW47CisJdTMyCW9ial9lbmRfb2Zmc2V0OworCisJaWYgKHJlYWRfdTMyX2Zyb21feGRyX2J1ZihidWYsIG9mZnNldCwgJm9iai0+bGVuKSkKKwkJZ290byBvdXQ7CisJb2JqX2VuZF9vZmZzZXQgPSBvZmZzZXQgKyA0ICsgb2JqLT5sZW47CisKKwlpZiAob2JqX2VuZF9vZmZzZXQgPD0gYnVmLT5oZWFkWzBdLmlvdl9sZW4pIHsKKwkJLyogVGhlIG9iaiBpcyBjb250YWluZWQgZW50aXJlbHkgaW4gdGhlIGhlYWQ6ICovCisJCW9iai0+ZGF0YSA9IGJ1Zi0+aGVhZFswXS5pb3ZfYmFzZSArIG9mZnNldCArIDQ7CisJfSBlbHNlIGlmIChvZmZzZXQgKyA0ID49IHRhaWxfb2Zmc2V0KSB7CisJCWlmIChvYmpfZW5kX29mZnNldCAtIHRhaWxfb2Zmc2V0CisJCQkJPiBidWYtPnRhaWxbMF0uaW92X2xlbikKKwkJCWdvdG8gb3V0OworCQkvKiBUaGUgb2JqIGlzIGNvbnRhaW5lZCBlbnRpcmVseSBpbiB0aGUgdGFpbDogKi8KKwkJb2JqLT5kYXRhID0gYnVmLT50YWlsWzBdLmlvdl9iYXNlCisJCQkrIG9mZnNldCAtIHRhaWxfb2Zmc2V0ICsgNDsKKwl9IGVsc2UgeworCQkvKiB1c2UgZW5kIG9mIHRhaWwgYXMgc3RvcmFnZSBmb3Igb2JqOgorCQkgKiAoV2UgZG9uJ3QgY29weSB0byB0aGUgYmVnaW5uaW5nIGJlY2F1c2UgdGhlbiB3ZSdkIGhhdmUKKwkJICogdG8gd29ycnkgYWJvdXQgZG9pbmcgYSBwb3RlbnRpYWxseSBvdmVybGFwcGluZyBjb3B5LgorCQkgKiBUaGlzIGFzc3VtZXMgdGhlIG9iamVjdCBpcyBhdCBtb3N0IGhhbGYgdGhlIGxlbmd0aCBvZiB0aGUKKwkJICogdGFpbC4pICovCisJCWlmIChvYmotPmxlbiA+IGJ1Zi0+dGFpbFswXS5pb3ZfbGVuKQorCQkJZ290byBvdXQ7CisJCW9iai0+ZGF0YSA9IGJ1Zi0+dGFpbFswXS5pb3ZfYmFzZSArIGJ1Zi0+dGFpbFswXS5pb3ZfbGVuIC0gCisJCQkJb2JqLT5sZW47CisJCWlmIChyZWFkX2J5dGVzX2Zyb21feGRyX2J1ZihidWYsIG9mZnNldCArIDQsCisJCQkJCW9iai0+ZGF0YSwgb2JqLT5sZW4pKQorCQkJZ290byBvdXQ7CisKKwl9CisJcmV0dXJuIDA7CitvdXQ6CisJcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy94cHJ0LmMgYi9uZXQvc3VucnBjL3hwcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzRhNmJiCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3N1bnJwYy94cHJ0LmMKQEAgLTAsMCArMSwxNjc4IEBACisvKgorICogIGxpbnV4L25ldC9zdW5ycGMveHBydC5jCisgKgorICogIFRoaXMgaXMgYSBnZW5lcmljIFJQQyBjYWxsIGludGVyZmFjZSBzdXBwb3J0aW5nIGNvbmdlc3Rpb24gYXZvaWRhbmNlLAorICogIGFuZCBhc3luY2hyb25vdXMgY2FsbHMuCisgKgorICogIFRoZSBpbnRlcmZhY2Ugd29ya3MgbGlrZSB0aGlzOgorICoKKyAqICAtCVdoZW4gYSBwcm9jZXNzIHBsYWNlcyBhIGNhbGwsIGl0IGFsbG9jYXRlcyBhIHJlcXVlc3Qgc2xvdCBpZgorICoJb25lIGlzIGF2YWlsYWJsZS4gT3RoZXJ3aXNlLCBpdCBzbGVlcHMgb24gdGhlIGJhY2tsb2cgcXVldWUKKyAqCSh4cHJ0X3Jlc2VydmUpLgorICogIC0JTmV4dCwgdGhlIGNhbGxlciBwdXRzIHRvZ2V0aGVyIHRoZSBSUEMgbWVzc2FnZSwgc3R1ZmZzIGl0IGludG8KKyAqCXRoZSByZXF1ZXN0IHN0cnVjdCwgYW5kIGNhbGxzIHhwcnRfY2FsbCgpLgorICogIC0JeHBydF9jYWxsIHRyYW5zbWl0cyB0aGUgbWVzc2FnZSBhbmQgaW5zdGFsbHMgdGhlIGNhbGxlciBvbiB0aGUKKyAqCXNvY2tldCdzIHdhaXQgbGlzdC4gQXQgdGhlIHNhbWUgdGltZSwgaXQgaW5zdGFsbHMgYSB0aW1lciB0aGF0CisgKglpcyBydW4gYWZ0ZXIgdGhlIHBhY2tldCdzIHRpbWVvdXQgaGFzIGV4cGlyZWQuCisgKiAgLQlXaGVuIGEgcGFja2V0IGFycml2ZXMsIHRoZSBkYXRhX3JlYWR5IGhhbmRsZXIgd2Fsa3MgdGhlIGxpc3Qgb2YKKyAqCXBlbmRpbmcgcmVxdWVzdHMgZm9yIHRoYXQgc29ja2V0LiBJZiBhIG1hdGNoaW5nIFhJRCBpcyBmb3VuZCwgdGhlCisgKgljYWxsZXIgaXMgd29rZW4gdXAsIGFuZCB0aGUgdGltZXIgcmVtb3ZlZC4KKyAqICAtCVdoZW4gbm8gcmVwbHkgYXJyaXZlcyB3aXRoaW4gdGhlIHRpbWVvdXQgaW50ZXJ2YWwsIHRoZSB0aW1lciBpcworICoJZmlyZWQgYnkgdGhlIGtlcm5lbCBhbmQgcnVucyB4cHJ0X3RpbWVyKCkuIEl0IGVpdGhlciBhZGp1c3RzIHRoZQorICoJdGltZW91dCB2YWx1ZXMgKG1pbm9yIHRpbWVvdXQpIG9yIHdha2VzIHVwIHRoZSBjYWxsZXIgd2l0aCBhIHN0YXR1cworICoJb2YgLUVUSU1FRE9VVC4KKyAqICAtCVdoZW4gdGhlIGNhbGxlciByZWNlaXZlcyBhIG5vdGlmaWNhdGlvbiBmcm9tIFJQQyB0aGF0IGEgcmVwbHkgYXJyaXZlZCwKKyAqCWl0IHNob3VsZCByZWxlYXNlIHRoZSBSUEMgc2xvdCwgYW5kIHByb2Nlc3MgdGhlIHJlcGx5LgorICoJSWYgdGhlIGNhbGwgdGltZWQgb3V0LCBpdCBtYXkgY2hvb3NlIHRvIHJldHJ5IHRoZSBvcGVyYXRpb24gYnkKKyAqCWFkanVzdGluZyB0aGUgaW5pdGlhbCB0aW1lb3V0IHZhbHVlLCBhbmQgc2ltcGx5IGNhbGxpbmcgcnBjX2NhbGwKKyAqCWFnYWluLgorICoKKyAqICBTdXBwb3J0IGZvciBhc3luYyBSUEMgaXMgZG9uZSB0aHJvdWdoIGEgc2V0IG9mIFJQQy1zcGVjaWZpYyBzY2hlZHVsaW5nCisgKiAgcHJpbWl0aXZlcyB0aGF0IGB0cmFuc3BhcmVudGx5JyB3b3JrIGZvciBwcm9jZXNzZXMgYXMgd2VsbCBhcyBhc3luYworICogIHRhc2tzIHRoYXQgcmVseSBvbiBjYWxsYmFja3MuCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqCisgKiAgVENQIGNhbGxiYWNrIHJhY2VzIGZpeGVzIChDKSAxOTk4IFJlZCBIYXQgU29mdHdhcmUgPGFsYW5AcmVkaGF0LmNvbT4KKyAqICBUQ1Agc2VuZCBmaXhlcyAoQykgMTk5OCBSZWQgSGF0IFNvZnR3YXJlIDxhbGFuQHJlZGhhdC5jb20+CisgKiAgVENQIE5GUyByZWxhdGVkIHJlYWQgKyB3cml0ZSBmaXhlcworICogICAoQykgMTk5OSBEYXZlIEFpcmxpZSwgVW5pdmVyc2l0eSBvZiBMaW1lcmljaywgSXJlbGFuZCA8YWlybGllZEBsaW51eC5pZT4KKyAqCisgKiAgUmV3cml0ZSBvZiBsYXJnZXMgcGFydCBvZiB0aGUgY29kZSBpbiBvcmRlciB0byBzdGFiaWxpemUgVENQIHN0dWZmLgorICogIEZpeCBiZWhhdmlvdXIgd2hlbiBzb2NrZXQgYnVmZmVyIGlzIGZ1bGwuCisgKiAgIChDKSAxOTk5IFRyb25kIE15a2xlYnVzdCA8dHJvbmQubXlrbGVidXN0QGZ5cy51aW8ubm8+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorCisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxuZXQvdWRwLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorCisvKgorICogTG9jYWwgdmFyaWFibGVzCisgKi8KKworI2lmZGVmIFJQQ19ERUJVRworIyB1bmRlZiAgUlBDX0RFQlVHX0RBVEEKKyMgZGVmaW5lIFJQQ0RCR19GQUNJTElUWQlSUENEQkdfWFBSVAorI2VuZGlmCisKKyNkZWZpbmUgWFBSVF9NQVhfQkFDS09GRgkoOCkKKyNkZWZpbmUgWFBSVF9JRExFX1RJTUVPVVQJKDUqNjAqSFopCisjZGVmaW5lIFhQUlRfTUFYX1JFU1ZQT1JUCSg4MDApCisKKy8qCisgKiBMb2NhbCBmdW5jdGlvbnMKKyAqLworc3RhdGljIHZvaWQJeHBydF9yZXF1ZXN0X2luaXQoc3RydWN0IHJwY190YXNrICosIHN0cnVjdCBycGNfeHBydCAqKTsKK3N0YXRpYyBpbmxpbmUgdm9pZAlkb194cHJ0X3Jlc2VydmUoc3RydWN0IHJwY190YXNrICopOworc3RhdGljIHZvaWQJeHBydF9kaXNjb25uZWN0KHN0cnVjdCBycGNfeHBydCAqKTsKK3N0YXRpYyB2b2lkCXhwcnRfY29ubmVjdF9zdGF0dXMoc3RydWN0IHJwY190YXNrICp0YXNrKTsKK3N0YXRpYyBzdHJ1Y3QgcnBjX3hwcnQgKiB4cHJ0X3NldHVwKGludCBwcm90bywgc3RydWN0IHNvY2thZGRyX2luICphcCwKKwkJCQkJCXN0cnVjdCBycGNfdGltZW91dCAqdG8pOworc3RhdGljIHN0cnVjdCBzb2NrZXQgKnhwcnRfY3JlYXRlX3NvY2tldChzdHJ1Y3QgcnBjX3hwcnQgKiwgaW50LCBpbnQpOworc3RhdGljIHZvaWQJeHBydF9iaW5kX3NvY2tldChzdHJ1Y3QgcnBjX3hwcnQgKiwgc3RydWN0IHNvY2tldCAqKTsKK3N0YXRpYyBpbnQgICAgICBfX3hwcnRfZ2V0X2Nvbmcoc3RydWN0IHJwY194cHJ0ICosIHN0cnVjdCBycGNfdGFzayAqKTsKKworc3RhdGljIGludAl4cHJ0X2NsZWFyX2JhY2tsb2coc3RydWN0IHJwY194cHJ0ICp4cHJ0KTsKKworI2lmZGVmIFJQQ19ERUJVR19EQVRBCisvKgorICogUHJpbnQgdGhlIGJ1ZmZlciBjb250ZW50cyAoZmlyc3QgMTI4IGJ5dGVzIG9ubHktLWp1c3QgZW5vdWdoIGZvcgorICogZGlyb3ByZXMgcmV0dXJuKS4KKyAqLworc3RhdGljIHZvaWQKK3hwcnRfcGt0ZHVtcChjaGFyICptc2csIHUzMiAqcGFja2V0LCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJdTgJKmJ1ZiA9ICh1OCAqKSBwYWNrZXQ7CisJaW50CWo7CisKKwlkcHJpbnRrKCJSUEM6ICAgICAgJXNcbiIsIG1zZyk7CisJZm9yIChqID0gMDsgaiA8IGNvdW50ICYmIGogPCAxMjg7IGogKz0gNCkgeworCQlpZiAoIShqICYgMzEpKSB7CisJCQlpZiAoaikKKwkJCQlkcHJpbnRrKCJcbiIpOworCQkJZHByaW50aygiMHglMDR4ICIsIGopOworCQl9CisJCWRwcmludGsoIiUwMnglMDJ4JTAyeCUwMnggIiwKKwkJCWJ1ZltqXSwgYnVmW2orMV0sIGJ1ZltqKzJdLCBidWZbaiszXSk7CisJfQorCWRwcmludGsoIlxuIik7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkCit4cHJ0X3BrdGR1bXAoY2hhciAqbXNnLCB1MzIgKnBhY2tldCwgdW5zaWduZWQgaW50IGNvdW50KQoreworCS8qIE5PUCAqLworfQorI2VuZGlmCisKKy8qCisgKiBMb29rIHVwIFJQQyB0cmFuc3BvcnQgZ2l2ZW4gYW4gSU5FVCBzb2NrZXQKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcnBjX3hwcnQgKgoreHBydF9mcm9tX3NvY2soc3RydWN0IHNvY2sgKnNrKQoreworCXJldHVybiAoc3RydWN0IHJwY194cHJ0ICopIHNrLT5za191c2VyX2RhdGE7Cit9CisKKy8qCisgKiBTZXJpYWxpemUgd3JpdGUgYWNjZXNzIHRvIHNvY2tldHMsIGluIG9yZGVyIHRvIHByZXZlbnQgZGlmZmVyZW50CisgKiByZXF1ZXN0cyBmcm9tIGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlci4KKyAqIEFsc28gcHJldmVudHMgVENQIHNvY2tldCBjb25uZWN0cyBmcm9tIGNvbGxpZGluZyB3aXRoIHdyaXRlcy4KKyAqLworc3RhdGljIGludAorX194cHJ0X2xvY2tfd3JpdGUoc3RydWN0IHJwY194cHJ0ICp4cHJ0LCBzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IHJwY19ycXN0ICpyZXEgPSB0YXNrLT50a19ycXN0cDsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KFhQUlRfTE9DS0VELCAmeHBydC0+c29ja3N0YXRlKSkgeworCQlpZiAodGFzayA9PSB4cHJ0LT5zbmRfdGFzaykKKwkJCXJldHVybiAxOworCQlpZiAodGFzayA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCWdvdG8gb3V0X3NsZWVwOworCX0KKwlpZiAoeHBydC0+bm9jb25nIHx8IF9feHBydF9nZXRfY29uZyh4cHJ0LCB0YXNrKSkgeworCQl4cHJ0LT5zbmRfdGFzayA9IHRhc2s7CisJCWlmIChyZXEpIHsKKwkJCXJlcS0+cnFfYnl0ZXNfc2VudCA9IDA7CisJCQlyZXEtPnJxX250cmFucysrOworCQl9CisJCXJldHVybiAxOworCX0KKwlzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKTsKKwljbGVhcl9iaXQoWFBSVF9MT0NLRUQsICZ4cHJ0LT5zb2Nrc3RhdGUpOworCXNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCk7CitvdXRfc2xlZXA6CisJZHByaW50aygiUlBDOiAlNGQgZmFpbGVkIHRvIGxvY2sgc29ja2V0ICVwXG4iLCB0YXNrLT50a19waWQsIHhwcnQpOworCXRhc2stPnRrX3RpbWVvdXQgPSAwOworCXRhc2stPnRrX3N0YXR1cyA9IC1FQUdBSU47CisJaWYgKHJlcSAmJiByZXEtPnJxX250cmFucykKKwkJcnBjX3NsZWVwX29uKCZ4cHJ0LT5yZXNlbmQsIHRhc2ssIE5VTEwsIE5VTEwpOworCWVsc2UKKwkJcnBjX3NsZWVwX29uKCZ4cHJ0LT5zZW5kaW5nLCB0YXNrLCBOVUxMLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3hwcnRfbG9ja193cml0ZShzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQsIHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlpbnQgcmV0dmFsOworCisJc3Bpbl9sb2NrX2JoKCZ4cHJ0LT5zb2NrX2xvY2spOworCXJldHZhbCA9IF9feHBydF9sb2NrX3dyaXRlKHhwcnQsIHRhc2spOworCXNwaW5fdW5sb2NrX2JoKCZ4cHJ0LT5zb2NrX2xvY2spOworCXJldHVybiByZXR2YWw7Cit9CisKKworc3RhdGljIHZvaWQKK19feHBydF9sb2NrX3dyaXRlX25leHQoc3RydWN0IHJwY194cHJ0ICp4cHJ0KQoreworCXN0cnVjdCBycGNfdGFzayAqdGFzazsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KFhQUlRfTE9DS0VELCAmeHBydC0+c29ja3N0YXRlKSkKKwkJcmV0dXJuOworCWlmICgheHBydC0+bm9jb25nICYmIFJQQ1hQUlRfQ09OR0VTVEVEKHhwcnQpKQorCQlnb3RvIG91dF91bmxvY2s7CisJdGFzayA9IHJwY193YWtlX3VwX25leHQoJnhwcnQtPnJlc2VuZCk7CisJaWYgKCF0YXNrKSB7CisJCXRhc2sgPSBycGNfd2FrZV91cF9uZXh0KCZ4cHJ0LT5zZW5kaW5nKTsKKwkJaWYgKCF0YXNrKQorCQkJZ290byBvdXRfdW5sb2NrOworCX0KKwlpZiAoeHBydC0+bm9jb25nIHx8IF9feHBydF9nZXRfY29uZyh4cHJ0LCB0YXNrKSkgeworCQlzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSA9IHRhc2stPnRrX3Jxc3RwOworCQl4cHJ0LT5zbmRfdGFzayA9IHRhc2s7CisJCWlmIChyZXEpIHsKKwkJCXJlcS0+cnFfYnl0ZXNfc2VudCA9IDA7CisJCQlyZXEtPnJxX250cmFucysrOworCQl9CisJCXJldHVybjsKKwl9CitvdXRfdW5sb2NrOgorCXNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpOworCWNsZWFyX2JpdChYUFJUX0xPQ0tFRCwgJnhwcnQtPnNvY2tzdGF0ZSk7CisJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKK30KKworLyoKKyAqIFJlbGVhc2VzIHRoZSBzb2NrZXQgZm9yIHVzZSBieSBvdGhlciByZXF1ZXN0cy4KKyAqLworc3RhdGljIHZvaWQKK19feHBydF9yZWxlYXNlX3dyaXRlKHN0cnVjdCBycGNfeHBydCAqeHBydCwgc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCWlmICh4cHJ0LT5zbmRfdGFzayA9PSB0YXNrKSB7CisJCXhwcnQtPnNuZF90YXNrID0gTlVMTDsKKwkJc21wX21iX19iZWZvcmVfY2xlYXJfYml0KCk7CisJCWNsZWFyX2JpdChYUFJUX0xPQ0tFRCwgJnhwcnQtPnNvY2tzdGF0ZSk7CisJCXNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCk7CisJCV9feHBydF9sb2NrX3dyaXRlX25leHQoeHBydCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3hwcnRfcmVsZWFzZV93cml0ZShzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQsIHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzcGluX2xvY2tfYmgoJnhwcnQtPnNvY2tfbG9jayk7CisJX194cHJ0X3JlbGVhc2Vfd3JpdGUoeHBydCwgdGFzayk7CisJc3Bpbl91bmxvY2tfYmgoJnhwcnQtPnNvY2tfbG9jayk7Cit9CisKKy8qCisgKiBXcml0ZSBkYXRhIHRvIHNvY2tldC4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK3hwcnRfc2VuZG1zZyhzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQsIHN0cnVjdCBycGNfcnFzdCAqcmVxKQoreworCXN0cnVjdCBzb2NrZXQJKnNvY2sgPSB4cHJ0LT5zb2NrOworCXN0cnVjdCB4ZHJfYnVmCSp4ZHIgPSAmcmVxLT5ycV9zbmRfYnVmOworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IE5VTEw7CisJaW50IGFkZHJsZW4gPSAwOworCXVuc2lnbmVkIGludAlza2lwOworCWludAkJcmVzdWx0OworCisJaWYgKCFzb2NrKQorCQlyZXR1cm4gLUVOT1RDT05OOworCisJeHBydF9wa3RkdW1wKCJwYWNrZXQgZGF0YToiLAorCQkJCXJlcS0+cnFfc3ZlYy0+aW92X2Jhc2UsCisJCQkJcmVxLT5ycV9zdmVjLT5pb3ZfbGVuKTsKKworCS8qIEZvciBVRFAsIHdlIG5lZWQgdG8gcHJvdmlkZSBhbiBhZGRyZXNzICovCisJaWYgKCF4cHJ0LT5zdHJlYW0pIHsKKwkJYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgJnhwcnQtPmFkZHI7CisJCWFkZHJsZW4gPSBzaXplb2YoeHBydC0+YWRkcik7CisJfQorCS8qIERvbnQgcmVwZWF0IGJ5dGVzICovCisJc2tpcCA9IHJlcS0+cnFfYnl0ZXNfc2VudDsKKworCWNsZWFyX2JpdChTT0NLX0FTWU5DX05PU1BBQ0UsICZzb2NrLT5mbGFncyk7CisJcmVzdWx0ID0geGRyX3NlbmRwYWdlcyhzb2NrLCBhZGRyLCBhZGRybGVuLCB4ZHIsIHNraXAsIE1TR19ET05UV0FJVCk7CisKKwlkcHJpbnRrKCJSUEM6ICAgICAgeHBydF9zZW5kbXNnKCVkKSA9ICVkXG4iLCB4ZHItPmxlbiAtIHNraXAsIHJlc3VsdCk7CisKKwlpZiAocmVzdWx0ID49IDApCisJCXJldHVybiByZXN1bHQ7CisKKwlzd2l0Y2ggKHJlc3VsdCkgeworCWNhc2UgLUVDT05OUkVGVVNFRDoKKwkJLyogV2hlbiB0aGUgc2VydmVyIGhhcyBkaWVkLCBhbiBJQ01QIHBvcnQgdW5yZWFjaGFibGUgbWVzc2FnZQorCQkgKiBwcm9tcHRzIEVDT05OUkVGVVNFRC4KKwkJICovCisJY2FzZSAtRUFHQUlOOgorCQlicmVhazsKKwljYXNlIC1FQ09OTlJFU0VUOgorCWNhc2UgLUVOT1RDT05OOgorCWNhc2UgLUVQSVBFOgorCQkvKiBjb25uZWN0aW9uIGJyb2tlbiAqLworCQlpZiAoeHBydC0+c3RyZWFtKQorCQkJcmVzdWx0ID0gLUVOT1RDT05OOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9OT1RJQ0UgIlJQQzogc2VuZG1zZyByZXR1cm5lZCBlcnJvciAlZFxuIiwgLXJlc3VsdCk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBWYW4gSmFjb2Jzb24gY29uZ2VzdGlvbiBhdm9pZGFuY2UuIENoZWNrIGlmIHRoZSBjb25nZXN0aW9uIHdpbmRvdworICogb3ZlcmZsb3dlZC4gUHV0IHRoZSB0YXNrIHRvIHNsZWVwIGlmIHRoaXMgaXMgdGhlIGNhc2UuCisgKi8KK3N0YXRpYyBpbnQKK19feHBydF9nZXRfY29uZyhzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQsIHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSA9IHRhc2stPnRrX3Jxc3RwOworCisJaWYgKHJlcS0+cnFfY29uZykKKwkJcmV0dXJuIDE7CisJZHByaW50aygiUlBDOiAlNGQgeHBydF9jd25kX2xpbWl0ZWQgY29uZyA9ICVsZCBjd25kID0gJWxkXG4iLAorCQkJdGFzay0+dGtfcGlkLCB4cHJ0LT5jb25nLCB4cHJ0LT5jd25kKTsKKwlpZiAoUlBDWFBSVF9DT05HRVNURUQoeHBydCkpCisJCXJldHVybiAwOworCXJlcS0+cnFfY29uZyA9IDE7CisJeHBydC0+Y29uZyArPSBSUENfQ1dORFNDQUxFOworCXJldHVybiAxOworfQorCisvKgorICogQWRqdXN0IHRoZSBjb25nZXN0aW9uIHdpbmRvdywgYW5kIHdha2UgdXAgdGhlIG5leHQgdGFzaworICogdGhhdCBoYXMgYmVlbiBzbGVlcGluZyBkdWUgdG8gY29uZ2VzdGlvbgorICovCitzdGF0aWMgdm9pZAorX194cHJ0X3B1dF9jb25nKHN0cnVjdCBycGNfeHBydCAqeHBydCwgc3RydWN0IHJwY19ycXN0ICpyZXEpCit7CisJaWYgKCFyZXEtPnJxX2NvbmcpCisJCXJldHVybjsKKwlyZXEtPnJxX2NvbmcgPSAwOworCXhwcnQtPmNvbmcgLT0gUlBDX0NXTkRTQ0FMRTsKKwlfX3hwcnRfbG9ja193cml0ZV9uZXh0KHhwcnQpOworfQorCisvKgorICogQWRqdXN0IFJQQyBjb25nZXN0aW9uIHdpbmRvdworICogV2UgdXNlIGEgdGltZS1zbW9vdGhlZCBjb25nZXN0aW9uIGVzdGltYXRvciB0byBhdm9pZCBoZWF2eSBvc2NpbGxhdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK3hwcnRfYWRqdXN0X2N3bmQoc3RydWN0IHJwY194cHJ0ICp4cHJ0LCBpbnQgcmVzdWx0KQoreworCXVuc2lnbmVkIGxvbmcJY3duZDsKKworCWN3bmQgPSB4cHJ0LT5jd25kOworCWlmIChyZXN1bHQgPj0gMCAmJiBjd25kIDw9IHhwcnQtPmNvbmcpIHsKKwkJLyogVGhlIChjd25kID4+IDEpIHRlcm0gbWFrZXMgc3VyZQorCQkgKiB0aGUgcmVzdWx0IGdldHMgcm91bmRlZCBwcm9wZXJseS4gKi8KKwkJY3duZCArPSAoUlBDX0NXTkRTQ0FMRSAqIFJQQ19DV05EU0NBTEUgKyAoY3duZCA+PiAxKSkgLyBjd25kOworCQlpZiAoY3duZCA+IFJQQ19NQVhDV05EKHhwcnQpKQorCQkJY3duZCA9IFJQQ19NQVhDV05EKHhwcnQpOworCQlfX3hwcnRfbG9ja193cml0ZV9uZXh0KHhwcnQpOworCX0gZWxzZSBpZiAocmVzdWx0ID09IC1FVElNRURPVVQpIHsKKwkJY3duZCA+Pj0gMTsKKwkJaWYgKGN3bmQgPCBSUENfQ1dORFNDQUxFKQorCQkJY3duZCA9IFJQQ19DV05EU0NBTEU7CisJfQorCWRwcmludGsoIlJQQzogICAgICBjb25nICVsZCwgY3duZCB3YXMgJWxkLCBub3cgJWxkXG4iLAorCQkJeHBydC0+Y29uZywgeHBydC0+Y3duZCwgY3duZCk7CisJeHBydC0+Y3duZCA9IGN3bmQ7Cit9CisKKy8qCisgKiBSZXNldCB0aGUgbWFqb3IgdGltZW91dCB2YWx1ZQorICovCitzdGF0aWMgdm9pZCB4cHJ0X3Jlc2V0X21ham9ydGltZW8oc3RydWN0IHJwY19ycXN0ICpyZXEpCit7CisJc3RydWN0IHJwY190aW1lb3V0ICp0byA9ICZyZXEtPnJxX3hwcnQtPnRpbWVvdXQ7CisKKwlyZXEtPnJxX21ham9ydGltZW8gPSByZXEtPnJxX3RpbWVvdXQ7CisJaWYgKHRvLT50b19leHBvbmVudGlhbCkKKwkJcmVxLT5ycV9tYWpvcnRpbWVvIDw8PSB0by0+dG9fcmV0cmllczsKKwllbHNlCisJCXJlcS0+cnFfbWFqb3J0aW1lbyArPSB0by0+dG9faW5jcmVtZW50ICogdG8tPnRvX3JldHJpZXM7CisJaWYgKHJlcS0+cnFfbWFqb3J0aW1lbyA+IHRvLT50b19tYXh2YWwgfHwgcmVxLT5ycV9tYWpvcnRpbWVvID09IDApCisJCXJlcS0+cnFfbWFqb3J0aW1lbyA9IHRvLT50b19tYXh2YWw7CisJcmVxLT5ycV9tYWpvcnRpbWVvICs9IGppZmZpZXM7Cit9CisKKy8qCisgKiBBZGp1c3QgdGltZW91dCB2YWx1ZXMgZXRjIGZvciBuZXh0IHJldHJhbnNtaXQKKyAqLworaW50IHhwcnRfYWRqdXN0X3RpbWVvdXQoc3RydWN0IHJwY19ycXN0ICpyZXEpCit7CisJc3RydWN0IHJwY194cHJ0ICp4cHJ0ID0gcmVxLT5ycV94cHJ0OworCXN0cnVjdCBycGNfdGltZW91dCAqdG8gPSAmeHBydC0+dGltZW91dDsKKwlpbnQgc3RhdHVzID0gMDsKKworCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCByZXEtPnJxX21ham9ydGltZW8pKSB7CisJCWlmICh0by0+dG9fZXhwb25lbnRpYWwpCisJCQlyZXEtPnJxX3RpbWVvdXQgPDw9IDE7CisJCWVsc2UKKwkJCXJlcS0+cnFfdGltZW91dCArPSB0by0+dG9faW5jcmVtZW50OworCQlpZiAodG8tPnRvX21heHZhbCAmJiByZXEtPnJxX3RpbWVvdXQgPj0gdG8tPnRvX21heHZhbCkKKwkJCXJlcS0+cnFfdGltZW91dCA9IHRvLT50b19tYXh2YWw7CisJCXJlcS0+cnFfcmV0cmllcysrOworCQlwcHJpbnRrKCJSUEM6ICVsdSByZXRyYW5zXG4iLCBqaWZmaWVzKTsKKwl9IGVsc2UgeworCQlyZXEtPnJxX3RpbWVvdXQgPSB0by0+dG9faW5pdHZhbDsKKwkJcmVxLT5ycV9yZXRyaWVzID0gMDsKKwkJeHBydF9yZXNldF9tYWpvcnRpbWVvKHJlcSk7CisJCS8qIFJlc2V0IHRoZSBSVFQgY291bnRlcnMgPT0gInNsb3cgc3RhcnQiICovCisJCXNwaW5fbG9ja19iaCgmeHBydC0+c29ja19sb2NrKTsKKwkJcnBjX2luaXRfcnR0KHJlcS0+cnFfdGFzay0+dGtfY2xpZW50LT5jbF9ydHQsIHRvLT50b19pbml0dmFsKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnhwcnQtPnNvY2tfbG9jayk7CisJCXBwcmludGsoIlJQQzogJWx1IHRpbWVvdXRcbiIsIGppZmZpZXMpOworCQlzdGF0dXMgPSAtRVRJTUVET1VUOworCX0KKworCWlmIChyZXEtPnJxX3RpbWVvdXQgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ4cHJ0X2FkanVzdF90aW1lb3V0OiBycV90aW1lb3V0ID0gMCFcbiIpOworCQlyZXEtPnJxX3RpbWVvdXQgPSA1ICogSFo7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBDbG9zZSBkb3duIGEgdHJhbnNwb3J0IHNvY2tldAorICovCitzdGF0aWMgdm9pZAoreHBydF9jbG9zZShzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQpCit7CisJc3RydWN0IHNvY2tldAkqc29jayA9IHhwcnQtPnNvY2s7CisJc3RydWN0IHNvY2sJKnNrID0geHBydC0+aW5ldDsKKworCWlmICghc2spCisJCXJldHVybjsKKworCXdyaXRlX2xvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKKwl4cHJ0LT5pbmV0ID0gTlVMTDsKKwl4cHJ0LT5zb2NrID0gTlVMTDsKKworCXNrLT5za191c2VyX2RhdGEgICAgPSBOVUxMOworCXNrLT5za19kYXRhX3JlYWR5ICAgPSB4cHJ0LT5vbGRfZGF0YV9yZWFkeTsKKwlzay0+c2tfc3RhdGVfY2hhbmdlID0geHBydC0+b2xkX3N0YXRlX2NoYW5nZTsKKwlzay0+c2tfd3JpdGVfc3BhY2UgID0geHBydC0+b2xkX3dyaXRlX3NwYWNlOworCXdyaXRlX3VubG9ja19iaCgmc2stPnNrX2NhbGxiYWNrX2xvY2spOworCisJc2stPnNrX25vX2NoZWNrCSA9IDA7CisKKwlzb2NrX3JlbGVhc2Uoc29jayk7Cit9CisKK3N0YXRpYyB2b2lkCit4cHJ0X3NvY2tldF9hdXRvY2xvc2Uodm9pZCAqYXJncykKK3sKKwlzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQgPSAoc3RydWN0IHJwY194cHJ0ICopYXJnczsKKworCXhwcnRfZGlzY29ubmVjdCh4cHJ0KTsKKwl4cHJ0X2Nsb3NlKHhwcnQpOworCXhwcnRfcmVsZWFzZV93cml0ZSh4cHJ0LCBOVUxMKTsKK30KKworLyoKKyAqIE1hcmsgYSB0cmFuc3BvcnQgYXMgZGlzY29ubmVjdGVkCisgKi8KK3N0YXRpYyB2b2lkCit4cHJ0X2Rpc2Nvbm5lY3Qoc3RydWN0IHJwY194cHJ0ICp4cHJ0KQoreworCWRwcmludGsoIlJQQzogICAgICBkaXNjb25uZWN0ZWQgdHJhbnNwb3J0ICVwXG4iLCB4cHJ0KTsKKwlzcGluX2xvY2tfYmgoJnhwcnQtPnNvY2tfbG9jayk7CisJeHBydF9jbGVhcl9jb25uZWN0ZWQoeHBydCk7CisJcnBjX3dha2VfdXBfc3RhdHVzKCZ4cHJ0LT5wZW5kaW5nLCAtRU5PVENPTk4pOworCXNwaW5fdW5sb2NrX2JoKCZ4cHJ0LT5zb2NrX2xvY2spOworfQorCisvKgorICogVXNlZCB0byBhbGxvdyBkaXNjb25uZWN0aW9uIHdoZW4gd2UndmUgYmVlbiBpZGxlCisgKi8KK3N0YXRpYyB2b2lkCit4cHJ0X2luaXRfYXV0b2Rpc2Nvbm5lY3QodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBycGNfeHBydCAqeHBydCA9IChzdHJ1Y3QgcnBjX3hwcnQgKilkYXRhOworCisJc3Bpbl9sb2NrKCZ4cHJ0LT5zb2NrX2xvY2spOworCWlmICghbGlzdF9lbXB0eSgmeHBydC0+cmVjdikgfHwgeHBydC0+c2h1dGRvd24pCisJCWdvdG8gb3V0X2Fib3J0OworCWlmICh0ZXN0X2FuZF9zZXRfYml0KFhQUlRfTE9DS0VELCAmeHBydC0+c29ja3N0YXRlKSkKKwkJZ290byBvdXRfYWJvcnQ7CisJc3Bpbl91bmxvY2soJnhwcnQtPnNvY2tfbG9jayk7CisJLyogTGV0IGtldmVudGQgY2xvc2UgdGhlIHNvY2tldCAqLworCWlmICh0ZXN0X2JpdChYUFJUX0NPTk5FQ1RJTkcsICZ4cHJ0LT5zb2Nrc3RhdGUpICE9IDApCisJCXhwcnRfcmVsZWFzZV93cml0ZSh4cHJ0LCBOVUxMKTsKKwllbHNlCisJCXNjaGVkdWxlX3dvcmsoJnhwcnQtPnRhc2tfY2xlYW51cCk7CisJcmV0dXJuOworb3V0X2Fib3J0OgorCXNwaW5fdW5sb2NrKCZ4cHJ0LT5zb2NrX2xvY2spOworfQorCitzdGF0aWMgdm9pZCB4cHJ0X3NvY2tldF9jb25uZWN0KHZvaWQgKmFyZ3MpCit7CisJc3RydWN0IHJwY194cHJ0ICp4cHJ0ID0gKHN0cnVjdCBycGNfeHBydCAqKWFyZ3M7CisJc3RydWN0IHNvY2tldCAqc29jayA9IHhwcnQtPnNvY2s7CisJaW50IHN0YXR1cyA9IC1FSU87CisKKwlpZiAoeHBydC0+c2h1dGRvd24gfHwgeHBydC0+YWRkci5zaW5fcG9ydCA9PSAwKQorCQlnb3RvIG91dDsKKworCS8qCisJICogU3RhcnQgYnkgcmVzZXR0aW5nIGFueSBleGlzdGluZyBzdGF0ZQorCSAqLworCXhwcnRfY2xvc2UoeHBydCk7CisJc29jayA9IHhwcnRfY3JlYXRlX3NvY2tldCh4cHJ0LCB4cHJ0LT5wcm90LCB4cHJ0LT5yZXN2cG9ydCk7CisJaWYgKHNvY2sgPT0gTlVMTCkgeworCQkvKiBjb3VsZG4ndCBjcmVhdGUgc29ja2V0IG9yIGJpbmQgdG8gcmVzZXJ2ZWQgcG9ydDsKKwkJICogdGhpcyBpcyBsaWtlbHkgYSBwZXJtYW5lbnQgZXJyb3IsIHNvIGNhdXNlIGFuIGFib3J0ICovCisJCWdvdG8gb3V0OworCX0KKwl4cHJ0X2JpbmRfc29ja2V0KHhwcnQsIHNvY2spOworCXhwcnRfc29ja19zZXRidWZzaXplKHhwcnQpOworCisJc3RhdHVzID0gMDsKKwlpZiAoIXhwcnQtPnN0cmVhbSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIFRlbGwgdGhlIHNvY2tldCBsYXllciB0byBzdGFydCBjb25uZWN0aW5nLi4uCisJICovCisJc3RhdHVzID0gc29jay0+b3BzLT5jb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnhwcnQtPmFkZHIsCisJCQlzaXplb2YoeHBydC0+YWRkciksIE9fTk9OQkxPQ0spOworCWRwcmludGsoIlJQQzogJXAgIGNvbm5lY3Qgc3RhdHVzICVkIGNvbm5lY3RlZCAlZCBzb2NrIHN0YXRlICVkXG4iLAorCQkJeHBydCwgLXN0YXR1cywgeHBydF9jb25uZWN0ZWQoeHBydCksIHNvY2stPnNrLT5za19zdGF0ZSk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJc3dpdGNoIChzdGF0dXMpIHsKKwkJCWNhc2UgLUVJTlBST0dSRVNTOgorCQkJY2FzZSAtRUFMUkVBRFk6CisJCQkJZ290byBvdXRfY2xlYXI7CisJCX0KKwl9CitvdXQ6CisJaWYgKHN0YXR1cyA8IDApCisJCXJwY193YWtlX3VwX3N0YXR1cygmeHBydC0+cGVuZGluZywgc3RhdHVzKTsKKwllbHNlCisJCXJwY193YWtlX3VwKCZ4cHJ0LT5wZW5kaW5nKTsKK291dF9jbGVhcjoKKwlzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKTsKKwljbGVhcl9iaXQoWFBSVF9DT05ORUNUSU5HLCAmeHBydC0+c29ja3N0YXRlKTsKKwlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOworfQorCisvKgorICogQXR0ZW1wdCB0byBjb25uZWN0IGEgVENQIHNvY2tldC4KKyAqCisgKi8KK3ZvaWQgeHBydF9jb25uZWN0KHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgcnBjX3hwcnQJKnhwcnQgPSB0YXNrLT50a194cHJ0OworCisJZHByaW50aygiUlBDOiAlNGQgeHBydF9jb25uZWN0IHhwcnQgJXAgJXMgY29ubmVjdGVkXG4iLCB0YXNrLT50a19waWQsCisJCQl4cHJ0LCAoeHBydF9jb25uZWN0ZWQoeHBydCkgPyAiaXMiIDogImlzIG5vdCIpKTsKKworCWlmICh4cHJ0LT5zaHV0ZG93bikgeworCQl0YXNrLT50a19zdGF0dXMgPSAtRUlPOworCQlyZXR1cm47CisJfQorCWlmICgheHBydC0+YWRkci5zaW5fcG9ydCkgeworCQl0YXNrLT50a19zdGF0dXMgPSAtRUlPOworCQlyZXR1cm47CisJfQorCWlmICgheHBydF9sb2NrX3dyaXRlKHhwcnQsIHRhc2spKQorCQlyZXR1cm47CisJaWYgKHhwcnRfY29ubmVjdGVkKHhwcnQpKQorCQlnb3RvIG91dF93cml0ZTsKKworCWlmICh0YXNrLT50a19ycXN0cCkKKwkJdGFzay0+dGtfcnFzdHAtPnJxX2J5dGVzX3NlbnQgPSAwOworCisJdGFzay0+dGtfdGltZW91dCA9IFJQQ19DT05ORUNUX1RJTUVPVVQ7CisJcnBjX3NsZWVwX29uKCZ4cHJ0LT5wZW5kaW5nLCB0YXNrLCB4cHJ0X2Nvbm5lY3Rfc3RhdHVzLCBOVUxMKTsKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoWFBSVF9DT05ORUNUSU5HLCAmeHBydC0+c29ja3N0YXRlKSkgeworCQkvKiBOb3RlOiBpZiB3ZSBhcmUgaGVyZSBkdWUgdG8gYSBkcm9wcGVkIGNvbm5lY3Rpb24KKwkJICogCSB3ZSBkZWxheSByZWNvbm5lY3RpbmcgYnkgUlBDX1JFRVNUQUJMSVNIX1RJTUVPVVQvSFoKKwkJICogCSBzZWNvbmRzCisJCSAqLworCQlpZiAoeHBydC0+c29jayAhPSBOVUxMKQorCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ4cHJ0LT5zb2NrX2Nvbm5lY3QsCisJCQkJCVJQQ19SRUVTVEFCTElTSF9USU1FT1VUKTsKKwkJZWxzZQorCQkJc2NoZWR1bGVfd29yaygmeHBydC0+c29ja19jb25uZWN0KTsKKwl9CisJcmV0dXJuOworIG91dF93cml0ZToKKwl4cHJ0X3JlbGVhc2Vfd3JpdGUoeHBydCwgdGFzayk7Cit9CisKKy8qCisgKiBXZSBhcnJpdmUgaGVyZSB3aGVuIGF3b2tlbiBmcm9tIHdhaXRpbmcgb24gY29ubmVjdGlvbiBlc3RhYmxpc2htZW50LgorICovCitzdGF0aWMgdm9pZAoreHBydF9jb25uZWN0X3N0YXR1cyhzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IHJwY194cHJ0CSp4cHJ0ID0gdGFzay0+dGtfeHBydDsKKworCWlmICh0YXNrLT50a19zdGF0dXMgPj0gMCkgeworCQlkcHJpbnRrKCJSUEM6ICU0ZCB4cHJ0X2Nvbm5lY3Rfc3RhdHVzOiBjb25uZWN0aW9uIGVzdGFibGlzaGVkXG4iLAorCQkJCXRhc2stPnRrX3BpZCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBpZiBzb2Z0IG1vdW50ZWQsIGp1c3QgY2F1c2UgdGhpcyBSUEMgdG8gZmFpbCAqLworCWlmIChSUENfSVNfU09GVCh0YXNrKSkKKwkJdGFzay0+dGtfc3RhdHVzID0gLUVJTzsKKworCXN3aXRjaCAodGFzay0+dGtfc3RhdHVzKSB7CisJY2FzZSAtRUNPTk5SRUZVU0VEOgorCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PVENPTk46CisJCXJldHVybjsKKwljYXNlIC1FVElNRURPVVQ6CisJCWRwcmludGsoIlJQQzogJTRkIHhwcnRfY29ubmVjdF9zdGF0dXM6IHRpbWVkIG91dFxuIiwKKwkJCQl0YXNrLT50a19waWQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIlJQQzogZXJyb3IgJWQgY29ubmVjdGluZyB0byBzZXJ2ZXIgJXNcbiIsCisJCQkJLXRhc2stPnRrX3N0YXR1cywgdGFzay0+dGtfY2xpZW50LT5jbF9zZXJ2ZXIpOworCX0KKwl4cHJ0X3JlbGVhc2Vfd3JpdGUoeHBydCwgdGFzayk7Cit9CisKKy8qCisgKiBMb29rIHVwIHRoZSBSUEMgcmVxdWVzdCBjb3JyZXNwb25kaW5nIHRvIGEgcmVwbHksIGFuZCB0aGVuIGxvY2sgaXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJwY19ycXN0ICoKK3hwcnRfbG9va3VwX3Jxc3Qoc3RydWN0IHJwY194cHJ0ICp4cHJ0LCB1MzIgeGlkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwlzdHJ1Y3QgcnBjX3Jxc3QJKnJlcSA9IE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJnhwcnQtPnJlY3YpIHsKKwkJc3RydWN0IHJwY19ycXN0ICplbnRyeSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgcnBjX3Jxc3QsIHJxX2xpc3QpOworCQlpZiAoZW50cnktPnJxX3hpZCA9PSB4aWQpIHsKKwkJCXJlcSA9IGVudHJ5OworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJlcTsKK30KKworLyoKKyAqIENvbXBsZXRlIHJlcGx5IHJlY2VpdmVkLgorICogVGhlIFRDUCBjb2RlIHJlbGllcyBvbiB1cyB0byByZW1vdmUgdGhlIHJlcXVlc3QgZnJvbSB4cHJ0LT5wZW5kaW5nLgorICovCitzdGF0aWMgdm9pZAoreHBydF9jb21wbGV0ZV9ycXN0KHN0cnVjdCBycGNfeHBydCAqeHBydCwgc3RydWN0IHJwY19ycXN0ICpyZXEsIGludCBjb3BpZWQpCit7CisJc3RydWN0IHJwY190YXNrCSp0YXNrID0gcmVxLT5ycV90YXNrOworCXN0cnVjdCBycGNfY2xudCAqY2xudCA9IHRhc2stPnRrX2NsaWVudDsKKworCS8qIEFkanVzdCBjb25nZXN0aW9uIHdpbmRvdyAqLworCWlmICgheHBydC0+bm9jb25nKSB7CisJCXVuc2lnbmVkIHRpbWVyID0gdGFzay0+dGtfbXNnLnJwY19wcm9jLT5wX3RpbWVyOworCQl4cHJ0X2FkanVzdF9jd25kKHhwcnQsIGNvcGllZCk7CisJCV9feHBydF9wdXRfY29uZyh4cHJ0LCByZXEpOworCQlpZiAodGltZXIpIHsKKwkJCWlmIChyZXEtPnJxX250cmFucyA9PSAxKQorCQkJCXJwY191cGRhdGVfcnR0KGNsbnQtPmNsX3J0dCwgdGltZXIsCisJCQkJCQkobG9uZylqaWZmaWVzIC0gcmVxLT5ycV94dGltZSk7CisJCQlycGNfc2V0X3RpbWVvKGNsbnQtPmNsX3J0dCwgdGltZXIsIHJlcS0+cnFfbnRyYW5zIC0gMSk7CisJCX0KKwl9CisKKyNpZmRlZiBSUENfUFJPRklMRQorCS8qIFByb2ZpbGUgb25seSByZWFkcyBmb3Igbm93ICovCisJaWYgKGNvcGllZCA+IDEwMjQpIHsKKwkJc3RhdGljIHVuc2lnbmVkIGxvbmcJbmV4dHN0YXQ7CisJCXN0YXRpYyB1bnNpZ25lZCBsb25nCXBrdF9ydHQsIHBrdF9sZW4sIHBrdF9jbnQ7CisKKwkJcGt0X2NudCsrOworCQlwa3RfbGVuICs9IHJlcS0+cnFfc2xlbiArIGNvcGllZDsKKwkJcGt0X3J0dCArPSBqaWZmaWVzIC0gcmVxLT5ycV94dGltZTsKKwkJaWYgKHRpbWVfYmVmb3JlKG5leHRzdGF0LCBqaWZmaWVzKSkgeworCQkJcHJpbnRrKCJSUEM6ICVsdSAlbGQgY3duZFxuIiwgamlmZmllcywgeHBydC0+Y3duZCk7CisJCQlwcmludGsoIlJQQzogJWxkICVsZCAlbGQgJWxkIHN0YXRcbiIsCisJCQkJCWppZmZpZXMsIHBrdF9jbnQsIHBrdF9sZW4sIHBrdF9ydHQpOworCQkJcGt0X3J0dCA9IHBrdF9sZW4gPSBwa3RfY250ID0gMDsKKwkJCW5leHRzdGF0ID0gamlmZmllcyArIDUgKiBIWjsKKwkJfQorCX0KKyNlbmRpZgorCisJZHByaW50aygiUlBDOiAlNGQgaGFzIGlucHV0ICglZCBieXRlcylcbiIsIHRhc2stPnRrX3BpZCwgY29waWVkKTsKKwlsaXN0X2RlbF9pbml0KCZyZXEtPnJxX2xpc3QpOworCXJlcS0+cnFfcmVjZWl2ZWQgPSByZXEtPnJxX3ByaXZhdGVfYnVmLmxlbiA9IGNvcGllZDsKKworCS8qIC4uLiBhbmQgd2FrZSB1cCB0aGUgcHJvY2Vzcy4gKi8KKwlycGNfd2FrZV91cF90YXNrKHRhc2spOworCXJldHVybjsKK30KKworc3RhdGljIHNpemVfdAorc2tiX3JlYWRfYml0cyhza2JfcmVhZGVyX3QgKmRlc2MsIHZvaWQgKnRvLCBzaXplX3QgbGVuKQoreworCWlmIChsZW4gPiBkZXNjLT5jb3VudCkKKwkJbGVuID0gZGVzYy0+Y291bnQ7CisJaWYgKHNrYl9jb3B5X2JpdHMoZGVzYy0+c2tiLCBkZXNjLT5vZmZzZXQsIHRvLCBsZW4pKQorCQlyZXR1cm4gMDsKKwlkZXNjLT5jb3VudCAtPSBsZW47CisJZGVzYy0+b2Zmc2V0ICs9IGxlbjsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc2l6ZV90Citza2JfcmVhZF9hbmRfY3N1bV9iaXRzKHNrYl9yZWFkZXJfdCAqZGVzYywgdm9pZCAqdG8sIHNpemVfdCBsZW4pCit7CisJdW5zaWduZWQgaW50IGNzdW0yLCBwb3M7CisKKwlpZiAobGVuID4gZGVzYy0+Y291bnQpCisJCWxlbiA9IGRlc2MtPmNvdW50OworCXBvcyA9IGRlc2MtPm9mZnNldDsKKwljc3VtMiA9IHNrYl9jb3B5X2FuZF9jc3VtX2JpdHMoZGVzYy0+c2tiLCBwb3MsIHRvLCBsZW4sIDApOworCWRlc2MtPmNzdW0gPSBjc3VtX2Jsb2NrX2FkZChkZXNjLT5jc3VtLCBjc3VtMiwgcG9zKTsKKwlkZXNjLT5jb3VudCAtPSBsZW47CisJZGVzYy0+b2Zmc2V0ICs9IGxlbjsKKwlyZXR1cm4gbGVuOworfQorCisvKgorICogV2UgaGF2ZSBzZXQgdGhpbmdzIHVwIHN1Y2ggdGhhdCB3ZSBwZXJmb3JtIHRoZSBjaGVja3N1bSBvZiB0aGUgVURQCisgKiBwYWNrZXQgaW4gcGFyYWxsZWwgd2l0aCB0aGUgY29waWVzIGludG8gdGhlIFJQQyBjbGllbnQgaW92ZWMuICAtRGF2ZU0KKyAqLworaW50Citjc3VtX3BhcnRpYWxfY29weV90b194ZHIoc3RydWN0IHhkcl9idWYgKnhkciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlza2JfcmVhZGVyX3QgZGVzYzsKKworCWRlc2Muc2tiID0gc2tiOworCWRlc2Mub2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCWRlc2MuY291bnQgPSBza2ItPmxlbiAtIGRlc2Mub2Zmc2V0OworCisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1VOTkVDRVNTQVJZKQorCQlnb3RvIG5vX2NoZWNrc3VtOworCisJZGVzYy5jc3VtID0gY3N1bV9wYXJ0aWFsKHNrYi0+ZGF0YSwgZGVzYy5vZmZzZXQsIHNrYi0+Y3N1bSk7CisJeGRyX3BhcnRpYWxfY29weV9mcm9tX3NrYih4ZHIsIDAsICZkZXNjLCBza2JfcmVhZF9hbmRfY3N1bV9iaXRzKTsKKwlpZiAoZGVzYy5vZmZzZXQgIT0gc2tiLT5sZW4pIHsKKwkJdW5zaWduZWQgaW50IGNzdW0yOworCQljc3VtMiA9IHNrYl9jaGVja3N1bShza2IsIGRlc2Mub2Zmc2V0LCBza2ItPmxlbiAtIGRlc2Mub2Zmc2V0LCAwKTsKKwkJZGVzYy5jc3VtID0gY3N1bV9ibG9ja19hZGQoZGVzYy5jc3VtLCBjc3VtMiwgZGVzYy5vZmZzZXQpOworCX0KKwlpZiAoZGVzYy5jb3VudCkKKwkJcmV0dXJuIC0xOworCWlmICgodW5zaWduZWQgc2hvcnQpY3N1bV9mb2xkKGRlc2MuY3N1bSkpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK25vX2NoZWNrc3VtOgorCXhkcl9wYXJ0aWFsX2NvcHlfZnJvbV9za2IoeGRyLCAwLCAmZGVzYywgc2tiX3JlYWRfYml0cyk7CisJaWYgKGRlc2MuY291bnQpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIElucHV0IGhhbmRsZXIgZm9yIFJQQyByZXBsaWVzLiBDYWxsZWQgZnJvbSBhIGJvdHRvbSBoYWxmIGFuZCBoZW5jZQorICogYXRvbWljLgorICovCitzdGF0aWMgdm9pZAordWRwX2RhdGFfcmVhZHkoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuKQoreworCXN0cnVjdCBycGNfdGFzawkqdGFzazsKKwlzdHJ1Y3QgcnBjX3hwcnQJKnhwcnQ7CisJc3RydWN0IHJwY19ycXN0ICpyb3ZyOworCXN0cnVjdCBza19idWZmCSpza2I7CisJaW50IGVyciwgcmVwc2l6ZSwgY29waWVkOworCXUzMiBfeGlkLCAqeHA7CisKKwlyZWFkX2xvY2soJnNrLT5za19jYWxsYmFja19sb2NrKTsKKwlkcHJpbnRrKCJSUEM6ICAgICAgdWRwX2RhdGFfcmVhZHkuLi5cbiIpOworCWlmICghKHhwcnQgPSB4cHJ0X2Zyb21fc29jayhzaykpKSB7CisJCXByaW50aygiUlBDOiAgICAgIHVkcF9kYXRhX3JlYWR5IHJlcXVlc3Qgbm90IGZvdW5kIVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWRwcmludGsoIlJQQzogICAgICB1ZHBfZGF0YV9yZWFkeSBjbGllbnQgJXBcbiIsIHhwcnQpOworCisJaWYgKChza2IgPSBza2JfcmVjdl9kYXRhZ3JhbShzaywgMCwgMSwgJmVycikpID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJaWYgKHhwcnQtPnNodXRkb3duKQorCQlnb3RvIGRyb3BpdDsKKworCXJlcHNpemUgPSBza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwlpZiAocmVwc2l6ZSA8IDQpIHsKKwkJcHJpbnRrKCJSUEM6IGltcG9zc2libGUgUlBDIHJlcGx5IHNpemUgJWQhXG4iLCByZXBzaXplKTsKKwkJZ290byBkcm9waXQ7CisJfQorCisJLyogQ29weSB0aGUgWElEIGZyb20gdGhlIHNrYi4uLiAqLworCXhwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLAorCQkJCXNpemVvZihfeGlkKSwgJl94aWQpOworCWlmICh4cCA9PSBOVUxMKQorCQlnb3RvIGRyb3BpdDsKKworCS8qIExvb2sgdXAgYW5kIGxvY2sgdGhlIHJlcXVlc3QgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gWElEICovCisJc3Bpbl9sb2NrKCZ4cHJ0LT5zb2NrX2xvY2spOworCXJvdnIgPSB4cHJ0X2xvb2t1cF9ycXN0KHhwcnQsICp4cCk7CisJaWYgKCFyb3ZyKQorCQlnb3RvIG91dF91bmxvY2s7CisJdGFzayA9IHJvdnItPnJxX3Rhc2s7CisKKwlkcHJpbnRrKCJSUEM6ICU0ZCByZWNlaXZlZCByZXBseVxuIiwgdGFzay0+dGtfcGlkKTsKKworCWlmICgoY29waWVkID0gcm92ci0+cnFfcHJpdmF0ZV9idWYuYnVmbGVuKSA+IHJlcHNpemUpCisJCWNvcGllZCA9IHJlcHNpemU7CisKKwkvKiBTdWNrIGl0IGludG8gdGhlIGlvdmVjLCB2ZXJpZnkgY2hlY2tzdW0gaWYgbm90IGRvbmUgYnkgaHcuICovCisJaWYgKGNzdW1fcGFydGlhbF9jb3B5X3RvX3hkcigmcm92ci0+cnFfcHJpdmF0ZV9idWYsIHNrYikpCisJCWdvdG8gb3V0X3VubG9jazsKKworCS8qIFNvbWV0aGluZyB3b3JrZWQuLi4gKi8KKwlkc3RfY29uZmlybShza2ItPmRzdCk7CisKKwl4cHJ0X2NvbXBsZXRlX3Jxc3QoeHBydCwgcm92ciwgY29waWVkKTsKKworIG91dF91bmxvY2s6CisJc3Bpbl91bmxvY2soJnhwcnQtPnNvY2tfbG9jayk7CisgZHJvcGl0OgorCXNrYl9mcmVlX2RhdGFncmFtKHNrLCBza2IpOworIG91dDoKKwlyZWFkX3VubG9jaygmc2stPnNrX2NhbGxiYWNrX2xvY2spOworfQorCisvKgorICogQ29weSBmcm9tIGFuIHNrYiBpbnRvIG1lbW9yeSBhbmQgc2hyaW5rIHRoZSBza2IuCisgKi8KK3N0YXRpYyBpbmxpbmUgc2l6ZV90Cit0Y3BfY29weV9kYXRhKHNrYl9yZWFkZXJfdCAqZGVzYywgdm9pZCAqcCwgc2l6ZV90IGxlbikKK3sKKwlpZiAobGVuID4gZGVzYy0+Y291bnQpCisJCWxlbiA9IGRlc2MtPmNvdW50OworCWlmIChza2JfY29weV9iaXRzKGRlc2MtPnNrYiwgZGVzYy0+b2Zmc2V0LCBwLCBsZW4pKQorCQlyZXR1cm4gMDsKKwlkZXNjLT5vZmZzZXQgKz0gbGVuOworCWRlc2MtPmNvdW50IC09IGxlbjsKKwlyZXR1cm4gbGVuOworfQorCisvKgorICogVENQIHJlYWQgZnJhZ21lbnQgbWFya2VyCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAordGNwX3JlYWRfZnJhZ2hkcihzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQsIHNrYl9yZWFkZXJfdCAqZGVzYykKK3sKKwlzaXplX3QgbGVuLCB1c2VkOworCWNoYXIgKnA7CisKKwlwID0gKChjaGFyICopICZ4cHJ0LT50Y3BfcmVjbSkgKyB4cHJ0LT50Y3Bfb2Zmc2V0OworCWxlbiA9IHNpemVvZih4cHJ0LT50Y3BfcmVjbSkgLSB4cHJ0LT50Y3Bfb2Zmc2V0OworCXVzZWQgPSB0Y3BfY29weV9kYXRhKGRlc2MsIHAsIGxlbik7CisJeHBydC0+dGNwX29mZnNldCArPSB1c2VkOworCWlmICh1c2VkICE9IGxlbikKKwkJcmV0dXJuOworCXhwcnQtPnRjcF9yZWNsZW4gPSBudG9obCh4cHJ0LT50Y3BfcmVjbSk7CisJaWYgKHhwcnQtPnRjcF9yZWNsZW4gJiAweDgwMDAwMDAwKQorCQl4cHJ0LT50Y3BfZmxhZ3MgfD0gWFBSVF9MQVNUX0ZSQUc7CisJZWxzZQorCQl4cHJ0LT50Y3BfZmxhZ3MgJj0gflhQUlRfTEFTVF9GUkFHOworCXhwcnQtPnRjcF9yZWNsZW4gJj0gMHg3ZmZmZmZmZjsKKwl4cHJ0LT50Y3BfZmxhZ3MgJj0gflhQUlRfQ09QWV9SRUNNOworCXhwcnQtPnRjcF9vZmZzZXQgPSAwOworCS8qIFNhbml0eSBjaGVjayBvZiB0aGUgcmVjb3JkIGxlbmd0aCAqLworCWlmICh4cHJ0LT50Y3BfcmVjbGVuIDwgNCkgeworCQlwcmludGsoS0VSTl9FUlIgIlJQQzogSW52YWxpZCBUQ1AgcmVjb3JkIGZyYWdtZW50IGxlbmd0aFxuIik7CisJCXhwcnRfZGlzY29ubmVjdCh4cHJ0KTsKKwl9CisJZHByaW50aygiUlBDOiAgICAgIHJlYWRpbmcgVENQIHJlY29yZCBmcmFnbWVudCBvZiBsZW5ndGggJWRcbiIsCisJCQl4cHJ0LT50Y3BfcmVjbGVuKTsKK30KKworc3RhdGljIHZvaWQKK3RjcF9jaGVja19yZWNtKHN0cnVjdCBycGNfeHBydCAqeHBydCkKK3sKKwlpZiAoeHBydC0+dGNwX29mZnNldCA9PSB4cHJ0LT50Y3BfcmVjbGVuKSB7CisJCXhwcnQtPnRjcF9mbGFncyB8PSBYUFJUX0NPUFlfUkVDTTsKKwkJeHBydC0+dGNwX29mZnNldCA9IDA7CisJCWlmICh4cHJ0LT50Y3BfZmxhZ3MgJiBYUFJUX0xBU1RfRlJBRykgeworCQkJeHBydC0+dGNwX2ZsYWdzICY9IH5YUFJUX0NPUFlfREFUQTsKKwkJCXhwcnQtPnRjcF9mbGFncyB8PSBYUFJUX0NPUFlfWElEOworCQkJeHBydC0+dGNwX2NvcGllZCA9IDA7CisJCX0KKwl9Cit9CisKKy8qCisgKiBUQ1AgcmVhZCB4aWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkCit0Y3BfcmVhZF94aWQoc3RydWN0IHJwY194cHJ0ICp4cHJ0LCBza2JfcmVhZGVyX3QgKmRlc2MpCit7CisJc2l6ZV90IGxlbiwgdXNlZDsKKwljaGFyICpwOworCisJbGVuID0gc2l6ZW9mKHhwcnQtPnRjcF94aWQpIC0geHBydC0+dGNwX29mZnNldDsKKwlkcHJpbnRrKCJSUEM6ICAgICAgcmVhZGluZyBYSUQgKCVadSBieXRlcylcbiIsIGxlbik7CisJcCA9ICgoY2hhciAqKSAmeHBydC0+dGNwX3hpZCkgKyB4cHJ0LT50Y3Bfb2Zmc2V0OworCXVzZWQgPSB0Y3BfY29weV9kYXRhKGRlc2MsIHAsIGxlbik7CisJeHBydC0+dGNwX29mZnNldCArPSB1c2VkOworCWlmICh1c2VkICE9IGxlbikKKwkJcmV0dXJuOworCXhwcnQtPnRjcF9mbGFncyAmPSB+WFBSVF9DT1BZX1hJRDsKKwl4cHJ0LT50Y3BfZmxhZ3MgfD0gWFBSVF9DT1BZX0RBVEE7CisJeHBydC0+dGNwX2NvcGllZCA9IDQ7CisJZHByaW50aygiUlBDOiAgICAgIHJlYWRpbmcgcmVwbHkgZm9yIFhJRCAlMDh4XG4iLAorCQkJCQkJbnRvaGwoeHBydC0+dGNwX3hpZCkpOworCXRjcF9jaGVja19yZWNtKHhwcnQpOworfQorCisvKgorICogVENQIHJlYWQgYW5kIGNvbXBsZXRlIHJlcXVlc3QKKyAqLworc3RhdGljIGlubGluZSB2b2lkCit0Y3BfcmVhZF9yZXF1ZXN0KHN0cnVjdCBycGNfeHBydCAqeHBydCwgc2tiX3JlYWRlcl90ICpkZXNjKQoreworCXN0cnVjdCBycGNfcnFzdCAqcmVxOworCXN0cnVjdCB4ZHJfYnVmICpyY3ZidWY7CisJc2l6ZV90IGxlbjsKKworCS8qIEZpbmQgYW5kIGxvY2sgdGhlIHJlcXVlc3QgY29ycmVzcG9uZGluZyB0byB0aGlzIHhpZCAqLworCXNwaW5fbG9jaygmeHBydC0+c29ja19sb2NrKTsKKwlyZXEgPSB4cHJ0X2xvb2t1cF9ycXN0KHhwcnQsIHhwcnQtPnRjcF94aWQpOworCWlmICghcmVxKSB7CisJCXhwcnQtPnRjcF9mbGFncyAmPSB+WFBSVF9DT1BZX0RBVEE7CisJCWRwcmludGsoIlJQQzogICAgICBYSUQgJTA4eCByZXF1ZXN0IG5vdCBmb3VuZCFcbiIsCisJCQkJbnRvaGwoeHBydC0+dGNwX3hpZCkpOworCQlzcGluX3VubG9jaygmeHBydC0+c29ja19sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCXJjdmJ1ZiA9ICZyZXEtPnJxX3ByaXZhdGVfYnVmOworCWxlbiA9IGRlc2MtPmNvdW50OworCWlmIChsZW4gPiB4cHJ0LT50Y3BfcmVjbGVuIC0geHBydC0+dGNwX29mZnNldCkgeworCQlza2JfcmVhZGVyX3QgbXlfZGVzYzsKKworCQlsZW4gPSB4cHJ0LT50Y3BfcmVjbGVuIC0geHBydC0+dGNwX29mZnNldDsKKwkJbWVtY3B5KCZteV9kZXNjLCBkZXNjLCBzaXplb2YobXlfZGVzYykpOworCQlteV9kZXNjLmNvdW50ID0gbGVuOworCQl4ZHJfcGFydGlhbF9jb3B5X2Zyb21fc2tiKHJjdmJ1ZiwgeHBydC0+dGNwX2NvcGllZCwKKwkJCQkJICAmbXlfZGVzYywgdGNwX2NvcHlfZGF0YSk7CisJCWRlc2MtPmNvdW50IC09IGxlbjsKKwkJZGVzYy0+b2Zmc2V0ICs9IGxlbjsKKwl9IGVsc2UKKwkJeGRyX3BhcnRpYWxfY29weV9mcm9tX3NrYihyY3ZidWYsIHhwcnQtPnRjcF9jb3BpZWQsCisJCQkJCSAgZGVzYywgdGNwX2NvcHlfZGF0YSk7CisJeHBydC0+dGNwX2NvcGllZCArPSBsZW47CisJeHBydC0+dGNwX29mZnNldCArPSBsZW47CisKKwlpZiAoeHBydC0+dGNwX2NvcGllZCA9PSByZXEtPnJxX3ByaXZhdGVfYnVmLmJ1ZmxlbikKKwkJeHBydC0+dGNwX2ZsYWdzICY9IH5YUFJUX0NPUFlfREFUQTsKKwllbHNlIGlmICh4cHJ0LT50Y3Bfb2Zmc2V0ID09IHhwcnQtPnRjcF9yZWNsZW4pIHsKKwkJaWYgKHhwcnQtPnRjcF9mbGFncyAmIFhQUlRfTEFTVF9GUkFHKQorCQkJeHBydC0+dGNwX2ZsYWdzICY9IH5YUFJUX0NPUFlfREFUQTsKKwl9CisKKwlpZiAoISh4cHJ0LT50Y3BfZmxhZ3MgJiBYUFJUX0NPUFlfREFUQSkpIHsKKwkJZHByaW50aygiUlBDOiAlNGQgcmVjZWl2ZWQgcmVwbHkgY29tcGxldGVcbiIsCisJCQkJcmVxLT5ycV90YXNrLT50a19waWQpOworCQl4cHJ0X2NvbXBsZXRlX3Jxc3QoeHBydCwgcmVxLCB4cHJ0LT50Y3BfY29waWVkKTsKKwl9CisJc3Bpbl91bmxvY2soJnhwcnQtPnNvY2tfbG9jayk7CisJdGNwX2NoZWNrX3JlY20oeHBydCk7Cit9CisKKy8qCisgKiBUQ1AgZGlzY2FyZCBleHRyYSBieXRlcyBmcm9tIGEgc2hvcnQgcmVhZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3RjcF9yZWFkX2Rpc2NhcmQoc3RydWN0IHJwY194cHJ0ICp4cHJ0LCBza2JfcmVhZGVyX3QgKmRlc2MpCit7CisJc2l6ZV90IGxlbjsKKworCWxlbiA9IHhwcnQtPnRjcF9yZWNsZW4gLSB4cHJ0LT50Y3Bfb2Zmc2V0OworCWlmIChsZW4gPiBkZXNjLT5jb3VudCkKKwkJbGVuID0gZGVzYy0+Y291bnQ7CisJZGVzYy0+Y291bnQgLT0gbGVuOworCWRlc2MtPm9mZnNldCArPSBsZW47CisJeHBydC0+dGNwX29mZnNldCArPSBsZW47CisJdGNwX2NoZWNrX3JlY20oeHBydCk7Cit9CisKKy8qCisgKiBUQ1AgcmVjb3JkIHJlY2VpdmUgcm91dGluZQorICogV2UgZmlyc3QgaGF2ZSB0byBncmFiIHRoZSByZWNvcmQgbWFya2VyLCB0aGVuIHRoZSBYSUQsIHRoZW4gdGhlIGRhdGEuCisgKi8KK3N0YXRpYyBpbnQKK3RjcF9kYXRhX3JlY3YocmVhZF9kZXNjcmlwdG9yX3QgKnJkX2Rlc2MsIHN0cnVjdCBza19idWZmICpza2IsCisJCXVuc2lnbmVkIGludCBvZmZzZXQsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHJwY194cHJ0ICp4cHJ0ID0gcmRfZGVzYy0+YXJnLmRhdGE7CisJc2tiX3JlYWRlcl90IGRlc2MgPSB7CisJCS5za2IJPSBza2IsCisJCS5vZmZzZXQJPSBvZmZzZXQsCisJCS5jb3VudAk9IGxlbiwKKwkJLmNzdW0JPSAwCisgICAgICAgCX07CisKKwlkcHJpbnRrKCJSUEM6ICAgICAgdGNwX2RhdGFfcmVjdlxuIik7CisJZG8geworCQkvKiBSZWFkIGluIGEgbmV3IGZyYWdtZW50IG1hcmtlciBpZiBuZWNlc3NhcnkgKi8KKwkJLyogQ2FuIHdlIGV2ZXIgcmVhbGx5IGV4cGVjdCB0byBnZXQgY29tcGxldGVseSBlbXB0eSBmcmFnbWVudHM/ICovCisJCWlmICh4cHJ0LT50Y3BfZmxhZ3MgJiBYUFJUX0NPUFlfUkVDTSkgeworCQkJdGNwX3JlYWRfZnJhZ2hkcih4cHJ0LCAmZGVzYyk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBSZWFkIGluIHRoZSB4aWQgaWYgbmVjZXNzYXJ5ICovCisJCWlmICh4cHJ0LT50Y3BfZmxhZ3MgJiBYUFJUX0NPUFlfWElEKSB7CisJCQl0Y3BfcmVhZF94aWQoeHBydCwgJmRlc2MpOworCQkJY29udGludWU7CisJCX0KKwkJLyogUmVhZCBpbiB0aGUgcmVxdWVzdCBkYXRhICovCisJCWlmICh4cHJ0LT50Y3BfZmxhZ3MgJiBYUFJUX0NPUFlfREFUQSkgeworCQkJdGNwX3JlYWRfcmVxdWVzdCh4cHJ0LCAmZGVzYyk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBTa2lwIG92ZXIgYW55IHRyYWlsaW5nIGJ5dGVzIG9uIHNob3J0IHJlYWRzICovCisJCXRjcF9yZWFkX2Rpc2NhcmQoeHBydCwgJmRlc2MpOworCX0gd2hpbGUgKGRlc2MuY291bnQpOworCWRwcmludGsoIlJQQzogICAgICB0Y3BfZGF0YV9yZWN2IGRvbmVcbiIpOworCXJldHVybiBsZW4gLSBkZXNjLmNvdW50OworfQorCitzdGF0aWMgdm9pZCB0Y3BfZGF0YV9yZWFkeShzdHJ1Y3Qgc29jayAqc2ssIGludCBieXRlcykKK3sKKwlzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQ7CisJcmVhZF9kZXNjcmlwdG9yX3QgcmRfZGVzYzsKKworCXJlYWRfbG9jaygmc2stPnNrX2NhbGxiYWNrX2xvY2spOworCWRwcmludGsoIlJQQzogICAgICB0Y3BfZGF0YV9yZWFkeS4uLlxuIik7CisJaWYgKCEoeHBydCA9IHhwcnRfZnJvbV9zb2NrKHNrKSkpIHsKKwkJcHJpbnRrKCJSUEM6ICAgICAgdGNwX2RhdGFfcmVhZHkgc29ja2V0IGluZm8gbm90IGZvdW5kIVxuIik7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoeHBydC0+c2h1dGRvd24pCisJCWdvdG8gb3V0OworCisJLyogV2UgdXNlIHJkX2Rlc2MgdG8gcGFzcyBzdHJ1Y3QgeHBydCB0byB0Y3BfZGF0YV9yZWN2ICovCisJcmRfZGVzYy5hcmcuZGF0YSA9IHhwcnQ7CisJcmRfZGVzYy5jb3VudCA9IDY1NTM2OworCXRjcF9yZWFkX3NvY2soc2ssICZyZF9kZXNjLCB0Y3BfZGF0YV9yZWN2KTsKK291dDoKKwlyZWFkX3VubG9jaygmc2stPnNrX2NhbGxiYWNrX2xvY2spOworfQorCitzdGF0aWMgdm9pZAordGNwX3N0YXRlX2NoYW5nZShzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHJwY194cHJ0CSp4cHJ0OworCisJcmVhZF9sb2NrKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CisJaWYgKCEoeHBydCA9IHhwcnRfZnJvbV9zb2NrKHNrKSkpCisJCWdvdG8gb3V0OworCWRwcmludGsoIlJQQzogICAgICB0Y3Bfc3RhdGVfY2hhbmdlIGNsaWVudCAlcC4uLlxuIiwgeHBydCk7CisJZHByaW50aygiUlBDOiAgICAgIHN0YXRlICV4IGNvbm4gJWQgZGVhZCAlZCB6YXBwZWQgJWRcbiIsCisJCQkJc2stPnNrX3N0YXRlLCB4cHJ0X2Nvbm5lY3RlZCh4cHJ0KSwKKwkJCQlzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCksCisJCQkJc29ja19mbGFnKHNrLCBTT0NLX1pBUFBFRCkpOworCisJc3dpdGNoIChzay0+c2tfc3RhdGUpIHsKKwljYXNlIFRDUF9FU1RBQkxJU0hFRDoKKwkJc3Bpbl9sb2NrX2JoKCZ4cHJ0LT5zb2NrX2xvY2spOworCQlpZiAoIXhwcnRfdGVzdF9hbmRfc2V0X2Nvbm5lY3RlZCh4cHJ0KSkgeworCQkJLyogUmVzZXQgVENQIHJlY29yZCBpbmZvICovCisJCQl4cHJ0LT50Y3Bfb2Zmc2V0ID0gMDsKKwkJCXhwcnQtPnRjcF9yZWNsZW4gPSAwOworCQkJeHBydC0+dGNwX2NvcGllZCA9IDA7CisJCQl4cHJ0LT50Y3BfZmxhZ3MgPSBYUFJUX0NPUFlfUkVDTSB8IFhQUlRfQ09QWV9YSUQ7CisJCQlycGNfd2FrZV91cCgmeHBydC0+cGVuZGluZyk7CisJCX0KKwkJc3Bpbl91bmxvY2tfYmgoJnhwcnQtPnNvY2tfbG9jayk7CisJCWJyZWFrOworCWNhc2UgVENQX1NZTl9TRU5UOgorCWNhc2UgVENQX1NZTl9SRUNWOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoeHBydF90ZXN0X2FuZF9jbGVhcl9jb25uZWN0ZWQoeHBydCkpCisJCQlycGNfd2FrZV91cF9zdGF0dXMoJnhwcnQtPnBlbmRpbmcsIC1FTk9UQ09OTik7CisJCWJyZWFrOworCX0KKyBvdXQ6CisJcmVhZF91bmxvY2soJnNrLT5za19jYWxsYmFja19sb2NrKTsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIG1vcmUgb3V0cHV0IGJ1ZmZlciBzcGFjZSBpcyBhdmFpbGFibGUgZm9yIHRoaXMgc29ja2V0LgorICogV2UgdHJ5IG5vdCB0byB3YWtlIG91ciB3cml0ZXJzIHVudGlsIHRoZXkgY2FuIG1ha2UgInNpZ25pZmljYW50IgorICogcHJvZ3Jlc3MsIG90aGVyd2lzZSB3ZSdsbCB3YXN0ZSByZXNvdXJjZXMgdGhyYXNoaW5nIHNvY2tfc2VuZG1zZworICogd2l0aCBhIGJ1bmNoIG9mIHNtYWxsIHJlcXVlc3RzLgorICovCitzdGF0aWMgdm9pZAoreHBydF93cml0ZV9zcGFjZShzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHJwY194cHJ0CSp4cHJ0OworCXN0cnVjdCBzb2NrZXQJKnNvY2s7CisKKwlyZWFkX2xvY2soJnNrLT5za19jYWxsYmFja19sb2NrKTsKKwlpZiAoISh4cHJ0ID0geHBydF9mcm9tX3NvY2soc2spKSB8fCAhKHNvY2sgPSBzay0+c2tfc29ja2V0KSkKKwkJZ290byBvdXQ7CisJaWYgKHhwcnQtPnNodXRkb3duKQorCQlnb3RvIG91dDsKKworCS8qIFdhaXQgdW50aWwgd2UgaGF2ZSBlbm91Z2ggc29ja2V0IG1lbW9yeSAqLworCWlmICh4cHJ0LT5zdHJlYW0pIHsKKwkJLyogZnJvbSBuZXQvY29yZS9zdHJlYW0uYzpza19zdHJlYW1fd3JpdGVfc3BhY2UgKi8KKwkJaWYgKHNrX3N0cmVhbV93c3BhY2Uoc2spIDwgc2tfc3RyZWFtX21pbl93c3BhY2Uoc2spKQorCQkJZ290byBvdXQ7CisJfSBlbHNlIHsKKwkJLyogZnJvbSBuZXQvY29yZS9zb2NrLmM6c29ja19kZWZfd3JpdGVfc3BhY2UgKi8KKwkJaWYgKCFzb2NrX3dyaXRlYWJsZShzaykpCisJCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChTT0NLX05PU1BBQ0UsICZzb2NrLT5mbGFncykpCisJCWdvdG8gb3V0OworCisJc3Bpbl9sb2NrX2JoKCZ4cHJ0LT5zb2NrX2xvY2spOworCWlmICh4cHJ0LT5zbmRfdGFzaykKKwkJcnBjX3dha2VfdXBfdGFzayh4cHJ0LT5zbmRfdGFzayk7CisJc3Bpbl91bmxvY2tfYmgoJnhwcnQtPnNvY2tfbG9jayk7CitvdXQ6CisJcmVhZF91bmxvY2soJnNrLT5za19jYWxsYmFja19sb2NrKTsKK30KKworLyoKKyAqIFJQQyByZWNlaXZlIHRpbWVvdXQgaGFuZGxlci4KKyAqLworc3RhdGljIHZvaWQKK3hwcnRfdGltZXIoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBycGNfcnFzdAkqcmVxID0gdGFzay0+dGtfcnFzdHA7CisJc3RydWN0IHJwY194cHJ0ICp4cHJ0ID0gcmVxLT5ycV94cHJ0OworCisJc3Bpbl9sb2NrKCZ4cHJ0LT5zb2NrX2xvY2spOworCWlmIChyZXEtPnJxX3JlY2VpdmVkKQorCQlnb3RvIG91dDsKKworCXhwcnRfYWRqdXN0X2N3bmQocmVxLT5ycV94cHJ0LCAtRVRJTUVET1VUKTsKKwlfX3hwcnRfcHV0X2NvbmcoeHBydCwgcmVxKTsKKworCWRwcmludGsoIlJQQzogJTRkIHhwcnRfdGltZXIgKCVzIHJlcXVlc3QpXG4iLAorCQl0YXNrLT50a19waWQsIHJlcSA/ICJwZW5kaW5nIiA6ICJiYWNrbG9nZ2VkIik7CisKKwl0YXNrLT50a19zdGF0dXMgID0gLUVUSU1FRE9VVDsKK291dDoKKwl0YXNrLT50a190aW1lb3V0ID0gMDsKKwlycGNfd2FrZV91cF90YXNrKHRhc2spOworCXNwaW5fdW5sb2NrKCZ4cHJ0LT5zb2NrX2xvY2spOworfQorCisvKgorICogUGxhY2UgdGhlIGFjdHVhbCBSUEMgY2FsbC4KKyAqIFdlIGhhdmUgdG8gY29weSB0aGUgaW92ZWMgYmVjYXVzZSBzZW5kbXNnIGZpZGRsZXMgd2l0aCBpdHMgY29udGVudHMuCisgKi8KK2ludAoreHBydF9wcmVwYXJlX3RyYW5zbWl0KHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgcnBjX3Jxc3QJKnJlcSA9IHRhc2stPnRrX3Jxc3RwOworCXN0cnVjdCBycGNfeHBydAkqeHBydCA9IHJlcS0+cnFfeHBydDsKKwlpbnQgZXJyID0gMDsKKworCWRwcmludGsoIlJQQzogJTRkIHhwcnRfcHJlcGFyZV90cmFuc21pdFxuIiwgdGFzay0+dGtfcGlkKTsKKworCWlmICh4cHJ0LT5zaHV0ZG93bikKKwkJcmV0dXJuIC1FSU87CisKKwlzcGluX2xvY2tfYmgoJnhwcnQtPnNvY2tfbG9jayk7CisJaWYgKHJlcS0+cnFfcmVjZWl2ZWQgJiYgIXJlcS0+cnFfYnl0ZXNfc2VudCkgeworCQllcnIgPSByZXEtPnJxX3JlY2VpdmVkOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCWlmICghX194cHJ0X2xvY2tfd3JpdGUoeHBydCwgdGFzaykpIHsKKwkJZXJyID0gLUVBR0FJTjsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWlmICgheHBydF9jb25uZWN0ZWQoeHBydCkpIHsKKwkJZXJyID0gLUVOT1RDT05OOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorb3V0X3VubG9jazoKKwlzcGluX3VubG9ja19iaCgmeHBydC0+c29ja19sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCit2b2lkCit4cHJ0X3RyYW5zbWl0KHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQgPSB0YXNrLT50a19jbGllbnQ7CisJc3RydWN0IHJwY19ycXN0CSpyZXEgPSB0YXNrLT50a19ycXN0cDsKKwlzdHJ1Y3QgcnBjX3hwcnQJKnhwcnQgPSByZXEtPnJxX3hwcnQ7CisJaW50IHN0YXR1cywgcmV0cnkgPSAwOworCisKKwlkcHJpbnRrKCJSUEM6ICU0ZCB4cHJ0X3RyYW5zbWl0KCV1KVxuIiwgdGFzay0+dGtfcGlkLCByZXEtPnJxX3NsZW4pOworCisJLyogc2V0IHVwIGV2ZXJ5dGhpbmcgYXMgbmVlZGVkLiAqLworCS8qIFdyaXRlIHRoZSByZWNvcmQgbWFya2VyICovCisJaWYgKHhwcnQtPnN0cmVhbSkgeworCQl1MzIJKm1hcmtlciA9IHJlcS0+cnFfc3ZlY1swXS5pb3ZfYmFzZTsKKworCQkqbWFya2VyID0gaHRvbmwoMHg4MDAwMDAwMHwocmVxLT5ycV9zbGVuLXNpemVvZigqbWFya2VyKSkpOworCX0KKworCXNtcF9ybWIoKTsKKwlpZiAoIXJlcS0+cnFfcmVjZWl2ZWQpIHsKKwkJaWYgKGxpc3RfZW1wdHkoJnJlcS0+cnFfbGlzdCkpIHsKKwkJCXNwaW5fbG9ja19iaCgmeHBydC0+c29ja19sb2NrKTsKKwkJCS8qIFVwZGF0ZSB0aGUgc29mdGlycSByZWNlaXZlIGJ1ZmZlciAqLworCQkJbWVtY3B5KCZyZXEtPnJxX3ByaXZhdGVfYnVmLCAmcmVxLT5ycV9yY3ZfYnVmLAorCQkJCQlzaXplb2YocmVxLT5ycV9wcml2YXRlX2J1ZikpOworCQkJLyogQWRkIHJlcXVlc3QgdG8gdGhlIHJlY2VpdmUgbGlzdCAqLworCQkJbGlzdF9hZGRfdGFpbCgmcmVxLT5ycV9saXN0LCAmeHBydC0+cmVjdik7CisJCQlzcGluX3VubG9ja19iaCgmeHBydC0+c29ja19sb2NrKTsKKwkJCXhwcnRfcmVzZXRfbWFqb3J0aW1lbyhyZXEpOworCQl9CisJfSBlbHNlIGlmICghcmVxLT5ycV9ieXRlc19zZW50KQorCQlyZXR1cm47CisKKwkvKiBDb250aW51ZSB0cmFuc21pdHRpbmcgdGhlIHBhY2tldC9yZWNvcmQuIFdlIG11c3QgYmUgY2FyZWZ1bAorCSAqIHRvIGNvcGUgd2l0aCB3cml0ZXNwYWNlIGNhbGxiYWNrcyBhcnJpdmluZyBfYWZ0ZXJfIHdlIGhhdmUKKwkgKiBjYWxsZWQgeHBydF9zZW5kbXNnKCkuCisJICovCisJd2hpbGUgKDEpIHsKKwkJcmVxLT5ycV94dGltZSA9IGppZmZpZXM7CisJCXN0YXR1cyA9IHhwcnRfc2VuZG1zZyh4cHJ0LCByZXEpOworCisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJaWYgKHhwcnQtPnN0cmVhbSkgeworCQkJcmVxLT5ycV9ieXRlc19zZW50ICs9IHN0YXR1czsKKworCQkJLyogSWYgd2UndmUgc2VudCB0aGUgZW50aXJlIHBhY2tldCwgaW1tZWRpYXRlbHkKKwkJCSAqIHJlc2V0IHRoZSBjb3VudCBvZiBieXRlcyBzZW50LiAqLworCQkJaWYgKHJlcS0+cnFfYnl0ZXNfc2VudCA+PSByZXEtPnJxX3NsZW4pIHsKKwkJCQlyZXEtPnJxX2J5dGVzX3NlbnQgPSAwOworCQkJCWdvdG8gb3V0X3JlY2VpdmU7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoc3RhdHVzID49IHJlcS0+cnFfc2xlbikKKwkJCQlnb3RvIG91dF9yZWNlaXZlOworCQkJc3RhdHVzID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisKKwkJZHByaW50aygiUlBDOiAlNGQgeG1pdCBpbmNvbXBsZXRlICglZCBsZWZ0IG9mICVkKVxuIiwKKwkJCQl0YXNrLT50a19waWQsIHJlcS0+cnFfc2xlbiAtIHJlcS0+cnFfYnl0ZXNfc2VudCwKKwkJCQlyZXEtPnJxX3NsZW4pOworCisJCXN0YXR1cyA9IC1FQUdBSU47CisJCWlmIChyZXRyeSsrID4gNTApCisJCQlicmVhazsKKwl9CisKKwkvKiBOb3RlOiBhdCB0aGlzIHBvaW50LCB0YXNrLT50a19zbGVlcGluZyBoYXMgbm90IHlldCBiZWVuIHNldCwKKwkgKgkgaGVuY2UgdGhlcmUgaXMgbm8gZGFuZ2VyIG9mIHRoZSB3YWtpbmcgdXAgdGFzayBiZWluZyBwdXQgb24KKwkgKgkgc2NoZWRxLCBhbmQgYmVpbmcgcGlja2VkIHVwIGJ5IGEgcGFyYWxsZWwgcnVuIG9mIHJwY2lvZCgpLgorCSAqLworCXRhc2stPnRrX3N0YXR1cyA9IHN0YXR1czsKKworCXN3aXRjaCAoc3RhdHVzKSB7CisJY2FzZSAtRUFHQUlOOgorCQlpZiAodGVzdF9iaXQoU09DS19BU1lOQ19OT1NQQUNFLCAmeHBydC0+c29jay0+ZmxhZ3MpKSB7CisJCQkvKiBQcm90ZWN0IGFnYWluc3QgcmFjZXMgd2l0aCB4cHJ0X3dyaXRlX3NwYWNlICovCisJCQlzcGluX2xvY2tfYmgoJnhwcnQtPnNvY2tfbG9jayk7CisJCQkvKiBEb24ndCByYWNlIHdpdGggZGlzY29ubmVjdCAqLworCQkJaWYgKCF4cHJ0X2Nvbm5lY3RlZCh4cHJ0KSkKKwkJCQl0YXNrLT50a19zdGF0dXMgPSAtRU5PVENPTk47CisJCQllbHNlIGlmICh0ZXN0X2JpdChTT0NLX05PU1BBQ0UsICZ4cHJ0LT5zb2NrLT5mbGFncykpIHsKKwkJCQl0YXNrLT50a190aW1lb3V0ID0gcmVxLT5ycV90aW1lb3V0OworCQkJCXJwY19zbGVlcF9vbigmeHBydC0+cGVuZGluZywgdGFzaywgTlVMTCwgTlVMTCk7CisJCQl9CisJCQlzcGluX3VubG9ja19iaCgmeHBydC0+c29ja19sb2NrKTsKKwkJCXJldHVybjsKKwkJfQorCQkvKiBLZWVwIGhvbGRpbmcgdGhlIHNvY2tldCBpZiBpdCBpcyBibG9ja2VkICovCisJCXJwY19kZWxheSh0YXNrLCBIWj4+NCk7CisJCXJldHVybjsKKwljYXNlIC1FQ09OTlJFRlVTRUQ6CisJCXRhc2stPnRrX3RpbWVvdXQgPSBSUENfUkVFU1RBQkxJU0hfVElNRU9VVDsKKwkJcnBjX3NsZWVwX29uKCZ4cHJ0LT5zZW5kaW5nLCB0YXNrLCBOVUxMLCBOVUxMKTsKKwljYXNlIC1FTk9UQ09OTjoKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWlmICh4cHJ0LT5zdHJlYW0pCisJCQl4cHJ0X2Rpc2Nvbm5lY3QoeHBydCk7CisJfQorCXhwcnRfcmVsZWFzZV93cml0ZSh4cHJ0LCB0YXNrKTsKKwlyZXR1cm47Cisgb3V0X3JlY2VpdmU6CisJZHByaW50aygiUlBDOiAlNGQgeG1pdCBjb21wbGV0ZVxuIiwgdGFzay0+dGtfcGlkKTsKKwkvKiBTZXQgdGhlIHRhc2sncyByZWNlaXZlIHRpbWVvdXQgdmFsdWUgKi8KKwlzcGluX2xvY2tfYmgoJnhwcnQtPnNvY2tfbG9jayk7CisJaWYgKCF4cHJ0LT5ub2NvbmcpIHsKKwkJaW50IHRpbWVyID0gdGFzay0+dGtfbXNnLnJwY19wcm9jLT5wX3RpbWVyOworCQl0YXNrLT50a190aW1lb3V0ID0gcnBjX2NhbGNfcnRvKGNsbnQtPmNsX3J0dCwgdGltZXIpOworCQl0YXNrLT50a190aW1lb3V0IDw8PSBycGNfbnRpbWVvKGNsbnQtPmNsX3J0dCwgdGltZXIpICsgcmVxLT5ycV9yZXRyaWVzOworCQlpZiAodGFzay0+dGtfdGltZW91dCA+IHhwcnQtPnRpbWVvdXQudG9fbWF4dmFsIHx8IHRhc2stPnRrX3RpbWVvdXQgPT0gMCkKKwkJCXRhc2stPnRrX3RpbWVvdXQgPSB4cHJ0LT50aW1lb3V0LnRvX21heHZhbDsKKwl9IGVsc2UKKwkJdGFzay0+dGtfdGltZW91dCA9IHJlcS0+cnFfdGltZW91dDsKKwkvKiBEb24ndCByYWNlIHdpdGggZGlzY29ubmVjdCAqLworCWlmICgheHBydF9jb25uZWN0ZWQoeHBydCkpCisJCXRhc2stPnRrX3N0YXR1cyA9IC1FTk9UQ09OTjsKKwllbHNlIGlmICghcmVxLT5ycV9yZWNlaXZlZCkKKwkJcnBjX3NsZWVwX29uKCZ4cHJ0LT5wZW5kaW5nLCB0YXNrLCBOVUxMLCB4cHJ0X3RpbWVyKTsKKwlfX3hwcnRfcmVsZWFzZV93cml0ZSh4cHJ0LCB0YXNrKTsKKwlzcGluX3VubG9ja19iaCgmeHBydC0+c29ja19sb2NrKTsKK30KKworLyoKKyAqIFJlc2VydmUgYW4gUlBDIGNhbGwgc2xvdC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitkb194cHJ0X3Jlc2VydmUoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBycGNfeHBydAkqeHBydCA9IHRhc2stPnRrX3hwcnQ7CisKKwl0YXNrLT50a19zdGF0dXMgPSAwOworCWlmICh0YXNrLT50a19ycXN0cCkKKwkJcmV0dXJuOworCWlmICghbGlzdF9lbXB0eSgmeHBydC0+ZnJlZSkpIHsKKwkJc3RydWN0IHJwY19ycXN0CSpyZXEgPSBsaXN0X2VudHJ5KHhwcnQtPmZyZWUubmV4dCwgc3RydWN0IHJwY19ycXN0LCBycV9saXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmcmVxLT5ycV9saXN0KTsKKwkJdGFzay0+dGtfcnFzdHAgPSByZXE7CisJCXhwcnRfcmVxdWVzdF9pbml0KHRhc2ssIHhwcnQpOworCQlyZXR1cm47CisJfQorCWRwcmludGsoIlJQQzogICAgICB3YWl0aW5nIGZvciByZXF1ZXN0IHNsb3RcbiIpOworCXRhc2stPnRrX3N0YXR1cyA9IC1FQUdBSU47CisJdGFzay0+dGtfdGltZW91dCA9IDA7CisJcnBjX3NsZWVwX29uKCZ4cHJ0LT5iYWNrbG9nLCB0YXNrLCBOVUxMLCBOVUxMKTsKK30KKwordm9pZAoreHBydF9yZXNlcnZlKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgcnBjX3hwcnQJKnhwcnQgPSB0YXNrLT50a194cHJ0OworCisJdGFzay0+dGtfc3RhdHVzID0gLUVJTzsKKwlpZiAoIXhwcnQtPnNodXRkb3duKSB7CisJCXNwaW5fbG9jaygmeHBydC0+eHBydF9sb2NrKTsKKwkJZG9feHBydF9yZXNlcnZlKHRhc2spOworCQlzcGluX3VubG9jaygmeHBydC0+eHBydF9sb2NrKTsKKwkJaWYgKHRhc2stPnRrX3Jxc3RwKQorCQkJZGVsX3RpbWVyX3N5bmMoJnhwcnQtPnRpbWVyKTsKKwl9Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhICd1bmlxdWUnIFhJRAorICovCitzdGF0aWMgaW5saW5lIHUzMiB4cHJ0X2FsbG9jX3hpZChzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQpCit7CisJcmV0dXJuIHhwcnQtPnhpZCsrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgeHBydF9pbml0X3hpZChzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQpCit7CisJZ2V0X3JhbmRvbV9ieXRlcygmeHBydC0+eGlkLCBzaXplb2YoeHBydC0+eGlkKSk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIFJQQyByZXF1ZXN0CisgKi8KK3N0YXRpYyB2b2lkCit4cHJ0X3JlcXVlc3RfaW5pdChzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIHN0cnVjdCBycGNfeHBydCAqeHBydCkKK3sKKwlzdHJ1Y3QgcnBjX3Jxc3QJKnJlcSA9IHRhc2stPnRrX3Jxc3RwOworCisJcmVxLT5ycV90aW1lb3V0ID0geHBydC0+dGltZW91dC50b19pbml0dmFsOworCXJlcS0+cnFfdGFzawk9IHRhc2s7CisJcmVxLT5ycV94cHJ0ICAgID0geHBydDsKKwlyZXEtPnJxX3hpZCAgICAgPSB4cHJ0X2FsbG9jX3hpZCh4cHJ0KTsKKwlkcHJpbnRrKCJSUEM6ICU0ZCByZXNlcnZlZCByZXEgJXAgeGlkICUwOHhcbiIsIHRhc2stPnRrX3BpZCwKKwkJCXJlcSwgbnRvaGwocmVxLT5ycV94aWQpKTsKK30KKworLyoKKyAqIFJlbGVhc2UgYW4gUlBDIGNhbGwgc2xvdAorICovCit2b2lkCit4cHJ0X3JlbGVhc2Uoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBycGNfeHBydAkqeHBydCA9IHRhc2stPnRrX3hwcnQ7CisJc3RydWN0IHJwY19ycXN0CSpyZXE7CisKKwlpZiAoIShyZXEgPSB0YXNrLT50a19ycXN0cCkpCisJCXJldHVybjsKKwlzcGluX2xvY2tfYmgoJnhwcnQtPnNvY2tfbG9jayk7CisJX194cHJ0X3JlbGVhc2Vfd3JpdGUoeHBydCwgdGFzayk7CisJX194cHJ0X3B1dF9jb25nKHhwcnQsIHJlcSk7CisJaWYgKCFsaXN0X2VtcHR5KCZyZXEtPnJxX2xpc3QpKQorCQlsaXN0X2RlbCgmcmVxLT5ycV9saXN0KTsKKwl4cHJ0LT5sYXN0X3VzZWQgPSBqaWZmaWVzOworCWlmIChsaXN0X2VtcHR5KCZ4cHJ0LT5yZWN2KSAmJiAheHBydC0+c2h1dGRvd24pCisJCW1vZF90aW1lcigmeHBydC0+dGltZXIsIHhwcnQtPmxhc3RfdXNlZCArIFhQUlRfSURMRV9USU1FT1VUKTsKKwlzcGluX3VubG9ja19iaCgmeHBydC0+c29ja19sb2NrKTsKKwl0YXNrLT50a19ycXN0cCA9IE5VTEw7CisJbWVtc2V0KHJlcSwgMCwgc2l6ZW9mKCpyZXEpKTsJLyogbWFyayB1bnVzZWQgKi8KKworCWRwcmludGsoIlJQQzogJTRkIHJlbGVhc2UgcmVxdWVzdCAlcFxuIiwgdGFzay0+dGtfcGlkLCByZXEpOworCisJc3Bpbl9sb2NrKCZ4cHJ0LT54cHJ0X2xvY2spOworCWxpc3RfYWRkKCZyZXEtPnJxX2xpc3QsICZ4cHJ0LT5mcmVlKTsKKwl4cHJ0X2NsZWFyX2JhY2tsb2coeHBydCk7CisJc3Bpbl91bmxvY2soJnhwcnQtPnhwcnRfbG9jayk7Cit9CisKKy8qCisgKiBTZXQgZGVmYXVsdCB0aW1lb3V0IHBhcmFtZXRlcnMKKyAqLworc3RhdGljIHZvaWQKK3hwcnRfZGVmYXVsdF90aW1lb3V0KHN0cnVjdCBycGNfdGltZW91dCAqdG8sIGludCBwcm90bykKK3sKKwlpZiAocHJvdG8gPT0gSVBQUk9UT19VRFApCisJCXhwcnRfc2V0X3RpbWVvdXQodG8sIDUsICA1ICogSFopOworCWVsc2UKKwkJeHBydF9zZXRfdGltZW91dCh0bywgNSwgNjAgKiBIWik7Cit9CisKKy8qCisgKiBTZXQgY29uc3RhbnQgdGltZW91dAorICovCit2b2lkCit4cHJ0X3NldF90aW1lb3V0KHN0cnVjdCBycGNfdGltZW91dCAqdG8sIHVuc2lnbmVkIGludCByZXRyLCB1bnNpZ25lZCBsb25nIGluY3IpCit7CisJdG8tPnRvX2luaXR2YWwgICA9IAorCXRvLT50b19pbmNyZW1lbnQgPSBpbmNyOworCXRvLT50b19tYXh2YWwgICAgPSBpbmNyICogcmV0cjsKKwl0by0+dG9fcmV0cmllcyAgID0gcmV0cjsKKwl0by0+dG9fZXhwb25lbnRpYWwgPSAwOworfQorCit1bnNpZ25lZCBpbnQgeHBydF91ZHBfc2xvdF90YWJsZV9lbnRyaWVzID0gUlBDX0RFRl9TTE9UX1RBQkxFOwordW5zaWduZWQgaW50IHhwcnRfdGNwX3Nsb3RfdGFibGVfZW50cmllcyA9IFJQQ19ERUZfU0xPVF9UQUJMRTsKKworLyoKKyAqIEluaXRpYWxpemUgYW4gUlBDIGNsaWVudAorICovCitzdGF0aWMgc3RydWN0IHJwY194cHJ0ICoKK3hwcnRfc2V0dXAoaW50IHByb3RvLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFwLCBzdHJ1Y3QgcnBjX3RpbWVvdXQgKnRvKQoreworCXN0cnVjdCBycGNfeHBydAkqeHBydDsKKwl1bnNpZ25lZCBpbnQgZW50cmllczsKKwlzaXplX3Qgc2xvdF90YWJsZV9zaXplOworCXN0cnVjdCBycGNfcnFzdAkqcmVxOworCisJZHByaW50aygiUlBDOiAgICAgIHNldHRpbmcgdXAgJXMgdHJhbnNwb3J0Li4uXG4iLAorCQkJCXByb3RvID09IElQUFJPVE9fVURQPyAiVURQIiA6ICJUQ1AiKTsKKworCWVudHJpZXMgPSAocHJvdG8gPT0gSVBQUk9UT19UQ1ApPworCQl4cHJ0X3RjcF9zbG90X3RhYmxlX2VudHJpZXMgOiB4cHJ0X3VkcF9zbG90X3RhYmxlX2VudHJpZXM7CisKKwlpZiAoKHhwcnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnBjX3hwcnQpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJbWVtc2V0KHhwcnQsIDAsIHNpemVvZigqeHBydCkpOyAvKiBObm5uZ2ghICovCisJeHBydC0+bWF4X3JlcXMgPSBlbnRyaWVzOworCXNsb3RfdGFibGVfc2l6ZSA9IGVudHJpZXMgKiBzaXplb2YoeHBydC0+c2xvdFswXSk7CisJeHBydC0+c2xvdCA9IGttYWxsb2Moc2xvdF90YWJsZV9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoeHBydC0+c2xvdCA9PSBOVUxMKSB7CisJCWtmcmVlKHhwcnQpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJbWVtc2V0KHhwcnQtPnNsb3QsIDAsIHNsb3RfdGFibGVfc2l6ZSk7CisKKwl4cHJ0LT5hZGRyID0gKmFwOworCXhwcnQtPnByb3QgPSBwcm90bzsKKwl4cHJ0LT5zdHJlYW0gPSAocHJvdG8gPT0gSVBQUk9UT19UQ1ApPyAxIDogMDsKKwlpZiAoeHBydC0+c3RyZWFtKSB7CisJCXhwcnQtPmN3bmQgPSBSUENfTUFYQ1dORCh4cHJ0KTsKKwkJeHBydC0+bm9jb25nID0gMTsKKwkJeHBydC0+bWF4X3BheWxvYWQgPSAoMVUgPDwgMzEpIC0gMTsKKwl9IGVsc2UgeworCQl4cHJ0LT5jd25kID0gUlBDX0lOSVRDV05EOworCQl4cHJ0LT5tYXhfcGF5bG9hZCA9ICgxVSA8PCAxNikgLSAoTUFYX0hFQURFUiA8PCAzKTsKKwl9CisJc3Bpbl9sb2NrX2luaXQoJnhwcnQtPnNvY2tfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnhwcnQtPnhwcnRfbG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmeHBydC0+Y29uZ193YWl0KTsKKworCUlOSVRfTElTVF9IRUFEKCZ4cHJ0LT5mcmVlKTsKKwlJTklUX0xJU1RfSEVBRCgmeHBydC0+cmVjdik7CisJSU5JVF9XT1JLKCZ4cHJ0LT5zb2NrX2Nvbm5lY3QsIHhwcnRfc29ja2V0X2Nvbm5lY3QsIHhwcnQpOworCUlOSVRfV09SSygmeHBydC0+dGFza19jbGVhbnVwLCB4cHJ0X3NvY2tldF9hdXRvY2xvc2UsIHhwcnQpOworCWluaXRfdGltZXIoJnhwcnQtPnRpbWVyKTsKKwl4cHJ0LT50aW1lci5mdW5jdGlvbiA9IHhwcnRfaW5pdF9hdXRvZGlzY29ubmVjdDsKKwl4cHJ0LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHhwcnQ7CisJeHBydC0+bGFzdF91c2VkID0gamlmZmllczsKKwl4cHJ0LT5wb3J0ID0gWFBSVF9NQVhfUkVTVlBPUlQ7CisKKwkvKiBTZXQgdGltZW91dCBwYXJhbWV0ZXJzICovCisJaWYgKHRvKSB7CisJCXhwcnQtPnRpbWVvdXQgPSAqdG87CisJfSBlbHNlCisJCXhwcnRfZGVmYXVsdF90aW1lb3V0KCZ4cHJ0LT50aW1lb3V0LCB4cHJ0LT5wcm90KTsKKworCXJwY19pbml0X3dhaXRfcXVldWUoJnhwcnQtPnBlbmRpbmcsICJ4cHJ0X3BlbmRpbmciKTsKKwlycGNfaW5pdF93YWl0X3F1ZXVlKCZ4cHJ0LT5zZW5kaW5nLCAieHBydF9zZW5kaW5nIik7CisJcnBjX2luaXRfd2FpdF9xdWV1ZSgmeHBydC0+cmVzZW5kLCAieHBydF9yZXNlbmQiKTsKKwlycGNfaW5pdF9wcmlvcml0eV93YWl0X3F1ZXVlKCZ4cHJ0LT5iYWNrbG9nLCAieHBydF9iYWNrbG9nIik7CisKKwkvKiBpbml0aWFsaXplIGZyZWUgbGlzdCAqLworCWZvciAocmVxID0gJnhwcnQtPnNsb3RbZW50cmllcy0xXTsgcmVxID49ICZ4cHJ0LT5zbG90WzBdOyByZXEtLSkKKwkJbGlzdF9hZGQoJnJlcS0+cnFfbGlzdCwgJnhwcnQtPmZyZWUpOworCisJeHBydF9pbml0X3hpZCh4cHJ0KTsKKworCS8qIENoZWNrIHdoZXRoZXIgd2Ugd2FudCB0byB1c2UgYSByZXNlcnZlZCBwb3J0ICovCisJeHBydC0+cmVzdnBvcnQgPSBjYXBhYmxlKENBUF9ORVRfQklORF9TRVJWSUNFKSA/IDEgOiAwOworCisJZHByaW50aygiUlBDOiAgICAgIGNyZWF0ZWQgdHJhbnNwb3J0ICVwIHdpdGggJXUgc2xvdHNcbiIsIHhwcnQsCisJCQl4cHJ0LT5tYXhfcmVxcyk7CisJCisJcmV0dXJuIHhwcnQ7Cit9CisKKy8qCisgKiBCaW5kIHRvIGEgcmVzZXJ2ZWQgcG9ydAorICovCitzdGF0aWMgaW5saW5lIGludCB4cHJ0X2JpbmRyZXN2cG9ydChzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQsIHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJc3RydWN0IHNvY2thZGRyX2luIG15YWRkciA9IHsKKwkJLnNpbl9mYW1pbHkgPSBBRl9JTkVULAorCX07CisJaW50CQllcnIsIHBvcnQ7CisKKwkvKiBXZXJlIHdlIGFscmVhZHkgYm91bmQgdG8gYSBnaXZlbiBwb3J0PyBUcnkgdG8gcmV1c2UgaXQgKi8KKwlwb3J0ID0geHBydC0+cG9ydDsKKwlkbyB7CisJCW15YWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCQllcnIgPSBzb2NrLT5vcHMtPmJpbmQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmbXlhZGRyLAorCQkJCQkJc2l6ZW9mKG15YWRkcikpOworCQlpZiAoZXJyID09IDApIHsKKwkJCXhwcnQtPnBvcnQgPSBwb3J0OworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKC0tcG9ydCA9PSAwKQorCQkJcG9ydCA9IFhQUlRfTUFYX1JFU1ZQT1JUOworCX0gd2hpbGUgKGVyciA9PSAtRUFERFJJTlVTRSAmJiBwb3J0ICE9IHhwcnQtPnBvcnQpOworCisJcHJpbnRrKCJSUEM6IENhbid0IGJpbmQgdG8gcmVzZXJ2ZWQgcG9ydCAoJWQpLlxuIiwgLWVycik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQKK3hwcnRfYmluZF9zb2NrZXQoc3RydWN0IHJwY194cHJ0ICp4cHJ0LCBzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworCXN0cnVjdCBzb2NrCSpzayA9IHNvY2stPnNrOworCisJaWYgKHhwcnQtPmluZXQpCisJCXJldHVybjsKKworCXdyaXRlX2xvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKKwlzay0+c2tfdXNlcl9kYXRhID0geHBydDsKKwl4cHJ0LT5vbGRfZGF0YV9yZWFkeSA9IHNrLT5za19kYXRhX3JlYWR5OworCXhwcnQtPm9sZF9zdGF0ZV9jaGFuZ2UgPSBzay0+c2tfc3RhdGVfY2hhbmdlOworCXhwcnQtPm9sZF93cml0ZV9zcGFjZSA9IHNrLT5za193cml0ZV9zcGFjZTsKKwlpZiAoeHBydC0+cHJvdCA9PSBJUFBST1RPX1VEUCkgeworCQlzay0+c2tfZGF0YV9yZWFkeSA9IHVkcF9kYXRhX3JlYWR5OworCQlzay0+c2tfbm9fY2hlY2sgPSBVRFBfQ1NVTV9OT1JDVjsKKwkJeHBydF9zZXRfY29ubmVjdGVkKHhwcnQpOworCX0gZWxzZSB7CisJCXRjcF9zayhzayktPm5vbmFnbGUgPSAxOwkvKiBkaXNhYmxlIE5hZ2xlJ3MgYWxnb3JpdGhtICovCisJCXNrLT5za19kYXRhX3JlYWR5ID0gdGNwX2RhdGFfcmVhZHk7CisJCXNrLT5za19zdGF0ZV9jaGFuZ2UgPSB0Y3Bfc3RhdGVfY2hhbmdlOworCQl4cHJ0X2NsZWFyX2Nvbm5lY3RlZCh4cHJ0KTsKKwl9CisJc2stPnNrX3dyaXRlX3NwYWNlID0geHBydF93cml0ZV9zcGFjZTsKKworCS8qIFJlc2V0IHRvIG5ldyBzb2NrZXQgKi8KKwl4cHJ0LT5zb2NrID0gc29jazsKKwl4cHJ0LT5pbmV0ID0gc2s7CisJd3JpdGVfdW5sb2NrX2JoKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBTZXQgc29ja2V0IGJ1ZmZlciBsZW5ndGgKKyAqLwordm9pZAoreHBydF9zb2NrX3NldGJ1ZnNpemUoc3RydWN0IHJwY194cHJ0ICp4cHJ0KQoreworCXN0cnVjdCBzb2NrICpzayA9IHhwcnQtPmluZXQ7CisKKwlpZiAoeHBydC0+c3RyZWFtKQorCQlyZXR1cm47CisJaWYgKHhwcnQtPnJjdnNpemUpIHsKKwkJc2stPnNrX3VzZXJsb2NrcyB8PSBTT0NLX1JDVkJVRl9MT0NLOworCQlzay0+c2tfcmN2YnVmID0geHBydC0+cmN2c2l6ZSAqIHhwcnQtPm1heF9yZXFzICogIDI7CisJfQorCWlmICh4cHJ0LT5zbmRzaXplKSB7CisJCXNrLT5za191c2VybG9ja3MgfD0gU09DS19TTkRCVUZfTE9DSzsKKwkJc2stPnNrX3NuZGJ1ZiA9IHhwcnQtPnNuZHNpemUgKiB4cHJ0LT5tYXhfcmVxcyAqIDI7CisJCXNrLT5za193cml0ZV9zcGFjZShzayk7CisJfQorfQorCisvKgorICogRGF0YXN0cmVhbSBzb2NrZXRzIGFyZSBjcmVhdGVkIGhlcmUsIGJ1dCB4cHJ0X2Nvbm5lY3Qgd2lsbCBjcmVhdGUKKyAqIGFuZCBjb25uZWN0IHN0cmVhbSBzb2NrZXRzLgorICovCitzdGF0aWMgc3RydWN0IHNvY2tldCAqIHhwcnRfY3JlYXRlX3NvY2tldChzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQsIGludCBwcm90bywgaW50IHJlc3Zwb3J0KQoreworCXN0cnVjdCBzb2NrZXQJKnNvY2s7CisJaW50CQl0eXBlLCBlcnI7CisKKwlkcHJpbnRrKCJSUEM6ICAgICAgeHBydF9jcmVhdGVfc29ja2V0KCVzICVkKVxuIiwKKwkJCSAgIChwcm90byA9PSBJUFBST1RPX1VEUCk/ICJ1ZHAiIDogInRjcCIsIHByb3RvKTsKKworCXR5cGUgPSAocHJvdG8gPT0gSVBQUk9UT19VRFApPyBTT0NLX0RHUkFNIDogU09DS19TVFJFQU07CisKKwlpZiAoKGVyciA9IHNvY2tfY3JlYXRlX2tlcm4oUEZfSU5FVCwgdHlwZSwgcHJvdG8sICZzb2NrKSkgPCAwKSB7CisJCXByaW50aygiUlBDOiBjYW4ndCBjcmVhdGUgc29ja2V0ICglZCkuXG4iLCAtZXJyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogSWYgdGhlIGNhbGxlciBoYXMgdGhlIGNhcGFiaWxpdHksIGJpbmQgdG8gYSByZXNlcnZlZCBwb3J0ICovCisJaWYgKHJlc3Zwb3J0ICYmIHhwcnRfYmluZHJlc3Zwb3J0KHhwcnQsIHNvY2spIDwgMCkgeworCQlwcmludGsoIlJQQzogY2FuJ3QgYmluZCB0byByZXNlcnZlZCBwb3J0LlxuIik7CisJCWdvdG8gZmFpbGVkOworCX0KKworCXJldHVybiBzb2NrOworCitmYWlsZWQ6CisJc29ja19yZWxlYXNlKHNvY2spOworCXJldHVybiBOVUxMOworfQorCisvKgorICogQ3JlYXRlIGFuIFJQQyBjbGllbnQgdHJhbnNwb3J0IGdpdmVuIHRoZSBwcm90b2NvbCBhbmQgcGVlciBhZGRyZXNzLgorICovCitzdHJ1Y3QgcnBjX3hwcnQgKgoreHBydF9jcmVhdGVfcHJvdG8oaW50IHByb3RvLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNhcCwgc3RydWN0IHJwY190aW1lb3V0ICp0bykKK3sKKwlzdHJ1Y3QgcnBjX3hwcnQJKnhwcnQ7CisKKwl4cHJ0ID0geHBydF9zZXR1cChwcm90bywgc2FwLCB0byk7CisJaWYgKElTX0VSUih4cHJ0KSkKKwkJZHByaW50aygiUlBDOiAgICAgIHhwcnRfY3JlYXRlX3Byb3RvIGZhaWxlZFxuIik7CisJZWxzZQorCQlkcHJpbnRrKCJSUEM6ICAgICAgeHBydF9jcmVhdGVfcHJvdG8gY3JlYXRlZCB4cHJ0ICVwXG4iLCB4cHJ0KTsKKwlyZXR1cm4geHBydDsKK30KKworLyoKKyAqIFByZXBhcmUgZm9yIHRyYW5zcG9ydCBzaHV0ZG93bi4KKyAqLworc3RhdGljIHZvaWQKK3hwcnRfc2h1dGRvd24oc3RydWN0IHJwY194cHJ0ICp4cHJ0KQoreworCXhwcnQtPnNodXRkb3duID0gMTsKKwlycGNfd2FrZV91cCgmeHBydC0+c2VuZGluZyk7CisJcnBjX3dha2VfdXAoJnhwcnQtPnJlc2VuZCk7CisJcnBjX3dha2VfdXAoJnhwcnQtPnBlbmRpbmcpOworCXJwY193YWtlX3VwKCZ4cHJ0LT5iYWNrbG9nKTsKKwl3YWtlX3VwKCZ4cHJ0LT5jb25nX3dhaXQpOworCWRlbF90aW1lcl9zeW5jKCZ4cHJ0LT50aW1lcik7Cit9CisKKy8qCisgKiBDbGVhciB0aGUgeHBydCBiYWNrbG9nIHF1ZXVlCisgKi8KK3N0YXRpYyBpbnQKK3hwcnRfY2xlYXJfYmFja2xvZyhzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQpIHsKKwlycGNfd2FrZV91cF9uZXh0KCZ4cHJ0LT5iYWNrbG9nKTsKKwl3YWtlX3VwKCZ4cHJ0LT5jb25nX3dhaXQpOworCXJldHVybiAxOworfQorCisvKgorICogRGVzdHJveSBhbiBSUEMgdHJhbnNwb3J0LCBraWxsaW5nIG9mZiBhbGwgcmVxdWVzdHMuCisgKi8KK2ludAoreHBydF9kZXN0cm95KHN0cnVjdCBycGNfeHBydCAqeHBydCkKK3sKKwlkcHJpbnRrKCJSUEM6ICAgICAgZGVzdHJveWluZyB0cmFuc3BvcnQgJXBcbiIsIHhwcnQpOworCXhwcnRfc2h1dGRvd24oeHBydCk7CisJeHBydF9kaXNjb25uZWN0KHhwcnQpOworCXhwcnRfY2xvc2UoeHBydCk7CisJa2ZyZWUoeHBydC0+c2xvdCk7CisJa2ZyZWUoeHBydCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25ldC9zeXNjdGxfbmV0LmMgYi9uZXQvc3lzY3RsX25ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNmUzMTAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc3lzY3RsX25ldC5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qIC0qLSBsaW51eC1jIC0qLQorICogc3lzY3RsX25ldC5jOiBzeXNjdGwgaW50ZXJmYWNlIHRvIG5ldCBzdWJzeXN0ZW0uCisgKgorICogQmVndW4gQXByaWwgMSwgMTk5NiwgTWlrZSBTaGF2ZXIuCisgKiBBZGRlZCAvcHJvYy9zeXMvbmV0IGRpcmVjdG9yaWVzIGZvciBlYWNoIHByb3RvY29sIGZhbWlseS4gW01TXQorICoKKyAqICRMb2c6IHN5c2N0bF9uZXQuYyx2ICQKKyAqIFJldmlzaW9uIDEuMiAgMTk5Ni8wNS8wOCAgMjA6MjQ6NDAgIHNoYXZlcgorICogQWRkZWQgYml0cyBmb3IgTkVUX0JSSURHRSBhbmQgdGhlIE5FVF9JUFY0X0FSUCBzdHVmZiBhbmQKKyAqIE5FVF9JUFY0X0lQX0ZPUldBUkQuCisgKgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKworI2lmZGVmIENPTkZJR19JTkVUCitleHRlcm4gc3RydWN0IGN0bF90YWJsZSBpcHY0X3RhYmxlW107CisjZW5kaWYKKworZXh0ZXJuIHN0cnVjdCBjdGxfdGFibGUgY29yZV90YWJsZVtdOworCisjaWZkZWYgQ09ORklHX05FVAorZXh0ZXJuIHN0cnVjdCBjdGxfdGFibGUgZXRoZXJfdGFibGVbXTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1RSCitleHRlcm4gc3RydWN0IGN0bF90YWJsZSB0cl90YWJsZVtdOworI2VuZGlmCisKK3N0cnVjdCBjdGxfdGFibGUgbmV0X3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBORVRfQ09SRSwKKwkJLnByb2NuYW1lCT0gImNvcmUiLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gY29yZV90YWJsZSwKKwl9LAorI2lmZGVmIENPTkZJR19ORVQKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9FVEhFUiwKKwkJLnByb2NuYW1lCT0gImV0aGVybmV0IiwKKwkJLm1vZGUJCT0gMDU1NSwKKwkJLmNoaWxkCQk9IGV0aGVyX3RhYmxlLAorCX0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSU5FVAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjQsCisJCS5wcm9jbmFtZQk9ICJpcHY0IiwKKwkJLm1vZGUJCT0gMDU1NSwKKwkJLmNoaWxkCQk9IGlwdjRfdGFibGUKKwl9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1RSCisJeworCQkuY3RsX25hbWUJPSBORVRfVFIsCisJCS5wcm9jbmFtZQk9ICJ0b2tlbi1yaW5nIiwKKwkJLm1vZGUJCT0gMDU1NSwKKwkJLmNoaWxkCQk9IHRyX3RhYmxlLAorCX0sCisjZW5kaWYKKwl7IDAgfSwKK307CmRpZmYgLS1naXQgYS9uZXQvdW5peC9NYWtlZmlsZSBiL25ldC91bml4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NTJhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdW5peC9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCB1bml4IGRvbWFpbiBzb2NrZXQgbGF5ZXIuCisjCisKK29iai0kKENPTkZJR19VTklYKQkrPSB1bml4Lm8KKwordW5peC15CQkJOj0gYWZfdW5peC5vIGdhcmJhZ2UubwordW5peC0kKENPTkZJR19TWVNDVEwpCSs9IHN5c2N0bF9uZXRfdW5peC5vCmRpZmYgLS1naXQgYS9uZXQvdW5peC9hZl91bml4LmMgYi9uZXQvdW5peC9hZl91bml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNjNzNmZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC91bml4L2FmX3VuaXguYwpAQCAtMCwwICsxLDIwOTggQEAKKy8qCisgKiBORVQ0OglJbXBsZW1lbnRhdGlvbiBvZiBCU0QgVW5peCBkb21haW4gc29ja2V0cy4KKyAqCisgKiBBdXRob3JzOglBbGFuIENveCwgPGFsYW4uY294QGxpbnV4Lm9yZz4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBWZXJzaW9uOgkkSWQ6IGFmX3VuaXguYyx2IDEuMTMzIDIwMDIvMDIvMDggMDM6NTc6MTkgZGF2ZW0gRXhwICQKKyAqCisgKiBGaXhlczoKKyAqCQlMaW51cyBUb3J2YWxkcwk6CUFzc29ydGVkIGJ1ZyBjdXJlcy4KKyAqCQlOaWliZSBZdXRha2EJOglhc3luYyBJL08gc3VwcG9ydC4KKyAqCQlDYXJzdGVuIFBhZXRoCToJUEZfVU5JWCBjaGVjaywgYWRkcmVzcyBmaXhlcy4KKyAqCQlBbGFuIENveAk6CUxpbWl0IHNpemUgb2YgYWxsb2NhdGVkIGJsb2Nrcy4KKyAqCQlBbGFuIENveAk6CUZpeGVkIHRoZSBzdHVwaWQgc29ja2V0cGFpciBidWcuCisgKgkJQWxhbiBDb3gJOglCU0QgY29tcGF0aWJpbGl0eSBmaW5lIHR1bmluZy4KKyAqCQlBbGFuIENveAk6CUZpeGVkIGEgYnVnIGluIGNvbm5lY3Qgd2hlbiBpbnRlcnJ1cHRlZC4KKyAqCQlBbGFuIENveAk6CVNvcnRlZCBvdXQgYSBwcm9wZXIgZHJhZnQgdmVyc2lvbiBvZgorICoJCQkJCWZpbGUgZGVzY3JpcHRvciBwYXNzaW5nIGhhY2tlZCB1cCBmcm9tCisgKgkJCQkJTWlrZSBTaGF2ZXIncyB3b3JrLgorICoJCU1hcnR5IExlaXNuZXIJOglGaXhlcyB0byBmZCBwYXNzaW5nCisgKgkJTmljayBOZXZpbgk6CXJlY3Ztc2cgYnVnZml4LgorICoJCUFsYW4gQ294CToJU3RhcnRlZCBwcm9wZXIgZ2FyYmFnZSBjb2xsZWN0b3IKKyAqCQlIZWlrbyBFaUJmZWxkdAk6CU1pc3NpbmcgdmVyaWZ5X2FyZWEgY2hlY2sKKyAqCQlBbGFuIENveAk6CVN0YXJ0ZWQgUE9TSVhpc21zCisgKgkJQW5kcmVhcyBTY2h3YWIJOglSZXBsYWNlIGlub2RlIGJ5IGRlbnRyeSBmb3IgcHJvcGVyCisgKgkJCQkJcmVmZXJlbmNlIGNvdW50aW5nCisgKgkJS2lyayBQZXRlcnNlbgk6CU1hZGUgdGhpcyBhIG1vZHVsZQorICoJICAgIENocmlzdG9waCBSb2hsYW5kCToJRWxlZ2FudCBub24tYmxvY2tpbmcgYWNjZXB0L2Nvbm5lY3QgYWxnb3JpdGhtLgorICoJCQkJCUxvdHMgb2YgYnVnIGZpeGVzLgorICoJICAgICBBbGV4ZXkgS3V6bmV0b3N2CToJUmVwYWlyZWQgKEkgaG9wZSkgYnVncyBpbnRyb2R1Y2VzCisgKgkJCQkJYnkgYWJvdmUgdHdvIHBhdGNoZXMuCisgKgkgICAgIEFuZHJlYSBBcmNhbmdlbGkJOglJZiBwb3NzaWJsZSB3ZSBibG9jayBpbiBjb25uZWN0KDIpCisgKgkJCQkJaWYgdGhlIG1heCBiYWNrbG9nIG9mIHRoZSBsaXN0ZW4gc29ja2V0CisgKgkJCQkJaXMgYmVlbiByZWFjaGVkLiBUaGlzIHdvbid0IGJyZWFrCisgKgkJCQkJb2xkIGFwcHMgYW5kIGl0IHdpbGwgYXZvaWQgaHVnZSBhbW91bnQKKyAqCQkJCQlvZiBzb2NrcyBoYXNoZWQgKHRoaXMgZm9yIHVuaXhfZ2MoKQorICoJCQkJCXBlcmZvcm1hbmNlcyByZWFzb25zKS4KKyAqCQkJCQlTZWN1cml0eSBmaXggdGhhdCBsaW1pdHMgdGhlIG1heAorICoJCQkJCW51bWJlciBvZiBzb2NrcyB0byAyKm1heF9maWxlcyBhbmQKKyAqCQkJCQl0aGUgbnVtYmVyIG9mIHNrYiBxdWV1ZWFibGUgaW4gdGhlCisgKgkJCQkJZGdyYW0gcmVjZWl2ZXIuCisgKgkJQXJ0dXIgU2thd2luYSAgIDoJSGFzaCBmdW5jdGlvbiBvcHRpbWl6YXRpb25zCisgKgkgICAgIEFsZXhleSBLdXpuZXRzb3YgICA6CUZ1bGwgc2NhbGUgU01QLiBMb3Qgb2YgYnVncyBhcmUgaW50cm9kdWNlZCA4KQorICoJICAgICAgTWFsY29sbSBCZWF0dGllICAgOglTZXQgcGVlcmNyZWQgZm9yIHNvY2tldHBhaXIKKyAqCSAgICAgTWljaGFsIE9zdHJvd3NraSAgIDogICAgICAgTW9kdWxlIGluaXRpYWxpemF0aW9uIGNsZWFudXAuCisgKgkgICAgIEFybmFsZG8gQy4gTWVsbwk6CVJlbW92ZSBNT0Rfe0lOQyxERUN9X1VTRV9DT1VOVCwKKyAqCSAgICAgCQkJCXRoZSBjb3JlIGluZnJhc3RydWN0dXJlIGlzIGRvaW5nIHRoYXQKKyAqCSAgICAgCQkJCWZvciBhbGwgbmV0IHByb3RvIGZhbWlsaWVzIG5vdyAoMi41LjY5KykKKyAqCisgKgorICogS25vd24gZGlmZmVyZW5jZXMgZnJvbSByZWZlcmVuY2UgQlNEIHRoYXQgd2FzIHRlc3RlZDoKKyAqCisgKglbVE8gRklYXQorICoJRUNPTk5SRUZVU0VEIGlzIG5vdCByZXR1cm5lZCBmcm9tIG9uZSBlbmQgb2YgYSBjb25uZWN0ZWQoKSBzb2NrZXQgdG8gdGhlCisgKgkJb3RoZXIgdGhlIG1vbWVudCBvbmUgZW5kIGNsb3Nlcy4KKyAqCWZzdGF0KCkgZG9lc24ndCByZXR1cm4gc3RfZGV2PTAsIGFuZCBnaXZlIHRoZSBibGtzaXplIGFzIGhpZ2ggd2F0ZXIgbWFyaworICoJCWFuZCBhIGZha2UgaW5vZGUgaWRlbnRpZmllciAobm9yIHRoZSBCU0QgZmlyc3Qgc29ja2V0IGZzdGF0IHR3aWNlIGJ1ZykuCisgKglbTk9UIFRPIEZJWF0KKyAqCWFjY2VwdCgpIHJldHVybnMgYSBwYXRoIG5hbWUgZXZlbiBpZiB0aGUgY29ubmVjdGluZyBzb2NrZXQgaGFzIGNsb3NlZAorICoJCWluIHRoZSBtZWFudGltZSAoQlNEIGxvc2VzIHRoZSBwYXRoIGFuZCBnaXZlcyB1cCkuCisgKglhY2NlcHQoKSByZXR1cm5zIDAgbGVuZ3RoIHBhdGggZm9yIGFuIHVuYm91bmQgY29ubmVjdG9yLiBCU0QgcmV0dXJucyAxNgorICoJCWFuZCBhIG51bGwgZmlyc3QgYnl0ZSBpbiB0aGUgcGF0aCAoYnV0IG5vdCBmb3IgZ2V0aG9zdC9wZWVybmFtZSAtIEJTRCBidWcgPz8pCisgKglzb2NrZXRwYWlyKC4uLlNPQ0tfUkFXLi4pIGRvZXNuJ3QgcGFuaWMgdGhlIGtlcm5lbC4KKyAqCUJTRCBhZl91bml4IGFwcGFyZW50bHkgaGFzIGNvbm5lY3QgZm9yZ2V0dGluZyB0byBibG9jayBwcm9wZXJseS4KKyAqCQkobmVlZCB0byBjaGVjayB0aGlzIHdpdGggdGhlIFBPU0lYIHNwZWMgaW4gZGV0YWlsKQorICoKKyAqIERpZmZlcmVuY2VzIGZyb20gMi4wLjAtMTEtLi4uIChBTkspCisgKglCdWcgZml4ZXMgYW5kIGltcHJvdmVtZW50cy4KKyAqCQktIGNsaWVudCBzaHV0ZG93biBraWxsZWQgc2VydmVyIHNvY2tldC4KKyAqCQktIHJlbW92ZWQgYWxsIHVzZWxlc3MgY2xpL3N0aSBwYWlycy4KKyAqCisgKglTZW1hbnRpYyBjaGFuZ2VzL2V4dGVuc2lvbnMuCisgKgkJLSBnZW5lcmljIGNvbnRyb2wgbWVzc2FnZSBwYXNzaW5nLgorICoJCS0gU0NNX0NSRURFTlRJQUxTIGNvbnRyb2wgbWVzc2FnZS4KKyAqCQktICJBYnN0cmFjdCIgKG5vdCBGUyBiYXNlZCkgc29ja2V0IGJpbmRpbmdzLgorICoJCSAgQWJzdHJhY3QgbmFtZXMgYXJlIHNlcXVlbmNlcyBvZiBieXRlcyAobm90IHplcm8gdGVybWluYXRlZCkKKyAqCQkgIHN0YXJ0ZWQgYnkgMCwgc28gdGhhdCB0aGlzIG5hbWUgc3BhY2UgZG9lcyBub3QgaW50ZXJzZWN0CisgKgkJICB3aXRoIEJTRCBuYW1lcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvdW4uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bmV0L2FmX3VuaXguaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxuZXQvc2NtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKworaW50IHN5c2N0bF91bml4X21heF9kZ3JhbV9xbGVuID0gMTA7CisKK3N0cnVjdCBobGlzdF9oZWFkIHVuaXhfc29ja2V0X3RhYmxlW1VOSVhfSEFTSF9TSVpFICsgMV07CitERUZJTkVfUldMT0NLKHVuaXhfdGFibGVfbG9jayk7CitzdGF0aWMgYXRvbWljX3QgdW5peF9ucl9zb2NrcyA9IEFUT01JQ19JTklUKDApOworCisjZGVmaW5lIHVuaXhfc29ja2V0c191bmJvdW5kCSgmdW5peF9zb2NrZXRfdGFibGVbVU5JWF9IQVNIX1NJWkVdKQorCisjZGVmaW5lIFVOSVhfQUJTVFJBQ1Qoc2spCSh1bml4X3NrKHNrKS0+YWRkci0+aGFzaCAhPSBVTklYX0hBU0hfU0laRSkKKworLyoKKyAqICBTTVAgbG9ja2luZyBzdHJhdGVneToKKyAqICAgIGhhc2ggdGFibGUgaXMgcHJvdGVjdGVkIHdpdGggcndsb2NrIHVuaXhfdGFibGVfbG9jaworICogICAgZWFjaCBzb2NrZXQgc3RhdGUgaXMgcHJvdGVjdGVkIGJ5IHNlcGFyYXRlIHJ3bG9jay4KKyAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHVuaXhfaGFzaF9mb2xkKHVuc2lnbmVkIGhhc2gpCit7CisJaGFzaCBePSBoYXNoPj4xNjsKKwloYXNoIF49IGhhc2g+Pjg7CisJcmV0dXJuIGhhc2gmKFVOSVhfSEFTSF9TSVpFLTEpOworfQorCisjZGVmaW5lIHVuaXhfcGVlcihzaykgKHVuaXhfc2soc2spLT5wZWVyKQorCitzdGF0aWMgaW5saW5lIGludCB1bml4X291cl9wZWVyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2sgKm9zaykKK3sKKwlyZXR1cm4gdW5peF9wZWVyKG9zaykgPT0gc2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHVuaXhfbWF5X3NlbmQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29jayAqb3NrKQoreworCXJldHVybiAodW5peF9wZWVyKG9zaykgPT0gTlVMTCB8fCB1bml4X291cl9wZWVyKHNrLCBvc2spKTsKK30KKworc3RhdGljIHN0cnVjdCBzb2NrICp1bml4X3BlZXJfZ2V0KHN0cnVjdCBzb2NrICpzKQoreworCXN0cnVjdCBzb2NrICpwZWVyOworCisJdW5peF9zdGF0ZV9ybG9jayhzKTsKKwlwZWVyID0gdW5peF9wZWVyKHMpOworCWlmIChwZWVyKQorCQlzb2NrX2hvbGQocGVlcik7CisJdW5peF9zdGF0ZV9ydW5sb2NrKHMpOworCXJldHVybiBwZWVyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdW5peF9yZWxlYXNlX2FkZHIoc3RydWN0IHVuaXhfYWRkcmVzcyAqYWRkcikKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYWRkci0+cmVmY250KSkKKwkJa2ZyZWUoYWRkcik7Cit9CisKKy8qCisgKglDaGVjayB1bml4IHNvY2tldCBuYW1lOgorICoJCS0gc2hvdWxkIGJlIG5vdCB6ZXJvIGxlbmd0aC4KKyAqCSAgICAgICAgLSBpZiBzdGFydGVkIGJ5IG5vdCB6ZXJvLCBzaG91bGQgYmUgTlVMTCB0ZXJtaW5hdGVkIChGUyBvYmplY3QpCisgKgkJLSBpZiBzdGFydGVkIGJ5IHplcm8sIGl0IGlzIGFic3RyYWN0IG5hbWUuCisgKi8KKyAKK3N0YXRpYyBpbnQgdW5peF9ta25hbWUoc3RydWN0IHNvY2thZGRyX3VuICogc3VuYWRkciwgaW50IGxlbiwgdW5zaWduZWQgKmhhc2hwKQoreworCWlmIChsZW4gPD0gc2l6ZW9mKHNob3J0KSB8fCBsZW4gPiBzaXplb2YoKnN1bmFkZHIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXN1bmFkZHIgfHwgc3VuYWRkci0+c3VuX2ZhbWlseSAhPSBBRl9VTklYKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc3VuYWRkci0+c3VuX3BhdGhbMF0pIHsKKwkJLyoKKwkJICogVGhpcyBtYXkgbG9vayBsaWtlIGFuIG9mZiBieSBvbmUgZXJyb3IgYnV0IGl0IGlzIGEgYml0IG1vcmUKKwkJICogc3VidGxlLiAxMDggaXMgdGhlIGxvbmdlc3QgdmFsaWQgQUZfVU5JWCBwYXRoIGZvciBhIGJpbmRpbmcuCisJCSAqIHN1bl9wYXRoWzEwOF0gZG9lc250IGFzIHN1Y2ggZXhpc3QuICBIb3dldmVyIGluIGtlcm5lbCBzcGFjZQorCQkgKiB3ZSBhcmUgZ3VhcmFudGVlZCB0aGF0IGl0IGlzIGEgdmFsaWQgbWVtb3J5IGxvY2F0aW9uIGluIG91cgorCQkgKiBrZXJuZWwgYWRkcmVzcyBidWZmZXIuCisJCSAqLworCQkoKGNoYXIgKilzdW5hZGRyKVtsZW5dPTA7CisJCWxlbiA9IHN0cmxlbihzdW5hZGRyLT5zdW5fcGF0aCkrMStzaXplb2Yoc2hvcnQpOworCQlyZXR1cm4gbGVuOworCX0KKworCSpoYXNocCA9IHVuaXhfaGFzaF9mb2xkKGNzdW1fcGFydGlhbCgoY2hhciopc3VuYWRkciwgbGVuLCAwKSk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHZvaWQgX191bml4X3JlbW92ZV9zb2NrZXQoc3RydWN0IHNvY2sgKnNrKQoreworCXNrX2RlbF9ub2RlX2luaXQoc2spOworfQorCitzdGF0aWMgdm9pZCBfX3VuaXhfaW5zZXJ0X3NvY2tldChzdHJ1Y3QgaGxpc3RfaGVhZCAqbGlzdCwgc3RydWN0IHNvY2sgKnNrKQoreworCUJVR19UUkFQKHNrX3VuaGFzaGVkKHNrKSk7CisJc2tfYWRkX25vZGUoc2ssIGxpc3QpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdW5peF9yZW1vdmVfc29ja2V0KHN0cnVjdCBzb2NrICpzaykKK3sKKwl3cml0ZV9sb2NrKCZ1bml4X3RhYmxlX2xvY2spOworCV9fdW5peF9yZW1vdmVfc29ja2V0KHNrKTsKKwl3cml0ZV91bmxvY2soJnVuaXhfdGFibGVfbG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1bml4X2luc2VydF9zb2NrZXQoc3RydWN0IGhsaXN0X2hlYWQgKmxpc3QsIHN0cnVjdCBzb2NrICpzaykKK3sKKwl3cml0ZV9sb2NrKCZ1bml4X3RhYmxlX2xvY2spOworCV9fdW5peF9pbnNlcnRfc29ja2V0KGxpc3QsIHNrKTsKKwl3cml0ZV91bmxvY2soJnVuaXhfdGFibGVfbG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqX191bml4X2ZpbmRfc29ja2V0X2J5bmFtZShzdHJ1Y3Qgc29ja2FkZHJfdW4gKnN1bm5hbWUsCisJCQkJCSAgICAgIGludCBsZW4sIGludCB0eXBlLCB1bnNpZ25lZCBoYXNoKQoreworCXN0cnVjdCBzb2NrICpzOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJc2tfZm9yX2VhY2gocywgbm9kZSwgJnVuaXhfc29ja2V0X3RhYmxlW2hhc2ggXiB0eXBlXSkgeworCQlzdHJ1Y3QgdW5peF9zb2NrICp1ID0gdW5peF9zayhzKTsKKworCQlpZiAodS0+YWRkci0+bGVuID09IGxlbiAmJgorCQkgICAgIW1lbWNtcCh1LT5hZGRyLT5uYW1lLCBzdW5uYW1lLCBsZW4pKQorCQkJZ290byBmb3VuZDsKKwl9CisJcyA9IE5VTEw7Citmb3VuZDoKKwlyZXR1cm4gczsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29jayAqdW5peF9maW5kX3NvY2tldF9ieW5hbWUoc3RydWN0IHNvY2thZGRyX3VuICpzdW5uYW1lLAorCQkJCQkJICAgaW50IGxlbiwgaW50IHR5cGUsCisJCQkJCQkgICB1bnNpZ25lZCBoYXNoKQoreworCXN0cnVjdCBzb2NrICpzOworCisJcmVhZF9sb2NrKCZ1bml4X3RhYmxlX2xvY2spOworCXMgPSBfX3VuaXhfZmluZF9zb2NrZXRfYnluYW1lKHN1bm5hbWUsIGxlbiwgdHlwZSwgaGFzaCk7CisJaWYgKHMpCisJCXNvY2tfaG9sZChzKTsKKwlyZWFkX3VubG9jaygmdW5peF90YWJsZV9sb2NrKTsKKwlyZXR1cm4gczsKK30KKworc3RhdGljIHN0cnVjdCBzb2NrICp1bml4X2ZpbmRfc29ja2V0X2J5aW5vZGUoc3RydWN0IGlub2RlICppKQoreworCXN0cnVjdCBzb2NrICpzOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJcmVhZF9sb2NrKCZ1bml4X3RhYmxlX2xvY2spOworCXNrX2Zvcl9lYWNoKHMsIG5vZGUsCisJCSAgICAmdW5peF9zb2NrZXRfdGFibGVbaS0+aV9pbm8gJiAoVU5JWF9IQVNIX1NJWkUgLSAxKV0pIHsKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gdW5peF9zayhzKS0+ZGVudHJ5OworCisJCWlmKGRlbnRyeSAmJiBkZW50cnktPmRfaW5vZGUgPT0gaSkKKwkJeworCQkJc29ja19ob2xkKHMpOworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKwlzID0gTlVMTDsKK2ZvdW5kOgorCXJlYWRfdW5sb2NrKCZ1bml4X3RhYmxlX2xvY2spOworCXJldHVybiBzOworfQorCitzdGF0aWMgaW5saW5lIGludCB1bml4X3dyaXRhYmxlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlyZXR1cm4gKGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYykgPDwgMikgPD0gc2stPnNrX3NuZGJ1ZjsKK30KKworc3RhdGljIHZvaWQgdW5peF93cml0ZV9zcGFjZShzdHJ1Y3Qgc29jayAqc2spCit7CisJcmVhZF9sb2NrKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CisJaWYgKHVuaXhfd3JpdGFibGUoc2spKSB7CisJCWlmIChzay0+c2tfc2xlZXAgJiYgd2FpdHF1ZXVlX2FjdGl2ZShzay0+c2tfc2xlZXApKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHNrLT5za19zbGVlcCk7CisJCXNrX3dha2VfYXN5bmMoc2ssIDIsIFBPTExfT1VUKTsKKwl9CisJcmVhZF91bmxvY2soJnNrLT5za19jYWxsYmFja19sb2NrKTsKK30KKworLyogV2hlbiBkZ3JhbSBzb2NrZXQgZGlzY29ubmVjdHMgKG9yIGNoYW5nZXMgaXRzIHBlZXIpLCB3ZSBjbGVhciBpdHMgcmVjZWl2ZQorICogcXVldWUgb2YgcGFja2V0cyBhcnJpdmVkIGZyb20gcHJldmlvdXMgcGVlci4gRmlyc3QsIGl0IGFsbG93cyB0byBkbworICogZmxvdyBjb250cm9sIGJhc2VkIG9ubHkgb24gd21lbV9hbGxvYzsgc2Vjb25kLCBzayBjb25uZWN0ZWQgdG8gcGVlcgorICogbWF5IHJlY2VpdmUgbWVzc2FnZXMgb25seSBmcm9tIHRoYXQgcGVlci4gKi8KK3N0YXRpYyB2b2lkIHVuaXhfZGdyYW1fZGlzY29ubmVjdGVkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2sgKm90aGVyKQoreworCWlmIChza2JfcXVldWVfbGVuKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpIHsKKwkJc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJnVuaXhfc2soc2spLT5wZWVyX3dhaXQpOworCisJCS8qIElmIG9uZSBsaW5rIG9mIGJpZGlyZWN0aW9uYWwgZGdyYW0gcGlwZSBpcyBkaXNjb25uZWN0ZWQsCisJCSAqIHdlIHNpZ25hbCBlcnJvci4gTWVzc2FnZXMgYXJlIGxvc3QuIERvIG5vdCBtYWtlIHRoaXMsCisJCSAqIHdoZW4gcGVlciB3YXMgbm90IGNvbm5lY3RlZCB0byB1cy4KKwkJICovCisJCWlmICghc29ja19mbGFnKG90aGVyLCBTT0NLX0RFQUQpICYmIHVuaXhfcGVlcihvdGhlcikgPT0gc2spIHsKKwkJCW90aGVyLT5za19lcnIgPSBFQ09OTlJFU0VUOworCQkJb3RoZXItPnNrX2Vycm9yX3JlcG9ydChvdGhlcik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVuaXhfc29ja19kZXN0cnVjdG9yKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgdW5peF9zb2NrICp1ID0gdW5peF9zayhzayk7CisKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKworCUJVR19UUkFQKCFhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpKTsKKwlCVUdfVFJBUChza191bmhhc2hlZChzaykpOworCUJVR19UUkFQKCFzay0+c2tfc29ja2V0KTsKKwlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkgeworCQlwcmludGsoIkF0dGVtcHQgdG8gcmVsZWFzZSBhbGl2ZSB1bml4IHNvY2tldDogJXBcbiIsIHNrKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh1LT5hZGRyKQorCQl1bml4X3JlbGVhc2VfYWRkcih1LT5hZGRyKTsKKworCWF0b21pY19kZWMoJnVuaXhfbnJfc29ja3MpOworI2lmZGVmIFVOSVhfUkVGQ05UX0RFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgIlVOSVggJXAgaXMgZGVzdHJveWVkLCAlZCBhcmUgc3RpbGwgYWxpdmUuXG4iLCBzaywgYXRvbWljX3JlYWQoJnVuaXhfbnJfc29ja3MpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IHVuaXhfcmVsZWFzZV9zb2NrIChzdHJ1Y3Qgc29jayAqc2ssIGludCBlbWJyaW9uKQoreworCXN0cnVjdCB1bml4X3NvY2sgKnUgPSB1bml4X3NrKHNrKTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IHZmc21vdW50ICptbnQ7CisJc3RydWN0IHNvY2sgKnNrcGFpcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBzdGF0ZTsKKworCXVuaXhfcmVtb3ZlX3NvY2tldChzayk7CisKKwkvKiBDbGVhciBzdGF0ZSAqLworCXVuaXhfc3RhdGVfd2xvY2soc2spOworCXNvY2tfb3JwaGFuKHNrKTsKKwlzay0+c2tfc2h1dGRvd24gPSBTSFVURE9XTl9NQVNLOworCWRlbnRyeQkgICAgID0gdS0+ZGVudHJ5OworCXUtPmRlbnRyeSAgICA9IE5VTEw7CisJbW50CSAgICAgPSB1LT5tbnQ7CisJdS0+bW50CSAgICAgPSBOVUxMOworCXN0YXRlID0gc2stPnNrX3N0YXRlOworCXNrLT5za19zdGF0ZSA9IFRDUF9DTE9TRTsKKwl1bml4X3N0YXRlX3d1bmxvY2soc2spOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmdS0+cGVlcl93YWl0KTsKKworCXNrcGFpcj11bml4X3BlZXIoc2spOworCisJaWYgKHNrcGFpciE9TlVMTCkgeworCQlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19TVFJFQU0gfHwgc2stPnNrX3R5cGUgPT0gU09DS19TRVFQQUNLRVQpIHsKKwkJCXVuaXhfc3RhdGVfd2xvY2soc2twYWlyKTsKKwkJCS8qIE5vIG1vcmUgd3JpdGVzICovCisJCQlza3BhaXItPnNrX3NodXRkb3duID0gU0hVVERPV05fTUFTSzsKKwkJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkgfHwgZW1icmlvbikKKwkJCQlza3BhaXItPnNrX2VyciA9IEVDT05OUkVTRVQ7CisJCQl1bml4X3N0YXRlX3d1bmxvY2soc2twYWlyKTsKKwkJCXNrcGFpci0+c2tfc3RhdGVfY2hhbmdlKHNrcGFpcik7CisJCQlyZWFkX2xvY2soJnNrcGFpci0+c2tfY2FsbGJhY2tfbG9jayk7CisJCQlza193YWtlX2FzeW5jKHNrcGFpciwxLFBPTExfSFVQKTsKKwkJCXJlYWRfdW5sb2NrKCZza3BhaXItPnNrX2NhbGxiYWNrX2xvY2spOworCQl9CisJCXNvY2tfcHV0KHNrcGFpcik7IC8qIEl0IG1heSBub3cgZGllICovCisJCXVuaXhfcGVlcihzaykgPSBOVUxMOworCX0KKworCS8qIFRyeSB0byBmbHVzaCBvdXQgdGhpcyBzb2NrZXQuIFRocm93IG91dCBidWZmZXJzIGF0IGxlYXN0ICovCisKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpICE9IE5VTEwpIHsKKwkJaWYgKHN0YXRlPT1UQ1BfTElTVEVOKQorCQkJdW5peF9yZWxlYXNlX3NvY2soc2tiLT5zaywgMSk7CisJCS8qIHBhc3NlZCBmZHMgYXJlIGVyYXNlZCBpbiB0aGUga2ZyZWVfc2tiIGhvb2sJICAgICAgKi8KKwkJa2ZyZWVfc2tiKHNrYik7CisJfQorCisJaWYgKGRlbnRyeSkgeworCQlkcHV0KGRlbnRyeSk7CisJCW1udHB1dChtbnQpOworCX0KKworCXNvY2tfcHV0KHNrKTsKKworCS8qIC0tLS0gU29ja2V0IGlzIGRlYWQgbm93IGFuZCBtb3N0IHByb2JhYmx5IGRlc3Ryb3llZCAtLS0tICovCisKKwkvKgorCSAqIEZpeG1lOiBCU0QgZGlmZmVyZW5jZTogSW4gQlNEIGFsbCBzb2NrZXRzIGNvbm5lY3RlZCB0byB1c2UgZ2V0CisJICoJICBFQ09OTlJFU0VUIGFuZCB3ZSBkaWUgb24gdGhlIHNwb3QuIEluIExpbnV4IHdlIGJlaGF2ZQorCSAqCSAgbGlrZSBmaWxlcyBhbmQgcGlwZXMgZG8gYW5kIHdhaXQgZm9yIHRoZSBsYXN0CisJICoJICBkZXJlZmVyZW5jZS4KKwkgKgorCSAqIENhbid0IHdlIHNpbXBseSBzZXQgc29jay0+ZXJyPworCSAqCisJICoJICBXaGF0IHRoZSBhYm92ZSBjb21tZW50IGRvZXMgdGFsayBhYm91dD8gLS1BTksoOTgwODE3KQorCSAqLworCisJaWYgKGF0b21pY19yZWFkKCZ1bml4X3RvdF9pbmZsaWdodCkpCisJCXVuaXhfZ2MoKTsJCS8qIEdhcmJhZ2UgY29sbGVjdCBmZHMgKi8JCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1bml4X2xpc3RlbihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgYmFja2xvZykKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCB1bml4X3NvY2sgKnUgPSB1bml4X3NrKHNrKTsKKworCWVyciA9IC1FT1BOT1RTVVBQOworCWlmIChzb2NrLT50eXBlIT1TT0NLX1NUUkVBTSAmJiBzb2NrLT50eXBlIT1TT0NLX1NFUVBBQ0tFVCkKKwkJZ290byBvdXQ7CQkJLyogT25seSBzdHJlYW0vc2VxcGFja2V0IHNvY2tldHMgYWNjZXB0ICovCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoIXUtPmFkZHIpCisJCWdvdG8gb3V0OwkJCS8qIE5vIGxpc3RlbnMgb24gYW4gdW5ib3VuZCBzb2NrZXQgKi8KKwl1bml4X3N0YXRlX3dsb2NrKHNrKTsKKwlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9DTE9TRSAmJiBzay0+c2tfc3RhdGUgIT0gVENQX0xJU1RFTikKKwkJZ290byBvdXRfdW5sb2NrOworCWlmIChiYWNrbG9nID4gc2stPnNrX21heF9hY2tfYmFja2xvZykKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmdS0+cGVlcl93YWl0KTsKKwlzay0+c2tfbWF4X2Fja19iYWNrbG9nCT0gYmFja2xvZzsKKwlzay0+c2tfc3RhdGUJCT0gVENQX0xJU1RFTjsKKwkvKiBzZXQgY3JlZGVudGlhbHMgc28gY29ubmVjdCBjYW4gY29weSB0aGVtICovCisJc2stPnNrX3BlZXJjcmVkLnBpZAk9IGN1cnJlbnQtPnRnaWQ7CisJc2stPnNrX3BlZXJjcmVkLnVpZAk9IGN1cnJlbnQtPmV1aWQ7CisJc2stPnNrX3BlZXJjcmVkLmdpZAk9IGN1cnJlbnQtPmVnaWQ7CisJZXJyID0gMDsKKworb3V0X3VubG9jazoKKwl1bml4X3N0YXRlX3d1bmxvY2soc2spOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdW5peF9yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKik7CitzdGF0aWMgaW50IHVuaXhfYmluZChzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCBzb2NrYWRkciAqLCBpbnQpOworc3RhdGljIGludCB1bml4X3N0cmVhbV9jb25uZWN0KHN0cnVjdCBzb2NrZXQgKiwgc3RydWN0IHNvY2thZGRyICosCisJCQkgICAgICAgaW50IGFkZHJfbGVuLCBpbnQgZmxhZ3MpOworc3RhdGljIGludCB1bml4X3NvY2tldHBhaXIoc3RydWN0IHNvY2tldCAqLCBzdHJ1Y3Qgc29ja2V0ICopOworc3RhdGljIGludCB1bml4X2FjY2VwdChzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCBzb2NrZXQgKiwgaW50KTsKK3N0YXRpYyBpbnQgdW5peF9nZXRuYW1lKHN0cnVjdCBzb2NrZXQgKiwgc3RydWN0IHNvY2thZGRyICosIGludCAqLCBpbnQpOworc3RhdGljIHVuc2lnbmVkIGludCB1bml4X3BvbGwoc3RydWN0IGZpbGUgKiwgc3RydWN0IHNvY2tldCAqLCBwb2xsX3RhYmxlICopOworc3RhdGljIGludCB1bml4X2lvY3RsKHN0cnVjdCBzb2NrZXQgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyBpbnQgdW5peF9zaHV0ZG93bihzdHJ1Y3Qgc29ja2V0ICosIGludCk7CitzdGF0aWMgaW50IHVuaXhfc3RyZWFtX3NlbmRtc2coc3RydWN0IGtpb2NiICosIHN0cnVjdCBzb2NrZXQgKiwKKwkJCSAgICAgICBzdHJ1Y3QgbXNnaGRyICosIHNpemVfdCk7CitzdGF0aWMgaW50IHVuaXhfc3RyZWFtX3JlY3Ztc2coc3RydWN0IGtpb2NiICosIHN0cnVjdCBzb2NrZXQgKiwKKwkJCSAgICAgICBzdHJ1Y3QgbXNnaGRyICosIHNpemVfdCwgaW50KTsKK3N0YXRpYyBpbnQgdW5peF9kZ3JhbV9zZW5kbXNnKHN0cnVjdCBraW9jYiAqLCBzdHJ1Y3Qgc29ja2V0ICosCisJCQkgICAgICBzdHJ1Y3QgbXNnaGRyICosIHNpemVfdCk7CitzdGF0aWMgaW50IHVuaXhfZGdyYW1fcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKiwgc3RydWN0IHNvY2tldCAqLAorCQkJICAgICAgc3RydWN0IG1zZ2hkciAqLCBzaXplX3QsIGludCk7CitzdGF0aWMgaW50IHVuaXhfZGdyYW1fY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCBzb2NrYWRkciAqLAorCQkJICAgICAgaW50LCBpbnQpOworc3RhdGljIGludCB1bml4X3NlcXBhY2tldF9zZW5kbXNnKHN0cnVjdCBraW9jYiAqLCBzdHJ1Y3Qgc29ja2V0ICosCisJCQkJICBzdHJ1Y3QgbXNnaGRyICosIHNpemVfdCk7CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIHVuaXhfc3RyZWFtX29wcyA9IHsKKwkuZmFtaWx5ID0JUEZfVU5JWCwKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkucmVsZWFzZSA9CXVuaXhfcmVsZWFzZSwKKwkuYmluZCA9CQl1bml4X2JpbmQsCisJLmNvbm5lY3QgPQl1bml4X3N0cmVhbV9jb25uZWN0LAorCS5zb2NrZXRwYWlyID0JdW5peF9zb2NrZXRwYWlyLAorCS5hY2NlcHQgPQl1bml4X2FjY2VwdCwKKwkuZ2V0bmFtZSA9CXVuaXhfZ2V0bmFtZSwKKwkucG9sbCA9CQl1bml4X3BvbGwsCisJLmlvY3RsID0JdW5peF9pb2N0bCwKKwkubGlzdGVuID0JdW5peF9saXN0ZW4sCisJLnNodXRkb3duID0JdW5peF9zaHV0ZG93biwKKwkuc2V0c29ja29wdCA9CXNvY2tfbm9fc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdCA9CXNvY2tfbm9fZ2V0c29ja29wdCwKKwkuc2VuZG1zZyA9CXVuaXhfc3RyZWFtX3NlbmRtc2csCisJLnJlY3Ztc2cgPQl1bml4X3N0cmVhbV9yZWN2bXNnLAorCS5tbWFwID0JCXNvY2tfbm9fbW1hcCwKKwkuc2VuZHBhZ2UgPQlzb2NrX25vX3NlbmRwYWdlLAorfTsKKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgdW5peF9kZ3JhbV9vcHMgPSB7CisJLmZhbWlseSA9CVBGX1VOSVgsCisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLnJlbGVhc2UgPQl1bml4X3JlbGVhc2UsCisJLmJpbmQgPQkJdW5peF9iaW5kLAorCS5jb25uZWN0ID0JdW5peF9kZ3JhbV9jb25uZWN0LAorCS5zb2NrZXRwYWlyID0JdW5peF9zb2NrZXRwYWlyLAorCS5hY2NlcHQgPQlzb2NrX25vX2FjY2VwdCwKKwkuZ2V0bmFtZSA9CXVuaXhfZ2V0bmFtZSwKKwkucG9sbCA9CQlkYXRhZ3JhbV9wb2xsLAorCS5pb2N0bCA9CXVuaXhfaW9jdGwsCisJLmxpc3RlbiA9CXNvY2tfbm9fbGlzdGVuLAorCS5zaHV0ZG93biA9CXVuaXhfc2h1dGRvd24sCisJLnNldHNvY2tvcHQgPQlzb2NrX25vX3NldHNvY2tvcHQsCisJLmdldHNvY2tvcHQgPQlzb2NrX25vX2dldHNvY2tvcHQsCisJLnNlbmRtc2cgPQl1bml4X2RncmFtX3NlbmRtc2csCisJLnJlY3Ztc2cgPQl1bml4X2RncmFtX3JlY3Ztc2csCisJLm1tYXAgPQkJc29ja19ub19tbWFwLAorCS5zZW5kcGFnZSA9CXNvY2tfbm9fc2VuZHBhZ2UsCit9OworCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyB1bml4X3NlcXBhY2tldF9vcHMgPSB7CisJLmZhbWlseSA9CVBGX1VOSVgsCisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLnJlbGVhc2UgPQl1bml4X3JlbGVhc2UsCisJLmJpbmQgPQkJdW5peF9iaW5kLAorCS5jb25uZWN0ID0JdW5peF9zdHJlYW1fY29ubmVjdCwKKwkuc29ja2V0cGFpciA9CXVuaXhfc29ja2V0cGFpciwKKwkuYWNjZXB0ID0JdW5peF9hY2NlcHQsCisJLmdldG5hbWUgPQl1bml4X2dldG5hbWUsCisJLnBvbGwgPQkJZGF0YWdyYW1fcG9sbCwKKwkuaW9jdGwgPQl1bml4X2lvY3RsLAorCS5saXN0ZW4gPQl1bml4X2xpc3RlbiwKKwkuc2h1dGRvd24gPQl1bml4X3NodXRkb3duLAorCS5zZXRzb2Nrb3B0ID0Jc29ja19ub19zZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0ID0Jc29ja19ub19nZXRzb2Nrb3B0LAorCS5zZW5kbXNnID0JdW5peF9zZXFwYWNrZXRfc2VuZG1zZywKKwkucmVjdm1zZyA9CXVuaXhfZGdyYW1fcmVjdm1zZywKKwkubW1hcCA9CQlzb2NrX25vX21tYXAsCisJLnNlbmRwYWdlID0Jc29ja19ub19zZW5kcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG8gdW5peF9wcm90byA9IHsKKwkubmFtZQkgID0gIlVOSVgiLAorCS5vd25lcgkgID0gVEhJU19NT0RVTEUsCisJLm9ial9zaXplID0gc2l6ZW9mKHN0cnVjdCB1bml4X3NvY2spLAorfTsKKworc3RhdGljIHN0cnVjdCBzb2NrICogdW5peF9jcmVhdGUxKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJc3RydWN0IHNvY2sgKnNrID0gTlVMTDsKKwlzdHJ1Y3QgdW5peF9zb2NrICp1OworCisJaWYgKGF0b21pY19yZWFkKCZ1bml4X25yX3NvY2tzKSA+PSAyKmZpbGVzX3N0YXQubWF4X2ZpbGVzKQorCQlnb3RvIG91dDsKKworCXNrID0gc2tfYWxsb2MoUEZfVU5JWCwgR0ZQX0tFUk5FTCwgJnVuaXhfcHJvdG8sIDEpOworCWlmICghc2spCisJCWdvdG8gb3V0OworCisJYXRvbWljX2luYygmdW5peF9ucl9zb2Nrcyk7CisKKwlzb2NrX2luaXRfZGF0YShzb2NrLHNrKTsKKworCXNrLT5za193cml0ZV9zcGFjZQk9IHVuaXhfd3JpdGVfc3BhY2U7CisJc2stPnNrX21heF9hY2tfYmFja2xvZwk9IHN5c2N0bF91bml4X21heF9kZ3JhbV9xbGVuOworCXNrLT5za19kZXN0cnVjdAkJPSB1bml4X3NvY2tfZGVzdHJ1Y3RvcjsKKwl1CSAgPSB1bml4X3NrKHNrKTsKKwl1LT5kZW50cnkgPSBOVUxMOworCXUtPm1udAkgID0gTlVMTDsKKwlyd2xvY2tfaW5pdCgmdS0+bG9jayk7CisJYXRvbWljX3NldCgmdS0+aW5mbGlnaHQsIHNvY2sgPyAwIDogLTEpOworCWluaXRfTVVURVgoJnUtPnJlYWRzZW0pOyAvKiBzaW5nbGUgdGFzayByZWFkaW5nIGxvY2sgKi8KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ1LT5wZWVyX3dhaXQpOworCXVuaXhfaW5zZXJ0X3NvY2tldCh1bml4X3NvY2tldHNfdW5ib3VuZCwgc2spOworb3V0OgorCXJldHVybiBzazsKK30KKworc3RhdGljIGludCB1bml4X2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgcHJvdG9jb2wpCit7CisJaWYgKHByb3RvY29sICYmIHByb3RvY29sICE9IFBGX1VOSVgpCisJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOworCisJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKKworCXN3aXRjaCAoc29jay0+dHlwZSkgeworCWNhc2UgU09DS19TVFJFQU06CisJCXNvY2stPm9wcyA9ICZ1bml4X3N0cmVhbV9vcHM7CisJCWJyZWFrOworCQkvKgorCQkgKglCZWxpZXZlIGl0IG9yIG5vdCBCU0QgaGFzIEFGX1VOSVgsIFNPQ0tfUkFXIHRob3VnaAorCQkgKglub3RoaW5nIHVzZXMgaXQuCisJCSAqLworCWNhc2UgU09DS19SQVc6CisJCXNvY2stPnR5cGU9U09DS19ER1JBTTsKKwljYXNlIFNPQ0tfREdSQU06CisJCXNvY2stPm9wcyA9ICZ1bml4X2RncmFtX29wczsKKwkJYnJlYWs7CisJY2FzZSBTT0NLX1NFUVBBQ0tFVDoKKwkJc29jay0+b3BzID0gJnVuaXhfc2VxcGFja2V0X29wczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FU09DS1ROT1NVUFBPUlQ7CisJfQorCisJcmV0dXJuIHVuaXhfY3JlYXRlMShzb2NrKSA/IDAgOiAtRU5PTUVNOworfQorCitzdGF0aWMgaW50IHVuaXhfcmVsZWFzZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCisJaWYgKCFzaykKKwkJcmV0dXJuIDA7CisKKwlzb2NrLT5zayA9IE5VTEw7CisKKwlyZXR1cm4gdW5peF9yZWxlYXNlX3NvY2sgKHNrLCAwKTsKK30KKworc3RhdGljIGludCB1bml4X2F1dG9iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHVuaXhfc29jayAqdSA9IHVuaXhfc2soc2spOworCXN0YXRpYyB1MzIgb3JkZXJudW0gPSAxOworCXN0cnVjdCB1bml4X2FkZHJlc3MgKiBhZGRyOworCWludCBlcnI7CisKKwlkb3duKCZ1LT5yZWFkc2VtKTsKKworCWVyciA9IDA7CisJaWYgKHUtPmFkZHIpCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVOT01FTTsKKwlhZGRyID0ga21hbGxvYyhzaXplb2YoKmFkZHIpICsgc2l6ZW9mKHNob3J0KSArIDE2LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFkZHIpCisJCWdvdG8gb3V0OworCisJbWVtc2V0KGFkZHIsIDAsIHNpemVvZigqYWRkcikgKyBzaXplb2Yoc2hvcnQpICsgMTYpOworCWFkZHItPm5hbWUtPnN1bl9mYW1pbHkgPSBBRl9VTklYOworCWF0b21pY19zZXQoJmFkZHItPnJlZmNudCwgMSk7CisKK3JldHJ5OgorCWFkZHItPmxlbiA9IHNwcmludGYoYWRkci0+bmFtZS0+c3VuX3BhdGgrMSwgIiUwNXgiLCBvcmRlcm51bSkgKyAxICsgc2l6ZW9mKHNob3J0KTsKKwlhZGRyLT5oYXNoID0gdW5peF9oYXNoX2ZvbGQoY3N1bV9wYXJ0aWFsKCh2b2lkKilhZGRyLT5uYW1lLCBhZGRyLT5sZW4sIDApKTsKKworCXdyaXRlX2xvY2soJnVuaXhfdGFibGVfbG9jayk7CisJb3JkZXJudW0gPSAob3JkZXJudW0rMSkmMHhGRkZGRjsKKworCWlmIChfX3VuaXhfZmluZF9zb2NrZXRfYnluYW1lKGFkZHItPm5hbWUsIGFkZHItPmxlbiwgc29jay0+dHlwZSwKKwkJCQkgICAgICBhZGRyLT5oYXNoKSkgeworCQl3cml0ZV91bmxvY2soJnVuaXhfdGFibGVfbG9jayk7CisJCS8qIFNhbml0eSB5aWVsZC4gSXQgaXMgdW51c3VhbCBjYXNlLCBidXQgeWV0Li4uICovCisJCWlmICghKG9yZGVybnVtJjB4RkYpKQorCQkJeWllbGQoKTsKKwkJZ290byByZXRyeTsKKwl9CisJYWRkci0+aGFzaCBePSBzay0+c2tfdHlwZTsKKworCV9fdW5peF9yZW1vdmVfc29ja2V0KHNrKTsKKwl1LT5hZGRyID0gYWRkcjsKKwlfX3VuaXhfaW5zZXJ0X3NvY2tldCgmdW5peF9zb2NrZXRfdGFibGVbYWRkci0+aGFzaF0sIHNrKTsKKwl3cml0ZV91bmxvY2soJnVuaXhfdGFibGVfbG9jayk7CisJZXJyID0gMDsKKworb3V0Ogl1cCgmdS0+cmVhZHNlbSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBzb2NrICp1bml4X2ZpbmRfb3RoZXIoc3RydWN0IHNvY2thZGRyX3VuICpzdW5uYW1lLCBpbnQgbGVuLAorCQkJCSAgICBpbnQgdHlwZSwgdW5zaWduZWQgaGFzaCwgaW50ICplcnJvcikKK3sKKwlzdHJ1Y3Qgc29jayAqdTsKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWludCBlcnIgPSAwOworCQorCWlmIChzdW5uYW1lLT5zdW5fcGF0aFswXSkgeworCQllcnIgPSBwYXRoX2xvb2t1cChzdW5uYW1lLT5zdW5fcGF0aCwgTE9PS1VQX0ZPTExPVywgJm5kKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZmFpbDsKKwkJZXJyID0gcGVybWlzc2lvbihuZC5kZW50cnktPmRfaW5vZGUsTUFZX1dSSVRFLCAmbmQpOworCQlpZiAoZXJyKQorCQkJZ290byBwdXRfZmFpbDsKKworCQllcnIgPSAtRUNPTk5SRUZVU0VEOworCQlpZiAoIVNfSVNTT0NLKG5kLmRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkKKwkJCWdvdG8gcHV0X2ZhaWw7CisJCXU9dW5peF9maW5kX3NvY2tldF9ieWlub2RlKG5kLmRlbnRyeS0+ZF9pbm9kZSk7CisJCWlmICghdSkKKwkJCWdvdG8gcHV0X2ZhaWw7CisKKwkJaWYgKHUtPnNrX3R5cGUgPT0gdHlwZSkKKwkJCXRvdWNoX2F0aW1lKG5kLm1udCwgbmQuZGVudHJ5KTsKKworCQlwYXRoX3JlbGVhc2UoJm5kKTsKKworCQllcnI9LUVQUk9UT1RZUEU7CisJCWlmICh1LT5za190eXBlICE9IHR5cGUpIHsKKwkJCXNvY2tfcHV0KHUpOworCQkJZ290byBmYWlsOworCQl9CisJfSBlbHNlIHsKKwkJZXJyID0gLUVDT05OUkVGVVNFRDsKKwkJdT11bml4X2ZpbmRfc29ja2V0X2J5bmFtZShzdW5uYW1lLCBsZW4sIHR5cGUsIGhhc2gpOworCQlpZiAodSkgeworCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCQkJZGVudHJ5ID0gdW5peF9zayh1KS0+ZGVudHJ5OworCQkJaWYgKGRlbnRyeSkKKwkJCQl0b3VjaF9hdGltZSh1bml4X3NrKHUpLT5tbnQsIGRlbnRyeSk7CisJCX0gZWxzZQorCQkJZ290byBmYWlsOworCX0KKwlyZXR1cm4gdTsKKworcHV0X2ZhaWw6CisJcGF0aF9yZWxlYXNlKCZuZCk7CitmYWlsOgorCSplcnJvcj1lcnI7CisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIGludCB1bml4X2JpbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwgaW50IGFkZHJfbGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCB1bml4X3NvY2sgKnUgPSB1bml4X3NrKHNrKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gKnN1bmFkZHI9KHN0cnVjdCBzb2NrYWRkcl91biAqKXVhZGRyOworCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBOVUxMOworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJaW50IGVycjsKKwl1bnNpZ25lZCBoYXNoOworCXN0cnVjdCB1bml4X2FkZHJlc3MgKmFkZHI7CisJc3RydWN0IGhsaXN0X2hlYWQgKmxpc3Q7CisKKwllcnIgPSAtRUlOVkFMOworCWlmIChzdW5hZGRyLT5zdW5fZmFtaWx5ICE9IEFGX1VOSVgpCisJCWdvdG8gb3V0OworCisJaWYgKGFkZHJfbGVuPT1zaXplb2Yoc2hvcnQpKSB7CisJCWVyciA9IHVuaXhfYXV0b2JpbmQoc29jayk7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IHVuaXhfbWtuYW1lKHN1bmFkZHIsIGFkZHJfbGVuLCAmaGFzaCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCWFkZHJfbGVuID0gZXJyOworCisJZG93bigmdS0+cmVhZHNlbSk7CisKKwllcnIgPSAtRUlOVkFMOworCWlmICh1LT5hZGRyKQorCQlnb3RvIG91dF91cDsKKworCWVyciA9IC1FTk9NRU07CisJYWRkciA9IGttYWxsb2Moc2l6ZW9mKCphZGRyKSthZGRyX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhZGRyKQorCQlnb3RvIG91dF91cDsKKworCW1lbWNweShhZGRyLT5uYW1lLCBzdW5hZGRyLCBhZGRyX2xlbik7CisJYWRkci0+bGVuID0gYWRkcl9sZW47CisJYWRkci0+aGFzaCA9IGhhc2ggXiBzay0+c2tfdHlwZTsKKwlhdG9taWNfc2V0KCZhZGRyLT5yZWZjbnQsIDEpOworCisJaWYgKHN1bmFkZHItPnN1bl9wYXRoWzBdKSB7CisJCXVuc2lnbmVkIGludCBtb2RlOworCQllcnIgPSAwOworCQkvKgorCQkgKiBHZXQgdGhlIHBhcmVudCBkaXJlY3RvcnksIGNhbGN1bGF0ZSB0aGUgaGFzaCBmb3IgbGFzdAorCQkgKiBjb21wb25lbnQuCisJCSAqLworCQllcnIgPSBwYXRoX2xvb2t1cChzdW5hZGRyLT5zdW5fcGF0aCwgTE9PS1VQX1BBUkVOVCwgJm5kKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X21rbm9kX3BhcmVudDsKKwkJLyoKKwkJICogWXVja3kgbGFzdCBjb21wb25lbnQgb3Igbm8gbGFzdCBjb21wb25lbnQgYXQgYWxsPworCQkgKiAoZm9vLy4sIGZvby8uLiwgLy8vLy8pCisJCSAqLworCQllcnIgPSAtRUVYSVNUOworCQlpZiAobmQubGFzdF90eXBlICE9IExBU1RfTk9STSkKKwkJCWdvdG8gb3V0X21rbm9kOworCQkvKgorCQkgKiBMb2NrIHRoZSBkaXJlY3RvcnkuCisJCSAqLworCQlkb3duKCZuZC5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwkJLyoKKwkJICogRG8gdGhlIGZpbmFsIGxvb2t1cC4KKwkJICovCisJCWRlbnRyeSA9IGxvb2t1cF9oYXNoKCZuZC5sYXN0LCBuZC5kZW50cnkpOworCQllcnIgPSBQVFJfRVJSKGRlbnRyeSk7CisJCWlmIChJU19FUlIoZGVudHJ5KSkKKwkJCWdvdG8gb3V0X21rbm9kX3VubG9jazsKKwkJZXJyID0gLUVOT0VOVDsKKwkJLyoKKwkJICogU3BlY2lhbCBjYXNlIC0gbG9va3VwIGdhdmUgbmVnYXRpdmUsIGJ1dC4uLiB3ZSBoYWQgZm9vL2Jhci8KKwkJICogRnJvbSB0aGUgdmZzX21rbm9kKCkgUE9WIHdlIGp1c3QgaGF2ZSBhIG5lZ2F0aXZlIGRlbnRyeSAtCisJCSAqIGFsbCBpcyBmaW5lLiBMZXQncyBiZSBiYXN0YXJkcyAtIHlvdSBoYWQgLyBvbiB0aGUgZW5kLCB5b3UndmUKKwkJICogYmVlbiBhc2tpbmcgZm9yIChub24tZXhpc3RlbnQpIGRpcmVjdG9yeS4gLUVOT0VOVCBmb3IgeW91LgorCQkgKi8KKwkJaWYgKG5kLmxhc3QubmFtZVtuZC5sYXN0Lmxlbl0gJiYgIWRlbnRyeS0+ZF9pbm9kZSkKKwkJCWdvdG8gb3V0X21rbm9kX2RwdXQ7CisJCS8qCisJCSAqIEFsbCByaWdodCwgbGV0J3MgY3JlYXRlIGl0LgorCQkgKi8KKwkJbW9kZSA9IFNfSUZTT0NLIHwKKwkJICAgICAgIChTT0NLX0lOT0RFKHNvY2spLT5pX21vZGUgJiB+Y3VycmVudC0+ZnMtPnVtYXNrKTsKKwkJZXJyID0gdmZzX21rbm9kKG5kLmRlbnRyeS0+ZF9pbm9kZSwgZGVudHJ5LCBtb2RlLCAwKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X21rbm9kX2RwdXQ7CisJCXVwKCZuZC5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwkJZHB1dChuZC5kZW50cnkpOworCQluZC5kZW50cnkgPSBkZW50cnk7CisKKwkJYWRkci0+aGFzaCA9IFVOSVhfSEFTSF9TSVpFOworCX0KKworCXdyaXRlX2xvY2soJnVuaXhfdGFibGVfbG9jayk7CisKKwlpZiAoIXN1bmFkZHItPnN1bl9wYXRoWzBdKSB7CisJCWVyciA9IC1FQUREUklOVVNFOworCQlpZiAoX191bml4X2ZpbmRfc29ja2V0X2J5bmFtZShzdW5hZGRyLCBhZGRyX2xlbiwKKwkJCQkJICAgICAgc2stPnNrX3R5cGUsIGhhc2gpKSB7CisJCQl1bml4X3JlbGVhc2VfYWRkcihhZGRyKTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCisJCWxpc3QgPSAmdW5peF9zb2NrZXRfdGFibGVbYWRkci0+aGFzaF07CisJfSBlbHNlIHsKKwkJbGlzdCA9ICZ1bml4X3NvY2tldF90YWJsZVtkZW50cnktPmRfaW5vZGUtPmlfaW5vICYgKFVOSVhfSEFTSF9TSVpFLTEpXTsKKwkJdS0+ZGVudHJ5ID0gbmQuZGVudHJ5OworCQl1LT5tbnQgICAgPSBuZC5tbnQ7CisJfQorCisJZXJyID0gMDsKKwlfX3VuaXhfcmVtb3ZlX3NvY2tldChzayk7CisJdS0+YWRkciA9IGFkZHI7CisJX191bml4X2luc2VydF9zb2NrZXQobGlzdCwgc2spOworCitvdXRfdW5sb2NrOgorCXdyaXRlX3VubG9jaygmdW5peF90YWJsZV9sb2NrKTsKK291dF91cDoKKwl1cCgmdS0+cmVhZHNlbSk7CitvdXQ6CisJcmV0dXJuIGVycjsKKworb3V0X21rbm9kX2RwdXQ6CisJZHB1dChkZW50cnkpOworb3V0X21rbm9kX3VubG9jazoKKwl1cCgmbmQuZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CitvdXRfbWtub2Q6CisJcGF0aF9yZWxlYXNlKCZuZCk7CitvdXRfbWtub2RfcGFyZW50OgorCWlmIChlcnI9PS1FRVhJU1QpCisJCWVycj0tRUFERFJJTlVTRTsKKwl1bml4X3JlbGVhc2VfYWRkcihhZGRyKTsKKwlnb3RvIG91dF91cDsKK30KKworc3RhdGljIGludCB1bml4X2RncmFtX2Nvbm5lY3Qoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLAorCQkJICAgICAgaW50IGFsZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gKnN1bmFkZHI9KHN0cnVjdCBzb2NrYWRkcl91biopYWRkcjsKKwlzdHJ1Y3Qgc29jayAqb3RoZXI7CisJdW5zaWduZWQgaGFzaDsKKwlpbnQgZXJyOworCisJaWYgKGFkZHItPnNhX2ZhbWlseSAhPSBBRl9VTlNQRUMpIHsKKwkJZXJyID0gdW5peF9ta25hbWUoc3VuYWRkciwgYWxlbiwgJmhhc2gpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gb3V0OworCQlhbGVuID0gZXJyOworCisJCWlmICh0ZXN0X2JpdChTT0NLX1BBU1NDUkVELCAmc29jay0+ZmxhZ3MpICYmCisJCSAgICAhdW5peF9zayhzayktPmFkZHIgJiYgKGVyciA9IHVuaXhfYXV0b2JpbmQoc29jaykpICE9IDApCisJCQlnb3RvIG91dDsKKworCQlvdGhlcj11bml4X2ZpbmRfb3RoZXIoc3VuYWRkciwgYWxlbiwgc29jay0+dHlwZSwgaGFzaCwgJmVycik7CisJCWlmICghb3RoZXIpCisJCQlnb3RvIG91dDsKKworCQl1bml4X3N0YXRlX3dsb2NrKHNrKTsKKworCQllcnIgPSAtRVBFUk07CisJCWlmICghdW5peF9tYXlfc2VuZChzaywgb3RoZXIpKQorCQkJZ290byBvdXRfdW5sb2NrOworCisJCWVyciA9IHNlY3VyaXR5X3VuaXhfbWF5X3NlbmQoc2stPnNrX3NvY2tldCwgb3RoZXItPnNrX3NvY2tldCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF91bmxvY2s7CisKKwl9IGVsc2UgeworCQkvKgorCQkgKgkxMDAzLjFnIGJyZWFraW5nIGNvbm5lY3RlZCBzdGF0ZSB3aXRoIEFGX1VOU1BFQworCQkgKi8KKwkJb3RoZXIgPSBOVUxMOworCQl1bml4X3N0YXRlX3dsb2NrKHNrKTsKKwl9CisKKwkvKgorCSAqIElmIGl0IHdhcyBjb25uZWN0ZWQsIHJlY29ubmVjdC4KKwkgKi8KKwlpZiAodW5peF9wZWVyKHNrKSkgeworCQlzdHJ1Y3Qgc29jayAqb2xkX3BlZXIgPSB1bml4X3BlZXIoc2spOworCQl1bml4X3BlZXIoc2spPW90aGVyOworCQl1bml4X3N0YXRlX3d1bmxvY2soc2spOworCisJCWlmIChvdGhlciAhPSBvbGRfcGVlcikKKwkJCXVuaXhfZGdyYW1fZGlzY29ubmVjdGVkKHNrLCBvbGRfcGVlcik7CisJCXNvY2tfcHV0KG9sZF9wZWVyKTsKKwl9IGVsc2UgeworCQl1bml4X3BlZXIoc2spPW90aGVyOworCQl1bml4X3N0YXRlX3d1bmxvY2soc2spOworCX0KKyAJcmV0dXJuIDA7CisKK291dF91bmxvY2s6CisJdW5peF9zdGF0ZV93dW5sb2NrKHNrKTsKKwlzb2NrX3B1dChvdGhlcik7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGxvbmcgdW5peF93YWl0X2Zvcl9wZWVyKHN0cnVjdCBzb2NrICpvdGhlciwgbG9uZyB0aW1lbykKK3sKKwlzdHJ1Y3QgdW5peF9zb2NrICp1ID0gdW5peF9zayhvdGhlcik7CisJaW50IHNjaGVkOworCURFRklORV9XQUlUKHdhaXQpOworCisJcHJlcGFyZV90b193YWl0X2V4Y2x1c2l2ZSgmdS0+cGVlcl93YWl0LCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCXNjaGVkID0gIXNvY2tfZmxhZyhvdGhlciwgU09DS19ERUFEKSAmJgorCQkhKG90aGVyLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikgJiYKKwkJKHNrYl9xdWV1ZV9sZW4oJm90aGVyLT5za19yZWNlaXZlX3F1ZXVlKSA+CisJCSBvdGhlci0+c2tfbWF4X2Fja19iYWNrbG9nKTsKKworCXVuaXhfc3RhdGVfcnVubG9jayhvdGhlcik7CisKKwlpZiAoc2NoZWQpCisJCXRpbWVvID0gc2NoZWR1bGVfdGltZW91dCh0aW1lbyk7CisKKwlmaW5pc2hfd2FpdCgmdS0+cGVlcl93YWl0LCAmd2FpdCk7CisJcmV0dXJuIHRpbWVvOworfQorCitzdGF0aWMgaW50IHVuaXhfc3RyZWFtX2Nvbm5lY3Qoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwKKwkJCSAgICAgICBpbnQgYWRkcl9sZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gKnN1bmFkZHI9KHN0cnVjdCBzb2NrYWRkcl91biAqKXVhZGRyOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCB1bml4X3NvY2sgKnUgPSB1bml4X3NrKHNrKSwgKm5ld3UsICpvdGhlcnU7CisJc3RydWN0IHNvY2sgKm5ld3NrID0gTlVMTDsKKwlzdHJ1Y3Qgc29jayAqb3RoZXIgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXVuc2lnbmVkIGhhc2g7CisJaW50IHN0OworCWludCBlcnI7CisJbG9uZyB0aW1lbzsKKworCWVyciA9IHVuaXhfbWtuYW1lKHN1bmFkZHIsIGFkZHJfbGVuLCAmaGFzaCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCWFkZHJfbGVuID0gZXJyOworCisJaWYgKHRlc3RfYml0KFNPQ0tfUEFTU0NSRUQsICZzb2NrLT5mbGFncykKKwkJJiYgIXUtPmFkZHIgJiYgKGVyciA9IHVuaXhfYXV0b2JpbmQoc29jaykpICE9IDApCisJCWdvdG8gb3V0OworCisJdGltZW8gPSBzb2NrX3NuZHRpbWVvKHNrLCBmbGFncyAmIE9fTk9OQkxPQ0spOworCisJLyogRmlyc3Qgb2YgYWxsIGFsbG9jYXRlIHJlc291cmNlcy4KKwkgICBJZiB3ZSB3aWxsIG1ha2UgaXQgYWZ0ZXIgc3RhdGUgaXMgbG9ja2VkLAorCSAgIHdlIHdpbGwgaGF2ZSB0byByZWNoZWNrIGFsbCBhZ2FpbiBpbiBhbnkgY2FzZS4KKwkgKi8KKworCWVyciA9IC1FTk9NRU07CisKKwkvKiBjcmVhdGUgbmV3IHNvY2sgZm9yIGNvbXBsZXRlIGNvbm5lY3Rpb24gKi8KKwluZXdzayA9IHVuaXhfY3JlYXRlMShOVUxMKTsKKwlpZiAobmV3c2sgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwkvKiBBbGxvY2F0ZSBza2IgZm9yIHNlbmRpbmcgdG8gbGlzdGVuaW5nIHNvY2sgKi8KKwlza2IgPSBzb2NrX3dtYWxsb2MobmV3c2ssIDEsIDAsIEdGUF9LRVJORUwpOworCWlmIChza2IgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKK3Jlc3RhcnQ6CisJLyogIEZpbmQgbGlzdGVuaW5nIHNvY2suICovCisJb3RoZXIgPSB1bml4X2ZpbmRfb3RoZXIoc3VuYWRkciwgYWRkcl9sZW4sIHNrLT5za190eXBlLCBoYXNoLCAmZXJyKTsKKwlpZiAoIW90aGVyKQorCQlnb3RvIG91dDsKKworCS8qIExhdGNoIHN0YXRlIG9mIHBlZXIgKi8KKwl1bml4X3N0YXRlX3Jsb2NrKG90aGVyKTsKKworCS8qIEFwcGFyZW50bHkgVkZTIG92ZXJzbGVwdCBzb2NrZXQgZGVhdGguIFJldHJ5LiAqLworCWlmIChzb2NrX2ZsYWcob3RoZXIsIFNPQ0tfREVBRCkpIHsKKwkJdW5peF9zdGF0ZV9ydW5sb2NrKG90aGVyKTsKKwkJc29ja19wdXQob3RoZXIpOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCisJZXJyID0gLUVDT05OUkVGVVNFRDsKKwlpZiAob3RoZXItPnNrX3N0YXRlICE9IFRDUF9MSVNURU4pCisJCWdvdG8gb3V0X3VubG9jazsKKworCWlmIChza2JfcXVldWVfbGVuKCZvdGhlci0+c2tfcmVjZWl2ZV9xdWV1ZSkgPgorCSAgICBvdGhlci0+c2tfbWF4X2Fja19iYWNrbG9nKSB7CisJCWVyciA9IC1FQUdBSU47CisJCWlmICghdGltZW8pCisJCQlnb3RvIG91dF91bmxvY2s7CisKKwkJdGltZW8gPSB1bml4X3dhaXRfZm9yX3BlZXIob3RoZXIsIHRpbWVvKTsKKworCQllcnIgPSBzb2NrX2ludHJfZXJybm8odGltZW8pOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlnb3RvIG91dDsKKwkJc29ja19wdXQob3RoZXIpOworCQlnb3RvIHJlc3RhcnQ7CisgICAgICAgIH0KKworCS8qIExhdGNoIG91ciBzdGF0ZS4KKworCSAgIEl0IGlzIHRyaWNreSBwbGFjZS4gV2UgbmVlZCB0byBncmFiIHdyaXRlIGxvY2sgYW5kIGNhbm5vdAorCSAgIGRyb3AgbG9jayBvbiBwZWVyLiBJdCBpcyBkYW5nZXJvdXMgYmVjYXVzZSBkZWFkbG9jayBpcworCSAgIHBvc3NpYmxlLiBDb25uZWN0IHRvIHNlbGYgY2FzZSBhbmQgc2ltdWx0YW5lb3VzCisJICAgYXR0ZW1wdCB0byBjb25uZWN0IGFyZSBlbGltaW5hdGVkIGJ5IGNoZWNraW5nIHNvY2tldAorCSAgIHN0YXRlLiBvdGhlciBpcyBUQ1BfTElTVEVOLCBpZiBzayBpcyBUQ1BfTElTVEVOIHdlCisJICAgY2hlY2sgdGhpcyBiZWZvcmUgYXR0ZW1wdCB0byBncmFiIGxvY2suCisKKwkgICBXZWxsLCBhbmQgd2UgaGF2ZSB0byByZWNoZWNrIHRoZSBzdGF0ZSBhZnRlciBzb2NrZXQgbG9ja2VkLgorCSAqLworCXN0ID0gc2stPnNrX3N0YXRlOworCisJc3dpdGNoIChzdCkgeworCWNhc2UgVENQX0NMT1NFOgorCQkvKiBUaGlzIGlzIG9rLi4uIGNvbnRpbnVlIHdpdGggY29ubmVjdCAqLworCQlicmVhazsKKwljYXNlIFRDUF9FU1RBQkxJU0hFRDoKKwkJLyogU29ja2V0IGlzIGFscmVhZHkgY29ubmVjdGVkICovCisJCWVyciA9IC1FSVNDT05OOworCQlnb3RvIG91dF91bmxvY2s7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCXVuaXhfc3RhdGVfd2xvY2soc2spOworCisJaWYgKHNrLT5za19zdGF0ZSAhPSBzdCkgeworCQl1bml4X3N0YXRlX3d1bmxvY2soc2spOworCQl1bml4X3N0YXRlX3J1bmxvY2sob3RoZXIpOworCQlzb2NrX3B1dChvdGhlcik7CisJCWdvdG8gcmVzdGFydDsKKwl9CisKKwllcnIgPSBzZWN1cml0eV91bml4X3N0cmVhbV9jb25uZWN0KHNvY2ssIG90aGVyLT5za19zb2NrZXQsIG5ld3NrKTsKKwlpZiAoZXJyKSB7CisJCXVuaXhfc3RhdGVfd3VubG9jayhzayk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwkvKiBUaGUgd2F5IGlzIG9wZW4hIEZhc3RseSBzZXQgYWxsIHRoZSBuZWNlc3NhcnkgZmllbGRzLi4uICovCisKKwlzb2NrX2hvbGQoc2spOworCXVuaXhfcGVlcihuZXdzaykJPSBzazsKKwluZXdzay0+c2tfc3RhdGUJCT0gVENQX0VTVEFCTElTSEVEOworCW5ld3NrLT5za190eXBlCQk9IHNrLT5za190eXBlOworCW5ld3NrLT5za19wZWVyY3JlZC5waWQJPSBjdXJyZW50LT50Z2lkOworCW5ld3NrLT5za19wZWVyY3JlZC51aWQJPSBjdXJyZW50LT5ldWlkOworCW5ld3NrLT5za19wZWVyY3JlZC5naWQJPSBjdXJyZW50LT5lZ2lkOworCW5ld3UgPSB1bml4X3NrKG5ld3NrKTsKKwluZXdzay0+c2tfc2xlZXAJCT0gJm5ld3UtPnBlZXJfd2FpdDsKKwlvdGhlcnUgPSB1bml4X3NrKG90aGVyKTsKKworCS8qIGNvcHkgYWRkcmVzcyBpbmZvcm1hdGlvbiBmcm9tIGxpc3RlbmluZyB0byBuZXcgc29jayovCisJaWYgKG90aGVydS0+YWRkcikgeworCQlhdG9taWNfaW5jKCZvdGhlcnUtPmFkZHItPnJlZmNudCk7CisJCW5ld3UtPmFkZHIgPSBvdGhlcnUtPmFkZHI7CisJfQorCWlmIChvdGhlcnUtPmRlbnRyeSkgeworCQluZXd1LT5kZW50cnkJPSBkZ2V0KG90aGVydS0+ZGVudHJ5KTsKKwkJbmV3dS0+bW50CT0gbW50Z2V0KG90aGVydS0+bW50KTsKKwl9CisKKwkvKiBTZXQgY3JlZGVudGlhbHMgKi8KKwlzay0+c2tfcGVlcmNyZWQgPSBvdGhlci0+c2tfcGVlcmNyZWQ7CisKKwlzb2NrX2hvbGQobmV3c2spOworCXVuaXhfcGVlcihzaykJPSBuZXdzazsKKwlzb2NrLT5zdGF0ZQk9IFNTX0NPTk5FQ1RFRDsKKwlzay0+c2tfc3RhdGUJPSBUQ1BfRVNUQUJMSVNIRUQ7CisKKwl1bml4X3N0YXRlX3d1bmxvY2soc2spOworCisJLyogdGFrZSB0ZW4gYW5kIGFuZCBzZW5kIGluZm8gdG8gbGlzdGVuaW5nIHNvY2sgKi8KKwlzcGluX2xvY2soJm90aGVyLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOworCV9fc2tiX3F1ZXVlX3RhaWwoJm90aGVyLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpOworCS8qIFVuZG8gYXJ0aWZpY2lhbGx5IGRlY3JlYXNlZCBpbmZsaWdodCBhZnRlciBlbWJyaW9uCisJICogaXMgaW5zdGFsbGVkIHRvIGxpc3RlbmluZyBzb2NrZXQuICovCisJYXRvbWljX2luYygmbmV3dS0+aW5mbGlnaHQpOworCXNwaW5fdW5sb2NrKCZvdGhlci0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwl1bml4X3N0YXRlX3J1bmxvY2sob3RoZXIpOworCW90aGVyLT5za19kYXRhX3JlYWR5KG90aGVyLCAwKTsKKwlzb2NrX3B1dChvdGhlcik7CisJcmV0dXJuIDA7CisKK291dF91bmxvY2s6CisJaWYgKG90aGVyKQorCQl1bml4X3N0YXRlX3J1bmxvY2sob3RoZXIpOworCitvdXQ6CisJaWYgKHNrYikKKwkJa2ZyZWVfc2tiKHNrYik7CisJaWYgKG5ld3NrKQorCQl1bml4X3JlbGVhc2Vfc29jayhuZXdzaywgMCk7CisJaWYgKG90aGVyKQorCQlzb2NrX3B1dChvdGhlcik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB1bml4X3NvY2tldHBhaXIoc3RydWN0IHNvY2tldCAqc29ja2EsIHN0cnVjdCBzb2NrZXQgKnNvY2tiKQoreworCXN0cnVjdCBzb2NrICpza2E9c29ja2EtPnNrLCAqc2tiID0gc29ja2ItPnNrOworCisJLyogSm9pbiBvdXIgc29ja2V0cyBiYWNrIHRvIGJhY2sgKi8KKwlzb2NrX2hvbGQoc2thKTsKKwlzb2NrX2hvbGQoc2tiKTsKKwl1bml4X3BlZXIoc2thKT1za2I7CisJdW5peF9wZWVyKHNrYik9c2thOworCXNrYS0+c2tfcGVlcmNyZWQucGlkID0gc2tiLT5za19wZWVyY3JlZC5waWQgPSBjdXJyZW50LT50Z2lkOworCXNrYS0+c2tfcGVlcmNyZWQudWlkID0gc2tiLT5za19wZWVyY3JlZC51aWQgPSBjdXJyZW50LT5ldWlkOworCXNrYS0+c2tfcGVlcmNyZWQuZ2lkID0gc2tiLT5za19wZWVyY3JlZC5naWQgPSBjdXJyZW50LT5lZ2lkOworCisJaWYgKHNrYS0+c2tfdHlwZSAhPSBTT0NLX0RHUkFNKSB7CisJCXNrYS0+c2tfc3RhdGUgPSBUQ1BfRVNUQUJMSVNIRUQ7CisJCXNrYi0+c2tfc3RhdGUgPSBUQ1BfRVNUQUJMSVNIRUQ7CisJCXNvY2thLT5zdGF0ZSAgPSBTU19DT05ORUNURUQ7CisJCXNvY2tiLT5zdGF0ZSAgPSBTU19DT05ORUNURUQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVuaXhfYWNjZXB0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrZXQgKm5ld3NvY2ssIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgc29jayAqdHNrOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGVycjsKKworCWVyciA9IC1FT1BOT1RTVVBQOworCWlmIChzb2NrLT50eXBlIT1TT0NLX1NUUkVBTSAmJiBzb2NrLT50eXBlIT1TT0NLX1NFUVBBQ0tFVCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAtRUlOVkFMOworCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0xJU1RFTikKKwkJZ290byBvdXQ7CisKKwkvKiBJZiBzb2NrZXQgc3RhdGUgaXMgVENQX0xJU1RFTiBpdCBjYW5ub3QgY2hhbmdlIChmb3Igbm93Li4uKSwKKwkgKiBzbyB0aGF0IG5vIGxvY2tzIGFyZSBuZWNlc3NhcnkuCisJICovCisKKwlza2IgPSBza2JfcmVjdl9kYXRhZ3JhbShzaywgMCwgZmxhZ3MmT19OT05CTE9DSywgJmVycik7CisJaWYgKCFza2IpIHsKKwkJLyogVGhpcyBtZWFucyByZWNlaXZlIHNodXRkb3duLiAqLworCQlpZiAoZXJyID09IDApCisJCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwl0c2sgPSBza2ItPnNrOworCXNrYl9mcmVlX2RhdGFncmFtKHNrLCBza2IpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdW5peF9zayhzayktPnBlZXJfd2FpdCk7CisKKwkvKiBhdHRhY2ggYWNjZXB0ZWQgc29jayB0byBzb2NrZXQgKi8KKwl1bml4X3N0YXRlX3dsb2NrKHRzayk7CisJbmV3c29jay0+c3RhdGUgPSBTU19DT05ORUNURUQ7CisJc29ja19ncmFmdCh0c2ssIG5ld3NvY2spOworCXVuaXhfc3RhdGVfd3VubG9jayh0c2spOworCXJldHVybiAwOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IHVuaXhfZ2V0bmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLCBpbnQgKnVhZGRyX2xlbiwgaW50IHBlZXIpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHVuaXhfc29jayAqdTsKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gKnN1bmFkZHI9KHN0cnVjdCBzb2NrYWRkcl91biAqKXVhZGRyOworCWludCBlcnIgPSAwOworCisJaWYgKHBlZXIpIHsKKwkJc2sgPSB1bml4X3BlZXJfZ2V0KHNrKTsKKworCQllcnIgPSAtRU5PVENPTk47CisJCWlmICghc2spCisJCQlnb3RvIG91dDsKKwkJZXJyID0gMDsKKwl9IGVsc2UgeworCQlzb2NrX2hvbGQoc2spOworCX0KKworCXUgPSB1bml4X3NrKHNrKTsKKwl1bml4X3N0YXRlX3Jsb2NrKHNrKTsKKwlpZiAoIXUtPmFkZHIpIHsKKwkJc3VuYWRkci0+c3VuX2ZhbWlseSA9IEFGX1VOSVg7CisJCXN1bmFkZHItPnN1bl9wYXRoWzBdID0gMDsKKwkJKnVhZGRyX2xlbiA9IHNpemVvZihzaG9ydCk7CisJfSBlbHNlIHsKKwkJc3RydWN0IHVuaXhfYWRkcmVzcyAqYWRkciA9IHUtPmFkZHI7CisKKwkJKnVhZGRyX2xlbiA9IGFkZHItPmxlbjsKKwkJbWVtY3B5KHN1bmFkZHIsIGFkZHItPm5hbWUsICp1YWRkcl9sZW4pOworCX0KKwl1bml4X3N0YXRlX3J1bmxvY2soc2spOworCXNvY2tfcHV0KHNrKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCB1bml4X2RldGFjaF9mZHMoc3RydWN0IHNjbV9jb29raWUgKnNjbSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgaTsKKworCXNjbS0+ZnAgPSBVTklYQ0Ioc2tiKS5mcDsKKwlza2ItPmRlc3RydWN0b3IgPSBzb2NrX3dmcmVlOworCVVOSVhDQihza2IpLmZwID0gTlVMTDsKKworCWZvciAoaT1zY20tPmZwLT5jb3VudC0xOyBpPj0wOyBpLS0pCisJCXVuaXhfbm90aW5mbGlnaHQoc2NtLT5mcC0+ZnBbaV0pOworfQorCitzdGF0aWMgdm9pZCB1bml4X2Rlc3RydWN0X2ZkcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBzY21fY29va2llIHNjbTsKKwltZW1zZXQoJnNjbSwgMCwgc2l6ZW9mKHNjbSkpOworCXVuaXhfZGV0YWNoX2Zkcygmc2NtLCBza2IpOworCisJLyogQWxhcywgaXQgY2FsbHMgVkZTICovCisJLyogU28gZnNja2luZyB3aGF0PyBmcHV0KCkgaGFkIGJlZW4gU01QLXNhZmUgc2luY2UgdGhlIGxhc3QgU3VtbWVyICovCisJc2NtX2Rlc3Ryb3koJnNjbSk7CisJc29ja193ZnJlZShza2IpOworfQorCitzdGF0aWMgdm9pZCB1bml4X2F0dGFjaF9mZHMoc3RydWN0IHNjbV9jb29raWUgKnNjbSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgaTsKKwlmb3IgKGk9c2NtLT5mcC0+Y291bnQtMTsgaT49MDsgaS0tKQorCQl1bml4X2luZmxpZ2h0KHNjbS0+ZnAtPmZwW2ldKTsKKwlVTklYQ0Ioc2tiKS5mcCA9IHNjbS0+ZnA7CisJc2tiLT5kZXN0cnVjdG9yID0gdW5peF9kZXN0cnVjdF9mZHM7CisJc2NtLT5mcCA9IE5VTEw7Cit9CisKKy8qCisgKglTZW5kIEFGX1VOSVggZGF0YS4KKyAqLworCitzdGF0aWMgaW50IHVuaXhfZGdyYW1fc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmtpb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzb2NrX2lvY2IgKnNpb2NiID0ga2lvY2JfdG9fc2lvY2Ioa2lvY2IpOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCB1bml4X3NvY2sgKnUgPSB1bml4X3NrKHNrKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gKnN1bmFkZHI9bXNnLT5tc2dfbmFtZTsKKwlzdHJ1Y3Qgc29jayAqb3RoZXIgPSBOVUxMOworCWludCBuYW1lbGVuID0gMDsgLyogZmFrZSBHQ0MgKi8KKwlpbnQgZXJyOworCXVuc2lnbmVkIGhhc2g7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlsb25nIHRpbWVvOworCXN0cnVjdCBzY21fY29va2llIHRtcF9zY207CisKKwlpZiAoTlVMTCA9PSBzaW9jYi0+c2NtKQorCQlzaW9jYi0+c2NtID0gJnRtcF9zY207CisJZXJyID0gc2NtX3NlbmQoc29jaywgbXNnLCBzaW9jYi0+c2NtKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IC1FT1BOT1RTVVBQOworCWlmIChtc2ctPm1zZ19mbGFncyZNU0dfT09CKQorCQlnb3RvIG91dDsKKworCWlmIChtc2ctPm1zZ19uYW1lbGVuKSB7CisJCWVyciA9IHVuaXhfbWtuYW1lKHN1bmFkZHIsIG1zZy0+bXNnX25hbWVsZW4sICZoYXNoKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIG91dDsKKwkJbmFtZWxlbiA9IGVycjsKKwl9IGVsc2UgeworCQlzdW5hZGRyID0gTlVMTDsKKwkJZXJyID0gLUVOT1RDT05OOworCQlvdGhlciA9IHVuaXhfcGVlcl9nZXQoc2spOworCQlpZiAoIW90aGVyKQorCQkJZ290byBvdXQ7CisJfQorCisJaWYgKHRlc3RfYml0KFNPQ0tfUEFTU0NSRUQsICZzb2NrLT5mbGFncykKKwkJJiYgIXUtPmFkZHIgJiYgKGVyciA9IHVuaXhfYXV0b2JpbmQoc29jaykpICE9IDApCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVNU0dTSVpFOworCWlmIChsZW4gPiBzay0+c2tfc25kYnVmIC0gMzIpCisJCWdvdG8gb3V0OworCisJc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywgbGVuLCBtc2ctPm1zZ19mbGFncyZNU0dfRE9OVFdBSVQsICZlcnIpOworCWlmIChza2I9PU5VTEwpCisJCWdvdG8gb3V0OworCisJbWVtY3B5KFVOSVhDUkVEUyhza2IpLCAmc2lvY2ItPnNjbS0+Y3JlZHMsIHNpemVvZihzdHJ1Y3QgdWNyZWQpKTsKKwlpZiAoc2lvY2ItPnNjbS0+ZnApCisJCXVuaXhfYXR0YWNoX2ZkcyhzaW9jYi0+c2NtLCBza2IpOworCisJc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwllcnIgPSBtZW1jcHlfZnJvbWlvdmVjKHNrYl9wdXQoc2tiLGxlbiksIG1zZy0+bXNnX2lvdiwgbGVuKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlOworCisJdGltZW8gPSBzb2NrX3NuZHRpbWVvKHNrLCBtc2ctPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVCk7CisKK3Jlc3RhcnQ6CisJaWYgKCFvdGhlcikgeworCQllcnIgPSAtRUNPTk5SRVNFVDsKKwkJaWYgKHN1bmFkZHIgPT0gTlVMTCkKKwkJCWdvdG8gb3V0X2ZyZWU7CisKKwkJb3RoZXIgPSB1bml4X2ZpbmRfb3RoZXIoc3VuYWRkciwgbmFtZWxlbiwgc2stPnNrX3R5cGUsCisJCQkJCWhhc2gsICZlcnIpOworCQlpZiAob3RoZXI9PU5VTEwpCisJCQlnb3RvIG91dF9mcmVlOworCX0KKworCXVuaXhfc3RhdGVfcmxvY2sob3RoZXIpOworCWVyciA9IC1FUEVSTTsKKwlpZiAoIXVuaXhfbWF5X3NlbmQoc2ssIG90aGVyKSkKKwkJZ290byBvdXRfdW5sb2NrOworCisJaWYgKHNvY2tfZmxhZyhvdGhlciwgU09DS19ERUFEKSkgeworCQkvKgorCQkgKglDaGVjayB3aXRoIDEwMDMuMWcgLSB3aGF0IHNob3VsZAorCQkgKglkYXRhZ3JhbSBlcnJvcgorCQkgKi8KKwkJdW5peF9zdGF0ZV9ydW5sb2NrKG90aGVyKTsKKwkJc29ja19wdXQob3RoZXIpOworCisJCWVyciA9IDA7CisJCXVuaXhfc3RhdGVfd2xvY2soc2spOworCQlpZiAodW5peF9wZWVyKHNrKSA9PSBvdGhlcikgeworCQkJdW5peF9wZWVyKHNrKT1OVUxMOworCQkJdW5peF9zdGF0ZV93dW5sb2NrKHNrKTsKKworCQkJdW5peF9kZ3JhbV9kaXNjb25uZWN0ZWQoc2ssIG90aGVyKTsKKwkJCXNvY2tfcHV0KG90aGVyKTsKKwkJCWVyciA9IC1FQ09OTlJFRlVTRUQ7CisJCX0gZWxzZSB7CisJCQl1bml4X3N0YXRlX3d1bmxvY2soc2spOworCQl9CisKKwkJb3RoZXIgPSBOVUxMOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfZnJlZTsKKwkJZ290byByZXN0YXJ0OworCX0KKworCWVyciA9IC1FUElQRTsKKwlpZiAob3RoZXItPnNrX3NodXRkb3duICYgUkNWX1NIVVRET1dOKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlpZiAoc2stPnNrX3R5cGUgIT0gU09DS19TRVFQQUNLRVQpIHsKKwkJZXJyID0gc2VjdXJpdHlfdW5peF9tYXlfc2VuZChzay0+c2tfc29ja2V0LCBvdGhlci0+c2tfc29ja2V0KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlpZiAodW5peF9wZWVyKG90aGVyKSAhPSBzayAmJgorCSAgICAoc2tiX3F1ZXVlX2xlbigmb3RoZXItPnNrX3JlY2VpdmVfcXVldWUpID4KKwkgICAgIG90aGVyLT5za19tYXhfYWNrX2JhY2tsb2cpKSB7CisJCWlmICghdGltZW8pIHsKKwkJCWVyciA9IC1FQUdBSU47CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKworCQl0aW1lbyA9IHVuaXhfd2FpdF9mb3JfcGVlcihvdGhlciwgdGltZW8pOworCisJCWVyciA9IHNvY2tfaW50cl9lcnJubyh0aW1lbyk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWdvdG8gb3V0X2ZyZWU7CisKKwkJZ290byByZXN0YXJ0OworCX0KKworCXNrYl9xdWV1ZV90YWlsKCZvdGhlci0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKKwl1bml4X3N0YXRlX3J1bmxvY2sob3RoZXIpOworCW90aGVyLT5za19kYXRhX3JlYWR5KG90aGVyLCBsZW4pOworCXNvY2tfcHV0KG90aGVyKTsKKwlzY21fZGVzdHJveShzaW9jYi0+c2NtKTsKKwlyZXR1cm4gbGVuOworCitvdXRfdW5sb2NrOgorCXVuaXhfc3RhdGVfcnVubG9jayhvdGhlcik7CitvdXRfZnJlZToKKwlrZnJlZV9za2Ioc2tiKTsKK291dDoKKwlpZiAob3RoZXIpCisJCXNvY2tfcHV0KG90aGVyKTsKKwlzY21fZGVzdHJveShzaW9jYi0+c2NtKTsKKwlyZXR1cm4gZXJyOworfQorCisJCQorc3RhdGljIGludCB1bml4X3N0cmVhbV9zZW5kbXNnKHN0cnVjdCBraW9jYiAqa2lvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzb2NrX2lvY2IgKnNpb2NiID0ga2lvY2JfdG9fc2lvY2Ioa2lvY2IpOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBzb2NrICpvdGhlciA9IE5VTEw7CisJc3RydWN0IHNvY2thZGRyX3VuICpzdW5hZGRyPW1zZy0+bXNnX25hbWU7CisJaW50IGVycixzaXplOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHNlbnQ9MDsKKwlzdHJ1Y3Qgc2NtX2Nvb2tpZSB0bXBfc2NtOworCisJaWYgKE5VTEwgPT0gc2lvY2ItPnNjbSkKKwkJc2lvY2ItPnNjbSA9ICZ0bXBfc2NtOworCWVyciA9IHNjbV9zZW5kKHNvY2ssIG1zZywgc2lvY2ItPnNjbSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSAtRU9QTk9UU1VQUDsKKwlpZiAobXNnLT5tc2dfZmxhZ3MmTVNHX09PQikKKwkJZ290byBvdXRfZXJyOworCisJaWYgKG1zZy0+bXNnX25hbWVsZW4pIHsKKwkJZXJyID0gc2stPnNrX3N0YXRlID09IFRDUF9FU1RBQkxJU0hFRCA/IC1FSVNDT05OIDogLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0X2VycjsKKwl9IGVsc2UgeworCQlzdW5hZGRyID0gTlVMTDsKKwkJZXJyID0gLUVOT1RDT05OOworCQlvdGhlciA9IHVuaXhfcGVlcl9nZXQoc2spOworCQlpZiAoIW90aGVyKQorCQkJZ290byBvdXRfZXJyOworCX0KKworCWlmIChzay0+c2tfc2h1dGRvd24gJiBTRU5EX1NIVVRET1dOKQorCQlnb3RvIHBpcGVfZXJyOworCisJd2hpbGUoc2VudCA8IGxlbikKKwl7CisJCS8qCisJCSAqCU9wdGltaXNhdGlvbiBmb3IgdGhlIGZhY3QgdGhhdCB1bmRlciAwLjAxJSBvZiBYIG1lc3NhZ2VzIHR5cGljYWxseQorCQkgKgluZWVkIGJyZWFraW5nIHVwLgorCQkgKi8KKworCQlzaXplPWxlbi1zZW50OworCisJCS8qIEtlZXAgdHdvIG1lc3NhZ2VzIGluIHRoZSBwaXBlIHNvIGl0IHNjaGVkdWxlcyBiZXR0ZXIgKi8KKwkJaWYgKHNpemUgPiBzay0+c2tfc25kYnVmIC8gMiAtIDY0KQorCQkJc2l6ZSA9IHNrLT5za19zbmRidWYgLyAyIC0gNjQ7CisKKwkJaWYgKHNpemUgPiBTS0JfTUFYX0FMTE9DKQorCQkJc2l6ZSA9IFNLQl9NQVhfQUxMT0M7CisJCQkKKwkJLyoKKwkJICoJR3JhYiBhIGJ1ZmZlcgorCQkgKi8KKwkJIAorCQlza2I9c29ja19hbGxvY19zZW5kX3NrYihzayxzaXplLG1zZy0+bXNnX2ZsYWdzJk1TR19ET05UV0FJVCwgJmVycik7CisKKwkJaWYgKHNrYj09TlVMTCkKKwkJCWdvdG8gb3V0X2VycjsKKworCQkvKgorCQkgKglJZiB5b3UgcGFzcyB0d28gdmFsdWVzIHRvIHRoZSBzb2NrX2FsbG9jX3NlbmRfc2tiCisJCSAqCWl0IHRyaWVzIHRvIGdyYWIgdGhlIGxhcmdlIGJ1ZmZlciB3aXRoIEdGUF9OT0ZTCisJCSAqCSh3aGljaCBjYW4gZmFpbCBlYXNpbHkpLCBhbmQgaWYgaXQgZmFpbHMgZ3JhYiB0aGUKKwkJICoJZmFsbGJhY2sgc2l6ZSBidWZmZXIgd2hpY2ggaXMgdW5kZXIgYSBwYWdlIGFuZCB3aWxsCisJCSAqCXN1Y2NlZWQuIFtBbGFuXQorCQkgKi8KKwkJc2l6ZSA9IG1pbl90KGludCwgc2l6ZSwgc2tiX3RhaWxyb29tKHNrYikpOworCisJCW1lbWNweShVTklYQ1JFRFMoc2tiKSwgJnNpb2NiLT5zY20tPmNyZWRzLCBzaXplb2Yoc3RydWN0IHVjcmVkKSk7CisJCWlmIChzaW9jYi0+c2NtLT5mcCkKKwkJCXVuaXhfYXR0YWNoX2ZkcyhzaW9jYi0+c2NtLCBza2IpOworCisJCWlmICgoZXJyID0gbWVtY3B5X2Zyb21pb3ZlYyhza2JfcHV0KHNrYixzaXplKSwgbXNnLT5tc2dfaW92LCBzaXplKSkgIT0gMCkgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlnb3RvIG91dF9lcnI7CisJCX0KKworCQl1bml4X3N0YXRlX3Jsb2NrKG90aGVyKTsKKworCQlpZiAoc29ja19mbGFnKG90aGVyLCBTT0NLX0RFQUQpIHx8CisJCSAgICAob3RoZXItPnNrX3NodXRkb3duICYgUkNWX1NIVVRET1dOKSkKKwkJCWdvdG8gcGlwZV9lcnJfZnJlZTsKKworCQlza2JfcXVldWVfdGFpbCgmb3RoZXItPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJCXVuaXhfc3RhdGVfcnVubG9jayhvdGhlcik7CisJCW90aGVyLT5za19kYXRhX3JlYWR5KG90aGVyLCBzaXplKTsKKwkJc2VudCs9c2l6ZTsKKwl9CisJc29ja19wdXQob3RoZXIpOworCisJc2NtX2Rlc3Ryb3koc2lvY2ItPnNjbSk7CisJc2lvY2ItPnNjbSA9IE5VTEw7CisKKwlyZXR1cm4gc2VudDsKKworcGlwZV9lcnJfZnJlZToKKwl1bml4X3N0YXRlX3J1bmxvY2sob3RoZXIpOworCWtmcmVlX3NrYihza2IpOworcGlwZV9lcnI6CisJaWYgKHNlbnQ9PTAgJiYgIShtc2ctPm1zZ19mbGFncyZNU0dfTk9TSUdOQUwpKQorCQlzZW5kX3NpZyhTSUdQSVBFLGN1cnJlbnQsMCk7CisJZXJyID0gLUVQSVBFOworb3V0X2VycjoKKyAgICAgICAgaWYgKG90aGVyKQorCQlzb2NrX3B1dChvdGhlcik7CisJc2NtX2Rlc3Ryb3koc2lvY2ItPnNjbSk7CisJc2lvY2ItPnNjbSA9IE5VTEw7CisJcmV0dXJuIHNlbnQgPyA6IGVycjsKK30KKworc3RhdGljIGludCB1bml4X3NlcXBhY2tldF9zZW5kbXNnKHN0cnVjdCBraW9jYiAqa2lvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkJICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwkKKwllcnIgPSBzb2NrX2Vycm9yKHNrKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfRVNUQUJMSVNIRUQpCisJCXJldHVybiAtRU5PVENPTk47CisKKwlpZiAobXNnLT5tc2dfbmFtZWxlbikKKwkJbXNnLT5tc2dfbmFtZWxlbiA9IDA7CisKKwlyZXR1cm4gdW5peF9kZ3JhbV9zZW5kbXNnKGtpb2NiLCBzb2NrLCBtc2csIGxlbik7Cit9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorc3RhdGljIHZvaWQgdW5peF9jb3B5X2FkZHIoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHVuaXhfc29jayAqdSA9IHVuaXhfc2soc2spOworCisJbXNnLT5tc2dfbmFtZWxlbiA9IDA7CisJaWYgKHUtPmFkZHIpIHsKKwkJbXNnLT5tc2dfbmFtZWxlbiA9IHUtPmFkZHItPmxlbjsKKwkJbWVtY3B5KG1zZy0+bXNnX25hbWUsIHUtPmFkZHItPm5hbWUsIHUtPmFkZHItPmxlbik7CisJfQorfQorCitzdGF0aWMgaW50IHVuaXhfZGdyYW1fcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplLAorCQkJICAgICAgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrX2lvY2IgKnNpb2NiID0ga2lvY2JfdG9fc2lvY2IoaW9jYik7CisJc3RydWN0IHNjbV9jb29raWUgdG1wX3NjbTsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgdW5peF9zb2NrICp1ID0gdW5peF9zayhzayk7CisJaW50IG5vYmxvY2sgPSBmbGFncyAmIE1TR19ET05UV0FJVDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBlcnI7CisKKwllcnIgPSAtRU9QTk9UU1VQUDsKKwlpZiAoZmxhZ3MmTVNHX09PQikKKwkJZ290byBvdXQ7CisKKwltc2ctPm1zZ19uYW1lbGVuID0gMDsKKworCWRvd24oJnUtPnJlYWRzZW0pOworCisJc2tiID0gc2tiX3JlY3ZfZGF0YWdyYW0oc2ssIGZsYWdzLCBub2Jsb2NrLCAmZXJyKTsKKwlpZiAoIXNrYikKKwkJZ290byBvdXRfdW5sb2NrOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ1LT5wZWVyX3dhaXQpOworCisJaWYgKG1zZy0+bXNnX25hbWUpCisJCXVuaXhfY29weV9hZGRyKG1zZywgc2tiLT5zayk7CisKKwlpZiAoc2l6ZSA+IHNrYi0+bGVuKQorCQlzaXplID0gc2tiLT5sZW47CisJZWxzZSBpZiAoc2l6ZSA8IHNrYi0+bGVuKQorCQltc2ctPm1zZ19mbGFncyB8PSBNU0dfVFJVTkM7CisKKwllcnIgPSBza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhza2IsIDAsIG1zZy0+bXNnX2lvdiwgc2l6ZSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZTsKKworCWlmICghc2lvY2ItPnNjbSkgeworCQlzaW9jYi0+c2NtID0gJnRtcF9zY207CisJCW1lbXNldCgmdG1wX3NjbSwgMCwgc2l6ZW9mKHRtcF9zY20pKTsKKwl9CisJc2lvY2ItPnNjbS0+Y3JlZHMgPSAqVU5JWENSRURTKHNrYik7CisKKwlpZiAoIShmbGFncyAmIE1TR19QRUVLKSkKKwl7CisJCWlmIChVTklYQ0Ioc2tiKS5mcCkKKwkJCXVuaXhfZGV0YWNoX2ZkcyhzaW9jYi0+c2NtLCBza2IpOworCX0KKwllbHNlIAorCXsKKwkJLyogSXQgaXMgcXVlc3Rpb25hYmxlOiBvbiBQRUVLIHdlIGNvdWxkOgorCQkgICAtIGRvIG5vdCByZXR1cm4gZmRzIC0gZ29vZCwgYnV0IHRvbyBzaW1wbGUgOCkKKwkJICAgLSByZXR1cm4gZmRzLCBhbmQgZG8gbm90IHJldHVybiB0aGVtIG9uIHJlYWQgKG9sZCBzdHJhdGVneSwKKwkJICAgICBhcHBhcmVudGx5IHdyb25nKQorCQkgICAtIGNsb25lIGZkcyAoSSBjaG9zZSBpdCBmb3Igbm93LCBpdCBpcyB0aGUgbW9zdCB1bml2ZXJzYWwKKwkJICAgICBzb2x1dGlvbikKKwkJCisJICAgICAgICAgICBQT1NJWCAxMDAzLjFnIGRvZXMgbm90IGFjdHVhbGx5IGRlZmluZSB0aGlzIGNsZWFybHkKKwkgICAgICAgICAgIGF0IGFsbC4gUE9TSVggMTAwMy4xZyBkb2Vzbid0IGRlZmluZSBhIGxvdCBvZiB0aGluZ3MKKwkgICAgICAgICAgIGNsZWFybHkgaG93ZXZlciEJCSAgICAgCisJCSAgIAorCQkqLworCQlpZiAoVU5JWENCKHNrYikuZnApCisJCQlzaW9jYi0+c2NtLT5mcCA9IHNjbV9mcF9kdXAoVU5JWENCKHNrYikuZnApOworCX0KKwllcnIgPSBzaXplOworCisJc2NtX3JlY3Yoc29jaywgbXNnLCBzaW9jYi0+c2NtLCBmbGFncyk7CisKK291dF9mcmVlOgorCXNrYl9mcmVlX2RhdGFncmFtKHNrLHNrYik7CitvdXRfdW5sb2NrOgorCXVwKCZ1LT5yZWFkc2VtKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJU2xlZXAgdW50aWwgZGF0YSBoYXMgYXJyaXZlLiBCdXQgY2hlY2sgZm9yIHJhY2VzLi4KKyAqLworIAorc3RhdGljIGxvbmcgdW5peF9zdHJlYW1fZGF0YV93YWl0KHN0cnVjdCBzb2NrICogc2ssIGxvbmcgdGltZW8pCit7CisJREVGSU5FX1dBSVQod2FpdCk7CisKKwl1bml4X3N0YXRlX3Jsb2NrKHNrKTsKKworCWZvciAoOzspIHsKKwkJcHJlcGFyZV90b193YWl0KHNrLT5za19zbGVlcCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJaWYgKHNrYl9xdWV1ZV9sZW4oJnNrLT5za19yZWNlaXZlX3F1ZXVlKSB8fAorCQkgICAgc2stPnNrX2VyciB8fAorCQkgICAgKHNrLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikgfHwKKwkJICAgIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpIHx8CisJCSAgICAhdGltZW8pCisJCQlicmVhazsKKworCQlzZXRfYml0KFNPQ0tfQVNZTkNfV0FJVERBVEEsICZzay0+c2tfc29ja2V0LT5mbGFncyk7CisJCXVuaXhfc3RhdGVfcnVubG9jayhzayk7CisJCXRpbWVvID0gc2NoZWR1bGVfdGltZW91dCh0aW1lbyk7CisJCXVuaXhfc3RhdGVfcmxvY2soc2spOworCQljbGVhcl9iaXQoU09DS19BU1lOQ19XQUlUREFUQSwgJnNrLT5za19zb2NrZXQtPmZsYWdzKTsKKwl9CisKKwlmaW5pc2hfd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwl1bml4X3N0YXRlX3J1bmxvY2soc2spOworCXJldHVybiB0aW1lbzsKK30KKworCisKK3N0YXRpYyBpbnQgdW5peF9zdHJlYW1fcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSwKKwkJCSAgICAgICBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2tfaW9jYiAqc2lvY2IgPSBraW9jYl90b19zaW9jYihpb2NiKTsKKwlzdHJ1Y3Qgc2NtX2Nvb2tpZSB0bXBfc2NtOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCB1bml4X3NvY2sgKnUgPSB1bml4X3NrKHNrKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gKnN1bmFkZHI9bXNnLT5tc2dfbmFtZTsKKwlpbnQgY29waWVkID0gMDsKKwlpbnQgY2hlY2tfY3JlZHMgPSAwOworCWludCB0YXJnZXQ7CisJaW50IGVyciA9IDA7CisJbG9uZyB0aW1lbzsKKworCWVyciA9IC1FSU5WQUw7CisJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfRVNUQUJMSVNIRUQpCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVPUE5PVFNVUFA7CisJaWYgKGZsYWdzJk1TR19PT0IpCisJCWdvdG8gb3V0OworCisJdGFyZ2V0ID0gc29ja19yY3Zsb3dhdChzaywgZmxhZ3MmTVNHX1dBSVRBTEwsIHNpemUpOworCXRpbWVvID0gc29ja19yY3Z0aW1lbyhzaywgZmxhZ3MmTVNHX0RPTlRXQUlUKTsKKworCW1zZy0+bXNnX25hbWVsZW4gPSAwOworCisJLyogTG9jayB0aGUgc29ja2V0IHRvIHByZXZlbnQgcXVldWUgZGlzb3JkZXJpbmcKKwkgKiB3aGlsZSBzbGVlcHMgaW4gbWVtY3B5X3RvbXNnCisJICovCisKKwlpZiAoIXNpb2NiLT5zY20pIHsKKwkJc2lvY2ItPnNjbSA9ICZ0bXBfc2NtOworCQltZW1zZXQoJnRtcF9zY20sIDAsIHNpemVvZih0bXBfc2NtKSk7CisJfQorCisJZG93bigmdS0+cmVhZHNlbSk7CisKKwlkbworCXsKKwkJaW50IGNodW5rOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCXNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJCWlmIChza2I9PU5VTEwpCisJCXsKKwkJCWlmIChjb3BpZWQgPj0gdGFyZ2V0KQorCQkJCWJyZWFrOworCisJCQkvKgorCQkJICoJUE9TSVggMTAwMy4xZyBtYW5kYXRlcyB0aGlzIG9yZGVyLgorCQkJICovCisJCQkgCisJCQlpZiAoKGVyciA9IHNvY2tfZXJyb3Ioc2spKSAhPSAwKQorCQkJCWJyZWFrOworCQkJaWYgKHNrLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikKKwkJCQlicmVhazsKKwkJCWVyciA9IC1FQUdBSU47CisJCQlpZiAoIXRpbWVvKQorCQkJCWJyZWFrOworCQkJdXAoJnUtPnJlYWRzZW0pOworCisJCQl0aW1lbyA9IHVuaXhfc3RyZWFtX2RhdGFfd2FpdChzaywgdGltZW8pOworCisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQllcnIgPSBzb2NrX2ludHJfZXJybm8odGltZW8pOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJZG93bigmdS0+cmVhZHNlbSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChjaGVja19jcmVkcykgeworCQkJLyogTmV2ZXIgZ2x1ZSBtZXNzYWdlcyBmcm9tIGRpZmZlcmVudCB3cml0ZXJzICovCisJCQlpZiAobWVtY21wKFVOSVhDUkVEUyhza2IpLCAmc2lvY2ItPnNjbS0+Y3JlZHMsIHNpemVvZihzaW9jYi0+c2NtLT5jcmVkcykpICE9IDApIHsKKwkJCQlza2JfcXVldWVfaGVhZCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBDb3B5IGNyZWRlbnRpYWxzICovCisJCQlzaW9jYi0+c2NtLT5jcmVkcyA9ICpVTklYQ1JFRFMoc2tiKTsKKwkJCWNoZWNrX2NyZWRzID0gMTsKKwkJfQorCisJCS8qIENvcHkgYWRkcmVzcyBqdXN0IG9uY2UgKi8KKwkJaWYgKHN1bmFkZHIpCisJCXsKKwkJCXVuaXhfY29weV9hZGRyKG1zZywgc2tiLT5zayk7CisJCQlzdW5hZGRyID0gTlVMTDsKKwkJfQorCisJCWNodW5rID0gbWluX3QodW5zaWduZWQgaW50LCBza2ItPmxlbiwgc2l6ZSk7CisJCWlmIChtZW1jcHlfdG9pb3ZlYyhtc2ctPm1zZ19pb3YsIHNrYi0+ZGF0YSwgY2h1bmspKSB7CisJCQlza2JfcXVldWVfaGVhZCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJCQlpZiAoY29waWVkID09IDApCisJCQkJY29waWVkID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWNvcGllZCArPSBjaHVuazsKKwkJc2l6ZSAtPSBjaHVuazsKKworCQkvKiBNYXJrIHJlYWQgcGFydCBvZiBza2IgYXMgdXNlZCAqLworCQlpZiAoIShmbGFncyAmIE1TR19QRUVLKSkKKwkJeworCQkJc2tiX3B1bGwoc2tiLCBjaHVuayk7CisKKwkJCWlmIChVTklYQ0Ioc2tiKS5mcCkKKwkJCQl1bml4X2RldGFjaF9mZHMoc2lvY2ItPnNjbSwgc2tiKTsKKworCQkJLyogcHV0IHRoZSBza2IgYmFjayBpZiB3ZSBkaWRuJ3QgdXNlIGl0IHVwLi4gKi8KKwkJCWlmIChza2ItPmxlbikKKwkJCXsKKwkJCQlza2JfcXVldWVfaGVhZCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWtmcmVlX3NrYihza2IpOworCisJCQlpZiAoc2lvY2ItPnNjbS0+ZnApCisJCQkJYnJlYWs7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBJdCBpcyBxdWVzdGlvbmFibGUsIHNlZSBub3RlIGluIHVuaXhfZGdyYW1fcmVjdm1zZy4KKwkJCSAqLworCQkJaWYgKFVOSVhDQihza2IpLmZwKQorCQkJCXNpb2NiLT5zY20tPmZwID0gc2NtX2ZwX2R1cChVTklYQ0Ioc2tiKS5mcCk7CisKKwkJCS8qIHB1dCBtZXNzYWdlIGJhY2sgYW5kIHJldHVybiAqLworCQkJc2tiX3F1ZXVlX2hlYWQoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChzaXplKTsKKworCXVwKCZ1LT5yZWFkc2VtKTsKKwlzY21fcmVjdihzb2NrLCBtc2csIHNpb2NiLT5zY20sIGZsYWdzKTsKK291dDoKKwlyZXR1cm4gY29waWVkID8gOiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdW5peF9zaHV0ZG93bihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgc29jayAqb3RoZXI7CisKKwltb2RlID0gKG1vZGUrMSkmKFJDVl9TSFVURE9XTnxTRU5EX1NIVVRET1dOKTsKKworCWlmIChtb2RlKSB7CisJCXVuaXhfc3RhdGVfd2xvY2soc2spOworCQlzay0+c2tfc2h1dGRvd24gfD0gbW9kZTsKKwkJb3RoZXI9dW5peF9wZWVyKHNrKTsKKwkJaWYgKG90aGVyKQorCQkJc29ja19ob2xkKG90aGVyKTsKKwkJdW5peF9zdGF0ZV93dW5sb2NrKHNrKTsKKwkJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisKKwkJaWYgKG90aGVyICYmCisJCQkoc2stPnNrX3R5cGUgPT0gU09DS19TVFJFQU0gfHwgc2stPnNrX3R5cGUgPT0gU09DS19TRVFQQUNLRVQpKSB7CisKKwkJCWludCBwZWVyX21vZGUgPSAwOworCisJCQlpZiAobW9kZSZSQ1ZfU0hVVERPV04pCisJCQkJcGVlcl9tb2RlIHw9IFNFTkRfU0hVVERPV047CisJCQlpZiAobW9kZSZTRU5EX1NIVVRET1dOKQorCQkJCXBlZXJfbW9kZSB8PSBSQ1ZfU0hVVERPV047CisJCQl1bml4X3N0YXRlX3dsb2NrKG90aGVyKTsKKwkJCW90aGVyLT5za19zaHV0ZG93biB8PSBwZWVyX21vZGU7CisJCQl1bml4X3N0YXRlX3d1bmxvY2sob3RoZXIpOworCQkJb3RoZXItPnNrX3N0YXRlX2NoYW5nZShvdGhlcik7CisJCQlyZWFkX2xvY2soJm90aGVyLT5za19jYWxsYmFja19sb2NrKTsKKwkJCWlmIChwZWVyX21vZGUgPT0gU0hVVERPV05fTUFTSykKKwkJCQlza193YWtlX2FzeW5jKG90aGVyLDEsUE9MTF9IVVApOworCQkJZWxzZSBpZiAocGVlcl9tb2RlICYgUkNWX1NIVVRET1dOKQorCQkJCXNrX3dha2VfYXN5bmMob3RoZXIsMSxQT0xMX0lOKTsKKwkJCXJlYWRfdW5sb2NrKCZvdGhlci0+c2tfY2FsbGJhY2tfbG9jayk7CisJCX0KKwkJaWYgKG90aGVyKQorCQkJc29ja19wdXQob3RoZXIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1bml4X2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWxvbmcgYW1vdW50PTA7CisJaW50IGVycjsKKworCXN3aXRjaChjbWQpCisJeworCQljYXNlIFNJT0NPVVRROgorCQkJYW1vdW50ID0gYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKTsKKwkJCWVyciA9IHB1dF91c2VyKGFtb3VudCwgKGludCBfX3VzZXIgKilhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgU0lPQ0lOUToKKwkJeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOKSB7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJc3Bpbl9sb2NrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwkJCWlmIChzay0+c2tfdHlwZSA9PSBTT0NLX1NUUkVBTSB8fAorCQkJICAgIHNrLT5za190eXBlID09IFNPQ0tfU0VRUEFDS0VUKSB7CisJCQkJc2tiX3F1ZXVlX3dhbGsoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpCisJCQkJCWFtb3VudCArPSBza2ItPmxlbjsKKwkJCX0gZWxzZSB7CisJCQkJc2tiID0gc2tiX3BlZWsoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwkJCQlpZiAoc2tiKQorCQkJCQlhbW91bnQ9c2tiLT5sZW47CisJCQl9CisJCQlzcGluX3VubG9jaygmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7CisJCQllcnIgPSBwdXRfdXNlcihhbW91bnQsIChpbnQgX191c2VyICopYXJnKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZGVmYXVsdDoKKwkJCWVyciA9IGRldl9pb2N0bChjbWQsICh2b2lkIF9fdXNlciAqKWFyZyk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB1bml4X3BvbGwoc3RydWN0IGZpbGUgKiBmaWxlLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXVuc2lnbmVkIGludCBtYXNrOworCisJcG9sbF93YWl0KGZpbGUsIHNrLT5za19zbGVlcCwgd2FpdCk7CisJbWFzayA9IDA7CisKKwkvKiBleGNlcHRpb25hbCBldmVudHM/ICovCisJaWYgKHNrLT5za19lcnIpCisJCW1hc2sgfD0gUE9MTEVSUjsKKwlpZiAoc2stPnNrX3NodXRkb3duID09IFNIVVRET1dOX01BU0spCisJCW1hc2sgfD0gUE9MTEhVUDsKKworCS8qIHJlYWRhYmxlPyAqLworCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkgfHwKKwkgICAgKHNrLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKworCS8qIENvbm5lY3Rpb24tYmFzZWQgbmVlZCB0byBjaGVjayBmb3IgdGVybWluYXRpb24gYW5kIHN0YXJ0dXAgKi8KKwlpZiAoKHNrLT5za190eXBlID09IFNPQ0tfU1RSRUFNIHx8IHNrLT5za190eXBlID09IFNPQ0tfU0VRUEFDS0VUKSAmJiBzay0+c2tfc3RhdGUgPT0gVENQX0NMT1NFKQorCQltYXNrIHw9IFBPTExIVVA7CisKKwkvKgorCSAqIHdlIHNldCB3cml0YWJsZSBhbHNvIHdoZW4gdGhlIG90aGVyIHNpZGUgaGFzIHNodXQgZG93biB0aGUKKwkgKiBjb25uZWN0aW9uLiBUaGlzIHByZXZlbnRzIHN0dWNrIHNvY2tldHMuCisJICovCisJaWYgKHVuaXhfd3JpdGFibGUoc2spKQorCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNIHwgUE9MTFdSQkFORDsKKworCXJldHVybiBtYXNrOworfQorCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIHN0cnVjdCBzb2NrICp1bml4X3NlcV9pZHgoaW50ICppdGVyLCBsb2ZmX3QgcG9zKQoreworCWxvZmZfdCBvZmYgPSAwOworCXN0cnVjdCBzb2NrICpzOworCisJZm9yIChzID0gZmlyc3RfdW5peF9zb2NrZXQoaXRlcik7IHM7IHMgPSBuZXh0X3VuaXhfc29ja2V0KGl0ZXIsIHMpKSB7CisJCWlmIChvZmYgPT0gcG9zKSAKKwkJCXJldHVybiBzOworCQkrK29mZjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIHZvaWQgKnVuaXhfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlyZWFkX2xvY2soJnVuaXhfdGFibGVfbG9jayk7CisJcmV0dXJuICpwb3MgPyB1bml4X3NlcV9pZHgoc2VxLT5wcml2YXRlLCAqcG9zIC0gMSkgOiAoKHZvaWQgKikgMSk7Cit9CisKK3N0YXRpYyB2b2lkICp1bml4X3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwkrKypwb3M7CisKKwlpZiAodiA9PSAodm9pZCAqKTEpIAorCQlyZXR1cm4gZmlyc3RfdW5peF9zb2NrZXQoc2VxLT5wcml2YXRlKTsKKwlyZXR1cm4gbmV4dF91bml4X3NvY2tldChzZXEtPnByaXZhdGUsIHYpOworfQorCitzdGF0aWMgdm9pZCB1bml4X3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXJlYWRfdW5sb2NrKCZ1bml4X3RhYmxlX2xvY2spOworfQorCitzdGF0aWMgaW50IHVuaXhfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJCisJaWYgKHYgPT0gKHZvaWQgKikxKQorCQlzZXFfcHV0cyhzZXEsICJOdW0gICAgICAgUmVmQ291bnQgUHJvdG9jb2wgRmxhZ3MgICAgVHlwZSBTdCAiCisJCQkgIklub2RlIFBhdGhcbiIpOworCWVsc2UgeworCQlzdHJ1Y3Qgc29jayAqcyA9IHY7CisJCXN0cnVjdCB1bml4X3NvY2sgKnUgPSB1bml4X3NrKHMpOworCQl1bml4X3N0YXRlX3Jsb2NrKHMpOworCisJCXNlcV9wcmludGYoc2VxLCAiJXA6ICUwOFggJTA4WCAlMDhYICUwNFggJTAyWCAlNWx1IiwKKwkJCXMsCisJCQlhdG9taWNfcmVhZCgmcy0+c2tfcmVmY250KSwKKwkJCTAsCisJCQlzLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOID8gX19TT19BQ0NFUFRDT04gOiAwLAorCQkJcy0+c2tfdHlwZSwKKwkJCXMtPnNrX3NvY2tldCA/CisJCQkocy0+c2tfc3RhdGUgPT0gVENQX0VTVEFCTElTSEVEID8gU1NfQ09OTkVDVEVEIDogU1NfVU5DT05ORUNURUQpIDoKKwkJCShzLT5za19zdGF0ZSA9PSBUQ1BfRVNUQUJMSVNIRUQgPyBTU19DT05ORUNUSU5HIDogU1NfRElTQ09OTkVDVElORyksCisJCQlzb2NrX2lfaW5vKHMpKTsKKworCQlpZiAodS0+YWRkcikgeworCQkJaW50IGksIGxlbjsKKwkJCXNlcV9wdXRjKHNlcSwgJyAnKTsKKworCQkJaSA9IDA7CisJCQlsZW4gPSB1LT5hZGRyLT5sZW4gLSBzaXplb2Yoc2hvcnQpOworCQkJaWYgKCFVTklYX0FCU1RSQUNUKHMpKQorCQkJCWxlbi0tOworCQkJZWxzZSB7CisJCQkJc2VxX3B1dGMoc2VxLCAnQCcpOworCQkJCWkrKzsKKwkJCX0KKwkJCWZvciAoIDsgaSA8IGxlbjsgaSsrKQorCQkJCXNlcV9wdXRjKHNlcSwgdS0+YWRkci0+bmFtZS0+c3VuX3BhdGhbaV0pOworCQl9CisJCXVuaXhfc3RhdGVfcnVubG9jayhzKTsKKwkJc2VxX3B1dGMoc2VxLCAnXG4nKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyB1bml4X3NlcV9vcHMgPSB7CisJLnN0YXJ0ICA9IHVuaXhfc2VxX3N0YXJ0LAorCS5uZXh0ICAgPSB1bml4X3NlcV9uZXh0LAorCS5zdG9wICAgPSB1bml4X3NlcV9zdG9wLAorCS5zaG93ICAgPSB1bml4X3NlcV9zaG93LAorfTsKKworCitzdGF0aWMgaW50IHVuaXhfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNlcV9maWxlICpzZXE7CisJaW50IHJjID0gLUVOT01FTTsKKwlpbnQgKml0ZXIgPSBrbWFsbG9jKHNpemVvZihpbnQpLCBHRlBfS0VSTkVMKTsKKworCWlmICghaXRlcikKKwkJZ290byBvdXQ7CisKKwlyYyA9IHNlcV9vcGVuKGZpbGUsICZ1bml4X3NlcV9vcHMpOworCWlmIChyYykKKwkJZ290byBvdXRfa2ZyZWU7CisKKwlzZXEJICAgICA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzZXEtPnByaXZhdGUgPSBpdGVyOworCSppdGVyID0gMDsKK291dDoKKwlyZXR1cm4gcmM7CitvdXRfa2ZyZWU6CisJa2ZyZWUoaXRlcik7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVuaXhfc2VxX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHVuaXhfc2VxX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZV9wcml2YXRlLAorfTsKKworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSB1bml4X2ZhbWlseV9vcHMgPSB7CisJLmZhbWlseSA9IFBGX1VOSVgsCisJLmNyZWF0ZSA9IHVuaXhfY3JlYXRlLAorCS5vd25lcgk9IFRISVNfTU9EVUxFLAorfTsKKworI2lmZGVmIENPTkZJR19TWVNDVEwKK2V4dGVybiB2b2lkIHVuaXhfc3lzY3RsX3JlZ2lzdGVyKHZvaWQpOworZXh0ZXJuIHZvaWQgdW5peF9zeXNjdGxfdW5yZWdpc3Rlcih2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdW5peF9zeXNjdGxfcmVnaXN0ZXIodm9pZCkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCB1bml4X3N5c2N0bF91bnJlZ2lzdGVyKHZvaWQpIHt9CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgYWZfdW5peF9pbml0KHZvaWQpCit7CisJaW50IHJjID0gLTE7CisJc3RydWN0IHNrX2J1ZmYgKmR1bW15X3NrYjsKKworCWlmIChzaXplb2Yoc3RydWN0IHVuaXhfc2tiX3Bhcm1zKSA+IHNpemVvZihkdW1teV9za2ItPmNiKSkgeworCQlwcmludGsoS0VSTl9DUklUICIlczogcGFuaWNcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0OworCX0KKworCXJjID0gcHJvdG9fcmVnaXN0ZXIoJnVuaXhfcHJvdG8sIDEpOworICAgICAgICBpZiAocmMgIT0gMCkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0NSSVQgIiVzOiBDYW5ub3QgY3JlYXRlIHVuaXhfc29jayBTTEFCIGNhY2hlIVxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0OworCX0KKworCXNvY2tfcmVnaXN0ZXIoJnVuaXhfZmFtaWx5X29wcyk7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlwcm9jX25ldF9mb3BzX2NyZWF0ZSgidW5peCIsIDAsICZ1bml4X3NlcV9mb3BzKTsKKyNlbmRpZgorCXVuaXhfc3lzY3RsX3JlZ2lzdGVyKCk7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWZfdW5peF9leGl0KHZvaWQpCit7CisJc29ja191bnJlZ2lzdGVyKFBGX1VOSVgpOworCXVuaXhfc3lzY3RsX3VucmVnaXN0ZXIoKTsKKwlwcm9jX25ldF9yZW1vdmUoInVuaXgiKTsKKwlwcm90b191bnJlZ2lzdGVyKCZ1bml4X3Byb3RvKTsKK30KKworbW9kdWxlX2luaXQoYWZfdW5peF9pbml0KTsKK21vZHVsZV9leGl0KGFmX3VuaXhfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19ORVRQUk9UTyhQRl9VTklYKTsKZGlmZiAtLWdpdCBhL25ldC91bml4L2dhcmJhZ2UuYyBiL25ldC91bml4L2dhcmJhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmQ5NWM4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3VuaXgvZ2FyYmFnZS5jCkBAIC0wLDAgKzEsMzEyIEBACisvKgorICogTkVUMzoJR2FyYmFnZSBDb2xsZWN0b3IgRm9yIEFGX1VOSVggc29ja2V0cworICoKKyAqIEdhcmJhZ2UgQ29sbGVjdG9yOgorICoJQ29weXJpZ2h0IChDKSBCYXJhayBBLiBQZWFybG11dHRlci4KKyAqCVJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgdmVyc2lvbiAyIG9yIGxhdGVyLgorICoKKyAqIENob3BwZWQgYWJvdXQgYnkgQWxhbiBDb3ggMjIvMy85NiB0byBtYWtlIGl0IGZpdCB0aGUgQUZfVU5JWCBzb2NrZXQgcHJvYmxlbS4KKyAqIElmIGl0IGRvZXNuJ3Qgd29yayBibGFtZSBtZSwgaXQgd29ya2VkIHdoZW4gQmFyYWsgc2VudCBpdC4KKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqCisgKiAgLSBvYmplY3Qgdy8gYSBiaXQKKyAqICAtIGZyZWUgbGlzdAorICoKKyAqIEN1cnJlbnQgb3B0aW1pemF0aW9uczoKKyAqCisgKiAgLSBleHBsaWNpdCBzdGFjayBpbnN0ZWFkIG9mIHJlY3Vyc2lvbgorICogIC0gdGFpbCByZWN1cnNlIG9uIGZpcnN0IGJvcm4gaW5zdGVhZCBvZiBpbW1lZGlhdGUgcHVzaC9wb3AKKyAqICAtIHdlIGdhdGhlciB0aGUgc3R1ZmYgdGhhdCBzaG91bGQgbm90IGJlIGtpbGxlZCBpbnRvIHRyZWUKKyAqICAgIGFuZCBzdGFjayBpcyBqdXN0IGEgcGF0aCBmcm9tIHJvb3QgdG8gdGhlIGN1cnJlbnQgcG9pbnRlci4KKyAqCisgKiAgRnV0dXJlIG9wdGltaXphdGlvbnM6CisgKgorICogIC0gZG9uJ3QganVzdCBwdXNoIGVudGlyZSByb290IHNldDsgcHJvY2VzcyBpbiBwbGFjZQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIEZpeGVzOgorICoJQWxhbiBDb3gJMDcgU2VwdAkxOTk3CVZtYWxsb2MgaW50ZXJuYWwgc3RhY2sgYXMgbmVlZGVkLgorICoJCQkJCUNvcGUgd2l0aCBjaGFuZ2luZyBtYXhfZmlsZXMuCisgKglBbCBWaXJvCQkxMSBPY3QgMTk5OAorICoJCUdyYXBoIG1heSBoYXZlIGN5Y2xlcy4gVGhhdCBpcywgd2UgY2FuIHNlbmQgdGhlIGRlc2NyaXB0b3IKKyAqCQlvZiBmb28gdG8gYmFyIGFuZCB2aWNlIHZlcnNhLiBDdXJyZW50IGNvZGUgY2hva2VzIG9uIHRoYXQuCisgKgkJRml4OiBtb3ZlIFNDTV9SSUdIVFMgb25lcyBpbnRvIHRoZSBzZXBhcmF0ZSBsaXN0IGFuZCB0aGVuCisgKgkJc2tiX2ZyZWUoKSB0aGVtIGFsbCBpbnN0ZWFkIG9mIGRvaW5nIGV4cGxpY2l0IGZwdXQncy4KKyAqCQlBbm90aGVyIHByb2JsZW06IHNpbmNlIGZwdXQoKSBtYXkgYmxvY2sgc29tZWJvZHkgbWF5CisgKgkJY3JlYXRlIGEgbmV3IHVuaXhfc29ja2V0IHdoZW4gd2UgYXJlIGluIHRoZSBtaWRkbGUgb2Ygc3dlZXAKKyAqCQlwaGFzZS4gRml4OiByZXZlcnQgdGhlIGxvZ2ljIHdydCBNQVJLRUQuIE1hcmsgZXZlcnl0aGluZworICoJCXVwb24gdGhlIGJlZ2lubmluZyBhbmQgdW5tYXJrIG5vbi1qdW5rIG9uZXMuCisgKgorICoJCVsxMiBPY3QgMTk5OF0gQUFBUkdIISBOZXcgY29kZSBwdXJnZXMgYWxsIFNDTV9SSUdIVFMKKyAqCQlzZW50IHRvIGNvbm5lY3QoKSdlZCBidXQgc3RpbGwgbm90IGFjY2VwdCgpJ2VkIHNvY2tldHMuCisgKgkJRml4ZWQuIE9sZCBjb2RlIGhhZCBzbGlnaHRseSBkaWZmZXJlbnQgcHJvYmxlbSBoZXJlOgorICoJCWV4dHJhIGZwdXQoKSBpbiBzaXR1YXRpb24gd2hlbiB3ZSBwYXNzZWQgdGhlIGRlc2NyaXB0b3IgdmlhCisgKgkJc3VjaCBzb2NrZXQgYW5kIGNsb3NlZCBpdCAoZGVzY3JpcHRvcikuIFRoYXQgd291bGQgaGFwcGVuIG9uCisgKgkJZWFjaCB1bml4X2djKCkgdW50aWwgdGhlIGFjY2VwdCgpLiBTaW5jZSB0aGUgc3RydWN0IGZpbGUgaW4KKyAqCQlxdWVzdGlvbiB3b3VsZCBnbyB0byB0aGUgZnJlZSBsaXN0IGFuZCBtaWdodCBiZSByZXVzZWQuLi4KKyAqCQlUaGF0IG1pZ2h0IGJlIHRoZSByZWFzb24gb2YgcmFuZG9tIG9vcHNlcyBvbiBmaWxwX2Nsb3NlKCkKKyAqCQlpbiB1bnJlbGF0ZWQgcHJvY2Vzc2VzLgorICoKKyAqCUFWCQkyOCBGZWIgMTk5OQorICoJCUtpbGwgdGhlIGV4cGxpY2l0IGFsbG9jYXRpb24gb2Ygc3RhY2suIE5vdyB3ZSBrZWVwIHRoZSB0cmVlCisgKgkJd2l0aCByb290IGluIGR1bW15ICsgcG9pbnRlciAoZ2NfY3VycmVudCkgdG8gb25lIG9mIHRoZSBub2Rlcy4KKyAqCQlTdGFjayBpcyByZXByZXNlbnRlZCBhcyBwYXRoIGZyb20gZ2NfY3VycmVudCB0byBkdW1teS4gVW5tYXJrCisgKgkJbm93IG1lYW5zICJhZGQgdG8gdHJlZSIuIFB1c2ggPT0gIm1ha2UgaXQgYSBzb24gb2YgZ2NfY3VycmVudCIuCisgKgkJUG9wID09ICJtb3ZlIGdjX2N1cnJlbnQgdG8gcGFyZW50Ii4gV2Uga2VlcCBvbmx5IHBvaW50ZXJzIHRvCisgKgkJcGFyZW50cyAoLT5nY190cmVlKS4KKyAqCUFWCQkxIE1hciAxOTk5CisgKgkJRGFtbi4gQWRkZWQgbWlzc2luZyBjaGVjayBmb3IgLT5kZWFkIGluIGxpc3RlbiBxdWV1ZXMgc2Nhbm5pbmcuCisgKgorICovCisgCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC91bi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisKKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9hZl91bml4Lmg+CisjaW5jbHVkZSA8bmV0L3NjbS5oPgorCisvKiBJbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgYW5kIHJhbmRvbSBwcm9jZWR1cmVzOiAqLworCisjZGVmaW5lIEdDX0hFQUQJCSgoc3RydWN0IHNvY2sgKikoLTEpKQorI2RlZmluZSBHQ19PUlBIQU4JKChzdHJ1Y3Qgc29jayAqKSgtMykpCisKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqZ2NfY3VycmVudCA9IEdDX0hFQUQ7IC8qIHN0YWNrIG9mIG9iamVjdHMgdG8gbWFyayAqLworCithdG9taWNfdCB1bml4X3RvdF9pbmZsaWdodCA9IEFUT01JQ19JTklUKDApOworCisKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqdW5peF9nZXRfc29ja2V0KHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBzb2NrICp1X3NvY2sgPSBOVUxMOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKworCS8qCisJICoJU29ja2V0ID8KKwkgKi8KKwlpZiAoU19JU1NPQ0soaW5vZGUtPmlfbW9kZSkpIHsKKwkJc3RydWN0IHNvY2tldCAqIHNvY2sgPSBTT0NLRVRfSShpbm9kZSk7CisJCXN0cnVjdCBzb2NrICogcyA9IHNvY2stPnNrOworCisJCS8qCisJCSAqCVBGX1VOSVggPworCQkgKi8KKwkJaWYgKHMgJiYgc29jay0+b3BzICYmIHNvY2stPm9wcy0+ZmFtaWx5ID09IFBGX1VOSVgpCisJCQl1X3NvY2sgPSBzOworCX0KKwlyZXR1cm4gdV9zb2NrOworfQorCisvKgorICoJS2VlcCB0aGUgbnVtYmVyIG9mIHRpbWVzIGluIGZsaWdodCBjb3VudCBmb3IgdGhlIGZpbGUKKyAqCWRlc2NyaXB0b3IgaWYgaXQgaXMgZm9yIGFuIEFGX1VOSVggc29ja2V0LgorICovCisgCit2b2lkIHVuaXhfaW5mbGlnaHQoc3RydWN0IGZpbGUgKmZwKQoreworCXN0cnVjdCBzb2NrICpzID0gdW5peF9nZXRfc29ja2V0KGZwKTsKKwlpZihzKSB7CisJCWF0b21pY19pbmMoJnVuaXhfc2socyktPmluZmxpZ2h0KTsKKwkJYXRvbWljX2luYygmdW5peF90b3RfaW5mbGlnaHQpOworCX0KK30KKwordm9pZCB1bml4X25vdGluZmxpZ2h0KHN0cnVjdCBmaWxlICpmcCkKK3sKKwlzdHJ1Y3Qgc29jayAqcyA9IHVuaXhfZ2V0X3NvY2tldChmcCk7CisJaWYocykgeworCQlhdG9taWNfZGVjKCZ1bml4X3NrKHMpLT5pbmZsaWdodCk7CisJCWF0b21pY19kZWMoJnVuaXhfdG90X2luZmxpZ2h0KTsKKwl9Cit9CisKKworLyoKKyAqCUdhcmJhZ2UgQ29sbGVjdG9yIFN1cHBvcnQgRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29jayAqcG9wX3N0YWNrKHZvaWQpCit7CisJc3RydWN0IHNvY2sgKnAgPSBnY19jdXJyZW50OworCWdjX2N1cnJlbnQgPSB1bml4X3NrKHApLT5nY190cmVlOworCXJldHVybiBwOworfQorCitzdGF0aWMgaW5saW5lIGludCBlbXB0eV9zdGFjayh2b2lkKQoreworCXJldHVybiBnY19jdXJyZW50ID09IEdDX0hFQUQ7Cit9CisKK3N0YXRpYyB2b2lkIG1heWJlX3VubWFya19hbmRfcHVzaChzdHJ1Y3Qgc29jayAqeCkKK3sKKwlzdHJ1Y3QgdW5peF9zb2NrICp1ID0gdW5peF9zayh4KTsKKworCWlmICh1LT5nY190cmVlICE9IEdDX09SUEhBTikKKwkJcmV0dXJuOworCXNvY2tfaG9sZCh4KTsKKwl1LT5nY190cmVlID0gZ2NfY3VycmVudDsKKwlnY19jdXJyZW50ID0geDsKK30KKworCisvKiBUaGUgZXh0ZXJuYWwgZW50cnkgcG9pbnQ6IHVuaXhfZ2MoKSAqLworCit2b2lkIHVuaXhfZ2Modm9pZCkKK3sKKwlzdGF0aWMgREVDTEFSRV9NVVRFWCh1bml4X2djX3NlbSk7CisJaW50IGk7CisJc3RydWN0IHNvY2sgKnM7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCBoaXRsaXN0OworCXN0cnVjdCBza19idWZmICpza2I7CisKKwkvKgorCSAqCUF2b2lkIGEgcmVjdXJzaXZlIEdDLgorCSAqLworCisJaWYgKGRvd25fdHJ5bG9jaygmdW5peF9nY19zZW0pKQorCQlyZXR1cm47CisKKwlyZWFkX2xvY2soJnVuaXhfdGFibGVfbG9jayk7CisKKwlmb3JhbGxfdW5peF9zb2NrZXRzKGksIHMpCisJeworCQl1bml4X3NrKHMpLT5nY190cmVlID0gR0NfT1JQSEFOOworCX0KKwkvKgorCSAqCUV2ZXJ5dGhpbmcgaXMgbm93IG1hcmtlZCAKKwkgKi8KKworCS8qIEludmFyaWFudCB0byBiZSBtYWludGFpbmVkOgorCQktIGV2ZXJ5dGhpbmcgdW5tYXJrZWQgaXMgZWl0aGVyOgorCQktLSAoYSkgb24gdGhlIHN0YWNrLCBvcgorCQktLSAoYikgaGFzIGFsbCBvZiBpdHMgY2hpbGRyZW4gdW5tYXJrZWQKKwkJLSBldmVyeXRoaW5nIG9uIHRoZSBzdGFjayBpcyBhbHdheXMgdW5tYXJrZWQKKwkJLSBub3RoaW5nIGlzIGV2ZXIgcHVzaGVkIG9udG8gdGhlIHN0YWNrIHR3aWNlLCBiZWNhdXNlOgorCQktLSBub3RoaW5nIHByZXZpb3VzbHkgdW5tYXJrZWQgaXMgZXZlciBwdXNoZWQgb24gdGhlIHN0YWNrCisJICovCisKKwkvKgorCSAqCVB1c2ggcm9vdCBzZXQKKwkgKi8KKworCWZvcmFsbF91bml4X3NvY2tldHMoaSwgcykKKwl7CisJCWludCBvcGVuX2NvdW50ID0gMDsKKworCQkvKgorCQkgKglJZiBhbGwgaW5zdGFuY2VzIG9mIHRoZSBkZXNjcmlwdG9yIGFyZSBub3QKKwkJICoJaW4gZmxpZ2h0IHdlIGFyZSBpbiB1c2UuCisJCSAqCisJCSAqCVNwZWNpYWwgY2FzZTogd2hlbiBzb2NrZXQgcyBpcyBlbWJyaW9uLCBpdCBtYXkgYmUKKwkJICoJaGFzaGVkIGJ1dCBzdGlsbCBub3QgaW4gcXVldWUgb2YgbGlzdGVuaW5nIHNvY2tldC4KKwkJICoJSW4gdGhpcyBjYXNlIChzZWUgdW5peF9jcmVhdGUxKCkpIHdlIHNldCBhcnRpZmljaWFsCisJCSAqCW5lZ2F0aXZlIGluZmxpZ2h0IGNvdW50ZXIgdG8gY2xvc2UgcmFjZSB3aW5kb3cuCisJCSAqCUl0IGlzIHRyaWNrIG9mIGNvdXJzZSBhbmQgZGlydHkgb25lLgorCQkgKi8KKwkJaWYgKHMtPnNrX3NvY2tldCAmJiBzLT5za19zb2NrZXQtPmZpbGUpCisJCQlvcGVuX2NvdW50ID0gZmlsZV9jb3VudChzLT5za19zb2NrZXQtPmZpbGUpOworCQlpZiAob3Blbl9jb3VudCA+IGF0b21pY19yZWFkKCZ1bml4X3NrKHMpLT5pbmZsaWdodCkpCisJCQltYXliZV91bm1hcmtfYW5kX3B1c2gocyk7CisJfQorCisJLyoKKwkgKglNYXJrIHBoYXNlIAorCSAqLworCisJd2hpbGUgKCFlbXB0eV9zdGFjaygpKQorCXsKKwkJc3RydWN0IHNvY2sgKnggPSBwb3Bfc3RhY2soKTsKKwkJc3RydWN0IHNvY2sgKnNrOworCisJCXNwaW5fbG9jaygmeC0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwkJc2tiID0gc2tiX3BlZWsoJngtPnNrX3JlY2VpdmVfcXVldWUpOworCQkKKwkJLyoKKwkJICoJTG9vcCB0aHJvdWdoIGFsbCBidXQgZmlyc3QgYm9ybiAKKwkJICovCisJCQorCQl3aGlsZSAoc2tiICYmIHNrYiAhPSAoc3RydWN0IHNrX2J1ZmYgKikmeC0+c2tfcmVjZWl2ZV9xdWV1ZSkgeworCQkJLyoKKwkJCSAqCURvIHdlIGhhdmUgZmlsZSBkZXNjcmlwdG9ycyA/CisJCQkgKi8KKwkJCWlmKFVOSVhDQihza2IpLmZwKQorCQkJeworCQkJCS8qCisJCQkJICoJUHJvY2VzcyB0aGUgZGVzY3JpcHRvcnMgb2YgdGhpcyBzb2NrZXQKKwkJCQkgKi8KKwkJCQlpbnQgbmZkPVVOSVhDQihza2IpLmZwLT5jb3VudDsKKwkJCQlzdHJ1Y3QgZmlsZSAqKmZwID0gVU5JWENCKHNrYikuZnAtPmZwOworCQkJCXdoaWxlKG5mZC0tKQorCQkJCXsKKwkJCQkJLyoKKwkJCQkJICoJR2V0IHRoZSBzb2NrZXQgdGhlIGZkIG1hdGNoZXMgaWYKKwkJCQkJICoJaXQgaW5kZWVkIGRvZXMgc28KKwkJCQkJICovCisJCQkJCWlmKChzaz11bml4X2dldF9zb2NrZXQoKmZwKyspKSE9TlVMTCkKKwkJCQkJeworCQkJCQkJbWF5YmVfdW5tYXJrX2FuZF9wdXNoKHNrKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCS8qIFdlIGhhdmUgdG8gc2NhbiBub3QteWV0LWFjY2VwdGVkIG9uZXMgdG9vICovCisJCQlpZiAoeC0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTikKKwkJCQltYXliZV91bm1hcmtfYW5kX3B1c2goc2tiLT5zayk7CisJCQlza2I9c2tiLT5uZXh0OworCQl9CisJCXNwaW5fdW5sb2NrKCZ4LT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOworCQlzb2NrX3B1dCh4KTsKKwl9CisKKwlza2JfcXVldWVfaGVhZF9pbml0KCZoaXRsaXN0KTsKKworCWZvcmFsbF91bml4X3NvY2tldHMoaSwgcykKKwl7CisJCXN0cnVjdCB1bml4X3NvY2sgKnUgPSB1bml4X3NrKHMpOworCisJCWlmICh1LT5nY190cmVlID09IEdDX09SUEhBTikgeworCQkJc3RydWN0IHNrX2J1ZmYgKm5leHRzazsKKworCQkJc3Bpbl9sb2NrKCZzLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOworCQkJc2tiID0gc2tiX3BlZWsoJnMtPnNrX3JlY2VpdmVfcXVldWUpOworCQkJd2hpbGUgKHNrYiAmJgorCQkJICAgICAgIHNrYiAhPSAoc3RydWN0IHNrX2J1ZmYgKikmcy0+c2tfcmVjZWl2ZV9xdWV1ZSkgeworCQkJCW5leHRzaz1za2ItPm5leHQ7CisJCQkJLyoKKwkJCQkgKglEbyB3ZSBoYXZlIGZpbGUgZGVzY3JpcHRvcnMgPworCQkJCSAqLworCQkJCWlmKFVOSVhDQihza2IpLmZwKQorCQkJCXsKKwkJCQkJX19za2JfdW5saW5rKHNrYiwgc2tiLT5saXN0KTsKKwkJCQkJX19za2JfcXVldWVfdGFpbCgmaGl0bGlzdCxza2IpOworCQkJCX0KKwkJCQlza2I9bmV4dHNrOworCQkJfQorCQkJc3Bpbl91bmxvY2soJnMtPnNrX3JlY2VpdmVfcXVldWUubG9jayk7CisJCX0KKwkJdS0+Z2NfdHJlZSA9IEdDX09SUEhBTjsKKwl9CisJcmVhZF91bmxvY2soJnVuaXhfdGFibGVfbG9jayk7CisKKwkvKgorCSAqCUhlcmUgd2UgYXJlLiBIaXRsaXN0IGlzIGZpbGxlZC4gRGllLgorCSAqLworCisJX19za2JfcXVldWVfcHVyZ2UoJmhpdGxpc3QpOworCXVwKCZ1bml4X2djX3NlbSk7Cit9CmRpZmYgLS1naXQgYS9uZXQvdW5peC9zeXNjdGxfbmV0X3VuaXguYyBiL25ldC91bml4L3N5c2N0bF9uZXRfdW5peC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NzRkYWMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdW5peC9zeXNjdGxfbmV0X3VuaXguYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogTkVUNDoJU3lzY3RsIGludGVyZmFjZSB0byBuZXQgYWZfdW5peCBzdWJzeXN0ZW0uCisgKgorICogQXV0aG9yczoJTWlrZSBTaGF2ZXIuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisKK2V4dGVybiBpbnQgc3lzY3RsX3VuaXhfbWF4X2RncmFtX3FsZW47CisKK3N0YXRpYyBjdGxfdGFibGUgdW5peF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX1VOSVhfTUFYX0RHUkFNX1FMRU4sCisJCS5wcm9jbmFtZQk9ICJtYXhfZGdyYW1fcWxlbiIsCisJCS5kYXRhCQk9ICZzeXNjdGxfdW5peF9tYXhfZGdyYW1fcWxlbiwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIGN0bF90YWJsZSB1bml4X25ldF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX1VOSVgsCisJCS5wcm9jbmFtZQk9ICJ1bml4IiwKKwkJLm1vZGUJCT0gMDU1NSwKKwkJLmNoaWxkCQk9IHVuaXhfdGFibGUKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCitzdGF0aWMgY3RsX3RhYmxlIHVuaXhfcm9vdF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX05FVCwKKwkJLnByb2NuYW1lCT0gIm5ldCIsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSB1bml4X25ldF90YWJsZQorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqIHVuaXhfc3lzY3RsX2hlYWRlcjsKKwordm9pZCB1bml4X3N5c2N0bF9yZWdpc3Rlcih2b2lkKQoreworCXVuaXhfc3lzY3RsX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZSh1bml4X3Jvb3RfdGFibGUsIDApOworfQorCit2b2lkIHVuaXhfc3lzY3RsX3VucmVnaXN0ZXIodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZSh1bml4X3N5c2N0bF9oZWFkZXIpOworfQorCmRpZmYgLS1naXQgYS9uZXQvd2Fucm91dGVyL01ha2VmaWxlIGIvbmV0L3dhbnJvdXRlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjE4OGFiCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3dhbnJvdXRlci9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBXQU4gcm91dGVyIGxheWVyLgorIworCitvYmotJChDT05GSUdfV0FOX1JPVVRFUikgKz0gd2Fucm91dGVyLm8KKword2Fucm91dGVyLW9ianMgOj0gIHdhbnByb2MubyB3YW5tYWluLm8KZGlmZiAtLWdpdCBhL25ldC93YW5yb3V0ZXIvYWZfd2FucGlwZS5jIGIvbmV0L3dhbnJvdXRlci9hZl93YW5waXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkzYjE5ZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC93YW5yb3V0ZXIvYWZfd2FucGlwZS5jCkBAIC0wLDAgKzEsMjYxMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGFmX3dhbnBpcGUuYwlXQU5QSVBFKHRtKSBTZWN1cmUgU29ja2V0IExheWVyLgorKgorKiBBdXRob3I6CU5lbmFkIENvcmJpYwk8bmNvcmJpY0BzYW5nb21hLmNvbT4KKyoKKyogQ29weXJpZ2h0OgkoYykgMjAwMCBTYW5nb21hIFRlY2hub2xvZ2llcyBJbmMuCisqCisqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIER1ZSBDcmVkaXQ6CisqICAgICAgICAgICAgICAgV2FucGlwZSBzb2NrZXQgbGF5ZXIgaXMgYmFzZWQgb24gUGFja2V0IGFuZCAKKyogICAgICAgICAgICAgICB0aGUgWDI1IHNvY2tldCBsYXllcnMuIFRoZSBhYm92ZSBzb2NrZXRzIHdlcmUgCisqICAgICAgICAgICAgICAgdXNlZCBmb3IgdGhlIHNwZWNpZmljIHVzZSBvZiBTYW5nb21hIFRlY2hub2xvaWdlcyAKKyogICAgICAgICAgICAgICBBUEkgcHJvZ3JhbXMuIAorKiAgICAgICAgICAgICAgIFBhY2tldCBzb2NrZXQgQXV0aG9yczogUm9zcyBCaXJvLCBGcmVkIE4uIHZhbiBLZW1wZW4gYW5kIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxhbiBDb3guCisqICAgICAgICAgICAgICAgWDI1IHNvY2tldCBBdXRob3I6IEpvbmF0aGFuIE5heWxvci4KKyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiBNYXIgMTUsIDIwMDIgIEFybmFsZG8gQy4gTWVsbyAgbyBVc2Ugd3Bfc2soKS0+bnVtLCBhcyBpdCBpc250IGFueW1vcmUgaW4gc29jaworKiBBcHIgMjUsIDIwMDAgIE5lbmFkIENvcmJpYyAgICAgbyBBZGRlZCB0aGUgYWJpbGl0eSB0byBzZW5kIHplcm8gbGVuZ3RoIHBhY2tldHMuCisqIE1hciAxMywgMjAwMCAgTmVuYWQgQ29yYmljCSBvIEFkZGVkIGEgdHggYnVmZmVyIGNoZWNrIHZpYSBpb2N0bCBjYWxsLgorKiBNYXIgMDYsIDIwMDAgIE5lbmFkIENvcmJpYyAgICAgbyBGaXhlZCB0aGUgY29ycnVwdCBzb2NrIGxjbiBwcm9ibGVtLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXIgYW5kIGNsaWVudCBhcHBsaWNhdG9uIGNhbiBydW4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltdWx0YW5lb3VzbHkgd2l0aG91dCBjb25mbGljdHMuCisqIEZlYiAyOSwgMjAwMCAgTmVuYWQgQ29yYmljICAgICBvIEFkZGVkIHN1cHBvcnQgZm9yIFBWQyBwcm90b2NvbHMsIHN1Y2ggYXMKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hETEMsIEZyYW1lIFJlbGF5IGFuZCBIRExDIEFQSS4KKyogSmFuIDE3LCAyMDAwIAlOZW5hZCBDb3JiaWMJIG8gSW5pdGlhbCB2ZXJzaW9uLCBiYXNlZCBvbiBBRl9QQUNLRVQgc29ja2V0LgorKgkJCSAgICAgICAgICAgWDI1QVBJIHN1cHBvcnQgb25seS4gCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FucGlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3dhbnBpcGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl93YW5waXBlX2NvbW1vbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NkbGFfeDI1Lmg+CisKKyNpZmRlZiBDT05GSUdfSU5FVAorI2luY2x1ZGUgPG5ldC9pbmV0X2NvbW1vbi5oPgorI2VuZGlmCisKKyNkZWZpbmUgU0xPV19CQUNLT0ZGIDAuMSpIWgorI2RlZmluZSBGQVNUX0JBQ0tPRkYgMC4wMSpIWgorCisvLyNkZWZpbmUgUFJJTlRfREVCVUcKKyNpZmRlZiBQUklOVF9ERUJVRworCSNkZWZpbmUgREJHX1BSSU5USyhmb3JtYXQsIGEuLi4pIHByaW50ayhmb3JtYXQsICMjIGEpCisjZWxzZQorCSNkZWZpbmUgREJHX1BSSU5USyhmb3JtYXQsIGEuLi4pCisjZW5kaWYgICAgICAKKworCisvKiBTRUNVUkUgU09DS0VUIElNUExFTUVOVEFUSU9OIAorICogCisgKiAgIFRSQU5TTUlUOgorICoKKyAqICAgICAgV2hlbiB0aGUgdXNlciBzZW5kcyBhIHBhY2tldCB2aWEgc2VuZCgpIHN5c3RlbSBjYWxsCisgKiAgICAgIHRoZSB3YW5waXBlX3NlbmRtc2coKSBmdW5jdGlvbiBpcyBleGVjdXRlZC4gIAorICogICAgICAKKyAqICAgICAgRWFjaCBwYWNrZXQgaXMgZW5xdWV1ZCBpbnRvIHNrLT5za193cml0ZV9xdWV1ZSB0cmFuc21pdAorICogICAgICBxdWV1ZS4gV2hlbiB0aGUgcGFja2V0IGlzIGVucXVldWVkLCBhIGRlbGF5ZWQgdHJhbnNtaXQKKyAqICAgICAgdGltZXIgaXMgdHJpZ2dlcmQgd2hpY2ggYWN0cyBhcyBhIEJvdHRvbSBIYWxmIGhhbmRlci4gCisgKgorICogICAgICB3YW5waXBlX2RlbGF5X3RyYW5zbWl0KCkgZnVuY3Rpb24gKEJIKSwgZGVxdWV1ZXMgcGFja2V0cworICogICAgICBmcm9tIHRoZSBzay0+c2tfd3JpdGVfcXVldWUgdHJhbnNtaXQgcXVldWUgYW5kIHNlbmRzIGl0IAorICogICAgICB0byB0aGUgZGVyaXZlciB2aWEgZGV2LT5oYXJkX3N0YXJ0X3htaXQoc2tiLCBkZXYpIGZ1bmN0aW9uLiAgCisgKiAgICAgIE5vdGUsIHRoaXMgZnVuY3Rpb24gaXMgYWN0dWFsIGEgZnVuY3Rpb24gcG9pbnRlciBvZiBpZl9zZW5kKCkKKyAqICAgICAgcm91dGluZSBpbiB0aGUgd2FucGlwZSBkcml2ZXIuCisgKgorICogICAgICBYMjVBUEkgR1VBUkFOVEVFRCBERUxJVkVSWToKKyAqCisgKiAgICAgICAgIEluIG9yZGVyIHRvIHByb3ZpZGUgMTAwJSBndWFyYW50ZWVkIHBhY2tldCBkZWxpdmVyeSwgCisgKiAgICAgICAgIGFuIGF0b21pYyAncGFja2V0X3NlbnQnIGNvdW50ZXIgaXMgaW1wbGVtZW50ZWQuICBDb3VudGVyIAorICogICAgICAgICBpcyBpbmNyZW1lbnRlZCBmb3IgZWFjaCBwYWNrZXQgZW5xdWV1ZWQgCisgKiAgICAgICAgIGludG8gc2stPnNrX3dyaXRlX3F1ZXVlLiAgQ291bnRlciBpcyBkZWNyZW1lbnRlZCBlYWNoCisgKiAgICAgICAgIHRpbWUgd2FucGlwZV9kZWxheWVkX3RyYW5zbWl0KCkgZnVuY3Rpb24gc3VjY2Vzc2Z1bHkgCisgKiAgICAgICAgIHBhc3NlcyB0aGUgcGFja2V0IHRvIHRoZSBkcml2ZXIuIEJlZm9yZSBlYWNoIHNlbmQoKSwgYSBwb2xsCisgKiAgICAgICAgIHJvdXRpbmUgY2hlY2tzIHRoZSBzb2NrIHJlc291cmNlcyBUaGUgbWF4aW11bSB2YWx1ZSBvZgorICogICAgICAgICBwYWNrZXQgc2VudCBjb3VudGVyIGlzIDEsIHRodXMgaWYgb25lIHBhY2tldCBpcyBxdWV1ZWQsIHRoZQorICogICAgICAgICBhcHBsaWNhdGlvbiB3aWxsIGJsb2NrIHVudGlsIHRoYXQgcGFja2V0IGlzIHBhc3NlZCB0byB0aGUKKyAqICAgICAgICAgZHJpdmVyLgorICoKKyAqICAgUkVDRUlWRToKKyAqCisgKiAgICAgIFdhbnBpcGUgZGV2aWNlIGRyaXZlcnMgY2FsbCB0aGUgc29ja2V0IGJvdHRvbSBoYWxmCisgKiAgICAgIGZ1bmN0aW9uLCB3YW5waXBlX3JjdigpIHRvIHF1ZXVlIHRoZSBpbmNvbWluZyBwYWNrZXRzCisgKiAgICAgIGludG8gYW4gQUZfV0FOUElQRSBzb2NrZXQgcXVldWUuICBCYXNlZCBvbiB3YW5waXBlX3JjdigpCisgKiAgICAgIHJldHVybiBjb2RlLCB0aGUgZHJpdmVyIGtub3dzIHdoZXRoZXIgdGhlIHBhY2tldCB3YXMKKyAqICAgICAgc3VjY2Vzc2Z1bGx5IHF1ZXVlZC4gIElmIHRoZSBzb2NrZXQgcXVldWUgaXMgZnVsbCwgCisgKiAgICAgIHByb3RvY29sIGZsb3cgY29udHJvbCBpcyB1c2VkIGJ5IHRoZSBkcml2ZXIsIGlmIGFueSwgCisgKiAgICAgIHRvIHNsb3cgZG93biB0aGUgdHJhZmZpYyB1bnRpbCB0aGUgc29jayBxdWV1ZSBpcyBmcmVlLgorICoKKyAqICAgICAgRXZlcnkgdGltZSBhIHBhY2tldCBhcnJpdmVzIGludG8gYSBzb2NrZXQgcXVldWUgdGhlIAorICogICAgICBzb2NrZXQgd2FrZXMgdXAgcHJvY2Vzc2VzIHdoaWNoIGFyZSB3YWl0aW5nIHRvIHJlY2VpdmUKKyAqICAgICAgZGF0YS4KKyAqCisgKiAgICAgIElmIHRoZSBzb2NrZXQgcXVldWUgaXMgZnVsbCwgdGhlIGRyaXZlciBzZXRzIGEgYmxvY2sKKyAqICAgICAgYml0IHdoaWNoIHNpZ25hbHMgdGhlIHNvY2tldCB0byBraWNrIHRoZSB3YW5waXBlIGRyaXZlcgorICogICAgICBib3R0b20gaGFsZiBoYW5kZXIgd2hlbiB0aGUgc29ja2V0IHF1ZXVlIGlzIHBhcnRpYWx5CisgKiAgICAgIGVtcHR5LiB3YW5waXBlX3JlY3Ztc2coKSBmdW5jdGlvbiBwZXJmb3JtcyB0aGlzIGFjdGlvbi4KKyAqIAorICogICAgICBJbiBjYXNlIG9mIHgyNWFwaSwgcGFja2V0cyB3aWxsIG5ldmVyIGJlIGRyb3BwZWQsIHNpbmNlCisgKiAgICAgIGZsb3cgY29udHJvbCBpcyBhdmFpbGFibGUuIAorICogICAgICAKKyAqICAgICAgSW4gY2FzZSBvZiBzdHJlYW1pbmcgcHJvdG9jb2xzIGxpa2UgQ0hETEMsIHBhY2tldHMgd2lsbCAKKyAqICAgICAgYmUgZHJvcHBlZCBidXQgdGhlIHN0YXRpc3RpY3Mgd2lsbCBiZSBnZW5lcmF0ZWQuIAorICovCisKKworLyogVGhlIGNvZGUgYmVsb3cgaXMgdXNlZCB0byB0ZXN0IG1lbW9yeSBsZWFrcy4gSXQgcHJpbnRzIG91dAorICogYSBtZXNzYWdlIGV2ZXJ5IHRpbWUga21hbGxvYyBhbmQga2ZyZWUgc3lzdGVtIGNhbGxzIGdldCBleGVjdXRlZC4KKyAqIElmIHRoZSBjYWxscyBtYXRjaCB0aGVyZSBpcyBubyBsZWFrIDopCisgKi8KKworLyoqKioqKioqKioqRk9SIERFQlVHR0lORyBQVVJQT1NFUyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBLTUVNX1NBRkVUWVpPTkUgOAorCitzdGF0aWMgdm9pZCAqIGRiZ19rbWFsbG9jKHVuc2lnbmVkIGludCBzaXplLCBpbnQgcHJpbywgaW50IGxpbmUpIHsKKwl2b2lkICogdiA9IGttYWxsb2Moc2l6ZSxwcmlvKTsKKwlwcmludGsoS0VSTl9JTkZPICJsaW5lICVkICBrbWFsbG9jKCVkLCVkKSA9ICVwXG4iLGxpbmUsc2l6ZSxwcmlvLHYpOworCXJldHVybiB2OworfQorc3RhdGljIHZvaWQgZGJnX2tmcmVlKHZvaWQgKiB2LCBpbnQgbGluZSkgeworCXByaW50ayhLRVJOX0lORk8gImxpbmUgJWQgIGtmcmVlKCVwKVxuIixsaW5lLHYpOworCWtmcmVlKHYpOworfQorCisjZGVmaW5lIGttYWxsb2MoeCx5KSBkYmdfa21hbGxvYyh4LHksX19MSU5FX18pCisjZGVmaW5lIGtmcmVlKHgpIGRiZ19rZnJlZSh4LF9fTElORV9fKQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIExpc3Qgb2YgYWxsIHdhbnBpcGUgc29ja2V0cy4gKi8KK0hMSVNUX0hFQUQod2FucGlwZV9za2xpc3QpOworc3RhdGljIERFRklORV9SV0xPQ0sod2FucGlwZV9za2xpc3RfbG9jayk7CisKK2F0b21pY190IHdhbnBpcGVfc29ja3NfbnI7CitzdGF0aWMgdW5zaWduZWQgbG9uZyB3YW5waXBlX3R4X2NyaXRpY2FsOworCisjaWYgMAorLyogUHJpdmF0ZSB3YW5waXBlIHNvY2tldCBzdHJ1Y3R1cmVzLiAqLworc3RydWN0IHdhbnBpcGVfb3B0Cit7CisJdm9pZCAgICptYm94OwkJLyogTWFpbCBib3ggICovCisJdm9pZCAgICpjYXJkOyAJCS8qIENhcmQgYm91ZGVkIHRvICovCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsJLyogQm91bmRlZCBkZXZpY2UgKi8KKwl1bnNpZ25lZCBzaG9ydCBsY247CS8qIEJpbmRlZCBMQ04gKi8KKwl1bnNpZ25lZCBjaGFyICBzdmM7CS8qIDA9cHZjLCAxPXN2YyAqLworCXVuc2lnbmVkIGNoYXIgIHRpbWVyOyAgIC8qIGZsYWcgZm9yIGRlbGF5ZWQgdHJhbnNtaXQqLwkKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0eF90aW1lcjsKKwl1bnNpZ25lZCBwb2xsX2NudDsKKwl1bnNpZ25lZCBjaGFyIGZvcmNlOwkvKiBVc2VkIHRvIGZvcmNlIHNvY2sgcmVsZWFzZSAqLworCWF0b21pY190IHBhY2tldF9zZW50OyAgIAorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IHNrX2NvdW50OworZXh0ZXJuIHN0cnVjdCBwcm90b19vcHMgd2FucGlwZV9vcHM7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBmaW5kX2ZyZWVfY3JpdGljYWw7CisKK3N0YXRpYyB2b2lkIHdhbnBpcGVfdW5saW5rX2RyaXZlcihzdHJ1Y3Qgc29jayAqc2spOworc3RhdGljIHZvaWQgd2FucGlwZV9saW5rX2RyaXZlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc29jayAqc2spOworc3RhdGljIHZvaWQgd2FucGlwZV93YWtldXBfZHJpdmVyKHN0cnVjdCBzb2NrICpzayk7CitzdGF0aWMgaW50IGV4ZWN1dGVfY29tbWFuZChzdHJ1Y3Qgc29jayAqLCB1bnNpZ25lZCBjaGFyLCB1bnNpZ25lZCBpbnQpOworc3RhdGljIGludCBjaGVja19kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2RsYV90ICpjYXJkKTsKK3N0cnVjdCBuZXRfZGV2aWNlICp3YW5waXBlX2ZpbmRfZnJlZV9kZXYoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIHdhbnBpcGVfdW5saW5rX2NhcmQgKHN0cnVjdCBzb2NrICopOworc3RhdGljIGludCB3YW5waXBlX2xpbmtfY2FyZCAoc3RydWN0IHNvY2sgKik7CitzdGF0aWMgc3RydWN0IHNvY2sgKndhbnBpcGVfbWFrZV9uZXcoc3RydWN0IHNvY2sgKik7CitzdGF0aWMgc3RydWN0IHNvY2sgKndhbnBpcGVfYWxsb2Nfc29ja2V0KHZvaWQpOworc3RhdGljIGlubGluZSBpbnQgZ2V0X2F0b21pY19kZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHdhbnBpcGVfZXhlY19jbWQoc3RydWN0IHNvY2sgKiwgaW50LCB1bnNpZ25lZCBpbnQpOworc3RhdGljIGludCBnZXRfaW9jdGxfY21kIChzdHJ1Y3Qgc29jayAqLCB2b2lkICopOworc3RhdGljIGludCBzZXRfaW9jdGxfY21kIChzdHJ1Y3Qgc29jayAqLCB2b2lkICopOworc3RhdGljIHZvaWQgcmVsZWFzZV9kZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB3YW5waXBlX2tpbGxfc29ja190aW1lciAodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHdhbnBpcGVfa2lsbF9zb2NrX2lycSAoc3RydWN0IHNvY2sgKik7CitzdGF0aWMgdm9pZCB3YW5waXBlX2tpbGxfc29ja19hY2NlcHQgKHN0cnVjdCBzb2NrICopOworc3RhdGljIGludCB3YW5waXBlX2RvX2JpbmQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgaW50IHByb3RvY29sKTsKK3N0cnVjdCBzb2NrICogZ2V0X25ld3NrX2Zyb21fc2tiIChzdHJ1Y3Qgc2tfYnVmZiAqKTsKK3N0YXRpYyBpbnQgd2FucGlwZV9kZWJ1ZyAoc3RydWN0IHNvY2sgKiwgdm9pZCAqKTsKK3N0YXRpYyB2b2lkIHdhbnBpcGVfZGVsYXllZF90cmFuc21pdCAodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHJlbGVhc2VfZHJpdmVyKHN0cnVjdCBzb2NrICopOworc3RhdGljIHZvaWQgc3RhcnRfY2xlYW51cF90aW1lciAoc3RydWN0IHNvY2sgKik7CitzdGF0aWMgdm9pZCBjaGVja193cml0ZV9xdWV1ZShzdHJ1Y3Qgc29jayAqKTsKK3N0YXRpYyBpbnQgY2hlY2tfZHJpdmVyX2J1c3kgKHN0cnVjdCBzb2NrICopOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogd2FucGlwZV9yY3YKKyAqCisgKglXYW5waXBlIHNvY2tldCBib3R0b20gaGFsZiBoYW5kbGVyLiAgVGhpcyBmdW5jdGlvbgorICogICAgICBpcyBjYWxsZWQgYnkgdGhlIFdBTlBJUEUgZGV2aWNlIGRyaXZlcnMgdG8gcXVldWUgYQorICogICAgICBpbmNvbWluZyBwYWNrZXQgaW50byB0aGUgc29ja2V0IHJlY2VpdmUgcXVldWUuIAorICogICAgICBPbmNlIHRoZSBwYWNrZXQgaXMgcXVldWVkLCBhbGwgcHJvY2Vzc2VzIHdhaXRpbmcgdG8gCisgKiAgICAgIHJlYWQgYXJlIHdva2VuIHVwLgorICoKKyAqICAgICAgRHVyaW5nIHNvY2tldCBiaW5kLCB0aGlzIGZ1bmN0aW9uIGlzIGJvdW5kZWQgaW50bworICogICAgICBXQU5QSVBFIGRyaXZlciBwcml2YXRlLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgd2FucGlwZV9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3Qgd2FuX3NvY2thZGRyX2xsICpzbGwgPSAoc3RydWN0IHdhbl9zb2NrYWRkcl9sbCopc2tiLT5jYjsKKwl3YW5waXBlX2NvbW1vbl90ICpjaGFuID0gZGV2LT5wcml2OworCS8qCisJICoJV2hlbiB3ZSByZWdpc3RlcmVkIHRoZSBwcm90b2NvbCB3ZSBzYXZlZCB0aGUgc29ja2V0IGluIHRoZSBkYXRhCisJICoJZmllbGQgZm9yIGp1c3QgdGhpcyBldmVudC4KKwkgKi8KKworCXNrYi0+ZGV2ID0gZGV2OworCisJc2xsLT5zbGxfZmFtaWx5ID0gQUZfV0FOUElQRTsKKwlzbGwtPnNsbF9oYXR5cGUgPSBkZXYtPnR5cGU7CisJc2xsLT5zbGxfcHJvdG9jb2wgPSBza2ItPnByb3RvY29sOworCXNsbC0+c2xsX3BrdHR5cGUgPSBza2ItPnBrdF90eXBlOworCXNsbC0+c2xsX2lmaW5kZXggPSBkZXYtPmlmaW5kZXg7CisJc2xsLT5zbGxfaGFsZW4gPSAwOworCisJaWYgKGRldi0+aGFyZF9oZWFkZXJfcGFyc2UpCisJCXNsbC0+c2xsX2hhbGVuID0gZGV2LT5oYXJkX2hlYWRlcl9wYXJzZShza2IsIHNsbC0+c2xsX2FkZHIpOworCisJLyogCisJICogV0FOX1BBQ0tFVF9EQVRBIDogRGF0YSB3aGljaCBzaG91bGQgYmUgcGFzc2VkIHVwIHRoZSByZWNlaXZlIHF1ZXVlLgorICAgICAgICAgKiBXQU5fUEFDS0VUX0FTWUMgOiBBc3luY2hyb25vdXMgZGF0YSBsaWtlIHBsYWNlIGNhbGwsIHdoaWNoIHNob3VsZAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICBiZSBwYXNzZWQgdXAgdGhlIGxpc3RlbmluZyBzb2NrLgorICAgICAgICAgKiBXQU5fUEFDS0VUX0VSUiAgOiBBc3luY2hyb25vdXMgZGF0YSBsaWtlIGNsZWFyIGNhbGwgb3IgcmVzdGFydCAKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgd2hpY2ggc2hvdWxkIGdvIGludG8gYW4gZXJyb3IgcXVldWUuCisgICAgICAgICAqLworCXN3aXRjaCAoc2tiLT5wa3RfdHlwZSl7CisKKwkJY2FzZSBXQU5fUEFDS0VUX0RBVEE6CisJCQlpZiAoc29ja19xdWV1ZV9yY3Zfc2tiKHNrLHNrYik8MCl7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBXQU5fUEFDS0VUX0NNRDoKKwkJCXNrLT5za19zdGF0ZSA9IGNoYW4tPnN0YXRlOworCQkJLyogQnVnIGZpeDogdXBkYXRlIE1hcjYuIAorICAgICAgICAgICAgICAgICAgICAgICAgICogRG8gbm90IHNldCB0aGUgc29jayBsY24gbnVtYmVyIGhlcmUsIHNpbmNlCisgICAgICAgICAJCSAqIGNtZCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBleGVjdXRlZCBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGJvYXJkLCB0aHVzIExjbiBjb3VsZCBiZSB3cm9uZyAqLworCQkJc2stPnNrX2RhdGFfcmVhZHkoc2ssIHNrYi0+bGVuKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJYnJlYWs7CisJCWNhc2UgV0FOX1BBQ0tFVF9FUlI6CisJCQlzay0+c2tfc3RhdGUgPSBjaGFuLT5zdGF0ZTsKKwkJCWlmIChzb2NrX3F1ZXVlX2Vycl9za2Ioc2ssc2tiKTwwKXsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fSU5GTyAid2Fuc29jazogQkggSWxsZWdhbCBQYWNrZXQgVHlwZSBEcm9wcGluZ1xuIik7CisJCQlrZnJlZV9za2Ioc2tiKTsgCisJCQlicmVhazsKKwl9CisKKy8vPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/PworLy8JaWYgKHNrLT5za19zdGF0ZSA9PSBXQU5TT0NLX0RJU0NPTk5FQ1RFRCl7CisvLwkJaWYgKHNrLT5za196YXBwZWQpIHsKKy8vCQkJLy9wcmludGsoS0VSTl9JTkZPICJ3YW5zb2NrOiBEaXNjb25uZWN0ZWQsIGtpbGxpbmcgZWFybHlcbiIpOworLy8JCQl3YW5waXBlX3VubGlua19kcml2ZXIoc2spOworLy8JCQlzay0+c2tfYm91bmRfZGV2X2lmID0gMDsKKy8vCQl9CisvLwl9CisKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHdhbnBpcGVfbGlzdGVuX3JjdgorICoKKyAqCVdhbnBpcGUgTElTVEVOIHNvY2tldCBib3R0b20gaGFsZiBoYW5kbGVyLiAgVGhpcyBmdW5jdGlvbgorICogICAgICBpcyBjYWxsZWQgYnkgdGhlIFdBTlBJUEUgZGV2aWNlIGRyaXZlcnMgdG8gcXVldWUgYW4KKyAqICAgICAgaW5jb21pbmcgY2FsbCBpbnRvIHRoZSBzb2NrZXQgbGlzdGVuaW5nIHF1ZXVlLiAKKyAqICAgICAgT25jZSB0aGUgcGFja2V0IGlzIHF1ZXVlZCwgdGhlIHdhaXRpbmcgYWNjZXB0KCkgcHJvY2VzcyAKKyAqICAgICAgaXMgd29rZW4gdXAuCisgKgorICogICAgICBEdXJpbmcgc29ja2V0IGJpbmQsIHRoaXMgZnVuY3Rpb24gaXMgYm91bmRlZCBpbnRvCisgKiAgICAgIFdBTlBJUEUgZHJpdmVyIHByaXZhdGUuIAorICogCisgKiAgICAgIElNUE9SVEFOVCBOT1RFOgorICogICAgICAgICAgVGhlIGFjY2VwdCBjYWxsKCkgaXMgd2FpdGluZyBmb3IgYW4gc2tiIHBhY2tldAorICogICAgICAgICAgd2hpY2ggY29udGFpbnMgYSBwb2ludGVyIHRvIGEgZGV2aWNlIHN0cnVjdHVyZS4KKyAqCisgKiAgICAgICAgICBXaGVuIHdlIGRvIGEgYmluZCB0byBhIGRldmljZSBzdHJ1Y3RyZSwgd2UgCisgKiAgICAgICAgICBiaW5kIGEgbmV3bHkgY3JlYXRlZCBzb2NrZXQgaW50byAiY2hhbi0+c2siLiAgVGh1cywgCisgKiAgICAgICAgICB3aGVuIGFjY2VwdCByZWNlaXZlcyB0aGUgc2tiIHBhY2tldCwgaXQgd2lsbCBrbm93IAorICogICAgICAgICAgZnJvbSB3aGljaCBkZXYgaXQgY2FtZSBmb3JtLCBhbmQgaW4gdHVybiBpdCB3aWxsIGtub3cKKyAqICAgICAgICAgIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXcgc29jay4KKyAqCisgKiAgCU5PVEU6IFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgZnJvbSBkcml2ZXIgSVNSLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgd2FucGlwZV9saXN0ZW5fcmN2IChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAgc3RydWN0IHNvY2sgKnNrKQoreworCXdhbnBpcGVfb3B0ICp3cCA9IHdwX3NrKHNrKSwgKm5ld3dwOworCXN0cnVjdCB3YW5fc29ja2FkZHJfbGwgKnNsbCA9IChzdHJ1Y3Qgd2FuX3NvY2thZGRyX2xsKilza2ItPmNiOworCXN0cnVjdCBzb2NrICpuZXdzazsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OyAKKwlzZGxhX3QgKmNhcmQ7CisJbWJveF9jbWRfdCAqbWJveF9wdHI7CisJd2FucGlwZV9jb21tb25fdCAqY2hhbjsKKworCS8qIEZpbmQgYSBmcmVlIGRldmljZSwgaWYgbm9uZSBmb3VuZCwgYWxsIHN2YydzIGFyZSBidXN5IAorICAgICAgICAgKi8KKworCWNhcmQgPSAoc2RsYV90Kil3cC0+Y2FyZDsKKwlpZiAoIWNhcmQpeworCQlwcmludGsoS0VSTl9JTkZPICJ3YW5zb2NrOiBMSVNURU4gRVJST1IsIE5vIENhcmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJCisJZGV2ID0gd2FucGlwZV9maW5kX2ZyZWVfZGV2KGNhcmQpOworCWlmICghZGV2KXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAid2Fuc29jazogTElTVEVOIEVSUk9SLCBObyBGcmVlIERldmljZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWNoYW49ZGV2LT5wcml2OwkKKwljaGFuLT5zdGF0ZSA9IFdBTlNPQ0tfQ09OTkVDVElORzsKKworCS8qIEFsbG9jYXRlIGEgbmV3IHNvY2ssIHdoaWNoIGFjY2VwdCB3aWxsIGJpbmQKKyAgICAgICAgICogYW5kIHBhc3MgdXAgdG8gdGhlIHVzZXIgCisJICovCisJaWYgKChuZXdzayA9IHdhbnBpcGVfbWFrZV9uZXcoc2spKSA9PSBOVUxMKXsKKwkJcmVsZWFzZV9kZXZpY2UoZGV2KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisKKwkvKiBJbml0aWFsaXplIHRoZSBuZXcgc29jayBzdHJ1Y3R1cmUgCisJICovCisJbmV3c2stPnNrX2JvdW5kX2Rldl9pZiA9IGRldi0+aWZpbmRleDsKKwluZXd3cCA9IHdwX3NrKG5ld3NrKTsKKwluZXd3cC0+Y2FyZCA9IHdwLT5jYXJkOworCisJLyogSW5zZXJ0IHRoZSBzb2NrIGludG8gdGhlIG1haW4gd2FucGlwZQorICAgICAgICAgKiBzb2NrIGxpc3QuCisgICAgICAgICAqLworCWF0b21pY19pbmMoJndhbnBpcGVfc29ja3NfbnIpOworCisJLyogQWxsb2NhdGUgYW5kIGZpbGwgaW4gdGhlIG5ldyBNYWlsIEJveC4gVGhlbgorICAgICAgICAgKiBiaW5kIHRoZSBtYWlsIGJveCB0byB0aGUgc29jay4gSXQgd2lsbCBiZSAKKyAgICAgICAgICogdXNlZCBieSB0aGUgaW9jdGwgY2FsbCB0byByZWFkIGNhbGwgaW5mb3JtYXRpb24KKyAgICAgICAgICogYW5kIHRvIGV4ZWN1dGUgY29tbWFuZHMuIAorICAgICAgICAgKi8JCisJaWYgKChtYm94X3B0ciA9IGttYWxsb2Moc2l6ZW9mKG1ib3hfY21kX3QpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgeworCQl3YW5waXBlX2tpbGxfc29ja19pcnEgKG5ld3NrKTsKKwkJcmVsZWFzZV9kZXZpY2UoZGV2KTsJCQorCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KG1ib3hfcHRyLCAwLCBzaXplb2YobWJveF9jbWRfdCkpOworCW1lbWNweShtYm94X3B0cixza2ItPmRhdGEsc2tiLT5sZW4pOworCisJLyogUmVnaXN0ZXIgdGhlIGxjbiBvbiB3aGljaCBpbmNvbWluZyBjYWxsIGNhbWUKKyAgICAgICAgICogZnJvbS4gVGh1cywgaWYgd2UgaGF2ZSB0byBjbGVhciBpdCwgd2Uga25vdworICAgICAgICAgKiB3aGljaCBsY24gdG8gY2xlYXIKKwkgKi8gCisKKwluZXd3cC0+bGNuID0gbWJveF9wdHItPmNtZC5sY247CisJbmV3d3AtPm1ib3ggPSAodm9pZCAqKW1ib3hfcHRyOworCisJREJHX1BSSU5USyhLRVJOX0lORk8gIk5FV1NPQ0sgOiBEZXZpY2UgJXMsIGJpbmQgdG8gbGNuICVpXG4iLAorCQkJZGV2LT5uYW1lLG1ib3hfcHRyLT5jbWQubGNuKTsKKworCWNoYW4tPmxjbiA9IG1ib3hfcHRyLT5jbWQubGNuOworCWNhcmQtPnUueC5zdmNfdG9fZGV2X21hcFsoY2hhbi0+bGNuJU1BWF9YMjVfTENOKV0gPSBkZXY7CisKKwlzb2NrX3Jlc2V0X2ZsYWcobmV3c2ssIFNPQ0tfWkFQUEVEKTsKKwluZXd3cC0+bnVtID0gaHRvbnMoWDI1X1BST1QpOworCisJaWYgKHdhbnBpcGVfZG9fYmluZChuZXdzaywgZGV2LCBuZXd3cC0+bnVtKSkgeworCQl3YW5waXBlX2tpbGxfc29ja19pcnEgKG5ld3NrKTsKKwkJcmVsZWFzZV9kZXZpY2UoZGV2KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW5ld3NrLT5za19zdGF0ZSA9IFdBTlNPQ0tfQ09OTkVDVElORzsKKworCisJLyogRmlsbCBpbiB0aGUgc3RhbmRhcmQgc29jayBhZGRyZXNzIGluZm8gKi8KKworCXNsbC0+c2xsX2ZhbWlseSA9IEFGX1dBTlBJUEU7CisJc2xsLT5zbGxfaGF0eXBlID0gZGV2LT50eXBlOworCXNsbC0+c2xsX3Byb3RvY29sID0gc2tiLT5wcm90b2NvbDsKKwlzbGwtPnNsbF9wa3R0eXBlID0gc2tiLT5wa3RfdHlwZTsKKwlzbGwtPnNsbF9pZmluZGV4ID0gZGV2LT5pZmluZGV4OworCXNsbC0+c2xsX2hhbGVuID0gMDsKKworCXNrYi0+ZGV2ID0gZGV2OworCXNrLT5za19hY2tfYmFja2xvZysrOworCisJLyogV2UgbXVzdCBkbyB0aGlzIG1hbnVhbGx5LCBzaW5jZSB0aGUgc29ja19xdWV1ZV9yY3Zfc2tiKCkKKwkgKiBmdW5jdGlvbiBzZXRzIHRoZSBza2ItPmRldiB0byBOVUxMLiAgSG93ZXZlciwgd2UgdXNlCisJICogdGhlIGRldiBmaWVsZCBpbiB0aGUgYWNjZXB0IGZ1bmN0aW9uLiovIAorCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpICsgc2tiLT50cnVlc2l6ZSA+PSAKKwkgICAgKHVuc2lnbmVkKXNrLT5za19yY3ZidWYpIHsKKworICAgICAgICAgCXdhbnBpcGVfdW5saW5rX2RyaXZlcihuZXdzayk7CisJCXdhbnBpcGVfa2lsbF9zb2NrX2lycSAobmV3c2spOworCQktLXNrLT5za19hY2tfYmFja2xvZzsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQkKKworCXNrYl9zZXRfb3duZXJfcihza2IsIHNrKTsKKwlza2JfcXVldWVfdGFpbCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJc2stPnNrX2RhdGFfcmVhZHkoc2ssIHNrYi0+bGVuKTsKKwkKKwlyZXR1cm4gMDsKK30KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB3YW5waXBlX21ha2VfbmV3CisgKgorICoJQ3JlYXRlIGEgbmV3IHNvY2ssIGFuZCBhbGxvY2F0ZSBhIHdhbnBpcGUgcHJpdmF0ZQorICogICAgICBzdHJ1Y3R1cmUgdG8gaXQuIEFsc28sIGNvcHkgdGhlIGltcG9ydGFudCBkYXRhCisgKiAgICAgIGZyb20gdGhlIG9yaWdpbmFsIHNvY2sgdG8gdGhlIG5ldyBzb2NrLgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHdhbnBpcGVfbGlzdGVuX3JjdigpIGxpc3RlbgorICogICAgICBib3R0b20gaGFsZiBoYW5kbGVyLiAgQSBjb3B5IG9mIHRoZSBsaXN0ZW5pbmcgc29jaworICogICAgICBpcyBjcmVhdGVkIHVzaW5nIHRoaXMgZnVuY3Rpb24uCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqd2FucGlwZV9tYWtlX25ldyhzdHJ1Y3Qgc29jayAqb3NrKQoreworCXN0cnVjdCBzb2NrICpzazsKKworCWlmIChvc2stPnNrX3R5cGUgIT0gU09DS19SQVcpCisJCXJldHVybiBOVUxMOworCisJaWYgKChzayA9IHdhbnBpcGVfYWxsb2Nfc29ja2V0KCkpID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJc2stPnNrX3R5cGUJPSBvc2stPnNrX3R5cGU7CisJc2stPnNrX3NvY2tldAk9IG9zay0+c2tfc29ja2V0OworCXNrLT5za19wcmlvcml0eQk9IG9zay0+c2tfcHJpb3JpdHk7CisJc2stPnNrX3Byb3RvY29sCT0gb3NrLT5za19wcm90b2NvbDsKKwl3cF9zayhzayktPm51bQk9IHdwX3NrKG9zayktPm51bTsKKwlzay0+c2tfcmN2YnVmCT0gb3NrLT5za19yY3ZidWY7CisJc2stPnNrX3NuZGJ1Zgk9IG9zay0+c2tfc25kYnVmOworCXNrLT5za19zdGF0ZQk9IFdBTlNPQ0tfQ09OTkVDVElORzsKKwlzay0+c2tfc2xlZXAJPSBvc2stPnNrX3NsZWVwOworCisJaWYgKHNvY2tfZmxhZyhvc2ssIFNPQ0tfREJHKSkKKwkJc29ja19zZXRfZmxhZyhzaywgU09DS19EQkcpOworCisJcmV0dXJuIHNrOworfQorCisvKiAKKyAqIEZJWE1FOiB3YW5waXBlX29wdCBoYXMgdG8gaW5jbHVkZSBhIHNvY2sgaW4gaXRzIGRlZmluaXRpb24gYW5kIHN0b3AgdXNpbmcKKyAqIHNrX3Byb3RpbmZvLCBidXQgdGhpcyBjb2RlIGlzIG5vdCBldmVuIGNvbXBpbGFibGUgbm93LCBzbyBsZXRzIGxlYXZlIGl0IGZvcgorICogbGF0ZXIuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcHJvdG8gd2FucGlwZV9wcm90byA9IHsKKwkubmFtZQkgID0gIldBTlBJUEUiLAorCS5vd25lcgkgID0gVEhJU19NT0RVTEUsCisJLm9ial9zaXplID0gc2l6ZW9mKHN0cnVjdCBzb2NrKSwKK307CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB3YW5waXBlX21ha2VfbmV3CisgKgorICoJQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgYSBuZXcgc29jaywgYW5kIHNvY2sKKyAqICAgICAgcHJpdmF0ZSBkYXRhLiAgCisgKgkKKyAqCUluY3JlbWVudCB0aGUgbW9kdWxlIHVzZSBjb3VudC4KKyAqICAgICAgIAkKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHdhbnBpcGVfY3JlYXRlKCkgYW5kIAorICogICAgICB3YW5waXBlX21ha2VfbmV3KCkgZnVuY3Rpb25zLiAKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHN0cnVjdCBzb2NrICp3YW5waXBlX2FsbG9jX3NvY2tldCh2b2lkKQoreworCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3Qgd2FucGlwZV9vcHQgKndhbl9vcHQ7CisKKwlpZiAoKHNrID0gc2tfYWxsb2MoUEZfV0FOUElQRSwgR0ZQX0FUT01JQywgJndhbnBpcGVfcHJvdG8sIDEpKSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICgod2FuX29wdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB3YW5waXBlX29wdCksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCXNrX2ZyZWUoc2spOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KHdhbl9vcHQsIDB4MDAsIHNpemVvZihzdHJ1Y3Qgd2FucGlwZV9vcHQpKTsKKworCXdwX3NrKHNrKSA9IHdhbl9vcHQ7CisKKwkvKiBVc2UgdGltZXIgdG8gc2VuZCBkYXRhIHRvIHRoZSBkcml2ZXIuIFRoaXMgd2lsbCBhY3QKKyAgICAgICAgICogYXMgYSBCSCBoYW5kbGVyIGZvciBzZW5kbXNnIGZ1bmN0aW9ucyAqLworCWluaXRfdGltZXIoJndhbl9vcHQtPnR4X3RpbWVyKTsKKwl3YW5fb3B0LT50eF90aW1lci5kYXRhCSAgID0gKHVuc2lnbmVkIGxvbmcpc2s7CisJd2FuX29wdC0+dHhfdGltZXIuZnVuY3Rpb24gPSB3YW5waXBlX2RlbGF5ZWRfdHJhbnNtaXQ7CisKKwlzb2NrX2luaXRfZGF0YShOVUxMLCBzayk7CisJcmV0dXJuIHNrOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB3YW5waXBlX3NlbmRtc2cKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgYSBzZW5kdG8oKSBzeXN0ZW0gY2FsbCwKKyAqICAgICAgZm9yIEFGX1dBTlBJUEUgc29ja2V0IGZhbWlseS4gCisgKiAgICAgIER1cmluZyBzb2NrZXQgYmluZCgpIHNrLT5za19ib3VuZF9kZXZfaWYgaXMgaW5pdGlhbGl6ZWQKKyAqICAgICAgdG8gYSBjb3JyZWN0IG5ldHdvcmsgZGV2aWNlLiBUaGlzIG51bWJlciBpcyB1c2VkCisgKiAgICAgIHRvIGZpbmQgYSBuZXR3b3JrIGRldmljZSB0byB3aGljaCB0aGUgcGFja2V0IHNob3VsZAorICogICAgICBiZSBwYXNzZWQgdG8uCisgKgorICogICAgICBFYWNoIHBhY2tldCBpcyBxdWV1ZWQgaW50byBzay0+c2tfd3JpdGVfcXVldWUgYW5kIAorICogICAgICBkZWxheWVkIHRyYW5zbWl0IGJvdHRvbSBoYWxmIGhhbmRsZXIgaXMgbWFya2VkIGZvciAKKyAqICAgICAgZXhlY3V0aW9uLgorICoKKyAqICAgICAgQSBzb2NrZXQgbXVzdCBiZSBpbiBXQU5TT0NLX0NPTk5FQ1RFRCBzdGF0ZSBiZWZvcmUKKyAqICAgICAgYSBwYWNrZXQgaXMgcXVldWVkIGludG8gc2stPnNrX3dyaXRlX3F1ZXVlLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgd2FucGlwZV9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCSAgIHN0cnVjdCBtc2doZHIgKm1zZywgaW50IGxlbikKK3sKKwl3YW5waXBlX29wdCAqd3A7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHdhbl9zb2NrYWRkcl9sbCAqc2FkZHI9KHN0cnVjdCB3YW5fc29ja2FkZHJfbGwgKiltc2ctPm1zZ19uYW1lOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBzaG9ydCBwcm90bzsKKwl1bnNpZ25lZCBjaGFyICphZGRyOworCWludCBpZmluZGV4LCBlcnIsIHJlc2VydmUgPSAwOworCisJCisJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKSkKKwkJcmV0dXJuIC1FTkVURE9XTjsKKworCWlmIChzay0+c2tfc3RhdGUgIT0gV0FOU09DS19DT05ORUNURUQpCisJCXJldHVybiAtRU5PVENPTk47CQorCisJaWYgKG1zZy0+bXNnX2ZsYWdzICYgfihNU0dfRE9OVFdBSVR8TVNHX0NNU0dfQ09NUEFUKSkgCisJCXJldHVybigtRUlOVkFMKTsKKworCS8qIGl0IHdhcyA8PSwgbm93IG9uZSBjYW4gc2VuZAorICAgICAgICAgKiB6ZXJvIGxlbmd0aCBwYWNrZXRzICovCisJaWYgKGxlbiA8IHNpemVvZih4MjVhcGlfaGRyX3QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdwID0gd3Bfc2soc2spOworCisJaWYgKHNhZGRyID09IE5VTEwpIHsKKwkJaWZpbmRleAk9IHNrLT5za19ib3VuZF9kZXZfaWY7CisJCXByb3RvCT0gd3AtPm51bTsKKwkJYWRkcgk9IE5VTEw7CisKKwl9ZWxzZXsKKwkJaWYgKG1zZy0+bXNnX25hbWVsZW4gPCBzaXplb2Yoc3RydWN0IHdhbl9zb2NrYWRkcl9sbCkpeyAKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWZpbmRleCA9IHNrLT5za19ib3VuZF9kZXZfaWY7CisJCXByb3RvCT0gc2FkZHItPnNsbF9wcm90b2NvbDsKKwkJYWRkcgk9IHNhZGRyLT5zbGxfYWRkcjsKKwl9CisKKwlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KGlmaW5kZXgpOworCWlmIChkZXYgPT0gTlVMTCl7CisJCXByaW50ayhLRVJOX0lORk8gIndhbnNvY2s6IFNlbmQgZmFpbGVkLCBkZXYgaW5kZXg6ICVpXG4iLGlmaW5kZXgpOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlkZXZfcHV0KGRldik7CisJCisJaWYgKHNvY2stPnR5cGUgPT0gU09DS19SQVcpCisJCXJlc2VydmUgPSBkZXYtPmhhcmRfaGVhZGVyX2xlbjsKKworCWlmIChsZW4gPiBkZXYtPm10dStyZXNlcnZlKXsKKyAgCQlyZXR1cm4gLUVNU0dTSVpFOworCX0KKworCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssIGxlbiArIExMX1JFU0VSVkVEX1NQQUNFKGRldiksCisJCQkJbXNnLT5tc2dfZmxhZ3MgJiBNU0dfRE9OVFdBSVQsICZlcnIpOworCisJaWYgKHNrYj09TlVMTCl7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJCQorCXNrYl9yZXNlcnZlKHNrYiwgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSk7CisJc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisKKwkvKiBSZXR1cm5zIC1FRkFVTFQgb24gZXJyb3IgKi8KKwllcnIgPSBtZW1jcHlfZnJvbWlvdmVjKHNrYl9wdXQoc2tiLGxlbiksIG1zZy0+bXNnX2lvdiwgbGVuKTsKKwlpZiAoZXJyKXsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlpZiAoZGV2LT5oYXJkX2hlYWRlcikgeworCQlpbnQgcmVzOworCQllcnIgPSAtRUlOVkFMOworCQlyZXMgPSBkZXYtPmhhcmRfaGVhZGVyKHNrYiwgZGV2LCBudG9ocyhwcm90byksIGFkZHIsIE5VTEwsIGxlbik7CisJCWlmIChyZXM8MCl7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJfQorCisJc2tiLT5wcm90b2NvbCA9IHByb3RvOworCXNrYi0+ZGV2ID0gZGV2OworCXNrYi0+cHJpb3JpdHkgPSBzay0+c2tfcHJpb3JpdHk7CisJc2tiLT5wa3RfdHlwZSA9IFdBTl9QQUNLRVRfREFUQTsKKworCWVyciA9IC1FTkVURE9XTjsKKwlpZiAoIShkZXYtPmZsYWdzICYgSUZGX1VQKSkKKwkJZ290byBvdXRfZnJlZTsKKworCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpICsgc2tiLT50cnVlc2l6ZSA+CisJICAgICh1bnNpZ25lZCBpbnQpc2stPnNrX3NuZGJ1Zil7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLUVOT0JVRlM7CisJfQorCisJc2tiX3F1ZXVlX3RhaWwoJnNrLT5za193cml0ZV9xdWV1ZSxza2IpOworCWF0b21pY19pbmMoJndwLT5wYWNrZXRfc2VudCk7CisKKwlpZiAoISh0ZXN0X2FuZF9zZXRfYml0KDAsICZ3cC0+dGltZXIpKSkKKwkJbW9kX3RpbWVyKCZ3cC0+dHhfdGltZXIsIGppZmZpZXMgKyAxKTsKKwkKKwlyZXR1cm4obGVuKTsKKworb3V0X2ZyZWU6CisJa2ZyZWVfc2tiKHNrYik7CitvdXRfdW5sb2NrOgorCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB3YW5waXBlX2RlbGF5ZWRfdGFybnNtaXQKKyAqCisgKglUcmFuc21pdCBib3R0b20gaGFsZiBoYW5kbGVyLiBJdCBkZXF1ZXVlcyBwYWNrZXRzCisgKiAgICAgIGZyb20gc2stPnNrX3dyaXRlX3F1ZXVlIGFuZCBwYXNzZXMgdGhlbSB0byB0aGUgCisgKiAgICAgIGRyaXZlci4gIElmIHRoZSBkcml2ZXIgaXMgYnVzeSwgdGhlIHBhY2tldCBpcyAKKyAqICAgICAgcmUtZW5xdWV1ZWQuICAKKyAqCisgKiAgICAgIFBhY2tldCBTZW50IGNvdW50ZXIgaXMgZGVjcmVtZW50ZWQgb24gc3VjY2Vzc2Z1bAorICogICAgICB0cmFuc21pc3Npb24uIAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworc3RhdGljIHZvaWQgd2FucGlwZV9kZWxheWVkX3RyYW5zbWl0ICh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHNvY2sgKnNrPShzdHJ1Y3Qgc29jayAqKWRhdGE7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl3YW5waXBlX29wdCAqd3AgPSB3cF9zayhzayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHdwLT5kZXY7CisJc2RsYV90ICpjYXJkID0gKHNkbGFfdCopd3AtPmNhcmQ7CisKKwlpZiAoIWNhcmQgfHwgIWRldil7CisJCWNsZWFyX2JpdCgwLCAmd3AtPnRpbWVyKTsKKwkJREJHX1BSSU5USyhLRVJOX0lORk8gIndhbnNvY2s6IFRyYW5zbWl0IGRlbGF5LCBubyBkZXYgb3IgY2FyZFxuIik7CisJCXJldHVybjsKKwl9CisJCisJaWYgKHNrLT5za19zdGF0ZSAhPSBXQU5TT0NLX0NPTk5FQ1RFRCB8fCAhc29ja19mbGFnKHNrLCBTT0NLX1pBUFBFRCkpIHsKKwkJY2xlYXJfYml0KDAsICZ3cC0+dGltZXIpOworCQlEQkdfUFJJTlRLKEtFUk5fSU5GTyAid2Fuc29jazogVHggVGltZXIsIFN0YXRlIG5vdCBDT05ORUNURURcbiIpOworCQlyZXR1cm47CisJfQorCQorCS8qIElmIGRyaXZlciBpcyBleGVjdXRpbmcgY29tbWFuZCwgd2UgbXVzdCBvZmZsb2FkCisgICAgICAgICAqIHRoZSBib2FyZCBieSBub3Qgc2VuZGluZyBkYXRhLiBPdGhlcndpc2UgYSAKKyAgICAgICAgICogcGVuZGluZyBjb21tYW5kIHdpbGwgbmV2ZXIgZ2V0IGEgZnJlZSBidWZmZXIKKyAgICAgICAgICogdG8gZXhlY3V0ZSAqLyAJCisJaWYgKGF0b21pY19yZWFkKCZjYXJkLT51LnguY29tbWFuZF9idXN5KSl7CisJCXdwLT50eF90aW1lci5leHBpcmVzID0gamlmZmllcyArIFNMT1dfQkFDS09GRjsKKwkJYWRkX3RpbWVyKCZ3cC0+dHhfdGltZXIpOworCQlEQkdfUFJJTlRLKEtFUk5fSU5GTyAid2Fuc29jazogVHggVGltZXIsIGNvbW1hbmQgYnlzIEJBQ0tPRkZcbiIpOworCQlyZXR1cm47CisJfQorCisJCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwmd2FucGlwZV90eF9jcml0aWNhbCkpeworCQlwcmludGsoS0VSTl9JTkZPICJXYW5Tb2NrOiBUeCB0aW1lciBjcml0aWNhbCAlc1xuIixkZXYtPm5hbWUpOworCQl3cC0+dHhfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBTTE9XX0JBQ0tPRkY7CisJCWFkZF90aW1lcigmd3AtPnR4X3RpbWVyKTsKKwkJcmV0dXJuOworCX0JCisJCisJLyogQ2hlY2sgZm9yIGEgcGFja2V0IGluIHRoZSBmaWZvIGFuZCBzZW5kICovCisJaWYgKChza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3dyaXRlX3F1ZXVlKSkgIT0gTlVMTCl7CisKKwkJaWYgKGRldi0+aGFyZF9zdGFydF94bWl0KHNrYiwgZGV2KSAhPSAwKXsJCQkKKworCQkJLyogRHJpdmVyIGZhaWxlZCB0byB0cmFuc21pdCwgcmUtZW5xdWV1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIHBhY2tldCBhbmQgcmV0cnkgYWdhaW4gbGF0ZXIgKi8KKwkJCXNrYl9xdWV1ZV9oZWFkKCZzay0+c2tfd3JpdGVfcXVldWUsc2tiKTsKKwkJCWNsZWFyX2JpdCgwLCZ3YW5waXBlX3R4X2NyaXRpY2FsKTsKKwkJCXJldHVybjsKKwkJfWVsc2V7CisKKwkJCS8qIFBhY2tldCBTZW50IHN1Y2Nlc3NmdWwuIENoZWNrIGZvciBtb3JlIHBhY2tldHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGlmIG1vcmUgcGFja2V0cywgcmUtdHJpZ2dlciB0aGUgdHJhbnNtaXQgcm91dGluZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIG90aGVyIHdpc2UgZXhpdAorICAgICAgICAgICAgICAgICAgICAgICAgICovCisJCQlhdG9taWNfZGVjKCZ3cC0+cGFja2V0X3NlbnQpOworCisJCQlpZiAoc2tiX3BlZWsoJnNrLT5za193cml0ZV9xdWV1ZSkgPT0gTlVMTCkgeworCQkJCS8qIElmIHRoZXJlIGlzIG5vdGhpbmcgdG8gc2VuZCwga2ljaworCQkJCSAqIHRoZSBwb2xsIHJvdXRpbmUsIHdoaWNoIHdpbGwgdHJpZ2dlcgorCQkJCSAqIHRoZSBhcHBsaWNhdGlvbiB0byBzZW5kIG1vcmUgZGF0YSAqLworCQkJCXNrLT5za19kYXRhX3JlYWR5KHNrLCAwKTsKKwkJCQljbGVhcl9iaXQoMCwgJndwLT50aW1lcik7CisJCQl9ZWxzZXsKKwkJCQkvKiBSZXNjaGVkdWxlIGFzIGZhc3QgYXMgcG9zc2libGUgKi8KKwkJCQl3cC0+dHhfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAxOworCQkJCWFkZF90aW1lcigmd3AtPnR4X3RpbWVyKTsKKwkJCX0KKwkJfQorCX0KKwljbGVhcl9iaXQoMCwmd2FucGlwZV90eF9jcml0aWNhbCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBleGVjdXRlX2NvbW1hbmQgCisgKgorICoJRXhlY3V0ZSB4MjVhcGkgY29tbWFuZHMuICBUaGUgYXRvbWljIHZhcmlhYmxlCisgKiAgICAgIGNoYW4tPmNvbW1hbmQgaXMgdXNlZCB0byBpbmRpY2F0ZSB0byB0aGUgZHJpdmVyIHRoYXQKKyAqICAgICAgY29tbWFuZCBpcyBwZW5kaW5nIGZvciBleGVjdXRpb24uICBUaGUgYWN1dGFsIGNvbW1hbmQKKyAqICAgICAgc3RydWN0dXJlIGlzIHBsYWNlZCBpbnRvIGEgc29jayBtYm94IHN0cnVjdHVyZSAKKyAqICAgICAgKHdwX3NrKHNrKS0+bWJveCkuCisgKgorICogICAgICBUaGUgc29jayBwcml2YXRlIHN0cnVjdHVyZSwgbWJveCBpcworICogICAgICB1c2VkIGFzIHNoYXJlZCBtZW1vcnkgYmV0d2VlbiBzb2NrIGFuZCB0aGUgZHJpdmVyLgorICogICAgICBEcml2ZXIgdXNlcyB0aGUgc29jayBtYm94IHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQKKyAqICAgICAgYW5kIHJldHVybiB0aGUgcmVzdWx0LiAgCisgKgorICogICAgICBGb3IgYWxsIGNvbW1hbmQgZXhjZXB0IFBMQUNFIENBTEwsIHRoZSBmdW5jdGlvbgorICogICAgICB3YWl0cyBmb3IgdGhlIHJlc3VsdC4gIFBMQUNFIENBTEwgY2FuIGJlIGV0aGVyCisgKiAgICAgIGJsb2NraW5nIG9yIG5vbmJsb2NraW5nLiBUaGUgdXNlciBzZXRzIHRoaXMgb3B0aW9uCisgKiAgICAgIHZpYSBpb2N0bCBjYWxsLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworc3RhdGljIGludCBleGVjdXRlX2NvbW1hbmQoc3RydWN0IHNvY2sgKnNrLCAgdW5zaWduZWQgY2hhciBjbWQsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwl3YW5waXBlX29wdCAqd3AgPSB3cF9zayhzayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl3YW5waXBlX2NvbW1vbl90ICpjaGFuPU5VTEw7CisJaW50IGVycj0wOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCQorCWRldiA9IGRldl9nZXRfYnlfaW5kZXgoc2stPnNrX2JvdW5kX2Rldl9pZik7CisJaWYgKGRldiA9PSBOVUxMKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAid2Fuc29jazogRXhlYyBmYWlsZWQgbm8gZGV2ICVpXG4iLAorCQkJc2stPnNrX2JvdW5kX2Rldl9pZik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlkZXZfcHV0KGRldik7CisKKwlpZiAoKGNoYW49ZGV2LT5wcml2KSA9PSBOVUxMKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAid2Fuc29jazogRXhlYyBjbWQgZmFpbGVkIG5vIHByaXYgYXJlYVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChhdG9taWNfcmVhZCgmY2hhbi0+Y29tbWFuZCkpeworCQlwcmludGsoS0VSTl9JTkZPICJ3YW5zb2NrOiBFUlJPUjogQ29tbWFuZCBhbHJlYWR5IHJ1bm5pbmcgJXgsICVzXG4iLAorCQkJYXRvbWljX3JlYWQoJmNoYW4tPmNvbW1hbmQpLGRldi0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghd3AtPm1ib3gpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAid2Fuc29jazogSW4gZXhlY3V0ZSB3aXRob3V0IE1CT1hcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkoKG1ib3hfY21kX3QqKXdwLT5tYm94KS0+Y21kLmNvbW1hbmQgPSBjbWQ7CQorCSgobWJveF9jbWRfdCopd3AtPm1ib3gpLT5jbWQubGNuICAgICA9IHdwLT5sY247CisJKChtYm94X2NtZF90Kil3cC0+bWJveCktPmNtZC5yZXN1bHQgID0gMHg3RjsKKworCisJaWYgKGZsYWdzICYgT19OT05CTE9DSyl7CisJCWNtZCB8PSAweDgwOworCQlhdG9taWNfc2V0KCZjaGFuLT5jb21tYW5kLCBjbWQpOworCX1lbHNleworCQlhdG9taWNfc2V0KCZjaGFuLT5jb21tYW5kLCBjbWQpOworCX0KKworCWFkZF93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwmd2FpdCk7CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJZm9yICg7Oyl7CisJCWlmICgoKG1ib3hfY21kX3QqKXdwLT5tYm94KS0+Y21kLnJlc3VsdCAhPSAweDdGKSB7CisJCQllcnIgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQllcnIgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQlzY2hlZHVsZSgpOworCX0KKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwlyZW1vdmVfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsJndhaXQpOworCQorCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB3YW5waXBlX2Rlc3Ryb3lfdGltZXIgCisgKgorICoJVXNlZCBieSB3YW5waXBlX3JlbGVhc2UsIHRvIGRlbGF5IHJlbGVhc2Ugb2YKKyAqICAgICAgdGhlIHNvY2tldC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCB3YW5waXBlX2Rlc3Ryb3lfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBzb2NrICpzaz0oc3RydWN0IHNvY2sgKilkYXRhOworCXdhbnBpcGVfb3B0ICp3cCA9IHdwX3NrKHNrKTsKKworCWlmICgoIWF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYykgJiYKKwkgICAgICFhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpKSB8fAorCSAgICAoKyt3cC0+Zm9yY2UgPT0gNSkpIHsKKworCQlpZiAoYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKSB8fAorCQkgICAgYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSkKKwkJCXByaW50ayhLRVJOX0lORk8gIndhbnNvY2s6IFdhcm5pbmcsIFBhY2tldCBEaXNjYXJkZWQgZHVlIHRvIHNvY2sgc2h1dGRvd24hXG4iKTsKKworCQlrZnJlZSh3cCk7CisJCXdwX3NrKHNrKSA9IE5VTEw7CisJCQorCQlpZiAoYXRvbWljX3JlYWQoJnNrLT5za19yZWZjbnQpICE9IDEpIHsKKwkJCWF0b21pY19zZXQoJnNrLT5za19yZWZjbnQsIDEpOworCQkJREJHX1BSSU5USyhLRVJOX0lORk8gIndhbnNvY2s6IEVycm9yLCB3cm9uZyByZWZlcmVuY2UgY291bnQ6ICVpICEgOmRlbGF5LlxuIiwKKwkJCQkJYXRvbWljX3JlYWQoJnNrLT5za19yZWZjbnQpKTsKKwkJfQorCQlzb2NrX3B1dChzayk7CisJCWF0b21pY19kZWMoJndhbnBpcGVfc29ja3NfbnIpOworCQlyZXR1cm47CisJfQorCisJc2stPnNrX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgNSAqIEhaOworCWFkZF90aW1lcigmc2stPnNrX3RpbWVyKTsKKwlwcmludGsoS0VSTl9JTkZPICJ3YW5zb2NrOiBwYWNrZXQgc2sgZGVzdHJveSBkZWxheWVkXG4iKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHdhbnBpcGVfdW5saW5rX2RyaXZlcgorICoKKyAqIAlXaGVuIHRoZSBzb2NrZXQgaXMgcmVsZWFzZWQsIHRoaXMgZnVuY3Rpb24gaXMgCisgKiAgICAgIHVzZWQgdG8gcmVtb3ZlIGxpbmtzIHRoYXQgYmluZCB0aGUgc29jayBhbmQgdGhlCisgKiAgICAgIGRyaXZlciB0b2dldGhlci4gIAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCB3YW5waXBlX3VubGlua19kcml2ZXIgKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXdhbnBpcGVfY29tbW9uX3QgKmNoYW49TlVMTDsKKworCXNvY2tfcmVzZXRfZmxhZyhzaywgU09DS19aQVBQRUQpOworCXNrLT5za19zdGF0ZSA9IFdBTlNPQ0tfRElTQ09OTkVDVEVEOworCXdwX3NrKHNrKS0+ZGV2ID0gTlVMTDsKKworCWRldiA9IGRldl9nZXRfYnlfaW5kZXgoc2stPnNrX2JvdW5kX2Rldl9pZik7CisJaWYgKCFkZXYpeworCQlwcmludGsoS0VSTl9JTkZPICJ3YW5zb2NrOiBObyBkZXYgb24gcmVsZWFzZVxuIik7CisJCXJldHVybjsKKwl9CQkJCisJZGV2X3B1dChkZXYpOworCisJaWYgKChjaGFuID0gZGV2LT5wcml2KSA9PSBOVUxMKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAid2Fuc29jazogTm8gUHJpdiBBcmVhIG9uIHJlbGVhc2VcbiIpOworCQlyZXR1cm47CisJfQorCisJc2V0X2JpdCgwLCZjaGFuLT5jb21tb25fY3JpdGljYWwpOworCWNoYW4tPnNrPU5VTEw7CisJY2hhbi0+ZnVuYz1OVUxMOworCWNoYW4tPm1ib3g9TlVMTDsKKwljaGFuLT50eF90aW1lcj1OVUxMOworCWNsZWFyX2JpdCgwLCZjaGFuLT5jb21tb25fY3JpdGljYWwpOworCXJlbGVhc2VfZGV2aWNlKGRldik7CisJCisJcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogd2FucGlwZV9saW5rX2RyaXZlcgorICoKKyAqIAlVcG9uIHN1Y2Nlc3NmdWwgYmluZCgpLCBzb2NrIGlzIGxpbmtlZCB0byBhIGRyaXZlcgorICogICAgICBieSBiaW5kaW5nIGluIHRoZSB3YW5waXBlX3JjdigpIGJvdHRvbSBoYWxmIGhhbmRsZXIKKyAqICAgICAgdG8gdGhlIGRyaXZlciBmdW5jdGlvbiBwb2ludGVyLCBhcyB3ZWxsIGFzIHNvY2sgYW5kCisgKiAgICAgIHNvY2sgbWFpbGJveCBhZGRyZXNzZXMuICBUaGlzIHdheSBkcml2ZXIgY2FuIHBhc3MKKyAqICAgICAgZGF0YSB1cCB0aGUgc29ja2V0LgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHdhbnBpcGVfbGlua19kcml2ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNvY2sgKnNrKQoreworCXdhbnBpcGVfb3B0ICp3cCA9IHdwX3NrKHNrKTsKKwl3YW5waXBlX2NvbW1vbl90ICpjaGFuID0gZGV2LT5wcml2OworCWlmICghY2hhbikKKwkJcmV0dXJuOworCXNldF9iaXQoMCwmY2hhbi0+Y29tbW9uX2NyaXRpY2FsKTsKKwljaGFuLT5zaz1zazsKKwljaGFuLT5mdW5jPXdhbnBpcGVfcmN2OworCWNoYW4tPm1ib3ggPSB3cC0+bWJveDsKKwljaGFuLT50eF90aW1lciA9ICZ3cC0+dHhfdGltZXI7CisJd3AtPmRldiA9IGRldjsKKwlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX1pBUFBFRCk7CisJY2xlYXJfYml0KDAsJmNoYW4tPmNvbW1vbl9jcml0aWNhbCk7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHJlbGVhc2VfZGV2aWNlCisgKgorICogICAJRHVyaW5nIHNvY2sgcmVsZWFzZSwgY2xlYXIgYSBjcml0aWNhbCBiaXQsIHdoaWNoIAorICogICAgICBtYXJrcyB0aGUgZGV2aWNlIGEgYmVpbmcgdGFrZW4uCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCitzdGF0aWMgdm9pZCByZWxlYXNlX2RldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdhbnBpcGVfY29tbW9uX3QgKmNoYW49ZGV2LT5wcml2OworCWNsZWFyX2JpdCgwLCh2b2lkKikmY2hhbi0+cndfYmluZCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB3YW5waXBlX3JlbGVhc2UKKyAqCisgKglDbG9zZSBhIFBBQ0tFVCBzb2NrZXQuIFRoaXMgaXMgZmFpcmx5IHNpbXBsZS4gV2UgCisgKiAgICAgIGltbWVkaWF0ZWx5IGdvIHRvICdjbG9zZWQnIHN0YXRlIGFuZCByZW1vdmUgb3VyIAorICogICAgICBwcm90b2NvbCBlbnRyeSBpbiB0aGUgZGV2aWNlIGxpc3QuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCB3YW5waXBlX3JlbGVhc2Uoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwl3YW5waXBlX29wdCAqd3A7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJCisJaWYgKCFzaykKKwkJcmV0dXJuIDA7CisKKwl3cCA9IHdwX3NrKHNrKTsKKwljaGVja193cml0ZV9xdWV1ZShzayk7CisKKwkvKiBLaWxsIHRoZSB0eCB0aW1lciwgaWYgd2UgZG9uJ3Qga2lsbCBpdCBub3csIHRoZSB0aW1lcgorICAgICAgICAgKiB3aWxsIHJ1biBhZnRlciB3ZSBraWxsIHRoZSBzb2NrLiAgVGltZXIgY29kZSB3aWxsIAorICAgICAgICAgKiB0cnkgdG8gYWNjZXNzIHRoZSBzb2NrIHdoaWNoIGhhcyBiZWVuIGtpbGxlZCBhbmQgY2F1c2UKKyAgICAgICAgICoga2VybmVsIHBhbmljICovCisKKwlkZWxfdGltZXIoJndwLT50eF90aW1lcik7CisKKwkvKgorCSAqCVVuaG9vayBwYWNrZXQgcmVjZWl2ZSBoYW5kbGVyLgorCSAqLworCisJaWYgKHdwLT5udW0gPT0gaHRvbnMoWDI1X1BST1QpICYmCisJICAgIHNrLT5za19zdGF0ZSAhPSBXQU5TT0NLX0RJU0NPTk5FQ1RFRCAmJiBzb2NrX2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2dldF9ieV9pbmRleChzay0+c2tfYm91bmRfZGV2X2lmKTsKKwkJd2FucGlwZV9jb21tb25fdCAqY2hhbjsKKwkJaWYgKGRldil7CisJCQljaGFuPWRldi0+cHJpdjsKKwkJCWF0b21pY19zZXQoJmNoYW4tPmRpc2Nvbm5lY3QsMSk7CisJCQlEQkdfUFJJTlRLKEtFUk5fSU5GTyAid2Fuc29jazogU2VuZGluZyBDbGVhciBJbmRpY2F0aW9uICVpXG4iLAorCQkJCQlzay0+c2tfc3RhdGUpOworCQkJZGV2X3B1dChkZXYpOworCQl9CQorCX0KKworCXNldF9iaXQoMSwmd2FucGlwZV90eF9jcml0aWNhbCk7CisJd3JpdGVfbG9jaygmd2FucGlwZV9za2xpc3RfbG9jayk7CisJc2tfZGVsX25vZGVfaW5pdChzayk7CisJd3JpdGVfdW5sb2NrKCZ3YW5waXBlX3NrbGlzdF9sb2NrKTsKKwljbGVhcl9iaXQoMSwmd2FucGlwZV90eF9jcml0aWNhbCk7CisKKworCQorCXJlbGVhc2VfZHJpdmVyKHNrKTsKKworCQorCS8qCisJICoJTm93IHRoZSBzb2NrZXQgaXMgZGVhZC4gTm8gbW9yZSBpbnB1dCB3aWxsIGFwcGVhci4KKwkgKi8KKworCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOwkvKiBJdCBpcyB1c2VsZXNzLiBKdXN0IGZvciBzYW5pdHkuICovCisKKwlzb2NrLT5zayA9IE5VTEw7CisJc2stPnNrX3NvY2tldCA9IE5VTEw7CisJc29ja19zZXRfZmxhZyhzaywgU09DS19ERUFEKTsKKworCS8qIFB1cmdlIHF1ZXVlcyAqLworCXNrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCXNrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX3dyaXRlX3F1ZXVlKTsKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za19lcnJvcl9xdWV1ZSk7CisKKwlpZiAoYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSB8fAorCSAgICBhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpKSB7CisJCWRlbF90aW1lcigmc2stPnNrX3RpbWVyKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAid2Fuc29jazogS2lsbGluZyBpbiBUaW1lciBSICVpICwgVyAlaVxuIiwKKwkJCWF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYyksCisJCQlhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpKTsKKwkJc2stPnNrX3RpbWVyLmRhdGEJPSAodW5zaWduZWQgbG9uZylzazsKKwkJc2stPnNrX3RpbWVyLmV4cGlyZXMJPSBqaWZmaWVzICsgSFo7CisJCXNrLT5za190aW1lci5mdW5jdGlvbgk9IHdhbnBpcGVfZGVzdHJveV90aW1lcjsKKwkJYWRkX3RpbWVyKCZzay0+c2tfdGltZXIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlrZnJlZSh3cCk7CisJd3Bfc2soc2spID0gTlVMTDsKKworCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3JlZmNudCkgIT0gMSkgeworCQlEQkdfUFJJTlRLKEtFUk5fSU5GTyAid2Fuc29jazogRXJyb3IsIHdyb25nIHJlZmVyZW5jZSBjb3VudDogJWkgITpyZWxlYXNlLlxuIiwKKwkJCQkJYXRvbWljX3JlYWQoJnNrLT5za19yZWZjbnQpKTsKKwkJYXRvbWljX3NldCgmc2stPnNrX3JlZmNudCwgMSk7CisJfQorCXNvY2tfcHV0KHNrKTsKKwlhdG9taWNfZGVjKCZ3YW5waXBlX3NvY2tzX25yKTsKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIGNoZWNrX3dyaXRlX3F1ZXVlCisgKgorICogIAlEdXJpbmcgc29jayBzaHV0ZG93biwgaWYgdGhlIHNvY2sgc3RhdGUgaXMgCisgKiAgICAgIFdBTlNPQ0tfQ09OTkVDVEVEIGFuZCB0aGVyZSBpcyB0cmFuc21pdCBkYXRhIAorICogICAgICBwZW5kaW5nLiBXYWl0IHVudGlsIGRhdGEgaXMgcmVsZWFzZWQgCisgKiAgICAgIGJlZm9yZSBwcm9jZWVkaW5nLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGNoZWNrX3dyaXRlX3F1ZXVlKHN0cnVjdCBzb2NrICpzaykKK3sKKworCWlmIChzay0+c2tfc3RhdGUgIT0gV0FOU09DS19DT05ORUNURUQpCisJCXJldHVybjsKKworCWlmICghYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKSkKKwkJcmV0dXJuOworCisJcHJpbnRrKEtFUk5fSU5GTyAid2Fuc29jazogTUFKT1IgRVJST1IsIERhdGEgbG9zdCBvbiBzb2NrIHJlbGVhc2UgISEhXG4iKTsKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogcmVsZWFzZV9kcml2ZXIKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgc29jayBzaHV0ZG93biwgdG8gCisgKiAgICAgIHJlbGVhc2UgYW55IHJlc291cmNlcyBhbmQgbGlua3MgdGhhdCBiaW5kIHRoZSBzb2NrCisgKiAgICAgIHRvIHRoZSBkcml2ZXIuICBJdCBhbHNvIGNoYW5nZXMgdGhlIHN0YXRlIG9mIHRoZQorICogICAgICBzb2NrIHRvIFdBTlNPQ0tfRElTQ09OTkVDVEVECisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgcmVsZWFzZV9kcml2ZXIoc3RydWN0IHNvY2sgKnNrKQoreworCXdhbnBpcGVfb3B0ICp3cDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiPU5VTEw7CisJc3RydWN0IHNvY2sgKmRlYWRzaz1OVUxMOworCisJaWYgKHNrLT5za19zdGF0ZSA9PSBXQU5TT0NLX0xJU1RFTiB8fAorCSAgICBzay0+c2tfc3RhdGUgPT0gV0FOU09DS19CSU5EX0xJU1RFTikgeworCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpICE9IE5VTEwpIHsKKwkJCWlmICgoZGVhZHNrID0gZ2V0X25ld3NrX2Zyb21fc2tiKHNrYikpKXsKKwkJCQlEQkdfUFJJTlRLIChLRVJOX0lORk8gIndhbnNvY2s6IFJFTEVBU0U6IEZPVU5EIERFQUQgU09DS1xuIik7CisJCQkJc29ja19zZXRfZmxhZyhkZWFkc2ssIFNPQ0tfREVBRCk7CisJCQkJc3RhcnRfY2xlYW51cF90aW1lcihkZWFkc2spOworCQkJfQorCQkJa2ZyZWVfc2tiKHNrYik7CisJCX0KKwkJaWYgKHNvY2tfZmxhZyhzaywgU09DS19aQVBQRUQpKQorCQkJd2FucGlwZV91bmxpbmtfY2FyZChzayk7CisJfWVsc2V7CisJCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKSkKKwkJCXdhbnBpcGVfdW5saW5rX2RyaXZlcihzayk7CisJfQorCXNrLT5za19zdGF0ZQkgICAgPSBXQU5TT0NLX0RJU0NPTk5FQ1RFRDsKKwlzay0+c2tfYm91bmRfZGV2X2lmID0gMDsKKwlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKwl3cCA9IHdwX3NrKHNrKTsKKworCWlmICh3cCAmJiB3cC0+bWJveCkgeworCQlrZnJlZSh3cC0+bWJveCk7CisJCXdwLT5tYm94ID0gTlVMTDsKKwl9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgc3RhcnRfY2xlYW51cF90aW1lcgorICoKKyAqICAJSWYgbmV3IGluY29taW5nIGNhbGwncyBhcmUgcGVuZGluZyBidXQgdGhlIHNvY2tldAorICogICAgICBpcyBiZWluZyByZWxlYXNlZCwgc3RhcnQgdGhlIHRpbWVyIHdoaWNoIHdpbGwgCisgKiAgICAgIGVudm9rZSB0aGUga2lsbCByb3V0aW5lcyBmb3IgcGVuZGluZyBzb2Nrcy4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKK3N0YXRpYyB2b2lkIHN0YXJ0X2NsZWFudXBfdGltZXIgKHN0cnVjdCBzb2NrICpzaykKK3sKKwlkZWxfdGltZXIoJnNrLT5za190aW1lcik7CisJc2stPnNrX3RpbWVyLmRhdGEJPSAodW5zaWduZWQgbG9uZylzazsKKwlzay0+c2tfdGltZXIuZXhwaXJlcwk9IGppZmZpZXMgKyBIWjsKKwlzay0+c2tfdGltZXIuZnVuY3Rpb24JPSB3YW5waXBlX2tpbGxfc29ja190aW1lcjsKKwlhZGRfdGltZXIoJnNrLT5za190aW1lcik7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICB3YW5waXBlX2tpbGxfc29jaworICoKKyAqCVRoaXMgaXMgYSBmdW5jdGlvbiB3aGljaCBwZXJmb3JtcyBhY3R1YWwga2lsbGluZworICogICAgICBvZiB0aGUgc29jay4gIEl0IHJlbGVhc2VzIHNvY2tldCByZXNvdXJjZXMsCisgKiAgICAgIGFuZCB1bmxpbmtzIHRoZSBzb2NrIGZyb20gdGhlIGRyaXZlci4gCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgd2FucGlwZV9raWxsX3NvY2tfdGltZXIgKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKworCXN0cnVjdCBzb2NrICpzayA9IChzdHJ1Y3Qgc29jayAqKWRhdGE7CisJc3RydWN0IHNvY2sgKipza3A7CisKKwlpZiAoIXNrKQorCQlyZXR1cm47CisKKwkvKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQuIFdlIG11c3QgdXNlCisJICogYXBwcm9wcmlhdGUgbG9ja3MgKi8KKwkKKwlpZiAodGVzdF9iaXQoMSwmd2FucGlwZV90eF9jcml0aWNhbCkpeworCQlzay0+c2tfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAxMDsKKwkJYWRkX3RpbWVyKCZzay0+c2tfdGltZXIpOworCQlyZXR1cm47CisJfQorCQorCXdyaXRlX2xvY2soJndhbnBpcGVfc2tsaXN0X2xvY2spOworCXNrX2RlbF9ub2RlX2luaXQoc2spOworCXdyaXRlX3VubG9jaygmd2FucGlwZV9za2xpc3RfbG9jayk7CisKKworCWlmICh3cF9zayhzayktPm51bSA9PSBodG9ucyhYMjVfUFJPVCkgJiYKKwkgICAgc2stPnNrX3N0YXRlICE9IFdBTlNPQ0tfRElTQ09OTkVDVEVEKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KHNrLT5za19ib3VuZF9kZXZfaWYpOworCQl3YW5waXBlX2NvbW1vbl90ICpjaGFuOworCQlpZiAoZGV2KXsKKwkJCWNoYW49ZGV2LT5wcml2OworCQkJYXRvbWljX3NldCgmY2hhbi0+ZGlzY29ubmVjdCwxKTsKKwkJCWRldl9wdXQoZGV2KTsKKwkJfQkKKwl9CisKKwlyZWxlYXNlX2RyaXZlcihzayk7CisKKwlzay0+c2tfc29ja2V0ID0gTlVMTDsKKworCS8qIFB1cmdlIHF1ZXVlcyAqLworCXNrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCXNrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX3dyaXRlX3F1ZXVlKTsKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za19lcnJvcl9xdWV1ZSk7CisJCisJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgfHwKKwkgICAgYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKSkgeworCQlkZWxfdGltZXIoJnNrLT5za190aW1lcik7CisJCXByaW50ayhLRVJOX0lORk8gIndhbnNvY2s6IEtpbGxpbmcgU09DSyBpbiBUaW1lclxuIik7CisJCXNrLT5za190aW1lci5kYXRhCT0gKHVuc2lnbmVkIGxvbmcpc2s7CisJCXNrLT5za190aW1lci5leHBpcmVzCT0gamlmZmllcyArIEhaOworCQlzay0+c2tfdGltZXIuZnVuY3Rpb24JPSB3YW5waXBlX2Rlc3Ryb3lfdGltZXI7CisJCWFkZF90aW1lcigmc2stPnNrX3RpbWVyKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh3cF9zayhzaykpIHsKKwkJa2ZyZWUod3Bfc2soc2spKTsKKwkJd3Bfc2soc2spID0gTlVMTDsKKwl9CisKKwlpZiAoYXRvbWljX3JlYWQoJnNrLT5za19yZWZjbnQpICE9IDEpIHsKKwkJYXRvbWljX3NldCgmc2stPnNrX3JlZmNudCwgMSk7CisJCURCR19QUklOVEsoS0VSTl9JTkZPICJ3YW5zb2NrOiBFcnJvciwgd3JvbmcgcmVmZXJlbmNlIGNvdW50OiAlaSAhIDp0aW1lci5cbiIsCisJCQkJCWF0b21pY19yZWFkKCZzay0+c2tfcmVmY250KSk7CisJfQorCXNvY2tfcHV0KHNrKTsKKwlhdG9taWNfZGVjKCZ3YW5waXBlX3NvY2tzX25yKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHdhbnBpcGVfa2lsbF9zb2NrX2FjY2VwdCAoc3RydWN0IHNvY2sgKnNrKQoreworCisJc3RydWN0IHNvY2sgKipza3A7CisKKwlpZiAoIXNrKQorCQlyZXR1cm47CisKKwkvKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQuIFdlIG11c3QgdXNlCisJICogYXBwcm9wcmlhdGUgbG9ja3MgKi8KKwkKKwl3cml0ZV9sb2NrKCZ3YW5waXBlX3NrbGlzdF9sb2NrKTsKKwlza19kZWxfbm9kZV9pbml0KHNrKTsKKwl3cml0ZV91bmxvY2soJndhbnBpcGVfc2tsaXN0X2xvY2spOworCisJc2stPnNrX3NvY2tldCA9IE5VTEw7CisKKworCWlmICh3cF9zayhzaykpIHsKKwkJa2ZyZWUod3Bfc2soc2spKTsKKwkJd3Bfc2soc2spID0gTlVMTDsKKwl9CisKKwlpZiAoYXRvbWljX3JlYWQoJnNrLT5za19yZWZjbnQpICE9IDEpIHsKKwkJYXRvbWljX3NldCgmc2stPnNrX3JlZmNudCwgMSk7CisJCURCR19QUklOVEsoS0VSTl9JTkZPICJ3YW5zb2NrOiBFcnJvciwgd3JvbmcgcmVmZXJlbmNlIGNvdW50OiAlaSAhIDp0aW1lci5cbiIsCisJCQkJCWF0b21pY19yZWFkKCZzay0+c2tfcmVmY250KSk7CisJfQorCXNvY2tfcHV0KHNrKTsKKwlhdG9taWNfZGVjKCZ3YW5waXBlX3NvY2tzX25yKTsKKwlyZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQgd2FucGlwZV9raWxsX3NvY2tfaXJxIChzdHJ1Y3Qgc29jayAqc2spCit7CisKKwlpZiAoIXNrKQorCQlyZXR1cm47CisKKwlzay0+c2tfc29ja2V0ID0gTlVMTDsKKworCWlmICh3cF9zayhzaykpIHsKKwkJa2ZyZWUod3Bfc2soc2spKTsKKwkJd3Bfc2soc2spID0gTlVMTDsKKwl9CisKKwlpZiAoYXRvbWljX3JlYWQoJnNrLT5za19yZWZjbnQpICE9IDEpIHsKKwkJYXRvbWljX3NldCgmc2stPnNrX3JlZmNudCwgMSk7CisJCURCR19QUklOVEsoS0VSTl9JTkZPICJ3YW5zb2NrOiBFcnJvciwgd3JvbmcgcmVmZXJlbmNlIGNvdW50OiAlaSAhOmxpc3Rlbi5cbiIsCisJCQkJCWF0b21pY19yZWFkKCZzay0+c2tfcmVmY250KSk7CisJfQorCXNvY2tfcHV0KHNrKTsKKwlhdG9taWNfZGVjKCZ3YW5waXBlX3NvY2tzX25yKTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogIHdhbnBpcGVfZG9fYmluZAorICoKKyAqIAlCb3R0b20gaGFsZiBvZiB0aGUgYmluZGluZyBzeXN0ZW0gY2FsbC4KKyAqICAgICAgT25jZSB0aGUgd2FucGlwZV9iaW5kKCkgZnVuY3Rpb24gY2hlY2tzICB0aGUKKyAqICAgICAgbGVnYWxpdHkgb2YgdGhlIGNhbGwsIHRoaXMgZnVuY3Rpb24gYmluZHMgdGhlCisgKiAgICAgIHNvY2sgdG8gdGhlIGRyaXZlci4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHdhbnBpcGVfZG9fYmluZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBpbnQgcHJvdG9jb2wpCit7CisJd2FucGlwZV9vcHQgKndwID0gd3Bfc2soc2spOworCXdhbnBpcGVfY29tbW9uX3QgKmNoYW49TlVMTDsKKwlpbnQgZXJyPTA7CisKKwlpZiAoc29ja19mbGFnKHNrLCBTT0NLX1pBUFBFRCkpIHsKKwkJZXJyID0gLUVBTFJFQURZOworCQlnb3RvIGJpbmRfdW5sb2NrX2V4aXQ7CisJfQorCisJd3AtPm51bSA9IHByb3RvY29sOworCisJaWYgKHByb3RvY29sID09IDApeworCQlyZWxlYXNlX2RldmljZShkZXYpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGJpbmRfdW5sb2NrX2V4aXQ7CisJfQorCisJaWYgKGRldikgeworCQlpZiAoZGV2LT5mbGFncyZJRkZfVVApIHsKKwkJCWNoYW49ZGV2LT5wcml2OworCQkJc2stPnNrX3N0YXRlID0gY2hhbi0+c3RhdGU7CisKKwkJCWlmICh3cC0+bnVtID09IGh0b25zKFgyNV9QUk9UKSAmJiAKKwkJCSAgICBzay0+c2tfc3RhdGUgIT0gV0FOU09DS19ESVNDT05ORUNURUQgJiYgCisJCQkgICAgc2stPnNrX3N0YXRlICE9IFdBTlNPQ0tfQ09OTkVDVElORykgeworCQkJCURCR19QUklOVEsoS0VSTl9JTkZPIAorCQkJCQkid2Fuc29jazogQmluZGluZyB0byBEZXZpY2Ugbm90IERJU0NPTk5FQ1RFRCAlaVxuIiwKKwkJCQkJCXNrLT5za19zdGF0ZSk7CisJCQkJcmVsZWFzZV9kZXZpY2UoZGV2KTsKKwkJCQllcnIgPSAtRUFHQUlOOworCQkJCWdvdG8gYmluZF91bmxvY2tfZXhpdDsKKwkJCX0KKworCQkJd2FucGlwZV9saW5rX2RyaXZlcihkZXYsc2spOworCQkJc2stPnNrX2JvdW5kX2Rldl9pZiA9IGRldi0+aWZpbmRleDsKKworCQkJLyogWDI1IFNwZWNpZmljIG9wdGlvbiAqLworCQkJaWYgKHdwLT5udW0gPT0gaHRvbnMoWDI1X1BST1QpKQorCQkJCXdwX3NrKHNrKS0+c3ZjID0gY2hhbi0+c3ZjOworCisJCX0gZWxzZSB7CisJCQlzay0+c2tfZXJyID0gRU5FVERPV047CisJCQlzay0+c2tfZXJyb3JfcmVwb3J0KHNrKTsKKwkJCXJlbGVhc2VfZGV2aWNlKGRldik7CisJCQllcnIgPSAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJZXJyID0gLUVOT0RFVjsKKwl9CitiaW5kX3VubG9ja19leGl0OgorCS8qIEZJWE1FIHdoZXJlIGlzIHRoaXMgbG9jayAqLworCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICB3YW5waXBlX2JpbmQKKyAqCisgKiAgICAgIEJJTkQoKSBTeXN0ZW0gY2FsbCwgd2hpY2ggaXMgYm91bmQgdG8gdGhlIEFGX1dBTlBJUEUKKyAqICAgICAgb3BlcmF0aW9ucyBzdHJ1Y3R1cmUuICBJdCBjaGVja3MgZm9yIGNvcnJlY3Qgd2FucGlwZQorICogICAgICBjYXJkIG5hbWUsIGFuZCBjcm9zcyByZWZlcmVuY2VzIGludGVyZmFjZSBuYW1lcyB3aXRoCisgKiAgICAgIHRoZSBjYXJkIG5hbWVzLiAgVGh1cywgaW50ZXJmYWNlIG5hbWUgbXVzdCBiZWxvbmcgdG8KKyAqICAgICAgdGhlIGFjdHVhbCBjYXJkLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworc3RhdGljIGludCB3YW5waXBlX2JpbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwgaW50IGFkZHJfbGVuKQoreworCXN0cnVjdCB3YW5fc29ja2FkZHJfbGwgKnNsbCA9IChzdHJ1Y3Qgd2FuX3NvY2thZGRyX2xsKil1YWRkcjsKKwlzdHJ1Y3Qgc29jayAqc2s9c29jay0+c2s7CisJd2FucGlwZV9vcHQgKndwID0gd3Bfc2soc2spOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCXNkbGFfdCAqY2FyZD1OVUxMOworCWNoYXIgbmFtZVsxNV07CisKKwkvKgorCSAqCUNoZWNrIGxlZ2FsaXR5CisJICovCisJIAorCWlmIChhZGRyX2xlbiA8IHNpemVvZihzdHJ1Y3Qgd2FuX3NvY2thZGRyX2xsKSl7CisJCXByaW50ayhLRVJOX0lORk8gIndhbnNvY2s6IEFkZHJlc3MgbGVuZ3RoIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChzbGwtPnNsbF9mYW1pbHkgIT0gQUZfV0FOUElQRSl7CisJCXByaW50ayhLRVJOX0lORk8gIndhbnNvY2s6IElsbGVnYWwgZmFtaWx5IG5hbWUgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNhcmQgPSB3YW5waXBlX2ZpbmRfY2FyZCAoc2xsLT5zbGxfY2FyZCk7CisJaWYgKCFjYXJkKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAid2Fuc29jazogV2FucGlwZSBjYXJkIG5vdCBmb3VuZDogJXNcbiIsc2xsLT5zbGxfY2FyZCk7CisJCXJldHVybiAtRU5PREVWOworCX1lbHNleworCQl3cF9zayhzayktPmNhcmQgPSAodm9pZCAqKWNhcmQ7CisJfQorCisJaWYgKCFzdHJjbXAoc2xsLT5zbGxfZGV2aWNlLCJzdmNfbGlzdGVuIikpeworCisJCS8qIEJpbmQgYSBzb2NrIHRvIGEgY2FyZCBzdHJ1Y3R1cmUgZm9yIGxpc3RlbmluZyAKKwkJICovCQkKKwkJaW50IGVycj0wOyAKKworCQkvKiBUaGlzIGlzIHgyNSBzcGVjaWZpYyBhcmVhIGlmIHByb3RvY29sIGRvZXNuJ3QKKyAgICAgICAgICAgICAgICAgKiBtYXRjaCwgcmV0dXJuIGVycm9yICovCisJCWlmIChzbGwtPnNsbF9wcm90b2NvbCAhPSBodG9ucyhYMjVfUFJPVCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQllcnI9IHdhbnBpcGVfbGlua19jYXJkIChzayk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKworCQlpZiAoc2xsLT5zbGxfcHJvdG9jb2wpCisJCQl3cC0+bnVtID0gc2xsLT5zbGxfcHJvdG9jb2w7CisJCXNrLT5za19zdGF0ZSA9IFdBTlNPQ0tfQklORF9MSVNURU47CisJCXJldHVybiAwOworCisJfWVsc2UgaWYgKCFzdHJjbXAoc2xsLT5zbGxfZGV2aWNlLCJzdmNfY29ubmVjdCIpKXsgCisKKwkJLyogVGhpcyBpcyB4MjUgc3BlY2lmaWMgYXJlYSBpZiBwcm90b2NvbCBkb2Vzbid0CisgICAgICAgICAgICAgICAgICogbWF0Y2gsIHJldHVybiBlcnJvciAqLworCQlpZiAoc2xsLT5zbGxfcHJvdG9jb2wgIT0gaHRvbnMoWDI1X1BST1QpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogRmluZCBhIGZyZWUgZGV2aWNlIAorCQkgKi8KKwkJZGV2ID0gd2FucGlwZV9maW5kX2ZyZWVfZGV2KGNhcmQpOworCQlpZiAoZGV2ID09IE5VTEwpeworCQkJREJHX1BSSU5USyhLRVJOX0lORk8gIndhbnNvY2s6IE5vIGZyZWUgbmV0d29yayBkZXZpY2VzIGZvciBjYXJkICVzXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9ZWxzZXsKKwkJLyogQmluZCBhIHNvY2tldCB0byBhIGludGVyZmFjZSBuYW1lIAorICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgdXNlZCBieSBQVkMgbW9zdGx5CisgICAgICAgICAgICAgICAgICovCisJCXN0cmxjcHkobmFtZSxzbGwtPnNsbF9kZXZpY2Usc2l6ZW9mKG5hbWUpKTsKKwkJZGV2ID0gZGV2X2dldF9ieV9uYW1lKG5hbWUpOworCQlpZiAoZGV2ID09IE5VTEwpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAid2Fuc29jazogRmFpbGVkIHRvIGdldCBEZXYgZnJvbSBuYW1lOiAlcyxcbiIsCisJCQkJCW5hbWUpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlkZXZfcHV0KGRldik7CisKKwkJaWYgKGNoZWNrX2RldihkZXYsIGNhcmQpKXsKKwkJCXByaW50ayhLRVJOX0lORk8gIndhbnNvY2s6IERldmljZSAlcywgZG9lc24ndCBiZWxvbmcgdG8gY2FyZCAlc1xuIiwKKwkJCQlkZXYtPm5hbWUsIGNhcmQtPmRldm5hbWUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKGdldF9hdG9taWNfZGV2aWNlIChkZXYpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHdhbnBpcGVfZG9fYmluZChzaywgZGV2LCBzbGwtPnNsbF9wcm90b2NvbCA/IDogd3AtPm51bSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBnZXRfYXRvbWljX2RldmljZQorICoJCisgKglTZXRzIGEgYml0IGF0b21pY2FsbHkgd2hpY2ggaW5kaWNhdGVzIHRoYXQgCisgKiAgICAgIHRoZSBpbnRlcmZhY2UgaXMgdGFrZW4uIFRoaXMgYXZvaWRzIHJhY2UgY29uZGl0aW9ucy4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9hdG9taWNfZGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd2FucGlwZV9jb21tb25fdCAqY2hhbiA9IGRldi0+cHJpdjsKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoMCwodm9pZCAqKSZjaGFuLT5yd19iaW5kKSl7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIGNoZWNrX2RldgorICoJCisgKiAgCUNoZWNrIHRoYXQgZGV2aWNlIG5hbWUgYmVsb25ncyB0byBhIHBhcnRpY3VsYXIgY2FyZC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGNoZWNrX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzZGxhX3QgKmNhcmQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UqIHRtcF9kZXY7CisKKwlmb3IgKHRtcF9kZXYgPSBjYXJkLT53YW5kZXYuZGV2OyB0bXBfZGV2OworCSAgICAgdG1wX2RldiA9ICooKHN0cnVjdCBuZXRfZGV2aWNlICoqKXRtcF9kZXYtPnByaXYpKSB7CisJCWlmICh0bXBfZGV2LT5pZmluZGV4ID09IGRldi0+aWZpbmRleCl7IAorCQkJcmV0dXJuIDA7CQorCQl9CisJfQorCXJldHVybiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogIHdhbnBpcGVfZmluZF9mcmVlX2RldgorICoJCisgKglGaW5kIGEgZnJlZSBuZXR3b3JrIGludGVyZmFjZS4gSWYgZm91bmQgc2V0IGF0b21pYworICogICAgICBiaXQgaW5kaWNhdGluZyB0aGF0IHRoZSBpbnRlcmZhY2UgaXMgdGFrZW4uCisgKiAgICAgIFgyNUFQSSBTcGVjaWZpYy4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdHJ1Y3QgbmV0X2RldmljZSAqd2FucGlwZV9maW5kX2ZyZWVfZGV2KHNkbGFfdCAqY2FyZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2OworCXZvbGF0aWxlIHdhbnBpcGVfY29tbW9uX3QgKmNoYW47CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCZmaW5kX2ZyZWVfY3JpdGljYWwpKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ1JJVElDQUwgaW4gRmluZCBGcmVlXG4iKTsKKwl9CQorCisJZm9yIChkZXYgPSBjYXJkLT53YW5kZXYuZGV2OyBkZXY7CisJICAgICBkZXYgPSAqKChzdHJ1Y3QgbmV0X2RldmljZSAqKilkZXYtPnByaXYpKSB7CisJCWNoYW4gPSBkZXYtPnByaXY7CisJCWlmICghY2hhbikgCisJCQljb250aW51ZTsKKwkJaWYgKGNoYW4tPnVzZWRieSA9PSBBUEkgJiYgY2hhbi0+c3ZjKXsKKwkJCWlmICghZ2V0X2F0b21pY19kZXZpY2UgKGRldikpeworCQkJCWlmIChjaGFuLT5zdGF0ZSAhPSBXQU5TT0NLX0RJU0NPTk5FQ1RFRCl7CisJCQkJCXJlbGVhc2VfZGV2aWNlKGRldik7CisJCQkJfWVsc2V7CisJCQkJCWNsZWFyX2JpdCgwLCZmaW5kX2ZyZWVfY3JpdGljYWwpOworCQkJCQlyZXR1cm4gZGV2OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwljbGVhcl9iaXQoMCwmZmluZF9mcmVlX2NyaXRpY2FsKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICB3YW5waXBlX2NyZWF0ZQorICoJCisgKiAJU09DS0VUKCkgU3lzdGVtIGNhbGwuICBJdCBhbGxvY2F0ZXMgYSBzb2NrIHN0cnVjdHVyZQorICogICAgICBhbmQgYWRkcyB0aGUgc29ja2V0IHRvIHRoZSB3YW5waXBlX3NrX2xpc3QuIAorICogICAgICBDcmF0ZXMgQUZfV0FOUElQRSBzb2NrZXQuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCB3YW5waXBlX2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgcHJvdG9jb2wpCit7CisJc3RydWN0IHNvY2sgKnNrOworCQorCS8vRklYTUU6IFRoaXMgY2hlY2tzIGZvciByb290IHVzZXIsIFNFQ1VSSVRZID8KKwkvL2lmICghY2FwYWJsZShDQVBfTkVUX1JBVykpCisJLy8JcmV0dXJuIC1FUEVSTTsKKworCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfREdSQU0gJiYgc29jay0+dHlwZSAhPSBTT0NLX1JBVykKKwkJcmV0dXJuIC1FU09DS1ROT1NVUFBPUlQ7CisKKwlzb2NrLT5zdGF0ZSA9IFNTX1VOQ09OTkVDVEVEOworCisJaWYgKChzayA9IHdhbnBpcGVfYWxsb2Nfc29ja2V0KCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PQlVGUzsKKworCXNrLT5za19yZXVzZSA9IDE7CisJc29jay0+b3BzID0gJndhbnBpcGVfb3BzOworCXNvY2tfaW5pdF9kYXRhKHNvY2ssc2spOworCisJc29ja19yZXNldF9mbGFnKHNrLCBTT0NLX1pBUFBFRCk7CisJc2stPnNrX2ZhbWlseQkgICAgPSBQRl9XQU5QSVBFOworCXdwX3NrKHNrKS0+bnVtCSAgICA9IHByb3RvY29sOworCXNrLT5za19zdGF0ZQkgICAgPSBXQU5TT0NLX0RJU0NPTk5FQ1RFRDsKKwlzay0+c2tfYWNrX2JhY2tsb2cgID0gMDsKKwlzay0+c2tfYm91bmRfZGV2X2lmID0gMDsKKworCWF0b21pY19pbmMoJndhbnBpcGVfc29ja3NfbnIpOworCQorCS8qIFdlIG11c3QgZGlzYWJsZSBpbnRlcnJ1cHRzIGJlY2F1c2UgdGhlIElTUgorCSAqIGNhbiBhbHNvIGNoYW5nZSB0aGUgbGlzdCAqLworCXNldF9iaXQoMSwmd2FucGlwZV90eF9jcml0aWNhbCk7CisJd3JpdGVfbG9jaygmd2FucGlwZV9za2xpc3RfbG9jayk7CisJc2tfYWRkX25vZGUoc2ssICZ3YW5waXBlX3NrbGlzdCk7CisJd3JpdGVfdW5sb2NrKCZ3YW5waXBlX3NrbGlzdF9sb2NrKTsKKwljbGVhcl9iaXQoMSwmd2FucGlwZV90eF9jcml0aWNhbCk7CisKKwlyZXR1cm4oMCk7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICB3YW5waXBlX3JlY3Ztc2cKKyAqCQorICoJUHVsbCBhIHBhY2tldCBmcm9tIG91ciByZWNlaXZlIHF1ZXVlIGFuZCBoYW5kIGl0IAorICogICAgICB0byB0aGUgdXNlci4gSWYgbmVjZXNzYXJ5IHdlIGJsb2NrLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgd2FucGlwZV9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCSAgIHN0cnVjdCBtc2doZHIgKm1zZywgaW50IGxlbiwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGNvcGllZCwgZXJyPS1FTk9CVUZTOworCisKKwkvKgorCSAqCUlmIHRoZSBhZGRyZXNzIGxlbmd0aCBmaWVsZCBpcyB0aGVyZSB0byBiZSBmaWxsZWQgaW4sIHdlIGZpbGwKKwkgKglpdCBpbiBub3cuCisJICovCisKKwltc2ctPm1zZ19uYW1lbGVuID0gc2l6ZW9mKHN0cnVjdCB3YW5fc29ja2FkZHJfbGwpOworCisJLyoKKwkgKglDYWxsIHRoZSBnZW5lcmljIGRhdGFncmFtIHJlY2VpdmVyLiBUaGlzIGhhbmRsZXMgYWxsIHNvcnRzCisJICoJb2YgaG9ycmlibGUgcmFjZXMgYW5kIHJlLWVudHJhbmN5IHNvIHdlIGNhbiBmb3JnZXQgYWJvdXQgaXQKKwkgKglpbiB0aGUgcHJvdG9jb2wgbGF5ZXJzLgorCSAqCisJICoJTm93IGl0IHdpbGwgcmV0dXJuIEVORVRET1dOLCBpZiBkZXZpY2UgaGF2ZSBqdXN0IGdvbmUgZG93biwKKwkgKglidXQgdGhlbiBpdCB3aWxsIGJsb2NrLgorCSAqLworCisJaWYgKGZsYWdzICYgTVNHX09PQil7CQorCQlza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX2Vycm9yX3F1ZXVlKTsKKwl9ZWxzZXsKKwkJc2tiPXNrYl9yZWN2X2RhdGFncmFtKHNrLGZsYWdzLDEsJmVycik7CisJfQorCS8qCisJICoJQW4gZXJyb3Igb2NjdXJyZWQgc28gcmV0dXJuIGl0LiBCZWNhdXNlIHNrYl9yZWN2X2RhdGFncmFtKCkgCisJICoJaGFuZGxlcyB0aGUgYmxvY2tpbmcgd2UgZG9uJ3Qgc2VlIGFuZCB3b3JyeSBhYm91dCBibG9ja2luZworCSAqCXJldHJpZXMuCisJICovCisKKwlpZihza2I9PU5VTEwpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKglZb3UgbG9zZSBhbnkgZGF0YSBiZXlvbmQgdGhlIGJ1ZmZlciB5b3UgZ2F2ZS4gSWYgaXQgd29ycmllcyBhCisJICoJdXNlciBwcm9ncmFtIHRoZXkgY2FuIGFzayB0aGUgZGV2aWNlIGZvciBpdHMgTVRVIGFueXdheS4KKwkgKi8KKworCWNvcGllZCA9IHNrYi0+bGVuOworCWlmIChjb3BpZWQgPiBsZW4pCisJeworCQljb3BpZWQ9bGVuOworCQltc2ctPm1zZ19mbGFnc3w9TVNHX1RSVU5DOworCX0KKworCXdhbnBpcGVfd2FrZXVwX2RyaXZlcihzayk7CisKKwkvKiBXZSBjYW4ndCB1c2Ugc2tiX2NvcHlfZGF0YWdyYW0gaGVyZSAqLworCWVyciA9IG1lbWNweV90b2lvdmVjKG1zZy0+bXNnX2lvdiwgc2tiLT5kYXRhLCBjb3BpZWQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZyZWU7CisJCisJc29ja19yZWN2X3RpbWVzdGFtcChtc2csIHNrLCBza2IpOworCQorCWlmIChtc2ctPm1zZ19uYW1lKQorCQltZW1jcHkobXNnLT5tc2dfbmFtZSwgc2tiLT5jYiwgbXNnLT5tc2dfbmFtZWxlbik7CisKKwkvKgorCSAqCUZyZWUgb3IgcmV0dXJuIHRoZSBidWZmZXIgYXMgYXBwcm9wcmlhdGUuIEFnYWluIHRoaXMKKwkgKgloaWRlcyBhbGwgdGhlIHJhY2VzIGFuZCByZS1lbnRyYW5jeSBpc3N1ZXMgZnJvbSB1cy4KKwkgKi8KKwllcnIgPSAoZmxhZ3MmTVNHX1RSVU5DKSA/IHNrYi0+bGVuIDogY29waWVkOworCitvdXRfZnJlZToKKwlza2JfZnJlZV9kYXRhZ3JhbShzaywgc2tiKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgd2FucGlwZV93YWtldXBfZHJpdmVyCisgKgkKKyAqIAlJZiBzb2NrZXQgcmVjZWl2ZSBidWZmZXIgaXMgZnVsbCBhbmQgZHJpdmVyIGNhbm5vdAorICogICAgICBwYXNzIGRhdGEgdXAgdGhlIHNvY2ssIGl0IHNldHMgYSBwYWNrZXRfYmxvY2sgZmxhZy4KKyAqICAgICAgVGhpcyBmdW5jdGlvbiBjaGVjayB0aGF0IGZsYWcgYW5kIGlmIHNvY2sgcmVjZWl2ZSAKKyAqICAgICAgcXVldWUgaGFzIHJvb20gaXQga2lja3MgdGhlIGRyaXZlciBCSCBoYW5kbGVyLiAKKyAqCisgKiAJVGhpcyB3YXksIGRyaXZlciBkb2Vzbid0IGhhdmUgdG8gcG9sbCB0aGUgc29jayAKKyAqICAgICAgcmVjZWl2ZSBxdWV1ZS4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCB3YW5waXBlX3dha2V1cF9kcml2ZXIoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCXdhbnBpcGVfY29tbW9uX3QgKmNoYW49TlVMTDsKKworCWRldiA9IGRldl9nZXRfYnlfaW5kZXgoc2stPnNrX2JvdW5kX2Rldl9pZik7CisJaWYgKCFkZXYpCisJCXJldHVybjsKKworCWRldl9wdXQoZGV2KTsKKworCWlmICgoY2hhbiA9IGRldi0+cHJpdikgPT0gTlVMTCkKKwkJcmV0dXJuOworCQorCWlmIChhdG9taWNfcmVhZCgmY2hhbi0+cmVjZWl2ZV9ibG9jaykpeyAgCisJCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpIDwKKwkJICAgICgodW5zaWduZWQpc2stPnNrX3JjdmJ1ZiAqIDAuOSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIndhbnNvY2s6IFF1ZXVpbmcgdGFzayBmb3Igd2FucGlwZVxuIik7CisJCQlhdG9taWNfc2V0KCZjaGFuLT5yZWNlaXZlX2Jsb2NrLDApOworCQkJd2FucGlwZV9xdWV1ZV90cSgmY2hhbi0+d2FucGlwZV90YXNrKTsKKwkJCXdhbnBpcGVfbWFya19iaCgpOworCQl9CisJfQkKK30JCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgd2FucGlwZV9nZXRuYW1lCisgKgkKKyAqIAlJIGRvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoIHRoaXMgeWV0LiAKKyAqICAgICAgVXNlciBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gZ2V0IHNvY2sgYWRkcmVzcworICogICAgICBpbmZvcm1hdGlvbi4gTm90IHZlcnkgdXNlZnVsIGZvciBTYW5nb21hJ3MgcHVycG9zZXMuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCitzdGF0aWMgaW50IHdhbnBpcGVfZ2V0bmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLAorCQkJICBpbnQgKnVhZGRyX2xlbiwgaW50IHBlZXIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgd2FuX3NvY2thZGRyX2xsICpzbGwgPSAoc3RydWN0IHdhbl9zb2NrYWRkcl9sbCopdWFkZHI7CisKKwlzbGwtPnNsbF9mYW1pbHkgPSBBRl9XQU5QSVBFOworCXNsbC0+c2xsX2lmaW5kZXggPSBzay0+c2tfYm91bmRfZGV2X2lmOworCXNsbC0+c2xsX3Byb3RvY29sID0gd3Bfc2soc2spLT5udW07CisJZGV2ID0gZGV2X2dldF9ieV9pbmRleChzay0+c2tfYm91bmRfZGV2X2lmKTsKKwlpZiAoZGV2KSB7CisJCXNsbC0+c2xsX2hhdHlwZSA9IGRldi0+dHlwZTsKKwkJc2xsLT5zbGxfaGFsZW4gPSBkZXYtPmFkZHJfbGVuOworCQltZW1jcHkoc2xsLT5zbGxfYWRkciwgZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbik7CisJfSBlbHNlIHsKKwkJc2xsLT5zbGxfaGF0eXBlID0gMDsJLyogQmFkOiB3ZSBoYXZlIG5vIEFSUEhSRF9VTlNQRUMgKi8KKwkJc2xsLT5zbGxfaGFsZW4gPSAwOworCX0KKwkqdWFkZHJfbGVuID0gc2l6ZW9mKCpzbGwpOworCQorCWRldl9wdXQoZGV2KTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICB3YW5waXBlX25vdGlmaWVyCisgKgkKKyAqCUlmIGRyaXZlciB0dXJucyBvZmYgbmV0d29yayBpbnRlcmZhY2UsIHRoaXMgZnVuY3Rpb24KKyAqICAgICAgd2lsbCBiZSBlbnZva2VkLiBDdXJyZW50bHkgSSB0cmVhdGUgaXQgYXMgYSAKKyAqICAgICAgY2FsbCBkaXNjb25uZWN0LiBNb3JlIHRob3VnaHQgc2hvdWxkIGdvIGludG8gdGhpcworICogICAgICBmdW5jdGlvbi4KKyAqCisgKiBGSVhNRTogTW9yZSB0aG91Z2h0IHNob3VsZCBnbyBpbnRvIHRoaXMgZnVuY3Rpb24uCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgd2FucGlwZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgbXNnLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzb2NrICpzazsKKwlobGlzdF9ub2RlICpub2RlOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCisJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZ3YW5waXBlX3NrbGlzdCkgeworCQlzdHJ1Y3Qgd2FucGlwZV9vcHQgKnBvID0gd3Bfc2soc2spOworCisJCWlmICghcG8pCisJCQljb250aW51ZTsKKwkJaWYgKGRldiA9PSBOVUxMKQorCQkJY29udGludWU7CisJCQorCQlzd2l0Y2ggKG1zZykgeworCQljYXNlIE5FVERFVl9ET1dOOgorCQljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgorCQkJaWYgKGRldi0+aWZpbmRleCA9PSBzay0+c2tfYm91bmRfZGV2X2lmKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAid2Fuc29jazogRGV2aWNlIGRvd24gJXNcbiIsZGV2LT5uYW1lKTsKKwkJCQlpZiAoc29ja19mbGFnKHNrLCBTT0NLX1pBUFBFRCkpIHsKKwkJCQkJd2FucGlwZV91bmxpbmtfZHJpdmVyKHNrKTsKKwkJCQkJc2stPnNrX2VyciA9IEVORVRET1dOOworCQkJCQlzay0+c2tfZXJyb3JfcmVwb3J0KHNrKTsKKwkJCQl9CisKKwkJCQlpZiAobXNnID09IE5FVERFVl9VTlJFR0lTVEVSKSB7CisJCQkJCXByaW50ayhLRVJOX0lORk8gIndhbnNvY2s6IFVucmVnaXN0ZXJpbmcgRGV2aWNlOiAlc1xuIiwKKwkJCQkJCSAJICBkZXYtPm5hbWUpOworCQkJCQl3YW5waXBlX3VubGlua19kcml2ZXIoc2spOworCQkJCQlzay0+c2tfYm91bmRfZGV2X2lmID0gMDsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBORVRERVZfVVA6CisJCQlpZiAoZGV2LT5pZmluZGV4ID09IHNrLT5za19ib3VuZF9kZXZfaWYgJiYKKwkJCSAgICBwby0+bnVtICYmICFzb2NrX2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKSkgeworCQkJCXByaW50ayhLRVJOX0lORk8gIndhbnNvY2s6IFJlZ2lzdGVyaW5nIERldmljZTogJXNcbiIsCisJCQkJCQlkZXYtPm5hbWUpOworCQkJCXdhbnBpcGVfbGlua19kcml2ZXIoZGV2LHNrKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICB3YW5waXBlX2lvY3RsCisgKgkKKyAqIAlFeGVjdXRlIGEgdXNlciBjb21tYW5kcywgYW5kIHNldCBzb2NrZXQgb3B0aW9ucy4KKyAqCisgKiBGSVhNRTogTW9yZSB0aG91Z2h0IHNob3VsZCBnbyBpbnRvIHRoaXMgZnVuY3Rpb24uCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgd2FucGlwZV9pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlpbnQgZXJyOworCisJc3dpdGNoKGNtZCkgCisJeworCQljYXNlIFNJT0NHU1RBTVA6CisJCQlyZXR1cm4gc29ja19nZXRfdGltZXN0YW1wKHNrLCAoc3RydWN0IHRpbWV2YWwgX191c2VyICopYXJnKTsKKworCQljYXNlIFNJT0NfV0FOUElQRV9DSEVDS19UWDoKKworCQkJcmV0dXJuIGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYyk7CisKKwkJY2FzZSBTSU9DX1dBTlBJUEVfU09DS19TVEFURToKKworCQkJaWYgKHNrLT5za19zdGF0ZSA9PSBXQU5TT0NLX0NPTk5FQ1RFRCkKKwkJCQlyZXR1cm4gMDsKKwkJCQorCQkJcmV0dXJuIDE7CisKKworCQljYXNlIFNJT0NfV0FOUElQRV9HRVRfQ0FMTF9EQVRBOgorCisJCQlyZXR1cm4gZ2V0X2lvY3RsX2NtZCAoc2ssKHZvaWQqKWFyZyk7CisKKwkJY2FzZSBTSU9DX1dBTlBJUEVfU0VUX0NBTExfREFUQToKKworCQkJcmV0dXJuIHNldF9pb2N0bF9jbWQgKHNrLCh2b2lkKilhcmcpOworCisJCWNhc2UgU0lPQ19XQU5QSVBFX0FDQ0VQVF9DQUxMOgorCQljYXNlIFNJT0NfV0FOUElQRV9DTEVBUl9DQUxMOgorCQljYXNlIFNJT0NfV0FOUElQRV9SRVNFVF9DQUxMOgorCisJCQlpZiAoKGVycj1zZXRfaW9jdGxfY21kKHNrLCh2b2lkKilhcmcpKSA8IDApCisJCQkJcmV0dXJuIGVycjsKKworCQkJZXJyPXdhbnBpcGVfZXhlY19jbWQoc2ssY21kLDApOworCQkJZ2V0X2lvY3RsX2NtZChzaywodm9pZCopYXJnKTsKKwkJCXJldHVybiBlcnI7CisKKwkJY2FzZSBTSU9DX1dBTlBJUEVfREVCVUc6CisKKwkJCXJldHVybiB3YW5waXBlX2RlYnVnKHNrLCh2b2lkKilhcmcpOworCQorCQljYXNlIFNJT0NfV0FOUElQRV9TRVRfTk9OQkxPQ0s6CisKKwkJCWlmIChzay0+c2tfc3RhdGUgIT0gV0FOU09DS19ESVNDT05ORUNURUQpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXNvY2stPmZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKwkJCXJldHVybiAwOworCQorI2lmZGVmIENPTkZJR19JTkVUCisJCWNhc2UgU0lPQ0FERFJUOgorCQljYXNlIFNJT0NERUxSVDoKKwkJY2FzZSBTSU9DREFSUDoKKwkJY2FzZSBTSU9DR0FSUDoKKwkJY2FzZSBTSU9DU0FSUDoKKwkJY2FzZSBTSU9DRFJBUlA6CisJCWNhc2UgU0lPQ0dSQVJQOgorCQljYXNlIFNJT0NTUkFSUDoKKwkJY2FzZSBTSU9DR0lGQUREUjoKKwkJY2FzZSBTSU9DU0lGQUREUjoKKwkJY2FzZSBTSU9DR0lGQlJEQUREUjoKKwkJY2FzZSBTSU9DU0lGQlJEQUREUjoKKwkJY2FzZSBTSU9DR0lGTkVUTUFTSzoKKwkJY2FzZSBTSU9DU0lGTkVUTUFTSzoKKwkJY2FzZSBTSU9DR0lGRFNUQUREUjoKKwkJY2FzZSBTSU9DU0lGRFNUQUREUjoKKwkJY2FzZSBTSU9DU0lGRkxBR1M6CisJCQlyZXR1cm4gaW5ldF9kZ3JhbV9vcHMuaW9jdGwoc29jaywgY21kLCBhcmcpOworI2VuZGlmCisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBkZXZfaW9jdGwoY21kLCh2b2lkIF9fdXNlciAqKSBhcmcpOworCX0KKwkvKk5PVFJFQUNIRUQqLworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogIHdhbnBpcGVfZGVidWcKKyAqCQorICoJVGhpcyBmdW5jdGlvbiB3aWxsIHBhc3MgdXAgaW5mb3JtYXRpb24gYWJvdXQgYWxsCisgKiAgICAgIGFjdGl2ZSBzb2NrZXRzLgorICoKKyAqIEZJWE1FOiBNb3JlIHRob3VnaHQgc2hvdWxkIGdvIGludG8gdGhpcyBmdW5jdGlvbi4KKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCB3YW5waXBlX2RlYnVnIChzdHJ1Y3Qgc29jayAqb3JpZ3NrLCB2b2lkICphcmcpCit7CisJc3RydWN0IHNvY2sgKnNrOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCXdhbnBpcGVfY29tbW9uX3QgKmNoYW49TlVMTDsKKwlpbnQgY250PTAsIGVycj0wOworCXdhbl9kZWJ1Z190ICpkYmdfZGF0YSA9ICh3YW5fZGVidWdfdCAqKWFyZzsKKworCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmd2FucGlwZV9za2xpc3QpIHsKKwkJd2FucGlwZV9vcHQgKndwID0gd3Bfc2soc2spOworCisJCWlmIChzayA9PSBvcmlnc2speworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoKGVycj1wdXRfdXNlcigxLCAmZGJnX2RhdGEtPmRlYnVnW2NudF0uZnJlZSkpKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKChlcnIgPSBwdXRfdXNlcihzay0+c2tfc3RhdGUsCisJCQkJICAgICZkYmdfZGF0YS0+ZGVidWdbY250XS5zdGF0ZV9zaykpKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKChlcnIgPSBwdXRfdXNlcihzay0+c2tfcmN2YnVmLAorCQkJCSAgICAmZGJnX2RhdGEtPmRlYnVnW2NudF0ucmN2YnVmKSkpCisJCQlyZXR1cm4gZXJyOworCQlpZiAoKGVyciA9IHB1dF91c2VyKGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYyksCisJCQkJICAgICZkYmdfZGF0YS0+ZGVidWdbY250XS5ybWVtKSkpCisJCQlyZXR1cm4gZXJyOworCQlpZiAoKGVyciA9IHB1dF91c2VyKGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYyksCisJCQkJICAgICZkYmdfZGF0YS0+ZGVidWdbY250XS53bWVtKSkpCisJCQlyZXR1cm4gZXJyOworCQlpZiAoKGVyciA9IHB1dF91c2VyKHNrLT5za19zbmRidWYsCisJCQkJICAgICZkYmdfZGF0YS0+ZGVidWdbY250XS5zbmRidWYpKSkKKwkJCXJldHVybiBlcnI7CisJCWlmICgoZXJyPXB1dF91c2VyKHNrX2NvdW50LCAmZGJnX2RhdGEtPmRlYnVnW2NudF0uc2tfY291bnQpKSkKKwkJCXJldHVybiBlcnI7CisJCWlmICgoZXJyPXB1dF91c2VyKHdwLT5wb2xsX2NudCwgJmRiZ19kYXRhLT5kZWJ1Z1tjbnRdLnBvbGxfY250KSkpCisJCQlyZXR1cm4gZXJyOworCQlpZiAoKGVyciA9IHB1dF91c2VyKHNrLT5za19ib3VuZF9kZXZfaWYsCisJCQkJICAgICZkYmdfZGF0YS0+ZGVidWdbY250XS5ib3VuZCkpKQorCQkJcmV0dXJuIGVycjsKKworCQlpZiAoc2stPnNrX2JvdW5kX2Rldl9pZikgeworCQkJZGV2ID0gZGV2X2dldF9ieV9pbmRleChzay0+c2tfYm91bmRfZGV2X2lmKTsKKwkJCWlmICghZGV2KQkKKwkJCQljb250aW51ZTsKKworCQkJY2hhbj1kZXYtPnByaXY7CisJCQlkZXZfcHV0KGRldik7CisJCisJCQlpZiAoKGVycj1wdXRfdXNlcihjaGFuLT5zdGF0ZSwgJmRiZ19kYXRhLT5kZWJ1Z1tjbnRdLmRfc3RhdGUpKSkKKwkJCQlyZXR1cm4gZXJyOworCQkJaWYgKChlcnI9cHV0X3VzZXIoY2hhbi0+c3ZjLCAmZGJnX2RhdGEtPmRlYnVnW2NudF0uc3ZjKSkpCisJCQkJcmV0dXJuIGVycjsKKworCQkJaWYgKChlcnI9cHV0X3VzZXIoYXRvbWljX3JlYWQoJmNoYW4tPmNvbW1hbmQpLCAKKwkJCQkJCSZkYmdfZGF0YS0+ZGVidWdbY250XS5jb21tYW5kKSkpCisJCQkJcmV0dXJuIGVycjsKKworCisJCQlpZiAod3ApeworCQkJCXNkbGFfdCAqY2FyZCA9IChzZGxhX3QqKXdwLT5jYXJkOwkJCQorCQorCQkJCWlmIChjYXJkKXsKKwkJCQkJaWYgKChlcnI9cHV0X3VzZXIoYXRvbWljX3JlYWQoJmNhcmQtPnUueC5jb21tYW5kX2J1c3kpLCAKKwkJCQkJCQkJJmRiZ19kYXRhLT5kZWJ1Z1tjbnRdLmNtZF9idXN5KSkpCisJCQkJCQlyZXR1cm4gZXJyOworCQkJCX0KKworCQkJCWlmICgoZXJyPXB1dF91c2VyKHdwLT5sY24sIAorCQkJCQkJICAmZGJnX2RhdGEtPmRlYnVnW2NudF0ubGNuKSkpCisJCQkJCXJldHVybiBlcnI7CisJCQkJCisJCQkJaWYgKHdwLT5tYm94KSB7CisJCQkJCWlmICgoZXJyPXB1dF91c2VyKDEsICZkYmdfZGF0YS0+ZGVidWdbY250XS5tYm94KSkpCisJCQkJCQlyZXR1cm4gZXJyOworCQkJCX0KKwkJCX0KKworCQkJaWYgKChlcnI9cHV0X3VzZXIoYXRvbWljX3JlYWQoJmNoYW4tPnJlY2VpdmVfYmxvY2spLCAKKwkJCQkJCQkJJmRiZ19kYXRhLT5kZWJ1Z1tjbnRdLnJibG9jaykpKQorCQkJCXJldHVybiBlcnI7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIoZGJnX2RhdGEtPmRlYnVnW2NudF0ubmFtZSwgZGV2LT5uYW1lLCBzdHJsZW4oZGV2LT5uYW1lKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkKKwkJaWYgKCsrY250ID09IE1BWF9OVU1fREVCVUcpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgZ2V0X2lvY3RsX2NtZAorICoJCisgKglQYXNzIHVwIHRoZSBjb250ZW50cyBvZiBzb2NrZXQgTUJPWCB0byB0aGUgdXNlci4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGdldF9pb2N0bF9jbWQgKHN0cnVjdCBzb2NrICpzaywgdm9pZCAqYXJnKQoreworCXgyNWFwaV90ICp1c3JfZGF0YSA9ICh4MjVhcGlfdCAqKWFyZzsKKwltYm94X2NtZF90ICptYm94X3B0cjsKKwlpbnQgZXJyOworCisJaWYgKHVzcl9kYXRhID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCF3cF9zayhzayktPm1ib3gpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWJveF9wdHIgPSAobWJveF9jbWRfdCAqKXdwX3NrKHNrKS0+bWJveDsKKworCWlmICgoZXJyPXB1dF91c2VyKG1ib3hfcHRyLT5jbWQucWRtLCAmdXNyX2RhdGEtPmhkci5xZG0pKSkKKwkJcmV0dXJuIGVycjsKKwlpZiAoKGVycj1wdXRfdXNlcihtYm94X3B0ci0+Y21kLmNhdXNlLCAmdXNyX2RhdGEtPmhkci5jYXVzZSkpKQorCQlyZXR1cm4gZXJyOworCWlmICgoZXJyPXB1dF91c2VyKG1ib3hfcHRyLT5jbWQuZGlhZ24sICZ1c3JfZGF0YS0+aGRyLmRpYWduKSkpCisJCXJldHVybiBlcnI7CisJaWYgKChlcnI9cHV0X3VzZXIobWJveF9wdHItPmNtZC5sZW5ndGgsICZ1c3JfZGF0YS0+aGRyLmxlbmd0aCkpKQorCQlyZXR1cm4gZXJyOworCWlmICgoZXJyPXB1dF91c2VyKG1ib3hfcHRyLT5jbWQucmVzdWx0LCAmdXNyX2RhdGEtPmhkci5yZXN1bHQpKSkKKwkJcmV0dXJuIGVycjsKKwlpZiAoKGVycj1wdXRfdXNlcihtYm94X3B0ci0+Y21kLmxjbiwgJnVzcl9kYXRhLT5oZHIubGNuKSkpCisJCXJldHVybiBlcnI7CQorCisJaWYgKG1ib3hfcHRyLT5jbWQubGVuZ3RoID4gMCl7CisJCWlmIChtYm94X3B0ci0+Y21kLmxlbmd0aCA+IFgyNV9NQVhfREFUQSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChjb3B5X3RvX3VzZXIodXNyX2RhdGEtPmRhdGEsIG1ib3hfcHRyLT5kYXRhLCBtYm94X3B0ci0+Y21kLmxlbmd0aCkpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAid2Fuc29jazogQ29weSBmYWlsZWQgISEhXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCXJldHVybiAwOworfSAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICBzZXRfaW9jdGxfY21kCisgKgkKKyAqCUJlZm9yZSBjb21tYW5kIGNhbiBiZSBleGVjdXRlLCBzb2NrZXQgTUJPWCBtdXN0CisgKiAgICAgIGJlIGNyZWF0ZWQsIGFuZCBpbml0aWFsaXplZCB3aXRoIHVzZXIgZGF0YS4JCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBzZXRfaW9jdGxfY21kIChzdHJ1Y3Qgc29jayAqc2ssIHZvaWQgKmFyZykKK3sKKwl4MjVhcGlfdCAqdXNyX2RhdGEgPSAoeDI1YXBpX3QgKilhcmc7CisJbWJveF9jbWRfdCAqbWJveF9wdHI7CisJaW50IGVycjsKKworCWlmICghd3Bfc2soc2spLT5tYm94KSB7CisJCXZvaWQgKm1ib3hfcHRyOworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2dldF9ieV9pbmRleChzay0+c2tfYm91bmRfZGV2X2lmKTsKKwkJaWYgKCFkZXYpCisJCQlyZXR1cm4gLUVOT0RFVjsKKworCQlkZXZfcHV0KGRldik7CisJCQorCQlpZiAoKG1ib3hfcHRyID0ga21hbGxvYyhzaXplb2YobWJveF9jbWRfdCksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJbWVtc2V0KG1ib3hfcHRyLCAwLCBzaXplb2YobWJveF9jbWRfdCkpOworCQl3cF9zayhzayktPm1ib3ggPSBtYm94X3B0cjsKKworCQl3YW5waXBlX2xpbmtfZHJpdmVyKGRldixzayk7CisJfQorCisJbWJveF9wdHIgPSAobWJveF9jbWRfdCopd3Bfc2soc2spLT5tYm94OworCW1lbXNldChtYm94X3B0ciwgMCwgc2l6ZW9mKG1ib3hfY21kX3QpKTsKKworCWlmICh1c3JfZGF0YSA9PSBOVUxMKXsKKwkJcmV0dXJuIDA7CisJfQorCWlmICgoZXJyPWdldF91c2VyKG1ib3hfcHRyLT5jbWQucWRtLCAmdXNyX2RhdGEtPmhkci5xZG0pKSkKKwkJcmV0dXJuIGVycjsKKwlpZiAoKGVycj1nZXRfdXNlcihtYm94X3B0ci0+Y21kLmNhdXNlLCAmdXNyX2RhdGEtPmhkci5jYXVzZSkpKQorCQlyZXR1cm4gZXJyOworCWlmICgoZXJyPWdldF91c2VyKG1ib3hfcHRyLT5jbWQuZGlhZ24sICZ1c3JfZGF0YS0+aGRyLmRpYWduKSkpCisJCXJldHVybiBlcnI7CisJaWYgKChlcnI9Z2V0X3VzZXIobWJveF9wdHItPmNtZC5sZW5ndGgsICZ1c3JfZGF0YS0+aGRyLmxlbmd0aCkpKQorCQlyZXR1cm4gZXJyOworCWlmICgoZXJyPWdldF91c2VyKG1ib3hfcHRyLT5jbWQucmVzdWx0LCAmdXNyX2RhdGEtPmhkci5yZXN1bHQpKSkKKwkJcmV0dXJuIGVycjsKKworCWlmIChtYm94X3B0ci0+Y21kLmxlbmd0aCA+IDApeworCQlpZiAobWJveF9wdHItPmNtZC5sZW5ndGggPiBYMjVfTUFYX0RBVEEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIobWJveF9wdHItPmRhdGEsIHVzcl9kYXRhLT5kYXRhLCBtYm94X3B0ci0+Y21kLmxlbmd0aCkpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiQ29weSBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB3YW5waXBlX3BvbGwKKyAqCisgKglEYXRhZ3JhbSBwb2xsOiBBZ2FpbiB0b3RhbGx5IGdlbmVyaWMuIFRoaXMgYWxzbyBoYW5kbGVzCisgKglzZXF1ZW5jZWQgcGFja2V0IHNvY2tldHMgcHJvdmlkaW5nIHRoZSBzb2NrZXQgcmVjZWl2ZSBxdWV1ZQorICoJaXMgb25seSBldmVyIGhvbGRpbmcgZGF0YSByZWFkeSB0byByZWNlaXZlLgorICoKKyAqCU5vdGU6IHdoZW4geW91IF9kb24ndF8gdXNlIHRoaXMgcm91dGluZSBmb3IgdGhpcyBwcm90b2NvbCwKKyAqCWFuZCB5b3UgdXNlIGEgZGlmZmVyZW50IHdyaXRlIHBvbGljeSBmcm9tIHNvY2tfd3JpdGVhYmxlKCkKKyAqCXRoZW4gcGxlYXNlIHN1cHBseSB5b3VyIG93biB3cml0ZV9zcGFjZSBjYWxsYmFjay4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordW5zaWduZWQgaW50IHdhbnBpcGVfcG9sbChzdHJ1Y3QgZmlsZSAqIGZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJdW5zaWduZWQgaW50IG1hc2s7CisKKwkrK3dwX3NrKHNrKS0+cG9sbF9jbnQ7CisKKwlwb2xsX3dhaXQoZmlsZSwgc2stPnNrX3NsZWVwLCB3YWl0KTsKKwltYXNrID0gMDsKKworCS8qIGV4Y2VwdGlvbmFsIGV2ZW50cz8gKi8KKwlpZiAoc2stPnNrX2VyciB8fCAhc2tiX3F1ZXVlX2VtcHR5KCZzay0+c2tfZXJyb3JfcXVldWUpKSB7CisJCW1hc2sgfD0gUE9MTFBSSTsKKwkJcmV0dXJuIG1hc2s7CisJfQorCWlmIChzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pCisJCW1hc2sgfD0gUE9MTEhVUDsKKworCS8qIHJlYWRhYmxlPyAqLworCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpIHsKKwkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCX0KKworCS8qIGNvbm5lY3Rpb24gaGFzbid0IHN0YXJ0ZWQgeWV0ICovCisJaWYgKHNrLT5za19zdGF0ZSA9PSBXQU5TT0NLX0NPTk5FQ1RJTkcpIHsKKwkJcmV0dXJuIG1hc2s7CisJfQorCisJaWYgKHNrLT5za19zdGF0ZSA9PSBXQU5TT0NLX0RJU0NPTk5FQ1RFRCkgeworCQltYXNrID0gUE9MTFBSSTsKKwkJcmV0dXJuIG1hc2s7CisJfQorCisJLyogVGhpcyBjaGVjayBibG9ja3MgdGhlIHVzZXIgcHJvY2VzcyBpZiB0aGVyZSBpcyAgIAorCSAqIGEgcGFja2V0IGFscmVhZHkgcXVldWVkIGluIHRoZSBzb2NrZXQgd3JpdGUgcXVldWUuCisgICAgICAgICAqIFRoaXMgb3B0aW9uIGlzIG9ubHkgZm9yIFgyNUFQSSBwcm90b2NvbCwgZm9yIG90aGVyCisgICAgICAgICAqIHByb3RvY29sIGxpa2UgY2hkbGMgZW5hYmxlIHN0cmVhbWluZyBtb2RlLCAKKyAgICAgICAgICogd2hlcmUgbXVsdGlwbGUgcGFja2V0cyBjYW4gYmUgcGVuZGluZyBpbiB0aGUgc29ja2V0IAorICAgICAgICAgKiB0cmFuc21pdCBxdWV1ZSAqLworCisJaWYgKHdwX3NrKHNrKS0+bnVtID09IGh0b25zKFgyNV9QUk9UKSkgeworCQlpZiAoYXRvbWljX3JlYWQoJndwX3NrKHNrKS0+cGFja2V0X3NlbnQpKQorCQkJcmV0dXJuIG1hc2s7CisJfQorCisJLyogd3JpdGFibGU/ICovCisJaWYgKHNvY2tfd3JpdGVhYmxlKHNrKSl7CisJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk0gfCBQT0xMV1JCQU5EOworCX1lbHNleworCQlzZXRfYml0KFNPQ0tfQVNZTkNfTk9TUEFDRSwgJnNrLT5za19zb2NrZXQtPmZsYWdzKTsKKwl9CisJCQorCXJldHVybiBtYXNrOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHdhbnBpcGVfbGlzdGVuCisgKgorICoJWDI1QVBJIFNwZWNpZmljIGZ1bmN0aW9uLiBTZXQgYSBzb2NrZXQgaW50byBMSVNURU5JTkcgIE1PREUuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworc3RhdGljIGludCB3YW5waXBlX2xpc3RlbihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgYmFja2xvZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKworIAkvKiBUaGlzIGlzIHgyNSBzcGVjaWZpYyBhcmVhIGlmIHByb3RvY29sIGRvZXNuJ3QKKyAgICAgICAgICogbWF0Y2gsIHJldHVybiBlcnJvciAqLworCWlmICh3cF9zayhzayktPm51bSAhPSBodG9ucyhYMjVfUFJPVCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHNrLT5za19zdGF0ZSA9PSBXQU5TT0NLX0JJTkRfTElTVEVOKSB7CisKKwkJc2stPnNrX21heF9hY2tfYmFja2xvZyA9IGJhY2tsb2c7CisJCXNrLT5za19zdGF0ZSAgICAgICAgICAgPSBXQU5TT0NLX0xJU1RFTjsKKwkJcmV0dXJuIDA7CisJfWVsc2V7CisJCXByaW50ayhLRVJOX0lORk8gIndhbnNvY2s6IExpc3RlbmluZyBzb2NrIHdhcyBub3QgYmluZGVkXG4iKTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB3YW5waXBlX2xpbmtfY2FyZAorICoKKyAqCUNvbm5lY3RzIHRoZSBsaXN0ZW5pbmcgc29ja2V0IHRvIHRoZSBkcml2ZXIKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCB3YW5waXBlX2xpbmtfY2FyZCAoc3RydWN0IHNvY2sgKnNrKQoreworCXNkbGFfdCAqY2FyZCA9IChzZGxhX3QqKXdwX3NrKHNrKS0+Y2FyZDsKKworCWlmICghY2FyZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoKGNhcmQtPnNrICE9IE5VTEwpIHx8IChjYXJkLT5mdW5jICE9IE5VTEwpKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAid2Fuc29jazogTGlzdGVuaW5nIHF1ZXVlIGlzIGFscmVhZHkgZXN0YWJsaXNoZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljYXJkLT5zaz1zazsKKwljYXJkLT5mdW5jPXdhbnBpcGVfbGlzdGVuX3JjdjsKKwlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX1pBUFBFRCk7CisgCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogd2FucGlwZV9saXN0ZW4KKyAqCisgKglYMjVBUEkgU3BlY2lmaWMgZnVuY3Rpb24uIERpc2Nvbm5lY3QgbGlzdGVuaW5nIHNvY2tldCBmcm9tCisgKiAgICAgIHRoZSBkcml2ZXIuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHdhbnBpcGVfdW5saW5rX2NhcmQgKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzZGxhX3QgKmNhcmQgPSAoc2RsYV90Kil3cF9zayhzayktPmNhcmQ7IAorCisJaWYgKGNhcmQpeworCQljYXJkLT5zaz1OVUxMOworCQljYXJkLT5mdW5jPU5VTEw7CisJfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHdhbnBpcGVfZXhlY19jbWQKKyAqCisgKglJb2N0bCBmdW5jdGlvbiBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgdXNlciBjb21tYW5kLgorICogICAgICBDb25uZWN0KCkgc3l0ZW0gY2FsbCBhbHNvIGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gZXhlY3V0ZQorICogICAgICBwbGFjZSBjYWxsLiAgVGhpcyBmdW5jdGlvbiBibG9ja3MgdW50aWwgY29tbWFuZCBpcyBleGVjdXRlZC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCB3YW5waXBlX2V4ZWNfY21kKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCWludCBlcnIgPSAtRUlOVkFMOworCXdhbnBpcGVfb3B0ICp3cCA9IHdwX3NrKHNrKTsKKwltYm94X2NtZF90ICptYm94X3B0ciA9IChtYm94X2NtZF90Kil3cC0+bWJveDsKKworCWlmICghbWJveF9wdHIpeworCQlwcmludGsoS0VSTl9JTkZPICJOTyBNQk9YIFBUUiAhISEhIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkKKwkvKiBUaGlzIGlzIHgyNSBzcGVjaWZpYyBhcmVhIGlmIHByb3RvY29sIGRvZXNuJ3QKKyAgICAgICAgICogbWF0Y2gsIHJldHVybiBlcnJvciAqLworCWlmICh3cC0+bnVtICE9IGh0b25zKFgyNV9QUk9UKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKworCXN3aXRjaCAoY21kKXsKKworCQljYXNlIFNJT0NfV0FOUElQRV9BQ0NFUFRfQ0FMTDoKKworCQkJaWYgKHNrLT5za19zdGF0ZSAhPSBXQU5TT0NLX0NPTk5FQ1RJTkcpIHsKKwkJCQllcnIgPSAtRUhPU1RET1dOOworCQkJCWJyZWFrOworCQkJfQorCQkJCisJCQllcnIgPSBleGVjdXRlX2NvbW1hbmQoc2ssWDI1X0FDQ0VQVF9DQUxMLDApOworCQkJaWYgKGVyciA8IDApCisJCQkJYnJlYWs7CisKKwkJCS8qIFVwZGF0ZS4gTWFyNiAyMDAwLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIERvIG5vdCBzZXQgdGhlIHNvY2sgbGNuIG51bWJlciBoZXJlLCBzaW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICogaXQgaXMgZG9uZSBpbiB3YW5waXBlX2xpc3Rlbl9yY3YoKS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8gCisJCSAJaWYgKHNrLT5za19zdGF0ZSA9PSBXQU5TT0NLX0NPTk5FQ1RFRCkgeworCQkJCXdwLT5sY24gPSAoKG1ib3hfY21kX3QqKXdwLT5tYm94KS0+Y21kLmxjbjsJCisJCQkJREJHX1BSSU5USyhLRVJOX0lORk8gIlxud2Fuc29jazogQWNjZXB0IE9LICVpXG4iLAorCQkJCQl3cC0+bGNuKTsKKwkJCQllcnIgPSAwOworCisJCQl9ZWxzZXsKKwkJCQlEQkdfUFJJTlRLIChLRVJOX0lORk8gIlxud2Fuc29jazogQWNjZXB0IEZhaWxlZCAlaVxuIiwKKwkJCQkJd3AtPmxjbik7CisJCQkJd3AtPmxjbiA9IDA7CisJCQkJZXJyID0gLUVDT05OUkVGVVNFRDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU0lPQ19XQU5QSVBFX0NMRUFSX0NBTEw6CisKKwkJCWlmIChzay0+c2tfc3RhdGUgPT0gV0FOU09DS19ESVNDT05ORUNURUQpIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCisKKwkJCS8qIENoZWNrIGlmIGRhdGEgYnVmZmVycyBhcmUgcGVuZGluZyBmb3IgdHJhbnNtaXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICogaWYgc28sIGNoZWNrIHdoZXRoZXIgdXNlciB3YW50cyB0byB3YWl0IHVudGlsIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGlzIHRyYW5zbWl0dGVkLCBvciBjbGVhciBhIGNhbGwgYW5kIGRyb3AgcGFja2V0cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpIHx8CisJCQkgICAgY2hlY2tfZHJpdmVyX2J1c3koc2spKSB7CisJCQkgIAltYm94X2NtZF90ICptYm94ID0gd3AtPm1ib3g7CisJCQkJaWYgKG1ib3gtPmNtZC5xZG0gJiAweDgwKXsKKwkJCQkJbWJveC0+Y21kLnJlc3VsdCA9IDB4MzU7CisJCQkJCWVyciA9IC1FQUdBSU47CQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCXNrLT5za19zdGF0ZSA9IFdBTlNPQ0tfRElTQ09OTkVDVElORzsKKworCQkJZXJyID0gZXhlY3V0ZV9jb21tYW5kKHNrLFgyNV9DTEVBUl9DQUxMLDApOworCQkJaWYgKGVyciA8IDApCisJCQkJYnJlYWs7CisKKwkJCWVyciA9IC1FQ09OTlJFRlVTRUQ7CisJCQlpZiAoc2stPnNrX3N0YXRlID09IFdBTlNPQ0tfRElTQ09OTkVDVEVEKSB7CisJCQkJREJHX1BSSU5USyhLRVJOX0lORk8gIlxud2Fuc29jazogQ0xFQVIgT0sgJWlcbiIsCisJCQkJCSAgIHdwLT5sY24pOworCQkJCXdwLT5sY24gPSAwOworCQkJCWVyciA9IDA7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNJT0NfV0FOUElQRV9SRVNFVF9DQUxMOgorCisJCQlpZiAoc2stPnNrX3N0YXRlICE9IFdBTlNPQ0tfQ09OTkVDVEVEKSB7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKworCisJCQkvKiBDaGVjayBpZiBkYXRhIGJ1ZmZlcnMgYXJlIHBlbmRpbmcgZm9yIHRyYW5zbWlzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGlmIHNvLCBjaGVjayB3aGV0aGVyIHVzZXIgd2FudHMgdG8gd2FpdCB1bnRpbCBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBpcyB0cmFuc21pdHRlZCwgb3IgcmVzZXQgYSBjYWxsIGFuZCBkcm9wIHBhY2tldHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlpZiAoYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKSB8fAorCQkJICAgIGNoZWNrX2RyaXZlcl9idXN5KHNrKSkgeworCQkJICAJbWJveF9jbWRfdCAqbWJveCA9IHdwLT5tYm94OworCQkJCWlmIChtYm94LT5jbWQucWRtICYgMHg4MCl7CisJCQkJCW1ib3gtPmNtZC5yZXN1bHQgPSAweDM1OworCQkJCQllcnIgPSAtRUFHQUlOOwkKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisKKwkJCWVyciA9IGV4ZWN1dGVfY29tbWFuZChzaywgWDI1X1JFU0VULDApOworCQkJaWYgKGVyciA8IDApCisJCQkJYnJlYWs7CisKKwkJCWVyciA9IG1ib3hfcHRyLT5jbWQucmVzdWx0OworCQkJYnJlYWs7CisKKworCQljYXNlIFgyNV9QTEFDRV9DQUxMOgorCisJCQllcnI9ZXhlY3V0ZV9jb21tYW5kKHNrLFgyNV9QTEFDRV9DQUxMLGZsYWdzKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCWJyZWFrOworCisJCQlpZiAoc2stPnNrX3N0YXRlID09IFdBTlNPQ0tfQ09OTkVDVEVEKSB7CisKKwkJCQl3cC0+bGNuID0gKChtYm94X2NtZF90Kil3cC0+bWJveCktPmNtZC5sY247CQorCisJCQkJREJHX1BSSU5USyhLRVJOX0lORk8gIlxud2Fuc29jazogUExBQ0UgQ0FMTCBPSyAlaVxuIiwKKwkJCQkJd3AtPmxjbik7CisJCQkJZXJyID0gMDsKKworCQkJfSBlbHNlIGlmIChzay0+c2tfc3RhdGUgPT0gV0FOU09DS19DT05ORUNUSU5HICYmCisJCQkJICAgKGZsYWdzICYgT19OT05CTE9DSykpIHsKKwkJCQl3cC0+bGNuID0gKChtYm94X2NtZF90Kil3cC0+bWJveCktPmNtZC5sY247CisJCQkJREJHX1BSSU5USyhLRVJOX0lORk8gIlxud2Fuc29jazogUGxhY2UgQ2FsbCBPSzogV2FpdGluZyAlaVxuIiwKKwkJCQkJd3AtPmxjbik7CisKKwkJCQllcnIgPSAwOworCisJCQl9ZWxzZXsKKwkJCQlEQkdfUFJJTlRLKEtFUk5fSU5GTyAiXG53YW5zb2NrOiBQbGFjZSBjYWxsIEZhaWxlZFxuIik7CisJCQkJZXJyID0gLUVDT05OUkVGVVNFRDsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDogCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGNoZWNrX2RyaXZlcl9idXN5IChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9nZXRfYnlfaW5kZXgoc2stPnNrX2JvdW5kX2Rldl9pZik7CisJd2FucGlwZV9jb21tb25fdCAqY2hhbjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gMDsKKworCWRldl9wdXQoZGV2KTsKKworCWlmICgoY2hhbj1kZXYtPnByaXYpID09IE5VTEwpCisJCXJldHVybiAwOworCisJcmV0dXJuIGF0b21pY19yZWFkKCZjaGFuLT5kcml2ZXJfYnVzeSk7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB3YW5waXBlX2FjY2VwdAorICoKKyAqCUFDQ0VQVCgpIFN5c3RlbSBjYWxsLglYMjVBUEkgU3BlY2lmaWMgZnVuY3Rpb24uIAorICoJRm9yIGVhY2ggaW5jb21pbmcgY2FsbCwgY3JlYXRlIGEgbmV3IHNvY2tldCBhbmQgCisgKiAgICAgIHJldHVybiBpdCB0byB0aGUgdXNlci4JCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgd2FucGlwZV9hY2NlcHQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2tldCAqbmV3c29jaywgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3Qgc29jayAqbmV3c2s7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlpbnQgZXJyPTA7CisKKwlpZiAobmV3c29jay0+c2sgIT0gTlVMTCl7CisJCXdhbnBpcGVfa2lsbF9zb2NrX2FjY2VwdChuZXdzb2NrLT5zayk7CQorCQluZXdzb2NrLT5zaz1OVUxMOworCX0KKwkKKwlpZiAoKHNrID0gc29jay0+c2spID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHNrLT5za190eXBlICE9IFNPQ0tfUkFXKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IFdBTlNPQ0tfTElTVEVOKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh3cF9zayhzayktPm51bSAhPSBodG9ucyhYMjVfUFJPVCkpCisJCXJldHVybiAtRUlOVkFMOworCisJYWRkX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCZ3YWl0KTsKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwlmb3IgKDs7KXsKKwkJc2tiID0gc2tiX2RlcXVldWUoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwkJaWYgKHNrYil7CisJCQllcnI9MDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJZXJyID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwkJc2NoZWR1bGUoKTsKKwl9CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCZ3YWl0KTsKKwkKKwlpZiAoZXJyICE9IDApCisJCXJldHVybiBlcnI7CisJCisJbmV3c2sgPSBnZXRfbmV3c2tfZnJvbV9za2Ioc2tiKTsKKwlpZiAoIW5ld3NrKXsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2V0X2JpdCgxLCZ3YW5waXBlX3R4X2NyaXRpY2FsKTsKKwl3cml0ZV9sb2NrKCZ3YW5waXBlX3NrbGlzdF9sb2NrKTsKKwlza19hZGRfbm9kZShuZXdzaywgJndhbnBpcGVfc2tsaXN0KTsKKwl3cml0ZV91bmxvY2soJndhbnBpcGVfc2tsaXN0X2xvY2spOworCWNsZWFyX2JpdCgxLCZ3YW5waXBlX3R4X2NyaXRpY2FsKTsKKworCW5ld3NrLT5za19zb2NrZXQgPSBuZXdzb2NrOworCW5ld3NrLT5za19zbGVlcCA9ICZuZXdzb2NrLT53YWl0OworCisJLyogTm93IGF0dGFjaCB1cCB0aGUgbmV3IHNvY2tldCAqLworCXNrLT5za19hY2tfYmFja2xvZy0tOworCW5ld3NvY2stPnNrID0gbmV3c2s7CisJCisJa2ZyZWVfc2tiKHNrYik7CisKKwlEQkdfUFJJTlRLKEtFUk5fSU5GTyAiXG53YW5zb2NrOiBBQ0NFUFQgR290IExDTiAlaVxuIiwKKwkJICAgd3Bfc2sobmV3c2spLT5sY24pOworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICBnZXRfbmV3c2tfZnJvbV9za2IKKyAqCisgKglBY2NlcHQoKSB1c2VzIHRoaXMgZnVuY3Rpb24gdG8gZ2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBuZXcKKyAqICAgICAgc29ja2V0IHN0cnVjdHVyZS4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RydWN0IHNvY2sgKiBnZXRfbmV3c2tfZnJvbV9za2IgKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OworCXdhbnBpcGVfY29tbW9uX3QgKmNoYW47CQorCisJaWYgKCFkZXYpeworCQlyZXR1cm4gTlVMTDsKKwl9CisJCQorCWlmICgoY2hhbiA9IGRldi0+cHJpdikgPT0gTlVMTCl7CisJCXJldHVybiBOVUxMOworCX0KKwkJCisJaWYgKCFjaGFuLT5zayl7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gKHN0cnVjdCBzb2NrICopY2hhbi0+c2s7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogIHdhbnBpcGVfY29ubmVjdAorICoKKyAqICAJQ09OTkVDVCgpIFN5c3RlbSBDYWxsLiBYMjVBUEkgc3BlY2lmaWMgZnVuY3Rpb24KKyAqIAlDaGVjayB0aGUgc3RhdGUgb2YgdGhlIHNvY2ssIGFuZCBleGVjdXRlIFBMQUNFX0NBTEwgY29tbWFuZC4KKyAqICAgICAgQ29ubmVjdCBjYW4gZXRoZXIgYmxvY2sgb3IgcmV0dXJuIHdpdGhvdXQgd2FpdGluZyBmb3IgY29ubmVjdGlvbiwgCisgKiAgICAgIGlmIHNwZWNpZmllZCBieSB1c2VyLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHdhbnBpcGVfY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLCBpbnQgYWRkcl9sZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgd2FuX3NvY2thZGRyX2xsICphZGRyID0gKHN0cnVjdCB3YW5fc29ja2FkZHJfbGwqKXVhZGRyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGVycjsKKworCWlmICh3cF9zayhzayktPm51bSAhPSBodG9ucyhYMjVfUFJPVCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHNrLT5za19zdGF0ZSA9PSBXQU5TT0NLX0NPTk5FQ1RFRCkKKwkJcmV0dXJuIC1FSVNDT05OOwkvKiBObyByZWNvbm5lY3Qgb24gYSBzZXFwYWNrZXQgc29ja2V0ICovCisKKwlpZiAoc2stPnNrX3N0YXRlICE9IFdBTl9ESVNDT05ORUNURUQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAid2Fuc29jazogVHJ5aW5nIHRvIGNvbm5lY3Qgb24gY2hhbm5lbCBOT04gRElTQ09OTkVDVFxuIik7CisJCXJldHVybiAtRUNPTk5SRUZVU0VEOworCX0KKworCXNrLT5za19zdGF0ZSA9IFdBTlNPQ0tfRElTQ09OTkVDVEVEOwkKKwlzb2NrLT5zdGF0ZSAgPSBTU19VTkNPTk5FQ1RFRDsKKworCWlmIChhZGRyX2xlbiAhPSBzaXplb2Yoc3RydWN0IHdhbl9zb2NrYWRkcl9sbCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGFkZHItPnNsbF9mYW1pbHkgIT0gQUZfV0FOUElQRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKGRldiA9IGRldl9nZXRfYnlfaW5kZXgoc2stPnNrX2JvdW5kX2Rldl9pZikpID09IE5VTEwpCisJCXJldHVybiAtRU5FVFVOUkVBQ0g7CisKKwlkZXZfcHV0KGRldik7CisJCisJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKSkgLyogTXVzdCBiaW5kIGZpcnN0IC0gYXV0b2JpbmRpbmcgZG9lcyBub3Qgd29yayAqLworCQlyZXR1cm4gLUVJTlZBTDsKKworCXNvY2stPnN0YXRlICAgPSBTU19DT05ORUNUSU5HOworCXNrLT5za19zdGF0ZSAgPSBXQU5TT0NLX0NPTk5FQ1RJTkc7CisKKwlpZiAoIXdwX3NrKHNrKS0+bWJveCkgeworCQlpZiAod3Bfc2sgKHNrKS0+c3ZjKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWVsc2UgeworCQkJaW50IGVycjsKKwkJCWlmICgoZXJyPXNldF9pb2N0bF9jbWQoc2ssTlVMTCkpIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJaWYgKChlcnI9d2FucGlwZV9leGVjX2NtZChzaywgWDI1X1BMQUNFX0NBTEwsZmxhZ3MpKSAhPSAwKXsKKwkJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKKwkJc2stPnNrX3N0YXRlID0gV0FOU09DS19DT05ORUNURUQ7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKHNrLT5za19zdGF0ZSAhPSBXQU5TT0NLX0NPTk5FQ1RFRCAmJiAoZmxhZ3MgJiBPX05PTkJMT0NLKSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IFdBTlNPQ0tfQ09OTkVDVEVEKSB7CisJCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CisJCXJldHVybiAtRUNPTk5SRUZVU0VEOyAKKwl9CisKKwlzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHByb3RvX29wcyB3YW5waXBlX29wcyA9IHsKKwkuZmFtaWx5ID0gCVBGX1dBTlBJUEUsCisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLnJlbGVhc2UgPSAJd2FucGlwZV9yZWxlYXNlLAorCS5iaW5kID0gCXdhbnBpcGVfYmluZCwKKwkuY29ubmVjdCA9IAl3YW5waXBlX2Nvbm5lY3QsCisJLnNvY2tldHBhaXIgPSAJc29ja19ub19zb2NrZXRwYWlyLAorCS5hY2NlcHQgPSAJd2FucGlwZV9hY2NlcHQsCisJLmdldG5hbWUgPSAJd2FucGlwZV9nZXRuYW1lLCAKKwkucG9sbCA9IAl3YW5waXBlX3BvbGwsCisJLmlvY3RsID0gCXdhbnBpcGVfaW9jdGwsCisJLmxpc3RlbiA9IAl3YW5waXBlX2xpc3RlbiwgCisJLnNodXRkb3duID0gCXNvY2tfbm9fc2h1dGRvd24sCisJLnNldHNvY2tvcHQgPSAJc29ja19ub19zZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0ID0gCXNvY2tfbm9fZ2V0c29ja29wdCwKKwkuc2VuZG1zZyA9IAl3YW5waXBlX3NlbmRtc2csCisJLnJlY3Ztc2cgPSAJd2FucGlwZV9yZWN2bXNnCit9OworCitzdGF0aWMgc3RydWN0IG5ldF9wcm90b19mYW1pbHkgd2FucGlwZV9mYW1pbHlfb3BzID0geworCS5mYW1pbHkgPSBQRl9XQU5QSVBFLAorCS5jcmVhdGUgPSB3YW5waXBlX2NyZWF0ZSwKKwkub3duZXIJPSBUSElTX01PRFVMRSwKK307CisKK3N0cnVjdCBub3RpZmllcl9ibG9jayB3YW5waXBlX25ldGRldl9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHdhbnBpcGVfbm90aWZpZXIsCit9OworCisKKyNpZmRlZiBNT0RVTEUKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJ3YW5zb2NrOiBDbGVhbmluZyB1cCBcbiIpOworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZ3YW5waXBlX25ldGRldl9ub3RpZmllcik7CisJc29ja191bnJlZ2lzdGVyKFBGX1dBTlBJUEUpOworCXByb3RvX3VucmVnaXN0ZXIoJndhbnBpcGVfcHJvdG8pOworfQorCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcmM7CisKKwlwcmludGsoS0VSTl9JTkZPICJ3YW5zb2NrOiBSZWdpc3RlcmluZyBTb2NrZXQgXG4iKTsKKworCXJjID0gcHJvdG9fcmVnaXN0ZXIoJndhbnBpcGVfcHJvdG8sIDApOworCWlmIChyYyAhPSAwKQorCQlnb3RvIG91dDsKKworCXNvY2tfcmVnaXN0ZXIoJndhbnBpcGVfZmFtaWx5X29wcyk7CisJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZ3YW5waXBlX25ldGRldl9ub3RpZmllcik7CitvdXQ6CisJcmV0dXJuIHJjOworfQorI2VuZGlmCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTkVUUFJPVE8oUEZfV0FOUElQRSk7CmRpZmYgLS1naXQgYS9uZXQvd2Fucm91dGVyL3BhdGNobGV2ZWwgYi9uZXQvd2Fucm91dGVyL3BhdGNobGV2ZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA0M2VlYQotLS0gL2Rldi9udWxsCisrKyBiL25ldC93YW5yb3V0ZXIvcGF0Y2hsZXZlbApAQCAtMCwwICsxIEBACisyLjIuMQpkaWZmIC0tZ2l0IGEvbmV0L3dhbnJvdXRlci93YW5tYWluLmMgYi9uZXQvd2Fucm91dGVyL3dhbm1haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTZjMTdmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3dhbnJvdXRlci93YW5tYWluLmMKQEAgLTAsMCArMSw4ODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiB3YW5tYWluLmMJV0FOIE11bHRpcHJvdG9jb2wgUm91dGVyIE1vZHVsZS4gTWFpbiBjb2RlLgorKgorKgkJVGhpcyBtb2R1bGUgaXMgY29tcGxldGVseSBoYXJkd2FyZS1pbmRlcGVuZGVudCBhbmQgcHJvdmlkZXMKKyoJCXRoZSBmb2xsb3dpbmcgY29tbW9uIHNlcnZpY2VzIGZvciB0aGUgV0FOIExpbmsgRHJpdmVyczoKKyoJCSBvIFdBTiBkZXZpY2UgbWFuYWdlbm1lbnQgKHJlZ2lzdGVyaW5nLCB1bnJlZ2lzdGVyaW5nKQorKgkJIG8gTmV0d29yayBpbnRlcmZhY2UgbWFuYWdlbWVudAorKgkJIG8gUGh5c2ljYWwgY29ubmVjdGlvbiBtYW5hZ2VtZW50IChkaWFsLXVwLCBpbmNvbWluZyBjYWxscykKKyoJCSBvIExvZ2ljYWwgY29ubmVjdGlvbiBtYW5hZ2VtZW50IChzd2l0Y2hlZCB2aXJ0dWFsIGNpcmN1aXRzKQorKgkJIG8gUHJvdG9jb2wgZW5jYXBzdWxhdGlvbi9kZWNhcHN1bGF0aW9uCisqCisqIEF1dGhvcjoJR2lkZW9uIEhhY2sKKyoKKyogQ29weXJpZ2h0OgkoYykgMTk5NS0xOTk5IFNhbmdvbWEgVGVjaG5vbG9naWVzIEluYy4KKyoKKyoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogTm92IDI0LCAyMDAwICBOZW5hZCBDb3JiaWMJVXBkYXRlZCBmb3IgMi40Llgga2VybmVscworKiBOb3YgMDcsIDIwMDAgIE5lbmFkIENvcmJpYwlGaXhlZCB0aGUgTXVsaXQtUG9ydCBQUFAgZm9yIGtlcm5lbHMgMi4yLjE2IGFuZAorKiAgCQkJCWdyZWF0ZXIuCisqIEF1ZyAyLCAgMjAwMCAgTmVuYWQgQ29yYmljCUJsb2NrIHRoZSBNdWx0aS1Qb3J0IFBQUCBmcm9tIHJ1bm5pbmcgb24KKyogIAkJCSAgICAgICAga2VybmVscyAyLjIuMTYgb3IgZ3JlYXRlci4gIFRoZSBTeW5jUFBQCisqICAJCQkgICAgICAgIGhhcyBjaGFuZ2VkLgorKiBKdWwgMTMsIDIwMDAgIE5lbmFkIENvcmJpYwlBZGRlZCBTeW5jUFBQIHN1cHBvcnQKKyogCQkJCUFkZGVkIGV4dHJhIGRlYnVnZ2luZyBpbiBkZXZpY2Vfc2V0dXAoKS4KKyogT2N0IDAxLCAxOTk5ICBHaWRlb24gSGFjayAgICAgVXBkYXRlIGZvciBzNTE0IFBDSSBjYXJkCisqIERlYyAyNywgMTk5NglHZW5lIEtvemluCUluaXRpYWwgdmVyc2lvbiAoYmFzZWQgb24gU2FuZ29tYSdzIFdBTlBJUEUpCisqIEphbiAxNiwgMTk5NwlHZW5lIEtvemluCXJvdXRlcl9kZXZsaXN0IG1hZGUgcHVibGljCisqIEphbiAzMSwgMTk5NyAgQWxhbiBDb3gJSGFja2VkIGl0IGFib3V0IGEgYml0IGZvciAyLjEKKyogSnVuIDI3LCAxOTk3ICBBbGFuIENveAlyZWFsaWduZWQgd2l0aCB2ZW5kb3IgY29kZQorKiBPY3QgMTUsIDE5OTcgIEZhcmhhbiBUaGF3YXIgICBjaGFuZ2VkIHdhbl9lbmNhcHN1bGF0ZSB0byBhZGQgYSBwYWQgYnl0ZSBvZiAwCisqIEFwciAyMCwgMTk5OAlBbGFuIENveAlGaXhlZCAyLjEgc3ltYm9scworKiBNYXkgMTcsIDE5OTggIEsuIEJhcmFub3dza2kJRml4ZWQgU05BUCBlbmNhcHN1bGF0aW9uIGluIHdhbl9lbmNhcHN1bGF0ZQorKiBEZWMgMTUsIDE5OTggIEFybmFsZG8gTWVsbyAgICBzdXBwb3J0IGZvciBmaXJtd2FyZXMgb2YgdXAgdG8gMTI4MDAwIGJ5dGVzCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrIHdhbmRldi0+c2V0dXAgcmV0dXJuIHZhbHVlCisqIERlYyAyMiwgMTk5OCAgQXJuYWxkbyBNZWxvICAgIHZtYWxsb2MvdmZyZWUgdXNlZCBpbiBkZXZpY2Vfc2V0dXAgdG8gYWxsb2NhdGUKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VybmVsIG1lbW9yeSBhbmQgY29weSBjb25maWd1cmF0aW9uIGRhdGEgdG8KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VybmVsIHNwYWNlIChmb3IgYmlnIGZpcm13YXJlcykKKyogSnVuIDAyLCAxOTk5ICBHaWRlb24gSGFjawlVcGRhdGVzIGZvciBMaW51eCAyLjAuWCBhbmQgMi4yLlgga2VybmVscy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CS8qIG9mZnNldG9mKCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgkvKiByZXR1cm4gY29kZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CS8qIHN1cHBvcnQgZm9yIGxvYWRhYmxlIG1vZHVsZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CS8qIGttYWxsb2MoKSwga2ZyZWUoKSAqLworI2luY2x1ZGUgPGxpbnV4L21tLmg+CQkvKiB2ZXJpZnlfYXJlYSgpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CS8qIGlubGluZSBtZW0qLCBzdHIqIGZ1bmN0aW9ucyAqLworCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgkvKiBodG9ucygpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvd2Fucm91dGVyLmg+CS8qIFdBTiByb3V0ZXIgQVBJIGRlZmluaXRpb25zICovCisKKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CS8qIHZtYWxsb2MsIHZmcmVlICovCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4gICAgICAgIC8qIGNvcHlfdG8vZnJvbV91c2VyICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPiAgICAgICAgIC8qIF9faW5pdGZ1bmMgZXQgYWwuICovCisjaW5jbHVkZSA8bmV0L3N5bmNwcHAuaD4KKworI2RlZmluZSBLTUVNX1NBRkVUWVpPTkUgOAorCisvKioqKioqKioqKipGT1IgREVCVUdHSU5HIFBVUlBPU0VTKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdm9pZCAqIGRiZ19rbWFsbG9jKHVuc2lnbmVkIGludCBzaXplLCBpbnQgcHJpbywgaW50IGxpbmUpIHsKKwlpbnQgaSA9IDA7CisJdm9pZCAqIHYgPSBrbWFsbG9jKHNpemUrc2l6ZW9mKHVuc2lnbmVkIGludCkrMipLTUVNX1NBRkVUWVpPTkUqOCxwcmlvKTsKKwljaGFyICogYzEgPSB2OworCWMxICs9IHNpemVvZih1bnNpZ25lZCBpbnQpOworCSooKHVuc2lnbmVkIGludCAqKXYpID0gc2l6ZTsKKworCWZvciAoaSA9IDA7IGkgPCBLTUVNX1NBRkVUWVpPTkU7IGkrKykgeworCQljMVswXSA9ICdEJzsgYzFbMV0gPSAnRSc7IGMxWzJdID0gJ0EnOyBjMVszXSA9ICdEJzsKKwkJYzFbNF0gPSAnQic7IGMxWzVdID0gJ0UnOyBjMVs2XSA9ICdFJzsgYzFbN10gPSAnRic7CisJCWMxICs9IDg7CisJfQorCWMxICs9IHNpemU7CisJZm9yIChpID0gMDsgaSA8IEtNRU1fU0FGRVRZWk9ORTsgaSsrKSB7CisJCWMxWzBdID0gJ00nOyBjMVsxXSA9ICdVJzsgYzFbMl0gPSAnTic7IGMxWzNdID0gJ0cnOworCQljMVs0XSA9ICdXJzsgYzFbNV0gPSAnQSc7IGMxWzZdID0gJ0wnOyBjMVs3XSA9ICdMJzsKKwkJYzEgKz0gODsKKwl9CisJdiA9ICgoY2hhciAqKXYpICsgc2l6ZW9mKHVuc2lnbmVkIGludCkgKyBLTUVNX1NBRkVUWVpPTkUqODsKKwlwcmludGsoS0VSTl9JTkZPICJsaW5lICVkICBrbWFsbG9jKCVkLCVkKSA9ICVwXG4iLGxpbmUsc2l6ZSxwcmlvLHYpOworCXJldHVybiB2OworfQorc3RhdGljIHZvaWQgZGJnX2tmcmVlKHZvaWQgKiB2LCBpbnQgbGluZSkgeworCXVuc2lnbmVkIGludCAqIHNwID0gKHVuc2lnbmVkIGludCAqKSgoKGNoYXIgKil2KSAtIChzaXplb2YodW5zaWduZWQgaW50KSArIEtNRU1fU0FGRVRZWk9ORSo4KSk7CisJdW5zaWduZWQgaW50IHNpemUgPSAqc3A7CisJY2hhciAqIGMxID0gKChjaGFyICopdikgLSBLTUVNX1NBRkVUWVpPTkUqODsKKwlpbnQgaSA9IDA7CisJZm9yIChpID0gMDsgaSA8IEtNRU1fU0FGRVRZWk9ORTsgaSsrKSB7CisJCWlmICggICBjMVswXSAhPSAnRCcgfHwgYzFbMV0gIT0gJ0UnIHx8IGMxWzJdICE9ICdBJyB8fCBjMVszXSAhPSAnRCcKKwkJICAgIHx8IGMxWzRdICE9ICdCJyB8fCBjMVs1XSAhPSAnRScgfHwgYzFbNl0gIT0gJ0UnIHx8IGMxWzddICE9ICdGJykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAia21hbGxvY2VkIGJsb2NrIGF0ICVwIGhhcyBiZWVuIGNvcnJ1cHRlZCAodW5kZXJydW4pIVxuIix2KTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiAlNHg6ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnhcbiIsIGkqOCwKKwkJCSAgICAgICAgICAgICAgICBjMVswXSxjMVsxXSxjMVsyXSxjMVszXSxjMVs0XSxjMVs1XSxjMVs2XSxjMVs3XSApOworCQl9CisJCWMxICs9IDg7CisJfQorCWMxICs9IHNpemU7CisJZm9yIChpID0gMDsgaSA8IEtNRU1fU0FGRVRZWk9ORTsgaSsrKSB7CisJCWlmICggICBjMVswXSAhPSAnTScgfHwgYzFbMV0gIT0gJ1UnIHx8IGMxWzJdICE9ICdOJyB8fCBjMVszXSAhPSAnRycKKwkJICAgIHx8IGMxWzRdICE9ICdXJyB8fCBjMVs1XSAhPSAnQScgfHwgYzFbNl0gIT0gJ0wnIHx8IGMxWzddICE9ICdMJworCQkgICApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImttYWxsb2NlZCBibG9jayBhdCAlcCBoYXMgYmVlbiBjb3JydXB0ZWQgKG92ZXJydW4pOlxuIix2KTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiAlNHg6ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnhcbiIsIGkqOCwKKwkJCSAgICAgICAgICAgICAgICBjMVswXSxjMVsxXSxjMVsyXSxjMVszXSxjMVs0XSxjMVs1XSxjMVs2XSxjMVs3XSApOworCQl9CisJCWMxICs9IDg7CisJfQorCXByaW50ayhLRVJOX0lORk8gImxpbmUgJWQgIGtmcmVlKCVwKVxuIixsaW5lLHYpOworCXYgPSAoKGNoYXIgKil2KSAtIChzaXplb2YodW5zaWduZWQgaW50KSArIEtNRU1fU0FGRVRZWk9ORSo4KTsKKwlrZnJlZSh2KTsKK30KKworI2RlZmluZSBrbWFsbG9jKHgseSkgZGJnX2ttYWxsb2MoeCx5LF9fTElORV9fKQorI2RlZmluZSBrZnJlZSh4KSBkYmdfa2ZyZWUoeCxfX0xJTkVfXykKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogCUZ1bmN0aW9uIFByb3RvdHlwZXMKKyAqLworCisvKgorICoJV0FOIGRldmljZSBJT0NUTCBoYW5kbGVycworICovCisKK3N0YXRpYyBpbnQgd2Fucm91dGVyX2RldmljZV9zZXR1cChzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2LAorCQkJCSAgd2FuZGV2X2NvbmZfdCBfX3VzZXIgKnVfY29uZik7CitzdGF0aWMgaW50IHdhbnJvdXRlcl9kZXZpY2Vfc3RhdChzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2LAorCQkJCSB3YW5kZXZfc3RhdF90IF9fdXNlciAqdV9zdGF0KTsKK3N0YXRpYyBpbnQgd2Fucm91dGVyX2RldmljZV9zaHV0ZG93bihzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2KTsKK3N0YXRpYyBpbnQgd2Fucm91dGVyX2RldmljZV9uZXdfaWYoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiwKKwkJCQkgICB3YW5pZl9jb25mX3QgX191c2VyICp1X2NvbmYpOworc3RhdGljIGludCB3YW5yb3V0ZXJfZGV2aWNlX2RlbF9pZihzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2LAorCQkJCSAgIGNoYXIgX191c2VyICp1X25hbWUpOworCisvKgorICoJTWlzY2VsbGFuZW91cworICovCisKK3N0YXRpYyBzdHJ1Y3Qgd2FuX2RldmljZSAqd2Fucm91dGVyX2ZpbmRfZGV2aWNlKGNoYXIgKm5hbWUpOworc3RhdGljIGludCB3YW5yb3V0ZXJfZGVsZXRlX2ludGVyZmFjZShzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2LCBjaGFyICpuYW1lKTsKK3ZvaWQgbG9ja19hZGFwdGVyX2lycShzcGlubG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpOwordm9pZCB1bmxvY2tfYWRhcHRlcl9pcnEoc3BpbmxvY2tfdCAqbG9jaywgdW5zaWduZWQgbG9uZyAqc21wX2ZsYWdzKTsKKworCisKKy8qCisgKglHbG9iYWwgRGF0YQorICovCisKK3N0YXRpYyBjaGFyIHdhbnJvdXRlcl9mdWxsbmFtZVtdICA9ICJTYW5nb21hIFdBTlBJUEUgUm91dGVyIjsKK3N0YXRpYyBjaGFyIHdhbnJvdXRlcl9jb3B5cmlnaHRbXSA9ICIoYykgMTk5NS0yMDAwIFNhbmdvbWEgVGVjaG5vbG9naWVzIEluYy4iOworc3RhdGljIGNoYXIgd2Fucm91dGVyX21vZG5hbWVbXSA9IFJPVVRFUl9OQU1FOyAvKiBzaG9ydCBtb2R1bGUgbmFtZSAqLworc3RydWN0IHdhbl9kZXZpY2UqIHdhbnJvdXRlcl9yb3V0ZXJfZGV2bGlzdDsgLyogbGlzdCBvZiByZWdpc3RlcmVkIGRldmljZXMgKi8KKworLyoKKyAqCU9yZ2FuaXplIFVuaXF1ZSBJZGVudGlmaWVycyBmb3IgZW5jYXBzdWxhdGlvbi9kZWNhcHN1bGF0aW9uCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2Fucm91dGVyX291aV9ldGhlcltdID0geyAweDAwLCAweDAwLCAweDAwIH07CisjaWYgMAorc3RhdGljIHVuc2lnbmVkIGNoYXIgd2Fucm91dGVyX291aV84MDJfMltdID0geyAweDAwLCAweDgwLCAweEMyIH07CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgd2Fucm91dGVyX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgdiV1LiV1ICVzXG4iLAorCSAgICAgICB3YW5yb3V0ZXJfZnVsbG5hbWUsIFJPVVRFUl9WRVJTSU9OLCBST1VURVJfUkVMRUFTRSwKKwkgICAgICAgd2Fucm91dGVyX2NvcHlyaWdodCk7CisKKwllcnIgPSB3YW5yb3V0ZXJfcHJvY19pbml0KCk7CisJaWYgKGVycikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNhbid0IGNyZWF0ZSBlbnRyeSBpbiBwcm9jIGZpbGVzeXN0ZW0hXG4iLAorCQkgICAgICAgd2Fucm91dGVyX21vZG5hbWUpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHdhbnJvdXRlcl9jbGVhbnVwICh2b2lkKQoreworCXdhbnJvdXRlcl9wcm9jX2NsZWFudXAoKTsKK30KKworLyoKKyAqIFRoaXMgaXMganVzdCBwbGFpbiBkdW1iLiAgV2Ugc2hvdWxkIG1vdmUgdGhlIGJ1Z2dlciB0byBkcml2ZXJzL25ldC93YW4sCisgKiBzbGFwIGl0IGZpcnN0IGluIGRpcmVjdG9yeSBhbmQgbWFrZSBpdCBtb2R1bGVfaW5pdCgpLiAgVGhlIG9ubHkgcmVhc29uCisgKiBmb3Igc3Vic3lzX2luaXRjYWxsKCkgaGVyZSBpcyB0aGF0IG5ldCBnb2VzIGFmdGVyIGRyaXZlcnMgKHdoeSwgQlRXPykKKyAqLworc3Vic3lzX2luaXRjYWxsKHdhbnJvdXRlcl9pbml0KTsKK21vZHVsZV9leGl0KHdhbnJvdXRlcl9jbGVhbnVwKTsKKworLyoKKyAqIAlLZXJuZWwgQVBJcworICovCisKKy8qCisgKiAJUmVnaXN0ZXIgV0FOIGRldmljZS4KKyAqIAlvIHZlcmlmeSBkZXZpY2UgY3JlZGVudGlhbHMKKyAqIAlvIGNyZWF0ZSBhbiBlbnRyeSBmb3IgdGhlIGRldmljZSBpbiB0aGUgL3Byb2MvbmV0L3JvdXRlciBkaXJlY3RvcnkKKyAqIAlvIGluaXRpYWxpemUgaW50ZXJuYWxseSBtYWludGFpbmVkIGZpZWxkcyBvZiB0aGUgd2FuX2RldmljZSBzdHJ1Y3R1cmUKKyAqIAlvIGxpbmsgZGV2aWNlIGRhdGEgc3BhY2UgdG8gYSBzaW5nbHktbGlua2VkIGxpc3QKKyAqIAlvIGlmIGl0J3MgdGhlIGZpcnN0IGRldmljZSwgdGhlbiBzdGFydCBrZXJuZWwgJ3RocmVhZCcKKyAqIAlvIGluY3JlbWVudCBtb2R1bGUgdXNlIGNvdW50CisgKgorICogCVJldHVybjoKKyAqCTAJT2sKKyAqCTwgMAllcnJvci4KKyAqCisgKiAJQ29udGV4dDoJcHJvY2VzcworICovCisKKworaW50IHJlZ2lzdGVyX3dhbl9kZXZpY2Uoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldikKK3sKKwlpbnQgZXJyLCBuYW1lbGVuOworCisJaWYgKCh3YW5kZXYgPT0gTlVMTCkgfHwgKHdhbmRldi0+bWFnaWMgIT0gUk9VVEVSX01BR0lDKSB8fAorCSAgICAod2FuZGV2LT5uYW1lID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW5hbWVsZW4gPSBzdHJsZW4od2FuZGV2LT5uYW1lKTsKKwlpZiAoIW5hbWVsZW4gfHwgKG5hbWVsZW4gPiBXQU5fRFJWTkFNRV9TWikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHdhbnJvdXRlcl9maW5kX2RldmljZSh3YW5kZXYtPm5hbWUpKQorCQlyZXR1cm4gLUVFWElTVDsKKworI2lmZGVmIFdBTkRFQlVHCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlZ2lzdGVyaW5nIFdBTiBkZXZpY2UgJXNcbiIsCisJICAgICAgIHdhbnJvdXRlcl9tb2RuYW1lLCB3YW5kZXYtPm5hbWUpOworI2VuZGlmCisKKwkvKgorCSAqCVJlZ2lzdGVyIC9wcm9jIGRpcmVjdG9yeSBlbnRyeQorCSAqLworCWVyciA9IHdhbnJvdXRlcl9wcm9jX2FkZCh3YW5kZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIiVzOiBjYW4ndCBjcmVhdGUgL3Byb2MvbmV0L3JvdXRlci8lcyBlbnRyeSFcbiIsCisJCQl3YW5yb3V0ZXJfbW9kbmFtZSwgd2FuZGV2LT5uYW1lKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKgorCSAqCUluaXRpYWxpemUgZmllbGRzIG9mIHRoZSB3YW5fZGV2aWNlIHN0cnVjdHVyZSBtYWludGFpbmVkIGJ5IHRoZQorCSAqCXJvdXRlciBhbmQgdXBkYXRlIGxvY2FsIGRhdGEuCisJICovCisKKwl3YW5kZXYtPm5kZXYgPSAwOworCXdhbmRldi0+ZGV2ICA9IE5VTEw7CisJd2FuZGV2LT5uZXh0ID0gd2Fucm91dGVyX3JvdXRlcl9kZXZsaXN0OworCXdhbnJvdXRlcl9yb3V0ZXJfZGV2bGlzdCA9IHdhbmRldjsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCVVucmVnaXN0ZXIgV0FOIGRldmljZS4KKyAqCW8gc2h1dCBkb3duIGRldmljZQorICoJbyB1bmxpbmsgZGV2aWNlIGRhdGEgc3BhY2UgZnJvbSB0aGUgbGlua2VkIGxpc3QKKyAqCW8gZGVsZXRlIGRldmljZSBlbnRyeSBpbiB0aGUgL3Byb2MvbmV0L3JvdXRlciBkaXJlY3RvcnkKKyAqCW8gZGVjcmVtZW50IG1vZHVsZSB1c2UgY291bnQKKyAqCisgKglSZXR1cm46CQkwCU9rCisgKgkJCTwwCWVycm9yLgorICoJQ29udGV4dDoJcHJvY2VzcworICovCisKKworaW50IHVucmVnaXN0ZXJfd2FuX2RldmljZShjaGFyICpuYW1lKQoreworCXN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYsICpwcmV2OworCisJaWYgKG5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKHdhbmRldiA9IHdhbnJvdXRlcl9yb3V0ZXJfZGV2bGlzdCwgcHJldiA9IE5VTEw7CisJCXdhbmRldiAmJiBzdHJjbXAod2FuZGV2LT5uYW1lLCBuYW1lKTsKKwkJcHJldiA9IHdhbmRldiwgd2FuZGV2ID0gd2FuZGV2LT5uZXh0KQorCQk7CisJaWYgKHdhbmRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworI2lmZGVmIFdBTkRFQlVHCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHVucmVnaXN0ZXJpbmcgV0FOIGRldmljZSAlc1xuIiwKKwkgICAgICAgd2Fucm91dGVyX21vZG5hbWUsIG5hbWUpOworI2VuZGlmCisKKwlpZiAod2FuZGV2LT5zdGF0ZSAhPSBXQU5fVU5DT05GSUdVUkVEKQorCQl3YW5yb3V0ZXJfZGV2aWNlX3NodXRkb3duKHdhbmRldik7CisKKwlpZiAocHJldikKKwkJcHJldi0+bmV4dCA9IHdhbmRldi0+bmV4dDsKKwllbHNlCisJCXdhbnJvdXRlcl9yb3V0ZXJfZGV2bGlzdCA9IHdhbmRldi0+bmV4dDsKKworCXdhbnJvdXRlcl9wcm9jX2RlbGV0ZSh3YW5kZXYpOworCXJldHVybiAwOworfQorCisvKgorICoJRW5jYXBzdWxhdGUgcGFja2V0LgorICoKKyAqCVJldHVybjoJZW5jYXBzdWxhdGlvbiBoZWFkZXIgc2l6ZQorICoJCTwgMAktIHVuc3VwcG9ydGVkIEV0aGVydHlwZQorICoKKyAqCU5vdGVzOgorICoJMS4gVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIG9uIGludGVycnVwdCBjb250ZXh0LgorICovCisKKworaW50IHdhbnJvdXRlcl9lbmNhcHN1bGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICB1bnNpZ25lZCBzaG9ydCB0eXBlKQoreworCWludCBoZHJfbGVuID0gMDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgRVRIX1BfSVA6CQkvKiBJUCBkYXRhZ3JhbSBlbmNhcHN1bGF0aW9uICovCisJCWhkcl9sZW4gKz0gMTsKKwkJc2tiX3B1c2goc2tiLCAxKTsKKwkJc2tiLT5kYXRhWzBdID0gTkxQSURfSVA7CisJCWJyZWFrOworCisJY2FzZSBFVEhfUF9JUFg6CQkvKiBTTkFQIGVuY2Fwc3VsYXRpb24gKi8KKwljYXNlIEVUSF9QX0FSUDoKKwkJaGRyX2xlbiArPSA3OworCQlza2JfcHVzaChza2IsIDcpOworCQlza2ItPmRhdGFbMF0gPSAwOworCQlza2ItPmRhdGFbMV0gPSBOTFBJRF9TTkFQOworCQltZW1jcHkoJnNrYi0+ZGF0YVsyXSwgd2Fucm91dGVyX291aV9ldGhlciwKKwkJICAgICAgIHNpemVvZih3YW5yb3V0ZXJfb3VpX2V0aGVyKSk7CisJCSooKHVuc2lnbmVkIHNob3J0Kikmc2tiLT5kYXRhWzVdKSA9IGh0b25zKHR5cGUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CQkvKiBVbmtub3duIHBhY2tldCB0eXBlICovCisJCXByaW50ayhLRVJOX0lORk8KKwkJCSIlczogdW5zdXBwb3J0ZWQgRXRoZXJ0eXBlIDB4JTA0WCBvbiBpbnRlcmZhY2UgJXMhXG4iLAorCQkJd2Fucm91dGVyX21vZG5hbWUsIHR5cGUsIGRldi0+bmFtZSk7CisJCWhkcl9sZW4gPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gaGRyX2xlbjsKK30KKworCisvKgorICoJRGVjYXBzdWxhdGUgcGFja2V0LgorICoKKyAqCVJldHVybjoJRXRoZXJ0eXBlIChpbiBuZXR3b3JrIG9yZGVyKQorICoJCQkwCXVua25vd24gZW5jYXBzdWxhdGlvbgorICoKKyAqCU5vdGVzOgorICoJMS4gVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIG9uIGludGVycnVwdCBjb250ZXh0LgorICovCisKKwordW5zaWduZWQgc2hvcnQgd2Fucm91dGVyX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgY250ID0gc2tiLT5kYXRhWzBdID8gMCA6IDE7CS8qIHRoZXJlIG1heSBiZSBhIHBhZCBwcmVzZW50ICovCisJdW5zaWduZWQgc2hvcnQgZXRoZXJ0eXBlOworCisJc3dpdGNoIChza2ItPmRhdGFbY250XSkgeworCWNhc2UgTkxQSURfSVA6CQkvKiBJUCBkYXRhZ3JhbW0gKi8KKwkJZXRoZXJ0eXBlID0gaHRvbnMoRVRIX1BfSVApOworCQljbnQgKz0gMTsKKwkJYnJlYWs7CisKKyAgICAgICAgY2FzZSBOTFBJRF9TTkFQOgkvKiBTTkFQIGVuY2Fwc3VsYXRpb24gKi8KKwkJaWYgKG1lbWNtcCgmc2tiLT5kYXRhW2NudCArIDFdLCB3YW5yb3V0ZXJfb3VpX2V0aGVyLAorCQkJICAgc2l6ZW9mKHdhbnJvdXRlcl9vdWlfZXRoZXIpKSl7CisgICAgICAgICAgCQlwcmludGsoS0VSTl9JTkZPCisJCQkJIiVzOiB1bnN1cHBvcnRlZCBTTkFQIE9VSSAlMDJYLSUwMlgtJTAyWCAiCisJCQkJIm9uIGludGVyZmFjZSAlcyFcbiIsIHdhbnJvdXRlcl9tb2RuYW1lLAorCQkJCXNrYi0+ZGF0YVtjbnQrMV0sIHNrYi0+ZGF0YVtjbnQrMl0sCisJCQkJc2tiLT5kYXRhW2NudCszXSwgZGV2LT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJCWV0aGVydHlwZSA9ICooKHVuc2lnbmVkIHNob3J0Kikmc2tiLT5kYXRhW2NudCs0XSk7CisJCWNudCArPSA2OworCQlicmVhazsKKworCS8qIGFkZCBvdGhlciBwcm90b2NvbHMsIGUuZy4gQ0xOUCwgRVNJUywgSVNJUywgaWYgbmVlZGVkICovCisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPCisJCQkiJXM6IHVuc3VwcG9ydGVkIE5MUElEIDB4JTAyWCBvbiBpbnRlcmZhY2UgJXMhXG4iLAorCQkJd2Fucm91dGVyX21vZG5hbWUsIHNrYi0+ZGF0YVtjbnRdLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJc2tiLT5wcm90b2NvbCA9IGV0aGVydHlwZTsKKwlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CS8qCVBoeXNpY2FsbHkgcG9pbnQgdG8gcG9pbnQgKi8KKwlza2JfcHVsbChza2IsIGNudCk7CisJc2tiLT5tYWMucmF3ICA9IHNrYi0+ZGF0YTsKKwlyZXR1cm4gZXRoZXJ0eXBlOworfQorCisKKy8qCisgKglXQU4gZGV2aWNlIElPQ1RMLgorICoJbyBmaW5kIFdBTiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZQorICoJbyBleGVjdXRlIHJlcXVlc3RlZCBhY3Rpb24gb3IgcGFzcyBjb21tYW5kIHRvIHRoZSBkZXZpY2UgZHJpdmVyCisgKi8KKworaW50IHdhbnJvdXRlcl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZW50OworCXN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXY7CisJdm9pZCBfX3VzZXIgKmRhdGEgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoKGNtZCA+PiA4KSAhPSBST1VURVJfSU9DVEwpCisJCXJldHVybiAtRUlOVkFMOworCisJZGVudCA9IFBERShpbm9kZSk7CisJaWYgKChkZW50ID09IE5VTEwpIHx8IChkZW50LT5kYXRhID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdhbmRldiA9IGRlbnQtPmRhdGE7CisJaWYgKHdhbmRldi0+bWFnaWMgIT0gUk9VVEVSX01BR0lDKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBST1VURVJfU0VUVVA6CisJCWVyciA9IHdhbnJvdXRlcl9kZXZpY2Vfc2V0dXAod2FuZGV2LCBkYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIFJPVVRFUl9ET1dOOgorCQllcnIgPSB3YW5yb3V0ZXJfZGV2aWNlX3NodXRkb3duKHdhbmRldik7CisJCWJyZWFrOworCisJY2FzZSBST1VURVJfU1RBVDoKKwkJZXJyID0gd2Fucm91dGVyX2RldmljZV9zdGF0KHdhbmRldiwgZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSBST1VURVJfSUZORVc6CisJCWVyciA9IHdhbnJvdXRlcl9kZXZpY2VfbmV3X2lmKHdhbmRldiwgZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSBST1VURVJfSUZERUw6CisJCWVyciA9IHdhbnJvdXRlcl9kZXZpY2VfZGVsX2lmKHdhbmRldiwgZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSBST1VURVJfSUZTVEFUOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWlmICgoY21kID49IFJPVVRFUl9VU0VSKSAmJgorCQkgICAgKGNtZCA8PSBST1VURVJfVVNFUl9NQVgpICYmCisJCSAgICB3YW5kZXYtPmlvY3RsKQorCQkJZXJyID0gd2FuZGV2LT5pb2N0bCh3YW5kZXYsIGNtZCwgYXJnKTsKKwkJZWxzZSBlcnIgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJV0FOIERyaXZlciBJT0NUTCBIYW5kbGVycworICovCisKKy8qCisgKglTZXR1cCBXQU4gbGluayBkZXZpY2UuCisgKglvIHZlcmlmeSB1c2VyIGFkZHJlc3Mgc3BhY2UKKyAqCW8gYWxsb2NhdGUga2VybmVsIG1lbW9yeSBhbmQgY29weSBjb25maWd1cmF0aW9uIGRhdGEgdG8ga2VybmVsIHNwYWNlCisgKglvIGlmIGNvbmZpZ3VyYXRpb24gZGF0YSBpbmNsdWRlcyBleHRlbnNpb24sIGNvcHkgaXQgdG8ga2VybmVsIHNwYWNlIHRvbworICoJbyBjYWxsIGRyaXZlcidzIHNldHVwKCkgZW50cnkgcG9pbnQKKyAqLworCitzdGF0aWMgaW50IHdhbnJvdXRlcl9kZXZpY2Vfc2V0dXAoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiwKKwkJCQkgIHdhbmRldl9jb25mX3QgX191c2VyICp1X2NvbmYpCit7CisJdm9pZCAqZGF0YSA9IE5VTEw7CisJd2FuZGV2X2NvbmZfdCAqY29uZjsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworCWlmICh3YW5kZXYtPnNldHVwID09IE5VTEwpIHsJLyogTm90aGluZyB0byBkbyA/ICovCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFUlJPUiwgTm8gc2V0dXAgc2NyaXB0OiB3YW5kZXYtPnNldHVwKClcbiIsCisJCQkJd2FuZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY29uZiA9IGttYWxsb2Moc2l6ZW9mKHdhbmRldl9jb25mX3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY29uZiA9PSBOVUxMKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVSUk9SLCBGYWlsZWQgdG8gYWxsb2NhdGUga2VybmVsIG1lbW9yeSAhXG4iLAorCQkJCXdhbmRldi0+bmFtZSk7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoY29uZiwgdV9jb25mLCBzaXplb2Yod2FuZGV2X2NvbmZfdCkpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGYWlsZWQgdG8gY29weSB1c2VyIGNvbmZpZyBkYXRhIHRvIGtlcm5lbCBzcGFjZSFcbiIsCisJCQkJd2FuZGV2LT5uYW1lKTsKKwkJa2ZyZWUoY29uZik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChjb25mLT5tYWdpYyAhPSBST1VURVJfTUFHSUMpIHsKKwkJa2ZyZWUoY29uZik7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFUlJPUiwgSW52YWxpZCBNQUdJQyBOdW1iZXJcbiIsCisJCQkJd2FuZGV2LT5uYW1lKTsKKwkgICAgICAgIHJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjb25mLT5kYXRhX3NpemUgJiYgY29uZi0+ZGF0YSkgeworCQlpZiAoY29uZi0+ZGF0YV9zaXplID4gMTI4MDAwIHx8IGNvbmYtPmRhdGFfc2l6ZSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAiJXM6IEVSUk9SLCBJbnZhbGlkIGZpcm13YXJlIGRhdGEgc2l6ZSAlaSAhXG4iLAorCQkJCQl3YW5kZXYtPm5hbWUsIGNvbmYtPmRhdGFfc2l6ZSk7CisJCQlrZnJlZShjb25mKTsKKwkJICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWRhdGEgPSB2bWFsbG9jKGNvbmYtPmRhdGFfc2l6ZSk7CisJCWlmICghZGF0YSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJIAkiJXM6IEVSUk9SLCBGYWlsZCBhbGxvY2F0ZSBrZXJuZWwgbWVtb3J5ICFcbiIsCisJCQkJd2FuZGV2LT5uYW1lKTsKKwkJCWtmcmVlKGNvbmYpOworCQkJcmV0dXJuIC1FTk9CVUZTOworCQl9CisJCWlmICghY29weV9mcm9tX3VzZXIoZGF0YSwgY29uZi0+ZGF0YSwgY29uZi0+ZGF0YV9zaXplKSkgeworCQkJY29uZi0+ZGF0YSA9IGRhdGE7CisJCQllcnIgPSB3YW5kZXYtPnNldHVwKHdhbmRldiwgY29uZik7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICIlczogRVJST1IsIEZhaWxkIHRvIGNvcHkgZnJvbSB1c2VyIGRhdGEgIVxuIiwKKwkJCSAgICAgICB3YW5kZXYtPm5hbWUpOworCQkJZXJyID0gLUVGQVVMVDsKKwkJfQorCQl2ZnJlZShkYXRhKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAiJXM6IEVSUk9SLCBObyBmaXJtd2FyZSBmb3VuZCAhIEZpcm13YXJlIHNpemUgPSAlaSAhXG4iLAorCQkJCXdhbmRldi0+bmFtZSwgY29uZi0+ZGF0YV9zaXplKTsKKwl9CisKKwlrZnJlZShjb25mKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJU2h1dGRvd24gV0FOIGRldmljZS4KKyAqCW8gZGVsZXRlIGFsbCBub3Qgb3BlbmVkIGxvZ2ljYWwgY2hhbm5lbHMgZm9yIHRoaXMgZGV2aWNlCisgKglvIGNhbGwgZHJpdmVyJ3Mgc2h1dGRvd24oKSBlbnRyeSBwb2ludAorICovCisKK3N0YXRpYyBpbnQgd2Fucm91dGVyX2RldmljZV9zaHV0ZG93bihzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGVycj0wOworCisJaWYgKHdhbmRldi0+c3RhdGUgPT0gV0FOX1VOQ09ORklHVVJFRCkKKwkJcmV0dXJuIDA7CisKKwlwcmludGsoS0VSTl9JTkZPICJcbiVzOiBTaHV0dGluZyBEb3duIVxuIix3YW5kZXYtPm5hbWUpOworCisJZm9yIChkZXYgPSB3YW5kZXYtPmRldjsgZGV2OykgeworCQllcnIgPSB3YW5yb3V0ZXJfZGVsZXRlX2ludGVyZmFjZSh3YW5kZXYsIGRldi0+bmFtZSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQkvKiBUaGUgYWJvdmUgZnVuY3Rpb24gZGVhbGxvY2F0ZXMgdGhlIGN1cnJlbnQgZGV2CisJCSAqIHN0cnVjdHVyZS4gVGhlcmVmb3JlLCB3ZSBjYW5ub3QgdXNlIGRldi0+cHJpdgorCQkgKiBhcyB0aGUgbmV4dCBlbGVtZW50OiB3YW5kZXYtPmRldiBwb2ludHMgdG8gdGhlCisJCSAqIG5leHQgZWxlbWVudCAqLworCQlkZXYgPSB3YW5kZXYtPmRldjsKKwl9CisKKwlpZiAod2FuZGV2LT5uZGV2KQorCQlyZXR1cm4gLUVCVVNZOwkvKiB0aGVyZSBhcmUgb3BlbmVkIGludGVyZmFjZXMgICovCisKKwlpZiAod2FuZGV2LT5zaHV0ZG93bikKKwkJZXJyPXdhbmRldi0+c2h1dGRvd24od2FuZGV2KTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKglHZXQgV0FOIGRldmljZSBzdGF0dXMgJiBzdGF0aXN0aWNzLgorICovCisKK3N0YXRpYyBpbnQgd2Fucm91dGVyX2RldmljZV9zdGF0KHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYsCisJCQkJIHdhbmRldl9zdGF0X3QgX191c2VyICp1X3N0YXQpCit7CisJd2FuZGV2X3N0YXRfdCBzdGF0OworCisJbWVtc2V0KCZzdGF0LCAwLCBzaXplb2Yoc3RhdCkpOworCisJLyogQXNrIGRldmljZSBkcml2ZXIgdG8gdXBkYXRlIGRldmljZSBzdGF0aXN0aWNzICovCisJaWYgKCh3YW5kZXYtPnN0YXRlICE9IFdBTl9VTkNPTkZJR1VSRUQpICYmIHdhbmRldi0+dXBkYXRlKQorCQl3YW5kZXYtPnVwZGF0ZSh3YW5kZXYpOworCisJLyogRmlsbCBvdXQgc3RydWN0dXJlICovCisJc3RhdC5uZGV2ICA9IHdhbmRldi0+bmRldjsKKwlzdGF0LnN0YXRlID0gd2FuZGV2LT5zdGF0ZTsKKworCWlmIChjb3B5X3RvX3VzZXIodV9zdGF0LCAmc3RhdCwgc2l6ZW9mKHN0YXQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCUNyZWF0ZSBuZXcgV0FOIGludGVyZmFjZS4KKyAqCW8gdmVyaWZ5IHVzZXIgYWRkcmVzcyBzcGFjZQorICoJbyBjb3B5IGNvbmZpZ3VyYXRpb24gZGF0YSB0byBrZXJuZWwgYWRkcmVzcyBzcGFjZQorICoJbyBhbGxvY2F0ZSBuZXR3b3JrIGludGVyZmFjZSBkYXRhIHNwYWNlCisgKglvIGNhbGwgZHJpdmVyJ3MgbmV3X2lmKCkgZW50cnkgcG9pbnQKKyAqCW8gbWFrZSBzdXJlIHRoZXJlIGlzIG5vIGludGVyZmFjZSBuYW1lIGNvbmZsaWN0CisgKglvIHJlZ2lzdGVyIG5ldHdvcmsgaW50ZXJmYWNlCisgKi8KKworc3RhdGljIGludCB3YW5yb3V0ZXJfZGV2aWNlX25ld19pZihzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2LAorCQkJCSAgIHdhbmlmX2NvbmZfdCBfX3VzZXIgKnVfY29uZikKK3sKKwl3YW5pZl9jb25mX3QgKmNuZjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKyNpZmRlZiBDT05GSUdfV0FOUElQRV9NVUxUUFBQCisJc3RydWN0IHBwcF9kZXZpY2UgKnBwcGRldj1OVUxMOworI2VuZGlmCisJaW50IGVycjsKKworCWlmICgod2FuZGV2LT5zdGF0ZSA9PSBXQU5fVU5DT05GSUdVUkVEKSB8fCAod2FuZGV2LT5uZXdfaWYgPT0gTlVMTCkpCisJCXJldHVybiAtRU5PREVWOworCisJY25mID0ga21hbGxvYyhzaXplb2Yod2FuaWZfY29uZl90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjbmYpCisJCXJldHVybiAtRU5PQlVGUzsKKworCWVyciA9IC1FRkFVTFQ7CisJaWYgKGNvcHlfZnJvbV91c2VyKGNuZiwgdV9jb25mLCBzaXplb2Yod2FuaWZfY29uZl90KSkpCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoY25mLT5tYWdpYyAhPSBST1VURVJfTUFHSUMpCisJCWdvdG8gb3V0OworCisJaWYgKGNuZi0+Y29uZmlnX2lkID09IFdBTkNPTkZJR19NUFBQKSB7CisjaWZkZWYgQ09ORklHX1dBTlBJUEVfTVVMVFBQUAorCQlwcHBkZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHBwX2RldmljZSksIEdGUF9LRVJORUwpOworCQllcnIgPSAtRU5PQlVGUzsKKwkJaWYgKHBwcGRldiA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJCW1lbXNldChwcHBkZXYsIDAsIHNpemVvZihzdHJ1Y3QgcHBwX2RldmljZSkpOworCQlwcHBkZXYtPmRldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChwcHBkZXYtPmRldiA9PSBOVUxMKSB7CisJCQlrZnJlZShwcHBkZXYpOworCQkJZXJyID0gLUVOT0JVRlM7CisJCQlnb3RvIG91dDsKKwkJfQorCQltZW1zZXQocHBwZGV2LT5kZXYsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZSkpOworCQllcnIgPSB3YW5kZXYtPm5ld19pZih3YW5kZXYsIChzdHJ1Y3QgbmV0X2RldmljZSAqKXBwcGRldiwgY25mKTsKKwkJZGV2ID0gcHBwZGV2LT5kZXY7CisjZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICIlczogV2FucGlwZSBNdWxpdC1Qb3J0IFBQUCBzdXBwb3J0IGhhcyBub3QgYmVlbiBjb21waWxlZCBpbiFcbiIsCisJCQkJd2FuZGV2LT5uYW1lKTsKKwkJZXJyID0gLUVQUk9UT05PU1VQUE9SVDsKKwkJZ290byBvdXQ7CisjZW5kaWYKKwl9IGVsc2UgeworCQlkZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZSksIEdGUF9LRVJORUwpOworCQllcnIgPSAtRU5PQlVGUzsKKwkJaWYgKGRldiA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJCW1lbXNldChkZXYsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZSkpOworCQllcnIgPSB3YW5kZXYtPm5ld19pZih3YW5kZXYsIGRldiwgY25mKTsKKwl9CisKKwlpZiAoIWVycikgeworCQkvKiBSZWdpc3RlciBuZXR3b3JrIGludGVyZmFjZS4gVGhpcyB3aWxsIGludm9rZSBpbml0KCkKKwkJICogZnVuY3Rpb24gc3VwcGxpZWQgYnkgdGhlIGRyaXZlci4gIElmIGRldmljZSByZWdpc3RlcmVkCisJCSAqIHN1Y2Nlc3NmdWxseSwgYWRkIGl0IHRvIHRoZSBpbnRlcmZhY2UgbGlzdC4KKwkJICovCisKKwkJaWYgKGRldi0+bmFtZSA9PSBOVUxMKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQl9IGVsc2UgeworCisJCQkjaWZkZWYgV0FOREVCVUcKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiByZWdpc3RlcmluZyBpbnRlcmZhY2UgJXMuLi5cbiIsCisJCQkJd2Fucm91dGVyX21vZG5hbWUsIGRldi0+bmFtZSk7CisJCQkjZW5kaWYKKworCQkJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQlpZiAoIWVycikgeworCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZSA9IE5VTEw7CisJCQkJdW5zaWduZWQgbG9uZyBzbXBfZmxhZ3M9MDsKKworCQkJCWxvY2tfYWRhcHRlcl9pcnEoJndhbmRldi0+bG9jaywgJnNtcF9mbGFncyk7CisKKwkJCQlpZiAod2FuZGV2LT5kZXYgPT0gTlVMTCkgeworCQkJCQl3YW5kZXYtPmRldiA9IGRldjsKKwkJCQl9IGVsc2UgeworCQkJCQlmb3IgKHNsYXZlPXdhbmRldi0+ZGV2OworCQkJCQkgKigoc3RydWN0IG5ldF9kZXZpY2UgKiopc2xhdmUtPnByaXYpOworCQkJCSBzbGF2ZSA9ICooKHN0cnVjdCBuZXRfZGV2aWNlICoqKXNsYXZlLT5wcml2KSk7CisKKwkJCQkgICAgICooKHN0cnVjdCBuZXRfZGV2aWNlICoqKXNsYXZlLT5wcml2KSA9IGRldjsKKwkJCQl9CisJCQkJKyt3YW5kZXYtPm5kZXY7CisKKwkJCQl1bmxvY2tfYWRhcHRlcl9pcnEoJndhbmRldi0+bG9jaywgJnNtcF9mbGFncyk7CisJCQkJZXJyID0gMDsJLyogZG9uZSAhISEgKi8KKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlpZiAod2FuZGV2LT5kZWxfaWYpCisJCQl3YW5kZXYtPmRlbF9pZih3YW5kZXYsIGRldik7CisJfQorCisJLyogVGhpcyBjb2RlIGhhcyBtb3ZlZCBmcm9tIGRlbF9pZigpIGZ1bmN0aW9uICovCisJaWYgKGRldi0+cHJpdikgeworCQlrZnJlZShkZXYtPnByaXYpOworCQlkZXYtPnByaXYgPSBOVUxMOworCX0KKworI2lmZGVmIENPTkZJR19XQU5QSVBFX01VTFRQUFAKKwlpZiAoY25mLT5jb25maWdfaWQgPT0gV0FOQ09ORklHX01QUFApCisJCWtmcmVlKHBwcGRldik7CisJZWxzZQorCQlrZnJlZShkZXYpOworI2Vsc2UKKwkvKiBTeW5jIFBQUCBpcyBkaXNhYmxlZCAqLworCWlmIChjbmYtPmNvbmZpZ19pZCAhPSBXQU5DT05GSUdfTVBQUCkKKwkJa2ZyZWUoZGV2KTsKKyNlbmRpZgorCitvdXQ6CisJa2ZyZWUoY25mKTsKKwlyZXR1cm4gZXJyOworfQorCisKKy8qCisgKglEZWxldGUgV0FOIGxvZ2ljYWwgY2hhbm5lbC4KKyAqCSBvIHZlcmlmeSB1c2VyIGFkZHJlc3Mgc3BhY2UKKyAqCSBvIGNvcHkgY29uZmlndXJhdGlvbiBkYXRhIHRvIGtlcm5lbCBhZGRyZXNzIHNwYWNlCisgKi8KKworc3RhdGljIGludCB3YW5yb3V0ZXJfZGV2aWNlX2RlbF9pZihzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2LCBjaGFyIF9fdXNlciAqdV9uYW1lKQoreworCWNoYXIgbmFtZVtXQU5fSUZOQU1FX1NaICsgMV07CisgICAgICAgIGludCBlcnIgPSAwOworCisJaWYgKHdhbmRldi0+c3RhdGUgPT0gV0FOX1VOQ09ORklHVVJFRCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltZW1zZXQobmFtZSwgMCwgc2l6ZW9mKG5hbWUpKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihuYW1lLCB1X25hbWUsIFdBTl9JRk5BTUVfU1opKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWVyciA9IHdhbnJvdXRlcl9kZWxldGVfaW50ZXJmYWNlKHdhbmRldiwgbmFtZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIElmIGxhc3QgaW50ZXJmYWNlIGJlaW5nIGRlbGV0ZWQsIHNodXRkb3duIGNhcmQKKwkgKiBUaGlzIGhlbHBzIHdpdGggYWRtaW5pc3RyYXRpb24gYXQgbGVhZiBub2RlcworCSAqIChZb3UgY2FuIHRlbGwgaWYgdGhlIHBlcnNvbiBhdCB0aGUgb3RoZXIgZW5kIG9mIHRoZSBwaG9uZQorCSAqIGhhcyBhbiBpbnRlcmZhY2UgY29uZmlndXJlZCkgYW5kIGF2b2lkcyBEb1MgdnVsbmVyYWJpbGl0aWVzCisJICogaW4gYmluYXJ5IGRyaXZlciBmaWxlcyAtIHRoaXMgZml4ZXMgYSBwcm9ibGVtIHdpdGggdGhlIGN1cnJlbnQKKwkgKiBTYW5nb21hIGRyaXZlciBnb2luZyBpbnRvIHN0cmFuZ2Ugc3RhdGVzIHdoZW4gYWxsIHRoZSBuZXR3b3JrCisJICogaW50ZXJmYWNlcyBhcmUgZGVsZXRlZCBhbmQgdGhlIGxpbmsgaXJyZWNvdmVyYWJseSBkaXNjb25uZWN0ZWQuCisJICovCisKKyAgICAgICAgaWYgKCF3YW5kZXYtPm5kZXYgJiYgd2FuZGV2LT5zaHV0ZG93bikKKyAgICAgICAgICAgICAgICBlcnIgPSB3YW5kZXYtPnNodXRkb3duKHdhbmRldik7CisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJTWlzY2VsbGFuZW91cyBGdW5jdGlvbnMKKyAqLworCisvKgorICoJRmluZCBXQU4gZGV2aWNlIGJ5IG5hbWUuCisgKglSZXR1cm4gcG9pbnRlciB0byB0aGUgV0FOIGRldmljZSBkYXRhIHNwYWNlIG9yIE5VTEwgaWYgZGV2aWNlIG5vdCBmb3VuZC4KKyAqLworCitzdGF0aWMgc3RydWN0IHdhbl9kZXZpY2UgKndhbnJvdXRlcl9maW5kX2RldmljZShjaGFyICpuYW1lKQoreworCXN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXY7CisKKwlmb3IgKHdhbmRldiA9IHdhbnJvdXRlcl9yb3V0ZXJfZGV2bGlzdDsKKwkgICAgIHdhbmRldiAmJiBzdHJjbXAod2FuZGV2LT5uYW1lLCBuYW1lKTsKKwkJd2FuZGV2ID0gd2FuZGV2LT5uZXh0KTsKKwlyZXR1cm4gd2FuZGV2OworfQorCisvKgorICoJRGVsZXRlIFdBTiBsb2dpY2FsIGNoYW5uZWwgaWRlbnRpZmllZCBieSBpdHMgbmFtZS4KKyAqCW8gZmluZCBsb2dpY2FsIGNoYW5uZWwgYnkgaXRzIG5hbWUKKyAqCW8gY2FsbCBkcml2ZXIncyBkZWxfaWYoKSBlbnRyeSBwb2ludAorICoJbyB1bnJlZ2lzdGVyIG5ldHdvcmsgaW50ZXJmYWNlCisgKglvIHVubGluayBjaGFubmVsIGRhdGEgc3BhY2UgZnJvbSBsaW5rZWQgbGlzdCBvZiBjaGFubmVscworICoJbyByZWxlYXNlIGNoYW5uZWwgZGF0YSBzcGFjZQorICoKKyAqCVJldHVybjoJMAkJc3VjY2VzcworICoJCS1FTk9ERVYJCWNoYW5uZWwgbm90IGZvdW5kLgorICoJCS1FQlVTWQkJaW50ZXJmYWNlIGlzIG9wZW4KKyAqCisgKglOb3RlOiBJZiAoZm9yY2UgIT0gMCksIHRoZW4gZGV2aWNlIHdpbGwgYmUgZGVzdHJveWVkIGV2ZW4gaWYgaW50ZXJmYWNlCisgKglhc3NvY2lhdGVkIHdpdGggaXQgaXMgb3Blbi4gSXQncyBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBtYWtlCisgKglzdXJlIHRoYXQgb3BlbmVkIGludGVyZmFjZXMgYXJlIG5vdCByZW1vdmVkIQorICovCisKK3N0YXRpYyBpbnQgd2Fucm91dGVyX2RlbGV0ZV9pbnRlcmZhY2Uoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiwgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTCwgKnByZXYgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgc21wX2ZsYWdzPTA7CisKKwlsb2NrX2FkYXB0ZXJfaXJxKCZ3YW5kZXYtPmxvY2ssICZzbXBfZmxhZ3MpOworCWRldiA9IHdhbmRldi0+ZGV2OworCXByZXYgPSBOVUxMOworCXdoaWxlIChkZXYgJiYgc3RyY21wKG5hbWUsIGRldi0+bmFtZSkpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKipzbGF2ZSA9IGRldi0+cHJpdjsKKwkJcHJldiA9IGRldjsKKwkJZGV2ID0gKnNsYXZlOworCX0KKwl1bmxvY2tfYWRhcHRlcl9pcnEoJndhbmRldi0+bG9jaywgJnNtcF9mbGFncyk7CisKKwlpZiAoZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOwkvKiBpbnRlcmZhY2Ugbm90IGZvdW5kICovCisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVCVVNZOwkvKiBpbnRlcmZhY2UgaW4gdXNlICovCisKKwlpZiAod2FuZGV2LT5kZWxfaWYpCisJCXdhbmRldi0+ZGVsX2lmKHdhbmRldiwgZGV2KTsKKworCWxvY2tfYWRhcHRlcl9pcnEoJndhbmRldi0+bG9jaywgJnNtcF9mbGFncyk7CisJaWYgKHByZXYpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKipwcmV2X3NsYXZlID0gcHJldi0+cHJpdjsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKipzbGF2ZSA9IGRldi0+cHJpdjsKKworCQkqcHJldl9zbGF2ZSA9ICpzbGF2ZTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqKnNsYXZlID0gZGV2LT5wcml2OworCQl3YW5kZXYtPmRldiA9ICpzbGF2ZTsKKwl9CisJLS13YW5kZXYtPm5kZXY7CisJdW5sb2NrX2FkYXB0ZXJfaXJxKCZ3YW5kZXYtPmxvY2ssICZzbXBfZmxhZ3MpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHVucmVnaXN0ZXJpbmcgJyVzJ1xuIiwgd2FuZGV2LT5uYW1lLCBkZXYtPm5hbWUpOworCisJLyogRHVlIHRvIG5ldyBpbnRlcmZhY2UgbGlua2luZyBtZXRob2QgdXNpbmcgZGV2LT5wcml2LAorCSAqIHRoaXMgY29kZSBoYXMgbW92ZWQgZnJvbSBkZWxfaWYoKSBmdW5jdGlvbi4qLworCWlmIChkZXYtPnByaXYpeworCQlrZnJlZShkZXYtPnByaXYpOworCQlkZXYtPnByaXY9TlVMTDsKKwl9CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJZnJlZV9uZXRkZXYoZGV2KTsKKworCXJldHVybiAwOworfQorCit2b2lkIGxvY2tfYWRhcHRlcl9pcnEoc3BpbmxvY2tfdCAqbG9jaywgdW5zaWduZWQgbG9uZyAqc21wX2ZsYWdzKQoreworICAgICAgIAlzcGluX2xvY2tfaXJxc2F2ZShsb2NrLCAqc21wX2ZsYWdzKTsKK30KKworCit2b2lkIHVubG9ja19hZGFwdGVyX2lycShzcGlubG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpCit7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCAqc21wX2ZsYWdzKTsKK30KKworRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl93YW5fZGV2aWNlKTsKK0VYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl93YW5fZGV2aWNlKTsKK0VYUE9SVF9TWU1CT0wod2Fucm91dGVyX2VuY2Fwc3VsYXRlKTsKK0VYUE9SVF9TWU1CT0wod2Fucm91dGVyX3R5cGVfdHJhbnMpOworRVhQT1JUX1NZTUJPTChsb2NrX2FkYXB0ZXJfaXJxKTsKK0VYUE9SVF9TWU1CT0wodW5sb2NrX2FkYXB0ZXJfaXJxKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorICoJRW5kCisgKi8KZGlmZiAtLWdpdCBhL25ldC93YW5yb3V0ZXIvd2FucHJvYy5jIGIvbmV0L3dhbnJvdXRlci93YW5wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI4YmE1YQotLS0gL2Rldi9udWxsCisrKyBiL25ldC93YW5yb3V0ZXIvd2FucHJvYy5jCkBAIC0wLDAgKzEsMzgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogd2FucHJvYy5jCVdBTiBSb3V0ZXIgTW9kdWxlLiAvcHJvYyBmaWxlc3lzdGVtIGludGVyZmFjZS4KKyoKKyoJCVRoaXMgbW9kdWxlIGlzIGNvbXBsZXRlbHkgaGFyZHdhcmUtaW5kZXBlbmRlbnQgYW5kIHByb3ZpZGVzCisqCQlhY2Nlc3MgdG8gdGhlIHJvdXRlciB1c2luZyBMaW51eCAvcHJvYyBmaWxlc3lzdGVtLgorKgorKiBBdXRob3I6IAlHaWRlb24gSGFjaworKgorKiBDb3B5cmlnaHQ6CShjKSAxOTk1LTE5OTkgU2FuZ29tYSBUZWNobm9sb2dpZXMgSW5jLgorKgorKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiBKdW4gMDIsIDE5OTkgIEdpZGVvbiBIYWNrCVVwZGF0ZXMgZm9yIExpbnV4IDIuMi5YIGtlcm5lbHMuCisqIEp1biAyOSwgMTk5NwlBbGFuIENveAlNZXJnZWQgd2l0aCAxLjAuMyB2ZW5kb3IgY29kZQorKiBKYW4gMjksIDE5OTcJR2VuZSBLb3ppbgl2MS4wLjEuIEltcGxlbWVudGVkIC9wcm9jIHJlYWQgcm91dGluZXMKKyogSmFuIDMwLCAxOTk3CUFsYW4gQ294CUhhY2tlZCBhcm91bmQgZm9yIDIuMQorKiBEZWMgMTMsIDE5OTYJR2VuZSBLb3ppbglJbml0aWFsIHZlcnNpb24gKGJhc2VkIG9uIFNhbmdvbWEncyBXQU5QSVBFKQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CQkvKiBfX2luaXRmdW5jIGV0IGFsLiAqLworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgkvKiBvZmZzZXRvZigpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4JLyogcmV0dXJuIGNvZGVzICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvd2Fucm91dGVyLmg+CS8qIFdBTiByb3V0ZXIgQVBJIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgUFJPQ19TVEFUU19GT1JNQVQgIiUzMHM6ICUxMmx1XG4iCisKKy8qKioqKiogRGVmaW5lcyBhbmQgTWFjcm9zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFBST1RfREVDT0RFKHByb3QpICgocHJvdCA9PSBXQU5DT05GSUdfRlIpID8gIiBGUiIgOlwKKwkJCSAgICAgIChwcm90ID09IFdBTkNPTkZJR19YMjUpID8gIiBYMjUiIDogXAorCQkJICAgICAgICAgKHByb3QgPT0gV0FOQ09ORklHX1BQUCkgPyAiIFBQUCIgOiBcCisJCQkJICAgIChwcm90ID09IFdBTkNPTkZJR19DSERMQykgPyAiIENIRExDIjogXAorCQkJCSAgICAgICAocHJvdCA9PSBXQU5DT05GSUdfTVBQUCkgPyAiIE1QUFAiIDogXAorCQkJCSAgICAgICAgICAgIiBVbmtub3duIiApCisKKy8qKioqKiogRnVuY3Rpb24gUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworLyogTWlzY2VsbGFuZW91cyAqLworCisvKgorICoJU3RydWN0dXJlcyBmb3IgaW50ZXJmYWNpbmcgd2l0aCB0aGUgL3Byb2MgZmlsZXN5c3RlbS4KKyAqCVJvdXRlciBjcmVhdGVzIGl0cyBvd24gZGlyZWN0b3J5IC9wcm9jL25ldC9yb3V0ZXIgd2l0aCB0aGUgZm9sb3dpbmcKKyAqCWVudHJpZXM6CisgKgljb25maWcJCWRldmljZSBjb25maWd1cmF0aW9uCisgKglzdGF0dXMJCWdsb2JhbCBkZXZpY2Ugc3RhdGlzdGljcworICoJPGRldmljZT4JZW50cnkgZm9yIGVhY2ggV0FOIGRldmljZQorICovCisKKy8qCisgKglHZW5lcmljIC9wcm9jL25ldC9yb3V0ZXIvPGZpbGU+IGZpbGUgYW5kIGlub2RlIG9wZXJhdGlvbnMKKyAqLworCisvKgorICoJL3Byb2MvbmV0L3JvdXRlcgorICovCisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2Nfcm91dGVyOworCisvKiBTdHJpbmdzICovCisKKy8qCisgKglJbnRlcmZhY2UgZnVuY3Rpb25zCisgKi8KKworLyoqKioqKiBQcm9jIGZpbGVzeXN0ZW0gZW50cnkgcG9pbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglJdGVyYXRvcgorICovCitzdGF0aWMgdm9pZCAqcl9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXY7CisJbG9mZl90IGwgPSAqcG9zOworCisJbG9ja19rZXJuZWwoKTsKKwlpZiAoIWwtLSkKKwkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKKwlmb3IgKHdhbmRldiA9IHdhbnJvdXRlcl9yb3V0ZXJfZGV2bGlzdDsgbC0tICYmIHdhbmRldjsKKwkgICAgIHdhbmRldiA9IHdhbmRldi0+bmV4dCkKKwkJOworCXJldHVybiB3YW5kZXY7Cit9CisKK3N0YXRpYyB2b2lkICpyX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2ID0gdjsKKwkoKnBvcykrKzsKKwlyZXR1cm4gKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSA/IHdhbnJvdXRlcl9yb3V0ZXJfZGV2bGlzdCA6IHdhbmRldi0+bmV4dDsKK30KKworc3RhdGljIHZvaWQgcl9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwl1bmxvY2tfa2VybmVsKCk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXN0cnVjdCB3YW5fZGV2aWNlICpwID0gdjsKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJc2VxX3B1dHMobSwgIkRldmljZSBuYW1lICAgIHwgcG9ydCB8SVJRfERNQXwgIG1lbS5hZGRyICB8IgorCQkJICAgICJtZW0uc2l6ZXxvcHRpb24xfG9wdGlvbjJ8b3B0aW9uM3xvcHRpb240XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghcC0+c3RhdGUpCisJCXJldHVybiAwOworCXNlcV9wcmludGYobSwgIiUtMTVzfDB4JS00WHwlM3V8JTN1fCAweCUtOGxYIHwweCUtNlh8JTd1fCU3dXwlN3V8JTd1XG4iLAorCQkJcC0+bmFtZSwgcC0+aW9wb3J0LCBwLT5pcnEsIHAtPmRtYSwgcC0+bWFkZHIsIHAtPm1zaXplLAorCQkJcC0+aHdfb3B0WzBdLCBwLT5od19vcHRbMV0sIHAtPmh3X29wdFsyXSwgcC0+aHdfb3B0WzNdKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGF0dXNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJc3RydWN0IHdhbl9kZXZpY2UgKnAgPSB2OworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlzZXFfcHV0cyhtLCAiRGV2aWNlIG5hbWUgICAgfHByb3RvY29sfHN0YXRpb258aW50ZXJmYWNlfCIKKwkJCSAgICAiY2xvY2tpbmd8YmF1ZCByYXRlfCBNVFUgfG5kZXZ8bGluayBzdGF0ZVxuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXAtPnN0YXRlKQorCQlyZXR1cm4gMDsKKwlzZXFfcHJpbnRmKG0sICIlLTE1c3wlLThzfCAlLTdzfCAlLTlzfCUtOHN8JTl1fCU1dXwlM3UgfCIsCisJCXAtPm5hbWUsCisJCVBST1RfREVDT0RFKHAtPmNvbmZpZ19pZCksCisJCXAtPmNvbmZpZ19pZCA9PSBXQU5DT05GSUdfRlIgPworCQkJKHAtPnN0YXRpb24gPyAiTm9kZSIgOiAiQ1BFIikgOgorCQkJKHAtPmNvbmZpZ19pZCA9PSBXQU5DT05GSUdfWDI1ID8KKwkJCShwLT5zdGF0aW9uID8gIkRDRSIgOiAiRFRFIikgOgorCQkJKCJOL0EiKSksCisJCXAtPmludGVyZmFjZSA/ICJWLjM1IiA6ICJSUy0yMzIiLAorCQlwLT5jbG9ja2luZyA/ICJpbnRlcm5hbCIgOiAiZXh0ZXJuYWwiLAorCQlwLT5icHMsCisJCXAtPm10dSwKKwkJcC0+bmRldik7CisKKwlzd2l0Y2ggKHAtPnN0YXRlKSB7CisJY2FzZSBXQU5fVU5DT05GSUdVUkVEOgorCQlzZXFfcHJpbnRmKG0sICIlLTEyc1xuIiwgInVuY29uZmlndXJlZCIpOworCQlicmVhazsKKwljYXNlIFdBTl9ESVNDT05ORUNURUQ6CisJCXNlcV9wcmludGYobSwgIiUtMTJzXG4iLCAiZGlzY29ubmVjdGVkIik7CisJCWJyZWFrOworCWNhc2UgV0FOX0NPTk5FQ1RJTkc6CisJCXNlcV9wcmludGYobSwgIiUtMTJzXG4iLCAiY29ubmVjdGluZyIpOworCQlicmVhazsKKwljYXNlIFdBTl9DT05ORUNURUQ6CisJCXNlcV9wcmludGYobSwgIiUtMTJzXG4iLCAiY29ubmVjdGVkIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNlcV9wcmludGYobSwgIiUtMTJzXG4iLCAiaW52YWxpZCIpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgY29uZmlnX29wID0geworCS5zdGFydAk9IHJfc3RhcnQsCisJLm5leHQJPSByX25leHQsCisJLnN0b3AJPSByX3N0b3AsCisJLnNob3cJPSBjb25maWdfc2hvdywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgc3RhdHVzX29wID0geworCS5zdGFydAk9IHJfc3RhcnQsCisJLm5leHQJPSByX25leHQsCisJLnN0b3AJPSByX3N0b3AsCisJLnNob3cJPSBzdGF0dXNfc2hvdywKK307CisKK3N0YXRpYyBpbnQgY29uZmlnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZjb25maWdfb3ApOworfQorCitzdGF0aWMgaW50IHN0YXR1c19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmc3RhdHVzX29wKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY29uZmlnX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5vcGVuCSA9IGNvbmZpZ19vcGVuLAorCS5yZWFkCSA9IHNlcV9yZWFkLAorCS5sbHNlZWsJID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzdGF0dXNfZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLm9wZW4JID0gc3RhdHVzX29wZW4sCisJLnJlYWQJID0gc2VxX3JlYWQsCisJLmxsc2VlawkgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgd2FuZGV2X3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYgPSBtLT5wcml2YXRlOworCisJaWYgKHdhbmRldi0+bWFnaWMgIT0gUk9VVEVSX01BR0lDKQorCQlyZXR1cm4gMDsKKworCWlmICghd2FuZGV2LT5zdGF0ZSkgeworCQlzZXFfcHV0cyhtLCAiZGV2aWNlIGlzIG5vdCBjb25maWd1cmVkIVxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIFVwZGF0ZSBkZXZpY2Ugc3RhdGlzdGljcyAqLworCWlmICh3YW5kZXYtPnVwZGF0ZSkgeworCQlpbnQgZXJyID0gd2FuZGV2LT51cGRhdGUod2FuZGV2KTsKKwkJaWYgKGVyciA9PSAtRUFHQUlOKSB7CisJCQlzZXFfcHV0cyhtLCAiRGV2aWNlIGlzIGJ1c3khXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChlcnIpIHsKKwkJCXNlcV9wdXRzKG0sICJEZXZpY2UgaXMgbm90IGNvbmZpZ3VyZWQhXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJc2VxX3ByaW50ZihtLCBQUk9DX1NUQVRTX0ZPUk1BVCwKKwkJInRvdGFsIHBhY2tldHMgcmVjZWl2ZWQiLCB3YW5kZXYtPnN0YXRzLnJ4X3BhY2tldHMpOworCXNlcV9wcmludGYobSwgUFJPQ19TVEFUU19GT1JNQVQsCisJCSJ0b3RhbCBwYWNrZXRzIHRyYW5zbWl0dGVkIiwgd2FuZGV2LT5zdGF0cy50eF9wYWNrZXRzKTsKKwlzZXFfcHJpbnRmKG0sIFBST0NfU1RBVFNfRk9STUFULAorCQkidG90YWwgYnl0ZXMgcmVjZWl2ZWQiLCB3YW5kZXYtPnN0YXRzLnJ4X2J5dGVzKTsKKwlzZXFfcHJpbnRmKG0sIFBST0NfU1RBVFNfRk9STUFULAorCQkidG90YWwgYnl0ZXMgdHJhbnNtaXR0ZWQiLCB3YW5kZXYtPnN0YXRzLnR4X2J5dGVzKTsKKwlzZXFfcHJpbnRmKG0sIFBST0NfU1RBVFNfRk9STUFULAorCQkiYmFkIHBhY2tldHMgcmVjZWl2ZWQiLCB3YW5kZXYtPnN0YXRzLnJ4X2Vycm9ycyk7CisJc2VxX3ByaW50ZihtLCBQUk9DX1NUQVRTX0ZPUk1BVCwKKwkJInBhY2tldCB0cmFuc21pdCBwcm9ibGVtcyIsIHdhbmRldi0+c3RhdHMudHhfZXJyb3JzKTsKKwlzZXFfcHJpbnRmKG0sIFBST0NfU1RBVFNfRk9STUFULAorCQkicmVjZWl2ZWQgZnJhbWVzIGRyb3BwZWQiLCB3YW5kZXYtPnN0YXRzLnJ4X2Ryb3BwZWQpOworCXNlcV9wcmludGYobSwgUFJPQ19TVEFUU19GT1JNQVQsCisJCSJ0cmFuc21pdCBmcmFtZXMgZHJvcHBlZCIsIHdhbmRldi0+c3RhdHMudHhfZHJvcHBlZCk7CisJc2VxX3ByaW50ZihtLCBQUk9DX1NUQVRTX0ZPUk1BVCwKKwkJIm11bHRpY2FzdCBwYWNrZXRzIHJlY2VpdmVkIiwgd2FuZGV2LT5zdGF0cy5tdWx0aWNhc3QpOworCXNlcV9wcmludGYobSwgUFJPQ19TVEFUU19GT1JNQVQsCisJCSJ0cmFuc21pdCBjb2xsaXNpb25zIiwgd2FuZGV2LT5zdGF0cy5jb2xsaXNpb25zKTsKKwlzZXFfcHJpbnRmKG0sIFBST0NfU1RBVFNfRk9STUFULAorCQkicmVjZWl2ZSBsZW5ndGggZXJyb3JzIiwgd2FuZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKTsKKwlzZXFfcHJpbnRmKG0sIFBST0NfU1RBVFNfRk9STUFULAorCQkicmVjZWl2ZXIgb3ZlcnJ1biBlcnJvcnMiLCB3YW5kZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKTsKKwlzZXFfcHJpbnRmKG0sIFBST0NfU1RBVFNfRk9STUFULAorCQkiQ1JDIGVycm9ycyIsIHdhbmRldi0+c3RhdHMucnhfY3JjX2Vycm9ycyk7CisJc2VxX3ByaW50ZihtLCBQUk9DX1NUQVRTX0ZPUk1BVCwKKwkJImZyYW1lIGZvcm1hdCBlcnJvcnMgKGFib3J0cykiLCB3YW5kZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyk7CisJc2VxX3ByaW50ZihtLCBQUk9DX1NUQVRTX0ZPUk1BVCwKKwkJInJlY2VpdmVyIGZpZm8gb3ZlcnJ1biIsIHdhbmRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMpOworCXNlcV9wcmludGYobSwgUFJPQ19TVEFUU19GT1JNQVQsCisJCSJyZWNlaXZlciBtaXNzZWQgcGFja2V0Iiwgd2FuZGV2LT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzKTsKKwlzZXFfcHJpbnRmKG0sIFBST0NfU1RBVFNfRk9STUFULAorCQkiYWJvcnRlZCBmcmFtZXMgdHJhbnNtaXR0ZWQiLCB3YW5kZXYtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3YW5kZXZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgd2FuZGV2X3Nob3csIFBERShpbm9kZSktPmRhdGEpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3YW5kZXZfZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLm9wZW4JID0gd2FuZGV2X29wZW4sCisJLnJlYWQJID0gc2VxX3JlYWQsCisJLmxsc2VlawkgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKKwkuaW9jdGwJID0gd2Fucm91dGVyX2lvY3RsLAorfTsKKworLyoKKyAqCUluaXRpYWxpemUgcm91dGVyIHByb2MgaW50ZXJmYWNlLgorICovCisKK2ludCBfX2luaXQgd2Fucm91dGVyX3Byb2NfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcDsKKwlwcm9jX3JvdXRlciA9IHByb2NfbWtkaXIoUk9VVEVSX05BTUUsIHByb2NfbmV0KTsKKwlpZiAoIXByb2Nfcm91dGVyKQorCQlnb3RvIGZhaWw7CisKKwlwID0gY3JlYXRlX3Byb2NfZW50cnkoImNvbmZpZyIsIFNfSVJVR08sIHByb2Nfcm91dGVyKTsKKwlpZiAoIXApCisJCWdvdG8gZmFpbF9jb25maWc7CisJcC0+cHJvY19mb3BzID0gJmNvbmZpZ19mb3BzOworCXAgPSBjcmVhdGVfcHJvY19lbnRyeSgic3RhdHVzIiwgU19JUlVHTywgcHJvY19yb3V0ZXIpOworCWlmICghcCkKKwkJZ290byBmYWlsX3N0YXQ7CisJcC0+cHJvY19mb3BzID0gJnN0YXR1c19mb3BzOworCXJldHVybiAwOworZmFpbF9zdGF0OgorCXJlbW92ZV9wcm9jX2VudHJ5KCJjb25maWciLCBwcm9jX3JvdXRlcik7CitmYWlsX2NvbmZpZzoKKwlyZW1vdmVfcHJvY19lbnRyeShST1VURVJfTkFNRSwgcHJvY19uZXQpOworZmFpbDoKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoKKyAqCUNsZWFuIHVwIHJvdXRlciBwcm9jIGludGVyZmFjZS4KKyAqLworCit2b2lkIHdhbnJvdXRlcl9wcm9jX2NsZWFudXAodm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeSgiY29uZmlnIiwgcHJvY19yb3V0ZXIpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJzdGF0dXMiLCBwcm9jX3JvdXRlcik7CisJcmVtb3ZlX3Byb2NfZW50cnkoUk9VVEVSX05BTUUsIHByb2NfbmV0KTsKK30KKworLyoKKyAqCUFkZCBkaXJlY3RvcnkgZW50cnkgZm9yIFdBTiBkZXZpY2UuCisgKi8KKworaW50IHdhbnJvdXRlcl9wcm9jX2FkZChzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2KQoreworCWlmICh3YW5kZXYtPm1hZ2ljICE9IFJPVVRFUl9NQUdJQykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3YW5kZXYtPmRlbnQgPSBjcmVhdGVfcHJvY19lbnRyeSh3YW5kZXYtPm5hbWUsIFNfSVJVR08sIHByb2Nfcm91dGVyKTsKKwlpZiAoIXdhbmRldi0+ZGVudCkKKwkJcmV0dXJuIC1FTk9NRU07CisJd2FuZGV2LT5kZW50LT5wcm9jX2ZvcHMJPSAmd2FuZGV2X2ZvcHM7CisJd2FuZGV2LT5kZW50LT5kYXRhCT0gd2FuZGV2OworCXJldHVybiAwOworfQorCisvKgorICoJRGVsZXRlIGRpcmVjdG9yeSBlbnRyeSBmb3IgV0FOIGRldmljZS4KKyAqLworaW50IHdhbnJvdXRlcl9wcm9jX2RlbGV0ZShzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2KQoreworCWlmICh3YW5kZXYtPm1hZ2ljICE9IFJPVVRFUl9NQUdJQykKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmVtb3ZlX3Byb2NfZW50cnkod2FuZGV2LT5uYW1lLCBwcm9jX3JvdXRlcik7CisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisKKy8qCisgKglObyAvcHJvYyAtIG91dHB1dCBzdHVicworICovCisKK2ludCBfX2luaXQgd2Fucm91dGVyX3Byb2NfaW5pdCh2b2lkKQoreworCXJldHVybiAwOworfQorCit2b2lkIHdhbnJvdXRlcl9wcm9jX2NsZWFudXAodm9pZCkKK3sKK30KKworaW50IHdhbnJvdXRlcl9wcm9jX2FkZChzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2KQoreworCXJldHVybiAwOworfQorCitpbnQgd2Fucm91dGVyX3Byb2NfZGVsZXRlKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCisvKgorICoJRW5kCisgKi8KKwpkaWZmIC0tZ2l0IGEvbmV0L3gyNS9NYWtlZmlsZSBiL25ldC94MjUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg3YTcxYQotLS0gL2Rldi9udWxsCisrKyBiL25ldC94MjUvTWFrZWZpbGUKQEAgLTAsMCArMSwxMCBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IFguMjUgUGFja2V0IGxheWVyLgorIworCitvYmotJChDT05GSUdfWDI1KSArPSB4MjUubworCit4MjUteQkJCTo9IGFmX3gyNS5vIHgyNV9kZXYubyB4MjVfZmFjaWxpdGllcy5vIHgyNV9pbi5vIFwKKwkJCSAgIHgyNV9saW5rLm8geDI1X291dC5vIHgyNV9yb3V0ZS5vIHgyNV9zdWJyLm8gXAorCQkJICAgeDI1X3RpbWVyLm8geDI1X3Byb2MubworeDI1LSQoQ09ORklHX1NZU0NUTCkJKz0gc3lzY3RsX25ldF94MjUubwpkaWZmIC0tZ2l0IGEvbmV0L3gyNS9hZl94MjUuYyBiL25ldC94MjUvYWZfeDI1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEyNGIyNAotLS0gL2Rldi9udWxsCisrKyBiL25ldC94MjUvYWZfeDI1LmMKQEAgLTAsMCArMSwxNDM1IEBACisvKgorICoJWC4yNSBQYWNrZXQgTGF5ZXIgcmVsZWFzZSAwMDIKKyAqCisgKglUaGlzIGlzIEFMUEhBIHRlc3Qgc29mdHdhcmUuIFRoaXMgY29kZSBtYXkgYnJlYWsgeW91ciBtYWNoaW5lLAorICoJcmFuZG9tbHkgZmFpbCB0byB3b3JrIHdpdGggbmV3IHJlbGVhc2VzLCBtaXNiZWhhdmUgYW5kL29yIGdlbmVyYWxseQorICoJc2NyZXcgdXAuIEl0IG1pZ2h0IGV2ZW4gd29yay4gCisgKgorICoJVGhpcyBjb2RlIFJFUVVJUkVTIDIuMS4xNSBvciBoaWdoZXIKKyAqCisgKglUaGlzIG1vZHVsZToKKyAqCQlUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJSGlzdG9yeQorICoJWC4yNSAwMDEJSm9uYXRoYW4gTmF5bG9yCVN0YXJ0ZWQgY29kaW5nLgorICoJWC4yNSAwMDIJSm9uYXRoYW4gTmF5bG9yCUNlbnRyYWxpc2VkIGRpc2Nvbm5lY3QgaGFuZGxpbmcuCisgKgkJCQkJTmV3IHRpbWVyIGFyY2hpdGVjdHVyZS4KKyAqCTIwMDAtMDMtMTEJSGVubmVyIEVpc2VuCU1TR19FT1IgaGFuZGxpbmcgbW9yZSBQT1NJWCBjb21wbGlhbnQuCisgKgkyMDAwLTAzLTIyCURhbmllbGEgU3F1YXNzb25pIEFsbG93ZWQgZGlzYWJsaW5nL2VuYWJsaW5nIG9mIAorICoJCQkJCSAgZmFjaWxpdGllcyBuZWdvdGlhdGlvbiBhbmQgaW5jcmVhc2VkIAorICoJCQkJCSAgdGhlIHRocm91Z2hwdXQgdXBwZXIgbGltaXQuCisgKgkyMDAwLTA4LTI3CUFybmFsZG8gQy4gTWVsbyBzL3N1c2VyL2NhcGFibGUvICsgbWljcm8gY2xlYW51cHMKKyAqCTIwMDAtMDktMDQJSGVubmVyIEVpc2VuCVNldCBzb2NrLT5zdGF0ZSBpbiB4MjVfYWNjZXB0KCkuIAorICoJCQkJCUZpeGVkIHgyNV9vdXRwdXQoKSByZWxhdGVkIHNrYiBsZWFrYWdlLgorICoJMjAwMC0xMC0wMglIZW5uZXIgRWlzZW4JTWFkZSB4MjVfa2ljaygpIHNpbmdsZSB0aHJlYWRlZCBwZXIgc29ja2V0LgorICoJMjAwMC0xMC0yNwlIZW5uZXIgRWlzZW4gICAgTVNHX0RPTlRXQUlUIGZvciBmcmFnbWVudCBhbGxvY2F0aW9uLgorICoJMjAwMC0xMS0xNAlIZW5uZXIgRWlzZW4gICAgQ2xvc2luZyBkYXRhbGluayBmcm9tIE5FVERFVl9HT0lOR19ET1dOCisgKgkyMDAyLTEwLTA2CUFybmFsZG8gQy4gTWVsbyBHZXQgcmlkIG9mIGNsaS9zdGksIG1vdmUgcHJvYyBzdHVmZiB0bworICoJCQkJCXgyNV9wcm9jLmMsIHVzaW5nIHNlcV9maWxlCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC90ZXJtaW9zLmg+CS8qIEZvciBUSU9DSU5RL09VVFEgKi8KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxuZXQveDI1Lmg+CisKK2ludCBzeXNjdGxfeDI1X3Jlc3RhcnRfcmVxdWVzdF90aW1lb3V0ID0gWDI1X0RFRkFVTFRfVDIwOworaW50IHN5c2N0bF94MjVfY2FsbF9yZXF1ZXN0X3RpbWVvdXQgICAgPSBYMjVfREVGQVVMVF9UMjE7CitpbnQgc3lzY3RsX3gyNV9yZXNldF9yZXF1ZXN0X3RpbWVvdXQgICA9IFgyNV9ERUZBVUxUX1QyMjsKK2ludCBzeXNjdGxfeDI1X2NsZWFyX3JlcXVlc3RfdGltZW91dCAgID0gWDI1X0RFRkFVTFRfVDIzOworaW50IHN5c2N0bF94MjVfYWNrX2hvbGRiYWNrX3RpbWVvdXQgICAgPSBYMjVfREVGQVVMVF9UMjsKKworSExJU1RfSEVBRCh4MjVfbGlzdCk7CitERUZJTkVfUldMT0NLKHgyNV9saXN0X2xvY2spOworCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyB4MjVfcHJvdG9fb3BzOworCitzdGF0aWMgc3RydWN0IHgyNV9hZGRyZXNzIG51bGxfeDI1X2FkZHJlc3MgPSB7IiAgICAgICAgICAgICAgICJ9OworCitpbnQgeDI1X2FkZHJfbnRvYSh1bnNpZ25lZCBjaGFyICpwLCBzdHJ1Y3QgeDI1X2FkZHJlc3MgKmNhbGxlZF9hZGRyLAorCQkgIHN0cnVjdCB4MjVfYWRkcmVzcyAqY2FsbGluZ19hZGRyKQoreworCWludCBjYWxsZWRfbGVuLCBjYWxsaW5nX2xlbjsKKwljaGFyICpjYWxsZWQsICpjYWxsaW5nOworCWludCBpOworCisJY2FsbGVkX2xlbiAgPSAoKnAgPj4gMCkgJiAweDBGOworCWNhbGxpbmdfbGVuID0gKCpwID4+IDQpICYgMHgwRjsKKworCWNhbGxlZCAgPSBjYWxsZWRfYWRkci0+eDI1X2FkZHI7CisJY2FsbGluZyA9IGNhbGxpbmdfYWRkci0+eDI1X2FkZHI7CisJcCsrOworCisJZm9yIChpID0gMDsgaSA8IChjYWxsZWRfbGVuICsgY2FsbGluZ19sZW4pOyBpKyspIHsKKwkJaWYgKGkgPCBjYWxsZWRfbGVuKSB7CisJCQlpZiAoaSAlIDIgIT0gMCkgeworCQkJCSpjYWxsZWQrKyA9ICgoKnAgPj4gMCkgJiAweDBGKSArICcwJzsKKwkJCQlwKys7CisJCQl9IGVsc2UgeworCQkJCSpjYWxsZWQrKyA9ICgoKnAgPj4gNCkgJiAweDBGKSArICcwJzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChpICUgMiAhPSAwKSB7CisJCQkJKmNhbGxpbmcrKyA9ICgoKnAgPj4gMCkgJiAweDBGKSArICcwJzsKKwkJCQlwKys7CisJCQl9IGVsc2UgeworCQkJCSpjYWxsaW5nKysgPSAoKCpwID4+IDQpICYgMHgwRikgKyAnMCc7CisJCQl9CisJCX0KKwl9CisKKwkqY2FsbGVkID0gKmNhbGxpbmcgPSAnXDAnOworCisJcmV0dXJuIDEgKyAoY2FsbGVkX2xlbiArIGNhbGxpbmdfbGVuICsgMSkgLyAyOworfQorCitpbnQgeDI1X2FkZHJfYXRvbih1bnNpZ25lZCBjaGFyICpwLCBzdHJ1Y3QgeDI1X2FkZHJlc3MgKmNhbGxlZF9hZGRyLAorCQkgIHN0cnVjdCB4MjVfYWRkcmVzcyAqY2FsbGluZ19hZGRyKQoreworCXVuc2lnbmVkIGludCBjYWxsZWRfbGVuLCBjYWxsaW5nX2xlbjsKKwljaGFyICpjYWxsZWQsICpjYWxsaW5nOworCWludCBpOworCisJY2FsbGVkICA9IGNhbGxlZF9hZGRyLT54MjVfYWRkcjsKKwljYWxsaW5nID0gY2FsbGluZ19hZGRyLT54MjVfYWRkcjsKKworCWNhbGxlZF9sZW4gID0gc3RybGVuKGNhbGxlZCk7CisJY2FsbGluZ19sZW4gPSBzdHJsZW4oY2FsbGluZyk7CisKKwkqcCsrID0gKGNhbGxpbmdfbGVuIDw8IDQpIHwgKGNhbGxlZF9sZW4gPDwgMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgKGNhbGxlZF9sZW4gKyBjYWxsaW5nX2xlbik7IGkrKykgeworCQlpZiAoaSA8IGNhbGxlZF9sZW4pIHsKKwkJCWlmIChpICUgMiAhPSAwKSB7CisJCQkJKnAgfD0gKCpjYWxsZWQrKyAtICcwJykgPDwgMDsKKwkJCQlwKys7CisJCQl9IGVsc2UgeworCQkJCSpwID0gMHgwMDsKKwkJCQkqcCB8PSAoKmNhbGxlZCsrIC0gJzAnKSA8PCA0OworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGkgJSAyICE9IDApIHsKKwkJCQkqcCB8PSAoKmNhbGxpbmcrKyAtICcwJykgPDwgMDsKKwkJCQlwKys7CisJCQl9IGVsc2UgeworCQkJCSpwID0gMHgwMDsKKwkJCQkqcCB8PSAoKmNhbGxpbmcrKyAtICcwJykgPDwgNDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAxICsgKGNhbGxlZF9sZW4gKyBjYWxsaW5nX2xlbiArIDEpIC8gMjsKK30KKworLyoKKyAqCVNvY2tldCByZW1vdmFsIGR1cmluZyBhbiBpbnRlcnJ1cHQgaXMgbm93IHNhZmUuCisgKi8KK3N0YXRpYyB2b2lkIHgyNV9yZW1vdmVfc29ja2V0KHN0cnVjdCBzb2NrICpzaykKK3sKKwl3cml0ZV9sb2NrX2JoKCZ4MjVfbGlzdF9sb2NrKTsKKwlza19kZWxfbm9kZV9pbml0KHNrKTsKKwl3cml0ZV91bmxvY2tfYmgoJngyNV9saXN0X2xvY2spOworfQorCisvKgorICoJS2lsbCBhbGwgYm91bmQgc29ja2V0cyBvbiBhIGRyb3BwZWQgZGV2aWNlLgorICovCitzdGF0aWMgdm9pZCB4MjVfa2lsbF9ieV9kZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc29jayAqczsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCXdyaXRlX2xvY2tfYmgoJngyNV9saXN0X2xvY2spOworCisJc2tfZm9yX2VhY2gocywgbm9kZSwgJngyNV9saXN0KQorCQlpZiAoeDI1X3NrKHMpLT5uZWlnaGJvdXIgJiYgeDI1X3NrKHMpLT5uZWlnaGJvdXItPmRldiA9PSBkZXYpCisJCQl4MjVfZGlzY29ubmVjdChzLCBFTkVUVU5SRUFDSCwgMCwgMCk7CisKKwl3cml0ZV91bmxvY2tfYmgoJngyNV9saXN0X2xvY2spOworfQorCisvKgorICoJSGFuZGxlIGRldmljZSBzdGF0dXMgY2hhbmdlcy4KKyAqLworc3RhdGljIGludCB4MjVfZGV2aWNlX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBldmVudCwKKwkJCSAgICB2b2lkICpwdHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHB0cjsKKwlzdHJ1Y3QgeDI1X25laWdoICpuYjsKKworCWlmIChkZXYtPnR5cGUgPT0gQVJQSFJEX1gyNQorI2lmIGRlZmluZWQoQ09ORklHX0xMQykgfHwgZGVmaW5lZChDT05GSUdfTExDX01PRFVMRSkKKwkgfHwgZGV2LT50eXBlID09IEFSUEhSRF9FVEhFUgorI2VuZGlmCisJICkgeworCQlzd2l0Y2ggKGV2ZW50KSB7CisJCQljYXNlIE5FVERFVl9VUDoKKwkJCQl4MjVfbGlua19kZXZpY2VfdXAoZGV2KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTkVUREVWX0dPSU5HX0RPV046CisJCQkJbmIgPSB4MjVfZ2V0X25laWdoKGRldik7CisJCQkJaWYgKG5iKSB7CisJCQkJCXgyNV90ZXJtaW5hdGVfbGluayhuYik7CisJCQkJCXgyNV9uZWlnaF9wdXQobmIpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgTkVUREVWX0RPV046CisJCQkJeDI1X2tpbGxfYnlfZGV2aWNlKGRldik7CisJCQkJeDI1X3JvdXRlX2RldmljZV9kb3duKGRldik7CisJCQkJeDI1X2xpbmtfZGV2aWNlX2Rvd24oZGV2KTsKKwkJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworLyoKKyAqCUFkZCBhIHNvY2tldCB0byB0aGUgYm91bmQgc29ja2V0cyBsaXN0LgorICovCitzdGF0aWMgdm9pZCB4MjVfaW5zZXJ0X3NvY2tldChzdHJ1Y3Qgc29jayAqc2spCit7CisJd3JpdGVfbG9ja19iaCgmeDI1X2xpc3RfbG9jayk7CisJc2tfYWRkX25vZGUoc2ssICZ4MjVfbGlzdCk7CisJd3JpdGVfdW5sb2NrX2JoKCZ4MjVfbGlzdF9sb2NrKTsKK30KKworLyoKKyAqCUZpbmQgYSBzb2NrZXQgdGhhdCB3YW50cyB0byBhY2NlcHQgdGhlIENhbGwgUmVxdWVzdCB3ZSBqdXN0CisgKglyZWNlaXZlZC4gQ2hlY2sgdGhlIGZ1bGwgbGlzdCBmb3IgYW4gYWRkcmVzcy9jdWQgbWF0Y2guCisgKglJZiBubyBjdWRzIG1hdGNoIHJldHVybiB0aGUgbmV4dF9iZXN0IHRoaW5nLCBhbiBhZGRyZXNzIG1hdGNoLgorICoJTm90ZTogaWYgYSBsaXN0ZW5pbmcgc29ja2V0IGhhcyBjdWQgc2V0IGl0IG11c3Qgb25seSBnZXQgY2FsbHMKKyAqCXdpdGggbWF0Y2hpbmcgY3VkLgorICovCitzdGF0aWMgc3RydWN0IHNvY2sgKngyNV9maW5kX2xpc3RlbmVyKHN0cnVjdCB4MjVfYWRkcmVzcyAqYWRkciwgc3RydWN0IHgyNV9jYWxsdXNlcmRhdGEgKmNhbGx1c2VyZGF0YSkKK3sKKwlzdHJ1Y3Qgc29jayAqczsKKwlzdHJ1Y3Qgc29jayAqbmV4dF9iZXN0OworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJcmVhZF9sb2NrX2JoKCZ4MjVfbGlzdF9sb2NrKTsKKwluZXh0X2Jlc3QgPSBOVUxMOworCisJc2tfZm9yX2VhY2gocywgbm9kZSwgJngyNV9saXN0KQorCQlpZiAoKCFzdHJjbXAoYWRkci0+eDI1X2FkZHIsCisJCQkgICAgIHgyNV9zayhzKS0+c291cmNlX2FkZHIueDI1X2FkZHIpIHx8CisJCSAgICAgIXN0cmNtcChhZGRyLT54MjVfYWRkciwKKwkJCSAgICAgbnVsbF94MjVfYWRkcmVzcy54MjVfYWRkcikpICYmCisJCSAgICAgcy0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTikgeworCisJCQkvKgorCQkJICogRm91bmQgYSBsaXN0ZW5pbmcgc29ja2V0LCBub3cgY2hlY2sgdGhlIGluY29taW5nCisJCQkgKiBjYWxsIHVzZXIgZGF0YSB2cyB0aGlzIHNvY2tldHMgY2FsbCB1c2VyIGRhdGEKKwkJCSAqLworCQkJaWYgKHgyNV9jaGVja19jYWxsdXNlcmRhdGEoJngyNV9zayhzKS0+Y2FsbHVzZXJkYXRhLCBjYWxsdXNlcmRhdGEpKSB7CisJCQkJc29ja19ob2xkKHMpOworCQkJCWdvdG8gZm91bmQ7CisJCQl9CisJCQlpZiAoeDI1X3NrKHMpLT5jYWxsdXNlcmRhdGEuY3VkbGVuZ3RoID09IDApIHsKKwkJCQluZXh0X2Jlc3QgPSBzOworCQkJfQorCQl9CisJaWYgKG5leHRfYmVzdCkgeworCQlzID0gbmV4dF9iZXN0OworCQlzb2NrX2hvbGQocyk7CisJCWdvdG8gZm91bmQ7CisJfQorCXMgPSBOVUxMOworZm91bmQ6CisJcmVhZF91bmxvY2tfYmgoJngyNV9saXN0X2xvY2spOworCXJldHVybiBzOworfQorCisvKgorICoJRmluZCBhIGNvbm5lY3RlZCBYLjI1IHNvY2tldCBnaXZlbiBteSBMQ0kgYW5kIG5laWdoYm91ci4KKyAqLworc3RhdGljIHN0cnVjdCBzb2NrICpfX3gyNV9maW5kX3NvY2tldCh1bnNpZ25lZCBpbnQgbGNpLCBzdHJ1Y3QgeDI1X25laWdoICpuYikKK3sKKwlzdHJ1Y3Qgc29jayAqczsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCXNrX2Zvcl9lYWNoKHMsIG5vZGUsICZ4MjVfbGlzdCkKKwkJaWYgKHgyNV9zayhzKS0+bGNpID09IGxjaSAmJiB4MjVfc2socyktPm5laWdoYm91ciA9PSBuYikgeworCQkJc29ja19ob2xkKHMpOworCQkJZ290byBmb3VuZDsKKwkJfQorCXMgPSBOVUxMOworZm91bmQ6CisJcmV0dXJuIHM7Cit9CisKK3N0cnVjdCBzb2NrICp4MjVfZmluZF9zb2NrZXQodW5zaWduZWQgaW50IGxjaSwgc3RydWN0IHgyNV9uZWlnaCAqbmIpCit7CisJc3RydWN0IHNvY2sgKnM7CisKKwlyZWFkX2xvY2tfYmgoJngyNV9saXN0X2xvY2spOworCXMgPSBfX3gyNV9maW5kX3NvY2tldChsY2ksIG5iKTsKKwlyZWFkX3VubG9ja19iaCgmeDI1X2xpc3RfbG9jayk7CisJcmV0dXJuIHM7Cit9CisKKy8qCisgKglGaW5kIGEgdW5pcXVlIExDSSBmb3IgYSBnaXZlbiBkZXZpY2UuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgeDI1X25ld19sY2koc3RydWN0IHgyNV9uZWlnaCAqbmIpCit7CisJdW5zaWduZWQgaW50IGxjaSA9IDE7CisJc3RydWN0IHNvY2sgKnNrOworCisJcmVhZF9sb2NrX2JoKCZ4MjVfbGlzdF9sb2NrKTsKKworCXdoaWxlICgoc2sgPSBfX3gyNV9maW5kX3NvY2tldChsY2ksIG5iKSkgIT0gTlVMTCkgeworCQlzb2NrX3B1dChzayk7CisJCWlmICgrK2xjaSA9PSA0MDk2KSB7CisJCQlsY2kgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZWFkX3VubG9ja19iaCgmeDI1X2xpc3RfbG9jayk7CisJcmV0dXJuIGxjaTsKK30KKworLyoKKyAqCURlZmVycmVkIGRlc3Ryb3kuCisgKi8KK3ZvaWQgeDI1X2Rlc3Ryb3lfc29ja2V0KHN0cnVjdCBzb2NrICopOworCisvKgorICoJaGFuZGxlciBmb3IgZGVmZXJyZWQga2lsbHMuCisgKi8KK3N0YXRpYyB2b2lkIHgyNV9kZXN0cm95X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl4MjVfZGVzdHJveV9zb2NrZXQoKHN0cnVjdCBzb2NrICopZGF0YSk7Cit9CisKKy8qCisgKglUaGlzIGlzIGNhbGxlZCBmcm9tIHVzZXIgbW9kZSBhbmQgdGhlIHRpbWVycy4gVGh1cyBpdCBwcm90ZWN0cyBpdHNlbGYKKyAqCWFnYWluc3QgaW50ZXJydXB0IHVzZXJzIGJ1dCBkb2Vzbid0IHdvcnJ5IGFib3V0IGJlaW5nIGNhbGxlZCBkdXJpbmcKKyAqCXdvcmsuIE9uY2UgaXQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSBubyBpbnRlcnJ1cHQgb3IgYm90dG9tIGhhbGYKKyAqCXdpbGwgdG91Y2ggaXQgYW5kIHdlIGFyZSAoZmFpcmx5IDgtKSApIHNhZmUuCisgKglOb3Qgc3RhdGljIGFzIGl0J3MgdXNlZCBieSB0aGUgdGltZXIKKyAqLwordm9pZCB4MjVfZGVzdHJveV9zb2NrZXQoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlzb2NrX2hvbGQoc2spOworCWxvY2tfc29jayhzayk7CisJeDI1X3N0b3BfaGVhcnRiZWF0KHNrKTsKKwl4MjVfc3RvcF90aW1lcihzayk7CisKKwl4MjVfcmVtb3ZlX3NvY2tldChzayk7CisJeDI1X2NsZWFyX3F1ZXVlcyhzayk7CQkvKiBGbHVzaCB0aGUgcXVldWVzICovCisKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpICE9IE5VTEwpIHsKKwkJaWYgKHNrYi0+c2sgIT0gc2spIHsJCS8qIEEgcGVuZGluZyBjb25uZWN0aW9uICovCisJCQkvKgorCQkJICogUXVldWUgdGhlIHVuYWNjZXB0ZWQgc29ja2V0IGZvciBkZWF0aAorCQkJICovCisJCQlzb2NrX3NldF9mbGFnKHNrYi0+c2ssIFNPQ0tfREVBRCk7CisJCQl4MjVfc3RhcnRfaGVhcnRiZWF0KHNrYi0+c2spOworCQkJeDI1X3NrKHNrYi0+c2spLT5zdGF0ZSA9IFgyNV9TVEFURV8wOworCQl9CisKKwkJa2ZyZWVfc2tiKHNrYik7CisJfQorCisJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYykgfHwKKwkgICAgYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSkgeworCQkvKiBEZWZlcjogb3V0c3RhbmRpbmcgYnVmZmVycyAqLworCQlzay0+c2tfdGltZXIuZXhwaXJlcyAgPSBqaWZmaWVzICsgMTAgKiBIWjsKKwkJc2stPnNrX3RpbWVyLmZ1bmN0aW9uID0geDI1X2Rlc3Ryb3lfdGltZXI7CisJCXNrLT5za190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpc2s7CisJCWFkZF90aW1lcigmc2stPnNrX3RpbWVyKTsKKwl9IGVsc2UgeworCQkvKiBkcm9wIGxhc3QgcmVmZXJlbmNlIHNvIHNvY2tfcHV0IHdpbGwgZnJlZSAqLworCQlfX3NvY2tfcHV0KHNrKTsKKwl9CisKKwlyZWxlYXNlX3NvY2soc2spOworCXNvY2tfcHV0KHNrKTsKK30KKworLyoKKyAqCUhhbmRsaW5nIGZvciBzeXN0ZW0gY2FsbHMgYXBwbGllZCB2aWEgdGhlIHZhcmlvdXMgaW50ZXJmYWNlcyB0byBhCisgKglYLjI1IHNvY2tldCBvYmplY3QuCisgKi8KKworc3RhdGljIGludCB4MjVfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQoreworCWludCBvcHQ7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJaW50IHJjID0gLUVOT1BST1RPT1BUOworCisJaWYgKGxldmVsICE9IFNPTF9YMjUgfHwgb3B0bmFtZSAhPSBYMjVfUUJJVElOQ0wpCisJCWdvdG8gb3V0OworCisJcmMgPSAtRUlOVkFMOworCWlmIChvcHRsZW4gPCBzaXplb2YoaW50KSkKKwkJZ290byBvdXQ7CisKKwlyYyA9IC1FRkFVTFQ7CisJaWYgKGdldF91c2VyKG9wdCwgKGludCBfX3VzZXIgKilvcHR2YWwpKQorCQlnb3RvIG91dDsKKworCXgyNV9zayhzayktPnFiaXRpbmNsID0gISFvcHQ7CisJcmMgPSAwOworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB4MjVfZ2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJaW50IHZhbCwgbGVuLCByYyA9IC1FTk9QUk9UT09QVDsKKwkKKwlpZiAobGV2ZWwgIT0gU09MX1gyNSB8fCBvcHRuYW1lICE9IFgyNV9RQklUSU5DTCkKKwkJZ290byBvdXQ7CisKKwlyYyA9IC1FRkFVTFQ7CisJaWYgKGdldF91c2VyKGxlbiwgb3B0bGVuKSkKKwkJZ290byBvdXQ7CisKKwlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgc2l6ZW9mKGludCkpOworCisJcmMgPSAtRUlOVkFMOworCWlmIChsZW4gPCAwKQorCQlnb3RvIG91dDsKKwkJCisJcmMgPSAtRUZBVUxUOworCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpCisJCWdvdG8gb3V0OworCisJdmFsID0geDI1X3NrKHNrKS0+cWJpdGluY2w7CisJcmMgPSBjb3B5X3RvX3VzZXIob3B0dmFsLCAmdmFsLCBsZW4pID8gLUVGQVVMVCA6IDA7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHgyNV9saXN0ZW4oc3RydWN0IHNvY2tldCAqc29jaywgaW50IGJhY2tsb2cpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJaW50IHJjID0gLUVPUE5PVFNVUFA7CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9MSVNURU4pIHsKKwkJbWVtc2V0KCZ4MjVfc2soc2spLT5kZXN0X2FkZHIsIDAsIFgyNV9BRERSX0xFTik7CisJCXNrLT5za19tYXhfYWNrX2JhY2tsb2cgPSBiYWNrbG9nOworCQlzay0+c2tfc3RhdGUgICAgICAgICAgID0gVENQX0xJU1RFTjsKKwkJcmMgPSAwOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBwcm90byB4MjVfcHJvdG8gPSB7CisJLm5hbWUJICA9ICJYMjUiLAorCS5vd25lcgkgID0gVEhJU19NT0RVTEUsCisJLm9ial9zaXplID0gc2l6ZW9mKHN0cnVjdCB4MjVfc29jayksCit9OworCitzdGF0aWMgc3RydWN0IHNvY2sgKngyNV9hbGxvY19zb2NrZXQodm9pZCkKK3sKKwlzdHJ1Y3QgeDI1X3NvY2sgKngyNTsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBza19hbGxvYyhBRl9YMjUsIEdGUF9BVE9NSUMsICZ4MjVfcHJvdG8sIDEpOworCisJaWYgKCFzaykKKwkJZ290byBvdXQ7CisKKwlzb2NrX2luaXRfZGF0YShOVUxMLCBzayk7CisKKwl4MjUgPSB4MjVfc2soc2spOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJngyNS0+YWNrX3F1ZXVlKTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZ4MjUtPmZyYWdtZW50X3F1ZXVlKTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZ4MjUtPmludGVycnVwdF9pbl9xdWV1ZSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmeDI1LT5pbnRlcnJ1cHRfb3V0X3F1ZXVlKTsKK291dDoKKwlyZXR1cm4gc2s7Cit9CisKK3ZvaWQgeDI1X2luaXRfdGltZXJzKHN0cnVjdCBzb2NrICpzayk7CisKK3N0YXRpYyBpbnQgeDI1X2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgcHJvdG9jb2wpCit7CisJc3RydWN0IHNvY2sgKnNrOworCXN0cnVjdCB4MjVfc29jayAqeDI1OworCWludCByYyA9IC1FU09DS1ROT1NVUFBPUlQ7CisKKwlpZiAoc29jay0+dHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCB8fCBwcm90b2NvbCkKKwkJZ290byBvdXQ7CisKKwlyYyA9IC1FTk9NRU07CisJaWYgKChzayA9IHgyNV9hbGxvY19zb2NrZXQoKSkgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwl4MjUgPSB4MjVfc2soc2spOworCisJc29ja19pbml0X2RhdGEoc29jaywgc2spOworCisJeDI1X2luaXRfdGltZXJzKHNrKTsKKworCXNvY2stPm9wcyAgICA9ICZ4MjVfcHJvdG9fb3BzOworCXNrLT5za19wcm90b2NvbCA9IHByb3RvY29sOworCXNrLT5za19iYWNrbG9nX3JjdiA9IHgyNV9iYWNrbG9nX3JjdjsKKworCXgyNS0+dDIxICAgPSBzeXNjdGxfeDI1X2NhbGxfcmVxdWVzdF90aW1lb3V0OworCXgyNS0+dDIyICAgPSBzeXNjdGxfeDI1X3Jlc2V0X3JlcXVlc3RfdGltZW91dDsKKwl4MjUtPnQyMyAgID0gc3lzY3RsX3gyNV9jbGVhcl9yZXF1ZXN0X3RpbWVvdXQ7CisJeDI1LT50MiAgICA9IHN5c2N0bF94MjVfYWNrX2hvbGRiYWNrX3RpbWVvdXQ7CisJeDI1LT5zdGF0ZSA9IFgyNV9TVEFURV8wOworCisJeDI1LT5mYWNpbGl0aWVzLndpbnNpemVfaW4gID0gWDI1X0RFRkFVTFRfV0lORE9XX1NJWkU7CisJeDI1LT5mYWNpbGl0aWVzLndpbnNpemVfb3V0ID0gWDI1X0RFRkFVTFRfV0lORE9XX1NJWkU7CisJeDI1LT5mYWNpbGl0aWVzLnBhY3NpemVfaW4gID0gWDI1X0RFRkFVTFRfUEFDS0VUX1NJWkU7CisJeDI1LT5mYWNpbGl0aWVzLnBhY3NpemVfb3V0ID0gWDI1X0RFRkFVTFRfUEFDS0VUX1NJWkU7CisJeDI1LT5mYWNpbGl0aWVzLnRocm91Z2hwdXQgID0gWDI1X0RFRkFVTFRfVEhST1VHSFBVVDsKKwl4MjUtPmZhY2lsaXRpZXMucmV2ZXJzZSAgICAgPSBYMjVfREVGQVVMVF9SRVZFUlNFOworCXJjID0gMDsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqeDI1X21ha2VfbmV3KHN0cnVjdCBzb2NrICpvc2spCit7CisJc3RydWN0IHNvY2sgKnNrID0gTlVMTDsKKwlzdHJ1Y3QgeDI1X3NvY2sgKngyNSwgKm94MjU7CisKKwlpZiAob3NrLT5za190eXBlICE9IFNPQ0tfU0VRUEFDS0VUKQorCQlnb3RvIG91dDsKKworCWlmICgoc2sgPSB4MjVfYWxsb2Nfc29ja2V0KCkpID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJeDI1ID0geDI1X3NrKHNrKTsKKworCXNrLT5za190eXBlICAgICAgICA9IG9zay0+c2tfdHlwZTsKKwlzay0+c2tfc29ja2V0ICAgICAgPSBvc2stPnNrX3NvY2tldDsKKwlzay0+c2tfcHJpb3JpdHkgICAgPSBvc2stPnNrX3ByaW9yaXR5OworCXNrLT5za19wcm90b2NvbCAgICA9IG9zay0+c2tfcHJvdG9jb2w7CisJc2stPnNrX3JjdmJ1ZiAgICAgID0gb3NrLT5za19yY3ZidWY7CisJc2stPnNrX3NuZGJ1ZiAgICAgID0gb3NrLT5za19zbmRidWY7CisJc2stPnNrX3N0YXRlICAgICAgID0gVENQX0VTVEFCTElTSEVEOworCXNrLT5za19zbGVlcCAgICAgICA9IG9zay0+c2tfc2xlZXA7CisJc2stPnNrX2JhY2tsb2dfcmN2ID0gb3NrLT5za19iYWNrbG9nX3JjdjsKKworCWlmIChzb2NrX2ZsYWcob3NrLCBTT0NLX1pBUFBFRCkpCisJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKwkKKwlpZiAoc29ja19mbGFnKG9zaywgU09DS19EQkcpKQorCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX0RCRyk7CisKKwlveDI1ID0geDI1X3NrKG9zayk7CisJeDI1LT50MjEgICAgICAgID0gb3gyNS0+dDIxOworCXgyNS0+dDIyICAgICAgICA9IG94MjUtPnQyMjsKKwl4MjUtPnQyMyAgICAgICAgPSBveDI1LT50MjM7CisJeDI1LT50MiAgICAgICAgID0gb3gyNS0+dDI7CisJeDI1LT5mYWNpbGl0aWVzID0gb3gyNS0+ZmFjaWxpdGllczsKKwl4MjUtPnFiaXRpbmNsICAgPSBveDI1LT5xYml0aW5jbDsKKworCXgyNV9pbml0X3RpbWVycyhzayk7CitvdXQ6CisJcmV0dXJuIHNrOworfQorCitzdGF0aWMgaW50IHgyNV9yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHgyNV9zb2NrICp4MjU7CisKKwlpZiAoIXNrKQorCQlnb3RvIG91dDsKKworCXgyNSA9IHgyNV9zayhzayk7CisKKwlzd2l0Y2ggKHgyNS0+c3RhdGUpIHsKKworCQljYXNlIFgyNV9TVEFURV8wOgorCQljYXNlIFgyNV9TVEFURV8yOgorCQkJeDI1X2Rpc2Nvbm5lY3Qoc2ssIDAsIDAsIDApOworCQkJeDI1X2Rlc3Ryb3lfc29ja2V0KHNrKTsKKwkJCWdvdG8gb3V0OworCisJCWNhc2UgWDI1X1NUQVRFXzE6CisJCWNhc2UgWDI1X1NUQVRFXzM6CisJCWNhc2UgWDI1X1NUQVRFXzQ6CisJCQl4MjVfY2xlYXJfcXVldWVzKHNrKTsKKwkJCXgyNV93cml0ZV9pbnRlcm5hbChzaywgWDI1X0NMRUFSX1JFUVVFU1QpOworCQkJeDI1X3N0YXJ0X3QyM3RpbWVyKHNrKTsKKwkJCXgyNS0+c3RhdGUgPSBYMjVfU1RBVEVfMjsKKwkJCXNrLT5za19zdGF0ZQk9IFRDUF9DTE9TRTsKKwkJCXNrLT5za19zaHV0ZG93bgl8PSBTRU5EX1NIVVRET1dOOworCQkJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisJCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX0RFQUQpOworCQkJc29ja19zZXRfZmxhZyhzaywgU09DS19ERVNUUk9ZKTsKKwkJCWJyZWFrOworCX0KKworCXNvY2stPnNrCT0gTlVMTDsJCisJc2stPnNrX3NvY2tldAk9IE5VTEw7CS8qIE5vdCB1c2VkLCBidXQgd2Ugc2hvdWxkIGRvIHRoaXMgKi8KK291dDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4MjVfYmluZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLCBpbnQgYWRkcl9sZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHNvY2thZGRyX3gyNSAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfeDI1ICopdWFkZHI7CisKKwlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19aQVBQRUQpIHx8CisJICAgIGFkZHJfbGVuICE9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfeDI1KSB8fAorCSAgICBhZGRyLT5zeDI1X2ZhbWlseSAhPSBBRl9YMjUpCisJCXJldHVybiAtRUlOVkFMOworCisJeDI1X3NrKHNrKS0+c291cmNlX2FkZHIgPSBhZGRyLT5zeDI1X2FkZHI7CisJeDI1X2luc2VydF9zb2NrZXQoc2spOworCXNvY2tfcmVzZXRfZmxhZyhzaywgU09DS19aQVBQRUQpOworCVNPQ0tfREVCVUcoc2ssICJ4MjVfYmluZDogc29ja2V0IGlzIGJvdW5kXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHgyNV93YWl0X2Zvcl9jb25uZWN0aW9uX2VzdGFibGlzaG1lbnQoc3RydWN0IHNvY2sgKnNrKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworICAgICAgICBpbnQgcmM7CisKKwlhZGRfd2FpdF9xdWV1ZV9leGNsdXNpdmUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJZm9yICg7OykgeworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXJjID0gLUVSRVNUQVJUU1lTOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJcmMgPSBzb2NrX2Vycm9yKHNrKTsKKwkJaWYgKHJjKSB7CisJCQlzay0+c2tfc29ja2V0LT5zdGF0ZSA9IFNTX1VOQ09OTkVDVEVEOworCQkJYnJlYWs7CisJCX0KKwkJcmMgPSAwOworCQlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkgeworCQkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJCXNjaGVkdWxlKCk7CisJCQlsb2NrX3NvY2soc2spOworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0KKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHgyNV9jb25uZWN0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsCisJCSAgICAgICBpbnQgYWRkcl9sZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgeDI1X3NvY2sgKngyNSA9IHgyNV9zayhzayk7CisJc3RydWN0IHNvY2thZGRyX3gyNSAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfeDI1ICopdWFkZHI7CisJc3RydWN0IHgyNV9yb3V0ZSAqcnQ7CisJaW50IHJjID0gMDsKKworCWxvY2tfc29jayhzayk7CisJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfRVNUQUJMSVNIRUQgJiYgc29jay0+c3RhdGUgPT0gU1NfQ09OTkVDVElORykgeworCQlzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKwkJZ290byBvdXQ7IC8qIENvbm5lY3QgY29tcGxldGVkIGR1cmluZyBhIEVSRVNUQVJUU1lTIGV2ZW50ICovCisJfQorCisJcmMgPSAtRUNPTk5SRUZVU0VEOworCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0NMT1NFICYmIHNvY2stPnN0YXRlID09IFNTX0NPTk5FQ1RJTkcpIHsKKwkJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKKwkJZ290byBvdXQ7CisJfQorCisJcmMgPSAtRUlTQ09OTjsJLyogTm8gcmVjb25uZWN0IG9uIGEgc2VxcGFja2V0IHNvY2tldCAqLworCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0VTVEFCTElTSEVEKQorCQlnb3RvIG91dDsKKworCXNrLT5za19zdGF0ZSAgID0gVENQX0NMT1NFOwkKKwlzb2NrLT5zdGF0ZSA9IFNTX1VOQ09OTkVDVEVEOworCisJcmMgPSAtRUlOVkFMOworCWlmIChhZGRyX2xlbiAhPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3gyNSkgfHwKKwkgICAgYWRkci0+c3gyNV9mYW1pbHkgIT0gQUZfWDI1KQorCQlnb3RvIG91dDsKKworCXJjID0gLUVORVRVTlJFQUNIOworCXJ0ID0geDI1X2dldF9yb3V0ZSgmYWRkci0+c3gyNV9hZGRyKTsKKwlpZiAoIXJ0KQorCQlnb3RvIG91dDsKKworCXgyNS0+bmVpZ2hib3VyID0geDI1X2dldF9uZWlnaChydC0+ZGV2KTsKKwlpZiAoIXgyNS0+bmVpZ2hib3VyKQorCQlnb3RvIG91dF9wdXRfcm91dGU7CisKKwl4MjVfbGltaXRfZmFjaWxpdGllcygmeDI1LT5mYWNpbGl0aWVzLCB4MjUtPm5laWdoYm91cik7CisKKwl4MjUtPmxjaSA9IHgyNV9uZXdfbGNpKHgyNS0+bmVpZ2hib3VyKTsKKwlpZiAoIXgyNS0+bGNpKQorCQlnb3RvIG91dF9wdXRfbmVpZ2g7CisKKwlyYyA9IC1FSU5WQUw7CisJaWYgKHNvY2tfZmxhZyhzaywgU09DS19aQVBQRUQpKSAvKiBNdXN0IGJpbmQgZmlyc3QgLSBhdXRvYmluZGluZyBkb2VzIG5vdCB3b3JrICovCisJCWdvdG8gb3V0X3B1dF9uZWlnaDsKKworCWlmICghc3RyY21wKHgyNS0+c291cmNlX2FkZHIueDI1X2FkZHIsIG51bGxfeDI1X2FkZHJlc3MueDI1X2FkZHIpKQorCQltZW1zZXQoJngyNS0+c291cmNlX2FkZHIsICdcMCcsIFgyNV9BRERSX0xFTik7CisKKwl4MjUtPmRlc3RfYWRkciA9IGFkZHItPnN4MjVfYWRkcjsKKworCS8qIE1vdmUgdG8gY29ubmVjdGluZyBzb2NrZXQsIHN0YXJ0IHNlbmRpbmcgQ29ubmVjdCBSZXF1ZXN0cyAqLworCXNvY2stPnN0YXRlICAgPSBTU19DT05ORUNUSU5HOworCXNrLT5za19zdGF0ZSAgPSBUQ1BfU1lOX1NFTlQ7CisKKwl4MjUtPnN0YXRlID0gWDI1X1NUQVRFXzE7CisKKwl4MjVfd3JpdGVfaW50ZXJuYWwoc2ssIFgyNV9DQUxMX1JFUVVFU1QpOworCisJeDI1X3N0YXJ0X2hlYXJ0YmVhdChzayk7CisJeDI1X3N0YXJ0X3QyMXRpbWVyKHNrKTsKKworCS8qIE5vdyB0aGUgbG9vcCAqLworCXJjID0gLUVJTlBST0dSRVNTOworCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEICYmIChmbGFncyAmIE9fTk9OQkxPQ0spKQorCQlnb3RvIG91dF9wdXRfbmVpZ2g7CisKKwlyYyA9IHgyNV93YWl0X2Zvcl9jb25uZWN0aW9uX2VzdGFibGlzaG1lbnQoc2spOworCWlmIChyYykKKwkJZ290byBvdXRfcHV0X25laWdoOworCisJc29jay0+c3RhdGUgPSBTU19DT05ORUNURUQ7CisJcmMgPSAwOworb3V0X3B1dF9uZWlnaDoKKwlpZiAocmMpCisJCXgyNV9uZWlnaF9wdXQoeDI1LT5uZWlnaGJvdXIpOworb3V0X3B1dF9yb3V0ZToKKwl4MjVfcm91dGVfcHV0KHJ0KTsKK291dDoKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB4MjVfd2FpdF9mb3JfZGF0YShzdHJ1Y3Qgc29jayAqc2ssIGludCB0aW1lb3V0KQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCWludCByYyA9IDA7CisKKwlhZGRfd2FpdF9xdWV1ZV9leGNsdXNpdmUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJZm9yICg7OykgeworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmIChzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pCisJCQlicmVhazsKKwkJcmMgPSAtRVJFU1RBUlRTWVM7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCQlyYyA9IC1FQUdBSU47CisJCWlmICghdGltZW91dCkKKwkJCWJyZWFrOworCQlyYyA9IDA7CisJCWlmIChza2JfcXVldWVfZW1wdHkoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSkgeworCQkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworCQkJbG9ja19zb2NrKHNrKTsKKwkJfSBlbHNlCisJCQlicmVhazsKKwl9CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOworCXJldHVybiByYzsKK30KKwkKK3N0YXRpYyBpbnQgeDI1X2FjY2VwdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2V0ICpuZXdzb2NrLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHNvY2sgKm5ld3NrOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHJjID0gLUVJTlZBTDsKKworCWlmICghc2sgfHwgc2stPnNrX3N0YXRlICE9IFRDUF9MSVNURU4pCisJCWdvdG8gb3V0OworCisJcmMgPSAtRU9QTk9UU1VQUDsKKwlpZiAoc2stPnNrX3R5cGUgIT0gU09DS19TRVFQQUNLRVQpCisJCWdvdG8gb3V0OworCisJbG9ja19zb2NrKHNrKTsKKwlyYyA9IHgyNV93YWl0X2Zvcl9kYXRhKHNrLCBzay0+c2tfcmN2dGltZW8pOworCWlmIChyYykKKwkJZ290byBvdXQyOworCXNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJcmMgPSAtRUlOVkFMOworCWlmICghc2tiLT5zaykKKwkJZ290byBvdXQyOworCW5ld3NrCQkgPSBza2ItPnNrOworCW5ld3NrLT5za19zb2NrZXQgPSBuZXdzb2NrOworCW5ld3NrLT5za19zbGVlcCAgPSAmbmV3c29jay0+d2FpdDsKKworCS8qIE5vdyBhdHRhY2ggdXAgdGhlIG5ldyBzb2NrZXQgKi8KKwlza2ItPnNrID0gTlVMTDsKKwlrZnJlZV9za2Ioc2tiKTsKKwlzay0+c2tfYWNrX2JhY2tsb2ctLTsKKwluZXdzb2NrLT5zayAgICA9IG5ld3NrOworCW5ld3NvY2stPnN0YXRlID0gU1NfQ09OTkVDVEVEOworCXJjID0gMDsKK291dDI6CisJcmVsZWFzZV9zb2NrKHNrKTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgeDI1X2dldG5hbWUoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwKKwkJICAgICAgIGludCAqdWFkZHJfbGVuLCBpbnQgcGVlcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfeDI1ICpzeDI1ID0gKHN0cnVjdCBzb2NrYWRkcl94MjUgKil1YWRkcjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgeDI1X3NvY2sgKngyNSA9IHgyNV9zayhzayk7CisKKwlpZiAocGVlcikgeworCQlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkKKwkJCXJldHVybiAtRU5PVENPTk47CisJCXN4MjUtPnN4MjVfYWRkciA9IHgyNS0+ZGVzdF9hZGRyOworCX0gZWxzZQorCQlzeDI1LT5zeDI1X2FkZHIgPSB4MjUtPnNvdXJjZV9hZGRyOworCisJc3gyNS0+c3gyNV9mYW1pbHkgPSBBRl9YMjU7CisJKnVhZGRyX2xlbiA9IHNpemVvZigqc3gyNSk7CisKKwlyZXR1cm4gMDsKK30KKyAKK2ludCB4MjVfcnhfY2FsbF9yZXF1ZXN0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB4MjVfbmVpZ2ggKm5iLAorCQkJdW5zaWduZWQgaW50IGxjaSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IHNvY2sgKm1ha2U7CisJc3RydWN0IHgyNV9zb2NrICptYWtleDI1OworCXN0cnVjdCB4MjVfYWRkcmVzcyBzb3VyY2VfYWRkciwgZGVzdF9hZGRyOworCXN0cnVjdCB4MjVfZmFjaWxpdGllcyBmYWNpbGl0aWVzOworCXN0cnVjdCB4MjVfY2FsbHVzZXJkYXRhIGNhbGx1c2VyZGF0YTsKKwlpbnQgbGVuLCByYzsKKworCS8qCisJICoJUmVtb3ZlIHRoZSBMQ0kgYW5kIGZyYW1lIHR5cGUuCisJICovCisJc2tiX3B1bGwoc2tiLCBYMjVfU1REX01JTl9MRU4pOworCisJLyoKKwkgKglFeHRyYWN0IHRoZSBYLjI1IGFkZHJlc3NlcyBhbmQgY29udmVydCB0aGVtIHRvIEFTQ0lJIHN0cmluZ3MsCisJICoJYW5kIHJlbW92ZSB0aGVtLgorCSAqLworCXNrYl9wdWxsKHNrYiwgeDI1X2FkZHJfbnRvYShza2ItPmRhdGEsICZzb3VyY2VfYWRkciwgJmRlc3RfYWRkcikpOworCisJLyoKKwkgKglHZXQgdGhlIGxlbmd0aCBvZiB0aGUgZmFjaWxpdGllcywgc2tpcCBwYXN0IHRoZW0gZm9yIHRoZSBtb21lbnQKKwkgKglnZXQgdGhlIGNhbGwgdXNlciBkYXRhIGJlY2F1c2UgdGhpcyBpcyBuZWVkZWQgdG8gZGV0ZXJtaW5lCisJICoJdGhlIGNvcnJlY3QgbGlzdGVuZXIKKwkgKi8KKwlsZW4gPSBza2ItPmRhdGFbMF0gKyAxOworCXNrYl9wdWxsKHNrYixsZW4pOworCisJLyoKKwkgKglJbmNvbWluZyBDYWxsIFVzZXIgRGF0YS4KKwkgKi8KKwlpZiAoc2tiLT5sZW4gPj0gMCkgeworCQltZW1jcHkoY2FsbHVzZXJkYXRhLmN1ZGRhdGEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQljYWxsdXNlcmRhdGEuY3VkbGVuZ3RoID0gc2tiLT5sZW47CisJfQorCisJc2tiX3B1c2goc2tiLGxlbik7CisKKwkvKgorCSAqCUZpbmQgYSBsaXN0ZW5lciBmb3IgdGhlIHBhcnRpY3VsYXIgYWRkcmVzcy9jdWQgcGFpci4KKwkgKi8KKwlzayA9IHgyNV9maW5kX2xpc3RlbmVyKCZzb3VyY2VfYWRkciwmY2FsbHVzZXJkYXRhKTsKKworCS8qCisJICoJV2UgY2FuJ3QgYWNjZXB0IHRoZSBDYWxsIFJlcXVlc3QuCisJICovCisJaWYgKHNrID09IE5VTEwgfHwgc2tfYWNjZXB0cV9pc19mdWxsKHNrKSkKKwkJZ290byBvdXRfY2xlYXJfcmVxdWVzdDsKKworCS8qCisJICoJVHJ5IHRvIHJlYWNoIGEgY29tcHJvbWlzZSBvbiB0aGUgcmVxdWVzdGVkIGZhY2lsaXRpZXMuCisJICovCisJaWYgKChsZW4gPSB4MjVfbmVnb3RpYXRlX2ZhY2lsaXRpZXMoc2tiLCBzaywgJmZhY2lsaXRpZXMpKSA9PSAtMSkKKwkJZ290byBvdXRfc29ja19wdXQ7CisKKwkvKgorCSAqIGN1cnJlbnQgbmVpZ2hib3VyL2xpbmsgbWlnaHQgaW1wb3NlIGFkZGl0aW9uYWwgbGltaXRzCisJICogb24gY2VydGFpbiBmYWNpbHRpZXMKKwkgKi8KKworCXgyNV9saW1pdF9mYWNpbGl0aWVzKCZmYWNpbGl0aWVzLCBuYik7CisKKwkvKgorCSAqCVRyeSB0byBjcmVhdGUgYSBuZXcgc29ja2V0LgorCSAqLworCW1ha2UgPSB4MjVfbWFrZV9uZXcoc2spOworCWlmICghbWFrZSkKKwkJZ290byBvdXRfc29ja19wdXQ7CisKKwkvKgorCSAqCVJlbW92ZSB0aGUgZmFjaWxpdGllcworCSAqLworCXNrYl9wdWxsKHNrYiwgbGVuKTsKKworCXNrYi0+c2sgICAgID0gbWFrZTsKKwltYWtlLT5za19zdGF0ZSA9IFRDUF9FU1RBQkxJU0hFRDsKKworCW1ha2V4MjUgPSB4MjVfc2sobWFrZSk7CisJbWFrZXgyNS0+bGNpICAgICAgICAgICA9IGxjaTsKKwltYWtleDI1LT5kZXN0X2FkZHIgICAgID0gZGVzdF9hZGRyOworCW1ha2V4MjUtPnNvdXJjZV9hZGRyICAgPSBzb3VyY2VfYWRkcjsKKwltYWtleDI1LT5uZWlnaGJvdXIgICAgID0gbmI7CisJbWFrZXgyNS0+ZmFjaWxpdGllcyAgICA9IGZhY2lsaXRpZXM7CisJbWFrZXgyNS0+dmNfZmFjaWxfbWFzayA9IHgyNV9zayhzayktPnZjX2ZhY2lsX21hc2s7CisJbWFrZXgyNS0+Y2FsbHVzZXJkYXRhICA9IGNhbGx1c2VyZGF0YTsKKworCXgyNV93cml0ZV9pbnRlcm5hbChtYWtlLCBYMjVfQ0FMTF9BQ0NFUFRFRCk7CisKKwltYWtleDI1LT5zdGF0ZSA9IFgyNV9TVEFURV8zOworCisJc2stPnNrX2Fja19iYWNrbG9nKys7CisKKwl4MjVfaW5zZXJ0X3NvY2tldChtYWtlKTsKKworCXNrYl9xdWV1ZV9oZWFkKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKKworCXgyNV9zdGFydF9oZWFydGJlYXQobWFrZSk7CisKKwlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkKKwkJc2stPnNrX2RhdGFfcmVhZHkoc2ssIHNrYi0+bGVuKTsKKwlyYyA9IDE7CisJc29ja19wdXQoc2spOworb3V0OgorCXJldHVybiByYzsKK291dF9zb2NrX3B1dDoKKwlzb2NrX3B1dChzayk7CitvdXRfY2xlYXJfcmVxdWVzdDoKKwlyYyA9IDA7CisJeDI1X3RyYW5zbWl0X2NsZWFyX3JlcXVlc3QobmIsIGxjaSwgMHgwMSk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBpbnQgeDI1X3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkgICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCB4MjVfc29jayAqeDI1ID0geDI1X3NrKHNrKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfeDI1ICp1c3gyNSA9IChzdHJ1Y3Qgc29ja2FkZHJfeDI1ICopbXNnLT5tc2dfbmFtZTsKKwlzdHJ1Y3Qgc29ja2FkZHJfeDI1IHN4MjU7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyICphc21wdHI7CisJaW50IG5vYmxvY2sgPSBtc2ctPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVDsKKwlzaXplX3Qgc2l6ZTsKKwlpbnQgcWJpdCA9IDAsIHJjID0gLUVJTlZBTDsKKworCWlmIChtc2ctPm1zZ19mbGFncyAmIH4oTVNHX0RPTlRXQUlUfE1TR19PT0J8TVNHX0VPUnxNU0dfQ01TR19DT01QQVQpKQorCQlnb3RvIG91dDsKKworCS8qIHdlIGN1cnJlbnRseSBkb24ndCBzdXBwb3J0IHNlZ21lbnRlZCByZWNvcmRzIGF0IHRoZSB1c2VyIGludGVyZmFjZSAqLworCWlmICghKG1zZy0+bXNnX2ZsYWdzICYgKE1TR19FT1J8TVNHX09PQikpKQorCQlnb3RvIG91dDsKKworCXJjID0gLUVBRERSTk9UQVZBSUw7CisJaWYgKHNvY2tfZmxhZyhzaywgU09DS19aQVBQRUQpKQorCQlnb3RvIG91dDsKKworCXJjID0gLUVQSVBFOworCWlmIChzay0+c2tfc2h1dGRvd24gJiBTRU5EX1NIVVRET1dOKSB7CisJCXNlbmRfc2lnKFNJR1BJUEUsIGN1cnJlbnQsIDApOworCQlnb3RvIG91dDsKKwl9CisKKwlyYyA9IC1FTkVUVU5SRUFDSDsKKwlpZiAoIXgyNS0+bmVpZ2hib3VyKQorCQlnb3RvIG91dDsKKworCWlmICh1c3gyNSkgeworCQlyYyA9IC1FSU5WQUw7CisJCWlmIChtc2ctPm1zZ19uYW1lbGVuIDwgc2l6ZW9mKHN4MjUpKQorCQkJZ290byBvdXQ7CisJCW1lbWNweSgmc3gyNSwgdXN4MjUsIHNpemVvZihzeDI1KSk7CisJCXJjID0gLUVJU0NPTk47CisJCWlmIChzdHJjbXAoeDI1LT5kZXN0X2FkZHIueDI1X2FkZHIsIHN4MjUuc3gyNV9hZGRyLngyNV9hZGRyKSkKKwkJCWdvdG8gb3V0OworCQlyYyA9IC1FSU5WQUw7CisJCWlmIChzeDI1LnN4MjVfZmFtaWx5ICE9IEFGX1gyNSkKKwkJCWdvdG8gb3V0OworCX0gZWxzZSB7CisJCS8qCisJCSAqCUZJWE1FIDEwMDMuMWcgLSBpZiB0aGUgc29ja2V0IGlzIGxpa2UgdGhpcyBiZWNhdXNlCisJCSAqCWl0IGhhcyBiZWNvbWUgY2xvc2VkIChub3Qgc3RhcnRlZCBjbG9zZWQpIHdlIG91Z2h0CisJCSAqCXRvIFNJR1BJUEUsIEVQSVBFOworCQkgKi8KKwkJcmMgPSAtRU5PVENPTk47CisJCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKQorCQkJZ290byBvdXQ7CisKKwkJc3gyNS5zeDI1X2ZhbWlseSA9IEFGX1gyNTsKKwkJc3gyNS5zeDI1X2FkZHIgICA9IHgyNS0+ZGVzdF9hZGRyOworCX0KKworCVNPQ0tfREVCVUcoc2ssICJ4MjVfc2VuZG1zZzogc2VuZHRvOiBBZGRyZXNzZXMgYnVpbHQuXG4iKTsKKworCS8qIEJ1aWxkIGEgcGFja2V0ICovCisJU09DS19ERUJVRyhzaywgIngyNV9zZW5kbXNnOiBzZW5kdG86IGJ1aWxkaW5nIHBhY2tldC5cbiIpOworCisJaWYgKChtc2ctPm1zZ19mbGFncyAmIE1TR19PT0IpICYmIGxlbiA+IDMyKQorCQlsZW4gPSAzMjsKKworCXNpemUgPSBsZW4gKyBYMjVfTUFYX0wyX0xFTiArIFgyNV9FWFRfTUlOX0xFTjsKKworCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssIHNpemUsIG5vYmxvY2ssICZyYyk7CisJaWYgKCFza2IpCisJCWdvdG8gb3V0OworCVgyNV9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgPSBtc2ctPm1zZ19mbGFnczsKKworCXNrYl9yZXNlcnZlKHNrYiwgWDI1X01BWF9MMl9MRU4gKyBYMjVfRVhUX01JTl9MRU4pOworCisJLyoKKwkgKglQdXQgdGhlIGRhdGEgb24gdGhlIGVuZAorCSAqLworCVNPQ0tfREVCVUcoc2ssICJ4MjVfc2VuZG1zZzogQ29weWluZyB1c2VyIGRhdGFcbiIpOworCisJYXNtcHRyID0gc2tiLT5oLnJhdyA9IHNrYl9wdXQoc2tiLCBsZW4pOworCisJcmMgPSBtZW1jcHlfZnJvbWlvdmVjKGFzbXB0ciwgbXNnLT5tc2dfaW92LCBsZW4pOworCWlmIChyYykKKwkJZ290byBvdXRfa2ZyZWVfc2tiOworCisJLyoKKwkgKglJZiB0aGUgUSBCSVQgSW5jbHVkZSBzb2NrZXQgb3B0aW9uIGlzIGluIGZvcmNlLCB0aGUgZmlyc3QKKwkgKglieXRlIG9mIHRoZSB1c2VyIGRhdGEgaXMgdGhlIGxvZ2ljYWwgdmFsdWUgb2YgdGhlIFEgQml0LgorCSAqLworCWlmICh4MjUtPnFiaXRpbmNsKSB7CisJCXFiaXQgPSBza2ItPmRhdGFbMF07CisJCXNrYl9wdWxsKHNrYiwgMSk7CisJfQorCisJLyoKKwkgKglQdXNoIGRvd24gdGhlIFguMjUgaGVhZGVyCisJICovCisJU09DS19ERUJVRyhzaywgIngyNV9zZW5kbXNnOiBCdWlsZGluZyBYLjI1IEhlYWRlci5cbiIpOworCisJaWYgKG1zZy0+bXNnX2ZsYWdzICYgTVNHX09PQikgeworCQlpZiAoeDI1LT5uZWlnaGJvdXItPmV4dGVuZGVkKSB7CisJCQlhc21wdHIgICAgPSBza2JfcHVzaChza2IsIFgyNV9TVERfTUlOX0xFTik7CisJCQkqYXNtcHRyKysgPSAoKHgyNS0+bGNpID4+IDgpICYgMHgwRikgfCBYMjVfR0ZJX0VYVFNFUTsKKwkJCSphc21wdHIrKyA9ICh4MjUtPmxjaSA+PiAwKSAmIDB4RkY7CisJCQkqYXNtcHRyKysgPSBYMjVfSU5URVJSVVBUOworCQl9IGVsc2UgeworCQkJYXNtcHRyICAgID0gc2tiX3B1c2goc2tiLCBYMjVfU1REX01JTl9MRU4pOworCQkJKmFzbXB0cisrID0gKCh4MjUtPmxjaSA+PiA4KSAmIDB4MEYpIHwgWDI1X0dGSV9TVERTRVE7CisJCQkqYXNtcHRyKysgPSAoeDI1LT5sY2kgPj4gMCkgJiAweEZGOworCQkJKmFzbXB0cisrID0gWDI1X0lOVEVSUlVQVDsKKwkJfQorCX0gZWxzZSB7CisJCWlmICh4MjUtPm5laWdoYm91ci0+ZXh0ZW5kZWQpIHsKKwkJCS8qIEJ1aWxkIGFuIEV4dGVuZGVkIFguMjUgaGVhZGVyICovCisJCQlhc21wdHIgICAgPSBza2JfcHVzaChza2IsIFgyNV9FWFRfTUlOX0xFTik7CisJCQkqYXNtcHRyKysgPSAoKHgyNS0+bGNpID4+IDgpICYgMHgwRikgfCBYMjVfR0ZJX0VYVFNFUTsKKwkJCSphc21wdHIrKyA9ICh4MjUtPmxjaSA+PiAwKSAmIDB4RkY7CisJCQkqYXNtcHRyKysgPSBYMjVfREFUQTsKKwkJCSphc21wdHIrKyA9IFgyNV9EQVRBOworCQl9IGVsc2UgeworCQkJLyogQnVpbGQgYW4gU3RhbmRhcmQgWC4yNSBoZWFkZXIgKi8KKwkJCWFzbXB0ciAgICA9IHNrYl9wdXNoKHNrYiwgWDI1X1NURF9NSU5fTEVOKTsKKwkJCSphc21wdHIrKyA9ICgoeDI1LT5sY2kgPj4gOCkgJiAweDBGKSB8IFgyNV9HRklfU1REU0VROworCQkJKmFzbXB0cisrID0gKHgyNS0+bGNpID4+IDApICYgMHhGRjsKKwkJCSphc21wdHIrKyA9IFgyNV9EQVRBOworCQl9CisKKwkJaWYgKHFiaXQpCisJCQlza2ItPmRhdGFbMF0gfD0gWDI1X1FfQklUOworCX0KKworCVNPQ0tfREVCVUcoc2ssICJ4MjVfc2VuZG1zZzogQnVpbHQgaGVhZGVyLlxuIik7CisJU09DS19ERUJVRyhzaywgIngyNV9zZW5kbXNnOiBUcmFuc21pdHRpbmcgYnVmZmVyXG4iKTsKKworCXJjID0gLUVOT1RDT05OOworCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKQorCQlnb3RvIG91dF9rZnJlZV9za2I7CisKKwlpZiAobXNnLT5tc2dfZmxhZ3MgJiBNU0dfT09CKQorCQlza2JfcXVldWVfdGFpbCgmeDI1LT5pbnRlcnJ1cHRfb3V0X3F1ZXVlLCBza2IpOworCWVsc2UgeworCSAgICAgICAgbGVuID0geDI1X291dHB1dChzaywgc2tiKTsKKwkJaWYgKGxlbiA8IDApCisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJZWxzZSBpZiAoeDI1LT5xYml0aW5jbCkKKwkJCWxlbisrOworCX0KKworCS8qCisJICogbG9ja19zb2NrKCkgaXMgY3VycmVudGx5IG9ubHkgdXNlZCB0byBzZXJpYWxpemUgdGhpcyB4MjVfa2ljaygpCisJICogYWdhaW5zdCBpbnB1dC1kcml2ZW4geDI1X2tpY2soKSBjYWxscy4gSXQgY3VycmVudGx5IG9ubHkgYmxvY2tzCisJICogaW5jb21pbmcgcGFja2V0cyBmb3IgdGhpcyBzb2NrZXQgYW5kIGRvZXMgbm90IHByb3RlY3QgYWdhaW5zdAorCSAqIGFueSBvdGhlciBzb2NrZXQgc3RhdGUgY2hhbmdlcyBhbmQgaXMgbm90IGNhbGxlZCBmcm9tIGFueXdoZXJlCisJICogZWxzZS4gQXMgeDI1X2tpY2soKSBjYW5ub3QgYmxvY2sgYW5kIGFzIGxvbmcgYXMgYWxsIHNvY2tldAorCSAqIG9wZXJhdGlvbnMgYXJlIEJLTC13cmFwcGVkLCB3ZSBkb24ndCBuZWVkIHRha2UgdG8gY2FyZSBhYm91dAorCSAqIHB1cmdpbmcgdGhlIGJhY2tsb2cgcXVldWUgaW4geDI1X3JlbGVhc2UoKS4KKwkgKgorCSAqIFVzaW5nIGxvY2tfc29jaygpIHRvIHByb3RlY3QgYWxsIHNvY2tldCBvcGVyYXRpb25zIGVudGlyZWx5CisJICogKGFuZCBtYWtpbmcgdGhlIHdob2xlIHgyNSBzdGFjayBTTVAgYXdhcmUpIHVuZm9ydHVuYXRlbHkgd291bGQKKwkgKiByZXF1aXJlIG1ham9yIGNoYW5nZXMgdG8ge3NlbmQscmVjdn1tc2cgYW5kIHNrYiBhbGxvY2F0aW9uIG1ldGhvZHMuCisJICogLT4gMi41IDspCisJICovCisJbG9ja19zb2NrKHNrKTsKKwl4MjVfa2ljayhzayk7CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyYyA9IGxlbjsKK291dDoKKwlyZXR1cm4gcmM7CitvdXRfa2ZyZWVfc2tiOgorCWtmcmVlX3NrYihza2IpOworCWdvdG8gb3V0OworfQorCisKK3N0YXRpYyBpbnQgeDI1X3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkgICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSwKKwkJICAgICAgIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgeDI1X3NvY2sgKngyNSA9IHgyNV9zayhzayk7CisJc3RydWN0IHNvY2thZGRyX3gyNSAqc3gyNSA9IChzdHJ1Y3Qgc29ja2FkZHJfeDI1ICopbXNnLT5tc2dfbmFtZTsKKwlzaXplX3QgY29waWVkOworCWludCBxYml0OworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgY2hhciAqYXNtcHRyOworCWludCByYyA9IC1FTk9UQ09OTjsKKworCS8qCisJICogVGhpcyB3b3JrcyBmb3Igc2VxcGFja2V0IHRvby4gVGhlIHJlY2VpdmVyIGhhcyBvcmRlcmVkIHRoZSBxdWV1ZSBmb3IKKwkgKiB1cyEgV2UgZG8gb25lIHF1aWNrIGNoZWNrIGZpcnN0IHRob3VnaAorCSAqLworCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKQorCQlnb3RvIG91dDsKKworCWlmIChmbGFncyAmIE1TR19PT0IpIHsKKwkJcmMgPSAtRUlOVkFMOworCQlpZiAoc29ja19mbGFnKHNrLCBTT0NLX1VSR0lOTElORSkgfHwKKwkJICAgICFza2JfcGVlaygmeDI1LT5pbnRlcnJ1cHRfaW5fcXVldWUpKQorCQkJZ290byBvdXQ7CisKKwkJc2tiID0gc2tiX2RlcXVldWUoJngyNS0+aW50ZXJydXB0X2luX3F1ZXVlKTsKKworCQlza2JfcHVsbChza2IsIFgyNV9TVERfTUlOX0xFTik7CisKKwkJLyoKKwkJICoJTm8gUSBiaXQgaW5mb3JtYXRpb24gb24gSW50ZXJydXB0IGRhdGEuCisJCSAqLworCQlpZiAoeDI1LT5xYml0aW5jbCkgeworCQkJYXNtcHRyICA9IHNrYl9wdXNoKHNrYiwgMSk7CisJCQkqYXNtcHRyID0gMHgwMDsKKwkJfQorCisJCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19PT0I7CisJfSBlbHNlIHsKKwkJLyogTm93IHdlIGNhbiB0cmVhdCBhbGwgYWxpa2UgKi8KKwkJc2tiID0gc2tiX3JlY3ZfZGF0YWdyYW0oc2ssIGZsYWdzICYgfk1TR19ET05UV0FJVCwKKwkJCQkJZmxhZ3MgJiBNU0dfRE9OVFdBSVQsICZyYyk7CisJCWlmICghc2tiKQorCQkJZ290byBvdXQ7CisKKwkJcWJpdCA9IChza2ItPmRhdGFbMF0gJiBYMjVfUV9CSVQpID09IFgyNV9RX0JJVDsKKworCQlza2JfcHVsbChza2IsIHgyNS0+bmVpZ2hib3VyLT5leHRlbmRlZCA/CisJCQkJWDI1X0VYVF9NSU5fTEVOIDogWDI1X1NURF9NSU5fTEVOKTsKKworCQlpZiAoeDI1LT5xYml0aW5jbCkgeworCQkJYXNtcHRyICA9IHNrYl9wdXNoKHNrYiwgMSk7CisJCQkqYXNtcHRyID0gcWJpdDsKKwkJfQorCX0KKworCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisKKwljb3BpZWQgPSBza2ItPmxlbjsKKworCWlmIChjb3BpZWQgPiBzaXplKSB7CisJCWNvcGllZCA9IHNpemU7CisJCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19UUlVOQzsKKwl9CisKKwkvKiBDdXJyZW50bHksIGVhY2ggZGF0YWdyYW0gYWx3YXlzIGNvbnRhaW5zIGEgY29tcGxldGUgcmVjb3JkICovIAorCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19FT1I7CisKKwlyYyA9IHNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgMCwgbXNnLT5tc2dfaW92LCBjb3BpZWQpOworCWlmIChyYykKKwkJZ290byBvdXRfZnJlZV9kZ3JhbTsKKworCWlmIChzeDI1KSB7CisJCXN4MjUtPnN4MjVfZmFtaWx5ID0gQUZfWDI1OworCQlzeDI1LT5zeDI1X2FkZHIgICA9IHgyNS0+ZGVzdF9hZGRyOworCX0KKworCW1zZy0+bXNnX25hbWVsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3gyNSk7CisKKwlsb2NrX3NvY2soc2spOworCXgyNV9jaGVja19yYnVmKHNrKTsKKwlyZWxlYXNlX3NvY2soc2spOworCXJjID0gY29waWVkOworb3V0X2ZyZWVfZGdyYW06CisJc2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBpbnQgeDI1X2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCB4MjVfc29jayAqeDI1ID0geDI1X3NrKHNrKTsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgcmM7CisKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFRJT0NPVVRROiB7CisJCQlpbnQgYW1vdW50ID0gc2stPnNrX3NuZGJ1ZiAtCisJCQkJICAgICBhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpOworCQkJaWYgKGFtb3VudCA8IDApCisJCQkJYW1vdW50ID0gMDsKKwkJCXJjID0gcHV0X3VzZXIoYW1vdW50LCAodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZ3ApOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFRJT0NJTlE6IHsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisJCQlpbnQgYW1vdW50ID0gMDsKKwkJCS8qCisJCQkgKiBUaGVzZSB0d28gYXJlIHNhZmUgb24gYSBzaW5nbGUgQ1BVIHN5c3RlbSBhcworCQkJICogb25seSB1c2VyIHRhc2tzIGZpZGRsZSBoZXJlCisJCQkgKi8KKwkJCWlmICgoc2tiID0gc2tiX3BlZWsoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSkgIT0gTlVMTCkKKwkJCQlhbW91bnQgPSBza2ItPmxlbjsKKwkJCXJjID0gcHV0X3VzZXIoYW1vdW50LCAodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZ3ApOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFNJT0NHU1RBTVA6CisJCQlyYyA9IC1FSU5WQUw7CisJCQlpZiAoc2spCisJCQkJcmMgPSBzb2NrX2dldF90aW1lc3RhbXAoc2ssIAorCQkJCQkJKHN0cnVjdCB0aW1ldmFsIF9fdXNlciAqKWFyZ3ApOyAKKwkJCWJyZWFrOworCQljYXNlIFNJT0NHSUZBRERSOgorCQljYXNlIFNJT0NTSUZBRERSOgorCQljYXNlIFNJT0NHSUZEU1RBRERSOgorCQljYXNlIFNJT0NTSUZEU1RBRERSOgorCQljYXNlIFNJT0NHSUZCUkRBRERSOgorCQljYXNlIFNJT0NTSUZCUkRBRERSOgorCQljYXNlIFNJT0NHSUZORVRNQVNLOgorCQljYXNlIFNJT0NTSUZORVRNQVNLOgorCQljYXNlIFNJT0NHSUZNRVRSSUM6CisJCWNhc2UgU0lPQ1NJRk1FVFJJQzoKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NBRERSVDoKKwkJY2FzZSBTSU9DREVMUlQ6CisJCQlyYyA9IC1FUEVSTTsKKwkJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCQlicmVhazsKKwkJCXJjID0geDI1X3JvdXRlX2lvY3RsKGNtZCwgYXJncCk7CisJCQlicmVhazsKKwkJY2FzZSBTSU9DWDI1R1NVQlNDUklQOgorCQkJcmMgPSB4MjVfc3Vic2NyX2lvY3RsKGNtZCwgYXJncCk7CisJCQlicmVhazsKKwkJY2FzZSBTSU9DWDI1U1NVQlNDUklQOgorCQkJcmMgPSAtRVBFUk07CisJCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQkJYnJlYWs7CisJCQlyYyA9IHgyNV9zdWJzY3JfaW9jdGwoY21kLCBhcmdwKTsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NYMjVHRkFDSUxJVElFUzogeworCQkJc3RydWN0IHgyNV9mYWNpbGl0aWVzIGZhYyA9IHgyNS0+ZmFjaWxpdGllczsKKwkJCXJjID0gY29weV90b191c2VyKGFyZ3AsICZmYWMsCisJCQkJCSAgc2l6ZW9mKGZhYykpID8gLUVGQVVMVCA6IDA7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgU0lPQ1gyNVNGQUNJTElUSUVTOiB7CisJCQlzdHJ1Y3QgeDI1X2ZhY2lsaXRpZXMgZmFjaWxpdGllczsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmZmFjaWxpdGllcywgYXJncCwKKwkJCQkJICAgc2l6ZW9mKGZhY2lsaXRpZXMpKSkKKwkJCQlicmVhazsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0xJU1RFTiAmJgorCQkJICAgIHNrLT5za19zdGF0ZSAhPSBUQ1BfQ0xPU0UpCisJCQkJYnJlYWs7CisJCQlpZiAoZmFjaWxpdGllcy5wYWNzaXplX2luIDwgWDI1X1BTMTYgfHwKKwkJCSAgICBmYWNpbGl0aWVzLnBhY3NpemVfaW4gPiBYMjVfUFM0MDk2KQorCQkJCWJyZWFrOworCQkJaWYgKGZhY2lsaXRpZXMucGFjc2l6ZV9vdXQgPCBYMjVfUFMxNiB8fAorCQkJICAgIGZhY2lsaXRpZXMucGFjc2l6ZV9vdXQgPiBYMjVfUFM0MDk2KQorCQkJCWJyZWFrOworCQkJaWYgKGZhY2lsaXRpZXMud2luc2l6ZV9pbiA8IDEgfHwKKwkJCSAgICBmYWNpbGl0aWVzLndpbnNpemVfaW4gPiAxMjcpCisJCQkJYnJlYWs7CisJCQlpZiAoZmFjaWxpdGllcy50aHJvdWdocHV0IDwgMHgwMyB8fAorCQkJICAgIGZhY2lsaXRpZXMudGhyb3VnaHB1dCA+IDB4REQpCisJCQkJYnJlYWs7CisJCQlpZiAoZmFjaWxpdGllcy5yZXZlcnNlICYmIGZhY2lsaXRpZXMucmV2ZXJzZSAhPSAxKQorCQkJCWJyZWFrOworCQkJeDI1LT5mYWNpbGl0aWVzID0gZmFjaWxpdGllczsKKwkJCXJjID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBTSU9DWDI1R0NBTExVU0VSREFUQTogeworCQkJc3RydWN0IHgyNV9jYWxsdXNlcmRhdGEgY3VkID0geDI1LT5jYWxsdXNlcmRhdGE7CisJCQlyYyA9IGNvcHlfdG9fdXNlcihhcmdwLCAmY3VkLAorCQkJCQkgIHNpemVvZihjdWQpKSA/IC1FRkFVTFQgOiAwOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFNJT0NYMjVTQ0FMTFVTRVJEQVRBOiB7CisJCQlzdHJ1Y3QgeDI1X2NhbGx1c2VyZGF0YSBjYWxsdXNlcmRhdGE7CisKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmY2FsbHVzZXJkYXRhLCBhcmdwLAorCQkJCQkgICBzaXplb2YoY2FsbHVzZXJkYXRhKSkpCisJCQkJYnJlYWs7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlpZiAoY2FsbHVzZXJkYXRhLmN1ZGxlbmd0aCA+IFgyNV9NQVhfQ1VEX0xFTikKKwkJCQlicmVhazsKKwkJCXgyNS0+Y2FsbHVzZXJkYXRhID0gY2FsbHVzZXJkYXRhOworCQkJcmMgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFNJT0NYMjVHQ0FVU0VESUFHOiB7CisJCQlzdHJ1Y3QgeDI1X2NhdXNlZGlhZyBjYXVzZWRpYWc7CisJCQljYXVzZWRpYWcgPSB4MjUtPmNhdXNlZGlhZzsKKwkJCXJjID0gY29weV90b191c2VyKGFyZ3AsICZjYXVzZWRpYWcsCisJCQkJCSAgc2l6ZW9mKGNhdXNlZGlhZykpID8gLUVGQVVMVCA6IDA7CisJCQlicmVhazsKKwkJfQorCisgCQlkZWZhdWx0OgorCQkJcmMgPSBkZXZfaW9jdGwoY21kLCBhcmdwKTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5IHgyNV9mYW1pbHlfb3BzID0geworCS5mYW1pbHkgPQlBRl9YMjUsCisJLmNyZWF0ZSA9CXgyNV9jcmVhdGUsCisJLm93bmVyCT0JVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBTT0NLT1BTX1dSQVBQRUQoeDI1X3Byb3RvX29wcykgPSB7CisJLmZhbWlseSA9CUFGX1gyNSwKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkucmVsZWFzZSA9CXgyNV9yZWxlYXNlLAorCS5iaW5kID0JCXgyNV9iaW5kLAorCS5jb25uZWN0ID0JeDI1X2Nvbm5lY3QsCisJLnNvY2tldHBhaXIgPQlzb2NrX25vX3NvY2tldHBhaXIsCisJLmFjY2VwdCA9CXgyNV9hY2NlcHQsCisJLmdldG5hbWUgPQl4MjVfZ2V0bmFtZSwKKwkucG9sbCA9CQlkYXRhZ3JhbV9wb2xsLAorCS5pb2N0bCA9CXgyNV9pb2N0bCwKKwkubGlzdGVuID0JeDI1X2xpc3RlbiwKKwkuc2h1dGRvd24gPQlzb2NrX25vX3NodXRkb3duLAorCS5zZXRzb2Nrb3B0ID0JeDI1X3NldHNvY2tvcHQsCisJLmdldHNvY2tvcHQgPQl4MjVfZ2V0c29ja29wdCwKKwkuc2VuZG1zZyA9CXgyNV9zZW5kbXNnLAorCS5yZWN2bXNnID0JeDI1X3JlY3Ztc2csCisJLm1tYXAgPQkJc29ja19ub19tbWFwLAorCS5zZW5kcGFnZSA9CXNvY2tfbm9fc2VuZHBhZ2UsCit9OworCisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KK1NPQ0tPUFNfV1JBUCh4MjVfcHJvdG8sIEFGX1gyNSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGFja2V0X3R5cGUgeDI1X3BhY2tldF90eXBlID0geworCS50eXBlID0JX19jb25zdGFudF9odG9ucyhFVEhfUF9YMjUpLAorCS5mdW5jID0JeDI1X2xhcGJfcmVjZWl2ZV9mcmFtZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgeDI1X2Rldl9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHgyNV9kZXZpY2VfZXZlbnQsCit9OworCit2b2lkIHgyNV9raWxsX2J5X25laWdoKHN0cnVjdCB4MjVfbmVpZ2ggKm5iKQoreworCXN0cnVjdCBzb2NrICpzOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJd3JpdGVfbG9ja19iaCgmeDI1X2xpc3RfbG9jayk7CisKKwlza19mb3JfZWFjaChzLCBub2RlLCAmeDI1X2xpc3QpCisJCWlmICh4MjVfc2socyktPm5laWdoYm91ciA9PSBuYikKKwkJCXgyNV9kaXNjb25uZWN0KHMsIEVORVRVTlJFQUNILCAwLCAwKTsKKworCXdyaXRlX3VubG9ja19iaCgmeDI1X2xpc3RfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHgyNV9pbml0KHZvaWQpCit7CisJaW50IHJjID0gcHJvdG9fcmVnaXN0ZXIoJngyNV9wcm90bywgMCk7CisKKwlpZiAocmMgIT0gMCkKKwkJZ290byBvdXQ7CisKKwlzb2NrX3JlZ2lzdGVyKCZ4MjVfZmFtaWx5X29wcyk7CisKKwlkZXZfYWRkX3BhY2soJngyNV9wYWNrZXRfdHlwZSk7CisKKwlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJngyNV9kZXZfbm90aWZpZXIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiWC4yNSBmb3IgTGludXguIFZlcnNpb24gMC4yIGZvciBMaW51eCAyLjEuMTVcbiIpOworCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCXgyNV9yZWdpc3Rlcl9zeXNjdGwoKTsKKyNlbmRpZgorCXgyNV9wcm9jX2luaXQoKTsKK291dDoKKwlyZXR1cm4gcmM7Cit9Cittb2R1bGVfaW5pdCh4MjVfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB4MjVfZXhpdCh2b2lkKQoreworCXgyNV9wcm9jX2V4aXQoKTsKKwl4MjVfbGlua19mcmVlKCk7CisJeDI1X3JvdXRlX2ZyZWUoKTsKKworI2lmZGVmIENPTkZJR19TWVNDVEwKKwl4MjVfdW5yZWdpc3Rlcl9zeXNjdGwoKTsKKyNlbmRpZgorCisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJngyNV9kZXZfbm90aWZpZXIpOworCisJZGV2X3JlbW92ZV9wYWNrKCZ4MjVfcGFja2V0X3R5cGUpOworCisJc29ja191bnJlZ2lzdGVyKEFGX1gyNSk7CisJcHJvdG9fdW5yZWdpc3RlcigmeDI1X3Byb3RvKTsKK30KK21vZHVsZV9leGl0KHgyNV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiSm9uYXRoYW4gTmF5bG9yIDxnNGtseEBnNGtseC5kZW1vbi5jby51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVGhlIFguMjUgUGFja2V0IExheWVyIG5ldHdvcmsgbGF5ZXIgcHJvdG9jb2wiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19ORVRQUk9UTyhQRl9YMjUpOwpkaWZmIC0tZ2l0IGEvbmV0L3gyNS9zeXNjdGxfbmV0X3gyNS5jIGIvbmV0L3gyNS9zeXNjdGxfbmV0X3gyNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYmRhNTkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQveDI1L3N5c2N0bF9uZXRfeDI1LmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qIC0qLSBsaW51eC1jIC0qLQorICogc3lzY3RsX25ldF94MjUuYzogc3lzY3RsIGludGVyZmFjZSB0byBuZXQgWC4yNSBzdWJzeXN0ZW0uCisgKgorICogQmVndW4gQXByaWwgMSwgMTk5NiwgTWlrZSBTaGF2ZXIuCisgKiBBZGRlZCAvcHJvYy9zeXMvbmV0L3gyNSBkaXJlY3RvcnkgZW50cnkgKGVtcHR5ID0pICkuIFtNU10KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPG5ldC94MjUuaD4KKworc3RhdGljIGludCBtaW5fdGltZXJbXSA9IHsgICAxICogSFogfTsKK3N0YXRpYyBpbnQgbWF4X3RpbWVyW10gPSB7IDMwMCAqIEhaIH07CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqeDI1X3RhYmxlX2hlYWRlcjsKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgeDI1X3RhYmxlW10gPSB7CisgICAgICAgIHsKKwkJLmN0bF9uYW1lID0JTkVUX1gyNV9SRVNUQVJUX1JFUVVFU1RfVElNRU9VVCwKKwkJLnByb2NuYW1lID0JInJlc3RhcnRfcmVxdWVzdF90aW1lb3V0IiwKKwkJLmRhdGEgPQkJJnN5c2N0bF94MjVfcmVzdGFydF9yZXF1ZXN0X3RpbWVvdXQsCisJCS5tYXhsZW4gPQlzaXplb2YoaW50KSwKKwkJLm1vZGUgPQkJMDY0NCwKKwkJLnByb2NfaGFuZGxlciA9CSZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5ID0JJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEgPQkmbWluX3RpbWVyLAorCQkuZXh0cmEyID0JJm1heF90aW1lciwKKwl9LAorICAgICAgICB7CisJCS5jdGxfbmFtZSA9CU5FVF9YMjVfQ0FMTF9SRVFVRVNUX1RJTUVPVVQsCisJCS5wcm9jbmFtZSA9CSJjYWxsX3JlcXVlc3RfdGltZW91dCIsCisJCS5kYXRhID0JCSZzeXNjdGxfeDI1X2NhbGxfcmVxdWVzdF90aW1lb3V0LAorCQkubWF4bGVuID0Jc2l6ZW9mKGludCksCisJCS5tb2RlID0JCTA2NDQsCisJCS5wcm9jX2hhbmRsZXIgPQkmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneSA9CSZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExID0JJm1pbl90aW1lciwKKwkJLmV4dHJhMiA9CSZtYXhfdGltZXIsCisJfSwKKyAgICAgICAgeworCQkuY3RsX25hbWUgPQlORVRfWDI1X1JFU0VUX1JFUVVFU1RfVElNRU9VVCwKKwkJLnByb2NuYW1lID0JInJlc2V0X3JlcXVlc3RfdGltZW91dCIsCisJCS5kYXRhID0JCSZzeXNjdGxfeDI1X3Jlc2V0X3JlcXVlc3RfdGltZW91dCwKKwkJLm1heGxlbiA9CXNpemVvZihpbnQpLAorCQkubW9kZSA9CQkwNjQ0LAorCQkucHJvY19oYW5kbGVyID0JJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kgPQkmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMSA9CSZtaW5fdGltZXIsCisJCS5leHRyYTIgPQkmbWF4X3RpbWVyLAorCX0sCisgICAgICAgIHsKKwkJLmN0bF9uYW1lID0JTkVUX1gyNV9DTEVBUl9SRVFVRVNUX1RJTUVPVVQsCisJCS5wcm9jbmFtZSA9CSJjbGVhcl9yZXF1ZXN0X3RpbWVvdXQiLAorCQkuZGF0YSA9CQkmc3lzY3RsX3gyNV9jbGVhcl9yZXF1ZXN0X3RpbWVvdXQsCisJCS5tYXhsZW4gPQlzaXplb2YoaW50KSwKKwkJLm1vZGUgPQkJMDY0NCwKKwkJLnByb2NfaGFuZGxlciA9CSZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5ID0JJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEgPQkmbWluX3RpbWVyLAorCQkuZXh0cmEyID0JJm1heF90aW1lciwKKwl9LAorICAgICAgICB7CisJCS5jdGxfbmFtZSA9CU5FVF9YMjVfQUNLX0hPTERfQkFDS19USU1FT1VULAorCQkucHJvY25hbWUgPQkiYWNrbm93bGVkZ2VtZW50X2hvbGRfYmFja190aW1lb3V0IiwKKwkJLmRhdGEgPQkJJnN5c2N0bF94MjVfYWNrX2hvbGRiYWNrX3RpbWVvdXQsCisJCS5tYXhsZW4gPQlzaXplb2YoaW50KSwKKwkJLm1vZGUgPQkJMDY0NCwKKwkJLnByb2NfaGFuZGxlciA9CSZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLnN0cmF0ZWd5ID0JJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEgPQkmbWluX3RpbWVyLAorCQkuZXh0cmEyID0JJm1heF90aW1lciwKKwl9LAorCXsgMCwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIHgyNV9kaXJfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZSA9CU5FVF9YMjUsCisJCS5wcm9jbmFtZSA9CSJ4MjUiLAorCQkubW9kZSA9CQkwNTU1LAorCQkuY2hpbGQgPQl4MjVfdGFibGUsCisJfSwKKwl7IDAsIH0sCit9OworCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZSB4MjVfcm9vdF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lID0JQ1RMX05FVCwKKwkJLnByb2NuYW1lID0JIm5ldCIsCisJCS5tb2RlID0JCTA1NTUsCisJCS5jaGlsZCA9CXgyNV9kaXJfdGFibGUsCisJfSwKKwl7IDAsIH0sCit9OworCit2b2lkIF9faW5pdCB4MjVfcmVnaXN0ZXJfc3lzY3RsKHZvaWQpCit7CisJeDI1X3RhYmxlX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZSh4MjVfcm9vdF90YWJsZSwgMSk7Cit9CisKK3ZvaWQgeDI1X3VucmVnaXN0ZXJfc3lzY3RsKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoeDI1X3RhYmxlX2hlYWRlcik7Cit9CmRpZmYgLS1naXQgYS9uZXQveDI1L3gyNV9kZXYuYyBiL25ldC94MjUveDI1X2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZmMzYmYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQveDI1L3gyNV9kZXYuYwpAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqCVguMjUgUGFja2V0IExheWVyIHJlbGVhc2UgMDAyCisgKgorICoJVGhpcyBpcyBBTFBIQSB0ZXN0IHNvZnR3YXJlLiBUaGlzIGNvZGUgbWF5IGJyZWFrIHlvdXIgbWFjaGluZSwgcmFuZG9tbHkgZmFpbCB0byB3b3JrIHdpdGggbmV3IAorICoJcmVsZWFzZXMsIG1pc2JlaGF2ZSBhbmQvb3IgZ2VuZXJhbGx5IHNjcmV3IHVwLiBJdCBtaWdodCBldmVuIHdvcmsuIAorICoKKyAqCVRoaXMgY29kZSBSRVFVSVJFUyAyLjEuMTUgb3IgaGlnaGVyCisgKgorICoJVGhpcyBtb2R1bGU6CisgKgkJVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCUhpc3RvcnkKKyAqCVguMjUgMDAxCUpvbmF0aGFuIE5heWxvcglTdGFydGVkIGNvZGluZy4KKyAqICAgICAgMjAwMC0wOS0wNAlIZW5uZXIgRWlzZW4JUHJldmVudCBmcmVlaW5nIGEgZGFuZ2xpbmcgc2tiLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPG5ldC94MjUuaD4KKworc3RhdGljIGludCB4MjVfcmVjZWl2ZV9kYXRhKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB4MjVfbmVpZ2ggKm5iKQoreworCXN0cnVjdCBzb2NrICpzazsKKwl1bnNpZ25lZCBzaG9ydCBmcmFtZXR5cGU7CisJdW5zaWduZWQgaW50IGxjaTsKKworCWZyYW1ldHlwZSA9IHNrYi0+ZGF0YVsyXTsKKyAgICAgICAgbGNpID0gKChza2ItPmRhdGFbMF0gPDwgOCkgJiAweEYwMCkgKyAoKHNrYi0+ZGF0YVsxXSA8PCAwKSAmIDB4MEZGKTsKKworCS8qCisJICoJTENJIG9mIHplcm8gaXMgYWx3YXlzIGZvciB1cywgYW5kIGl0cyBhbHdheXMgYSBsaW5rIGNvbnRyb2wKKwkgKglmcmFtZS4KKwkgKi8KKwlpZiAobGNpID09IDApIHsKKwkJeDI1X2xpbmtfY29udHJvbChza2IsIG5iLCBmcmFtZXR5cGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqCUZpbmQgYW4gZXhpc3Rpbmcgc29ja2V0LgorCSAqLworCWlmICgoc2sgPSB4MjVfZmluZF9zb2NrZXQobGNpLCBuYikpICE9IE5VTEwpIHsKKwkJaW50IHF1ZXVlZCA9IDE7CisKKwkJc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwkJYmhfbG9ja19zb2NrKHNrKTsKKwkJaWYgKCFzb2NrX293bmVkX2J5X3VzZXIoc2spKSB7CisJCQlxdWV1ZWQgPSB4MjVfcHJvY2Vzc19yeF9mcmFtZShzaywgc2tiKTsKKwkJfSBlbHNlIHsKKwkJCXNrX2FkZF9iYWNrbG9nKHNrLCBza2IpOworCQl9CisJCWJoX3VubG9ja19zb2NrKHNrKTsKKwkJcmV0dXJuIHF1ZXVlZDsKKwl9CisKKwkvKgorCSAqCUlzIGlzIGEgQ2FsbCBSZXF1ZXN0ID8gaWYgc28gcHJvY2VzcyBpdC4KKwkgKi8KKwlpZiAoZnJhbWV0eXBlID09IFgyNV9DQUxMX1JFUVVFU1QpCisJCXJldHVybiB4MjVfcnhfY2FsbF9yZXF1ZXN0KHNrYiwgbmIsIGxjaSk7CisKKwkvKgorCSAqCUl0cyBub3QgYSBDYWxsIFJlcXVlc3QsIG5vciBpcyBpdCBhIGNvbnRyb2wgZnJhbWUuCisJICogICAgICBMZXQgY2FsbGVyIHRocm93IGl0IGF3YXkuCisJICovCisvKgorCXgyNV90cmFuc21pdF9jbGVhcl9yZXF1ZXN0KG5iLCBsY2ksIDB4MEQpOworKi8KKworCWlmIChmcmFtZXR5cGUgIT0gWDI1X0NMRUFSX0NPTkZJUk1BVElPTikKKwkJcHJpbnRrKEtFUk5fREVCVUcgIngyNV9yZWNlaXZlX2RhdGEoKTogdW5rbm93biBmcmFtZSB0eXBlICUyeFxuIixmcmFtZXR5cGUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB4MjVfbGFwYl9yZWNlaXZlX2ZyYW1lKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0eXBlKQoreworCXN0cnVjdCBza19idWZmICpuc2tiOworCXN0cnVjdCB4MjVfbmVpZ2ggKm5iOworCisJbnNrYiA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CisJaWYgKCFuc2tiKQorCQlnb3RvIGRyb3A7CisJa2ZyZWVfc2tiKHNrYik7CisJc2tiID0gbnNrYjsKKworCS8qCisJICogUGFja2V0IHJlY2VpdmVkIGZyb20gdW5yZWNvZ25pc2VkIGRldmljZSwgdGhyb3cgaXQgYXdheS4KKwkgKi8KKwluYiA9IHgyNV9nZXRfbmVpZ2goZGV2KTsKKwlpZiAoIW5iKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJYLjI1OiB1bmtub3duIG5laWdoYm91ciAtICVzXG4iLCBkZXYtPm5hbWUpOworCQlnb3RvIGRyb3A7CisJfQorCisJc3dpdGNoIChza2ItPmRhdGFbMF0pIHsKKwkJY2FzZSAweDAwOgorCQkJc2tiX3B1bGwoc2tiLCAxKTsKKwkJCWlmICh4MjVfcmVjZWl2ZV9kYXRhKHNrYiwgbmIpKSB7CisJCQkJeDI1X25laWdoX3B1dChuYik7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAweDAxOgorCQkJeDI1X2xpbmtfZXN0YWJsaXNoZWQobmIpOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMjoKKwkJCXgyNV9saW5rX3Rlcm1pbmF0ZWQobmIpOworCQkJYnJlYWs7CisJfQorCXgyNV9uZWlnaF9wdXQobmIpOworZHJvcDoKKwlrZnJlZV9za2Ioc2tiKTsKK291dDoKKwlyZXR1cm4gMDsKK30KKwordm9pZCB4MjVfZXN0YWJsaXNoX2xpbmsoc3RydWN0IHgyNV9uZWlnaCAqbmIpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisKKwlzd2l0Y2ggKG5iLT5kZXYtPnR5cGUpIHsKKwkJY2FzZSBBUlBIUkRfWDI1OgorCQkJaWYgKChza2IgPSBhbGxvY19za2IoMSwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIngyNV9kZXY6IG91dCBvZiBtZW1vcnlcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXB0ciAgPSBza2JfcHV0KHNrYiwgMSk7CisJCQkqcHRyID0gMHgwMTsKKwkJCWJyZWFrOworCisjaWYgZGVmaW5lZChDT05GSUdfTExDKSB8fCBkZWZpbmVkKENPTkZJR19MTENfTU9EVUxFKQorCQljYXNlIEFSUEhSRF9FVEhFUjoKKwkJCXJldHVybjsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJcmV0dXJuOworCX0KKworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9YMjUpOworCXNrYi0+ZGV2ICAgICAgPSBuYi0+ZGV2OworCisJZGV2X3F1ZXVlX3htaXQoc2tiKTsKK30KKwordm9pZCB4MjVfdGVybWluYXRlX2xpbmsoc3RydWN0IHgyNV9uZWlnaCAqbmIpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisKKyNpZiBkZWZpbmVkKENPTkZJR19MTEMpIHx8IGRlZmluZWQoQ09ORklHX0xMQ19NT0RVTEUpCisJaWYgKG5iLT5kZXYtPnR5cGUgPT0gQVJQSFJEX0VUSEVSKQorCQlyZXR1cm47CisjZW5kaWYKKwlpZiAobmItPmRldi0+dHlwZSAhPSBBUlBIUkRfWDI1KQorCQlyZXR1cm47CisKKwlza2IgPSBhbGxvY19za2IoMSwgR0ZQX0FUT01JQyk7CisJaWYgKCFza2IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ4MjVfZGV2OiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuOworCX0KKworCXB0ciAgPSBza2JfcHV0KHNrYiwgMSk7CisJKnB0ciA9IDB4MDI7CisKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfWDI1KTsKKwlza2ItPmRldiAgICAgID0gbmItPmRldjsKKwlkZXZfcXVldWVfeG1pdChza2IpOworfQorCit2b2lkIHgyNV9zZW5kX2ZyYW1lKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB4MjVfbmVpZ2ggKm5iKQoreworCXVuc2lnbmVkIGNoYXIgKmRwdHI7CisKKwlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKworCXN3aXRjaCAobmItPmRldi0+dHlwZSkgeworCQljYXNlIEFSUEhSRF9YMjU6CisJCQlkcHRyICA9IHNrYl9wdXNoKHNrYiwgMSk7CisJCQkqZHB0ciA9IDB4MDA7CisJCQlicmVhazsKKworI2lmIGRlZmluZWQoQ09ORklHX0xMQykgfHwgZGVmaW5lZChDT05GSUdfTExDX01PRFVMRSkKKwkJY2FzZSBBUlBIUkRfRVRIRVI6CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybjsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm47CisJfQorCisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX1gyNSk7CisJc2tiLT5kZXYgICAgICA9IG5iLT5kZXY7CisKKwlkZXZfcXVldWVfeG1pdChza2IpOworfQpkaWZmIC0tZ2l0IGEvbmV0L3gyNS94MjVfZmFjaWxpdGllcy5jIGIvbmV0L3gyNS94MjVfZmFjaWxpdGllcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMWJkYjkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQveDI1L3gyNV9mYWNpbGl0aWVzLmMKQEAgLTAsMCArMSwyMzEgQEAKKy8qCisgKglYLjI1IFBhY2tldCBMYXllciByZWxlYXNlIDAwMgorICoKKyAqCVRoaXMgaXMgQUxQSEEgdGVzdCBzb2Z0d2FyZS4gVGhpcyBjb2RlIG1heSBicmVhayB5b3VyIG1hY2hpbmUsCisgKglyYW5kb21seSBmYWlsIHRvIHdvcmsgd2l0aCBuZXcgcmVsZWFzZXMsIG1pc2JlaGF2ZSBhbmQvb3IgZ2VuZXJhbGx5CisgKglzY3JldyB1cC4gSXQgbWlnaHQgZXZlbiB3b3JrLiAKKyAqCisgKglUaGlzIGNvZGUgUkVRVUlSRVMgMi4xLjE1IG9yIGhpZ2hlcgorICoKKyAqCVRoaXMgbW9kdWxlOgorICoJCVRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglIaXN0b3J5CisgKglYLjI1IDAwMQlTcGxpdCBmcm9tIHgyNV9zdWJyLmMKKyAqCW1hci8yMC8wMAlEYW5pZWxhIFNxdWFzc29uaSBEaXNhYmxpbmcvZW5hYmxpbmcgb2YgZmFjaWxpdGllcyAKKyAqCQkJCQkgIG5lZ290aWF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC94MjUuaD4KKworLyoKKyAqCVBhcnNlIGEgc2V0IG9mIGZhY2lsaXRpZXMgaW50byB0aGUgZmFjaWxpdGllcyBzdHJ1Y3R1cmUuIFVucmVjb2duaXNlZAorICoJZmFjaWxpdGllcyBhcmUgd3JpdHRlbiB0byB0aGUgZGVidWcgbG9nIGZpbGUuCisgKi8KK2ludCB4MjVfcGFyc2VfZmFjaWxpdGllcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJIHN0cnVjdCB4MjVfZmFjaWxpdGllcyAqZmFjaWxpdGllcywKKwkJCSB1bnNpZ25lZCBsb25nICp2Y19mYWNfbWFzaykKK3sKKwl1bnNpZ25lZCBjaGFyICpwID0gc2tiLT5kYXRhOworCXVuc2lnbmVkIGludCBsZW4gPSAqcCsrOworCisJKnZjX2ZhY19tYXNrID0gMDsKKworCXdoaWxlIChsZW4gPiAwKSB7CisJCXN3aXRjaCAoKnAgJiBYMjVfRkFDX0NMQVNTX01BU0spIHsKKwkJY2FzZSBYMjVfRkFDX0NMQVNTX0E6CisJCQlzd2l0Y2ggKCpwKSB7CisJCQljYXNlIFgyNV9GQUNfUkVWRVJTRToKKwkJCQlmYWNpbGl0aWVzLT5yZXZlcnNlID0gcFsxXSAmIDB4MDE7CisJCQkJKnZjX2ZhY19tYXNrIHw9IFgyNV9NQVNLX1JFVkVSU0U7CisJCQkJYnJlYWs7CisJCQljYXNlIFgyNV9GQUNfVEhST1VHSFBVVDoKKwkJCQlmYWNpbGl0aWVzLT50aHJvdWdocHV0ID0gcFsxXTsKKwkJCQkqdmNfZmFjX21hc2sgfD0gWDI1X01BU0tfVEhST1VHSFBVVDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIlguMjU6IHVua25vd24gZmFjaWxpdHkgIgorCQkJCSAgICAgICAiJTAyWCwgdmFsdWUgJTAyWFxuIiwKKwkJCQkgICAgICAgcFswXSwgcFsxXSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwICAgKz0gMjsKKwkJCWxlbiAtPSAyOworCQkJYnJlYWs7CisJCWNhc2UgWDI1X0ZBQ19DTEFTU19COgorCQkJc3dpdGNoICgqcCkgeworCQkJY2FzZSBYMjVfRkFDX1BBQ0tFVF9TSVpFOgorCQkJCWZhY2lsaXRpZXMtPnBhY3NpemVfaW4gID0gcFsxXTsKKwkJCQlmYWNpbGl0aWVzLT5wYWNzaXplX291dCA9IHBbMl07CisJCQkJKnZjX2ZhY19tYXNrIHw9IFgyNV9NQVNLX1BBQ0tFVF9TSVpFOworCQkJCWJyZWFrOworCQkJY2FzZSBYMjVfRkFDX1dJTkRPV19TSVpFOgorCQkJCWZhY2lsaXRpZXMtPndpbnNpemVfaW4gID0gcFsxXTsKKwkJCQlmYWNpbGl0aWVzLT53aW5zaXplX291dCA9IHBbMl07CisJCQkJKnZjX2ZhY19tYXNrIHw9IFgyNV9NQVNLX1dJTkRPV19TSVpFOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiWC4yNTogdW5rbm93biBmYWNpbGl0eSAiCisJCQkJICAgICAgICIlMDJYLCB2YWx1ZXMgJTAyWCwgJTAyWFxuIiwKKwkJCQkgICAgICAgcFswXSwgcFsxXSwgcFsyXSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwICAgKz0gMzsKKwkJCWxlbiAtPSAzOworCQkJYnJlYWs7CisJCWNhc2UgWDI1X0ZBQ19DTEFTU19DOgorCQkJcHJpbnRrKEtFUk5fREVCVUcgIlguMjU6IHVua25vd24gZmFjaWxpdHkgJTAyWCwgIgorCQkJICAgICAgICJ2YWx1ZXMgJTAyWCwgJTAyWCwgJTAyWFxuIiwKKwkJCSAgICAgICBwWzBdLCBwWzFdLCBwWzJdLCBwWzNdKTsKKwkJCXAgICArPSA0OworCQkJbGVuIC09IDQ7CisJCQlicmVhazsKKwkJY2FzZSBYMjVfRkFDX0NMQVNTX0Q6CisJCQlwcmludGsoS0VSTl9ERUJVRyAiWC4yNTogdW5rbm93biBmYWNpbGl0eSAlMDJYLCAiCisJCQkgICAgICAgImxlbmd0aCAlZCwgdmFsdWVzICUwMlgsICUwMlgsICUwMlgsICUwMlhcbiIsCisJCQkgICAgICAgcFswXSwgcFsxXSwgcFsyXSwgcFszXSwgcFs0XSwgcFs1XSk7CisJCQlsZW4gLT0gcFsxXSArIDI7CisJCQlwICAgKz0gcFsxXSArIDI7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBwIC0gc2tiLT5kYXRhOworfQorCisvKgorICoJQ3JlYXRlIGEgc2V0IG9mIGZhY2lsaXRpZXMuCisgKi8KK2ludCB4MjVfY3JlYXRlX2ZhY2lsaXRpZXModW5zaWduZWQgY2hhciAqYnVmZmVyLAorCQkJICBzdHJ1Y3QgeDI1X2ZhY2lsaXRpZXMgKmZhY2lsaXRpZXMsCisJCQkgIHVuc2lnbmVkIGxvbmcgZmFjaWxfbWFzaykKK3sKKwl1bnNpZ25lZCBjaGFyICpwID0gYnVmZmVyICsgMTsKKwlpbnQgbGVuOworCisJaWYgKCFmYWNpbF9tYXNrKSB7CisJCS8qCisJCSAqIExlbmd0aCBvZiB0aGUgZmFjaWxpdGllcyBmaWVsZCBpbiBjYWxsX3JlcSBvcgorCQkgKiBjYWxsX2FjY2VwdCBwYWNrZXRzCisJCSAqLworCQlidWZmZXJbMF0gPSAwOworCQlsZW4gPSAxOyAvKiAxIGJ5dGUgZm9yIHRoZSBsZW5ndGggZmllbGQgKi8KKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlpZiAoZmFjaWxpdGllcy0+cmV2ZXJzZSAmJiAoZmFjaWxfbWFzayAmIFgyNV9NQVNLX1JFVkVSU0UpKSB7CisJCSpwKysgPSBYMjVfRkFDX1JFVkVSU0U7CisJCSpwKysgPSAhIWZhY2lsaXRpZXMtPnJldmVyc2U7CisJfQorCisJaWYgKGZhY2lsaXRpZXMtPnRocm91Z2hwdXQgJiYgKGZhY2lsX21hc2sgJiBYMjVfTUFTS19USFJPVUdIUFVUKSkgeworCQkqcCsrID0gWDI1X0ZBQ19USFJPVUdIUFVUOworCQkqcCsrID0gZmFjaWxpdGllcy0+dGhyb3VnaHB1dDsKKwl9CisKKwlpZiAoKGZhY2lsaXRpZXMtPnBhY3NpemVfaW4gfHwgZmFjaWxpdGllcy0+cGFjc2l6ZV9vdXQpICYmCisJICAgIChmYWNpbF9tYXNrICYgWDI1X01BU0tfUEFDS0VUX1NJWkUpKSB7CisJCSpwKysgPSBYMjVfRkFDX1BBQ0tFVF9TSVpFOworCQkqcCsrID0gZmFjaWxpdGllcy0+cGFjc2l6ZV9pbiA/IDogZmFjaWxpdGllcy0+cGFjc2l6ZV9vdXQ7CisJCSpwKysgPSBmYWNpbGl0aWVzLT5wYWNzaXplX291dCA/IDogZmFjaWxpdGllcy0+cGFjc2l6ZV9pbjsKKwl9CisKKwlpZiAoKGZhY2lsaXRpZXMtPndpbnNpemVfaW4gfHwgZmFjaWxpdGllcy0+d2luc2l6ZV9vdXQpICYmCisJICAgIChmYWNpbF9tYXNrICYgWDI1X01BU0tfV0lORE9XX1NJWkUpKSB7CisJCSpwKysgPSBYMjVfRkFDX1dJTkRPV19TSVpFOworCQkqcCsrID0gZmFjaWxpdGllcy0+d2luc2l6ZV9pbiA/IDogZmFjaWxpdGllcy0+d2luc2l6ZV9vdXQ7CisJCSpwKysgPSBmYWNpbGl0aWVzLT53aW5zaXplX291dCA/IDogZmFjaWxpdGllcy0+d2luc2l6ZV9pbjsKKwl9CisKKwlsZW4gICAgICAgPSBwIC0gYnVmZmVyOworCWJ1ZmZlclswXSA9IGxlbiAtIDE7CisKKwlyZXR1cm4gbGVuOworfQorCisvKgorICoJVHJ5IHRvIHJlYWNoIGEgY29tcHJvbWlzZSBvbiBhIHNldCBvZiBmYWNpbGl0aWVzLgorICoKKyAqCVRoZSBvbmx5IHJlYWwgcHJvYmxlbSBpcyB3aXRoIHJldmVyc2UgY2hhcmdpbmcuCisgKi8KK2ludCB4MjVfbmVnb3RpYXRlX2ZhY2lsaXRpZXMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNvY2sgKnNrLAorCQkJICAgICBzdHJ1Y3QgeDI1X2ZhY2lsaXRpZXMgKm5ldykKK3sKKwlzdHJ1Y3QgeDI1X3NvY2sgKngyNSA9IHgyNV9zayhzayk7CisJc3RydWN0IHgyNV9mYWNpbGl0aWVzICpvdXJzID0gJngyNS0+ZmFjaWxpdGllczsKKwlzdHJ1Y3QgeDI1X2ZhY2lsaXRpZXMgdGhlaXJzOworCWludCBsZW47CisKKwltZW1zZXQoJnRoZWlycywgMCwgc2l6ZW9mKHRoZWlycykpOworCW1lbWNweShuZXcsIG91cnMsIHNpemVvZigqbmV3KSk7CisKKwlsZW4gPSB4MjVfcGFyc2VfZmFjaWxpdGllcyhza2IsICZ0aGVpcnMsICZ4MjUtPnZjX2ZhY2lsX21hc2spOworCisJLyoKKwkgKglUaGV5IHdhbnQgcmV2ZXJzZSBjaGFyZ2luZywgd2Ugd29uJ3QgYWNjZXB0IGl0LgorCSAqLworCWlmICh0aGVpcnMucmV2ZXJzZSAmJiBvdXJzLT5yZXZlcnNlKSB7CisJCVNPQ0tfREVCVUcoc2ssICJYLjI1OiByZWplY3RpbmcgcmV2ZXJzZSBjaGFyZ2luZyByZXF1ZXN0Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwluZXctPnJldmVyc2UgPSB0aGVpcnMucmV2ZXJzZTsKKworCWlmICh0aGVpcnMudGhyb3VnaHB1dCkgeworCQlpZiAodGhlaXJzLnRocm91Z2hwdXQgPCBvdXJzLT50aHJvdWdocHV0KSB7CisJCQlTT0NLX0RFQlVHKHNrLCAiWC4yNTogdGhyb3VnaHB1dCBuZWdvdGlhdGVkIGRvd24iKTsKKwkJCW5ldy0+dGhyb3VnaHB1dCA9IHRoZWlycy50aHJvdWdocHV0OworCQl9CisJfQorCisJaWYgKHRoZWlycy5wYWNzaXplX2luICYmIHRoZWlycy5wYWNzaXplX291dCkgeworCQlpZiAodGhlaXJzLnBhY3NpemVfaW4gPCBvdXJzLT5wYWNzaXplX2luKSB7CisJCQlTT0NLX0RFQlVHKHNrLCAiWC4yNTogcGFja2V0IHNpemUgaW53YXJkcyBuZWdvdGlhdGVkIGRvd24iKTsKKwkJCW5ldy0+cGFjc2l6ZV9pbiA9IHRoZWlycy5wYWNzaXplX2luOworCQl9CisJCWlmICh0aGVpcnMucGFjc2l6ZV9vdXQgPCBvdXJzLT5wYWNzaXplX291dCkgeworCQkJU09DS19ERUJVRyhzaywgIlguMjU6IHBhY2tldCBzaXplIG91dHdhcmRzIG5lZ290aWF0ZWQgZG93biIpOworCQkJbmV3LT5wYWNzaXplX291dCA9IHRoZWlycy5wYWNzaXplX291dDsKKwkJfQorCX0KKworCWlmICh0aGVpcnMud2luc2l6ZV9pbiAmJiB0aGVpcnMud2luc2l6ZV9vdXQpIHsKKwkJaWYgKHRoZWlycy53aW5zaXplX2luIDwgb3Vycy0+d2luc2l6ZV9pbikgeworCQkJU09DS19ERUJVRyhzaywgIlguMjU6IHdpbmRvdyBzaXplIGlud2FyZHMgbmVnb3RpYXRlZCBkb3duIik7CisJCQluZXctPndpbnNpemVfaW4gPSB0aGVpcnMud2luc2l6ZV9pbjsKKwkJfQorCQlpZiAodGhlaXJzLndpbnNpemVfb3V0IDwgb3Vycy0+d2luc2l6ZV9vdXQpIHsKKwkJCVNPQ0tfREVCVUcoc2ssICJYLjI1OiB3aW5kb3cgc2l6ZSBvdXR3YXJkcyBuZWdvdGlhdGVkIGRvd24iKTsKKwkJCW5ldy0+d2luc2l6ZV9vdXQgPSB0aGVpcnMud2luc2l6ZV9vdXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gbGVuOworfQorCisvKgorICoJTGltaXQgdmFsdWVzIG9mIGNlcnRhaW4gZmFjaWxpdGllcyBhY2NvcmRpbmcgdG8gdGhlIGNhcGFiaWxpdHkgb2YgdGhlIAorICogICAgICBjdXJyZW50bHkgYXR0YWNoZWQgeDI1IGxpbmsuCisgKi8KK3ZvaWQgeDI1X2xpbWl0X2ZhY2lsaXRpZXMoc3RydWN0IHgyNV9mYWNpbGl0aWVzICpmYWNpbGl0aWVzLAorCQkJICBzdHJ1Y3QgeDI1X25laWdoICpuYikKK3sKKworCWlmICghbmItPmV4dGVuZGVkKSB7CisJCWlmIChmYWNpbGl0aWVzLT53aW5zaXplX2luICA+IDcpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJYLjI1OiBpbmNvbWluZyB3aW5zaXplIGxpbWl0ZWQgdG8gN1xuIik7CisJCQlmYWNpbGl0aWVzLT53aW5zaXplX2luID0gNzsKKwkJfQorCQlpZiAoZmFjaWxpdGllcy0+d2luc2l6ZV9vdXQgPiA3KSB7CisJCQlmYWNpbGl0aWVzLT53aW5zaXplX291dCA9IDc7CisJCQlwcmludGsoIEtFUk5fREVCVUcgIlguMjU6IG91dGdvaW5nIHdpbnNpemUgbGltaXRlZCB0byA3XG4iKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL25ldC94MjUveDI1X2luLmMgYi9uZXQveDI1L3gyNV9pbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMTk3YzcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQveDI1L3gyNV9pbi5jCkBAIC0wLDAgKzEsMzYxIEBACisvKgorICoJWC4yNSBQYWNrZXQgTGF5ZXIgcmVsZWFzZSAwMDIKKyAqCisgKglUaGlzIGlzIEFMUEhBIHRlc3Qgc29mdHdhcmUuIFRoaXMgY29kZSBtYXkgYnJlYWsgeW91ciBtYWNoaW5lLAorICoJcmFuZG9tbHkgZmFpbCB0byB3b3JrIHdpdGggbmV3IHJlbGVhc2VzLCBtaXNiZWhhdmUgYW5kL29yIGdlbmVyYWxseQorICoJc2NyZXcgdXAuIEl0IG1pZ2h0IGV2ZW4gd29yay4gCisgKgorICoJVGhpcyBjb2RlIFJFUVVJUkVTIDIuMS4xNSBvciBoaWdoZXIKKyAqCisgKglUaGlzIG1vZHVsZToKKyAqCQlUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJSGlzdG9yeQorICoJWC4yNSAwMDEJSm9uYXRoYW4gTmF5bG9yCSAgU3RhcnRlZCBjb2RpbmcuCisgKglYLjI1IDAwMglKb25hdGhhbiBOYXlsb3IJICBDZW50cmFsaXNlZCBkaXNjb25uZWN0aW9uIGNvZGUuCisgKgkJCQkJICBOZXcgdGltZXIgYXJjaGl0ZWN0dXJlLgorICoJMjAwMC0wMy0yMAlEYW5pZWxhIFNxdWFzc29uaSBEaXNhYmxpbmcvZW5hYmxpbmcgb2YgZmFjaWxpdGllcyAKKyAqCQkJCQkgIG5lZ290aWF0aW9uLgorICoJMjAwMC0xMS0xMAlIZW5uZXIgRWlzZW4JICBDaGVjayBhbmQgcmVzZXQgZm9yIG91dC1vZi1zZXF1ZW5jZQorICoJCQkJCSAgaS1mcmFtZXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisjaW5jbHVkZSA8bmV0L3gyNS5oPgorCitzdGF0aWMgaW50IHgyNV9xdWV1ZV9yeF9mcmFtZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIGludCBtb3JlKQoreworCXN0cnVjdCBza19idWZmICpza2JvLCAqc2tibiA9IHNrYjsKKwlzdHJ1Y3QgeDI1X3NvY2sgKngyNSA9IHgyNV9zayhzayk7CisKKwlpZiAobW9yZSkgeworCQl4MjUtPmZyYWdsZW4gKz0gc2tiLT5sZW47CisJCXNrYl9xdWV1ZV90YWlsKCZ4MjUtPmZyYWdtZW50X3F1ZXVlLCBza2IpOworCQlza2Jfc2V0X293bmVyX3Ioc2tiLCBzayk7CisJCXJldHVybiAwOworCX0KKworCWlmICghbW9yZSAmJiB4MjUtPmZyYWdsZW4gPiAwKSB7CS8qIEVuZCBvZiBmcmFnbWVudCAqLworCQlpbnQgbGVuID0geDI1LT5mcmFnbGVuICsgc2tiLT5sZW47CisKKwkJaWYgKChza2JuID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0FUT01JQykpID09IE5VTEwpeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCXNrYl9xdWV1ZV90YWlsKCZ4MjUtPmZyYWdtZW50X3F1ZXVlLCBza2IpOworCisJCXNrYm4tPmgucmF3ID0gc2tibi0+ZGF0YTsKKworCQlza2JvID0gc2tiX2RlcXVldWUoJngyNS0+ZnJhZ21lbnRfcXVldWUpOworCQltZW1jcHkoc2tiX3B1dChza2JuLCBza2JvLT5sZW4pLCBza2JvLT5kYXRhLCBza2JvLT5sZW4pOworCQlrZnJlZV9za2Ioc2tibyk7CisKKwkJd2hpbGUgKChza2JvID0KKwkJCXNrYl9kZXF1ZXVlKCZ4MjUtPmZyYWdtZW50X3F1ZXVlKSkgIT0gTlVMTCkgeworCQkJc2tiX3B1bGwoc2tibywgKHgyNS0+bmVpZ2hib3VyLT5leHRlbmRlZCkgPworCQkJCQlYMjVfRVhUX01JTl9MRU4gOiBYMjVfU1REX01JTl9MRU4pOworCQkJbWVtY3B5KHNrYl9wdXQoc2tibiwgc2tiby0+bGVuKSwgc2tiby0+ZGF0YSwgc2tiby0+bGVuKTsKKwkJCWtmcmVlX3NrYihza2JvKTsKKwkJfQorCisJCXgyNS0+ZnJhZ2xlbiA9IDA7CQkKKwl9CisKKwlza2Jfc2V0X293bmVyX3Ioc2tibiwgc2spOworCXNrYl9xdWV1ZV90YWlsKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tibik7CisJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCisJCXNrLT5za19kYXRhX3JlYWR5KHNrLCBza2JuLT5sZW4pOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTdGF0ZSBtYWNoaW5lIGZvciBzdGF0ZSAxLCBBd2FpdGluZyBDYWxsIEFjY2VwdGVkIFN0YXRlLgorICogVGhlIGhhbmRsaW5nIG9mIHRoZSB0aW1lcihzKSBpcyBpbiBmaWxlIHgyNV90aW1lci5jLgorICogSGFuZGxpbmcgb2Ygc3RhdGUgMCBhbmQgY29ubmVjdGlvbiByZWxlYXNlIGlzIGluIGFmX3gyNS5jLgorICovCitzdGF0aWMgaW50IHgyNV9zdGF0ZTFfbWFjaGluZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIGludCBmcmFtZXR5cGUpCit7CisJc3RydWN0IHgyNV9hZGRyZXNzIHNvdXJjZV9hZGRyLCBkZXN0X2FkZHI7CisKKwlzd2l0Y2ggKGZyYW1ldHlwZSkgeworCQljYXNlIFgyNV9DQUxMX0FDQ0VQVEVEOiB7CisJCQlzdHJ1Y3QgeDI1X3NvY2sgKngyNSA9IHgyNV9zayhzayk7CisKKwkJCXgyNV9zdG9wX3RpbWVyKHNrKTsKKwkJCXgyNS0+Y29uZGl0aW9uID0gMHgwMDsKKwkJCXgyNS0+dnMgICAgICAgID0gMDsKKwkJCXgyNS0+dmEgICAgICAgID0gMDsKKwkJCXgyNS0+dnIgICAgICAgID0gMDsKKwkJCXgyNS0+dmwgICAgICAgID0gMDsKKwkJCXgyNS0+c3RhdGUgICAgID0gWDI1X1NUQVRFXzM7CisJCQlzay0+c2tfc3RhdGUgICA9IFRDUF9FU1RBQkxJU0hFRDsKKwkJCS8qCisJCQkgKglQYXJzZSB0aGUgZGF0YSBpbiB0aGUgZnJhbWUuCisJCQkgKi8KKwkJCXNrYl9wdWxsKHNrYiwgWDI1X1NURF9NSU5fTEVOKTsKKwkJCXNrYl9wdWxsKHNrYiwgeDI1X2FkZHJfbnRvYShza2ItPmRhdGEsICZzb3VyY2VfYWRkciwgJmRlc3RfYWRkcikpOworCQkJc2tiX3B1bGwoc2tiLAorCQkJCSB4MjVfcGFyc2VfZmFjaWxpdGllcyhza2IsICZ4MjUtPmZhY2lsaXRpZXMsCisJCQkJCQkgICAgICAmeDI1LT52Y19mYWNpbF9tYXNrKSk7CisJCQkvKgorCQkJICoJQ29weSBhbnkgQ2FsbCBVc2VyIERhdGEuCisJCQkgKi8KKwkJCWlmIChza2ItPmxlbiA+PSAwKSB7CisJCQkJbWVtY3B5KHgyNS0+Y2FsbHVzZXJkYXRhLmN1ZGRhdGEsIHNrYi0+ZGF0YSwKKwkJCQkgICAgICAgc2tiLT5sZW4pOworCQkJCXgyNS0+Y2FsbHVzZXJkYXRhLmN1ZGxlbmd0aCA9IHNrYi0+bGVuOworCQkJfQorCQkJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCisJCQkJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFgyNV9DTEVBUl9SRVFVRVNUOgorCQkJeDI1X3dyaXRlX2ludGVybmFsKHNrLCBYMjVfQ0xFQVJfQ09ORklSTUFUSU9OKTsKKwkJCXgyNV9kaXNjb25uZWN0KHNrLCBFQ09OTlJFRlVTRUQsIHNrYi0+ZGF0YVszXSwgc2tiLT5kYXRhWzRdKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFN0YXRlIG1hY2hpbmUgZm9yIHN0YXRlIDIsIEF3YWl0aW5nIENsZWFyIENvbmZpcm1hdGlvbiBTdGF0ZS4KKyAqIFRoZSBoYW5kbGluZyBvZiB0aGUgdGltZXIocykgaXMgaW4gZmlsZSB4MjVfdGltZXIuYworICogSGFuZGxpbmcgb2Ygc3RhdGUgMCBhbmQgY29ubmVjdGlvbiByZWxlYXNlIGlzIGluIGFmX3gyNS5jLgorICovCitzdGF0aWMgaW50IHgyNV9zdGF0ZTJfbWFjaGluZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIGludCBmcmFtZXR5cGUpCit7CisJc3dpdGNoIChmcmFtZXR5cGUpIHsKKworCQljYXNlIFgyNV9DTEVBUl9SRVFVRVNUOgorCQkJeDI1X3dyaXRlX2ludGVybmFsKHNrLCBYMjVfQ0xFQVJfQ09ORklSTUFUSU9OKTsKKwkJCXgyNV9kaXNjb25uZWN0KHNrLCAwLCBza2ItPmRhdGFbM10sIHNrYi0+ZGF0YVs0XSk7CisJCQlicmVhazsKKworCQljYXNlIFgyNV9DTEVBUl9DT05GSVJNQVRJT046CisJCQl4MjVfZGlzY29ubmVjdChzaywgMCwgMCwgMCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTdGF0ZSBtYWNoaW5lIGZvciBzdGF0ZSAzLCBDb25uZWN0ZWQgU3RhdGUuCisgKiBUaGUgaGFuZGxpbmcgb2YgdGhlIHRpbWVyKHMpIGlzIGluIGZpbGUgeDI1X3RpbWVyLmMKKyAqIEhhbmRsaW5nIG9mIHN0YXRlIDAgYW5kIGNvbm5lY3Rpb24gcmVsZWFzZSBpcyBpbiBhZl94MjUuYy4KKyAqLworc3RhdGljIGludCB4MjVfc3RhdGUzX21hY2hpbmUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZnJhbWV0eXBlLCBpbnQgbnMsIGludCBuciwgaW50IHEsIGludCBkLCBpbnQgbSkKK3sKKwlpbnQgcXVldWVkID0gMDsKKwlpbnQgbW9kdWx1czsKKwlzdHJ1Y3QgeDI1X3NvY2sgKngyNSA9IHgyNV9zayhzayk7CisJCisJbW9kdWx1cyA9ICh4MjUtPm5laWdoYm91ci0+ZXh0ZW5kZWQpID8gWDI1X0VNT0RVTFVTIDogWDI1X1NNT0RVTFVTOworCisJc3dpdGNoIChmcmFtZXR5cGUpIHsKKworCQljYXNlIFgyNV9SRVNFVF9SRVFVRVNUOgorCQkJeDI1X3dyaXRlX2ludGVybmFsKHNrLCBYMjVfUkVTRVRfQ09ORklSTUFUSU9OKTsKKwkJCXgyNV9zdG9wX3RpbWVyKHNrKTsKKwkJCXgyNS0+Y29uZGl0aW9uID0gMHgwMDsKKwkJCXgyNS0+dnMgICAgICAgID0gMDsKKwkJCXgyNS0+dnIgICAgICAgID0gMDsKKwkJCXgyNS0+dmEgICAgICAgID0gMDsKKwkJCXgyNS0+dmwgICAgICAgID0gMDsKKwkJCXgyNV9yZXF1ZXVlX2ZyYW1lcyhzayk7CisJCQlicmVhazsKKworCQljYXNlIFgyNV9DTEVBUl9SRVFVRVNUOgorCQkJeDI1X3dyaXRlX2ludGVybmFsKHNrLCBYMjVfQ0xFQVJfQ09ORklSTUFUSU9OKTsKKwkJCXgyNV9kaXNjb25uZWN0KHNrLCAwLCBza2ItPmRhdGFbM10sIHNrYi0+ZGF0YVs0XSk7CisJCQlicmVhazsKKworCQljYXNlIFgyNV9SUjoKKwkJY2FzZSBYMjVfUk5SOgorCQkJaWYgKCF4MjVfdmFsaWRhdGVfbnIoc2ssIG5yKSkgeworCQkJCXgyNV9jbGVhcl9xdWV1ZXMoc2spOworCQkJCXgyNV93cml0ZV9pbnRlcm5hbChzaywgWDI1X1JFU0VUX1JFUVVFU1QpOworCQkJCXgyNV9zdGFydF90MjJ0aW1lcihzayk7CisJCQkJeDI1LT5jb25kaXRpb24gPSAweDAwOworCQkJCXgyNS0+dnMgICAgICAgID0gMDsKKwkJCQl4MjUtPnZyICAgICAgICA9IDA7CisJCQkJeDI1LT52YSAgICAgICAgPSAwOworCQkJCXgyNS0+dmwgICAgICAgID0gMDsKKwkJCQl4MjUtPnN0YXRlICAgICA9IFgyNV9TVEFURV80OworCQkJfSBlbHNlIHsKKwkJCQl4MjVfZnJhbWVzX2Fja2VkKHNrLCBucik7CisJCQkJaWYgKGZyYW1ldHlwZSA9PSBYMjVfUk5SKSB7CisJCQkJCXgyNS0+Y29uZGl0aW9uIHw9IFgyNV9DT05EX1BFRVJfUlhfQlVTWTsKKwkJCQl9IGVsc2UgeworCQkJCQl4MjUtPmNvbmRpdGlvbiAmPSB+WDI1X0NPTkRfUEVFUl9SWF9CVVNZOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgWDI1X0RBVEE6CS8qIFhYWCAqLworCQkJeDI1LT5jb25kaXRpb24gJj0gflgyNV9DT05EX1BFRVJfUlhfQlVTWTsKKwkJCWlmICgobnMgIT0geDI1LT52cikgfHwgIXgyNV92YWxpZGF0ZV9ucihzaywgbnIpKSB7CisJCQkJeDI1X2NsZWFyX3F1ZXVlcyhzayk7CisJCQkJeDI1X3dyaXRlX2ludGVybmFsKHNrLCBYMjVfUkVTRVRfUkVRVUVTVCk7CisJCQkJeDI1X3N0YXJ0X3QyMnRpbWVyKHNrKTsKKwkJCQl4MjUtPmNvbmRpdGlvbiA9IDB4MDA7CisJCQkJeDI1LT52cyAgICAgICAgPSAwOworCQkJCXgyNS0+dnIgICAgICAgID0gMDsKKwkJCQl4MjUtPnZhICAgICAgICA9IDA7CisJCQkJeDI1LT52bCAgICAgICAgPSAwOworCQkJCXgyNS0+c3RhdGUgICAgID0gWDI1X1NUQVRFXzQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQl4MjVfZnJhbWVzX2Fja2VkKHNrLCBucik7CisJCQlpZiAobnMgPT0geDI1LT52cikgeworCQkJCWlmICh4MjVfcXVldWVfcnhfZnJhbWUoc2ssIHNrYiwgbSkgPT0gMCkgeworCQkJCQl4MjUtPnZyID0gKHgyNS0+dnIgKyAxKSAlIG1vZHVsdXM7CisJCQkJCXF1ZXVlZCA9IDE7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQkJCQl4MjVfY2xlYXJfcXVldWVzKHNrKTsKKwkJCQkJeDI1X3dyaXRlX2ludGVybmFsKHNrLCBYMjVfUkVTRVRfUkVRVUVTVCk7CisJCQkJCXgyNV9zdGFydF90MjJ0aW1lcihzayk7CisJCQkJCXgyNS0+Y29uZGl0aW9uID0gMHgwMDsKKwkJCQkJeDI1LT52cyAgICAgICAgPSAwOworCQkJCQl4MjUtPnZyICAgICAgICA9IDA7CisJCQkJCXgyNS0+dmEgICAgICAgID0gMDsKKwkJCQkJeDI1LT52bCAgICAgICAgPSAwOworCQkJCQl4MjUtPnN0YXRlICAgICA9IFgyNV9TVEFURV80OworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPgorCQkJCSAgICAoc2stPnNrX3JjdmJ1ZiAvIDIpKQorCQkJCQl4MjUtPmNvbmRpdGlvbiB8PSBYMjVfQ09ORF9PV05fUlhfQlVTWTsKKwkJCX0KKwkJCS8qCisJCQkgKglJZiB0aGUgd2luZG93IGlzIGZ1bGwgQWNrIGl0IGltbWVkaWF0ZWx5LCBlbHNlCisJCQkgKglzdGFydCB0aGUgaG9sZGJhY2sgdGltZXIuCisJCQkgKi8KKwkJCWlmICgoKHgyNS0+dmwgKyB4MjUtPmZhY2lsaXRpZXMud2luc2l6ZV9pbikgJSBtb2R1bHVzKSA9PSB4MjUtPnZyKSB7CisJCQkJeDI1LT5jb25kaXRpb24gJj0gflgyNV9DT05EX0FDS19QRU5ESU5HOworCQkJCXgyNV9zdG9wX3RpbWVyKHNrKTsKKwkJCQl4MjVfZW5xdWlyeV9yZXNwb25zZShzayk7CisJCQl9IGVsc2UgeworCQkJCXgyNS0+Y29uZGl0aW9uIHw9IFgyNV9DT05EX0FDS19QRU5ESU5HOworCQkJCXgyNV9zdGFydF90MnRpbWVyKHNrKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgWDI1X0lOVEVSUlVQVF9DT05GSVJNQVRJT046CisJCQl4MjUtPmludGZsYWcgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBYMjVfSU5URVJSVVBUOgorCQkJaWYgKHNvY2tfZmxhZyhzaywgU09DS19VUkdJTkxJTkUpKQorCQkJCXF1ZXVlZCA9ICFzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYik7CisJCQllbHNlIHsKKwkJCQlza2Jfc2V0X293bmVyX3Ioc2tiLCBzayk7CisJCQkJc2tiX3F1ZXVlX3RhaWwoJngyNS0+aW50ZXJydXB0X2luX3F1ZXVlLCBza2IpOworCQkJCXF1ZXVlZCA9IDE7CisJCQl9CisJCQlza19zZW5kX3NpZ3VyZyhzayk7CisJCQl4MjVfd3JpdGVfaW50ZXJuYWwoc2ssIFgyNV9JTlRFUlJVUFRfQ09ORklSTUFUSU9OKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ4MjU6IHVua25vd24gJTAyWCBpbiBzdGF0ZSAzXG4iLCBmcmFtZXR5cGUpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHF1ZXVlZDsKK30KKworLyoKKyAqIFN0YXRlIG1hY2hpbmUgZm9yIHN0YXRlIDQsIEF3YWl0aW5nIFJlc2V0IENvbmZpcm1hdGlvbiBTdGF0ZS4KKyAqIFRoZSBoYW5kbGluZyBvZiB0aGUgdGltZXIocykgaXMgaW4gZmlsZSB4MjVfdGltZXIuYworICogSGFuZGxpbmcgb2Ygc3RhdGUgMCBhbmQgY29ubmVjdGlvbiByZWxlYXNlIGlzIGluIGFmX3gyNS5jLgorICovCitzdGF0aWMgaW50IHgyNV9zdGF0ZTRfbWFjaGluZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIGludCBmcmFtZXR5cGUpCit7CisJc3dpdGNoIChmcmFtZXR5cGUpIHsKKworCQljYXNlIFgyNV9SRVNFVF9SRVFVRVNUOgorCQkJeDI1X3dyaXRlX2ludGVybmFsKHNrLCBYMjVfUkVTRVRfQ09ORklSTUFUSU9OKTsKKwkJY2FzZSBYMjVfUkVTRVRfQ09ORklSTUFUSU9OOiB7CisJCQlzdHJ1Y3QgeDI1X3NvY2sgKngyNSA9IHgyNV9zayhzayk7CisKKwkJCXgyNV9zdG9wX3RpbWVyKHNrKTsKKwkJCXgyNS0+Y29uZGl0aW9uID0gMHgwMDsKKwkJCXgyNS0+dmEgICAgICAgID0gMDsKKwkJCXgyNS0+dnIgICAgICAgID0gMDsKKwkJCXgyNS0+dnMgICAgICAgID0gMDsKKwkJCXgyNS0+dmwgICAgICAgID0gMDsKKwkJCXgyNS0+c3RhdGUgICAgID0gWDI1X1NUQVRFXzM7CisJCQl4MjVfcmVxdWV1ZV9mcmFtZXMoc2spOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBYMjVfQ0xFQVJfUkVRVUVTVDoKKwkJCXgyNV93cml0ZV9pbnRlcm5hbChzaywgWDI1X0NMRUFSX0NPTkZJUk1BVElPTik7CisJCQl4MjVfZGlzY29ubmVjdChzaywgMCwgc2tiLT5kYXRhWzNdLCBza2ItPmRhdGFbNF0pOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKiBIaWdoZXIgbGV2ZWwgdXBjYWxsIGZvciBhIExBUEIgZnJhbWUgKi8KK2ludCB4MjVfcHJvY2Vzc19yeF9mcmFtZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHgyNV9zb2NrICp4MjUgPSB4MjVfc2soc2spOworCWludCBxdWV1ZWQgPSAwLCBmcmFtZXR5cGUsIG5zLCBuciwgcSwgZCwgbTsKKworCWlmICh4MjUtPnN0YXRlID09IFgyNV9TVEFURV8wKQorCQlyZXR1cm4gMDsKKworCWZyYW1ldHlwZSA9IHgyNV9kZWNvZGUoc2ssIHNrYiwgJm5zLCAmbnIsICZxLCAmZCwgJm0pOworCisJc3dpdGNoICh4MjUtPnN0YXRlKSB7CisJCWNhc2UgWDI1X1NUQVRFXzE6CisJCQlxdWV1ZWQgPSB4MjVfc3RhdGUxX21hY2hpbmUoc2ssIHNrYiwgZnJhbWV0eXBlKTsKKwkJCWJyZWFrOworCQljYXNlIFgyNV9TVEFURV8yOgorCQkJcXVldWVkID0geDI1X3N0YXRlMl9tYWNoaW5lKHNrLCBza2IsIGZyYW1ldHlwZSk7CisJCQlicmVhazsKKwkJY2FzZSBYMjVfU1RBVEVfMzoKKwkJCXF1ZXVlZCA9IHgyNV9zdGF0ZTNfbWFjaGluZShzaywgc2tiLCBmcmFtZXR5cGUsIG5zLCBuciwgcSwgZCwgbSk7CisJCQlicmVhazsKKwkJY2FzZSBYMjVfU1RBVEVfNDoKKwkJCXF1ZXVlZCA9IHgyNV9zdGF0ZTRfbWFjaGluZShzaywgc2tiLCBmcmFtZXR5cGUpOworCQkJYnJlYWs7CisJfQorCisJeDI1X2tpY2soc2spOworCisJcmV0dXJuIHF1ZXVlZDsKK30KKworaW50IHgyNV9iYWNrbG9nX3JjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHF1ZXVlZCA9IHgyNV9wcm9jZXNzX3J4X2ZyYW1lKHNrLCBza2IpOworCisJaWYgKCFxdWV1ZWQpCisJCWtmcmVlX3NrYihza2IpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9uZXQveDI1L3gyNV9saW5rLmMgYi9uZXQveDI1L3gyNV9saW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE3NjBmZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC94MjUveDI1X2xpbmsuYwpAQCAtMCwwICsxLDQwMSBAQAorLyoKKyAqCVguMjUgUGFja2V0IExheWVyIHJlbGVhc2UgMDAyCisgKgorICoJVGhpcyBpcyBBTFBIQSB0ZXN0IHNvZnR3YXJlLiBUaGlzIGNvZGUgbWF5IGJyZWFrIHlvdXIgbWFjaGluZSwKKyAqCXJhbmRvbWx5IGZhaWwgdG8gd29yayB3aXRoIG5ldyByZWxlYXNlcywgbWlzYmVoYXZlIGFuZC9vciBnZW5lcmFsbHkKKyAqCXNjcmV3IHVwLiBJdCBtaWdodCBldmVuIHdvcmsuIAorICoKKyAqCVRoaXMgY29kZSBSRVFVSVJFUyAyLjEuMTUgb3IgaGlnaGVyCisgKgorICoJVGhpcyBtb2R1bGU6CisgKgkJVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCUhpc3RvcnkKKyAqCVguMjUgMDAxCUpvbmF0aGFuIE5heWxvcgkgIFN0YXJ0ZWQgY29kaW5nLgorICoJWC4yNSAwMDIJSm9uYXRoYW4gTmF5bG9yCSAgTmV3IHRpbWVyIGFyY2hpdGVjdHVyZS4KKyAqCW1hci8yMC8wMAlEYW5pZWxhIFNxdWFzc29uaSBEaXNhYmxpbmcvZW5hYmxpbmcgb2YgZmFjaWxpdGllcyAKKyAqCQkJCQkgIG5lZ290aWF0aW9uLgorICoJMjAwMC0wOS0wNAlIZW5uZXIgRWlzZW4JICBkZXZfaG9sZCgpIC8gZGV2X3B1dCgpIGZvciB4MjVfbmVpZ2guCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPG5ldC94MjUuaD4KKworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgeDI1X25laWdoX2xpc3QgPSBMSVNUX0hFQURfSU5JVCh4MjVfbmVpZ2hfbGlzdCk7CitzdGF0aWMgREVGSU5FX1JXTE9DSyh4MjVfbmVpZ2hfbGlzdF9sb2NrKTsKKworc3RhdGljIHZvaWQgeDI1X3QyMHRpbWVyX2V4cGlyeSh1bnNpZ25lZCBsb25nKTsKKworc3RhdGljIHZvaWQgeDI1X3RyYW5zbWl0X3Jlc3RhcnRfY29uZmlybWF0aW9uKHN0cnVjdCB4MjVfbmVpZ2ggKm5iKTsKK3N0YXRpYyB2b2lkIHgyNV90cmFuc21pdF9yZXN0YXJ0X3JlcXVlc3Qoc3RydWN0IHgyNV9uZWlnaCAqbmIpOworCisvKgorICoJTGludXggc2V0L3Jlc2V0IHRpbWVyIHJvdXRpbmVzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB4MjVfc3RhcnRfdDIwdGltZXIoc3RydWN0IHgyNV9uZWlnaCAqbmIpCit7CisJbW9kX3RpbWVyKCZuYi0+dDIwdGltZXIsIGppZmZpZXMgKyBuYi0+dDIwKTsKK30KKworc3RhdGljIHZvaWQgeDI1X3QyMHRpbWVyX2V4cGlyeSh1bnNpZ25lZCBsb25nIHBhcmFtKQoreworCXN0cnVjdCB4MjVfbmVpZ2ggKm5iID0gKHN0cnVjdCB4MjVfbmVpZ2ggKilwYXJhbTsKKworCXgyNV90cmFuc21pdF9yZXN0YXJ0X3JlcXVlc3QobmIpOworCisJeDI1X3N0YXJ0X3QyMHRpbWVyKG5iKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHgyNV9zdG9wX3QyMHRpbWVyKHN0cnVjdCB4MjVfbmVpZ2ggKm5iKQoreworCWRlbF90aW1lcigmbmItPnQyMHRpbWVyKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgeDI1X3QyMHRpbWVyX3BlbmRpbmcoc3RydWN0IHgyNV9uZWlnaCAqbmIpCit7CisJcmV0dXJuIHRpbWVyX3BlbmRpbmcoJm5iLT50MjB0aW1lcik7Cit9CisKKy8qCisgKglUaGlzIGhhbmRsZXMgYWxsIHJlc3RhcnQgYW5kIGRpYWdub3N0aWMgZnJhbWVzLgorICovCit2b2lkIHgyNV9saW5rX2NvbnRyb2woc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHgyNV9uZWlnaCAqbmIsCisJCSAgICAgIHVuc2lnbmVkIHNob3J0IGZyYW1ldHlwZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tibjsKKwlpbnQgY29uZmlybTsKKworCXN3aXRjaCAoZnJhbWV0eXBlKSB7CisJCWNhc2UgWDI1X1JFU1RBUlRfUkVRVUVTVDoKKwkJCWNvbmZpcm0gPSAheDI1X3QyMHRpbWVyX3BlbmRpbmcobmIpOworCQkJeDI1X3N0b3BfdDIwdGltZXIobmIpOworCQkJbmItPnN0YXRlID0gWDI1X0xJTktfU1RBVEVfMzsKKwkJCWlmIChjb25maXJtKQorCQkJCXgyNV90cmFuc21pdF9yZXN0YXJ0X2NvbmZpcm1hdGlvbihuYik7CisJCQlicmVhazsKKworCQljYXNlIFgyNV9SRVNUQVJUX0NPTkZJUk1BVElPTjoKKwkJCXgyNV9zdG9wX3QyMHRpbWVyKG5iKTsKKwkJCW5iLT5zdGF0ZSA9IFgyNV9MSU5LX1NUQVRFXzM7CisJCQlicmVhazsKKworCQljYXNlIFgyNV9ESUFHTk9TVElDOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAieDI1OiBkaWFnbm9zdGljICMlZCAtICIKKwkJCSAgICAgICAiJTAyWCAlMDJYICUwMlhcbiIsCisJCQkgICAgICAgc2tiLT5kYXRhWzNdLCBza2ItPmRhdGFbNF0sCisJCQkgICAgICAgc2tiLT5kYXRhWzVdLCBza2ItPmRhdGFbNl0pOworCQkJYnJlYWs7CisJCQkKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIngyNTogcmVjZWl2ZWQgdW5rbm93biAlMDJYICIKKwkJCSAgICAgICAid2l0aCBMQ0kgMDAwXG4iLCBmcmFtZXR5cGUpOworCQkJYnJlYWs7CisJfQorCisJaWYgKG5iLT5zdGF0ZSA9PSBYMjVfTElOS19TVEFURV8zKQorCQl3aGlsZSAoKHNrYm4gPSBza2JfZGVxdWV1ZSgmbmItPnF1ZXVlKSkgIT0gTlVMTCkKKwkJCXgyNV9zZW5kX2ZyYW1lKHNrYm4sIG5iKTsKK30KKworLyoKKyAqCVRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiBhIFJlc3RhcnQgUmVxdWVzdCBpcyBuZWVkZWQKKyAqLworc3RhdGljIHZvaWQgeDI1X3RyYW5zbWl0X3Jlc3RhcnRfcmVxdWVzdChzdHJ1Y3QgeDI1X25laWdoICpuYikKK3sKKwl1bnNpZ25lZCBjaGFyICpkcHRyOworCWludCBsZW4gPSBYMjVfTUFYX0wyX0xFTiArIFgyNV9TVERfTUlOX0xFTiArIDI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpOworCisJaWYgKCFza2IpCisJCXJldHVybjsKKworCXNrYl9yZXNlcnZlKHNrYiwgWDI1X01BWF9MMl9MRU4pOworCisJZHB0ciA9IHNrYl9wdXQoc2tiLCBYMjVfU1REX01JTl9MRU4gKyAyKTsKKworCSpkcHRyKysgPSBuYi0+ZXh0ZW5kZWQgPyBYMjVfR0ZJX0VYVFNFUSA6IFgyNV9HRklfU1REU0VROworCSpkcHRyKysgPSAweDAwOworCSpkcHRyKysgPSBYMjVfUkVTVEFSVF9SRVFVRVNUOworCSpkcHRyKysgPSAweDAwOworCSpkcHRyKysgPSAwOworCisJc2tiLT5zayA9IE5VTEw7CisKKwl4MjVfc2VuZF9mcmFtZShza2IsIG5iKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiBhIFJlc3RhcnQgQ29uZmlybWF0aW9uIGlzIG5lZWRlZAorICovCitzdGF0aWMgdm9pZCB4MjVfdHJhbnNtaXRfcmVzdGFydF9jb25maXJtYXRpb24oc3RydWN0IHgyNV9uZWlnaCAqbmIpCit7CisJdW5zaWduZWQgY2hhciAqZHB0cjsKKwlpbnQgbGVuID0gWDI1X01BWF9MMl9MRU4gKyBYMjVfU1REX01JTl9MRU47CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpOworCisJaWYgKCFza2IpCisJCXJldHVybjsKKworCXNrYl9yZXNlcnZlKHNrYiwgWDI1X01BWF9MMl9MRU4pOworCisJZHB0ciA9IHNrYl9wdXQoc2tiLCBYMjVfU1REX01JTl9MRU4pOworCisJKmRwdHIrKyA9IG5iLT5leHRlbmRlZCA/IFgyNV9HRklfRVhUU0VRIDogWDI1X0dGSV9TVERTRVE7CisJKmRwdHIrKyA9IDB4MDA7CisJKmRwdHIrKyA9IFgyNV9SRVNUQVJUX0NPTkZJUk1BVElPTjsKKworCXNrYi0+c2sgPSBOVUxMOworCisJeDI1X3NlbmRfZnJhbWUoc2tiLCBuYik7Cit9CisKKy8qCisgKglUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gYSBDbGVhciBSZXF1ZXN0IGlzIG5lZWRlZCBvdXRzaWRlIG9mIHRoZSBjb250ZXh0CisgKglvZiBhIGNvbm5lY3RlZCBzb2NrZXQuCisgKi8KK3ZvaWQgeDI1X3RyYW5zbWl0X2NsZWFyX3JlcXVlc3Qoc3RydWN0IHgyNV9uZWlnaCAqbmIsIHVuc2lnbmVkIGludCBsY2ksCisJCQkJdW5zaWduZWQgY2hhciBjYXVzZSkKK3sKKwl1bnNpZ25lZCBjaGFyICpkcHRyOworCWludCBsZW4gPSBYMjVfTUFYX0wyX0xFTiArIFgyNV9TVERfTUlOX0xFTiArIDI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpOworCisJaWYgKCFza2IpCisJCXJldHVybjsKKworCXNrYl9yZXNlcnZlKHNrYiwgWDI1X01BWF9MMl9MRU4pOworCisJZHB0ciA9IHNrYl9wdXQoc2tiLCBYMjVfU1REX01JTl9MRU4gKyAyKTsKKworCSpkcHRyKysgPSAoKGxjaSA+PiA4KSAmIDB4MEYpIHwgKG5iLT5leHRlbmRlZCA/CisJCQkJCSBYMjVfR0ZJX0VYVFNFUSA6CisJCQkJCSBYMjVfR0ZJX1NURFNFUSk7CisJKmRwdHIrKyA9IChsY2kgPj4gMCkgJiAweEZGOworCSpkcHRyKysgPSBYMjVfQ0xFQVJfUkVRVUVTVDsKKwkqZHB0cisrID0gY2F1c2U7CisJKmRwdHIrKyA9IDB4MDA7CisKKwlza2ItPnNrID0gTlVMTDsKKworCXgyNV9zZW5kX2ZyYW1lKHNrYiwgbmIpOworfQorCit2b2lkIHgyNV90cmFuc21pdF9saW5rKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB4MjVfbmVpZ2ggKm5iKQoreworCXN3aXRjaCAobmItPnN0YXRlKSB7CisJCWNhc2UgWDI1X0xJTktfU1RBVEVfMDoKKwkJCXNrYl9xdWV1ZV90YWlsKCZuYi0+cXVldWUsIHNrYik7CisJCQluYi0+c3RhdGUgPSBYMjVfTElOS19TVEFURV8xOworCQkJeDI1X2VzdGFibGlzaF9saW5rKG5iKTsKKwkJCWJyZWFrOworCQljYXNlIFgyNV9MSU5LX1NUQVRFXzE6CisJCWNhc2UgWDI1X0xJTktfU1RBVEVfMjoKKwkJCXNrYl9xdWV1ZV90YWlsKCZuYi0+cXVldWUsIHNrYik7CisJCQlicmVhazsKKwkJY2FzZSBYMjVfTElOS19TVEFURV8zOgorCQkJeDI1X3NlbmRfZnJhbWUoc2tiLCBuYik7CisJCQlicmVhazsKKwl9Cit9CisKKy8qCisgKglDYWxsZWQgd2hlbiB0aGUgbGluayBsYXllciBoYXMgYmVjb21lIGVzdGFibGlzaGVkLgorICovCit2b2lkIHgyNV9saW5rX2VzdGFibGlzaGVkKHN0cnVjdCB4MjVfbmVpZ2ggKm5iKQoreworCXN3aXRjaCAobmItPnN0YXRlKSB7CisJCWNhc2UgWDI1X0xJTktfU1RBVEVfMDoKKwkJCW5iLT5zdGF0ZSA9IFgyNV9MSU5LX1NUQVRFXzI7CisJCQlicmVhazsKKwkJY2FzZSBYMjVfTElOS19TVEFURV8xOgorCQkJeDI1X3RyYW5zbWl0X3Jlc3RhcnRfcmVxdWVzdChuYik7CisJCQluYi0+c3RhdGUgPSBYMjVfTElOS19TVEFURV8yOworCQkJeDI1X3N0YXJ0X3QyMHRpbWVyKG5iKTsKKwkJCWJyZWFrOworCX0KK30KKworLyoKKyAqCUNhbGxlZCB3aGVuIHRoZSBsaW5rIGxheWVyIGhhcyB0ZXJtaW5hdGVkLCBvciBhbiBlc3RhYmxpc2htZW50CisgKglyZXF1ZXN0IGhhcyBmYWlsZWQuCisgKi8KKwordm9pZCB4MjVfbGlua190ZXJtaW5hdGVkKHN0cnVjdCB4MjVfbmVpZ2ggKm5iKQoreworCW5iLT5zdGF0ZSA9IFgyNV9MSU5LX1NUQVRFXzA7CisJLyogT3V0IG9mIG9yZGVyOiBjbGVhciBleGlzdGluZyB2aXJ0dWFsIGNhbGxzIChYLjI1IDAzLzkzIDQuNi4zKSAqLworCXgyNV9raWxsX2J5X25laWdoKG5iKTsKK30KKworLyoKKyAqCUFkZCBhIG5ldyBkZXZpY2UuCisgKi8KK3ZvaWQgeDI1X2xpbmtfZGV2aWNlX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHgyNV9uZWlnaCAqbmIgPSBrbWFsbG9jKHNpemVvZigqbmIpLCBHRlBfQVRPTUlDKTsKKworCWlmICghbmIpCisJCXJldHVybjsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJm5iLT5xdWV1ZSk7CisKKwlpbml0X3RpbWVyKCZuYi0+dDIwdGltZXIpOworCW5iLT50MjB0aW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKW5iOworCW5iLT50MjB0aW1lci5mdW5jdGlvbiA9ICZ4MjVfdDIwdGltZXJfZXhwaXJ5OworCisJZGV2X2hvbGQoZGV2KTsKKwluYi0+ZGV2ICAgICAgPSBkZXY7CisJbmItPnN0YXRlICAgID0gWDI1X0xJTktfU1RBVEVfMDsKKwluYi0+ZXh0ZW5kZWQgPSAwOworCS8qCisJICogRW5hYmxlcyBuZWdvdGlhdGlvbgorCSAqLworCW5iLT5nbG9iYWxfZmFjaWxfbWFzayA9IFgyNV9NQVNLX1JFVkVSU0UgfAorCQkJCSAgICAgICBYMjVfTUFTS19USFJPVUdIUFVUIHwKKwkJCQkgICAgICAgWDI1X01BU0tfUEFDS0VUX1NJWkUgfAorCQkJCSAgICAgICBYMjVfTUFTS19XSU5ET1dfU0laRTsKKwluYi0+dDIwICAgICAgPSBzeXNjdGxfeDI1X3Jlc3RhcnRfcmVxdWVzdF90aW1lb3V0OworCWF0b21pY19zZXQoJm5iLT5yZWZjbnQsIDEpOworCisJd3JpdGVfbG9ja19iaCgmeDI1X25laWdoX2xpc3RfbG9jayk7CisJbGlzdF9hZGQoJm5iLT5ub2RlLCAmeDI1X25laWdoX2xpc3QpOworCXdyaXRlX3VubG9ja19iaCgmeDI1X25laWdoX2xpc3RfbG9jayk7Cit9CisKKy8qKgorICoJX194MjVfcmVtb3ZlX25laWdoIC0gcmVtb3ZlIG5laWdoYm91ciBmcm9tIHgyNV9uZWlnaF9saXN0CisgKglAbmIgLSBuZWlnaCB0byByZW1vdmUKKyAqCisgKglSZW1vdmUgbmVpZ2hib3VyIGZyb20geDI1X25laWdoX2xpc3QuIElmIGl0IHdhcyB0aGVyZS4KKyAqCUNhbGxlciBtdXN0IGhvbGQgeDI1X25laWdoX2xpc3RfbG9jay4KKyAqLworc3RhdGljIHZvaWQgX194MjVfcmVtb3ZlX25laWdoKHN0cnVjdCB4MjVfbmVpZ2ggKm5iKQoreworCXNrYl9xdWV1ZV9wdXJnZSgmbmItPnF1ZXVlKTsKKwl4MjVfc3RvcF90MjB0aW1lcihuYik7CisKKwlpZiAobmItPm5vZGUubmV4dCkgeworCQlsaXN0X2RlbCgmbmItPm5vZGUpOworCQl4MjVfbmVpZ2hfcHV0KG5iKTsKKwl9Cit9CisKKy8qCisgKglBIGRldmljZSBoYXMgYmVlbiByZW1vdmVkLCByZW1vdmUgaXRzIGxpbmtzLgorICovCit2b2lkIHgyNV9saW5rX2RldmljZV9kb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHgyNV9uZWlnaCAqbmI7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICp0bXA7CisKKwl3cml0ZV9sb2NrX2JoKCZ4MjVfbmVpZ2hfbGlzdF9sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgdG1wLCAmeDI1X25laWdoX2xpc3QpIHsKKwkJbmIgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgeDI1X25laWdoLCBub2RlKTsKKworCQlpZiAobmItPmRldiA9PSBkZXYpIHsKKwkJCV9feDI1X3JlbW92ZV9uZWlnaChuYik7CisJCQlkZXZfcHV0KGRldik7CisJCX0KKwl9CisKKwl3cml0ZV91bmxvY2tfYmgoJngyNV9uZWlnaF9saXN0X2xvY2spOworfQorCisvKgorICoJR2l2ZW4gYSBkZXZpY2UsIHJldHVybiB0aGUgbmVpZ2hib3VyIGFkZHJlc3MuCisgKi8KK3N0cnVjdCB4MjVfbmVpZ2ggKngyNV9nZXRfbmVpZ2goc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeDI1X25laWdoICpuYiwgKnVzZSA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisKKwlyZWFkX2xvY2tfYmgoJngyNV9uZWlnaF9saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2goZW50cnksICZ4MjVfbmVpZ2hfbGlzdCkgeworCQluYiA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCB4MjVfbmVpZ2gsIG5vZGUpOworCisJCWlmIChuYi0+ZGV2ID09IGRldikgeworCQkJdXNlID0gbmI7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICh1c2UpCisJCXgyNV9uZWlnaF9ob2xkKHVzZSk7CisJcmVhZF91bmxvY2tfYmgoJngyNV9uZWlnaF9saXN0X2xvY2spOworCXJldHVybiB1c2U7Cit9CisKKy8qCisgKglIYW5kbGUgdGhlIGlvY3RscyB0aGF0IGNvbnRyb2wgdGhlIHN1YnNjcmlwdGlvbiBmdW5jdGlvbnMuCisgKi8KK2ludCB4MjVfc3Vic2NyX2lvY3RsKHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IHgyNV9zdWJzY3JpcF9zdHJ1Y3QgeDI1X3N1YnNjcjsKKwlzdHJ1Y3QgeDI1X25laWdoICpuYjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCByYyA9IC1FSU5WQUw7CisKKwlpZiAoY21kICE9IFNJT0NYMjVHU1VCU0NSSVAgJiYgY21kICE9IFNJT0NYMjVTU1VCU0NSSVApCisJCWdvdG8gb3V0OworCisJcmMgPSAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcigmeDI1X3N1YnNjciwgYXJnLCBzaXplb2YoeDI1X3N1YnNjcikpKQorCQlnb3RvIG91dDsKKworCXJjID0gLUVJTlZBTDsKKwlpZiAoKGRldiA9IHgyNV9kZXZfZ2V0KHgyNV9zdWJzY3IuZGV2aWNlKSkgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlpZiAoKG5iID0geDI1X2dldF9uZWlnaChkZXYpKSA9PSBOVUxMKQorCQlnb3RvIG91dF9kZXZfcHV0OworCisJZGV2X3B1dChkZXYpOworCisJaWYgKGNtZCA9PSBTSU9DWDI1R1NVQlNDUklQKSB7CisJCXgyNV9zdWJzY3IuZXh0ZW5kZWQJICAgICA9IG5iLT5leHRlbmRlZDsKKwkJeDI1X3N1YnNjci5nbG9iYWxfZmFjaWxfbWFzayA9IG5iLT5nbG9iYWxfZmFjaWxfbWFzazsKKwkJcmMgPSBjb3B5X3RvX3VzZXIoYXJnLCAmeDI1X3N1YnNjciwKKwkJCQkgIHNpemVvZih4MjVfc3Vic2NyKSkgPyAtRUZBVUxUIDogMDsKKwl9IGVsc2UgeworCQlyYyA9IC1FSU5WQUw7CisJCWlmICghKHgyNV9zdWJzY3IuZXh0ZW5kZWQgJiYgeDI1X3N1YnNjci5leHRlbmRlZCAhPSAxKSkgeworCQkJcmMgPSAwOworCQkJbmItPmV4dGVuZGVkCSAgICAgPSB4MjVfc3Vic2NyLmV4dGVuZGVkOworCQkJbmItPmdsb2JhbF9mYWNpbF9tYXNrID0geDI1X3N1YnNjci5nbG9iYWxfZmFjaWxfbWFzazsKKwkJfQorCX0KKwl4MjVfbmVpZ2hfcHV0KG5iKTsKK291dDoKKwlyZXR1cm4gcmM7CitvdXRfZGV2X3B1dDoKKwlkZXZfcHV0KGRldik7CisJZ290byBvdXQ7Cit9CisKKworLyoKKyAqCVJlbGVhc2UgYWxsIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggWC4yNSBuZWlnaGJvdXIgc3RydWN0dXJlcy4KKyAqLwordm9pZCBfX2V4aXQgeDI1X2xpbmtfZnJlZSh2b2lkKQoreworCXN0cnVjdCB4MjVfbmVpZ2ggKm5iOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqdG1wOworCisJd3JpdGVfbG9ja19iaCgmeDI1X25laWdoX2xpc3RfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRtcCwgJngyNV9uZWlnaF9saXN0KSB7CisJCW5iID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHgyNV9uZWlnaCwgbm9kZSk7CisJCV9feDI1X3JlbW92ZV9uZWlnaChuYik7CisJfQorCXdyaXRlX3VubG9ja19iaCgmeDI1X25laWdoX2xpc3RfbG9jayk7Cit9CmRpZmYgLS1naXQgYS9uZXQveDI1L3gyNV9vdXQuYyBiL25ldC94MjUveDI1X291dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZTYyY2UKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQveDI1L3gyNV9vdXQuYwpAQCAtMCwwICsxLDIyNiBAQAorLyoKKyAqCVguMjUgUGFja2V0IExheWVyIHJlbGVhc2UgMDAyCisgKgorICoJVGhpcyBpcyBBTFBIQSB0ZXN0IHNvZnR3YXJlLiBUaGlzIGNvZGUgbWF5IGJyZWFrIHlvdXIgbWFjaGluZSwKKyAqCXJhbmRvbWx5IGZhaWwgdG8gd29yayB3aXRoIG5ldyByZWxlYXNlcywgbWlzYmVoYXZlIGFuZC9vciBnZW5lcmFsbHkKKyAqCXNjcmV3IHVwLiBJdCBtaWdodCBldmVuIHdvcmsuIAorICoKKyAqCVRoaXMgY29kZSBSRVFVSVJFUyAyLjEuMTUgb3IgaGlnaGVyCisgKgorICoJVGhpcyBtb2R1bGU6CisgKgkJVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCUhpc3RvcnkKKyAqCVguMjUgMDAxCUpvbmF0aGFuIE5heWxvcglTdGFydGVkIGNvZGluZy4KKyAqCVguMjUgMDAyCUpvbmF0aGFuIE5heWxvcglOZXcgdGltZXIgYXJjaGl0ZWN0dXJlLgorICoJMjAwMC0wOS0wNAlIZW5uZXIgRWlzZW4JUHJldmVudGVkIHgyNV9vdXRwdXQoKSBza2IgbGVha2FnZS4KKyAqCTIwMDAtMTAtMjcJSGVubmVyIEVpc2VuCU1TR19ET05UV0FJVCBmb3IgZnJhZ21lbnQgYWxsb2NhdGlvbi4KKyAqCTIwMDAtMTEtMTAJSGVubmVyIEVpc2VuCXgyNV9zZW5kX2lmcmFtZSgpOiByZS1xdWV1ZWQgZnJhbWVzCisgKgkJCQkJbmVlZGVkIGNsZWFuZWQgc2VxLW51bWJlciBmaWVsZHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3gyNS5oPgorCitzdGF0aWMgaW50IHgyNV9wYWNzaXplX3RvX2J5dGVzKHVuc2lnbmVkIGludCBwYWNzaXplKQoreworCWludCBieXRlcyA9IDE7CisKKwlpZiAoIXBhY3NpemUpCisJCXJldHVybiAxMjg7CisKKwl3aGlsZSAocGFjc2l6ZS0tID4gMCkKKwkJYnl0ZXMgKj0gMjsKKworCXJldHVybiBieXRlczsKK30KKworLyoKKyAqCVRoaXMgaXMgd2hlcmUgYWxsIFguMjUgaW5mb3JtYXRpb24gZnJhbWVzIHBhc3MuCisgKgorICogICAgICBSZXR1cm5zIHRoZSBhbW91bnQgb2YgdXNlciBkYXRhIGJ5dGVzIHNlbnQgb24gc3VjY2VzcworICogICAgICBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IHgyNV9vdXRwdXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmICpza2JuOworCXVuc2lnbmVkIGNoYXIgaGVhZGVyW1gyNV9FWFRfTUlOX0xFTl07CisJaW50IGVyciwgZnJvbnRsZW4sIGxlbjsKKwlpbnQgc2VudD0wLCBub2Jsb2NrID0gWDI1X1NLQl9DQihza2IpLT5mbGFncyAmIE1TR19ET05UV0FJVDsKKwlzdHJ1Y3QgeDI1X3NvY2sgKngyNSA9IHgyNV9zayhzayk7CisJaW50IGhlYWRlcl9sZW4gPSB4MjUtPm5laWdoYm91ci0+ZXh0ZW5kZWQgPyBYMjVfRVhUX01JTl9MRU4gOgorCQkJCQkJICAgIFgyNV9TVERfTUlOX0xFTjsKKwlpbnQgbWF4X2xlbiA9IHgyNV9wYWNzaXplX3RvX2J5dGVzKHgyNS0+ZmFjaWxpdGllcy5wYWNzaXplX291dCk7CisKKwlpZiAoc2tiLT5sZW4gLSBoZWFkZXJfbGVuID4gbWF4X2xlbikgeworCQkvKiBTYXZlIGEgY29weSBvZiB0aGUgSGVhZGVyICovCisJCW1lbWNweShoZWFkZXIsIHNrYi0+ZGF0YSwgaGVhZGVyX2xlbik7CisJCXNrYl9wdWxsKHNrYiwgaGVhZGVyX2xlbik7CisKKwkJZnJvbnRsZW4gPSBza2JfaGVhZHJvb20oc2tiKTsKKworCQl3aGlsZSAoc2tiLT5sZW4gPiAwKSB7CisJCQlpZiAoKHNrYm4gPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCBmcm9udGxlbiArIG1heF9sZW4sCisJCQkJCQkJbm9ibG9jaywgJmVycikpID09IE5VTEwpeworCQkJCWlmIChlcnIgPT0gLUVXT1VMREJMT0NLICYmIG5vYmxvY2speworCQkJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCQkJcmV0dXJuIHNlbnQ7CisJCQkJfQorCQkJCVNPQ0tfREVCVUcoc2ssICJ4MjVfb3V0cHV0OiBmcmFnbWVudCBhbGxvYyIKKwkJCQkJICAgICAgICIgZmFpbGVkLCBlcnI9JWQsICVkIGJ5dGVzICIKKwkJCQkJICAgICAgICJzZW50XG4iLCBlcnIsIHNlbnQpOworCQkJCXJldHVybiBlcnI7CisJCQl9CisJCQkJCisJCQlza2JfcmVzZXJ2ZShza2JuLCBmcm9udGxlbik7CisKKwkJCWxlbiA9IG1heF9sZW4gPiBza2ItPmxlbiA/IHNrYi0+bGVuIDogbWF4X2xlbjsKKworCQkJLyogQ29weSB0aGUgdXNlciBkYXRhICovCisJCQltZW1jcHkoc2tiX3B1dChza2JuLCBsZW4pLCBza2ItPmRhdGEsIGxlbik7CisJCQlza2JfcHVsbChza2IsIGxlbik7CisKKwkJCS8qIER1cGxpY2F0ZSB0aGUgSGVhZGVyICovCisJCQlza2JfcHVzaChza2JuLCBoZWFkZXJfbGVuKTsKKwkJCW1lbWNweShza2JuLT5kYXRhLCBoZWFkZXIsIGhlYWRlcl9sZW4pOworCisJCQlpZiAoc2tiLT5sZW4gPiAwKSB7CisJCQkJaWYgKHgyNS0+bmVpZ2hib3VyLT5leHRlbmRlZCkKKwkJCQkJc2tibi0+ZGF0YVszXSB8PSBYMjVfRVhUX01fQklUOworCQkJCWVsc2UKKwkJCQkJc2tibi0+ZGF0YVsyXSB8PSBYMjVfU1REX01fQklUOworCQkJfQorCisJCQlza2JfcXVldWVfdGFpbCgmc2stPnNrX3dyaXRlX3F1ZXVlLCBza2JuKTsKKwkJCXNlbnQgKz0gbGVuOworCQl9CisJCQorCQlrZnJlZV9za2Ioc2tiKTsKKwl9IGVsc2UgeworCQlza2JfcXVldWVfdGFpbCgmc2stPnNrX3dyaXRlX3F1ZXVlLCBza2IpOworCQlzZW50ID0gc2tiLT5sZW4gLSBoZWFkZXJfbGVuOworCX0KKwlyZXR1cm4gc2VudDsKK30KKworLyogCisgKglUaGlzIHByb2NlZHVyZSBpcyBwYXNzZWQgYSBidWZmZXIgZGVzY3JpcHRvciBmb3IgYW4gaWZyYW1lLiBJdCBidWlsZHMKKyAqCXRoZSByZXN0IG9mIHRoZSBjb250cm9sIHBhcnQgb2YgdGhlIGZyYW1lIGFuZCB0aGVuIHdyaXRlcyBpdCBvdXQuCisgKi8KK3N0YXRpYyB2b2lkIHgyNV9zZW5kX2lmcmFtZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHgyNV9zb2NrICp4MjUgPSB4MjVfc2soc2spOworCisJaWYgKCFza2IpCisJCXJldHVybjsKKworCWlmICh4MjUtPm5laWdoYm91ci0+ZXh0ZW5kZWQpIHsKKwkJc2tiLT5kYXRhWzJdICA9ICh4MjUtPnZzIDw8IDEpICYgMHhGRTsKKwkJc2tiLT5kYXRhWzNdICY9IFgyNV9FWFRfTV9CSVQ7CisJCXNrYi0+ZGF0YVszXSB8PSAoeDI1LT52ciA8PCAxKSAmIDB4RkU7CisJfSBlbHNlIHsKKwkJc2tiLT5kYXRhWzJdICY9IFgyNV9TVERfTV9CSVQ7CisJCXNrYi0+ZGF0YVsyXSB8PSAoeDI1LT52cyA8PCAxKSAmIDB4MEU7CisJCXNrYi0+ZGF0YVsyXSB8PSAoeDI1LT52ciA8PCA1KSAmIDB4RTA7CisJfQorCisJeDI1X3RyYW5zbWl0X2xpbmsoc2tiLCB4MjUtPm5laWdoYm91cik7CQorfQorCit2b2lkIHgyNV9raWNrKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqc2tibjsKKwl1bnNpZ25lZCBzaG9ydCBzdGFydCwgZW5kOworCWludCBtb2R1bHVzOworCXN0cnVjdCB4MjVfc29jayAqeDI1ID0geDI1X3NrKHNrKTsKKworCWlmICh4MjUtPnN0YXRlICE9IFgyNV9TVEFURV8zKQorCQlyZXR1cm47CisKKwkvKgorCSAqCVRyYW5zbWl0IGludGVycnVwdCBkYXRhLgorCSAqLworCWlmICgheDI1LT5pbnRmbGFnICYmIHNrYl9wZWVrKCZ4MjUtPmludGVycnVwdF9vdXRfcXVldWUpICE9IE5VTEwpIHsKKwkJeDI1LT5pbnRmbGFnID0gMTsKKwkJc2tiID0gc2tiX2RlcXVldWUoJngyNS0+aW50ZXJydXB0X291dF9xdWV1ZSk7CisJCXgyNV90cmFuc21pdF9saW5rKHNrYiwgeDI1LT5uZWlnaGJvdXIpOworCX0KKworCWlmICh4MjUtPmNvbmRpdGlvbiAmIFgyNV9DT05EX1BFRVJfUlhfQlVTWSkKKwkJcmV0dXJuOworCisJaWYgKCFza2JfcGVlaygmc2stPnNrX3dyaXRlX3F1ZXVlKSkKKwkJcmV0dXJuOworCisJbW9kdWx1cyA9IHgyNS0+bmVpZ2hib3VyLT5leHRlbmRlZCA/IFgyNV9FTU9EVUxVUyA6IFgyNV9TTU9EVUxVUzsKKworCXN0YXJ0ICAgPSBza2JfcGVlaygmeDI1LT5hY2tfcXVldWUpID8geDI1LT52cyA6IHgyNS0+dmE7CisJZW5kICAgICA9ICh4MjUtPnZhICsgeDI1LT5mYWNpbGl0aWVzLndpbnNpemVfb3V0KSAlIG1vZHVsdXM7CisKKwlpZiAoc3RhcnQgPT0gZW5kKQorCQlyZXR1cm47CisKKwl4MjUtPnZzID0gc3RhcnQ7CisKKwkvKgorCSAqIFRyYW5zbWl0IGRhdGEgdW50aWwgZWl0aGVyIHdlJ3JlIG91dCBvZiBkYXRhIHRvIHNlbmQgb3IKKwkgKiB0aGUgd2luZG93IGlzIGZ1bGwuCisJICovCisKKwlza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3dyaXRlX3F1ZXVlKTsKKworCWRvIHsKKwkJaWYgKChza2JuID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwkJCXNrYl9xdWV1ZV9oZWFkKCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYik7CisJCQlicmVhazsKKwkJfQorCisJCXNrYl9zZXRfb3duZXJfdyhza2JuLCBzayk7CisKKwkJLyoKKwkJICogVHJhbnNtaXQgdGhlIGZyYW1lIGNvcHkuCisJCSAqLworCQl4MjVfc2VuZF9pZnJhbWUoc2ssIHNrYm4pOworCisJCXgyNS0+dnMgPSAoeDI1LT52cyArIDEpICUgbW9kdWx1czsKKworCQkvKgorCQkgKiBSZXF1ZXVlIHRoZSBvcmlnaW5hbCBkYXRhIGZyYW1lLgorCQkgKi8KKwkJc2tiX3F1ZXVlX3RhaWwoJngyNS0+YWNrX3F1ZXVlLCBza2IpOworCisJfSB3aGlsZSAoeDI1LT52cyAhPSBlbmQgJiYKKwkJIChza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3dyaXRlX3F1ZXVlKSkgIT0gTlVMTCk7CisKKwl4MjUtPnZsICAgICAgICAgPSB4MjUtPnZyOworCXgyNS0+Y29uZGl0aW9uICY9IH5YMjVfQ09ORF9BQ0tfUEVORElORzsKKworCXgyNV9zdG9wX3RpbWVyKHNrKTsKK30KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYXJlIHRha2VuIGZyb20gcGFnZSAxNzAgb2YgdGhlIDd0aCBBUlJMIENvbXB1dGVyCisgKiBOZXR3b3JraW5nIENvbmZlcmVuY2UgcGFwZXIsIGFzIGlzIHRoZSB3aG9sZSBzdGF0ZSBtYWNoaW5lLgorICovCisKK3ZvaWQgeDI1X2VucXVpcnlfcmVzcG9uc2Uoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB4MjVfc29jayAqeDI1ID0geDI1X3NrKHNrKTsKKworCWlmICh4MjUtPmNvbmRpdGlvbiAmIFgyNV9DT05EX09XTl9SWF9CVVNZKQorCQl4MjVfd3JpdGVfaW50ZXJuYWwoc2ssIFgyNV9STlIpOworCWVsc2UKKwkJeDI1X3dyaXRlX2ludGVybmFsKHNrLCBYMjVfUlIpOworCisJeDI1LT52bCAgICAgICAgID0geDI1LT52cjsKKwl4MjUtPmNvbmRpdGlvbiAmPSB+WDI1X0NPTkRfQUNLX1BFTkRJTkc7CisKKwl4MjVfc3RvcF90aW1lcihzayk7Cit9CmRpZmYgLS1naXQgYS9uZXQveDI1L3gyNV9wcm9jLmMgYi9uZXQveDI1L3gyNV9wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZiODAxMQotLS0gL2Rldi9udWxsCisrKyBiL25ldC94MjUveDI1X3Byb2MuYwpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqCVguMjUgUGFja2V0IExheWVyIHJlbGVhc2UgMDAyCisgKgorICoJVGhpcyBpcyBBTFBIQSB0ZXN0IHNvZnR3YXJlLiBUaGlzIGNvZGUgbWF5IGJyZWFrIHlvdXIgbWFjaGluZSwKKyAqCXJhbmRvbWx5IGZhaWwgdG8gd29yayB3aXRoIG5ldyByZWxlYXNlcywgbWlzYmVoYXZlIGFuZC9vciBnZW5lcmFsbHkKKyAqCXNjcmV3IHVwLiBJdCBtaWdodCBldmVuIHdvcmsuIAorICoKKyAqCVRoaXMgY29kZSBSRVFVSVJFUyAyLjQgd2l0aCBzZXFfZmlsZSBzdXBwb3J0CisgKgorICoJVGhpcyBtb2R1bGU6CisgKgkJVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCUhpc3RvcnkKKyAqCTIwMDIvMTAvMDYJQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvICBzZXFfZmlsZSBzdXBwb3J0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC94MjUuaD4KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgeDI1X3JvdXRlICp4MjVfZ2V0X3JvdXRlX2lkeChsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnJvdXRlX2VudHJ5OworCXN0cnVjdCB4MjVfcm91dGUgKnJ0ID0gTlVMTDsKKworCWxpc3RfZm9yX2VhY2gocm91dGVfZW50cnksICZ4MjVfcm91dGVfbGlzdCkgeworCQlydCA9IGxpc3RfZW50cnkocm91dGVfZW50cnksIHN0cnVjdCB4MjVfcm91dGUsIG5vZGUpOworCQlpZiAoIXBvcy0tKQorCQkJZ290byBmb3VuZDsKKwl9CisJcnQgPSBOVUxMOworZm91bmQ6CisJcmV0dXJuIHJ0OworfQorCitzdGF0aWMgdm9pZCAqeDI1X3NlcV9yb3V0ZV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJbG9mZl90IGwgPSAqcG9zOworCisJcmVhZF9sb2NrX2JoKCZ4MjVfcm91dGVfbGlzdF9sb2NrKTsKKwlyZXR1cm4gbCA/IHgyNV9nZXRfcm91dGVfaWR4KC0tbCkgOiBTRVFfU1RBUlRfVE9LRU47Cit9CisKK3N0YXRpYyB2b2lkICp4MjVfc2VxX3JvdXRlX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCB4MjVfcm91dGUgKnJ0OworCisJKysqcG9zOworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlydCA9IE5VTEw7CisJCWlmICghbGlzdF9lbXB0eSgmeDI1X3JvdXRlX2xpc3QpKQorCQkJcnQgPSBsaXN0X2VudHJ5KHgyNV9yb3V0ZV9saXN0Lm5leHQsCisJCQkJCXN0cnVjdCB4MjVfcm91dGUsIG5vZGUpOworCQlnb3RvIG91dDsKKwl9CisJcnQgPSB2OworCWlmIChydC0+bm9kZS5uZXh0ICE9ICZ4MjVfcm91dGVfbGlzdCkKKwkJcnQgPSBsaXN0X2VudHJ5KHJ0LT5ub2RlLm5leHQsIHN0cnVjdCB4MjVfcm91dGUsIG5vZGUpOworCWVsc2UgCisJCXJ0ID0gTlVMTDsKK291dDoKKwlyZXR1cm4gcnQ7Cit9CisKK3N0YXRpYyB2b2lkIHgyNV9zZXFfcm91dGVfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlyZWFkX3VubG9ja19iaCgmeDI1X3JvdXRlX2xpc3RfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgeDI1X3NlcV9yb3V0ZV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCB4MjVfcm91dGUgKnJ0OworCisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CisJCXNlcV9wdXRzKHNlcSwgIkFkZHJlc3MgICAgICAgICAgRGlnaXRzICBEZXZpY2VcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlydCA9IHY7CisJc2VxX3ByaW50ZihzZXEsICIlLTE1cyAgJS02ZCAgJS01c1xuIiwKKwkJICAgcnQtPmFkZHJlc3MueDI1X2FkZHIsIHJ0LT5zaWdkaWdpdHMsCisJCSAgIHJ0LT5kZXYgPyBydC0+ZGV2LT5uYW1lIDogIj8/PyIpOworb3V0OgorCXJldHVybiAwOworfSAKKworc3RhdGljIF9faW5saW5lX18gc3RydWN0IHNvY2sgKngyNV9nZXRfc29ja2V0X2lkeChsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBzb2NrICpzOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJc2tfZm9yX2VhY2gocywgbm9kZSwgJngyNV9saXN0KQorCQlpZiAoIXBvcy0tKQorCQkJZ290byBmb3VuZDsKKwlzID0gTlVMTDsKK2ZvdW5kOgorCXJldHVybiBzOworfQorCitzdGF0aWMgdm9pZCAqeDI1X3NlcV9zb2NrZXRfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCWxvZmZfdCBsID0gKnBvczsKKworCXJlYWRfbG9ja19iaCgmeDI1X2xpc3RfbG9jayk7CisJcmV0dXJuIGwgPyB4MjVfZ2V0X3NvY2tldF9pZHgoLS1sKSA6IFNFUV9TVEFSVF9UT0tFTjsKK30KKworc3RhdGljIHZvaWQgKngyNV9zZXFfc29ja2V0X25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBzb2NrICpzOworCisJKysqcG9zOworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlzID0gc2tfaGVhZCgmeDI1X2xpc3QpOworCQlnb3RvIG91dDsKKwl9CisJcyA9IHNrX25leHQodik7CitvdXQ6CisJcmV0dXJuIHM7Cit9CisKK3N0YXRpYyB2b2lkIHgyNV9zZXFfc29ja2V0X3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJcmVhZF91bmxvY2tfYmgoJngyNV9saXN0X2xvY2spOworfQorCitzdGF0aWMgaW50IHgyNV9zZXFfc29ja2V0X3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IHNvY2sgKnM7CisJc3RydWN0IHgyNV9zb2NrICp4MjU7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwljb25zdCBjaGFyICpkZXZuYW1lOworCisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CisJCXNlcV9wcmludGYoc2VxLCAiZGVzdF9hZGRyICBzcmNfYWRkciAgIGRldiAgIGxjaSBzdCB2cyB2ciAiCisJCQkJInZhICAgdCAgdDIgdDIxIHQyMiB0MjMgU25kLVEgUmN2LVEgaW5vZGVcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlzID0gdjsKKwl4MjUgPSB4MjVfc2socyk7CisKKwlpZiAoIXgyNS0+bmVpZ2hib3VyIHx8IChkZXYgPSB4MjUtPm5laWdoYm91ci0+ZGV2KSA9PSBOVUxMKQorCQlkZXZuYW1lID0gIj8/PyI7CisJZWxzZQorCQlkZXZuYW1lID0geDI1LT5uZWlnaGJvdXItPmRldi0+bmFtZTsKKworCXNlcV9wcmludGYoc2VxLCAiJS0xMHMgJS0xMHMgJS01cyAlMy4zWCAgJWQgICVkICAlZCAgJWQgJTNsdSAlM2x1ICIKKwkJCSIlM2x1ICUzbHUgJTNsdSAlNWQgJTVkICVsZFxuIiwKKwkJICAgIXgyNS0+ZGVzdF9hZGRyLngyNV9hZGRyWzBdID8gIioiIDogeDI1LT5kZXN0X2FkZHIueDI1X2FkZHIsCisJCSAgICF4MjUtPnNvdXJjZV9hZGRyLngyNV9hZGRyWzBdID8gIioiIDogeDI1LT5zb3VyY2VfYWRkci54MjVfYWRkciwKKwkJICAgZGV2bmFtZSwgeDI1LT5sY2kgJiAweDBGRkYsIHgyNS0+c3RhdGUsIHgyNS0+dnMsIHgyNS0+dnIsCisJCSAgIHgyNS0+dmEsIHgyNV9kaXNwbGF5X3RpbWVyKHMpIC8gSFosIHgyNS0+dDIgIC8gSFosCisJCSAgIHgyNS0+dDIxIC8gSFosIHgyNS0+dDIyIC8gSFosIHgyNS0+dDIzIC8gSFosCisJCSAgIGF0b21pY19yZWFkKCZzLT5za193bWVtX2FsbG9jKSwKKwkJICAgYXRvbWljX3JlYWQoJnMtPnNrX3JtZW1fYWxsb2MpLAorCQkgICBzLT5za19zb2NrZXQgPyBTT0NLX0lOT0RFKHMtPnNrX3NvY2tldCktPmlfaW5vIDogMEwpOworb3V0OgorCXJldHVybiAwOworfSAKKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyB4MjVfc2VxX3JvdXRlX29wcyA9IHsKKwkuc3RhcnQgID0geDI1X3NlcV9yb3V0ZV9zdGFydCwKKwkubmV4dCAgID0geDI1X3NlcV9yb3V0ZV9uZXh0LAorCS5zdG9wICAgPSB4MjVfc2VxX3JvdXRlX3N0b3AsCisJLnNob3cgICA9IHgyNV9zZXFfcm91dGVfc2hvdywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgeDI1X3NlcV9zb2NrZXRfb3BzID0geworCS5zdGFydCAgPSB4MjVfc2VxX3NvY2tldF9zdGFydCwKKwkubmV4dCAgID0geDI1X3NlcV9zb2NrZXRfbmV4dCwKKwkuc3RvcCAgID0geDI1X3NlcV9zb2NrZXRfc3RvcCwKKwkuc2hvdyAgID0geDI1X3NlcV9zb2NrZXRfc2hvdywKK307CisKK3N0YXRpYyBpbnQgeDI1X3NlcV9zb2NrZXRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJngyNV9zZXFfc29ja2V0X29wcyk7Cit9CisKK3N0YXRpYyBpbnQgeDI1X3NlcV9yb3V0ZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmeDI1X3NlcV9yb3V0ZV9vcHMpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB4MjVfc2VxX3NvY2tldF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSB4MjVfc2VxX3NvY2tldF9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB4MjVfc2VxX3JvdXRlX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHgyNV9zZXFfcm91dGVfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqeDI1X3Byb2NfZGlyOworCitpbnQgX19pbml0IHgyNV9wcm9jX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnA7CisJaW50IHJjID0gLUVOT01FTTsKKworCXgyNV9wcm9jX2RpciA9IHByb2NfbWtkaXIoIngyNSIsIHByb2NfbmV0KTsKKwlpZiAoIXgyNV9wcm9jX2RpcikKKwkJZ290byBvdXQ7CisKKwlwID0gY3JlYXRlX3Byb2NfZW50cnkoInJvdXRlIiwgU19JUlVHTywgeDI1X3Byb2NfZGlyKTsKKwlpZiAoIXApCisJCWdvdG8gb3V0X3JvdXRlOworCXAtPnByb2NfZm9wcyA9ICZ4MjVfc2VxX3JvdXRlX2ZvcHM7CisKKwlwID0gY3JlYXRlX3Byb2NfZW50cnkoInNvY2tldCIsIFNfSVJVR08sIHgyNV9wcm9jX2Rpcik7CisJaWYgKCFwKQorCQlnb3RvIG91dF9zb2NrZXQ7CisJcC0+cHJvY19mb3BzID0gJngyNV9zZXFfc29ja2V0X2ZvcHM7CisJcmMgPSAwOworb3V0OgorCXJldHVybiByYzsKK291dF9zb2NrZXQ6CisJcmVtb3ZlX3Byb2NfZW50cnkoInJvdXRlIiwgeDI1X3Byb2NfZGlyKTsKK291dF9yb3V0ZToKKwlyZW1vdmVfcHJvY19lbnRyeSgieDI1IiwgcHJvY19uZXQpOworCWdvdG8gb3V0OworfQorCit2b2lkIF9fZXhpdCB4MjVfcHJvY19leGl0KHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoInJvdXRlIiwgeDI1X3Byb2NfZGlyKTsKKwlyZW1vdmVfcHJvY19lbnRyeSgic29ja2V0IiwgeDI1X3Byb2NfZGlyKTsKKwlyZW1vdmVfcHJvY19lbnRyeSgieDI1IiwgcHJvY19uZXQpOworfQorCisjZWxzZSAvKiBDT05GSUdfUFJPQ19GUyAqLworCitpbnQgX19pbml0IHgyNV9wcm9jX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCBfX2V4aXQgeDI1X3Byb2NfZXhpdCh2b2lkKQoreworfQorI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCmRpZmYgLS1naXQgYS9uZXQveDI1L3gyNV9yb3V0ZS5jIGIvbmV0L3gyNS94MjVfcm91dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzVkMzc1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3gyNS94MjVfcm91dGUuYwpAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqCVguMjUgUGFja2V0IExheWVyIHJlbGVhc2UgMDAyCisgKgorICoJVGhpcyBpcyBBTFBIQSB0ZXN0IHNvZnR3YXJlLiBUaGlzIGNvZGUgbWF5IGJyZWFrIHlvdXIgbWFjaGluZSwKKyAqCXJhbmRvbWx5IGZhaWwgdG8gd29yayB3aXRoIG5ldyByZWxlYXNlcywgbWlzYmVoYXZlIGFuZC9vciBnZW5lcmFsbHkKKyAqCXNjcmV3IHVwLiBJdCBtaWdodCBldmVuIHdvcmsuIAorICoKKyAqCVRoaXMgY29kZSBSRVFVSVJFUyAyLjEuMTUgb3IgaGlnaGVyCisgKgorICoJVGhpcyBtb2R1bGU6CisgKgkJVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCUhpc3RvcnkKKyAqCVguMjUgMDAxCUpvbmF0aGFuIE5heWxvcglTdGFydGVkIGNvZGluZy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPG5ldC94MjUuaD4KKworc3RydWN0IGxpc3RfaGVhZCB4MjVfcm91dGVfbGlzdCA9IExJU1RfSEVBRF9JTklUKHgyNV9yb3V0ZV9saXN0KTsKK0RFRklORV9SV0xPQ0soeDI1X3JvdXRlX2xpc3RfbG9jayk7CisKKy8qCisgKglBZGQgYSBuZXcgcm91dGUuCisgKi8KK3N0YXRpYyBpbnQgeDI1X2FkZF9yb3V0ZShzdHJ1Y3QgeDI1X2FkZHJlc3MgKmFkZHJlc3MsIHVuc2lnbmVkIGludCBzaWdkaWdpdHMsCisJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeDI1X3JvdXRlICpydDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJd3JpdGVfbG9ja19iaCgmeDI1X3JvdXRlX2xpc3RfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmeDI1X3JvdXRlX2xpc3QpIHsKKwkJcnQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgeDI1X3JvdXRlLCBub2RlKTsKKworCQlpZiAoIW1lbWNtcCgmcnQtPmFkZHJlc3MsIGFkZHJlc3MsIHNpZ2RpZ2l0cykgJiYKKwkJICAgIHJ0LT5zaWdkaWdpdHMgPT0gc2lnZGlnaXRzKQorCQkJZ290byBvdXQ7CisJfQorCisJcnQgPSBrbWFsbG9jKHNpemVvZigqcnQpLCBHRlBfQVRPTUlDKTsKKwlyYyA9IC1FTk9NRU07CisJaWYgKCFydCkKKwkJZ290byBvdXQ7CisKKwlzdHJjcHkocnQtPmFkZHJlc3MueDI1X2FkZHIsICIwMDAwMDAwMDAwMDAwMDAiKTsKKwltZW1jcHkocnQtPmFkZHJlc3MueDI1X2FkZHIsIGFkZHJlc3MtPngyNV9hZGRyLCBzaWdkaWdpdHMpOworCisJcnQtPnNpZ2RpZ2l0cyA9IHNpZ2RpZ2l0czsKKwlydC0+ZGV2ICAgICAgID0gZGV2OworCWF0b21pY19zZXQoJnJ0LT5yZWZjbnQsIDEpOworCisJbGlzdF9hZGQoJnJ0LT5ub2RlLCAmeDI1X3JvdXRlX2xpc3QpOworCXJjID0gMDsKK291dDoKKwl3cml0ZV91bmxvY2tfYmgoJngyNV9yb3V0ZV9saXN0X2xvY2spOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBfX3gyNV9yZW1vdmVfcm91dGUgLSByZW1vdmUgcm91dGUgZnJvbSB4MjVfcm91dGVfbGlzdAorICogQHJ0IC0gcm91dGUgdG8gcmVtb3ZlCisgKgorICogUmVtb3ZlIHJvdXRlIGZyb20geDI1X3JvdXRlX2xpc3QuIElmIGl0IHdhcyB0aGVyZS4KKyAqIENhbGxlciBtdXN0IGhvbGQgeDI1X3JvdXRlX2xpc3RfbG9jay4KKyAqLworc3RhdGljIHZvaWQgX194MjVfcmVtb3ZlX3JvdXRlKHN0cnVjdCB4MjVfcm91dGUgKnJ0KQoreworCWlmIChydC0+bm9kZS5uZXh0KSB7CisJCWxpc3RfZGVsKCZydC0+bm9kZSk7CisJCXgyNV9yb3V0ZV9wdXQocnQpOworCX0KK30KKworc3RhdGljIGludCB4MjVfZGVsX3JvdXRlKHN0cnVjdCB4MjVfYWRkcmVzcyAqYWRkcmVzcywgdW5zaWduZWQgaW50IHNpZ2RpZ2l0cywKKwkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4MjVfcm91dGUgKnJ0OworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCWludCByYyA9IC1FSU5WQUw7CisKKwl3cml0ZV9sb2NrX2JoKCZ4MjVfcm91dGVfbGlzdF9sb2NrKTsKKworCWxpc3RfZm9yX2VhY2goZW50cnksICZ4MjVfcm91dGVfbGlzdCkgeworCQlydCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCB4MjVfcm91dGUsIG5vZGUpOworCisJCWlmICghbWVtY21wKCZydC0+YWRkcmVzcywgYWRkcmVzcywgc2lnZGlnaXRzKSAmJgorCQkgICAgcnQtPnNpZ2RpZ2l0cyA9PSBzaWdkaWdpdHMgJiYgcnQtPmRldiA9PSBkZXYpIHsKKwkJCV9feDI1X3JlbW92ZV9yb3V0ZShydCk7CisJCQlyYyA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCXdyaXRlX3VubG9ja19iaCgmeDI1X3JvdXRlX2xpc3RfbG9jayk7CisJcmV0dXJuIHJjOworfQorCisvKgorICoJQSBkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCwgcmVtb3ZlIGl0cyByb3V0ZXMuCisgKi8KK3ZvaWQgeDI1X3JvdXRlX2RldmljZV9kb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHgyNV9yb3V0ZSAqcnQ7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICp0bXA7CisKKwl3cml0ZV9sb2NrX2JoKCZ4MjVfcm91dGVfbGlzdF9sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgdG1wLCAmeDI1X3JvdXRlX2xpc3QpIHsKKwkJcnQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgeDI1X3JvdXRlLCBub2RlKTsKKworCQlpZiAocnQtPmRldiA9PSBkZXYpCisJCQlfX3gyNV9yZW1vdmVfcm91dGUocnQpOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJngyNV9yb3V0ZV9saXN0X2xvY2spOworfQorCisvKgorICoJQ2hlY2sgdGhhdCB0aGUgZGV2aWNlIGdpdmVuIGlzIGEgdmFsaWQgWC4yNSBpbnRlcmZhY2UgdGhhdCBpcyAidXAiLgorICovCitzdHJ1Y3QgbmV0X2RldmljZSAqeDI1X2Rldl9nZXQoY2hhciAqZGV2bmFtZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2dldF9ieV9uYW1lKGRldm5hbWUpOworCisJaWYgKGRldiAmJgorCSAgICAoIShkZXYtPmZsYWdzICYgSUZGX1VQKSB8fCAoZGV2LT50eXBlICE9IEFSUEhSRF9YMjUKKyNpZiBkZWZpbmVkKENPTkZJR19MTEMpIHx8IGRlZmluZWQoQ09ORklHX0xMQ19NT0RVTEUpCisJCQkJCSYmIGRldi0+dHlwZSAhPSBBUlBIUkRfRVRIRVIKKyNlbmRpZgorCQkJCQkpKSkKKwkJZGV2X3B1dChkZXYpOworCisJcmV0dXJuIGRldjsKK30KKworLyoqCisgKiAJeDI1X2dldF9yb3V0ZSAtCUZpbmQgYSByb3V0ZSBnaXZlbiBhbiBYLjI1IGFkZHJlc3MuCisgKiAJQGFkZHIgLSBhZGRyZXNzIHRvIGZpbmQgYSByb3V0ZSBmb3IKKyAqCisgKiAJRmluZCBhIHJvdXRlIGdpdmVuIGFuIFguMjUgYWRkcmVzcy4KKyAqLworc3RydWN0IHgyNV9yb3V0ZSAqeDI1X2dldF9yb3V0ZShzdHJ1Y3QgeDI1X2FkZHJlc3MgKmFkZHIpCit7CisJc3RydWN0IHgyNV9yb3V0ZSAqcnQsICp1c2UgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCisJcmVhZF9sb2NrX2JoKCZ4MjVfcm91dGVfbGlzdF9sb2NrKTsKKworCWxpc3RfZm9yX2VhY2goZW50cnksICZ4MjVfcm91dGVfbGlzdCkgeworCQlydCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCB4MjVfcm91dGUsIG5vZGUpOworCisJCWlmICghbWVtY21wKCZydC0+YWRkcmVzcywgYWRkciwgcnQtPnNpZ2RpZ2l0cykpIHsKKwkJCWlmICghdXNlKQorCQkJCXVzZSA9IHJ0OworCQkJZWxzZSBpZiAocnQtPnNpZ2RpZ2l0cyA+IHVzZS0+c2lnZGlnaXRzKQorCQkJCXVzZSA9IHJ0OworCQl9CisJfQorCisJaWYgKHVzZSkKKwkJeDI1X3JvdXRlX2hvbGQodXNlKTsKKworCXJlYWRfdW5sb2NrX2JoKCZ4MjVfcm91dGVfbGlzdF9sb2NrKTsKKwlyZXR1cm4gdXNlOworfQorCisvKgorICoJSGFuZGxlIHRoZSBpb2N0bHMgdGhhdCBjb250cm9sIHRoZSByb3V0aW5nIGZ1bmN0aW9ucy4KKyAqLworaW50IHgyNV9yb3V0ZV9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCB4MjVfcm91dGVfc3RydWN0IHJ0OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IHJjID0gLUVJTlZBTDsKKworCWlmIChjbWQgIT0gU0lPQ0FERFJUICYmIGNtZCAhPSBTSU9DREVMUlQpCisJCWdvdG8gb3V0OworCisJcmMgPSAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcigmcnQsIGFyZywgc2l6ZW9mKHJ0KSkpCisJCWdvdG8gb3V0OworCisJcmMgPSAtRUlOVkFMOworCWlmIChydC5zaWdkaWdpdHMgPCAwIHx8IHJ0LnNpZ2RpZ2l0cyA+IDE1KQorCQlnb3RvIG91dDsKKworCWRldiA9IHgyNV9kZXZfZ2V0KHJ0LmRldmljZSk7CisJaWYgKCFkZXYpCisJCWdvdG8gb3V0OworCisJaWYgKGNtZCA9PSBTSU9DQUREUlQpCisJCXJjID0geDI1X2FkZF9yb3V0ZSgmcnQuYWRkcmVzcywgcnQuc2lnZGlnaXRzLCBkZXYpOworCWVsc2UKKwkJcmMgPSB4MjVfZGVsX3JvdXRlKCZydC5hZGRyZXNzLCBydC5zaWdkaWdpdHMsIGRldik7CisJZGV2X3B1dChkZXYpOworb3V0OgorCXJldHVybiByYzsKK30KKworLyoKKyAqCVJlbGVhc2UgYWxsIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggWC4yNSByb3V0aW5nIHN0cnVjdHVyZXMuCisgKi8KK3ZvaWQgX19leGl0IHgyNV9yb3V0ZV9mcmVlKHZvaWQpCit7CisJc3RydWN0IHgyNV9yb3V0ZSAqcnQ7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICp0bXA7CisKKwl3cml0ZV9sb2NrX2JoKCZ4MjVfcm91dGVfbGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRtcCwgJngyNV9yb3V0ZV9saXN0KSB7CisJCXJ0ID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHgyNV9yb3V0ZSwgbm9kZSk7CisJCV9feDI1X3JlbW92ZV9yb3V0ZShydCk7CisJfQorCXdyaXRlX3VubG9ja19iaCgmeDI1X3JvdXRlX2xpc3RfbG9jayk7Cit9CmRpZmYgLS1naXQgYS9uZXQveDI1L3gyNV9zdWJyLmMgYi9uZXQveDI1L3gyNV9zdWJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgzZmVhMwotLS0gL2Rldi9udWxsCisrKyBiL25ldC94MjUveDI1X3N1YnIuYwpAQCAtMCwwICsxLDM3NCBAQAorLyoKKyAqCVguMjUgUGFja2V0IExheWVyIHJlbGVhc2UgMDAyCisgKgorICoJVGhpcyBpcyBBTFBIQSB0ZXN0IHNvZnR3YXJlLiBUaGlzIGNvZGUgbWF5IGJyZWFrIHlvdXIgbWFjaGluZSwKKyAqCXJhbmRvbWx5IGZhaWwgdG8gd29yayB3aXRoIG5ldyByZWxlYXNlcywgbWlzYmVoYXZlIGFuZC9vciBnZW5lcmFsbHkKKyAqCXNjcmV3IHVwLiBJdCBtaWdodCBldmVuIHdvcmsuCisgKgorICoJVGhpcyBjb2RlIFJFUVVJUkVTIDIuMS4xNSBvciBoaWdoZXIKKyAqCisgKglUaGlzIG1vZHVsZToKKyAqCQlUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJSGlzdG9yeQorICoJWC4yNSAwMDEJSm9uYXRoYW4gTmF5bG9yCSAgU3RhcnRlZCBjb2RpbmcuCisgKglYLjI1IDAwMglKb25hdGhhbiBOYXlsb3IJICBDZW50cmFsaXNlZCBkaXNjb25uZWN0aW9uIHByb2Nlc3NpbmcuCisgKgltYXIvMjAvMDAJRGFuaWVsYSBTcXVhc3NvbmkgRGlzYWJsaW5nL2VuYWJsaW5nIG9mIGZhY2lsaXRpZXMKKyAqCQkJCQkgIG5lZ290aWF0aW9uLgorICoJanVuLzI0LzAxCUFybmFsZG8gQy4gTWVsbwkgIHVzZSBza2JfcXVldWVfcHVyZ2UsIGNsZWFudXBzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPG5ldC94MjUuaD4KKworLyoKKyAqCVRoaXMgcm91dGluZSBwdXJnZXMgYWxsIG9mIHRoZSBxdWV1ZXMgb2YgZnJhbWVzLgorICovCit2b2lkIHgyNV9jbGVhcl9xdWV1ZXMoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB4MjVfc29jayAqeDI1ID0geDI1X3NrKHNrKTsKKworCXNrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX3dyaXRlX3F1ZXVlKTsKKwlza2JfcXVldWVfcHVyZ2UoJngyNS0+YWNrX3F1ZXVlKTsKKwlza2JfcXVldWVfcHVyZ2UoJngyNS0+aW50ZXJydXB0X2luX3F1ZXVlKTsKKwlza2JfcXVldWVfcHVyZ2UoJngyNS0+aW50ZXJydXB0X291dF9xdWV1ZSk7CisJc2tiX3F1ZXVlX3B1cmdlKCZ4MjUtPmZyYWdtZW50X3F1ZXVlKTsKK30KKworCisvKgorICogVGhpcyByb3V0aW5lIHB1cmdlcyB0aGUgaW5wdXQgcXVldWUgb2YgdGhvc2UgZnJhbWVzIHRoYXQgaGF2ZSBiZWVuCisgKiBhY2tub3dsZWRnZWQuIFRoaXMgcmVwbGFjZXMgdGhlIGJveGVzIGxhYmVsbGVkICJWKGEpIDwtIE4ocikiIG9uIHRoZQorICogU0RMIGRpYWdyYW0uCisqLwordm9pZCB4MjVfZnJhbWVzX2Fja2VkKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgc2hvcnQgbnIpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgeDI1X3NvY2sgKngyNSA9IHgyNV9zayhzayk7CisJaW50IG1vZHVsdXMgPSB4MjUtPm5laWdoYm91ci0+ZXh0ZW5kZWQgPyBYMjVfRU1PRFVMVVMgOiBYMjVfU01PRFVMVVM7CisKKwkvKgorCSAqIFJlbW92ZSBhbGwgdGhlIGFjay1lZCBmcmFtZXMgZnJvbSB0aGUgYWNrIHF1ZXVlLgorCSAqLworCWlmICh4MjUtPnZhICE9IG5yKQorCQl3aGlsZSAoc2tiX3BlZWsoJngyNS0+YWNrX3F1ZXVlKSAmJiB4MjUtPnZhICE9IG5yKSB7CisJCQlza2IgPSBza2JfZGVxdWV1ZSgmeDI1LT5hY2tfcXVldWUpOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQl4MjUtPnZhID0gKHgyNS0+dmEgKyAxKSAlIG1vZHVsdXM7CisJCX0KK30KKwordm9pZCB4MjVfcmVxdWV1ZV9mcmFtZXMoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBza19idWZmICpza2IsICpza2JfcHJldiA9IE5VTEw7CisKKwkvKgorCSAqIFJlcXVldWUgYWxsIHRoZSB1bi1hY2stZWQgZnJhbWVzIG9uIHRoZSBvdXRwdXQgcXVldWUgdG8gYmUgcGlja2VkCisJICogdXAgYnkgeDI1X2tpY2suIFRoaXMgYXJyYW5nZW1lbnQgaGFuZGxlcyB0aGUgcG9zc2liaWxpdHkgb2YgYW4gZW1wdHkKKwkgKiBvdXRwdXQgcXVldWUuCisJICovCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmeDI1X3NrKHNrKS0+YWNrX3F1ZXVlKSkgIT0gTlVMTCkgeworCQlpZiAoIXNrYl9wcmV2KQorCQkJc2tiX3F1ZXVlX2hlYWQoJnNrLT5za193cml0ZV9xdWV1ZSwgc2tiKTsKKwkJZWxzZQorCQkJc2tiX2FwcGVuZChza2JfcHJldiwgc2tiKTsKKwkJc2tiX3ByZXYgPSBza2I7CisJfQorfQorCisvKgorICoJVmFsaWRhdGUgdGhhdCB0aGUgdmFsdWUgb2YgbnIgaXMgYmV0d2VlbiB2YSBhbmQgdnMuIFJldHVybiB0cnVlIG9yCisgKglmYWxzZSBmb3IgdGVzdGluZy4KKyAqLworaW50IHgyNV92YWxpZGF0ZV9ucihzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIHNob3J0IG5yKQoreworCXN0cnVjdCB4MjVfc29jayAqeDI1ID0geDI1X3NrKHNrKTsKKwl1bnNpZ25lZCBzaG9ydCB2YyA9IHgyNS0+dmE7CisJaW50IG1vZHVsdXMgPSB4MjUtPm5laWdoYm91ci0+ZXh0ZW5kZWQgPyBYMjVfRU1PRFVMVVMgOiBYMjVfU01PRFVMVVM7CisKKwl3aGlsZSAodmMgIT0geDI1LT52cykgeworCQlpZiAobnIgPT0gdmMpCisJCQlyZXR1cm4gMTsKKwkJdmMgPSAodmMgKyAxKSAlIG1vZHVsdXM7CisJfQorCisJcmV0dXJuIG5yID09IHgyNS0+dnMgPyAxIDogMDsKK30KKworLyoKKyAqICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gdGhlIHBhY2tldCBsYXllciBpbnRlcm5hbGx5IGdlbmVyYXRlcyBhCisgKiAgY29udHJvbCBmcmFtZS4KKyAqLwordm9pZCB4MjVfd3JpdGVfaW50ZXJuYWwoc3RydWN0IHNvY2sgKnNrLCBpbnQgZnJhbWV0eXBlKQoreworCXN0cnVjdCB4MjVfc29jayAqeDI1ID0geDI1X3NrKHNrKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGNoYXIgICpkcHRyOworCXVuc2lnbmVkIGNoYXIgIGZhY2lsaXRpZXNbWDI1X01BWF9GQUNfTEVOXTsKKwl1bnNpZ25lZCBjaGFyICBhZGRyZXNzZXNbMSArIFgyNV9BRERSX0xFTl07CisJdW5zaWduZWQgY2hhciAgbGNpMSwgbGNpMjsKKwkvKgorCSAqCURlZmF1bHQgc2FmZSBmcmFtZSBzaXplLgorCSAqLworCWludCBsZW4gPSBYMjVfTUFYX0wyX0xFTiArIFgyNV9FWFRfTUlOX0xFTjsKKworCS8qCisJICoJQWRqdXN0IGZyYW1lIHNpemUuCisJICovCisJc3dpdGNoIChmcmFtZXR5cGUpIHsKKwkJY2FzZSBYMjVfQ0FMTF9SRVFVRVNUOgorCQkJbGVuICs9IDEgKyBYMjVfQUREUl9MRU4gKyBYMjVfTUFYX0ZBQ19MRU4gKworCQkJICAgICAgIFgyNV9NQVhfQ1VEX0xFTjsKKwkJCWJyZWFrOworCQljYXNlIFgyNV9DQUxMX0FDQ0VQVEVEOgorCQkJbGVuICs9IDEgKyBYMjVfTUFYX0ZBQ19MRU4gKyBYMjVfTUFYX0NVRF9MRU47CisJCQlicmVhazsKKwkJY2FzZSBYMjVfQ0xFQVJfUkVRVUVTVDoKKwkJY2FzZSBYMjVfUkVTRVRfUkVRVUVTVDoKKwkJCWxlbiArPSAyOworCQkJYnJlYWs7CisJCWNhc2UgWDI1X1JSOgorCQljYXNlIFgyNV9STlI6CisJCWNhc2UgWDI1X1JFSjoKKwkJY2FzZSBYMjVfQ0xFQVJfQ09ORklSTUFUSU9OOgorCQljYXNlIFgyNV9JTlRFUlJVUFRfQ09ORklSTUFUSU9OOgorCQljYXNlIFgyNV9SRVNFVF9DT05GSVJNQVRJT046CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiWC4yNTogaW52YWxpZCBmcmFtZSB0eXBlICUwMlhcbiIsCisJCQkgICAgICAgZnJhbWV0eXBlKTsKKwkJCXJldHVybjsKKwl9CisKKwlpZiAoKHNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKgorCSAqCVNwYWNlIGZvciBFdGhlcm5ldCBhbmQgODAyLjIgTExDIGhlYWRlcnMuCisJICovCisJc2tiX3Jlc2VydmUoc2tiLCBYMjVfTUFYX0wyX0xFTik7CisKKwkvKgorCSAqCU1ha2Ugc3BhY2UgZm9yIHRoZSBHRkkgYW5kIExDSSwgYW5kIGZpbGwgdGhlbSBpbi4KKwkgKi8KKwlkcHRyID0gc2tiX3B1dChza2IsIDIpOworCisJbGNpMSA9ICh4MjUtPmxjaSA+PiA4KSAmIDB4MEY7CisJbGNpMiA9ICh4MjUtPmxjaSA+PiAwKSAmIDB4RkY7CisKKwlpZiAoeDI1LT5uZWlnaGJvdXItPmV4dGVuZGVkKSB7CisJCSpkcHRyKysgPSBsY2kxIHwgWDI1X0dGSV9FWFRTRVE7CisJCSpkcHRyKysgPSBsY2kyOworCX0gZWxzZSB7CisJCSpkcHRyKysgPSBsY2kxIHwgWDI1X0dGSV9TVERTRVE7CisJCSpkcHRyKysgPSBsY2kyOworCX0KKworCS8qCisJICoJTm93IGZpbGwgaW4gdGhlIGZyYW1lIHR5cGUgc3BlY2lmaWMgaW5mb3JtYXRpb24uCisJICovCisJc3dpdGNoIChmcmFtZXR5cGUpIHsKKworCQljYXNlIFgyNV9DQUxMX1JFUVVFU1Q6CisJCQlkcHRyICAgID0gc2tiX3B1dChza2IsIDEpOworCQkJKmRwdHIrKyA9IFgyNV9DQUxMX1JFUVVFU1Q7CisJCQlsZW4gICAgID0geDI1X2FkZHJfYXRvbihhZGRyZXNzZXMsICZ4MjUtPmRlc3RfYWRkciwKKwkJCQkJCSZ4MjUtPnNvdXJjZV9hZGRyKTsKKwkJCWRwdHIgICAgPSBza2JfcHV0KHNrYiwgbGVuKTsKKwkJCW1lbWNweShkcHRyLCBhZGRyZXNzZXMsIGxlbik7CisJCQlsZW4gICAgID0geDI1X2NyZWF0ZV9mYWNpbGl0aWVzKGZhY2lsaXRpZXMsCisJCQkJCQkJJngyNS0+ZmFjaWxpdGllcywKKwkJCQkJICAgICB4MjUtPm5laWdoYm91ci0+Z2xvYmFsX2ZhY2lsX21hc2spOworCQkJZHB0ciAgICA9IHNrYl9wdXQoc2tiLCBsZW4pOworCQkJbWVtY3B5KGRwdHIsIGZhY2lsaXRpZXMsIGxlbik7CisJCQlkcHRyID0gc2tiX3B1dChza2IsIHgyNS0+Y2FsbHVzZXJkYXRhLmN1ZGxlbmd0aCk7CisJCQltZW1jcHkoZHB0ciwgeDI1LT5jYWxsdXNlcmRhdGEuY3VkZGF0YSwKKwkJCSAgICAgICB4MjUtPmNhbGx1c2VyZGF0YS5jdWRsZW5ndGgpOworCQkJeDI1LT5jYWxsdXNlcmRhdGEuY3VkbGVuZ3RoID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgWDI1X0NBTExfQUNDRVBURUQ6CisJCQlkcHRyICAgID0gc2tiX3B1dChza2IsIDIpOworCQkJKmRwdHIrKyA9IFgyNV9DQUxMX0FDQ0VQVEVEOworCQkJKmRwdHIrKyA9IDB4MDA7CQkvKiBBZGRyZXNzIGxlbmd0aHMgKi8KKwkJCWxlbiAgICAgPSB4MjVfY3JlYXRlX2ZhY2lsaXRpZXMoZmFjaWxpdGllcywKKwkJCQkJCQkmeDI1LT5mYWNpbGl0aWVzLAorCQkJCQkJCXgyNS0+dmNfZmFjaWxfbWFzayk7CisJCQlkcHRyICAgID0gc2tiX3B1dChza2IsIGxlbik7CisJCQltZW1jcHkoZHB0ciwgZmFjaWxpdGllcywgbGVuKTsKKwkJCWRwdHIgPSBza2JfcHV0KHNrYiwgeDI1LT5jYWxsdXNlcmRhdGEuY3VkbGVuZ3RoKTsKKwkJCW1lbWNweShkcHRyLCB4MjUtPmNhbGx1c2VyZGF0YS5jdWRkYXRhLAorCQkJICAgICAgIHgyNS0+Y2FsbHVzZXJkYXRhLmN1ZGxlbmd0aCk7CisJCQl4MjUtPmNhbGx1c2VyZGF0YS5jdWRsZW5ndGggPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBYMjVfQ0xFQVJfUkVRVUVTVDoKKwkJY2FzZSBYMjVfUkVTRVRfUkVRVUVTVDoKKwkJCWRwdHIgICAgPSBza2JfcHV0KHNrYiwgMyk7CisJCQkqZHB0cisrID0gZnJhbWV0eXBlOworCQkJKmRwdHIrKyA9IDB4MDA7CQkvKiBYWFggKi8KKwkJCSpkcHRyKysgPSAweDAwOwkJLyogWFhYICovCisJCQlicmVhazsKKworCQljYXNlIFgyNV9SUjoKKwkJY2FzZSBYMjVfUk5SOgorCQljYXNlIFgyNV9SRUo6CisJCQlpZiAoeDI1LT5uZWlnaGJvdXItPmV4dGVuZGVkKSB7CisJCQkJZHB0ciAgICAgPSBza2JfcHV0KHNrYiwgMik7CisJCQkJKmRwdHIrKyAgPSBmcmFtZXR5cGU7CisJCQkJKmRwdHIrKyAgPSAoeDI1LT52ciA8PCAxKSAmIDB4RkU7CisJCQl9IGVsc2UgeworCQkJCWRwdHIgICAgID0gc2tiX3B1dChza2IsIDEpOworCQkJCSpkcHRyICAgID0gZnJhbWV0eXBlOworCQkJCSpkcHRyKysgfD0gKHgyNS0+dnIgPDwgNSkgJiAweEUwOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBYMjVfQ0xFQVJfQ09ORklSTUFUSU9OOgorCQljYXNlIFgyNV9JTlRFUlJVUFRfQ09ORklSTUFUSU9OOgorCQljYXNlIFgyNV9SRVNFVF9DT05GSVJNQVRJT046CisJCQlkcHRyICA9IHNrYl9wdXQoc2tiLCAxKTsKKwkJCSpkcHRyID0gZnJhbWV0eXBlOworCQkJYnJlYWs7CisJfQorCisJeDI1X3RyYW5zbWl0X2xpbmsoc2tiLCB4MjUtPm5laWdoYm91cik7Cit9CisKKy8qCisgKglVbnBpY2sgdGhlIGNvbnRlbnRzIG9mIHRoZSBwYXNzZWQgWC4yNSBQYWNrZXQgTGF5ZXIgZnJhbWUuCisgKi8KK2ludCB4MjVfZGVjb2RlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50ICpucywgaW50ICpuciwgaW50ICpxLAorCSAgICAgICBpbnQgKmQsIGludCAqbSkKK3sKKwlzdHJ1Y3QgeDI1X3NvY2sgKngyNSA9IHgyNV9zayhzayk7CisJdW5zaWduZWQgY2hhciAqZnJhbWUgPSBza2ItPmRhdGE7CisKKwkqbnMgPSAqbnIgPSAqcSA9ICpkID0gKm0gPSAwOworCisJc3dpdGNoIChmcmFtZVsyXSkgeworCQljYXNlIFgyNV9DQUxMX1JFUVVFU1Q6CisJCWNhc2UgWDI1X0NBTExfQUNDRVBURUQ6CisJCWNhc2UgWDI1X0NMRUFSX1JFUVVFU1Q6CisJCWNhc2UgWDI1X0NMRUFSX0NPTkZJUk1BVElPTjoKKwkJY2FzZSBYMjVfSU5URVJSVVBUOgorCQljYXNlIFgyNV9JTlRFUlJVUFRfQ09ORklSTUFUSU9OOgorCQljYXNlIFgyNV9SRVNFVF9SRVFVRVNUOgorCQljYXNlIFgyNV9SRVNFVF9DT05GSVJNQVRJT046CisJCWNhc2UgWDI1X1JFU1RBUlRfUkVRVUVTVDoKKwkJY2FzZSBYMjVfUkVTVEFSVF9DT05GSVJNQVRJT046CisJCWNhc2UgWDI1X1JFR0lTVFJBVElPTl9SRVFVRVNUOgorCQljYXNlIFgyNV9SRUdJU1RSQVRJT05fQ09ORklSTUFUSU9OOgorCQljYXNlIFgyNV9ESUFHTk9TVElDOgorCQkJcmV0dXJuIGZyYW1lWzJdOworCX0KKworCWlmICh4MjUtPm5laWdoYm91ci0+ZXh0ZW5kZWQpIHsKKwkJaWYgKGZyYW1lWzJdID09IFgyNV9SUiAgfHwKKwkJICAgIGZyYW1lWzJdID09IFgyNV9STlIgfHwKKwkJICAgIGZyYW1lWzJdID09IFgyNV9SRUopIHsKKwkJCSpuciA9IChmcmFtZVszXSA+PiAxKSAmIDB4N0Y7CisJCQlyZXR1cm4gZnJhbWVbMl07CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKGZyYW1lWzJdICYgMHgxRikgPT0gWDI1X1JSICB8fAorCQkgICAgKGZyYW1lWzJdICYgMHgxRikgPT0gWDI1X1JOUiB8fAorCQkgICAgKGZyYW1lWzJdICYgMHgxRikgPT0gWDI1X1JFSikgeworCQkJKm5yID0gKGZyYW1lWzJdID4+IDUpICYgMHgwNzsKKwkJCXJldHVybiBmcmFtZVsyXSAmIDB4MUY7CisJCX0KKwl9CisKKwlpZiAoeDI1LT5uZWlnaGJvdXItPmV4dGVuZGVkKSB7CisJCWlmICgoZnJhbWVbMl0gJiAweDAxKSA9PSBYMjVfREFUQSkgeworCQkJKnEgID0gKGZyYW1lWzBdICYgWDI1X1FfQklUKSA9PSBYMjVfUV9CSVQ7CisJCQkqZCAgPSAoZnJhbWVbMF0gJiBYMjVfRF9CSVQpID09IFgyNV9EX0JJVDsKKwkJCSptICA9IChmcmFtZVszXSAmIFgyNV9FWFRfTV9CSVQpID09IFgyNV9FWFRfTV9CSVQ7CisJCQkqbnIgPSAoZnJhbWVbM10gPj4gMSkgJiAweDdGOworCQkJKm5zID0gKGZyYW1lWzJdID4+IDEpICYgMHg3RjsKKwkJCXJldHVybiBYMjVfREFUQTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgoZnJhbWVbMl0gJiAweDAxKSA9PSBYMjVfREFUQSkgeworCQkJKnEgID0gKGZyYW1lWzBdICYgWDI1X1FfQklUKSA9PSBYMjVfUV9CSVQ7CisJCQkqZCAgPSAoZnJhbWVbMF0gJiBYMjVfRF9CSVQpID09IFgyNV9EX0JJVDsKKwkJCSptICA9IChmcmFtZVsyXSAmIFgyNV9TVERfTV9CSVQpID09IFgyNV9TVERfTV9CSVQ7CisJCQkqbnIgPSAoZnJhbWVbMl0gPj4gNSkgJiAweDA3OworCQkJKm5zID0gKGZyYW1lWzJdID4+IDEpICYgMHgwNzsKKwkJCXJldHVybiBYMjVfREFUQTsKKwkJfQorCX0KKworCXByaW50ayhLRVJOX0RFQlVHICJYLjI1OiBpbnZhbGlkIFBMUCBmcmFtZSAlMDJYICUwMlggJTAyWFxuIiwKKwkgICAgICAgZnJhbWVbMF0sIGZyYW1lWzFdLCBmcmFtZVsyXSk7CisKKwlyZXR1cm4gWDI1X0lMTEVHQUw7Cit9CisKK3ZvaWQgeDI1X2Rpc2Nvbm5lY3Qoc3RydWN0IHNvY2sgKnNrLCBpbnQgcmVhc29uLCB1bnNpZ25lZCBjaGFyIGNhdXNlLAorCQkgICAgdW5zaWduZWQgY2hhciBkaWFnbm9zdGljKQoreworCXN0cnVjdCB4MjVfc29jayAqeDI1ID0geDI1X3NrKHNrKTsKKworCXgyNV9jbGVhcl9xdWV1ZXMoc2spOworCXgyNV9zdG9wX3RpbWVyKHNrKTsKKworCXgyNS0+bGNpICAgPSAwOworCXgyNS0+c3RhdGUgPSBYMjVfU1RBVEVfMDsKKworCXgyNS0+Y2F1c2VkaWFnLmNhdXNlICAgICAgPSBjYXVzZTsKKwl4MjUtPmNhdXNlZGlhZy5kaWFnbm9zdGljID0gZGlhZ25vc3RpYzsKKworCXNrLT5za19zdGF0ZSAgICAgPSBUQ1BfQ0xPU0U7CisJc2stPnNrX2VyciAgICAgICA9IHJlYXNvbjsKKwlzay0+c2tfc2h1dGRvd24gfD0gU0VORF9TSFVURE9XTjsKKworCWlmICghc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKSB7CisJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX0RFQUQpOworCX0KK30KKworLyoKKyAqIENsZWFyIGFuIG93bi1yeC1idXN5IGNvbmRpdGlvbiBhbmQgdGVsbCB0aGUgcGVlciBhYm91dCB0aGlzLCBwcm92aWRlZAorICogdGhhdCB0aGVyZSBpcyBhIHNpZ25pZmljYW50IGFtb3VudCBvZiBmcmVlIHJlY2VpdmUgYnVmZmVyIHNwYWNlIGF2YWlsYWJsZS4KKyAqLwordm9pZCB4MjVfY2hlY2tfcmJ1ZihzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHgyNV9zb2NrICp4MjUgPSB4MjVfc2soc2spOworCisJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPCAoc2stPnNrX3JjdmJ1ZiAvIDIpICYmCisJICAgICh4MjUtPmNvbmRpdGlvbiAmIFgyNV9DT05EX09XTl9SWF9CVVNZKSkgeworCQl4MjUtPmNvbmRpdGlvbiAmPSB+WDI1X0NPTkRfT1dOX1JYX0JVU1k7CisJCXgyNS0+Y29uZGl0aW9uICY9IH5YMjVfQ09ORF9BQ0tfUEVORElORzsKKwkJeDI1LT52bCAgICAgICAgID0geDI1LT52cjsKKwkJeDI1X3dyaXRlX2ludGVybmFsKHNrLCBYMjVfUlIpOworCQl4MjVfc3RvcF90aW1lcihzayk7CisJfQorfQorCisvKgorICogQ29tcGFyZSAyIGNhbGx1c2VyZGF0YSBzdHJ1Y3R1cmVzLCB1c2VkIHRvIGZpbmQgY29ycmVjdCBsaXN0ZW5pbmcgc29ja2V0cworICogd2hlbiBjYWxsIHVzZXIgZGF0YSBpcyB1c2VkLgorICovCitpbnQgeDI1X2NoZWNrX2NhbGx1c2VyZGF0YShzdHJ1Y3QgeDI1X2NhbGx1c2VyZGF0YSAqb3Vycywgc3RydWN0IHgyNV9jYWxsdXNlcmRhdGEgKnRoZWlycykKK3sKKwlpbnQgaTsKKwlpZiAob3Vycy0+Y3VkbGVuZ3RoICE9IHRoZWlycy0+Y3VkbGVuZ3RoKQorCQlyZXR1cm4gMDsKKworCWZvciAoaT0wO2k8b3Vycy0+Y3VkbGVuZ3RoO2krKykgeworCQlpZiAob3Vycy0+Y3VkZGF0YVtpXSAhPSB0aGVpcnMtPmN1ZGRhdGFbaV0pIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9uZXQveDI1L3gyNV90aW1lci5jIGIvbmV0L3gyNS94MjVfdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmEyMWEzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3gyNS94MjVfdGltZXIuYwpAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqCVguMjUgUGFja2V0IExheWVyIHJlbGVhc2UgMDAyCisgKgorICoJVGhpcyBpcyBBTFBIQSB0ZXN0IHNvZnR3YXJlLiBUaGlzIGNvZGUgbWF5IGJyZWFrIHlvdXIgbWFjaGluZSwKKyAqCXJhbmRvbWx5IGZhaWwgdG8gd29yayB3aXRoIG5ldyByZWxlYXNlcywgbWlzYmVoYXZlIGFuZC9vciBnZW5lcmFsbHkKKyAqCXNjcmV3IHVwLiBJdCBtaWdodCBldmVuIHdvcmsuIAorICoKKyAqCVRoaXMgY29kZSBSRVFVSVJFUyAyLjEuMTUgb3IgaGlnaGVyCisgKgorICoJVGhpcyBtb2R1bGU6CisgKgkJVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCUhpc3RvcnkKKyAqCVguMjUgMDAxCUpvbmF0aGFuIE5heWxvcglTdGFydGVkIGNvZGluZy4KKyAqCVguMjUgMDAyCUpvbmF0aGFuIE5heWxvcglOZXcgdGltZXIgYXJjaGl0ZWN0dXJlLgorICoJCQkJCUNlbnRyYWxpc2VkIGRpc2Nvbm5lY3Rpb24gcHJvY2Vzc2luZy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQveDI1Lmg+CisKK3N0YXRpYyB2b2lkIHgyNV9oZWFydGJlYXRfZXhwaXJ5KHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgeDI1X3RpbWVyX2V4cGlyeSh1bnNpZ25lZCBsb25nKTsKKwordm9pZCB4MjVfaW5pdF90aW1lcnMoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB4MjVfc29jayAqeDI1ID0geDI1X3NrKHNrKTsKKworCWluaXRfdGltZXIoJngyNS0+dGltZXIpOworCXgyNS0+dGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZylzazsKKwl4MjUtPnRpbWVyLmZ1bmN0aW9uID0gJngyNV90aW1lcl9leHBpcnk7CisKKwkvKiBpbml0aWFsaXplZCBieSBzb2NrX2luaXRfZGF0YSAqLworCXNrLT5za190aW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKXNrOworCXNrLT5za190aW1lci5mdW5jdGlvbiA9ICZ4MjVfaGVhcnRiZWF0X2V4cGlyeTsKK30KKwordm9pZCB4MjVfc3RhcnRfaGVhcnRiZWF0KHN0cnVjdCBzb2NrICpzaykKK3sKKwltb2RfdGltZXIoJnNrLT5za190aW1lciwgamlmZmllcyArIDUgKiBIWik7Cit9CisKK3ZvaWQgeDI1X3N0b3BfaGVhcnRiZWF0KHN0cnVjdCBzb2NrICpzaykKK3sKKwlkZWxfdGltZXIoJnNrLT5za190aW1lcik7Cit9CisKK3ZvaWQgeDI1X3N0YXJ0X3QydGltZXIoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB4MjVfc29jayAqeDI1ID0geDI1X3NrKHNrKTsKKworCW1vZF90aW1lcigmeDI1LT50aW1lciwgamlmZmllcyArIHgyNS0+dDIpOworfQorCit2b2lkIHgyNV9zdGFydF90MjF0aW1lcihzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHgyNV9zb2NrICp4MjUgPSB4MjVfc2soc2spOworCisJbW9kX3RpbWVyKCZ4MjUtPnRpbWVyLCBqaWZmaWVzICsgeDI1LT50MjEpOworfQorCit2b2lkIHgyNV9zdGFydF90MjJ0aW1lcihzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHgyNV9zb2NrICp4MjUgPSB4MjVfc2soc2spOworCisJbW9kX3RpbWVyKCZ4MjUtPnRpbWVyLCBqaWZmaWVzICsgeDI1LT50MjIpOworfQorCit2b2lkIHgyNV9zdGFydF90MjN0aW1lcihzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHgyNV9zb2NrICp4MjUgPSB4MjVfc2soc2spOworCisJbW9kX3RpbWVyKCZ4MjUtPnRpbWVyLCBqaWZmaWVzICsgeDI1LT50MjMpOworfQorCit2b2lkIHgyNV9zdG9wX3RpbWVyKHN0cnVjdCBzb2NrICpzaykKK3sKKwlkZWxfdGltZXIoJngyNV9zayhzayktPnRpbWVyKTsKK30KKwordW5zaWduZWQgbG9uZyB4MjVfZGlzcGxheV90aW1lcihzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHgyNV9zb2NrICp4MjUgPSB4MjVfc2soc2spOworCisJaWYgKCF0aW1lcl9wZW5kaW5nKCZ4MjUtPnRpbWVyKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4geDI1LT50aW1lci5leHBpcmVzIC0gamlmZmllczsKK30KKworc3RhdGljIHZvaWQgeDI1X2hlYXJ0YmVhdF9leHBpcnkodW5zaWduZWQgbG9uZyBwYXJhbSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSAoc3RydWN0IHNvY2sgKilwYXJhbTsKKworICAgICAgICBiaF9sb2NrX3NvY2soc2spOworICAgICAgICBpZiAoc29ja19vd25lZF9ieV91c2VyKHNrKSkgLyogY2FuIGN1cnJlbnRseSBvbmx5IG9jY3VyIGluIHN0YXRlIDMgKi8gCisJCWdvdG8gcmVzdGFydF9oZWFydGJlYXQ7CisKKwlzd2l0Y2ggKHgyNV9zayhzayktPnN0YXRlKSB7CisKKwkJY2FzZSBYMjVfU1RBVEVfMDoKKwkJCS8qCisJCQkgKiBNYWdpYyBoZXJlOiBJZiB3ZSBsaXN0ZW4oKSBhbmQgYSBuZXcgbGluayBkaWVzCisJCQkgKiBiZWZvcmUgaXQgaXMgYWNjZXB0ZWQoKSBpdCBpc24ndCAnZGVhZCcgc28gZG9lc24ndAorCQkJICogZ2V0IHJlbW92ZWQuCisJCQkgKi8KKwkJCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfREVTVFJPWSkgfHwKKwkJCSAgICAoc2stPnNrX3N0YXRlID09IFRDUF9MSVNURU4gJiYKKwkJCSAgICAgc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKSkgeworCQkJCXgyNV9kZXN0cm95X3NvY2tldChzayk7CisJCQkJZ290byB1bmxvY2s7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFgyNV9TVEFURV8zOgorCQkJLyoKKwkJCSAqIENoZWNrIGZvciB0aGUgc3RhdGUgb2YgdGhlIHJlY2VpdmUgYnVmZmVyLgorCQkJICovCisJCQl4MjVfY2hlY2tfcmJ1Zihzayk7CisJCQlicmVhazsKKwl9CityZXN0YXJ0X2hlYXJ0YmVhdDoKKwl4MjVfc3RhcnRfaGVhcnRiZWF0KHNrKTsKK3VubG9jazoKKwliaF91bmxvY2tfc29jayhzayk7Cit9CisKKy8qCisgKglUaW1lciBoYXMgZXhwaXJlZCwgaXQgbWF5IGhhdmUgYmVlbiBUMiwgVDIxLCBUMjIsIG9yIFQyMy4gV2UgY2FuIHRlbGwKKyAqCWJ5IHRoZSBzdGF0ZSBtYWNoaW5lIHN0YXRlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgeDI1X2RvX3RpbWVyX2V4cGlyeShzdHJ1Y3Qgc29jayAqIHNrKQoreworCXN0cnVjdCB4MjVfc29jayAqeDI1ID0geDI1X3NrKHNrKTsKKworCXN3aXRjaCAoeDI1LT5zdGF0ZSkgeworCisJCWNhc2UgWDI1X1NUQVRFXzM6CS8qIFQyICovCisJCQlpZiAoeDI1LT5jb25kaXRpb24gJiBYMjVfQ09ORF9BQ0tfUEVORElORykgeworCQkJCXgyNS0+Y29uZGl0aW9uICY9IH5YMjVfQ09ORF9BQ0tfUEVORElORzsKKwkJCQl4MjVfZW5xdWlyeV9yZXNwb25zZShzayk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFgyNV9TVEFURV8xOgkvKiBUMjEgKi8KKwkJY2FzZSBYMjVfU1RBVEVfNDoJLyogVDIyICovCisJCQl4MjVfd3JpdGVfaW50ZXJuYWwoc2ssIFgyNV9DTEVBUl9SRVFVRVNUKTsKKwkJCXgyNS0+c3RhdGUgPSBYMjVfU1RBVEVfMjsKKwkJCXgyNV9zdGFydF90MjN0aW1lcihzayk7CisJCQlicmVhazsKKworCQljYXNlIFgyNV9TVEFURV8yOgkvKiBUMjMgKi8KKwkJCXgyNV9kaXNjb25uZWN0KHNrLCBFVElNRURPVVQsIDAsIDApOworCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCB4MjVfdGltZXJfZXhwaXJ5KHVuc2lnbmVkIGxvbmcgcGFyYW0pCit7CisJc3RydWN0IHNvY2sgKnNrID0gKHN0cnVjdCBzb2NrICopcGFyYW07CisKKwliaF9sb2NrX3NvY2soc2spOworCWlmIChzb2NrX293bmVkX2J5X3VzZXIoc2spKSB7IC8qIGNhbiBjdXJyZW50bHkgb25seSBvY2N1ciBpbiBzdGF0ZSAzICovCisJCWlmICh4MjVfc2soc2spLT5zdGF0ZSA9PSBYMjVfU1RBVEVfMykKKwkJCXgyNV9zdGFydF90MnRpbWVyKHNrKTsKKwl9IGVsc2UKKwkJeDI1X2RvX3RpbWVyX2V4cGlyeShzayk7CisJYmhfdW5sb2NrX3NvY2soc2spOworfQpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0vS2NvbmZpZyBiL25ldC94ZnJtL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThjYTZhOQotLS0gL2Rldi9udWxsCisrKyBiL25ldC94ZnJtL0tjb25maWcKQEAgLTAsMCArMSwxMiBAQAorIworIyBYRlJNIGNvbmZpZ3VyYXRpb24KKyMKK2NvbmZpZyBYRlJNX1VTRVIKKwl0cmlzdGF0ZSAiSVBzZWMgdXNlciBjb25maWd1cmF0aW9uIGludGVyZmFjZSIKKwlkZXBlbmRzIG9uIElORVQgJiYgWEZSTQorCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIElQc2VjIHVzZXIgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UgdXNlZAorCSAgYnkgbmF0aXZlIExpbnV4IHRvb2xzLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCmRpZmYgLS1naXQgYS9uZXQveGZybS9NYWtlZmlsZSBiL25ldC94ZnJtL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5M2FhYzEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQveGZybS9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBYRlJNIHN1YnN5c3RlbS4KKyMKKworb2JqLSQoQ09ORklHX1hGUk0pIDo9IHhmcm1fcG9saWN5Lm8geGZybV9zdGF0ZS5vIHhmcm1faW5wdXQubyB4ZnJtX2FsZ28ubworb2JqLSQoQ09ORklHX1hGUk1fVVNFUikgKz0geGZybV91c2VyLm8KKwpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9hbGdvLmMgYi9uZXQveGZybS94ZnJtX2FsZ28uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODBhYWUyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3hmcm0veGZybV9hbGdvLmMKQEAgLTAsMCArMSw3MjkgQEAKKy8qIAorICogeGZybSBhbGdvcml0aG0gaW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSAKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wZmtleXYyLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bmV0L3hmcm0uaD4KKyNpZiBkZWZpbmVkKENPTkZJR19JTkVUX0FIKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUX0FIX01PRFVMRSkgfHwgZGVmaW5lZChDT05GSUdfSU5FVDZfQUgpIHx8IGRlZmluZWQoQ09ORklHX0lORVQ2X0FIX01PRFVMRSkKKyNpbmNsdWRlIDxuZXQvYWguaD4KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0lORVRfRVNQKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUX0VTUF9NT0RVTEUpIHx8IGRlZmluZWQoQ09ORklHX0lORVQ2X0VTUCkgfHwgZGVmaW5lZChDT05GSUdfSU5FVDZfRVNQX01PRFVMRSkKKyNpbmNsdWRlIDxuZXQvZXNwLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKworLyoKKyAqIEFsZ29yaXRobXMgc3VwcG9ydGVkIGJ5IElQc2VjLiAgVGhlc2UgZW50cmllcyBjb250YWluIHByb3BlcnRpZXMgd2hpY2gKKyAqIGFyZSB1c2VkIGluIGtleSBuZWdvdGlhdGlvbiBhbmQgeGZybSBwcm9jZXNzaW5nLCBhbmQgYXJlIHVzZWQgdG8gdmVyaWZ5CisgKiB0aGF0IGluc3RhbnRpYXRlZCBjcnlwdG8gdHJhbnNmb3JtcyBoYXZlIGNvcnJlY3QgcGFyYW1ldGVycyBmb3IgSVBzZWMKKyAqIHB1cnBvc2VzLgorICovCitzdGF0aWMgc3RydWN0IHhmcm1fYWxnb19kZXNjIGFhbGdfbGlzdFtdID0geworeworCS5uYW1lID0gImRpZ2VzdF9udWxsIiwKKwkKKwkudWluZm8gPSB7CisJCS5hdXRoID0geworCQkJLmljdl90cnVuY2JpdHMgPSAwLAorCQkJLmljdl9mdWxsYml0cyA9IDAsCisJCX0KKwl9LAorCQorCS5kZXNjID0geworCQkuc2FkYl9hbGdfaWQgPSBTQURCX1hfQUFMR19OVUxMLAorCQkuc2FkYl9hbGdfaXZsZW4gPSAwLAorCQkuc2FkYl9hbGdfbWluYml0cyA9IDAsCisJCS5zYWRiX2FsZ19tYXhiaXRzID0gMAorCX0KK30sCit7CisJLm5hbWUgPSAibWQ1IiwKKworCS51aW5mbyA9IHsKKwkJLmF1dGggPSB7CisJCQkuaWN2X3RydW5jYml0cyA9IDk2LAorCQkJLmljdl9mdWxsYml0cyA9IDEyOCwKKwkJfQorCX0sCisJCisJLmRlc2MgPSB7CisJCS5zYWRiX2FsZ19pZCA9IFNBREJfQUFMR19NRDVITUFDLAorCQkuc2FkYl9hbGdfaXZsZW4gPSAwLAorCQkuc2FkYl9hbGdfbWluYml0cyA9IDEyOCwKKwkJLnNhZGJfYWxnX21heGJpdHMgPSAxMjgKKwl9Cit9LAoreworCS5uYW1lID0gInNoYTEiLAorCisJLnVpbmZvID0geworCQkuYXV0aCA9IHsKKwkJCS5pY3ZfdHJ1bmNiaXRzID0gOTYsCisJCQkuaWN2X2Z1bGxiaXRzID0gMTYwLAorCQl9CisJfSwKKworCS5kZXNjID0geworCQkuc2FkYl9hbGdfaWQgPSBTQURCX0FBTEdfU0hBMUhNQUMsCisJCS5zYWRiX2FsZ19pdmxlbiA9IDAsCisJCS5zYWRiX2FsZ19taW5iaXRzID0gMTYwLAorCQkuc2FkYl9hbGdfbWF4Yml0cyA9IDE2MAorCX0KK30sCit7CisJLm5hbWUgPSAic2hhMjU2IiwKKworCS51aW5mbyA9IHsKKwkJLmF1dGggPSB7CisJCQkuaWN2X3RydW5jYml0cyA9IDk2LAorCQkJLmljdl9mdWxsYml0cyA9IDI1NiwKKwkJfQorCX0sCisKKwkuZGVzYyA9IHsKKwkJLnNhZGJfYWxnX2lkID0gU0FEQl9YX0FBTEdfU0hBMl8yNTZITUFDLAorCQkuc2FkYl9hbGdfaXZsZW4gPSAwLAorCQkuc2FkYl9hbGdfbWluYml0cyA9IDI1NiwKKwkJLnNhZGJfYWxnX21heGJpdHMgPSAyNTYKKwl9Cit9LAoreworCS5uYW1lID0gInJpcGVtZDE2MCIsCisKKwkudWluZm8gPSB7CisJCS5hdXRoID0geworCQkJLmljdl90cnVuY2JpdHMgPSA5NiwKKwkJCS5pY3ZfZnVsbGJpdHMgPSAxNjAsCisJCX0KKwl9LAorCisJLmRlc2MgPSB7CisJCS5zYWRiX2FsZ19pZCA9IFNBREJfWF9BQUxHX1JJUEVNRDE2MEhNQUMsCisJCS5zYWRiX2FsZ19pdmxlbiA9IDAsCisJCS5zYWRiX2FsZ19taW5iaXRzID0gMTYwLAorCQkuc2FkYl9hbGdfbWF4Yml0cyA9IDE2MAorCX0KK30sCit9OworCitzdGF0aWMgc3RydWN0IHhmcm1fYWxnb19kZXNjIGVhbGdfbGlzdFtdID0geworeworCS5uYW1lID0gImNpcGhlcl9udWxsIiwKKwkKKwkudWluZm8gPSB7CisJCS5lbmNyID0geworCQkJLmJsb2NrYml0cyA9IDgsCisJCQkuZGVma2V5Yml0cyA9IDAsCisJCX0KKwl9LAorCQorCS5kZXNjID0geworCQkuc2FkYl9hbGdfaWQgPQlTQURCX0VBTEdfTlVMTCwKKwkJLnNhZGJfYWxnX2l2bGVuID0gMCwKKwkJLnNhZGJfYWxnX21pbmJpdHMgPSAwLAorCQkuc2FkYl9hbGdfbWF4Yml0cyA9IDAKKwl9Cit9LAoreworCS5uYW1lID0gImRlcyIsCisKKwkudWluZm8gPSB7CisJCS5lbmNyID0geworCQkJLmJsb2NrYml0cyA9IDY0LAorCQkJLmRlZmtleWJpdHMgPSA2NCwKKwkJfQorCX0sCisKKwkuZGVzYyA9IHsKKwkJLnNhZGJfYWxnX2lkID0gU0FEQl9FQUxHX0RFU0NCQywKKwkJLnNhZGJfYWxnX2l2bGVuID0gOCwKKwkJLnNhZGJfYWxnX21pbmJpdHMgPSA2NCwKKwkJLnNhZGJfYWxnX21heGJpdHMgPSA2NAorCX0KK30sCit7CisJLm5hbWUgPSAiZGVzM19lZGUiLAorCisJLnVpbmZvID0geworCQkuZW5jciA9IHsKKwkJCS5ibG9ja2JpdHMgPSA2NCwKKwkJCS5kZWZrZXliaXRzID0gMTkyLAorCQl9CisJfSwKKworCS5kZXNjID0geworCQkuc2FkYl9hbGdfaWQgPSBTQURCX0VBTEdfM0RFU0NCQywKKwkJLnNhZGJfYWxnX2l2bGVuID0gOCwKKwkJLnNhZGJfYWxnX21pbmJpdHMgPSAxOTIsCisJCS5zYWRiX2FsZ19tYXhiaXRzID0gMTkyCisJfQorfSwKK3sKKwkubmFtZSA9ICJjYXN0MTI4IiwKKworCS51aW5mbyA9IHsKKwkJLmVuY3IgPSB7CisJCQkuYmxvY2tiaXRzID0gNjQsCisJCQkuZGVma2V5Yml0cyA9IDEyOCwKKwkJfQorCX0sCisKKwkuZGVzYyA9IHsKKwkJLnNhZGJfYWxnX2lkID0gU0FEQl9YX0VBTEdfQ0FTVENCQywKKwkJLnNhZGJfYWxnX2l2bGVuID0gOCwKKwkJLnNhZGJfYWxnX21pbmJpdHMgPSA0MCwKKwkJLnNhZGJfYWxnX21heGJpdHMgPSAxMjgKKwl9Cit9LAoreworCS5uYW1lID0gImJsb3dmaXNoIiwKKworCS51aW5mbyA9IHsKKwkJLmVuY3IgPSB7CisJCQkuYmxvY2tiaXRzID0gNjQsCisJCQkuZGVma2V5Yml0cyA9IDEyOCwKKwkJfQorCX0sCisKKwkuZGVzYyA9IHsKKwkJLnNhZGJfYWxnX2lkID0gU0FEQl9YX0VBTEdfQkxPV0ZJU0hDQkMsCisJCS5zYWRiX2FsZ19pdmxlbiA9IDgsCisJCS5zYWRiX2FsZ19taW5iaXRzID0gNDAsCisJCS5zYWRiX2FsZ19tYXhiaXRzID0gNDQ4CisJfQorfSwKK3sKKwkubmFtZSA9ICJhZXMiLAorCisJLnVpbmZvID0geworCQkuZW5jciA9IHsKKwkJCS5ibG9ja2JpdHMgPSAxMjgsCisJCQkuZGVma2V5Yml0cyA9IDEyOCwKKwkJfQorCX0sCisKKwkuZGVzYyA9IHsKKwkJLnNhZGJfYWxnX2lkID0gU0FEQl9YX0VBTEdfQUVTQ0JDLAorCQkuc2FkYl9hbGdfaXZsZW4gPSA4LAorCQkuc2FkYl9hbGdfbWluYml0cyA9IDEyOCwKKwkJLnNhZGJfYWxnX21heGJpdHMgPSAyNTYKKwl9Cit9LAoreworICAgICAgICAubmFtZSA9ICJzZXJwZW50IiwKKworICAgICAgICAudWluZm8gPSB7CisgICAgICAgICAgICAgICAgLmVuY3IgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAuYmxvY2tiaXRzID0gMTI4LAorICAgICAgICAgICAgICAgICAgICAgICAgLmRlZmtleWJpdHMgPSAxMjgsCisgICAgICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIC5kZXNjID0geworICAgICAgICAgICAgICAgIC5zYWRiX2FsZ19pZCA9IFNBREJfWF9FQUxHX1NFUlBFTlRDQkMsCisgICAgICAgICAgICAgICAgLnNhZGJfYWxnX2l2bGVuID0gOCwKKyAgICAgICAgICAgICAgICAuc2FkYl9hbGdfbWluYml0cyA9IDEyOCwKKyAgICAgICAgICAgICAgICAuc2FkYl9hbGdfbWF4Yml0cyA9IDI1NiwKKyAgICAgICAgfQorfSwKK3sKKyAgICAgICAgLm5hbWUgPSAidHdvZmlzaCIsCisgICAgICAgICAgICAgICAgIAorICAgICAgICAudWluZm8gPSB7CisgICAgICAgICAgICAgICAgLmVuY3IgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAuYmxvY2tiaXRzID0gMTI4LAorICAgICAgICAgICAgICAgICAgICAgICAgLmRlZmtleWJpdHMgPSAxMjgsCisgICAgICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIC5kZXNjID0geworICAgICAgICAgICAgICAgIC5zYWRiX2FsZ19pZCA9IFNBREJfWF9FQUxHX1RXT0ZJU0hDQkMsCisgICAgICAgICAgICAgICAgLnNhZGJfYWxnX2l2bGVuID0gOCwKKyAgICAgICAgICAgICAgICAuc2FkYl9hbGdfbWluYml0cyA9IDEyOCwKKyAgICAgICAgICAgICAgICAuc2FkYl9hbGdfbWF4Yml0cyA9IDI1NgorICAgICAgICB9Cit9LAorfTsKKworc3RhdGljIHN0cnVjdCB4ZnJtX2FsZ29fZGVzYyBjYWxnX2xpc3RbXSA9IHsKK3sKKwkubmFtZSA9ICJkZWZsYXRlIiwKKwkudWluZm8gPSB7CisJCS5jb21wID0geworCQkJLnRocmVzaG9sZCA9IDkwLAorCQl9CisJfSwKKwkuZGVzYyA9IHsgLnNhZGJfYWxnX2lkID0gU0FEQl9YX0NBTEdfREVGTEFURSB9Cit9LAoreworCS5uYW1lID0gImx6cyIsCisJLnVpbmZvID0geworCQkuY29tcCA9IHsKKwkJCS50aHJlc2hvbGQgPSA5MCwKKwkJfQorCX0sCisJLmRlc2MgPSB7IC5zYWRiX2FsZ19pZCA9IFNBREJfWF9DQUxHX0xaUyB9Cit9LAoreworCS5uYW1lID0gImx6amgiLAorCS51aW5mbyA9IHsKKwkJLmNvbXAgPSB7CisJCQkudGhyZXNob2xkID0gNTAsCisJCX0KKwl9LAorCS5kZXNjID0geyAuc2FkYl9hbGdfaWQgPSBTQURCX1hfQ0FMR19MWkpIIH0KK30sCit9OworCitzdGF0aWMgaW5saW5lIGludCBhYWxnX2VudHJpZXModm9pZCkKK3sKKwlyZXR1cm4gQVJSQVlfU0laRShhYWxnX2xpc3QpOworfQorCitzdGF0aWMgaW5saW5lIGludCBlYWxnX2VudHJpZXModm9pZCkKK3sKKwlyZXR1cm4gQVJSQVlfU0laRShlYWxnX2xpc3QpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjYWxnX2VudHJpZXModm9pZCkKK3sKKwlyZXR1cm4gQVJSQVlfU0laRShjYWxnX2xpc3QpOworfQorCisvKiBUb2RvOiBnZW5lcmljIGl0ZXJhdG9ycyAqLworc3RydWN0IHhmcm1fYWxnb19kZXNjICp4ZnJtX2FhbGdfZ2V0X2J5aWQoaW50IGFsZ19pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhYWxnX2VudHJpZXMoKTsgaSsrKSB7CisJCWlmIChhYWxnX2xpc3RbaV0uZGVzYy5zYWRiX2FsZ19pZCA9PSBhbGdfaWQpIHsKKwkJCWlmIChhYWxnX2xpc3RbaV0uYXZhaWxhYmxlKQorCQkJCXJldHVybiAmYWFsZ19saXN0W2ldOworCQkJZWxzZQorCQkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoeGZybV9hYWxnX2dldF9ieWlkKTsKKworc3RydWN0IHhmcm1fYWxnb19kZXNjICp4ZnJtX2VhbGdfZ2V0X2J5aWQoaW50IGFsZ19pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBlYWxnX2VudHJpZXMoKTsgaSsrKSB7CisJCWlmIChlYWxnX2xpc3RbaV0uZGVzYy5zYWRiX2FsZ19pZCA9PSBhbGdfaWQpIHsKKwkJCWlmIChlYWxnX2xpc3RbaV0uYXZhaWxhYmxlKQorCQkJCXJldHVybiAmZWFsZ19saXN0W2ldOworCQkJZWxzZQorCQkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoeGZybV9lYWxnX2dldF9ieWlkKTsKKworc3RydWN0IHhmcm1fYWxnb19kZXNjICp4ZnJtX2NhbGdfZ2V0X2J5aWQoaW50IGFsZ19pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjYWxnX2VudHJpZXMoKTsgaSsrKSB7CisJCWlmIChjYWxnX2xpc3RbaV0uZGVzYy5zYWRiX2FsZ19pZCA9PSBhbGdfaWQpIHsKKwkJCWlmIChjYWxnX2xpc3RbaV0uYXZhaWxhYmxlKQorCQkJCXJldHVybiAmY2FsZ19saXN0W2ldOworCQkJZWxzZQorCQkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoeGZybV9jYWxnX2dldF9ieWlkKTsKKworc3RhdGljIHN0cnVjdCB4ZnJtX2FsZ29fZGVzYyAqeGZybV9nZXRfYnluYW1lKHN0cnVjdCB4ZnJtX2FsZ29fZGVzYyAqbGlzdCwKKwkJCQkJICAgICAgaW50IGVudHJpZXMsIGNoYXIgKm5hbWUsCisJCQkJCSAgICAgIGludCBwcm9iZSkKK3sKKwlpbnQgaSwgc3RhdHVzOworCisJaWYgKCFuYW1lKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHsKKwkJaWYgKHN0cmNtcChuYW1lLCBsaXN0W2ldLm5hbWUpKQorCQkJY29udGludWU7CisKKwkJaWYgKGxpc3RbaV0uYXZhaWxhYmxlKQorCQkJcmV0dXJuICZsaXN0W2ldOworCisJCWlmICghcHJvYmUpCisJCQlicmVhazsKKworCQlzdGF0dXMgPSBjcnlwdG9fYWxnX2F2YWlsYWJsZShuYW1lLCAwKTsKKwkJaWYgKCFzdGF0dXMpCisJCQlicmVhazsKKworCQlsaXN0W2ldLmF2YWlsYWJsZSA9IHN0YXR1czsKKwkJcmV0dXJuICZsaXN0W2ldOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IHhmcm1fYWxnb19kZXNjICp4ZnJtX2FhbGdfZ2V0X2J5bmFtZShjaGFyICpuYW1lLCBpbnQgcHJvYmUpCit7CisJcmV0dXJuIHhmcm1fZ2V0X2J5bmFtZShhYWxnX2xpc3QsIGFhbGdfZW50cmllcygpLCBuYW1lLCBwcm9iZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh4ZnJtX2FhbGdfZ2V0X2J5bmFtZSk7CisKK3N0cnVjdCB4ZnJtX2FsZ29fZGVzYyAqeGZybV9lYWxnX2dldF9ieW5hbWUoY2hhciAqbmFtZSwgaW50IHByb2JlKQoreworCXJldHVybiB4ZnJtX2dldF9ieW5hbWUoZWFsZ19saXN0LCBlYWxnX2VudHJpZXMoKSwgbmFtZSwgcHJvYmUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoeGZybV9lYWxnX2dldF9ieW5hbWUpOworCitzdHJ1Y3QgeGZybV9hbGdvX2Rlc2MgKnhmcm1fY2FsZ19nZXRfYnluYW1lKGNoYXIgKm5hbWUsIGludCBwcm9iZSkKK3sKKwlyZXR1cm4geGZybV9nZXRfYnluYW1lKGNhbGdfbGlzdCwgY2FsZ19lbnRyaWVzKCksIG5hbWUsIHByb2JlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHhmcm1fY2FsZ19nZXRfYnluYW1lKTsKKworc3RydWN0IHhmcm1fYWxnb19kZXNjICp4ZnJtX2FhbGdfZ2V0X2J5aWR4KHVuc2lnbmVkIGludCBpZHgpCit7CisJaWYgKGlkeCA+PSBhYWxnX2VudHJpZXMoKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gJmFhbGdfbGlzdFtpZHhdOworfQorRVhQT1JUX1NZTUJPTF9HUEwoeGZybV9hYWxnX2dldF9ieWlkeCk7CisKK3N0cnVjdCB4ZnJtX2FsZ29fZGVzYyAqeGZybV9lYWxnX2dldF9ieWlkeCh1bnNpZ25lZCBpbnQgaWR4KQoreworCWlmIChpZHggPj0gZWFsZ19lbnRyaWVzKCkpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICZlYWxnX2xpc3RbaWR4XTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHhmcm1fZWFsZ19nZXRfYnlpZHgpOworCisvKgorICogUHJvYmUgZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgY3J5cHRvIGFsZ29yaXRobXMsIGFuZCBzZXQgdGhlIGF2YWlsYWJsZQorICogZmxhZyBmb3IgYW55IGFsZ29yaXRobXMgZm91bmQgb24gdGhlIHN5c3RlbS4gIFRoaXMgaXMgdHlwaWNhbGx5IGNhbGxlZCBieQorICogcGZrZXkgZHVyaW5nIHVzZXJzcGFjZSBTQSBhZGQsIHVwZGF0ZSBvciByZWdpc3Rlci4KKyAqLwordm9pZCB4ZnJtX3Byb2JlX2FsZ3Modm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfQ1JZUFRPCisJaW50IGksIHN0YXR1czsKKwkKKwlCVUdfT04oaW5fc29mdGlycSgpKTsKKworCWZvciAoaSA9IDA7IGkgPCBhYWxnX2VudHJpZXMoKTsgaSsrKSB7CisJCXN0YXR1cyA9IGNyeXB0b19hbGdfYXZhaWxhYmxlKGFhbGdfbGlzdFtpXS5uYW1lLCAwKTsKKwkJaWYgKGFhbGdfbGlzdFtpXS5hdmFpbGFibGUgIT0gc3RhdHVzKQorCQkJYWFsZ19saXN0W2ldLmF2YWlsYWJsZSA9IHN0YXR1czsKKwl9CisJCisJZm9yIChpID0gMDsgaSA8IGVhbGdfZW50cmllcygpOyBpKyspIHsKKwkJc3RhdHVzID0gY3J5cHRvX2FsZ19hdmFpbGFibGUoZWFsZ19saXN0W2ldLm5hbWUsIDApOworCQlpZiAoZWFsZ19saXN0W2ldLmF2YWlsYWJsZSAhPSBzdGF0dXMpCisJCQllYWxnX2xpc3RbaV0uYXZhaWxhYmxlID0gc3RhdHVzOworCX0KKwkKKwlmb3IgKGkgPSAwOyBpIDwgY2FsZ19lbnRyaWVzKCk7IGkrKykgeworCQlzdGF0dXMgPSBjcnlwdG9fYWxnX2F2YWlsYWJsZShjYWxnX2xpc3RbaV0ubmFtZSwgMCk7CisJCWlmIChjYWxnX2xpc3RbaV0uYXZhaWxhYmxlICE9IHN0YXR1cykKKwkJCWNhbGdfbGlzdFtpXS5hdmFpbGFibGUgPSBzdGF0dXM7CisJfQorI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MX0dQTCh4ZnJtX3Byb2JlX2FsZ3MpOworCitpbnQgeGZybV9jb3VudF9hdXRoX3N1cHBvcnRlZCh2b2lkKQoreworCWludCBpLCBuOworCisJZm9yIChpID0gMCwgbiA9IDA7IGkgPCBhYWxnX2VudHJpZXMoKTsgaSsrKQorCQlpZiAoYWFsZ19saXN0W2ldLmF2YWlsYWJsZSkKKwkJCW4rKzsKKwlyZXR1cm4gbjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHhmcm1fY291bnRfYXV0aF9zdXBwb3J0ZWQpOworCitpbnQgeGZybV9jb3VudF9lbmNfc3VwcG9ydGVkKHZvaWQpCit7CisJaW50IGksIG47CisKKwlmb3IgKGkgPSAwLCBuID0gMDsgaSA8IGVhbGdfZW50cmllcygpOyBpKyspCisJCWlmIChlYWxnX2xpc3RbaV0uYXZhaWxhYmxlKQorCQkJbisrOworCXJldHVybiBuOworfQorRVhQT1JUX1NZTUJPTF9HUEwoeGZybV9jb3VudF9lbmNfc3VwcG9ydGVkKTsKKworLyogTW92ZSB0byBjb21tb24gYXJlYTogaXQgaXMgc2hhcmVkIHdpdGggQUguICovCisKK3ZvaWQgc2tiX2ljdl93YWxrKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCSAgaW50IG9mZnNldCwgaW50IGxlbiwgaWN2X3VwZGF0ZV9mbl90IGljdl91cGRhdGUpCit7CisJaW50IHN0YXJ0ID0gc2tiX2hlYWRsZW4oc2tiKTsKKwlpbnQgaSwgY29weSA9IHN0YXJ0IC0gb2Zmc2V0OworCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKworCS8qIENoZWNrc3VtIGhlYWRlci4gKi8KKwlpZiAoY29weSA+IDApIHsKKwkJaWYgKGNvcHkgPiBsZW4pCisJCQljb3B5ID0gbGVuOworCQkKKwkJc2cucGFnZSA9IHZpcnRfdG9fcGFnZShza2ItPmRhdGEgKyBvZmZzZXQpOworCQlzZy5vZmZzZXQgPSAodW5zaWduZWQgbG9uZykoc2tiLT5kYXRhICsgb2Zmc2V0KSAlIFBBR0VfU0laRTsKKwkJc2cubGVuZ3RoID0gY29weTsKKwkJCisJCWljdl91cGRhdGUodGZtLCAmc2csIDEpOworCQkKKwkJaWYgKChsZW4gLT0gY29weSkgPT0gMCkKKwkJCXJldHVybjsKKwkJb2Zmc2V0ICs9IGNvcHk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykgeworCQlpbnQgZW5kOworCisJCUJVR19UUkFQKHN0YXJ0IDw9IG9mZnNldCArIGxlbik7CisKKwkJZW5kID0gc3RhcnQgKyBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CisJCWlmICgoY29weSA9IGVuZCAtIG9mZnNldCkgPiAwKSB7CisJCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisKKwkJCWlmIChjb3B5ID4gbGVuKQorCQkJCWNvcHkgPSBsZW47CisJCQkKKwkJCXNnLnBhZ2UgPSBmcmFnLT5wYWdlOworCQkJc2cub2Zmc2V0ID0gZnJhZy0+cGFnZV9vZmZzZXQgKyBvZmZzZXQtc3RhcnQ7CisJCQlzZy5sZW5ndGggPSBjb3B5OworCQkJCisJCQlpY3ZfdXBkYXRlKHRmbSwgJnNnLCAxKTsKKworCQkJaWYgKCEobGVuIC09IGNvcHkpKQorCQkJCXJldHVybjsKKwkJCW9mZnNldCArPSBjb3B5OworCQl9CisJCXN0YXJ0ID0gZW5kOworCX0KKworCWlmIChza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqbGlzdCA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0OworCisJCWZvciAoOyBsaXN0OyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQkJaW50IGVuZDsKKworCQkJQlVHX1RSQVAoc3RhcnQgPD0gb2Zmc2V0ICsgbGVuKTsKKworCQkJZW5kID0gc3RhcnQgKyBsaXN0LT5sZW47CisJCQlpZiAoKGNvcHkgPSBlbmQgLSBvZmZzZXQpID4gMCkgeworCQkJCWlmIChjb3B5ID4gbGVuKQorCQkJCQljb3B5ID0gbGVuOworCQkJCXNrYl9pY3Zfd2FsayhsaXN0LCB0Zm0sIG9mZnNldC1zdGFydCwgY29weSwgaWN2X3VwZGF0ZSk7CisJCQkJaWYgKChsZW4gLT0gY29weSkgPT0gMCkKKwkJCQkJcmV0dXJuOworCQkJCW9mZnNldCArPSBjb3B5OworCQkJfQorCQkJc3RhcnQgPSBlbmQ7CisJCX0KKwl9CisJaWYgKGxlbikKKwkJQlVHKCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChza2JfaWN2X3dhbGspOworCisjaWYgZGVmaW5lZChDT05GSUdfSU5FVF9FU1ApIHx8IGRlZmluZWQoQ09ORklHX0lORVRfRVNQX01PRFVMRSkgfHwgZGVmaW5lZChDT05GSUdfSU5FVDZfRVNQKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUNl9FU1BfTU9EVUxFKQorCisvKiBMb29raW5nIGdlbmVyaWMgaXQgaXMgbm90IHVzZWQgaW4gYW5vdGhlciBwbGFjZXMuICovCisKK2ludAorc2tiX3RvX3NndmVjKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBvZmZzZXQsIGludCBsZW4pCit7CisJaW50IHN0YXJ0ID0gc2tiX2hlYWRsZW4oc2tiKTsKKwlpbnQgaSwgY29weSA9IHN0YXJ0IC0gb2Zmc2V0OworCWludCBlbHQgPSAwOworCisJaWYgKGNvcHkgPiAwKSB7CisJCWlmIChjb3B5ID4gbGVuKQorCQkJY29weSA9IGxlbjsKKwkJc2dbZWx0XS5wYWdlID0gdmlydF90b19wYWdlKHNrYi0+ZGF0YSArIG9mZnNldCk7CisJCXNnW2VsdF0ub2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpKHNrYi0+ZGF0YSArIG9mZnNldCkgJSBQQUdFX1NJWkU7CisJCXNnW2VsdF0ubGVuZ3RoID0gY29weTsKKwkJZWx0Kys7CisJCWlmICgobGVuIC09IGNvcHkpID09IDApCisJCQlyZXR1cm4gZWx0OworCQlvZmZzZXQgKz0gY29weTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKSB7CisJCWludCBlbmQ7CisKKwkJQlVHX1RSQVAoc3RhcnQgPD0gb2Zmc2V0ICsgbGVuKTsKKworCQllbmQgPSBzdGFydCArIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZTsKKwkJaWYgKChjb3B5ID0gZW5kIC0gb2Zmc2V0KSA+IDApIHsKKwkJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKKworCQkJaWYgKGNvcHkgPiBsZW4pCisJCQkJY29weSA9IGxlbjsKKwkJCXNnW2VsdF0ucGFnZSA9IGZyYWctPnBhZ2U7CisJCQlzZ1tlbHRdLm9mZnNldCA9IGZyYWctPnBhZ2Vfb2Zmc2V0K29mZnNldC1zdGFydDsKKwkJCXNnW2VsdF0ubGVuZ3RoID0gY29weTsKKwkJCWVsdCsrOworCQkJaWYgKCEobGVuIC09IGNvcHkpKQorCQkJCXJldHVybiBlbHQ7CisJCQlvZmZzZXQgKz0gY29weTsKKwkJfQorCQlzdGFydCA9IGVuZDsKKwl9CisKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKmxpc3QgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKKworCQlmb3IgKDsgbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJCWludCBlbmQ7CisKKwkJCUJVR19UUkFQKHN0YXJ0IDw9IG9mZnNldCArIGxlbik7CisKKwkJCWVuZCA9IHN0YXJ0ICsgbGlzdC0+bGVuOworCQkJaWYgKChjb3B5ID0gZW5kIC0gb2Zmc2V0KSA+IDApIHsKKwkJCQlpZiAoY29weSA+IGxlbikKKwkJCQkJY29weSA9IGxlbjsKKwkJCQllbHQgKz0gc2tiX3RvX3NndmVjKGxpc3QsIHNnK2VsdCwgb2Zmc2V0IC0gc3RhcnQsIGNvcHkpOworCQkJCWlmICgobGVuIC09IGNvcHkpID09IDApCisJCQkJCXJldHVybiBlbHQ7CisJCQkJb2Zmc2V0ICs9IGNvcHk7CisJCQl9CisJCQlzdGFydCA9IGVuZDsKKwkJfQorCX0KKwlpZiAobGVuKQorCQlCVUcoKTsKKwlyZXR1cm4gZWx0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2tiX3RvX3NndmVjKTsKKworLyogQ2hlY2sgdGhhdCBza2IgZGF0YSBiaXRzIGFyZSB3cml0YWJsZS4gSWYgdGhleSBhcmUgbm90LCBjb3B5IGRhdGEKKyAqIHRvIG5ld2x5IGNyZWF0ZWQgcHJpdmF0ZSBhcmVhLiBJZiAidGFpbGJpdHMiIGlzIGdpdmVuLCBtYWtlIHN1cmUgdGhhdAorICogdGFpbGJpdHMgYnl0ZXMgYmV5b25kIGN1cnJlbnQgZW5kIG9mIHNrYiBhcmUgd3JpdGFibGUuCisgKgorICogUmV0dXJucyBhbW91bnQgb2YgZWxlbWVudHMgb2Ygc2NhdHRlcmxpc3QgdG8gbG9hZCBmb3Igc3Vic2VxdWVudAorICogdHJhbnNmb3JtYXRpb25zIGFuZCBwb2ludGVyIHRvIHdyaXRhYmxlIHRyYWlsZXIgc2tiLgorICovCisKK2ludCBza2JfY293X2RhdGEoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHRhaWxiaXRzLCBzdHJ1Y3Qgc2tfYnVmZiAqKnRyYWlsZXIpCit7CisJaW50IGNvcHlmbGFnOworCWludCBlbHQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjEsICoqc2tiX3A7CisKKwkvKiBJZiBza2IgaXMgY2xvbmVkIG9yIGl0cyBoZWFkIGlzIHBhZ2VkLCByZWFsbG9jYXRlCisJICogaGVhZCBwdWxsaW5nIG91dCBhbGwgdGhlIHBhZ2VzIChwYWdlcyBhcmUgY29uc2lkZXJlZCBub3Qgd3JpdGFibGUKKwkgKiBhdCB0aGUgbW9tZW50IGV2ZW4gaWYgdGhleSBhcmUgYW5vbnltb3VzKS4KKwkgKi8KKwlpZiAoKHNrYl9jbG9uZWQoc2tiKSB8fCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKSAmJgorCSAgICBfX3Bza2JfcHVsbF90YWlsKHNrYiwgc2tiX3BhZ2VsZW4oc2tiKS1za2JfaGVhZGxlbihza2IpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEVhc3kgY2FzZS4gTW9zdCBvZiBwYWNrZXRzIHdpbGwgZ28gdGhpcyB3YXkuICovCisJaWYgKCFza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCkgeworCQkvKiBBIGxpdHRsZSBvZiB0cm91YmxlLCBub3QgZW5vdWdoIG9mIHNwYWNlIGZvciB0cmFpbGVyLgorCQkgKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCB3aGVuIHN0YWNrIGlzIHR1bmVkIHRvIGdlbmVyYXRlCisJCSAqIGdvb2QgZnJhbWVzLiBPSywgb24gbWlzcyB3ZSByZWFsbG9jYXRlIGFuZCByZXNlcnZlIGV2ZW4gbW9yZQorCQkgKiBzcGFjZSwgMTI4IGJ5dGVzIGlzIGZhaXIuICovCisKKwkJaWYgKHNrYl90YWlscm9vbShza2IpIDwgdGFpbGJpdHMgJiYKKwkJICAgIHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCB0YWlsYml0cy1za2JfdGFpbHJvb20oc2tiKSsxMjgsIEdGUF9BVE9NSUMpKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJLyogVm9pbGEhICovCisJCSp0cmFpbGVyID0gc2tiOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBNaXNlcnkuIFdlIGFyZSBpbiB0cm91YmxlcywgZ29pbmcgdG8gbWluY2VyIGZyYWdtZW50cy4uLiAqLworCisJZWx0ID0gMTsKKwlza2JfcCA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKKwljb3B5ZmxhZyA9IDA7CisKKwl3aGlsZSAoKHNrYjEgPSAqc2tiX3ApICE9IE5VTEwpIHsKKwkJaW50IG50YWlsID0gMDsKKworCQkvKiBUaGUgZnJhZ21lbnQgaXMgcGFydGlhbGx5IHB1bGxlZCBieSBzb21lb25lLAorCQkgKiB0aGlzIGNhbiBoYXBwZW4gb24gaW5wdXQuIENvcHkgaXQgYW5kIGV2ZXJ5dGhpbmcKKwkJICogYWZ0ZXIgaXQuICovCisKKwkJaWYgKHNrYl9zaGFyZWQoc2tiMSkpCisJCQljb3B5ZmxhZyA9IDE7CisKKwkJLyogSWYgdGhlIHNrYiBpcyB0aGUgbGFzdCwgd29ycnkgYWJvdXQgdHJhaWxlci4gKi8KKworCQlpZiAoc2tiMS0+bmV4dCA9PSBOVUxMICYmIHRhaWxiaXRzKSB7CisJCQlpZiAoc2tiX3NoaW5mbyhza2IxKS0+bnJfZnJhZ3MgfHwKKwkJCSAgICBza2Jfc2hpbmZvKHNrYjEpLT5mcmFnX2xpc3QgfHwKKwkJCSAgICBza2JfdGFpbHJvb20oc2tiMSkgPCB0YWlsYml0cykKKwkJCQludGFpbCA9IHRhaWxiaXRzICsgMTI4OworCQl9CisKKwkJaWYgKGNvcHlmbGFnIHx8CisJCSAgICBza2JfY2xvbmVkKHNrYjEpIHx8CisJCSAgICBudGFpbCB8fAorCQkgICAgc2tiX3NoaW5mbyhza2IxKS0+bnJfZnJhZ3MgfHwKKwkJICAgIHNrYl9zaGluZm8oc2tiMSktPmZyYWdfbGlzdCkgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjI7CisKKwkJCS8qIEZ1Y2ssIHdlIGFyZSBtaXNlcmFibGUgcG9vciBndXlzLi4uICovCisJCQlpZiAobnRhaWwgPT0gMCkKKwkJCQlza2IyID0gc2tiX2NvcHkoc2tiMSwgR0ZQX0FUT01JQyk7CisJCQllbHNlCisJCQkJc2tiMiA9IHNrYl9jb3B5X2V4cGFuZChza2IxLAorCQkJCQkJICAgICAgIHNrYl9oZWFkcm9vbShza2IxKSwKKwkJCQkJCSAgICAgICBudGFpbCwKKwkJCQkJCSAgICAgICBHRlBfQVRPTUlDKTsKKwkJCWlmICh1bmxpa2VseShza2IyID09IE5VTEwpKQorCQkJCXJldHVybiAtRU5PTUVNOworCisJCQlpZiAoc2tiMS0+c2spCisJCQkJc2tiX3NldF9vd25lcl93KHNrYiwgc2tiMS0+c2spOworCisJCQkvKiBMb29raW5nIGFyb3VuZC4gQXJlIHdlIHN0aWxsIGFsaXZlPworCQkJICogT0ssIGxpbmsgbmV3IHNrYiwgZHJvcCBvbGQgb25lICovCisKKwkJCXNrYjItPm5leHQgPSBza2IxLT5uZXh0OworCQkJKnNrYl9wID0gc2tiMjsKKwkJCWtmcmVlX3NrYihza2IxKTsKKwkJCXNrYjEgPSBza2IyOworCQl9CisJCWVsdCsrOworCQkqdHJhaWxlciA9IHNrYjE7CisJCXNrYl9wID0gJnNrYjEtPm5leHQ7CisJfQorCisJcmV0dXJuIGVsdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNrYl9jb3dfZGF0YSk7CisKK3ZvaWQgKnBza2JfcHV0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBza19idWZmICp0YWlsLCBpbnQgbGVuKQoreworCWlmICh0YWlsICE9IHNrYikgeworCQlza2ItPmRhdGFfbGVuICs9IGxlbjsKKwkJc2tiLT5sZW4gKz0gbGVuOworCX0KKwlyZXR1cm4gc2tiX3B1dCh0YWlsLCBsZW4pOworfQorRVhQT1JUX1NZTUJPTF9HUEwocHNrYl9wdXQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX2lucHV0LmMgYi9uZXQveGZybS94ZnJtX2lucHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU4YTZmMAotLS0gL2Rldi9udWxsCisrKyBiL25ldC94ZnJtL3hmcm1faW5wdXQuYwpAQCAtMCwwICsxLDg5IEBACisvKgorICogeGZybV9pbnB1dC5jCisgKgorICogQ2hhbmdlczoKKyAqIAlZT1NISUZVSkkgSGlkZWFraSBAVVNBR0kKKyAqIAkJU3BsaXQgdXAgYWYtc3BlY2lmaWMgcG9ydGlvbgorICogCQorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L3hmcm0uaD4KKworc3RhdGljIGttZW1fY2FjaGVfdCAqc2VjcGF0aF9jYWNoZXA7CisKK3ZvaWQgX19zZWNwYXRoX2Rlc3Ryb3koc3RydWN0IHNlY19wYXRoICpzcCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgc3AtPmxlbjsgaSsrKQorCQl4ZnJtX3N0YXRlX3B1dChzcC0+eFtpXS54dmVjKTsKKwlrbWVtX2NhY2hlX2ZyZWUoc2VjcGF0aF9jYWNoZXAsIHNwKTsKK30KK0VYUE9SVF9TWU1CT0woX19zZWNwYXRoX2Rlc3Ryb3kpOworCitzdHJ1Y3Qgc2VjX3BhdGggKnNlY3BhdGhfZHVwKHN0cnVjdCBzZWNfcGF0aCAqc3JjKQoreworCXN0cnVjdCBzZWNfcGF0aCAqc3A7CisKKwlzcCA9IGttZW1fY2FjaGVfYWxsb2Moc2VjcGF0aF9jYWNoZXAsIFNMQUJfQVRPTUlDKTsKKwlpZiAoIXNwKQorCQlyZXR1cm4gTlVMTDsKKworCXNwLT5sZW4gPSAwOworCWlmIChzcmMpIHsKKwkJaW50IGk7CisKKwkJbWVtY3B5KHNwLCBzcmMsIHNpemVvZigqc3ApKTsKKwkJZm9yIChpID0gMDsgaSA8IHNwLT5sZW47IGkrKykKKwkJCXhmcm1fc3RhdGVfaG9sZChzcC0+eFtpXS54dmVjKTsKKwl9CisJYXRvbWljX3NldCgmc3AtPnJlZmNudCwgMSk7CisJcmV0dXJuIHNwOworfQorRVhQT1JUX1NZTUJPTChzZWNwYXRoX2R1cCk7CisKKy8qIEZldGNoIHNwaSBhbmQgc2VxIGZyb20gaXBzZWMgaGVhZGVyICovCisKK2ludCB4ZnJtX3BhcnNlX3NwaShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCBuZXh0aGRyLCB1MzIgKnNwaSwgdTMyICpzZXEpCit7CisJaW50IG9mZnNldCwgb2Zmc2V0X3NlcTsKKworCXN3aXRjaCAobmV4dGhkcikgeworCWNhc2UgSVBQUk9UT19BSDoKKwkJb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGlwX2F1dGhfaGRyLCBzcGkpOworCQlvZmZzZXRfc2VxID0gb2Zmc2V0b2Yoc3RydWN0IGlwX2F1dGhfaGRyLCBzZXFfbm8pOworCQlicmVhazsKKwljYXNlIElQUFJPVE9fRVNQOgorCQlvZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgaXBfZXNwX2hkciwgc3BpKTsKKwkJb2Zmc2V0X3NlcSA9IG9mZnNldG9mKHN0cnVjdCBpcF9lc3BfaGRyLCBzZXFfbm8pOworCQlicmVhazsKKwljYXNlIElQUFJPVE9fQ09NUDoKKwkJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcF9jb21wX2hkcikpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCSpzcGkgPSBudG9obChudG9ocygqKHUxNiopKHNrYi0+aC5yYXcgKyAyKSkpOworCQkqc2VxID0gMDsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgMTYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSpzcGkgPSAqKHUzMiopKHNrYi0+aC5yYXcgKyBvZmZzZXQpOworCSpzZXEgPSAqKHUzMiopKHNrYi0+aC5yYXcgKyBvZmZzZXRfc2VxKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woeGZybV9wYXJzZV9zcGkpOworCit2b2lkIF9faW5pdCB4ZnJtX2lucHV0X2luaXQodm9pZCkKK3sKKwlzZWNwYXRoX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJzZWNwYXRoX2NhY2hlIiwKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCBzZWNfcGF0aCksCisJCQkJCSAgIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwKKwkJCQkJICAgTlVMTCwgTlVMTCk7CisJaWYgKCFzZWNwYXRoX2NhY2hlcCkKKwkJcGFuaWMoIlhGUk06IGZhaWxlZCB0byBhbGxvY2F0ZSBzZWNwYXRoX2NhY2hlXG4iKTsKK30KZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fcG9saWN5LmMgYi9uZXQveGZybS94ZnJtX3BvbGljeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwODI4MDcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQveGZybS94ZnJtX3BvbGljeS5jCkBAIC0wLDAgKzEsMTM2NyBAQAorLyogCisgKiB4ZnJtX3BvbGljeS5jCisgKgorICogQ2hhbmdlczoKKyAqCU1pdHN1cnUgS0FOREEgQFVTQUdJCisgKiAJS2F6dW5vcmkgTUlZQVpBV0EgQFVTQUdJCisgKiAJS3VuaWhpcm8gSXNoaWd1cm8gPGt1bmloaXJvQGlwaW5mdXNpb24uY29tPgorICogCQlJUHY2IHN1cHBvcnQKKyAqIAlLYXp1bm9yaSBNSVlBWkFXQSBAVVNBR0kKKyAqIAlZT1NISUZVSkkgSGlkZWFraQorICogCQlTcGxpdCB1cCBhZi1zcGVjaWZpYyBwb3J0aW9uCisgKglEZXJlayBBdGtpbnMgPGRlcmVrQGlodGZwLmNvbT4JCUFkZCB0aGUgcG9zdF9pbnB1dCBwcm9jZXNzb3IKKyAqIAkKKyAqLworCisjaW5jbHVkZSA8YXNtL2J1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxuZXQveGZybS5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorCitERUNMQVJFX01VVEVYKHhmcm1fY2ZnX3NlbSk7CitFWFBPUlRfU1lNQk9MKHhmcm1fY2ZnX3NlbSk7CisKK3N0YXRpYyBERUZJTkVfUldMT0NLKHhmcm1fcG9saWN5X2xvY2spOworCitzdHJ1Y3QgeGZybV9wb2xpY3kgKnhmcm1fcG9saWN5X2xpc3RbWEZSTV9QT0xJQ1lfTUFYKjJdOworRVhQT1JUX1NZTUJPTCh4ZnJtX3BvbGljeV9saXN0KTsKKworc3RhdGljIERFRklORV9SV0xPQ0soeGZybV9wb2xpY3lfYWZpbmZvX2xvY2spOworc3RhdGljIHN0cnVjdCB4ZnJtX3BvbGljeV9hZmluZm8gKnhmcm1fcG9saWN5X2FmaW5mb1tOUFJPVE9dOworCitzdGF0aWMga21lbV9jYWNoZV90ICp4ZnJtX2RzdF9jYWNoZTsKKworc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCB4ZnJtX3BvbGljeV9nY193b3JrOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgeGZybV9wb2xpY3lfZ2NfbGlzdCA9CisJTElTVF9IRUFEX0lOSVQoeGZybV9wb2xpY3lfZ2NfbGlzdCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHhmcm1fcG9saWN5X2djX2xvY2spOworCitzdGF0aWMgc3RydWN0IHhmcm1fcG9saWN5X2FmaW5mbyAqeGZybV9wb2xpY3lfZ2V0X2FmaW5mbyh1bnNpZ25lZCBzaG9ydCBmYW1pbHkpOworc3RhdGljIHZvaWQgeGZybV9wb2xpY3lfcHV0X2FmaW5mbyhzdHJ1Y3QgeGZybV9wb2xpY3lfYWZpbmZvICphZmluZm8pOworCitpbnQgeGZybV9yZWdpc3Rlcl90eXBlKHN0cnVjdCB4ZnJtX3R5cGUgKnR5cGUsIHVuc2lnbmVkIHNob3J0IGZhbWlseSkKK3sKKwlzdHJ1Y3QgeGZybV9wb2xpY3lfYWZpbmZvICphZmluZm8gPSB4ZnJtX3BvbGljeV9nZXRfYWZpbmZvKGZhbWlseSk7CisJc3RydWN0IHhmcm1fdHlwZV9tYXAgKnR5cGVtYXA7CisJaW50IGVyciA9IDA7CisKKwlpZiAodW5saWtlbHkoYWZpbmZvID09IE5VTEwpKQorCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKKwl0eXBlbWFwID0gYWZpbmZvLT50eXBlX21hcDsKKworCXdyaXRlX2xvY2soJnR5cGVtYXAtPmxvY2spOworCWlmIChsaWtlbHkodHlwZW1hcC0+bWFwW3R5cGUtPnByb3RvXSA9PSBOVUxMKSkKKwkJdHlwZW1hcC0+bWFwW3R5cGUtPnByb3RvXSA9IHR5cGU7CisJZWxzZQorCQllcnIgPSAtRUVYSVNUOworCXdyaXRlX3VubG9jaygmdHlwZW1hcC0+bG9jayk7CisJeGZybV9wb2xpY3lfcHV0X2FmaW5mbyhhZmluZm8pOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKHhmcm1fcmVnaXN0ZXJfdHlwZSk7CisKK2ludCB4ZnJtX3VucmVnaXN0ZXJfdHlwZShzdHJ1Y3QgeGZybV90eXBlICp0eXBlLCB1bnNpZ25lZCBzaG9ydCBmYW1pbHkpCit7CisJc3RydWN0IHhmcm1fcG9saWN5X2FmaW5mbyAqYWZpbmZvID0geGZybV9wb2xpY3lfZ2V0X2FmaW5mbyhmYW1pbHkpOworCXN0cnVjdCB4ZnJtX3R5cGVfbWFwICp0eXBlbWFwOworCWludCBlcnIgPSAwOworCisJaWYgKHVubGlrZWx5KGFmaW5mbyA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisJdHlwZW1hcCA9IGFmaW5mby0+dHlwZV9tYXA7CisKKwl3cml0ZV9sb2NrKCZ0eXBlbWFwLT5sb2NrKTsKKwlpZiAodW5saWtlbHkodHlwZW1hcC0+bWFwW3R5cGUtPnByb3RvXSAhPSB0eXBlKSkKKwkJZXJyID0gLUVOT0VOVDsKKwllbHNlCisJCXR5cGVtYXAtPm1hcFt0eXBlLT5wcm90b10gPSBOVUxMOworCXdyaXRlX3VubG9jaygmdHlwZW1hcC0+bG9jayk7CisJeGZybV9wb2xpY3lfcHV0X2FmaW5mbyhhZmluZm8pOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKHhmcm1fdW5yZWdpc3Rlcl90eXBlKTsKKworc3RydWN0IHhmcm1fdHlwZSAqeGZybV9nZXRfdHlwZSh1OCBwcm90bywgdW5zaWduZWQgc2hvcnQgZmFtaWx5KQoreworCXN0cnVjdCB4ZnJtX3BvbGljeV9hZmluZm8gKmFmaW5mbzsKKwlzdHJ1Y3QgeGZybV90eXBlX21hcCAqdHlwZW1hcDsKKwlzdHJ1Y3QgeGZybV90eXBlICp0eXBlOworCWludCBtb2Rsb2FkX2F0dGVtcHRlZCA9IDA7CisKK3JldHJ5OgorCWFmaW5mbyA9IHhmcm1fcG9saWN5X2dldF9hZmluZm8oZmFtaWx5KTsKKwlpZiAodW5saWtlbHkoYWZpbmZvID09IE5VTEwpKQorCQlyZXR1cm4gTlVMTDsKKwl0eXBlbWFwID0gYWZpbmZvLT50eXBlX21hcDsKKworCXJlYWRfbG9jaygmdHlwZW1hcC0+bG9jayk7CisJdHlwZSA9IHR5cGVtYXAtPm1hcFtwcm90b107CisJaWYgKHVubGlrZWx5KHR5cGUgJiYgIXRyeV9tb2R1bGVfZ2V0KHR5cGUtPm93bmVyKSkpCisJCXR5cGUgPSBOVUxMOworCXJlYWRfdW5sb2NrKCZ0eXBlbWFwLT5sb2NrKTsKKwlpZiAoIXR5cGUgJiYgIW1vZGxvYWRfYXR0ZW1wdGVkKSB7CisJCXhmcm1fcG9saWN5X3B1dF9hZmluZm8oYWZpbmZvKTsKKwkJcmVxdWVzdF9tb2R1bGUoInhmcm0tdHlwZS0lZC0lZCIsCisJCQkgICAgICAgKGludCkgZmFtaWx5LCAoaW50KSBwcm90byk7CisJCW1vZGxvYWRfYXR0ZW1wdGVkID0gMTsKKwkJZ290byByZXRyeTsKKwl9CisKKwl4ZnJtX3BvbGljeV9wdXRfYWZpbmZvKGFmaW5mbyk7CisJcmV0dXJuIHR5cGU7Cit9CitFWFBPUlRfU1lNQk9MKHhmcm1fZ2V0X3R5cGUpOworCitpbnQgeGZybV9kc3RfbG9va3VwKHN0cnVjdCB4ZnJtX2RzdCAqKmRzdCwgc3RydWN0IGZsb3dpICpmbCwgCisJCSAgICB1bnNpZ25lZCBzaG9ydCBmYW1pbHkpCit7CisJc3RydWN0IHhmcm1fcG9saWN5X2FmaW5mbyAqYWZpbmZvID0geGZybV9wb2xpY3lfZ2V0X2FmaW5mbyhmYW1pbHkpOworCWludCBlcnIgPSAwOworCisJaWYgKHVubGlrZWx5KGFmaW5mbyA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisKKwlpZiAobGlrZWx5KGFmaW5mby0+ZHN0X2xvb2t1cCAhPSBOVUxMKSkKKwkJZXJyID0gYWZpbmZvLT5kc3RfbG9va3VwKGRzdCwgZmwpOworCWVsc2UKKwkJZXJyID0gLUVJTlZBTDsKKwl4ZnJtX3BvbGljeV9wdXRfYWZpbmZvKGFmaW5mbyk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woeGZybV9kc3RfbG9va3VwKTsKKwordm9pZCB4ZnJtX3B1dF90eXBlKHN0cnVjdCB4ZnJtX3R5cGUgKnR5cGUpCit7CisJbW9kdWxlX3B1dCh0eXBlLT5vd25lcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtYWtlX2ppZmZpZXMobG9uZyBzZWNzKQoreworCWlmIChzZWNzID49IChNQVhfU0NIRURVTEVfVElNRU9VVC0xKS9IWikKKwkJcmV0dXJuIE1BWF9TQ0hFRFVMRV9USU1FT1VULTE7CisJZWxzZQorCSAgICAgICAgcmV0dXJuIHNlY3MqSFo7Cit9CisKK3N0YXRpYyB2b2lkIHhmcm1fcG9saWN5X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwID0gKHN0cnVjdCB4ZnJtX3BvbGljeSopZGF0YTsKKwl1bnNpZ25lZCBsb25nIG5vdyA9ICh1bnNpZ25lZCBsb25nKXh0aW1lLnR2X3NlYzsKKwlsb25nIG5leHQgPSBMT05HX01BWDsKKwlpbnQgd2FybiA9IDA7CisJaW50IGRpcjsKKworCXJlYWRfbG9jaygmeHAtPmxvY2spOworCisJaWYgKHhwLT5kZWFkKQorCQlnb3RvIG91dDsKKworCWRpciA9IHhwLT5pbmRleCAmIDc7CisKKwlpZiAoeHAtPmxmdC5oYXJkX2FkZF9leHBpcmVzX3NlY29uZHMpIHsKKwkJbG9uZyB0bW8gPSB4cC0+bGZ0LmhhcmRfYWRkX2V4cGlyZXNfc2Vjb25kcyArCisJCQl4cC0+Y3VybGZ0LmFkZF90aW1lIC0gbm93OworCQlpZiAodG1vIDw9IDApCisJCQlnb3RvIGV4cGlyZWQ7CisJCWlmICh0bW8gPCBuZXh0KQorCQkJbmV4dCA9IHRtbzsKKwl9CisJaWYgKHhwLT5sZnQuaGFyZF91c2VfZXhwaXJlc19zZWNvbmRzKSB7CisJCWxvbmcgdG1vID0geHAtPmxmdC5oYXJkX3VzZV9leHBpcmVzX3NlY29uZHMgKworCQkJKHhwLT5jdXJsZnQudXNlX3RpbWUgPyA6IHhwLT5jdXJsZnQuYWRkX3RpbWUpIC0gbm93OworCQlpZiAodG1vIDw9IDApCisJCQlnb3RvIGV4cGlyZWQ7CisJCWlmICh0bW8gPCBuZXh0KQorCQkJbmV4dCA9IHRtbzsKKwl9CisJaWYgKHhwLT5sZnQuc29mdF9hZGRfZXhwaXJlc19zZWNvbmRzKSB7CisJCWxvbmcgdG1vID0geHAtPmxmdC5zb2Z0X2FkZF9leHBpcmVzX3NlY29uZHMgKworCQkJeHAtPmN1cmxmdC5hZGRfdGltZSAtIG5vdzsKKwkJaWYgKHRtbyA8PSAwKSB7CisJCQl3YXJuID0gMTsKKwkJCXRtbyA9IFhGUk1fS01fVElNRU9VVDsKKwkJfQorCQlpZiAodG1vIDwgbmV4dCkKKwkJCW5leHQgPSB0bW87CisJfQorCWlmICh4cC0+bGZ0LnNvZnRfdXNlX2V4cGlyZXNfc2Vjb25kcykgeworCQlsb25nIHRtbyA9IHhwLT5sZnQuc29mdF91c2VfZXhwaXJlc19zZWNvbmRzICsKKwkJCSh4cC0+Y3VybGZ0LnVzZV90aW1lID8gOiB4cC0+Y3VybGZ0LmFkZF90aW1lKSAtIG5vdzsKKwkJaWYgKHRtbyA8PSAwKSB7CisJCQl3YXJuID0gMTsKKwkJCXRtbyA9IFhGUk1fS01fVElNRU9VVDsKKwkJfQorCQlpZiAodG1vIDwgbmV4dCkKKwkJCW5leHQgPSB0bW87CisJfQorCisJaWYgKHdhcm4pCisJCWttX3BvbGljeV9leHBpcmVkKHhwLCBkaXIsIDApOworCWlmIChuZXh0ICE9IExPTkdfTUFYICYmCisJICAgICFtb2RfdGltZXIoJnhwLT50aW1lciwgamlmZmllcyArIG1ha2VfamlmZmllcyhuZXh0KSkpCisJCXhmcm1fcG9sX2hvbGQoeHApOworCitvdXQ6CisJcmVhZF91bmxvY2soJnhwLT5sb2NrKTsKKwl4ZnJtX3BvbF9wdXQoeHApOworCXJldHVybjsKKworZXhwaXJlZDoKKwlyZWFkX3VubG9jaygmeHAtPmxvY2spOworCWttX3BvbGljeV9leHBpcmVkKHhwLCBkaXIsIDEpOworCXhmcm1fcG9saWN5X2RlbGV0ZSh4cCwgZGlyKTsKKwl4ZnJtX3BvbF9wdXQoeHApOworfQorCisKKy8qIEFsbG9jYXRlIHhmcm1fcG9saWN5LiBOb3QgdXNlZCBoZXJlLCBpdCBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGJ5IHBma2V5djIKKyAqIFNQRCBjYWxscy4KKyAqLworCitzdHJ1Y3QgeGZybV9wb2xpY3kgKnhmcm1fcG9saWN5X2FsbG9jKGludCBnZnApCit7CisJc3RydWN0IHhmcm1fcG9saWN5ICpwb2xpY3k7CisKKwlwb2xpY3kgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgeGZybV9wb2xpY3kpLCBnZnApOworCisJaWYgKHBvbGljeSkgeworCQltZW1zZXQocG9saWN5LCAwLCBzaXplb2Yoc3RydWN0IHhmcm1fcG9saWN5KSk7CisJCWF0b21pY19zZXQoJnBvbGljeS0+cmVmY250LCAxKTsKKwkJcndsb2NrX2luaXQoJnBvbGljeS0+bG9jayk7CisJCWluaXRfdGltZXIoJnBvbGljeS0+dGltZXIpOworCQlwb2xpY3ktPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwb2xpY3k7CisJCXBvbGljeS0+dGltZXIuZnVuY3Rpb24gPSB4ZnJtX3BvbGljeV90aW1lcjsKKwl9CisJcmV0dXJuIHBvbGljeTsKK30KK0VYUE9SVF9TWU1CT0woeGZybV9wb2xpY3lfYWxsb2MpOworCisvKiBEZXN0cm95IHhmcm1fcG9saWN5OiBkZXNjZW5kYW50IHJlc291cmNlcyBtdXN0IGJlIHJlbGVhc2VkIHRvIHRoaXMgbW9tZW50LiAqLworCit2b2lkIF9feGZybV9wb2xpY3lfZGVzdHJveShzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbGljeSkKK3sKKwlpZiAoIXBvbGljeS0+ZGVhZCkKKwkJQlVHKCk7CisKKwlpZiAocG9saWN5LT5idW5kbGVzKQorCQlCVUcoKTsKKworCWlmIChkZWxfdGltZXIoJnBvbGljeS0+dGltZXIpKQorCQlCVUcoKTsKKworCWtmcmVlKHBvbGljeSk7Cit9CitFWFBPUlRfU1lNQk9MKF9feGZybV9wb2xpY3lfZGVzdHJveSk7CisKK3N0YXRpYyB2b2lkIHhmcm1fcG9saWN5X2djX2tpbGwoc3RydWN0IHhmcm1fcG9saWN5ICpwb2xpY3kpCit7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0OworCisJd2hpbGUgKChkc3QgPSBwb2xpY3ktPmJ1bmRsZXMpICE9IE5VTEwpIHsKKwkJcG9saWN5LT5idW5kbGVzID0gZHN0LT5uZXh0OworCQlkc3RfZnJlZShkc3QpOworCX0KKworCWlmIChkZWxfdGltZXIoJnBvbGljeS0+dGltZXIpKQorCQlhdG9taWNfZGVjKCZwb2xpY3ktPnJlZmNudCk7CisKKwlpZiAoYXRvbWljX3JlYWQoJnBvbGljeS0+cmVmY250KSA+IDEpCisJCWZsb3dfY2FjaGVfZmx1c2goKTsKKworCXhmcm1fcG9sX3B1dChwb2xpY3kpOworfQorCitzdGF0aWMgdm9pZCB4ZnJtX3BvbGljeV9nY190YXNrKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHhmcm1fcG9saWN5ICpwb2xpY3k7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICp0bXA7CisJc3RydWN0IGxpc3RfaGVhZCBnY19saXN0ID0gTElTVF9IRUFEX0lOSVQoZ2NfbGlzdCk7CisKKwlzcGluX2xvY2tfYmgoJnhmcm1fcG9saWN5X2djX2xvY2spOworCWxpc3Rfc3BsaWNlX2luaXQoJnhmcm1fcG9saWN5X2djX2xpc3QsICZnY19saXN0KTsKKwlzcGluX3VubG9ja19iaCgmeGZybV9wb2xpY3lfZ2NfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRtcCwgJmdjX2xpc3QpIHsKKwkJcG9saWN5ID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHhmcm1fcG9saWN5LCBsaXN0KTsKKwkJeGZybV9wb2xpY3lfZ2Nfa2lsbChwb2xpY3kpOworCX0KK30KKworLyogUnVsZSBtdXN0IGJlIGxvY2tlZC4gUmVsZWFzZSBkZXNjZW50YW50IHJlc291cmNlcywgYW5ub3VuY2UKKyAqIGVudHJ5IGRlYWQuIFRoZSBydWxlIG11c3QgYmUgdW5saW5rZWQgZnJvbSBsaXN0cyB0byB0aGUgbW9tZW50LgorICovCisKK3N0YXRpYyB2b2lkIHhmcm1fcG9saWN5X2tpbGwoc3RydWN0IHhmcm1fcG9saWN5ICpwb2xpY3kpCit7CisJaW50IGRlYWQ7CisKKwl3cml0ZV9sb2NrX2JoKCZwb2xpY3ktPmxvY2spOworCWRlYWQgPSBwb2xpY3ktPmRlYWQ7CisJcG9saWN5LT5kZWFkID0gMTsKKwl3cml0ZV91bmxvY2tfYmgoJnBvbGljeS0+bG9jayk7CisKKwlpZiAodW5saWtlbHkoZGVhZCkpIHsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9jaygmeGZybV9wb2xpY3lfZ2NfbG9jayk7CisJbGlzdF9hZGQoJnBvbGljeS0+bGlzdCwgJnhmcm1fcG9saWN5X2djX2xpc3QpOworCXNwaW5fdW5sb2NrKCZ4ZnJtX3BvbGljeV9nY19sb2NrKTsKKworCXNjaGVkdWxlX3dvcmsoJnhmcm1fcG9saWN5X2djX3dvcmspOworfQorCisvKiBHZW5lcmF0ZSBuZXcgaW5kZXguLi4gS0FNRSBzZWVtcyB0byBnZW5lcmF0ZSB0aGVtIG9yZGVyZWQgYnkgY29zdAorICogb2YgYW4gYWJzb2x1dGUgaW5wcmVkaWN0YWJpbGl0eSBvZiBvcmRlcmluZyBvZiBydWxlcy4gVGhpcyB3aWxsIG5vdCBwYXNzLiAqLworc3RhdGljIHUzMiB4ZnJtX2dlbl9pbmRleChpbnQgZGlyKQoreworCXUzMiBpZHg7CisJc3RydWN0IHhmcm1fcG9saWN5ICpwOworCXN0YXRpYyB1MzIgaWR4X2dlbmVyYXRvcjsKKworCWZvciAoOzspIHsKKwkJaWR4ID0gKGlkeF9nZW5lcmF0b3IgfCBkaXIpOworCQlpZHhfZ2VuZXJhdG9yICs9IDg7CisJCWlmIChpZHggPT0gMCkKKwkJCWlkeCA9IDg7CisJCWZvciAocCA9IHhmcm1fcG9saWN5X2xpc3RbZGlyXTsgcDsgcCA9IHAtPm5leHQpIHsKKwkJCWlmIChwLT5pbmRleCA9PSBpZHgpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFwKQorCQkJcmV0dXJuIGlkeDsKKwl9Cit9CisKK2ludCB4ZnJtX3BvbGljeV9pbnNlcnQoaW50IGRpciwgc3RydWN0IHhmcm1fcG9saWN5ICpwb2xpY3ksIGludCBleGNsKQoreworCXN0cnVjdCB4ZnJtX3BvbGljeSAqcG9sLCAqKnA7CisJc3RydWN0IHhmcm1fcG9saWN5ICpkZWxwb2wgPSBOVUxMOworCXN0cnVjdCB4ZnJtX3BvbGljeSAqKm5ld3BvcyA9IE5VTEw7CisKKwl3cml0ZV9sb2NrX2JoKCZ4ZnJtX3BvbGljeV9sb2NrKTsKKwlmb3IgKHAgPSAmeGZybV9wb2xpY3lfbGlzdFtkaXJdOyAocG9sPSpwKSE9TlVMTDspIHsKKwkJaWYgKCFkZWxwb2wgJiYgbWVtY21wKCZwb2xpY3ktPnNlbGVjdG9yLCAmcG9sLT5zZWxlY3Rvciwgc2l6ZW9mKHBvbC0+c2VsZWN0b3IpKSA9PSAwKSB7CisJCQlpZiAoZXhjbCkgeworCQkJCXdyaXRlX3VubG9ja19iaCgmeGZybV9wb2xpY3lfbG9jayk7CisJCQkJcmV0dXJuIC1FRVhJU1Q7CisJCQl9CisJCQkqcCA9IHBvbC0+bmV4dDsKKwkJCWRlbHBvbCA9IHBvbDsKKwkJCWlmIChwb2xpY3ktPnByaW9yaXR5ID4gcG9sLT5wcmlvcml0eSkKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChwb2xpY3ktPnByaW9yaXR5ID49IHBvbC0+cHJpb3JpdHkpIHsKKwkJCXAgPSAmcG9sLT5uZXh0OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFuZXdwb3MpCisJCQluZXdwb3MgPSBwOworCQlpZiAoZGVscG9sKQorCQkJYnJlYWs7CisJCXAgPSAmcG9sLT5uZXh0OworCX0KKwlpZiAobmV3cG9zKQorCQlwID0gbmV3cG9zOworCXhmcm1fcG9sX2hvbGQocG9saWN5KTsKKwlwb2xpY3ktPm5leHQgPSAqcDsKKwkqcCA9IHBvbGljeTsKKwlhdG9taWNfaW5jKCZmbG93X2NhY2hlX2dlbmlkKTsKKwlwb2xpY3ktPmluZGV4ID0gZGVscG9sID8gZGVscG9sLT5pbmRleCA6IHhmcm1fZ2VuX2luZGV4KGRpcik7CisJcG9saWN5LT5jdXJsZnQuYWRkX3RpbWUgPSAodW5zaWduZWQgbG9uZyl4dGltZS50dl9zZWM7CisJcG9saWN5LT5jdXJsZnQudXNlX3RpbWUgPSAwOworCWlmICghbW9kX3RpbWVyKCZwb2xpY3ktPnRpbWVyLCBqaWZmaWVzICsgSFopKQorCQl4ZnJtX3BvbF9ob2xkKHBvbGljeSk7CisJd3JpdGVfdW5sb2NrX2JoKCZ4ZnJtX3BvbGljeV9sb2NrKTsKKworCWlmIChkZWxwb2wpIHsKKwkJeGZybV9wb2xpY3lfa2lsbChkZWxwb2wpOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woeGZybV9wb2xpY3lfaW5zZXJ0KTsKKworc3RydWN0IHhmcm1fcG9saWN5ICp4ZnJtX3BvbGljeV9ieXNlbChpbnQgZGlyLCBzdHJ1Y3QgeGZybV9zZWxlY3RvciAqc2VsLAorCQkJCSAgICAgIGludCBkZWxldGUpCit7CisJc3RydWN0IHhmcm1fcG9saWN5ICpwb2wsICoqcDsKKworCXdyaXRlX2xvY2tfYmgoJnhmcm1fcG9saWN5X2xvY2spOworCWZvciAocCA9ICZ4ZnJtX3BvbGljeV9saXN0W2Rpcl07IChwb2w9KnApIT1OVUxMOyBwID0gJnBvbC0+bmV4dCkgeworCQlpZiAobWVtY21wKHNlbCwgJnBvbC0+c2VsZWN0b3IsIHNpemVvZigqc2VsKSkgPT0gMCkgeworCQkJeGZybV9wb2xfaG9sZChwb2wpOworCQkJaWYgKGRlbGV0ZSkKKwkJCQkqcCA9IHBvbC0+bmV4dDsKKwkJCWJyZWFrOworCQl9CisJfQorCXdyaXRlX3VubG9ja19iaCgmeGZybV9wb2xpY3lfbG9jayk7CisKKwlpZiAocG9sICYmIGRlbGV0ZSkgeworCQlhdG9taWNfaW5jKCZmbG93X2NhY2hlX2dlbmlkKTsKKwkJeGZybV9wb2xpY3lfa2lsbChwb2wpOworCX0KKwlyZXR1cm4gcG9sOworfQorRVhQT1JUX1NZTUJPTCh4ZnJtX3BvbGljeV9ieXNlbCk7CisKK3N0cnVjdCB4ZnJtX3BvbGljeSAqeGZybV9wb2xpY3lfYnlpZChpbnQgZGlyLCB1MzIgaWQsIGludCBkZWxldGUpCit7CisJc3RydWN0IHhmcm1fcG9saWN5ICpwb2wsICoqcDsKKworCXdyaXRlX2xvY2tfYmgoJnhmcm1fcG9saWN5X2xvY2spOworCWZvciAocCA9ICZ4ZnJtX3BvbGljeV9saXN0W2lkICYgN107IChwb2w9KnApIT1OVUxMOyBwID0gJnBvbC0+bmV4dCkgeworCQlpZiAocG9sLT5pbmRleCA9PSBpZCkgeworCQkJeGZybV9wb2xfaG9sZChwb2wpOworCQkJaWYgKGRlbGV0ZSkKKwkJCQkqcCA9IHBvbC0+bmV4dDsKKwkJCWJyZWFrOworCQl9CisJfQorCXdyaXRlX3VubG9ja19iaCgmeGZybV9wb2xpY3lfbG9jayk7CisKKwlpZiAocG9sICYmIGRlbGV0ZSkgeworCQlhdG9taWNfaW5jKCZmbG93X2NhY2hlX2dlbmlkKTsKKwkJeGZybV9wb2xpY3lfa2lsbChwb2wpOworCX0KKwlyZXR1cm4gcG9sOworfQorRVhQT1JUX1NZTUJPTCh4ZnJtX3BvbGljeV9ieWlkKTsKKwordm9pZCB4ZnJtX3BvbGljeV9mbHVzaCh2b2lkKQoreworCXN0cnVjdCB4ZnJtX3BvbGljeSAqeHA7CisJaW50IGRpcjsKKworCXdyaXRlX2xvY2tfYmgoJnhmcm1fcG9saWN5X2xvY2spOworCWZvciAoZGlyID0gMDsgZGlyIDwgWEZSTV9QT0xJQ1lfTUFYOyBkaXIrKykgeworCQl3aGlsZSAoKHhwID0geGZybV9wb2xpY3lfbGlzdFtkaXJdKSAhPSBOVUxMKSB7CisJCQl4ZnJtX3BvbGljeV9saXN0W2Rpcl0gPSB4cC0+bmV4dDsKKwkJCXdyaXRlX3VubG9ja19iaCgmeGZybV9wb2xpY3lfbG9jayk7CisKKwkJCXhmcm1fcG9saWN5X2tpbGwoeHApOworCisJCQl3cml0ZV9sb2NrX2JoKCZ4ZnJtX3BvbGljeV9sb2NrKTsKKwkJfQorCX0KKwlhdG9taWNfaW5jKCZmbG93X2NhY2hlX2dlbmlkKTsKKwl3cml0ZV91bmxvY2tfYmgoJnhmcm1fcG9saWN5X2xvY2spOworfQorRVhQT1JUX1NZTUJPTCh4ZnJtX3BvbGljeV9mbHVzaCk7CisKK2ludCB4ZnJtX3BvbGljeV93YWxrKGludCAoKmZ1bmMpKHN0cnVjdCB4ZnJtX3BvbGljeSAqLCBpbnQsIGludCwgdm9pZCopLAorCQkgICAgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHhmcm1fcG9saWN5ICp4cDsKKwlpbnQgZGlyOworCWludCBjb3VudCA9IDA7CisJaW50IGVycm9yID0gMDsKKworCXJlYWRfbG9ja19iaCgmeGZybV9wb2xpY3lfbG9jayk7CisJZm9yIChkaXIgPSAwOyBkaXIgPCAyKlhGUk1fUE9MSUNZX01BWDsgZGlyKyspIHsKKwkJZm9yICh4cCA9IHhmcm1fcG9saWN5X2xpc3RbZGlyXTsgeHA7IHhwID0geHAtPm5leHQpCisJCQljb3VudCsrOworCX0KKworCWlmIChjb3VudCA9PSAwKSB7CisJCWVycm9yID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yIChkaXIgPSAwOyBkaXIgPCAyKlhGUk1fUE9MSUNZX01BWDsgZGlyKyspIHsKKwkJZm9yICh4cCA9IHhmcm1fcG9saWN5X2xpc3RbZGlyXTsgeHA7IHhwID0geHAtPm5leHQpIHsKKwkJCWVycm9yID0gZnVuYyh4cCwgZGlyJVhGUk1fUE9MSUNZX01BWCwgLS1jb3VudCwgZGF0YSk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBvdXQ7CisJCX0KKwl9CisKK291dDoKKwlyZWFkX3VubG9ja19iaCgmeGZybV9wb2xpY3lfbG9jayk7CisJcmV0dXJuIGVycm9yOworfQorRVhQT1JUX1NZTUJPTCh4ZnJtX3BvbGljeV93YWxrKTsKKworLyogRmluZCBwb2xpY3kgdG8gYXBwbHkgdG8gdGhpcyBmbG93LiAqLworCitzdGF0aWMgdm9pZCB4ZnJtX3BvbGljeV9sb29rdXAoc3RydWN0IGZsb3dpICpmbCwgdTE2IGZhbWlseSwgdTggZGlyLAorCQkJICAgICAgIHZvaWQgKipvYmpwLCBhdG9taWNfdCAqKm9ial9yZWZwKQoreworCXN0cnVjdCB4ZnJtX3BvbGljeSAqcG9sOworCisJcmVhZF9sb2NrX2JoKCZ4ZnJtX3BvbGljeV9sb2NrKTsKKwlmb3IgKHBvbCA9IHhmcm1fcG9saWN5X2xpc3RbZGlyXTsgcG9sOyBwb2wgPSBwb2wtPm5leHQpIHsKKwkJc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCA9ICZwb2wtPnNlbGVjdG9yOworCQlpbnQgbWF0Y2g7CisKKwkJaWYgKHBvbC0+ZmFtaWx5ICE9IGZhbWlseSkKKwkJCWNvbnRpbnVlOworCisJCW1hdGNoID0geGZybV9zZWxlY3Rvcl9tYXRjaChzZWwsIGZsLCBmYW1pbHkpOworCQlpZiAobWF0Y2gpIHsKKwkJCXhmcm1fcG9sX2hvbGQocG9sKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJlYWRfdW5sb2NrX2JoKCZ4ZnJtX3BvbGljeV9sb2NrKTsKKwlpZiAoKCpvYmpwID0gKHZvaWQgKikgcG9sKSAhPSBOVUxMKQorCQkqb2JqX3JlZnAgPSAmcG9sLT5yZWZjbnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeGZybV9wb2xpY3kgKnhmcm1fc2tfcG9saWN5X2xvb2t1cChzdHJ1Y3Qgc29jayAqc2ssIGludCBkaXIsIHN0cnVjdCBmbG93aSAqZmwpCit7CisJc3RydWN0IHhmcm1fcG9saWN5ICpwb2w7CisKKwlyZWFkX2xvY2tfYmgoJnhmcm1fcG9saWN5X2xvY2spOworCWlmICgocG9sID0gc2stPnNrX3BvbGljeVtkaXJdKSAhPSBOVUxMKSB7CisJCWludCBtYXRjaCA9IHhmcm1fc2VsZWN0b3JfbWF0Y2goJnBvbC0+c2VsZWN0b3IsIGZsLAorCQkJCQkJc2stPnNrX2ZhbWlseSk7CisJCWlmIChtYXRjaCkKKwkJCXhmcm1fcG9sX2hvbGQocG9sKTsKKwkJZWxzZQorCQkJcG9sID0gTlVMTDsKKwl9CisJcmVhZF91bmxvY2tfYmgoJnhmcm1fcG9saWN5X2xvY2spOworCXJldHVybiBwb2w7Cit9CisKK3N0YXRpYyB2b2lkIF9feGZybV9wb2xpY3lfbGluayhzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbCwgaW50IGRpcikKK3sKKwlwb2wtPm5leHQgPSB4ZnJtX3BvbGljeV9saXN0W2Rpcl07CisJeGZybV9wb2xpY3lfbGlzdFtkaXJdID0gcG9sOworCXhmcm1fcG9sX2hvbGQocG9sKTsKK30KKworc3RhdGljIHN0cnVjdCB4ZnJtX3BvbGljeSAqX194ZnJtX3BvbGljeV91bmxpbmsoc3RydWN0IHhmcm1fcG9saWN5ICpwb2wsCisJCQkJCQlpbnQgZGlyKQoreworCXN0cnVjdCB4ZnJtX3BvbGljeSAqKnBvbHA7CisKKwlmb3IgKHBvbHAgPSAmeGZybV9wb2xpY3lfbGlzdFtkaXJdOworCSAgICAgKnBvbHAgIT0gTlVMTDsgcG9scCA9ICYoKnBvbHApLT5uZXh0KSB7CisJCWlmICgqcG9scCA9PSBwb2wpIHsKKwkJCSpwb2xwID0gcG9sLT5uZXh0OworCQkJcmV0dXJuIHBvbDsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCB4ZnJtX3BvbGljeV9kZWxldGUoc3RydWN0IHhmcm1fcG9saWN5ICpwb2wsIGludCBkaXIpCit7CisJd3JpdGVfbG9ja19iaCgmeGZybV9wb2xpY3lfbG9jayk7CisJcG9sID0gX194ZnJtX3BvbGljeV91bmxpbmsocG9sLCBkaXIpOworCXdyaXRlX3VubG9ja19iaCgmeGZybV9wb2xpY3lfbG9jayk7CisJaWYgKHBvbCkgeworCQlpZiAoZGlyIDwgWEZSTV9QT0xJQ1lfTUFYKQorCQkJYXRvbWljX2luYygmZmxvd19jYWNoZV9nZW5pZCk7CisJCXhmcm1fcG9saWN5X2tpbGwocG9sKTsKKwl9Cit9CisKK2ludCB4ZnJtX3NrX3BvbGljeV9pbnNlcnQoc3RydWN0IHNvY2sgKnNrLCBpbnQgZGlyLCBzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbCkKK3sKKwlzdHJ1Y3QgeGZybV9wb2xpY3kgKm9sZF9wb2w7CisKKwl3cml0ZV9sb2NrX2JoKCZ4ZnJtX3BvbGljeV9sb2NrKTsKKwlvbGRfcG9sID0gc2stPnNrX3BvbGljeVtkaXJdOworCXNrLT5za19wb2xpY3lbZGlyXSA9IHBvbDsKKwlpZiAocG9sKSB7CisJCXBvbC0+Y3VybGZ0LmFkZF90aW1lID0gKHVuc2lnbmVkIGxvbmcpeHRpbWUudHZfc2VjOworCQlwb2wtPmluZGV4ID0geGZybV9nZW5faW5kZXgoWEZSTV9QT0xJQ1lfTUFYK2Rpcik7CisJCV9feGZybV9wb2xpY3lfbGluayhwb2wsIFhGUk1fUE9MSUNZX01BWCtkaXIpOworCX0KKwlpZiAob2xkX3BvbCkKKwkJX194ZnJtX3BvbGljeV91bmxpbmsob2xkX3BvbCwgWEZSTV9QT0xJQ1lfTUFYK2Rpcik7CisJd3JpdGVfdW5sb2NrX2JoKCZ4ZnJtX3BvbGljeV9sb2NrKTsKKworCWlmIChvbGRfcG9sKSB7CisJCXhmcm1fcG9saWN5X2tpbGwob2xkX3BvbCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHhmcm1fcG9saWN5ICpjbG9uZV9wb2xpY3koc3RydWN0IHhmcm1fcG9saWN5ICpvbGQsIGludCBkaXIpCit7CisJc3RydWN0IHhmcm1fcG9saWN5ICpuZXdwID0geGZybV9wb2xpY3lfYWxsb2MoR0ZQX0FUT01JQyk7CisKKwlpZiAobmV3cCkgeworCQluZXdwLT5zZWxlY3RvciA9IG9sZC0+c2VsZWN0b3I7CisJCW5ld3AtPmxmdCA9IG9sZC0+bGZ0OworCQluZXdwLT5jdXJsZnQgPSBvbGQtPmN1cmxmdDsKKwkJbmV3cC0+YWN0aW9uID0gb2xkLT5hY3Rpb247CisJCW5ld3AtPmZsYWdzID0gb2xkLT5mbGFnczsKKwkJbmV3cC0+eGZybV9uciA9IG9sZC0+eGZybV9ucjsKKwkJbmV3cC0+aW5kZXggPSBvbGQtPmluZGV4OworCQltZW1jcHkobmV3cC0+eGZybV92ZWMsIG9sZC0+eGZybV92ZWMsCisJCSAgICAgICBuZXdwLT54ZnJtX25yKnNpemVvZihzdHJ1Y3QgeGZybV90bXBsKSk7CisJCXdyaXRlX2xvY2tfYmgoJnhmcm1fcG9saWN5X2xvY2spOworCQlfX3hmcm1fcG9saWN5X2xpbmsobmV3cCwgWEZSTV9QT0xJQ1lfTUFYK2Rpcik7CisJCXdyaXRlX3VubG9ja19iaCgmeGZybV9wb2xpY3lfbG9jayk7CisJCXhmcm1fcG9sX3B1dChuZXdwKTsKKwl9CisJcmV0dXJuIG5ld3A7Cit9CisKK2ludCBfX3hmcm1fc2tfY2xvbmVfcG9saWN5KHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgeGZybV9wb2xpY3kgKnAwID0gc2stPnNrX3BvbGljeVswXSwKKwkJCSAgICpwMSA9IHNrLT5za19wb2xpY3lbMV07CisKKwlzay0+c2tfcG9saWN5WzBdID0gc2stPnNrX3BvbGljeVsxXSA9IE5VTEw7CisJaWYgKHAwICYmIChzay0+c2tfcG9saWN5WzBdID0gY2xvbmVfcG9saWN5KHAwLCAwKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKHAxICYmIChzay0+c2tfcG9saWN5WzFdID0gY2xvbmVfcG9saWN5KHAxLCAxKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKKy8qIFJlc29sdmUgbGlzdCBvZiB0ZW1wbGF0ZXMgZm9yIHRoZSBmbG93LCBnaXZlbiBwb2xpY3kuICovCisKK3N0YXRpYyBpbnQKK3hmcm1fdG1wbF9yZXNvbHZlKHN0cnVjdCB4ZnJtX3BvbGljeSAqcG9saWN5LCBzdHJ1Y3QgZmxvd2kgKmZsLAorCQkgIHN0cnVjdCB4ZnJtX3N0YXRlICoqeGZybSwKKwkJICB1bnNpZ25lZCBzaG9ydCBmYW1pbHkpCit7CisJaW50IG54OworCWludCBpLCBlcnJvcjsKKwl4ZnJtX2FkZHJlc3NfdCAqZGFkZHIgPSB4ZnJtX2Zsb3dpX2RhZGRyKGZsLCBmYW1pbHkpOworCXhmcm1fYWRkcmVzc190ICpzYWRkciA9IHhmcm1fZmxvd2lfc2FkZHIoZmwsIGZhbWlseSk7CisKKwlmb3IgKG54PTAsIGkgPSAwOyBpIDwgcG9saWN5LT54ZnJtX25yOyBpKyspIHsKKwkJc3RydWN0IHhmcm1fc3RhdGUgKng7CisJCXhmcm1fYWRkcmVzc190ICpyZW1vdGUgPSBkYWRkcjsKKwkJeGZybV9hZGRyZXNzX3QgKmxvY2FsICA9IHNhZGRyOworCQlzdHJ1Y3QgeGZybV90bXBsICp0bXBsID0gJnBvbGljeS0+eGZybV92ZWNbaV07CisKKwkJaWYgKHRtcGwtPm1vZGUpIHsKKwkJCXJlbW90ZSA9ICZ0bXBsLT5pZC5kYWRkcjsKKwkJCWxvY2FsID0gJnRtcGwtPnNhZGRyOworCQl9CisKKwkJeCA9IHhmcm1fc3RhdGVfZmluZChyZW1vdGUsIGxvY2FsLCBmbCwgdG1wbCwgcG9saWN5LCAmZXJyb3IsIGZhbWlseSk7CisKKwkJaWYgKHggJiYgeC0+a20uc3RhdGUgPT0gWEZSTV9TVEFURV9WQUxJRCkgeworCQkJeGZybVtueCsrXSA9IHg7CisJCQlkYWRkciA9IHJlbW90ZTsKKwkJCXNhZGRyID0gbG9jYWw7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoeCkgeworCQkJZXJyb3IgPSAoeC0+a20uc3RhdGUgPT0gWEZSTV9TVEFURV9FUlJPUiA/CisJCQkJIC1FSU5WQUwgOiAtRUFHQUlOKTsKKwkJCXhmcm1fc3RhdGVfcHV0KHgpOworCQl9CisKKwkJaWYgKCF0bXBsLT5vcHRpb25hbCkKKwkJCWdvdG8gZmFpbDsKKwl9CisJcmV0dXJuIG54OworCitmYWlsOgorCWZvciAobngtLTsgbng+PTA7IG54LS0pCisJCXhmcm1fc3RhdGVfcHV0KHhmcm1bbnhdKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qIENoZWNrIHRoYXQgdGhlIGJ1bmRsZSBhY2NlcHRzIHRoZSBmbG93IGFuZCBpdHMgY29tcG9uZW50cyBhcmUKKyAqIHN0aWxsIHZhbGlkLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgZHN0X2VudHJ5ICoKK3hmcm1fZmluZF9idW5kbGUoc3RydWN0IGZsb3dpICpmbCwgc3RydWN0IHhmcm1fcG9saWN5ICpwb2xpY3ksIHVuc2lnbmVkIHNob3J0IGZhbWlseSkKK3sKKwlzdHJ1Y3QgZHN0X2VudHJ5ICp4OworCXN0cnVjdCB4ZnJtX3BvbGljeV9hZmluZm8gKmFmaW5mbyA9IHhmcm1fcG9saWN5X2dldF9hZmluZm8oZmFtaWx5KTsKKwlpZiAodW5saWtlbHkoYWZpbmZvID09IE5VTEwpKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl4ID0gYWZpbmZvLT5maW5kX2J1bmRsZShmbCwgcG9saWN5KTsKKwl4ZnJtX3BvbGljeV9wdXRfYWZpbmZvKGFmaW5mbyk7CisJcmV0dXJuIHg7Cit9CisKKy8qIEFsbG9jYXRlIGNoYWluIG9mIGRzdF9lbnRyeSdzLCBhdHRhY2gga25vd24geGZybSdzLCBjYWxjdWxhdGUKKyAqIGFsbCB0aGUgbWV0cmljcy4uLiBTaG9ydGx5LCBidW5kbGUgYSBidW5kbGUuCisgKi8KKworc3RhdGljIGludAoreGZybV9idW5kbGVfY3JlYXRlKHN0cnVjdCB4ZnJtX3BvbGljeSAqcG9saWN5LCBzdHJ1Y3QgeGZybV9zdGF0ZSAqKnhmcm0sIGludCBueCwKKwkJICAgc3RydWN0IGZsb3dpICpmbCwgc3RydWN0IGRzdF9lbnRyeSAqKmRzdF9wLAorCQkgICB1bnNpZ25lZCBzaG9ydCBmYW1pbHkpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgeGZybV9wb2xpY3lfYWZpbmZvICphZmluZm8gPSB4ZnJtX3BvbGljeV9nZXRfYWZpbmZvKGZhbWlseSk7CisJaWYgKHVubGlrZWx5KGFmaW5mbyA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZXJyID0gYWZpbmZvLT5idW5kbGVfY3JlYXRlKHBvbGljeSwgeGZybSwgbngsIGZsLCBkc3RfcCk7CisJeGZybV9wb2xpY3lfcHV0X2FmaW5mbyhhZmluZm8pOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBvbGljeV90b19mbG93X2RpcihpbnQgZGlyKQoreworCWlmIChYRlJNX1BPTElDWV9JTiA9PSBGTE9XX0RJUl9JTiAmJgorCSAgICBYRlJNX1BPTElDWV9PVVQgPT0gRkxPV19ESVJfT1VUICYmCisJICAgIFhGUk1fUE9MSUNZX0ZXRCA9PSBGTE9XX0RJUl9GV0QpCisJCXJldHVybiBkaXI7CisJc3dpdGNoIChkaXIpIHsKKwlkZWZhdWx0OgorCWNhc2UgWEZSTV9QT0xJQ1lfSU46CisJCXJldHVybiBGTE9XX0RJUl9JTjsKKwljYXNlIFhGUk1fUE9MSUNZX09VVDoKKwkJcmV0dXJuIEZMT1dfRElSX09VVDsKKwljYXNlIFhGUk1fUE9MSUNZX0ZXRDoKKwkJcmV0dXJuIEZMT1dfRElSX0ZXRDsKKwl9OworfQorCitzdGF0aWMgaW50IHN0YWxlX2J1bmRsZShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpOworCisvKiBNYWluIGZ1bmN0aW9uOiBmaW5kcy9jcmVhdGVzIGEgYnVuZGxlIGZvciBnaXZlbiBmbG93LgorICoKKyAqIEF0IHRoZSBtb21lbnQgd2UgZWF0IGEgcmF3IElQIHJvdXRlLiBNb3N0bHkgdG8gc3BlZWQgdXAgbG9va3VwcworICogb24gaW50ZXJmYWNlcyB3aXRoIGRpc2FibGVkIElQc2VjLgorICovCitpbnQgeGZybV9sb29rdXAoc3RydWN0IGRzdF9lbnRyeSAqKmRzdF9wLCBzdHJ1Y3QgZmxvd2kgKmZsLAorCQlzdHJ1Y3Qgc29jayAqc2ssIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbGljeTsKKwlzdHJ1Y3QgeGZybV9zdGF0ZSAqeGZybVtYRlJNX01BWF9ERVBUSF07CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0LCAqZHN0X29yaWcgPSAqZHN0X3A7CisJaW50IG54ID0gMDsKKwlpbnQgZXJyOworCXUzMiBnZW5pZDsKKwl1MTYgZmFtaWx5ID0gZHN0X29yaWctPm9wcy0+ZmFtaWx5OworcmVzdGFydDoKKwlnZW5pZCA9IGF0b21pY19yZWFkKCZmbG93X2NhY2hlX2dlbmlkKTsKKwlwb2xpY3kgPSBOVUxMOworCWlmIChzayAmJiBzay0+c2tfcG9saWN5WzFdKQorCQlwb2xpY3kgPSB4ZnJtX3NrX3BvbGljeV9sb29rdXAoc2ssIFhGUk1fUE9MSUNZX09VVCwgZmwpOworCisJaWYgKCFwb2xpY3kpIHsKKwkJLyogVG8gYWNjZWxlcmF0ZSBhIGJpdC4uLiAgKi8KKwkJaWYgKChkc3Rfb3JpZy0+ZmxhZ3MgJiBEU1RfTk9YRlJNKSB8fCAheGZybV9wb2xpY3lfbGlzdFtYRlJNX1BPTElDWV9PVVRdKQorCQkJcmV0dXJuIDA7CisKKwkJcG9saWN5ID0gZmxvd19jYWNoZV9sb29rdXAoZmwsIGZhbWlseSwKKwkJCQkJICAgcG9saWN5X3RvX2Zsb3dfZGlyKFhGUk1fUE9MSUNZX09VVCksCisJCQkJCSAgIHhmcm1fcG9saWN5X2xvb2t1cCk7CisJfQorCisJaWYgKCFwb2xpY3kpCisJCXJldHVybiAwOworCisJcG9saWN5LT5jdXJsZnQudXNlX3RpbWUgPSAodW5zaWduZWQgbG9uZyl4dGltZS50dl9zZWM7CisKKwlzd2l0Y2ggKHBvbGljeS0+YWN0aW9uKSB7CisJY2FzZSBYRlJNX1BPTElDWV9CTE9DSzoKKwkJLyogUHJvaGliaXQgdGhlIGZsb3cgKi8KKwkJeGZybV9wb2xfcHV0KHBvbGljeSk7CisJCXJldHVybiAtRVBFUk07CisKKwljYXNlIFhGUk1fUE9MSUNZX0FMTE9XOgorCQlpZiAocG9saWN5LT54ZnJtX25yID09IDApIHsKKwkJCS8qIEZsb3cgcGFzc2VzIG5vdCB0cmFuc2Zvcm1lZC4gKi8KKwkJCXhmcm1fcG9sX3B1dChwb2xpY3kpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBUcnkgdG8gZmluZCBtYXRjaGluZyBidW5kbGUuCisJCSAqCisJCSAqIExBVEVSOiBoZWxwIGZyb20gZmxvdyBjYWNoZS4gSXQgaXMgb3B0aW9uYWwsIHRoaXMKKwkJICogaXMgcmVxdWlyZWQgb25seSBmb3Igb3V0cHV0IHBvbGljeS4KKwkJICovCisJCWRzdCA9IHhmcm1fZmluZF9idW5kbGUoZmwsIHBvbGljeSwgZmFtaWx5KTsKKwkJaWYgKElTX0VSUihkc3QpKSB7CisJCQl4ZnJtX3BvbF9wdXQocG9saWN5KTsKKwkJCXJldHVybiBQVFJfRVJSKGRzdCk7CisJCX0KKworCQlpZiAoZHN0KQorCQkJYnJlYWs7CisKKwkJbnggPSB4ZnJtX3RtcGxfcmVzb2x2ZShwb2xpY3ksIGZsLCB4ZnJtLCBmYW1pbHkpOworCisJCWlmICh1bmxpa2VseShueDwwKSkgeworCQkJZXJyID0gbng7CisJCQlpZiAoZXJyID09IC1FQUdBSU4gJiYgZmxhZ3MpIHsKKwkJCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCQkJCWFkZF93YWl0X3F1ZXVlKCZrbV93YWl0cSwgJndhaXQpOworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQkJc2NoZWR1bGUoKTsKKwkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZrbV93YWl0cSwgJndhaXQpOworCisJCQkJbnggPSB4ZnJtX3RtcGxfcmVzb2x2ZShwb2xpY3ksIGZsLCB4ZnJtLCBmYW1pbHkpOworCisJCQkJaWYgKG54ID09IC1FQUdBSU4gJiYgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQkJZXJyID0gLUVSRVNUQVJUOworCQkJCQlnb3RvIGVycm9yOworCQkJCX0KKwkJCQlpZiAobnggPT0gLUVBR0FJTiB8fAorCQkJCSAgICBnZW5pZCAhPSBhdG9taWNfcmVhZCgmZmxvd19jYWNoZV9nZW5pZCkpIHsKKwkJCQkJeGZybV9wb2xfcHV0KHBvbGljeSk7CisJCQkJCWdvdG8gcmVzdGFydDsKKwkJCQl9CisJCQkJZXJyID0gbng7CisJCQl9CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQl9CisJCWlmIChueCA9PSAwKSB7CisJCQkvKiBGbG93IHBhc3NlcyBub3QgdHJhbnNmb3JtZWQuICovCisJCQl4ZnJtX3BvbF9wdXQocG9saWN5KTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJZHN0ID0gZHN0X29yaWc7CisJCWVyciA9IHhmcm1fYnVuZGxlX2NyZWF0ZShwb2xpY3ksIHhmcm0sIG54LCBmbCwgJmRzdCwgZmFtaWx5KTsKKworCQlpZiAodW5saWtlbHkoZXJyKSkgeworCQkJaW50IGk7CisJCQlmb3IgKGk9MDsgaTxueDsgaSsrKQorCQkJCXhmcm1fc3RhdGVfcHV0KHhmcm1baV0pOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCXdyaXRlX2xvY2tfYmgoJnBvbGljeS0+bG9jayk7CisJCWlmICh1bmxpa2VseShwb2xpY3ktPmRlYWQgfHwgc3RhbGVfYnVuZGxlKGRzdCkpKSB7CisJCQkvKiBXb3chIFdoaWxlIHdlIHdvcmtlZCBvbiByZXNvbHZpbmcsIHRoaXMKKwkJCSAqIHBvbGljeSBoYXMgZ29uZS4gUmV0cnkuIEl0IGlzIG5vdCBwYXJhbm9pYSwKKwkJCSAqIHdlIGp1c3QgY2Fubm90IGVubGlzdCBuZXcgYnVuZGxlIHRvIGRlYWQgb2JqZWN0LgorCQkJICogV2UgY2FuJ3QgZW5saXN0IHN0YWJsZSBidW5kbGVzIGVpdGhlci4KKwkJCSAqLworCQkJd3JpdGVfdW5sb2NrX2JoKCZwb2xpY3ktPmxvY2spOworCisJCQl4ZnJtX3BvbF9wdXQocG9saWN5KTsKKwkJCWlmIChkc3QpCisJCQkJZHN0X2ZyZWUoZHN0KTsKKwkJCWdvdG8gcmVzdGFydDsKKwkJfQorCQlkc3QtPm5leHQgPSBwb2xpY3ktPmJ1bmRsZXM7CisJCXBvbGljeS0+YnVuZGxlcyA9IGRzdDsKKwkJZHN0X2hvbGQoZHN0KTsKKwkJd3JpdGVfdW5sb2NrX2JoKCZwb2xpY3ktPmxvY2spOworCX0KKwkqZHN0X3AgPSBkc3Q7CisJZHN0X3JlbGVhc2UoZHN0X29yaWcpOworCXhmcm1fcG9sX3B1dChwb2xpY3kpOworCXJldHVybiAwOworCitlcnJvcjoKKwlkc3RfcmVsZWFzZShkc3Rfb3JpZyk7CisJeGZybV9wb2xfcHV0KHBvbGljeSk7CisJKmRzdF9wID0gTlVMTDsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTCh4ZnJtX2xvb2t1cCk7CisKKy8qIFdoZW4gc2tiIGlzIHRyYW5zZm9ybWVkIGJhY2sgdG8gaXRzICJuYXRpdmUiIGZvcm0sIHdlIGhhdmUgdG8KKyAqIGNoZWNrIHBvbGljeSByZXN0cmljdGlvbnMuIEF0IHRoZSBtb21lbnQgd2UgbWFrZSB0aGlzIGluIG1heGltYWxseQorICogc3R1cGlkIHdheS4gU2hhbWUgb24gbWUuIDotKSBPZiBjb3Vyc2UsIGNvbm5lY3RlZCBzb2NrZXRzIG11c3QKKyAqIGhhdmUgcG9saWN5IGNhY2hlZCBhdCB0aGVtLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50Cit4ZnJtX3N0YXRlX29rKHN0cnVjdCB4ZnJtX3RtcGwgKnRtcGwsIHN0cnVjdCB4ZnJtX3N0YXRlICp4LCAKKwkgICAgICB1bnNpZ25lZCBzaG9ydCBmYW1pbHkpCit7CisJaWYgKHhmcm1fc3RhdGVfa2Vybih4KSkKKwkJcmV0dXJuIHRtcGwtPm9wdGlvbmFsICYmICF4ZnJtX3N0YXRlX2FkZHJfY21wKHRtcGwsIHgsIGZhbWlseSk7CisJcmV0dXJuCXgtPmlkLnByb3RvID09IHRtcGwtPmlkLnByb3RvICYmCisJCSh4LT5pZC5zcGkgPT0gdG1wbC0+aWQuc3BpIHx8ICF0bXBsLT5pZC5zcGkpICYmCisJCSh4LT5wcm9wcy5yZXFpZCA9PSB0bXBsLT5yZXFpZCB8fCAhdG1wbC0+cmVxaWQpICYmCisJCXgtPnByb3BzLm1vZGUgPT0gdG1wbC0+bW9kZSAmJgorCQkodG1wbC0+YWFsZ29zICYgKDE8PHgtPnByb3BzLmFhbGdvKSkgJiYKKwkJISh4LT5wcm9wcy5tb2RlICYmIHhmcm1fc3RhdGVfYWRkcl9jbXAodG1wbCwgeCwgZmFtaWx5KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cit4ZnJtX3BvbGljeV9vayhzdHJ1Y3QgeGZybV90bXBsICp0bXBsLCBzdHJ1Y3Qgc2VjX3BhdGggKnNwLCBpbnQgc3RhcnQsCisJICAgICAgIHVuc2lnbmVkIHNob3J0IGZhbWlseSkKK3sKKwlpbnQgaWR4ID0gc3RhcnQ7CisKKwlpZiAodG1wbC0+b3B0aW9uYWwpIHsKKwkJaWYgKCF0bXBsLT5tb2RlKQorCQkJcmV0dXJuIHN0YXJ0OworCX0gZWxzZQorCQlzdGFydCA9IC0xOworCWZvciAoOyBpZHggPCBzcC0+bGVuOyBpZHgrKykgeworCQlpZiAoeGZybV9zdGF0ZV9vayh0bXBsLCBzcC0+eFtpZHhdLnh2ZWMsIGZhbWlseSkpCisJCQlyZXR1cm4gKytpZHg7CisJCWlmIChzcC0+eFtpZHhdLnh2ZWMtPnByb3BzLm1vZGUpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIHN0YXJ0OworfQorCitzdGF0aWMgaW50CitfZGVjb2RlX3Nlc3Npb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGZsb3dpICpmbCwgdW5zaWduZWQgc2hvcnQgZmFtaWx5KQoreworCXN0cnVjdCB4ZnJtX3BvbGljeV9hZmluZm8gKmFmaW5mbyA9IHhmcm1fcG9saWN5X2dldF9hZmluZm8oZmFtaWx5KTsKKworCWlmICh1bmxpa2VseShhZmluZm8gPT0gTlVMTCkpCisJCXJldHVybiAtRUFGTk9TVVBQT1JUOworCisJYWZpbmZvLT5kZWNvZGVfc2Vzc2lvbihza2IsIGZsKTsKKwl4ZnJtX3BvbGljeV9wdXRfYWZpbmZvKGFmaW5mbyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNlY3BhdGhfaGFzX3R1bm5lbChzdHJ1Y3Qgc2VjX3BhdGggKnNwLCBpbnQgaykKK3sKKwlmb3IgKDsgayA8IHNwLT5sZW47IGsrKykgeworCQlpZiAoc3AtPnhba10ueHZlYy0+cHJvcHMubW9kZSkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgX194ZnJtX3BvbGljeV9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIGludCBkaXIsIHN0cnVjdCBza19idWZmICpza2IsIAorCQkJdW5zaWduZWQgc2hvcnQgZmFtaWx5KQoreworCXN0cnVjdCB4ZnJtX3BvbGljeSAqcG9sOworCXN0cnVjdCBmbG93aSBmbDsKKworCWlmIChfZGVjb2RlX3Nlc3Npb24oc2tiLCAmZmwsIGZhbWlseSkgPCAwKQorCQlyZXR1cm4gMDsKKworCS8qIEZpcnN0LCBjaGVjayB1c2VkIFNBIGFnYWluc3QgdGhlaXIgc2VsZWN0b3JzLiAqLworCWlmIChza2ItPnNwKSB7CisJCWludCBpOworCisJCWZvciAoaT1za2ItPnNwLT5sZW4tMTsgaT49MDsgaS0tKSB7CisJCSAgc3RydWN0IHNlY19kZWNhcF9zdGF0ZSAqeHZlYyA9ICYoc2tiLT5zcC0+eFtpXSk7CisJCQlpZiAoIXhmcm1fc2VsZWN0b3JfbWF0Y2goJnh2ZWMtPnh2ZWMtPnNlbCwgJmZsLCBmYW1pbHkpKQorCQkJCXJldHVybiAwOworCisJCQkvKiBJZiB0aGVyZSBpcyBhIHBvc3RfaW5wdXQgcHJvY2Vzc29yLCB0cnkgcnVubmluZyBpdCAqLworCQkJaWYgKHh2ZWMtPnh2ZWMtPnR5cGUtPnBvc3RfaW5wdXQgJiYKKwkJCSAgICAoeHZlYy0+eHZlYy0+dHlwZS0+cG9zdF9pbnB1dCkoeHZlYy0+eHZlYywKKwkJCQkJCQkgICAmKHh2ZWMtPmRlY2FwKSwKKwkJCQkJCQkgICBza2IpICE9IDApCisJCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlwb2wgPSBOVUxMOworCWlmIChzayAmJiBzay0+c2tfcG9saWN5W2Rpcl0pCisJCXBvbCA9IHhmcm1fc2tfcG9saWN5X2xvb2t1cChzaywgZGlyLCAmZmwpOworCisJaWYgKCFwb2wpCisJCXBvbCA9IGZsb3dfY2FjaGVfbG9va3VwKCZmbCwgZmFtaWx5LAorCQkJCQlwb2xpY3lfdG9fZmxvd19kaXIoZGlyKSwKKwkJCQkJeGZybV9wb2xpY3lfbG9va3VwKTsKKworCWlmICghcG9sKQorCQlyZXR1cm4gIXNrYi0+c3AgfHwgIXNlY3BhdGhfaGFzX3R1bm5lbChza2ItPnNwLCAwKTsKKworCXBvbC0+Y3VybGZ0LnVzZV90aW1lID0gKHVuc2lnbmVkIGxvbmcpeHRpbWUudHZfc2VjOworCisJaWYgKHBvbC0+YWN0aW9uID09IFhGUk1fUE9MSUNZX0FMTE9XKSB7CisJCXN0cnVjdCBzZWNfcGF0aCAqc3A7CisJCXN0YXRpYyBzdHJ1Y3Qgc2VjX3BhdGggZHVtbXk7CisJCWludCBpLCBrOworCisJCWlmICgoc3AgPSBza2ItPnNwKSA9PSBOVUxMKQorCQkJc3AgPSAmZHVtbXk7CisKKwkJLyogRm9yIGVhY2ggdHVubmVsIHhmcm0sIGZpbmQgdGhlIGZpcnN0IG1hdGNoaW5nIHRtcGwuCisJCSAqIEZvciBlYWNoIHRtcGwgYmVmb3JlIHRoYXQsIGZpbmQgY29ycmVzcG9uZGluZyB4ZnJtLgorCQkgKiBPcmRlciBpcyBfaW1wb3J0YW50Xy4gTGF0ZXIgd2Ugd2lsbCBpbXBsZW1lbnQKKwkJICogc29tZSBiYXJyaWVycywgYnV0IGF0IHRoZSBtb21lbnQgYmFycmllcnMKKwkJICogYXJlIGltcGxpZWQgYmV0d2VlbiBlYWNoIHR3byB0cmFuc2Zvcm1hdGlvbnMuCisJCSAqLworCQlmb3IgKGkgPSBwb2wtPnhmcm1fbnItMSwgayA9IDA7IGkgPj0gMDsgaS0tKSB7CisJCQlrID0geGZybV9wb2xpY3lfb2socG9sLT54ZnJtX3ZlYytpLCBzcCwgaywgZmFtaWx5KTsKKwkJCWlmIChrIDwgMCkKKwkJCQlnb3RvIHJlamVjdDsKKwkJfQorCisJCWlmIChzZWNwYXRoX2hhc190dW5uZWwoc3AsIGspKQorCQkJZ290byByZWplY3Q7CisKKwkJeGZybV9wb2xfcHV0KHBvbCk7CisJCXJldHVybiAxOworCX0KKworcmVqZWN0OgorCXhmcm1fcG9sX3B1dChwb2wpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChfX3hmcm1fcG9saWN5X2NoZWNrKTsKKworaW50IF9feGZybV9yb3V0ZV9mb3J3YXJkKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIHNob3J0IGZhbWlseSkKK3sKKwlzdHJ1Y3QgZmxvd2kgZmw7CisKKwlpZiAoX2RlY29kZV9zZXNzaW9uKHNrYiwgJmZsLCBmYW1pbHkpIDwgMCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4geGZybV9sb29rdXAoJnNrYi0+ZHN0LCAmZmwsIE5VTEwsIDApID09IDA7Cit9CitFWFBPUlRfU1lNQk9MKF9feGZybV9yb3V0ZV9mb3J3YXJkKTsKKworLyogT3B0aW1pemUgbGF0ZXIgdXNpbmcgY29va2llcyBhbmQgZ2VuZXJhdGlvbiBpZHMuICovCisKK3N0YXRpYyBzdHJ1Y3QgZHN0X2VudHJ5ICp4ZnJtX2RzdF9jaGVjayhzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHUzMiBjb29raWUpCit7CisJaWYgKCFzdGFsZV9idW5kbGUoZHN0KSkKKwkJcmV0dXJuIGRzdDsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHN0YWxlX2J1bmRsZShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCit7CisJcmV0dXJuICF4ZnJtX2J1bmRsZV9vaygoc3RydWN0IHhmcm1fZHN0ICopZHN0LCBOVUxMLCBBRl9VTlNQRUMpOworfQorCitzdGF0aWMgdm9pZCB4ZnJtX2RzdF9kZXN0cm95KHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKK3sKKwlzdHJ1Y3QgeGZybV9kc3QgKnhkc3QgPSAoc3RydWN0IHhmcm1fZHN0ICopZHN0OworCisJZHN0X3JlbGVhc2UoeGRzdC0+cm91dGUpOworCisJaWYgKCFkc3QtPnhmcm0pCisJCXJldHVybjsKKwl4ZnJtX3N0YXRlX3B1dChkc3QtPnhmcm0pOworCWRzdC0+eGZybSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHhmcm1fZHN0X2lmZG93bihzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgaW50IHVucmVnaXN0ZXIpCit7CisJaWYgKCF1bnJlZ2lzdGVyKQorCQlyZXR1cm47CisKKwl3aGlsZSAoKGRzdCA9IGRzdC0+Y2hpbGQpICYmIGRzdC0+eGZybSAmJiBkc3QtPmRldiA9PSBkZXYpIHsKKwkJZHN0LT5kZXYgPSAmbG9vcGJhY2tfZGV2OworCQlkZXZfaG9sZCgmbG9vcGJhY2tfZGV2KTsKKwkJZGV2X3B1dChkZXYpOworCX0KK30KKworc3RhdGljIHZvaWQgeGZybV9saW5rX2ZhaWx1cmUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKiBJbXBvc3NpYmxlLiBTdWNoIGRzdCBtdXN0IGJlIHBvcHBlZCBiZWZvcmUgcmVhY2hlcyBwb2ludCBvZiBmYWlsdXJlLiAqLworCXJldHVybjsKK30KKworc3RhdGljIHN0cnVjdCBkc3RfZW50cnkgKnhmcm1fbmVnYXRpdmVfYWR2aWNlKHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKK3sKKwlpZiAoZHN0KSB7CisJCWlmIChkc3QtPm9ic29sZXRlKSB7CisJCQlkc3RfcmVsZWFzZShkc3QpOworCQkJZHN0ID0gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gZHN0OworfQorCitzdGF0aWMgdm9pZCB4ZnJtX3BydW5lX2J1bmRsZXMoaW50ICgqZnVuYykoc3RydWN0IGRzdF9lbnRyeSAqKSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbDsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsICoqZHN0cCwgKmdjX2xpc3QgPSBOVUxMOworCisJcmVhZF9sb2NrX2JoKCZ4ZnJtX3BvbGljeV9sb2NrKTsKKwlmb3IgKGk9MDsgaTwyKlhGUk1fUE9MSUNZX01BWDsgaSsrKSB7CisJCWZvciAocG9sID0geGZybV9wb2xpY3lfbGlzdFtpXTsgcG9sOyBwb2wgPSBwb2wtPm5leHQpIHsKKwkJCXdyaXRlX2xvY2soJnBvbC0+bG9jayk7CisJCQlkc3RwID0gJnBvbC0+YnVuZGxlczsKKwkJCXdoaWxlICgoZHN0PSpkc3RwKSAhPSBOVUxMKSB7CisJCQkJaWYgKGZ1bmMoZHN0KSkgeworCQkJCQkqZHN0cCA9IGRzdC0+bmV4dDsKKwkJCQkJZHN0LT5uZXh0ID0gZ2NfbGlzdDsKKwkJCQkJZ2NfbGlzdCA9IGRzdDsKKwkJCQl9IGVsc2UgeworCQkJCQlkc3RwID0gJmRzdC0+bmV4dDsKKwkJCQl9CisJCQl9CisJCQl3cml0ZV91bmxvY2soJnBvbC0+bG9jayk7CisJCX0KKwl9CisJcmVhZF91bmxvY2tfYmgoJnhmcm1fcG9saWN5X2xvY2spOworCisJd2hpbGUgKGdjX2xpc3QpIHsKKwkJZHN0ID0gZ2NfbGlzdDsKKwkJZ2NfbGlzdCA9IGRzdC0+bmV4dDsKKwkJZHN0X2ZyZWUoZHN0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdW51c2VkX2J1bmRsZShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCit7CisJcmV0dXJuICFhdG9taWNfcmVhZCgmZHN0LT5fX3JlZmNudCk7Cit9CisKK3N0YXRpYyB2b2lkIF9feGZybV9nYXJiYWdlX2NvbGxlY3Qodm9pZCkKK3sKKwl4ZnJtX3BydW5lX2J1bmRsZXModW51c2VkX2J1bmRsZSk7Cit9CisKK2ludCB4ZnJtX2ZsdXNoX2J1bmRsZXModm9pZCkKK3sKKwl4ZnJtX3BydW5lX2J1bmRsZXMoc3RhbGVfYnVuZGxlKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCB4ZnJtX2luaXRfcG10dShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCit7CisJZG8geworCQlzdHJ1Y3QgeGZybV9kc3QgKnhkc3QgPSAoc3RydWN0IHhmcm1fZHN0ICopZHN0OworCQl1MzIgcG10dSwgcm91dGVfbXR1X2NhY2hlZDsKKworCQlwbXR1ID0gZHN0X210dShkc3QtPmNoaWxkKTsKKwkJeGRzdC0+Y2hpbGRfbXR1X2NhY2hlZCA9IHBtdHU7CisKKwkJcG10dSA9IHhmcm1fc3RhdGVfbXR1KGRzdC0+eGZybSwgcG10dSk7CisKKwkJcm91dGVfbXR1X2NhY2hlZCA9IGRzdF9tdHUoeGRzdC0+cm91dGUpOworCQl4ZHN0LT5yb3V0ZV9tdHVfY2FjaGVkID0gcm91dGVfbXR1X2NhY2hlZDsKKworCQlpZiAocG10dSA+IHJvdXRlX210dV9jYWNoZWQpCisJCQlwbXR1ID0gcm91dGVfbXR1X2NhY2hlZDsKKworCQlkc3QtPm1ldHJpY3NbUlRBWF9NVFUtMV0gPSBwbXR1OworCX0gd2hpbGUgKChkc3QgPSBkc3QtPm5leHQpKTsKK30KKworRVhQT1JUX1NZTUJPTCh4ZnJtX2luaXRfcG10dSk7CisKKy8qIENoZWNrIHRoYXQgdGhlIGJ1bmRsZSBhY2NlcHRzIHRoZSBmbG93IGFuZCBpdHMgY29tcG9uZW50cyBhcmUKKyAqIHN0aWxsIHZhbGlkLgorICovCisKK2ludCB4ZnJtX2J1bmRsZV9vayhzdHJ1Y3QgeGZybV9kc3QgKmZpcnN0LCBzdHJ1Y3QgZmxvd2kgKmZsLCBpbnQgZmFtaWx5KQoreworCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9ICZmaXJzdC0+dS5kc3Q7CisJc3RydWN0IHhmcm1fZHN0ICpsYXN0OworCXUzMiBtdHU7CisKKwlpZiAoIWRzdF9jaGVjayhkc3QtPnBhdGgsIDApIHx8CisJICAgIChkc3QtPmRldiAmJiAhbmV0aWZfcnVubmluZyhkc3QtPmRldikpKQorCQlyZXR1cm4gMDsKKworCWxhc3QgPSBOVUxMOworCisJZG8geworCQlzdHJ1Y3QgeGZybV9kc3QgKnhkc3QgPSAoc3RydWN0IHhmcm1fZHN0ICopZHN0OworCisJCWlmIChmbCAmJiAheGZybV9zZWxlY3Rvcl9tYXRjaCgmZHN0LT54ZnJtLT5zZWwsIGZsLCBmYW1pbHkpKQorCQkJcmV0dXJuIDA7CisJCWlmIChkc3QtPnhmcm0tPmttLnN0YXRlICE9IFhGUk1fU1RBVEVfVkFMSUQpCisJCQlyZXR1cm4gMDsKKworCQltdHUgPSBkc3RfbXR1KGRzdC0+Y2hpbGQpOworCQlpZiAoeGRzdC0+Y2hpbGRfbXR1X2NhY2hlZCAhPSBtdHUpIHsKKwkJCWxhc3QgPSB4ZHN0OworCQkJeGRzdC0+Y2hpbGRfbXR1X2NhY2hlZCA9IG10dTsKKwkJfQorCisJCWlmICghZHN0X2NoZWNrKHhkc3QtPnJvdXRlLCAwKSkKKwkJCXJldHVybiAwOworCQltdHUgPSBkc3RfbXR1KHhkc3QtPnJvdXRlKTsKKwkJaWYgKHhkc3QtPnJvdXRlX210dV9jYWNoZWQgIT0gbXR1KSB7CisJCQlsYXN0ID0geGRzdDsKKwkJCXhkc3QtPnJvdXRlX210dV9jYWNoZWQgPSBtdHU7CisJCX0KKworCQlkc3QgPSBkc3QtPmNoaWxkOworCX0gd2hpbGUgKGRzdC0+eGZybSk7CisKKwlpZiAobGlrZWx5KCFsYXN0KSkKKwkJcmV0dXJuIDE7CisKKwltdHUgPSBsYXN0LT5jaGlsZF9tdHVfY2FjaGVkOworCWZvciAoOzspIHsKKwkJZHN0ID0gJmxhc3QtPnUuZHN0OworCisJCW10dSA9IHhmcm1fc3RhdGVfbXR1KGRzdC0+eGZybSwgbXR1KTsKKwkJaWYgKG10dSA+IGxhc3QtPnJvdXRlX210dV9jYWNoZWQpCisJCQltdHUgPSBsYXN0LT5yb3V0ZV9tdHVfY2FjaGVkOworCQlkc3QtPm1ldHJpY3NbUlRBWF9NVFUtMV0gPSBtdHU7CisKKwkJaWYgKGxhc3QgPT0gZmlyc3QpCisJCQlicmVhazsKKworCQlsYXN0ID0gbGFzdC0+dS5uZXh0OworCQlsYXN0LT5jaGlsZF9tdHVfY2FjaGVkID0gbXR1OworCX0KKworCXJldHVybiAxOworfQorCitFWFBPUlRfU1lNQk9MKHhmcm1fYnVuZGxlX29rKTsKKworLyogV2VsbC4uLiB0aGF0J3MgX1RBU0tfLiBXZSBuZWVkIHRvIHNjYW4gdGhyb3VnaCB0cmFuc2Zvcm1hdGlvbgorICogbGlzdCBhbmQgZmlndXJlIG91dCB3aGF0IG1zcyB0Y3Agc2hvdWxkIGdlbmVyYXRlIGluIG9yZGVyIHRvCisgKiBmaW5hbCBkYXRhZ3JhbSBmaXQgdG8gbXR1LiBNYW1hIG1pYS4uLiA6LSkKKyAqCisgKiBBcHBhcmVudGx5LCBzb21lIGVhc3kgd2F5IGV4aXN0cywgYnV0IHdlIHVzZWQgdG8gY2hvb3NlIHRoZSBtb3N0CisgKiBiaXphcnJlIG9uZXMuIDotKSBTbywgcmFpc2luZyBLYWxhc2huaWtvdi4uLiB0cmEtdGEtdGEuCisgKgorICogQ29uc2lkZXIgdGhpcyBmdW5jdGlvbiBhcyBzb21ldGhpbmcgbGlrZSBkYXJrIGh1bW91ci4gOi0pCisgKi8KK3N0YXRpYyBpbnQgeGZybV9nZXRfbXNzKHN0cnVjdCBkc3RfZW50cnkgKmRzdCwgdTMyIG10dSkKK3sKKwlpbnQgcmVzID0gbXR1IC0gZHN0LT5oZWFkZXJfbGVuOworCisJZm9yICg7OykgeworCQlzdHJ1Y3QgZHN0X2VudHJ5ICpkID0gZHN0OworCQlpbnQgbSA9IHJlczsKKworCQlkbyB7CisJCQlzdHJ1Y3QgeGZybV9zdGF0ZSAqeCA9IGQtPnhmcm07CisJCQlpZiAoeCkgeworCQkJCXNwaW5fbG9ja19iaCgmeC0+bG9jayk7CisJCQkJaWYgKHgtPmttLnN0YXRlID09IFhGUk1fU1RBVEVfVkFMSUQgJiYKKwkJCQkgICAgeC0+dHlwZSAmJiB4LT50eXBlLT5nZXRfbWF4X3NpemUpCisJCQkJCW0gPSB4LT50eXBlLT5nZXRfbWF4X3NpemUoZC0+eGZybSwgbSk7CisJCQkJZWxzZQorCQkJCQltICs9IHgtPnByb3BzLmhlYWRlcl9sZW47CisJCQkJc3Bpbl91bmxvY2tfYmgoJngtPmxvY2spOworCQkJfQorCQl9IHdoaWxlICgoZCA9IGQtPmNoaWxkKSAhPSBOVUxMKTsKKworCQlpZiAobSA8PSBtdHUpCisJCQlicmVhazsKKwkJcmVzIC09IChtIC0gbXR1KTsKKwkJaWYgKHJlcyA8IDg4KQorCQkJcmV0dXJuIG10dTsKKwl9CisKKwlyZXR1cm4gcmVzICsgZHN0LT5oZWFkZXJfbGVuOworfQorCitpbnQgeGZybV9wb2xpY3lfcmVnaXN0ZXJfYWZpbmZvKHN0cnVjdCB4ZnJtX3BvbGljeV9hZmluZm8gKmFmaW5mbykKK3sKKwlpbnQgZXJyID0gMDsKKwlpZiAodW5saWtlbHkoYWZpbmZvID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodW5saWtlbHkoYWZpbmZvLT5mYW1pbHkgPj0gTlBST1RPKSkKKwkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisJd3JpdGVfbG9jaygmeGZybV9wb2xpY3lfYWZpbmZvX2xvY2spOworCWlmICh1bmxpa2VseSh4ZnJtX3BvbGljeV9hZmluZm9bYWZpbmZvLT5mYW1pbHldICE9IE5VTEwpKQorCQllcnIgPSAtRU5PQlVGUzsKKwllbHNlIHsKKwkJc3RydWN0IGRzdF9vcHMgKmRzdF9vcHMgPSBhZmluZm8tPmRzdF9vcHM7CisJCWlmIChsaWtlbHkoZHN0X29wcy0+a21lbV9jYWNoZXAgPT0gTlVMTCkpCisJCQlkc3Rfb3BzLT5rbWVtX2NhY2hlcCA9IHhmcm1fZHN0X2NhY2hlOworCQlpZiAobGlrZWx5KGRzdF9vcHMtPmNoZWNrID09IE5VTEwpKQorCQkJZHN0X29wcy0+Y2hlY2sgPSB4ZnJtX2RzdF9jaGVjazsKKwkJaWYgKGxpa2VseShkc3Rfb3BzLT5kZXN0cm95ID09IE5VTEwpKQorCQkJZHN0X29wcy0+ZGVzdHJveSA9IHhmcm1fZHN0X2Rlc3Ryb3k7CisJCWlmIChsaWtlbHkoZHN0X29wcy0+aWZkb3duID09IE5VTEwpKQorCQkJZHN0X29wcy0+aWZkb3duID0geGZybV9kc3RfaWZkb3duOworCQlpZiAobGlrZWx5KGRzdF9vcHMtPm5lZ2F0aXZlX2FkdmljZSA9PSBOVUxMKSkKKwkJCWRzdF9vcHMtPm5lZ2F0aXZlX2FkdmljZSA9IHhmcm1fbmVnYXRpdmVfYWR2aWNlOworCQlpZiAobGlrZWx5KGRzdF9vcHMtPmxpbmtfZmFpbHVyZSA9PSBOVUxMKSkKKwkJCWRzdF9vcHMtPmxpbmtfZmFpbHVyZSA9IHhmcm1fbGlua19mYWlsdXJlOworCQlpZiAobGlrZWx5KGRzdF9vcHMtPmdldF9tc3MgPT0gTlVMTCkpCisJCQlkc3Rfb3BzLT5nZXRfbXNzID0geGZybV9nZXRfbXNzOworCQlpZiAobGlrZWx5KGFmaW5mby0+Z2FyYmFnZV9jb2xsZWN0ID09IE5VTEwpKQorCQkJYWZpbmZvLT5nYXJiYWdlX2NvbGxlY3QgPSBfX3hmcm1fZ2FyYmFnZV9jb2xsZWN0OworCQl4ZnJtX3BvbGljeV9hZmluZm9bYWZpbmZvLT5mYW1pbHldID0gYWZpbmZvOworCX0KKwl3cml0ZV91bmxvY2soJnhmcm1fcG9saWN5X2FmaW5mb19sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTCh4ZnJtX3BvbGljeV9yZWdpc3Rlcl9hZmluZm8pOworCitpbnQgeGZybV9wb2xpY3lfdW5yZWdpc3Rlcl9hZmluZm8oc3RydWN0IHhmcm1fcG9saWN5X2FmaW5mbyAqYWZpbmZvKQoreworCWludCBlcnIgPSAwOworCWlmICh1bmxpa2VseShhZmluZm8gPT0gTlVMTCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh1bmxpa2VseShhZmluZm8tPmZhbWlseSA+PSBOUFJPVE8pKQorCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKKwl3cml0ZV9sb2NrKCZ4ZnJtX3BvbGljeV9hZmluZm9fbG9jayk7CisJaWYgKGxpa2VseSh4ZnJtX3BvbGljeV9hZmluZm9bYWZpbmZvLT5mYW1pbHldICE9IE5VTEwpKSB7CisJCWlmICh1bmxpa2VseSh4ZnJtX3BvbGljeV9hZmluZm9bYWZpbmZvLT5mYW1pbHldICE9IGFmaW5mbykpCisJCQllcnIgPSAtRUlOVkFMOworCQllbHNlIHsKKwkJCXN0cnVjdCBkc3Rfb3BzICpkc3Rfb3BzID0gYWZpbmZvLT5kc3Rfb3BzOworCQkJeGZybV9wb2xpY3lfYWZpbmZvW2FmaW5mby0+ZmFtaWx5XSA9IE5VTEw7CisJCQlkc3Rfb3BzLT5rbWVtX2NhY2hlcCA9IE5VTEw7CisJCQlkc3Rfb3BzLT5jaGVjayA9IE5VTEw7CisJCQlkc3Rfb3BzLT5kZXN0cm95ID0gTlVMTDsKKwkJCWRzdF9vcHMtPmlmZG93biA9IE5VTEw7CisJCQlkc3Rfb3BzLT5uZWdhdGl2ZV9hZHZpY2UgPSBOVUxMOworCQkJZHN0X29wcy0+bGlua19mYWlsdXJlID0gTlVMTDsKKwkJCWRzdF9vcHMtPmdldF9tc3MgPSBOVUxMOworCQkJYWZpbmZvLT5nYXJiYWdlX2NvbGxlY3QgPSBOVUxMOworCQl9CisJfQorCXdyaXRlX3VubG9jaygmeGZybV9wb2xpY3lfYWZpbmZvX2xvY2spOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKHhmcm1fcG9saWN5X3VucmVnaXN0ZXJfYWZpbmZvKTsKKworc3RhdGljIHN0cnVjdCB4ZnJtX3BvbGljeV9hZmluZm8gKnhmcm1fcG9saWN5X2dldF9hZmluZm8odW5zaWduZWQgc2hvcnQgZmFtaWx5KQoreworCXN0cnVjdCB4ZnJtX3BvbGljeV9hZmluZm8gKmFmaW5mbzsKKwlpZiAodW5saWtlbHkoZmFtaWx5ID49IE5QUk9UTykpCisJCXJldHVybiBOVUxMOworCXJlYWRfbG9jaygmeGZybV9wb2xpY3lfYWZpbmZvX2xvY2spOworCWFmaW5mbyA9IHhmcm1fcG9saWN5X2FmaW5mb1tmYW1pbHldOworCWlmIChsaWtlbHkoYWZpbmZvICE9IE5VTEwpKQorCQlyZWFkX2xvY2soJmFmaW5mby0+bG9jayk7CisJcmVhZF91bmxvY2soJnhmcm1fcG9saWN5X2FmaW5mb19sb2NrKTsKKwlyZXR1cm4gYWZpbmZvOworfQorCitzdGF0aWMgdm9pZCB4ZnJtX3BvbGljeV9wdXRfYWZpbmZvKHN0cnVjdCB4ZnJtX3BvbGljeV9hZmluZm8gKmFmaW5mbykKK3sKKwlpZiAodW5saWtlbHkoYWZpbmZvID09IE5VTEwpKQorCQlyZXR1cm47CisJcmVhZF91bmxvY2soJmFmaW5mby0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgeGZybV9kZXZfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCit7CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX0RPV046CisJCXhmcm1fZmx1c2hfYnVuZGxlcygpOworCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgeGZybV9kZXZfbm90aWZpZXIgPSB7CisJeGZybV9kZXZfZXZlbnQsCisJTlVMTCwKKwkwCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgeGZybV9wb2xpY3lfaW5pdCh2b2lkKQoreworCXhmcm1fZHN0X2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoInhmcm1fZHN0X2NhY2hlIiwKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCB4ZnJtX2RzdCksCisJCQkJCSAgIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwKKwkJCQkJICAgTlVMTCwgTlVMTCk7CisJaWYgKCF4ZnJtX2RzdF9jYWNoZSkKKwkJcGFuaWMoIlhGUk06IGZhaWxlZCB0byBhbGxvY2F0ZSB4ZnJtX2RzdF9jYWNoZVxuIik7CisKKwlJTklUX1dPUksoJnhmcm1fcG9saWN5X2djX3dvcmssIHhmcm1fcG9saWN5X2djX3Rhc2ssIE5VTEwpOworCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmeGZybV9kZXZfbm90aWZpZXIpOworfQorCit2b2lkIF9faW5pdCB4ZnJtX2luaXQodm9pZCkKK3sKKwl4ZnJtX3N0YXRlX2luaXQoKTsKKwl4ZnJtX3BvbGljeV9pbml0KCk7CisJeGZybV9pbnB1dF9pbml0KCk7Cit9CisKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fc3RhdGUuYyBiL25ldC94ZnJtL3hmcm1fc3RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGI1OWYxCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3hmcm0veGZybV9zdGF0ZS5jCkBAIC0wLDAgKzEsMTAzNyBAQAorLyoKKyAqIHhmcm1fc3RhdGUuYworICoKKyAqIENoYW5nZXM6CisgKglNaXRzdXJ1IEtBTkRBIEBVU0FHSQorICogCUthenVub3JpIE1JWUFaQVdBIEBVU0FHSQorICogCUt1bmloaXJvIElzaGlndXJvIDxrdW5paGlyb0BpcGluZnVzaW9uLmNvbT4KKyAqIAkJSVB2NiBzdXBwb3J0CisgKiAJWU9TSElGVUpJIEhpZGVha2kgQFVTQUdJCisgKiAJCVNwbGl0IHVwIGFmLXNwZWNpZmljIGZ1bmN0aW9ucworICoJRGVyZWsgQXRraW5zIDxkZXJla0BpaHRmcC5jb20+CisgKgkJQWRkIFVEUCBFbmNhcHN1bGF0aW9uCisgKiAJCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPG5ldC94ZnJtLmg+CisjaW5jbHVkZSA8bGludXgvcGZrZXl2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwc2VjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyogRWFjaCB4ZnJtX3N0YXRlIG1heSBiZSBsaW5rZWQgdG8gdHdvIHRhYmxlczoKKworICAgMS4gSGFzaCB0YWJsZSBieSAoc3BpLGRhZGRyLGFoL2VzcCkgdG8gZmluZCBTQSBieSBTUEkuIChpbnB1dCxjdGwpCisgICAyLiBIYXNoIHRhYmxlIGJ5IGRhZGRyIHRvIGZpbmQgd2hhdCBTQXMgZXhpc3QgZm9yIGdpdmVuCisgICAgICBkZXN0aW5hdGlvbi90dW5uZWwgZW5kcG9pbnQuIChvdXRwdXQpCisgKi8KKworc3RhdGljIERFRklORV9TUElOTE9DSyh4ZnJtX3N0YXRlX2xvY2spOworCisvKiBIYXNoIHRhYmxlIHRvIGZpbmQgYXBwcm9wcmlhdGUgU0EgdG93YXJkcyBnaXZlbiB0YXJnZXQgKGVuZHBvaW50CisgKiBvZiB0dW5uZWwgb3IgZGVzdGluYXRpb24gb2YgdHJhbnNwb3J0IG1vZGUpIGFsbG93ZWQgYnkgc2VsZWN0b3IuCisgKgorICogTWFpbiB1c2UgaXMgZmluZGluZyBTQSBhZnRlciBwb2xpY3kgc2VsZWN0ZWQgdHVubmVsIG9yIHRyYW5zcG9ydCBtb2RlLgorICogQWxzbywgaXQgY2FuIGJlIHVzZWQgYnkgYWgvZXNwIGljbXAgZXJyb3IgaGFuZGxlciB0byBmaW5kIG9mZmVuZGluZyBTQS4KKyAqLworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgeGZybV9zdGF0ZV9ieWRzdFtYRlJNX0RTVF9IU0laRV07CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCB4ZnJtX3N0YXRlX2J5c3BpW1hGUk1fRFNUX0hTSVpFXTsKKworREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoa21fd2FpdHEpOworRVhQT1JUX1NZTUJPTChrbV93YWl0cSk7CisKK3N0YXRpYyBERUZJTkVfUldMT0NLKHhmcm1fc3RhdGVfYWZpbmZvX2xvY2spOworc3RhdGljIHN0cnVjdCB4ZnJtX3N0YXRlX2FmaW5mbyAqeGZybV9zdGF0ZV9hZmluZm9bTlBST1RPXTsKKworc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCB4ZnJtX3N0YXRlX2djX3dvcms7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCB4ZnJtX3N0YXRlX2djX2xpc3QgPSBMSVNUX0hFQURfSU5JVCh4ZnJtX3N0YXRlX2djX2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyh4ZnJtX3N0YXRlX2djX2xvY2spOworCitzdGF0aWMgaW50IHhmcm1fc3RhdGVfZ2NfZmx1c2hfYnVuZGxlczsKKworc3RhdGljIHZvaWQgX194ZnJtX3N0YXRlX2RlbGV0ZShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCk7CisKK3N0YXRpYyBzdHJ1Y3QgeGZybV9zdGF0ZV9hZmluZm8gKnhmcm1fc3RhdGVfZ2V0X2FmaW5mbyh1bnNpZ25lZCBzaG9ydCBmYW1pbHkpOworc3RhdGljIHZvaWQgeGZybV9zdGF0ZV9wdXRfYWZpbmZvKHN0cnVjdCB4ZnJtX3N0YXRlX2FmaW5mbyAqYWZpbmZvKTsKKworc3RhdGljIGludCBrbV9xdWVyeShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHhmcm1fdG1wbCAqdCwgc3RydWN0IHhmcm1fcG9saWN5ICpwb2wpOworc3RhdGljIHZvaWQga21fc3RhdGVfZXhwaXJlZChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgaW50IGhhcmQpOworCitzdGF0aWMgdm9pZCB4ZnJtX3N0YXRlX2djX2Rlc3Ryb3koc3RydWN0IHhmcm1fc3RhdGUgKngpCit7CisJaWYgKGRlbF90aW1lcigmeC0+dGltZXIpKQorCQlCVUcoKTsKKwlpZiAoeC0+YWFsZykKKwkJa2ZyZWUoeC0+YWFsZyk7CisJaWYgKHgtPmVhbGcpCisJCWtmcmVlKHgtPmVhbGcpOworCWlmICh4LT5jYWxnKQorCQlrZnJlZSh4LT5jYWxnKTsKKwlpZiAoeC0+ZW5jYXApCisJCWtmcmVlKHgtPmVuY2FwKTsKKwlpZiAoeC0+dHlwZSkgeworCQl4LT50eXBlLT5kZXN0cnVjdG9yKHgpOworCQl4ZnJtX3B1dF90eXBlKHgtPnR5cGUpOworCX0KKwlrZnJlZSh4KTsKK30KKworc3RhdGljIHZvaWQgeGZybV9zdGF0ZV9nY190YXNrKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHhmcm1fc3RhdGUgKng7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICp0bXA7CisJc3RydWN0IGxpc3RfaGVhZCBnY19saXN0ID0gTElTVF9IRUFEX0lOSVQoZ2NfbGlzdCk7CisKKwlpZiAoeGZybV9zdGF0ZV9nY19mbHVzaF9idW5kbGVzKSB7CisJCXhmcm1fc3RhdGVfZ2NfZmx1c2hfYnVuZGxlcyA9IDA7CisJCXhmcm1fZmx1c2hfYnVuZGxlcygpOworCX0KKworCXNwaW5fbG9ja19iaCgmeGZybV9zdGF0ZV9nY19sb2NrKTsKKwlsaXN0X3NwbGljZV9pbml0KCZ4ZnJtX3N0YXRlX2djX2xpc3QsICZnY19saXN0KTsKKwlzcGluX3VubG9ja19iaCgmeGZybV9zdGF0ZV9nY19sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgdG1wLCAmZ2NfbGlzdCkgeworCQl4ID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHhmcm1fc3RhdGUsIGJ5ZHN0KTsKKwkJeGZybV9zdGF0ZV9nY19kZXN0cm95KHgpOworCX0KKwl3YWtlX3VwKCZrbV93YWl0cSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtYWtlX2ppZmZpZXMobG9uZyBzZWNzKQoreworCWlmIChzZWNzID49IChNQVhfU0NIRURVTEVfVElNRU9VVC0xKS9IWikKKwkJcmV0dXJuIE1BWF9TQ0hFRFVMRV9USU1FT1VULTE7CisJZWxzZQorCSAgICAgICAgcmV0dXJuIHNlY3MqSFo7Cit9CisKK3N0YXRpYyB2b2lkIHhmcm1fdGltZXJfaGFuZGxlcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHhmcm1fc3RhdGUgKnggPSAoc3RydWN0IHhmcm1fc3RhdGUqKWRhdGE7CisJdW5zaWduZWQgbG9uZyBub3cgPSAodW5zaWduZWQgbG9uZyl4dGltZS50dl9zZWM7CisJbG9uZyBuZXh0ID0gTE9OR19NQVg7CisJaW50IHdhcm4gPSAwOworCisJc3Bpbl9sb2NrKCZ4LT5sb2NrKTsKKwlpZiAoeC0+a20uc3RhdGUgPT0gWEZSTV9TVEFURV9ERUFEKQorCQlnb3RvIG91dDsKKwlpZiAoeC0+a20uc3RhdGUgPT0gWEZSTV9TVEFURV9FWFBJUkVEKQorCQlnb3RvIGV4cGlyZWQ7CisJaWYgKHgtPmxmdC5oYXJkX2FkZF9leHBpcmVzX3NlY29uZHMpIHsKKwkJbG9uZyB0bW8gPSB4LT5sZnQuaGFyZF9hZGRfZXhwaXJlc19zZWNvbmRzICsKKwkJCXgtPmN1cmxmdC5hZGRfdGltZSAtIG5vdzsKKwkJaWYgKHRtbyA8PSAwKQorCQkJZ290byBleHBpcmVkOworCQlpZiAodG1vIDwgbmV4dCkKKwkJCW5leHQgPSB0bW87CisJfQorCWlmICh4LT5sZnQuaGFyZF91c2VfZXhwaXJlc19zZWNvbmRzKSB7CisJCWxvbmcgdG1vID0geC0+bGZ0LmhhcmRfdXNlX2V4cGlyZXNfc2Vjb25kcyArCisJCQkoeC0+Y3VybGZ0LnVzZV90aW1lID8gOiBub3cpIC0gbm93OworCQlpZiAodG1vIDw9IDApCisJCQlnb3RvIGV4cGlyZWQ7CisJCWlmICh0bW8gPCBuZXh0KQorCQkJbmV4dCA9IHRtbzsKKwl9CisJaWYgKHgtPmttLmR5aW5nKQorCQlnb3RvIHJlc2NoZWQ7CisJaWYgKHgtPmxmdC5zb2Z0X2FkZF9leHBpcmVzX3NlY29uZHMpIHsKKwkJbG9uZyB0bW8gPSB4LT5sZnQuc29mdF9hZGRfZXhwaXJlc19zZWNvbmRzICsKKwkJCXgtPmN1cmxmdC5hZGRfdGltZSAtIG5vdzsKKwkJaWYgKHRtbyA8PSAwKQorCQkJd2FybiA9IDE7CisJCWVsc2UgaWYgKHRtbyA8IG5leHQpCisJCQluZXh0ID0gdG1vOworCX0KKwlpZiAoeC0+bGZ0LnNvZnRfdXNlX2V4cGlyZXNfc2Vjb25kcykgeworCQlsb25nIHRtbyA9IHgtPmxmdC5zb2Z0X3VzZV9leHBpcmVzX3NlY29uZHMgKworCQkJKHgtPmN1cmxmdC51c2VfdGltZSA/IDogbm93KSAtIG5vdzsKKwkJaWYgKHRtbyA8PSAwKQorCQkJd2FybiA9IDE7CisJCWVsc2UgaWYgKHRtbyA8IG5leHQpCisJCQluZXh0ID0gdG1vOworCX0KKworCWlmICh3YXJuKQorCQlrbV9zdGF0ZV9leHBpcmVkKHgsIDApOworcmVzY2hlZDoKKwlpZiAobmV4dCAhPSBMT05HX01BWCAmJgorCSAgICAhbW9kX3RpbWVyKCZ4LT50aW1lciwgamlmZmllcyArIG1ha2VfamlmZmllcyhuZXh0KSkpCisJCXhmcm1fc3RhdGVfaG9sZCh4KTsKKwlnb3RvIG91dDsKKworZXhwaXJlZDoKKwlpZiAoeC0+a20uc3RhdGUgPT0gWEZSTV9TVEFURV9BQ1EgJiYgeC0+aWQuc3BpID09IDApIHsKKwkJeC0+a20uc3RhdGUgPSBYRlJNX1NUQVRFX0VYUElSRUQ7CisJCXdha2VfdXAoJmttX3dhaXRxKTsKKwkJbmV4dCA9IDI7CisJCWdvdG8gcmVzY2hlZDsKKwl9CisJaWYgKHgtPmlkLnNwaSAhPSAwKQorCQlrbV9zdGF0ZV9leHBpcmVkKHgsIDEpOworCV9feGZybV9zdGF0ZV9kZWxldGUoeCk7CisKK291dDoKKwlzcGluX3VubG9jaygmeC0+bG9jayk7CisJeGZybV9zdGF0ZV9wdXQoeCk7Cit9CisKK3N0cnVjdCB4ZnJtX3N0YXRlICp4ZnJtX3N0YXRlX2FsbG9jKHZvaWQpCit7CisJc3RydWN0IHhmcm1fc3RhdGUgKng7CisKKwl4ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHhmcm1fc3RhdGUpLCBHRlBfQVRPTUlDKTsKKworCWlmICh4KSB7CisJCW1lbXNldCh4LCAwLCBzaXplb2Yoc3RydWN0IHhmcm1fc3RhdGUpKTsKKwkJYXRvbWljX3NldCgmeC0+cmVmY250LCAxKTsKKwkJYXRvbWljX3NldCgmeC0+dHVubmVsX3VzZXJzLCAwKTsKKwkJSU5JVF9MSVNUX0hFQUQoJngtPmJ5ZHN0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJngtPmJ5c3BpKTsKKwkJaW5pdF90aW1lcigmeC0+dGltZXIpOworCQl4LT50aW1lci5mdW5jdGlvbiA9IHhmcm1fdGltZXJfaGFuZGxlcjsKKwkJeC0+dGltZXIuZGF0YQkgID0gKHVuc2lnbmVkIGxvbmcpeDsKKwkJeC0+Y3VybGZ0LmFkZF90aW1lID0gKHVuc2lnbmVkIGxvbmcpeHRpbWUudHZfc2VjOworCQl4LT5sZnQuc29mdF9ieXRlX2xpbWl0ID0gWEZSTV9JTkY7CisJCXgtPmxmdC5zb2Z0X3BhY2tldF9saW1pdCA9IFhGUk1fSU5GOworCQl4LT5sZnQuaGFyZF9ieXRlX2xpbWl0ID0gWEZSTV9JTkY7CisJCXgtPmxmdC5oYXJkX3BhY2tldF9saW1pdCA9IFhGUk1fSU5GOworCQlzcGluX2xvY2tfaW5pdCgmeC0+bG9jayk7CisJfQorCXJldHVybiB4OworfQorRVhQT1JUX1NZTUJPTCh4ZnJtX3N0YXRlX2FsbG9jKTsKKwordm9pZCBfX3hmcm1fc3RhdGVfZGVzdHJveShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCkKK3sKKwlCVUdfVFJBUCh4LT5rbS5zdGF0ZSA9PSBYRlJNX1NUQVRFX0RFQUQpOworCisJc3Bpbl9sb2NrX2JoKCZ4ZnJtX3N0YXRlX2djX2xvY2spOworCWxpc3RfYWRkKCZ4LT5ieWRzdCwgJnhmcm1fc3RhdGVfZ2NfbGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJnhmcm1fc3RhdGVfZ2NfbG9jayk7CisJc2NoZWR1bGVfd29yaygmeGZybV9zdGF0ZV9nY193b3JrKTsKK30KK0VYUE9SVF9TWU1CT0woX194ZnJtX3N0YXRlX2Rlc3Ryb3kpOworCitzdGF0aWMgdm9pZCBfX3hmcm1fc3RhdGVfZGVsZXRlKHN0cnVjdCB4ZnJtX3N0YXRlICp4KQoreworCWlmICh4LT5rbS5zdGF0ZSAhPSBYRlJNX1NUQVRFX0RFQUQpIHsKKwkJeC0+a20uc3RhdGUgPSBYRlJNX1NUQVRFX0RFQUQ7CisJCXNwaW5fbG9jaygmeGZybV9zdGF0ZV9sb2NrKTsKKwkJbGlzdF9kZWwoJngtPmJ5ZHN0KTsKKwkJYXRvbWljX2RlYygmeC0+cmVmY250KTsKKwkJaWYgKHgtPmlkLnNwaSkgeworCQkJbGlzdF9kZWwoJngtPmJ5c3BpKTsKKwkJCWF0b21pY19kZWMoJngtPnJlZmNudCk7CisJCX0KKwkJc3Bpbl91bmxvY2soJnhmcm1fc3RhdGVfbG9jayk7CisJCWlmIChkZWxfdGltZXIoJngtPnRpbWVyKSkKKwkJCWF0b21pY19kZWMoJngtPnJlZmNudCk7CisKKwkJLyogVGhlIG51bWJlciB0d28gaW4gdGhpcyB0ZXN0IGlzIHRoZSByZWZlcmVuY2UKKwkJICogbWVudGlvbmVkIGluIHRoZSBjb21tZW50IGJlbG93IHBsdXMgdGhlIHJlZmVyZW5jZQorCQkgKiBvdXIgY2FsbGVyIGhvbGRzLiAgQSBsYXJnZXIgdmFsdWUgbWVhbnMgdGhhdAorCQkgKiB0aGVyZSBhcmUgRFNUcyBhdHRhY2hlZCB0byB0aGlzIHhmcm1fc3RhdGUuCisJCSAqLworCQlpZiAoYXRvbWljX3JlYWQoJngtPnJlZmNudCkgPiAyKSB7CisJCQl4ZnJtX3N0YXRlX2djX2ZsdXNoX2J1bmRsZXMgPSAxOworCQkJc2NoZWR1bGVfd29yaygmeGZybV9zdGF0ZV9nY193b3JrKTsKKwkJfQorCisJCS8qIEFsbCB4ZnJtX3N0YXRlIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgeGZybV9zdGF0ZV9hbGxvYy4KKwkJICogVGhlIHhmcm1fc3RhdGVfYWxsb2MgY2FsbCBnaXZlcyBhIHJlZmVyZW5jZSwgYW5kIHRoYXQKKwkJICogaXMgd2hhdCB3ZSBhcmUgZHJvcHBpbmcgaGVyZS4KKwkJICovCisJCWF0b21pY19kZWMoJngtPnJlZmNudCk7CisJfQorfQorCit2b2lkIHhmcm1fc3RhdGVfZGVsZXRlKHN0cnVjdCB4ZnJtX3N0YXRlICp4KQoreworCXNwaW5fbG9ja19iaCgmeC0+bG9jayk7CisJX194ZnJtX3N0YXRlX2RlbGV0ZSh4KTsKKwlzcGluX3VubG9ja19iaCgmeC0+bG9jayk7Cit9CitFWFBPUlRfU1lNQk9MKHhmcm1fc3RhdGVfZGVsZXRlKTsKKwordm9pZCB4ZnJtX3N0YXRlX2ZsdXNoKHU4IHByb3RvKQoreworCWludCBpOworCXN0cnVjdCB4ZnJtX3N0YXRlICp4OworCisJc3Bpbl9sb2NrX2JoKCZ4ZnJtX3N0YXRlX2xvY2spOworCWZvciAoaSA9IDA7IGkgPCBYRlJNX0RTVF9IU0laRTsgaSsrKSB7CityZXN0YXJ0OgorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHgsIHhmcm1fc3RhdGVfYnlkc3QraSwgYnlkc3QpIHsKKwkJCWlmICgheGZybV9zdGF0ZV9rZXJuKHgpICYmCisJCQkgICAgKHByb3RvID09IElQU0VDX1BST1RPX0FOWSB8fCB4LT5pZC5wcm90byA9PSBwcm90bykpIHsKKwkJCQl4ZnJtX3N0YXRlX2hvbGQoeCk7CisJCQkJc3Bpbl91bmxvY2tfYmgoJnhmcm1fc3RhdGVfbG9jayk7CisKKwkJCQl4ZnJtX3N0YXRlX2RlbGV0ZSh4KTsKKwkJCQl4ZnJtX3N0YXRlX3B1dCh4KTsKKworCQkJCXNwaW5fbG9ja19iaCgmeGZybV9zdGF0ZV9sb2NrKTsKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQl9CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJnhmcm1fc3RhdGVfbG9jayk7CisJd2FrZV91cCgma21fd2FpdHEpOworfQorRVhQT1JUX1NZTUJPTCh4ZnJtX3N0YXRlX2ZsdXNoKTsKKworc3RhdGljIGludAoreGZybV9pbml0X3RlbXBzZWwoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBmbG93aSAqZmwsCisJCSAgc3RydWN0IHhmcm1fdG1wbCAqdG1wbCwKKwkJICB4ZnJtX2FkZHJlc3NfdCAqZGFkZHIsIHhmcm1fYWRkcmVzc190ICpzYWRkciwKKwkJICB1bnNpZ25lZCBzaG9ydCBmYW1pbHkpCit7CisJc3RydWN0IHhmcm1fc3RhdGVfYWZpbmZvICphZmluZm8gPSB4ZnJtX3N0YXRlX2dldF9hZmluZm8oZmFtaWx5KTsKKwlpZiAoIWFmaW5mbykKKwkJcmV0dXJuIC0xOworCWFmaW5mby0+aW5pdF90ZW1wc2VsKHgsIGZsLCB0bXBsLCBkYWRkciwgc2FkZHIpOworCXhmcm1fc3RhdGVfcHV0X2FmaW5mbyhhZmluZm8pOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgeGZybV9zdGF0ZSAqCit4ZnJtX3N0YXRlX2ZpbmQoeGZybV9hZGRyZXNzX3QgKmRhZGRyLCB4ZnJtX2FkZHJlc3NfdCAqc2FkZHIsIAorCQlzdHJ1Y3QgZmxvd2kgKmZsLCBzdHJ1Y3QgeGZybV90bXBsICp0bXBsLAorCQlzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbCwgaW50ICplcnIsCisJCXVuc2lnbmVkIHNob3J0IGZhbWlseSkKK3sKKwl1bnNpZ25lZCBoID0geGZybV9kc3RfaGFzaChkYWRkciwgZmFtaWx5KTsKKwlzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgKngwOworCWludCBhY3F1aXJlX2luX3Byb2dyZXNzID0gMDsKKwlpbnQgZXJyb3IgPSAwOworCXN0cnVjdCB4ZnJtX3N0YXRlICpiZXN0ID0gTlVMTDsKKwlzdHJ1Y3QgeGZybV9zdGF0ZV9hZmluZm8gKmFmaW5mbzsKKwkKKwlhZmluZm8gPSB4ZnJtX3N0YXRlX2dldF9hZmluZm8oZmFtaWx5KTsKKwlpZiAoYWZpbmZvID09IE5VTEwpIHsKKwkJKmVyciA9IC1FQUZOT1NVUFBPUlQ7CisJCXJldHVybiBOVUxMOworCX0KKworCXNwaW5fbG9ja19iaCgmeGZybV9zdGF0ZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHgsIHhmcm1fc3RhdGVfYnlkc3QraCwgYnlkc3QpIHsKKwkJaWYgKHgtPnByb3BzLmZhbWlseSA9PSBmYW1pbHkgJiYKKwkJICAgIHgtPnByb3BzLnJlcWlkID09IHRtcGwtPnJlcWlkICYmCisJCSAgICB4ZnJtX3N0YXRlX2FkZHJfY2hlY2soeCwgZGFkZHIsIHNhZGRyLCBmYW1pbHkpICYmCisJCSAgICB0bXBsLT5tb2RlID09IHgtPnByb3BzLm1vZGUgJiYKKwkJICAgIHRtcGwtPmlkLnByb3RvID09IHgtPmlkLnByb3RvICYmCisJCSAgICAodG1wbC0+aWQuc3BpID09IHgtPmlkLnNwaSB8fCAhdG1wbC0+aWQuc3BpKSkgeworCQkJLyogUmVzb2x1dGlvbiBsb2dpYzoKKwkJCSAgIDEuIFRoZXJlIGlzIGEgdmFsaWQgc3RhdGUgd2l0aCBtYXRjaGluZyBzZWxlY3Rvci4KKwkJCSAgICAgIERvbmUuCisJCQkgICAyLiBWYWxpZCBzdGF0ZSB3aXRoIGluYXBwcm9wcmlhdGUgc2VsZWN0b3IuIFNraXAuCisKKwkJCSAgIEVudGVyaW5nIGFyZWEgb2YgInN5c2RlcHMiLgorCisJCQkgICAzLiBJZiBzdGF0ZSBpcyBub3QgdmFsaWQsIHNlbGVjdG9yIGlzIHRlbXBvcmFyeSwKKwkJCSAgICAgIGl0IHNlbGVjdHMgb25seSBzZXNzaW9uIHdoaWNoIHRyaWdnZXJlZAorCQkJICAgICAgcHJldmlvdXMgcmVzb2x1dGlvbi4gS2V5IG1hbmFnZXIgd2lsbCBkbworCQkJICAgICAgc29tZXRoaW5nIHRvIGluc3RhbGwgYSBzdGF0ZSB3aXRoIHByb3BlcgorCQkJICAgICAgc2VsZWN0b3IuCisJCQkgKi8KKwkJCWlmICh4LT5rbS5zdGF0ZSA9PSBYRlJNX1NUQVRFX1ZBTElEKSB7CisJCQkJaWYgKCF4ZnJtX3NlbGVjdG9yX21hdGNoKCZ4LT5zZWwsIGZsLCBmYW1pbHkpKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoIWJlc3QgfHwKKwkJCQkgICAgYmVzdC0+a20uZHlpbmcgPiB4LT5rbS5keWluZyB8fAorCQkJCSAgICAoYmVzdC0+a20uZHlpbmcgPT0geC0+a20uZHlpbmcgJiYKKwkJCQkgICAgIGJlc3QtPmN1cmxmdC5hZGRfdGltZSA8IHgtPmN1cmxmdC5hZGRfdGltZSkpCisJCQkJCWJlc3QgPSB4OworCQkJfSBlbHNlIGlmICh4LT5rbS5zdGF0ZSA9PSBYRlJNX1NUQVRFX0FDUSkgeworCQkJCWFjcXVpcmVfaW5fcHJvZ3Jlc3MgPSAxOworCQkJfSBlbHNlIGlmICh4LT5rbS5zdGF0ZSA9PSBYRlJNX1NUQVRFX0VSUk9SIHx8CisJCQkJICAgeC0+a20uc3RhdGUgPT0gWEZSTV9TVEFURV9FWFBJUkVEKSB7CisJCQkJaWYgKHhmcm1fc2VsZWN0b3JfbWF0Y2goJngtPnNlbCwgZmwsIGZhbWlseSkpCisJCQkJCWVycm9yID0gLUVTUkNIOworCQkJfQorCQl9CisJfQorCisJeCA9IGJlc3Q7CisJaWYgKCF4ICYmICFlcnJvciAmJiAhYWNxdWlyZV9pbl9wcm9ncmVzcykgeworCQl4MCA9IGFmaW5mby0+c3RhdGVfbG9va3VwKCZ0bXBsLT5pZC5kYWRkciwgdG1wbC0+aWQuc3BpLCB0bXBsLT5pZC5wcm90byk7CisJCWlmICh4MCAhPSBOVUxMKSB7CisJCQl4ZnJtX3N0YXRlX3B1dCh4MCk7CisJCQllcnJvciA9IC1FRVhJU1Q7CisJCQlnb3RvIG91dDsKKwkJfQorCQl4ID0geGZybV9zdGF0ZV9hbGxvYygpOworCQlpZiAoeCA9PSBOVUxMKSB7CisJCQllcnJvciA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCQkvKiBJbml0aWFsaXplIHRlbXBvcmFyeSBzZWxlY3RvciBtYXRjaGluZyBvbmx5CisJCSAqIHRvIGN1cnJlbnQgc2Vzc2lvbi4gKi8KKwkJeGZybV9pbml0X3RlbXBzZWwoeCwgZmwsIHRtcGwsIGRhZGRyLCBzYWRkciwgZmFtaWx5KTsKKworCQlpZiAoa21fcXVlcnkoeCwgdG1wbCwgcG9sKSA9PSAwKSB7CisJCQl4LT5rbS5zdGF0ZSA9IFhGUk1fU1RBVEVfQUNROworCQkJbGlzdF9hZGRfdGFpbCgmeC0+Ynlkc3QsIHhmcm1fc3RhdGVfYnlkc3QraCk7CisJCQl4ZnJtX3N0YXRlX2hvbGQoeCk7CisJCQlpZiAoeC0+aWQuc3BpKSB7CisJCQkJaCA9IHhmcm1fc3BpX2hhc2goJngtPmlkLmRhZGRyLCB4LT5pZC5zcGksIHgtPmlkLnByb3RvLCBmYW1pbHkpOworCQkJCWxpc3RfYWRkKCZ4LT5ieXNwaSwgeGZybV9zdGF0ZV9ieXNwaStoKTsKKwkJCQl4ZnJtX3N0YXRlX2hvbGQoeCk7CisJCQl9CisJCQl4LT5sZnQuaGFyZF9hZGRfZXhwaXJlc19zZWNvbmRzID0gWEZSTV9BQ1FfRVhQSVJFUzsKKwkJCXhmcm1fc3RhdGVfaG9sZCh4KTsKKwkJCXgtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgWEZSTV9BQ1FfRVhQSVJFUypIWjsKKwkJCWFkZF90aW1lcigmeC0+dGltZXIpOworCQl9IGVsc2UgeworCQkJeC0+a20uc3RhdGUgPSBYRlJNX1NUQVRFX0RFQUQ7CisJCQl4ZnJtX3N0YXRlX3B1dCh4KTsKKwkJCXggPSBOVUxMOworCQkJZXJyb3IgPSAtRVNSQ0g7CisJCX0KKwl9CitvdXQ6CisJaWYgKHgpCisJCXhmcm1fc3RhdGVfaG9sZCh4KTsKKwllbHNlCisJCSplcnIgPSBhY3F1aXJlX2luX3Byb2dyZXNzID8gLUVBR0FJTiA6IGVycm9yOworCXNwaW5fdW5sb2NrX2JoKCZ4ZnJtX3N0YXRlX2xvY2spOworCXhmcm1fc3RhdGVfcHV0X2FmaW5mbyhhZmluZm8pOworCXJldHVybiB4OworfQorCitzdGF0aWMgdm9pZCBfX3hmcm1fc3RhdGVfaW5zZXJ0KHN0cnVjdCB4ZnJtX3N0YXRlICp4KQoreworCXVuc2lnbmVkIGggPSB4ZnJtX2RzdF9oYXNoKCZ4LT5pZC5kYWRkciwgeC0+cHJvcHMuZmFtaWx5KTsKKworCWxpc3RfYWRkKCZ4LT5ieWRzdCwgeGZybV9zdGF0ZV9ieWRzdCtoKTsKKwl4ZnJtX3N0YXRlX2hvbGQoeCk7CisKKwloID0geGZybV9zcGlfaGFzaCgmeC0+aWQuZGFkZHIsIHgtPmlkLnNwaSwgeC0+aWQucHJvdG8sIHgtPnByb3BzLmZhbWlseSk7CisKKwlsaXN0X2FkZCgmeC0+YnlzcGksIHhmcm1fc3RhdGVfYnlzcGkraCk7CisJeGZybV9zdGF0ZV9ob2xkKHgpOworCisJaWYgKCFtb2RfdGltZXIoJngtPnRpbWVyLCBqaWZmaWVzICsgSFopKQorCQl4ZnJtX3N0YXRlX2hvbGQoeCk7CisKKwl3YWtlX3VwKCZrbV93YWl0cSk7Cit9CisKK3ZvaWQgeGZybV9zdGF0ZV9pbnNlcnQoc3RydWN0IHhmcm1fc3RhdGUgKngpCit7CisJc3Bpbl9sb2NrX2JoKCZ4ZnJtX3N0YXRlX2xvY2spOworCV9feGZybV9zdGF0ZV9pbnNlcnQoeCk7CisJc3Bpbl91bmxvY2tfYmgoJnhmcm1fc3RhdGVfbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MKHhmcm1fc3RhdGVfaW5zZXJ0KTsKKworc3RhdGljIHN0cnVjdCB4ZnJtX3N0YXRlICpfX3hmcm1fZmluZF9hY3FfYnlzZXEodTMyIHNlcSk7CisKK2ludCB4ZnJtX3N0YXRlX2FkZChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCkKK3sKKwlzdHJ1Y3QgeGZybV9zdGF0ZV9hZmluZm8gKmFmaW5mbzsKKwlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDE7CisJaW50IGZhbWlseTsKKwlpbnQgZXJyOworCisJZmFtaWx5ID0geC0+cHJvcHMuZmFtaWx5OworCWFmaW5mbyA9IHhmcm1fc3RhdGVfZ2V0X2FmaW5mbyhmYW1pbHkpOworCWlmICh1bmxpa2VseShhZmluZm8gPT0gTlVMTCkpCisJCXJldHVybiAtRUFGTk9TVVBQT1JUOworCisJc3Bpbl9sb2NrX2JoKCZ4ZnJtX3N0YXRlX2xvY2spOworCisJeDEgPSBhZmluZm8tPnN0YXRlX2xvb2t1cCgmeC0+aWQuZGFkZHIsIHgtPmlkLnNwaSwgeC0+aWQucHJvdG8pOworCWlmICh4MSkgeworCQl4ZnJtX3N0YXRlX3B1dCh4MSk7CisJCXgxID0gTlVMTDsKKwkJZXJyID0gLUVFWElTVDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHgtPmttLnNlcSkgeworCQl4MSA9IF9feGZybV9maW5kX2FjcV9ieXNlcSh4LT5rbS5zZXEpOworCQlpZiAoeDEgJiYgeGZybV9hZGRyX2NtcCgmeDEtPmlkLmRhZGRyLCAmeC0+aWQuZGFkZHIsIGZhbWlseSkpIHsKKwkJCXhmcm1fc3RhdGVfcHV0KHgxKTsKKwkJCXgxID0gTlVMTDsKKwkJfQorCX0KKworCWlmICgheDEpCisJCXgxID0gYWZpbmZvLT5maW5kX2FjcSgKKwkJCXgtPnByb3BzLm1vZGUsIHgtPnByb3BzLnJlcWlkLCB4LT5pZC5wcm90bywKKwkJCSZ4LT5pZC5kYWRkciwgJngtPnByb3BzLnNhZGRyLCAwKTsKKworCV9feGZybV9zdGF0ZV9pbnNlcnQoeCk7CisJZXJyID0gMDsKKworb3V0OgorCXNwaW5fdW5sb2NrX2JoKCZ4ZnJtX3N0YXRlX2xvY2spOworCXhmcm1fc3RhdGVfcHV0X2FmaW5mbyhhZmluZm8pOworCisJaWYgKHgxKSB7CisJCXhmcm1fc3RhdGVfZGVsZXRlKHgxKTsKKwkJeGZybV9zdGF0ZV9wdXQoeDEpOworCX0KKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKHhmcm1fc3RhdGVfYWRkKTsKKworaW50IHhmcm1fc3RhdGVfdXBkYXRlKHN0cnVjdCB4ZnJtX3N0YXRlICp4KQoreworCXN0cnVjdCB4ZnJtX3N0YXRlX2FmaW5mbyAqYWZpbmZvOworCXN0cnVjdCB4ZnJtX3N0YXRlICp4MTsKKwlpbnQgZXJyOworCisJYWZpbmZvID0geGZybV9zdGF0ZV9nZXRfYWZpbmZvKHgtPnByb3BzLmZhbWlseSk7CisJaWYgKHVubGlrZWx5KGFmaW5mbyA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisKKwlzcGluX2xvY2tfYmgoJnhmcm1fc3RhdGVfbG9jayk7CisJeDEgPSBhZmluZm8tPnN0YXRlX2xvb2t1cCgmeC0+aWQuZGFkZHIsIHgtPmlkLnNwaSwgeC0+aWQucHJvdG8pOworCisJZXJyID0gLUVTUkNIOworCWlmICgheDEpCisJCWdvdG8gb3V0OworCisJaWYgKHhmcm1fc3RhdGVfa2Vybih4MSkpIHsKKwkJeGZybV9zdGF0ZV9wdXQoeDEpOworCQllcnIgPSAtRUVYSVNUOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoeDEtPmttLnN0YXRlID09IFhGUk1fU1RBVEVfQUNRKSB7CisJCV9feGZybV9zdGF0ZV9pbnNlcnQoeCk7CisJCXggPSBOVUxMOworCX0KKwllcnIgPSAwOworCitvdXQ6CisJc3Bpbl91bmxvY2tfYmgoJnhmcm1fc3RhdGVfbG9jayk7CisJeGZybV9zdGF0ZV9wdXRfYWZpbmZvKGFmaW5mbyk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKCF4KSB7CisJCXhmcm1fc3RhdGVfZGVsZXRlKHgxKTsKKwkJeGZybV9zdGF0ZV9wdXQoeDEpOworCQlyZXR1cm4gMDsKKwl9CisKKwllcnIgPSAtRUlOVkFMOworCXNwaW5fbG9ja19iaCgmeDEtPmxvY2spOworCWlmIChsaWtlbHkoeDEtPmttLnN0YXRlID09IFhGUk1fU1RBVEVfVkFMSUQpKSB7CisJCWlmICh4LT5lbmNhcCAmJiB4MS0+ZW5jYXApCisJCQltZW1jcHkoeDEtPmVuY2FwLCB4LT5lbmNhcCwgc2l6ZW9mKCp4MS0+ZW5jYXApKTsKKwkJbWVtY3B5KCZ4MS0+bGZ0LCAmeC0+bGZ0LCBzaXplb2YoeDEtPmxmdCkpOworCQl4MS0+a20uZHlpbmcgPSAwOworCisJCWlmICghbW9kX3RpbWVyKCZ4MS0+dGltZXIsIGppZmZpZXMgKyBIWikpCisJCQl4ZnJtX3N0YXRlX2hvbGQoeDEpOworCQlpZiAoeDEtPmN1cmxmdC51c2VfdGltZSkKKwkJCXhmcm1fc3RhdGVfY2hlY2tfZXhwaXJlKHgxKTsKKworCQllcnIgPSAwOworCX0KKwlzcGluX3VubG9ja19iaCgmeDEtPmxvY2spOworCisJeGZybV9zdGF0ZV9wdXQoeDEpOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woeGZybV9zdGF0ZV91cGRhdGUpOworCitpbnQgeGZybV9zdGF0ZV9jaGVja19leHBpcmUoc3RydWN0IHhmcm1fc3RhdGUgKngpCit7CisJaWYgKCF4LT5jdXJsZnQudXNlX3RpbWUpCisJCXgtPmN1cmxmdC51c2VfdGltZSA9ICh1bnNpZ25lZCBsb25nKXh0aW1lLnR2X3NlYzsKKworCWlmICh4LT5rbS5zdGF0ZSAhPSBYRlJNX1NUQVRFX1ZBTElEKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh4LT5jdXJsZnQuYnl0ZXMgPj0geC0+bGZ0LmhhcmRfYnl0ZV9saW1pdCB8fAorCSAgICB4LT5jdXJsZnQucGFja2V0cyA+PSB4LT5sZnQuaGFyZF9wYWNrZXRfbGltaXQpIHsKKwkJa21fc3RhdGVfZXhwaXJlZCh4LCAxKTsKKwkJaWYgKCFtb2RfdGltZXIoJngtPnRpbWVyLCBqaWZmaWVzICsgWEZSTV9BQ1FfRVhQSVJFUypIWikpCisJCQl4ZnJtX3N0YXRlX2hvbGQoeCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgheC0+a20uZHlpbmcgJiYKKwkgICAgKHgtPmN1cmxmdC5ieXRlcyA+PSB4LT5sZnQuc29mdF9ieXRlX2xpbWl0IHx8CisJICAgICB4LT5jdXJsZnQucGFja2V0cyA+PSB4LT5sZnQuc29mdF9wYWNrZXRfbGltaXQpKQorCQlrbV9zdGF0ZV9leHBpcmVkKHgsIDApOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh4ZnJtX3N0YXRlX2NoZWNrX2V4cGlyZSk7CisKK3N0YXRpYyBpbnQgeGZybV9zdGF0ZV9jaGVja19zcGFjZShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgbmhlYWQgPSB4LT5wcm9wcy5oZWFkZXJfbGVuICsgTExfUkVTRVJWRURfU1BBQ0Uoc2tiLT5kc3QtPmRldikKKwkJLSBza2JfaGVhZHJvb20oc2tiKTsKKworCWlmIChuaGVhZCA+IDApCisJCXJldHVybiBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgbmhlYWQsIDAsIEdGUF9BVE9NSUMpOworCisJLyogQ2hlY2sgdGFpbCB0b28uLi4gKi8KKwlyZXR1cm4gMDsKK30KKworaW50IHhmcm1fc3RhdGVfY2hlY2soc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGVyciA9IHhmcm1fc3RhdGVfY2hlY2tfZXhwaXJlKHgpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycjsKKwllcnIgPSB4ZnJtX3N0YXRlX2NoZWNrX3NwYWNlKHgsIHNrYik7CitlcnI6CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woeGZybV9zdGF0ZV9jaGVjayk7CisKK3N0cnVjdCB4ZnJtX3N0YXRlICoKK3hmcm1fc3RhdGVfbG9va3VwKHhmcm1fYWRkcmVzc190ICpkYWRkciwgdTMyIHNwaSwgdTggcHJvdG8sCisJCSAgdW5zaWduZWQgc2hvcnQgZmFtaWx5KQoreworCXN0cnVjdCB4ZnJtX3N0YXRlICp4OworCXN0cnVjdCB4ZnJtX3N0YXRlX2FmaW5mbyAqYWZpbmZvID0geGZybV9zdGF0ZV9nZXRfYWZpbmZvKGZhbWlseSk7CisJaWYgKCFhZmluZm8pCisJCXJldHVybiBOVUxMOworCisJc3Bpbl9sb2NrX2JoKCZ4ZnJtX3N0YXRlX2xvY2spOworCXggPSBhZmluZm8tPnN0YXRlX2xvb2t1cChkYWRkciwgc3BpLCBwcm90byk7CisJc3Bpbl91bmxvY2tfYmgoJnhmcm1fc3RhdGVfbG9jayk7CisJeGZybV9zdGF0ZV9wdXRfYWZpbmZvKGFmaW5mbyk7CisJcmV0dXJuIHg7Cit9CitFWFBPUlRfU1lNQk9MKHhmcm1fc3RhdGVfbG9va3VwKTsKKworc3RydWN0IHhmcm1fc3RhdGUgKgoreGZybV9maW5kX2FjcSh1OCBtb2RlLCB1MzIgcmVxaWQsIHU4IHByb3RvLCAKKwkgICAgICB4ZnJtX2FkZHJlc3NfdCAqZGFkZHIsIHhmcm1fYWRkcmVzc190ICpzYWRkciwgCisJICAgICAgaW50IGNyZWF0ZSwgdW5zaWduZWQgc2hvcnQgZmFtaWx5KQoreworCXN0cnVjdCB4ZnJtX3N0YXRlICp4OworCXN0cnVjdCB4ZnJtX3N0YXRlX2FmaW5mbyAqYWZpbmZvID0geGZybV9zdGF0ZV9nZXRfYWZpbmZvKGZhbWlseSk7CisJaWYgKCFhZmluZm8pCisJCXJldHVybiBOVUxMOworCisJc3Bpbl9sb2NrX2JoKCZ4ZnJtX3N0YXRlX2xvY2spOworCXggPSBhZmluZm8tPmZpbmRfYWNxKG1vZGUsIHJlcWlkLCBwcm90bywgZGFkZHIsIHNhZGRyLCBjcmVhdGUpOworCXNwaW5fdW5sb2NrX2JoKCZ4ZnJtX3N0YXRlX2xvY2spOworCXhmcm1fc3RhdGVfcHV0X2FmaW5mbyhhZmluZm8pOworCXJldHVybiB4OworfQorRVhQT1JUX1NZTUJPTCh4ZnJtX2ZpbmRfYWNxKTsKKworLyogU2lsbHkgZW5vdWdoLCBidXQgSSdtIGxhenkgdG8gYnVpbGQgcmVzb2x1dGlvbiBsaXN0ICovCisKK3N0YXRpYyBzdHJ1Y3QgeGZybV9zdGF0ZSAqX194ZnJtX2ZpbmRfYWNxX2J5c2VxKHUzMiBzZXEpCit7CisJaW50IGk7CisJc3RydWN0IHhmcm1fc3RhdGUgKng7CisKKwlmb3IgKGkgPSAwOyBpIDwgWEZSTV9EU1RfSFNJWkU7IGkrKykgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHgsIHhmcm1fc3RhdGVfYnlkc3QraSwgYnlkc3QpIHsKKwkJCWlmICh4LT5rbS5zZXEgPT0gc2VxICYmIHgtPmttLnN0YXRlID09IFhGUk1fU1RBVEVfQUNRKSB7CisJCQkJeGZybV9zdGF0ZV9ob2xkKHgpOworCQkJCXJldHVybiB4OworCQkJfQorCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgeGZybV9zdGF0ZSAqeGZybV9maW5kX2FjcV9ieXNlcSh1MzIgc2VxKQoreworCXN0cnVjdCB4ZnJtX3N0YXRlICp4OworCisJc3Bpbl9sb2NrX2JoKCZ4ZnJtX3N0YXRlX2xvY2spOworCXggPSBfX3hmcm1fZmluZF9hY3FfYnlzZXEoc2VxKTsKKwlzcGluX3VubG9ja19iaCgmeGZybV9zdGF0ZV9sb2NrKTsKKwlyZXR1cm4geDsKK30KK0VYUE9SVF9TWU1CT0woeGZybV9maW5kX2FjcV9ieXNlcSk7CisKK3UzMiB4ZnJtX2dldF9hY3FzZXEodm9pZCkKK3sKKwl1MzIgcmVzOworCXN0YXRpYyB1MzIgYWNxc2VxOworCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWNxc2VxX2xvY2spOworCisJc3Bpbl9sb2NrX2JoKCZhY3FzZXFfbG9jayk7CisJcmVzID0gKCsrYWNxc2VxID8gOiArK2FjcXNlcSk7CisJc3Bpbl91bmxvY2tfYmgoJmFjcXNlcV9sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorRVhQT1JUX1NZTUJPTCh4ZnJtX2dldF9hY3FzZXEpOworCit2b2lkCit4ZnJtX2FsbG9jX3NwaShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgdTMyIG1pbnNwaSwgdTMyIG1heHNwaSkKK3sKKwl1MzIgaDsKKwlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDA7CisKKwlpZiAoeC0+aWQuc3BpKQorCQlyZXR1cm47CisKKwlpZiAobWluc3BpID09IG1heHNwaSkgeworCQl4MCA9IHhmcm1fc3RhdGVfbG9va3VwKCZ4LT5pZC5kYWRkciwgbWluc3BpLCB4LT5pZC5wcm90bywgeC0+cHJvcHMuZmFtaWx5KTsKKwkJaWYgKHgwKSB7CisJCQl4ZnJtX3N0YXRlX3B1dCh4MCk7CisJCQlyZXR1cm47CisJCX0KKwkJeC0+aWQuc3BpID0gbWluc3BpOworCX0gZWxzZSB7CisJCXUzMiBzcGkgPSAwOworCQltaW5zcGkgPSBudG9obChtaW5zcGkpOworCQltYXhzcGkgPSBudG9obChtYXhzcGkpOworCQlmb3IgKGg9MDsgaDxtYXhzcGktbWluc3BpKzE7IGgrKykgeworCQkJc3BpID0gbWluc3BpICsgbmV0X3JhbmRvbSgpJShtYXhzcGktbWluc3BpKzEpOworCQkJeDAgPSB4ZnJtX3N0YXRlX2xvb2t1cCgmeC0+aWQuZGFkZHIsIGh0b25sKHNwaSksIHgtPmlkLnByb3RvLCB4LT5wcm9wcy5mYW1pbHkpOworCQkJaWYgKHgwID09IE5VTEwpIHsKKwkJCQl4LT5pZC5zcGkgPSBodG9ubChzcGkpOworCQkJCWJyZWFrOworCQkJfQorCQkJeGZybV9zdGF0ZV9wdXQoeDApOworCQl9CisJfQorCWlmICh4LT5pZC5zcGkpIHsKKwkJc3Bpbl9sb2NrX2JoKCZ4ZnJtX3N0YXRlX2xvY2spOworCQloID0geGZybV9zcGlfaGFzaCgmeC0+aWQuZGFkZHIsIHgtPmlkLnNwaSwgeC0+aWQucHJvdG8sIHgtPnByb3BzLmZhbWlseSk7CisJCWxpc3RfYWRkKCZ4LT5ieXNwaSwgeGZybV9zdGF0ZV9ieXNwaStoKTsKKwkJeGZybV9zdGF0ZV9ob2xkKHgpOworCQlzcGluX3VubG9ja19iaCgmeGZybV9zdGF0ZV9sb2NrKTsKKwkJd2FrZV91cCgma21fd2FpdHEpOworCX0KK30KK0VYUE9SVF9TWU1CT0woeGZybV9hbGxvY19zcGkpOworCitpbnQgeGZybV9zdGF0ZV93YWxrKHU4IHByb3RvLCBpbnQgKCpmdW5jKShzdHJ1Y3QgeGZybV9zdGF0ZSAqLCBpbnQsIHZvaWQqKSwKKwkJICAgIHZvaWQgKmRhdGEpCit7CisJaW50IGk7CisJc3RydWN0IHhmcm1fc3RhdGUgKng7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgZXJyID0gMDsKKworCXNwaW5fbG9ja19iaCgmeGZybV9zdGF0ZV9sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgWEZSTV9EU1RfSFNJWkU7IGkrKykgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHgsIHhmcm1fc3RhdGVfYnlkc3QraSwgYnlkc3QpIHsKKwkJCWlmIChwcm90byA9PSBJUFNFQ19QUk9UT19BTlkgfHwgeC0+aWQucHJvdG8gPT0gcHJvdG8pCisJCQkJY291bnQrKzsKKwkJfQorCX0KKwlpZiAoY291bnQgPT0gMCkgeworCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgWEZSTV9EU1RfSFNJWkU7IGkrKykgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHgsIHhmcm1fc3RhdGVfYnlkc3QraSwgYnlkc3QpIHsKKwkJCWlmIChwcm90byAhPSBJUFNFQ19QUk9UT19BTlkgJiYgeC0+aWQucHJvdG8gIT0gcHJvdG8pCisJCQkJY29udGludWU7CisJCQllcnIgPSBmdW5jKHgsIC0tY291bnQsIGRhdGEpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIG91dDsKKwkJfQorCX0KK291dDoKKwlzcGluX3VubG9ja19iaCgmeGZybV9zdGF0ZV9sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTCh4ZnJtX3N0YXRlX3dhbGspOworCitpbnQgeGZybV9yZXBsYXlfY2hlY2soc3RydWN0IHhmcm1fc3RhdGUgKngsIHUzMiBzZXEpCit7CisJdTMyIGRpZmY7CisKKwlzZXEgPSBudG9obChzZXEpOworCisJaWYgKHVubGlrZWx5KHNlcSA9PSAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobGlrZWx5KHNlcSA+IHgtPnJlcGxheS5zZXEpKQorCQlyZXR1cm4gMDsKKworCWRpZmYgPSB4LT5yZXBsYXkuc2VxIC0gc2VxOworCWlmIChkaWZmID49IHgtPnByb3BzLnJlcGxheV93aW5kb3cpIHsKKwkJeC0+c3RhdHMucmVwbGF5X3dpbmRvdysrOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoeC0+cmVwbGF5LmJpdG1hcCAmICgxVSA8PCBkaWZmKSkgeworCQl4LT5zdGF0cy5yZXBsYXkrKzsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh4ZnJtX3JlcGxheV9jaGVjayk7CisKK3ZvaWQgeGZybV9yZXBsYXlfYWR2YW5jZShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgdTMyIHNlcSkKK3sKKwl1MzIgZGlmZjsKKworCXNlcSA9IG50b2hsKHNlcSk7CisKKwlpZiAoc2VxID4geC0+cmVwbGF5LnNlcSkgeworCQlkaWZmID0gc2VxIC0geC0+cmVwbGF5LnNlcTsKKwkJaWYgKGRpZmYgPCB4LT5wcm9wcy5yZXBsYXlfd2luZG93KQorCQkJeC0+cmVwbGF5LmJpdG1hcCA9ICgoeC0+cmVwbGF5LmJpdG1hcCkgPDwgZGlmZikgfCAxOworCQllbHNlCisJCQl4LT5yZXBsYXkuYml0bWFwID0gMTsKKwkJeC0+cmVwbGF5LnNlcSA9IHNlcTsKKwl9IGVsc2UgeworCQlkaWZmID0geC0+cmVwbGF5LnNlcSAtIHNlcTsKKwkJeC0+cmVwbGF5LmJpdG1hcCB8PSAoMVUgPDwgZGlmZik7CisJfQorfQorRVhQT1JUX1NZTUJPTCh4ZnJtX3JlcGxheV9hZHZhbmNlKTsKKworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgeGZybV9rbV9saXN0ID0gTElTVF9IRUFEX0lOSVQoeGZybV9rbV9saXN0KTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKHhmcm1fa21fbG9jayk7CisKK3N0YXRpYyB2b2lkIGttX3N0YXRlX2V4cGlyZWQoc3RydWN0IHhmcm1fc3RhdGUgKngsIGludCBoYXJkKQoreworCXN0cnVjdCB4ZnJtX21nciAqa207CisKKwlpZiAoaGFyZCkKKwkJeC0+a20uc3RhdGUgPSBYRlJNX1NUQVRFX0VYUElSRUQ7CisJZWxzZQorCQl4LT5rbS5keWluZyA9IDE7CisKKwlyZWFkX2xvY2soJnhmcm1fa21fbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShrbSwgJnhmcm1fa21fbGlzdCwgbGlzdCkKKwkJa20tPm5vdGlmeSh4LCBoYXJkKTsKKwlyZWFkX3VubG9jaygmeGZybV9rbV9sb2NrKTsKKworCWlmIChoYXJkKQorCQl3YWtlX3VwKCZrbV93YWl0cSk7Cit9CisKK3N0YXRpYyBpbnQga21fcXVlcnkoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCB4ZnJtX3RtcGwgKnQsIHN0cnVjdCB4ZnJtX3BvbGljeSAqcG9sKQoreworCWludCBlcnIgPSAtRUlOVkFMOworCXN0cnVjdCB4ZnJtX21nciAqa207CisKKwlyZWFkX2xvY2soJnhmcm1fa21fbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShrbSwgJnhmcm1fa21fbGlzdCwgbGlzdCkgeworCQllcnIgPSBrbS0+YWNxdWlyZSh4LCB0LCBwb2wsIFhGUk1fUE9MSUNZX09VVCk7CisJCWlmICghZXJyKQorCQkJYnJlYWs7CisJfQorCXJlYWRfdW5sb2NrKCZ4ZnJtX2ttX2xvY2spOworCXJldHVybiBlcnI7Cit9CisKK2ludCBrbV9uZXdfbWFwcGluZyhzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgeGZybV9hZGRyZXNzX3QgKmlwYWRkciwgdTE2IHNwb3J0KQoreworCWludCBlcnIgPSAtRUlOVkFMOworCXN0cnVjdCB4ZnJtX21nciAqa207CisKKwlyZWFkX2xvY2soJnhmcm1fa21fbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShrbSwgJnhmcm1fa21fbGlzdCwgbGlzdCkgeworCQlpZiAoa20tPm5ld19tYXBwaW5nKQorCQkJZXJyID0ga20tPm5ld19tYXBwaW5nKHgsIGlwYWRkciwgc3BvcnQpOworCQlpZiAoIWVycikKKwkJCWJyZWFrOworCX0KKwlyZWFkX3VubG9jaygmeGZybV9rbV9sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChrbV9uZXdfbWFwcGluZyk7CisKK3ZvaWQga21fcG9saWN5X2V4cGlyZWQoc3RydWN0IHhmcm1fcG9saWN5ICpwb2wsIGludCBkaXIsIGludCBoYXJkKQoreworCXN0cnVjdCB4ZnJtX21nciAqa207CisKKwlyZWFkX2xvY2soJnhmcm1fa21fbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShrbSwgJnhmcm1fa21fbGlzdCwgbGlzdCkKKwkJaWYgKGttLT5ub3RpZnlfcG9saWN5KQorCQkJa20tPm5vdGlmeV9wb2xpY3kocG9sLCBkaXIsIGhhcmQpOworCXJlYWRfdW5sb2NrKCZ4ZnJtX2ttX2xvY2spOworCisJaWYgKGhhcmQpCisJCXdha2VfdXAoJmttX3dhaXRxKTsKK30KKworaW50IHhmcm1fdXNlcl9wb2xpY3koc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgdTggX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCit7CisJaW50IGVycjsKKwl1OCAqZGF0YTsKKwlzdHJ1Y3QgeGZybV9tZ3IgKmttOworCXN0cnVjdCB4ZnJtX3BvbGljeSAqcG9sID0gTlVMTDsKKworCWlmIChvcHRsZW4gPD0gMCB8fCBvcHRsZW4gPiBQQUdFX1NJWkUpCisJCXJldHVybiAtRU1TR1NJWkU7CisKKwlkYXRhID0ga21hbGxvYyhvcHRsZW4sIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllcnIgPSAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcihkYXRhLCBvcHR2YWwsIG9wdGxlbikpCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVJTlZBTDsKKwlyZWFkX2xvY2soJnhmcm1fa21fbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShrbSwgJnhmcm1fa21fbGlzdCwgbGlzdCkgeworCQlwb2wgPSBrbS0+Y29tcGlsZV9wb2xpY3koc2stPnNrX2ZhbWlseSwgb3B0bmFtZSwgZGF0YSwKKwkJCQkJIG9wdGxlbiwgJmVycik7CisJCWlmIChlcnIgPj0gMCkKKwkJCWJyZWFrOworCX0KKwlyZWFkX3VubG9jaygmeGZybV9rbV9sb2NrKTsKKworCWlmIChlcnIgPj0gMCkgeworCQl4ZnJtX3NrX3BvbGljeV9pbnNlcnQoc2ssIGVyciwgcG9sKTsKKwkJeGZybV9wb2xfcHV0KHBvbCk7CisJCWVyciA9IDA7CisJfQorCitvdXQ6CisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woeGZybV91c2VyX3BvbGljeSk7CisKK2ludCB4ZnJtX3JlZ2lzdGVyX2ttKHN0cnVjdCB4ZnJtX21nciAqa20pCit7CisJd3JpdGVfbG9ja19iaCgmeGZybV9rbV9sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZrbS0+bGlzdCwgJnhmcm1fa21fbGlzdCk7CisJd3JpdGVfdW5sb2NrX2JoKCZ4ZnJtX2ttX2xvY2spOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh4ZnJtX3JlZ2lzdGVyX2ttKTsKKworaW50IHhmcm1fdW5yZWdpc3Rlcl9rbShzdHJ1Y3QgeGZybV9tZ3IgKmttKQoreworCXdyaXRlX2xvY2tfYmgoJnhmcm1fa21fbG9jayk7CisJbGlzdF9kZWwoJmttLT5saXN0KTsKKwl3cml0ZV91bmxvY2tfYmgoJnhmcm1fa21fbG9jayk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHhmcm1fdW5yZWdpc3Rlcl9rbSk7CisKK2ludCB4ZnJtX3N0YXRlX3JlZ2lzdGVyX2FmaW5mbyhzdHJ1Y3QgeGZybV9zdGF0ZV9hZmluZm8gKmFmaW5mbykKK3sKKwlpbnQgZXJyID0gMDsKKwlpZiAodW5saWtlbHkoYWZpbmZvID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodW5saWtlbHkoYWZpbmZvLT5mYW1pbHkgPj0gTlBST1RPKSkKKwkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisJd3JpdGVfbG9jaygmeGZybV9zdGF0ZV9hZmluZm9fbG9jayk7CisJaWYgKHVubGlrZWx5KHhmcm1fc3RhdGVfYWZpbmZvW2FmaW5mby0+ZmFtaWx5XSAhPSBOVUxMKSkKKwkJZXJyID0gLUVOT0JVRlM7CisJZWxzZSB7CisJCWFmaW5mby0+c3RhdGVfYnlkc3QgPSB4ZnJtX3N0YXRlX2J5ZHN0OworCQlhZmluZm8tPnN0YXRlX2J5c3BpID0geGZybV9zdGF0ZV9ieXNwaTsKKwkJeGZybV9zdGF0ZV9hZmluZm9bYWZpbmZvLT5mYW1pbHldID0gYWZpbmZvOworCX0KKwl3cml0ZV91bmxvY2soJnhmcm1fc3RhdGVfYWZpbmZvX2xvY2spOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKHhmcm1fc3RhdGVfcmVnaXN0ZXJfYWZpbmZvKTsKKworaW50IHhmcm1fc3RhdGVfdW5yZWdpc3Rlcl9hZmluZm8oc3RydWN0IHhmcm1fc3RhdGVfYWZpbmZvICphZmluZm8pCit7CisJaW50IGVyciA9IDA7CisJaWYgKHVubGlrZWx5KGFmaW5mbyA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHVubGlrZWx5KGFmaW5mby0+ZmFtaWx5ID49IE5QUk9UTykpCisJCXJldHVybiAtRUFGTk9TVVBQT1JUOworCXdyaXRlX2xvY2soJnhmcm1fc3RhdGVfYWZpbmZvX2xvY2spOworCWlmIChsaWtlbHkoeGZybV9zdGF0ZV9hZmluZm9bYWZpbmZvLT5mYW1pbHldICE9IE5VTEwpKSB7CisJCWlmICh1bmxpa2VseSh4ZnJtX3N0YXRlX2FmaW5mb1thZmluZm8tPmZhbWlseV0gIT0gYWZpbmZvKSkKKwkJCWVyciA9IC1FSU5WQUw7CisJCWVsc2UgeworCQkJeGZybV9zdGF0ZV9hZmluZm9bYWZpbmZvLT5mYW1pbHldID0gTlVMTDsKKwkJCWFmaW5mby0+c3RhdGVfYnlzcGkgPSBOVUxMOworCQkJYWZpbmZvLT5zdGF0ZV9ieWRzdCA9IE5VTEw7CisJCX0KKwl9CisJd3JpdGVfdW5sb2NrKCZ4ZnJtX3N0YXRlX2FmaW5mb19sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTCh4ZnJtX3N0YXRlX3VucmVnaXN0ZXJfYWZpbmZvKTsKKworc3RhdGljIHN0cnVjdCB4ZnJtX3N0YXRlX2FmaW5mbyAqeGZybV9zdGF0ZV9nZXRfYWZpbmZvKHVuc2lnbmVkIHNob3J0IGZhbWlseSkKK3sKKwlzdHJ1Y3QgeGZybV9zdGF0ZV9hZmluZm8gKmFmaW5mbzsKKwlpZiAodW5saWtlbHkoZmFtaWx5ID49IE5QUk9UTykpCisJCXJldHVybiBOVUxMOworCXJlYWRfbG9jaygmeGZybV9zdGF0ZV9hZmluZm9fbG9jayk7CisJYWZpbmZvID0geGZybV9zdGF0ZV9hZmluZm9bZmFtaWx5XTsKKwlpZiAobGlrZWx5KGFmaW5mbyAhPSBOVUxMKSkKKwkJcmVhZF9sb2NrKCZhZmluZm8tPmxvY2spOworCXJlYWRfdW5sb2NrKCZ4ZnJtX3N0YXRlX2FmaW5mb19sb2NrKTsKKwlyZXR1cm4gYWZpbmZvOworfQorCitzdGF0aWMgdm9pZCB4ZnJtX3N0YXRlX3B1dF9hZmluZm8oc3RydWN0IHhmcm1fc3RhdGVfYWZpbmZvICphZmluZm8pCit7CisJaWYgKHVubGlrZWx5KGFmaW5mbyA9PSBOVUxMKSkKKwkJcmV0dXJuOworCXJlYWRfdW5sb2NrKCZhZmluZm8tPmxvY2spOworfQorCisvKiBUZW1wb3JhcmlseSBsb2NhdGVkIGhlcmUgdW50aWwgbmV0L3hmcm0veGZybV90dW5uZWwuYyBpcyBjcmVhdGVkICovCit2b2lkIHhmcm1fc3RhdGVfZGVsZXRlX3R1bm5lbChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCkKK3sKKwlpZiAoeC0+dHVubmVsKSB7CisJCXN0cnVjdCB4ZnJtX3N0YXRlICp0ID0geC0+dHVubmVsOworCisJCWlmIChhdG9taWNfcmVhZCgmdC0+dHVubmVsX3VzZXJzKSA9PSAyKQorCQkJeGZybV9zdGF0ZV9kZWxldGUodCk7CisJCWF0b21pY19kZWMoJnQtPnR1bm5lbF91c2Vycyk7CisJCXhmcm1fc3RhdGVfcHV0KHQpOworCQl4LT50dW5uZWwgPSBOVUxMOworCX0KK30KK0VYUE9SVF9TWU1CT0woeGZybV9zdGF0ZV9kZWxldGVfdHVubmVsKTsKKworaW50IHhmcm1fc3RhdGVfbXR1KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBpbnQgbXR1KQoreworCWludCByZXMgPSBtdHU7CisKKwlyZXMgLT0geC0+cHJvcHMuaGVhZGVyX2xlbjsKKworCWZvciAoOzspIHsKKwkJaW50IG0gPSByZXM7CisKKwkJaWYgKG0gPCA2OCkKKwkJCXJldHVybiA2ODsKKworCQlzcGluX2xvY2tfYmgoJngtPmxvY2spOworCQlpZiAoeC0+a20uc3RhdGUgPT0gWEZSTV9TVEFURV9WQUxJRCAmJgorCQkgICAgeC0+dHlwZSAmJiB4LT50eXBlLT5nZXRfbWF4X3NpemUpCisJCQltID0geC0+dHlwZS0+Z2V0X21heF9zaXplKHgsIG0pOworCQllbHNlCisJCQltICs9IHgtPnByb3BzLmhlYWRlcl9sZW47CisJCXNwaW5fdW5sb2NrX2JoKCZ4LT5sb2NrKTsKKworCQlpZiAobSA8PSBtdHUpCisJCQlicmVhazsKKwkJcmVzIC09IChtIC0gbXR1KTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCitFWFBPUlRfU1lNQk9MKHhmcm1fc3RhdGVfbXR1KTsKKyAKK3ZvaWQgX19pbml0IHhmcm1fc3RhdGVfaW5pdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpPTA7IGk8WEZSTV9EU1RfSFNJWkU7IGkrKykgeworCQlJTklUX0xJU1RfSEVBRCgmeGZybV9zdGF0ZV9ieWRzdFtpXSk7CisJCUlOSVRfTElTVF9IRUFEKCZ4ZnJtX3N0YXRlX2J5c3BpW2ldKTsKKwl9CisJSU5JVF9XT1JLKCZ4ZnJtX3N0YXRlX2djX3dvcmssIHhmcm1fc3RhdGVfZ2NfdGFzaywgTlVMTCk7Cit9CisKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fdXNlci5jIGIvbmV0L3hmcm0veGZybV91c2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM2NjFiMAotLS0gL2Rldi9udWxsCisrKyBiL25ldC94ZnJtL3hmcm1fdXNlci5jCkBAIC0wLDAgKzEsMTI1MyBAQAorLyogeGZybV91c2VyLmM6IFVzZXIgaW50ZXJmYWNlIHRvIGNvbmZpZ3VyZSB4ZnJtIGVuZ2luZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICoKKyAqIENoYW5nZXM6CisgKglNaXRzdXJ1IEtBTkRBIEBVU0FHSQorICogCUthenVub3JpIE1JWUFaQVdBIEBVU0FHSQorICogCUt1bmloaXJvIElzaGlndXJvIDxrdW5paGlyb0BpcGluZnVzaW9uLmNvbT4KKyAqIAkJSVB2NiBzdXBwb3J0CisgKiAJCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9wZmtleXYyLmg+CisjaW5jbHVkZSA8bGludXgvaXBzZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC94ZnJtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworc3RhdGljIHN0cnVjdCBzb2NrICp4ZnJtX25sOworCitzdGF0aWMgaW50IHZlcmlmeV9vbmVfYWxnKHN0cnVjdCBydGF0dHIgKip4ZnJtYSwgZW51bSB4ZnJtX2F0dHJfdHlwZV90IHR5cGUpCit7CisJc3RydWN0IHJ0YXR0ciAqcnQgPSB4ZnJtYVt0eXBlIC0gMV07CisJc3RydWN0IHhmcm1fYWxnbyAqYWxncDsKKworCWlmICghcnQpCisJCXJldHVybiAwOworCisJaWYgKChydC0+cnRhX2xlbiAtIHNpemVvZigqcnQpKSA8IHNpemVvZigqYWxncCkpCisJCXJldHVybiAtRUlOVkFMOworCisJYWxncCA9IFJUQV9EQVRBKHJ0KTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFhGUk1BX0FMR19BVVRIOgorCQlpZiAoIWFsZ3AtPmFsZ19rZXlfbGVuICYmCisJCSAgICBzdHJjbXAoYWxncC0+YWxnX25hbWUsICJkaWdlc3RfbnVsbCIpICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwljYXNlIFhGUk1BX0FMR19DUllQVDoKKwkJaWYgKCFhbGdwLT5hbGdfa2V5X2xlbiAmJgorCQkgICAgc3RyY21wKGFsZ3AtPmFsZ19uYW1lLCAiY2lwaGVyX251bGwiKSAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCisJY2FzZSBYRlJNQV9BTEdfQ09NUDoKKwkJLyogWmVybyBsZW5ndGgga2V5cyBhcmUgbGVnYWwuICAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX07CisKKwlhbGdwLT5hbGdfbmFtZVtDUllQVE9fTUFYX0FMR19OQU1FIC0gMV0gPSAnXDAnOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZlcmlmeV9lbmNhcF90bXBsKHN0cnVjdCBydGF0dHIgKip4ZnJtYSkKK3sKKwlzdHJ1Y3QgcnRhdHRyICpydCA9IHhmcm1hW1hGUk1BX0VOQ0FQIC0gMV07CisJc3RydWN0IHhmcm1fZW5jYXBfdG1wbCAqZW5jYXA7CisKKwlpZiAoIXJ0KQorCQlyZXR1cm4gMDsKKworCWlmICgocnQtPnJ0YV9sZW4gLSBzaXplb2YoKnJ0KSkgPCBzaXplb2YoKmVuY2FwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZXJpZnlfbmV3c2FfaW5mbyhzdHJ1Y3QgeGZybV91c2Vyc2FfaW5mbyAqcCwKKwkJCSAgICAgc3RydWN0IHJ0YXR0ciAqKnhmcm1hKQoreworCWludCBlcnI7CisKKwllcnIgPSAtRUlOVkFMOworCXN3aXRjaCAocC0+ZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlicmVhazsKKworCWNhc2UgQUZfSU5FVDY6CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJCWJyZWFrOworI2Vsc2UKKwkJZXJyID0gLUVBRk5PU1VQUE9SVDsKKwkJZ290byBvdXQ7CisjZW5kaWYKKworCWRlZmF1bHQ6CisJCWdvdG8gb3V0OworCX07CisKKwllcnIgPSAtRUlOVkFMOworCXN3aXRjaCAocC0+aWQucHJvdG8pIHsKKwljYXNlIElQUFJPVE9fQUg6CisJCWlmICgheGZybWFbWEZSTUFfQUxHX0FVVEgtMV0JfHwKKwkJICAgIHhmcm1hW1hGUk1BX0FMR19DUllQVC0xXQl8fAorCQkgICAgeGZybWFbWEZSTUFfQUxHX0NPTVAtMV0pCisJCQlnb3RvIG91dDsKKwkJYnJlYWs7CisKKwljYXNlIElQUFJPVE9fRVNQOgorCQlpZiAoKCF4ZnJtYVtYRlJNQV9BTEdfQVVUSC0xXSAmJgorCQkgICAgICF4ZnJtYVtYRlJNQV9BTEdfQ1JZUFQtMV0pCXx8CisJCSAgICB4ZnJtYVtYRlJNQV9BTEdfQ09NUC0xXSkKKwkJCWdvdG8gb3V0OworCQlicmVhazsKKworCWNhc2UgSVBQUk9UT19DT01QOgorCQlpZiAoIXhmcm1hW1hGUk1BX0FMR19DT01QLTFdCXx8CisJCSAgICB4ZnJtYVtYRlJNQV9BTEdfQVVUSC0xXQl8fAorCQkgICAgeGZybWFbWEZSTUFfQUxHX0NSWVBULTFdKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZ290byBvdXQ7CisJfTsKKworCWlmICgoZXJyID0gdmVyaWZ5X29uZV9hbGcoeGZybWEsIFhGUk1BX0FMR19BVVRIKSkpCisJCWdvdG8gb3V0OworCWlmICgoZXJyID0gdmVyaWZ5X29uZV9hbGcoeGZybWEsIFhGUk1BX0FMR19DUllQVCkpKQorCQlnb3RvIG91dDsKKwlpZiAoKGVyciA9IHZlcmlmeV9vbmVfYWxnKHhmcm1hLCBYRlJNQV9BTEdfQ09NUCkpKQorCQlnb3RvIG91dDsKKwlpZiAoKGVyciA9IHZlcmlmeV9lbmNhcF90bXBsKHhmcm1hKSkpCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVJTlZBTDsKKwlzd2l0Y2ggKHAtPm1vZGUpIHsKKwljYXNlIDA6CisJY2FzZSAxOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWdvdG8gb3V0OworCX07CisKKwllcnIgPSAwOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBhdHRhY2hfb25lX2FsZ28oc3RydWN0IHhmcm1fYWxnbyAqKmFsZ3BwLCB1OCAqcHJvcHMsCisJCQkgICBzdHJ1Y3QgeGZybV9hbGdvX2Rlc2MgKigqZ2V0X2J5bmFtZSkoY2hhciAqLCBpbnQpLAorCQkJICAgc3RydWN0IHJ0YXR0ciAqdV9hcmcpCit7CisJc3RydWN0IHJ0YXR0ciAqcnRhID0gdV9hcmc7CisJc3RydWN0IHhmcm1fYWxnbyAqcCwgKnVhbGc7CisJc3RydWN0IHhmcm1fYWxnb19kZXNjICphbGdvOworCisJaWYgKCFydGEpCisJCXJldHVybiAwOworCisJdWFsZyA9IFJUQV9EQVRBKHJ0YSk7CisKKwlhbGdvID0gZ2V0X2J5bmFtZSh1YWxnLT5hbGdfbmFtZSwgMSk7CisJaWYgKCFhbGdvKQorCQlyZXR1cm4gLUVOT1NZUzsKKwkqcHJvcHMgPSBhbGdvLT5kZXNjLnNhZGJfYWxnX2lkOworCisJcCA9IGttYWxsb2Moc2l6ZW9mKCp1YWxnKSArIHVhbGctPmFsZ19rZXlfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXApCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtY3B5KHAsIHVhbGcsIHNpemVvZigqdWFsZykgKyB1YWxnLT5hbGdfa2V5X2xlbik7CisJKmFsZ3BwID0gcDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdHRhY2hfZW5jYXBfdG1wbChzdHJ1Y3QgeGZybV9lbmNhcF90bXBsICoqZW5jYXBwLCBzdHJ1Y3QgcnRhdHRyICp1X2FyZykKK3sKKwlzdHJ1Y3QgcnRhdHRyICpydGEgPSB1X2FyZzsKKwlzdHJ1Y3QgeGZybV9lbmNhcF90bXBsICpwLCAqdWVuY2FwOworCisJaWYgKCFydGEpCisJCXJldHVybiAwOworCisJdWVuY2FwID0gUlRBX0RBVEEocnRhKTsKKwlwID0ga21hbGxvYyhzaXplb2YoKnApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXApCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtY3B5KHAsIHVlbmNhcCwgc2l6ZW9mKCpwKSk7CisJKmVuY2FwcCA9IHA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlfZnJvbV91c2VyX3N0YXRlKHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBzdHJ1Y3QgeGZybV91c2Vyc2FfaW5mbyAqcCkKK3sKKwltZW1jcHkoJngtPmlkLCAmcC0+aWQsIHNpemVvZih4LT5pZCkpOworCW1lbWNweSgmeC0+c2VsLCAmcC0+c2VsLCBzaXplb2YoeC0+c2VsKSk7CisJbWVtY3B5KCZ4LT5sZnQsICZwLT5sZnQsIHNpemVvZih4LT5sZnQpKTsKKwl4LT5wcm9wcy5tb2RlID0gcC0+bW9kZTsKKwl4LT5wcm9wcy5yZXBsYXlfd2luZG93ID0gcC0+cmVwbGF5X3dpbmRvdzsKKwl4LT5wcm9wcy5yZXFpZCA9IHAtPnJlcWlkOworCXgtPnByb3BzLmZhbWlseSA9IHAtPmZhbWlseTsKKwl4LT5wcm9wcy5zYWRkciA9IHAtPnNhZGRyOworCXgtPnByb3BzLmZsYWdzID0gcC0+ZmxhZ3M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeGZybV9zdGF0ZSAqeGZybV9zdGF0ZV9jb25zdHJ1Y3Qoc3RydWN0IHhmcm1fdXNlcnNhX2luZm8gKnAsCisJCQkJCSAgICAgICBzdHJ1Y3QgcnRhdHRyICoqeGZybWEsCisJCQkJCSAgICAgICBpbnQgKmVycnApCit7CisJc3RydWN0IHhmcm1fc3RhdGUgKnggPSB4ZnJtX3N0YXRlX2FsbG9jKCk7CisJaW50IGVyciA9IC1FTk9NRU07CisKKwlpZiAoIXgpCisJCWdvdG8gZXJyb3Jfbm9fcHV0OworCisJY29weV9mcm9tX3VzZXJfc3RhdGUoeCwgcCk7CisKKwlpZiAoKGVyciA9IGF0dGFjaF9vbmVfYWxnbygmeC0+YWFsZywgJngtPnByb3BzLmFhbGdvLAorCQkJCSAgIHhmcm1fYWFsZ19nZXRfYnluYW1lLAorCQkJCSAgIHhmcm1hW1hGUk1BX0FMR19BVVRILTFdKSkpCisJCWdvdG8gZXJyb3I7CisJaWYgKChlcnIgPSBhdHRhY2hfb25lX2FsZ28oJngtPmVhbGcsICZ4LT5wcm9wcy5lYWxnbywKKwkJCQkgICB4ZnJtX2VhbGdfZ2V0X2J5bmFtZSwKKwkJCQkgICB4ZnJtYVtYRlJNQV9BTEdfQ1JZUFQtMV0pKSkKKwkJZ290byBlcnJvcjsKKwlpZiAoKGVyciA9IGF0dGFjaF9vbmVfYWxnbygmeC0+Y2FsZywgJngtPnByb3BzLmNhbGdvLAorCQkJCSAgIHhmcm1fY2FsZ19nZXRfYnluYW1lLAorCQkJCSAgIHhmcm1hW1hGUk1BX0FMR19DT01QLTFdKSkpCisJCWdvdG8gZXJyb3I7CisJaWYgKChlcnIgPSBhdHRhY2hfZW5jYXBfdG1wbCgmeC0+ZW5jYXAsIHhmcm1hW1hGUk1BX0VOQ0FQLTFdKSkpCisJCWdvdG8gZXJyb3I7CisKKwllcnIgPSAtRU5PRU5UOworCXgtPnR5cGUgPSB4ZnJtX2dldF90eXBlKHgtPmlkLnByb3RvLCB4LT5wcm9wcy5mYW1pbHkpOworCWlmICh4LT50eXBlID09IE5VTEwpCisJCWdvdG8gZXJyb3I7CisKKwllcnIgPSB4LT50eXBlLT5pbml0X3N0YXRlKHgsIE5VTEwpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3I7CisKKwl4LT5jdXJsZnQuYWRkX3RpbWUgPSAodW5zaWduZWQgbG9uZykgeHRpbWUudHZfc2VjOworCXgtPmttLnN0YXRlID0gWEZSTV9TVEFURV9WQUxJRDsKKwl4LT5rbS5zZXEgPSBwLT5zZXE7CisKKwlyZXR1cm4geDsKKworZXJyb3I6CisJeC0+a20uc3RhdGUgPSBYRlJNX1NUQVRFX0RFQUQ7CisJeGZybV9zdGF0ZV9wdXQoeCk7CitlcnJvcl9ub19wdXQ6CisJKmVycnAgPSBlcnI7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgeGZybV9hZGRfc2Eoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKip4ZnJtYSkKK3sKKwlzdHJ1Y3QgeGZybV91c2Vyc2FfaW5mbyAqcCA9IE5MTVNHX0RBVEEobmxoKTsKKwlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDsKKwlpbnQgZXJyOworCisJZXJyID0gdmVyaWZ5X25ld3NhX2luZm8ocCwgKHN0cnVjdCBydGF0dHIgKiopIHhmcm1hKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJeCA9IHhmcm1fc3RhdGVfY29uc3RydWN0KHAsIChzdHJ1Y3QgcnRhdHRyICoqKSB4ZnJtYSwgJmVycik7CisJaWYgKCF4KQorCQlyZXR1cm4gZXJyOworCisJaWYgKG5saC0+bmxtc2dfdHlwZSA9PSBYRlJNX01TR19ORVdTQSkKKwkJZXJyID0geGZybV9zdGF0ZV9hZGQoeCk7CisJZWxzZQorCQllcnIgPSB4ZnJtX3N0YXRlX3VwZGF0ZSh4KTsKKworCWlmIChlcnIgPCAwKSB7CisJCXgtPmttLnN0YXRlID0gWEZSTV9TVEFURV9ERUFEOworCQl4ZnJtX3N0YXRlX3B1dCh4KTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHhmcm1fZGVsX3NhKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICoqeGZybWEpCit7CisJc3RydWN0IHhmcm1fc3RhdGUgKng7CisJc3RydWN0IHhmcm1fdXNlcnNhX2lkICpwID0gTkxNU0dfREFUQShubGgpOworCisJeCA9IHhmcm1fc3RhdGVfbG9va3VwKCZwLT5kYWRkciwgcC0+c3BpLCBwLT5wcm90bywgcC0+ZmFtaWx5KTsKKwlpZiAoeCA9PSBOVUxMKQorCQlyZXR1cm4gLUVTUkNIOworCisJaWYgKHhmcm1fc3RhdGVfa2Vybih4KSkgeworCQl4ZnJtX3N0YXRlX3B1dCh4KTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwl4ZnJtX3N0YXRlX2RlbGV0ZSh4KTsKKwl4ZnJtX3N0YXRlX3B1dCh4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjb3B5X3RvX3VzZXJfc3RhdGUoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCB4ZnJtX3VzZXJzYV9pbmZvICpwKQoreworCW1lbWNweSgmcC0+aWQsICZ4LT5pZCwgc2l6ZW9mKHAtPmlkKSk7CisJbWVtY3B5KCZwLT5zZWwsICZ4LT5zZWwsIHNpemVvZihwLT5zZWwpKTsKKwltZW1jcHkoJnAtPmxmdCwgJngtPmxmdCwgc2l6ZW9mKHAtPmxmdCkpOworCW1lbWNweSgmcC0+Y3VybGZ0LCAmeC0+Y3VybGZ0LCBzaXplb2YocC0+Y3VybGZ0KSk7CisJbWVtY3B5KCZwLT5zdGF0cywgJngtPnN0YXRzLCBzaXplb2YocC0+c3RhdHMpKTsKKwlwLT5zYWRkciA9IHgtPnByb3BzLnNhZGRyOworCXAtPm1vZGUgPSB4LT5wcm9wcy5tb2RlOworCXAtPnJlcGxheV93aW5kb3cgPSB4LT5wcm9wcy5yZXBsYXlfd2luZG93OworCXAtPnJlcWlkID0geC0+cHJvcHMucmVxaWQ7CisJcC0+ZmFtaWx5ID0geC0+cHJvcHMuZmFtaWx5OworCXAtPmZsYWdzID0geC0+cHJvcHMuZmxhZ3M7CisJcC0+c2VxID0geC0+a20uc2VxOworfQorCitzdHJ1Y3QgeGZybV9kdW1wX2luZm8geworCXN0cnVjdCBza19idWZmICppbl9za2I7CisJc3RydWN0IHNrX2J1ZmYgKm91dF9za2I7CisJdTMyIG5sbXNnX3NlcTsKKwl1MTYgbmxtc2dfZmxhZ3M7CisJaW50IHN0YXJ0X2lkeDsKKwlpbnQgdGhpc19pZHg7Cit9OworCitzdGF0aWMgaW50IGR1bXBfb25lX3N0YXRlKHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBpbnQgY291bnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgeGZybV9kdW1wX2luZm8gKnNwID0gcHRyOworCXN0cnVjdCBza19idWZmICppbl9za2IgPSBzcC0+aW5fc2tiOworCXN0cnVjdCBza19idWZmICpza2IgPSBzcC0+b3V0X3NrYjsKKwlzdHJ1Y3QgeGZybV91c2Vyc2FfaW5mbyAqcDsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCisJaWYgKHNwLT50aGlzX2lkeCA8IHNwLT5zdGFydF9pZHgpCisJCWdvdG8gb3V0OworCisJbmxoID0gTkxNU0dfUFVUKHNrYiwgTkVUTElOS19DQihpbl9za2IpLnBpZCwKKwkJCXNwLT5ubG1zZ19zZXEsCisJCQlYRlJNX01TR19ORVdTQSwgc2l6ZW9mKCpwKSk7CisJbmxoLT5ubG1zZ19mbGFncyA9IHNwLT5ubG1zZ19mbGFnczsKKworCXAgPSBOTE1TR19EQVRBKG5saCk7CisJY29weV90b191c2VyX3N0YXRlKHgsIHApOworCisJaWYgKHgtPmFhbGcpCisJCVJUQV9QVVQoc2tiLCBYRlJNQV9BTEdfQVVUSCwKKwkJCXNpemVvZigqKHgtPmFhbGcpKSsoeC0+YWFsZy0+YWxnX2tleV9sZW4rNykvOCwgeC0+YWFsZyk7CisJaWYgKHgtPmVhbGcpCisJCVJUQV9QVVQoc2tiLCBYRlJNQV9BTEdfQ1JZUFQsCisJCQlzaXplb2YoKih4LT5lYWxnKSkrKHgtPmVhbGctPmFsZ19rZXlfbGVuKzcpLzgsIHgtPmVhbGcpOworCWlmICh4LT5jYWxnKQorCQlSVEFfUFVUKHNrYiwgWEZSTUFfQUxHX0NPTVAsIHNpemVvZigqKHgtPmNhbGcpKSwgeC0+Y2FsZyk7CisKKwlpZiAoeC0+ZW5jYXApCisJCVJUQV9QVVQoc2tiLCBYRlJNQV9FTkNBUCwgc2l6ZW9mKCp4LT5lbmNhcCksIHgtPmVuY2FwKTsKKworCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKK291dDoKKwlzcC0+dGhpc19pZHgrKzsKKwlyZXR1cm4gMDsKKworbmxtc2dfZmFpbHVyZToKK3J0YXR0cl9mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHhmcm1fZHVtcF9zYShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJc3RydWN0IHhmcm1fZHVtcF9pbmZvIGluZm87CisKKwlpbmZvLmluX3NrYiA9IGNiLT5za2I7CisJaW5mby5vdXRfc2tiID0gc2tiOworCWluZm8ubmxtc2dfc2VxID0gY2ItPm5saC0+bmxtc2dfc2VxOworCWluZm8ubmxtc2dfZmxhZ3MgPSBOTE1fRl9NVUxUSTsKKwlpbmZvLnRoaXNfaWR4ID0gMDsKKwlpbmZvLnN0YXJ0X2lkeCA9IGNiLT5hcmdzWzBdOworCSh2b2lkKSB4ZnJtX3N0YXRlX3dhbGsoSVBTRUNfUFJPVE9fQU5ZLCBkdW1wX29uZV9zdGF0ZSwgJmluZm8pOworCWNiLT5hcmdzWzBdID0gaW5mby50aGlzX2lkeDsKKworCXJldHVybiBza2ItPmxlbjsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICp4ZnJtX3N0YXRlX25ldGxpbmsoc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwKKwkJCQkJICBzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgdTMyIHNlcSkKK3sKKwlzdHJ1Y3QgeGZybV9kdW1wX2luZm8gaW5mbzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc2tiID0gYWxsb2Nfc2tiKE5MTVNHX0dPT0RTSVpFLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlORVRMSU5LX0NCKHNrYikuZHN0X3BpZCA9IE5FVExJTktfQ0IoaW5fc2tiKS5waWQ7CisJaW5mby5pbl9za2IgPSBpbl9za2I7CisJaW5mby5vdXRfc2tiID0gc2tiOworCWluZm8ubmxtc2dfc2VxID0gc2VxOworCWluZm8ubmxtc2dfZmxhZ3MgPSAwOworCWluZm8udGhpc19pZHggPSBpbmZvLnN0YXJ0X2lkeCA9IDA7CisKKwlpZiAoZHVtcF9vbmVfc3RhdGUoeCwgMCwgJmluZm8pKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgaW50IHhmcm1fZ2V0X3NhKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICoqeGZybWEpCit7CisJc3RydWN0IHhmcm1fdXNlcnNhX2lkICpwID0gTkxNU0dfREFUQShubGgpOworCXN0cnVjdCB4ZnJtX3N0YXRlICp4OworCXN0cnVjdCBza19idWZmICpyZXNwX3NrYjsKKwlpbnQgZXJyOworCisJeCA9IHhmcm1fc3RhdGVfbG9va3VwKCZwLT5kYWRkciwgcC0+c3BpLCBwLT5wcm90bywgcC0+ZmFtaWx5KTsKKwllcnIgPSAtRVNSQ0g7CisJaWYgKHggPT0gTlVMTCkKKwkJZ290byBvdXRfbm9wdXQ7CisKKwlyZXNwX3NrYiA9IHhmcm1fc3RhdGVfbmV0bGluayhza2IsIHgsIG5saC0+bmxtc2dfc2VxKTsKKwlpZiAoSVNfRVJSKHJlc3Bfc2tiKSkgeworCQllcnIgPSBQVFJfRVJSKHJlc3Bfc2tiKTsKKwl9IGVsc2UgeworCQllcnIgPSBuZXRsaW5rX3VuaWNhc3QoeGZybV9ubCwgcmVzcF9za2IsCisJCQkJICAgICAgTkVUTElOS19DQihza2IpLnBpZCwgTVNHX0RPTlRXQUlUKTsKKwl9CisJeGZybV9zdGF0ZV9wdXQoeCk7CitvdXRfbm9wdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2ZXJpZnlfdXNlcnNwaV9pbmZvKHN0cnVjdCB4ZnJtX3VzZXJzcGlfaW5mbyAqcCkKK3sKKwlzd2l0Y2ggKHAtPmluZm8uaWQucHJvdG8pIHsKKwljYXNlIElQUFJPVE9fQUg6CisJY2FzZSBJUFBST1RPX0VTUDoKKwkJYnJlYWs7CisKKwljYXNlIElQUFJPVE9fQ09NUDoKKwkJLyogSVBDT01QIHNwaSBpcyAxNi1iaXRzLiAqLworCQlpZiAocC0+bWF4ID49IDB4MTAwMDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9OworCisJaWYgKHAtPm1pbiA+IHAtPm1heCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4ZnJtX2FsbG9jX3VzZXJzcGkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKip4ZnJtYSkKK3sKKwlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDsKKwlzdHJ1Y3QgeGZybV91c2Vyc3BpX2luZm8gKnA7CisJc3RydWN0IHNrX2J1ZmYgKnJlc3Bfc2tiOworCXhmcm1fYWRkcmVzc190ICpkYWRkcjsKKwlpbnQgZmFtaWx5OworCWludCBlcnI7CisKKwlwID0gTkxNU0dfREFUQShubGgpOworCWVyciA9IHZlcmlmeV91c2Vyc3BpX2luZm8ocCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfbm9wdXQ7CisKKwlmYW1pbHkgPSBwLT5pbmZvLmZhbWlseTsKKwlkYWRkciA9ICZwLT5pbmZvLmlkLmRhZGRyOworCisJeCA9IE5VTEw7CisJaWYgKHAtPmluZm8uc2VxKSB7CisJCXggPSB4ZnJtX2ZpbmRfYWNxX2J5c2VxKHAtPmluZm8uc2VxKTsKKwkJaWYgKHggJiYgeGZybV9hZGRyX2NtcCgmeC0+aWQuZGFkZHIsIGRhZGRyLCBmYW1pbHkpKSB7CisJCQl4ZnJtX3N0YXRlX3B1dCh4KTsKKwkJCXggPSBOVUxMOworCQl9CisJfQorCisJaWYgKCF4KQorCQl4ID0geGZybV9maW5kX2FjcShwLT5pbmZvLm1vZGUsIHAtPmluZm8ucmVxaWQsCisJCQkJICBwLT5pbmZvLmlkLnByb3RvLCBkYWRkciwKKwkJCQkgICZwLT5pbmZvLnNhZGRyLCAxLAorCQkJCSAgZmFtaWx5KTsKKwllcnIgPSAtRU5PRU5UOworCWlmICh4ID09IE5VTEwpCisJCWdvdG8gb3V0X25vcHV0OworCisJcmVzcF9za2IgPSBFUlJfUFRSKC1FTk9FTlQpOworCisJc3Bpbl9sb2NrX2JoKCZ4LT5sb2NrKTsKKwlpZiAoeC0+a20uc3RhdGUgIT0gWEZSTV9TVEFURV9ERUFEKSB7CisJCXhmcm1fYWxsb2Nfc3BpKHgsIGh0b25sKHAtPm1pbiksIGh0b25sKHAtPm1heCkpOworCQlpZiAoeC0+aWQuc3BpKQorCQkJcmVzcF9za2IgPSB4ZnJtX3N0YXRlX25ldGxpbmsoc2tiLCB4LCBubGgtPm5sbXNnX3NlcSk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZ4LT5sb2NrKTsKKworCWlmIChJU19FUlIocmVzcF9za2IpKSB7CisJCWVyciA9IFBUUl9FUlIocmVzcF9za2IpOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSBuZXRsaW5rX3VuaWNhc3QoeGZybV9ubCwgcmVzcF9za2IsCisJCQkgICAgICBORVRMSU5LX0NCKHNrYikucGlkLCBNU0dfRE9OVFdBSVQpOworCitvdXQ6CisJeGZybV9zdGF0ZV9wdXQoeCk7CitvdXRfbm9wdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2ZXJpZnlfcG9saWN5X2RpcihfX3U4IGRpcikKK3sKKwlzd2l0Y2ggKGRpcikgeworCWNhc2UgWEZSTV9QT0xJQ1lfSU46CisJY2FzZSBYRlJNX1BPTElDWV9PVVQ6CisJY2FzZSBYRlJNX1BPTElDWV9GV0Q6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZlcmlmeV9uZXdwb2xpY3lfaW5mbyhzdHJ1Y3QgeGZybV91c2VycG9saWN5X2luZm8gKnApCit7CisJc3dpdGNoIChwLT5zaGFyZSkgeworCWNhc2UgWEZSTV9TSEFSRV9BTlk6CisJY2FzZSBYRlJNX1NIQVJFX1NFU1NJT046CisJY2FzZSBYRlJNX1NIQVJFX1VTRVI6CisJY2FzZSBYRlJNX1NIQVJFX1VOSVFVRToKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9OworCisJc3dpdGNoIChwLT5hY3Rpb24pIHsKKwljYXNlIFhGUk1fUE9MSUNZX0FMTE9XOgorCWNhc2UgWEZSTV9QT0xJQ1lfQkxPQ0s6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfTsKKworCXN3aXRjaCAocC0+c2VsLmZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJYnJlYWs7CisKKwljYXNlIEFGX0lORVQ2OgorI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCQlicmVhazsKKyNlbHNlCisJCXJldHVybiAgLUVBRk5PU1VQUE9SVDsKKyNlbmRpZgorCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfTsKKworCXJldHVybiB2ZXJpZnlfcG9saWN5X2RpcihwLT5kaXIpOworfQorCitzdGF0aWMgdm9pZCBjb3B5X3RlbXBsYXRlcyhzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLCBzdHJ1Y3QgeGZybV91c2VyX3RtcGwgKnV0LAorCQkJICAgaW50IG5yKQoreworCWludCBpOworCisJeHAtPnhmcm1fbnIgPSBucjsKKwlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKywgdXQrKykgeworCQlzdHJ1Y3QgeGZybV90bXBsICp0ID0gJnhwLT54ZnJtX3ZlY1tpXTsKKworCQltZW1jcHkoJnQtPmlkLCAmdXQtPmlkLCBzaXplb2Yoc3RydWN0IHhmcm1faWQpKTsKKwkJbWVtY3B5KCZ0LT5zYWRkciwgJnV0LT5zYWRkciwKKwkJICAgICAgIHNpemVvZih4ZnJtX2FkZHJlc3NfdCkpOworCQl0LT5yZXFpZCA9IHV0LT5yZXFpZDsKKwkJdC0+bW9kZSA9IHV0LT5tb2RlOworCQl0LT5zaGFyZSA9IHV0LT5zaGFyZTsKKwkJdC0+b3B0aW9uYWwgPSB1dC0+b3B0aW9uYWw7CisJCXQtPmFhbGdvcyA9IHV0LT5hYWxnb3M7CisJCXQtPmVhbGdvcyA9IHV0LT5lYWxnb3M7CisJCXQtPmNhbGdvcyA9IHV0LT5jYWxnb3M7CisJfQorfQorCitzdGF0aWMgaW50IGNvcHlfZnJvbV91c2VyX3RtcGwoc3RydWN0IHhmcm1fcG9saWN5ICpwb2wsIHN0cnVjdCBydGF0dHIgKip4ZnJtYSkKK3sKKwlzdHJ1Y3QgcnRhdHRyICpydCA9IHhmcm1hW1hGUk1BX1RNUEwtMV07CisJc3RydWN0IHhmcm1fdXNlcl90bXBsICp1dG1wbDsKKwlpbnQgbnI7CisKKwlpZiAoIXJ0KSB7CisJCXBvbC0+eGZybV9uciA9IDA7CisJfSBlbHNlIHsKKwkJbnIgPSAocnQtPnJ0YV9sZW4gLSBzaXplb2YoKnJ0KSkgLyBzaXplb2YoKnV0bXBsKTsKKworCQlpZiAobnIgPiBYRlJNX01BWF9ERVBUSCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWNvcHlfdGVtcGxhdGVzKHBvbCwgUlRBX0RBVEEocnQpLCBucik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjb3B5X2Zyb21fdXNlcl9wb2xpY3koc3RydWN0IHhmcm1fcG9saWN5ICp4cCwgc3RydWN0IHhmcm1fdXNlcnBvbGljeV9pbmZvICpwKQoreworCXhwLT5wcmlvcml0eSA9IHAtPnByaW9yaXR5OworCXhwLT5pbmRleCA9IHAtPmluZGV4OworCW1lbWNweSgmeHAtPnNlbGVjdG9yLCAmcC0+c2VsLCBzaXplb2YoeHAtPnNlbGVjdG9yKSk7CisJbWVtY3B5KCZ4cC0+bGZ0LCAmcC0+bGZ0LCBzaXplb2YoeHAtPmxmdCkpOworCXhwLT5hY3Rpb24gPSBwLT5hY3Rpb247CisJeHAtPmZsYWdzID0gcC0+ZmxhZ3M7CisJeHAtPmZhbWlseSA9IHAtPnNlbC5mYW1pbHk7CisJLyogWFhYIHhwLT5zaGFyZSA9IHAtPnNoYXJlOyAqLworfQorCitzdGF0aWMgdm9pZCBjb3B5X3RvX3VzZXJfcG9saWN5KHN0cnVjdCB4ZnJtX3BvbGljeSAqeHAsIHN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaW5mbyAqcCwgaW50IGRpcikKK3sKKwltZW1jcHkoJnAtPnNlbCwgJnhwLT5zZWxlY3Rvciwgc2l6ZW9mKHAtPnNlbCkpOworCW1lbWNweSgmcC0+bGZ0LCAmeHAtPmxmdCwgc2l6ZW9mKHAtPmxmdCkpOworCW1lbWNweSgmcC0+Y3VybGZ0LCAmeHAtPmN1cmxmdCwgc2l6ZW9mKHAtPmN1cmxmdCkpOworCXAtPnByaW9yaXR5ID0geHAtPnByaW9yaXR5OworCXAtPmluZGV4ID0geHAtPmluZGV4OworCXAtPnNlbC5mYW1pbHkgPSB4cC0+ZmFtaWx5OworCXAtPmRpciA9IGRpcjsKKwlwLT5hY3Rpb24gPSB4cC0+YWN0aW9uOworCXAtPmZsYWdzID0geHAtPmZsYWdzOworCXAtPnNoYXJlID0gWEZSTV9TSEFSRV9BTlk7IC8qIFhYWCB4cC0+c2hhcmUgKi8KK30KKworc3RhdGljIHN0cnVjdCB4ZnJtX3BvbGljeSAqeGZybV9wb2xpY3lfY29uc3RydWN0KHN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaW5mbyAqcCwgc3RydWN0IHJ0YXR0ciAqKnhmcm1hLCBpbnQgKmVycnApCit7CisJc3RydWN0IHhmcm1fcG9saWN5ICp4cCA9IHhmcm1fcG9saWN5X2FsbG9jKEdGUF9LRVJORUwpOworCWludCBlcnI7CisKKwlpZiAoIXhwKSB7CisJCSplcnJwID0gLUVOT01FTTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY29weV9mcm9tX3VzZXJfcG9saWN5KHhwLCBwKTsKKwllcnIgPSBjb3B5X2Zyb21fdXNlcl90bXBsKHhwLCB4ZnJtYSk7CisJaWYgKGVycikgeworCQkqZXJycCA9IGVycjsKKwkJa2ZyZWUoeHApOworCQl4cCA9IE5VTEw7CisJfQorCisJcmV0dXJuIHhwOworfQorCitzdGF0aWMgaW50IHhmcm1fYWRkX3BvbGljeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqKnhmcm1hKQoreworCXN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaW5mbyAqcCA9IE5MTVNHX0RBVEEobmxoKTsKKwlzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwOworCWludCBlcnI7CisJaW50IGV4Y2w7CisKKwllcnIgPSB2ZXJpZnlfbmV3cG9saWN5X2luZm8ocCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXhwID0geGZybV9wb2xpY3lfY29uc3RydWN0KHAsIChzdHJ1Y3QgcnRhdHRyICoqKSB4ZnJtYSwgJmVycik7CisJaWYgKCF4cCkKKwkJcmV0dXJuIGVycjsKKworCWV4Y2wgPSBubGgtPm5sbXNnX3R5cGUgPT0gWEZSTV9NU0dfTkVXUE9MSUNZOworCWVyciA9IHhmcm1fcG9saWN5X2luc2VydChwLT5kaXIsIHhwLCBleGNsKTsKKwlpZiAoZXJyKSB7CisJCWtmcmVlKHhwKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwl4ZnJtX3BvbF9wdXQoeHApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29weV90b191c2VyX3RtcGwoc3RydWN0IHhmcm1fcG9saWN5ICp4cCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgeGZybV91c2VyX3RtcGwgdmVjW1hGUk1fTUFYX0RFUFRIXTsKKwlpbnQgaTsKKworCWlmICh4cC0+eGZybV9uciA9PSAwKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCB4cC0+eGZybV9ucjsgaSsrKSB7CisJCXN0cnVjdCB4ZnJtX3VzZXJfdG1wbCAqdXAgPSAmdmVjW2ldOworCQlzdHJ1Y3QgeGZybV90bXBsICprcCA9ICZ4cC0+eGZybV92ZWNbaV07CisKKwkJbWVtY3B5KCZ1cC0+aWQsICZrcC0+aWQsIHNpemVvZih1cC0+aWQpKTsKKwkJdXAtPmZhbWlseSA9IHhwLT5mYW1pbHk7CisJCW1lbWNweSgmdXAtPnNhZGRyLCAma3AtPnNhZGRyLCBzaXplb2YodXAtPnNhZGRyKSk7CisJCXVwLT5yZXFpZCA9IGtwLT5yZXFpZDsKKwkJdXAtPm1vZGUgPSBrcC0+bW9kZTsKKwkJdXAtPnNoYXJlID0ga3AtPnNoYXJlOworCQl1cC0+b3B0aW9uYWwgPSBrcC0+b3B0aW9uYWw7CisJCXVwLT5hYWxnb3MgPSBrcC0+YWFsZ29zOworCQl1cC0+ZWFsZ29zID0ga3AtPmVhbGdvczsKKwkJdXAtPmNhbGdvcyA9IGtwLT5jYWxnb3M7CisJfQorCVJUQV9QVVQoc2tiLCBYRlJNQV9UTVBMLAorCQkoc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJfdG1wbCkgKiB4cC0+eGZybV9uciksCisJCXZlYyk7CisKKwlyZXR1cm4gMDsKKworcnRhdHRyX2ZhaWx1cmU6CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGR1bXBfb25lX3BvbGljeShzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLCBpbnQgZGlyLCBpbnQgY291bnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgeGZybV9kdW1wX2luZm8gKnNwID0gcHRyOworCXN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaW5mbyAqcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiID0gc3AtPmluX3NrYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc3AtPm91dF9za2I7CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKworCWlmIChzcC0+dGhpc19pZHggPCBzcC0+c3RhcnRfaWR4KQorCQlnb3RvIG91dDsKKworCW5saCA9IE5MTVNHX1BVVChza2IsIE5FVExJTktfQ0IoaW5fc2tiKS5waWQsCisJCQlzcC0+bmxtc2dfc2VxLAorCQkJWEZSTV9NU0dfTkVXUE9MSUNZLCBzaXplb2YoKnApKTsKKwlwID0gTkxNU0dfREFUQShubGgpOworCW5saC0+bmxtc2dfZmxhZ3MgPSBzcC0+bmxtc2dfZmxhZ3M7CisKKwljb3B5X3RvX3VzZXJfcG9saWN5KHhwLCBwLCBkaXIpOworCWlmIChjb3B5X3RvX3VzZXJfdG1wbCh4cCwgc2tiKSA8IDApCisJCWdvdG8gbmxtc2dfZmFpbHVyZTsKKworCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKK291dDoKKwlzcC0+dGhpc19pZHgrKzsKKwlyZXR1cm4gMDsKKworbmxtc2dfZmFpbHVyZToKKwlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCB4ZnJtX2R1bXBfcG9saWN5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlzdHJ1Y3QgeGZybV9kdW1wX2luZm8gaW5mbzsKKworCWluZm8uaW5fc2tiID0gY2ItPnNrYjsKKwlpbmZvLm91dF9za2IgPSBza2I7CisJaW5mby5ubG1zZ19zZXEgPSBjYi0+bmxoLT5ubG1zZ19zZXE7CisJaW5mby5ubG1zZ19mbGFncyA9IE5MTV9GX01VTFRJOworCWluZm8udGhpc19pZHggPSAwOworCWluZm8uc3RhcnRfaWR4ID0gY2ItPmFyZ3NbMF07CisJKHZvaWQpIHhmcm1fcG9saWN5X3dhbGsoZHVtcF9vbmVfcG9saWN5LCAmaW5mbyk7CisJY2ItPmFyZ3NbMF0gPSBpbmZvLnRoaXNfaWR4OworCisJcmV0dXJuIHNrYi0+bGVuOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnhmcm1fcG9saWN5X25ldGxpbmsoc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwKKwkJCQkJICBzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLAorCQkJCQkgIGludCBkaXIsIHUzMiBzZXEpCit7CisJc3RydWN0IHhmcm1fZHVtcF9pbmZvIGluZm87CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXNrYiA9IGFsbG9jX3NrYihOTE1TR19HT09EU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFza2IpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJTkVUTElOS19DQihza2IpLmRzdF9waWQgPSBORVRMSU5LX0NCKGluX3NrYikucGlkOworCWluZm8uaW5fc2tiID0gaW5fc2tiOworCWluZm8ub3V0X3NrYiA9IHNrYjsKKwlpbmZvLm5sbXNnX3NlcSA9IHNlcTsKKwlpbmZvLm5sbXNnX2ZsYWdzID0gMDsKKwlpbmZvLnRoaXNfaWR4ID0gaW5mby5zdGFydF9pZHggPSAwOworCisJaWYgKGR1bXBfb25lX3BvbGljeSh4cCwgZGlyLCAwLCAmaW5mbykgPCAwKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgaW50IHhmcm1fZ2V0X3BvbGljeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqKnhmcm1hKQoreworCXN0cnVjdCB4ZnJtX3BvbGljeSAqeHA7CisJc3RydWN0IHhmcm1fdXNlcnBvbGljeV9pZCAqcDsKKwlpbnQgZXJyOworCWludCBkZWxldGU7CisKKwlwID0gTkxNU0dfREFUQShubGgpOworCWRlbGV0ZSA9IG5saC0+bmxtc2dfdHlwZSA9PSBYRlJNX01TR19ERUxQT0xJQ1k7CisKKwllcnIgPSB2ZXJpZnlfcG9saWN5X2RpcihwLT5kaXIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAocC0+aW5kZXgpCisJCXhwID0geGZybV9wb2xpY3lfYnlpZChwLT5kaXIsIHAtPmluZGV4LCBkZWxldGUpOworCWVsc2UKKwkJeHAgPSB4ZnJtX3BvbGljeV9ieXNlbChwLT5kaXIsICZwLT5zZWwsIGRlbGV0ZSk7CisJaWYgKHhwID09IE5VTEwpCisJCXJldHVybiAtRU5PRU5UOworCisJaWYgKCFkZWxldGUpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnJlc3Bfc2tiOworCisJCXJlc3Bfc2tiID0geGZybV9wb2xpY3lfbmV0bGluayhza2IsIHhwLCBwLT5kaXIsIG5saC0+bmxtc2dfc2VxKTsKKwkJaWYgKElTX0VSUihyZXNwX3NrYikpIHsKKwkJCWVyciA9IFBUUl9FUlIocmVzcF9za2IpOworCQl9IGVsc2UgeworCQkJZXJyID0gbmV0bGlua191bmljYXN0KHhmcm1fbmwsIHJlc3Bfc2tiLAorCQkJCQkgICAgICBORVRMSU5LX0NCKHNrYikucGlkLAorCQkJCQkgICAgICBNU0dfRE9OVFdBSVQpOworCQl9CisJfQorCisJeGZybV9wb2xfcHV0KHhwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgeGZybV9mbHVzaF9zYShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqKnhmcm1hKQoreworCXN0cnVjdCB4ZnJtX3VzZXJzYV9mbHVzaCAqcCA9IE5MTVNHX0RBVEEobmxoKTsKKworCXhmcm1fc3RhdGVfZmx1c2gocC0+cHJvdG8pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhmcm1fZmx1c2hfcG9saWN5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICoqeGZybWEpCit7CisJeGZybV9wb2xpY3lfZmx1c2goKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGludCB4ZnJtX21zZ19taW5bKFhGUk1fTVNHX01BWCArIDEgLSBYRlJNX01TR19CQVNFKV0gPSB7CisJTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgeGZybV91c2Vyc2FfaW5mbykpLAkvKiBORVcgU0EgKi8KKwlOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJzYV9pZCkpLAkvKiBERUwgU0EgKi8KKwlOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJzYV9pZCkpLAkvKiBHRVQgU0EgKi8KKwlOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaW5mbykpLC8qIE5FVyBQT0xJQ1kgKi8KKwlOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaWQpKSwgIC8qIERFTCBQT0xJQ1kgKi8KKwlOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaWQpKSwgIC8qIEdFVCBQT0xJQ1kgKi8KKwlOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJzcGlfaW5mbykpLAkvKiBBTExPQyBTUEkgKi8KKwlOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJfYWNxdWlyZSkpLAkvKiBBQ1FVSVJFICovCisJTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgeGZybV91c2VyX2V4cGlyZSkpLAkvKiBFWFBJUkUgKi8KKwlOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaW5mbykpLC8qIFVQRCBQT0xJQ1kgKi8KKwlOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJzYV9pbmZvKSksCS8qIFVQRCBTQSAqLworCU5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IHhmcm1fdXNlcl9wb2xleHBpcmUpKSwgLyogUE9MRVhQSVJFICovCisJTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgeGZybV91c2Vyc2FfZmx1c2gpKSwJLyogRkxVU0ggU0EgKi8KKwlOTE1TR19MRU5HVEgoMCksCQkJCS8qIEZMVVNIIFBPTElDWSAqLworfTsKKworc3RhdGljIHN0cnVjdCB4ZnJtX2xpbmsgeworCWludCAoKmRvaXQpKHN0cnVjdCBza19idWZmICosIHN0cnVjdCBubG1zZ2hkciAqLCB2b2lkICoqKTsKKwlpbnQgKCpkdW1wKShzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqKTsKK30geGZybV9kaXNwYXRjaFtdID0geworCXsJLmRvaXQJPQl4ZnJtX2FkZF9zYSwgCQl9LAorCXsJLmRvaXQJPQl4ZnJtX2RlbF9zYSwgCQl9LAorCXsKKwkJLmRvaXQJPQl4ZnJtX2dldF9zYSwKKwkJLmR1bXAJPQl4ZnJtX2R1bXBfc2EsCisJfSwKKwl7CS5kb2l0CT0JeGZybV9hZGRfcG9saWN5IAl9LAorCXsJLmRvaXQJPQl4ZnJtX2dldF9wb2xpY3kgCX0sCisJeworCQkuZG9pdAk9CXhmcm1fZ2V0X3BvbGljeSwKKwkJLmR1bXAJPQl4ZnJtX2R1bXBfcG9saWN5LAorCX0sCisJewkuZG9pdAk9CXhmcm1fYWxsb2NfdXNlcnNwaQl9LAorCXt9LAorCXt9LAorCXsJLmRvaXQJPQl4ZnJtX2FkZF9wb2xpY3kgCX0sCisJewkuZG9pdAk9CXhmcm1fYWRkX3NhLCAJCX0sCisJe30sCisJewkuZG9pdAk9CXhmcm1fZmx1c2hfc2EJCX0sCisJewkuZG9pdAk9CXhmcm1fZmx1c2hfcG9saWN5CX0sCit9OworCitzdGF0aWMgaW50IHhmcm1fZG9uZShzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGZybV91c2VyX3Jjdl9tc2coc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsIGludCAqZXJycCkKK3sKKwlzdHJ1Y3QgcnRhdHRyICp4ZnJtYVtYRlJNQV9NQVhdOworCXN0cnVjdCB4ZnJtX2xpbmsgKmxpbms7CisJaW50IHR5cGUsIG1pbl9sZW47CisKKwlpZiAoIShubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfUkVRVUVTVCkpCisJCXJldHVybiAwOworCisJdHlwZSA9IG5saC0+bmxtc2dfdHlwZTsKKworCS8qIEEgY29udHJvbCBtZXNzYWdlOiBpZ25vcmUgdGhlbSAqLworCWlmICh0eXBlIDwgWEZSTV9NU0dfQkFTRSkKKwkJcmV0dXJuIDA7CisKKwkvKiBVbmtub3duIG1lc3NhZ2U6IHJlcGx5IHdpdGggRUlOVkFMICovCisJaWYgKHR5cGUgPiBYRlJNX01TR19NQVgpCisJCWdvdG8gZXJyX2VpbnZhbDsKKworCXR5cGUgLT0gWEZSTV9NU0dfQkFTRTsKKwlsaW5rID0gJnhmcm1fZGlzcGF0Y2hbdHlwZV07CisKKwkvKiBBbGwgb3BlcmF0aW9ucyByZXF1aXJlIHByaXZpbGVnZXMsIGV2ZW4gR0VUICovCisJaWYgKHNlY3VyaXR5X25ldGxpbmtfcmVjdihza2IpKSB7CisJCSplcnJwID0gLUVQRVJNOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCh0eXBlID09IDIgfHwgdHlwZSA9PSA1KSAmJiAobmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX0RVTVApKSB7CisJCXUzMiBybGVuOworCisJCWlmIChsaW5rLT5kdW1wID09IE5VTEwpCisJCQlnb3RvIGVycl9laW52YWw7CisKKwkJaWYgKCgqZXJycCA9IG5ldGxpbmtfZHVtcF9zdGFydCh4ZnJtX25sLCBza2IsIG5saCwKKwkJCQkJCWxpbmstPmR1bXAsCisJCQkJCQl4ZnJtX2RvbmUpKSAhPSAwKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcmxlbiA9IE5MTVNHX0FMSUdOKG5saC0+bmxtc2dfbGVuKTsKKwkJaWYgKHJsZW4gPiBza2ItPmxlbikKKwkJCXJsZW4gPSBza2ItPmxlbjsKKwkJc2tiX3B1bGwoc2tiLCBybGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1lbXNldCh4ZnJtYSwgMCwgc2l6ZW9mKHhmcm1hKSk7CisKKwlpZiAobmxoLT5ubG1zZ19sZW4gPCAobWluX2xlbiA9IHhmcm1fbXNnX21pblt0eXBlXSkpCisJCWdvdG8gZXJyX2VpbnZhbDsKKworCWlmIChubGgtPm5sbXNnX2xlbiA+IG1pbl9sZW4pIHsKKwkJaW50IGF0dHJsZW4gPSBubGgtPm5sbXNnX2xlbiAtIE5MTVNHX0FMSUdOKG1pbl9sZW4pOworCQlzdHJ1Y3QgcnRhdHRyICphdHRyID0gKHZvaWQgKikgbmxoICsgTkxNU0dfQUxJR04obWluX2xlbik7CisKKwkJd2hpbGUgKFJUQV9PSyhhdHRyLCBhdHRybGVuKSkgeworCQkJdW5zaWduZWQgc2hvcnQgZmxhdm9yID0gYXR0ci0+cnRhX3R5cGU7CisJCQlpZiAoZmxhdm9yKSB7CisJCQkJaWYgKGZsYXZvciA+IFhGUk1BX01BWCkKKwkJCQkJZ290byBlcnJfZWludmFsOworCQkJCXhmcm1hW2ZsYXZvciAtIDFdID0gYXR0cjsKKwkJCX0KKwkJCWF0dHIgPSBSVEFfTkVYVChhdHRyLCBhdHRybGVuKTsKKwkJfQorCX0KKworCWlmIChsaW5rLT5kb2l0ID09IE5VTEwpCisJCWdvdG8gZXJyX2VpbnZhbDsKKwkqZXJycCA9IGxpbmstPmRvaXQoc2tiLCBubGgsICh2b2lkICoqKSAmeGZybWEpOworCisJcmV0dXJuICplcnJwOworCitlcnJfZWludmFsOgorCSplcnJwID0gLUVJTlZBTDsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgeGZybV91c2VyX3Jjdl9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCisJd2hpbGUgKHNrYi0+bGVuID49IE5MTVNHX1NQQUNFKDApKSB7CisJCXUzMiBybGVuOworCisJCW5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKikgc2tiLT5kYXRhOworCQlpZiAobmxoLT5ubG1zZ19sZW4gPCBzaXplb2YoKm5saCkgfHwKKwkJICAgIHNrYi0+bGVuIDwgbmxoLT5ubG1zZ19sZW4pCisJCQlyZXR1cm4gMDsKKwkJcmxlbiA9IE5MTVNHX0FMSUdOKG5saC0+bmxtc2dfbGVuKTsKKwkJaWYgKHJsZW4gPiBza2ItPmxlbikKKwkJCXJsZW4gPSBza2ItPmxlbjsKKwkJaWYgKHhmcm1fdXNlcl9yY3ZfbXNnKHNrYiwgbmxoLCAmZXJyKSA8IDApIHsKKwkJCWlmIChlcnIgPT0gMCkKKwkJCQlyZXR1cm4gLTE7CisJCQluZXRsaW5rX2Fjayhza2IsIG5saCwgZXJyKTsKKwkJfSBlbHNlIGlmIChubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfQUNLKQorCQkJbmV0bGlua19hY2soc2tiLCBubGgsIDApOworCQlza2JfcHVsbChza2IsIHJsZW4pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB4ZnJtX25ldGxpbmtfcmN2KHN0cnVjdCBzb2NrICpzaywgaW50IGxlbikKK3sKKwlkbyB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJZG93bigmeGZybV9jZmdfc2VtKTsKKworCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpICE9IE5VTEwpIHsKKwkJCWlmICh4ZnJtX3VzZXJfcmN2X3NrYihza2IpKSB7CisJCQkJaWYgKHNrYi0+bGVuKQorCQkJCQlza2JfcXVldWVfaGVhZCgmc2stPnNrX3JlY2VpdmVfcXVldWUsCisJCQkJCQkgICAgICAgc2tiKTsKKwkJCQllbHNlCisJCQkJCWtmcmVlX3NrYihza2IpOworCQkJCWJyZWFrOworCQkJfQorCQkJa2ZyZWVfc2tiKHNrYik7CisJCX0KKworCQl1cCgmeGZybV9jZmdfc2VtKTsKKworCX0gd2hpbGUgKHhmcm1fbmwgJiYgeGZybV9ubC0+c2tfcmVjZWl2ZV9xdWV1ZS5xbGVuKTsKK30KKworc3RhdGljIGludCBidWlsZF9leHBpcmUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHhmcm1fc3RhdGUgKngsIGludCBoYXJkKQoreworCXN0cnVjdCB4ZnJtX3VzZXJfZXhwaXJlICp1ZTsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCisJbmxoID0gTkxNU0dfUFVUKHNrYiwgMCwgMCwgWEZSTV9NU0dfRVhQSVJFLAorCQkJc2l6ZW9mKCp1ZSkpOworCXVlID0gTkxNU0dfREFUQShubGgpOworCW5saC0+bmxtc2dfZmxhZ3MgPSAwOworCisJY29weV90b191c2VyX3N0YXRlKHgsICZ1ZS0+c3RhdGUpOworCXVlLT5oYXJkID0gKGhhcmQgIT0gMCkgPyAxIDogMDsKKworCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlyZXR1cm4gc2tiLT5sZW47CisKK25sbXNnX2ZhaWx1cmU6CisJc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgeGZybV9zZW5kX3N0YXRlX25vdGlmeShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgaW50IGhhcmQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXNrYiA9IGFsbG9jX3NrYihzaXplb2Yoc3RydWN0IHhmcm1fdXNlcl9leHBpcmUpICsgMTYsIEdGUF9BVE9NSUMpOworCWlmIChza2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoYnVpbGRfZXhwaXJlKHNrYiwgeCwgaGFyZCkgPCAwKQorCQlCVUcoKTsKKworCU5FVExJTktfQ0Ioc2tiKS5kc3RfZ3JvdXBzID0gWEZSTUdSUF9FWFBJUkU7CisKKwlyZXR1cm4gbmV0bGlua19icm9hZGNhc3QoeGZybV9ubCwgc2tiLCAwLCBYRlJNR1JQX0VYUElSRSwgR0ZQX0FUT01JQyk7Cit9CisKK3N0YXRpYyBpbnQgYnVpbGRfYWNxdWlyZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwKKwkJCSBzdHJ1Y3QgeGZybV90bXBsICp4dCwgc3RydWN0IHhmcm1fcG9saWN5ICp4cCwKKwkJCSBpbnQgZGlyKQoreworCXN0cnVjdCB4ZnJtX3VzZXJfYWNxdWlyZSAqdWE7CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwlfX3UzMiBzZXEgPSB4ZnJtX2dldF9hY3FzZXEoKTsKKworCW5saCA9IE5MTVNHX1BVVChza2IsIDAsIDAsIFhGUk1fTVNHX0FDUVVJUkUsCisJCQlzaXplb2YoKnVhKSk7CisJdWEgPSBOTE1TR19EQVRBKG5saCk7CisJbmxoLT5ubG1zZ19mbGFncyA9IDA7CisKKwltZW1jcHkoJnVhLT5pZCwgJngtPmlkLCBzaXplb2YodWEtPmlkKSk7CisJbWVtY3B5KCZ1YS0+c2FkZHIsICZ4LT5wcm9wcy5zYWRkciwgc2l6ZW9mKHVhLT5zYWRkcikpOworCW1lbWNweSgmdWEtPnNlbCwgJngtPnNlbCwgc2l6ZW9mKHVhLT5zZWwpKTsKKwljb3B5X3RvX3VzZXJfcG9saWN5KHhwLCAmdWEtPnBvbGljeSwgZGlyKTsKKwl1YS0+YWFsZ29zID0geHQtPmFhbGdvczsKKwl1YS0+ZWFsZ29zID0geHQtPmVhbGdvczsKKwl1YS0+Y2FsZ29zID0geHQtPmNhbGdvczsKKwl1YS0+c2VxID0geC0+a20uc2VxID0gc2VxOworCisJaWYgKGNvcHlfdG9fdXNlcl90bXBsKHhwLCBza2IpIDwgMCkKKwkJZ290byBubG1zZ19mYWlsdXJlOworCisJbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCXJldHVybiBza2ItPmxlbjsKKworbmxtc2dfZmFpbHVyZToKKwlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCB4ZnJtX3NlbmRfYWNxdWlyZShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHhmcm1fdG1wbCAqeHQsCisJCQkgICAgIHN0cnVjdCB4ZnJtX3BvbGljeSAqeHAsIGludCBkaXIpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzaXplX3QgbGVuOworCisJbGVuID0gUlRBX1NQQUNFKHNpemVvZihzdHJ1Y3QgeGZybV91c2VyX3RtcGwpICogeHAtPnhmcm1fbnIpOworCWxlbiArPSBOTE1TR19TUEFDRShzaXplb2Yoc3RydWN0IHhmcm1fdXNlcl9hY3F1aXJlKSk7CisJc2tiID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0FUT01JQyk7CisJaWYgKHNrYiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChidWlsZF9hY3F1aXJlKHNrYiwgeCwgeHQsIHhwLCBkaXIpIDwgMCkKKwkJQlVHKCk7CisKKwlORVRMSU5LX0NCKHNrYikuZHN0X2dyb3VwcyA9IFhGUk1HUlBfQUNRVUlSRTsKKworCXJldHVybiBuZXRsaW5rX2Jyb2FkY2FzdCh4ZnJtX25sLCBza2IsIDAsIFhGUk1HUlBfQUNRVUlSRSwgR0ZQX0FUT01JQyk7Cit9CisKKy8qIFVzZXIgZ2l2ZXMgdXMgeGZybV91c2VyX3BvbGljeV9pbmZvIGZvbGxvd2VkIGJ5IGFuIGFycmF5IG9mIDAKKyAqIG9yIG1vcmUgdGVtcGxhdGVzLgorICovCitzdGF0aWMgc3RydWN0IHhmcm1fcG9saWN5ICp4ZnJtX2NvbXBpbGVfcG9saWN5KHUxNiBmYW1pbHksIGludCBvcHQsCisJCQkJCSAgICAgICB1OCAqZGF0YSwgaW50IGxlbiwgaW50ICpkaXIpCit7CisJc3RydWN0IHhmcm1fdXNlcnBvbGljeV9pbmZvICpwID0gKHN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaW5mbyAqKWRhdGE7CisJc3RydWN0IHhmcm1fdXNlcl90bXBsICp1dCA9IChzdHJ1Y3QgeGZybV91c2VyX3RtcGwgKikgKHAgKyAxKTsKKwlzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwOworCWludCBucjsKKworCXN3aXRjaCAoZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlpZiAob3B0ICE9IElQX1hGUk1fUE9MSUNZKSB7CisJCQkqZGlyID0gLUVPUE5PVFNVUFA7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlicmVhazsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwljYXNlIEFGX0lORVQ2OgorCQlpZiAob3B0ICE9IElQVjZfWEZSTV9QT0xJQ1kpIHsKKwkJCSpkaXIgPSAtRU9QTk9UU1VQUDsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJKmRpciA9IC1FSU5WQUw7CisJCXJldHVybiBOVUxMOworCX0KKworCSpkaXIgPSAtRUlOVkFMOworCisJaWYgKGxlbiA8IHNpemVvZigqcCkgfHwKKwkgICAgdmVyaWZ5X25ld3BvbGljeV9pbmZvKHApKQorCQlyZXR1cm4gTlVMTDsKKworCW5yID0gKChsZW4gLSBzaXplb2YoKnApKSAvIHNpemVvZigqdXQpKTsKKwlpZiAobnIgPiBYRlJNX01BWF9ERVBUSCkKKwkJcmV0dXJuIE5VTEw7CisKKwl4cCA9IHhmcm1fcG9saWN5X2FsbG9jKEdGUF9LRVJORUwpOworCWlmICh4cCA9PSBOVUxMKSB7CisJCSpkaXIgPSAtRU5PQlVGUzsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY29weV9mcm9tX3VzZXJfcG9saWN5KHhwLCBwKTsKKwljb3B5X3RlbXBsYXRlcyh4cCwgdXQsIG5yKTsKKworCSpkaXIgPSBwLT5kaXI7CisKKwlyZXR1cm4geHA7Cit9CisKK3N0YXRpYyBpbnQgYnVpbGRfcG9sZXhwaXJlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB4ZnJtX3BvbGljeSAqeHAsCisJCQkgICBpbnQgZGlyLCBpbnQgaGFyZCkKK3sKKwlzdHJ1Y3QgeGZybV91c2VyX3BvbGV4cGlyZSAqdXBlOworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisKKwlubGggPSBOTE1TR19QVVQoc2tiLCAwLCAwLCBYRlJNX01TR19QT0xFWFBJUkUsIHNpemVvZigqdXBlKSk7CisJdXBlID0gTkxNU0dfREFUQShubGgpOworCW5saC0+bmxtc2dfZmxhZ3MgPSAwOworCisJY29weV90b191c2VyX3BvbGljeSh4cCwgJnVwZS0+cG9sLCBkaXIpOworCWlmIChjb3B5X3RvX3VzZXJfdG1wbCh4cCwgc2tiKSA8IDApCisJCWdvdG8gbmxtc2dfZmFpbHVyZTsKKwl1cGUtPmhhcmQgPSAhIWhhcmQ7CisKKwlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJcmV0dXJuIHNrYi0+bGVuOworCitubG1zZ19mYWlsdXJlOgorCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHhmcm1fc2VuZF9wb2xpY3lfbm90aWZ5KHN0cnVjdCB4ZnJtX3BvbGljeSAqeHAsIGludCBkaXIsIGludCBoYXJkKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc2l6ZV90IGxlbjsKKworCWxlbiA9IFJUQV9TUEFDRShzaXplb2Yoc3RydWN0IHhmcm1fdXNlcl90bXBsKSAqIHhwLT54ZnJtX25yKTsKKwlsZW4gKz0gTkxNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJfcG9sZXhwaXJlKSk7CisJc2tiID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0FUT01JQyk7CisJaWYgKHNrYiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChidWlsZF9wb2xleHBpcmUoc2tiLCB4cCwgZGlyLCBoYXJkKSA8IDApCisJCUJVRygpOworCisJTkVUTElOS19DQihza2IpLmRzdF9ncm91cHMgPSBYRlJNR1JQX0VYUElSRTsKKworCXJldHVybiBuZXRsaW5rX2Jyb2FkY2FzdCh4ZnJtX25sLCBza2IsIDAsIFhGUk1HUlBfRVhQSVJFLCBHRlBfQVRPTUlDKTsKK30KKworc3RhdGljIHN0cnVjdCB4ZnJtX21nciBuZXRsaW5rX21nciA9IHsKKwkuaWQJCT0gIm5ldGxpbmsiLAorCS5ub3RpZnkJCT0geGZybV9zZW5kX3N0YXRlX25vdGlmeSwKKwkuYWNxdWlyZQk9IHhmcm1fc2VuZF9hY3F1aXJlLAorCS5jb21waWxlX3BvbGljeQk9IHhmcm1fY29tcGlsZV9wb2xpY3ksCisJLm5vdGlmeV9wb2xpY3kJPSB4ZnJtX3NlbmRfcG9saWN5X25vdGlmeSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHhmcm1fdXNlcl9pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiSW5pdGlhbGl6aW5nIElQc2VjIG5ldGxpbmsgc29ja2V0XG4iKTsKKworCXhmcm1fbmwgPSBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoTkVUTElOS19YRlJNLCB4ZnJtX25ldGxpbmtfcmN2KTsKKwlpZiAoeGZybV9ubCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXhmcm1fcmVnaXN0ZXJfa20oJm5ldGxpbmtfbWdyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgeGZybV91c2VyX2V4aXQodm9pZCkKK3sKKwl4ZnJtX3VucmVnaXN0ZXJfa20oJm5ldGxpbmtfbWdyKTsKKwlzb2NrX3JlbGVhc2UoeGZybV9ubC0+c2tfc29ja2V0KTsKK30KKworbW9kdWxlX2luaXQoeGZybV91c2VyX2luaXQpOworbW9kdWxlX2V4aXQoeGZybV91c2VyX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwo=